From 44480c6062beb95f1a8c09e62edc5020fa22988c Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 16 Apr 2015 01:14:27 -0400 Subject: [PATCH 001/965] more example data --- examples/example-data/fin-words-dev.txt | 5000 + examples/example-data/fin-words.txt | 232871 +++++++++++++++++++++ 2 files changed, 237871 insertions(+) create mode 100644 examples/example-data/fin-words-dev.txt create mode 100644 examples/example-data/fin-words.txt diff --git a/examples/example-data/fin-words-dev.txt b/examples/example-data/fin-words-dev.txt new file mode 100644 index 000000000..5c8895d4c --- /dev/null +++ b/examples/example-data/fin-words-dev.txt @@ -0,0 +1,5000 @@ + h y ö t y a n a l y y s i + k e h i t y s h a a s t e i d e n + e l i n p o i s t o j a + h y v ä k s e m m e + t i e t o s u o j a v a l t u u t e t u t + k a l a s t u s p o l i t i i k k a n a + l ä ä n i n r o v a s t i + p a l k k a k i i s t o i s s a + p o l t t o a i n e t e h o k k u u d e s t a + k u l t a k y s y m y k s e s s ä + k u l t t u u r i s u h t e i d e n s a + b r i t t i y h t e i s k u n n a s s a + t e k o e l ä m ä + i n t e g r o i m i s s t r a t e g i o i d e n + u u d e l l e e n s i j o i t t a m i s m a h d o l l i s u u d e n + l i s ä ä n t y m i s o i k e u k s i s t a + m i e h e n k ä m m e k k ä + p o h j a n t i k k a + t i e t u l l i + m e r k k i v i s k i t + a m i n o v o i h a p p o + t y ö n t e k i j ä v a s t a i s e k s i + k e s k e i s i m p i i n + n i m i k i l p a i l u n + t a l o u s a r v i o m i e t i n n ö s t ä + m a a h a n m u u t t o p o l i t i i k a s t a a n + h a m m a s s i l l i + k a l a s t u s t o i m i n t a a n s a + s i i r t y m ä a j a n j a k s o t + t o i v o t u l l a + l i s ä ä m i n e n k ä ä n + m a k s u l i i k e n t e e s s ä + p i e n i s s ä + k u m p p a n i m a i l l e m m e + r i k o s t u t k i n t a j ä r j e s t e l m ä + j ä m ä k ä m m ä n + v a k a u s m a k s u i s t a + r o m a n i a l a i s e t + t a a j u u s h u u t o k a u p p o j a + m a k s i m i h i n t a + m u s l i m i l i i t t o + m e l u t a s o i s t a + ä ä r i p u o l u e + e l i n i k ä i s i ä + t o i m i t t a j a n + o m i n a i s p i i r t e i s i i n + t u l o n s i i r t o k u l u i s t a + s ä ä n t e l y e l i m e n + y h d i s t e l m ä ä n + v i e s t i n t ä v ä l i n e i l l e + l a h j o i t u s j ä r j e s t e l m ä ä + r a k e n n e k r i i s i n + t e h o k k u u t t a m m e + m i i n a l a i v a + k i i n t i ö l i s ä y s t e n + m ä n t y n e u l a s m i t t a r i + p a l k o v i l j o i l l a + s o v i t t e l e v a m m i s t a + m i e l e n t e r v e y s a l a a n + a s u t u s a l u e i l l e + o s u u s k u n n i s t a + v e r t i k a a l i s t e n + y m p ä r i s t ö n s u o j e l u d i r e k t i i v i e n + t e r v e y d e n h o i t o m a t k a i l u n + v ä h i m m ä i s a n s i o t + l u o t e t t a v i m p i i n + t a r k a s t u s o t o s t e n + k o r j a u s p ä ä t ö s t e n + k a n d i d a a t t i a s e m a + o p p i k i r j a a + o s t o a l u e t t a + a r m e n i a n k a r h u n v a t u k k a + p a k k o t y ö v a n g e i l l e + j o u k k o v ä k i v a l t a a + v a s t a u k s i s s a + v u o d a t t a m a t t a + m y r k k y k e s t ä v i k s i + m a s s a t y ö t t ö m y y d e k s i + l i i k e n n e a l a a n + e d u s t a j a n p a i k k a n s a + m ä ä r i t t e l e v ä t + t e l e v i s i o s a r j a n + m e n e k i n e d i s t ä m i s k a m p a n j o i t a + s i k a p a i k k o j e n + k u k o i s t a m i s t a + p u o l u s t i + v ä h i m m ä i s s o p i m u k s e s t a + k o r v a u s i n v e s t o i n t e j a + i s l a m i l a i s i s s a + p a h o i t t e l u n i + s u o s i t u i m m u u s k o h t e l u n + k i e l t o m e n e t t e l y t + v a i k u t t a a k s e m m e + v ä h i m m ä i s m e n e t t e l y t + b i o s i d i t u o t t e e t + s ä ä r i h a a v a + t u h k a v a r p u n e n + k i v i k k o u u n i l i n t u + v ä h i m m ä i s l e p o a i k a a + m a f i a j u t t u + s e l u s t a n s a + v a l t i o n o b l i g a a t i o i l l a + s e i s t ä k s e e n + t ä m ä n p ä i v ä i s i s s ä k i n + m a a s t a m u u t t o a + m o n o p o l i a s e m a a + m a a n v i l j e l y s a m m a t t i + p i i k k i m a k r i l l i s t a + a v o i m u u d e s s a + p o l i i s i l a i t o s + s a d o n k o r j u u n + s ä ä d ö s r a t k a i s u + i l m a s t o j a l a n j ä l k e m m e + k o t i m a a n i k i n + p e r h e t r a g e d i o i t a + ä ä r i o i k e i s t o p u o l u e i d e n + y h t e i s t y ö s t r a t e g i a s t a + p o l i i s i v a l v o n t a a + m u u r i e n + i l m a s t o v y ö h y k k e e t + p ä ä p o s t i t a l o + y m p ä r i s t ö j ä r j e s t ö i s t ä + m e r e n k u l k u m a r k k i n o i l l e + l e h d i s t ö l a i t + y s t ä v ä n p ä i v ä n ä + y d i n k o k e i s i i n + s a k s a l a i s t u o m a r i n + k i t k a t + s ä ä s t ä m i s e s t ä + m e n o i s s a + l i i k e n n e l e n t o k o n e t t a + v a l v o n t a t y ö t ä m m e + s a i r a u s v a k u u t u k s e n + h y ö d y l l i s y y s v a a t i m u k s e n + a j a n m u k a i s e s t i + y m p ä r i s t ö a h n e u d e l l a + k r i s t a l l i p a l a t s i + p i t k ä j ä n t e i s e l t ä + t u o m i o i s t u i m e l l e + y m p ä r i s t ö n ä k ö k o h d a n + m a a h a n m u u t t o t a r k a s t u k s e t + t a u s t a p ä ä s t ö t + s t a l i n i s t i k a u d e n + t e l e l i i k e n n e t e k n i i k k a a n + t e r r o r i s m i n v a s t a i s e e n + r a n n i k k o v a l t i o s o p i m u s t a + m i n u u n + ä ä r i l i b e r a l i s m i i n + i n f r a s t r u k t u u r i k e h i t y k s e e n + l i s i n + a i k a r a j o i t t e e t + n i k k e l i k a d m i u m i a + t a v o i t e l t a v i a + h o i d e t t i i n + p u r j e e t + v i h a n n e s k a u p p o i h i n + t i e t u r v a l l i s u u s a s i a s s a + o p e t u s m e n e t e l m ä ä n + l a k i a s ä ä t ä v ä n ä + t ä h d e n n ä n + s o p i m u s t y y p p e j ä + t e r v e e l l i s e t + t e r v e y s p a l v e l u j a + a l i u r a k o i t s i j a t + t ä y s i v a i k u t t e i s i a + s u p e r l i i g a + g e e n i t o m a a t t e j a + v a r a s t o e r i e n + r a p o r t o i n t i i n + k a k s o i s p o h j a + h o p e a k u h a n k e i t t ä j ä + r i s t i r e t k e i l i j ö i t ä + p o n n i s t u k s i a a n + t ä p l ä k e r t t u n e n + d o l l a r e i t a + k a u p p a m i n i s t e r i + i t s e p a l v e l u m y y m ä l ä + t ä y t ä n t ö ö n p a n o l l e + a s i a k i r j a s s a m m e + y k s i l ö n v a p a u k s i n a + k a a s u v a r a n t o j a + a s e t o i m i t u k s i s t a + s o p i m u s e h d o t u k s e n + y h t e i s ä ä n e s t y s t ä + v e s i h u o l t o j ä r j e s t e l m i ä + y m p ä r i s t ö s t a n d a r d e j a a n + v ä e s t ö l u k u j e n s a + ö l j y p ä ä s t ö t + s i i r t o l a i s y h t e i s ö t + i t s e s u o j e l u s ä ä n t ö j e n + k o r j a u s t o i m e n p i t e e t + v a a l i p i i r e i h i n + l i s ä p o n n i s t e l u t + a v a a v a t k o + s u u r s a t a m a + y h t e i s k u n t a v a s t a i s e t + m u s t a p ä ä l o k k i + m a a p e r ä p o l i t i i k k a a n s a + v a r a o s i a + y h d y s k u n t a j ä t t e i d e n + r a d i o s a r j o j a + p u h e m i e s k o n f e r e n s s i i n + k ä s i k a u p p a l ä ä k k e i d e n + a l o i t t e i d e n t e o n + o i k e u s a s i a i n v a l i o k u n t a + p e r h e i l l e + h a n k k e i n a + a s i a n m u k a i s e n a + a i k a t a u l u k y s y m y k s i i n + s u l j e t u m p i i n + o r j a s o t a + t u t k i m u s t u l o k s i i n + h i n t a t u t k i m u k s e n + n o k k e l a l l a + j ä s e n y y s s o p i m u s t e n + r a k e n n e s y i s t ä + v o i t t o m a r g i n a a l i a a n + k e s k i s u u r e l l e + b u d j e t t i n e u v o s t o s s a + s ä h k ö a j o n e u v o i s t a + y d i n u h k a a + p e r u s k o u l u t u k s e s s a + v i r a n o m a i s i s t a + k ä y t e t t ä v i n ä + i l m a s t o i n t i j ä r j e s t e l m ä s t ä + o s a t e k i j ä t + p a i k a l l a a n + s a d e k a u s i + a s s o s i o i n t i s o p i m u s n e u v o t t e l u j e n + r a h o i t u s i n s t r u m e n t t i e n + v a r a i n k ä y t ö n + p e r u s a j a t u k s i n e e n + p a n k k i v i r a n o m a i s e s t a + s i i r t y m ä p ö y t ä k i r j a + a v a i n t a v o i t t e i s t a + v a l u u t t a v a i h t e l u j a + v ä l i t y s p y r k i m y s t e n + t y ö l l i s y y s s u u n n i t e l m i i n + s o i j a ö l j y + t a k a i s t e n + k e s k i s u u r i l t a + l i s ä m ä ä r ä r a h o j a + k a a s u t o i m i t u s t e n + v ä h ä h i i l i s e l l e + ö l j y n p o r a u s l a u t t a + e p ä i l l y t + p a i k a l l i s y h t e i s ö t k i n + m e t r o p o l i a + s u o s t u i s i k i n + s ä h k ö a l a l t a + o p p i l a i t o k s i s t a m m e + v a s t i n e e k s i + m i e l e n t e r v e y s h o i d o n + k a n a n l i h a + t u r v a l l i s u u s p o l i i t t i s t e n + i t s e m u r h a l u k u j a + t y ö s k e n t e l y k i e l i + a a t o n + v i e s t i n t ä o s a s t o j a + k a u p p a l a i v o i s t a + e n e r g i a y h t e i s ö s o p i m u k s e n + m a i t o k i i n t i ö j ä r j e s t e l m ä ä n + s o t i l a s d i k t a t u u r i n + l a h j o n n a n t o r j u n n a n + k a i v a t t u a + r a j a t o i m i n t a a n + v i e n t i l u o t t o a + v a l t o j e n + t u o t a n t o k y n n y k s e n + t ä y t ä n t ö ö n p a n o m ä ä r ä y k s e s t ä + v i i n i l a i n s ä ä d ä n t ö + m u i s t u t t a k a a m m e + m a a n o s i s s a + k ä s i e n k u i v a a j a + k y l ä m a t k i j a + n i m e l l i s i s t ä + p a i n o p i s t e i d e n + s i r k u s k o u l u j e n + r a h o i t u s s e l v i t y k s e s s ä + k y s y m m e k i n + v e r k k o k a l v o r a p p e u m a + v i l j e l y s m a a t a + k e s k u s t e l u m m e k i n + e n e r g i a k ä y t ä v ä n + a i k a p o m m e j a + m e t s ä p i n t a + o i k e u s e l i m e s s ä + m a a h a n m u u t t o k y s y m y s t ä + k o p i o i n t i t o i m i a + s y r j i m ä t t ö m ä m m i n + v i e n t i t u k i p o l i t i i k k a a + k i i n t e i s t ö s k a n d a a l i e n + a f r i k a n u n i k e k o + v e l v o l l i s u u d e k s e e n + s t r a t e g i s e s s a + p o l k u m y y n t i m e n e t e l m ä t + j ä t t e e n p o l t t o + e r o r a h a s o p i m u k s i i n + k o l l e g a l l e n n e + y l e i s r a d i o p a l v e l u n + t y ö n a n t a j i e n + t a v o i t t e l u u n + k e s ä o l y m p i a l a i s t e n + t o d e l l i s e m m a s t a + o i k e u s t a p a u k s e t + h i i l i m a r k k i n a t + p u o l i v u o t i s k a u d e l l a + o h j u s t a + p u o l e s t a p u h u j a n a + l i s ä v a s t a u k s e s s a + s o s i a a l i r y h m i e n + t ä y t ä n t ö ö n p a n o l a i n s ä ä d ä n n ö n + k o o r d i n o i n t i v ä l i n e e k s i + e n i m m ä i s h i n t a + v a l t i o n p a n k k i + s u u r e m m i s t a + e r i t y i s t e h t ä v ä n ä ä n + k ä ä p i ö p i n s e r i + t y ö n t e k i j ä t + e d u s t a i s i v a t + h e r k k y y s t a s o j a + k a h v i n v i l j e l i j ö i d e n + k u m p p a n u u s p e r i a a t t e e l l e + h a l l i n t o y h t e i s t y ö n + v a k u u t u s t o i m i a l a + t a v a r a k o n t t i a + l ä m m i n v e s i k a t t i l a n + r o m u t t u m a s s a + t u r v a p a i k k a o i k e u s + a u t o r i t a a r i s e n + u n o h t a k a a m m e + v ä s y m ä ä n + m o n i l ä ä k e r e s i s t e n t t e j ä + p a n t t i v a n k i e n + t o i m i n n a s s a m m e + p e r u s t e l l a k i n + t u k i a s t e + a r g u m e n t e i n + s u o r i t u s k y k y n s ä + j u o m a v e t e n ä + s i l m i i n p i s t ä v i m m i n + s ä h k ö r a h a t u o t t e i d e n + a n a l y y t t i s e m m i n + t e l e v i e s t i n t ä p a l v e l u j e n + h a l u a v a t + p e t o s t e n t o r j u n t a t y ö h ö n + v e r t a i s a n a l y y s i + i t s e m u r h a p o m m i t u k s e s t a + e u r o r y h m ä s s ä + p a i n o p i s t e a l u e e t + r i i p p u m a t t o m a l l a + k o o d e k s i s s a + l ä h t ö m a i n a + e t ä o p i s k e l u u n + m ä t ä n e e + l i k v i d i t e e t t i v a a t i m u k s e t + k o m p r o m i s s i p ä ä t ö s l a u s e l m a a m m e + k a n s a l a i s u u s o h j e l m a + k i i t t ä m ä t t ä + s ä ä d e t t y j e n + v a s t a u s k o n p u h d i s t u s + n i m e n m u u t o s + r u o k i n n a s s a + f r e e l a n c e t o i m i t t a j a + j ä r k y t t ä v i s t ä + v e r o p a k e t i n + a v o m e r i l a i v a s t o o n + p u n a k a m p e l a k i i n t i ö s t ä + h a r v e n n e t t a v a + m e n e k k i m a h d o l l i s u u k s i a + j a k o l i n j a t + p e l i t e o r i a + r u n s a s k ä t i s t ä + p a l v e l u n e u v o t t e l u i s t a + e n e r g i a t u t k i m u s r a h o i t u k s e n + t u o m i o i s t u i n j ä r j e s t e l m ä ä n + t y p e r y y k s i s t ä + i h a i l k a a m m e + l i s ä t t y + s e u r a a v a t + v a s t a u s i s t u n t o o n + h y v i n v o i n t i y h t e i s k u n t a a + m a r k k i n a k o n e i s t o n + h a l l i n t o t e h t ä v i s t ä ä n + e h k ä i s t ä k s e e n + t o i m i n t a k y v y s t ä m m e + s o p i m u s o i k e u d e l l e + m e l u h a i t a s t a + k o n f l i k t i n r a t k a i s u a + s a r v i s a m m a l + k u m p p a n u u s s u h t e e t + j e n i s e i + s a i r a a l a h o i d o n + s a l l i m i s e k s i + k r i i s i n r a t k a i s u p u i t t e i s i i n + v e s i a l t a i s s a + p e r u s n ä k ö k a n n a l t a + k u t u a l u e i t a a n + r e a a l i s o s i a l i s m i m a i s s a + n y k y t u t k i m u s t e n + n o l l a t o l e r a n s s i j ä r j e s t e l m ä ä + u n i o n i m a a n + k i i n a l a i s e t + k a r j a t i l a l t a + y d i n k o e r ä j ä y t y k s e t + s o s i a a l i k o m i t e a n t a l o u s a r v i o n + v e r t a i s a r v i o i n t i m e n e t t e l y i h i n + t e o l l i s u u s v a k o i l u s t a + k a l a s t u s v a r o j a + l a a j e n t u m i s p r o s e s s i n + p e r h e o l o j a a n + e t e l ä i s e m m ä s s ä + l a i n s ä ä d ä n t ö e h d o t u k s i s s a + s ä ä n t e l e m ä s s ä + y h t e i s e s i t t e l i j ä n ä + k o u l u m a i t o j ä r j e s t e l y ä + t e k n o l o g i a m a r k k i n o i l l e + k a n s a i n v ä l i s i l l ä + e n e r g i a n t o i m i t t a j a n s a + l i i t t o h a l l i t u k s e l t a + k a k s i k ä y t t ö i s e t + h a l p a t u o n t i i n + s e k a k o m i t e a a + s o s i a a l i p o l i t i i k k a a n + i n s t i t u t i o n a a l i s t a + n o k i h a u k k a + t a l o u s a r v i o e h d o t u k s e s s a n n e + k ö y h t y m ä s s ä + a m a t ö ö r i j a l k a p a l l o i l i j a t + k u l t t u u r i y m p ä r i s t ö ä + l a j i t o v e r e i t a a n + k a l s i u m h y d r o k s i d i + s e l v i ä m i s m a h d o l l i s u u d e t + l i h a l i i m a + t u r v a a m i n e n + e l o o n j ä ä m i s p e l i s s ä + s u s p e n s i o n + k y s e i s i l l ä + n u o r i s o p o l i t i i k a l l e m m e + o d o t u k s i a a n + s i j a i t s e e k o + n e u l a n v a i h t o + m a a i l m a n k a u p u n k i + t y ö t a p a a + t o i m i e l i n p u i t t e i s s a + v a h i n g o i t t a v a a n + e n n u s t u k s e n i + r a h a n k ä y t t ö p e r i a a t t e i t a + y h t e i s k o n f e r e n s s i n + p ä ä s t ö v ä h e n n y k s i s s ä + p e l t i h a t t u + r a u h a n k u l t t u u r i n + o n g e l m a t t o m a a n + l a i d u n k a n a l o i s s a + k a m p a n j a t + k i r j o i t t a j a t + s i v i i l i p r e s i d e n t i l l e + j ä r j e s t ä j i n ä + s e l v i t t ä m i s e s s ä + e d i s t y k s e l l i s e n + p e r u s t o t u u t t a + u u t i s t o i m i s t o j e n + l ä h e n t y m i s p e r u s t e i l l a + r a t t i j u o p u m u s t a + s ä ä n n ö s e s t e + j ä r j e n v a s t a i s e n + m a r k k i n o i n t i m e n e t e l m i ä + v a l m i s t e l l u s t a + t o t e u t t a m i s t a p o j a + k e m i a n + h a i t a l l i s e m p i a + o p p i t u n n i n + e l i n t e n l u o v u t u s t a p a u k s e s s a + s o t i l a s j u n t a l l e + v a h i n g o n k o r v a u k s i a + k a s v u p r o s e s s i l l e + v a i k u t u s t e n a r v i o i n t i t u t k i m u k s e n + k e s ä k o u l u i s s a + v a s t u u s t a + t o i m i n t a t e r a p i a + k o r i n r a k e n n u s + l u o t t a m u s o n g e l m a n + y h t e i s h e n k i + p o l i i s i v o i m a + a r k a l u o n t e i s e s t a + j o u s t a m a t t o m a t + t e r v e y s s e i k a t + h ä t ä p u h e l u p a l v e l u j e n + e r i t y i s h e r k k y y s + s o s i a l i s t i j ä r j e s t ö + e t u j ä r j e s t ö ä + k a n s a n r i n t a m a + l a p s e l l i s t a + k o n e o p p i m i n e n + p a r a n t a m i s o h j e l m a a + p i i r i t e t t y i n ä + v i l l i e l ä i n k i e l t o a + t r a k t o r i a s i a s s a + v a l o k u v a n ä y t t e l y + m ä n t y s i e p p o k e r t t u + a l u s l i i k e n n e + r a h o i t u s v i r r a t + k a l s i u m b r o m i d i + k o n n a t + u h r i e n + k o r v a u s e h d o t + l i n j a s t a + s i l a k k a s a a l i i s t a + k i l p a i l u s y i s t ä + e n e r g i a t a s a p a i n o o n + a l k u p e r ä i s k a n s o i l t a + v a s t a t e s s a n i + k i i n t e ä n + k u l u t u s l u o t t o l a k i + p o s t i p a l v e l u t o i m i n t o j a + s a t e e n k a a r i p e i p p o + m a d e i r a n k a a l i p e r h o n e n + k a l a m ä ä r ä ä + r o h k e a m m a s t a + p e r u s e l i n t a r v i k k e e m m e + p e r u s o l e m u s + r a h o i t u s l i i k e t o i m i l l e + l i s ä p o n n i s t e l u j e n + k a u p p a t o i m e t + k o o r d i n o i m a a n + t u o r e e m p i a k i n + a s e t u s e h d o t u k s e m m e + p ä ä o m a v e r o t u s t a + o r j a k a u p a s s a + p ä ä u s k o n t o j a + v e s i u r h e i l u n + t y ö l l i s y y s n ä k y m i l l e + h y l k ä s i + a v o i m u u s k o n s e p t i m m e + t u l o n m e n e t y k s i i n + b o n u s p o t t e i h i n + p e l t i p u r k k i k a t e d r a a l i + y m p ä r i s t ö t e h o k a s + s e l k e ä m p ä ä + h i s t o r i a l l i s e e n + k o n s u l i v i r a s t o j e n + k e h i t y s a p u p o l i t i i k a s t a a n + v ä e s t ö n s u o j e l u y k s i k k ö + h o t e l l i h u o n e i s s a + k o r v a u s m ä ä r i e n + v a s t u u v a p a u s m i e t i n n ö i s s ä + e h d o k a s k a u p u n k e j a + e l i n k e i n o a l u e i t a + m a a n v i l j e l y s a l u e i l t a + h ä t ä s u o j a + m a a i l m a n k u v a s t a + s y y r i a n a + t y ö y m p ä r i s t ö l a i n s ä ä d ä n n ö n + t e r v e y d e n h u o l t o p o l i t i i k k a + t r a n s a k t i o m a k s u u n + m a t e r i a a l i v i r t o i h i n + r i s k i s e l v i t y s t ä + v a l u u t t a k o k e e s s a + r e k i s t e r ö i n t i v i r a n o m a i s i a + j ä s e n e h d o k a s + t a h t o o + n e u v o t t e l u a s e m a l l e m m e + t u l l i e t u u k s i s s a + a l g e r i a l a i s y h t e i s k u n n a n + s o v i t t e l u m e n e t t e l y s s ä + v a l k o k o r v a m o n a r k k i + y h t e i s p ä ä t ö s m e n e t t e l y l l e + o l e t t a m u k s i s t a + r u u t u u n + t a a l a i n m a a n h e v o n e n + s y v e m p i e n + l i s ä m i n u u t t i a + h a a m u k a l a s t u k s e n + k e n i a l a i s p o l i i t i k o t + m a a t a l o u s k o n e i s i i n + v a r u s t a u t u m i s v e l v o l l i s u u s + p a l e s t i i n a l a i s s u k u p o l v i a + h ä k k i l i n t u + v a l v o m a l l a + t u k i j ä r j e s t e l y j ä + p u o l u s t a m a s s a + t o i m i t u s r e i t t e j ä + l ä m m i t y s l a i t t e i s t a + m a a t a l o u s p o l i i t t i s i l l a + k ä s i t t e l y k y v y n + r i s k i n a r v i o i n n i t + ä r s y t t ä v i n t ä + k e r t o m u k s i i n + v a r a l l i s u u s p o l i t i i k a n + r a u h a n t e k i j ä n ä + g e e n i m u u n t a m i n e n + t u r v a p a i k k a p e r i a a t t e e n + a s u n t o s e k t o r i n + k ä ä p i ö k a i m a a n i + v ä e s t ö l t ä ä n + j u o m i s e e n + t o i m i n t a y h t e i s ö s s ä + k a a p e l i t e l e v i s i o y h t i ö l l e + t ä m ä n p ä i v ä i s i s t ä + v a a l i l ä h e t y k s e n ä + t i e d e v e r k o s t o i h i n + p o n n i s t e l u m m e + j ä t t e e n k i e r r ä t y s o h j e l m i a + t u o t a n n o n a l a a n + a l k o h o l i k ä y t ö n + v a r o v a i s e t + s u u k a p u l a l a k i + v ä l i r a p o r t i n + s a p e l i h a m m a s k i s s a t + a v a j a i s i s t u n t o + t e l e v e r k k o j a + p e r u n p ö l l ö n e n + t u o t a n t o m a l l i e n + s i p u l i r e i t i t y s + p u i t e o h j e l m a p a k e t t i + t o r j u m i s p r o s e s s i a + r a u t a t i e p o l i t i i k a n + p i k k u k a u p u n k i + t u t k i m u s a l u e e s s a + l i s ä v o i t t o j a + j o h t a m i s k u l t t u u r i k s i + k o r j a u s t y ö n + p e l i n a p p u l o i t a + m o o t t o r i s a h o i s t a + j ä t e p ä ä s t ö j ä + a l k u p e r ä p e r i a a t t e e s e e n + p ä ä t ö k s e n t e k o k e s k u s + y k s i t y i s y y d e l l e + r a s v a h a p p o j e n + v a s t u s t u s v ä l i n e i t ä + t a v a n o m a i s i s t a + s o s i a a l i o l o t + o s o i t u k s e n + l i s ä t u n n e i l t a + r a u h a n v y ö h y k k e e k s i + k a t e v i l j e l y + a v u l i a a n a + t a r p e e l l i s e l l a + t u p a k a n p o l t o n + s ä ä n t e l y p o l i t i i k k a a n + s i i r t o l i n j o j e n + i l l u u s i o a r g u m e n t t i + t e l e v i s i o a s e m i l l a + y m p ä r i s t ö t i e t o u d e s t a + r a u h a n o m a i s e m m a l l e + s o v e l l u s a l o i l l e + k o v a n a + h a l l i t u s k o a l i t i o t a + v ä h i m m ä i s h i n n a s t a + e l ä k e l ä i s l u o k a t + s y n n y t t ä m i s e n s ä + t a r v e l ä h t ö i n e n + k e s t ä v y y s p e r u s t e e n + o s a p u o l i e n + v a s t a a n o t t o k e s k u k s i s t a + y k s i t y i s a r m e i j a a + i n v e s t o i n t i p a n k i l l a + j a l k a p a l l o p e l e j ä + k o n f e r e n s s i n + t e h d a s t i l a t + y l e i s r a d i o t o i m i n t a a n + ö i s e s s ä + s e p a r a t i s t i l i i k k e e l l e + r a h o i t u s o h j e l m i i n + k i e l i j ä r j e s t e l m ä n + m a s s a r ä j ä h d y s t ä + g e e n i k e t j u n + p a i n e e n + t u r s k a k a n n o i s t a + b r i t t i d i p l o m a a t t i a + m a r k k i n o i n t i t e o l l i s u u d e l l e k i n + k ä s i t y ö l ä i s e t + s i j o i t t a j a o i k e u k s i e n + v a p a a k a u p p a s o p i m u s n e u v o t t e l u i h i n + y h t e i s t y ö s u h t e i s s a + v a l t i o i l l e m m e + v a k a v a r a i s u u s k e h y k s e m m e + t i e d o t u s t y ö r y h m ä n + m u u t u m m e + l a k k o t o i m e n p i t e i n + t o i m i v a l t a k y s y m y k s i i n + p e r h e e l l e + p o h t i m i s a i k a a + t u o t t o j o h t a m i n e n + v e r k k o t u r v a t t o m u u s + r u o s t e v a t s a k a r d i n a a l i + n y l j e n n ä n + e l o k u u h u n + t e o l l i s u u s k a t a s t r o f i n + p e r u s t a v o i t t e e n a m m e + p ä ä r a k e n t e i d e n + e n e r g i a k y s y m y k s i s t ä + ö l j y n v i e j ä + e r i k o i s o l o i h i n + k u l t t u u r i t i e t o i s u u d e n + h a k u j a + a v a r u u s o h j e l m a n + h u i p p u v u o r t e n + s u o s i t u i m m u u s j ä r j e s t e l m ä ä + y m p ä r i s t ö s t a n d a r d i e n + e h k ä i s y o h j e l m a n + a i k u i s o p i s k e l u + a n s i o l e n t o t o i m i n t a a + s u u r p u o l a n + e n e r g i a s t r a t e g i a s s a + i t s e n ä i s t y n e e s t ä + k o l m e e n + a l o i t t a a k s e e n + p o l i t i i k o i s s a m m e + h y v i n v o i n t i m e n o t + l i i k e v a i h t o v e r o m ä ä r ä n + i n f o r m a a t i o p i s t e i t ä + j u n a y h t e y k s i e n + m a a e k o s y s t e e m i e n + j o u s t a a + t ä y t ä n t ö ö n p a n o t o i m e a + a j a n k o h t a i s e n + k o k o n a i s s o p i m u s t a + v i s k i n t u o t t a j a m a i d e n + h o i t o a l a n + u r a h i e r a r k i a s s a + b e t o n i v a n k i l a + i l m a i l u v i r a n o m a i s i i n + m a t k a j ä r j e s t e l y i s s ä + p u h e l u i t a + t o i m i t t a j a t a p a u s t a + a n n e t t a v i e n + t o i m i e l i n k o m p r o m i s s i n + a r v i o i d a a n + k i i t o l l i s u u d e n v e l a s t a + a l a l u o k k a a n + t o i m i v a l t o j e n + v ä h e n n y s t a v o i t t e i s i i n + p ä ä o m a s i j o i t u s y h t i ö i d e n + e n e r g i a k a t k o k s i a + m e r e n t u t k i m u s k e s k u s + e l i n t a r v i k e a p u k o m i t e a + l i i k u n t a j ä r j e s t ö j e n + k o k o n a i s k a n t a a + d e s i b e l i t a s o j a + v a n h e n t u a + r a n g a i s t a v i i n + l a m p a a n t u o t a n n o n + s i m p u k k a m y r k y t y s + m u n d a k i e l e t + e l e k t r o n i i k k a j ä t e t t ä + v ä h e n n e t t ä e s s ä + r a n n i k k o j ä ä k ä r i + m o l e k y y l i m a l l i n n u s + y h t e n ä i s m a r k k i n a s t r a t e g i a n + r ä j ä h d y s p a i k a s t a + e n e r g i a r i i p p u v u u t t a a n + k i l p a i l u t a i s t e l u s s a + p e r u s h u o l l o s t a + u l k o t o i m i i n + h a a v o i t t u v i m p i e n + t a s a p a i n o i s e m m a s t a + t o i m i n t a k u s t a n n u k s i a a n + l o p p u k ä y t t ö ö n + t u r v a p a i k k a p a k e t t i e m m e + n e i t s y t p u h e e n n e + r u o k a k a l a s t a + v u o r i s t o a l u i l l a + r a j a k o h d a k s i + k a r m e a s t a + l u u y t i m e n + y m p ä r i s t ö a l a l l e + n a u t a r o d u i s t a + v a u h d i t t a m i s e k s i + n e l i ö n j ä ä n n ö s + t o i m i m i s e s t a + t y ö n t e k i j ö i l t ä + c h i n c h a s a a r e t + v e r k k o v i e r a i l u h i n t o j a + k i r i s t y k s e l t ä + t i e t o i n t e n s i i v i s e n + r a j o i t t a n e e t + s e r b i o r t o d o k s i e n + i n s p i r a a t i o t a + b a l i n k o t t a r a i n e n + t u r v a l l i s u u s n o r m e i s t a + e d i s t y s a s k e l e s t a + p i s a r a t i k k a n e n + r i k o s t e n t o r j u n t a v e r k o s t o + t y ö l l i s y y s o n g e l m a n + v a i h t o k u r s s i r i s k i t + h u o l e s t u a + a l e n e m i s a s t e + b u d j e t t i k u r i s t a + e l o k u v i e n + j ä r j e s t e l m ä k r i i s i + j o u l u s a a r e n + v e r o t u s p o h j i e n + i h m i s k i l v e n + p a k k o t o i m i a + o s a l l i s t u i n + h e n k i l ö k o r t t i n s a + a i h e p i i r i t + s y n t e e t t i s i ä + p e r i a a t e k e s k u s t e l u a + m i e h i t t ä v ä t + k i i s t ä ä + k y m m e n i l l ä + ä ä n e s t y s i ä s t ä + e n e r g i a t e h o k k a a m p i + v e r k k o h y ö k k ä y k s e t + l i k v i d i t e e t t i o n g e l m a + m e n e t t ä n e e t + y l e i s p a l v e l u v e l v o i t e t t a + l i i k u n t a l i i t t o + o p p o s i t i o r y h m i t t y m i ä + e l ä i n s a i r a u d e t + b u d j e t t i e p ä t a s a p a i n o s t a + a r v o n l i s ä v e r o d i r e k t i i v i n + l a s t e n h o i d o s s a + r a u t a t i e s e k t o r i l l a + t u l v a d i r e k t i i v i + k o m i t o l o g i a j ä r j e s t e l m ä + k a u k a i s i m m a t + a r v o n l i s ä v e r o j ä r j e s t e l y + l u o t t o t a p a h t u m a a n + l ä h e n t y m i s p r o s e s s i + u k r a i n a n + k u p a r i m a t e r i a a l i e n + m a a t a l o u s b u d j e t i s s a + k ä s i t t e l y j ä r j e s t y s + s i s a r a l u k s e l l e + u u d i s t u s s u u n n i t e l m a a + y k s i t y i s a s u n n o s s a a n + t i e t o k o n e i n f r a s t r u k t u u r i a + t u n t e m a t t o m a t + p o p u l i s t i s i a + j o u l u k o r t t i e n + l u o n n o n o n n e t t o m u u k s i a + s u r u l l i s e m p i + k e s k i m a a s t o s t a + t a m i l i t i i k e r e i d e n + j ä l j i t e l m ä e l i n t a r v i k k e i t a + p o i s h e i t t o s k a n d a a l i n + k o t i m a a n l i i k e n n e + v i r s t a n p y l v ä ä n + a s i a n o s a i s i s s a + e h d o k k a i d e m m e + k ä y t ä v ä k e s k u s t e l u j e n + r a h t i y h t i ö i d e n + h e i k o s s a + k a m m o t t a v a n + k a r j a l l e + e r i t y i s o l o s u h t e e k s i + s o t a r i k o s o i k e u d e n k ä y n n i t + s a n o t t u k i n + y k s i t y i s a u t o i l u a + n a i s y r i t t ä j y y d e n + h u n a j a d i r e k t i i v i i n + v e s i l ä h t e i d e n + k y m m e n e s t ä + l i s ä h u o l i + s o t a v a n k e j a + k e s k u s t e l u l l e + l a i n k ä y t t ö ö n + v a r a i n h o i t o v u o s i a + y h t e i s p ä ä t ö s p r o s e s s i s t a + p u n n i t t a v a + y m p ä r i s t ö l a u s e k e + t u o t a n t o m e n e t e l m ä n + p u r e t t u a + j a r r u t u s m a t k a + e l i n t a r v i k e h u o l t o o n + t e r v e y s h a a s t e i s i i n + p a l a s i v a t + l i s ä r a h a s t o + i h m i s a r v o i n e n + k a h v i k u p p o s e e n + k a u p u n k i c o w b o y t + y h t e i s t y ö a l o i t t e e t + t u h a n s i a + p ä ä t ö s e h d o t u s t a + h a r h a a n j o h t a m i s t a + h a l l i n t a t o i m i a + l e s k e n e l ä k k e i t ä + s o s i a a l i t u k e a + p e r u s t u s l a e i s s a + r u o k a t u r v a l l i s u u s + a r v o s t e l u i s t a + s u u r n o p e u s k a m e r a + k o k o n a i s k u s t a n n u s + p u o l u e p o l i i t t i s e s s a + k e h i t y s t o i m i s t o j a + k ä y t e t y i s s ä + v e r o l e i k k a u s p o l i t i i k k a a + y l e i s t y k s i i n + k l i i n i s i s s ä + y m p ä r i s t ö n s u o j e l i j a n a + t a i p u i + m e r i o i k e u s + r a h o i t u s p o h j a + n o k i s i i p i l o k k i + p ä ä s i h t e e r e i t ä + k e i s a r i a m a t s o n i + e n e r g i a p o t e n t i a a l i n + k a n a v a l m i s t e i t a + l a p s i k u o l l e i s u u d e s t a + m a a k e r r o k s e t + l i s ä p a n o s t u k s i a + p ä ä p a i n o p i s t e t t ä + s e r e m o n i o i s s a + m y ö n n y i n + k ä s i k i r j a t + a s u n t o l a l a i t o k s e t + p e r u s k i r j a k o n f e r e n s s i t + r a i s k a u k s i a + r i n t a s y ö v ä l l e + a r v o s o p i m u k s e n + l a a j e n e m i s p r o s e s s i a + p l a t i n a r y h m ä + k e h i t y s e r o + h a a v o i t t u v a i s i m m a t + n e i t s y t p u h e e n + k u s t a n n u s t e h o k k a a m m i n + a v a r u u s f y s i i k a s t a + a l k u t u o t t e i s s a + m e r i l i i k e n n e s ä ä n n ö t + f i n a n s s i p o l i t i i k a l l e + u u t i s a i h e + a s t e e n + f i l m i d o s i m e t r i + o n g e l m a t a p a u k s i s s a + t u r v a l l i s u u s p o l i t i i k k o j a + p ä ä t e l m ä l u o n n o s t a + l a h j a k k u u t t a + r e k i s t e r ö i n t i p a i k a s t a + s u o j e l u v a s t u u + p i n t a k u v i o + h i u k k a s p i t o i s u u d e n + p r o s e n t t i l u k u a + i h m i s p e r h e e n + t u p a k k a k a s v e j a + k a k s o i s o i k e u s p e r u s t a + t a r i f f i s o p i m u k s i l l a + a j o n e u v o t y y p e i l t ä + p y s y v i s t ä + k i r j a a n + m a a t a l o u s m a l l i i n + e n i m m ä i s a i k a r a j a t + u r a k k a t y ö s o p i m u k s i a + t ä y d e n t ä i s i n + h a k e m u k s e t + t a r h a m a l t s a + h u t u k a p i n a l l i s t e n + t o i m i l l a a n + a m m a t t i t a i t e i l i j a + v e r o p a k o l a i s i l l e + m a a i l m a n p a l o k s i + t u l i v a t + k a i k k i v o i p a a + l u k i h ä i r i ö i s i ä + o i k e u d e n k ä y n t i m e n e t t e l y j ä + d i r e k t i i v i e h d o t u k s e s s a + k o k o n a i s p a n o k s e l l e e n + k ä y t e t ä ä n k i n + m u u k a l a i s l e g i o o n a + i n f o r m a a t i o s o d a n k ä y n t i + t a l o u s v y ö h y k k e e s e e n + t e o l l i s u u d e n a l a a n + p a l k k a u s s ä ä n t ö j ä + t a i t o t i e t o a + k o r v a k o i r a + a n i m a a t i o s a r j o i s t a + p u o l u s t u s p o l i t i i k k a m m e + k e h i t y s y h t e i s t y ö u l o t t u v u u t e e n + m ä ä r ä n p ä ä h ä n s ä + j o u k k o j a a n + l i i k e n n e t a p a h t u m i e n + e n e r g i a n t e h o k k u u s t o i m i i n + m e n e s t y k s e e n + k a l a s t u s m i n i s t e r i n + n u o r i s o s t r a t e g i a a + k e u h k o v e r i t u l p p a + k i i n t e i s t ö i n f l a a t i o o n + l u o m a t t a + s o l i d a a r i s u u s k ä s i t e + a l u e t u k i + v a n h a i n k o d i s s a + t u m m a r a u n i o i n e n + f u n d a m e n t a l i s t i j ä r j e s t e l m ä k s i + s o t i m i s t a + y r i t t ä v ä t + k a m e r u n i l a i s e s s a + t o i m i n t a m a h d o l l i s u u k s i l l e + o h j e l m i s t o t e o l l i s u u d e s s a + e n e m m i s t ö y h t e i s k u n n a n + i l m a l i i k e n n e j ä r j e s t e l m ä s s ä + p ä ä u s k o n t o n a + l a s t e n k i r j o j a + t u o n t i t a r i f f i k i i n t i ö n + e p ä l u u l o j a + t y ö l l i s y y s s o p i m u k s e k s i + t o i m e n p i d e p a k e t i l l a a n + u r i d i i n i d i f o s f a a t t i + h e i t t ä m ä s t ä + a r v o p a p e r i s ä ä n t e l y s s ä + j a r r u t e t t a v a + n u h t e e t t o m i a + s o t i v a t + i h m i s o i k e u s p e r i n t e e n + s e l v ä k s i + l e n t o k o n e k a a p p a u k s i s s a + v ä e s t ö j e m m e + i s o t u o m i p i h l a j a + l i s e n s s i p o l i t i i k a l l e + y h t e i s v a s t u u h a n + e l i n t a r v i k e v i r a s t o l l e + j u l k a i s e e + a j a t u s m a l l i a + o r j a k a u p a n + v e r k k o t u r v a v i r a s t o + v u o t e n a + t a l o u s s a a r r o t + j a l o s t u s t e o l l i s u u d e n k i n + p ä ä t ö s l u o n n o s t a + ä ä n e s t ä m ä t t ä + s a a r e t + j a t k o p ä ä t ö k s e t + k r i i s i a v u n + e l ä m i s e k s i + k e h i t t ä m i s y h t e i s t y ö n + h y v ä k s y m i s o i k e u s + l u o t t o k o r t t i m a l l i s t a + m a t k a i l u a l a t + t a r j o a j i s t a + n ä k ö a l a p a i k a l l a + o s a t u l o k s e t + v i i m e i s e t k i n + m u r h a m y s t e e r i + v ä h i t t ä i s m y y n t i h i n n a t + l ä h i m m ä i s i s t ä m m e + p e l a i s i m m e + s i s ä m a r k k i n o i d e n + t y ö p a i k k a d i r e k t i i v i + r e k i s t e r ö i n t i s u u n n i t e l m a + l a i t e r a k e n t e e n + v a l t a e l i n t e n + o h j e l m a k a u t t a + o d o t t a a + h a i t a l l i s e k s i + h e n k i l ö a u t o l t a + p a i n o s t i m m e + k o u l u t u s v a i h e e s s a + t u l o t u k i e n + ä i d i n k i e l i n e n + m a s s a m u u t t o a a l l o i s t a + m e n e e + n e t t o v a r a t + y r i t y s f o o r u m i m m e + p o r t t i a + k e h i t t ä i s i + v ä h e m m i s t ö r i i d o i s t a + m y ö h ä i s l a n n o i t u k s e s t a + j ä l l e e n r a k e n n u s o h j e l m i a + b u d j e t t i k o h d a t + v a l l a n k u m o u s h a l l i n t o + l u o n n o n v a l i n n a n + v a k u u t u k s e n o t t a j a t + e n e r g i a j ä r j e s t e l m i i n + p u h e j ä r j e s t y k s e e n + k e s k u s t a v a s e m m i s t o l a i s i a + k o r v i k e a i n e + t i e d u s t e l u p a l v e l u i l t a + p i i t e t r a k l o r i d i + m u o t o k y s y m y s + p a l v e l u d i r e k t i i v i ä + t i e d ä t t e + e n g l a n n i n k i e l i s e s t ä + k o k o n a i s k u s t a n n u k s e t + a i k a i s t e t t i i n + a s e t u s l u o n n o k s i k s i + v a r a s t o i n t i p a i k k a n a + i l m a i s u n v a p a u t t a a n + t i e d o t u s t o i m i p i s t e i s s ä + t i e t o k o n e + l u o n n o n l o h i + s u o r a s t a + k a l i u m s y a n a a t t i + h a a s t e i t a m m e + v a p a a m a r k k i n a t a l o u t e e n + k i i n a n p o k e r i + n i m e n m u u t o k s e t + s a t e l l i i t t i v a l v o n t a j ä r j e s t e l m i s t ä + l i i t t o v a l t i o l l e + i s t u t u s o i k e u k s i i n + v i i t e p i s t e e n + p a h o i l l a n i + p i k k u s u m m a + p i k k u k ä p y l i n t u + e n e r g i a p o l i t i i k k a a n s a + k a l a s t u k s e l l a + l ä m p ö t i l a n + t u t k i m u s y k s i k k ö j e n + a s e v e l j i k s i + t i l a s t o k e r t o m u s + y k s i p u o l i s e l t a + m a a j o u k k u e i l l a + l a a j e n t a a + m ä ä r ä p ä i v ä j ä r j e s t e l y i h i n + p a l k k a o i k e u k s i l l e + k i l p a i l u m ä ä r ä y k s e t + e n e r g i a v a i h t o e h t o a + l i i k a k u l u t u k s e s t a m m e + t o i m e t t o m a n a + g e n e e t t i s e s t ä + v i n o u t t a a + v ä l t t ä m i s e k s i + r a k e n n e p o l i i t t i s i a + k a n g a s t a t t i + h ä p e ä k s i + p o l i t i i k k o i n a + r i s t i i n r a h o i t u s t a + t a i d e a m m a t t e j a + h o i t o j o n o j e n + s u k u p u o l i s i a + m ä ä r ä t i e t o i s i m m i n + t u k i n h e i t t o + t u r v a l l i s u u s t y ö l l ä + v a r m u u s v a r a s t o j e n + k o s t o n k i e r r e t t ä + ä y r i ä i s i l l ä + t u l l i k o o d e k s i k o m i t e a n + v a a l i y m p ä r i s t ö + t a l o u s a r v i o v a r o j a + y k s i t y i s o i k e u d e l l i s e n + t a k u u h i n t a j ä r j e s t e l m i ä + l u o n n o s t e k s t i n + r a t i f i o i n t i t i l a n n e t t a + t a s a u s m a k s u j a + y h d e n s u u n t a i s e t + e d u s t a v a n n e + v a a l i l u p a u k s e t + v a i v a i s u k k o + l a i n s ä ä d ä n t ö s ä ä d ö k s i ä + e d i s t ä j i e n + a v a r u u s o l e n t o + a l a k o u l u s s a + k a u p p a k u m p p a n i + k y s e l y t u n t e i h i n + p e l t o v i l j e l y k a s v i e n + r a k e n n u k s i s s a + t u l l i m u o d o l l i s u u d e t + v a k u u t u s o n g e l m a t + l i s ä k o r v a u k s e s t a + p r o s e n t t i m ä ä r i i n + m e t r o n + o p e t u s v i r a n o m a i s e s t a + s i j o i t u s t u o t t e i t a + p i i l o m a i n o n n a k s i + y m p ä r i s t ö v a a t i m u k s i i n + k o t i m a i l l e m m e + m i l l a i s i i n + o r g a n i s a a t i o h a n k k e e n + k a n s a n t e r v e y s v a a r a + k a s v u a s t e e t + t u t k i m u s u r a a + h a r t a i n + v a r h a i s k a s v a t u s p a l v e l u i h i n + v e r o s ä ä n t ö j ä + p ä ä o m a t u o t t o j a + y h t e n ä i s t ä m i s t o i m i i n + k e h y s d i r e k t i i v i s s ä + o s t o h e t k e s t ä + i n t e r v e n t i o k e s k e i s e k s i + t o i m i n n a l l a m m e + ä i d i l l e + k o r k e i d e n + r a v i n t o p u l a a n + k o r v a u s v a a t i m u k s i s t a + m a a n j ä r i s t y s o n g e l m a s t a + r i s k i p ä ä o m a j ä r j e s t e l m ä ä n + k a l l i s a r v o i s i m p a a n + p e r u s t u o t t e i t a + v ä h i m m ä i s s o s i a a l i s t a n d a r d i l l a + t u k i k o h t a a + k i e l i l a k i a + p i e n v i l j e l y n + v a l t u u s k u n t a a + y k s i t y i s t e n + i t ä i n t i a l a i n e n + s e l k e y t t ä m i s p r o s e s s i i n + t o i m i e l i m e l l ä m m e + t i e d o t t a m i s e e n + k u u l e m i s m e n e t t e l y i s t ä + k y y n e l k a a s u p o m m e j a + h a l l i n t o m e n e t e l m ä ä + o l e e l l i s i n a + k u n n i a m u r h i s s a + k e s k i v i i k k o i l l a n + o r j a t y ö v o i m a n + v ä e s t ö r a k e n n e k e s k u s t e l u s s a + p u r k u t o i m e n p i t e i s i i n + a l l e k i r j o i t t a m i s e k s i + l o h e n k a s v a t t a j i l l e + v i i s u m i l u o k i s t a + m ä n n y n k ä ä p ä + l o p p u s u o r a l l e + t ä r k e ä m m ä s t ä + a s s o s i a a t i o p r o s e s s i s t a + e d i s t y s k e r t o m u k s i a + m a t k u s t a j a l a u t t a a n + p a n k k i v e r o + y m p ä r i s t ö i n f r a s t r u k t u u r i a + ä l l i s t y t t ä v ä ä + k u l u t t a j a n s u o j a n + m e h i l ä i s k u o l l e i s u u t e e n + o n n i s t u m a a n + t e o l l i s u u s v a k o i l u u n + p ä ä a i n e k s i s t a + k o m p o n e n t t i v a l m i s t a j a t + p ä ä t t y m i s l a u s e k k e i d e n + v e s i o i k e u k s i e n + t a r k a s t e l u k o n f e r e n s s i + y m p ä r i s t ö s u o j e l u v a a t i m u s t e n + v e l k a k i e r t e e s e e n + t y ö s k e n t e l y o l o s u h t e i t a a n + m e r i k o r t t i e n + p o l i i s i m ä ä r ä + e l ä ä + t o i v o t a m m e k i n + k a u p u n k i l i i k e n n e k y s y m y k s e n + t y ö l l i s y y s a l u e i d e n + k e v y t t ä + r a j a t y l i t t ä v ä t + p ä ä h u o m i o o n + p ä ä u l o t t u v u u t t a + r a h o i t u s s k a n d a a l i a + k a u p p a k a m a r e i l l e + t o i m i t t a a k s e n i + k a n s a l a i s t o i m i k u n t a a + e p ä i l y k s e n a i h e e t + i t s e n ä i s t y n e i t ä + j o h d o n m u k a i s t a m i s e k s i + m a t k u s t a m o m i e h i s t ö s s ä + k o r t t i j ä r j e s t e l m ä + ä ä n e s t y s p ä ä t ö k s e m m e + e p ä o n n i s t u m a a n + w h i s k y n + h a l l i n t o j ä r j e s t e l m ä s t ä + v a p a u t t a m i s p o l i t i i k a t + s i v i i l i h a l l i n t a a + h a r j a s g e k k o + r e a a l i k a s v u s t a + v i i n i n v i l j e l i j ö i t ä + s u o j e l u a l u e e n a + y h d e n l a i s t a + s o v i n n o n t e o n + t u k i j o i s t a + s a a l i s t o d i s t u k s e t + r a v i n t o s i s ä l l ö t + i n n o v a t i i v i s i s t a + s a i r a s v a k u u t u s k u s t a n n u k s i a m m e + v a l v o n t a m e k a n i s m i l l e + k o u l u t u s t a s o j e n + o i k e u s j ä r j e s t y k s i s s ä m m e + s y y s p ä i v ä n h a t t u + k u l u t t a j a s u o j a k y s y m y k s e n + h y v ä k s y m i s v a i h e e s s a + n a a p u r i m a a s t a + k r y p t a u s t u o t t e e t + p ä ä s e v ä n + s o s i a a l i p o l i t i i k a s s a + s i j o i t t a u t u m i s v a p a u t t a + y d i n v o i m a t y ö n t e k i j ö i l l ä + p e r h e r a k e n t e e s s a + t i e t o t a u l u t + k o k o n a i s p i t u u s + s u o s i k k i a i h e e s e e n i + a l i v a l i o k u n n a l l e + v u o k r a m a k s u j e n + e r i t y i s h u o m a u t u k s e n + a i k u i s k o u l u t u s s u u n n i t e l m a a + p o s t i t o i m i s t o j a + i l m a v o i m i i n + l e v o l l i s e m m i n + l a s t e n h o i t o t a r v i k k e i l l a + v a a l i k e l p o i s u u s k y n n y s t ä + l u o t t o m a r k k i n o i l t a + m y y n n i n e d i s t ä m i s k a m p a n j o i s t a + p e r u s t e t t a v a l l e + k e s k u s t e l u r y h m ä + f i n a n s s i k u r i l l a + t a k s i b o i k o t t i + s t r a t e g i a n v a i h d o k s e e n + l i i t t y m ä n u m e r o + k a r j a r o d u s t a + k a l a s t u s s u u n n i t e l m a a + k ä y t t ö k a t t e i s i i n + i l m a s t o s t r a t e g i a s s a + k a a s u n t o i m i t u s v a r m u u s + i n t e g r o i m i s p r o s e s s i n + a l k u s y k s y n + s i i r t y m ä t a l o u s + v u o r i s t o a l u e i t a m m e + e l i n l u o v u t u k s i a + t o i v e l i s t a s t a a n + s e p p ä k o t i n g a + t ä y t ä n t ö ö n p a n o s ä ä n t ö i h i n + m e r k i t y k s e l l i s e m m ä n + k a n s a l a i s a l o i t e + v a a l i p i i r e i s t ä + v a l v o n t a m a h d o l l i s u u t t a + m a a h a n t u l o v i i s u m i m a k s u j e n + o i k e u s h i s t o r i a a n + n ö y r e m m i n + m u r t a u t u a + r a h o i t u s k e s k u k s e n a + p e l a s t u s p a l v e l u s t a + m a a i l m a n h a l l i n n o n + t e r a p i a t u o t t e i d e n + v i i k o n l o p p u n a + j a a v a n m e t s ä k e r t t u n e n + t a l o u s r e a l i t e e t t i a + t ö r m ä i s i + l i s e n s s i m a k s u i l l a + t o r i k a u p p i a i d e n + h u o l e s t u t t a n e e t + t a r k a s t u s k o m i t e a n + m o n i t u l k i n t a i s e m p i + t y ö l l i s y y s l a k e j a + m a k s a m a a n + m a a h a n m u u t t o s t r a t e g i a s t a + k a n s a k u n t i e n v a n k i l a n + s o t a v a n g i n + e l ä k e r a h a s t o s u u n n i t e l m a + e u r o k o l i k o i d e n + h a l v i m p i e n + l i i k e n n e v a l o t + l i i t t y v i e n + l a i n v a l v o n t a v i r a n o m a i s t e n + t e r ä s v i l l a + e n i m m ä i s k u s t a n n u k s i a + y m p ä r i s t ö n ä k ö k u l m a n + v a a r a t i l a n n e + s o k e r i t e h t a i s t a + s u o s i t t i i n + a s u i n a l u e i d e n s a + l a i n s ä ä d ä n t ö v e l v o l l i s u u k s i a + v i l j a v a r a n t o + t a l o u s a r v i o s o p i m u s + t e r r o r i s m i o n g e l m a + m a a h a n m u u t t o j ä r j e s t e l m ä n + t ä y t ä n t ö ö n p a n o v ä l i n e i t ä + s ä h k ö a j o n e u v o t e k n i i k k a a + k u l m a m i n u u t t i + k o n k r e t i s o i m i s e s s a + t ä y t ä n t ö ö n p a n o k u s t a n n u k s e t + l e n n o n j o h t a j i l l a + k o k e m u k s e l l a + r a v i n t o t i l a n t e e s t a + t u k i a l o i t t e i s t a + k ä ä p i ö k o t i l o + v a i n o a m i s h a r h a + i l m a s t o s t a + p a k k o k e i n o i h i n + t o d e n n u s j ä r j e s t e l m ä n + p ä ä o m a m ä ä r i ä + p i t k ä j ä n t e i s y y t t ä + v a l m i s t e l t u a + a m i r a l i t e e t t i s a a r t e n + p e r u s v a a t i m u k s e n i + k o h d e m a a t + o b j e k t i i v i s e m p i + k e m i k a a l i t u o t a n t o + k e r t a m a k s u j ä r j e s t e l m ä ä + s e l e e n i v e t y + s e l k ä r a n k a v a m m a + s u o s i n u t + h a u s k a a + e r i t y i s o n g e l m a a n + l i s e n s o i n t i m a l l i s t a + v a a l i h u o n e i s t o j e n + t i i v i s t y m i s y d i n + e s t ä j ä n ä + t u o t e t u r v a l l i s u u s v e r k k o o n + v a l m i s t u k s e n + k u n n i a n h i m o i s e k s i + y k s i t y i s o i k e u s a l u e e s t a + j u u t t u i s i + p o h j a v e d e s t ä + m i n u l l e k i n + h a l l i n n o i n t i y h t i ö i h i n + h y g i e n i a s ä ä n t ö j ä + t u k i k i l p a i l u a + s u u r i s u u k a l a + i k ä p y r a m i d i a + j ä l l e e n v a k u u t u s y r i t y k s e e n + o i k a i s e m a t t a + l a p i n u u n i l i n t u + k a u p p a l i i t t o + y l i v o i m a i s e s t a + v i h a m i e l i s t e n + l a k i t e k s t i e n + u r h e i l u s a n k a r e i t a + k y v y s t ä m m e + k a u p p a s a a r r o n + i h m i s a a l t o + s t a n d a r d e i l l e + t a r k k a a v a i s e m p i + m ä ä r ä n p ä i h i n + v a r a u s r a h a s t o n + m e t s ä p a p u r i k k o + k a h d e s t o i s t a o s i e n + j a l k a p a l l o o n + i d e a l i s t i s e m p i a + v a l k o p a r t a + k i e r r ä t y s a l u e t t a + t y ö t t ö m y y s a v u s t u k s e e n + u r h e i l e m i n e n + s o l m i m a t + v a k u u t u s r a h a s t o j a + r a h a l l i s t e n + t a r k a s t u s h e n k i l ö s t ö n + k u n n i a n h i m o i s i m p i e n + m e t y y l i k e l t a i n e n + e l i n t a r v i k e a l l e r g i a t + e n e r g i a n k ä y t t ö + t u t k i m u s v a l i o k u n n i s s a + s i n i k y y h k y t + w o l o f i t + e r i l a i s i m m i l l a + t o i m i k a u d e l l a a n + t e o l l i s u u s l a s e r e i t a + v a l v o n t a p u i t t e i d e n + k a s v a m i s t a + l e n t o k i l o m e t r e j ä m m e + t ä r k e y d e s t ä + l u o n n o n k i e r t o k a t t i l a + k a n s a n t e r v e y d e l l i s i s t ä + n a a p u r u u s k y s y m y k s i ä + p u o l u s t a u t u m i s o i k e u s + y h t e y s r y h m ä ä + e s t e i l l ä + k u l t t u u r i t u o t t e i l l e + h u u m e r a h o i s t a + h a j a n a i s e n + i v a n o v i n + o l i k i n + t u r v a l l i s u u s a s i a a + a j o k i e l t o i h i n + p a k k a u s k a a s u + k e h i t y s l a i t o s t e n + m u s l i m i n a i n e n + n a a p u r i s u h t e e t + h a l l i n n o i n t i m e n e t t e l y t + k i d u t u s m e n e t e l m i s t ä + h u m a n i t a a r i s e l l e + u r h e i l u k e n t t i ä + a i n e t t a + k r a n a a t i n h e i t i n t e n + v i i s u m i p a k o s t a + k a s v u n a + k a l a s t u s m a h d o l l i s u u k s i l l e + k o n n u n l a h t i + b u m e r a n g i v a i k u t u k s e n + a r v i o i n t i j ä r j e s t e l m ä ä n + v e d e n n o u s u j a + v i i k k o k a u s i a + k o r k e a t a s o i s e s t a + s y d ä n s a i r a u t e e n s a + y r i t y s k e s k i t t y m i n ä + j u h l a i s t u n t o + r o s k a p a n k k i e n + s e r t i f i o i n t i p r o s e s s i + k a t a s t r o f i t o i m i e n + l i s ä ä n t y n e i d e n + p u o l u s t u s k a m p a n j o i h i n + a j o k i e l t o j e n + k a t a l y s a a t t o r e i n a + t e k s t i i l i t + d i g i t a a l i e l o k u v a + a n t e e k s i a n t a m a t t o m i m m a t + m o n i k a n s a l l i s i l l e + l i i k e n n e n e u v o s t o l t a + s o l i d a a r i s u u s k y s y m y s + t u t k i m u k s i s s a + o i k e u s l a i t o k s i a + y d i n v o i m a p o l i t i i k a l l e + k ö y h i m p i e n + p u u t t u v i l l e + v o i t t a n e e t + s o k e r i n k u l u t u s + s u r u p ä i v ä + f i n a n s s i a l a a + k a n s a l a i s u u t t a + k o r j a u s l a u s e k k e e n + s y ö p ä s e u l o n t a + s ä h k ö m a g n e e t t i s e t + e n e r g i a t e h o k k a a n + d a k o t a i n t i a a n e i l l a + j o u l u l o m i a + v i t k a s t e l e e + p e r u s h y g i e n i a n + t a r k i s t u s e h d o t u k s i s s a + l a i n o p i l l i s e t + l u k u t a i d o t t o m u u d e n + v a p a u s t a i s t e l u s t a + y h t e i s t y ö h a l u t t o m u u t t a + a i v o t o i m i n n a n + u i m a h a l l i + k a n s a l a i s j ä r j e s t ö i l l e + s ä ä n t e l y l a i t o k s i s t a + k u u l e m i s e s s a n i + e r i t y i s k y s y m y s t e n + a v o l i i t o n + p ä ä o m a r a h o i t u k s e e n + p e l a s t u s p a l v e l u j ä r j e s t e l m ä ä n + k o u l u t u s l a i t o k s i s t a + a l a i s e t + v i h e r h u i s k u k e r t t u + m e r i r e i t t e j ä m m e + y m p ä r i s t ö i n t r e s s e j ä + k a k s i v u o t i s k a u t e n a + v ä h i m m ä i s r a h o i t u s o s u u d e k s i + v a k u u t u k s e n o t t a j a a + r a u h a l l i s e m m i n + p a k o t e p o l i t i i k k a m m e + h e v o s m u u r a h a i n e n + ä i t i y s s ä ä n n ö s t ä + a r v o n l i s ä v e r o k a n t a + r a n s k a n o p e t t a j a t + v a l k o n i s k a k u t o j a + k i e l i m u u r i n + r i k o s t u o m i o i s t u i m e s t a + o s u u s k u n n i l l e + v a k i t u i s i a + p u n a k a t a r a + p o l t t o a i n e t a l o u t t a + t e k i j ä t + i n v e s t o i n t i h a n k k e i l l e + k o k o n a i s m y y n t i i n + t i l a p ä i s e l t ä + t o i m i m i s e n + y l i b u d j e t o i n t i a + y r i t y s a s i a k k a a t + s u u n t a i s e n + i l m a i s u v a p a u s + l i i t t y m i s p ä i v ä m ä ä r ä n + u l k o r a j o i l l a + i n t r e s s e j ä ä n + s a m a n s i s ä l t ö i s e n + m e n e s t y k s e k k ä ä m m i n + s a t a p r o s e n t t i s e l l a + p i d e t y s t ä + e r i t y i s l a j i n + s i r o n + s y n t y m i s e k s i + k o o k o s s a a r e n s i r k k u + k o s t a u t u u + k ä y t t ö m a k s u j a + v i e n t i k i e l t o j a + s o t a p o n n i s t u k s e t + p e r u s s a i r a a n h o i t o o n + p a k k o s i i r t o j e n s a + v a l v o n t a r a k e n t e e n s a + v a l v o n t a k o m i t e o i h i n + o p t i m i k o k o + k a k s i t a h o i s e t + p u h u m a s t a + y m p ä r i s t ö k a t a s t r o f i n + p u o l u s t u s b u d j e t t i + k e s k u s t e l u k u m p p a n i t + e t e l ä n l i e j u k a n a + a l k u a s u k k a i t a + l u o n n o n v e s i + t u o t a n t o k i i n t i ö + v e r k k o v i e r a i l u p u h e l u i l l e + k ä r k e m m e + s ä i l y t t ä n e e t + v a l t i o v i e r a i l u t + l u v u t + h y v ä k s y n t ä v i r a n o m a i s t e n + ä ä n e s t ä ä k ö + p e s i m i s p a i k o i l l e e n + i n n o v a a t i o m a r k k i n o i t a + t a s o l t a a n + m a l a r i a p o t i l a s + p ä ä s t ö v ä h e n n y s s i t o u m u k s i s s a + a t e i s t i t + s i v u u t e t a a n + v e t k u t e l l a + e u r o o p p a l a i s e t + e t e l ä a f r i k a n k i r v i n e n + t a h a t t o m a n + t a r k i s t u s t y ö n + t i l a s t o j ä r j e s t e l m ä ä n + t a v o i t t e e s s a + s t r a t e g i a l l a + r a h o i t u k s e n v a k a u s m e k a n i s m i n + k u u p e r h o k a l a + k u l u t t a j i s t a + b u d j e t t i k o h d i s s a + t e r a p e u t t i s e n + e l v y t y s s u u n n i t e l m a k s i + s a i t t e k o + h i n t a v a k a u d e n + p e r s p e k t i i v i n m u u t o s + t y ö s k e n t e l y p r o s e s s e i h i n + p a h i n + k a n a a l i t u n n e l i s s a + k u v a t i e d o s t o m u o d o t + m e l u n t o r j u n t a + o p e t u s s u u n n i t t e l u s s a + v a i k u t u s t e n a r v i o i n t i r a p o r t i n + r a k e n n u s t u o t e a s e t u s + t u k i p o l i t i i k k o j a + t e k n o l o g i a y m p ä r i s t ö j ä + o s a l l i s t u m i s r a j o i t u k s e t + n a t r i u m m e t o k s i d i + p o h d i n n o i l l a m m e + i m e v ä i s t e n + s i i r t y m ä k u l u j a + y m p ä r i s t ö b u d j e t i s t a + v o i n k o + j o u t u n e i t a + k a u p u n k i s u u n n i t t e l u m a l l e j a + l u o t e t t a v u u s t e k n i i k k a + t a l o u s a r v i o k e s k u s t e l u i s s a + o i k e u s v i r a n o m a i s i a + a n t e e k s i p y y n t ö n ä + y k s i k ö n p ä ä l l i k ö n + l e n t o p a l l o j o u k k u e + v a l v o n t a p o l i t i i k a l l a + t e k s t e j ä + j a l k a p a l l o k i s o j e n + s u u t t u m u s t a + h ä i l y n e i s t ä + t i e l i i k e n n e m a r k k i n o i l l a + m a t k a e t u j a + v a r a l a i n s ä ä d ä n t ö + h u o m i s e k s i + s u o j a k ä s i t t e l y n ä + v a k a u t u s s t r a t e g i a a + k l a s s i s t a + v a k a v i m m i n + v a a l i u u r n a a + y r i t y s s t r a t e g i a n + t o r j u n t a a + a r g u m e n t t e i n a + j a t k u i + j ä ä l e i n i k k i + p ä ä r y h m ä ä + n o r m a a l i k ä y t ä n n ö n + k a s v i l a j i k k e i t a + k a m m i o v ä l i s e i n ä a u k k o + l u o t e t t a v a m m a s t a + r a u t a t i e l i i k e n n e y h t e y k s i e n + k ä y t t ä j ä y r i t y k s e s t ä + p e l a s t u s t y ö n t e k i j ö i d e n + r a t k a i s e m i s e l l e + s o p i m u s k o h t i a + k y m m e n v u o t i s s u u n n i t e l m a + m u o d o i s s a + n e t t o m a k s a j a r y h m ä + a l k a n u t k i n + o d o t t a m a + k o n s u l t o i n t i y r i t y k s e t + l a a t u i n v e s t o i n t i e n + o i k e u s t u r v a t a k u i t a + m ä ä r ä a i k a i s k e r t o m u s t a + k u l t t u u r i a r v o i l l e + r u m p u s o o l o + k a s t e l u i n f r a s t r u k t u u r e i l l e + a r v o i s e t + i l m i a n t a j a v a l t i o s t a + p ä i v ä n s i n i + k a u h e i m p a a n + f r i s b e e g o l f + t o i m i e l i m i s t ä + y l i t y s m a r g i n a a l e j a + p e r u s t a j a j ä s e n i l l ä + k a n s a n t a i d e + o n g e l m a v e l o i l l e + k o u l u t u s r a k e n t e i s t a + v a i k e i m m a k s i + k e s k i t y s l e i r i e n + k a k s o i s v e l j e n + p a n k k i m a k s u i n a + t i e d o s t a v a m p i + l i b e r a a l i f e m i n i s m i + v e r t a i l u j a k s o o n + a m m a t t i k o u l u l a i s i a + l i i k e n n e r u u h k i i n + v a l v o n t a v i r a n o m a i s i i n + s a l a s s a p i t o l a u s e k k e e s s a + t u r v a l l i s u u s v a l v o n t a + m e r i v e s i e n + a s i a k y s y m y k s i s s ä + a m m a t t i l i i k e n t e e n + s u l a u t u m i s s u u n n i t e l m a n + v a l i t s e m i a + a b s o l u u t t i s e n + p e r u s s ä ä d ö k s e t + t y ö t a p a t u r m a v a k u u t u k s e s t a + r i s t i r e t k e k s i + b y r o k r a a t t i s i l l a + r a n n i k k o j ä s e n v a l t i o i l l e + e h k ä i s y t o i m i l l a + v a n i l j a s o k e r i + a h m a t t i k o t i l o + l i i k e n n e o n n e t t o m u u d e s s a + p a l v e l u l a i n s ä ä d ä n n ö n + v i r t a t i l e j ä + p ä ä v a i h t o e h t o + k o n s u l i e d u s t u s t o + v i i v a k o o d i n + r a s k a u s k u u k a u d e l l a + l a i n s ä ä d ä n t ö v ä l i n e i s s ä + k u s t a n n u s h y ö t y s u h d e + h u m a n i s m i s t a + v a l t a r a k e n n e + k i r j o s i e p p o + n a a m i o t r o g o n i + i t ä m i s a j a s t a + t u l l e v a t + l e v i t y s k o n e i s t o l l a + t a r k a s t u s v a a t i m u k s e t + e n e r g i a v e r k k o p o l i t i i k k a m m e + y m p ä r i s t ö a s i a t + t u r v a l l i s u u s o n g e l m a a n + r e f l e k s i k o t e l o + v a n h e m m a t + l ä ä k e l a i n s ä ä d ä n t ö + n o p e u t t a n e e t + ä i t i y s v a p a a d i r e k t i i v i n + p u u t a v a r a k a u p p i a a l t a + p u u t t u e s s a + t a s o a + e n e r g i a h u o l t o n s a + l u o m i s t a m m e + r o t u j a + t a l v i k a u s i + l a a j e n t u m i s n e u v o t t e l u i h i n + a s e i l l e + s e u r a n t a p r o s e s s i a + a m m a t t i l i i t t o j o h t o a + a v a r u u s v o i m a t + l i i t t y m i s h a k e m u s t a + m a l i n + s i v i s t y s t a s o n + k e s a n t o p e l l o i l l a + v o d k a k y s y m y s t ä + p ä ä o m a k u s t a n n u k s e t + r a i t i o v a u n u h a n k e + k a r a n t e e n i m ä ä r ä y s t e n + t u r v a l l i s u u s t e k i j ö i h i n + k a u p p a t a v a r a + p e r u s t u s l a k i l u o n n o s + y d i n e n e r g i a t u o t a n t o o n + v e n ä l ä i s s o t i l a a t + p ä ä p i i r t e i l t ä ä n + a s e e l l i s e n + s ä i l i ö a l u s o n n e t t o m u u k s i s t a + l u j e m p i a + v a r j o e s i t t e l i j ö i l l e + s a n a t a r k k o i h i n + v a l i n t a k r i t e e r e i t ä + h a n k e j o u k k o v e l k a k i r j o i h i n + e l v y t y s v a r o i l l a + k ä y t i i n k i n + t r y f f e l i ö l j y + t a r k i s t u s k i r j e + l i i t t y m i s t a v o i t t e e s s a + h i i l i d i o k s i d i v e r o o n + h a l l i n t o m u o t o a + e r i k o i s o h j e l m a a + r a u t a t i e l i i k e n n e a l a n + t a l o u s m a h d i t + y l i t t ä v ä l l e + p a l k k a o r j a t + e n e r g i a n s ä ä s t ö t o i m e n p i t e i s i i n + v ä l i m a t k a n + y l e i s ö l e h t e r i l l e + i t s e n ä i s t y m i s k e h i t y k s e n + p e t o l l i s e m p i a + b u d j e t t i o i k e u d e n + s i i r t o l a i s k i i n t i ö i s t ä + t a l o u s a r v i o r a s i t e t t a + t a l o u s u u d i s t u s o h j e l m i s s a + t e k n o l o g i a p o l i t i i k a n + h a r k i n t a a + l i s ä ä m ä n + k a u a s k a n t o i s e m m a l l e + s i i r t y m ä a l u e e t + e d u s t u s e l i n t e n + k a a l i k ä r p ä n e n + k e s ä a i k a s ä ä n n ö k s i s t ä + s e u r a s a a r e t + v a a t e t u s a l a + k o m m u n i s m i o i k e u d e n k ä y n t i ä + t u r v a l l i s u u s t a s o a + j ä r k e v i s t ä + ö l j y r a h a a + l i s ä t o i m e m m e + p a l u u o l o s u h t e i t a + v a l k o k a u l a v a r a a n i + l i s ä t o i m i n t a a n + s u u r h a n k k e e s e e n + e r i l a i s t u m i s t a + v a m m a i s f o o r u m i + l a i n s ä ä d ä n t ö i n s t r u m e n t i l l a + s e n a a t t i k i n + s o v i n t o r a t k a i s u n + p o l i i s i a k a t e m i a a + i s t u t u s k a u s i + v a a l i k a m p a n j a n k i n + l a a d i t u l l e + v a a t e a l a l l a + v a l u u t t a k u r s s i v a i h t e l u i h i n + y h t e i s ö p o l i t i i k o i l l a + t u r v a l l i s u u s t a v o i t t e i d e n + k o u l u t u s t a s o j e m m e + m a i n o n t a k ä y t ä n t ö j e n + j ä n n i t y k s e t + m i e l i r u o k a m m e + t a i t u r i m a t k i j a + l a i t o k s i l l a + l u p a a v a m m i k s i + l u o n n o n s u o j e l u a l u e e t + m u r h e n ä y t e l m i e n + o l e s k e l u l u v a t + k o k o o n p a n o l a i t o s t a + o d o t u s t e n + r a j a y h t e i s t y ö n + i h m i s l o u k k a u k s i l t a + s o v i t t i i n + v i r k a m i e s j o u k k o + t e r v e y s v a a t i m u s t e n + m a r k k i n a v a l v o n t a j ä r j e s t e l m ä n + t e l e v i s i o v e r k k o + i h m i s o l e n t o a + m a s s a k u l t t u u r i n + m o n i p u o l i s t a m i s t o i m i a + s ä h k ö l a i t e r o m u a + m ä ä r ä r a h a e s i t y k s i ä + m a k r o a l u e e l l i s e e n + v i r k i s t y s k a l a s t u s t a + p a r s a k a u d e l l a + p i l a a n t u n e i d e n + d i e s e l p o l t t o a i n e i t a + s i i r t y m ä d i r e k t i i v i t + k o k e i l u s t a + i s r a e l i l a i s i l l a + r a j o i h i n + i h m i s o i k e u s j u l i s t u k s e m m e + y d i n t u r v a l l i s u u s r a h a t + p e r u u t u s t a p a u k s i s s a + j a t k o t o i m i l l e + a u t o r i t a a r i s t e n + y k s i t y i s a s i a k k a i t a + y r i t t ä j y y s h e n g e n + s i n i s e s t ä + t a l o u s a r v i o v a a t i m u s t e n + n a a p u r i m a i h i m m e + r a t k a i s u o p e r a a t i o i t a + t i l a p ä i s t y ö v o i m a a + l u o n t o p e r i n n ö n + p r e e r i a p a l o n + j a a k a a n + i n n o v a t i i v i s i n + e s i t t ä y t y i v ä t + o h j e l m a l u o n n o s + t u r v a l l i s u u s n ä k ö k o h t i i n + s i k u r i r o u s k u + n o l l a v e r o k a n t a + r a j a t o i m e n p i t e i t ä + i l m a l i i k e n t e e l l e + a i k a k a u s l e h t i p a p e r i + k o m i s s a a r i a + r a s v a n + m e h i l ä i s t e n + k r a n a a t e i n + a s i a n t u n t e v i m m a k s i + s o t a t i l a l a k e j a + u k r a i n a l a i s i l l e + t u o n t i k i i n t i ö i s t ä + e l i n t a r v i k e v a r m u u d e n + e d u s t u s m u o t o j a + d e m o n s t r a a t i o h a n k k e i d e n + p a i k a l l i s l i i k e n t e e s s ä m m e + r u u s u v a l l a n k u m o u k s e m m e + k a n t o j a m m e + p e h m i t t i m i s t ä + y h t e n ä i s e m m i n + r u o k a m e l l a k o i s t a + e n e r g i a t e h o k k u u s l u o k a t + a j o v e r k o i s t a + e l i n t a r v i k e t u t k i m u s + r a d i k a a l i m p i + o h j u s t e k n i i k a n + t i l i n t a r k a s t u s v o i m a v a r o j a + s i i r t o m a a h e r r o i n a + t i s l a u s m e n e t e l m ä ä n + j a l k a p a l l o v e r t a u s t a + m e t s ä o h j e l m a n + r u u h k a m a k s u n + j o u l u o r a t o r i o + k a r k o t u s p o l i t i i k a n + s a r v i h a i k a l a t + k o m m e l l u k s i l t a + k ä y t t ö ö n o t t o k u s t a n n u k s e t + p r o j e k t i n + a l k u p ä i v i e n + o p p o s i t i o r y h m i l l ä + n o r s u i s t a + l i s ä j o u s t o n + p ä i v i t t ä i s e l l ä + m e t s ä n i e l u j e n + k a s v a t t i p e l a a j i a + t e s t i m e n e t e l m ä t + t u k e u d u t t a v a + s i v i l i s a a t i o m a l l i a m m e + s a t e l l i i t t i k u v a s t a + k u u k a u s i p a l k a s t a a n + e l i n t a r v i k e t u r v a l l i s u u s p o l i t i i k a n + h ä t ä t a p a u k s i a + n ä k ö k u l m a a n i + k a l a s t u s k u l t t u u r i n + k i i s t a n r a t k a i s u m e n e t t e l y n + k u n i n g a s k u n n a s s a k i n + h u o l i t s i j o i l l e + t u l l i v e r o t u k s e n + k a a t o p a i k k o j e n + k o l i k o i t a + j ä l l e e n v a k u u t u s j ä r j e s t e l m ä ä + v ä l i k e r t o m u k s i a m m e + h o i d o s t a + t o i m i e l i n k y s y m y k s i i n + i l m o i t a n + k e h i t t ä m i s t a r p e i t a + i t s e s e n s u u r i i n + k e l p o i s u u s k o k e e s e e n + p a n k k i i r e i t a + l a i n s ä ä d ä n t ö e h d o t u k s i i n + o l e n n a i s i m m i s t a + t u l l i l i i t o t + k e l k k a n n e + n ö y r y y t t ä v ä m p i ä + s i t o v i m m i s s a + r a k e n n u s u r a k o i s s a + o l e s k e l u l u p a + k a l a t a l o u s n e u v o s t o s s a + e l i n t a r v i k e o i k e u s + y h t e i s ö m e n e t t e l y i h i n + p u n a t e t r a + k a k s o i s v a l t u u t u k s e n s a + y h d e n m u k a i s t a m i s p r o s e s s i s t a + ä ä r i r y h m ä n + p r e s i d e n t i n v a a l e i s t a + s u l j e t u i m m i s t a + l o p e t a n k i n + l u o n t e e l l e + k a k s o i s t a v o i t t e e n + a v a r u u s l u o t a i m e n + m a a t a l o u s t u o t a n t o o m m e + v a l m i u s a l u k s e t + h i r m u h a l l i n t o + p a n k k i t r a n s a k t i o n + p e r u s t a v a l t i o t + ä y r ä i d e n + r a j o i t e t t u u n + t e k i j ä n o i k e u s k u l t t u u r i a + t y ö t t ö m ä l l e + t i e t o k o n e p e r u s t e i s e s t i + t o r j u m i s i l m i ö s t ä + a l u k s i i n + p a l k k a e r o a + k i i n a l a i s t e n + k e m i k a a l i r i s k i e n + t y y n e n m e r e n s a l a m a n t e r i + p a k k a u s t e o l l i s u u d e s s a + i s r a e l i l a i s i l l e + h i u s t e n i + k u l t a r a p u t o k k o + v i e v i ä + v e t ä y t y n e e n + h i i l i v u o d o s t a + a i e i l m o i t u k s e n + t u h k a k o t t a r a i n e n + p o l k u m y y n t i t u l l e i s t a + s o t a k i r v e e n s ä + k o m m u n i s t i d i k t a t u u r i + k u l t t u u r i e s i n e i s t ä + a m m a t t i a r v o s t u k s e n + k e l t a s i n a p p i + k a a t o p a i k k a k a a s u a + p a k o l a i s k r i i s i n + k e h i t y s v a i h e t t a + m y r k k y p ä ä s t ö i s t ä + b a n a a n i k y s y m y k s e s s ä + m ä n t ä k o m p r e s s o r i + m u k a u t t a m i s k y k y + k o m m u n i s t i j o h t a j i e n + t o t e u t e t t u i h i n + p a n k k i k u l u i s t a + a v a i n k ä s i t e + v e r k o t t u m i s v a i k u t u s t e n + p o h j o i s o s i i n + a n n a t t e k o + k e s k e y t t ä e s s ä ä n + l a p s i u h r i t + t e o l l i s u u s s t r a t e g i a s s a + k a s v u s t r a t e g i o i h i n + a l u e v a l i o k u n n a n + l a i n s ä ä d ä n t ö m e n e t t e l y i n + k ä y t t ä y t y m i s s t a n d a r d e j a + k i i n t e i s t ö n v ä l i t t ä j ä t + e r i t y i s m e r k i t y s + n y k y s ä ä n n ö i l l ä + k u l t a r y n n ä k ö n + l a u l u s i r k k u + t y ö s u h d e t u r v a + l ä h t e e n + k o k o n a i s t a v o i t t e e t + t u r v a l l i s u u s t i l a n t e e s t a + r a s v a k u d o s + k o e n t s y y m e j ä + r u o s t e s e l k ä r a s t a s + t i e t o j e n k ä s i t t e l y s s ä + a m m a t t i y h d i s t y s j o h t a j i a + k u i v u u d e s t a + s o p i m u s a s i a k i r j a t + p u h u n e e l l e + k a i k k i i n + t ö r m ä p ä ä s k y + l a i d u n a l u e i l l a + m e r k k i p a a l u n a + l e g i t i m i t e e t t i o n g e l m i a + v e l k a h e l p o t u s m e k a n i s m i e n + i h m i s o i k e u s a s i o i d e n + l u u s a i r a u k s i e n + k u m p p a n i o r g a n i s a a t i o i t a + v ä h e n t ä ä k s e n n e + e s t e e t ö n t ä + t o i m i k a u d e l l e + a s i a k k a i s t a + k o u l u t u s j ä r j e s t e l m ä s t ä + h o i d o i s t a + p ä ä s t ö l u o k k a a + r e a l i s t i s e m p i a + r a k e n n e u u d i s t u s p r o s e s s i e n + g e e n i e n + i t ä s a k s a l a i s i i n + y d i n v o i m a n + s u u r m a a n o m i s t a j i a + i h m i s o i k e u s e h t o + k e s k u s p a n k k i i r e i l t a + k ä y t ä n t e i t ä + u l k o m a a n v e l k a o n g e l m i a + k o i l l i s e e n + r a k e n n e r a h a s t o m ä ä r ä r a h o j e n + t y ö n t e k i j ä v a r a s t o j a + r i k o s r e k i s t e r i t i e t o j a + v i l l a p a j u + e t u l i n j a + k a a s u k i i s t a a + r i k k o v a n + m a i t o t u o t t e i s s a + l i i t t y m i s p ö y t ä k i r j a a + t u n t u v a a + l u o t o n a n t a j a y r i t y k s i l l e + s o k e r i k i i n t i ö t ä ä n + e d u n s a a j i l l e + p i l o t t i t e h d a s + h e l p o t t a m i s e k s i + s i v i i l i u l k o p o l i t i i k a s t a + v u o r o k a u s i r y t m i e n + n e u v o s t o m a l l i s t a + a r v o n l i s ä v e r o n k i e r t o a + y m p ä r i s t ö v i r a s t o s t a + v ä e s t ö o h j e l m i i n + k y t ö k a r h u n s a m m a l + t u b e r k u l o o s i r o k o t e h a n k k e e l l e + e n e r g i a s i s ä l t ö ä + n i m e n h u u t o a + e n e r g i a p a l v e l u i h i n + p a i n o k k a a m p i + p e r u s p a l v e l u i t a m m e + e k o l o g i s i s t a + v ä h e m m i s t ö r y h m ä t + y d i n s o d a n + v e r o p o h j a s t a + a i n e t e s t i ä + a l u e k y s y m y k s e s t ä + s i i r t o l a i s t a u s t a + k o i v u r o u s k u + k u s t a n n u s v a s t a a v u u s + v e r o p e t o s s o p i m u s t e n + o s o i t i t t e + t u l l i h a l l i n t o + e r i k o i s t u m i s m a l l i t + v a l o p i l k k u j a + h a p p i h o i t o + p ä ä t ö k s e n t e k o k e s k u k s e t + t u r v a l l i s u u s i n d i k a a t t o r e i l l e + s a m e t t i j a l k a + m ä ä r ä t i e t o i s e m m a t + t a l o u s a r v i o s u u n n i t e l m a + v a l t u u s k u n t a v i e r a i l u l l a + t ä y t ä n t ö ö n p a n o a s e t u k s e l l a + a l k a l i p a r i s t o + p e r u s t a v a m p i a + k o u l u t u s k u r s s e j a + p a n s s a r i v a u n u k a n u u n a + p a r t i o p o i k i a + v a l k u a i s a l a n + t i e d o t u s t y ö k a l u j a + l i i k e l e n t o t o i m i n t a + p a n k k i s e t e l e i t ä + a f r i k k a l a i s l a s t e n + a f g a a n i k u n i n k a a n + o i k e u s e l i m e n s ä + v a l t u u s k u n t a m m e + k o n t e k s t i s t a + n ä k ö r a j o i t t e i s e t + e l ä i n r e h u a + m a i t o j ä r v e t + l i i k e n t e e n v a l v o n n a n + s t i p e n d i o h j e l m a + t e r v e y s v ä i t t ä m ä n + t y ö v o i m a i n t e n s i i v i s t ä + t i e d o t u s v e r k o t + a i k a r a j o i t u k s e n + v a r a s t e t u n + j u o k s e v i e n + m a n t u k i m a l a i n e n + s e l v e n n y k s e s t ä + s e l v ä s a n a i s e n + y h t e i s k u n t a p o l i i t t i s i i n + t y ö a j o i s s a + k e s k i t e t y n + s i s ä v e s i r e i t t e i h i n + u s k o t t a v u u s k y n n y k s e k s i + k e h i t y s y h t e i s t y ö t o i m i e n + n u i j a s e i t i k k i + t u r v a l l i s u u s n ä k ö k u l m a a n + h o i t o v i r h e + h e n k i l ö t y ö p ä i v ä ä + l a a t i s i m m e + v i e s t i n t ä s t r a t e g i a a m m e + t u b e r k u l o o s i r o k o t e h a n k k e e n + k a t t a v a m p a a n + t ä m ä n a a m u i s e s s a + s y v y y s k r i t e e r i s t ä + p a r a n e m i s e e n + m i k r o b i l ä ä k e r e s i s t e n s s i + ö l j y b a r r e l i a + k u l t t u u r i p e r i n t ö h a n k k e i s i i n + m i e l e n k i i n t o i s t e n + v a r h a i s e l ä k k e i d e n + m a t k a l a u k k u l a p s i + h a r h a k u v i t e l m a + l ä ä k ä r i t + k o k o p ä i v ä t y ö n + k a a s u p ä ä s t ö j e m m e + v a s t a u h k a u k s i i n + p o s t i d i r e k t i i v i l l e + k i r i s t y m i n e n + k o s i n i l a u s e + r a h a p r o j e k t i n a + a j o k i e l t o + l ä h i p o s t i t o i m i s t o t + u i g u u r i s e p a r a t i s t i t + v a s t a v u o r o i s u u t e e n + k a l a s t u s s o p i m u s n e u v o t t e l u i d e n + k o p t i v ä h e m m i s t ö ö n + ö l j y n t u o n n i n + s a k s a n k i e l i s e e n + p e r h e v i e r a i l u j e n + t u l k i t s e m m e + h e n k i l ö t o d i s t u k s e s t a + s ä ä n t ö h i e r a r k i a + v ä e s t ö n s u o j e l u k r i i s e i h i n + k a l a s t u s y h t e i s ö + t y ö k i e l i l l ä m m e + t y ö a i k o i h i n + i t s e n ä i s y y s p ä i v ä + j a p a n i s s a + m a a t a l o u s m e n o i l l e + k u l t t u u r i a r v o l t a a n + r a k e n n e p r o s e s s e i l l a + s p a r t a k i s t i k a p i n a + h a l l i n t o k u l u j e n + o l l e s s a + e l o k u v a s u u r u u d e t + h a l l i n t o t a l o u s a r v i o t a + i t s e n ä i s t y m i s e n s ä + e d u n s a a j a m a i d e n + v a i m e n t i m i s t a + s i n i l a k k i k o l i b r i + t ä y s i s t u n t o k e s k u s t e l u n + t y ö a i k a e h d o t + k a k s i t a s o i s e e n + d e m o k r a t i s o i t u m i s p r o s e s s i + v a l k o l e h t i m i t t a r i + t a k u u h i n n a s t a + v a r a l l i s u u s v e r o + a r v i o i n t i t u t k i m u s t a + o n g e l m a n r a t k a i s u + k a r h u n p a l v e l u s + y r i t y s r y h m i l l e + l u o n n o n a l u e i t a + t o t t u n e e m p i a + p o i k k e a v i a + h y v i n v o i n t i j ä r j e s t e l m ä s t ä ä n + a l o i t e t t i i n + h i e r a r k i a a + l o p p u h e t k i l l e + t ä r k e i s i i n + a r s e n a a l i s s a + v ä r i k o o d i j ä r j e s t e l m ä + j o u l u m a r k k i n o i h i n + l a a j e n n e t a a n + s a t e l l i i t t i k e s k u k s e l l a + k i v e n + s k i t s o t y y p p i n e n + p u i s t o t i a i n e n + y k s i t y i s t ä m i s a a l t o o n + k o r j a u s m e n e t e l m i s t ä + t i e t o s u o j a m e k a n i s m e i s t a + r a k e t t i s a t e e s e e n + l i i k e t o i m i n n o i s s a + h e n k i l ö p a p e r e i h i n + n e u v o t t e l u k e h y k s e s s ä + t a k a i s i n o t t o v e l v o l l i s u u t t a + s i i r t y m i s i l m i ö + e n s i s i j a i s e n + y l i k r i m i n a l i s o i n n i n + p u i t e p ä ä t ö s e h d o t u k s e s t a + m a a i l m a n p o l i i t t i s e n + r u o k a k a s v e i s t a + k a u p p a p o l i t i i k k a + a l u e k a a v o i t u s t a + t i e t o k o n e k a u p p i a a l l e + v a r o i t u s k y n n y s + i t s e k k y y d e n + t u n n i s t u s p r o s e s s i s s a + y h t e i s v a l v o n t a j ä r j e s t ö j ä + l u o v u u s v e r k o s t o n + m a i t o t u o t e a l a n + a p u p a k e t t e j a + k o l l e g o j e m m e + l e n t o k a l u s t o o n + i n f l a a t i o r a j o i t u k s i s t a + k u l t t u u r i y m p ä r i s t ö ö n + l ä ä k k e e l l ä + m a h d o l l i s i m m a t + r e h u v a r a s t o j e n + s e i k k o j a + t u r v a p a i k k a h a k e m u k s e e n + a p u s i t o u m u k s e n s a + s e i t s e n v u o t i s e e n + s y r j ä s e u d u t + v ä e s t ö k a t a s t r o f i n + l a p s i k a a p p a u k s e s t a + a r v o s t a v a n + s ä ä s t ö s u u n n i t e l m a n + r u o s t e v y ö h y k e + m i k r o y r i t y k s i ä + h o m o s e k s u a a l i a + v a l u u t a s s a + p o r t v i i n i ä + t e k n o l o g i a v a i h d o n + y h d e n m u k a i s e m p i + v a s t a a n o t t a j i e n + t u o t t a j a j ä r j e s t ö i h i n + t e k s t i i l i m a r k k i n o i l l a + l a i n s ä ä d ä n n ö s s ä k i n + j ä t e l i e t e + t u k i l u o k a n + k a n s a l a i s y h t e i s t y ö n + t y ö n t e k i j ä ä n + l u o t t a m u k s e l l i s u u d e s t a + e n g l a n n i s s a + s i s ä l l y t e t ä ä n k ö + l e p o j a k s o i s t a + y d i n a s e v a l t o j a + v e r o p a r a t i i s e i h i n + n o k i v a r i s + a v u s t a j a k o i r a t + p e r u s h u o m i o t a + v ä h i t t ä i s r a h o i t u s m a r k k i n o i t a + l ä m m i n v e s i + a s u i n p a i k k a n s a + i h m i s o i k e u s a s i a m i e s + p a n k k i a u t o m a a t t i e n + t e h d ä ä n k ö + o t t a n u t + a r v o v a l l a n + ä ä n e s t y k s e s t ä + i l m a s t o n s u o j e l u + m e r i k i s s a + i l m a s t o v a l i o k u n n a n + p s y k o t e r a p i a + p y s ä h d y s p a i k k o j e n + a l f a k e t o g l u t a a r i h a p p o + a r v o n l i s ä v e r o l u o k i t u s + i n f r a s t r u k t u u r e j a + l e m m i k k e j ä ä n + v a l v o n t a s ä ä n t ö j ä + i h m i s o i k e u s m i e t i n t ö j e n + s i n i s i l m ä k a k a d u + l u k u m ä ä r ä m m e + m a k s u v a l m i u s o n g e l m i e n + r a h a j ä r j e s t e l y + k o m m u n i s t i v i r a n o m a i s e t + j o n k i n n ä k ö i s e e n + y d i n v a l t u u k s i i n s a + v e r o h u o j e n n u k s e t + r a s k a i m m i s t a + k i i n n o s t u k s e n s a + b i o j ä t t e i d e n + t a r v i t t a v a t + j ä l l e e n r a k e n n u s t o i m i n t a a + h a r j o i t u s k i r j a a + t u l l i p o l i t i i k k a a n + k e h i t y s v ä l i n e + f l u o r a t t u a + p o i s t a t t e + p ä ä t ö s v a i h e + d i k t a t u u r e i k s i + a r v o j ä r j e s t e l m ä n ä + e n e r g i a o h j e l m a n + h a r j u s i n i s i i p i + s a n o i l l a m m e + p y y t ä m ä s t ä m m e + h i i l i t a v o i t t e i s i i n + v i r k a m i e s m ä i n e n + e r i t y i s m e n e t e l m i i n + e l o o n j ä ä m i s a s t e + m e t s ä m a a n + m e r e n k u l k u j ä r j e s t ö n + j a k o l i n j a n a + e r i t y i s t o i m i n t a o h j e l m a n + t u l l i m u u r e i s t a + l o p e t e t t a v a + p e r i a a t e s a i v a r t e l u u n + s i s s i l i i k k e e n + p o h j a k a l a s t u s t a + t y ö t a r k a s t a j a n a + t o i s e l l e + k o m i s s a a r i k o l l e g i o + i k ä l u o k a t + r y h m ä h e n k i + e t e n e m m e + v a p a u t t a m i s t o i m e n p i t e e s e e n + p ä ä s u u n t a v i i v a a + m a k s u v a l m i u s + i n d o n e s i a n + r u u s u h e l m i p e i p p o + h i i l i v o i m a l o i s t a + b u d j e t t i m e n o j e n + a s u m i s o h j e l m i i n + u l k o m a a n e d u s t a j i e n + ä ä n e s t y k s e m m e + j ä s e n v a l t i o i s s a k i n + k o r o s t a n e e t k i n + t u h o u t u m i s v a u h t i a + r a v i n t o t o t t u m u k s i s t a + t o i s t e t a a n + m u u t o s v a i k u t u k s i i n + k a a s u t e o l l i s u u d e s s a + t u r v a t o i m i l t a + n e u v o t t e l u t o i m i a + k e s k i n ä i s t e n + s a n o m a l l a + l i i k e y h t e i s ö ä + k u o l e m a n j o u k k o j a + o t o s o h j e l m i a + t a l o u s j o h t a j i e n + p r o s e n t t i y k s i k k ö ä + p ä ä h i s s e i h i n + a s i a k a s t y y t y v ä i s y y d e n + k o u l u l a i s v i e r a i t a + h y ö d y t t ä m ä ä n + l i s ä r a h o i t u s o s u u d e n + s y r j i t y i m p i e n + m e n e t e l l ä + p u h e l i n k o n f e r e n s s i s s a + m a t k a i l u p a l v e l u a l a n + p o i s t e t t i i n + t u l i s i + v i r k i s t y s k a l a s t a j i e n + i t s e m u r h a p o m m i + t a l o u s a r v i o t y ö s s ä + s u o m e n r u o t s i + a k a t e m i a t a l o + k a u k o n ä k ö i s i s t ä + v a l t i o n t u k i m u o t o j a + h ä v i t t ä m i s m e n e t e l m ä + k e s k u s t e l u i s s a n i + i n s i n ö ö r i t y ö + ä ä n i m ä ä r ä + p ä ä t t ä e s s ä ä n + t a l o u s u u d i s t u s o h j e l m a + v a k a a m m i k s i + s o r m i k i h a r a t + t e k s t i i l i k i i n t i ö i d e n + h u o m a t t a v a s s a + p ä t e v ä m p i ä + m a a i l m a n l a a j u i s t u m i s e n + e n e r g i a m e r k i n t ö j e n + s e i k k a i l e e + r a j a t a p a u k s e t + k ä s i t e l t ä v i n ä m m e + k a r j a t a l o u t e e n + e r i t y i s a l a k o m i t e a n + y l ä r a a j a + h u o m a u t u k s e n i + k u m p p a n u u s j ä r j e s t e l m ä + k u o l e m a n t a p a u k s i s t a + s e k u n d a a r i o i k e u d e s s a + s u u n n i t t e l u k a u d e s t a + l i s ä h u o m i o + j a k o t i s l a u s + p y y n t i p o n n i s t u k s e s s a a n + s ä h k ö p o s t i l i i k e n t e e s t ä + y d i n v a l l a k s i + t u l v a h a l l i n n a s t a + s o s i a a l i t u r v a o i k e u d e t + t e r v e y d e n h o i t o m a t k a i l u + i h m i s k u n n a l l e + k u m p p a n u u s j ä r j e s t e l m ä l l e + h o u k u t t e l e v i m p i n a + l o p p u t a v o i t e + r a k e n n u s t y ö n t e k i j ä t + a i n u t l a a t u i s i m p a a n + s i i r t o l a i s p o l i t i i k k a + m a a l i i k e n n e r e i t t i ä + s u o j e l u t a v o i t t e i t a + t o i m i n t a s ä ä n n ö t + v a l k u a i s l ä h t e i t ä + e l i n k u s t a n n u k s i a + g e e n i e l i n t a r v i k e + k i l p a i l u t i l a n n e t t a + k ö y h d y t t ä i s i + m a l a r i a r o k o t t e e n + m a a i l m a n t a l o u t e m m e + h u i p p u v i r o i s s a + t u p a k o i n t i a + t o i m i t u s h ä i r i ö ö n + e u r o k r i t e e r i t + h u k a t a a n + t u l l i m a k s u n + o l u t m a i n o s + p u o l u e e t t o m a m m a n + s a v u k e a s k i e n + s u o s i k k i r y h m i l l e + n ä k y m ä t + y l e i s n ä k e m y k s e n + v a r a s t o i n t i t a p o j a + j ä t e s i i r r o t + s y m b o l e j a + t a a n t u m a n + a u r i n k o s ä h k ö y r i t y s t ä + a s i a n m u k a i s e l l a + o i k e u s p e r i a a t t e i n a + k e h i t y s a p u r a h a s t o j a + l ä m m ö n s i i r r i n + f i n a n s s i k a p i t a l i s m i n + r a u h a n v a l v o n t a a + s u u r i p a l k k a i s i l l a + h u m a n i t ä ä r i s t ä + j o k i l u i k e r o + y h t e i s k u n n a l l i s e t + s ä i l ö n t ä a i n e i s t a + p a i k k a t i e t o a i n e i s t o j e n + k i v i h i i l t ä + y h t e i s v a l v o n t a j ä r j e s t ö l t ä + b i o d i v e r s i t e e t t i h a n k k e i d e n + v a r p u s k i u r u + a l u e k e h i t y s s u u n n i t e l m a k s i + r a h o i t u s m a l l e i s t a + e s i t y k s e s s ä n i + r a j o i t u s t o i m i i n + e l i n t a r v i k e h u i p p u k o k o u s + v i p u v a i k u t u k s e l l a + l i s ä t i e t o o n + k u u m o d u u l i + k i e l t ä m i s e s t ä + p ä ä m ä ä r ä m m e + o b j e k t i i v i s i l l a + r a j a p u o m i + v a l v o n n a n + a l u e v a l t a u s t e n + t a l o u s m i e t i n t ö ä + y h t e i s k u n n a l t a + v a k a a t + i h m e m a a + v a k u u t u s t o i m i n n a n + m a t k a i l u v a l i o k u n n a s s a + s a m a p a l k k a i s u u s v a a t i m u k s e e n + s a n o i s i n p a + a l k a v a n + p o i k a s t e n + o i k e u s h a l l i n n o t + v a h v i s t u s ä ä n e s t y s + k a l a s t u s l a i v o i s s a + m o o t t o r i a j o n e u v o s e k t o r i l l a + u r h e i l u k e s k u k s i s s a + m i e h i t e t y i l l ä + r a p o r t o i n t i j ä r j e s t e l m i ä + m e r i h i r v i ö + p o n n i s t e l u i s s a + v a k i i n t u n e i s s a + h o i t o p a l v e l u i d e n + s a t e l l i i t t i n a v i g o i n t i j ä r j e s t e l m i i n + k a n s a l l i s v a l t i o i t a + m a a h a n t u l o k i e l t o + v a k a u s m e k a n i s m e j a + t u o t t a v u u s k u i l u u n + t e r v e y s o m i n a i s u u k s i s t a + k ä y t t ä j ä r y h m ä l l e + v e r i k o k e e s e e n + t a v a r a n k u l j e t u s a l a l l e + i n t e g r a a t i o k r i i s i ä + i s t u n t o a i k a t a u l u + a n t i b i o o t t i r e s i s t e n s s i g e e n i e n + a r v o n l i s ä v e r o j ä r j e s t e l m i ä + r a j a j ä r j e s t e l y j ä + j ä r k e i s t ä ä + h y v ä n t a h t o i s u u d e n + r o m m i n t u o t a n n o s t a + v i s i o t + l o p p u a s i a k k a a l l e + t i e d o n s a a n t i y h t e y k s i ä ä n + r a t k a i s e m i s t a a n + p i t k ä p i p p u r i + n e u v o s t o t a s a v a l l o i s t a + a p u l a i s p ä ä j o h t a j a + k y s e l y t u n n i l l a m m e + p u i t e r a k e n t e e n + t o t e u t e t t a v u u s t u t k i m u k s e t + s u k k e l u u t e n s a + t a v a r a l i i k e n n e v e r k k o j e n + v o i n e + u l k o r a j a t a r k a s t u k s i a + v i l l i s i k a + a n a a l i t a p p i + t a l o u s m a r k k i n o i t a + a u t o n v a l m i s t a j i e n + t u l l i l i i t t o s o p i m u k s e l l a + h i n t a t a r k i s t u s m a l l i n + e n e r g i a v a r a t + h i n t a j ä r j e s t e l m ä + s u u r i n t a + r o m a n i a l a i s i a + l e h d i s t ö k o n f e r e n s s i + v i r h e e t + p a n k k i k o r t t i + e d u s t u s e l i n + y s t ä v y y s k o u l u t o i m i n t a a + e n e r g i a n k u l u t u s t a a n + a l u e e l l i s i l l a + o n n e t t o m u u s t u t k i n t a p ö y t ä k i r j a n + t y ö n t e k i j ä ä + e t u s i v u l l e + t a r k a s t u s s ä ä n n ö k s i ä + p e r i n t e i d e n + t o i m i n t a r y h m ä n + p o h j o i s p u o l e n + k a l a s t u s t e k n i i k k a + s i i p i k a r j a n l i h a a n + l i i k e n n e p o l i t i i k a s s a + l u o n n o n p e r i n t ö ä + a s t u n e e t + i d e n t i t e e t i s t ä ä n + t y ö t ä t e k e v ä t + r e k i s t e r ö i n t i v e r o n + r a h a m a a i l m a n + b a n a a n i y r i t y k s e l t ä + h e d e l m ä m e h u j a + l i i t t y m i s p ä i v ä n + k o n t r o l l o i v a t + l e g i t i m i t e e t t i t a s o a + p o l i i s i v o i m i s s a + k e i t t o l a i t t e i s i i n + r u s k o l a k k i k o t i n g a + l i i k u n t a t u n n i t + l i s ä k y s y m y s p y y n t ö ä + p a i n o s t u k s e s s a + l a s t e n t a u t e j a + l u p a a v i m m a n + i h m e a s e + t o t e u t e t t a v u u s t u t k i m u k s i a + v ä h i t t ä i s m y y j ä n + t e o l l i s u u s p o l i t i i k k a + v e s i m y y r i ä + t o i m i n t a k e i n o t + e d e l l ä k ä v i j ä k s i + r e h e l l i s y y d e l l ä + m a a l t a + o l y m p i a r e n k a i d e n + r a h o i t u s t a s o a + e n n e a g r a m m i + b o s t o n i n t e r r i e r i + p e r u s t e l t a v i s s a + k e h i t t ä m i s v a i h e e s e e n + k a t k a r a v u n p y y n t i a l u k s i l l a + s o s i a a l i s e t + k o h d e n n e t t u + t a r k i s t u s e h d o t u k s i s s a n i + b i o k a a s u a s e m i e n + t a r k a s t u s m a l l i n + p ä i n v a s t a i s i i n + s a a r i s t o y h t e i s ö t + a l a k u l o i s u u d e s t a + k a u p p a p o l i t i i k a n k i n + k o r j a u k s e l l a + p ä ä t ö s l a u s e l m a e s i t y k s e l l ä + s e u r a n t a k o m i t e a l l e + t u r v a l l i s u u s t a s o n a + j ä s e n y y s n e u v o t t e l u t + b y r o k r a a t t i s e m m a t + k a u t t a k u l u s t a + s o s i a a l i m i n i s t e r e i d e n + b y r o k r a t i a m e n e t t e l y j e n + a l i j ä ä m ä l l ä + k o u l u t u s k u s t a n n u k s i s t a + o r g a n i s a a t i o j ä r j e s t e l m i e n + v a h i n g o i t t a n e e t + k u u l i s i v a t + e g y p t i l ä i s t e n + k o u l u t u s o h j e l m a t + t e o l l i s u u s y h t e i s k u n n a s s a + m i n i m i a l u e e n + p e i t t ä n e e t + v ä l i t y s t y ö t ä + p e l a s t u s t i i m i i n + h e n g e n v a a r a l l i s e s s a + k u o p p a r i n t a + p e r u s e h t o j e n + v i h e r k u u l t o m o n n i + v i i t e a r v o i h i n + l u m i v a r p u n e n + s i v i s t y n e e s s ä + v ä e s t ö s u u n t a u s + t e r v e y s m e n o i h i n + j ä t e p a d o i s s a + j ä n n i t t ä v ä l l e + t e o l l i s u u s s e k t o r i l l e + l ä h i t u l e v a i s u u d e l t a + m a a p e r ä k ä s i t t e l y ä + s e l i t t ä n e e t + a s e m ä ä r i e n + t y ö a i k a l a i n s ä ä d ä n n ö n + l i i k e n n e y r i t y k s i s t ä + l e n t o l i i k e n n e s o p i m u k s e s s a + h e n k i l ö n + s e u r a n t a k e s k u s t e n + y l i s u o r i t t a m i s t a + t a r h a u k o n s i e n i + m e r k i n t ä j ä r j e s t e l m i s t ä + p i i r t e i l l e + h ö y r y p a i n e t t a + u l k o m a a n k a u p p a p o l i t i i k a s s a + a m m a t t i t u o t t a j i e n + v i i r u k i i t ä j ä + m e t s ä a s i o i s t a + v a r o i t u s k y l t t e j ä + v e r o p a r a t i i s i n a + r a u t a t i e l i i k e n n e p a k e t i n + ä ä n e s t y s l i p u k k e i d e n + k o m i t o l o g i a k ä y t ä n t ö j ä + v e r o t u s j ä r j e s t e l m i e n s ä + v e r o p o l i t i i k k a + l i i t t y m i s v a a t i m u k s i i n + i v a n o v i l l e k i n + k e s k i t t y m i s p r o s e s s i l l a + m a r k k i n o i n t i j ä t t i + y m p ä r i s t ö h a n k k e i s t a + r i n t a p r o t e e s e j a + t i e t o j e n s ä i l y t t ä m i s j ä r j e s t e l m ä + v e s i k y s y m y k s e s t ä + k i l p a i l u t t a m i s m e n e t t e l y i s s ä + k u u n t e l u k y k y ä + k o m i s s i o n + m o n i m u t k a i s t u n e e t + s e n s a a t i o l e h t i e n + r o h d o s t e n + k i l p a i l u k y k y + y l e i s r a t k a i s u u n + t a r p e e l l i s e e n + s i v i i l i k o m p o n e n t t i e n + v a l i o k u n t a k o l l e g a n i + k o k o n a i s t a r p e e s t a + t i e d e y h t e i s ö ö n + b r i t t i k o l l e g o j a n n e + t u o r e i m m a t + p e r u s v a l t u u d e t + i k i l i i k k u j a a + j a t k e t a a n p a s + v i h r e ä l l e + a l k u p e r ä ä n s ä + l a k i e s i t y s l u o n n o k s e n + k a n s a n n o u s u k s i + y h t e i s p u h e e n j o h t a j u u t t a + p a n k k i r o s v o + v ä h e m m i s t ö u s k o n t o j a + t u o n t i v e r e n + r o k o t t a m i s e n + p u n a k ä m m e k k ä + a l a k o u l u i h i n + u u t i s p ä t k i e n + p a k o l a i s p e r h e i d e n + s y m m e t r i s e s t ä + e r i t e l t y j ä + e n e r g i a n k u l u t u s t a m m e + t y ö v o i m a v a l t a i s i m m a n + a n d r o g e e n i r e s e p t o r i + k ä y t ä v ä h a u t a + t e r v e y t e e n + k a t s a s t a m i s e e n + h a n k i n t a v i r a n o m a i s e l l e + y l e i s l i n j a u k s i i n + l ä h e n t y m i s v a a t i m u k s e t + i l m a s t o i n t i y k s i k k ö + m u s t a s a k u + v i r a l l i s e m p i a + k e h i t y s k u l k u u n + y l i p a i n o + k y n t t i l ä n t u o t t a j i e n + t u l o s h a k u i s e e n + j a l k a p a l l o f a n i t + l a i n a t a k u i h i n + b a n a a n i a s e t u k s e s t a + t ä r k e ä m p ä n ä k i n + o i k e u d e n k ä y n t i m e n e t t e l y y n + t u o t a n t o r i s k i e n + k i i h k o u s k o n n o l l i s i a + ä ä r i o i k e i s t o v o i m i e n + o p e r a a t i o l l a + a t o m i v o i m a l o b b a u k s e n + b u d j e t t i t y ö h ö n + s a a t a v i s t a + h ä p e ä ä n + i n v e s t o i n t i l a i n o j e n + t y ö m a r k k i n a y h t e i s t y ö t ä + k r y p t o g r a f i a l l e + r u u m i i n r y ö s t ä j ä + v i l k k a i m p i a + t e s t i l e n n o i s t a + m a a h a n m u u t t a j a t y ö n t e k i j ö i l l e + l i n t u r u t o n + p e l a s t u s p a k e t e i l l a + p o h j o i s k o r e a l a i s i l l e + o l e t t a m u k s i i n + s o p i m u s j ä l j e n n ö k s e n + t u o m i o v a l t a a + h a v a i t s e m i a a n + a s u m i s p o l i t i i k a n + b a n a a n i d o l l a r e i t a + t ä y t ä n t ö ö n p a n o v i r a n o m a i s t a a n + o h j u s p u o l u s t u s + p r o t e i i n i f o s f a t a a s i + e t u n i m i n ä + e p ä t a r k k a + t o i m i n t a s u u n n i t e l m a e h d o t u k s e s t a + p o l v i v a m m a n + ä ä r i b y r o k r a a t t i s i a + k o m m u n i s t i p u o l u e e s t a + k a t a s t r o f i n h a l l i n t a a n + a u t o m a t k a + l u e t t e l o i n n i l l a + k ä y t t ä y t y m i s o n g e l m i i n + s t a d i o n e i l l a + k a u k o i t ä ä + v a r o v a i s u u s p e r i a a t e t t a + r i k k i h a p p o + p i k k u s e u r o j e n + y h t e n ä i s v a l u u t t a m m e + t y ö p e r ä i s i i n + l ä p i n ä k y v ä ä + m a a t a l o u s t u k i i n + h y v ä k s y m ä i s i l l ä m m e + o n g e l m a l l i s e m m a n + e l i n t a r v i k e v a r m u u s + h a n k i n t a p ä ä t ö k s i s s ä + s o k e r i n v i e j ä y h t i ö t + o r g a n i s a a t i o r a k e n n e t t a + p a i k a l l i s i n f r a s t r u k t u u r i + s e l k e ä m m ä s s ä + l a i l l i s t a m i s t o i m e t + v i i s i v u o t i s e k s i + k e r ä t y i s t ä + y k s i t y i s k o h t a i s e m m a l l a + p i d ä t t y v ä i s e m m i n + l i s ä ä n t y m i s o i k e u k s i e n + k a n s a n o p i s t o + s e l o n t e k o o n + r a h o i t u s p e r u s t e i s i i n + m e t a l l i r o m u a + s u u n n i t t e l u m e n e t e l m ä ä + p ä ä n e u v o t t e l i j a l l e + t e r v e e l l i s e n + e l ä k e h a k e m u k s e t + k i r j o k e i s a r i k a l a + j ä ä h d y t y s l a i t t e i t a + k o o r d i n a a t t o r i n a + m a h d o l l i s u u k s i s t a + s o r k k a t a u t i + i n f r a s t r u k t u u r i m a k s u t + j o u s t a v a m p i i n + t ä y t ä n t ö ö n p a n o r y h m i e n + t u r v a p a i k k a s o p i m u k s e l l a + n a i s y h d i s t y k s e t + l a i n s ä ä d ä n t ö m e n e t t e l y i s s ä + p a r l a m e n t t i j ä r j e s t e l m ä s t ä + s a t u n n a i s e t + l o p u t t o m a n + y h t e i s v a s t u u j ä r j e s t e l m ä + s i e l t ä k i n + t y ö m a r k k i n o i l t a + s a l a s e u r o i l t a + u n i o n i h a n k k e e k s i + e r i t y i s l u o n t e i s i a + ö l j y n j a l o s t a m o i l l e + o m i s t a j a o h j a u k s e s s a + l o p p u h u o m a u t u k s i i n + t a l o n p o j i s t a + e n n a k k o a r v i o t a + k e n r a a l i b a s s o + k a k s i n a i s j ä r j e s t e l m ä l l e + j u r i s t i e n + m e n e t e l m ä e h d o t u s + s u u r o s a k k a i t a + e n e r g i a t o i m e n p i t e i t ä + y m p ä r i s t ö t a k u u t a + s i n i n e i t o k a l a + v e r o r a s i t t e e s t a + t u t k i m u s s ä ä t i ö s t ä + t u l l i a k a t e m i a + o i k e u d e n h o i t o a + k i r j a n p i t ä j ä ä + t e k s t i i l i n v a l m i s t a j i e n + p ä ä o s a s t o j e n s a + y l e i s h y ö d y l l i s i ä + v a a r a t t o m a n + l i i k u n t a k e s k u k s i a + y h t e i s k u n t a r y h m i t t y m i e n + p u h e l i n p a l v e l u k e s k u s + k a n s a n ä ä n e s t y s k a m p a n j a a n + i r l a n t i l a i s p a p p i + t y ö l l i s y y s k r i i s i s t ä + y h t e i s t y ö v i r a n o m a i n e n + o k r a l l a + v e r o a s t e e s t a + s i v i i l i a l u e i l l a + p ä i v ä m ä ä r i i n + n ä k ö t o r n i + h e i k o i m p i e n + v a l i o k u n t a t y ö n + s e k a s o r t o o n + l a s t e n h o i t o p a l v e l u j e n + y h t e i s ö j ä r j e s t e l m ä n + l u k i e s s a n i + k ä s i t t e l y j ä + t a r k o i t i n + t u p a k o i n t i a l u e e l l a + a j a t u s h a u t o m o i t a + k e h i t y k s e n s ä + t y y n e n m e r e n k r i l l i + k e s k u s t i l a s t o t o i m i s t o + p i t k ä j ä n t e i s e t + m e t s i t y s t o i m i e n + p a l o a l u e + p e i t t o i l m i ö + l i i t ä n n ä i s j ä s e n + o i k e u s s u o j a k e i n o t + r a h o i t e t u s t a + l a s i p u r k i s s a + k u p l a k a m m i o + t y ö l l i s y y s v a i k u t u s + n a i s a s i a k e s k u s t e l u a + t u h o n n u t + k u k o i s t a v a m m a s t a + i l m a s i p u l i + l e i m a a m i s e n + l a i n s ä ä d ä n t ö t y ö h ö n + y h t e i s y r i t y k s e s s ä + u l k o m i n i s t e r e i d e n + k u m p p a n u u s s t r a t e g i a a + n e u v o s t o t a s a v a l l o i s s a + m a a s t a a n + e d i s t ä m i s t o i m i e n s a + v o i t a i s i + t u o t a n t o m e n e t e l m i l l ä + l e n t o y h t e y s + a l u e t u e l l e + t a r k o i t u k s e n m u k a i s e e n + v a r a s t o i n t i k a n n u s t i m e k s i + k u l u t u s k ä y t ä n t ö i h i n + k ä s i t t e l y a j a n k o h t a + p e r u s t u s l a k i k e s k u s t e l u s s a + y m p ä r i s t ö n l a a t u n o r m i t + k o k e i l u h a n k k e e n a + s i l m i n n ä k i j ä l a u s u n t o j a + l i s ä ä n t y v ä ä n + e d u s k u n t a + e n e r g i a n t o i m i t u s i n f r a s t r u k t u u r i n + s ä ä l i t t ä v i ä + t y ö t o v e r i + i n t e r v e n t i o n i s t i s e t + r a u h a n s o p i m u k s e n + h o r m o n e i s t a + l u k e m a a n + e m o t i o n a a l i s t e n + k e r ä y s t a v o i t t e e n + o l e m a s s a o l o o n + l u o t a e s s a + e l i n y m p ä r i s t ö + o r g a n i s m e i h i n + m a a t a l o u s t u o t a n t o v ä l i n e i d e n + k a u p p a k i i s t a n + t e l e l i i k e n n e l a i t t e i t a + h e r m o p i n n e + t y h j i ö s s ä + v e s i v o i m a l a i t o s + n o u s u s u u n t a u k s e n + l a a j a p o h j a i s e n + m a r k k i n a v e t o i s t a + t u r v a l l i s u u s k u l t t u u r i s s a + v a l t u u t e n s a + r y h m ä v i i s u m i + y h t e i s t y ö p r o s e s s i n + a s i o i n t i p i s t e i d e n + m a k r o t a l o u d e l l i s e l l a + s i j o i t u s j ä r j e s t e l m ä ä n + k a i k u p o h j a k s i + h a l l i n t o v a l t a a + e u r o v a a l i t + p e l a s t u s p a l v e l u a s i o i d e n + t u r v a l l i s u u s t i l a n t e e n s a + d o k u m e n t t i k a m e r a + a j o n e u v o o n + k e h i t y s y h t e i s t y ö o h j e l m i e m m e + p i t k ä j ä n n i t t e i s e n ä + k e i n o t t e l u v e r o s t a + k o r j a u s t e o l l i s u u d e n + v ä i t t e l y t e k n i i k k a a + s i i r t o l a i s u u s p a k e t i s t a + v i h k i p i i s p a + i h m i s m ä ä r i l l e + u u d i s t u s s o p i m u k s e l l a + t e l e v i e s t i n t ä a s i o i s t a + t u l k i n n a n v a r a a + h y v ä u s k o i s e t + a s b e s t i k e r a m i i k k a + t i e t o v e r k k o h y ö k k ä y s t e n + p ä i v i t t ä m i s e s s ä + m o o t t o r i t e i d e n + a u r i n k o v o i m a a + a i k a a n s a a m i s e s t a + v e r o t i e d o t + m e t s ä t e o l l i s u u s + m i k r o l u o t t o r a h a s t o i h i n + o i k e u d e n m u k a i s u u t e e n + h y g i e n i a l a i t + v a l m i s t e l u k u n n a l l e + v i i n i a l a n + t u l e n l i e s k a + a s i a n o s a i s e n a + n u o r i s o r i k o l l i s i i n + d e m o k r a t i a v a j e e k s i + p o t k u p a l l o n a + v a a l i t u l o k s e n + e h d o t u s s u u n n i t e l m a a n + j a t k o k o u l u t u s o h j e l m a + s a m a n t y y p p i s i s t ä + u l k o p o l i t i i k a k s i + a j o p i i r t u r i s t a + k ö y h e m m i s s ä + l a i n s ä ä d ä n t ö j ä r j e s t e l m i e n + m e r k i t t ä v ä m p ä ä n + l e n t o l i i k e n n e a l u e e s t a + k u m p p a n i m a i s s a + y m p ä r i s t ö a s i o i s s a + p a t e n t t i v i r a s t o s s a + m y r s k y s u k e l t a j a t + r i k o s l a j e j a + m e r i s a t a m i s s a + l i i k e h u o n e i s t o n a + v a r m i s t a m i s v e l v o l l i s u u t e n i + e l i n t a r v i k e n o r m e i h i n + k u l u t u s l u o t t o s o p i m u k s i s t a + o i k e u s a s i a m i e h e n ä + k u l t t u u r i o h j e l m a a m m e + n u r m i l a u k k a + k a n e l i p e u k a l o i n e n + y k s i t y i s k o h t a i s e m m i n + v a i k u t u s a r v i o n + l a k i k o k o e l m a n + m e r i t o r j u n t a o h j u s + k e m i k a a l i p a k e t i n + k a u p u n k i a l u e i s t a + e n e r g i a n t o i m i t u s r e i t t i e n + k i v i t y s t u o m i o + l a s t e n t a r h a a n + v a l m i s t e l u t o i m e n p i t e e t + t e h o s t e t t a v a + n e u v o t t e l u k a n n a n + n o s t a m m e + e l i n t e n l u o v u t t a j i e n + o n g e l m a r y h m ä k s i + h y l k e e n p y y n t i + r a h a l i i t t o p r o s e s s i s s a + r o t u v i h a + t u o m a t + v i h r e ä n + v e d e n k ä s i t t e l y + k a u t t a k u l k u t a v a r o i d e n + o s t o p ä ä t ö k s i ä + t i e t u r v a l l i s u u s s t a n d a r d i t + t u o t a n t o r a k e n t e i t a a n + t a l o u s a r v i o k o n e i s t o + m a a i l m a n s o t a a + h y ö d y k e m a r k k i n a t + v i i s a i t a + l a u s u m i a + v e r o k r u u n u j a + y m p ä r i s t ö p o l i t i i k a l l a + k a i k e l t a + k a l a s t u s k y s y m y k s i ä + t u k i r a h o j a + t u n n u s t a n u t + a r v o n l i s ä v e r o v a p a u t u k s e n + t u o n t i s u o j a + s y n t y p e r ä n + j a k a i s i v a t + n a a p u r e i d e m m e + v e r t a i l u k o h d a k s i + k a u t t a k u l k u v a l t i o i l l e + p s y k o s o s i a a l i s e t + t o i m i v i n + i n t e r v e n t i o v a i h e e s s a + m u s l i m i n a i s t e n + r o k o t u s r e n k a a n + h e v o s s i i t t o l o i t a + m a d r i g a a l i d r a a m a + k u r d i p o l i i t i k k o + o r k e s t e r i k a p p a l e t t a + ä ä n i v a l t a i s e k s i + t u t k i m u s p o l i t i i k k o j a + r a j a t y ö a s i a + k u l u t u s l u o t t o m a r k k i n o i l l a + s u k u p o l v e n v u o r o t t e l u + r y ö v ä t ä k s e e n + e n n a k k o a r v i o i n t i a + t u n t i p a l k a l l a + j u n a r a d o i l l a + y h t e n ä i s v a l u u t t a k y s y m y k s e s s ä + t a k u u p u i t t e e t + k i e l i k y s y m y k s e n + r a a i m p i e n + s u o m a l a i s j ä s e n e t + v o i t t o n s a + e l i n t a s o a m m e + k e h i t y s y h t e i s t y ö p i l a r i n + l i s ä t a k u i t a + k e r ä t ä + k u l j e t u s v e r k o s t o + k e r t o m a s t a + t a i k a s a n a s t a + n a u h a s i l m u k k a + r a h a l a i t o k s e n + a s i a n t u n t i j a l a u s u n n o n + s y ö v ä ä + k y m m e n v u o t i s t a + s i s ä o p p i l a i t o k s i i n + m a a n o s a m m e + l a i l l i s u u s p e r i a a t t e e n + t u l l i k i i n t i ö j ä r j e s t e l m ä l l ä + r i k o l l i s e s s a + i s t u t u s o i k e u k s i a + v e r o k e v e n n y k s i ä + r u u m i i n s i e p p a a j a t + m u u t o s j o h t a j a a + t y ö v ä l i n e i s i i n + m e t s ä n s u o j e l u o h j e l m a a n + y l e i s j ä r j e s t e l m ä ä + k a l a v e r k k o j a + k u l u t u s l u o t t o s o p i m u s t e n + s i i r t o t a l o u d e n + d i k t a t u u r i h a l l i n t o o n + s y ö p ä t a p a u k s i e n + l a a j a p e r ä i s e m p ä ä + s e i s t e n + y l e i s e m m i l l e + v ä k i v a l t a t a p a u k s i i n + d e m o k r a a t t i s e m m i k s i + j a o t t e l u a + s i n i s i m p u k o i t a + k u r i n p i t o l a i s t a + t y ö s k e n t e l y m e k a n i s m i t + v i i s a i n t a + u l k o s u h t e i s i i m m e + n e t t o m a k s a j i s t a + p u l l o s a r a + v u o s i k e s k i a r v o a + v ä s y m ä t t ä + m a h t a v i m p i a + k a n s a l l i s v a l t i o i l l e + s e k o i t t a m i s v y ö h y k k e i d e n + l i s ä p o l t t o a i n e s ä i l i ö + s y r j i ä + p a l v e l u s e k t o r i l l a + r a s i s m i f o o r u m i s s a + l i h a t e o l l i s u u d e s s a + j a l o s t u s t u k i a + g e e n i n s i i r t o + v a l v o n t a t o i m i e n + ö l j y n p o r a u s y h t i ö i d e n + t o i m e e n p a n o s u u n n i t e l m a a + t i l i n p i t o j ä r j e s t e l m ä n + b o f o r i a s t e i k k o + v e t o o m u s v a l i o k u n t a a n + s i v i i l i k r i i s i n h a l l i n t a o p e r a a t i o o n + t e r n i n + l e n t o l i i k e n n e k e t j u n + t e r v e y s v ä i t t e i d e n + s u o m u t a t t i + p i l o t t i h a n k k e i s t a + y d i n h e n k i l ö s t ö n + t u o t t a v u u s l u v u t + s u u r e n + k e s k u s t e l u k e r h o + m u o v i p u l l o j e n + p ä t e v y y s k i r j o i l t a + l i i t t y m i s v e l v o i t t e e t + s a d e p ä i v ä n ä + k u l u t u s t a + v a s t u u t a s o n + k e s k i v e r t o p e r h e + p a k o l a i s l e i r i l l e + t u o t a n t o k a u s i n a + k u r d i h e i m o n + t o r j u v i l l a + y r i t y s v e r o j e n + r ä j ä h d y s v o i m a + p i k k u s u l k a p e n s a s + a v a i n t o i m i e n + p ä ä t ö k s e n t e k o t e h t ä v i i n + h a r v i n a i s e n + r a d i o t a a j u u k s i s t a + s o s i a a l i e h t o j e n + y l i r e a g o i d a + t i l i n t a r k a s t u s t u o m i o i t u i n h a n + t o m u s o k e r i + k y s e i s e e n + r a k e n n e p o l i t i i k k a a n + r a h o i t u s k e s k u k s e l l e + r i s k i p ä ä o m a k s i + m a a t a l o u s r a h a s t o + v i i s u m i v a p a u s p r o s e s s i a + p e r h e e n j ä s e n t e n + o m a i s u u s k r i i s i + t u r v a l l i s u u s t i l a s t o i s t a + l i i k a r a h o i t t a m i s e e n + m u t k i k k a a m p i e n + h i i l i v e t y k e n t i l l ä + r a u h a n r a k e n t a m i s o h j e l m i l l e + e n e r g i a m u o t o + l e v y t u o t t a j i l l e + k i e l t ä y t y y + r a n n i k k o a l u e i d e m m e + s o t i l a s t e o l l i s u u t e m m e + s o v i n t o p r o s e s s i n + k e s k i t i e n + m a a h a n m u u t t o t i l a n n e + k a s v u v a i h e + u n k a r i l a i s s y n t y i n e n + m e t s ä n t u o t a n t o a + l u o n n o n h a i t t a k o r v a u s t e n + t a i t a v i i n + e n i m m ä i s h a r m o n i s o i n t i + a j o k o e + l a i n v a l v o n t a j ä r j e s t e l m ä ä n + k a l a t a l o u s s e k t o r i l l e + n e l i ö p a l k k e j a + b a s k i n a t i o n a l i s m i n + y m p ä r i s t ö k e s k u k s e e n + l y i j y p o h j a i s t e n + i h m i s p a r k o j a + h i e r o n t a m u o t o j a + e t e l ä v e n ä j ä n k o i r a + p e r h e j ä r j e s t ö t + k a u p p a t a r i f f e i n a + y h t i ö r a k e n n e t t a + s i v i i l i v a l m i u k s i a + h e r k i l l e + t u k i s u u n n i t e l m i e n + p ä ä v i e s t i + v a i h t o k u r s s i p o l i t i i k k a a + b u d j e t t i v a l l a n + s o t i l a s k o m i t e a + t u t k i m u s t e h t ä v i ä + y m p ä r i s t ö t i l i n p i t o o n + t u l v a s u o j a + k ä ä n n y t t ä m i s p o l i i t i k k o j a + v e r o n l a s k e n t a m e n e t e l m ä n + ö l j y o n n e t t o m u u d e n + p u n a h e l m i p e i p p o + h y v i n v o i n t i y h t e i s k u n t a m a l l i + e n e r g i a k o n s e r n i m m e + s e i k k a i l u t + o i k e u d e n m u k a i s i m p i e n + p e r u s m e n o j e n + p o s t i l a a t i k o i t a + k a n s a i n v ä l i s e s t ä + o t e t t u a a n + y m p ä r i s t ö n s u o j e l u p a k e t t i i n + t y h j e n t ä v ä m m i n + s i i r t o l a i s u u s o h j e l m a + v o i m i s t u u + s ä i l y t t ä m i s t ä + l i h a t e o l l i s u u t e m m e + k u l t t u u r i o r g a n i s a a t i o i t a + s e l v e m m i n + m a i n o s a i k a a + a r v o n l i s ä p r o s e n t t i e n + s o v i t t e l u m e k a n i s m i n + e n e r g i a n h i n n a t + p ä ä s t ö s t a n d a r d i t + m o o t t o r i a j o n e u v o v e r o j e n + k a u k o l ä m m i t y s t ä + r a h o i t u s m e n e t e l m i l l e + k o s t e i k k o v a h v e r o + r a k e n n u s t e o l l i s u u t e e n + t e h n e i d e n + s u u r e l e m e n t t i + k e u h k o s a i r a u s + t i e t y n t y y p p i s e n + i l m a s t o n m u u t o k s e k s i + k o n f l i k t i n t o r j u n n a n + p a l v e l u n t a r j o a j i l l e + e n e r g i a n t u o n n i l l e + j ä t t e e n t a l t e e n o t t o j ä r j e s t e l m ä t + k u n t o u t u s o h j e l m a a n + k i p e i m m i n + s u l k e m i s h a n k k e e n + p i d ä t y s m ä ä r ä y k s e l l e + k e s k u s t e l u p i i r i + ä ä r i t i l a n t e i s i i n + j a l k a p a l l o f a n i n + t e r v e y s s t a n d a r d e i s t a + d e m o k r a t i a p e r i a a t t e i d e n + v e s i k y s y m y k s e n + s o p e u t u m i s p r o s e s s i s t a + k i l p a i l u o i k e u t e e n + r a h o i t u s v a i k e u d e t + t u r v a t y y n y t + k e h u m i s t a + l o b b a u s k e i n o j e m m e + v a s e m m i s t o l a i s h a a v e i l i j a t + t u o t a n t o k i i n t i ö n + k a n s a n t a l o u d e l l e + r a k k a u d e n o s o i t u k s i a + l a a j e m m i s t a + s y n t y v y y s p o l i t i i k k o i h i n + s i t r u s h e d e l m i s t ä + y h t e i s t y ö h e n k i s e m p ä ä n + s y y t e t o i m i l l e + t ä y t ä n t ö ö n p a n o v a l t o j a + l i h o t u s l a i t o s t e n + n e u v o t t e l u k i e r r o k s i s s a + y d i n v o i m a l a i t o s h a n k k e i d e n + s ä h k ö h a m m a s h a r j o j e n + e t u y h t e i s ö + r i k o s r e k i s t e r i t + j ä t e a l t a i t a + o i k e u s a p u k e s k u k s i a + p a k o t t e i s t a k i n + a l f a l a k t a l b u m i i n i + k o n e e n r a k e n n u s s e k t o r i i n + o i k e u d e n m u k a i s e s s a + p i t ä m ä ä n i + h a r j o i t t a m a a + y k s i n k e r t a i s t a m i s e h d o t u s t a + p o l i i s i a s i a + v a l t i o n e l ä k k e i t ä + i m m u u n i k a t o v i r u k s e n + n ä l k ä l a k k o l a i s i s t a + j a k e l u p a l v e l u n s a + o i k e u d e n k ä y n t i s ä ä n n ö t + k o u r a a n t u n t u v a m p a a + p e r i n t e i s i m p i ä + k i e r r ä t y s t a v o i t t e i s i i n + y h t e i s l a i n s ä ä d ä n n ö l l i n e n + v i i n i n t u o t t a j i a + p a l u u m a t k a l l a + s ä h k ö n k u l u t u k s e n + t e r v e y d e n h o i t o l a k e j a + t a l o u s t i l a n t e e l l e + t i e t y n t y y p p i s e t + i l t a k a a k a o n s a + s o s i a a l i p a k e t t i + ö l j y p o r a u s l a u t t o j a + r a j a k i i s t a t + t u p a k a n t u o n n i n + d e m e n t i a p o t i l a i l l e + k o n f l i k t i n e s t o o n + m o l e k y y l i t a s o l l a + t y h j i ö t ä + b a m b u t i k k a + h a l u a i s i k a a n + r y ö m i n t ä k a i s t a l l a + n a a p u r i a l u e e t + t i e d o n a n t a j i l l e + t e h d a s t e o l l i s u u d e l l a + s o r t o h a l l i t u k s i l l e + y m p ä r i s t ö h a i t t a a + p a i k a l l i s y r i t y k s e t + t u l t i i n + h i i l i v e t y m a r k k i n o i d e n + t u k i p e r u s t e i n e n + s u u n t a u t u m i s k e s k u s t e l u a + s i i r t y m ä m e k a n i s m i + a u r i n k o s o l u i h i n + t a i s t e l u l l a a n + t u t k i n t o j e n + m u s t e k a l a s a a l i i t + k ä y t t ö v a i h e e s s a + p u o l e s s a t o i s t a + s i j o i t u s h y ö d y k k e i t ä + t u k i p r o s e s s i i n + v a a t i m a t t o m a m m a l l a + l a j i k e l i s t a l l e + y h d e n n e t y m p ä ä n + s o t i l a s o p e r a a t i o i l l e m m e + h ä t ä a p u v a r o j e n + p ä ä s t ö k a u p p a n n e + m a a g i s e n + l i s ä s ä ä n n ö k s e t + e r i s t y n e e m m ä t + l a a j e n t a v a t + k u l t t u u r i o m a i s u u s + k a n n a t t a v i m m a t + s a i r a s t a v i e n + l u o t t o a s i o i s s a + l o p p u s i l a u s + t y ö l l i s y y s t a s o a + k a n s a l a i s u l o t t u v u u s + t a k a i s k u t + v a a l i t a r k k a i l i j a v a l t u u s k u n n a s t a + t e r t i ä ä r i a m y y l i m e t y y l i e e t t e r i + k a r t o i t t a m i s p r o s e s s i s s a + p u h e l i n y h t e y d e n + e l p y m i s s u u n n i t e l m a s t a + u u d i s t u s k y k y m m e + y r i t y s m a a i l m a s t a + v ä h e n n y s s i t o u m u s t e n + t u r v a l l i s e m m a l l a + m a f i a p i i r e i h i n + o s a l l i s t u i s i v a t + s u r k e a n a + v a n g i n v a r t i j o i t a + e s i k y s y m y k s e n ä + s i n i e v ä t o n n i k a l a a n + m a a p e r ä ä n + i l m a i s t a a n + i s o p y r s t ö h a u k k a + f u n d a m e n t a l i s t i r y h m i ä + k u l t t u u r i r e i t t e j ä + h e i k k o l a a t u i s i i n + r a h o i t u s m e n o t + p a k o l a i s l e i r e j ä + m u r s k a e n e m m i s t ö + r y h m ä k a n t e e s e e n + a s e t u s p a k e t t i i n + s e u r a p e l e i h i n + v a r a s l ä h t ö + m e t r o a s e m i l l a + y m p ä r i s t ö h a n k k e e n + i l m a i l u p a l v e l u j a + l e i k k a u s k i r v e s + l a n g e t e t t a v i e n + s u k e l l u s p u k u + j u n a h y ö k k ä y k s e s t ä + c e l s i u s a s t e e s s a + t u n n e p i t o i n e n + l ä p i l e i k k a u s + j u l k i s h a l l i n n o n + a v a u s p u h e e s t a n n e + p u o l u s t u s s u u n n i t e l m a a + v e r o k a n n u s t e j ä r j e s t e l m ä + e n n u s t e t t a + s i i r t o l i n j a l l a + a s e v i e n t i k i e l l o t + r a h o i t e t t i i n + s e k a t u o m i o i s t u i n + e l ä k e o i k e u k s i s t a a n + v u o r o v e s i p a t o + r a h t i k u l j e t u k s i a + h u o m a a m a t t a a n + v a h v u i s e t + m a a t a l o u s y r i t t ä j i e n + a l l o k o i n t i r a p o r t i n + e l i n t a r v i k e k e s k u s + t i e m a k s u d i r e k t i i v i n + k a u p u n k i k e h i t t ä m i s p o l i t i i k k a a n + m a r j a t u o m i p i h l a j a + t u n t i s t a + l ö y t y y k ö + m e t a l l i r o m u l a s t i n + s u d a n i l a i s t e n + v a l v o n t a v e l v o l l i s u u k s i a a n + h a l l i n t o t a s o + k o h o t t a a + v i r h e r i s k i n + e p ä p o l i i t t i s i a + j u h l a k o k o u k s e e n + i l m a s t o n m u u t o s p a k e t i s t a + t ä r k e y s j ä r j e s t y k s e n + t o t e u t e t a a n k o + j a u h e l i h a n + t e u r a s e l ä i m e t + p ä ä t e e m a a n + y h t e i s r a h o i t u s h a n k k e i s i i n + s o l i d a a r i s u u s l i i k k e i l l e + h o p e a l e h m u s + s e u r a n t a o i k e u d e t + i l m a s t o n s u o j e l u o h j e l m a + k a s v i l ä ä k e k o m i t e a l l a + t e u r a s t u s t a v a n + b i t u m i l i u s k e + k o l m i k a n t a s o p i m u s + r a j a o l o s u h t e i s s a + n a a p u r i a l u e e s t a m m e + e l i n t a r v i k e p u l a s t a + l i s ä e l ä k e j ä r j e s t e l m ä ä n + k e r t o i s i k o + e n n a k k o v a r o i t u s j ä r j e s t e l m i ä + m a a i l m a n l a a j u i s i i n + i h m i s o i k e u s k i r j a a + s o s i a a l i j ä r j e s t e l m ä m m e + p y y n n ö l l e n i + k o n e ä ä n e s t y s t ä + y d i n e n e r g i a f o o r u m i n + p ä ä t ä n t ä v a l l a s t a m m e + t a i w a n i l a i s i l t a + y h t e i s t y ö s u h t e i t a a n + e h d o t u s l u o n n o k s i s t a + n a n o t e k n o l o g i a a n + l a b o r a t o r i o p o h j a i s t e n + h ä t ä r o k o t u k s i l l a + k e s k i t t y i s i n + p ä ä a s i a l l i s e s t i + r y h m ä j o h t a j a t + y h t e i s v a s t u u l l i s u u s t e h t ä v i e n + k o k o n a i s r a t k a i s u j e n + k u l t t u u r i k a s v a t u s t a + h u u m e i s t a + s a m a n v ä r i s t ä + a v a i n r a t k a i s u j a + v a l u u t t a u n i o n i + p s e u d o v a l t i o l l e + j o h t a m i s s o d a n k ä y n t i + m a r m o r i m i e s + p a l k k a j o u s t o i h i n + n ä y t t ä v ä t k ö + p ä t e v y y s k i r j a p e t o s t e n + v e r o t u k s e l l a + t u o t a n t o y k s i k k ö k o h t a i s e s t i + a s u m i s k u s t a n n u k s e t + m u k a u t u s t o i m i s t a + r a h o i t u s k u m p p a n i e n + l i i t t o v a l t i o m u o d o n + r i k o k s e k s i + v a p a a e h t o i s t e n + t y ö n t e k i j ä n e u v o s t o j a + l e n t o k e n t t i e n + k u o l i n s y y t ä + l u o t t o j ä r j e s t e l y i s t ä + m a a i l m a n p a l o + p a t e n t t i k y s y m y k s i i n + e t e l ä n t y t ö n k o r e n t o + t u n i s i a l a i s e t + a u t o n o m i a s t a + a v a u s i s t u n n o n + r i s t e i l y a l u s + ö l j y s i e m e n k o r v a u k s e t + v ä l i s i s t ä + p a i k a l l i s l i i k e n t e e s e e n + k e h i t y s o h j e l m i k s i + i l m o i t e t a a n + k e h i t y s t y ö h ö n s ä + t a r k a s t u s o i k e u t e m m e + p a r l a m e n t t i v a l t u u s k u n n a t + v i e n t i k o r v a u s m e n o j e n + t ä y t ä n t ö ö n p a n o k a u s i a + t i l a n n e k e s k u k s e n + t y ö v o i m a m u u t t a j i a + ö l j y r y h m i t t y m ä t + k u l u t u s l u o t t o j a + y m p ä r i s t ö k a t a s t r o f i t i l a n t e i s s a + a u t o v u o k r a a m o j a + y m p ä r i s t ö j ä r j e s t ö n + k u v i t e l l e e t + e r i t y i s t u o m i o v a l l a n + k e s k i v e r t o p a r l a m e n t a a r i k k o + r a k e n n e m u u t o s t o i m i e n + s a a p u m i s i l m o i t u s j ä r j e s t e l m ä ä + s i s a r o r g a n i s a a t i o m m e + p e r u s t a m a t t a + v i i s a a m m a k s i + k a u p p a p o l i t i i k a l t a + t e r v e y s v ä i t t e i t ä + v a u n u k u o r m a n + i l m i ö l t ä + l i i k e n n e v ä l i n e t t ä + j a k e l u p a l v e l u s t a + t ä m ä n t a p a i s e s t a + t u r v a l l i s u u s r i s k e i l l e + h e r m o v a u r i o i t a + t a r v i t t a v a s t a + r i k k a i m p i a + i n t e r v e n t i o n j ä r j e s t e l m ä + s i i r t y m ä v a i h e r a t k a i s u a + v ä i s t e l l ä + l i s ä s e l v i t y s t e n + t a s a p a i n o i s e t + p s y k r o m e t r i v a k i o + p i r a a t t i k a l a s t u s t a + i n n o v a a t i o h a n k k e e n + e r i t y i s o h j e l m a t + k o m m a n d o h y ö k k ä y k s e n + a l k e i s o p e t u s t a + j ä r k y t t ä v ä s t ä + r o k o t u s k a m p a n j o i h i n + o p i s k e l u m a h d o l l i s u u d e t + t i e d o t u s v ä l i n e v i r a s t o s t a + m i e l e n k i i n t o i s e m p i + j u h l a p ä i v ä n ä + v a s t o i n k ä y m i s i s t ä ä n + l ä h e s t y m m e + a r o m a m m u t t i + l u n n a s v a a t i m u s t e n + y l e i s e m m ä s t ä + s a a t a v u u s o i k e u t t a + e l ä i n s u o j e l u s t a n d a r d e j a + v i i n i t e o l l i s u u d e l l e + m e h i l ä i s i l l e + k i l p a i l u k r i t e e r i t + k u l t a p y r s t ö k o l i b r i + o s a s t o j a + s o s i a a l i l a u s e k k e i s t a + a l l e k i r j o i t u s t a + b u d j e t t i k o h t a o n g e l m a a n + s o i j a j a u h o a + y h t e i s k u n t a r a u h a a n + l a s k u k o n e e t + k e h i t y s a p u l u e t t e l o s t a + m u i s t e l e m a t t a + v a r o i t u s m e r k i n n ä t + r u o k a t u r v a a n s a + e h d o k k u u k s i s t a + l ä h e n t y m i s m e n e t t e l y t + h a r m a a l o i s t o l e p i n k ä i n e n + v a l v o n t a v a l i o k u n t a + v a s t a a n o t t a n u t + t y ö s u o j e l u t o i m i n n a n + v i e n t i t u o t t e i s i i n + e l i n l u o v u t u s k o r t t e j a + s y y t t ä j ä v i r a n o m a i s e t + m i e l i p i t e e n v a p a u d e n + o l e s k e l u a i k a n s a + t y ö l ä i s v a s t a i s t e n + l a a j e n t u m i s k i e r r o k s e t + t o i v o m a n + s e l v i s t ä + k o k e i l u o h j e l m i a + r e k k a d i r e k t i i v i e n + t i e t y n t y y p p i s e s t ä + y s t ä v y y s k a u p u n k i t o i m i n t a a + m o i t e k i r j e e l l ä + s ä ä n t e l y v a l m i u k s i e n + k a n s a l a i s o i k e u s l i i k k e e t + k i l p a i l u e t u i n a + l a a j e n t u m i s n e u v o t t e l u i d e n + t y ö l l i s y y s p o l i t i i k a s t a + p a l v e l u k s e e n o t t o m e n e t t e l y y n + v ä l i a i k a i s m a j o i t u k s e s s a + k r i i s e j ä + t a k a i s i n o t t o s o p i m u k s e s t a + i s l a m i l a i s e l t a + k o k o n a i s p r o s e s s i i n + k i i n t y m y s s u h d e + l u o n n e h d i n t a n a + k o r u t e t r a + t a i d e a a r t e i t a + k ä ä n n ö s o s a s t o + t e m p p u j a + k i i n n i t y s l u o t o i s t a + j ä ä h d y t y s n e s t e i t ä + y h t e i s k u n t a m a l l i a a n + k o v e n n e t a a n + t o i m i t u k s e l l i s t a + f e d e r a a t i o t a + l i s ä r a h a l l a + k a s v u s u u n n i t e l m a n + p e r u s t e h t ä v i i n s ä + e r i n o m a i s i k s i + p e r i m m ä i s e n ä + p e r u s o i k e u s o i k e u s v i r a s t o s s a + k o r v i s s a m m e + m a s s a i r t i s a n o m i s i l l a + m a r k k i n a t a l o u d e l l i s t e n + t e l e v i e s t i n t ä s a l a i s u u d e n + m a r k k i n a t o i m i j o i d e n + l e n t o m a t k o j e n + v a a t e r i p u s t i n + m a a s e u t u j ä r j e s t ö t + k e h i t y s k o n f e r e n s s i s s a + k o l m i n o p e u k s i n e n + h u u m e k a u p p a o n g e l m a a + a v u s t u s m ä ä r ä ä n + s u o j a t o i m i s t a + a f g a a n i y h t e i s k u n n a s s a + m i e t i n n ö l l e e n + t u r v a l l i s u u s k e s k u s t e l u + l a a t u t a k u u n + t o i m i n t a e h d o t u k s i s t a + k e h i t y s v a u h d i n + b u r g u n d i n v i i n i l l ä + y m p ä r i s t ö m e l u + v i t k a s t e l u j e n + e s i n e v a h i n k o i h i n + s o t a j o u k o i l l a + l o m p a k o i s s a + a i k a p o m m i t + l u o n n o n v a r o j e n s a + a r v o p a p e r i a l a n + t u b e r k u l o o s i n + b a s k i p a r l a m e n t i n + m o o t t o r i a j o n e u v o m a r k k i n o i d e n + a n n a m m e k i n + l a a j a p e r ä i n e n + ä ä n e s t y s k ä y t t ä y t y m i s e m m e + v a h i n k o j e n + a s e n n e m u u t o s t a + r a h o i t u s v a j e t t a + a u t o n o m i s i a + r a j a v a l t i o n + v ä l i t t ä j i e n + a l l e k i r j o i t u s j ä r j e s t e l m ä t + h y v i n v o i n t i a m m e + k a h v i j ä r j e s t ö s s ä + l u o n n o n v a s t a i s e s t a + m e l u n o r m e i s t a + r u s o p e r ä k e r t t u l i + r a h o i t u s p a l v e l u v i r a s t o + v ä l t t y ä k s e e n + s i e n e n k a l a s t u s m a h d o l l i s u u k s i s t a + d y n a a m i s e m m a l l e + a s t e i t t a i s e m p i + a r v o n ä k ö k u l m a a + n o i t a n i r k k o + y l i k e h i t t y n e e n + y h d e n m u k a i s t a m i s e h d o t u k s e m m e + r ä i k e i s i i n + k o k o n a i s v a l t a i s e m p i a + e r i t y i s s u o j e l u a l u e + m e t s ä p a l o v a r a n + o d o t t a m a t t o m i s t a + y h t e n ä i s y y d e s s ä + k o m p r o m i s s i t e k s t i m m e + a m m a t t i t a i t o + v e r o v e l v o l l i s i l l e + v i i s u m i v a p a u t e e n + e n e r g i a s t r a t e g i a k s i + s ä ä s t ö p ä ä t ö k s i ä + v i i v y t t e l e m ä t t ä + s a n a m u o d o t + r e a l i s t i s e m m i n + k i l p a i l u t a s o n s a + p a k k o a b o r t t e i h i n + k o h e e s i o p r o s e s s e i h i n + p u i t e a s e t u s e h d o t u k s e e n + h a j o a m i s t u o t e + v ä h i t t ä i s r a h o i t u s m a r k k i n o i l l a + m a l l i j ä r j e s t e l m ä + p i i s p a t + s o s i a a l i s e m m i n + k a m m o t t a v a m p i + p y r i n + o s a r a h o i t u s o s u u t t a + k o n s e r v a t i i v i j o h t a j a + k o u l u t u s a l a n s a + l i i t ä n n ä i s t o i m i e n + k a s v u s e l v i t y s t ä + y l i o p i s t o k o u l u t u k s e e n + m e r i p ä i v ä + v a p a u k s i e n + r a h o i t u s a u k k o i h i n + k i i n n i t y s n a s t o j a + t e r r o r i t e k o n a + m u u t t u j a n a + k ä y t t ö v e d e s s ä + s a i r a u k s i a + v a l v o n t a o h j e l m a a + r a n n i k k o v a l t i o i d e n + k u o l e m a n t u o m i o l l a + k a n s a l l i s u u d e n + n e u v o s t o k o m m u n i s m i n + s y r j ä i s i m p ä ä + a r a b i k a n s a l a i s i l t a + p e n s a s p a l o a + p i i k k i h a i l l e + e l i n t a r v i k e t u o t a n t o k a p a s i t e e t i n + l e i k k u u p u i m u r i + k i l p a i l u o n g e l m a n + v a p a u t u s l i i k k e i t ä + y l e i s e m p i i n + r e k r y t o i n t i k o k e m u k s e e n + t y ö s k e n t e l e v ä ä n + i l m a i l u s s a + m i e l i p i t e e n i l m a u k s i i n + v ä h i m m ä i s e l ä k k e e n + t o d e l l i s u u s p o h j a a + k o m p r o m i s s i p ä ä t ö s l a u s e l m a s s a m m e + t u l v a t a s a n k o j e n + k u l t t u u r i s e l l e + m a r k k i n a s ä ä n t e l y s t ä + m a r t t y y r i k a u p u n k i + o p i t t a v a a + l i i k e n n e s u u n n i t t e l u + h o i t o s o p i m u s + k r i i s i n h a l l i n t a o h j e l m a s s a + m u u t o s p o n n i s t e l u i s t a a n + j ä ä h y v ä i s p u h e e n i + p i l o t t i l i n j o j a + t i l i v e l v o l l i s u u s + r a k e n n e m e n o j e n + m a t k a p ä i v ä k i r j o j a + p e r i n a t a a l i k u o l e m a + k a m a r i k u o r o + t e r v e y d e n t i l a n + h i t a i k s i + v a p a a v a l i n t a i s e k s i + a r a b i m a a i l m a l l e + t y ö t u l o i l l a a n + i l m a s t o n m u u t o s p a k e t i s s a + m e n e t e l m ä r a p o r t i s s a + p e r u u t t a m a t t o m i i n + t i l a t u k i j ä r j e s t e l m ä + v a n h e m m a l t a + k o o r d i n o i n t i k i n + s o s i a a l i s ä ä n n ö k s i ä + o s u u s k a s s o j e n + p a l a u t t a m i s p o l i t i i k k a a + i n v e s t o i n t i k o m i t e a n + t a i s t e l u h e l i k o p t e r e i l l a + v a k u u t t i + k i r j e e n v a i h d o s t a + k o o r d i n o i t u u n + l y ö m ä t t ä + m a k s u t a p a h t u m i a + k a a k k o i s n u r k a n + t a k a i s i + s i l m ä t u l e h d u k s e s t a + k o u l u n k ä y n n i n + n ä k ö k u l m a n n e + t y ö l l i s y y s l u v u t + t ä p l ä p ö l l ö + p u h e l i n v i e s t i n t ä ä + o i k e u s k a n s l e r i n + s y n t y v y y s l u v u t + t i e d o t u s p i s t e i t ä + k u l j e t u s a i k o j e n + p e r u s t a j a m a a + u u d i s t u s s o p i m u k s e s t a + m u o d o l l i s u u t e n a + t u k i r a j o j e n + s o l u l y m f o o m a + h a r j o i t u s l e n n o t + ö l j y l i u s k e t u t k i m u k s e e n + k o u l u t e t u i l l a + e r i k o i s s a i r a a n h o i t a j i e n + o p i s k e l u p a i k k a + e r i t y i s e d u s t a j i e n + k u m m e l i t u r s k a + a l u s t u s p u h e e s s a n i + v a l t i o n k a s s a n + e l i n a j a n o d o t t e e m m e + y h t e i s p ä ä t ö k s i i n + t i i b e t i l ä i s k u l t t u u r i n + p e r u s i h m i s a r v o + k ä ä n n y t y s t e h t ä v ä ä n s ä + l i i k e t o i m i n t a m a l l i e n + l a i n s ä ä d ä n t ä m e n e t t e l y j e n + t u r v a p a i k k a m e n e t t e l y d i r e k t i i v i s t ä + j u l k i s a s i a m i e h e n + v i r r a n k o s k e n + h u o l e s t u n e i s u u t e n s a + i h m e e l l i s t ä + t a i d e g a l l e r i o i d e n + m e d i a p a l v e l u i l l e + s a l a i s e s t a + e n e r g i a i n f r a s t r u k t u u r i n + u u d e n a i k a i s i m p i e n + r a d i k a l i s o i t u n e i m m a t + p i d ä t y s l e i r i l l ä + i l m a j ä r v i + s ä h k ö v o i m a l a t + l i t i u m o k s i d i + s i j o i t t a u t u m i s o i k e u d e s t a + y h d i s t y k s i ä + y h t e i s t o i m i n n a l l i s i a + m a k s u m ä ä r ä a i k o j a + y h t e i s r a h o i t u s m ä ä r ä t + e k o s y s t e e m i a r v i o s s a + v i i v a k o o d e j a + s o s i a a l i m i n i s t e r i e n + a j a t e l k a a + v a l t i o s i h t e e r i ä + s u u r i m m i s t a + e l ä i n r u o k i n t a a n + k a n s a l l i s s o s i a l i s t i s e s s a + p u o l u e p o l i t i i k a s t a + v a s t a h a k o i s e s t i + a v u n p y y n n ö n + l y h e n n e t t i i n + h a p e n t u o t a n t o a + s i e n e n k a l a s t u s m a h d o l l i s u u d e t + t u r k k i l a i s i l l e + v e r k k o p a l v e l u a + t y ö m a r k k i n a n e u v o t t e l u j e n + l i s ä v e r o a + v e r o p o l i t i i k k o j a + e u r o b a r o m e t r i i n + n ä y t ö s v a a l i t + m a g n e e t t i v e n t t i i l i + l u o n n o n k a u n e u d e s t a + p a l v e l u t e h t ä v ä n + p o l i i s i e d u s t u s t o m m e + k a s i n o t a l o u t t a + p e r i n t e e l l e + r a h a j ä r j e s t e l m ä ä + s a i s i m m e + k a u p p a s t r a t e g i a n + v a l m i s t e l u k u n t a m e n e t e l m ä n + v i i v ä s t y k s e s t ä + l a a j e n e m i s t o i m e t + l a k k a u t t a m i s v a i h e i d e n + o m a k s u i t t e + p a l a u t t a m i s r a h a s t o l l e + v a r o i t u s k e s k u s t a + m i e s k o l l e g o i h i n + p a t e n t o i t a v i s s a + s o k e r i k i i n t i ö i s t ä + o h j e l m a k o h t i i n n e + h a v a i n n o l l i s i n + l a i n s ä ä d ä n n ö l l i s t e n + v a s t u u n k a n t o p r o s e s s i i n + k o e h a n k k e e n + v e s i s ä i l i ö i s s ä + t o s i a s i o i s s a + k e h i t y s p o l i t i i k a l l a + n e g a t i i v i s e n + n e u v o s t o t o t a l i t a r i s m i n + t i e t o t u r v a l o u k k a u k s i a + y m p ä r i s t ö o n g e l m i e n + u l k o m a a n m a k s u i s t a + t u l i r o k k o + r i i p p u m a t t o m u u s v a a t i m u k s e t + j ä l k i r a h o i t u s t a + v i i n i a l a a n + m i l l a i s i l l a + l a s k e t t a i s i i n + y h t e i s v a l u u t t a a k a a n + s o s i a a l i t u r v a e t u u k s i s t a + l a a j e n t u m i s k e s k u s t e l u i s s a + p a l k k a j o u s t o t + k a n s a n t e r v e y s r i s k i + p e r u s t u t k i m u s t a + k e s k u s t e l e m m e + h e n k i l ö s t ö k a p a s i t e e t i n + p ä ä t e l m ä l u o n n o k s i s t a + r i n n a k k a i n e l o l l e + l o b b a a j a r y h m i e n + i h m i s s a l a k u l j e t u k s i a + m a k s i m i n o p e u s r a j o i t u k s e n + p s y k o s o s i a a l i s i s t a + y l i o p i s t o k y s y m y k s i i n + m a a i l m a n p e r i n t ö s t a t u s t a + a f g a n i s t a n i l a i s n a i s t e n + l a i n s ä ä d ä n t ö r i n t a m a l l a + r a h o i t u s t a r k a s t u k s e n + k i r j a n p i d o s t a + v e r o v a p a u t u s p o l i t i i k k a a n s a + i n f o r m a a t i o t u l v a + s e u r a n t a k e s k u k s e s t a + e r i s u u n t a i s e t + t r a a g i s i m p i a + r u u h k a u t u m i s o n g e l m i a + m e l u p o l i t i i k k a + t e r r o r i s m i s t a + r a h o i t u s t a r p e i s t a + s e e p r a s i i p i s i m p p u + p i d e t y n + k e s k i t e t t y i h i n + t i e n k ä y t t ä j i i n + i t ä l a a j e n t u m i s e l l a k i n + r i i p p u v u u s s u h t e e s s a + v i i t e a r v o i l l e + n e u l a k y n s i g a l a g o t + p i l o t t i o h j e l m i e n + k ä s i t y ö l ä i s t e o l l i s u u t t a + s o s i a a l i t u r v a j ä r j e s t e l m ä ä + v a l i t s i s i m m e + v a h a p e n s a s + k u l t t u u r i p ä ä k a u p u n g i s t a + m a a h a n m u u t t o t a s a p a i n o + t o i m i p a i k a s s a + k u l j e t u s j ä r j e s t e l y + r a k k o l e v ä + m o o t t o r i t e o l l i s u u d e s s a + j a l o s t e i d e n + t i e t o y h t e i s k u n n a l l a + v a l t a v i r t a i s t e t t a v a + t a i t e i l i j o i l t a + r i k o s l a i n s ä ä d ä n t ö j e n + t e r v e y s t a r k a s t u k s i a + k i l p a i l u m a r k k i n o i t a + e d i s t ä n y t + k o h d e a l u e e s e e n + k a m p a n j a r y h m ä t + k e s t ä n y t + y h d e n t y m i s p o l i t i i k k a + s o t k e m a t t a + p ä ä s t ö o i k e u t e n s a + t u r v a l l i s u u s v a a t i m u k s i a + h a k e m u s l o m a k k e i s s a + ä l y a u t o t e k n i i k a l l a + l a i m i n l y ö n t i ä + t i l a s t o t i e t o j e n + t y ö m a r k k i n a u u d i s t u k s i l l a + h i m o i h i n + s a v a n n i k o r p p i k o t k a + t y ö a j o i s t a + k a l a s t u s k a p a s i t e e t t i a + u s k o t t a v a m p a a n + i h m i s o i k e u s s ä ä n n ö s t e n + n ä k y m i ä + t y k i s t ö m u s e o + y l i t e h o k a s + k a s v i v a l k u a i s e l l a + t u r v a l l i s u u s k o m i t e a s t a + l a i n s u o j a t o n + r y p ä l e p o m m i t + h y v i e n + y h t e i s v a s t u u t o i m i a + t o i m e e n p a n i j a t + o l i i v i p u u v i l j e l m ä n + a a v i k o i t u m i s e s t a + k i l p a i l u p e r i a a t t e e s t a + e r i t y s l a a t u + r a h o i t u s j ä r j e s t e l y m m e + y l i o p i s t o t a s o l l e + i k ä ä n t y m i s o n g e l m a + p o l t t a v i a + t a l o u s a r v i o k i e r r o k s e n + a m m a t t i k o k e m u s + v a k u u t t a a k s e n i + k a u p p a e r i m i e l i s y y k s i i n + s u b s t i t u u t i o s u u n n i t e l m a + r u o t s a l a i s e s t a + b r u t t o a r v o n + a l i r a v i t s e m u k s e e n + v i r a s t o p a k e t i n + m i e s l ä ä k ä r i t + y h t e i s ö p a t e n t t i i n + t a v a n o m a i n e n + o p t i m i s t i s e e n + n a t s i h a l l i n t o j e n + p i k k u j a l o h a u k k a + p o l t t a v i m m i s t a + v i i t t a a v a t + l e n t o t i e d o t u s a l u e i t a + t i l a r a j o i t u k s e t + s e l v e n n e t ä ä n + m a a t a l o u s y h t e i s k u n t a + k a r u s e l l i p e t o s t e n + l i e v e n n y s t o i m e t + h a r v a l u k u i s e l t a + l ä h i k e h i t y k s e s t ä + k o u l u t u s j ä r j e s t e l m ä l l e + a r v i o i s t a + i n f e k t i o t + p e r u s m e k a n i s m i t + h a r l e k i i n i p e i p p o + k o u l u t u s o p p a i d e n + m a k s u t a s o + k a i s l a k e r t t u n e n + a v a i n a s e m a n + t u o n t i t a r k a s t u k s i a + v e r i s u o n i t a u d i t + a v u n p y y n t ö ä + p o h j a n m e s i s i e n i + k u l u k o r v a u s t e n + h e n k i l ö s t ö h a l l i n n o s t a + y l e i s s l a a v i l a i n e n + p e r u s a s i o i s s a + m i e h i t y s v a l t o j e n + a r m a h d u s l a k i i n + k e t o m a r u n a + p e l i t i e t o + y l i j ä ä m ä r u o k a a + p u r k a m i s p r o s e s s i n + t a k a i s i n p e r i n t ä m e n e t t e l y j e n + r a n t a h ä m ä h ä k k i + e r i t y i s a j o n e u v o j e n + t a p e t a a n + e p ä o n n i s t u u + m a r k k i n a k r i i s i s t ä + b u d j e t t i v i r a n o m a i s e l l e + t i l a p ä i s s a t a m i a + p o l k u m y y n t i k ä y t ä n n ö i l l e + h ä m y k o l i b r i + k a l a s t u s a l a n s a + l a a j e m p i i n + n u o r u u s v u o d e t + l e n n o n v a l v o n n a n + k a k s i t a h t i m o o t t o r i t + t u r v a t t o m i a + k o d i n k o n e k a u p p a + k o h d e a v u k s i + t u o t t a m a t t a + m a t k a p u h e l i n y h t e y d e t + k a a p e l i n m i t t a + p u h e l i n t a + v a r m e m p i + o i k e u s k u l t t u u r e i s t a + m e r i r a j a s t a + p a s s i n v ä ä r e n t ä j i e n + v i l j e l y t e k n i i k o i h i n + y k s i k k ö ä + m u s l i m i e k s t r e m i s t i e n + t e r m e j ä + s ä h k ö p o s t i y h t e y k s i ä + j ä t t i t y ö t t ö m y y d e n + h i i l i d i o k s i d i t o n n i n + y l i j u m a l a + p a l e s t i i n a l a i s k o l l e g o j e m m e + a n a l y s o i d e s s a a n + r u o k a v a j e t t a + l u o t t a m u k s e l l i s u u s l a u s e k k e e s t a + v e r i s i t e i s i i n + e t e n e m ä ä n + a s i a n m u k a i s e m m a k s i + p e t o s t e n t o r j u n t a y k s i k k ö ä + e l o n m e r k i t + j ä s e n v a l t i o i t a k i n + i l m a s t o d i p l o m a t i a n + y l i p ä ä t ä ä n + u i m a r a n t o j e n + p u n a p y r s t ö k a k a d u + p e r u s s ä ä n n ö n + p ä ä s t ö r a j a + t u r v a p a i k k a j ä r j e s t ö j ä + v a l u u t t a k u r s s i p o l i t i i k k a n s a + a j o k o r t t i s i + m a a n t i e l i i k e n n e m a r k k i n o i t a + n ä l k ä i n d e k s i + m y ö t ä v a i k u t u k s e e n + e l v y t y s s t r a t e g i a + r a h o i t u s p a l v e l u t e o l l i s u u d e s s a + a d o p t i o n + y l l ä p i t o h a n k k e e t + t u l l i r a j o i t u k s i a + b r i t t i j ä s e n + p a k o t e t t a i s i i n + o h j a u s j ä r j e s t e l m i s t ä + v a l v o n t a t e h t ä v ä t + m ä ä r ä t ä ä n + t e r r o r i t e o i l l a + k o t i t y ö n t e k i j ä t + o l u e s t a + p a k o l a i s t o i m i s t o + a u t o n o m i s e l l a + t i e t o m a l l i + k o r k e a l a a t u i s i m m i s t a + v a s t a t t a v a a + t a i v u t e l l a + s u o r a m a i n o n t a p o s t i n + t u o t a n t o o n + t o i m i e l i n r a k e n t e i t a + k a t s e l l a + y d i n a s e i n + k i i s t a n a l a i s i m m a t + k y m m e n k e r t a i s t a m i s t a + r e a l i s t i s e m p i + k u o l e v a t + e l ä i n t e n s u o j e l u n o r m e j a + l i i k e m i e s r y h m ä n + p o l t t o r o v i o i l l a + s y r j ä i s i n t ä + a r k a l u o n t e i s u u d e s t a + p a k k o k a r k o t u k s e t + y h t e i s t y ö f o o r u m i a + i h m i s o i k e u s j ä r j e s t ö t + u n k a r i l a i s v ä h e m m i s t ö ä + a s i a k i r j o j e n + t u r v a l l i s u u s p a l v e l u u n + i t s e n ä i s y y s p u o l u e e s s a + e r i k o i s l a a t u i s u u s + m e r k i n t ä l a k i a + l i i k e n n e s e k t o r i a + e n e r g i a t e k n o l o g i a s u u n n i t e l m a s s a + i n v e s t o i n t i t y ö r y h m ä + h u u m e s t r a t e g i a m i e t i n t ö ä + j a k a m i s m e n e t e l m ä n + k o n k r e e t t i s i m p a a n + j ä r j e s t ä y t y m i s v a p a u d e s t a + p u n a p e i p p o + t u r v a l l i s u u s a l a l l e + u u m o i l t i i n + k o r k e a l a a t u i s u u d e s t a + s i v i i l i o i k e u t e e n + s u l k e m i s i s t a + t u t k i m u s m a t k o j a + p e t o s t e n t o r j u n t a v i r a s t o l l e + v i h o l l i s t a s i + r a u t a t i e k u l j e t u s t a + p ä ä p u o l u e e n + b u d j e t t i h i s t o r i a s s a + s a k s a l a i s m i e h i t t ä j ä n + k e h i t y s y h t e i s t y ö j ä r j e s t ö t + m u s l i m i j o h t a j i e n + r o h k a i s u a + h i e n o s y i s e m m ä t + y h t e i s k a n t e e t + n u o r i s o s o p i m u s t a + f i n a n s s i l a i s s a + e n s i a p u p a k k a u k s e n + y d i n j ä t e v u o r i a + a v a t t a e s s a + p u h d a s r o t u i s e t + p r o m i l l e r a j a t + t u r v e s u o t + t e n n i s p a l l o + p u o l i s u l j e t u t + t y ö t t ö m y y s t i l a n n e + t ä y t ä n t ö ö n p a n e m a t t a + m a a n t i e t e e l l i s i ä + l i s ä t y ö s t ä + j o h d o n m u k a i s u u t e e n + r i i t o j a + v e r k k o p o r t a a l i n + y m p ä r i s t ö s u o j e l u s s a + k a l l e l l a a n + k i e l t o p o l i t i i k a s t a + p o i k k e u s m ä ä r ä a i k a a + u u d i s t u s k y s y m y s t e n + m i k r o v e s i v o i m a l a + m u u t t o l i n t u i h i n + p u h u j a s t a + a l u k s i a a n + k u d o s d i r e k t i i v i s t ä + s ä ä n n ö l l i s e m p i + k i r j o i t u s t a v a s t a + t ä h ä n a s t i s i a + p e r u s t o t u u d e t + e r i k o i s m a i n i n t a + l e n t o s u u n n i t e l m a n + t u l l i e t u j a + m u s l i m i m a i s t a + k e l t a m ä n t y + e l ä k e r a h a s t o d i r e k t i i v i n + e r i t y i s e d u s t a j a k s i + k e k s i n t ö m e s s u i l l a + k a n s a l l i s t u n n o s t a + m a r k k i n a v a l v o n t a j ä r j e s t e l m ä s t ä + m a t a l a m p i e n + m a k s u p a l v e l u n + t e r v e y s v a k u u t u s t e n + v e r o a l o i t t e i d e n + v a l i o k u n t a t y ö s k e n t e l y s t ä + l i s ä t y ö n + k e s k e n ä ä n + s o i j a k a k k u j a + t a b u i s t a + t a l o u s a r v i o v a r a u k s i a + a l o i t e o i k e u t e e n + p ä ä t ö s p e r u s t a + t u l e v a i s u u t e n s a + k e r t o i s i t t e + v a s t a a n o t t o p o l i t i i k k a + e l ä k e r a h a s t o t i e d o n a n t o a + n o u d a t t a m a a n + s a i r a u s v a k u u t u k s i a + k i r j a k a s a n + t y ö l l i s t ä m i s t o i m i e n + l i s ä t e s t i e n + t a p a h t u n e e s e e n + a r v o k k u u t t a + e n e r g i a v a l i n t o j a m m e + p y r a m i d i s u u n n i t e l m i s t a + y h t e i s t y ö h a l u t t o m u u d e s t a + v a l u u t t a j ä r j e s t e l m ä + l a a j e n t u m i s s t r a t e g i a m m e + ä ä r i l i b e r a l i s t i s i s t a + p u h e e n j o h t a j u u k s i i n + k e s k u s p a n k k i k i n + b u d j e t t i k u r i t o i m i a + k ä y t ö s t ä p o i s t o a + v ä h i m m ä i s o m i s t u s k y n n y s t ä + y m p ä r i s t ö n ä k ö k o h d a t + m y ö h ä i s i s s ä + m ä n t y a n k e r o i n e n + v a s t u u v a k u u t u k s e s s a + p a l a u t u s t u k e a + s o k e r i n t u o t t a j a v a l t i o i h i n + t a h t o a + a s e h u o n e + t a r k a s t u s o h j e l m i e n + t y ö h y p o t e e s e j a + m y y n t i k a n a v i a + e r i t y i s t a r k a s t u k s i a + k a u n e u s k i l p a i l u + l e m m i k k i e l ä i n p a s s i h a n k e + r u m p u m u i s t i + l u o n t o t y p p i d i r e k t i i v i n + l i s ä k i i n t i ö + t y ö l l i s y y s s t r a t e g i o i h i n + s i t o v a m p a a n + t a l o u s r a k e n t e i d e n s a + k ä y t ä n n ö n l ä h e i s e m p i ä + h e l p o t t a i s i k i n + k o r v a u s e h t o j a + t i e l i i k e n n e o n n e t t o m u u k s i a + h e l p o t u k s i a + h u u m e o n g e l m a n + v i i t e k e h y k s i ä + m o n i l l a k a a n + r y p ä l e p o m m e i s t a + k a u k a l o p i k a l u i s t e l u + y m p ä r i s t ö s ä ä n n ö t + m a l l i p y s ä k ö i n t i l u p a a n s a + k o k o n a i s r e m o n t t i a + m i e l e n t e r v e y s t y ö n t e k i j ö i d e n + i t s e m u r h a i s k u i s t a + v o i m a t e k i j ä t + h a n s k a s s a + l a k i t e r m e i n + k a u p p a y h d i s t y s t e n + l i k v i d i t e e t t i o n g e l m i s s a + i l m a h y ö k k ä y k s e n + f o s f o r i p e n t a k l o r i d i n + r i s t i t u l e s s a + k i i r e i s i n + k e i n o r u s k e t u s a l a n + m a a p e r ä t y y p p i e n + o i k e u s j u t u s s a + s u h t e e l l i s u u s p e r i a a t t e e l l a + v a u r a i m p i i n + a m m a t t i y h d i s t y s j o h t a j a n a + p e t o s r i s k i l t ä + p u o l u e e t t o m a m p i a + l a s k u v i r h e e s t ä + p e r u s p a l k k i o + l a i n s ä ä d ä n t ö p a k e t i l l e + p o r t u g a l i l a i s y h t e i s ö + k u l u t t a e n + l i h a v u o r i a + p r o s e n t t i y k s i k k ö + s u o s t u m u k s e n s a + y k s i p u o l i s i k s i + a j a n k o h t a i s k e s k u s t e l u n + v a a l i a l u e e l l a + l i s ä m a k s u a + k o n k r e t i a n + a n a l y s o i m i n e n + e t u n ä k ö k o h t a + m a r k k i n a n ä k ö k u l m a + r a d i o l ä h e t y s t o i m i n n a n + j ä s e n y y s m a h d o l l i s u u k s i a + a n s i o t ö i s s ä + p a t e n t t i s u o j a n s a + e n e r g i a n t u h l a u k s e s t a + k a r v a t u p p i + k u h m u j ä k ä l ä + a s s o s i a a t i o s o p i m u k s e k s i + y m p ä r i s t ö y s t ä v ä l l i s e s t ä + r a h o i t u s t a r k a s t u s v i r a n o m a i s e n + t u l l i p o l i i t t i s e n + f i n a n s s i p o l i i t t i s i l l a + k e h i t y s a l u e e n + s a l a k u u n t e l u j ä r j e s t e l m ä s t ä + k ö y h i m p i ä + g o l f k e r h o i l l e + a v u s t u s p a k e t i s t a + h a l u t t o m u u t t a + t u r v a l l i s e m m i l l e + s i i r t o l a i s v i r r a t + s y d ä n s y ö p ä + k a r h u j ä r v i + s a t a m a a n + r i n t a s y ö p ä t u t k i m u s + s ä ä n t e l y m a l l i n + m u u t t u j a a n + t i e t o j e n v a i h t o o n + a i k a t y ö l l ä + s a a r i s t o l a i s i l l a + s i i p i k a r j a t u o t a n n o s s a + k ä r s i v ä t + s u o r a h a n k i n t a s o v e l l u t u k s i a + s u u r p u j o t t e l u + e l o k u v a t e a t t e r i i n + v i r t s a n e r i t y s e l i m i s t ö + r a u h a n t y ö t ä ä n + i s ä n m a a t a + p l u t o n i u m i a + p a i k a l l i s k o k o u s + m a r k k i n a b y r o k r a t i a n + t a l o u s a r v i o m a k s u j a + m a a i l m a n m a r k k i n a t i l a n t e e l l e + l i t r a l t a + p ö l y n i m u r i t + e n e r g i a k ä y t ä v ä n ä + k ä y n t i k o r t t i + m a a i l m a n j o h t a v a a + i t s e n ä i s e l l ä + m i e h i t y s j o u k o t + v a k a v i m m i s t a + a l u e k y s y m y s + k o k o n a i s v a l v o n n a n + e n s i s i j a i s e s s a + k u n n i o i t u s t a m m e + j ä s e n y y s v e l v o i t t e i s i i n + a l u e e l l i s t a m i s t a + l i i k e n n e v ä l i n e i s t ä m m e + t u r v a l l i s u u s s t r a t e g i a l l e + l i s ä v a r o i l l a + k o p i o n s a + s a a n t i m e n e t t e l y j e n + l ä ä k e m a r k k i n o i h i n + l a a t u p o l i t i i k a s t a + t u k i k r i t e e r e i t ä + y m p ä r i s t ö e t u n s a + p e r u s t a a n + v a l t i o n t u k i p u i t t e i t a + h ä i r i ö a l t t i u s + r o h k a i s e v a s t a + v i e n t i s ä ä d ö k s i s t ä + j o u s t a v a m m a l t a + i s t u n t o k a u s i + r y h m ä k a n n e o i k e u d e n + p o l k u m y y n t i a s e t u k s e n + m a d a l t a a k s e m m e + v e l k a r a k e n t e e n + b a r b i t u u r i h a p p o + m a h d o l l i s e s t a + a j o k o r t t i a s i o i s s a + k e h i t t ä m i s m a h d o l l i s u u k s i e n + s e l v i t y s a s t e + h i i l i d i o k s i d i v u o t o a + t u t k i m u s k o m i t e a + p u i t e p ä ä t ö s + n y k y ä ä n k i n + k u l u t t a j a o n g e l m i e n + o i k e u s j u t u i s t a + t e o k s i i n + m i e l e n k i i n t o i s e e n + v i i t t o m a k i e l i s t ä + p a r l a m e n t t i r a k e n n u s + e d u s t u k s e e n + j u o v a d e l f i i n i + k a u p u n k i a l u e e l l a + v a h i n g o i t t a a + s u p e r b i k e + e r i k o i s h u i p p u k o k o u k s e s s a + p ä ä t ö k s e n t e k o t a s o i h i n + v a s t a v i e r a i l u + v e r i p e i p p i + h i l j a i s u u t t a + t u o t t o i s a n + t y ö m a r k k i n a j o u s t o j a + h a r k i t s i s i m m e + e r o t t a m a a n + a l i r a h o i t e t t u j a + o s a a m i s k e s k u k s e t + s i i r t o v e r k o n h a l t i j a t + p u h e e s s a + s ä h k ö p y ö r ä + n e u v o t e l l u n + k o r v a u k s i a + e r ä m a i d e n + i h m i s k a s v o j a + k a k s o i s e n e m m i s t ö p ä ä t ö k s e t + y m p ä r i s t ö e d u i s t a + r a k e n n e u u d i s t u s t o i m i i n + r o m a n i a l a i s y h t e i s ö n + t u l o s t a u l u + p e n k k i u r h e i l u + p a h i m m i l l e + t e k s t i i l i t e o l l i s u u t e m m e + h o i t o p r o s e s s i n + e r i t y i s t i e s t ä + p ä i v ä n s e l v ä n ä + k ä y n n i s t ä m i s t ä + p e r u s t a l t a a n + r a j a p o l i t i i k a s t a + p e r h e s u u n n i t t e l u p o l i t i i k k a a + v a k a u m u s t a m m e + s u o j e l u a l u e i l l a + t y ö v o i m a o s u u t e e n + n ä k ö k u l m a o t o s + k o r r u p t i o e p ä i l y k s e t + k u v a i l e m a s s a n i + l i h a t e h t a a l l a + e s p a n j a l a i s e s t a + y h t e i s r i n t a m a s s a + v e r o p e t o k s i l l a + l e h t e ä + k ä s i t t e l e v ä + f u u s i o i t u m i s t a + a l k u p e r ä v a l t i o t + l u o t t o k o r t t i r i k o l l i s u u t e e n + v a r a u t u n e e t + t e r v e y s k y s y m y k s i ä + k u l t t u u r i k a s v a t u k s e n + t y y p p i s e e n + v a a l i k a u t e n a + k u l t a s i i p i p e i p p o + l ä h e n t y m i s m e n e t t e l y + l e n t o k e n t i s t ä + k o h e e s i o s t r a t e g i a t + p a k k o l i s e n s o i n n i s t a + r a h a p o l i t i i k o i s t a + i l m a s ä h k ö j o h d o i s t a + m a r k k i n a s e k t o r e i t a + t i e t o l i i k e n n e v e r k k o j a + l o b b a u s j ä r j e s t ö j e n + m ä ä r ä p ä i v ä n ä + m a l l a s v i s k i n + t e o l l i s u u s k a a s u i l l e + k e l t a o l k i y ö k k ö n e n + l i s ä k y s y m y k s e s s ä n n e + m u s t a v a l k o i s i l l a + p a k o t e t t a + s i s ä m a r k k i n a m ä ä r ä y s t ä + l i p u n k a n t a j i a + p u o l u e r y h m ä t + s o r k k a t a u t i e p i d e m i a s t a + s o t a r i k o s t u o m i o i s t u i m e e n + r a k e n n u s a l a a n + t o i s i l l a + v a h i n k o k y n n y k s e n + n e w y o r k i l a i s e s s a + h ä l y t t ä v ä l l ä + t i e t o y h t e i s k u n n a s s a + v a l t a m o n o p o l i n s a + p o s t i m a r k k i n o i s t a + e t u u s j ä r j e s t e l m ä m m e + s e k a v a l i o k u n t i e n + k a r j a n h o i t o k ä y t ä n t ö j e n + ä ä n e s t y s k u l t t u u r i t + s i j o i t t a m i s o h j e l m i e n + t o i m i t u s v e r k k o j e n + t u h o t a + k r i i s i n h a l l i n t a a n + l a s t i n p u r k a m i s m e n e t t e l y j e n + t e r ä s p i i r r o s + t u t k i n u t + n ä e n n ä i s m u i s t i + l e i k k i p a i k k o j e n + k a l a n r e h u + r y h m ä t y ö k y k y + t i e t o s u o j a k a u d e n + k a u p p a k e t j u i s t a + ä ä n e s t y s o i k e u d e t + p a l e s t i i n a l a i s k o l l e g o j a m m e + a j o n e u v o t e o l l i s u u d e l t a k i n + u u d e l l e e n r a k e n n u s o h j e l m a t + h o i v a t e h t ä v ä s t ä + p o i k k e u k s i n a + k a u p p a s a a r r o s t a + s o r t o k o n e i s t o s t a + p r e s i d e n t t i v a a l e j a + k e i t t i ö v ä l i n e i s i i n + t y ö t u n t i i n + k y s y m y k s i i n + p u o l u s t u s v a l m i u d e t + s i j o i t u s p a k e t t i a + p o r n o g r a f i s t a + s o t a v a n g e i k s i + p e r u s v e l v o i t e + t u t k i m u s a l o i t t e e l l e + j ä ä k i e k k o l e i j o n i s t a + v e s i h u o l t o i n f r a s t r u k t u u r i a + v a l t a o i k e u k s i a a n + r o h k a i s e v i n t a + e l i n t a r v i k e m a r k k i n o i l l a m m e + e l i n s i i r t o m a t k a i l u + s u u n n i t e l m a t a l o u t e e n + o m a t o i m i s u u t t a a n + m i e s s i v u o s a + l i k v i d i t e e t t i p e r u s t e i n e n + o l e t t a m u k s e s t a + t y ö l l ä + p a t e n t t i e n + t e h o m a a t a l o u t t a + i m e t t ä v i e n + p a l k k a k u s t a n n u k s i n + r a h o i t u s s o p i m u k s e n + v e r k o n k u t o j i l l e + e n e m m i s t ö l t ä + k a n n a t t a v u u s r a j a n + s u o d a t t u u + n a u d a n k a s v a t t a j i a + v i r o s t a + l a i n a m a r k k i n o i l l a + k u l j e t u s k o n t t i s a t a m a + l a t i n a n k i e l i s e l l ä + t u l v a n t o r j u n t a a n + l u o n n o l l i s t e n + k i e l o k u k k o + s a i r a a l o i t a + k u r d i p u o l u e i l l e + p o l i i s i k o u l u t u s + h y ö d y l l i s e k s i + u s k a l t a u t u k a a + p o r v a r i p u o l u e + t e r r o r i s t i o p e r a a t i o n + j ä l k e l ä i s i s t ä + a s u n t o l a i n a t i e t o j a + r e a g o i t t e + r a h a m a r k k i n a p o l i t i i k a s s a + a l k u h u o m a u t u k s i s s a a n + p o t e n t i a a l i k u o p p a + t y ö j ä r j e s t y s t e n + h e n k i l ö k u n t a n i + v e s i k i e r r o n + s i i r t y m i s k u s t a n n u k s i a + m i k r o y h t e i s t u o t a n t o l a i t o k s i l l e + m e r i s t r a t e g i a d i r e k t i i v i + k o h d a t t a e s s a + e r i t y i s s y y t t ä j ä n + t y ö v o i m i e n + m a a t a l o u s t o i m i n n a s t a + v i i n i n v i l j e l y p o l i t i i k a n + p ä ä s t ö k a u p p a j ä r j e s t e l m ä s t ä m m e + h u r r i k a a n i k e s k u s + m a a i l m a n l a a j u i s i l l e + h ä t ä v a l o t + t u r v a k s i + t e l e v e r k k o j e n + n a n o f y s i i k a n + v a l u u t t a r a h a s t o n + k ä y t e t t ä ä n + s t a t u k s e n + v a k a v a m m a k s i + e r i t y i s k o h t e l u u n + e p i t e e l i s o l u j e n + k u t u k ä y t t ä y t y m i n e n + r i s t i h ä m ä h ä k i t + l a a t i m a + k u r k k u m i k r o f o n i + o i k e u s p e r u s t o i n e e n + e l ä i n l ä ä k k e e t + s a n i t + t a v o i t t e i s s a a n + v a p a a k a u p p a n e u v o t t e l u i h i n + t a r k i n t a + s o v i n t o n e u v o t t e l u i s s a + e l i n t a r v i k e p a k k a u k s i s s a + s i v u t u o t t e i s i i n + l i i k e n n e m u o d o s s a + j ä r j e s t e l m ä r i s k e i l t ä + p e r u s t a j a j ä s e n e n + v a s t a a n o t t o j ä r j e s t e l m i ä + m o r a a l i s a a r n o j a + k a l a s t u s v e n e i d e n + l o p e t u s s t r a t e g i o i d e n + s o s i a l i d e m o k r a a t t i s t e n + ö l j y t e r m i n a a l i + j a l k a p a l l o k a n n a t t a j i a + e p ä m ä ä r ä i s e n ä + l i h a v u u s t a p a u k s i s t a + p a r a n n u t t a v a + m y r k k y r i s a k a s + s u o m u o t s a k u t o j a + t u o n t i k i i n t i ö t + t a i a n o m a i s u u t t a + i t s e n ä i s t y ä + a r m a h d u s l a i n s ä ä d ä n t ö ä + n y k y a r v i o i d e n + p o h j o i s i m m i s t a + k a k s i n k e r t a i s t e t t u a + m a r k k i n a m ä ä r i t e l m i ä + o m a i s u u t e m m e + l a i n a v a a t i m u k s e e n + s i s ä l l ö n t u o t t a j i e n + v u o r i r a i t a k a i j a + l u o k i t u s p r o s e s s i n + m e d i a v a l t a a + b u r m a l a i s i a + l a i k k u p y r s t ö k o l i b r i + k i u s a u k s e n + t y ö m a r k k i n a t i l a n n e + d i o k s i i n i t a s o + l u k i e s s a m m e + s e r k k u p o i k a + v i d e o p e l i k l o o n i + v a k u u t u s e h t o j a + k u p a r i j a k a m a r i + k o h t u u l l i s e l l e + r a h o i t u s t r a n s a k t i o i t a + a s u n e i l l e + e p ä v i r a l l i s i s s a + y h t e i s ö t a v a r o i h i n + n ä k e v i l l e + v e r t a u s k u v a l l i s e s t i + a p u l a i s k a u p u n g i n j o h t a j a + v a r a s t o i s s a + h a l l i n t o e l i n t e n + u u d i s t u s s o p i m u k s e s s a + a l i k e h i t t y n e i s y y d e n + k a n s a l a i s y h t e i s k u n t a j ä r j e s t ö i l l e + k i l p a i l u o l o s u h t e i t a + p a i t a h i h a s i l l a n n e + h y v ä k s y n t ä m e n e t t e l y ä + t o t e u t u s s u u n n i t e l m a l l a + a i k u i s k o u l u t u s t a + f l u o r i p i i h a p p o + t u r v a l l i s u u s v e r k k o n a + r a h o i t u s k e i n o t t e l i j o i l t a + k ä s i t y ö y r i t y s t e n + u u t i s a n k k u r e i t a + t u h o o j a g e e n i s t ä + r y h m ä ä n i + t i e t o t a l o u t e e n + a a v i k k o t a s k u r o t t a + ö l j y n h i n n a s t a + h a n k e t a s o n + m a a h a n t u l o v i i s u m i e n + j a l o s t u s y h d i s t y k s e n + h a n k a l o i t t a i s i + r y h m ä p o i k k e u k s e t + p a l o p a i k a l l a + h ä t ä r a t k a i s u j e n + t e k s t i k o k o n a i s u u t e e n + t i e d o n v a i h t o j ä r j e s t e l m ä t + m a a k a u p o i s s a + i t s e n ä i s y y t t ä + n e u v o t t e l u t i e + h u i p p u s e u r o i k s i + r u o h o r a v i n t o a + e p ä j o h d o n m u k a i s e m m a n + t u o t a n t o v a i h e e s e e n + k u n i n g a s l o h i + r a h a n h i m o n + u s k o n m i e s t ä + v a p a a k a u p p a v y ö h y k k e e n + m u r h a t a a n k o + s e e p r a p r e u s s i n a h v e n + r o o l i j a k o a + h e n k i l ö s k a n n e r i l l a + e s i t y s l i s t a s t a + m a l l i n m u u t o s + s y v e n t ä m i n e n + t o r j u t t i i n + e l ä i n t e n s u o j e l u s t a + k e r t a s u m m a + v a l u u t t a k a u p p a a + v a a t i m a t t o m a m m a t + e k s y n e i d e n + p a l a t t u a n i + p ä ä a v u s t a j a n i + s e u l o n t a p a l v e l u a + k a t k o k ä v e l y + l a i n s ä ä d ä n t ö e h d o t u k s i i m m e + p e r u s k i r j a a n + v i i s u m i v a p a u t u k s e s t a + a b o r t t i p a l v e l u j e n + p u u v i l l a n t u o t a n t o a l a n + y h t e i s m a l l i + k a u p p a k u m p p a n e i d e n s a + v a s t u u v a p a u s p r o s e s s i + f u n d a m e n t a l i s m i t e r r o r i s m i a + l a i n s ä ä d ä n t ö p r o s e s s i a m m e + a d o p t i o v i r a s t o + k o m p r o m i s s i e h d o k a s + k o u l u t u s p r o s e s s i a + t a p p a a k s e e n + s u u r t e h o a k u t + t o d i s t u s a i n e i s t o l l e + p a i k a l l i s y h t e i s ö s s ä + h y v ä k s y t t ä v i l t ä + e t a n o l i o h j e l m a + k e m i k a a l i p o l i t i i k k a m m e + p i l a p i i r r o k s e t + l ä n s i m a a t h a n + e r i t y i s v a a r o j a + i n s u l i i n i p u m p p u + p u n a v i h e l t ä j ä s o r s a + n a a p u r i t a s o i s e s t i + p a l v e l l a + t a l o u s y k s i k ö i t ä + y h d e n t y m i s a l o i l l a + e n e r g i a p a k e t t i n s a + p ä i v ä p a l k k a n s a + t e h o k k u u s p e r i a a t t e e l l e + t u o t t a j a y r i t y k s i ä + a v u s t u k s i n a + k a s v u p o h j a n + r a k e n n u s p o l i t i i k a s t a + m e r i s u o l a + j ä r j e s t e l m ä a r k k i t e h t u u r i n + e p ä ä m i s t ä + e p ä s u h t a i s e t + i k ä i h m i s e t + s o p i m u s n e u v o t t e l u i h i n + p a n o s t a a + v a s t u s t a v a m m e + k o m m u n i s t i l i i t o s t a + y d i n p o m m i n + h e n k i l ö k o h t a i s i l l e + m i n k ä l a i s e n + v a l v o n t a t e h t ä v ä n + e u r o k e h y k s e e n + s u u r r i k o l l i s e l l e + l e n t o l i i k e n n e t o i m i n t a + a l u e k i i s t a t + s o p i a + k a i v a u d u t a + t y ö s u h t e i s i i n + v a k a u d e n + k e h i t y s v i r a s t o k s i + h o r j u n t a a + t a v o i t e a r v o t + v e r o p o h j a a + p a p e r i t u o t t e i d e n + j o u s t o i n s t r u m e n t t i + t i e l i i k e n n e i n f r a s t r u k t u u r i a + y k s i k k ö o p e r a a t i o + s u u n n i t t e l u t i i m i n + p u r j e h t i v a a + k a a l i y ö k k ö n e n + t i e d u s t e l u a l a l l a + e l v y t t ä m i s e e n + l a a t i j a t + l e n t o y h t e y k s i l l e + v u o r i r e v o n p a p u + k o e t u s t a + n o r m i h i e r a r k i a + v a l v o n t a v ä l i n e t t ä + t i e t o t e k n i i k k a + t i e t o s u o j a l a k e j a + y r i t y s v e r o j ä r j e s t e l m ä + s o r m e n j ä l k i t i e t o k a n n a n + p ä ä j o h t a j i l l e + s u p e r k o m i s s a a r e j a + v a k u u t u s y h t i ö l l e + r y t m i p e l i + e r i t y i s i s t u n n o l l e + o l e e l l i s i m p i i n + a l i j ä ä m ä v a a t i m u s t a + k e m i k a a l i d i r e k t i i v i + a r o k a k a d u + e d i s t y n e i m p i n ä + e n e r g i a v e r k o s t o i l l a + l u o t t a m u s l a u s e e n + p a i n o s t i m m e k i n + t u r v a l l i s u u s j ä r j e s t e l m i e n + i h m i s o i k e u s k r i i s i + v u o s i s a d a l l a k i n + k i e l e n o p p i m i s m e t o d i + v a r m i s t e t t u + k a u p p a t a l o u d e l l e + a l u e s y y t t ä j ä + e t u s u o j a j ä r j e s t e l m i ä + k u l t t u u r i s o p i m u k s e l l a + r a h o i t u s m e n e t t e l y j ä + t e l e v i e s t i n t ä i n f r a s t r u k t u u r i + j ä s e n y y s p y r k i m y k s i ä + n e u v o t t e l u v o i m a m m e + j ä s e n y y s e h d o t + t u r v a l l i s u u s a l a a + v a l t i o n y r i t y k s e t + h y ö t y a n a l y y s e i s t ä + s e k a n e l i n p e l i n + y h t e y s l i s t a l l a + u s k o n n o n v a p a u s l a u s e k e t t a + u u d i s t u s p o l i t i i k a s t a + i n n o v a a t i o h a n k k e i d e n + r a j a v a r t i o v i r a s t o + k a s v u p o l i t i i k k a a + s a l l i e s s a a n + t a l o u d e s s a + e l ä i n l u o k k i e n + e n e r g i a k r i i s e j ä + t a i t a v i m p i e n + l u u j a u h o a + v a s t a a n o t t a j a m a i d e n + k e s k i t t ä m i s p y r k i m y k s i ä + v i e s t i n t ä t e k n i i k k a t a i t o j e n + l u o m a a m m e + m a k s u j ä r j e s t e l m ä l l e + k o m i t o l o g i a m e n e t t e l y i s s ä + l i i k u t t a v i n + j ä r j e s t e l y t o i m i k u n t a + t y ö s k e n t e l y k ä y t ä n n ö i s t ä + i m a g o s y i s t ä + t a k s i p a l v e l u t + h a v a i t s e m i s j ä r j e s t e l m ä + j ä r j e s t e l m ä ä + t a k u u a i k a + t a v a r a l i i k e n n e p a l v e l u j a + k o o k o s p a l m u j a + l u o t t o t a p p i o t + t a a k a n + k a t a s t r o f i a l u e + v o i t t o m a r g i n a a l i n s a + m e l u k a r t o i t u k s e s s a + p a l o p o m m i + y l e i s e m m ä k s i + e n e r g i a s o p i m u s t a + d i p l o m a a t t i k u n t a + h i u k k a s i k s i + t y ö m u i s t i + r i k o s r e k i s t e r i t i e d o i s t a + t u r s k a n p y y n t i + j ä s e n v a l t i o i l l e + t e r v e j ä r k i s e t + m a f i a j ä r j e s t ö ä + p a l a u t t a m i s k i e l t o a + n i m i l i s t a + e r i k o i s s ä ä t e l y s t ä + i t ä i s e s t ä + o p e t u k s e n a + y h t e i s l e n t o a + t a l o u s r o m a h d u k s e e n + t u o n t i l a s k u j a + p i t k ä j ä n n i t t e i s y y t e e n + m a a s e u t u y h t e i s ö n e u v o s t o + p a r l a m e n t t i k e s k u s t e l u j a + u u s e l i n t a r v i k k e i s i i n + k e s k u s l ä m p ö v o i m a l o i d e n + p ä ä t ö k s e n t e o s t a + p o l i i s i o p p i l a i t o k s i s s a + j ä l l e e n r a k e n n u s o h j e l m a n + k u l j e t u s j ä r j e s t e l m ä n + m y ö n t ä m i s a i k a a + e h d o t t i v a t + t u n n u s t a k a a + p u h u n e e t + v a r o i t u s n a u h a + t y ö t e r v e y s s t r a t e g i a s s a + o s a a t t e k o + t y ö k y v y t t ö m y y s t u k i + v ä h e n n y s l a s k u p e l i + l a k i a l o i t t e i s i i n + k e s k u s t e l u a i h e i d e n + r u b i i n i k ä ä p i ö a h v e n + y m p ä r i s t ö m e r k k i j ä r j e s t e l m i l l e + h i l l i t s e m i s t o i m e n p i t e i t ä + v a l t i o n a v u s t u k s i i n + s ä ä n t e l y j ä r j e s t e l m ä t + k o r o n n o s t o s t a + p ä ä s e i k k a + t i m a n t t i k o i r a t + a l i e d u s t u s t a + p ä ä a s i a n a + a s i a k i r j a n s a + i h m i s a r v o k y s y m y s + j a k o l i n j a a + p e r s i a l a i s e t + y h d e n m u k a i s u u s t a s o + l i i t t y v ä s t ä + s y ö m i s h ä i r i ö i t ä + l a i n s ä ä d ä n t ö k e h y k s i ä + j ä s e n m a a t k i n + t a p a h t u v a + m e r k i n t ä k ä y t ä n n ö n + s y n k k ä ä + j ä t t e e n k ä s i t t e l y l a i t o s t e n + t a i k a i s k u s t a + l e h t i l a i t o k s i a + y r i t y s k o m i t e a n + t u h o a m a a n + s o t a h a r j o i t u s s u u n n i t e l m a n s a + a l o i t t e i s e s s a + t a k a i s i n o t t o s o p i m u k s i s t a + o p i s k e l i j a d e m o k r a t i a l i i k k e e s t ä + s e i t s e n k o h t a i s e n + y h d e n m u k a i s t a m i s e h d o t u s + m a i n o s n e u v o s t o j a + k a k s o i s h a a s t e e n + s e u r a n t a a + h e n k i l ö l i i k e n n e p a l v e l u i l l e + t u m m a n h a r m a i s t a + k u l j e t u s e l i n k e i n o l l e + ö l j y t o i m i n n a n + h a i t u o t t e i d e n + k a s v u n e d i s t ä j i e n + m i k k e l i n + v i e t e l l ä + r i i t t ä v i k s i + l o m a j ä r j e s t e l y j e n + m a r k k i n a l i b e r a a l i m p i + i n n o v a a t i o p o n n i s t e l u j a + e s i t y k s e n i + v i r a s s a a n + k a s v u s u u n n i t e l m a s s a + t u k i p a k e t t i e n + p a l k k a k u r i s t a + k i e r r ä t y s l a i t o s t a + v a s t i n e o i k e u t t a + l i k i n ä k ö i s y y d e s t ä m m e + l o h i t e o l l i s u u s + p a r l a m e n t t i r a k e n n u k s e m m e + e t s i t t ä e s s ä + k a a s u v a r a s t o t + y h d e k s ä n j ä s e n i s e n + p ä ä t t ä v ä i s e m p ä ä + v a k i o t i e t o j a + r a d i o i t a + t u t k i m u k s i a + s a i r a u k s i a m m e + l a u s u n t o e h d o t u k s e s t a + l i s ä v a r u s t e + a s e t t e l u j ä r j e s t e l m ä ä + k y l m ä k e t j u n + v a s e m m i s t o l a i s e t + v e s i h a l l i n t o a + t e r v e y s o n g e l m a n + b u d j e t t i p o l i t i i k o i s t a + e r i t y i s v a a t i m u k s i i n + v i h e r f a s a a n i + a h d a s m i e l i s e n ä + k ä y t ä n n ö l l e + m a a i l m a n k a u p a n + r a n s k a l a i s n u o r t e n + e d u n t a v o i t t e l u a + k a s v i v a l k u a i s t u o t a n t o + r u b i i n i k o l i b r i + p a i n o s t a v a t + r i k o s t u o m i o i s t u i m i l l a + m u l t i m e d i a t y ö r y h m ä + s ä i d e n + t a k a p i h o i l l a a n + b y r o k r a t i a v ä l i n e e n + p a n s s a r i a u t o a + k o m m u n i s t i h a l l i n n o i s s a + m i e t i n t ö n s ä + k r i i t t i s e s t i k i n + v a l l a n k u m o u k s e l l i s i s t a + p a k o l a i s r a h a s t o o n + k o h d e l t u + f i n a n s s i k r i i s i s s ä + o p p i m i s p r o s e s s i a + r a u h a n p y r k i m y k s i s t ä ä n + a r k i o p p i m i s t a + r a k e n t a m a m m e + r a k e n n e p o l i t i i k k a a m m e + a v o i m e m m a n + k u u k a u s i n a + l i u o t i n p o h j a i s t e n + o r t o d o k s i k r i s t i t t y + o s a l l i s t a v a m p a a n + v a k u u t u s j ä r j e s t e l m ä ä + k e h i t y s l i n j o i l l e + v i e s t i n t ä f o o r u m i n + t i e d o t u s s t r a t e g i a a + s ä ä s t ö p a k e t i s t a + n e t t o t u o j a k s i + e r i t y i s o p e t u s t a + a j a n j a k s o l t a + a r v o p a p e r i k o m i s s i o n + m u u l l a + t o i m i v a l t a i n e n + t u p a k a n t u o t t a j a t k i n + v a k u u t u s l a i t o s + r e v i t ä ä n + p e r u s v a k a u m u k s e s t a + v a k u u t u s m e k a n i s m i n + t a l o u s a r v i o p o n n i s t e l u j a + t o i v o n u t + o i k e u d e n t a v o i t t e l u l l e e n + v ä l i a r v i o i n n e i s s a + t u k i k e l p o i s u u s p e r i a a t t e i d e n + k u v a n l a a d u s t a + n i k k e l i k a d m i u m a k k u j e n + m e r i t u u l i v o i m a a + r o m a n i p e r h e i t ä + e h t i ä k s e n n e + t e r v e y d e n h o i t o t o i m i i n + k a r b a m o y y l i f o s f a a t t i + v a i k u t u s p i i r i ä + k u l t a h e r u k k a + v a l i t u s k i r j e i l l e + t e l e v i s i o l ä h e t y k s i ä + t a r h a j u u r i p e r h o n e n diff --git a/examples/example-data/fin-words.txt b/examples/example-data/fin-words.txt new file mode 100644 index 000000000..28e8d669a --- /dev/null +++ b/examples/example-data/fin-words.txt @@ -0,0 +1,232871 @@ + a a k k o s j ä r j e s t y k s e s s ä + a a k k o s j ä r j e s t y s + a a k k o s l a j i + a a k k o s t a i d e + a a l l o n h a r j a l l a + a a l l o n i s k u n + a a l l o n k o r k e u s + a a l l o n p i t u u d e l l a + a a l l o n p o h j a + a a l l o n p o h j a a + a a l l o n p o h j a n + a a l l o n p o h j a s s a + a a l l o n p o h j i a + a a l t o e n e r g i a + a a l t o e n e r g i a a + a a l t o e n e r g i a l l a + a a l t o e n e r g i a r a t k a i s u j a + a a l t o f u n k t i o n + a a l t o i h i n + a a l t o i n a + a a l t o j e n + a a l t o j u o t o s + a a l t o k e s k u s + a a l t o l e v y + a a l t o m a g n i t u d i + a a l t o m i t t a r i + a a l t o m u o v i + a a l t o n u o l i a i n e n + a a l t o o n + a a l t o p a h v i + a a l t o p i l v i + a a l t o r a u s k u + a a l t o r i t a r i y ö k k ö n e n + a a l t o s t a + a a l t o t e o r i a + a a l t o v e k t o r i + a a l t o v o i m a + a a l t o v o i m a a n + a a l t o y h t ä l ö + a a m i a i s k a n a n m u n a + a a m i a i s k e s k u s t e l u + a a m i a i s m a j o i t u s + a a m i a i s m a j o i t u s y r i t y k s i ä + a a m i a i s m u r o j a + a a m i a i s m u r o t + a a m i a i s t a p a a m i n e n + a a m i a i s t u o t e + a a m i a i s t u o t t e i s s a + a a m u a t e r i a l l a a n + a a m u i s t u n t o + a a m u i s t u n t o a + a a m u i s t u n t o i h i n + a a m u l e n t o + a a m u l e p a k k o + a a m u l l a + a a m u n a + a a m u p a l a m u r o t + a a m u p ä i v ä i s t u n t o + a a m u p ä i v ä n + a a m u s t a + a a m u t e l e v i s i o + a a m u t u n n e i l l a + a a m u t ä h t i + a a m u y ö l l ä + a a p a s u o + a a p r o t t i m a r u n a + a a r n i h a u k k a p ö l l ö + a a r n i m e t s i e n + a a r n i m e t s ä + a a r n i o m e t s i e n + a a r n i o m e t s i ä + a a r n i o m e t s ä + a a r n i o m e t s ä s s ä + a a r n i o m e t s ä t + a a r n i o m e t s ä ä + a a r n i t u l i t ö y h t ö + a a r n i v i h e r t i k k a + a a r r e a r k k u + a a r r e j a h d i s s a + a a r r e j a h t i + a a r r e p l a n e e t t a + a a r r e s a a r i + a a r t e e m m e + a a r t e e n m e t s ä s t ä j ä + a a s e j a + a a s i a + a a s i a a n + a a s i a l a i s a f r i k k a l a i s e e n + a a s i a l a i s e l l e + a a s i a l a i s e u r o o p p a l a i s i l l a + a a s i a l a i s r y h m i t t y m ä n + a a s i a l a i s t a + a a s i a l a i s t e n + a a s i a l a i s y r i t y k s i s t ä + a a s i a s s a + a a s i a s s a h a n + a a s i k s i + a a s i n m a k s a r u o h o + a a s i n s i l t a + a a t a m i n a i k a i n e n + a a t a m i n a i k u i s t a + a a t a m i n h u i p p u + a a t a m i n o m e n a + a a t a m i n s i l t a + a a t e h i s t o r i a + a a t e l i s k a a r t i + a a t e l i s s u v u i s t a + a a t e m a a i l m a a n s a + a a t e s u u n n i s s a + a a t e v e l j i ä + a a t e v i r t a u k s e s t a + a a t o n + a a t t e e l l i s e t + a a t t e e l l i s i a + a a t t e e s e e n + a a t t e i t a + a a v a l l a + a a v a l l e + a a v a n + a a v a t + a a v e a j a j a + a a v e j a h t i + a a v e j u n a + a a v e k a l a + a a v e k a u p u n g i n + a a v e k a u p u n k i + a a v e k a u p u n k i i n + a a v e k i p u + a a v e k u i s k a a j a + a a v e l a i v a + a a v e l a i v a s t o j e n + a a v e r a k e t i t + a a v e r a k k a u t t a + a a v e r a t s a s t a j a + a a v i k k o a l u e i l l e e n + a a v i k k o h a u k k a + a a v i k k o h i e k k a a + a a v i k k o h u u h k a j a + a a v i k k o i g u a a n i + a a v i k k o i l m a s t o s t a a n + a a v i k k o j u o k s i j a + a a v i k k o j ä n i s k e n g u r u + a a v i k k o k e h r ä ä j ä + a a v i k k o k e n g u r u + a a v i k k o k e n k ä + a a v i k k o k e r t t u + a a v i k k o k e t t u + a a v i k k o k i u r u + a a v i k k o k o r p p i + a a v i k k o k o t t a r a i n e n + a a v i k k o k u l t a r i n t a + a a v i k k o l e i r e i l l ä + a a v i k k o l o i s t o k a i j a + a a v i k k o l o k k i + a a v i k k o m a r a + a a v i k k o m y r s k y + a a v i k k o n ä r h e t + a a v i k k o n ä r h i + a a v i k k o p i k k u m a r s u + a a v i k k o p l a n e e t t a + a a v i k k o p u s s i m ä y r ä + a a v i k k o p ä ä s t ä i n e n + a a v i k k o p ö l l ö + a a v i k k o r o t t a + a a v i k k o s i r p p i m a t k i j a + a a v i k k o t a i p a a n i + a a v i k k o t a s k u + a a v i k k o t a s k u r o t t a + a a v i k k o t r a p p i + a a v i k k o t y l l i + a a v i k k o u n i k e k o + a a v i k k o v a r p u n e n + a a v i k o i t u m i s a i h e e n + a a v i k o i t u m i s e n + a a v i k o i t u m i s e s t a + a a v i k o i t u m i s k y s y m y s + a a v i k o i t u m i s o n g e l m a t + a a v i k o i t u m i s p r o s e s s i n + a a v i k o i t u m i s t a + a a v i k o i t u u + a a v i s t a a + a a v i s t a v i n a n i + a a v i s t e l l a + a a v i s t u k s e n + a a v i s t u s t a + a a v i s t u s t a k a a n + a b h a a s i t + a b h a a s i v ä h e m m i s t ö + a b o r i g i n a a l i e n + a b o r i g i n a a l i v ä e s t ö ä + a b o r t e i s t a + a b o r t i n + a b o r t i n t e k o m a h d o l l i s u u t e e n + a b o r t i n v a s t a i s e n + a b o r t i n v a s t a i s i a + a b o r t i n v a s t a i s t a + a b o r t i n v a s t u s t a j i e n + a b o r t i s t a + a b o r t t e i h i n + a b o r t t e j a + a b o r t t i a + a b o r t t i e n + a b o r t t i f a n a a t i k k o j a + a b o r t t i i n + a b o r t t i k i e l t o + a b o r t t i k i i s t a n + a b o r t t i k l i n i k k a a + a b o r t t i k y s y m y k s e s t ä + a b o r t t i k y s y m y k s e t + a b o r t t i k y s y m y s t ä + a b o r t t i k ä y t ä n n ö n + a b o r t t i l a i n + a b o r t t i l a i n s ä ä d ä n n ö l l e + a b o r t t i l a i n s ä ä d ä n n ö n + a b o r t t i l a i n s ä ä d ä n n ö s t ä + a b o r t t i l a i n s ä ä d ä n t ö + a b o r t t i l a i n s ä ä d ä n t ö ä + a b o r t t i l a i n s ä ä d ä n t ö ö n + a b o r t t i l a i s t a + a b o r t t i l a i v a k s i + a b o r t t i l a k i + a b o r t t i l u k u j a + a b o r t t i n e u v o n t a a + a b o r t t i o h j e l m i s t a + a b o r t t i o i k e u d e n + a b o r t t i o i k e u d e s t a + a b o r t t i o i k e u s + a b o r t t i o i k e u t t a + a b o r t t i p a l v e l u j e n + a b o r t t i p i l l e r i s t ä + a b o r t t i p o l i t i i k k a a n + a b o r t t i p r o p a g a n d a + a b o r t t i s ä ä n n ö k s e t + a b o r t t i v i i t t a u k s e n + a b s o l u u t t i s e e n + a b s o l u u t t i s e l t a + a b s o l u u t t i s e n + a b s o l u u t t i s e t + a b s o l u u t t i s i a + a b s o l u u t t i s i n + a b s o l u u t t i s i n a + a b s o l u u t t i s t a + a b s o r p t i o n + a b s o r p t i o r i s k i + a b s o r p t i o s p e k t r i + a b s t i n e n s s i t e o r i a + a b s t r a k t e i s t a + a b s t r a k t i t + a b s u r d i a + a b s u r d i m p a a + a b s u r d i n + a b s u r d i t + a b s u r d i u t e e n + a b s u r d i u t t a + a d d i t i o r e a k t i o + a d e n o s i i n i d i f o s f a a t t i + a d e n o s i i n i m o n o f o s f a a t t i + a d e n o s i i n i t r i f o s f a a t t i + a d j e k t i i v e j a + a d l u m i a + a d o p t i o a s i a a + a d o p t i o a s i a t + a d o p t i o a v u s t u k s i a + a d o p t i o h a a s t a t t e l u j a + a d o p t i o h a k e m u k s e t + a d o p t i o h a k e m u k s i a + a d o p t i o i d e n + a d o p t i o i h i n + a d o p t i o i s t a + a d o p t i o i t a + a d o p t i o j ä r j e s t e l m ä + a d o p t i o j ä r j e s t e l m ä n + a d o p t i o j ä r j e s t e l m ä t + a d o p t i o j ä r j e s t e l m ä ä + a d o p t i o k e l p o i s i a + a d o p t i o k y s y m y s + a d o p t i o k y s y m y s t ä + a d o p t i o k ä s i t t e e n + a d o p t i o l a p s e t + a d o p t i o l a s t e n + a d o p t i o l o m a a + a d o p t i o l o m a s t a + a d o p t i o m a h d o l l i s u u s + a d o p t i o m a r k k i n o i d e n + a d o p t i o m e n e t t e l y j e n + a d o p t i o m e n e t t e l y j ä + a d o p t i o m e n e t t e l y t + a d o p t i o m e n e t t e l y ä + a d o p t i o n + a d o p t i o p e r h e e s e e n + a d o p t i o p e r h e i l l e + a d o p t i o p e r h e i t ä + a d o p t i o p e r u s t e + a d o p t i o p r o s e s s e i s s a + a d o p t i o p r o s e s s e j a + a d o p t i o p r o s e s s i a + a d o p t i o p ä ä t ö k s i e n + a d o p t i o p ä ä t ö k s i i n + a d o p t i o p ä ä t ö s t e n + a d o p t i o p ä ä t ö s t ä + a d o p t i o s t a + a d o p t i o t + a d o p t i o t a + a d o p t i o t a p a u k s i a + a d o p t i o v a n h e m m a n + a d o p t i o v a n h e m m a t + a d o p t i o v a n h e m m i l l e + a d o p t i o v a n h e m m u u d e l l e + a d o p t i o v a n h e m p i a + a d o p t i o v a p a a + a d o p t i o v i r a s t o + a d o p t i o ä i d e i l l ä + a d o p t i o ä i t i n ä + a d o p t o i d a + a d o p t o i n t i j ä r j e s t e l m ä + a d o p t o i t a v a n a + a d o p t o i t a v i s s a + a d r e s s i n + a d v e n t t i a j a l l e + a d v e n t t i k a l e n t e r i n + a e r o s o l i f y s i i k k a + a f a r i t + a f g a a n e i s t a + a f g a a n i a r m e i j a + a f g a a n i a r m e i j a n + a f g a a n i e n + a f g a a n i h a l l i n t o + a f g a a n i h a l l i t u k s e n + a f g a a n i h a l l i t u s + a f g a a n i k a n s a + a f g a a n i k a n s a a + a f g a a n i k a n s a l a i s t e n + a f g a a n i k a n s a l l e + a f g a a n i k a n s a n + a f g a a n i k u n i n k a a n + a f g a a n i k y s y m y k s e n + a f g a a n i m i n i s t e r i ö t ä + a f g a a n i n a i n e n + a f g a a n i n a i s e t + a f g a a n i n a i s i a + a f g a a n i n a i s i i n + a f g a a n i n a i s i l l e + a f g a a n i n a i s i l t a + a f g a a n i n a i s i s t a + a f g a a n i n a i s t e n + a f g a a n i n v i n t t i k o i r a + a f g a a n i o s a p u o l t e n + a f g a a n i p a k o l a i s e t + a f g a a n i p a k o l a i s i a + a f g a a n i p a k o l a i s i i n + a f g a a n i p a k o l a i s t e n + a f g a a n i p e r i n t e e s t ä + a f g a a n i p r o v i n s s e i h i n + a f g a a n i r y h m i e n + a f g a a n i s i v i i l e j ä + a f g a a n i s i v i i l i e n + a f g a a n i s o t a + a f g a a n i t y t t ö + a f g a a n i v a l t i o + a f g a a n i v i r a n o m a i s e t + a f g a a n i v i r a n o m a i s i a + a f g a a n i v ä e s t ö + a f g a a n i v ä e s t ö l l e + a f g a a n i v ä e s t ö n + a f g a a n i v ä e s t ö ä + a f g a a n i y h t e i s k u n n a n + a f g a a n i y h t e i s k u n n a s s a + a f g a a n i y h t e i s k u n t a + a f g a a n i y h t e i s k u n t a a + a f g a n i s t a n i l a i s e s s a + a f g a n i s t a n i l a i s e t + a f g a n i s t a n i l a i s i a + a f g a n i s t a n i l a i s i l l e + a f g a n i s t a n i l a i s l a s t e n + a f g a n i s t a n i l a i s n a i s i i n + a f g a n i s t a n i l a i s n a i s i l l e + a f g a n i s t a n i l a i s n a i s t e n + a f g a n i s t a n i l a i s p a k o l a i s e t + a f g a n i s t a n i l a i s r y h m i i n + a f g a n i s t a n i l a i s t a + a f g a n i s t a n i l a i s t e n + a f r i k a a n e r i n a t i o n a l i s m i + a f r i k a l l a + a f r i k a l l e + a f r i k a n + a f r i k a n h a n h i + a f r i k a n h a r l e k i i n i + a f r i k a n h i i r i h a u k k a + a f r i k a n h u u h k a j a + a f r i k a n i i b i s h a i k a r a + a f r i k a n k a i j a + a f r i k a n k a l l i o p ä ä s k y + a f r i k a n k a p u s t a h a i k a r a + a f r i k a n k a s t a n j a s i r k k u + a f r i k a n k i e l i l e p a k k o + a f r i k a n k i n + a f r i k a n k i r j o r a s t a s + a f r i k a n k u h a n k e i t t ä j ä + a f r i k a n k u l t a k i s s a + a f r i k a n k u p a r i s o r s a + a f r i k a n k u r p p a + a f r i k a n k y n s i s a m m a k k o + a f r i k a n k y p ä r ä s u o k i l p i k o n n a + a f r i k a n k ä e n p i i k a + a f r i k a n k ä ä p i ö h a u k k a + a f r i k a n k ä ä p i ö o r a v a + a f r i k a n k ä ä p i ö s o r s a + a f r i k a n l a u l u h a u k k a + a f r i k a n l a u l u r a s t a s + a f r i k a n l e i j o n a a n + a f r i k a n l e i j o n a n + a f r i k a n l i n t u h a u k k a + a f r i k a n m a n a a t t i + a f r i k a n m e r i h a r a k k a + a f r i k a n m e r i k a r h u + a f r i k a n m e t s ä k i r v i n e n + a f r i k a n m e t s ä p ä ä s t ä i n e n + a f r i k a n m u s t a v a r i s + a f r i k a n n o r s u i s t a + a f r i k a n n o r s u j a + a f r i k a n n o r s u j e n + a f r i k a n n o r s u k a n n a t + a f r i k a n n o r s u k a n t o j e n + a f r i k a n n o r s u n + a f r i k a n n o r s u t + a f r i k a n n u o l i h a u k k a + a f r i k a n p a l m u n ä ä t ä + a f r i k a n p a r a t i i s i m o n a r k k i + a f r i k a n p e l i k a a n i + a f r i k a n p i k k u k o t k a + a f r i k a n p i k k u l e p i n k ä i n e n + a f r i k a n p i k k u t i i r a + a f r i k a n p i n g v i i n i + a f r i k a n p o r t u g a l i + a f r i k a n p u s s i t i a i n e n + a f r i k a n p y y j u o k s i j a + a f r i k a n p ö l l ö + a f r i k a n p ö l l ö n e n + a f r i k a n r a k o n o k k a + a f r i k a n r i l l i r a s t a s + a f r i k a n r u o k o k e r t t u n e n + a f r i k a n r y t i k e r t t u n e n + a f r i k a n s a k s i n o k k a + a f r i k a n s a r v i p ö l l ö + a f r i k a n s e p e l k y y h k y + a f r i k a n s i e p o t + a f r i k a n s i n i s a r j a + a f r i k a n s i v e t t i k i s s a + a f r i k a n s u o h a u k k a + a f r i k a n s u o p ö l l ö + a f r i k a n t a a t e l i + a f r i k a n t a s k u + a f r i k a n t i k k a n e n + a f r i k a n t r o g o n i + a f r i k a n t y l l i + a f r i k a n t ä p l ä k y y h k y + a f r i k a n t ö y h t ö h y y p p ä + a f r i k a n u n i k e k o + a f r i k a n u u n i l i n t u + a f r i k a n v a r i s + a f r i k a n v a r p u n e n + a f r i k a n v a r p u s h a u k k a + a f r i k a n v i i r i ä i n e n + a f r i k a n v i i t a p ö l l ö + a f r i k a n v i l l i a a s i + a f r i k a n v i l l i k i s s a + a f r i k a n v i u h k a k e r t t u n e n + a f r i k a n v u o r i k o t k a + a f r i k a n v ä s t ä r ä k k i + a f r i k a s s a + a f r i k a s t a + a f r i k k a + a f r i k k a a + a f r i k k a a n + a f r i k k a k i n + a f r i k k a l a i s a m e r i k k a l a i n e n + a f r i k k a l a i s e e n + a f r i k k a l a i s e n + a f r i k k a l a i s e s s a + a f r i k k a l a i s e s t a + a f r i k k a l a i s e t + a f r i k k a l a i s i a + a f r i k k a l a i s i l l a + a f r i k k a l a i s i l l e + a f r i k k a l a i s l a p s e t + a f r i k k a l a i s l a p s i a + a f r i k k a l a i s l a s t a + a f r i k k a l a i s l a s t e n + a f r i k k a l a i s n a i s i a + a f r i k k a l a i s t e n + a f r i k k a l a i s t y t t ö j ä + a f r i k k a l a i s v a l t i o n + a f r o a m e r i k k a l a i n e n + a f r o a m e r i k k a l a i s e e n + a f r o a m e r i k k a l a i s e s t a + a f r o a m e r i k k a l a i s e t + a f r o a m e r i k k a l a i s t e n + a f r o k o l u m b i a l a i s i a + a f r o k o l u m b i a l a i s i s s a + a f r o m e k s i k o l a i s e t + a g a i n + a g a t h o + a g a t h o n + a g e n t i t + a g e n t t i r y h m i t t y m i ä + a g e n t t i s o p i m u k s i a + a g e n t t i t o i m i n t a a n + a g g r e s s i i v i s e m m a k s i + a g g r e s s i i v i s e m m a n + a g g r e s s i i v i s e m m a t + a g g r e s s i i v i s e m m i l l a a n + a g g r e s s i i v i s e m m i n + a g g r e s s i i v i s e m p i + a g g r e s s i i v i s e m p i a + a g g r e s s i i v i s i a + a g g r e s s i i v i s i n t a + a g g r e s s i i v i s t e n + a g g r e s s i o i t a + a g o n i s t i t + a g r a a r i y h t e i s k u n t a + a h a v a r o t t a + a h d a s k a t s e i s e s t a + a h d a s m i e l i n e n + a h d a s m i e l i s e n + a h d a s m i e l i s e n ä + a h d a s m i e l i s e s t i + a h d a s m i e l i s e t + a h d a s m i e l i s i i n + a h d a s m i e l i s i m m i s t ä + a h d a s m i e l i s i m p i ä + a h d a s m i e l i s i s t ä + a h d a s m i e l i s i ä + a h d a s m i e l i s t e n + a h d a s m i e l i s t ä + a h d a s m i e l i s y y d e l l e + a h d a s m i e l i s y y s + a h d a s m i e l i s y y t e e n + a h d a s m i e l i s y y t t ä + a h d e k a u n o k k i + a h d e l e h t i m i t t a r i + a h d e y ö k k ö n e n + a h d i n g o s s a + a h d i n g o s t a + a h d i n k o a a n + a h d i n k o o n + a h d i s t a a + a h d i s t a v a a + a h d i s t e l i v a t + a h d i s t e l l a a n + a h d i s t e l u m u o t o j a + a h d i s t e l u n + a h d i s t e l u s t a + a h d i s t e l u t a p a u k s i s t a + a h d i s t u n e e m p a n a + a h d i s t u n e e m p i + a h d i s t u n e i s u u s h ä i r i ö + a h d i s t u n e i s u u s h ä i r i ö t + a h d i s t u n e i t a + a h d i s t u s t a + a h k e r a m p i a + a h k e r a s t a + a h k e r i a + a h k e r i e n + a h k e r i l l a + a h k e r i l t a + a h k e r i m m a t + a h k e r i m m i s t a + a h k e r o i n u t + a h k e r u u d e n + a h k e r u u d e s t a a n + a h m a t t i k o t i l o + a h m i m i s h ä i r i ö + a h n e e t + a h n e i m p i e n k i n + a h n e i t a + a h o h e i n ä s i r k k a + a h o j ä k k ä r ä + a h o k i r k i r u o h o + a h o k y l m ä n k u k k a + a h o m a n s i k k a + a h o m a t a r a + a h o n o i d a n l u k k o + a h o p e l l a v a + a h o s i l m ä r u o h o + a h o s u o l a h e i n ä + a h o v a l k o k ä m m e k k ä + a h t a a t + a h t a u s m e n e t e l m i i n + a h t i s a a r e n + a h t i s a a r i + a h t i s a a r i k i n + a h t i s a a r t a + a h t o i + a h t o j ä ä + a h v e n v i t a + a i d a n s e i p ä ä l l ä + a i d a s k ä ä p ä + a i d a s t a + a i d o i l l a + a i d o i m m a n + a i d o i m p i a + a i d o k s i + a i d o l t a + a i d o m m i n + a i d o m p i + a i d o n + a i d o s s a + a i d o s t a + a i d o t + a i d s i a + a i d s i l t a + a i d s i n + a i d s i s t a + a i d s p o t i l a i l l e + a i e i l m o i t u k s e l l a + a i e i l m o i t u k s e n + a i e j u l i s t u k s e n + a i e j u l i s t u k s e s s a + a i e j u l i s t u k s e s t a + a i e j u l i s t u k s e t + a i e j u l i s t u k s i a + a i e j u l i s t u k s i l l a + a i e j u l i s t u k s i s s a + a i e j u l i s t u k s i s s a a n + a i e j u l i s t u k s i s t a + a i e j u l i s t u s + a i e j u l i s t u s t a + a i e j u l i s t u s t a a n + a i e j u l i s t u s t e n + a i e k i r j e e n + a i e k i r j e e s e e n + a i e l a u s u n t o j e n + a i e m m a n + a i e m m a s s a + a i e m m a s t a + a i e m m a t + a i e m m a t k i n + a i e m m i l l a + a i e m m i l l e k i n + a i e m m i n k i n + a i e m m i s s a + a i e m m i s s a k i n + a i e m m i s t a + a i e m p a a + a i e m p a a k i n + a i e m p a a n + a i e m p i a + a i e m p i e n + a i e m p i i n + a i e m p i n a + a i e o h j e l m a s s a + a i e s o p i m u k s e k s i + a i e s o p i m u k s e l l a + a i e s o p i m u k s e m m e + a i e s o p i m u k s e n + a i e s o p i m u k s e t + a i e s o p i m u s + a i e s o p i m u s t a + a i e s o p i m u s t e n + a i h e a l a l l a + a i h e a l u e + a i h e a l u e e k s e e n + a i h e a l u e e n + a i h e a l u e e s e e n + a i h e a l u e e s t a + a i h e a l u e e t + a i h e a l u e i d e n + a i h e a l u e i l l a + a i h e a l u e i l l e + a i h e a l u e i s i i n + a i h e a l u e i t a + a i h e a l u e t t a + a i h e e k s i + a i h e e l l e + a i h e e l l i s e k s i + a i h e e l l i s e l t a + a i h e e l l i s e m p a a + a i h e e l l i s e n a + a i h e e l l i s i a + a i h e e l l i s i n + a i h e e l l i s u u d e n + a i h e e l l i s u u s p e r i a a t e t t a + a i h e e m m e + a i h e e n + a i h e e n a + a i h e e n s a + a i h e e s e e n + a i h e e s e e n i + a i h e e s s a + a i h e e s t a + a i h e e t + a i h e e t t a + a i h e e t t o m i a + a i h e i d e n + a i h e i k s i + a i h e i l l e + a i h e i n + a i h e i n a + a i h e i s i i n + a i h e i s s a + a i h e i s t a + a i h e i t a + a i h e k a r t a t + a i h e k e r ä i l y + a i h e k o h t a i n e n + a i h e k o h t a i s e t + a i h e k o h t a i s i a + a i h e k o h t a i s i l l a + a i h e k o h t a i s i s t a + a i h e k o h t a i s t a + a i h e k o h t a i s t e n + a i h e k o k o n a i s u u s + a i h e l u e t t e l o + a i h e l u e t t e l o n + a i h e p i i r e j ä + a i h e p i i r i + a i h e p i i r i i n + a i h e p i i r i k o h t a i s i s t a + a i h e p i i r i n + a i h e p i i r i s s ä + a i h e p i i r i t + a i h e p i i r i ä + a i h e s i s ä l t ö ä + a i h e t o d i s t e e t + a i h e t o d i s t e i d e n + a i h e t o d i s t e i s i i n + a i h e t o d i s t e i t a + a i h e t t a + a i h e t t a a n + a i h e u t e t a + a i h e u t e t a a n + a i h e u t e t u n + a i h e u t e t u t + a i h e u t t a a + a i h e u t t a a k i n + a i h e u t t a a k s e e n + a i h e u t t a a k s e m m e + a i h e u t t a e n + a i h e u t t a i s i + a i h e u t t a i s i v a t + a i h e u t t a j a k s i + a i h e u t t a j a n a + a i h e u t t a j a p e r i a a t e + a i h e u t t a j a p e r i a a t e t t a + a i h e u t t a j a p e r i a a t t e e n + a i h e u t t a j a p e r i a a t t e e s e e n + a i h e u t t a j a p e r i a a t t e e s t a + a i h e u t t a j a t + a i h e u t t a j i a + a i h e u t t a j i i n + a i h e u t t a j i l t a + a i h e u t t a j i s t a + a i h e u t t a m a a + a i h e u t t a m a a n + a i h e u t t a m a n + a i h e u t t a m a s s a + a i h e u t t a m a s t a + a i h e u t t a m a t + a i h e u t t a m a t t a + a i h e u t t a m i a + a i h e u t t a m i e n + a i h e u t t a m i i n + a i h e u t t a m i i n s a + a i h e u t t a m i l l e + a i h e u t t a n e e t + a i h e u t t a n e i t a + a i h e u t t a n u t + a i h e u t t a v a a + a i h e u t t a v a n + a i h e u t t a v a t + a i h e u t t a v i a + a i h e u t t a v i e n + a i h e u t t a v i i n + a i h e u t t a v i l l a + a i h e u t t a v i s t a + a i h e u t t i + a i h e u t t i v a t + a i h e u t u a + a i h e u t u i + a i h e u t u i s i + a i h e u t u i v a t + a i h e u t u n e e t + a i h e u t u n e i d e n + a i h e u t u n e i s t a + a i h e u t u n u t + a i h e u t u u + a i h e u t u u k i n + a i h e u t u u k o + a i h e u t u v a n + a i h e u t u v a t + a i h e u t u v i a + a i h e u t u v i e n + a i h e u t u v i i n + a i h e u t u v i n e + a i h e u t u v i s t a + a i h e v a l i n n a s t a a n + a i k a a m m e + a i k a a n i + a i k a a n n e + a i k a a n s a + a i k a a n s a a d a + a i k a a n s a a d u i l l a + a i k a a n s a a d u n + a i k a a n s a a d u t + a i k a a n s a a j i a + a i k a a n s a a m a a n + a i k a a n s a a m a s t a + a i k a a n s a a m i a + a i k a a n s a a m i s e e n + a i k a a n s a a m i s e k s i + a i k a a n s a a m i s e s s a + a i k a a n s a a m i s e s t a + a i k a a n s a a m i s t a + a i k a a n s a a n n o k s e m m e + a i k a a n s a a n n o k s e n + a i k a a n s a a n n o k s e s t a + a i k a a n s a a n n o k s e s t a a n + a i k a a n s a a n n o k s e t + a i k a a n s a a n n o s t a n n e + a i k a a n s a a n n o s t e n + a i k a a n s a a t u + a i k a a n s a a t u a + a i k a a n s a a t u j a + a i k a a n s a a v a m p a a + a i k a a v i e v i ä + a i k a a v i e v ä ä + a i k a d i r e k t i i v i + a i k a e r o + a i k a e r o j a + a i k a e r o s t a + a i k a h o r i s o n t t i + a i k a h o r i s o n t t i n a + a i k a h y p p y + a i k a i k k u n a + a i k a i l e v a t + a i k a i s e e n + a i k a i s e m m a n + a i k a i s e m m a s s a + a i k a i s e m m a s t a + a i k a i s e m m a t + a i k a i s e m m a t k i n + a i k a i s e m m i l l a k a a n + a i k a i s e m m i l l e + a i k a i s e m m i n k i n + a i k a i s e m m i s s a + a i k a i s e m m i s s a k i n + a i k a i s e m m i s t a + a i k a i s e m p a a + a i k a i s e m p a a n + a i k a i s e m p i a + a i k a i s e m p i e n + a i k a i s e m p i i n + a i k a i s e s t a + a i k a i s e s t i + a i k a i s i a + a i k a i s l o m a k o h t e i d e n + a i k a i s t a a + a i k a i s t a i s i + a i k a i s t a m a a n + a i k a i s t a m a l l a + a i k a i s t a m i n e n + a i k a i s t a m i s e e n + a i k a i s t a m i s e k s i + a i k a i s t a m i s e s t a + a i k a i s t a m i s t a + a i k a i s t a m m e + a i k a i s t e t a a n + a i k a i s t e t t a i s i i n + a i k a i s t e t t a v a + a i k a i s t e t t i i n + a i k a i s t e t t u + a i k a i s t i + a i k a j a k s o + a i k a j a k s o a + a i k a j a k s o i h i n + a i k a j ä n t e e l l ä + a i k a j ä n t e e n + a i k a j ä r j e s t e l m ä + a i k a j ä r j e s t e l m ä n + a i k a j ä r j e s t y k s e e n + a i k a j ä r j e s t y k s e n + a i k a j ä r j e s t y k s e s s ä + a i k a k a p s e l i + a i k a k a u d e l l a + a i k a k a u d e l l a m m e + a i k a k a u d e n + a i k a k a u s i n i m i + a i k a k a u s j u l k a i s u j e n + a i k a k a u s l e h t i p a p e r i + a i k a k a u t e e m m e + a i k a k a u t e n a + a i k a k a u t t a + a i k a k e h y k s e n + a i k a k e h y s + a i k a k e h y s t ä + a i k a k i n + a i k a k o n e + a i k a k o n e e s s a + a i k a k r i t e e r i + a i k a k y s y m y k s e n + a i k a k y s y m y s t ä + a i k a k y t k i n + a i k a k ä s i t y k s i s s ä n i + a i k a k ä s i t y s + a i k a l a i s h i s t o r i a m m e + a i k a l i s ä + a i k a l i s ä n + a i k a l i s ä ä + a i k a m a t k a + a i k a m a t k u s t a m i s e s t a + a i k a m a t k u s t u s + a i k a m e r k k i + a i k a m m e + a i k a m u o t o + a i k a n a n i + a i k a n i + a i k a n s a + a i k a n ä k y m i e n + a i k a n ä k ö k u l m a a + a i k a o s u u k s i a + a i k a o s u u s a s u n n o n + a i k a o s u u s a s u n t o j a + a i k a o s u u s d i r e k t i i v i + a i k a o s u u s d i r e k t i i v i n + a i k a o s u u s l o m i a + a i k a o s u u s s o p i m u k s e s t a + a i k a o s u u s t u o t t e i l l e + a i k a o s u u s y r i t y s t e n + a i k a p a i n e + a i k a p a i n e e n + a i k a p a i n e e s s a + a i k a p a i n e e t + a i k a p a i n e i t a + a i k a p a i n e t t a + a i k a p a i n o t e t t u n a + a i k a p a n k k i + a i k a p a r a d o k s i + a i k a p e r s p e k t i i v i + a i k a p e r s p e k t i i v i n s ä + a i k a p e r s p e k t i i v i ä + a i k a p e r u s t e i s t e n + a i k a p o h j a i n e n + a i k a p o m m e i l l e + a i k a p o m m e j a + a i k a p o m m i + a i k a p o m m i a + a i k a p o m m i e n + a i k a p o m m i i n + a i k a p o m m i k s i + a i k a p o m m i l t a + a i k a p o m m i n + a i k a p o m m i s t a + a i k a p o m m i t + a i k a p u l a + a i k a p u l a a n + a i k a p u l a l l a + a i k a p u l a n + a i k a p u l a s t a + a i k a r a a m e i h i n + a i k a r a a m i t + a i k a r a j a + a i k a r a j a a + a i k a r a j a a n + a i k a r a j a k s i + a i k a r a j a n + a i k a r a j a n a + a i k a r a j a n s a + a i k a r a j a s t a + a i k a r a j a s t a k i n + a i k a r a j a t + a i k a r a j o i h i n + a i k a r a j o i l l a + a i k a r a j o i n e e n + a i k a r a j o i s s a + a i k a r a j o i s t a + a i k a r a j o i t e t t u a + a i k a r a j o i t t e e t + a i k a r a j o i t t e i d e n + a i k a r a j o i t t e i s t a + a i k a r a j o i t t e i t a + a i k a r a j o i t u k s e m m e + a i k a r a j o i t u k s e n + a i k a r a j o i t u k s e t + a i k a r a j o i t u k s i a + a i k a r a j o i t u k s i a m m e + a i k a r a j o i t u k s i n + a i k a r a j o i t u k s i s t a + a i k a r a j o i t u s + a i k a r a j o i t u s t a + a i k a r a j o i t u s t e n + a i k a r a j o j a + a i k a r a j o j e n + a i k a r e s u r s s i t + a i k a s a r j a + a i k a s e k t o r e i d e n + a i k a s i t o u m u k s i a + a i k a s k a a l a a n + a i k a s o p i m u k s e e n + a i k a s y i s t ä + a i k a t a u l u + a i k a t a u l u a + a i k a t a u l u a n i + a i k a t a u l u a s i a s s a + a i k a t a u l u i h i n + a i k a t a u l u i s t a + a i k a t a u l u i s t a a n + a i k a t a u l u j a + a i k a t a u l u j e n + a i k a t a u l u j e n s a + a i k a t a u l u j o u s t o j e n + a i k a t a u l u j ä r j e s t e l y j e n + a i k a t a u l u k e s k u s t e l u i h i n + a i k a t a u l u k y s y m y k s i i n + a i k a t a u l u k y s y m y k s i ä + a i k a t a u l u k y s y m y s t ä + a i k a t a u l u l l a + a i k a t a u l u m m e + a i k a t a u l u m u u t o k s e t + a i k a t a u l u n + a i k a t a u l u n i + a i k a t a u l u n s a + a i k a t a u l u o n g e l m a t + a i k a t a u l u o n g e l m i a + a i k a t a u l u o n g e l m i e n + a i k a t a u l u p a i n e i t a + a i k a t a u l u p o h d i s k e l u j a + a i k a t a u l u s s a + a i k a t a u l u s t a + a i k a t a u l u s t a m m e + a i k a t a u l u s t a n n e + a i k a t a u l u s y i s t ä + a i k a t a u l u t + a i k a t a u l u t a v o i t t e i t a + a i k a t a u l u u m m e + a i k a t a u l u u n + a i k a t a u l u v a a t i m u k s e t + a i k a t a u l u v a i h e e t + a i k a t a u l u v i r h e t t ä + a i k a t a v o i t t e i d e n + a i k a t a v o i t t e i t a + a i k a t e k i j ä s t ä + a i k a t e k i j ä t + a i k a t y h j i ö + a i k a t y ö + a i k a t y ö h ö n + a i k a t y ö j ä r j e s t e l y j ä + a i k a t y ö l l i s y y d e n + a i k a t y ö l l ä + a i k a t y ö l ä i n e n + a i k a t y ö n + a i k a t y ö n t e k i j ä l l ä + a i k a t y ö n t e k i j ä t + a i k a t y ö n t e k i j ö i d e n + a i k a t y ö n t e k i j ö i h i n + a i k a t y ö n t e k i j ö i s t ä + a i k a t y ö n t e k i j ö i t ä + a i k a t y ö p a i k k o j e n + a i k a t y ö p a i k o i s t a + a i k a t y ö s o p i m u k s e s t a + a i k a t y ö s s ä + a i k a t y ö s t ä + a i k a t y ö t ä + a i k a t ö i h i n + a i k a t ö i s s ä + a i k a t ö i t ä + a i k a v a a t i m u s + a i k a v a r a s + a i k a v i e v ä ä + a i k a v i i v e i t ä + a i k a v i l j e l i j ö i l l e + a i k a v y ö h y k e + a i k a v y ö h y k e t i e t o k a n t a + a i k a v y ö h y k k e e k s i + a i k a v y ö h y k k e e l l ä + a i k a v y ö h y k k e i d e n + a i k a v y ö h y k k e i l t ä + a i k a v ä l e i n + a i k a v ä l i + a i k a v ä l i i n + a i k a v ä l i k e r t a u s + a i k a v ä l i l l e + a i k a v ä l i l l ä + a i k a v ä l i n + a i k a v ä l i s t ä + a i k a v ä l i t + a i k a v ä l i ä + a i k a v ä ä r i s t y m ä + a i k a v ä ä r i s t y m ä s s ä + a i k a v ä ä r i s t y m ä ä n + a i k a y k s i k ö i t ä + a i k a y k s i k ö l l e + a i k e e k s i + a i k e e n + a i k e e n n e + a i k e e n s a + a i k e e s t a + a i k e i n + a i k e i s i i n n e + a i k e i s s a + a i k e i s t a + a i k e i s t a a n + a i k e i t a + a i k e i t a a n + a i k o e s s a a n + a i k o i + a i k o i n a + a i k o i n a n i + a i k o i s i m m e + a i k o j a + a i k o j e n + a i k o m i e n n e + a i k o m u k s e e n + a i k o m u k s e m m e + a i k o m u k s e n a m m e + a i k o m u k s e n n e + a i k o m u k s e n s a + a i k o m u k s e s t a + a i k o m u k s e s t a a n + a i k o m u k s e s t a n n e + a i k o m u k s i a + a i k o m u k s i i n + a i k o m u k s i n + a i k o m u k s i s t a + a i k o m u k s i s t a a n + a i k o m u k s i s t a m m e + a i k o m u s t a + a i k o m u s t a a n + a i k o m u s t a k a a n + a i k o m u s t e n + a i k o o + a i k o o k i n + a i k o o k o + a i k o v a n + a i k o v a n s a + a i k o v a t + a i k u i s e k s i + a i k u i s e l ä m ä n + a i k u i s e l ä m ä n s ä + a i k u i s e l ä m ä ä n + a i k u i s e t + a i k u i s i a + a i k u i s i a k i n + a i k u i s i d e n t i t e e t t i ä ä n + a i k u i s i k ä n i + a i k u i s i k ä n s ä + a i k u i s i l l a + a i k u i s i l l e + a i k u i s i l l e k i n + a i k u i s i l l e m m e + a i k u i s i n a + a i k u i s i s t a + a i k u i s i ä l l ä + a i k u i s i ä n + a i k u i s i ä s s ä + a i k u i s k a s v a t u k s e e n + a i k u i s k a s v a t u k s e s t a + a i k u i s k a s v a t u s + a i k u i s k a s v a t u s t i e d e + a i k u i s k o n t a k t e j a + a i k u i s k o u l u t u k s e e n + a i k u i s k o u l u t u k s e l l e + a i k u i s k o u l u t u k s e n + a i k u i s k o u l u t u k s e s s a + a i k u i s k o u l u t u k s e s t a + a i k u i s k o u l u t u s + a i k u i s k o u l u t u s a l a + a i k u i s k o u l u t u s j ä r j e s t e l m i s s ä + a i k u i s k o u l u t u s k e s k u k s i a + a i k u i s k o u l u t u s k e s k u k s i s s a + a i k u i s k o u l u t u s k e s k u s t e n + a i k u i s k o u l u t u s o h j e l m i a + a i k u i s k o u l u t u s o h j e l m i i n + a i k u i s k o u l u t u s o h j e l m i s s a + a i k u i s k o u l u t u s p o l i t i i k a n + a i k u i s k o u l u t u s s u u n n i t e l m a a + a i k u i s k o u l u t u s t a + a i k u i s k o u l u t u s t o i m i n t a + a i k u i s k u d o k s e s t a + a i k u i s m a i s e s t i + a i k u i s o p e t u k s e e n + a i k u i s o p e t u k s e n + a i k u i s o p e t u s + a i k u i s o p e t u s t a + a i k u i s o p i s k e l i j a k s i + a i k u i s o p i s k e l i j o i d e n + a i k u i s o p i s k e l u + a i k u i s o p i s k e l u s t a + a i k u i s p o r n o + a i k u i s p o r n o l t a + a i k u i s r o c k + a i k u i s r y h m ä s t ä + a i k u i s s o l u j a + a i k u i s t e n + a i k u i s t u m i s e e n + a i k u i s t u m i s k o u l u t u s + a i k u i s t u m i s r i i t t i + a i k u i s u r h e i l u u n + a i k u i s u u t t a + a i k u i s v ä e s t ö + a i k u i s v ä e s t ö l l ä + a i k u i s v ä e s t ö n + a i k u i s v ä e s t ö s t ä + a i k u i s v ä e s t ö ä + a i m a r a t + a i n e d i r e k t i i v i + a i n e e l l a + a i n e e l l i s e e n + a i n e e l l i s e l t a + a i n e e l l i s e s t i + a i n e e l l i s e t + a i n e e l l i s i a + a i n e e l l i s i a k a a n + a i n e e l l i s i s t a + a i n e e l l i s o i k e u t t a + a i n e e n + a i n e e n v a i h d u n t a h ä i r i ö i t ä + a i n e e n v a i h d u n t a h ä i r i ö n + a i n e e n v a i h d u n t a s a i r a u k s i a + a i n e e n v a i h d u n t a t a u d i t + a i n e e s t a + a i n e e t + a i n e e t t o m a a n + a i n e e t t o m a s t a + a i n e e t t o m i a + a i n e e t t o m i e n + a i n e e t t o m i i n + a i n e e t t o m i l l e + a i n e i d e n + a i n e i l l a + a i n e i l l e + a i n e i n a + a i n e i s i i n + a i n e i s t o a + a i n e i s t o k e s k u s + a i n e i s t o l l e + a i n e i s t o n + a i n e i s t o s t a + a i n e i t a + a i n e j ä ä m i e n + a i n e k a t e g o r i o i d e n + a i n e k a t e g o r i o i t a + a i n e k a u p a s t a + a i n e k e r r o s t u m i e n + a i n e k i e l l o n + a i n e k i e l t o + a i n e k i e l t o a + a i n e k o h t a i s e s t i + a i n e k s e e n + a i n e k s e t + a i n e k s i a + a i n e k s i s t a + a i n e l a i n s ä ä d ä n t ö ä + a i n e l i s t a s s a + a i n e l u o k a l l a + a i n e m ä ä r ä + a i n e m ä ä r ä r a j o j a + a i n e p a k e t i n + a i n e p a k e t t i + a i n e p i t o i s u u k s i a + a i n e r y h m i i n + a i n e r y h m ä ä + a i n e s l u e t t e l o + a i n e s o s a + a i n e s o s a a + a i n e s o s a l u e t t e l o a + a i n e s o s a l u e t t e l o i d e n + a i n e s o s a l u e t t e l o n + a i n e s o s a l u e t t e l o o n + a i n e s o s a l u e t t e l o s s a + a i n e s o s a l u e t t e l o s t a + a i n e s o s a l u e t t e l o t + a i n e s o s a m ä ä r i i n + a i n e s o s a t + a i n e s o s i a + a i n e s o s i e n + a i n e s o s i s t a + a i n e t e s t i ä + a i n e t t a + a i n e v i r t o i h i n + a i n e v i r t o j a + a i n o a a + a i n o a a n + a i n o a k s i + a i n o a l a a t u i n e n + a i n o a n + a i n o a n a + a i n o a t + a i n o a t a k a a n + a i n o i k s i + a i n o i n a + a i n o i t a + a i n o s t a a n + a i n u t k e r t a i s e n + a i n u t k e r t a i s t a + a i n u t k e r t a i s u u d e n + a i n u t l a a t u i s e k s i + a i n u t l a a t u i s e l l a + a i n u t l a a t u i s e n + a i n u t l a a t u i s e s s a + a i n u t l a a t u i s e s t a + a i n u t l a a t u i s e s t i + a i n u t l a a t u i s i a + a i n u t l a a t u i s i k s i + a i n u t l a a t u i s i m m a n + a i n u t l a a t u i s i m p a a n + a i n u t l a a t u i s i m p i a + a i n u t l a a t u i s t a + a i n u t l a a t u i s u u t t a + a i n u t t a k a a n + a i o i m m e + a i o i n + a i o i n k i n + a i o m m e + a i o m m e k i n + a i o m m e k o + a i o n k i n + a i o t a a n + a i o t a a n k o + a i o t t e + a i o t t e k o + a i o t u t + a i r o k a l a + a i s o i h i n + a i s o i s s a + a i s t i h a v a i n n o t + a i s t i j ä r j e s t e l m i e n + a i s t i n e l i n + a i s t i n r e s e p t o r i + a i s t i n s i s ä l t ö + a i s t i n u t + a i s t i v a m m a i s e t + a i s t i v a m m a i s i a + a i s t i v a m m a i s i l l a + a i s t i v a m m o j a + a i t a j ä r j e s t e l m ä ä + a i t a k s i + a i t a l i k u s t e r i + a i t a o r a p i h l a j a + a i t o a + a i t o e l ä m ä n l a n k a + a i t o h u n a j a k u k k a + a i t o j a + a i t o j e n + a i t o k i s s a n m i n t t u + a i t o n a + a i t o s a m m a k o t + a i t o u t t a + a i t o v i i k u n a + a i t o v i r n a + a i v a s t u s t a u t i + a i v o a n e u r y s m a + a i v o e l i n t e n + a i v o e s t e + a i v o e s t e e n + a i v o h e r m o + a i v o i s t a + a i v o k a l v o n t u l e h d u s t a p a u k s i s t a + a i v o k a m m i o + a i v o k a p a s i t e e t i s t a a n + a i v o k a s v a i n + a i v o k a s v a i n t e n + a i v o k i r u r g i + a i v o k u d o k s e s t a + a i v o k u o l e m a + a i v o k u o l l e e k s i + a i v o k u o l l e i k s i + a i v o k u o l l u t + a i v o k u o r i + a i v o k u v a u s t e k n i i k k a + a i v o l e i k k a u s + a i v o l i s ä k e + a i v o m a t o + a i v o n s a + a i v o p a i s e + a i v o p e s u + a i v o p e s u a + a i v o p e s u k a m p a n j a n + a i v o p e s u u n + a i v o p i e r u + a i v o p u o l i s k o + a i v o p ä ä o m a n + a i v o r i i h e n ä + a i v o r i i h i l l ä + a i v o r i i h i ä + a i v o r u n k o s o l u j e n + a i v o s a i r a u d e t + a i v o s a i r a u k s i a + a i v o s a i r a u k s i e n + a i v o s a i r a u k s i s t a + a i v o s i r p p i + a i v o s o l u i l l e + a i v o s o l u j a + a i v o s o l u j e n + a i v o s t i m u l a a t i o + a i v o s y ö v ä n + a i v o t + a i v o t a u d i s t a + a i v o t o i m i n n a n + a i v o t o i m i n t o j a + a i v o t o i m i n t o j e n + a i v o t u o n n i k s i + a i v o t u o n n i s t a + a i v o v a m m a + a i v o v a m m a a n + a i v o v a m m o i s s a + a i v o v a m m o j a + a i v o v a u r i o + a i v o v a u r i o i h i n + a i v o v a u r i o i t a + a i v o v a u r i o t + a i v o v e r e n k i e r t o h ä i r i ö + a i v o v e r e n v u o t o + a i v o v e r i s u o n t e n + a i v o v e r k o s t o + a i v o v i e n n i n + a i v o v i e n n i s t ä + a i v o v i e n t i + a i v o v i e n t i i n + a i v o v i e n t i o n g e l m a + a i v o v i e n t i ä + a i v o v o i t t o a + a i v o v u o d o k s i + a i v o v u o d o l l a + a i v o v u o d o n + a i v o v u o d o s t a + a i v o v u o t a + a i v o v u o t o + a i v o v u o t o a + a i v o v u o t o i l m i ö n + a i v o v u o t o o n + a i v o ö d e e m a + a j a a k s e e n + a j a a k s e n i + a j a a k s e n n e + a j a e s s a a n + a j a j i a + a j a l l a + a j a l l a a n + a j a l l i s e s s a + a j a l l i s i i n + a j a l l i s i s t a + a j a l l i s t a + a j a m a a n + a j a m a l l a + a j a m a m m e + a j a m a t + a j a m i s e s t a + a j a m i s t a + a j a m m e + a j a m m e k o + a j a n h a a s k a u k s e l t a + a j a n h a a s k a u s t a + a j a n h u k k a a + a j a n j a k s o + a j a n j a k s o a + a j a n j a k s o i h i n + a j a n j a k s o i l t a + a j a n j a k s o i n a + a j a n j a k s o j a + a j a n j a k s o k s i + a j a n j a k s o l l a + a j a n j a k s o l l e + a j a n j a k s o l t a + a j a n j a k s o m a l l i a + a j a n j a k s o n + a j a n j a k s o n a + a j a n j a k s o o n + a j a n j a k s o s t a + a j a n j a k s o t + a j a n k o h d a n + a j a n k o h d a s t a + a j a n k o h d i s t a + a j a n k o h t a + a j a n k o h t a a + a j a n k o h t a a n + a j a n k o h t a i n e n + a j a n k o h t a i s a s i o i t a + a j a n k o h t a i s e e n + a j a n k o h t a i s e k s i + a j a n k o h t a i s e l l a + a j a n k o h t a i s e l t a + a j a n k o h t a i s e m m a k s i + a j a n k o h t a i s e m m i k s i + a j a n k o h t a i s e m m i n + a j a n k o h t a i s e m p a a + a j a n k o h t a i s e m p a a n + a j a n k o h t a i s e m p i + a j a n k o h t a i s e m p i a + a j a n k o h t a i s e m p i a k i n + a j a n k o h t a i s e m p i e n + a j a n k o h t a i s e n + a j a n k o h t a i s e n a + a j a n k o h t a i s e s s a + a j a n k o h t a i s e s t a + a j a n k o h t a i s e s t i + a j a n k o h t a i s e t + a j a n k o h t a i s i a + a j a n k o h t a i s i i n + a j a n k o h t a i s i m m a t + a j a n k o h t a i s i m m i k s i + a j a n k o h t a i s i n a + a j a n k o h t a i s i n t a + a j a n k o h t a i s i s s a + a j a n k o h t a i s i s t a + a j a n k o h t a i s k e s k u s t e l u + a j a n k o h t a i s k e s k u s t e l u a + a j a n k o h t a i s k e s k u s t e l u m m e + a j a n k o h t a i s k e s k u s t e l u n + a j a n k o h t a i s k e s k u s t e l u s s a + a j a n k o h t a i s k e s k u s t e l u s t a + a j a n k o h t a i s k e s k u s t e l u t + a j a n k o h t a i s k e s k u s t e l u u n + a j a n k o h t a i s o h j e l m a a n + a j a n k o h t a i s o h j e l m a n + a j a n k o h t a i s o h j e l m a s s a + a j a n k o h t a i s t a m i s e s t a + a j a n k o h t a i s t e n + a j a n k o h t a i s u u t e e n + a j a n k o h t a i s u u t e n s a + a j a n k o h t a n a + a j a n k o h t i a + a j a n k o h t i n a + a j a n k ä y t t ö n i + a j a n k ä y t t ö o n g e l m a + a j a n k ä y t t ö ä + a j a n k ä y t ö l l ä + a j a n k ä y t ö n + a j a n k ä y t ö s s ä + a j a n k ä y t ö s t ä ä n + a j a n l a s k u + a j a n m u k a i n e n + a j a n m u k a i s e m p i + a j a n m u k a i s e m p i e n + a j a n m u k a i s e s t i + a j a n m u k a i s t a a + a j a n m u k a i s t a m i s e h d o t u k s e l l a + a j a n m u k a i s t a m i s m a h d o l l i s u u d e t + a j a n m u k a i s t e t t a v a + a j a n n ä y t t ä j ä + a j a n o l o o n + a j a n p e l u u + a j a n p u u t e + a j a n p u u t t e e l l a + a j a n p u u t t e e n + a j a n p u u t t e e s t a + a j a n s i i r t o + a j a n s ä ä s t ö ä + a j a n s ä ä s t ö ö n + a j a n t a s a i s e m m i s t a + a j a n t a s a i s e n + a j a n t a s a i s i a + a j a n t a s a i s t a a + a j a n t a s a i s t a m a s s a + a j a n t a s a i s t a m i s e k s i + a j a n t a s a i s t a m i s t a + a j a n t a s a i s t e t t a v a + a j a n t u h l a u k s e s t a + a j a n t u h l a u s t a + a j a n u t + a j a n u t t a + a j a n v i e t e t e o l l i s u u d e n + a j a n v i e t t e e n ä + a j a n y l i t y k s i i n + a j a n y l i t y k s i ä + a j a s t a a n + a j a s t a n i + a j a s t a n n e + a j a s t e t t u + a j a t e l k a a + a j a t e l k a a h a n + a j a t e l k a a m m e + a j a t e l k a a m m e p a + a j a t e l k a a p a + a j a t e l l a + a j a t e l l a a n + a j a t e l l a a n p a + a j a t e l l a k a a n + a j a t e l l e e k s i + a j a t e l l e e n s a + a j a t e l l e e t + a j a t e l l e n + a j a t e l l e s s a n i + a j a t e l l u t + a j a t e l l u t k a a n + a j a t e l t a e s s a + a j a t e l t a k o o n + a j a t e l t a v a + a j a t e l t a v a a + a j a t e l t a v i s s a + a j a t e l t i i n + a j a t e l t i i n p a + a j a t e l t u n a + a j a t t e l e e + a j a t t e l e m a a n + a j a t t e l e m a l l a + a j a t t e l e m a t o n t a + a j a t t e l e m a t t a + a j a t t e l e m a t t o m i a + a j a t t e l e m a t t o m u u t t a a n + a j a t t e l e m i s e n + a j a t t e l e m m e + a j a t t e l e n + a j a t t e l e t t e + a j a t t e l e v a n + a j a t t e l e v a t + a j a t t e l e v i a + a j a t t e l i j a t + a j a t t e l i n + a j a t t e l i s i m m e + a j a t t e l i s i n + a j a t t e l i v a t + a j a t t e l u a + a j a t t e l u a m m e + a j a t t e l u e r o j a + a j a t t e l u h a t t u a + a j a t t e l u m m e + a j a t t e l u n + a j a t t e l u n n e + a j a t t e l u n v a p a u s + a j a t t e l u p e r i n n e + a j a t t e l u p o l i i s i n + a j a t t e l u p r o s e s s i a + a j a t t e l u p r o s e s s i s s a + a j a t t e l u s s a + a j a t t e l u s t a + a j a t t e l u t a p a + a j a t t e l u t a p a a + a j a t t e l u t a p a a m m e + a j a t t e l u t a p a a n + a j a t t e l u t a p a a n n e + a j a t t e l u t a p a a n s a + a j a t t e l u t a p a m m e + a j a t t e l u t a p a n s a + a j a t t e l u t a p o i h i n + a j a t t e l u t a p o i n e e n + a j a t t e l u t a p o j a + a j a t t e l u t a p o j a a n + a j a t t e l u t a p o j e n + a j a t t e l u t a v a l l a + a j a t t e l u t a v a n + a j a t t e l u t a v a s s a + a j a t t e l u t a v a s s a m m e + a j a t t e l u t a v a s t a + a j a t t e l u t a v a t + a j a t t e l u t a v o i s s a + a j a t t e l u t a v o i s t a + a j a t t e l u u n + a j a t u k s e e m m e + a j a t u k s e e n + a j a t u k s e l l a + a j a t u k s e m m e + a j a t u k s e n + a j a t u k s e n a + a j a t u k s e n a h a n + a j a t u k s e n i + a j a t u k s e n j u o k s u + a j a t u k s e n k u l k u a a n + a j a t u k s e n v a p a u d e n + a j a t u k s e n v a p a u s + a j a t u k s e n v a p a u t e e n + a j a t u k s e n v a p a u t e n s a + a j a t u k s e n v a p a u t t a + a j a t u k s e s t a + a j a t u k s e t + a j a t u k s i a + a j a t u k s i a a n + a j a t u k s i a m m e + a j a t u k s i a n n e + a j a t u k s i e n + a j a t u k s i e n s a + a j a t u k s i i n + a j a t u k s i i n i + a j a t u k s i l l a + a j a t u k s i l l e + a j a t u k s i n + a j a t u k s i n e e n + a j a t u k s i s s a n i + a j a t u k s i s t a + a j a t u k s i s t a m m e + a j a t u k s i s t a n i + a j a t u k s i s t a n n e + a j a t u s h a u t o m o + a j a t u s h a u t o m o i n a + a j a t u s h a u t o m o i t a + a j a t u s h a u t o m o n + a j a t u s h a u t o m o n a + a j a t u s h a u t o m o t + a j a t u s k i n + a j a t u s k o e + a j a t u s k o e t t a + a j a t u s k u l k u + a j a t u s l i n j a a + a j a t u s l i n j a a n s a + a j a t u s m a l l i + a j a t u s m a l l i a + a j a t u s m a l l i a a n + a j a t u s m a l l i i n + a j a t u s m a l l i s t a + a j a t u s p o l i i s e i k s i + a j a t u s p o l i i s i + a j a t u s p o l i i s i k s i + a j a t u s p o l i i s i n + a j a t u s p r o s e s s i + a j a t u s p r o s e s s i a + a j a t u s p r o s e s s i i n + a j a t u s r a h a s t o n + a j a t u s r a k e n n e l m i a + a j a t u s r i k o k s i a + a j a t u s r i k o s t a + a j a t u s t a + a j a t u s t a p a + a j a t u s t a p a a + a j a t u s t a p a a m m e + a j a t u s t a p a o n g e l m a + a j a t u s t a u o n + a j a t u s t a v a t + a j a t u s t e n + a j a t u s t e n i + a j a t u s t e n v a i h d o l l a + a j a t u s t e n v a i h t o + a j a t u s t e n v a i h t o a + a j a t u s t e n v a i h t o m m e + a j a t u s t e n v a i h t o o n + a j a t u s t e n v a p a u s + a j a t u s t y ö t ä + a j a t u s v i r h e e s e e n + a j a u d u m m e + a j a u t u m a s t a + a j a u t u m a t t a + a j a u t u n e e t + a j a u t u v a t + a j a v a t + a j a v i e n + a j e l e h t i m a a n + a j e l e h t i m i s t a + a j e t a + a j e t a a n + a j e t t a e s s a + a j e t t a v a + a j o a i k a + a j o a i k a a + a j o a i k a a k i n + a j o a i k a a n + a j o a i k a d i r e k t i i v i n + a j o a i k a d i r e k t i i v i ä + a j o a i k a n s a + a j o a i k a r a j o i t t e e t + a j o a i k o i h i n + a j o a i k o j a + a j o a i k o j e n + a j o a j a n + a j o a j a s t a + a j o a j a t + a j o a j o i s t a + a j o e l i n k e i n o l l e + a j o i n + a j o i s t a + a j o i t e t t u a + a j o i t t a i s e e n + a j o i t t u u + a j o i t t u v a t + a j o i t u k s e e n + a j o i t u k s e n + a j o i t u k s e s t a + a j o i t u s a s i a a n + a j o i t u s o n g e l m i a + a j o i t u s o n g e l m i s t a + a j o i t u s s i t o u m u s t a + a j o i t u s t a + a j o i t u s v i r h e + a j o i v a t + a j o j a h d i n + a j o j a h t e i n e e n + a j o j a h t i + a j o j a h t i i n + a j o j a k s o j a + a j o j ä ä + a j o k i e l l o i s t a + a j o k i e l l o n + a j o k i e l l o s t a + a j o k i e l l o t + a j o k i e l t o + a j o k i e l t o a + a j o k i e l t o i h i n + a j o k i e l t o j a + a j o k i e l t o j e n + a j o k i e l t o o n + a j o k o e + a j o k o e t t a + a j o k o i r a t + a j o k o k e e s e e n + a j o k o k e i d e n + a j o k o k e m u s t a + a j o k o r t e i l l e + a j o k o r t e i s s a + a j o k o r t e i s t a + a j o k o r t i l l a + a j o k o r t i n + a j o k o r t i n h a l t i j o i t a + a j o k o r t i s s a + a j o k o r t i s t a + a j o k o r t i t + a j o k o r t t e i h i n + a j o k o r t t e j a + a j o k o r t t e j a a n + a j o k o r t t i + a j o k o r t t i a + a j o k o r t t i a a n + a j o k o r t t i a s i a k i r j a + a j o k o r t t i a s i a k i r j o j e n + a j o k o r t t i a s i o i s s a + a j o k o r t t i d i r e k t i i v i + a j o k o r t t i d i r e k t i i v i n + a j o k o r t t i e n + a j o k o r t t i i n + a j o k o r t t i k a a n + a j o k o r t t i k o k e e s s a + a j o k o r t t i k o m i t e a n + a j o k o r t t i m a l l i + a j o k o r t t i m a l l i a + a j o k o r t t i m a l l i i n + a j o k o r t t i m a l l i n + a j o k o r t t i m a t k a i l u + a j o k o r t t i m e r k i n t ö j e n + a j o k o r t t i m m e + a j o k o r t t i n n e + a j o k o r t t i n s a + a j o k o r t t i s i + a j o k o r t t i s ä ä n n ö i k s i + a j o k o r t t i t i e t o j e n + a j o k o r t t i t u r i s m i + a j o k o r t t i t u r i s m i a + a j o k o r t t i t u r i s m i i n + a j o k o r t t i t u r i s m i n + a j o k o r t t i t u r i s m i n a + a j o k o r t t i v e r k o s t o n + a j o k o u l u t u k s e n + a j o k o u l u t u s + a j o k o u l u t u s t a + a j o k y k y ä + a j o k ä y t t ä y t y m i s e n + a j o k ä y t t ä y t y m i s e s t ä + a j o k ä y t t ä y t y m i s t ä + a j o k ä y t ö n + a j o l u p a + a j o l u p a a + a j o l u p i a + a j o l u p i e n + a j o l u v a n + a j o l u v a t + a j o l u v i s t a + a j o m a t k a + a j o m a t k a n + a j o m a t k o j a + a j o m i e s + a j o m u k a v u u d e s t a + a j o n a u t i n t o a + a j o n e s t o l a i t t e i t a + a j o n e u v o + a j o n e u v o a + a j o n e u v o a a n + a j o n e u v o a l a + a j o n e u v o a l a a + a j o n e u v o a l a l l a + a j o n e u v o a l a n + a j o n e u v o a l a t + a j o n e u v o d i r e k t i i v i ä + a j o n e u v o i l l a + a j o n e u v o i l l e + a j o n e u v o i s s a + a j o n e u v o i s t a + a j o n e u v o j a + a j o n e u v o j e n + a j o n e u v o j o n o j a + a j o n e u v o j ä r j e s t e l m i e n + a j o n e u v o k a n n a n + a j o n e u v o k a n n a s t a + a j o n e u v o k a n t a + a j o n e u v o k a n t a a + a j o n e u v o k a n t a a n + a j o n e u v o k a n t a n s a + a j o n e u v o k o h t a i n e n + a j o n e u v o k o h t a i s e s t i + a j o n e u v o k o m i t e a n + a j o n e u v o l i i k e n n e + a j o n e u v o l i i k e n n e t t ä + a j o n e u v o l i i k e n t e e n + a j o n e u v o l i i k e n t e e s t ä + a j o n e u v o l u o k a n + a j o n e u v o l u o k a t + a j o n e u v o l u o k i l l e + a j o n e u v o l u o k i s s a + a j o n e u v o l u o k k i a + a j o n e u v o l u o k k i e n + a j o n e u v o l u o k k i i n + a j o n e u v o m a k s u t + a j o n e u v o m a l l e i h i n + a j o n e u v o m i i n a a + a j o n e u v o m i i n a t + a j o n e u v o m i i n o i h i n + a j o n e u v o m i i n o i s t a + a j o n e u v o m i i n o j a + a j o n e u v o m i i n o j e n + a j o n e u v o m ä ä r i e n + a j o n e u v o n + a j o n e u v o n o m i s t a j a t + a j o n e u v o n o s t u r i + a j o n e u v o n v a l m i s t a j i e n + a j o n e u v o o n + a j o n e u v o p a i n o a + a j o n e u v o p o l i t i i k k a + a j o n e u v o p ä ä s t ö j e n + a j o n e u v o p ä ä s t ö t + a j o n e u v o r e k i s t e r e i d e n + a j o n e u v o r i k o l l i s u u d e n + a j o n e u v o r i k o l l i s u u t t a + a j o n e u v o s s a + a j o n e u v o s t a + a j o n e u v o s u k u p o l v i + a j o n e u v o s u u n n i t t e l u a + a j o n e u v o t + a j o n e u v o t e k n i i k a n + a j o n e u v o t e k n i i k a t + a j o n e u v o t e k n i i k k a + a j o n e u v o t e k n i i k k a a + a j o n e u v o t e k n o l o g i a n + a j o n e u v o t e o l l i s u u d e l l a + a j o n e u v o t e o l l i s u u d e l l e + a j o n e u v o t e o l l i s u u d e l t a + a j o n e u v o t e o l l i s u u d e l t a k i n + a j o n e u v o t e o l l i s u u d e n + a j o n e u v o t e o l l i s u u d e s s a + a j o n e u v o t e o l l i s u u d e s s a k i n + a j o n e u v o t e o l l i s u u s + a j o n e u v o t e o l l i s u u t e e n + a j o n e u v o t e o l l i s u u t t a + a j o n e u v o t e s t i + a j o n e u v o t i h e y d e n + a j o n e u v o t i h e y t t ä + a j o n e u v o t u o t a n n o n + a j o n e u v o t y y p e i l t ä + a j o n e u v o t y y p i n + a j o n e u v o t y y p i s t ä + a j o n e u v o t y y p i t + a j o n e u v o t y y p p e i h i n + a j o n e u v o t y y p p e j ä + a j o n e u v o t y y p p i i n + a j o n e u v o v a a t i m u k s i a + a j o n e u v o v a k u u t u k s i a + a j o n e u v o v a k u u t u s d i r e k t i i v i ä + a j o n e u v o v a k u u t u s j ä r j e s t e l m ä + a j o n e u v o v a l m i s t a j a t + a j o n e u v o v a l m i s t a j i a + a j o n e u v o v a l m i s t a j i l l e + a j o n e u v o v a l m i s t a j i s t a + a j o n e u v o v a r a u s t e n + a j o n e u v o v a r k a u d e t + a j o n e u v o v a r k a u k s i a + a j o n e u v o v a r k a u k s i e n + a j o n e u v o v a r k a u k s i s t a + a j o n e u v o v e r o + a j o n e u v o v e r o a + a j o n e u v o v e r o a a n + a j o n e u v o v e r o i l l e + a j o n e u v o v e r o i n a + a j o n e u v o v e r o j a + a j o n e u v o v e r o j a a n + a j o n e u v o v e r o j e n + a j o n e u v o v e r o k a n t o j a + a j o n e u v o v e r o n + a j o n e u v o v e r o s s a + a j o n e u v o v e r o s t a + a j o n e u v o v e r o t + a j o n e u v o v e r o t u k s e n + a j o n e u v o v e r o t u k s e s t a + a j o n e u v o v e r o t u s + a j o n e u v o v e r o t u s j ä r j e s t e l m ä ä + a j o n e u v o y h d i s t e l m i e n + a j o n e u v o y h d i s t e l m ä s t ä + a j o n o p e u d e t + a j o n o p e u s + a j o n o p e u t t a + a j o n v a k a u s j ä r j e s t e l m ä + a j o n v a k a u t u s j ä r j e s t e l m i e n + a j o n v a k a u t u s j ä r j e s t e l m ä + a j o n v a k a u t u s j ä r j e s t e l m ä l l ä + a j o n v a k a u t u s j ä r j e s t e l m ä n + a j o n v a k a u t u s j ä r j e s t e l m ä t + a j o p e l i + a j o p i i r t u r e i d e n + a j o p i i r t u r e i l l a + a j o p i i r t u r e i s t a + a j o p i i r t u r i + a j o p i i r t u r i a + a j o p i i r t u r i j ä r j e s t e l m ä n + a j o p i i r t u r i l a i n s ä ä d ä n t ö ä + a j o p i i r t u r i n + a j o p i i r t u r i s t a + a j o p i i r t u r i t o i m i t t a j a s t a + a j o p i i r t u r i v a a t i m u k s e t + a j o p i i r t u r i v a l m i s t a j a + a j o p u k u + a j o r a j o i t u k s i a + a j o r a j o i t u k s i s t a + a j o s i m u l a a t t o r i e n + a j o s y k l e j ä + a j o t a i t o + a j o t a i t o a + a j o t a p a + a j o t a p a a n + a j o t a p a a n s a + a j o t a p o i h i n + a j o t a p o j a + a j o t a p o j e n + a j o t a v a n + a j o t a v a s t a + a j o t i e t o a + a j o t i l a n t e i s s a + a j o t i l a n t e i t a + a j o t u n n e i s t a + a j o t u n n i t + a j o t u n t e j a + a j o t u n t i e n + a j o t u n t i r a j o i t u k s i l l a + a j o t u r v a l l i s u u d e n + a j o t u r v a l l i s u u t t a + a j o t u t k i n t o + a j o v a l m e n n u k s e e n + a j o v a l o i h i n + a j o v a l o j e n + a j o v a l o t + a j o v e r k k o + a j o v e r k k o i h i n + a j o v e r k k o j a + a j o v e r k k o j e n + a j o v e r k k o j e n k i n + a j o v e r k k o k a l a s t a j a t + a j o v e r k k o k a l a s t u k s e l l a + a j o v e r k k o k a l a s t u k s e n + a j o v e r k k o k a l a s t u k s e s t a + a j o v e r k k o k a l a s t u s + a j o v e r k k o k a l a s t u s k i e l l o s t a + a j o v e r k k o k a l a s t u s t a + a j o v e r k k o k i e l l o n + a j o v e r k k o k i e l l o s t a + a j o v e r k k o k i e l t o + a j o v e r k k o k i e l t o a + a j o v e r k k o k y s y m y k s e e n + a j o v e r k o i l l a + a j o v e r k o i s t a + a j o v e r k o l l a + a j o v e r k o n + a j o v e r k o t + a j o v o i m a n + a j o v ä s y m y k s e n + a k a a s i a k e r t t u + a k a a s i a k u h a n k e i t t ä j ä + a k a a s i a l e p i n k ä i n e n + a k a a s i a t ö p ö s i e p p o + a k a a s i a v a h a n o k k a + a k a a s i a v a r p u s p ö l l ö + a k a a t t i k o t i l o + a k a n o i s t a + a k a n s i e n i + a k a t e e m i k k o r y h m ä n + a k a t e e m i s e l l a + a k a t e e m i s e m p i + a k a t e e m i s e n + a k a t e e m i s e s s a + a k a t e e m i s e t + a k a t e e m i s i a + a k a t e e m i s i s s a + a k a t e e m i s i s t a + a k a t e e m i s t a + a k a t e m i a a + a k a t e m i a n + a k a t e m i a s e u r a + a k a t e m i a t a l o + a k h a t + a k i l l e e n k a n t a p ä ä n ä + a k k r e d i t o i n t i e l i m e n + a k k r e d i t o i n t i e l i m e t + a k k r e d i t o i n t i e l i m i ä + a k k r e d i t o i n t i e l i n t e n + a k k r e d i t o i n t i j ä r j e s t e l m i e n + a k k r e d i t o i n t i j ä r j e s t e l m ä n + a k k r e d i t o i n t i j ä r j e s t e l m ä ä + a k k r e d i t o i n t i j ä r j e s t e l y i l l e + a k k r e d i t o i n t i l o m a k e + a k k r e d i t o i n t i m e n e t t e l y n + a k k r e d i t o i n t i o h j e l m a + a k k r e d i t o i n t i s ä ä n t e l y + a k k r e d i t o i n t i t o i m i e l i m i ä + a k k r e d i t o i n t i v i r a s t o j e n + a k k u a l a + a k k u j a + a k k u j e n + a k k u j e n k ä s i t t e l y l a i t o s t a + a k k u t e k n i i k a n + a k k u t e k n i i k a s t a + a k k u t e k n i i k k a a + a k k u t e k n o l o g i a n + a k m e i s m i + a k r o b a t i a a + a k r o b a t i a n + a k r o b a t i a v o i m i s t e l u + a k r y y l i a m i d i a + a k r y y l i a m i d i h ä l y t y k s e s t ä + a k r y y l i a m i d i m y r k y t y s + a k r y y l i a m i d i n + a k r y y l i a m i d i p i t o i s u u s + a k r y y l i h a p p o + a k r y y l i l a s i a + a k r y y l i n i t r i i l i b u t a d i e e n i s t y r e e n i + a k r y y l i v ä r i + a k s e l i a i k a + a k s e l i n l a s k i j a + a k s e l i p a i n o + a k s e l i t + a k s e l i v a l l a t + a k s e l i v a l t o j a + a k t i a + a k t i i v i a i n e i d e n + a k t i i v i e l ä m ä ä n + a k t i i v i h i i l i + a k t i i v i j o u k o n + a k t i i v i j ä s e n e n ä + a k t i i v i j ä s e n i e n + a k t i i v i j ä s e n i ä + a k t i i v i j ä s e n t e n + a k t i i v i k a i k u l u o t a i m e t + a k t i i v i k a i k u l u o t a i n t e n + a k t i i v i k a i u t i n + a k t i i v i l i e t e m e n e t e l m ä + a k t i i v i s e e n + a k t i i v i s e k s i + a k t i i v i s e l l e + a k t i i v i s e m m a k s i + a k t i i v i s e m m a l l a + a k t i i v i s e m m a l l e + a k t i i v i s e m m a n + a k t i i v i s e m m a s s a + a k t i i v i s e m m a s t a + a k t i i v i s e m m a t + a k t i i v i s e m m i k s i + a k t i i v i s e m m i s t a + a k t i i v i s e m p a a + a k t i i v i s e m p a a n + a k t i i v i s e m p a n a + a k t i i v i s e m p i + a k t i i v i s e m p i a + a k t i i v i s e n + a k t i i v i s e n a + a k t i i v i s e s s a + a k t i i v i s e s t a + a k t i i v i s e t + a k t i i v i s i a + a k t i i v i s i k s i + a k t i i v i s i l l a + a k t i i v i s i l l e + a k t i i v i s i m m a t + a k t i i v i s i m m i k s i + a k t i i v i s i m m i n + a k t i i v i s i m m i s t a + a k t i i v i s i m p i a + a k t i i v i s i m p i e n + a k t i i v i s i m p i i n + a k t i i v i s i n + a k t i i v i s i n a + a k t i i v i s i s s a + a k t i i v i s t e n + a k t i i v i s u u d e l l a + a k t i i v i s u u d e s t a + a k t i i v i s u u s p i t o i s u u k s i s t a + a k t i i v i s u u s t a s o + a k t i i v i s u u t e e n + a k t i i v i s u u t t a + a k t i i v i v i l j e l i j ä + a k t i i v i v i l j e l i j ö i d e n + a k t i i v i v i l j e l i j ö i l l e + a k t i i v i v ä e s t ö l l e + a k t i i v i v ä e s t ö n + a k t i i v i v ä e s t ö s t ä + a k t i i v i v ä e s t ö ä + a k t i i v i v ä e s t ö ö n + a k t i v i s t e j a + a k t i v i s t i e n + a k t i v i s t i j ä r j e s t ö j e n + a k t i v i s t i k s i + a k t i v i s t i l a i v a l t a + a k t i v i s t i l i i k k e i s s ä + a k t i v i s t i t + a k t i v i s t i v ä h e m m i s t ö n + a k t i v i t e e t t i k a a v i o + a k t i v o i m i s e k s i + a k t i v o i n t i e n e r g i a + a k t i v o i n t i j ä r j e s t e l m i e n + a k t i v o i n t i m a k s u + a k t i v o i n t i o h j e l m i l l a + a k t i v o i n t i p r o s e s s i i n + a k t i v o i n t i v ä l i n e i s i i n + a k t i v o i t a v a + a k t i v o i t u e s s a a n + a k u i s t a + a k u p u n k t i o p i s t e + a k u s t i i k k a l e v y + a k u s t o n v a l v o n t a j ä r j e s t e l m ä + a k u u t i m m a k s i + a k u u t i m m i k s i + a k u u t i m p i + a k u u t i m p i a + a k u u t i m p i i n + a k u u t t i e n + a k u u t t i f a a s i p r o t e i i n i n + a k u u t t i h o i t o o n + a k v a a r i o k a l a k s i + a k v a a r i o k a l o i s t a + a k v a v i i t i n + a l a a m m e + a l a a n + a l a a n i + a l a a n n e + a l a d i r e k t i i v i + a l a d i r e k t i i v i n + a l a d i r e k t i i v i s s ä + a l a d i r e k t i i v i ä + a l a h u o n e + a l a h u o n e e l l e + a l a h u o n e e n + a l a h u o n e e s e e n + a l a h u o n e e s s a + a l a h u o n e t t a + a l a i h m i s t e n + a l a i k ä i n e n + a l a i k ä i s e t + a l a i k ä i s i i n + a l a i k ä i s i l l e + a l a i k ä i s i s t ä + a l a i k ä i s i ä + a l a i k ä i s t e n + a l a i k ä r a j a a + a l a i k ä r a j a l u o k i t t e l u + a l a i k ä r a j a n + a l a i k ä r a j a s s a + a l a i l m a k e h ä n + a l a i n + a l a i s e l l e + a l a i s e m m a n k i n + a l a i s e m m a s t a + a l a i s e m m i n + a l a i s e m p a a + a l a i s e m p i + a l a i s e m p i a + a l a i s e n + a l a i s e n a + a l a i s e s t i + a l a i s e t + a l a i s i a + a l a i s s a a r i + a l a i s t a + a l a i s u u d e s s a + a l a j ä r j e s t ö j e n + a l a j ä r j e s t ö t + a l a k a t t o a + a l a k o h d a k s i + a l a k o h d a l l a + a l a k o h d a n + a l a k o h d a s s a + a l a k o h d a s t a + a l a k o h t a + a l a k o h t a i n e n + a l a k o h t a i s e e n + a l a k o h t a i s e l l a + a l a k o h t a i s e m m a k s i + a l a k o h t a i s e m m a l l a + a l a k o h t a i s e n + a l a k o h t a i s e s t a + a l a k o h t a i s e s t i + a l a k o h t a i s e s t i k i n + a l a k o h t a i s e t + a l a k o h t a i s i a + a l a k o h t a i s i a k i n + a l a k o h t a i s i i n + a l a k o h t a i s i l l a + a l a k o h t a i s i m p i e n + a l a k o h t a i s i n a + a l a k o h t a i s i s t a + a l a k o h t a i s t a + a l a k o h t a i s t e n + a l a k o h t i e n + a l a k o m i t e a + a l a k o m i t e a a + a l a k o m i t e a n + a l a k o m i t e a n i + a l a k o m i t e a s t a + a l a k o m i t e a t + a l a k o u l u + a l a k o u l u i h i n + a l a k o u l u n + a l a k o u l u s s a + a l a k o u l u s t a + a l a k u l o i s u u d e s t a + a l a l a j i a + a l a l a j i n + a l a l l a + a l a l l a k i n + a l a l l e + a l a l t a + a l a l u o k a l l e + a l a l u o k a n + a l a l u o k k a a + a l a l u o k k a a n + a l a l u o k k a n a + a l a m a i s i a a n + a l a m a r k k i n o i t a + a l a m m e + a l a m m e k o + a l a m o m e n t t i + a l a m ä k e e n + a l a m ä k i a j o + a l a m ä k i l u i s t e l u + a l a m ä ä r i t e l m i ä + a l a n i + a l a n i m i k k e e n + a l a n k o k e t s a a l i + a l a n k o k i r j o m o n a r k k i + a l a n k o l o i s t o t i m a l i + a l a n k o m a a l a i s e n + a l a n k o m a a l a i s e n a + a l a n k o m a a l a i s e t + a l a n k o m a a l a i s i a + a l a n k o m a a l a i s i l l e + a l a n k o m a a l a i s i s t a + a l a n k o m a a l a i s t a + a l a n k o m a a l a i s t e n + a l a n k o m a a t + a l a n k o m a i d e n + a l a n k o m a i h i n + a l a n k o m a i l l a + a l a n k o m a i l t a + a l a n k o m a i s s a + a l a n k o m a i t a + a l a n k o m e t s ä t + a l a n k o t r o g o n i + a l a n s a + a l a o h j e l m a + a l a o h j e l m i a + a l a o h j e l m i e n + a l a o h j e l m i i n + a l a o h j e l m i l l a + a l a o h j e l m i s t a + a l a o n t t o l a s k i m o + a l a o r g a n i s a a t i o t + a l a o s a s t o o n + a l a o t s a k e + a l a o t s a k k e e s e e n + a l a o t s a k k e e s t a + a l a o t s a k k e i d e n + a l a o t s i k k o a + a l a o t s i k k o j a + a l a o t s i k k o o n + a l a o t s i k o l l a + a l a o t s i k o s s a + a l a r a a j o i s t a a n + a l a r a j a + a l a r a j a a + a l a r a j a n + a l a r a j a t + a l a r a j o i n e e n + a l a r a j o j a + a l a r a j o j e n + a l a r y h m i e n + a l a r y h m i l l ä + a l a r y h m i ä + a l a r y h m ä + a l a r y h m ä m m e + a l a r y h m ä n + a l a s a k s a + a l a s a k s i l a i n e n + a l a s e k t o r e i h i n + a l a s e l ä n + a l a s k i r j a u k s e t + a l a s o p i m u k s i a + a l a s p ä i s i l l ä + a l a s t a + a l a s t a a n + a l a s t o m i e n + a l a t a s o l l e + a l a t a s o n + a l a t a v o i t e + a l a t a v o i t t e e n + a l a t o i m e a + a l a t o i m i a l o j a + a l a t u k e a + a l a t u k i + a l a t u k i a + a l a t y y p i n + a l a t y ö r y h m ä ä + a l a v a l i o k u n n a n + a l a v a n + a l a v a n o s i l l e + a l a v a n o s i n + a l a v a t + a l a v i e n + a l a v i i t t e i t ä + a l a v i l t a + a l a y k s i k ö i d e n + a l a y k s i k ö i t ä + a l b a a n e i l l e + a l b a a n e i s t a + a l b a a n i a l u e + a l b a a n i e n + a l b a a n i e n e m m i s t ö + a l b a a n i e n e m m i s t ö l t ä + a l b a a n i e n e m m i s t ö n + a l b a a n i e n e m m i s t ö ä + a l b a a n i h e n k i l ö s t ö n + a l b a a n i j o h t a j a + a l b a a n i j o h t a j a t + a l b a a n i j o h t o + a l b a a n i k a n s a l a i s t e n + a l b a a n i k i r j a i l i j a + a l b a a n i l ä h t e i d e n + a l b a a n i m a a h a n m u u t t a j a + a l b a a n i m a f i a + a l b a a n i m u s l i m e j a + a l b a a n i m u s l i m i t + a l b a a n i n k i e l i s e l l e + a l b a a n i o n g e l m a + a l b a a n i o s a p u o l e e n + a l b a a n i o s a s s a + a l b a a n i p a k o l a i s t e n + a l b a a n i p o l i i t i k k o j a + a l b a a n i p o l i i t i k o l t a + a l b a a n i p o t i l a i d e n + a l b a a n i p u o l i + a l b a a n i p u o l u e e n + a l b a a n i p u o l u e i d e n + a l b a a n i p u o l u e i t a + a l b a a n i r y h m ä t + a l b a a n i s i s s i + a l b a a n i s i v i i l e j ä + a l b a a n i s o t i l a a t + a l b a a n i t + a l b a a n i t e r r o r i s t i t + a l b a a n i t o i m i t t a j a + a l b a a n i v a n k e j a + a l b a a n i v a n k i e n + a l b a a n i v i r a n o m a i s t e n + a l b a a n i v ä e s t ö + a l b a a n i v ä e s t ö l l e + a l b a a n i v ä e s t ö n + a l b a a n i v ä e s t ö ä + a l b a a n i v ä e s t ö ö n + a l b a a n i v ä h e m m i s t ö + a l b a a n i v ä h e m m i s t ö j e n + a l b a a n i v ä h e m m i s t ö l l e + a l b a a n i v ä h e m m i s t ö l l ä + a l b a a n i v ä h e m m i s t ö n + a l b a a n i v ä h e m m i s t ö ä + a l b a a n i v ä h e m m i s t ö ö n + a l b a a n i y h t e i s ö l l e + a l b a a n i y h t e i s ö n + a l b a a n i y h t e i s ö ä + a l b a a n i ä ä r i a i n e k s e t + a l b a a n i ä ä r i a i n e s t e n + a l b a a n i ä ä r i m m ä i s a i n e s t e n + a l b a n i a a + a l b a n i a a n + a l b a n i a l a i s e t + a l b a n i a l a i s i a + a l b a n i a l a i s i s t a + a l b a n i a l a i s l i i k k e e n + a l b a n i a l a i s m a a k u n n a n + a l b a n i a l a i s p e r h e e n + a l b a n i a l a i s t a + a l b a n i a l a i s t e r r o r i s t i e n + a l b a n i a l a i s v ä e s t ö n + a l b a n i a l a i s v ä e s t ö ä + a l b a n i a l a i s v ä h e m m i s t ö + a l b a n i a l a i s v ä h e m m i s t ö n + a l b a n i a l a i s v ä h e m m i s t ö ä + a l b a n i a l a i s y h t e i s ö n + a l b a n i a l l a + a l b a n i a l l e + a l b a n i a n + a l b a n i a n k i e l i n e n + a l b a n i a n k i e l i s e l l e + a l b a n i a n k i e l i s e n + a l b a n i a n k i e l i s e t + a l b a n i a n k i e l i s i i n + a l b a n i a n k i e l i s i l l e + a l b a n i a n k i e l i s t e n + a l b a n i a n k i e l i s t ä + a l b a n i a s s a + a l b a n i a s s a k i n + a l b a n i a s t a + a l b a t r o s s i + a l b i g e n s s i r i s t i r e t k i + a l b i i n o j a + a l b i i n o j ä s e n + a l b i i n o j ä s e n e k s i + a l b i i n o l a s t e n + a l b i i n o m u r h i e n + a l b i i n o m u r h i s t a + a l b i i n o n a i s e t + a l b i i n o v ä e s t ö ä + a l b i i n o y h d i s t y s + a l b u m i l i s t a + a l d o l i a d d i t i o + a l d o l i k o n d e n s a a t i o + a l e m a n n i m u r t e e t + a l e m m a l l a + a l e m m a n + a l e m m a t + a l e m m i l l a + a l e m m i l l e + a l e m m u u d e n t u n n e + a l e m m u u d e n t u n n e t t a + a l e m m u u d e n t u n t e e s t a + a l e m m u u s k o m p l e k s e j a + a l e m m u u s k o m p l e k s i + a l e m m u u s k o m p l e k s i a + a l e m m u u s k o m p l e k s i n + a l e m m u u s k o m p l e k s i s t a + a l e m p i a + a l e m p i a r v o i n e n + a l e n e m i s a s t e + a l e n n e i s t a + a l e n n e t a + a l e n n e t a a n + a l e n n e t t a i s i i n + a l e n n e t t a v a + a l e n n e t t u a + a l e n n e t t u i h i n + a l e n n e t t u j a + a l e n n e t t u j e n + a l e n n e t t u u n + a l e n n e t u i n + a l e n n e t u i s t a + a l e n n e t u l l a + a l e n n e t u n + a l e n n e t u s t a + a l e n n e t u t + a l e n n u k s e n + a l e n n u k s e s t a + a l e n n u k s e t + a l e n n u s e h t o i h i n + a l e n n u s h i n t a i s e n + a l e n n u s h i n t a i s i a + a l e n n u s h i n t o j a + a l e n n u s h i n t o j e n + a l e n n u s j ä r j e s t e l m i ä + a l e n n u s j ä r j e s t e l m ä n + a l e n n u s l o m a k l u b i e n + a l e n n u s l o m a k l u b i t + a l e n n u s m y y n t i e n + a l e n n u s m y y n t i u u d i s t u k s i a + a l e n n u s p o l i t i i k a s s a a n + a l e n n u s s i t o u m u k s i a + a l e n n u s s i t o u m u s t e n + a l e n n u s t i l a + a l e n n u s t u o t t e i t a + a l e n n u s v a i h d e + a l e n t a a + a l e n t a i s i + a l e n t a i s i v a t + a l e n t a k a a m m e + a l e n t a m a a n + a l e n t a m a l l a + a l e n t a m a t t a + a l e n t a m i s e e n + a l e n t a m i s e k s i + a l e n t a m i s e s t a + a l e n t a m i s t a + a l e n t a m i s t a v o i t t e e t + a l e n t a n u t + a l e n t a v a l l a + a l e n t a v a l t a + a l e n t a v a t + a l e n t a v i a + a l e n t a v i e n + a l e n t u n e i d e n + a l e n t u n u t + a l e t a a n + a l e t a a n p a + a l e t t a e s s a + a l e t t a v a + a l e t t i i n + a l e t t u + a l e t t u a + a l e t t u a a n + a l e u t i t + a l e u t t i e n t i i r a + a l f a e t y y l i t r y p t a m i i n i + a l f a h a j o a m i n e n + a l f a h a p p o p i t o i s u u s + a l f a h a p p o t u o t a n t o + a l f a h i u k k a n e n + a l f a k e t o g l u t a a r i h a p p o + a l f a l a k t a l b u m i i n i + a l f a l i n o l e e n i h a p p o + a l f a m e t y y l i d o p a m i i n i + a l f a m e t y y l i t r y p t a m i i n i + a l f a m o t o n e u r o n i + a l f a r e a k t i o + a l f a s a l p a a j a + a l f a s e k r e t a a s i + a l f a s ä t e e t + a l f a s ä t e i l y l l ä + a l f a s ä t e i l y ä + a l f a t o k s i i n i + a l g e r i a l a i s e e n + a l g e r i a l a i s e s s a + a l g e r i a l a i s i a + a l g e r i a l a i s n a i s i l l e + a l g e r i a l a i s y h t e i s k u n n a n + a l g o n k i n i t + a l g o r i t m i a + a l h a i s e e n + a l h a i s e k s i + a l h a i s e l l a + a l h a i s e l t a + a l h a i s e m m a k s i + a l h a i s e m m a l l a + a l h a i s e m m a n + a l h a i s e m m a s t a + a l h a i s e m m a t + a l h a i s e m m i k s i + a l h a i s e m m i l l a + a l h a i s e m m i s t a + a l h a i s e m p a a + a l h a i s e m p a a n + a l h a i s e m p i + a l h a i s e m p i a + a l h a i s e m p i i n + a l h a i s e m p i n a + a l h a i s e n + a l h a i s e n a + a l h a i s e s s a + a l h a i s e s t a + a l h a i s e t + a l h a i s i a + a l h a i s i i n + a l h a i s i k s i + a l h a i s i m m a n + a l h a i s i m m a s t a + a l h a i s i m m a t + a l h a i s i m m i l l a a n + a l h a i s i m m i s t a + a l h a i s i m p i a + a l h a i s i n + a l h a i s i n a + a l h a i s t a + a l i a r v i o i d a + a l i a r v i o i d a a n + a l i a r v i o i k o + a l i a r v i o i m a t t a + a l i a r v i o i m i s t a + a l i a r v i o i n n i s t a + a l i a r v o s t e t a a n + a l i a r v o s t e t t u a + a l i a r v o s t e t t u j a + a l i a r v o s t u s t a a n + a l i a s u t u l l e + a l i b e i h i n + a l i b i n + a l i b i n a + a l i b i p o l i t i i k k a a + a l i e d u s t e t t u + a l i e d u s t e t t u a + a l i e d u s t e t t u i n a + a l i e d u s t e t t u j a + a l i e d u s t e t t u j e n + a l i e d u s t e t t u n a + a l i e d u s t e t u i l l e + a l i e d u s t e t u l l e + a l i e d u s t e t u n + a l i e d u s t u k s e n + a l i e d u s t u k s e s t a + a l i e d u s t u k s e s t a a n + a l i e d u s t u s + a l i e d u s t u s t a + a l i h a n k i n n a n + a l i h a n k i n n a s t a + a l i h a n k i n t a + a l i h a n k i n t a a + a l i h a n k i n t a a n + a l i h a n k i n t a k e t j u i s s a a n + a l i h a n k i n t a k e t j u j e n + a l i h a n k i n t a k e t j u u n + a l i h a n k i n t a n a + a l i h a n k i n t a p r o s e s s e i s s a + a l i h a n k i n t a p r o s e s s i n + a l i h a n k i n t a s o p i m u s t e n + a l i h a n k i n t a t e o l l i s u u d e l l e + a l i h a n k i n t a t e o l l i s u u s + a l i h a n k i n t a t y ö n ä + a l i h a n k i n t a v e l v o i t t e e n + a l i h a n k i n t a v e l v o i t t e e s t a + a l i h a n k i n t a v e l v o l l i s u u d e n + a l i h a n k i n t a y h t i ö t + a l i h a n k i n t a y r i t y k s i l l ä + a l i h a n k i n t a y r i t y k s i ä + a l i h a n k i n t a y r i t y s t e n + a l i h a n k k i j a + a l i h a n k k i j a a n + a l i h a n k k i j a k e t j u a + a l i h a n k k i j a k e t j u n + a l i h a n k k i j a n + a l i h a n k k i j a n s a + a l i h a n k k i j a t + a l i h a n k k i j a y r i t y k s e t + a l i h a n k k i j a y r i t y k s i s s ä + a l i h a n k k i j a y r i t y k s i ä + a l i h a n k k i j a y r i t y s + a l i h a n k k i j a y r i t y s t e n + a l i h a n k k i j o i d e n + a l i h a n k k i j o i l l e + a l i h a n k k i j o i l t a + a l i h a n k k i j o i n a + a l i h a n k k i j o i t a + a l i h a n k k i j o i t a a n + a l i h i n t a a n + a l i h i n t a i s i a + a l i h y ö d y n t ä m i s e e n + a l i j ä m ä ä + a l i j ä ä m i e n + a l i j ä ä m i s t ä + a l i j ä ä m i ä + a l i j ä ä m ä + a l i j ä ä m ä a r v i o i s t a + a l i j ä ä m ä i n d i k a a t t o r i i n + a l i j ä ä m ä i n e n + a l i j ä ä m ä i s e e n + a l i j ä ä m ä i s e s t ä + a l i j ä ä m ä i s t e n + a l i j ä ä m ä k r i t e e r i + a l i j ä ä m ä l a s k e l m i e n + a l i j ä ä m ä l a s k e l m i s t a + a l i j ä ä m ä l l e + a l i j ä ä m ä l l ä + a l i j ä ä m ä m e n e t t e l y s t ä + a l i j ä ä m ä n + a l i j ä ä m ä n s ä + a l i j ä ä m ä r a j a a + a l i j ä ä m ä r a j a s t a + a l i j ä ä m ä r a j o i s s a + a l i j ä ä m ä r a j o j e n + a l i j ä ä m ä s t ä + a l i j ä ä m ä s t ä m m e + a l i j ä ä m ä s u h t e e n + a l i j ä ä m ä t + a l i j ä ä m ä t a a k a s t a + a l i j ä ä m ä t a s o a + a l i j ä ä m ä t a s o i l l a + a l i j ä ä m ä t a s o m m e + a l i j ä ä m ä t a s o n + a l i j ä ä m ä t a v o i t t e i t a + a l i j ä ä m ä t i l a n n e + a l i j ä ä m ä v a a t i m u s t a + a l i j ä ä m ä v a l t i o i s s a + a l i j ä ä m ä ä + a l i j ä ä m ä ä n + a l i j ä ä m ä ä n s ä + a l i k e h i t t y n e e n + a l i k e h i t t y n e e s t ä + a l i k e h i t t y n e e t + a l i k e h i t t y n e i d e n + a l i k e h i t t y n e i l l e + a l i k e h i t t y n e i m m ä n + a l i k e h i t t y n e i m p i e n + a l i k e h i t t y n e i m p i ä + a l i k e h i t t y n e i n ä + a l i k e h i t t y n e i s t ä + a l i k e h i t t y n e i s y y d e n + a l i k e h i t t y n e i s y y d e s t ä + a l i k e h i t t y n e i s y y d e s t ä ä n + a l i k e h i t t y n e i s y y t e e n + a l i k e h i t t y n e i s y y t t ä + a l i k e h i t t y n e i t ä + a l i k e h i t t y n y t + a l i k e h i t y k s e n + a l i k e h i t y s + a l i k o m i t e o i d e n + a l i k o m i t e o i s s a + a l i k o u l u t e t t u j a + a l i k r i i t t i s e t + a l i k r i i t t i s i s t ä + a l i k u l u t u k s e n + a l i k u l u t u s + a l i k ä y t e t t y j ä + a l i k ä y t t ö + a l i k ä y t t ö ä + a l i k ä y t ö n + a l i k ä y t ö s s ä + a l i k ä y t ö s t ä + a l i m i e h i t y k s e l l ä + a l i m i l l i m e t r i a l u e + a l i m i l l i m e t r i s ä t e i l y + a l i m i t o i t e t t u + a l i m m a s t a + a l i m m i l l a a n + a l i m p i a + a l i o i k e u s + a l i o i k e u s k i n + a l i p a i n e e l l a + a l i p a i n e h o i t o + a l i p a l k a t t u a + a l i p a l k a t t u j a + a l i p a l k a t t u j e n + a l i p a l k a t u s s a + a l i p ä ä s t ö s u o d a t i n + a l i r a h o i t e t t u + a l i r a h o i t e t t u a + a l i r a h o i t e t t u j a + a l i r a h o i t e t t u n a + a l i r a h o i t u k s e e n + a l i r a p o r t o i n n i n + a l i r a v i t s e m u k s e e n + a l i r a v i t s e m u k s e s t a + a l i r a v i t s e m u s + a l i r a v i t s e m u s o n g e l m a a + a l i r a v i t t u a + a l i r a v i t t u j a + a l i r a v i t t u j e n + a l i r y h m ä + a l i s t a a + a l i s t a a k s e e n + a l i s t a i s i t t e + a l i s t a m a a n + a l i s t a m i s t a + a l i s t a n + a l i s t a v i e n + a l i s t e t a a n + a l i s t e t t a v a n + a l i s t e t t u j a + a l i s t u a + a l i s t u m i s e n + a l i s t u m i s e s t a + a l i s t u n e e n s a + a l i s t u s o h j e l m a + a l i s t u s s u h d e + a l i s u o r i u t u j i i n + a l i t a j u n t a a n + a l i t o t e u t u k s e n + a l i t t a a + a l i t t a v a t + a l i t u i s t a + a l i t u o t a n t o a + a l i t y ö l l i s t e t y t + a l i t y ö l l i s y y d e s t ä + a l i t y ö l l i s y y s o n g e l m a + a l i u p s e e r i + a l i u p s e e r i a + a l i u r a k o i n n i n + a l i u r a k o i n t i k e t j u j e n + a l i u r a k o i n t i s u h t e i s s a + a l i u r a k o i t s i j a l l e + a l i u r a k o i t s i j a n + a l i u r a k o i t s i j a t + a l i u r a k o i t s i j o i s t a + a l i v a l i o k u n n a l l e + a l i v a l i o k u n n a n + a l i v a l i o k u n n a s s a + a l i v a l i o k u n n a s t a + a l i v a l i o k u n n i s s a + a l i v a l i o k u n t a + a l i v a l i o k u n t a a + a l i v a l i o k u n t a a n + a l i v a l t i o s i h t e e r i + a l i v a l t i o s i h t e e r i n + a l i v a r u s t e t t u + a l k a a + a l k a a k s e m m e + a l k a e s s a + a l k a e s s a k i n + a l k a e s s a m m e + a l k a i s i + a l k a i s i n + a l k a i s i v a t + a l k a k a a m m e + a l k a l i a l a l l a + a l k a l i h y d r o l y y s i ä + a l k a l i m e t a l l i + a l k a l i p a r i s t o + a l k a m a a n + a l k a m a i s i l l a a n + a l k a m a s s a + a l k a m i s a i k a + a l k a m i s a j a n k o h d a k s i + a l k a m i s a j a n k o h d a n + a l k a m i s a j a n k o h t i e n + a l k a m i s a j o i s t a + a l k a m i s p ä i v ä k s i + a l k a m i s p ä i v ä m ä ä r i ä + a l k a m i s p ä i v ä m ä ä r ä ä + a l k a m i s p ä i v ä n + a l k a m i s p ä i v ä n ä + a l k a m i s p ä i v ä ä + a l k a m i s t a + a l k a n e e n + a l k a n e e s s a + a l k a n e e t + a l k a n e e t k a a n + a l k a n u t + a l k a n u t k a a n + a l k a n u t k i n + a l k a n u t t a + a l k a v a a + a l k a v a a n + a l k a v a k s i + a l k a v a l l e + a l k a v a n + a l k a v a t + a l k a v i e n + a l k a v i i n + a l k e e l l i s e l l a + a l k e e l l i s i m m a n k i n + a l k e e l l i s i m m a s s a k i n + a l k e e l l i s i m m a t k i n + a l k e e l l i s i m m i s t a k a a n + a l k e e l l i s i m p i a + a l k e e l l i s i m p i a k a a n + a l k e e l l i s i m p i a k i n + a l k e e l l i s i m p i e n k i n + a l k e e l l i s i n t a + a l k e e l l i s i n t a k a a n + a l k e e t + a l k e i s f u n k t i o + a l k e i s h i u k k a n e n + a l k e i s k o u l u t u s t a + a l k e i s m a t r i i s i + a l k e i s o p e t u k s e s s a + a l k e i s o p e t u s t a + a l k e i s r e a k t i o + a l k e i s v a r a u s + a l k i o a i n e k s e n + a l k i o d i a g n o s o i n t i + a l k i o d i a g n o s t i s e t + a l k i o i d e n + a l k i o i s t a + a l k i o i t a + a l k i o k a n t a s o l u t u t k i m u k s e s s a + a l k i o k a n t a s o l u t u t k i m u s t a + a l k i o k u d o s t a + a l k i o l e v y + a l k i o l i n j o i s t a + a l k i o n + a l k i o n a + a l k i o n a k i n + a l k i o s o l u j e n + a l k i o t + a l k i o t e r a p i o i l l a + a l k i o t u t k i m u k s e e n + a l k i o t u t k i m u k s e l l a + a l k i o t u t k i m u k s e n + a l k i o t u t k i m u k s e s t a + a l k i o t u t k i m u k s e t + a l k i o t u t k i m u s + a l k i o t u t k i m u s t a + a l k i o v a i h e e s s a + a l k o h o l e i h i n + a l k o h o l i a + a l k o h o l i a i s t i h a r h a i s u u s + a l k o h o l i a l a l l a + a l k o h o l i a l a n + a l k o h o l i a l t i s t u k s e s t a + a l k o h o l i a l t i s t u m i s e e n + a l k o h o l i h a i t a t + a l k o h o l i h a i t o i s t a + a l k o h o l i h a i t t o j a + a l k o h o l i h a i t t o j e n + a l k o h o l i h e p a t i i t t i + a l k o h o l i i n + a l k o h o l i j u o m a + a l k o h o l i j u o m a a + a l k o h o l i j u o m a m a r k k i n o i d e n + a l k o h o l i j u o m a p u l l o i h i n + a l k o h o l i j u o m a t + a l k o h o l i j u o m a t e o l l i s u u s + a l k o h o l i j u o m a t y y p p i + a l k o h o l i j u o m i a + a l k o h o l i j u o m i e n + a l k o h o l i j u o m i i n + a l k o h o l i j u o m i k s i + a l k o h o l i j u o m i l l a + a l k o h o l i j u o m i l l e + a l k o h o l i j u o m i s s a + a l k o h o l i j u o m i s t a + a l k o h o l i k a r d i o m y o p a t i a + a l k o h o l i k i e l t o a + a l k o h o l i k u o l e m i i n + a l k o h o l i k y s y m y k s e e n + a l k o h o l i k ä y m i s e n + a l k o h o l i k ä y t ö n + a l k o h o l i l l a + a l k o h o l i l t a + a l k o h o l i l u k o t + a l k o h o l i m a i n o n n a s t a + a l k o h o l i m a i n o n t a + a l k o h o l i m a k s a s a i r a u s + a l k o h o l i m a r k k i n a t + a l k o h o l i m a r k k i n o i d e n + a l k o h o l i m a r k k i n o i s t a + a l k o h o l i m a r k k i n o i t a + a l k o h o l i m e r k i n t ö j ä + a l k o h o l i m i t t a r e i s t a + a l k o h o l i m i t t a r i t + a l k o h o l i m o n o p o l i + a l k o h o l i m o n o p o l i a + a l k o h o l i m o n o p o l i i n + a l k o h o l i m o n o p o l i l l e + a l k o h o l i m o n o p o l i n + a l k o h o l i m o n o p o l i s t a + a l k o h o l i m y r k y t y k s e e n + a l k o h o l i m ä ä r ä + a l k o h o l i m ä ä r ä l l e + a l k o h o l i m ä ä r ä n + a l k o h o l i n + a l k o h o l i n i m i k k e i d e n + a l k o h o l i n k u l u t u k s e e n + a l k o h o l i n k u l u t u k s e n + a l k o h o l i n k u l u t u s + a l k o h o l i n k u l u t u s t a + a l k o h o l i n k ä y t t ö + a l k o h o l i n k ä y t t ö ä + a l k o h o l i n k ä y t t ö ö n + a l k o h o l i n k ä y t ö l t ä + a l k o h o l i n k ä y t ö n + a l k o h o l i n k ä y t ö s t ä + a l k o h o l i n t u o t a n t o m ä ä r ä t + a l k o h o l i n t u o t t a j i e n + a l k o h o l i o i r e y h t y m ä + a l k o h o l i o i r e y h t y m ä s t ä + a l k o h o l i o i r e y h t y m ä ä + a l k o h o l i o n g e l m a + a l k o h o l i o n g e l m a a + a l k o h o l i o n g e l m a s t a + a l k o h o l i o n g e l m a t + a l k o h o l i o n g e l m i a + a l k o h o l i p i t o i s u u d e l l a + a l k o h o l i p i t o i s u u d e n + a l k o h o l i p i t o i s u u d e s s a + a l k o h o l i p i t o i s u u d e s t a + a l k o h o l i p i t o i s u u k s i a + a l k o h o l i p i t o i s u u k s i e n + a l k o h o l i p i t o i s u u s + a l k o h o l i p i t o i s u u s r a j a t + a l k o h o l i p i t o i s u u t e e n + a l k o h o l i p i t o i s u u t t a + a l k o h o l i p o l i i t t i s e t + a l k o h o l i p o l i t i i k a n + a l k o h o l i p o l i t i i k a s s a + a l k o h o l i p o l i t i i k a s s a a n + a l k o h o l i p o l i t i i k k a + a l k o h o l i p o l i t i i k k a a + a l k o h o l i p o l i t i i k k a a n + a l k o h o l i p o l i t i i k k a a n s a + a l k o h o l i p o l i t i i k k o j a + a l k o h o l i p r o b l e m a t i i k a s s a + a l k o h o l i p u l l o i s s a + a l k o h o l i r a j o j a + a l k o h o l i r i i p p u v a i s i a + a l k o h o l i r i i p p u v u u d e n + a l k o h o l i r i i p p u v u u s + a l k o h o l i r i k o s t e n + a l k o h o l i s i s ä l l ö n + a l k o h o l i s m i n + a l k o h o l i s m i s t a + a l k o h o l i s o p i m u s + a l k o h o l i s t a + a l k o h o l i s t r a t e g i a + a l k o h o l i s t r a t e g i a a + a l k o h o l i s t r a t e g i a a n + a l k o h o l i s t r a t e g i a n + a l k o h o l i s t r a t e g i a n s a + a l k o h o l i s t r a t e g i a s t a + a l k o h o l i t e o l l i s u u d e l l a + a l k o h o l i t e o l l i s u u d e l l e + a l k o h o l i t e o l l i s u u d e n + a l k o h o l i t e o l l i s u u d e s s a + a l k o h o l i t e o l l i s u u d e s t a + a l k o h o l i t e o l l i s u u s + a l k o h o l i t u o t e t t a + a l k o h o l i t u o t t e e t + a l k o h o l i t u o t t e i d e n + a l k o h o l i t u o t t e i s i i n + a l k o h o l i t u o t t e i s s a + a l k o h o l i t y y p i n + a l k o h o l i t y y p i t + a l k o h o l i t y ö r y h m ä ä + a l k o h o l i v a l i s t u s t a + a l k o h o l i v a l m i s t a j i e n + a l k o h o l i v e r o + a l k o h o l i v e r o a + a l k o h o l i v e r o j a + a l k o h o l i v e r o n + a l k o h o l i v i e r o i t u s o i r e y h t y m ä + a l k o i + a l k o i v a t + a l k o l u k k o j a + a l k o m e t r i t + a l k u a + a l k u a i k o i h i n + a l k u a i k o i n a + a l k u a i k o i n a a n + a l k u a i k o i n a n i + a l k u a i k o j e n + a l k u a i n e + a l k u a i n e e s t a + a l k u a j a t + a l k u a j o i l t a + a l k u a j o i s t a + a l k u a r v i o i n t i + a l k u a s e t e l m a s t a + a l k u a s k e l e e n a + a l k u a s t e e l l a + a l k u a s u k a s a l u e i l t a + a l k u a s u k k a a t + a l k u a s u k k a i d e n + a l k u a s u k k a i t a + a l k u h a n k a l u u d e t + a l k u h a n k a l u u k s i a + a l k u h e i k k o u d e t + a l k u h e t k i s t ä + a l k u h o i t o a + a l k u h u o m a u t u k s e e n + a l k u h u o m a u t u k s e n + a l k u h u o m a u t u k s e n i + a l k u h u o m a u t u k s e s s a n i + a l k u h u o m a u t u k s i a n n e + a l k u h u o m a u t u k s i s s a a n + a l k u h u o m a u t u k s i s s a n i + a l k u h u o m a u t u s t a + a l k u h u o m i o i h i n + a l k u h u u m a s t a + a l k u i d e a a l i + a l k u i l l a n + a l k u i l l a s t a + a l k u i l t a p ä i v ä s t ä + a l k u i n t o n s a + a l k u i n v e s t o i n t e j a + a l k u i n v e s t o i n t i + a l k u i n v e s t o i n t i a + a l k u j a a n k a a n + a l k u j a a n k i n + a l k u j a k o + a l k u j a o n + a l k u k a m p e l a t + a l k u k a n t a i s e m m i k s i + a l k u k a n t a i s i m m a t + a l k u k a r s i n n o i s s a + a l k u k e s k u s t e l u i h i n + a l k u k e s ä l l ä + a l k u k e s ä s t ä + a l k u k e v ä ä n + a l k u k e v ä ä s t ä + a l k u k i e l e l l ä + a l k u k i e l e l t ä + a l k u k o m m e n t t i e n + a l k u k o t i + a l k u k u s t a n n u k s e t + a l k u k u s t a n n u k s i a + a l k u k u s t a n n u k s i n e e n + a l k u k u s t a n n u k s i s t a + a l k u k u u k a u s i n a + a l k u l a u s e e n + a l k u l a u s e t t a + a l k u l u k u + a l k u l u k u f u n k t i o + a l k u l u k u k o l m i k k o + a l k u l u k u l a u s e + a l k u l u k u p a r i + a l k u l u k u s e r k k u + a l k u l ä h t e e l t ä + a l k u l ä h t e e s t ä + a l k u l ä h t e i l l ä + a l k u l ä h t e i l t ä + a l k u m e n e s t y k s e s t ä + a l k u m e t e l i n + a l k u m e t r e i l l ä + a l k u m e t s ä + a l k u m u n a + a l k u n a + a l k u n e l j ä n n e k s e l l ä + a l k u n o t k a h d u s + a l k u n s a + a l k u o s a + a l k u o s a a + a l k u o s a a n + a l k u o s a n + a l k u o s a s s a + a l k u p a l o j a + a l k u p a m a u k s e n + a l k u p e r i n t ä m e r k i n t ä + a l k u p e r ä + a l k u p e r ä a l u e + a l k u p e r ä a l u e e l l e + a l k u p e r ä a l u e e l t a + a l k u p e r ä a l u e e s t a + a l k u p e r ä a l u e e t + a l k u p e r ä a l u e i d e n + a l k u p e r ä a s u k k a i d e n + a l k u p e r ä i n e n + a l k u p e r ä i s a j a t u s + a l k u p e r ä i s a s u k a s j ä l j i t t ä j ä t + a l k u p e r ä i s a s u k k a a t + a l k u p e r ä i s a s u k k a i d e n + a l k u p e r ä i s a s u k k a i l l e + a l k u p e r ä i s a s u k k a i l t a + a l k u p e r ä i s a s u k k a i t a + a l k u p e r ä i s e e n + a l k u p e r ä i s e h d o t u s t a + a l k u p e r ä i s e n + a l k u p e r ä i s e n e m m i s t ö n + a l k u p e r ä i s e s i t y k s e s s ä + a l k u p e r ä i s e s s ä + a l k u p e r ä i s e s t ä + a l k u p e r ä i s e s t ä ä n + a l k u p e r ä i s e t + a l k u p e r ä i s i i n + a l k u p e r ä i s i n ä + a l k u p e r ä i s i s s ä + a l k u p e r ä i s i s t ä + a l k u p e r ä i s i ä + a l k u p e r ä i s k a n s a + a l k u p e r ä i s k a n s a a + a l k u p e r ä i s k a n s a n + a l k u p e r ä i s k a n s a n r y h m i i n + a l k u p e r ä i s k a n s a s t a + a l k u p e r ä i s k a n s a t + a l k u p e r ä i s k a n s o i h i n + a l k u p e r ä i s k a n s o i l l a + a l k u p e r ä i s k a n s o i l l e + a l k u p e r ä i s k a n s o i l t a + a l k u p e r ä i s k a n s o i s t a + a l k u p e r ä i s k a n s o j a + a l k u p e r ä i s k a n s o j e m m e + a l k u p e r ä i s k a n s o j e n + a l k u p e r ä i s k a p p a l e e t + a l k u p e r ä i s k i e l e l l ä + a l k u p e r ä i s k i e l e t + a l k u p e r ä i s k i e l i + a l k u p e r ä i s k i e l t ä + a l k u p e r ä i s k u l t t u u r i + a l k u p e r ä i s m a a n + a l k u p e r ä i s n i m i t y s + a l k u p e r ä i s o s a t + a l k u p e r ä i s r o d u i l l e + a l k u p e r ä i s s u u n n i t e l m a + a l k u p e r ä i s s ä ä n t ö j ä + a l k u p e r ä i s t e k s t i i n + a l k u p e r ä i s t e k s t i n + a l k u p e r ä i s t e k s t i t + a l k u p e r ä i s t e k s t i ä + a l k u p e r ä i s t e n + a l k u p e r ä i s t e o k s i a + a l k u p e r ä i s t i l a a n + a l k u p e r ä i s t o d i s t u k s i e n + a l k u p e r ä i s t o d i s t u s + a l k u p e r ä i s t u o t t e e s t a + a l k u p e r ä i s t ä + a l k u p e r ä i s v a r a o s i e n + a l k u p e r ä i s v e r s i o + a l k u p e r ä i s v e r s i o s s a + a l k u p e r ä i s v e r s i o s t a + a l k u p e r ä i s v ä e s t ö + a l k u p e r ä i s v ä e s t ö i h i n + a l k u p e r ä i s v ä e s t ö i l l e + a l k u p e r ä i s v ä e s t ö j e n + a l k u p e r ä i s v ä e s t ö j ä + a l k u p e r ä i s v ä e s t ö l l e + a l k u p e r ä i s v ä e s t ö l l ä + a l k u p e r ä i s v ä e s t ö l t ä + a l k u p e r ä i s v ä e s t ö n + a l k u p e r ä i s v ä e s t ö r y h m i s t ä + a l k u p e r ä i s v ä e s t ö r y h m ä t + a l k u p e r ä i s v ä e s t ö s s ä + a l k u p e r ä i s v ä e s t ö s t ä + a l k u p e r ä i s v ä e s t ö t + a l k u p e r ä i s v ä e s t ö ä + a l k u p e r ä i s v ä e s t ö ö n + a l k u p e r ä i s v ä h e m m i s t ö i s t ä + a l k u p e r ä i s v ä h e m m i s t ö j e n + a l k u p e r ä i s v ä h e m m i s t ö j ä + a l k u p e r ä i s v ä h e m m i s t ö n + a l k u p e r ä i s y h t e i s ö i h i n + a l k u p e r ä i s y h t e i s ö i l l e + a l k u p e r ä i s y h t e i s ö j e n + a l k u p e r ä i s y h t e i s ö j ä + a l k u p e r ä i s y h t e i s ö t + a l k u p e r ä j ä r j e s t e l m ä + a l k u p e r ä j ä s e n v a l t i o n + a l k u p e r ä j ä s e n v a l t i o s s a + a l k u p e r ä k a n s o j e n + a l k u p e r ä k i e l i e n + a l k u p e r ä k r i t e e r e j ä + a l k u p e r ä k u l t t u u r i e n + a l k u p e r ä k u m u l a a t i o + a l k u p e r ä k u m u l a a t i o l l a + a l k u p e r ä k u m u l a a t i o n + a l k u p e r ä k u m u l a a t i o t a + a l k u p e r ä m a a + a l k u p e r ä m a a h a n + a l k u p e r ä m a a h a n s a + a l k u p e r ä m a a k i n + a l k u p e r ä m a a k s i + a l k u p e r ä m a a l l a + a l k u p e r ä m a a l l a a n + a l k u p e r ä m a a l t a + a l k u p e r ä m a a m e r k i n n ä n + a l k u p e r ä m a a m e r k i n t ä + a l k u p e r ä m a a m e r k i n t ä ä + a l k u p e r ä m a a m e r k i n t ö i h i n + a l k u p e r ä m a a m e r k i n t ö j ä + a l k u p e r ä m a a n + a l k u p e r ä m a a n a + a l k u p e r ä m a a n s a + a l k u p e r ä m a a p e r i a a t e + a l k u p e r ä m a a p e r i a a t e t t a + a l k u p e r ä m a a p e r i a a t t e e k s i + a l k u p e r ä m a a p e r i a a t t e e n + a l k u p e r ä m a a p e r i a a t t e e s e e n + a l k u p e r ä m a a p e r i a a t t e e s t a + a l k u p e r ä m a a s s a + a l k u p e r ä m a a s s a a n + a l k u p e r ä m a a s t a + a l k u p e r ä m a a s t a a n + a l k u p e r ä m a a s ä ä n n ö l l ä + a l k u p e r ä m a a s ä ä n t ö j e n + a l k u p e r ä m a a s ä ä n t ö j ä + a l k u p e r ä m a a t + a l k u p e r ä m a a t a + a l k u p e r ä m a a t a a n + a l k u p e r ä m a a t i l a + a l k u p e r ä m a i d e n + a l k u p e r ä m a i h i n + a l k u p e r ä m a i h i n s a + a l k u p e r ä m a i k s i + a l k u p e r ä m a i l l e + a l k u p e r ä m a i l l e e n + a l k u p e r ä m a i n a + a l k u p e r ä m a i s s a + a l k u p e r ä m a i s s a a n + a l k u p e r ä m a i s t a + a l k u p e r ä m a i s t a a n + a l k u p e r ä m a i t a + a l k u p e r ä m a i t a a n + a l k u p e r ä m e r k e i s t ä + a l k u p e r ä m e r k i n n ä k s i + a l k u p e r ä m e r k i n n ä l l ä + a l k u p e r ä m e r k i n n ä n + a l k u p e r ä m e r k i n n ä s t ä + a l k u p e r ä m e r k i n n ä t + a l k u p e r ä m e r k i n n ö i n + a l k u p e r ä m e r k i n n ö i s s ä + a l k u p e r ä m e r k i n n ö i s t ä + a l k u p e r ä m e r k i n t ä + a l k u p e r ä m e r k i n t ä j ä r j e s t e l m ä + a l k u p e r ä m e r k i n t ä j ä r j e s t e l m ä n + a l k u p e r ä m e r k i n t ä j ä r j e s t e l m ä ä + a l k u p e r ä m e r k i n t ä m m e + a l k u p e r ä m e r k i n t ä ä + a l k u p e r ä m e r k i n t ä ä n + a l k u p e r ä m e r k i n t ö i h i n + a l k u p e r ä m e r k i n t ö j e n + a l k u p e r ä m e r k i n t ö j ä + a l k u p e r ä m e r k i s t ä + a l k u p e r ä m ä ä r i t y k s i i n + a l k u p e r ä m ä ä r ä y k s e t + a l k u p e r ä n + a l k u p e r ä n i m i k k e i d e n + a l k u p e r ä n i m i t y k s e e n + a l k u p e r ä n i m i t y k s e l l ä + a l k u p e r ä n i m i t y k s e m m e + a l k u p e r ä n i m i t y k s e n + a l k u p e r ä n i m i t y k s e s t ä + a l k u p e r ä n i m i t y k s e t + a l k u p e r ä n i m i t y k s i e n + a l k u p e r ä n i m i t y k s i i n + a l k u p e r ä n i m i t y k s i k s i + a l k u p e r ä n i m i t y k s i l l e + a l k u p e r ä n i m i t y k s i n + a l k u p e r ä n i m i t y k s i n ä + a l k u p e r ä n i m i t y k s i s t ä + a l k u p e r ä n i m i t y k s i ä + a l k u p e r ä n i m i t y k s i ä m m e + a l k u p e r ä n i m i t y s + a l k u p e r ä n i m i t y s t e n + a l k u p e r ä n i m i t y s t ä + a l k u p e r ä p a i k a n + a l k u p e r ä p a i k a s t a + a l k u p e r ä p a i k a t + a l k u p e r ä p a i k k a + a l k u p e r ä p a i k k a a n + a l k u p e r ä p a i k k a a n s a + a l k u p e r ä p e r i a a t e + a l k u p e r ä p e r i a a t e t t a + a l k u p e r ä p e r i a a t t e e l l e + a l k u p e r ä p e r i a a t t e e s e e n + a l k u p e r ä p e r u s t e i d e n + a l k u p e r ä p ö y t ä k i r j a a + a l k u p e r ä p ö y t ä k i r j a n + a l k u p e r ä p ö y t ä k i r j o j e n + a l k u p e r ä s e l v i t y k s e n + a l k u p e r ä s e l v i t y k s e t + a l k u p e r ä s e l v i t y k s i s t ä + a l k u p e r ä s e l v i t y k s i ä + a l k u p e r ä s t ä + a l k u p e r ä s u o j a a + a l k u p e r ä s ä ä n n ö i s s ä + a l k u p e r ä s ä ä n n ö i s t ä + a l k u p e r ä s ä ä n n ö s t e n + a l k u p e r ä s ä ä n n ö s t ö ä + a l k u p e r ä s ä ä n n ö t + a l k u p e r ä s ä ä n t ö i h i n + a l k u p e r ä s ä ä n t ö j e n + a l k u p e r ä s ä ä n t ö j ä + a l k u p e r ä s ä ä n t ö p o i k k e u k s e e n + a l k u p e r ä s ä ä n t ö v a a t i m u k s i s t a + a l k u p e r ä t a k u u n + a l k u p e r ä t a k u u t + a l k u p e r ä t a r k i s t u k s i a + a l k u p e r ä t i e d o t + a l k u p e r ä t i e t o + a l k u p e r ä t i l o i l l a + a l k u p e r ä t o d i s t u k s e n + a l k u p e r ä t o d i s t u k s e s t a + a l k u p e r ä t o d i s t u k s e t + a l k u p e r ä t o d i s t u k s i a + a l k u p e r ä t o d i s t u k s i i n + a l k u p e r ä t o d i s t u k s i s t a + a l k u p e r ä t o d i s t u s + a l k u p e r ä t o d i s t u s j ä r j e s t e l m ä ä + a l k u p e r ä t o d i s t u s t a + a l k u p e r ä t o d i s t u s t e n + a l k u p e r ä v a a t i m u k s e t + a l k u p e r ä v a a t i m u k s i a + a l k u p e r ä v a l t i o + a l k u p e r ä v a l t i o i d e n + a l k u p e r ä v a l t i o i s s a + a l k u p e r ä v a l t i o i t a + a l k u p e r ä v a l t i o n + a l k u p e r ä v a l t i o s s a + a l k u p e r ä v a l t i o t + a l k u p e r ä v i i t t a u k s i a + a l k u p e r ä v ä i t t e i d e n + a l k u p e r ä v ä i t t e i l t ä + a l k u p e r ä y h t e i s ö i h i n + a l k u p e r ä y h t e i s ö i l t ä + a l k u p e r ä ä + a l k u p e r ä ä n s ä + a l k u p i s t e + a l k u p i s t e e n ä n i + a l k u p i s t e e s e e n + a l k u p o n n a h d u s + a l k u p u h e e n v u o r o + a l k u p u h e e n v u o r o a n i + a l k u p u h e e n v u o r o i s s a + a l k u p u h e e n v u o r o l l a + a l k u p u h e e n v u o r o s s a a n + a l k u p u h e e n v u o r o s s a n i + a l k u p u h e e n v u o r o s t a + a l k u p u h e e s s a n i + a l k u p u h e e s t a a n + a l k u p u o l i + a l k u p u o l i s k o + a l k u p u o l i s k o l l a + a l k u p u o l i s k o l l e + a l k u p u o l i s k o n + a l k u p u o l i s k o o n + a l k u p ä i v i e n + a l k u p ä i v ä m ä ä r ä ä + a l k u p ä ä o m a + a l k u p ä ä o m a a + a l k u p ä ä o m a a n + a l k u p ä ä o m a n + a l k u p ä ä o m a s t a + a l k u r a h o i t u k s e e n + a l k u r a h o i t u k s e n + a l k u r a h o i t u s + a l k u r a h o i t u s t a + a l k u r i k o k s e n + a l k u r i t a r i + a l k u r y s ä y s + a l k u r ä j ä h d y k s e n + a l k u r ä j ä h d y k s e s t ä + a l k u r ä j ä h d y s + a l k u r ä j ä h d y s t ä + a l k u s e k t o r i l l a + a l k u s e l v i t y k s e s s ä n i + a l k u s e u r a k u n t a + a l k u s i j o i t u k s e t + a l k u s o i t t o a + a l k u s u o d a t u s + a l k u s y i h i n + a l k u s y k s y l l ä + a l k u s y k s y n + a l k u s y k s y s t ä + a l k u s y n t y + a l k u s y s ä y k s e n + a l k u s y s ä y s + a l k u s y y + a l k u s y y n ä + a l k u t a i p a l e e l l a + a l k u t a i p a l e e l l a a n + a l k u t a v o i t e + a l k u t e k i j ä + a l k u t e k i j ö i h i n + a l k u t e k i j ö i s s ä ä n + a l k u t e k s t i + a l k u t e k s t i i n + a l k u t e k s t i n + a l k u t e k s t i s s ä + a l k u t e k s t i ä + a l k u t i e d o i l l a + a l k u t i l a n n e + a l k u t i l a n n e t t a + a l k u t i l a n t e e s e e n + a l k u t o i m e n a + a l k u t u k e a + a l k u t u o t a n n o n + a l k u t u o t a n n o s s a + a l k u t u o t a n n o s t a + a l k u t u o t a n t o + a l k u t u o t a n t o a + a l k u t u o t a n t o a l a n + a l k u t u o t a n t o o n + a l k u t u o t e + a l k u t u o t t a j a + a l k u t u o t t a j a l l e + a l k u t u o t t a j a m a a n + a l k u t u o t t a j a s t a + a l k u t u o t t a j a t + a l k u t u o t t a j i e n + a l k u t u o t t a j i s t a + a l k u t u o t t e i d e n + a l k u t u o t t e i l l e + a l k u t u o t t e i s i i n + a l k u t u o t t e i s s a + a l k u u n p a n i j a n a + a l k u u n s a + a l k u v a h v u u d e t + a l k u v a i h e + a l k u v a i h e e n + a l k u v a i h e e s e e n + a l k u v a i h e e s s a a n + a l k u v a i h e e s t a + a l k u v a i h e e t + a l k u v a i h e i d e n + a l k u v a i h e i l l e + a l k u v a i h e i s i i n + a l k u v a i h e i s s a + a l k u v a i h e i s s a a n + a l k u v a i h e i s t a + a l k u v a i h e i s t a a n + a l k u v a i h e i t a + a l k u v a i h e t t a + a l k u v a i k e u d e t + a l k u v a i k e u k s i a + a l k u v a i k e u k s i e n + a l k u v a i k e u k s i s t a + a l k u v a i k e u t e n s a + a l k u v a s t u s t u k s e e n + a l k u v i i k o l l a + a l k u v i i k o s t a + a l k u v o i m a i s e n a + a l k u v u o d e n + a l k u v u o d e s t a + a l k u v u o d e t + a l k u v u o s i e n + a l k u v u o s i l l e + a l k u v u o s i n a + a l k u v u o s i n a a n + a l k u v u o s i s t a + a l k u v u o t e e n + a l l e a j o s u o j i a + a l l e k i r j o i t a m m e + a l l e k i r j o i t a n + a l l e k i r j o i t e t a a n + a l l e k i r j o i t e t t a e s s a + a l l e k i r j o i t e t t a v a + a l l e k i r j o i t e t t a v a k s i + a l l e k i r j o i t e t t a v a n a + a l l e k i r j o i t e t t i i n + a l l e k i r j o i t e t t u a + a l l e k i r j o i t e t t u a a n + a l l e k i r j o i t e t t u j a + a l l e k i r j o i t e t t u j e n + a l l e k i r j o i t e t t u k i n + a l l e k i r j o i t e t u l l a + a l l e k i r j o i t e t u n + a l l e k i r j o i t e t u t + a l l e k i r j o i t i m m e + a l l e k i r j o i t i n + a l l e k i r j o i t t a a + a l l e k i r j o i t t a a k i n + a l l e k i r j o i t t a a k s e e n + a l l e k i r j o i t t a e s s a a n + a l l e k i r j o i t t a e s s a m m e + a l l e k i r j o i t t a e s s a n i + a l l e k i r j o i t t a i s i + a l l e k i r j o i t t a j a m a a n + a l l e k i r j o i t t a j a m a i d e n + a l l e k i r j o i t t a j a m a i s s a + a l l e k i r j o i t t a j a t + a l l e k i r j o i t t a j a v a l t i o + a l l e k i r j o i t t a j a v a l t i o i d e n + a l l e k i r j o i t t a j a v a l t i o i s s a + a l l e k i r j o i t t a j a v a l t i o i s t a + a l l e k i r j o i t t a j a v a l t i o i t a + a l l e k i r j o i t t a j a v a l t i o n + a l l e k i r j o i t t a j a v a l t i o t + a l l e k i r j o i t t a j i e n + a l l e k i r j o i t t a j i s t a + a l l e k i r j o i t t a m a a n + a l l e k i r j o i t t a m a l l a + a l l e k i r j o i t t a m a n + a l l e k i r j o i t t a m a s s a + a l l e k i r j o i t t a m a s t a + a l l e k i r j o i t t a m a t t a + a l l e k i r j o i t t a m i n + a l l e k i r j o i t t a m i s a j a n k o h t a + a l l e k i r j o i t t a m i s e k s i + a l l e k i r j o i t t a m i s e n + a l l e k i r j o i t t a m i s e s t a + a l l e k i r j o i t t a m i s h e t k e l l ä + a l l e k i r j o i t t a m i s m e n e t t e l y s t ä + a l l e k i r j o i t t a m i s p ä i v ä m ä ä r ä ä + a l l e k i r j o i t t a m i s t a + a l l e k i r j o i t t a m i s t i l a i s u u t e e n + a l l e k i r j o i t t a n e e t + a l l e k i r j o i t t a v a t + a l l e k i r j o i t t i + a l l e k i r j o i t t i v a t + a l l e k i r j o i t u k s e n + a l l e k i r j o i t u k s e n s a + a l l e k i r j o i t u k s e t + a l l e k i r j o i t u k s i a + a l l e k i r j o i t u s h e t k e l l ä + a l l e k i r j o i t u s j ä r j e s t e l m i e n + a l l e k i r j o i t u s j ä r j e s t e l m ä t + a l l e k i r j o i t u s m ä ä r ä l l ä + a l l e k i r j o i t u s p ä ä t ö s + a l l e k i r j o i t u s s e r e m o n i a + a l l e k i r j o i t u s s e r e m o n i a a n + a l l e k i r j o i t u s s e r e m o n i a n + a l l e k i r j o i t u s t a + a l l e k i r j o i t u s t e n + a l l e k i r j o i t u s t e n s a + a l l e k i r j o i t u s t i l a i s u u d e n + a l l e k i r j o i t u s t i l a i s u u d e s s a + a l l e k i r j o i t u s t i l a i s u u s + a l l e k i r j o i t u s t i l a i s u u t e e n + a l l e k i r j o i t u s v a i h e e s e e n + a l l e k i r j o i t u s v a i h e e s s a + a l l e r g e e n i t + a l l e r g i a l a i n s ä ä d ä n n ö n + a l l e r g i a r e a k t i o i d e n + a l l e r g i a r i s k e i h i n + a l l e r g i a r i s k i + a l l e r g i a r i s k i n + a l l e r g i a s t r a t e g i a a + a l l e r g i a t a u t i e n + a l l e r g i a t e k i j ö i h i n + a l l e r g i a t e s t e j ä + a l l e r g i a v a i k u t u k s i a + a l l e r g i k k o j e n + a l l e r g i k o i d e n + a l l e r g i k o i h i n + a l l e r g i k o i l l e + a l l e r g i k o t + a l l e r g i o i d e n + a l l e r g i o i h i n + a l l e r g i o i s t a + a l l e r g i o i t a + a l l e r g i s i a + a l l e r g i s i l l e + a l l e r g i s i s t a + a l l e r g i s o i v a a + a l l e r g i s t e n + a l l e v i i v a t a + a l l e v i i v a t t a v a + a l l i a n s s e j a + a l l i a n s s i n + a l l i a n s s i p u o l u e + a l l i g a a t t o r i k i l p i k o n n a + a l l i h a a h k a + a l l i k k o o n + a l l i k k o s a l a k k a + a l l o k a a t i o r a h a s t o o n + a l l o k o i n t i r a p o r t i n + a l l o k o i n t i t e h o k k u u s + a l l y y l i p r o p y y l i d i s u l f i d i + a l m o r a v i d i t + a l m u i s t a + a l m u j a + a l o i h i n + a l o i l l a + a l o i l l a a n + a l o i l l e + a l o i l t a + a l o i n a + a l o i s t a + a l o i t a m m e + a l o i t a m m e k o + a l o i t a n + a l o i t e k o k o n a i s u u s + a l o i t e k y k y y n + a l o i t e k y k y ä + a l o i t e l u e t t e l o + a l o i t e l u o n n o k s e n a + a l o i t e l u o n n o s + a l o i t e m i e t i n n ö n + a l o i t e m i e t i n n ö s s ä + a l o i t e m i e t i n n ö s t ä + a l o i t e m i e t i n t ö + a l o i t e m i e t i n t ö j ä + a l o i t e m i e t i n t ö ö n + a l o i t e m o n o p o l i + a l o i t e m o n o p o l i n + a l o i t e m o n o p o l i s t a + a l o i t e o h j e l m a + a l o i t e o h j e l m a l l a + a l o i t e o h j e l m a n + a l o i t e o h j e l m a t + a l o i t e o h j e l m i l l e + a l o i t e o i k e u d e l l e + a l o i t e o i k e u d e n + a l o i t e o i k e u d e s t a + a l o i t e o i k e u d e s t a a n + a l o i t e o i k e u d e t + a l o i t e o i k e u d e t h a n + a l o i t e o i k e u k s i a + a l o i t e o i k e u s + a l o i t e o i k e u t e e m m e + a l o i t e o i k e u t e e n + a l o i t e o i k e u t e m m e + a l o i t e o i k e u t e n a + a l o i t e o i k e u t e n s a + a l o i t e o i k e u t t a + a l o i t e o i k e u t t a a n + a l o i t e o i k e u t t a m m e + a l o i t e o i k e u t t a n n e + a l o i t e p a k e t i n + a l o i t e p a k e t i s s a + a l o i t e p a k e t i s t a + a l o i t e p a k e t t i a + a l o i t e p o l i t i i k a n + a l o i t e s i t o u m u k s e t + a l o i t e s u u n n i t e l m a + a l o i t e t a + a l o i t e t a a n + a l o i t e t a a n k i n + a l o i t e t a a n k o + a l o i t e t a a n p a + a l o i t e t t a + a l o i t e t t a e s s a + a l o i t e t t a i s i i n + a l o i t e t t a i s i i n k i n + a l o i t e t t a m m e + a l o i t e t t a n n e + a l o i t e t t a v a + a l o i t e t t a v a l l a + a l o i t e t t i i n + a l o i t e t t u + a l o i t e t t u a + a l o i t e t t u a a n + a l o i t e t t u i h i n + a l o i t e t t u u n + a l o i t e t u i s t a + a l o i t e t u n + a l o i t e t u s s a + a l o i t e t y y p p i i n + a l o i t e v a l m i u d e s t a + a l o i t e v a l t a a n s a + a l o i t e v e l v o l l i s u u s + a l o i t e v o i m a a n + a l o i t e y k s i n o i k e u d e n + a l o i t i m m e + a l o i t i n + a l o i t i t t e + a l o i t t a a + a l o i t t a a k o + a l o i t t a a k s e e n + a l o i t t a a k s e m m e + a l o i t t a e s s a + a l o i t t a e s s a a n + a l o i t t a e s s a m m e + a l o i t t a e s s a n i + a l o i t t a i s i + a l o i t t a i s i n + a l o i t t a i s i v a t + a l o i t t a k a a m m e + a l o i t t a m a a n + a l o i t t a m a i s i l l a a n + a l o i t t a m a l l a + a l o i t t a m a m m e + a l o i t t a m a n + a l o i t t a m a s s a + a l o i t t a m a s t a + a l o i t t a m a t + a l o i t t a m a t t a + a l o i t t a m i s a i k a t a u l u n + a l o i t t a m i s a j a n k o h d a n + a l o i t t a m i s a j a n k o h t a a + a l o i t t a m i s e e n + a l o i t t a m i s e k s i + a l o i t t a m i s e l l e + a l o i t t a m i s e n + a l o i t t a m i s e s t a + a l o i t t a m i s k r i t e e r i t + a l o i t t a m i s k u s t a n n u k s i a + a l o i t t a m i s p ä i v ä m ä ä r ä n + a l o i t t a m i s t a + a l o i t t a m i s t u k i + a l o i t t a m i s t u k i a + a l o i t t a m i s t u k i e n + a l o i t t a m i s v a i h e e s s a + a l o i t t a n e e t + a l o i t t a n u t + a l o i t t a v a n s a + a l o i t t a v a t + a l o i t t e e l l a a n + a l o i t t e e l l e + a l o i t t e e l l i s e m m i n + a l o i t t e e l l i s e m p i + a l o i t t e e l l i s e m p i a + a l o i t t e e l l i s e s t i + a l o i t t e e l l i s i a + a l o i t t e e l l i s u u d e n + a l o i t t e e l l i s u u t e e n + a l o i t t e e l l i s u u t t a + a l o i t t e e l l i s u u t t a a n + a l o i t t e e n + a l o i t t e e n t e k i j ä + a l o i t t e e n t e k i j ä n + a l o i t t e e n t e k i j ä n ä + a l o i t t e e n t e k i j ö i n ä + a l o i t t e e n t e k i j ö i t ä + a l o i t t e e n t e k o m a h d o l l i s u u k s i a + a l o i t t e e n t e k o m o n o p o l i a n n e + a l o i t t e e n t e k o t a i t o j e n + a l o i t t e e n t e k o v a l t a + a l o i t t e e n t e k o v a l t u u k s i a + a l o i t t e e n t e o s t a + a l o i t t e e s e e n + a l o i t t e e s s a + a l o i t t e e s t a + a l o i t t e e s t a n i + a l o i t t e e t + a l o i t t e i d e n + a l o i t t e i d e n t e o n + a l o i t t e i l l a + a l o i t t e i l l a a n + a l o i t t e i l l a m m e + a l o i t t e i l l e + a l o i t t e i s e e n + a l o i t t e i s e l l a + a l o i t t e i s e n + a l o i t t e i s e s s a + a l o i t t e i s e s t a + a l o i t t e i s e s t i + a l o i t t e i s i i n + a l o i t t e i s i i n n e + a l o i t t e i s i l l a + a l o i t t e i s s a + a l o i t t e i s s a a n + a l o i t t e i s s a m m e + a l o i t t e i s t a + a l o i t t e i t a + a l o i t t e i t a a n + a l o i t t i + a l o i t t i v a t + a l o i t u s a j a n k o h d a k s i + a l o i t u s a j a n k o h d a n + a l o i t u s a j a s s a + a l o i t u s a j o i s t a + a l o i t u s a s e m a + a l o i t u s a s e m a n + a l o i t u s a s i a k i r j a a n + a l o i t u s a s k e l + a l o i t u s h u o m a u t u k s e e n + a l o i t u s h u o m i o i d e n + a l o i t u s j o h t o k u n t a a + a l o i t u s k o d o n i + a l o i t u s k o h t i a + a l o i t u s k o k o u s + a l o i t u s k u s t a n n u k s i i n + a l o i t u s l a u k a u s + a l o i t u s o h j e l m a s s a + a l o i t u s p a i k a k s i + a l o i t u s p a i n e e n + a l o i t u s p i s t e + a l o i t u s p i s t e e n ä + a l o i t u s p u h e e n v u o r o a + a l o i t u s p u h e e n v u o r o i s t a a n + a l o i t u s p u h e e n v u o r o n + a l o i t u s p u h e e n v u o r o n i + a l o i t u s p u h e e n v u o r o s s a + a l o i t u s p u h e e n v u o r o s s a a n + a l o i t u s p u h e e n v u o r o s s a n i + a l o i t u s p u h e e n v u o r o s t a a n + a l o i t u s p u h e e s t a n n e + a l o i t u s p ä i v ä m ä ä r ä + a l o i t u s p ä i v ä m ä ä r ä l l ä + a l o i t u s p ä i v ä m ä ä r ä n + a l o i t u s p ä i v ä m ä ä r ä ä + a l o i t u s p ä i v ä s t ä + a l o i t u s p ä i v ä ä + a l o i t u s p ä ä o m a a + a l o i t u s r y h m ä + a l o i t u s t a p a a m i n e n + a l o i t u s t a s e e n + a l o i t u s t a s e e s e e n + a l o i t u s t u e t + a l o i t u s t u k i + a l o i t u s v a i h e + a l o i t u s v a i h e e n + a l o j a + a l o j a a n + a l o j e n + a l p e i l l e + a l p i n e + a l p p e j a + a l p p i a l u e + a l p p i a l u e e l l a + a l p p i a l u e e l l e + a l p p i a l u e e n + a l p p i a l u e e t + a l p p i a l u e i l l a + a l p p i a l u e i s i i n + a l p p i a l u e i s t a + a l p p i a l u e i t a + a l p p i a l u e t t a + a l p p i e n + a l p p i e n a j o k o i r a + a l p p i h i i h d o n + a l p p i h i i h t o + a l p p i k i i t ä j ä + a l p p i k ä e n m i n t t u + a l p p i k ä r h ö + a l p p i l a a k s o j e n + a l p p i m a a + a l p p i m a a t h a n + a l p p i m a s t i f f i + a l p p i m e t s i e n + a l p p i m u r m e l i + a l p p i n a a k k a + a l p p i n a a p u r i i m m e + a l p p i n i i t t y + a l p p i p i i k k i p u t k i + a l p p i p i k k u l e p a k k o + a l p p i r a u t i a i n e n + a l p p i s a l a m a n t e r i + a l p p i s a u v a + a l p p i s i n a p p i p e r h o n e n + a l p p i s i n f o n i a + a l p p i s o l a t + a l p p i s o l i a + a l p p i s o p i m u k s e n + a l p p i t u n n e l e i h i n + a l p p i v a l t i o + a l p p i v a l t i o s s a + a l p p i v a r i s + a l p p i v e s i l i s k o + a l p p i v u o k k o + a l p p i v y ö h y k k e e l l ä + a l p p i y h d i s t e t t y + a l t a i l a i s e t + a l t a i l l a + a l t a i n + a l t a i n l u m i k a n a + a l t a i t a + a l t i s t a a + a l t i s t a m i s t a + a l t i s t a v a n + a l t i s t a v a t + a l t i s t u m a t t a + a l t i s t u m i s a i k a + a l t i s t u m i s a r v o j e n + a l t i s t u m i s e n + a l t i s t u m i s e s t a + a l t i s t u m i s r a j o i l l a + a l t i s t u m i s r a j o i t u k s e t + a l t i s t u m i s r a j o j e n + a l t i s t u m i s t a s o i s t a + a l t i s t u m i s t a s o j e n + a l t i s t u m i s t a s o t + a l t i s t u m i s t a v a t + a l t i s t u m i s t i l a n t e i d e n + a l t i s t u s l u o k k i e n + a l t i s t u s p i t o i s u u d e s t a + a l t i s t u s p i t o i s u u s + a l t i s t u s r a j a n + a l t i s t u s r a j o i s t a + a l t i s t u s t a s o j a + a l t i s t u s t a s o t + a l t i s t u u + a l t i s t u v a t + a l t t e i m p i e n + a l t t e i m p i i n + a l t t i i k s i + a l t t i i l l a + a l t t i i l t a + a l t t i i m m i k s i + a l t t i i m p i + a l t t i i m p i a + a l t t i i m p i e n + a l t t i i m p i n a + a l t t i i n a + a l t t i i t + a l t t i i t a + a l t t o k l a r i n e t t i + a l t t o r a p s o d i a + a l t t o t o r v i + a l t t o v i u l u k o n s e r t t o + a l u e e k s i + a l u e e l l a + a l u e e l l a a n + a l u e e l l a m m e + a l u e e l l a n i + a l u e e l l e + a l u e e l l e e n + a l u e e l l e m m e + a l u e e l l i s e e n + a l u e e l l i s e k s i + a l u e e l l i s e l l a + a l u e e l l i s e l l e + a l u e e l l i s e l t a + a l u e e l l i s e m p a a n + a l u e e l l i s e m p i + a l u e e l l i s e m p i i n + a l u e e l l i s e n + a l u e e l l i s e n a + a l u e e l l i s e s s a + a l u e e l l i s e s t a + a l u e e l l i s e t + a l u e e l l i s i a + a l u e e l l i s i i n + a l u e e l l i s i l l a + a l u e e l l i s i l l e + a l u e e l l i s i s s a + a l u e e l l i s i s t a + a l u e e l l i s t a m i s e n + a l u e e l l i s t a m i s e s t a + a l u e e l l i s t a m i s j ä r j e s t e l m ä + a l u e e l l i s t a m i s n e u v o t t e l u t + a l u e e l l i s t a m i s p e r i a a t e + a l u e e l l i s t a m i s p o l i t i i k a n + a l u e e l l i s t a m i s p o l i t i i k k a + a l u e e l l i s t a m i s p o l i t i i k k a a + a l u e e l l i s t a m i s p r o s e s s i n + a l u e e l l i s t a m i s s u u n n i t e l m a s t a + a l u e e l l i s t a m i s t a + a l u e e l l i s t a m i s t y ö n + a l u e e l l i s t e n + a l u e e l t a + a l u e e l t a a n + a l u e e l t a m m e + a l u e e m m e + a l u e e n + a l u e e n a + a l u e e n i + a l u e e n s a + a l u e e s e e n + a l u e e s e e n s a + a l u e e s t a + a l u e e s t a a n + a l u e e t + a l u e h a l l i n n o i l t a + a l u e h a l l i n n o i n n i n + a l u e h a l l i n n o l l e + a l u e h a l l i n n o l t a + a l u e h a l l i n n o n + a l u e h a l l i n n o s t a + a l u e h a l l i n n o t + a l u e h a l l i n t o + a l u e h a l l i n t o a + a l u e h a l l i n t o j e n + a l u e h a l l i n t o j ä r j e s t e l m ä ä n + a l u e h a l l i n t o m m e + a l u e h a l l i n t o o n + a l u e h a l l i n t o u u d i s t u k s e s t a + a l u e h a l l i n t o v i r a n o m a i s e t + a l u e h a l l i n t o v i r a n o m a i s t e n + a l u e h a l l i t u k s e n + a l u e h a l l i t u k s e t + a l u e h a l l i t u k s i a + a l u e h a l l i t u k s i l l e + a l u e h a l l i t u k s i l t a + a l u e h a l l i t u s + a l u e h a l l i t u s t a + a l u e h a l l i t u s t e n + a l u e h a n k i n t o j e n + a l u e i d e m m e + a l u e i d e n + a l u e i d e n s a + a l u e i d e n v ä l i n e n + a l u e i d e n v ä l i s e n + a l u e i d e n v ä l i s i s s ä + a l u e i d e n v ä l i s t ä + a l u e i k s i + a l u e i l l a + a l u e i l l a a n + a l u e i l l a m m e + a l u e i l l e + a l u e i l t a + a l u e i n a + a l u e i s i i n + a l u e i s t a + a l u e i s t a m m e + a l u e i t a + a l u e j a k o + a l u e j a o n + a l u e j a o s t a + a l u e j o h t a j a + a l u e j o h t a j a l t a + a l u e j ä r j e s t e l y j e n + a l u e j ä r j e s t e l y j ä + a l u e j ä r j e s t ö i h i n + a l u e j ä r j e s t ö j e n + a l u e k a a v o i t u s t a + a l u e k a m a r i + a l u e k a n s l e r i s t a + a l u e k a r t e l l i e n + a l u e k e h i t t ä m i n e n + a l u e k e h i t t ä m i s o h j e l m i a + a l u e k e h i t t ä m i s r a h o j e n + a l u e k e h i t t ä m i s s t r a t e g i a n + a l u e k e h i t y k s e e n + a l u e k e h i t y k s e l l e + a l u e k e h i t y k s e l l ä + a l u e k e h i t y k s e n + a l u e k e h i t y k s e s s ä + a l u e k e h i t y k s e s t ä + a l u e k e h i t y s + a l u e k e h i t y s h a n k k e i s i i n + a l u e k e h i t y s i n s t r u m e n t t e j a + a l u e k e h i t y s m a l l i a + a l u e k e h i t y s m e n o j a + a l u e k e h i t y s m i n i s t e r i ö s s ä + a l u e k e h i t y s m ä ä r ä r a h a t + a l u e k e h i t y s m ä ä r ä r a h o j a + a l u e k e h i t y s n ä k ö k u l m a t + a l u e k e h i t y s o h j e l m a + a l u e k e h i t y s o h j e l m a n + a l u e k e h i t y s o h j e l m a n s a + a l u e k e h i t y s o h j e l m i a + a l u e k e h i t y s o r g a n i s a a t i o s s a + a l u e k e h i t y s p a k e t i n + a l u e k e h i t y s p o l i t i i k a n + a l u e k e h i t y s p o l i t i i k a s s a + a l u e k e h i t y s p o l i t i i k a s t a + a l u e k e h i t y s p o l i t i i k a t + a l u e k e h i t y s p o l i t i i k k a + a l u e k e h i t y s p o l i t i i k k a a + a l u e k e h i t y s p o l i t i i k k a a n + a l u e k e h i t y s p o l i t i i k k a n s a + a l u e k e h i t y s p o l i t i i k k o j e n + a l u e k e h i t y s r a h a s t o + a l u e k e h i t y s r a h a s t o a + a l u e k e h i t y s r a h a s t o i h i n + a l u e k e h i t y s r a h a s t o i l l a + a l u e k e h i t y s r a h a s t o i s t a + a l u e k e h i t y s r a h a s t o j a + a l u e k e h i t y s r a h a s t o j e n + a l u e k e h i t y s r a h a s t o l l a + a l u e k e h i t y s r a h a s t o n + a l u e k e h i t y s r a h a s t o o n + a l u e k e h i t y s r a h a s t o s s a + a l u e k e h i t y s r a h a s t o s t a + a l u e k e h i t y s r a h a s t o t + a l u e k e h i t y s r a h a t + a l u e k e h i t y s r a h o i h i n + a l u e k e h i t y s r a h o i t u k s e n + a l u e k e h i t y s r a h o j a + a l u e k e h i t y s s t r a t e g i o i s s a + a l u e k e h i t y s s t r a t e g i o i t a + a l u e k e h i t y s s u u n n i t e l m a + a l u e k e h i t y s s u u n n i t e l m a a + a l u e k e h i t y s s u u n n i t e l m a a n + a l u e k e h i t y s s u u n n i t e l m a k s i + a l u e k e h i t y s s u u n n i t e l m a n + a l u e k e h i t y s s u u n n i t e l m a s s a + a l u e k e h i t y s s u u n n i t e l m a s t a + a l u e k e h i t y s s u u n n i t e l m a t + a l u e k e h i t y s s u u n n i t e l m i a + a l u e k e h i t y s s u u n n i t e l m i e n + a l u e k e h i t y s s u u n n i t e l m i i n + a l u e k e h i t y s s u u n n i t e l m i s s a + a l u e k e h i t y s t a r k o i t u k s e e n + a l u e k e h i t y s t o i m e t + a l u e k e h i t y s t o i m i e n + a l u e k e h i t y s t u e n + a l u e k e h i t y s t u k e a + a l u e k e h i t y s t ä + a l u e k e h i t y s t ä ä n + a l u e k e h i t y s v a l i o k u n n a l l a + a l u e k e h i t y s v a l i o k u n n a l l e + a l u e k e h i t y s v a l i o k u n n a l t a + a l u e k e h i t y s v a l i o k u n n a n + a l u e k e h i t y s v a l i o k u n n a s s a + a l u e k e h i t y s v a l i o k u n n a s t a + a l u e k e h i t y s v a l i o k u n t a + a l u e k e h i t y s v a l i o k u n t a a + a l u e k e h i t y s v a l i o k u n t a a n + a l u e k e h i t y s v a r o j a + a l u e k e h i t y s v i r a n o m a i s e n + a l u e k e s k u s t e n + a l u e k i e l t e n + a l u e k i i s t a n + a l u e k i i s t a t + a l u e k i i s t o i h i n + a l u e k i i s t o i s s a + a l u e k i i s t o j e n + a l u e k o h t a i s e m m a n + a l u e k o h t a i s e s t i + a l u e k o h t a i s i a + a l u e k o h t a i s i i n + a l u e k o h t a i s t e n + a l u e k o k o n a i s u u t e n a + a l u e k o k o u k s e e n + a l u e k o k o u k s i a + a l u e k o m i t e a + a l u e k o m i t e a n + a l u e k o m i t e o i d e n + a l u e k o m i t e o i h i n + a l u e k o n f e r e n s s e j a + a l u e k o n f e r e n s s i i n + a l u e k o n f l i k t i t + a l u e k o o r d i n a a t t o r i n a + a l u e k u m p p a n i + a l u e k u m p p a n u u k s i a + a l u e k u n t a + a l u e k y s y m y k s e e n + a l u e k y s y m y k s e s t ä + a l u e k y s y m y k s i i n + a l u e k y s y m y s + a l u e k y s y m y s t ä + a l u e l a u s e k k e e n + a l u e l e h t i e n + a l u e l e n t o a s e m a t + a l u e l e n t o k o n e t t a + a l u e l i i k e n n e + a l u e l i i k e n t e e l l e + a l u e l i i k e n t e e n + a l u e l i i t o s p o l i t i i k k a a + a l u e l u o v u t u s t e n + a l u e m a a n t i e d e + a l u e m a t k a i l u n + a l u e m e n e t y k s i s t ä + a l u e m e n e t y s + a l u e m e n o i s t a + a l u e m e n o j e n + a l u e m e r i l l e + a l u e m e r t a + a l u e m u u t o k s e t + a l u e n e u v o s t o + a l u e n e u v o s t o a + a l u e n e u v o s t o n + a l u e n e u v o s t o s s a + a l u e n e u v o s t o t + a l u e n i m i j ä r j e s t e l m ä + a l u e n i m i ä + a l u e n ä k ö k u l m a + a l u e o h j e l m a + a l u e o h j e l m a n + a l u e o h j e l m a t + a l u e o h j e l m i a + a l u e o h j e l m i e n + a l u e o h j e l m i i n + a l u e o h j e l m i s t a + a l u e o r g a n i s a a t i o i d e n + a l u e o r g a n i s a a t i o t + a l u e p a r l a m e n t i n + a l u e p a r l a m e n t i s s a + a l u e p a r l a m e n t i t + a l u e p a r l a m e n t t e i h i n + a l u e p a r l a m e n t t e j a + a l u e p a r l a m e n t t i + a l u e p e r i a a t t e e l l a + a l u e p o h j a i s t e n + a l u e p o l i i t i k k o j e n + a l u e p o l i i t i k k o n a + a l u e p o l i i t i k o t + a l u e p o l i i t t i n e n + a l u e p o l i i t t i s e e n + a l u e p o l i i t t i s e l l a + a l u e p o l i i t t i s e n + a l u e p o l i i t t i s e s t a + a l u e p o l i i t t i s e t + a l u e p o l i i t t i s i a + a l u e p o l i i t t i s i i n + a l u e p o l i i t t i s i l l a + a l u e p o l i i t t i s i n + a l u e p o l i i t t i s i s t a + a l u e p o l i i t t i s t a + a l u e p o l i i t t i s t e n + a l u e p o l i t i i k a k s i + a l u e p o l i t i i k a l l a + a l u e p o l i t i i k a l l e + a l u e p o l i t i i k a n + a l u e p o l i t i i k a s s a + a l u e p o l i t i i k a s s a a n + a l u e p o l i t i i k a s s a m m e + a l u e p o l i t i i k a s t a + a l u e p o l i t i i k a t + a l u e p o l i t i i k k a + a l u e p o l i t i i k k a a + a l u e p o l i t i i k k a a m m e + a l u e p o l i t i i k k a a n + a l u e p o l i t i i k k a a n s a + a l u e p o l i t i i k k a m m e + a l u e p o l i t i i k k a n s a + a l u e p o l i t i i k k a v a l i o k u n n a n + a l u e p o l i t i i k k a v a l i o k u n n a s s a + a l u e p o l i t i i k k a v a l i o k u n t a + a l u e p o l i t i i k k a v a l i o k u n t a a + a l u e p o l i t i i k k a v a r o j a + a l u e p o l i t i i k k o j a + a l u e p o l i t i i k k o j e n + a l u e p o l i t i i k o i s s a + a l u e p o l i t i i k o i s t a + a l u e p r o s e s s i n + a l u e r a h a s t o + a l u e r a h a s t o a + a l u e r a h a s t o i h i n + a l u e r a h a s t o i l t a + a l u e r a h a s t o i s t a + a l u e r a h a s t o j a + a l u e r a h a s t o j e m m e + a l u e r a h a s t o j e n + a l u e r a h a s t o l l e + a l u e r a h a s t o m m e + a l u e r a h a s t o n + a l u e r a h a s t o s t a + a l u e r a h a s t o t + a l u e r a h o i t u k s e e n + a l u e r a h o i t u k s e n + a l u e r a h o i t u s + a l u e r a h o i t u s t a + a l u e r a h o j a + a l u e r a j a n + a l u e r a j a t + a l u e r a j o j e n + a l u e r a k e n t e e t + a l u e r y h m i t t y m i e n + a l u e r y h m i t t y m ä + a l u e r y h m ä + a l u e s a i r a a l o i l l e + a l u e s a r j a s s a + a l u e s e l k k a u s + a l u e s i m u l a a t i o t + a l u e s i m u l a a t i o t a + a l u e s o d a k s i + a l u e s o p i m u k s e t + a l u e s t r a t e g i a a + a l u e s t r a t e g i o i d e n + a l u e s u h t e i d e n + a l u e s u u n n i t t e l u + a l u e s u u n n i t t e l u a + a l u e s u u n n i t t e l u a s i o i h i n + a l u e s u u n n i t t e l u h a n k k e e s e e n + a l u e s u u n n i t t e l u i s t a + a l u e s u u n n i t t e l u k o o r d i n o i n t i o h j e l m a a + a l u e s u u n n i t t e l u l l a k i n + a l u e s u u n n i t t e l u l l e + a l u e s u u n n i t t e l u n + a l u e s u u n n i t t e l u n k i n + a l u e s u u n n i t t e l u n s a + a l u e s u u n n i t t e l u o h j e l m a t + a l u e s u u n n i t t e l u p o l i i t t i s e s s a + a l u e s u u n n i t t e l u p o l i t i i k a n + a l u e s u u n n i t t e l u p o l i t i i k a s s a + a l u e s u u n n i t t e l u p o l i t i i k a s t a + a l u e s u u n n i t t e l u p o l i t i i k a t + a l u e s u u n n i t t e l u p o l i t i i k k a + a l u e s u u n n i t t e l u p o l i t i i k k a a + a l u e s u u n n i t t e l u p o l i t i i k k a a n + a l u e s u u n n i t t e l u p o l i t i i k k o i h i n + a l u e s u u n n i t t e l u p o l i t i i k k o j a m m e + a l u e s u u n n i t t e l u p o l i t i i k k o j e n + a l u e s u u n n i t t e l u s s a + a l u e s u u n n i t t e l u s s a m m e + a l u e s u u n n i t t e l u s t a + a l u e s u u n n i t t e l u s t r a t e g i a n + a l u e s u u n n i t t e l u t i l a n t e i d e n + a l u e s u u n n i t t e l u t o i m i e n + a l u e s u u n n i t t e l u t o i m i s s a + a l u e s u u n n i t t e l u u n + a l u e s y y t t ä j ä + a l u e s ä ä n n ö k s e t + a l u e t a l o u d e l l e + a l u e t a l o u d e n + a l u e t a l o u k s i e n + a l u e t a l o u k s i i n + a l u e t a l o u k s i l l e + a l u e t a l o u t t a + a l u e t a s o + a l u e t a s o a + a l u e t a s o l l a + a l u e t a s o l l e + a l u e t a s o n + a l u e t a s o t + a l u e t i e d e + a l u e t i l i n p i t o j ä r j e s t e l m ä + a l u e t o i m i s t o a + a l u e t o i m i s t o j e n + a l u e t o i m i s t o t + a l u e t t a + a l u e t t a a n + a l u e t t a m m e + a l u e t u e k s i + a l u e t u e l l a + a l u e t u e l l e + a l u e t u e n + a l u e t u e s s a + a l u e t u e s t a + a l u e t u e t + a l u e t u i s t a + a l u e t u k e a + a l u e t u k e e n + a l u e t u k e n s a + a l u e t u k i + a l u e t u k i a + a l u e t u k i e n + a l u e t u k i i n + a l u e t u k i j ä r j e s t e l m ä + a l u e t u k i j ä r j e s t e l m ä n + a l u e t u k i j ä r j e s t e l m ä s s ä + a l u e t u k i k a r t t a a + a l u e t u k i k a r t t o i h i n + a l u e t u k i m ä ä r ä r a h o j a + a l u e t u k i o h j e l m i e n + a l u e t u k i p a k e t i n + a l u e t u k i v a r o j e n + a l u e t u n n u k s e l l a + a l u e t u n n u k s e n + a l u e t u n n u k s e t + a l u e t u n n u k s i a + a l u e t u n n u k s i s t a + a l u e t u n n u s + a l u e t u n n u s t a + a l u e t u n n u s t e n + a l u e u l o t t u v u u d e n + a l u e u l o t t u v u u t e e n + a l u e v a a l e i h i n + a l u e v a a l e j a + a l u e v a a l i e n + a l u e v a a l i p r o s e s s i n + a l u e v a a l i t + a l u e v a a l i t k i n + a l u e v a a t i m u k s e t + a l u e v a a t i m u k s i a + a l u e v a a t i m u k s i i n + a l u e v a a t i m u k s i s t a + a l u e v a a t i m u s t a + a l u e v a a t i m u s t e n + a l u e v a h i n k o j e n + a l u e v a j e t t a + a l u e v a l i n n a n + a l u e v a l i o k u n n a n + a l u e v a l t a u s + a l u e v a l t a u s t a + a l u e v a l t a u s t e n + a l u e v a l t u u s t o + a l u e v a l t u u s t o n + a l u e v a l t u u s t o o n + a l u e v a l t u u t e t t u n a + a l u e v a l t u u t e t u n + a l u e v a r o i l l a + a l u e v e d e t + a l u e v e r o t u k s e n + a l u e v e s i + a l u e v e s i e m m e + a l u e v e s i e n + a l u e v e s i e n s ä + a l u e v e s i i n + a l u e v e s i l l e + a l u e v e s i l l ä + a l u e v e s i l l ä m m e + a l u e v e s i l l ä ä n + a l u e v e s i l t ä + a l u e v e s i l t ä ä n + a l u e v e s i o n g e l m a a + a l u e v e s i r a j a n s a + a l u e v e s i r a j o j e n + a l u e v e s i s s ä + a l u e v e s i s t ä + a l u e v e s i s t ä ä n + a l u e v e s i ä + a l u e v e s i ä ä n + a l u e v e t e n s ä + a l u e v i r a n o m a i n e n + a l u e v i r a n o m a i s e t + a l u e v i r a n o m a i s i a + a l u e v i r a n o m a i s i i n + a l u e v i r a n o m a i s i l l a + a l u e v i r a n o m a i s i l l e + a l u e v i r a n o m a i s i l t a + a l u e v i r a n o m a i s t e n + a l u e v y ö h y k k e e t + a l u e y h d i s t y k s i ä + a l u e y h t e i s t y ö + a l u e y h t e i s t y ö h ö n + a l u e y h t e i s t y ö l l e + a l u e y h t e i s t y ö n + a l u e y h t e i s t y ö p o l i t i i k k a a + a l u e y h t e i s t y ö s t ä + a l u e y h t e i s t y ö t ä + a l u e y h t e i s t y ö y h t y m i ä + a l u e y h t e i s ö + a l u e y h t e i s ö j e n + a l u e y k s i k ö i d e n + a l u e y k s i k ö i t ä + a l u e y k s i k ö n + a l u e y k s i k ö t + a l u i l l a a n + a l u k s e e n + a l u k s e l l a + a l u k s e n + a l u k s e n s a + a l u k s e s t a + a l u k s e t + a l u k s i a + a l u k s i a a n + a l u k s i i n + a l u k s i l l a + a l u k s i l l e + a l u k s i l l e e n + a l u k s i n e e n + a l u k s i s s a + a l u k s i s t a + a l u l l e + a l u m i i n i a + a l u m i i n i a l a l l a + a l u m i i n i b r o m i d i + a l u m i i n i f l u o r i d i + a l u m i i n i f o l i o + a l u m i i n i f o s f a a t i l t a + a l u m i i n i f o s f a a t t i a + a l u m i i n i f o s f i d i + a l u m i i n i h y d r o k s i d i + a l u m i i n i j ä t t e i d e n + a l u m i i n i k l o r i d i + a l u m i i n i k s i + a l u m i i n i m a l m i a + a l u m i i n i n a l a a + a l u m i i n i o k s i d i + a l u m i i n i p a p e r i n + a l u m i i n i p u r k k i e n + a l u m i i n i s e o k s e t + a l u m i i n i s u l a t t o a + a l u m i i n i s u l f a a t t i + a l u m i i n i t e h d a s + a l u m i i n i t e h t a i s i i n + a l u m i i n i t e o l l i s u u s + a l u m i i n i t e o l l i s u u t e e n + a l u n p e r i n k ä ä n + a l u s i n v e s t o i n t e i h i n + a l u s k a s v i l l i s u u d e n + a l u s k u l j e t u s t e n + a l u s l i i k e n n e + a l u s l i i k e n n e t t ä + a l u s l i i k e n t e e n + a l u s l u e t t e l o n + a l u s l u o k a t + a l u s l u o k i l l e + a l u s r e k i s t e r e i t ä + a l u s r e k i s t e r i + a l u s r e k i s t e r i e n + a l u s r e k i s t e r i i n + a l u s r e k i s t e r i k s i + a l u s r e k i s t e r i n + a l u s r e k i s t e r i ä + a l u s s a k a a n + a l u s s e g m e n t t i e n + a l u s t a a + a l u s t a a n + a l u s t a j i n a + a l u s t a m i s e k s i + a l u s t a v a a + a l u s t a v a a n + a l u s t a v a n + a l u s t a v a s s a + a l u s t a v a s t a + a l u s t a v i a + a l u s t a v i e n + a l u s t a v i i n + a l u s t a v i s s a + a l u s t e n + a l u s t i e t o k a n t a n s a + a l u s t u k s e n i + a l u s t u k s e s s a + a l u s t u k s e s s a n i + a l u s t u k s e s t a + a l u s t u r v a l l i s u u d e n + a l u s t u r v a l l i s u u t t a + a l u s t u s a s i a k i r j a a + a l u s t u s p u h e e n v u o r o + a l u s t u s p u h e e n v u o r o i s s a + a l u s t u s p u h e e n v u o r o n i + a l u s t u s p u h e e n v u o r o n n e + a l u s t u s p u h e e n v u o r o o n i + a l u s t u s p u h e e n v u o r o s s a a n + a l u s t u s p u h e e n v u o r o s s a n i + a l u s t u s p u h e e n v u o r o s s a n n e + a l u s t u s p u h e e s s a n i + a l u s t u s s a n o j e n s a + a l u s t y y p e i l l e + a l u s t y y p i t + a l u s t y y p p e j ä + a l u s t y y p p i ä + a m a l g a a m i j ä t e + a m a l g a a m i j ä t e t t ä + a m a l g a a m i n + a m a l g a a m i p a i k k o i h i n + a m a l g a a m i p a i k o i s s a + a m a t s o n i n l i l j a + a m a t s o n i t + a m a t ö ö r i d i v i s i o o n a a n + a m a t ö ö r i e l o k u v a + a m a t ö ö r i j a l k a p a l l o i l i j a t + a m a t ö ö r i j a l k a p a l l o s t a + a m a t ö ö r i l a i t t e i s t o a + a m a t ö ö r i l i i g o i s t a + a m a t ö ö r i p a l o m i e s + a m a t ö ö r i p e l a a j a t + a m a t ö ö r i p o r n o + a m a t ö ö r i p u o l i + a m a t ö ö r i t a i t e i l i j a t + a m a t ö ö r i t a i t e i l i j o i d e n + a m a t ö ö r i t a i t e i l i j o i l l e + a m a t ö ö r i t a s o l l a + a m a t ö ö r i u r h e i l i j a t k i n + a m a t ö ö r i u r h e i l u + a m a t ö ö r i u r h e i l u a + a m a t ö ö r i u r h e i l u l l e + a m a t ö ö r i u r h e i l u n + a m a t ö ö r i u r h e i l u s e u r a t + a m a t ö ö r i u r h e i l u s e u r o i h i n + a m a t ö ö r i u r h e i l u s s a + a m b i t i o n + a m b u l a n s s i k u s k i e n + a m e r i k a n e n g l a n t i l a i s e t + a m e r i k a n h i i r i h a u k k a + a m e r i k a n h u m a l a p y ö k k i + a m e r i k a n p i t b u l l t e r r i e r i + a m e r i k a n s a k s a l a i s e t + a m e r i k a n s i r r i + a m e r i k a n s t a f f o r d s h i r e n t e r r i e r i + a m e r i k a n s u o m a l a i s e t + a m e r i k a n t i k l i + a m e r i k a n t i l h i + a m e r i k i u m d i o k s i d i + a m e r i k k a l a i s a g e n t t e j a + a m e r i k k a l a i s d i p l o m a a t t i e n + a m e r i k k a l a i s e e n + a m e r i k k a l a i s e l l a + a m e r i k k a l a i s e m p i a + a m e r i k k a l a i s e n + a m e r i k k a l a i s e s i m e r k k i + a m e r i k k a l a i s e s s a + a m e r i k k a l a i s e t + a m e r i k k a l a i s e t k i n + a m e r i k k a l a i s h a l l i n n o n + a m e r i k k a l a i s i a + a m e r i k k a l a i s i i n + a m e r i k k a l a i s i l l a + a m e r i k k a l a i s i l l e + a m e r i k k a l a i s i s t a + a m e r i k k a l a i s j o h t o o n + a m e r i k k a l a i s j o u k o t + a m e r i k k a l a i s j ä t i n + a m e r i k k a l a i s k o l l e g a n s a + a m e r i k k a l a i s k u l j e t u k s e s t a + a m e r i k k a l a i s k u m p p a n i e m m e + a m e r i k k a l a i s l e h d i s t ä + a m e r i k k a l a i s l e h t i e n + a m e r i k k a l a i s m a l l i a + a m e r i k k a l a i s m y ö n t e i s i i n + a m e r i k k a l a i s p a n k i t + a m e r i k k a l a i s s o t i l a a t + a m e r i k k a l a i s t e n + a m e r i k k a l a i s t u k i k o h d a n + a m e r i k k a l a i s t u k i k o h d a s s a + a m e r i k k a l a i s t u k i k o h t i e n + a m e r i k k a l a i s t u o t a n t o j e n + a m e r i k k a l a i s t y y l i n e n + a m e r i k k a l a i s t y y l i s e s s ä + a m e r i k k a l a i s t y y l i s i ä + a m e r i k k a l a i s t y y l i s t ä + a m e r i k k a l a i s v a s t a i n e n + a m e r i k k a l a i s v a s t a i s e e n + a m e r i k k a l a i s v a s t a i s e n + a m e r i k k a l a i s v a s t a i s e t + a m e r i k k a l a i s v a s t a i s i a + a m e r i k k a l a i s v a s t a i s i n a + a m e r i k k a l a i s v a s t a i s t a + a m e r i k k a l a i s v a s t a i s u u d e n + a m e r i k k a l a i s v a s t a i s u u d e s t a + a m e r i k k a l a i s v a s t a i s u u d e t + a m e r i k k a l a i s v a s t a i s u u s + a m e r i k k a l a i s v a s t a i s u u t e e n + a m e r i k k a l a i s v a s t a i s u u t t a + a m e r i k k a l a i s v i r a n o m a i s i l l e + a m e r i k k a l a i s y r i t y k s e n + a m e r i k k a l a i s y r i t y k s e t + a m e r i k k a l a i s y r i t y k s i l l e + a m e r i k k a l a i s y r i t y k s i l l ä + a m e r i k k a l a i s y r i t y s t e n + a m e r i k k a l a i s y s t ä v i e m m e + a m e r i k k a l a i s y s t ä v ä m m e + a m f e t a m i i n i p s y k o o s i + a m f e t a m i i n i t + a m f i b i o a j o n e u v o j a + a m f i b i o l e n t o k o n e + a m f i b i o v a u n u + a m h a r a t + a m i i n i o k s i d i t + a m i n o h a p o t + a m i n o h a p p o a + a m i n o h a p p o j a + a m i n o h a p p o j e n + a m i n o h a p p o p i t o i s u u d e n + a m i n o h a p p o s y n t e e s i + a m i n o s a l i s y y l i h a p p o + a m i n o s o k e r i t + a m i n o v o i h a p p o + a m i r a l i t e e t t i e n p ö l l ö + a m i r a l i t e e t t i s a a r e t + a m i r a l i t e e t t i s a a r t e n + a m m a t e i l l a + a m m a t e i l l e + a m m a t e i s s a + a m m a t e i s t a + a m m a t i l l i s e e n + a m m a t i l l i s e l l a + a m m a t i l l i s e m m a n + a m m a t i l l i s e n + a m m a t i l l i s e s s a + a m m a t i l l i s e s t a + a m m a t i l l i s e t + a m m a t i l l i s i a + a m m a t i l l i s i i n + a m m a t i l l i s i s s a + a m m a t i l l i s t e n + a m m a t i n + a m m a t i n h a r j o i t t a j a + a m m a t i n h a r j o i t t a j a a + a m m a t i n h a r j o i t t a j a k s i + a m m a t i n h a r j o i t t a j a l l a + a m m a t i n h a r j o i t t a j a l l e + a m m a t i n h a r j o i t t a j a n + a m m a t i n h a r j o i t t a j a n a + a m m a t i n h a r j o i t t a j a r y h m i ä + a m m a t i n h a r j o i t t a j a s t a + a m m a t i n h a r j o i t t a j a t + a m m a t i n h a r j o i t t a j a t k i n + a m m a t i n h a r j o i t t a j i a + a m m a t i n h a r j o i t t a j i e n + a m m a t i n h a r j o i t t a j i i n + a m m a t i n h a r j o i t t a j i k s i + a m m a t i n h a r j o i t t a j i l l a + a m m a t i n h a r j o i t t a j i l l e + a m m a t i n h a r j o i t t a j i n + a m m a t i n h a r j o i t t a j i n a + a m m a t i n h a r j o i t t a j i s t a + a m m a t i n h a r j o i t t a m i s e e n + a m m a t i n h a r j o i t t a m i s e l l e + a m m a t i n h a r j o i t t a m i s e n + a m m a t i n h a r j o i t t a m i s e n a + a m m a t i n h a r j o i t t a m i s e s t a + a m m a t i n h a r j o i t t a m i s k i e l l o n + a m m a t i n h a r j o i t u s t o i m e n p i t e i t ä + a m m a t i n v a l i n n a n o h j a u k s e e n + a m m a t i n v a l i n n a n o h j a u k s e n + a m m a t i n v a l i n n a n o h j a u k s e s s a + a m m a t i n v a l i n n a n o h j a u s t a + a m m a t i n v a l i n t o j e n + a m m a t i s s a + a m m a t i s s a a n + a m m a t i s s a n i + a m m a t i t + a m m a t t e i h i n + a m m a t t e j a + a m m a t t i a a n + a m m a t t i a j o n e u v o i s s a + a m m a t t i a j o n e u v o t + a m m a t t i a l a a + a m m a t t i a l a j ä r j e s t ö j e n + a m m a t t i a l a k o h t a i s i a + a m m a t t i a l a l l a + a m m a t t i a l a l l e + a m m a t t i a l a n + a m m a t t i a l o i l l a + a m m a t t i a l o i l l e + a m m a t t i a l o j a + a m m a t t i a l o j a m m e + a m m a t t i a l o j e n + a m m a t t i a l u e e l l e + a m m a t t i a p u a + a m m a t t i a r m e i j a + a m m a t t i a r m e i j a n + a m m a t t i a r v o s t u k s e n + a m m a t t i a s e m a a + a m m a t t i a s e m a l l a + a m m a t t i a s i a n t u n t i j o i t a + a m m a t t i a u t o i l i j o i d e n + a m m a t t i a u t o i l i j o i h i n + a m m a t t i a u t t a j a t + a m m a t t i d e m a g o g i e n + a m m a t t i e e t t i s i s s ä + a m m a t t i e e t t i s i ä + a m m a t t i e l i m e n + a m m a t t i e l i m e t + a m m a t t i e l ä k e d i r e k t i i v i + a m m a t t i e l ä k e d i r e k t i i v i n + a m m a t t i e l ä m ä n + a m m a t t i e l ä m ä s s ä + a m m a t t i e n + a m m a t t i e t i i k a n + a m m a t t i e t i i k k a + a m m a t t i e t i i k k a a + a m m a t t i e t i i k k a a n + a m m a t t i h e n k i l ö + a m m a t t i h e n k i l ö i t ä + a m m a t t i h e n k i l ö n + a m m a t t i h o i t a j i e n + a m m a t t i i n + a m m a t t i j a l k a p a l l o s e u r a t + a m m a t t i j a l k a p a l l o s s a + a m m a t t i j u l k i s u u t e e n + a m m a t t i j u u t a l a i s e k s i + a m m a t t i j ä r j e s t ä j ä + a m m a t t i j ä r j e s t ö + a m m a t t i j ä r j e s t ö a k t i i v e j a + a m m a t t i j ä r j e s t ö a k t i v i s t i e n + a m m a t t i j ä r j e s t ö a k t i v i s t i t + a m m a t t i j ä r j e s t ö i h i n + a m m a t t i j ä r j e s t ö i l l e + a m m a t t i j ä r j e s t ö i l l ä + a m m a t t i j ä r j e s t ö i l t ä + a m m a t t i j ä r j e s t ö i l t ä ä n + a m m a t t i j ä r j e s t ö i s s ä + a m m a t t i j ä r j e s t ö i s t ä + a m m a t t i j ä r j e s t ö j e m m e + a m m a t t i j ä r j e s t ö j e n + a m m a t t i j ä r j e s t ö j e n s ä + a m m a t t i j ä r j e s t ö j ä + a m m a t t i j ä r j e s t ö n + a m m a t t i j ä r j e s t ö n s ä + a m m a t t i j ä r j e s t ö o i k e u d e t + a m m a t t i j ä r j e s t ö t + a m m a t t i j ä r j e s t ö v a a l e i h i n + a m m a t t i j ä r j e s t ö v a a l i e n + a m m a t t i j ä r j e s t ö ö n + a m m a t t i k a l a s t a j a t + a m m a t t i k a l a s t a j i a + a m m a t t i k a l a s t a j i e n + a m m a t t i k a l a s t a j i i n + a m m a t t i k a l a s t a j i l l e + a m m a t t i k a l a s t u k s e e n + a m m a t t i k a l a s t u k s e l l e + a m m a t t i k a s v a t u s + a m m a t t i k e h i t t ä j ä ä + a m m a t t i k e h i t y k s e n s ä + a m m a t t i k i e l l o i s t a + a m m a t t i k i e l l o n + a m m a t t i k i e l t o j a + a m m a t t i k i n + a m m a t t i k i r j a l l i s u u d e s s a + a m m a t t i k o k e m u k s e n + a m m a t t i k o k e m u k s e s t a + a m m a t t i k o k e m u s + a m m a t t i k o k e m u s t a + a m m a t t i k o k k i + a m m a t t i k o r k e a k o u l u + a m m a t t i k o r k e a k o u l u i s s a + a m m a t t i k o r k e a k o u l u n + a m m a t t i k o r t i l l e + a m m a t t i k o r t i n + a m m a t t i k o r t i t + a m m a t t i k o r t t i + a m m a t t i k o r t t i e n + a m m a t t i k o u l u + a m m a t t i k o u l u i s s a + a m m a t t i k o u l u j ä r j e s t e l m ä s s ä + a m m a t t i k o u l u l a i s i a + a m m a t t i k o u l u t u k s e e n + a m m a t t i k o u l u t u k s e l l a + a m m a t t i k o u l u t u k s e l l e + a m m a t t i k o u l u t u k s e n + a m m a t t i k o u l u t u k s e n s a + a m m a t t i k o u l u t u k s e s s a + a m m a t t i k o u l u t u k s e s t a + a m m a t t i k o u l u t u k s i a + a m m a t t i k o u l u t u s + a m m a t t i k o u l u t u s a l a l l a + a m m a t t i k o u l u t u s j ä r j e s t e l m i e n + a m m a t t i k o u l u t u s j ä r j e s t e l m i i n + a m m a t t i k o u l u t u s j ä r j e s t e l m i ä + a m m a t t i k o u l u t u s j ä r j e s t e l m ä n + a m m a t t i k o u l u t u s j ä r j e s t e l m ä ä n s ä + a m m a t t i k o u l u t u s k e s k u k s e t + a m m a t t i k o u l u t u s o h j e l m a n + a m m a t t i k o u l u t u s o h j e l m i a + a m m a t t i k o u l u t u s o h j e l m i e n + a m m a t t i k o u l u t u s o h j e l m i i n + a m m a t t i k o u l u t u s o h j e l m i l l a + a m m a t t i k o u l u t u s o n g e l m i l l e + a m m a t t i k o u l u t u s p a i k a n + a m m a t t i k o u l u t u s p o l i t i i k a s t a + a m m a t t i k o u l u t u s p o l i t i i k o i s t a + a m m a t t i k o u l u t u s s ä ä t i ö n + a m m a t t i k o u l u t u s s ä ä t i ö s t ä + a m m a t t i k o u l u t u s t a + a m m a t t i k o u l u t u s t a a n + a m m a t t i k o u l u t u s t a r p e i d e n + a m m a t t i k o u l u t u s t o i m i l l a + a m m a t t i k o u l u t u s t o i m i n t a + a m m a t t i k o u l u t u s u u d i s t u k s e s s a + a m m a t t i k u l j e t t a j a + a m m a t t i k u l j e t t a j a k s i + a m m a t t i k u l j e t t a j a t + a m m a t t i k u l j e t t a j i a + a m m a t t i k u l j e t t a j i e n + a m m a t t i k u l j e t t a j i i n + a m m a t t i k u l j e t t a j i l l a + a m m a t t i k u l j e t t a j i l l e + a m m a t t i k u l j e t t a j i s t a + a m m a t t i k u n n a n + a m m a t t i k u n n a t + a m m a t t i k u n t a j ä r j e s t ö t + a m m a t t i k u n t a l a i t o k s e n + a m m a t t i k u v a n + a m m a t t i k ä s i t y ö l ä i s i l l e + a m m a t t i k ä y t t ö + a m m a t t i k ä y t t ö ä + a m m a t t i k ä y t t ö ö n + a m m a t t i k ä y t ä n t ö ä + a m m a t t i k ä y t ö n + a m m a t t i k ä y t ö s s ä + a m m a t t i l a i n s ä ä d ä n n ö n + a m m a t t i l a i s e n + a m m a t t i l a i s e t + a m m a t t i l a i s i a + a m m a t t i l a i s i i n + a m m a t t i l a i s j a l k a p a l l o + a m m a t t i l a i s j a l k a p a l l o a + a m m a t t i l a i s j a l k a p a l l o i l u + a m m a t t i l a i s j a l k a p a l l o i l u a + a m m a t t i l a i s j a l k a p a l l o i l u n + a m m a t t i l a i s j a l k a p a l l o j o u k k u e i l l a + a m m a t t i l a i s j a l k a p a l l o n + a m m a t t i l a i s j a l k a p a l l o s e u r o i l l a + a m m a t t i l a i s j a l k a p a l l o s e u r o j e n + a m m a t t i l a i s j a l k a p a l l o s s a + a m m a t t i l a i s k u l j e t t a j i e n + a m m a t t i l a i s k u l j e t t a j i l l e + a m m a t t i l a i s l i i g o j a + a m m a t t i l a i s m a n i p u l o i j a t + a m m a t t i l a i s p a l v e l u j e n + a m m a t t i l a i s p i i r i t + a m m a t t i l a i s p o l i i t i k k o j a + a m m a t t i l a i s r u g b y + a m m a t t i l a i s s e u r a t + a m m a t t i l a i s s e u r o i l l e + a m m a t t i l a i s s e u r o j a + a m m a t t i l a i s s e u r o j e n + a m m a t t i l a i s s o p i m u s + a m m a t t i l a i s t a h o t + a m m a t t i l a i s t a s o l l a + a m m a t t i l a i s t e n + a m m a t t i l a i s u r h e i l i j a + a m m a t t i l a i s u r h e i l i j o i d e n + a m m a t t i l a i s u r h e i l u + a m m a t t i l a i s u r h e i l u n + a m m a t t i l a i s u r h e i l u s e u r o j e n + a m m a t t i l a u t a k u n n a t + a m m a t t i l i i k e + a m m a t t i l i i k e n n e t t ä + a m m a t t i l i i k e n t e e n + a m m a t t i l i i k k e e l l e + a m m a t t i l i i k k e i t ä + a m m a t t i l i i t o i l l a + a m m a t t i l i i t o i l l e + a m m a t t i l i i t o i l t a + a m m a t t i l i i t o i s s a + a m m a t t i l i i t o i s t a + a m m a t t i l i i t o j e n + a m m a t t i l i i t o l l e + a m m a t t i l i i t o l t a + a m m a t t i l i i t o n + a m m a t t i l i i t o s s a + a m m a t t i l i i t o t + a m m a t t i l i i t t o + a m m a t t i l i i t t o a + a m m a t t i l i i t t o a a n + a m m a t t i l i i t t o a k t i i v i e n + a m m a t t i l i i t t o a k t i v i s t e j a + a m m a t t i l i i t t o i h i n + a m m a t t i l i i t t o j a + a m m a t t i l i i t t o j e n + a m m a t t i l i i t t o j e n s a + a m m a t t i l i i t t o j o h t a j a t + a m m a t t i l i i t t o j o h t o a + a m m a t t i l i i t t o j ä r j e s t ö + a m m a t t i l i i t t o l a i s e n + a m m a t t i l i i t t o l a i s i a + a m m a t t i l i i t t o n i + a m m a t t i l i i t t o n s a + a m m a t t i l i i t t o o n + a m m a t t i l i i t t o t o i m i n t a a + a m m a t t i l i i t t o t o i m i n t a a n + a m m a t t i l o b b a a j a a + a m m a t t i l u o k k i a + a m m a t t i m a a i l m a s s a + a m m a t t i m a i s e l l e + a m m a t t i m a i s e m m a k s i + a m m a t t i m a i s e m m a n + a m m a t t i m a i s e m m i n + a m m a t t i m a i s e m p a a + a m m a t t i m a i s e m p i + a m m a t t i m a i s e m p i a + a m m a t t i m a i s e n + a m m a t t i m a i s e s t a + a m m a t t i m a i s e t + a m m a t t i m a i s i a + a m m a t t i m a i s i n + a m m a t t i m a i s i s t a + a m m a t t i m e h i l ä i s h o i t a j i e n + a m m a t t i m i e l e s s ä + a m m a t t i m u u s i k k o n a + a m m a t t i n i m i k e t t ä ä n + a m m a t t i n i m i k k e e n + a m m a t t i n s a + a m m a t t i o h j a u k s e n + a m m a t t i o p i n t o j a + a m m a t t i o p p i l a i t o k s i l l a + a m m a t t i o p p i l a i t o s + a m m a t t i o p p i l a i t o s t e n + a m m a t t i o s a a j i s t a + a m m a t t i o s a s t o + a m m a t t i o s t a j i l l e + a m m a t t i p a s i f i s t i t + a m m a t t i p i i r e i l l e + a m m a t t i p i i r e i s s ä + a m m a t t i p o h j a l t a + a m m a t t i p o l i i t i k k o j e n + a m m a t t i p o l i i t i k o t + a m m a t t i p o l i t i i k k a + a m m a t t i p r o f i i l e j a + a m m a t t i p r o f i i l i e n + a m m a t t i p r o f i i l i n + a m m a t t i p s y k o l o g i + a m m a t t i p ä t e v y y d e n + a m m a t t i p ä t e v y y d e s t ä + a m m a t t i p ä t e v y y d e s t ä ä n + a m m a t t i p ä t e v y y d e t + a m m a t t i p ä t e v y y k s i e n + a m m a t t i p ä t e v y y k s i l l e + a m m a t t i p ä t e v y y k s i s t ä + a m m a t t i p ä t e v y y k s i ä + a m m a t t i p ä t e v y y s + a m m a t t i p ä t e v y y s a l u e e n + a m m a t t i p ä t e v y y s d i r e k t i i v i n + a m m a t t i p ä t e v y y t e e n + a m m a t t i p ä t e v y y t e e n s ä + a m m a t t i p ä t e v y y t e n s ä + a m m a t t i p ä t e v y y t t ä + a m m a t t i p ä t e v y y t t ä ä n + a m m a t t i r i k o l l i s e e n + a m m a t t i r i k o l l i s t e n + a m m a t t i r i k o l l i s u u d e l l e + a m m a t t i r i s k e j ä + a m m a t t i r y h m i e n + a m m a t t i r y h m i e n s ä + a m m a t t i r y h m i i n + a m m a t t i r y h m i l l e + a m m a t t i r y h m i s s ä + a m m a t t i r y h m i ä + a m m a t t i r y h m ä + a m m a t t i r y h m ä l l e + a m m a t t i r y h m ä n + a m m a t t i r y h m ä s s ä + a m m a t t i r y h m ä t + a m m a t t i r y h m ä ä + a m m a t t i s a i r a u k s i e n + a m m a t t i s a i r a u k s i l l e + a m m a t t i s a i r a u k s i s t a + a m m a t t i s a l a i s u u d e n + a m m a t t i s a l a i s u u d e t + a m m a t t i s a l a i s u u s + a m m a t t i s a l a i s u u t e e n + a m m a t t i s a l a i s u u t t a + a m m a t t i s e k t o r i a + a m m a t t i s i j o i t t a j a t + a m m a t t i s i j o i t t a j i e n + a m m a t t i s i j o i t t a j i i n + a m m a t t i s l a n g i a + a m m a t t i s o t i l a a t + a m m a t t i s o t i l a i n a + a m m a t t i s o t i l a i t a + a m m a t t i s ä ä n n ö s t ö j ä + a m m a t t i t a i d o l l a + a m m a t t i t a i d o n + a m m a t t i t a i d o s t a + a m m a t t i t a i d o s t a a n + a m m a t t i t a i d o t t o m i a + a m m a t t i t a i d o t t o m i l l a + a m m a t t i t a i d o t t o m u u d e n + a m m a t t i t a i t e i l i j a + a m m a t t i t a i t e i l i j a t + a m m a t t i t a i t e i l i j o i t a + a m m a t t i t a i t o + a m m a t t i t a i t o a + a m m a t t i t a i t o a a n + a m m a t t i t a i t o i s e m m a n + a m m a t t i t a i t o i s e m m i n + a m m a t t i t a i t o i s e m p a a + a m m a t t i t a i t o i s e m p a a n + a m m a t t i t a i t o i s e s t a + a m m a t t i t a i t o i s e s t i + a m m a t t i t a i t o i s e t + a m m a t t i t a i t o i s i a + a m m a t t i t a i t o i s i i n + a m m a t t i t a i t o i s t a + a m m a t t i t a i t o i s t e n + a m m a t t i t a i t o n s a + a m m a t t i t a i t o o n + a m m a t t i t a i t o t a s o a + a m m a t t i t a i t o t a s o n + a m m a t t i t a i t o v a j e + a m m a t t i t a i t o v u o t o a + a m m a t t i t a r k o i t u k s e e n + a m m a t t i t a s o + a m m a t t i t a s o l l a + a m m a t t i t a u d e i k s i + a m m a t t i t a u d e i s t a + a m m a t t i t a u d i k s i + a m m a t t i t a u d i n + a m m a t t i t a u d i t + a m m a t t i t a u s t a n + a m m a t t i t a u t e i h i n + a m m a t t i t a u t e j a + a m m a t t i t a u t i + a m m a t t i t a u t i a + a m m a t t i t a u t i e n + a m m a t t i t a u t i i n + a m m a t t i t a u t i t a p a u s t e n + a m m a t t i t e h t ä v i s t ä + a m m a t t i t e r m i n s ä + a m m a t t i t o d i s t u s t e n + a m m a t t i t o i m i j o i d e n + a m m a t t i t o i m i j o i t a + a m m a t t i t o i m i n n a n + a m m a t t i t o i m i n t a a + a m m a t t i t o i m i n t a a n + a m m a t t i t o i m i n t a n a + a m m a t t i t u k e a + a m m a t t i t u o m a r e i d e n + a m m a t t i t u o t t a j i e n + a m m a t t i t u t k i n n o i s t a + a m m a t t i t u t k i n n o t + a m m a t t i t u t k i n t o + a m m a t t i t u t k i n t o j a + a m m a t t i t u t k i n t o j e n + a m m a t t i t u t k i n t o o n + a m m a t t i t u t k i n t o t o d i s t u k s i a + a m m a t t i t u t k i n t o t o d i s t u s t e n + a m m a t t i t y ö l ä i n e n + a m m a t t i t y ö n + a m m a t t i t y ö n t e k i j ö i d e n + a m m a t t i t y ö n t e k i j ö i t ä + a m m a t t i t y ö t ä + a m m a t t i u r a + a m m a t t i u r a a + a m m a t t i u r a l l e + a m m a t t i u r a n + a m m a t t i u r a n i + a m m a t t i u r a n s a + a m m a t t i u r h e i l i j o i d e n + a m m a t t i u r h e i l i j o i t a + a m m a t t i u r h e i l u + a m m a t t i u r h e i l u a + a m m a t t i u r h e i l u j ä r j e s t ö j ä + a m m a t t i u r h e i l u n + a m m a t t i u r h e i l u s t a + a m m a t t i u r h e i l u u n + a m m a t t i v a l m e n n u s t a + a m m a t t i v a l o k u v a a j a + a m m a t t i v i l j e l i j ö i h i n + a m m a t t i v i r a n o m a i n e n + a m m a t t i y h d i s t y k s e e n + a m m a t t i y h d i s t y k s e l l ä + a m m a t t i y h d i s t y k s e n + a m m a t t i y h d i s t y k s e n s ä + a m m a t t i y h d i s t y k s e n ä + a m m a t t i y h d i s t y k s e s s ä + a m m a t t i y h d i s t y k s e t + a m m a t t i y h d i s t y k s i e n + a m m a t t i y h d i s t y k s i i n + a m m a t t i y h d i s t y k s i l l e + a m m a t t i y h d i s t y k s i l l ä + a m m a t t i y h d i s t y k s i l t ä + a m m a t t i y h d i s t y k s i s s ä + a m m a t t i y h d i s t y k s i s t ä + a m m a t t i y h d i s t y k s i ä + a m m a t t i y h d i s t y k s i ä ä n + a m m a t t i y h d i s t y s + a m m a t t i y h d i s t y s a k t i i v e i h i n + a m m a t t i y h d i s t y s a k t i i v e i l l e + a m m a t t i y h d i s t y s a k t i i v e j a + a m m a t t i y h d i s t y s a k t i i v i + a m m a t t i y h d i s t y s a k t i i v i a + a m m a t t i y h d i s t y s a k t i i v i e n + a m m a t t i y h d i s t y s a k t i i v i n a + a m m a t t i y h d i s t y s a k t i i v i t + a m m a t t i y h d i s t y s a k t i v i s t e i h i n + a m m a t t i y h d i s t y s a k t i v i s t e i l l a + a m m a t t i y h d i s t y s a k t i v i s t e j a + a m m a t t i y h d i s t y s a k t i v i s t i + a m m a t t i y h d i s t y s a k t i v i s t i a + a m m a t t i y h d i s t y s a k t i v i s t i e n + a m m a t t i y h d i s t y s a k t i v i s t i t + a m m a t t i y h d i s t y s a s i o i l l e + a m m a t t i y h d i s t y s e l i m e n + a m m a t t i y h d i s t y s h e n k i l ö + a m m a t t i y h d i s t y s h e n k i l ö i d e n + a m m a t t i y h d i s t y s h e n k i l ö i h i n + a m m a t t i y h d i s t y s h e n k i l ö n + a m m a t t i y h d i s t y s i h m i s e t + a m m a t t i y h d i s t y s j o h t a j a + a m m a t t i y h d i s t y s j o h t a j a k i n + a m m a t t i y h d i s t y s j o h t a j a n a + a m m a t t i y h d i s t y s j o h t a j a t + a m m a t t i y h d i s t y s j o h t a j i a + a m m a t t i y h d i s t y s j o h t a j i e n + a m m a t t i y h d i s t y s j o h t a j i l l e + a m m a t t i y h d i s t y s j ä r j e s t ö + a m m a t t i y h d i s t y s j ä r j e s t ö j e n + a m m a t t i y h d i s t y s j ä r j e s t ö t + a m m a t t i y h d i s t y s j ä s e n i n e e n + a m m a t t i y h d i s t y s j ä s e n t e n + a m m a t t i y h d i s t y s l i i k e + a m m a t t i y h d i s t y s l i i k e t a u s t a a n i + a m m a t t i y h d i s t y s l i i k e t t ä + a m m a t t i y h d i s t y s l i i k k e e l l e + a m m a t t i y h d i s t y s l i i k k e e l l ä + a m m a t t i y h d i s t y s l i i k k e e l t ä + a m m a t t i y h d i s t y s l i i k k e e n + a m m a t t i y h d i s t y s l i i k k e e s e e n + a m m a t t i y h d i s t y s l i i k k e e s s ä + a m m a t t i y h d i s t y s l i i k k e e s t ä + a m m a t t i y h d i s t y s l i i k k e e t + a m m a t t i y h d i s t y s l i i k k e i d e n + a m m a t t i y h d i s t y s l i i k k e i t ä + a m m a t t i y h d i s t y s l i i t t o j e n + a m m a t t i y h d i s t y s m a l l i a + a m m a t t i y h d i s t y s n e u v o s t o a + a m m a t t i y h d i s t y s n e u v o s t o t + a m m a t t i y h d i s t y s n ä k y m ä t + a m m a t t i y h d i s t y s o i k e u d e t + a m m a t t i y h d i s t y s o i k e u k s i a + a m m a t t i y h d i s t y s o i k e u k s i e n + a m m a t t i y h d i s t y s o i k e u k s i l l e + a m m a t t i y h d i s t y s o i k e u k s i s t a + a m m a t t i y h d i s t y s s o p i m u s t e n + a m m a t t i y h d i s t y s s u o j a u k s e t + a m m a t t i y h d i s t y s t a i s t e l i j a t + a m m a t t i y h d i s t y s t a p a + a m m a t t i y h d i s t y s t e n + a m m a t t i y h d i s t y s t e n k i n + a m m a t t i y h d i s t y s t e n s ä + a m m a t t i y h d i s t y s t o i m i n n a l l e + a m m a t t i y h d i s t y s t o i m i n n a n + a m m a t t i y h d i s t y s t o i m i n n a s s a + a m m a t t i y h d i s t y s t o i m i n n a s t a + a m m a t t i y h d i s t y s t o i m i n t a + a m m a t t i y h d i s t y s t o i m i n t a a + a m m a t t i y h d i s t y s t o i m i n t a a n + a m m a t t i y h d i s t y s t o i m i t s i j o i h i n + a m m a t t i y h d i s t y s t ä + a m m a t t i y h d i s t y s v a p a u d e n + a m m a t t i y h d i s t y s v a p a u d e t + a m m a t t i y h d i s t y s v a p a u k s i e n + a m m a t t i y h d i s t y s v a p a u s + a m m a t t i y h d i s t y s v a p a u t e e n + a m m a t t i y h d i s t y s v a p a u t t a + a m m a t t i y h d i s t y s v i r k a i l i j o i s t a + a m m a t t i y h d i s t y s v ä k e e n + a m m a t t i y h d i s t y s v ä k e ä + a m m a t t i y h d i s t y s v ä k i + a m m a t t i y h t e i s ö t + a m m a t t i y l e i s ö n + a m m a t t i y m p ä r i s t ö s s ä + a m m e n n e t t a v a + a m m e n t a v a t + a m m o i s i s t a + a m m o n i a k k i m i t t a u k s i a + a m m o n i a k k i n o r m i a + a m m o n i a k k i o n g e l m a + a m m o n i a k k i p ä ä s t ö j e n + a m m o n i a k k i p ä ä s t ö j ä + a m m o n i a k k i t a u l u k k o a + a m m o n i a k k i v u o d o n + a m m o n i u m a s e t a a t t i + a m m o n i u m b r o m i d i + a m m o n i u m f l u o r i d i + a m m o n i u m f o r m i a a t t i + a m m o n i u m m e t a v a n a d a a t t i + a m m o n i u m n i t r a a t i n + a m m o n i u m n i t r a a t i s t a + a m m o n i u m n i t r a a t t i a + a m m o n i u m n i t r a a t t i e n + a m m o n i u m n i t r a a t t i i n + a m m o n i u m n i t r a a t t i p o h j a i s t e n + a m m o n i u m n i t r a a t t i v a r a s t o n + a m m o n i u m p e r k l o r a a t t i + a m m o n i u m r a u t a s u l f a a t t i + a m m o n i u m s u l f a a t t i + a m m o n i u m s u l f i d i + a m m o n i u m v e t y k a r b o n a a t t i + a m m o n i u m v e t y s u l f a a t t i + a m m o n i u m v e t y s u l f i d i + a m m o t t a v a a + a m m o t t a v a n + a m m u k s e t + a m m u k s i a + a m m u n t a p e l i + a m m u s k e l u t a p a h t u m a + a m m u s t e n + a m m u s t y y p p i e n + a m m u s v a r a s t o j e n + a m m u s v e i t s i + a m m u t a a n + a m m u t t i i n + a m m u t t u + a m p e e r i t u n t i + a m p i a i s h ä m ä h ä k k i + a m p i a i s o r h o + a m p i a i s p e s ä s s ä + a m p i a i s p e s ä s t ä + a m p i a i s p e s ä ä n + a m p i a i s p u u p i s t i ä i n e n + a m p i a i s y h d y s k u n t i e n + a m p i s i l l i i n i a n t i b i o o t i l l e + a m p i s i l l i i n i l l e + a m p i s i l l i i n i v a s t u s t u s k y k y g e e n i + a m p i s i l l i i n i v a s t u s t u s k y k y y n + a m p l i t u d i m o d u l a a t i o + a m p p e l i r u s o k k i + a m p u a + a m p u i + a m p u j a k a l a + a m p u j i e n + a m p u l e x + a m p u m a h i i h t o l i i t t o + a m p u m a l l a + a m p u m a t t a + a m p u u + a m p u v a t + a m y l o i d i p r e k u r s o r i p r o t e i i n i + a n a a l i h e l m e t + a n a a l i r a u h a n e n + a n a a l i s e k s i + a n a a l i t a p p i + a n a a l i v a i h e + a n a b o l i s t e n + a n a e r o b i s e s t i + a n a l o g i a k o n e + a n a l o g i s e s t a + a n a l o g i s e t + a n a l o g i s i a + a n a l o g i s i s t a + a n a l y s o i d a + a n a l y s o i d a a n + a n a l y s o i d a k s e e n + a n a l y s o i d a k s e n n e + a n a l y s o i d e s s a a n + a n a l y s o i d e s s a m m e + a n a l y s o i d e s s a n i + a n a l y s o i d u t + a n a l y s o i k a a m m e + a n a l y s o i m a a n + a n a l y s o i m a s s a + a n a l y s o i m a t t a + a n a l y s o i m i n e n + a n a l y s o i m i s e e n + a n a l y s o i m i s t a + a n a l y s o i n e e t + a n a l y s o i n n i n + a n a l y s o i n t i a + a n a l y s o i n t i j a k s o + a n a l y s o i n t i k a n a v a n s a + a n a l y s o i n t i k y k y ä + a n a l y s o i n t i m a h d o l l i s u u k s i i n + a n a l y s o i n t i m e n e t e l m i e n + a n a l y s o i n t i m e n e t e l m i i n + a n a l y s o i n t i m e n e t e l m i ä + a n a l y s o i n t i m e n e t e l m ä t + a n a l y s o i n t i m e n e t t e l y + a n a l y s o i n t i r e s u r s s e j a + a n a l y s o i n t i v a i h e e s s a + a n a l y s o i n t i v e r k o s t o n + a n a l y s o i n t i v ä l i n e + a n a l y s o i n t i v ä l i n e i t ä + a n a l y s o i n t i y k s i k k ö + a n a l y s o i t a e s s a + a n a l y s o i v a n + a n a l y s o i v a t + a n a l y y s e i h i n + a n a l y y s e i s t ä ä n + a n a l y y s e j ä + a n a l y y s e j ä ä n + a n a l y y s i a s i a k i r j a + a n a l y y s i e m m e + a n a l y y s i e n + a n a l y y s i i n + a n a l y y s i k e h y s + a n a l y y s i k e s k u k s e s s a + a n a l y y s i l l ä + a n a l y y s i m e n e t e l m i i n + a n a l y y s i m e n e t e l m i s t ä + a n a l y y s i m e n e t e l m i ä + a n a l y y s i m e n e t e l m ä + a n a l y y s i m e n e t e l m ä l l ä + a n a l y y s i m e n e t e l m ä n + a n a l y y s i m e n e t e l m ä t + a n a l y y s i m e n e t e l m ä ä + a n a l y y s i n + a n a l y y s i o s a a + a n a l y y s i s s ä ä n + a n a l y y s i s t ä + a n a l y y s i s t ä n n e + a n a l y y s i t + a n a l y y s i t a p o i h i n + a n a l y y s i t a r k o i t u k s i i n + a n a l y y s i t e k n i i k k o j e n + a n a l y y s i t i e d o s t o j a + a n a l y y s i t i e t o i h i n s a + a n a l y y s i t i e t o k a n t o j a + a n a l y y s i t i e t o k a n t o j e n + a n a l y y s i t o d i s t u s t a + a n a l y y s i t u l o k s e t + a n a l y y s i t u l o s t e n + a n a l y y s i t u t k i m u k s i a + a n a l y y s i v a i h e e s e e n + a n a l y y s i v a i h e i d e n + a n a l y y s i v a l m i u d e t + a n a l y y s i v i r h e + a n a l y y s i v ä l i n e + a n a l y y s i y k s i k k ö ä + a n a l y y s i y k s i k k ö ö n + a n a l y y s i y k s i k ö s t ä + a n a l y y s i ä + a n a l y y t i k k o j e n + a n a l y y t t i s e m m i n + a n a l y y t t i s e m p i e n + a n a l y y t t i s e m p i i n + a n a l y y t t i s e m p i ä + a n a l y y t t i s e n + a n a l y y t t i s i n + a n a n a s ö l j y + a n a r k i a a + a n a r k i s m i s y m b o l i i k k a + a n a s t a a + a n a t o l i a n k o i r a + a n a t o l i a s s a + a n d r o g e e n i r e s e p t o r i + a n e k a u p p a a + a n e l t a v a + a n e m i a a + a n g e r v o h o p e a t ä p l ä + a n g i o t e n s i i n i r e s e p t o r i n + a n g l i k a a n i p i i s p a + a n g l o a m e r i k k a l a i s e e n + a n g l o a m e r i k k a l a i s e n + a n g l o a m e r i k k a l a i s e s t a + a n g l o a m e r i k k a l a i s e t + a n g l o a m e r i k k a l a i s t a + a n g l o i n t i a l a i s e t + a n g l o s a k s i e n + a n g l o s a k s i s e e n + a n g l o s a k s i s e l t a + a n g l o s a k s i s e n + a n g l o s a k s i s e s s a + a n g l o s a k s i s e s t a + a n g l o s a k s i s e t + a n g l o s a k s i s i a + a n g l o s a k s i s i s s a + a n g l o s a k s i s t a + a n g l o s a k s i s t e n + a n g l o s a k s i t + a n g o l a l a i s e t + a n g o l a l a i s i a + a n g o l a l a i s t e n + a n g o r a k i s s a + a n g o r a v i l l a + a n g o r a v u o h i + a n h y d r i i t t i k a i v o k s e t + a n i m a a t i o e l o k u v i a + a n i m a a t i o e l o k u v i s t a + a n i m a a t i o s a r j o i s t a + a n i m a a t i o u n i v e r s u m i + a n i s h e r k k u s i e n i + a n i s m a l i k k a + a n k a n p o i k a n e n + a n k a r a a + a n k a r a a n + a n k a r a m m a n + a n k a r a m m a t + a n k a r a m m i k s i + a n k a r a m m i n + a n k a r a m p a a + a n k a r a m p i + a n k a r a m p i a + a n k a r a m p i e n + a n k a r a m p i i n + a n k a r a n + a n k a r a s s a + a n k a r a s t i k i n + a n k a r a t + a n k a r i a + a n k a r i e n + a n k a r i i n + a n k a r i k s i + a n k a r i m m a n + a n k a r i m m a s t a + a n k a r i m m i n + a n k a r i m m i s t a + a n k a r i m p i a + a n k a r i m p i e n + a n k a r i n + a n k a r i n a + a n k a r u u t t a + a n k e r i a a n h o i t o a + a n k e r i a a n h o i t o s u u n n i t e l m a + a n k e r i a a n h o i t o s u u n n i t e l m a n s a + a n k e r i a a n h o i t o s u u n n i t e l m a t + a n k e r i a a n h o i t o s u u n n i t e l m i a + a n k e r i a a n k a l a s t u s t a + a n k e r i a i d e n + a n k e r i a i s t a + a n k e r i a s f a r m e i l l e + a n k e r i a s k a n n a n + a n k e r i a s k a n n a t + a n k e r i a s k a n t a + a n k e r i a s k a n t o j a + a n k e r i a s k a n t o j e n + a n k e r i a s k a s v a t t a m o j e n + a n k e r i a s m o n n i t + a n k e r i a s t u o t a n t o + a n k e r i a s v e s i s t ö a l u e e n s a + a n k k a j o u t s e n + a n k k a t e s t i + a n k k u r i l a p s i + a n k k u r i m a i h i n + a n k k u r o i m i s t a + a n k k u r o i t a v a + a n k k u r o i t u m i s a l u e i t a + a n k k u r o i t u u n + a n n a m m e + a n n a m m e k i n + a n n a m m e k o + a n n a n + a n n a n k i n + a n n a t k o + a n n a t t e + a n n a t t e k o + a n n e t a + a n n e t a a n + a n n e t a a n k o + a n n e t t a e s s a + a n n e t t a i s i i n + a n n e t t a v a + a n n e t t a v a a + a n n e t t a v a a n + a n n e t t a v a k s i + a n n e t t a v a s s a + a n n e t t a v i a + a n n e t t a v i e n + a n n e t t a v i s t a + a n n e t t i i n + a n n e t t u a + a n n e t t u i h i n + a n n e t t u j a + a n n e t u i s t a + a n n e t u l l a + a n n e t u n + a n n e t u t + a n n o i m m e + a n n o i n + a n n o i n k i n + a n n o i t t e + a n n o s s u o s i t u k s i a + a n n o s t u s o h j e e t + a n o i s i m m e + a n o m u k s e n + a n o m u k s e n s a + a n o m u k s i a k a a n + a n o n y y m i ä + a n o p i n i s t u i n + a n o t t a v a + a n s a a n + a n s a i n n e e n i + a n s a i n n e e n s a + a n s a i n n e e t + a n s a i n n u t + a n s a i t a + a n s a i t a k s e e n + a n s a i t s e e + a n s a i t s e e k i n + a n s a i t s e e k o + a n s a i t s e m a + a n s a i t s e m a a + a n s a i t s e m a a n + a n s a i t s e m a l l a + a n s a i t s e m a n + a n s a i t s e m a n s a + a n s a i t s e m m e + a n s a i t s e t t e k o + a n s a i t s e v a n + a n s a i t s e v a t + a n s a i t s i + a n s a i t s i m m e + a n s a i t s i s i + a n s a i t t a v a + a n s a i t t u a + a n s a i t t u j a + a n s a i t u i s t a + a n s a i t u n + a n s a i t u t + a n s a k u o p p a + a n s a m e t s ä s t y k s e s t ä + a n s a p y y n n i s t ä + a n s a p y y n t i + a n s a r a u d a t + a n s a r a u d o i l l a + a n s a r a u d o i l l e + a n s a r a u d o i s s a + a n s a r a u d o i s t a + a n s a r a u t a k y s y m y k s e s s ä + a n s a r a u t a k y s y m y s t ä + a n s a r a u t o j a + a n s a r a u t o j e n + a n s a r i j a u h i a i n e n + a n s a r i k i r v a + a n s a r i p e t o p u n k k i + a n s a r i s i r k k a + a n s a s t a n d a r d i n + a n s a t y y p i n + a n s a t y y p i t + a n s i o i d e n + a n s i o i d e n s a + a n s i o i h i n + a n s i o i h i n s a + a n s i o i s t a + a n s i o i t a + a n s i o i t a n n e + a n s i o k a s t a + a n s i o k k a a n + a n s i o k k a a s t a + a n s i o k k a i m p i a + a n s i o k k a i t a + a n s i o k s i + a n s i o k y k y ä + a n s i o l e n t o t o i m i n t a a + a n s i o l u e t t e l o + a n s i o l u e t t e l o a + a n s i o l u e t t e l o i t a + a n s i o l u e t t e l o n + a n s i o l u e t t e l o n s a + a n s i o l u e t t e l o o n s a + a n s i o l u e t t e l o s t a + a n s i o l u e t t e l o s t a n i + a n s i o m a h d o l l i s u u k s i a + a n s i o m a h d o l l i s u u k s i i n + a n s i o m e r k i n + a n s i o n a + a n s i o n m e n e t y k s i ä + a n s i o n m e n e t y s t u k i a + a n s i o n s a + a n s i o r i s t i n + a n s i o r i t a r i k u n t a + a n s i o s i d o n n a i s t e n + a n s i o s t a n n e + a n s i o t + a n s i o t a + a n s i o t a a n + a n s i o t a s o + a n s i o t a s o a + a n s i o t o i m i n t a + a n s i o t o i m i n t a a + a n s i o t u l o j a + a n s i o t u l o j e n + a n s i o t u l o v e r o j a + a n s i o t u l o v e r o n + a n s i o t y ö + a n s i o t y ö h ö n + a n s i o t y ö n + a n s i o t y ö n s ä + a n s i o t y ö n ä + a n s i o t y ö s s ä + a n s i o t y ö t ä + a n s i o t y ö v e r o t u k s e n + a n s i o t ö i s s ä + a n s i o v e r o t u s k i n + a n s o i h i n + a n s o j a + a n s o j e n + a n t a a + a n t a a k i n + a n t a a k o + a n t a a k s e e n + a n t a a k s e m m e + a n t a a k s e n i + a n t a a k s e n n e + a n t a e n + a n t a e s s a a n + a n t a e s s a m m e + a n t a i s i + a n t a i s i m m e + a n t a i s i n + a n t a i s i t t e k o + a n t a i s i v a t + a n t a j a m a i d e n + a n t a j a m a i h i n + a n t a j a m a i l l e + a n t a j a m a i s t a + a n t a j a m a i t a + a n t a j a n a + a n t a j i e n + a n t a j i s t a + a n t a k a a + a n t a k a a m m e + a n t a m a a + a n t a m a a m m e + a n t a m a a n + a n t a m a a n s a + a n t a m a l l a + a n t a m a n + a n t a m a n n e + a n t a m a n s a + a n t a m a s s a + a n t a m a s t a + a n t a m a t t a + a n t a m i a + a n t a m i i n + a n t a m i s e e n + a n t a m i s e k s i + a n t a m i s e s t a + a n t a m i s h e t k e l l ä + a n t a m i s s a + a n t a m i s t a + a n t a n e e t + a n t a n u t + a n t a u m u k s e l l a + a n t a u m u k s e l l i s e s t a + a n t a u t u a + a n t a u t u m i s k u t s u + a n t a u t u m i s t a + a n t a u t u m i s t a r j o u k s e s t a + a n t a v a l l e + a n t a v a n + a n t a v a s s a + a n t a v a t + a n t a v i e n + a n t a v i l l a + a n t a v i l l e + a n t e e k s i a n t a m a t o n t a + a n t e e k s i a n t a m a t t o m a m p a a + a n t e e k s i a n t a m a t t o m i m m a t + a n t e e k s i a n t a m i s e s t a + a n t e e k s i p y y n n ö n + a n t e e k s i p y y n t ö i n e e n + a n t e e k s i p y y n t ö n i + a n t e e k s i p y y n t ö n ä + a n t e i h i n + a n t e j a + a n t e l i a a m m a l l a + a n t e l i a a m m a n + a n t e l i a a m m i n + a n t e l i a a m p a a + a n t e l i a a m p i + a n t e l i a a m p i a + a n t e l i a a m p i e n + a n t e l i a i m m a t + a n t e l i a i m m i s t a + a n t e l i a i m p i a + a n t e l i a i n + a n t e l i a i s u u d e s t a + a n t e l i a i s u u t e e n + a n t e l i a i s u u t t a + a n t e l i a i t a + a n t e n n i l i i t i n + a n t e n n i s i i p i s i m p p u + a n t i b i o o t e i l l e + a n t i b i o o t e i s t a + a n t i b i o o t i s t a + a n t i b i o o t i t + a n t i b i o o t t e j a + a n t i b i o o t t i a n n o k s i s t a + a n t i b i o o t t i a s e e n + a n t i b i o o t t i e n + a n t i b i o o t t i g e e n i + a n t i b i o o t t i h o i t o i h i n + a n t i b i o o t t i j ä ä m i ä + a n t i b i o o t t i k i e l t o a + a n t i b i o o t t i k u u r e j a + a n t i b i o o t t i l i s i e n + a n t i b i o o t t i l ä ä k k e i d e n + a n t i b i o o t t i l ä ä k k e i s s ä + a n t i b i o o t t i l ä ä k k e i t ä + a n t i b i o o t t i m a r k k e r i e n + a n t i b i o o t t i m ä ä r ä + a n t i b i o o t t i o n g e l m a n + a n t i b i o o t t i r e s i s t a n s s i m a r k k e r i g e e n e j ä + a n t i b i o o t t i r e s i s t a n s s i n + a n t i b i o o t t i r e s i s t e n s s i + a n t i b i o o t t i r e s i s t e n s s i g e e n e j ä + a n t i b i o o t t i r e s i s t e n s s i g e e n i e n + a n t i b i o o t t i r e s i s t e n s s i i n + a n t i b i o o t t i r e s i s t e n s s i m a r k k e r e i d e n + a n t i b i o o t t i r e s i s t e n s s i m a r k k e r e i l l e + a n t i b i o o t t i r e s i s t e n s s i m a r k k e r e i t a + a n t i b i o o t t i r e s i s t e n s s i m a r k k e r i e n + a n t i b i o o t t i r e s i s t e n s s i m a r k k e r i t + a n t i b i o o t t i r e s i s t e n s s i n + a n t i b i o o t t i r e s i s t e n s s i s t ä + a n t i b i o o t t i r e s i s t e n s s i ä + a n t i b i o o t t i r e s i s t e n t i n + a n t i b i o o t t i r e s i s t e n t i t + a n t i b i o o t t i r e s i s t e n t t e j ä + a n t i b i o o t t i r e s i s t e n t t i + a n t i b i o o t t i r i p u l i + a n t i b i o o t t i r y h m ä + a n t i b i o o t t i t i e t o p ä i v ä + a n t i b i o o t t i t i e t o p ä i v ä n + a n t i b i o o t t i v a l i s t u k s e n + a n t i b y r o k r a a t t i n e n + a n t i d e m o k r a a t t i n e n + a n t i d e m o k r a a t t i s e n + a n t i d e m o k r a a t t i s e n a + a n t i d e m o k r a a t t i s e s t a + a n t i d e m o k r a a t t i s i a + a n t i d e m o k r a a t t i s t a + a n t i d e m o k r a a t t i s t e n + a n t i d e m o k r a t i o i t a + a n t i d o p i n g + a n t i d o p i n g i a + a n t i d o p i n g k o n f e r e n s s i a + a n t i d o p i n g p o l i t i i k a n + a n t i d o p i n g p o l i t i i k k a a + a n t i d o p i n g t o i m i s t o + a n t i d o p i n g t o i m i s t o a + a n t i d o p i n g t o i m i s t o j e n + a n t i d o p i n g t o i m i s t o n + a n t i d o p i n g t o i m i s t o s s a + a n t i d o p i n g t o i m i s t o s t a + a n t i d o p i n g y k s i k k ö + a n t i d o p i n g y k s i k k ö ä + a n t i d o p i n g y k s i k k ö ö n + a n t i d o p i n g y k s i k ö l l e + a n t i d o p i n g y k s i k ö n + a n t i e u r o o p p a l a i s i a + a n t i e u r o o p p a l a i s i n a + a n t i e u r o o p p a l a i s i s t a + a n t i f a s i s m i + a n t i f a s i s t i a + a n t i f a s i s t i n e n + a n t i f a s i s t i s e s t a + a n t i f e d e r a l i s t e j a + a n t i f e d e r a l i s t i + a n t i g e e n i r e s e p t o r i + a n t i g r a v i t a a t i o + a n t i h i s t a m i i n i + a n t i h u u m o r i + a n t i i k i n + a n t i i k i s s a + a n t i i k k i a u t o j e n + a n t i i k k i k a u p p a a + a n t i i k k i k a u p p i a i d e n + a n t i i k k i m a r k k i n o i l l a + a n t i i k k i s i a + a n t i i k k i s i l l e + a n t i k a n s a l l i n e n + a n t i k a p i t a l i s m i + a n t i k a t o l i s e t + a n t i k o h e e s i o i v a a + a n t i k o l o n i a l i s t i n e n + a n t i k o l o n i a l i s t i s e s t a + a n t i k o m m u n i s m i + a n t i k u l t t i l i i k e + a n t i l i b e r a a l i i n + a n t i l i b e r a a l i s t a + a n t i l i b e r a l i s m i s t a + a n t i l i b e r a l i s t i n e n + a n t i l i b e r a l i s t i s t a + a n t i l o o p p i j ä n i s + a n t i l o o p p i r o t t a + a n t i m i k r o b i s e e n + a n t i m i k r o b i s e n + a n t i m i k r o b i s e t + a n t i m i k r o b i s i l l a + a n t i m i k r o b i s t a + a n t i m i k r o b i s t e n + a n t i m i l i t a r i s m i n + a n t i m i l i t a r i s m i s t a + a n t i m i l i t a r i s t i n e n + a n t i m o n i p e n t a f l u o r i d i + a n t i m o n i t r i k l o r i d i + a n t i m o n i t r i o k s i d i + a n t i m u u r i n p o h j a p a n n u + a n t i n a t i o n a l i s m i n + a n t i o k i a + a n t i p a t e r + a n t i p o d i e n v i h e r k a i j a + a n t i p o d i s a a r e t + a n t i r a s i s m i + a n t i r a s i s t i n a + a n t i r e a l i s m i + a n t i r e t r o v i r a a l i s e l l e + a n t i r e t r o v i r a a l i s e n + a n t i r e t r o v i r a a l i s i a + a n t i r e t r o v i r a a l i s t a + a n t i r e t r o v i r u s h o i t o o n + a n t i r e t r o v i r u s l ä ä k e h o i d o n + a n t i r e t r o v i r u s l ä ä k k e i d e n + a n t i r e t r o v i r u s l ä ä k k e i t ä + a n t i s a n k a r i n + a n t i s e m i i t t i e n + a n t i s e m i i t t i s e s t ä + a n t i s e m i i t t i s e t + a n t i s e m i t i s m i + a n t i s e m i t i s m i i n + a n t i s e m i t i s m i k i n + a n t i s e m i t i s m i k s i + a n t i s e m i t i s m i k y s y m y s + a n t i s e m i t i s m i l l e + a n t i s e m i t i s m i l t ä + a n t i s e m i t i s m i n + a n t i s e m i t i s m i s t ä + a n t i s e m i t i s m i ä + a n t i s e p a r a t i s t i n e n + a n t i s e p a r a t i s t i s e e n + a n t i s e p a r a t i s t i s e n + a n t i s e p a r a t i s t i s e s t a + a n t i s i o n i s m i + a n t i s i o n i s m i n + a n t i s o s i a a l i n e n + a n t i s o s i a a l i s e n + a n t i s o s i a a l i s e s t a + a n t i s o s i a a l i s e t + a n t i s o s i a a l i s i a + a n t i s o s i a a l i s t a + a n t i s u u n n i t t e l u m a l l i + a n t i s y k l i s t ä + a n t i v i r u s h o i t o a + a n t i v i r u s l ä ä k k e i d e n + a n t i v i r u s l ä ä k k e i t ä + a n t o i + a n t o i n e + a n t o i s a k s i + a n t o i s a m p a a + a n t o i s a m p i + a n t o i s a m p i a + a n t o i s i a + a n t o i s i m m i s t a + a n t o i v a t + a n t o l a i n a u s t a + a n t o l a i n a u s t o i m i n t a a n s a + a n t r o p o l o g i s i s t a + a n t u r e i l l a + a n t u r i l a i t t e i s t o n + a n t u r i t e k n o l o g i a + a o r t t a l ä p p ä l e i k k a u s + a p a j i l l e + a p a r t h e i d j ä r j e s t e l m ä + a p a r t h e i d j ä r j e s t e l m ä n + a p a r t h e i d v a l t i o t a + a p a s s i l i n n a k e + a p a s s i s o d a t + a p a s s i s o l a s s a + a p e n n i i n i e n a j o k o i r a + a p e n n i i n i e n p a i m e n k o i r a + a p i l a h e i n ä n + a p i l a k e h r ä ä j ä + a p i l a n u r m i s e o k s e t + a p i l a n v i e r a s + a p i l a s a n i a i n e n + a p i n a k u n i n g a s + a p i n a m i e s + a p i n a n l e i p ä p u u + a p o s t o l i n m i e k k a + a p o s t o l i s e n + a p p e l s i i n i k r i i s i n + a p p e l s i i n i m e h u + a p p e l s i i n i m e h u l l a + a p p e l s i i n i m e h u n + a p p e l s i i n i m e h u u n + a p p e l s i i n i n k u k k a v e s i + a p p e l s i i n i p u i t a + a p r i l l a t a + a p r i l l i a + a p r i l l i p i l a a + a p r i l l i p i l a a n + a p r i l l i p ä i v ä + a p r i l l i p ä i v ä n + a p r i l l i p ä i v ä n ä + a p r i l l i p ä i v ä ä + a p r i l l i p ä i v ä ä n + a p t e e k e i s s a + a p t e e k e i s t a + a p t e e k k a r i t + a p t e e k k i k e t j u n + a p t e e k k i k y s y m y s t ä + a p u a a n + a p u a i n e e t + a p u a i n e i d e n + a p u a i n e i n a + a p u a l u s + a p u a m m e + a p u a n n e + a p u a s i a k i r j o j a + a p u d i r e k t i i v i n + a p u j o u k k o j a + a p u j o u k k o j e n + a p u j ä r j e s t e l m ä + a p u j ä r j e s t e l m ä n + a p u j ä r j e s t e l m ä ä + a p u j ä r j e s t e l y j ä + a p u j ä r j e s t ö + a p u j ä r j e s t ö i l l ä + a p u j ä r j e s t ö j e n + a p u j ä r j e s t ö t + a p u k e i n o + a p u k e i n o i s t a + a p u k e i n o j a + a p u k i e l e n ä + a p u k i e l i + a p u l a i s a l i v a l t i o s i h t e e r i + a p u l a i s e s i t t e l i j ä + a p u l a i s e s i t t e l i j ä ä n i + a p u l a i s e s i t t e l i j ö i t ä + a p u l a i s h e n k i l ö s t ö p ä ä l l i k k ö n s ä + a p u l a i s h o i t a j a + a p u l a i s i a + a p u l a i s j o h t a j a n + a p u l a i s k a u p u n g i n j o h t a j a + a p u l a i s k a u p u n g i n j o h t a j a n + a p u l a i s k a u p u n g i n j o h t a j a n a + a p u l a i s k i r j a a j a + a p u l a i s k i r j a a j a n + a p u l a i s k o m e n t a j a + a p u l a i s k o m e n t a j a a + a p u l a i s m i n i s t e r e i l l ä + a p u l a i s m i n i s t e r i + a p u l a i s m i n i s t e r i k s i + a p u l a i s m i n i s t e r i n + a p u l a i s o h j a a j a + a p u l a i s o i k e u s k a n s l e r i + a p u l a i s p i i s p a n + a p u l a i s p o l i i s i k s i + a p u l a i s p o l i i s i p ä ä l l i k k ö + a p u l a i s p ä ä j o h t a j a + a p u l a i s p ä ä l l i k k ö n ä + a p u l a i s p ä ä m i n i s t e r i + a p u l a i s p ä ä m i n i s t e r i n + a p u l a i s p ä ä s i h t e e r i + a p u l a i s p ä ä s i h t e e r i l l e + a p u l a i s p ä ä s i h t e e r i l t ä + a p u l a i s p ä ä s i h t e e r i n + a p u l a i s p ä ä s i h t e e r i n ä + a p u l a i s p ä ä s i h t e e r i ä + a p u l a i s s e r i f f e i n ä + a p u l a i s s h e r i f f i + a p u l a i s s i h t e e r i + a p u l a i s s y y t t ä j ä + a p u l a i s t i e t o s u o j a v a l t u u t e t t u + a p u l a i s t i e t o s u o j a v a l t u u t e t u l l e + a p u l a i s t i e t o s u o j a v a l t u u t e t u n + a p u l a i s u l k o m i n i s t e r i + a p u l a i s u l k o m i n i s t e r i n + a p u l a i s v a l t u u t e t t u + a p u l a i s y l i k o n s t a a p e l i + a p u l u p a u s t e n + a p u l ä h e t y k s e t + a p u m a k s u j a + a p u m m e + a p u n a + a p u o h j e l m a a + a p u o h j e l m i a + a p u o h j e l m i e n + a p u o h j e l m i i n + a p u o h j e l m i l l a + a p u o l e n t o + a p u p a k e t e i s t a + a p u p a k e t i n + a p u p a k e t i s t a + a p u p a k e t t e j a + a p u p a k e t t i + a p u p a k e t t i a + a p u p a k e t t i i n + a p u p a l v e l u j a + a p u p o l i t i i k a n + a p u p o l i t i i k a s t a + a p u p o n n i s t e l u j e n + a p u p r o j e k t i n + a p u r a h a j ä r j e s t e l m ä + a p u r a h a j ä r j e s t e l m ä n + a p u r a h a o h j e l m a + a p u r a h a o h j e l m a a + a p u r a h a o h j e l m a n + a p u r a h a o h j e l m i a + a p u r a h a o h j e l m i e n + a p u r a h a p o l i t i i k k a a + a p u r a h a r a h a s t o + a p u r a h a t + a p u r a h o j a + a p u r a h o j e n + a p u r i s t e i l i j ä + a p u s a a t t u e i d e n + a p u s i t o u m u k s e n s a + a p u s i t o u m u k s e t + a p u s i t o u m u s t e n + a p u s o p i m u k s i s t a + a p u s o p i m u s + a p u s t r a t e g i a n + a p u s u u n n i t e l m a n + a p u t a r p e i t a + a p u t a r v i k k e i d e n + a p u t i l a s t o t + a p u t o i m e n p i t e i l l ä + a p u t o i m e n p i t e i s t ä + a p u t o i m e n p i t e i t ä + a p u t o i m e t + a p u t o i m i a + a p u t o i m i e n + a p u t o i m i i n + a p u t o i m i s t a + a p u t o i m i s t o j e n + a p u t y ö n t e k i j ö i h i n + a p u t ö i s t ä + a p u u n + a p u v a r o i s t a + a p u v e r b i + a p u v i i d a k k o o n + a p u v ä l i n e + a p u v ä l i n e e k s i + a p u v ä l i n e e n ä + a p u v ä l i n e i d e n + a p u v ä l i n e i n ä + a p u v ä l i n e i t ä + a p u v ä l i n e i t ä m m e + a p u v ä l i n e t e k n i i k o i t a + a p u v ä l i n e t e k n o l o g i a + a p u v ä l i n e t e k n o l o g i a l l a + a p u v ä l i n e t e k n o l o g i a n + a p u v ä l i n e t t ä + a p u y h d i s t y s + a r a b e j a + a r a b i a k a t e e m i k o t + a r a b i a l a i s t a + a r a b i a l k u p e r ä ä + a r a b i a l u e e l l e + a r a b i a l u e e s t a + a r a b i a l u e e t + a r a b i a l u e i l l a + a r a b i a l u e i l t a + a r a b i a l u e i t a + a r a b i a n + a r a b i a n a a v i k k o k i u r u + a r a b i a n b u l b u l i + a r a b i a n h e v o n e n + a r a b i a n k a h v i + a r a b i a n k e r t t u + a r a b i a n k u l t a v a r p u n e n + a r a b i a n l a h d e n + a r a b i a n m e r i + a r a b i a n m e r i m e t s o + a r a b i a n p i k k u t i i r a + a r a b i a n s u s i + a r a b i a n t i i r a + a r a b i a n t i k k a + a r a b i a n t i m a l i + a r a b i a n t ä h d i k k i + a r a b i a n v a h a n o k k a + a r a b i a s s a + a r a b i d e s p o o t t e j a + a r a b i d i k t a t u u r i e n + a r a b i d i p l o m a a t t i k u n t a a n + a r a b i e d u s t a j i e n + a r a b i e m i i r i k u n n a t + a r a b i e m i i r i k u n n i l l e + a r a b i e m i i r i k u n n i l t a + a r a b i e m i i r i k u n n i s s a + a r a b i e m i i r i k u n n i s t a + a r a b i e m i i r i k u n t i e n + a r a b i e m i i r i k u n t i i n + a r a b i e m i r a a t i t + a r a b i e m i r a a t t i e n + a r a b i e n + a r a b i h a l l i n n o i l l e + a r a b i h a l l i n n o i s t a + a r a b i h a l l i t u s + a r a b i h a u k k a + a r a b i h e i m o l l a + a r a b i h u i p p u k o k o u k s e l l e + a r a b i j o h t a j a + a r a b i j o h t a j a a + a r a b i j o h t a j a t + a r a b i j o h t a j i e n + a r a b i j o h t a j i l l a + a r a b i j o u k o t + a r a b i k a n a v i a + a r a b i k a n s a a + a r a b i k a n s a k u n t a + a r a b i k a n s a l a i s e t + a r a b i k a n s a l a i s i l t a + a r a b i k a n s a l a i s i s t a + a r a b i k a n s a t + a r a b i k a n s o j a + a r a b i k a n s o j e n + a r a b i k a p i n a + a r a b i k e v ä t + a r a b i k e v ä t t ä + a r a b i k e v ä ä k s i + a r a b i k e v ä ä n + a r a b i k e v ä ä s t ä + a r a b i k u l t t u u r i a + a r a b i k u l t t u u r i i n + a r a b i k u m i + a r a b i k u m p p a n e i d e m m e + a r a b i k u m p p a n e i d e n + a r a b i k u m p p a n e i l l e m m e + a r a b i k u m p p a n i e n + a r a b i k u m p p a n i m m e + a r a b i k y l ä s t ä + a r a b i l a p s i l l e + a r a b i l a s t e n + a r a b i l e i r i + a r a b i l i i g a + a r a b i l i i k k e i s t ä + a r a b i l i i t o l l a + a r a b i l i i t o l l e + a r a b i l i i t o l t a + a r a b i l i i t o n + a r a b i l i i t o n k a a n + a r a b i l i i t o s s a + a r a b i l i i t t o + a r a b i l i i t t o a + a r a b i l i i t t o o n + a r a b i m a a + a r a b i m a a h a n m u u t t a j a t + a r a b i m a a i l m a + a r a b i m a a i l m a a + a r a b i m a a i l m a a n + a r a b i m a a i l m a k i n + a r a b i m a a i l m a l l a + a r a b i m a a i l m a l l e + a r a b i m a a i l m a n + a r a b i m a a i l m a s s a + a r a b i m a a i l m a s t a + a r a b i m a a l t a + a r a b i m a a n + a r a b i m a a s s a + a r a b i m a a s t a + a r a b i m a a t + a r a b i m a a t a + a r a b i m a i d e n + a r a b i m a i h i n + a r a b i m a i k s i + a r a b i m a i l l a + a r a b i m a i l l e + a r a b i m a i l t a + a r a b i m a i s s a + a r a b i m a i s t a + a r a b i m a i t a + a r a b i m i e h e t + a r a b i m i l i i s i j o u k o t + a r a b i m u s l i m e j a + a r a b i n a a p u r e i d e n + a r a b i n a a p u r e i h i n + a r a b i n a a p u r e i l l e m m e + a r a b i n a a p u r i m m e + a r a b i n a a p u r i n s a + a r a b i n a a p u r i t + a r a b i n a a p u r i v a l t i o i l l e + a r a b i n a i s t e n + a r a b i n a t i o n a l i s m i + a r a b i n a t i o n a l i s m i i n + a r a b i n u o r i a + a r a b i o s a p u o l e n + a r a b i o s a p u o l i + a r a b i p a i m e n t o l a i s e t + a r a b i p e r h e e s s ä + a r a b i p o l i i t i k k o j a + a r a b i p o l i i t i k o t + a r a b i r u n o i l i j a + a r a b i r y h m ä + a r a b i s o s i a l i s m i + a r a b i t + a r a b i t a l o u k s i a + a r a b i t a s a v a l l a n + a r a b i t a s a v a l t a + a r a b i t a s a v a l t a a + a r a b i t o i m i t t a j a t + a r a b i t u t k i j o i s t a + a r a b i u n i o n i n + a r a b i v a l l a n k u m o u k s e s s a + a r a b i v a l l a n k u m o u s + a r a b i v a l l a n k u m o u s t a + a r a b i v a l l a n k u m o u s t e n + a r a b i v a l t i o + a r a b i v a l t i o i d e n + a r a b i v a l t i o i h i n + a r a b i v a l t i o i l l e + a r a b i v a l t i o i l t a + a r a b i v a l t i o i s s a + a r a b i v a l t i o i s t a + a r a b i v a l t i o i t a + a r a b i v a l t i o n + a r a b i v a l t i o s s a + a r a b i v a l t i o s t a + a r a b i v a l t i o t + a r a b i v a l t i o t a + a r a b i v a l t o j e n + a r a b i v a l t u u s k u n t i e n + a r a b i v a s t a i s u u s + a r a b i v e l j i e n s ä + a r a b i v o i m i e n + a r a b i v ä e s t ö + a r a b i v ä e s t ö n + a r a b i v ä e s t ö ä + a r a b i v ä h e m m i s t ö ä + a r a b i y h t e i s k u n n a t + a r a b i y h t e i s k u n t a a + a r a b i y h t e i s k u n t i e n + a r a b i y h t e i s t y ö k u m p p a n e i l l e + a r a b i y h t e i s ö + a r a b i y h t e i s ö j e n + a r a b i y h t e i s ö s t ä + a r a b i y h t e i s ö ä + a r a b i y s t ä v i e m m e + a r a b i y s t ä v i s t ä + a r a b i y s t ä v i ä + a r a b i y s t ä v i ä m m e + a r a g o n i a l a i s i s t a + a r a n s a a r e t + a r a s t e l l a + a r a v a n a + a r b i t r a a s i s t r a t e g i o i h i n + a r g i n i i n i m e r i p i h k a h a p p o + a r g o n f l u o r i h y d r i d i + a r g u m e n t e i n + a r g u m e n t e i s s a + a r g u m e n t e i s t a + a r g u m e n t i n + a r g u m e n t i t + a r g u m e n t o i d a + a r g u m e n t o i n t i a + a r g u m e n t t e i n a + a r g u m e n t t e j a + a r g u m e n t t i a + a r g u m e n t t i n a + a r i m p a a n + a r i m p i a + a r i m p i i n + a r i n a k ä ä p ä + a r i s t o k r a t i a s t a + a r i t m e e t t i s e s t i + a r j a l a i s e s t a + a r j e n + a r j e s s a + a r j e s s a a n + a r j e s s a m m e + a r k a a + a r k a a n + a r k a i l l a + a r k a i l l e e t + a r k a j a l k a + a r k a j a l k a p o l i t i i k k a m m e + a r k a l u o n t e i n e n + a r k a l u o n t e i s e e n + a r k a l u o n t e i s e l l a + a r k a l u o n t e i s e m m i n + a r k a l u o n t e i s e m m i s s a + a r k a l u o n t e i s e m m i s t a + a r k a l u o n t e i s e m p a a + a r k a l u o n t e i s e m p i + a r k a l u o n t e i s e m p i a + a r k a l u o n t e i s e m p i a k a a n + a r k a l u o n t e i s e n + a r k a l u o n t e i s e n a + a r k a l u o n t e i s e s s a + a r k a l u o n t e i s e s t a + a r k a l u o n t e i s e t + a r k a l u o n t e i s i a + a r k a l u o n t e i s i i n + a r k a l u o n t e i s i k s i + a r k a l u o n t e i s i l l a + a r k a l u o n t e i s i m m a n + a r k a l u o n t e i s i m m a s t a + a r k a l u o n t e i s i m m a t + a r k a l u o n t e i s i m m i k s i + a r k a l u o n t e i s i m m i s t a + a r k a l u o n t e i s i m m i s t a k i n + a r k a l u o n t e i s i m p i a + a r k a l u o n t e i s i m p i e n + a r k a l u o n t e i s i m p i i n + a r k a l u o n t e i s i n + a r k a l u o n t e i s i n a + a r k a l u o n t e i s i s t a + a r k a l u o n t e i s t a + a r k a l u o n t e i s t e n + a r k a l u o n t e i s u u d e n + a r k a l u o n t e i s u u d e s t a + a r k a l u o n t e i s u u s + a r k a l u o n t e i s u u t e e n + a r k a l u o n t e i s u u t t a + a r k a l u o n t o i n e n + a r k a l u o n t o i s e e n + a r k a l u o n t o i s e l l a + a r k a l u o n t o i s e m p i + a r k a l u o n t o i s e n + a r k a l u o n t o i s e s s a + a r k a l u o n t o i s e s t a + a r k a l u o n t o i s e t + a r k a l u o n t o i s i a + a r k a l u o n t o i s i m m i s t a + a r k a l u o n t o i s i m p i a + a r k a l u o n t o i s i m p i e n + a r k a l u o n t o i s i m p i i n + a r k a l u o n t o i s i n + a r k a l u o n t o i s i n t a + a r k a l u o n t o i s i s t a + a r k a l u o n t o i s t a + a r k a l u o n t o i s t e n + a r k a n a + a r k e a + a r k e e n + a r k e o l o g e j a + a r k e o l o g i s e e n + a r k e o l o g i s e n + a r k e o l o g i s i a + a r k e o l o g i s t a + a r k e o l o g i s t e n + a r k e o l o g i s u k u p o l v i e n + a r k i a s k a r e i s s a a n + a r k i e l ä m ä + a r k i e l ä m ä n + a r k i e l ä m ä n s ä + a r k i e l ä m ä s s ä + a r k i e l ä m ä s s ä m m e + a r k i e l ä m ä s s ä ä n + a r k i e l ä m ä s t ä + a r k i e l ä m ä s t ä m m e + a r k i e l ä m ä ä + a r k i e l ä m ä ä m m e + a r k i e l ä m ä ä n + a r k i e l ä m ä ä n s ä + a r k i h u o l i a a n + a r k i j ä r k i + a r k i k i e l e n + a r k i o p p i m i n e n + a r k i o p p i m i s e e n + a r k i o p p i m i s e n + a r k i o p p i m i s t a + a r k i p s y k o l o g i a + a r k i p u k u + a r k i p ä i v ä + a r k i p ä i v ä i n e n + a r k i p ä i v ä i s e m m i s s ä + a r k i p ä i v ä i s e m p ä ä + a r k i p ä i v ä i s e t + a r k i p ä i v ä i s i i n + a r k i p ä i v ä i s i ä + a r k i p ä i v ä i s t e n + a r k i p ä i v ä i s t y m i n e n + a r k i p ä i v ä i s t y m i s e n + a r k i p ä i v ä i s t y n y t + a r k i p ä i v ä k s i + a r k i p ä i v ä n + a r k i p ä i v ä s s ä + a r k i p ä i v ä s s ä m m e + a r k i p ä i v ä s s ä ä n + a r k i p ä i v ä s t ä + a r k i p ä i v ä s t ä ä n + a r k i p ä i v ä ä + a r k i p ä i v ä ä m m e + a r k i p ä i v ä ä n + a r k i p ä i v ä ä n s ä + a r k i r u t i i n e i h i n + a r k i s i a + a r k i s t o a s e t u s + a r k i s t o i h i n + a r k i s t o i l l a + a r k i s t o i m m e + a r k i s t o i n t i j ä r j e s t e l m ä n s ä + a r k i s t o i n t i m ä ä r ä y k s i s t ä + a r k i s t o i n t i r u t i i n i t + a r k i s t o i n u t + a r k i s t o j e n + a r k i s t o k a a p p i + a r k i s t o k a a p p i i n + a r k i s t o k e s k u k s i a + a r k i s t o k u v i a + a r k i s t o m a t e r i a a l i a + a r k i s t o n s a + a r k i s t o t u o t a n t o a a n + a r k i s t o t u o t a n t o j a + a r k i s t o t u o t a n t o o n + a r k i t i e t o i s u u t e e m m e + a r k i t o d e l l i s u u d e n + a r k i t o d e l l i s u u d e s s a + a r k i t o d e l l i s u u d e s t a + a r k i t o d e l l i s u u s + a r k i t o d e l l i s u u t t a + a r k i y m p ä r i s t ö ö n + a r k k i p i i s p a + a r k k i t e h t i d i r e k t i i v i + a r k k i t e h t i d i r e k t i i v i s t ä + a r k k i t e h t i k i l p a i l u + a r k k i t e h t i k i l p a i l u n + a r k k i t e h t i k o l l e g i o i d e n + a r k k i t e h t i k o u l u s s a + a r k k i t e h t u u r i i n + a r k k i t e h t u u r i n + a r k k i t e h t u u r i o p i n t o j a + a r k k i t e h t u u r i p e r i n n ö n + a r k k i t e h t u u r i p e r i n t ö + a r k k i t e h t u u r i p e r i n t ö ä + a r k k i t e h t u u r i s s a + a r k k i t e h t u u r i t a l o u s a r v i o + a r k k i t y y p p i + a r k k i v a n h o i l l i s i s t a + a r k k i v i h o l l i n e n + a r k k i v i h o l l i s e n s a + a r k k i v i h o l l i s e t + a r k k i v i h o l l i s t e n + a r k k u t e k s t i t + a r k o j a + a r k o j e n + a r k t i s e n + a r k t i s e s s a + a r k t i s i l l a + a r k t i s i l l e + a r k t i s i s t a + a r k t i s t e n + a r m a h d e t a a n + a r m a h d e t t i i n + a r m a h d u k s e n + a r m a h d u k s i a + a r m a h d u s l a i l l a + a r m a h d u s l a i n + a r m a h d u s l a i n s ä ä d ä n t ö ä + a r m a h d u s l a i s t a + a r m a h d u s l a k i + a r m a h d u s l a k i a + a r m a h d u s l a k i i n + a r m a h d u s o i k e u s + a r m a h d u s o i k e u t t a a n + a r m a h t a a + a r m a h t a m i n e n + a r m e i j a a + a r m e i j a a n + a r m e i j a a n s a + a r m e i j a k e n r a a l i + a r m e i j a k u n t a + a r m e i j a l l a + a r m e i j a l l e + a r m e i j a m u s e o + a r m e i j a n + a r m e i j a n e u v o s t o + a r m e i j a n e u v o s t o a + a r m e i j a n e u v o s t o n s a + a r m e i j a o s a s t o j e n + a r m e i j a r y h m ä + a r m e i j a s t a + a r m e i j a t + a r m e i j a t u o m i o i s t u i m e n + a r m e i j o i d e m m e + a r m e i j o i d e n + a r m e i j o i l l e m m e + a r m e i j o i s s a + a r m e i j o i s t a + a r m e i j o i s t a m m e + a r m e i j o i t a + a r m e l i a a m m a n + a r m e l i a a m m i n + a r m e l i a a m p i + a r m e l i a a m p i a + a r m e n i a l a i s i a + a r m e n i a l a i s k r i s t i t t y j e n + a r m e n i a l a i s k y s y m y k s e e n + a r m e n i a l a i s k y s y m y k s e n + a r m e n i a l a i s k y s y m y k s e s t ä + a r m e n i a l a i s p o l i i t i k k o a + a r m e n i a l a i s t a t i t + a r m e n i a l a i s t e n + a r m e n i a l a i s v ä e s t ö n + a r m e n i a l a i s y h t e i s ö j e n + a r m e n i a l a i s y h t e i s ö ö n + a r m e n i a n + a r m e n i a n k a r h u n v a t u k k a + a r m e n i a n l o k k i + a r m e n i a n s a h r a m i + a r m e n i a s s a + a r m o l a h j a + a r m o l l i s e m p i + a r m o l l i s u u d e n + a r m o n + a r m o n a i k a + a r m o n i s t u i n + a r m o p a l a + a r m o p e r i a a t t e e k s i + a r m o t o n t a + a r m o t t a + a r m o t t o m a m m a k s i + a r m o t t o m a s t a + a r n i k k i k o i s a + a r o h a r m a a l o k k i + a r o h i i r i h a u k k a + a r o h i l l e r i + a r o h y y p p ä + a r o i m m i s t a + a r o j u o k s i j a + a r o k a k a d u + a r o k e r t t u + a r o k i r v i n e n + a r o k i s s a + a r o k i u r u + a r o k o r p p i + a r o k o t k a + a r o k y y h k y + a r o m a a t t i s i a + a r o m a a t t i s t e n + a r o m a m m u t t i + a r o m e j a + a r o m e r i k o t k a + a r o m i a i n e i d e n + a r o m i a i n e i s t a + a r o m i a i n e i t a + a r o m i a l a l l a + a r o m i n v a h v e n t e i t a + a r o m i u u t t e i d e n + a r o m u r m e l i + a r o p ä ä s k y k a h l a a j a + a r o r i n t a m a + a r o s e e p r a + a r o s i n a p p i p e r h o n e n + a r o s i r p p i m a t k i j a + a r o s u o h a u k k a + a r o t a s k u + a r o t u n d r a + a r o t u r t u r i k y y h k y + a r o t ö p ö k e r t t u n e n + a r o v a r a a n i + a r o v a r p u n e n + a r o v i s e n t t i + a r o v u o k k o + a r p a j a i s m a r k k i n o i d e n + a r p a j a i s p e t o k s i s t a + a r p a j a i s v o i t t a j a + a r p a j a i s y h t i ö i d e n + a r p a k a p u l a + a r p a p e l i ä + a r p i a + a r p i k u d o s + a r p o a + a r s e e n i h a p o k e + a r s e e n i h a p p o + a r s e e n i p e n t o k s i d i + a r s e e n i p i t o i s u u s + a r s e e n i t r i f l u o r i d i + a r s e e n i t r i k l o r i d i + a r s e e n i y h d i s t e i d e n + a r s e n a a l i i n + a r s e n a a l i s s a + a r s e n i k i n + a r t i k k e l e i s t a a n + a r t i k k e l e i t a + a r t i k k e l i n + a r t i k k e l i s a r j a a n + a r t i k k e l i s a r j a n + a r t i k k e l i s t a + a r t i k l a a + a r t i k l a a n + a r t i k l a l l a + a r t i k l a l u o n n o k s e n + a r t i k l a l u o n n o s + a r t i k l a n + a r t i k l a s s a + a r t i k l a s t a + a r t i k l a t + a r t i k l o i d e n + a r t i k l o i s s a + a r t i k l o i s t a + a r t i k l o i t a + a r t i k l o j a + a r t i k l o j e n + a r t i s o k k a k e i t t o o n + a r t i s t e i s t a + a r v a a k a a n + a r v a a m a t o n t a + a r v a a m a t t a + a r v a a m a t t o m a m m a t + a r v a a m a t t o m a n + a r v a a m a t t o m a s t a + a r v a a m a t t o m a t + a r v a a m a t t o m i a + a r v a a m a t t o m i l l e + a r v a i l l a + a r v a i l u j a + a r v a i l u j e n + a r v a i l u s t a + a r v a t t a v i a + a r v e l e e + a r v e l l a a n + a r v e l u t t a v a a + a r v e l u t t a v a m p i + a r v e l u t t a v a s t a + a r v i o i d a + a r v i o i d a a n + a r v i o i d a a n k i n + a r v i o i d a k s e e n + a r v i o i d a k s e m m e + a r v i o i d e n + a r v i o i d e s s a + a r v i o i d e s s a a n + a r v i o i d e s s a m m e + a r v i o i d e s s a n n e + a r v i o i d u i s t a + a r v i o i h i n + a r v i o i k a a m m e + a r v i o i k o o n + a r v i o i l l e + a r v i o i l t a + a r v i o i m a a n + a r v i o i m a m m e + a r v i o i m a s s a + a r v i o i m a t t a + a r v i o i m a t t o m i s t a + a r v i o i m i n e n + a r v i o i m i s e e n + a r v i o i m i s e k s i + a r v i o i m i s e s s a + a r v i o i m i s t a + a r v i o i m m e + a r v i o i m m e k i n + a r v i o i m m e k o + a r v i o i n + a r v i o i n e e t + a r v i o i n n i l l e + a r v i o i n n i n + a r v i o i n n i s s a + a r v i o i n n i s s a a n + a r v i o i n n i s t a + a r v i o i n n i t + a r v i o i n t e i h i n + a r v i o i n t e j a + a r v i o i n t i a + a r v i o i n t i a i k a + a r v i o i n t i a j a n j a k s o a + a r v i o i n t i a j a s t a + a r v i o i n t i a s i a k i r j a n + a r v i o i n t i a s i a k i r j a s t a + a r v i o i n t i a s i a k i r j o j a + a r v i o i n t i a s i a k i r j o j e n + a r v i o i n t i a s i a n t u n t i j o i d e n + a r v i o i n t i d i r e k t i i v i s t ä + a r v i o i n t i e l i m e n + a r v i o i n t i e l i n + a r v i o i n t i e n + a r v i o i n t i e r o j a + a r v i o i n t i e t u j e n + a r v i o i n t i h a n k e t t a + a r v i o i n t i h e t k e l l ä + a r v i o i n t i i n + a r v i o i n t i j a k s o + a r v i o i n t i j a k s o o n + a r v i o i n t i j ä r j e s t e l m i e n + a r v i o i n t i j ä r j e s t e l m i s t ä + a r v i o i n t i j ä r j e s t e l m i ä + a r v i o i n t i j ä r j e s t e l m ä + a r v i o i n t i j ä r j e s t e l m ä l l e + a r v i o i n t i j ä r j e s t e l m ä n + a r v i o i n t i j ä r j e s t e l m ä s s ä + a r v i o i n t i j ä r j e s t e l m ä s t ä + a r v i o i n t i j ä r j e s t e l m ä ä + a r v i o i n t i j ä r j e s t e l m ä ä n + a r v i o i n t i k a u d e l l a + a r v i o i n t i k a u d e n + a r v i o i n t i k e h y k s e n + a r v i o i n t i k e h y s t ä + a r v i o i n t i k e i n o i s t a + a r v i o i n t i k e r t o m u k s e e n + a r v i o i n t i k e r t o m u k s e l l e + a r v i o i n t i k e r t o m u k s e m m e + a r v i o i n t i k e r t o m u k s e n + a r v i o i n t i k e r t o m u k s e n s a + a r v i o i n t i k e r t o m u k s e s s a + a r v i o i n t i k e r t o m u k s e s s a a n + a r v i o i n t i k e r t o m u k s e s t a + a r v i o i n t i k e r t o m u k s e t + a r v i o i n t i k e r t o m u k s i a + a r v i o i n t i k e r t o m u k s i e n + a r v i o i n t i k e r t o m u k s i i n + a r v i o i n t i k e r t o m u k s i l l a + a r v i o i n t i k e r t o m u k s i s s a + a r v i o i n t i k e r t o m u k s i s t a + a r v i o i n t i k e r t o m u s + a r v i o i n t i k e r t o m u s t a + a r v i o i n t i k e r t o m u s t e n + a r v i o i n t i k e s k u k s e t + a r v i o i n t i k e s k u s + a r v i o i n t i k e s k u s t e l u u n + a r v i o i n t i k i e r r o k s e n + a r v i o i n t i k i e r r o s + a r v i o i n t i k o k o u k s i s s a + a r v i o i n t i k o k o u s + a r v i o i n t i k o k o u s t a + a r v i o i n t i k o m i t e a + a r v i o i n t i k o m i t e a a + a r v i o i n t i k o m i t e a n + a r v i o i n t i k o n e i s t o o n + a r v i o i n t i k o n f e r e n s s i + a r v i o i n t i k o n f e r e n s s i a + a r v i o i n t i k o n f e r e n s s i i n + a r v i o i n t i k r i t e e r e i d e n + a r v i o i n t i k r i t e e r e i h i n + a r v i o i n t i k r i t e e r e i s t ä + a r v i o i n t i k r i t e e r e i t ä + a r v i o i n t i k r i t e e r e j ä + a r v i o i n t i k r i t e e r i + a r v i o i n t i k r i t e e r i e n + a r v i o i n t i k r i t e e r i n ä + a r v i o i n t i k r i t e e r i s t ä + a r v i o i n t i k r i t e e r i t + a r v i o i n t i k u l t t u u r i + a r v i o i n t i k u l t t u u r i a + a r v i o i n t i k u l u t + a r v i o i n t i k u s t a n n u s t e n + a r v i o i n t i k y k y + a r v i o i n t i k y n n y k s e n + a r v i o i n t i k y s y m y k s i ä + a r v i o i n t i k y s y m y s + a r v i o i n t i k y v y s t ä + a r v i o i n t i k ä y n n i n + a r v i o i n t i k ä y n t i e n + a r v i o i n t i k ä y t ä n t ö + a r v i o i n t i l a i t o s t e n + a r v i o i n t i l a u s e k e + a r v i o i n t i l a u s e k e t t a + a r v i o i n t i l a u s e k k e e n + a r v i o i n t i l a u t a k u n n i s s a + a r v i o i n t i l a u t a k u n t a a n + a r v i o i n t i l u v u t + a r v i o i n t i m a l l i + a r v i o i n t i m a l l i a + a r v i o i n t i m a l l i e n + a r v i o i n t i m a t k a l t a + a r v i o i n t i m e k a n i s m e i h i n s a + a r v i o i n t i m e k a n i s m e j a + a r v i o i n t i m e k a n i s m i + a r v i o i n t i m e k a n i s m i a + a r v i o i n t i m e k a n i s m i e n + a r v i o i n t i m e k a n i s m i i n + a r v i o i n t i m e k a n i s m i k s i + a r v i o i n t i m e k a n i s m i l l a + a r v i o i n t i m e k a n i s m i n + a r v i o i n t i m e k a n i s m i s s a + a r v i o i n t i m e k a n i s m i s t a + a r v i o i n t i m e k a n i s m i t + a r v i o i n t i m e n e t e l m i e n + a r v i o i n t i m e n e t e l m i s t ä + a r v i o i n t i m e n e t e l m i ä + a r v i o i n t i m e n e t e l m i ä m m e + a r v i o i n t i m e n e t e l m ä + a r v i o i n t i m e n e t e l m ä n + a r v i o i n t i m e n e t e l m ä t + a r v i o i n t i m e n e t e l m ä ä + a r v i o i n t i m e n e t t e l y + a r v i o i n t i m e n e t t e l y i d e n + a r v i o i n t i m e n e t t e l y i s t ä + a r v i o i n t i m e n e t t e l y j e n + a r v i o i n t i m e n e t t e l y j ä + a r v i o i n t i m e n e t t e l y n + a r v i o i n t i m e n e t t e l y s s ä + a r v i o i n t i m e n e t t e l y s t ä + a r v i o i n t i m e n e t t e l y t + a r v i o i n t i m e n e t t e l y y n + a r v i o i n t i m e n e t t e l y ä + a r v i o i n t i m e t o d e j a + a r v i o i n t i m e t o d o l o g i a n + a r v i o i n t i m i e t i n n ö s s ä + a r v i o i n t i m i e t i n t ö ä + a r v i o i n t i m i t t a r e i t a + a r v i o i n t i m i t t a u k s i s t a + a r v i o i n t i m m e + a r v i o i n t i m u o t o a + a r v i o i n t i m ä ä r ä y k s i ä + a r v i o i n t i n o r m e j a + a r v i o i n t i n ä k ö k o h t i a + a r v i o i n t i o h j e e t + a r v i o i n t i o h j e l m a + a r v i o i n t i o h j e l m a a + a r v i o i n t i o h j e l m a a n + a r v i o i n t i o h j e l m a n + a r v i o i n t i o h j e l m i a + a r v i o i n t i o p e r a a t i o n + a r v i o i n t i o r g a n i s a a t i o i d e n + a r v i o i n t i p a l k k i o t + a r v i o i n t i p e r i a a t t e i s t a + a r v i o i n t i p e r i a a t t e i t a + a r v i o i n t i p e r u s t a + a r v i o i n t i p e r u s t a i s e s t i + a r v i o i n t i p e r u s t e + a r v i o i n t i p e r u s t e e n + a r v i o i n t i p e r u s t e e n a + a r v i o i n t i p e r u s t e e n n e + a r v i o i n t i p e r u s t e e n s a + a r v i o i n t i p e r u s t e e t + a r v i o i n t i p e r u s t e i d e n + a r v i o i n t i p e r u s t e i n a + a r v i o i n t i p e r u s t e i s i i n + a r v i o i n t i p e r u s t e i s t a + a r v i o i n t i p e r u s t e i t a + a r v i o i n t i p e r u s t e t t a + a r v i o i n t i p r o s e s s e i h i n + a r v i o i n t i p r o s e s s e i s s a + a r v i o i n t i p r o s e s s e j a + a r v i o i n t i p r o s e s s i + a r v i o i n t i p r o s e s s i a + a r v i o i n t i p r o s e s s i e n + a r v i o i n t i p r o s e s s i i n + a r v i o i n t i p r o s e s s i m m e + a r v i o i n t i p r o s e s s i n + a r v i o i n t i p r o s e s s i s s a + a r v i o i n t i p r o s e s s i s t a + a r v i o i n t i p r o s e s s i t + a r v i o i n t i p ä i v ä m ä ä r ä n + a r v i o i n t i r a p o r t i n + a r v i o i n t i r a p o r t i s s a + a r v i o i n t i r a p o r t i s s a m m e + a r v i o i n t i r a p o r t i s t a + a r v i o i n t i r a p o r t i t + a r v i o i n t i r a p o r t t e j a + a r v i o i n t i r a p o r t t i + a r v i o i n t i r a p o r t t i a + a r v i o i n t i r a p o r t t i e n + a r v i o i n t i r e t k i k u n t a + a r v i o i n t i r o o l i + a r v i o i n t i r y h m i ä + a r v i o i n t i r y h m ä + a r v i o i n t i r y h m ä l l ä + a r v i o i n t i r y h m ä n + a r v i o i n t i r y h m ä t + a r v i o i n t i r y h m ä ä + a r v i o i n t i s e l o n t e o n + a r v i o i n t i s e l v i t y s t ä + a r v i o i n t i s t r a t e g i o i s s a + a r v i o i n t i s t r a t e g i o i t a + a r v i o i n t i s u u n n i t e l m a n + a r v i o i n t i t a p a a n + a r v i o i n t i t a p o j a + a r v i o i n t i t a u l u k o n + a r v i o i n t i t e h t ä v ä + a r v i o i n t i t e h t ä v ä n + a r v i o i n t i t e h t ä v ä t + a r v i o i n t i t e h t ä v ä ä + a r v i o i n t i t o d i s t u s t e n + a r v i o i n t i t o i m e n p i t e i d e n + a r v i o i n t i t o i m i a + a r v i o i n t i t o i m i e n + a r v i o i n t i t o i m i n t a a + a r v i o i n t i t o i m i s t o + a r v i o i n t i t u l o k s e t + a r v i o i n t i t u l o k s i s t a + a r v i o i n t i t u t k i m u k s e n + a r v i o i n t i t u t k i m u k s e s t a + a r v i o i n t i t u t k i m u k s i a + a r v i o i n t i t u t k i m u k s i s t a + a r v i o i n t i t u t k i m u s t a + a r v i o i n t i t u t k i m u s t e n + a r v i o i n t i t y ö m m e + a r v i o i n t i t y ö r y h m ä + a r v i o i n t i t y ö r y h m ä n + a r v i o i n t i t y ö t + a r v i o i n t i t y ö t ä + a r v i o i n t i v a i h e e s s a + a r v i o i n t i v a i h e t t a + a r v i o i n t i v a l t a + a r v i o i n t i v a l t u u s k u n t a + a r v i o i n t i v a l t u u s k u n t a m m e + a r v i o i n t i v e l v o i t t e i t a + a r v i o i n t i v i e r a i l u + a r v i o i n t i v i e r a i l u j a + a r v i o i n t i v i r h e + a r v i o i n t i v i r h e e n + a r v i o i n t i v i r h e i s t ä + a r v i o i n t i v i r h e i t ä + a r v i o i n t i v ä l i n e + a r v i o i n t i v ä l i n e e n ä + a r v i o i n t i v ä l i n e e t + a r v i o i n t i v ä l i n e i d e n + a r v i o i n t i v ä l i n e i t ä + a r v i o i n t i v ä l i n e i t ä m m e + a r v i o i n t i y k s i k k ö + a r v i o i n t i y k s i k ö n + a r v i o i n t i y k s i k ö n s e l o n t e k o a + a r v i o i n t i y k s i k ö s t ä + a r v i o i s s a + a r v i o i s s a m m e + a r v i o i s t a + a r v i o i t a a n + a r v i o i t a e s s a + a r v i o i t a i s i i n + a r v i o i t a v a + a r v i o i t a v a k s i + a r v i o i t a v a n a + a r v i o i t a v i k s i + a r v i o i t i i n + a r v i o i t u + a r v i o i t u a + a r v i o i t u u n + a r v i o i v a t + a r v i o m i e t i n n ö s s ä + a r v i o m i e t i n t ö + a r v i o n + a r v i o n i + a r v i o n n e + a r v i o p e r i a a t e + a r v i o s s a + a r v i o s t a + a r v i o s t a n n e + a r v i o t + a r v i o t a + a r v i o t a a n + a r v o a + a r v o a n a l y y s i + a r v o a s e t e l m i s t a + a r v o a s i o i d e n + a r v o a s t e i k k o + a r v o a s t e i k k o a + a r v o a s t e i k k o j a + a r v o a s t e i k k o j e n + a r v o a s t e i k o k s i + a r v o a s t e i k o l l a + a r v o a s t e i k o n + a r v o a s t e i k o s s a + a r v o e s i n e i t ä + a r v o h a n k k e i s i i n + a r v o h i e r a r k i a + a r v o i h i m m e + a r v o i h i n + a r v o i l l a + a r v o i l l e + a r v o i n + a r v o i n a + a r v o i n s t i t u u t i l l a + a r v o i n s t i t u u t i l l e + a r v o i n s t i t u u t i n + a r v o i n s t i t u u t t i + a r v o i n s t i t u u t t i a + a r v o i s a a + a r v o i s a l l e + a r v o i s a n + a r v o i s a t + a r v o i s e e n + a r v o i s e k s i + a r v o i s e l t a + a r v o i s e m m a n + a r v o i s e m m a s s a + a r v o i s e m m i n + a r v o i s e m p a a + a r v o i s e m p i + a r v o i s e m p i a + a r v o i s e m p i i n + a r v o i s e n + a r v o i s e s s a + a r v o i s e s t i + a r v o i s e t + a r v o i s i a + a r v o i s i e n + a r v o i s i i n + a r v o i s i l l a + a r v o i s i l l e + a r v o i s i l t a + a r v o i s i n a + a r v o i s i s t a + a r v o i s t a + a r v o i s t a m m e + a r v o i s t e n + a r v o i s u u d e s s a + a r v o i s u u d e s t a + a r v o i s u u k s i e n + a r v o i s u u k s i i n + a r v o i s u u s n ä k ö k u l m a a + a r v o i t u s t e n + a r v o j a + a r v o j a a n + a r v o j a m m e + a r v o j e m m e + a r v o j e n + a r v o j ä r j e s t e l m i e n + a r v o j ä r j e s t e l m i i n + a r v o j ä r j e s t e l m i s t ä + a r v o j ä r j e s t e l m i ä + a r v o j ä r j e s t e l m ä + a r v o j ä r j e s t e l m ä l l e + a r v o j ä r j e s t e l m ä l l e m m e + a r v o j ä r j e s t e l m ä m m e + a r v o j ä r j e s t e l m ä n + a r v o j ä r j e s t e l m ä n s ä + a r v o j ä r j e s t e l m ä n ä + a r v o j ä r j e s t e l m ä s s ä + a r v o j ä r j e s t e l m ä s s ä m m e + a r v o j ä r j e s t e l m ä s t ä + a r v o j ä r j e s t e l m ä t + a r v o j ä r j e s t e l m ä ä + a r v o j ä r j e s t e l m ä ä m m e + a r v o j ä r j e s t e l m ä ä n + a r v o j ä r j e s t e l m ä ä n s ä + a r v o j ä r j e s t y k s e n + a r v o j ä r j e s t y k s e s s ä + a r v o j ä r j e s t y k s i s t ä + a r v o j ä r j e s t y s + a r v o j ä r j e s t y s t ä + a r v o j ä r j e s t ö j e n + a r v o k a l a a + a r v o k a s t a + a r v o k e h y s + a r v o k e s k u s t e l u + a r v o k e s k u s t e l u u n + a r v o k e t j u + a r v o k e t j u a + a r v o k e t j u j e n + a r v o k e t j u n + a r v o k e t j u s s a + a r v o k e t j u u n + a r v o k k a a k s i + a r v o k k a a l l a + a r v o k k a a m m a n + a r v o k k a a m m a s t a + a r v o k k a a m m i n + a r v o k k a a m p a a + a r v o k k a a m p i + a r v o k k a a m p i a + a r v o k k a a m p i n a + a r v o k k a a n + a r v o k k a a n a + a r v o k k a a s s a + a r v o k k a a s t a + a r v o k k a a t + a r v o k k a i d e n + a r v o k k a i d e n k i n + a r v o k k a i m m a n + a r v o k k a i m m a s t a + a r v o k k a i m m a t + a r v o k k a i m m i l l e + a r v o k k a i m m i s t a + a r v o k k a i m p i a + a r v o k k a i m p i i n + a r v o k k a i n + a r v o k k a i n t a + a r v o k k a i s t a + a r v o k k a i t a + a r v o k k u u d e l l a + a r v o k k u u d e n + a r v o k k u u t t a + a r v o k o k o n a i s u u t e n a + a r v o k o n s e r v a t i s m i + a r v o k r i i s i + a r v o k r i i s i i n + a r v o k r i i s i s s ä + a r v o k r i i s i s t ä + a r v o k r i i s i ä + a r v o k s i + a r v o k u l j e t u s y r i t y s t e n + a r v o k y s y m y k s e s t ä + a r v o k y s y m y k s e t + a r v o k y s y m y k s i s t ä + a r v o k y s y m y k s i ä + a r v o k y s y m y s t e n + a r v o k y s y m y s t ä m m e + a r v o k ä s i t y k s e n + a r v o k ä y r ä n + a r v o l a i n s ä ä d ä n n ö n + a r v o l i b e r a l i s m i + a r v o l i s ä v e r o a + a r v o l i s ä v e r o j ä r j e s t e l m ä n + a r v o l i s ä v e r o j ä r j e s t e l m ä ä n + a r v o l i s ä v e r o m a k s u j a + a r v o l t a a n + a r v o l ä h e t y k s e t + a r v o m a a i l m a m m e + a r v o m a a i l m a n s a + a r v o m a l l i + a r v o m a l l i n a + a r v o m e r k k i ä ä n + a r v o m i n i s t e r i + a r v o m m e + a r v o m ä ä r ä y k s i ä + a r v o n + a r v o n a l e n n u k s e l l e + a r v o n a l e n n u s k a u s i a + a r v o n a l e n n u s p o l i t i i k a n + a r v o n a l e n n u s p o l i t i i k k a a + a r v o n a n n o n + a r v o n a n t o n i + a r v o n i m i + a r v o n l a s k u n + a r v o n l i s ä + a r v o n l i s ä d i r e k t i i v i n + a r v o n l i s ä d i r e k t i i v i s s ä + a r v o n l i s ä j ä r j e s t e l m ä n + a r v o n l i s ä k a n n a n + a r v o n l i s ä k o m i t e a l l e + a r v o n l i s ä m e n e t e l m ä + a r v o n l i s ä m e n e t t e l y + a r v o n l i s ä m e n o a + a r v o n l i s ä n + a r v o n l i s ä o s u u s + a r v o n l i s ä p e t o k s i i n + a r v o n l i s ä p e t o s + a r v o n l i s ä p e t o s t e n + a r v o n l i s ä p o r t a i t a + a r v o n l i s ä p r o s e n t t e j a + a r v o n l i s ä p r o s e n t t i e n + a r v o n l i s ä s t ä + a r v o n l i s ä t u l o t + a r v o n l i s ä v a p a u t u s + a r v o n l i s ä v e r o + a r v o n l i s ä v e r o a + a r v o n l i s ä v e r o a l e n n u k s e t + a r v o n l i s ä v e r o a l e n n u k s i l l a + a r v o n l i s ä v e r o a l e n n u s t e n + a r v o n l i s ä v e r o a s i a + a r v o n l i s ä v e r o a s i a n t u n t i j a m m e + a r v o n l i s ä v e r o a s i a s s a + a r v o n l i s ä v e r o a s i o i t a + a r v o n l i s ä v e r o a s t e e n + a r v o n l i s ä v e r o a s t e i d e n + a r v o n l i s ä v e r o d i r e k t i i v i + a r v o n l i s ä v e r o d i r e k t i i v i i n + a r v o n l i s ä v e r o d i r e k t i i v i l l ä + a r v o n l i s ä v e r o d i r e k t i i v i n + a r v o n l i s ä v e r o d i r e k t i i v i s s ä + a r v o n l i s ä v e r o d i r e k t i i v i ä + a r v o n l i s ä v e r o i l m o i t u k s e s s a a n + a r v o n l i s ä v e r o i l m o i t u s t e n + a r v o n l i s ä v e r o j a + a r v o n l i s ä v e r o j e n + a r v o n l i s ä v e r o j ä r j e s t e l m i e n + a r v o n l i s ä v e r o j ä r j e s t e l m i ä + a r v o n l i s ä v e r o j ä r j e s t e l m ä + a r v o n l i s ä v e r o j ä r j e s t e l m ä l l e + a r v o n l i s ä v e r o j ä r j e s t e l m ä n + a r v o n l i s ä v e r o j ä r j e s t e l m ä n s ä + a r v o n l i s ä v e r o j ä r j e s t e l m ä s s ä + a r v o n l i s ä v e r o j ä r j e s t e l m ä s t ä + a r v o n l i s ä v e r o j ä r j e s t e l m ä ä + a r v o n l i s ä v e r o j ä r j e s t e l m ä ä n + a r v o n l i s ä v e r o j ä r j e s t e l y + a r v o n l i s ä v e r o j ä r j e s t e l y t + a r v o n l i s ä v e r o k a n n a n + a r v o n l i s ä v e r o k a n n a t + a r v o n l i s ä v e r o k a n n o i l l a + a r v o n l i s ä v e r o k a n t a + a r v o n l i s ä v e r o k a n t a a + a r v o n l i s ä v e r o k a n t a a n + a r v o n l i s ä v e r o k a n t o i h i n + a r v o n l i s ä v e r o k a n t o j a + a r v o n l i s ä v e r o k a n t o j e n + a r v o n l i s ä v e r o k a r u s e l l i e n + a r v o n l i s ä v e r o k e h y k s e n + a r v o n l i s ä v e r o k o h t e l u l l a + a r v o n l i s ä v e r o k o m i t e a + a r v o n l i s ä v e r o k o m i t e a l l a + a r v o n l i s ä v e r o k o m i t e a n + a r v o n l i s ä v e r o k y s y m y k s e s t ä + a r v o n l i s ä v e r o l a i n s ä ä d ä n n ö n + a r v o n l i s ä v e r o l a i n s ä ä d ä n n ö s s ä + a r v o n l i s ä v e r o l a i n s ä ä d ä n t ö ä + a r v o n l i s ä v e r o l e i k k a u k s i a + a r v o n l i s ä v e r o l l a + a r v o n l i s ä v e r o l u o k a n + a r v o n l i s ä v e r o l u o k i t u s + a r v o n l i s ä v e r o m a k s u j a + a r v o n l i s ä v e r o m a k s u j e n + a r v o n l i s ä v e r o m a k s u t + a r v o n l i s ä v e r o m e n e t t e l y j ä + a r v o n l i s ä v e r o m e n e t t e l y t + a r v o n l i s ä v e r o m e n o a + a r v o n l i s ä v e r o m m e + a r v o n l i s ä v e r o n + a r v o n l i s ä v e r o n k i e r t o a + a r v o n l i s ä v e r o o n + a r v o n l i s ä v e r o p a l a u t u k s e n s a + a r v o n l i s ä v e r o p e t o k s e t + a r v o n l i s ä v e r o p e t o k s i a + a r v o n l i s ä v e r o p e t o k s i e n + a r v o n l i s ä v e r o p e t o k s i i n + a r v o n l i s ä v e r o p e t o k s i l l a + a r v o n l i s ä v e r o p e t o k s i l l e + a r v o n l i s ä v e r o p e t o k s i s t a + a r v o n l i s ä v e r o p e t o s + a r v o n l i s ä v e r o p e t o s t e n + a r v o n l i s ä v e r o p o h j a n + a r v o n l i s ä v e r o p o l i t i i k a n + a r v o n l i s ä v e r o p r o s e n t i t + a r v o n l i s ä v e r o p r o s e n t t i e n + a r v o n l i s ä v e r o r e k i s t e r i i n + a r v o n l i s ä v e r o s a a t a v a t + a r v o n l i s ä v e r o s t a + a r v o n l i s ä v e r o s t r a t e g i a + a r v o n l i s ä v e r o s t r a t e g i a a + a r v o n l i s ä v e r o s t r a t e g i a l l a + a r v o n l i s ä v e r o s t r a t e g i a n + a r v o n l i s ä v e r o s t r a t e g i a s s a + a r v o n l i s ä v e r o s t r a t e g i a s t a + a r v o n l i s ä v e r o s ä ä n n ö i s t ä + a r v o n l i s ä v e r o s ä ä n n ö k s i e n + a r v o n l i s ä v e r o s ä ä n n ö s t ö ä + a r v o n l i s ä v e r o s ä ä n t ö j e n s ä + a r v o n l i s ä v e r o s ä ä n t ö j ä + a r v o n l i s ä v e r o t + a r v o n l i s ä v e r o t a p p i o t + a r v o n l i s ä v e r o t a s o j e n + a r v o n l i s ä v e r o t a s o t + a r v o n l i s ä v e r o t i l a n n e + a r v o n l i s ä v e r o t t o m u u s + a r v o n l i s ä v e r o t u k s e n + a r v o n l i s ä v e r o t u k s e s t a + a r v o n l i s ä v e r o t u l o + a r v o n l i s ä v e r o t u l o a + a r v o n l i s ä v e r o t u l o i s t a + a r v o n l i s ä v e r o t u l o j a + a r v o n l i s ä v e r o t u l o j e n + a r v o n l i s ä v e r o t u l o l l a + a r v o n l i s ä v e r o t u l o n + a r v o n l i s ä v e r o t u l o t + a r v o n l i s ä v e r o t u n n i s t e + a r v o n l i s ä v e r o t u s p e t o s t e n + a r v o n l i s ä v e r o t u s s ä ä n n ö i s t ä + a r v o n l i s ä v e r o t u s t a + a r v o n l i s ä v e r o u u d i s t u s + a r v o n l i s ä v e r o v a p a u d e n + a r v o n l i s ä v e r o v a p a u t u k s e n + a r v o n l i s ä v e r o v a p a u t u s t a + a r v o n l i s ä v e r o v e l k a a n + a r v o n l i s ä v e r o v e l v o i t t e e n s a + a r v o n l i s ä v e r o v e l v o i t t e i d e n + a r v o n l i s ä v e r o v e l v o l l i s i a + a r v o n l i s ä v e r o v e l v o l l i s t e n + a r v o n l i s ä v e r o v e l v o l l i s u u s + a r v o n l i s ä v e r o v e l v o l l i s u u t t a + a r v o n l i s ä v e r o v i r a n o m a i s i i n + a r v o n l i s ä v e r o v i r a n o m a i s t e n + a r v o n l i s ä v e r o v ä h e n n y k s i i n + a r v o n l i s ä y k s e n + a r v o n l i s ä y s + a r v o n l i s ä y s k e t j u u n + a r v o n l i s ä y s t ä + a r v o n l i s ä ä + a r v o n l i s ä ä n + a r v o n m i t t a r e i t a + a r v o n m u o d o s t u s k e t j u a + a r v o n n a n + a r v o n n o u s u n + a r v o n n o u s u s t a + a r v o n o r m i + a r v o n s a + a r v o n t a j ä r j e s t e l m ä ä n + a r v o n ä k ö k o h d a t + a r v o n ä k ö k o h d i s t a + a r v o n ä k ö k o h t a a n + a r v o n ä k ö k o h t i a + a r v o n ä k ö k o h t i e n + a r v o n ä k ö k u l m a + a r v o n ä k ö k u l m a a + a r v o o n + a r v o o n s a + a r v o p a p e r e i d e n + a r v o p a p e r e i h i n + a r v o p a p e r e i n a + a r v o p a p e r e i t a + a r v o p a p e r i a l a a n + a r v o p a p e r i a l a l l a + a r v o p a p e r i a l a n + a r v o p a p e r i e n + a r v o p a p e r i e s i t e t t ä + a r v o p a p e r i h a l l i n t a + a r v o p a p e r i j ä r j e s t e l m i ä + a r v o p a p e r i k a u p a n + a r v o p a p e r i k a u p p a + a r v o p a p e r i k a u p p a a + a r v o p a p e r i k a u p p a a n + a r v o p a p e r i k a u p p a p a i k k o j e n + a r v o p a p e r i k e s k u s t e n + a r v o p a p e r i k o m i s s i o + a r v o p a p e r i k o m i s s i o n + a r v o p a p e r i k o m i t e a + a r v o p a p e r i k o m i t e a n + a r v o p a p e r i k o m i t e a s s a + a r v o p a p e r i k o m i t e a s t a + a r v o p a p e r i l a i n a u s + a r v o p a p e r i l a i n s ä ä d ä n n ö n + a r v o p a p e r i l a i n s ä ä d ä n t ö p a k e t t i i n + a r v o p a p e r i m a r k k i n a + a r v o p a p e r i m a r k k i n a a + a r v o p a p e r i m a r k k i n a t + a r v o p a p e r i m a r k k i n a v a l v o j i e n + a r v o p a p e r i m a r k k i n a v i r a n o m a i n e n + a r v o p a p e r i m a r k k i n a v i r a n o m a i s e l l e + a r v o p a p e r i m a r k k i n a v i r a n o m a i s e n + a r v o p a p e r i m a r k k i n a v i r a n o m a i s t a + a r v o p a p e r i m a r k k i n o i d e n + a r v o p a p e r i m a r k k i n o i h i n + a r v o p a p e r i m a r k k i n o i l l a + a r v o p a p e r i m a r k k i n o i l t a + a r v o p a p e r i m a r k k i n o i t a + a r v o p a p e r i n + a r v o p a p e r i p ö r s s e i h i n + a r v o p a p e r i p ö r s s e i n ä + a r v o p a p e r i p ö r s s i + a r v o p a p e r i p ö r s s i e n + a r v o p a p e r i p ö r s s i i n + a r v o p a p e r i p ö r s s i l l e + a r v o p a p e r i p ö r s s i s s ä + a r v o p a p e r i p ö r s s i t + a r v o p a p e r i p ö r s s i v o i t t o j a + a r v o p a p e r i s e l v i t y k s i i n + a r v o p a p e r i s i j o i t u s t e n + a r v o p a p e r i s t a m i s e n + a r v o p a p e r i s t a m i s e s t a + a r v o p a p e r i s t a m i s m a r k k i n a t + a r v o p a p e r i s t a m i s m a r k k i n o i d e n + a r v o p a p e r i s t a m i s m a r k k i n o i t a + a r v o p a p e r i s t a m i s p r o s e s s i s s a + a r v o p a p e r i s t a m i s p r o s e s s i t + a r v o p a p e r i s t a m i s s ä ä n t ö j ä + a r v o p a p e r i s ä ä n n ö s t ö + a r v o p a p e r i s ä ä n t e l y k o m i t e a n + a r v o p a p e r i s ä ä n t e l y s s ä + a r v o p a p e r i t r a n s a k t i o i d e n + a r v o p a p e r i t y y p e i s t ä + a r v o p e r i n t ö ä m m e + a r v o p e r u s t a + a r v o p e r u s t a a + a r v o p e r u s t a i n e n + a r v o p e r u s t a l t a + a r v o p e r u s t a n + a r v o p e r u s t a s t a m m e + a r v o p o h j a + a r v o p o h j a a + a r v o p o h j a i n e n + a r v o p o h j a i s e l l a + a r v o p o h j a i s e n a + a r v o p o h j a i s i a + a r v o p o h j a i s t a + a r v o p o h j a m m e + a r v o p o h j a n + a r v o p o l i t i i k a s t a + a r v o p o l i t i i k k a a + a r v o r i s t i r i i t a a + a r v o s a n a a + a r v o s a n a m e t s ä s t y s + a r v o s a n o j a + a r v o s e k a a n n u s t e n + a r v o s o p i m u k s e n + a r v o s s a + a r v o s t a a + a r v o s t a a k i n + a r v o s t a e n + a r v o s t a i s i + a r v o s t a i s i n + a r v o s t a k a a m m e + a r v o s t a m a a n + a r v o s t a m a t t a + a r v o s t a m i s e n + a r v o s t a m m e + a r v o s t a m m e k i n + a r v o s t a n + a r v o s t a n e e t + a r v o s t a n k i n + a r v o s t a n k o + a r v o s t a n u t + a r v o s t a v a m p i + a r v o s t a v a n + a r v o s t a v a n i + a r v o s t a v a n s a + a r v o s t a v a t + a r v o s t e l e e + a r v o s t e l e m a a n + a r v o s t e l e m a l l a + a r v o s t e l e m a t t a + a r v o s t e l e m i s e e n + a r v o s t e l e m m e + a r v o s t e l e v a m m a k s i + a r v o s t e l e v a t + a r v o s t e l i + a r v o s t e l i j a t + a r v o s t e l i j o i d e n + a r v o s t e l i j o i t a k i n + a r v o s t e l i m m e + a r v o s t e l i n + a r v o s t e l i t t e + a r v o s t e l i v a t + a r v o s t e l l a + a r v o s t e l l a a n + a r v o s t e l l a k s e e n + a r v o s t e l l a k s e m m e + a r v o s t e l l e e t + a r v o s t e l l e s s a a n + a r v o s t e l l e s s a n i + a r v o s t e l l e s s a n n e + a r v o s t e l l u t + a r v o s t e l t a e s s a + a r v o s t e l t i i n + a r v o s t e l t u + a r v o s t e l u a + a r v o s t e l u i h i n + a r v o s t e l u i s t a + a r v o s t e l u k o h t i i n + a r v o s t e l u k u o r o o n + a r v o s t e l u k y k y ä + a r v o s t e l u l l e + a r v o s t e l u l t a n n e + a r v o s t e l u n + a r v o s t e l u n i + a r v o s t e l u n s a + a r v o s t e l u p e r u s t e i t a + a r v o s t e l u r y ö p y n + a r v o s t e l u s t a + a r v o s t e l u t + a r v o s t e l u t t a + a r v o s t e l u u n + a r v o s t e l u u n i + a r v o s t e t a + a r v o s t e t a a n + a r v o s t e t t a v a + a r v o s t e t t i i n + a r v o s t e t t u a + a r v o s t e t t u j a + a r v o s t e t t u j e n + a r v o s t e t u i k s i + a r v o s t e t u i m m a t + a r v o s t e t u i m m i s t a + a r v o s t e t u i m p i a + a r v o s t e t u i m p i e n + a r v o s t e t u i m p i i n + a r v o s t e t u l l e + a r v o s t e t u m m a l t a + a r v o s t e t u n + a r v o s t e t u s t a + a r v o s t i n + a r v o s t r a t e g i a s s a + a r v o s t u k s e e n + a r v o s t u k s e m m e + a r v o s t u k s e n + a r v o s t u k s e n i + a r v o s t u s m e n e t t e l y j ä + a r v o s t u s s ä ä n t ö j ä + a r v o s t u s t a + a r v o s y r j i n n ä s t ä + a r v o s ä ä n n ö s t ö + a r v o t + a r v o t a k u u + a r v o t a v a r o i t a + a r v o t e o r i a + a r v o t i l a n t e e n + a r v o t o i m i n t a a + a r v o t o n t a + a r v o t t a k o o n + a r v o t t a v a + a r v o t t o m a k s i + a r v o t t o m i a + a r v o t u l l e i k s i + a r v o t u l l e j a + a r v o t y h j i ö s t ä + a r v o v a l i n n o i s s a + a r v o v a l i o k u n n a n + a r v o v a l l a l l e + a r v o v a l l a n + a r v o v a l l a s t a + a r v o v a l t a + a r v o v a l t a a + a r v o v a l t a a n n e + a r v o v a l t a a n s a + a r v o v a l t a h a n k k e e n + a r v o v a l t a h a n k k e e n a + a r v o v a l t a h a n k k e e s t a + a r v o v a l t a h a n k k e i s i i n + a r v o v a l t a i s e m m a n + a r v o v a l t a i s e m m a s t a + a r v o v a l t a i s e m m a t + a r v o v a l t a i s e m p i a + a r v o v a l t a i s e n + a r v o v a l t a i s e s t i + a r v o v a l t a i s i m m i s t a + a r v o v a l t a i s i m p i i n + a r v o v a l t a i s i n + a r v o v a l t a i s i s s a + a r v o v a l t a k y s y m y s + a r v o v a l t a n n e + a r v o v a l t a n s a + a r v o v a l t a p o l i t i i k k a + a r v o v a l t a p r o j e k t i + a r v o v a l t a t a i s t e l u n a + a r v o v a l t a t a p p i o t a + a r v o v a p a a t + a r v o v a p a i t a + a r v o v i e r a i d e n + a r v o v i i n e i l l e + a r v o v i r a n o m a i s e s t a + a r v o y h t e i s k u n t a + a r v o y h t e i s ö + a r v o y h t e i s ö k s i + a r v o y h t e i s ö m m e + a r v o y h t e i s ö n + a r v o y h t e i s ö n ä + a r v o y h t e i s ö s s ä + a r v o y h t e i s ö s t ä + a r v o y h t e i s ö ä + a r v o y h t e i s ö ä m m e + a r v o y h t e i s ö ö m m e + a r v o y h t e i s ö ö n + a r v o y k s i k ö k s i + a r y y l i h i i l i v e t y r e s e p t o r i + a s b e s t i a + a s b e s t i a l t i s t u k s e e n + a s b e s t i a l t i s t u k s e n + a s b e s t i h i u k k a s t e n + a s b e s t i j ä t e + a s b e s t i j ä t t e e n + a s b e s t i k a u d e l t a + a s b e s t i k e r a m i i k k a + a s b e s t i k i e l t o a + a s b e s t i k r i i s i + a s b e s t i k r i i s i n + a s b e s t i k u i d u i l l e + a s b e s t i k u i d u n + a s b e s t i k u i d u s t a + a s b e s t i k u i t u j a + a s b e s t i k u i t u j e n + a s b e s t i k u i t u k u l j e t u k s i a + a s b e s t i l e v y i s t ä + a s b e s t i l t a + a s b e s t i n + a s b e s t i o n g e l m a + a s b e s t i o n g e l m a a n + a s b e s t i o n g e l m a n + a s b e s t i o n g e l m i s t a + a s b e s t i p ä ä s t ö j e n + a s b e s t i p ö l y ä + a s b e s t i r e m o n t t i i n + a s b e s t i r i s k i s t ä + a s b e s t i s e m e n t t i ä + a s b e s t i s k a n d a a l i + a s b e s t i s k a n d a a l i n + a s b e s t i s k a n d a a l i s t a + a s b e s t i t a p a u k s i s s a + a s b e s t i t a p a u s + a s b e s t i t y y p p i + a s b e s t i v a a r a l l e + a s e d i p l o m a t i a s s a + a s e e l l i s e e n + a s e e l l i s e k s i + a s e e l l i s e l l a + a s e e l l i s e n + a s e e l l i s e s s a + a s e e l l i s e s t a + a s e e l l i s e s t i + a s e e l l i s e t + a s e e l l i s i a + a s e e l l i s i i n + a s e e l l i s i l l a + a s e e l l i s i s s a + a s e e l l i s i s t a + a s e e l l i s t a + a s e e l l i s t e n + a s e e n a + a s e e n k a n t a j a + a s e e n k a n t o + a s e e n p i i p p u k o h t a u s + a s e e n s a + a s e e t + a s e e t t o m a s t a + a s e h a n k i n t a l a i t o k s e n + a s e h a n k i n t a l a i t o s t a + a s e h a n k i n t a t o i m i n n o t + a s e h a n k i n t a v i r a s t o n + a s e h a n k i n t a v i r a s t o s t a + a s e h a n k i n t o i h i n + a s e h a n k i n t o j a + a s e h a n k i n t o j a a n + a s e h u o n e + a s e i d e n + a s e i d e n h a n k i n t a p o l i t i i k a n + a s e i d e n k ä y t ö n + a s e i d e n l u o v u t u s k o m i s s i o n + a s e i d e n m y y n t i t a p a u k s e s s a + a s e i d e n r i i s u n t a j ä r j e s t e l m ä n + a s e i d e n r i i s u n t a k o n f e r e n s s i + a s e i d e n r i i s u n t a k y s y m y s + a s e i d e n r i i s u n t a p o l i t i i k a s t a + a s e i d e n r i i s u n t a p o l i t i i k k a a + a s e i d e n r i i s u n t a p o n n i s t e l u j a + a s e i d e n r i i s u n t a p r o s e s s i a + a s e i d e n r i i s u n t a s o p i m u k s e t + a s e i d e n r i i s u n t a s o p i m u k s i a + a s e i d e n r i i s u n t a s o t a a + a s e i d e n r i i s u n t a s u u n n i t e l m a + a s e i d e n r i i s u n t a t u t k i m u k s e s t a + a s e i d e n r i i s u n t a t y ö t ä + a s e i d e n r i i s u n t a v i r a s t o n + a s e i d e n v a l m i s t a j a a + a s e i d e n v a l m i s t a j a k a n s a t + a s e i d e n v i e j ä m a a t + a s e i d e n v i e n n i l l e + a s e i d e n v i e n n i n + a s e i d e n v i e n n i s t ä + a s e i d e n v i e n t i + a s e i d e n v i e n t i k a u p p a + a s e i d e n v i e n t i k i e l l o n + a s e i d e n v i e n t i k i e l l o s t a + a s e i d e n v i e n t i k i e l l o t + a s e i d e n v i e n t i k i e l t o + a s e i d e n v i e n t i k i e l t o a + a s e i d e n v i e n t i k i e l t o o n + a s e i d e n v i e n t i l a k e j a + a s e i d e n v i e n t i m a a s t a + a s e i d e n v i e n t i p o l i i t i k k o j e n + a s e i d e n v i e n t i p o l i t i i k a s s a + a s e i d e n v i e n t i p o l i t i i k k a + a s e i d e n v i e n t i p o l i t i i k k a a + a s e i d e n v i e n t i p o l i t i i k k a a n + a s e i d e n v i e n t i p o l i t i i k k o j a + a s e i d e n v i e n t i s o p i m u k s i l l e + a s e i d e n v i e n t i ä + a s e i d e n v ä l i t t ä j ä t + a s e i d e n v ä l i t y s t o i m i n t a a + a s e i l l a + a s e i l l e + a s e i n + a s e i n a m m e + a s e i s i i n + a s e i s t a k i e l t ä y t y j i e n + a s e i s t a k i e l t ä y t y j i l l e + a s e i s t a k i e l t ä y t y j i s t ä + a s e i s t a k i e l t ä y t y j i ä + a s e i s t a k i e l t ä y t y j ä l i i t t o + a s e i s t a k i e l t ä y t y j ä t + a s e i s t a k i e l t ä y t y m i s t ä + a s e i s t a m a s s a + a s e i s t a m a t t o m i e n + a s e i s t a r i i s u m i s e n + a s e i s t a r i i s u n n a n + a s e i s t a r i i s u n t a a + a s e i s t a r i i s u n t a e h d o t u s t a + a s e i s t a r i i s u n t a k o k o u k s e n + a s e i s t a r i i s u n t a k o n f e r e n s s i + a s e i s t a r i i s u n t a k o n f e r e n s s i n + a s e i s t a r i i s u n t a k o n f e r e n s s i s s a + a s e i s t a r i i s u n t a k y s y m y s + a s e i s t a r i i s u n t a n e u v o t t e l u j a + a s e i s t a r i i s u n t a n e u v o t t e l u j e n + a s e i s t a r i i s u n t a o h j e l m a + a s e i s t a r i i s u n t a p o l i t i i k k a a + a s e i s t a r i i s u n t a p r o s e s s i + a s e i s t a r i i s u n t a p r o s e s s i a + a s e i s t a r i i s u n t a s o p i m u s + a s e i s t a r i i s u n t a t e h t ä v ä t + a s e i s t a r i i s u n t a t o i m i a + a s e i s t a u t u m a a n + a s e i s t a u t u m a s s a + a s e i s t a u t u m i s k i l p a i l u n + a s e i s t a u t u n e e n + a s e i s t a u t u n e e s e e n + a s e i s t a u t u n e e t + a s e i s t a u t u n e i d e n + a s e i s t a u t u n e i t a + a s e i s t a u t u n u t + a s e i s t a u t u n u t t a + a s e i s t a v a t + a s e i s t e t t u a + a s e i s t e t t u j a + a s e i s t e t t u j e n + a s e i s t e t t u n a + a s e i s t e t u i l l e + a s e i s t e t u t + a s e i s t u k s e n + a s e i t a + a s e i t a a n + a s e i t t e n + a s e j o u k k o j a + a s e j o u k k o j e n + a s e j o u k o i l t a + a s e j o u k o t + a s e j ä r j e s t e l m i e n + a s e j ä r j e s t e l m i e n k i n + a s e j ä r j e s t e l m i i n + a s e j ä r j e s t e l m i s t ä + a s e j ä r j e s t e l m i ä + a s e j ä r j e s t e l m ä + a s e j ä r j e s t e l m ä t + a s e j ä r j e s t e l m ä ä + a s e k a l u s t o a + a s e k a p a s i t e e t i n + a s e k a p p a + a s e k a u p a l l e + a s e k a u p a n + a s e k a u p a s s a + a s e k a u p a s t a + a s e k a u p a t + a s e k a u p o i l l e + a s e k a u p o i s t a + a s e k a u p p a + a s e k a u p p a a + a s e k a u p p a a n + a s e k a u p p a a n s a + a s e k a u p p a p o l i t i i k k a a + a s e k a u p p a s a a r t o a a n + a s e k a u p p a s o p i m u k s e e n + a s e k a u p p a s o p i m u k s e l l a + a s e k a u p p a s o p i m u k s e l l e + a s e k a u p p a s o p i m u k s e n + a s e k a u p p a s o p i m u k s e s t a + a s e k a u p p a s o p i m u k s e t + a s e k a u p p a s o p i m u k s i a + a s e k a u p p a s o p i m u s + a s e k a u p p a s o p i m u s t a + a s e k a u p p a s u l u s t a + a s e k a u p p i a a t + a s e k a u p p i a i d e n + a s e k a u p p i a i l l e + a s e k a u p p i a i t a + a s e k a u p p i a s + a s e k a u p p o i h i n + a s e k a u p p o j e n + a s e k i l p a i l u + a s e k i l p a i l u a + a s e k i l p a i l u n + a s e k o u l u t u k s e s t a + a s e k u l j e t u k s e t + a s e k u l j e t u k s i l t a + a s e k u l j e t u k s i s t a + a s e k u l t t u u r i + a s e k y s y m y k s e e n + a s e k ä t k e n t ä + a s e k ä t k ö n + a s e l a b o r a t o r i o t + a s e l a i n s ä ä d ä n n ö n + a s e l a k i + a s e l a k i a a n + a s e l e p o + a s e l e p o k o m i s s i o n + a s e l e p o l i n j a a + a s e l e p o n e u v o t t e l u i s t a + a s e l e p o n e u v o t t e l u j e n + a s e l e p o r a t k a i s u + a s e l e p o r i k k o m u k s i s t a + a s e l e p o s o p i m u k s e n + a s e l e p o s o p i m u k s e s t a + a s e l e p o s o p i m u s + a s e l e p o s o p i m u s t a + a s e l e p o s u u n n i t e l m a n + a s e l e p o v a a t i m u k s e n + a s e l e v o n + a s e l u o k a n + a s e l u p a + a s e l u p a a + a s e m a a + a s e m a a m m e + a s e m a a n + a s e m a a n s a + a s e m a l a i t u r i + a s e m a l l a + a s e m a l l e e n + a s e m a m m e + a s e m a n + a s e m a n s a + a s e m a p ä ä l l i k k ö + a s e m a r k k i n a t + a s e m a r k k i n o i d e n + a s e m a r k k i n o i l l a + a s e m a r k k i n o i s t a + a s e m a r k k i n o i t a + a s e m a s o t a + a s e m a s o t a a + a s e m a s o t a a n + a s e m a s s a + a s e m a s s a a n + a s e m a s t a a n + a s e m a s t a m m e + a s e m a t a s o + a s e m a t a s o t a r k a s t u k s e t + a s e m a t a s o t a r k a s t u k s i a + a s e m a t a s o t a r k a s t u k s i s t a + a s e m a t a s o t a r k a s t u s + a s e m a t a s o t a r k a s t u s t e n + a s e m e n o i h i n + a s e m e n o i s s a + a s e m e n o i s t a + a s e m e n o j a a n + a s e m e n o j e n + a s e m e n o t + a s e m e s s u i l l a + a s e m e s s u i l l e + a s e m i a + a s e m i a a n + a s e m i e n + a s e m i e s p a l v e l u s t a + a s e m i i n + a s e m i s s a + a s e m i s t a + a s e m y y n n i n + a s e m y y n n i s s ä + a s e m y y n n i s t ä + a s e m y y n t i + a s e m y y n t i ä + a s e m ä ä r i e n + a s e m ä ä r ä s t ä + a s e n e u v o s t o n + a s e n n e k a s v a t u k s e n + a s e n n e k a s v a t u k s e s t a + a s e n n e k a s v a t u s k a m p a n j o i t a + a s e n n e k y s y m y s + a s e n n e m u u t o k s e e n + a s e n n e m u u t o k s e n + a s e n n e m u u t o k s e s t a + a s e n n e m u u t o s + a s e n n e m u u t o s t a + a s e n n e t a a n + a s e n n e t e s t i s s ä + a s e n n e t t a + a s e n n e t t a a n + a s e n n e t t a i s i i n + a s e n n e t t a m m e + a s e n n e t t a v a + a s e n n e t u i l l a + a s e n n e t u i s t a + a s e n n o i d u t t a v a + a s e n n o i t u a + a s e n n o i t u e s s a a n + a s e n n o i t u m i s e s t a + a s e n n u s k u s t a n n u s t e n + a s e n n u s m a k s u j a + a s e n t a m i s e s t a + a s e n t e e l l i s u u d e n + a s e n t e e n + a s e n t e e n m u u t o s t a + a s e n t e e n s a + a s e n t e e s e e n + a s e n t e e s t a + a s e n t e e t + a s e n t e i d e n + a s e n t e i s i i n + a s e n t e i s t a + a s e n t e i s t a a n + a s e n t e i t a + a s e n t o h u i m a u s + a s e o h j e l m a a + a s e o h j e l m i a + a s e o h j e l m i e n + a s e o h j e l m i i n s a + a s e o h j e l m i s s a + a s e o h j e l m i s t a a n + a s e o s t o i h i n + a s e o s t o j e n + a s e p a l v e l u a + a s e p a l v e l u j a + a s e p a l v e l u k s e e n + a s e p a l v e l u k s e l t a + a s e p a l v e l u k s e n + a s e p a l v e l u k s e s t a + a s e p a l v e l u n + a s e p a l v e l u s a j a l t a n i + a s e p a l v e l u s t a + a s e p a l v e l u s t a a n + a s e p a l v e l u u n + a s e p l u t o n i u m i n + a s e p o l i t i i k a n + a s e p o l i t i i k k a + a s e p o l i t i i k k a a + a s e p o l i t i i k k a m m e + a s e r a j o i t u s p y r k i m y k s i i n + a s e r a j o i t u s t a + a s e r a j o i t u s t e n + a s e r e k i s t e r i i n + a s e r e k i s t e r i ä + a s e r i i s u n n a s t a + a s e r i i s u n t a k i e r r e + a s e r i i s u n t a k y s y m y s + a s e r i i s u n t a n e u v o t t e l u j e n + a s e r i i s u n t a o h j e l m a n + a s e r i i s u n t a o h j e l m a s t a + a s e r i i s u n t a p o l i t i i k a n + a s e r i i s u n t a p o l i t i i k k a a + a s e r i i s u n t a p o l i t i i k k a a n s a + a s e r i i s u n t a p r o s e s s i + a s e r i i s u n t a s i t o u m u k s i a + a s e r i i s u n t a s i t o u m u s t e n + a s e r i i s u n t a s t r a t e g i a n + a s e r i i s u n t a t o i m e n p i d e t t ä + a s e r i i s u n t a t o i m e t + a s e r i i s u n t a v a a t i m u k s e t + a s e r i i s u n t a v e l v o i t e t t a + a s e r i i s u n t a v e l v o i t t e i s t a + a s e r i i s u n t a v e l v o i t t e i t a a n + a s e r y ö s t ö + a s e r y ö s t ö ä + a s e s a a r r o n + a s e s a a r t o + a s e s a a r t o a + a s e s a l a k u l j e t u s t e n + a s e s i i r r o t + a s e s i i r t o i h i n + a s e s i i r t o j a + a s e s i i r t o j e n + a s e s o p i m u k s e n + a s e s o p i m u s + a s e s t r a t e g i a + a s e s u l k u + a s e s u l k u a + a s e s u l k u a s i a t + a s e s u l k u a s i o i s s a + a s e s u l k u j ä r j e s t e l m ä + a s e s u l k u j ä r j e s t e l m ä n + a s e s u l k u l a u s e k k e e n + a s e s u l k u p o l i t i i k k a a + a s e s u l k u u n + a s e s u l u n + a s e s u l u s s a + a s e t a i s t e l u j e n + a s e t a m m e + a s e t a n + a s e t a r k a s t a j a + a s e t a r k a s t a j a t + a s e t a r k a s t a j i a + a s e t a r k a s t a j i e n + a s e t a r k a s t a j i l l a + a s e t a r k a s t a j i l l e + a s e t a r k a s t u k s e t + a s e t a r k a s t u k s i a + a s e t a r k a s t u k s i l l a + a s e t a r k a s t u k s i l l e + a s e t a r k a s t u s k o m i s s i o + a s e t a r k a s t u s o h j e l m a a + a s e t a r k a s t u s o h j e l m a s t a + a s e t a r k a s t u s r y h m i e n + a s e t a r k a s t u s r y h m i ä + a s e t a r k a s t u s t e h t ä v i s s ä + a s e t a r k a s t u s t e n + a s e t a r k a s t u s v a a t i m u k s i i n + a s e t a r k a s t u s y k s i k k ö + a s e t a r p e i t a + a s e t a r v i k k e i d e n + a s e t a s a p a i n o n + a s e t e h d a s + a s e t e h d a s t a + a s e t e h t a i l i j o i s t a + a s e t e h t a i t a + a s e t e k n i i k k a a + a s e t e k n i i k k a a n s a + a s e t e k n o l o g i a m m e + a s e t e k n o l o g i a n + a s e t e l m a k e r r o i n + a s e t e l m a k s i + a s e t e l m i s t a + a s e t e o l l i s u u d e l l a + a s e t e o l l i s u u d e l l e + a s e t e o l l i s u u d e n + a s e t e o l l i s u u d e s s a + a s e t e o l l i s u u d e s t a + a s e t e o l l i s u u k s i e n + a s e t e o l l i s u u s + a s e t e o l l i s u u s a l a n + a s e t e o l l i s u u s a l o j e n + a s e t e o l l i s u u s a l u e e l l a + a s e t e o l l i s u u s m a r k k i n a t + a s e t e o l l i s u u s m a r k k i n o i l l a + a s e t e o l l i s u u s p o l i t i i k a n + a s e t e o l l i s u u s p o l i t i i k k a + a s e t e o l l i s u u s y r i t y k s e t + a s e t e o l l i s u u t e e n + a s e t e o l l i s u u t e n s a + a s e t e o l l i s u u t t a + a s e t e r r o r i s t e j a + a s e t e t a a n + a s e t e t t a e s s a + a s e t e t t a i s i + a s e t e t t a v a + a s e t e t t a v a t + a s e t e t t a v i a + a s e t e t t i i n + a s e t e t t u a + a s e t e t t u i h i n + a s e t e t t u j a + a s e t e t t u j e n + a s e t e t u i s t a + a s e t e t u n + a s e t e t u s s a + a s e t e t u t + a s e t i e t ä m y s t ä + a s e t i l a u k s e t + a s e t i n l a i t e + a s e t i t t e + a s e t o i m i t t a j a a + a s e t o i m i t t a j a t + a s e t o i m i t u k s e n + a s e t o i m i t u k s e s t a + a s e t o i m i t u k s e t + a s e t o i m i t u k s i a + a s e t o i m i t u k s i i n + a s e t o i m i t u k s i s t a + a s e t o i m i t u s t a + a s e t o i m i t u s t e n + a s e t o n i d i k a r b o k s y y l i h a p p o + a s e t o n i p e r o k s i d i + a s e t o n i s y a n o h y d r i i n i + a s e t o v e r e i t a + a s e t r u s t i e n + a s e t t a + a s e t t a a + a s e t t a a k s e e n + a s e t t a a k s e n i + a s e t t a e s s a a n + a s e t t a e s s a m m e + a s e t t a e s s a n n e + a s e t t a k a a m m e + a s e t t a k o o t + a s e t t a m a a n + a s e t t a m a l l a + a s e t t a m a l l e + a s e t t a m a m m e + a s e t t a m a n s a + a s e t t a m a s s a n n e + a s e t t a m a s t a + a s e t t a m a t t a + a s e t t a m i a a n + a s e t t a m i e m m e + a s e t t a m i i m m e + a s e t t a m i l l e m m e + a s e t t a m i s e k s i + a s e t t a m i s e s s a + a s e t t a m i s e s t a + a s e t t a m i s t a + a s e t t a m i s t a m m e + a s e t t a n e e t + a s e t t a n u t + a s e t t a v a n + a s e t t a v a t + a s e t t a v a t k o + a s e t t e l u j ä r j e s t e l m ä ä + a s e t t e l u s t a + a s e t t u a + a s e t t u i v a t + a s e t t u m a s t a + a s e t t u m i s t a + a s e t t u v a t + a s e t u i t t e + a s e t u k s e e n + a s e t u k s e k s i + a s e t u k s e l l a + a s e t u k s e n + a s e t u k s e s s a + a s e t u k s e s t a + a s e t u k s e t + a s e t u k s i a + a s e t u k s i e n + a s e t u k s i i n + a s e t u k s i k s i + a s e t u k s i l l a + a s e t u k s i s s a + a s e t u k s i s t a + a s e t u o t a n n o n + a s e t u o t a n n o s s a + a s e t u o t a n n o s t a + a s e t u o t a n t o + a s e t u o t a n t o a + a s e t u o t a n t o a a n + a s e t u o t t a j i a + a s e t u s e h d o t u k s e e n + a s e t u s e h d o t u k s e e n s a + a s e t u s e h d o t u k s e l l a + a s e t u s e h d o t u k s e l l a a n + a s e t u s e h d o t u k s e l l a k a a n + a s e t u s e h d o t u k s e l l e + a s e t u s e h d o t u k s e l l e e n + a s e t u s e h d o t u k s e m m e + a s e t u s e h d o t u k s e n + a s e t u s e h d o t u k s e n s a + a s e t u s e h d o t u k s e s s a + a s e t u s e h d o t u k s e s s a a n + a s e t u s e h d o t u k s e s s a h a n + a s e t u s e h d o t u k s e s t a + a s e t u s e h d o t u k s e t + a s e t u s e h d o t u k s i a + a s e t u s e h d o t u k s i l l a + a s e t u s e h d o t u k s i s s a + a s e t u s e h d o t u k s i s t a + a s e t u s e h d o t u s + a s e t u s e h d o t u s p a k e t t i i n + a s e t u s e h d o t u s t a + a s e t u s e h d o t u s t a a n + a s e t u s e h d o t u s t e n + a s e t u s e s i t y k s e l l ä + a s e t u s e s i t y k s e n + a s e t u s e s i t y s + a s e t u s e s i t y s t ä + a s e t u s j ä r j e s t e l m ä n + a s e t u s j ä r j e s t e l m ä ä n + a s e t u s k o k o e l m a a n + a s e t u s k o k o n a i s u u d e l l e + a s e t u s k o k o n a i s u u t t a + a s e t u s l u o n n o k s e e n + a s e t u s l u o n n o k s e k s i + a s e t u s l u o n n o k s e l l a + a s e t u s l u o n n o k s e l l e + a s e t u s l u o n n o k s e n + a s e t u s l u o n n o k s e n s a + a s e t u s l u o n n o k s e s s a + a s e t u s l u o n n o k s e s t a + a s e t u s l u o n n o k s e t + a s e t u s l u o n n o k s i i n + a s e t u s l u o n n o k s i k s i + a s e t u s l u o n n o k s i s s a + a s e t u s l u o n n o s + a s e t u s l u o n n o s t a + a s e t u s l u o n n o s t e n + a s e t u s m u o d o n + a s e t u s m u u t o k s e n + a s e t u s p a k e t i n + a s e t u s p a k e t i s t a + a s e t u s p a k e t t i + a s e t u s p a k e t t i i n + a s e t u s t a + a s e t u s t e k s t e i h i n + a s e t u s t e k s t e i s s ä + a s e t u s t e k s t i + a s e t u s t e k s t i e n + a s e t u s t e k s t i i n + a s e t u s t e k s t i n + a s e t u s t e k s t i s s ä + a s e t u s t e k s t i s t ä + a s e t u s t e k s t i ä + a s e t u s t e n + a s e t u t k i m u k s e e n + a s e t y y l i k l o r i d i + a s e t y y l i k o l i i n i r e s e p t o r i + a s e t y y p e i s t ä + a s e t y y p p e j ä + a s e v a l i k o i m a s s a a n + a s e v a l m i s t a j a + a s e v a l m i s t a j a t + a s e v a l m i s t a j i e n + a s e v a l v o n n a l l e + a s e v a l v o n n a n + a s e v a l v o n n a s t a + a s e v a l v o n t a + a s e v a l v o n t a a + a s e v a l v o n t a a n + a s e v a l v o n t a j ä r j e s t e l m ä + a s e v a l v o n t a p o l i t i i k k a + a s e v a l v o n t a p o l i t i i k k a a n + a s e v a l v o n t a p r o s e s s i n + a s e v a l v o n t a s o p i m u s t e n + a s e v a l v o n t a s t r a t e g i a n + a s e v a r a s t o + a s e v a r a s t o a a n + a s e v a r a s t o i h i n + a s e v a r a s t o i k s i + a s e v a r a s t o i n a + a s e v a r a s t o j a + a s e v a r a s t o j e n + a s e v a r a s t o t + a s e v a r u s t e l u + a s e v a r u s t e l u a + a s e v a r u s t e l u a l a a + a s e v a r u s t e l u a l a n + a s e v a r u s t e l u h a n k k e i t a + a s e v a r u s t e l u k i e r t e e n + a s e v a r u s t e l u k i e r t e e s s ä + a s e v a r u s t e l u k i l p a + a s e v a r u s t e l u k i l p a a + a s e v a r u s t e l u k i l p a a n + a s e v a r u s t e l u k i l p a i l u a + a s e v a r u s t e l u k i l p a i l u u n + a s e v a r u s t e l u k i l v a n + a s e v a r u s t e l u n + a s e v a r u s t e l u o h j e l m a + a s e v a r u s t e l u o h j e l m i a + a s e v a r u s t e l u o h j e l m i e n + a s e v a r u s t e l u p o l i t i i k a n + a s e v a r u s t e l u p o l i t i i k a s t a + a s e v a r u s t e l u p o l i t i i k k a + a s e v a r u s t e l u p o l i t i i k k a a + a s e v a r u s t e l u r y h m ä + a s e v a r u s t e l u s t a + a s e v a r u s t e l u t e o l l i s u u d e s s a + a s e v a r u s t e l u u n + a s e v a r u s t e l u v a l v o n n a l l e + a s e v a r u s t e l u v i r a s t o + a s e v a r u s t e l u v i r a s t o n + a s e v a r u s t e l u v i r a s t o o n + a s e v a r u s t e l u y h t e i s t y ö j ä r j e s t ö n + a s e v a r u s t e l u y h t e i s t y ö n + a s e v a r u s t e l u y h t e i s t y ö s t ä + a s e v a r u s t e l u y h t e i s t y ö t ä + a s e v a r u s t e l u y r i t y k s e n + a s e v e l j e y t e e n + a s e v e l j i e n + a s e v e l j i e n s ä + a s e v e l j i k s i + a s e v e l v o l l i n e n + a s e v e l v o l l i s i a + a s e v e l v o l l i s u u s + a s e v e l v o l l i s u u s a r m e i j a n + a s e v i e j i e n + a s e v i e j i l l ä + a s e v i e j i ä + a s e v i e j ä + a s e v i e j ä n ä + a s e v i e j ä t + a s e v i e n n i l l e + a s e v i e n n i n + a s e v i e n n i s s ä + a s e v i e n n i s t ä + a s e v i e n t i + a s e v i e n t i i n + a s e v i e n t i k i e l l o l l a + a s e v i e n t i k i e l l o l l e + a s e v i e n t i k i e l l o n + a s e v i e n t i k i e l l o s t a + a s e v i e n t i k i e l l o t + a s e v i e n t i k i e l t o + a s e v i e n t i k i e l t o a + a s e v i e n t i k i e l t o i h i n + a s e v i e n t i k i e l t o j a + a s e v i e n t i k i e l t o j e n + a s e v i e n t i k i e l t o o n + a s e v i e n t i l a k i n s a + a s e v i e n t i l u p a + a s e v i e n t i l u p a a + a s e v i e n t i l u v i s t a + a s e v i e n t i m a a n a + a s e v i e n t i m ä ä r ä y s t e n + a s e v i e n t i p o l i t i i k a n + a s e v i e n t i p o l i t i i k a s s a + a s e v i e n t i p o l i t i i k k a + a s e v i e n t i p o l i t i i k k a a + a s e v i e n t i p o l i t i i k k a a n + a s e v i e n t i t e k s t i n + a s e v i e n t i ä + a s e v i e n t i ä ä n + a s e v i r a s t o s t a + a s e v i r t a + a s e v i r t a a + a s e v o i m a a + a s e v o i m a a n + a s e v o i m a l l a + a s e v o i m a m m e + a s e v o i m a n s a + a s e v o i m a t + a s e v o i m i a + a s e v o i m i a a n + a s e v o i m i e m m e + a s e v o i m i e n + a s e v o i m i i n + a s e v o i m i i n s a + a s e v o i m i l l a + a s e v o i m i l l a k a a n + a s e v o i m i l l e + a s e v o i m i n + a s e v o i m i s s a + a s e v o i m i s t a + a s e v o i m i s t a m m e + a s e v ä l i t t ä j i l l e + a s e v ä l i t t ä j i ä + a s e v ä l i t y k s e n + a s e v ä l i t y s t ä + a s e y h t e i s t y ö t ä + a s e y h t i ö t + a s f a l t t i a l t t a r i l l e + a s f a l t t i b e t o n i a + a s f a l t t i j ä r v i + a s f a l t t i p o l i t i i k k a a + a s f a l t t i v i i d a k k o + a s i a a + a s i a a m m e + a s i a a n + a s i a a n k u u l u m a t o n t a + a s i a a n k u u l u m a t t o m a n a + a s i a a n k u u l u m a t t o m i a + a s i a a n k u u l u v a a + a s i a a n k u u l u v a m m i k s i + a s i a a n k u u l u v a m p a a + a s i a a n k u u l u v a n + a s i a a n k u u l u v a t + a s i a a n k u u l u v i n + a s i a a n k u u l u v i s t a + a s i a a n s a + a s i a h a n + a s i a i n + a s i a i n h o i t o + a s i a i n t i l a + a s i a i n t i l a a + a s i a i n t i l a a n + a s i a i n t i l a l l e + a s i a i n t i l a n + a s i a i n t i l a s t a + a s i a k a s j ä r j e s t e l m ä t + a s i a k a s k a n t a a n s a + a s i a k a s k e s k e i s y y t t ä + a s i a k a s k o n t a k t i e n + a s i a k a s k o r k o j a a n + a s i a k a s k o r t t e j a + a s i a k a s k o r t t i + a s i a k a s k u n n a l l e + a s i a k a s k u n n a n + a s i a k a s k u n t a + a s i a k a s k y s y n t ä + a s i a k a s l u e t t e l o + a s i a k a s l u k u j e n + a s i a k a s l ä h e i s y y s + a s i a k a s l ä h t ö i s e m m i n + a s i a k a s l ä h t ö i s e m p i + a s i a k a s l ä h t ö i s y y s + a s i a k a s l ä h t ö i s y y t t ä + a s i a k a s m a i t a a n + a s i a k a s n e u v o n t a a + a s i a k a s o h j e l m i i n + a s i a k a s p a l v e l u + a s i a k a s p a l v e l u a + a s i a k a s p a l v e l u n + a s i a k a s p a l v e l u u n + a s i a k a s p i i r e j ä + a s i a k a s r y h m i i n + a s i a k a s r y h m i l l e + a s i a k a s s u h t e e s t a + a s i a k a s s u h t e i s t a + a s i a k a s s u h t e i t a + a s i a k a s s u u n t a u t u n e i s u u d e n + a s i a k a s s u u n t a u t u n e i s u u t t a + a s i a k a s t i e t o j a + a s i a k a s t y y t y v ä i s y y d e n + a s i a k a s t y y t y v ä i s y y d e s t ä + a s i a k a s t y y t y v ä i s y y s + a s i a k a s u s k o l l i s u u s + a s i a k a s v a l i t u s t a + a s i a k a s y s t ä v ä l l i s e m p i ä + a s i a k a s y s t ä v ä l l i s i ä + a s i a k a s y s t ä v ä l l i s t ä + a s i a k a s y s t ä v ä l l i s y y s + a s i a k e s k e i s i i n + a s i a k e s k u s t e l u a + a s i a k e s k u s t e l u j e n + a s i a k i r j a + a s i a k i r j a a + a s i a k i r j a a n + a s i a k i r j a a n n e + a s i a k i r j a e h d o t u s t a + a s i a k i r j a h a k e m i s t o a + a s i a k i r j a h a l l i n t a + a s i a k i r j a h a l l i n t o a + a s i a k i r j a j u l k i s u u d e n + a s i a k i r j a j u l k i s u u d e s t a + a s i a k i r j a j u l k i s u u s + a s i a k i r j a k a n s i o + a s i a k i r j a k a n s i o t a + a s i a k i r j a k e s k u k s i a + a s i a k i r j a k o h t a i s e s t i + a s i a k i r j a k s i + a s i a k i r j a l l e + a s i a k i r j a l u e t t e l o i d e n + a s i a k i r j a l u o k a t + a s i a k i r j a l u o k k i a + a s i a k i r j a l u o n n o k s e e n + a s i a k i r j a l u o n n o k s e n + a s i a k i r j a l u o n n o k s e s s a + a s i a k i r j a l u o n n o k s e s s a n i + a s i a k i r j a l u o n n o k s e s t a + a s i a k i r j a l u o n n o k s i s s a m m e + a s i a k i r j a l u o n n o s + a s i a k i r j a l u o n n o s t e n + a s i a k i r j a l ä h t e e t + a s i a k i r j a m e n e t t e l y j e n + a s i a k i r j a m e n e t t e l y j ä + a s i a k i r j a m m e + a s i a k i r j a m u u t o s t e n + a s i a k i r j a m ä ä r ä n + a s i a k i r j a m ä ä r ä s t ä + a s i a k i r j a m ä ä r ä ä + a s i a k i r j a n + a s i a k i r j a n a + a s i a k i r j a n e u v o j i e n + a s i a k i r j a n e u v o n a n t a j i e n + a s i a k i r j a n s a + a s i a k i r j a p a k e t t i + a s i a k i r j a p e r u s t a + a s i a k i r j a p e t o k s e t + a s i a k i r j a p e t o k s i a + a s i a k i r j a p i n o t + a s i a k i r j a p y y n t ö j e n + a s i a k i r j a r e k i s t e r i + a s i a k i r j a r e k i s t e r i e n + a s i a k i r j a r e k i s t e r i n + a s i a k i r j a r e k i s t e r i s s ä + a s i a k i r j a r e k i s t e r i ä + a s i a k i r j a s s a + a s i a k i r j a s s a a n + a s i a k i r j a s s a h a n + a s i a k i r j a s s a m m e + a s i a k i r j a s s a n n e + a s i a k i r j a s t a + a s i a k i r j a t + a s i a k i r j a t i e t o k a n t a a n + a s i a k i r j a t i i v i s t e l m ä t + a s i a k i r j a t o d i s t e i t a + a s i a k i r j a t o i m i s t o + a s i a k i r j a t o i m i s t o l l e + a s i a k i r j a t o i m i s t o s s a + a s i a k i r j a t o i m i s t o s t a + a s i a k i r j a t u r v a l l i s u u d e n + a s i a k i r j a t u r v a l l i s u u t t a + a s i a k i r j a t u t k i m u k s i a + a s i a k i r j a v a a t i m u k s e t + a s i a k i r j a v ä ä r e n n ö k s i s t ä + a s i a k i r j a v ä ä r e n n ö s t e n + a s i a k i r j o i h i n + a s i a k i r j o i k s i + a s i a k i r j o i l l e + a s i a k i r j o i s s a + a s i a k i r j o i s s a m m e + a s i a k i r j o i s t a + a s i a k i r j o i s t a a n + a s i a k i r j o j a + a s i a k i r j o j e n + a s i a k k a a n + a s i a k k a a t + a s i a k k a i d e n + a s i a k k a i d e n s a + a s i a k k a i l l e + a s i a k k a i l l e e n + a s i a k k a i l t a a n + a s i a k k a i s t a + a s i a k k a i t a + a s i a k k u u d e n h a l l i n t a + a s i a k o h t a + a s i a k o k o n a i s u u d e k s i + a s i a k o k o n a i s u u k s i a + a s i a k o k o n a i s u u k s i e n + a s i a k o k o n a i s u u s + a s i a k o k o n a i s u u t e e n + a s i a k o k o n a i s u u t t a + a s i a k s e e n + a s i a k s i + a s i a k y s y m y k s e e n + a s i a k y s y m y k s e n + a s i a k y s y m y k s i i n + a s i a k y s y m y k s i s s ä + a s i a k y s y m y k s i s t ä + a s i a k y s y m y k s i ä + a s i a k y s y m y s + a s i a k y s y m y s t e n + a s i a k y s y m y s t ä + a s i a l i s t a + a s i a l i s t a a + a s i a l i s t a a m m e + a s i a l i s t a l l a + a s i a l i s t a l l a m m e + a s i a l i s t a l l e + a s i a l i s t a n + a s i a l i s t a n s a + a s i a l i s t a p r o s e s s i + a s i a l i s t a s t a + a s i a l i s t o j a + a s i a l l a + a s i a l l e + a s i a l l i s e l l a + a s i a l l i s e m m i n + a s i a l l i s e m p a a + a s i a l l i s e m p i i n + a s i a l l i s e n + a s i a l l i s e s t a + a s i a l l i s i a + a s i a l l i s t a + a s i a m i e h i s t ä + a s i a m i e s i n s t i t u u t i o + a s i a m i e s t e n + a s i a m m e + a s i a n + a s i a n a + a s i a n a a n + a s i a n a j a j a + a s i a n a j a j a a n + a s i a n a j a j a j ä r j e s t ö i l t ä + a s i a n a j a j a k o l l e g o i d e m m e + a s i a n a j a j a k o l l e g o i t a + a s i a n a j a j a l i i t t o + a s i a n a j a j a l i i t t o i h i n + a s i a n a j a j a l t a + a s i a n a j a j a n + a s i a n a j a j a n a + a s i a n a j a j a p a l k k i o i d e n + a s i a n a j a j a p a l v e l u j e n + a s i a n a j a j a r y h m ä l l e m m e + a s i a n a j a j a s i k i n + a s i a n a j a j a t + a s i a n a j a j a t o i m i n t a n i + a s i a n a j a j a y h d i s t y k s e l l e + a s i a n a j a j a y h d i s t y k s e n + a s i a n a j a j a y h d i s t y k s i e n + a s i a n a j a j a y h d i s t y s t e n + a s i a n a j a j i a + a s i a n a j a j i e n + a s i a n a j a j i e n s a + a s i a n a j a j i i n + a s i a n a j a j i k s i + a s i a n a j a j i l t a + a s i a n a j o p a l k k i o i h i n + a s i a n a j o t o i m i s t o + a s i a n a j o t o i m i s t o a + a s i a n a j o t o i m i s t o i l l e + a s i a n a j o t o i m i s t o i s s a + a s i a n a j o t o i m i s t o j a + a s i a n a j o t o i m i s t o t + a s i a n e d i s t ä m i s t o i m i a + a s i a n h a a r o i s t a + a s i a n h a a r o j a + a s i a n h a l l i n t a j ä r j e s t e l m ä + a s i a n i + a s i a n l a i t a + a s i a n l a i t a h a n + a s i a n m u k a i n e n + a s i a n m u k a i s e e n + a s i a n m u k a i s e k s i + a s i a n m u k a i s e l l a + a s i a n m u k a i s e l l e + a s i a n m u k a i s e l t a + a s i a n m u k a i s e m m a k s i + a s i a n m u k a i s e m m a l l a + a s i a n m u k a i s e m m a n + a s i a n m u k a i s e m m a s s a + a s i a n m u k a i s e m m a s t a + a s i a n m u k a i s e m m i n + a s i a n m u k a i s e m p a a + a s i a n m u k a i s e m p a a n + a s i a n m u k a i s e m p a n a + a s i a n m u k a i s e m p i + a s i a n m u k a i s e m p i a + a s i a n m u k a i s e m p i e n + a s i a n m u k a i s e n + a s i a n m u k a i s e n a + a s i a n m u k a i s e s s a + a s i a n m u k a i s e s t a + a s i a n m u k a i s e s t i + a s i a n m u k a i s e t + a s i a n m u k a i s i a + a s i a n m u k a i s i a k a a n + a s i a n m u k a i s i i n + a s i a n m u k a i s i k s i + a s i a n m u k a i s i l l a + a s i a n m u k a i s i m m a k s i + a s i a n m u k a i s i m m a l l a + a s i a n m u k a i s i m m a l t a + a s i a n m u k a i s i m m a n + a s i a n m u k a i s i m m a s s a + a s i a n m u k a i s i m m a t + a s i a n m u k a i s i m m i k s i + a s i a n m u k a i s i m m i n + a s i a n m u k a i s i m m i s t a + a s i a n m u k a i s i m p a n a + a s i a n m u k a i s i m p i e n + a s i a n m u k a i s i m p i i n + a s i a n m u k a i s i n + a s i a n m u k a i s i n t a + a s i a n m u k a i s i s s a + a s i a n m u k a i s i s t a + a s i a n m u k a i s t a + a s i a n m u k a i s t e n + a s i a n m u k a i s u u d e n + a s i a n m u k a i s u u d e s t a + a s i a n m u k a i s u u s + a s i a n m u k a i s u u t t a + a s i a n n e + a s i a n o m a i n e n + a s i a n o m a i s e e n + a s i a n o m a i s e n + a s i a n o m a i s e n a + a s i a n o m a i s e s t i + a s i a n o m a i s e t + a s i a n o m a i s i a + a s i a n o m a i s i i n + a s i a n o m a i s i l l e + a s i a n o m a i s i n + a s i a n o m a i s i s s a + a s i a n o m a i s i s t a + a s i a n o m a i s t a + a s i a n o m a i s t e n + a s i a n o m i s t a j a l t a + a s i a n o s a i n e n + a s i a n o s a i s e e n + a s i a n o s a i s e l l e + a s i a n o s a i s e n + a s i a n o s a i s e n a + a s i a n o s a i s e t + a s i a n o s a i s i a + a s i a n o s a i s i i n + a s i a n o s a i s i l l a + a s i a n o s a i s i l l e + a s i a n o s a i s i l t a + a s i a n o s a i s i n a + a s i a n o s a i s i s s a + a s i a n o s a i s i s t a + a s i a n o s a i s t a + a s i a n o s a i s t e n + a s i a n o s a i s u u s k r i t e e r e j ä + a s i a n s a + a s i a n t i l a + a s i a n t i l a a + a s i a n t i l a n + a s i a n t i l a n a + a s i a n t i l a s t a + a s i a n t u n t e m u k s e e n + a s i a n t u n t e m u k s e e n s a + a s i a n t u n t e m u k s e l l a a n + a s i a n t u n t e m u k s e m m e + a s i a n t u n t e m u k s e n + a s i a n t u n t e m u k s e n s a + a s i a n t u n t e m u k s e s t a + a s i a n t u n t e m u k s e s t a a n + a s i a n t u n t e m u s + a s i a n t u n t e m u s t a + a s i a n t u n t e m u s t a a n + a s i a n t u n t e m u s t a m m e + a s i a n t u n t e v a a + a s i a n t u n t e v a a n + a s i a n t u n t e v a l l a + a s i a n t u n t e v a m m i n + a s i a n t u n t e v a m p a a + a s i a n t u n t e v a m p a a n + a s i a n t u n t e v a n + a s i a n t u n t e v a s t a + a s i a n t u n t e v i e n + a s i a n t u n t e v i m m a k s i + a s i a n t u n t e v i s t a + a s i a n t u n t i j a + a s i a n t u n t i j a a + a s i a n t u n t i j a d e m o k r a t i a a + a s i a n t u n t i j a e d u s t a j a a + a s i a n t u n t i j a e d u s t u s + a s i a n t u n t i j a e l i m i n ä + a s i a n t u n t i j a e l i m i ä + a s i a n t u n t i j a e l i n + a s i a n t u n t i j a e l i n t e n + a s i a n t u n t i j a e l i n t ä + a s i a n t u n t i j a h e n k i l ö s t ö + a s i a n t u n t i j a h e n k i l ö s t ö l l e + a s i a n t u n t i j a h e n k i l ö s t ö n + a s i a n t u n t i j a h e n k i l ö s t ö ä + a s i a n t u n t i j a j o u k k o + a s i a n t u n t i j a j ä r j e s t ö + a s i a n t u n t i j a j ä r j e s t ö t + a s i a n t u n t i j a k e r t o m u k s e n + a s i a n t u n t i j a k e r t o m u k s e s s a + a s i a n t u n t i j a k e r t o m u s + a s i a n t u n t i j a k e s k u k s e n + a s i a n t u n t i j a k e s k u s t e l u + a s i a n t u n t i j a k e s k u s t e l u a + a s i a n t u n t i j a k e s k u s t e n + a s i a n t u n t i j a k o k o u k s e s s a + a s i a n t u n t i j a k o k o u k s e t + a s i a n t u n t i j a k o k o u k s i a + a s i a n t u n t i j a k o k o u k s i i n + a s i a n t u n t i j a k o k o u s + a s i a n t u n t i j a k o k o u s t a + a s i a n t u n t i j a k o m i t e a + a s i a n t u n t i j a k o m i t e a a + a s i a n t u n t i j a k o m i t e a a n + a s i a n t u n t i j a k o m i t e a l l e + a s i a n t u n t i j a k o m i t e a l t a + a s i a n t u n t i j a k o m i t e a n + a s i a n t u n t i j a k o m i t e a s t a + a s i a n t u n t i j a k o m i t e a t + a s i a n t u n t i j a k o m i t e o i d e n + a s i a n t u n t i j a k o m i t e o i h i n + a s i a n t u n t i j a k o m i t e o i l l e + a s i a n t u n t i j a k o m i t e o i s s a + a s i a n t u n t i j a k o m i t e o i t a + a s i a n t u n t i j a k o n f e r e n s s i + a s i a n t u n t i j a k o n f e r e n s s i s s a + a s i a n t u n t i j a k o u l u t u s t a + a s i a n t u n t i j a k u u l e m i n e n + a s i a n t u n t i j a k u u l e m i s e t + a s i a n t u n t i j a k y s y m y k s i ä + a s i a n t u n t i j a k ä y t t ä j i e n + a s i a n t u n t i j a l a b o r a t o r i o i d e n + a s i a n t u n t i j a l a i t o k s e t + a s i a n t u n t i j a l a i t o k s i a + a s i a n t u n t i j a l a i t o s t a + a s i a n t u n t i j a l a u s u n n o i l l a a n + a s i a n t u n t i j a l a u s u n n o i s s a + a s i a n t u n t i j a l a u s u n n o i s t a + a s i a n t u n t i j a l a u s u n n o n + a s i a n t u n t i j a l a u s u n n o t + a s i a n t u n t i j a l a u s u n t o + a s i a n t u n t i j a l a u s u n t o a + a s i a n t u n t i j a l a u s u n t o i h i n + a s i a n t u n t i j a l a u s u n t o j a + a s i a n t u n t i j a l a u s u n t o j e n + a s i a n t u n t i j a l a u t a k u n n a n + a s i a n t u n t i j a l ä h e t y s t ö m m e + a s i a n t u n t i j a m i e l i p i t e i d e n + a s i a n t u n t i j a m i e l i p i t e i s s ä + a s i a n t u n t i j a m i e l i p i t e i t ä + a s i a n t u n t i j a n + a s i a n t u n t i j a n e u v o i s t a + a s i a n t u n t i j a n e u v o n t a + a s i a n t u n t i j a n e u v o n t a a + a s i a n t u n t i j a n e u v o s t o + a s i a n t u n t i j a n e u v o s t o j e n + a s i a n t u n t i j a n e u v o s t o n a + a s i a n t u n t i j a o h j e l m a s s a + a s i a n t u n t i j a o r g a n i s a a t i o i d e n + a s i a n t u n t i j a o r g a n i s a a t i o t + a s i a n t u n t i j a o s a s t o + a s i a n t u n t i j a o s a s t o n + a s i a n t u n t i j a p a l v e l u i t a + a s i a n t u n t i j a p a l v e l u j e n + a s i a n t u n t i j a p a l v e l u t + a s i a n t u n t i j a p a n e e l e i t a + a s i a n t u n t i j a p a n e e l i + a s i a n t u n t i j a p a n e e l i n + a s i a n t u n t i j a p a n o k s e l l a a n + a s i a n t u n t i j a p a r l a m e n t a a r i k k o j a + a s i a n t u n t i j a p i i r e i s s ä + a s i a n t u n t i j a p o l i i t i k k o j e n + a s i a n t u n t i j a p ö r s s i + a s i a n t u n t i j a r a a d i n + a s i a n t u n t i j a r a a t i a + a s i a n t u n t i j a r a a t i i n + a s i a n t u n t i j a r a p o r t e i s t a + a s i a n t u n t i j a r a p o r t i n + a s i a n t u n t i j a r a p o r t i s s a + a s i a n t u n t i j a r a p o r t i s t a + a s i a n t u n t i j a r a p o r t t e i h i n + a s i a n t u n t i j a r a p o r t t e j a + a s i a n t u n t i j a r a p o r t t i + a s i a n t u n t i j a r a p o r t t i a + a s i a n t u n t i j a r a p o r t t i e n + a s i a n t u n t i j a r a p o r t t i i n + a s i a n t u n t i j a r y h m i e m m e + a s i a n t u n t i j a r y h m i e n + a s i a n t u n t i j a r y h m i e n s ä + a s i a n t u n t i j a r y h m i i n + a s i a n t u n t i j a r y h m i l l e + a s i a n t u n t i j a r y h m i l l ä + a s i a n t u n t i j a r y h m i s s ä + a s i a n t u n t i j a r y h m i s t ä + a s i a n t u n t i j a r y h m i ä + a s i a n t u n t i j a r y h m i ä ä n + a s i a n t u n t i j a r y h m ä + a s i a n t u n t i j a r y h m ä k i n + a s i a n t u n t i j a r y h m ä k s i + a s i a n t u n t i j a r y h m ä l l e + a s i a n t u n t i j a r y h m ä l t ä + a s i a n t u n t i j a r y h m ä n + a s i a n t u n t i j a r y h m ä n s ä + a s i a n t u n t i j a r y h m ä n ä + a s i a n t u n t i j a r y h m ä s s ä + a s i a n t u n t i j a r y h m ä s t ä + a s i a n t u n t i j a r y h m ä t + a s i a n t u n t i j a r y h m ä ä + a s i a n t u n t i j a r y h m ä ä n + a s i a n t u n t i j a r y h m ä ä n s ä + a s i a n t u n t i j a s e l o n t e k o j a + a s i a n t u n t i j a s e l o n t e o n + a s i a n t u n t i j a s e l v i t y s t ä + a s i a n t u n t i j a s e m i n a a r i n + a s i a n t u n t i j a s t a + a s i a n t u n t i j a t + a s i a n t u n t i j a t a l o u d e n + a s i a n t u n t i j a t a p a a m i s e t + a s i a n t u n t i j a t a p a a m i s i a + a s i a n t u n t i j a t a p a a m i s i i n + a s i a n t u n t i j a t a p a a m i s i s s a + a s i a n t u n t i j a t a r k k a i l i j o i t a + a s i a n t u n t i j a t a s o l l a + a s i a n t u n t i j a t a s o n + a s i a n t u n t i j a t e h t ä v ä n s ä + a s i a n t u n t i j a t i e d e m i e h e t + a s i a n t u n t i j a t i e d o n + a s i a n t u n t i j a t i e t o a + a s i a n t u n t i j a t i e t ä m y k s e l l ä + a s i a n t u n t i j a t k i n + a s i a n t u n t i j a t o i m e n p i d e + a s i a n t u n t i j a t u k e a + a s i a n t u n t i j a t u o m a r i s t o l l e + a s i a n t u n t i j a t u o m a r i t + a s i a n t u n t i j a t u t k i j o i l l e + a s i a n t u n t i j a t u t k i m u k s e n + a s i a n t u n t i j a t u t k i m u k s e s s a + a s i a n t u n t i j a t u t k i m u s t a + a s i a n t u n t i j a t y ö m m e + a s i a n t u n t i j a t y ö r y h m i i n + a s i a n t u n t i j a t y ö r y h m i ä + a s i a n t u n t i j a t y ö r y h m ä + a s i a n t u n t i j a t y ö r y h m ä n + a s i a n t u n t i j a t y ö r y h m ä t + a s i a n t u n t i j a t y ö r y h m ä ä + a s i a n t u n t i j a t y ö t ä + a s i a n t u n t i j a v a i h d o n + a s i a n t u n t i j a v a i h d o s t a + a s i a n t u n t i j a v a i h t o + a s i a n t u n t i j a v a i h t o a + a s i a n t u n t i j a v a i h t o j a + a s i a n t u n t i j a v a l i o k u n n a t + a s i a n t u n t i j a v a l i o k u n t i e m m e + a s i a n t u n t i j a v a l i o k u n t i e n + a s i a n t u n t i j a v a l t u u s k u n t a + a s i a n t u n t i j a v a l t u u s k u n t i a + a s i a n t u n t i j a v a l v o n t a + a s i a n t u n t i j a v e r k k o + a s i a n t u n t i j a v e r k k o i h i n + a s i a n t u n t i j a v e r k o s t o + a s i a n t u n t i j a v e r k o s t o j a + a s i a n t u n t i j a v e r k o s t o j e n + a s i a n t u n t i j a v e r k o s t o l l a + a s i a n t u n t i j a v e r k o s t o n + a s i a n t u n t i j a v e r k o s t o o n + a s i a n t u n t i j a v e r k o s t o s t a + a s i a n t u n t i j a v i e r a i l u j e n + a s i a n t u n t i j a v i r a n o m a i s e t + a s i a n t u n t i j a v i r a s t o + a s i a n t u n t i j a y h t e i s t y ö + a s i a n t u n t i j a y h t e i s ö ä + a s i a n t u n t i j a y k s i k k ö + a s i a n t u n t i j a y k s i k ö i d e n + a s i a n t u n t i j a y k s i k ö l l e + a s i a n t u n t i j a y r i t y k s i l l ä + a s i a n t u n t i j o i d e n + a s i a n t u n t i j o i d e n k i n + a s i a n t u n t i j o i d e n n e + a s i a n t u n t i j o i l l e + a s i a n t u n t i j o i l t a + a s i a n t u n t i j o i n a + a s i a n t u n t i j o i s t a + a s i a n t u n t i j o i t a + a s i a n t u n t i j o i t a m m e + a s i a n t u n t i j u u t t a + a s i a n t u n t i j u u t t a m m e + a s i a p a p e r e i s t a a n + a s i a p e r u s t e i n + a s i a p i t o i s u u d e s t a a n + a s i a p o h j a l l e + a s i a p o l i t i i k k a a + a s i a r a t k a i s u t + a s i a s i s ä l l ö i s s ä + a s i a s i s ä l l ö l l ä + a s i a s i s ä l l ö l t ä ä n + a s i a s i s ä l l ö n + a s i a s i s ä l l ö s t ä + a s i a s i s ä l t ö + a s i a s i s ä l t ö j ä + a s i a s i s ä l t ö ä + a s i a s i s ä l t ö ö n + a s i a s s a + a s i a s t a + a s i a s y i t ä + a s i a t + a s i a t i e d o i s t a + a s i a t i e d o t + a s i a t i e t o a + a s i a t i e t o j a + a s i a t i e t o j e n + a s i a t i e t o o n + a s i a t i e t o u t t a + a s i a t i e t ä m y k s e n + a s i a t t o m a k s i + a s i a t t o m a l l e + a s i a t u n t e m u k s e s s a + a s i a t u n t i j a r y h m i ä + a s i a t ä s m e n n y s + a s i a v a l i k o i m a s t a + a s i a v a s t a u s t a + a s i a v i r h e + a s i a v i r h e e n + a s i a v i r h e e t + a s i a v i r h e i d e n + a s i a v i r h e i s t ä + a s i a v i r h e i t ä + a s i a v i r h e t t ä + a s i a v ä i t t ä m ä n ä + a s i a y h t e y d e s s ä + a s i a y h t e y d e t + a s i a y h t e y k s i ä + a s i a y h t e y s + a s i a y h t e y t e e n + a s i a y h t e y t e e n s ä + a s i o i d e n + a s i o i h i n + a s i o i h i n s a + a s i o i k s i + a s i o i l l a + a s i o i l l e + a s i o i n a + a s i o i n t i j ä r j e s t e l m ä + a s i o i n t i p i s t e e n + a s i o i n t i p i s t e e t + a s i o i n t i p i s t e i d e n + a s i o i n t i p i s t e i s s ä + a s i o i n t i p i s t e i s t ä + a s i o i n t i p i s t e i t ä + a s i o i s s a + a s i o i s s a h a n + a s i o i s t a + a s i o i s t a a n + a s i o i s t a m m e + a s i o i t a + a s i o i t a h a n + a s i o i t a m m e + a s k a r r u t t a a + a s k a r r u t t a n u t + a s k a r r u t t a v a + a s k e l e e l t a + a s k e l e e n + a s k e l e e n a + a s k e l e e s e e n + a s k e l e e s t a + a s k e l e e t + a s k e l e i t a + a s k e l e n + a s k e l i a + a s k e l i n + a s k e l i s t a + a s k e l m o o t t o r i + a s k e l t a + a s k e l t a k a a n + a s k e l t e n + a s k i n + a s k i v u o s i + a s o v a n m e r e e n + a s o v a n m e r e l l ä + a s o v a n m e r e n + a s o v a n m e r i + a s p a r t a a m i n + a s p i s k y y + a s s a m i l a i s e t + a s s a m i n n a k k e l i + a s s a m i n p e n s a s v i i r i ä i n e n + a s s a m i n u u n i l i n t u + a s s i m i l a a t i o p e r i a a t t e e n + a s s o s i a a t i o a l u e + a s s o s i a a t i o h a n k e t t a + a s s o s i a a t i o j ä r j e s t e l m ä n + a s s o s i a a t i o j ä r j e s t e l m ä ä + a s s o s i a a t i o k o m i t e a + a s s o s i a a t i o k o m i t e a a n + a s s o s i a a t i o k o m i t e a n + a s s o s i a a t i o k o m i t e a s s a + a s s o s i a a t i o k o m i t e a s t a + a s s o s i a a t i o k u m p p a n u u d e n + a s s o s i a a t i o k u m p p a n u u t t a + a s s o s i a a t i o m a h d o l l i s u u d e n + a s s o s i a a t i o m a i d e n + a s s o s i a a t i o m a i h i n + a s s o s i a a t i o m e n e t t e l y + a s s o s i a a t i o m u o d o s t a + a s s o s i a a t i o n e u v o s t o + a s s o s i a a t i o n e u v o s t o a + a s s o s i a a t i o n e u v o s t o i h i n + a s s o s i a a t i o n e u v o s t o i s s a + a s s o s i a a t i o n e u v o s t o j e n + a s s o s i a a t i o n e u v o s t o l l e + a s s o s i a a t i o n e u v o s t o n + a s s o s i a a t i o n e u v o s t o o n + a s s o s i a a t i o n e u v o s t o s s a + a s s o s i a a t i o n e u v o s t o s t a + a s s o s i a a t i o n e u v o t t e l u i l l a m m e + a s s o s i a a t i o n e u v o t t e l u j a + a s s o s i a a t i o n e u v o t t e l u t + a s s o s i a a t i o o n + a s s o s i a a t i o p e r i a a t t e e s e e n + a s s o s i a a t i o p o l i t i i k k a + a s s o s i a a t i o p o l i t i i k k a a + a s s o s i a a t i o p r o s e s s i + a s s o s i a a t i o p r o s e s s i a + a s s o s i a a t i o p r o s e s s i i n + a s s o s i a a t i o p r o s e s s i l l a + a s s o s i a a t i o p r o s e s s i l l e + a s s o s i a a t i o p r o s e s s i n + a s s o s i a a t i o p r o s e s s i s s a + a s s o s i a a t i o p r o s e s s i s t a + a s s o s i a a t i o p ä ä t ö s + a s s o s i a a t i o s o p i m u k s e e n + a s s o s i a a t i o s o p i m u k s e k s i + a s s o s i a a t i o s o p i m u k s e l l a + a s s o s i a a t i o s o p i m u k s e l l e + a s s o s i a a t i o s o p i m u k s e m m e + a s s o s i a a t i o s o p i m u k s e n + a s s o s i a a t i o s o p i m u k s e n s a + a s s o s i a a t i o s o p i m u k s e s s a + a s s o s i a a t i o s o p i m u k s e s s a a n + a s s o s i a a t i o s o p i m u k s e s s a m m e + a s s o s i a a t i o s o p i m u k s e s t a + a s s o s i a a t i o s o p i m u k s e t + a s s o s i a a t i o s o p i m u k s i a + a s s o s i a a t i o s o p i m u k s i e n + a s s o s i a a t i o s o p i m u k s i i n + a s s o s i a a t i o s o p i m u k s i k s i + a s s o s i a a t i o s o p i m u k s i l l a + a s s o s i a a t i o s o p i m u k s i l l e + a s s o s i a a t i o s o p i m u k s i n + a s s o s i a a t i o s o p i m u k s i n a + a s s o s i a a t i o s o p i m u k s i s s a + a s s o s i a a t i o s o p i m u k s i s s a m m e + a s s o s i a a t i o s o p i m u k s i s t a + a s s o s i a a t i o s o p i m u s + a s s o s i a a t i o s o p i m u s a s e m a n + a s s o s i a a t i o s o p i m u s l u o n n o k s e s t a + a s s o s i a a t i o s o p i m u s l u o n n o s t a + a s s o s i a a t i o s o p i m u s n e u v o t t e l u j a + a s s o s i a a t i o s o p i m u s n e u v o t t e l u j e n + a s s o s i a a t i o s o p i m u s n e u v o t t e l u t + a s s o s i a a t i o s o p i m u s t a + a s s o s i a a t i o s o p i m u s t a m m e + a s s o s i a a t i o s o p i m u s t e n + a s s o s i a a t i o s o p i m u s v a i h e e s e e n + a s s o s i a a t i o s o p i m u s v e r k o s t o n + a s s o s i a a t i o s t a + a s s o s i a a t i o t a + a s s o s i a a t i o t o i m i s s a + a s s o s i o i n t i j ä r j e s t e l y + a s s o s i o i n t i k o m i t e o i s s a + a s s o s i o i n t i m a i d e n + a s s o s i o i n t i n e u v o s t o + a s s o s i o i n t i n e u v o s t o j e n + a s s o s i o i n t i n e u v o s t o n + a s s o s i o i n t i n e u v o s t o o n + a s s o s i o i n t i n e u v o s t o s s a + a s s o s i o i n t i n e u v o s t o t + a s s o s i o i n t i n e u v o t t e l u j e n + a s s o s i o i n t i p r o s e s s i a + a s s o s i o i n t i p r o s e s s i n + a s s o s i o i n t i s o p i m u k s e l l e + a s s o s i o i n t i s o p i m u k s e n + a s s o s i o i n t i s o p i m u k s e s s a + a s s o s i o i n t i s o p i m u k s e s t a + a s s o s i o i n t i s o p i m u k s e t + a s s o s i o i n t i s o p i m u k s i a + a s s o s i o i n t i s o p i m u k s i i n + a s s o s i o i n t i s o p i m u k s i s s a + a s s o s i o i n t i s o p i m u k s i s t a + a s s o s i o i n t i s o p i m u s + a s s o s i o i n t i s o p i m u s n e u v o t t e l u j a + a s s o s i o i n t i s o p i m u s n e u v o t t e l u j e n + a s s o s i o i n t i s o p i m u s t a + a s s o s i o i n t i s o p i m u s t e n + a s s o s i o i n t i v u o r o p u h e l u a + a s s o s i o i t u m a t t o m i e n + a s s o s i o i t u m i s s o p i m u s + a s s o s i o i t u m i s s t r a t e g i a n + a s s o s i o i t u n e e t + a s s o s i o i t u n e i d e n + a s s o s i o i t u n e i l l e + a s s o s i o i t u n e i s s a + a s s o s i o i t u n e i t a + a s s o s i o i t u n u t + a s s o s i o i t u n u t t a + a s s o s i o i t u u + a s s y r i a l a i s e n + a s s y r i a l a i s e t + a s s y r i a l a i s k r i s t i t y t + a s s y r i a l a i s k y l i ä + a s s y r i a l a i s v ä h e m m i s t ö + a s s y r i a l a i s v ä h e m m i s t ö n + a s s y r i a l a i s v ä h e m m i s t ö ö n + a s s y r i a l a i s y h t e i s ö + a s s y r i a l a i s y h t e i s ö ä + a s s y r i a l a i s y h t e i s ö ö n + a s t e e k k i n ä r h i + a s t e e k k i r a s t a s + a s t e e k k i v a l t a k u n n a n v a l l o i t u s + a s t e e k k i v a l t a k u n t a + a s t e e l l a + a s t e e l t a + a s t e e n + a s t e e s e e n + a s t e e s t a + a s t e i k k o s ä ä s t ö j ä + a s t e i k o n + a s t e i n + a s t e i s t a + a s t e i t t a i s e e n + a s t e i t t a i s e k s i + a s t e i t t a i s e m p i + a s t e i t t a i s e n + a s t e i t t a i s e s s a + a s t e i t t a i s e s t a + a s t e i t t a i s i a + a s t e i t t a i s t a + a s t e i t t a i s u u d e n + a s t e r i k k i + a s t e r i s k i t a r k i s t u k s e n + a s t e r i s k i t a r k i s t u k s e s s a + a s t e r i s k i t a r k i s t u s + a s t e r i s k i t a r k i s t u s t a + a s t e r o i d e i s t a + a s t e r o i d i l u o k a t + a s t e r o i d i r y h m ä + a s t e r o i d i v y ö h y k e + a s t e t t a + a s t e v a i h t e l u + a s t i a a n + a s t i a n k u i v a u s k a a p p i + a s t i a n p e s u a i n e + a s t i a n p e s u a i n e i s i i n s a + a s t i a n p e s u a i n e t t a + a s t i a n p e s u t a b l e t t i e n + a s t i n k i v i ä + a s t i n l a u d a l t a + a s t i n l a u t a + a s t i n l a u t a n a + a s t m a k o h t a u k s e n + a s t m a k o h t a u k s e t + a s t m a k o h t a u k s i s t a + a s t m a k o h t a u s t a + a s t m a l a i t t e e n + a s t m a p o t i l a i d e n + a s t m a s t a + a s t m a s u m u t e t t a + a s t m a s u m u t t e e n + a s t m a s u m u t t e e t + a s t r o n a u t i k s i + a s t r o n a u t i t + a s t r o n a u t t i j o u k o t + a s t u a + a s t u i + a s t u m a t t a + a s t u n e e t + a s t u u + a s u e s s a a n + a s u i n + a s u i n a l u e + a s u i n a l u e e l l a + a s u i n a l u e e l l a a n + a s u i n a l u e e l l e e n + a s u i n a l u e e n + a s u i n a l u e e n s a + a s u i n a l u e e t + a s u i n a l u e i d e n + a s u i n a l u e i d e n s a + a s u i n a l u e i l l a + a s u i n a l u e i l l e + a s u i n a l u e i l t a a n + a s u i n a l u e i s i i n + a s u i n a l u e i s t a + a s u i n a l u e i t a + a s u i n a l u e t a s o l l e + a s u i n a l u e t t a + a s u i n a l u e t t a a n + a s u i n j ä s e n v a l t i o n + a s u i n j ä s e n v a l t i o s s a a n + a s u i n k e r r o s t a l o j e n + a s u i n k e s k u s t e n + a s u i n k i i n t e i s t ö ä + a s u i n k o r t t e l i n + a s u i n k u n n a s s a n i + a s u i n l a i t o k s i i n + a s u i n l a i t o k s i s s a + a s u i n m a a + a s u i n m a a h a n + a s u i n m a a h a n s a + a s u i n m a a n + a s u i n m a a n s a + a s u i n m a a s s a + a s u i n m a a s s a a n + a s u i n m a a s t a + a s u i n m a a s t a a n + a s u i n o l o i h i n + a s u i n o l o i h i n s a + a s u i n o l o i s s a + a s u i n o l o j e n + a s u i n o l o n s a + a s u i n o l o s u h t e i s i i n + a s u i n o l o t + a s u i n p a i k a l l a + a s u i n p a i k a l l a a n + a s u i n p a i k a n + a s u i n p a i k a s s a + a s u i n p a i k a s s a a n + a s u i n p a i k a s t a + a s u i n p a i k a s t a a n + a s u i n p a i k a s t a a n k i n + a s u i n p a i k k a + a s u i n p a i k k a a + a s u i n p a i k k a a n + a s u i n p a i k k a a n i + a s u i n p a i k k a a n s a + a s u i n p a i k k a j ä s e n v a l t i o n + a s u i n p a i k k a k r i t e e r i ä + a s u i n p a i k k a k u n n a l l a a n + a s u i n p a i k k a n a + a s u i n p a i k k a n s a + a s u i n p a i k k a p e r i a a t t e e s e e n + a s u i n p a i k k o j a + a s u i n p a i k o i l l e e n + a s u i n p a l v e l u t + a s u i n r a k e n n u k s e t + a s u i n r a k e n n u k s i a + a s u i n r a k e n n u k s i e n + a s u i n r a k e n n u k s i i n + a s u i n r a k e n n u k s i s s a + a s u i n r a k e n n u s t e n + a s u i n s a a r e l l a n i + a s u i n s e u d u i l t a a n + a s u i n s e u d u l l e e n + a s u i n s i j o i l l e e n + a s u i n s i j o i l t a a n + a s u i n t a l o i l l e + a s u i n t a l o j e n + a s u i n t i l o j e n + a s u i n v a l t i o + a s u i n v a l t i o i h i n s a + a s u i n v a l t i o i s s a a n + a s u i n v a l t i o l l e e n + a s u i n v a l t i o n + a s u i n v a l t i o n s a + a s u i n v a l t i o s s a + a s u i n v a l t i o s s a a n + a s u i n v a l t i o s t a a n + a s u i n y h d y s k u n t a o h j e l m a + a s u i n y h t e i s ö k e s k u k s e n + a s u i n y h t e i s ö ä ä n + a s u i n y m p ä r i s t ö + a s u i n y m p ä r i s t ö n + a s u i n y m p ä r i s t ö t + a s u i s i + a s u i v a t p a + a s u k a s a s i a n t u n t i j a m m e + a s u k a s k o h t a i n e n + a s u k a s k o h t a i s e n + a s u k a s k o h t a i s e s t a + a s u k a s k o h t a i s e t + a s u k a s k o h t a i s i i n + a s u k a s k o h t a i s t a + a s u k a s k o h t a i s t e n + a s u k a s l u k u + a s u k a s l u k u a + a s u k a s l u k u u n + a s u k a s l u v u n + a s u k a s m ä ä r ä n + a s u k a s m ä ä r ä s t ä + a s u k a s m ä ä r ä ä n + a s u k a s m ä ä r ä ä n s ä + a s u k a s t a + a s u k a s t i h e y d e n + a s u k a s t i h e y s + a s u k a s t i h e y t t ä + a s u k a s v a s t i n e l u k u + a s u k a s y h d i s t y k s e t + a s u k a s y h d i s t y s + a s u k k a a n + a s u k k a a n a + a s u k k a a s t a + a s u k k a a t + a s u k k a i d e n + a s u k k a i d e n k i n + a s u k k a i d e n s a + a s u k k a i l l a + a s u k k a i l l e + a s u k k a i l t a a n + a s u k k a i s i i n + a s u k k a i s t a + a s u k k a i t a + a s u m a a n + a s u m a l ä h i ö i d e n + a s u m a l ä h i ö i s s ä + a s u m i s a i k a a + a s u m i s a s i a + a s u m i s a s i o i s s a + a s u m i s e e n + a s u m i s e n + a s u m i s h a n k k e i d e n + a s u m i s k e l p o i s e m m a n + a s u m i s k e l p o i s e m p i + a s u m i s k u l u t + a s u m i s k u s t a n n u k s e t + a s u m i s k u s t a n n u k s i a + a s u m i s k u s t a n n u k s i s s a + a s u m i s k u s t a n n u k s i s t a + a s u m i s k u s t a n n u s t e n + a s u m i s k y s e l y i s t ä + a s u m i s k y s e l y i t ä + a s u m i s k y s e l y t + a s u m i s m e n o i h i n + a s u m i s m u k a v u u d e n + a s u m i s o h j e l m i i n + a s u m i s o l o i h i n + a s u m i s o l o j e n + a s u m i s o l o t + a s u m i s o n g e l m i a + a s u m i s p o l i t i i k a n + a s u m i s p o l i t i i k a t + a s u m i s p o l i t i i k k a a + a s u m i s p o l i t i i k k a a n + a s u m i s t a r k o i t u k s i i n + a s u m i s t a r p e i s i i n + a s u m i s t i e t o j e n + a s u m i s t i l a n n e t t a + a s u m i s t i l a n t e e s e e n + a s u m i s t o d i s t u k s e t + a s u m i s t u k e a + a s u m i s t u k e e n + a s u m i s t u k i a + a s u m i s v e r o a a n + a s u m m e + a s u m u s e r o + a s u m u s e r o a + a s u n e i l l e + a s u n n o i s s a + a s u n n o i s t a + a s u n n o l l e e n + a s u n n o n o m i s t a j i l l e + a s u n n o n o s t a j i a + a s u n n o n s a a n n i n + a s u n n o t t o m u u d e n + a s u n p a i k a n + a s u n t o a + a s u n t o a a n + a s u n t o a l a a + a s u n t o a l a l l a + a s u n t o a l a s t a + a s u n t o a l u e + a s u n t o a l u e e n + a s u n t o a l u e e t + a s u n t o a l u e i d e n + a s u n t o a l u e i l l a + a s u n t o a l u e i l l e + a s u n t o a l u e i s t a + a s u n t o a l u e i t a + a s u n t o a s i o i t a + a s u n t o a u t o i l l a + a s u n t o f o o r u m i + a s u n t o h a n k k e e t + a s u n t o h a n k k e i t a + a s u n t o i h i n + a s u n t o j a + a s u n t o j a a n + a s u n t o j e n + a s u n t o j e n s a + a s u n t o k a n n a n + a s u n t o k a n n a s t a + a s u n t o k a n t a a + a s u n t o k a n t a m m e + a s u n t o k r i i s e i s t ä + a s u n t o k r i i s i i m m e + a s u n t o k r i i s i n + a s u n t o k r i i s i ä + a s u n t o k u p l a t + a s u n t o k y s y m y s t e n + a s u n t o l a i n a + a s u n t o l a i n a k r i i s i + a s u n t o l a i n a k r i i s i n + a s u n t o l a i n a m a r k k i n a t + a s u n t o l a i n a m a r k k i n o i d e n + a s u n t o l a i n a m a r k k i n o i l l a + a s u n t o l a i n a m a r k k i n o i s t a + a s u n t o l a i n a n o t t o a + a s u n t o l a i n a n v ä l i t t ä j i ä + a s u n t o l a i n a s o p i m u k s e n + a s u n t o l a i n a t + a s u n t o l a i n a t i e t o j a + a s u n t o l a i n a t u o t t e i t a + a s u n t o l a i n o i h i n + a s u n t o l a i n o j a + a s u n t o l a i n o j e n + a s u n t o l a l a i t o k s e t + a s u n t o l i i t ä n n ö i s s ä + a s u n t o l o i s s a + a s u n t o l u o t o i s t a + a s u n t o l u o t o n + a s u n t o l u o t o t + a s u n t o l u o t t o + a s u n t o l u o t t o j a + a s u n t o l u o t t o j e n + a s u n t o l u o t t o j ä r j e s t e l m ä ä + a s u n t o l u o t t o k a n n a n + a s u n t o l u o t t o k r i i s i s t ä + a s u n t o l u o t t o m a l l i a + a s u n t o l u o t t o m a r k k i n a n s a + a s u n t o l u o t t o m a r k k i n a t + a s u n t o l u o t t o m a r k k i n o i d e n + a s u n t o l u o t t o m a r k k i n o i l l a + a s u n t o l u o t t o m a r k k i n o i l t a + a s u n t o l u o t t o m a r k k i n o i t a + a s u n t o l u o t t o p o o l e j a + a s u n t o l u o t t o t a p p i o i s t a + a s u n t o l u o t t o t o i m i n t a + a s u n t o l u o t t o t u o t t e i t a + a s u n t o l u o t t o t u o t t e i t a a n + a s u n t o m a r k k i n a k u p l i i n + a s u n t o m a r k k i n a t + a s u n t o m a r k k i n o i d e n + a s u n t o m a r k k i n o i l l a + a s u n t o m a r k k i n o i t a + a s u n t o m i n i s t e r i + a s u n t o m u r t o j a + a s u n t o p a l v e l u i s s a + a s u n t o p o l i i t t i s i l l e + a s u n t o p o l i t i i k a n + a s u n t o p o l i t i i k a s s a + a s u n t o p o l i t i i k a s t a + a s u n t o p o l i t i i k k a + a s u n t o p o l i t i i k k a a + a s u n t o p u l a + a s u n t o p u l a n + a s u n t o r a k e n t a m i s e e n + a s u n t o r a k e n t a m i s e n + a s u n t o r a k e n t a m i s e s s a + a s u n t o r a k e n t a m i s e s t a + a s u n t o r a k e n t a m i s k ä y t t ö ö n + a s u n t o s e k t o r e i l l a + a s u n t o s e k t o r i i n + a s u n t o s e k t o r i l l a + a s u n t o s e k t o r i l l e + a s u n t o s e k t o r i n + a s u n t o t a r j o n n a n + a s u n t o t i l a n n e + a s u n t o t i l a n n e t t a + a s u n t o t i l a n t e e n + a s u n t o t o i m i n t a a + a s u n t o t u o t a n t o o n + a s u n t o v a u n u i l l e + a s u n t o v a u n u i s t a + a s u n t o v e l k o j e n + a s u n t o y h t i ö i t ä + a s u n t o y h t i ö i t ä ä n + a s u n u t + a s u t e t t a v a + a s u t e t t u j e n + a s u t t a m a a + a s u t t a m i e n + a s u t t a m i s e e n + a s u t t a m i s h a n k k e i t a + a s u t t a m i s o h j e l m i e n + a s u t t a m i s p o l i t i i k k a + a s u t t a m i s p o l i t i i k k a a n s a + a s u t t a m i s p r o s e s s i n + a s u t t u j a + a s u t t u j e n + a s u t u i l l a + a s u t u i s t a + a s u t u k s e n + a s u t u k s e s t a + a s u t u s a l u e i d e n + a s u t u s a l u e i l l a + a s u t u s a l u e i l l e + a s u t u s a l u e i l t a + a s u t u s a l u e i t a + a s u t u s h a n k k e i t a + a s u t u s j ä t t e i d e n + a s u t u s k e s k u k s i a + a s u t u s k e s k u k s i s s a + a s u t u s k e s k u k s i s t a + a s u t u s k e s k u s + a s u t u s k e s k u s t a i s t e l u + a s u t u s k e s k u s t e n + a s u t u s o h j e l m i a + a s u t u s p o l i t i i k a n + a s u t u s p o l i t i i k a s t a + a s u t u s p o l i t i i k k a + a s u t u s p o l i t i i k k a a + a s u t u s p o l i t i i k k a a n s a + a s u t u s s a + a s u t u s t a + a s u t u s t i h e y s + a s u t u t + a s u u k i n + a s u u k o + a s u v a a + a s u v a a n + a s u v a l l a + a s u v a n + a s u v a n a + a s u v a s t a + a s u v a t + a s u v a t k o + a s u v i a + a s u v i e n + a s u v i i n + a s u v i l l a + a s u v i l l e + a s u v i s t a + a s y m p t o o t t i h a a r a + a t e i s t e i l l a k i n + a t e i s t e j a + a t e i s t i t + a t e r i a n + a t e r i a p a l v e l u + a t e r i a p a l v e l u a l a l l a + a t e r i a p a l v e l u a l a n + a t e r i a p a l v e l u i d e n + a t e r i a p a l v e l u i h i n + a t e r i a p a l v e l u i t a + a t e r i a p a l v e l u j e n + a t e r i a t e o l l i s u u d e n + a t e r i a v a l i n n a s t a + a t l a k s e n v i h e r t i k k a + a t l a s k a r h u + a t l a s k e h r ä ä j ä + a t l a s k e r t t u + a t l a s s e t r i + a t l a s v u o r e t + a t o m i a b s o r p t i o s p e k t r o m e t r i + a t o m i a l a a + a t o m i a s e e t + a t o m i a s e i d e n + a t o m i a s e i t a + a t o m i a s e m a + a t o m i a s e t t a + a t o m i e n e r g i a + a t o m i e n e r g i a a + a t o m i e n e r g i a a n + a t o m i e n e r g i a j ä r j e s t ö + a t o m i e n e r g i a j ä r j e s t ö h ä n + a t o m i e n e r g i a j ä r j e s t ö l l e + a t o m i e n e r g i a j ä r j e s t ö l l ä + a t o m i e n e r g i a j ä r j e s t ö l t ä + a t o m i e n e r g i a j ä r j e s t ö n + a t o m i e n e r g i a j ä r j e s t ö s s ä + a t o m i e n e r g i a j ä r j e s t ö ä + a t o m i e n e r g i a j ä r j e s t ö ö n + a t o m i e n e r g i a k e h i t y s j ä r j e s t ö n + a t o m i e n e r g i a k o m i s s i o + a t o m i e n e r g i a k o m i s s i o n + a t o m i e n e r g i a l l e + a t o m i e n e r g i a n + a t o m i e n e r g i a s t a + a t o m i e n e r g i a t e o l l i s u u t t a + a t o m i e n e r g i a v i r a n o m a i s e n + a t o m i e n e r g i a v i r a n o m a i s i l l e + a t o m i e n e r g i a v i r a s t o + a t o m i e n e r g i a v i r a s t o a + a t o m i e n e r g i a v i r a s t o n + a t o m i e n e r g i a y h t e i s ö + a t o m i e n e r g i a y h t e i s ö n + a t o m i e n e r g i a y h t e i s ö n ä + a t o m i e n e r g i a y h t e i s ö s s ä + a t o m i f y s i i k k a + a t o m i j ä t t e e n k ä s i t t e l y n + a t o m i k a l l o + a t o m i k e l l o + a t o m i k y s y m y k s i ä + a t o m i l a u s e + a t o m i m a l l i + a t o m i m a s s a + a t o m i m a s s a y k s i k k ö + a t o m i n o r m e j a + a t o m i o h j e l m a a + a t o m i o r b i t a a l i + a t o m i p o l i t i i k k a n s a + a t o m i p o m m e i s t a + a t o m i p o m m e j a + a t o m i p o m m i + a t o m i p o m m i a + a t o m i p o m m i i n + a t o m i p o m m i n + a t o m i p o m m i n a + a t o m i p o m m i t + a t o m i s e m i o t i i k k a + a t o m i s ä d e + a t o m i s ä h k ö n + a t o m i s ä t e i l y ä + a t o m i t e o l l i s u u d e s t a + a t o m i t e o l l i s u u t t a + a t o m i t e o r i a + a t o m i t u r v a l l i s u u t t a + a t o m i v o i m a + a t o m i v o i m a a n + a t o m i v o i m a l a + a t o m i v o i m a l l a + a t o m i v o i m a l o b b a u k s e n + a t o m i v o i m a l o i d e n + a t o m i v o i m a m i k r o s k o o p p i + a t o m i v o i m a o h j e l m a s t a a n + a t o m i y d i n + a t s o v ä r e i l l e + a t s o v ä r e i l t ä + a t s o v ä r e i s t ä + a t s o v ä r i a i n e e t + a t s o v ä r i a i n e i d e n + a t s o v ä r i a i n e i k s i + a t s o v ä r i a i n e i l l a + a t s o v ä r i a i n e i l t a + a t s o v ä r i a i n e i t a + a t s o v ä r i e n + a t s o v ä r i t + a t t e n t a a t i t + a t t e n t a a t t i e n + a t t r i b u u t t i k i e l i o p p i + a t u l a p y r s t ö k o l i b r i + a u d i o k o n f e r e n s s e j a + a u d i o v i s u a a l i a l a a + a u d i o v i s u a a l i a l a a n + a u d i o v i s u a a l i a l a l l a + a u d i o v i s u a a l i a l a l l e + a u d i o v i s u a a l i a l a n + a u d i o v i s u a a l i a l a s t a + a u d i o v i s u a a l i a l o i l l a + a u d i o v i s u a a l i m a r k k i n o i l l a + a u d i o v i s u a a l i n e n + a u d i o v i s u a a l i p a l v e l u i s t a + a u d i o v i s u a a l i p a l v e l u j a + a u d i o v i s u a a l i p a l v e l u j e n + a u d i o v i s u a a l i p a l v e l u t + a u d i o v i s u a a l i p o l i t i i k a l l a + a u d i o v i s u a a l i p o l i t i i k a l l e + a u d i o v i s u a a l i p o l i t i i k a n + a u d i o v i s u a a l i p o l i t i i k a s t a + a u d i o v i s u a a l i p o l i t i i k k a a + a u d i o v i s u a a l i p o l i t i i k k o j a + a u d i o v i s u a a l i s e e n + a u d i o v i s u a a l i s e l l e + a u d i o v i s u a a l i s e n + a u d i o v i s u a a l i s e s s a + a u d i o v i s u a a l i s e s t a + a u d i o v i s u a a l i s e t + a u d i o v i s u a a l i s i a + a u d i o v i s u a a l i s i i n + a u d i o v i s u a a l i s i l l a + a u d i o v i s u a a l i s i l l e + a u d i o v i s u a a l i s i s s a + a u d i o v i s u a a l i s i s t a + a u d i o v i s u a a l i s t a + a u d i o v i s u a a l i s t e n + a u d i o v i s u a a l i t e o s t e n + a u d i t o i n t i a + a u d i t o i n t i j ä r j e s t e l m ä + a u d i t o i n t i j ä r j e s t e l m ä m a l l i n + a u d i t o i n t i j ä r j e s t e l m ä n + a u d i t o i n t i j ä r j e s t e l m ä s t ä + a u d i t o i n t i j ä r j e s t e l m ä ä + a u d i t o i n t i j ä r j e s t e l m ä ä n + a u d i t o i n t i o h j e l m a + a u k a i s t u + a u k e a i s i v a t + a u k i o l l a + a u k i o l l e + a u k i o l o a + a u k i o l o a i k a a + a u k i o l o a i k a a n + a u k i o l o a i k o i h i n + a u k i o l o a i k o j a + a u k i o l o a j a t + a u k i o l o a j o i s t a + a u k i o l o a s i o i s t a + a u k i o n + a u k k o a + a u k k o a u t o m a t i i k k a + a u k k o j a + a u k k o j e n + a u k k o k o h t i a + a u k k o l i i t o s + a u k k o o n + a u k k o s u h d e + a u k o i s t a + a u k o n + a u k o t + a u k o t t o m a m m a k s i + a u k o t t o m i a + a u k t o r i t e e t t i a + a u k t o r i t e e t t i a s e m a s s a + a u k t o r i t e e t t i o n g e l m a + a u k t o r i t e e t t i s ä ä d ö k s i ä + a u l a k u o r m a a j a + a u l a s s a + a u l i i m m i n + a u l i i m p i a + a u n u k s e n k a r j a l a n + a u r a j o k i + a u r a n k u k k a + a u r i n g o n + a u r i n g o n h a t t u v a l m i s t e t t a + a u r i n g o n k u k k a + a u r i n g o n k u k k a g a l a k s i + a u r i n g o n k u k k a r o u h e e l l a + a u r i n g o n k u k k a ö l j y + a u r i n g o n k u k k a ö l j y n + a u r i n g o n k u k k a ö l j y y n + a u r i n g o n k u k k a ö l j y ä + a u r i n g o n o t t o + a u r i n g o n p a i s t e d i r e k t i i v i l l ä + a u r i n g o n p a i s t e d i r e k t i i v i n + a u r i n g o n p a i s t e d i r e k t i i v i s t ä + a u r i n g o n p a i s t e e n + a u r i n g o n p a i s t e e s s a + a u r i n g o n p a i s t e p o l i t i i k a n + a u r i n g o n p a i s t e p o l i t i i k k a + a u r i n g o n p a i s t e p o l i t i i k k a a + a u r i n g o n p a i s t e p o l i t i i k k a a n + a u r i n g o n p a i s t e p o l i t i i k k a m m e + a u r i n g o n p a l v o n t a + a u r i n g o n p i l a r i + a u r i n g o n p i m e n n y s + a u r i n g o n p i s t o k s e s t a + a u r i n g o n p i s t o s + a u r i n g o n s ä t e e t + a u r i n g o n s ä t e i l y + a u r i n g o n s ä t e i l y l l e + a u r i n g o n s ä t e i l y y n + a u r i n g o n v a l o + a u r i n g o n v a l o d i r e k t i i v i ä + a u r i n g o n v a r j o j a + a u r i n g o s s a + a u r i n k o a + a u r i n k o a r k k i t e h t u u r i + a u r i n k o a u t o + a u r i n k o e n e r g i a + a u r i n k o e n e r g i a a + a u r i n k o e n e r g i a a n + a u r i n k o e n e r g i a h a n k k e e t + a u r i n k o e n e r g i a j ä r j e s t e l m i i n + a u r i n k o e n e r g i a j ä r j e s t e l m ä n + a u r i n k o e n e r g i a j ä r j e s t e l m ä ä + a u r i n k o e n e r g i a k ä y t t ö i s i i n + a u r i n k o e n e r g i a l l a + a u r i n k o e n e r g i a m m e + a u r i n k o e n e r g i a n + a u r i n k o e n e r g i a o h j e l m a + a u r i n k o e n e r g i a o h j e l m a a + a u r i n k o e n e r g i a o s a s t o + a u r i n k o e n e r g i a o s a s t o o n + a u r i n k o e n e r g i a s t a + a u r i n k o e n e r g i a s u u n n i t e l m a + a u r i n k o e n e r g i a s u u n n i t e l m a a + a u r i n k o e n e r g i a t e k n i i k k a + a u r i n k o e n e r g i a t o r n i + a u r i n k o j ä ä h d y t y s + a u r i n k o k a l e n t e r i + a u r i n k o k a u p u n k i + a u r i n k o k e i t i n + a u r i n k o k e n n o + a u r i n k o k e n n o j a + a u r i n k o k e n n o j e n + a u r i n k o k e n n o j ä r j e s t e l m i i n + a u r i n k o k e n n o t + a u r i n k o k e n n o t e h t a i s i i n + a u r i n k o k e r a t o o s i + a u r i n k o k e r ä i n + a u r i n k o k e r ä ä j i e n + a u r i n k o k e r ä ä j i i n + a u r i n k o k i r j o a h v e n + a u r i n k o k u i v a t u l l e + a u r i n k o k u i v a u k s e n + a u r i n k o k u n i n g a s + a u r i n k o k u n i n k a a n + a u r i n k o k u n i n k a a t + a u r i n k o k u n n a s s a m m e + a u r i n k o k u n t a + a u r i n k o l ä m m i t y s + a u r i n k o l ä m m ö n + a u r i n k o l ä m m ö s s ä + a u r i n k o l ä m p ö e n e r g i a a n + a u r i n k o l ä m p ö e n e r g i a n + a u r i n k o l ä m p ö s o v e l l u k s i i n + a u r i n k o l ä m p ö s ä h k ö + a u r i n k o l ä m p ö s ä h k ö a l a + a u r i n k o l ä m p ö s ä h k ö t e k n i i k k a a + a u r i n k o l ä m p ö s ä h k ö ä + a u r i n k o l ä m p ö t e k n i i k a n + a u r i n k o l ä m p ö t u o t t e i d e n + a u r i n k o l ä m p ö v o i m a a + a u r i n k o l ä m p ö v o i m a a n + a u r i n k o l ä m p ö v o i m a l o i h i n + a u r i n k o l ä m p ö ä + a u r i n k o m o d u u l i t + a u r i n k o m y r s k y + a u r i n k o p a n e e l e i h i n + a u r i n k o p a n e e l e i l l a + a u r i n k o p a n e e l e i l l e + a u r i n k o p a n e e l e i s s a + a u r i n k o p a n e e l e i s t a + a u r i n k o p a n e e l e i t a + a u r i n k o p a n e e l e j a + a u r i n k o p a n e e l i e n + a u r i n k o p a n e e l i l l a + a u r i n k o p a n e e l i n + a u r i n k o p a n e e l i t + a u r i n k o p a r i s t o j e n + a u r i n k o p r o j e k t e j a + a u r i n k o p u r j e + a u r i n k o p y ö r ä + a u r i n k o r a n n i k o l l a + a u r i n k o r a n t o j a + a u r i n k o s o i h t u p u u + a u r i n k o s o l u i h i n + a u r i n k o s u o j a a + a u r i n k o s u o j a t u o t t e i s s a + a u r i n k o s u u n n i t e l m a + a u r i n k o s u u n n i t e l m a a + a u r i n k o s u u n n i t e l m a n + a u r i n k o s y n k r o n i n e n + a u r i n k o s ä h k ö + a u r i n k o s ä h k ö j ä r j e s t e l m i ä + a u r i n k o s ä h k ö j ä r j e s t e l m ä m m e + a u r i n k o s ä h k ö m o d u u l e i s s a a n + a u r i n k o s ä h k ö t e k n i i k o i d e n + a u r i n k o s ä h k ö y r i t y s t ä + a u r i n k o s ä h k ö ö n + a u r i n k o s ä t e i l y n + a u r i n k o t a n s s i + a u r i n k o t e k n i i k k a a + a u r i n k o t e m p p e l i + a u r i n k o t e r v e h d y s + a u r i n k o t u u l i + a u r i n k o v a k i o + a u r i n k o v e n t t i i l i + a u r i n k o v e r t a u s + a u r i n k o v e t y t a l o u t e e n + a u r i n k o v o i d e t t a + a u r i n k o v o i m a + a u r i n k o v o i m a a + a u r i n k o v o i m a a n + a u r i n k o v o i m a h a n k k e e s e e n + a u r i n k o v o i m a l a + a u r i n k o v o i m a l l a + a u r i n k o v o i m a l l e + a u r i n k o v o i m a l o i d e n + a u r i n k o v o i m a s t a + a u r i n k o v o i m a t e o l l i s u u d e n + a u r i n k o v o i t e e n + a u r i n k o v o i t e e t + a u r i n k o v o i t e i s s a + a u r o i n + a u r o r a p e r h o n e n + a u s t r a l i a l a i s e t + a u s t r a l i a n k e l p i e + a u s t r a l i a n t e r r i e r i + a u t a m m e + a u t e t a a n + a u t e t t a e s s a + a u t e t t a i s i i n + a u t e t t u a a n + a u t i o i t e t t a v a + a u t i o i t u m a s s a + a u t i o i t u m i s e e n + a u t i o i t u m i s e n + a u t i o i t u m i s e s t a + a u t i o i t u m i s i n d i k a a t t o r i t + a u t i o i t u m i s s u u n t a a + a u t i o i t u u + a u t i o i t u v a t + a u t i o i t u v i l l e + a u t i o m a a k s i + a u t i o t u p a + a u t i s m i a + a u t i s m i e p i d e m i a s t a + a u t i s m i t i e t o i s u u d e n + a u t i s t i e n + a u t o a + a u t o a l a + a u t o a l a a + a u t o a l a a n + a u t o a l a l l a + a u t o a l a l l e + a u t o a l a l t a + a u t o a l a m m e + a u t o a l a n + a u t o a s e t u s + a u t o d i r e k t i i v i ä + a u t o e t u + a u t o h a r r a s t e k e r h o i s s a + a u t o h u i p p u k o k o u k s e n + a u t o h ä l y t i n + a u t o i h i n + a u t o i l i j a n + a u t o i l i j a t + a u t o i l i j a y h d i s t y k s e t + a u t o i l i j o i d e n + a u t o i l i j o i l l e + a u t o i l i j o i l t a + a u t o i l i j o i s t a + a u t o i l i j o i t a + a u t o i l t a + a u t o i l u a + a u t o i l u j ä r j e s t ö j ä + a u t o i m m e + a u t o i m m u u n i j ä r j e s t e l m ä n + a u t o i m m u u n i s a i r a u d e t + a u t o i m m u u n i s a i r a u k s i a + a u t o i m m u u n i s a i r a u s + a u t o i n + a u t o i n s i n ö ö r i + a u t o i s s a + a u t o i s t a + a u t o i s t a a n + a u t o j a + a u t o j a k a a n + a u t o j e n + a u t o j o n o i h i n + a u t o j o n o o n + a u t o k a n n a n + a u t o k a n t a + a u t o k a n t a m m e + a u t o k a u p a n + a u t o k a u p p i a i d e n + a u t o k a u p p i a s + a u t o k a u p p o j a + a u t o k e r h o t + a u t o k o l a r i a + a u t o k o n s e r n i t + a u t o k o r j a a m o a l a a + a u t o k o r j a a m o t y ö s s ä + a u t o k o r t i n + a u t o k o r t t i + a u t o k o u l u + a u t o k o u l u i s s a + a u t o k o u l u j e n + a u t o k o u l u s s a + a u t o k r i i s i + a u t o k r i i s i n + a u t o k u l j e t u k s e t + a u t o k u l t t u u r i i n + a u t o l a i n s ä ä d ä n t ö ä + a u t o l a u t a n + a u t o l a u t t a y h t i ö i l l e + a u t o l a u t t a y h t i ö n + a u t o l a u t t o j a + a u t o l a u t t o j e n + a u t o l e h t i e n + a u t o l i b e r a a l i n e n + a u t o l i i k e n n e + a u t o l i i k e n n e p a l v e l u j e n + a u t o l i i k e n n e t t ä + a u t o l i i k e n t e e n + a u t o l i i k e n t e e s e e n + a u t o l i i k e n t e e s s ä + a u t o l i i t t o + a u t o l i i t t o j e n + a u t o l l a n i + a u t o l u o k k i i n + a u t o l u o t t o h a k e m u s + a u t o m a a i l m a s s a + a u t o m a a t e i s s a + a u t o m a a t e i s t a + a u t o m a a t i n + a u t o m a a t i o n + a u t o m a a t i o y r i t y k s i i n + a u t o m a a t i o y r i t y s t e n + a u t o m a a t i t + a u t o m a a t t e i h i n + a u t o m a a t t e j a + a u t o m a a t t i a s e i t a + a u t o m a a t t i e n + a u t o m a a t t i k i r j o i t u s + a u t o m a a t t i k ä y t ö s s ä + a u t o m a a t t i n o s t o i h i n + a u t o m a a t t i n o s t o i s s a + a u t o m a a t t i o h j a u k s e n + a u t o m a a t t i o h j a u s p e r i a a t e + a u t o m a a t t i o v i n e e n + a u t o m a a t t i p i a n o + a u t o m a a t t i r e a k t i o i d e n + a u t o m a a t t i s e k s i + a u t o m a a t t i s e m m a n + a u t o m a a t t i s e n + a u t o m a a t t i s e s s a + a u t o m a a t t i s i a + a u t o m a a t t i s i l l a + a u t o m a a t t i s i s t a + a u t o m a a t t i s t e n + a u t o m a a t t i t e o l l i s u u d e n + a u t o m a a t t i t e o r i a + a u t o m a a t t i v a i h t e i s t o + a u t o m a i n o k s e n + a u t o m a l l e i h i n + a u t o m a l l e i l l e + a u t o m a l l i a + a u t o m a l l i l l e + a u t o m a l l i s t a + a u t o m a l l i t + a u t o m a r k k i n a t + a u t o m a r k k i n o i d e n + a u t o m a r k k i n o i h i n + a u t o m a r k k i n o i l l a + a u t o m a r k k i n o i l l e + a u t o m a r k k i n o i s t a + a u t o m a r k k i n o i t a + a u t o m a t i s o i d u m m a n + a u t o m a t i s o i d u s s a + a u t o m a t i s o i d u s t a + a u t o m a t i s o i t a v a + a u t o m a t k a + a u t o m a t k a i l u y h d i s t y k s e t k i n + a u t o m a t k a l l a + a u t o m a t k o i s t a + a u t o m a t k o j a + a u t o m a t k o j e n + a u t o m a t k u s t a j a t + a u t o m e k a a n i k k o + a u t o m e r k e i s t ä + a u t o m e r k k e j ä + a u t o m e r k k i e n + a u t o m u o t o i l u n + a u t o m y y j i ä + a u t o m y y j ä t + a u t o m y y n t i + a u t o n + a u t o n i + a u t o n k o r j a a j i e n + a u t o n k o r j a a j i l l e + a u t o n k u l j e t t a j a + a u t o n k u l j e t t a j a t + a u t o n k u l j e t t a j i a + a u t o n k u l j e t t a j i e n + a u t o n k u l j e t t a j i i n + a u t o n k u l j e t t a j i l l e + a u t o n k ä y t t ö + a u t o n k ä y t t ö ä + a u t o n m y y n t i m a r k k i n o i l l a + a u t o n o m i a + a u t o n o m i a a + a u t o n o m i a a n + a u t o n o m i a e h d o t u s t a + a u t o n o m i a j ä r j e s t e l y j e n + a u t o n o m i a m a l l e j a + a u t o n o m i a n + a u t o n o m i a p r o s e s s i s s a + a u t o n o m i a p y r k i m y k s i ä + a u t o n o m i a s t a + a u t o n o m i s e k s i + a u t o n o m i s e l l a + a u t o n o m i s e l l e + a u t o n o m i s e l t a + a u t o n o m i s e m p a a + a u t o n o m i s e m p i + a u t o n o m i s e n + a u t o n o m i s e s s a + a u t o n o m i s e s t a + a u t o n o m i s i a + a u t o n o m i s i l l a + a u t o n o m i s i l l e + a u t o n o m i s i s t a + a u t o n o m i s t a + a u t o n o m i s t a j a t + a u t o n o m i s t a j i e n + a u t o n o m i s t a j i l l a + a u t o n o m i s t e n + a u t o n o s a s e k t o r i l l a + a u t o n o s a t + a u t o n o s i a + a u t o n o s i e n + a u t o n o s i i n + a u t o n o s i s t a + a u t o n o s t a j i e n + a u t o n o s t a j i l l e + a u t o n o s t a j i n a + a u t o n r e n k a a n + a u t o n r e n k a i d e n + a u t o n r e n k a i s s a + a u t o n r e n k a i t a + a u t o n s u u n n i t t e l u s t a n d a r d e i s t a + a u t o n s u u n n i t t e l u s t a n d a r d e j a + a u t o n t o i m i t t a j a t + a u t o n t u o j i e n + a u t o n t u o t a n n o n + a u t o n v a l m i s t a j a + a u t o n v a l m i s t a j a a + a u t o n v a l m i s t a j a l t a + a u t o n v a l m i s t a j a n + a u t o n v a l m i s t a j a r y h m i e n + a u t o n v a l m i s t a j a t + a u t o n v a l m i s t a j i a + a u t o n v a l m i s t a j i e m m e + a u t o n v a l m i s t a j i e n + a u t o n v a l m i s t a j i i n + a u t o n v a l m i s t a j i l l a + a u t o n v a l m i s t a j i l l a m m e + a u t o n v a l m i s t a j i l l e + a u t o n v a l m i s t a j i l l e e n + a u t o n v a l m i s t a j i l t a + a u t o n v a l m i s t a j i s t a + a u t o n v a l m i s t u k s e l l e + a u t o n v a l m i s t u k s e n + a u t o n v a l m i s t u k s e s s a + a u t o n v a l m i s t u s + a u t o n v a l m i s t u s a l a l l a + a u t o n v a l m i s t u s p e r i n t e e n + a u t o n v a l m i s t u s t e o l l i s u u d e n + a u t o n v a l m i s t u s t e o l l i s u u s + a u t o n v a r a o s i e n + a u t o n v a r a o s i l t a + a u t o n v i r i t y s y r i t y k s i l l ä + a u t o n v u o k r a u k s e n + a u t o n v u o k r a u s a l a l l a + a u t o n v u o k r a u s a l a n + a u t o n v u o k r a u s p a l v e l u t + a u t o n v u o k r a u s s o p i m u k s e n + a u t o n v u o k r a u s y r i t y k s e t + a u t o n v u o k r a u s y r i t y k s i s s ä + a u t o n v u o k r a u s y r i t y s t e n + a u t o n v ä l i t t ä j i e n + a u t o n v ä l i t t ä j i l l e + a u t o n v ä l i t t ä j i ä + a u t o n ä y t t e l y + a u t o n ä y t t e l y i s s ä + a u t o n ä y t t e l y s s ä + a u t o p a i k a n + a u t o p a l v e l u + a u t o p a l v e l u a + a u t o p a l v e l u n + a u t o p a l v e l u s s a + a u t o p i l o t i l l a + a u t o p i l o t t i i n + a u t o p o m m i + a u t o p o m m i a + a u t o p o m m i e n + a u t o p o m m i n + a u t o p o m m i t + a u t o p o m m i y r i t y s + a u t o p u h a l l u s + a u t o p u h e l i n + a u t o r a d i o + a u t o r a d i o n + a u t o r a d i o t + a u t o r i t a a r i s e e n + a u t o r i t a a r i s e m m a n + a u t o r i t a a r i s e m p a a + a u t o r i t a a r i s e n + a u t o r i t a a r i s e s t a + a u t o r i t a a r i s e t + a u t o r i t a a r i s i a + a u t o r i t a a r i s i i n + a u t o r i t a a r i s i l l e + a u t o r i t a a r i s i m m i s t a + a u t o r i t a a r i s i s t a + a u t o r i t a a r i s t a + a u t o r i t a a r i s t e n + a u t o r o m u a + a u t o r y h m i t t y m i e n + a u t o s a a s t e i t a + a u t o s e k t o r i + a u t o s e k t o r i n + a u t o s i l l a s t a + a u t o s o p i m u k s e n + a u t o s o p i m u k s e s t a + a u t o s o p i m u s t a + a u t o s s a + a u t o s t a + a u t o s t a a n + a u t o s u u n n i s t u s + a u t o s u u n n i s t u s k i l p a i l u u n + a u t o s u u n n i t e l m a + a u t o s u u n n i t t e l u a + a u t o t + a u t o t a l l i s s a + a u t o t e h d a s + a u t o t e h t a a n + a u t o t e h t a a n s a + a u t o t e h t a a s s a + a u t o t e h t a a t + a u t o t e h t a i d e m m e + a u t o t e h t a i d e n + a u t o t e k n i i k a s s a + a u t o t e k n i i k k a + a u t o t e k n i i k k a a n + a u t o t e k n o l o g i a + a u t o t e k n o l o g i a a n + a u t o t e k n o l o g i a s s a + a u t o t e o l l i s u u d e l l a + a u t o t e o l l i s u u d e l l e + a u t o t e o l l i s u u d e l t a + a u t o t e o l l i s u u d e n + a u t o t e o l l i s u u d e s s a + a u t o t e o l l i s u u d e s t a + a u t o t e o l l i s u u s + a u t o t e o l l i s u u s a l a + a u t o t e o l l i s u u s k o n s e r n i t + a u t o t e o l l i s u u s p a k e t t i + a u t o t e o l l i s u u s p o l i t i i k k a a + a u t o t e o l l i s u u s y h t i ö i d e n + a u t o t e o l l i s u u s y r i t y s t e n + a u t o t e o l l i s u u t e e n + a u t o t e o l l i s u u t e e n s a + a u t o t e o l l i s u u t e m m e + a u t o t e o l l i s u u t e n s a + a u t o t e o l l i s u u t t a + a u t o t e o l l i s u u t t a a n + a u t o t e o l l i s u u t t a m m e + a u t o t i e t o k o n e + a u t o t i e t o k o n e e n + a u t o t i e t o k o n e e s e e n + a u t o t i e t o k o n e e s t a + a u t o t u o t a n n o n + a u t o t y ö n t e k i j ä + a u t o u r h e i l u + a u t o u r h e i l u l i i t o n + a u t o u r h e i l u l i i t t o j e n + a u t o u r h e i l u u n + a u t o v a k u u t u k s e n + a u t o v a k u u t u k s e t + a u t o v a k u u t u k s i a + a u t o v a k u u t u s + a u t o v a k u u t u s m a k s u j a + a u t o v a k u u t u s m a k s u n s a + a u t o v a k u u t u s m a r k k i n a t + a u t o v a k u u t u s t e n + a u t o v a k u u t u s t o d i s t u s t a + a u t o v a l m i s t a j a + a u t o v a l m i s t a j i e n + a u t o v a l m i s t u s a l a n + a u t o v a r k a i s t a + a u t o v a r k a u d e t + a u t o v a r k a u k s i e n + a u t o v a r k a u k s i s s a + a u t o v e r o + a u t o v e r o a + a u t o v e r o j a + a u t o v e r o j e n + a u t o v e r o j ä r j e s t e l m ä ä + a u t o v e r o k a n t o i h i n + a u t o v e r o n a + a u t o v e r o p r o s e n t t i e n + a u t o v e r o r a k e n t e e s e e n + a u t o v e r o t + a u t o v e r o t u k s e e n + a u t o v e r o t u k s e n + a u t o v e r o t u k s e s s a + a u t o v e r o t u k s e s t a + a u t o v e r o t u s + a u t o v e r o t u s t a + a u t o v i e n t i ä ä n + a u t o v u o k r a a m o j a + a u t o y h t i ö i l t ä + a u t o y h t i ö i t ä + a u t o y h t i ö n + a u t o y h t i ö t + a u t o y r i t t ä j i l l e + a u t o y r i t y k s i i n + a u t o y r i t y k s i s t ä + a u t o y r i t y k s i ä + a u t o ö l j y t e o l l i s u u s + a u t t a a + a u t t a a k s e e n + a u t t a a k s e m m e + a u t t a a k s e n i + a u t t a e s s a a n + a u t t a i s i + a u t t a i s i k o + a u t t a i s i v a t + a u t t a k a a + a u t t a k a a m m e + a u t t a m a a n + a u t t a m a l l a + a u t t a m a s s a + a u t t a m a s t a + a u t t a m i s e e n + a u t t a m i s e k s e e n + a u t t a m i s e k s i + a u t t a m i s e n + a u t t a m i s e s s a + a u t t a m i s e s t a + a u t t a m i s k e i n o m m e + a u t t a m i s t a + a u t t a m i s t o i m i s s a + a u t t a n e e + a u t t a n e e t + a u t t a n e i d e n + a u t t a n u t + a u t t a v a m p a a + a u t t a v a n + a u t t a v a t + a u t t o i + a u t t o i v a t + a u t u a a s e e n + a u t u u t e n s a + a u v o i s t a + a v a a m a a n + a v a a m a l l a + a v a a m a s s a + a v a a m i s a i k a a + a v a a m i s e e n + a v a a m i s e k s i + a v a a m i s e s s a + a v a a m i s e s t a + a v a a m i s t a + a v a a m i s v a i h e e s s a + a v a a r i t + a v a a v a t + a v a a v a t k o + a v a i m e n p e r i s s ä + a v a i m e n r e n k a a n + a v a i m e s t a a n + a v a i m e t + a v a i n a i h e e n + a v a i n a i h e e n a + a v a i n a i h e i s i i n + a v a i n a i h e i s t a + a v a i n a i h e t t a + a v a i n a i n e e t + a v a i n a i n e i d e n + a v a i n a j a t u k s e n + a v a i n a j a t u k s e n a m m e + a v a i n a j a t u s t a + a v a i n a l a + a v a i n a l a a + a v a i n a l a a n + a v a i n a l a n + a v a i n a l a t + a v a i n a l o i h i n + a v a i n a l o i l l a + a v a i n a l o i l l e + a v a i n a l o i n a + a v a i n a l o i s t a + a v a i n a l o i t t e i d e n + a v a i n a l o j a + a v a i n a l o j e n + a v a i n a l u e + a v a i n a l u e e k s i + a v a i n a l u e e l l a + a v a i n a l u e e s e e n + a v a i n a l u e e t + a v a i n a l u e i d e n + a v a i n a l u e i l l a + a v a i n a l u e i l l e + a v a i n a l u e i s i i n + a v a i n a l u e i s t a + a v a i n a l u e i t a + a v a i n a l u e t t a + a v a i n a s e m a + a v a i n a s e m a a + a v a i n a s e m a a n + a v a i n a s e m a n + a v a i n a s e m a s s a + a v a i n a s e m i a + a v a i n a s i a + a v a i n a s i a a + a v a i n a s i a a n + a v a i n a s i a k i r j a + a v a i n a s i a n + a v a i n a s i a n a + a v a i n a s i a t + a v a i n a s i o i h i n + a v a i n a s i o i n a + a v a i n a s i o i s s a + a v a i n a s i o i s t a + a v a i n a s i o i t a + a v a i n e d e l l y t y s + a v a i n e h d o t u k s e n + a v a i n e h t o + a v a i n e l e m e n t i t + a v a i n e l e m e n t t e j ä + a v a i n e l e m e n t t i + a v a i n e l e m e n t t i n ä + a v a i n e s i m e r k k i + a v a i n e t u + a v a i n f r a a s i + a v a i n h a h m o n a + a v a i n h a n k k e e s t a + a v a i n h a n k k e i s i i n + a v a i n h e n k i l ö + a v a i n h e n k i l ö i d e n + a v a i n h e n k i l ö i l l e + a v a i n h e n k i l ö i s t ä + a v a i n h e n k i l ö i t ä + a v a i n h e n k i l ö k s i + a v a i n h e n k i l ö n + a v a i n h e n k i l ö s t ö ä + a v a i n h e t k e n + a v a i n h e t k i l l ä + a v a i n i l m a i s u j a + a v a i n i n d i k a a t t o r e i t a + a v a i n k e h i t y s m a i d e n + a v a i n k e i n o + a v a i n k e i n o i n a + a v a i n k i r j o a h v e n + a v a i n k o h d a l l a + a v a i n k o h d a n + a v a i n k o h d a t + a v a i n k o h d i s t a + a v a i n k o h t a + a v a i n k o h t a a + a v a i n k o h t a a n + a v a i n k o h t a n a + a v a i n k o h t i a + a v a i n k o h t i i n + a v a i n k o r t i t + a v a i n k r i t e e r i + a v a i n k u m p p a n e i t a + a v a i n k u m p p a n i + a v a i n k u m p p a n i e n s a + a v a i n k u m p p a n u u k s i a + a v a i n k y s y m y k s e e n + a v a i n k y s y m y k s e k s i + a v a i n k y s y m y k s e n + a v a i n k y s y m y k s e n i + a v a i n k y s y m y k s e n ä + a v a i n k y s y m y k s e s s ä + a v a i n k y s y m y k s e s t ä + a v a i n k y s y m y k s e t + a v a i n k y s y m y k s i i n + a v a i n k y s y m y k s i s s ä + a v a i n k y s y m y k s i s t ä + a v a i n k y s y m y k s i ä + a v a i n k y s y m y s + a v a i n k y s y m y s t e n + a v a i n k y s y m y s t ä + a v a i n k ä s i t e + a v a i n k ä s i t e t t ä + a v a i n k ä s i t t e e n ä + a v a i n k ä s i t t e e s t ä + a v a i n k ä s i t t e i t ä + a v a i n l a j i + a v a i n l a u s e + a v a i n l e n k k i + a v a i n l u v u n + a v a i n m e n e t e l m ä t + a v a i n m i n i s t e r i ö i d e n + a v a i n m ä ä r ä y s t e n + a v a i n n e u v o t t e l u i l l e + a v a i n n i m i t y k s i ä + a v a i n n ä k ö k o h d i s t a + a v a i n o h j e l m a + a v a i n o n g e l m a + a v a i n o n g e l m a n a + a v a i n o n g e l m i a + a v a i n p a r a m e t r i e n + a v a i n p e r i a a t e + a v a i n p e r u s t e l u + a v a i n p i i r t e e t + a v a i n p o l i t i i k k a + a v a i n p o l i t i i k k a a + a v a i n p ä ä t ö s + a v a i n r a h o i t u s o h j e l m i e n + a v a i n r a k e n n u s e l e m e n t e i s t ä + a v a i n r a t k a i s u + a v a i n r a t k a i s u i s t a + a v a i n r a t k a i s u j a + a v a i n r o o l i + a v a i n r o o l i a + a v a i n r o o l i n + a v a i n r o o l i s t a + a v a i n r y h m ä + a v a i n r y h m ä t + a v a i n s a n a + a v a i n s a n a a + a v a i n s a n a a n + a v a i n s a n a l l a + a v a i n s a n a n + a v a i n s a n a n a + a v a i n s a n a p i l v i + a v a i n s a n a t + a v a i n s a n a t k i n + a v a i n s a n o i l l a + a v a i n s a n o i s t a + a v a i n s a n o j a + a v a i n s a n o j e n + a v a i n s a n o m a + a v a i n s e i k a n + a v a i n s e i k a t + a v a i n s e i k k a + a v a i n s e i k k a a + a v a i n s e i k k a a n + a v a i n s e i k o i s t a + a v a i n s e k t o r e i l l a + a v a i n s u o s i t u k s i a + a v a i n t a i d o i s t a + a v a i n t a i d o l l e + a v a i n t a i d o t + a v a i n t a i t o + a v a i n t a i t o a + a v a i n t a i t o j a + a v a i n t a i t o j e n + a v a i n t a i t o t a v o i t t e e t + a v a i n t a p a h t u m i s s a + a v a i n t a v o i t e + a v a i n t a v o i t t e e m m e + a v a i n t a v o i t t e e t + a v a i n t a v o i t t e i s t a + a v a i n t a v o i t t e i t a + a v a i n t e e m a + a v a i n t e h t ä v ä + a v a i n t e k i j ä + a v a i n t e k i j ä k s i + a v a i n t e k i j ä n ä + a v a i n t e k i j ä t + a v a i n t e k i j ä ä + a v a i n t e k i j ö i d e n + a v a i n t e k i j ö i h i n + a v a i n t e k i j ö i n ä + a v a i n t e k i j ö i s t ä + a v a i n t e k i j ö i t ä + a v a i n t e k n o l o g i o i d e n + a v a i n t e k n o l o g i o i n a + a v a i n t e o l l i s u u d e n + a v a i n t e o l l i s u u s + a v a i n t e r m i i n + a v a i n t i e d o t + a v a i n t i e t o a s i a k i r j a a + a v a i n t i e t o j a + a v a i n t i e t o j e n + a v a i n t i l a s t o j e n + a v a i n t o d i s t a j a + a v a i n t o d i s t a j i a + a v a i n t o d i s t a j i e n + a v a i n t o i m e l l e + a v a i n t o i m e n + a v a i n t o i m e n p i d e t t ä + a v a i n t o i m e n p i t e e k s i + a v a i n t o i m e n p i t e i d e n + a v a i n t o i m e s t a + a v a i n t o i m i + a v a i n t o i m i a + a v a i n t o i m i e n + a v a i n t o i m i i n + a v a i n t o i m i j a + a v a i n t o i m i j a n + a v a i n t o i m i j o i d e n + a v a i n t o i m i j o i n a + a v a i n t o i m i n t a + a v a i n t o i m i n t a k o k o n a i s u u d e k s i + a v a i n t o i m i n t a k o k o n a i s u u d e l l a + a v a i n t o i m i n t a k o k o n a i s u u d e n + a v a i n t o i m i n t a k o k o n a i s u u d e s s a + a v a i n t o i m i n t a k o k o n a i s u u d e s t a + a v a i n t o i m i n t a k o k o n a i s u u d e t + a v a i n t o i m i n t a k o k o n a i s u u k s i a + a v a i n t o i m i n t a k o k o n a i s u u k s i s t a + a v a i n t o i m i n t a k o k o n a i s u u s + a v a i n t o i m i n t a k o k o n a i s u u t e e n + a v a i n t o i m i n t a k o k o n a i s u u t t a + a v a i n t o i m i n t o i h i n + a v a i n t o i m i n t o i n a + a v a i n t o i m i n t o j a + a v a i n t o i m i n t o j e n + a v a i n t o i n t a + a v a i n t u o t e t t a + a v a i n t u o t t e i d e n + a v a i n t y ö k a l u + a v a i n u u d i s t u s + a v a i n v a a t i m u s t a + a v a i n v a l t i o t + a v a i n y r i t y s t e n + a v a i s i + a v a j a i s i a + a v a j a i s i i n + a v a j a i s i s s a + a v a j a i s i s t u n n o n + a v a j a i s i s t u n n o s s a + a v a j a i s i s t u n t o + a v a j a i s i s t u n t o a + a v a j a i s i s t u n t o n s a + a v a j a i s i s t u n t o o n + a v a j a i s j u h l a l l i s u u d e t + a v a j a i s j u h l a l l i s u u k s i i n + a v a j a i s j u h l i i n + a v a j a i s k o k o u s + a v a j a i s k o n f e r e n s s i + a v a j a i s k o n f e r e n s s i s s a + a v a j a i s m e n o j a + a v a j a i s o t t e l u s s a + a v a j a i s p u h e e s s a + a v a j a i s p u h e e s s a a n + a v a j a i s p ä i v ä ä n + a v a j a i s s e r e m o n i a a + a v a j a i s s e r e m o n i a a n + a v a j a i s s e r e m o n i a s s a + a v a j a i s s e r e m o n i a s t a + a v a j a i s t e n + a v a j a i s t i l a i s u u t e e n + a v a j a i s t ä y s i s t u n n o n + a v a n n u t + a v a n t g a r d e m e t a l l i + a v a n t g a r d i s m i n + a v a n t o u i n t i + a v a r a k a t s e i n e n + a v a r a k a t s e i s e m m i k s i + a v a r a k a t s e i s e m p i a + a v a r a k a t s e i s e n + a v a r a k a t s e i s e s t a + a v a r a k a t s e i s e s t i + a v a r a k a t s e i s i a + a v a r a k a t s e i s i i n + a v a r a k a t s e i s i m p i e n + a v a r a k a t s e i s t a + a v a r a k a t s e i s u u d e l l e + a v a r a k a t s e i s u u d e s t a + a v a r a k a t s e i s u u s + a v a r a k a t s e i s u u t t a + a v a r u u d e n + a v a r u u s a a v e + a v a r u u s a i k a j a t k u m o n + a v a r u u s a j a n + a v a r u u s a l a + a v a r u u s a l a a + a v a r u u s a l a a n + a v a r u u s a l a l l a + a v a r u u s a l a l l e + a v a r u u s a l a n + a v a r u u s a l a s t a + a v a r u u s a s e m a + a v a r u u s a s e m a a + a v a r u u s a s e m a a n + a v a r u u s a s e m a l l a + a v a r u u s a s e m a l l e + a v a r u u s a s e m a n + a v a r u u s a s e m i e n + a v a r u u s f y s i i k a n + a v a r u u s f y s i i k a s t a + a v a r u u s f y s i i k k a + a v a r u u s g e o m e t r i a + a v a r u u s h a l l i n t o + a v a r u u s h a n k e + a v a r u u s h a n k k e e n a + a v a r u u s h a n k k e e t + a v a r u u s h a n k k e i d e n + a v a r u u s h a n k k e i l l e + a v a r u u s h a u t a u s + a v a r u u s h i s s i + a v a r u u s h i s t o r i a a n + a v a r u u s h u o p a + a v a r u u s j ä r j e s t ö + a v a r u u s j ä r j e s t ö i s t ä + a v a r u u s j ä r j e s t ö l l ä + a v a r u u s j ä r j e s t ö n + a v a r u u s j ä r j e s t ö s s ä + a v a r u u s j ä r j e s t ö ä + a v a r u u s j ä r j e s t ö ö n + a v a r u u s k e s k u k s e e n + a v a r u u s k e s k u k s e m m e + a v a r u u s k e s k u k s e n + a v a r u u s k e s k u s + a v a r u u s k e s k u s t e n + a v a r u u s k i l p a + a v a r u u s k u l m a + a v a r u u s k y n ä + a v a r u u s k ä v e l y + a v a r u u s l a b o r a t o r i o + a v a r u u s l a i t o s + a v a r u u s l e n n o i s t a + a v a r u u s l e n n o s t a + a v a r u u s l e n n o t + a v a r u u s l e n t o + a v a r u u s l e n t o i h i n + a v a r u u s l e n t o j a + a v a r u u s l e n t ä j i s t ä + a v a r u u s l u o t a i m e n + a v a r u u s l u o t a i n + a v a r u u s l ä v i s t ä j ä + a v a r u u s l ä ä k e t i e d e + a v a r u u s m a h d i n + a v a r u u s m a h t e j a + a v a r u u s m a h t i + a v a r u u s m a r k k i n o i d e n + a v a r u u s m a t k a + a v a r u u s m a t k a i l u a + a v a r u u s m a t k a i l u n + a v a r u u s m a t k a i l u p o l i t i i k a l l e + a v a r u u s m e n o i s s a + a v a r u u s n e u v o s t o n + a v a r u u s o h j e l m a + a v a r u u s o h j e l m a a + a v a r u u s o h j e l m a n + a v a r u u s o h j e l m a s t a + a v a r u u s o h j e l m a t + a v a r u u s o h j e l m i a + a v a r u u s o h j e l m i e n + a v a r u u s o h j e l m i s s a + a v a r u u s o l e n t o + a v a r u u s o o p p e r a + a v a r u u s p o l i t i i k a l l a + a v a r u u s p o l i t i i k a l l e + a v a r u u s p o l i t i i k a n + a v a r u u s p o l i t i i k a s s a + a v a r u u s p o l i t i i k a s t a + a v a r u u s p o l i t i i k k a + a v a r u u s p o l i t i i k k a a + a v a r u u s p o l i t i i k k a a m m e + a v a r u u s p o l i t i i k k a a n + a v a r u u s p o l i t i i k k a m m e + a v a r u u s p o l i t i i k k a n s a + a v a r u u s p r o j e k t i + a v a r u u s p u k u + a v a r u u s p u k u i h i n + a v a r u u s p ö l y + a v a r u u s r a k e n n e + a v a r u u s r a k e t t e j a + a v a r u u s r a k e t t i e n + a v a r u u s r o m u + a v a r u u s r o m u n + a v a r u u s s a t a m a + a v a r u u s s a t e l l i i t t i a + a v a r u u s s e i k k a i l u + a v a r u u s s e k o i l u + a v a r u u s s e k t o r i + a v a r u u s s e k t o r i l l a + a v a r u u s s e k t o r i n + a v a r u u s s o d a n k ä y n t i + a v a r u u s s o v e l l u k s e t + a v a r u u s s o v e l l u k s i a + a v a r u u s s o v e l l u k s i l l e + a v a r u u s s o v e l l u s t e n + a v a r u u s s t r a t e g i a + a v a r u u s s t r a t e g i a a n + a v a r u u s s t r a t e g i a n + a v a r u u s s t r a t e g i a s t a + a v a r u u s s u k k u l a + a v a r u u s s ä ä + a v a r u u s t a i d e + a v a r u u s t e k n i i k a n + a v a r u u s t e k n i i k k a + a v a r u u s t e k n o l o g i a + a v a r u u s t e k n o l o g i a a + a v a r u u s t e k n o l o g i a a n + a v a r u u s t e k n o l o g i a n + a v a r u u s t e l e s k o o p p i + a v a r u u s t e o l l i s u u d e l l a + a v a r u u s t e o l l i s u u d e l l e + a v a r u u s t e o l l i s u u d e n + a v a r u u s t e o l l i s u u d e s s a + a v a r u u s t e o l l i s u u d e s t a + a v a r u u s t e o l l i s u u s + a v a r u u s t e o l l i s u u s r y h m i t t y m i s t ä + a v a r u u s t e o l l i s u u t e e n + a v a r u u s t e o l l i s u u t e m m e + a v a r u u s t e o l l i s u u t t a + a v a r u u s t i e d e + a v a r u u s t i e d e t t ä + a v a r u u s t i e d u s t e l u + a v a r u u s t i e t e e l l e + a v a r u u s t i e t e e n + a v a r u u s t o i m i a + a v a r u u s t o i m i e n + a v a r u u s t o i m i n n a n + a v a r u u s t o i m i n t a + a v a r u u s t o i m i n t a a n + a v a r u u s t o i m i s t o + a v a r u u s t u k i k o h t i e n + a v a r u u s t u o t t e i d e n + a v a r u u s t u r i s t i + a v a r u u s t u r v a l l i s u u t t a + a v a r u u s t u t k i m u k s e e n + a v a r u u s t u t k i m u k s e l l e + a v a r u u s t u t k i m u k s e n + a v a r u u s t u t k i m u k s e s t a + a v a r u u s t u t k i m u s + a v a r u u s t u t k i m u s a s e m a + a v a r u u s t u t k i m u s a s i o i s t a + a v a r u u s t u t k i m u s h a n k k e i t a + a v a r u u s t u t k i m u s i n s t i t u u t t i + a v a r u u s t u t k i m u s j ä r j e s t ö + a v a r u u s t u t k i m u s k e s k u k s e n + a v a r u u s t u t k i m u s k o h t a a n + a v a r u u s t u t k i m u s o h j e l m i e n + a v a r u u s t u t k i m u s t a + a v a r u u s t y k k i + a v a r u u s u l o t t u v u u d e l l a + a v a r u u s v a l l a k s i + a v a r u u s v a l l a t + a v a r u u s v a l t a + a v a r u u s v a l t a n a + a v a r u u s v a l t o j e n + a v a r u u s v a l v o n t a v o i m a v a r o j a + a v a r u u s v i r a s t o + a v a r u u s v i r a s t o l l e + a v a r u u s v i r a s t o n + a v a r u u s v o i m a l a + a v a r u u s v o i m a t + a v a r u u s y r i t y s + a v a r u u t e e n + a v a r u u t t a + a v a t a + a v a t a a n + a v a t a k o + a v a t a k s e e n + a v a t e s s a a n + a v a t e s s a n i + a v a t k a a + a v a t k a a m m e + a v a t t a e s s a + a v a t t a i s i i n + a v a t t a v a + a v a t t i i n + a v a t u k s i + a v a u k s i a + a v a u s h u o m a u t u k s e n i + a v a u s h u o m a u t u k s e s s a a n + a v a u s h u o m i o i s s a n i + a v a u s i s t u n n o l l a + a v a u s i s t u n n o n + a v a u s j u h l a l l i s u u k s i i n + a v a u s j u l i s t u s t a + a v a u s k e s k u s t e l u n + a v a u s k o k o u k s e s s a + a v a u s k o n f e r e n s s i i n + a v a u s o t t e l u s s a + a v a u s o t t e l u u n + a v a u s p u h e + a v a u s p u h e e n + a v a u s p u h e e n i + a v a u s p u h e e n v u o r o a + a v a u s p u h e e n v u o r o a n i + a v a u s p u h e e n v u o r o a n n e + a v a u s p u h e e n v u o r o i s s a + a v a u s p u h e e n v u o r o i s t a + a v a u s p u h e e n v u o r o i s t a a n + a v a u s p u h e e n v u o r o n + a v a u s p u h e e n v u o r o n i + a v a u s p u h e e n v u o r o n n e + a v a u s p u h e e n v u o r o o n i + a v a u s p u h e e n v u o r o s s a + a v a u s p u h e e n v u o r o s s a a n + a v a u s p u h e e n v u o r o s s a n i + a v a u s p u h e e n v u o r o s s a n n e + a v a u s p u h e e n v u o r o s t a + a v a u s p u h e e n v u o r o s t a a n + a v a u s p u h e e n v u o r o s t a n i + a v a u s p u h e e n v u o r o s t a n n e + a v a u s p u h e e s e e n n e + a v a u s p u h e e s s a a n + a v a u s p u h e e s s a n i + a v a u s p u h e e s s a n n e + a v a u s p u h e e s t a + a v a u s p u h e e s t a n n e + a v a u s p u h e t t a n n e + a v a u s p ä i v ä n ä + a v a u s s a n a n s a + a v a u s s a n o i s s a a n + a v a u s s a n o i s s a n n e + a v a u s s a n o i s t a a n + a v a u s s a n o j e n n e + a v a u s t a + a v a u s t a r j o u k s e m m e + a v a u s t i l a i s u u t e e n + a v a u s v i e s t i + a v a u t u m a s s a + a v a u t u m i n e n + a v a u t u m i s t a + a v a u t u u + a v e i r o n + a v i o e h t o + a v i o e h t o s o p i m u s + a v i o e r o + a v i o e r o a + a v i o e r o a s i a n s a + a v i o e r o a s i a s s a + a v i o e r o a s i o i d e n + a v i o e r o a s i o i s s a + a v i o e r o a s t e + a v i o e r o e h d o i s t a + a v i o e r o h a k e m u s t a + a v i o e r o i s s a + a v i o e r o j e n + a v i o e r o j u r i s t i t + a v i o e r o l a i n + a v i o e r o l a i n s ä ä d ä n t ö n s ä + a v i o e r o l a i s s a + a v i o e r o m e n e t t e l y i s s ä + a v i o e r o m e n e t t e l y s s ä + a v i o e r o m e n e t t e l y y n + a v i o e r o m e n e t t e l y ä + a v i o e r o n + a v i o e r o p r o s e s s i + a v i o e r o p ä ä t ö s t e n + a v i o e r o p ä ä t ö s t ä + a v i o e r o s ä ä d ö k s e t + a v i o e r o t + a v i o e r o t a p a u k s e e n + a v i o e r o t a p a u k s e s s a + a v i o e r o t a p a u k s i i n + a v i o e r o t a p a u k s i s s a + a v i o e r o t u o m i o i s t u i m i e n + a v i o i t u v a t + a v i o l i i t o i s s a + a v i o l i i t o n + a v i o l i i t o s s a + a v i o l i i t o s t a + a v i o l i i t o t + a v i o l i i t t o + a v i o l i i t t o a + a v i o l i i t t o a s i o i s s a + a v i o l i i t t o a s i o i t a + a v i o l i i t t o i h i n + a v i o l i i t t o i l m o i t u k s i l l a + a v i o l i i t t o i n s t i t u u t i o n + a v i o l i i t t o i ä s s ä + a v i o l i i t t o j a + a v i o l i i t t o j e n + a v i o l i i t t o j ä r j e s t e l y j ä + a v i o l i i t t o k i i s t o i s s a + a v i o l i i t t o k y s y m y k s e n + a v i o l i i t t o l a i n + a v i o l i i t t o l a i n s ä ä d ä n n ö n + a v i o l i i t t o l a i n s ä ä d ä n n ö s t ä + a v i o l i i t t o l a i n s ä ä d ä n t ö + a v i o l i i t t o n i + a v i o l i i t t o o n + a v i o l i i t t o s i t o u m u k s i a + a v i o l i i t t o s u u n n i t e l m i e n + a v i o l i i t t o t o d i s t u k s i a + a v i o l i i t t o t o d i s t u s t e n + a v i o l i i t t o t y y p p i ä + a v i o l i i t t o v a l m i s t e l u i h i n + a v i o l l i s e s s a + a v i o l u p a u k s e t + a v i o n i i k k a j ä r j e s t e l m i i n + a v i o p a r e i h i n + a v i o p a r e i l l e + a v i o p a r e j a + a v i o p a r i + a v i o p a r i e n + a v i o p a r i t + a v i o p u o l i s o + a v i o p u o l i s o i d e n + a v i o p u o l i s o l l e + a v i o p u o l i s o t + a v i o r i i t a + a v i o r i k o s t a + a v i o s u h d e + a v i o u s k o l l i s u u s + a v i o v a i m o a + a v i o v a i m o j e n + a v i o v a r a l l i s u u s j ä r j e s t e l m i ä + a v o h a k k u i t a + a v o h o i t o a + a v o i m e e n + a v o i m e k s i + a v o i m e l l a + a v o i m e l l e + a v o i m e l t a + a v o i m e m m a k s i + a v o i m e m m a l l a + a v o i m e m m a l l e + a v o i m e m m a l t a + a v o i m e m m a n + a v o i m e m m a s s a + a v o i m e m m a s t a + a v o i m e m m a t + a v o i m e m m i k s i + a v o i m e m m i l l a + a v o i m e m m i s s a + a v o i m e m m i s t a + a v o i m e m p a a + a v o i m e m p a a n + a v o i m e m p a n a + a v o i m e m p i + a v o i m e m p i a + a v o i m e m p i e n + a v o i m e m p i i n + a v o i m e n + a v o i m e n a + a v o i m e s s a + a v o i m e s t a + a v o i m e t + a v o i m i a + a v o i m i e n + a v o i m i i n + a v o i m i k s i + a v o i m i l l a + a v o i m i l l e + a v o i m i m m a t + a v o i m i m m i s t a + a v o i m i m p i a + a v o i m i m p i e n + a v o i m i m p i i n + a v o i m i n + a v o i m i n a + a v o i m i n t a + a v o i m i s s a + a v o i m i s t a + a v o i m u u d e l l a + a v o i m u u d e l l a a n + a v o i m u u d e l l e + a v o i m u u d e n + a v o i m u u d e s s a + a v o i m u u d e s t a + a v o i m u u d e s t a k a a n + a v o i m u u s a j a t u k s e e n + a v o i m u u s a k t i v i s t i k s i + a v o i m u u s a l o i t e + a v o i m u u s a l o i t e t t a + a v o i m u u s a l o i t t e e m m e + a v o i m u u s a l o i t t e e n + a v o i m u u s a l o i t t e e s e e n + a v o i m u u s a l o i t t e e s t a + a v o i m u u s a l o i t t e i d e n + a v o i m u u s a l o i t t e i t a + a v o i m u u s a s e t u k s e e n + a v o i m u u s a s e t u k s e n + a v o i m u u s a s e t u k s e s t a + a v o i m u u s a s e t u s + a v o i m u u s a s e t u s t a + a v o i m u u s a s i a + a v o i m u u s a s i a n + a v o i m u u s a s t e + a v o i m u u s d i r e k t i i v i + a v o i m u u s d i r e k t i i v i n + a v o i m u u s d i r e k t i i v i s s ä + a v o i m u u s d i r e k t i i v i s t ä + a v o i m u u s d i r e k t i i v i ä + a v o i m u u s e h d o t u k s e e n + a v o i m u u s e h d o t u s + a v o i m u u s j ä r j e s t e l m i e n + a v o i m u u s j ä r j e s t e l m ä + a v o i m u u s j ä r j e s t e l m ä l l ä + a v o i m u u s j ä r j e s t e l y j e n + a v o i m u u s k e h i t y s t ä + a v o i m u u s k e s k u s t e l u i s t a + a v o i m u u s k e s k u s t e l u s s a + a v o i m u u s k o n s e p t i m m e + a v o i m u u s k r i i s i s t ä + a v o i m u u s k r i t e e r i t + a v o i m u u s k u l t t u u r i a + a v o i m u u s k u l t t u u r i i n + a v o i m u u s k y s y m y k s e e n + a v o i m u u s k y s y m y k s e n + a v o i m u u s k y s y m y k s e s s ä + a v o i m u u s k y s y m y k s e s t ä + a v o i m u u s k y s y m y k s i s s ä + a v o i m u u s k y s y m y k s i s t ä + a v o i m u u s k y s y m y s + a v o i m u u s k y s y m y s t ä + a v o i m u u s l a i n s ä ä d ä n n ö n + a v o i m u u s l a i n s ä ä d ä n n ö s t ä + a v o i m u u s l a i n s ä ä d ä n t ö + a v o i m u u s l a u s e k k e e l l a + a v o i m u u s m e k a n i s m i + a v o i m u u s m e k a n i s m i a + a v o i m u u s m e k a n i s m i i n + a v o i m u u s m e n e t t e l y + a v o i m u u s m e n e t t e l y i s t ä + a v o i m u u s m e n e t t e l y n + a v o i m u u s m ä ä r ä y k s e t + a v o i m u u s n o r m i t + a v o i m u u s n ä k ö k u l m i a + a v o i m u u s o h j e l m a s t a + a v o i m u u s p a k e t i n + a v o i m u u s p e r i a a t e + a v o i m u u s p e r i a a t e t t a + a v o i m u u s p e r i a a t t e e n + a v o i m u u s p e r i a a t t e e s e e n + a v o i m u u s p e r i a a t t e e t + a v o i m u u s p e r i a a t t e i d e n + a v o i m u u s p o l i t i i k a l l a + a v o i m u u s p o l i t i i k a n + a v o i m u u s p o l i t i i k a s s a + a v o i m u u s p o l i t i i k a s t a + a v o i m u u s p o l i t i i k k a a + a v o i m u u s p o l i t i i k k a a n + a v o i m u u s p r o s e s s i n + a v o i m u u s p r o s e s s i s s a + a v o i m u u s p y r k i m y k s e e n + a v o i m u u s p y r k i m y k s i i n + a v o i m u u s p y r k i m y k s i l l ä + a v o i m u u s r e k i s t e r e i s s ä + a v o i m u u s r e k i s t e r i + a v o i m u u s r e k i s t e r i i n + a v o i m u u s r e k i s t e r i n + a v o i m u u s r e k i s t e r i n ä + a v o i m u u s r e k i s t e r i s t ä + a v o i m u u s r e k i s t e r i ä + a v o i m u u s s o p i m u s + a v o i m u u s s y i s t ä + a v o i m u u s s ä ä n n ö k s i k s i + a v o i m u u s s ä ä n n ö k s i ä + a v o i m u u s s ä ä n n ö n + a v o i m u u s s ä ä n n ö t + a v o i m u u s s ä ä n t ö i h i n + a v o i m u u s s ä ä n t ö j e n + a v o i m u u s s ä ä n t ö j ä + a v o i m u u s t a r k a s t u k s e t + a v o i m u u s t i e t o i s u u d e n + a v o i m u u s t o i m e n p i t e i t ä + a v o i m u u s t o i m i e n + a v o i m u u s t o i m i s t a + a v o i m u u s u u d i s t u k s i i n + a v o i m u u s v a a t i m u k s e e n + a v o i m u u s v a a t i m u k s e l l a + a v o i m u u s v a a t i m u k s e n + a v o i m u u s v a a t i m u k s e t + a v o i m u u s v a a t i m u k s i a + a v o i m u u s v a a t i m u k s i s t a + a v o i m u u s v a a t i m u s t a + a v o i m u u s v a a t i m u s t e n + a v o i m u u s v e l v o i t t e e t + a v o i m u u s v e l v o i t t e i t a + a v o i m u u s v e l v o l l i s u u t t a + a v o i m u u t e e n + a v o i m u u t t a + a v o i n t a + a v o i n t e n + a v o k ä t i s e m m ä n + a v o k ä t i s e m p i + a v o k ä t i s e m p i ä + a v o k ä t i s e m p ä ä + a v o k ä t i s e m p ä ä n + a v o k ä t i s i m m i n + a v o k ä t i s i m m i s t ä + a v o k ä t i s i m m ä s t ä + a v o k ä t i s i m p i e n + a v o k ä t i s i ä + a v o k ä t i s y y d e s s ä ä n + a v o k ä t i s y y t t ä + a v o l i i t o n + a v o l i i t o s s a + a v o l i i t o t + a v o l o u h i n t a a + a v o m a r k k i n a o p e r a a t i o i d e n + a v o m e r e l l e + a v o m e r e l l ä + a v o m e r e n + a v o m e r e s t ä + a v o m e r e t + a v o m e r i a l u e i l l a + a v o m e r i a l u k s i l l e + a v o m e r i a l u s t e n + a v o m e r i i n + a v o m e r i k a l a s t u s + a v o m e r i k a l a s t u s a l u k s e n s a + a v o m e r i k a l a s t u s l a i v a s t o s t a + a v o m e r i k a l a s t u s t a + a v o m e r i k a l a s t u s t e o l l i s u u d e n + a v o m e r i l a i v a s t o m m e + a v o m e r i l a i v a s t o n + a v o m e r i l a i v a s t o o n + a v o m e r i l i i k e n n e t t ä + a v o m e r i l i i k e n t e e s s ä + a v o m e r i l l ä + a v o m e r i p o r a u k s i a + a v o m e r i t o i m i n n a n + a v o m e r i t r o o l a r e i d e n + a v o m e r i ä m m e + a v o m e r t a + a v o m i e l i n e n + a v o m i e l i s i m p i ä + a v o m i e l i s y y t t ä + a v o p a r e i s t a + a v o p a r i e n + a v o p a r i k a i j a + a v o p a r i t + a v o p u o l i s o i d e n + a v o p u o l i s o i l l e + a v o p u o l i s o i s t a + a v o p u o l i s o i t a + a v o p u o l i s o n + a v o p u o l i s o t + a v o v e s i u i n t i + a v u j a + a v u k s i + a v u l i a a m p i + a v u l i a a m p i a + a v u l i a a n a + a v u l l a a n + a v u n a n n o n + a v u n a n n o s s a + a v u n a n n o s t a + a v u n a n t a j a + a v u n a n t a j a j ä r j e s t ö j e n + a v u n a n t a j a k a r t a s t o j e n + a v u n a n t a j a k o n f e r e n s s i + a v u n a n t a j a k o n f e r e n s s i a + a v u n a n t a j a k o n f e r e n s s i s s a + a v u n a n t a j a m a a h a n + a v u n a n t a j a m a a n + a v u n a n t a j a m a a t + a v u n a n t a j a m a i d e n + a v u n a n t a j a m a i h i n + a v u n a n t a j a m a i l l e + a v u n a n t a j a m a i s s a + a v u n a n t a j a m a i s t a + a v u n a n t a j a m a i t a + a v u n a n t a j a n a + a v u n a n t a j a s t a + a v u n a n t a j a t + a v u n a n t a j a v a l t i o i d e n + a v u n a n t a j a v a l t i o t + a v u n a n t a j a y h t e i s t y ö t ä + a v u n a n t a j a y h t e i s ö + a v u n a n t a j a y h t e i s ö n + a v u n a n t a j i a + a v u n a n t a j i e n + a v u n a n t a j i s t a + a v u n a n t o a + a v u n a n t o j ä r j e s t e l m i ä + a v u n a n t o j ä r j e s t e l m ä + a v u n a n t o k e s t ä v y y d e k s i + a v u n a n t o m e n e t t e l y j e n + a v u n a n t o n a + a v u n a n t o o n + a v u n a n t o p y r k i m y k s i s t ä + a v u n a n t o p y r k i m y k s i ä + a v u n a n t o p y y n t ö j ä + a v u n a n t o s o p i m u k s e n + a v u n a n t o t a r j o u k s i a + a v u n h u u d o k s i + a v u n h u u t o + a v u n p y y n n ö i s t ä + a v u n p y y n n ö n + a v u n p y y n n ö s s ä + a v u n p y y n n ö t + a v u n p y y n t ö + a v u n p y y n t ö i h i n + a v u n p y y n t ö i h i n s ä + a v u n p y y n t ö j e n + a v u n p y y n t ö j e n s ä + a v u n p y y n t ö j ä + a v u n p y y n t ö m m e + a v u n p y y n t ö t a p a u k s i s s a + a v u n p y y n t ö ä + a v u n p y y n t ö ö n + a v u n s a a j a + a v u n s a a j a m a a + a v u n s a a j a m a a t + a v u n s a a j a m a a t k i n + a v u n s a a j a m a i d e n + a v u n s a a j a m a i h i n + a v u n s a a j a m a i s s a + a v u n s a a j a m a i t a + a v u n s a a j a n + a v u n s a a j a p ä ä s s ä + a v u n s a a j a t + a v u n s a a j a v a l t i o i l l e + a v u n s a a j a v a l t i o i s s a + a v u n s a a j a v a l t i o t + a v u n s a a j i a + a v u n s a a j i e n + a v u n s a a j i i n + a v u n s a a n n i n + a v u n t a r j o a m i s e n + a v u n t a r j o u k s e t + a v u n t a r j o u k s i a + a v u n t a r p e e n + a v u n t a r p e e s e e n + a v u n t a r p e e s t a + a v u n t a r v e t t a + a v u n t a r v i t s i j a + a v u n t a r v i t s i j a r y h m i ä + a v u n t a r v i t s i j o i l l e + a v u n t a r v i t s i j o i t a + a v u s s a a n + a v u s t a a + a v u s t a a k s e e n + a v u s t a a k s e m m e + a v u s t a j a a + a v u s t a j a k o i r a + a v u s t a j a k o i r a t + a v u s t a j a k o r v a u k s e n + a v u s t a j a k o r v a u k s i a + a v u s t a j a k o r v a u s t e n + a v u s t a j a k u n t a a n n e + a v u s t a j a m a a t + a v u s t a j a m a i d e n + a v u s t a j a n + a v u s t a j a t + a v u s t a j a v a l t i o i d e n + a v u s t a j i a + a v u s t a j i a n i + a v u s t a j i a n n e + a v u s t a j i e m m e + a v u s t a j i e n + a v u s t a j i i n + a v u s t a j i l l e + a v u s t a j i l l e e n + a v u s t a j i l l e k i n + a v u s t a j i l l e m m e + a v u s t a j i l t a n n e + a v u s t a j i n a + a v u s t a j i s t a + a v u s t a j i s t a k a a n + a v u s t a m a a n + a v u s t a m a l l a + a v u s t a m a t + a v u s t a m i s e e n + a v u s t a m i s e k s i + a v u s t a m i s e n + a v u s t a m i s e s t a + a v u s t a m i s k e h o t u k s i a + a v u s t a m i s t a + a v u s t a m m e + a v u s t a n u t + a v u s t a v a s t a + a v u s t a v a t + a v u s t a v i e n + a v u s t a v i l l a + a v u s t a v i l l e + a v u s t e t a a n + a v u s t e t t a v i e n + a v u s t u k s e l l a + a v u s t u k s e n + a v u s t u k s e s t a + a v u s t u k s e t + a v u s t u k s i a + a v u s t u k s i l l a + a v u s t u k s i n + a v u s t u k s i n a + a v u s t u k s i s s a + a v u s t u k s i s t a + a v u s t u s a l o i t t e e n + a v u s t u s a l u k s e e n + a v u s t u s a n o m u k s i a + a v u s t u s e l i m i e n + a v u s t u s h a k e m u s t e n + a v u s t u s h a n k e + a v u s t u s h a n k k e e t + a v u s t u s h a n k k e i s i i n + a v u s t u s h a n k k e i s t a + a v u s t u s h a n k k e i t a + a v u s t u s h a n k k e i t a m m e + a v u s t u s h e n k i l ö s t ö n + a v u s t u s j o u k o t + a v u s t u s j ä r j e s t e l m i e n + a v u s t u s j ä r j e s t e l m i ä + a v u s t u s j ä r j e s t e l m ä + a v u s t u s j ä r j e s t e l m ä l l ä + a v u s t u s j ä r j e s t e l y + a v u s t u s j ä r j e s t e l y j ä ä n + a v u s t u s j ä r j e s t ö + a v u s t u s j ä r j e s t ö i h i n + a v u s t u s j ä r j e s t ö i l l e + a v u s t u s j ä r j e s t ö i l t ä + a v u s t u s j ä r j e s t ö i s s ä + a v u s t u s j ä r j e s t ö i s t ä + a v u s t u s j ä r j e s t ö j e n + a v u s t u s j ä r j e s t ö j ä + a v u s t u s j ä r j e s t ö l t ä + a v u s t u s j ä r j e s t ö m m e + a v u s t u s j ä r j e s t ö n + a v u s t u s j ä r j e s t ö n ä + a v u s t u s j ä r j e s t ö t + a v u s t u s j ä r j e s t ö ä + a v u s t u s k e h y k s e s t ä + a v u s t u s k e i n o j e n + a v u s t u s k e i n o t + a v u s t u s k i e l t o + a v u s t u s k i e l t o o n + a v u s t u s k o k o u k s e n + a v u s t u s k o n f e r e n s s i n + a v u s t u s k o n f e r e n s s i s s a + a v u s t u s k r i t e e r i t + a v u s t u s k u l j e t u s t e n + a v u s t u s k y s y m y s + a v u s t u s k ä y n t e j ä + a v u s t u s l u p a u s t e n + a v u s t u s l ä h e t y k s e t + a v u s t u s m a h d o l l i s u u k s i a + a v u s t u s m a k s u n s a + a v u s t u s m e k a n i s m i + a v u s t u s m e k a n i s m i a + a v u s t u s m e k a n i s m i t + a v u s t u s m u o d o i s s a + a v u s t u s m u o d o i s t a + a v u s t u s m u o t o i h i n + a v u s t u s m u o t o j a + a v u s t u s m u o t o j e n + a v u s t u s m ä ä r ä r a h a t + a v u s t u s m ä ä r ä r a h o i s t a m m e + a v u s t u s m ä ä r ä r a h o j a + a v u s t u s m ä ä r ä r a h o j e n + a v u s t u s m ä ä r ä ä n + a v u s t u s o h j e l m a + a v u s t u s o h j e l m a a + a v u s t u s o h j e l m a a n + a v u s t u s o h j e l m a l l e + a v u s t u s o h j e l m a m m e + a v u s t u s o h j e l m a n + a v u s t u s o h j e l m a n s a + a v u s t u s o h j e l m a s s a + a v u s t u s o h j e l m a s s a a n + a v u s t u s o h j e l m a s t a + a v u s t u s o h j e l m a s t a a n + a v u s t u s o h j e l m a t + a v u s t u s o h j e l m i a + a v u s t u s o h j e l m i a a n + a v u s t u s o h j e l m i a m m e + a v u s t u s o h j e l m i e m m e + a v u s t u s o h j e l m i e n + a v u s t u s o h j e l m i i n + a v u s t u s o h j e l m i l l a + a v u s t u s o h j e l m i l l a m m e + a v u s t u s o h j e l m i l l e + a v u s t u s o h j e l m i s s a + a v u s t u s o h j e l m i s s a m m e + a v u s t u s o h j e l m i s t a + a v u s t u s o h j e l m i s t a a n + a v u s t u s o p e r a a t i o + a v u s t u s o p e r a a t i o i d e n + a v u s t u s o p e r a a t i o i h i n + a v u s t u s o p e r a a t i o i s t a + a v u s t u s o p e r a a t i o i t a + a v u s t u s o p e r a a t i o n + a v u s t u s o p e r a a t i o o n + a v u s t u s o p e r a a t i o s t a + a v u s t u s o p e r a a t i o t + a v u s t u s o p e r a a t i o t a + a v u s t u s o s u u s + a v u s t u s p a k e t i l l a m m e + a v u s t u s p a k e t i n + a v u s t u s p a k e t i s t a + a v u s t u s p a k e t t e j a + a v u s t u s p a k e t t i + a v u s t u s p a k k a u s t e n + a v u s t u s p a l v e l u j a + a v u s t u s p a l v e l u n + a v u s t u s p a n o k s e e n + a v u s t u s p e t o k s i a + a v u s t u s p e t o k s i s s a + a v u s t u s p o l i t i i k a n + a v u s t u s p o l i t i i k a s t a + a v u s t u s p o l i t i i k k a + a v u s t u s p o l i t i i k k a a + a v u s t u s p o l i t i i k k a a n + a v u s t u s p o l i t i i k k a n s a + a v u s t u s p o l i t i i k k o j e n + a v u s t u s p o n n i s t e l u j a + a v u s t u s p o n n i s t e l u j e n + a v u s t u s p o n n i s t e l u t + a v u s t u s p y r k i m y k s i i n + a v u s t u s p y r k i m y k s i ä + a v u s t u s p y y n t ö ä + a v u s t u s p ä ä t ö s t e n + a v u s t u s r a h a n + a v u s t u s r a h a s t o a + a v u s t u s r a h a s t o i s t a + a v u s t u s r a h a s t o l l a + a v u s t u s r a h a s t o n + a v u s t u s r a h a t + a v u s t u s r a h o i s t a + a v u s t u s r a h o i t u s t a + a v u s t u s r a h o j a + a v u s t u s r a h o j e n + a v u s t u s r e s u r s s i t + a v u s t u s r y h m i e n + a v u s t u s r y h m ä + a v u s t u s r y h m ä l l e + a v u s t u s r y h m ä n + a v u s t u s r y h m ä s s ä + a v u s t u s s i t o u m u k s e t + a v u s t u s s k a n d a a l i n + a v u s t u s s o p i m u k s e e n + a v u s t u s s o p i m u k s e n + a v u s t u s s o p i m u k s e s t a + a v u s t u s s o p i m u k s i a + a v u s t u s s t r a t e g i a + a v u s t u s s t r a t e g i a s s a + a v u s t u s s u h t e e m m e + a v u s t u s s u m m a + a v u s t u s s u m m a n + a v u s t u s s u m m a s t a + a v u s t u s s u u n n i t e l m a + a v u s t u s s u u n n i t e l m a a + a v u s t u s s u u n n i t e l m a n + a v u s t u s s u u n n i t e l m a n s a + a v u s t u s s u u n n i t e l m i a + a v u s t u s s u u n n i t e l m i e n + a v u s t u s t a + a v u s t u s t a r v i k k e e t + a v u s t u s t a r v i k k e i d e n + a v u s t u s t a r v i k k e i t a + a v u s t u s t e h t ä v i s s ä + a v u s t u s t e h t ä v ä n + a v u s t u s t e h t ä v ä s t ä + a v u s t u s t e n + a v u s t u s t e o l l i s u u s + a v u s t u s t o i m e m m e + a v u s t u s t o i m e n p i t e e t + a v u s t u s t o i m e n p i t e i d e n + a v u s t u s t o i m e n p i t e i l l e + a v u s t u s t o i m e n p i t e i t ä + a v u s t u s t o i m e t + a v u s t u s t o i m i a + a v u s t u s t o i m i a a n + a v u s t u s t o i m i e n + a v u s t u s t o i m i e n s a + a v u s t u s t o i m i i n s a + a v u s t u s t o i m i l l e + a v u s t u s t o i m i n n a n + a v u s t u s t o i m i n n o i s t a + a v u s t u s t o i m i n t a + a v u s t u s t o i m i n t a a + a v u s t u s t o i m i n t a a m m e + a v u s t u s t o i m i s s a + a v u s t u s t o i m i s t a + a v u s t u s t o i m i s t o j e n + a v u s t u s t o i m i t u s t e n + a v u s t u s t u e n + a v u s t u s t y y p p i + a v u s t u s t y ö + a v u s t u s t y ö h ö m m e + a v u s t u s t y ö h ö n + a v u s t u s t y ö l l e + a v u s t u s t y ö n + a v u s t u s t y ö n t e k i j ä + a v u s t u s t y ö n t e k i j ä l l e + a v u s t u s t y ö n t e k i j ä n + a v u s t u s t y ö n t e k i j ä t + a v u s t u s t y ö n t e k i j ä t k ä ä n + a v u s t u s t y ö n t e k i j ä ä + a v u s t u s t y ö n t e k i j ö i d e m m e + a v u s t u s t y ö n t e k i j ö i d e n + a v u s t u s t y ö n t e k i j ö i h i n + a v u s t u s t y ö n t e k i j ö i l l e + a v u s t u s t y ö n t e k i j ö i l l ä + a v u s t u s t y ö n t e k i j ö i n ä + a v u s t u s t y ö n t e k i j ö i s t ä + a v u s t u s t y ö n t e k i j ö i t ä + a v u s t u s t y ö s t ä + a v u s t u s t y ö s t ä m m e + a v u s t u s t y ö t ä + a v u s t u s t y ö t ä m m e + a v u s t u s t y ö t ä ä n + a v u s t u s v a r o j a + a v u s t u s v a r o j e n + a v u s t u s v i r r a t + a v u s t u s v ä l i n e + a v u t t o m i a + a v u t t o m u u d e n + a v u t t o m u u t e m m e + a z e r b a i d ž a n i l l e + a z e r b a i d ž a n i n + a z e r b a i d ž a n i s s a + a z e r b a i d ž a n i s t a + a z e r i t + b a a r i a l u e e n + b a a r i t u o l i + b a i j e r i l a i s e l l a + b a i j e r i l a i s e n a + b a i l a t a a n + b a k t e e r e i h i n + b a k t e e r e j a + b a k t e e r i a s e i d e n + b a k t e e r i a s e i l l a + b a k t e e r i e n + b a k t e e r i g e e n i s t ä + b a k t e e r i k a n t o j e n + b a k t e e r i o n g e l m a + b a k t e e r i o n g e l m a a + b a k t e e r i p i t o i s u u k s i a + b a k t e e r i r y h m i s t ä + b a k t e e r i t a r t u n n a n + b a k t e e r i t a u d i n + b a k t e e r i t a u t e i h i n + b a k t e e r i t o i m i n n a n + b a l e t t i f e s t i v a a l e j a + b a l e t t i r y h m ä n + b a l e t t i s a a p a s + b a l e t t i t e k n i i k k a + b a l e t t i t e r m e i s t ä + b a l e t t i t o s s u t + b a l i l a i s e t + b a l i l l a + b a l i n + b a l i n k o t t a r a i n e n + b a l i n t i i k e r i + b a l l a d i o o p p e r a + b a l s a m i e t i k k a + b a l s a p u u + b a m b a r a t + b a m b u e s i r i p p u + b a m b u k a r d i n a a l i + b a m b u l e h v ä k e r t t u + b a m b u l e s k i + b a m b u m e t s ä k e r t t u n e n + b a m b u s i e p p o k e r t t u + b a m b u s i l k k i k e r t t u n e n + b a m b u t i k k a + b a m b u v i i d a k k o h a r a k k a + b a m u m i t + b a n a a n e i s t a + b a n a a n e j a + b a n a a n i a l a + b a n a a n i a l a a + b a n a a n i a l a a n + b a n a a n i a l a l l a + b a n a a n i a l a l l e + b a n a a n i a l a n + b a n a a n i a s e t u k s e s t a + b a n a a n i a s i a + b a n a a n i a s i a s s a + b a n a a n i a s i a s t a + b a n a a n i d o l l a r e i t a + b a n a a n i d o l l a r i a l a n + b a n a a n i d o l l a r i i n + b a n a a n i d o l l a r i n + b a n a a n i d r a a m a a n + b a n a a n i e n + b a n a a n i e s i m e r k i n + b a n a a n i h a l l i t u s t a + b a n a a n i h a n k k e e l l e + b a n a a n i j u p a k k a + b a n a a n i j u t t u + b a n a a n i j u t u n + b a n a a n i j u t u s s a + b a n a a n i j ä r j e s t e l m ä + b a n a a n i j ä r j e s t e l m ä s t ä + b a n a a n i j ä r j e s t e l m ä ä + b a n a a n i j ä r j e s t e l y + b a n a a n i j ä r j e s t e l y n + b a n a a n i j ä r j e s t e l y s t ä + b a n a a n i j ä r j e s t e l y ä + b a n a a n i j ä t e i l l e + b a n a a n i k a u p a n + b a n a a n i k a u p a s s a + b a n a a n i k a u p a s t a + b a n a a n i k a u p p a a + b a n a a n i k a u p p a a m m e + b a n a a n i k a u p p a a n s a + b a n a a n i k a u p p a s o p i m u k s e l l e + b a n a a n i k a u p p a s o p i m u k s e n + b a n a a n i k a u p p a s o p i m u k s e t + b a n a a n i k a u p p a s o p i m u s + b a n a a n i k a u p p a s o p i m u s t a + b a n a a n i k e s k u s t e l u s s a + b a n a a n i k i i n t i ö i d e n + b a n a a n i k i i s t a + b a n a a n i k i i s t a a + b a n a a n i k i i s t a n + b a n a a n i k i i s t a s s a + b a n a a n i k i i s t a s t a + b a n a a n i k r i i s i + b a n a a n i k y s y m y k s e e n + b a n a a n i k y s y m y k s e n + b a n a a n i k y s y m y k s e s s ä + b a n a a n i k y s y m y k s e s t ä + b a n a a n i k ä r p ä n e n + b a n a a n i l a a t i k k o + b a n a a n i l a j e j a + b a n a a n i l i i t i n + b a n a a n i m a r k k i n a j ä r j e s t e l y + b a n a a n i m a r k k i n a j ä r j e s t e l y n + b a n a a n i m a r k k i n a t + b a n a a n i m a r k k i n o i d e n + b a n a a n i m a r k k i n o i h i n + b a n a a n i m a r k k i n o i l l a + b a n a a n i m a r k k i n o i l l e + b a n a a n i m a r k k i n o i s t a + b a n a a n i m a r k k i n o i t a + b a n a a n i n + b a n a a n i n e u v o t t e l u j e n + b a n a a n i n k a s v a t t a j i e n + b a n a a n i n k a s v a t u s a l u e i l l a + b a n a a n i n k u o r t e n + b a n a a n i n s a + b a n a a n i n t o i m i t t a j a t + b a n a a n i n t o i m i t t a j i l l e + b a n a a n i n t u o n n i l l e + b a n a a n i n t u o n n i n + b a n a a n i n t u o n n i s t a + b a n a a n i n t u o n t i a + b a n a a n i n t u o n t i i n + b a n a a n i n t u o n t i p o l i t i i k k a + b a n a a n i n t u o t a n n o l l a + b a n a a n i n t u o t a n n o l l e + b a n a a n i n t u o t a n n o n + b a n a a n i n t u o t a n n o s t a + b a n a a n i n t u o t a n t o + b a n a a n i n t u o t a n t o a + b a n a a n i n t u o t a n t o a l u e i d e n + b a n a a n i n t u o t a n t o a l u e i l l a + b a n a a n i n t u o t a n t o a l u e i l l e + b a n a a n i n t u o t a n t o a l u e i s t a + b a n a a n i n t u o t a n t o o n + b a n a a n i n t u o t t a j a m a a t + b a n a a n i n t u o t t a j a m a i l l e + b a n a a n i n t u o t t a j a m a i s t a + b a n a a n i n t u o t t a j a m a i t a + b a n a a n i n t u o t t a j a m m e + b a n a a n i n t u o t t a j a t + b a n a a n i n t u o t t a j a v a l t i o i d e n + b a n a a n i n t u o t t a j a v a l t i o i l l e + b a n a a n i n t u o t t a j a v a l t i o i t a + b a n a a n i n t u o t t a j i a + b a n a a n i n t u o t t a j i a m m e + b a n a a n i n t u o t t a j i e n + b a n a a n i n t u o t t a j i i n + b a n a a n i n t u o t t a j i l l a + b a n a a n i n t u o t t a j i l l e + b a n a a n i n t u o t t a j i l l e m m e + b a n a a n i n v i e j i e n + b a n a a n i n v i e j i l l e + b a n a a n i n v i e j i ä + b a n a a n i n v i e j ä m a i t a + b a n a a n i n v i e j ä t + b a n a a n i n v i e n t i a l a n + b a n a a n i n v i l j e l i j ö i d e n s ä + b a n a a n i n v i l j e l i j ö i l l e + b a n a a n i n v i l j e l i j ö i t ä + b a n a a n i n v i l j e l y + b a n a a n i n v i l j e l y a l a n s a + b a n a a n i n v i l j e l y n + b a n a a n i n ä r h i + b a n a a n i o n g e l m a + b a n a a n i o n g e l m a n + b a n a a n i o s t o k s i l l a + b a n a a n i p a n e e l i + b a n a a n i p a n e e l i n + b a n a a n i p a n e e l i s t a + b a n a a n i p l a n t a a s e j a + b a n a a n i p o h a t t o j e n + b a n a a n i p o l i t i i k k a a n + b a n a a n i p ä ä t ö s + b a n a a n i r i i d a n + b a n a a n i r i i t a a + b a n a a n i r y h m ä ä n + b a n a a n i s a d o s t a + b a n a a n i s a d o t + b a n a a n i s a t o i h i n + b a n a a n i s o d a n + b a n a a n i s o d a s s a + b a n a a n i s o d a s t a + b a n a a n i s o p i m u k s i s t a + b a n a a n i s o t a + b a n a a n i s o t a a + b a n a a n i s ä ä d ö k s e l l e + b a n a a n i s ä ä n n ö s t e l y j ä r j e s t e l m ä + b a n a a n i t + b a n a a n i t a p a u s + b a n a a n i t a r j o n n a n + b a n a a n i t a r j o n t a + b a n a a n i t a s a v a l l a k s i + b a n a a n i t a s a v a l l a n + b a n a a n i t a s a v a l t a + b a n a a n i t a s a v a l t a a + b a n a a n i t a s a v a l t a n a + b a n a a n i t a s a v a l t i o i h i n + b a n a a n i t a s a v a l t o j a + b a n a a n i t e o l l i s u u d e n + b a n a a n i t o i m i t u k s e t + b a n a a n i t o n n i a + b a n a a n i t o n n i l t a + b a n a a n i t u l l e i s t a + b a n a a n i t u l l e j a + b a n a a n i t u l l e j a a n + b a n a a n i t u l l i t + b a n a a n i t u o t a n n o s s a + b a n a a n i t u o t a n t o + b a n a a n i t u o t a n t o n s a + b a n a a n i t u o t a n t o o n + b a n a a n i t y ö l ä i s i ä + b a n a a n i v a l t i o i d e n + b a n a a n i v a l t i o n + b a n a a n i v a l t i o s s a + b a n a a n i v i l j e l m i l l ä ä n + b a n a a n i v i l j e l m i s t ä + b a n a a n i v i l j e l m ä + b a n a a n i v i l j e l y k s i ä + b a n a a n i v o d k a k s i + b a n a a n i v o i t a + b a n a a n i y h t i ö + b a n a a n i y l i j ä ä m ä + b a n a a n i y r i t y k s e l t ä + b a n a a n i y r i t y s t ä + b a n a l i s o i n t i a + b a n d a n m e r i + b a n d a n v i h e r m e s i k k o + b a n d a s a a r e t + b a n n e r i m a i n o n t a + b a n t u k i e l e t + b a n t u t + b a p t i s t i k i r k k o + b a p t i s t i k o n v e n t i o + b a p t i s t i p a p p i + b a p t i s t i p a p p i e n + b a p t i s t i y h t e i s ö n + b a r a h o n a + b a r b a a r e i s t a + b a r b a a r i e n + b a r b a a r i m a i s u u t t a + b a r b a a r i s e m p i + b a r b a a r i s e n + b a r b a a r i s i l l e + b a r b a a r i s t a + b a r b a a r i s u u d e s t a a n + b a r b a r i a a + b a r b a r i a a n + b a r b a r i s m i a + b a r b a r i s m i i n + b a r b i e n + b a r b i t u u r i h a p p o + b a r g a t + b a r i t o n i k i t a r a + b a r i t o n i t o r v i + b a r i u m a s e t a a t t i + b a r i u m b r o m i d i + b a r i u m h y d r o k s i d i + b a r i u m k a r b o n a a t t i + b a r i u m k l o r i d i + b a r i u m o k s i d i + b a r i u m s u l f a a t t i + b a r i u m s u l f i d i + b a r i u m t i t a n a a t t i + b a r i u m t ä h t i + b a r n i e r i i n + b a r n i e r i l l e + b a r n i e r i n + b a r o k k i m u s i i k k i + b a r o k k i s ä v e l t ä j i s t ä + b a r o k k i t a i d e t t a + b a r o k k i v i u l u + b a r o m e t r e i l l e + b a r r e l i h i n t a + b a r r e l i l t a + b a r r i k a d e i l t a m m e + b a r r o s o + b a r r o s o a + b a r r o s o l l a + b a r r o s o l l e + b a r r o s o l t a + b a r r o s o n + b a r r o s o n k i n + b a r r o s o o n + b a r r o s o s t a + b a r r o t i n + b a s e b a l l m a a j o u k k u e + b a s e b a l l m a i l a + b a s k e i l l e + b a s k e i l t a + b a s k e i s t a + b a s k i a l u e e l l a + b a s k i a l u e e l l e + b a s k i a l u e e l t a + b a s k i e n + b a s k i e n p a i m e n k o i r a + b a s k i e n r o t t a t e r r i e r i + b a s k i h a l l i t u k s e n + b a s k i h a l l i t u s + b a s k i j ä r j e s t ö ä + b a s k i k a l a s t a j a t + b a s k i k a l a s t a j i e n + b a s k i k a n s a + b a s k i k a n s a a + b a s k i k a n s a l a i s t e n + b a s k i k a n s a n + b a s k i k o n f l i k t i i n + b a s k i k o n f l i k t i n + b a s k i k y l ä n + b a s k i k y s y m y k s e n + b a s k i l a i s e s s a + b a s k i l i i k e m i e h i l l e + b a s k i m a a + b a s k i m a a h a n + b a s k i m a a k u n n a s s a + b a s k i m a a l a i s t a + b a s k i m a a l l a + b a s k i m a a l l e + b a s k i m a a n + b a s k i m a a s s a + b a s k i m a a s t a + b a s k i m a a t a + b a s k i n + b a s k i n a t i o n a l i s m i n + b a s k i n a t i o n a l i s t i t + b a s k i n k i e l i n e n + b a s k i n k i e l i s e n + b a s k i n k i e l i s t ä + b a s k i o n g e l m a + b a s k i p a k o l a i s i a + b a s k i p a r l a m e n t i n + b a s k i p o l i i s i m m e + b a s k i t + b a s k i t e r r o r i s m i a + b a s k i t e r r o r i s t e j a + b a s k i t e r r o r i s t i t + b a s k i t o i m i t t a j a + b a s k i v a s e m m i s t o a + b a s k i y h t e i s k u n n a l l e + b a s k i y h t e i s k u n t a + b a s k i y h t e i s ö + b a s k i y h t e i s ö n + b a s k i y r i t y k s i l l e + b a s k i ä ä r i l i i k k e i d e n + b a s m a t i r i i s i n + b a s s i n s a l m i + b a s s o b a r i t o n i + b a s s o j a l k i o + b a s s o k i t a r a + b a s s o k l a r i n e t t i + b a s s o r u m p u + b a s t a r d i j ä n n e + b a s t a r d i k i l p i k o n n a + b a s t i o n i j ä r j e s t e l m ä + b e a g l e n s a l m i + b e a t m u s i i k k i + b e d l i n g t o n i n t e r r i e r i + b e d u i i n i k a u p u s t e l i j o i d e n + b e d ž a t + b e e t a g a m m a s ä t e i l y n + b e e t a g l u k a a n i + b e e t a h a j o a m i n e n + b e e t a i n t e r f e r o n i + b e e t a i n t e r f e r o n i a + b e e t a k a r o t e e n i + b e e t a l a k t o g l o b u l i i n i + b e e t a s a l p a a j a + b e e t a s o l u + b e l e t i n + b e l g i a l a i s e n + b e l g i a l a i s e t + b e l g i a l a i s i a + b e l g i a l a i s i l l a + b e l g i a l a i s i l l e + b e l g i a l a i s j ä s e n + b e l g i a l a i s j ä s e n e n + b e l g i a l a i s k o l l e g o i l l e n i + b e l g i a l a i s t e n + b e l g i a s s a + b e l u t š i t + b e n e d i k t i i n i t + b e n g a l i n k e t t u + b e n g a l i n k o r p p i k o t k a + b e n g a l i n k u t o j a + b e n g a l i n l a h d e l l a + b e n g a l i n l a h t i + b e n g a l i n t r a p p i + b e n g a l i t + b e n g a l i v a l t i o n a + b e n i n i l ä i s i ä + b e n s a p u m p u n + b e n s a t a n k k i + b e n s a t u r i s m i + b e n s a t u r i s m i a + b e n s a t u r i s m i i n + b e n s i i n i a d d i k t e j a + b e n s i i n i a s e m a k s i + b e n s i i n i a s e m i a + b e n s i i n i a s e m i e n + b e n s i i n i a s e m i l l a + b e n s i i n i a s e m i l l e + b e n s i i n i a u t o j a + b e n s i i n i h ö y r y j e n + b e n s i i n i h ö y r y n + b e n s i i n i h ö y r y ä + b e n s i i n i k ä y t t ö i s i s s ä + b e n s i i n i k ä y t t ö i s t e n + b e n s i i n i l a s i l l i s t a + b e n s i i n i l l ä + b e n s i i n i m o o t t o r e i d e n + b e n s i i n i m o o t t o r e i h i n + b e n s i i n i m o o t t o r i + b e n s i i n i m o o t t o r i e n + b e n s i i n i n + b e n s i i n i o s i a + b e n s i i n i p u l a + b e n s i i n i p u m p u t + b e n s i i n i t a n k k e r i + b e n s i i n i t u o t t e i d e n + b e n s i i n i v e r o l l a + b e n s i i n i ä + b e n t s e e n i k s i + b e n t s e e n i k u o r m i t u s t a + b e n t s e e n i l l e + b e n t s e e n i p i t o i s u u k s i l l e + b e n t s e e n i p i t o i s u u s + b e n t s e e n i p ä ä s t ö j e n + b e n t s e e n i p ä ä s t ö j ä + b e n t s e e n i r a j o j e n + b e n t s y y l i a l k o h o l i + b e n t s y y l i a s e t a a t t i + b e n t s y y l i b e n t s o a a t t i + b e n t s y y l i k l o r i d i + b e r b e r i h e v o n e n + b e r b e r i j u u t a l a i s e t + b e r b e r i k i e l e t + b e r b e r i s k i n k k i + b e r b e r i t + b e r b e r i v ä e s t ö + b e r b e r i y h t e i s ö n + b e r l i i n i l ä i s t e n + b e r y l l i u m f l u o r i d i + b e r y l l i u m k l o r i d i + b e r y l l i u m o k s i d i + b e s t s e l l e r e i t ä + b e s t s e l l e r i e n + b e t o n i e s t e e l l ä + b e t o n i i n + b e t o n i l l a + b e t o n i m u u r i + b e t o n i m y l l y + b e t o n i n + b e t o n i p a d o n + b e t o n i p o r s a s + b e t o n i t e o l l i s u u d e s t a + b e t o n i v a n k i l a + b e t o n i v i i d a k k o + b e t o n i y ö + b i d e g a i n i a + b i f e n y y l e j ä + b i l a t e r a a l i k a u p p a + b i l a t e r a a l i k e s k u s t e l u j a + b i l a t e r a a l i s o p i m u k s e t + b i l j a r d i h a i t + b i n o m i j a k a u m a + b i n o m i k e r r o i n + b i n o m i l a u s e + b i n o m i t o d e n n ä k ö i s y y s + b i n ä ä r i j ä r j e s t e l m ä + b i n ä ä r i o p e r a a t i o + b i n ä ä r i o p t i o t + b i n ä ä r i p u u + b i n ä ä r i r e l a a t i o + b i n ä ä r i t i e d o s t o + b i o a n a l y y t i k k o + b i o a s e k o n v e n t i o + b i o d i e s e l a l a + b i o d i e s e l i n + b i o d i e s e l i ä + b i o d i e s e l o h j e l m a n + b i o d i e s e l p o l t t o a i n e t t a + b i o d i e s e l y r i t y s t e n + b i o d i v e r s i t e e t i n + b i o d i v e r s i t e e t t i h a n k k e i d e n + b i o d i v e r s i t e e t t i k a d o n + b i o d i v e r s i t e e t t i k a t o a + b i o d i v e r s i t e e t t i s o p i m u s + b i o d i v e r s i t e e t t i y l e i s s o p i m u s + b i o e e t t i n e n + b i o e e t t i s i ä + b i o e n e r g i a + b i o e n e r g i a a + b i o e n e r g i a a n + b i o e n e r g i a k s i + b i o e n e r g i a l l a + b i o e n e r g i a n + b i o e n e r g i a t u o t a n n o n + b i o e n e r g i a t u o t a n n o s t a + b i o e n e r g i a t u o t a n t o + b i o e t a n o l i + b i o e t a n o l i a + b i o e t a n o l i a l a + b i o e t a n o l i n + b i o e t a n o l i n t u o t a n n o n + b i o e t a n o l i o h j e l m a + b i o e t a n o l i s t a + b i o e t a n o l i t e o l l i s u u d e n + b i o e t a n o l i t e o l l i s u u t t a + b i o e t i i k a n + b i o e t i i k k a + b i o e t i i k k a s o p i m u k s e e n + b i o e t i i k k a s o p i m u k s e n + b i o g e n e t i i k a n + b i o g e n e t i i k k a + b i o g e o m e t r i a t u t k i j a a + b i o h a j o a v a n + b i o j ä t e + b i o j ä t e h u o l l o n + b i o j ä t e h u o l t o + b i o j ä t e h u o l t o a + b i o j ä t e k e r ä y k s e e n + b i o j ä t e t t ä + b i o j ä t t e e s t ä + b i o j ä t t e e t + b i o j ä t t e i d e n + b i o j ä t t e i t ä + b i o k a a s u a + b i o k a a s u a s e m i e n + b i o k a a s u d i r e k t i i v i + b i o k a a s u d i r e k t i i v i ä + b i o k a a s u k a s v i a + b i o k a a s u k a s v i e n + b i o k a a s u l a i t o k s e e n + b i o k a a s u l a i t o k s i a + b i o k a a s u l a i t o k s i i n + b i o k a a s u l a i t o k s i l l e + b i o k a a s u l a i t o k s i s s a + b i o k a a s u l a i t o s t e n + b i o k a a s u l l a + b i o k a a s u m a r k k i n a t + b i o k a a s u n + b i o k a a s u p o l i t i i k k a a + b i o k a a s u s e k t o r i + b i o k a a s u t e k n o l o g i a + b i o k a a s u t u o t a n n o n + b i o k a a s u t u o t a n t o + b i o k a a s u t u o t a n t o o n + b i o k e m i a l l i n e n + b i o k e m i k a a l e i h i n + b i o k e r t y v i ä + b i o k e r t y v ä t + b i o l o g i a n + b i o l o g i s e n + b i o l o g i s e s t a + b i o l o g i s e t + b i o l o g i s i a + b i o l o g i s t a + b i o l o g i s t e n + b i o l ä ä k e t i e d e + b i o l ä ä k e t i e t e e n + b i o l ä ä k e t i e t e e s s ä + b i o m a a t a l o u s + b i o m a a t a l o u t t a + b i o m a s s a + b i o m a s s a a + b i o m a s s a a n + b i o m a s s a e n e r g i a + b i o m a s s a l a i t o k s i a + b i o m a s s a l ä h t e i t ä + b i o m a s s a l ä m m i t y s + b i o m a s s a n + b i o m a s s a o h j e l m i e n + b i o m a s s a p o l t t o a i n e + b i o m a s s a p o l t t o a i n e i t a + b i o m a s s a t o i m i n t a s u u n n i t e l m a a n + b i o m a s s a t o i m i n t a s u u n n i t e l m a s s a + b i o m a s s a t u o t a n n o n + b i o m a s s a t u o t a n t o + b i o m a s s a v o i m a l o i d e n + b i o m a s s a y d i n v o i m a l o i t a + b i o m e r k i n t ä ä + b i o m e t a a n i a + b i o m e t r i s e t + b i o m e t r i s i l l ä + b i o m e t r i s i s t ä + b i o m e t r i s i ä + b i o m e t r i s t e n + b i o m e t s ä m a s s a a + b i o m o l e k y y l e j ä + b i o m o n i t o r o i n n i n + b i o m u o v i l l a + b i o p a l a m i n e n + b i o p a t e n t t i d i r e k t i i v i i n + b i o p a t e n t t i d i r e k t i i v i n + b i o p i r a t i s m i a + b i o p i r a t i s m i l t a + b i o p o h j a i s i a + b i o p o l t t o a i n e a l a + b i o p o l t t o a i n e a l a a + b i o p o l t t o a i n e a l a s t a + b i o p o l t t o a i n e d i r e k t i i v i + b i o p o l t t o a i n e d i r e k t i i v i n + b i o p o l t t o a i n e e t + b i o p o l t t o a i n e h a n k k e i s i i n + b i o p o l t t o a i n e i d e n + b i o p o l t t o a i n e i l l a + b i o p o l t t o a i n e i s i i n + b i o p o l t t o a i n e i s t a + b i o p o l t t o a i n e i t a + b i o p o l t t o a i n e k a s v i e n + b i o p o l t t o a i n e k a s v i n + b i o p o l t t o a i n e k y s y m y k s e s s ä + b i o p o l t t o a i n e k y s y m y k s e s t ä + b i o p o l t t o a i n e l i t r a n + b i o p o l t t o a i n e m a r k k i n o i d e n + b i o p o l t t o a i n e o h j e l m a + b i o p o l t t o a i n e p o l i t i i k a n + b i o p o l t t o a i n e p o l i t i i k k a + b i o p o l t t o a i n e p o l i t i i k k a a + b i o p o l t t o a i n e p u m p u t + b i o p o l t t o a i n e r i i p p u v u u t e e n + b i o p o l t t o a i n e r y n t ä y s t ä + b i o p o l t t o a i n e s e i k k a i l u s t a + b i o p o l t t o a i n e s e k o i t u s t e n + b i o p o l t t o a i n e s t r a t e g i a a n + b i o p o l t t o a i n e s t r a t e g i a n + b i o p o l t t o a i n e t a v o i t e t t a + b i o p o l t t o a i n e t a v o i t t e e s t a + b i o p o l t t o a i n e t e o l l i s u u d e n + b i o p o l t t o a i n e t e o l l i s u u s + b i o p o l t t o a i n e t t a + b i o p o l t t o a i n e t u o t a n n o l l a + b i o p o l t t o a i n e t u o t a n n o l l e + b i o p o l t t o a i n e t u o t a n n o n + b i o p o l t t o a i n e t u o t a n n o s t a + b i o p o l t t o a i n e t u o t a n t o + b i o p o l t t o a i n e t u o t a n t o a + b i o p o l t t o a i n e t u o t a n t o o n + b i o p o l t t o a i n e t u o t t e e t + b i o p o l t t o n e s t e i d e n + b i o r e s u r s s i e n + b i o r o s v o u k s e s t a + b i o s f ä ä r i a l u e + b i o s f ä ä r i a l u e e s t a + b i o s i d i a + b i o s i d i a j a t u s + b i o s i d i a l a + b i o s i d i d i r e k t i i v i + b i o s i d i d i r e k t i i v i n + b i o s i d i d i r e k t i i v i ä + b i o s i d i t + b i o s i d i t e o l l i s u u s + b i o s i d i t u o t e t t a + b i o s i d i t u o t t e e t + b i o s i d i t u o t t e i d e n + b i o s i d i t u o t t e i s i i n + b i o s i d i t u o t t e i s s a + b i o s i d i t u o t t e i s t a + b i o s i d i t u o t t e i t a + b i o s i d i v a l m i s t e i l l e + b i o s i d i v a l m i s t e i s s a + b i o t a l o u d e n + b i o t a l o u s + b i o t e k n i i k a n + b i o t e k n i i k a s s a + b i o t e k n i i k a s t a + b i o t e k n i i k k a a + b i o t e k n i i k k a s t r a t e g i a s s a + b i o t e k n i i k k a t e o l l i s u u d e n + b i o t e k n i i k k a t e o l l i s u u s + b i o t e k n i i k k a t e o l l i s u u t t a + b i o t e k n i i k k a y r i t y s t e n + b i o t e k n o l o g i a + b i o t e k n o l o g i a a + b i o t e k n o l o g i a d i r e k t i i v i n + b i o t e k n o l o g i a n + b i o t e k n o l o g i a s e k t o r i + b i o t e k n o l o g i a s e k t o r i i n + b i o t e k n o l o g i a s e k t o r i n + b i o t e k n o l o g i a s t a + b i o t e k n o l o g i a t e o l l i s u u d e l l e + b i o t e k n o l o g i a t e o l l i s u u d e n + b i o t e k n o l o g i a t e o l l i s u u t t a + b i o t e k n o l o g i a t u o t t e i d e n + b i o t e k n o l o g i a y h t i ö i l l e + b i o t e k n o l o g i a y r i t y k s i s t ä + b i o t e k n o l o g i a y r i t y s t e n + b i o t e k n o l o g i a y r i t y s t ä + b i o t e k n o l o g i s e n + b i o t e k n o l o g i s t e n + b i o t e o l l i s u u s + b i o t e o l l i s u u t t a k i n + b i o t e r r o r i s m i + b i o t e r r o r i s m i a + b i o t e r r o r i s m i h y ö k k ä y k s e l l ä + b i o t e r r o r i s m i i n + b i o t e r r o r i s m i k y s y m y k s e e n + b i o t e r r o r i s m i l t a + b i o t e r r o r i s m i n + b i o t e r r o r i s m i o n g e l m a n + b i o t e r r o r i s m i s t a + b i o t e r r o r i s t i e n + b i o t i e t e e n + b i o t i e t e e t + b i o t i e t e i d e n + b i o t i e t e i l l e + b i o t i e t e i s i i n + b i o t i e t e i s s ä + b i o t i e t e i s t ä + b i o t i e t e i t ä + b i o t u n n i s t e t i e t o j a + b i o t u r v a l l i s u u d e n + b i o t u r v a l l i s u u s j ä r j e s t e l m ä n + b i o t u r v a l l i s u u s p ö y t ä k i r j a + b i o t u r v a l l i s u u s p ö y t ä k i r j a a n + b i o t u r v a l l i s u u s p ö y t ä k i r j a n + b i o t u r v a l l i s u u s p ö y t ä k i r j a s s a + b i o t u r v a l l i s u u s p ö y t ä k i r j a s t a + b i o t u r v a l l i s u u s t o i m e n p i t e e t + b i o t u r v a l l i s u u t t a + b i s e k s u a a l e j a + b i s e k s u a a l i l i p p u + b i s e k s u a a l i p o r n o g r a f i a + b i s m a r c k i n m e r e n + b i s m a r c k i n m e r i + b i s m a r c k i n m o n a r k k i + b i s m a r c k i n p u n a m e s i k k o + b i s m a r c k i n p ö l l ö + b i s m a r c k i n s a a r e t + b i s n e s e n k e l e i t ä + b i s n e s e n k e l i + b i s n e s i d e o l o g i a l l e + b i s n e s l u o k a s s a + b i s n e s m a a i l m a l l a + b i t t i k a r t t a g r a f i i k k a + b i t t i v e r o s t a + b i t t i v i r r a s s a + b i t u m i k a r t e l l i s t a + b i t u m i l i u s k e + b i t u m i l i u s k e e s t a + b i t u m i t u o t t e i t a + b i t u m i ö l j y n + b l o g i e n + b l o g i n p i t ä j i ä + b l o k k a u k s e e n + b l o k k i j ä r j e s t e l m ä n + b l o k k i p u o l u e + b l o k k i s i i r t o + b l u e s k a a v a + b o d o m i n j ä r v e n + b o d o m i n j ä r v i + b o f o r i a s t e i k k o + b o i k o t t e j a + b o i k o t t i l i n j a a + b o i k o t t i p o l i t i i k a n + b o i k o t t i t o i m e t + b o i k o t t i v a a t i m u k s e t + b o k s a r i k a p i n a + b o k s a r i p ö y t ä k i r j a + b o k s e r i k a p i n a + b o k s e r i m o o t t o r i + b o k s e r i t + b o l e a + b o l e n + b o l i v i a l a i s e t k i n + b o l s h e v i k k i p u o l u e i d e n + b o l š e v i k k i a r m e i j a + b o n g o r u m m u t + b o n u k s i a a n + b o n u k s i i n + b o n u k s i s t a + b o n u s j ä r j e s t e l m i e n + b o n u s j ä r j e s t e l m i ä + b o n u s j ä r j e s t e l m ä + b o n u s j ä r j e s t e l m ä s t ä + b o n u s k u l t t u u r i + b o n u s k y s y m y s + b o n u s m e k a n i s m i t + b o n u s p i s t e i t ä + b o n u s p o t t e i h i n + b o n u s t e n + b o o r i h a p p o + b o o r i k a r b i d i + b o o r i r y h m ä + b o o r i t r i b r o m i d i + b o o r i t r i k l o r i d i + b o o r i t r i o k s i d i + b o r d e l l i k a u p u n g i t + b o r d e l l i n p i t ä j i l l e + b o r d e l l i n p i t ä j i s t ä + b o r d e l l i t e o l l i s u u d e n + b o s n i a a n + b o s n i a l a i s e t + b o s n i a l a i s i l l e + b o s n i a l l e + b o s n i a l t a + b o s n i a n + b o s n i a n m ä n t y + b o s n i a n p o n i + b o s n i a s s a + b o s n i a s t a + b o s t o n i n t e r r i e r i + b o t i l t a + b r a h m a n p ö l l ö + b r a m i i n i k o t t a r a i n e n + b r a n d i n i m i ä + b r a s i l i a l a i s e t + b r a s i l i a l a i s t a + b r i e n + b r i e t ä + b r i l j a n t t i m u s t a + b r i t e i l l e + b r i t e i l t ä + b r i t i t + b r i t i t k i n + b r i t t e i n ä + b r i t t i a g e n t t i e n + b r i t t i a l e n n u k s e e n + b r i t t i a l e n n u k s e k s i + b r i t t i a l e n n u k s e n + b r i t t i a l e n n u k s e s t a + b r i t t i a l e n n u s + b r i t t i a l e n n u s t a + b r i t t i a r m e i j a n + b r i t t i a s i a k a s + b r i t t i a s i a n t u n t i j a t + b r i t t i d i p l o m a a t t i + b r i t t i d i p l o m a a t t i a + b r i t t i e d u s t a j a + b r i t t i e d u s t a j a n a + b r i t t i e d u s t a j i e n + b r i t t i e n + b r i t t i e n g l a n t i + b r i t t i h a l l i n t o v u o d e n + b r i t t i h a l l i t u k s e e n + b r i t t i h a l l i t u k s e l l e + b r i t t i h a l l i t u k s e l t a + b r i t t i h a l l i t u k s e n + b r i t t i h a l l i t u s + b r i t t i h a l l i t u s t a + b r i t t i h e r k k u a + b r i t t i h e r r a s m i e h e n + b r i t t i h u u m o r i a + b r i t t i h u u m o r i n + b r i t t i h y v i t y k s e n + b r i t t i h y v i t y s + b r i t t i h y v i t y s t ä + b r i t t i j o u k k o j e n + b r i t t i j o u k o i s t a + b r i t t i j o u k o t + b r i t t i j ä s e n + b r i t t i j ä s e n e n ä + b r i t t i j ä s e n e t + b r i t t i j ä s e n t e n + b r i t t i k a n s a l a i s e t + b r i t t i k a n s a l a i s i a + b r i t t i k a n s a l a i s i l l e + b r i t t i k a n s a n e d u s t a j i s t a + b r i t t i k e t j u n + b r i t t i k i r j a i l i j a + b r i t t i k o h t e i s i i n + b r i t t i k o l l e g a m m e + b r i t t i k o l l e g a n i + b r i t t i k o l l e g a t + b r i t t i k o l l e g o i h i n i + b r i t t i k o l l e g o i s t a n i + b r i t t i k o l l e g o i t a n i + b r i t t i k o l l e g o j a n n e + b r i t t i k o m e d i a + b r i t t i k o m i s s a a r i n + b r i t t i k o n s e r v a t i i v e i h i n + b r i t t i k o n s e r v a t i i v e i l l e + b r i t t i k o n s e r v a t i i v e j a + b r i t t i k o n s e r v a t i i v i + b r i t t i k o n s e r v a t i i v i e n + b r i t t i k o n s e r v a t i i v i k o l l e g a n i + b r i t t i k o n s e r v a t i i v i k o l l e g o i s t a m m e + b r i t t i k o n s e r v a t i i v i l l e + b r i t t i k o n s e r v a t i i v i n + b r i t t i k o n s e r v a t i i v i n a + b r i t t i k o n s e r v a t i i v i r y h m ä n + b r i t t i k o n s e r v a t i i v i t + b r i t t i k o n s e r v a t i i v i v a l t u u s k u n t a n i + b r i t t i k u l j e t t a j a a + b r i t t i k u l t t u u r i a + b r i t t i k u l u t t a j a n + b r i t t i k u l u t t a j i a + b r i t t i k u s k i a + b r i t t i l e h d e s t ä + b r i t t i l e h d e t + b r i t t i l e h d i s s ä + b r i t t i l e h d i s t ä + b r i t t i l e h d i s t ö + b r i t t i l e h d i s t ö l l e + b r i t t i l e h d i s t ö n + b r i t t i l e h d i s t ö s s ä + b r i t t i l e h m ä s t ä + b r i t t i l e h t i + b r i t t i l e i v ä n + b r i t t i l i h a + b r i t t i l i h a a + b r i t t i l i h a n + b r i t t i l ä i s e e n + b r i t t i l ä i s e l t ä + b r i t t i l ä i s e n + b r i t t i l ä i s e s s ä + b r i t t i l ä i s e s t ä + b r i t t i l ä i s e t + b r i t t i l ä i s i i n + b r i t t i l ä i s i l l e + b r i t t i l ä i s t e n + b r i t t i l ä i s t ä + b r i t t i l ä i s y r i t y k s e s t ä + b r i t t i m a a n v i l j e l i j ä t + b r i t t i m a a n v i l j e l i j ö i l l e + b r i t t i m a a n v i l j e l i j ö i t ä + b r i t t i m a r k k i n o i l l e + b r i t t i m i e h i l l e + b r i t t i m i e s + b r i t t i m i n i s t e r i + b r i t t i m i n i s t e r i e n + b r i t t i m o p o j e n + b r i t t i n a u d a n l i h a a + b r i t t i n a u d a n l i h a n + b r i t t i n a u d a n l i h a s t a + b r i t t i n a u d a s t a + b r i t t i p a r l a m e n t i n + b r i t t i p e d o f i i l i e n + b r i t t i p o l i i t i k k o j e n + b r i t t i p o l i t i i k k o j e n + b r i t t i p r o f e s s o r i a + b r i t t i p u h e e n j o h t a j a + b r i t t i p u h e e n j o h t a j i s t o + b r i t t i p u h e e n j o h t a j i s t o n + b r i t t i p u h u j a n + b r i t t i r u n o i l i j a + b r i t t i r y h m i l l e + b r i t t i r y h m ä l l e n i + b r i t t i s a n o m a l e h d i s s ä + b r i t t i s a n o m a l e h t i + b r i t t i s o t i l a a t + b r i t t i s o t i l a i d e m m e + b r i t t i s o t i l a i d e n + b r i t t i s o t i l a i t a + b r i t t i s o t i l a s t a + b r i t t i s u k e l l u s v e n e + b r i t t i t e u r a s t a m o t + b r i t t i t i e d o t u s v ä l i n e e t + b r i t t i t o i m i t t a j a + b r i t t i t o i m i t t a j a n + b r i t t i t u k i k o h d a s s a + b r i t t i t u t k i j a t + b r i t t i t y y l i s e n + b r i t t i t y ö n t e k i j ä t + b r i t t i u p s e e r i t + b r i t t i v a l t u u s k u n t a + b r i t t i v a n g i t + b r i t t i v a p a a e h t o i s i a + b r i t t i v e r o n m a k s a j i e n + b r i t t i v i l j e l i j ö i s t ä + b r i t t i v i r a n o m a i s e t + b r i t t i v i r a n o m a i s i a + b r i t t i v i r a n o m a i s i l l e + b r i t t i v i r a n o m a i s t e n + b r i t t i v i r k a m i e h e n + b r i t t i v i r k a m i e s + b r i t t i v i r k a m i e s t e n + b r i t t i y h t e i s k u n n a s s a + b r i t t i y l e i s ö + b r i t t i y l e i s ö n + b r i t t i y l i j ä ä m ä l i h a n + b r i t t i y r i t t ä j ä + b r i t t i y r i t y k s e t + b r i t t i y r i t y k s i ä + b r i t t i y r i t y s t e n + b r i t t i y s t ä v i ä m m e + b r i t t i y s t ä v ä m m e + b r i t t i y s t ä v ä n i + b r i t t i ä ä n e s t ä j i e n + b r o i l e r e i d e n + b r o i l e r e i s t a + b r o i l e r e i t a + b r o i l e r i n k a s v a t t a j a t + b r o i l e r i n t u o t a n n o l l e + b r o i l e r i n t u o t t a j i a + b r o i l e r i t + b r o i l e r i t u o t a n n o l l e + b r o m a t t u a + b r o m a t t u j e n + b r o m a t u i l l a + b r o m a t u i l l e + b r o m a t u i s t a + b r o m a t u n + b r o m a t u t + b r o m i e t i k k a h a p p o + b r o m i f e n o l i s i n i n e n + b r o m i k r e s o l i v i h r e ä + b r o m i k r e s o l i v i o l e t t i + b r o m i p e n t a f l u o r i d i + b r o m i p i t o i n e n + b r o m i p i t o i s i a + b r o m i p i t o i s i s t a + b r o m i t y m o l i s i n i n e n + b r u t a a l e i l l e + b r u t a a l e i n + b r u t o n + b r u t t o a r v o n + b r u t t o a r v o n a + b r u t t o a r v o n l i s ä y k s e s t ä + b r u t t o h i n n a t + b r u t t o i n v e s t o i n n e i s t a + b r u t t o k a n s a n o n n e l l i s u u s + b r u t t o k a n s a n t u l o + b r u t t o k a n s a n t u l o a + b r u t t o k a n s a n t u l o j e n + b r u t t o k a n s a n t u l o n + b r u t t o k a n s a n t u l o o n + b r u t t o k a n s a n t u l o s t a + b r u t t o k a n s a n t u l o s t a a n + b r u t t o k a n s a n t u l o s t a m m e + b r u t t o k a n s a n t u l o v a r o i s t a + b r u t t o k a n s a n t u o t e + b r u t t o k a n s a n t u o t e o s u u d e n + b r u t t o k a n s a n t u o t e o s u u d e s t a + b r u t t o k a n s a n t u o t e o s u u t e n a + b r u t t o k a n s a n t u o t e o s u u t t a + b r u t t o k a n s a n t u o t e t i l a s t o j e n + b r u t t o k a n s a n t u o t e t t a + b r u t t o k a n s a n t u o t e t t a a n + b r u t t o k a n s a n t u o t t e e k s i + b r u t t o k a n s a n t u o t t e e l l a + b r u t t o k a n s a n t u o t t e e l l e + b r u t t o k a n s a n t u o t t e e m m e + b r u t t o k a n s a n t u o t t e e n + b r u t t o k a n s a n t u o t t e e n a + b r u t t o k a n s a n t u o t t e e n k i n + b r u t t o k a n s a n t u o t t e e s e e n + b r u t t o k a n s a n t u o t t e e s s a + b r u t t o k a n s a n t u o t t e e s t a + b r u t t o k a n s a n t u o t t e e s t a a n + b r u t t o k a n s a n t u o t t e e s t a m m e + b r u t t o k a n s a n t u o t t e i d e n + b r u t t o k a n s a t u o t e + b r u t t o k a n s a t u o t t e e n + b r u t t o k a n s a t u o t t e e s s a + b r u t t o k a n s a t u o t t e e s t a + b r u t t o k a s a n t u o t e + b r u t t o k a s a n t u o t t e e n + b r u t t o k a t t e e n + b r u t t o k e s k i t u l o s t a + b r u t t o k u l u t u k s e s t a + b r u t t o k u s t a n n u k s e t + b r u t t o l i i k e v a i h d o n + b r u t t o l i i k e v a i h d o s t a + b r u t t o l i i k e v a i h d o s t a a n + b r u t t o l i s ä a r v o s t a + b r u t t o m a k s u + b r u t t o m a k s u o s u u k s i s t a m m e + b r u t t o m a k s u s u o r i t u k s e t + b r u t t o m y y n t i t u l o i s t a + b r u t t o m ä ä r i ä + b r u t t o p a l k a s t a + b r u t t o p a l k k a + b r u t t o r e k i s t e r i t o n n i + b r u t t o r e k i s t e r i t o n n i a + b r u t t o r e k i s t e r i t o n n i i n + b r u t t o r e k i s t e r i t o n n i n + b r u t t o t i l i t + b r u t t o t o d e l l i s u u s + b r u t t o t o n n e i k s i + b r u t t o t o n n i + b r u t t o t o n n i s t o n + b r u t t o t u l o i s t a + b r u t t o t u l o s + b r u t t o t u n t i a n s i o i s s a + b r u t t o t u n t i p a l k k a a + b r u t t o t u o t t o + b r u t t o t y ö l l i s y y d e n + b r u t t o v a r a l l i s u u s + b r u t t o v e t o i s u u s + b r u t t o v e t o i s u u t e e n + b r u t t o v e t o i s u u t t a + b r u t t o v o i t o t + b r u t t o v u o s i p a l k a n + b r y s s e l i i n + b r y s s e l i l l e + b r y s s e l i n + b r y s s e l i s s ä + b r y s s e l i s s ä k i n + b r y s s e l i s t ä + b r y s s e l i ä + b r ä n d i l ä h e t t i l ä s + b r ä n d i n h a l l i n t a + b r ä n d i n i m i + b u d d h a l a i s e n e m m i s t ö n + b u d d h a l a i s k i r k k o + b u d d h a l a i s k i r k k o a + b u d d h a l a i s k i r k k o o n + b u d d h a l a i s k i r k o l l e + b u d d h a l a i s k i r k o n + b u d d h a l a i s k u l t t u u r i n + b u d d h a l a i s l u o s t a r i s s a + b u d d h a l a i s m u n k i l l a + b u d d h a l a i s m u n k i l l e + b u d d h a l a i s m u n k i t + b u d d h a l a i s m u n k k e i h i n + b u d d h a l a i s m u n k k e j a + b u d d h a l a i s m u n k k i + b u d d h a l a i s m u n k k i a + b u d d h a l a i s m u n k k i e n + b u d d h a l a i s m u n k k i n a + b u d d h a l a i s p a t s a a t + b u d d h a l a i s p e r i n t e e n + b u d d h a l a i s r y h m ä n + b u d d h a l a i s t e m p p e l e i s t ä ä n + b u d d h a l a i s t e r r o r i s m i n + b u d d h a l a i s y h t e i s ö l l e + b u d d h a l a i s y h t e i s ö ö n + b u d d h i s t i k i r k k o + b u d j e t i l l a + b u d j e t i n + b u d j e t i n v a l v o n t a e l i m e l l e + b u d j e t i s s a + b u d j e t i s t a + b u d j e t i t + b u d j e t o i d a a n k o + b u d j e t o i d u i s t a + b u d j e t o i n n i n + b u d j e t o i n n i s s a + b u d j e t o i n n i s t a + b u d j e t o i n t i a + b u d j e t o i n t i i n + b u d j e t o i n t i j ä r j e s t e l m ä + b u d j e t o i n t i j ä r j e s t e l m ä ä + b u d j e t o i n t i j ä r j e s t e l m ä ä n + b u d j e t o i n t i m a h d o l l i s u u k s i e n + b u d j e t o i n t i m e n e t e l m i e n + b u d j e t o i n t i t a p a + b u d j e t o i n t i t a p a a + b u d j e t o i n t i t e k n i i k k a + b u d j e t o i t a e s s a + b u d j e t t e j a + b u d j e t t e j a a n + b u d j e t t i a + b u d j e t t i a i k a t a u l u + b u d j e t t i a l i j ä ä m i e n + b u d j e t t i a l i j ä ä m i i n + b u d j e t t i a l i j ä ä m i s t ä + b u d j e t t i a l i j ä ä m i ä + b u d j e t t i a l i j ä ä m i ä ä n + b u d j e t t i a l i j ä ä m ä + b u d j e t t i a l i j ä ä m ä n + b u d j e t t i a l i j ä ä m ä s t ä + b u d j e t t i a l i j ä ä m ä t + b u d j e t t i a l i j ä ä m ä ä + b u d j e t t i a l o i l l a + b u d j e t t i a l o i t t e e s t a + b u d j e t t i a l u e e l l a + b u d j e t t i a l u e e s t a + b u d j e t t i a m m e k i n + b u d j e t t i a n a l y y s i n + b u d j e t t i a p u + b u d j e t t i a p u a + b u d j e t t i a r v i o + b u d j e t t i a r v i o i n n i n + b u d j e t t i a r v i o i s s a + b u d j e t t i a r v i o i t a + b u d j e t t i a s i a n t u n t i j a n a + b u d j e t t i a s i o i d e n + b u d j e t t i a s i o i s s a + b u d j e t t i a s i o i s t a + b u d j e t t i a s i o i t a + b u d j e t t i a u k t o r i t e e t i n + b u d j e t t i d e t a l j i e n + b u d j e t t i e h d o t + b u d j e t t i e h d o t u k s e n + b u d j e t t i e h d o t u k s e n s a + b u d j e t t i e h d o t u k s e t + b u d j e t t i e h d o t u k s i a + b u d j e t t i e h d o t u s + b u d j e t t i e h d o t u s t a + b u d j e t t i e l v y t y s t ä + b u d j e t t i e n + b u d j e t t i e n n u s t e e n s a + b u d j e t t i e p ä t a s a p a i n o j e n + b u d j e t t i e p ä t a s a p a i n o n + b u d j e t t i e p ä t a s a p a i n o s t a + b u d j e t t i e r i t e l m i ä + b u d j e t t i e r ä t + b u d j e t t i e r ä ä n + b u d j e t t i e s i t t e l i j ä + b u d j e t t i e s i t t e l i j ä n + b u d j e t t i e s i t t e l i j ö i t ä + b u d j e t t i e s i t t e l i j ö i t ä m m e + b u d j e t t i e s i t y k s e e n + b u d j e t t i e s i t y k s e s s ä + b u d j e t t i e s i t y k s e s s ä ä n + b u d j e t t i e s i t y k s i ä + b u d j e t t i e s i t y s + b u d j e t t i e s i t y s t ä + b u d j e t t i f e d e r a a t i o t a + b u d j e t t i f o b i a + b u d j e t t i h a l l i n n o i n t i n s a + b u d j e t t i h a l l i n n o n + b u d j e t t i h a l l i n n o s t a + b u d j e t t i h a l l i n t o + b u d j e t t i h a l l i n t o a + b u d j e t t i h a l l i n t o o n + b u d j e t t i h a n k k e e s s a + b u d j e t t i h e l v e t t i i n + b u d j e t t i h i s t o r i a s s a + b u d j e t t i h u o l i + b u d j e t t i h y v i t y k s e e n + b u d j e t t i h y v i t y k s e s t ä ä n + b u d j e t t i i n + b u d j e t t i i n s a + b u d j e t t i j a k s o o n + b u d j e t t i j ä r j e s t e l m ä + b u d j e t t i j ä r j e s t e l m ä s s ä + b u d j e t t i j ä r j e s t e l m ä s t ä + b u d j e t t i j ä r j e s t e l m ä ä + b u d j e t t i j ä r j e s t e l m ä ä n + b u d j e t t i j ä r j e s t e l y j ä + b u d j e t t i j ä r j e s t e l y l l ä + b u d j e t t i k a l e n t e r i + b u d j e t t i k a n n u s t i m i e n + b u d j e t t i k a n n u s t i m i s t a + b u d j e t t i k a p a s i t e e t i n + b u d j e t t i k a t o k s i + b u d j e t t i k a t o n + b u d j e t t i k a t o s t a + b u d j e t t i k a t t o + b u d j e t t i k a u d e l l a + b u d j e t t i k a u d e l l e + b u d j e t t i k a u d e n + b u d j e t t i k a u d e s t a + b u d j e t t i k a u d e t + b u d j e t t i k a u s i + b u d j e t t i k a u s i a + b u d j e t t i k a u t t a + b u d j e t t i k e h y k s e e n + b u d j e t t i k e h y k s e l l ä + b u d j e t t i k e h y k s e n + b u d j e t t i k e h y k s e s s ä + b u d j e t t i k e h y k s e s t ä + b u d j e t t i k e h y k s i s s ä + b u d j e t t i k e h y k s i ä + b u d j e t t i k e h y s + b u d j e t t i k e h y s t e n + b u d j e t t i k e h y s t ä + b u d j e t t i k e i n o j a + b u d j e t t i k e i n o t + b u d j e t t i k e s k u s t e l u + b u d j e t t i k e s k u s t e l u a + b u d j e t t i k e s k u s t e l u i h i n + b u d j e t t i k e s k u s t e l u i s s a + b u d j e t t i k e s k u s t e l u i s s a m m e + b u d j e t t i k e s k u s t e l u j e n + b u d j e t t i k e s k u s t e l u m m e + b u d j e t t i k e s k u s t e l u n + b u d j e t t i k e s k u s t e l u s s a + b u d j e t t i k e s k u s t e l u s t a + b u d j e t t i k e s k u s t e l u u n + b u d j e t t i k i e l e l l e + b u d j e t t i k i e l e l l ä + b u d j e t t i k i e l e s s ä + b u d j e t t i k i e r t o + b u d j e t t i k i i s t a + b u d j e t t i k i r j a n p i d o s s a + b u d j e t t i k o h d a k s e e n + b u d j e t t i k o h d a k s i + b u d j e t t i k o h d a l l a + b u d j e t t i k o h d a l l e + b u d j e t t i k o h d a n + b u d j e t t i k o h d a s s a + b u d j e t t i k o h d a s s a a n + b u d j e t t i k o h d a s s a m m e + b u d j e t t i k o h d a s t a + b u d j e t t i k o h d a t + b u d j e t t i k o h d i l l a + b u d j e t t i k o h d i l l e + b u d j e t t i k o h d i s s a + b u d j e t t i k o h d i s t a + b u d j e t t i k o h t a + b u d j e t t i k o h t a a + b u d j e t t i k o h t a a n + b u d j e t t i k o h t a h a n + b u d j e t t i k o h t a i s t a + b u d j e t t i k o h t a m m e + b u d j e t t i k o h t a n a + b u d j e t t i k o h t a n s a + b u d j e t t i k o h t a o n g e l m a a n + b u d j e t t i k o h t e i t a + b u d j e t t i k o h t i a + b u d j e t t i k o h t i e m m e + b u d j e t t i k o h t i e n + b u d j e t t i k o h t i i n + b u d j e t t i k o h t i n a + b u d j e t t i k o k o n a i s u u s + b u d j e t t i k o k o u k s e n + b u d j e t t i k o m i s s a a r i + b u d j e t t i k o m i s s a a r i l l e + b u d j e t t i k o m i t e a + b u d j e t t i k o m i t e a n + b u d j e t t i k o m i t e a s s a + b u d j e t t i k o m p e n s a a t i o s t a + b u d j e t t i k o r o t u s t a + b u d j e t t i k r i i s i + b u d j e t t i k r i i s i i n + b u d j e t t i k r i i s i k s i + b u d j e t t i k r i i s i l t ä + b u d j e t t i k r i i s i n + b u d j e t t i k r i i s i s s ä + b u d j e t t i k r i i s i ä ä n + b u d j e t t i k u r i + b u d j e t t i k u r i a + b u d j e t t i k u r i a m m e + b u d j e t t i k u r i i n + b u d j e t t i k u r i i n k i n + b u d j e t t i k u r i l l a + b u d j e t t i k u r i l l e + b u d j e t t i k u r i n + b u d j e t t i k u r i n a l a i s u u d e n + b u d j e t t i k u r i p e r i a a t t e e n + b u d j e t t i k u r i p o l i t i i k a s t a + b u d j e t t i k u r i s o p i m u k s e s t a + b u d j e t t i k u r i s s a + b u d j e t t i k u r i s t a + b u d j e t t i k u r i s u u n n i t e l m a n + b u d j e t t i k u r i t o i m i a + b u d j e t t i k u r i v a a t i m u k s i i n + b u d j e t t i k u s t a n n u k s i n + b u d j e t t i k u s t a n n u s t e n + b u d j e t t i k y n n y k s e s t ä + b u d j e t t i k y s y m y k s e e n + b u d j e t t i k y s y m y k s e n + b u d j e t t i k y s y m y k s e s t ä + b u d j e t t i k y s y m y k s e t + b u d j e t t i k y s y m y k s i s s ä + b u d j e t t i k y s y m y k s i s t ä + b u d j e t t i k y s y m y k s i ä + b u d j e t t i k y s y m y s + b u d j e t t i k ä s i t t e l y + b u d j e t t i k ä s i t t e l y n + b u d j e t t i k ä y t ä n n ö l l e + b u d j e t t i k ä y t ä n n ö s s ä + b u d j e t t i k ä y t ä n t ö + b u d j e t t i k ä y t ä n t ö ä + b u d j e t t i l a i n + b u d j e t t i l a i n s ä ä d ä n t ö + b u d j e t t i l a i n s ä ä d ä n t ö ä + b u d j e t t i l a i n s ä ä d ä n t ö ö n + b u d j e t t i l a i n s ä ä t ä j ä + b u d j e t t i l e i k k a u k s e t + b u d j e t t i l e i k k a u k s i a + b u d j e t t i l e i k k a u k s i i n + b u d j e t t i l e i k k a u k s i l l a + b u d j e t t i l e i k k a u k s i s t a + b u d j e t t i l e i k k a u s t e n + b u d j e t t i l i n j a + b u d j e t t i l i n j a a + b u d j e t t i l i n j a n + b u d j e t t i l i n j a s t a + b u d j e t t i l i n j a t + b u d j e t t i l i n j a u k s i a + b u d j e t t i l i n j a u k s i s s a + b u d j e t t i l i n j a u s t e n + b u d j e t t i l i n j o i k s i + b u d j e t t i l i n j o i l t a + b u d j e t t i l i n j o i s s a + b u d j e t t i l i s ä y k s e k s i + b u d j e t t i l i s ä y s + b u d j e t t i l u k u + b u d j e t t i l u k u j a + b u d j e t t i l u o k k a + b u d j e t t i l u o n n o k s e s s a a n + b u d j e t t i l u v u i s s a + b u d j e t t i l u v u t + b u d j e t t i l ä h t e i d e n + b u d j e t t i m a k s u j a + b u d j e t t i m a k s u o s u u t e n s a + b u d j e t t i m a r g i n a a l e i h i n + b u d j e t t i m a r g i n a a l i t + b u d j e t t i m e k a n i s m e j a + b u d j e t t i m e n e t t e l y + b u d j e t t i m e n e t t e l y i d e n + b u d j e t t i m e n e t t e l y i l l e + b u d j e t t i m e n e t t e l y i s s ä m m e + b u d j e t t i m e n e t t e l y i s t ä + b u d j e t t i m e n e t t e l y j e m m e + b u d j e t t i m e n e t t e l y j e n + b u d j e t t i m e n e t t e l y j ä + b u d j e t t i m e n e t t e l y l l e + b u d j e t t i m e n e t t e l y m m e + b u d j e t t i m e n e t t e l y n + b u d j e t t i m e n e t t e l y s s ä + b u d j e t t i m e n e t t e l y s t ä + b u d j e t t i m e n e t t e l y y n + b u d j e t t i m e n e t t e l y ä + b u d j e t t i m e n o i h i n + b u d j e t t i m e n o i s s a + b u d j e t t i m e n o i s t a + b u d j e t t i m e n o j a + b u d j e t t i m e n o j e n + b u d j e t t i m e n o t + b u d j e t t i m e r e s s ä + b u d j e t t i m i e t i n n ö i s s ä + b u d j e t t i m i n i s t e r i + b u d j e t t i m i n i s t e r i e n + b u d j e t t i m i n i s t e r i n + b u d j e t t i m i n i s t e r i t h ä n + b u d j e t t i m o m e n t t e i h i n + b u d j e t t i m u u t o k s e t + b u d j e t t i m u u t t u j a + b u d j e t t i m ä ä r ä n + b u d j e t t i m ä ä r ä r a h a + b u d j e t t i m ä ä r ä r a h a n + b u d j e t t i m ä ä r ä r a h a t + b u d j e t t i m ä ä r ä r a h o i k s i + b u d j e t t i m ä ä r ä r a h o i l l a + b u d j e t t i m ä ä r ä r a h o i s t a + b u d j e t t i m ä ä r ä r a h o j a + b u d j e t t i m ä ä r ä r a h o j e n + b u d j e t t i m ä ä r ä y k s e t + b u d j e t t i m ä ä r ä y k s i i n + b u d j e t t i n e u t r a a l i + b u d j e t t i n e u t r a a l i u t t a + b u d j e t t i n e u v o s t o + b u d j e t t i n e u v o s t o n + b u d j e t t i n e u v o s t o s s a + b u d j e t t i n e u v o s t o s t a + b u d j e t t i n e u v o t t e l u i h i n + b u d j e t t i n e u v o t t e l u i l l e + b u d j e t t i n e u v o t t e l u i s s a + b u d j e t t i n e u v o t t e l u i s t a + b u d j e t t i n e u v o t t e l u j a + b u d j e t t i n e u v o t t e l u j e n + b u d j e t t i n e u v o t t e l u o h j e l m a a n + b u d j e t t i n e u v o t t e l u t + b u d j e t t i n i m i k k e i s t ö + b u d j e t t i n ä k e m y s t ä + b u d j e t t i n ä k y m i e n + b u d j e t t i n ä k y m i s s ä + b u d j e t t i n ä k y m ä t + b u d j e t t i n ä k ö k o h t i a + b u d j e t t i n ä k ö k o h t i e n + b u d j e t t i n ä k ö k u l m a + b u d j e t t i n ä k ö k u l m a a + b u d j e t t i o h j e l m a a + b u d j e t t i o i k e u d e l l i s e s t i + b u d j e t t i o i k e u d e l l i s t e n + b u d j e t t i o i k e u d e n + b u d j e t t i o i k e u d e s t a + b u d j e t t i o i k e u d e t + b u d j e t t i o i k e u k s i a + b u d j e t t i o i k e u k s i e n + b u d j e t t i o i k e u k s i i n + b u d j e t t i o i k e u k s i s t a + b u d j e t t i o i k e u t t a a n + b u d j e t t i o n g e l m a + b u d j e t t i o n g e l m a a + b u d j e t t i o n g e l m a n + b u d j e t t i o n g e l m a t + b u d j e t t i o n g e l m i a + b u d j e t t i o n g e l m i a a n + b u d j e t t i o n g e l m i e n + b u d j e t t i o n g e l m i i n + b u d j e t t i o n g e l m i s t a + b u d j e t t i o s u u d e s t a + b u d j e t t i o s u u d e t + b u d j e t t i o t s a k e + b u d j e t t i o t s a k e t t a + b u d j e t t i o t s a k k e e l l a + b u d j e t t i o t s a k k e e n + b u d j e t t i o t s a k k e e s e e n + b u d j e t t i o t s a k k e e s t a + b u d j e t t i o t s a k k e e t + b u d j e t t i o t s a k k e i d e n + b u d j e t t i o t s a k k e i s i i n + b u d j e t t i o t s a k k e i t a + b u d j e t t i p a i n e e n + b u d j e t t i p a i n e e t + b u d j e t t i p a k e t t i a + b u d j e t t i p a n o k s e l l a + b u d j e t t i p a n o s t u k s i i n + b u d j e t t i p a r a m e t r i e n + b u d j e t t i p e r i a a t t e e t + b u d j e t t i p e r i a a t t e i s t a + b u d j e t t i p e r u s t a + b u d j e t t i p e r u s t a a + b u d j e t t i p e r u s t a n + b u d j e t t i p o i k k e a m a t + b u d j e t t i p o i k k e a m i s s a + b u d j e t t i p o l i i t t i n e n + b u d j e t t i p o l i i t t i s e s t i + b u d j e t t i p o l i i t t i s i a + b u d j e t t i p o l i i t t i s i i n + b u d j e t t i p o l i i t t i s t a + b u d j e t t i p o l i i t t i s t e n + b u d j e t t i p o l i t i i k a l l a a n + b u d j e t t i p o l i t i i k a l l e + b u d j e t t i p o l i t i i k a n + b u d j e t t i p o l i t i i k a s s a + b u d j e t t i p o l i t i i k a s s a a n + b u d j e t t i p o l i t i i k a s s a n n e + b u d j e t t i p o l i t i i k a s t a + b u d j e t t i p o l i t i i k a t + b u d j e t t i p o l i t i i k k a + b u d j e t t i p o l i t i i k k a a + b u d j e t t i p o l i t i i k k a a m m e + b u d j e t t i p o l i t i i k k a a n + b u d j e t t i p o l i t i i k k a a n s a + b u d j e t t i p o l i t i i k k a m m e + b u d j e t t i p o l i t i i k k a n s a + b u d j e t t i p o l i t i i k k o j a + b u d j e t t i p o l i t i i k k o j e m m e + b u d j e t t i p o l i t i i k k o j e n + b u d j e t t i p o l i t i i k o i l l a + b u d j e t t i p o l i t i i k o i s s a + b u d j e t t i p o l i t i i k o i s t a + b u d j e t t i p o n n i s t e l u j a + b u d j e t t i p o n n i s t u s t e n + b u d j e t t i p r o s e s s i + b u d j e t t i p r o s e s s i i n + b u d j e t t i p r o s e s s i n + b u d j e t t i p r o s e s s i s s a + b u d j e t t i p r o s e s s i s t a + b u d j e t t i p ä ä o s a s t o + b u d j e t t i p ä ä o s a s t o a + b u d j e t t i p ä ä o s a s t o l l a + b u d j e t t i p ä ä o s a s t o n + b u d j e t t i p ä ä t ä n t ä v a l l a n + b u d j e t t i p ä ä t ö k s e t + b u d j e t t i p ä ä t ö k s i l l ä + b u d j e t t i p ä ä t ö k s i ä + b u d j e t t i p ä ä t ö s t e n + b u d j e t t i r a a m e j a + b u d j e t t i r a a m i a + b u d j e t t i r a a m i e n + b u d j e t t i r a a m i e n k i n + b u d j e t t i r a h o i t u s + b u d j e t t i r a h o i t u s t a + b u d j e t t i r a j o i s s a + b u d j e t t i r a j o i t t e e t + b u d j e t t i r a j o i t t e i d e n + b u d j e t t i r a j o i t t e i s t a + b u d j e t t i r a j o i t u k s e t + b u d j e t t i r a j o i t u k s i a + b u d j e t t i r a j o i t u k s i i n + b u d j e t t i r a j o i t u k s i k s i + b u d j e t t i r a j o i t u s t e n + b u d j e t t i r a j o j e n + b u d j e t t i r a k e n t e e n + b u d j e t t i r a k e n t e e s s a + b u d j e t t i r a k e n t e e s t a + b u d j e t t i r a k e n t e i s s a m m e + b u d j e t t i r a t k a i s u + b u d j e t t i r a t k a i s u a + b u d j e t t i r a t k a i s u i s t a + b u d j e t t i r a u h a n + b u d j e t t i r e s u r s s e i s t a + b u d j e t t i r e s u r s s e j a + b u d j e t t i r e s u r s s i t + b u d j e t t i r i i t o j e n + b u d j e t t i r i k o l l i s t e n + b u d j e t t i s a l d o i s t a + b u d j e t t i s a l d o j a + b u d j e t t i s a n e e r a u s + b u d j e t t i s e i k k o i h i n + b u d j e t t i s e u r a u k s e t + b u d j e t t i s i h t e e r i s t ö ä + b u d j e t t i s i i r t o + b u d j e t t i s i i r t o j a + b u d j e t t i s i i r t o o n + b u d j e t t i s i t o u m u k s i a + b u d j e t t i s i t o u m u k s i a m m e + b u d j e t t i s i t o u m u s t e n + b u d j e t t i s o l i d a a r i s u u t t a + b u d j e t t i s o p i m u k s e n + b u d j e t t i s o p i m u s t a + b u d j e t t i s o p u + b u d j e t t i s o v i t t e l u + b u d j e t t i s o v i t t e l u s s a + b u d j e t t i s o v u n + b u d j e t t i s t r a t e g i a + b u d j e t t i s t r a t e g i a s t a + b u d j e t t i s t r a t e g i o i d e n + b u d j e t t i s u u n n i t e l m a + b u d j e t t i s u u n n i t e l m a a + b u d j e t t i s u u n n i t e l m a n + b u d j e t t i s u u n n i t e l m a t + b u d j e t t i s u u n n i t e l m i a + b u d j e t t i s u u n n i t t e l u + b u d j e t t i s u u n n i t t e l u a + b u d j e t t i s u u n n i t t e l u s s a + b u d j e t t i s u u n t a v i i v o i h i n + b u d j e t t i s u u n t a v i i v o j e n + b u d j e t t i s y i s t ä + b u d j e t t i s ä ä n n ö i s t ä + b u d j e t t i s ä ä n n ö k s i i n + b u d j e t t i s ä ä n n ö s t e l y ä + b u d j e t t i s ä ä n n ö t + b u d j e t t i s ä ä n t ö j e n + b u d j e t t i s ä ä n t ö j ä + b u d j e t t i s ä ä s t ö i h i n + b u d j e t t i s ä ä s t ö j e n + b u d j e t t i s ä ä s t ö t + b u d j e t t i s ä ä s t ö ö n + b u d j e t t i t a a k k a + b u d j e t t i t a i s t e l u n + b u d j e t t i t a r k a s t u k s e n s a + b u d j e t t i t a r k i s t u k s e n + b u d j e t t i t a r k i s t u k s e s t a + b u d j e t t i t a r k i s t u k s i a + b u d j e t t i t a r k i s t u k s i s t a + b u d j e t t i t a r k i s t u s + b u d j e t t i t a r k i s t u s t a + b u d j e t t i t a r p e i d e n + b u d j e t t i t a r p e i s t a + b u d j e t t i t a r p e i t a + b u d j e t t i t a s a p a i n o + b u d j e t t i t a s a p a i n o a + b u d j e t t i t a s a p a i n o n + b u d j e t t i t a s a p a i n o s t a + b u d j e t t i t a s e e n + b u d j e t t i t a s e e s e e n + b u d j e t t i t a s e e t + b u d j e t t i t a s e t t a + b u d j e t t i t a s o l l a + b u d j e t t i t a s o n + b u d j e t t i t a v o i t e + b u d j e t t i t a v o i t t e e n + b u d j e t t i t a v o i t t e e t + b u d j e t t i t a v o i t t e i d e n + b u d j e t t i t a v o i t t e i s i i n + b u d j e t t i t a v o i t t e i s t a + b u d j e t t i t a v o i t t e i s t a a n + b u d j e t t i t a v o i t t e i t a + b u d j e t t i t e k n i i k k a + b u d j e t t i t e k n i s e n + b u d j e t t i t e k n i s e t + b u d j e t t i t e k n i s i ä + b u d j e t t i t i e t o j a a n + b u d j e t t i t i l a n n e + b u d j e t t i t i l a n t e e n + b u d j e t t i t i l a n t e e s e e n + b u d j e t t i t i l a n t e e s s a + b u d j e t t i t i l a n t e e s t a + b u d j e t t i t i l a n t e i s i i n + b u d j e t t i t o d e l l i s u u d e n + b u d j e t t i t o i m e n p i t e i s t ä + b u d j e t t i t o i m i e n + b u d j e t t i t o i m i v a l t a a + b u d j e t t i t u e l l a + b u d j e t t i t u e n + b u d j e t t i t u e s t a + b u d j e t t i t u k e a + b u d j e t t i t u k e a m m e + b u d j e t t i t u k e e n + b u d j e t t i t u k e m m e + b u d j e t t i t u k e n a + b u d j e t t i t u k i + b u d j e t t i t u k i j ä r j e s t e l m ä + b u d j e t t i t u k i m a k s u t + b u d j e t t i t u k i o h j e l m i e n + b u d j e t t i t u k i o h j e l m i s s a m m e + b u d j e t t i t u k i p a k e t i n + b u d j e t t i t u k i p o l i t i i k a s s a + b u d j e t t i t u k i p o l i t i i k k a a m m e + b u d j e t t i t u k i p r o s e s s i n + b u d j e t t i t u l o i h i n + b u d j e t t i t u l o i s t a + b u d j e t t i t u l o j a + b u d j e t t i t u l o j e n + b u d j e t t i t u l o t + b u d j e t t i t y ö h ö n + b u d j e t t i t y ö k a l u a + b u d j e t t i t y ö k a l u i s t a + b u d j e t t i t y ö m m e + b u d j e t t i t y ö s k e n t e l y n + b u d j e t t i t y ö s k e n t e l y ä + b u d j e t t i t y ö s s ä + b u d j e t t i t y ö t ä + b u d j e t t i u l o t t u v u u d e k s i + b u d j e t t i u u d i s t u s t a + b u d j e t t i v a a t i m u k s i a + b u d j e t t i v a a t i m u k s i s t a + b u d j e t t i v a a t i m u s t e n + b u d j e t t i v a i k e u d e t + b u d j e t t i v a i k u t u k s e s t a + b u d j e t t i v a i k u t u k s e t + b u d j e t t i v a i k u t u k s i a + b u d j e t t i v a i k u t u k s i i n + b u d j e t t i v a i k u t u k s i l t a a n + b u d j e t t i v a i k u t u k s i s s a + b u d j e t t i v a i k u t u k s i s t a + b u d j e t t i v a i k u t u s t a + b u d j e t t i v a i k u t u s t e n + b u d j e t t i v a j e + b u d j e t t i v a j e e l l a + b u d j e t t i v a j e e l l e + b u d j e t t i v a j e e m m e + b u d j e t t i v a j e e n + b u d j e t t i v a j e e n s a + b u d j e t t i v a j e e s e e n + b u d j e t t i v a j e e s t a + b u d j e t t i v a j e e t + b u d j e t t i v a j e i d e n + b u d j e t t i v a j e i d e n s a + b u d j e t t i v a j e i l l e + b u d j e t t i v a j e i s t a + b u d j e t t i v a j e i t a + b u d j e t t i v a j e i t a a n + b u d j e t t i v a j e m e n e t t e l y t + b u d j e t t i v a j e t t a + b u d j e t t i v a j e t t a a n + b u d j e t t i v a k a u d e n + b u d j e t t i v a l i n t o j e n + b u d j e t t i v a l i o k u n n a l l a + b u d j e t t i v a l i o k u n n a l l e + b u d j e t t i v a l i o k u n n a l l e k i n + b u d j e t t i v a l i o k u n n a l t a + b u d j e t t i v a l i o k u n n a l t a n n e + b u d j e t t i v a l i o k u n n a n + b u d j e t t i v a l i o k u n n a n k i n + b u d j e t t i v a l i o k u n n a s s a + b u d j e t t i v a l i o k u n n a s s a k i n + b u d j e t t i v a l i o k u n n a s t a + b u d j e t t i v a l i o k u n n a s t a m m e + b u d j e t t i v a l i o k u n t a + b u d j e t t i v a l i o k u n t a a + b u d j e t t i v a l i o k u n t a a m m e + b u d j e t t i v a l i o k u n t a a n + b u d j e t t i v a l i o k u n t a k i n + b u d j e t t i v a l i o k u n t a m m e + b u d j e t t i v a l i o k u n t a n a + b u d j e t t i v a l i o k u n t a n n e + b u d j e t t i v a l l a n + b u d j e t t i v a l l a n k ä y t t ä j i e n + b u d j e t t i v a l l a n k ä y t t ä j ä + b u d j e t t i v a l l a n k ä y t t ä j ä l t ä + b u d j e t t i v a l l a n k ä y t t ä j ä n + b u d j e t t i v a l l a n k ä y t t ä j ä n ä + b u d j e t t i v a l l a s t a + b u d j e t t i v a l l a s t a a n + b u d j e t t i v a l t a + b u d j e t t i v a l t a a + b u d j e t t i v a l t a a m m e + b u d j e t t i v a l t a a n + b u d j e t t i v a l t a a n s a + b u d j e t t i v a l t a o i k e u d e t + b u d j e t t i v a l t i o k u n t a + b u d j e t t i v a l t u u d e t + b u d j e t t i v a l t u u k s i a + b u d j e t t i v a l t u u k s i e n + b u d j e t t i v a l v o n n a n + b u d j e t t i v a l v o n t a + b u d j e t t i v a l v o n t a a + b u d j e t t i v a l v o n t a k y s y m y s + b u d j e t t i v a r a n t o + b u d j e t t i v a r a n t o j a + b u d j e t t i v a r a n t o o n + b u d j e t t i v a r a t + b u d j e t t i v a r a u k s e s s a + b u d j e t t i v a r a u k s e s t a + b u d j e t t i v a r a u s + b u d j e t t i v a r a u s t a + b u d j e t t i v a r a u s t e n + b u d j e t t i v a r o i h i n + b u d j e t t i v a r o i l l a + b u d j e t t i v a r o i n + b u d j e t t i v a r o i s t a + b u d j e t t i v a r o j a + b u d j e t t i v a r o j e n + b u d j e t t i v a s t u u + b u d j e t t i v a s t u u l l a + b u d j e t t i v a s t u u s s a + b u d j e t t i v a s t u u s t a + b u d j e t t i v a s t u u t a + b u d j e t t i v e l v o i t t e e t + b u d j e t t i v e l v o i t t e i d e n + b u d j e t t i v e t e r a a n i t + b u d j e t t i v i r a n o m a i n e n + b u d j e t t i v i r a n o m a i s e l l e + b u d j e t t i v i r a n o m a i s e n + b u d j e t t i v i r a n o m a i s e t + b u d j e t t i v i r a n o m a i s i a + b u d j e t t i v i r a n o m a i s i l t a + b u d j e t t i v i r a n o m a i s i n a + b u d j e t t i v i r a n o m a i s t a + b u d j e t t i v i r a n o m a i s t e n + b u d j e t t i v i r a s t o j a + b u d j e t t i v i r a s t o n s a + b u d j e t t i v i r k a m i e s t e n + b u d j e t t i v u o d e k s i + b u d j e t t i v u o d e n + b u d j e t t i v u o n n a + b u d j e t t i v u o s i + b u d j e t t i v ä h e n n y k s e s t ä + b u d j e t t i v ä h e n n y s + b u d j e t t i v ä l i n e + b u d j e t t i v ä l i n e e k s i + b u d j e t t i v ä l i n e e n + b u d j e t t i v ä l i n e i d e n + b u d j e t t i v ä l i n e i t ä + b u d j e t t i v ä l i n e t t ä ä n + b u d j e t t i y h t e i s t y ö s s ä + b u d j e t t i y l i j ä ä m i e n + b u d j e t t i y l i j ä ä m i ä + b u d j e t t i y l i j ä ä m ä + b u d j e t t i y l i j ä ä m ä s t ä + b u d j e t t i y l i j ä ä m ä ä + b u d j e t t i ä ä n e s t y k s e e n + b u d j e t t i ä ä n e s t y k s e m m e + b u d j e t t i ä ä n e s t y k s e n + b u d j e t t i ä ä n e s t y k s i s s ä + b u d j e t t i ä ä n e s t y s + b u d j e t t i ä ä n e s t y s t e n + b u l b u l i k e r t t u + b u l b u l i l e p i n k ä i n e n + b u l b u l i r a s t a s + b u l e v a r d i l e h d e t + b u l g a r i a a + b u l g a r i a a n + b u l g a r i a l a i s e l ä k e l ä i s e t + b u l g a r i a l a i s e n a + b u l g a r i a l a i s e s t a + b u l g a r i a l a i s e t + b u l g a r i a l a i s i a + b u l g a r i a l a i s i l l a + b u l g a r i a l a i s i l l e + b u l g a r i a l a i s i s t a + b u l g a r i a l a i s j ä s e n e n ä + b u l g a r i a l a i s l ä h t e i s t ä + b u l g a r i a l a i s m i n i s t e r e i d e n + b u l g a r i a l a i s s o t i l a i d e n + b u l g a r i a l a i s t a + b u l g a r i a l a i s t e n + b u l g a r i a l a i s v a s t a i s t a + b u l g a r i a l a i s v ä h e m m i s t ö ä + b u l g a r i a l l a + b u l g a r i a l l e + b u l g a r i a l t a + b u l g a r i a n + b u l g a r i a n a j o k o i r a + b u l g a r i a s s a + b u l g a r i a s t a + b u m e r a n g i e f e k t i n + b u m e r a n g i v a i k u t u k s e n + b u m e r a n g i v a i k u t u s + b u n k k e r e i k s i + b u n k k e r i a l u k s e n + b u n k k e r i m a i n e n + b u n k k e r i m e n t a l i t e e t i s t a + b u n k k e r i p o l t t o ö l j y + b u n k k e r i p o l t t o ö l j y j ä + b u n k k e r i p o l t t o ö l j y n + b u n k k e r i p o l t t o ö l j y s t ä + b u n k k e r i p o l t t o ö l j y ä + b u n k k e r i y l e i s s o p i m u k s e n + b u n k k e r i ö l j y n + b u n k k e r i ö l j y t + b u n k k e r i ö l j y ä + b u r g u n d i n + b u r g u n d i n p a t a + b u r g u n d i n v i i n i l l ä + b u r k i n a + b u r m a a + b u r m a a n + b u r m a l a i s e t + b u r m a l a i s i a + b u r m a l a i s p a k o l a i s i l l e + b u r m a l a i s p a k o l a i s t e n + b u r m a l a i s t e n + b u r m a l a i s v ä e s t ö + b u r m a l l e + b u r m a n + b u r m a n e v ä p a l m u + b u r m a n k u h a n k e i t t ä j ä + b u r m a n l i i t o g e k k o + b u r m a n m e l a h a r a k k a + b u r m a n n a k k e l i + b u r m a n p e n s a s k i u r u + b u r m a n p i k k u l e p i n k ä i n e n + b u r m a n s i e p p o k e r t t u + b u r m a n t ä h t i k i l p i k o n n a + b u r m a n v i h e r t i k k a + b u r m a s s a + b u r m a s t a + b u s i n e s s k ä y t ä n t ö ä + b u s i n e s s l u o k a s s a + b u s s e i l l a + b u s s e i s t a + b u s s i b o n g a u s + b u s s i e n + b u s s i k a a p p a u s + b u s s i l i n j o j a + b u s s i m a t k a a + b u s s i m a t k a a n i + b u s s i m a t k o i h i n + b u s s i m a t k u s t a j a a + b u s s i m e t r o + b u s s i n k u l j e t t a j a + b u s s i o n n e t t o m u u d e t + b u s s i o n n e t t o m u u s + b u s s i p y s ä k k e j ä + b u s s i p y s ä k k i + b u s s i r e t k e l l ä + b u s s i s o p i m u k s e s t a + b u s s i t u r m a + b u s s i v a r i k k o j a + b u s s i v i r a n o m a i s e t + b u s s i y h t e y k s i ä + b u s s i y h t i ö i d e n + b u t y y l i a s e t a a t t i + b u t y y l i d i k a r b o n a a t t i + b u t y y l i h y d r o p e r o k s i d i + b u t y y l i k l o r i d i + b u t y y l i k u m i + b u u r i a l u e i l l a + b u u r i n h e v o n e n + b u u r i s o t a + b u u r i v i l l a k k o + b y r o k r a a t e i l l a + b y r o k r a a t e i s t a + b y r o k r a a t i t + b y r o k r a a t t i s e l l a + b y r o k r a a t t i s e l l e + b y r o k r a a t t i s e m m a t + b y r o k r a a t t i s e m m i l l a + b y r o k r a a t t i s e m p i + b y r o k r a a t t i s e n + b y r o k r a a t t i s e s t a + b y r o k r a a t t i s e t + b y r o k r a a t t i s i a + b y r o k r a a t t i s i i n + b y r o k r a a t t i s i k s i + b y r o k r a a t t i s i l l a + b y r o k r a a t t i s i l t a + b y r o k r a a t t i s i s s a + b y r o k r a a t t i s t e n + b y r o k r a a t t i s u u d e n + b y r o k r a a t t i s u u s t e s t i ä + b y r o k r a a t t i s u u t t a + b y r o k r a a t t i t y ö p a i k k o j e n + b y r o k r a t i a a + b y r o k r a t i a a n + b y r o k r a t i a a n s a + b y r o k r a t i a h i r v i ö + b y r o k r a t i a h i r v i ö n + b y r o k r a t i a h i r v i ö t + b y r o k r a t i a h i r v i ö t ä + b y r o k r a t i a j ä r j e s t e l m ä ä + b y r o k r a t i a k o n e i s t o + b y r o k r a t i a k o n e i s t o n + b y r o k r a t i a k s i + b y r o k r a t i a k u s t a n n u k s e t + b y r o k r a t i a k u s t a n n u k s i a + b y r o k r a t i a k y s y m y s + b y r o k r a t i a l l a + b y r o k r a t i a l l e + b y r o k r a t i a l t a + b y r o k r a t i a l t a a n + b y r o k r a t i a m e n e t t e l y j e n + b y r o k r a t i a m e t s ä + b y r o k r a t i a n + b y r o k r a t i a n a + b y r o k r a t i a o n g e l m a t + b y r o k r a t i a o n g e l m i a + b y r o k r a t i a s s a + b y r o k r a t i a s t a + b y r o k r a t i a t e h d a s + b y r o k r a t i a v i i d a k o n + b y r o k r a t i a v ä l i n e e n + b y r o k r a t i s o i n t i a + c a e s a r i a + c a e s a r s a l a a t t i + c a i r n t e r r i e r i + c a l m e t t e r o k o t u k s e n + c a s h m a m + c a s h m a n i a + c a s h m a n i l l a + c a s h m a n i l l e + c a s h m a n i n + c a v a d a + c a v a l i e r k i n g c h a r l e s i n s p a n i e l i + c a y u g a t + c e b u n u u n i l i n t u + c e l s i u s a s t e e l l a + c e l s i u s a s t e e n + c e l s i u s a s t e e s e e n + c e l s i u s a s t e e s s a + c e l s i u s a s t e t t a + c e r i u m h y d r o k s i d i + c e r i u m k l o r i d i + c e r i u m o k s a l a a t t i + c e r i u m o k s i d i + c e s a r i n a + c e s i u m h y d r o k s i d i + c e s i u m k a r b o n a a t t i + c e s i u m k l o r i d i + c h a m a r i l l e + c h a n t e r i e n + c h a p e l l e n + c h a r m i o f f e n s i i v i + c h a r t e r k o n e e l l a + c h a r t e r l e n n o i l l a + c h a r t e r l e n n o i s s a + c h a r t e r l e n n o l l a + c h a r t e r l e n n o t + c h a r t e r l e n t o + c h a r t e r l e n t o j e n + c h a t t i p a l s t o i l l a + c h a t t i p a l v e l u j e n + c h i n c h a + c h i n c h a s a a r e t + c h i n d e + c i t y s s ä k i n + c l e a r i n g h o u s e + c o c k t a i l k u t s u i l m i ö + c o c k t a i l l a s i + c o l l e g e s s a + c o l l i e n + c o l o n i a + c o u n t r y t a n s s i + c o w b o y o i k e u t t a + c r e e k i n + c u p i n + c u r r y l e h d e t + d a g a n a + d a j a k i t + d a k o t a i n t i a a n e i l l a + d a l a s i + d a m a n a k i l t a + d a m a s k i t e r ä s + d a m i n + d a n d i e d i n m o n t i n t e r r i e r i + d a r i n + d a t a f u u s i o + d a t a i n t e g r a a t i o + d a t a j o u r n a l i s m i + d a t a j ä r j e s t e l m i ä + d a t a k e s k u s + d a t a l i i k e n t e e n + d a t a l ä m m i t i n + d a t a m ä ä r i ä + d a t a n s i i r t o a + d a t a p a l v e l u i t a + d a t a p a l v e l u j e n + d a t a r i n t a m a l l a + d a t a s i i r r o n + d a t a s ä h k ö + d a t a v i r t a + d a t a y r i t y k s e n + d a u l i a + d a u l i l l e + d a u l i n + d a u l i s t a + d a v i d i n + d e b a t i n + d e b a t t i a + d e f e n e s t r a a t i o t a + d e f l a a t i o n + d e f l a a t i o p o l i t i i k k a + d e f l a a t i o p o l i t i i k k a a + d e f l a a t i o p r o s e s s i n + d e f l a a t i o r i s k i n + d e f l a a t i o t a + d e f l a a t i o u h k a n a + d e h y d r a t o i n t i l a i t o k s e t + d e k a b r i s t i k a p i n a + d e k a b r o m i d i f e n y y l i e e t t e r i + d e k a b r o m i d i f e n y y l i e e t t e r i l l e + d e k a b r o m i d i f e n y y l i e e t t e r i ä + d e k o h e r e n s s i + d e k o l o n i s a a t i o p r o s e s s i + d e k o l o n i s a a t i o p r o s e s s i s t a + d e k o o d e r i e n + d e k r i m i n a l i s o i m i s e k s i + d e l a t i i v i + d e l a w a r e j o k i + d e l a w a r e n l a h t i + d e l e g a a t i o a r t i k l a n + d e l e g o i d u i k s i + d e l e g o i d u i l l a + d e l e g o i d u i s s a + d e l e g o i d u i s t a + d e l e g o i d u t + d e l e g o i n t i m e n e t t e l y + d e l e g o i n t i v a l t u u k s i e n + d e l e g o i t a v i s t a + d e l e g o i t u a + d e l e g o i t u i n a + d e l e g o i t u j a + d e l e g o i t u j e n + d e l e k + d e l e k i n + d e l f i i n i e n + d e l f i i n i t + d e l f i i n i t a r i n a + d e l t a f u n k t i o + d e l t a s i i p i + d e l t a s y p r e s s i + d e m a g o g i a a + d e m a g o g i a a n + d e m a g o g i a l l a + d e m a g o g i a l t a + d e m a g o g i s e s t a + d e m a g o g i s i a + d e m a g o g i s i m m a t + d e m a g o g i s i n e + d e m a r a + d e m a r k a a t i o l i n j a + d e m a r k a a t i o l i n j a n + d e m e n t i a a + d e m e n t i a n + d e m e n t i a p o t i l a a s e e n + d e m e n t i a p o t i l a i d e n + d e m e n t i a p o t i l a i l l e + d e m e n t i a p o t i l a i t a + d e m e n t i a s a i r a u k s i a + d e m e n t i a s a i r a u k s i e n + d e m e n t i a s a i r a u k s i i n + d e m e n t i a s t a + d e m e n t i a s t r a t e g i a n + d e m e n t i a s t r a t e g i a s s a + d e m e n t i a t a p a u k s i s t a + d e m e n t i o i s t a + d e m e n t i o i t a + d e m e n t o i t u n e i d e n + d e m e t r i o u t a + d e m i l i t a r i s o i d u n + d e m i l i t a r i s o i n n i n + d e m i l i t a r i s o i n n i s t a + d e m o b i l i s a a t i o p r o s e s s i a + d e m o b i l i s o i n t i o h j e l m i a + d e m o f o n + d e m o g r a f i s e e n + d e m o g r a f i s e s t a + d e m o g r a f i s i a + d e m o g r a f i s t a + d e m o i s e l l e + d e m o k r a a t e i l l e + d e m o k r a a t i k s i + d e m o k r a a t i s t a + d e m o k r a a t t e j a + d e m o k r a a t t i e n + d e m o k r a a t t i e n e m m i s t ö i n e n + d e m o k r a a t t i e n e m m i s t ö n + d e m o k r a a t t i p u o l u e + d e m o k r a a t t i p u o l u e e n + d e m o k r a a t t i p u o l u e t t a + d e m o k r a a t t i r y h m ä n + d e m o k r a a t t i s e e n + d e m o k r a a t t i s e k s i + d e m o k r a a t t i s e l l a + d e m o k r a a t t i s e m m a k s i + d e m o k r a a t t i s e m m a l l a + d e m o k r a a t t i s e m m a l l e + d e m o k r a a t t i s e m m a n + d e m o k r a a t t i s e m m a s s a + d e m o k r a a t t i s e m m a s t a + d e m o k r a a t t i s e m m a t + d e m o k r a a t t i s e m m i k s i + d e m o k r a a t t i s e m m i n + d e m o k r a a t t i s e m m i s s a + d e m o k r a a t t i s e m m i s t a + d e m o k r a a t t i s e m p a a + d e m o k r a a t t i s e m p a a n + d e m o k r a a t t i s e m p a n a + d e m o k r a a t t i s e m p i + d e m o k r a a t t i s e m p i a + d e m o k r a a t t i s e m p i i n + d e m o k r a a t t i s e n + d e m o k r a a t t i s e n a + d e m o k r a a t t i s e n a a t t o r i + d e m o k r a a t t i s e s s a + d e m o k r a a t t i s e s t a + d e m o k r a a t t i s e t + d e m o k r a a t t i s i a + d e m o k r a a t t i s i i n + d e m o k r a a t t i s i l l a + d e m o k r a a t t i s i l l e + d e m o k r a a t t i s i m m a l l e + d e m o k r a a t t i s i m m a n + d e m o k r a a t t i s i m m a s s a + d e m o k r a a t t i s i m m a t + d e m o k r a a t t i s i m m i s s a + d e m o k r a a t t i s i m m i s t a + d e m o k r a a t t i s i m p i n a + d e m o k r a a t t i s i n + d e m o k r a a t t i s i n t a + d e m o k r a a t t i s i s s a + d e m o k r a a t t i s i s t a + d e m o k r a a t t i s t e n + d e m o k r a a t t i s u u d e n + d e m o k r a a t t i s u u t e n s a + d e m o k r a a t t i s u u t t a + d e m o k r a t i a a + d e m o k r a t i a a m m e + d e m o k r a t i a a n + d e m o k r a t i a b o n u s + d e m o k r a t i a e h d o n + d e m o k r a t i a e h t o a + d e m o k r a t i a e h t o j e n + d e m o k r a t i a f o o r u m i s s a + d e m o k r a t i a h a n k k e e k s i + d e m o k r a t i a h a n k k e e n + d e m o k r a t i a h a n k k e e s e e n + d e m o k r a t i a h a n k k e e t + d e m o k r a t i a h a n k k e i s t a + d e m o k r a t i a h e n k i s e n + d e m o k r a t i a h i s t o r i a a n + d e m o k r a t i a h y ö t y j ä + d e m o k r a t i a i n n o v a a t i o n s a + d e m o k r a t i a j ä r j e s t e l m ä + d e m o k r a t i a j ä r j e s t e l m ä l l ä ä n + d e m o k r a t i a j ä r j e s t e l m ä ä + d e m o k r a t i a j ä r j e s t ö + d e m o k r a t i a j ä r j e s t ö ä + d e m o k r a t i a k e h i t y k s e e n + d e m o k r a t i a k e h i t y k s e l l e + d e m o k r a t i a k e h i t y k s e l t ä + d e m o k r a t i a k e h i t y k s e n + d e m o k r a t i a k e h i t y k s e s s ä + d e m o k r a t i a k e h i t y k s e s t ä + d e m o k r a t i a k e h i t y s + d e m o k r a t i a k e h i t y s t ä + d e m o k r a t i a k e h i t y s t ä ä n + d e m o k r a t i a k e s k u k s e l l e + d e m o k r a t i a k e s k u k s e s t a + d e m o k r a t i a k e s k u s + d e m o k r a t i a k o k e i l u + d e m o k r a t i a k o m i t e a n + d e m o k r a t i a k o u l u t u k s e k s i + d e m o k r a t i a k r i i s i + d e m o k r a t i a k u i l u n + d e m o k r a t i a k u m p p a n u u t t a + d e m o k r a t i a k y k y + d e m o k r a t i a k y s y m y k s e e n + d e m o k r a t i a k y s y m y k s e n + d e m o k r a t i a k y s y m y k s e t + d e m o k r a t i a k y s y m y k s i i n + d e m o k r a t i a k y s y m y k s i ä + d e m o k r a t i a k y s y m y s + d e m o k r a t i a k y s y m y s t e n + d e m o k r a t i a k ä s i t y k s e m m e + d e m o k r a t i a k ä s i t y k s e n + d e m o k r a t i a k ä s i t y k s e s s ä m m e + d e m o k r a t i a k ä s i t y k s e s t ä + d e m o k r a t i a k ä s i t y s + d e m o k r a t i a l a u s e k e + d e m o k r a t i a l a u s e k e t t a + d e m o k r a t i a l a u s e k k e e l l a + d e m o k r a t i a l a u s e k k e e n + d e m o k r a t i a l a u s e k k e e s e e n + d e m o k r a t i a l a u s e k k e e s s a + d e m o k r a t i a l a u s e k k e e s s a m m e + d e m o k r a t i a l a u s e k k e e s t a + d e m o k r a t i a l a u s e k k e e t + d e m o k r a t i a l a u s e k k e i d e n + d e m o k r a t i a l a u s e k k e i t a + d e m o k r a t i a l i i g a n + d e m o k r a t i a l i i k e + d e m o k r a t i a l i i k e h d i n t ä + d e m o k r a t i a l i i k e t t ä + d e m o k r a t i a l i i k k e e l l e + d e m o k r a t i a l i i k k e e n + d e m o k r a t i a l i i k k e e s e e n + d e m o k r a t i a l i i k k e e s t ä + d e m o k r a t i a l i i k k e e t + d e m o k r a t i a l i i k k e i d e n + d e m o k r a t i a l i i k k e i k s i + d e m o k r a t i a l i i t o n + d e m o k r a t i a l i i t t o + d e m o k r a t i a l l e + d e m o k r a t i a l o u k k a u k s e n + d e m o k r a t i a l o u k k a u s t e n + d e m o k r a t i a m a l l e j a m m e + d e m o k r a t i a m a l l i a m m e + d e m o k r a t i a m a l l i n + d e m o k r a t i a m a l l i s s a m m e + d e m o k r a t i a m i e l i s e n + d e m o k r a t i a m m e + d e m o k r a t i a m u o t o + d e m o k r a t i a n + d e m o k r a t i a n a + d e m o k r a t i a n o r m e j a + d e m o k r a t i a n o r m i t + d e m o k r a t i a n s a + d e m o k r a t i a n v a s t a i n e n + d e m o k r a t i a n v a s t a i s e n + d e m o k r a t i a n v a s t a i s e t + d e m o k r a t i a n v a s t a i s t a + d e m o k r a t i a n ä k e m y s t ä ä n + d e m o k r a t i a n ä k ö k o h t a + d e m o k r a t i a o d o t u k s i a + d e m o k r a t i a o h j e l m a + d e m o k r a t i a o h j e l m a a + d e m o k r a t i a o h j e l m a n + d e m o k r a t i a o h j e l m a s s a + d e m o k r a t i a o h j e l m a t + d e m o k r a t i a o h j e l m i a + d e m o k r a t i a o h j e l m i a m m e + d e m o k r a t i a o h j e l m i e n + d e m o k r a t i a o h j e l m i i n + d e m o k r a t i a o h j e l m i s s a + d e m o k r a t i a o n g e l m a + d e m o k r a t i a o n g e l m a a n + d e m o k r a t i a o n g e l m a t + d e m o k r a t i a o n g e l m i a + d e m o k r a t i a o n g e l m i e n + d e m o k r a t i a p a l k i n n o n + d e m o k r a t i a p a l k i n t o + d e m o k r a t i a p e r i a a t e + d e m o k r a t i a p e r i a a t e t t a + d e m o k r a t i a p e r i a a t t e e n + d e m o k r a t i a p e r i a a t t e e t + d e m o k r a t i a p e r i a a t t e i d e n + d e m o k r a t i a p e r i n t e e n + d e m o k r a t i a p e r i n t e i n e e n + d e m o k r a t i a p o h j a n + d e m o k r a t i a p o l i i t t i s e t + d e m o k r a t i a p r o s e s s e j a + d e m o k r a t i a p r o s e s s i + d e m o k r a t i a p r o s e s s i a + d e m o k r a t i a p r o s e s s i e n + d e m o k r a t i a p r o s e s s i i n + d e m o k r a t i a p r o s e s s i l l e + d e m o k r a t i a p r o s e s s i n + d e m o k r a t i a p r o s e s s i s s a + d e m o k r a t i a p r o s e s s i s t a + d e m o k r a t i a p u o l u e + d e m o k r a t i a p u o l u e e n + d e m o k r a t i a p u o l u e e s e e n + d e m o k r a t i a p u o l u e t t a + d e m o k r a t i a p y r k i m y k s e t + d e m o k r a t i a p y r k i m y k s i s s ä + d e m o k r a t i a p y r k i m y s t e n + d e m o k r a t i a r a h a s t o + d e m o k r a t i a r a h a s t o n + d e m o k r a t i a s i s ä l l ö n + d e m o k r a t i a s o k i n + d e m o k r a t i a s s a + d e m o k r a t i a s s a k i n + d e m o k r a t i a s t a + d e m o k r a t i a s t a n d a r d e j a + d e m o k r a t i a s u u n t a u k s i a + d e m o k r a t i a t + d e m o k r a t i a t a i s t e l i j o i d e n + d e m o k r a t i a t a i s t e l u a + d e m o k r a t i a t a j u a + d e m o k r a t i a t a k e e t + d e m o k r a t i a t a v o i t t e i t a + d e m o k r a t i a t e s t i s s ä + d e m o k r a t i a t i e n + d e m o k r a t i a t i l a n t e e s e e n + d e m o k r a t i a t o i v e i t a + d e m o k r a t i a t u e n + d e m o k r a t i a u u d i s t u k s e e n + d e m o k r a t i a u u d i s t u k s e n + d e m o k r a t i a u u d i s t u k s e s t a + d e m o k r a t i a u u d i s t u k s e t + d e m o k r a t i a u u d i s t u k s i a + d e m o k r a t i a u u d i s t u k s i a a n + d e m o k r a t i a u u d i s t u k s i s t a + d e m o k r a t i a u u d i s t u s + d e m o k r a t i a u u d i s t u s t a + d e m o k r a t i a u u d i s t u s t e n + d e m o k r a t i a v a a t i m u k s e l l e + d e m o k r a t i a v a a t i m u k s e n + d e m o k r a t i a v a a t i m u k s e t + d e m o k r a t i a v a a t i m u k s i a + d e m o k r a t i a v a a t i m u k s i s t a + d e m o k r a t i a v a a t i m u s t e n + d e m o k r a t i a v a j a u s + d e m o k r a t i a v a j e + d e m o k r a t i a v a j e e k s i + d e m o k r a t i a v a j e e l l e + d e m o k r a t i a v a j e e m m e + d e m o k r a t i a v a j e e n + d e m o k r a t i a v a j e e s e e n + d e m o k r a t i a v a j e e s e e n k i n + d e m o k r a t i a v a j e e s t a + d e m o k r a t i a v a j e e t + d e m o k r a t i a v a j e i d e n + d e m o k r a t i a v a j e t t a + d e m o k r a t i a v a l u u t t a n s a + d e m o k r a t i a v a p a a + d e m o k r a t i a v a s t a i s i a + d e m o k r a t i a v o i m i l l e + d e m o k r a t i a v ä l i n e e n + d e m o k r a t i a v ä l i n e t t ä + d e m o k r a t i a y k s i k k ö + d e m o k r a t i o i d e n + d e m o k r a t i o i h i n s a + d e m o k r a t i o i l l e + d e m o k r a t i o i n a + d e m o k r a t i o i s s a + d e m o k r a t i o i t a + d e m o k r a t i s o i m a a n + d e m o k r a t i s o i m i n e n + d e m o k r a t i s o i m i s e n + d e m o k r a t i s o i m i s p r o s e s s i + d e m o k r a t i s o i m i s p r o s e s s i a + d e m o k r a t i s o i m i s p r o s e s s i s t a + d e m o k r a t i s o i m i s t a + d e m o k r a t i s o i n n i n + d e m o k r a t i s o i n n i s s a + d e m o k r a t i s o i n n i s t a + d e m o k r a t i s o i n t i a + d e m o k r a t i s o i n t i h a l u k k u u d e l l a a n + d e m o k r a t i s o i n t i l i i k e + d e m o k r a t i s o i n t i o h j e l m a + d e m o k r a t i s o i n t i o h j e l m i e n + d e m o k r a t i s o i n t i o h j e l m i s s a a n + d e m o k r a t i s o i n t i p r o s e s s e i h i n + d e m o k r a t i s o i n t i p r o s e s s i + d e m o k r a t i s o i n t i p r o s e s s i a + d e m o k r a t i s o i n t i p r o s e s s i e n + d e m o k r a t i s o i n t i p r o s e s s i i n + d e m o k r a t i s o i n t i p r o s e s s i k s i + d e m o k r a t i s o i n t i p r o s e s s i n + d e m o k r a t i s o i n t i p r o s e s s i s s a + d e m o k r a t i s o i n t i p r o s e s s i s t a + d e m o k r a t i s o i n t i p y r k i m y k s e s t ä + d e m o k r a t i s o i n t i p y r k i m y k s e t + d e m o k r a t i s o i n t i p y r k i m y k s i ä + d e m o k r a t i s o i n t i t a v o i t t e e n + d e m o k r a t i s o i n t i v a a t i m u k s e e n + d e m o k r a t i s o i t u + d e m o k r a t i s o i t u a + d e m o k r a t i s o i t u i s i + d e m o k r a t i s o i t u m a a n + d e m o k r a t i s o i t u m a s s a + d e m o k r a t i s o i t u m i s a a l t o a + d e m o k r a t i s o i t u m i s a a l t o o n + d e m o k r a t i s o i t u m i s e e n + d e m o k r a t i s o i t u m i s e l l e + d e m o k r a t i s o i t u m i s e n + d e m o k r a t i s o i t u m i s e s s a + d e m o k r a t i s o i t u m i s e s t a + d e m o k r a t i s o i t u m i s k e h i t y k s e n + d e m o k r a t i s o i t u m i s k e h i t y k s e s s ä + d e m o k r a t i s o i t u m i s k e h i t y s t ä + d e m o k r a t i s o i t u m i s k r i t e e r e i s t ä + d e m o k r a t i s o i t u m i s o h j e l m i e n + d e m o k r a t i s o i t u m i s p o t e n t i a a l i a + d e m o k r a t i s o i t u m i s p r o s e s s e i h i n + d e m o k r a t i s o i t u m i s p r o s e s s i + d e m o k r a t i s o i t u m i s p r o s e s s i a + d e m o k r a t i s o i t u m i s p r o s e s s i e n + d e m o k r a t i s o i t u m i s p r o s e s s i i n + d e m o k r a t i s o i t u m i s p r o s e s s i l l e + d e m o k r a t i s o i t u m i s p r o s e s s i n + d e m o k r a t i s o i t u m i s p r o s e s s i n s a + d e m o k r a t i s o i t u m i s p r o s e s s i s s a + d e m o k r a t i s o i t u m i s p r o s e s s i s s a a n + d e m o k r a t i s o i t u m i s p r o s e s s i t + d e m o k r a t i s o i t u m i s p y r k i m y k s i s s ä ä n + d e m o k r a t i s o i t u m i s s u u n t a u s + d e m o k r a t i s o i t u m i s t a + d e m o k r a t i s o i t u m i s u u d i s t u k s e n + d e m o k r a t i s o i t u u + d e m o n i s o t a + d e m o n i t + d e m o n s t r a a t i o f u u s i o r e a k t o r i + d e m o n s t r a a t i o f u u s i o v o i m a l a i t o k s e n + d e m o n s t r a a t i o h a n k e + d e m o n s t r a a t i o h a n k e t t a + d e m o n s t r a a t i o h a n k k e e n + d e m o n s t r a a t i o h a n k k e i d e n + d e m o n s t r a a t i o h a n k k e i s i i n + d e m o n s t r a a t i o h a n k k e i t a + d e m o n s t r a a t i o l a i t o k s e n + d e m o n s t r a a t i o l a i t o k s i a + d e m o n s t r a a t i o l a i t o k s i s t a + d e m o n s t r a a t i o l a i t o s t e n + d e m o n s t r a a t i o p r o j e k t e i h i n + d e m o n s t r o i n n i n + d e m o n s t r o i n t i h a n k e t t a + d e m o n s t r o i n t i h a n k k e e t + d e m o n s t r o i n t i h a n k k e i d e n + d e m o n s t r o i n t i h a n k k e i t a + d e m o n s t r o i n t i l a i t o k s e n + d e m o n s t r o i n t i l a i t o k s i a + d e m o n s t r o i n t i l a i t o s t a + d e m o n s t r o i n t i l a i t o s t e n + d e m o n s t r o i n t i v a i h e t t a + d e n g u e k u u m e + d e n g u e k u u m e e s e e n + d e o d o r a n t t i a + d e o d o r a n t t i p u l l o j a + d e o n t o l o g i a + d e p a r t e m e n t e i l l e + d e p a r t e m e n t e i s s a + d e p a r t e m e n t i n + d e p a r t e m e n t i t + d e p a r t e m e n t t e j a + d e p a r t e m e n t t i e n + d e p o t i n + d e r i v a a t t a r y h m ä + d e r m a t a a n i s u l f a a t t i + d e s i b e l i m i t t a r i + d e s i b e l i r a j o i s t a + d e s i b e l i r a j o i t u k s i a + d e s i b e l i r a j o j a + d e s i b e l i t a s o j a + d e s i b e l i t a s o l l a + d e s i m a a l i l u k u j a + d e s i m a a l i l u v u i n + d e s i m a a l i p i l k k u a + d e s i m a a l i v a l u u t t a a n + d e s i n f i o i n t i m a t o t + d e s i n f i o i n t i m a t t o j e n + d e s i n f i o i n t i t i l a t + d e s i n f i o i n t i t o i m e n p i t e e t + d e s i n f i o i v i a + d e v a l v a a t i o i d e n + d e v a l v a a t i o k i l p a i l u a + d e v a l v o i m i s e e n + d e v a l v o i n n i n + d e v a n + d i a b e e t i k k o j ä r j e s t ö j ä + d i a b e e t i k k o j ä r j e s t ö t + d i a b e e t i k o i l l e + d i a b e t e s p ä i v ä + d i a b e t e s p ä i v ä ä + d i a b e t e s t a + d i a b e t e s t a b l e t i t + d i a b e t e s t u k i k l i n i k o i l l a + d i a b e t e s t u o t t e i d e n + d i a b e t e s t u o t t e i s s a + d i a b e t e s t y y p i n + d i a d e e m i k e i j u a h v e n + d i a f i l m i + d i a g n o o s i m e n e t e l m i ä + d i a g n o o s i n + d i a g n o o s i o n g e l m i e n + d i a g n o o s i v ä l i n e i d e n + d i a g n o o s i v ä l i n e i t ä + d i a g n o s o i n t i a i k a + d i a g n o s o i n t i j ä r j e s t e l m ä + d i a g n o s o i n t i l a i t t e e t + d i a g n o s o i n t i m e n e t e l m i ä + d i a g n o s o i n t i o h j e l m i s s a + d i a g n o s o i n t i t e k n i i k o i h i n + d i a g n o s o i n t i t e k n i i k o i t a + d i a g n o s o i n t i v a i h e e n + d i a g n o s o i n t i v ä l i n e i t ä + d i a g o n a a l i a r g u m e n t t i + d i a l o g i n + d i a l y y s i h o i t o a + d i a l y y s i h o i t o y k s i k ö t + d i a l y y s i l a i t t e i s i i n + d i a l y y s i l a i t t e i t a + d i a l y y s i l ä ä k ä r i + d i a l y y s i p o t i l a i d e n + d i a n a + d i a p a u s s i + d i a p r o j e k t o r i + d i a t s o n i u m s u o l a t + d i e s e l a j o n e u v o + d i e s e l a j o n e u v o i h i n + d i e s e l a j o n e u v o i l l e + d i e s e l a j o n e u v o j a + d i e s e l a j o n e u v o j e n + d i e s e l a j o n e u v o t + d i e s e l a u t o i h i n + d i e s e l a u t o j a + d i e s e l a u t o t + d i e s e l h e n k i l ö a u t o i h i n + d i e s e l h e n k i l ö a u t o i s s a + d i e s e l h e n k i l ö a u t o j a + d i e s e l h e n k i l ö a u t o j e n + d i e s e l h i u k k a s s u o d a t t i m e t + d i e s e l h i u k k a s s u o d a t t i m i e n + d i e s e l i n + d i e s e l k a a s u t + d i e s e l k ä y t t ö i s i i n + d i e s e l m o o t t o r e i d e n + d i e s e l m o o t t o r e i h i n + d i e s e l m o o t t o r e i l l a + d i e s e l m o o t t o r e i s s a + d i e s e l m o o t t o r e i s t a + d i e s e l m o o t t o r e i t a + d i e s e l m o o t t o r i + d i e s e l m o o t t o r i e n + d i e s e l m o o t t o r i i n + d i e s e l m o o t t o r i t + d i e s e l o h j e l m a n + d i e s e l p o l t t o a i n e + d i e s e l p o l t t o a i n e e n + d i e s e l p o l t t o a i n e i d e n + d i e s e l p o l t t o a i n e i s s a + d i e s e l p o l t t o a i n e i t a + d i e s e l p o l t t o a i n e t t a + d i e s e l p ä ä s t ö j ä + d i e s e l s ä h k ö v e t u r e i d e n + d i e s e l v e r o + d i e s e l v e r o a s t e i l l a + d i e s e l v e r o j a + d i e s e l v e r o j e n + d i e s e l v e r o k a n t o j e n + d i e s e l v e r o n + d i e s e l v e t u r e i d e n + d i e s e l v e t u r i + d i e s e l v e t u r i t + d i e s e l ö l j y + d i e s e l ö l j y j ä + d i e s e l ö l j y l l e + d i e s e l ö l j y l ä i k k ä ä n + d i e s e l ö l j y n + d i e s e l ö l j y t u r i s m i a + d i e s e l ö l j y v e r o + d i e s e l ö l j y v e r o n + d i e s e l ö l j y y n + d i e s e l ö l j y ä + d i e t y l e e n i g l y k o l i + d i e t y l e e n i g l y k o l i a + d i e t y l e e n i t r i a m i i n i p e n t a e t i k k a h a p p o + d i e t y y l i a m i n o r i k k i t r i f l u o r i d i + d i e t y y l i e e t t e r i + d i e t y y l i f t a l a a t t i + d i e t y y l i t a r t r a a t t i + d i f e n y y l i e e t t e r i + d i f f e r e n s s i k o n e + d i f f e r e n s s i m e n e t e l m ä + d i f f e r e n s s i y h t ä l ö + d i f f e r e n t i a a l i a n a l y s a a t t o r i + d i f f e r e n t i a a l i d i a g n o s t i i k k a + d i f f e r e n t i a a l i g e o m e t r i a + d i f f e r e n t i a a l i o p e r a a t t o r i + d i f f e r e n t i a a l i y h t ä l ö + d i f f u u s i o t e n s o r i k u v a u s + d i f o s f o r i t e t r a j o d i d i + d i f t a l a a t t i + d i g a m m a f u n k t i o + d i g i s o v i t t i m i a + d i g i s o v i t t i m i e n + d i g i t a a l i a g e n d a + d i g i t a a l i a g e n d a n + d i g i t a a l i a i k a + d i g i t a a l i a i k a a + d i g i t a a l i a i k a a n + d i g i t a a l i a i k a k a u d e l l a + d i g i t a a l i a i k a k a u s i + d i g i t a a l i a i k a n a + d i g i t a a l i a j a l l a + d i g i t a a l i a j a n + d i g i t a a l i a j a s t a + d i g i t a a l i a l a a + d i g i t a a l i a l a l l a + d i g i t a a l i a l a n + d i g i t a a l i a r k i s t o + d i g i t a a l i a s i o i h i n + d i g i t a a l i d i p l o m a t i a n + d i g i t a a l i e l e k t r o n i i k a n + d i g i t a a l i e l o k u v a + d i g i t a a l i e l o k u v a a + d i g i t a a l i g i l j o t i i n i a + d i g i t a a l i k a m e r a n + d i g i t a a l i k a m e r a t + d i g i t a a l i k a m e r o i d e n + d i g i t a a l i k a n a v i e n + d i g i t a a l i k a u d e l l a + d i g i t a a l i k i r j a s t o + d i g i t a a l i k u i l u + d i g i t a a l i l ä h e t y k s e n + d i g i t a a l i l ä h e t y k s e t + d i g i t a a l i l ä h e t y k s i i n + d i g i t a a l i l ä h e t y k s i l l e + d i g i t a a l i m a a i l m a a + d i g i t a a l i m a a i l m a a n + d i g i t a a l i m a a i l m a s s a + d i g i t a a l i m a r k k i n a t + d i g i t a a l i m a r k k i n o i d e n + d i g i t a a l i m a r k k i n o i l l a + d i g i t a a l i m u o t o i h i n + d i g i t a a l i m u o t o i n e n + d i g i t a a l i o h j e l m a a + d i g i t a a l i o h j e l m a s t a + d i g i t a a l i o p p a a n + d i g i t a a l i p a l v e l u i h i n + d i g i t a a l i p a l v e l u j e n + d i g i t a a l i p i i r i t + d i g i t a a l i p o l i t i i k k a + d i g i t a a l i r a d i o + d i g i t a a l i r a d i o l ä h e t y s t o i m i n t a a + d i g i t a a l i r a d i o t a + d i g i t a a l i s e e n + d i g i t a a l i s e l l a + d i g i t a a l i s e n + d i g i t a a l i s e s s a + d i g i t a a l i s e s t a + d i g i t a a l i s e t + d i g i t a a l i s i l l a + d i g i t a a l i s i s ä l l ö n + d i g i t a a l i s o v i t i n + d i g i t a a l i s t e n + d i g i t a a l i s t r a t e g i a + d i g i t a a l i s t r a t e g i a a + d i g i t a a l i s t r a t e g i a a n + d i g i t a a l i s t r a t e g i a l l a + d i g i t a a l i s t r a t e g i a l l e + d i g i t a a l i s t r a t e g i a n + d i g i t a a l i s t r a t e g i a s s a + d i g i t a a l i s t r a t e g i a s t a + d i g i t a a l i s u k u p o l v e n + d i g i t a a l i t a l o u d e s s a + d i g i t a a l i t a l o u s + d i g i t a a l i t a l o u t e e n + d i g i t a a l i t a l o u t t a + d i g i t a a l i t e k n i i k a l l a + d i g i t a a l i t e k n i i k a n + d i g i t a a l i t e k n i i k a s t a + d i g i t a a l i t e k n i i k k a a + d i g i t a a l i t e k n i i k k a a n + d i g i t a a l i t e k n i i k o i l l a + d i g i t a a l i t e k n o l o g i a a n + d i g i t a a l i t e k n o l o g i a l l a + d i g i t a a l i t e k n o l o g i a n + d i g i t a a l i t e l e v i s i o + d i g i t a a l i t e l e v i s i o i s t a + d i g i t a a l i t e l e v i s i o j ä r j e s t e l m ä t + d i g i t a a l i t e l e v i s i o l a i t t e i d e n + d i g i t a a l i t e l e v i s i o l l a + d i g i t a a l i t e l e v i s i o n + d i g i t a a l i t e l e v i s i o o n + d i g i t a a l i t e l e v i s i o p a l v e l u i d e n + d i g i t a a l i t e l e v i s i o s t a + d i g i t a a l i t e l e v i s i o s t a n d a r d e j a + d i g i t a a l i t e l e v i s i o t a + d i g i t a a l i t e l e v i s i o t e k n i i k a s s a + d i g i t a a l i t e l e v i s i o t o i m i l u p i i n + d i g i t a a l i u u d i s t u s t a + d i g i t a a l i v a l v o n t a d i k t a t u u r i + d i g i t a a l i v a s t a a n o t i n t a + d i g i t a a l i v e r k o s t o i h i n + d i g i t a a l i y h t e i s k u n n a n + d i g i t a a l i y h t e i s k u n n a s s a + d i g i t a a l i y l i j ä ä m ä n + d i g i t a a l i y m p ä r i s t ö s s ä + d i g i t a l i s o i n n i s s a + d i g i t a l i s o i n t i h a n k k e e s s a + d i g i t a l i s o i n t i m a l l i + d i g i t a l i s o i n t i m a l l i n + d i g i t a l i s o i n t i o h j e l m a + d i g i t a l i s o i t u n a + d i g i t o i n t i p r o s e s s i n + d i g i t o i t u a + d i g i t o i t u u n + d i h i i l i m o n o k s i d i + d i h y d r o k s i a s e t o n i f o s f a a t t i + d i h y d r o k s i b e n t s o e h a p p o + d i k a r b o k s y y l i h a p o t + d i k l o o r i m e t a a n i e n + d i k l o o r i m e t a a n i m y r k y t y k s e l l e + d i k l o o r i o k s i d i + d i k t a a t t o r e i l l e + d i k t a a t t o r e i t a + d i k t a a t t o r e j a + d i k t a a t t o r i a + d i k t a a t t o r i e n + d i k t a a t t o r i h a l l i n t o a + d i k t a a t t o r i h a l l i t s i j a + d i k t a a t t o r i h a l l i t u k s e s t a + d i k t a a t t o r i h a l l i t u s t a + d i k t a a t t o r i k o l l e g o i l l a a n + d i k t a a t t o r i l l a + d i k t a a t t o r i n + d i k t a a t t o r i p r e s i d e n t t i + d i k t a a t t o r i p u o l u e e n + d i k t a a t t o r i s t a + d i k t a a t t o r i t o v e r i t + d i k t a a t t o r i v a l l a n + d i k t a a t t o r i v a l t a + d i k t a t o r i s e e n + d i k t a t o r i s e n + d i k t a t o r i s e s t a + d i k t a t o r i s i m p i i n + d i k t a t o r i s i s s a + d i k t a t o r i s i s t a + d i k t a t o r i s t a + d i k t a t o r i s t e n + d i k t a t u u r e i k s i + d i k t a t u u r e i s s a + d i k t a t u u r e i s t a + d i k t a t u u r e j a + d i k t a t u u r e j a a n + d i k t a t u u r i a + d i k t a t u u r i e n + d i k t a t u u r i h a l l i n n o i l l e + d i k t a t u u r i h a l l i n n o n + d i k t a t u u r i h a l l i n n o s t a + d i k t a t u u r i h a l l i n n o t + d i k t a t u u r i h a l l i n t o + d i k t a t u u r i h a l l i n t o a + d i k t a t u u r i h a l l i n t o j e n + d i k t a t u u r i h a l l i n t o o n + d i k t a t u u r i h a l l i t u k s e t + d i k t a t u u r i h a l l i t u k s i a + d i k t a t u u r i h a l l i t u k s i s t a + d i k t a t u u r i h a l l i t u s + d i k t a t u u r i i n + d i k t a t u u r i j a k s o i s t a + d i k t a t u u r i k a u d e s t a + d i k t a t u u r i l l e + d i k t a t u u r i n + d i k t a t u u r i n v a i h d o k s e n + d i k t a t u u r i r a k e n t e i t a + d i k t a t u u r i s s a + d i k t a t u u r i s t a + d i k t a t u u r i t + d i k t a t u u r i v a l t i o + d i k t a t u u r i v a l t i o i d e n + d i k t a t u u r i v a l t i o i s s a + d i k t a t u u r i v a l t i o s s a + d i k t a t u u r i v a l t i o t a + d i k t a t u u r i v u o s i e n + d i m a n g a a n i d e k a k a r b o n y y l i + d i m a s i a + d i m a s i i n + d i m a s i l l e + d i m a s i l t a + d i m a s i n + d i m a s i s t a + d i m e n s i o a n a l y y s i + d i m e t y y l i a l l y y l i p y r o f o s f a a t t i + d i m e t y y l i d i s u l f i d i + d i m e t y y l i e e t t e r i + d i m e t y y l i f t a l a a t t i + d i m e t y y l i f u m a r a a t t i + d i m e t y y l i k a r b o n a a t t i + d i m e t y y l i s u l f a a t t i + d i m e t y y l i s u l f i d i + d i m e t y y l i s u l f o k s i d i u u t t e e s e e n + d i m e t y y l i t e l l u r i d i + d i m e t y y l i t e r e f t a l a a t t i + d i n k a t + d i n o j u n a + d i n o s a u r u k s i s t a + d i n o s a u r u s p u i s t o + d i n o s a u r u s t e k n i i k k a + d i n o v a u v a t + d i o d i t + d i o k s i d i p ä ä s t ö j ä + d i o k s i i n i a + d i o k s i i n i a r v o j a + d i o k s i i n i a r v o t + d i o k s i i n i k a n a s k a n d a a l i + d i o k s i i n i k a n a t + d i o k s i i n i k a n o i h i n + d i o k s i i n i k a n o i s t a + d i o k s i i n i k a n o j a + d i o k s i i n i k r i i s e i s t ä + d i o k s i i n i k r i i s i + d i o k s i i n i k r i i s i i n + d i o k s i i n i k r i i s i n + d i o k s i i n i k r i i s i s t ä + d i o k s i i n i k r i i s i t + d i o k s i i n i k r i i s i ä + d i o k s i i n i k y s y m y s t ä + d i o k s i i n i l ä h t e e t + d i o k s i i n i m ä ä r ä t + d i o k s i i n i n o r m i t + d i o k s i i n i n ä y t t e i d e n + d i o k s i i n i o n g e l m a + d i o k s i i n i o n g e l m a a + d i o k s i i n i o n g e l m a n + d i o k s i i n i o n g e l m a s t a + d i o k s i i n i o n g e l m a t + d i o k s i i n i o n g e l m i i n + d i o k s i i n i p i t o i s u u d e t + d i o k s i i n i p i t o i s u u k s i a + d i o k s i i n i p i t o i s u u s + d i o k s i i n i p i t o i s u u t t a + d i o k s i i n i p ä ä s t ö i l l e + d i o k s i i n i p ä ä s t ö i s t ä + d i o k s i i n i p ä ä s t ö j e n + d i o k s i i n i p ä ä s t ö j ä + d i o k s i i n i r e k i s t e r i + d i o k s i i n i r e k i s t e r i n + d i o k s i i n i r e k i s t e r i ä + d i o k s i i n i s a a s t e + d i o k s i i n i s a a s t u m i s e s t a + d i o k s i i n i s k a n d a a l i + d i o k s i i n i s k a n d a a l i a + d i o k s i i n i s k a n d a a l i e n + d i o k s i i n i s k a n d a a l i n + d i o k s i i n i s k a n d a a l i s s a + d i o k s i i n i t + d i o k s i i n i t a p a u k s e n + d i o k s i i n i t a p a u k s e s t a + d i o k s i i n i t a p a u s + d i o k s i i n i t a s o + d i o k s i i n i t a s o i h i n + d i o k s i i n i t a s o j e n + d i p l o m a a t i l t a + d i p l o m a a t i t + d i p l o m a a t t e j a + d i p l o m a a t t i a l o i t e t t a + d i p l o m a a t t i a s e m a n + d i p l o m a a t t i e d u s t a j a l l e + d i p l o m a a t t i e d u s t a j a t + d i p l o m a a t t i e d u s t o j e n + d i p l o m a a t t i e d u s t u k s e n + d i p l o m a a t t i e d u s t u s + d i p l o m a a t t i e d u s t u s t a a n + d i p l o m a a t t i e d u s t u s t o a + d i p l o m a a t t i e d u s t u s t o i s s a + d i p l o m a a t t i e d u s t u s t o j a + d i p l o m a a t t i e d u s t u s t o j e n + d i p l o m a a t t i e d u s t u s t o j e n s a + d i p l o m a a t t i e d u s t u s t o n s a + d i p l o m a a t t i e d u s t u s t o t + d i p l o m a a t t i e l i m e n + d i p l o m a a t t i e n + d i p l o m a a t t i f o o r u m i e n + d i p l o m a a t t i h e n k i l ö s t ö n + d i p l o m a a t t i h e n k i l ö s t ö ä + d i p l o m a a t t i k a n a v i a + d i p l o m a a t t i k a n a v i e n + d i p l o m a a t t i k i e l e l l ä + d i p l o m a a t t i k i e l t ä + d i p l o m a a t t i k i r j e i d e n + d i p l o m a a t t i k o k o u k s e s s a + d i p l o m a a t t i k o n f e r e n s s i + d i p l o m a a t t i k o n f e r e n s s i a + d i p l o m a a t t i k o n f e r e n s s i e n + d i p l o m a a t t i k o n f e r e n s s i i n + d i p l o m a a t t i k o n f e r e n s s i s s a + d i p l o m a a t t i k o r k e a k o u l u + d i p l o m a a t t i k o r k e a k o u l u n + d i p l o m a a t t i k o u l u + d i p l o m a a t t i k o u l u i s t a + d i p l o m a a t t i k o u l u s t a + d i p l o m a a t t i k o u l u t u k s e n + d i p l o m a a t t i k o u l u t u s l a i t o k s i s s a + d i p l o m a a t t i k o u l u t u s t a + d i p l o m a a t t i k u n n a n + d i p l o m a a t t i k u n n a s s a + d i p l o m a a t t i k u n n a s t a + d i p l o m a a t t i k u n n a t + d i p l o m a a t t i k u n t a + d i p l o m a a t t i k u n t a a + d i p l o m a a t t i k u n t a a n + d i p l o m a a t t i k u n t a n a + d i p l o m a a t t i k u n t i e m m e + d i p l o m a a t t i k u n t i e n + d i p l o m a a t t i l ä h t e i d e n + d i p l o m a a t t i l ä h t e i s i i n + d i p l o m a a t t i n e u v o t t e l u j e n + d i p l o m a a t t i p a l v e l u s t a + d i p l o m a a t t i p a l v e l u t + d i p l o m a a t t i p a s s e i s s a + d i p l o m a a t t i p a s s i + d i p l o m a a t t i p a s s i n + d i p l o m a a t t i p e l i + d i p l o m a a t t i p i i r e i s s ä + d i p l o m a a t t i s e l l a + d i p l o m a a t t i s e l l e + d i p l o m a a t t i s e l t a + d i p l o m a a t t i s e m m a n + d i p l o m a a t t i s e m m i n + d i p l o m a a t t i s e m p i + d i p l o m a a t t i s e m p i a + d i p l o m a a t t i s e n + d i p l o m a a t t i s e s s a + d i p l o m a a t t i s e s t a + d i p l o m a a t t i s e s t i + d i p l o m a a t t i s e t + d i p l o m a a t t i s i a + d i p l o m a a t t i s i i n + d i p l o m a a t t i s i l l a + d i p l o m a a t t i s i n + d i p l o m a a t t i s i s s a + d i p l o m a a t t i s i s t a + d i p l o m a a t t i s t a + d i p l o m a a t t i s t a t u u t t i + d i p l o m a a t t i s t e n + d i p l o m a a t t i s u h t e e t + d i p l o m a a t t i s u h t e i d e n + d i p l o m a a t t i s u h t e i s s a + d i p l o m a a t t i s u h t e i s s a m m e + d i p l o m a a t t i s u h t e i t a + d i p l o m a a t t i s u o j a n + d i p l o m a a t t i t a p a a m i n e n + d i p l o m a a t t i t a s o l l a + d i p l o m a a t t i t o i m i e n + d i p l o m a a t t i t o i m i i n + d i p l o m a a t t i t o i m i n t a a + d i p l o m a a t t i t u k e a + d i p l o m a a t t i v a l t u u s k u n t a + d i p l o m a a t t i v e r k o s t o j e n + d i p l o m a a t t i v i e r a i l u l t a + d i p l o m a a t t i v i r a s t a + d i p l o m a a t t i v i r k o i h i n + d i p l o m a a t t i v i r k o j e n + d i p l o m a a t t i v i r o i l l e + d i p l o m a a t t i y k s i k k ö + d i p l o m a a t t i y k s i k ö i d e n + d i p l o m a a t t i y k s i k ö i l l e + d i p l o m a t i a a + d i p l o m a t i a a n + d i p l o m a t i a l l a + d i p l o m a t i a n + d i p l o m a t i a s s a + d i p l o m a t i a s t a + d i p l o m a t i a s t r a t e g i a a + d i p l o m a t i a t o i m i a + d i p l o m e i s t a + d i p o l i a n t e n n i + d i p o l i m o m e n t t i + d i r e k t i i v e i h i n + d i r e k t i i v e i s s ä + d i r e k t i i v e i s t ä + d i r e k t i i v e j ä + d i r e k t i i v i a s i a s s a + d i r e k t i i v i e h d o t u k s e e n + d i r e k t i i v i e h d o t u k s e k s i + d i r e k t i i v i e h d o t u k s e l l a + d i r e k t i i v i e h d o t u k s e l l e + d i r e k t i i v i e h d o t u k s e l l e m m e + d i r e k t i i v i e h d o t u k s e m m e + d i r e k t i i v i e h d o t u k s e n + d i r e k t i i v i e h d o t u k s e n n e + d i r e k t i i v i e h d o t u k s e n s a + d i r e k t i i v i e h d o t u k s e s s a + d i r e k t i i v i e h d o t u k s e s s a a n + d i r e k t i i v i e h d o t u k s e s t a + d i r e k t i i v i e h d o t u k s e t + d i r e k t i i v i e h d o t u k s i a + d i r e k t i i v i e h d o t u k s i i n + d i r e k t i i v i e h d o t u k s i l l a + d i r e k t i i v i e h d o t u k s i n + d i r e k t i i v i e h d o t u k s i s s a + d i r e k t i i v i e h d o t u k s i s t a + d i r e k t i i v i e h d o t u s + d i r e k t i i v i e h d o t u s t a + d i r e k t i i v i e h d o t u s t a a n + d i r e k t i i v i e h d o t u s t e n + d i r e k t i i v i e n + d i r e k t i i v i e s i t y k s e e n + d i r e k t i i v i e s i t y k s e n + d i r e k t i i v i e s i t y k s e s s ä + d i r e k t i i v i e s i t y k s i ä + d i r e k t i i v i e s i t y s t ä + d i r e k t i i v i h a n k k e e s s a + d i r e k t i i v i i n + d i r e k t i i v i j ä r j e s t e l m ä n + d i r e k t i i v i j ä r j e s t e l m ä ä + d i r e k t i i v i k e h y k s e n + d i r e k t i i v i k e h y s + d i r e k t i i v i k e s k u s t e l u + d i r e k t i i v i k s i + d i r e k t i i v i l l e + d i r e k t i i v i l l ä + d i r e k t i i v i l u o n n o k s e e n + d i r e k t i i v i l u o n n o k s e l l a + d i r e k t i i v i l u o n n o k s e l l e + d i r e k t i i v i l u o n n o k s e l t a + d i r e k t i i v i l u o n n o k s e n + d i r e k t i i v i l u o n n o k s e s s a + d i r e k t i i v i l u o n n o k s e s t a + d i r e k t i i v i l u o n n o k s e t + d i r e k t i i v i l u o n n o k s i a + d i r e k t i i v i l u o n n o s + d i r e k t i i v i l u o n n o s t a + d i r e k t i i v i l u o n n o s t a a n + d i r e k t i i v i m u o d o n + d i r e k t i i v i m u u t o k s e n + d i r e k t i i v i m u u t o s t a + d i r e k t i i v i n + d i r e k t i i v i n ä + d i r e k t i i v i p a k e t i n + d i r e k t i i v i p a k e t i s s a + d i r e k t i i v i p a k e t i s t a + d i r e k t i i v i p a k e t t i + d i r e k t i i v i p a k e t t i a + d i r e k t i i v i s s ä + d i r e k t i i v i s t ä + d i r e k t i i v i s t ä k i n + d i r e k t i i v i t + d i r e k t i i v i t a p a a m i s i s s a + d i r e k t i i v i t e k s t i + d i r e k t i i v i t e k s t i i n + d i r e k t i i v i t e k s t i n + d i r e k t i i v i t e k s t i s s ä + d i r e k t i i v i t e k s t i s t ä + d i r e k t i i v i t e k s t i ä + d i r e k t i i v i u u d i s t u k s e n + d i r e k t i i v i v e r s i o + d i r e k t i i v i ä + d i s k o m u s i i k k i i n + d i s k o m y r k k y l u i k e r o + d i s k o n t t o k o r k o j a + d i s k o n t t o k o r o t + d i s k o p a l l o + d i s k u r s s i a n a l y y s i + d i s s o s i a a t i o h ä i r i ö + d i s u l f i d i s i d o s + d i v a n a d i i n i p e n t o k s i d i + d i v e t y m o n o k s i d i h u i j a u s + d i v i s i o o n a k e n r a a l i + d i v i s i o o n a n + d j e r m a t + d j u l a t + d o g g i l e p a k o t + d o g m a a t i k o t + d o g m a a t t i s e n + d o g m a a t t i s u u t e e n + d o g m a a t t i s u u t e e n k a a n + d o k o s a h e k s a e e n i h a p o n + d o k o s a h e k s a e e n i h a p p o a + d o k u m e n t o i m a t t o m i e n + d o k u m e n t o i n t i j ä r j e s t e l m i ä + d o k u m e n t o i n t i j ä r j e s t e l m ä + d o k u m e n t o i n t i j ä r j e s t e l m ä n + d o k u m e n t o i n t i j ä r j e s t e l m ä ä + d o k u m e n t o i n t i k e s k u k s i a + d o k u m e n t o i n t i o h j e l m a + d o k u m e n t o i n t i p r o s e s s i + d o k u m e n t o i n t i v a a t i m u k s i a + d o k u m e n t o i t a v a + d o k u m e n t o i t a v i s s a + d o k u m e n t o i t u k i n + d o k u m e n t t i e l o k u v a + d o k u m e n t t i f i l m e j ä + d o k u m e n t t i f i l m i + d o k u m e n t t i k a m e r a + d o k u m e n t t i o h j a a j a + d o k u m e n t t i o h j e l m a n + d o k u m e n t t i o h j e l m a s s a + d o k u m e n t t i o h j e l m i e n + d o k u m e n t t i p u o l e s t a + d o k u m e n t t i r o m a a n i + d o l l a r e i l l a + d o l l a r e i t a + d o l l a r i a + d o l l a r i a l u e + d o l l a r i a l u e e l l e + d o l l a r i a l u e e s e e n + d o l l a r i a l u e e s t a + d o l l a r i a l u e i l l e + d o l l a r i b a n a a n e i h i n + d o l l a r i b a n a a n e j a + d o l l a r i b a n a a n e j a m m e + d o l l a r i b a n a a n i e n + d o l l a r i b a n a a n i k i i n t i ö + d o l l a r i b a n a a n i t + d o l l a r i e n + d o l l a r i i n + d o l l a r i l l a + d o l l a r i m a i d e n + d o l l a r i m ä ä r ä i s t ä + d o l l a r i n + d o l l a r i n i p p u a + d o l l a r i p a r i t e e t i s t a + d o l l a r i p a r i t e e t t i + d o l l a r i p i n o j e n + d o l l a r i t r i l o g i a + d o l l a r i v y ö h y k k e e n + d o m i n i k a a n i l e s k i + d o m i n i k a a n i s e n + d o m i n i k a a n i s e s s a + d o m i n i k a a n i s e s t a + d o m i n i k a a n i t + d o m i n o e f e k t i + d o m i n o e f e k t i s t ä + d o m i n o i l m i ö + d o m i n o i n t i s u h d e t t a + d o m i n o p e l i n + d o m i n o t e o r i a + d o m i n o t e o r i a a + d o m i n o v a i k u t u k s e n + d o m i n o v a i k u t u k s e t + d o m i n o v a i k u t u s + d o m i n o v a i k u t u s t a + d o p a m i i n i r e s e p t o r i + d o p i n g a i n e e t + d o p i n g a i n e i d e n + d o p i n g a i n e i t a + d o p i n g a s i o i h i n + d o p i n g i i n + d o p i n g i l m i ö n + d o p i n g i n + d o p i n g i n t o r j u n t a s u u n n i t e l m a n + d o p i n g i s t a + d o p i n g k u o l e m a + d o p i n g l a i n s ä ä d ä n t ö + d o p i n g o n g e l m a n + d o p i n g t a p a u k s i a + d o p i n g t a p a u k s i s s a + d o p i n g t a p a u s + d o p i n g t a p a u s t a + d o p i n g t u o t t e i t a + d o p i n g v i t s a u k s e n + d r a a m a e l o k u v a + d r a a m a e l o k u v a s t a + d r a a m a n + d r a a m a s a r j a + d r a a m a s a r j a s s a + d r a a m a s a r j o j a + d r a k m a n + d r a m a a t t i s e e n + d r a m a a t t i s e m m a l t a + d r a m a a t t i s e m m a n + d r a m a a t t i s e m m i n + d r a m a a t t i s e m p a a + d r a m a a t t i s e m p i + d r a m a a t t i s e m p i a + d r a m a a t t i s e n + d r a m a a t t i s e s s a + d r a m a a t t i s e s t a + d r a m a a t t i s e t + d r a m a a t t i s i a + d r a m a a t t i s i i n + d r a m a a t t i s i m m i n + d r a m a a t t i s i m m i s t a + d r a m a a t t i s i m p i a + d r a m a a t t i s i n + d r a m a a t t i s i s t a + d r a m a a t t i s t a + d r a m a a t t i s t e n + d r a m a a t t i s u u d e s t a a n + d r a m a t i s o i m a t t a + d r a v i d a k i e l e t + d r a v i d a t + d u e t t o k e r t t u l i + d u e t t o l e p i n k ä i n e n + d u m p p a u k s e e n + d u m p p a u s h i n t a + d u r r a n i + d u r u m v e h n ä l l ä + d u r u m v e h n ä n + d u r u m v e h n ä s e k t o r i + d u r u m v e h n ä s t ä + d u r u m v e h n ä ä + d u r u m v e h n ä ä n + d u u m a a + d u u m a n + d u u m a s s a + d y n a a m i s e l l a + d y n a a m i s e m m a l l a + d y n a a m i s e m m a l l e + d y n a a m i s e m m a n + d y n a a m i s e m m a s t a + d y n a a m i s e m m a t + d y n a a m i s e m m i k s i + d y n a a m i s e m m i l l e + d y n a a m i s e m m i n + d y n a a m i s e m p a a + d y n a a m i s e m p a a n + d y n a a m i s e m p i + d y n a a m i s e m p i a + d y n a a m i s e m p i i n + d y n a a m i s e n + d y n a a m i s e n a + d y n a a m i s i a + d y n a a m i s i i n + d y n a a m i s i m m a k s i + d y n a a m i s i m m a n + d y n a a m i s i m m a s s a + d y n a a m i s i m m a s t a + d y n a a m i s i m m i n + d y n a a m i s i m m i s t a + d y n a a m i s i m p i a + d y n a a m i s i m p i e n + d y n a a m i s i m p i i n + d y n a a m i s i n + d y n a a m i s i n t a + d y n a a m i s t a + d y n a a m i s u u t t a + d y n a m i i k a n + d y n a m i i k a s t a + d y n a m i i k k a a + d y n a m i i t t i d o n n a + d y n a m i i t t i p ö t k ö j ä + d y n a m o t e o r i a + d y n a s t i a n + d y n a s t i a t + d y s p r a k s i a o n g e l m a n + d y s p r a k s i a o n g e l m i s t a + d y y n i k i u r u + d y y n i m u u r a + e - k o l i b a k t e e r i i n + e - l a s k u t u k s e n + e - v i t a m i i n i a + e b o l a n + e b o l a s t a + e c u j a + e c u j e n + e c u l l a + e c u s t a + e d a m j u u s t o n + e d a m j u u s t o s t a + e d e l l e e n k e h i t t ä j ä n ä + e d e l l e e n k e h i t t ä m i s e k s i + e d e l l e e n k i n + e d e l l e e n k ä ä n + e d e l l e e n l a a j e n t u m i n e n + e d e l l e e n v a p a u t t a m i s t a + e d e l l i s e e n + e d e l l i s e l l ä + e d e l l i s e l t ä + e d e l l i s e n + e d e l l i s e n k i n + e d e l l i s e n ä + e d e l l i s e s s ä + e d e l l i s e s t ä + e d e l l i s e t + e d e l l i s e t k i n + e d e l l i s e t k ä ä n + e d e l l i s i i n + e d e l l i s i l l ä + e d e l l i s i l t a n a + e d e l l i s i l t ä + e d e l l i s i s s ä + e d e l l i s i s s ä k i n + e d e l l i s i s t ä + e d e l l i s i ä + e d e l l i s i ä k i n + e d e l l i s p ä i v ä n ä + e d e l l i s t e n + e d e l l i s t ä + e d e l l i s v u o d e n + e d e l l i s v u o d e s t a + e d e l l i s v u o n n a + e d e l l i s v u o s i a + e d e l l i s v u o s i e n + e d e l l i s v u o s i i n + e d e l l i s v u o s i n a + e d e l l i s v u o s i s t a + e d e l l i s v u o t e e n + e d e l l i s v u o t e n a + e d e l l i s v u o t i s e n + e d e l l i s v u o t i s e t + e d e l l i s v u o t i s i s t a + e d e l l i s v u o t i s t a + e d e l l i s v u o t t a + e d e l l y t e t t i i n + e d e l l y t e t ä + e d e l l y t e t ä k ä ä n + e d e l l y t e t ä ä n + e d e l l y t e t ä ä n k ö + e d e l l y t t ä e n + e d e l l y t t ä i s i + e d e l l y t t ä i s i n k i n + e d e l l y t t ä i s i v ä t + e d e l l y t t ä m i e n + e d e l l y t t ä m i ä + e d e l l y t t ä m ä l l ä + e d e l l y t t ä m ä n + e d e l l y t t ä m ä t + e d e l l y t t ä m ä t t ä + e d e l l y t t ä n y t + e d e l l y t t ä v i l l e + e d e l l y t t ä v ä n + e d e l l y t t ä v ä t + e d e l l y t t ä v ä t k i n + e d e l l y t t ä ä + e d e l l y t t ä ä k i n + e d e l l y t t ä ä k ö + e d e l l y t y k s e l l ä + e d e l l y t y k s e n + e d e l l y t y k s e n ä + e d e l l y t y k s e t + e d e l l y t y k s i i n + e d e l l y t y k s i l l ä + e d e l l y t y k s i l t ä ä n + e d e l l y t y k s i n + e d e l l y t y k s i s t ä + e d e l l y t y k s i ä + e d e l l y t y s t e n + e d e l l y t y s t ä + e d e l l y t ä m m e + e d e l l y t ä m m e k i n + e d e l l y t ä n + e d e l l ä k ä v i j ä a l a + e d e l l ä k ä v i j ä h a n k e + e d e l l ä k ä v i j ä k s i + e d e l l ä k ä v i j ä l a i n s ä ä d ä n t ö ö n + e d e l l ä k ä v i j ä m a a + e d e l l ä k ä v i j ä m a r k k i n o i d e n + e d e l l ä k ä v i j ä m a r k k i n o i t a + e d e l l ä k ä v i j ä n + e d e l l ä k ä v i j ä n ä + e d e l l ä k ä v i j ä y r i t y k s e n ä + e d e l l ä k ä v i j ä y r i t y k s i ä + e d e l l ä k ä v i j ä ä + e d e l l ä k ä v i j ö i h i n + e d e l l ä k ä v i j ö i k s i + e d e l l ä k ä v i j ö i t ä + e d e l l ä m a i n i t u t + e d e l t ä j i i n s ä + e d e l t ä j i s t ä n n e + e d e l t ä j i ä ä n + e d e l t ä j ä l l e n i + e d e l t ä j ä n i + e d e l t ä j ä n n e + e d e l t ä j ä n s ä + e d e l t ä j ä ä + e d e l t ä j ä ä n i + e d e l t ä j ä ä n n e + e d e l t ä n e e s e e n + e d e l t ä n e e s s ä + e d e l t ä n e e t + e d e l t ä n e i d e n + e d e l t ä n e i s s ä + e d e l t ä v i e n + e d e l t ä v i s s ä + e d e l t ä v ä n + e d e l t ä v ä s s ä + e d e l t ä v ä t + e d e l t ä ä + e d e n n e e t + e d e n n y t + e d e s a u t t a a + e d e s a u t t a a k s e e n + e d e s a u t t a n e e t + e d e s a u t t a n u t + e d e s a u t t a v a t + e d e s m e n n e e n + e d e s s ä k i n + e d e s s ä m m e + e d e s s ä n i + e d e s s ä n n e + e d e s s ä ä n + e d e s v a s t u u s e e n + e d e s v a s t u u t o n t a + e d e t e s s ä + e d e t e s s ä m m e + e d e t e s s ä n n e + e d e t k ä ä + e d e t k ä ä m m e + e d e t t i i n + e d e t t y + e d e t t ä e s s ä + e d e t ä + e d e t ä k s e e n + e d e t ä k s e m m e + e d e t ä ä n + e d e t ä ä n k ö + e d i s t e t t i i n + e d i s t e t t y + e d i s t e t t y ä + e d i s t e t t ä e s s ä + e d i s t e t t ä i s i + e d i s t e t t ä i s i i n + e d i s t e t ä + e d i s t e t ä ä n + e d i s t e t ä ä n k i n + e d i s t e t ä ä n k ö + e d i s t i + e d i s t i v ä t + e d i s t y e s s ä + e d i s t y i + e d i s t y i s i + e d i s t y i s i m m e + e d i s t y k s e e n + e d i s t y k s e l l i s e l l e + e d i s t y k s e l l i s e l l ä + e d i s t y k s e l l i s e m m i n + e d i s t y k s e l l i s e m m i s t ä + e d i s t y k s e l l i s e m m ä l l ä + e d i s t y k s e l l i s e m m ä n + e d i s t y k s e l l i s e m m ä t + e d i s t y k s e l l i s e m p i + e d i s t y k s e l l i s e m p i e n + e d i s t y k s e l l i s e m p i i n + e d i s t y k s e l l i s e m p i ä + e d i s t y k s e l l i s e m p ä ä + e d i s t y k s e l l i s e m p ä ä n + e d i s t y k s e l l i s e n + e d i s t y k s e l l i s e n ä + e d i s t y k s e l l i s e s t ä + e d i s t y k s e l l i s e t + e d i s t y k s e l l i s i m m i n + e d i s t y k s e l l i s i m m i s s ä + e d i s t y k s e l l i s i m m ä s t ä + e d i s t y k s e l l i s i m m ä t + e d i s t y k s e l l i s i m p i e n + e d i s t y k s e l l i s i m p i ä + e d i s t y k s e l l i s i m p ä ä n + e d i s t y k s e l l i s i n + e d i s t y k s e l l i s i ä + e d i s t y k s e l l i s t ä + e d i s t y k s e n + e d i s t y k s e n ä + e d i s t y k s e s t ä + e d i s t y m i s e e m m e + e d i s t y m i s e e n + e d i s t y m i s e l l e + e d i s t y m i s e n + e d i s t y m i s e n ä + e d i s t y m i s e s t ä + e d i s t y m i s i n d i k a a t t o r e i t a + e d i s t y m i s k e r t o m u k s e e n + e d i s t y m i s k e r t o m u k s e l l e + e d i s t y m i s k e r t o m u k s e n + e d i s t y m i s k e r t o m u k s e s s a + e d i s t y m i s k e r t o m u k s e s s a a n + e d i s t y m i s k e r t o m u k s e s t a + e d i s t y m i s k e r t o m u k s e t + e d i s t y m i s k e r t o m u k s i a + e d i s t y m i s k e r t o m u k s i i n + e d i s t y m i s k e r t o m u k s i s s a + e d i s t y m i s k e r t o m u k s i s t a + e d i s t y m i s k e r t o m u s + e d i s t y m i s k e r t o m u s t a + e d i s t y m i s k e r t o m u s t a a n + e d i s t y m i s k e r t o m u s t e n + e d i s t y m i s m a h d o l l i s u u d e t + e d i s t y m i s m a h d o l l i s u u k s i a + e d i s t y m i s m a h d o l l i s u u k s i s t a + e d i s t y m i s m a h d o l l i s u u s + e d i s t y m i s m a h d o l l i s u u t e m m e + e d i s t y m i s p r o s e s s i i n + e d i s t y m i s r a p o r t e i s s a a n + e d i s t y m i s r a p o r t i n + e d i s t y m i s r a p o r t i s t a + e d i s t y m i s r a p o r t i t + e d i s t y m i s r a p o r t t i + e d i s t y m i s r a p o r t t i a + e d i s t y m i s r a p o r t t i n s a + e d i s t y m i s s u u n n i t e l m a n + e d i s t y m i s t a h d o n + e d i s t y m i s t a h t i + e d i s t y m i s t ä + e d i s t y m i s t ä m m e + e d i s t y m i s v a l m i u d e n + e d i s t y m i s v a u h t i + e d i s t y m m e + e d i s t y m m e k ö + e d i s t y m ä ä n + e d i s t y n e e m m i l l ä + e d i s t y n e e m m ä n + e d i s t y n e e m m ä t + e d i s t y n e e m p i e n + e d i s t y n e e m p i i n + e d i s t y n e e m p i ä + e d i s t y n e e m p ä ä + e d i s t y n e e m p ä ä n + e d i s t y n e e n + e d i s t y n e e t + e d i s t y n e i d e n + e d i s t y n e i l l e + e d i s t y n e i m m i l l e + e d i s t y n e i m m i l l ä + e d i s t y n e i m m i s t ä + e d i s t y n e i m m ä n + e d i s t y n e i m m ä s t ä + e d i s t y n e i m m ä t + e d i s t y n e i m p i e n + e d i s t y n e i m p i i n + e d i s t y n e i m p i n ä + e d i s t y n e i m p i ä + e d i s t y n e i m p ä n ä + e d i s t y n e i n + e d i s t y n e i n t ä + e d i s t y n e i s s ä + e d i s t y n e i t ä + e d i s t y s a s k e l + e d i s t y s a s k e l e e k s i + e d i s t y s a s k e l e e l l e + e d i s t y s a s k e l e e l t a + e d i s t y s a s k e l e e n + e d i s t y s a s k e l e e n a + e d i s t y s a s k e l e e n s a + e d i s t y s a s k e l e e s e e n + e d i s t y s a s k e l e e s t a + e d i s t y s a s k e l e e t + e d i s t y s a s k e l e i d e n + e d i s t y s a s k e l e i k s i + e d i s t y s a s k e l e i n a + e d i s t y s a s k e l e i s i i n + e d i s t y s a s k e l e i s t a + e d i s t y s a s k e l e i t a + e d i s t y s a s k e l e n + e d i s t y s a s k e l e n a + e d i s t y s a s k e l e s t a + e d i s t y s a s k e l e t t a + e d i s t y s a s k e l i a + e d i s t y s a s k e l i e n + e d i s t y s a s k e l i i n + e d i s t y s a s k e l i n a + e d i s t y s a s k e l i s t a + e d i s t y s a s k e l t a + e d i s t y s a s k e l t e n + e d i s t y s k e r t o m u k s e n + e d i s t y s k e r t o m u k s e n s a + e d i s t y s k e r t o m u k s e s s a + e d i s t y s k e r t o m u k s e t + e d i s t y s k e r t o m u k s i a + e d i s t y s k e r t o m u k s i s s a + e d i s t y s k e r t o m u s + e d i s t y s k e r t o m u s t a + e d i s t y s k y s y m y k s e n + e d i s t y s m i e l i s e m p i + e d i s t y s m i e l i s e n ä + e d i s t y s m i e l i s i n + e d i s t y s m i e l i s t e n + e d i s t y s m i t t a r e i d e n + e d i s t y s p o n n i s t e l u i l l e m m e + e d i s t y s p r o s e s s i n + e d i s t y s p u o l u e + e d i s t y s r a p o r t i n + e d i s t y s r a p o r t t i + e d i s t y s r a p o r t t i a + e d i s t y s r y h m i e n + e d i s t y s r y h m ä + e d i s t y s s o p i m u k s e l l a + e d i s t y s s u u n n i t e l m a n + e d i s t y s t a h d i n + e d i s t y s t e k i j ä + e d i s t y s t e k i j ö i t ä + e d i s t y s t o i m i a + e d i s t y s t ä + e d i s t y s t ä k i n + e d i s t y s v a u h t i m m e + e d i s t y s v o i m i e n + e d i s t y t t e + e d i s t y t t i i n + e d i s t y t t i i n k i n + e d i s t y t t y + e d i s t y t t ä i s i i n + e d i s t y t ä + e d i s t y t ä ä n + e d i s t y t ä ä n k ö + e d i s t y v i ä + e d i s t y v ä m m e + e d i s t y v ä n + e d i s t y v ä t + e d i s t y y + e d i s t y ä + e d i s t y ä k s e e n + e d i s t y ä k s e m m e + e d i s t ä e s s ä ä n + e d i s t ä i s i + e d i s t ä i s i m m e + e d i s t ä i s i v ä t + e d i s t ä j i e n + e d i s t ä j i n ä + e d i s t ä j ä n ä + e d i s t ä k ä ä + e d i s t ä k ä ä m m e + e d i s t ä m i s a l o i t t e i s t a + e d i s t ä m i s b u d j e t t i e n + e d i s t ä m i s e e n + e d i s t ä m i s e k s i + e d i s t ä m i s e n + e d i s t ä m i s e s s ä + e d i s t ä m i s e s t ä + e d i s t ä m i s h a n k k e i t a + e d i s t ä m i s j ä r j e s t e l m i ä + e d i s t ä m i s j ä r j e s t e l y + e d i s t ä m i s k a m p a n j a t + e d i s t ä m i s k a m p a n j o i d e n + e d i s t ä m i s k a m p a n j o i h i n + e d i s t ä m i s k a m p a n j o i t a + e d i s t ä m i s k a u d e l l a + e d i s t ä m i s k e s k u k s i a + e d i s t ä m i s k e s k u s t e n + e d i s t ä m i s o h j e l m a + e d i s t ä m i s o h j e l m i s t a + e d i s t ä m i s p o l i t i i k k a + e d i s t ä m i s p o l i t i i k k a a n + e d i s t ä m i s r a h a s t o i h i n + e d i s t ä m i s r a h a s t o j e n + e d i s t ä m i s s t r a t e g i a + e d i s t ä m i s s t r a t e g i o i d e n + e d i s t ä m i s s u u n n i t e l m i a + e d i s t ä m i s t a p o j a + e d i s t ä m i s t o i m e a + e d i s t ä m i s t o i m e n p i t e i s i i n + e d i s t ä m i s t o i m e n p i t e i s s ä + e d i s t ä m i s t o i m e n p i t e i t ä + e d i s t ä m i s t o i m e t + e d i s t ä m i s t o i m i a + e d i s t ä m i s t o i m i e n + e d i s t ä m i s t o i m i e n s a + e d i s t ä m i s t o i m i i n + e d i s t ä m i s t o i m i l l a + e d i s t ä m i s t o i m i s t a + e d i s t ä m i s t o i m i s t o j e n + e d i s t ä m i s t ä + e d i s t ä m i s v e l v o l l i s u u t t a + e d i s t ä m i s v i r a s t o + e d i s t ä m i s v u o t t a + e d i s t ä m m e + e d i s t ä m m e k ö + e d i s t ä m ä l l ä + e d i s t ä m ä s s ä + e d i s t ä m ä t t ä + e d i s t ä m ä ä m m e + e d i s t ä m ä ä n + e d i s t ä n e e t + e d i s t ä n y t + e d i s t ä t t e k ö + e d i s t ä v i e n + e d i s t ä v i i n + e d i s t ä v i s t ä + e d i s t ä v i ä + e d i s t ä v ä k s i + e d i s t ä v ä n + e d i s t ä v ä n ä + e d i s t ä v ä s t ä + e d i s t ä v ä t + e d i s t ä v ä ä + e d i s t ä v ä ä n + e d i s t ä ä + e d i s t ä ä k s e e n + e d i s t ä ä k s e m m e + e d i s t ä ä k s e n i + e d i s t ä ä k s e n n e + e d i s t ä ä k ö + e d i t o i n t i t y ö t ä + e d u i l l e + e d u i s t a + e d u k s i + e d u l l i s e l t a + e d u l l i s e m m a k s i + e d u l l i s e m m a n + e d u l l i s e m m a s s a + e d u l l i s e m m a s t a + e d u l l i s e m m a t + e d u l l i s e m m i k s i + e d u l l i s e m m i l l a + e d u l l i s e m m i l l e + e d u l l i s e m m i n + e d u l l i s e m m i s t a + e d u l l i s e m p a a + e d u l l i s e m p a a n + e d u l l i s e m p a n a + e d u l l i s e m p i + e d u l l i s e m p i a + e d u l l i s e m p i e n + e d u l l i s e n + e d u l l i s e t + e d u l l i s i a + e d u l l i s i m m a l t a + e d u l l i s i m m a n + e d u l l i s i m m a t + e d u l l i s i m m i s t a + e d u l l i s i m p a n a + e d u l l i s i m p i a + e d u l l i s i m p i e n + e d u l l i s i m p i i n + e d u l l i s i n + e d u l l i s i n t a + e d u l l i s i s s a + e d u l l i s i s t a + e d u l l i s t a + e d u l l i s t e n + e d u n s a a j a + e d u n s a a j a j ä r j e s t ö i l l ä + e d u n s a a j a j ä r j e s t ö i l t ä + e d u n s a a j a j ä r j e s t ö i n ä + e d u n s a a j a j ä s e n v a l t i o i s s a + e d u n s a a j a l l e + e d u n s a a j a l u e t t e l o n + e d u n s a a j a m a a + e d u n s a a j a m a a l l e + e d u n s a a j a m a a l t a + e d u n s a a j a m a a n + e d u n s a a j a m a a s s a + e d u n s a a j a m a a t + e d u n s a a j a m a i d e n + e d u n s a a j a m a i h i n + e d u n s a a j a m a i l l e + e d u n s a a j a m a i s s a + e d u n s a a j a m a i s t a + e d u n s a a j a m a i t a + e d u n s a a j a n + e d u n s a a j a r a h a s t o i s s a + e d u n s a a j a t + e d u n s a a j a v a l t i o i d e n + e d u n s a a j a v a l t i o i h i n + e d u n s a a j a v a l t i o i l l a + e d u n s a a j a v a l t i o i l l e + e d u n s a a j a v a l t i o i s s a + e d u n s a a j a v a l t i o s s a + e d u n s a a j a v a l t i o t + e d u n s a a j a v a l t i o t a + e d u n s a a j a v a r u s t a m o t + e d u n s a a j i a + e d u n s a a j i e n + e d u n s a a j i e n s a + e d u n s a a j i i n + e d u n s a a j i l l e + e d u n s a a j i s t a + e d u n t a v o i t t e l i j o i d e n + e d u n t a v o i t t e l u + e d u n t a v o i t t e l u a + e d u n t a v o i t t e l u n + e d u n v a l v o j a a + e d u n v a l v o j a l u e t t e l o n + e d u n v a l v o j a r e k i s t e r i + e d u n v a l v o j a r e k i s t e r i l l e + e d u n v a l v o j a r e k i s t e r i n + e d u n v a l v o j a r e k i s t e r i s t ä + e d u n v a l v o j a r e k i s t e r i ä + e d u n v a l v o j a r y h m i e n + e d u n v a l v o j a t + e d u n v a l v o j a t h a n + e d u n v a l v o j i a + e d u n v a l v o j i e n + e d u n v a l v o j i i n + e d u n v a l v o j i l l e + e d u n v a l v o j i s t a + e d u n v a l v o n t a a + e d u n v a l v o n t a a n + e d u n v a l v o n t a j ä r j e s t e l m ä ä + e d u n v a l v o n t a j ä r j e s t ö i h i n + e d u n v a l v o n t a j ä r j e s t ö i l l e + e d u n v a l v o n t a j ä r j e s t ö j e n + e d u n v a l v o n t a k o n e i s t o n + e d u n v a l v o n t a m a t e r i a a l i s t a + e d u n v a l v o n t a o r g a n i s a a t i o i t a + e d u n v a l v o n t a o r g a n i s a a t i o t + e d u n v a l v o n t a r e k i s t e r i ä + e d u n v a l v o n t a r y h m i e n + e d u n v a l v o n t a r y h m i k s i + e d u n v a l v o n t a r y h m i n ä + e d u n v a l v o n t a r y h m i ä + e d u n v a l v o n t a r y h m ä n + e d u n v a l v o n t a r y h m ä t + e d u n v a l v o n t a s k a n d a a l i s t a + e d u n v a l v o n t a s ä ä n t ö j ä + e d u n v a l v o n t a t o i m i e n + e d u n v a l v o n t a t o i m i i n + e d u n v a l v o n t a t o i m i s t o j e n + e d u n v a l v o n t a u n i o n i + e d u s k u n n a n + e d u s k u n n a s s a + e d u s k u n t a + e d u s k u n t a p u o l u e t t a + e d u s k u n t a v a a l e j a + e d u s k u n t a v a a l i e n + e d u s k u n t a v a a l i t + e d u s k u n t a v u o s i n a a n + e d u s t a a + e d u s t a a k o + e d u s t a e s s a a n + e d u s t a e s s a n n e + e d u s t a i s i v a t + e d u s t a j a a + e d u s t a j a a m m e + e d u s t a j a a n + e d u s t a j a i n h u o n e + e d u s t a j a i n h u o n e e l l e + e d u s t a j a i n h u o n e e n + e d u s t a j a i n h u o n e e s s a + e d u s t a j a i n h u o n e e s t a + e d u s t a j a i n k o k o u k s e l l e + e d u s t a j a i n k o k o u s + e d u s t a j a j ä r j e s t ö j e n + e d u s t a j a j ä s e n t e n + e d u s t a j a k a n t e i t a + e d u s t a j a k a u t e n i + e d u s t a j a k i n + e d u s t a j a k o k o u k s e e n + e d u s t a j a k o k o u k s e l l a + e d u s t a j a k o k o u k s e m m e + e d u s t a j a k o k o u k s e n + e d u s t a j a k o k o u k s e n n e + e d u s t a j a k o k o u k s e s s a + e d u s t a j a k o k o u k s e s s a m m e + e d u s t a j a k o k o u k s e s t a + e d u s t a j a k o k o u k s i a + e d u s t a j a k o k o u k s i i n + e d u s t a j a k o k o u s + e d u s t a j a k o k o u s t a + e d u s t a j a k o k o u s t e n + e d u s t a j a k o l l e g a m m e + e d u s t a j a k o l l e g a s t a + e d u s t a j a k o l l e g a t + e d u s t a j a k s i + e d u s t a j a l l a + e d u s t a j a l l e + e d u s t a j a m m e + e d u s t a j a m ä ä r ä + e d u s t a j a n + e d u s t a j a n a + e d u s t a j a n e u v o s t o n + e d u s t a j a n k i n + e d u s t a j a n k o k o u s + e d u s t a j a n n e + e d u s t a j a n p a i k k a a + e d u s t a j a n p a i k k a n s a + e d u s t a j a n p a i k k o j a + e d u s t a j a n p a l k k i o + e d u s t a j a n p a l k k i o i d e n + e d u s t a j a n p a l k k i o i h i n + e d u s t a j a n p a l k k i o n + e d u s t a j a n p a l k k i o s t a + e d u s t a j a n p a l k k i o t a + e d u s t a j a n s a + e d u s t a j a n t o i m e a + e d u s t a j a n t o i m e n + e d u s t a j a n t o i m e n s a + e d u s t a j a p a i k k o j e n + e d u s t a j a p a i k o i s t a + e d u s t a j a r y h m ä + e d u s t a j a r y h m ä ä + e d u s t a j a s s a + e d u s t a j a s t a + e d u s t a j a t + e d u s t a j a t o v e r i e n i + e d u s t a j i a + e d u s t a j i a a n + e d u s t a j i e n + e d u s t a j i e n k i n + e d u s t a j i e n s a + e d u s t a j i i n + e d u s t a j i i n s a + e d u s t a j i k s i + e d u s t a j i l l e + e d u s t a j i l l e e n + e d u s t a j i l t a + e d u s t a j i n a + e d u s t a j i s t a + e d u s t a j i s t a a n + e d u s t a k a a n + e d u s t a m a a n + e d u s t a m a l l a n i + e d u s t a m a n i + e d u s t a m i l l e m m e + e d u s t a m i s e e n + e d u s t a m i s e s t a + e d u s t a m i s t a + e d u s t a m m e + e d u s t a n + e d u s t a n k i n + e d u s t a n u t + e d u s t a t t e + e d u s t a v a m m a n + e d u s t a v a m p a a + e d u s t a v a m p a a n + e d u s t a v a m p i + e d u s t a v a m p i a + e d u s t a v a n + e d u s t a v a n a + e d u s t a v a n i + e d u s t a v a n n e + e d u s t a v a n s a + e d u s t a v a t + e d u s t a v i a + e d u s t a v i e n + e d u s t a v i l l a + e d u s t a v i m m a n + e d u s t a v i m m a t + e d u s t a v i m p i e n + e d u s t a v i n + e d u s t a v i n a + e d u s t a v i s s a + e d u s t a v u u s k y s y m y k s e e n + e d u s t a v u u t t a + e d u s t e t a a n + e d u s t e t t a v a t + e d u s t e t t u i h i n + e d u s t e t t u i n a + e d u s t e t t u j a + e d u s t e t t u n a + e d u s t i k o + e d u s t i m m e p a + e d u s t i t t e + e d u s t i v a t + e d u s t u k s e e n + e d u s t u k s e l l i s e m m a n + e d u s t u k s e l l i s e m m i k s i + e d u s t u k s e l l i s e m p a a + e d u s t u k s e l l i s i m p a n a + e d u s t u k s e l l i s i m p i a + e d u s t u k s e l l i s i n t a + e d u s t u k s e l l i s t a + e d u s t u k s e n + e d u s t u s a u t o i h i n + e d u s t u s e l i m e n s ä + e d u s t u s e l i m i e n + e d u s t u s e l i m i i n + e d u s t u s e l i n + e d u s t u s e l i n t e n + e d u s t u s e l i n t e n s ä + e d u s t u s j ä r j e s t e l m i s t ä + e d u s t u s j ä r j e s t e l m ä + e d u s t u s j ä r j e s t e l m ä n + e d u s t u s j ä r j e s t e l m ä s s ä + e d u s t u s j ä r j e s t ö j e n + e d u s t u s j ä r j e s t ö j ä + e d u s t u s l a a d u n + e d u s t u s l a i t o k s e l l e + e d u s t u s l a i t o k s e n + e d u s t u s l a i t o k s e t + e d u s t u s l a i t o s + e d u s t u s l u o n n e + e d u s t u s m e k a n i s m i e n + e d u s t u s m u o t o j a + e d u s t u s o i k e u d e n + e d u s t u s o i k e u s + e d u s t u s o i k e u t t a + e d u s t u s o i k e u t t a m m e + e d u s t u s o r g a n i s a a t i o l l e + e d u s t u s p a i k a s s a + e d u s t u s p e r i a a t e + e d u s t u s p e r i a a t t e i d e n + e d u s t u s s o p i m u s + e d u s t u s t a + e d u s t u s t e h t ä v ä + e d u s t u s t i l e i h i n + e d u s t u s t o i m e t + e d u s t u s t o i m i s t o n + e d u s t u s t o j a + e d u s t u s t o j a m m e + e d u s t u s t o j e m m e + e d u s t u s t o j e n + e d u s t u s t o m m e + e d u s t u s t o n + e d u s t u s t o o n + e d u s t u s t o s t a m m e + e d u s t u s t o t + e d u s t u s v a j e e s t a + e d u s t u s v i r a n o m a i s t a + e d u s t u s v o i m a + e e s t i n a j o k o i r a + e e s t i n h e v o n e n + e e t a f u n k t i o + e e t t e r i s y n t e e s i + e e t t i s e e n + e e t t i s e k s i + e e t t i s e l l e + e e t t i s e l t ä + e e t t i s e m p i ä + e e t t i s e m p ä ä + e e t t i s e n + e e t t i s e s t i k i n + e e t t i s e s t ä + e e t t i s e t + e e t t i s i i n + e e t t i s i s s ä + e e t t i s i s t ä + e e t t i s i ä + e e t t i s t e n + e e t t i s t ä + e e t t i s y y d e s t ä + e e t t i s y y t e e n + e e v a s t a + e f e d r i i n i p o h j a i s e t + e f e d r i i n i t u o t t e e t + e f e k t i p e d a a l i + e g a l i t a r i s m i i n + e g o i s m i a + e g o p s y k o l o g i a + e g y p t i l ä i s e t + e g y p t i l ä i s i l l e + e g y p t i l ä i s i ä + e g y p t i l ä i s o s a p u o l e n + e g y p t i l ä i s t e n + e g y p t i l ä i s y h t e i s ö t + e h d i m m e + e h d i t t y + e h d i t ä + e h d i t ä ä n + e h d i t ä ä n k ö + e h d o i k s i + e h d o i l l a + e h d o i l l a a n + e h d o i l t a a n + e h d o i s t a + e h d o i t t a + e h d o k a s a s e m a + e h d o k a s a s e m a a n + e h d o k a s a s e m a n + e h d o k a s a s e t t e l u j e n + e h d o k a s k a u p u n g e i s t a + e h d o k a s k a u p u n g i t + e h d o k a s k a u p u n k e j a + e h d o k a s k a u p u n k i + e h d o k a s k a u p u n k i a + e h d o k a s k a u p u n k i e n + e h d o k a s k a u p u n k i i n + e h d o k a s l i s t a t + e h d o k a s l i s t o i l l a + e h d o k a s l i s t o i l l e e n + e h d o k a s l i s t o j a + e h d o k a s l i s t o j a a n + e h d o k a s l i s t o j e n + e h d o k a s l u e t t e l o + e h d o k a s l u e t t e l o a + e h d o k a s l u e t t e l o i d e n + e h d o k a s l u e t t e l o i s s a a n + e h d o k a s l u e t t e l o i t a + e h d o k a s l u e t t e l o n + e h d o k a s l u e t t e l o o n + e h d o k a s m a a + e h d o k a s m a a h a n + e h d o k a s m a a l l a + e h d o k a s m a a l l e + e h d o k a s m a a n + e h d o k a s m a a n a + e h d o k a s m a a s s a + e h d o k a s m a a s t a + e h d o k a s m a a t + e h d o k a s m a a t a + e h d o k a s m a i d e n + e h d o k a s m a i d e n k a a n + e h d o k a s m a i h i n + e h d o k a s m a i l l a + e h d o k a s m a i l l e + e h d o k a s m a i l t a + e h d o k a s m a i l t a k i n + e h d o k a s m a i s s a + e h d o k a s m a i s t a + e h d o k a s m a i t a + e h d o k a s r y h m ä s t ä + e h d o k a s t a + e h d o k a s v a l i k o i m a + e h d o k a s v a l i o i t a + e h d o k a s v a l t i o + e h d o k a s v a l t i o i d e n + e h d o k a s v a l t i o i d e n k i n + e h d o k a s v a l t i o i h i n + e h d o k a s v a l t i o i k s i + e h d o k a s v a l t i o i l l a + e h d o k a s v a l t i o i l l e + e h d o k a s v a l t i o i l l e k i n + e h d o k a s v a l t i o i l t a + e h d o k a s v a l t i o i n a + e h d o k a s v a l t i o i s s a + e h d o k a s v a l t i o i s s a k i n + e h d o k a s v a l t i o i s t a + e h d o k a s v a l t i o i t a + e h d o k a s v a l t i o i t a k i n + e h d o k a s v a l t i o k s i + e h d o k a s v a l t i o k s i k i n + e h d o k a s v a l t i o l l a + e h d o k a s v a l t i o l l e + e h d o k a s v a l t i o l t a + e h d o k a s v a l t i o m m e + e h d o k a s v a l t i o n + e h d o k a s v a l t i o n a + e h d o k a s v a l t i o o n + e h d o k a s v a l t i o s s a + e h d o k a s v a l t i o s t a + e h d o k a s v a l t i o t + e h d o k a s v a l t i o t a + e h d o k a s v a l t i o t k a a n + e h d o k a s v a l t i o t k i n + e h d o k a s y r i t y k s i ä + e h d o k a s y r i t y s t e n + e h d o k k a a k s i + e h d o k k a a l l a + e h d o k k a a n + e h d o k k a a n a + e h d o k k a a n s a + e h d o k k a a s t a + e h d o k k a a s t a a n + e h d o k k a a t + e h d o k k a i d e m m e + e h d o k k a i d e n + e h d o k k a i k s i + e h d o k k a i l l e + e h d o k k a i l t a + e h d o k k a i n a + e h d o k k a i s i i n + e h d o k k a i s t a + e h d o k k a i t a + e h d o k k u u d e s t a + e h d o k k u u d e s t a n i + e h d o k k u u d e s t a n n e + e h d o k k u u k s i s t a + e h d o k k u u s k r i t e e r e i s t ä + e h d o k s i + e h d o l l a + e h d o l l i s e l l a + e h d o l l i s e m p a a + e h d o l l i s e n + e h d o l l i s e s t a + e h d o l l i s i a + e h d o l l i s t a m i s n ä k e m y k s e l l e + e h d o l l i s t e n + e h d o l l i s u u d e s t a + e h d o l l i s u u s l a u s e k k e i t a + e h d o l l i s u u s p e r i a a t e + e h d o l l i s u u s p e r i a a t t e e n + e h d o l l i s u u s p o l i t i i k k a + e h d o l l i s u u s p o l i t i i k k a m m e + e h d o l l i s u u t t a + e h d o n + e h d o n a l a i s u u k s i a + e h d o n v a r a i s u u t t a + e h d o s t a + e h d o t + e h d o t a m m e + e h d o t a m m e k i n + e h d o t a n + e h d o t a n k i n + e h d o t a t t e + e h d o t a t t e k i n + e h d o t e t a + e h d o t e t a a n + e h d o t e t a a n k i n + e h d o t e t a a n k o + e h d o t e t t a e s s a + e h d o t e t t a i s i i n + e h d o t e t t a v a + e h d o t e t t a v i e n + e h d o t e t t i i n + e h d o t e t t u + e h d o t e t t u a + e h d o t e t t u i h i n + e h d o t e t t u j a + e h d o t e t t u j e n + e h d o t e t t u k i n + e h d o t e t u i l l a + e h d o t e t u i s s a + e h d o t e t u i s t a + e h d o t e t u l l a + e h d o t e t u l t a + e h d o t e t u n + e h d o t e t u s s a + e h d o t e t u s t a + e h d o t e t u t + e h d o t i m m e + e h d o t i n + e h d o t i t t e + e h d o t o n t a + e h d o t t a a + e h d o t t a a k i n + e h d o t t a a k s e e n + e h d o t t a a k s e n n e + e h d o t t a e s s a + e h d o t t a e s s a a n + e h d o t t a e s s a m m e + e h d o t t a e s s a n i + e h d o t t a i s i n + e h d o t t a i s i n k i n + e h d o t t a k a a + e h d o t t a k a a m m e + e h d o t t a m a + e h d o t t a m a a + e h d o t t a m a a m m e + e h d o t t a m a a n + e h d o t t a m a a n i + e h d o t t a m a l l a + e h d o t t a m a m m e + e h d o t t a m a n + e h d o t t a m a n i + e h d o t t a m a n n e + e h d o t t a m a s s a + e h d o t t a m a s s a m m e + e h d o t t a m a s t a + e h d o t t a m a s t a a n + e h d o t t a m a t + e h d o t t a m a t t a + e h d o t t a m i e m m e + e h d o t t a m i e n + e h d o t t a m i l l a + e h d o t t a m i l l a n i + e h d o t t a m i n e n + e h d o t t a m i s e s t a + e h d o t t a m i s t a + e h d o t t a m i s t a n n e + e h d o t t a n e e t + e h d o t t a n e t t e + e h d o t t a n u t + e h d o t t a v a n s a + e h d o t t a v a t + e h d o t t i + e h d o t t i v a t + e h d o t t o m a a n + e h d o t t o m a k s i + e h d o t t o m a l l e + e h d o t t o m a m m i n + e h d o t t o m a n + e h d o t t o m a n a + e h d o t t o m a s t a + e h d o t t o m a t + e h d o t t o m i a + e h d o t t o m i m m i n + e h d o t t o m i n a + e h d o t t o m i s t a + e h d o t t o m u u d e s t a + e h d o t u k s e e m m e + e h d o t u k s e e n + e h d o t u k s e e n n e + e h d o t u k s e l l a + e h d o t u k s e l l a a n + e h d o t u k s e l l a m m e + e h d o t u k s e l l e + e h d o t u k s e l l e n i + e h d o t u k s e m m e + e h d o t u k s e m m e h a n + e h d o t u k s e n + e h d o t u k s e n a + e h d o t u k s e n i + e h d o t u k s e n n e + e h d o t u k s e n s a + e h d o t u k s e n t e o n + e h d o t u k s e s s a + e h d o t u k s e s s a a n + e h d o t u k s e s s a h a n + e h d o t u k s e s s a k i n + e h d o t u k s e s s a m m e + e h d o t u k s e s s a n n e + e h d o t u k s e s t a + e h d o t u k s e s t a a n + e h d o t u k s e s t a m m e + e h d o t u k s e s t a n i + e h d o t u k s e s t a n n e + e h d o t u k s e t + e h d o t u k s i a + e h d o t u k s i a a n + e h d o t u k s i a m m e + e h d o t u k s i a n n e + e h d o t u k s i e m m e + e h d o t u k s i e n + e h d o t u k s i i m m e + e h d o t u k s i i n + e h d o t u k s i i n s a + e h d o t u k s i l l a + e h d o t u k s i l l a a n + e h d o t u k s i l l a m m e + e h d o t u k s i l l e + e h d o t u k s i n + e h d o t u k s i n e e n + e h d o t u k s i n e n n e + e h d o t u k s i s s a + e h d o t u k s i s s a a n + e h d o t u k s i s s a m m e + e h d o t u k s i s s a n n e + e h d o t u k s i s t a + e h d o t u k s i s t a a n + e h d o t u k s i s t a m m e + e h d o t u k s i s t a n n e + e h d o t u s k o k o n a i s u u d e n + e h d o t u s k o k o n a i s u u d e s s a + e h d o t u s k o k o n a i s u u s + e h d o t u s k o k o n a i s u u t t a + e h d o t u s l u e t t e l o n + e h d o t u s l u o n n o k s e e m m e + e h d o t u s l u o n n o k s e e n + e h d o t u s l u o n n o k s e n + e h d o t u s l u o n n o k s e n n e + e h d o t u s l u o n n o k s e s s a + e h d o t u s l u o n n o k s e s t a + e h d o t u s l u o n n o k s i a + e h d o t u s l u o n n o k s i i n + e h d o t u s l u o n n o k s i s s a + e h d o t u s l u o n n o k s i s t a + e h d o t u s l u o n n o s + e h d o t u s l u o n n o s t a + e h d o t u s l u o n n o s t a m m e + e h d o t u s l u o n n o s t e n + e h d o t u s o i k e u s + e h d o t u s o i k e u t t a + e h d o t u s p a k e t i l l a + e h d o t u s p a k e t i n + e h d o t u s p a k e t i s s a + e h d o t u s p a k e t i s t a + e h d o t u s p a k e t t e j a + e h d o t u s p a k e t t i + e h d o t u s p a k e t t i a + e h d o t u s p a k e t t i a n n e + e h d o t u s p a k e t t i i n + e h d o t u s p a k e t t i m m e + e h d o t u s p y y n n ö i l l ä + e h d o t u s p y y n n ö i s s ä + e h d o t u s p y y n n ö i s t ä + e h d o t u s p y y n n ö n + e h d o t u s p y y n n ö s s ä + e h d o t u s p y y n n ö t + e h d o t u s p y y n t ö + e h d o t u s p y y n t ö i h i m m e + e h d o t u s p y y n t ö i h i n + e h d o t u s p y y n t ö j e n + e h d o t u s p y y n t ö j ä + e h d o t u s p y y n t ö ä + e h d o t u s p y y n t ö ö n + e h d o t u s s u u n n i t e l m a a n + e h d o t u s t a + e h d o t u s t a a n + e h d o t u s t a m m e + e h d o t u s t a n i + e h d o t u s t a n n e + e h d o t u s t e k s t i i n + e h d o t u s t e k s t i n + e h d o t u s t e k s t i ä + e h d o t u s t e n + e h d o t u s t e n n e + e h d o t u s t e n s a + e h d o t u s v a i h e e s e e n + e h d o t u s v a i h e t t a + e h d o t u s v a l i k o i m a a + e h d o t u s v i r a n o m a i n e n + e h e i m m i s t ä + e h e y t t ä m i s t ä + e h e y t y m i s k u r s s i + e h e ä m p i + e h j ä ä + e h k ä i s e e + e h k ä i s e m i s e k s i + e h k ä i s e m i s e n + e h k ä i s e m i s e s t ä + e h k ä i s e m i s k e i n o + e h k ä i s e m i s m e k a n i s m e j a + e h k ä i s e m i s o h j e l m i a + e h k ä i s e m i s p o l i t i i k k a + e h k ä i s e m i s p o l i t i i k k a a + e h k ä i s e m i s s t r a t e g i a + e h k ä i s e m i s t o i m i a + e h k ä i s e m i s t o i m i e n + e h k ä i s e m ä l l ä + e h k ä i s e m ä ä n + e h k ä i s e v i e n + e h k ä i s e v i i n + e h k ä i s e v i s t ä + e h k ä i s e v i ä + e h k ä i s e v i ä k i n + e h k ä i s e v ä n + e h k ä i s e v ä n ä + e h k ä i s e v ä s t ä + e h k ä i s e v ä t + e h k ä i s e v ä ä + e h k ä i s t ä + e h k ä i s t ä e s s ä + e h k ä i s t ä i s i i n + e h k ä i s t ä k s e e n + e h k ä i s t ä k s e m m e + e h k ä i s t ä k s e n i + e h k ä i s t ä ä n + e h k ä i s y h a n k e t t a + e h k ä i s y j ä r j e s t e l m ä s t ä + e h k ä i s y j ä r j e s t e l m ä ä + e h k ä i s y k a m p a n j a t + e h k ä i s y k a m p a n j o i h i n + e h k ä i s y k a m p a n j o i s s a + e h k ä i s y k a m p a n j o i t a + e h k ä i s y k e i n o + e h k ä i s y k e i n o i h i n + e h k ä i s y k e i n o j a + e h k ä i s y k e i n o j e n + e h k ä i s y k e i n o n a + e h k ä i s y l a a s t a r i + e h k ä i s y m e k a n i s m e j a + e h k ä i s y m e k a n i s m i n + e h k ä i s y m e n e t e l m ä + e h k ä i s y m e n e t e l m ä t + e h k ä i s y m u o t o + e h k ä i s y n + e h k ä i s y n e u v o n t a a + e h k ä i s y o h j e l m a l l e + e h k ä i s y o h j e l m a n + e h k ä i s y o h j e l m i a + e h k ä i s y o h j e l m i e n + e h k ä i s y o h j e l m i s t a + e h k ä i s y p a l v e l u i t a + e h k ä i s y p a l v e l u j e n + e h k ä i s y p i l l e r e i l l e + e h k ä i s y p i l l e r i + e h k ä i s y p i l l e r i t + e h k ä i s y p i l l e r i ä + e h k ä i s y p o l i t i i k a l l a + e h k ä i s y p o l i t i i k a n + e h k ä i s y p o l i t i i k k a + e h k ä i s y p o l i t i i k k a a + e h k ä i s y p o l i t i i k k a a n + e h k ä i s y p y r k i m y k s i ä + e h k ä i s y r e n g a s + e h k ä i s y r o k o t t e e n + e h k ä i s y s t r a t e g i a + e h k ä i s y s t r a t e g i a a n + e h k ä i s y s t r a t e g i o i d e n + e h k ä i s y s t r a t e g i o i t a + e h k ä i s y s t ä + e h k ä i s y s u u n n i t e l m a t + e h k ä i s y t a p a n a + e h k ä i s y t a p o j a + e h k ä i s y t o i m e n p i t e e n ä + e h k ä i s y t o i m e n p i t e e t + e h k ä i s y t o i m e n p i t e i d e n + e h k ä i s y t o i m e n p i t e i s i i n + e h k ä i s y t o i m e n p i t e i s t ä + e h k ä i s y t o i m e n p i t e i t ä + e h k ä i s y t o i m e t + e h k ä i s y t o i m i a + e h k ä i s y t o i m i e n + e h k ä i s y t o i m i i n + e h k ä i s y t o i m i l l a + e h k ä i s y t o i m i l l e + e h k ä i s y t o i m i n n a s t a + e h k ä i s y t o i m i s t a + e h k ä i s y t y ö t ä + e h k ä i s y v a l i s t u s t a + e h k ä i s y v e r k o s t o n + e h k ä i s y v ä l i n e e n ä + e h k ä i s y v ä l i n e k a m p a n j a t + e h k ä i s y y n + e h k ä i s y ä + e h o s t u s p r o s e s s i + e h t i n y t + e h t i ä k s e e n + e h t i ä k s e n n e + e h t o a + e h t o i h i n + e h t o j a + e h t o j e n + e h t o l a u s e k e + e h t o l a u s e k k e e t + e h t o n a + e h t o n s a + e h t o o l l i s l e i p i ä + e h t y i v ä t + e h t y m i s e e n + e h t y m i s e l l e + e h t y m ä t t ö m ä n + e h t y n e e t + e h t y ä + e i h ä n + e i k o m m u n i s t i t + e i k ö + e i l e n k i n + e i l i s a a m u i s e s s a + e i l i s a a m u i s e s t a + e i l i s a a m u l l a + e i l i s a a m u n + e i l i s a a m u n a + e i l i s e e n + e i l i s e n + e i l i s e s s ä + e i l i s e s t ä + e i l i s e t + e i l i s i l l a n + e i l i s i l l a s t a + e i l i s i l t a a n + e i l i s i l t a i n e n + e i l i s i l t a i s e e n + e i l i s i l t a i s e n + e i l i s i l t a i s e s s a + e i l i s i l t a i s i a + e i l i s i l t a i s i s s a + e i l i s i l t a i s t a + e i l i s i l t a i s t e n + e i l i s i l t a n a + e i l i s i s s ä + e i l i s i s t ä + e i l i s i ä + e i l i s p ä i v ä n + e i l i s p ä i v ä n ä + e i l i s t ä + e i n e k s i s t ä + e i n e s t e n + e i p a k o l l i s t e n + e i s y r j i v i n ä + e i v a l i k o i v i k s i + e k o k a t a s t r o f i i n + e k o k a t a s t r o f i n + e k o k a t a s t r o f i s t a + e k o l o g i a n + e k o l o g i a s t a + e k o l o g i s e e n + e k o l o g i s e k s i + e k o l o g i s e l l a + e k o l o g i s e m m a k s i + e k o l o g i s e m m a n + e k o l o g i s e m m a s s a + e k o l o g i s e m m a t + e k o l o g i s e m m i l l a + e k o l o g i s e m m i n + e k o l o g i s e m p a a + e k o l o g i s e m p a a n + e k o l o g i s e m p i a + e k o l o g i s e n + e k o l o g i s e s t a + e k o l o g i s e t + e k o l o g i s i a + e k o l o g i s i a k i n + e k o l o g i s i i n + e k o l o g i s i l l e + e k o l o g i s i s s a + e k o l o g i s i s t a + e k o l o g i s t a + e k o l o g i s t a k i n + e k o n o m e t r i s i s s a + e k o n o m i l i i t t o + e k o n o m i s t i n + e k o p i s t e a s i a a n + e k o p i s t e e t + e k o p i s t e i d e n + e k o p i s t e i t ä + e k o p i s t e j ä r j e s t e l m ä + e k o p i s t e j ä r j e s t e l m ä l l ä + e k o p i s t e j ä r j e s t e l m ä n + e k o p i s t e j ä r j e s t e l m ä s t ä + e k o p i s t e j ä r j e s t e l m ä ä + e k o p i s t e j ä r j e s t e l m ä ä n + e k o p i s t e k i i s t a n + e k o p i s t e m ä ä r ä ä + e k o p i s t e p e r i a a t e + e k o p i s t e v e l v o l l i s i a + e k o s y s t e e m e i h i n + e k o s y s t e e m e i l l e + e k o s y s t e e m e i l l e m m e + e k o s y s t e e m e i s t ä + e k o s y s t e e m e j ä + e k o s y s t e e m i a r v i o i n n i s s a + e k o s y s t e e m i a r v i o s s a + e k o s y s t e e m i e n + e k o s y s t e e m i i n + e k o s y s t e e m i k r i i s i k s i + e k o s y s t e e m i l l e + e k o s y s t e e m i l ä h e s t y m i s t a p a + e k o s y s t e e m i l ä h e s t y m i s t a v a n + e k o s y s t e e m i l ä h t ö i n e n + e k o s y s t e e m i l ä h t ö i s e e n + e k o s y s t e e m i m m e + e k o s y s t e e m i n + e k o s y s t e e m i p a l v e l u i h i n + e k o s y s t e e m i p a l v e l u i l l a + e k o s y s t e e m i p a l v e l u i s t a + e k o s y s t e e m i p a l v e l u i t a + e k o s y s t e e m i p a l v e l u j a + e k o s y s t e e m i p a l v e l u j e n + e k o s y s t e e m i p a l v e l u t + e k o s y s t e e m i p e r u s t a i s e n + e k o s y s t e e m i p e r u s t e i s e n + e k o s y s t e e m i p o h j a i s t a + e k o s y s t e e m i p o l i t i i k k a + e k o s y s t e e m i t + e k o s y s t e e m i t o i m i n t o j e n + e k o s y s t e e m i t u t k i m u s t a a n + e k o s y s t e e m i ä + e k s i s t e n s s i k v a n t t o r i + e k s o d u s t a + e k s p a n s i i v i s e l l e + e k s p a n s i i v i s e m m a n + e k s p l i s i i t t i s e m m i n + e k s p l i s i i t t i s i ä + e k s p o n e n t t i f u n k t i o + e k s p o n e n t t i j a k a u m a + e k s p r e s s i o n i s t e i h i n + e k s t a a s i a + e k s t a a s i p i l l e r e i t ä + e k s t a a s i p i l l e r i ä + e k s t e r r i t o r i a a l i s e e n + e k s t e r r i t o r i a a l i s e s t a + e k s t e r r i t o r i a a l i s t a + e k s t e r r i t o r i a a l i s t e n + e k s t r a t e r r i t o r i a a l i n e n + e k s t r a t e r r i t o r i a a l i s e l t a + e k s t r a t e r r i t o r i a a l i s e n + e k s t r a t e r r i t o r i a a l i s e t + e k s t r a t e r r i t o r i a a l i s i a + e k s t r a t e r r i t o r i a a l i s i i n + e k s t r a t e r r i t o r i a a l i s i s s a + e k s t r a t e r r i t o r i a a l i s t a + e k s t r a t e r r i t o r i a a l i s t e n + e k s y m m e + e k s y n e i d e n + e k s y t t y + e k s y ä + e k u m e e n i s e s t a + e k v a a t t o r i j ä r j e s t e l m ä + e k v i v a l e n s s i l u o k k a + e k v i v a l e n s s i p e r i a a t e + e k v i v a l e n s s i r e l a a t i o + e k v i v a l e n t t i a n n o s + e k v i v a l e n t t i p i s t e + e l a n n o n h a n k k i m i s m a h d o l l i s u u k s i a + e l a n t o n s a + e l a n t o o n + e l a s t i i n i s ä i e + e l a t u s a i n e + e l a t u s a p u a + e l a t u s a p u a s i o i s s a + e l a t u s a p u j ä r j e s t e l m ä n + e l a t u s a p u k i i s t o j e n + e l a t u s a p u m a k s u j e n + e l a t u s a p u s a a t a v i e n + e l a t u s a p u t u o m i o i d e n + e l a t u s a p u u n + e l a t u s a p u v e l v o l l i s u u d e s t a + e l a t u s a p u v e l v o l l i s u u k s i a + e l a t u s a p u v e l v o l l i s u u k s i e n + e l a t u s a v u n + e l a t u s a v u s t a + e l a t u s k i i s t a t + e l a t u s m a k s u j a + e l a t u s m a k s u j e n + e l a t u s m a k s u t + e l a t u s m a k s u v e l v o l l i s u u k s i a a n + e l a t u s s u h t e e t + e l a t u s s u h t e i d e n + e l a t u s t a a k k a a + e l a t u s v a a t e i t a + e l a t u s v a a t i m u k s e n a + e l a t u s v a a t i m u s t e n + e l a t u s v a s t u i d e n + e l a t u s v e l k o j i e n + e l a t u s v e l v o i t t e i d e n + e l a t u s v e l v o l l i n e n + e l a t u s v e l v o l l i s e n + e l a t u s v e l v o l l i s u u d e n + e l a t u s v e l v o l l i s u u k s i a + e l a t u s v e l v o l l i s u u k s i e n + e l a t u s v e l v o l l i s u u k s i s s a + e l a t u s v e l v o l l i s u u s + e l a t u s v e l v o l l i s u u t e e n + e l a t u s v e l v o l l i s u u t t a + e l d o r a d o a + e l d o r a d o s s a + e l e e n ä + e l e e t + e l e f a n t t i e n + e l e f a n t t i g a m b i i t t i + e l e f a n t t i h e i n ä + e l e f a n t t i h e i n ä s t ä + e l e f a n t t i m i e s + e l e f a n t t i r i t a r i k u n t a + e l e f a n t t i s a a r i + e l e f a n t t i t a u t i + e l e i d e n + e l e i l l ä + e l e i t ä + e l e k i e l t ä n n e + e l e k t r o d i p o t e n t i a a l i + e l e k t r o l u m i n e s e n s s i n ä y t t ö + e l e k t r o l y y s i k e n n o i l l e + e l e k t r o l y y s i l a i t t e e t + e l e k t r o l y y s i l a i t t e i d e n + e l e k t r o l y y s i l a i t t e i s s a + e l e k t r o m a g n e e t t i s e l l e + e l e k t r o m a g n e e t t i s e t + e l e k t r o n i a f f i n i t e e t t i + e l e k t r o n i a u k k o + e l e k t r o n i d i f f r a k t i o + e l e k t r o n i i k k a j ä t e t t ä + e l e k t r o n i i k k a j ä t t e e s t ä + e l e k t r o n i i k k a k a u p p a + e l e k t r o n i i k k a l a i t e j ä t e + e l e k t r o n i i k k a l a i t e r o m u + e l e k t r o n i i k k a l a i t e r o m u a + e l e k t r o n i i k k a l a i t e r o m u a s e t u k s e n + e l e k t r o n i i k k a l a i t e r o m u d i r e k t i i v i + e l e k t r o n i i k k a l a i t e r o m u d i r e k t i i v i n + e l e k t r o n i i k k a l a i t e r o m u k u l j e t u k s i a + e l e k t r o n i i k k a l a i t e r o m u n + e l e k t r o n i i k k a l a i t e r o m u s t a + e l e k t r o n i i k k a l a i t t e e t + e l e k t r o n i i k k a l a i t t e i d e n + e l e k t r o n i i k k a l a i t t e i s i i n + e l e k t r o n i i k k a l a i t t e i s s a + e l e k t r o n i i k k a l a i t t e i s t a + e l e k t r o n i i k k a l a i t t e i t a + e l e k t r o n i i k k a p e l i + e l e k t r o n i i k k a r a k e n t a m i s e n + e l e k t r o n i i k k a r o m u + e l e k t r o n i i k k a r o m u a + e l e k t r o n i i k k a r o m u d i r e k t i i v i n + e l e k t r o n i i k k a r o m u j ä t e t t ä + e l e k t r o n i i k k a r o m u n + e l e k t r o n i i k k a r o m u s t a + e l e k t r o n i i k k a t a r v i k k e e t + e l e k t r o n i i k k a t e o l l i s u u d e n + e l e k t r o n i i k k a t e o l l i s u u d e s s a + e l e k t r o n i i k k a t e o l l i s u u s + e l e k t r o n i i k k a t e o l l i s u u t e e n + e l e k t r o n i i k k a t u o t t e e t + e l e k t r o n i i k k a t u o t t e i d e n + e l e k t r o n i i k k a t u o t t e i s i i n + e l e k t r o n i i k k a t u o t t e i s s a + e l e k t r o n i i k k a t u o t t e i s t a + e l e k t r o n i i k k a t u o t t e i t a + e l e k t r o n i i k k a y r i t y s + e l e k t r o n i k o n f i g u r a a t i o + e l e k t r o n i k u o r i + e l e k t r o n i m i k r o s k o o p p i + e l e k t r o n i n s i i r t o k e t j u + e l e k t r o n i p a r i + e l e k t r o n i p u t k i + e l e k t r o n i s e e n + e l e k t r o n i s e l l a + e l e k t r o n i s e n + e l e k t r o n i s e s s a + e l e k t r o n i s e s t a + e l e k t r o n i s e t + e l e k t r o n i s i e p p a u s + e l e k t r o n i s i r u + e l e k t r o n i s t a + e l e k t r o n i s u i h k u l i t o g r a f i a + e l e k t r o n i t y k k i + e l e m e n t e i s t ä + e l e m e n t i n + e l e m e n t i t + e l e m e n t t e i n ä + e l e m e n t t e j ä + e l e m e n t t i k e r r o s t a l o j a + e l e m e n t t i l e v y j ä + e l e m e n t t i l ä h i ö i d e n + e l e m e n t t i l ä h i ö i s s ä + e l e m e n t t i l ä h i ö i t ä + e l e m e n t t i r a k e n n u s a l a l l a + e l e m e n t t i t a l o + e l e t t y + e l e t t ä + e l i i t i n + e l i i t t i e n + e l i i t t i i n + e l i i t t i j o u k k o j e n + e l i i t t i k e r h o a + e l i i t t i k o n s e n s u s t a + e l i i t t i k o u l u + e l i i t t i k o u l u i n a + e l i i t t i l a i t o k s i k s i + e l i i t t i o h j e l m a + e l i i t t i o h j e l m a k s i + e l i i t t i p i i r e i s s ä + e l i i t t i p i i r i k s i + e l i i t t i r u o k a a + e l i i t t i r y h m i l l e + e l i i t t i s i s ä p i i r i n + e l i i t t i v e r k k o a + e l i i t t i ä + e l i m e l l e + e l i m e n + e l i m e n s i i r r o n + e l i m e n ä + e l i m e s t ä + e l i m e t + e l i m i e n + e l i m i i n + e l i m i l l e + e l i m i l l ä + e l i m i n a a t i o r e a k t i o + e l i m i n o i d a a n + e l i m i n o i m i n e n + e l i m i s s ä + e l i m i s t ä + e l i m i s t ö n + e l i m i s t ö ö n + e l i m i ä + e l i m i ä ä n + e l i n a i k a n a + e l i n a i k a n a a n + e l i n a j a n + e l i n a j a n o d o t e k i n + e l i n a j a n o d o t e t t a + e l i n a j a n o d o t t e e m m e + e l i n a j a n o d o t t e e n + e l i n a j a n o d o t t e e s e e n + e l i n a j a n o d o t t e e s s a + e l i n a j a n o d o t t e e s t a + e l i n a j a n o d o t t e e t + e l i n a j a n o d o t u k s e n s a + e l i n a j a n o d o t u s t e n + e l i n a j a s t a + e l i n a l a s t a + e l i n a l u e + e l i n a l u e e l l e + e l i n e h d o i s t a + e l i n e h d o t + e l i n e h t o + e l i n e h t o i h i n + e l i n e h t o j a + e l i n e h t o j a a n + e l i n e h t o j e n + e l i n e h t o j e n s a + e l i n i k ä + e l i n i k ä a n a l y y s i n + e l i n i k ä i n e n + e l i n i k ä i s e e n + e l i n i k ä i s e k s i + e l i n i k ä i s e l l e + e l i n i k ä i s e n + e l i n i k ä i s e s s ä + e l i n i k ä i s e s t ä + e l i n i k ä i s e t + e l i n i k ä i s i ä + e l i n i k ä i s t ä + e l i n i k ä n s ä + e l i n i k ä o d o t u k s e n + e l i n i k ä o d o t u k s e n s a + e l i n i k ä ä + e l i n i k ä ä n + e l i n i ä n + e l i n i ä n o d o t t e e n + e l i n i ä n o d o t t e e s e e n + e l i n i ä n o d o t t e e s s a + e l i n i ä s t ä + e l i n k a a r e e n + e l i n k a a r e n + e l i n k a a r e n s a + e l i n k a a r e s s a a n + e l i n k a a r e s t a + e l i n k a a r e t + e l i n k a a r i + e l i n k a a r i a j a t t e l u + e l i n k a a r i a j a t t e l u a + e l i n k a a r i a n a l y y s i + e l i n k a a r i a n a l y y s i e n + e l i n k a a r i a n a l y y s i i n + e l i n k a a r i a n a l y y s i n + e l i n k a a r i a r v i o i n n i n + e l i n k a a r i a r v i o i n t i + e l i n k a a r i a r v i o i n t i i n + e l i n k a a r i k u s t a n n u k s e t + e l i n k a a r i k u s t a n n u k s i a + e l i n k a a r i k u s t a n n u s t e n + e l i n k a a r i l ä h e s t y m i s t a p a a + e l i n k a a r i m a l l i + e l i n k a a r i m a l l i n + e l i n k a a r i t a r k i s t e l u i d e n + e l i n k a a r i u l o t t u v u u s + e l i n k a a r i v a i k u t u k s e n + e l i n k a a r t a + e l i n k a u p a l l e + e l i n k a u p a n + e l i n k a u p a s s a + e l i n k a u p a s t a + e l i n k a u p p a + e l i n k a u p p a a + e l i n k a u p p a a n + e l i n k a u p p a t a r k o i t u k s i i n + e l i n k a u p p a v e r k o s t o i h i n + e l i n k a u p p a v e r k o s t o s s a + e l i n k a u t i n e n + e l i n k a u t i s e e n + e l i n k a u t i s e k s i + e l i n k a u t i s e n + e l i n k a u t i s e s t a + e l i n k a u t i s e t + e l i n k a u t i s i a + e l i n k a u t i s i i n + e l i n k a u t i s i s t a + e l i n k a u t i s t a + e l i n k a u t i s t u o m i o i t a a n + e l i n k a u t i s t u o m i o n + e l i n k e i n o + e l i n k e i n o a + e l i n k e i n o a l a + e l i n k e i n o a l a t + e l i n k e i n o a l o i l l a + e l i n k e i n o a l o j e m m e + e l i n k e i n o a l u e e n a + e l i n k e i n o a l u e i t a + e l i n k e i n o e l ä m ä + e l i n k e i n o e l ä m ä k i n + e l i n k e i n o e l ä m ä l l e + e l i n k e i n o e l ä m ä n + e l i n k e i n o e l ä m ä ä + e l i n k e i n o e l ä m ä ä n + e l i n k e i n o i l l e + e l i n k e i n o i s t a a n + e l i n k e i n o j a + e l i n k e i n o j ä r j e s t ö j e n + e l i n k e i n o l a i n s ä ä d ä n n ö n + e l i n k e i n o l l e + e l i n k e i n o m u o d o i l l a + e l i n k e i n o n + e l i n k e i n o n a + e l i n k e i n o n h a r j o i t t a j a t + e l i n k e i n o n h a r j o i t t a j i a + e l i n k e i n o n h a r j o i t t a j i e n + e l i n k e i n o n h a r j o i t t a j i l l e + e l i n k e i n o n s a + e l i n k e i n o p o l i t i i k a s t a + e l i n k e i n o p o l i t i i k k a + e l i n k e i n o p o l i t i i k k a a + e l i n k e i n o p o l i t i i k k a a n + e l i n k e i n o r a k e n t e e n s a + e l i n k e i n o r a k e n t e e s s a + e l i n k e i n o r a k e n t e i s t a + e l i n k e i n o s t a + e l i n k e i n o s t a a n + e l i n k e i n o t + e l i n k e i n o t u e t + e l i n k e i n o v a p a u s + e l i n k e i n o v a p a u t t a + e l i n k e i n o v e r o i s t a + e l i n k e i n o y h d i s t y k s i s t ä + e l i n k e l p o i n e n + e l i n k e l p o i s e m m a l l e + e l i n k e l p o i s e n + e l i n k e l p o i s i a + e l i n k e l p o i s i n + e l i n k e l p o i s i n a + e l i n k e l p o i s t e n + e l i n k e l p o i s u u d e n + e l i n k e l p o i s u u s k ä y r ä + e l i n k e l p o i s u u s o n g e l m i a + e l i n k e l p o i s u u t e e n + e l i n k e l p o i s u u t t a + e l i n k e l v o t t o m i k s i + e l i n k o r k o + e l i n k u m p p a n e i d e n + e l i n k u m p p a n e i d e n s a + e l i n k u m p p a n e i l l a + e l i n k u m p p a n e i l l e + e l i n k u m p p a n e i l l e e n + e l i n k u m p p a n e i n a + e l i n k u m p p a n i e n + e l i n k u m p p a n i n s a + e l i n k u m p p a n i t + e l i n k u s t a n n u k s e n s a + e l i n k u s t a n n u k s e t + e l i n k u s t a n n u k s i a + e l i n k u s t a n n u k s i e n + e l i n k u s t a n n u k s i i n + e l i n k u s t a n n u k s i s t a + e l i n k u s t a n n u s k r i i s i i n + e l i n k u s t a n n u s t e n + e l i n k u u k a u s i e n + e l i n k y k y i s e e n + e l i n k y k y i s e t + e l i n l u o v u t t a j a a + e l i n l u o v u t t a j a r e k i s t e r i i n + e l i n l u o v u t t a j i e n + e l i n l u o v u t t a j i s t a + e l i n l u o v u t u k s e n + e l i n l u o v u t u k s e t + e l i n l u o v u t u k s i a + e l i n l u o v u t u k s i i n + e l i n l u o v u t u k s i l l a + e l i n l u o v u t u k s i s s a + e l i n l u o v u t u k s i s t a + e l i n l u o v u t u s + e l i n l u o v u t u s k o r t i n + e l i n l u o v u t u s k o r t i s t a + e l i n l u o v u t u s k o r t t e j a + e l i n l u o v u t u s k o r t t i + e l i n l u o v u t u s k o r t t i a + e l i n l u o v u t u s k o r t t i e n + e l i n l u o v u t u s m ä ä r ä t + e l i n l u o v u t u s t a + e l i n l u o v u t u s t e n + e l i n m a h d o l l i s u u d e t + e l i n m a h d o l l i s u u k s i a + e l i n m a h d o l l i s u u k s i a m m e + e l i n m a h d o l l i s u u k s i e n + e l i n o l o i h i m m e + e l i n o l o i h i n + e l i n o l o i h i n s a + e l i n o l o i l l e + e l i n o l o i l l e e n + e l i n o l o i s s a + e l i n o l o i s t a + e l i n o l o i s t a a n + e l i n o l o j a + e l i n o l o j a a n + e l i n o l o j e n + e l i n o l o j e n s a + e l i n o l o n s a + e l i n o l o s u h t e e n s a + e l i n o l o s u h t e e t + e l i n o l o s u h t e i d e m m e + e l i n o l o s u h t e i d e n + e l i n o l o s u h t e i d e n s a + e l i n o l o s u h t e i l l e + e l i n o l o s u h t e i s i i n + e l i n o l o s u h t e i s s a + e l i n o l o s u h t e i s t a + e l i n o l o s u h t e i s t a a n + e l i n o l o s u h t e i t a + e l i n o l o s u h t e i t a a n + e l i n o l o t + e l i n p a i k a k s e e n + e l i n p a i k a k s i + e l i n p o i s t o j a + e l i n p r o s e s s i i n + e l i n p u l a a n + e l i n p ä i v i n ä ä n + e l i n r y t m i i n + e l i n s i i r r o i s s a + e l i n s i i r r o i s t a + e l i n s i i r r o n + e l i n s i i r r o t + e l i n s i i r t o + e l i n s i i r t o a + e l i n s i i r t o d i r e k t i i v i i n + e l i n s i i r t o i h i n + e l i n s i i r t o j a + e l i n s i i r t o j e n + e l i n s i i r t o j ä r j e s t e l m i e n + e l i n s i i r t o j ä r j e s t e l m i i n + e l i n s i i r t o j ä r j e s t e l m i ä + e l i n s i i r t o j ä r j e s t e l m ä + e l i n s i i r t o j ä r j e s t e l m ä n + e l i n s i i r t o j ä r j e s t e l m ä s t ä + e l i n s i i r t o j ä r j e s t e l m ä t + e l i n s i i r t o j ä r j e s t ö n + e l i n s i i r t o j ä r j e s t ö t + e l i n s i i r t o k e s k u s t e n + e l i n s i i r t o k o o r d i n a a t t o r e i d e n + e l i n s i i r t o k o o r d i n a a t t o r i n + e l i n s i i r t o l a k i + e l i n s i i r t o m a t k a i l u + e l i n s i i r t o m a t k a i l u a + e l i n s i i r t o m a t k a i l u n + e l i n s i i r t o m a t k a i l u u n + e l i n s i i r t o m e n e t e l m ä t + e l i n s i i r t o m e n e t t e l y n + e l i n s i i r t o o n + e l i n s i i r t o p a l v e l u j a + e l i n s i i r t o p a l v e l u j e n + e l i n s i i r t o p o l i t i i k k a a + e l i n s i i r t o p r o s e s s e j a + e l i n s i i r t o t u r i s m i + e l i n s i i r t o t u r i s m i a + e l i n s i i r t o t u r i s m i n + e l i n t a p a + e l i n t a p a a + e l i n t a p a a n + e l i n t a p a m a l l e i s s a + e l i n t a p a m a l l e j a a n + e l i n t a p a m u u t o s + e l i n t a p a n s a + e l i n t a p a s a i r a u k s i e n + e l i n t a p a s t a n d a r d i e n + e l i n t a p o i h i m m e + e l i n t a p o j a m m e + e l i n t a p o j e n + e l i n t a r p e i s i i m m e + e l i n t a r v i k e + e l i n t a r v i k e a i n e i d e n + e l i n t a r v i k e a l a + e l i n t a r v i k e a l a a + e l i n t a r v i k e a l a a n + e l i n t a r v i k e a l a l l a + e l i n t a r v i k e a l a l l e + e l i n t a r v i k e a l a m m e + e l i n t a r v i k e a l a n + e l i n t a r v i k e a l a s t a + e l i n t a r v i k e a l l e r g i a t + e l i n t a r v i k e a l o i l l a + e l i n t a r v i k e a l o j a + e l i n t a r v i k e a l o j e n + e l i n t a r v i k e a l u e e l l e + e l i n t a r v i k e a p u + e l i n t a r v i k e a p u a + e l i n t a r v i k e a p u j ä r j e s t e l m ä + e l i n t a r v i k e a p u k o m i t e a + e l i n t a r v i k e a p u k u l j e t u k s i l l e + e l i n t a r v i k e a p u k u l j e t u s + e l i n t a r v i k e a p u m m e + e l i n t a r v i k e a p u n a + e l i n t a r v i k e a p u n s a + e l i n t a r v i k e a p u o h j e l m a + e l i n t a r v i k e a p u o h j e l m a a + e l i n t a r v i k e a p u o h j e l m a l l a + e l i n t a r v i k e a p u o h j e l m a l l e + e l i n t a r v i k e a p u o h j e l m a n + e l i n t a r v i k e a p u o h j e l m a s s a + e l i n t a r v i k e a p u o h j e l m a s t a + e l i n t a r v i k e a p u o h j e l m a t + e l i n t a r v i k e a p u o h j e l m i e n + e l i n t a r v i k e a p u o h j e l m i l l a + e l i n t a r v i k e a p u o h j e l m i l l e + e l i n t a r v i k e a p u p a k e t t i a + e l i n t a r v i k e a p u r a h a s t o o n + e l i n t a r v i k e a p u t a l o u s a r v i o l l e + e l i n t a r v i k e a p u t a r p e e t + e l i n t a r v i k e a p u t o i m i t u k s e t + e l i n t a r v i k e a p u t o i m i t u s t e n + e l i n t a r v i k e a p u u n + e l i n t a r v i k e a p u v ä l i n e e n + e l i n t a r v i k e a r o m i e n + e l i n t a r v i k e a s e e n + e l i n t a r v i k e a s e t t a + e l i n t a r v i k e a s e t u k s e s s a + e l i n t a r v i k e a s e t u k s i i n + e l i n t a r v i k e a s i a n t u n t i j a + e l i n t a r v i k e a s i a s s a + e l i n t a r v i k e a s i o i t a + e l i n t a r v i k e a v u l l a + e l i n t a r v i k e a v u l t a + e l i n t a r v i k e a v u n + e l i n t a r v i k e a v u n a n t a j a + e l i n t a r v i k e a v u s s a + e l i n t a r v i k e a v u s t a + e l i n t a r v i k e a v u s t u k s e s t a + e l i n t a r v i k e a v u s t u k s e t + e l i n t a r v i k e d i r e k t i i v e i h i n + e l i n t a r v i k e d i r e k t i i v i t + e l i n t a r v i k e h a a s t e e s e e n + e l i n t a r v i k e h a a s t e i s i i n + e l i n t a r v i k e h a a s t e t t a + e l i n t a r v i k e h a n k i n t o j e n + e l i n t a r v i k e h i n n a t + e l i n t a r v i k e h i n t a s o k k i i n + e l i n t a r v i k e h i n t o i h i n + e l i n t a r v i k e h i n t o j a + e l i n t a r v i k e h i n t o j e n + e l i n t a r v i k e h u i p p u k o k o u k s e e n + e l i n t a r v i k e h u i p p u k o k o u k s e n + e l i n t a r v i k e h u i p p u k o k o u k s e s s a + e l i n t a r v i k e h u i p p u k o k o u k s e s t a + e l i n t a r v i k e h u i p p u k o k o u s + e l i n t a r v i k e h u i p p u k o k o u s t a + e l i n t a r v i k e h u o l l o l l e + e l i n t a r v i k e h u o l l o n + e l i n t a r v i k e h u o l l o s s a + e l i n t a r v i k e h u o l l o s t a + e l i n t a r v i k e h u o l t o + e l i n t a r v i k e h u o l t o a + e l i n t a r v i k e h u o l t o m m e + e l i n t a r v i k e h u o l t o n s a + e l i n t a r v i k e h u o l t o o n + e l i n t a r v i k e h y g i e n i a + e l i n t a r v i k e h y g i e n i a a + e l i n t a r v i k e h y g i e n i a a n + e l i n t a r v i k e h y g i e n i a d i r e k t i i v i n + e l i n t a r v i k e h y g i e n i a l a i n s ä ä d ä n t ö + e l i n t a r v i k e h y g i e n i a n + e l i n t a r v i k e h y g i e n i a n ä k ö k o h t i a + e l i n t a r v i k e h y g i e n i a p a k e t i n + e l i n t a r v i k e h y g i e n i a p a k e t i s s a + e l i n t a r v i k e h y g i e n i a p a k e t t i + e l i n t a r v i k e h y g i e n i a p o l i t i i k a s s a + e l i n t a r v i k e h y g i e n i a s s a + e l i n t a r v i k e h y g i e n i a s t a + e l i n t a r v i k e h y g i e n i a s ä ä n n ö t + e l i n t a r v i k e h y s t e r i o i d e n + e l i n t a r v i k e h y ö d y k e j o h d a n n a i s i l l a + e l i n t a r v i k e h y ö d y k k e i d e n + e l i n t a r v i k e h y ö d y k k e i l l ä + e l i n t a r v i k e h ä t ä a p u a + e l i n t a r v i k e h ä t ä a p u a a n + e l i n t a r v i k e h ä t ä a p u p a k e t i n + e l i n t a r v i k e h ä t ä a v u n + e l i n t a r v i k e j a l o s t a j a t + e l i n t a r v i k e j a l o s t e i d e n + e l i n t a r v i k e j a l o s t u k s e n + e l i n t a r v i k e j a l o s t u s + e l i n t a r v i k e j o h d a n n a i s i l l a + e l i n t a r v i k e j ä r j e s t e l m ä + e l i n t a r v i k e j ä r j e s t ö n + e l i n t a r v i k e j ä t t e e n + e l i n t a r v i k e j ä t t e e s t ä + e l i n t a r v i k e j ä t t e j ä + e l i n t a r v i k e j ä t t i e n + e l i n t a r v i k e k a s v i + e l i n t a r v i k e k a t a s t r o f e j a + e l i n t a r v i k e k a t a s t r o f i s t a + e l i n t a r v i k e k a u p a l l a + e l i n t a r v i k e k a u p a n + e l i n t a r v i k e k a u p o i s t a + e l i n t a r v i k e k a u p p a + e l i n t a r v i k e k a u p p a a + e l i n t a r v i k e k e i n o t t e l u + e l i n t a r v i k e k e l m u t + e l i n t a r v i k e k e s k u s + e l i n t a r v i k e k e t j u + e l i n t a r v i k e k e t j u a + e l i n t a r v i k e k e t j u i l l e + e l i n t a r v i k e k e t j u i s s a + e l i n t a r v i k e k e t j u j a + e l i n t a r v i k e k e t j u l l e + e l i n t a r v i k e k e t j u m m e + e l i n t a r v i k e k e t j u n + e l i n t a r v i k e k e t j u s s a + e l i n t a r v i k e k e t j u s s a m m e + e l i n t a r v i k e k e t j u s t a + e l i n t a r v i k e k e t j u u n + e l i n t a r v i k e k i i n t i ö i t ä + e l i n t a r v i k e k o h u a + e l i n t a r v i k e k o m i t e a + e l i n t a r v i k e k o m i t e a a + e l i n t a r v i k e k o m i t e a n + e l i n t a r v i k e k o n f e r e n s s i + e l i n t a r v i k e k o n f e r e n s s i s s a + e l i n t a r v i k e k o n s e r n e j a + e l i n t a r v i k e k o n s e r n i a + e l i n t a r v i k e k o n s e r n i t + e l i n t a r v i k e k o o d i s t o n + e l i n t a r v i k e k r i i s e i h i n + e l i n t a r v i k e k r i i s e i s s ä + e l i n t a r v i k e k r i i s e i s t ä + e l i n t a r v i k e k r i i s e j ä + e l i n t a r v i k e k r i i s i + e l i n t a r v i k e k r i i s i e n + e l i n t a r v i k e k r i i s i i n + e l i n t a r v i k e k r i i s i k s i + e l i n t a r v i k e k r i i s i l l ä + e l i n t a r v i k e k r i i s i l t ä + e l i n t a r v i k e k r i i s i n + e l i n t a r v i k e k r i i s i n ä + e l i n t a r v i k e k r i i s i s s ä + e l i n t a r v i k e k r i i s i s t ä + e l i n t a r v i k e k r i i s i t + e l i n t a r v i k e k r i i s i t i l a n t e i s s a + e l i n t a r v i k e k r i i s i ä + e l i n t a r v i k e k u l j e t u k s e t + e l i n t a r v i k e k u l t t u u r i + e l i n t a r v i k e k u l u t u s m a r k k i n a t + e l i n t a r v i k e k u s t a n n u s t e n + e l i n t a r v i k e k y s y m y k s e n + e l i n t a r v i k e k y s y m y k s i s s ä + e l i n t a r v i k e k y s y m y s + e l i n t a r v i k e k y s y m y s t ä + e l i n t a r v i k e k y s y n n ä n + e l i n t a r v i k e k y s y n t ä + e l i n t a r v i k e k ä y t t ö ö n + e l i n t a r v i k e k ä y t ö n + e l i n t a r v i k e l a a d u n + e l i n t a r v i k e l a i n s ä ä d ä n n ö l l e + e l i n t a r v i k e l a i n s ä ä d ä n n ö l l ä + e l i n t a r v i k e l a i n s ä ä d ä n n ö n + e l i n t a r v i k e l a i n s ä ä d ä n n ö s s ä + e l i n t a r v i k e l a i n s ä ä d ä n n ö s t ä + e l i n t a r v i k e l a i n s ä ä d ä n t ö + e l i n t a r v i k e l a i n s ä ä d ä n t ö e l i n + e l i n t a r v i k e l a i n s ä ä d ä n t ö k i n + e l i n t a r v i k e l a i n s ä ä d ä n t ö m m e + e l i n t a r v i k e l a i n s ä ä d ä n t ö p a k e t t i + e l i n t a r v i k e l a i n s ä ä d ä n t ö ä + e l i n t a r v i k e l a i n s ä ä d ä n t ö ö n + e l i n t a r v i k e l a i s s a + e l i n t a r v i k e l a i s t a + e l i n t a r v i k e l a i t o s + e l i n t a r v i k e l a k i + e l i n t a r v i k e l a k i e n + e l i n t a r v i k e l i i k e + e l i n t a r v i k e l i i k e k e t j u i l l e + e l i n t a r v i k e l i i k e k e t j u j e n + e l i n t a r v i k e l i i k k e i d e n + e l i n t a r v i k e l i i m a n a + e l i n t a r v i k e l i s ä a i n e e t + e l i n t a r v i k e l i s ä a i n e i d e n + e l i n t a r v i k e l i s ä a i n e i n a + e l i n t a r v i k e l i s ä a i n e i s t a + e l i n t a r v i k e l i s ä a i n e i t a + e l i n t a r v i k e l i s ä a i n e m ä ä r i t e l m ä s t ä + e l i n t a r v i k e l i s ä a i n e r y h m i e n + e l i n t a r v i k e l i s ä a i n e t t a + e l i n t a r v i k e l ä h t e e t + e l i n t a r v i k e l ä h t e i d e n + e l i n t a r v i k e m a i n o n t a a + e l i n t a r v i k e m a l l i + e l i n t a r v i k e m a l l i a + e l i n t a r v i k e m a l l i i n + e l i n t a r v i k e m a l l i n + e l i n t a r v i k e m a r k k i n o i d e n + e l i n t a r v i k e m a r k k i n o i l l a + e l i n t a r v i k e m a r k k i n o i l l a m m e + e l i n t a r v i k e m a r k k i n o i l l e + e l i n t a r v i k e m a r k k i n o i t a + e l i n t a r v i k e m e l l a k a t + e l i n t a r v i k e m e l l a k o i d e n + e l i n t a r v i k e m e l l a k o i h i n + e l i n t a r v i k e m e l l a k o i t a + e l i n t a r v i k e m e r k i n n ä t + e l i n t a r v i k e m e r k i n n ö i s s ä + e l i n t a r v i k e m e r k i n n ö i s t ä + e l i n t a r v i k e m e r k i n t ö i h i n + e l i n t a r v i k e m e r k i n t ö j e n + e l i n t a r v i k e m e r k i n t ö j ä + e l i n t a r v i k e m e r k k e j ä + e l i n t a r v i k e m y r k y t y s t e n + e l i n t a r v i k e m y y m ä l ö i d e n + e l i n t a r v i k e m y y m ä l ö i h i n + e l i n t a r v i k e m y y m ä l ö i s t ä + e l i n t a r v i k e m ä ä r ä n + e l i n t a r v i k e m ä ä r ä y k s i ä + e l i n t a r v i k e n o r m e i h i n + e l i n t a r v i k e n o r m e j a a n + e l i n t a r v i k e n o r m i t + e l i n t a r v i k e n ä k ö k o h t i a + e l i n t a r v i k e o h j e l m a + e l i n t a r v i k e o h j e l m a a + e l i n t a r v i k e o h j e l m a a n + e l i n t a r v i k e o h j e l m a l l e + e l i n t a r v i k e o h j e l m a m m e + e l i n t a r v i k e o h j e l m a n + e l i n t a r v i k e o h j e l m a s s a + e l i n t a r v i k e o h j e l m a s t a + e l i n t a r v i k e o h j e l m i s s a + e l i n t a r v i k e o i k e u d e n + e l i n t a r v i k e o i k e u d e s t a + e l i n t a r v i k e o i k e u s + e l i n t a r v i k e o i k e u t t a + e l i n t a r v i k e o m a v a r a i s u u d e l l e + e l i n t a r v i k e o m a v a r a i s u u d e n + e l i n t a r v i k e o m a v a r a i s u u d e s t a + e l i n t a r v i k e o m a v a r a i s u u s + e l i n t a r v i k e o m a v a r a i s u u t e e n + e l i n t a r v i k e o m a v a r a i s u u t e m m e + e l i n t a r v i k e o m a v a r a i s u u t e n s a + e l i n t a r v i k e o m a v a r a i s u u t t a + e l i n t a r v i k e o n g e l m a + e l i n t a r v i k e o n g e l m a a + e l i n t a r v i k e o n g e l m a n + e l i n t a r v i k e o n g e l m a t + e l i n t a r v i k e p a k e t i t + e l i n t a r v i k e p a k k a u k s e n + e l i n t a r v i k e p a k k a u k s e s s a + e l i n t a r v i k e p a k k a u k s i s s a + e l i n t a r v i k e p a k k a u s t e n + e l i n t a r v i k e p e l k o j e n + e l i n t a r v i k e p o l i i t t i n e n + e l i n t a r v i k e p o l i i t t i s e n + e l i n t a r v i k e p o l i i t t i s t e n + e l i n t a r v i k e p o l i t i i k a l l e m m e + e l i n t a r v i k e p o l i t i i k a n + e l i n t a r v i k e p o l i t i i k a s s a + e l i n t a r v i k e p o l i t i i k a s s a m m e + e l i n t a r v i k e p o l i t i i k a s t a + e l i n t a r v i k e p o l i t i i k a t + e l i n t a r v i k e p o l i t i i k k a + e l i n t a r v i k e p o l i t i i k k a a + e l i n t a r v i k e p o l i t i i k k a a m m e + e l i n t a r v i k e p o l i t i i k k a a n + e l i n t a r v i k e p o l i t i i k k a m m e + e l i n t a r v i k e p o l i t i i k k o j a + e l i n t a r v i k e p o l i t i i k k o j e n + e l i n t a r v i k e p r o s e s s i s t a + e l i n t a r v i k e p r o t e k t i o n i s m i i n + e l i n t a r v i k e p u l a + e l i n t a r v i k e p u l a a + e l i n t a r v i k e p u l a a n + e l i n t a r v i k e p u l a n + e l i n t a r v i k e p u l a s t a + e l i n t a r v i k e r a h a s t o + e l i n t a r v i k e r a h a s t o n + e l i n t a r v i k e r a h o i t u s v ä l i n e + e l i n t a r v i k e r a h o i t u s v ä l i n e e n + e l i n t a r v i k e r a h o i t u s v ä l i n e e s e e n + e l i n t a r v i k e r a h o i t u s v ä l i n e e s t ä + e l i n t a r v i k e r a h o i t u s v ä l i n e t t ä + e l i n t a r v i k e r e s u r s s i t + e l i n t a r v i k e r i i p p u m a t t o m u u d e n + e l i n t a r v i k e r i i p p u m a t t o m u u d e s t a + e l i n t a r v i k e r i i p p u m a t t o m u u s + e l i n t a r v i k e r i i p p u m a t t o m u u t e e n + e l i n t a r v i k e r i i p p u m a t t o m u u t e m m e + e l i n t a r v i k e r i i p p u m a t t o m u u t t a + e l i n t a r v i k e r i i p p u m a t t o m u u t t a m m e + e l i n t a r v i k e r i i p p u v u u d e n + e l i n t a r v i k e r i i p p u v u u s + e l i n t a r v i k e r i i p p u v u u t t a + e l i n t a r v i k e r i i s e i s t ä + e l i n t a r v i k e r i k o l l i s u u t t a + e l i n t a r v i k e r i s k i ä + e l i n t a r v i k e r y h m i t t y m ä n + e l i n t a r v i k e s a a r t o o n + e l i n t a r v i k e s e k t o r i a + e l i n t a r v i k e s e k t o r i l l a + e l i n t a r v i k e s e k t o r i n + e l i n t a r v i k e s e k t o r i s t a + e l i n t a r v i k e s k a n d a a l e i s t a + e l i n t a r v i k e s k a n d a a l e j a + e l i n t a r v i k e s k a n d a a l i + e l i n t a r v i k e s k a n d a a l i a + e l i n t a r v i k e s k a n d a a l i e n + e l i n t a r v i k e s k a n d a a l i n + e l i n t a r v i k e s k a n d a a l i s t a + e l i n t a r v i k e s k a n d a a l i t + e l i n t a r v i k e s t a n d a r d e i s t a + e l i n t a r v i k e s t a n d a r d e j a + e l i n t a r v i k e s t a n d a r d i t + e l i n t a r v i k e s t a n d a r d i v i r a s t o n + e l i n t a r v i k e s u o j a a + e l i n t a r v i k e s u o j a s t a + e l i n t a r v i k e t a l o u d e l l e + e l i n t a r v i k e t a l o u d e n + e l i n t a r v i k e t a l o u s k e t j u s s a + e l i n t a r v i k e t a l o u t t a + e l i n t a r v i k e t a p p i o i d e n + e l i n t a r v i k e t a r j o n n a n + e l i n t a r v i k e t a r j o n t a + e l i n t a r v i k e t a r j o n t a a m m e + e l i n t a r v i k e t a r j o n t a m m e + e l i n t a r v i k e t a r k a s t a j i a + e l i n t a r v i k e t a r k a s t u k s i s t a + e l i n t a r v i k e t a r k o i t u k s i i n + e l i n t a r v i k e t a r p e e m m e + e l i n t a r v i k e t a r p e e n + e l i n t a r v i k e t a r p e e s e e m m e + e l i n t a r v i k e t a r p e e t + e l i n t a r v i k e t a r p e i d e n + e l i n t a r v i k e t a s a p a i n o a + e l i n t a r v i k e t a s a p a i n o n + e l i n t a r v i k e t a s o n + e l i n t a r v i k e t e h t a a s t a + e l i n t a r v i k e t e h t a i s t a + e l i n t a r v i k e t e h t a i t a + e l i n t a r v i k e t e k n o l o g i a + e l i n t a r v i k e t e k n o l o g i a n + e l i n t a r v i k e t e o l l i s u u d e l l e + e l i n t a r v i k e t e o l l i s u u d e l t a + e l i n t a r v i k e t e o l l i s u u d e n + e l i n t a r v i k e t e o l l i s u u d e s s a + e l i n t a r v i k e t e o l l i s u u d e s t a + e l i n t a r v i k e t e o l l i s u u d e s t a k a a n + e l i n t a r v i k e t e o l l i s u u s + e l i n t a r v i k e t e o l l i s u u s k i n + e l i n t a r v i k e t e o l l i s u u t e e m m e + e l i n t a r v i k e t e o l l i s u u t e e n + e l i n t a r v i k e t e o l l i s u u t e m m e + e l i n t a r v i k e t e o l l i s u u t t a + e l i n t a r v i k e t i e d e + e l i n t a r v i k e t i e d o t t a m i s e l l a + e l i n t a r v i k e t i l a n n e + e l i n t a r v i k e t i l a n n e t t a + e l i n t a r v i k e t i l a n t e e n + e l i n t a r v i k e t i l a n t e e s e e n + e l i n t a r v i k e t i l a n t e e s t a + e l i n t a r v i k e t o i m i a + e l i n t a r v i k e t o i m i t u k s e t + e l i n t a r v i k e t o i m i t u k s i a + e l i n t a r v i k e t o i m i t u k s i l l e + e l i n t a r v i k e t o i m i t u s t e m m e + e l i n t a r v i k e t o i m i t u s t e n + e l i n t a r v i k e t s u n a m i + e l i n t a r v i k e t t a + e l i n t a r v i k e t u e n + e l i n t a r v i k e t u e s t a + e l i n t a r v i k e t u k e e n + e l i n t a r v i k e t u k i + e l i n t a r v i k e t u o j i s t a + e l i n t a r v i k e t u o n n i n + e l i n t a r v i k e t u o n n i s t a + e l i n t a r v i k e t u o n t i a + e l i n t a r v i k e t u o n t i i n + e l i n t a r v i k e t u o n t i m m e + e l i n t a r v i k e t u o t a n n o k s i + e l i n t a r v i k e t u o t a n n o l l a + e l i n t a r v i k e t u o t a n n o l l e + e l i n t a r v i k e t u o t a n n o n + e l i n t a r v i k e t u o t a n n o s s a + e l i n t a r v i k e t u o t a n n o s s a m m e + e l i n t a r v i k e t u o t a n n o s t a + e l i n t a r v i k e t u o t a n t o + e l i n t a r v i k e t u o t a n t o a + e l i n t a r v i k e t u o t a n t o a a n + e l i n t a r v i k e t u o t a n t o a l o j e n + e l i n t a r v i k e t u o t a n t o e l ä i m i l l e + e l i n t a r v i k e t u o t a n t o j ä r j e s t e l m i ä + e l i n t a r v i k e t u o t a n t o j ä r j e s t e l m ä + e l i n t a r v i k e t u o t a n t o j ä r j e s t e l m ä ä + e l i n t a r v i k e t u o t a n t o k a n t a a n s a + e l i n t a r v i k e t u o t a n t o k a p a s i t e e t i n + e l i n t a r v i k e t u o t a n t o k e t j u + e l i n t a r v i k e t u o t a n t o k e t j u n + e l i n t a r v i k e t u o t a n t o k e t j u s s a + e l i n t a r v i k e t u o t a n t o k y s y m y k s e s s ä + e l i n t a r v i k e t u o t a n t o l a j e i l l e + e l i n t a r v i k e t u o t a n t o m m e + e l i n t a r v i k e t u o t a n t o o m m e + e l i n t a r v i k e t u o t a n t o o n + e l i n t a r v i k e t u o t a n t o p o h j a l l e + e l i n t a r v i k e t u o t a n t o v a l m i u k s i a + e l i n t a r v i k e t u o t a n t o v a l m i u k s i e n + e l i n t a r v i k e t u o t a n t o v a l m i u k s i i n + e l i n t a r v i k e t u o t t a j a + e l i n t a r v i k e t u o t t a j a t + e l i n t a r v i k e t u o t t a j i a + e l i n t a r v i k e t u o t t a j i e n + e l i n t a r v i k e t u o t t a j i l l e + e l i n t a r v i k e t u o t t a j i l l e m m e + e l i n t a r v i k e t u o t t a j i s t a + e l i n t a r v i k e t u o t t e e t + e l i n t a r v i k e t u o t t e i d e n + e l i n t a r v i k e t u o t t e i l l a + e l i n t a r v i k e t u o t t e i s i i n + e l i n t a r v i k e t u o t t e i s s a + e l i n t a r v i k e t u o t t e i s t a + e l i n t a r v i k e t u o t t e i t a + e l i n t a r v i k e t u r v a + e l i n t a r v i k e t u r v a a + e l i n t a r v i k e t u r v a a m m e + e l i n t a r v i k e t u r v a a n + e l i n t a r v i k e t u r v a h a a s t e e s e e n + e l i n t a r v i k e t u r v a j ä r j e s t e l m ä t + e l i n t a r v i k e t u r v a k y s y m y k s e e n + e l i n t a r v i k e t u r v a k y s y m y k s e s s ä + e l i n t a r v i k e t u r v a k y s y m y s + e l i n t a r v i k e t u r v a l a a t i k o n + e l i n t a r v i k e t u r v a l l e + e l i n t a r v i k e t u r v a l l i s u u d e l l a + e l i n t a r v i k e t u r v a l l i s u u d e l l e + e l i n t a r v i k e t u r v a l l i s u u d e n + e l i n t a r v i k e t u r v a l l i s u u d e n k i n + e l i n t a r v i k e t u r v a l l i s u u d e s s a + e l i n t a r v i k e t u r v a l l i s u u d e s s a m m e + e l i n t a r v i k e t u r v a l l i s u u d e s t a + e l i n t a r v i k e t u r v a l l i s u u s + e l i n t a r v i k e t u r v a l l i s u u s a s i a n t u n t i j a n + e l i n t a r v i k e t u r v a l l i s u u s a s i o i h i n + e l i n t a r v i k e t u r v a l l i s u u s a s i o i s s a + e l i n t a r v i k e t u r v a l l i s u u s a s i o i s t a + e l i n t a r v i k e t u r v a l l i s u u s d i r e k t i i v i + e l i n t a r v i k e t u r v a l l i s u u s d i r e k t i i v i i n + e l i n t a r v i k e t u r v a l l i s u u s j ä r j e s t e l m i i n + e l i n t a r v i k e t u r v a l l i s u u s j ä r j e s t e l m ä m m e + e l i n t a r v i k e t u r v a l l i s u u s j ä r j e s t e l m ä ä n + e l i n t a r v i k e t u r v a l l i s u u s k e s k u k s e n + e l i n t a r v i k e t u r v a l l i s u u s k e t j u u n + e l i n t a r v i k e t u r v a l l i s u u s k r i i s e i s s ä + e l i n t a r v i k e t u r v a l l i s u u s k y s y m y k s e e n + e l i n t a r v i k e t u r v a l l i s u u s k y s y m y k s e t + e l i n t a r v i k e t u r v a l l i s u u s k y s y m y k s i s s ä + e l i n t a r v i k e t u r v a l l i s u u s k y s y m y k s i ä + e l i n t a r v i k e t u r v a l l i s u u s k ä y t ä n n ö i s s ä + e l i n t a r v i k e t u r v a l l i s u u s o h j e l m a + e l i n t a r v i k e t u r v a l l i s u u s o h j e l m a a n + e l i n t a r v i k e t u r v a l l i s u u s o h j e l m a t + e l i n t a r v i k e t u r v a l l i s u u s o h j e l m i a + e l i n t a r v i k e t u r v a l l i s u u s o n g e l m a a + e l i n t a r v i k e t u r v a l l i s u u s o n g e l m i a + e l i n t a r v i k e t u r v a l l i s u u s p a k e t i n + e l i n t a r v i k e t u r v a l l i s u u s p o l i t i i k a n + e l i n t a r v i k e t u r v a l l i s u u s p o l i t i i k a s s a + e l i n t a r v i k e t u r v a l l i s u u s p o l i t i i k a s t a + e l i n t a r v i k e t u r v a l l i s u u s p o l i t i i k k a + e l i n t a r v i k e t u r v a l l i s u u s p o l i t i i k k a a + e l i n t a r v i k e t u r v a l l i s u u s s k a n d a a l i + e l i n t a r v i k e t u r v a l l i s u u s v a a t i m u k s e t + e l i n t a r v i k e t u r v a l l i s u u s v a a t i m u k s i a + e l i n t a r v i k e t u r v a l l i s u u s v a a t i m u s t e n + e l i n t a r v i k e t u r v a l l i s u u s v a l v o n t a + e l i n t a r v i k e t u r v a l l i s u u s v i r a n o m a i n e n + e l i n t a r v i k e t u r v a l l i s u u s v i r a n o m a i s e l l a + e l i n t a r v i k e t u r v a l l i s u u s v i r a n o m a i s e l l e + e l i n t a r v i k e t u r v a l l i s u u s v i r a n o m a i s e l t a + e l i n t a r v i k e t u r v a l l i s u u s v i r a n o m a i s e n + e l i n t a r v i k e t u r v a l l i s u u s v i r a n o m a i s e s t a + e l i n t a r v i k e t u r v a l l i s u u s v i r a n o m a i s i i n + e l i n t a r v i k e t u r v a l l i s u u s v i r a n o m a i s t a + e l i n t a r v i k e t u r v a l l i s u u s v i r a s t o + e l i n t a r v i k e t u r v a l l i s u u s v i r a s t o a + e l i n t a r v i k e t u r v a l l i s u u s v i r a s t o j e n + e l i n t a r v i k e t u r v a l l i s u u s v i r a s t o l l a + e l i n t a r v i k e t u r v a l l i s u u s v i r a s t o l l e + e l i n t a r v i k e t u r v a l l i s u u s v i r a s t o n + e l i n t a r v i k e t u r v a l l i s u u s v i r a s t o o n + e l i n t a r v i k e t u r v a l l i s u u s v i r a s t o s t a + e l i n t a r v i k e t u r v a l l i s u u t e e n + e l i n t a r v i k e t u r v a l l i s u u t e m m e + e l i n t a r v i k e t u r v a l l i s u u t t a + e l i n t a r v i k e t u r v a m m e + e l i n t a r v i k e t u r v a n + e l i n t a r v i k e t u r v a n s a + e l i n t a r v i k e t u r v a o h j e l m a n + e l i n t a r v i k e t u r v a o h j e l m a s s a + e l i n t a r v i k e t u r v a o h j e l m a s t a + e l i n t a r v i k e t u r v a o n g e l m a + e l i n t a r v i k e t u r v a o n g e l m a n + e l i n t a r v i k e t u r v a p o l i t i i k a s t a + e l i n t a r v i k e t u r v a p o l i t i i k k a + e l i n t a r v i k e t u r v a r a h a s t o a + e l i n t a r v i k e t u r v a s s a + e l i n t a r v i k e t u r v a s t a + e l i n t a r v i k e t u r v a s t a m m e + e l i n t a r v i k e t u r v a s t r a t e g i a a + e l i n t a r v i k e t u r v a t t o m u u s + e l i n t a r v i k e t u r v a t t o m u u t e n s a + e l i n t a r v i k e t u r v a v i r a n o m a i s e t + e l i n t a r v i k e t u t k i j o i k s i + e l i n t a r v i k e t u t k i m u s + e l i n t a r v i k e t u t k i m u s l a i t o k s e n + e l i n t a r v i k e v a l i o k u n n a n + e l i n t a r v i k e v a l m i s t a j a t + e l i n t a r v i k e v a l m i s t a j i a + e l i n t a r v i k e v a l m i s t a j i e n + e l i n t a r v i k e v a l v o n n a n + e l i n t a r v i k e v a l v o n n a s t a + e l i n t a r v i k e v a l v o n t a + e l i n t a r v i k e v a l v o n t a a + e l i n t a r v i k e v a l v o n t a a n + e l i n t a r v i k e v a l v o n t a v i r a n o m a i s e n + e l i n t a r v i k e v a r a n n o t + e l i n t a r v i k e v a r a n t o j a + e l i n t a r v i k e v a r a s t o i h i n + e l i n t a r v i k e v a r a s t o i l l a + e l i n t a r v i k e v a r a s t o j a + e l i n t a r v i k e v a r a s t o j e n + e l i n t a r v i k e v a r a s t o j ä r j e s t e l m ä + e l i n t a r v i k e v a r a s t o j ä r j e s t e l m ä ä n + e l i n t a r v i k e v a r a s t o t + e l i n t a r v i k e v a r m u u d e n + e l i n t a r v i k e v a r m u u d e s t a + e l i n t a r v i k e v a r m u u s + e l i n t a r v i k e v a r m u u t e e n + e l i n t a r v i k e v a r m u u t t a + e l i n t a r v i k e v a r o j a + e l i n t a r v i k e v i e n t i + e l i n t a r v i k e v i l j e l y n + e l i n t a r v i k e v i r a n o m a i n e n + e l i n t a r v i k e v i r a n o m a i s e e n + e l i n t a r v i k e v i r a n o m a i s e l l a + e l i n t a r v i k e v i r a n o m a i s e l l e + e l i n t a r v i k e v i r a n o m a i s e n + e l i n t a r v i k e v i r a n o m a i s e s t a + e l i n t a r v i k e v i r a n o m a i s e t + e l i n t a r v i k e v i r a n o m a i s t a + e l i n t a r v i k e v i r a n o m a i s t e n + e l i n t a r v i k e v i r a s t o + e l i n t a r v i k e v i r a s t o a + e l i n t a r v i k e v i r a s t o j e n + e l i n t a r v i k e v i r a s t o l l a + e l i n t a r v i k e v i r a s t o l l e + e l i n t a r v i k e v i r a s t o l t a + e l i n t a r v i k e v i r a s t o n + e l i n t a r v i k e v i r a s t o p ä ä t ö s + e l i n t a r v i k e v i r a s t o s s a + e l i n t a r v i k e v i r a s t o s t a + e l i n t a r v i k e v ä i t t ä m i ä + e l i n t a r v i k e v ä l i n e + e l i n t a r v i k e v ä l i n e e n + e l i n t a r v i k e v ä l i n e e s e e n + e l i n t a r v i k e v ä l i n e t t ä + e l i n t a r v i k e v ä r e i s t ä + e l i n t a r v i k e v ä r i + e l i n t a r v i k e v ä ä r e n n ö k s e t + e l i n t a r v i k e v ä ä r e n n ö s t e n + e l i n t a r v i k e y h t i ö i d e n + e l i n t a r v i k e y h t i ö i l l e + e l i n t a r v i k e y h t i ö i l t ä + e l i n t a r v i k e y h t i ö i t ä + e l i n t a r v i k e y h t i ö n + e l i n t a r v i k e y h t i ö t + e l i n t a r v i k e y l i j ä ä m i e n + e l i n t a r v i k e y l i j ä ä m i ä + e l i n t a r v i k e y r i t y k s e n + e l i n t a r v i k e y r i t y k s e t + e l i n t a r v i k e y r i t y k s i l l e + e l i n t a r v i k e y r i t y k s i ä + e l i n t a r v i k e y r i t y s t e n + e l i n t a r v i k k e e k s i + e l i n t a r v i k k e e l l e + e l i n t a r v i k k e e n + e l i n t a r v i k k e e s e e n + e l i n t a r v i k k e e s s a + e l i n t a r v i k k e e s t a + e l i n t a r v i k k e e t + e l i n t a r v i k k e i d e m m e + e l i n t a r v i k k e i d e n + e l i n t a r v i k k e i d e n s a + e l i n t a r v i k k e i d e n t u o t t a j i i n + e l i n t a r v i k k e i k s i + e l i n t a r v i k k e i l l a + e l i n t a r v i k k e i l l e + e l i n t a r v i k k e i n a + e l i n t a r v i k k e i s i i m m e + e l i n t a r v i k k e i s i i n + e l i n t a r v i k k e i s s a + e l i n t a r v i k k e i s t a + e l i n t a r v i k k e i t a + e l i n t a r v i k k e i t a a n + e l i n t a s o + e l i n t a s o a + e l i n t a s o a a n + e l i n t a s o a m m e + e l i n t a s o e r o j a + e l i n t a s o e r o j e n + e l i n t a s o i h i n + e l i n t a s o i s s a + e l i n t a s o j a + e l i n t a s o j e n + e l i n t a s o k u i l u + e l i n t a s o k u i l u i s t a + e l i n t a s o k u i l u n + e l i n t a s o l l a + e l i n t a s o l l e + e l i n t a s o l l e e n + e l i n t a s o m m e + e l i n t a s o m u u t t a j i a + e l i n t a s o n + e l i n t a s o n s a + e l i n t a s o o m m e + e l i n t a s o o n + e l i n t a s o o n s a + e l i n t a s o p a k o l a i s t e n + e l i n t a s o s a i r a u s + e l i n t a s o s s a + e l i n t a s o s s a a n + e l i n t a s o s t a + e l i n t a s o t u r v a n + e l i n t a v a n + e l i n t a v a t + e l i n t a v o i l l a a n + e l i n t a v o i s s a m m e + e l i n t a v o i s t a + e l i n t e n + e l i n t e n l u o v u t t a j a m a i d e n + e l i n t e n l u o v u t t a j a m a i t a + e l i n t e n l u o v u t t a j i e n + e l i n t e n l u o v u t u k s i i n + e l i n t e n l u o v u t u s k o r t i n + e l i n t e n l u o v u t u s r e k i s t e r e i d e n + e l i n t e n l u o v u t u s t a p a u k s e s s a + e l i n t e n v a i h t o + e l i n t e n v a i h t o j ä r j e s t e l m ä + e l i n t i l a + e l i n t i l a a + e l i n t i l a m m e + e l i n t i l a n + e l i n t i l a s t a + e l i n t i l o j a + e l i n t ä + e l i n t ä r k e i d e n + e l i n t ä r k e i l l ä + e l i n t ä r k e i n ä + e l i n t ä r k e i s i i n + e l i n t ä r k e i s t ä + e l i n t ä r k e i t ä + e l i n t ä r k e ä + e l i n t ä r k e ä l l e + e l i n t ä r k e ä l l ä + e l i n t ä r k e ä n + e l i n t ä r k e ä n ä + e l i n t ä r k e ä s s ä + e l i n t ä r k e ä s t ä + e l i n t ä r k e ä t + e l i n t ä r k e ä ä + e l i n t ä r k e ä ä n + e l i n v o i m a a + e l i n v o i m a a n s a + e l i n v o i m a i s e m p i + e l i n v o i m a i s e m p i a + e l i n v o i m a i s e m p i i n + e l i n v o i m a i s e n + e l i n v o i m a i s e n a + e l i n v o i m a i s e t + e l i n v o i m a i s i a + e l i n v o i m a i s i m m a n + e l i n v o i m a i s i m p a n a + e l i n v o i m a l l a + e l i n v u o d e n + e l i n v u o s i e n + e l i n v u o s i n a a n + e l i n v u o t t a + e l i n y h t e i s ö i s s ä + e l i n y m p ä r i s t ö + e l i n y m p ä r i s t ö d i r e k t i i v i + e l i n y m p ä r i s t ö d i r e k t i i v i n + e l i n y m p ä r i s t ö d i r e k t i i v i s s ä + e l i n y m p ä r i s t ö d i r e k t i i v i s t ä + e l i n y m p ä r i s t ö d i r e k t i i v i ä + e l i n y m p ä r i s t ö i l l e + e l i n y m p ä r i s t ö i s s ä + e l i n y m p ä r i s t ö j e n + e l i n y m p ä r i s t ö j e n s ä + e l i n y m p ä r i s t ö j ä + e l i n y m p ä r i s t ö m m e + e l i n y m p ä r i s t ö n + e l i n y m p ä r i s t ö s s ä + e l i n y m p ä r i s t ö s s ä m m e + e l i n y m p ä r i s t ö s t ä + e l i n y m p ä r i s t ö s t ä m m e + e l i n y m p ä r i s t ö s t ä ä n + e l i n y m p ä r i s t ö ä + e l i n y m p ä r i s t ö ö m m e + e l i n y m p ä r i s t ö ö n + e l i n y m p ä r i s t ö ö n s ä + e l i ö i d e n + e l i ö i h i n + e l i ö i s t ä + e l i ö i t ä + e l i ö l a j i e n + e l i ö l a j i s t a + e l i ö s t ö l l e + e l i ö t + e l l i p s i r a t a + e l o h o p e a + e l o h o p e a a + e l o h o p e a h ö y r y l a m p p u + e l o h o p e a j ä t e + e l o h o p e a j ä t t e e l l e + e l o h o p e a j ä t t e e n + e l o h o p e a k a i v o s t e n + e l o h o p e a k a l o m e l i a + e l o h o p e a k e n n o j a + e l o h o p e a k e n n o j e n + e l o h o p e a k e n n o t e k n o l o g i a + e l o h o p e a k l o r i d i + e l o h o p e a k y t k i n + e l o h o p e a l ä h t e e n + e l o h o p e a l ä m p ö m i t t a r e i t a + e l o h o p e a l ä m p ö m i t t a r i + e l o h o p e a l ä m p ö m i t t a r i e n + e l o h o p e a m y r k y t y s + e l o h o p e a m ä ä r i e n + e l o h o p e a m ä ä r ä t + e l o h o p e a m ä ä r ä ä + e l o h o p e a n + e l o h o p e a n i t r a a t t i + e l o h o p e a o k s i d i + e l o h o p e a o k s i d i n + e l o h o p e a p a i k k a a + e l o h o p e a p i t o i s u u k s i a + e l o h o p e a p i t o i s u u s + e l o h o p e a p i t o i s u u t e n i + e l o h o p e a p ä ä s t ö j e n + e l o h o p e a p ä ä s t ö j ä ä n + e l o h o p e a s f y g m o m a n o m e t r e i l l e + e l o h o p e a s t a + e l o h o p e a s t r a t e g i a a + e l o h o p e a s t r a t e g i a n + e l o h o p e a s t r a t e g i a s t a + e l o h o p e a s u l f a a t t i + e l o h o p e a s u l f i d i + e l o h o p e a s y a n i d i + e l o h o p e a t a s a s u u n t a a j a + e l o h o p e a t i o s y a n a a t t i + e l o h o p e a t i p p a a + e l o h o p e a t u o t t e i d e n + e l o h o p e a v i r t o j a + e l o h o p e a y h d i s t e e t + e l o h o p e a y h d i s t e i d e n + e l o h o p e a y h d i s t e i l l e + e l o h o p e a y h d i s t e i t ä + e l o h o p e a y h d i s t e t t ä + e l o i s a m p i + e l o i s i a + e l o i s i n a + e l o k o r e n t o + e l o k u u + e l o k u u h u n + e l o k u u l t a + e l o k u u n + e l o k u u n a s t e r i + e l o k u u s s a + e l o k u u s t a + e l o k u u t a + e l o k u v a + e l o k u v a a n + e l o k u v a d i r e k t i i v i n + e l o k u v a e s i t y s + e l o k u v a f e s t i v a a l i + e l o k u v a h a n k k e i t a + e l o k u v a j u h l a + e l o k u v a j u h l a t + e l o k u v a j u h l i e n + e l o k u v a j u h l i i n + e l o k u v a j u h l i l l a + e l o k u v a j u h l i s t a + e l o k u v a j u l i s t e + e l o k u v a k a m e r a + e l o k u v a k a n a v a a + e l o k u v a k a n a v a n + e l o k u v a k a n k a i l l e m m e + e l o k u v a k a t k e l m i e n + e l o k u v a k e r h o + e l o k u v a k i l p a i l u a + e l o k u v a k i r j a s t o + e l o k u v a k o m i s s i o + e l o k u v a k r i i t i k k o + e l o k u v a k r i t i i k k i + e l o k u v a l l a + e l o k u v a m a a i l m a n + e l o k u v a m a a i l m a s t a + e l o k u v a m a i n o n n a n + e l o k u v a m a r k k i n o i d e n + e l o k u v a m a r k k i n o i l l a + e l o k u v a m a r k k i n o i s t a + e l o k u v a m u s i i k k i + e l o k u v a m u s i k a a l i + e l o k u v a n + e l o k u v a n e r o + e l o k u v a n t e k i j ä + e l o k u v a n t e k i j ä n + e l o k u v a n t e k i j ä t + e l o k u v a n t e k i j ö i d e m m e + e l o k u v a n t e k i j ö i d e n + e l o k u v a n t e k i j ö i h i n + e l o k u v a n t e k i j ö i l l e + e l o k u v a n t e k i j ö i s t ä m m e + e l o k u v a n t e k i j ö i t ä + e l o k u v a n t e k o v ä l i n e i t ä + e l o k u v a n t u o t a n n o n + e l o k u v a n ä y t t e l i j ä t + e l o k u v a o h j a a j a + e l o k u v a o h j a a j i s t a + e l o k u v a o h j e l m a n + e l o k u v a p a l k i n n o s t a + e l o k u v a p a l k i n t o + e l o k u v a p a l k i n t o a + e l o k u v a p a l k i n t o j e n + e l o k u v a p e r i n n ö n + e l o k u v a p e r i n n ö s t ä + e l o k u v a p e r i n n ö s t ä m m e + e l o k u v a p e r i n t ö + e l o k u v a p e r i n t ö m m e + e l o k u v a p e r i n t ö s ä ä t i ö n + e l o k u v a p e r i n t ö ä + e l o k u v a p e r i n t ö ä m m e + e l o k u v a p e r i n t ö ä ä n + e l o k u v a p o l i t i i k k a + e l o k u v a s a n k a r e i t a + e l o k u v a s a r j a s s a + e l o k u v a s i t a a t t i a + e l o k u v a s p e k t a a k k e l i n + e l o k u v a s t a + e l o k u v a s t u d i o + e l o k u v a s u u r u u d e t + e l o k u v a s ä v e l m ä ä + e l o k u v a s ä ä t i ö + e l o k u v a s ä ä t i ö i d e n + e l o k u v a t + e l o k u v a t e a t t e r e i s s a + e l o k u v a t e a t t e r i + e l o k u v a t e a t t e r i i n + e l o k u v a t e o k s i a + e l o k u v a t e o l l i s u u d e l l a + e l o k u v a t e o l l i s u u d e l l e + e l o k u v a t e o l l i s u u d e n + e l o k u v a t e o l l i s u u d e s s a + e l o k u v a t e o l l i s u u s + e l o k u v a t e o l l i s u u t e e m m e + e l o k u v a t e o l l i s u u t e e n + e l o k u v a t e o l l i s u u t e m m e + e l o k u v a t e o l l i s u u t t a + e l o k u v a t e o l l i s u u t t a a n + e l o k u v a t e o l l i s u u t t a m m e + e l o k u v a t e o r i a + e l o k u v a t u e n + e l o k u v a t u o t a n n o l l e + e l o k u v a t u o t a n n o n + e l o k u v a t u o t a n n o t + e l o k u v a t u o t a n t o + e l o k u v a t u o t a n t o a + e l o k u v a t u o t a n t o o n + e l o k u v a t u o t t a j a + e l o k u v a t u o t t a j a n a + e l o k u v a t u o t t a j i e n + e l o k u v a t u o t t e i d e n + e l o k u v a v e r s i o + e l o k u v a v e r s i o s s a + e l o k u v a y h t i ö + e l o k u v i a + e l o k u v i e n + e l o k u v i i n + e l o k u v i l l a + e l o k u v i s s a + e l o k u v i s t a + e l o l a s e r + e l o l l i s t e n + e l o n k o r j u u j u h l a + e l o n m e r k i t + e l o n m e r k k e j ä + e l o o n j ä ä m i s a s t e + e l o o n j ä ä m i s a s t e i s s a + e l o o n j ä ä m i s a s t e t t a + e l o o n j ä ä m i s e s t ä + e l o o n j ä ä m i s k o u l u t u s + e l o o n j ä ä m i s k y s y m y k s e n ä + e l o o n j ä ä m i s k y s y m y k s e s s ä + e l o o n j ä ä m i s l u v u t + e l o o n j ä ä m i s m a h d o l l i s u u d e t + e l o o n j ä ä m i s m a h d o l l i s u u k s i a + e l o o n j ä ä m i s m a h d o l l i s u u k s i s s a + e l o o n j ä ä m i s m a h d o l l i s u u s + e l o o n j ä ä m i s o p p i + e l o o n j ä ä m i s p e l i s s ä + e l o o n j ä ä m i s s t r a t e g i a a n s a + e l o o n j ä ä m i s s t r a t e g i a s t a + e l o o n j ä ä m i s t a i s t e l u s s a + e l o o n j ä ä n t i k y s y m y s + e l o p a i n o n + e l o p a i n o s t a + e l o p e r ä i s i ä + e l o s a l a m a + e l o s s a p i t o j ä r j e s t e l m ä + e l p y m i s a s t e + e l p y m i s e e n + e l p y m i s e k s i + e l p y m i s e l l e + e l p y m i s e l l ä + e l p y m i s e n + e l p y m i s e s s ä + e l p y m i s e s t ä + e l p y m i s m a h d o l l i s u u d e t + e l p y m i s n ä k y m i ä + e l p y m i s p r o s e s s i + e l p y m i s p r o s e s s i a + e l p y m i s p r o s e s s i i n + e l p y m i s p r o s e s s i n + e l p y m i s p r o s e s s i s t a + e l p y m i s s t r a t e g i o i d e n + e l p y m i s s u u n n i t e l m a + e l p y m i s s u u n n i t e l m a a + e l p y m i s s u u n n i t e l m a n + e l p y m i s s u u n n i t e l m a s t a + e l p y m i s t a h t i + e l p y m i s t a h t o + e l p y m i s t a s o l l e + e l p y m i s t a v o i t e t t a + e l p y m i s t ä + e l p y m i s v a i h e e s t a + e l p y m i s v a i h e t t a + e l p y m ä s t ä + e l p y m ä ä n + e l p y y + e l p y ä + e l p y ä k s e e n + e l s a s s i l a i s e n a + e l v y t e t t y j ä + e l v y t e t t ä e s s ä + e l v y t t ä m i s e e n + e l v y t t ä m i s e k s i + e l v y t t ä m i s e n + e l v y t t ä m i s o h j e l m a + e l v y t t ä m i s o h j e l m a a + e l v y t t ä m i s o h j e l m a l l e + e l v y t t ä m i s o h j e l m a m m e + e l v y t t ä m i s o h j e l m i a + e l v y t t ä m i s o h j e l m i s s a + e l v y t t ä m i s p o l i t i i k k a a n + e l v y t t ä m i s s o p i m u s + e l v y t t ä m i s s t r a t e g i a + e l v y t t ä m i s s u u n n i t e l m a + e l v y t t ä m i s s u u n n i t e l m a a + e l v y t t ä m i s s u u n n i t e l m a a n + e l v y t t ä m i s s u u n n i t e l m a n + e l v y t t ä m i s s u u n n i t e l m a n s a + e l v y t t ä m i s s u u n n i t e l m a s t a + e l v y t t ä m i s s u u n n i t e l m i a + e l v y t t ä m i s s u u n n i t e l m i e n + e l v y t t ä m i s s u u n n i t e l m i i n + e l v y t t ä m i s s u u n n i t e l m i l l e + e l v y t t ä m i s s u u n n i t e l m i s s a + e l v y t t ä m i s s u u n n i t e l m i s t a + e l v y t t ä m i s t o i m e n p i t e i l l e + e l v y t t ä m i s t o i m e n p i t e i t ä + e l v y t t ä m i s t o i m e t + e l v y t t ä m i s t o i m i a + e l v y t t ä m i s t o i m i s t a + e l v y t t ä m i s t ä + e l v y t t ä m i s v a i h e e s t a + e l v y t t ä m ä l l ä + e l v y t t ä m ä ä n + e l v y t t ä v i ä + e l v y t t ä ä + e l v y t t ä ä k s e e n + e l v y t t ä ä k s e m m e + e l v y t y k s e e n + e l v y t y k s e n + e l v y t y k s e s s ä + e l v y t y s a l u e i t a + e l v y t y s b u d j e t i n + e l v y t y s e h d o t u s t a + e l v y t y s h a n k k e i d e n + e l v y t y s h a n o j a + e l v y t y s k e i n o + e l v y t y s k o m i s s i o l l e + e l v y t y s o h j e l m a + e l v y t y s o h j e l m a a + e l v y t y s o h j e l m a a n + e l v y t y s o h j e l m a l l a + e l v y t y s o h j e l m a n + e l v y t y s o h j e l m a s s a m m e + e l v y t y s o h j e l m a s t a + e l v y t y s o h j e l m a s t a m m e + e l v y t y s o h j e l m a t + e l v y t y s o h j e l m i a + e l v y t y s o h j e l m i i n + e l v y t y s o h j e l m i s t a + e l v y t y s p a k e t e i l l a + e l v y t y s p a k e t e i l l e + e l v y t y s p a k e t e i s t a + e l v y t y s p a k e t i l l a + e l v y t y s p a k e t i n + e l v y t y s p a k e t i s s a + e l v y t y s p a k e t i s t a + e l v y t y s p a k e t i t + e l v y t y s p a k e t t e i h i n + e l v y t y s p a k e t t e i h i n s a + e l v y t y s p a k e t t e j a + e l v y t y s p a k e t t i + e l v y t y s p a k e t t i a + e l v y t y s p a k e t t i e n + e l v y t y s p a k e t t i i n + e l v y t y s p o l i t i i k a s t a + e l v y t y s p o l i t i i k k a a + e l v y t y s p o l i t i i k k a a n + e l v y t y s p o n n i s t e l u i h i n + e l v y t y s p o t e n t i a a l i + e l v y t y s p r o s e s s i a + e l v y t y s p r o s e s s i s s a + e l v y t y s p u i t t e i s s a + e l v y t y s r a h a a n + e l v y t y s s t r a t e g i a + e l v y t y s s t r a t e g i a a + e l v y t y s s t r a t e g i a m m e + e l v y t y s s t r a t e g i a n + e l v y t y s s t r a t e g i o i t a + e l v y t y s s u u n n i t e l m a + e l v y t y s s u u n n i t e l m a a + e l v y t y s s u u n n i t e l m a a m m e + e l v y t y s s u u n n i t e l m a a n + e l v y t y s s u u n n i t e l m a e h d o t u s t a + e l v y t y s s u u n n i t e l m a k s i + e l v y t y s s u u n n i t e l m a l l a + e l v y t y s s u u n n i t e l m a l l e + e l v y t y s s u u n n i t e l m a m m e + e l v y t y s s u u n n i t e l m a n + e l v y t y s s u u n n i t e l m a n s a + e l v y t y s s u u n n i t e l m a s o p i m u k s e n + e l v y t y s s u u n n i t e l m a s s a + e l v y t y s s u u n n i t e l m a s s a a n + e l v y t y s s u u n n i t e l m a s s a h a n + e l v y t y s s u u n n i t e l m a s s a m m e + e l v y t y s s u u n n i t e l m a s t a + e l v y t y s s u u n n i t e l m a t + e l v y t y s s u u n n i t e l m i a + e l v y t y s s u u n n i t e l m i a a n + e l v y t y s s u u n n i t e l m i e n + e l v y t y s s u u n n i t e l m i i n + e l v y t y s s u u n n i t e l m i l l a + e l v y t y s s u u n n i t e l m i s s a + e l v y t y s s u u n n i t e l m i s t a + e l v y t y s t a v o i t e + e l v y t y s t a v o i t t e e t + e l v y t y s t o i m e a + e l v y t y s t o i m e n p i t e e n + e l v y t y s t o i m e n p i t e e t + e l v y t y s t o i m e n p i t e i d e n + e l v y t y s t o i m e n p i t e i s i i n + e l v y t y s t o i m e n p i t e i s t ä + e l v y t y s t o i m e n p i t e i t ä + e l v y t y s t o i m e t + e l v y t y s t o i m i a + e l v y t y s t o i m i a m m e + e l v y t y s t o i m i e n + e l v y t y s t o i m i i n + e l v y t y s t o i m i l l a + e l v y t y s t o i m i s t a + e l v y t y s t y ö r y h m ä + e l v y t y s t ä + e l v y t y s v a r o i l l a + e l v y t y s v ä l i n e i s t ä + e l ä e s s ä ä n + e l ä i m e e n + e l ä i m e l l e + e l ä i m e n + e l ä i m e s t ä + e l ä i m e t + e l ä i m i i n + e l ä i m i i n k i n + e l ä i m i l l e + e l ä i m i l l ä + e l ä i m i s s ä + e l ä i m i s t ä + e l ä i m i s t ä ä n + e l ä i m i ä + e l ä i n a i n e e t + e l ä i n a k t i v i s m i + e l ä i n a k t i v i s t i r y h m ä t + e l ä i n a l l e r g i a + e l ä i n a n s o j e n + e l ä i n a n t i b i o o t t i e n + e l ä i n a s i a n t u n t i j a + e l ä i n a v u s t e i n e n + e l ä i n b a k t e e r i t + e l ä i n b i o t e k n i i k a n + e l ä i n e r i e n + e l ä i n e t i i k a n + e l ä i n h o r m o n e j a + e l ä i n j a l o s t u s t y ö + e l ä i n j a u h o + e l ä i n j a u h o a + e l ä i n j a u h o i h i n + e l ä i n j a u h o i l l a + e l ä i n j a u h o j a + e l ä i n j a u h o j e n + e l ä i n j a u h o k i e l l o n + e l ä i n j a u h o l l a + e l ä i n j a u h o m ä ä r i e n + e l ä i n j a u h o n + e l ä i n j a u h o p e r ä i s e t + e l ä i n j a u h o r u o k i n n a s t a + e l ä i n j a u h o s k a n d a a l i n + e l ä i n j a u h o s s a + e l ä i n j a u h o t + e l ä i n j a u h o t u o t a n t o a + e l ä i n j ä t e l a i t o k s e s s a + e l ä i n j ä t e t t ä + e l ä i n j ä t t e e n + e l ä i n j ä t t e e t + e l ä i n j ä t t e i d e n + e l ä i n j ä t t e i s t ä + e l ä i n k a n n i b a l i s m i a + e l ä i n k a n t a a + e l ä i n k a s v a t u k s e n + e l ä i n k a u p a n + e l ä i n k a u p a t + e l ä i n k a u p p a a + e l ä i n k a u p p a a n + e l ä i n k a u p p i a i s t a + e l ä i n k l o o n a u k s e n + e l ä i n k l o o n a u s t a + e l ä i n k o e + e l ä i n k o e d i r e k t i i v i n + e l ä i n k o e k i e l l o k s i + e l ä i n k o e k i e l l o l l a + e l ä i n k o e k i e l l o n + e l ä i n k o e k i e l t o + e l ä i n k o e k i e l t o a + e l ä i n k o e t t a + e l ä i n k o e v a p a a t a + e l ä i n k o h t a i n e n + e l ä i n k o h t a i s e n + e l ä i n k o h t a i s e s t a + e l ä i n k o h t a i s i a + e l ä i n k o k e e s s a + e l ä i n k o k e e t + e l ä i n k o k e e t k a a n + e l ä i n k o k e i d e n + e l ä i n k o k e i l l a + e l ä i n k o k e i l l e + e l ä i n k o k e i s i i n + e l ä i n k o k e i s s a + e l ä i n k o k e i s t a + e l ä i n k o k e i s t a m m e + e l ä i n k o k e i t a + e l ä i n k u l j e t u k s e t + e l ä i n k u l j e t u k s i a + e l ä i n k u l j e t u k s i i n + e l ä i n k u l j e t u k s i l l e + e l ä i n k u l j e t u k s i s s a + e l ä i n k u l j e t u k s i s t a + e l ä i n k u l j e t u s + e l ä i n k u l j e t u s d i r e k t i i v i s t ä + e l ä i n k u l j e t u s k a l u s t o j e n + e l ä i n k u l j e t u s l a i n s ä ä d ä n t ö ä + e l ä i n k u l j e t u s m a t k o i s s a + e l ä i n k u l j e t u s t a r k a s t a j a n + e l ä i n k u l j e t u s t a r k a s t u k s i a + e l ä i n k u l j e t u s t e i t ä + e l ä i n k u l j e t u s t e n + e l ä i n k u l k u t a u d e i s t a + e l ä i n k u l k u t a u d i n + e l ä i n k u l k u t a u t e j a + e l ä i n k u l k u t a u t i + e l ä i n k u l k u t a u t i e n + e l ä i n k u l k u t a u t i r a h a s t o n + e l ä i n k u n n a l l e + e l ä i n k u n n a n + e l ä i n k u n t a + e l ä i n l a j e i h i n + e l ä i n l a j e i l l e + e l ä i n l a j e i s t a + e l ä i n l a j e j a + e l ä i n l a j i a + e l ä i n l a j i e n + e l ä i n l a j i k k e e t + e l ä i n l a j i k o h t a i s e e n + e l ä i n l a j i n + e l ä i n l a j i s t a + e l ä i n l a j i t + e l ä i n l u o k i l l e + e l ä i n l u o k k i e n + e l ä i n l ä ä k e a l a l l a + e l ä i n l ä ä k e d i r e k t i i v i ä + e l ä i n l ä ä k e j ä ä m i e n + e l ä i n l ä ä k e j ä ä m ä t + e l ä i n l ä ä k e m ä ä r ä y k s e n + e l ä i n l ä ä k e t i e d e + e l ä i n l ä ä k e t i e d e t t ä + e l ä i n l ä ä k e t i e t e e l l i s e e n + e l ä i n l ä ä k e t i e t e e n + e l ä i n l ä ä k e t i e t e e s s ä + e l ä i n l ä ä k e t u o t t e i d e n + e l ä i n l ä ä k e v a l i k o i m a n + e l ä i n l ä ä k i n n ä l l i n e n + e l ä i n l ä ä k i n n ä l l i s i s t ä + e l ä i n l ä ä k i n n ä n + e l ä i n l ä ä k i n n ä s t ä + e l ä i n l ä ä k i n t ä a l a a + e l ä i n l ä ä k i n t ä a l a l l a + e l ä i n l ä ä k i n t ä a l a n + e l ä i n l ä ä k i n t ä a s i a n t u n t i j o i d e n + e l ä i n l ä ä k i n t ä a s i a n t u n t i j o i t a + e l ä i n l ä ä k i n t ä a s i o i h i n + e l ä i n l ä ä k i n t ä d i r e k t i i v i n + e l ä i n l ä ä k i n t ä j ä r j e s t e l m i e n s ä + e l ä i n l ä ä k i n t ä k o m i t e a + e l ä i n l ä ä k i n t ä k o m i t e a a + e l ä i n l ä ä k i n t ä k o m i t e a a n + e l ä i n l ä ä k i n t ä k o m i t e a l l e + e l ä i n l ä ä k i n t ä k o m i t e a n + e l ä i n l ä ä k i n t ä k o m i t e a n n e + e l ä i n l ä ä k i n t ä k o m i t e a s s a + e l ä i n l ä ä k i n t ä k u l u i s t a + e l ä i n l ä ä k i n t ä k u s t a n n u k s e t + e l ä i n l ä ä k i n t ä k y s y m y k s e t + e l ä i n l ä ä k i n t ä l a i n + e l ä i n l ä ä k i n t ä l a i n s ä ä d ä n n ö n + e l ä i n l ä ä k i n t ä l a i n s ä ä d ä n t ö ä + e l ä i n l ä ä k i n t ä m a r k k i n o i l t a + e l ä i n l ä ä k i n t ä m ä ä r ä y k s i s s ä + e l ä i n l ä ä k i n t ä n o r m e j a + e l ä i n l ä ä k i n t ä n o r m i t + e l ä i n l ä ä k i n t ä o r g a n i s a a t i o + e l ä i n l ä ä k i n t ä p a l v e l u i h i n + e l ä i n l ä ä k i n t ä p a l v e l u i s s a + e l ä i n l ä ä k i n t ä p a l v e l u j e n + e l ä i n l ä ä k i n t ä p a l v e l u t + e l ä i n l ä ä k i n t ä p o l i t i i k a s s a + e l ä i n l ä ä k i n t ä p o l i t i i k k a a + e l ä i n l ä ä k i n t ä p o l i t i i k k a a n + e l ä i n l ä ä k i n t ä r a h a s t o a + e l ä i n l ä ä k i n t ä r a h a s t o n + e l ä i n l ä ä k i n t ä s o p i m u k s e n + e l ä i n l ä ä k i n t ä s o p i m u s t a + e l ä i n l ä ä k i n t ä s u o j a a + e l ä i n l ä ä k i n t ä s ä ä n n ö k s i ä + e l ä i n l ä ä k i n t ä s ä ä n n ö t + e l ä i n l ä ä k i n t ä t a r k a s t a j a a + e l ä i n l ä ä k i n t ä t a r k a s t a j a s t a + e l ä i n l ä ä k i n t ä t a r k a s t a j i e n + e l ä i n l ä ä k i n t ä t a r k a s t u k s i a + e l ä i n l ä ä k i n t ä t i l a n n e + e l ä i n l ä ä k i n t ä t o i m e n p i t e i d e n + e l ä i n l ä ä k i n t ä t o i m e n p i t e i t ä + e l ä i n l ä ä k i n t ä t o i m i e m m e + e l ä i n l ä ä k i n t ä t o i m i e n + e l ä i n l ä ä k i n t ä t o i m i s t o + e l ä i n l ä ä k i n t ä t o i m i s t o l l a + e l ä i n l ä ä k i n t ä t o i m i s t o l l e + e l ä i n l ä ä k i n t ä t o i m i s t o l t a + e l ä i n l ä ä k i n t ä t o i m i s t o n + e l ä i n l ä ä k i n t ä t o i m i s t o o n + e l ä i n l ä ä k i n t ä t u o t t e i d e n + e l ä i n l ä ä k i n t ä t u o t t e i l l a + e l ä i n l ä ä k i n t ä t u o t t e i t a + e l ä i n l ä ä k i n t ä v a a t i m u s t e n + e l ä i n l ä ä k i n t ä v i i k o n + e l ä i n l ä ä k i n t ä v i r a n o m a i n e n + e l ä i n l ä ä k i n t ä v i r a n o m a i s e t + e l ä i n l ä ä k i n t ä v i r a n o m a i s i i n + e l ä i n l ä ä k i n t ä v i r a n o m a i s i l l a + e l ä i n l ä ä k i n t ä v i r a n o m a i s i l l e + e l ä i n l ä ä k i n t ä v i r a n o m a i s t e m m e + e l ä i n l ä ä k i n t ä v i r a n o m a i s t e n + e l ä i n l ä ä k i n t ä v i r a s t o + e l ä i n l ä ä k i n t ä v i r a s t o a + e l ä i n l ä ä k i n t ä v i r a s t o j e n + e l ä i n l ä ä k i n t ä v i r a s t o l l a + e l ä i n l ä ä k i n t ä v i r a s t o n + e l ä i n l ä ä k i n t ä v i r a s t o o n + e l ä i n l ä ä k i n t ä v i r k a m i e s t e n + e l ä i n l ä ä k i n t ä y k s i k k ö + e l ä i n l ä ä k i n t ä y k s i k k ö j e m m e + e l ä i n l ä ä k i n t ä y k s i k k ö n s ä + e l ä i n l ä ä k k e e n + e l ä i n l ä ä k k e e t + e l ä i n l ä ä k k e i d e n + e l ä i n l ä ä k k e i l l ä + e l ä i n l ä ä k k e i s i i n + e l ä i n l ä ä k k e i s s ä + e l ä i n l ä ä k k e i s t ä + e l ä i n l ä ä k k e i t ä + e l ä i n l ä ä k ä r e i d e n + e l ä i n l ä ä k ä r e i h i n + e l ä i n l ä ä k ä r e i l l ä + e l ä i n l ä ä k ä r e i t ä + e l ä i n l ä ä k ä r i + e l ä i n l ä ä k ä r i e n + e l ä i n l ä ä k ä r i i n + e l ä i n l ä ä k ä r i k e s k u s t e n + e l ä i n l ä ä k ä r i k o m i t e a n + e l ä i n l ä ä k ä r i k o n t r o l l i t + e l ä i n l ä ä k ä r i n + e l ä i n l ä ä k ä r i n h o i t o a + e l ä i n l ä ä k ä r i n t a r k a s t u k s i a + e l ä i n l ä ä k ä r i n t a r k a s t u k s i i n + e l ä i n l ä ä k ä r i n t a r k a s t u s + e l ä i n l ä ä k ä r i n t a r k a s t u s t e n + e l ä i n l ä ä k ä r i n t o d i s t u k s i a + e l ä i n l ä ä k ä r i n t o d i s t u s t e n + e l ä i n l ä ä k ä r i n ä + e l ä i n l ä ä k ä r i p a l v e l u j e n + e l ä i n l ä ä k ä r i t + e l ä i n l ä ä k ä r i t a r k a s t u k s i a + e l ä i n l ä ä k ä r i t a r k a s t u k s i s t a + e l ä i n l ä ä k ä r i t a r k a s t u s a s e m a l l a + e l ä i n l ä ä k ä r i t a r k a s t u s t e n + e l ä i n l ä ä k ä r i v a l v o n t a + e l ä i n l ä ä k ä r i ä + e l ä i n m a a i l m a + e l ä i n m a l l i n n u k s i n a + e l ä i n m ä ä r i ä + e l ä i n o i k e u d e l l i s e t + e l ä i n o i k e u s a k t i v i s t e i l t a + e l ä i n o i k e u s a k t i v i s t i t + e l ä i n o i k e u s j ä r j e s t ö + e l ä i n o p p i + e l ä i n p a l k k i o i d e n + e l ä i n p a l k k i o i s t a + e l ä i n p a l k k i o t + e l ä i n p a r a n + e l ä i n p a r k o j e n + e l ä i n p a s s e i h i n + e l ä i n p a s s i + e l ä i n p a s s i a + e l ä i n p a s s i i n + e l ä i n p a s s i j ä r j e s t e l m ä + e l ä i n p a s s i j ä r j e s t e l m ä ä + e l ä i n p a s s i s t a + e l ä i n p a s s i t + e l ä i n p e r ä i s e e n + e l ä i n p e r ä i s e n + e l ä i n p e r ä i s e t + e l ä i n p e r ä i s i i n + e l ä i n p e r ä i s i l l e + e l ä i n p e r ä i s i s s ä + e l ä i n p e r ä i s i s t ä + e l ä i n p e r ä i s i ä + e l ä i n p e r ä i s t e n + e l ä i n p e r ä i s t ä + e l ä i n p e r ä i s y y s + e l ä i n p o l i t i i k k a + e l ä i n p o p u l a a t i o i t a + e l ä i n p o p u l a a t i o s e l v i t y k s i ä + e l ä i n p r o t e i i n e j a + e l ä i n p r o t e i i n i a + e l ä i n p r o t e i i n i e n + e l ä i n p r o t e i i n i l l a + e l ä i n p r o t e i i n i n + e l ä i n p r o t e i i n i p i t o i s u u s + e l ä i n p r o t e i i n i s t a + e l ä i n p r o t e i i n i t + e l ä i n p u i s t o t + e l ä i n r a k k a u d e n + e l ä i n r a k k a u t e n s a + e l ä i n r a s v a + e l ä i n r a s v a a + e l ä i n r a s v a n + e l ä i n r a s v a s t a + e l ä i n r a s v a t + e l ä i n r a s v o i l l a + e l ä i n r a s v o j a + e l ä i n r a s v o j e n + e l ä i n r a t a v a l o + e l ä i n r a v i n n o k s i + e l ä i n r a v i n n o n + e l ä i n r a v i n t o + e l ä i n r e h u + e l ä i n r e h u a + e l ä i n r e h u a l a l l a + e l ä i n r e h u a l a n + e l ä i n r e h u i h i n + e l ä i n r e h u i l l a + e l ä i n r e h u i s s a + e l ä i n r e h u i s t a + e l ä i n r e h u j a + e l ä i n r e h u j e n + e l ä i n r e h u k e t j u + e l ä i n r e h u k s i + e l ä i n r e h u l a i n s ä ä d ä n t ö ä + e l ä i n r e h u m a r k k i n o i l l e + e l ä i n r e h u n + e l ä i n r e h u n a + e l ä i n r e h u s k a n d a a l i s t a + e l ä i n r e h u s s a + e l ä i n r e h u t + e l ä i n r e h u t e o l l i s u u t t a + e l ä i n r e h u t u o t t a j i e n + e l ä i n r e h u t u o t t a j i i n + e l ä i n r e h u u n + e l ä i n r e k i s t e r i + e l ä i n r o d u n + e l ä i n r o d u t + e l ä i n r o t u j a + e l ä i n r o t u j e n + e l ä i n r u h o i l l e + e l ä i n r u h o j e n + e l ä i n r u o k i n n a s s a + e l ä i n r u o k i n t a a n + e l ä i n r u u m i i d e n + e l ä i n r ä ä k k ä y k s e n + e l ä i n r ä ä k k ä y k s e s t ä + e l ä i n r ä ä k k ä y s + e l ä i n r ä ä k k ä y s t ä + e l ä i n s a i r a u d e t + e l ä i n s a i r a u k s i a + e l ä i n s a i r a u k s i e n + e l ä i n s a i r a u k s i i n + e l ä i n s a i r a u k s i s s a + e l ä i n s a i r a u k s i s t a + e l ä i n s a i r a u s + e l ä i n s o l u j a + e l ä i n s u o j e l i j a + e l ä i n s u o j e l i j a t + e l ä i n s u o j e l i j o i l l a + e l ä i n s u o j e l u + e l ä i n s u o j e l u a + e l ä i n s u o j e l u a s i o i h i n + e l ä i n s u o j e l u i n d i k a a t t o r i e n + e l ä i n s u o j e l u j ä r j e s t ö + e l ä i n s u o j e l u j ä r j e s t ö i s s ä + e l ä i n s u o j e l u j ä r j e s t ö i s t ä + e l ä i n s u o j e l u j ä r j e s t ö j e n + e l ä i n s u o j e l u j ä r j e s t ö j ä + e l ä i n s u o j e l u j ä r j e s t ö n + e l ä i n s u o j e l u j ä r j e s t ö t + e l ä i n s u o j e l u j ä r j e s t ö ö n + e l ä i n s u o j e l u k y s y m y k s i s s ä + e l ä i n s u o j e l u k y s y m y k s i s t ä + e l ä i n s u o j e l u k y s y m y k s i ä + e l ä i n s u o j e l u k y s y m y s t ä + e l ä i n s u o j e l u l a i n s ä ä d ä n n ö n + e l ä i n s u o j e l u l a i n s ä ä d ä n n ö s t ä + e l ä i n s u o j e l u l a i s t a + e l ä i n s u o j e l u l a k i + e l ä i n s u o j e l u l a k i e n + e l ä i n s u o j e l u m e r k i n n ä l l ä + e l ä i n s u o j e l u m e r k i n t ä ä + e l ä i n s u o j e l u m e r k i n t ö j e n + e l ä i n s u o j e l u m ä ä r ä y k s e t + e l ä i n s u o j e l u m ä ä r ä y k s i ä + e l ä i n s u o j e l u m ä ä r ä y s t e n + e l ä i n s u o j e l u n + e l ä i n s u o j e l u n o r m e j a + e l ä i n s u o j e l u n o r m i e n + e l ä i n s u o j e l u n ä k ö k o h d i s t a + e l ä i n s u o j e l u n ä k ö k o h t i a + e l ä i n s u o j e l u n ä k ö k u l m a t + e l ä i n s u o j e l u o l o j a + e l ä i n s u o j e l u p o l i t i i k k a + e l ä i n s u o j e l u p ö y t ä k i r j a a + e l ä i n s u o j e l u r y h m i e n + e l ä i n s u o j e l u r y h m ä ä n + e l ä i n s u o j e l u s s a + e l ä i n s u o j e l u s t a + e l ä i n s u o j e l u s t a n d a r d e j a + e l ä i n s u o j e l u s t a n d a r d i e n + e l ä i n s u o j e l u s t a n d a r d i t + e l ä i n s u o j e l u s y i s t ä + e l ä i n s u o j e l u s ä ä n n ö s t e n + e l ä i n s u o j e l u t o i m e n p i t e i d e n + e l ä i n s u o j e l u t o i m i a + e l ä i n s u o j e l u u n + e l ä i n s u o j e l u v a a t i m u k s i a + e l ä i n s u o j e l u v a a t i m u s t a s o a + e l ä i n s u o j e l u y h d i s t y s + e l ä i n t a l o u t t a + e l ä i n t a r h a + e l ä i n t a r h a a + e l ä i n t a r h a t + e l ä i n t a r h a t a r i n a + e l ä i n t a r h o i s s a + e l ä i n t a r h o i s t a + e l ä i n t a r h o j a + e l ä i n t a r h o j e n + e l ä i n t a r k a s t u s t a + e l ä i n t a u d e i l l e + e l ä i n t a u d e i l t a + e l ä i n t a u d e i s t a + e l ä i n t a u d i n + e l ä i n t a u d i s t a + e l ä i n t a u d i t + e l ä i n t a u t e i h i n + e l ä i n t a u t e j a + e l ä i n t a u t i + e l ä i n t a u t i a l a a + e l ä i n t a u t i e n + e l ä i n t a u t i e p i d e m i a + e l ä i n t a u t i e p i d e m i a n + e l ä i n t a u t i e p i d e m i a t + e l ä i n t a u t i e p i d e m i o i d e n + e l ä i n t a u t i e p i d e m i o i h i n + e l ä i n t a u t i e p i d e m i o i t a + e l ä i n t a u t i j ä r j e s t ö + e l ä i n t a u t i j ä r j e s t ö n + e l ä i n t a u t i j ä r j e s t ö ä + e l ä i n t a u t i n a + e l ä i n t a u t i o n g e l m a t + e l ä i n t a u t i p o l i t i i k k a + e l ä i n t a u t i t u t k i m u s t a + e l ä i n t a u t i v i r a s t o n + e l ä i n t e h t a i s t a + e l ä i n t e n + e l ä i n t e n h o i d o n + e l ä i n t e n h o i d o s s a + e l ä i n t e n h o i t o o n + e l ä i n t e n h o i t o t o i m i n t a a + e l ä i n t e n k a s v a t u k s e s s a + e l ä i n t e n k a s v a t u s k ä y t ä n t ö j e n + e l ä i n t e n k u l j e t u k s e e n + e l ä i n t e n k u l j e t u k s i a + e l ä i n t e n k u l j e t u s s ä ä n n ö s t ö + e l ä i n t e n k u l j e t u s v a u n u i s s a + e l ä i n t e n p a l v o n t a + e l ä i n t e n p i t o a + e l ä i n t e n p i t o m e n e t e l m ä + e l ä i n t e n r u o k i n n a s s a + e l ä i n t e n r u o k i n t a a n + e l ä i n t e n s u o j e l i j o i l t a + e l ä i n t e n s u o j e l u + e l ä i n t e n s u o j e l u a + e l ä i n t e n s u o j e l u a a t t e e l l e + e l ä i n t e n s u o j e l u a l u e + e l ä i n t e n s u o j e l u j ä r j e s t e l m i e n + e l ä i n t e n s u o j e l u j ä r j e s t ö j ä + e l ä i n t e n s u o j e l u k r i t e e r i t + e l ä i n t e n s u o j e l u l a i n s ä ä d ä n t ö ä + e l ä i n t e n s u o j e l u l l e + e l ä i n t e n s u o j e l u m ä ä r ä y k s e t + e l ä i n t e n s u o j e l u m ä ä r ä y k s i ä + e l ä i n t e n s u o j e l u n + e l ä i n t e n s u o j e l u n o r m e j a + e l ä i n t e n s u o j e l u n o r m i e n + e l ä i n t e n s u o j e l u p o l i t i i k a n + e l ä i n t e n s u o j e l u r y h m ä t + e l ä i n t e n s u o j e l u s s a + e l ä i n t e n s u o j e l u s t a + e l ä i n t e n s u o j e l u s ä ä n n ö k s i ä + e l ä i n t e n s u o j e l u t y ö s s ä + e l ä i n t e n s u o j e l u u n + e l ä i n t e r v e y d e n + e l ä i n t e r v e y s a l a n + e l ä i n t e r v e y s o n g e l m a + e l ä i n t e r v e y s r a h a s t o + e l ä i n t e r v e y s r a h a s t o n + e l ä i n t e r v e y s s t r a t e g i a n + e l ä i n t e r v e y t e e n + e l ä i n t e r v e y t t ä + e l ä i n t i h e y d e n + e l ä i n t i h e y d e s t ä + e l ä i n t i h e y k s i ä + e l ä i n t i h e y s + e l ä i n t i h e y t e e n + e l ä i n t i h e y t t ä + e l ä i n t i l o i l l a + e l ä i n t u o n t i e n + e l ä i n t u o t a n n o n + e l ä i n t u o t a n n o s s a + e l ä i n t u o t a n t o a + e l ä i n t u o t a n t o a l a a + e l ä i n t u o t a n t o k y k y ä + e l ä i n t u o t a n t o o n + e l ä i n t u o t t a j i a + e l ä i n t u o t t e e t + e l ä i n t u o t t e i d e n + e l ä i n t u o t t e i l l e + e l ä i n t u o t t e i s i i n + e l ä i n t u o t t e i s s a + e l ä i n t u o t t e i s t a + e l ä i n t u o t t e i t a + e l ä i n t u o t t e i t a a n + e l ä i n u h r e i l l a a n + e l ä i n v a l k u a i n e n + e l ä i n v a l k u a i s e l l e + e l ä i n v a l k u a i s e n + e l ä i n v a l k u a i s e s t a + e l ä i n v a l k u a i s e t + e l ä i n v a l k u a i s i a + e l ä i n v a l k u a i s t a + e l ä i n v a l k u a i s t e n + e l ä i n v o i m a l l a + e l ä i n y k s i l ö i t ä + e l ä i n y s t ä v ä l l i n e n + e l ä i n y s t ä v ä l l i s e m m i n + e l ä i n y s t ä v ä l l i s e m p ä ä + e l ä i n y s t ä v ä l l i s e n + e l ä i n y s t ä v ä l l i s i i n + e l ä i n y s t ä v ä l l i s i s t ä + e l ä i n y s t ä v ä l l i s i ä + e l ä i n y s t ä v ä l l i s t ä + e l ä i n y s t ä v ä l l i s y y t e e n + e l ä i n y s t ä v ä m m e + e l ä i s i m m e + e l ä i s i v ä t + e l ä k e a l a a + e l ä k e a l a a n + e l ä k e a l a l l a + e l ä k e a l a n + e l ä k e a l i j ä ä m i ä + e l ä k e a s i a n t u n t i j a + e l ä k e a s i a s s a + e l ä k e a s i o i s s a + e l ä k e a s i o i s t a + e l ä k e a s i o i t a + e l ä k e d i r e k t i i v i + e l ä k e d i r e k t i i v i n + e l ä k e d i r e k t i i v i s t ä + e l ä k e d i r e k t i i v i ä + e l ä k e f o o r u m i a + e l ä k e f o o r u m i n + e l ä k e h a k e m u k s e n + e l ä k e h a k e m u k s e t + e l ä k e i k i ä + e l ä k e i k ä + e l ä k e i k ä i n e n + e l ä k e i k ä i s i l l e + e l ä k e i k ä i s i n ä + e l ä k e i k ä i s t e n + e l ä k e i k ä k y s y m y k s e n + e l ä k e i k ä r a j a k s i + e l ä k e i k ä r a j a n + e l ä k e i k ä r a j o j a + e l ä k e i k ä ä + e l ä k e i k ä ä n + e l ä k e i ä k s i + e l ä k e i ä n + e l ä k e i ä s s ä + e l ä k e i ä s t ä + e l ä k e i ä t + e l ä k e j ä r j e s t e l m i e m m e + e l ä k e j ä r j e s t e l m i e n + e l ä k e j ä r j e s t e l m i e n s ä + e l ä k e j ä r j e s t e l m i i n + e l ä k e j ä r j e s t e l m i l l e + e l ä k e j ä r j e s t e l m i l l ä + e l ä k e j ä r j e s t e l m i n e e n + e l ä k e j ä r j e s t e l m i s s ä + e l ä k e j ä r j e s t e l m i s s ä ä n + e l ä k e j ä r j e s t e l m i s t ä + e l ä k e j ä r j e s t e l m i s t ä m m e + e l ä k e j ä r j e s t e l m i s t ä ä n + e l ä k e j ä r j e s t e l m i ä + e l ä k e j ä r j e s t e l m i ä m m e + e l ä k e j ä r j e s t e l m i ä ä n + e l ä k e j ä r j e s t e l m ä + e l ä k e j ä r j e s t e l m ä l l e + e l ä k e j ä r j e s t e l m ä l l ä + e l ä k e j ä r j e s t e l m ä l l ä m m e + e l ä k e j ä r j e s t e l m ä m m e + e l ä k e j ä r j e s t e l m ä n + e l ä k e j ä r j e s t e l m ä n s ä + e l ä k e j ä r j e s t e l m ä p o l i t i i k k a n s a + e l ä k e j ä r j e s t e l m ä s s ä + e l ä k e j ä r j e s t e l m ä s t ä + e l ä k e j ä r j e s t e l m ä t + e l ä k e j ä r j e s t e l m ä u u d i s t u k s e n + e l ä k e j ä r j e s t e l m ä u u d i s t u k s e s s a + e l ä k e j ä r j e s t e l m ä u u d i s t u s t e n + e l ä k e j ä r j e s t e l m ä ä + e l ä k e j ä r j e s t e l m ä ä n + e l ä k e j ä r j e s t e l m ä ä n s ä + e l ä k e j ä r j e s t e l y + e l ä k e j ä r j e s t e l y i s t ä + e l ä k e j ä r j e s t e l y j e n + e l ä k e j ä r j e s t e l y j ä + e l ä k e j ä r j e s t e l y t + e l ä k e j ä r j e s t e l y ä + e l ä k e j ä r j e s t ö j ä + e l ä k e k a s s a + e l ä k e k a s s a t + e l ä k e k a s s o i s s a + e l ä k e k a s s o i s t a + e l ä k e k e h i t y s + e l ä k e k e i n o t t e l u n + e l ä k e k e r t y m ä ä + e l ä k e k e s k u s t e l u + e l ä k e k e s k u s t e l u a + e l ä k e k e s k u s t e l u i s s a + e l ä k e k e s k u s t e l u n + e l ä k e k i i s t a a + e l ä k e k r i i s i i n + e l ä k e k r i i s i s t ä + e l ä k e k u i l u + e l ä k e k u i l u n + e l ä k e k u l u j a + e l ä k e k u l u j e n + e l ä k e k u l u t + e l ä k e k u s t a n n u k s e t + e l ä k e k u s t a n n u k s i i n + e l ä k e k u s t a n n u s t e n + e l ä k e k y n n y k s i ä + e l ä k e k y s y m y k s e e n + e l ä k e k y s y m y k s e n + e l ä k e k y s y m y k s e s t ä + e l ä k e k y s y m y k s i s s ä + e l ä k e k y s y m y s + e l ä k e k y s y m y s t ä + e l ä k e l a i n s ä ä d ä n t ö ö n + e l ä k e l a i s t a + e l ä k e l a i t o k s e t + e l ä k e l a i t o k s i a + e l ä k e l a i t o k s i i n + e l ä k e l a i t o s t e n + e l ä k e l a s k e l m i s s a + e l ä k e l e i k k a u k s i a + e l ä k e l i i t t o o n + e l ä k e l ä i s e n + e l ä k e l ä i s e t + e l ä k e l ä i s i i n + e l ä k e l ä i s i l l e + e l ä k e l ä i s i l l ä + e l ä k e l ä i s i ä + e l ä k e l ä i s j ä r j e s t ö t + e l ä k e l ä i s k a l o j a + e l ä k e l ä i s k o r t i n + e l ä k e l ä i s k o r t t i + e l ä k e l ä i s l u o k a t + e l ä k e l ä i s m a t k a i l u u n + e l ä k e l ä i s m i e h i ä + e l ä k e l ä i s n a i s e t + e l ä k e l ä i s o n g e l m a n + e l ä k e l ä i s p a r k o j a + e l ä k e l ä i s p e r h e t t ä + e l ä k e l ä i s p u o l e e n + e l ä k e l ä i s p u o l u e + e l ä k e l ä i s p u o l u e e l l e + e l ä k e l ä i s p u o l u e e l t a + e l ä k e l ä i s p u o l u e e n + e l ä k e l ä i s p u o l u e e s e e n + e l ä k e l ä i s p u o l u e e s t a + e l ä k e l ä i s p u o l u e i s t a + e l ä k e l ä i s t e n + e l ä k e l ä i s y s t ä v ä l l e n i + e l ä k e m a k s u + e l ä k e m a k s u a + e l ä k e m a k s u i h i n + e l ä k e m a k s u i s t a + e l ä k e m a k s u j a + e l ä k e m a k s u j e n + e l ä k e m a k s u m m e + e l ä k e m a k s u v u o s i e n + e l ä k e m a l l e i h i n + e l ä k e m a l l i a + e l ä k e m a r k k i n a t + e l ä k e m a r k k i n o i d e n + e l ä k e m a r k k i n o i h i n + e l ä k e m a r k k i n o i l l e + e l ä k e m e n o i s t a + e l ä k e m e n o j a + e l ä k e m e n o t + e l ä k e m ä ä r i i n + e l ä k e m ä ä r ä y k s i i n + e l ä k e m ä ä r ä y k s i ä + e l ä k e o d o t u k s i a + e l ä k e o h j e l m a n + e l ä k e o h j e l m a s s a n i + e l ä k e o h j e l m i a + e l ä k e o h j e l m i s t a + e l ä k e o i k e u d e n + e l ä k e o i k e u d e t + e l ä k e o i k e u k s i a + e l ä k e o i k e u k s i a a n + e l ä k e o i k e u k s i e n + e l ä k e o i k e u k s i e n s a + e l ä k e o i k e u k s i i n + e l ä k e o i k e u k s i i n s a + e l ä k e o i k e u k s i l l e + e l ä k e o i k e u k s i s s a + e l ä k e o i k e u k s i s t a + e l ä k e o i k e u k s i s t a a n + e l ä k e o i k e u s + e l ä k e o i k e u s i ä n + e l ä k e o i k e u t e m m e + e l ä k e o i k e u t e n s a + e l ä k e o i k e u t t a + e l ä k e o i k e u t t a a n + e l ä k e o n g e l m a + e l ä k e o n g e l m a a + e l ä k e o n g e l m a a n + e l ä k e o n g e l m a n + e l ä k e o n g e l m a t + e l ä k e o n g e l m i a + e l ä k e o n g e l m i i n s a + e l ä k e p a k e t i n + e l ä k e p a k e t i s t a + e l ä k e p a r a m e t r e j a + e l ä k e p a r a m e t r i e n + e l ä k e p i s t e e n s ä + e l ä k e p o l i t i i k a n + e l ä k e p o l i t i i k a s s a + e l ä k e p o l i t i i k a s t a m m e + e l ä k e p o l i t i i k k a + e l ä k e p o l i t i i k k a a + e l ä k e p o l i t i i k k a a n + e l ä k e p o l i t i i k k a a n s a + e l ä k e p o m m i + e l ä k e p o m m i n + e l ä k e p ä i v i ä + e l ä k e p ä i v i ä ä n + e l ä k e p ä ä t ö k s e t + e l ä k e p ä ä t ö s t ä + e l ä k e r a h a s t o + e l ä k e r a h a s t o a + e l ä k e r a h a s t o a s i a n + e l ä k e r a h a s t o d i r e k t i i v e j ä + e l ä k e r a h a s t o d i r e k t i i v i + e l ä k e r a h a s t o d i r e k t i i v i k s i + e l ä k e r a h a s t o d i r e k t i i v i n + e l ä k e r a h a s t o i h i n + e l ä k e r a h a s t o i l l a + e l ä k e r a h a s t o i l l e + e l ä k e r a h a s t o i n t i k y s y m y k s e s s ä + e l ä k e r a h a s t o i n v e s t o i n t e j a + e l ä k e r a h a s t o i s s a + e l ä k e r a h a s t o i s t a + e l ä k e r a h a s t o j a + e l ä k e r a h a s t o j a a n + e l ä k e r a h a s t o j e n + e l ä k e r a h a s t o j ä r j e s t e l m i e n + e l ä k e r a h a s t o j ä r j e s t e l m ä n + e l ä k e r a h a s t o j ä r j e s t e l m ä ä + e l ä k e r a h a s t o k s i + e l ä k e r a h a s t o l l e + e l ä k e r a h a s t o m a r k k i n a t + e l ä k e r a h a s t o m m e + e l ä k e r a h a s t o n + e l ä k e r a h a s t o o n + e l ä k e r a h a s t o s i j o i t t a j a + e l ä k e r a h a s t o s s a + e l ä k e r a h a s t o s t a + e l ä k e r a h a s t o s u u n n i t e l m a + e l ä k e r a h a s t o t + e l ä k e r a h a s t o t i e d o n a n t o a + e l ä k e r a h a s t o t i l a n n e t t a + e l ä k e r a h a s t o v e l v o l l i s u u k s i e n + e l ä k e r a h o i s t a + e l ä k e r a h o i t u k s e n + e l ä k e r a h o i t u s r a t k a i s u j a + e l ä k e r a h o j a + e l ä k e r a k e n t e e t + e l ä k e s e k t o r i + e l ä k e s e k t o r i l l a + e l ä k e s e k t o r i n + e l ä k e s i j o i t u k s e n s a + e l ä k e s i j o i t u k s e t + e l ä k e s i t o u m u k s e n s a + e l ä k e s t r a t e g i a s t a + e l ä k e s u o r i t u k s e t + e l ä k e s u u n n i t e l m a n + e l ä k e s u u n n i t e l m a t + e l ä k e s u u n n i t e l m i a + e l ä k e s u u n n i t e l m i e n + e l ä k e s u u n n i t e l m i s t a a n + e l ä k e s ä ä n n ö k s i ä + e l ä k e s ä ä s t ä m i n e n + e l ä k e s ä ä s t ä m i s e n + e l ä k e s ä ä s t ö j e n + e l ä k e s ä ä s t ö j ä r j e s t e l m i ä + e l ä k e s ä ä s t ö j ä ä n + e l ä k e s ä ä s t ö t + e l ä k e s ä ä s t ö t i l i t + e l ä k e s ä ä t i ö s t ä + e l ä k e t a a k a n + e l ä k e t a k u i s i i n + e l ä k e t a r j o n n a n + e l ä k e t a r k o i t u k s i i n + e l ä k e t a r p e i s t a a n + e l ä k e t a r p e i t a + e l ä k e t a s o i s t a + e l ä k e t a s o n + e l ä k e t i l a n n e + e l ä k e t i l a n t e e n s a + e l ä k e t i l a n t e e s t a + e l ä k e t i l i l l e + e l ä k e t t ä + e l ä k e t u k i + e l ä k e t u l o + e l ä k e t u l o a + e l ä k e t u l o i s t a a n + e l ä k e t u l o j a + e l ä k e t u l o j e n + e l ä k e t u o t e + e l ä k e t u o t t e i d e n + e l ä k e t u o t t e i l l e + e l ä k e t u r v a + e l ä k e t u r v a a + e l ä k e t u r v a a n + e l ä k e t u r v a a n s a + e l ä k e t u r v a j ä r j e s t e l m ä + e l ä k e t u r v a k y s y m y k s e e n + e l ä k e t u r v a l l a + e l ä k e t u r v a l l e + e l ä k e t u r v a m a k s u j a + e l ä k e t u r v a n + e l ä k e t u r v a s s a + e l ä k e t u r v a s s a a n + e l ä k e t u r v a s t a + e l ä k e u u d i s t u k s e e n + e l ä k e u u d i s t u k s e k s i + e l ä k e u u d i s t u k s e n + e l ä k e u u d i s t u k s e s s a + e l ä k e u u d i s t u k s e s t a + e l ä k e u u d i s t u k s e t + e l ä k e u u d i s t u k s i a + e l ä k e u u d i s t u k s i i n + e l ä k e u u d i s t u s + e l ä k e u u d i s t u s t a + e l ä k e u u d i s t u s t e n + e l ä k e v a k u u t u k s e e n + e l ä k e v a k u u t u k s e n + e l ä k e v a k u u t u k s e s t a + e l ä k e v a k u u t u k s e s t a a n + e l ä k e v a k u u t u k s i a + e l ä k e v a k u u t u k s i i n + e l ä k e v a k u u t u k s i s s a + e l ä k e v a k u u t u k s i s t a + e l ä k e v a k u u t u s j ä r j e s t e l m i e n + e l ä k e v a k u u t u s j ä r j e s t e l m ä n + e l ä k e v a k u u t u s m a k s u j a + e l ä k e v a k u u t u s m a k s u t + e l ä k e v a k u u t u s o i k e u k s i e n s a + e l ä k e v a k u u t u s t a a n + e l ä k e v a k u u t u s t e n + e l ä k e v a r a t + e l ä k e v a r o j a + e l ä k e v a r o j e n + e l ä k e v a s t u i d e n + e l ä k e v a s t u i t a + e l ä k e v a s t u u + e l ä k e v a s t u u s e e n + e l ä k e v a s t u u s t a + e l ä k e v a s t u u t + e l ä k e v e l k o j e n + e l ä k e v e l v o i t t e e t + e l ä k e v e l v o i t t e i d e n + e l ä k e v i r a n o m a i s e n + e l ä k e v u o s i a + e l ä k e v u o t t a + e l ä k e y h t i ö t + e l ä k k e e l l e + e l ä k k e e l l ä + e l ä k k e e n + e l ä k k e e n s a a j a t + e l ä k k e e n s a a j i e n + e l ä k k e e n s ä + e l ä k k e e n t a r j o a j i e n + e l ä k k e e s e e n + e l ä k k e e s t ä ä n + e l ä k k e e t + e l ä k k e i d e n + e l ä k k e i d e n s a a n t i + e l ä k k e i l l e + e l ä k k e i s i i n + e l ä k k e i s s ä + e l ä k k e i s t ä + e l ä k k e i t ä + e l ä k ä ä m m e + e l ä k ö i t y m i s i k ä + e l ä k ö i t y m i s i k ä ä + e l ä m i s e k s i + e l ä m i s e n + e l ä m i s e s t ä + e l ä m i ä + e l ä m m e + e l ä m m e h ä n + e l ä m m e k ö + e l ä m ä i n i l o s t a + e l ä m ä k e r t a + e l ä m ä k e r t a e l o k u v a + e l ä m ä l l e + e l ä m ä l l e m m e + e l ä m ä l l ä + e l ä m ä m m e + e l ä m ä n + e l ä m ä n a l a a + e l ä m ä n a l a l l e + e l ä m ä n a l o i h i n + e l ä m ä n a l o i l l a + e l ä m ä n a l o j a + e l ä m ä n a l u e e l l a + e l ä m ä n a l u e i d e n + e l ä m ä n a l u e i l l a + e l ä m ä n a l u e i l l e + e l ä m ä n a l u e i l t a + e l ä m ä n a l u e i s i i n + e l ä m ä n a l u e i t a + e l ä m ä n a s e n n e + e l ä m ä n a s e n n e t t a + e l ä m ä n a s e n t e e s e e n + e l ä m ä n a s e n t e e s s a + e l ä m ä n a s e n t e e s t a + e l ä m ä n h a l u a + e l ä m ä n h a l u u n + e l ä m ä n i + e l ä m ä n i l o a + e l ä m ä n i l o a a n + e l ä m ä n i l o n i + e l ä m ä n i l o s t a + e l ä m ä n k a a r e n s a + e l ä m ä n k a t s o m u k s e e n + e l ä m ä n k a t s o m u k s e n + e l ä m ä n k a t s o m u k s i i n + e l ä m ä n k a t s o m u s + e l ä m ä n k o k e m u k s e m m e + e l ä m ä n k o k e m u k s e n n e + e l ä m ä n k o k e m u k s e n s a + e l ä m ä n k o k e m u k s i i n + e l ä m ä n k o k e m u s t a + e l ä m ä n k o k e m u s t e n + e l ä m ä n k o k e m u s t e n s a + e l ä m ä n k o u l u + e l ä m ä n k o u l u a + e l ä m ä n k o u l u n a + e l ä m ä n k u l k u n s a + e l ä m ä n k u m p p a n e i h i n + e l ä m ä n k u m p p a n e i l l e + e l ä m ä n l a a d u k s i + e l ä m ä n l a a d u l l a + e l ä m ä n l a a d u l l e + e l ä m ä n l a a d u l l i s e s s a + e l ä m ä n l a a d u n + e l ä m ä n l a a d u s s a + e l ä m ä n l a a d u s t a + e l ä m ä n l a a d u s t a a n + e l ä m ä n l a a d u s t a k i n + e l ä m ä n l a a t u + e l ä m ä n l a a t u a + e l ä m ä n l a a t u a a n + e l ä m ä n l a a t u a m m e + e l ä m ä n l a a t u k y s y m y k s i i n + e l ä m ä n l a a t u m m e + e l ä m ä n l a a t u n s a + e l ä m ä n l a a t u s e l v i t y k s i s s ä + e l ä m ä n l a a t u u n + e l ä m ä n l a a t u u n s a + e l ä m ä n l a h j a + e l ä m ä n l a n k a + e l ä m ä n l ä h d e + e l ä m ä n m a l l i + e l ä m ä n m u o d o i l l e + e l ä m ä n m u o d o n + e l ä m ä n m u o d o t + e l ä m ä n m u o t o + e l ä m ä n m u o t o a a n + e l ä m ä n m u o t o j a + e l ä m ä n m u o t o j e n + e l ä m ä n m u o t o m m e + e l ä m ä n m u o t o o m m e + e l ä m ä n n e + e l ä m ä n o d o t u k s e t + e l ä m ä n o i k e u t e e n + e l ä m ä n p u u + e l ä m ä n r y t m i + e l ä m ä n r y t m i ä + e l ä m ä n s u u n n i t e l m i a a n + e l ä m ä n s u u n n i t e l m i e n + e l ä m ä n s ä + e l ä m ä n t a l o u t t a + e l ä m ä n t a p a + e l ä m ä n t a p a a + e l ä m ä n t a p a a m m e + e l ä m ä n t a p a a n + e l ä m ä n t a p a a n s a + e l ä m ä n t a p a l ä ä k k e i t ä + e l ä m ä n t a p a m a l l i s t a + e l ä m ä n t a p a m m e + e l ä m ä n t a p a n a + e l ä m ä n t a p a n s a + e l ä m ä n t a p a t e k i j ä t + e l ä m ä n t a p a t e k i j ö i d e n + e l ä m ä n t a p a v a l i n n o i s t a + e l ä m ä n t a p a v a l i n t a + e l ä m ä n t a p o i h i n + e l ä m ä n t a p o j a + e l ä m ä n t a p o j a m m e + e l ä m ä n t a p o j e n + e l ä m ä n t a r i n a a n i + e l ä m ä n t a r i n a t + e l ä m ä n t a r i n o i h i n + e l ä m ä n t a r i n o i t a + e l ä m ä n t a s o a + e l ä m ä n t a v a l l a + e l ä m ä n t a v a l l a a n + e l ä m ä n t a v a l l a m m e + e l ä m ä n t a v a n + e l ä m ä n t a v a s s a m m e + e l ä m ä n t a v a s t a + e l ä m ä n t a v a s t a a n + e l ä m ä n t a v a s t a m m e + e l ä m ä n t a v a t + e l ä m ä n t a v o i l l a m m e + e l ä m ä n t a v o i s s a + e l ä m ä n t a v o i s t a a n + e l ä m ä n t i l a n + e l ä m ä n t i l a n t e e n + e l ä m ä n t i l a n t e e n s a + e l ä m ä n t i l a n t e e t + e l ä m ä n t i l a n t e i s i i n + e l ä m ä n t i l a n t e i s s a + e l ä m ä n t o d e l l i s u u d e n + e l ä m ä n t o i v o n + e l ä m ä n t y y l e j ä + e l ä m ä n t y y l i i n + e l ä m ä n t y y l i m m e + e l ä m ä n t y y l i t + e l ä m ä n t y ö n s ä + e l ä m ä n t y ö n ä ä n + e l ä m ä n t y ö s t ä ä n + e l ä m ä n v a i h e + e l ä m ä n v a i h e e k s i + e l ä m ä n v a i h e e n + e l ä m ä n v a i h e e s s a + e l ä m ä n v a i h e i s i i n + e l ä m ä n v a i h e i s s a + e l ä m ä n v a i h e i t a + e l ä m ä n v a l i n t o i h i n s a + e l ä m ä n v a s t a i n e n + e l ä m ä s s ä + e l ä m ä s s ä ä n + e l ä m ä s t ä + e l ä m ä s t ä m m e + e l ä m ä s t ä ä n + e l ä m ä t + e l ä m ä t a p a s ä ä d ö k s i l l e + e l ä m ä ä + e l ä m ä ä k i n + e l ä m ä ä m m e + e l ä m ä ä n + e l ä m ä ä n s ä + e l ä n e e t + e l ä n y t + e l ä v i e n + e l ä v i i n + e l ä v i l l e + e l ä v i l l ä + e l ä v i l t ä + e l ä v i m p i n ä + e l ä v i n ä + e l ä v i ä + e l ä v ä i s e m p i + e l ä v ä m m ä k s i + e l ä v ä m m ä n + e l ä v ä m p i + e l ä v ä m p i ä + e l ä v ä n + e l ä v ä n s ä + e l ä v ä n ä + e l ä v ä t + e l ä v ä ä + e l ä v ö i t i m m e + e l ä ä + e l ä ä k s e e n + e l ä ä k s e m m e + e m a k o i d e n + e m a n s i p a a t i o k a n a v a + e m a n s i p a a t i o l l e + e m a n s i p a a t i o p o l i t i i k k a a + e m a n s i p a a t i o p o l i t i i k k a a n + e m a n s i p a a t i o p r o s e s s i + e m a n s i p a a t i o t a v o i t t e i d e n + e m i k a a l i p o l i t i i k k a a + e m i n e + e m i s s i o s u m u + e m m e h ä n + e m m e n t a l j u u s t o a + e m m e n t a l j u u s t o n + e m o a l u s + e m o k a s v i + e m o k i e l t e n + e m o l e h m i e n + e m o l e h m i s t ä + e m o l e h m ä + e m o l e h m ä k a s v a t t a j a t + e m o l e h m ä n + e m o l e h m ä p a l k k i o i d e n + e m o l e h m ä p a l k k i o s t a + e m o l e h m ä p a l k k i o t + e m o l e h m ä s t ä + e m o l e h m ä t + e m o o t i o t a + e m o p a n k e i l t a + e m o p a n k k e i h i n + e m o t i o n a a l i s t e n + e m o v i l j e l m i ä + e m o y h t i ö + e m o y h t i ö i d e n + e m o y h t i ö i k s i + e m o y h t i ö i n ä + e m o y h t i ö i t ä + e m o y h t i ö k s i + e m o y h t i ö l l ä + e m o y h t i ö n + e m o y h t i ö s t ä + e m o y h t i ö t + e m o y h t i ö t ä + e m o y r i t y k s e n + e m o y r i t y s + e m o y r i t y s t ä + e m p i m ä t t ä + e m p i r e t y y l i + e m p i ä + e m u h a n k k e e n + e m u k a m p a n j a a n + e m u p r o s e s s i a + e m u s o t a + e m u s s a + e m u u n + e m u y h t e i s t y ö l l e + e m ä a l u k s e t + e m ä a l u s t a + e m ä l t ä + e m ä m a a h a n + e m ä m a a h a n s a + e m ä m a a n + e m ä m a a s t a a n + e m ä m a i d e n + e m ä s p a r i + e m ä s r e a k t i o + e m ä s t i t r a u s + e m ä t i n a v a n n e + e m ä t i n p i e r u + e m ä v a l e i t a + e m ä v a l h e + e n d o k r i i n i s i a + e n d o m e t r i o o s i v i i k k o a + e n d o p l a s m a k a l v o s t o + e n e m m i n + e n e m m i s t ä + e n e m m i s t ö d e m o k r a t i a + e n e m m i s t ö d i k t a t u u r i a + e n e m m i s t ö d i k t a t u u r i n + e n e m m i s t ö e d u s t u s t a + e n e m m i s t ö e h d o t u s + e n e m m i s t ö h a l l i n n o s s a n n e + e n e m m i s t ö h a l l i n t o a + e n e m m i s t ö h a l l i t u k s e n + e n e m m i s t ö h a l l i t u s + e n e m m i s t ö h e i m o + e n e m m i s t ö i n + e n e m m i s t ö j e n + e n e m m i s t ö j o h t a j i a + e n e m m i s t ö j ä + e n e m m i s t ö j ä r j e s t e l m ä + e n e m m i s t ö k a n n a n + e n e m m i s t ö k a n s o j e n + e n e m m i s t ö k a n t a + e n e m m i s t ö k i e l i ä + e n e m m i s t ö k r i t e e r i ä + e n e m m i s t ö k s i + e n e m m i s t ö k y s y m y s + e n e m m i s t ö l i n j a n + e n e m m i s t ö l l e + e n e m m i s t ö l l ä + e n e m m i s t ö l t ä + e n e m m i s t ö m i e l i p i d e t t ä + e n e m m i s t ö n + e n e m m i s t ö n a t i o n a l i s t i t + e n e m m i s t ö n ä + e n e m m i s t ö n ä k e m y s + e n e m m i s t ö o i k e u k s i s t a + e n e m m i s t ö o i k e u s + e n e m m i s t ö o p p o s i t i o i t a + e n e m m i s t ö o s a k a s + e n e m m i s t ö o s a k k a a n + e n e m m i s t ö o s a k k a a n a + e n e m m i s t ö o s a k k a a t + e n e m m i s t ö o s u u d e n + e n e m m i s t ö p a r l a m e n t t i + e n e m m i s t ö p e r i a a t e + e n e m m i s t ö p e r i a a t e t t a + e n e m m i s t ö p e r i a a t t e e s e e n + e n e m m i s t ö p o h j a l t a + e n e m m i s t ö p u o l u e + e n e m m i s t ö p u o l u e e n + e n e m m i s t ö p u o l u e e s t a + e n e m m i s t ö p u o l u e i d e n + e n e m m i s t ö p u o l u e i l l e + e n e m m i s t ö p u o l u e p o l i t i i k k a a + e n e m m i s t ö p u o l u e r y h m i e n + e n e m m i s t ö p ä ä t ö k s e e n + e n e m m i s t ö p ä ä t ö k s e l l ä + e n e m m i s t ö p ä ä t ö k s e n + e n e m m i s t ö p ä ä t ö k s e n t e k o + e n e m m i s t ö p ä ä t ö k s e n t e k o a + e n e m m i s t ö p ä ä t ö k s e n t e k o o n + e n e m m i s t ö p ä ä t ö k s e n ä + e n e m m i s t ö p ä ä t ö k s e t + e n e m m i s t ö p ä ä t ö k s i i n + e n e m m i s t ö p ä ä t ö k s i l l ä + e n e m m i s t ö p ä ä t ö k s i n + e n e m m i s t ö p ä ä t ö k s i n e e n + e n e m m i s t ö p ä ä t ö k s i n ä + e n e m m i s t ö p ä ä t ö k s i s t ä + e n e m m i s t ö p ä ä t ö k s i ä + e n e m m i s t ö p ä ä t ö s + e n e m m i s t ö p ä ä t ö s j ä r j e s t e l m ä + e n e m m i s t ö p ä ä t ö s m e k a n i s m i a + e n e m m i s t ö p ä ä t ö s m e n e t t e l y + e n e m m i s t ö p ä ä t ö s m e n e t t e l y l l ä + e n e m m i s t ö p ä ä t ö s m e n e t t e l y n + e n e m m i s t ö p ä ä t ö s m e n e t t e l y s s ä + e n e m m i s t ö p ä ä t ö s m e n e t t e l y ä + e n e m m i s t ö p ä ä t ö s p e r i a a t t e e n + e n e m m i s t ö p ä ä t ö s t e n + e n e m m i s t ö p ä ä t ö s t ä + e n e m m i s t ö r a j a n + e n e m m i s t ö r a t k a i s u s t a + e n e m m i s t ö r y h m i e n + e n e m m i s t ö r y h m ä + e n e m m i s t ö r y h m ä n + e n e m m i s t ö r y h m ä t + e n e m m i s t ö r y h m ä ä n + e n e m m i s t ö s o p i m u s t e n + e n e m m i s t ö s s ä + e n e m m i s t ö s t ä + e n e m m i s t ö s ä ä n n ö k s e t + e n e m m i s t ö s ä ä n n ö s s ä + e n e m m i s t ö s ä ä n t ö + e n e m m i s t ö t + e n e m m i s t ö t e k s t i ä + e n e m m i s t ö t i l a n t e e n + e n e m m i s t ö t u e n + e n e m m i s t ö u s k o n t o j e n + e n e m m i s t ö v a a l e i h i n + e n e m m i s t ö v a a l i + e n e m m i s t ö v a a l i i n + e n e m m i s t ö v a a l i j ä r j e s t e l m ä n + e n e m m i s t ö v a a l i j ä r j e s t e l m ä t + e n e m m i s t ö v a a l i j ä r j e s t e l m ä ä + e n e m m i s t ö v a a l i l l a + e n e m m i s t ö v a a t i m u k s i a + e n e m m i s t ö v ä e s t ö ö n + e n e m m i s t ö y h t e i s k u n n a n + e n e m m i s t ö ä + e n e m m i s t ö ä ä n e s t y k s e e n + e n e m m i s t ö ä ä n e s t y k s e l l ä + e n e m m i s t ö ä ä n e s t y k s e n + e n e m m i s t ö ä ä n e s t y k s e s s ä + e n e m m i s t ö ä ä n e s t y k s i s t ä + e n e m m i s t ö ä ä n e s t y k s i ä + e n e m m i s t ö ä ä n e s t y s + e n e m m i s t ö ä ä n e s t y s j ä r j e s t e l m ä l l ä + e n e m m i s t ö ä ä n e s t y s t e n + e n e m m i s t ö ä ä n e s t y s t ä + e n e m m i s t ö ä ä n i l l ä + e n e m m i s t ö ä ä n i n + e n e m m i s t ö ä ä n t e n + e n e m m i s t ö ö n + e n e m m ä n k i n + e n e m m ä s t ä + e n e m p i ä + e n e m p ä ä n + e n e n e v ä s s ä + e n e r g i a a + e n e r g i a a m m e + e n e r g i a a n + e n e r g i a a n s a + e n e r g i a b u d j e t i s t a + e n e r g i a b u d j e t t i a + e n e r g i a b u d j e t t i a a n + e n e r g i a b u u m i i n + e n e r g i a d i a l o g i + e n e r g i a d i a l o g i i n + e n e r g i a d i a l o g i n + e n e r g i a d i a l o g i s t a + e n e r g i a d i p l o m a t i a + e n e r g i a d i p l o m a t i a a + e n e r g i a d i p l o m a t i a n + e n e r g i a d i r e k t i i v i s s ä + e n e r g i a e h d o t u k s e s t a + e n e r g i a e h d o t u k s e t + e n e r g i a e l v y t y k s e n + e n e r g i a e t i i k k a + e n e r g i a e t u j a + e n e r g i a e t u j e n + e n e r g i a f o b i a + e n e r g i a f o o r u m e i l l a + e n e r g i a f o o r u m i + e n e r g i a f o o r u m i n + e n e r g i a f o o r u m i s s a + e n e r g i a h a a s t e + e n e r g i a h a a s t e e s e e n + e n e r g i a h a a s t e e t + e n e r g i a h a a s t e i d e n + e n e r g i a h a a s t e i s i i n + e n e r g i a h a l l i n t a a n s a + e n e r g i a h a l l i n t a j ä r j e s t e l m i l l e + e n e r g i a h a n k e + e n e r g i a h a n k e t t a + e n e r g i a h a n k i n n a n + e n e r g i a h a n k k e e k s i + e n e r g i a h a n k k e e l l e + e n e r g i a h a n k k e e n a + e n e r g i a h a n k k e e t + e n e r g i a h a n k k e i d e n + e n e r g i a h a n k k e i l l e + e n e r g i a h a n k k e i l t a + e n e r g i a h a n k k e i s i i n + e n e r g i a h a n k k e i s s a + e n e r g i a h a n k k e i s t a + e n e r g i a h a n k k e i t a + e n e r g i a h a n k k e i t a a n + e n e r g i a h e r r u u s + e n e r g i a h i n n a t + e n e r g i a h i n n o i n + e n e r g i a h i n n o i s t a + e n e r g i a h i n t o i h i n + e n e r g i a h i n t o j a + e n e r g i a h i n t o j e n + e n e r g i a h u i p p u k o k o u k s e n + e n e r g i a h u i p p u k o k o u k s e s s a + e n e r g i a h u i p p u k o k o u k s i a + e n e r g i a h u i p p u k o k o u s + e n e r g i a h u i p p u k o k o u s t a + e n e r g i a h u k a n + e n e r g i a h u k k a a + e n e r g i a h u o l e n a i h e i s i i m m e + e n e r g i a h u o l i a + e n e r g i a h u o l i i n + e n e r g i a h u o l l o l l e + e n e r g i a h u o l l o n + e n e r g i a h u o l l o s s a + e n e r g i a h u o l l o s t a + e n e r g i a h u o l l o s t a a n + e n e r g i a h u o l l o s t a m m e + e n e r g i a h u o l t a + e n e r g i a h u o l t o + e n e r g i a h u o l t o a + e n e r g i a h u o l t o a a n + e n e r g i a h u o l t o a m m e + e n e r g i a h u o l t o h a n k k e e t + e n e r g i a h u o l t o j ä r j e s t e l m i i n + e n e r g i a h u o l t o j ä r j e s t e l m ä + e n e r g i a h u o l t o k e t j u + e n e r g i a h u o l t o k r i i s i ä + e n e r g i a h u o l t o m a r k k i n o i l l a + e n e r g i a h u o l t o m m e + e n e r g i a h u o l t o n s a + e n e r g i a h u o l t o o n + e n e r g i a h u o l t o p o l i t i i k k a + e n e r g i a h u o l t o p o l i t i i k k a a + e n e r g i a h u o l t o s t r a t e g i a + e n e r g i a h u o l t o s t r a t e g i a a + e n e r g i a h u o l t o s t r a t e g i a n + e n e r g i a h u o l t o s t r a t e g i a s t a + e n e r g i a h u o l t o s u u n n i t t e l u a + e n e r g i a h u o l t o t i l a n t e e n + e n e r g i a h u o l t o t i l a n t e e s t a m m e + e n e r g i a h u o l t o v a r m u u d e n + e n e r g i a h u o l t o v a r m u u d e s t a + e n e r g i a h u o l t o v a r m u u s + e n e r g i a h u o l t o v a r m u u t e m m e + e n e r g i a h u o l t o v a r m u u t t a + e n e r g i a h u o l t o v e r k k o j e n + e n e r g i a h u o l t o y r i t y k s i ä + e n e r g i a h y ö t y s u h d e + e n e r g i a h y ö t y s u h d e t t a + e n e r g i a h y ö t y s u h t e e n + e n e r g i a h ä i r i ö s t ä + e n e r g i a h ä v i ö + e n e r g i a h ä v i ö t + e n e r g i a i n f r a s t r u k t u u r e i h i m m e + e n e r g i a i n f r a s t r u k t u u r e i h i n + e n e r g i a i n f r a s t r u k t u u r e i s s a + e n e r g i a i n f r a s t r u k t u u r e j a + e n e r g i a i n f r a s t r u k t u u r i + e n e r g i a i n f r a s t r u k t u u r i a + e n e r g i a i n f r a s t r u k t u u r i a a n + e n e r g i a i n f r a s t r u k t u u r i a m m e + e n e r g i a i n f r a s t r u k t u u r i e n + e n e r g i a i n f r a s t r u k t u u r i h a n k k e e t + e n e r g i a i n f r a s t r u k t u u r i h a n k k e i d e n + e n e r g i a i n f r a s t r u k t u u r i h a n k k e i s t a + e n e r g i a i n f r a s t r u k t u u r i h a n k k e i t a + e n e r g i a i n f r a s t r u k t u u r i i n + e n e r g i a i n f r a s t r u k t u u r i l l e + e n e r g i a i n f r a s t r u k t u u r i m m e + e n e r g i a i n f r a s t r u k t u u r i n + e n e r g i a i n f r a s t r u k t u u r i n s a + e n e r g i a i n f r a s t r u k t u u r i s t a + e n e r g i a i n f r a s t r u k t u u r i s u u n n i t e l m a + e n e r g i a i n f r a s t r u k t u u r i t + e n e r g i a i n f r a s t r u k t u u r i v e r k o s t o j e n + e n e r g i a i n n o v a a t i o i t a + e n e r g i a i n s t i t u u t i n + e n e r g i a i n t e n s i i v i s e e n + e n e r g i a i n t e n s i i v i s e l l e + e n e r g i a i n t e n s i i v i s e n + e n e r g i a i n t e n s i i v i s e t + e n e r g i a i n t e n s i i v i s i i n + e n e r g i a i n t e n s i i v i s i l l e + e n e r g i a i n t e n s i i v i s i l l ä + e n e r g i a i n t e n s i i v i s i s t ä + e n e r g i a i n t e n s i i v i s t e n + e n e r g i a i n t e n s i t e e t i n + e n e r g i a i n t e n s i t e e t t i + e n e r g i a i n t e n s i t e e t t i ä + e n e r g i a i n t r e s s e j ä + e n e r g i a i n v e s t o i n n e i l l a + e n e r g i a i n v e s t o i n n e i s t a + e n e r g i a i n v e s t o i n n i t + e n e r g i a i n v e s t o i n t e j a + e n e r g i a i n v e s t o i n t i e n + e n e r g i a i n v e s t o i n t i s u u n n i t e l m a t + e n e r g i a j a k e l u u n + e n e r g i a j u l i s t u s t a + e n e r g i a j u o m a + e n e r g i a j u o m a t + e n e r g i a j u o m i a + e n e r g i a j u o m i e n + e n e r g i a j u o m i s s a + e n e r g i a j u o m i s t a + e n e r g i a j ä r j e s t e l m i e m m e + e n e r g i a j ä r j e s t e l m i e n + e n e r g i a j ä r j e s t e l m i i n + e n e r g i a j ä r j e s t e l m i s t ä + e n e r g i a j ä r j e s t e l m i ä + e n e r g i a j ä r j e s t e l m i ä ä n + e n e r g i a j ä r j e s t e l m ä + e n e r g i a j ä r j e s t e l m ä l l e + e n e r g i a j ä r j e s t e l m ä m m e + e n e r g i a j ä r j e s t e l m ä n + e n e r g i a j ä r j e s t e l m ä s t ä + e n e r g i a j ä r j e s t e l m ä s t ä m m e + e n e r g i a j ä r j e s t e l m ä t + e n e r g i a j ä r j e s t e l m ä ä + e n e r g i a j ä r j e s t e l m ä ä n + e n e r g i a j ä r j e s t ö + e n e r g i a j ä r j e s t ö j e n + e n e r g i a j ä r j e s t ö n + e n e r g i a j ä t e + e n e r g i a j ä t e t t ä + e n e r g i a j ä t i t + e n e r g i a j ä t t e j ä + e n e r g i a j ä t t i + e n e r g i a j ä t t i e n + e n e r g i a k a k k u + e n e r g i a k a p a s i t e e t i n + e n e r g i a k a p a s i t e e t t i a + e n e r g i a k a p p a l e t t a + e n e r g i a k a s v e i h i n + e n e r g i a k a s v e i l l a + e n e r g i a k a s v e i l l e + e n e r g i a k a s v e i s t a + e n e r g i a k a s v e j a + e n e r g i a k a s v i + e n e r g i a k a s v i e n + e n e r g i a k a t a s t r o f i i n + e n e r g i a k a t k o k s i a + e n e r g i a k a t s a u k s e n + e n e r g i a k a t s a u k s e n s a + e n e r g i a k a t s a u k s e s s a + e n e r g i a k a t s a u k s e s t a + e n e r g i a k a t s a u s + e n e r g i a k a t s a u s t a + e n e r g i a k a t s a u s t a a n + e n e r g i a k a u p a n + e n e r g i a k a u p a s t a + e n e r g i a k a u p a t + e n e r g i a k a u p p a a + e n e r g i a k e h i t y k s e e n + e n e r g i a k e h i t y k s e s t ä + e n e r g i a k e h i t y s j ä r j e s t ö n + e n e r g i a k e h i t y s t y ö t ä + e n e r g i a k e r t o m u k s e e n + e n e r g i a k e r t o m u k s e n + e n e r g i a k e s k u s t e l u + e n e r g i a k e s k u s t e l u a + e n e r g i a k e s k u s t e l u i s s a + e n e r g i a k e s k u s t e l u i s t a + e n e r g i a k e s k u s t e l u n + e n e r g i a k e s k u s t e l u s s a + e n e r g i a k e s k u s t e l u u n + e n e r g i a k e s k u s t e n + e n e r g i a k e t j u n + e n e r g i a k i i s t o j e n + e n e r g i a k i l p a i l u l l e + e n e r g i a k i r i s t y k s e n + e n e r g i a k i r j a n + e n e r g i a k o k o u k s e n + e n e r g i a k o k o u k s e s s a + e n e r g i a k o k o u k s e s t a + e n e r g i a k o k o u s + e n e r g i a k o m i s s a a r i + e n e r g i a k o m i s s a a r i n + e n e r g i a k o n f e r e n s s i + e n e r g i a k o n f l i k t i n + e n e r g i a k o n s e r n i + e n e r g i a k o n s e r n i m m e + e n e r g i a k o n s e r n i t + e n e r g i a k r i i s e i s s ä + e n e r g i a k r i i s e i s t ä + e n e r g i a k r i i s e j ä + e n e r g i a k r i i s i + e n e r g i a k r i i s i e n + e n e r g i a k r i i s i i n + e n e r g i a k r i i s i k y s y m y k s i ä + e n e r g i a k r i i s i l t ä + e n e r g i a k r i i s i n + e n e r g i a k r i i s i o h j e l m a n + e n e r g i a k r i i s i s s ä + e n e r g i a k r i i s i s t ä + e n e r g i a k r i i s i t + e n e r g i a k r i i s i t i l a n t e i s s a + e n e r g i a k r i i s i ä + e n e r g i a k u l j e t u k s i a + e n e r g i a k u l j e t u k s i i n + e n e r g i a k u l u t u k s e n + e n e r g i a k u l u t u k s e s t a + e n e r g i a k u l u t u s + e n e r g i a k u l u t u s t a + e n e r g i a k u m p p a n e i d e m m e + e n e r g i a k u m p p a n e i h i n + e n e r g i a k u m p p a n i + e n e r g i a k u m p p a n i e n + e n e r g i a k u m p p a n u u d e n + e n e r g i a k u m p p a n u u d e s t a + e n e r g i a k u m p p a n u u s + e n e r g i a k u m p p a n u u s a l o i t t e i l l a + e n e r g i a k u m p p a n u u t t a + e n e r g i a k u s t a n n u k s e t + e n e r g i a k u s t a n n u k s i a + e n e r g i a k u s t a n n u k s i a a n + e n e r g i a k u s t a n n u k s i i n + e n e r g i a k u s t a n n u k s i s s a + e n e r g i a k u s t a n n u k s i s t a + e n e r g i a k u s t a n n u s t e n + e n e r g i a k y s y m y k s e e n + e n e r g i a k y s y m y k s e k s i + e n e r g i a k y s y m y k s e l l ä + e n e r g i a k y s y m y k s e n + e n e r g i a k y s y m y k s e s s ä + e n e r g i a k y s y m y k s e s t ä + e n e r g i a k y s y m y k s e t + e n e r g i a k y s y m y k s i i n + e n e r g i a k y s y m y k s i l l ä + e n e r g i a k y s y m y k s i s s ä + e n e r g i a k y s y m y k s i s t ä + e n e r g i a k y s y m y k s i ä + e n e r g i a k y s y m y s + e n e r g i a k y s y m y s t e n + e n e r g i a k y s y m y s t ä + e n e r g i a k y s y n n ä n + e n e r g i a k y s y n n ä s t ä ä n + e n e r g i a k y s y n t ä + e n e r g i a k ä s i t t e e n + e n e r g i a k ä y t t ö + e n e r g i a k ä y t ä v i e n + e n e r g i a k ä y t ä v i s t ä + e n e r g i a k ä y t ä v ä h a n k k e i s i i n + e n e r g i a k ä y t ä v ä n + e n e r g i a k ä y t ä v ä n ä + e n e r g i a k ä y t ä v ä s t ä + e n e r g i a k ä y t ä v ä t + e n e r g i a k ö y h y y d e l l e + e n e r g i a k ö y h y y d e l t ä + e n e r g i a k ö y h y y d e n + e n e r g i a k ö y h y y d e s s ä + e n e r g i a k ö y h y y d e s t ä + e n e r g i a k ö y h y y s + e n e r g i a k ö y h y y t e n ä + e n e r g i a k ö y h y y t t ä + e n e r g i a k ö y h ä t + e n e r g i a l a i n s ä ä d ä n n ö n + e n e r g i a l a i n s ä ä d ä n n ö s s ä + e n e r g i a l a i n s ä ä d ä n t ö + e n e r g i a l a i t o k s e n + e n e r g i a l a i t o k s i a + e n e r g i a l a i t o s t e n + e n e r g i a l a j e j a + e n e r g i a l a j i e n + e n e r g i a l a k i a + e n e r g i a l a s k u + e n e r g i a l a s k u i h i n + e n e r g i a l a s k u i s s a + e n e r g i a l a s k u j a + e n e r g i a l a s k u j a a n + e n e r g i a l a s k u j a m m e + e n e r g i a l a s k u j e n + e n e r g i a l a s k u n + e n e r g i a l a s k u n s a + e n e r g i a l a s k u s t a a n + e n e r g i a l a s k u t + e n e r g i a l i i k e t o i m i a + e n e r g i a l l a + e n e r g i a l u k u + e n e r g i a l u o k a t + e n e r g i a l u o k i t u k s e t + e n e r g i a l u o k i t u s t a + e n e r g i a l u o k k a + e n e r g i a l u o k k i i n + e n e r g i a l u v u n + e n e r g i a l u v u s t a + e n e r g i a l ä h d e + e n e r g i a l ä h d e t t ä + e n e r g i a l ä h d e v a l i k o i m a n + e n e r g i a l ä h d e v a l i k o i m a s t a a n + e n e r g i a l ä h t e e k s i + e n e r g i a l ä h t e e l l ä + e n e r g i a l ä h t e e m m e + e n e r g i a l ä h t e e n + e n e r g i a l ä h t e e n s ä + e n e r g i a l ä h t e e n ä + e n e r g i a l ä h t e e s e e n + e n e r g i a l ä h t e e s t ä + e n e r g i a l ä h t e e t + e n e r g i a l ä h t e i d e m m e + e n e r g i a l ä h t e i d e n + e n e r g i a l ä h t e i d e n s ä + e n e r g i a l ä h t e i k s i + e n e r g i a l ä h t e i l l e + e n e r g i a l ä h t e i l l ä + e n e r g i a l ä h t e i l t ä ä n + e n e r g i a l ä h t e i n ä + e n e r g i a l ä h t e i s i i n + e n e r g i a l ä h t e i s s ä + e n e r g i a l ä h t e i s t ä + e n e r g i a l ä h t e i s t ä ä n + e n e r g i a l ä h t e i t t e m m e + e n e r g i a l ä h t e i t ä + e n e r g i a l ä h t e i t ä m m e + e n e r g i a l ä h t e i t ä ä n + e n e r g i a m a a i l m a a n + e n e r g i a m a k s u j a + e n e r g i a m a k s u j e n + e n e r g i a m a k s u t + e n e r g i a m a l l i + e n e r g i a m a l l i a + e n e r g i a m a l l i m m e + e n e r g i a m a l l i n + e n e r g i a m a l l i s t a + e n e r g i a m a l l i t + e n e r g i a m a r k k i n a + e n e r g i a m a r k k i n a n s a + e n e r g i a m a r k k i n a r a k e n t e i d e n + e n e r g i a m a r k k i n a t + e n e r g i a m a r k k i n o i d e n + e n e r g i a m a r k k i n o i h i n + e n e r g i a m a r k k i n o i l l a + e n e r g i a m a r k k i n o i l l a m m e + e n e r g i a m a r k k i n o i l l e + e n e r g i a m a r k k i n o i s t a + e n e r g i a m a r k k i n o i t a + e n e r g i a m a r k k i n o i t a a n + e n e r g i a m a r k k i n o i t a m m e + e n e r g i a m a r k k i n o i t a n s a + e n e r g i a m a r k k i n o i t t e n + e n e r g i a m a t e r i a a l i e n + e n e r g i a m e k a n i s m e j a + e n e r g i a m e n o j e n s a + e n e r g i a m e r k i n n ä n + e n e r g i a m e r k i n n ä s t ä + e n e r g i a m e r k i n n ö i s s ä + e n e r g i a m e r k i n n ö i s t ä + e n e r g i a m e r k i n t ä + e n e r g i a m e r k i n t ä d i r e k t i i v i + e n e r g i a m e r k i n t ä d i r e k t i i v i l l ä + e n e r g i a m e r k i n t ä d i r e k t i i v i n + e n e r g i a m e r k i n t ä d i r e k t i i v i s t ä + e n e r g i a m e r k i n t ä m a l l i + e n e r g i a m e r k i n t ä ä + e n e r g i a m e r k i n t ä ä n + e n e r g i a m e r k i n t ö j e n + e n e r g i a m e r k i n t ö j ä + e n e r g i a m e r k k i + e n e r g i a m e t s ä + e n e r g i a m i e t i n n ö n + e n e r g i a m i n i s t e r i + e n e r g i a m i n i s t e r i e m m e + e n e r g i a m i n i s t e r i e n + e n e r g i a m i n i s t e r i l l e + e n e r g i a m i n i s t e r i n + e n e r g i a m i n i s t e r i n e u v o s t o a + e n e r g i a m i n i s t e r i t + e n e r g i a m i n i s t e r i ö + e n e r g i a m i n i s t e r i ö n + e n e r g i a m i n i s t e r i ö ö n + e n e r g i a m i t t a r e i l l a + e n e r g i a m m e + e n e r g i a m o n o p o l i e n + e n e r g i a m u o d o i l l a + e n e r g i a m u o d o i l l e + e n e r g i a m u o d o i s t a + e n e r g i a m u o d o k s i + e n e r g i a m u o d o l l e + e n e r g i a m u o d o n + e n e r g i a m u o d o t + e n e r g i a m u o t o + e n e r g i a m u o t o a + e n e r g i a m u o t o i h i n + e n e r g i a m u o t o j a + e n e r g i a m u o t o j e n + e n e r g i a m u o t o n a + e n e r g i a m u o t o o n + e n e r g i a m u u n t a j i a + e n e r g i a m ä ä r ä l l ä + e n e r g i a m ä ä r ä n + e n e r g i a m ä ä r ä s t ä + e n e r g i a n + e n e r g i a n a + e n e r g i a n e u v o s t o + e n e r g i a n e u v o s t o a + e n e r g i a n e u v o s t o l l e + e n e r g i a n e u v o s t o n + e n e r g i a n e u v o s t o s s a + e n e r g i a n h a l l i n n a s s a + e n e r g i a n h a l l i n t a + e n e r g i a n h a l l i n t a j ä r j e s t e l m i e n + e n e r g i a n h a n k i n n a n + e n e r g i a n h a n k i n n a s s a m m e + e n e r g i a n h a n k i n n a s t a m m e + e n e r g i a n h a n k i n n o i s s a + e n e r g i a n h a n k i n t a + e n e r g i a n h a n k i n t a a + e n e r g i a n h a n k i n t a a n + e n e r g i a n h a n k i n t a j ä r j e s t e l m ä n + e n e r g i a n h a n k i n t a l ä h t e i t ä + e n e r g i a n h i n n a n + e n e r g i a n h i n n a t + e n e r g i a n h i n t o i h i n + e n e r g i a n h i n t o j a + e n e r g i a n h i n t o j e n + e n e r g i a n h u o l t o s t r a t e g i a s t a + e n e r g i a n h u o l t o v a r m u u d e n + e n e r g i a n j a k e l u a + e n e r g i a n j a k e l u j ä r j e s t e l m i e n + e n e r g i a n j a k e l u l l a + e n e r g i a n j a k e l u s t a + e n e r g i a n j a k e l u v e r k k o j a + e n e r g i a n k e h i t y s j ä r j e s t ö n + e n e r g i a n k u l j e t u k s e n + e n e r g i a n k u l j e t u k s e t + e n e r g i a n k u l j e t u s j ä r j e s t e l m i ä + e n e r g i a n k u l j e t u s r e i t t i e n + e n e r g i a n k u l j e t u s s o p i m u k s i a + e n e r g i a n k u l j e t u s t a + e n e r g i a n k u l j e t u s v e r k k o j a + e n e r g i a n k u l j e t u s v e r k o t + e n e r g i a n k u l u t t a j a + e n e r g i a n k u l u t t a j a n + e n e r g i a n k u l u t t a j i e n + e n e r g i a n k u l u t t a j i l l e + e n e r g i a n k u l u t t a j i s t a + e n e r g i a n k u l u t u k s e e m m e + e n e r g i a n k u l u t u k s e e n + e n e r g i a n k u l u t u k s e l l a + e n e r g i a n k u l u t u k s e l t a a n + e n e r g i a n k u l u t u k s e m m e + e n e r g i a n k u l u t u k s e n + e n e r g i a n k u l u t u k s e n s a + e n e r g i a n k u l u t u k s e s s a + e n e r g i a n k u l u t u k s e s s a m m e + e n e r g i a n k u l u t u k s e s t a + e n e r g i a n k u l u t u k s e s t a a n + e n e r g i a n k u l u t u k s e s t a m m e + e n e r g i a n k u l u t u s + e n e r g i a n k u l u t u s m e r k i n t ä + e n e r g i a n k u l u t u s p o l i t i i k o i s t a + e n e r g i a n k u l u t u s t a + e n e r g i a n k u l u t u s t a a n + e n e r g i a n k u l u t u s t a m m e + e n e r g i a n k u l u t u s v e r o k s i + e n e r g i a n k u l u t u s v e r o s t a + e n e r g i a n k y s y n n ä n + e n e r g i a n k y s y n t ä + e n e r g i a n k y s y n t ä ä + e n e r g i a n k y s y n t ä ä n + e n e r g i a n k ä y t t ä j i e n + e n e r g i a n k ä y t t ä j i ä + e n e r g i a n k ä y t t ä j ä t + e n e r g i a n k ä y t t ö + e n e r g i a n k ä y t t ö a s t e + e n e r g i a n k ä y t t ö m m e + e n e r g i a n k ä y t t ö t a p a + e n e r g i a n k ä y t t ö t u t k i m u s t a + e n e r g i a n k ä y t t ö ä + e n e r g i a n k ä y t t ö ä m m e + e n e r g i a n k ä y t t ö ö n + e n e r g i a n k ä y t ö l l e + e n e r g i a n k ä y t ö n + e n e r g i a n k ä y t ö s s ä + e n e r g i a n k ä y t ö s s ä m m e + e n e r g i a n k ä y t ö s t ä + e n e r g i a n k ä y t ö s t ä m m e + e n e r g i a n l ä h d e + e n e r g i a n l ä h d e t t ä + e n e r g i a n l ä h t e e l l ä + e n e r g i a n l ä h t e e m m e + e n e r g i a n l ä h t e e n + e n e r g i a n l ä h t e e n s ä + e n e r g i a n l ä h t e e n ä + e n e r g i a n l ä h t e e s e e n + e n e r g i a n l ä h t e e s t ä + e n e r g i a n l ä h t e e t + e n e r g i a n l ä h t e i d e n + e n e r g i a n l ä h t e i l l e + e n e r g i a n l ä h t e i l l ä + e n e r g i a n l ä h t e i s i i n + e n e r g i a n l ä h t e i s t ä + e n e r g i a n l ä h t e i t ä + e n e r g i a n m u u n t a j i a + e n e r g i a n n ä l k ä + e n e r g i a n n ä l k ä i s e t + e n e r g i a n o r m e j a + e n e r g i a n s a + e n e r g i a n s a a n n i l l e + e n e r g i a n s a a n n i n + e n e r g i a n s a a n n i s t a + e n e r g i a n s a a n t i + e n e r g i a n s a a n t i a + e n e r g i a n s a a n t i i n + e n e r g i a n s a a n t i m a h d o l l i s u u d e t + e n e r g i a n s a a n t i m a h d o l l i s u u t t a + e n e r g i a n s a a n t i m e n e t e l m i ä + e n e r g i a n s a a n t i v a r m u u d e s s a + e n e r g i a n s a a n t i v a r m u u s + e n e r g i a n s a a n t i v a r m u u t e e n + e n e r g i a n s a a n t i v a r m u u t t a + e n e r g i a n s i i r r o i s t a + e n e r g i a n s i i r r o n + e n e r g i a n s i i r t o + e n e r g i a n s i i r t o i n f r a s t r u k t u u r i + e n e r g i a n s i i r t o k u s t a n n u k s i s t a + e n e r g i a n s i i r t o p u t k i a + e n e r g i a n s i i r t o s u u n n i t e l m a t + e n e r g i a n s i i r t o v e r k k o j a + e n e r g i a n s i i r t o v e r k o t + e n e r g i a n s ä ä n t e l y k o m i t e a a + e n e r g i a n s ä ä s t ä m i s e e n + e n e r g i a n s ä ä s t ö + e n e r g i a n s ä ä s t ö a s k e l i n + e n e r g i a n s ä ä s t ö i h i n + e n e r g i a n s ä ä s t ö i s t ä + e n e r g i a n s ä ä s t ö j e n + e n e r g i a n s ä ä s t ö j ä + e n e r g i a n s ä ä s t ö k a m p a n j a n + e n e r g i a n s ä ä s t ö k e i n o j a + e n e r g i a n s ä ä s t ö l a i t t e i t a + e n e r g i a n s ä ä s t ö l a m p p u j a + e n e r g i a n s ä ä s t ö l a m p u i s s a + e n e r g i a n s ä ä s t ö l a m p u t + e n e r g i a n s ä ä s t ö m a h d o l l i s u u d e t + e n e r g i a n s ä ä s t ö m a h d o l l i s u u k s i a + e n e r g i a n s ä ä s t ö m a h d o l l i s u u t e e n + e n e r g i a n s ä ä s t ö m e n e t e l m i ä + e n e r g i a n s ä ä s t ö m e n e t e l m ä t + e n e r g i a n s ä ä s t ö m e s s u i l l a + e n e r g i a n s ä ä s t ö n + e n e r g i a n s ä ä s t ö n o r m i e n + e n e r g i a n s ä ä s t ö o h j e l m a l l e + e n e r g i a n s ä ä s t ö o h j e l m a n + e n e r g i a n s ä ä s t ö o h j e l m a t + e n e r g i a n s ä ä s t ö p o t e n t i a a l i + e n e r g i a n s ä ä s t ö p o t e n t i a a l i a + e n e r g i a n s ä ä s t ö s o p i m u k s i a + e n e r g i a n s ä ä s t ö s s ä + e n e r g i a n s ä ä s t ö s t ä + e n e r g i a n s ä ä s t ö s u u n n i t e l m a a + e n e r g i a n s ä ä s t ö t + e n e r g i a n s ä ä s t ö t a v o i t e + e n e r g i a n s ä ä s t ö t a v o i t e t t a + e n e r g i a n s ä ä s t ö t a v o i t t e e m m e + e n e r g i a n s ä ä s t ö t a v o i t t e e n + e n e r g i a n s ä ä s t ö t a v o i t t e e t + e n e r g i a n s ä ä s t ö t a v o i t t e i d e n + e n e r g i a n s ä ä s t ö t a v o i t t e i s t a a n + e n e r g i a n s ä ä s t ö t a v o i t t e i t a + e n e r g i a n s ä ä s t ö t e k n o l o g i a n + e n e r g i a n s ä ä s t ö t e k n o l o g i a t + e n e r g i a n s ä ä s t ö t o i m e n p i t e e t + e n e r g i a n s ä ä s t ö t o i m e n p i t e i s i i n + e n e r g i a n s ä ä s t ö t o i m e n p i t e i t ä + e n e r g i a n s ä ä s t ö t o i m e t + e n e r g i a n s ä ä s t ö t o i m i a + e n e r g i a n s ä ä s t ö t o i m i e n + e n e r g i a n s ä ä s t ö t o i m i i n + e n e r g i a n s ä ä s t ö t y ö n + e n e r g i a n s ä ä s t ö t y ö s t ä + e n e r g i a n s ä ä s t ö v a a t i m u k s i a + e n e r g i a n s ä ä s t ö v i r a s t o + e n e r g i a n s ä ä s t ö ä + e n e r g i a n s ä ä s t ö ö n + e n e r g i a n s ä ä t ö t a v o i t e + e n e r g i a n t a r j o n n a s s a + e n e r g i a n t a r p e e m m e + e n e r g i a n t a r p e e n + e n e r g i a n t a r p e e n s a + e n e r g i a n t a r p e e s e e n + e n e r g i a n t a r p e e s t a + e n e r g i a n t a r p e e s t a m m e + e n e r g i a n t a r p e e t + e n e r g i a n t a r p e i s t a m m e + e n e r g i a n t a r v e + e n e r g i a n t a r v e t t a + e n e r g i a n t a r v e t t a a n + e n e r g i a n t e h o k k u u s t a v o i t e t t a + e n e r g i a n t e h o k k u u s t o i m i i n + e n e r g i a n t o i m i t t a j a + e n e r g i a n t o i m i t t a j a a + e n e r g i a n t o i m i t t a j a m a i d e n + e n e r g i a n t o i m i t t a j a m m e + e n e r g i a n t o i m i t t a j a n a + e n e r g i a n t o i m i t t a j a n s a + e n e r g i a n t o i m i t t a j a s t a + e n e r g i a n t o i m i t t a j a t + e n e r g i a n t o i m i t t a j i a + e n e r g i a n t o i m i t t a j i e n + e n e r g i a n t o i m i t t a j i i n s a + e n e r g i a n t o i m i t t a j i l l e + e n e r g i a n t o i m i t t a j i n a + e n e r g i a n t o i m i t t a j i s t a + e n e r g i a n t o i m i t u k s e n + e n e r g i a n t o i m i t u k s e t + e n e r g i a n t o i m i t u k s i a + e n e r g i a n t o i m i t u k s i i n + e n e r g i a n t o i m i t u k s i s s a + e n e r g i a n t o i m i t u k s i s t a + e n e r g i a n t o i m i t u s + e n e r g i a n t o i m i t u s e h t o i h i n + e n e r g i a n t o i m i t u s i n f r a s t r u k t u u r i n + e n e r g i a n t o i m i t u s k r i i s e i s t ä + e n e r g i a n t o i m i t u s k y v y s t ä ä n + e n e r g i a n t o i m i t u s l ä h t e e s t ä + e n e r g i a n t o i m i t u s l ä h t e e t + e n e r g i a n t o i m i t u s l ä h t e i l l e + e n e r g i a n t o i m i t u s l ä h t e i t ä + e n e r g i a n t o i m i t u s m a l l i e n + e n e r g i a n t o i m i t u s o h j e l m i a + e n e r g i a n t o i m i t u s r a t k a i s u n + e n e r g i a n t o i m i t u s r e i t i t + e n e r g i a n t o i m i t u s r e i t t i e n + e n e r g i a n t o i m i t u s s u u n n i t e l m a a + e n e r g i a n t o i m i t u s t a + e n e r g i a n t o i m i t u s t e m m e + e n e r g i a n t o i m i t u s t e n + e n e r g i a n t o i m i t u s v e r k k o j a + e n e r g i a n t u h l a u k s e e n + e n e r g i a n t u h l a u k s e n + e n e r g i a n t u h l a u k s e s t a + e n e r g i a n t u h l a u s + e n e r g i a n t u h l a u s t a + e n e r g i a n t u o n n i l l e + e n e r g i a n t u o n n i s t a + e n e r g i a n t u o n t i + e n e r g i a n t u o n t i a + e n e r g i a n t u o n t i i n + e n e r g i a n t u o t a n n o n + e n e r g i a n t u o t a n n o s s a + e n e r g i a n t u o t a n n o s s a m m e + e n e r g i a n t u o t a n n o s t a + e n e r g i a n t u o t a n t o + e n e r g i a n t u o t a n t o a + e n e r g i a n t u o t a n t o a a n + e n e r g i a n t u o t a n t o a l a + e n e r g i a n t u o t a n t o a l a l l a + e n e r g i a n t u o t a n t o a m m e + e n e r g i a n t u o t a n t o j ä r j e s t e l m ä + e n e r g i a n t u o t a n t o k a p a s i t e e t t i + e n e r g i a n t u o t a n t o k e i n o j a + e n e r g i a n t u o t a n t o l a i t o k s e n + e n e r g i a n t u o t a n t o l a i t o k s i a + e n e r g i a n t u o t a n t o l a i t o k s i l l e + e n e r g i a n t u o t a n t o l a i t o s t e n + e n e r g i a n t u o t a n t o m e n e t e l m i ä + e n e r g i a n t u o t a n t o m e n e t e l m ä l l e + e n e r g i a n t u o t a n t o m m e + e n e r g i a n t u o t a n t o m u o d o i l l a + e n e r g i a n t u o t a n t o m u o d o t + e n e r g i a n t u o t a n t o m u o t o + e n e r g i a n t u o t a n t o m u o t o j a + e n e r g i a n t u o t a n t o n s a + e n e r g i a n t u o t a n t o o n + e n e r g i a n t u o t a n t o p r o s e s s e i s t a + e n e r g i a n t u o t a n t o p r o s e s s i + e n e r g i a n t u o t a n t o t a p a + e n e r g i a n t u o t a n t o t a p o i h i n + e n e r g i a n t u o t a n t o t a p o j a + e n e r g i a n t u o t a n t o t a p o j a m m e + e n e r g i a n t u o t a n t o t a p o j e n + e n e r g i a n t u o t a n t o t e h o s t a a n + e n e r g i a n t u o t a n t o t e k n i i k a t + e n e r g i a n t u o t a n t o t e k n i i k k a a n + e n e r g i a n t u o t a n t o t e k n o l o g i a a + e n e r g i a n t u o t a n t o t e k n o l o g i o i t a + e n e r g i a n t u o t a n t o t e o l l i s u u d e n + e n e r g i a n t u o t a n t o y r i t y k s i ä + e n e r g i a n t u o t t a j a + e n e r g i a n t u o t t a j a n + e n e r g i a n t u o t t a j a n a + e n e r g i a n t u o t t a j a n s a + e n e r g i a n t u o t t a j a t + e n e r g i a n t u o t t a j i a + e n e r g i a n t u o t t a j i e n + e n e r g i a n t u o t t a j i i n + e n e r g i a n t u o t t a j i k s i + e n e r g i a n t u o t t a j i l l e + e n e r g i a n t u o t t a j i s t a + e n e r g i a n t u t k i m u k s e n + e n e r g i a n t u t k i m u s o h j e l m a n + e n e r g i a n v a i h t o + e n e r g i a n v o i t t o k y k y + e n e r g i a n ä k y m i ä + e n e r g i a n ä k y m ä t + e n e r g i a n ä k ö k o h d a t + e n e r g i a n ä k ö k o h t a a + e n e r g i a n ä k ö k o h t i i n + e n e r g i a n ä k ö k u l m i a + e n e r g i a o b s e r v a t o r i o n + e n e r g i a o h j e l m a + e n e r g i a o h j e l m a a + e n e r g i a o h j e l m a a n + e n e r g i a o h j e l m a n + e n e r g i a o h j e l m a s s a + e n e r g i a o h j e l m a v i r a s t o o n + e n e r g i a o h j e l m i a + e n e r g i a o h j e l m i e n + e n e r g i a o h j e l m i i n + e n e r g i a o h j e l m i l l e + e n e r g i a o h j e l m i s s a + e n e r g i a o h j e l m i s t a + e n e r g i a o l o t + e n e r g i a o m a v a r a i n e n + e n e r g i a o m a v a r a i s i k s i + e n e r g i a o m a v a r a i s u u d e n + e n e r g i a o m a v a r a i s u u d e s t a + e n e r g i a o m a v a r a i s u u s + e n e r g i a o m a v a r a i s u u t e e n + e n e r g i a o m a v a r a i s u u t e m m e + e n e r g i a o m a v a r a i s u u t t a + e n e r g i a o m a v a r a i s u u t t a m m e + e n e r g i a o m i n a i s u u k s i s t a + e n e r g i a o n g e l m a + e n e r g i a o n g e l m a a + e n e r g i a o n g e l m a a m m e + e n e r g i a o n g e l m a a n + e n e r g i a o n g e l m a m m e + e n e r g i a o n g e l m a n + e n e r g i a o n g e l m a s s a + e n e r g i a o n g e l m a t + e n e r g i a o n g e l m i a + e n e r g i a o n g e l m i e m m e + e n e r g i a o n g e l m i e n + e n e r g i a o n g e l m i i n + e n e r g i a o n g e l m i i n s a + e n e r g i a o n g e l m i l l e + e n e r g i a o n g e l m i s s a + e n e r g i a o n g e l m i s t a + e n e r g i a o r j a + e n e r g i a o s t o t + e n e r g i a o s u u d e s t a + e n e r g i a p a k e t i k s i + e n e r g i a p a k e t i l l a + e n e r g i a p a k e t i l l e + e n e r g i a p a k e t i n + e n e r g i a p a k e t i s s a + e n e r g i a p a k e t i s t a + e n e r g i a p a k e t t i + e n e r g i a p a k e t t i a + e n e r g i a p a k e t t i a a n + e n e r g i a p a k e t t i i n + e n e r g i a p a k e t t i n s a + e n e r g i a p a l e t t i i n + e n e r g i a p a l v e l u d i r e k t i i v i n + e n e r g i a p a l v e l u d i r e k t i i v i s t ä + e n e r g i a p a l v e l u i d e n + e n e r g i a p a l v e l u i h i n + e n e r g i a p a l v e l u i s s a + e n e r g i a p a l v e l u i s t a + e n e r g i a p a l v e l u i t a + e n e r g i a p a l v e l u j a + e n e r g i a p a l v e l u j e n + e n e r g i a p a l v e l u m a r k k i n a t + e n e r g i a p a l v e l u m a r k k i n o i d e n + e n e r g i a p a l v e l u t + e n e r g i a p a n e e l i + e n e r g i a p a n o s t a + e n e r g i a p e l a a j a t + e n e r g i a p e r i a a t e + e n e r g i a p e r u s k i r j a + e n e r g i a p e r u s k i r j a a + e n e r g i a p e r u s k i r j a a n + e n e r g i a p e r u s k i r j a k o n f e r e n s s i n + e n e r g i a p e r u s k i r j a l l a + e n e r g i a p e r u s k i r j a n + e n e r g i a p e r u s k i r j a n s a + e n e r g i a p e r u s k i r j a o h j e l m a + e n e r g i a p e r u s k i r j a p r o s e s s i i n + e n e r g i a p e r u s k i r j a p r o s e s s i n + e n e r g i a p e r u s k i r j a s o p i m u k s e n + e n e r g i a p e r u s k i r j a s o p i m u s + e n e r g i a p e r u s k i r j a s s a + e n e r g i a p e r u s k i r j a s s a k i n + e n e r g i a p e r u s k i r j a s t a + e n e r g i a p e r u s s o p i m u k s e n + e n e r g i a p e r u s t a a + e n e r g i a p o h j a n + e n e r g i a p o l i i t t i n e n + e n e r g i a p o l i i t t i s e e n + e n e r g i a p o l i i t t i s e k s i + e n e r g i a p o l i i t t i s e l t a + e n e r g i a p o l i i t t i s e n + e n e r g i a p o l i i t t i s e n a + e n e r g i a p o l i i t t i s e s t a + e n e r g i a p o l i i t t i s e t + e n e r g i a p o l i i t t i s i a + e n e r g i a p o l i i t t i s i i n + e n e r g i a p o l i i t t i s i s s a + e n e r g i a p o l i i t t i s i s t a + e n e r g i a p o l i i t t i s t a + e n e r g i a p o l i i t t i s t e n + e n e r g i a p o l i t i i k a k s i + e n e r g i a p o l i t i i k a l l a + e n e r g i a p o l i t i i k a l l a m m e + e n e r g i a p o l i t i i k a l l e + e n e r g i a p o l i t i i k a n + e n e r g i a p o l i t i i k a s s a + e n e r g i a p o l i t i i k a s s a k i n + e n e r g i a p o l i t i i k a s s a m m e + e n e r g i a p o l i t i i k a s t a + e n e r g i a p o l i t i i k a s t a a n + e n e r g i a p o l i t i i k a s t a m m e + e n e r g i a p o l i t i i k k a + e n e r g i a p o l i t i i k k a a + e n e r g i a p o l i t i i k k a a m m e + e n e r g i a p o l i t i i k k a a n + e n e r g i a p o l i t i i k k a a n s a + e n e r g i a p o l i t i i k k a m m e + e n e r g i a p o l i t i i k k a n s a + e n e r g i a p o l i t i i k k o i h i n + e n e r g i a p o l i t i i k k o j a + e n e r g i a p o l i t i i k k o j e n + e n e r g i a p o l i t i i k o i s t a + e n e r g i a p o t e n t i a a l i + e n e r g i a p o t e n t i a a l i a + e n e r g i a p o t e n t i a a l i n + e n e r g i a p o t e n t i a a l i t + e n e r g i a p r o j e k t i i n + e n e r g i a p r o s e s s i i n + e n e r g i a p u i t e s o p i m u s + e n e r g i a p u l a + e n e r g i a p u l a a + e n e r g i a p u l a a n + e n e r g i a p u l a n + e n e r g i a p u l a s s a + e n e r g i a p u l a s t a + e n e r g i a p u t k e t + e n e r g i a p u t k i + e n e r g i a p u t k i l l e + e n e r g i a p ä ä k a u p u n g i k s i + e n e r g i a p ö r s s i l l e + e n e r g i a p ö r s s i n + e n e r g i a p ö r s s i s s ä + e n e r g i a r a h a s t o + e n e r g i a r a h a s t o j e n + e n e r g i a r a h o i t u k s e n + e n e r g i a r a h o i t u s t a + e n e r g i a r a k e n t e e t + e n e r g i a r a t k a i s u + e n e r g i a r a t k a i s u a + e n e r g i a r a t k a i s u i h i m m e + e n e r g i a r a t k a i s u i s t a + e n e r g i a r a t k a i s u j a + e n e r g i a r a t k a i s u j e n + e n e r g i a r a t k a i s u t + e n e r g i a r e i t t i e n + e n e r g i a r e i t t i ä + e n e r g i a r e m o n t t i a + e n e r g i a r e s e r v i t + e n e r g i a r e s u r s s e i s t a + e n e r g i a r e s u r s s e j a + e n e r g i a r e s u r s s e j a a n + e n e r g i a r e s u r s s i + e n e r g i a r e s u r s s i e n + e n e r g i a r e s u r s s i p u l a s t a + e n e r g i a r e s u r s s i t + e n e r g i a r i i p p u m a t t o m u u d e n + e n e r g i a r i i p p u m a t t o m u u d e s t a + e n e r g i a r i i p p u m a t t o m u u s + e n e r g i a r i i p p u m a t t o m u u t e e n + e n e r g i a r i i p p u m a t t o m u u t e m m e + e n e r g i a r i i p p u m a t t o m u u t e n s a + e n e r g i a r i i p p u m a t t o m u u t t a + e n e r g i a r i i p p u v a i s i n + e n e r g i a r i i p p u v a i s u u t t a a n + e n e r g i a r i i p p u v u u d e l l a + e n e r g i a r i i p p u v u u d e n + e n e r g i a r i i p p u v u u d e s t a + e n e r g i a r i i p p u v u u d e s t a m m e + e n e r g i a r i i p p u v u u s + e n e r g i a r i i p p u v u u s m ä ä r ä y k s i ä + e n e r g i a r i i p p u v u u s o n g e l m a t + e n e r g i a r i i p p u v u u t e e n + e n e r g i a r i i p p u v u u t e m m e + e n e r g i a r i i p p u v u u t e n s a + e n e r g i a r i i p p u v u u t t a + e n e r g i a r i i p p u v u u t t a a n + e n e r g i a r i i p p u v u u t t a m m e + e n e r g i a r u i s k e e n + e n e r g i a r y h m i s t ä + e n e r g i a s a a r e k k e e k s i + e n e r g i a s a a r e k k e e n + e n e r g i a s a a r e k k e i d e n + e n e r g i a s a a r e k k e i k s i + e n e r g i a s a a r e k k e i t a + e n e r g i a s a a r r o n + e n e r g i a s a t a m i a + e n e r g i a s e k t o r i + e n e r g i a s e k t o r i a + e n e r g i a s e k t o r i a a n + e n e r g i a s e k t o r i i n + e n e r g i a s e k t o r i l l a + e n e r g i a s e k t o r i l l e + e n e r g i a s e k t o r i n + e n e r g i a s e k t o r i n s a + e n e r g i a s e k t o r i s t a + e n e r g i a s i l l a n + e n e r g i a s i l t a a n + e n e r g i a s i s ä l t ö + e n e r g i a s i s ä l t ö ä + e n e r g i a s i s ä m a r k k i n o i d e n + e n e r g i a s i t o u m u s t e n + e n e r g i a s k e n a a r i o i d e n + e n e r g i a s k e n a a r i o t a + e n e r g i a s o l i d a a r i s u u d e n + e n e r g i a s o l i d a a r i s u u d e s t a + e n e r g i a s o l i d a a r i s u u s + e n e r g i a s o l i d a a r i s u u s l a u s e k k e e n + e n e r g i a s o l i d a a r i s u u t t a + e n e r g i a s o p i m u k s e e n + e n e r g i a s o p i m u k s e n + e n e r g i a s o p i m u k s i a + e n e r g i a s o p i m u k s i i n + e n e r g i a s o p i m u s + e n e r g i a s o p i m u s t a + e n e r g i a s o t a a + e n e r g i a s t a + e n e r g i a s t r a t e g i a + e n e r g i a s t r a t e g i a a + e n e r g i a s t r a t e g i a a m m e + e n e r g i a s t r a t e g i a a n + e n e r g i a s t r a t e g i a k s i + e n e r g i a s t r a t e g i a l l a + e n e r g i a s t r a t e g i a m m e + e n e r g i a s t r a t e g i a n + e n e r g i a s t r a t e g i a n s a + e n e r g i a s t r a t e g i a s s a + e n e r g i a s t r a t e g i a s s a a n + e n e r g i a s t r a t e g i a s s a m m e + e n e r g i a s t r a t e g i a s t a + e n e r g i a s t r a t e g i a s t a m m e + e n e r g i a s t r a t e g i a t + e n e r g i a s t r a t e g i o i d e n + e n e r g i a s t r a t e g i o i l l e + e n e r g i a s t r a t e g i o i s s a + e n e r g i a s t r a t e g i o i t a + e n e r g i a s t r a t e g i s i s t a + e n e r g i a s u h d e t t a + e n e r g i a s u h d e t t a m m e + e n e r g i a s u h t e e m m e + e n e r g i a s u h t e i d e m m e + e n e r g i a s u h t e i d e n + e n e r g i a s u h t e i l l a + e n e r g i a s u h t e i l l e m m e + e n e r g i a s u h t e i s i i n + e n e r g i a s u h t e i s s a + e n e r g i a s u h t e i s t a + e n e r g i a s u h t e i t a + e n e r g i a s u h t e i t a m m e + e n e r g i a s u u n n i t e l m a + e n e r g i a s u u n n i t e l m a a + e n e r g i a s u u n n i t e l m a a n + e n e r g i a s u u n n i t e l m a n + e n e r g i a s u u n n i t e l m a s s a a n + e n e r g i a s u u n n i t e l m a s t a + e n e r g i a s u u n n i t e l m a t + e n e r g i a s u u n n i t e l m i a + e n e r g i a s u u n n i t e l m i s s a + e n e r g i a s u u n n i t e l m i s s a a n + e n e r g i a s u u n n i t t e l u + e n e r g i a s u u n n i t t e l u a + e n e r g i a s u u n n i t t e l u n + e n e r g i a s u u n n i t t e l u u n + e n e r g i a s u u r v a l t o j e n + e n e r g i a s y i s t ä + e n e r g i a s y s ä y s t ä + e n e r g i a s y ö p p ö + e n e r g i a s ä ä s t ö i h i n + e n e r g i a s ä ä s t ö i s t ä + e n e r g i a s ä ä s t ö i s t ä ä n + e n e r g i a s ä ä s t ö j e n + e n e r g i a s ä ä s t ö j ä + e n e r g i a s ä ä s t ö l a m p p u + e n e r g i a s ä ä s t ö n + e n e r g i a s ä ä s t ö t + e n e r g i a s ä ä s t ö t e k n i i k k a + e n e r g i a s ä ä s t ö ä + e n e r g i a s ä ä s t ö ö n + e n e r g i a s ä ä t i ö n + e n e r g i a t a l o u d e l l e + e n e r g i a t a l o u d e l l i s e t + e n e r g i a t a l o u d e n + e n e r g i a t a l o u d e s s a + e n e r g i a t a l o u s + e n e r g i a t a l o u t e e n + e n e r g i a t a l o u t e m m e + e n e r g i a t a l o u t t a + e n e r g i a t a l o u t t a a n + e n e r g i a t a r i f f i e n + e n e r g i a t a r j o n n a n + e n e r g i a t a r j o n t a a + e n e r g i a t a r j o n t a a m m e + e n e r g i a t a r k a s t u s t e n + e n e r g i a t a r k o i t u k s i i n + e n e r g i a t a r k o i t u k s i s s a + e n e r g i a t a r p e e m m e + e n e r g i a t a r p e e n + e n e r g i a t a r p e e n s a + e n e r g i a t a r p e e s e e n + e n e r g i a t a r p e e s t a + e n e r g i a t a r p e e s t a m m e + e n e r g i a t a r p e e t + e n e r g i a t a r p e i d e m m e + e n e r g i a t a r p e i d e n + e n e r g i a t a r p e i d e n s a + e n e r g i a t a r p e i s i i n + e n e r g i a t a r p e i s i i n s a + e n e r g i a t a r p e i s t a + e n e r g i a t a r p e i s t a a n + e n e r g i a t a r p e i t a + e n e r g i a t a r p e i t a a n + e n e r g i a t a r p e i t a m m e + e n e r g i a t a r v e + e n e r g i a t a r v e t t a + e n e r g i a t a s a p a i n o + e n e r g i a t a s a p a i n o o m m e + e n e r g i a t a s a p a i n o o n + e n e r g i a t a s a p a i n o s s a + e n e r g i a t a s e + e n e r g i a t a s e i s i i n + e n e r g i a t a s e t t a a n + e n e r g i a t a v o i t t e e s t a + e n e r g i a t a v o i t t e e t + e n e r g i a t a v o i t t e i d e n + e n e r g i a t a v o i t t e i n + e n e r g i a t a v o i t t e i s t a + e n e r g i a t a v o i t t e i t a + e n e r g i a t e h o k a s t a + e n e r g i a t e h o k k a a k s i + e n e r g i a t e h o k k a a m m a k s i + e n e r g i a t e h o k k a a m m a n + e n e r g i a t e h o k k a a m m a t + e n e r g i a t e h o k k a a m m i l l e + e n e r g i a t e h o k k a a m m i n + e n e r g i a t e h o k k a a m m i s t a + e n e r g i a t e h o k k a a m p i + e n e r g i a t e h o k k a a m p i a + e n e r g i a t e h o k k a a m p i e n + e n e r g i a t e h o k k a a m p i i n + e n e r g i a t e h o k k a a n + e n e r g i a t e h o k k a a s e e n + e n e r g i a t e h o k k a a t + e n e r g i a t e h o k k a i d e n + e n e r g i a t e h o k k a i k s i + e n e r g i a t e h o k k a i l l a + e n e r g i a t e h o k k a i l l e + e n e r g i a t e h o k k a i m m a n + e n e r g i a t e h o k k a i m m a t + e n e r g i a t e h o k k a i m m i l t a + e n e r g i a t e h o k k a i m p i a + e n e r g i a t e h o k k a i n + e n e r g i a t e h o k k a i n t a + e n e r g i a t e h o k k a i s i i n + e n e r g i a t e h o k k a i s t a + e n e r g i a t e h o k k a i t a + e n e r g i a t e h o k k u u d e l l a + e n e r g i a t e h o k k u u d e l l e + e n e r g i a t e h o k k u u d e l t a a n + e n e r g i a t e h o k k u u d e n + e n e r g i a t e h o k k u u d e s s a + e n e r g i a t e h o k k u u d e s t a + e n e r g i a t e h o k k u u s + e n e r g i a t e h o k k u u s a l a n + e n e r g i a t e h o k k u u s a r v o t + e n e r g i a t e h o k k u u s d i r e k t i i v i n + e n e r g i a t e h o k k u u s f o o r u m i n + e n e r g i a t e h o k k u u s h a a s t e e s e e n + e n e r g i a t e h o k k u u s h a n k k e i t a + e n e r g i a t e h o k k u u s i n d i k a a t t o r i e n + e n e r g i a t e h o k k u u s i n v e s t o i n t e j a + e n e r g i a t e h o k k u u s i n v e s t o i n t i n s a + e n e r g i a t e h o k k u u s k r i t e e r i s t ä + e n e r g i a t e h o k k u u s k r i t e e r i t + e n e r g i a t e h o k k u u s k y s y m y k s e n + e n e r g i a t e h o k k u u s k y s y m y k s e s s ä + e n e r g i a t e h o k k u u s k y s y m y k s i s s ä + e n e r g i a t e h o k k u u s l a i n s ä ä d ä n n ö n + e n e r g i a t e h o k k u u s l u o k a t + e n e r g i a t e h o k k u u s l u o k i t u s + e n e r g i a t e h o k k u u s l u o k i t u s t a + e n e r g i a t e h o k k u u s l u o k k a + e n e r g i a t e h o k k u u s l u o k k a a n + e n e r g i a t e h o k k u u s m a r k k i n o i t a + e n e r g i a t e h o k k u u s m e n e t e l m i ä + e n e r g i a t e h o k k u u s m e r k i n n ä t + e n e r g i a t e h o k k u u s m e r k i n t ä + e n e r g i a t e h o k k u u s m e r k i n t ä ä + e n e r g i a t e h o k k u u s m e r k i n t ö j ä + e n e r g i a t e h o k k u u s n o r m i t + e n e r g i a t e h o k k u u s o h j e l m a t + e n e r g i a t e h o k k u u s o h j e l m i i n + e n e r g i a t e h o k k u u s p a k e t i n + e n e r g i a t e h o k k u u s p a k e t t i + e n e r g i a t e h o k k u u s p a k e t t i a + e n e r g i a t e h o k k u u s p a l v e l u j e n + e n e r g i a t e h o k k u u s p o l i t i i k a n + e n e r g i a t e h o k k u u s p o l i t i i k k a + e n e r g i a t e h o k k u u s p o l i t i i k k a a + e n e r g i a t e h o k k u u s p o l i t i i k k o j a + e n e r g i a t e h o k k u u s p o l i t i i k k o j e n + e n e r g i a t e h o k k u u s p o t e n t i a a l i a + e n e r g i a t e h o k k u u s p o t e n t i a a l i s t a + e n e r g i a t e h o k k u u s r a h a s t o + e n e r g i a t e h o k k u u s r a h a s t o j a + e n e r g i a t e h o k k u u s r a h a s t o j e n + e n e r g i a t e h o k k u u s r a h o i t u k s e n + e n e r g i a t e h o k k u u s s i t o u m u s t e n + e n e r g i a t e h o k k u u s s t a n d a r d e j a + e n e r g i a t e h o k k u u s s u u n n i t e l m a + e n e r g i a t e h o k k u u s s u u n n i t e l m a a + e n e r g i a t e h o k k u u s s u u n n i t e l m a n + e n e r g i a t e h o k k u u s s u u n n i t e l m a s t a + e n e r g i a t e h o k k u u s s u u n n i t e l m i a a n + e n e r g i a t e h o k k u u s s y i s t ä + e n e r g i a t e h o k k u u s s ä ä s t ö j e n + e n e r g i a t e h o k k u u s t a r p e e n + e n e r g i a t e h o k k u u s t a s o + e n e r g i a t e h o k k u u s t a s o n + e n e r g i a t e h o k k u u s t a v o i t e + e n e r g i a t e h o k k u u s t a v o i t e t t a + e n e r g i a t e h o k k u u s t a v o i t t e e n + e n e r g i a t e h o k k u u s t a v o i t t e e s t a + e n e r g i a t e h o k k u u s t a v o i t t e e t + e n e r g i a t e h o k k u u s t a v o i t t e i d e n + e n e r g i a t e h o k k u u s t a v o i t t e i s t a m m e + e n e r g i a t e h o k k u u s t a v o i t t e i t a + e n e r g i a t e h o k k u u s t e k n o l o g i o i t a + e n e r g i a t e h o k k u u s t o d i s t u k s e s s a + e n e r g i a t e h o k k u u s t o d i s t u k s e t + e n e r g i a t e h o k k u u s t o d i s t u k s i a + e n e r g i a t e h o k k u u s t o d i s t u s + e n e r g i a t e h o k k u u s t o i m e n p i d e + e n e r g i a t e h o k k u u s t o i m e n p i t e e t + e n e r g i a t e h o k k u u s t o i m e n p i t e i d e n + e n e r g i a t e h o k k u u s t o i m e n p i t e i n + e n e r g i a t e h o k k u u s t o i m e n p i t e i s i i n + e n e r g i a t e h o k k u u s t o i m e n p i t e i t ä + e n e r g i a t e h o k k u u s t o i m e n p i t e i t ä ä n + e n e r g i a t e h o k k u u s t o i m i a + e n e r g i a t e h o k k u u s t o i m i e n + e n e r g i a t e h o k k u u s t o i m i i n + e n e r g i a t e h o k k u u s t o i m i l l a + e n e r g i a t e h o k k u u s t o i m i n t a o h j e l m a s s a + e n e r g i a t e h o k k u u s t o i m i n t a s u u n n i t e l m a + e n e r g i a t e h o k k u u s t o i m i n t a s u u n n i t e l m a a + e n e r g i a t e h o k k u u s t o i m i n t a s u u n n i t e l m a n + e n e r g i a t e h o k k u u s t o i m i n t a s u u n n i t e l m a s t a + e n e r g i a t e h o k k u u s t o i m i n t a s u u n n i t e l m a t + e n e r g i a t e h o k k u u s t o i m i n t a s u u n n i t e l m i a + e n e r g i a t e h o k k u u s t o i m i s t a + e n e r g i a t e h o k k u u s t o i m i s t a m m e + e n e r g i a t e h o k k u u s t u l o k s e t + e n e r g i a t e h o k k u u s v a a t i m u k s e t + e n e r g i a t e h o k k u u s v a a t i m u k s i a + e n e r g i a t e h o k k u u s v a a t i m u k s i i n + e n e r g i a t e h o k k u u s y h t e i s t y ö t ä + e n e r g i a t e h o k k u u t e e n + e n e r g i a t e h o k k u u t e e n s a + e n e r g i a t e h o k k u u t e m m e + e n e r g i a t e h o k k u u t e n s a + e n e r g i a t e h o k k u u t t a + e n e r g i a t e h o k k u u t t a a n + e n e r g i a t e h o k k u u t t a m m e + e n e r g i a t e h o s t a + e n e r g i a t e h o t t o m a t + e n e r g i a t e k n i i k a n + e n e r g i a t e k n i i k a s s a + e n e r g i a t e k n i i k k a + e n e r g i a t e k n i i k k a a + e n e r g i a t e k n i i k k a a m m e + e n e r g i a t e k n i i k k a a n + e n e r g i a t e k n i i k o i d e n + e n e r g i a t e k n i i k o i h i n + e n e r g i a t e k n i i k o i l l e + e n e r g i a t e k n i i k o i t a + e n e r g i a t e k n o l o g i a + e n e r g i a t e k n o l o g i a a + e n e r g i a t e k n o l o g i a a n + e n e r g i a t e k n o l o g i a j ä r j e s t e l m ä t + e n e r g i a t e k n o l o g i a l l a + e n e r g i a t e k n o l o g i a n + e n e r g i a t e k n o l o g i a o h j e l m a + e n e r g i a t e k n o l o g i a s s a + e n e r g i a t e k n o l o g i a s t a + e n e r g i a t e k n o l o g i a s u u n n i t e l m a + e n e r g i a t e k n o l o g i a s u u n n i t e l m a a + e n e r g i a t e k n o l o g i a s u u n n i t e l m a a n + e n e r g i a t e k n o l o g i a s u u n n i t e l m a n + e n e r g i a t e k n o l o g i a s u u n n i t e l m a s s a + e n e r g i a t e k n o l o g i a s u u n n i t e l m a s t a + e n e r g i a t e k n o l o g i a t + e n e r g i a t e k n o l o g i a t u t k i m u k s e n + e n e r g i a t e k n o l o g i o i d e n + e n e r g i a t e k n o l o g i o i h i n + e n e r g i a t e k n o l o g i o i s t a + e n e r g i a t e k n o l o g i o i t a + e n e r g i a t e k n o l o g i s t e n + e n e r g i a t e o l l i s u u d e l l e + e n e r g i a t e o l l i s u u d e n + e n e r g i a t e o l l i s u u d e s s a + e n e r g i a t e o l l i s u u s + e n e r g i a t e o l l i s u u t e e m m e + e n e r g i a t e o l l i s u u t e e n + e n e r g i a t e o l l i s u u t e m m e + e n e r g i a t e o l l i s u u t t a + e n e r g i a t i e t o i s u u t t a + e n e r g i a t i e t o j e n + e n e r g i a t i h e y s + e n e r g i a t i l a n n e + e n e r g i a t i l a n n e t t a + e n e r g i a t i l a n n e t t a m m e + e n e r g i a t i l a n t e e m m e + e n e r g i a t i l a n t e e n + e n e r g i a t i l a n t e e s s a + e n e r g i a t i l a n t e e t + e n e r g i a t i l a s t o i n t i + e n e r g i a t i l a s t o i s t a + e n e r g i a t i l a s t o j a + e n e r g i a t i l a s t o j e n + e n e r g i a t i l a s t o j ä r j e s t e l m ä ä + e n e r g i a t i l a s t o p r o s e s s i n + e n e r g i a t i l a s t o t + e n e r g i a t o d i s t u k s e t + e n e r g i a t o i m e n p i t e i t ä + e n e r g i a t o i m i a + e n e r g i a t o i m i e n + e n e r g i a t o i m i l l e + e n e r g i a t o i m i n t a s u u n n i t e l m a + e n e r g i a t o i m i n t a s u u n n i t e l m a a n + e n e r g i a t o i m i n t a s u u n n i t e l m a n + e n e r g i a t o i m i t t a j i e n + e n e r g i a t o i m i t t a j i i n + e n e r g i a t o i m i t u k s e e n + e n e r g i a t o i m i t u k s e m m e + e n e r g i a t o i m i t u k s e n + e n e r g i a t o i m i t u k s e n s a + e n e r g i a t o i m i t u k s e s t a m m e + e n e r g i a t o i m i t u k s e t + e n e r g i a t o i m i t u k s i a + e n e r g i a t o i m i t u k s i i n + e n e r g i a t o i m i t u k s i l l e + e n e r g i a t o i m i t u k s i s s a + e n e r g i a t o i m i t u k s i s t a + e n e r g i a t o i m i t u k s i s t a m m e + e n e r g i a t o i m i t u s + e n e r g i a t o i m i t u s k r i i s i + e n e r g i a t o i m i t u s l ä h t e i d e n + e n e r g i a t o i m i t u s l ä h t e i t ä ä n + e n e r g i a t o i m i t u s s t r a t e g i a a + e n e r g i a t o i m i t u s t a + e n e r g i a t o i m i t u s t e m m e + e n e r g i a t o i m i t u s t e n + e n e r g i a t o i m i t u s t e n s a + e n e r g i a t o i m i t u s v a r m u u d e n + e n e r g i a t u e t + e n e r g i a t u h l a u s + e n e r g i a t u k i + e n e r g i a t u l e v a i s u u s + e n e r g i a t u l e v a i s u u t e e n + e n e r g i a t u l e v a i s u u t e m m e + e n e r g i a t u l e v a i s u u t t a + e n e r g i a t u o n t i i n + e n e r g i a t u o t a n n o l l a + e n e r g i a t u o t a n n o l l e + e n e r g i a t u o t a n n o n + e n e r g i a t u o t a n n o s s a + e n e r g i a t u o t a n n o s t a + e n e r g i a t u o t a n t o + e n e r g i a t u o t a n t o a + e n e r g i a t u o t a n t o o n + e n e r g i a t u o t a n t o t a p o j e n + e n e r g i a t u o t e d i r e k t i i v i s t ä + e n e r g i a t u o t t a j a t + e n e r g i a t u o t t e e t + e n e r g i a t u o t t e i d e n + e n e r g i a t u o t t e i l l a + e n e r g i a t u o t t e i l l e + e n e r g i a t u o t t e i s i i n + e n e r g i a t u o t t e i s t a + e n e r g i a t u o t t e i t a + e n e r g i a t u r v a + e n e r g i a t u r v a l l i s u u d e l l e + e n e r g i a t u r v a l l i s u u d e n + e n e r g i a t u r v a l l i s u u d e s s a + e n e r g i a t u r v a l l i s u u d e s t a + e n e r g i a t u r v a l l i s u u d e s t a a n + e n e r g i a t u r v a l l i s u u s + e n e r g i a t u r v a l l i s u u s k y s y m y k s i s s ä + e n e r g i a t u r v a l l i s u u s l a u s e k k e e n + e n e r g i a t u r v a l l i s u u s p o l i t i i k a l l e + e n e r g i a t u r v a l l i s u u s p o l i t i i k a n + e n e r g i a t u r v a l l i s u u s p o l i t i i k a s t a + e n e r g i a t u r v a l l i s u u s p o l i t i i k k a + e n e r g i a t u r v a l l i s u u s p o l i t i i k k a a + e n e r g i a t u r v a l l i s u u s p o l i t i i k k a a n + e n e r g i a t u r v a l l i s u u t e e n + e n e r g i a t u r v a l l i s u u t e m m e + e n e r g i a t u r v a l l i s u u t t a + e n e r g i a t u r v a l l i s u u t t a m m e + e n e r g i a t u r v a n + e n e r g i a t u t k i m u k s e e n + e n e r g i a t u t k i m u k s e n + e n e r g i a t u t k i m u k s e s s a + e n e r g i a t u t k i m u s + e n e r g i a t u t k i m u s o h j e l m i i n + e n e r g i a t u t k i m u s r a h a t + e n e r g i a t u t k i m u s r a h o i t u k s e n + e n e r g i a t u t k i m u s t a + e n e r g i a t y h j i ö n + e n e r g i a t y y p p i e n + e n e r g i a u l k o p o l i t i i k a n + e n e r g i a u l k o p o l i t i i k a s s a + e n e r g i a u l k o p o l i t i i k k a + e n e r g i a u l k o p o l i t i i k k a a + e n e r g i a u l k o p o l i t i i k k a l i n j a n + e n e r g i a u l k o s u h t e i s t a + e n e r g i a u l o t t u v u u d e n + e n e r g i a u l o t t u v u u s + e n e r g i a u l o t t u v u u t t a + e n e r g i a u u d i s t u s t a + e n e r g i a v a a t i m u k s i a + e n e r g i a v a a t i m u k s i i n s a + e n e r g i a v a a t i m u k s i s t a + e n e r g i a v a a t i m u s t e n + e n e r g i a v a i h t o e h d o i s t a + e n e r g i a v a i h t o e h d o s t a + e n e r g i a v a i h t o e h t o a + e n e r g i a v a i h t o e h t o i h i n + e n e r g i a v a i h t o e h t o j a + e n e r g i a v a i h t o e h t o j e n + e n e r g i a v a i h t o e h t o o n + e n e r g i a v a i k u t u k s i a + e n e r g i a v a j e + e n e r g i a v a j e e n + e n e r g i a v a j e e s t a + e n e r g i a v a j e t t a + e n e r g i a v a k a u d e n + e n e r g i a v a l i k o i m a + e n e r g i a v a l i k o i m a a + e n e r g i a v a l i k o i m a a m m e + e n e r g i a v a l i n n a t + e n e r g i a v a l i n n o i l l e + e n e r g i a v a l i n n o i s t a a n + e n e r g i a v a l i n t a a n + e n e r g i a v a l i n t o i h i n + e n e r g i a v a l i n t o j a + e n e r g i a v a l i n t o j a m m e + e n e r g i a v a l i o k u n n a n + e n e r g i a v a l i o k u n n a s s a + e n e r g i a v a l i o k u n t a + e n e r g i a v a l i o k u n t a n a + e n e r g i a v a l l a n k u m o u k s e n + e n e r g i a v a l l a n k u m o u s + e n e r g i a v a l t a i s e l l a + e n e r g i a v a l t a i s e l l e + e n e r g i a v a l t a i s e n + e n e r g i a v a l t a i s e t + e n e r g i a v a l t a i s i a + e n e r g i a v a l t a i s i l l e + e n e r g i a v a l t a i s t e n + e n e r g i a v a l t a i s u u d e n + e n e r g i a v a l t o i h i n + e n e r g i a v a r a + e n e r g i a v a r a m m e + e n e r g i a v a r a n n o s t a m m e + e n e r g i a v a r a n n o t + e n e r g i a v a r a n t o j a + e n e r g i a v a r a n t o j a a n + e n e r g i a v a r a s t o i n t i k e i n o j a + e n e r g i a v a r a s t o j a + e n e r g i a v a r a t + e n e r g i a v a r m a + e n e r g i a v a r m u u d e l l a + e n e r g i a v a r m u u d e l l e + e n e r g i a v a r m u u d e n + e n e r g i a v a r m u u d e s s a + e n e r g i a v a r m u u d e s t a + e n e r g i a v a r m u u s + e n e r g i a v a r m u u s a s i o i s s a + e n e r g i a v a r m u u s k y s y m y k s i s t ä + e n e r g i a v a r m u u s k y s y m y s + e n e r g i a v a r m u u s o n g e l m a t + e n e r g i a v a r m u u s p o l i t i i k a n + e n e r g i a v a r m u u s p o l i t i i k k a + e n e r g i a v a r m u u s p o l i t i i k k a a + e n e r g i a v a r m u u s r a k e n n e t t a + e n e r g i a v a r m u u s t a r p e e t + e n e r g i a v a r m u u t e e m m e + e n e r g i a v a r m u u t e e n + e n e r g i a v a r m u u t e m m e + e n e r g i a v a r m u u t t a + e n e r g i a v a r m u u t t a a n + e n e r g i a v a r m u u t t a m m e + e n e r g i a v a r o i h i m m e + e n e r g i a v a r o i h i n + e n e r g i a v a r o i k s i + e n e r g i a v a r o i l t a a n + e n e r g i a v a r o i n e e n + e n e r g i a v a r o i s s a + e n e r g i a v a r o i s t a + e n e r g i a v a r o i s t a a n + e n e r g i a v a r o i s t a m m e + e n e r g i a v a r o j a + e n e r g i a v a r o j a a n + e n e r g i a v a r o j a m m e + e n e r g i a v a r o j e n + e n e r g i a v a r o j e n s a + e n e r g i a v a s t a a v u u t t a + e n e r g i a v e r k k o + e n e r g i a v e r k k o a + e n e r g i a v e r k k o h a n k k e i t a + e n e r g i a v e r k k o i h i m m e + e n e r g i a v e r k k o i h i n + e n e r g i a v e r k k o j a + e n e r g i a v e r k k o j e n + e n e r g i a v e r k k o k e s k u k s e n + e n e r g i a v e r k k o m m e + e n e r g i a v e r k k o o n + e n e r g i a v e r k k o p o l i t i i k k a m m e + e n e r g i a v e r k k o y h t e y k s i e n + e n e r g i a v e r k k o y h t e y k s i i n + e n e r g i a v e r k k o y h t e y k s i ä + e n e r g i a v e r k o i l l a + e n e r g i a v e r k o i l l e + e n e r g i a v e r k o i l t a + e n e r g i a v e r k o i s s a + e n e r g i a v e r k o i s t a + e n e r g i a v e r k o n + e n e r g i a v e r k o s t a + e n e r g i a v e r k o s t o i l l a + e n e r g i a v e r k o s t o j a + e n e r g i a v e r k o s t o j e n + e n e r g i a v e r k o s t o n + e n e r g i a v e r k o s t o t + e n e r g i a v e r k o t + e n e r g i a v e r o + e n e r g i a v e r o a + e n e r g i a v e r o d i r e k t i i v i + e n e r g i a v e r o d i r e k t i i v i n + e n e r g i a v e r o d i r e k t i i v i s t ä + e n e r g i a v e r o e h d o t u k s e s s a + e n e r g i a v e r o i h i n + e n e r g i a v e r o i l l a + e n e r g i a v e r o i l l e + e n e r g i a v e r o i s t a + e n e r g i a v e r o j a + e n e r g i a v e r o j e n + e n e r g i a v e r o j ä r j e s t e l m ä + e n e r g i a v e r o j ä r j e s t e l m ä n + e n e r g i a v e r o l l a + e n e r g i a v e r o l t a + e n e r g i a v e r o m a l l i + e n e r g i a v e r o n + e n e r g i a v e r o o n + e n e r g i a v e r o s t a + e n e r g i a v e r o t + e n e r g i a v e r o t u k s e e n + e n e r g i a v e r o t u k s e l l a + e n e r g i a v e r o t u k s e n + e n e r g i a v e r o t u k s e s s a + e n e r g i a v e r o t u k s e s t a + e n e r g i a v e r o t u s + e n e r g i a v e r o t u s t a + e n e r g i a v i e j ä n + e n e r g i a v i i k k o + e n e r g i a v i l j e l m i e n + e n e r g i a v i l j e l m i ä + e n e r g i a v i l j e l y ä + e n e r g i a v i r a s t o + e n e r g i a v i r a s t o j e n + e n e r g i a v i r a s t o l l a + e n e r g i a v i r a s t o n + e n e r g i a v i r r a t + e n e r g i a v i r t a + e n e r g i a v i r t a a + e n e r g i a v i s i o + e n e r g i a v o i m a l a i t o k s e t + e n e r g i a v o i m a v a r a n s a + e n e r g i a v o i m a v a r a s u u n n i t t e l u s t a + e n e r g i a v o i m a v a r o j a + e n e r g i a v u o r o p u h e l u a + e n e r g i a v u o r o p u h e l u n + e n e r g i a v u o r o p u h e l u s s a + e n e r g i a v u o r o p u h e l u s t a + e n e r g i a v u o r o p u h e l u t + e n e r g i a v u o r o p u h e l u u n + e n e r g i a y h d i s t e l m ä + e n e r g i a y h d i s t e l m ä n + e n e r g i a y h d i s t e l m ä n s ä + e n e r g i a y h d i s t e l m ä s s ä + e n e r g i a y h d i s t e l m ä s s ä m m e + e n e r g i a y h d i s t e l m ä s t ä + e n e r g i a y h d i s t e l m ä s t ä ä n + e n e r g i a y h d i s t e l m ä ä + e n e r g i a y h d i s t e l m ä ä n + e n e r g i a y h d i s t e l m ä ä n s ä + e n e r g i a y h t e i s k u n t a + e n e r g i a y h t e i s t y ö + e n e r g i a y h t e i s t y ö a l a l l a + e n e r g i a y h t e i s t y ö h a n k k e i s s a + e n e r g i a y h t e i s t y ö l l e + e n e r g i a y h t e i s t y ö n + e n e r g i a y h t e i s t y ö s o p i m u s + e n e r g i a y h t e i s t y ö s o p i m u s t a + e n e r g i a y h t e i s t y ö s s ä + e n e r g i a y h t e i s t y ö s t ä + e n e r g i a y h t e i s t y ö t ä + e n e r g i a y h t e i s ö + e n e r g i a y h t e i s ö j e n + e n e r g i a y h t e i s ö j ä + e n e r g i a y h t e i s ö n + e n e r g i a y h t e i s ö s o p i m u k s e e n + e n e r g i a y h t e i s ö s o p i m u k s e n + e n e r g i a y h t e i s ö s t ä + e n e r g i a y h t e i s ö ä + e n e r g i a y h t e i s ö ö n + e n e r g i a y h t e y d e n + e n e r g i a y h t e y d e t + e n e r g i a y h t e y k s i e n + e n e r g i a y h t e y k s i ä + e n e r g i a y h t e y s + e n e r g i a y h t e y s v e r k o s t a + e n e r g i a y h t i ö + e n e r g i a y h t i ö i d e n + e n e r g i a y h t i ö i l l e + e n e r g i a y h t i ö i l l ä + e n e r g i a y h t i ö i s s ä + e n e r g i a y h t i ö i t ä + e n e r g i a y h t i ö i t ä m m e + e n e r g i a y h t i ö l l e + e n e r g i a y h t i ö t + e n e r g i a y h t i ö t ä + e n e r g i a y h t i ö ö n + e n e r g i a y k s i k k ö ä + e n e r g i a y k s i k ö n + e n e r g i a y l i j ä ä m ä + e n e r g i a y r i t y k s e t + e n e r g i a y r i t y s + e n e r g i a y r i t y s t e n + e n e r g i o i d e n + e n e r g i o i h i n + e n e r g i o i s t a + e n e r g i o i t a + e n e r g i s e m m i n + e n e r g i s e m m ä n + e n e r g i s e m p ä ä + e n e r g i s i ä + e n e r g i s y y d e l l ä ä n + e n e t s i t + e n g l a n n i k s i + e n g l a n n i n + e n g l a n n i n k e t t u k o i r a + e n g l a n n i n k i e l e n + e n g l a n n i n k i e l i n e n + e n g l a n n i n k i e l i s e e n + e n g l a n n i n k i e l i s e k s i + e n g l a n n i n k i e l i s e l l e + e n g l a n n i n k i e l i s e n + e n g l a n n i n k i e l i s e n ä + e n g l a n n i n k i e l i s e s s ä + e n g l a n n i n k i e l i s e s t ä + e n g l a n n i n k i e l i s i n ä + e n g l a n n i n k i e l i s i s s ä + e n g l a n n i n k i e l i s i ä + e n g l a n n i n k i e l i s t ä + e n g l a n n i n k ä ä p i ö t e r r i e r i + e n g l a n n i n p a i m e n k o i r a + e n g l a n n i n p e s u k a r h u k o i r a + e n g l a n n i n r a i h e i n ä + e n g l a n n i n s e t t e r i + e n g l a n n i n s i n i l i l j a + e n g l a n n i n t o r v i + e n g l a n n i n v i n t t i k o i r i e n + e n g l a n n i s s a + e n g l a n n i s s a k i n + e n g l a n t i a + e n g l a n t i a a n + e n g l a n t i i n + e n g l a n t i l a i n e n k i n + e n g l a n t i l a i s e n + e n g l a n t i l a i s e s s a + e n g l a n t i l a i s e s t a + e n g l a n t i l a i s e t + e n g l a n t i l a i s i a + e n g l a n t i l a i s i l l e + e n g l a n t i l a i s k a u p u n g i n + e n g l a n t i l a i s k o l l e g a n i + e n g l a n t i l a i s l e h t i ä + e n g l a n t i l a i s l i h a + e n g l a n t i l a i s p o t i l a a n + e n i m m i l l ä ä n + e n i m m ä i s a i k a + e n i m m ä i s a i k a a + e n i m m ä i s a i k a r a j a t + e n i m m ä i s a i k o j e n + e n i m m ä i s a j a n + e n i m m ä i s a j o a i k a + e n i m m ä i s a n n o s t e n + e n i m m ä i s a r v o a + e n i m m ä i s a r v o i h i n + e n i m m ä i s a r v o i s t a + e n i m m ä i s a r v o j a + e n i m m ä i s a r v o j e n + e n i m m ä i s a r v o n + e n i m m ä i s a r v o n a + e n i m m ä i s a r v o t + e n i m m ä i s h a p p o p i t o i s u u d e n + e n i m m ä i s h a r m o n i s o i n n i n + e n i m m ä i s h a r m o n i s o i n t i + e n i m m ä i s h a r m o n i s o i n t i a + e n i m m ä i s h a r m o n i s o i n t i s u u n n i t e l m a n + e n i m m ä i s h i n n a l l e + e n i m m ä i s h i n n a n + e n i m m ä i s h i n t a + e n i m m ä i s h i n t a a + e n i m m ä i s h i n t a t a s o n + e n i m m ä i s h i n t o j a + e n i m m ä i s h i n t o j e n + e n i m m ä i s i k ä + e n i m m ä i s i k ä r a j o j a + e n i m m ä i s i n t e n s i t e e t i n + e n i m m ä i s i n t e n s i t e e t t i + e n i m m ä i s i n t e n s i t e e t t i i n + e n i m m ä i s j a k s o a + e n i m m ä i s j ä ä m i ä + e n i m m ä i s j ä ä m ä p i t o i s u u k s i i n + e n i m m ä i s j ä ä m ä t a s o j e n + e n i m m ä i s k a p a s i t e e t t i + e n i m m ä i s k a p a s i t e e t t i a + e n i m m ä i s k e s t o + e n i m m ä i s k e s t o a + e n i m m ä i s k e s t o k s i + e n i m m ä i s k e s t o n + e n i m m ä i s k i i n t i ö i d e n + e n i m m ä i s k o k o a + e n i m m ä i s k o r o t u k s e n + e n i m m ä i s k o r v a u k s e n + e n i m m ä i s k o r v a u s + e n i m m ä i s k u l j e t u s a i k a + e n i m m ä i s k u l j e t u s a i k a a + e n i m m ä i s k u l j e t u s a j a n + e n i m m ä i s k u s t a n n u k s i a + e n i m m ä i s k ä y t t ö i k ä ä n s ä + e n i m m ä i s m a k s u a + e n i m m ä i s m a k s u a i k a + e n i m m ä i s m a k s u a i k a a + e n i m m ä i s m a k s u a i k o j e n + e n i m m ä i s m a k s u a j a k s i + e n i m m ä i s m a k s u j a + e n i m m ä i s m a t k o i s t a + e n i m m ä i s m ä ä r i e n + e n i m m ä i s m ä ä r i i n + e n i m m ä i s m ä ä r i k s i + e n i m m ä i s m ä ä r i l l ä + e n i m m ä i s m ä ä r i n ä + e n i m m ä i s m ä ä r i s s ä + e n i m m ä i s m ä ä r i s t ä + e n i m m ä i s m ä ä r i s t ä m m e + e n i m m ä i s m ä ä r i ä + e n i m m ä i s m ä ä r ä + e n i m m ä i s m ä ä r ä a i k a + e n i m m ä i s m ä ä r ä a j a s s a + e n i m m ä i s m ä ä r ä e h d o t u s t a + e n i m m ä i s m ä ä r ä i s t ä + e n i m m ä i s m ä ä r ä k s i + e n i m m ä i s m ä ä r ä n + e n i m m ä i s m ä ä r ä r a h a t + e n i m m ä i s m ä ä r ä r a h o j a + e n i m m ä i s m ä ä r ä s s ä + e n i m m ä i s m ä ä r ä s t ä + e n i m m ä i s m ä ä r ä t + e n i m m ä i s m ä ä r ä ä + e n i m m ä i s m ä ä r ä ä n + e n i m m ä i s n o p e u s + e n i m m ä i s n o p e u s r a j o i t u s + e n i m m ä i s n o p e u t t a + e n i m m ä i s n o r m i k s i + e n i m m ä i s o s u u s + e n i m m ä i s o s u u t e e n + e n i m m ä i s p a i n o a + e n i m m ä i s p a i n o r a j a + e n i m m ä i s p a l v e l u t + e n i m m ä i s p i d ä t y s a i k o j e n + e n i m m ä i s p i n t a + e n i m m ä i s p i t u u s + e n i m m ä i s p i t u u t t a + e n i m m ä i s p r o s e n t i s t a + e n i m m ä i s p r o s e n t t i m ä ä r ä + e n i m m ä i s p r o s e n t t i m ä ä r ä t + e n i m m ä i s p r o s e n t t i o s u u s + e n i m m ä i s p y y n n i n + e n i m m ä i s p ä ä s t ö j ä + e n i m m ä i s p ä ä s t ö t a s o + e n i m m ä i s r a j a + e n i m m ä i s r a j a a + e n i m m ä i s r a j a k s i + e n i m m ä i s r a j a n + e n i m m ä i s r a j a t + e n i m m ä i s r a j o i s s a + e n i m m ä i s r a j o i t u k s e n + e n i m m ä i s r a j o i t u k s i i n + e n i m m ä i s r a j o j a + e n i m m ä i s r a j o j e n + e n i m m ä i s r a n g a i s t u k s e k s i + e n i m m ä i s r a n g a i s t u k s e n + e n i m m ä i s r a n g a i s t u k s e s t a + e n i m m ä i s r a n g a i s t u k s e t + e n i m m ä i s r a n g a i s t u k s i a + e n i m m ä i s r a n g a i s t u k s i l l a + e n i m m ä i s r a n g a i s t u k s i l l e + e n i m m ä i s r a n g a i s t u s + e n i m m ä i s r a n g a i s t u s t a + e n i m m ä i s r a n g a i s t u s t e n + e n i m m ä i s s k e n a a r i o + e n i m m ä i s s t a n d a r d i n + e n i m m ä i s s u m m a a n + e n i m m ä i s s u m m a h a n + e n i m m ä i s s u m m a k s i + e n i m m ä i s s u m m a n + e n i m m ä i s s u m m a t + e n i m m ä i s s u m m i s s a + e n i m m ä i s s u o j a a n + e n i m m ä i s s ä ä n t e l y n + e n i m m ä i s t a r i f f i t + e n i m m ä i s t a s o + e n i m m ä i s t a s o a + e n i m m ä i s t a s o j a + e n i m m ä i s t a s o j e n + e n i m m ä i s t a s o k s i + e n i m m ä i s t a s o n + e n i m m ä i s t a s o o n + e n i m m ä i s t a s o s t a + e n i m m ä i s t a s o t + e n i m m ä i s t a v o i t t e e n + e n i m m ä i s t a v o i t t e e t + e n i m m ä i s t a v o i t t e i d e n + e n i m m ä i s t a v o i t t e i t a + e n i m m ä i s t i h e y t t ä + e n i m m ä i s t o i m i a k i n + e n i m m ä i s t u e n + e n i m m ä i s t u k e a + e n i m m ä i s t u k e e n + e n i m m ä i s t u k i e n + e n i m m ä i s t u l l e j a + e n i m m ä i s t u l l i a + e n i m m ä i s t u n t i m ä ä r ä ä + e n i m m ä i s t u o t o n + e n i m m ä i s t u o t t o a + e n i m m ä i s t u o t t o m a l l i n + e n i m m ä i s t u o t t o t a v o i t t e i s t a + e n i m m ä i s t y ö a i k a + e n i m m ä i s t y ö a i k a a + e n i m m ä i s t y ö a i k a a n + e n i m m ä i s t y ö a i k o j e n + e n i m m ä i s t y ö a j a k s i + e n i m m ä i s t y ö a j a n + e n i m m ä i s t y ö a j a s t a + e n i m m ä i s t y ö a j a s t a a n + e n i m m ä i s t y ö a j a t + e n i m m ä i s t y ö a j o i l l e + e n i m m ä i s v a a t i m u k s e t + e n i m m ä i s v a i k u t u s t e n + e n i m m ä i s v a s t u u + e n i m m ä i s v e r o a + e n i m m ä i s v e r o a s t e + e n i m m ä i s v e r o a s t e e n + e n i m m ä i s v e r o a s t e i t a + e n i m m ä i s v e r o m ä ä r i s t ä + e n i m m ä i s v e r o m ä ä r ä s t ä + e n i m m ä i s v e r o t a s o a + e n i m m ä i s v i i p e e n + e n i m m ä i s v i l j e l y a l a + e n i m m ä i s v o i t t o j e n + e n i m m ä i s y l ä r a j a + e n i m m ä i s y l ä r a j a a n + e n k e f a l o p a t i a a + e n k e f a l o p a t i a a n + e n k e f a l o p a t i a n + e n k e f a l o p a t i a t + e n k e f a l o p a t i o i d e n + e n k e f a l o p a t i o i h i n + e n k e f a l o p a t i o i s t a + e n k e f a l o p a t i o i t a + e n k e l e i t ä + e n k e l i a k a t e m i a + e n k e l i h i e r a r k i a + e n k e l i k e l l o + e n k e l i p e l i + e n k e l i t + e n n a k k o a + e n n a k k o a r v i o + e n n a k k o a r v i o e s i t y s + e n n a k k o a r v i o i d e n + e n n a k k o a r v i o i n n i s s a + e n n a k k o a r v i o i n n i s t a + e n n a k k o a r v i o i n t e j a + e n n a k k o a r v i o i n t i + e n n a k k o a r v i o i n t i a + e n n a k k o a r v i o i n t i s ä ä n n ö i s s ä + e n n a k k o a r v i o i s s a + e n n a k k o a r v i o i s t a + e n n a k k o a r v i o i t a + e n n a k k o a r v i o m m e + e n n a k k o a r v i o n + e n n a k k o a r v i o s s a + e n n a k k o a r v i o t a + e n n a k k o a s e n n e + e n n a k k o a s e n t e i d e n s a + e n n a k k o a s e n t e i t a + e n n a k k o a s i a k i r j a + e n n a k k o e d e l l y t y k s e e n + e n n a k k o e d e l l y t y k s e k s i + e n n a k k o e d e l l y t y k s e n ä + e n n a k k o e d e l l y t y k s e t + e n n a k k o e d e l l y t y k s i ä + e n n a k k o e d e l l y t y s + e n n a k k o e d e l l y t y s t e n + e n n a k k o e h d o i s t a + e n n a k k o e h d o k s i + e n n a k k o e h d o s t a + e n n a k k o e h d o t + e n n a k k o e h d o t t o m i i n + e n n a k k o e h t o + e n n a k k o e h t o j a + e n n a k k o e h t o j e n + e n n a k k o e h t o n a + e n n a k k o e p ä i l y ä + e n n a k k o e s i m e r k k i n ä + e n n a k k o e s i t t e l y ä + e n n a k k o h u o m a u t u k s i a + e n n a k k o h y v ä k s y n n ä n + e n n a k k o h y v ä k s y n n ä s t ä + e n n a k k o h y v ä k s y n t ä + e n n a k k o h y v ä k s y n t ä ä + e n n a k k o i l m o i t t a m i s e n + e n n a k k o i l m o i t t a m i s t a + e n n a k k o i l m o i t u k s e k s i + e n n a k k o i l m o i t u k s e n + e n n a k k o i l m o i t u k s i a + e n n a k k o i l m o i t u k s i i n + e n n a k k o i l m o i t u s + e n n a k k o i l m o i t u s j ä r j e s t e l m ä + e n n a k k o i l m o i t u s j ä r j e s t e l m ä ä + e n n a k k o i l m o i t u s m e n e t t e l y ä + e n n a k k o i l m o i t u s t a + e n n a k k o i l m o i t u s t e n + e n n a k k o i l m o i t u s v a i h e e s s a + e n n a k k o i l m o i t u s v e l v o l l i s u u d e s t a + e n n a k k o i l m o i t u s v e l v o l l i s u u s + e n n a k k o j a k e l u u n + e n n a k k o j ä s e n t ä j ä + e n n a k k o k e r t o m u k s e n + e n n a k k o k e s k u s t e l u + e n n a k k o k e s k u s t e l u l l a + e n n a k k o k o k e i t a + e n n a k k o k u u l e m i s e e n + e n n a k k o k u u l e m i s i a + e n n a k k o k u u l e m i s m e n e t t e l y s s ä + e n n a k k o k u u l e m i s m e n e t t e l y ä + e n n a k k o k y s y m y k s e s t ä + e n n a k k o k y s y m y s + e n n a k k o k y s y m y s t ä + e n n a k k o k ä s i t y k s i ä + e n n a k k o k ä s i t y s + e n n a k k o k ä s i t y s t ä + e n n a k k o k ä y t ö s t ä + e n n a k k o l a u s u m i e n + e n n a k k o l a u s u n n o n + e n n a k k o l u p a + e n n a k k o l u p a a + e n n a k k o l u p a a n + e n n a k k o l u p a a n n e + e n n a k k o l u p a j ä r j e s t e l m i e n + e n n a k k o l u p a j ä r j e s t e l m i ä + e n n a k k o l u p a j ä r j e s t e l m ä + e n n a k k o l u p a j ä r j e s t e l m ä l l ä + e n n a k k o l u p a j ä r j e s t e l m ä n + e n n a k k o l u p a j ä r j e s t e l m ä s t ä + e n n a k k o l u p a j ä r j e s t e l m ä ä + e n n a k k o l u p a j ä r j e s t e l m ä ä n + e n n a k k o l u p a k ä y t ä n t ö ä + e n n a k k o l u p a m e n e t t e l y t + e n n a k k o l u p a v a a t i m u k s e l l a + e n n a k k o l u u l o i h i n s a + e n n a k k o l u u l o i l l a + e n n a k k o l u u l o i s i a + e n n a k k o l u u l o i s t a + e n n a k k o l u u l o j a + e n n a k k o l u u l o j e n + e n n a k k o l u u l o t + e n n a k k o l u u l o t o n + e n n a k k o l u u l o t o n t a + e n n a k k o l u u l o t t o m a l l e + e n n a k k o l u u l o t t o m a m m i n + e n n a k k o l u u l o t t o m a s t a + e n n a k k o l u u l o t t o m i a + e n n a k k o l u u l o t t o m i m m a s t a + e n n a k k o l u u l o t t o m u u t t a + e n n a k k o l u v a l l e + e n n a k k o l u v a n + e n n a k k o l u v a s t a + e n n a k k o m a k s u + e n n a k k o m a k s u a + e n n a k k o m a k s u e r ä + e n n a k k o m a k s u i h i n + e n n a k k o m a k s u i n a + e n n a k k o m a k s u i s t a + e n n a k k o m a k s u j a + e n n a k k o m a k s u j e n + e n n a k k o m a k s u j ä r j e s t e l m ä + e n n a k k o m a k s u j ä r j e s t e l m ä n + e n n a k k o m a k s u j ä r j e s t e l y + e n n a k k o m a k s u j ä r j e s t e l y j e n + e n n a k k o m a k s u m e n e t t e l y n + e n n a k k o m a k s u n + e n n a k k o m a k s u t + e n n a k k o m a k s u t i l i l t ä + e n n a k k o m a k s u u n + e n n a k k o m e n o j a + e n n a k k o n e u v o t t e l u v a a t i m u s + e n n a k k o p ä ä t ö k s e n + e n n a k k o p ä ä t ö k s i ä + e n n a k k o p ä ä t ö s + e n n a k k o p ä ä t ö s t ä + e n n a k k o r a h o i t u k s e n + e n n a k k o r a h o i t u k s e s t a + e n n a k k o r a h o i t u s + e n n a k k o r a h o i t u s m a l l i a + e n n a k k o r a h o i t u s m a l l i n + e n n a k k o r a h o i t u s t a + e n n a k k o r a t k a i s u + e n n a k k o r a t k a i s u a + e n n a k k o r a t k a i s u j a + e n n a k k o r a t k a i s u j e n + e n n a k k o r a t k a i s u k y s y m y k s e t + e n n a k k o r a t k a i s u k y s y m y k s i ä + e n n a k k o r a t k a i s u k y s y m y s t e n + e n n a k k o r a t k a i s u m e n e t t e l y + e n n a k k o r a t k a i s u m e n e t t e l y y n + e n n a k k o r a t k a i s u m e n e t t e l y ä + e n n a k k o r a t k a i s u n + e n n a k k o r a t k a i s u p y y n n ö n + e n n a k k o r a t k a i s u p y y n t ö j ä + e n n a k k o r a t k a i s u p y y n t ö ä + e n n a k k o r a t k a i s u t a p a u k s i a + e n n a k k o r a t k a i s u v a i h e e s s a + e n n a k k o r a t k a i s u v a l t u u d e t + e n n a k k o r e k i s t e r ö i n n i n + e n n a k k o r e k i s t e r ö i n t i i n + e n n a k k o r e k i s t e r ö i n t i j a k s o l l a + e n n a k k o r e k i s t e r ö i n t i v a i h e + e n n a k k o r e k i s t e r ö i n t i ä + e n n a k k o s e l v i t y k s i i n + e n n a k k o s i i r r o i l l a + e n n a k k o s i j o i t u k s e t + e n n a k k o s u o r i t u k s i a + e n n a k k o s u o s t u m u k s e n + e n n a k k o s u o s t u m u k s e n s a + e n n a k k o s u o s t u m u s m e n e t t e l y + e n n a k k o s u o s t u m u s t a + e n n a k k o s u u n n i t e l m i a + e n n a k k o s u u n n i t t e l u s t a + e n n a k k o s ä ä n n ö s t ö t + e n n a k k o s ä ä n t e l y l l e + e n n a k k o s ä ä n t e l y y n + e n n a k k o t a p a u k s e k s i + e n n a k k o t a p a u k s e n + e n n a k k o t a p a u k s e n a + e n n a k k o t a p a u k s e s s a + e n n a k k o t a p a u k s i a + e n n a k k o t a p a u k s i s t a + e n n a k k o t a p a u s + e n n a k k o t a p a u s t a + e n n a k k o t a p a u s t e n + e n n a k k o t a r k a s t u k s e e n + e n n a k k o t a r k a s t u k s e n + e n n a k k o t a r k a s t u k s e t + e n n a k k o t a r k a s t u k s i a + e n n a k k o t a r k a s t u k s i i n + e n n a k k o t a r k a s t u k s i s s a + e n n a k k o t a r k a s t u s + e n n a k k o t a r k a s t u s j ä r j e s t e l m ä ä + e n n a k k o t a r k a s t u s m e n e t t e l y n + e n n a k k o t a r k a s t u s t a + e n n a k k o t a r k a s t u s t e n + e n n a k k o t a r k i s t u s + e n n a k k o t a r k i s t u s t a + e n n a k k o t i e d o s t a + e n n a k k o t i e d o t t a m i s e n + e n n a k k o t i e t o + e n n a k k o t i e t o a + e n n a k k o t i e t o j a + e n n a k k o t o i m e n p i t e i d e n + e n n a k k o t o i m e t + e n n a k k o t u t k i m u k s i a + e n n a k k o t u t k i m u s + e n n a k k o t y ö t + e n n a k k o v a a t i m u k s i a + e n n a k k o v a a t i m u s + e n n a k k o v a i h e e s t a + e n n a k k o v a l i n n a s t a + e n n a k k o v a l i n t a a + e n n a k k o v a l v o n n a n + e n n a k k o v a l v o n n a s s a + e n n a k k o v a l v o n n a s t a + e n n a k k o v a l v o n t a + e n n a k k o v a l v o n t a a + e n n a k k o v a l v o n t a a n + e n n a k k o v a r a a m i s e n + e n n a k k o v a r o i t u k s e n + e n n a k k o v a r o i t u k s e n a + e n n a k k o v a r o i t u k s e s t a + e n n a k k o v a r o i t u k s i a + e n n a k k o v a r o i t u k s i i n + e n n a k k o v a r o i t u k s i l l a + e n n a k k o v a r o i t u s + e n n a k k o v a r o i t u s a s e m i a + e n n a k k o v a r o i t u s j ä r j e s t e l m i e n + e n n a k k o v a r o i t u s j ä r j e s t e l m i i n + e n n a k k o v a r o i t u s j ä r j e s t e l m i ä + e n n a k k o v a r o i t u s j ä r j e s t e l m ä + e n n a k k o v a r o i t u s j ä r j e s t e l m ä n + e n n a k k o v a r o i t u s j ä r j e s t e l m ä n ä + e n n a k k o v a r o i t u s j ä r j e s t e l m ä s t ä + e n n a k k o v a r o i t u s j ä r j e s t e l m ä t + e n n a k k o v a r o i t u s j ä r j e s t e l m ä ä + e n n a k k o v a r o i t u s j ä r j e s t e l m ä ä n + e n n a k k o v a r o i t u s k i r j e e t + e n n a k k o v a r o i t u s k i r j e i t ä + e n n a k k o v a r o i t u s m e k a n i s m e j a + e n n a k k o v a r o i t u s m e k a n i s m i a + e n n a k k o v a r o i t u s m e k a n i s m i i n + e n n a k k o v a r o i t u s m e k a n i s m i n + e n n a k k o v a r o i t u s m e n e t t e l y n + e n n a k k o v a r o i t u s m e n e t t e l y s s ä + e n n a k k o v a r o i t u s r y h m ä + e n n a k k o v a r o i t u s t a + e n n a k k o v a r o i t u s t e n + e n n a k k o v a r o i t u s t o i m i n n a n + e n n a k k o v a r o i t u s v ä l i n e i t ä + e n n a k k o v e r o + e n n a k k o v e r o t u s t a + e n n a k k o v i h a m i e l i s y y t t ä + e n n a k k o v i i t t e i t ä + e n n a k k o ä ä n e s t y s + e n n a k k o ä ä n e s t y s t ä + e n n a k k o ä ä n i m e n e t t e l y n + e n n a k o i d a + e n n a k o i d a a n + e n n a k o i d e s s a a n + e n n a k o i h i n + e n n a k o i m a a n + e n n a k o i m a t t a + e n n a k o i m a t t o m a t + e n n a k o i m a t t o m i s t a + e n n a k o i m i s e k s i + e n n a k o i m i s k y v y n + e n n a k o i m i s t a + e n n a k o i m m e + e n n a k o i n n i n + e n n a k o i n t i a + e n n a k o i n t i i n + e n n a k o i n t i j ä r j e s t e l m i ä + e n n a k o i n t i j ä r j e s t e l m ä + e n n a k o i n t i k y k y ä + e n n a k o i n t i v a l m i u d e s t a + e n n a k o i t a v a a + e n n a k o i t a v a m m a s s a + e n n a k o i t a v a m p a a + e n n a k o i t a v a s t i + e n n a k o i t a v i s s a + e n n a k o i t i i n + e n n a k o i t u a + e n n a k o i v a a + e n n a k o i v a a n + e n n a k o i v a m m a n + e n n a k o i v a m m i n + e n n a k o i v a m p a a + e n n a k o i v a m p i + e n n a k o i v a m p i a + e n n a k o i v a n + e n n a k o i v a s s a + e n n a k o i v a s t a + e n n a k o i v i a + e n n a k o i v i m m i s t a + e n n a k o i v i s t a + e n n a k o n p i d ä t y k s e n + e n n a k o n p i d ä t y s + e n n a l l a a n + e n n a l l e e n + e n n a l l e e n p a l a u t t a m i s s u u n n i t e l m a n + e n n a l l i s t a m i s e e n + e n n a l l i s t a m i s t e h t ä v i s s ä + e n n a l l i s t a m i s t o i m i a + e n n a l l i s t a m i s t o i m i i n + e n n a l l i s t a m i s t o i m i s t a + e n n a l l i s t a m i s t y ö h ö n + e n n a l t a e h k ä i s e m i s e e n + e n n a l t a e h k ä i s e m i s e k s i + e n n a l t a e h k ä i s e v i e n + e n n a l t a e h k ä i s e v i i n + e n n a l t a e h k ä i s e v i s t ä + e n n a l t a e h k ä i s e v i ä + e n n a l t a e h k ä i s e v ä n + e n n a l t a e h k ä i s e v ä s s ä + e n n a l t a e h k ä i s e v ä t + e n n a l t a e h k ä i s e v ä ä + e n n a l t a e h k ä i s e v ä ä n + e n n a l t a e h k ä i s y a j a t t e l u + e n n a l t a e h k ä i s y a j a t t e l u a + e n n a l t a e h k ä i s y a j a t t e l u n + e n n a l t a e h k ä i s y j ä r j e s t e l m i ä + e n n a l t a e h k ä i s y j ä r j e s t e l m ä + e n n a l t a e h k ä i s y j ä r j e s t e l m ä n + e n n a l t a e h k ä i s y j ä r j e s t e l m ä s s ä + e n n a l t a e h k ä i s y k a m p a n j o i d e n + e n n a l t a e h k ä i s y k e i n o + e n n a l t a e h k ä i s y k e i n o j a + e n n a l t a e h k ä i s y k e i n o n a + e n n a l t a e h k ä i s y k u s t a n n u s t e n + e n n a l t a e h k ä i s y m a l l i n + e n n a l t a e h k ä i s y m e k a n i s m i a + e n n a l t a e h k ä i s y m e n e t e l m i e n + e n n a l t a e h k ä i s y m e n e t e l m ä + e n n a l t a e h k ä i s y m e n e t e l m ä t + e n n a l t a e h k ä i s y m u o t o + e n n a l t a e h k ä i s y n + e n n a l t a e h k ä i s y n p e r i a a t e t t a + e n n a l t a e h k ä i s y o h j e l m i a + e n n a l t a e h k ä i s y o h j e l m i i n + e n n a l t a e h k ä i s y o h j e l m i s t a + e n n a l t a e h k ä i s y p a l v e l u j a + e n n a l t a e h k ä i s y p e r i a a t e t t a + e n n a l t a e h k ä i s y p e r i a a t t e e n + e n n a l t a e h k ä i s y p o l i t i i k k a + e n n a l t a e h k ä i s y p o l i t i i k k a a + e n n a l t a e h k ä i s y p o l i t i i k k a a m m e + e n n a l t a e h k ä i s y s s ä + e n n a l t a e h k ä i s y s t r a t e g i a + e n n a l t a e h k ä i s y s t r a t e g i o i t a + e n n a l t a e h k ä i s y s t ä + e n n a l t a e h k ä i s y s u u n n i t e l m i a + e n n a l t a e h k ä i s y s u u n n i t e l m i e n + e n n a l t a e h k ä i s y s u u n n i t e l m i i n + e n n a l t a e h k ä i s y s ä ä n n ö t + e n n a l t a e h k ä i s y t o i m e n p i t e i s t ä + e n n a l t a e h k ä i s y t o i m e n p i t e i t ä + e n n a l t a e h k ä i s y t o i m i a + e n n a l t a e h k ä i s y t o i m i e n + e n n a l t a e h k ä i s y t o i m i i n + e n n a l t a e h k ä i s y t o i m i n + e n n a l t a e h k ä i s y t o i m i n n a s t a + e n n a l t a e h k ä i s y t o i m i s s a m m e + e n n a l t a e h k ä i s y t o i m i s t a + e n n a l t a e h k ä i s y t y ö s s ä + e n n a l t a e h k ä i s y t y ö t ä + e n n a l t a e h k ä i s y v a l m i u d e t + e n n a l t a e h k ä i s y v e r k o s t o + e n n a l t a e h k ä i s y y n + e n n a l t a e h k ä i s y ä + e n n a l t a v a l i n n a n + e n n a l t a v a l i n n a s t a + e n n a l t a v a l i n t a a + e n n e a g r a m m i + e n n e d i + e n n e m m i n k i n + e n n e n a i k a i s e l l a + e n n e n a i k a i s e l ä k e j ä r j e s t e l y + e n n e n a i k a i s e l ä k e j ä r j e s t e l y n + e n n e n a i k a i s e l ä k e j ä r j e s t e l y ä + e n n e n a i k a i s e l ä k e t t ä + e n n e n a i k a i s e l ä k k e i t ä + e n n e n a i k a i s e n + e n n e n a i k a i s i a + e n n e n a i k a i s i i n + e n n e n a i k a i s t a + e n n e n a i k a i s t e n + e n n e n k i n + e n n e n k u u l u m a t o n t a + e n n e n k u u l u m a t t o m a s t a + e n n e n k u u l u m a t t o m i s s a + e n n e n n ä k e m ä t t ö m ä l l ä + e n n e n n ä k e m ä t t ö m ä n + e n n e n n ä k e m ä t t ö m ä s s ä + e n n e n n ä k e m ä t t ö m ä s t ä + e n n e n n ä k e m ä t t ö m ä ä n + e n n e n n ä k e m ä t ö n t ä + e n n e n ä k e m ä t t ö m i ä + e n n e s t ä ä n + e n n u s m e r k i t + e n n u s m e r k k e j ä + e n n u s t a a + e n n u s t a a k s e e n + e n n u s t a j a e u k k o + e n n u s t a m a a n + e n n u s t a m a t t o m i a + e n n u s t a m a t t o m i e n + e n n u s t a m i s e n + e n n u s t a n + e n n u s t e a n a l y y s i n + e n n u s t e e n i + e n n u s t e e t + e n n u s t e i d e n + e n n u s t e i n + e n n u s t e i s s a + e n n u s t e i t a + e n n u s t e l e m a t t a + e n n u s t e t a a n + e n n u s t e t t a + e n n u s t e t t a v a m m a k s i + e n n u s t e t t a v a m m a n + e n n u s t e t t a v a m m a t + e n n u s t e t t a v a m m i k s i + e n n u s t e t t a v a m p a a + e n n u s t e t t a v a m p i + e n n u s t e t t a v a m p i a + e n n u s t e t t a v a s t i + e n n u s t e t t a v i e n + e n n u s t e t t a v i s s a + e n n u s t e t t a v u u t t a + e n n u s t e t t u a + e n n u s t u k s e n + e n n u s t u k s e n a + e n n u s t u k s e n i + e n n u s t u k s e t + e n n u s t u k s i a + e n n u s t u s j ä r j e s t e l m ä + e n n u s t u s m e n e t e l m i s t ä + e n n ä t i t t e + e n n ä t y k s e e n + e n n ä t y k s e l l i s e e n + e n n ä t y k s e l l i s e n + e n n ä t y k s e l l i s i s s ä + e n n ä t y k s e t + e n n ä t y k s i s t ä + e n n ä t y s a j a s s a + e n n ä t y s h e l t e i t ä + e n n ä t y s h i n n a t + e n n ä t y s k o r k e a k s i + e n n ä t y s k o r k e a l l e + e n n ä t y s k o r k e a t + e n n ä t y s k o r k e u k s i i n + e n n ä t y s l u k e m i a + e n n ä t y s l u k e m i i n + e n n ä t y s l u k e m i s s a + e n n ä t y s l u k u j a + e n n ä t y s m ä i s e n + e n n ä t y s m ä i s e t + e n n ä t y s m ä ä r ä + e n n ä t y s m ä ä r ä n + e n n ä t y s n o u s u + e n n ä t y s p a l k k i o i t a + e n n ä t y s s a d o n + e n n ä t y s s a d o s t a + e n n ä t y s s u u r i k s i + e n n ä t y s t a s o + e n n ä t y s t a s o j a + e n n ä t y s t a s o l l e + e n n ä t y s t a s o n + e n n ä t y s t u l o s + e n n ä t y s t y ö t t ö m y y s + e n n ä t y s t y ö t t ö m y y t t ä + e n n ä t y s v a u h d i s s a + e n n ä t y s v a u h t i a + e n n ä t y s v o i t t o j a + e n n ä t y s v u o s i + e n o l o g i s e t + e n o l o g i s i a + e n o l o g i s i s t a + e n s i a p u a + e n s i a p u a s e m i e n + e n s i a p u h o i t a j i i n + e n s i a p u k l i n i k o i h i n + e n s i a p u k u r s s e j a + e n s i a p u l a u k k u + e n s i a p u o p e t u s t a + e n s i a p u o s a s t o + e n s i a p u o s a s t o l l a + e n s i a p u p a k k a u k s e n + e n s i a p u p a l v e l u j a + e n s i a p u p a l v e l u j e n + e n s i a p u r y h m i s s ä + e n s i a p u t y ö n t e k i j ä t + e n s i a p u t y ö n t e k i j ö i t ä + e n s i a p u t y ö t ä + e n s i a p u u n + e n s i a r v o i s e n + e n s i a v u l l a + e n s i a v u n + e n s i e s i t t e l y s t ä + e n s i h o i t o a + e n s i k s i k i n + e n s i k s i k ä ä n + e n s i l u o k k a i s e k s i + e n s i l u o k k a i s e n + e n s i l u o k k a i s e s t a + e n s i l u o k k a i s i a + e n s i l u o k k a i s i i n + e n s i l u o k k a i s i s t a + e n s i l u o k k a i s t a + e n s i l u o k k a i s t e n + e n s i m m ä i s e e n + e n s i m m ä i s e l l e + e n s i m m ä i s e l l ä + e n s i m m ä i s e n + e n s i m m ä i s e n k i n + e n s i m m ä i s e n ä + e n s i m m ä i s e s s ä + e n s i m m ä i s e s s ä k i n + e n s i m m ä i s e s t ä + e n s i m m ä i s e t + e n s i m m ä i s i i n + e n s i m m ä i s i k s i + e n s i m m ä i s i n ä + e n s i m m ä i s i s s ä + e n s i m m ä i s i s t ä + e n s i m m ä i s i ä + e n s i m m ä i s t e n + e n s i m m ä i s t ä + e n s i m m ä i s t ä k ä ä n + e n s i n n ä k i n + e n s i n n ä k ä ä n + e n s i s i j a i s e e n + e n s i s i j a i s e k s i + e n s i s i j a i s e l l a + e n s i s i j a i s e m p a a + e n s i s i j a i s e n + e n s i s i j a i s e n a + e n s i s i j a i s e s s a + e n s i s i j a i s e t + e n s i s i j a i s i a + e n s i s i j a i s i i n + e n s i s i j a i s i k s i + e n s i s i j a i s i l l e + e n s i s i j a i s i m m i s t a + e n s i s i j a i s i m p a n a + e n s i s i j a i s i n + e n s i s i j a i s i n a + e n s i s i j a i s i n t a + e n s i s i j a i s i s s a + e n s i s i j a i s i s t a + e n s i s i j a i s t e n + e n s i s i j a i s u u d e n + e n s i s i j a i s u u k s i a + e n s i s i j a i s u u s j ä r j e s t y k s e n + e n s i s i j a i s u u s j ä r j e s t y k s e s s ä + e n s i s i j a i s u u s j ä r j e s t y s t ä + e n s i s i j a i s u u s k r i t e e r i e n + e n s i s i j a i s u u s p e r i a a t e t t a + e n s i s i j a i s u u t e e n + e n s i v a i k u t e l m a t + e n s i v a i k u t e l m i s t a a n + e n s i v a k a u s m e n e t t e l y n + e n s y k l i k o i l l a + e n t e i l e e + e n t e i t ä + e n t i s a i k a a n + e n t i s a i k o j e n + e n t i s a j a t + e n t i s e e n + e n t i s e l l e + e n t i s e l l e e n + e n t i s e l l ä ä n + e n t i s e n + e n t i s e n l a i s e n a + e n t i s e n ä + e n t i s e s s ä + e n t i s e s t ä + e n t i s e s t ä ä n + e n t i s e s t ä ä n k i n + e n t i s e t + e n t i s i i n + e n t i s i l l e + e n t i s i l l ä + e n t i s i s s ä + e n t i s i s t ä + e n t i s i ä + e n t i s t e n + e n t i s t ä k i n + e n t i s t ä m i s t o i m e n p i t e i s i i n + e n t i s ö i m ä ä n + e n t i t e e t t i r e a l i s m i + e n t s y y m e i s t ä + e n t s y y m e j ä + e n t s y y m i v a l m i s t e + e n t s y y m i v a l m i s t e e n + e n t s y y m i v a l m i s t e t t a + e p i d e m i a l t a + e p i d e m i a m a i s t a + e p i d e m i a n + e p i d e m i a r i s k i n + e p i d e m i a r i s k i t + e p i d e m i a t a p a u k s i s s a + e p i d e m i a t i l a n t e i s s a + e p i d e m i a u h k i s t a + e p i d e m i a v a a r a + e p i d e m i a v a a r a n + e p i d e m i o i d e n + e p i d e m i o i h i n + e p i d e m i o i l t a + e p i d e m i o i t a + e p i d e m i o l o g i a n + e p i d e m i o l o g i s e e n + e p i d e m i o l o g i s e l l e + e p i d e m i o l o g i s e n + e p i d e m i o l o g i s e s t a + e p i d e m i o l o g i s t a + e p i d e m i o l o g i s t e n + e p i l e p s i a a n + e p i l e p s i a p ä i v ä + e p i l e p t i k o i s t a + e p i s o d i e l o k u v a + e p i t e e l i s o l u j e n + e p o l e t t i h a i + e p o l e t t i k a i j a + e p o l e t t i l e p a k k o + e p o l e t t i l e p i n k ä i n e n + e p ä a f r i k k a l a i s t a + e p ä a g g r e s s i i v i s t a + e p ä a j a n k o h t a i n e n + e p ä a m e r i k k a l a i s e k s i + e p ä a m m a t t i m a i n e n + e p ä a s i a k i r j a s s a + e p ä a s i a l l i s e m p a a + e p ä a s i a l l i s i a + e p ä a s i a l l i s t a + e p ä a s i a n m u k a i s e s t a + e p ä a s i a n m u k a i s e s t i + e p ä a s i a n m u k a i s e t + e p ä a s i a n m u k a i s i a + e p ä a s i a n m u k a i s i i n + e p ä a s i a n m u k a i s i s s a + e p ä a s i a n m u k a i s i s t a + e p ä a s i a n m u k a i s t a + e p ä a s i a n m u k a i s t e n + e p ä a v o i m e m p i + e p ä a v o i m e n + e p ä a v o i m e s t a + e p ä a v o i n + e p ä b y r o k r a a t t i n e n + e p ä b y r o k r a a t t i s e m p a a n + e p ä b y r o k r a a t t i s e m p i a + e p ä b y r o k r a a t t i s e s t i + e p ä b y r o k r a a t t i s i a + e p ä d e m o k r a a t t i n e n + e p ä d e m o k r a a t t i s e e n + e p ä d e m o k r a a t t i s e l l a + e p ä d e m o k r a a t t i s e m m a n + e p ä d e m o k r a a t t i s e m m i n + e p ä d e m o k r a a t t i s e m p i + e p ä d e m o k r a a t t i s e n + e p ä d e m o k r a a t t i s e n a + e p ä d e m o k r a a t t i s e s s a + e p ä d e m o k r a a t t i s e s t a + e p ä d e m o k r a a t t i s e s t i + e p ä d e m o k r a a t t i s e t + e p ä d e m o k r a a t t i s i a + e p ä d e m o k r a a t t i s i k s i + e p ä d e m o k r a a t t i s i l l a + e p ä d e m o k r a a t t i s i l l e + e p ä d e m o k r a a t t i s i l t a + e p ä d e m o k r a a t t i s i m p i a + e p ä d e m o k r a a t t i s i n + e p ä d e m o k r a a t t i s i n a + e p ä d e m o k r a a t t i s i s s a + e p ä d e m o k r a a t t i s i s t a + e p ä d e m o k r a a t t i s t a + e p ä d e m o k r a a t t i s t e n + e p ä d e m o k r a a t t i s u u d e n + e p ä d e m o k r a a t t i s u u d e s t a + e p ä d i p l o m a a t t i s t a + e p ä e d u l l i n e n + e p ä e d u l l i s e e n + e p ä e d u l l i s e m m a s s a + e p ä e d u l l i s e m m a t + e p ä e d u l l i s e m p i + e p ä e d u l l i s e m p i a + e p ä e d u l l i s e m p i e n + e p ä e d u l l i s e s s a + e p ä e d u l l i s e s t a + e p ä e d u l l i s i a + e p ä e d u l l i s t a + e p ä e e t t i s e n + e p ä e k o l o g i s e n a + e p ä e k o l o g i s e s t i + e p ä e u k l i d i n e n + e p ä e u r o o p p a l a i n e n + e p ä e u r o o p p a l a i s e n + e p ä e u r o o p p a l a i s e n a + e p ä e u r o o p p a l a i s i k s i + e p ä e u r o o p p a l a i s t a + e p ä h e d e l m ä + e p ä h i s t o r i a l l i n e n + e p ä h o m o g e e n i s u u s + e p ä h u m a a n i + e p ä h u m a a n i n + e p ä h u o m a a v a i s t a + e p ä i d e o l o g i s e s t i + e p ä i l e e + e p ä i l e m m e + e p ä i l e m m e k i n + e p ä i l e m ä ä n + e p ä i l e n + e p ä i l e n k i n + e p ä i l e n p ä + e p ä i l e v i e n + e p ä i l e v ä i s e m m i n + e p ä i l e v ä i s e m p i + e p ä i l e v ä i s i ä + e p ä i l e v ä l l ä + e p ä i l e v ä m m i n + e p ä i l e v ä m m i n k i n + e p ä i l e v ä n s ä + e p ä i l e v ä t + e p ä i l i j ä t + e p ä i l i j ä t k i n + e p ä i l i j ö i d e n + e p ä i l i m m e + e p ä i l i s i k i n + e p ä i l i v ä t + e p ä i l l e e t + e p ä i l l e n + e p ä i l l y i l l e + e p ä i l l y i s t ä + e p ä i l l y n + e p ä i l l y t + e p ä i l l ä + e p ä i l l ä ä n + e p ä i l l ä ä n k i n + e p ä i l t i i n + e p ä i l t y j e n + e p ä i l t y j ä + e p ä i l t y n ä + e p ä i l t y ä + e p ä i l t ä e s s ä + e p ä i l y i h i n + e p ä i l y i l l e + e p ä i l y i s t ä + e p ä i l y j ä + e p ä i l y j ä n i + e p ä i l y k s e n + e p ä i l y k s e n a i h e e t + e p ä i l y k s e n a l a i s i k s i + e p ä i l y k s e n a l a i s i s t a + e p ä i l y k s e s t ä + e p ä i l y k s e t + e p ä i l y k s e t t ä + e p ä i l y k s i + e p ä i l y k s i i n + e p ä i l y k s i s t ä + e p ä i l y k s i s t ä ä n + e p ä i l y k s i t t ä + e p ä i l y k s i ä + e p ä i l y k s i ä n i + e p ä i l y n + e p ä i l y s t ä + e p ä i l y s t ä k ä ä n + e p ä i l y t + e p ä i l y t t ä v i i n + e p ä i l y t t ä v i l l ä + e p ä i l y t t ä v i l t ä + e p ä i l y t t ä v i n + e p ä i l y t t ä v i s t ä + e p ä i l y t t ä v i ä + e p ä i l y t t ä v ä m p i ä + e p ä i l y t t ä v ä m p ä ä + e p ä i l y t t ä v ä t + e p ä i l y t t ä v ä ä + e p ä i l y t t ä ä + e p ä i n h i m i l l i n e n + e p ä i n h i m i l l i s e k s i + e p ä i n h i m i l l i s e m m i n + e p ä i n h i m i l l i s e m p i + e p ä i n h i m i l l i s e m p ä ä + e p ä i n h i m i l l i s e n + e p ä i n h i m i l l i s e s t i + e p ä i n h i m i l l i s e s t ä + e p ä i n h i m i l l i s e t + e p ä i n h i m i l l i s i n + e p ä i n h i m i l l i s i s s ä + e p ä i n h i m i l l i s i s t ä + e p ä i n h i m i l l i s t ä + e p ä i n h i m i l l i s y y d e s t ä + e p ä i s l a m i l a i s e n a + e p ä i s l a m i l a i s i k s i + e p ä i s ä n m a a l l i s u u t e n s a + e p ä i t s e k k y y t t ä + e p ä i t s e k k ä i m m i s t ä + e p ä i t s e k k ä i s t ä + e p ä i t s e k k ä ä t + e p ä i t s e n ä i n e n + e p ä i t s e n ä i s t e n + e p ä i t s e n ä i s y y s + e p ä j o h d o n m u k a i n e n + e p ä j o h d o n m u k a i s e e n + e p ä j o h d o n m u k a i s e l t a + e p ä j o h d o n m u k a i s e m m a n + e p ä j o h d o n m u k a i s e m p a a + e p ä j o h d o n m u k a i s e n + e p ä j o h d o n m u k a i s e n a + e p ä j o h d o n m u k a i s e s s a + e p ä j o h d o n m u k a i s e s t i + e p ä j o h d o n m u k a i s i a + e p ä j o h d o n m u k a i s i i n + e p ä j o h d o n m u k a i s i l t a + e p ä j o h d o n m u k a i s t a + e p ä j o h d o n m u k a i s u u d e n + e p ä j o h d o n m u k a i s u u d e s t a + e p ä j o h d o n m u k a i s u u d e s t a a n + e p ä j o h d o n m u k a i s u u d e t + e p ä j o h d o n m u k a i s u u k s i a + e p ä j o h d o n m u k a i s u u k s i e n + e p ä j o h d o n m u k a i s u u k s i i n + e p ä j o h d o n m u k a i s u u k s i s t a + e p ä j o h d o n m u k a i s u u s + e p ä j o h d o n m u k a i s u u t e e n + e p ä j o h d o n m u k a i s u u t t a + e p ä j o h d o n m u k a i s u u t t a a n + e p ä j ä r j e s t y k s e e n + e p ä j ä r j e s t y k s e n + e p ä j ä r j e s t y k s e s s ä + e p ä j ä r j e s t y s t ä + e p ä k a n s a l l i s e l l a + e p ä k a n s a l l i s e n + e p ä k a u p a l l i s i a + e p ä k e l v o i s t a + e p ä k e l v o l l i s i k s i + e p ä k e l v o n + e p ä k o h d a s t a + e p ä k o h d a t + e p ä k o h d i s t a + e p ä k o h t a + e p ä k o h t a a + e p ä k o h t a a n + e p ä k o h t e l i a a l t a + e p ä k o h t e l i a a s t a + e p ä k o h t e l i a a s t i + e p ä k o h t e l i a i s u u d e s t a + e p ä k o h t e l i a i s u u t e n i + e p ä k o h t e l i a s t a + e p ä k o h t i a + e p ä k o h t i a k i n + e p ä k o h t i i n + e p ä k o n k r e e t t i n e n + e p ä k r i s t i l l i s t e n + e p ä k u n n i o i t t a v a + e p ä k u n n i o i t t a v a a + e p ä k u n n i o i t t a v a s t i + e p ä k u n n i o i t t a v i a + e p ä k ä s l i h a s + e p ä k ä y t ä n n ö l l i s i ä + e p ä l i b e r a a l i s t a + e p ä l i k v i d i i n + e p ä l i n e a a r i n e n + e p ä l i n e a a r i s e s t a + e p ä l o o g i s e e n + e p ä l o o g i s e n + e p ä l o o g i s e n a + e p ä l o o g i s e s t i + e p ä l o o g i s i a + e p ä l o o g i s t a + e p ä l o o g i s u u t t a + e p ä l u o t e t t a v a m p a a + e p ä l u o t e t t a v a m p i e n + e p ä l u o t e t t a v i a + e p ä l u o t e t t a v i s t a + e p ä l u o t e t t a v u u d e l t a + e p ä l u o t e t t a v u u d e n + e p ä l u o t e t t a v u u s + e p ä l u o t t a m u k s e n s a + e p ä l u o t t a m u k s e s t a + e p ä l u o t t a m u s + e p ä l u o t t a m u s l a u s e + e p ä l u o t t a m u s l a u s e e l l a + e p ä l u o t t a m u s l a u s e e l l a m m e + e p ä l u o t t a m u s l a u s e e l l e + e p ä l u o t t a m u s l a u s e e n + e p ä l u o t t a m u s l a u s e e s e e n + e p ä l u o t t a m u s l a u s e e s t a + e p ä l u o t t a m u s l a u s e e s t a n n e + e p ä l u o t t a m u s l a u s e k e s k u s t e l u n + e p ä l u o t t a m u s l a u s e k e s k u s t e l u u n + e p ä l u o t t a m u s l a u s e t t a + e p ä l u o t t a m u s l a u s e ä ä n e s t y k s e e n + e p ä l u o t t a m u s l a u s e ä ä n e s t y k s e l l ä + e p ä l u o t t a m u s l a u s e ä ä n e s t y k s e n + e p ä l u o t t a m u s l a u s e ä ä n e s t y k s e s t ä + e p ä l u o t t a m u s l a u s e ä ä n e s t y s + e p ä l u o t t a m u s l a u s e ä ä n e s t y s t ä + e p ä l u o t t a m u s t a + e p ä l u o t t a m u s t a a n + e p ä l u o t t a m u s ä ä n e s t y k s e n + e p ä l u o t t a m u s ä ä n e s t y s + e p ä l u u l o + e p ä l u u l o a + e p ä l u u l o i n e n + e p ä l u u l o i s e m m i n + e p ä l u u l o i s e s t i + e p ä l u u l o i s i k s i + e p ä l u u l o j a + e p ä l u u l o n + e p ä m e t a l l i s e t + e p ä m i e l l y t t ä v i e n + e p ä m i e l l y t t ä v i i n + e p ä m i e l l y t t ä v i m p i e n + e p ä m i e l l y t t ä v i ä + e p ä m i e l l y t t ä v ä + e p ä m i e l l y t t ä v ä m p i + e p ä m i e l l y t t ä v ä m p ä ä + e p ä m i e l l y t t ä v ä m p ä ä n + e p ä m i e l l y t t ä v ä n + e p ä m i e l l y t t ä v ä n ä + e p ä m i e l l y t t ä v ä s t ä + e p ä m i e l l y t t ä v ä ä + e p ä m i e l l y t t ä v ä ä n + e p ä m u k a v a a + e p ä m u k a v a k s i + e p ä m u o d o l l i s e m m a t + e p ä m u o d o l l i s e m p i e n + e p ä m u o d o l l i s e m p i i n + e p ä m u o d o l l i s t a + e p ä m u o d o l l i s t e n + e p ä m u o d o s t u m i a + e p ä m u o d o s t u m i e n + e p ä m u o d o s t u m i s t a + e p ä m ä ä r ä i n e n + e p ä m ä ä r ä i s e k s i + e p ä m ä ä r ä i s e l l ä + e p ä m ä ä r ä i s e l t ä + e p ä m ä ä r ä i s e m p i + e p ä m ä ä r ä i s e m p i ä + e p ä m ä ä r ä i s e m p ä n ä + e p ä m ä ä r ä i s e m p ä ä + e p ä m ä ä r ä i s e n + e p ä m ä ä r ä i s e n ä + e p ä m ä ä r ä i s e s s ä + e p ä m ä ä r ä i s e s t i + e p ä m ä ä r ä i s e s t ä + e p ä m ä ä r ä i s e t + e p ä m ä ä r ä i s i l t ä + e p ä m ä ä r ä i s i ä + e p ä m ä ä r ä i s y y k s i e n + e p ä m ä ä r ä i s y y k s i ä + e p ä m ä ä r ä i s y y s + e p ä n o r m a a l i + e p ä n o r m a a l i a + e p ä n o r m a a l i k s i + e p ä o i k e u d e n m u k a i n e n + e p ä o i k e u d e n m u k a i s e e n + e p ä o i k e u d e n m u k a i s e k s i + e p ä o i k e u d e n m u k a i s e l l e + e p ä o i k e u d e n m u k a i s e l t a + e p ä o i k e u d e n m u k a i s e m m a n + e p ä o i k e u d e n m u k a i s e m m i n + e p ä o i k e u d e n m u k a i s e m p a a + e p ä o i k e u d e n m u k a i s e m p i + e p ä o i k e u d e n m u k a i s e n a + e p ä o i k e u d e n m u k a i s e s s a + e p ä o i k e u d e n m u k a i s e s t a + e p ä o i k e u d e n m u k a i s e s t i + e p ä o i k e u d e n m u k a i s e t + e p ä o i k e u d e n m u k a i s i a + e p ä o i k e u d e n m u k a i s i i n + e p ä o i k e u d e n m u k a i s i m m a s s a + e p ä o i k e u d e n m u k a i s i m m i s t a + e p ä o i k e u d e n m u k a i s i s s a + e p ä o i k e u d e n m u k a i s i s t a + e p ä o i k e u d e n m u k a i s t a + e p ä o i k e u d e n m u k a i s t e n + e p ä o i k e u d e n m u k a i s u u d e n + e p ä o i k e u d e n m u k a i s u u d e s t a + e p ä o i k e u d e n m u k a i s u u k s i i n + e p ä o i k e u d e n m u k a i s u u s + e p ä o i k e u d e n m u k a i s u u t e e n + e p ä o i k e u d e n m u k a i s u u t t a + e p ä o i k e u t e t t u + e p ä o i k e u t e t t u j a + e p ä o i k e u t e t u m m a k s i + e p ä o l e e l l i s i a + e p ä o l e e l l i s t e n + e p ä o l e n n a i n e n + e p ä o l e n n a i s e n a + e p ä o l e n n a i s i a + e p ä o l e n n a i s u u k s i a + e p ä o n n e a + e p ä o n n e k s e e n + e p ä o n n e n + e p ä o n n i n e n + e p ä o n n i s t e n + e p ä o n n i s t u a + e p ä o n n i s t u e s s a + e p ä o n n i s t u i + e p ä o n n i s t u i m m e + e p ä o n n i s t u i s i + e p ä o n n i s t u i s i v a t + e p ä o n n i s t u i v a t + e p ä o n n i s t u m a a n + e p ä o n n i s t u m a t t a + e p ä o n n i s t u m i s e e n + e p ä o n n i s t u m i s e l l a + e p ä o n n i s t u m i s e l l e + e p ä o n n i s t u m i s e n + e p ä o n n i s t u m i s e n s a + e p ä o n n i s t u m i s e s t a + e p ä o n n i s t u m i s i a + e p ä o n n i s t u m i s i i n + e p ä o n n i s t u m i s i s t a + e p ä o n n i s t u m i s l u k u j e n + e p ä o n n i s t u m i s t a + e p ä o n n i s t u m m e + e p ä o n n i s t u n e e k s i + e p ä o n n i s t u n e e m m e + e p ä o n n i s t u n e e n + e p ä o n n i s t u n e e n a + e p ä o n n i s t u n e e n s a + e p ä o n n i s t u n e e t + e p ä o n n i s t u n e i d e n + e p ä o n n i s t u n e i k s i + e p ä o n n i s t u n e i m m i s t a + e p ä o n n i s t u n e i n a + e p ä o n n i s t u n e i t a + e p ä o n n i s t u n u t + e p ä o n n i s t u n u t t a + e p ä o n n i s t u t a a n + e p ä o n n i s t u t t i i n + e p ä o n n i s t u t t u + e p ä o n n i s t u u + e p ä o n n i s t u v a t + e p ä p a t r i a r k a a l i s i a + e p ä p o l i i t t i s e n + e p ä p o l i i t t i s i a + e p ä p o l i i t t i s t a + e p ä p o l i i t t i s t e n + e p ä p o l i t i i k k a a + e p ä p u h d a s t a + e p ä p u h t a u d e t + e p ä p u h t a u k s i a + e p ä p u h t a u k s i e n + e p ä p u h t a u k s i s t a + e p ä p u h t a u s p ä ä s t ö j e n + e p ä p u h t a u s p ä ä s t ö j ä + e p ä p u h t a u s p ä ä s t ö t + e p ä p y h ä + e p ä p y h ä ä n + e p ä p ä t e v i e n + e p ä p ä t e v i l l e + e p ä p ä t e v i ä + e p ä p ä t e v y y t t ä + e p ä p ä t e v ä k s i + e p ä p ä t e v ä s t ä + e p ä r e a l i s m i a + e p ä r e a l i s t i n e n + e p ä r e a l i s t i s e l t a + e p ä r e a l i s t i s e m p i a + e p ä r e a l i s t i s e s t i + e p ä r e a l i s t i s e t + e p ä r e a l i s t i s i a + e p ä r e a l i s t i s i i n + e p ä r e a l i s t i s i m p i a + e p ä r e a l i s t i s t a + e p ä r e a l i s t i s t e n + e p ä r e a l i s t i s u u s + e p ä r e h e l l i n e n + e p ä r e h e l l i s e n + e p ä r e h e l l i s e s t i + e p ä r e h e l l i s e s t ä + e p ä r e h e l l i s i n + e p ä r e h e l l i s t ä + e p ä r e h e l l i s y y d e s t ä + e p ä r e h e l l i s y y s + e p ä r e h e l l i s y y t t ä + e p ä r e i l u a + e p ä r e i l u i s t a + e p ä r e i l u k s i + e p ä r e i l u l t a + e p ä r e i l u n + e p ä r e i l u t + e p ä r ö i d ä + e p ä r ö i m ä t t ä + e p ä r ö i m ä ä n + e p ä r ö i n + e p ä r ö i n e e t + e p ä r ö i n n i s t ä + e p ä r ö i n t i k y n n y s t ä + e p ä r ö i n t i ä + e p ä r ö i n y t + e p ä r ö i v ä t + e p ä s e l v e m m i k s i + e p ä s e l v e m m i n + e p ä s e l v e m m ä k s i + e p ä s e l v e m p i + e p ä s e l v e m p i ä + e p ä s e l v e m p ä ä + e p ä s e l v i e n + e p ä s e l v i k s i + e p ä s e l v i n + e p ä s e l v i s t ä + e p ä s e l v i ä + e p ä s e l v y y d e n + e p ä s e l v y y d e s t ä + e p ä s e l v y y d e t + e p ä s e l v y y k s i e n + e p ä s e l v y y k s i s t ä + e p ä s e l v y y k s i ä + e p ä s e l v y y s + e p ä s e l v y y s s y y t t e i l l e + e p ä s e l v y y t e n ä + e p ä s e l v y y t t ä + e p ä s e l v ä + e p ä s e l v ä k s i + e p ä s e l v ä l l ä + e p ä s e l v ä n + e p ä s e l v ä s t i + e p ä s e l v ä t + e p ä s e l v ä ä + e p ä s e l v ä ä n + e p ä s i v e e l l i s i ä + e p ä s o l i d a a r i n e n + e p ä s o l i d a a r i s i a + e p ä s o l i d a a r i s t a + e p ä s o l i d a a r i s u u s h a n + e p ä s o l i d a a r i s u u s l i i k e + e p ä s o l i d a a r i s u u s l i i k k e e n + e p ä s o l i d a a r i s u u t e e n + e p ä s o p i v a k s i + e p ä s o p i v i n a + e p ä s o s i a a l i n e n + e p ä s o s i a a l i s e k s i + e p ä s o s i a a l i s e l l e + e p ä s o s i a a l i s e n + e p ä s o s i a a l i s e s t a + e p ä s o s i a a l i s e t + e p ä s o s i a a l i s i a + e p ä s o s i a a l i s i i n + e p ä s o s i a a l i s i s t a + e p ä s o s i a a l i s t a + e p ä s o v i n n a i s e s t i + e p ä s o v i n n a i s i a + e p ä s o v u n + e p ä s t a n d a r d i + e p ä s u h t a + e p ä s u h t a i n e n + e p ä s u h t a i s e m p a a + e p ä s u h t a i s e s t i + e p ä s u h t a i s e t + e p ä s u h t a i s i a + e p ä s u h t a i s i s t a + e p ä s u h t a i s u u t t a + e p ä s u o r a + e p ä s u o r a a + e p ä s u o r a a n + e p ä s u o r a k s i + e p ä s u o r a l l a + e p ä s u o r a s t i + e p ä s u o r a t + e p ä s u o r e m m i n + e p ä s u o r i a + e p ä s u o r i e n + e p ä s u o r i n + e p ä s u o s i t t u + e p ä s u o s i t t u j a + e p ä s u o s i t t u j e n + e p ä s u o s i t t u u n + e p ä s u o s i t u i m p i i n + e p ä s u o s i t u m p a a + e p ä s u o s i t u m p i + e p ä s u o s i t u n + e p ä s u o s i t u s t a + e p ä s u o t a v a + e p ä s u o t u i s a + e p ä s u o t u i s a a + e p ä s u o t u i s a k s i + e p ä s u o t u i s a l l a + e p ä s u o t u i s a m m a k s i + e p ä s u o t u i s a m m a s s a + e p ä s u o t u i s a m m a t + e p ä s u o t u i s a m m i l l e + e p ä s u o t u i s a m m i n + e p ä s u o t u i s a m p a a n + e p ä s u o t u i s a m p i + e p ä s u o t u i s a m p i a + e p ä s u o t u i s a n + e p ä s u o t u i s a n a + e p ä s u o t u i s a s s a + e p ä s u o t u i s a s t i + e p ä s u o t u i s a t + e p ä s u o t u i s e m p i a + e p ä s u o t u i s e m p i e n + e p ä s u o t u i s i a + e p ä s u o t u i s i e n + e p ä s u o t u i s i i n + e p ä s u o t u i s i k s i + e p ä s u o t u i s i l l a + e p ä s u o t u i s i l l e + e p ä s u o t u i s i m m a s s a + e p ä s u o t u i s i m m a t + e p ä s u o t u i s i m m i k s i + e p ä s u o t u i s i m m i l l a + e p ä s u o t u i s i m m i l l e + e p ä s u o t u i s i m m i s s a + e p ä s u o t u i s i m p i a + e p ä s u o t u i s i m p i e n + e p ä s u o t u i s i m p i i n + e p ä s u o t u i s i s s a + e p ä s u o t u i s i s t a + e p ä s u o t u i s t e n + e p ä s y m m e t r i a + e p ä s y m m e t r i n e n + e p ä s y m m e t r i s e e n + e p ä s y m m e t r i s e l t ä + e p ä s y m m e t r i s e s t i + e p ä s y m m e t r i s e t + e p ä s y m m e t r i s i i n + e p ä s y m m e t r i s i k s i + e p ä s y m m e t r i s i l t ä + e p ä s y m m e t r i s i s s ä + e p ä s y m m e t r i s i s t ä + e p ä s y m m e t r i s i ä + e p ä s y m m e t r i s t e n + e p ä s y m m e t r i s y y s + e p ä s ä ä n n ö l l i s e s t i + e p ä s ä ä n n ö l l i s e t + e p ä s ä ä n n ö l l i s i n + e p ä s ä ä n n ö l l i s i s t ä + e p ä s ä ä n n ö l l i s y y d e s t ä + e p ä s ä ä n n ö l l i s y y s + e p ä s ä ä n n ö n m u k a i s u u k s i a + e p ä s ä ä n n ö n m u k a i s u u k s i l l e + e p ä t a l o u d e l l i s t a + e p ä t a r k a s t i + e p ä t a r k k a + e p ä t a r k k o i h i n + e p ä t a r k k u u k s i e n + e p ä t a r k k u u s + e p ä t a r k o i t u k s e n m u k a i n e n + e p ä t a r k o i t u k s e n m u k a i s e m p a a + e p ä t a r k o i t u k s e n m u k a i s e s t a + e p ä t a r k o i t u k s e n m u k a i s e s t i + e p ä t a r k o i t u k s e n m u k a i s t a + e p ä t a r k o i t u k s e n m u k a i s u u s + e p ä t a s a + e p ä t a s a i n e n + e p ä t a s a i s e e n + e p ä t a s a i s e m m i n + e p ä t a s a i s e n + e p ä t a s a i s e s s a + e p ä t a s a i s e s t a + e p ä t a s a i s e s t i + e p ä t a s a i s i a + e p ä t a s a i s t a + e p ä t a s a i s u u s + e p ä t a s a p a i n o + e p ä t a s a p a i n o a + e p ä t a s a p a i n o i n e n + e p ä t a s a p a i n o i s e k s i + e p ä t a s a p a i n o i s e m m a n + e p ä t a s a p a i n o i s e m p i + e p ä t a s a p a i n o i s e n + e p ä t a s a p a i n o i s e n a + e p ä t a s a p a i n o i s e s t i + e p ä t a s a p a i n o i s e t + e p ä t a s a p a i n o i s t a + e p ä t a s a p a i n o i s u u k s i e n + e p ä t a s a p a i n o i s u u s + e p ä t a s a p a i n o j e n + e p ä t a s a p a i n o l l a + e p ä t a s a p a i n o n + e p ä t a s a p a i n o o n + e p ä t a s a p a i n o r i s k i t + e p ä t a s a p a i n o s s a + e p ä t a s a p a i n o s t a + e p ä t a s a p a i n o t + e p ä t a s a p a i n o t i l a n t e i t a + e p ä t a s a p a i n o t i l o i h i n + e p ä t a s a p a i n o t i l o i s t a + e p ä t a s a p u o l i n e n + e p ä t a s a p u o l i s e k s i + e p ä t a s a p u o l i s e t + e p ä t a s a p u o l i s t a + e p ä t a s a p u o l i s u u d e s t a + e p ä t a s a p u o l i s u u t t a + e p ä t a v a l l i n e n + e p ä t a v a l l i s e m m a t + e p ä t a v a l l i s e m p i a + e p ä t a v a l l i s e n + e p ä t a v a l l i s e s s a + e p ä t a v a l l i s i a + e p ä t a v a l l i s i m p a a n + e p ä t a v a l l i s i s t a + e p ä t a v a l l i s t a + e p ä t a v a n o m a i n e n + e p ä t a v a n o m a i s e t + e p ä t a v a n o m a i s i a + e p ä t a v a n o m a i s i i n + e p ä t a v a n o m a i s i s s a + e p ä t a v a n o m a i s i s t a + e p ä t a v a n o m a i s t e n + e p ä t e k n i s e n + e p ä t e k n i s e s t ä + e p ä t e r v e e l l i s e m p ä ä + e p ä t e r v e e l l i s i ä + e p ä t e r v e e l l i s t ä + e p ä t e r v e e n + e p ä t e r v e i s t ä + e p ä t e r v e t t ä + e p ä t i e t e e l l i n e n + e p ä t i e t e e l l i s e l l ä + e p ä t i e t e e l l i s t e n + e p ä t i e t e e l l i s t ä + e p ä t i e t o i s i a + e p ä t i e t o i s u u s + e p ä t i e t o i s u u t t a + e p ä t o d e l l i s e k s i + e p ä t o d e l l i s i a + e p ä t o d e n n ä k ö i s e k s i + e p ä t o d e n n ä k ö i s e l t ä + e p ä t o d e n n ä k ö i s e m m i n + e p ä t o d e n n ä k ö i s e m m ä k s i + e p ä t o d e n n ä k ö i s e m m ä l t ä + e p ä t o d e n n ä k ö i s e m m ä n + e p ä t o d e n n ä k ö i s e m p i + e p ä t o d e n n ä k ö i s e m p i ä + e p ä t o d e n n ä k ö i s e m p ä ä + e p ä t o d e n n ä k ö i s e n ä + e p ä t o d e n n ä k ö i s i m p i ä + e p ä t o d e n n ä k ö i s t ä + e p ä t o i v o + e p ä t o i v o a + e p ä t o i v o a a n + e p ä t o i v o i n e n + e p ä t o i v o i s e k s i + e p ä t o i v o i s e m m a k s i + e p ä t o i v o i s e m m i k s i + e p ä t o i v o i s e m p i + e p ä t o i v o i s e m p i a + e p ä t o i v o i s e s s a + e p ä t o i v o i s e s t i + e p ä t o i v o i s e t + e p ä t o i v o i s i a + e p ä t o i v o i s i i n + e p ä t o i v o i s i m m a n + e p ä t o i v o i s i m m a s s a + e p ä t o i v o i s i n a + e p ä t o i v o i s s a a n + e p ä t o i v o i s t e n + e p ä t o i v o l l a + e p ä t o i v o s t a + e p ä t o i v o t t a v a + e p ä t o i v o t t u + e p ä t o i v o t t u i h i n + e p ä t o i v o t t u j a + e p ä t o i v o t t u j e n + e p ä t o i v o t u i s t a + e p ä t y y d y t t ä v i s t ä + e p ä t y y d y t t ä v i ä + e p ä t y y d y t t ä v ä + e p ä t y y d y t t ä v ä l t ä + e p ä t y y d y t t ä v ä s s ä + e p ä t y y d y t t ä v ä s t i + e p ä t y y d y t t ä v ä s t ä + e p ä t y y d y t t ä v ä ä + e p ä t y y d y t t ä v ä ä n + e p ä t y y p i l l i n e n + e p ä t y y p i l l i s e n + e p ä t y y p i l l i s e s s ä + e p ä t y y p i l l i s e s t ä + e p ä t y y p i l l i s e t + e p ä t y y p i l l i s i i n + e p ä t y y p i l l i s i s s ä + e p ä t y y p i l l i s i s t ä + e p ä t y y p i l l i s i ä + e p ä t y y p i l l i s t e n + e p ä t y y p i l l i s t ä + e p ä t ä s m ä l l i n e n + e p ä t ä s m ä l l i s e m p i ä + e p ä t ä s m ä l l i s y y s + e p ä t ä y d e l l i n e n + e p ä t ä y d e l l i s e m p ä ä n + e p ä t ä y d e l l i s e s t i + e p ä t ä y d e l l i s e s t ä + e p ä u s k o i s i m m a t k i n + e p ä u s k o i s t e n + e p ä u s k o n n o l l i s i i n + e p ä u s k o t t a v a + e p ä u s k o t t a v a a + e p ä u s k o t t a v a l t a + e p ä u s k o t t a v a m m i k s i + e p ä u s k o t t a v a m p a a + e p ä u s k o t t a v a m p i i n + e p ä u s k o t t a v a n + e p ä u s k o t t a v a n a + e p ä u s k o t t a v a t + e p ä u s k o t t a v i a + e p ä u s k o t t a v u u t e m m e + e p ä u s k o t t a v u u t t a + e p ä v a k a a + e p ä v a k a a k s i + e p ä v a k a a l l a + e p ä v a k a a l l e + e p ä v a k a a m m a n + e p ä v a k a a m p a a + e p ä v a k a a m p i + e p ä v a k a a m p i a + e p ä v a k a a s t a + e p ä v a k a a t + e p ä v a k a i m p i e n + e p ä v a k a i n a + e p ä v a k a i s e k s i + e p ä v a k a i s i a + e p ä v a k a i s i m p i i n + e p ä v a k a i s t a + e p ä v a k a i t a + e p ä v a k a u d e l t a + e p ä v a k a u d e n + e p ä v a k a u s + e p ä v a k a u s t e k i j ö i t ä + e p ä v a k a u t e e n + e p ä v a k a u t t a + e p ä v a k a u t t a v a a + e p ä v a l t i o + e p ä v a r m a + e p ä v a r m a a + e p ä v a r m a a n + e p ä v a r m a k s i + e p ä v a r m a l l a + e p ä v a r m a n a + e p ä v a r m a s s a + e p ä v a r m a t + e p ä v a r m e m m a k s i + e p ä v a r m e m m a n + e p ä v a r m e m m i k s i + e p ä v a r m e m m i n + e p ä v a r m e m p a a + e p ä v a r m e m p a a n + e p ä v a r m e m p i + e p ä v a r m e m p i a + e p ä v a r m i m m a t + e p ä v a r m i n t a + e p ä v a r m o i k s i + e p ä v a r m o i s s a + e p ä v a r m o j a + e p ä v a r m o j e n + e p ä v a r m u u d e l l a + e p ä v a r m u u d e n + e p ä v a r m u u d e s s a + e p ä v a r m u u d e s t a + e p ä v a r m u u d e t + e p ä v a r m u u s + e p ä v a r m u u s a s t e + e p ä v a r m u u s t e k i j ä + e p ä v a r m u u s t e k i j ä n + e p ä v a r m u u s t e k i j ä t + e p ä v a r m u u s t e k i j ö i d e n + e p ä v a r m u u s t e k i j ö i s t ä + e p ä v a r m u u s t e k i j ö i t ä + e p ä v a r m u u s t i l a n t e e s s a + e p ä v a r m u u t e e n + e p ä v a r m u u t t a + e p ä v a r m u u t t a k i n + e p ä v a s t a u k s i a + e p ä v a s t a u s t a + e p ä v i i s a a s t a + e p ä v i i s a a s t i + e p ä v i i s a i t a + e p ä v i r a l l i n e n + e p ä v i r a l l i s e e n + e p ä v i r a l l i s e l l a + e p ä v i r a l l i s e m m a t + e p ä v i r a l l i s e m p a a + e p ä v i r a l l i s e m p i a + e p ä v i r a l l i s e n + e p ä v i r a l l i s e n a + e p ä v i r a l l i s e s s a + e p ä v i r a l l i s e s t a + e p ä v i r a l l i s e s t i + e p ä v i r a l l i s e t + e p ä v i r a l l i s i a + e p ä v i r a l l i s i i n + e p ä v i r a l l i s i s s a + e p ä v i r a l l i s i s t a + e p ä v i r a l l i s t a + e p ä y h d e n m u k a i n e n + e p ä y h d e n m u k a i s u u t e e n + e p ä y h d i s t y n e e t + e p ä y h d y s v a l t a l a i n e n + e p ä y h t e n e v ä i s t e n + e p ä y h t e n ä i n e n + e p ä y h t e n ä i s e e n + e p ä y h t e n ä i s e l l e + e p ä y h t e n ä i s e m m ä t + e p ä y h t e n ä i s e t + e p ä y h t e n ä i s i s t ä + e p ä y h t e n ä i s i ä + e p ä y h t e n ä i s t ä + e p ä y h t e n ä i s y y d e s t ä + e p ä y h t e n ä i s y y s + e p ä y h t e n ä i s y y t t ä + e p ä y k s i l ö l l i s t ä + e p ä ä m i s a s t e e n + e p ä ä m i s e e n + e p ä ä m i s e l l e + e p ä ä m i s e n + e p ä ä m i s e s t ä + e p ä ä m i s i l m o i t u k s i i n + e p ä ä m i s i l m o i t u s j ä r j e s t e l m ä n + e p ä ä m i s i l m o i t u s t a + e p ä ä m i s l a u s e k k e i t a + e p ä ä m i s p e r u s t e e n a + e p ä ä m i s p e r u s t e i t a + e p ä ä m i s t a p a u k s i a + e p ä ä m i s t ä + e r a k k o a m p i a i s e t + e r a k k o h a u k k a + e r a k k o k o l i b r i + e r a k k o k u o r i a i n e n + e r a k k o l u h t a k a n a + e r a k k o m e s i k k o + e r a k k o p i s t e + e r a k k o r a s t a s + e r a k k o t i n a m i + e r a k k o t u u l i h a u k k a + e r e h d y k s e n + e r e h d y k s e s s ä + e r e h d y k s i l t ä + e r e h d y k s i ä + e r e h d y s t ä + e r e h d y t t i i n + e r e h d y t t y + e r e h d y t t ä v ä s t i + e r e h d y t ä ä n + e r e h t y i + e r e h t y i v ä t + e r e h t y k ö + e r e h t y m i s m a h d o l l i s u u k s i a + e r e h t y m ä t t ö m i ä + e r e h t y v ä t + e r e h t y ä + e r e k t i o h ä i r i ö + e r g o n o m i a a n + e r g o n o m i a d i r e k t i i v i ä + e r g o n o m i a k y s y m y s t e n + e r i a i k a i s e s t a + e r i a r v o i s e s t a + e r i a r v o i s e s t i + e r i a r v o i s e t + e r i a r v o i s i a + e r i a r v o i s i k s i + e r i a r v o i s u u d e n + e r i a r v o i s u u d e s t a + e r i a r v o i s u u k s i e n + e r i a r v o i s u u s + e r i a r v o i s u u t e e n + e r i a r v o i s u u t t a + e r i a s t e i n e n + e r i a s t e i s e n + e r i a s t e i s e s t i + e r i a s t e i s i a + e r i a s t e i s i l l e + e r i a s t e i s i n a + e r i a s t e i s i s t a + e r i a s t e i s t a + e r i e j ä r v i + e r i e t + e r i k i e l i s e t + e r i k o i s a i h e i s s a + e r i k o i s a i n e i s s a + e r i k o i s a j o n e u v o j a + e r i k o i s a j o n e u v o j e n + e r i k o i s a j o n e u v o t + e r i k o i s a l a + e r i k o i s a l a a + e r i k o i s a l a a n + e r i k o i s a l a a n n e + e r i k o i s a l a a n s a + e r i k o i s a l a l l a + e r i k o i s a l a n s a + e r i k o i s a l a s t a + e r i k o i s a l e n n u k s i a + e r i k o i s a l o i l l a + e r i k o i s a l o i l l a a n + e r i k o i s a l o i l t a + e r i k o i s a l o i n a + e r i k o i s a l o i s t a a n + e r i k o i s a l o j a + e r i k o i s a l o j a a n + e r i k o i s a l o j e n + e r i k o i s a l u e e t + e r i k o i s a s e m a + e r i k o i s a s e m a n + e r i k o i s a s e m a s s a + e r i k o i s a s e m a s t a + e r i k o i s a s i a n t u n t e m u s + e r i k o i s e d u n + e r i k o i s e d u s t a j a + e r i k o i s e d u s t a j a n + e r i k o i s e l i n + e r i k o i s e l i n t a r v i k k e i t a + e r i k o i s e l l e + e r i k o i s e l t a + e r i k o i s e m p a a + e r i k o i s e s i t t e l i j ä n + e r i k o i s e s t a + e r i k o i s f u n k t i o + e r i k o i s h a n k k e i t a + e r i k o i s h e n k i l ö k u n t a + e r i k o i s h e n k i l ö s t ö n + e r i k o i s h e n k i l ö s t ö ä + e r i k o i s h i n n o i t t e l u n + e r i k o i s h o i d o n + e r i k o i s h o i t o a + e r i k o i s h o i t o j a + e r i k o i s h o i t o o n + e r i k o i s h u i p p u k o k o u k s e s s a + e r i k o i s h u o m i o n + e r i k o i s h u o m i o t a + e r i k o i s h y ö d y k k e e n + e r i k o i s i a + e r i k o i s i n t a + e r i k o i s i s t u n t o + e r i k o i s j o u k k o + e r i k o i s j o u k k o a + e r i k o i s j o u k k o j a + e r i k o i s j o u k k o j e n + e r i k o i s j o u k k o n s a + e r i k o i s j o u k o i l l e + e r i k o i s j o u k o i s t a + e r i k o i s j o u k o t + e r i k o i s j ä r j e s t e l y i s t ä + e r i k o i s j ä r j e s t e l y j ä + e r i k o i s j ä r j e s t e l y t + e r i k o i s j ä r j e s t ö i s s ä + e r i k o i s j ä r j e s t ö j e n + e r i k o i s j ä r j e s t ö n + e r i k o i s j ä ä k ä r i t + e r i k o i s k a n k a a t + e r i k o i s k a s v i + e r i k o i s k e m i k a a l e j a + e r i k o i s k e r t o m u k s e s s a + e r i k o i s k e r t o m u k s e t + e r i k o i s k e r t o m u s t a + e r i k o i s k e s k u s t a + e r i k o i s k i r j e e n v a i h t a j a + e r i k o i s k i r j e e n v a i h t a j a n s a + e r i k o i s k o h t e l u + e r i k o i s k o h t e l u a + e r i k o i s k o h t e l u n + e r i k o i s k o n e e l l a + e r i k o i s k o u l u i h i n + e r i k o i s k o u l u t e t t u j a + e r i k o i s k o u l u t u k s e e n + e r i k o i s k o u l u t u k s e n + e r i k o i s k o u l u t u s + e r i k o i s k o u l u t u s t a + e r i k o i s k r i t e e r i + e r i k o i s k u l j e t u k s e l l a + e r i k o i s k u l j e t u s + e r i k o i s k ä s i t t e l y ä + e r i k o i s k ä y t t ö ä + e r i k o i s l a a t u i n e n + e r i k o i s l a a t u i s e n + e r i k o i s l a a t u i s e s s a + e r i k o i s l a a t u i s e t + e r i k o i s l a a t u i s i l l e + e r i k o i s l a a t u i s u u d e n + e r i k o i s l a a t u i s u u s + e r i k o i s l a a t u i s u u t t a + e r i k o i s l a b o r a t o r i o i d e n + e r i k o i s l a i n s ä ä d ä n n ö n + e r i k o i s l a i t t e i s t o j a + e r i k o i s l a i t t e i t a + e r i k o i s l a k i e n + e r i k o i s l a u s e k k e i t a + e r i k o i s l e n n o l l a + e r i k o i s l i h a t u o t t e i d e n + e r i k o i s l i i t e + e r i k o i s l u o n t e e n + e r i k o i s l u p a + e r i k o i s l ä h e t t i l ä i d e n + e r i k o i s l ä h e t t i l ä s + e r i k o i s l ä h e t t i l ä s t ä + e r i k o i s l ä h e t t i l ä s t ä m m e + e r i k o i s l ä h e t t i l ä ä k s i + e r i k o i s l ä h e t t i l ä ä m m e + e r i k o i s l ä h e t t i l ä ä n + e r i k o i s l ä h e t t i l ä ä n ä + e r i k o i s l ä h e t t i l ä ä s e e n + e r i k o i s l ä h e t t i l ä ä s t ä + e r i k o i s l ä h e t t i l ä ä t + e r i k o i s l ä ä k e t i e t e e n + e r i k o i s l ä ä k ä r e i d e n + e r i k o i s l ä ä k ä r i n + e r i k o i s m a a l e j a + e r i k o i s m a i n i n t a + e r i k o i s m a k s u t o n t a + e r i k o i s m a r k k i n o i t a + e r i k o i s m e n e t t e l y j ä + e r i k o i s m e n e t t e l y n + e r i k o i s m i e t i n n ö n + e r i k o i s m i e t i n t ö + e r i k o i s m u o d o s s a + e r i k o i s m u u n n o k s i a + e r i k o i s m ä ä r ä y k s e t + e r i k o i s m ä ä r ä y k s i i n + e r i k o i s n u m e r o o n + e r i k o i s o h j e l m a + e r i k o i s o h j e l m a a + e r i k o i s o h j e l m i a + e r i k o i s o h j e l m i s t o j a + e r i k o i s o l o i h i n + e r i k o i s o l o i s s a + e r i k o i s o l o s u h t e i t a + e r i k o i s o s a a m i s t a + e r i k o i s o s a s t o + e r i k o i s o s a s t o j e n + e r i k o i s p a l v e l u j a + e r i k o i s p a p e r e i d e n + e r i k o i s p i i r r e + e r i k o i s p i i r t e e t + e r i k o i s p i i r t e i d e n + e r i k o i s p i i r t e i t ä + e r i k o i s p o l i i s i n + e r i k o i s p o l i i s i y k s i k k ö j e n + e r i k o i s p r o o m u n + e r i k o i s p ä t e v y y d e n + e r i k o i s p ä ä t ö s + e r i k o i s r a h a s t o n + e r i k o i s r a h a t + e r i k o i s r a p o r t t i + e r i k o i s r a t a + e r i k o i s r a t k a i s u n + e r i k o i s r y h m i e n + e r i k o i s r y h m ä s t ä + e r i k o i s s a i r a a l o i d e n + e r i k o i s s a i r a a n h o i d o n + e r i k o i s s a i r a a n h o i t a j i a + e r i k o i s s a i r a a n h o i t a j i e n + e r i k o i s s a i r a a n h o i t o + e r i k o i s s a i r a a n h o i t o a + e r i k o i s s a n o m a a + e r i k o i s s e k t o r e j a + e r i k o i s s u h t e i t a + e r i k o i s s ä ä n t ö j ä + e r i k o i s s ä ä t e l y s t ä + e r i k o i s t a i t o j a + e r i k o i s t a i t o j e n + e r i k o i s t a p a h t u m i a + e r i k o i s t a p a u k s e n + e r i k o i s t a p a u k s e n a + e r i k o i s t a p a u k s e n s a + e r i k o i s t a p a u k s e s s a + e r i k o i s t a p a u k s e s t a + e r i k o i s t a p a u k s e t + e r i k o i s t a p a u k s i a + e r i k o i s t a p a u k s i i n + e r i k o i s t a p a u k s i s s a + e r i k o i s t a p a u s + e r i k o i s t a p a u s t a + e r i k o i s t a p a u s t e n + e r i k o i s t a r i f f i l l a + e r i k o i s t a r i f f i t + e r i k o i s t a r j o u k s e n a + e r i k o i s t a r j o u k s e t + e r i k o i s t a r j o u k s i a + e r i k o i s t a r j o u s t e n + e r i k o i s t a r k k a i l i j a r y h m ä n + e r i k o i s t e h o s t e + e r i k o i s t e h o s t e t e k n i k k o + e r i k o i s t e h t ä v ä t + e r i k o i s t e k n i i k k a a + e r i k o i s t e r m i n a a l e j a + e r i k o i s t e r m i n o l o g i a n + e r i k o i s t e r v e y d e n h o i t o a + e r i k o i s t e r v e y d e n h o i t o o n + e r i k o i s t e r v e y d e n h u o l l o n + e r i k o i s t i e d o n + e r i k o i s t i e t e i d e n + e r i k o i s t i l a n n e + e r i k o i s t i l a n n e t t a + e r i k o i s t i l a n t e e l l e + e r i k o i s t i l a n t e e n + e r i k o i s t i l a n t e e s s a + e r i k o i s t i l a n t e i s s a + e r i k o i s t i l a n t e i t a + e r i k o i s t o i m e n p i t e e t + e r i k o i s t o i m e n p i t e i t ä + e r i k o i s t o i m e t + e r i k o i s t o i m i i n + e r i k o i s t o i m i k u n n a t + e r i k o i s t u k i e n + e r i k o i s t u m a a n + e r i k o i s t u m i s k o u l u t u s + e r i k o i s t u m i s k o u l u t u s t a + e r i k o i s t u m i s k u r s s e i l l e + e r i k o i s t u m i s k u r s s e j a + e r i k o i s t u m i s m a h d o l l i s u u k s i a + e r i k o i s t u m i s m a l l i t + e r i k o i s t u m i s o h j e l m i a + e r i k o i s t u m i s s o p i m u k s i a + e r i k o i s t u m i s s o p i m u k s i i n + e r i k o i s t u m i s s o p i m u s t e n + e r i k o i s t u m i s t a + e r i k o i s t u n e e m m a n + e r i k o i s t u n e e m p i e n + e r i k o i s t u n e e n + e r i k o i s t u n e e t + e r i k o i s t u n e i d e n + e r i k o i s t u n e i l t a + e r i k o i s t u n e i n + e r i k o i s t u n e i t a + e r i k o i s t u n t e m u s t a + e r i k o i s t u n u t t a + e r i k o i s t u o m a r i n + e r i k o i s t u o m i o i s t u i m i a + e r i k o i s t u o t e + e r i k o i s t u o t t e i d e n + e r i k o i s t u o t t e i s i i n + e r i k o i s t u o t t e i s s a + e r i k o i s t u o t t e i t a + e r i k o i s t u p a k k a n a + e r i k o i s t u t k i j a t + e r i k o i s t u t k i m u s + e r i k o i s t u t k i m u s t a + e r i k o i s t u t k i n t a e l i n t e n + e r i k o i s t y ö r y h m ä + e r i k o i s t y ö v o i m a a + e r i k o i s t ä y s i s t u n t o + e r i k o i s u u k s i a + e r i k o i s u u k s i a m m e + e r i k o i s v a k u u s + e r i k o i s v a l i o k u n n a n + e r i k o i s v a l i o k u n t a a n + e r i k o i s v a l i o k u n t i i n + e r i k o i s v a l m i u s a l u k s i a + e r i k o i s v a l t u u s k u n n a n + e r i k o i s v a n k i l o i s s a + e r i k o i s v i r a s t o + e r i k o i s v ä l i n e e t + e r i k o i s v ä l i n e i s t ö n + e r i k o i s v ä l i n e i s t ö ä + e r i k o i s y k s i k k ö + e r i k o i s y k s i k k ö j e n + e r i k o i s y k s i k k ö j e n s ä + e r i k o i s y k s i k k ö ö n + e r i k o i s y k s i k ö i d e n + e r i k o i s y k s i k ö i h i n + e r i k o i s y k s i k ö i s s ä + e r i k o i s y k s i k ö i t ä + e r i k o i s y k s i k ö n + e r i k o i s y k s i k ö t + e r i k o k o i s i a + e r i k o k o i s i n a + e r i l a a t u i s i a + e r i l a a t u i s i n a + e r i l a a t u i s i s t a + e r i l a a t u i s t a + e r i l a i l l a + e r i l a i s e l l a + e r i l a i s e l t a + e r i l a i s e m p i a + e r i l a i s e m p i i n + e r i l a i s e n + e r i l a i s e n a + e r i l a i s e s s a + e r i l a i s e s t a + e r i l a i s e t + e r i l a i s i a + e r i l a i s i a k i n + e r i l a i s i i n + e r i l a i s i k s i + e r i l a i s i l l a + e r i l a i s i l l e + e r i l a i s i l t a + e r i l a i s i m m a t + e r i l a i s i m m i l l a + e r i l a i s i m m i l l e + e r i l a i s i m m i s s a + e r i l a i s i m m i s t a + e r i l a i s i m p i a + e r i l a i s i m p i e n + e r i l a i s i m p i i n + e r i l a i s i m p i n e + e r i l a i s i n + e r i l a i s i n e + e r i l a i s i n t a + e r i l a i s i s s a + e r i l a i s i s t a + e r i l a i s t a m i s p o l i t i i k k a a + e r i l a i s t e n + e r i l a i s t u m i s t a + e r i l a i s u u d e n + e r i l a i s u u d e s s a + e r i l a i s u u d e s s a a n + e r i l a i s u u d e s s a m m e + e r i l a i s u u t e e n + e r i l a i s u u t t a + e r i l l e e n + e r i l l i s a l u e + e r i l l i s a l u e e l l a + e r i l l i s a l u e i d e n + e r i l l i s a l u e i t a + e r i l l i s a s e m a n + e r i l l i s a s e m a s s a + e r i l l i s e e n + e r i l l i s e k s i + e r i l l i s e n + e r i l l i s e n ä + e r i l l i s e s s ä + e r i l l i s e t + e r i l l i s h a l l i n t o o n + e r i l l i s i i n + e r i l l i s i k s i + e r i l l i s i l l e + e r i l l i s i l l ä + e r i l l i s i n + e r i l l i s i n ä + e r i l l i s i s s ä + e r i l l i s i ä + e r i l l i s j o u s i t u s + e r i l l i s k e r ä y k s e n + e r i l l i s k e r ä y k s e s t ä + e r i l l i s k e r ä y s + e r i l l i s k e r ä y s s u u n n i t e l m i a + e r i l l i s k e r ä y s t ä + e r i l l i s k e s k u s t e l u + e r i l l i s k o h t e l u a + e r i l l i s k o h t e l u n + e r i l l i s k o h t e l u u n + e r i l l i s k y s y m y k s e n + e r i l l i s l u p i e n + e r i l l i s l u v a t + e r i l l i s n e u v o t t e l u j a + e r i l l i s o h j e l m i e n + e r i l l i s p r o j e k t e j a + e r i l l i s r a t k a i s u j a + e r i l l i s r a t k a i s u n + e r i l l i s r a t k a i s u t + e r i l l i s s ä ä n n ö n + e r i l l i s t a r k a s t e l u + e r i l l i s t ä + e r i l l i s v i r a s t o a + e r i l l i s v i r a s t o i h i n + e r i l l i s v i r a s t o i l l a + e r i l l i s v i r a s t o i l l e + e r i l l i s v i r a s t o i s t a + e r i l l i s v i r a s t o j a + e r i l l i s v i r a s t o j e n + e r i l l i s v i r a s t o j ä r j e s t e l m ä ä + e r i l l i s v i r a s t o k s i + e r i l l i s v i r a s t o l l e + e r i l l i s v i r a s t o n + e r i l l i s v i r a s t o t + e r i l l i s y h t i ö i d e n + e r i l l i s y h t i ö i s t ä + e r i l l i s y h t i ö i t ä + e r i l l i s y k s i k k ö j e n + e r i l l i s y k s i k ö i h i n + e r i l l i s y y t t ä + e r i l l ä ä n + e r i l u o n t e i s i a + e r i m a a l a i s i a + e r i m a a l a i s t a + e r i m a l l i s e l l a + e r i m e r k k i s t e n + e r i m i e l i n e n + e r i m i e l i s i n ä + e r i m i e l i s i ä + e r i m i e l i s y y d e n + e r i m i e l i s y y d e s t ä + e r i m i e l i s y y d e s t ä m m e + e r i m i e l i s y y d e t + e r i m i e l i s y y k s i e m m e + e r i m i e l i s y y k s i e n + e r i m i e l i s y y k s i e n s ä + e r i m i e l i s y y k s i s t ä + e r i m i e l i s y y k s i t t ä + e r i m i e l i s y y k s i ä + e r i m i e l i s y y k s i ä m m e + e r i m i e l i s y y s + e r i m i e l i s y y t e m m e + e r i m i e l i s y y t e n s ä + e r i m i e l i s y y t t ä + e r i m i e l t ä + e r i m i t t a i s i a + e r i n o m a i s e e n + e r i n o m a i s e k s i + e r i n o m a i s e l l a + e r i n o m a i s e l l e + e r i n o m a i s e l t a + e r i n o m a i s e n + e r i n o m a i s e n a + e r i n o m a i s e s s a + e r i n o m a i s e s t a + e r i n o m a i s e t + e r i n o m a i s i a + e r i n o m a i s i i n + e r i n o m a i s i k s i + e r i n o m a i s i s s a + e r i n o m a i s i s t a + e r i n o m a i s t a + e r i n o m a i s t e n + e r i n o m a i s u u d e s t a + e r i n o p e u k s i s i a + e r i o i k e u k s i a + e r i o i k e u s m ä ä r ä y s + e r i o i k e u s t a p a u k s i a + e r i p a l k k a i s u u d e n + e r i p a l k k a i s u u t t a + e r i p a r i s e t + e r i p i t u i s i s t a + e r i p u o l i l l a + e r i p u r a a + e r i p u r a i s e k s i + e r i r o t u i s i a + e r i r o t u i s t e n + e r i s k u m m a l l i s t a + e r i s t e i d e n + e r i s t e m a t e r i a a l i e n + e r i s t e t t y n ä + e r i s t e t y i s s ä + e r i s t e t y k s i + e r i s t e t y m p ä ä n + e r i s t e t ä ä n + e r i s t y k s e e n + e r i s t y k s i i n + e r i s t y n e e m m ä t + e r i s t y n e e m p i + e r i s t y n e i d e n + e r i s t y n e i s y y d e n + e r i s t y n e i s y y d e n t u n n e t t a a n + e r i s t y n e i s y y d e s t ä + e r i s t y s a i t a + e r i s t y s h u o n e i s t a + e r i s t y s k e t j u i n e e n + e r i s t y s l e i r i + e r i s t y s l e i r i e n + e r i s t y s m a t e r i a a l e j a + e r i s t y s m a t e r i a a l i + e r i s t y s m a t e r i a a l i t + e r i s t y s m e k a n i s m e i h i n + e r i s t y s m e n e t t e l y n + e r i s t y s m u u r i a + e r i s t y s m u u r i i n + e r i s t y s m u u r i n + e r i s t y s m u u r i s t a + e r i s t y s s e l l e i h i n + e r i s t y s s e l l e i s s ä + e r i s t y s s e l l i e n + e r i s t y s s e l l i i n + e r i s t y s s e l l i n + e r i s t y s s e l l i r a n g a i s t u k s e n + e r i s t y s s e l l i s s ä + e r i s t y s s e l l i t + e r i s t y s t a s o a + e r i s t y s t y ö t + e r i s t y s v a a h d o t + e r i s t y s v a n k e u d e n + e r i s t y s v a n k e u s + e r i s t y s v a n k i l a t + e r i s t ä k ä ä m m e + e r i s t ä m i s e e n + e r i s t ä m i s e k s i + e r i s t ä m i s e l l e + e r i s t ä m i s e s t ä + e r i s t ä m i s p o l i t i i k a l l e + e r i s t ä m i s p o l i t i i k k a + e r i s t ä m i s p o l i t i i k k a a + e r i s t ä m i s t o i m e n p i t e e t + e r i s t ä m i s t o i m e n p i t e i d e n + e r i s t ä m i s t o i m e n p i t e i s s ä + e r i s t ä m i s y r i t y k s i ä + e r i s t ä m ä l l ä + e r i s t ä m ä t t ä + e r i s t ä y t y m i s e n + e r i s t ä y t y m i s e s t ä + e r i s t ä y t y m i s p o l i t i i k k a + e r i s t ä y t y m i s p o l i t i i k k a a n s a + e r i s t ä y t y m i s p y r k i m y k s i ä + e r i s t ä y t y m ä l l ä + e r i s t ä y t y n e e m p i + e r i s t ä y t y n e e t + e r i s t ä y t y n e i m m ä t + e r i s t ä y t y y + e r i s t ä ä + e r i s u u n t a i s e t + e r i s u u n t a i s i a + e r i s u u r u i s t a + e r i t a s o i n e n + e r i t a s o i s e n + e r i t a s o i s e s t a + e r i t a s o i s e s t i + e r i t a s o i s e t + e r i t a s o i s i a + e r i t a s o i s i i n + e r i t a s o i s i s s a + e r i t a s o i s t a + e r i t a s o i s t e n + e r i t e l l e s s ä n n e + e r i t e l l y m p ä ä + e r i t e l l ä ä n + e r i t e l m i ä + e r i t e l m ä ä + e r i t e l t y j ä + e r i t t e l e e + e r i t t e l e m ä t t ä + e r i t t e l e m ä ä n + e r i t t e l y j e n + e r i t t e l y s t ä + e r i t t e l y t + e r i t t e l y y n + e r i t t e l y ä + e r i t y i s a i h e + e r i t y i s a i h e e s e e n + e r i t y i s a i h e e s t a + e r i t y i s a i h e i s i i n + e r i t y i s a i h e i s s a + e r i t y i s a i h e i s t a + e r i t y i s a i h e i t a + e r i t y i s a i h e t t a + e r i t y i s a j o n e u v o j a + e r i t y i s a j o n e u v o j a a n + e r i t y i s a j o n e u v o j e n + e r i t y i s a k a t e m i a t + e r i t y i s a l a + e r i t y i s a l a a + e r i t y i s a l a a n + e r i t y i s a l a k o m i t e a n + e r i t y i s a l a l l a + e r i t y i s a l a l l e + e r i t y i s a l a l t a + e r i t y i s a l a n + e r i t y i s a l a s t a + e r i t y i s a l a t + e r i t y i s a l a t u n t e m u k s e n + e r i t y i s a l e n n u k s i a + e r i t y i s a l e n n u s t a + e r i t y i s a l o i h i n + e r i t y i s a l o i l l a + e r i t y i s a l o i l l a a n + e r i t y i s a l o i l l e + e r i t y i s a l o i s t a + e r i t y i s a l o i t e + e r i t y i s a l o i t e t t a + e r i t y i s a l o i t t e e l l a + e r i t y i s a l o i t t e e t + e r i t y i s a l o i t t e i d e n + e r i t y i s a l o i t t e i s i i n + e r i t y i s a l o i t t e i s s a + e r i t y i s a l o i t t e i t a + e r i t y i s a l o j a + e r i t y i s a l o j e n + e r i t y i s a l u e + e r i t y i s a l u e e l l a + e r i t y i s a l u e e n + e r i t y i s a l u e e s e e n + e r i t y i s a l u e e t + e r i t y i s a l u e i d e n + e r i t y i s a l u e i l l a + e r i t y i s a l u e i l l e + e r i t y i s a l u e i s i i n + e r i t y i s a l u e i s t a + e r i t y i s a l u e i t a + e r i t y i s a l u e i t a a n + e r i t y i s a l u e t t a + e r i t y i s a n a l y y s e i h i n + e r i t y i s a n a l y y s i n + e r i t y i s a n s i o i d e n + e r i t y i s a p u a + e r i t y i s a p u r a h o j a + e r i t y i s a p u u n + e r i t y i s a r t i k l a + e r i t y i s a r t i k l a n + e r i t y i s a r v i o i n n i n + e r i t y i s a r v i o i s t a + e r i t y i s a r v i o i t a + e r i t y i s a r v i o n + e r i t y i s a r v o + e r i t y i s a r v o j e n + e r i t y i s a r v o n + e r i t y i s a s e m a + e r i t y i s a s e m a a + e r i t y i s a s e m a a n + e r i t y i s a s e m a a n s a + e r i t y i s a s e m a l l e + e r i t y i s a s e m a m m e + e r i t y i s a s e m a n + e r i t y i s a s e m a n s a + e r i t y i s a s e m a s s a + e r i t y i s a s e m a s t a + e r i t y i s a s e t u k s e n + e r i t y i s a s e t u k s e s s a + e r i t y i s a s e t u s + e r i t y i s a s i a a + e r i t y i s a s i a k i r j a n + e r i t y i s a s i a n + e r i t y i s a s i a n t u n t e m u s + e r i t y i s a s i a n t u n t e m u s t a + e r i t y i s a s i a n t u n t e m u s t a a n + e r i t y i s a s i a n t u n t i j o i s t a + e r i t y i s a s i a n t u n t i j o i t a + e r i t y i s a s i a s t a + e r i t y i s a s i o i s s a + e r i t y i s a s i o i s t a + e r i t y i s a s i o i t a + e r i t y i s a v u l l a + e r i t y i s a v u n + e r i t y i s a v u s t u k s e t + e r i t y i s a v u s t u k s i a + e r i t y i s a v u s t u s t a + e r i t y i s b u d j e t i n + e r i t y i s b u d j e t t i + e r i t y i s b u d j e t t i m e n e t t e l y i t ä + e r i t y i s d i r e k t i i v e i l l e + e r i t y i s d i r e k t i i v e i s s ä + e r i t y i s d i r e k t i i v e j ä + e r i t y i s d i r e k t i i v i + e r i t y i s d i r e k t i i v i e n + e r i t y i s d i r e k t i i v i i n + e r i t y i s d i r e k t i i v i n + e r i t y i s d i r e k t i i v i s s ä + e r i t y i s d i r e k t i i v i s t ä + e r i t y i s d i r e k t i i v i t + e r i t y i s d i r e k t i i v i ä + e r i t y i s e d e l l y t y k s e t + e r i t y i s e d e l l y t y k s i n e e n + e r i t y i s e d e l l y t y k s i s t ä + e r i t y i s e d e l l y t y k s i ä + e r i t y i s e d e l l y t y s t e n + e r i t y i s e d u i l l e + e r i t y i s e d u i s t a + e r i t y i s e d u s t a j a + e r i t y i s e d u s t a j a a + e r i t y i s e d u s t a j a a n + e r i t y i s e d u s t a j a k s i + e r i t y i s e d u s t a j a l l a + e r i t y i s e d u s t a j a l l a m m e + e r i t y i s e d u s t a j a l l e + e r i t y i s e d u s t a j a m m e + e r i t y i s e d u s t a j a n + e r i t y i s e d u s t a j a n a + e r i t y i s e d u s t a j a n s a + e r i t y i s e d u s t a j a t + e r i t y i s e d u s t a j i a + e r i t y i s e d u s t a j i e n + e r i t y i s e d u s t a j i i n + e r i t y i s e d u s t a j i k s i + e r i t y i s e d u s t a j i l l a + e r i t y i s e d u s t a j i l l e + e r i t y i s e d u s t a j i s t a + e r i t y i s e d u t + e r i t y i s e e n + e r i t y i s e h d o i n + e r i t y i s e h d o i s t a + e r i t y i s e h d o t + e r i t y i s e h d o t u k s e e n + e r i t y i s e h d o t u k s e n + e r i t y i s e h d o t u k s e t + e r i t y i s e h d o t u k s i a + e r i t y i s e h d o t u k s i s t a + e r i t y i s e h d o t u s t a + e r i t y i s e h t o i n e e n + e r i t y i s e h t o j a + e r i t y i s e h t o j e n + e r i t y i s e k s i + e r i t y i s e l i m i l l e + e r i t y i s e l i m i l t ä + e r i t y i s e l i m i s s ä + e r i t y i s e l i n + e r i t y i s e l i n t e n + e r i t y i s e l l e + e r i t y i s e l l ä + e r i t y i s e m m i n + e r i t y i s e m m ä s t ä + e r i t y i s e m p ä ä + e r i t y i s e n ä + e r i t y i s e s i m e r k k e j ä + e r i t y i s e s i t t e l i j ä + e r i t y i s e s i t t e l i j ä n ä + e r i t y i s e s i t t e l i j ä ä + e r i t y i s e s i t t e l i j ö i d e n + e r i t y i s e s i t t e l i j ö i t ä + e r i t y i s e s s ä + e r i t y i s e s t ä + e r i t y i s e t + e r i t y i s e t u + e r i t y i s e t u i h i n + e r i t y i s e t u j a + e r i t y i s e t u j a a n + e r i t y i s e t u j e n + e r i t y i s e t u n s a + e r i t y i s e t u u d e t + e r i t y i s e t u u k s i a + e r i t y i s e t u u k s i s t a + e r i t y i s e t u u s + e r i t y i s h a a s t e + e r i t y i s h a a s t e e t + e r i t y i s h a a s t e i t a + e r i t y i s h a i t a t + e r i t y i s h a i t o i s t a + e r i t y i s h a i t t o i h i n + e r i t y i s h a l l i n t o a l u e + e r i t y i s h a l l i n t o a l u e e k s i + e r i t y i s h a l l i n t o a l u e e l l a + e r i t y i s h a l l i n t o a l u e e l l e + e r i t y i s h a l l i n t o a l u e e n + e r i t y i s h a l l i n t o a l u e e n a + e r i t y i s h a l l i n t o a l u e e s t a + e r i t y i s h a n k e t t a + e r i t y i s h a n k i n t o j a + e r i t y i s h a n k k e e n + e r i t y i s h a n k k e e s t a + e r i t y i s h a n k k e e t + e r i t y i s h a n k k e i d e n + e r i t y i s h a n k k e i l l a + e r i t y i s h a n k k e i l l e + e r i t y i s h a n k k e i s i i n + e r i t y i s h a n k k e i s t a + e r i t y i s h a n k k e i t a + e r i t y i s h e l p o t u k s i a + e r i t y i s h e n k i l ö i d e n + e r i t y i s h e n k i l ö k u n t a a + e r i t y i s h e r k k y y s + e r i t y i s h i n n o i s t a + e r i t y i s h o i t o + e r i t y i s h o i t o a + e r i t y i s h o i t o m u o t o j a + e r i t y i s h u i p p u k o k o u k s e e n + e r i t y i s h u i p p u k o k o u k s e n + e r i t y i s h u i p p u k o k o u k s e s s a + e r i t y i s h u i p p u k o k o u k s e s t a + e r i t y i s h u i p p u k o k o u s + e r i t y i s h u o l e n s a + e r i t y i s h u o l e t + e r i t y i s h u o m a u t u k s e n + e r i t y i s h u o m a u t u k s i i n + e r i t y i s h u o m a u t u s t a + e r i t y i s h u o m i o + e r i t y i s h u o m i o i h i n + e r i t y i s h u o m i o i t a + e r i t y i s h u o m i o m m e + e r i t y i s h u o m i o n + e r i t y i s h u o m i o o n + e r i t y i s h u o m i o s t a + e r i t y i s h u o m i o t a + e r i t y i s h u o m i o t a m m e + e r i t y i s h y ö t y j ä + e r i t y i s i d e n t i t e e t t i ä + e r i t y i s i i n + e r i t y i s i k s i + e r i t y i s i l l ä + e r i t y i s i n f r a s t r u k t u u r i i n + e r i t y i s i n t r e s s e i h i n + e r i t y i s i n t r e s s e i s t ä ä n + e r i t y i s i n t r e s s e j ä + e r i t y i s i n t r e s s i + e r i t y i s i n t r e s s i e n + e r i t y i s i n t r e s s i t + e r i t y i s i n v e s t o i n t e j a + e r i t y i s i n v e s t o i n t i v ä l i n e e n + e r i t y i s i s s ä + e r i t y i s i s t u n n o l l a + e r i t y i s i s t u n n o l l e + e r i t y i s i s t u n n o n + e r i t y i s i s t u n n o s s a + e r i t y i s i s t u n n o s t a + e r i t y i s i s t u n t o + e r i t y i s i s t u n t o a + e r i t y i s i s t u n t o j a + e r i t y i s i s t u n t o n s a + e r i t y i s i s t u n t o o n + e r i t y i s i s t ä + e r i t y i s i ä + e r i t y i s j a o s t o + e r i t y i s j o u k k o + e r i t y i s j o u k k o j a + e r i t y i s j o u k k o j e n + e r i t y i s j u l k a i s u j e n + e r i t y i s j u n a + e r i t y i s j ä r j e s t e l m i ä + e r i t y i s j ä r j e s t e l m ä + e r i t y i s j ä r j e s t e l m ä n + e r i t y i s j ä r j e s t e l m ä ä + e r i t y i s j ä r j e s t e l y + e r i t y i s j ä r j e s t e l y i d e n + e r i t y i s j ä r j e s t e l y i h i n + e r i t y i s j ä r j e s t e l y i l l ä + e r i t y i s j ä r j e s t e l y i n + e r i t y i s j ä r j e s t e l y i s t ä + e r i t y i s j ä r j e s t e l y i t ä + e r i t y i s j ä r j e s t e l y j e n + e r i t y i s j ä r j e s t e l y j ä + e r i t y i s j ä r j e s t e l y n + e r i t y i s j ä r j e s t e l y n ä + e r i t y i s j ä r j e s t e l y t + e r i t y i s j ä r j e s t e l y ä + e r i t y i s j ä r j e s t ö + e r i t y i s j ä r j e s t ö i s s ä + e r i t y i s j ä r j e s t ö j e n + e r i t y i s j ä r j e s t ö j ä + e r i t y i s j ä r j e s t ö t + e r i t y i s k a l a s t u k s e e n + e r i t y i s k a l a s t u k s e n + e r i t y i s k a l a s t u s l u v a t + e r i t y i s k a l a s t u s t a + e r i t y i s k a m p a n j o i d e n + e r i t y i s k a n n u s t i m i a + e r i t y i s k a n n u s t i m i e n + e r i t y i s k a n n u s t i n + e r i t y i s k a p p a l e e n + e r i t y i s k a t e g o r i a a + e r i t y i s k a u p u n g i t + e r i t y i s k e i n o j a + e r i t y i s k e i n o n a + e r i t y i s k e i n o t + e r i t y i s k e m i k a a l e i s t a + e r i t y i s k e r t o m u k s e e n + e r i t y i s k e r t o m u k s e l l a + e r i t y i s k e r t o m u k s e l l e + e r i t y i s k e r t o m u k s e m m e + e r i t y i s k e r t o m u k s e n + e r i t y i s k e r t o m u k s e n a + e r i t y i s k e r t o m u k s e n s a + e r i t y i s k e r t o m u k s e s s a + e r i t y i s k e r t o m u k s e s s a a n + e r i t y i s k e r t o m u k s e s s a m m e + e r i t y i s k e r t o m u k s e s t a + e r i t y i s k e r t o m u k s e s t a n i + e r i t y i s k e r t o m u k s e t + e r i t y i s k e r t o m u k s i a + e r i t y i s k e r t o m u k s i i n + e r i t y i s k e r t o m u k s i n a + e r i t y i s k e r t o m u k s i s s a + e r i t y i s k e r t o m u k s i s s a a n + e r i t y i s k e r t o m u k s i s t a + e r i t y i s k e r t o m u s + e r i t y i s k e r t o m u s t a + e r i t y i s k e r t o m u s t e n + e r i t y i s k e s k u s t e l u + e r i t y i s k e s k u s t e l u a + e r i t y i s k e s k u s t e l u j a + e r i t y i s k e s k u s t e l u n + e r i t y i s k i e l e n s ä + e r i t y i s k i e l t o + e r i t y i s k i e l t ä ä n + e r i t y i s k i i n t i ö + e r i t y i s k i i n t i ö i d e n + e r i t y i s k i i n t i ö i t ä + e r i t y i s k i i n t i ö n + e r i t y i s k i i t o k s e m m e + e r i t y i s k i i t o k s e n + e r i t y i s k i i t o k s e n i + e r i t y i s k i i t o k s e n s a + e r i t y i s k i i t o k s e t + e r i t y i s k i i t o s + e r i t y i s k i r j a n p i t o a + e r i t y i s k o h d a s t a + e r i t y i s k o h t a + e r i t y i s k o h t a a + e r i t y i s k o h t a a n + e r i t y i s k o h t e l u + e r i t y i s k o h t e l u a + e r i t y i s k o h t e l u l l a + e r i t y i s k o h t e l u n + e r i t y i s k o h t e l u s t a + e r i t y i s k o h t e l u u n + e r i t y i s k o h t i i n + e r i t y i s k o k e i d e n + e r i t y i s k o k e i l u t + e r i t y i s k o k e i t a + e r i t y i s k o k e m u k s i a + e r i t y i s k o k e m u s t a + e r i t y i s k o k o o n p a n o j e n + e r i t y i s k o k o o n p a n o s t a + e r i t y i s k o k o o n p a n o t + e r i t y i s k o k o u k s e e n + e r i t y i s k o k o u k s e n + e r i t y i s k o k o u k s e s s a + e r i t y i s k o k o u k s e s t a + e r i t y i s k o k o u k s i a + e r i t y i s k o k o u s + e r i t y i s k o m i s s i o + e r i t y i s k o m i t e a + e r i t y i s k o m i t e a a n + e r i t y i s k o m i t e a n + e r i t y i s k o m i t e a s s a + e r i t y i s k o m i t e o i d e n + e r i t y i s k o m i t e o i t a + e r i t y i s k o m m e n t t e j a + e r i t y i s k o n e i s t a + e r i t y i s k o n f e r e n s s i n + e r i t y i s k o o r d i n a a t t o r i + e r i t y i s k o o r d i n a a t t o r i a + e r i t y i s k o o r d i n a a t t o r i l l e + e r i t y i s k o o r d i n a a t t o r i n + e r i t y i s k o o r d i n a a t t o r i n a + e r i t y i s k o o r d i n a a t t o r i n s a + e r i t y i s k o o r d i n a a t t o r i t + e r i t y i s k o r v a u k s e t + e r i t y i s k o u l u a + e r i t y i s k o u l u i h i n + e r i t y i s k o u l u i s s a + e r i t y i s k o u l u j a + e r i t y i s k o u l u j e n + e r i t y i s k o u l u n + e r i t y i s k o u l u s s a + e r i t y i s k o u l u t e t t u j e n + e r i t y i s k o u l u t u k s e e n + e r i t y i s k o u l u t u k s e l l a + e r i t y i s k o u l u t u k s e n + e r i t y i s k o u l u t u k s e s t a + e r i t y i s k o u l u t u s + e r i t y i s k o u l u t u s o h j e l m i i n + e r i t y i s k o u l u t u s t a + e r i t y i s k r i t e e r e j ä + e r i t y i s k r i t e e r i e n + e r i t y i s k r i t e e r i t + e r i t y i s k u l j e t u k s e e n + e r i t y i s k u l j e t u s + e r i t y i s k u l j e t u s t a + e r i t y i s k u l t t u u r i t + e r i t y i s k u l u j e n + e r i t y i s k u m p p a n i n + e r i t y i s k u m p p a n u u d e k s i + e r i t y i s k u m p p a n u u d e n + e r i t y i s k u m p p a n u u d e s s a + e r i t y i s k u m p p a n u u d e s t a + e r i t y i s k u m p p a n u u k s i e n + e r i t y i s k u m p p a n u u s + e r i t y i s k u m p p a n u u t e e n + e r i t y i s k u m p p a n u u t t a + e r i t y i s k u r s s e j a + e r i t y i s k u r s s i n + e r i t y i s k u t s u m u k s e e n + e r i t y i s k u u l e m i s t e n + e r i t y i s k y s y m y k s e e n + e r i t y i s k y s y m y k s e n + e r i t y i s k y s y m y k s e s s ä + e r i t y i s k y s y m y k s e s t ä + e r i t y i s k y s y m y k s e t + e r i t y i s k y s y m y k s i i n + e r i t y i s k y s y m y k s i i n s ä + e r i t y i s k y s y m y k s i s s ä + e r i t y i s k y s y m y k s i s t ä + e r i t y i s k y s y m y k s i ä + e r i t y i s k y s y m y s + e r i t y i s k y s y m y s t e n + e r i t y i s k y s y m y s t ä + e r i t y i s k ä s i t t e l y + e r i t y i s k ä s i t t e l y n + e r i t y i s k ä s i t t e l y s t ä + e r i t y i s k ä s i t t e l y y n + e r i t y i s k ä s i t t e l y ä + e r i t y i s k ä y t t ö + e r i t y i s k ä y t t ö ä + e r i t y i s k ä y t t ö ö n + e r i t y i s l a a d u n + e r i t y i s l a a d u s t a + e r i t y i s l a a t u + e r i t y i s l a a t u a + e r i t y i s l a a t u i n e n + e r i t y i s l a a t u i s e m p i a + e r i t y i s l a a t u i s e n + e r i t y i s l a a t u i s i a + e r i t y i s l a a t u i s i m m i s t a + e r i t y i s l a a t u i s u u d e n + e r i t y i s l a a t u i s u u s + e r i t y i s l a a t u i s u u t e e n + e r i t y i s l a a t u i s u u t t a + e r i t y i s l a a t u n s a + e r i t y i s l a e i l l a + e r i t y i s l a i l l a + e r i t y i s l a i n + e r i t y i s l a i n a t + e r i t y i s l a i n o i s t a + e r i t y i s l a i n o j e n + e r i t y i s l a i n s ä ä d ä n n ö n + e r i t y i s l a i n s ä ä d ä n n ö s t ä + e r i t y i s l a i n s ä ä d ä n t ö + e r i t y i s l a i n s ä ä d ä n t ö ä + e r i t y i s l a i n s ä ä d ä n t ö ö n + e r i t y i s l a i t + e r i t y i s l a i t o k s i i n + e r i t y i s l a i t o k s i s t a + e r i t y i s l a i t o s t e n + e r i t y i s l a i t t e i d e n + e r i t y i s l a i t t e i s t a + e r i t y i s l a i t t e i s t o a + e r i t y i s l a i t t e i t a + e r i t y i s l a j i n + e r i t y i s l a k e j a + e r i t y i s l a u s e k e + e r i t y i s l a u s e k e t t a + e r i t y i s l a u s e k k e e l l a + e r i t y i s l a u s e k k e e s e e n + e r i t y i s l a u s e k k e e s t a + e r i t y i s l a u s e k k e i t a + e r i t y i s l a u s u n t o + e r i t y i s l e n t o j e n + e r i t y i s l i i t t e e n + e r i t y i s l i s ä y k s e n + e r i t y i s l u e n t o a + e r i t y i s l u e t t e l o a a n + e r i t y i s l u o k a l l a + e r i t y i s l u o k a l l e + e r i t y i s l u o k a n + e r i t y i s l u o k k i i n + e r i t y i s l u o n n e + e r i t y i s l u o n n e t t a + e r i t y i s l u o n t e e l l e + e r i t y i s l u o n t e e n + e r i t y i s l u o n t e e n s a + e r i t y i s l u o n t e e s e e n + e r i t y i s l u o n t e e s e e n s a + e r i t y i s l u o n t e e s s a + e r i t y i s l u o n t e e s t a + e r i t y i s l u o n t e i n e n + e r i t y i s l u o n t e i s i a + e r i t y i s l u o n t e i s u u s + e r i t y i s l u o t t o j a + e r i t y i s l u p a + e r i t y i s l u p i a + e r i t y i s l u v a l l a + e r i t y i s l u v a n + e r i t y i s l ä h e s t y m i s t a p a a + e r i t y i s l ä h e t t i l ä i d e n + e r i t y i s l ä h e t t i l ä i d e n n e + e r i t y i s l ä h e t t i l ä i s t ä + e r i t y i s l ä h e t t i l ä i t ä + e r i t y i s l ä h e t t i l ä s + e r i t y i s l ä h e t t i l ä s t ä + e r i t y i s l ä h e t t i l ä ä k s i + e r i t y i s l ä h e t t i l ä ä l l e + e r i t y i s l ä h e t t i l ä ä l l e m m e + e r i t y i s l ä h e t t i l ä ä l t ä + e r i t y i s l ä h e t t i l ä ä m m e + e r i t y i s l ä h e t t i l ä ä n + e r i t y i s l ä h e t t i l ä ä n s ä + e r i t y i s l ä h e t t i l ä ä n ä + e r i t y i s l ä h e t t i l ä ä s t ä + e r i t y i s l ä h e t t i l ä ä t + e r i t y i s l ä h t e i t ä + e r i t y i s l ä ä k e m ä ä r ä y s t ä + e r i t y i s l ä ä k e t i e d e t t ä + e r i t y i s l ä ä k k e i s i i n + e r i t y i s l ä ä k k e i t ä + e r i t y i s m a h d o l l i s u u k s i a + e r i t y i s m a h d o l l i s u u s + e r i t y i s m a h d o l l i s u u t t a + e r i t y i s m a i n i n n a n + e r i t y i s m a i n i n t a + e r i t y i s m a i n i n t a a + e r i t y i s m a i n i n t a a n + e r i t y i s m a i t o k i i n t i ö i t ä + e r i t y i s m a k s u j a + e r i t y i s m a k s u j e n + e r i t y i s m a l l i n + e r i t y i s m a r k k i n a a + e r i t y i s m a r k k i n a t + e r i t y i s m a r k k i n o i h i n + e r i t y i s m a t k a a + e r i t y i s m e k a n i s m e j a + e r i t y i s m e k a n i s m i + e r i t y i s m e k a n i s m i j ä r j e s t e l m ä n + e r i t y i s m e k a n i s m i n + e r i t y i s m e n e t e l m i i n + e r i t y i s m e n e t t e l y i h i n + e r i t y i s m e n e t t e l y i l l e + e r i t y i s m e n e t t e l y i l l ä + e r i t y i s m e n e t t e l y i n + e r i t y i s m e n e t t e l y i s s ä + e r i t y i s m e n e t t e l y i s t ä + e r i t y i s m e n e t t e l y j e n + e r i t y i s m e n e t t e l y j ä + e r i t y i s m e n e t t e l y n + e r i t y i s m e n e t t e l y t + e r i t y i s m e n e t t e l y ä + e r i t y i s m e n o j a + e r i t y i s m e r k i n t ä ä n + e r i t y i s m e r k i t y k s e n + e r i t y i s m e r k i t y s + e r i t y i s m e r k i t y s t ä + e r i t y i s m i e t i n n ö n + e r i t y i s m u o d o i l l a + e r i t y i s m u o d o t + e r i t y i s m u o t o j a + e r i t y i s m u o t o o n + e r i t y i s m u u t o k s e t + e r i t y i s m y ö n n y t y k s i l l ä + e r i t y i s m ä ä r ä r a h a t + e r i t y i s m ä ä r ä r a h o j a + e r i t y i s m ä ä r ä y k s e n + e r i t y i s m ä ä r ä y k s e t + e r i t y i s m ä ä r ä y k s i i n + e r i t y i s m ä ä r ä y k s i s s ä + e r i t y i s m ä ä r ä y k s i s t ä + e r i t y i s m ä ä r ä y k s i ä + e r i t y i s m ä ä r ä y s + e r i t y i s m ä ä r ä y s t e n + e r i t y i s m ä ä r ä y s t ä + e r i t y i s n e u v o j a a n + e r i t y i s n e u v o n a n t a j a + e r i t y i s n e u v o n a n t a j a n + e r i t y i s n e u v o n a n t a j a n a + e r i t y i s n e u v o n a n t a j a n i + e r i t y i s n e u v o n a n t a j a n n e + e r i t y i s n e u v o n a n t a j a n s a + e r i t y i s n e u v o n a n t a j i a + e r i t y i s n e u v o n a n t a j i e n + e r i t y i s n e u v o s t o + e r i t y i s n e u v o s t o j a + e r i t y i s n e u v o s t o n + e r i t y i s n e u v o t t e l u t + e r i t y i s n o p e a n + e r i t y i s n o r m e j a + e r i t y i s n o s t o + e r i t y i s n u m e r o + e r i t y i s n ä k e m y k s e t + e r i t y i s n ä k ö k o h d a n + e r i t y i s n ä k ö k o h d a s t a + e r i t y i s n ä k ö k o h d a t + e r i t y i s n ä k ö k o h d i s t a + e r i t y i s n ä k ö k o h t a + e r i t y i s n ä k ö k o h t i a + e r i t y i s n ä k ö k o h t i e n + e r i t y i s n ä k ö k o h t i i n + e r i t y i s n ä k ö k u l m a + e r i t y i s o h j e l m a + e r i t y i s o h j e l m a a + e r i t y i s o h j e l m a a n + e r i t y i s o h j e l m a j ä r j e s t e l y s s ä + e r i t y i s o h j e l m a l l a + e r i t y i s o h j e l m a n + e r i t y i s o h j e l m a n s a + e r i t y i s o h j e l m a s s a + e r i t y i s o h j e l m a s t a + e r i t y i s o h j e l m a t + e r i t y i s o h j e l m i a + e r i t y i s o h j e l m i e n + e r i t y i s o h j e l m i i n + e r i t y i s o h j e l m i l l a + e r i t y i s o h j e l m i s s a + e r i t y i s o h j e l m i s t a + e r i t y i s o h j e l m i s t a m m e + e r i t y i s o i k e u d e t + e r i t y i s o i k e u k s i a + e r i t y i s o i k e u k s i e n + e r i t y i s o i k e u k s i s t a + e r i t y i s o i k e u s + e r i t y i s o i k e u t e n a + e r i t y i s o l o i h i n + e r i t y i s o l o i s s a + e r i t y i s o l o i s t a + e r i t y i s o l o j a + e r i t y i s o l o j e n + e r i t y i s o l o s u h t e e k s i + e r i t y i s o l o s u h t e e t + e r i t y i s o l o s u h t e i d e n + e r i t y i s o l o s u h t e i d e n s a + e r i t y i s o l o s u h t e i s i i n + e r i t y i s o l o s u h t e i s s a + e r i t y i s o l o s u h t e i s t a + e r i t y i s o l o s u h t e i t a + e r i t y i s o l o s u h t e i t a a n + e r i t y i s o l o t + e r i t y i s o l y m p i a l a i s i a + e r i t y i s o l y m p i a l a i s i i n + e r i t y i s o l y m p i a l a i s t e n + e r i t y i s o m i n a i s u u d e t + e r i t y i s o m i n a i s u u k s i a + e r i t y i s o m i n a i s u u k s i e n + e r i t y i s o m i n a i s u u k s i e n s a + e r i t y i s o m i n a i s u u k s i i n + e r i t y i s o m i n a i s u u s + e r i t y i s o n g e l m a + e r i t y i s o n g e l m a a + e r i t y i s o n g e l m a a n + e r i t y i s o n g e l m a m m e + e r i t y i s o n g e l m a n + e r i t y i s o n g e l m a n a + e r i t y i s o n g e l m a n s a + e r i t y i s o n g e l m a s t a + e r i t y i s o n g e l m a t + e r i t y i s o n g e l m i a + e r i t y i s o n g e l m i a a n + e r i t y i s o n g e l m i e n + e r i t y i s o n g e l m i i n + e r i t y i s o n g e l m i l l e + e r i t y i s o n g e l m i n a + e r i t y i s o n g e l m i s t a + e r i t y i s o p e r a a t i o i d e n + e r i t y i s o p e r a a t i o t + e r i t y i s o p e t u k s e n + e r i t y i s o p e t u k s e s t a + e r i t y i s o p e t u s + e r i t y i s o p e t u s j ä r j e s t e l m ä ä m m e + e r i t y i s o p e t u s p o l i t i i k k a a + e r i t y i s o p e t u s t a + e r i t y i s o p e t u s t a r p e e s e e n + e r i t y i s o p e t u s t a r p e i d e n + e r i t y i s o p p i l a i d e n + e r i t y i s o s a + e r i t y i s o s a a m i n e n + e r i t y i s o s a a m i s e m m e + e r i t y i s o s a a m i s e n + e r i t y i s o s a a m i s t a + e r i t y i s o s a a m i s t a a n + e r i t y i s o s a k k e e t + e r i t y i s o s a k k e i s t a + e r i t y i s o s a n + e r i t y i s o s a s t o j a + e r i t y i s o s a s t o o n + e r i t y i s o s i a + e r i t y i s o s t o + e r i t y i s o s t o j ä r j e s t e l m ä + e r i t y i s o s t o j ä r j e s t e l m ä s t ä + e r i t y i s p a i k k a a + e r i t y i s p a i k k o j a + e r i t y i s p a i n e i t a + e r i t y i s p a i n o p i s t e e k s i + e r i t y i s p a i n o p i s t e e n s ä + e r i t y i s p a i n o s + e r i t y i s p a k e t t e j a + e r i t y i s p a k o t t e e t + e r i t y i s p a k o t t e i l l a + e r i t y i s p a l k i n t o + e r i t y i s p a l k k i o + e r i t y i s p a l k k i o i d e n + e r i t y i s p a l k k i o i s s a + e r i t y i s p a l k k i o i t a + e r i t y i s p a l v e l u i s t a + e r i t y i s p a l v e l u i t a + e r i t y i s p a l v e l u j a + e r i t y i s p a l v e l u j e n + e r i t y i s p a l v e l u k s i s t a + e r i t y i s p a l v e l u t + e r i t y i s p a n o k s e l l a a n + e r i t y i s p a n o k s e n s a + e r i t y i s p a n o k s e s t a a n + e r i t y i s p a n o s + e r i t y i s p e r u s t e e t + e r i t y i s p i i r r e + e r i t y i s p i i r r e t t ä + e r i t y i s p i i r t e e m m e + e r i t y i s p i i r t e e n + e r i t y i s p i i r t e e n s ä + e r i t y i s p i i r t e e n ä + e r i t y i s p i i r t e e s e e n + e r i t y i s p i i r t e e t + e r i t y i s p i i r t e i d e m m e + e r i t y i s p i i r t e i d e n + e r i t y i s p i i r t e i d e n s ä + e r i t y i s p i i r t e i n e e n + e r i t y i s p i i r t e i s i i n + e r i t y i s p i i r t e i s i n + e r i t y i s p i i r t e i s t ä + e r i t y i s p i i r t e i t ä + e r i t y i s p i i r t e i t ä ä n + e r i t y i s p i l a a n t u m i n e n + e r i t y i s p o h d i n n o i s t a + e r i t y i s p o i k k e u k s e t + e r i t y i s p o i k k e u s + e r i t y i s p o i k k e u s t a + e r i t y i s p o i k k e u s t e n + e r i t y i s p o l i t i i k k a a + e r i t y i s p o l i t i i k k o j a + e r i t y i s p o l i t i i k k o j e n + e r i t y i s p o m m i t u s r y k m e n t t i + e r i t y i s p o n n i s t e l u j a + e r i t y i s p o n n i s t u k s i i n + e r i t y i s p o n n i s t u s t a + e r i t y i s p r o j e k t i a + e r i t y i s p r o p a g a n d a a + e r i t y i s p r o s e s s i n + e r i t y i s p r o t e k t o r a a t t i n a + e r i t y i s p u i t t e e t + e r i t y i s p u u t t e e t + e r i t y i s p y y n n ö n + e r i t y i s p y y n n ö s t ä + e r i t y i s p y y n n ö t + e r i t y i s p y y n t ö + e r i t y i s p y y n t ö i h i n + e r i t y i s p y y n t ö j ä + e r i t y i s p y y n t ö ö n + e r i t y i s p ä t e v y y d e s t ä ä n + e r i t y i s p ä ä t e l m ä t + e r i t y i s p ä ä t ö k s e s t ä + e r i t y i s p ä ä t ö k s i ä + e r i t y i s p ö y t ä k i r j a + e r i t y i s p ö y t ä k i r j a a n + e r i t y i s p ö y t ä k i r j a n + e r i t y i s p ö y t ä k i r j a t + e r i t y i s r a h a s t o + e r i t y i s r a h a s t o a + e r i t y i s r a h a s t o i s s a + e r i t y i s r a h a s t o j a + e r i t y i s r a h a s t o n + e r i t y i s r a h a s t o o n + e r i t y i s r a h a s t o s t a + e r i t y i s r a h a s t o t + e r i t y i s r a h o i t u k s e k s i + e r i t y i s r a h o i t u k s e n + e r i t y i s r a h o i t u k s e s t a + e r i t y i s r a h o i t u s + e r i t y i s r a h o i t u s t a + e r i t y i s r a j o i t t e e t + e r i t y i s r a j o i t t e i s t a + e r i t y i s r a j o i t u k s e t + e r i t y i s r a j o i t u k s i a + e r i t y i s r a j o i t u k s i i n + e r i t y i s r a k e n n e + e r i t y i s r a k e n n e t u k i a + e r i t y i s r a k e n t e i t a + e r i t y i s r a p o r t i s s a + e r i t y i s r a p o r t i s s a a n + e r i t y i s r a p o r t o i j a a + e r i t y i s r a p o r t o i j a a n + e r i t y i s r a p o r t o i j a l l e + e r i t y i s r a p o r t o i j a l t a + e r i t y i s r a p o r t o i j a n + e r i t y i s r a p o r t o i j i a + e r i t y i s r a p o r t o i j i e n + e r i t y i s r a p o r t t e j a + e r i t y i s r a p o r t t i + e r i t y i s r a p o r t t i e n + e r i t y i s r a t k a i s u + e r i t y i s r a t k a i s u a + e r i t y i s r a t k a i s u i h i n + e r i t y i s r a t k a i s u i n + e r i t y i s r a t k a i s u j a + e r i t y i s r a t k a i s u n + e r i t y i s r a t k a i s u t + e r i t y i s r a t k a i s u u n + e r i t y i s r a v i n n o k s i + e r i t y i s r a v i n n o n + e r i t y i s r a v i n t o + e r i t y i s r a v i n t o a + e r i t y i s r a v i n t o o n + e r i t y i s r e s u r s s e j a + e r i t y i s r e s u r s s i t + e r i t y i s r i k o l l i s u u d e n + e r i t y i s r i s k i t + e r i t y i s r o o l i + e r i t y i s r o o l i a + e r i t y i s r o o l i i n + e r i t y i s r o o l i n + e r i t y i s r o o l i s t a + e r i t y i s r u o k a v a l i o i h i n + e r i t y i s r u o k a v a l i o i s t a + e r i t y i s r u o k a v a l i o n + e r i t y i s r y h m i e n + e r i t y i s r y h m i i n + e r i t y i s r y h m i l l e + e r i t y i s r y h m i l l ä + e r i t y i s r y h m i ä + e r i t y i s r y h m ä + e r i t y i s r y h m ä l l e + e r i t y i s r y h m ä n + e r i t y i s r y h m ä n ä + e r i t y i s r y h m ä t + e r i t y i s r y h m ä ä n + e r i t y i s s a n a s t o a + e r i t y i s s e i k a n + e r i t y i s s e i k a s t a + e r i t y i s s e i k a t + e r i t y i s s e i k k a + e r i t y i s s e i k k a a + e r i t y i s s e i k k a a n + e r i t y i s s e i k k o i h i n + e r i t y i s s e i k k o j a + e r i t y i s s e i k k o j e n + e r i t y i s s e i k o i s t a + e r i t y i s s e k t o r i l l a + e r i t y i s s e l v i t y k s e n + e r i t y i s s e l v i t y k s i i n + e r i t y i s s e u r a n n a s t a + e r i t y i s s e u r a u k s e t + e r i t y i s s i j a i n n i n + e r i t y i s s i j o i t u k s i l l e + e r i t y i s s i s ä l t ö + e r i t y i s s i s ä l t ö n s ä + e r i t y i s s i s ä l t ö ä + e r i t y i s s i t o u m u k s e n + e r i t y i s s i t o u m u k s i a + e r i t y i s s i t o u m u s + e r i t y i s s i t o u m u s t e n + e r i t y i s s o p i m u k s e n + e r i t y i s s o p i m u k s e s s a + e r i t y i s s o p i m u k s e s t a + e r i t y i s s o p i m u k s e t + e r i t y i s s o p i m u k s i a + e r i t y i s s o p i m u k s i s s a + e r i t y i s s o p i m u s + e r i t y i s s o p i m u s t a + e r i t y i s s o p i m u s t e n + e r i t y i s s o v e l l u k s i a + e r i t y i s s o v e l l u k s i s s a + e r i t y i s s t r a t e g i a a + e r i t y i s s t r a t e g i a n + e r i t y i s s t r a t e g i a s t a + e r i t y i s s t r a t e g i o i d e n + e r i t y i s s u h d e + e r i t y i s s u h d e t t a + e r i t y i s s u h t e e k s i + e r i t y i s s u h t e e l l e + e r i t y i s s u h t e e m m e + e r i t y i s s u h t e e n + e r i t y i s s u h t e e s e e n + e r i t y i s s u h t e e s t a + e r i t y i s s u h t e e t + e r i t y i s s u h t e i d e n + e r i t y i s s u h t e i s t a + e r i t y i s s u h t e i t a + e r i t y i s s u o j a + e r i t y i s s u o j a a + e r i t y i s s u o j a l a u s e k e + e r i t y i s s u o j a t t u i h i n + e r i t y i s s u o j a t u l l e j a + e r i t y i s s u o j e l u + e r i t y i s s u o j e l u a + e r i t y i s s u o j e l u a a n + e r i t y i s s u o j e l u a l u e + e r i t y i s s u o j e l u a l u e e s e e n + e r i t y i s s u o j e l u a l u e i d e n + e r i t y i s s u o j e l u a l u e i l l a + e r i t y i s s u o j e l u k s e s s a + e r i t y i s s u o j e l u n + e r i t y i s s u o j e l u s s a + e r i t y i s s u o j e l u s t a + e r i t y i s s u o j e l u u n + e r i t y i s s u o s i t u k s e n + e r i t y i s s u o s i t u k s e t + e r i t y i s s u o s i t u k s i a + e r i t y i s s u o s i t u k s i i n + e r i t y i s s u o s i t u s + e r i t y i s s u o s i t u s t a + e r i t y i s s u u n n i t e l m a + e r i t y i s s u u n n i t e l m a n + e r i t y i s s u u n n i t e l m i a + e r i t y i s s y i s t ä + e r i t y i s s y r j i n n ä n + e r i t y i s s y y s t ä + e r i t y i s s y y t t ä j ä n + e r i t y i s s ä ä d ö k s e n + e r i t y i s s ä ä d ö k s i ä + e r i t y i s s ä ä d ö s + e r i t y i s s ä ä n n ö i l l ä + e r i t y i s s ä ä n n ö i s t ä + e r i t y i s s ä ä n n ö k s e n + e r i t y i s s ä ä n n ö k s e t + e r i t y i s s ä ä n n ö k s i i n + e r i t y i s s ä ä n n ö k s i l l ä + e r i t y i s s ä ä n n ö k s i s s ä + e r i t y i s s ä ä n n ö k s i s t ä + e r i t y i s s ä ä n n ö k s i ä + e r i t y i s s ä ä n n ö n + e r i t y i s s ä ä n n ö s + e r i t y i s s ä ä n n ö s t e n + e r i t y i s s ä ä n n ö s t ä + e r i t y i s s ä ä n n ö s t ö ä + e r i t y i s s ä ä n n ö t + e r i t y i s s ä ä n t e l y + e r i t y i s s ä ä n t e l y j ä r j e s t e l m ä n + e r i t y i s s ä ä n t e l y ä + e r i t y i s s ä ä n t ö + e r i t y i s s ä ä n t ö j e n + e r i t y i s s ä ä n t ö j ä + e r i t y i s s ä ä n t ö n s ä + e r i t y i s s ä ä n t ö p e r i a a t e t t a + e r i t y i s s ä ä n t ö ä + e r i t y i s t a i t o j a + e r i t y i s t a i t o j e n + e r i t y i s t a k e e t + e r i t y i s t a k u u t + e r i t y i s t a l o u s a l u e + e r i t y i s t a l o u s a r v i o + e r i t y i s t a l o u s a v u n + e r i t y i s t a p a a m i n e n + e r i t y i s t a p a a m i s e n + e r i t y i s t a p a a m i s i a + e r i t y i s t a p a a m i s i i n + e r i t y i s t a p a h t u m a t + e r i t y i s t a p a h t u m i a + e r i t y i s t a p a h t u m i e n + e r i t y i s t a p a u k s e e n + e r i t y i s t a p a u k s e l l e + e r i t y i s t a p a u k s e n + e r i t y i s t a p a u k s e n a + e r i t y i s t a p a u k s e s s a + e r i t y i s t a p a u k s e s t a + e r i t y i s t a p a u k s e t + e r i t y i s t a p a u k s i a + e r i t y i s t a p a u k s i i n + e r i t y i s t a p a u k s i s s a + e r i t y i s t a p a u k s i s t a + e r i t y i s t a p a u s + e r i t y i s t a p a u s t a + e r i t y i s t a r i f f e j a + e r i t y i s t a r i f f i + e r i t y i s t a r i f f i n + e r i t y i s t a r i f f i t + e r i t y i s t a r j o n t a a + e r i t y i s t a r k a s t e l u u n + e r i t y i s t a r k a s t u k s e e n + e r i t y i s t a r k a s t u k s i a + e r i t y i s t a r k a s t u k s i i n + e r i t y i s t a r k a s t u s t e n + e r i t y i s t a r k i s t u s e h d o t u k s i a + e r i t y i s t a r k k a i l i j a j ä r j e s t e l m ä + e r i t y i s t a r k k a i l i j a n + e r i t y i s t a r k k a i l u s s a + e r i t y i s t a r k o i t u k s e e n + e r i t y i s t a r k o i t u k s e n a + e r i t y i s t a r k o i t u k s i i n + e r i t y i s t a r k o i t u s t a + e r i t y i s t a r p e e n s a + e r i t y i s t a r p e e s e e n + e r i t y i s t a r p e e s s a + e r i t y i s t a r p e e t + e r i t y i s t a r p e i d e n + e r i t y i s t a r p e i d e n s a + e r i t y i s t a r p e i l l e + e r i t y i s t a r p e i n e e n + e r i t y i s t a r p e i s i i n + e r i t y i s t a r p e i s s a + e r i t y i s t a r p e i s t a + e r i t y i s t a r p e i s t e n + e r i t y i s t a r p e i t a + e r i t y i s t a r p e i t a a n + e r i t y i s t a r v e r y h m i l l e + e r i t y i s t a r v i k k e i t a + e r i t y i s t a v o i t e + e r i t y i s t a v o i t e t t a + e r i t y i s t a v o i t t e e n + e r i t y i s t a v o i t t e e n a + e r i t y i s t a v o i t t e e t + e r i t y i s t a v o i t t e i d e n + e r i t y i s t a v o i t t e i s i i n + e r i t y i s t a v o i t t e i s s a + e r i t y i s t a v o i t t e i s t a + e r i t y i s t a v o i t t e i t a + e r i t y i s t e e m a n a + e r i t y i s t e h t ä v i e n s ä + e r i t y i s t e h t ä v i i n + e r i t y i s t e h t ä v i s t ä + e r i t y i s t e h t ä v i ä + e r i t y i s t e h t ä v ä + e r i t y i s t e h t ä v ä k s i + e r i t y i s t e h t ä v ä n + e r i t y i s t e h t ä v ä n ä + e r i t y i s t e h t ä v ä n ä ä n + e r i t y i s t e h t ä v ä t + e r i t y i s t e h t ä v ä ä n s ä + e r i t y i s t e k i j ä l l e + e r i t y i s t e k i j ä s t ä + e r i t y i s t e k i j ä ä + e r i t y i s t e k i j ö i t ä + e r i t y i s t e k n i i k k a a n + e r i t y i s t e k n i i k o i t a + e r i t y i s t e n + e r i t y i s t i e d o n + e r i t y i s t i e d o n a n n o n + e r i t y i s t i e d o n a n t o a + e r i t y i s t i e d o t u s + e r i t y i s t i e s t ä + e r i t y i s t i e t e e t + e r i t y i s t i e t o a + e r i t y i s t i e t o j a + e r i t y i s t i e t o l u o k i t u k s i a + e r i t y i s t i e t ä m y k s e e n + e r i t y i s t i e t ä m y k s e s t ä + e r i t y i s t i e t ä m y s + e r i t y i s t i e t ä m y s t ä + e r i t y i s t i e t ä m y s t ä ä n + e r i t y i s t i l a i s u u s + e r i t y i s t i l a n n e + e r i t y i s t i l a n n e t t a + e r i t y i s t i l a n n e t t a a n + e r i t y i s t i l a n t e e l l e + e r i t y i s t i l a n t e e m m e + e r i t y i s t i l a n t e e n + e r i t y i s t i l a n t e e n s a + e r i t y i s t i l a n t e e s e e n + e r i t y i s t i l a n t e e s e e n s a + e r i t y i s t i l a n t e e s s a + e r i t y i s t i l a n t e e s t a + e r i t y i s t i l a n t e e t + e r i t y i s t i l a n t e i d e n + e r i t y i s t i l a n t e i s i i n + e r i t y i s t i l a n t e i s s a + e r i t y i s t i l a n t e i s s a a n + e r i t y i s t i l a n t e i s t a + e r i t y i s t i l a n t e i t a + e r i t y i s t i l a u k s e t + e r i t y i s t o d i s t u k s e t + e r i t y i s t o i m e a + e r i t y i s t o i m e k s i + e r i t y i s t o i m e k s i a n t o n a + e r i t y i s t o i m e n + e r i t y i s t o i m e n p i d e + e r i t y i s t o i m e n p i d e t t ä + e r i t y i s t o i m e n p i t e e l l e + e r i t y i s t o i m e n p i t e e n + e r i t y i s t o i m e n p i t e e n ä + e r i t y i s t o i m e n p i t e e s e e n + e r i t y i s t o i m e n p i t e e s t ä + e r i t y i s t o i m e n p i t e e t + e r i t y i s t o i m e n p i t e i d e n + e r i t y i s t o i m e n p i t e i k s i + e r i t y i s t o i m e n p i t e i l l ä + e r i t y i s t o i m e n p i t e i n + e r i t y i s t o i m e n p i t e i s i i n + e r i t y i s t o i m e n p i t e i s t ä + e r i t y i s t o i m e n p i t e i t ä + e r i t y i s t o i m e s t a + e r i t y i s t o i m e t + e r i t y i s t o i m i + e r i t y i s t o i m i a + e r i t y i s t o i m i a a n + e r i t y i s t o i m i e n + e r i t y i s t o i m i i n + e r i t y i s t o i m i k s i + e r i t y i s t o i m i k u n t a + e r i t y i s t o i m i l l a + e r i t y i s t o i m i n + e r i t y i s t o i m i n t a a + e r i t y i s t o i m i n t a o h j e l m a + e r i t y i s t o i m i n t a o h j e l m a a + e r i t y i s t o i m i n t a o h j e l m a n + e r i t y i s t o i m i n t a o h j e l m i e n + e r i t y i s t o i m i n t a y k s i k ö i d e n + e r i t y i s t o i m i n t a y k s i k ö i d e n s ä + e r i t y i s t o i m i n t a y k s i k ö i h i n + e r i t y i s t o i m i n t a y k s i k ö l t ä + e r i t y i s t o i m i p i s t e i t ä + e r i t y i s t o i m i s s a + e r i t y i s t o i m i s t a + e r i t y i s t o i m i s t o j e n + e r i t y i s t o i m i v a l t a a + e r i t y i s t o i m i v a l t a a n + e r i t y i s t o i v e e n + e r i t y i s t o i v e i t a + e r i t y i s t u e n + e r i t y i s t u e s t a + e r i t y i s t u e t + e r i t y i s t u i s t a + e r i t y i s t u k e a + e r i t y i s t u k i + e r i t y i s t u k i a + e r i t y i s t u k i i n + e r i t y i s t u k i j ä r j e s t e l m ä + e r i t y i s t u k i m u o d o i s s a + e r i t y i s t u k i m u o t o j e n + e r i t y i s t u k i o h j e l m a n + e r i t y i s t u k i o i k e u k s i e n + e r i t y i s t u k i t o i m i a + e r i t y i s t u l l i e n + e r i t y i s t u l l i l a i n s ä ä d ä n n ö n + e r i t y i s t u l l i t a r i f f i n + e r i t y i s t u l o k s i a + e r i t y i s t u n n u s t u s t a + e r i t y i s t u n t e m u k s e l l a a n + e r i t y i s t u n t e m u k s e n s a + e r i t y i s t u n t o m e r k e i s t ä + e r i t y i s t u o m i o i s t u i m e l l a + e r i t y i s t u o m i o i s t u i m e l l e + e r i t y i s t u o m i o i s t u i m e n + e r i t y i s t u o m i o i s t u i m e s s a + e r i t y i s t u o m i o i s t u i m e t + e r i t y i s t u o m i o i s t u i m i a + e r i t y i s t u o m i o i s t u i m i i n + e r i t y i s t u o m i o i s t u i m i s s a + e r i t y i s t u o m i o i s t u i m i s t a + e r i t y i s t u o m i o i s t u i n + e r i t y i s t u o m i o i s t u i n j ä r j e s t e l m ä ä + e r i t y i s t u o m i o i s t u i n t a + e r i t y i s t u o m i o i s t u i n t e n + e r i t y i s t u o m i o v a l l a n + e r i t y i s t u o n t i k i i n t i ö t + e r i t y i s t u o t a n n o n + e r i t y i s t u o t e + e r i t y i s t u o t t e e t + e r i t y i s t u o t t e i d e n + e r i t y i s t u o t t e i t a + e r i t y i s t u r v a j o u k k o j a + e r i t y i s t u r v a n + e r i t y i s t u r v a v y ö t + e r i t y i s t u t k i m u k s e e n + e r i t y i s t u t k i m u k s e n + e r i t y i s t u t k i m u k s i a + e r i t y i s t u t k i m u k s i i n + e r i t y i s t u t k i m u k s i l l a + e r i t y i s t u t k i m u k s i n e e n + e r i t y i s t u t k i m u s + e r i t y i s t u t k i m u s t a + e r i t y i s t u t k i n t o + e r i t y i s t y ö n t e k i j ö i d e n + e r i t y i s t y ö r y h m i e n + e r i t y i s t y ö r y h m i s s ä + e r i t y i s t y ö r y h m ä + e r i t y i s t y ö r y h m ä n + e r i t y i s t y ö r y h m ä ä + e r i t y i s t ä + e r i t y i s u p s e e r e j a + e r i t y i s u u d i s t u k s e t + e r i t y i s v a a r o j a + e r i t y i s v a a t i m u k s e n + e r i t y i s v a a t i m u k s e n s a + e r i t y i s v a a t i m u k s e t + e r i t y i s v a a t i m u k s i a + e r i t y i s v a a t i m u k s i e n + e r i t y i s v a a t i m u k s i i n + e r i t y i s v a a t i m u k s i s t a + e r i t y i s v a a t i m u s t e n + e r i t y i s v a h v u u d e t + e r i t y i s v a i h t o e h t o j e n + e r i t y i s v a i k e u d e t + e r i t y i s v a i k e u k s i a + e r i t y i s v a i k e u k s i s t a + e r i t y i s v a i k u t u k s e t + e r i t y i s v a i k u t u k s i a + e r i t y i s v a i k u t u k s i s t a + e r i t y i s v a l i o k u n n a l l e + e r i t y i s v a l i o k u n n a n + e r i t y i s v a l i o k u n n a s s a + e r i t y i s v a l i o k u n n a t + e r i t y i s v a l i o k u n n i l t a + e r i t y i s v a l i o k u n n i s s a + e r i t y i s v a l i o k u n n i s t a + e r i t y i s v a l i o k u n t a + e r i t y i s v a l i o k u n t a a + e r i t y i s v a l i o k u n t a a n + e r i t y i s v a l i o k u n t a m m e + e r i t y i s v a l i o k u n t a n s a + e r i t y i s v a l i o k u n t i a + e r i t y i s v a l i o k u n t i e n + e r i t y i s v a l i o k u n t i i n + e r i t y i s v a l i t u k s e n + e r i t y i s v a l m i u k s i e n + e r i t y i s v a l t e i s t a + e r i t y i s v a l t u u d e t + e r i t y i s v a l t u u k s i a + e r i t y i s v a l t u u s k u n n a n + e r i t y i s v a l t u u s k u n t a + e r i t y i s v a l t u u s k u n t a a + e r i t y i s v a l t u u t e t t u + e r i t y i s v a l t u u t e t t u n s a + e r i t y i s v a l t u u t e t u n + e r i t y i s v a l t u u t u s + e r i t y i s v a l v o n t a + e r i t y i s v a l v o n t a a + e r i t y i s v a l v o n t a a n + e r i t y i s v a m m a + e r i t y i s v a p a i s i i n + e r i t y i s v a r a n t o + e r i t y i s v a r a n t o o n + e r i t y i s v a r a t + e r i t y i s v a r a u k s e e n + e r i t y i s v a r a u k s e n + e r i t y i s v a r a u k s i a + e r i t y i s v a r a u m a l l a + e r i t y i s v a r a u s + e r i t y i s v a r a u s s t r a t e g i a n + e r i t y i s v a r o j a + e r i t y i s v a r u s t e i t a + e r i t y i s v a s t u i t a + e r i t y i s v a s t u i t t e n s a + e r i t y i s v a s t u u + e r i t y i s v a s t u u l l a n n e + e r i t y i s v a s t u u n + e r i t y i s v a s t u u n n e + e r i t y i s v a s t u u s e e n + e r i t y i s v a s t u u s s a + e r i t y i s v a s t u u t a + e r i t y i s v e l v o i t t e e t + e r i t y i s v e l v o i t t e i s t a + e r i t y i s v e l v o i t t e i t a + e r i t y i s v e l v o l l i s u u d e s t a + e r i t y i s v e l v o l l i s u u k s i a + e r i t y i s v e l v o l l i s u u k s i i n + e r i t y i s v e l v o l l i s u u s + e r i t y i s v e l v o l l i s u u t e m m e + e r i t y i s v e l v o l l i s u u t e n a + e r i t y i s v e r k o n + e r i t y i s v e r o + e r i t y i s v e r o i h i n + e r i t y i s v e r o i n + e r i t y i s v e r o i s t a + e r i t y i s v e r o j a + e r i t y i s v e r o j e n + e r i t y i s v e r o j ä r j e s t e l m ä + e r i t y i s v e r o l u o k a s s a + e r i t y i s v e r o n + e r i t y i s v e r o t + e r i t y i s v e r o t u k s e e n + e r i t y i s v e r o t u k s e n + e r i t y i s v e r o t u s t a + e r i t y i s v e t o o m u k s e e n + e r i t y i s v e t o o m u k s e n + e r i t y i s v i e n t i t u e n + e r i t y i s v i i t t a u k s e s t a + e r i t y i s v i i t t a u k s i a + e r i t y i s v i r a n o m a i s e n + e r i t y i s v i r a s t o i l l e + e r i t y i s v i r a s t o j a + e r i t y i s v i r a s t o j e n + e r i t y i s v i r k a i l i j o i d e n + e r i t y i s v i r k a m i e h i l l ä + e r i t y i s v u o s i k e r t o m u k s i i n + e r i t y i s v y ö h y k k e e n + e r i t y i s v y ö h y k k e i d e n + e r i t y i s v ä h e n n y s + e r i t y i s v ä l i n e + e r i t y i s v ä l i n e e k s i + e r i t y i s v ä l i n e e s t ä + e r i t y i s v ä l i n e e t + e r i t y i s v ä l i n e i d e n + e r i t y i s v ä l i n e i s t ä + e r i t y i s v ä l i n e i s t ö ä + e r i t y i s v ä l i n e i t ä + e r i t y i s v ä l i n e t t ä + e r i t y i s y k s i k k ö + e r i t y i s y k s i k k ö j e n + e r i t y i s y k s i k k ö n s ä + e r i t y i s y k s i k ö i d e n + e r i t y i s y k s i k ö i s t ä + e r i t y i s y k s i k ö i t ä + e r i t y i s y k s i k ö n + e r i t y i s y k s i k ö t + e r i t y i s y k s i t y i s k o h d a t + e r i t y i s y l e i s i s t u n n o s s a + e r i t y i s y m p ä r i s t ö l l e + e r i t y i s y m p ä r i s t ö n + e r i t y i s y r i t y s t e n + e r i t y i s y y t e n s ä + e r i t y i s y y t t ä + e r i t y i s ä ä n e s t y s + e r i t y s a l u e i l l a + e r i t y s e d u s t a j a + e r i t y s e h t o j e n + e r i t y s h u i p p u k o k o u k s e n + e r i t y s j ä r j e s t e l m ä + e r i t y s j ä r j e s t e l m ä n + e r i t y s k e r t o m u s + e r i t y s l a a t u + e r i t y s l u o n n e + e r i t y s l u o n n e t t a + e r i t y s l ä h e t t i l ä s + e r i t y s p i i r t e e t + e r i t y s r a h o i t u s t a + e r i t y s s e l l e i s s ä + e r i t y s s e l l i i n + e r i t y s s u o j e l u a l u e e l l e + e r i t y s s ä ä n n ö n + e r i t y s t a r p e i d e n + e r i t y s t a r p e i t a + e r i t y s t o i m e t + e r i t y s v a a t i m u k s e t + e r i t y s v a l t u u k s i e n + e r i t y y p p i s e n + e r i t y y p p i s e s t ä + e r i t y y p p i s e t + e r i t y y p p i s i i n + e r i t y y p p i s i l l e + e r i t y y p p i s i l l ä + e r i t y y p p i s i s t ä + e r i t y y p p i s i ä + e r i t y y p p i s t e n + e r i t y y p p i s t ä + e r i u s k o i s i a + e r i v a i h e i n e n + e r i v a p a u k s i a + e r i v a p a u k s i s t a + e r i v a p a u s l a u s e k e t t a + e r i v a p a u s l i s t a t + e r i v a p a u s m a h d o l l i s u u d e k s i + e r i v a p a u s m a h d o l l i s u u s + e r i v a p a u s p o l i t i i k k a a + e r i v a p a u s t o i v e l i s t a t + e r i v a p a u t t a + e r i v ä r i s i ä + e r i y t e t t y i h i n + e r i y t e t t y y n + e r i y t e t t y ä + e r i y t e t y l l ä + e r i y t e t y m m i n + e r i y t e t y m p ä ä + e r i y t e t y n + e r i y t t ä m i n e n + e r i y t t ä m i s e e n + e r i y t t ä m i s e l l e + e r i y t t ä m i s e n + e r i y t t ä m i s e s s ä + e r i y t t ä m i s e s t ä + e r i y t t ä m i s k y k y ä + e r i y t t ä m i s k y s y m y s t ä + e r i y t t ä m i s m e k a n i s m i n + e r i y t t ä m i s m e n e t e l m i s t ä + e r i y t t ä m i s n ä k ö k o h d a t + e r i y t t ä m i s p e r i a a t e + e r i y t t ä m i s p e r i a a t e t t a + e r i y t t ä m i s p e r i a a t t e e l l e + e r i y t t ä m i s p e r i a a t t e e n + e r i y t t ä m i s p e r i a a t t e e s e e n + e r i y t t ä m i s p e r u s t e e t + e r i y t t ä m i s p o l i t i i k a t + e r i y t t ä m i s p o l i t i i k k a a n + e r i y t t ä m i s p r o s e s s i n + e r i y t t ä m i s s t r a t e g i a a + e r i y t t ä m i s s u u n n i t e l m i e n + e r i y t t ä m i s s ä ä n n ö k s i l l ä + e r i y t t ä m i s t a p a a + e r i y t t ä m i s t ä + e r i y t y m i s a s t e + e r i y t y m i s r i s k i e n + e r i y t y m i s v a a t i m u k s i i n + e r i y t y n e i t t e n + e r i ä v i s t ä + e r i ä v i ä + e r i ä v ä l l ä + e r i ä v ä n + e r i ä v ä t + e r i ä v ä ä + e r k a n e m i s e l l e + e r o a a + e r o a m a a n + e r o a m i s e l l e + e r o a m i s l a u s e k e + e r o a m i s p y k ä l ä + e r o a m i s p y r k i m y k s i i n + e r o a m i s p ä i v ä + e r o a v a i s u u k s i a + e r o a v a i s u u k s i e n + e r o a v a n s a + e r o a v a t + e r o a v a t k i n + e r o a v i a + e r o a v u u d e t + e r o a v u u k s i a + e r o a v u u k s i e n + e r o a v u u s p e r u s t e e t + e r o a v u u s v a a t i m u s t a + e r o i h i n + e r o i l l a + e r o i l m o i t u s + e r o i s t a + e r o j a + e r o j e m m e + e r o j e n + e r o k o r v a u k s i a + e r o k o r v a u s t e n + e r o m e n e t t e l y i h i n + e r o m e n e t t e l y n s ä + e r o n a + e r o n p y y n t ö n s ä + e r o o s i o l t a + e r o o s i o n + e r o o s i o n a + e r o o s i o n t o r j u n t a t ö i d e n + e r o o s i o o n + e r o o s i o p r o s e s s i a + e r o o s i o s t a + e r o o s i o t a + e r o p a k e t i t + e r o r a h a a + e r o r a h a j ä r j e s t e l m ä + e r o r a h a n + e r o r a h a s o p i m u k s i i n + e r o r a h a t + e r o r a h o i s t a + e r o s i + e r o s t a + e r o s t a a n + e r o t e l t a v a + e r o t e l t u + e r o t i i k k a a + e r o t t a a + e r o t t a a k s e e n + e r o t t a m a a n + e r o t t a m a t t a + e r o t t a m a t t o m a n a + e r o t t a m a t t o m a s s a + e r o t t a m a t t o m a t + e r o t t a m a t t o m i a + e r o t t a m a t t o m i n a + e r o t t a m i s e k s i + e r o t t a m i s e n + e r o t t a m i s e s t a + e r o t t a m i s j ä r j e s t e l m ä + e r o t t a m i s m a h d o l l i s u u s + e r o t t a m i s m a l l i a + e r o t t a m i s t a + e r o t t a v a n + e r o t t a v a t + e r o t t a v i e n + e r o t t a v i s t a + e r o t t e l e m a l l a + e r o t t e l e v a n + e r o t t e l u j a + e r o t t e l u k r i t e e r e i d e n + e r o t t e l u k r i t e e r i k s i + e r o t t e l u l a i t o s t e n + e r o t t e l u m a l l i t + e r o t t e l u m e n e t e l m ä ä + e r o t t e l u p e r i a a t e t t a + e r o t t e l u p o l i t i i k a s t a + e r o t t e l u t a k t i i k a n + e r o t t e l u t e s t e j ä + e r o t t u u + e r o t t u v a t + e r o t u k s e n + e r o t u k s e t t a + e r o t u o m a r e i k s i + e r o t u s k y k y + e r o t u s m e n e t e l m ä + e r o t u s o s a m ä ä r ä + e r o t u s s u p p i l o + e r o t u s s ä ä n n ö s t ä + e r o u h k a u k s i l l a + e r o v o i m a + e r ä i d e n + e r ä i l l e + e r ä i l l ä + e r ä i s i i n + e r ä i s s ä + e r ä i s t ä + e r ä i t ä + e r ä k o k o + e r ä m a a t + e r ä m a i d e n + e r ä n k ä v i j ä i n + e r ä n u m e r o s t a + e r ä p ä i v ä + e r ä p ä i v ä t + e r ä p ä i v ä ä + e r ä s t ä + e r ä t o v e r i + e r ä ä + e r ä ä l l e + e r ä ä n + e r ä ä n l a i s e e n + e r ä ä n l a i s e k s i + e r ä ä n l a i s e l t a + e r ä ä n l a i s e n + e r ä ä n l a i s e n a + e r ä ä n l a i s e s t a + e r ä ä n l a i s e t + e r ä ä n l a i s i a + e r ä ä n l a i s i l l a + e r ä ä n l a i s t a + e r ä ä n ä + e r ä ä s e e n + e r ä ä s s ä + e r ä ä s t ä + e r ä ä t + e s i a s e n n e t t u + e s i a s t e + e s i a s t e e l l a + e s i a s t e e n + e s i a s t e e t + e s i a s t e i d e n + e s i a s t e k e m i k a a l i e n + e s i d e m o k r a a t t i s e e n + e s i d e m o k r a a t t i s e n + e s i d i a g n o o s i a + e s i e u r o o p p a l a i s t e n + e s i h i s t o r i a a n + e s i h i s t o r i a l l i n e n + e s i i n m a r s s i a + e s i i n n y i m m e + e s i i n t y e s s ä + e s i i n t y e s s ä ä n + e s i i n t y i + e s i i n t y m i s e l l e + e s i i n t y m i s e s t ä + e s i i n t y m i s e s t ä ä n + e s i i n t y m i s j ä n n i t y s + e s i i n t y m i s p a l k k i o i h i n s a + e s i i n t y m i s t y y l i s t ä n i + e s i i n t y m ä ä n + e s i i n t y n e e n + e s i i n t y n e e t + e s i i n t y n y t + e s i i n t y v i e n + e s i i n t y v ä s t ä + e s i i n t y v ä t + e s i i n t y y + e s i i n t y y h ä n + e s i i n t y y k i n + e s i i n t y y k ö + e s i i n t y ä + e s i j ä s e n y y d e n + e s i k a r s i n t a + e s i k a u p a l l i n e n + e s i k a u p a l l i s e n + e s i k a u p a l l i s e t + e s i k a u p a l l i s i a + e s i k a u p a l l i s i i n + e s i k a u p a l l i s i l l a + e s i k a u p a l l i s i s t a + e s i k a u p a l l i s t a + e s i k a u p a l l i s t e n + e s i k a u p u n g e i s t a + e s i k a u p u n k e i h i n + e s i k a u p u n k i a l u e e l l a + e s i k a u p u n k i a l u e e t + e s i k a u p u n k i a l u e i l l a + e s i k a u p u n k i a l u e i l l e + e s i k a u p u n k i a l u e i t a + e s i k a u p u n k i e n + e s i k a u p u n k i l i i k e n n e + e s i k a u p u n k i l i i k e n t e e s s ä + e s i k a u p u n k i t a s o l l a + e s i k i l p a i l u l l i n e n + e s i k i l p a i l u l l i s i i n + e s i k i r i s t i m i ä + e s i k l i i n i s e s s ä + e s i k o i s l e s t a d i o l a i s u u s + e s i k o i s t e n + e s i k o n f e r e n s s i n + e s i k o t e l o m ä t ä + e s i k o u l u a + e s i k o u l u a i k a + e s i k o u l u h a n k k e i t a + e s i k o u l u i k ä i s e t + e s i k o u l u i k ä i s i i n + e s i k o u l u i k ä i s i s t ä + e s i k o u l u i s t a + e s i k o u l u i ä s s ä + e s i k o u l u j a + e s i k o u l u j e n + e s i k o u l u k a s v a t u s + e s i k o u l u l u o k k a + e s i k o u l u n + e s i k o u l u n o p e t t a j i a + e s i k o u l u o p e t u k s e e n + e s i k o u l u o p e t u k s e n + e s i k o u l u o p e t u s t a + e s i k o u l u o p p i l a a t + e s i k o u l u p a i k k o j a + e s i k o u l u p a l v e l u j a + e s i k o u l u s s a + e s i k o u l u s t a + e s i k o u l u t u k s e n + e s i k o u l u u n + e s i k o u l u v e r k o s t o n + e s i k u n n a n + e s i k u n t a + e s i k u n t a a + e s i k u n t a p a n e e l i i n + e s i k u n t a p ä ä l l i k k ö + e s i k u n t a p ä ä l l i k ö k s i + e s i k u n t a p ä ä l l i k ö l l e + e s i k u v a + e s i k u v a l l i s e s t a + e s i k u v a l l i s e s t i + e s i k u v a l l i s t a + e s i k u v a n a + e s i k u v a n a a n + e s i k u v a n s a + e s i k u v a v e r t a i l u a + e s i k u v i a n i + e s i k u v i n a + e s i k u v i s t a n n e + e s i k y p s e n n e t t y n ä + e s i k y s y m y k s e n ä + e s i k ä s i t e l l ä ä n + e s i k ä s i t t e l y + e s i k ä s i t t e l y t t ä + e s i k ä s i t t e l y ä + e s i l a j i t t e l u a + e s i l i i t t y m i s e n + e s i l i i t t y m i s m e n e t t e l y + e s i l i i t t y m i s t ä + e s i l u o n n o k s e s s a + e s i m a k u a + e s i m e r k e i k s i + e s i m e r k e i l l ä + e s i m e r k e i s t ä + e s i m e r k i l l i n e n + e s i m e r k i l l i s e k s i + e s i m e r k i l l i s e l l ä + e s i m e r k i l l i s e n + e s i m e r k i l l i s e n ä + e s i m e r k i l l i s e s t i + e s i m e r k i l l i s e t + e s i m e r k i l l i s i l l ä + e s i m e r k i l l i s i m m i s t ä + e s i m e r k i l l i s i n + e s i m e r k i l l i s i ä + e s i m e r k i l l i s t ä + e s i m e r k i l l i s y y t t ä + e s i m e r k i l l ä + e s i m e r k i l l ä m m e + e s i m e r k i l l ä ä n + e s i m e r k i n + e s i m e r k i n o m a i s e s t i + e s i m e r k i s t ä + e s i m e r k i t + e s i m e r k k e i n ä + e s i m e r k k e j ä + e s i m e r k k e j ä m m e + e s i m e r k k i h a n k e + e s i m e r k k i i n + e s i m e r k k i l a i n s ä ä d ä n t ö + e s i m e r k k i l a s k e l m i s s a + e s i m e r k k i l u e t t e l o + e s i m e r k k i l u e t t e l o i s s a + e s i m e r k k i l u e t t e l o n i + e s i m e r k k i n i + e s i m e r k k i n n e + e s i m e r k k i n ä + e s i m e r k k i r a n g a i s t u k s i a + e s i m e r k k i t a p a u k s e s t a + e s i m e r k k i t a p a u k s i a + e s i m e r k k i t a p a u s + e s i m e r k k i t a p a u s t a + e s i m e r k k i t u o t t e i d e n + e s i m e r k k i v a i k u t u s t a + e s i m e r k k i ä + e s i m e r k k i ä m m e + e s i m e r k k i ä n n e + e s i m o d e r n i a + e s i m o d e r n i i n + e s i n e e s t ä + e s i n e i d e n + e s i n e o i k e u d e n + e s i n e o i k e u s + e s i n e v a h i n k o i h i n + e s i n e v a r k a u k s i e n + e s i o p e t u k s e s s a + e s i o p e t u s + e s i p a k a t t u n a + e s i p a k a t u i s s a + e s i p a k k a u s t a + e s i p a r l a m e n t a a r i s e e n + e s i p o l i i s i t + e s i p u h d i s t u k s e s t a + e s i p u h d i s t u s m e n e t e l m i e n + e s i p u h d i s t u s t a + e s i r a h o i t u s v a i h e t t a + e s i r e k i s t e r ö i n n i n + e s i r e k i s t e r ö i n n i s s ä + e s i r e k i s t e r ö i n t i + e s i r e k i s t e r ö i n t i e n + e s i r e k i s t e r ö i n t i h a k e m u k s i s t a + e s i r e k i s t e r ö i n t i m a l l i + e s i r e k i s t e r ö i n t i m e n e t t e l y n + e s i r i k o k s e t + e s i r i k o k s i a + e s i r i k o s j ä r j e s t e l m ä ä + e s i r i p p u j a + e s i r o o m a l a i n e n + e s i s o k r a a t i k o t + e s i s o v i t t e l u h a r j o i t u k s e n + e s i t a r k a s t e l u s t a + e s i t e d i r e k t i i v i + e s i t e d i r e k t i i v i i n + e s i t e d i r e k t i i v i n + e s i t e d i r e k t i i v i ä + e s i t e l l e e t + e s i t e l l e s s ä m m e + e s i t e l l e s s ä n i + e s i t e l l e s s ä n n e + e s i t e l l e s s ä ä n + e s i t e l l y i s s ä + e s i t e l l y n + e s i t e l l y s s ä + e s i t e l l y t + e s i t e l l ä + e s i t e l l ä k s e e n + e s i t e l l ä k s e m m e + e s i t e l l ä k s e n i + e s i t e l l ä ä n + e s i t e l m ä s s ä ä n + e s i t e l t i i n + e s i t e l t y + e s i t e l t y ä + e s i t e l t y ä n i + e s i t e l t ä v ä ä n + e s i t e o l l i s e e n + e s i t e o l l i s e l l a + e s i t e o l l i s e n + e s i t e o l l i s e t + e s i t e t i i v i s t e l m ä + e s i t e t i i v i s t e l m ä n + e s i t e t i i v i s t e l m ä ä + e s i t e t t i i n + e s i t e t t y i h i n + e s i t e t t y j e n + e s i t e t t y j ä + e s i t e t t y y n + e s i t e t t y ä + e s i t e t t y ä n i + e s i t e t t ä e s s ä + e s i t e t t ä i s i + e s i t e t t ä i s i i n + e s i t e t t ä v i e n + e s i t e t t ä v i i n + e s i t e t t ä v i s s ä + e s i t e t t ä v ä k s i + e s i t e t t ä v ä s t ä + e s i t e t t ä v ä t + e s i t e t t ä v ä ä + e s i t e t y i l l ä + e s i t e t y i l t ä + e s i t e t y i s s ä + e s i t e t y i s t ä + e s i t e t y l l ä + e s i t e t y n + e s i t e t y s s ä + e s i t e t y s t ä + e s i t e t y t + e s i t e t ä + e s i t e t ä ä n + e s i t e t ä ä n k i n + e s i t e t ä ä n k ö + e s i t e v a a t i m u k s e n + e s i t e v a a t i m u k s e s t a + e s i t e v a a t i m u s + e s i t i m m e + e s i t i n + e s i t i s l a u s + e s i t i s l a u s t a + e s i t i t t e + e s i t i t t e k ö + e s i t t e e l l e + e s i t t e e s s ä + e s i t t e i d e n + e s i t t e i t ä + e s i t t e l e e + e s i t t e l e m i e n + e s i t t e l e m i s e s s ä + e s i t t e l e m i s t ä n n e + e s i t t e l e m m e + e s i t t e l e m ä + e s i t t e l e m ä l l ä + e s i t t e l e m ä m m e + e s i t t e l e m ä n + e s i t t e l e m ä n i + e s i t t e l e m ä n n e + e s i t t e l e m ä s s ä + e s i t t e l e m ä s s ä n i + e s i t t e l e m ä ä + e s i t t e l e m ä ä n + e s i t t e l e m ä ä n i + e s i t t e l e n + e s i t t e l e t t e + e s i t t e l i + e s i t t e l i j ä k i n + e s i t t e l i j ä k o l l e g a a n i + e s i t t e l i j ä k o l l e g a l l a n i + e s i t t e l i j ä k o l l e g a m m e + e s i t t e l i j ä k o l l e g a n i + e s i t t e l i j ä k o l l e g o i d e n i + e s i t t e l i j ä k o l l e g o i l l e m m e + e s i t t e l i j ä k o l l e g o i t a n i + e s i t t e l i j ä k o l l e g o j a n i + e s i t t e l i j ä k u m p p a n i a n i + e s i t t e l i j ä l l e + e s i t t e l i j ä l l e m m e + e s i t t e l i j ä l l e n n e + e s i t t e l i j ä l l ä + e s i t t e l i j ä l t ä + e s i t t e l i j ä m m e + e s i t t e l i j ä n + e s i t t e l i j ä n k i n + e s i t t e l i j ä n n e + e s i t t e l i j ä n ä + e s i t t e l i j ä r y h m ä l l e + e s i t t e l i j ä s t ä m m e + e s i t t e l i j ä t + e s i t t e l i j ä t k i n + e s i t t e l i j ä ä + e s i t t e l i j ä ä m m e + e s i t t e l i j ä ä n s ä + e s i t t e l i j ö i d e m m e + e s i t t e l i j ö i d e n + e s i t t e l i j ö i k s i + e s i t t e l i j ö i l l e + e s i t t e l i j ö i l l e m m e + e s i t t e l i j ö i s t ä + e s i t t e l i j ö i t ä + e s i t t e l i j ö i t ä m m e + e s i t t e l i n + e s i t t e l i v ä t + e s i t t e l y a i k a t a u l u t + e s i t t e l y h a n k e + e s i t t e l y h a n k k e e t + e s i t t e l y h a n k k e i d e n + e s i t t e l y h a n k k e i l l e + e s i t t e l y h a n k k e i s t a + e s i t t e l y h a n k k e i t a + e s i t t e l y l a i t o k s i a + e s i t t e l y o h j e l m a s s a + e s i t t e l y p u h e e n v u o r o + e s i t t e l y p u h e e n v u o r o s s a + e s i t t e l y p u h e e n v u o r o s s a a n + e s i t t e l y p ä i v ä m ä ä r ä t + e s i t t e l y s s ä n i + e s i t t e l y t a v o i s t a + e s i t t e l y t i l a i s u u d e n + e s i t t e l y t i l a i s u u d e s s a + e s i t t i + e s i t t i k i n + e s i t t i v ä t + e s i t t i v ä t p ä + e s i t t ä e s s ä + e s i t t ä e s s ä m m e + e s i t t ä e s s ä n i + e s i t t ä e s s ä ä n + e s i t t ä i s i + e s i t t ä i s i k i n + e s i t t ä i s i m m e + e s i t t ä i s i n + e s i t t ä i s i n k i n + e s i t t ä i s i t t e + e s i t t ä i s i v ä t + e s i t t ä j i e n + e s i t t ä j i l l e + e s i t t ä j ä t + e s i t t ä j ä ä + e s i t t ä j ä ä n + e s i t t ä k ä ä + e s i t t ä k ä ä m m e + e s i t t ä k ö ö n + e s i t t ä m i e m m e + e s i t t ä m i e n + e s i t t ä m i e n n e + e s i t t ä m i e n s ä + e s i t t ä m i i m m e + e s i t t ä m i i n + e s i t t ä m i i n i + e s i t t ä m i i n n e + e s i t t ä m i i n s ä + e s i t t ä m i s e e n + e s i t t ä m i s e k s i + e s i t t ä m i s e l l e + e s i t t ä m i s e n + e s i t t ä m i s e s s ä + e s i t t ä m i s e s t ä + e s i t t ä m i s j ä r j e s t y s t ä + e s i t t ä m i s s ä n i + e s i t t ä m i s t ä + e s i t t ä m i s t ä m m e + e s i t t ä m i s t ä n i + e s i t t ä m i s t ä n n e + e s i t t ä m i s t ä ä n + e s i t t ä m i ä + e s i t t ä m i ä n i + e s i t t ä m ä + e s i t t ä m ä l l ä + e s i t t ä m ä m m e + e s i t t ä m ä n + e s i t t ä m ä n i + e s i t t ä m ä n n e + e s i t t ä m ä n s ä + e s i t t ä m ä n ä + e s i t t ä m ä s s ä + e s i t t ä m ä s s ä m m e + e s i t t ä m ä s s ä n n e + e s i t t ä m ä s s ä ä n + e s i t t ä m ä s t ä + e s i t t ä m ä s t ä n n e + e s i t t ä m ä s t ä ä n + e s i t t ä m ä t + e s i t t ä m ä t t ä + e s i t t ä m ä ä + e s i t t ä m ä ä m m e + e s i t t ä m ä ä n + e s i t t ä m ä ä n i + e s i t t ä m ä ä n s ä + e s i t t ä n e e l l e + e s i t t ä n e e t + e s i t t ä n e i t ä + e s i t t ä n e m m e + e s i t t ä n y t + e s i t t ä n y t t ä + e s i t t ä v i n ä n n e + e s i t t ä v i n ä ä n + e s i t t ä v ä m m e + e s i t t ä v ä n + e s i t t ä v ä n s ä + e s i t t ä v ä t + e s i t t ä y t y i v ä t + e s i t t ä y t y m i s e n + e s i t t ä y t y m i s p u h e e n v u o r o a n n e + e s i t t ä ä + e s i t t ä ä k i n + e s i t t ä ä k s e e n + e s i t t ä ä k s e m m e + e s i t t ä ä k s e n i + e s i t t ä ä k s e n n e + e s i t t ä ä k ö + e s i t u t k i m u s a s i a k i r j a t + e s i t u t k i n n a n + e s i t u t k i n t a + e s i t u t k i n t a a + e s i t u t k i n t a m e n e t t e l y i s s ä + e s i t y k s e e m m e + e s i t y k s e l l ä + e s i t y k s e m m e + e s i t y k s e n + e s i t y k s e n i + e s i t y k s e n n e + e s i t y k s e n s ä + e s i t y k s e s s ä + e s i t y k s e s s ä n i + e s i t y k s e s s ä ä n + e s i t y k s e s t ä + e s i t y k s e s t ä ä n + e s i t y k s e t + e s i t y k s i i n + e s i t y k s i l l e + e s i t y k s i s s ä + e s i t y k s i s t ä + e s i t y k s i ä + e s i t y s e h d o t u k s e n + e s i t y s g r a f i i k k a + e s i t y s l i s t a + e s i t y s l i s t a a + e s i t y s l i s t a a n + e s i t y s l i s t a a n s a + e s i t y s l i s t a k o h d a n + e s i t y s l i s t a k o h t a a + e s i t y s l i s t a l l a + e s i t y s l i s t a l l a h a n + e s i t y s l i s t a l l a m m e + e s i t y s l i s t a l l e + e s i t y s l i s t a l l e e n + e s i t y s l i s t a l l e m m e + e s i t y s l i s t a l t a + e s i t y s l i s t a l u o n n o k s e e n + e s i t y s l i s t a l u o n n o k s e n + e s i t y s l i s t a l u o n n o k s e s s a + e s i t y s l i s t a l u o n n o k s e s t a + e s i t y s l i s t a l u o n n o s + e s i t y s l i s t a l u o n n o s t a + e s i t y s l i s t a n + e s i t y s l i s t a n s a + e s i t y s l i s t a s s a + e s i t y s l i s t a s t a + e s i t y s l u o n n o k s e e n + e s i t y s l u o n n o k s e s s a + e s i t y s l u o n n o k s e s t a + e s i t y s l u o n n o s + e s i t y s m e n e t e l m ä t + e s i t y s p a k e t t i + e s i t y s r y h m ä n + e s i t y s t a p a + e s i t y s t e n s ä + e s i t y s t e o r i a + e s i t y s t ä + e s i t y s t ä m m e + e s i t y ö + e s i t y ö n + e s i t y ö s t ä + e s i t y ö t + e s i t ä m m e + e s i t ä m m e k i n + e s i t ä m m e k ö + e s i t ä n + e s i t ä n k i n + e s i t ä t t e + e s i v a a l i + e s i v a a l i e n + e s i v a a l i k a m p a n j a n + e s i v a a l i m e n e t t e l y n + e s i v a a l i t + e s i v a i h e + e s i v a i h e e n a + e s i v a i h e e s s a + e s i v a l i n n a s t a + e s i v a l i n t a + e s i v a l i n t a k r i t e e r i t + e s i v a l i n t a m e n e t t e l y s s ä + e s i v a l i n t a p r o s e s s i a + e s i v a l i n t a v a i h e e n + e s i v a l i t u t + e s i v a l m i s t e l u j a + e s i v a l m i s t e l u j e n + e s i v a l m i s t e l u t + e s i v a l m i s t e l u t y ö t + e s i v a l m i s t e l u t ö i d e n + e s i v a l m i s t e l u v a i h e e s s a + e s i v a n h e m p i e n s a k i n + e s k a l o i t u e s s a + e s k i m o h a n h i + e s k i m o k u i r i + e s k i m o k u o v i + e s k i m o l o k k i + e s k i m o s i r r i + e s p a n j a a + e s p a n j a a n + e s p a n j a h a n + e s p a n j a k s i + e s p a n j a l a i s a l u k s e t + e s p a n j a l a i s e e n + e s p a n j a l a i s e n + e s p a n j a l a i s e n a + e s p a n j a l a i s e s t a + e s p a n j a l a i s e t + e s p a n j a l a i s i a + e s p a n j a l a i s i l l a + e s p a n j a l a i s i l l e + e s p a n j a l a i s i s t a + e s p a n j a l a i s j ä s e n e t + e s p a n j a l a i s j ä s e n i l t ä + e s p a n j a l a i s j ä s e n i ä + e s p a n j a l a i s j ä s e n t e n + e s p a n j a l a i s k o l l e g a m m e + e s p a n j a l a i s k o l l e g a n i + e s p a n j a l a i s k o l l e g o i d e n + e s p a n j a l a i s p e r h e e s e e n + e s p a n j a l a i s p e r h e e t + e s p a n j a l a i s p e r h e i d e n + e s p a n j a l a i s p e r ä i n e n + e s p a n j a l a i s p o l i i s i n + e s p a n j a l a i s p o r t u g a l i l a i s t a + e s p a n j a l a i s s u k u p o l v e n + e s p a n j a l a i s t a + e s p a n j a l a i s t e n + e s p a n j a l a i s t e n k i n + e s p a n j a l a i s t u o m a r i + e s p a n j a l a i s v i r a n o m a i s e t + e s p a n j a l a i s y h t i ö + e s p a n j a l l a + e s p a n j a l l e + e s p a n j a n + e s p a n j a n i l v e k s e t + e s p a n j a n k i e l i n e n + e s p a n j a n k i e l i s e e n + e s p a n j a n k i e l i s e s s ä + e s p a n j a n k i e l i s i ä + e s p a n j a n k i l p i k o n n a + e s p a n j a n k u u k e h r ä ä j ä + e s p a n j a n k ä r p ä n e n + e s p a n j a n m a s t i f f i + e s p a n j a n p i h t a + e s p a n j a n s i n i l i l j a + e s p a n j a n s i r u e t a n a + e s p a n j a n t a u t i + e s p a n j a n t a u t i p a n d e m i a + e s p a n j a n v e s i k o i r a + e s p a n j a s s a + e s p a n j a s t a + e s p a n j o i s t a + e s p e r a n t o a k a t e m i a + e s p e r a n t o k u l t t u u r i + e s p r e s s o k e i t i n + e s t e e k s i + e s t e e n + e s t e e n ä + e s t e e t + e s t e e t t i s e m p i + e s t e e t t ä + e s t e e t t ö m i k s i + e s t e e t t ö m ä m p i + e s t e e t t ö m ä m p i ä + e s t e e t t ö m ä n + e s t e e t t ö m ä t + e s t e e t t ö m ä ä n + e s t e e t ö n t ä + e s t e i d e n + e s t e i k s i + e s t e i l l ä + e s t e i n e e n + e s t e i n ä + e s t e i s i i n + e s t e i s t ä + e s t e i t t ä + e s t e i t ä + e s t e j u o k s u a + e s t e j u o k s u u n + e s t e r a d a n + e s t e r a t a + e s t e r a t s a s t u s + e s t e r a t s a s t u s k i l p a i l u n + e s t e t i i k a s t a + e s t e t t y ä + e s t e t t ä + e s t e t t ä i s i i n + e s t e t ä ä n + e s t e t ä ä n k ö + e s t e v a n + e s t i v ä t + e s t o a r v o + e s t o k y n n y s + e s t o o n + e s t r a d i o l i s t a + e s t y n e i t ä + e s t y y + e s t ä e n + e s t ä i s i + e s t ä i s i m m e + e s t ä i s i t t e + e s t ä i s i v ä t + e s t ä j ä n ä + e s t ä j ä t + e s t ä k ä ä + e s t ä k ä ä m m e + e s t ä k ö + e s t ä m i s e e n + e s t ä m i s e k s i + e s t ä m i s e s t ä + e s t ä m i s k u l t t u u r i k s i + e s t ä m i s l o g i i k a n + e s t ä m i s s t r a t e g i a a + e s t ä m i s t ä + e s t ä m ä l l ä + e s t ä m ä s s ä + e s t ä m ä t t ä + e s t ä m ä ä n + e s t ä n e e t + e s t ä n y t + e s t ä t t e + e s t ä v i e n + e s t ä v ä t + e s t ä ä + e s t ä ä k s e e n + e s t ä ä k s e m m e + e s t ä ä k s e n i + e s t ä ä k s e n n e + e s t ä ä k ä ä n + e t a n a n + e t a n a n v a u h d i l l a + e t a n a n v a u h t i a + e t a n a p o s t i + e t a n a p o s t i n + e t a n o l i a l a l l e + e t a n o l i a l o i l l a + e t a n o l i j o h d a n n a i n e n + e t a n o l i n t u o t a n n o n + e t a n o l i o h j e l m a + e t a n o l i o h j e l m a n + e t a n o l i t e h d a s + e t a n o l i t e o l l i s u u d e l l e + e t a p p i v o i t t o a + e t e e n i o k s i d i n + e t e e n i p r o p e e n i k u m i + e t e e n n e + e t e e n p ä i n + e t e i s v ä r i n ä + e t e l ä a f r i k a l l e + e t e l ä a f r i k a n + e t e l ä a f r i k a n k i r v i n e n + e t e l ä a f r i k a s s a + e t e l ä a f r i k a s t a + e t e l ä a f r i k k a + e t e l ä a f r i k k a l a i s e k s i + e t e l ä a f r i k k a l a i s e l l a + e t e l ä a f r i k k a l a i s e n + e t e l ä a f r i k k a l a i s e s s a + e t e l ä a f r i k k a l a i s e s t a + e t e l ä a f r i k k a l a i s e t + e t e l ä a f r i k k a l a i s i a + e t e l ä a f r i k k a l a i s i l l e + e t e l ä a f r i k k a l a i s i s t a + e t e l ä a f r i k k a l a i s t a + e t e l ä a f r i k k a l a i s t e n + e t e l ä a m e r i k k a l a i n e n + e t e l ä a m e r i k k a l a i s e n + e t e l ä a m e r i k k a l a i s e t + e t e l ä a m e r i k k a l a i s i a + e t e l ä a m e r i k k a l a i s i s t a + e t e l ä a m e r i k k a l a i s t a + e t e l ä a m e r i k k a l a i s t e n + e t e l ä a r a b i a n l e o p a r d i + e t e l ä e u r o o p p a l a i n e n + e t e l ä e u r o o p p a l a i s e e n + e t e l ä e u r o o p p a l a i s e t + e t e l ä e u r o o p p a l a i s i a + e t e l ä e u r o o p p a l a i s i l l e + e t e l ä e u r o o p p a l a i s t e n + e t e l ä g e o r g i a n k i r v i n e n + e t e l ä i r a k i l a i s i a + e t e l ä i s e e n + e t e l ä i s e l l ä + e t e l ä i s e m m ä s s ä + e t e l ä i s e m p i i n + e t e l ä i s e n + e t e l ä i s e n k i n + e t e l ä i s e s s ä + e t e l ä i s e s t ä + e t e l ä i s e t + e t e l ä i s i i n + e t e l ä i s i l l e + e t e l ä i s i l l ä + e t e l ä i s i m m i l l ä + e t e l ä i s i s s ä + e t e l ä i s i s t ä + e t e l ä i s i ä + e t e l ä i s t e n + e t e l ä i s t ä + e t e l ä i t a l i a l a i s e e n + e t e l ä i t a l i a l a i s i a + e t e l ä i t a l i a l a i s i s t a + e t e l ä k a r t i o n + e t e l ä k a u k a s i a l a i s t e n + e t e l ä k o r e a l a i s e l l e + e t e l ä k o r e a l a i s e n + e t e l ä k o r e a l a i s e s s a + e t e l ä k o r e a l a i s e t + e t e l ä k o r e a l a i s e t k i n + e t e l ä k o r e a l a i s i a + e t e l ä k o r e a l a i s t e n + e t e l ä l a i t a + e t e l ä l a i t a a n s a + e t e l ä m a n t e r e e n + e t e l ä m a n t e r e e n l a u h a + e t e l ä m a n t e r e e s t a + e t e l ä m e r e n + e t e l ä m p ä n ä k i n + e t e l ä n + e t e l ä n a a p u r e i l l e m m e + e t e l ä n a a p u r i n s a + e t e l ä n a l v e j u u r i + e t e l ä n a p a + e t e l ä n a p a r e t k i k u n t a + e t e l ä n b a s s i t + e t e l ä n b a s t a r d i k i l p i k o n n a + e t e l ä n h a r m a a l o k k i + e t e l ä n h o p e a t ä p l ä + e t e l ä n i s o l e p i n k ä i n e n + e t e l ä n k a l k k u n a s a r v e k a s + e t e l ä n k a m p e l a t + e t e l ä n k e i j u + e t e l ä n k e l t a k a r v e + e t e l ä n k e l t a p e r h o n e n + e t e l ä n k e v ä t e s i k k o + e t e l ä n k i h u + e t e l ä n k i i l a v a n g a + e t e l ä n k i i s l a + e t e l ä n k i i t ä j ä + e t e l ä n k o s k e l o + e t e l ä n k r i l l i + e t e l ä n k r u u n u k u r k i + e t e l ä n k u l t a s a d e + e t e l ä n l e i n i k k i + e t e l ä n l e p a k k o + e t e l ä n l i e j u k a n a + e t e l ä n l i i t o + e t e l ä n m a m m u t t i + e t e l ä n m e r i m e t s o + e t e l ä n m e r i n o r s u + e t e l ä n m u n k k i + e t e l ä n m u s t a s i e p p o + e t e l ä n m u s t a v a l a s + e t e l ä n m y r s k y l i n t u + e t e l ä n n e n ä t t i + e t e l ä n n o k i a l b a t r o s s i + e t e l ä n p i h l a j a + e t e l ä n p u h v e l i k u t o j a + e t e l ä n p u l l o k u o n o v a l a s + e t e l ä n p u o l e i n e n + e t e l ä n p u o l e i s e e n + e t e l ä n p u o l e i s e n + e t e l ä n p u o l e i s e s s a + e t e l ä n p u o l e i s i a + e t e l ä n p u o l e i s i s t a + e t e l ä n p u o l e i s t a + e t e l ä n p u o l e i s t e n + e t e l ä n p u u k i i p i j ä + e t e l ä n p ä i v ä k i i t ä j ä + e t e l ä n r a h k a s a m m a l + e t e l ä n r u t t o j u u r i + e t e l ä n s a a r n i + e t e l ä n s a t a k i e l i + e t e l ä n s e l k ä l o k k i + e t e l ä n s i r k k a h a u k k a + e t e l ä n s i r p p i k i p u a j a + e t e l ä n s u o m u k i p u a j a + e t e l ä n t i i r a + e t e l ä n t u h k a v a r p u n e n + e t e l ä n t y t ö n k o r e n t o + e t e l ä n t ö y h t ö k a r a k a r a + e t e l ä n u k o n k o r e n t o + e t e l ä n u k o n p u t k i + e t e l ä n y l ä n k ö j u o k s i j a + e t e l ä o s a + e t e l ä o s a s s a + e t e l ä o s i e n + e t e l ä o s i i n + e t e l ä o s i s s a + e t e l ä p u i s t o + e t e l ä p u o l e i s e e n + e t e l ä p u o l e i s e s t a + e t e l ä p u o l e l l a + e t e l ä p u o l e n + e t e l ä p u o l i s e n + e t e l ä p u o l i s e s s a + e t e l ä p u o l i s i a + e t e l ä p u o l i s i s s a + e t e l ä p u o l i s t e n + e t e l ä p u o l t a + e t e l ä r a j a + e t e l ä r a j a a + e t e l ä r a j a l l a + e t e l ä r a j a l l a a n + e t e l ä r a j a l l a m m e + e t e l ä r a j a l l e + e t e l ä r a j a m m e + e t e l ä r a j a n + e t e l ä r a j o i h i n + e t e l ä r a j o i l l a + e t e l ä r a j o i l l a m m e + e t e l ä r a j o i l l e m m e + e t e l ä r a j o j a + e t e l ä r a j o j e n + e t e l ä r a n n a l l a + e t e l ä r a n n a l l e + e t e l ä r a n n a l t a + e t e l ä r a n n a n + e t e l ä r a n n i k k o a + e t e l ä r a n n i k o i l l a + e t e l ä r a n n i k o i l t a + e t e l ä r a n n i k o l l a + e t e l ä r a n n i k o l l e + e t e l ä r a n n i k o n + e t e l ä r a n n o i l l e + e t e l ä r a n n o i l t a + e t e l ä r a n s k a l a i s e l l e + e t e l ä r a n s k a l a i s e n + e t e l ä r a n s k a s s a + e t e l ä r e u n a l l a + e t e l ä r e u n a n + e t e l ä s a a r i + e t e l ä s a k s a l a i s e n + e t e l ä s a k s a l a i s i a + e t e l ä s a k s a l a i s i l l a + e t e l ä s a t a m a + e t e l ä s e r b i a l a i s e s t a + e t e l ä s l a a v i e n + e t e l ä s l a a v i t + e t e l ä s s ä + e t e l ä s u d a n i l a i s e t + e t e l ä s u d a n i l a i s i a + e t e l ä s u d a n i l a i s i l l a + e t e l ä s u d a n i l a i s i l l e + e t e l ä s u d a n i l a i s t e n + e t e l ä t i r o l i l a i s i i n + e t e l ä t i r o l i l a i s t e n + e t e l ä v a l t i o t + e t e l ä v e n ä j ä n k o i r a + e t e l ä ä + e t e l ä ä n + e t e l ä ä n k i n + e t e n e e + e t e n e m i s e e n + e t e n e m i s e k s i + e t e n e m i s e l l e + e t e n e m i s e m m e + e t e n e m i s e n + e t e n e m i s e s t ä + e t e n e m i s k e i n o j a + e t e n e m i s m a h d o l l i s u u d e n + e t e n e m i s m a h d o l l i s u u d e t + e t e n e m i s m a h d o l l i s u u k s i a + e t e n e m i s m a h d o l l i s u u k s i a a n + e t e n e m i s m a h d o l l i s u u k s i e n + e t e n e m i s m a h d o l l i s u u s + e t e n e m i s m a l l i + e t e n e m i s p r o s e s s e i s t a + e t e n e m i s r a k e n n e + e t e n e m i s r e i t i n + e t e n e m i s s t r a t e g i a a + e t e n e m i s s t r a t e g i a n + e t e n e m i s s u u n n a n + e t e n e m i s s u u n n a s t a + e t e n e m i s s u u n n a s t a m m e + e t e n e m i s s u u n n i t e l m a a + e t e n e m i s s u u n n i t e l m a a n + e t e n e m i s s u u n n i t e l m a h a n + e t e n e m i s s u u n n i t e l m a l l a + e t e n e m i s s u u n n i t e l m a m m e + e t e n e m i s s u u n n i t e l m a n + e t e n e m i s s u u n n i t e l m a n a + e t e n e m i s s u u n n i t e l m a n s a + e t e n e m i s s u u n n i t e l m a s s a + e t e n e m i s s u u n n i t e l m a s s a m m e + e t e n e m i s s u u n n i t e l m a s t a + e t e n e m i s s u u n n i t e l m a t + e t e n e m i s s u u n n i t e l m i a + e t e n e m i s s u u n n i t e l m i e n + e t e n e m i s s u u n n i t e l m i i n + e t e n e m i s s u u n n i t e l m i s s a + e t e n e m i s s u u n t a + e t e n e m i s s u u n t a m m e + e t e n e m i s t a h t i m m e + e t e n e m i s t a p a + e t e n e m i s t a p a a + e t e n e m i s t a p a a n + e t e n e m i s t a p a n a + e t e n e m i s t a p a n s a + e t e n e m i s t a p o j a + e t e n e m i s t a v a k s i + e t e n e m i s t a v a l t a + e t e n e m i s t a v a n + e t e n e m i s t a v a s s a + e t e n e m i s t a v a s t a + e t e n e m i s t a v a t + e t e n e m i s t a v o i s t a + e t e n e m i s t e i t ä + e t e n e m i s t i e + e t e n e m i s t i e n + e t e n e m i s t ä + e t e n e m i s t ä m m e + e t e n e m i s v a i h t o e h d o i s t a + e t e n e m i s v a i h t o e h d o n + e t e n e m i s v a u h t i + e t e n e m m e + e t e n e m m e k ö + e t e n e m ä l l ä + e t e n e m ä s s ä + e t e n e m ä ä n + e t e n e n + e t e n e t t e + e t e n e t t e k ö + e t e n e v ä n + e t e n e v ä t + e t e n i + e t e n i s i + e t e n i s i v ä t + e t e v i e n + e t e v i m m ä t + e t e v ä m m i n + e t i i k a l l e + e t i i k a n + e t i i k a n t a j u n + e t i i k a s t a + e t i i k k a a + e t i i k k a a n + e t i i k k a a n s a + e t i i k k a k o k o e l m a + e t i i k k a k y s y m y s + e t i i k k a r y h m ä n + e t i k e t e i s s ä + e t i k e t i s s ä + e t i k e t t i i n + e t i k e t t i p a k k o + e t i k e t ö i n t i k y s y m y k s e s t ä + e t i k e t ö i n t i v e l v o i t t e i s t a + e t i k k a h a p p o + e t i k k a h a p p o a n h y d r i d i + e t i o p i a l a i s t e n + e t n i s e k s i + e t n i s e n + e t n i s e s t ä + e t n i s e t + e t n i s i i n + e t n i s i k s i + e t n i s i l l ä + e t n i s i s s ä + e t n i s i s t ä + e t n i s i ä + e t n i s t e n + e t n i s t ä + e t n i s u s k o n n o l l i s t a + e t n o s e n t r i s e s t i + e t r u s k i k a r h u + e t r u s k i k u u s a m a + e t r u s k i p ä ä s t ä i n e n + e t r u s k i t + e t s i e s s ä + e t s i e s s ä m m e + e t s i e s s ä ä n + e t s i i + e t s i j ä t + e t s i j ö i t ä + e t s i k k o a i k a a n s a + e t s i k ä ä + e t s i k ä ä m m e + e t s i m i s e e n + e t s i m i s e k s i + e t s i m i s e s s ä + e t s i m i s e s t ä + e t s i m i s t ä + e t s i m m e + e t s i m ä s s ä + e t s i m ä t t ä + e t s i m ä ä n + e t s i n e e t + e t s i n n ä t + e t s i n t ä k e s k u s t e n + e t s i n t ä k o h t e i t a + e t s i n t ä k u u l u t e t u s t a + e t s i n t ä k u u l u t u s + e t s i n t ä l u p i a + e t s i n t ä l u v a n + e t s i n t ä m e n e t t e l y i s t ä + e t s i n t ä o h j e l m a a n + e t s i n t ä o h j e l m a t + e t s i n t ä o i k e u k s i s t a + e t s i n t ä o p e r a a t i o i d e n + e t s i n t ä p a r t i o + e t s i n t ä ä n + e t s i n y t + e t s i t t ä e s s ä + e t s i t ä ä n + e t s i v i e n + e t s i v ä t + e t s i v ä t o i m i s t o + e t s i ä + e t s i ä k s e e n + e t s i ä k s e m m e + e t u a a n + e t u a l a l l a + e t u a l a l l e + e t u a l o j e n + e t u a n a l y y s i t + e t u a s e m a n + e t u a s e m a s s a + e t u i h i n + e t u i s u u s j ä r j e s t e l m i ä + e t u i s u u s j ä r j e s t e l y i h i n + e t u i s u u s k o h t e l u + e t u i s u u s k o h t e l u n + e t u j a + e t u j a a n + e t u j a m m e + e t u j e m m e + e t u j e n + e t u j e n i + e t u j e n n e + e t u j e n s a + e t u j o u k o i s s a + e t u j ä r j e s t e l m i s t ä + e t u j ä r j e s t e l m ä s s ä + e t u j ä r j e s t e l m ä ä + e t u j ä r j e s t e l m ä ä n + e t u j ä r j e s t ö + e t u j ä r j e s t ö i h i n + e t u j ä r j e s t ö i l l e + e t u j ä r j e s t ö j e n + e t u j ä r j e s t ö j ä + e t u j ä r j e s t ö t + e t u j ä r j e s t ö ä + e t u k y s y m y k s e e n + e t u k ä t e i s a r v i o i n n i l l e + e t u k ä t e i s a r v i o i n t i a + e t u k ä t e i s i l m o i t u s t a + e t u k ä t e i s i l m o i t u s v e l v o l l i s u u d e n + e t u k ä t e i s k u u l e m i s t a + e t u k ä t e i s l u p a a + e t u k ä t e i s l u v a n + e t u k ä t e i s m a k s u i h i n + e t u k ä t e i s m a k s u j a + e t u k ä t e i s m a k s u j ä r j e s t e l m i ä + e t u k ä t e i s m a k s u t + e t u k ä t e i s o s t o s o p i m u k s i i n + e t u k ä t e i s r a h o i t u k s e e n + e t u k ä t e i s r a h o i t u k s e n + e t u k ä t e i s r a h o i t u s + e t u k ä t e i s r e k i s t e r ö i n n i n + e t u k ä t e i s s e l v i t y s + e t u k ä t e i s s i j o i t t e l u s s a + e t u k ä t e i s s o p i m u s t a + e t u k ä t e i s s u o s t u m u s + e t u k ä t e i s s u u n n i t e l m a n + e t u k ä t e i s s u u n n i t t e l u + e t u k ä t e i s s u u n n i t t e l u a + e t u k ä t e i s s u u n n i t t e l u n + e t u k ä t e i s t i e t o a + e t u k ä t e i s t i e t o j e n + e t u k ä t e i s t o i m i i n + e t u k ä t e i s t u t k i m u k s i a + e t u k ä t e i s t u t k i m u s t a + e t u k ä t e i s v a l m i s t e l u i h i n + e t u k ä t e i s v a l v o n n a s t a + e t u k ä t e i s v a l v o n t a + e t u k ä t e i s v a l v o n t a a + e t u k ä t e i s v a r o i t u k s i i n + e t u k ä t e i s v a r o i t u s t a + e t u k ä t e i s v ä l i n e t t ä + e t u l i n j a + e t u l i n j a a + e t u l i n j a a n + e t u l i n j a k s i + e t u l i n j a n + e t u l i n j a n s a + e t u l i n j a s s a + e t u l i n j a s t a + e t u l i n j o j a + e t u l y ö n t i a s e m a + e t u l y ö n t i a s e m a a + e t u l y ö n t i a s e m a n + e t u l y ö n t i a s e m a n s a + e t u l y ö n t i a s e m a s s a + e t u l y ö n t i e d u n + e t u m a k s u + e t u m a k s u t + e t u m a t k a + e t u m a t k a a + e t u m m e + e t u n a + e t u n i + e t u n i m e n i + e t u n i m i + e t u n i m i n ä + e t u n i m i s t ä + e t u n s a + e t u n ä k ö k o h d a t + e t u n ä k ö k o h d i s s a + e t u n ä k ö k o h t a + e t u n ä k ö k o h t a n i + e t u n ä k ö k o h t i a + e t u n ä k ö k o h t i e n + e t u o i k e u d e l l i n e n + e t u o i k e u d e n + e t u o i k e u d e t + e t u o i k e u k s i a + e t u o i k e u k s i a a n + e t u o i k e u k s i a m m e + e t u o i k e u k s i e n + e t u o i k e u k s i i n + e t u o i k e u k s i i n s a + e t u o i k e u k s i s t a + e t u o i k e u s + e t u o i k e u s k o h t e l u a + e t u o i k e u t e n s a + e t u o i k e u t e t t u + e t u o i k e u t e t t u j a + e t u o i k e u t e t t u n a + e t u o i k e u t e t u i l l a + e t u o i k e u t e t u i l l e + e t u o i k e u t e t u l l e + e t u o i k e u t e t u l t a + e t u o i k e u t e t u m m i n + e t u o i k e u t e t u n + e t u o i k e u t e t u t + e t u o i k e u t t a + e t u o s a n + e t u o s i s t a + e t u o v e a + e t u o v e n + e t u o v e n n e + e t u o v e s t a + e t u o v i + e t u p a i n o t t e i n e n + e t u p a i n o t u k s e n + e t u p a i n o t u s m a l l i a + e t u p a i n o t u s m e n e t e l m ä ä + e t u p e n k i l l ä + e t u p e n k i s s ä + e t u p e n k k i + e t u p i h a l l a m m e + e t u p i h a l l e m m e + e t u p i h a m m e + e t u p i i r e j ä + e t u p i i r i + e t u p i i r i e n + e t u p i i r i k i i s t a n a + e t u p i i r i n s ä + e t u p i i r i t + e t u r a u h a s s y ö p ä + e t u r a u h a s s y ö p ä g e e n i n + e t u r a u h a s s y ö p ä t e s t i s t ä + e t u r a u h a s s y ö p ä ä + e t u r a u h a s s y ö v ä n + e t u r a u h a s t a a n + e t u r i n t a m a a n + e t u r i n t a m a s s a + e t u r i s t i r i i d a n + e t u r i s t i r i i d a s s a + e t u r i s t i r i i d a s t a + e t u r i s t i r i i d a t + e t u r i s t i r i i d o i l l a + e t u r i s t i r i i d o i s s a + e t u r i s t i r i i d o i s t a + e t u r i s t i r i i t a + e t u r i s t i r i i t a a + e t u r i s t i r i i t a a n + e t u r i s t i r i i t a k o n f l i k t i + e t u r i s t i r i i t a n s a + e t u r i s t i r i i t a t a p a u k s i a + e t u r i s t i r i i t a t i l a n t e e n + e t u r i s t i r i i t a t i l a n t e e s s a + e t u r i s t i r i i t a t i l a n t e i s s a + e t u r i s t i r i i t o i h i n + e t u r i s t i r i i t o j a + e t u r i s t i r i i t o j e n + e t u r i s t i r i i t o j e n n e + e t u r i v i i n + e t u r i v i n + e t u r i v i s s ä + e t u r i v i s t ä + e t u r y h m i e m m e + e t u r y h m i e n + e t u r y h m i i n + e t u r y h m i k s i + e t u r y h m i l l e + e t u r y h m i l l ä + e t u r y h m i l t ä + e t u r y h m i s s ä + e t u r y h m i s t ä + e t u r y h m i t t y m i e n + e t u r y h m i t t y m ä t + e t u r y h m i ä + e t u r y h m ä + e t u r y h m ä l l ä + e t u r y h m ä n + e t u r y h m ä n ä + e t u r y h m ä s s ä + e t u r y h m ä t + e t u r y h m ä ä + e t u r y h m ä ä n + e t u r y t m i ä + e t u s e t e l i o h j e l m i a + e t u s i j a + e t u s i j a a + e t u s i j a l l a + e t u s i j a l l e + e t u s i j a n + e t u s i j a p e r i a a t e + e t u s i j a p e r i a a t e t t a + e t u s i j a ä ä n e s t y k s e e n + e t u s i v u i l l a + e t u s i v u i l l e + e t u s i v u i l t a + e t u s i v u l l a + e t u s i v u l l a a n + e t u s i v u l l e + e t u s i v u n + e t u s i v u t + e t u s o r m e n + e t u s o r m i + e t u s u o j a + e t u s u o j a j ä r j e s t e l m i e n + e t u s u o j a j ä r j e s t e l m i l l e + e t u s u o j a j ä r j e s t e l m i ä + e t u s u o j a j ä r j e s t e l m ä t + e t u s u o j a j ä r j e s t e l m ä ä + e t u t a s a p a i n o n + e t u t ö r m ä y s + e t u u d e t + e t u u k s i a + e t u u k s i e n + e t u u k s i i n + e t u u k s i s t a + e t u u n + e t u u s e h d o i l l a + e t u u s j ä r j e s t e l m i e n + e t u u s j ä r j e s t e l m i i n + e t u u s j ä r j e s t e l m i l l e + e t u u s j ä r j e s t e l m i s s ä + e t u u s j ä r j e s t e l m i s t ä + e t u u s j ä r j e s t e l m i ä + e t u u s j ä r j e s t e l m i ä ä n + e t u u s j ä r j e s t e l m ä + e t u u s j ä r j e s t e l m ä m m e + e t u u s j ä r j e s t e l m ä n + e t u u s j ä r j e s t e l m ä s t ä + e t u u s j ä r j e s t e l m ä t + e t u u s j ä r j e s t e l m ä ä + e t u u s j ä r j e s t e l m ä ä n + e t u u s j ä r j e s t e l y i s t ä + e t u u s j ä r j e s t e l y y n + e t u u s k i i n t i ö i t ä + e t u u s k o h t e l u + e t u u s k o h t e l u a + e t u u s k o h t e l u j ä r j e s t e l m ä n + e t u u s k o h t e l u j ä r j e s t e l m ä ä n + e t u u s k o h t e l u j ä r j e s t e l y j e n + e t u u s k o h t e l u k a u d e n + e t u u s k o h t e l u k a u p a n + e t u u s k o h t e l u k a u p p a a + e t u u s k o h t e l u l l a + e t u u s k o h t e l u n + e t u u s k o h t e l u p e r i a a t t e e l l a + e t u u s k o h t e l u s o p i m u s + e t u u s k o h t e l u s o p i m u s t e n + e t u u s k o h t e l u s s a + e t u u s k o h t e l u s t a + e t u u s k o h t e l u t + e t u u s k o h t e l u t o d i s t u s t e n + e t u u s k o h t e l u t o i m e n p i t e i n + e t u u s k o h t e l u u n + e t u u s l a u s e k e t t a + e t u u s m a r g i n a a l i + e t u u s m a r g i n a a l i a + e t u u s m a r g i n a a l i n + e t u u s m a r g i n a a l i s t a + e t u u s m e k a n i s m i e n + e t u u s m e n e t t e l y n + e t u u s p a k e t t i a + e t u u s p e r u s t e i s i s t a + e t u u s p o l i t i i k a n + e t u u s s o p i m u k s i a + e t u u s t a s o n + e t u u s t o i m e n p i t e i d e n + e t u u s t u l l e j a + e t u v a r t i o t a + e t u v a s t a k o h d a t + e t u v e r k o s t o s s a + e t u v e t o + e t u v o k a a l i + e t u y h t e i s ö + e t u y h t e i s ö s s ä + e t u y h t y m i e n + e t u y h t y m i i n + e t u y h t y m ä + e t u y h t y m ä r a k e n n e t t a + e t u y h t y m ä t + e t y l e e n i g l y k o l i + e t y l e e n i k a r b o n a a t t i + e t y l e e n i o k s i d i + e t y y l i a l k o h o l i + e t y y l i a l k o h o l i a + e t y y l i a l k o h o l i e n + e t y y l i a l k o h o l i l l e + e t y y l i a l k o h o l i n + e t y y l i a s e t a a t t i + e t y y l i b r o m i a s e t a a t t i + e t y y l i k a r b a m a a t t i + e t y y l i k l o o r i a s e t a a t t i + e t y y l i n i t r a a t t i + e t y y l i s e l l u l o o s a + e t y y l i t e r t i ä ä r i b u t y y l i e e t t e r i + e t ä h a l l i n n o n + e t ä h a l l i n n o s t a + e t ä i s e e n + e t ä i s e l t ä + e t ä i s e m m ä l t ä + e t ä i s e n ä + e t ä i s i l t ä + e t ä i s t ä + e t ä i s y y d e n + e t ä i s y y k s i e n + e t ä i s y y s m o d u l i + e t ä i s y y s p r o b l e m a t i i k a s t a + e t ä i s y y s p r o b l e m a t i i k k a a + e t ä i s y y s r a j o i t u s + e t ä i s y y s t i k a p u u t + e t ä i s y y t t ä + e t ä k a u p a n k ä y n t i + e t ä k a u p p a + e t ä k a u p p a a + e t ä k a u p p a n a + e t ä k i r u r g i s t e n + e t ä k o u l u t u k s e n + e t ä l a i n a n + e t ä l a m a u t i n + e t ä l u o t t o t a p a h t u m i s t a + e t ä l ä ä k e t i e d e + e t ä l ä ä k ä r i + e t ä m a r k k i n o i n n i n + e t ä m a r k k i n o i n t i a + e t ä m a r k k i n o i n t i d i r e k t i i v i s s ä + e t ä m a r k k i n o i n t i d i r e k t i i v i ä + e t ä m y y n n i n + e t ä m y y n n i s s ä + e t ä m y y n n i s t ä + e t ä m y y n t i + e t ä m y y n t i d i r e k t i i v i + e t ä m y y n t i d i r e k t i i v i n + e t ä m y y n t i i n + e t ä m y y n t i j ä r j e s t e l y j ä + e t ä m y y n t i s o p i m u k s i a + e t ä m y y n t i t o i m i n t a a + e t ä m y y n t i t u l o i s t a a n + e t ä m y y n t i ä + e t ä o p e t u k s e e n + e t ä o p e t u s + e t ä o p e t u s m u o t o i h i n + e t ä o p e t u s t a + e t ä o p i n t o j a + e t ä o p i s k e l u + e t ä o p i s k e l u a + e t ä o p i s k e l u a p u a + e t ä o p i s k e l u k u r s s i e n + e t ä o p i s k e l u n + e t ä o p i s k e l u s t a + e t ä o p i s k e l u u n + e t ä o p p i m i n e n + e t ä o p p i m i s e l l e + e t ä o p p i m i s e n + e t ä o s t o j a + e t ä o s t o k s i a + e t ä o s t o s t e n + e t ä p a l v e l u j e n + e t ä p a l v e l u n a + e t ä r a h o i t u s p a l v e l u i s t a + e t ä s i i r t o j e n + e t ä s o p i m u k s e n + e t ä s o p i m u k s i a + e t ä s o p i m u k s i i n + e t ä s o p i m u k s i n + e t ä s o p i m u k s i s s a + e t ä s o p i m u k s i s t a + e t ä s o p i m u s t e n + e t ä t a r j o u k s i a + e t ä t o i m i n t a a + e t ä t u k i j ä r j e s t e l m ä t + e t ä t u l k k a u k s e s t a + e t ä t y ö l l i s y y t t ä + e t ä t y ö n + e t ä t y ö n t e k i j ö i l l e + e t ä t y ö p a i k k o j a + e t ä t y ö s t ä + e t ä v a l v o n t a + e t ä v a l v o n t a a + e t ä ä n n y t t y + e t ä ä n t y n e e n + e t ä ä n t y y + e t ä ä n t y ä + e u g e n i i k k a a + e u k a l y p t u s k i i p i j ä + e u k a l y p t u s p u u t a + e u k a l y p t u s t i m a l i + e u k o n k a n t o + e u r a a s i a l a i s e l l a + e u r o a + e u r o a a s i a l a i s e s s a + e u r o a i k a + e u r o a i k a a n + e u r o a i k a n a + e u r o a j a n + e u r o a k a a n + e u r o a l u e + e u r o a l u e e l l a + e u r o a l u e e l l a k i n + e u r o a l u e e l l e + e u r o a l u e e l t a + e u r o a l u e e n + e u r o a l u e e s e e n + e u r o a l u e e s s a + e u r o a l u e e s t a + e u r o a l u e i l l a + e u r o a l u e i s t a + e u r o a l u e p a i n o t t e i s u u s + e u r o a l u e t t a + e u r o a p a t i a + e u r o a r m e i j a + e u r o a r m e i j a n + e u r o a r m e i j a s t a + e u r o a r v o p a p e r e i d e n + e u r o a r v o p a p e r e i s t a + e u r o a r v o p a p e r e i t a + e u r o a r v o p a p e r i e n + e u r o a s i a n t u n t i j o i d e n + e u r o a s i a n t u n t i j o i l l e + e u r o a t l a n t t i n e n + e u r o a t l a n t t i s e e n + e u r o a t l a n t t i s e l l e + e u r o a t l a n t t i s e n + e u r o a t l a n t t i s e s s a + e u r o a t l a n t t i s e s t a + e u r o a t l a n t t i s e t + e u r o a t l a n t t i s i a + e u r o a t l a n t t i s i i n + e u r o a t l a n t t i s i l l e + e u r o a t l a n t t i s i s t a + e u r o a t l a n t t i s t a + e u r o a t l a n t t i s t e n + e u r o b a r o m e t r i + e u r o b a r o m e t r i i n + e u r o b a r o m e t r i k e r t o m u k s e s t a + e u r o b a r o m e t r i n + e u r o b a r o m e t r i t u t k i m u k s e s s a + e u r o b a r o m e t r i t u t k i m u k s i s s a + e u r o b a r o m e t r i t u t k i m u s + e u r o b y r o k r a t i a + e u r o b y r o k r a t i a a + e u r o b y r o k r a t i a n + e u r o b y r o k r a t i a s t a + e u r o c u p + e u r o e d u s t a j a a + e u r o e l i i t i n + e u r o e l i i t t i + e u r o e p ä i l y i l l e e n + e u r o f a n a a t t i n e n + e u r o f a n a a t t i s t a + e u r o f e d e r a l i s m i + e u r o f e d e r a l i s t e i l t a + e u r o f e d e r a l i s t i e n + e u r o f e d e r a l i s t i s e n + e u r o f i l a n t r o o p i t + e u r o h a n k e + e u r o h a n k k e e n + e u r o h a n k k e e s s a + e u r o h a n k k e e s t a + e u r o h a n k k e e t + e u r o h i n t o i h i n + e u r o h i n t o j e n + e u r o h u l l u u t t a + e u r o i h i n + e u r o i k s i + e u r o i l l a + e u r o i m p e r i a l i s m i + e u r o i n a + e u r o i n e e n + e u r o i n f l a a t i o s t a + e u r o i n s i n ö ö r e i l t ä + e u r o i n t o i l i j a t + e u r o i n t o i l i j o i d e n + e u r o i s l a m i l a i s e s t a + e u r o i s s a + e u r o i t s e k k y y d e s t ä + e u r o j a + e u r o j a r g o n i s t a + e u r o j e n + e u r o j o u k k u e + e u r o j o u k o t + e u r o j ä r j e s t e l m ä + e u r o j ä r j e s t e l m ä l l e + e u r o j ä r j e s t e l m ä l l ä + e u r o j ä r j e s t e l m ä n + e u r o j ä r j e s t e l m ä s s ä + e u r o j ä r j e s t e l m ä s t ä + e u r o j ä r j e s t e l m ä ä n + e u r o j ä s e n v a l t i o i s s a + e u r o j ä s e n y y d e n + e u r o k a m p a n j a + e u r o k a m p a n j a a + e u r o k a m p a n j a a n + e u r o k a m p a n j a n + e u r o k a n s a l a i s t e n + e u r o k e h y k s e e n + e u r o k e s k u k s e k s i + e u r o k i e l e l l ä + e u r o k l u b i i n + e u r o k l u b i n + e u r o k o l i k k o + e u r o k o l i k k o a u t o m a a t t e i n a + e u r o k o l i k k o j a + e u r o k o l i k k o j e n + e u r o k o l i k o i d e n + e u r o k o l i k o i h i n + e u r o k o l i k o i s s a + e u r o k o l i k o i s t a + e u r o k o l i k o i t a + e u r o k o l i k o l l a + e u r o k o l i k o n + e u r o k o l i k o t + e u r o k o m i t e a l l a + e u r o k o o d i k y s y m y k s e s t ä + e u r o k r a a t t i e n + e u r o k r a a t t i n a + e u r o k r a a t t i t y r a n n e i l l e + e u r o k r i i s i + e u r o k r i i s i n + e u r o k r i i s i s t ä + e u r o k r i i s i ä + e u r o k r i i t i k k o n a + e u r o k r i t e e r e j ä + e u r o k r i t e e r i t + e u r o k u l t t u u r i a + e u r o k u m p p a n e i d e m m e + e u r o l a i v a + e u r o l i b e r a a l e j a + e u r o l i b e r a a l i + e u r o l i b e r a l i s m i + e u r o l l a + e u r o m a a + e u r o m a a h a n + e u r o m a a n + e u r o m a a s s a + e u r o m a a t + e u r o m a i d e n + e u r o m a i l l e + e u r o m a i s s a + e u r o m a i t a + e u r o m a k s u a l u e + e u r o m a k s u a l u e e k s i + e u r o m a k s u a l u e e l l a + e u r o m a k s u a l u e e n + e u r o m a k s u a l u e t t a + e u r o m a k s u i l l a + e u r o m a k s u j a + e u r o m a k s u j e n + e u r o m a k s u t + e u r o m a k s u v a l m i u d e n + e u r o m a l l i i n + e u r o m a r k k i n o i l l a + e u r o m a s o k i s m i a + e u r o m a u s t a + e u r o m e l u n + e u r o m e r k k i i n + e u r o m e t a l l i r a h a t + e u r o m e t a l l i r a h o i l l e + e u r o m e t a l l i r a h o j e n + e u r o m i e l e n o s o i t u k s e t + e u r o m y ö n t e i s e n + e u r o m y ö n t e i s i m m i s t ä + e u r o m y ö n t e i s i ä + e u r o m ä ä r i i n + e u r o m ä ä r ä i s e s t ä + e u r o m ä ä r ä i s i k s i + e u r o m ä ä r ä i s t ä + e u r o m ä ä r ä n s ä + e u r o n + e u r o n a t i o n a l i s m i n + e u r o n a t i o n a l i s m i s t a + e u r o n e s t i n + e u r o n e u v o n t a k e s k u k s e t + e u r o n e u v o n t a k e s k u k s i s s a + e u r o n e u v o n t a k e s k u s t e n + e u r o n e u v o s t o + e u r o n e u v o s t o a + e u r o n e u v o s t o l l a + e u r o n e u v o s t o n + e u r o n e u v o s t o o n + e u r o n e u v o s t o s s a + e u r o o n + e u r o o p a n k e l t i s + e u r o o p p a l a i n e n k a a n + e u r o o p p a l a i s e e n + e u r o o p p a l a i s e k s i + e u r o o p p a l a i s e l l a + e u r o o p p a l a i s e l l e + e u r o o p p a l a i s e l t a + e u r o o p p a l a i s e m m a k s i + e u r o o p p a l a i s e m m a n + e u r o o p p a l a i s e m m a s t a + e u r o o p p a l a i s e m m i k s i + e u r o o p p a l a i s e m m i n + e u r o o p p a l a i s e m p a a + e u r o o p p a l a i s e m p i + e u r o o p p a l a i s e m p i a + e u r o o p p a l a i s e m p i i n + e u r o o p p a l a i s e n + e u r o o p p a l a i s e n a + e u r o o p p a l a i s e s s a + e u r o o p p a l a i s e s t a + e u r o o p p a l a i s e s t i + e u r o o p p a l a i s e t + e u r o o p p a l a i s e t k i n + e u r o o p p a l a i s h e n k i n e n + e u r o o p p a l a i s i a + e u r o o p p a l a i s i i n + e u r o o p p a l a i s i k s i + e u r o o p p a l a i s i l l a + e u r o o p p a l a i s i l l e + e u r o o p p a l a i s i l l e k i n + e u r o o p p a l a i s i l t a + e u r o o p p a l a i s i n + e u r o o p p a l a i s i n a + e u r o o p p a l a i s i n t a + e u r o o p p a l a i s i s s a + e u r o o p p a l a i s i s t a + e u r o o p p a l a i s j o u k k o j e n + e u r o o p p a l a i s l a s t e n + e u r o o p p a l a i s m i e l i n e n + e u r o o p p a l a i s m i e l i s e n + e u r o o p p a l a i s m i e l i s i l t ä + e u r o o p p a l a i s m i e l i s i ä + e u r o o p p a l a i s m i e l i s t ä + e u r o o p p a l a i s n a i s t e n + e u r o o p p a l a i s n u o r t e n + e u r o o p p a l a i s p o l i i t i k k o j e n + e u r o o p p a l a i s p o l i i t i k o t + e u r o o p p a l a i s s u k u p o l v i l l a + e u r o o p p a l a i s t a m i s e k s i + e u r o o p p a l a i s t a m i s e l l e + e u r o o p p a l a i s t a m i s p r o s e s s i a + e u r o o p p a l a i s t a m i s t a + e u r o o p p a l a i s t e n + e u r o o p p a l a i s t e n k i n + e u r o o p p a l a i s t u m i s a s k e l e i t a + e u r o o p p a l a i s t u m i s n ä k y m i e n + e u r o o p p a l a i s t u m i s n ä k y m i ä + e u r o o p p a l a i s t u m i s p r o s e s s i a + e u r o o p p a l a i s t u r i s t i a + e u r o o p p a l a i s t u u + e u r o o p p a l a i s t y t t ö + e u r o o p p a l a i s t y y l i s t ä + e u r o o p p a l a i s u u d e l l e + e u r o o p p a l a i s u u d e n + e u r o o p p a l a i s u u d e s t a + e u r o o p p a l a i s u u s a j a t u k s e n + e u r o o p p a l a i s u u s t y ö h ö n + e u r o o p p a l a i s u u t t a + e u r o o p p a l a i s u u t t a a n + e u r o o p p a l a i s v a l t u u s k u n n a n + e u r o o p p a l a i s y h t i ö n + e u r o o p p a l a i s y r i t y k s e t + e u r o o p p a l a i s y r i t y k s i l l e + e u r o o p p a l a i s y r i t y k s i l l ä + e u r o o p p a y h t i ö i d e n + e u r o o p p a y h t i ö i h i n + e u r o o p p a y h t i ö i k s i + e u r o o p p a y h t i ö i l l e + e u r o o p p a y h t i ö i s s ä + e u r o o p p a y h t i ö i s t ä + e u r o o p p a y h t i ö i t ä + e u r o o p p a y h t i ö k s i + e u r o o p p a y h t i ö l l ä + e u r o o p p a y h t i ö n + e u r o o p p a y h t i ö s s ä + e u r o o p p a y h t i ö s t ä + e u r o o p p a y h t i ö t ä + e u r o o p p a y h t i ö ö n + e u r o p a + e u r o p a k k o p a i t a a n + e u r o p a r l a m e n t a a r i k k o i n a + e u r o p a r l a m e n t a a r i k k o j e n + e u r o p a r l a m e n t a a r i k k o n a + e u r o p a r l a m e n t a a r i k o i l l e e n + e u r o p a r l a m e n t a a r i k o n + e u r o p a r l a m e n t i n + e u r o p a r l a m e n t t i + e u r o p a r l a m e n t t i i n + e u r o p a r l a m e n t t i v a a l e i h i n + e u r o p a r l a m e n t t i v a a l e i s s a + e u r o p a r l a m e n t t i v a a l e j a + e u r o p a r l a m e n t t i v a a l i e n + e u r o p a r l a m e n t t i v a a l i t + e u r o p a s t a + e u r o p e r h e e n + e u r o p e r h e e s e e n + e u r o p e r u s t u s l a k i a + e u r o p e s s i m i s m i + e u r o p e s s i m i s m i i n + e u r o p e s s i m i s m i l l ä + e u r o p e s s i m i s m i n + e u r o p o h j a i s e n + e u r o p o l i a + e u r o p o l i i s i t i e t o j a + e u r o p o l i i t i k k o j e n + e u r o p o l i l l e + e u r o p o l i n + e u r o p o l i n k i n + e u r o p o l i s s a + e u r o p o l i s t a + e u r o p r o j e k t i + e u r o p r o j e k t i l l e + e u r o p r o p a g a n d a + e u r o p r o p a g a n d a s t a + e u r o p u i s t o j a + e u r o p u o l u e + e u r o p u o l u e i d e n + e u r o p u o l u e t u e l l e + e u r o p u o l u e t u e n + e u r o p u o l u e t u k e a + e u r o p u o l u e t u k i + e u r o p u o l u e t u k i v a r o i l l a + e u r o r a h a h a n k e + e u r o r a h a m a r k k i n a t + e u r o r a h a n + e u r o r a h a s t a + e u r o r a h a s t o j e n + e u r o r e a l i s t e i l l a + e u r o r e a l i s t i e n + e u r o r e a l i s t i n a + e u r o r e a l i s t i s e s t a + e u r o r e t o r i i k k a + e u r o r y h m ä + e u r o r y h m ä n + e u r o r y h m ä s s ä + e u r o r y h m ä ä + e u r o r y h m ä ä n + e u r o s a n a + e u r o s e i k k a i l u + e u r o s e i k k a i l u u n + e u r o s e n t i i m i + e u r o s e n t t i ä + e u r o s e n t t i ä k ä ä n + e u r o s e t e l e i d e n + e u r o s e t e l e i h i n + e u r o s e t e l e i s t ä + e u r o s e t e l e i t ä + e u r o s e t e l e j ä + e u r o s e t e l i + e u r o s e t e l i e n + e u r o s e t e l i i n + e u r o s e t e l i t + e u r o s e t e l i ä + e u r o s i i r r o n + e u r o s i r k u k s e n + e u r o s i t o u m u k s i a + e u r o s k e p t i k k o + e u r o s k e p t i k k o i h i n + e u r o s k e p t i k k o j a + e u r o s k e p t i k k o j e n + e u r o s k e p t i k k o n a + e u r o s k e p t i k o i d e n + e u r o s k e p t i k o i l l e + e u r o s k e p t i k o i s t a + e u r o s k e p t i k o i s t a a n + e u r o s k e p t i k o k s i + e u r o s k e p t i k o t + e u r o s k e p t i s e l l e + e u r o s k e p t i s e m p i e n + e u r o s k e p t i s e t + e u r o s k e p t i s i s m i n + e u r o s k e p t i s y y d e l l e + e u r o s k e p t i s y y d e n + e u r o s k e p t i s y y d e s t ä + e u r o s k e p t i s y y s + e u r o s k e p t i s y y t e e n + e u r o s k e p t i s y y t t ä + e u r o s l a i v a r e k i s t e r i s t ä + e u r o s o l i d a a r i s u u t t a + e u r o s o p i m u s + e u r o s o s i a a l i s t a + e u r o s t a + e u r o s t a n d a r d i n + e u r o s t a t i l l e + e u r o s t a t i n + e u r o s t a t i s s a + e u r o s t a t i s t a + e u r o s ä ä s t ö k i r j o j a + e u r o s ä ä t i ö i l l e + e u r o t + e u r o t a l o u d e s s a + e u r o t e r v e y t t ä + e u r o t i e d o t u s + e u r o t i e d o t u s k a m p a n j a + e u r o t i e d o t u s k e s k u k s e t + e u r o t i l i + e u r o t u n n e l i n + e u r o t u n n e l i s s a + e u r o t u o t t e e t + e u r o t y ö t t ö m y y d e s t ä + e u r o u n e l m a n n e + e u r o u u d i s t u k s e e n + e u r o v a a l e i h i n + e u r o v a a l e i s s a + e u r o v a a l e j a + e u r o v a a l i e h d o k k a i d e n + e u r o v a a l i e n + e u r o v a a l i k a m p a n j a n + e u r o v a a l i o i k e u d e n + e u r o v a a l i p r o p a g a n d a a + e u r o v a a l i t + e u r o v a l t i o i d e n + e u r o v a l t i o n + e u r o v a l u u t a n + e u r o v a l u u t a s t a + e u r o v a l u u t t a + e u r o v a l u u t t a a + e u r o v a l u u t t a a n + e u r o v a l u u t t a j ä r j e s t e l m ä ä n + e u r o v a l u u t t a s e t e l e i t ä + e u r o v a l u u t t o j e n + e u r o v a r a n t o j a a n + e u r o v e r o + e u r o v e r o i l l e + e u r o v e r o j a + e u r o v e r o n + e u r o v i i s u k a r s i n t a + e u r o v i i s u t + e u r o v i n j e t i s t ä + e u r o v i n j e t t i d i r e k t i i v i + e u r o v i n j e t t i d i r e k t i i v i i n + e u r o v i n j e t t i d i r e k t i i v i k s i + e u r o v i n j e t t i d i r e k t i i v i l l ä + e u r o v i n j e t t i d i r e k t i i v i n + e u r o v i n j e t t i d i r e k t i i v i s s ä + e u r o v i n j e t t i d i r e k t i i v i s t ä + e u r o v i n j e t t i d i r e k t i i v i ä + e u r o v i n j e t t i e h d o t u k s e n + e u r o v i n j e t t i i n + e u r o v i n j e t t i j ä r j e s t e l m ä + e u r o v i n j e t t i k e s k u s t e l u n + e u r o v i n j e t t i m i e t i n t ö + e u r o v i n j e t t i s t r a t e g i a l l a + e u r o v i n j e t t i s u o s i t u k s e t + e u r o v i r k a m i e s t e n + e u r o v y ö h y k k e e l l ä + e u r o v y ö h y k k e e n + e u r o v y ö h y k k e e s e e n + e u r o v y ö h y k k e e s s ä + e u r o v ä l i m e r e n + e u r o v ä l i m e r i + e u r o v ä l i m e r i k u m p p a n u u s j ä r j e s t e l y l l ä + e u r o v ä l i m e r i p o l i t i i k k a + e u r o v ä ä r e n n ö k s i k s i + e u r o y h t e e n s o p i v a + e u r o y h t e i s t y ö s s ä + e u r o y s t ä v ä l l i s i k s i + e u r o ä ä n i o i k e u d e n + e u t a n a s i a a + e u t a n a s i a k y s y m y s t ä + e u t a n a s i a l a i t + e u t a n a s i a l a k i + e u t a n a s i a s t a + e v a k u o i d a k s e e n + e v a k u o i m a a n + e v a k u o i n t i h a r j o i t u k s e n + e v a k u o i n t i h a r j o i t u s + e v a k u o i n t i p r o s e s s i n + e v a k u o i n t i s u u n n i t e l m i a + e v a k u o i n t i s u u n n i t e l m i i n + e v a k u o i n t i s u u n n i t e l m i s t a + e v a k u o i n t i t o i m e n p i t e i s i i n + e v a k u o i n t i t o i m i a + e v a k u o i t a v a + e v a k u o i t u j e n + e v a l u a a t i o s s a + e v a n k e l i s k r i s t i t t y n ä + e v a n k e l i s l u t e r i l a i n e n + e v a n k e l i u m i e n + e v a n k e l i u m i n + e v e r s t i l u u t n a n t t i + e v e r s t i l u u t n a n t t i n a + e v i e n + e v o l u u t i o a l g o r i t m i + e v o l u u t i o l a s k e n t a + e v o l u u t i o l a u s e k k e i s t a + e v o l u u t i o n + e v o l u u t i o n ä k e m y s + e v o l u u t i o p s y k o l o g i a + e v o l u u t i o p u u + e v o l u u t i o t e o r i a + e v o l u u t i o t e o r i a n + e v o l u u t i o v ä i t t e l y + e v ä p y y n n i n + e v ä p y y n t i + e v ä p y y n t i ä + e v ä t + e v ä t e s s ä ä n + e v ä t t i i n + e v ä t ä + e v ä t ä ä n + e x m o o r i n p o n i + e x p r e s s i n + f a a r a o k o i r a + f a a r a o m u u r a h a i n e n + f a a s i d i a g r a m m i + f a a s i m u u t o s + f a a s i n s i i r t o k a t a l y y s i + f a g o t t i k o n s e r t t o + f a k s e i h i n + f a k s e i s t a + f a k s i l a i t e t t a n i + f a k s i l a i t t e e t + f a k s i n + f a k s i n u m e r o + f a k t a s t a + f a k t a t i e t o a + f a k t a t i e t o j a + f a k t o j a + f a k t o r i a n a l y y s i + f a n a a t i k o i k s i + f a n a a t t i s i m m a t + f a n a a t t i s i n + f a n a a t t i s t e n + f a n a a t t i s u u s k u l t t u u r i s t a + f a n i f i k t i o + f a n i k e r h o + f a n i p a l v e l u + f a n i t a i d e + f a n t a s i a a + f a n t a s i a e l o k u v a + f a n t a s i a e l o k u v i s t a + f a n t a s i a k i r j a i l i j o i s t a + f a n t a s i a k i r j a l l i s u u s + f a n t a s i a m a a i l m a s s a + f a n t a s i a m a a i l m a s t a + f a n t a s i a r o m a a n e i s t a + f a n t a s i a t a i d e + f a n t a s t i s e n + f a r k k u a l a + f a r k k u h a m e + f a r k k u t u o m i o n + f a r k k u v a l l a n k u m o u s + f a r k k u v a l m i s t a j a + f a r k u t + f a r m a k o l o g i s i s s a + f a r m a s e u t t i s e s t a + f a r m a s e u t t i s i a + f a r m a s i a t e o l l i s u u s + f a r m a s i a t u o t t e i d e n + f a r m i j o u k k u e + f a r s s i k s i + f a r s s i n o m a i s e n + f a r s s i o i k e u d e n k ä y n n e i s s ä + f a r s s i o i k e u d e n k ä y n t i + f a r s s i v a a l i e n + f a s e t t i l u o k i t u s + f a s i s m i n + f a s i s m i n v a s t a i n e n + f a s i s m i n v a s t a i s e n + f a s i s m i n v a s t a i s u u s + f a s i s t i a i k a n a + f a s i s t i a j a t + f a s i s t i a r m e i j a n + f a s i s t i d i k t a t u u r i n + f a s i s t i h a l l i n n o i s t a + f a s i s t i h a l l i n n o n + f a s i s t i h a l l i n n o t + f a s i s t i h a l l i n t o + f a s i s t i h a l l i n t o a + f a s i s t i h a l l i n t o j e n + f a s i s t i j ä r j e s t ö j e n + f a s i s t i j ä s e n + f a s i s t i p u o l u e + f a s i s t i r i k o l l i s i l l e + f a s i s t i s i a + f a s i s t i s i n + f a t a l i s m i a + f e d e r a a t i o l l a + f e d e r a a t i o l l e + f e d e r a a t i o l t a + f e d e r a a t i o m a l l i a + f e d e r a a t i o n + f e d e r a a t i o n e u v o s t o + f e d e r a a t i o o n + f e d e r a a t i o p i i r i + f e d e r a a t i o s s a + f e d e r a a t i o s t a + f e d e r a a t i o t a + f e d e r a a t i o y l i o p i s t o + f e d e r a l i s m i a + f e d e r a l i s m i n + f e d e r a l i s o i n t i p r o s e s s i s s a + f e d e r a l i s t i e n + f e d e r a l i s t i k o l l e g o i h i n + f e d e r a l i s t i r y h m i e n + f e d e r a l i s t i r y h m ä t + f e d e r a l i s t i s e m m a k s i + f e d e r a l i s t i s e m p a a + f e d e r a l i s t i s e m p i + f e d e r a l i s t i s e n + f e d e r a l i s t i s e s t i + f e d e r a l i s t i s i a + f e d e r a l i s t i s i m m a k s i + f e d e r a l i s t i s t a + f e d e r a l i s t i s t e n + f e d e r a l i s t i t + f e d e r a l i s t i y s t ä v i e m m e + f e m i n i s t i e n + f e m i n i s t i k i r j a i l i j a a + f e m i n i s t i l i i k k e i d e n + f e m i n i s t i t e o l o g i a + f e m i n i s t i y h d i s t y k s i l l e + f e m i n i s t i y h d i s t y s t e n + f e n o l i p u n a i n e n + f e n y y l i a s e t a a t t i + f e n y y l i e t i k k a h a p p o + f e n y y l i s a l i s y l a a t t i + f e o d a a l i h a l l i n n o s t a a n + f e o d a a l i h e r r a t + f e o d a a l i h e r r o j e n + f e o d a a l i j ä r j e s t e l m ä n + f e o d a a l i l a i s t a + f e o d a a l i o i k e u d e t + f e o d a a l i p e r i n t e i s t ä + f e o d a l i s m i n + f e r o m o n i p y y d y s + f e r r i i t t i r e n g a s m u i s t i + f e s t i v a a l i o r k e s t e r i + f e t a j u u s t o a + f e t a j u u s t o n + f e t a j u u s t o o n + f e t a j u u s t o s t a + f i b r o o s i a + f i d ž i l ä i s e t + f i d ž i l ä i s i ä + f i d ž i n + f i d ž i n h i n d i + f i d ž i n i n t i a l a i s e t + f i d ž i n l e g u a a n i + f i d ž i n l e p i n k ä i s m o n a r k k i + f i d ž i n l i n t u h a u k k a + f i d ž i n l u r i + f i d ž i n m o n a r k k i + f i d ž i n s i l k k i k e r t t u n e n + f i d ž i s a a r e t + f i d ž i s a a r i l l e + f i k t i o o n + f i k t i o t + f i k t i o t a + f i l h a r m o n i k o t + f i l i g r a a n i u l k o p o l i t i i k a s t a + f i l i p p i i n i l ä i s v a n k e j a + f i l m e j ä + f i l m i a i n e i s t o a + f i l m i d o s i m e t r i + f i l m i l l e + f i l m i n k e h i t y s + f i l m i n t e k i j ä + f i l m i o t o k s i a + f i l m i t e o l l i s u u s + f i l o s o f e j a + f i l o s o f i a a + f i l o s o f i a n + f i l o s o f i a n a + f i l o s o f i a t + f i l o s o f i k u n i n g a s + f i l o s o f i s e m p a a + f i l o s o f i s e m p i + f i l o s o f i s i a + f i l o s o f i s i i n + f i l o s o f i s t e n + f i n a n s s i a l a + f i n a n s s i a l a a + f i n a n s s i a l a a n + f i n a n s s i a l a l l e + f i n a n s s i a l a n + f i n a n s s i a l a s t a + f i n a n s s i a n a l y y t i k k o j e n + f i n a n s s i a r k k i t e h t u u r i + f i n a n s s i a r k k i t e h t u u r i a + f i n a n s s i a s i o i s t a + f i n a n s s i h a i d e n + f i n a n s s i j ä r j e s t e l m ä n + f i n a n s s i j ä r j e s t e l m ä ä + f i n a n s s i k a p i t a l i s m i n + f i n a n s s i k a p i t a l i s t i e n + f i n a n s s i k a u p p o i h i n + f i n a n s s i k e i n o t t e l u + f i n a n s s i k e i n o t t e l u n + f i n a n s s i k e i n o t t e l u t i l a n t e e n + f i n a n s s i k e s k u k s e t + f i n a n s s i k e s k u k s i a + f i n a n s s i k e s k u s + f i n a n s s i k e s k u s t a + f i n a n s s i k o n s e r n i e n + f i n a n s s i k o o r d i n o i n t i + f i n a n s s i k r i i s e i h i n + f i n a n s s i k r i i s i + f i n a n s s i k r i i s i i n + f i n a n s s i k r i i s i l l e + f i n a n s s i k r i i s i l l ä + f i n a n s s i k r i i s i n + f i n a n s s i k r i i s i s s ä + f i n a n s s i k r i i s i s t ä + f i n a n s s i k r i i s i ä + f i n a n s s i k u p l a a + f i n a n s s i k u p l a a n + f i n a n s s i k u p l a n + f i n a n s s i k u r i i n + f i n a n s s i k u r i l l a + f i n a n s s i l a i n s ä ä d ä n t ö p a k e t i n + f i n a n s s i l a i s s a + f i n a n s s i l a i t o s t e n + f i n a n s s i l a k i e n s a + f i n a n s s i m a r k k i n a t + f i n a n s s i m a r k k i n o i d e n + f i n a n s s i m a r k k i n o i l l a + f i n a n s s i m a r k k i n o i l l e + f i n a n s s i m a r k k i n o i s t a + f i n a n s s i m a r k k i n o i t a + f i n a n s s i m i n i s t e r e i d e n + f i n a n s s i n e r o j e n + f i n a n s s i n e u v o s t e n + f i n a n s s i p a l v e l u i d e n + f i n a n s s i p a l v e l u j e n + f i n a n s s i p a l v e l u t + f i n a n s s i p a s s i a + f i n a n s s i p e l e i s t ä + f i n a n s s i p o l i i t t i n e n + f i n a n s s i p o l i i t t i s e s t a + f i n a n s s i p o l i i t t i s e t + f i n a n s s i p o l i i t t i s i a + f i n a n s s i p o l i i t t i s i l l a + f i n a n s s i p o l i i t t i s i l t a + f i n a n s s i p o l i i t t i s i s t a + f i n a n s s i p o l i i t t i s t a + f i n a n s s i p o l i i t t i s t e n + f i n a n s s i p o l i t i i k a l l a + f i n a n s s i p o l i t i i k a l l e + f i n a n s s i p o l i t i i k a n + f i n a n s s i p o l i t i i k a s s a + f i n a n s s i p o l i t i i k a s t a + f i n a n s s i p o l i t i i k a t + f i n a n s s i p o l i t i i k k a + f i n a n s s i p o l i t i i k k a a + f i n a n s s i p o l i t i i k k a a m m e + f i n a n s s i p o l i t i i k k a a n + f i n a n s s i p o l i t i i k k a m m e + f i n a n s s i p o l i t i i k k a n a + f i n a n s s i p o l i t i i k k o i h i n + f i n a n s s i p o l i t i i k k o j a + f i n a n s s i p o l i t i i k k o j e n + f i n a n s s i p o l i t i i k o i l l a + f i n a n s s i p ä ä o m a n + f i n a n s s i r y h m i e n + f i n a n s s i r y h m i t t y m i e n + f i n a n s s i r y h m i t t y m i i n + f i n a n s s i r y h m i t t y m i l l e + f i n a n s s i r y h m i t t y m i ä + f i n a n s s i r y h m i t t y m ä t + f i n a n s s i r y h m i t t y m ä ä n + f i n a n s s i r y h m i ä + f i n a n s s i r y h m ä l l e + f i n a n s s i r y h m ä t + f i n a n s s i r y p p ä ä t + f i n a n s s i s e k t o r i l l a + f i n a n s s i s k a n d a a l i t + f i n a n s s i s ä ä t e l y ä + f i n a n s s i t a l o u d e n + f i n a n s s i t a l o u d e s t a + f i n a n s s i t i e t o a + f i n a n s s i t i l a n n e t t a + f i n a n s s i t o i m e n p i t e e n + f i n a n s s i t o i m i a + f i n a n s s i t o i m i n n a n + f i n a n s s i t r a n s a k t i o v e r o + f i n a n s s i t r a n s a k t i o v e r o a + f i n a n s s i t r a n s a k t i o v e r o j ä r j e s t e l m ä + f i n a n s s i t r a n s a k t i o v e r o s t a + f i n a n s s i t u o t e p a k e t t e i h i n + f i n a n s s i t u o t t e e t + f i n a n s s i v a k a u d e l l a + f i n a n s s i v a k a u t t a + f i n a n s s i v a l v o n n a n + f i n a n s s i v a l v o n t a + f i n a n s s i v a l v o n t a a + f i n a n s s i v a l v o n t a a n + f i n a n s s i v a l v o n t a p a k e t t i + f i n a n s s i v a l v o n t a v i r a n o m a i s e t + f i n a n s s i v a l v o n t a v i r a n o m a i s t e n + f i s s i i l i + f i s s i o n + f i s s i o o n + f i s s i o t u r v a l l i s u u t t a + f i s s i o t u t k i m u k s e n + f i s s i o y d i n v o i m a n + f l a a m i j ä s e n + f l a a m i k o l l e g a m m e + f l a a m i l a i s a l u e i l l e + f l a a m i l a i s e t + f l a a m i l a i s l i i k k e e n + f l a a m i l a i s l i i t t o + f l a a m i l a i s m i e l i n e n + f l a a m i l a i s p u o l u e + f l a a m i t + f l a m e n c o h u u m a a n + f l u n s s a p a n d e m i a s t a + f l u n s s a v i r u k s e n + f l u o r a t t u a + f l u o r a t t u j a + f l u o r a t t u j e n + f l u o r a t u i l l e + f l u o r a t u i l t a + f l u o r a t u i s t a + f l u o r a t u t + f l u o r i a n t i m o n i h a p p o + f l u o r i b o o r i h a p p o + f l u o r i d i m y r k y t y k s e l l e + f l u o r i e t i k k a h a p p o + f l u o r i h i i l i v e d y i l l ä + f l u o r i h i i l i v e t y j e n + f l u o r i k a a s u d i r e k t i i v i n + f l u o r i k a a s u j a + f l u o r i p i i h a p o l l a + f l u o r i p i i h a p o n + f l u o r i p i i h a p p o + f l u o r i r i k k i h a p p o + f l u o r i v e t y + f l u o r i v e t y h a p p o + f l u o r o o s i a + f l u o r o o s i s t a + f l y y g e l i ä + f l ä p p i t a u l u + f o i n i k i a n k a t a j a + f o l i a s t a + f o l i o h a t t u + f o l k p u n k + f o n i t + f o n o g r a f i s y l i n t e r i + f o n t a i n e + f o n t a i n e e n + f o n t a n k a + f o o l i h a p p o a + f o o r u m e i h i n + f o o r u m e i l l a + f o o r u m i a + f o o r u m i e n + f o o r u m i k o m i t e a n + f o o r u m i n + f o o r u m i n a + f o o r u m i s s a + f o o r u m i s t a + f o r e x + f o r i n t t e j a + f o s f a a t e i s s a + f o s f a a t e i s t a + f o s f a a t t e j a + f o s f a a t t i e s i i n t y m i ä + f o s f a a t t i e s t e r i t + f o s f a a t t i l a i n s ä ä d ä n n ö n + f o s f a a t t i p i t o i s t e n + f o s f a a t t i p i t o i s u u t t a + f o s f o e n o l i p a l o r y p ä l e h a p p o + f o s f o g l u k o n a a t t i + f o s f o h y d r o k s i p a l o r y p ä l e h a p p o + f o s f o r i h a p o k e + f o s f o r i h a p p o + f o s f o r i l a n n o i t t e e n + f o s f o r i l a n n o i t t e i s s a + f o s f o r i n + f o s f o r i o n g e l m a + f o s f o r i p e n t a f l u o r i d i + f o s f o r i p e n t a k l o r i d i n + f o s f o r i p e n t a s u l f i d i + f o s f o r i p e n t o k s i d i + f o s f o r i t r i b r o m i d i + f o s f o r i t r i f l u o r i d i + f o s f o r i t r i j o d i d i + f o s f o r i t r i k l o r i d i + f o s f o r i t r i o k s i d i + f o s f o r i y h d i s t e e t + f o s f o r i y h d i s t e i d e n + f o s f o r y l a a s i k i n a a s i + f o s f o s e r i i n i f o s f a t a a s i + f o s s i i l i e n e r g i a + f o s s i i l i e n e r g i a l l e + f o s s i i l i e n e r g i a n + f o s s i i l i e n e r g i a p a n o k s i a + f o s s i i l i k e n t t ä + f o s s i i l i p o l t t o a i n e t e o l l i s u u d e t + f o s s i i l i s e n + f o s s i i l i s e t + f o s s i i l i s i a + f o s s i i l i s i i n + f o s s i i l i s i l l a + f o s s i i l i s i l l e + f o s s i i l i s i n a + f o s s i i l i s i s t a + f o s s i i l i s t a + f o s s i i l i s t e n + f o s s i i l i v a i h t o e h t o i h i n + f o s s i i l i v a r a n n o t + f o s s i i l i v a r a n t o j a + f o s s i i l i v a r o j e n + f o t o l i t o g r a f i a p r o s e s s e i s s a + f o t o n i e p o o k k i + f o t o n i r a k e t t i + f o t o r e s e p t o r i + f o t o s y n t e e s i i n + f o t o s ä h k ö e n e r g i a a n + f o t o s ä h k ö s u u n n i t e l m i a + f o x i n + f o x s a a r e t + f r a a s i s t a + f r a k k i l e p i n k ä i n e n + f r a k t a a l i r u h t i n a s + f r a n g e i k s i + f r a n g i a + f r a n g i i n + f r a n g i l l a + f r a n g i n s a + f r a n s i s k a a n i k i r k k o + f r a n s i s k a a n i m u n k k i + f r e e l a n c e k ä ä n n ö k s e t + f r e e l a n c e t o i m i t t a j a + f r e e l a n c e t u l k e i l l e + f r e e s t y l e h i i h d o n + f r e e s t y l e h i i h t o + f r e e s t y l e r u l l a l u i s t e l u + f r e k v e n s s i a n a l y y s i + f r e o n i e n + f r i i k k i s i r k u s + f r i s b e e g o l f + f r y y g i a l a i s m y s s y + f t a l a a t e i s t a + f t a l a a t i t + f t a l a a t t e i h i n + f t a l a a t t e j a + f t a l a a t t i a s i a s s a + f t a l a a t t i e n + f t a l a a t t i m ä ä r i l l e + f t a l a a t t i m ä ä r ä t + f t a l a a t t i p e h m i t t i m i l l e + f u l b e t + f u n d a m e n t a l i s m i a + f u n d a m e n t a l i s m i k s i + f u n d a m e n t a l i s m i k y s y m y k s e n + f u n d a m e n t a l i s m i n + f u n d a m e n t a l i s m i s s a + f u n d a m e n t a l i s m i s t a + f u n d a m e n t a l i s m i t e r r o r i s m i a + f u n d a m e n t a l i s m i t y y p p i i n + f u n d a m e n t a l i s t e i l l e + f u n d a m e n t a l i s t i e n + f u n d a m e n t a l i s t i j ä r j e s t e l m ä k s i + f u n d a m e n t a l i s t i j ä r j e s t ö t + f u n d a m e n t a l i s t i l i i k e + f u n d a m e n t a l i s t i l i i k k e i t ä + f u n d a m e n t a l i s t i m i l j o n ä ä r i + f u n d a m e n t a l i s t i m m e + f u n d a m e n t a l i s t i m u s l i m i e n + f u n d a m e n t a l i s t i r a d i k a a l i e n + f u n d a m e n t a l i s t i r y h m i l l e + f u n d a m e n t a l i s t i r y h m i ä + f u n d a m e n t a l i s t i r y h m ä t + f u n d a m e n t a l i s t i s i a + f u n d a m e n t a l i s t i t + f u n d a m e n t a l i s t i t e r r o r i s m i + f u n d a m e n t a l i s t i t e r r o r i s m i n + f u n d a m e n t a l i s t i v e r k o s t o j e n + f u n k i n + f u n k t i o a v a r u u s + f u n k t i o n a a l i a n a l y y s i + f u n k t i o n a a l i y h t ä l ö + f u n k t i o t e o r i a + f u r f u r y y l i a l k o h o l i + f u t s a l i n + f u t u u r i k a u p p a + f u t u u r i k e i n o t t e l u + f u t u u r i m a r k k i n o i d e n + f u t u u r i m a r k k i n o i l l a + f u t u u r i p ö r s s i ä + f u t u u r i s o p i m u s t e n + f u u s i o a l a n + f u u s i o a s s o s i a a t i o i d e n + f u u s i o a s s o s i a a t i o t + f u u s i o b u d j e t t i i n + f u u s i o e n e r g i a a + f u u s i o e n e r g i a a n + f u u s i o e n e r g i a h a n k k e e l l e + f u u s i o e n e r g i a l l e + f u u s i o e n e r g i a n + f u u s i o e n e r g i a s s a + f u u s i o e n e r g i a s t a + f u u s i o h a n k k e e n + f u u s i o h a n k k e e s t a + f u u s i o i d e n + f u u s i o i l l a + f u u s i o i s t a + f u u s i o i t u m i s t a + f u u s i o j a z z + f u u s i o j ä r j e s t e l m ä n + f u u s i o k e h i t t ä m i s o h j e l m a + f u u s i o k e h i t y s s o p i m u k s e n + f u u s i o k o k o u k s e e n + f u u s i o l a i n s ä ä d ä n t ö ä + f u u s i o m a t e r i a a l e j a + f u u s i o m e n e t t e l y n + f u u s i o n e s t ä j ä t + f u u s i o n e u v o t t e l u i s s a + f u u s i o o n + f u u s i o p ä ä t ö k s i i n + f u u s i o p ä ä t ö k s i s s ä + f u u s i o r e a k t i o + f u u s i o r e a k t o r i + f u u s i o r e a k t o r i l l a + f u u s i o s o p i m u k s e s t a + f u u s i o t + f u u s i o t a + f u u s i o t o i m i e n + f u u s i o t r e n d i + f u u s i o t u t k i m u k s e l l e + f u u s i o t u t k i m u k s e n + f u u s i o t u t k i m u s + f u u s i o t u t k i m u s o r g a n i s a a t i o t + f u u s i o t u t k i m u s t a + f u u s i o v o i m a l a i t o k s e n + f u u s i o v o i m a l o i t a + f u u s i o y d i n v o i m a l a + f u u s i o y h t i ö + f y s i i k a n + f y s i k a a l i s e n + f y s i k a a l i s e s t a + f y s i k a a l i s e t + f y s i k a a l i s i a + f y s i k a a l i s i l l e + f y s i k a a l i s i s t a + f y s i k a a l i s t a + f y s i k a a l i s t e n + f y y s i k o i t a + f y y s i s e e n + f y y s i s e n + f y y s i s e s t ä + f y y s i s e t + f y y s i s i k s i + f y y s i s i l l e + f y y s i s i s t ä + f y y s i s i ä + f y y s i s t e n + f y y s i s t ä + f ö h n t u u l i + g a e l i n k i e l i n e n + g a l a k s i j o u k k o + g a l a k s i j o u k o i s t a + g a l a k s i m u u r i + g a l a k s i p a r i + g a l a k s i r y h m ä + g a l i c i a l a i s e t + g a l i c i a l a i s i l l a + g a l i c i a l a i s i l l e + g a l i c i a l a i s t e n + g a l i c i a l l e + g a l i c i a s s a + g a l l e r i a m e t s ä + g a l l i u m a r s e n i d i + g a l l i u m f o s f i d i + g a l l u p t u t k i m u k s e n + g a m b i i t e i s t a + g a m m a b u t y r o l a k t o n i + g a m m a f u n k t i o + g a m m a k o r j a u s + g a m m a l i n o l e e n i h a p p o + g a m m a m o t o n e u r o n i + g a m m a p u r k a u s + g a m m a s ä t e i l y + g a m m a t ä h t i t i e d e + g a m m a y ö k k ö n e n + g a n g e s i n d e l f i i n i + g a n g e s i n h a i + g a n g e s i n k o r p p i k o t k a + g a n g l i o s o l u + g a n g s t e r i k u n i n g a s + g a n g s t e r i s o t a + g a n g s t e r i v a l t i o + g a r i t a + g a s e l l i k o t k a + g a s e l l i y r i t y k s i ä + g e e n e i h i n + g e e n e i s t ä + g e e n e j ä + g e e n i d o p i n g + g e e n i e l i n t a r v i k e + g e e n i e l i n t a r v i k e s a t o j e n + g e e n i e l i n t a r v i k k e i t a + g e e n i e n + g e e n i h o i d o n + g e e n i h o i d o t + g e e n i h o i t o + g e e n i h o i t o a + g e e n i h o i t o i h i n + g e e n i j ä l j e n n ö k s e n + g e e n i k a n t a + g e e n i k a r t t a + g e e n i k e s k e i n e n + g e e n i k e t j u n + g e e n i k i r j a s t o + g e e n i k l u s t e r i + g e e n i k o o d i s t o o n + g e e n i k ä s i t t e l y j ä + g e e n i k ä s i t t e l y s t ä + g e e n i m a i s s i + g e e n i m a i s s i a + g e e n i m a i s s i n + g e e n i m a n i p u l a a t i o + g e e n i m a n i p u l a a t i o i d e n + g e e n i m a n i p u l a a t i o l o b b a a j a t + g e e n i m a n i p u l a a t i o l o b b a a j i l l e + g e e n i m a n i p u l a a t i o n + g e e n i m a n i p u l a a t i o n s a + g e e n i m a n i p u l a a t i o o n + g e e n i m a n i p u l a a t i o p r o s e s s i a + g e e n i m a n i p u l a a t i o t + g e e n i m a n i p u l o i n n i s t a + g e e n i m a n i p u l o i n t i + g e e n i m a t e r i a a l i a + g e e n i m e r k k i + g e e n i m o n o p o l i + g e e n i m u o k a t t u j e n + g e e n i m u t a a t i o i d e n + g e e n i m u u n n e l l u i l l e + g e e n i m u u n n e l l u i s t a + g e e n i m u u n n e l l u l l a + g e e n i m u u n n e l l u n + g e e n i m u u n n e l l u t + g e e n i m u u n n e l t u a + g e e n i m u u n n e l t u j a + g e e n i m u u n n e l t u j e n + g e e n i m u u n n e t t u i h i n + g e e n i m u u n n e t t u j a + g e e n i m u u n n e t t u j e n + g e e n i m u u n n e t u n + g e e n i m u u n n e t u t + g e e n i m u u n t a m i n e n + g e e n i m u u n t e l u + g e e n i m u u n t e l u a + g e e n i m u u n t e l u a l a n + g e e n i m u u n t e l u m e r k i n n ö i l l ä + g e e n i m u u n t e l u m e r k i n t ä + g e e n i m u u n t e l u n + g e e n i m u u n t e l u p r o s e s s i t + g e e n i m u u n t e l u t e k n i i k a l l e + g e e n i m u u n t e l u t e o l l i s u u s + g e e n i m u u n t e l u u n + g e e n i m y r k k y j ä + g e e n i n + g e e n i n s i i r t o + g e e n i p a n k e i s t a + g e e n i p a n k i t + g e e n i p a n k k e j a + g e e n i p a n k k i + g e e n i p a n k k i e n + g e e n i p a t e n t t i a + g e e n i p a t e n t t i e n + g e e n i p e r i m ä + g e e n i p e r i m ä l l e + g e e n i p e r i m ä n + g e e n i p e r i m ä s t ä + g e e n i p e r i m ä t + g e e n i p e r i m ä t i e t o i h i n + g e e n i p e r i m ä ä + g e e n i p e r i m ä ä n + g e e n i p e r i n t ö ö n + g e e n i p o o l e i s t a + g e e n i p o o l i + g e e n i p o o l i a + g e e n i p r o f i l o i n n i n + g e e n i p y s s y + g e e n i r u o k a a + g e e n i r u o k a h a n + g e e n i r u o k i a + g e e n i s a r j a + g e e n i s e k v e n s s e j ä + g e e n i s e k v e n s s i e n + g e e n i s e k v e n s s i s t ä + g e e n i s e k v e n s s i t + g e e n i s e u l o n t a + g e e n i s i i r r o n + g e e n i s i i r t o + g e e n i s i i r t o a + g e e n i s o i j a + g e e n i s t ö ä + g e e n i s t ö ö n + g e e n i s u k u t u t k i m u s + g e e n i t a s a p a i n o a + g e e n i t e k n i i k a l l a + g e e n i t e k n i i k a l l e + g e e n i t e k n i i k a n + g e e n i t e k n i i k a s t a + g e e n i t e k n i i k k a + g e e n i t e k n i i k k a a + g e e n i t e k n i i k k a a n + g e e n i t e k n i i k k a l a k i + g e e n i t e k n i i k k a t e o l l i s u u d e l l e + g e e n i t e k n i i k k a t e o l l i s u u d e n + g e e n i t e k n i i k k a t e o l l i s u u t t a + g e e n i t e k n i i k o i d e n + g e e n i t e k n i k o t + g e e n i t e k n i n e n + g e e n i t e k n i s e s t ä + g e e n i t e k n i s e t + g e e n i t e k n i s i ä + g e e n i t e k n i s t e n + g e e n i t e k n i s t ä + g e e n i t e k n o l o g i a + g e e n i t e k n o l o g i a a + g e e n i t e k n o l o g i a a n + g e e n i t e k n o l o g i a l l a + g e e n i t e k n o l o g i a l l e + g e e n i t e k n o l o g i a n + g e e n i t e k n o l o g i a s s a + g e e n i t e k n o l o g i a s t a + g e e n i t e k n o l o g i a t e o l l i s u u d e n + g e e n i t e k n o l o g i a t e o l l i s u u s + g e e n i t e k n o l o g i a t e o l l i s u u t t a + g e e n i t e k n o l o g i o i d e n + g e e n i t e k n o l o g i s e s t i + g e e n i t e o l l i s u u d e n + g e e n i t e o l l i s u u s + g e e n i t e r a p i a + g e e n i t e r a p i a a n + g e e n i t e r a p i a n + g e e n i t e r a p i a s t a + g e e n i t e s t e i s t ä + g e e n i t e s t e j ä + g e e n i t e s t i e n + g e e n i t i e d e + g e e n i t i e t e e n + g e e n i t o m a a t t e j a + g e e n i t u o t t e i d e n + g e e n i t u t k i m u k s e e n + g e e n i t u t k i m u k s e l l e + g e e n i t u t k i m u k s e n + g e e n i t u t k i m u k s e s s a + g e e n i t u t k i m u s + g e e n i t u t k i m u s t a + g e e n i v a r a n t o + g e e n i v a r a n t o a + g e e n i v a r a s t o j a + g e e n i v a r o j a + g e e n i v a r o j e n + g e e n i v a u r i o i t a + g e e n i v i r h e + g e e n i v i r h e e s t ä + g e e n i v i r h e e t + g e e n i v i r r a n + g e e n i v i r t a + g e e n i y h t i ö i d e n + g e l a t i i n i p ä ä t ö k s e e n + g e l a t i i n i t y y p p i + g e n e e r i s i s t ä + g e n e e r i s i ä + g e n e e r i s t e n + g e n e e t t i s e l l e + g e n e e t t i s e l l ä + g e n e e t t i s e n + g e n e e t t i s e s t ä + g e n e e t t i s i s t ä + g e n e e t t i s i ä + g e n e e t t i s t e n + g e n e e t t i s t ä + g e n e t i i k a s t a + g e n e t i i k k a a + g e n e t i i k k a a n + g e n i t a a l i l ä v i s t y s + g e n i t a a l i v a i h e + g e n o m i i k a s t a + g e n o m i n + g e n o m i t u t k i m u k s e e n + g e n o m i t u t k i m u k s e n + g e n o m i t u t k i m u s t a + g e o m e t r i a a + g e o m e t r i a a n + g e o m e t r i a k s i + g e o m e t r i a l t a a n + g e o m e t r i a n + g e o p o l i i t t i s e l t a + g e o p o l i i t t i s e n + g e o p o l i i t t i s e n a + g e o p o l i i t t i s e t + g e o p o l i i t t i s i a + g e o p o l i i t t i s i l l a + g e o p o l i i t t i s i n + g e o p o l i i t t i s t a + g e o p o l i i t t i s t e n + g e o p o l i t i i k a n + g e o r g i a a + g e o r g i a a n + g e o r g i a k i n + g e o r g i a l a i s a l u e i d e n + g e o r g i a l a i s e t + g e o r g i a l a i s i l l a + g e o r g i a l a i s t e n + g e o r g i a l a i s t u o t t e i d e n + g e o r g i a l l e + g e o r g i a n + g e o r g i a n j u u t a l a i s e t + g e o r g i a n s a l m i + g e o r g i a n v u o r i s t o k o i r a + g e o r g i a s s a + g e o r g i a s t a + g e o s t a t i o n a a r i s e l l a + g e o s t a t i o n a a r i s e n + g e o s t r a t e g i s e n + g e o s t r a t e g i s e n a + g e o s t r a t e g i s e s t a + g e o s t r a t e g i s e s t i + g e o s t r a t e g i s e t + g e o s t r a t e g i s i s t a + g e o t e r m i s e n + g e o t e r m i s e t + g e o t i e t e e t + g e r m a a n i t + g e s t a p o n + g e t t o j a + g e t t o u t u m i s i l m i ö + g e t t o u t u n e e n + g i b r a l t a r i l a i s e t k i n + g i l j o t i i n i l a u s e k e + g i l j o t i i n i l a u s e k e t t a + g i l j o t i i n i l a u s e k k e e k s i + g i l j o t i i n i l a u s e k k e e s t a + g i l j o t i i n i l ä h e s t y m i s t a p a a + g i n i m e r k i n t ä + g i n i r o m m i + g i r o n a + g i r o n d e + g l a s n o s t i s t a + g l a u k o o m a s u n t t i + g l o b a a l e i k s i + g l o b a a l e i s s a + g l o b a a l e i s t a + g l o b a a l e j a + g l o b a a l i a + g l o b a a l i e n + g l o b a a l i i n + g l o b a a l i l a i n o i n + g l o b a a l i l a i n o i n a + g l o b a a l i l a i n o i s t a + g l o b a a l i l a i n o j a + g l o b a a l i l a i n o j e n + g l o b a a l i l a i n o j e n s a + g l o b a a l i l l a + g l o b a a l i m m a n + g l o b a a l i m m a s t a + g l o b a a l i m m i n + g l o b a a l i m p i + g l o b a a l i m p i a + g l o b a a l i n + g l o b a a l i n a + g l o b a a l i s s a + g l o b a a l i s t u m i n e n + g l o b a a l i s t u m i s e n + g l o b a a l i s t u m i s k e h i t y k s e e n + g l o b a a l i s t u m i s k e h i t y k s e n + g l o b a a l i s t u m i s k e h i t y k s e s s ä + g l o b a a l i s t u m i s k e h i t y s t ä + g l o b a a l i s t u m i s m a l l i a + g l o b a a l i s t u m i s p a i n e e t + g l o b a a l i s t u m i s p r o s e s s i i n + g l o b a a l i s t u m i s p r o s e s s i s s a + g l o b a a l i s t u m i s t a + g l o b a a l i s t u n e e m m a n + g l o b a a l i s t u n e e m m a s s a + g l o b a a l i s t u n e e m p i + g l o b a a l i s t u n e e s s a + g l o b a a l i s t u n u t + g l o b a a l i s t u v i l l a + g l o b a a l i t + g l o b a l i s a a t i o h a a s t e e s e e n + g l o b a l i s a a t i o h i n t o j a + g l o b a l i s a a t i o i l m i ö n + g l o b a l i s a a t i o i l m i ö s t ä + g l o b a l i s a a t i o j u l k i l a u s u m a n + g l o b a l i s a a t i o k e h i t y k s e e n + g l o b a l i s a a t i o k e h i t y k s e n + g l o b a l i s a a t i o k e h i t y k s e s s ä + g l o b a l i s a a t i o k e h i t y s + g l o b a l i s a a t i o k e h i t y s t ä + g l o b a l i s a a t i o k e h y k s e s s ä + g l o b a l i s a a t i o k e s k u s t e l u a + g l o b a l i s a a t i o k e s k u s t e l u n + g l o b a l i s a a t i o k i l p a i l u s t a + g l o b a l i s a a t i o k y s y m y s + g l o b a l i s a a t i o l l a + g l o b a l i s a a t i o l t a + g l o b a l i s a a t i o m a l l i + g l o b a l i s a a t i o m a l l i a + g l o b a l i s a a t i o m a l l i n + g l o b a l i s a a t i o n + g l o b a l i s a a t i o n v a s t a i s e n + g l o b a l i s a a t i o n ä k e m y k s e n + g l o b a l i s a a t i o o n + g l o b a l i s a a t i o p e l i n + g l o b a l i s a a t i o p o l i t i i k a s s a + g l o b a l i s a a t i o p r o s e s s e i s t a + g l o b a l i s a a t i o p r o s e s s e j a + g l o b a l i s a a t i o p r o s e s s i + g l o b a l i s a a t i o p r o s e s s i a + g l o b a l i s a a t i o p r o s e s s i i n + g l o b a l i s a a t i o p r o s e s s i n + g l o b a l i s a a t i o p r o s e s s i s s a + g l o b a l i s a a t i o p r o s e s s i s t a + g l o b a l i s a a t i o p r o s e s s i t + g l o b a l i s a a t i o r a h a s t o + g l o b a l i s a a t i o r a h a s t o a + g l o b a l i s a a t i o r a h a s t o k s i + g l o b a l i s a a t i o r a h a s t o l l a + g l o b a l i s a a t i o r a h a s t o l l a a n + g l o b a l i s a a t i o r a h a s t o l l e + g l o b a l i s a a t i o r a h a s t o n + g l o b a l i s a a t i o r a h a s t o o n + g l o b a l i s a a t i o r a h a s t o s s a + g l o b a l i s a a t i o r a h a s t o s t a + g l o b a l i s a a t i o r a h a s t o t + g l o b a l i s a a t i o r a h a t o n + g l o b a l i s a a t i o s k e n a a r i o t a + g l o b a l i s a a t i o s s a + g l o b a l i s a a t i o s t a + g l o b a l i s a a t i o s t r a t e g i a a + g l o b a l i s a a t i o s t r a t e g i a n s a + g l o b a l i s a a t i o s u u n t a u k s e t + g l o b a l i s a a t i o t a + g l o b a l i s a a t i o t y ö r y h m ä n + g l o b a l i s a a t i o v a i h e e l l e + g l o b a l i s a a t i o v i i d a k k o a + g l o b a l i s a a t i o v o i m i e n + g l o b a l i s o i t u m i s e l l e + g l o b a l i s o i t u m i s e s t a + g l o b a l i s o i t u m i s p r o s e s s i + g l o b a l i s o i t u m i s p r o s e s s i a + g l o b a l i s o i t u m i s p r o s e s s i t + g l o b a l i s o i t u n e e n + g l o b a l i s o i t u n e e s s a + g l o b a l i s o i t u n e i l l e + g l o b a l i s o i t u u + g l o b a l i s o i t u v a s s a + g l u k o o s i s i i r a p p e j a + g l u k o o s i s i i r a p p i + g l u k o o s i s i i r a p p i a + g l u o n i p l a s m a + g l u t e e n i a + g l u t e e n i t o n t a + g l y k o g e e n i f o s f o r y l a a s i + g l y k o l i h a p p o + g l y k o s i d i s i d o s + g l y s e r i i n i h a p p o + g o l f a u t o + g o l f i s s a + g o l f k e n t i l l ä + g o l f k e n t t i e n + g o l f k e n t t i ä + g o l f k e n t t i ä k ö + g o l f k e n t t ä ä + g o l f k e n t ä n + g o l f k e n t ä t + g o l f k e r h o + g o l f k e r h o i h i n + g o l f k e r h o i l l e + g o l f k e r h o j e n + g o l f k e r h o k y s y m y s + g o l f k e r h o t + g o l f k l u b e i h i n + g o l f k u r s s i l l a + g o l f m a a j o u k k u e e s s a + g o l f r a d a n o m i s t a j a t + g o l f r a t a + g o l f r a t o j a + g o l f v i r t a + g o l f v i r t a a + g o n d i t + g o n d o l i h i s s i + g o n g i i n + g o n g i n + g o o d w i l l i n + g o o t t i k u l t t u u r i + g o o t t i m e t a l l i + g o o t t i r o c k + g o o t t i s o t a + g o r i l l a l a j i t + g o u d i n + g r a a f i t e o r i a + g r a d u a a t i o j ä r j e s t e l m ä l l ä + g r a d u a a t i o j ä r j e s t e l m ä n + g r a d u a a t i o k y n n y k s i s t ä + g r a f f i t i s a n a s t o + g r a f i i k k a o h j e l m i s t a + g r a f i i k k a p i i r e i s t ä + g r a f i i k k a p r o s e s s o r i + g r a h a m i n m a a + g r a h a m i n s a a r i + g r a h a m j a u h o + g r a m m a a + g r a m m a l t a + g r a m m a s s a + g r a n a a t t i k u r k k u k o l i b r i + g r a n a a t t i o m e n a h a p p o + g r a n a a t t i o m e n a m e h u + g r a n a a t t i o m e n a t a r h o j a + g r a v i t a a t i o a a l t o t a u s t a + g r a v i t a a t i o l i n s s i + g r a v i t a a t i o s ä t e i l y + g r a v i t a a t i o t e o r i a + g r a v i t a a t i o v a k i o + g r e i p p i m e h u + g r o g i l a s i + g r o t e s k i k s i + g r ö n l a n n i n + g r ö n l a n n i n h y l j e + g r ö n l a n n i n h y l j e t t ä + g r ö n l a n n i n k o i r a + g r ö n l a n n i n l o k k i + g r ö n l a n n i n m e r i + g r ö n l a n n i n p a l l a s + g r ö n l a n n i n p a l l a s t a + g r ö n l a n n i n v a l a s + g r ö n l a n n i s t a + g r ö n l a n t i a + g u a n o m e r i m e t s o + g u a n o s i i n i d i f o s f a a t t i + g u a n o s i i n i m o n o f o s f a a t t i + g u a n o s i i n i t r i f o s f a a t t i + g u a t e m a l a l a i s t e n + g u i n e a l a i s e t + g u i n e a l a i s i l l e + g u i n e a l a i s v a l t u u s k u n n a l l e + g u i n e a l l e + g u i n e a n + g u i n e a n h u i s k u l e p i n k ä i n e n + g u i n e a n k u h a n k e i t t ä j ä + g u i n e a n l a h d e l l a + g u i n e a n l a h d e n + g u i n e a n l a h t i + g u i n e a n l e p i n k ä i n e n + g u i n e a n l i n t u h a u k k a + g u i n e a n l o i s t o k o t t a r a i n e n + g u i n e a n m e t s ä k e r t t u n e n + g u i n e a n r u o s t e g u e r e t s a + g u i n e a n s u k a s n o k k a + g u i n e a n s u o m u h ä n t ä o r a v a + g u i n e a n t ä p l ä t i k k a + g u i n e a s s a + g u l a s s i a + g u l a s s i k o m m u n i s m i + h a a k s i r i k k o h u i j a u s + h a a k s i r i k k o i s e t + h a a k s i r i k k o j e n + h a a k s i r i k k o u t u n e e t + h a a k s i r i k o i s t a + h a a m u a r t i k l a + h a a m u h a n k k e i k s i + h a a m u h i s s i + h a a m u j e n g i + h a a m u j ä s e n i s t ä + h a a m u k a l a s t u k s e e n + h a a m u k a l a s t u k s e n + h a a m u k a l a s t u k s e s t a + h a a m u k a l a s t u s t a + h a a m u k e s k u s t e l u a + h a a m u k e s k u s t e l u n + h a a m u k e s k u s t e l u s t a + h a a m u l a p s i a + h a a m u l i n t u h a u k k a + h a a m u m a i l i + h a a m u m o r s i a n + h a a m u p u h e e n j o h t a j a + h a a m u t + h a a m u v a n k e j a + h a a m u v a n k i e n + h a a m u v e r k k o j a + h a a m u v i i n i t i l a t + h a a m u y r i t y k s i ä + h a a m u y r i t y s t e n + h a a p a k i i t ä j ä + h a a p a n i r k k o + h a a p a n o r s u + h a a p a p e r h o n e n + h a a p a t y t t ö p e r h o n e n + h a a p a v a l m u s k a + h a a r a h a u k k a + h a a r a h e l t t a + h a a r a k o n t t o r e i d e n + h a a r a k o n t t o r e i t a + h a a r a k o n t t o r i + h a a r a k o n t t o r i a + h a a r a k o n t t o r i t + h a a r a n e i t o k a l a + h a a r a o r g a n i s a a t i o i d e n + h a a r a o r g a n i s a a t i o i k s i + h a a r a p ä ä s k y + h a a r u k k a a n + h a a r u k k a h a p e r o + h a a r u k k a m a k i + h a a r u k k a p u u y ö k k ö n e n + h a a r u k k a t r u k k i + h a a r u k k a v a u n u + h a a s k a l i n n u t + h a a s k a l i n t u j e n + h a a s k a l i n t u l a j e j a + h a a s k a l i n t u l a j i e n + h a a s k a t a + h a a s k a u s t a + h a a s t a a + h a a s t a j a k i e r t u e + h a a s t a k a a m m e + h a a s t a n k i n + h a a s t a n u t + h a a s t a t e l l u i s t a + h a a s t a t t e l u i h i n + h a a s t a t t e l u s s a + h a a s t a t t e l u t u t k i m u k s i s s a + h a a s t a t t e l u t u t k i m u s t a + h a a s t a v a a + h a a s t a v a l l e + h a a s t a v a m m i k s i + h a a s t a v a m p a a + h a a s t a v a m p a a n + h a a s t a v a m p i + h a a s t a v a m p i a + h a a s t a v i a + h a a s t a v i m m a n + h a a s t a v i m m a t + h a a s t a v i m m i s t a + h a a s t a v i m p i a + h a a s t a v i n + h a a s t a v i n a + h a a s t e e k s i + h a a s t e e l l i s e m p a a + h a a s t e e l l i s e n a + h a a s t e e l l i s e s s a + h a a s t e e l l i s i n + h a a s t e e l l i s t a + h a a s t e e m m e + h a a s t e e n + h a a s t e e n a + h a a s t e e n a m m e + h a a s t e e s e e m m e + h a a s t e e s e e n + h a a s t e e s t a + h a a s t e e s t a a n + h a a s t e e t + h a a s t e e t k i n + h a a s t e i d e n + h a a s t e i d e n s a + h a a s t e i l l e + h a a s t e i s i i n + h a a s t e i s s a + h a a s t e i s t a + h a a s t e i s t a m m e + h a a s t e i t a + h a a s t e i t a m m e + h a a s t e t t a + h a a v a a n + h a a v a k o t i n g a + h a a v a l l e + h a a v a n k e l t a j ä k ä l ä + h a a v a n l a s i s i i p i + h a a v a n l e h t i k u o r i a i n e n + h a a v a n t u h o o j a + h a a v a t + h a a v a t y r a n n i + h a a v a u m i a + h a a v a y r t t i + h a a v e a s i a k i r j a s s a + h a a v e e k s i + h a a v e e n a n i + h a a v e e n i + h a a v e i l e v a t + h a a v e i l e v i e n + h a a v e i l i j a n a + h a a v e i l l a + h a a v e i s t a a n + h a a v e k u v a + h a a v e k u v a n a + h a a v e m a a i l m a s s a + h a a v e t t a + h a a v i s t o l l a + h a a v o i s s a + h a a v o i t t a v a a + h a a v o i t t u i + h a a v o i t t u m i s m e r k k i + h a a v o i t t u n e i s t a + h a a v o i t t u n e i t a + h a a v o i t t u v a a + h a a v o i t t u v a i s e m m a t + h a a v o i t t u v a i s e m p i a + h a a v o i t t u v a i s e t + h a a v o i t t u v a i s i m m a t + h a a v o i t t u v a i s i m p i a + h a a v o i t t u v a i s i m p i e n + h a a v o i t t u v a i s i m p i i n + h a a v o i t t u v a m m a k s i + h a a v o i t t u v a m m a n + h a a v o i t t u v a m m a s s a + h a a v o i t t u v a m m i l l e + h a a v o i t t u v a m p i + h a a v o i t t u v a m p i a + h a a v o i t t u v a m p i e n + h a a v o i t t u v a m p i i n + h a a v o i t t u v a n + h a a v o i t t u v a n a + h a a v o i t t u v a s s a + h a a v o i t t u v a t + h a a v o i t t u v i a + h a a v o i t t u v i e n + h a a v o i t t u v i i n + h a a v o i t t u v i m m a n + h a a v o i t t u v i m m a s s a + h a a v o i t t u v i m m a t + h a a v o i t t u v i m m i l l a a n + h a a v o i t t u v i m m i l l e + h a a v o i t t u v i m m i s s a + h a a v o i t t u v i m m i s t a + h a a v o i t t u v i m p a a n + h a a v o i t t u v i m p i a + h a a v o i t t u v i m p i e n + h a a v o i t t u v i m p i i n + h a a v o i t t u v i n + h a a v o i t t u v i n t a + h a a v o i t t u v i s t a + h a a v o i t t u v u u s k y s y m y k s e t + h a a v o i t t u v u u s p e r u s t e i d e n + h a a v o i t t u v u u t t a + h a a v o j a + h a a v o j e n + h a b i t a a t t i d i r e k t i i v i + h a d r o n i e p o o k k i + h a e t a a n + h a e t t a e s s a + h a e t t a v a + h a e t u l t a + h a h m o i s t a + h a h m o n t u n n i s t u s + h a h m o p s y k o l o g i a + h a h m o t e l l a + h a h m o t e l l a a n + h a h m o t e l l e s s a a n + h a h m o t e l l u t + h a h m o t e l m a n + h a h m o t e l t a e s s a + h a h m o t e l t i i n + h a h m o t e t t a v a + h a h m o t t a m i s e k s i + h a h m o t t e l e e + h a h m o t t e l u u n + h a h m o t t u a + h a h m o t t u m a s s a + h a h m o t t u u + h a h m o t t u v a s s a + h a h m o t u s k e i n o + h a h t u v a p i l v i + h a i b a r b i + h a i d a t + h a i d e r + h a i h a t t e l i j a k s i + h a i h t u m i s i m u + h a i h t u n e e n + h a i h t u v i i n + h a i h t u v i s t a + h a i h t u v u u d e n + h a i h t u v u u s a r v o n + h a i h t u v u u s o n g e l m a n + h a i h t u v u u s r a j a a + h a i j ä r v e l l ä + h a i k a i l e v a t + h a i k e a n a + h a i l a j e i h i n + h a i l a j e i s t a + h a i l a j i s t a + h a i l t a + h a i m a n s i i r t o + h a i m a s a a r e k e + h a i m a s y ö p ä + h a i m o n n i t + h a i n e v i e n + h a i n e v i l l e + h a i n e v i ä + h a i n e v ä k e i t t o m a r k k i n o i t a + h a i n p y y n t i + h a i n p y y n t i ä + h a i s a a l i i d e n + h a i s a a l i i s e e n + h a i s a a l i i t a + h a i s e e + h a i s e v a i s i + h a i s k a h t a a + h a i s k a h t a v a t + h a i s u a p i n a + h a i s u h a p e r o + h a i s u h e r k k u s i e n i + h a i s u h i l l e r i + h a i s u k u r j e n p o l v i + h a i s u n ä ä t ä + h a i s u s a u r a m o + h a i s u s a v i k k a + h a i s u s e i t i k k i + h a i s u s i e n i + h a i t a k s i + h a i t a l l i s e k s i + h a i t a l l i s e l t a + h a i t a l l i s e m m a l t a + h a i t a l l i s e m m a t + h a i t a l l i s e m m i n + h a i t a l l i s e m p a a + h a i t a l l i s e m p i + h a i t a l l i s e m p i a + h a i t a l l i s e n + h a i t a l l i s e s t a + h a i t a l l i s e t + h a i t a l l i s i a + h a i t a l l i s i k s i + h a i t a l l i s i l t a + h a i t a l l i s i m m a t + h a i t a l l i s i m m i s t a + h a i t a l l i s i m p i a + h a i t a l l i s i n + h a i t a l l i s t a + h a i t a l l i s t e n + h a i t a l l i s u u d e s t a + h a i t a l l i s u u s p r o f i i l i n + h a i t a n + h a i t a n r a j o i t u s p o l i t i i k a n + h a i t a t + h a i t a t a + h a i t a t o n t a + h a i t i a + h a i t i l a i s e t + h a i t i l a i s i a + h a i t i l a i s i i n + h a i t i l a i s i l l a + h a i t i l a i s i l l e + h a i t i l a i s t e n + h a i t i l l a + h a i t i l l e + h a i t i n + h a i t i n a m a t s o n i + h a i t i n a r a + h a i t i n a r a t t i + h a i t i n h i i r i h a u k k a + h a i t i n k e r t t u l i + h a i t i n r a s t a s + h a i t i n s m a r a g d i k o l i b r i + h a i t i n t a n g a r a + h a i t i n t o r n i p ö l l ö + h a i t i n t r o g o n i + h a i t i n v a r i s + h a i t i n v i h e r k e r t t u l i + h a i t i s s a + h a i t i s t a + h a i t o i s t a + h a i t t a a m a t t a + h a i t t a a v a t + h a i t t a a v i e n + h a i t t a e l ä i n t e n + h a i t t a i s i + h a i t t a l a s k e l m a t + h a i t t a l a s k e l m i i n + h a i t t a l u k k o + h a i t t a n a + h a i t t a o h j e l m a + h a i t t a o h j e l m i l t a + h a i t t a p e r u s t e e k s e e n + h a i t t a p u o l e n a + h a i t t a p u o l i + h a i t t a p u o l i a + h a i t t a p u o l i s t a + h a i t t a p u o l t a + h a i t t a t a p a h t u m a s t a + h a i t t a t a p a h t u m a t + h a i t t a t a p a h t u m i a + h a i t t a t a p a h t u m i s t a + h a i t t a v a i k u t u k s e n a + h a i t t a v a i k u t u k s e s t a + h a i t t a v a i k u t u k s e t + h a i t t a v a i k u t u k s i a + h a i t t a v a i k u t u k s i e n + h a i t t a v a i k u t u k s i i n + h a i t t a v a i k u t u k s i l l a + h a i t t a v a i k u t u k s i l t a + h a i t t a v a i k u t u k s i n a + h a i t t a v a i k u t u k s i n e e n + h a i t t a v a i k u t u k s i s t a + h a i t t a v a i k u t u s + h a i t t a v a i k u t u s t e n + h a i t t a v e r o + h a i t t a v e r o i s t a + h a i t t a v e r o j a + h a i t t a v e r o t a s o s t a + h a i t t o i h i n + h a i t t o j a + h a i t t o j e n + h a i t u o t t e i d e n + h a i t u o t t e i l l a + h a j a a n n u k s e n + h a j a a n n u k s e s t a + h a j a a n t u a + h a j a k u o r m i t u k s i n e e n + h a j a l l a a n + h a j a l ä h t e i s t ä + h a j a m i e l i n e n + h a j a m i e l i s y y s + h a j a m i e l i s y y t t ä ä n + h a j a n a i s e m m a t + h a j a n a i s e m p a a + h a j a n a i s e m p i + h a j a n a i s e n + h a j a n a i s e s t i + h a j a n a i s e t + h a j a n a i s i a + h a j a n a i s i k s i + h a j a n a i s i l l e + h a j a n a i s i s t a + h a j a n a i s t a + h a j a n a i s u u d e s s a + h a j a n a i s u u s + h a j a n a i s u u t e e n + h a j a n a i s u u t e n s a + h a j a n a i s u u t t a + h a j a s e u t u a l u e i l l a + h a j a s p e k t r i + h a j a u t e t t u j a + h a j a u t e t u i l l e + h a j a u t e t u m m a l l e + h a j a u t e t u m m a n + h a j a u t e t u m m i n + h a j a u t e t u m p a a + h a j a u t e t u m p i + h a j a u t e t u m p i a + h a j a u t e t u n + h a j a u t e t u s s a + h a j a u t e t u t + h a j a u t t a a k o + h a j a u t t a m a l l a + h a j a u t t a m i s e s t a + h a j a u t t a m i s i d e a n + h a j a u t t a m i s k y s y m y k s i i n + h a j a u t t a m i s o h j e l m a s s a a n + h a j a u t t a m i s p e l i s s ä + h a j a u t t a m i s p e r i a a t t e e n + h a j a u t t a m i s p o l i t i i k a l t a a n + h a j a u t t a m i s p o l i t i i k a n + h a j a u t t a m i s p o l i t i i k k a + h a j a u t t a m i s p r o s e s s i + h a j a u t t a m i s p r o s e s s i a + h a j a u t t a m i s p r o s e s s i n + h a j a u t t a m i s p r o s e s s i s s a + h a j a u t t a m i s s ä ä n t ö j ä + h a j a u t t a m i s t a + h a j a u t t a m i s t a p o j e n s a + h a j a u t t a m i s t o i m e n + h a j a u t t a m i s v a l m i u k s i a + h a j a u t t a m i s v a s t u u + h a j a u t u a + h a j a u t u m i s e n + h a j a u t u s a l g o r i t m i + h a j a u t u s p e r i a a t e t t a + h a j a u t u s p e r i a a t t e e n + h a j a u t u s p o l i t i i k a n + h a j a u t u s s u u n n i t e l m i s t a + h a j a u t u s t a u l u + h a j o a a + h a j o a i s i + h a j o a m a i s i l l a a n + h a j o a m a s s a + h a j o a m a s t a + h a j o a m i s e e n + h a j o a m i s e n + h a j o a m i s p i s t e e s s ä + h a j o a m i s p r o s e s s i i n + h a j o a m i s p r o s e s s i n + h a j o a m i s t u o t e + h a j o a m i s t u o t t e e t + h a j o a m i s t u o t t e i t a + h a j o a v a n + h a j o a v a t + h a j o a v i s t a + h a j o n n e e t + h a j o n n e i s s a + h a j o n t a l u k u + h a j o s i + h a j o s i v a t + h a j o t e t t a v a + h a j o t t a a + h a j o t t a a k s e e n + h a j o t t a k a a m m e + h a j o t t a k o + h a j o t t a m a a n + h a j o t t a m a t t a + h a j o t t a m i s e s t a + h a j o t t a m i s p o l i t i i k k a a + h a j o t t a m i s p y r k i m y k s i l l e + h a j o t t a m i s t o i m i i n + h a j o t t a n e e t + h a j o t t a v i a + h a j o t t i + h a j o t t u a + h a j u e p i t e e l i + h a j u h e i n ä + h a j u h e r m o + h a j u h e r n e + h a j u l a u k k a + h a j u o m i n a i s u u t e e n + h a j u p o m m i + h a j u s t e a i n e s o s i e n + h a j u s t e i d e n + h a j u s t e i s i i n + h a j u s t e i t a + h a j u s u o l a + h a k a h e r k k u s i e n i + h a k a m i e s + h a k a n e u l a + h a k a r i s t i l i p p u j a + h a k a s v i r n a y ö k k ö n e n + h a k a t a a n + h a k a t t u a + h a k a t t u j a + h a k a t t u n a + h a k a v i l l a k a s + h a k e a k s e e n + h a k e e + h a k e e k o + h a k e m a a n + h a k e m i s e n + h a k e m i s m e n e t t e l y j ä + h a k e m i s t o h u i j a r e i l l e + h a k e m i s t o p a l v e l u j e n + h a k e m i s t o y h t i ö i s t ä + h a k e m i s t o y r i t y k s i s t ä + h a k e m i s t o y r i t y k s i ä + h a k e m u k s e l l e e n + h a k e m u k s e n + h a k e m u k s e n s a + h a k e m u k s e s t a + h a k e m u k s e t + h a k e m u k s i a + h a k e m u k s i s s a + h a k e m u k s i s t a + h a k e m u s l o m a k k e i s s a + h a k e m u s l o m a k k e i t a + h a k e m u s m e n e t t e l y + h a k e m u s m e n e t t e l y i s t ä + h a k e m u s m e n e t t e l y j e n + h a k e m u s m e n e t t e l y j ä + h a k e m u s m e n e t t e l y n + h a k e m u s m e n e t t e l y s s ä + h a k e m u s m e n e t t e l y s t ä + h a k e m u s m e n e t t e l y t + h a k e m u s m e n e t t e l y ä + h a k e m u s p r o s e s s i + h a k e m u s p r o s e s s i s s a + h a k e m u s p r o s e s s i s t a + h a k e m u s p y y n n ö t + h a k e m u s p ä ä t ö s + h a k e m u s t a + h a k e m u s t e n + h a k e m u s t u l v a a n + h a k e m u s v i i d a k k o + h a k e n e e n + h a k e n e e t + h a k e n e i d e n + h a k e n e i l l e + h a k e n u t t a + h a k e u t u a + h a k e u t u a k s e e n + h a k e u t u e s s a a n + h a k e u t u u + h a k e u t u v i a + h a k e u t u v i e n + h a k e v a n + h a k e v a t + h a k e v i l l e + h a k i j a a + h a k i j a e h d o k k a i s t a + h a k i j a k a u p u n g i n + h a k i j a k a u p u n g i t + h a k i j a l l a + h a k i j a m a a + h a k i j a m a a k s i + h a k i j a m a a l l e + h a k i j a m a a n + h a k i j a m a a n a + h a k i j a m a a s s a + h a k i j a m a a s t a + h a k i j a m a a t + h a k i j a m a a t a + h a k i j a m a i d e n + h a k i j a m a i h i n + h a k i j a m a i l l a + h a k i j a m a i l l e + h a k i j a m a i l t a + h a k i j a m a i s s a + h a k i j a m a i s s a k i n + h a k i j a m a i s t a + h a k i j a m a i t a + h a k i j a m ä ä r i e n + h a k i j a m ä ä r i ä + h a k i j a n + h a k i j a r y h m i e n + h a k i j a r y h m i l l e + h a k i j a r y h m ä n + h a k i j a s t a + h a k i j a s t a t u k s e n + h a k i j a v a l t i o + h a k i j a v a l t i o i d e n + h a k i j a v a l t i o i d e n k i n + h a k i j a v a l t i o i h i n + h a k i j a v a l t i o i l l a + h a k i j a v a l t i o i l l e + h a k i j a v a l t i o i s s a + h a k i j a v a l t i o i s t a + h a k i j a v a l t i o i t a + h a k i j a v a l t i o l t a + h a k i j a v a l t i o n + h a k i j a v a l t i o n a + h a k i j a v a l t i o t + h a k i j a v a l t i o t a + h a k i j o i d e n + h a k i j o i h i n + h a k i j o i l l a + h a k i j o i n a + h a k i j o i s s a + h a k i j o i s t a + h a k i j o i t a + h a k i s i + h a k k a a m i k s i + h a k k e r i e t i i k k a + h a k k u r i t e h o l ä h d e + h a k k u u a l u e i t a + h a k k u u j ä t t e e s t ä + h a k k u u j ä t t e i t ä + h a k k u u n + h a k u a l g o r i t m i + h a k u j a + h a k u j ä r j e s t y k s e s s ä + h a k u k e s k u s t a + h a k u k i e r r o s + h a k u k o n e + h a k u k o n e e n + h a k u k o n e e n s a + h a k u k o n e e s e e n + h a k u k o n e e s t a + h a k u k o n e e t + h a k u k o n e i d e n + h a k u k o n e i l l a + h a k u k o n e i l l e + h a k u k o n e i s i i n + h a k u k o n e i s s a + h a k u k o n e i s s a a n + h a k u k o n e i s t a + h a k u k o n e i t a + h a k u k o n e o p t i m o i n t i + h a k u k o n e p a l v e l u i d e n + h a k u k o n e t t a + h a k u k o n e y h t i ö + h a k u k r i t e e r i e n + h a k u k r i t e e r i n ä + h a k u l o m a k k e e t + h a k u m e k a n i s m i e n + h a k u m e n e t e l m i ä + h a k u m e n e t t e l y + h a k u m e n e t t e l y i t ä + h a k u m e n e t t e l y j e n + h a k u m e n e t t e l y j ä + h a k u m e n e t t e l y n + h a k u m e n e t t e l y s s ä + h a k u m e n e t t e l y t + h a k u m e n e t t e l y y n + h a k u m e n e t t e l y ä + h a k u o h j e l m a l l a + h a k u o p p a a n + h a k u p a l v e l u j e n + h a k u p r o j e k t i l l a + h a k u p r o s e s s e j a + h a k u p r o s e s s i + h a k u p r o s e s s i e n + h a k u p r o s e s s i n + h a k u p u u + h a k u r a h t i p a l v e l u i h i n + h a k u r a h t i p a l v e l u j e n + h a k u r a k e n n e + h a k u r o b o t t i + h a k u s a n a k s i + h a k u t a v o i t t e e n s a + h a k u t e o s + h a k u t i e d o t + h a k u t u l o k s e n a + h a k u v a a t i m u k s i a + h a k u v a i h t o e h t o j a + h a k u v a l m i u k s i a + h a l i n a l l e t + h a l k a i s e m i s e n + h a l k a i s e m i s e s t a + h a l k a i s i j a a + h a l k e a m i s k e l p o i s e n + h a l k e a m i s k e l p o i s i a + h a l k e a m i s k e l p o i s t e n + h a l k o m i s t a + h a l l a a + h a l l a k e h r ä ä j ä + h a l l a k k o v ä r i + h a l l a m i n + h a l l a m i t t a r i + h a l l a v a h a k a s + h a l l i a + h a l l i k i r k k o + h a l l i n + h a l l i n n a l l a + h a l l i n n a n + h a l l i n n a s s a + h a l l i n n a s s a m m e + h a l l i n n a s s a n n e + h a l l i n n a s t a + h a l l i n n o i d a a n + h a l l i n n o i d a k s e e n + h a l l i n n o i d e s s a a n + h a l l i n n o i d u n + h a l l i n n o i m a a n + h a l l i n n o i m i s e k s i + h a l l i n n o i n n i n + h a l l i n n o i n n i s t a + h a l l i n n o i n t i a + h a l l i n n o i n t i a s i a k i r j a t + h a l l i n n o i n t i e d e l l y t y k s e t + h a l l i n n o i n t i e l i m i ä + h a l l i n n o i n t i e l i n t e n + h a l l i n n o i n t i i n + h a l l i n n o i n t i i n s a + h a l l i n n o i n t i j ä r j e s t e l m i e n + h a l l i n n o i n t i j ä r j e s t e l m i i n + h a l l i n n o i n t i j ä r j e s t e l m i l l ä + h a l l i n n o i n t i j ä r j e s t e l m i ä + h a l l i n n o i n t i j ä r j e s t e l m ä + h a l l i n n o i n t i j ä r j e s t e l m ä l l e + h a l l i n n o i n t i j ä r j e s t e l m ä n + h a l l i n n o i n t i j ä r j e s t e l m ä t + h a l l i n n o i n t i j ä r j e s t e l m ä ä + h a l l i n n o i n t i j ä r j e s t e l m ä ä n + h a l l i n n o i n t i j ä r j e s t e l y j ä + h a l l i n n o i n t i k o o d i + h a l l i n n o i n t i k u m p p a n u u k s i e n + h a l l i n n o i n t i k u m p p a n u u t t a + h a l l i n n o i n t i k u s t a n n u k s e t + h a l l i n n o i n t i k u s t a n n u k s i a + h a l l i n n o i n t i k u s t a n n u k s i s t a + h a l l i n n o i n t i k y s y m y k s e n + h a l l i n n o i n t i k y s y m y s + h a l l i n n o i n t i k y v y n + h a l l i n n o i n t i m a l l i + h a l l i n n o i n t i m a l l i a + h a l l i n n o i n t i m a l l i n + h a l l i n n o i n t i m a r k k i n a t + h a l l i n n o i n t i m e k a n i s m e j a + h a l l i n n o i n t i m e n e t e l m i e n + h a l l i n n o i n t i m e n e t e l m i ä + h a l l i n n o i n t i m e n e t e l m ä s t ä + h a l l i n n o i n t i m e n e t t e l y + h a l l i n n o i n t i m e n e t t e l y t + h a l l i n n o i n t i m e n e t t e l y y n + h a l l i n n o i n t i m e n e t t e l y ä + h a l l i n n o i n t i m e n o i h i n + h a l l i n n o i n t i m u o t o j a + h a l l i n n o i n t i o h j e l m i a + h a l l i n n o i n t i p a l v e l u j a + h a l l i n n o i n t i p o l i t i i k a n + h a l l i n n o i n t i p o l i t i i k k a a + h a l l i n n o i n t i p r o s e s s i i n + h a l l i n n o i n t i p r o s e s s i n + h a l l i n n o i n t i p y r k i m y k s i i n + h a l l i n n o i n t i r a k e n t e e n + h a l l i n n o i n t i r a k e n t e i d e n + h a l l i n n o i n t i r a k e n t e i s s a + h a l l i n n o i n t i s e l v i t y k s i ä + h a l l i n n o i n t i s o p i m u k s e n + h a l l i n n o i n t i s t r a t e g i a k s i + h a l l i n n o i n t i s t r a t e g i o i t a + h a l l i n n o i n t i t a p a + h a l l i n n o i n t i t a v a n + h a l l i n n o i n t i t a v a s t a + h a l l i n n o i n t i t e h t ä v i s t ä + h a l l i n n o i n t i t e h t ä v i ä + h a l l i n n o i n t i t e h t ä v ä t + h a l l i n n o i n t i t e k n i i k o i t a + h a l l i n n o i n t i t o i m e n p i t e i d e n + h a l l i n n o i n t i t o i m e n p i t e i l l ä + h a l l i n n o i n t i t o i m e n p i t e i t ä + h a l l i n n o i n t i t o i m i e n + h a l l i n n o i n t i t o i m i n n o t + h a l l i n n o i n t i t o i m i s t a + h a l l i n n o i n t i u u d i s t u k s e s s a + h a l l i n n o i n t i v a i h t o e h d o i s t a + h a l l i n n o i n t i v a j e e k s i + h a l l i n n o i n t i v a s t u u t + h a l l i n n o i n t i v a s t u u t a + h a l l i n n o i n t i v i r a n o m a i n e n + h a l l i n n o i n t i v i r o i s t a + h a l l i n n o i n t i v ä l i n e + h a l l i n n o i n t i v ä l i n e e n ä + h a l l i n n o i n t i v ä l i n e i d e n + h a l l i n n o i n t i v ä l i n e i s t ä + h a l l i n n o i n t i v ä l i n e i t ä + h a l l i n n o i n t i v ä l i n e t t ä + h a l l i n n o i n t i y h t e i s ö n + h a l l i n n o i n t i y h t i ö i d e n + h a l l i n n o i n t i y h t i ö i h i n + h a l l i n n o i n t i y h t i ö i l l e + h a l l i n n o i n t i y h t i ö i t ä + h a l l i n n o i n t i y h t i ö j ä r j e s t e l m ä n + h a l l i n n o i n t i y h t i ö t + h a l l i n n o i n t i y k s i k k ö + h a l l i n n o i n t i y k s i k ö t + h a l l i n n o i s t a + h a l l i n n o i t a i s i i n + h a l l i n n o i t i i n + h a l l i n n o i t u + h a l l i n n o i v a t + h a l l i n n o i v i e n + h a l l i n n o l l e + h a l l i n n o l l i n e n k i n + h a l l i n n o l l i s e k s i + h a l l i n n o l l i s e l l a + h a l l i n n o l l i s e n + h a l l i n n o l l i s e s s a + h a l l i n n o l l i s e s t a + h a l l i n n o l l i s e t + h a l l i n n o l l i s i a + h a l l i n n o l l i s i i n + h a l l i n n o l l i s i l l a + h a l l i n n o l l i s i s t a + h a l l i n n o l l i s t a + h a l l i n n o l l i s t e n + h a l l i n n o n + h a l l i n n o n a l a l l e + h a l l i n n o n a l a n + h a l l i n n o n a l o j a + h a l l i n n o n a l o j e n + h a l l i n n o n a l u e e t + h a l l i n n o n k e h i t t ä m i s h a n k e + h a l l i n n o n u u d i s t u k s e n + h a l l i n n o n u u d i s t u k s e s s a + h a l l i n n o n u u d i s t u k s e t + h a l l i n n o n u u d i s t u s + h a l l i n n o n u u d i s t u s m e n e t t e l y + h a l l i n n o n u u d i s t u s p a k e t i n + h a l l i n n o n u u d i s t u s t a + h a l l i n n o n v a i h d o k s e s t a + h a l l i n n o n v a i h d o s + h a l l i n n o s s a + h a l l i n n o s s a n n e + h a l l i n n o s t a + h a l l i n n o s t a a n + h a l l i n n o t + h a l l i n t a a + h a l l i n t a a n + h a l l i n t a a n k i n + h a l l i n t a a n s a + h a l l i n t a f i l o s o f i a + h a l l i n t a h a n k k e e t + h a l l i n t a h a n k k e i s i i n + h a l l i n t a h e n k i l ö s t ö ä + h a l l i n t a j ä r j e s t e l m i e n + h a l l i n t a j ä r j e s t e l m i i n + h a l l i n t a j ä r j e s t e l m i ä + h a l l i n t a j ä r j e s t e l m ä + h a l l i n t a j ä r j e s t e l m ä l l ä + h a l l i n t a j ä r j e s t e l m ä n + h a l l i n t a j ä r j e s t e l m ä n s ä + h a l l i n t a j ä r j e s t e l m ä s s ä + h a l l i n t a j ä r j e s t e l m ä s t ä + h a l l i n t a j ä r j e s t e l m ä t + h a l l i n t a j ä r j e s t e l m ä ä + h a l l i n t a j ä r j e s t e l m ä ä n + h a l l i n t a j ä r j e s t ö j e n + h a l l i n t a k o m i t e a + h a l l i n t a k o m i t e a t + h a l l i n t a k ä s i t y s + h a l l i n t a k ä y t ä n t ö i n e e n + h a l l i n t a k ä y t ä n t ö j e n + h a l l i n t a k ä y t ä n t ö j ä + h a l l i n t a l a i t t e i d e n + h a l l i n t a m a l l i a + h a l l i n t a m e k a n i s m e i l l a + h a l l i n t a m e k a n i s m e i s s a + h a l l i n t a m e k a n i s m i e n + h a l l i n t a m e n e t e l m ä t + h a l l i n t a m e n e t e l m ä ä + h a l l i n t a m e n e t e l m ä ä n + h a l l i n t a m e n e t t e l y i h i n + h a l l i n t a m e n e t t e l y j e n + h a l l i n t a m e n e t t e l y j ä + h a l l i n t a m e n e t t e l y t + h a l l i n t a m e n e t t e l y ä + h a l l i n t a n o r m i e n + h a l l i n t a o h j e l m a a + h a l l i n t a o h j e l m a a n + h a l l i n t a o p e r a a t i o i s s a + h a l l i n t a p a k e t t i + h a l l i n t a p a k e t t i a + h a l l i n t a p a r a m e t r e j a + h a l l i n t a p e r u s t e i n a + h a l l i n t a p i s t e t t ä + h a l l i n t a p o l i t i i k a n + h a l l i n t a p o l i t i i k a s s a + h a l l i n t a p o l i t i i k a s t a + h a l l i n t a p o l i t i i k k a + h a l l i n t a p o l i t i i k k a a + h a l l i n t a p o l i t i i k k a j ä r j e s t e l m ä + h a l l i n t a p r o s e s s e i l l e + h a l l i n t a p r o s e s s i n + h a l l i n t a p u i t t e i t a + h a l l i n t a p u o l t a + h a l l i n t a r a k e n n e + h a l l i n t a r a k e n t e e t + h a l l i n t a r a k e n t e i d e n + h a l l i n t a s t r a t e g i a + h a l l i n t a s u u n n i t e l m a + h a l l i n t a s u u n n i t e l m a a + h a l l i n t a s u u n n i t e l m a a n + h a l l i n t a s u u n n i t e l m a n + h a l l i n t a s u u n n i t e l m a t + h a l l i n t a s u u n n i t e l m i a + h a l l i n t a s u u n n i t e l m i e n + h a l l i n t a s ä ä n n ö t + h a l l i n t a s ä ä n t ö i h i n + h a l l i n t a s ä ä n t ö j e n + h a l l i n t a t a p a a + h a l l i n t a t a p o j a + h a l l i n t a t a p o j e n + h a l l i n t a t a v a n + h a l l i n t a t a v a s t a + h a l l i n t a t a v o i t t e e t + h a l l i n t a t e h t ä v i s t ä + h a l l i n t a t e h t ä v ä ä + h a l l i n t a t e k n i i k k a a + h a l l i n t a t e k n o l o g i o i t a + h a l l i n t a t i e t o k a n t a + h a l l i n t a t o i m e n p i t e e t + h a l l i n t a t o i m e n p i t e i d e n + h a l l i n t a t o i m e n p i t e i s i i n + h a l l i n t a t o i m e n p i t e i s t ä + h a l l i n t a t o i m e n p i t e i t ä + h a l l i n t a t o i m i a + h a l l i n t a t o i m i e n + h a l l i n t a t o i m i i n + h a l l i n t a t o i m i s t a + h a l l i n t a t y ö k a l u + h a l l i n t a v a l m i u k s i e n + h a l l i n t a v e r k o n + h a l l i n t a v e r k o s t o + h a l l i n t a v i r a n o m a i s e t + h a l l i n t a v i r a n o m a i s t e n + h a l l i n t a v i r a s t o n + h a l l i n t a v i r a s t o o n + h a l l i n t a v ä l i n e + h a l l i n t a v ä l i n e e k s i + h a l l i n t a v ä l i n e e n + h a l l i n t a v ä l i n e e n ä + h a l l i n t a v ä l i n e e t + h a l l i n t a v ä l i n e i d e n + h a l l i n t a v ä l i n e i t ä + h a l l i n t a v ä l i n e t t ä + h a l l i n t a y h t i ö + h a l l i n t a y h t i ö i d e n + h a l l i n t a y h t i ö i t ä + h a l l i n t a y h t i ö n + h a l l i n t a y h t i ö t + h a l l i n t a y k s i k k ö ä + h a l l i n t a y k s i k ö i t ä + h a l l i n t a y k s i k ö n + h a l l i n t a y m p ä r i s t ö + h a l l i n t a y r i t y k s e t + h a l l i n t a y r i t y k s i l l e + h a l l i n t a y r i t y s t e n + h a l l i n t o a + h a l l i n t o a a n + h a l l i n t o a l u e e n + h a l l i n t o a l u e e n a + h a l l i n t o a l u e e s e e n + h a l l i n t o a l u e e t + h a l l i n t o a l u e i d e n + h a l l i n t o a l u e i l l a + h a l l i n t o a l u e i l l e + h a l l i n t o a l u e i s i i n + h a l l i n t o a s i a + h a l l i n t o a s i a k i r j a s t a + h a l l i n t o a s i a k i r j o j e n + h a l l i n t o a s i a t + h a l l i n t o a s i o i d e n + h a l l i n t o a s i o i s s a + h a l l i n t o a s i o i t a + h a l l i n t o a v u s t a j a n i + h a l l i n t o b u d j e t i n + h a l l i n t o b u d j e t i s t a + h a l l i n t o b u d j e t t e i h i n + h a l l i n t o b u d j e t t i + h a l l i n t o b u d j e t t i a + h a l l i n t o b u d j e t t i i n + h a l l i n t o b y r o k r a t i a n + h a l l i n t o b y r o k r a t i a s t a + h a l l i n t o e h d o t u k s i a + h a l l i n t o e h d o t u s + h a l l i n t o e l i m e e n + h a l l i n t o e l i m e k s i + h a l l i n t o e l i m e l l e + h a l l i n t o e l i m e n + h a l l i n t o e l i m e n ä + h a l l i n t o e l i m e s s ä + h a l l i n t o e l i m e s t ä + h a l l i n t o e l i m e t + h a l l i n t o e l i m i e n + h a l l i n t o e l i m i i n + h a l l i n t o e l i m i l l e + h a l l i n t o e l i m i l l ä + h a l l i n t o e l i m i l t ä + h a l l i n t o e l i m i s s ä + h a l l i n t o e l i m i s t ä + h a l l i n t o e l i m i ä + h a l l i n t o e l i n + h a l l i n t o e l i n t e n + h a l l i n t o e l i n t ä + h a l l i n t o e l i n u u d i s t u s + h a l l i n t o e s t e i d e n + h a l l i n t o f o o r u m e i h i n + h a l l i n t o f o o r u m i + h a l l i n t o f o o r u m i i n + h a l l i n t o f o o r u m i n + h a l l i n t o f o o r u m i s t a + h a l l i n t o h e n k i l ö k u n n a n + h a l l i n t o h e n k i l ö k u n t a a + h a l l i n t o h e n k i l ö s t ö + h a l l i n t o h e n k i l ö s t ö n + h a l l i n t o h e n k i l ö s t ö s t ä + h a l l i n t o h e n k i l ö s t ö ä + h a l l i n t o h e n k i l ö s t ö ö n + h a l l i n t o i n f r a s t r u k t u u r i + h a l l i n t o j a + h a l l i n t o j e n + h a l l i n t o j o h t a j a + h a l l i n t o j o h t a j a n a + h a l l i n t o j o h t a m i s t a + h a l l i n t o j ä r j e s t e l m i e n + h a l l i n t o j ä r j e s t e l m i i n + h a l l i n t o j ä r j e s t e l m i i n s ä + h a l l i n t o j ä r j e s t e l m i l l e + h a l l i n t o j ä r j e s t e l m i l l ä + h a l l i n t o j ä r j e s t e l m i s s ä + h a l l i n t o j ä r j e s t e l m i ä + h a l l i n t o j ä r j e s t e l m i ä m m e + h a l l i n t o j ä r j e s t e l m i ä ä n + h a l l i n t o j ä r j e s t e l m ä + h a l l i n t o j ä r j e s t e l m ä l l ä + h a l l i n t o j ä r j e s t e l m ä m m e + h a l l i n t o j ä r j e s t e l m ä n + h a l l i n t o j ä r j e s t e l m ä s s ä + h a l l i n t o j ä r j e s t e l m ä s t ä + h a l l i n t o j ä r j e s t e l m ä t + h a l l i n t o j ä r j e s t e l m ä ä + h a l l i n t o j ä r j e s t e l m ä ä n + h a l l i n t o j ä r j e s t e l y + h a l l i n t o j ä r j e s t e l y i s t ä + h a l l i n t o j ä r j e s t e l y j e n + h a l l i n t o j ä r j e s t e l y j ä + h a l l i n t o k a a v i o + h a l l i n t o k a a v i o n + h a l l i n t o k a p a s i t e e t i n + h a l l i n t o k a p a s i t e e t t i + h a l l i n t o k a p a s i t e e t t i a + h a l l i n t o k a p a s i t e e t t i a m m e + h a l l i n t o k a u d e l l a + h a l l i n t o k a u d e l l e + h a l l i n t o k e h y k s e k s i + h a l l i n t o k e h y k s e n + h a l l i n t o k e h y k s e s s ä + h a l l i n t o k e h y s + h a l l i n t o k e h y s t ä + h a l l i n t o k e i n o n a + h a l l i n t o k e s k u k s i i n + h a l l i n t o k e s k u s t a + h a l l i n t o k i n + h a l l i n t o k o l o s s i a + h a l l i n t o k o m i s s i o + h a l l i n t o k o m i t e a + h a l l i n t o k o m i t e a a + h a l l i n t o k o m i t e a a n + h a l l i n t o k o m i t e a k s i + h a l l i n t o k o m i t e a l l a + h a l l i n t o k o m i t e a l l e + h a l l i n t o k o m i t e a l t a + h a l l i n t o k o m i t e a m e n e t t e l y + h a l l i n t o k o m i t e a m e n e t t e l y k s i + h a l l i n t o k o m i t e a m e n e t t e l y n + h a l l i n t o k o m i t e a m e n e t t e l y y n + h a l l i n t o k o m i t e a n + h a l l i n t o k o m i t e a s s a + h a l l i n t o k o m i t e a s t a + h a l l i n t o k o m i t e a t + h a l l i n t o k o m i t e o i d e n + h a l l i n t o k o m i t e o i h i n + h a l l i n t o k o m i t e o i l l e + h a l l i n t o k o m i t e o i s s a + h a l l i n t o k o m i t e o i t a + h a l l i n t o k o n e e k s i + h a l l i n t o k o n e i s t o + h a l l i n t o k o n e i s t o a + h a l l i n t o k o n e i s t o j a + h a l l i n t o k o n e i s t o l l a + h a l l i n t o k o n e i s t o n + h a l l i n t o k o n e i s t o n s a + h a l l i n t o k o n e i s t o o n + h a l l i n t o k o n e i s t o s s a + h a l l i n t o k o n e i t a + h a l l i n t o k o n s u l t t e j a + h a l l i n t o k o n t t o r e i n a + h a l l i n t o k o n t t o r e i t a + h a l l i n t o k o u l u + h a l l i n t o k o u l u t u k s e n + h a l l i n t o k u l t t u u r i + h a l l i n t o k u l t t u u r i a + h a l l i n t o k u l t t u u r i i n + h a l l i n t o k u l t t u u r i l l e + h a l l i n t o k u l t t u u r i n + h a l l i n t o k u l t t u u r i s t a + h a l l i n t o k u l u i h i n + h a l l i n t o k u l u i l l e + h a l l i n t o k u l u i n a + h a l l i n t o k u l u i s t a + h a l l i n t o k u l u i s t a m m e + h a l l i n t o k u l u j a + h a l l i n t o k u l u j a a n + h a l l i n t o k u l u j e n + h a l l i n t o k u l u j e n s a + h a l l i n t o k u l u m m e + h a l l i n t o k u l u t + h a l l i n t o k u r i i n + h a l l i n t o k u s t a n n u k s e t + h a l l i n t o k u s t a n n u k s i a + h a l l i n t o k u s t a n n u k s i i n + h a l l i n t o k u s t a n n u k s i l l a + h a l l i n t o k u s t a n n u k s i n + h a l l i n t o k u s t a n n u k s i s t a + h a l l i n t o k u s t a n n u s t e n + h a l l i n t o k y k y m m e + h a l l i n t o k y k y ä + h a l l i n t o k y s y m y k s i s s ä + h a l l i n t o k y s y m y k s i s t ä + h a l l i n t o k y s y m y s + h a l l i n t o k y s y m y s t e n + h a l l i n t o k y s y m y s t ä + h a l l i n t o k y v y n + h a l l i n t o k ä s i t y s t ä + h a l l i n t o k ä y t t ä y t y m i s e s t ä + h a l l i n t o k ä y t ä n n ö i s s ä + h a l l i n t o k ä y t ä n n ö i s t ä + h a l l i n t o k ä y t ä n n ö n + h a l l i n t o k ä y t ä n n ö s s ä + h a l l i n t o k ä y t ä n n ö t + h a l l i n t o k ä y t ä n t ö + h a l l i n t o k ä y t ä n t ö i h i n + h a l l i n t o k ä y t ä n t ö j e n + h a l l i n t o k ä y t ä n t ö j ä + h a l l i n t o k ä y t ä n t ö ä + h a l l i n t o k ä y t ä n t ö ö n + h a l l i n t o l a i n + h a l l i n t o l a i n s ä ä d ä n n ö n + h a l l i n t o l a i s s a + h a l l i n t o l a i s t a + h a l l i n t o l a k i a + h a l l i n t o l a k i i n + h a l l i n t o m a k s u n + h a l l i n t o m a l l e i l l e + h a l l i n t o m a l l e i s t a + h a l l i n t o m a l l e j a + h a l l i n t o m a l l i + h a l l i n t o m a l l i a + h a l l i n t o m a l l i e n + h a l l i n t o m a l l i n + h a l l i n t o m a l l i s s a + h a l l i n t o m a l l i s t a + h a l l i n t o m a l l i t + h a l l i n t o m e k a n i s m e i h i n + h a l l i n t o m e k a n i s m e j a + h a l l i n t o m e k a n i s m i e n + h a l l i n t o m e k a n i s m i i n + h a l l i n t o m e k a n i s m i t + h a l l i n t o m e n e t e l m i e n + h a l l i n t o m e n e t e l m i i n + h a l l i n t o m e n e t e l m i ä + h a l l i n t o m e n e t e l m ä + h a l l i n t o m e n e t e l m ä t + h a l l i n t o m e n e t e l m ä ä + h a l l i n t o m e n e t t e l y + h a l l i n t o m e n e t t e l y i d e n + h a l l i n t o m e n e t t e l y i h i n + h a l l i n t o m e n e t t e l y i l l ä + h a l l i n t o m e n e t t e l y i s s ä + h a l l i n t o m e n e t t e l y i s t ä + h a l l i n t o m e n e t t e l y i t ä + h a l l i n t o m e n e t t e l y i t ä ä n + h a l l i n t o m e n e t t e l y j e n + h a l l i n t o m e n e t t e l y j e n k i n + h a l l i n t o m e n e t t e l y j ä + h a l l i n t o m e n e t t e l y j ä ä n + h a l l i n t o m e n e t t e l y n + h a l l i n t o m e n e t t e l y s s ä + h a l l i n t o m e n e t t e l y t + h a l l i n t o m e n e t t e l y t a p o j a + h a l l i n t o m e n e t t e l y y n + h a l l i n t o m e n e t t e l y ä + h a l l i n t o m e n o + h a l l i n t o m e n o i h i n + h a l l i n t o m e n o i h i n s a + h a l l i n t o m e n o i l l a + h a l l i n t o m e n o i l l e + h a l l i n t o m e n o i l t a + h a l l i n t o m e n o i n a + h a l l i n t o m e n o i s s a + h a l l i n t o m e n o i s t a + h a l l i n t o m e n o j a + h a l l i n t o m e n o j a m m e + h a l l i n t o m e n o j e n + h a l l i n t o m e n o k y s y m y k s e e n + h a l l i n t o m e n o t + h a l l i n t o m u o d o l l i s u u k s i a + h a l l i n t o m u o d o n + h a l l i n t o m u o d o t + h a l l i n t o m u o t o + h a l l i n t o m u o t o a + h a l l i n t o m u o t o j a + h a l l i n t o m u u t o k s e t + h a l l i n t o m u u t o k s i s s a + h a l l i n t o m ä ä r ä r a h o i h i n + h a l l i n t o m ä ä r ä r a h o i s t a + h a l l i n t o m ä ä r ä r a h o j a + h a l l i n t o m ä ä r ä r a h o j e n + h a l l i n t o m ä ä r ä y k s i ä + h a l l i n t o n e u v o s t o + h a l l i n t o n e u v o s t o a + h a l l i n t o n e u v o s t o i s s a + h a l l i n t o n e u v o s t o i s t a + h a l l i n t o n e u v o s t o j a + h a l l i n t o n e u v o s t o j e n + h a l l i n t o n e u v o s t o l l a + h a l l i n t o n e u v o s t o l l e + h a l l i n t o n e u v o s t o n + h a l l i n t o n e u v o s t o n s a + h a l l i n t o n e u v o s t o o n + h a l l i n t o n e u v o s t o p a i k k a a + h a l l i n t o n e u v o s t o s s a + h a l l i n t o n e u v o s t o s t a + h a l l i n t o n i + h a l l i n t o o n + h a l l i n t o p a k e t i s t a + h a l l i n t o p a l v e l u + h a l l i n t o p a l v e l u i h i n + h a l l i n t o p a l v e l u j e n + h a l l i n t o p a l v e l u t + h a l l i n t o p e r i a a t t e e n a + h a l l i n t o p e r i a a t t e e t + h a l l i n t o p e r i a a t t e i d e n + h a l l i n t o p e r i a a t t e i t a + h a l l i n t o p e r i n t e e s e e n + h a l l i n t o p e r u s t e i t a + h a l l i n t o p i i r i + h a l l i n t o p i i r i n + h a l l i n t o p o l i t i i k a n + h a l l i n t o p o l i t i i k k a a + h a l l i n t o p o l i t i i k k o j a + h a l l i n t o p o r t a i d e n + h a l l i n t o p o r t a i s s a + h a l l i n t o p r o f i i l e i s s a + h a l l i n t o p r o f i i l i e n + h a l l i n t o p r o f i i l i l l e + h a l l i n t o p r o s e s s e i s s a + h a l l i n t o p r o s e s s i + h a l l i n t o p r o s e s s i e n + h a l l i n t o p r o s e s s i i n + h a l l i n t o p r o s e s s i n + h a l l i n t o p r o s e s s i s t a + h a l l i n t o p ä ä t ö k s e t + h a l l i n t o p ä ä t ö k s i l l ä + h a l l i n t o r a h a s t o + h a l l i n t o r a k e n n e + h a l l i n t o r a k e n n e t t a + h a l l i n t o r a k e n n u k s e s s a + h a l l i n t o r a k e n n u k s e t + h a l l i n t o r a k e n n u k s i a + h a l l i n t o r a k e n n u k s i i n + h a l l i n t o r a k e n n u k s i s s a + h a l l i n t o r a k e n n u s + h a l l i n t o r a k e n n u s t e n + h a l l i n t o r a k e n t e e k s i + h a l l i n t o r a k e n t e e l l a + h a l l i n t o r a k e n t e e n + h a l l i n t o r a k e n t e e n s a + h a l l i n t o r a k e n t e e s e e n + h a l l i n t o r a k e n t e e s s a + h a l l i n t o r a k e n t e e s t a + h a l l i n t o r a k e n t e e t + h a l l i n t o r a k e n t e i d e n + h a l l i n t o r a k e n t e i l l e + h a l l i n t o r a k e n t e i s i i n + h a l l i n t o r a k e n t e i s s a + h a l l i n t o r a k e n t e i s t a + h a l l i n t o r a k e n t e i s t a a n + h a l l i n t o r a k e n t e i t a + h a l l i n t o r a k e n t e i t a a n + h a l l i n t o r a k e n t e i t a n n e + h a l l i n t o r a t k a i s u j a + h a l l i n t o r e f o r m i n + h a l l i n t o r e s u r s s e i l l a + h a l l i n t o r e s u r s s i e n + h a l l i n t o r e s u r s s i t + h a l l i n t o r o o l i a a n + h a l l i n t o r y h m ä + h a l l i n t o r y h m ä l l e + h a l l i n t o r y h m ä ä + h a l l i n t o s e i k k o j e n + h a l l i n t o s e k t o r e i l l a + h a l l i n t o s o p i m u k s e n + h a l l i n t o s o p i m u k s e t + h a l l i n t o s o p i m u s m a l l i k s i + h a l l i n t o s o p i m u s t a + h a l l i n t o s o p i m u s t e n + h a l l i n t o s t a n d a r d i e n + h a l l i n t o s t r a t e g i a n + h a l l i n t o s t r a t e g i a s s a m m e + h a l l i n t o s u u n n i t e l m a + h a l l i n t o s u u n n i t e l m a n + h a l l i n t o s u u n n i t e l m a s s a n n e + h a l l i n t o s u u n n i t e l m a t + h a l l i n t o s u u n n i t e l m i e n + h a l l i n t o s u u n n i t e l m i i n + h a l l i n t o s u u n n i t t e l u a + h a l l i n t o s y k l e i s t ä + h a l l i n t o s y k l i + h a l l i n t o s ä ä d ö k s e n + h a l l i n t o s ä ä d ö s + h a l l i n t o s ä ä n n ö k s i ä + h a l l i n t o s ä ä n n ö t + h a l l i n t o s ä ä n t ö j e n + h a l l i n t o s ä ä n t ö j ä + h a l l i n t o t a a k a n + h a l l i n t o t a a k a s t a + h a l l i n t o t a a k k a + h a l l i n t o t a a k k a a + h a l l i n t o t a a k k a a n + h a l l i n t o t a i d o i s s a + h a l l i n t o t a i t o j a + h a l l i n t o t a i t o j e n + h a l l i n t o t a l o u s a r v i o t a + h a l l i n t o t a p a + h a l l i n t o t a p a a + h a l l i n t o t a p a a m m e + h a l l i n t o t a p a a n + h a l l i n t o t a p a n s a + h a l l i n t o t a p a r a h a s t o k s i + h a l l i n t o t a p a r a h a s t o s t a + h a l l i n t o t a p a s ä ä n n ö s t ö + h a l l i n t o t a p o i h i n + h a l l i n t o t a p o j a + h a l l i n t o t a p o j e n + h a l l i n t o t a s o + h a l l i n t o t a s o i l l a + h a l l i n t o t a s o j a + h a l l i n t o t a s o j e n + h a l l i n t o t a s o n + h a l l i n t o t a s o t + h a l l i n t o t a v a l t a a n + h a l l i n t o t a v a n + h a l l i n t o t a v a s t a + h a l l i n t o t a v a t + h a l l i n t o t a v o i l l a + h a l l i n t o t a v o i s t a + h a l l i n t o t e h t ä v i e n + h a l l i n t o t e h t ä v i i n + h a l l i n t o t e h t ä v i s t ä ä n + h a l l i n t o t e h t ä v i ä + h a l l i n t o t e h t ä v ä t + h a l l i n t o t e h t ä v ä ä + h a l l i n t o t i e d e + h a l l i n t o t i e t e e l l i n e n + h a l l i n t o t i l a n n e + h a l l i n t o t o i m e n p i t e e m m e + h a l l i n t o t o i m e n p i t e i s t ä + h a l l i n t o t o i m e t + h a l l i n t o t o i m i e n + h a l l i n t o t o i m i i n + h a l l i n t o t o i m i k u n n i k s i + h a l l i n t o t o i m i n t a a + h a l l i n t o t o i m i s t o + h a l l i n t o t o i m i s t o i s s a + h a l l i n t o t u o m i o i s t u i m e l l e + h a l l i n t o t u o m i o i s t u i m e s s a + h a l l i n t o t u o m i o i s t u i n + h a l l i n t o t u o m i o i s t u i n t e n + h a l l i n t o t y y l i + h a l l i n t o t y ö l l ä + h a l l i n t o t y ö s s ä + h a l l i n t o t y ö t ä + h a l l i n t o t y ö t ä ä n + h a l l i n t o u u d i s t u k s e e n + h a l l i n t o u u d i s t u k s e k s i + h a l l i n t o u u d i s t u k s e m m e + h a l l i n t o u u d i s t u k s e n + h a l l i n t o u u d i s t u k s e s s a + h a l l i n t o u u d i s t u k s e s t a + h a l l i n t o u u d i s t u k s i a + h a l l i n t o u u d i s t u k s i s t a + h a l l i n t o u u d i s t u s + h a l l i n t o u u d i s t u s p r o s e s s i n + h a l l i n t o u u d i s t u s t a + h a l l i n t o u u d i s t u s t e n + h a l l i n t o u u d i s t u s t o i m e t + h a l l i n t o v a a l i t + h a l l i n t o v a a t i m u k s i a + h a l l i n t o v a a t i m u s t e n + h a l l i n t o v a i h t o e h d o t + h a l l i n t o v a l i o k u n n a s s a + h a l l i n t o v a l l a k s i + h a l l i n t o v a l l a n + h a l l i n t o v a l m i u d e t + h a l l i n t o v a l m i u k s i a + h a l l i n t o v a l m i u k s i e n s a + h a l l i n t o v a l t a + h a l l i n t o v a l t a a + h a l l i n t o v a s t u u n + h a l l i n t o v a s t u u s t a + h a l l i n t o v a s t u u t a + h a l l i n t o v e r k o s t o n + h a l l i n t o v i r a n o m a i n e n + h a l l i n t o v i r a n o m a i s e n + h a l l i n t o v i r a n o m a i s e t + h a l l i n t o v i r a n o m a i s i a + h a l l i n t o v i r a n o m a i s i i n + h a l l i n t o v i r a n o m a i s i l l a + h a l l i n t o v i r a n o m a i s i l l e + h a l l i n t o v i r a n o m a i s t e n + h a l l i n t o v i r a s t o + h a l l i n t o v i r a s t o i l t a a n + h a l l i n t o v i r a s t o t + h a l l i n t o v i r h e + h a l l i n t o v i r h e i d e n + h a l l i n t o v i r h e i s i i n + h a l l i n t o v i r k a m i e h e l l ä + h a l l i n t o v i r k a m i e h e t + h a l l i n t o v i r k a m i e h i l l e + h a l l i n t o v i r k a m i e s + h a l l i n t o v i r k a m i e s t e n + h a l l i n t o v i r o i s s a + h a l l i n t o v ä l i n e + h a l l i n t o v ä l i n e e t + h a l l i n t o v ä l i n e i s t ä + h a l l i n t o v ä l i n e i t ä + h a l l i n t o v ä l i n e i t ä ä n + h a l l i n t o y h t e i s t y ö l l e + h a l l i n t o y h t e i s t y ö n + h a l l i n t o y h t e i s t y ö s s ä + h a l l i n t o y h t e i s t y ö t ä + h a l l i n t o y h t i ö t + h a l l i n t o y k s i k k ö + h a l l i n t o y k s i k k ö j e n + h a l l i n t o y k s i k k ö ö n + h a l l i n t o y k s i k ö i d e n + h a l l i n t o y k s i k ö t + h a l l i n t o y m p ä r i s t ö + h a l l i n t o y m p ä r i s t ö ä + h a l l i n t o y r i t y s t e n + h a l l i t a + h a l l i t a a n + h a l l i t a k a a n + h a l l i t s e e + h a l l i t s e m a + h a l l i t s e m a a + h a l l i t s e m a a n + h a l l i t s e m a l l a + h a l l i t s e m a l l e + h a l l i t s e m a t o n t a + h a l l i t s e m a t t o m a a n + h a l l i t s e m a t t o m a m p a a + h a l l i t s e m a t t o m a m p i + h a l l i t s e m a t t o m a n + h a l l i t s e m a t t o m a t + h a l l i t s e m a t t o m i e n + h a l l i t s e m a t t o m i k s i + h a l l i t s e m a t t o m i s t a + h a l l i t s e m i e n s a + h a l l i t s e m i s e k s i + h a l l i t s e m i s e s s a + h a l l i t s e m i s e s t a + h a l l i t s e m i s t a p a a n s a + h a l l i t s e v a a + h a l l i t s e v a m p a a n + h a l l i t s e v a n a + h a l l i t s e v a t + h a l l i t s e v i e n + h a l l i t s e v i m p i a + h a l l i t s i j a k a u d e n + h a l l i t s i j o i s t a + h a l l i t s i v a t + h a l l i t t a v i s s a + h a l l i t t a v u u d e n + h a l l i t t u a + h a l l i t t u j a + h a l l i t t u u n + h a l l i t u k s e e n + h a l l i t u k s e l l a + h a l l i t u k s e l l e + h a l l i t u k s e l t a + h a l l i t u k s e m m e + h a l l i t u k s e n + h a l l i t u k s e n a + h a l l i t u k s e n i + h a l l i t u k s e n k i n + h a l l i t u k s e n m u o d o s t u k s e e n + h a l l i t u k s e n n e + h a l l i t u k s e n s a + h a l l i t u k s e n v a i h d o k s e n + h a l l i t u k s e n v a i h d o s + h a l l i t u k s e n v a i h d o s t a + h a l l i t u k s e n v a s t a i s e n + h a l l i t u k s e s s a + h a l l i t u k s e s s a a n + h a l l i t u k s e s t a + h a l l i t u k s e s t a a n + h a l l i t u k s e t + h a l l i t u k s i a + h a l l i t u k s i a a n + h a l l i t u k s i a m m e + h a l l i t u k s i i n + h a l l i t u k s i i n s a + h a l l i t u k s i l l a + h a l l i t u k s i l l a k a a n + h a l l i t u k s i l l a m m e + h a l l i t u k s i l l e + h a l l i t u k s i l l e k a a n + h a l l i t u k s i l t a + h a l l i t u k s i l t a m m e + h a l l i t u k s i s s a + h a l l i t u k s i s t a + h a l l i t u k s i s t a a n + h a l l i t u l l a + h a l l i t u m p a a + h a l l i t u m p a a n + h a l l i t u s a s i o i s s a + h a l l i t u s e d u s t a j a n s a + h a l l i t u s e l i m e n + h a l l i t u s e l i m i ä + h a l l i t u s e l i n t e n + h a l l i t u s e n e m m i s t ö j e n + h a l l i t u s e n e m m i s t ö n + h a l l i t u s e n e m m i s t ö ö n + h a l l i t u s j o h t a j a + h a l l i t u s j o h t a j a m m e + h a l l i t u s j o h t a j a t + h a l l i t u s j o h t a j i a + h a l l i t u s j o h t a j i e n + h a l l i t u s j o h t a j i s t a + h a l l i t u s j ä r j e s t e l m ä + h a l l i t u s j ä r j e s t e l m ä l l e + h a l l i t u s j ä r j e s t e l m ä n + h a l l i t u s j ä r j e s t e l m ä ä n + h a l l i t u s j ä r j e s t ö i s s ä + h a l l i t u s k a a n + h a l l i t u s k a u d e n + h a l l i t u s k i n + h a l l i t u s k o a l i t i o + h a l l i t u s k o a l i t i o l l e + h a l l i t u s k o a l i t i o n + h a l l i t u s k o a l i t i o o m m e + h a l l i t u s k o a l i t i o o n + h a l l i t u s k o a l i t i o s s a + h a l l i t u s k o a l i t i o s t a + h a l l i t u s k o a l i t i o t a + h a l l i t u s k o k e m u k s e l t a + h a l l i t u s k o k o o n p a n o l l e + h a l l i t u s k o l l e g a a + h a l l i t u s k o l l e g a a n s a + h a l l i t u s k o l l e g o i l l e e n + h a l l i t u s k o m i s s i o + h a l l i t u s k o n e i s t o + h a l l i t u s k o n e i s t o n + h a l l i t u s k o n f e r e n s s e i s s a + h a l l i t u s k o n f e r e n s s i a + h a l l i t u s k o n f e r e n s s i s s a + h a l l i t u s k r i i s e j ä + h a l l i t u s k r i i s i + h a l l i t u s k r i i s i n + h a l l i t u s k r i i s i s t ä + h a l l i t u s k u m p p a n e i l l e e n + h a l l i t u s k u m p p a n e i t a a n + h a l l i t u s k u m p p a n i + h a l l i t u s k u m p p a n i k s i + h a l l i t u s k y s y m y k s i ä + h a l l i t u s l ä h t e i s t ä + h a l l i t u s m i e h e n ä + h a l l i t u s m i e l i s e t + h a l l i t u s m u o d o i s s a + h a l l i t u s m u o d o n + h a l l i t u s m u o t o + h a l l i t u s m u o t o a + h a l l i t u s m u o t o j a + h a l l i t u s m u o t o n a + h a l l i t u s m u u t o s t e n + h a l l i t u s m y ö n t e i s e s t ä + h a l l i t u s n e u v o t t e l u i s s a + h a l l i t u s n e u v o t t e l u i s t a + h a l l i t u s n e u v o t t e l u s t a + h a l l i t u s o h j e l m a + h a l l i t u s o h j e l m a a + h a l l i t u s o h j e l m a k s e e n + h a l l i t u s o h j e l m a n + h a l l i t u s o h j e l m i a + h a l l i t u s o h j e l m i e n + h a l l i t u s o s a p u o l e t + h a l l i t u s o s a p u o l i + h a l l i t u s o s a s t o n i + h a l l i t u s p a i k k o j a + h a l l i t u s p i i r e i s s ä + h a l l i t u s p i i r e i s t ä + h a l l i t u s p i i r i e n + h a l l i t u s p i i r i t + h a l l i t u s p o l i t i i k a l l e + h a l l i t u s p o l i t i i k a n + h a l l i t u s p o l i t i i k a s s a + h a l l i t u s p o l i t i i k a s t a + h a l l i t u s p o l i t i i k k a + h a l l i t u s p o l i t i i k k a a + h a l l i t u s p o l i t i i k k a a n + h a l l i t u s p o l i t i i k k o i h i n + h a l l i t u s p o l i t i i k o i s s a + h a l l i t u s p r o p a g a n d a a n + h a l l i t u s p r o p a g a n d a n + h a l l i t u s p u o l e e n + h a l l i t u s p u o l u e + h a l l i t u s p u o l u e e n + h a l l i t u s p u o l u e e n a + h a l l i t u s p u o l u e e s e e n + h a l l i t u s p u o l u e e t + h a l l i t u s p u o l u e i d e n + h a l l i t u s p u o l u e i l l a + h a l l i t u s p u o l u e i l l e + h a l l i t u s p u o l u e i s i i n + h a l l i t u s p u o l u e i s s a + h a l l i t u s p u o l u e i s t a + h a l l i t u s p u o l u e i t a + h a l l i t u s p u o l u e t t a + h a l l i t u s r a k e n t e e n + h a l l i t u s r a k e n t e i d e n + h a l l i t u s r a k e n t e i t a + h a l l i t u s r a p o r t t e j a + h a l l i t u s r a t k a i s u s t a + h a l l i t u s r y h m i e n + h a l l i t u s s e k t o r i l l a + h a l l i t u s s o p i m u k s e e n + h a l l i t u s s o p i m u k s e s s a + h a l l i t u s s o p i m u s + h a l l i t u s s u u n t a u k s e n + h a l l i t u s s ä ä n n ö i s s ä + h a l l i t u s t a + h a l l i t u s t a h o t + h a l l i t u s t a m m e + h a l l i t u s t a p a a + h a l l i t u s t a s o i l l a + h a l l i t u s t a s o l l a + h a l l i t u s t a s o n + h a l l i t u s t e h t ä v i e n + h a l l i t u s t e h t ä v i ä + h a l l i t u s t e m m e + h a l l i t u s t e n + h a l l i t u s t e n p ä ä m i e h e t + h a l l i t u s t e n p ä ä m i e h i ä + h a l l i t u s t e n p ä ä m i e s t e n + h a l l i t u s t e n v ä l i n e n + h a l l i t u s t e n v ä l i s e e n + h a l l i t u s t e n v ä l i s e l l e + h a l l i t u s t e n v ä l i s e l l ä + h a l l i t u s t e n v ä l i s e m p i + h a l l i t u s t e n v ä l i s e n + h a l l i t u s t e n v ä l i s e n ä + h a l l i t u s t e n v ä l i s e s s ä + h a l l i t u s t e n v ä l i s e s t ä + h a l l i t u s t e n v ä l i s e t + h a l l i t u s t e n v ä l i s i i n + h a l l i t u s t e n v ä l i s i s s ä + h a l l i t u s t e n v ä l i s i s t ä + h a l l i t u s t e n v ä l i s i ä + h a l l i t u s t e n v ä l i s t ä + h a l l i t u s t e n v ä l i s y y t t ä + h a l l i t u s t i i m i n + h a l l i t u s t y ö r y h m ä l l e e n + h a l l i t u s t y ö s s ä + h a l l i t u s t y ö s s ä ä n + h a l l i t u s v a a l e i s s a + h a l l i t u s v a i h d o k s e n + h a l l i t u s v a l l a n + h a l l i t u s v a l t a + h a l l i t u s v a l t a a + h a l l i t u s v a s t u u n + h a l l i t u s v a s t u u s s a + h a l l i t u s v a s t u u t a + h a l l i t u s v i e r a i l u t + h a l l i t u s v i r a n o m a i s e t + h a l l i t u s v i r a n o m a i s i l l e + h a l l i t u s v i r a n o m a i s t e n + h a l l u s s a a n + h a l l u s s a p i d o n + h a l m a h e r a n k u h a n k e i t t ä j ä + h a l m a h e r a n m o n a r k k i + h a l o e f e k t i + h a l o g e e n i l a m p p u + h a l o g e e n i l a m p u i s t a + h a l p a a + h a l p a a n + h a l p a h i n t a i s t a + h a l p a k o r k o i s i a + h a l p a k o r k o i s t a + h a l p a l e n t o a l a a + h a l p a l e n t o j e n + h a l p a l e n t o y h t i ö + h a l p a l e n t o y h t i ö i d e n + h a l p a l e n t o y h t i ö i d e n k i n + h a l p a l e n t o y h t i ö i h i n + h a l p a l e n t o y h t i ö i k s i + h a l p a l e n t o y h t i ö i l l e + h a l p a l e n t o y h t i ö i s s ä + h a l p a l e n t o y h t i ö i s t ä + h a l p a l e n t o y h t i ö i t ä + h a l p a l e n t o y h t i ö n + h a l p a l e n t o y h t i ö s e k t o r i i n + h a l p a l e n t o y h t i ö s t ä + h a l p a l e n t o y h t i ö t + h a l p a l e n t o y h t i ö t ä + h a l p a m a i s e k s i + h a l p a m a i s i i n + h a l p a t u o n n i n + h a l p a t u o n n i s t a + h a l p a t u o n t i + h a l p a t u o n t i a + h a l p a t u o n t i i n + h a l p a t u o n t i l i h a s t a + h a l p a t u o t t e e t + h a l p a t u o t t e i t a + h a l p a t y ö p a i k k o i h i n + h a l p a t y ö v o i m a a + h a l p a t y ö v o i m a a n + h a l p a t y ö v o i m a k s i + h a l p a t y ö v o i m a l l e + h a l p a t y ö v o i m a n + h a l p a t y ö v o i m a o n g e l m a a + h a l p a t y ö v o i m a s t a + h a l p a t y ö v o i m a v a r a s t o n a + h a l p e n e e + h a l p e n e m i s e n + h a l p e n e m i s e s t a + h a l p o j a + h a l p o j a k a a n + h a l p o j e n + h a l t i j a a + h a l t i j a k u m m i n a + h a l t i j a l l e + h a l t i j a n + h a l t i j a p a r a t + h a l t i j o i t a + h a l t i o i s s a a n + h a l t u u n s a + h a l u a a + h a l u a a k i n + h a l u a a k o + h a l u a i s i + h a l u a i s i k a a n + h a l u a i s i m m e + h a l u a i s i m m e k i n + h a l u a i s i n + h a l u a i s i n k i n + h a l u a i s i t t e + h a l u a i s i v a t + h a l u a k a a n + h a l u a m a + h a l u a m a a m m e + h a l u a m a a n + h a l u a m a a n s a + h a l u a m a l l a m m e + h a l u a m a m m e + h a l u a m a n + h a l u a m a n s a + h a l u a m a s t a a n + h a l u a m a t t a + h a l u a m i a a n + h a l u a m i l l a a n + h a l u a m m e + h a l u a m m e h a n + h a l u a m m e k i n + h a l u a m m e k o + h a l u a n + h a l u a n k i n + h a l u a n k o + h a l u a n s a + h a l u a t + h a l u a t k o + h a l u a t t e + h a l u a t t e k o + h a l u a v a n + h a l u a v a n n e + h a l u a v a n s a + h a l u a v a t + h a l u a v a t k o + h a l u a v i a + h a l u a v i e n + h a l u a v i l l e + h a l u k k a a l t a + h a l u k k a a m m i k s i + h a l u k k a a m p i + h a l u k k a a m p i a + h a l u k k a a t + h a l u k k a i d e n + h a l u k k a i t a + h a l u k k u u d e s t a + h a l u k k u u d e s t a a n + h a l u k k u u t e m m e + h a l u k k u u t e n s a + h a l u k k u u t t a + h a l u k k u u t t a a n + h a l u k k u u t t a m m e + h a l u k s i + h a l u l l e + h a l u l l e e n + h a l u m m e + h a l u n + h a l u n a + h a l u n n e e t + h a l u n n e v a t + h a l u n n u t + h a l u n n u t k i n + h a l u n s a + h a l u s i + h a l u s i m m e + h a l u s i m m e k i n + h a l u s i m m e p a + h a l u s i n + h a l u s i t t e + h a l u s i t t e k i n + h a l u s i v a t + h a l u s i v a t p a + h a l u s t a + h a l u s t a m m e + h a l u t a a n + h a l u t a a n k i n + h a l u t a a n k o + h a l u t e s s a + h a l u t e s s a a n + h a l u t e s s a m m e + h a l u t e s s a n n e + h a l u t t a e s s a + h a l u t t a i s i i n + h a l u t t i i n + h a l u t t i i n p a + h a l u t t o m a m p i + h a l u t t o m a m p i a + h a l u t t o m a t + h a l u t t o m i a + h a l u t t o m i m m i s t a + h a l u t t o m u u d e s t a + h a l u t t o m u u t t a + h a l u t t u a + h a l u t t u i h i n + h a l u t t u j a + h a l u u n + h a l v a a n n u t e t t a v a + h a l v a a n n u t t a a + h a l v a a n n u t t a m a t t a + h a l v a a n t u n e e l t a + h a l v a a n t u n e e s t a + h a l v a k s i + h a l v a l l a + h a l v a n + h a l v a s t a + h a l v a t + h a l v e k s i i + h a l v e k s i t a a n + h a l v e k s i t t a v a a + h a l v e k s i t t a v a m p a a + h a l v e k s i t t a v u u t t a + h a l v e k s i t t u j a + h a l v e k s u e n + h a l v e k s u n t a a + h a l v e k s u t u i m m i s t a + h a l v e m m a k s i + h a l v e m m a l l a + h a l v e m m a l l a k i n + h a l v e m m a n + h a l v e m m i k s i + h a l v e m m i n + h a l v e m m i s t a + h a l v e m p a a + h a l v e m p a n a + h a l v e m p i + h a l v e m p i a + h a l v e m p i e n + h a l v e m p i i n + h a l v e m p i n a + h a l v e n t a m a l l a + h a l v e n t a m i s a s i a s s a + h a l v e n t a m i s e n + h a l v e n t a v a a + h a l v e n t a v a n + h a l v e n t a v a n a + h a l v e n t a v i a + h a l v e n t u a + h a l v i m m a k s i + h a l v i m m a l l a + h a l v i m m a n + h a l v i m m a t + h a l v i m p i a + h a l v i m p i e n + h a l v i n + h a l v i n t a + h a l v o i k s i + h a l v o i l l a + h a l v o i l l e + h a l v o i s s a + h a m a n a m i + h a m e k y t t ä + h a m m a s a k a n k a a l i + h a m m a s a m a l g a a m i + h a m m a s a m a l g a a m i n + h a m m a s e l o h o p e a + h a m m a s h a r j a t k i n + h a m m a s h o i d o n + h a m m a s h o i d o s s a + h a m m a s h o i t a j a s t a + h a m m a s h o i t o a + h a m m a s h o i t o l a i t o k s i s s a + h a m m a s i m p l a n t t i + h a m m a s k a l a k i i n t i ö t ä + h a m m a s k e i j u + h a m m a s k i i l l e + h a m m a s k i i l l e t t ä + h a m m a s k i r u r g i a s s a + h a m m a s l a n k a + h a m m a s l ä ä k ä r e i d e n + h a m m a s l ä ä k ä r i n + h a m m a s m i t t a r i + h a m m a s n o k k a k o l i b r i + h a m m a s p a i k o i s s a + h a m m a s r a t a + h a m m a s r a t t a a t + h a m m a s s i l l i + h a m m a s s ä d e k a l a + h a m m a s s ä r k y ä + h a m m a s t a m m i + h a m m a s t e k n i k k o + h a m m a s v a l a a t + h a m p a a n k o l o o n + h a m p a a t o n t a + h a m p a a t t o m i a + h a m p a i d e n + h a m p a i t a + h a m p a i t a a n + h a m p p u a + h a m p p u a l a + h a m p p u a l a n + h a m p p u m a r s s i + h a m p p u o l u t + h a m p p u s o p i m u k s i a + h a m p p u ö l j y + h a m p u n + h a m p u n t u o t a n t o a l a a + h a m p u n v i l j e l y + h a m p u s t a + h a m s t e r i a + h a m u a a + h a n a k o + h a n a s a a r i + h a n a t + h a n g o i t t e l e v a t + h a n h e n j u o k s u + h a n h e n m a k s a + h a n h e n m a k s a a + h a n h e n m a k s a n + h a n h e n n o k k a v a l a s + h a n h e n t a t a r + h a n h i e m o + h a n h i k o r p p i k o t k a + h a n i t + h a n k a k o h o k k i + h a n k a l a a + h a n k a l a a n + h a n k a l a l l a + h a n k a l a l t a + h a n k a l a m m a k s i + h a n k a l a m m a l t a + h a n k a l a m m a n + h a n k a l a m m a s s a + h a n k a l a m m i s t a + h a n k a l a m p a a + h a n k a l a m p a n a + h a n k a l a m p i + h a n k a l a m p i a + h a n k a l a n + h a n k a l a n a + h a n k a l a s s a + h a n k a l a s t a + h a n k a l a t + h a n k a l i a + h a n k a l i e n + h a n k a l i k s i + h a n k a l i m m a k s i + h a n k a l i m m a t + h a n k a l i m m i s t a + h a n k a l i m p a a n + h a n k a l i m p i a + h a n k a l i n + h a n k a l i n t a + h a n k a l i s s a + h a n k a l o i t t a a + h a n k a l o i t t a i s i + h a n k a l o i t t a n u t + h a n k a l o i t t a v a t + h a n k a l o i t u m i n e n + h a n k a l o i t u u + h a n k a l o i t u v a t + h a n k a l u u d e t + h a n k a l u u k s i a + h a n k a l u u k s i i n + h a n k a l u u k s i s t a + h a n k a l u u k s i t t a + h a n k a l u u t e e n + h a n k a u s s ä h k ö + h a n k e a l o i h i n + h a n k e a s i a k i r j o i h i n + h a n k e a s i a k i r j o j a + h a n k e h a k e m u k s e n + h a n k e h a k e m u k s i a + h a n k e h a k e m u s t a + h a n k e h a l l i n n o i n t i + h a n k e h a l l i n n o i n t i a + h a n k e h a l l i n t o m a l l i n + h a n k e i n v e s t o i n n e i s t a + h a n k e j o h t a j i e n + h a n k e j o u k k o v e l k a k i r j a t + h a n k e j o u k k o v e l k a k i r j o i h i n + h a n k e j o u k k o v e l k a k i r j o i l l a + h a n k e j o u k k o v e l k a k i r j o i s t a + h a n k e j o u k k o v e l k a k i r j o j a + h a n k e j o u k k o v e l k a k i r j o j e n + h a n k e j o u k o n + h a n k e k e h i t t ä m i n e n + h a n k e k o h t a i n e n + h a n k e k o h t a i s e l l a + h a n k e k o h t a i s e s t i + h a n k e k o h t a i s i l l a + h a n k e k o k o n a i s u u s + h a n k e k o k o n a i s u u t e e n + h a n k e k o o r d i n a a t t o r e i d e n + h a n k e k o o r d i n a a t t o r e i t a + h a n k e k u m p p a n e i k s i + h a n k e k u m p p a n e i l l a + h a n k e k u m p p a n e i l l e + h a n k e k u m p p a n e i s t a + h a n k e k u m p p a n e i t a + h a n k e k u m p p a n i e n + h a n k e k u m p p a n i t + h a n k e l u e t t e l o + h a n k e l u e t t e l o a + h a n k e l u e t t e l o n + h a n k e l u e t t e l o o n + h a n k e l ä h t ö i s i ä + h a n k e m a h d o l l i s u u k s i s t a + h a n k e m e k a n i s m e i l l e + h a n k e o b l i g a a t i o i d e n + h a n k e o b l i g a a t i o i h i n + h a n k e o b l i g a a t i o i k s i + h a n k e o b l i g a a t i o i l l a + h a n k e o b l i g a a t i o i s t a + h a n k e o b l i g a a t i o i t a + h a n k e o b l i g a a t i o t + h a n k e o h j e l m i a + h a n k e o r g a n i s a a t t o r e i t a + h a n k e p a k e t t i + h a n k e p a k e t t i a + h a n k e r a h o i t u k s e l l a + h a n k e r a h o i t u k s e n + h a n k e r a h o i t u s + h a n k e r a h o i t u s p ä ä t ö k s i ä + h a n k e r a h o i t u s t a + h a n k e s e l v i t y s t e n + h a n k e s i s ä l t ö + h a n k e s o p i m u s + h a n k e s o v e l l u s t e n + h a n k e s u u n n i t e l m a s s a + h a n k e s u u n n i t t e l u a + h a n k e s u u n n i t t e l u n + h a n k e t a l o u s a r v i o + h a n k e t a s o l l a + h a n k e t a s o n + h a n k e t t a + h a n k e t u e n + h a n k e t u k e e n + h a n k e t y y p p i e n + h a n k e t y ö + h a n k e t y ö n t e k i j ä + h a n k e t y ö r y h m i e n + h a n k e t y ö r y h m i ä + h a n k e v a l i n n a s s a + h a n k e v a l i n t a + h a n k e v a s t a a v a t + h a n k e v a s t a a v i l t a + h a n k e v y ö h y k k e i t ä + h a n k i n n a s t a + h a n k i n n a t + h a n k i n n o i l l a + h a n k i n n o i s s a + h a n k i n n o i s t a + h a n k i n n o i s t a a n + h a n k i n t a a + h a n k i n t a d i r e k t i i v e i h i n + h a n k i n t a d i r e k t i i v e i s t ä + h a n k i n t a d i r e k t i i v i e n + h a n k i n t a e h t o j e n + h a n k i n t a h a n k k e i d e n + h a n k i n t a h i n n a s t a + h a n k i n t a h i n t a + h a n k i n t a h i n t o i h i n + h a n k i n t a h i n t o j e n + h a n k i n t a j ä r j e s t e l m i e n + h a n k i n t a j ä r j e s t e l m i i n + h a n k i n t a j ä r j e s t e l m i s s ä + h a n k i n t a j ä r j e s t e l m i s t ä + h a n k i n t a j ä r j e s t e l m i ä + h a n k i n t a j ä r j e s t e l m ä + h a n k i n t a j ä r j e s t e l m ä n + h a n k i n t a j ä r j e s t e l m ä s s ä + h a n k i n t a j ä r j e s t e l m ä t + h a n k i n t a j ä r j e s t e l m ä ä + h a n k i n t a j ä r j e s t e l m ä ä n + h a n k i n t a j ä s e n v a l t i o s s a + h a n k i n t a k e s k u k s e n + h a n k i n t a k e s k u k s i s t a + h a n k i n t a k e s k u s + h a n k i n t a k e s k u s t a + h a n k i n t a k e t j u a + h a n k i n t a k e t j u a a n + h a n k i n t a k e t j u j e n + h a n k i n t a k e t j u n + h a n k i n t a k e t j u s s a + h a n k i n t a k r i t e e r e i s s ä + h a n k i n t a k u s t a n n u k s i a + h a n k i n t a k u s t a n n u k s i s t a + h a n k i n t a k u s t a n n u s t e n + h a n k i n t a k ä y t ä n t ö j ä + h a n k i n t a l a i n s ä ä d ä n n ö n + h a n k i n t a l ä h t e e n s ä + h a n k i n t a l ä h t e e n ä + h a n k i n t a l ä h t e e t + h a n k i n t a l ä h t e i d e m m e + h a n k i n t a l ä h t e i d e n + h a n k i n t a l ä h t e i s i i n + h a n k i n t a l ä h t e i s t ä + h a n k i n t a l ä h t e i t ä + h a n k i n t a m a a n + h a n k i n t a m a a s t a + h a n k i n t a m a h d o l l i s u u k s i a + h a n k i n t a m a k s u j a + h a n k i n t a m a r k k i n a t + h a n k i n t a m a r k k i n o i d e n + h a n k i n t a m a r k k i n o i h i n + h a n k i n t a m a r k k i n o i l l a + h a n k i n t a m a r k k i n o i l l e + h a n k i n t a m a r k k i n o i l t a + h a n k i n t a m e n e t t e l y + h a n k i n t a m e n e t t e l y i h i n + h a n k i n t a m e n e t t e l y i s s ä + h a n k i n t a m e n e t t e l y i s s ä ä n + h a n k i n t a m e n e t t e l y i s t ä + h a n k i n t a m e n e t t e l y i t ä + h a n k i n t a m e n e t t e l y j e m m e + h a n k i n t a m e n e t t e l y j e n + h a n k i n t a m e n e t t e l y j ä + h a n k i n t a m e n e t t e l y j ä ä n + h a n k i n t a m e n e t t e l y n + h a n k i n t a m e n e t t e l y s s ä + h a n k i n t a m e n e t t e l y s t ä + h a n k i n t a m e n e t t e l y t + h a n k i n t a m e n e t t e l y y n + h a n k i n t a m e n e t t e l y ä + h a n k i n t a n e u v o n t a a + h a n k i n t a n o r m i e n + h a n k i n t a o h j e i t a + h a n k i n t a p e r i a a t t e e t + h a n k i n t a p e r i a a t t e i s i i n s a + h a n k i n t a p o l i t i i k a l l a + h a n k i n t a p o l i t i i k a l l e + h a n k i n t a p o l i t i i k a n + h a n k i n t a p o l i t i i k a s s a + h a n k i n t a p o l i t i i k a s t a + h a n k i n t a p o l i t i i k k a + h a n k i n t a p o l i t i i k k a a + h a n k i n t a p o l i t i i k k a m m e + h a n k i n t a p o l i t i i k k o j e n s a + h a n k i n t a p o l i t i i k o i l l a + h a n k i n t a p r o s e s s i n + h a n k i n t a p u o l t a + h a n k i n t a p ä ä t ö k s i s s ä + h a n k i n t a p ä ä t ö s t e n s ä + h a n k i n t a r a j o i t u k s i a + h a n k i n t a s o p i m u k s e e n + h a n k i n t a s o p i m u k s e n + h a n k i n t a s o p i m u k s e t + h a n k i n t a s o p i m u k s i a + h a n k i n t a s o p i m u k s i i n + h a n k i n t a s o p i m u k s i s s a + h a n k i n t a s o p i m u k s i s t a + h a n k i n t a s o p i m u s + h a n k i n t a s o p i m u s j ä r j e s t e l m ä n + h a n k i n t a s o p i m u s m e n e t t e l y j e n + h a n k i n t a s o p i m u s m e n e t t e l y s s ä + h a n k i n t a s o p i m u s t a + h a n k i n t a s o p i m u s t e n + h a n k i n t a s u u n n i t e l m a + h a n k i n t a s ä ä n n ö t + h a n k i n t a s ä ä n t ö j e n + h a n k i n t a s ä ä n t ö j ä + h a n k i n t a t a r v e + h a n k i n t a t i l a n t e e n + h a n k i n t a t o i m e n p i t e e t + h a n k i n t a t o i m i s t a + h a n k i n t a t u k e a + h a n k i n t a v a i h t o e h d o i s t a a n + h a n k i n t a v a i k e u k s i s t a + h a n k i n t a v i r a n o m a i n e n + h a n k i n t a v i r a n o m a i s e l l a + h a n k i n t a v i r a n o m a i s e l l e + h a n k i n t a v i r a n o m a i s e n + h a n k i n t a v i r a n o m a i s e t + h a n k i n t a v i r a n o m a i s i a + h a n k i n t a v i r a n o m a i s i l l a + h a n k i n t a v i r a n o m a i s i l l e + h a n k i n t a v i r a n o m a i s i l t a + h a n k i n t a v i r a n o m a i s t e n + h a n k i n t a v i r a s t o j e n + h a n k i n t a v i r a s t o n + h a n k i n t a v ä l i n e i d e n + h a n k i n t a y k s i k k ö + h a n k i n t a y k s i k k ö j ä + h a n k i n t a y k s i k ö i d e n + h a n k i n t a y k s i k ö i t ä + h a n k i n t a y k s i k ö l l e + h a n k i n t a y k s i k ö n + h a n k i n t a y k s i k ö t + h a n k i n t a y r i t y k s i n ä + h a n k i n t o i h i n + h a n k i n t o j a + h a n k i n t o j e n + h a n k i t t a e s s a + h a n k i t t a v a + h a n k i t t u j a + h a n k i t t u j e n + h a n k i t u n + h a n k k e e k s i + h a n k k e e l l a + h a n k k e e l l e + h a n k k e e n + h a n k k e e n a + h a n k k e e n s a + h a n k k e e s e e n + h a n k k e e s s a + h a n k k e e s t a + h a n k k e e t + h a n k k e i d e n + h a n k k e i k s i + h a n k k e i l l a + h a n k k e i l l a a n + h a n k k e i l l e + h a n k k e i l t a + h a n k k e i n a + h a n k k e i s i i n + h a n k k e i s s a + h a n k k e i s t a + h a n k k e i s t a m m e + h a n k k e i t a + h a n k k e i t a m m e + h a n k k i a + h a n k k i a k s e e n + h a n k k i e s s a a n + h a n k k i i + h a n k k i k a a m m e + h a n k k i m a a n + h a n k k i m a l l a + h a n k k i m a n s a + h a n k k i m i a a n + h a n k k i m i s a i k o i n e e n + h a n k k i m i s e k s i + h a n k k i m i s e n + h a n k k i m i s e s t a + h a n k k i m i s k u s t a n n u s t e n + h a n k k i m i s l ä h t e i s t ä + h a n k k i m i s m e n e t t e l y ä + h a n k k i m i s t a + h a n k k i n u t + h a n k k i u d u t t u + h a n k k i u t u a + h a n k k i u t u k a a + h a n k k i u t u m a a n + h a n k k i v a t + h a n k o n i e m i + h a n o j a + h a n s a k a u p u n k e j a + h a n s a k o r t t e l i + h a n s a l i i t t o + h a n s a l i i t t o a + h a n s a s a t a m a + h a n s k a s s a + h a n t i t + h a p a n k e r m a + h a p a n k i r s i k k a + h a p a n k i r s i k o i d e n + h a p a n k i r s i k o i t a + h a p a n n a a m a i s i a + h a p a t t a m i n e n + h a p a t u s r u u k k u + h a p e n t u o t a n t o + h a p e n t u o t a n t o a + h a p e r o n v i e r a s + h a p e t u s l u k u + h a p o t t u m i s e s t a + h a p p a m o i t t a n e e t + h a p p a m o i t t a v i i n + h a p p a m o i t u m i s e n + h a p p a m o i t u m i s o h j e l m a a + h a p p a m o i t u m i s o n g e l m a + h a p p a m o i t u m i s o n g e l m a n + h a p p a m o i t u m i s o n g e l m i s t a + h a p p a m o i t u m i s s t r a t e g i a + h a p p a m o i t u m i s s t r a t e g i a a n + h a p p a m o i t u m i s s t r a t e g i a k s i + h a p p a m o i t u m i s t a + h a p p a m o i t u m i s v a u r i o i d e n + h a p p a m u u d e n s ä ä t ö a i n e + h a p p e a + h a p p i h o i t o + h a p p i l a i t t e i t a + h a p p i p i t o i s u u s + h a p p i s a t u r a a t i o + h a p p i s i s ä l t ö ä + h a p p i v a r a s t o n + h a p p o h y ö k k ä y s + h a p p o i s k u + h a p p o k l o r i d i t + h a p p o k y l v y s s ä + h a p p o l a s k e u m a n + h a p p o s a d e + h a p p o s a d e t t a + h a p p o s a t e e t + h a p p o s a t e i d e n + h a p p o s a t e i s t a + h a p p o s a t e i t a + h a p p o t e s t i + h a p p o t ä h d e + h a p p o v a k i o + h a p s i l u i k k a + h a r a j u u r i + h a r a k a n k e l l o + h a r a k k a h a r l e k i i n i + h a r a k k a m e s i k k o + h a r a k k a m y l l y + h a r a k k a t a s k u t + h a r a v a k o n e + h a r h a a + h a r h a a n j o h d e t u s t a + h a r h a a n j o h t a m i s t a + h a r h a a n j o h t a v a a + h a r h a a n j o h t a v a m p i + h a r h a a n j o h t a v a n + h a r h a a n j o h t a v a s t a + h a r h a a n j o h t a v a t + h a r h a a n j o h t a v i a + h a r h a a n j o h t a v i e n + h a r h a a n j o h t a v i i n + h a r h a a n j o h t a v i k s i + h a r h a a n j o h t a v i l t a + h a r h a a n j o h t a v i s t a + h a r h a k u v a + h a r h a k u v i a + h a r h a k u v i s t a + h a r h a k u v i t e l m a + h a r h a k u v i t e l m a a + h a r h a k u v i t e l m a a n + h a r h a k u v i t e l m a k s i + h a r h a k u v i t e l m a s t a + h a r h a k u v i t e l m i a + h a r h a k u v i t e l m i e n + h a r h a k u v i t e l m i i n + h a r h a k u v i t e l m i k s i + h a r h a k u v i t e l m i s t a + h a r h a k ä s i t y k s e s s ä + h a r h a k ä s i t y k s i s t ä + h a r h a k ä s i t y k s i ä + h a r h a k ä s i t y s + h a r h a l u u l o j a + h a r h a l u u l o t + h a r h a n ä k e m y k s e e n + h a r h a p o l u i l l e + h a r h a u t t a a k s e n n e + h a r h a u t t a m i n e n + h a r h a u t t a m i s e k s i + h a r h a u t u i v a t + h a r h a u t u s k e i n o + h a r h a u t u s p o l i t i i k k a + h a r h a u t u s y r i t y s + h a r j a k o s k e l o + h a r j a k o t k a + h a r j a l a m m a s + h a r j a m a k i + h a r j a n e i l i k k a + h a r j a n n e l i h a s + h a r j a p ö l l ö + h a r j a s g e k k o + h a r j a s u s i + h a r j a s v e h n ä + h a r j o i t a m m e + h a r j o i t e t a a n + h a r j o i t e t t a v a + h a r j o i t e t t i i n + h a r j o i t e t u s t a + h a r j o i t t a a + h a r j o i t t a a k s e e n + h a r j o i t t a e s s a a n + h a r j o i t t a e s s a m m e + h a r j o i t t a i s i + h a r j o i t t a j a n + h a r j o i t t a j a t + h a r j o i t t a j i l l e + h a r j o i t t a j i l t a + h a r j o i t t a k a a m m e + h a r j o i t t a m a + h a r j o i t t a m a a + h a r j o i t t a m a a n + h a r j o i t t a m a l l a n n e + h a r j o i t t a m a m m e + h a r j o i t t a m a n + h a r j o i t t a m a s t a + h a r j o i t t a m a s t a a n + h a r j o i t t a m a t t a + h a r j o i t t a m i s e e n + h a r j o i t t a m i s e k s i + h a r j o i t t a m i s e l l e + h a r j o i t t a m i s e n + h a r j o i t t a m i s e s t a + h a r j o i t t a m i s t a + h a r j o i t t a m i s v a p a u t e e n + h a r j o i t t a n e e t + h a r j o i t t a n u t + h a r j o i t t a v a n + h a r j o i t t a v a t + h a r j o i t t a v i a + h a r j o i t t a v i e n + h a r j o i t t a v i l l e + h a r j o i t t a v i s t a + h a r j o i t t e l i j a l ä ä k ä r e i t ä + h a r j o i t t e l i j a n + h a r j o i t t e l i j a o h j e l m a n + h a r j o i t t e l i j a v a i h t o + h a r j o i t t e l i j a v a i h t o a + h a r j o i t t e l i j o i l l e + h a r j o i t t e l u a + h a r j o i t t e l u j a k s o j a + h a r j o i t t e l u j a k s o j e n + h a r j o i t t e l u j e n + h a r j o i t t e l u j ä r j e s t e l m i ä + h a r j o i t t e l u j ä r j e s t e l m ä s t ä + h a r j o i t t e l u k e s k u s + h a r j o i t t e l u k o k e m u s t a + h a r j o i t t e l u k u r s s e i l l e + h a r j o i t t e l u l e i r e i l l ä + h a r j o i t t e l u m a a s t o + h a r j o i t t e l u m a h d o l l i s u u k s i a + h a r j o i t t e l u o h j e l m a a + h a r j o i t t e l u o h j e l m i a + h a r j o i t t e l u p a i k k a a + h a r j o i t t e l u p a i k k a a n + h a r j o i t t e l u p a i k k o j a + h a r j o i t t e l u p a i k k o j e n + h a r j o i t t e l u s o p i m u s t e n + h a r j o i t t e l u t o i m i e n + h a r j o i t t e l u u n + h a r j o i t u k s i l l a + h a r j o i t u k s i s s a + h a r j o i t u s h u o n e i t a + h a r j o i t u s k i r j a a + h a r j o i t u s k o n e e n + h a r j o i t u s k u r s s e j a + h a r j o i t u s k u r s s i t + h a r j o i t u s l e i r i k s i + h a r j o i t u s l e i r i t + h a r j o i t u s l e n n o t + h a r j o i t u s l e n t o j a a n + h a r j o i t u s l e n t o j e n + h a r j o i t u s l i n j a + h a r j o i t u s v a s t u s t a j a n a a n + h a r j u k e l t a l i e k o + h a r j u m a a + h a r j u s i n i s i i p i + h a r j u v a r p u s p ö l l ö + h a r k i n n a n + h a r k i n n a n a r v o i n e n + h a r k i n n a n v a r a a + h a r k i n n a n v a r a i s e s t i + h a r k i n n a n v a r a i s i l l a + h a r k i n n a n v a r a i s u u t t a + h a r k i n n a s s a + h a r k i n n a s t a + h a r k i n n e e t + h a r k i n n u t + h a r k i n t a a + h a r k i n t a a n + h a r k i n t a j a k s o + h a r k i n t a k a u d e l l e + h a r k i n t a k a u d e n + h a r k i n t a k a u d e s s a + h a r k i n t a k a u d e s t a + h a r k i n t a k a u s i + h a r k i n t a k a u t e e n + h a r k i n t a k y k y ä + h a r k i n t a m a r g i n a a l i n + h a r k i n t a n i + h a r k i n t a n s a + h a r k i n t a o i k e u d e n + h a r k i n t a p r o s e s s i + h a r k i n t a p r o s e s s i s s a + h a r k i n t a r y h m ä s s ä + h a r k i n t a s u o r i t u s + h a r k i n t a t a u k o + h a r k i n t a t a u k o a + h a r k i n t a v a i h e e s t a + h a r k i n t a v a l l a n + h a r k i n t a v a l t a + h a r k i n t a v a l t a a + h a r k i n t a v a l t a a n + h a r k i n t a v a l t a a n i + h a r k i n t a v a l t a a n s a + h a r k i t a + h a r k i t a a n + h a r k i t a a n k a a n + h a r k i t a a n k o + h a r k i t a k s e m m e + h a r k i t e n + h a r k i t e s s a a n + h a r k i t e s s a m m e + h a r k i t k a a + h a r k i t k a a m m e + h a r k i t s e e + h a r k i t s e e k i n + h a r k i t s e m a a n + h a r k i t s e m a t o n t a + h a r k i t s e m a t t a + h a r k i t s e m a t t o m a a n + h a r k i t s e m a t t o m a k s i + h a r k i t s e m a t t o m a n + h a r k i t s e m a t t o m a n a + h a r k i t s e m a t t o m a t + h a r k i t s e m a t t o m i a + h a r k i t s e m a t t o m i e n + h a r k i t s e m a t t o m i i n + h a r k i t s e m a t t o m i l l a + h a r k i t s e m a t t o m i l t a + h a r k i t s e m a t t o m i m m i s t a + h a r k i t s e m i s e n + h a r k i t s e m i s t a + h a r k i t s e m m e + h a r k i t s e t t e k o + h a r k i t s e v a a + h a r k i t s e v a m m i n + h a r k i t s e v a m p a a + h a r k i t s e v a m p i + h a r k i t s e v a t + h a r k i t s i m m e + h a r k i t s i s i + h a r k i t s i s i m m e + h a r k i t s i s i v a t + h a r k i t t a e s s a + h a r k i t t a v a + h a r k i t t a v a k s i + h a r k i t t a v a n a + h a r k i t t a v i e n + h a r k i t t a v i n a + h a r k i t t i i n + h a r k i t t u a + h a r k i t t u a a n + h a r k i t t u a n i + h a r k i t t u i h i n + h a r k i t t u j a + h a r k i t t u u n + h a r k i t u i n + h a r k i t u i s t a + h a r k i t u k s i + h a r k i t u l l a + h a r k i t u m m a n + h a r k i t u m m i n + h a r k i t u m p a a + h a r k i t u m p i a + h a r k i t u n + h a r k i t u s t a + h a r l e k i i n i h u u l i k a l a + h a r l e k i i n i k o r a l l i k ä ä r m e + h a r l e k i i n i n u o l i a i n e n + h a r l e k i i n i p e i p p o + h a r l e k i i n i t i k k a n e n + h a r m a a b u l b u l i + h a r m a a f i i v i + h a r m a a h a i k a r a + h a r m a a h a n k a k a r v e + h a r m a a h a p s i s t a + h a r m a a h a r j a l e p i n k ä i n e n + h a r m a a h i l k k a k u t o j a + h a r m a a h i l s e + h a r m a a h o m e + h a r m a a h u p p u r a s t a s + h a r m a a h u u h k a j a + h a r m a a h y l j e t t ä + h a r m a a h y l k e i d e n + h a r m a a k a i h i l e i k k a u s t a + h a r m a a k a i v a j a + h a r m a a k a r d i n a a l i + h a r m a a k a r h u + h a r m a a k a r h u t + h a r m a a k a u l u s b u l b u l i + h a r m a a k e i j u + h a r m a a k e i s a r i k a l a + h a r m a a k e l l o k a n e r v a + h a r m a a k e t t u + h a r m a a k i r j o r a s t a s + h a r m a a k i r j o v a h a k a s + h a r m a a k o i r a h a i + h a r m a a k o r v a m u u r a + h a r m a a k o r v a y ö k k ö + h a r m a a k o t t a r a i n e n + h a r m a a k r u u n u k e r t t u l i + h a r m a a k s i + h a r m a a k u l m a t y r a n n i + h a r m a a k u l t a r i n t a + h a r m a a k u r k k u b u l b u l i + h a r m a a k u r k k u k e r t t u l i + h a r m a a k u r k k u m e s i k k o + h a r m a a k u r k k u r a s t a s + h a r m a a k u r k k u t a p a k u l o + h a r m a a k u u k k e l i + h a r m a a k u v e m y y r ä + h a r m a a k v e e k a r i m a t k i j a + h a r m a a k y l k i r a s t a s + h a r m a a k ä r p ä s s i e n i + h a r m a a l e p i n k ä i s t y r a n n i + h a r m a a l e p p ä + h a r m a a l i n t u h a u k k a + h a r m a a l l a + h a r m a a l l e + h a r m a a l o i s t o l e p i n k ä i n e n + h a r m a a l o k k i + h a r m a a m a l v i k k i + h a r m a a m e r i m e t s o + h a r m a a m e t s ä p e u k a l o i n e n + h a r m a a m i n t t u + h a r m a a m u r m e l i + h a r m a a m u s t e s i e n i + h a r m a a n + h a r m a a n a a m a h a u k k a + h a r m a a n i e r i ä + h a r m a a n o r j a n h i r v i k o i r a + h a r m a a n u o l i a i n e n + h a r m a a o r a v a + h a r m a a o r a v a n + h a r m a a o t s a b u l b u l i + h a r m a a o t s a t i m a l i + h a r m a a p a l l o k a l a + h a r m a a p a p u k a i j a + h a r m a a p e s ä s i e n i + h a r m a a p i h t a + h a r m a a p o s k i b u l b u l i + h a r m a a p u k u i s t e n + h a r m a a p y r s t ö k o t i n g a + h a r m a a p ä ä a l b a t r o s s i + h a r m a a p ä ä h a r l e k i i n i + h a r m a a p ä ä k a i j a + h a r m a a p ä ä k e r t t u l i + h a r m a a p ä ä l e p i n k ä i n e n + h a r m a a p ä ä l o k k i + h a r m a a p ä ä m e s i k k o + h a r m a a p ä ä m o n a r k k i + h a r m a a p ä ä r a s t a s + h a r m a a p ä ä s i r k k u + h a r m a a p ä ä s k y k a h l a a j a + h a r m a a p ä ä t a n s s i j a + h a r m a a p ä ä t i k k a + h a r m a a r a i t a h a u k k a + h a r m a a r i n t a k e r t t u l i + h a r m a a r i n t a m e s i k k o + h a r m a a r o u s k u + h a r m a a r ä ä t ä l i + h a r m a a s a h a r a u s k u + h a r m a a s a p e l i k o l i b r i + h a r m a a s a r a + h a r m a a s e l k ä r a s t a s + h a r m a a s i e p p o + h a r m a a s i e p p o m e s i k k o + h a r m a a s i i p i k o t i n g a + h a r m a a s i i p i k o t t a r a i n e n + h a r m a a s i i p i r a s t a s + h a r m a a s i l m ä b u l b u l i + h a r m a a s i r k k u + h a r m a a s s a + h a r m a a t + h a r m a a t a + h a r m a a t a p a k u l o + h a r m a a t u r s k a + h a r m a a t u r s k a a + h a r m a a t u r s k a n + h a r m a a t u u l i h a u k k a + h a r m a a t y r a n n i + h a r m a a t ä p l ä p e i p p o + h a r m a a v a h a n o k k a + h a r m a a v a l a s + h a r m a a v a l a s t a + h a r m a a v a l m u s k a + h a r m a a v a t s a b u l b u l i + h a r m a a v i h e r b u l b u l i + h a r m a a v i h e r m e s i k k o + h a r m a a v i i r u m e s i k k o + h a r m a a v i k l o + h a r m a i d e n + h a r m a i t a + h a r m i a + h a r m i l l i s e m p a a + h a r m i l l i s e t + h a r m i l l i s i n + h a r m i l l i s i n t a + h a r m i l l i s t a + h a r m i t t a a + h a r m i t t a v a m p a a + h a r m i t t o m a m p a a n + h a r m o n i a k e s k u s + h a r m o n i k k a y h t y e + h a r m o n i s e m m i n + h a r m o n i s o i d u m m a t + h a r m o n i s o i m a t t o m i i n + h a r m o n i s o i n n i n + h a r m o n i s o i n t i i n + h a r m o n i s o i n t i m e n e t t e l y j ä + h a r m o n i s o i n t i p r o s e s s i a + h a r m o n i s o i n t i p y r k i m y k s e t + h a r m o n i s o i t a v a + h a r m o n i s o i t u j e n + h a r m o n i s o i t u u + h a r p a t a + h a r p p a u k s e n + h a r p p a u k s i a + h a r p p a u k s i i n + h a r p p a u k s i n + h a r p p a u k s i s t a + h a r p p a u s a s k e l + h a r p p a u s t a + h a r r a s t a j a j ä r j e s t ö j e n + h a r r a s t a j a k a l a s t a j a + h a r r a s t a j a k a l a s t a j i e n + h a r r a s t a j a t e a t t e r i + h a r r a s t a j a t u o t t a j i a + h a r r a s t a j a t u o t t a j i e n + h a r r a s t a j i n a + h a r r a s t a n u t + h a r r a s t e i l m a i l i j a t + h a r r a s t e l i j a l e n t ä j i e n + h a r r a s t e l i j a p u u t a r h u r e i d e n + h a r r a s t e l i j a p u u t a r h u r i t + h a r r a s t e l i j a s o u t a j a n a + h a r r a s t e l i j a t a i t e i l i j o i d e n + h a r r a s t e l i j a t a s o a + h a r r a s t e l i j a t o i m i n t a a + h a r r a s t e l i j a u r h e i l u j ä r j e s t ö j e n + h a r r a s t e l i j a v ä ä r e n t ä j i ä + h a r r a s t e l i j a y h d i s t y s + h a r r a s t u s t o i m i n n a n + h a r r a s t u s t o i m i n n a s s a + h a r r i s o n i a + h a r r i s o n i l l e + h a r r i s o n i l t a + h a r r i s o n i n + h a r s o p i l v i + h a r t a a n + h a r t a i m m a t + h a r t a i n + h a r t a u s p a i k k a a + h a r t a u s p a i k k o j a + h a r t a u s p a i k k o j e n + h a r t e i l l e m m e + h a r t i a v y ö + h a r t i o i l l e e n + h a r v a a n a s u t t u j a + h a r v a a n a s u t t u j e n + h a r v a a n a s u t u i l l a + h a r v a a n a s u t u i l l e + h a r v a a n a s u t u i m m i l l a + h a r v a a n a s u t u i s s a + h a r v a a n a s u t u t + h a r v a i n v a l l a n + h a r v a i n v a l t a a + h a r v a i n v a l t o j a + h a r v a l u k u i s e l t a + h a r v a l u k u i s e m p i i n + h a r v a l u k u i s i i n + h a r v a l u k u i s i s t a + h a r v a t + h a r v e m m a t + h a r v e m m i s s a + h a r v e m p i i n + h a r v e n n e t t a v a + h a r v i n a i s e m m a k s i + h a r v i n a i s e m p a a + h a r v i n a i s e m p i a + h a r v i n a i s e n + h a r v i n a i s i a + h a r v i n a i s i a k i n + h a r v i n a i s l a a t u i s e n + h a r v i n a i s l ä ä k e a s e t u s + h a r v i n a i s l ä ä k k e e k s i + h a r v i n a i s l ä ä k k e e n + h a r v i n a i s l ä ä k k e e t + h a r v i n a i s l ä ä k k e i d e n + h a r v i n a i s l ä ä k k e i k s i + h a r v i n a i s l ä ä k k e i l l e + h a r v i n a i s l ä ä k k e i s t ä + h a r v i n a i s l ä ä k k e i t ä + h a r v i n a i s t a + h a r v i n a i s t e n + h a r v o i h i n + h a r v o i l l e + h a r v o i s s a + h a r v o i s t a + h a r v o j a + h a r v o j e n + h a s h i k s e n k ä y t t ä j ä + h a s i k s e n + h a s i s t a + h a s s e l p ä h k i n ä a l a n + h a s s e l p ä h k i n ä ö l j y n + h a s s e l p ä h k i n ö i d e n + h a s s i a + h a s s u a + h a s s u m p i + h a t a r i e n + h a t t u t e m p p u + h a t t u t e m p u n + h a t t u u n + h a t u s t a + h a t u s t a n n e + h a u d a t a + h a u d a t a k s e e n + h a u d a t k a a m m e + h a u d a t t a i s i i n + h a u d a t t a v a + h a u d u t u s p a t a + h a u e n l e u k a + h a u i s k ä ä n t ö + h a u k a t a + h a u k i a h v e n + h a u k i t e t r a + h a u k k a j ä r v i + h a u k k a p ö l l ö + h a u k k u n e i d e n + h a u k k u u + h a u k k u v a t + h a u k u t a a n + h a u l i t a u t i + h a u r a a l t a + h a u r a a m p a a + h a u r a a m p i + h a u r a a m p i a + h a u r a i m m i s t a + h a u r a i m p i a + h a u r a i t a + h a u r a s l o i k k o + h a u r a s t u v a t + h a u s a t + h a u s k a a + h a u s k a a k i n + h a u s k i n t a + h a u t a a m a a n + h a u t a a m i s e e n + h a u t a e s i n e + h a u t a j a i s e t + h a u t a j a i s i s t a + h a u t a j a i s j ä r j e s t e l y j e n + h a u t a j a i s k e l l o j e n + h a u t a j a i s k u s t a n n u k s e t + h a u t a j a i s p u h e + h a u t a j a i s s a a t t u e t t a + h a u t a k o h t a u s + h a u t a l e p a k o t + h a u t a m o n t u t + h a u t a p a i k k a + h a u t a p a i k k o j a + h a u t a u s k u s t a n n u k s e t + h a u t a u s m a a + h a u t a u s m a i d e n + h a u t a u s p a l v e l u j a + h a u t a u s p a l v e l u j e n + h a u t a u s p ä i v ä m ä ä r ä n + h a u t a u s t o i m i s t o j a + h a u t a u t u v a t + h a u t a v a j o a m a + h a u t u m a a n + h a v a h d u t t a m i s e e n + h a v a i j i l a i s e t + h a v a i j i n a l b a t r o s s i + h a v a i j i n e n g l a n t i + h a v a i j i n h i i r i h a u k k a + h a v a i j i n h y l j e + h a v a i j i n k e i j u + h a v a i j i n k o i r a + h a v a i j i n n o k i k a n a + h a v a i j i n v a r i s + h a v a i j i n v ä l s k ä r i + h a v a i j i p a i t a + h a v a i j i s a a r e t + h a v a i n n e e t + h a v a i n n o i n t i k y k y + h a v a i n n o i n t i m e n e t e l m i ä + h a v a i n n o i n t i m e n e t e l m ä t + h a v a i n n o i n t i t a p o j a + h a v a i n n o i n t i v a l m i u d e t + h a v a i n n o i s s a + h a v a i n n o l l i s e m p i + h a v a i n n o l l i s i m p i a + h a v a i n n o l l i s i n + h a v a i n n o l l i s t a a + h a v a i n n o l l i s t a a k s e n i + h a v a i n n o l l i s t a m i s e k s i + h a v a i n n o l l i s t a n + h a v a i n n o l l i s t a n e e t + h a v a i n n o l l i s t a v a t + h a v a i n n o l l i s t e t t a i s i i n + h a v a i n n u t + h a v a i n t o i h i n + h a v a i n t o i l m a p a l l o + h a v a i n t o j a + h a v a i n t o j e n + h a v a i n t o j ä r j e s t e l m ä t + h a v a i n t o m e n e t e l m i ä + h a v a i n t o p o i j u t + h a v a i n t o s a t e l l i i t e i s t a + h a v a i n t o t i e t o j a + h a v a i t a + h a v a i t a a n + h a v a i t a k s e e n + h a v a i t a k s e m m e + h a v a i t e s s a a n + h a v a i t e s s a n i + h a v a i t s e e + h a v a i t s e m a m m e + h a v a i t s e m a s t a m m e + h a v a i t s e m a t t a + h a v a i t s e m i a a n + h a v a i t s e m i s a s t e + h a v a i t s e m i s e k s i + h a v a i t s e m i s j ä r j e s t e l m i ä + h a v a i t s e m i s j ä r j e s t e l m ä + h a v a i t s e m i s k y n n y k s e n + h a v a i t s e m i s m e n e t e l m i e n + h a v a i t s e m i s m e n e t e l m i ä + h a v a i t s e m i s m e n e t e l m ä + h a v a i t s e m i s t a s o l l e + h a v a i t s e m i s t e k n i i k a s s a + h a v a i t s e m m e + h a v a i t s i + h a v a i t s i m m e + h a v a i t t a v a a + h a v a i t t a v i s s a + h a v a i t t a v i s t a + h a v a i t t i i n + h a v a i t t u a + h a v a i t t u i h i n + h a v a i t t u j a + h a v a i t u i s t a + h a v a i t u t + h a v i t t e l e t t e k o + h a v i t t e l e v a t + h a v u k a n t o j ä ä r ä + h a v u k e r t t u l i + h a v u m e t s i e n + h a v u m e t s ä v y ö h y k e + h a v u n u n n a + h e d e l m i e n + h e d e l m i e n o s t o k a u d e n + h e d e l m i e n p o i m i n t a a n + h e d e l m i i n + h e d e l m i s t ä + h e d e l m i ä + h e d e l m ä a l a l l a + h e d e l m ä a n n o k s e n + h e d e l m ä a n n o k s i a + h e d e l m ä b r a n d y + h e d e l m ä h i l l o j a + h e d e l m ä j a l o s t e i t a + h e d e l m ä j o g u r t i n + h e d e l m ä j o g u r t t i i n + h e d e l m ä k ä r p ä s e n + h e d e l m ä l a j i a + h e d e l m ä l a j i k e + h e d e l m ä l l i s e m m i l l ä + h e d e l m ä l l i s e m m ä l t ä + h e d e l m ä l l i s e m m ä t + h e d e l m ä l l i s e m p i + h e d e l m ä l l i s e m p i ä + h e d e l m ä l l i s e m p ä ä + h e d e l m ä l l i s e m p ä ä n + h e d e l m ä l l i s e n + h e d e l m ä l l i s e s t ä + h e d e l m ä l l i s i k s i + h e d e l m ä l l i s i n + h e d e l m ä l l i s i n t ä + h e d e l m ä l l i s i ä + h e d e l m ä l l i s t ä + h e d e l m ä l l i s y y s h o i t o j a + h e d e l m ä l l i s y y s o n g e l m a t + h e d e l m ä l l i s y y s o n g e l m i a + h e d e l m ä l l i s y y s o n g e l m i i n + h e d e l m ä l l i s y y s t a s o n + h e d e l m ä l u o k a s s a + h e d e l m ä m a r k k i n o i l l a + h e d e l m ä m e h u + h e d e l m ä m e h u d i r e k t i i v i k s i + h e d e l m ä m e h u i h i n + h e d e l m ä m e h u i l l e + h e d e l m ä m e h u i s s a + h e d e l m ä m e h u j a + h e d e l m ä m e h u j e n + h e d e l m ä m e h u n + h e d e l m ä m e h u s t a + h e d e l m ä m e h u t + h e d e l m ä m e h u u n + h e d e l m ä n k a s v a t t a j i e n + h e d e l m ä n s ä + h e d e l m ä n v i l j e l i j ä t + h e d e l m ä n v i l j e l i j ö i l l e + h e d e l m ä o h j e l m a + h e d e l m ä o h j e l m a a + h e d e l m ä o h j e l m a n + h e d e l m ä p o l i i s i n a + h e d e l m ä p u i d e n + h e d e l m ä p u i h i n + h e d e l m ä p u i s t a + h e d e l m ä p u i t a + h e d e l m ä p u u + h e d e l m ä p u u n i i t t y j e n + h e d e l m ä p u u n i i t t y j ä + h e d e l m ä p u u v i l j e l y n + h e d e l m ä s a d o s t a + h e d e l m ä s o k e r i p i t o i s u u s + h e d e l m ä s ä i l y k k e i d e n + h e d e l m ä t + h e d e l m ä t a r h o i s s a + h e d e l m ä t a r h o j e n + h e d e l m ä t i i v i s t e e s t ä + h e d e l m ä t t ö m i m m i l l ä + h e d e l m ä t t ö m y y s h o i d o n + h e d e l m ä t t ö m y y s h o i t o j e n + h e d e l m ä t t ö m y y s k y s y m y k s e s t ä + h e d e l m ä t t ö m y y s o n g e l m a a n + h e d e l m ä t t ö m y y s r i s k i ä + h e d e l m ä t t ö m y y t e e n + h e d e l m ä t t ö m ä m p ä ä + h e d e l m ä t u o t a n t o a + h e d e l m ä t ä y s m e h u + h e d e l m ä t ä y s m e h u a + h e d e l m ä t ä y s m e h u d i r e k t i i v i s t ä + h e d e l m ä t ä y s m e h u j a + h e d e l m ä t ä y s m e h u j e n + h e d e l m ä t ä y s m e h u t i i v i s t e + h e d e l m ä v i i n a + h e d e l m ä v i i n e i s t ä + h e d e l m ä v i i n e j ä + h e d e l m ä v i i n i + h e d e l m ä v i i n i e n + h e d e l m ä v i i n i n ä + h e d e l m ä v i i n o j a + h e d e l m ä v i i n o j e n + h e d e l m ä v i l j e l m ä t + h e d e l m ä v u o r i a + h e d e l m ä ä + h e d e l m ö i t y s h e t k e s t ä + h e d e l m ö i t y s h o i d o s s a + h e d e l m ö i t y s h o i t o + h e d e l m ö i t y s h o i t o i h i n + h e d e l m ö i t y s h o i t o j a + h e d e l m ö i t y s h o i t o j e n + h e d e l m ö i t y s h o i t o o n + h e d g e r a h a s t o a s i a k i r j a a + h e d g e r a h a s t o i l l e + h e d g e r a h a s t o i s t a + h e d g e r a h a s t o j a + h e d g e r a h a s t o j e n + h e d g e r a h a s t o t + h e g e l i l ä i s e s t ä + h e g e m o n i a p y r k i m y s t e n + h e g e m o n i a v a l l a k s i + h e h k u l a m p p u + h e h k u l a m p p u i h i n + h e h k u l a m p p u j a + h e h k u l a m p p u j e n + h e h k u l a m p u i s t a + h e h k u l a m p u n + h e h k u l a m p u t + h e h k u n i s k a t i k k a + h e h k u s u k k a + h e h k u t e t r a + h e h t a a r i a + h e h t a a r i k o h t a i n e n + h e h t a a r i k o h t a i s e e n + h e h t a a r i k o h t a i s e l l a + h e h t a a r i k o h t a i s e n + h e h t a a r i k o h t a i s e s t a + h e h t a a r i k o h t a i s e s t i + h e h t a a r i k o h t a i s e t + h e h t a a r i k o h t a i s i s s a + h e h t a a r i k o h t a i s t a + h e h t a a r i k o h t a i s t e n + h e h t a a r i l i s i e n + h e h t a a r i l l a + h e h t a a r i l t a + h e h t a a r i m a k s u j e n + h e h t a a r i p e r u s t e i n e n + h e h t a a r i s a d o n + h e h t a a r i t u e n + h e h t a a r i t u e s t a + h e h t a a r i t u e t + h e h t a a r i t u i s t a + h e h t a a r i t u k e a + h e h t a a r i t u k e e n + h e h t a a r i t u k i + h e h t a a r i t u k i a + h e h t a a r i t u k i e n + h e h t a a r i t u k i i n + h e h t o l i t r a l t a + h e h t o l i t r a n + h e i h i n + h e i j a s t a a + h e i j a s t a i s i v a t + h e i j a s t a v a t + h e i j a s t a v a t k i n + h e i j a s t e l e e + h e i j a s t e l t a v a + h e i j a s t e t t a v a + h e i j a s t e v a i k u t u s t e n + h e i j a s t i n t ä h t ä i n + h e i j a s t u i + h e i j a s t u i v a t + h e i j a s t u m a a n + h e i j a s t u s n ä y t t ö + h e i j a s t u s p i s t e + h e i j a s t u s s u m u + h e i j a s t u s v a i k u t u k s i a + h e i j a s t u s v a i k u t u s + h e i j a s t u s v a i k u t u s t e n + h e i j a s t u u + h e i j a s t u v a t + h e i k e n n e t ä + h e i k e n n e t ä ä n + h e i k e n n y t t y ä + h e i k e n n ä m m e + h e i k e n t y m i s e e n + h e i k e n t y m i s e s t ä + h e i k e n t y m i s t ä + h e i k e n t y m ä s s ä + h e i k e n t y n e i d e n + h e i k e n t y v i s t ä + h e i k e n t y v ä t + h e i k e n t y y + h e i k e n t y ä + h e i k e n t ä i s i + h e i k e n t ä i s i k ä ä n + h e i k e n t ä i s i v ä t + h e i k e n t ä m i s e k s i + h e i k e n t ä m i s e n + h e i k e n t ä m i s t ä + h e i k e n t ä m ä s t ä + h e i k e n t ä m ä t t ä + h e i k e n t ä m ä ä n + h e i k e n t ä n e e t + h e i k e n t ä n y t + h e i k e n t ä v i s t ä + h e i k e n t ä v i ä + h e i k e n t ä v ä l l e + h e i k e n t ä v ä t + h e i k e n t ä ä + h e i k e n t ä ä k s e e n + h e i k k e n e e + h e i k k e n e m i s t ä + h e i k k e n e m ä s s ä + h e i k k e n e v ä t + h e i k k e n i + h e i k k e n i v ä t + h e i k k o a + h e i k k o a k i n + h e i k k o i h i n + h e i k k o j a + h e i k k o j e n + h e i k k o l a a t u i n e n + h e i k k o l a a t u i s e e n + h e i k k o l a a t u i s e n + h e i k k o l a a t u i s e s t a + h e i k k o l a a t u i s e t + h e i k k o l a a t u i s i a + h e i k k o l a a t u i s i i n + h e i k k o l a a t u i s i s s a + h e i k k o l a a t u i s i s t a + h e i k k o l a a t u i s t a + h e i k k o l a a t u i s t e n + h e i k k o l a a t u i s u u d e s t a + h e i k k o l a h j a i s u u s + h e i k k o m i e l i n e n + h e i k k o n a + h e i k k o n ä k ö i s i l l e + h e i k k o n ä k ö i s t e n + h e i k k o n ä k ö i s t ä + h e i k k o p a l k k a i s e t + h e i k k o t a s o i s e t + h e i k k o t a s o i s i a + h e i k k o t a s o i s i i n + h e i k k o t a s o i s t a + h e i k k o t u l o i s e t + h e i k k o t u l o i s i m m a t + h e i k k o t u l o i s i m p i e n + h e i k k o u d e n + h e i k k o u d e s t a + h e i k k o u d e t + h e i k k o u k s i a + h e i k k o u k s i e n + h e i k k o u k s i i n + h e i k k o u k s i s t a + h e i k k o u t e e n + h e i k k o u t e m m e + h e i k k o u t e n a + h e i k k o u t e n s a + h e i k k o u t t a a n + h e i k o i l l a + h e i k o i m m a s s a + h e i k o i m m a t + h e i k o i m m i l l a + h e i k o i m m i l l a a n + h e i k o i m m i l l a k i n + h e i k o i m m i l l e + h e i k o i m m i l t a + h e i k o i m m i n + h e i k o i m m i s t a + h e i k o i m p i a + h e i k o i m p i a a n + h e i k o i m p i e n + h e i k o i m p i i n + h e i k o i n + h e i k o i s t a + h e i k o l l a + h e i k o l l e + h e i k o m m a n + h e i k o m m a s s a + h e i k o m m a t + h e i k o m m i k s i + h e i k o m m i l l a + h e i k o m m i n + h e i k o m m i s s a + h e i k o m m i s t a + h e i k o m p a a + h e i k o m p a a n + h e i k o m p i + h e i k o m p i a + h e i k o m p i e n + h e i k o m p i i n + h e i k o m p i l a a t u i s t e n + h e i k o m p i n a + h e i k o s s a + h e i k o s t a + h e i k o t + h e i l a h t a a + h e i l l e + h e i l l ä + h e i l l ä k i n + h e i l t ä + h e i l u t t a a + h e i l u t t a i s i m m e + h e i m o a j a t t e l u + h e i m o a l u e e t + h e i m o a l u e i l l a + h e i m o a s u j e n + h e i m o e l ä m ä n t a p a a n + h e i m o e r o t + h e i m o i h i n + h e i m o j e n + h e i m o j o h t a j a a + h e i m o j o h t a j a t + h e i m o j o h t a j i a + h e i m o k a n s a + h e i m o k o k o u k s e n + h e i m o k o s t o a + h e i m o n + h e i m o n e u v o s t o n + h e i m o p e r i n t e i t ä ä n + h e i m o p ä ä l l i k ö i t ä + h e i m o r a j a t + h e i m o r a j o j a + h e i m o s o d i s t a + h e i m o s o t i a + h e i m o t a i s t e l u j e n + h e i m o t e u r a s t u s t a + h e i m o y h t e i s k u n n a l t a + h e i m o y h t e i s k u n t a + h e i m o y h t e i s ö s t ä + h e i m o y h t e y d e t + h e i n ä e l o k u u s s a + h e i n ä h u k k a + h e i n ä k a s a n + h e i n ä k a u r a + h e i n ä k e r t t u + h e i n ä k u i s e n + h e i n ä k u r p p a + h e i n ä k u t o j a + h e i n ä k u u + h e i n ä k u u h u n + h e i n ä k u u n + h e i n ä k u u s s a + h e i n ä k u u s t a + h e i n ä k u u t a + h e i n ä n o r s u + h e i n ä n u h a + h e i n ä p a a l i + h e i n ä r a t a m o + h e i n ä r a t t a a t + h e i n ä s i r k k a h a u k k a + h e i n ä s i r k k a i l m i ö + h e i n ä s i r k k a v i t s a u k s e s t a + h e i n ä t + h e i n ä t o r i + h e i n ä t ä h t i m ö + h e i n ä t ö p ö k a t t i + h e i n ä v i t a + h e i s t ä + h e i t e l l e n + h e i t e t t i i n + h e i t e t ä ä n + h e i t t e l e e + h e i t t e l e h t i i + h e i t t o i s t u i n + h e i t t o k i r v e s + h e i t t o k o u k k u + h e i t t o l i i n a + h e i t t ä i s i t t e + h e i t t ä m ä s t ä + h e i t t ä m ä ä n + h e i t t ä n e e t + h e i t t ä v ä t + h e i t t ä ä + h e i v e r ö i s e m p i ä + h e k i n + h e k s a e d i t o r i + h e k s a f l u o r i f o s f o r i h a p p o + h e k s a f l u o r i p i i h a p p o a + h e k s a k l o r o p l a t i n a h a p p o + h e k s a m e t y l e e n i t r i p e r o k s i d i d i a m i i n i + h e k s a t r i a k o n t a a n i h a p p o + h e l a t o r s t a i + h e l i k o p t e r e i d e m m e + h e l i k o p t e r e i h i n + h e l i k o p t e r e i n + h e l i k o p t e r e i t a + h e l i k o p t e r i e n + h e l i k o p t e r i l a i v u e i t a + h e l i k o p t e r i l e n n o t + h e l i k o p t e r i l e v i t y s t ä + h e l i k o p t e r i m a t k a n + h e l i k o p t e r i o n n e t t o m u u d e s s a + h e l i k o p t e r i o n n e t t o m u u d e s t a + h e l i k o p t e r i p a l v e l u a + h e l i k o p t e r i t u k i a l u s + h e l i n ä t i m a l i + h e l i u m l e i m a h d u s + h e l i u m p a l l o p o j a n + h e l i u m p l a n e e t t a + h e l l a n i k o s + h e l l e a a l l o n + h e l l e a a l l o t + h e l l e a a l t o + h e l l e a a l t o a + h e l l e a a l t o j a + h e l l e a a l t o j e n + h e l l e a a l t o o n + h e l l e e n i e n + h e l l e k a u s i a + h e l l e k e s ä n + h e l l e k y p ä r ä + h e l l e p u u + h e l l i t t ä m ä s s ä + h e l l i t t ä m ä t ö n t ä + h e l l i t t ä ä + h e l l u n t a i s u n n u n t a i n a + h e l l ä k ä t i s i m m i s t ä + h e l l ä v a r a i s i m m a s t a + h e l m a s y n t i + h e l m e t + h e l m e ä + h e l m i b u l b u l i l e p i n k ä i n e n + h e l m i h e r t t u a k a l a + h e l m i h i r s s i + h e l m i h o p e a t ä p l ä + h e l m i j o e n + h e l m i j o k i + h e l m i k a n a + h e l m i k a r d i n a a l i a h v e n + h e l m i k i r j o a h v e n + h e l m i k i r j o r a s t a s + h e l m i k o r v a k o r u + h e l m i k u o n o a h v e n + h e l m i k u u h u n + h e l m i k u u k s i + h e l m i k u u l l e + h e l m i k u u n + h e l m i k u u s s a + h e l m i k u u s t a + h e l m i k u u t a + h e l m i l i l j a + h e l m i m u u r a + h e l m i n u k k a j ä k k ä r ä + h e l m i p a l l o k a l a + h e l m i p a r t a m o n n i + h e l m i p ö l l ö + h e l m i r i h m a k a l a + h e l m i r i n t a k i p u a j a + h e l m i s a n i a i n e n + h e l m i s e e p r a p e i p p o + h e l m i s e l k ä h a u k k a + h e l m i s e l k ä t i k k a + h e l m i s o l m i o k o l i b r i + h e l m i s u o h a u k k a + h e l m i t i k k a n e n + h e l m i t u l i p e r ä + h e l m i t ö p ö p e i p p o + h e l m i ä i s n y s t y t + h e l m i ä i s p i l v i + h e l m o i s s a + h e l o k k i k i i t ä j ä + h e l p i t ä h k i ö + h e l p o i m m a l t a + h e l p o i m m i n + h e l p o i m p i a + h e l p o i n + h e l p o i n t a + h e l p o k s i + h e l p o l l a + h e l p o l t a + h e l p o m m a k s i + h e l p o m m a l l a + h e l p o m m a n + h e l p o m m i k s i + h e l p o m m i s s a + h e l p o m m i s t a + h e l p o m p a a + h e l p o m p i + h e l p o m p i a + h e l p o s t a + h e l p o s t i k i n + h e l p o t + h e l p o t a m m e + h e l p o t e t a a n + h e l p o t e t t a i s i i n + h e l p o t e t t a v a + h e l p o t t a a + h e l p o t t a a k s e e n + h e l p o t t a a k s e m m e + h e l p o t t a a k s e n i + h e l p o t t a a k s e n n e + h e l p o t t a i s i + h e l p o t t a i s i k i n + h e l p o t t a i s i v a t + h e l p o t t a k a a m m e + h e l p o t t a m a a n + h e l p o t t a m a l l a + h e l p o t t a m a s s a + h e l p o t t a m i s e k s i + h e l p o t t a m i s e n + h e l p o t t a m i s e s s a + h e l p o t t a m i s e s t a + h e l p o t t a m i s j ä r j e s t e l m ä + h e l p o t t a m i s t a + h e l p o t t a m i s t o i m e t + h e l p o t t a n u t + h e l p o t t a v a t + h e l p o t t i + h e l p o t t u i s i v a t + h e l p o t t u n e i t a + h e l p o t t u u + h e l p o t u k s e s t a + h e l p o t u k s i a + h e l p o t u k s i s t a + h e l p o t u s t a + h e l p o t u s v a i h e e l l a + h e l p p o a + h e l p p o h a n + h e l p p o j a + h e l p p o j e n + h e l p p o k ä y t t ö i n e n + h e l p p o k ä y t t ö i s e e n + h e l p p o k ä y t t ö i s e m m i k s i + h e l p p o k ä y t t ö i s e m m i s t ä + h e l p p o k ä y t t ö i s e m m ä k s i + h e l p p o k ä y t t ö i s e m m ä t + h e l p p o k ä y t t ö i s e m p i + h e l p p o k ä y t t ö i s e m p i ä + h e l p p o k ä y t t ö i s e m p ä ä + h e l p p o k ä y t t ö i s e n + h e l p p o k ä y t t ö i s i s t ä + h e l p p o k ä y t t ö i s i ä + h e l p p o k ä y t t ö i s t ä + h e l p p o l u k u i n e n + h e l p p o l u k u i s e l l a + h e l p p o l u k u i s e m m a n + h e l p p o l u k u i s e m p a a + h e l p p o l u k u i s e m p i + h e l p p o l u k u i s e n + h e l p p o l u k u i s e s s a + h e l p p o l u k u i s i a + h e l p p o o n + h e l p p o p ä ä s y i n e n + h e l p p o p ä ä s y i s e m p i + h e l p p o p ä ä s y i s e m p i ä + h e l p p o p ä ä s y i s i m p i e n + h e l p p o p ä ä s y i s i ä + h e l p p o t a j u i n e n + h e l p p o t a j u i s e e n + h e l p p o t a j u i s e m p a a + h e l p p o t a j u i s e m p i + h e l p p o t a j u i s e n + h e l p p o t a j u i s e s t i + h e l p p o t a j u i s e t + h e l p p o t a j u i s i a + h e l p p o t a j u i s i k s i + h e l p p o t a j u i s i m m i l l a + h e l p p o u d e l l e + h e l p p o u s r a t k a i s u + h e l t e e t + h e l t t a k e i s a r i k y y h k y + h e l t t a k o t t a r a i n e n + h e l t t a k u r k i + h e l t t a m i n t t u + h e l t t a s o r s a + h e l v e t i k s i + h e l v e t i l l i s e t + h e l v e t i n + h e l v e t i n k o n e e s e e n + h e l v e t i n k o n e t t a + h e l v e t t i i n + h e l y i h i n + h e m o f i l i a p o t i l a i l l e + h e m o f i l i a p o t i l a s y h d i s t y s + h e m o f i l i a y h d i s t y k s e t + h e m o f i l i a y h d i s t y k s i i n + h e n g e l l i s e l l e + h e n g e l l i s e n + h e n g e l l i s e n ä + h e n g e l l i s y y d e l l ä + h e n g e n + h e n g e n m e n e t y k s i s t ä + h e n g e n p e l a s t a j a t + h e n g e n p e l a s t u s a p u a + h e n g e n p e l a s t u s o h j e l m a t + h e n g e n p e l a s t u s v ä l i n e i d e n + h e n g e n p e l a s t u s v ä l i n e i s t ö ä + h e n g e n v a a r a + h e n g e n v a a r a a n + h e n g e n v a a r a l l i n e n + h e n g e n v a a r a l l i s e e n + h e n g e n v a a r a l l i s e k s i + h e n g e n v a a r a l l i s e n + h e n g e n v a a r a l l i s e s s a + h e n g e n v a a r a l l i s e s t a + h e n g e n v a a r a l l i s e t + h e n g e n v a a r a l l i s i a + h e n g e n v a a r a l l i s i i n + h e n g e n v a a r a l l i s i s t a + h e n g e n v a a r a l l i s t a + h e n g e n v a a r a l l i s t e n + h e n g e n v a a r a n + h e n g e n v a a r a s s a + h e n g e s s ä + h e n g e s t ä + h e n g e t t ö m y y d e s t ä + h e n g i t t ä m ä s t ä + h e n g i t t ä m ä ä n + h e n g i t t ä ä + h e n g i t y s e l i m i i m m e + h e n g i t y s e l i m i s t ö + h e n g i t y s e l i n s a i r a u d e t + h e n g i t y s e l i n s a i r a u k s i a + h e n g i t y s e l i n s a i r a u k s i e n + h e n g i t y s e l i n s a i r a u k s i i n + h e n g i t y s e l i n s a i r a u k s i s t a + h e n g i t y s e l i n t a u t i e n + h e n g i t y s e l i n t e n + h e n g i t y s e l i n t u l e h d u k s i a + h e n g i t y s i l m a + h e n g i t y s i l m a a + h e n g i t y s i l m a a n + h e n g i t y s i l m a l l e + h e n g i t y s k e l v o t o n t a + h e n g i t y s k o n e + h e n g i t y s l a i t t e e n + h e n g i t y s l a i t t e e t + h e n g i t y s l a i t t e i s t o i s s a + h e n g i t y s o n g e l m i a + h e n g i t y s o n g e l m i i n + h e n g i t y s s a i r a u d e t + h e n g i t y s t i e i n f e k t i o + h e n g i t y s t i e i n f e k t i o i d e n + h e n g i t y s t i e i n f e k t i o t + h e n g i t y s t i e o i r e y h t y m ä + h e n g i t y s t i e o i r e y h t y m ä n + h e n g i t y s t i e o i r e y h t y m ä s t ä + h e n g i t y s t i e o i r e y h t y m ä ä + h e n g i t y s t i e o i r e y h t y m ä ä n + h e n g i t y s t i e s a i r a u d e s t a + h e n g i t y s t i e s a i r a u k s i a + h e n g i t y s t i e s a i r a u k s i e n + h e n g i t y s t i e s a i r a u k s i i n + h e n g i t y s t i e s a i r a u k s i s t a + h e n g i t y s t i e t a u t i + h e n g i t y s t i l a a + h e n g i t y s t ä n n e + h e n g i t y s t ä ä n + h e n g i t y s v a i k e u k s i a + h e n g i t y s v a i k e u k s i e n + h e n g i t y s v a i k e u s o i r e y h t y m ä + h e n g ä h d y s a i k a a + h e n g ä h d y s t a u k o + h e n g ä h d y s t a u k o a + h e n g ä h d y s t a u k o j a + h e n g ä h d y s t a u k o o n + h e n g ä h d y s t a u o l l a + h e n g ä h d y s t a u o n + h e n g ä h t ä ä + h e n k e e n + h e n k e n i + h e n k e n s ä + h e n k e n s ä k i n + h e n k e ä + h e n k e ä m m e + h e n k e ä n i + h e n k e ä n n e + h e n k e ä s a l p a a v a n + h e n k e ä ä n + h e n k i i n j ä ä m i s e e n + h e n k i i n j ä ä m i s k e i n o n + h e n k i i n j ä ä m i s s t r a t e g i a n a + h e n k i i n j ä ä m i s t a l o u t t a + h e n k i k a a r t i n + h e n k i l ö a j o n e u v o j e n + h e n k i l ö a j o n e u v o l i i k e n t e e n + h e n k i l ö a s i a k i r j o i h i n + h e n k i l ö a s i a k i r j o i s t a + h e n k i l ö a s i a k i r j o i s t a m m e + h e n k i l ö a s i a k i r j o j a + h e n k i l ö a s i a k i r j o j e n + h e n k i l ö a u t o + h e n k i l ö a u t o a + h e n k i l ö a u t o a l a a n + h e n k i l ö a u t o a l a l l a + h e n k i l ö a u t o a l a n + h e n k i l ö a u t o i h i n + h e n k i l ö a u t o i l l e + h e n k i l ö a u t o i l t a + h e n k i l ö a u t o i s s a + h e n k i l ö a u t o i s t a + h e n k i l ö a u t o j a + h e n k i l ö a u t o j e n + h e n k i l ö a u t o k a n n a n + h e n k i l ö a u t o l i i k e n n e + h e n k i l ö a u t o l i i k e n n e t t ä + h e n k i l ö a u t o l i i k e n t e e n + h e n k i l ö a u t o l l a + h e n k i l ö a u t o l l e + h e n k i l ö a u t o l t a + h e n k i l ö a u t o m a r k k i n a t + h e n k i l ö a u t o m a r k k i n o i d e n + h e n k i l ö a u t o m a r k k i n o i l l a + h e n k i l ö a u t o m a r k k i n o i s t a + h e n k i l ö a u t o n + h e n k i l ö a u t o o n + h e n k i l ö a u t o s s a + h e n k i l ö a u t o t + h e n k i l ö a u t o t e o l l i s u u d e n + h e n k i l ö a u t o v e r o t u s t a + h e n k i l ö b r ä n d i + h e n k i l ö e d u s t u k s e s t a + h e n k i l ö e d u s t u s t a + h e n k i l ö h i s t o r i a n s a + h e n k i l ö i d e n + h e n k i l ö i h i n + h e n k i l ö i l l e + h e n k i l ö i l l ä + h e n k i l ö i l t ä + h e n k i l ö i l t ä ä n + h e n k i l ö i n f r a s t r u k t u u r i n + h e n k i l ö i s t ä + h e n k i l ö i t ä + h e n k i l ö j u n i i n + h e n k i l ö k e s k u s t e l u a + h e n k i l ö k o h t a i n e n + h e n k i l ö k o h t a i s e e n + h e n k i l ö k o h t a i s e l l a + h e n k i l ö k o h t a i s e l l e + h e n k i l ö k o h t a i s e l t a + h e n k i l ö k o h t a i s e m m a l l a + h e n k i l ö k o h t a i s e m m a n + h e n k i l ö k o h t a i s e m m i n + h e n k i l ö k o h t a i s e m p a a + h e n k i l ö k o h t a i s e m p a a n + h e n k i l ö k o h t a i s e m p i + h e n k i l ö k o h t a i s e n + h e n k i l ö k o h t a i s e n a + h e n k i l ö k o h t a i s e s s a + h e n k i l ö k o h t a i s e s t a + h e n k i l ö k o h t a i s e s t i + h e n k i l ö k o h t a i s e s t i k i n + h e n k i l ö k o h t a i s e t + h e n k i l ö k o h t a i s i a + h e n k i l ö k o h t a i s i i n + h e n k i l ö k o h t a i s i l l a + h e n k i l ö k o h t a i s i l l e + h e n k i l ö k o h t a i s i n a + h e n k i l ö k o h t a i s i n e + h e n k i l ö k o h t a i s i s s a + h e n k i l ö k o h t a i s i s t a + h e n k i l ö k o h t a i s t a + h e n k i l ö k o h t a i s t e n + h e n k i l ö k o r t e i s t a + h e n k i l ö k o r t i n + h e n k i l ö k o r t i t + h e n k i l ö k o r t t e i h i n + h e n k i l ö k o r t t e j a + h e n k i l ö k o r t t i + h e n k i l ö k o r t t i a + h e n k i l ö k o r t t i a s i o i t a + h e n k i l ö k o r t t i e n + h e n k i l ö k o r t t i n a + h e n k i l ö k o r t t i n s a + h e n k i l ö k u l j e t u k s i i n + h e n k i l ö k u l j e t u s t a r k o i t u k s i i n + h e n k i l ö k u l t i n + h e n k i l ö k u l u t + h e n k i l ö k u n n a l l a + h e n k i l ö k u n n a l l e + h e n k i l ö k u n n a l l e n i + h e n k i l ö k u n n a l t a + h e n k i l ö k u n n a n + h e n k i l ö k u n n a n k i n + h e n k i l ö k u n n a s t a + h e n k i l ö k u n t a + h e n k i l ö k u n t a a + h e n k i l ö k u n t a a m m e + h e n k i l ö k u n t a a n + h e n k i l ö k u n t a a n s a + h e n k i l ö k u n t a k o u l u t u s t o i m e n p i t e i t ä + h e n k i l ö k u n t a k y s y m y s + h e n k i l ö k u n t a k y s y m y s t e n + h e n k i l ö k u n t a n i + h e n k i l ö k u n t a p ä ä t ö k s i ä + h e n k i l ö k u s t a n n u s t e n + h e n k i l ö k y s y m y k s e s t ä + h e n k i l ö k y s y m y k s e t + h e n k i l ö k y s y m y k s i ä + h e n k i l ö k y s y m y s t ä + h e n k i l ö l i i k e n n e + h e n k i l ö l i i k e n n e a l a n + h e n k i l ö l i i k e n n e p a l v e l u i h i n + h e n k i l ö l i i k e n n e p a l v e l u i l l e + h e n k i l ö l i i k e n n e p a l v e l u i s t a + h e n k i l ö l i i k e n n e p a l v e l u j a + h e n k i l ö l i i k e n n e p a l v e l u j e n + h e n k i l ö l i i k e n n e p a l v e l u n + h e n k i l ö l i i k e n n e p a l v e l u t + h e n k i l ö l i i k e n n e t t ä + h e n k i l ö l i i k e n t e e l l e + h e n k i l ö l i i k e n t e e n + h e n k i l ö l i i k e n t e e s e e n + h e n k i l ö l i i k e n t e e s s ä + h e n k i l ö l i i k e n t e e s s ä k i n + h e n k i l ö l i i k e n t e e s t ä + h e n k i l ö l l e + h e n k i l ö l l i s y y d e n + h e n k i l ö l l i s y y s a s i a k i r j a + h e n k i l ö l l i s y y s a s i a k i r j a a + h e n k i l ö l l i s y y s a s i a k i r j a n + h e n k i l ö l l i s y y s a s i a k i r j a s t a + h e n k i l ö l l i s y y s a s i a k i r j o j a + h e n k i l ö l l i s y y s a s i a k i r j o j e n + h e n k i l ö l l i s y y s k o r t t i j ä r j e s t e l m ä + h e n k i l ö l l i s y y s p a p e r e i t a + h e n k i l ö l l i s y y s p a p e r i n a + h e n k i l ö l l i s y y s p r o f i i l e j a + h e n k i l ö l l i s y y s p r o f i l o i n n i s t a + h e n k i l ö l l i s y y s t a r k a s t u k s i a + h e n k i l ö l l i s y y s t a r k i s t u k s i a + h e n k i l ö l l i s y y s t o d i s t u k s e n + h e n k i l ö l l i s y y s t o d i s t u k s e n i + h e n k i l ö l l i s y y s t o d i s t u k s e s t a + h e n k i l ö l l i s y y s t o d i s t u k s e t + h e n k i l ö l l i s y y s t o d i s t u k s i a + h e n k i l ö l l i s y y s t o d i s t u k s i e n + h e n k i l ö l l i s y y s t o d i s t u k s i i n + h e n k i l ö l l i s y y s t o d i s t u k s i s s a + h e n k i l ö l l i s y y s t o d i s t u k s i s t a + h e n k i l ö l l i s y y s t o d i s t u s + h e n k i l ö l l i s y y s t o d i s t u s p e t o k s i i n + h e n k i l ö l l i s y y s t o d i s t u s t a + h e n k i l ö l l i s y y s t o d i s t u s t e n + h e n k i l ö l l i s y y s v a r k a u k s i a + h e n k i l ö l l i s y y t e n s ä + h e n k i l ö l l ä + h e n k i l ö l t ä + h e n k i l ö l u e t t e l o i t a + h e n k i l ö l u e t t e l o n + h e n k i l ö l u o k k a a n + h e n k i l ö l ä h i l i i k e n n e + h e n k i l ö m a t r i k k e l i + h e n k i l ö m e n o t + h e n k i l ö m i i n a t + h e n k i l ö m i i n o i l l a k i n + h e n k i l ö m i i n o i l t a + h e n k i l ö m i i n o i s t a + h e n k i l ö m i i n o j a + h e n k i l ö m i i n o j e n + h e n k i l ö m ä ä r i e n + h e n k i l ö m ä ä r ä n + h e n k i l ö m ä ä r ä s t ä ä n + h e n k i l ö n + h e n k i l ö n n i m i + h e n k i l ö n o s t i m e t + h e n k i l ö n o s t i m i a + h e n k i l ö n p a l v o n t a a + h e n k i l ö n t a r k a s t u s t e n + h e n k i l ö n ä + h e n k i l ö o i k e u d e n + h e n k i l ö o i k e u d e t + h e n k i l ö p a l v o n t a + h e n k i l ö p a p e r e i h i n + h e n k i l ö p a p e r e i t a + h e n k i l ö p a p e r i t + h e n k i l ö p o l i i t t i s i s t a + h e n k i l ö p ä i v ä ä + h e n k i l ö p ä ä o m a a n + h e n k i l ö r a t k a i s u j a + h e n k i l ö r e k i s t e r e i t ä + h e n k i l ö r e k i s t e r i t + h e n k i l ö r e k i s t e r ö i n n i t + h e n k i l ö r e s u r s s e i h i n + h e n k i l ö r e s u r s s e i l l e + h e n k i l ö r e s u r s s e i n + h e n k i l ö r e s u r s s e i s s a + h e n k i l ö r e s u r s s e i s t a + h e n k i l ö r e s u r s s e j a + h e n k i l ö r e s u r s s e j a a n + h e n k i l ö r e s u r s s i e n + h e n k i l ö r e s u r s s i j o h t a j a t + h e n k i l ö r e s u r s s i k r i i s i i n + h e n k i l ö r e s u r s s i o n g e l m a + h e n k i l ö r e s u r s s i o s a s t o i h i n + h e n k i l ö r e s u r s s i p o l i t i i k a s s a + h e n k i l ö r e s u r s s i p o l i t i i k k a a + h e n k i l ö r e s u r s s i t + h e n k i l ö r y h m i e n + h e n k i l ö r y h m i i n + h e n k i l ö r y h m i ä + h e n k i l ö r y h m ä l l e + h e n k i l ö r y h m ä t + h e n k i l ö r y h m ä ä + h e n k i l ö s k a n n a u s + h e n k i l ö s k a n n e r e i d e n + h e n k i l ö s k a n n e r e i h i n + h e n k i l ö s k a n n e r e i l l e + h e n k i l ö s k a n n e r e i s t a + h e n k i l ö s k a n n e r e i t a + h e n k i l ö s k a n n e r i + h e n k i l ö s k a n n e r i a + h e n k i l ö s k a n n e r i e n + h e n k i l ö s k a n n e r i i n + h e n k i l ö s k a n n e r i j ä r j e s t e l m i ä + h e n k i l ö s k a n n e r i l l a + h e n k i l ö s k a n n e r i n + h e n k i l ö s k a n n e r i t + h e n k i l ö s t ä + h e n k i l ö s t ö a l a l l a + h e n k i l ö s t ö a l a l t a + h e n k i l ö s t ö a l a n + h e n k i l ö s t ö a n n e i s s a + h e n k i l ö s t ö a s e t u k s e n + h e n k i l ö s t ö a s e t u s + h e n k i l ö s t ö a s i o i d e n + h e n k i l ö s t ö a s i o i h i n + h e n k i l ö s t ö a s i o i s s a + h e n k i l ö s t ö b u d j e t i n + h e n k i l ö s t ö e d u s t u k s e n + h e n k i l ö s t ö e d u s t u k s e s t a + h e n k i l ö s t ö e d u s t u s + h e n k i l ö s t ö e d u s t u s t a + h e n k i l ö s t ö e h d o t u s t a n n e + h e n k i l ö s t ö h a l l i n n a s s a + h e n k i l ö s t ö h a l l i n n o n + h e n k i l ö s t ö h a l l i n n o s s a + h e n k i l ö s t ö h a l l i n n o s t a + h e n k i l ö s t ö h a l l i n t a + h e n k i l ö s t ö h a l l i n t a a n + h e n k i l ö s t ö h a l l i n t a s u u n n i t e l m i s s a a n + h e n k i l ö s t ö h a l l i n t o a + h e n k i l ö s t ö h a l l i n t o k ä y t ä n t ö + h e n k i l ö s t ö h a l l i n t o o n + h e n k i l ö s t ö h a n k i n t a a n + h e n k i l ö s t ö i l m o i t u k s e n + h e n k i l ö s t ö i n v e s t o i n t e j a + h e n k i l ö s t ö j e n + h e n k i l ö s t ö j ä r j e s t e l m ä + h e n k i l ö s t ö j ä r j e s t e l m ä ä n + h e n k i l ö s t ö j ä r j e s t e l y t + h e n k i l ö s t ö j ä r j e s t ö j e n + h e n k i l ö s t ö j ä r j e s t ö n + h e n k i l ö s t ö j ä r j e s t ö t + h e n k i l ö s t ö k a a v i o i s s a + h e n k i l ö s t ö k a a v i o n + h e n k i l ö s t ö k a p a s i t e e t i n + h e n k i l ö s t ö k a r t o i t u k s e e n + h e n k i l ö s t ö k a r t o i t u k s e n + h e n k i l ö s t ö k a r t o i t u k s e s t a + h e n k i l ö s t ö k a r t o i t u s + h e n k i l ö s t ö k a t e g o r i a t + h e n k i l ö s t ö k e h i t y k s e n + h e n k i l ö s t ö k e h i t y s t ä + h e n k i l ö s t ö k i i s t a + h e n k i l ö s t ö k i i s t a s t a + h e n k i l ö s t ö k i n + h e n k i l ö s t ö k o m i t e a + h e n k i l ö s t ö k o m i t e a a + h e n k i l ö s t ö k o m i t e a l l a + h e n k i l ö s t ö k o m i t e a n + h e n k i l ö s t ö k o m i t e a s s a + h e n k i l ö s t ö k o m i t e o i s s a + h e n k i l ö s t ö k o m i t e o i t a + h e n k i l ö s t ö k o r v a u k s i i n + h e n k i l ö s t ö k o r v a u k s i s t a a n + h e n k i l ö s t ö k o u l u t u k s e n + h e n k i l ö s t ö k o u l u t u k s e s s a + h e n k i l ö s t ö k o u l u t u s + h e n k i l ö s t ö k o u l u t u s t a + h e n k i l ö s t ö k r i i s i + h e n k i l ö s t ö k u l t t u u r i a + h e n k i l ö s t ö k u l u i h i n + h e n k i l ö s t ö k u l u j a + h e n k i l ö s t ö k u l u j e n + h e n k i l ö s t ö k u l u t + h e n k i l ö s t ö k u s t a n n u k s e t + h e n k i l ö s t ö k u s t a n n u k s i a + h e n k i l ö s t ö k u s t a n n u k s i i n + h e n k i l ö s t ö k u s t a n n u k s i s t a + h e n k i l ö s t ö k u s t a n n u s t e n + h e n k i l ö s t ö k y s y m y k s e e n + h e n k i l ö s t ö k y s y m y k s i i n + h e n k i l ö s t ö k y s y m y k s i l l ä + h e n k i l ö s t ö k y s y m y k s i s s ä + h e n k i l ö s t ö k y s y m y k s i s t ä + h e n k i l ö s t ö k y s y m y k s i ä + h e n k i l ö s t ö k y s y m y s t ä + h e n k i l ö s t ö l a i n s ä ä d ä n n ö n + h e n k i l ö s t ö l i i t t o j e m m e + h e n k i l ö s t ö l l e + h e n k i l ö s t ö l l ä + h e n k i l ö s t ö l u e t t e l o n + h e n k i l ö s t ö m e n o i h i n + h e n k i l ö s t ö m e n o i s t a + h e n k i l ö s t ö m e n o j a + h e n k i l ö s t ö m e n o j e n + h e n k i l ö s t ö m e n o j e n s a + h e n k i l ö s t ö m e n o t + h e n k i l ö s t ö m u u t o k s e t + h e n k i l ö s t ö m u u t o k s i s s a + h e n k i l ö s t ö m y y m ä l ä n + h e n k i l ö s t ö m ä ä r i l l ä + h e n k i l ö s t ö m ä ä r i ä + h e n k i l ö s t ö m ä ä r i ä ä n + h e n k i l ö s t ö m ä ä r ä + h e n k i l ö s t ö m ä ä r ä n + h e n k i l ö s t ö m ä ä r ä r a h o j e n + h e n k i l ö s t ö m ä ä r ä ä + h e n k i l ö s t ö m ä ä r ä ä n s ä + h e n k i l ö s t ö n + h e n k i l ö s t ö n i m i t y s t e n + h e n k i l ö s t ö n s ä + h e n k i l ö s t ö n v a l i n t a m e n e t t e l y j ä + h e n k i l ö s t ö n v a l i n t a t o i m i s t o + h e n k i l ö s t ö n v a l i n t a t o i m i s t o a + h e n k i l ö s t ö o n g e l m a + h e n k i l ö s t ö o n g e l m i a + h e n k i l ö s t ö o n g e l m i e n + h e n k i l ö s t ö o n g e l m i i n s a + h e n k i l ö s t ö o n g e l m i s s a + h e n k i l ö s t ö o n g e l m i s t a a n + h e n k i l ö s t ö p a n o s + h e n k i l ö s t ö p o l i i t t i s i l l e + h e n k i l ö s t ö p o l i i t t i s t a + h e n k i l ö s t ö p o l i t i i k a l l a + h e n k i l ö s t ö p o l i t i i k a l l e + h e n k i l ö s t ö p o l i t i i k a n + h e n k i l ö s t ö p o l i t i i k a s s a + h e n k i l ö s t ö p o l i t i i k a s t a + h e n k i l ö s t ö p o l i t i i k a s t a a n + h e n k i l ö s t ö p o l i t i i k k a + h e n k i l ö s t ö p o l i t i i k k a a + h e n k i l ö s t ö p o l i t i i k k a a m m e + h e n k i l ö s t ö p o l i t i i k k a a n + h e n k i l ö s t ö p o l i t i i k k a a n s a + h e n k i l ö s t ö p o l i t i i k k a a s i + h e n k i l ö s t ö p o l i t i i k k a m m e + h e n k i l ö s t ö p o l i t i i k k o j a + h e n k i l ö s t ö p u l a + h e n k i l ö s t ö p u l a a + h e n k i l ö s t ö p u l a a n + h e n k i l ö s t ö p u l a n + h e n k i l ö s t ö p u l a s t a + h e n k i l ö s t ö p u o l e l l a + h e n k i l ö s t ö p y y n n ö t + h e n k i l ö s t ö p y y n t ö j e n + h e n k i l ö s t ö p ä ä l l i k k ö + h e n k i l ö s t ö p ä ä l l i k k ö n ä + h e n k i l ö s t ö p ä ä t ö s t e n + h e n k i l ö s t ö r a k e n n e + h e n k i l ö s t ö r a k e n n e t t a + h e n k i l ö s t ö r a k e n t e e n s a + h e n k i l ö s t ö r a k e n t e i d e n + h e n k i l ö s t ö r a k e n t e i t a + h e n k i l ö s t ö r e s e r v i + h e n k i l ö s t ö r e s u r s s e i h i n + h e n k i l ö s t ö r e s u r s s e i l l a + h e n k i l ö s t ö r e s u r s s e i s s a + h e n k i l ö s t ö r e s u r s s e j a + h e n k i l ö s t ö r e s u r s s e j a a n + h e n k i l ö s t ö r e s u r s s e j a m m e + h e n k i l ö s t ö r e s u r s s i e n + h e n k i l ö s t ö r e s u r s s i k r i i s i s t ä + h e n k i l ö s t ö r e s u r s s i o n g e l m a a + h e n k i l ö s t ö r e s u r s s i t + h e n k i l ö s t ö r y h m i ä + h e n k i l ö s t ö s e u l o n n a s t a + h e n k i l ö s t ö s i i r t o j a + h e n k i l ö s t ö s i i r t o j e n + h e n k i l ö s t ö s s ä + h e n k i l ö s t ö s t r a t e g i a + h e n k i l ö s t ö s t ä + h e n k i l ö s t ö s u h t e i s i i n + h e n k i l ö s t ö s u u n n i t e l m a + h e n k i l ö s t ö s u u n n i t e l m a a + h e n k i l ö s t ö s u u n n i t e l m a a n + h e n k i l ö s t ö s u u n n i t e l m a l l e + h e n k i l ö s t ö s u u n n i t e l m a s t a + h e n k i l ö s t ö s u u n n i t t e l u a + h e n k i l ö s t ö s u u n n i t t e l u n + h e n k i l ö s t ö s ä ä n n ö i k s i + h e n k i l ö s t ö s ä ä n n ö i l l ä + h e n k i l ö s t ö s ä ä n n ö i s s ä + h e n k i l ö s t ö s ä ä n n ö i s t ä + h e n k i l ö s t ö s ä ä n n ö k s i + h e n k i l ö s t ö s ä ä n n ö n + h e n k i l ö s t ö s ä ä n n ö s t e n + h e n k i l ö s t ö s ä ä n n ö s t ö n + h e n k i l ö s t ö s ä ä n n ö s t ö ä + h e n k i l ö s t ö s ä ä n n ö t + h e n k i l ö s t ö s ä ä n t ö + h e n k i l ö s t ö s ä ä n t ö i h i n + h e n k i l ö s t ö s ä ä n t ö j e n + h e n k i l ö s t ö s ä ä n t ö j ä + h e n k i l ö s t ö s ä ä n t ö j ä ä n + h e n k i l ö s t ö s ä ä n t ö k o m i t e a n + h e n k i l ö s t ö s ä ä n t ö k o m i t e a s s a + h e n k i l ö s t ö s ä ä n t ö m m e + h e n k i l ö s t ö s ä ä n t ö u u d i s t u k s e e n + h e n k i l ö s t ö s ä ä n t ö u u d i s t u k s e k s i + h e n k i l ö s t ö s ä ä n t ö u u d i s t u k s e n + h e n k i l ö s t ö s ä ä n t ö u u d i s t u s t a + h e n k i l ö s t ö s ä ä n t ö ä + h e n k i l ö s t ö s ä ä n t ö ö n + h e n k i l ö s t ö s ä ä s t ö t + h e n k i l ö s t ö t a r p e e n + h e n k i l ö s t ö t a r p e e t + h e n k i l ö s t ö t a r p e i s i i n + h e n k i l ö s t ö t a r p e i s t a + h e n k i l ö s t ö t a r p e i t a + h e n k i l ö s t ö t a r p e i t a a n + h e n k i l ö s t ö t a r v e a r v i o i n n i n + h e n k i l ö s t ö t a r v e k a r t o i t u k s e n + h e n k i l ö s t ö t a r v e s u u n n i t e l m a a + h e n k i l ö s t ö t a r v e t t a + h e n k i l ö s t ö t a s o a + h e n k i l ö s t ö t a s o n + h e n k i l ö s t ö t a u l u k k o + h e n k i l ö s t ö t a u l u k k o a + h e n k i l ö s t ö t a u l u k k o o n + h e n k i l ö s t ö t a u l u k o i h i n + h e n k i l ö s t ö t a u l u k o n + h e n k i l ö s t ö t a u l u k o s s a + h e n k i l ö s t ö t a u l u k o s t a + h e n k i l ö s t ö t a u l u k o t + h e n k i l ö s t ö t i l a n n e t t a + h e n k i l ö s t ö t i l a n t e e l l e + h e n k i l ö s t ö t i l a n t e e n + h e n k i l ö s t ö t i l a n t e e s e e n + h e n k i l ö s t ö t i l a n t e e s t a + h e n k i l ö s t ö t u k i e n + h e n k i l ö s t ö u u d i s t u k s e n + h e n k i l ö s t ö u u d i s t u k s i i n + h e n k i l ö s t ö u u d i s t u s + h e n k i l ö s t ö u u d i s t u s t a + h e n k i l ö s t ö u u d i s t u s t e n + h e n k i l ö s t ö v a a t i m u k s e t + h e n k i l ö s t ö v a i h t o a + h e n k i l ö s t ö v a j a u k s e e n + h e n k i l ö s t ö v a j e + h e n k i l ö s t ö v a j e e s t a + h e n k i l ö s t ö v a j e e t + h e n k i l ö s t ö v a j e t t a + h e n k i l ö s t ö v a l i n n a s s a + h e n k i l ö s t ö v a l i n n a t + h e n k i l ö s t ö v a l i n n o i s t a + h e n k i l ö s t ö v a l i n t a a + h e n k i l ö s t ö v a l i n t a m e n e t t e l y + h e n k i l ö s t ö v a l i n t a t o i m i s t o + h e n k i l ö s t ö v a l i n t a t o i m i s t o a + h e n k i l ö s t ö v a l i n t a t o i m i s t o n + h e n k i l ö s t ö v a l i n t a t o i m i s t o o n + h e n k i l ö s t ö v a l i n t o i h i n + h e n k i l ö s t ö v a l i n t o j e n + h e n k i l ö s t ö v a r a t + h e n k i l ö s t ö v a r o i s t a + h e n k i l ö s t ö v a r o j e n + h e n k i l ö s t ö v i r k o j a + h e n k i l ö s t ö v o i m a v a r a t + h e n k i l ö s t ö v o i m a v a r o i h i n + h e n k i l ö s t ö v o i m a v a r o i n + h e n k i l ö s t ö v o i m a v a r o j a + h e n k i l ö s t ö v o i m a v a r o j e n + h e n k i l ö s t ö v ä h e n n y k s e t + h e n k i l ö s t ö v ä h e n n y k s i i n + h e n k i l ö s t ö v ä h e n n y k s i s s ä + h e n k i l ö s t ö y k s i k ö i s s ä + h e n k i l ö s t ö ä + h e n k i l ö s t ö ä ä n + h e n k i l ö s t ö ö n + h e n k i l ö s u h t e i s t a + h e n k i l ö s u o j a + h e n k i l ö s u o j a a + h e n k i l ö s u o j e l u t o i m e n p i t e i d e n + h e n k i l ö t + h e n k i l ö t a r k a s t u k s e t + h e n k i l ö t a r k a s t u k s i a + h e n k i l ö t a r k a s t u k s i s s a + h e n k i l ö t a r k a s t u s t e n + h e n k i l ö t a s o l l e + h e n k i l ö t i e d o i l l e + h e n k i l ö t i e d o i l l e e n + h e n k i l ö t i e d o i l t a + h e n k i l ö t i e d o i s t a + h e n k i l ö t i e d o i s t a a n + h e n k i l ö t i e d o i s t a m m e + h e n k i l ö t i e d o n + h e n k i l ö t i e d o s t o t + h e n k i l ö t i e d o t + h e n k i l ö t i e t o + h e n k i l ö t i e t o a + h e n k i l ö t i e t o d i r e k t i i v i + h e n k i l ö t i e t o i h i n + h e n k i l ö t i e t o i h i n s a + h e n k i l ö t i e t o j a + h e n k i l ö t i e t o j a a n + h e n k i l ö t i e t o j a m m e + h e n k i l ö t i e t o j a n i + h e n k i l ö t i e t o j e m m e + h e n k i l ö t i e t o j e n + h e n k i l ö t i e t o j e n s a + h e n k i l ö t i e t o k a n n a n + h e n k i l ö t i e t o k a n t a + h e n k i l ö t i e t o k y s y m y k s i ä + h e n k i l ö t i e t o l a k i + h e n k i l ö t i e t o n s a + h e n k i l ö t i e t o r i k k o m u k s i s t a + h e n k i l ö t i e t o s u o j a + h e n k i l ö t i e t o s u o j a a + h e n k i l ö t i e t o s u o j a a n + h e n k i l ö t i e t o s u o j a l l e + h e n k i l ö t i e t o s u o j a n + h e n k i l ö t i e t o s u o j a s t a + h e n k i l ö t i e t o v a r k a u d e t + h e n k i l ö t i e t o v a r k a u k s i e n + h e n k i l ö t o d i s t u k s e e n + h e n k i l ö t o d i s t u k s e l l a a n + h e n k i l ö t o d i s t u k s e n + h e n k i l ö t o d i s t u k s e s s a + h e n k i l ö t o d i s t u k s e s t a + h e n k i l ö t o d i s t u k s i i n + h e n k i l ö t o d i s t u k s i l l a + h e n k i l ö t o d i s t u k s i s s a + h e n k i l ö t o d i s t u k s i s t a + h e n k i l ö t o d i s t u s t a + h e n k i l ö t u n n u s + h e n k i l ö t u n n u s t a + h e n k i l ö t u r v a l l i s u u d e n + h e n k i l ö t u r v a l l i s u u d e s t a + h e n k i l ö t y ö p ä i v ä ä + h e n k i l ö v a h i n g o i s s a + h e n k i l ö v a h i n g o i s t a + h e n k i l ö v a h i n g o s s a + h e n k i l ö v a h i n g o s t a + h e n k i l ö v a h i n g o t + h e n k i l ö v a h i n k o + h e n k i l ö v a h i n k o a s t e i n e e n + h e n k i l ö v a h i n k o i h i n + h e n k i l ö v a h i n k o j a + h e n k i l ö v a h i n k o j e n + h e n k i l ö v a i h d o k s i n e e n + h e n k i l ö v a i h d o n + h e n k i l ö v a i h d o t + h e n k i l ö v a i h t o j a + h e n k i l ö v a l i n n a t + h e n k i l ö v a l v o n n a n + h e n k i l ö v a l v o n n a s t a + h e n k i l ö v a m m a s t a + h e n k i l ö v a m m o i h i n + h e n k i l ö v a m m o j e n + h e n k i l ö v e r o t u k s e e n + h e n k i l ö v o i m a v a r a t + h e n k i l ö v o i m a v a r o i h i n + h e n k i l ö v o i m a v a r o j a + h e n k i l ö v o i m a v a r o j e n + h e n k i l ö v u o k r a u s y h t i ö i d e n + h e n k i l ö ä + h e n k i l ö ä ä n e s t y k s e e n + h e n k i l ö ö n + h e n k i m a a i l m a + h e n k i o p a s + h e n k i p a r a n n u s + h e n k i s e e n + h e n k i s e l l e + h e n k i s e n + h e n k i s i ä + h e n k i s y y d e s s ä m m e + h e n k i t a n s s i + h e n k i t o r e i s s a a n + h e n k i t o r v i + h e n k i v a k u u t u k s e m m e + h e n k i v a k u u t u k s e n i + h e n k i v a k u u t u k s e s t a + h e n k i v a k u u t u k s e t + h e n k i v a k u u t u k s i a + h e n k i v a k u u t u k s i i n + h e n k i v a k u u t u k s i s t a + h e n k i v a k u u t u s + h e n k i v a k u u t u s d i r e k t i i v e j ä + h e n k i v a k u u t u s d i r e k t i i v i i n + h e n k i v a k u u t u s j ä r j e s t e l y t + h e n k i v a k u u t u s l i i k k e e n + h e n k i v a k u u t u s m a r k k i n a t + h e n k i v a k u u t u s m a r k k i n o i d e n + h e n k i v a k u u t u s s o p i m u s t e n + h e n k i v a k u u t u s t e n + h e n k i v a k u u t u s t u o t t e i d e n + h e n k i v a k u u t u s y h t i ö i d e n + h e n k i v a k u u t u s y h t i ö i t ä + h e n k i v a k u u t u s y r i t y k s e t + h e n k i v a k u u t u s y r i t y k s i ä + h e n k i v a r t i j a n s a + h e n k i v a r t i j a t + h e n k i v a r t i j o i n e e n + h e n k i ä + h e p a t i i t t i v i r u s t a r t u n t a + h e p o a s t e e t + h e p o m e r i v u o k k o + h e p r e a l a i s e v a n k e l i u m i + h e p t a a n i h a p p o + h e r e r o t + h e r h i l ä i s p e s ä n + h e r j a a m i s l a i n + h e r j a a v a k s i + h e r j a u s k a m p a n j a t + h e r j a u s k i r j a s t a + h e r j a u s r i k o k s e e n + h e r j a u s s y y t e + h e r k e m m i l l e + h e r k e m m i n + h e r k e m m ä k s i + h e r k e m m ä t + h e r k e m p i + h e r k e m p i e n + h e r k e m p i i n + h e r k e m p i n ä + h e r k e m p i ä + h e r k i k s i + h e r k i l l e + h e r k i m m i l l ä + h e r k i m m i n + h e r k i m m i s t ä + h e r k i m m ä l l ä + h e r k i m m ä l t ä + h e r k i m m ä s s ä + h e r k i m m ä t + h e r k i m p i e n + h e r k i m p i i n + h e r k i m p i ä + h e r k i n + h e r k i n t ä + h e r k i s t y y + h e r k i s t ä m ä l l ä + h e r k i s t ä m ä ä n + h e r k k i e n + h e r k k i ä + h e r k k u j a + h e r k k u r a v i n t o l o i h i n + h e r k k u s i e n i + h e r k k u s i e n i v i l j e l i j ä ä + h e r k k u t a t t i + h e r k k y y d e s t ä + h e r k k y y s a n a l y y s i + h e r k k y y s t a s o j a + h e r k k y y t t ä + h e r k k ä n ä + h e r k k ä t u n t e i s e s t i + h e r k k ä t u n t e i s u u t t a + h e r k k ä t u n t o i s e m m a k s i + h e r k k ä t u n t o i s e m m a n + h e r k k ä t u n t o i s e m p i + h e r k k ä t u n t o i s e s t i + h e r k k ä u s k o i s i l l e + h e r k k ä ä + h e r k k ä ä n + h e r k u l l i s i l l a + h e r k ä k s i + h e r k ä l l ä + h e r k ä n + h e r k ä s s ä + h e r k ä t + h e r m o j ä r j e s t e l m i e n + h e r m o j ä r j e s t e l m ä + h e r m o j ä r j e s t e l m ä n + h e r m o j ä r j e s t e l m ä ä + h e r m o k a a s u + h e r m o k a a s u j a + h e r m o k a a s u j e n + h e r m o k a a s u n + h e r m o k a a s u t + h e r m o k a a s u y h d i s t e k ä ä n + h e r m o k a s v u t e k i j ä + h e r m o k e s k u k s e t + h e r m o k e s k u k s i a + h e r m o k e s k u k s i s t a + h e r m o k e s k u s + h e r m o k e s k u s t a + h e r m o k u d o k s i i n + h e r m o k u d o s + h e r m o n v u o r i + h e r m o p i n n e + h e r m o r a d o i k s i + h e r m o r a t a + h e r m o r o m a h d u k s e n + h e r m o r o m a h d u s + h e r m o s o l u j a + h e r m o s t o a + h e r m o s t o l l e + h e r m o s t o l l i s i a + h e r m o s t o n + h e r m o s t o o m m e + h e r m o s t o o n + h e r m o s t o p i e n a + h e r m o s t o p u t k i + h e r m o s t o r a p p e u m a s a i r a u d e s t a + h e r m o s t o r a p p e u m a s a i r a u k s i i n + h e r m o s t o r a p p e u m a s a i r a u k s i s t a + h e r m o s t o s a i r a u k s i e n + h e r m o s t u i + h e r m o s t u n e i s u u d e s t a a n + h e r m o s t u n e i t a + h e r m o s t u t t a a + h e r m o s t u t t a v a t + h e r m o s y y + h e r m o v a u r i o + h e r m o v a u r i o i t a + h e r n e e n k a s v a t u s a l u e t t a + h e r n e e n v i l j e l y + h e r n e k e i t t o + h e r n e k e r t t u + h e r n e k i r v a + h e r n e k u u k u n e n + h e r n e k ä ä r i ä i n e n + h e r n e p u r k k i a + h e r n e s y p r e s s i + h e r o i i n i a n n o k s e t + h e r o i i n i i n + h e r o i i n i k a u p a n + h e r o i i n i k a u p a s s a + h e r o i i n i k a u p p a a + h e r o i i n i k u o l e m i a + h e r o i i n i n + h e r o i i n i n k a a n + h e r o i i n i n k ä y t t ä j ä n + h e r o i i n i n k ä y t t ä j ä ä + h e r o i i n i n t u o t a n t o a + h e r o i i n i o n g e l m a + h e r o i i n i r e i t i t + h e r o i i n i r i i p p u v a i n e n + h e r o i i n i s a t o + h e r o i i n i u n i k k o j e n + h e r o i i n i v i r r a n + h e r p a a n t u a + h e r p a a n t u u + h e r r a a + h e r r a i n h u o n e + h e r r a m m e + h e r r a s m i e s h u i j a r i t + h e r r a s m i e s m a a n v i l j e l i j ä n + h e r r a s m i e s s o p i m u k s e e n + h e r r a s m i e s s o p i m u k s e l l a + h e r r a s m i e s s o p i m u k s e l l a k a a n + h e r r a s m i e s s o p i m u k s e n + h e r r a s m i e s s o p i m u k s e s s a + h e r r a s m i e s s o p i m u k s e s t a + h e r r a s m i e s s o p i m u k s e t + h e r r a s m i e s s o p i m u k s i a + h e r r a s m i e s s o p i m u k s i i n + h e r r a s m i e s s o p i m u k s i n + h e r r a s m i e s s o p i m u s + h e r r a s m i e s s o p i m u s t a + h e r r a s m i e s s o p i m u s t a m m e + h e r r a s m i e s s o p i m u s t e n + h e r r a t + h e r r u u s s u h t e i s t a + h e r t t a i k i k u k k a + h e r t t a i s t a + h e r t t a t ö y h t ö p o i m i j a + h e r t t u a k e i j u a h v e n + h e r u k k a l a s i s i i p i + h e r u k k a p e r h o n e n + h e r u k k a v i i n i + h e r ä t e l l ä + h e r ä t t e i d e n + h e r ä t t e i t ä + h e r ä t t i + h e r ä t t i v ä t + h e r ä t t ä i s i + h e r ä t t ä m i i n + h e r ä t t ä m i s e k s i + h e r ä t t ä m ä s t ä + h e r ä t t ä m ä t + h e r ä t t ä m ä t t ä + h e r ä t t ä m ä ä n + h e r ä t t ä n e e t + h e r ä t t ä n e i d e n + h e r ä t t ä n e i t ä + h e r ä t t ä n y t + h e r ä t t ä v i m m i s t ä + h e r ä t t ä v i m m ä t + h e r ä t t ä v i m p i ä + h e r ä t t ä v i ä + h e r ä t t ä v ä n + h e r ä t t ä v ä s t ä + h e r ä t t ä v ä t + h e r ä t t ä v ä ä + h e r ä t t ä v ä ä n + h e r ä t t ä ä + h e r ä t t ä ä k i n + h e r ä t t ä ä k s e m m e + h e r ä t y k s e n ä + h e r ä t y s h u u t o + h e r ä t y s k e l l o + h e r ä t y s k e l l o n + h e r ä t y s k r i s t i l l i n e n + h e r ä t y s l i i k e + h e r ä t y s s i g n a a l i + h e r ä t y s s o i t t o + h e r ä ä k i n + h e t e h o r s m a + h e t e k u i r i s a m m a l + h e t e r o g e e n i s e m m a k s i + h e t e r o g e e n i s e m p i + h e t e r o g e e n i s e m p i ä + h e t e r o g e e n i s e m p ä ä + h e t e r o k r o m i a + h e t e r o s e k s u a a l i e n + h e t e s a r a + h e t k e k s i + h e t k e k s i k ä ä n + h e t k e l l ä + h e t k e l t ä + h e t k e n + h e t k e n k i n + h e t k e n ä + h e t k e n ä n i + h e t k e s s ä + h e t k e s t ä + h e t k e ä + h e t k e ä k ä ä n + h e t k i n ä + h e t k i p a l v e l u s + h e t k i s e n + h e t k i s t ä + h e t k i ä + h e t u l a v a l a a t + h e v o n h i e r a k k a + h e v o s a j o + h e v o s a j o n e u v o + h e v o s a l a a + h e v o s a l a l l a + h e v o s a n t i l o o p i t + h e v o s e l ä i m i ä + h e v o s e l ä i n t e n + h e v o s e n + h e v o s e n a + h e v o s e n k e n k ä m u n u a i n e n + h e v o s e n k e n k ä r a t a + h e v o s e n k e n k ä t e o r i a + h e v o s e n l i h a + h e v o s e n l i h a p i h v i ä + h e v o s e n p ä ä s u m u + h e v o s i a + h e v o s i n f l u e n s s a + h e v o s j u o t i k a s + h e v o s k a s t a n j a + h e v o s k a s v a t t a j i a + h e v o s k a u p p i a a l t a + h e v o s k a u p p i a s + h e v o s k i l p a i l u + h e v o s k i l p a i l u i s t a + h e v o s k i l p a i l u j a + h e v o s k i l p a i l u n + h e v o s k i l p a i l u t + h e v o s k u i s k a a j a + h e v o s k u l j e t u k s e t + h e v o s k u l j e t u k s i a + h e v o s k u l j e t u k s i i n + h e v o s k u l j e t u k s i s s a + h e v o s m u u r a h a i n e n + h e v o s m u u r a h a i s k o i + h e v o s p e r ä v a u n u j e n + h e v o s r o d u i s t a + h e v o s s i i t t o l a y h d i s t y k s e t + h e v o s s i i t t o l o i t a + h e v o s t a u t i e n + h e v o s u r h e i l u a + h e v o s v o i m a a + h i d a s t a a + h i d a s t a a k s e n n e + h i d a s t a v a t + h i d a s t e i t a + h i d a s t e l e e + h i d a s t e l e v a t + h i d a s t e l u a + h i d a s t e l u a a n + h i d a s t e t t u a + h i d a s t e t u n + h i d a s t u a + h i d a s t u i + h i d a s t u s t a + h i d a s t u u + h i d a s ä l y i s i ä + h i e k a l l e + h i e k k a a n + h i e k k a d y y n i a l u e e n + h i e k k a d y y n i e n + h i e k k a k a n s a + h i e k k a k i r p p u + h i e k k a k u o p p a a n + h i e k k a l a a t i k k o + h i e k k a l a a t i k k o l e i k k i ä + h i e k k a l i n n a + h i e k k a l i n n a a + h i e k k a l i n n a t + h i e k k a l i n n o j a + h i e k k a m a a l l a + h i e k k a m a a s s a + h i e k k a m y r s k y + h i e k k a p o h j a l l e + h i e k k a p u h a l l u s + h i e k k a r a n n a l l a + h i e k k a r a n t a a + h i e k k a r a n t o j a + h i e k k a r a n t o j e n + h i e k k a s ä k k e j ä + h i e k k a t a s a n k o + h i e n o a + h i e n o h e l m a + h i e n o i l l a + h i e n o i m m a t + h i e n o i m m a t k a a n + h i e n o i m m i s t a + h i e n o i n + h i e n o i s e s t a + h i e n o i s i a + h i e n o i s t a + h i e n o j a + h i e n o j a k o i s e n + h i e n o j e n + h i e n o l l a + h i e n o l l e + h i e n o m p a a + h i e n o n + h i e n o n a + h i e n o p a p e r i + h i e n o r a k e n n e v a k i o + h i e n o s s a + h i e n o s t u n e e m m i k s i + h i e n o s t u n e i m m i s t a + h i e n o s y i s e m m ä t + h i e n o s y i s e m p i ä + h i e n o s y i s e m p ä ä + h i e n o s ä ä d e t t y + h i e n o s ä ä d e t t ä v ä + h i e n o s ä ä d ö k s i + h i e n o s ä ä d ö n + h i e n o s ä ä d ö s t ä + h i e n o s ä ä t ä m i s e k s i + h i e n o s ä ä t ä m i s e s s ä + h i e n o s ä ä t ä m i s e s t ä + h i e n o s ä ä t ä m ä l l ä + h i e n o s ä ä t ä m ä ä n + h i e n o s ä ä t ä ä + h i e n o s ä ä t ö + h i e n o s ä ä t ö j e n + h i e n o s ä ä t ö o p e r a a t i o + h i e n o s ä ä t ö ä + h i e n o s ä ä t ö ö n + h i e n o t + h i e n o t u n t e i n e n + h i e n o t u n t e i s e m m i n + h i e n o t u n t e i s e s t i + h i e n o t u n t e i s i a + h i e n o t u n t e i s u u s s y i s t ä + h i e n o u k s i a + h i e n o v a r a i n e n + h i e n o v a r a i s e m m a l l e + h i e n o v a r a i s e m m i n + h i e n o v a r a i s e m p a a + h i e n o v a r a i s e m p i + h i e n o v a r a i s e m p i a + h i e n o v a r a i s e s t i + h i e n o v a r a i s t a + h i e n o v a r a i s u u t t a + h i e n o v i r e i s e m p i ä + h i e r a k k a l e h t i m i t t a r i + h i e r a r k i a a + h i e r a r k i a j ä r j e s t e l m ä + h i e r a r k i a p e r i a a t e + h i e r a r k i a p e r i a a t t e e n + h i e r a r k i a t a s o i l l a + h i e r a r k k i s e s t i + h i e r o g l y f i t + h i e r o n t a m u o t o j a + h i e r o n t a ö l j y + h i e r o t t u + h i e r t o k o n e + h i e s s ä + h i e t a h a i t + h i e t a k a l a + h i e t a k a m p e l a + h i e t a k a s t i k k a + h i e t a k a t k a r a p u + h i e t a k i i t ä j ä i s e t + h i e t a k i r s i k k a + h i e t a k i s s a + h i e t a k u r k i + h i e t a k y y h k y + h i e t a l a u k k a + h i e t a m e r i n a r s i s s i + h i e t a o l k i k u k k a + h i e t a r a n t a + h i e t a s i m p u k k a + h i e t a s i s i l i s k o + h i e t a t i i r a + h i e t a t o k k o + h i e t a t u h a t j a l k a i n e n + h i e t a t y l l i + h i e t a u n i k k o + h i e t i k k o n a t a + h i e t i k k o s a r a + h i h a m m e + h i h a n s a + h i h a t + h i h n a m a t o + h i i d e n k i r n u + h i i d e n m a a + h i i d e n n i e m e n + h i i d e n p a t a + h i i h d o n + h i i h d o n o h j a a j a t + h i i h d o n o p e t t a j a + h i i h d o n o p e t t a j a a + h i i h d o n o p e t t a j a t + h i i h d o n o p e t t a j i a + h i i h d o n o p e t t a j i e n + h i i h t o a l u e e n + h i i h t o a l u e e n n e + h i i h t o a l u e i l l a + h i i h t o a l u e t t a + h i i h t o h i s s e j ä + h i i h t o h i s s i + h i i h t o h i s s i t + h i i h t o h i s s i ä + h i i h t o i n f r a s t r u k t u u r i n + h i i h t o k a u d e l l e + h i i h t o k o u l u + h i i h t o l i i t o n + h i i h t o l i i t t o + h i i h t o l o m a + h i i h t o l o m a l l e + h i i h t o p u t k i + h i i h t o s a u v a + h i i h t o s u u n n i s t u k s e n + h i i h t o s u u n n i s t u s + h i i h t o t u n t e j a + h i i h t ä j ä t + h i i l e l l e + h i i l e l l ä + h i i l e n + h i i l e n k ä y t t ö ä + h i i l e n k ä y t ö n + h i i l e n l o u h i n t a a n + h i i l e n p o l t o n + h i i l e n s i t o m i s t e k n i i k o i d e n + h i i l e n t u o t a n n o s t a + h i i l e n t u o t a n t o + h i i l e n t u o t a n t o a + h i i l e n t u o t t a j a + h i i l e n t u o t t a m i s t e k n o l o g i a s t a + h i i l i a i k a k a u d e n + h i i l i a l a + h i i l i a l a l l a + h i i l i a l a l l e + h i i l i a l a n + h i i l i a l o i l l a + h i i l i a s e m a + h i i l i d i o k s i d i + h i i l i d i o k s i d i a + h i i l i d i o k s i d i e k v i v a l e n t t i + h i i l i d i o k s i d i e n + h i i l i d i o k s i d i e n e r g i a v e r o + h i i l i d i o k s i d i g r a m m a n + h i i l i d i o k s i d i h u i j a r i t + h i i l i d i o k s i d i i n + h i i l i d i o k s i d i j a l a n j ä l j e t + h i i l i d i o k s i d i j a l a n j ä l k e e n + h i i l i d i o k s i d i j a l a n j ä l k i + h i i l i d i o k s i d i k a a s u j e n + h i i l i d i o k s i d i k a u p a l l a + h i i l i d i o k s i d i k a u p a s s a + h i i l i d i o k s i d i k a u p p o i n a + h i i l i d i o k s i d i k i i n t i ö i t ä + h i i l i d i o k s i d i k i i n t i ö i t ä ä n + h i i l i d i o k s i d i k i i n t i ö n s ä + h i i l i d i o k s i d i k y s y m y k s e n + h i i l i d i o k s i d i l l e + h i i l i d i o k s i d i l ä h t e e k s i + h i i l i d i o k s i d i m a k s u + h i i l i d i o k s i d i m a k s u j a + h i i l i d i o k s i d i m a k s u s t a + h i i l i d i o k s i d i m a k s u t + h i i l i d i o k s i d i m a r k k i n a t + h i i l i d i o k s i d i m a r k k i n o i d e n + h i i l i d i o k s i d i m a r k k i n o i l l e + h i i l i d i o k s i d i m a r k k i n o i l t a + h i i l i d i o k s i d i m a r k k i n o i t a + h i i l i d i o k s i d i m ä ä r i e n + h i i l i d i o k s i d i m ä ä r ä + h i i l i d i o k s i d i m ä ä r ä ä + h i i l i d i o k s i d i n + h i i l i d i o k s i d i n e u t r a a l e j a + h i i l i d i o k s i d i n e u t r a a l i n + h i i l i d i o k s i d i n i e l u i k s i + h i i l i d i o k s i d i n i e l u i n a + h i i l i d i o k s i d i n i e l u j a + h i i l i d i o k s i d i n i e l u t + h i i l i d i o k s i d i p i t o i s u u d e n + h i i l i d i o k s i d i p i t o i s u u k s i e n + h i i l i d i o k s i d i p ä ä s t ö + h i i l i d i o k s i d i p ä ä s t ö i h i n + h i i l i d i o k s i d i p ä ä s t ö i l l e + h i i l i d i o k s i d i p ä ä s t ö i l l ä m m e + h i i l i d i o k s i d i p ä ä s t ö i l t ä + h i i l i d i o k s i d i p ä ä s t ö i n + h i i l i d i o k s i d i p ä ä s t ö i s s ä + h i i l i d i o k s i d i p ä ä s t ö i s t ä + h i i l i d i o k s i d i p ä ä s t ö j e n + h i i l i d i o k s i d i p ä ä s t ö j ä + h i i l i d i o k s i d i p ä ä s t ö j ä m m e + h i i l i d i o k s i d i p ä ä s t ö j ä ä n + h i i l i d i o k s i d i p ä ä s t ö k a u p p a a + h i i l i d i o k s i d i p ä ä s t ö k i i n t i ö i d e n + h i i l i d i o k s i d i p ä ä s t ö l u v i s t a + h i i l i d i o k s i d i p ä ä s t ö l ä h d e + h i i l i d i o k s i d i p ä ä s t ö m a r k k i n o i d e n + h i i l i d i o k s i d i p ä ä s t ö n s ä + h i i l i d i o k s i d i p ä ä s t ö r a j a + h i i l i d i o k s i d i p ä ä s t ö r a j o j a + h i i l i d i o k s i d i p ä ä s t ö t + h i i l i d i o k s i d i p ä ä s t ö t a v o i t t e e n + h i i l i d i o k s i d i p ä ä s t ö v e r o n + h i i l i d i o k s i d i p ä ä s t ö v ä h e n n y k s e t + h i i l i d i o k s i d i s t a + h i i l i d i o k s i d i s ä ä s t ö j ä + h i i l i d i o k s i d i t a s a p a i n o a + h i i l i d i o k s i d i t e h o k k u u d e s t a + h i i l i d i o k s i d i t o n n i + h i i l i d i o k s i d i t o n n i a + h i i l i d i o k s i d i t o n n i l t a + h i i l i d i o k s i d i t o n n i n + h i i l i d i o k s i d i v a p a a l l a + h i i l i d i o k s i d i v e r o + h i i l i d i o k s i d i v e r o a + h i i l i d i o k s i d i v e r o j e n + h i i l i d i o k s i d i v e r o n + h i i l i d i o k s i d i v e r o o n + h i i l i d i o k s i d i v e r o s t a + h i i l i d i o k s i d i v e r o t + h i i l i d i o k s i d i v i r t o j e n + h i i l i d i o k s i d i v u o t o a + h i i l i d i o k s i d i v ä h e n n y k s e e n + h i i l i d i o k s i d i v ä h e n n y k s e n + h i i l i d i o k s i d i v ä h e n n y k s e t + h i i l i d i o k s i d i v ä h e n n y s + h i i l i d i s u l f i d i + h i i l i h a p p o + h i i l i h y d r a a t t i p i t o i s u u k s i e n + h i i l i h y d r a a t t i t e o l l i s u u s + h i i l i h y v i t y k s i ä + h i i l i j a l a n j ä l j e n + h i i l i j a l a n j ä l j e s t ä + h i i l i j a l a n j ä l j e s t ä ä n + h i i l i j a l a n j ä l k e e n + h i i l i j a l a n j ä l k e m m e + h i i l i j a l a n j ä l k e n ä + h i i l i j a l a n j ä l k e ä + h i i l i j a l a n j ä l k e ä m m e + h i i l i j a l a n j ä l k e ä ä n + h i i l i j a l a n j ä l k i + h i i l i k a a s u + h i i l i k a i v o k s e n s a + h i i l i k a i v o k s e t + h i i l i k a i v o k s i a + h i i l i k a i v o k s i i n s a + h i i l i k a i v o k s i l l e + h i i l i k a i v o k s i l t a + h i i l i k a i v o k s i s t a + h i i l i k a i v o s a l a + h i i l i k a i v o s a l u e e l l a + h i i l i k a i v o s a l u e i d e n + h i i l i k a i v o s t e n + h i i l i k a i v o s t e n s a + h i i l i k a i v o s t e o l l i s u u d e l l e + h i i l i k a i v o s t e o l l i s u u d e n + h i i l i k a i v o s t e o l l i s u u d e s s a + h i i l i k a i v o s t e o l l i s u u s + h i i l i k a i v o s t o i m i n n a l l e + h i i l i k a i v o s t o i m i n n a l t a + h i i l i k a i v o s t o i m i n t a + h i i l i k a i v o s t o i m i n t a a + h i i l i k a i v o s y h t e i s ö j e m m e + h i i l i k a i v o s y h t i ö i s t ä + h i i l i k a s a n + h i i l i k a u p a n + h i i l i k a u p p a + h i i l i k a u p p a a + h i i l i k e n t ä t + h i i l i k e s k u k s i s s a + h i i l i k i e r t o a + h i i l i k i e r t o o n + h i i l i k o n d r i i t t i + h i i l i k ä y t t ö i s t e n + h i i l i k ä y t t ö i s t ä + h i i l i l ö y t ö j ä + h i i l i m a r k k i n a t + h i i l i m a r k k i n o i d e n + h i i l i m a r k k i n o i k s i + h i i l i m a r k k i n o i l l a + h i i l i m a r k k i n o i l l e + h i i l i m a r k k i n o i l t a + h i i l i m a r k k i n o i s t a + h i i l i m a r k k i n o i t a + h i i l i m i t t a u s t a + h i i l i m o n o k s i d i + h i i l i m o n o k s i d i a + h i i l i m o n o k s i d i l l e + h i i l i m o n o k s i d i n + h i i l i m o n o k s i d i p ä ä s t ö i s t ä + h i i l i m o n o k s i d i p ä ä s t ö j e n + h i i l i m o n o k s i d i s t a + h i i l i n a n o p u t k i p o h j a i s i i n + h i i l i n e u t r a a l e i k s i + h i i l i n e u t r a a l i + h i i l i n e u t r a a l i i n + h i i l i n e u t r a a l i s t a + h i i l i n e u t r a a l i u s + h i i l i n i e l u + h i i l i n i e l u i h i n + h i i l i n i e l u i n a + h i i l i n i e l u i s t a + h i i l i n i e l u j a + h i i l i n i e l u j e n + h i i l i n i e l u k s i + h i i l i n i e l u n + h i i l i n i e l u n a + h i i l i n i e l u t + h i i l i o n g e l m a a + h i i l i p a p e r i + h i i l i p l a n e e t t a + h i i l i p o h j a i s e n + h i i l i p o l i t i i k k a a + h i i l i p ä ä s t ö i l l e + h i i l i p ä ä s t ö i s s ä + h i i l i p ä ä s t ö i s t ä + h i i l i p ä ä s t ö i s t ä m m e + h i i l i p ä ä s t ö j e n + h i i l i p ä ä s t ö j ä + h i i l i p ä ä s t ö j ä ä n + h i i l i p ä ä s t ö t + h i i l i p ö l y + h i i l i r a h a s t o n + h i i l i r y h m ä + h i i l i s i n k i t + h i i l i s i n k k i p a r i s t o i l l a + h i i l i s o p i m u s + h i i l i s y k l i + h i i l i s ä k k i + h i i l i t a l o u d e s s a + h i i l i t a l o u d e s t a + h i i l i t a l o u s + h i i l i t a s e e s t a + h i i l i t a s e i s t a + h i i l i t a v o i t t e i s i i n + h i i l i t e k n i i k k a a + h i i l i t e k n o l o g i a + h i i l i t e k n o l o g i a a + h i i l i t e k n o l o g i a a n + h i i l i t e k n o l o g i a n + h i i l i t e k n o l o g i a s t a + h i i l i t e k n o l o g i o i d e n + h i i l i t e k n o l o g i o i h i n + h i i l i t e k n o l o g i o i t a + h i i l i t e o l l i s u u d e l l e + h i i l i t e o l l i s u u d e n + h i i l i t e o l l i s u u d e s s a + h i i l i t e o l l i s u u d e t + h i i l i t e o l l i s u u s + h i i l i t e o l l i s u u t e n s a + h i i l i t e o l l i s u u t t a + h i i l i t e t r a k l o r i d i + h i i l i t u k i a + h i i l i t u o t a n t o a + h i i l i t u o t t e i d e n + h i i l i t y ö l ä i s t e n + h i i l i t ä h t i + h i i l i v a h i n k o j a + h i i l i v a r a n n o t + h i i l i v a r a n t o j e n + h i i l i v a r a s t o j e n + h i i l i v a r o i h i n + h i i l i v a r o i l l e + h i i l i v a r o j a + h i i l i v a r o j a m m e + h i i l i v e d y i s t ä + h i i l i v e r o + h i i l i v e r o a + h i i l i v e r o h u i j a u k s e n + h i i l i v e r o i h i n + h i i l i v e r o j e n + h i i l i v e r o n + h i i l i v e r o o n + h i i l i v e r o s t a + h i i l i v e r o t + h i i l i v e t y d i r e k t i i v i s s ä + h i i l i v e t y j e n + h i i l i v e t y j ä + h i i l i v e t y k e n t i l l ä + h i i l i v e t y l ä h t e i s t ä + h i i l i v e t y m a r k k i n o i d e n + h i i l i v e t y p o l t t o a i n e i d e n + h i i l i v e t y p ä ä s t ö i s t ä + h i i l i v e t y p ä ä s t ö j e n + h i i l i v e t y p ä ä s t ö j ä + h i i l i v e t y r e s u r s s e j a a n + h i i l i v e t y r e s u r s s i t + h i i l i v e t y s a a s t e e s t a + h i i l i v e t y s a a s t e e t + h i i l i v e t y s a a s t e i d e n + h i i l i v e t y s a a s t e i l l e + h i i l i v e t y s a a s t e i t a + h i i l i v e t y t u o t t e i d e n + h i i l i v e t y v a r a n n o t + h i i l i v e t y v a r o i s t a + h i i l i v e t y v a r o j a + h i i l i v e t y v u o t o j e n + h i i l i v o i m a a + h i i l i v o i m a l a + h i i l i v o i m a l a a + h i i l i v o i m a l a i t o k s i a + h i i l i v o i m a l a i t o k s i l l a + h i i l i v o i m a l a i t o k s i s t a + h i i l i v o i m a l a i t o s + h i i l i v o i m a l a n + h i i l i v o i m a l a n s a + h i i l i v o i m a l a t + h i i l i v o i m a l o i d e n + h i i l i v o i m a l o i h i n + h i i l i v o i m a l o i l l a + h i i l i v o i m a l o i l l e + h i i l i v o i m a l o i s s a + h i i l i v o i m a l o i s t a + h i i l i v o i m a l o i t a + h i i l i v o i m a s t a + h i i l i v u o d o i s t a + h i i l i v u o d o k s i + h i i l i v u o d o l l e + h i i l i v u o d o l t a + h i i l i v u o d o n + h i i l i v u o d o s s a + h i i l i v u o d o s t a + h i i l i v u o d o t + h i i l i v u o t o + h i i l i v u o t o a + h i i l i v u o t o j a + h i i l i v u o t o j e n + h i i l i v u o t o o n + h i i l i v u o t o r i s k i + h i i l i v u o t o r i s k i e n + h i i l i v u o t o r i s k i s t ä + h i i l i v u o t o s u o j a u k s e n + h i i l i y h d i s t e i d e n + h i i l i y h d i s t e i t ä + h i i l i ä + h i i l l o s t a a + h i i l l o s t e t a a n + h i i l t ä + h i i p u a + h i i p u i s i + h i i p u m i n e n + h i i p u m i s e e n + h i i p u m i s t a a n + h i i p u n u t + h i i p u u + h i i r e n + h i i r e n h ä n t ä + h i i r e n m e t s ä s t ä j ä t + h i i r e n o h r a + h i i r e n p o r r a s + h i i r e n v a l m u s k a + h i i r e n v i r n a + h i i r i e l e e t + h i i r i h a i + h i i r i h a u k k a + h i i r i k e r t t u l i + h i i r i k ä s i + h i i r i l e i k k i + h i i r i m a k i t + h i i r i m a t o n + h i i r i o p o s s u m i + h i i r i p i i k k i p y r s t ö + h i i r i p ö l l ö + h i i r i t a p a k u l o + h i i r i v a m m o j a + h i i r t ä + h i i v a u u t e + h i i v i s k e l y p e l i + h i k e ä + h i k e ä ä n + h i k i m a j a + h i k i r a u h a n e n + h i k o i l e m a s t a + h i l a e n e r g i a + h i l a v i r h e + h i l j a i s e l l a + h i l j a i s e m m i l l a + h i l j a i s e m m i n + h i l j a i s e m p i a + h i l j a i s e m p i i n + h i l j a i s e n + h i l j a i s e s t a + h i l j a i s u u d e k s i + h i l j a i s u u d e l l a + h i l j a i s u u d e n + h i l j a i s u u d e s t a + h i l j a i s u u t t a + h i l j a k s e e n + h i l j a l l e e n + h i l j a t t a i n k i n + h i l j a t t a i s e n + h i l j a t t a i s e s s a + h i l j a t t a i s e t + h i l j a t t a i s t e n + h i l j e n e v ä t + h i l j e n t y n y t + h i l j e n t ä m i s e e n + h i l j e n t ä m i s e k s i + h i l l e r e i s t ä + h i l l e r i e n + h i l l e r i n o m i s t a j i a + h i l l e r i s ä ä t i ö + h i l l i t s e e + h i l l i t s e m i s e k s i + h i l l i t s e m i s p a k e t i s s a + h i l l i t s e m i s p o l i t i i k a n + h i l l i t s e m i s p o n n i s t e l u j a + h i l l i t s e m i s t a v o i t e t t a + h i l l i t s e m i s t o i m e n p i t e i d e n + h i l l i t s e m i s t o i m e n p i t e i l l e + h i l l i t s e m i s t o i m e n p i t e i t ä + h i l l i t s e m i s t o i m i a + h i l l i t s e m i s t o i m i e n + h i l l i t s e m i s y r i t y k s e t + h i l l i t s e m ä t t ö m ä ä n + h i l l i t s e m ä ä n + h i l l i t t y j ä + h i l l i t t y ä + h i l l i t t ö m ä l l e + h i l l i t t ö m ä s t ä + h i l l i t y i l l ä + h i l l i t y m m i n + h i l l i t y m m ä n + h i l l i t y m p i + h i l l i t ä k s e m m e + h i l l o m a r k k i n o i l l e + h i l l o p u r k i s s a + h i l l o s i p u l i + h i l l o s o k e r i + h i l s e r a u n i o i n e n + h i m a l a j a n s e t r i + h i m o i h i n + h i n a u s a j o n e u v o i k s i + h i n a u s a j o n e u v o i l l e + h i n a u s p a l v e l u j e n + h i n a u s p a l v e l u t + h i n d u e n e m m i s t ö i s e s s ä + h i n d u f a n a a t i k k o j e n + h i n d u f u n d a m e n t a l i s t i t + h i n d u k a l e n t e r i + h i n d u n a t i o n a l i s m i i n + h i n d u n a t i o n a l i s m i s t a + h i n d u o r g a n i s a a t i o n + h i n d u p y h i i n v a e l t a j a a + h i n d u s t a n i n p ö l l ö + h i n d u t + h i n d u t e m p p e l i i n + h i n d u v ä e s t ö + h i n d u v ä h e m m i s t ö j e n + h i n d u v ä h e m m i s t ö ä + h i n d u y h t e i s ö ö n + h i n k u y s k ä ä + h i n k u y s k ä ä n + h i n n a l l a + h i n n a n + h i n n a n a l e n n u k s e e n + h i n n a n a l e n n u k s e n + h i n n a n a l e n n u k s e s t a + h i n n a n a l e n n u k s e t + h i n n a n a l e n n u k s i a + h i n n a n a l e n n u k s i i n + h i n n a n a l e n n u k s i s t a + h i n n a n a l e n n u s + h i n n a n a l e n n u s o h j e l m a a + h i n n a n a l e n n u s p o l i t i i k k a a + h i n n a n a l e n n u s t a + h i n n a n a l e n n u s t e n + h i n n a n e r o j ä r j e s t e l m ä + h i n n a n e r o k o r v a u k s e t + h i n n a n e r o k o r v a u k s i i n + h i n n a n e r o k o r v a u s j ä r j e s t e l m ä + h i n n a n e r o k o r v a u s l i n j a a + h i n n a n e r o s o p i m u k s i a + h i n n a n e r o t + h i n n a n k o r o t t a j i a + h i n n a n k o r o t u k s e n + h i n n a n k o r o t u k s e s t a + h i n n a n k o r o t u k s e t + h i n n a n k o r o t u k s i a + h i n n a n k o r o t u k s i i n + h i n n a n k o r o t u k s i l l a + h i n n a n k o r o t u k s i s t a + h i n n a n k o r o t u s + h i n n a n k o r o t u s t a + h i n n a n k o r o t u s t e n + h i n n a n l a s k u + h i n n a n l a s k u j a + h i n n a n l a s k u n + h i n n a n l a s k u s t a + h i n n a n l a s k u t + h i n n a n l e i k k a u k s e n + h i n n a n l e i k k a u s + h i n n a n m u k a u t u s t e n + h i n n a n m u o d o s t u k s e e n + h i n n a n m u o d o s t u k s e n + h i n n a n m u o d o s t u s + h i n n a n m u o d o s t u s p r o s e s s i + h i n n a n m u o d o s t u s p r o s e s s i n + h i n n a n m u o d o s t u s t a + h i n n a n m u u t o k s e t + h i n n a n m u u t o k s i a + h i n n a n m u u t o k s i i n + h i n n a n m ä ä r i t y s m e k a n i s m e j a + h i n n a n n o s t o a + h i n n a n n o u s u + h i n n a n n o u s u a + h i n n a n n o u s u i h i n + h i n n a n n o u s u i l l e + h i n n a n n o u s u i l t a + h i n n a n n o u s u i s t a + h i n n a n n o u s u j a + h i n n a n n o u s u j e n + h i n n a n n o u s u l l e + h i n n a n n o u s u n + h i n n a n n o u s u s t a + h i n n a n n o u s u t + h i n n a n n o u s u u n + h i n n a n s ä ä t e l i j ö i k s i + h i n n a n t a s a u s m a k s u j e n + h i n n a n t a s a u s m a k s u t + h i n n a n t a s a u s t a + h i n n a n v a i h t e l u i l l e + h i n n a n v a i h t e l u i s t a + h i n n a n v a i h t e l u i t a + h i n n a n v a i h t e l u j e n + h i n n a n v a i h t e l u t + h i n n a n v a k a u t u s v ä l i n e i d e n + h i n n a n v a l v o n t a j ä r j e s t e l m ä n + h i n n a s t a + h i n n a t + h i n n o i l l a + h i n n o i n + h i n n o i s s a + h i n n o i s t a + h i n n o i t e l l a + h i n n o i t e l l a k s e m m e + h i n n o i t e l t u a + h i n n o i t t e l u a + h i n n o i t t e l u a s i a t + h i n n o i t t e l u e r o j a + h i n n o i t t e l u e r o j e n + h i n n o i t t e l u h a n k k e e n + h i n n o i t t e l u i h i n + h i n n o i t t e l u j ä r j e s t e l m ä + h i n n o i t t e l u j ä r j e s t e l m ä n + h i n n o i t t e l u j ä r j e s t e l m ä ä + h i n n o i t t e l u j ä r j e s t e l m ä ä n + h i n n o i t t e l u k y s y m y s + h i n n o i t t e l u k ä y t t ä y t y m i n e n + h i n n o i t t e l u k ä y t ä n n ö i l t ä + h i n n o i t t e l u k ä y t ä n n ö i s t ä + h i n n o i t t e l u k ä y t ä n t e i l l ä + h i n n o i t t e l u k ä y t ä n t ö j ä + h i n n o i t t e l u k ä y t ä n t ö ä + h i n n o i t t e l u l l a + h i n n o i t t e l u l l e + h i n n o i t t e l u m a l l i t + h i n n o i t t e l u m e k a n i s m i s t a + h i n n o i t t e l u m e n e t e l m ä + h i n n o i t t e l u m e n e t t e l y + h i n n o i t t e l u n + h i n n o i t t e l u n v a p a u t t a + h i n n o i t t e l u o n g e l m i a + h i n n o i t t e l u p e r i a a t e t t a + h i n n o i t t e l u p e r u s t e e t + h i n n o i t t e l u p o l i t i i k a l l a + h i n n o i t t e l u p o l i t i i k a n + h i n n o i t t e l u p o l i t i i k a s s a + h i n n o i t t e l u p o l i t i i k a t + h i n n o i t t e l u p o l i t i i k k a + h i n n o i t t e l u p o l i t i i k k a a + h i n n o i t t e l u p o l i t i i k k a a m m e + h i n n o i t t e l u p o l i t i i k k a a n + h i n n o i t t e l u p o l i t i i k k o j e n + h i n n o i t t e l u r a k e n t e e n + h i n n o i t t e l u r a k e n t e e s e e n + h i n n o i t t e l u r a k e n t e i d e n + h i n n o i t t e l u s s a + h i n n o i t t e l u s t a + h i n n o i t t e l u s t r a t e g i a + h i n n o i t t e l u t i e d o i s t a + h i n n o i t t e l u t o i m i i n + h i n n o i t t e l u u n + h i n t a a + h i n t a a n + h i n t a d i s k r i m i n o i n t i + h i n t a e d u n + h i n t a e h d o t + h i n t a e h d o t u k s e s s a + h i n t a e h d o t u k s e t + h i n t a e h d o t u k s i a + h i n t a e h d o t u k s i i n + h i n t a e h d o t u s t e n + h i n t a e p ä v a k a u t t a + h i n t a e r i t t e l y n + h i n t a e r o + h i n t a e r o a + h i n t a e r o i h i n + h i n t a e r o i l l a + h i n t a e r o i s t a + h i n t a e r o j a + h i n t a e r o j e n + h i n t a e r o n + h i n t a e r o t + h i n t a e t u a + h i n t a e t u u k s i e n + h i n t a h e i l a h t e l u j e n + h i n t a h e r k k y y t t ä + h i n t a h u i p p u i h i n + h i n t a i n d e k s i + h i n t a i n d e k s i e n + h i n t a i n d e k s i i n + h i n t a i n d e k s i n + h i n t a i n f l a a t i o + h i n t a i n f l a a t i o l l e + h i n t a i n f l a a t i o n + h i n t a i n f l a a t i o o n + h i n t a i n t e r v e n t i o j ä r j e s t e l m ä + h i n t a j o h t a j u u t t a + h i n t a j ä r j e s t e l m i e n + h i n t a j ä r j e s t e l m i s t ä + h i n t a j ä r j e s t e l m ä + h i n t a j ä r j e s t e l m ä n + h i n t a j ä r j e s t e l m ä s t ä + h i n t a j ä r j e s t e l m ä t + h i n t a j ä r j e s t e l m ä ä + h i n t a j ä r j e s t e l m ä ä n + h i n t a k a r t e l l i + h i n t a k a r t e l l i l l e + h i n t a k a r t e l l i t a p a u k s i a + h i n t a k a r t e l l i t a p a u k s i s s a + h i n t a k a t o n + h i n t a k a t o t + h i n t a k a t t o j a + h i n t a k e h i t y k s e e n + h i n t a k e h i t y k s e l l e + h i n t a k e h i t y k s e n + h i n t a k e h i t y k s e s s ä + h i n t a k e h i t y k s e s t ä + h i n t a k e h i t y s + h i n t a k e h i t y s n ä k y m i s t ä + h i n t a k e h i t y s t ä + h i n t a k e i n o t t e l u + h i n t a k e i n o t t e l u s t a + h i n t a k e s k u s t e l u a + h i n t a k e s k u s t e l u j e n + h i n t a k e s k u s t e l u n + h i n t a k e t j u n + h i n t a k i e r r e + h i n t a k i i s t a + h i n t a k i l p a i l u + h i n t a k i l p a i l u a + h i n t a k i l p a i l u k y k y n s ä + h i n t a k i l p a i l u n + h i n t a k i l p a i l u s t a + h i n t a k i l p a i l u u n + h i n t a k o r j a u k s i a + h i n t a k r i i s i + h i n t a k r i i s i n + h i n t a k r i i s i t + h i n t a k r i i s i ä + h i n t a k u i l u n + h i n t a k y s y m y k s i ä + h i n t a k y s y m y s + h i n t a l a p p u + h i n t a l a p u k s i + h i n t a l a p u l l a + h i n t a l e i k k a u k s i a + h i n t a l e i k k a u k s i s t a + h i n t a l u o k a s s a + h i n t a l u o k i t u k s e s t a + h i n t a l u o k k a a n + h i n t a m a n i p u l a a t i o n + h i n t a m e k a n i s m i + h i n t a m e k a n i s m i a + h i n t a m e k a n i s m i t + h i n t a m e r k i n n ä n + h i n t a m e r k i n n ä t + h i n t a m e r k i n t ä + h i n t a m e r k i n t ä v a a t i m u k s e t + h i n t a m e r k i n t ö j e n + h i n t a n a + h i n t a n e u v o t t e l u i s s a + h i n t a n s a + h i n t a p a i n e + h i n t a p a i n e e t + h i n t a p a i n e i d e n + h i n t a p a i n e i s i i n + h i n t a p a i n e i t a + h i n t a p a i n e t t a + h i n t a p a k e t e i s s a + h i n t a p a k e t i k s i + h i n t a p a k e t i l l a + h i n t a p a k e t i l l e + h i n t a p a k e t i n + h i n t a p a k e t i s s a + h i n t a p a k e t i s s a a n + h i n t a p a k e t i s t a + h i n t a p a k e t t i + h i n t a p a k e t t i a + h i n t a p a k e t t i e h d o t u k s e t + h i n t a p a k e t t i e n + h i n t a p a k e t t i e s i t y s + h i n t a p a k e t t i i n + h i n t a p i i k k i e n + h i n t a p o l i t i i k a l l a + h i n t a p o l i t i i k a n + h i n t a p o l i t i i k a s t a + h i n t a p o l i t i i k k a + h i n t a p o l i t i i k k a a + h i n t a p o l i t i i k k a a n + h i n t a p o t e n t i a a l i n + h i n t a p ä ä t ö k s i i n + h i n t a p ä ä t ö k s i s s ä m m e + h i n t a r a j a + h i n t a r a j a t + h i n t a r a j o j a + h i n t a r a j o j e n + h i n t a r a k e n n e + h i n t a r a k e n t e e l l e + h i n t a r a k e n t e e n s a + h i n t a r a k e n t e e s e e n + h i n t a r a k e n t e i s i i n + h i n t a r o m a h d u k s e e n + h i n t a r o m a h d u k s i a + h i n t a r o m a h d u s + h i n t a r y h m i ä + h i n t a s e u r a n t a + h i n t a s e u r a n t a a n + h i n t a s e u r a n t a j ä r j e s t e l m ä + h i n t a s h o k k e j a + h i n t a s i g n a a l e j a + h i n t a s i g n a a l i t + h i n t a s i m u l a a t t o r e i t a + h i n t a s o d a n + h i n t a s o d a s s a + h i n t a s o d i l l a + h i n t a s o p e u t u s t e n + h i n t a s o p i m u k s i a + h i n t a s o p i m u k s i s t a + h i n t a s o p i m u s t a + h i n t a s o t a + h i n t a s o t a a + h i n t a s t r a t e g i a a + h i n t a s t r a t e g i o i t a + h i n t a s u o j a + h i n t a s y r j i n t ä + h i n t a s y r j i n t ä ä n + h i n t a s ä ä n n ö s t e l y l l e + h i n t a s ä ä n n ö t + h i n t a s ä ä n t e l y + h i n t a s ä ä n t e l y n + h i n t a s ä ä n t e l y s t ä + h i n t a s ä ä n t e l y y n + h i n t a s ä ä n t e l y ä + h i n t a s ä ä n t ö j e n + h i n t a s ä ä s t ö j e n + h i n t a t a k u i d e n + h i n t a t a k u i s t a + h i n t a t a k u u a l e n n u k s e t + h i n t a t a k u u j ä r j e s t e l m ä t + h i n t a t a k u u l l a + h i n t a t a k u u n + h i n t a t a k u u t + h i n t a t a r j o u k s i a + h i n t a t a r k i s t u k s i i n + h i n t a t a r k i s t u s m a l l i n + h i n t a t a s o + h i n t a t a s o a + h i n t a t a s o j a + h i n t a t a s o l l a + h i n t a t a s o m m e + h i n t a t a s o n + h i n t a t a s o o n + h i n t a t a s o s t a + h i n t a t i e d o t + h i n t a t i e d o t u s + h i n t a t i e t o a + h i n t a t i e t o i h i n + h i n t a t i e t o i s i a + h i n t a t i e t o j e n + h i n t a t i l a n n e + h i n t a t i l a n t e e n + h i n t a t i l a n t e e s s a + h i n t a t o i m e n p i d e + h i n t a t u e n + h i n t a t u e s t a + h i n t a t u k e a + h i n t a t u k e e n + h i n t a t u k i + h i n t a t u k i a + h i n t a t u k i j ä r j e s t e l m ä + h i n t a t u k i j ä r j e s t e l m ä s t ä + h i n t a t u k i j ä r j e s t e l y i h i n + h i n t a t u k i p o l i t i i k a s t a + h i n t a t u k i p o l i t i i k k a + h i n t a t u r v a i n d e k s i ä + h i n t a t u t k i m u k s e n + h i n t a v a i h t e l u + h i n t a v a i h t e l u a + h i n t a v a i h t e l u i d e n + h i n t a v a i h t e l u i h i n + h i n t a v a i h t e l u i l l e + h i n t a v a i h t e l u i l t a + h i n t a v a i h t e l u i s t a + h i n t a v a i h t e l u i t a + h i n t a v a i h t e l u j a + h i n t a v a i h t e l u j e n + h i n t a v a i h t e l u l l e + h i n t a v a i h t e l u n + h i n t a v a i h t e l u t + h i n t a v a i h t e l u u n + h i n t a v a i k u t u k s e t + h i n t a v a k a u d e k s i + h i n t a v a k a u d e l l a + h i n t a v a k a u d e l l e + h i n t a v a k a u d e n + h i n t a v a k a u d e s t a + h i n t a v a k a u s + h i n t a v a k a u s k r i t e e r i + h i n t a v a k a u s n ä k y m i s t ä + h i n t a v a k a u s n ä k y m i ä + h i n t a v a k a u s n ä k y m ä t + h i n t a v a k a u s p o l i t i i k k a a + h i n t a v a k a u s t a v o i t t e e l l a + h i n t a v a k a u t e e n + h i n t a v a k a u t t a + h i n t a v a l v o n n a l l a + h i n t a v a l v o n n a s t a + h i n t a v a l v o n t a + h i n t a v a l v o n t a a + h i n t a v e r t a i l u + h i n t a v e r t a i l u a + h i n t a v e r t a i l u j a + h i n t a v e r t a i l u n + h i n t a v i i d a k o s s a + h i n t a v ä l i n e e n + h i n t a v ä l i n e e n ä + h i n t a v ä l i n e e t + h i n t a y l ä r a j a t + h i n t a y l ä r a j o i s t a + h i n t a š o k e i l t a + h i n t a š o k k i + h i n t o i h i n + h i n t o i h i n s a + h i n t o i n a + h i n t o j a + h i n t o j e n + h i n t o j e n l a s k u n + h i n t o j e n l a s k u s t a + h i n t o j e n n o u s u a + h i n t o j e n n o u s u l l e + h i n t o j e n n o u s u s t a + h i n t o j e n n o u s u t + h i n t o j e n r o m a h d u k s e n + h i o i v a t + h i o k a a m m e + h i o m i s y r i t y k s e n + h i o t t a v a + h i o t u m p i + h i p p i ä i s k e r t t u l i + h i p p i ä i s k o t i n g a + h i p p i ä i s u u n i l i n t u + h i r m u h a l l i n n o i l l e + h i r m u h a l l i n n o n + h i r m u h a l l i n t o + h i r m u h a l l i n t o a + h i r m u h a l l i n t o j a + h i r m u h a l l i t u s t e n + h i r m u m y r s k y + h i r m u m y r s k y i s t ä + h i r m u m y r s k y n + h i r m u m y r s k y ä + h i r m u r y k m e n t t i + h i r m u t e k o a + h i r m u t e k o j a + h i r m u t e k o j e n + h i r m u t e o i s t a + h i r m u t e o s t a + h i r m u t e o t + h i r m u t y ö t + h i r m u t ö i d e n + h i r m u v a l l a l l e + h i r m u v a l l a n + h i r m u v a l l a s t a + h i r m u v a l t a + h i r m u v a l t a a + h i r m u v a l t a h a l l i n t o + h i r m u v a l t i a i d e n + h i r s i r a k e n t a m i n e n + h i r s s i s a r a + h i r s s i v a h a n o k k a + h i r t e t t i i n + h i r t e t t y ä + h i r t e t t ä v ä n + h i r t t o p a i k a l l e + h i r t t o t u o m i o k s i + h i r v e i m p i e n + h i r v e i m p i ä + h i r v e i n t ä + h i r v e n k e l l o + h i r v e n k i e l i + h i r v e n m e t s ä s t y k s e n + h i r v e n m e t s ä s t y s + h i r v e n m e t s ä s t ä j ä + h i r v e n m e t s ä s t ä j ä t + h i r v e n n e n ä s a i v a r t a j a + h i r v e n s a r v i s a n i a i n e n + h i r v e y k s i ä + h i r v e ä m p i ä + h i r v e ä s t ä + h i r v e ä t + h i r v e ä ä + h i r v i a n t i l o o p p i + h i r v i k a n t a + h i r v i k ä r p ä n e n + h i r v i t e s t i n + h i r v i t e s t i n s ä + h i r v i t t ä v i e n + h i r v i t t ä v i i n + h i r v i t t ä v i m p i ä + h i r v i t t ä v i m p ä ä n + h i r v i t t ä v i n + h i r v i t t ä v i s s ä + h i r v i t t ä v i s t ä + h i r v i t t ä v i ä + h i r v i t t ä v ä m m i s t ä + h i r v i t t ä v ä m p i + h i r v i t t ä v ä m p ä ä + h i r v i t t ä v ä n + h i r v i t t ä v ä s s ä + h i r v i t t ä v ä s t ä + h i r v i t t ä v ä ä + h i r v i ö a l l e r g i a a + h i r v i ö i d e n + h i r v i ö i d e n m e r i + h i r v i ö i t ä + h i r v i ö k s i + h i r v i ö l l e + h i r v i ö m ä i s i m m ä s t ä + h i r v i ö m ä i s i ä + h i r v i ö m ä i s t ä + h i r v i ö n + h i r v i ö s u s i + h i s s e i s t ä + h i s s i d i r e k t i i v i + h i s s i d i r e k t i i v i n + h i s s i d i r e k t i i v i s t ä + h i s s i e n + h i s s i e n k ä y t t ö m a h d o l l i s u u k s i a + h i s s i l a i t e + h i s s i l l ä + h i s s i m u s i i k k i + h i s s i o n g e l m a + h i s s i r i v i s t ö j e n + h i s s i ä + h i s t o r i a a + h i s t o r i a a m m e + h i s t o r i a a n + h i s t o r i a a n s a + h i s t o r i a k e s k e i n e n + h i s t o r i a k o m i s s i o + h i s t o r i a l l e + h i s t o r i a l l i s e e n + h i s t o r i a l l i s e k s i + h i s t o r i a l l i s e l l a + h i s t o r i a l l i s e m m a s t a + h i s t o r i a l l i s e m p a a + h i s t o r i a l l i s e n + h i s t o r i a l l i s e n a + h i s t o r i a l l i s e s s a + h i s t o r i a l l i s e s t a + h i s t o r i a l l i s e s t i + h i s t o r i a l l i s e t + h i s t o r i a l l i s i a + h i s t o r i a l l i s i i n + h i s t o r i a l l i s i l l a + h i s t o r i a l l i s i n + h i s t o r i a l l i s i s t a + h i s t o r i a l l i s t a + h i s t o r i a l l i s t e n + h i s t o r i a m a a l a u s + h i s t o r i a m m e + h i s t o r i a n + h i s t o r i a n f i l o s o f i a + h i s t o r i a n k e r t o m u s + h i s t o r i a n k i n + h i s t o r i a n k i r j a a n + h i s t o r i a n k i r j o i h i m m e + h i s t o r i a n k i r j o i h i n + h i s t o r i a n k i r j o i s s a + h i s t o r i a n k i r j o i s t a + h i s t o r i a n k i r j o i t u s + h i s t o r i a n k i r j o i t u s t a + h i s t o r i a n k i r j o j a + h i s t o r i a n k u l k u + h i s t o r i a n k u v a n + h i s t o r i a n o p e t t a j i a + h i s t o r i a n o p e t u k s e n + h i s t o r i a n s a + h i s t o r i a n t a j u n + h i s t o r i a n t i e t o n s a + h i s t o r i a n t u l k i n n a l l e + h i s t o r i a n t u n n i n + h i s t o r i a n t u n t i + h i s t o r i a n t u t k i m u k s e n + h i s t o r i a n t u t k i m u s t a + h i s t o r i a n v a s t a i n e n + h i s t o r i a p a l k i n t o + h i s t o r i a p e r i n t ö + h i s t o r i a s s a + h i s t o r i a s s a m m e + h i s t o r i a s t a + h i s t o r i a s t a a n + h i s t o r i o i d e n s a + h i s t o r i o i t a + h i s t o r i o i t s i j o i l l e + h i s t o r i o i t s i j o i t a + h i t a a k s i + h i t a a m m a l l a + h i t a a m p a a + h i t a a m p i + h i t a a s e e n + h i t a a s t a + h i t a a s t i k i n + h i t a a t k i n + h i t a i k s i + h i t a i t a + h i t a u d e n + h i t a u d e s t a + h i t a u k s i n e e n + h i t a u s l i i k e + h i t a u s m o m e n t t i + h i t a u s s ä d e + h i t s a u s v ä l i n e i l t ä + h i t t i k a p p a l e e n + h i t u k ä ä p i ö k o i + h i t u n e n k i n + h i t u s t a k a a n + h i u k k a a k a a n + h i u k k a s d u a l i s m i + h i u k k a s f y s i i k a s t a + h i u k k a s f y s i i k k a + h i u k k a s i a + h i u k k a s i i n + h i u k k a s i k s i + h i u k k a s i l l e + h i u k k a s i l m a i s i m e t + h i u k k a s i s t a + h i u k k a s k a r t t a + h i u k k a s k e s k i t t y m i ä + h i u k k a s k i i h d y t i n + h i u k k a s l e i j u m a s t a + h i u k k a s l o u k k u j a + h i u k k a s l ö y t ö j e n + h i u k k a s n o p e u s + h i u k k a s o n g e l m a a n + h i u k k a s p i t o i s u u d e n + h i u k k a s p i t o i s u u k s i e n + h i u k k a s p i t o i s u u s + h i u k k a s p i t o i s u u t t a + h i u k k a s p o i k k e a m a + h i u k k a s p ä ä s t ö i h i n + h i u k k a s p ä ä s t ö i l l e + h i u k k a s p ä ä s t ö i s s ä + h i u k k a s p ä ä s t ö i s t ä + h i u k k a s p ä ä s t ö j e n + h i u k k a s p ä ä s t ö j ä + h i u k k a s p ä ä s t ö t + h i u k k a s s a a s t e + h i u k k a s s t r a t e g i a + h i u k k a s s u o d a t i n + h i u k k a s s u o d a t t i m e t + h i u k k a s s u o d a t t i m i a + h i u k k a s s u o d a t t i m i e n + h i u k k a s s u o d a t t i m i l l a + h i u k k a s s ä t e i l y + h i u k k a s t a s o t + h i u k k a s t e n + h i u k k a s t u t k i m u k s e n + h i u k s e n h i e n o + h i u k s e n h i e n o i h i n + h i u k s e n h i e n o j a + h i u k s e n h i e n o n + h i u k s i a + h i u s a n a l y y s i + h i u s g e e l e i s t ä + h i u s g e e l i + h i u s l a k k a + h i u s m e d u u s a + h i u s t e n + h i u s t e n h a l k o m i n e n + h i u s t e n h a l k o m i s e n + h i u s t e n i + h i u s t e n k u i v a a j a n + h i u s t e n k u i v a i m e t + h i u s t e n k u i v a i n + h i u s t e n l e i k k u u + h i u s t e n l ä h t ö ä + h i u s t e n p e s u a i n e i d e n + h i u s v a h a + h i u s v ä r e i s s ä + h i u s v ä r i + h i u t a l e p e n s a s + h i v e n a i n e + h i v e n t ä k ä ä n + h i v i n + h i v i s t ä + h i v v i r u k s e n + h m o n g i t + h o h t o k a i j a + h o h t o k a i j a t + h o h t o k a r d i n a a l i + h o h t o k o r a l l i a h v e n + h o h t o l a m p p u + h o h t o m i l j o o n a k a l a + h o h t o m u s t a r a s t a s + h o h t o p e n s a s y ö k k ö n e n + h o h t o s e e p r a k a l a + h o h t o s i n i k k a + h o h t o s i n i s i i p i + h o h t o s m a r a g d i k o l i b r i + h o i d e t a + h o i d e t a a n + h o i d e t t a v a k s e m m e + h o i d e t t a v a k s i + h o i d e t t i i n + h o i d e t t u a + h o i d e t t u j e n + h o i d o i s t a + h o i d o l t a + h o i d o n + h o i d o n t a r j o a j i e n + h o i d o s s a + h o i d o s s a a n + h o i d o s t a + h o i d o t + h o i p e r t e l e v a t + h o i t a a + h o i t a a k s e e n + h o i t a e s s a a n + h o i t a j a n e u v o s t o a + h o i t a j a o r g a n i s a a t i o i l l e + h o i t a j a p u l a + h o i t a j i e n + h o i t a j i n a + h o i t a j i s t a + h o i t a m a + h o i t a m a a n + h o i t a m a t t a + h o i t a m i s e e n + h o i t a m i s e k s i + h o i t a m i s e n + h o i t a m i s e s s a + h o i t a m i s e s t a + h o i t a m i s t a + h o i t a n e e t + h o i t a v a n + h o i t a v a t + h o i t a v i e n + h o i t a v i s t a + h o i t i v a t + h o i t o a + h o i t o a i k a a + h o i t o a j a t + h o i t o a l a + h o i t o a l a a + h o i t o a l a l l a + h o i t o a l a n + h o i t o a l o j a + h o i t o a l u e i l l e + h o i t o a v u s t u s + h o i t o a v u s t u s t e n + h o i t o e t u u t t a + h o i t o h e n k i l ö k u n n a l l e + h o i t o h e n k i l ö k u n n a n + h o i t o h e n k i l ö k u n n a s t a + h o i t o h e n k i l ö k u n t a + h o i t o h e n k i l ö k u n t a a + h o i t o h e n k i l ö s t ö + h o i t o h e n k i l ö s t ö n + h o i t o h e n k i l ö s t ö p u l a n + h o i t o h e n k i l ö s t ö s t ä + h o i t o h e n k i l ö s t ö ä + h o i t o j a + h o i t o j a k s o n + h o i t o j e n + h o i t o j o n o i s s a + h o i t o j o n o j a + h o i t o j o n o j a a n + h o i t o j o n o j e n + h o i t o j ä r j e s t e l m i e n + h o i t o j ä r j e s t e l m i ä + h o i t o j ä r j e s t e l m ä + h o i t o j ä r j e s t e l m ä l l e + h o i t o j ä r j e s t e l m ä n + h o i t o j ä r j e s t e l m ä s s ä + h o i t o j ä r j e s t e l m ä t + h o i t o j ä r j e s t e l m ä ä + h o i t o j ä r j e s t e l y j e n + h o i t o j ä r j e s t e l y j ä + h o i t o j ä s e n v a l t i o n + h o i t o k a p a s i t e e t t i + h o i t o k e i n o i h i n + h o i t o k e i n o j a + h o i t o k e i n o t + h o i t o k e s k u k s e n + h o i t o k e s k u k s e t + h o i t o k e s k u k s i i n + h o i t o k e t j u n + h o i t o k o d e i s s a + h o i t o k o t e i h i n + h o i t o k o t e j a + h o i t o k o t i e n + h o i t o k o t i i n + h o i t o k u l t t u u r i a + h o i t o k u l u i s t a + h o i t o k u l u j e n + h o i t o k u l u t + h o i t o k u s t a n n u k s e t + h o i t o k u s t a n n u k s i a + h o i t o k u s t a n n u k s i s t a + h o i t o k u s t a n n u k s i s t a a n + h o i t o k u s t a n n u s t e n + h o i t o k y s y m y s t ä + h o i t o k ä y t ä n n ö i s s ä + h o i t o k ä y t ä n t ö j ä + h o i t o l a i t o k s e s s a + h o i t o l a i t o k s e t + h o i t o l a i t o k s i a + h o i t o l a i t o k s i l l e + h o i t o l a i t o k s i s s a + h o i t o l a i t o s t e n + h o i t o m a h d o l l i s u u d e t + h o i t o m a h d o l l i s u u k s i a + h o i t o m a h d o l l i s u u k s i e n + h o i t o m a h d o l l i s u u k s i s t a + h o i t o m a k s u j e n + h o i t o m a l l i + h o i t o m a l l i n + h o i t o m e k a n i s m i a + h o i t o m e n e t e l m i e n + h o i t o m e n e t e l m i i n + h o i t o m e n e t e l m i s t ä + h o i t o m e n e t e l m i ä + h o i t o m e n e t e l m i ä ä n + h o i t o m e n e t e l m ä s t ä + h o i t o m e n e t e l m ä t + h o i t o m u o d o i l l a + h o i t o m u o d o i s t a + h o i t o m u o d o s t a + h o i t o m u o d o t + h o i t o m u o t o + h o i t o m u o t o a + h o i t o m u o t o i h i n + h o i t o m u o t o j a + h o i t o m u o t o j e n + h o i t o m u o t o n a + h o i t o o n + h o i t o p a i k a n + h o i t o p a i k a t + h o i t o p a i k k o j a + h o i t o p a l v e l u + h o i t o p a l v e l u i d e n + h o i t o p a l v e l u i h i n + h o i t o p a l v e l u i l l e + h o i t o p a l v e l u i n f r a s t r u k t u u r i n + h o i t o p a l v e l u i s t a + h o i t o p a l v e l u i t a + h o i t o p a l v e l u j a + h o i t o p a l v e l u j e n + h o i t o p a l v e l u t + h o i t o p e r i a a t t e i s t a + h o i t o p o l i t i i k a s s a + h o i t o p o l i t i i k k a + h o i t o p r o s e s s i n + h o i t o p r o s e s s i s s a + h o i t o p ä ä t ö k s e t + h o i t o r a k e n t e i d e n + h o i t o r a k e n t e i t a + h o i t o s o p i m u s + h o i t o s t r a t e g i o i t a + h o i t o s u u n n i t e l m a + h o i t o s u u n n i t e l m a a + h o i t o s u u n n i t e l m a a n + h o i t o s u u n n i t e l m a l l a + h o i t o s u u n n i t e l m a n + h o i t o s u u n n i t e l m a n s a + h o i t o s u u n n i t e l m a s s a + h o i t o s u u n n i t e l m a s t a + h o i t o s u u n n i t e l m a t + h o i t o s u u n n i t e l m i a + h o i t o s u u n n i t e l m i e n + h o i t o s u u n n i t e l m i i n + h o i t o s u u n n i t e l m i l l a + h o i t o s u u n n i t e l m i l l e + h o i t o s u u n n i t e l m i s s a + h o i t o s u u n n i t e l m i s t a + h o i t o t a a k k a + h o i t o t a r k o i t u k s e s s a + h o i t o t a r k o i t u k s e s s a k i n + h o i t o t a r k o i t u k s i a + h o i t o t a r k o i t u k s i i n + h o i t o t a r k o i t u k s i s s a + h o i t o t a r p e e n + h o i t o t a r p e e s e e n + h o i t o t a r p e e s s a + h o i t o t a r p e e t + h o i t o t a s o o n + h o i t o t a v o i t t e i s t a + h o i t o t e h t ä v i e n + h o i t o t e k n i i k o i l l e + h o i t o t e s t a m e n t t i + h o i t o t o i m e n p i d e + h o i t o t o i m e n p i d e a s e t u k s e e n + h o i t o t o i m e n p i d e a s e t u s + h o i t o t o i m e n p i t e e t + h o i t o t o i m e n p i t e i d e n + h o i t o t o i m e n p i t e i l l ä + h o i t o t o i m e n p i t e i s i i n + h o i t o t o i m e n p i t e i s t ä + h o i t o t o i m e n p i t e i t ä + h o i t o t o i m e t + h o i t o t o i m i a + h o i t o t o i m i e n + h o i t o t o i m i l l a + h o i t o t u k e e n + h o i t o t u k i + h o i t o t u r i s m i + h o i t o t u r i s m i a + h o i t o t u r i s m i i n + h o i t o t u r i s m i l l e + h o i t o t u r i s m i n + h o i t o t u t k i m u k s i a + h o i t o t y ö + h o i t o t y ö n + h o i t o t y ö n t e k i j ä + h o i t o t y ö n t e k i j ä t + h o i t o t y ö n t e k i j ö i t ä + h o i t o t y ö s s ä + h o i t o v a a t i m u k s i a + h o i t o v a i h t o e h d o i s t a + h o i t o v a i h t o e h d o t + h o i t o v a i h t o e h t o + h o i t o v a i h t o e h t o j a + h o i t o v a i h t o e h t o j e n + h o i t o v a k u u t u k s e e n + h o i t o v a k u u t u k s e n + h o i t o v a k u u t u s l a i n + h o i t o v a p a a n + h o i t o v a p a a s e e n + h o i t o v a s t u u + h o i t o v a s t u u n + h o i t o v i r h e + h o i t o v i r h e i d e n + h o i t o v u o d e t + h o i t o v ä l i n e i l l e + h o i t o v ä l i n e i t ä + h o i t o y h t e i s ö j e n + h o i t o y k s i k k ö j ä + h o i t o y k s i k ö i t ä + h o i t o y m p ä r i s t ö i s s ä + h o i t u i k i n + h o i t u v a t + h o i v a p a l v e l u i h i n + h o i v a p a l v e l u j a + h o i v a t a + h o i v a t a r p e e n + h o i v a t e h t ä v ä s t ä + h o i v a t e h t ä v ä t + h o i v a t y ö h ö n + h o i v a t y ö n + h o i v a t y ö s t ä + h o i v a t y ö t ä + h o i v a v a l t i o n + h o k e m a s t a + h o k e v a t + h o l d i n g y h t i ö s t ä + h o l h o a m a t t a + h o l h o a m i s k u l t t u u r i s s a + h o l h o a v a a + h o l h o a v a n + h o l h o o j a a + h o l h o o j i n a + h o l h o u s m e n t a l i t e e t i n + h o l h o u s p o l i t i i k k a a + h o l h o u s t a + h o l h o u s v a l t i o + h o l h o u s v a l t i o n + h o l h o u s v a l t i o o n + h o l h o u s v a l t i o s s a + h o l h o u s v a l t i o s t a + h o l h o u s v a l t i o t a + h o l h o u s y h t e i s k u n t a + h o l h o u s y h t e i s k u n t a n a + h o l l a n n i k s i + h o l l a n n i l l a + h o l l a n n i l l e + h o l l a n n i l t a + h o l l a n n i n + h o l l a n n i n k i e l i n e n + h o l l a n n i n k i e l i s e n + h o l l a n n i n k i e l i s e t + h o l l a n n i n k i e l i s t e n + h o l l a n n i n p a i m e n k o i r a + h o l l a n n i n p e l t o p y y k o i r a + h o l l a n n i n p u o l i v e r i n e n + h o l l a n n i n r o t t a k o i r a + h o l l a n n i n t y ö h e v o n e n + h o l l a n t i a + h o l l a n t i l a i s e t + h o l l a n t i l a i s i a + h o l l a n t i l a i s j ä s e n + h o l l a n t i l a i s j ä s e n i l l ä + h o l l a n t i l a i s k a n a v a + h o l l a n t i l a i s k o l l e g a n i + h o l l a n t i l a i s n a i s e t + h o l l a n t i l a i s t a + h o l l a n t i l a i s t e n + h o l l a n t i l a i s v i r a n o m a i s e t + h o l l a n t i l a i s y h t i ö + h o l o k a u s t i k e s k u k s e n + h o l o k a u s t i m u s e o n + h o l o k a u s t i m u s e o s s a + h o l o k a u s t i n + h o l t i t t o m a m p i a + h o l t i t t o m u u t t a + h o l v e i s s a + h o l v i h a u d a t + h o l v i s i l t a + h o m e h t u a + h o m e j u u s t o + h o m e o p a a t t i s e n + h o m e o p a a t t i s e t + h o m e o p a a t t i s i a + h o m e o p a a t t i s i s s a + h o m e o p a a t t i s i s t a + h o m e o p a a t t i s t a + h o m e o p a a t t i s t e n + h o m e o p a t i a a n + h o m m i a a n + h o m o a v i o l i i t o t + h o m o a v i o l i i t t o j a + h o m o a v i o l i i t t o j e n + h o m o a v i o l i i t t o l a i n + h o m o b o n u s + h o m o e m o + h o m o f o b i a a + h o m o f o b i a n + h o m o f o b i a s t a + h o m o f o b i a t a r t u n n a n + h o m o f o b i s e t + h o m o f o b i s i a + h o m o g e e n i s e m p i + h o m o i s t a + h o m o j e n + h o m o j ä r j e s t ö i l t ä + h o m o k s i + h o m o l i i t o n + h o m o m i e h e n ä + h o m o m i e h e t + h o m o m i e s t ä + h o m o m o r f i a l a u s e + h o m o p a r a a t e j a + h o m o p a r a a t i t + h o m o p a r i e n + h o m o p a r i s k u n n a l l e + h o m o p a r i s k u n t i a + h o m o p a r i t + h o m o p o m m i + h o m o p o r n o + h o m o r a k a s t a j a t + h o m o s a u n a + h o m o s e k s u a a l e i h i n + h o m o s e k s u a a l e i l l e + h o m o s e k s u a a l e i s t a + h o m o s e k s u a a l e j a + h o m o s e k s u a a l i a + h o m o s e k s u a a l i e n + h o m o s e k s u a a l i n + h o m o s e k s u a a l i n a + h o m o s e k s u a a l i p a r e i h i n + h o m o s e k s u a a l i p a r e i l l e + h o m o s e k s u a a l i p a r i e n + h o m o s e k s u a a l i p a r i t + h o m o s e k s u a a l i s e t + h o m o s e k s u a a l i s i a + h o m o s e k s u a a l i s i i n + h o m o s e k s u a a l i s i s t a + h o m o s e k s u a a l i s t a + h o m o s e k s u a a l i s u u d e n + h o m o s e k s u a a l i s u u d e s t a + h o m o s e k s u a a l i s u u s + h o m o s e k s u a a l i s u u s k y s y m y k s e s s ä + h o m o s e k s u a a l i s u u s k y s y m y k s i ä + h o m o s e k s u a a l i s u u t e e n + h o m o s e k s u a a l i t + h o m o s u h t e i d e n + h o m o v a s t a i n e n + h o m o y h t e i s ö ä + h o n g k o n g i l a i s e n + h o n g k o n g i l a i s e s t a + h o n g k o n g i l a i s t a + h o p e a b a r b i + h o p e a b r o m i d i + h o p e a f l u o r i d i + h o p e a g i b b o n i + h o p e a h a r a k k a k y y h k y + h o p e a h a r t i a k y y h k y + h o p e a h u i l u v a r i s + h o p e a h ä i d e n + h o p e a h ä r k k i + h o p e a j a l o h a u k k a + h o p e a j o d a a t t i + h o p e a j o d i d i + h o p e a k a r b o n a a t t i + h o p e a k a r p p i + h o p e a k e t t u + h o p e a k l o r i d i + h o p e a k o l i k o n + h o p e a k o r v a t i m a l i + h o p e a k r o m a a t t i + h o p e a k u h a n k e i t t ä j ä + h o p e a k u r h o + h o p e a k u r k i + h o p e a k u r k k u n a a k k a + h o p e a k u r m i t s a + h o p e a k y l j e t + h o p e a k y y h k y + h o p e a l a k k i k y y h k y + h o p e a l a n k a n a + h o p e a l a u t a s e l l a + h o p e a l a u t a s e l t a + h o p e a l e h m u s + h o p e a l o h i + h o p e a l o k k i + h o p e a l u o t i + h o p e a l u o t i a + h o p e a l u s i k k a + h o p e a m i t a l i s t e j a + h o p e a n e u l a t e e + h o p e a n i s k a m e s i k k o + h o p e a n i t r a a t t i + h o p e a n o k k a + h o p e a o k s i d i + h o p e a o r i + h o p e a o t s a t a p a k u l o + h o p e a p e n s a s + h o p e a p e r o k s i d i + h o p e a p o p p e l i + h o p e a p u h v e l i n m a r j a + h o p e a r a h a k s i + h o p e a r a h a l l a + h o p e a r a h o j a + h o p e a r e u n u k s e n + h o p e a r e u n u k s e n a + h o p e a r e u n u k s e n s a + h o p e a r e u n u s + h o p e a r u u t a n a + h o p e a s a r v i n o k k a + h o p e a s e p ä t + h o p e a s i n i s i i p i + h o p e a s u l f i d i + h o p e a s u r f f a a j a + h o p e a s u r f f a r i + h o p e a t a l o u d e s t a + h o p e a t a l o u s + h o p e a t a l o u t e e n + h o p e a t a l o u t t a + h o p e a t a r j o t t i m e l l a + h o p e a t i i r a + h o p e a t i l h i + h o p e a t ä p l ä p e i p p i + h o p e a v a a h t e r a + h o p e a v a t s a m u u r a + h o p e a v i l l a k k o + h o p e a v ä r i + h o p p u i l l e n + h o r i s o n t a a l i s e l l a + h o r i s o n t a a l i s e m p a a n + h o r i s o n t a a l i s e m p i a + h o r i s o n t a a l i s e n + h o r i s o n t a a l i s e s t a + h o r i s o n t a a l i s e s t i + h o r i s o n t a a l i s i a + h o r i s o n t a a l i s i l l a + h o r i s o n t a a l i s i s s a + h o r i s o n t a a l i s t a + h o r i s o n t i s s a + h o r i s o n t t i j ä r j e s t e l m ä + h o r i s o n t t i o n g e l m a + h o r i s o n t t i r e n g a s + h o r j u e s s a + h o r j u n t a a + h o r j u t t a a + h o r j u t t a a k s e e n + h o r j u t t a i s i + h o r j u t t a m a l l a + h o r j u t t a m a t t a + h o r j u t t a m i s e k s i + h o r j u t t a m i s p y r k i m y k s e t + h o r j u t t a m i s p y r k i m y s t e n + h o r j u t t a n e e t + h o r j u t t a n u t + h o r j u t t a v a t + h o r j u t t a v i a + h o r k k a k a t k e r o + h o r m o n a a l i s e s t i + h o r m o n a a l i s e t + h o r m o n a a l i s i a + h o r m o n a a l i s i k s i + h o r m o n a a l i s i l l e + h o r m o n a a l i s i s t a + h o r m o n a a l i s t e n + h o r m o n e i l l a + h o r m o n e i s t a + h o r m o n e j a + h o r m o n i d i r e k t i i v i e n + h o r m o n i e n + h o r m o n i e p ä t a s a p a i n o s t a + h o r m o n i h o i d o i s t a + h o r m o n i h o i d o n + h o r m o n i h o i t o + h o r m o n i h o i t o j a + h o r m o n i h ä i r i t s i j ä t + h o r m o n i h ä i r i t s i j ö i d e n + h o r m o n i h ä i r i ö i d e n + h o r m o n i h ä i r i ö i t ä + h o r m o n i j ä r j e s t e l m i i n + h o r m o n i j ä r j e s t e l m i l l e + h o r m o n i j ä r j e s t e l m ä n + h o r m o n i j ä r j e s t e l m ä ä + h o r m o n i j ä r j e s t e l m ä ä n + h o r m o n i j ä ä m i s t ä + h o r m o n i j ä ä n n ö k s i ä + h o r m o n i k a u p p a + h o r m o n i k i e l l o n + h o r m o n i k i e l l o s t a + h o r m o n i k i e l t o + h o r m o n i k i e l t o a m m e + h o r m o n i k i e r u k k a + h o r m o n i k i i s t a s s a + h o r m o n i k o n f e r e n s s i n + h o r m o n i k o r v a u s h o i t o + h o r m o n i k o r v a u s h o i t o j e n + h o r m o n i k y s y m y k s e s s ä + h o r m o n i k y s y m y k s e s t ä + h o r m o n i l a i n s ä ä d ä n n ö n + h o r m o n i l i h a + h o r m o n i l i h a a + h o r m o n i l i h a a n s a + h o r m o n i l i h a k i e l l o s t a + h o r m o n i l i h a l l a + h o r m o n i l i h a l t a + h o r m o n i l i h a n + h o r m o n i l i h a n k i n + h o r m o n i l i h a s t a + h o r m o n i l ä ä k k e i t ä + h o r m o n i m a f i a n + h o r m o n i n a u t o j a + h o r m o n i o n g e l m a s t a + h o r m o n i p e r i a a t t e e n + h o r m o n i s e k o i t u k s e t + h o r m o n i s o d a s s a + h o r m o n i t + h o r m o n i t a s a p a i n o o n + h o r m o n i t e s t e j ä + h o r m o n i t o i m i n t a a + h o r m o n i t o i m i n t a a n + h o r m o n i t u o t t e i t a a n + h o r m o n i v a l m i s t e i t a + h o r r o k s e s t a a n + h o r s m a k a s v i e n + h o r s m a k i i t ä j ä + h o s u m i s e l l a + h o t e l l i a l a l l a + h o t e l l i e n + h o t e l l i h a n k k e i t a + h o t e l l i h e n k i l ö k u n t a + h o t e l l i h u o n e + h o t e l l i h u o n e e n + h o t e l l i h u o n e e s t a + h o t e l l i h u o n e e t + h o t e l l i h u o n e i d e n + h o t e l l i h u o n e i s i i n + h o t e l l i h u o n e i s s a + h o t e l l i h u o n e i s t a + h o t e l l i h u o n e i t a + h o t e l l i j ä r j e s t e l m ä n + h o t e l l i k e t j u i s s a + h o t e l l i k e t j u j a + h o t e l l i k e t j u j e n + h o t e l l i k u l u n s a + h o t e l l i l a s k u n + h o t e l l i m a j o i t u k s e n + h o t e l l i m a j o i t u s + h o t e l l i m a j o i t u s t a + h o t e l l i n + h o t e l l i t + h o t e l l i t y ö n t e k i j ö i n ä + h o t e l l i v a r a u k s e n + h o t e l l i v a r a u k s e t + h o t e l l i v a r a u k s i s t a + h o t e l l i v a r a u s t e n + h o t e l l i v u o t e i d e n + h o t e l l i y r i t y k s e s s ä k i n + h o u k u t e l l a + h o u k u t e l l a a n + h o u k u t e l l a k s e e n + h o u k u t e l t a e s s a + h o u k u t e l t a v a + h o u k u t e l t u a + h o u k u t i n j ä r j e s t e l m i ä + h o u k u t t a v a m p i + h o u k u t t e l e e + h o u k u t t e l e m a a n + h o u k u t t e l e m a s t a + h o u k u t t e l e m a t t a + h o u k u t t e l e m i s e k s i + h o u k u t t e l e v a a + h o u k u t t e l e v a k s i + h o u k u t t e l e v a l t a + h o u k u t t e l e v a m m a k s i + h o u k u t t e l e v a m m a l t a + h o u k u t t e l e v a m m a n + h o u k u t t e l e v a m m a s t a + h o u k u t t e l e v a m m a t + h o u k u t t e l e v a m m i k s i + h o u k u t t e l e v a m m i l t a + h o u k u t t e l e v a m p a a + h o u k u t t e l e v a m p a a n + h o u k u t t e l e v a m p a n a + h o u k u t t e l e v a m p i + h o u k u t t e l e v a m p i a + h o u k u t t e l e v a n + h o u k u t t e l e v a n a + h o u k u t t e l e v a t + h o u k u t t e l e v i a + h o u k u t t e l e v i e n + h o u k u t t e l e v i m m a t + h o u k u t t e l e v i m p i a + h o u k u t t e l e v i m p i n a + h o u k u t t e l e v i n + h o u k u t t e l e v u u s t e k i j ä + h o u k u t t e l e v u u t t a + h o u k u t t e l e v u u t t a a n + h o u k u t t e l i + h o u k u t t e l u k e i n o j e n + h o u k u t u k s e e n + h o u k u t u k s i l l e + h o u k u t u s l i n t u + h o u k u t u s m e k a n i s m e j a + h o u k u t u s t a + h o u s u p u v u s s a a n + h o u s u r o o l i + h o u s u t + h o v i b a l e t t i + h o v i h i s t o r i o i t s i j a t + h o v i n a i s e t + h o v i n a r r e i l l a + h o v i n a r r i n + h o v i o i k e u s + h o v i o i k e u t t a + h o v i r u n o i l i j o i t a + h o v i t a i d e + h u g e n o t i t + h u h t a s i n i s i i p i + h u h t i k u u + h u h t i k u u h u n + h u h t i k u u n + h u h t i k u u s s a + h u h t i k u u t a + h u h u j a + h u h u j e n + h u h u m y l l y + h u h u s t a + h u h u t + h u h u t a a n + h u i j a a m i n e n + h u i j a a m i s t a + h u i j a r e i k s i + h u i j a r e i t a + h u i j a r i e k o l o g i e n + h u i j a r i p u h e e n j o h t a j a + h u i j a r i s y n d r o o m a + h u i j a t a + h u i j a t a a n + h u i j a t u k s i + h u i j a u k s e t + h u i j a u k s i s t a + h u i j a u s k a m p a n j a + h u i j a u s k a m p a n j a k s i + h u i j a u s k ä y t ä n t ö n s ä + h u i j a u s l a s k u + h u i j a u s m a h d o l l i s u u k s i s t a + h u i j a u s t a + h u i j a u s t a r k o i t u k s e e n + h u i j a u s t e n + h u i j a u s t i e d e t t ä + h u i j a u s t o i m i n t a a + h u i j a u s u u d i s t u k s i l l e + h u i k e a a + h u i k e i t a + h u i l u h u i s k u l e p i n k ä i n e n + h u i l u k i u r u + h u i l u k o r p p i + h u i l u k u h a n k e i t t ä j ä + h u i l u t y l l i + h u i l u v a r i s + h u i m a a v a a + h u i m a a v a n + h u i p e n t u i v a t + h u i p e n t u m i s t a + h u i p e n t u n u t + h u i p p u a j o n e u v o j a + h u i p p u a l h a i s e l l a + h u i p p u a l o i l l a + h u i p p u a l o j a + h u i p p u a l u e i l l a + h u i p p u a m m a t t i l a i s t e n + h u i p p u a r v o j a + h u i p p u a s e i t a + h u i p p u a s i a n t u n t i j o i d e n + h u i p p u a s i a n t u n t i j o i t a + h u i p p u e h d o k k a a l l a + h u i p p u e h d o k k a i t a + h u i p p u e l i n k e i n o n + h u i p p u e n e r g i a n + h u i p p u h e t k e ä + h u i p p u i n n o v a a t i o i d e n + h u i p p u i n n o v a t i i v i s e t + h u i p p u j a l k a p a l l o i l i j o i s t a + h u i p p u j o h t a j a + h u i p p u j o h t a j i a + h u i p p u j o h t a j i e n + h u i p p u j o h t a j i n a + h u i p p u j u r i s t i t + h u i p p u k e h i t y k s e e n + h u i p p u k i l p a i l u k y v y n + h u i p p u k o h t a + h u i p p u k o k o u k s e e n + h u i p p u k o k o u k s e k s i + h u i p p u k o k o u k s e l l a + h u i p p u k o k o u k s e l l e + h u i p p u k o k o u k s e m m e + h u i p p u k o k o u k s e n + h u i p p u k o k o u k s e n n e + h u i p p u k o k o u k s e s s a + h u i p p u k o k o u k s e s s a a n + h u i p p u k o k o u k s e s t a + h u i p p u k o k o u k s e t + h u i p p u k o k o u k s e t k i n + h u i p p u k o k o u k s i a + h u i p p u k o k o u k s i i n + h u i p p u k o k o u k s i l l a + h u i p p u k o k o u k s i s s a + h u i p p u k o k o u k s i s s a a n + h u i p p u k o k o u k s i s t a + h u i p p u k o k o u k s i s t a n n e + h u i p p u k o k o u s + h u i p p u k o k o u s a s i a k i r j o i h i n + h u i p p u k o k o u s d i p l o m a t i a + h u i p p u k o k o u s d i p l o m a t i a s s a + h u i p p u k o k o u s k e s k u s t e l u j e n s a + h u i p p u k o k o u s m e k a n i s m e i l l e + h u i p p u k o k o u s m e k a n i s m i s s a + h u i p p u k o k o u s o l o s u h t e i t a + h u i p p u k o k o u s p r o s e s s i a + h u i p p u k o k o u s p r o s e s s i i n + h u i p p u k o k o u s p r o s e s s i s s a + h u i p p u k o k o u s t a + h u i p p u k o k o u s t a p a a m i n e n + h u i p p u k o k o u s t a s o a + h u i p p u k o k o u s t a s o l l a + h u i p p u k o k o u s t e n + h u i p p u k o k o u s v ä s y m y s t ä + h u i p p u k o m e n t a j a t + h u i p p u k o n f e r e n s s i a + h u i p p u k u l u t u k s e n + h u i p p u k u n n o s s a + h u i p p u k u o r m i t u k s i a + h u i p p u k u o r m i t u s v o i m a l o i l l e + h u i p p u k y s y n n ä n + h u i p p u k ä y t ä n n ö t + h u i p p u l a a d u k a s + h u i p p u l a a d u k k a i t a + h u i p p u l a a t u a + h u i p p u l a a t u i n e n + h u i p p u l a a t u i s i a + h u i p p u l a a t u i s t a + h u i p p u l a h j a k k a i t a + h u i p p u l u k e m a n + h u i p p u l u o k a n + h u i p p u l u o k k a a + h u i p p u l u o k k a a n + h u i p p u l u o t e t t a v i e n + h u i p p u m a t k a i l u k o h t e i d e n + h u i p p u n i m i t y k s i ä + h u i p p u n o p e a + h u i p p u n o p e a a + h u i p p u n o p e a a n + h u i p p u n o p e a t + h u i p p u n o p e i d e n + h u i p p u n o p e i s t a + h u i p p u n o p e u d e s t a + h u i p p u n o p e u t t a + h u i p p u o s a a j a m m e + h u i p p u o s a a j a t + h u i p p u o s a a j i s t a m m e + h u i p p u o s a a m i s e e n + h u i p p u o s a a m i s e k s i + h u i p p u o s a a m i s e l l a a n + h u i p p u o s a a m i s e s s a + h u i p p u o s a a m i s e s t a + h u i p p u o s a a m i s k e s k u k s e n a + h u i p p u o s a a m i s k e s k u k s e t + h u i p p u o s a a m i s k e s k u k s i a + h u i p p u o s a a m i s k e s k u s + h u i p p u o s a a m i s k e s k u s t e n + h u i p p u o s a a m i s t a + h u i p p u o s a a m i s v e r k k o j e n + h u i p p u o s a a m i s v e r k o s t o j a + h u i p p u o s a a m i s v e r k o s t o j e n + h u i p p u p a i n o p i s t e + h u i p p u p a l k k o i h i n + h u i p p u p e t o + h u i p p u p e t o j e n + h u i p p u p i s t e e t + h u i p p u p o l i i t i k k o a + h u i p p u p o l i i t i k k o j e n + h u i p p u p o l i i t i k o i l l e + h u i p p u p o l i i t i k o i l t a + h u i p p u p o l i i t i k o t + h u i p p u p ä t e v ä + h u i p p u r i k k a a t + h u i p p u s a a v u t u k s e n a + h u i p p u s a l a i s i a + h u i p p u s a l a i s i k s i + h u i p p u s a l a i s i s s a + h u i p p u s e k t o r e i s t a + h u i p p u s e s o n g i n + h u i p p u s e u r o i k s i + h u i p p u s e u r o j a + h u i p p u s u o r i t t a j i a + h u i p p u s u o r i t u k s i a + h u i p p u s u o r i t u s + h u i p p u t a i t o i s e n + h u i p p u t a p a a m i n e n + h u i p p u t a p a a m i s e s s a + h u i p p u t a s o + h u i p p u t a s o a + h u i p p u t a s o l l a + h u i p p u t a s o l l e + h u i p p u t a s o n + h u i p p u t a s o t + h u i p p u t e k n i i k a n + h u i p p u t e k n i i k a s t a + h u i p p u t e k n i i k a t + h u i p p u t e k n i i k k a + h u i p p u t e k n i i k k a a + h u i p p u t e k n i i k k a a n + h u i p p u t e k n i i k k a p a t e n t t e j a + h u i p p u t e k n i i k k a t ö i t ä + h u i p p u t e k n i i k k a y r i t y k s i ä + h u i p p u t e k n i s e t + h u i p p u t e k n i s i l l ä + h u i p p u t e k n i s i ä + h u i p p u t e k n i s t e n + h u i p p u t e k n o l o g i a + h u i p p u t e k n o l o g i a a + h u i p p u t e k n o l o g i a a n + h u i p p u t e k n o l o g i a j ä r j e s t ö t + h u i p p u t e k n o l o g i a k s i + h u i p p u t e k n o l o g i a l l a + h u i p p u t e k n o l o g i a l l e + h u i p p u t e k n o l o g i a n + h u i p p u t e k n o l o g i a o h j e l m i s t o t e h d a s + h u i p p u t e k n o l o g i a s s a + h u i p p u t e k n o l o g i a s t a + h u i p p u t e k n o l o g i a t u o t t e i d e n + h u i p p u t e k n o l o g i a y r i t y k s i l l e + h u i p p u t e k n o l o g i o i d e n + h u i p p u t e k n o l o g i o i s s a + h u i p p u t e k n o l o g i o i t a + h u i p p u t e k n o l o g i s i i n + h u i p p u t e k n o l o g i s t a + h u i p p u t i e t e e l l i s t ä + h u i p p u t i e t e e s e e n + h u i p p u t i l a + h u i p p u t u l l i t + h u i p p u t u o t t e e t + h u i p p u t u o t t e i d e n + h u i p p u t u r v a l l i s e n + h u i p p u t u r v a l l i s i a + h u i p p u t u r v a l l i s i l t a + h u i p p u t u r v a l l i s i n a + h u i p p u t u t k i j o i d e n + h u i p p u t u t k i j o i d e n k a a n + h u i p p u t u t k i j o i l t a + h u i p p u t u t k i j o i t a + h u i p p u t u t k i m u k s e e n + h u i p p u t u t k i m u k s e s s a + h u i p p u t u t k i m u s + h u i p p u t u t k i m u s k e s k u s t e n + h u i p p u t u t k i m u s t a + h u i p p u u n s a + h u i p p u v a l l a n k ä y t t ä j i ä + h u i p p u v a l t i o n p ä ä m i e s t ä + h u i p p u v a r u s t e t u n + h u i p p u v i r a t + h u i p p u v i r k a a n + h u i p p u v i r k a m i e h e n n e + h u i p p u v i r k a m i e h i e n + h u i p p u v i r k a m i e h i i n + h u i p p u v i r k a m i e s + h u i p p u v i r k a m i e s t e n + h u i p p u v i r k o i h i n + h u i p p u v i r k o j a + h u i p p u v i r k o j e n + h u i p p u v i r o i s s a + h u i p p u v i r o i s t a + h u i p p u v o i t o t + h u i p p u v u o r t e n + h u i p p u y k s i k ö i d e n + h u i p p u y k s i l ö i d e n + h u i p p u y k s i l ö m m e + h u i p p u y l i o p i s t o + h u i p p u y l i o p i s t o a + h u i p p u y l i o p i s t o j e n + h u i p p u y r i t y k s i ä + h u i p p u y r i t y s t e n + h u i p p u ö l j y ä + h u i p u l l a + h u i p u t + h u i p u t u s t a + h u i s k u l e p i n k ä i n e n + h u i v i a + h u i v i e n + h u i v i i n + h u i v i k e s k u s t e l u + h u i v i k i e l l o n + h u i v i k i e l t o a + h u i v i k y s y m y k s e e n + h u i v i k y s y m y k s e s t ä + h u i v i k y s y m y s + h u i v i n + h u i v i o n g e l m a + h u i v i t + h u k a n n e e t + h u k a n p u t k i + h u k a t a + h u k a t a a n + h u k a t t a v a k s i + h u k a t t a v a n a + h u k a t t a v i s s a + h u k a t t i i n + h u k a t t u a + h u k k a a m a s t a + h u k k a a m a t t a + h u k k a a m i s k i e l t o a + h u k k a a m m e + h u k k a k a u r a + h u k k a k u s t a n n u k s i l l a + h u k k a r i i s i + h u k k a s i + h u k k a s i e m e n i ä + h u k k a v a e l l u s y ö k k ö n e n + h u k k a ä ä n i + h u k k u i + h u k k u m a i s i l l a a n + h u k k u m a s s a + h u k k u m i s r e a k t i o + h u k k u n e i s t a + h u k k u n u t t a + h u k k u u + h u k k u v a t + h u k k u v i s t a + h u k u t t a a + h u l a v a n n e + h u l e v e s i + h u l i g a a n e j a + h u l i g a a n i e n s a + h u l i g a a n i r y h m ä t + h u l l u a + h u l l u i k s i + h u l l u i m m a t k i n + h u l l u j e n h u o n e e l l a + h u l l u k a a l i + h u l l u k s i + h u l l u l t a + h u l l u n + h u l l u n k u r i n e n + h u l l u n k u r i s i m m i s t a + h u l l u r u o h o + h u l l u t + h u l l u t u s t a + h u l l u u d e k s i + h u l l u u d e n + h u l l u u t t a + h u m a a n i m m a l l a + h u m a a n i m m a n + h u m a a n i m p a a + h u m a a n i m p i + h u m a a n i m p i a + h u m a a n i s u u d e s s a + h u m a l a k i i l t o k ä ä r i ä i n e n + h u m a l a k ö y n n ö k s e t + h u m a l a m a r k k i n o i l l a + h u m a l a n v i e r a s + h u m a l a n v i l j e l y + h u m a l a p a r a t i i s i a + h u m a l a p e r h o n e n + h u m a l a t e e + h u m a l a t i l a + h u m a n i s m i s t a + h u m a n i s t i a j a t t e l i j o i t a + h u m a n i s t i l i i t o n + h u m a n i s t i m a n i f e s t i + h u m a n i s t i s e m p a a + h u m a n i s t i s i a + h u m a n i t a a r i s e e n + h u m a n i t a a r i s e k s i + h u m a n i t a a r i s e l l a + h u m a n i t a a r i s e l l e + h u m a n i t a a r i s e l t a + h u m a n i t a a r i s e m p a a + h u m a n i t a a r i s e n + h u m a n i t a a r i s e s s a + h u m a n i t a a r i s e s t a + h u m a n i t a a r i s e s t i + h u m a n i t a a r i s e t + h u m a n i t a a r i s i a + h u m a n i t a a r i s i i n + h u m a n i t a a r i s i s s a + h u m a n i t a a r i s i s t a + h u m a n i t a a r i s t a + h u m a n i t a a r i s t e n + h u m a n i t ä ä r i s e s t ä + h u m a n i t ä ä r i s t e n + h u m a n i t ä ä r i s t ä + h u m p u u k i p a l k i n t o + h u n a j a a n + h u n a j a b u l b u l i + h u n a j a d i r e k t i i v i i n + h u n a j a d i r e k t i i v i n + h u n a j a e h d o t u k s e s s a + h u n a j a k a s v i + h u n a j a k a s v i e n + h u n a j a m a r k k i n a t + h u n a j a m a r k k i n o i d e n + h u n a j a m a r k k i n o i l l a + h u n a j a m e h i l ä i s a l a n + h u n a j a m e h i l ä i s e t + h u n a j a m e h i l ä i s t e n + h u n a j a n + h u n a j a n t u o j a + h u n a j a n t u o t a n n o n + h u n a j a n t u o t a n n o s t a + h u n a j a n t u o t a n t o + h u n a j a n t u o t a n t o a + h u n a j a n t u o t t a j a + h u n a j a n t u o t t a j i e n + h u n a j a p a l l o k a l a + h u n a j a p o h j a i s i a + h u n a j a p o l i t i i k k a + h u n a j a p u l a l l e + h u n a j a p u r k k i + h u n a j a p u u + h u n a j a r i h m a k a l a + h u n a j a s t a + h u n a j a t u o t a n n o s t a + h u n a j a t u o t a n t o + h u n a j a t u o t e t t a + h u n a j a t u o t t e i d e n + h u n a j a t u o t t e i t a + h u n n u t e t t u i n a + h u n t u j e n + h u n t u p a r a t i i s i l i n t u + h u n t u v a a h t e r a + h u o h o t i n + h u o j e n n u s a l o i t e t t a + h u o j e n t a m i n e n + h u o j e n t a m i s e e n + h u o j e n t a m i s e k s i + h u o j e n t a m i s e s t a + h u o j e n t a m i s t a + h u o j e n t a v a a + h u o j u t e t t a v i s s a + h u o k a i l k o + h u o k a i s e m m e + h u o k a i s i v a t + h u o k a i s t a + h u o k e a m m a t + h u o k e a m m i n + h u o k e a m m i s t a + h u o l e e n + h u o l e e n i + h u o l e e n n e + h u o l e h d i m m e + h u o l e h d i n + h u o l e h d i t a + h u o l e h d i t a a n + h u o l e h d i t t a i s i i n + h u o l e h d i t t a v a + h u o l e h d i t t a v a n a a n + h u o l e h t i + h u o l e h t i a + h u o l e h t i a k s e e n + h u o l e h t i a k s e m m e + h u o l e h t i e s s a a n + h u o l e h t i e s s a m m e + h u o l e h t i i + h u o l e h t i i k o + h u o l e h t i k a a + h u o l e h t i k a a m m e + h u o l e h t i m a a n + h u o l e h t i m a l l a + h u o l e h t i m a t t a + h u o l e h t i m i s v e l v o l l i s u u d e s t a + h u o l e h t i m i s v e l v o l l i s u u s + h u o l e h t i m i s v e l v o l l i s u u t e e n + h u o l e h t i m i s v e l v o l l i s u u t e n s a + h u o l e h t i m i s v e l v o l l i s u u t t a + h u o l e h t i n e e t + h u o l e h t i n u t + h u o l e h t i s i n k o + h u o l e h t i v a m m a n + h u o l e h t i v a t + h u o l e k s e e n + h u o l e l l i s e l l a + h u o l e l l i s e m m a n + h u o l e l l i s e m m i n + h u o l e l l i s e m p a a + h u o l e l l i s e m p a a n + h u o l e l l i s e m p i + h u o l e l l i s e m p i a + h u o l e l l i s e n + h u o l e l l i s e s t a + h u o l e l l i s i a + h u o l e l l i s i m m i n + h u o l e l l i s t a + h u o l e l l i s t e n + h u o l e l l i s u u d e s t a + h u o l e l l i s u u s v e l v o i t t e e n s a + h u o l e l l i s u u t t a + h u o l e m m e + h u o l e n + h u o l e n a + h u o l e n a i h e + h u o l e n a i h e e k s i + h u o l e n a i h e e m m e + h u o l e n a i h e e n a + h u o l e n a i h e e n a n i + h u o l e n a i h e e n i + h u o l e n a i h e e n s a + h u o l e n a i h e e s e e n + h u o l e n a i h e e s e e n i + h u o l e n a i h e e s t a + h u o l e n a i h e e t + h u o l e n a i h e i d e n + h u o l e n a i h e i s i i m m e + h u o l e n a i h e i s i i n + h u o l e n a i h e i s i i n s a + h u o l e n a i h e i s t a + h u o l e n a i h e i s t a a n + h u o l e n a i h e i s t a m m e + h u o l e n a i h e i s t a n i + h u o l e n a i h e i t a + h u o l e n a i h e i t a a n + h u o l e n a i h e i t a m m e + h u o l e n a i h e i t a n i + h u o l e n a i h e i t a n n e + h u o l e n a i h e t t a + h u o l e n a i h e t t a n i + h u o l e n i + h u o l e n i l m a i s u m m e + h u o l e n i l m a i s u t + h u o l e n i l m a u k s i a + h u o l e n i l m a u s + h u o l e n l ä h t e e n ä + h u o l e n n e + h u o l e n p i d o s t a + h u o l e n p i t o a + h u o l e n p i t o r a k e n t e i t a + h u o l e n s a + h u o l e s t a + h u o l e s t u a + h u o l e s t u i m m e + h u o l e s t u m a a n + h u o l e s t u m a t t a + h u o l e s t u m i n e n + h u o l e s t u m i s e e n + h u o l e s t u m i s e l l e + h u o l e s t u m i s e n + h u o l e s t u m i s e n s a + h u o l e s t u m i s e s t a + h u o l e s t u m i s t a + h u o l e s t u n e e m p i + h u o l e s t u n e e m p i a + h u o l e s t u n e e n a + h u o l e s t u n e i l l e + h u o l e s t u n e i n a + h u o l e s t u n e i s u u t e e n + h u o l e s t u n e i s u u t e m m e + h u o l e s t u n e i s u u t e n i + h u o l e s t u n e i s u u t e n n e + h u o l e s t u n e i s u u t e n s a + h u o l e s t u n e i s u u t t a + h u o l e s t u n e i s u u t t a n i + h u o l e s t u n e i s u u t t a n n e + h u o l e s t u n e i t a + h u o l e s t u n u t t a + h u o l e s t u t t a a + h u o l e s t u t t a n e e s t a + h u o l e s t u t t a n e e t + h u o l e s t u t t a n u t + h u o l e s t u t t a v a a + h u o l e s t u t t a v a l l a + h u o l e s t u t t a v a l t a + h u o l e s t u t t a v a m m a l l a + h u o l e s t u t t a v a m m a l l e + h u o l e s t u t t a v a m m a t + h u o l e s t u t t a v a m m i n + h u o l e s t u t t a v a m p a a + h u o l e s t u t t a v a m p a a n + h u o l e s t u t t a v a m p a n a + h u o l e s t u t t a v a m p i + h u o l e s t u t t a v a m p i a + h u o l e s t u t t a v a n + h u o l e s t u t t a v a n a + h u o l e s t u t t a v a s s a + h u o l e s t u t t a v a s t a + h u o l e s t u t t a v a s t i + h u o l e s t u t t a v a t + h u o l e s t u t t a v i a + h u o l e s t u t t a v i e n + h u o l e s t u t t a v i i n + h u o l e s t u t t a v i m m a s s a + h u o l e s t u t t a v i m m a s t a + h u o l e s t u t t a v i m m a t + h u o l e s t u t t a v i m m i s t a + h u o l e s t u t t a v i m p i a + h u o l e s t u t t a v i m p i e n + h u o l e s t u t t a v i m p i i n + h u o l e s t u t t a v i n + h u o l e s t u t t a v i n t a + h u o l e s t u t t a v i s t a + h u o l e s t u t t i + h u o l e t + h u o l e t o n t a + h u o l e t t a a + h u o l e t t a a k i n + h u o l e t t a v a t + h u o l e t t o m a m p i + h u o l i a + h u o l i a a n + h u o l i e n i + h u o l i i n + h u o l i m a t t o m a s t a + h u o l i m a t t o m u u d e n + h u o l i m a t t o m u u d e s t a + h u o l i m a t t o m u u d e t + h u o l i m a t t o m u u t t a + h u o l i n t a l i i k k e e t + h u o l i s s a a n + h u o l i s s a m m e + h u o l i s s a n i + h u o l i s s a n n e + h u o l i s t a + h u o l i s t a a n + h u o l i s t a n i + h u o l i t s i j a t + h u o l i t s i j o i d e n + h u o l i t s i j o i l l e + h u o l l e t t a v i a + h u o l l e t t a v i e n + h u o l l e t t a v i k s i + h u o l l e t t a v i l l e + h u o l l e t t a v i s t a + h u o l l o n + h u o l l o s s a + h u o l l o s t a + h u o l t a + h u o l t a a + h u o l t a j u u d e s t a + h u o l t a j u u s k i i s t a + h u o l t a j u u s k i i s t a t + h u o l t a j u u s k i i s t o i s s a + h u o l t a j u u s k y s y m y k s e s s ä + h u o l t a j u u s k y s y m y s + h u o l t a j u u s k ä s i t e + h u o l t a j u u s m e n e t t e l y n + h u o l t a j u u s m e n e t t e l y ä + h u o l t a j u u t t a + h u o l t a m o i l l a + h u o l t a n i + h u o l t e n + h u o l t o a + h u o l t o a j o n e u v o j a + h u o l t o a s e m a + h u o l t o a s e m a l l a + h u o l t o a s e m a l l e + h u o l t o a s e m a l t a + h u o l t o a s e m a n + h u o l t o a s e m a t + h u o l t o a s e m i a + h u o l t o a s e m i e n + h u o l t o a s e m i i n + h u o l t o a s e m i l l a + h u o l t o a s e m i l l e + h u o l t o h a l l i n t o a l u e + h u o l t o h a l l i n t o a l u e e n a + h u o l t o h a l l i n t o n e u v o s t o n + h u o l t o h e n k i l ö k u n t a a n + h u o l t o h e n k i l ö s t ö n + h u o l t o i n s i n ö ö r e i l t ä + h u o l t o j a + h u o l t o k e t j u j a + h u o l t o k u l j e t u k s i s s a + h u o l t o k u s t a n n u k s e n s a + h u o l t o k u s t a n n u k s i s t a + h u o l t o k u s t a n n u s t e n + h u o l t o l a i t o s t e n + h u o l t o l a i t t e e t + h u o l t o l i n j a t + h u o l t o m a r k k i n o i l l a + h u o l t o m i e h e n ä + h u o l t o m o d u u l i + h u o l t o o n + h u o l t o p a l v e l u i d e n + h u o l t o p a l v e l u j e n + h u o l t o p a l v e l u n + h u o l t o p a l v e l u t + h u o l t o p o l i t i i k k a a + h u o l t o p o l i t i i k k a a m m e + h u o l t o p r o s e s s i + h u o l t o r a k e n t e i d e n + h u o l t o r a k e n t e i t a + h u o l t o r e i t t e j ä + h u o l t o s o p i m u k s i a + h u o l t o s t r a t e g i o i d e n + h u o l t o s u h d e + h u o l t o s u h d e t t a + h u o l t o s u h t e e n + h u o l t o t a k u u n + h u o l t o t a k u u p a l v e l u i s t a + h u o l t o t i l a n n e + h u o l t o t o i m e n p i d e + h u o l t o t o i m e n p i t e e t + h u o l t o t o i m i n t a a + h u o l t o t ö i h i n + h u o l t o t ö i s s ä + h u o l t o v a l m i u k s i l l a + h u o l t o v a r m u u d e n + h u o l t o v a r m u u s + h u o l t o v a r m u u t t a + h u o l t o v ä l e j ä + h u o l t o y h t e y d e t + h u o l t o y r i t y s + h u o l t o y r i t y s t e n + h u o m a a k a a n + h u o m a a m a a n + h u o m a a m a t t a + h u o m a a m a t t a a n + h u o m a a m a t t a m m e + h u o m a a m a t t a n i + h u o m a a m m e + h u o m a a n k i n + h u o m a a t t e + h u o m a a t t e h a n + h u o m a a v a i s u u t t a + h u o m a a v a n + h u o m a a v a t + h u o m a a v i n a a n + h u o m a a v i n a a n k a a n + h u o m a a v i n a n i + h u o m a i s i + h u o m a n n e e t + h u o m a n n u t + h u o m a s i m m e + h u o m a s i n + h u o m a s i t t e + h u o m a s i t t e k o + h u o m a t a + h u o m a t a a n + h u o m a t e s s a a n + h u o m a t e s s a m m e + h u o m a t e s s a n i + h u o m a t k a a + h u o m a t k a a m m e + h u o m a t t a i s i i n + h u o m a t t a k o o n + h u o m a t t a v a a + h u o m a t t a v a a n + h u o m a t t a v a k s i + h u o m a t t a v a l l a + h u o m a t t a v a l l e + h u o m a t t a v a l t a + h u o m a t t a v a m m a s t a + h u o m a t t a v a m m a t + h u o m a t t a v a m p a a + h u o m a t t a v a m p i + h u o m a t t a v a m p i a + h u o m a t t a v a n + h u o m a t t a v a n a + h u o m a t t a v a s s a + h u o m a t t a v a s t a + h u o m a t t a v a s t i k i n + h u o m a t t a v a t + h u o m a t t a v i a + h u o m a t t a v i e n + h u o m a t t a v i i n + h u o m a t t a v i l l a + h u o m a t t a v i m m a t + h u o m a t t a v i m m i n + h u o m a t t a v i m m i s t a + h u o m a t t a v i m p i a + h u o m a t t a v i n + h u o m a t t a v i n t a + h u o m a t t a v i s s a + h u o m a t t a v i s t a + h u o m a t t i i n + h u o m a u t a m m e k i n + h u o m a u t a n + h u o m a u t e t a a n + h u o m a u t e t t a k o o n + h u o m a u t e t t a v a + h u o m a u t e t t a v a a + h u o m a u t e t t u + h u o m a u t i t t e + h u o m a u t t a a + h u o m a u t t a e s s a n i + h u o m a u t t a i s i n + h u o m a u t t a m a t t a + h u o m a u t t a m i s e n + h u o m a u t t a m i s t a + h u o m a u t t a n e e t + h u o m a u t t a n u t + h u o m a u t t i + h u o m a u t u k s e e n + h u o m a u t u k s e e n n e + h u o m a u t u k s e l l a + h u o m a u t u k s e n + h u o m a u t u k s e n a + h u o m a u t u k s e n a n i + h u o m a u t u k s e n i + h u o m a u t u k s e n n e + h u o m a u t u k s e n s a + h u o m a u t u k s e s t a + h u o m a u t u k s e s t a a n + h u o m a u t u k s e t + h u o m a u t u k s i a + h u o m a u t u k s i a n n e + h u o m a u t u k s i i n + h u o m a u t u k s i i n n e + h u o m a u t u k s i i n s a + h u o m a u t u k s i l l a + h u o m a u t u k s i l l a n n e + h u o m a u t u k s i s s a + h u o m a u t u k s i s s a n i + h u o m a u t u k s i s t a + h u o m a u t u k s i s t a n i + h u o m a u t u k s i s t a n n e + h u o m a u t u k s i t t a + h u o m a u t u s m a k s u j a + h u o m a u t u s t a + h u o m a u t u s t a n i + h u o m a u t u s t e n + h u o m e n a a m u l l a + h u o m e n a a m u l l a h a n + h u o m e n a a m u n a + h u o m e n a a m u u n + h u o m e n i l l a l l a + h u o m e n i l t a n a + h u o m e n n a k a a n + h u o m e n n a k i n + h u o m i o i d a + h u o m i o i d a a n + h u o m i o i d e n + h u o m i o i h i n + h u o m i o i l l a + h u o m i o i m a t t a + h u o m i o i s t a + h u o m i o i s t a a n + h u o m i o i t a + h u o m i o i t a i s i i n + h u o m i o i t a v a + h u o m i o i v a t + h u o m i o l l e + h u o m i o m m e + h u o m i o n + h u o m i o n a r v o i n e n + h u o m i o n a r v o i s e m p a a + h u o m i o n a r v o i s e m p i + h u o m i o n a r v o i s e n + h u o m i o n a r v o i s i a + h u o m i o n a r v o i s i n t a + h u o m i o n a r v o i s i s t a + h u o m i o n a r v o i s t a + h u o m i o n i + h u o m i o n n e + h u o m i o n o s o i t u s t a + h u o m i o n s a + h u o m i o o n o t t a m i s e k s i + h u o m i o o n o t t a m i s e n + h u o m i o o n o t t a m i s t a + h u o m i o s t a + h u o m i o s t a n n e + h u o m i o t + h u o m i o t a + h u o m i o t a a n + h u o m i o t a m m e + h u o m i o t a n i + h u o m i o t a n n e + h u o m i o t a r k i s t u s t a + h u o m i o t t a + h u o m i o v a l o i l l a + h u o m i o v a l o j e n + h u o m i o v a l o t + h u o m i s a a m u a + h u o m i s a a m u i s e n + h u o m i s a a m u i s e s s a + h u o m i s a a m u l l a + h u o m i s a a m u n + h u o m i s a a m u n a + h u o m i s a a m u s t a + h u o m i s a a m u u n + h u o m i s e e n + h u o m i s e k s i + h u o m i s e n + h u o m i s e s s a + h u o m i s e s t a + h u o m i s i a + h u o m i s i l t a a + h u o m i s i l t a a n + h u o m i s i l t a n a + h u o m i s i l t a p ä i v ä n + h u o m i s i l t a p ä i v ä ä n + h u o m i s i s s a + h u o m i s p ä i v ä n + h u o m i s t a + h u o m i s t e n + h u o n e a r a l i a + h u o n e e n + h u o n e e s s a + h u o n e i l m a a + h u o n e i l m a n + h u o n e i s t o h o t e l l i + h u o n e k a l u a l a n + h u o n e k a l u i s s a + h u o n e k a l u j a + h u o n e k a l u j e n + h u o n e k a l u t e o l l i s u u d e n + h u o n e k a l u t e o l l i s u u s + h u o n e k a l u t u o n t i + h u o n e k a l u y r i t y s + h u o n e k o i s o + h u o n e t t a + h u o n e y ö k k ö n e n + h u o n o a + h u o n o i h i n + h u o n o i k s i + h u o n o i l l a + h u o n o i l l e + h u o n o i m m a n + h u o n o i m m a t + h u o n o i m m i n + h u o n o i m p i a + h u o n o i m p i i n + h u o n o i n + h u o n o i n a + h u o n o i n a k i n + h u o n o i n t a + h u o n o i s s a + h u o n o i s t a + h u o n o j a + h u o n o j e n + h u o n o k s i + h u o n o k u n t o i n e n + h u o n o k u n t o i s e m p a n a + h u o n o k u n t o i s e t + h u o n o k u n t o i s i l l a + h u o n o k u n t o i s i m m a n + h u o n o k u n t o i s i s s a + h u o n o k u u l o i s i a + h u o n o k u u l o i s i l l e + h u o n o l a a t u i n e n + h u o n o l a a t u i s e k s i + h u o n o l a a t u i s e l l a + h u o n o l a a t u i s e m m a l l a + h u o n o l a a t u i s e m p i a + h u o n o l a a t u i s e n + h u o n o l a a t u i s e s t a + h u o n o l a a t u i s e t + h u o n o l a a t u i s i a + h u o n o l a a t u i s i i n + h u o n o l a a t u i s i l l a + h u o n o l a a t u i s i l t a + h u o n o l a a t u i s i s t a + h u o n o l a a t u i s t a + h u o n o l a a t u i s t e n + h u o n o l a a t u i s u u t e n s a + h u o n o l l a + h u o n o m a i n e i n e n + h u o n o m m a k s i + h u o n o m m a n + h u o n o m m a s s a + h u o n o m m a s t a + h u o n o m m a t + h u o n o m m i k s i + h u o n o m p a a n + h u o n o m p i + h u o n o m p i a + h u o n o m p i e n + h u o n o m p i i n + h u o n o m p i l a a t u i s i a + h u o n o m p i l a a t u i s t a + h u o n o m p i n a + h u o n o m p i o s a i s e t + h u o n o m p i o s a i s t e n + h u o n o n + h u o n o n a + h u o n o n e e + h u o n o n e m a s s a + h u o n o n e m i s e e n + h u o n o n e m i s t a + h u o n o n e v a t + h u o n o n i + h u o n o n n e t a a n + h u o n o n n u k s i a + h u o n o n t a i s i + h u o n o n t a m i s a r g u m e n t t i n a + h u o n o n t u a + h u o n o n t u e s s a + h u o n o n t u m a s s a + h u o n o n t u m i s e n + h u o n o n t u m i s e s t a + h u o n o n t u m i s o n g e l m i e n + h u o n o n t u n e e n + h u o n o n t u n e e t + h u o n o n t u u + h u o n o n ä k ö i s t e n + h u o n o o n + h u o n o p a l k k a i s e e n + h u o n o p a l k k a i s e n + h u o n o p a l k k a i s e t + h u o n o p a l k k a i s i a + h u o n o p a l k k a i s i l l a + h u o n o p a l k k a i s t e n + h u o n o s s a + h u o n o s t a + h u o n o t + h u o n o t k i n + h u o n o t u l o i s i l l e + h u o n o v o i n t i s i k s i + h u o p a k e l t a n o + h u o p a o h d a k e + h u p a i s a a + h u p a m u s t e s i e n i + h u p p u h o p e a n o k k a + h u p p u h u i l u v a r i s + h u p p u h y y p p ä + h u p p u k e l t a y ö k k ö n e n + h u p p u k e r t t u l i + h u p p u k o l i b r i + h u p p u k o r p p i k o t k a + h u p p u k u h a n k e i t t ä j ä + h u p p u m e r i m e t s o + h u p p u n ä r h i + h u p p u o l i i v i p e i p p o + h u p p u p a r a t i i s i k a i j a + h u p p u r a i t a k a i j a + h u p p u r a s t a s + h u p p u s i e p p o + h u p p u s i r k k u + h u p p u s u o h a u k k a + h u p p u t a s k u + h u p p u t i n a m i + h u p p u t ö p ö s i e p p o + h u p p u v i i d a k k o h a r a k k a + h u p p u v i u h k a k e r t t u l i + h u p p u v u o r i t a n g a r a + h u r j a p ä ä t + h u r j a t + h u r j e m m i l t a + h u r j i a + h u r r a a h u u t o j a + h u r r i k a a n i + h u r r i k a a n i a s t e i k k o + h u r r i k a a n i k a u s i + h u r r i k a a n i k e s k u s + h u r r i k a a n i t u u l i a + h u r s k a a t + h u r s k a i d e n + h u r s k a i s t a + h u r s k a i t a + h u r s k a s t e l e v a a + h u r s k a s t e l e v a l l a + h u r s k a s t e l e v i a k i n + h u r s k a s t e l u l t a + h u r t a n h e i s i + h u r t a n m i n t t u + h u s a a r i a p i n a + h u s s i l a i s s o d a t + h u t e r a j a l k a i n e n + h u t e r a l l e + h u t e r a t + h u t i l o i m i s e e n + h u t i l o i m m e + h u t i l o i v a t + h u t i l o i v i a + h u t k i t a a n + h u t u e n e m m i s t ö n + h u t u j e n + h u t u j o h t a j i a + h u t u k a p i n a l l i s e t + h u t u k a p i n a l l i s t e n + h u t u p a k o l a i s t e n + h u t u p r e s i d e n t t i + h u t u v a l t a + h u u d a h d u k s e e n + h u u d a h d u k s i a + h u u h k a j a t + h u u h t e l u a i n e + h u u h t o u t u i + h u u l e t + h u u l i a a n + h u u l i k a r h u + h u u l i k i i l t o + h u u l i l l a + h u u l i l ä v i s t y s + h u u l i p u n a m u r h a a j a + h u u l i r a s v a + h u u l i r i h m a k a l a + h u u l i t i i v i s t e + h u u m a u s a i n e + h u u m a u s a i n e a l a n + h u u m a u s a i n e e n + h u u m a u s a i n e e t + h u u m a u s a i n e e t o n + h u u m a u s a i n e e t o n t a + h u u m a u s a i n e e t t o m a a n + h u u m a u s a i n e e t t o m a n + h u u m a u s a i n e i d e n + h u u m a u s a i n e i d e n k ä y t t ä j i e n + h u u m a u s a i n e i s i i n + h u u m a u s a i n e i s t a + h u u m a u s a i n e i t a + h u u m a u s a i n e k a u p a l l e + h u u m a u s a i n e k a u p a n + h u u m a u s a i n e k a u p a s s a + h u u m a u s a i n e k a u p a s t a + h u u m a u s a i n e k a u p p a + h u u m a u s a i n e k a u p p a a + h u u m a u s a i n e k a u p p a a n + h u u m a u s a i n e k a u p p i a i d e n + h u u m a u s a i n e k e s k u s t e l u + h u u m a u s a i n e k y s y m y k s e e n + h u u m a u s a i n e k y s y m y k s e n + h u u m a u s a i n e k y s y m y k s e s t ä + h u u m a u s a i n e k y s y m y k s e t + h u u m a u s a i n e k y s y m y s + h u u m a u s a i n e k y s y m y s t ä + h u u m a u s a i n e m a r k k i n a t + h u u m a u s a i n e m a r k k i n o i d e n + h u u m a u s a i n e o h j e l m a + h u u m a u s a i n e o n g e l m a + h u u m a u s a i n e o n g e l m a a + h u u m a u s a i n e o n g e l m a a n + h u u m a u s a i n e o n g e l m a n + h u u m a u s a i n e o n g e l m a t + h u u m a u s a i n e o n g e l m i i n + h u u m a u s a i n e p o l i t i i k a l l a + h u u m a u s a i n e p o l i t i i k a n + h u u m a u s a i n e p o l i t i i k a s s a + h u u m a u s a i n e p o l i t i i k a s t a + h u u m a u s a i n e p o l i t i i k a t + h u u m a u s a i n e p o l i t i i k k a + h u u m a u s a i n e p o l i t i i k k a a + h u u m a u s a i n e p o l i t i i k k a a n + h u u m a u s a i n e p o l i t i i k k o j e n + h u u m a u s a i n e p r e k u r s o r e i s t a + h u u m a u s a i n e r e i t t e j ä + h u u m a u s a i n e r i i p p u v u u d e n + h u u m a u s a i n e r i i p p u v u u d e s t a + h u u m a u s a i n e r i i p p u v u u s + h u u m a u s a i n e r i i p p u v u u t t a + h u u m a u s a i n e r i k o k s e t + h u u m a u s a i n e r i k o k s i a + h u u m a u s a i n e r i k o k s i e n + h u u m a u s a i n e r i k o k s i i n + h u u m a u s a i n e r i k o k s i s t a + h u u m a u s a i n e r i k o l l i s e t + h u u m a u s a i n e r i k o l l i s u u d e n + h u u m a u s a i n e r i k o l l i s u u d e s t a + h u u m a u s a i n e r i k o l l i s u u t t a + h u u m a u s a i n e r y h m ä n + h u u m a u s a i n e s e u r a n t a k e s k u k s e l l e + h u u m a u s a i n e s e u r a n t a k e s k u k s e n + h u u m a u s a i n e s e u r a n t a k e s k u s + h u u m a u s a i n e s t r a t e g i a + h u u m a u s a i n e s t r a t e g i a a + h u u m a u s a i n e s t r a t e g i a k s i + h u u m a u s a i n e s t r a t e g i a n + h u u m a u s a i n e s t r a t e g i a s t a + h u u m a u s a i n e s t r a t e g i o i t a + h u u m a u s a i n e t i e t o v e r k o t + h u u m a u s a i n e t i l a n t e e n + h u u m a u s a i n e t i l a n t e e s e e n + h u u m a u s a i n e t i l a s t o j e n + h u u m a u s a i n e t o i m i k u n n a s s a + h u u m a u s a i n e t u o t a n n o n + h u u m a u s a i n e t u o t a n n o s t a + h u u m a u s a i n e t u o t a n t o a + h u u m a u s a i n e v a l v o n t a l a u t a k u n n a n + h u u m a u s a i n e v a l v o n t a l a u t a k u n t a + h u u m a u s a i n e v a l v o n t a t o i m i i n + h u u m a u s a i n e y k s i k ö n + h u u m a u s a i n e y l e i s s o p i m u k s e e n + h u u m a u s a i n e y l e i s s o p i m u k s e n + h u u m a u s a i n e y l e i s s o p i m u s + h u u m e a i n e k a u p a n + h u u m e a l a l l a + h u u m e a l a l t a + h u u m e a s i a a + h u u m e a s i a n t u n t e m u s t a + h u u m e a s i a n t u n t i j a m m e + h u u m e a s i o i d e n + h u u m e a s i o i s s a + h u u m e e t + h u u m e e t o n t a + h u u m e e t t o m a a n + h u u m e e t t o m a n + h u u m e e t t o m a s s a + h u u m e e t t o m a s t a + h u u m e e t t o m i a + h u u m e e t t o m i e n + h u u m e e t t o m i k s i + h u u m e e t t o m i s t a + h u u m e h e r r o j e n + h u u m e i d e n + h u u m e i d e n j a k e l u k e s k u s t e n + h u u m e i d e n k ä y t t ä j i e n + h u u m e i d e n k ä y t t ä j i i n + h u u m e i d e n k ä y t t ä j i l l e + h u u m e i d e n k ä y t t ä j i ä + h u u m e i d e n k ä y t t ö m a l l i + h u u m e i d e n k ä y t t ö ä + h u u m e i d e n k ä y t ö n + h u u m e i d e n k ä y t ö s t ä + h u u m e i d e n t o r j u n n a n + h u u m e i d e n t o r j u n n a s s a + h u u m e i d e n t o r j u n t a a n + h u u m e i d e n t o r j u n t a p o l i t i i k a n + h u u m e i d e n t o r j u n t a s t r a t e g i a l l a + h u u m e i d e n t o r j u n t a v e r k o i l t a + h u u m e i d e n t o r j u n t a v i r a n o m a i s t e n + h u u m e i d e n t u o t t a j i e n + h u u m e i d e n v a s t a i n e n + h u u m e i d e n v a s t a i s e n + h u u m e i d e n v a s t a i s i a + h u u m e i d e n v a s t a i s t a + h u u m e i d e n v a s t a i s t e n + h u u m e i d e n v i e j ä m a a + h u u m e i l l a + h u u m e i l m i ö n + h u u m e i l m i ö t ä + h u u m e i l t a + h u u m e i s i i n + h u u m e i s t a + h u u m e i t a + h u u m e j ä r j e s t e l m ä n + h u u m e j ä r j e s t ö n + h u u m e k a l a + h u u m e k a r t e l l e j a + h u u m e k a r t e l l i + h u u m e k a r t e l l i e n + h u u m e k a r t e l l i t + h u u m e k a s v e i s t a + h u u m e k a u p a l l a + h u u m e k a u p a l l e + h u u m e k a u p a n + h u u m e k a u p a s s a + h u u m e k a u p a s t a + h u u m e k a u p p a + h u u m e k a u p p a a + h u u m e k a u p p a a n + h u u m e k a u p p a k u l t t u u r i a + h u u m e k a u p p a o n g e l m a a + h u u m e k a u p p a v e r k o s t o j e n + h u u m e k a u p p i a a n + h u u m e k a u p p i a a s t a + h u u m e k a u p p i a a t + h u u m e k a u p p i a i d e n + h u u m e k a u p p i a i l l a + h u u m e k a u p p i a i l l e + h u u m e k a u p p i a i l t a + h u u m e k a u p p i a i s i i n + h u u m e k a u p p i a i s t a + h u u m e k a u p p i a i t a + h u u m e k a u p p i a s + h u u m e k a u p p i a s t a + h u u m e k e s k u s t e l u + h u u m e k o i r a + h u u m e k o i r i a + h u u m e k o k e i l u j a + h u u m e k u l t t u u r i a + h u u m e k u l t t u u r i n + h u u m e k u l t t u u r i s t a + h u u m e k u n i n k a i t a + h u u m e k u o l e m i a + h u u m e k u o l e m i e n + h u u m e k u r i i r e i n a + h u u m e k y s y m y k s e e n + h u u m e k y s y m y k s i ä + h u u m e k y s y m y s + h u u m e k y s y m y s t ä + h u u m e l a i n s ä ä d ä n n ö n + h u u m e l a i n s ä ä d ä n t ö + h u u m e l a i n s ä ä d ä n t ö ä + h u u m e l a i t u r i k s i + h u u m e l i i g o i s t a + h u u m e l u v u t + h u u m e m a a i l m a + h u u m e m a a i l m a a n + h u u m e m a f i a + h u u m e m a f i a a + h u u m e m a f i a a n + h u u m e m a f i a n + h u u m e m a r k k i n a t + h u u m e m a r k k i n o i l l a + h u u m e m a r k k i n o i l l e + h u u m e m a t k a i l u a + h u u m e m a t k a i l u l l e + h u u m e m a t k a i l u n + h u u m e n e u v o n t a v e r k k o j e n + h u u m e o h j e l m a n + h u u m e o n g e l m a + h u u m e o n g e l m a a + h u u m e o n g e l m a a n + h u u m e o n g e l m a n + h u u m e o n g e l m a s s a + h u u m e o n g e l m a s t a + h u u m e o n g e l m a t + h u u m e o n g e l m i a + h u u m e o n g e l m i e n s a + h u u m e o n g e l m i i n + h u u m e p a r o n e i l l e + h u u m e p a r o n i e n + h u u m e p a r o n i n + h u u m e p a r o n i t + h u u m e p o h a t t o j e n + h u u m e p o l i i t t i n e n + h u u m e p o l i t i i k a l l a + h u u m e p o l i t i i k a l l e + h u u m e p o l i t i i k a n + h u u m e p o l i t i i k a s s a + h u u m e p o l i t i i k a s t a + h u u m e p o l i t i i k k a + h u u m e p o l i t i i k k a a + h u u m e p o l i t i i k k a a n + h u u m e p o l i t i i k k a a n s a + h u u m e p o l i t i i k k a m m e + h u u m e p o l i t i i k k a n s a + h u u m e p o l i t i i k k o j a + h u u m e p o l i t i i k k o j a a n + h u u m e p o l i t i i k k o j e n + h u u m e p o m o j a + h u u m e p o m o j e n + h u u m e r a h a t + h u u m e r a h o i s t a + h u u m e r e i t t i + h u u m e r e i t t i e n + h u u m e r i i p p u v a i s e t + h u u m e r i i p p u v a i s i a + h u u m e r i i p p u v a i s i i n + h u u m e r i i p p u v a i s t a + h u u m e r i i p p u v a i s t e n + h u u m e r i i p p u v u u d e l l e + h u u m e r i i p p u v u u d e n + h u u m e r i i p p u v u u d e s t a + h u u m e r i i p p u v u u s + h u u m e r i i p p u v u u s o n g e l m a a + h u u m e r i i p p u v u u s t a p a u k s i s s a + h u u m e r i i p p u v u u t e e n + h u u m e r i i p p u v u u t e n s a + h u u m e r i i p p u v u u t t a + h u u m e r i k o k s e t + h u u m e r i k o k s i a + h u u m e r i k o l l i s e t + h u u m e r i k o l l i s i l l e + h u u m e r i k o l l i s u u d e n + h u u m e r i k o l l i s u u d e s t a + h u u m e r i k o l l i s u u d e s t a k i n + h u u m e r i k o l l i s u u s + h u u m e r i k o l l i s u u t e e n + h u u m e r i k o s t e n + h u u m e s a l a k u l j e t u k s e s t a + h u u m e s a t a m i k s i + h u u m e s o t a + h u u m e s o t a a n + h u u m e s t r a t e g i a + h u u m e s t r a t e g i a a n + h u u m e s t r a t e g i a m i e t i n t ö ä + h u u m e s t r a t e g i a n + h u u m e s t r a t e g i a s t a + h u u m e s t r a t e g i o i s t a + h u u m e s y n d i k a a t i t + h u u m e t a l o u s + h u u m e t e o l l i s u u d e n + h u u m e t e o l l i s u u s + h u u m e t e r r o r i s t e i h i n + h u u m e t e s t a u s + h u u m e t o r j u n t a + h u u m e t o r j u n t a a + h u u m e t s a a r i + h u u m e t u o t a n n o n + h u u m e t u o t a n n o s s a + h u u m e t u o t a n n o s t a + h u u m e t u o t a n t o a + h u u m e v a l v o n t a o h j e l m a n + h u u m e v i l j e l m i e n + h u u m e v i l j e l m i k s i + h u u m e v i l j e l m i l l ä + h u u m e v i l j e l m i ä + h u u m e v i l j e l y k s i ä + h u u m e v i l j e l y n + h u u m e v i r a s t o + h u u m e v i r a s t o n + h u u m e v i r r a t + h u u m e v ä l i t t ä j i e n + h u u m e v ä l i t t ä j i ä + h u u m e y h t e i s t y ö s t ä + h u u m e y k s i k k ö + h u u m e y k s i k ö n + h u u m e y l e i s s o p i m u s t e n + h u u m o r i a + h u u m o r i f a n t a s i a + h u u m o r i l l a + h u u m o r i m u s i i k k i + h u u m o r i n + h u u m o r i n t a j u + h u u m o r i n t a j u a + h u u m o r i n t a j u a a n + h u u m o r i n t a j u a n n e + h u u m o r i n t a j u n n e + h u u m o r i n t a j u s t a + h u u m o r i n t a j u s t a a n + h u u m o r i n t a j u s t a n n e + h u u m o r i r o c k + h u u r u m a d o n l a k k i + h u u r u s s a + h u u t a a + h u u t a i s i m m e + h u u t e l u n + h u u t o k a u p a l l a + h u u t o k a u p a s t a + h u u t o k a u p a t + h u u t o k a u p a t t a v i a + h u u t o k a u p o i s t a + h u u t o k a u p p a h i n n a t + h u u t o k a u p p a j ä r j e s t e l m ä + h u u t o k a u p p a j ä r j e s t e l m ä n + h u u t o k a u p p a j ä r j e s t e l m ä s t ä + h u u t o k a u p p a j ä r j e s t e l m ä ä + h u u t o k a u p p a j ä r j e s t e l m ä ä n + h u u t o k a u p p a k a m a r e i d e n + h u u t o k a u p p a k a m a r e i l l e + h u u t o k a u p p a k a m a r i e n + h u u t o k a u p p a k a m a r i t + h u u t o k a u p p a k e s k u k s i l l e + h u u t o k a u p p a k e s k u s t e l u + h u u t o k a u p p a k y s y m y k s e n + h u u t o k a u p p a k y s y m y s + h u u t o k a u p p a m e n e t e l m ä + h u u t o k a u p p a m e n e t t e l y l l ä + h u u t o k a u p p a o i k e u d e n + h u u t o k a u p p a p e r i a a t e + h u u t o k a u p p a p o l i t i i k k a + h u u t o k a u p p a p r o s e s s i a + h u u t o k a u p p a t a s o a + h u u t o k a u p p a t a s o n + h u u t o k a u p p a t u l o i s t a + h u u t o k a u p p a t u l o t + h u u t o k a u p p o i n e e n + h u u t o k a u p p o j a + h u u t o k a u p p o j e n + h u u t o m e r k k i + h u u t o m e r k k i y ö k k ö n e n + h u u t o ä ä n e s t y k s e s t ä + h u v e n n e e t + h u v e t t u a + h u v i a j o n e u v o t + h u v i a l u k s e t + h u v i a l u k s i a + h u v i a l u k s i i n + h u v i a l u k s i l l e + h u v i a l u s t e n + h u v i j a h d i t + h u v i k a l a s t u k s e n + h u v i k a l a s t u s + h u v i k o r t t e l e i h i n + h u v i k u m p u + h u v i m e t s ä s t y s t ä + h u v i p u i s t o + h u v i p u i s t o j a + h u v i p u i s t o k s i + h u v i p u i s t o l a i t e + h u v i p u i s t o l t a + h u v i p u i s t o s s a + h u v i p u i s t o t + h u v i r e t k e n + h u v i r i s t e i l i j ä + h u v i t i l a i s u u s + h u v i t t a v a a + h u v i t t a v a m p a a + h u v i t t a v i a + h u v i v e n e a l a l l a + h u v i v e n e d i r e k t i i v i n + h u v i v e n e d i r e k t i i v i ä + h u v i v e n e e n + h u v i v e n e e n k u l j e t t a j a n k i r j a + h u v i v e n e e t + h u v i v e n e i d e n + h u v i v e n e i l l e + h u v i v e n e i l y + h u v i v e n e i l y n + h u v i v e n e i l y s t ä + h u v i v e n e i s i i n + h u v i v e n e i s s ä + h u v i v e n e i s t ä + h u v i v e n e i t ä + h u v i v e n e t e o l l i s u u s + h u v i v e n e t t ä + h y a s i n t t i a r a + h y b r i d i a j o j ä r j e s t e l m ä t + h y b r i d i a j o n e u v o i h i n + h y b r i d i a j o n e u v o i s s a + h y b r i d i a j o n e u v o j a + h y b r i d i a j o n e u v o n + h y b r i d i a j o n e u v o t + h y b r i d i a u t o + h y b r i d i a u t o i h i n + h y b r i d i a u t o i l l e + h y b r i d i a u t o i s t a + h y b r i d i a u t o j a + h y b r i d i a u t o j e n + h y b r i d i a u t o n + h y b r i d i a u t o t + h y b r i d i k i m a i r o i h i n + h y b r i d i k i s s a + h y b r i d i l a j i a + h y b r i d i l a j i k k e i s t a + h y b r i d i m e r k i n t ä j ä r j e s t e l m ä ä + h y b r i d i m o o t t o r e i t a + h y b r i d i m o o t t o r i e n + h y b r i d i p o l k u p y ö r ä + h y b r i d i p ä ä o m a n + h y b r i d i r a k e t t i + h y b r i d i r e a k t o r e i d e n + h y b r i d i s o d a n k ä y n t i + h y b r i d i s o l u j e n + h y b r i d i t e k n i i k k a a n + h y b r i d i t e k n o l o g i a n + h y b r i d i t e l e v i s i o p a l v e l u i h i n + h y b r i d i t u t k i m u k s e e n + h y d r a t s i i n i s u l f a a t t i + h y d r a u l i i k k a ö l j y + h y d r a u l i i k k a ö l j y i s s ä + h y d r a u l i s e n + h y d r o g e o l o g i s e t + h y d r o h e l i u m + h y d r o k s i e t y y l i t ä r k k e l y s + h y d r o k s i n a f t o l i s i n i n e n + h y d r o m i e s + h y d r o t e r m i s e t + h y d r o t e r m i s t e n + h y e e n a k o i r a + h y g i e e n i s e m p ä ä + h y g i e n i a a + h y g i e n i a d i r e k t i i v i ä + h y g i e n i a k y s y m y s + h y g i e n i a k y s y m y s t e n + h y g i e n i a k ä y t t ä y t y m i s t ä + h y g i e n i a k ä y t ä n n ö t + h y g i e n i a k ä y t ä n t ö j ä + h y g i e n i a l a i n s ä ä d ä n n ö n + h y g i e n i a l a i n s ä ä d ä n t ö + h y g i e n i a l a i n s ä ä d ä n t ö ä + h y g i e n i a l a i t + h y g i e n i a m ä ä r ä y k s i ä + h y g i e n i a m ä ä r ä y s t e n + h y g i e n i a n + h y g i e n i a n o r m e j a + h y g i e n i a n o r m i e n + h y g i e n i a o l o i s s a + h y g i e n i a o l o i s t a + h y g i e n i a o l o j e n + h y g i e n i a o l o s u h t e i t a + h y g i e n i a o l o t + h y g i e n i a o n g e l m a + h y g i e n i a o n g e l m i a + h y g i e n i a p a k e t i n + h y g i e n i a p a k e t i s s a + h y g i e n i a p a k e t t i + h y g i e n i a s t a n d a r d i t + h y g i e n i a s y i s t ä + h y g i e n i a s ä ä n n ö i s t ä + h y g i e n i a s ä ä n n ö k s e s t ä + h y g i e n i a s ä ä n n ö s t e n + h y g i e n i a s ä ä n n ö t + h y g i e n i a s ä ä n t ö j e n + h y g i e n i a s ä ä n t ö j ä + h y g i e n i a s ä ä n t ö j ä m m e + h y g i e n i a t a s o + h y g i e n i a t a s o a + h y g i e n i a t a s o n + h y g i e n i a t i l a n n e + h y g i e n i a t u o t t e e t + h y g i e n i a t u o t t e i s t a + h y g i e n i a t u o t t e i t a + h y g i e n i a v a a t i m u k s e t + h y g i e n i a v a a t i m u k s i a + h y g i e n i a v a a t i m u k s i s t a + h y g i e n i a v a a t i m u s t e n + h y g i e n i a v a r o t o i m e t + h y g i e n i a v a r u s t e i t a + h y k e r r e l l ä + h y l j e k a n n a t + h y l j e k a n t a + h y l j e k a n t o j a + h y l j e k i e l t o a + h y l j e k i e l t o l a k i m m e + h y l j e k i i n t i ö i t ä + h y l j e t t ä + h y l j e t u o t e k i e l t o a + h y l j e t u o t t e e t + h y l j e t u o t t e i d e n + h y l j e t u o t t e i t a + h y l j e t u o t t e i t a k i n + h y l j e t u r k k i a + h y l k e e n m e t s ä s t y k s e n + h y l k e e n m e t s ä s t y k s e s s ä + h y l k e e n m e t s ä s t y k s e s t ä + h y l k e e n m e t s ä s t y s + h y l k e e n m e t s ä s t y s t ä + h y l k e e n n a h k a + h y l k e e n n a h k a k a u p a n + h y l k e e n n a h k o j a + h y l k e e n n a h k o j e n + h y l k e e n p y y n n i l l ä + h y l k e e n p y y n n i s t ä + h y l k e e n p y y n t i + h y l k e e n p y y n t i i n + h y l k e e n p y y n t i ä + h y l k e e t + h y l k e i d e n + h y l k e i s t ä + h y l k e i t ä + h y l k i m i s r i s k i + h y l k i ö v a l t i o + h y l k i ö v a l t i o t + h y l k y k y s y m y k s e n + h y l k ä i s i n + h y l k ä s i + h y l k ä s i m m e + h y l k ä s i n + h y l k ä s i v ä t + h y l k ä y s e h d o t u k s e n + h y l k ä y s e h d o t u k s e s t a + h y l k ä y s e h d o t u s t a + h y l k ä y s e s i t y k s e n + h y l k ä y s e s i t y s + h y l k ä y s p r o s e n t t i + h y l k ä y s ä ä n e l l ä + h y l k ä ä m i s a i k o m u s t a + h y l k ä ä m i s a s t e + h y l k ä ä m i s e h d o t u s + h y l k ä ä m i s e k s i + h y l k ä ä m i s e l l e + h y l k ä ä m i s e s t ä + h y l k ä ä m i s i l m i ö n + h y l k ä ä m i s k r i t e e r i e n + h y l k ä ä m i s l u v u t + h y l k ä ä m i s p e r u s t e e n a + h y l k ä ä m i s t e n + h y l k ä ä m i s t ä + h y l k ä ä m m e + h y l k ä ä m m e k i n + h y l k ä ä m ä l l ä + h y l k ä ä m ä s s ä + h y l k ä ä m ä s t ä + h y l k ä ä m ä t t ä + h y l k ä ä m ä ä m m e + h y l k ä ä m ä ä n + h y l k ä ä n + h y l k ä ä v ä t + h y l l y i h i n + h y l l y i l l e + h y l l y i l l ä + h y l l y i l t ä + h y l l y i s s ä + h y l l y j e n + h y l l y l l e + h y l l y l l ä + h y l l y p i l v i + h y l l y t t ä m i s e l l e + h y l l y t t ä m ä s s ä + h y l s y a v a i n + h y l y n k a p p a l e i d e n + h y l ä n n y t + h y l ä t e s s ä m m e + h y l ä t e s s ä ä n + h y l ä t k ä ä + h y l ä t k ä ä m m e + h y l ä t t i i n + h y l ä t t y j e n + h y l ä t t y ä + h y l ä t t y ä m m e + h y l ä t y t + h y l ä t ä + h y l ä t ä k s e e n + h y l ä t ä ä n + h y l ä t ä ä n k i n + h y m n i a s i a + h y m y i l y t t ä ä + h y m y i l y ä + h y m y p o i k a + h y m y y n + h y p e r d e v a l v a a t i o + h y p e r i m m u u n i t + h y p e r k a l v i n i s m i + h y p e r m a r k e t t i e n + h y p e r o k s i a + h y p e r r e a a l i l u k u + h y p e r t e r r o r i s m i + h y p e r t e r r o r i s m i i n + h y p e r t e r r o r i s m i n + h y p o t e e k k i l a i n a t + h y p o t e e k k i l a i n o j a + h y p o t e e k k i l a i n o j e n + h y p o t e e k k i p a n k i t + h y p o t e e k k i y h d i s t y s + h y p o t e e k k i y r i t y s + h y p o t e e t t i s i a + h y p o t e e t t i s i i n + h y p o t e e t t i s t a + h y p p y h e i t t o + h y p p y h ä m ä h ä k i t + h y p p y j ä n i s + h y p p y l e i k k a u s + h y p p y n a r u + h y p p y n a r u l o r u + h y p p y p ä ä s t ä i s e t + h y p p y r i m ä e t + h y p p y s a m m a k k o + h y p p y s i s s ä m m e + h y p p y t a m a r i i n i + h y p p ä y k s i n + h y p p ä ä m i s t ä + h y p ä h d e l l e n + h y s s y t t e l y p o l i t i i k k a a + h y s t e r i a a + h y s t e r i o i d e n + h y t i s i v ä t + h y t t i a s e n t a j a n a + h y t t y s t ä + h y t t y s v e r k k o j a + h y v e e l l i s e t + h y v e e l l i s y y s k i l p a i l u a + h y v e e t + h y v e i s t ä + h y v e i t ä + h y v e j o h t a j u u s + h y v e t i e t o t e o r i a + h y v e t t ä + h y v i e n + h y v i i n + h y v i k s i + h y v i l l ä + h y v i l l ä n i + h y v i l l ä ä n + h y v i l t ä + h y v i n h ä n + h y v i n k i n + h y v i n v o i n n i l l e + h y v i n v o i n n i n + h y v i n v o i n n i s s a + h y v i n v o i n n i s t a + h y v i n v o i n t i + h y v i n v o i n t i a + h y v i n v o i n t i a m m e + h y v i n v o i n t i b u d j e t t e j a m m e + h y v i n v o i n t i e d u t + h y v i n v o i n t i e h t o j a + h y v i n v o i n t i e r o j a + h y v i n v o i n t i h y ö t y j ä + h y v i n v o i n t i i n + h y v i n v o i n t i j ä r j e s t e l m i e n + h y v i n v o i n t i j ä r j e s t e l m i e n s ä + h y v i n v o i n t i j ä r j e s t e l m i l l e m m e + h y v i n v o i n t i j ä r j e s t e l m i s s ä + h y v i n v o i n t i j ä r j e s t e l m i ä + h y v i n v o i n t i j ä r j e s t e l m i ä m m e + h y v i n v o i n t i j ä r j e s t e l m ä + h y v i n v o i n t i j ä r j e s t e l m ä l l e + h y v i n v o i n t i j ä r j e s t e l m ä m m e + h y v i n v o i n t i j ä r j e s t e l m ä n + h y v i n v o i n t i j ä r j e s t e l m ä s t ä ä n + h y v i n v o i n t i j ä r j e s t e l m ä t + h y v i n v o i n t i j ä r j e s t e l m ä ä + h y v i n v o i n t i j ä r j e s t e l m ä ä n + h y v i n v o i n t i j ä r j e s t ö j e n + h y v i n v o i n t i k a p i t a l i s m i n + h y v i n v o i n t i k e s k u k s i s s a + h y v i n v o i n t i k i l p a i l u u n + h y v i n v o i n t i k u i l u + h y v i n v o i n t i k y s y m y k s e n ä + h y v i n v o i n t i k y s y m y s + h y v i n v o i n t i l a i n s ä ä d ä n t ö + h y v i n v o i n t i l e i k k a u k s i s t a + h y v i n v o i n t i l u o k i t u k s i s s a + h y v i n v o i n t i m a l l e i k s i + h y v i n v o i n t i m a l l i + h y v i n v o i n t i m a l l i a + h y v i n v o i n t i m a l l i a a n + h y v i n v o i n t i m a l l i a m m e + h y v i n v o i n t i m a l l i n + h y v i n v o i n t i m e n o t + h y v i n v o i n t i m i n i s t e r i + h y v i n v o i n t i n i + h y v i n v o i n t i n o r m e i h i n + h y v i n v o i n t i n o r m e j a + h y v i n v o i n t i n o r m i e n + h y v i n v o i n t i n o r m i t + h y v i n v o i n t i n s a + h y v i n v o i n t i n ä k ö k o h d a t + h y v i n v o i n t i n ä k ö k o h d i s t a + h y v i n v o i n t i n ä k ö k o h t i e n + h y v i n v o i n t i o h j e l m a t + h y v i n v o i n t i o h j e l m i e n + h y v i n v o i n t i o i k e u k s i a + h y v i n v o i n t i o n g e l m a t + h y v i n v o i n t i o n g e l m i a + h y v i n v o i n t i p a l v e l u i d e n + h y v i n v o i n t i p a l v e l u i t a + h y v i n v o i n t i p a l v e l u j a + h y v i n v o i n t i p a l v e l u j e n + h y v i n v o i n t i p o l i t i i k a l l a + h y v i n v o i n t i p o l i t i i k a n + h y v i n v o i n t i p o l i t i i k a s t a + h y v i n v o i n t i p o l i t i i k a t + h y v i n v o i n t i p o l i t i i k k a + h y v i n v o i n t i p o l i t i i k k a a + h y v i n v o i n t i p o l i t i i k k a a n + h y v i n v o i n t i p o l i t i i k k a m m e + h y v i n v o i n t i p o l i t i i k k a n s a + h y v i n v o i n t i p u o l u e + h y v i n v o i n t i r a k e n t e i d e n + h y v i n v o i n t i r e s e p t i + h y v i n v o i n t i s a a r e k k e i t a + h y v i n v o i n t i s e k t o r e i h i n + h y v i n v o i n t i s e k t o r i n + h y v i n v o i n t i s t a n d a r d e j a + h y v i n v o i n t i s t a n d a r d i e n + h y v i n v o i n t i s t a n d a r d i t + h y v i n v o i n t i t a l o u d e s t a + h y v i n v o i n t i t a l o u s t i e d e + h y v i n v o i n t i t a l o u t t a + h y v i n v o i n t i t a p p i o + h y v i n v o i n t i t a r k a s t u k s i a + h y v i n v o i n t i t a r k a s t u k s i s t a + h y v i n v o i n t i t a r p e i s i i n + h y v i n v o i n t i t e k i j ä n + h y v i n v o i n t i t i l a s s a + h y v i n v o i n t i t o i m i e n + h y v i n v o i n t i v a a t i m u k s e t + h y v i n v o i n t i v a a t i m u k s i a + h y v i n v o i n t i v a a t i m u s t e n + h y v i n v o i n t i v a i k u t u k s i a + h y v i n v o i n t i v a l t i o + h y v i n v o i n t i v a l t i o i d e m m e + h y v i n v o i n t i v a l t i o i d e n + h y v i n v o i n t i v a l t i o i s s a + h y v i n v o i n t i v a l t i o i s t a + h y v i n v o i n t i v a l t i o i t a m m e + h y v i n v o i n t i v a l t i o j ä r j e s t e l m ä n + h y v i n v o i n t i v a l t i o k s i + h y v i n v o i n t i v a l t i o l l e + h y v i n v o i n t i v a l t i o m a l l i a + h y v i n v o i n t i v a l t i o m m e + h y v i n v o i n t i v a l t i o n + h y v i n v o i n t i v a l t i o n a + h y v i n v o i n t i v a l t i o n n e + h y v i n v o i n t i v a l t i o o n + h y v i n v o i n t i v a l t i o s s a + h y v i n v o i n t i v a l t i o s t a + h y v i n v o i n t i v a l t i o t a + h y v i n v o i n t i v a l t i o t a a n + h y v i n v o i n t i v e r k o n + h y v i n v o i n t i y h t e i s k u n n a n + h y v i n v o i n t i y h t e i s k u n n a s s a m m e + h y v i n v o i n t i y h t e i s k u n n a s t a + h y v i n v o i n t i y h t e i s k u n n i s s a + h y v i n v o i n t i y h t e i s k u n t a + h y v i n v o i n t i y h t e i s k u n t a a + h y v i n v o i n t i y h t e i s k u n t a a m m e + h y v i n v o i n t i y h t e i s k u n t a m a l l i + h y v i n v o i n t i y h t e i s k u n t a m m e + h y v i n v o i n t i y h t e i s k u n t i e m m e + h y v i n v o i n t i y h t e i s k u n t i e n + h y v i n v o i n t i y h t e i s k u n t i n a + h y v i n v o i n t i y h t e i s ö n + h y v i n v o i v i e n + h y v i n ä + h y v i s s ä + h y v i s t ä + h y v i t t ä m ä ä n + h y v i t t ä ä + h y v i t y k s e l l e + h y v i t y k s e n + h y v i t y k s e s t ä + h y v i t y k s i s t ä + h y v i t y s j ä r j e s t e l m ä + h y v i t y s j ä r j e s t e l y j e n + h y v i t y s m a k s u j a + h y v i t y s m e k a n i s m i + h y v i t y s m e k a n i s m i n + h y v i t y s m e k a n i s m i t + h y v i t y s p a k e t t i + h y v i t y s t a v a n + h y v i t y s t u k i a + h y v i t y s t ä + h y v i ä + h y v i ä k i n + h y v y y s l u k u + h y v y y t e e n + h y v y y t t ä n i + h y v ä e n t e i s t ä + h y v ä i l e v ä t + h y v ä k i n + h y v ä k s e e n + h y v ä k s e m m e + h y v ä k s e n i + h y v ä k s i k ä y t t ä j i e n + h y v ä k s i k ä y t t ä j i l t ä + h y v ä k s i k ä y t t ä j i ä + h y v ä k s i k ä y t t ä j ä ä + h y v ä k s i k ä y t t ä m i s e n + h y v ä k s i k ä y t t ö a s t e e n + h y v ä k s i k ä y t t ö a s t e i t a + h y v ä k s i k ä y t t ö j ä r j e s t e l m ä n + h y v ä k s i k ä y t t ö m a h d o l l i s u u k s i e n + h y v ä k s i k ä y t t ö m e n e t e l m i i n + h y v ä k s i k ä y t t ö o l o i s s a + h y v ä k s i k ä y t t ö r i k o k s i a + h y v ä k s i k ä y t t ö s u h t e i s i i n + h y v ä k s i k ä y t t ö t a p a u k s e s s a + h y v ä k s i k ä y t t ö t a p a u s t e n + h y v ä k s i k ä y t t ö t a r k o i t u k s e s s a + h y v ä k s i k ä y t t ö t i l a n t e e t + h y v ä k s i k ä y t t ö t i l a n t e i s i i n + h y v ä k s i k ä y t t ö t i l a n t e i s s a + h y v ä k s i k ä y t t ö ä + h y v ä k s i k ä y t ö l t ä + h y v ä k s i k ä y t ö n + h y v ä k s i k ä y t ö s s ä + h y v ä k s i k ä y t ö s t ä + h y v ä k s y e s s ä + h y v ä k s y e s s ä m m e + h y v ä k s y e s s ä n n e + h y v ä k s y e s s ä ä n + h y v ä k s y i + h y v ä k s y i m m e + h y v ä k s y i s i + h y v ä k s y i s i m m e + h y v ä k s y i s i n + h y v ä k s y i s i v ä t + h y v ä k s y i t t e + h y v ä k s y i v ä t + h y v ä k s y j i e n + h y v ä k s y j ä n + h y v ä k s y j ä t + h y v ä k s y k ä ä + h y v ä k s y k ä ä m m e + h y v ä k s y k ä ä n + h y v ä k s y m i e n + h y v ä k s y m i i n + h y v ä k s y m i s a i k a + h y v ä k s y m i s a i k a a + h y v ä k s y m i s a i k a t a u l u + h y v ä k s y m i s a i k a t a u l u s t a + h y v ä k s y m i s a i k o j e n + h y v ä k s y m i s a j a n j a k s o j a + h y v ä k s y m i s a j a n k o h t a a + h y v ä k s y m i s a s t e + h y v ä k s y m i s a s t e e s e e n + h y v ä k s y m i s e d e l l y t y k s i s t ä + h y v ä k s y m i s e e n + h y v ä k s y m i s e k s i + h y v ä k s y m i s e l l e + h y v ä k s y m i s e l l ä + h y v ä k s y m i s e n + h y v ä k s y m i s e s s ä + h y v ä k s y m i s e s t ä + h y v ä k s y m i s e s t ä m m e + h y v ä k s y m i s h a k e m u s t a + h y v ä k s y m i s j ä r j e s t e l m i ä + h y v ä k s y m i s j ä r j e s t e l m ä n + h y v ä k s y m i s k e l p o i s e m p i + h y v ä k s y m i s k i r j e e t + h y v ä k s y m i s k r i t e e r i e n + h y v ä k s y m i s k r i t e e r i t + h y v ä k s y m i s k ä y t ä n n ö l l ä + h y v ä k s y m i s k ä y t ä n n ö n + h y v ä k s y m i s l e i m a + h y v ä k s y m i s l e i m a a + h y v ä k s y m i s l e i m a n n e + h y v ä k s y m i s m e n e t e l m ä t + h y v ä k s y m i s m e n e t t e l y + h y v ä k s y m i s m e n e t t e l y i h i n + h y v ä k s y m i s m e n e t t e l y i n e e n + h y v ä k s y m i s m e n e t t e l y i s s ä + h y v ä k s y m i s m e n e t t e l y i s t ä + h y v ä k s y m i s m e n e t t e l y j e n + h y v ä k s y m i s m e n e t t e l y j ä + h y v ä k s y m i s m e n e t t e l y k s i + h y v ä k s y m i s m e n e t t e l y n + h y v ä k s y m i s m e n e t t e l y s s ä + h y v ä k s y m i s m e n e t t e l y s t ä + h y v ä k s y m i s m e n e t t e l y t + h y v ä k s y m i s m e n e t t e l y y n + h y v ä k s y m i s m e n e t t e l y ä + h y v ä k s y m i s n u m e r o + h y v ä k s y m i s o i k e u s + h y v ä k s y m i s o n g e l m a n a + h y v ä k s y m i s p e r u s t e i l l a + h y v ä k s y m i s p i s t e e s e e n + h y v ä k s y m i s p r o s e n t t i + h y v ä k s y m i s p r o s e s s e i s t a + h y v ä k s y m i s p r o s e s s i + h y v ä k s y m i s p r o s e s s i a + h y v ä k s y m i s p r o s e s s i e n + h y v ä k s y m i s p r o s e s s i n + h y v ä k s y m i s p r o s e s s i s s a + h y v ä k s y m i s p r o s e s s i s t a + h y v ä k s y m i s p y y n t ö + h y v ä k s y m i s p y y n t ö ä + h y v ä k s y m i s p y y n t ö ö n + h y v ä k s y m i s p ä i v ä n ä + h y v ä k s y m i s p ä ä t ö k s e n + h y v ä k s y m i s p ä ä t ö s t e n + h y v ä k s y m i s s t a n d a r d i t + h y v ä k s y m i s s ä ä n n ö t + h y v ä k s y m i s t ä + h y v ä k s y m i s t ä m m e + h y v ä k s y m i s v a a l i t a p a + h y v ä k s y m i s v a i h e e s e e n + h y v ä k s y m i s v a i h e e s s a + h y v ä k s y m i s v a p a u d e n + h y v ä k s y m i s ä ä n e s t y k s e s t ä + h y v ä k s y m i s ä ä n e s t y s + h y v ä k s y m m e + h y v ä k s y m m e k i n + h y v ä k s y m m e k ö + h y v ä k s y m ä + h y v ä k s y m ä i s i l l ä m m e + h y v ä k s y m ä i s i l l ä n n e + h y v ä k s y m ä l l ä + h y v ä k s y m ä m m e + h y v ä k s y m ä n + h y v ä k s y m ä n n e + h y v ä k s y m ä s s ä + h y v ä k s y m ä s s ä m m e + h y v ä k s y m ä s t ä + h y v ä k s y m ä t + h y v ä k s y m ä t t ä + h y v ä k s y m ä ä + h y v ä k s y m ä ä m m e + h y v ä k s y m ä ä n + h y v ä k s y n + h y v ä k s y n e e + h y v ä k s y n e e t + h y v ä k s y n e m m e + h y v ä k s y n k i n + h y v ä k s y n n ä l l ä + h y v ä k s y n n ä n + h y v ä k s y n n ä t + h y v ä k s y n t ä h a n k k e i s i i n + h y v ä k s y n t ä j ä r j e s t e l m ä n + h y v ä k s y n t ä k u u l u s t e l u n + h y v ä k s y n t ä k u u l u s t e l u u n + h y v ä k s y n t ä k ä y t ä n t ö i h i n + h y v ä k s y n t ä m e n e t e l m i ä + h y v ä k s y n t ä m e n e t t e l y + h y v ä k s y n t ä m e n e t t e l y i h i n + h y v ä k s y n t ä m e n e t t e l y j e n + h y v ä k s y n t ä m e n e t t e l y j ä + h y v ä k s y n t ä m e n e t t e l y k s i + h y v ä k s y n t ä m e n e t t e l y l l e + h y v ä k s y n t ä m e n e t t e l y n + h y v ä k s y n t ä m e n e t t e l y s s ä + h y v ä k s y n t ä m e n e t t e l y s t ä + h y v ä k s y n t ä m e n e t t e l y t + h y v ä k s y n t ä m e n e t t e l y y n + h y v ä k s y n t ä m e n e t t e l y ä + h y v ä k s y n t ä m m e + h y v ä k s y n t ä n i + h y v ä k s y n t ä n n e + h y v ä k s y n t ä n s ä + h y v ä k s y n t ä o i k e u d e n + h y v ä k s y n t ä o i k e u s + h y v ä k s y n t ä o i k e u t t a + h y v ä k s y n t ä p a k k o a + h y v ä k s y n t ä p e r u s t e e t + h y v ä k s y n t ä p r o s e s s i + h y v ä k s y n t ä p r o s e s s i i n + h y v ä k s y n t ä p r o s e s s i t + h y v ä k s y n t ä p y y n n ö s t ä + h y v ä k s y n t ä p ä ä t ö k s e t + h y v ä k s y n t ä s ä ä n n ö s t ö + h y v ä k s y n t ä t o d i s t u s t e n + h y v ä k s y n t ä v a l t a a + h y v ä k s y n t ä v a l t u u d e t + h y v ä k s y n t ä v e l v o i t t e e n + h y v ä k s y n t ä v i r a n o m a i n e n + h y v ä k s y n t ä v i r a n o m a i s e n a + h y v ä k s y n t ä v i r a n o m a i s t e n + h y v ä k s y n t ä ä + h y v ä k s y n t ä ä n s ä + h y v ä k s y n y t + h y v ä k s y t t e + h y v ä k s y t t e k ö + h y v ä k s y t t i i n + h y v ä k s y t t i i n k ö + h y v ä k s y t t y i h i n + h y v ä k s y t t y j e n + h y v ä k s y t t y j ä + h y v ä k s y t t y n ä + h y v ä k s y t t y y n + h y v ä k s y t t y ä + h y v ä k s y t t y ä m m e + h y v ä k s y t t ä e s s ä + h y v ä k s y t t ä i s i + h y v ä k s y t t ä i s i i n + h y v ä k s y t t ä n e e n + h y v ä k s y t t ä v i l t ä + h y v ä k s y t t ä v i m p ä n ä + h y v ä k s y t t ä v i n + h y v ä k s y t t ä v i s s ä + h y v ä k s y t t ä v i ä + h y v ä k s y t t ä v y y d e n + h y v ä k s y t t ä v y y d e s t ä + h y v ä k s y t t ä v y y s k r i t e e r i + h y v ä k s y t t ä v y y s p e r u s t e i d e n + h y v ä k s y t t ä v y y t t ä + h y v ä k s y t t ä v ä k s i + h y v ä k s y t t ä v ä m m i l t ä + h y v ä k s y t t ä v ä m m ä k s i + h y v ä k s y t t ä v ä m m ä l l e + h y v ä k s y t t ä v ä m m ä n + h y v ä k s y t t ä v ä m p i + h y v ä k s y t t ä v ä m p i ä + h y v ä k s y t t ä v ä m p ä n ä + h y v ä k s y t t ä v ä m p ä ä + h y v ä k s y t t ä v ä n + h y v ä k s y t t ä v ä n ä + h y v ä k s y t t ä v ä s s ä + h y v ä k s y t t ä v ä t + h y v ä k s y t t ä v ä ä + h y v ä k s y t t ä v ä ä n + h y v ä k s y t y i k s i + h y v ä k s y t y i l l e + h y v ä k s y t y i l l ä + h y v ä k s y t y k s i + h y v ä k s y t y l l e + h y v ä k s y t y m m ä l l e + h y v ä k s y t y m p i + h y v ä k s y t y n + h y v ä k s y t y s s ä + h y v ä k s y t y s t ä + h y v ä k s y t y t + h y v ä k s y t ä ä n + h y v ä k s y t ä ä n k ö + h y v ä k s y v i ä + h y v ä k s y v ä m m e + h y v ä k s y v ä n + h y v ä k s y v ä n i + h y v ä k s y v ä n s ä + h y v ä k s y v ä t + h y v ä k s y v ä t k ö + h y v ä k s y v ä ä + h y v ä k s y y + h y v ä k s y y k i n + h y v ä k s y y k ö + h y v ä k s y ä + h y v ä k s y ä k s e e n + h y v ä k s y ä k s e m m e + h y v ä k u n t o i s e t + h y v ä k u n t o i s i a + h y v ä k u n t o i s i i n + h y v ä k u n t o i s i k s i + h y v ä k u n t o i s i n a + h y v ä l a a t u i n e n + h y v ä l a a t u i s e e n + h y v ä l a a t u i s e l l a + h y v ä l a a t u i s e n + h y v ä l a a t u i s e s t a + h y v ä l a a t u i s i a + h y v ä l a a t u i s i i n + h y v ä l a a t u i s i s s a + h y v ä l a a t u i s t a + h y v ä l l e + h y v ä l l ä + h y v ä l l ä k ä ä n + h y v ä l t ä + h y v ä m a i n e i n e n + h y v ä m a i n e i s e l l a + h y v ä n + h y v ä n l a a t u i n e n + h y v ä n l a a t u i s i a + h y v ä n l a a t u i s i k s i + h y v ä n l a a t u i s t a + h y v ä n l a a t u i s t e n + h y v ä n m a k u i s t a + h y v ä n o l o n t u n n e t t a + h y v ä n o l o n t u n t e e s s a + h y v ä n t a h d o n i l m a i s u t + h y v ä n t a h t o i n e n + h y v ä n t a h t o i s e l l a + h y v ä n t a h t o i s e m m a t + h y v ä n t a h t o i s e n + h y v ä n t a h t o i s e s t i + h y v ä n t a h t o i s e t + h y v ä n t a h t o i s i a + h y v ä n t a h t o i s i m m i n + h y v ä n t a h t o i s t a + h y v ä n t a h t o i s u u d e n + h y v ä n t a h t o i s u u d e s t a + h y v ä n t a h t o i s u u s + h y v ä n t a h t o i s u u t e n s a + h y v ä n t a h t o i s u u t t a + h y v ä n t a h t o i s u u t t a n n e + h y v ä n t e k e v ä i s y y d e n + h y v ä n t e k e v ä i s y y d e s t ä + h y v ä n t e k e v ä i s y y s a p u t o i m e n p i t e e t + h y v ä n t e k e v ä i s y y s j ä r j e s t ö + h y v ä n t e k e v ä i s y y s j ä r j e s t ö i h i n + h y v ä n t e k e v ä i s y y s j ä r j e s t ö i l l e + h y v ä n t e k e v ä i s y y s j ä r j e s t ö i l l ä + h y v ä n t e k e v ä i s y y s j ä r j e s t ö i s t ä + h y v ä n t e k e v ä i s y y s j ä r j e s t ö j e n + h y v ä n t e k e v ä i s y y s j ä r j e s t ö j ä + h y v ä n t e k e v ä i s y y s j ä r j e s t ö t + h y v ä n t e k e v ä i s y y s k a u p p o j e n + h y v ä n t e k e v ä i s y y s k e s k u s t e n + h y v ä n t e k e v ä i s y y s l a h j o i t u k s i l l e + h y v ä n t e k e v ä i s y y s p o l i t i i k k a a + h y v ä n t e k e v ä i s y y s t a r k o i t u k s i a + h y v ä n t e k e v ä i s y y s t o i m i + h y v ä n t e k e v ä i s y y s t o i m i k s i + h y v ä n t e k e v ä i s y y s t o i m i n n a n + h y v ä n t e k e v ä i s y y s t o i m i n t a a + h y v ä n t e k e v ä i s y y s t y ö s s ä + h y v ä n t e k e v ä i s y y s t y ö t ä + h y v ä n t e k e v ä i s y y s y h d i s t y k s i l l e + h y v ä n t e k e v ä i s y y t e e n + h y v ä n t e k e v ä i s y y t e n ä + h y v ä n t o i v o n n i e m e l l ä + h y v ä n t o i v o n n i e m i + h y v ä n t u u l i s e n a + h y v ä n t u u l i s e s t i + h y v ä n t u u l i s u u d e s t a + h y v ä n t u u l i s u u d e s t a n n e + h y v ä n ä + h y v ä o n n i s e m p i + h y v ä o s a i s i m m a s t a + h y v ä o s a i s i m p i a + h y v ä p a l k k a i s e e n + h y v ä p a l k k a i s e s t a + h y v ä p a l k k a i s e t + h y v ä p a l k k a i s i a + h y v ä p a l k k a i s i i n + h y v ä p a l k k a i s t a + h y v ä p a l k k a i s t e n + h y v ä s s ä + h y v ä s t e l y j e n + h y v ä s t i t + h y v ä s t ä + h y v ä t + h y v ä t a h t o i s t e n + h y v ä t a s o i n e n + h y v ä t a s o i s e n + h y v ä t k i n + h y v ä t k ä ä n + h y v ä u s k o i n e n + h y v ä u s k o i s e n a + h y v ä u s k o i s e s t i + h y v ä u s k o i s e t + h y v ä u s k o i s i a + h y v ä u s k o i s i m m a t k i n + h y v ä u s k o i s i n a + h y v ä u s k o i s u u t t a + h y v ä ä + h y v ä ä k i n + h y v ä ä n + h y y t e l ö i m i s a i n e + h y y t e l ö m a k e i s i s s a + h y y t e l ö p i k a r i m a k e i s e t + h y y t e l ö p i k a r i m a k e i s i s s a + h y y t e l ö r a k k o + h y y t e l ö ä + h y y t y m i s t e k i j ä ä + h y y t y m ä ä n + h y y t ä v ä m p i + h y y t ä v ä ä + h y ö d y i s t ä + h y ö d y k e a s i a t + h y ö d y k e f u t u u r e j a + h y ö d y k e h i n n o i s s a + h y ö d y k e h i n t o j e n + h y ö d y k e j o h d a n n a i s i a + h y ö d y k e j o h d a n n a i s i i n + h y ö d y k e j o h d a n n a i s i n s t r u m e n t t e j a + h y ö d y k e j o h d a n n a i s t e n + h y ö d y k e k a u p a n + h y ö d y k e k a u p a s s a + h y ö d y k e k a u p p a a n + h y ö d y k e m a r k k i n a t + h y ö d y k e m a r k k i n o i d e n + h y ö d y k e m a r k k i n o i h i n + h y ö d y k e m a r k k i n o i l l a + h y ö d y k e m a r k k i n o i l l e + h y ö d y k e m a r k k i n o i s t a + h y ö d y k e m a r k k i n o i t a + h y ö d y k e n e u v o s t o i s t a + h y ö d y k e p ö r s s i n + h y ö d y k e r a h a s t o i h i n + h y ö d y k e r i i p p u v a i s u u d e s t a + h y ö d y k e y r i t y s t e n + h y ö d y k k e e n ä + h y ö d y k k e i d e n + h y ö d y k k e i s t ä + h y ö d y k k e i t ä + h y ö d y k s e e n + h y ö d y k s i + h y ö d y l l i s e k s i + h y ö d y l l i s e l l e + h y ö d y l l i s e m m i k s i + h y ö d y l l i s e m m i l t ä + h y ö d y l l i s e m m i n + h y ö d y l l i s e m m ä k s i + h y ö d y l l i s e m m ä l l ä + h y ö d y l l i s e m m ä l t ä + h y ö d y l l i s e m m ä n + h y ö d y l l i s e m p i + h y ö d y l l i s e m p i ä + h y ö d y l l i s e m p ä n ä + h y ö d y l l i s e m p ä ä + h y ö d y l l i s e m p ä ä k i n + h y ö d y l l i s e n + h y ö d y l l i s e n ä + h y ö d y l l i s e s t ä + h y ö d y l l i s e t + h y ö d y l l i s i i n + h y ö d y l l i s i k s i + h y ö d y l l i s i m m i s t ä + h y ö d y l l i s i m m ä n + h y ö d y l l i s i m m ä t + h y ö d y l l i s i m p i e n + h y ö d y l l i s i m p i ä + h y ö d y l l i s i n + h y ö d y l l i s i n ä + h y ö d y l l i s i s t ä + h y ö d y l l i s i ä + h y ö d y l l i s t e n + h y ö d y l l i s t ä + h y ö d y l l i s y y d e s t ä + h y ö d y l l i s y y s m a l l e j a + h y ö d y l l i s y y s m a l l i + h y ö d y l l i s y y s m a l l i a + h y ö d y l l i s y y s m a l l i i n + h y ö d y l l i s y y s m a l l i l t a + h y ö d y l l i s y y s m a l l i n + h y ö d y l l i s y y s m a l l i s u o j a + h y ö d y l l i s y y s m a l l i s u o j a a + h y ö d y l l i s y y s m a l l i s u o j a h a k e m u k s e n + h y ö d y l l i s y y s m a l l i s u o j a n + h y ö d y l l i s y y s m a l l i t + h y ö d y l l i s y y s v a a t i m u k s e n + h y ö d y l l i s y y t e n s ä + h y ö d y m m e + h y ö d y n + h y ö d y n n e t t y ä + h y ö d y n n e t t ä v i s s ä + h y ö d y n n e t ä + h y ö d y n n e t ä ä n + h y ö d y n n ä m m e + h y ö d y n n ä n + h y ö d y n t a v o i t t e l i j o i d e n + h y ö d y n t ä e s s ä m m e + h y ö d y n t ä k ä ä + h y ö d y n t ä k ä ä m m e + h y ö d y n t ä m i s a s t e t t a + h y ö d y n t ä m i s e e n + h y ö d y n t ä m i s e k s i + h y ö d y n t ä m i s e l l e + h y ö d y n t ä m i s e n + h y ö d y n t ä m i s e s s ä + h y ö d y n t ä m i s j ä r j e s t e l m i ä + h y ö d y n t ä m i s k e l p o i s t e n + h y ö d y n t ä m i s k y k y + h y ö d y n t ä m i s k y s y m y s + h y ö d y n t ä m i s l a i t o s t e n + h y ö d y n t ä m i s m a h d o l l i s u u d e t + h y ö d y n t ä m i s m a h d o l l i s u u k s i a + h y ö d y n t ä m i s m a h d o l l i s u u k s i e n k i n + h y ö d y n t ä m i s m a l l i e n + h y ö d y n t ä m i s m e n e t e l m i ä + h y ö d y n t ä m i s m e n e t e l m ä n ä + h y ö d y n t ä m i s m u o t o j a + h y ö d y n t ä m i s m ä ä r i ä + h y ö d y n t ä m i s p o t e n t i a a l i n s a + h y ö d y n t ä m i s p r o s e s s i k s i + h y ö d y n t ä m i s s ä ä n t ö + h y ö d y n t ä m i s s ä ä n t ö ä + h y ö d y n t ä m i s t a v o i t t e e t + h y ö d y n t ä m i s t o i m e t + h y ö d y n t ä m i s t o i m i a + h y ö d y n t ä m i s t ä + h y ö d y n t ä m ä l l ä + h y ö d y n t ä m ä s t ä + h y ö d y n t ä m ä t t ä + h y ö d y n t ä m ä t t ö m i i n + h y ö d y n t ä m ä t t ö m ä t + h y ö d y n t ä m ä t ö n t ä + h y ö d y n t ä m ä ä n + h y ö d y n t ä n e e t + h y ö d y n t ä v ä n + h y ö d y n t ä v ä t + h y ö d y n t ä ä + h y ö d y n t ä ä k s e e n + h y ö d y n t ä ä k s e m m e + h y ö d y s t ä + h y ö d y t + h y ö d y t t ä i s i + h y ö d y t t ä i s i v ä t + h y ö d y t t ä m ä ä n + h y ö d y t t ä n e e t + h y ö d y t t ä n y t + h y ö d y t t ä v i e n + h y ö d y t t ä v i i n + h y ö d y t t ä v i s t ä + h y ö d y t t ä v i ä + h y ö d y t t ä v ä l l e + h y ö d y t t ä v ä l l ä + h y ö d y t t ä v ä n + h y ö d y t t ä v ä t + h y ö d y t t ä v ä ä + h y ö d y t t ä v ä ä n + h y ö d y t t ä ä + h y ö d y t t ä ä k i n + h y ö d y t t ä ä k ö + h y ö d y t t ö m i i n + h y ö d y t t ö m i k s i + h y ö d y t t ö m i ä + h y ö d y t t ö m y y d e s t ä + h y ö d y t t ö m ä m p i + h y ö d y t t ö m ä m p i ä + h y ö d y t ö n t ä + h y ö k k ä s i + h y ö k k ä s i v ä t + h y ö k k ä y k s e e n + h y ö k k ä y k s e n + h y ö k k ä y k s e n s ä + h y ö k k ä y k s e s t ä + h y ö k k ä y k s e t + h y ö k k ä y k s i i n + h y ö k k ä y k s i l l e + h y ö k k ä y k s i l l ä + h y ö k k ä y k s i l t ä + h y ö k k ä y k s i n ä + h y ö k k ä y k s i s t ä + h y ö k k ä y k s i ä + h y ö k k ä y k s i ä ä n + h y ö k k ä y s a a l t o + h y ö k k ä y s a r m e i j a n + h y ö k k ä y s a s e + h y ö k k ä y s a s e e l l e + h y ö k k ä y s a s e i t a + h y ö k k ä y s h e l i k o p t e r e i h i n + h y ö k k ä y s j o u k o t + h y ö k k ä y s j ä r j e s t e l m ä + h y ö k k ä y s k a p a s i t e e t i n + h y ö k k ä y s k e i n o i l l a + h y ö k k ä y s k y k y ä + h y ö k k ä y s l i i t o k s i + h y ö k k ä y s l i i t t o + h y ö k k ä y s l u o n t e i s i i n + h y ö k k ä y s o p e r a a t i o i d e n + h y ö k k ä y s p o l i t i i k k a + h y ö k k ä y s p o l i t i i k k a a + h y ö k k ä y s r i k o k s i a + h y ö k k ä y s r i k o k s i i n + h y ö k k ä y s r i k o s + h y ö k k ä y s r i k o s t e n + h y ö k k ä y s s o d a n + h y ö k k ä y s s o d a s s a + h y ö k k ä y s s o d a s t a + h y ö k k ä y s s o t a + h y ö k k ä y s s o t a a + h y ö k k ä y s s o t i e n + h y ö k k ä y s s t r a t e g i a s t a + h y ö k k ä y s s u u n n i t e l m i e n + h y ö k k ä y s t a p a u k s e s s a + h y ö k k ä y s t a r k o i t u k s e s s a + h y ö k k ä y s t a r k o i t u k s i s s a + h y ö k k ä y s t e k n o l o g i a a + h y ö k k ä y s t e n + h y ö k k ä y s t o i m e n p i d e + h y ö k k ä y s t o i m i + h y ö k k ä y s t o i m i a + h y ö k k ä y s t ä + h y ö k k ä y s u h k a + h y ö k k ä y s v a l m i u t e e n + h y ö k k ä y s y r i t y k s e s t ä + h y ö k k ä y s y r i t y s + h y ö k k ä ä j i k s i + h y ö k k ä ä j i ä m m e + h y ö k k ä ä m i s s u u n n i t e l m a s t a + h y ö k k ä ä m ä t t ä + h y ö k k ä ä m ä t t ö m y y s s o p i m u k s e e n + h y ö k k ä ä m ä t t ö m y y s s o p i m u k s e n + h y ö k k ä ä v i m m ä l l e + h y ö k k ä ä v ä m m ä n + h y ö k k ä ä v ä m p i + h y ö k k ä ä v ä m p i ä + h y ö k k ä ä v ä m p ä ä + h y ö k k ä ä v ä ä + h y ö k y a a l l o n + h y ö k y a a l t o + h y ö k y a a l t o a + h y ö k y a a l t o h a n k k e i s i i n + h y ö k y a a l t o j a + h y ö k y a a l t o j e n + h y ö k y a a l t o k a t a s t r o f i + h y ö k y a a l t o k a t a s t r o f i n + h y ö k y a a l t o k a t a s t r o f i s t a + h y ö k y a a l t o k o e t t e l e m u s + h y ö k y a a l t o t r a g e d i a + h y ö k y a a l t o t r a g e d i a n + h y ö k y t u l v a + h y ö k y t u l v i e n + h y ö k y y + h y ö k ä t e s s ä ä n + h y ö k ä t t i i n + h y ö k ä t t y + h y ö k ä t t y ä + h y ö k ä t ä + h y ö k ä t ä k s e e n + h y ö k ä t ä ä n + h y ö n t e i s h u u h k a j a + h y ö n t e i s v e r k k o + h y ö n t e i s v e r k k o j a + h y ö t y a j o n e u v o a + h y ö t y a j o n e u v o i h i n + h y ö t y a j o n e u v o i l l a + h y ö t y a j o n e u v o i s t a + h y ö t y a j o n e u v o j a + h y ö t y a j o n e u v o j e n + h y ö t y a j o n e u v o l i i k e n t e e n + h y ö t y a j o n e u v o m a r k k i n a t + h y ö t y a j o n e u v o m a r k k i n o i d e n + h y ö t y a j o n e u v o n + h y ö t y a j o n e u v o t + h y ö t y a n a l y y s e i s t ä + h y ö t y a n a l y y s e j ä + h y ö t y a n a l y y s i + h y ö t y a n a l y y s i e n + h y ö t y a n a l y y s i i n + h y ö t y a n a l y y s i l l ä + h y ö t y a n a l y y s i n + h y ö t y a n a l y y s i t + h y ö t y a n a l y y s i ä + h y ö t y a r v i o + h y ö t y e l ä i m i l l e + h y ö t y e l ä i m i s s ä + h y ö t y e l ä i n t e n + h y ö t y e n e r g i a a + h y ö t y f i l o s o f i a a n + h y ö t y i h i n + h y ö t y i s i + h y ö t y i s i m m e + h y ö t y i s i v ä t + h y ö t y i v ä t + h y ö t y j e n + h y ö t y j i i n + h y ö t y k a s v i k u i v u r i + h y ö t y k a s v i t + h y ö t y k r i t e e r i e n + h y ö t y k u s t a n n u s a n a l y y s i + h y ö t y k u s t a n n u s a n a l y y s i n + h y ö t y k ä y t t ö ä + h y ö t y k ä y t t ö ö n + h y ö t y k ä ä m m e + h y ö t y l a s k e l m a n + h y ö t y m i n e n + h y ö t y m i s e n ä + h y ö t y m i s t a r k o i t u k s e s s a + h y ö t y m o t i i v i i n + h y ö t y m ä s t ä + h y ö t y m ä ä n + h y ö t y n e e t + h y ö t y n ä k ö k o h t a a + h y ö t y n ä k ö k o h t i a + h y ö t y p e l i + h y ö t y p e r i a a t e t t a + h y ö t y s e l v i t y k s i ä + h y ö t y s u h d e + h y ö t y s u h d e t t a + h y ö t y s u h t e e n + h y ö t y s u h t e e s t a + h y ö t y t u o t a n t o o n + h y ö t y t u t k i m u k s i a + h y ö t y t u t k i m u k s i i n + h y ö t y v a i k u t u k s e t + h y ö t y v a i k u t u k s i s t a + h y ö t y v a i k u t u s + h y ö t y v e d e k s i + h y ö t y v e r o + h y ö t y v i e n + h y ö t y v i i n + h y ö t y v ä t + h y ö t y y + h y ö t y y n + h y ö t y ä + h y ö t y ä k s e e n + h y ö t ö r e a k t o r i + h ä d ä n + h ä d ä n a l a i s i a + h ä d ä n a l a i s i m m i l l e + h ä d ä n a l a i s i m p i a + h ä d ä n a l a i s t a + h ä d ä s s ä + h ä d ä s t ä + h ä i k ä i l e m ä t t ö m i e n + h ä i k ä i l e m ä t t ö m i m m ä t + h ä i k ä i l e m ä t t ö m i ä + h ä i k ä i l e m ä t t ö m ä m m i n + h ä i k ä i l e m ä t t ö m ä m p i ä + h ä i k ä i l e m ä t t ö m ä t + h ä i k ä i l e m ä t ö n t ä + h ä i k ä i s e v i n t ä + h ä i k ä i s e v i ä + h ä i l y n e i s t ä + h ä i l y v ä s t ä + h ä i r i i n t y m ä t t ä + h ä i r i k k ö v a l t i o + h ä i r i k k ö v a l t i o t + h ä i r i k ö i n t i ä + h ä i r i n n ä n + h ä i r i n n ä s t ä + h ä i r i n t ä a s e e n a + h ä i r i n t ä k i e l t o a l u e e l l e + h ä i r i n t ä s o i t o t + h ä i r i n t ä s o i t t o j a + h ä i r i n t ä t a p a u k s i s s a + h ä i r i n t ä ä + h ä i r i n t ä ä n + h ä i r i t s e e + h ä i r i t s e m ä t t ä + h ä i r i t s e t t e k ö + h ä i r i t s e v i e n + h ä i r i t s e v i ä + h ä i r i t s e v ä ä + h ä i r i t s i v ä t + h ä i r i t t i i n + h ä i r i t ä + h ä i r i ö a l t t i u s + h ä i r i ö i d e n + h ä i r i ö i h i n + h ä i r i ö i l l e + h ä i r i ö i l t ä + h ä i r i ö i s t ä + h ä i r i ö i t t ä + h ä i r i ö i t ä + h ä i r i ö k s i + h ä i r i ö s t ä + h ä i r i ö t + h ä i r i ö t a p a u k s i s s a + h ä i r i ö t e k i j ä + h ä i r i ö t e k i j ö i t ä + h ä i r i ö t i l a n t e e t + h ä i r i ö t t ä + h ä i v e l e n t o k o n e + h ä i v e m u s t e s i e n i + h ä i v e p e r h o n e n + h ä i v e t e k n o l o g i a + h ä i v y t y s t e m p p u j a + h ä i v ä n i r k k o + h ä i v ä ä k ä ä n + h ä j y t + h ä k e i l l ä + h ä k e i s s ä + h ä k e i s t ä + h ä k e l l y t t ä v i n t ä + h ä k e l l y t t ä v ä m p ä ä + h ä k i n + h ä k i s s ä + h ä k k i e n + h ä k k i j ä r j e s t e l m i s t ä + h ä k k i j ä r j e s t e l m ä + h ä k k i k a n a l a + h ä k k i k a n a l a a n + h ä k k i k a n a l a j ä r j e s t e l m ä n + h ä k k i k a n a l a j ä r j e s t e l m ä s t ä + h ä k k i k a n a l a k a s v a t u s t a + h ä k k i k a n a l a k i e l t o a + h ä k k i k a n a l a t + h ä k k i k a n a l o i d e n + h ä k k i k a n a l o i s s a + h ä k k i k a n a l o i s t a + h ä k k i k a n a l o i t a + h ä k k i k a n a n m u n i l l a + h ä k k i k a n a t + h ä k k i k a n o i s t a + h ä k k i k a s v a t u k s e s t a + h ä k k i k a s v a t u s + h ä k k i k i e l t o + h ä k k i k o k e e t + h ä k k i l i n t u + h ä k k i r o t t i e n + h ä k k i s ä n g y t + h ä k k i s ä n k y j e n + h ä k k i s ä n k y j ä + h ä k k i s ä n k y k y s y m y s t ä + h ä k k i s ä n k y o n g e l m a n + h ä k ä m y r k y t y s + h ä k ä p i t o i s u u d e n + h ä k ä p i t o i s u u k s i a + h ä k ä p ä ä s t ö i s s ä + h ä l i n ä ä + h ä l v e n n e t y k s i + h ä l v e n n y t t y ä + h ä l v e n t ä m i s e e n + h ä l v e n t ä m i s e k s i + h ä l v e n t ä ä k s e m m e + h ä l y t t ä v i m m i s t ä + h ä l y t t ä v i m m ä t + h ä l y t t ä v i m p i e n + h ä l y t t ä v i n + h ä l y t t ä v i n t ä + h ä l y t t ä v i ä + h ä l y t t ä v ä l l e + h ä l y t t ä v ä l l ä + h ä l y t t ä v ä l t ä + h ä l y t t ä v ä m m i k s i + h ä l y t t ä v ä m m ä k s i + h ä l y t t ä v ä m p i + h ä l y t t ä v ä m p ä ä + h ä l y t t ä v ä n + h ä l y t t ä v ä t + h ä l y t t ä v ä ä + h ä l y t y s a j o n e u v o t + h ä l y t y s h a r j o i t u k s i a + h ä l y t y s h u u t o + h ä l y t y s j ä r j e s t e l m i e n + h ä l y t y s j ä r j e s t e l m i s t ä + h ä l y t y s j ä r j e s t e l m i ä + h ä l y t y s j ä r j e s t e l m ä + h ä l y t y s j ä r j e s t e l m ä n + h ä l y t y s j ä r j e s t e l m ä s s ä + h ä l y t y s j ä r j e s t e l m ä s t ä + h ä l y t y s j ä r j e s t e l m ä t + h ä l y t y s j ä r j e s t e l m ä ä + h ä l y t y s j ä r j e s t e l m ä ä n + h ä l y t y s k e l l o + h ä l y t y s k e l l o a + h ä l y t y s k e l l o j a + h ä l y t y s k e l l o j e n + h ä l y t y s k e l l o l t a + h ä l y t y s k e l l o n + h ä l y t y s k e l l o n a + h ä l y t y s k e l l o t + h ä l y t y s k e s k u k s e e n + h ä l y t y s k e s k u k s e n a + h ä l y t y s k e s k u k s e t + h ä l y t y s k e s k u k s i a + h ä l y t y s k e s k u s + h ä l y t y s k e s k u s t e n + h ä l y t y s k y n n y k s e n + h ä l y t y s l a i t t e i s i i n + h ä l y t y s m e r k i k s i + h ä l y t y s m e r k i n + h ä l y t y s m e r k i s t ä + h ä l y t y s m e r k k i + h ä l y t y s m e r k k i n ä + h ä l y t y s n u m e r o + h ä l y t y s n u m e r o o n + h ä l y t y s n u m e r o s t a + h ä l y t y s p a l v e l u i s s a + h ä l y t y s p a l v e l u i t a + h ä l y t y s p a l v e l u j a + h ä l y t y s t a s o + h ä l y t y s t a s o i n a + h ä l y t y s t a s o j e n + h ä l y t y s t a s o n + h ä l y t y s t i l a + h ä l y t y s t i l a n + h ä l y t y s t o i m e n p i t e i d e n + h ä l y t y s v a l m i u d e n + h ä l y t y s v i e s t i s t ä + h ä l y t y s y k s i k ö n + h ä l y y n + h ä m i l l ä n i + h ä m i l l ä ä n + h ä m m e n n y k s e s t ä + h ä m m e n n y s t ä + h ä m m e n t y n e i t ä + h ä m m e n t y v ä t + h ä m m e n t ä v i m p i ä + h ä m m e n t ä v i n t ä + h ä m m e n t ä v i n ä + h ä m m e n t ä v i ä + h ä m m e n t ä v ä m p ä ä + h ä m m e n t ä v ä t + h ä m m e n t ä v ä ä + h ä m m e n t ä ä + h ä m m ä s t y k s e k s e m m e + h ä m m ä s t y k s e k s i + h ä m m ä s t y k s e n + h ä m m ä s t y k s e n i + h ä m m ä s t y k s e s t ä + h ä m m ä s t y n e e m p i ä + h ä m m ä s t y n e i t ä + h ä m m ä s t y t t i + h ä m m ä s t y t t ä v i m m i s t ä + h ä m m ä s t y t t ä v i n t ä + h ä m m ä s t y t t ä v i ä + h ä m m ä s t y t t ä v ä m p i + h ä m m ä s t y t t ä v ä m p ä ä + h ä m m ä s t y t t ä v ä n + h ä m m ä s t y t t ä v ä ä + h ä m m ä s t y t t ä ä + h ä m m ä s t y y + h ä m m ä s t y ä + h ä m y k o l i b r i + h ä m y p e n s a s y ö k k ö n e n + h ä m y r a i t a t o k k o + h ä m y v ä l s k ä r i + h ä m ä h ä k e i s t ä + h ä m ä h ä k i n v e r k k o + h ä m ä h ä k k i j u m a l a + h ä m ä h ä k k i k u k k a + h ä m ä h ä k k i m i e h e n + h ä m ä h ä k k i m i e s + h ä m ä h ä k k i n a i n e n + h ä m ä h ä k k i r a p u + h ä m ä r i e n + h ä m ä r i s t ä + h ä m ä r t y m i s e e n + h ä m ä r t y m ä s s ä + h ä m ä r t y v ä t + h ä m ä r t y y + h ä m ä r t ä ä k s e e n + h ä m ä r ä m i e h i l l e + h ä m ä r ä m p i i n + h ä m ä r ä m p i ä + h ä m ä r ä p e r ä i s t e n + h ä m ä r ä s s ä + h ä m ä r ä t + h ä m ä r ä ä n + h ä m ä t ä + h ä m ä y k s e s t ä + h ä m ä y s t ä + h ä m ä ä m i s e k s i + h ä n e l l e + h ä n e l l ä + h ä n e n + h ä n e s t ä + h ä n e t + h ä n k i n + h ä n k ä ä n + h ä n t i e n + h ä n t ä p ä ä s s ä + h ä n t ä r e k u r s i o + h ä n t ä t u m a k e + h ä p e i l e m ä t t ä + h ä p e i l e m ä t t ö m i m m i l l ä + h ä p e i s s ä m m e + h ä p e i s s ä ä n + h ä p e ä d i r e k t i i v i ä + h ä p e ä k s i + h ä p e ä l i s t a n + h ä p e ä l l i s e m p ä ä + h ä p e ä l l i s e n + h ä p e ä l l i s i m m i s t ä + h ä p e ä l l i s i m m ä n + h ä p e ä l l i s i m p i ä + h ä p e ä l l i s i n t ä + h ä p e ä l l i s i s t ä + h ä p e ä l l i s i ä + h ä p e ä l l i s t e n + h ä p e ä l l i s t ä + h ä p e ä l t ä + h ä p e ä m m e + h ä p e ä m u r h i k s i + h ä p e ä m u u r i + h ä p e ä m u u r i a + h ä p e ä m u u r i t + h ä p e ä m ä t ö n t ä + h ä p e ä m ä ä n + h ä p e ä n + h ä p e ä p a a l u u n + h ä p e ä r a n g a i s t u s + h ä p e ä t a h r a + h ä p e ä t a h r a a + h ä p e ä t i l a s t o + h ä p e ä v ä n s ä + h ä p e ä ä + h ä p e ä ä n + h ä p y k a r v o i t u s + h ä p y r a k o + h ä p ä i s e e + h ä p ä i s e m i s e e n + h ä p ä i s i + h ä r k ä j u o k s u + h ä r k ä l e p i n k ä i n e n + h ä r k ä l i n t u + h ä r k ä p a p u + h ä r k ä p a v u t + h ä r k ä p ä ä + h ä r k ä r o d e o + h ä r k ä s a m m a k k o + h ä r k ä s i m p p u + h ä r k ä t a i s t e l u a + h ä r k ä t a i s t e l u e s i t y s t e n + h ä r k ä t a i s t e l u i h i n + h ä r k ä t a i s t e l u j a + h ä r k ä t a i s t e l u j e n + h ä r k ä t a i s t e l u p e r i n t e e n + h ä r k ä t a i s t e l u s s a + h ä r k ä t a i s t e l u t + h ä r k ä t a p p e l u i h i n + h ä r k ä ä + h ä r m e s a l v i a + h ä r m ä m a l i k k a + h ä r s k i i n t y m i n e n + h ä r ä n k i e l i + h ä r ä n s i l m ä + h ä r ä n t a t t i + h ä r ä t + h ä t i k ö i d e n + h ä t i k ö i d y s t ä + h ä t i k ö i d ä + h ä t i k ö i m ä t t ä + h ä t i k ö i t y j e n + h ä t i k ö i t y j ä + h ä t i k ö i t y n ä + h ä t i k ö i t y ä + h ä t i s t ä ä + h ä t k ä h d y t t ä v i ä + h ä t k ä h d y t t ä v ä m p ä ä + h ä t k ä h d y t t ä v ä n + h ä t k ä h d y t t ä v ä t + h ä t k ä h d y t t ä v ä ä + h ä t y y t t ä ä k s e e n + h ä t ä a l o i t e + h ä t ä a p u + h ä t ä a p u a + h ä t ä a p u a m m e + h ä t ä a p u h a n k e t t a + h ä t ä a p u j ä r j e s t e l m i e n + h ä t ä a p u j ä r j e s t e l m ä t + h ä t ä a p u j ä r j e s t e l m ä ä n + h ä t ä a p u j ä r j e s t e l y n + h ä t ä a p u k e i n o j a + h ä t ä a p u k e s k u s + h ä t ä a p u m a n d a a t t i + h ä t ä a p u n a + h ä t ä a p u o h j e l m a + h ä t ä a p u o h j e l m a a + h ä t ä a p u o h j e l m i a + h ä t ä a p u o p e r a a t i o i t a + h ä t ä a p u p a k e t i n + h ä t ä a p u p a k e t i s t a + h ä t ä a p u p a k e t t e j a + h ä t ä a p u p a k e t t i + h ä t ä a p u p y y n t ö ä + h ä t ä a p u p ä ä t ö k s e n + h ä t ä a p u r a h a s t o + h ä t ä a p u r a h a s t o a + h ä t ä a p u r a h a s t o n a + h ä t ä a p u r a h a s t o o n + h ä t ä a p u r a h o i t u k s e s t a + h ä t ä a p u r y h m ä t + h ä t ä a p u s u u n n i t e l m a n + h ä t ä a p u s u u n n i t e l m i i n + h ä t ä a p u t a r v i k k e i t a + h ä t ä a p u t i i m i t + h ä t ä a p u t o i m e n p i t e e n ä + h ä t ä a p u t o i m e n p i t e e t + h ä t ä a p u t o i m e n p i t e i d e n + h ä t ä a p u t o i m e n p i t e i t ä + h ä t ä a p u t o i m i a + h ä t ä a p u t o i m i e n + h ä t ä a p u t o i m i i n + h ä t ä a p u t o i m i n t a a n + h ä t ä a p u t o i m i s s a + h ä t ä a p u t y ö h ö n + h ä t ä a p u t y ö n t e k i j ä t + h ä t ä a p u u n + h ä t ä a p u v a i h e e n + h ä t ä a p u v a i h e e s t a + h ä t ä a p u v a i h e t t a + h ä t ä a p u v a r a n n o s t a + h ä t ä a p u v a r a u k s e e n + h ä t ä a p u v a r a u k s e n + h ä t ä a p u v a r a u k s e s t a + h ä t ä a p u v a r a u k s i a + h ä t ä a p u v a r a u k s i s t a + h ä t ä a p u v a r a u s + h ä t ä a p u v a r a u s t a + h ä t ä a p u v a r o j a + h ä t ä a p u v a r o j e n + h ä t ä a p u v e l v o l l i s u u s + h ä t ä a p u v i r a n o m a i s t e n + h ä t ä a p u v ä l i n e + h ä t ä a p u v ä l i n e e k s i + h ä t ä a p u y k s i k ö i s s ä ä n + h ä t ä a s e t u k s e l l a + h ä t ä a s e t u k s e n + h ä t ä a v u k s i + h ä t ä a v u l l e + h ä t ä a v u n + h ä t ä a v u s s a + h ä t ä a v u s t a + h ä t ä a v u s t u k s i a + h ä t ä e h d o t u s + h ä t ä e h k ä i s y n + h ä t ä e h k ä i s y y n + h ä t ä e h k ä i s y ä + h ä t ä e v a k u o i n t i + h ä t ä e v a k u o i n t i a + h ä t ä h a n k e t t a + h ä t ä h i n a u k s e n + h ä t ä h u i p p u k o k o u k s e n + h ä t ä h u u d o n + h ä t ä h u u t o + h ä t ä h u u t o i h i n + h ä t ä i l k ö + h ä t ä i l l ä + h ä t ä i l m o i t u s n a p p u l o i t a + h ä t ä i s e e n + h ä t ä i s e l t ä + h ä t ä i s i ä + h ä t ä i s t u n t o + h ä t ä i s t ä + h ä t ä j a r r u + h ä t ä j a r r u a + h ä t ä j a r r u i s t a + h ä t ä j a r r u j ä r j e s t e l m ä t + h ä t ä j a r r u n + h ä t ä j a r r u n a + h ä t ä j a r r u s t a + h ä t ä j a r r u t + h ä t ä j a r r u t e h o s t i n j ä r j e s t e l m ä + h ä t ä j a r r u t e h o s t i n j ä r j e s t e l m ä n + h ä t ä j a r r u t u s j ä r j e s t e l m i e n + h ä t ä j a r r u t u s j ä r j e s t e l m i ä + h ä t ä j ä r j e s t e l m ä t + h ä t ä k a s t e + h ä t ä k e i n o n + h ä t ä k e l l o j a + h ä t ä k e s k u k s e t + h ä t ä k e s k u s + h ä t ä k e s k u s t e l u j a + h ä t ä k e s k u s t e l u s s a + h ä t ä k i r u r g i a n + h ä t ä k o k o u k s e e n + h ä t ä k o k o u k s e n + h ä t ä k o k o u k s i a + h ä t ä k o k o u s + h ä t ä k o k o u s t a + h ä t ä k o m i t e a n + h ä t ä k ä s i t t e l y + h ä t ä l a i n o j e n + h ä t ä l a i n s ä ä d ä n t ö ä + h ä t ä l a k e j a + h ä t ä l a s k u + h ä t ä l a s k u n + h ä t ä l a s k u t + h ä t ä l a u s e k e + h ä t ä m a j o i t u k s e n + h ä t ä m a j o i t u s t a + h ä t ä m e k a n i s m e j a + h ä t ä m e k a n i s m i + h ä t ä m e k a n i s m i a + h ä t ä m e n e t t e l y + h ä t ä m e n e t t e l y j e n + h ä t ä m e n e t t e l y j ä + h ä t ä m e n e t t e l y s t ä + h ä t ä m e n e t t e l y ä + h ä t ä m e n o i s t a + h ä t ä m e r k k i + h ä t ä m ä ä r ä r a h o j a + h ä t ä n a p p i a + h ä t ä n e u v o t t e l u i h i n + h ä t ä n u m e r o + h ä t ä n u m e r o a + h ä t ä n u m e r o i d e n + h ä t ä n u m e r o i t a + h ä t ä n u m e r o n + h ä t ä n u m e r o o n + h ä t ä n u m e r o s t a + h ä t ä n u m e r o t + h ä t ä o h j e l m a + h ä t ä o h j e l m a a + h ä t ä o h j e l m a n + h ä t ä o h j e l m i s t a + h ä t ä o p e r a a t i o i d e n + h ä t ä o p e r a a t i o i h i n + h ä t ä o p e r a a t i o i s s a + h ä t ä o p e r a a t i o n + h ä t ä p a k e t i l l a + h ä t ä p a k e t i s t a + h ä t ä p a k e t t i + h ä t ä p a k e t t i i n + h ä t ä p a l v e l u i d e n + h ä t ä p a l v e l u i h i n + h ä t ä p a l v e l u i s t a + h ä t ä p a l v e l u j a + h ä t ä p a l v e l u j e n + h ä t ä p a l v e l u t + h ä t ä p a l v e l u u n + h ä t ä p e l a s t u s r y h m ä n + h ä t ä p e l a s t u s t o i m i e n + h ä t ä p i l o t t i s u u n n i t e l m a n + h ä t ä p u h e l i m e t + h ä t ä p u h e l i n l i n j a + h ä t ä p u h e l i n l i n j a a + h ä t ä p u h e l i n l i n j o j a + h ä t ä p u h e l i n l i n j o j e n + h ä t ä p u h e l i n n u m e r o + h ä t ä p u h e l i n n u m e r o l l a + h ä t ä p u h e l i n n u m e r o n + h ä t ä p u h e l i n n u m e r o s t a + h ä t ä p u h e l i n p a l v e l u a + h ä t ä p u h e l i n p a l v e l u n + h ä t ä p u h e l u i t a + h ä t ä p u h e l u j e n + h ä t ä p u h e l u j ä r j e s t e l m ä + h ä t ä p u h e l u j ä r j e s t e l m ä n + h ä t ä p u h e l u j ä r j e s t e l m ä s t ä + h ä t ä p u h e l u p a l v e l u j e n + h ä t ä p u h e l u t + h ä t ä p ä ä t ö s l a u s e l m a e s i t y k s e m m e + h ä t ä p ä ä t ö s l a u s e l m a n + h ä t ä p ä ä t ö s t e n + h ä t ä r a h a s t o + h ä t ä r a h a s t o a + h ä t ä r a h a s t o i s t a + h ä t ä r a h a s t o j a + h ä t ä r a h a s t o j e n + h ä t ä r a h a s t o n + h ä t ä r a h a s t o s t a + h ä t ä r a h o i t u k s e n + h ä t ä r a h o i t u k s e n a + h ä t ä r a h o i t u s t a + h ä t ä r a k e t t i + h ä t ä r a t k a i s u + h ä t ä r a t k a i s u a + h ä t ä r a t k a i s u i h i n + h ä t ä r a t k a i s u i n a + h ä t ä r a t k a i s u i s t a + h ä t ä r a t k a i s u j a + h ä t ä r a t k a i s u j e n + h ä t ä r a t k a i s u k s i + h ä t ä r a t k a i s u l t a + h ä t ä r a t k a i s u s t a + h ä t ä r a t k a i s u t + h ä t ä r a t k a i s u u n + h ä t ä r e a k t i o + h ä t ä r e a k t i o n a + h ä t ä r o k o t e t a a n + h ä t ä r o k o t t a m i n e n + h ä t ä r o k o t t a m i s e e n + h ä t ä r o k o t u k s e t + h ä t ä r o k o t u k s i a + h ä t ä r o k o t u k s i i n + h ä t ä r o k o t u k s i l l a + h ä t ä r o k o t u k s i s t a + h ä t ä r o k o t u s t e n + h ä t ä r u o k a + h ä t ä s a t a m a + h ä t ä s a t a m a a + h ä t ä s a t a m a a n + h ä t ä s a t a m a n + h ä t ä s a t a m a t + h ä t ä s a t a m i a + h ä t ä s a t a m i e n + h ä t ä s a t a m i l l e + h ä t ä s a t a m i s t a + h ä t ä s i i r t o l a i s i a + h ä t ä s i i r t o l a i s i l l a + h ä t ä s i i r t o l a i s i s t a + h ä t ä s i i r t o l a i s t a + h ä t ä s i i r t o l a i s t e n + h ä t ä s t r a t e g i a n + h ä t ä s t r a t e g i o i t a + h ä t ä s u o j a + h ä t ä s u o j i a + h ä t ä s u u n n i t e l m a + h ä t ä s u u n n i t e l m a a + h ä t ä s u u n n i t e l m a a n + h ä t ä s u u n n i t e l m a l l a + h ä t ä s u u n n i t e l m a n + h ä t ä s u u n n i t e l m a n a + h ä t ä s u u n n i t e l m a s t a + h ä t ä s u u n n i t e l m a t + h ä t ä s u u n n i t e l m i a + h ä t ä s u u n n i t e l m i e n + h ä t ä s u u n n i t e l m i i n + h ä t ä s u u n n i t e l m i s s a + h ä t ä s u u n n i t e l m i s t a + h ä t ä t a p a u k s e n a + h ä t ä t a p a u k s e s s a + h ä t ä t a p a u k s i a + h ä t ä t a p a u k s i l l e + h ä t ä t a p a u k s i s s a + h ä t ä t a s o n + h ä t ä t a v u n + h ä t ä t e r v e y d e n h u o l l o n + h ä t ä t e r v e y s t o i m e n p i t e i d e n + h ä t ä t e u r a s t u k s e e n + h ä t ä t i e d o t e + h ä t ä t i l a + h ä t ä t i l a a + h ä t ä t i l a a n + h ä t ä t i l a h a l l i n n o n + h ä t ä t i l a h a l l i t u s + h ä t ä t i l a h a l l i t u s t a + h ä t ä t i l a j u l i s t u s + h ä t ä t i l a k s i + h ä t ä t i l a l a i n s ä ä d ä n n ö n + h ä t ä t i l a l a i n s ä ä d ä n t ö ä + h ä t ä t i l a l a u s e k e t t a + h ä t ä t i l a l a u s e k k e e n + h ä t ä t i l a m i n i s t e r i ö + h ä t ä t i l a n + h ä t ä t i l a n n e + h ä t ä t i l a n n e s u u n n i t e l m a + h ä t ä t i l a n n e s u u n n i t e l m i a + h ä t ä t i l a n n e t o i m i i n + h ä t ä t i l a n n e t t a + h ä t ä t i l a n n e v a l m i u t t a + h ä t ä t i l a n s a + h ä t ä t i l a n t e e k s i + h ä t ä t i l a n t e e n + h ä t ä t i l a n t e e n a + h ä t ä t i l a n t e e s e e n + h ä t ä t i l a n t e e s s a + h ä t ä t i l a n t e e s t a + h ä t ä t i l a n t e e t + h ä t ä t i l a n t e i d e n + h ä t ä t i l a n t e i s i i n + h ä t ä t i l a n t e i s s a + h ä t ä t i l a n t e i s t a + h ä t ä t i l a n t e i t a + h ä t ä t i l a p ä ä t ö k s i ä + h ä t ä t i l a s s a + h ä t ä t i l a s t a + h ä t ä t i l a s u u n n i t e l m i a + h ä t ä t i l a s u u n n i t e l m i i n + h ä t ä t i l a s u u n n i t e l m i s t a + h ä t ä t i l a t o i m e n p i t e i t ä + h ä t ä t i l a t o i m i e n + h ä t ä t i l a t u o t t e i l l a + h ä t ä t i l a v a r a s t o j a + h ä t ä t i l a v i r a s t o + h ä t ä t i l o i h i n + h ä t ä t i s l a u k s e e n + h ä t ä t o i m e n + h ä t ä t o i m e n a + h ä t ä t o i m e n p i d e + h ä t ä t o i m e n p i d e p a k e t i s s a + h ä t ä t o i m e n p i d e p a k e t i s t a + h ä t ä t o i m e n p i d e s u u n n i t e l m i a + h ä t ä t o i m e n p i d e s u u n n i t e l m i e n + h ä t ä t o i m e n p i t e e k s i + h ä t ä t o i m e n p i t e e l t ä + h ä t ä t o i m e n p i t e e n + h ä t ä t o i m e n p i t e e n s ä + h ä t ä t o i m e n p i t e e n ä + h ä t ä t o i m e n p i t e e s e e n + h ä t ä t o i m e n p i t e e t + h ä t ä t o i m e n p i t e i d e n + h ä t ä t o i m e n p i t e i l l ä + h ä t ä t o i m e n p i t e i n + h ä t ä t o i m e n p i t e i s i i n + h ä t ä t o i m e n p i t e i s t ä + h ä t ä t o i m e n p i t e i t ä + h ä t ä t o i m e t + h ä t ä t o i m i a + h ä t ä t o i m i e n + h ä t ä t o i m i i n + h ä t ä t o i m i l l a + h ä t ä t o i m i p a k e t t i a + h ä t ä t o i m i s t a + h ä t ä t o i m i t u k s e t + h ä t ä t o r j u n t a t o i m i e n + h ä t ä t o r j u n t a t o i m i s s a + h ä t ä u l o s k ä y n t i + h ä t ä v a i h e e n + h ä t ä v a l a i s t u s t a + h ä t ä v a l m i u s k e s k u k s e k s i + h ä t ä v a l m i u s s u u n n i t e l m i e n + h ä t ä v a l m i u s v a l v o n t a j o u k k o j e n + h ä t ä v a l o j a + h ä t ä v a l o t + h ä t ä v a r a n n o i s t a + h ä t ä v a r a n t o j e n + h ä t ä v a r a s t a + h ä t ä v a r a s t o a + h ä t ä v a r a s t o j e n + h ä t ä v a r a s t o t + h ä t ä v a r a t o i m e n p i d e + h ä t ä v a r a t o i m i l l e + h ä t ä v a r a u k s e s t a + h ä t ä v a r a u s t e n + h ä t ä v a r j e l u + h ä t ä v a r u s t e i t a + h ä t ä v e r o n + h ä t ä v e t o o m u k s e e n + h ä t ä v e t o o m u k s e n + h ä t ä v e t ä y t y m i s s t r a t e g i o i t a + h ä t ä v i e s t i n t ä j ä r j e s t e l m ä n + h ä t ä v i e s t i n t ä p a l v e l u j a + h ä t ä v i e s t i n t ä ä n + h ä t ä y k s i k ö i t ä + h ä t ä ä + h ä t ä ä n t y ä + h ä v e l i ä ä m p i + h ä v e t t ä v ä n + h ä v e t t ä v ä ä + h ä v i k k i e n + h ä v i n n e e n s ä + h ä v i n n e e t + h ä v i n n y t + h ä v i s i + h ä v i s i v ä t + h ä v i s i v ä t k ö + h ä v i t e t t ä v ä k s i + h ä v i t t ä e n + h ä v i t t ä j i e n + h ä v i t t ä j i ä + h ä v i t t ä j ä k o n e e t + h ä v i t t ä j ä k o n e i n + h ä v i t t ä j ä l e n t o k o n e e t + h ä v i t t ä j ä l e n t o k o n e i s t a + h ä v i t t ä j ä l e n t ä j ä n + h ä v i t t ä j ä p o m m i t t a j a + h ä v i t t ä j ä s t ä + h ä v i t t ä j ä t + h ä v i t t ä j ä ä + h ä v i t t ä k ä ä m m e + h ä v i t t ä m i s e k s i + h ä v i t t ä m i s e n + h ä v i t t ä m i s e s t ä + h ä v i t t ä m i s j ä r j e s t e l m i ä + h ä v i t t ä m i s k u s t a n n u k s e t + h ä v i t t ä m i s k u s t a n n u k s i s s a + h ä v i t t ä m i s k u s t a n n u k s i s t a + h ä v i t t ä m i s m e k a n i s m e j a + h ä v i t t ä m i s m e n e t e l m i s t ä + h ä v i t t ä m i s m e n e t e l m ä + h ä v i t t ä m i s o h j e l m a + h ä v i t t ä m i s o h j e l m a a + h ä v i t t ä m i s o h j e l m a a n + h ä v i t t ä m i s o h j e l m a n + h ä v i t t ä m i s o h j e l m i a + h ä v i t t ä m i s o h j e l m i e n + h ä v i t t ä m i s o h j e l m i i n + h ä v i t t ä m i s o h j e l m i l l e + h ä v i t t ä m i s o h j e l m i s s a + h ä v i t t ä m i s s u u n n i t e l m a s s a + h ä v i t t ä m i s t a p a + h ä v i t t ä m i s t o i m e n p i t e e t + h ä v i t t ä m i s t o i m e n p i t e i t ä + h ä v i t t ä m i s t o i m i a + h ä v i t t ä m ä ä n + h ä v i t t ä v ä ä + h ä v i t t ä ä + h ä v i t y k s e s t ä + h ä v i t y s j ä r j e s t e l m ä n + h ä v i t y s k e i n o t + h ä v i t y s k u s t a n n u k s i a + h ä v i t y s m e n e t e l m i e n + h ä v i t y s m e n e t e l m i ä + h ä v i t y s m u o t o j a + h ä v i t y s o n g e l m a s t a + h ä v i t y s o p e r a a t t o r i t + h ä v i t y s s u u n n i t e l m a n + h ä v i t y s t ä + h ä v i ä j i s t ä + h ä v i ä j i ä + h ä v i ä m i s e e n + h ä v i ä m i s v a u h d i n + h ä v i ä m m e + h ä v i ä m ä s s ä + h ä v i ä m ä ä n + h ä v i ä v ä t + h ä v i ä ä + h ä v i ä ä k i n + h ä v i ö k e r r o i n + h ä v i ö l l e + h ä v i ö n t u n n e + h ä v i ö t ä + h ä v y t t ö m y y k s i ä + h ä v y t t ö m ä m p ä ä + h ä v y t ö n t ä + h ä ä d e t t y j e n + h ä ä d e t y i l l e + h ä ä h e i l a + h ä ä j u h l a a + h ä ä k a r k u r i + h ä ä m a r s s i + h ä ä m a r s s i n + h ä ä m ö t t ä ä + h ä ä m ö t t ä ä p ä + h ä ä p u k u n i + h ä ä p ä i v ä n ä ä n + h ä ä t a n s s i + h ä ä t ä e s s ä ä n + h ä ä t ä ä + h ä ä t ö i l m o i t u k s i a + h ä ä t ö o p e r a a t i o t a + h ä ä y ö s t ä + h ö k k e l e i s s ä + h ö k k e l i k a u p u n k i e n + h ö k k e l i k y l i i n + h ö k k e l i k y l i s s ä + h ö k k e l i k y l i s s ä ä n + h ö k k e l i k y l ä s s ä + h ö k k e l i k y l ä ä + h ö l l e m m ä s t ä + h ö l l e m p i e n + h ö l l e m p i ä + h ö l l e n t ä k ä ä m m e + h ö l l e n t ä m i s t ä + h ö l l ä k ä t i s e m p i e n + h ö l l ä k ä t i s y y d e n + h ö l m ö l ä i s t e n + h ö l y n p ö l y k s i + h ö l y n p ö l y n + h ö l y n p ö l y s t ä + h ö l y n p ö l y ä + h ö s s ö t y k s e n n e + h ö t ö r a h a n + h ö y h e n m ä t ä + h ö y h e n p e n s a s + h ö y r y f r e g a t t i + h ö y r y j a r r u + h ö y r y j u n a + h ö y r y j y r ä a s e n t e e s t a + h ö y r y k a a s u v o i m a l o i t a + h ö y r y k o n e + h ö y r y k o n e e n + h ö y r y k u p u + h ö y r y k ä y t t ö i s i l l e + h ö y r y l e n t o k o n e + h ö y r y n p a i n e + h ö y r y o l u t + h ö y r y p a i n e e n + h ö y r y p a i n e t t a + h ö y r y p u h d i s t u s + h ö y r y r a d i o t a + h ö y r y s i l i t y s r a u t a + h ö y r y s i l i t y s r a u t a a + h ö y r y s t y m i s l ä m p ö + h ö y r y s ä i l i ö v e t u r i + h ö y r y t a l o + h ö y r y t u r b i i n e j a + h ö y r y t u r b i i n i + h ö y r y t u r b i i n i v e t u r i + h ö y r y v e t u r i + h ö y r y v e t u r i e n + h ö y r y v e t u r i s t a + h ö y r y v o i m a l a i t o k s e t + i b a n i t + i d e a a l i k a a s u + i d e a a l i m a a i l m a s s a + i d e a a l i r a t k a i s u i s t a + i d e a a l i s e o s + i d e a a l i t i l a n n e + i d e a l i s t i s e m p i a + i d e a l i s t i s i a + i d e a l u e t t e l o k s i + i d e a n + i d e a n a + i d e a o p p i + i d e a r i k k a u s + i d e a r i k k a u t t a + i d e a s t a + i d e a t o r i + i d e n t i f i o i d a + i d e n t i f i o i m i s p r o s e s s i + i d e n t i f i o i n t i p r o s e s s i s s a + i d e n t i t e e t i n + i d e n t i t e e t i s t ä + i d e n t i t e e t i s t ä m m e + i d e n t i t e e t i s t ä ä n + i d e n t i t e e t i t + i d e n t i t e e t t e j ä + i d e n t i t e e t t e j ä ä n + i d e n t i t e e t t i e r o i s t a + i d e n t i t e e t t i f u n k t i o + i d e n t i t e e t t i h ä i r i ö + i d e n t i t e e t t i i n + i d e n t i t e e t t i k r i i s i + i d e n t i t e e t t i k r i i s i i n + i d e n t i t e e t t i k r i i s i k s i + i d e n t i t e e t t i k r i i s i n + i d e n t i t e e t t i k r i i s i s t ä + i d e n t i t e e t t i k r i i s i t + i d e n t i t e e t t i k r i i s i ä + i d e n t i t e e t t i k y s y m y s + i d e n t i t e e t t i k ä s i t y s + i d e n t i t e e t t i m m e + i d e n t i t e e t t i n s ä + i d e n t i t e e t t i o n g e l m i a + i d e n t i t e e t t i r i s t i r e t k i + i d e n t i t e e t t i t e o r i a + i d e n t i t e e t t i v a r k a u s + i d e n t i t e e t t i ä + i d e n t i t e e t t i ä m m e + i d e n t i t e e t t i ä ä n + i d e n t t i s i ä + i d e o i d e n + i d e o i h i n + i d e o i l l e + i d e o i m a l l a + i d e o i s t a + i d e o i t a + i d e o i t a a n + i d e o l o g e i l l e + i d e o l o g i a a + i d e o l o g i a a n s a + i d e o l o g i a n + i d e o l o g i a p o h j a i s e l l e + i d e o l o g i a s t a + i d e o l o g i a t + i d e o l o g i o i d e n + i d e o l o g i o i l l e + i d e o l o g i o i s s a + i d e o l o g i o i s t a + i d e o l o g i o i t a + i d e o l o g i s e e n + i d e o l o g i s e k s i + i d e o l o g i s e l t a + i d e o l o g i s e n + i d e o l o g i s e s t a + i d e o l o g i s e s t i + i d e o l o g i s e t + i d e o l o g i s e t k i n + i d e o l o g i s i a + i d e o l o g i s i i n + i d e o l o g i s i l l a + i d e o l o g i s i l t a + i d e o l o g i s i s t a + i d e o l o g i s t a + i d e o l o g i s t e n + i d i o o t e i k s i + i d i o o t t i k i n + i d i o o t t i l i i t t o l a i s e n s a + i d ä l l e + i d ä n + i d ä n a m b r a p u u + i d ä n h e p o k a t t i + i d ä n h o p e a n o k k a + i d ä n h o p e a p e n s a s + i d ä n h ä r ä n s i l m ä + i d ä n k a i s l a k e r t t u n e n + i d ä n k a l l i o n a k k e l i + i d ä n k a u l u s t r a p p i + i d ä n k e l l u k k a + i d ä n k e n t t ä k e r t t u n e n + i d ä n k e n t t ä m y y r ä + i d ä n k e u l a n k ä r k i + i d ä n k i r j o l e p i n k ä i n e n + i d ä n k o t e l o k i l p i k o n n a + i d ä n k o u k k u k a k a d u + i d ä n k u l k u s i r k k a + i d ä n k u r h o + i d ä n k u u s i + i d ä n m e t s ä h i i r i + i d ä n n a a k k a + i d ä n n i i t t y p e r h o n e n + i d ä n n o k i p e r h o n e n + i d ä n n u k k i + i d ä n n u o l i h a u k k a + i d ä n p i k k u s i e p p o + i d ä n p l a t a a n i + i d ä n p o l i t i i k a n + i d ä n p o l i t i i k a s t a + i d ä n p o l i t i i k k a + i d ä n p ä ä s t ä i n e n + i d ä n r a s t a s k e r t t u n e n + i d ä n r i t a r i y ö k k ö n e n + i d ä n r u s k o b u l b u l i + i d ä n s a m p i + i d ä n s i i l i + i d ä n s i l k k i k e r t t u n e n + i d ä n s i n i l i l j a + i d ä n s y d ä n s i m p u k k a + i d ä n t i e + i d ä n t u r t u r i k y y h k y + i d ä n u n i k k o + i d ä n u u n i l i n t u + i d ä n v a r p u s h a u k k a + i d ä n v e r i j u u r i + i d ä n v i h e r p e i p p o + i d ä n v i r p i a n g e r v o + i d ä s s ä + i d ä s t ä + i g b o t + i h a i l e m a a n + i h a i l e m m e + i h a i l e n + i h a i l e v a a + i h a i l i j a k e r h o o n + i h a i l i j a n n e + i h a i l k a a m m e + i h a i l l e n + i h a i l t a v a a + i h a i l t a v a m p a a + i h a i l t a v a n + i h a i l u a + i h a i l u m m e + i h a i l u n i + i h a n a a + i h a n n e a j a s s a + i h a n n e a v i o m i e s + i h a n n e k a u p u n k i n s a + i h a n n e k u v a s t a + i h a n n e m a a i l m a + i h a n n e m a a i l m a a + i h a n n e m a a i l m a s s a + i h a n n e m a a i l m a s t a + i h a n n e m a l l i + i h a n n e m a l l i i n + i h a n n e o l o i s s a + i h a n n e o l o t + i h a n n e r a t k a i s u + i h a n n e r a t k a i s u j a + i h a n n e r a t k a i s u j e n + i h a n n e t a p a a + i h a n n e t a p a u k s e s s a + i h a n n e t a s o + i h a n n e t i l a n n e + i h a n n e t i l a n t e e s s a + i h a n n e t t a + i h a n n e v i r k a m i e s t ä + i h a n n e ä i t e j ä + i h a n n o i n n i n + i h a n n o i v a a n + i h a n t e e l l i s e n + i h a n t e e l l i s e t + i h a n t e e l l i s i m m a s s a + i h a n t e e l l i s i n + i h a n t e e l l i s i s s a + i h a n t e e l l i s t a + i h a n t e e l l i s u u d e s s a a n + i h a n t e e t + i h a n t e i s i i n + i h a n t e i t a + i h a s t u s t a + i h m e a s e + i h m e a s e e n a + i h m e e l l i s i ä + i h m e e l l i s t ä + i h m e e t + i h m e h o i t o a + i h m e i d e n t e k i j ä + i h m e i s i i n + i h m e i t t e n t e k i j ä n + i h m e i t ä + i h m e k a a v a a + i h m e k e i n o j a + i h m e k e i n o n a + i h m e k u k k a + i h m e l ä ä k e + i h m e l ä ä k e t t ä + i h m e l ä ä k k e e n + i h m e l ä ä k k e e n ä + i h m e l ä ä k k e e t + i h m e l ä ä k k e i s t ä + i h m e l ä ä k k e i t ä + i h m e m a a + i h m e m i e s + i h m e n a i n e n + i h m e n e l o s e t + i h m e p a r a n t u m i s i a + i h m e p e l a s t u s + i h m e p e n s a s + i h m e r a t k a i s u + i h m e r a t k a i s u a + i h m e r a t k a i s u i l l a + i h m e r a t k a i s u j a + i h m e r a t k a i s u l t a + i h m e r a t k a i s u n + i h m e r a t k a i s u n a + i h m e t a r k i s t u k s e l l a + i h m e t e k o i h i n + i h m e t e k o j a + i h m e t e l l e e t + i h m e t e l l ä + i h m e t e l l ä ä n + i h m e t t e l e e + i h m e t t e l e m m e + i h m e t t e l e m m e k i n + i h m e t t e l e m ä l l ä + i h m e t t e l e m ä ä n + i h m e t t e l e n + i h m e t t e l e n k i n + i h m e t t e l e v ä n i + i h m e t t e l e v ä t + i h m e t t e l i n + i h m e t t ä + i h m e t y t t i + i h m e t y t t ä ä + i h m e t y t t ö + i h m e v ä l i n e t t ä + i h m i s a a l t o + i h m i s a i v o i s s a + i h m i s a i v o j a + i h m i s a i v o j e n + i h m i s a i v o t + i h m i s a l k i o + i h m i s a l k i o i d e n + i h m i s a l k i o i h i n + i h m i s a l k i o i l l a + i h m i s a l k i o i l l e + i h m i s a l k i o i s t a + i h m i s a l k i o i t a + i h m i s a l k i o n + i h m i s a l k i o o n + i h m i s a l k i o s t a + i h m i s a l k i o t + i h m i s a l k i o t a + i h m i s a l k i o t u t k i m u k s e n + i h m i s a p i n a k a n n a t + i h m i s a p i n o i d e n + i h m i s a p i n o i l l e + i h m i s a p i n o i s t a + i h m i s a p i n o i t a + i h m i s a r v o + i h m i s a r v o a + i h m i s a r v o a a n + i h m i s a r v o a h a n + i h m i s a r v o i h i n + i h m i s a r v o i n e n + i h m i s a r v o i s e e n + i h m i s a r v o i s e l l a + i h m i s a r v o i s e m m a t + i h m i s a r v o i s e m m i n + i h m i s a r v o i s e m p a a + i h m i s a r v o i s e m p i + i h m i s a r v o i s e n + i h m i s a r v o i s e s t a + i h m i s a r v o i s e s t i + i h m i s a r v o i s e t + i h m i s a r v o i s i a + i h m i s a r v o i s i s s a + i h m i s a r v o i s t a + i h m i s a r v o i s u u s + i h m i s a r v o i s u u t t a + i h m i s a r v o j a + i h m i s a r v o j e n + i h m i s a r v o k k u u d e n + i h m i s a r v o k y s y m y s + i h m i s a r v o l l e + i h m i s a r v o m m e + i h m i s a r v o n + i h m i s a r v o n l o u k k a u s t e n + i h m i s a r v o n o r m e j a + i h m i s a r v o n s a + i h m i s a r v o o n + i h m i s a r v o o n s a + i h m i s a r v o s s a + i h m i s a r v o s t a + i h m i s a r v o t + i h m i s a s u t u s + i h m i s a s u t u s t a + i h m i s d y n a m o k s i + i h m i s e e n + i h m i s e k s i + i h m i s e l i m i s t ö l l e + i h m i s e l i m i ä + i h m i s e l i n k a u p a s t a + i h m i s e l i n t e n + i h m i s e l l e + i h m i s e l l ä + i h m i s e l o s t a + i h m i s e l t ä + i h m i s e l ä m i ä + i h m i s e l ä m ä + i h m i s e l ä m ä l l e + i h m i s e l ä m ä l l ä + i h m i s e l ä m ä n + i h m i s e l ä m ä n ä + i h m i s e l ä m ä s s ä + i h m i s e l ä m ä s t ä + i h m i s e l ä m ä ä + i h m i s e l ä m ä ä n + i h m i s e n + i h m i s e n k i n + i h m i s e n k o k o i s i s s a + i h m i s e n ä + i h m i s e s s ä + i h m i s e s t ä + i h m i s e t + i h m i s e t h ä n + i h m i s e t k i n + i h m i s g e e n e i l l e + i h m i s g e e n e j ä + i h m i s g e e n i + i h m i s g e e n i e n + i h m i s g e e n i n + i h m i s g e e n i t + i h m i s g e n e t i i k a n + i h m i s g e n e t i i k k a + i h m i s g e n e t i i k k a a + i h m i s g e n e t i i k k a a n + i h m i s g e n o m i a + i h m i s h e n g e l l ä + i h m i s h e n g e n + i h m i s h e n g e t + i h m i s h e n g i k s i + i h m i s h e n g i l l e + i h m i s h e n g i l l ä + i h m i s h e n g i s t ä + i h m i s h e n k e ä + i h m i s h e n k i + i h m i s h e n k i e n + i h m i s h e n k i i n + i h m i s h e n k i n ä + i h m i s h e n k i ä + i h m i s h i s t o r i a n + i h m i s h y ö d y k k e i l l ä + i h m i s i h o n + i h m i s i i n + i h m i s i k s i + i h m i s i l l e + i h m i s i l l ä + i h m i s i l t ä + i h m i s i n s u l i i n i a + i h m i s i n ä + i h m i s i n ä k i n + i h m i s i s s ä + i h m i s i s t ä + i h m i s i ä + i h m i s j a h t i + i h m i s j o u k k o + i h m i s j o u k k o i h i n + i h m i s j o u k o i l l e + i h m i s j o u k o l l e + i h m i s j o u k o n + i h m i s j o u k o t + i h m i s j ä ä n t e i d e n + i h m i s k a n t a s o l u k a n t o j e n + i h m i s k a s v o i n e n + i h m i s k a s v o j a + i h m i s k a s v o t + i h m i s k a u p a l l a + i h m i s k a u p a l l e + i h m i s k a u p a l t a + i h m i s k a u p a n + i h m i s k a u p a n u h r e j a + i h m i s k a u p a s s a + i h m i s k a u p a s t a + i h m i s k a u p p a + i h m i s k a u p p a a + i h m i s k a u p p a a j a t + i h m i s k a u p p a a n + i h m i s k a u p p a j ä r j e s t ö j e n + i h m i s k a u p p a l i i g a t + i h m i s k a u p p a l i i g o j e n + i h m i s k a u p p a m a r k k i n o i l l a + i h m i s k a u p p a o n g e l m a + i h m i s k a u p p a o n g e l m a a + i h m i s k a u p p a o n g e l m a a n + i h m i s k a u p p a r e n k a i d e n + i h m i s k a u p p a r i k o k s e e n + i h m i s k a u p p a r i k o k s i i n + i h m i s k a u p p a t a p a u k s e n + i h m i s k a u p p a t a p a u k s i s t a + i h m i s k a u p p a t a p a u s t e n + i h m i s k a u p p a t i l a n n e + i h m i s k a u p p a v e r k o s t o j a + i h m i s k a u p p a v e r k o s t o j e n + i h m i s k a u p p i a a t + i h m i s k a u p p i a i d e n + i h m i s k a u p p i a i l l a + i h m i s k a u p p i a i l l e + i h m i s k a u p p i a i l t a + i h m i s k a u p p i a i s i i n + i h m i s k a u p p i a i s t a + i h m i s k a u p p i a i t a + i h m i s k a u p p i a i t t e n + i h m i s k a u p p i a s + i h m i s k e h o + i h m i s k e h o a + i h m i s k e h o i l l a + i h m i s k e h o l l e + i h m i s k e h o n + i h m i s k e h o o n + i h m i s k e h o s s a + i h m i s k e h o s t a + i h m i s k e s k e i n e n + i h m i s k e s k e i s e e n + i h m i s k e s k e i s e m m i k s i + i h m i s k e s k e i s e n + i h m i s k e s k e i s e s t ä + i h m i s k e s k e i s i ä + i h m i s k e s k e i s t ä + i h m i s k i l p e n ä + i h m i s k i l p i + i h m i s k i l p i n ä + i h m i s k i l p i n ä ä n + i h m i s k i l p i ä + i h m i s k i l v e n + i h m i s k i r p p u + i h m i s k l o o n a u k s e n + i h m i s k l o o n a u k s e s t a + i h m i s k l o o n a u s + i h m i s k l o o n a u s t a + i h m i s k l o o n a u s y r i t y k s e t + i h m i s k l o o n i e n + i h m i s k o e + i h m i s k o h t a l o a + i h m i s k o h t a l o i d e n + i h m i s k o h t a l o i h i n + i h m i s k o h t a l o i s t a + i h m i s k o k e e t + i h m i s k o k e i d e n + i h m i s k o n t a k t i n s a + i h m i s k r e m a t o r i o i h i n + i h m i s k u d o k s e l l a + i h m i s k u d o k s i a + i h m i s k u d o k s i l l a + i h m i s k u d o s p a n k k i e n + i h m i s k u d o s t a + i h m i s k u d o s t e n + i h m i s k u n n a l l a + i h m i s k u n n a l l e + i h m i s k u n n a n + i h m i s k u n n a s t a + i h m i s k u n t a + i h m i s k u n t a a + i h m i s k u n t a a n + i h m i s k u o l e m a t + i h m i s k u v a a + i h m i s k u v a n + i h m i s k ä d e n + i h m i s k ä r s i m y s t ä + i h m i s k ä s i + i h m i s k ä s i t y k s e e m m e + i h m i s k ä s i t y k s e n + i h m i s k ä s i t y s + i h m i s k ä t t e n + i h m i s k ä y t t ö ö n + i h m i s l a j i a + i h m i s l a j i l l e + i h m i s l a j i n + i h m i s l i h a a + i h m i s l o u k k a u k s i i n + i h m i s l o u k k a u k s i l t a + i h m i s l u o n n e + i h m i s l u o n n e t t a + i h m i s l u o n n o n + i h m i s l u o n n o s t a + i h m i s l u o n t e e s t a + i h m i s l u o n t o + i h m i s l u o n t o a + i h m i s l u o n t o o n + i h m i s l ä h e i s e m p i ä + i h m i s l ä h e i s e m p ä ä n + i h m i s l ä h e i s e n + i h m i s l ä h e i s i s t ä + i h m i s l ä h e i s i ä + i h m i s l ä h e i s y y d e n + i h m i s l ä h e i s y y s + i h m i s l ä h t ö i s e l l ä + i h m i s l ä ä k e t i e d e + i h m i s l ä ä k e t i e t e e s s ä + i h m i s m a a i l m a l l e + i h m i s m a a n t i e d e + i h m i s m a s s o j e n + i h m i s m e t s ä s t y s + i h m i s m i e l e e n + i h m i s m i e l e n + i h m i s m u u r i l l a + i h m i s m ä ä r i l l e + i h m i s m ä ä r ä + i h m i s m ä ä r ä l l e + i h m i s m ä ä r ä l l ä + i h m i s m ä ä r ä s s ä + i h m i s m ä ä r ä s t ä + i h m i s m ä ä r ä ä + i h m i s m ä ä r ä ä n + i h m i s n ä k e m y k s e e n + i h m i s n ä k e m y k s e n + i h m i s n ä k e m y k s e s t ä + i h m i s n ä k e m y s + i h m i s n ä k e m y s t ä + i h m i s o i k e u d e k s i + i h m i s o i k e u d e l l i n e n + i h m i s o i k e u d e l l i s e s t a + i h m i s o i k e u d e l l i s i i n + i h m i s o i k e u d e n + i h m i s o i k e u d e s t a + i h m i s o i k e u d e t + i h m i s o i k e u d e t h a n + i h m i s o i k e u k s i a + i h m i s o i k e u k s i a a n + i h m i s o i k e u k s i a k a a n + i h m i s o i k e u k s i a m m e + i h m i s o i k e u k s i e n + i h m i s o i k e u k s i e n k a a n + i h m i s o i k e u k s i e n k i n + i h m i s o i k e u k s i e n s a + i h m i s o i k e u k s i i n + i h m i s o i k e u k s i i n s a + i h m i s o i k e u k s i k s i + i h m i s o i k e u k s i l l a + i h m i s o i k e u k s i l l e + i h m i s o i k e u k s i n + i h m i s o i k e u k s i n a + i h m i s o i k e u k s i s s a + i h m i s o i k e u k s i s t a + i h m i s o i k e u k s i s t a a n + i h m i s o i k e u k s i s t a k i n + i h m i s o i k e u k s i s t a n n e + i h m i s o i k e u s + i h m i s o i k e u s a a t e + i h m i s o i k e u s a g e n d a s s a m m e + i h m i s o i k e u s a i h e e s t a + i h m i s o i k e u s a i h e t t a + i h m i s o i k e u s a j a t t e l u + i h m i s o i k e u s a j a t u k s e n + i h m i s o i k e u s a k a t e m i a + i h m i s o i k e u s a k a t e m i a l l e + i h m i s o i k e u s a k t i i v i e n + i h m i s o i k e u s a k t i v i s t e i h i n + i h m i s o i k e u s a k t i v i s t e i k s i + i h m i s o i k e u s a k t i v i s t e i l l a + i h m i s o i k e u s a k t i v i s t e i l l e + i h m i s o i k e u s a k t i v i s t e i l l e m m e + i h m i s o i k e u s a k t i v i s t e i n a + i h m i s o i k e u s a k t i v i s t e i s t a + i h m i s o i k e u s a k t i v i s t e j a + i h m i s o i k e u s a k t i v i s t i + i h m i s o i k e u s a k t i v i s t i a + i h m i s o i k e u s a k t i v i s t i e n + i h m i s o i k e u s a k t i v i s t i l l e + i h m i s o i k e u s a k t i v i s t i n + i h m i s o i k e u s a k t i v i s t i n a + i h m i s o i k e u s a k t i v i s t i t + i h m i s o i k e u s a l a a n + i h m i s o i k e u s a l a l l a + i h m i s o i k e u s a l a n + i h m i s o i k e u s a l i v a l i o k u n n a n + i h m i s o i k e u s a l i v a l i o k u n t a + i h m i s o i k e u s a l o i t e t t a + i h m i s o i k e u s a l o i t t e e n + i h m i s o i k e u s a r t i k l o i l l e + i h m i s o i k e u s a r v i o i n t i + i h m i s o i k e u s a s e t u k s e t + i h m i s o i k e u s a s i a + i h m i s o i k e u s a s i a a + i h m i s o i k e u s a s i a a n + i h m i s o i k e u s a s i a i n + i h m i s o i k e u s a s i a k i r j a n + i h m i s o i k e u s a s i a k i r j a t + i h m i s o i k e u s a s i a k i r j o i s s a + i h m i s o i k e u s a s i a k i r j o j a + i h m i s o i k e u s a s i a m i e h e n + i h m i s o i k e u s a s i a m i e s + i h m i s o i k e u s a s i a m i e s t ä + i h m i s o i k e u s a s i a n + i h m i s o i k e u s a s i a n a + i h m i s o i k e u s a s i a n a j a j a + i h m i s o i k e u s a s i a n a j a j a a + i h m i s o i k e u s a s i a n a j a j a s t a + i h m i s o i k e u s a s i a n a j a j i a + i h m i s o i k e u s a s i a n a j a j i e n + i h m i s o i k e u s a s i a n a j a j i s t a + i h m i s o i k e u s a s i a n t u n t i j o i d e n + i h m i s o i k e u s a s i a n t u n t i j o i l l e + i h m i s o i k e u s a s i a n t u n t i j o i t a + i h m i s o i k e u s a s i a s s a + i h m i s o i k e u s a s i a s s a a n + i h m i s o i k e u s a s i a s t a + i h m i s o i k e u s a s i a t + i h m i s o i k e u s a s i o i d e n + i h m i s o i k e u s a s i o i h i n + i h m i s o i k e u s a s i o i k s i + i h m i s o i k e u s a s i o i l l a + i h m i s o i k e u s a s i o i s s a + i h m i s o i k e u s a s i o i s t a + i h m i s o i k e u s a s i o i t a + i h m i s o i k e u s b u d j e t t i a + i h m i s o i k e u s b u d j e t t i k o h d i l l e + i h m i s o i k e u s b u d j e t t i n s a + i h m i s o i k e u s d i a l o g e i s t a + i h m i s o i k e u s d i a l o g i n + i h m i s o i k e u s d o k t r i i n i + i h m i s o i k e u s d o k t r i i n i n + i h m i s o i k e u s e d u s t a j a + i h m i s o i k e u s e d u s t a j a a + i h m i s o i k e u s e d u s t a j a n + i h m i s o i k e u s e h d o t + i h m i s o i k e u s e h t o + i h m i s o i k e u s e h t o j a + i h m i s o i k e u s e l i n t e n + i h m i s o i k e u s e r i t y i s e d u s t a j a + i h m i s o i k e u s e s i t y s l i s t a s s a + i h m i s o i k e u s f o o r u m e i l l a + i h m i s o i k e u s f o o r u m i + i h m i s o i k e u s f o o r u m i e n + i h m i s o i k e u s f o o r u m i n + i h m i s o i k e u s f o o r u m i s s a + i h m i s o i k e u s h a a s t e i s t a + i h m i s o i k e u s h a n k k e e t + i h m i s o i k e u s h a n k k e i d e n + i h m i s o i k e u s h a n k k e i s i i n + i h m i s o i k e u s h a n k k e i t a + i h m i s o i k e u s h i s t o r i a + i h m i s o i k e u s i d e o l o g i a a n + i h m i s o i k e u s i h m i n e n + i h m i s o i k e u s i n s t i t u u t i o i d e n + i h m i s o i k e u s i n s t r u m e n t i s t a + i h m i s o i k e u s i n t r e s s i t + i h m i s o i k e u s j u l i s t u k s e e n + i h m i s o i k e u s j u l i s t u k s e m m e + i h m i s o i k e u s j u l i s t u k s e n + i h m i s o i k e u s j u l i s t u k s e s s a + i h m i s o i k e u s j u l i s t u k s e t + i h m i s o i k e u s j u l i s t u k s i a + i h m i s o i k e u s j u l i s t u s + i h m i s o i k e u s j u l i s t u s t a + i h m i s o i k e u s j u l i s t u s t e n + i h m i s o i k e u s j u l k i l a u s u m i a + i h m i s o i k e u s j u r i s t e j a + i h m i s o i k e u s j u r i s t i + i h m i s o i k e u s j u r i s t i n a + i h m i s o i k e u s j u r i s t i t + i h m i s o i k e u s j ä r j e s t e l m i e n + i h m i s o i k e u s j ä r j e s t e l m ä + i h m i s o i k e u s j ä r j e s t e l m ä n + i h m i s o i k e u s j ä r j e s t e l m ä ä + i h m i s o i k e u s j ä r j e s t ö + i h m i s o i k e u s j ä r j e s t ö i h i n + i h m i s o i k e u s j ä r j e s t ö i l l e + i h m i s o i k e u s j ä r j e s t ö i l l ä + i h m i s o i k e u s j ä r j e s t ö i l t ä + i h m i s o i k e u s j ä r j e s t ö i s s ä + i h m i s o i k e u s j ä r j e s t ö i s t ä + i h m i s o i k e u s j ä r j e s t ö j e n + i h m i s o i k e u s j ä r j e s t ö j ä + i h m i s o i k e u s j ä r j e s t ö l l e + i h m i s o i k e u s j ä r j e s t ö l l ä + i h m i s o i k e u s j ä r j e s t ö l t ä + i h m i s o i k e u s j ä r j e s t ö n + i h m i s o i k e u s j ä r j e s t ö s s ä + i h m i s o i k e u s j ä r j e s t ö s t ä + i h m i s o i k e u s j ä r j e s t ö t + i h m i s o i k e u s j ä r j e s t ö ä + i h m i s o i k e u s k a s v a t u k s e n + i h m i s o i k e u s k a t a s t r o f i + i h m i s o i k e u s k a t a s t r o f i a + i h m i s o i k e u s k a t a s t r o f i n + i h m i s o i k e u s k a t s a u k s e s s a + i h m i s o i k e u s k a t s a u s + i h m i s o i k e u s k e h i t y k s e n + i h m i s o i k e u s k e h i t y s + i h m i s o i k e u s k e h i t y s t ä + i h m i s o i k e u s k e h y s t ä + i h m i s o i k e u s k e r t o m u k s e n + i h m i s o i k e u s k e r t o m u k s e s t a + i h m i s o i k e u s k e r t o m u s + i h m i s o i k e u s k e r t o m u s t a + i h m i s o i k e u s k e s k u k s e e n + i h m i s o i k e u s k e s k u k s e n + i h m i s o i k e u s k e s k u s + i h m i s o i k e u s k e s k u s t e l u + i h m i s o i k e u s k e s k u s t e l u a + i h m i s o i k e u s k e s k u s t e l u i h i n + i h m i s o i k e u s k e s k u s t e l u i s s a + i h m i s o i k e u s k e s k u s t e l u i s t a + i h m i s o i k e u s k e s k u s t e l u j a + i h m i s o i k e u s k e s k u s t e l u j e n + i h m i s o i k e u s k e s k u s t e l u n + i h m i s o i k e u s k e s k u s t e l u n s a + i h m i s o i k e u s k e s k u s t e l u s s a + i h m i s o i k e u s k e s k u s t e l u t + i h m i s o i k e u s k e s k u s t e l u u n + i h m i s o i k e u s k i r j a + i h m i s o i k e u s k i r j a a + i h m i s o i k e u s k i r j a s s a + i h m i s o i k e u s k l a u s u u l e j a + i h m i s o i k e u s k l a u s u u l i k s i + i h m i s o i k e u s k o k o e l m a + i h m i s o i k e u s k o k o u k s e e n + i h m i s o i k e u s k o k o u s + i h m i s o i k e u s k o k o u s t a + i h m i s o i k e u s k o m i s s a a r i + i h m i s o i k e u s k o m i s s a a r i n + i h m i s o i k e u s k o m i s s i o + i h m i s o i k e u s k o m i s s i o i t a + i h m i s o i k e u s k o m i s s i o k i n + i h m i s o i k e u s k o m i s s i o l l e e n + i h m i s o i k e u s k o m i s s i o l t a + i h m i s o i k e u s k o m i s s i o n + i h m i s o i k e u s k o m i s s i o o n + i h m i s o i k e u s k o m i s s i o s s a + i h m i s o i k e u s k o m i s s i o s t a + i h m i s o i k e u s k o m i s s i o t a + i h m i s o i k e u s k o m i t e a + i h m i s o i k e u s k o m i t e a a n + i h m i s o i k e u s k o m i t e a l l e + i h m i s o i k e u s k o m i t e a n + i h m i s o i k e u s k o m i t e a s s a + i h m i s o i k e u s k o m i t e a s t a + i h m i s o i k e u s k o n e i s t o n + i h m i s o i k e u s k o n f e r e n s s i + i h m i s o i k e u s k o n f e r e n s s i n + i h m i s o i k e u s k o n f e r e n s s i s s a + i h m i s o i k e u s k o n s u l t a a t i o i h i n + i h m i s o i k e u s k o n s u l t a a t i o t + i h m i s o i k e u s k o n t a k t i r y h m ä n + i h m i s o i k e u s k o o r d i n a a t t o r i n a + i h m i s o i k e u s k o t i s i v u n + i h m i s o i k e u s k o u k k a u k s e t + i h m i s o i k e u s k o u l u t u s t a + i h m i s o i k e u s k r i i s e i h i n + i h m i s o i k e u s k r i i s i + i h m i s o i k e u s k r i i s i n + i h m i s o i k e u s k r i i s i s s ä + i h m i s o i k e u s k r i i s i s t ä + i h m i s o i k e u s k r i i s i ä + i h m i s o i k e u s k r i t e e r i e n + i h m i s o i k e u s k r i t e e r i t + i h m i s o i k e u s k u l t t u u r i a + i h m i s o i k e u s k u l t t u u r i n + i h m i s o i k e u s k u l t t u u r i s s a + i h m i s o i k e u s k u u l e m i s i s s a m m e + i h m i s o i k e u s k u v a a n + i h m i s o i k e u s k y s y m y k s e e n + i h m i s o i k e u s k y s y m y k s e n + i h m i s o i k e u s k y s y m y k s e n ä + i h m i s o i k e u s k y s y m y k s e s s ä + i h m i s o i k e u s k y s y m y k s e s t ä + i h m i s o i k e u s k y s y m y k s e t + i h m i s o i k e u s k y s y m y k s i e n + i h m i s o i k e u s k y s y m y k s i i n + i h m i s o i k e u s k y s y m y k s i k s i + i h m i s o i k e u s k y s y m y k s i l l e + i h m i s o i k e u s k y s y m y k s i l l ä + i h m i s o i k e u s k y s y m y k s i n ä + i h m i s o i k e u s k y s y m y k s i s s ä + i h m i s o i k e u s k y s y m y k s i s t ä + i h m i s o i k e u s k y s y m y k s i ä + i h m i s o i k e u s k y s y m y k s i ä k i n + i h m i s o i k e u s k y s y m y s + i h m i s o i k e u s k y s y m y s t e n + i h m i s o i k e u s k y s y m y s t ä + i h m i s o i k e u s k ä s i t e t t ä + i h m i s o i k e u s k ä s i t t e e n + i h m i s o i k e u s k ä s i t t e e s t ä + i h m i s o i k e u s k ä s i t y k s i i n + i h m i s o i k e u s k ä s i t y s + i h m i s o i k e u s k ä s i t y s t e m m e + i h m i s o i k e u s k ä y t ä n n ö n + i h m i s o i k e u s k ä y t ä n t ö + i h m i s o i k e u s k ä y t ä n t ö j e n + i h m i s o i k e u s l a i n + i h m i s o i k e u s l a i n s ä ä d ä n n ö n + i h m i s o i k e u s l a i n s ä ä d ä n n ö s s ä + i h m i s o i k e u s l a i n s ä ä d ä n t ö + i h m i s o i k e u s l a i n s ä ä d ä n t ö ä + i h m i s o i k e u s l a i t o k s e n + i h m i s o i k e u s l a k e j a + i h m i s o i k e u s l a k i + i h m i s o i k e u s l a k i e n + i h m i s o i k e u s l a u s e k e + i h m i s o i k e u s l a u s e k e t t a + i h m i s o i k e u s l a u s e k k e e l l a + i h m i s o i k e u s l a u s e k k e e l l e + i h m i s o i k e u s l a u s e k k e e n + i h m i s o i k e u s l a u s e k k e e s e e n + i h m i s o i k e u s l a u s e k k e e s t a + i h m i s o i k e u s l a u s e k k e e t + i h m i s o i k e u s l a u s e k k e i d e n + i h m i s o i k e u s l a u s e k k e i l l a + i h m i s o i k e u s l a u s e k k e i l l e + i h m i s o i k e u s l a u s e k k e i n a + i h m i s o i k e u s l a u s e k k e i n e e n + i h m i s o i k e u s l a u s e k k e i s i i n + i h m i s o i k e u s l a u s e k k e i s t a + i h m i s o i k e u s l a u s e k k e i t a + i h m i s o i k e u s l a u s e k k e i t a a n + i h m i s o i k e u s l a u s u n t o j a + i h m i s o i k e u s l i i g a + i h m i s o i k e u s l i i k e + i h m i s o i k e u s l i i k e t t ä + i h m i s o i k e u s l i i k k e e n + i h m i s o i k e u s l i i k k e e s e e n + i h m i s o i k e u s l i i k k e e t + i h m i s o i k e u s l i i k k e i s i i n + i h m i s o i k e u s l i i t o n + i h m i s o i k e u s l i i t t o + i h m i s o i k e u s l i i t t o a + i h m i s o i k e u s l i i t t o o n + i h m i s o i k e u s l o u k k a a j i e n + i h m i s o i k e u s l o u k k a u k s e e n + i h m i s o i k e u s l o u k k a u k s e k s i + i h m i s o i k e u s l o u k k a u k s e n + i h m i s o i k e u s l o u k k a u k s e n a + i h m i s o i k e u s l o u k k a u k s e n s a + i h m i s o i k e u s l o u k k a u k s e s t a + i h m i s o i k e u s l o u k k a u k s e t + i h m i s o i k e u s l o u k k a u k s i a + i h m i s o i k e u s l o u k k a u k s i a a n + i h m i s o i k e u s l o u k k a u k s i e n + i h m i s o i k e u s l o u k k a u k s i i n + i h m i s o i k e u s l o u k k a u k s i l l a + i h m i s o i k e u s l o u k k a u k s i l l e + i h m i s o i k e u s l o u k k a u k s i l t a + i h m i s o i k e u s l o u k k a u k s i n a + i h m i s o i k e u s l o u k k a u k s i s s a + i h m i s o i k e u s l o u k k a u k s i s t a + i h m i s o i k e u s l o u k k a u k s i s t a a n + i h m i s o i k e u s l o u k k a u s + i h m i s o i k e u s l o u k k a u s s y y t t e i t ä + i h m i s o i k e u s l o u k k a u s t a + i h m i s o i k e u s l o u k k a u s t a p a u k s i a + i h m i s o i k e u s l o u k k a u s t a p a u s t e n + i h m i s o i k e u s l o u k k a u s t e n + i h m i s o i k e u s l o u k k a u s u u t i s i s t a + i h m i s o i k e u s l u k u + i h m i s o i k e u s l u k u u n + i h m i s o i k e u s l u p a u k s i a + i h m i s o i k e u s l u p a u k s i i n + i h m i s o i k e u s l ä h e t t i l ä s + i h m i s o i k e u s m a i n e + i h m i s o i k e u s m a i n e i n e e n + i h m i s o i k e u s m a l l i a a n + i h m i s o i k e u s m a n t r a n + i h m i s o i k e u s m e k a n i s m i e n + i h m i s o i k e u s m i e t i n n ö n + i h m i s o i k e u s m i e t i n n ö s s ä + i h m i s o i k e u s m i e t i n n ö s s ä n i + i h m i s o i k e u s m i e t i n n ö s t ä + i h m i s o i k e u s m i e t i n t ö + i h m i s o i k e u s m i e t i n t ö j e n + i h m i s o i k e u s m i e t i n t ö n s ä + i h m i s o i k e u s m i e t i n t ö ä + i h m i s o i k e u s m i n i s t e r i + i h m i s o i k e u s m i n i s t e r i ö l l ä + i h m i s o i k e u s m u u t o s e s i t y k s i ä + i h m i s o i k e u s m y ö n t e i n e n + i h m i s o i k e u s m ä ä r i t e l m ä n + i h m i s o i k e u s m ä ä r ä r a h o j a + i h m i s o i k e u s m ä ä r ä r a h o j e n + i h m i s o i k e u s m ä ä r ä y k s i ä + i h m i s o i k e u s m ä ä r ä y s t e n + i h m i s o i k e u s n e u v o n a n t a j a + i h m i s o i k e u s n e u v o s t o + i h m i s o i k e u s n e u v o s t o a + i h m i s o i k e u s n e u v o s t o k s i + i h m i s o i k e u s n e u v o s t o l l a + i h m i s o i k e u s n e u v o s t o l l e + i h m i s o i k e u s n e u v o s t o l t a + i h m i s o i k e u s n e u v o s t o n + i h m i s o i k e u s n e u v o s t o o n + i h m i s o i k e u s n e u v o s t o s s a + i h m i s o i k e u s n e u v o s t o s t a + i h m i s o i k e u s n e u v o t t e l u i s s a + i h m i s o i k e u s n e u v o t t e l u t + i h m i s o i k e u s n o r m e i h i n + i h m i s o i k e u s n o r m e i s t a + i h m i s o i k e u s n o r m e j a + i h m i s o i k e u s n o r m i + i h m i s o i k e u s n o r m i e n + i h m i s o i k e u s n o r m i t + i h m i s o i k e u s n ä k e m y k s i ä + i h m i s o i k e u s n ä k e m y k s i ä m m e + i h m i s o i k e u s n ä k e m y s + i h m i s o i k e u s n ä k e m y s t ä + i h m i s o i k e u s n ä k ö k a n t a a + i h m i s o i k e u s n ä k ö k o h d a t + i h m i s o i k e u s n ä k ö k o h t a + i h m i s o i k e u s n ä k ö k o h t a a n + i h m i s o i k e u s n ä k ö k o h t i a + i h m i s o i k e u s n ä k ö k o h t i e n + i h m i s o i k e u s n ä k ö k u l m a + i h m i s o i k e u s n ä k ö k u l m a a + i h m i s o i k e u s n ä k ö k u l m i s t a + i h m i s o i k e u s o h j e l m a + i h m i s o i k e u s o h j e l m a n + i h m i s o i k e u s o h j e l m i a + i h m i s o i k e u s o h j e l m i s s a m m e + i h m i s o i k e u s o i k e u s l a i n s ä ä d ä n n ö n + i h m i s o i k e u s o l o j e n + i h m i s o i k e u s o l o t + i h m i s o i k e u s o n g e l m a + i h m i s o i k e u s o n g e l m a a + i h m i s o i k e u s o n g e l m a a n + i h m i s o i k e u s o n g e l m a k s i + i h m i s o i k e u s o n g e l m a n + i h m i s o i k e u s o n g e l m a n a + i h m i s o i k e u s o n g e l m a s t a + i h m i s o i k e u s o n g e l m a t + i h m i s o i k e u s o n g e l m i a + i h m i s o i k e u s o n g e l m i e n + i h m i s o i k e u s o n g e l m i i n + i h m i s o i k e u s o n g e l m i l l a + i h m i s o i k e u s o n g e l m i s t a + i h m i s o i k e u s o p e r a a t i o i l l e + i h m i s o i k e u s o p i n n o i n + i h m i s o i k e u s o p p i i n + i h m i s o i k e u s o s a s t o + i h m i s o i k e u s p a i n o t t e i n e n + i h m i s o i k e u s p a l k i n n o n + i h m i s o i k e u s p a l k i n t o + i h m i s o i k e u s p a l k i n t o a + i h m i s o i k e u s p a r a t i i s i + i h m i s o i k e u s p e r i a a t e t t a + i h m i s o i k e u s p e r i a a t t e e n + i h m i s o i k e u s p e r i a a t t e e t + i h m i s o i k e u s p e r i a a t t e i d e n + i h m i s o i k e u s p e r i a a t t e i s i i n + i h m i s o i k e u s p e r i a a t t e i s t a + i h m i s o i k e u s p e r i a a t t e i s t a m m e + i h m i s o i k e u s p e r i a a t t e i t a + i h m i s o i k e u s p e r i a a t t e i t a m m e + i h m i s o i k e u s p e r i n n e + i h m i s o i k e u s p e r i n t e e n + i h m i s o i k e u s p e r i n t e i d e n + i h m i s o i k e u s p e r i n t e i t ä + i h m i s o i k e u s p e r u s k i r j a + i h m i s o i k e u s p e r u s k i r j a a + i h m i s o i k e u s p e r u s k i r j a s t a + i h m i s o i k e u s p e r u s t a i s e l l a + i h m i s o i k e u s p e r u s t e e t + i h m i s o i k e u s p e r u s t e i l l a + i h m i s o i k e u s p e r u s t e i n + i h m i s o i k e u s p o l i i t t i s e t + i h m i s o i k e u s p o l i t i i k a l l a + i h m i s o i k e u s p o l i t i i k a l l e + i h m i s o i k e u s p o l i t i i k a n + i h m i s o i k e u s p o l i t i i k a s s a + i h m i s o i k e u s p o l i t i i k a s s a a n + i h m i s o i k e u s p o l i t i i k a s s a m m e + i h m i s o i k e u s p o l i t i i k a s t a + i h m i s o i k e u s p o l i t i i k a s t a m m e + i h m i s o i k e u s p o l i t i i k k a + i h m i s o i k e u s p o l i t i i k k a a + i h m i s o i k e u s p o l i t i i k k a a m m e + i h m i s o i k e u s p o l i t i i k k a a n + i h m i s o i k e u s p o l i t i i k k a a n s a + i h m i s o i k e u s p o l i t i i k k a m m e + i h m i s o i k e u s p o l i t i i k k a n s a + i h m i s o i k e u s p o l i t i i k k o j a + i h m i s o i k e u s p o l i t i i k k o j e n + i h m i s o i k e u s p r o b l e m a t i i k a l l e + i h m i s o i k e u s p r o b l e m a t i i k a n + i h m i s o i k e u s p r o j e k t i e n + i h m i s o i k e u s p u o l u s t a j a + i h m i s o i k e u s p u o l u s t a j a a + i h m i s o i k e u s p u o l u s t a j i a + i h m i s o i k e u s p u o l u s t a j i e n + i h m i s o i k e u s p ä i v ä n + i h m i s o i k e u s p ä i v ä ä + i h m i s o i k e u s p ä i v ä ä n + i h m i s o i k e u s p ä ä t ö k s e t + i h m i s o i k e u s p ä ä t ö s l a u s e l m a + i h m i s o i k e u s p ä ä t ö s l a u s e l m a a + i h m i s o i k e u s p ä ä t ö s l a u s e l m a n + i h m i s o i k e u s p ä ä t ö s l a u s e l m a s t a + i h m i s o i k e u s p ä ä t ö s l a u s e l m a t + i h m i s o i k e u s p ä ä t ö s l a u s e l m i s s a + i h m i s o i k e u s p ä ä v a l t u u t e t t u a + i h m i s o i k e u s r a h a s t o n + i h m i s o i k e u s r a k e n n e + i h m i s o i k e u s r a k e n t e e s t a + i h m i s o i k e u s r a k e n t e i s t a + i h m i s o i k e u s r a p o r t e i l t a + i h m i s o i k e u s r a p o r t e i s s a + i h m i s o i k e u s r a p o r t i n + i h m i s o i k e u s r a p o r t i s s a + i h m i s o i k e u s r a p o r t i s t a + i h m i s o i k e u s r a p o r t o i j a n + i h m i s o i k e u s r a p o r t o i j a n a + i h m i s o i k e u s r a p o r t o i j i a + i h m i s o i k e u s r a p o r t t i + i h m i s o i k e u s r a p o r t t i a + i h m i s o i k e u s r a p o r t t i i n + i h m i s o i k e u s r e k i s t e r i n + i h m i s o i k e u s r e t o r i i k k a + i h m i s o i k e u s r e t o r i i k k a a + i h m i s o i k e u s r i k k o j i a + i h m i s o i k e u s r i k k o j i e n + i h m i s o i k e u s r i k k o j i i n + i h m i s o i k e u s r i k k o m i s t e n + i h m i s o i k e u s r i k k o m u k i s t a + i h m i s o i k e u s r i k k o m u k s e e n + i h m i s o i k e u s r i k k o m u k s e k s i + i h m i s o i k e u s r i k k o m u k s e l t a + i h m i s o i k e u s r i k k o m u k s e n + i h m i s o i k e u s r i k k o m u k s e n a + i h m i s o i k e u s r i k k o m u k s e s t a + i h m i s o i k e u s r i k k o m u k s e t + i h m i s o i k e u s r i k k o m u k s i a + i h m i s o i k e u s r i k k o m u k s i e n + i h m i s o i k e u s r i k k o m u k s i i n + i h m i s o i k e u s r i k k o m u k s i l l e + i h m i s o i k e u s r i k k o m u k s i l t a + i h m i s o i k e u s r i k k o m u k s i n a + i h m i s o i k e u s r i k k o m u k s i n e e n + i h m i s o i k e u s r i k k o m u k s i s s a + i h m i s o i k e u s r i k k o m u k s i s t a + i h m i s o i k e u s r i k k o m u k s i s t a a n + i h m i s o i k e u s r i k k o m u s + i h m i s o i k e u s r i k k o m u s t a + i h m i s o i k e u s r i k k o m u s t a p a u k s i s s a + i h m i s o i k e u s r i k k o m u s t a p a u k s i s t a + i h m i s o i k e u s r i k k o m u s t e n + i h m i s o i k e u s r i k k o m u s t o i m e t + i h m i s o i k e u s r i k o k s e t + i h m i s o i k e u s r i k o k s i a + i h m i s o i k e u s r i k o k s i i n + i h m i s o i k e u s r i k o k s i s t a + i h m i s o i k e u s r i k o s + i h m i s o i k e u s r i k o s t e n + i h m i s o i k e u s r i n t a m a a + i h m i s o i k e u s r y h m i e n + i h m i s o i k e u s r y h m i s s ä + i h m i s o i k e u s r y h m ä n + i h m i s o i k e u s r y h m ä s s ä + i h m i s o i k e u s r y h m ä t + i h m i s o i k e u s r y h m ä ä + i h m i s o i k e u s r y h m ä ä n + i h m i s o i k e u s s a n o m a a + i h m i s o i k e u s s e i k k o j a + i h m i s o i k e u s s e k t o r i l l a + i h m i s o i k e u s s e m i n a a r i n + i h m i s o i k e u s s e m i n a a r i s t a + i h m i s o i k e u s s e u r a n t a a + i h m i s o i k e u s s i r k u k s e k s i + i h m i s o i k e u s s i r k u k s e s t a + i h m i s o i k e u s s i t o u m u k s i a + i h m i s o i k e u s s i t o u m u k s i a a n + i h m i s o i k e u s s i t o u m u k s i e n + i h m i s o i k e u s s i t o u m u k s i s t a + i h m i s o i k e u s s i t o u m u s t e n + i h m i s o i k e u s s o p i m u k s e e n + i h m i s o i k e u s s o p i m u k s e l l a + i h m i s o i k e u s s o p i m u k s e l l e + i h m i s o i k e u s s o p i m u k s e n + i h m i s o i k e u s s o p i m u k s e n s a + i h m i s o i k e u s s o p i m u k s e s s a + i h m i s o i k e u s s o p i m u k s e s t a + i h m i s o i k e u s s o p i m u k s e t + i h m i s o i k e u s s o p i m u k s i a + i h m i s o i k e u s s o p i m u k s i i n + i h m i s o i k e u s s o p i m u k s i s s a + i h m i s o i k e u s s o p i m u k s i s t a + i h m i s o i k e u s s o p i m u s + i h m i s o i k e u s s o p i m u s t a + i h m i s o i k e u s s o p i m u s t e n + i h m i s o i k e u s s t a n d a r d e j a + i h m i s o i k e u s s t a n d a r d e j a a n + i h m i s o i k e u s s t a n d a r d i a + i h m i s o i k e u s s t a n d a r d i e n + i h m i s o i k e u s s t a n d a r d i m m e + i h m i s o i k e u s s t a n d a r d i t + i h m i s o i k e u s s t r a t e g i a + i h m i s o i k e u s s t r a t e g i a a + i h m i s o i k e u s s t r a t e g i a a n + i h m i s o i k e u s s t r a t e g i a l l a + i h m i s o i k e u s s t r a t e g i a s t a + i h m i s o i k e u s s t r a t e g i a t + i h m i s o i k e u s s t r a t e g i o i d e n + i h m i s o i k e u s s t r a t e g i o i t a + i h m i s o i k e u s s u u n n i t e l m a n + i h m i s o i k e u s s u u n t a v i i v a a + i h m i s o i k e u s s u u n t a v i i v o j a + i h m i s o i k e u s s u u n t a v i i v o j e n + i h m i s o i k e u s s y i s t ä + i h m i s o i k e u s s y y t + i h m i s o i k e u s s y y t ö k s i ä + i h m i s o i k e u s s ä ä d ö s t e n + i h m i s o i k e u s s ä ä n n ö k s i ä + i h m i s o i k e u s s ä ä n n ö s t e n + i h m i s o i k e u s s ä ä n n ö t + i h m i s o i k e u s s ä ä n t ö i h i n + i h m i s o i k e u s s ä ä n t ö j e n + i h m i s o i k e u s s ä ä n t ö j ä + i h m i s o i k e u s s ä ä t i ö + i h m i s o i k e u s s ä ä t i ö n + i h m i s o i k e u s s ä ä t i ö ö n + i h m i s o i k e u s t a i s t e l i j a + i h m i s o i k e u s t a i s t e l i j a n + i h m i s o i k e u s t a i s t e l i j a n a + i h m i s o i k e u s t a i s t e l i j a t + i h m i s o i k e u s t a i s t e l i j o i d e n + i h m i s o i k e u s t a i s t e l i j o i l l e + i h m i s o i k e u s t a i s t e l i j o i n a + i h m i s o i k e u s t a i s t e l i j o i s t a + i h m i s o i k e u s t a i s t e l i j o i t a + i h m i s o i k e u s t a i s t e l u a + i h m i s o i k e u s t a i s t e l u n + i h m i s o i k e u s t a p a u k s e s t a + i h m i s o i k e u s t a p a u k s i a + i h m i s o i k e u s t a p a u k s i i n + i h m i s o i k e u s t a p a u k s i n a + i h m i s o i k e u s t a p a u k s i s t a + i h m i s o i k e u s t a r k i s t u s + i h m i s o i k e u s t a r k k a i l i j a n + i h m i s o i k e u s t a r k k a i l i j o i d e n + i h m i s o i k e u s t a r k k a i l i j o i k s i + i h m i s o i k e u s t a r k k a i l i j o i t a + i h m i s o i k e u s t a r k k a i l u n + i h m i s o i k e u s t a v o i t t e e n + i h m i s o i k e u s t a v o i t t e i d e n + i h m i s o i k e u s t a v o i t t e i s i i n + i h m i s o i k e u s t e e m a k s i + i h m i s o i k e u s t e e m o i l l a + i h m i s o i k e u s t e o l l i s u u d e n + i h m i s o i k e u s t i l a n n e + i h m i s o i k e u s t i l a n n e k i n + i h m i s o i k e u s t i l a n n e t t a + i h m i s o i k e u s t i l a n n e t t a a n + i h m i s o i k e u s t i l a n t e e l l e + i h m i s o i k e u s t i l a n t e e l t a + i h m i s o i k e u s t i l a n t e e n + i h m i s o i k e u s t i l a n t e e n s a + i h m i s o i k e u s t i l a n t e e s e e n + i h m i s o i k e u s t i l a n t e e s e e n s a + i h m i s o i k e u s t i l a n t e e s s a + i h m i s o i k e u s t i l a n t e e s t a + i h m i s o i k e u s t i l a n t e e s t a a n + i h m i s o i k e u s t i l a n t e e t + i h m i s o i k e u s t i l a n t e i s i i n + i h m i s o i k e u s t i l a n t e i s s a + i h m i s o i k e u s t i l a n t e i s t a + i h m i s o i k e u s t i l a n t e i t a + i h m i s o i k e u s t i l a s t o j a + i h m i s o i k e u s t i l a s t o j e n + i h m i s o i k e u s t i l a s t o n s a + i h m i s o i k e u s t i l a s t o t + i h m i s o i k e u s t o i m e t + i h m i s o i k e u s t o i m i a + i h m i s o i k e u s t o i m i e l i m e n + i h m i s o i k e u s t o i m i e n + i h m i s o i k e u s t o i m i i n + i h m i s o i k e u s t o i m i j a + i h m i s o i k e u s t o i m i k s i + i h m i s o i k e u s t o i m i k u n n a l l a + i h m i s o i k e u s t o i m i k u n n a l l e + i h m i s o i k e u s t o i m i k u n n a n + i h m i s o i k e u s t o i m i k u n n a s s a + i h m i s o i k e u s t o i m i k u n n a s t a + i h m i s o i k e u s t o i m i k u n t a + i h m i s o i k e u s t o i m i k u n t a a + i h m i s o i k e u s t o i m i k u n t a a n + i h m i s o i k e u s t o i m i n n a n + i h m i s o i k e u s t o i m i n n a s t a a n + i h m i s o i k e u s t o i m i n t a + i h m i s o i k e u s t o i m i n t a a + i h m i s o i k e u s t o i m i n t a a n + i h m i s o i k e u s t o i m i n t a o h j e l m i s t a + i h m i s o i k e u s t o i m i n t o j a + i h m i s o i k e u s t o i m i s t a + i h m i s o i k e u s t o i m i s t o a + i h m i s o i k e u s t o i m i s t o l l e + i h m i s o i k e u s t o i m i s t o n + i h m i s o i k e u s t o i m i s t o o n + i h m i s o i k e u s t r o i k a n + i h m i s o i k e u s t r o i k k a a + i h m i s o i k e u s t u o m a r i n a + i h m i s o i k e u s t u o m i o i s t u i m e e n + i h m i s o i k e u s t u o m i o i s t u i m e l l a + i h m i s o i k e u s t u o m i o i s t u i m e l l e + i h m i s o i k e u s t u o m i o i s t u i m e n + i h m i s o i k e u s t u o m i o i s t u i m e s s a + i h m i s o i k e u s t u o m i o i s t u i m i a + i h m i s o i k e u s t u o m i o i s t u i n + i h m i s o i k e u s t u o m i o i s t u i n t a + i h m i s o i k e u s t y y p p i e n + i h m i s o i k e u s t y ö + i h m i s o i k e u s t y ö h ö n + i h m i s o i k e u s t y ö l l e m m e + i h m i s o i k e u s t y ö l l ä + i h m i s o i k e u s t y ö n + i h m i s o i k e u s t y ö n t e k i j ä t + i h m i s o i k e u s t y ö n t e k i j ö i t ä + i h m i s o i k e u s t y ö r y h m i ä + i h m i s o i k e u s t y ö r y h m ä + i h m i s o i k e u s t y ö r y h m ä n + i h m i s o i k e u s t y ö r y h m ä s s ä + i h m i s o i k e u s t y ö s s ä + i h m i s o i k e u s t y ö s s ä m m e + i h m i s o i k e u s t y ö s s ä ä n + i h m i s o i k e u s t y ö s t ä + i h m i s o i k e u s t y ö t ä + i h m i s o i k e u s u l o t t u v u u d e n + i h m i s o i k e u s u l o t t u v u u d e s t a + i h m i s o i k e u s u l o t t u v u u s + i h m i s o i k e u s u l o t t u v u u t e e n + i h m i s o i k e u s u l o t t u v u u t t a + i h m i s o i k e u s u u d i s t u k s i a + i h m i s o i k e u s u u d i s t u k s i i n + i h m i s o i k e u s v a a t i m u k s i a + i h m i s o i k e u s v a a t i m u s t e n + i h m i s o i k e u s v a l i o k u n n a l l e + i h m i s o i k e u s v a l i o k u n n a n + i h m i s o i k e u s v a l i o k u n t a + i h m i s o i k e u s v a l t u u s k u n n a n + i h m i s o i k e u s v a l t u u s k u n t a + i h m i s o i k e u s v a l t u u t e t t u + i h m i s o i k e u s v a l t u u t e t t u a + i h m i s o i k e u s v a l t u u t e t t u j e n + i h m i s o i k e u s v a l t u u t e t u l l a + i h m i s o i k e u s v a l t u u t e t u l l e + i h m i s o i k e u s v a l t u u t e t u l t a + i h m i s o i k e u s v a l t u u t e t u n + i h m i s o i k e u s v a s t a a v a n a + i h m i s o i k e u s v e l v o i t t e e t + i h m i s o i k e u s v e l v o i t t e i d e n + i h m i s o i k e u s v e l v o i t t e i s t a + i h m i s o i k e u s v e l v o i t t e i t a + i h m i s o i k e u s v e l v o i t t e i t a a n + i h m i s o i k e u s v e r k o s t o n + i h m i s o i k e u s v e t o o m u s t e n + i h m i s o i k e u s v i e s t i n + i h m i s o i k e u s v i r a s t o + i h m i s o i k e u s v i r a s t o a + i h m i s o i k e u s v i r a s t o k s i + i h m i s o i k e u s v i r a s t o l l a + i h m i s o i k e u s v i r a s t o n + i h m i s o i k e u s v i r a s t o s t a + i h m i s o i k e u s v u o r o p u h e l u + i h m i s o i k e u s v u o r o p u h e l u a + i h m i s o i k e u s v u o r o p u h e l u i d e n + i h m i s o i k e u s v u o r o p u h e l u i h i n + i h m i s o i k e u s v u o r o p u h e l u i l l a + i h m i s o i k e u s v u o r o p u h e l u i s s a + i h m i s o i k e u s v u o r o p u h e l u i s s a a n + i h m i s o i k e u s v u o r o p u h e l u i t a + i h m i s o i k e u s v u o r o p u h e l u j a + i h m i s o i k e u s v u o r o p u h e l u j e n + i h m i s o i k e u s v u o r o p u h e l u l l a + i h m i s o i k e u s v u o r o p u h e l u l l e + i h m i s o i k e u s v u o r o p u h e l u m m e + i h m i s o i k e u s v u o r o p u h e l u n + i h m i s o i k e u s v u o r o p u h e l u s s a + i h m i s o i k e u s v u o r o p u h e l u s s a m m e + i h m i s o i k e u s v u o r o p u h e l u s t a + i h m i s o i k e u s v u o r o p u h e l u t + i h m i s o i k e u s v u o r o p u h e l u u n + i h m i s o i k e u s v ä l i n e + i h m i s o i k e u s v ä l i n e e n + i h m i s o i k e u s v ä l i n e e s e e n + i h m i s o i k e u s v ä l i n e e s s ä + i h m i s o i k e u s v ä l i n e e s t ä + i h m i s o i k e u s v ä l i n e e t + i h m i s o i k e u s v ä l i n e i d e n + i h m i s o i k e u s v ä l i n e i s s ä + i h m i s o i k e u s v ä l i n e i s t ä + i h m i s o i k e u s v ä l i n e i t ä + i h m i s o i k e u s v ä l i n e i t ä ä n + i h m i s o i k e u s v ä l i n e t t ä + i h m i s o i k e u s v ä ä r i n k ä y t ö s t e n + i h m i s o i k e u s y h d i s t y k s e n + i h m i s o i k e u s y h d i s t y s + i h m i s o i k e u s y h d i s t y s t e n + i h m i s o i k e u s y h d i s t y s t ä + i h m i s o i k e u s y h t e i s ö + i h m i s o i k e u s y h t e i s ö k s i + i h m i s o i k e u s y h t e i s ö l l e + i h m i s o i k e u s y h t e i s ö n + i h m i s o i k e u s y h t e y k s i s s ä + i h m i s o i k e u s y k s i k k ö + i h m i s o i k e u s y k s i k ö l l ä + i h m i s o i k e u s y k s i k ö n + i h m i s o i k e u s y l e i s s o p i m u k s e e n + i h m i s o i k e u s y l e i s s o p i m u k s e n + i h m i s o i k e u s y l e i s s o p i m u k s e s s a + i h m i s o i k e u s y l e i s s o p i m u k s e t + i h m i s o i k e u s y l e i s s o p i m u k s i a + i h m i s o i k e u s y l e i s s o p i m u k s i s t a + i h m i s o i k e u s y l e i s s o p i m u s + i h m i s o i k e u s y l e i s s o p i m u s t a + i h m i s o i k e u s y l e i s s o p i m u s t e n + i h m i s o i k e u t e e n + i h m i s o i k e u t e m m e + i h m i s o i k e u t e n a + i h m i s o i k e u t e n s a + i h m i s o i k e u t t a + i h m i s o l e n n o n + i h m i s o l e n n o t + i h m i s o l e n t o a + i h m i s o l e n t o j a + i h m i s o l e n t o j e n + i h m i s p a r a t + i h m i s p a r k o j a + i h m i s p e r h e e n + i h m i s p e r h e e n j ä s e n e t + i h m i s p e r h e e s s ä m m e + i h m i s p e t o + i h m i s p o l o i s i a + i h m i s p o l o i s t e n + i h m i s p o l o j a + i h m i s p o m m e i n a + i h m i s p o m m i t + i h m i s p o t i l a i d e n + i h m i s p o t i l a i s i i n + i h m i s p r o t e i i n i a + i h m i s p r o t e i i n i n + i h m i s r a u k k o i h i n + i h m i s r a u k k o j a + i h m i s r a u n i o i k s i + i h m i s r a v i n n o i k s i + i h m i s r a v i n n o k s i + i h m i s r a v i n n o k s i k i n + i h m i s r a v i n n o n + i h m i s r a v i n t o n a + i h m i s r e s u r s s i e n + i h m i s r o d u i s t a + i h m i s r o d u l l a + i h m i s r o d u l l e + i h m i s r o d u n + i h m i s r o d u s t a + i h m i s r o t u + i h m i s r u k a t + i h m i s r u o a k s i + i h m i s r u u m i i l l a + i h m i s r u u m i i n + i h m i s r u u m i i s e e n + i h m i s r u u m i i s t a + i h m i s r u u m i n + i h m i s r u u m i s + i h m i s r u u m i s t a + i h m i s r y h m i e n + i h m i s r y h m i i n + i h m i s r y h m i l l e + i h m i s r y h m i s t ä + i h m i s r y h m i ä + i h m i s r y h m ä + i h m i s r y h m ä l l e + i h m i s r y h m ä l l ä + i h m i s r y h m ä l t ä + i h m i s r y h m ä n + i h m i s r y h m ä s s ä + i h m i s r y h m ä s t ä + i h m i s r y h m ä t + i h m i s r y h m ä ä + i h m i s r y h m ä ä n + i h m i s s a l a k a u p p i a i d e n + i h m i s s a l a k u l j e t t a j a t + i h m i s s a l a k u l j e t t a j i a + i h m i s s a l a k u l j e t t a j i e n + i h m i s s a l a k u l j e t t a j i l t a + i h m i s s a l a k u l j e t u k s e n + i h m i s s a l a k u l j e t u k s e s t a + i h m i s s a l a k u l j e t u k s i a + i h m i s s a l a k u l j e t u s + i h m i s s a l a k u l j e t u s t a + i h m i s s a l a k u l j e t u s t a p a u s t e n + i h m i s s i e l u + i h m i s s i e l u n + i h m i s s i e l u s s a + i h m i s s i k i ö i l l ä + i h m i s s i k i ö n + i h m i s s i l m ä + i h m i s s i v i l i s a a t i o n + i h m i s s o i h t u + i h m i s s o i k e u s s o p i m u s t a + i h m i s s o l u j a + i h m i s s o l u j e n + i h m i s s u h d e + i h m i s s u h d e k o u l u k u n t a + i h m i s s u h t e e t + i h m i s s u h t e i d e n + i h m i s s u h t e i l l e + i h m i s s u h t e i s s a + i h m i s s u h t e i s t a + i h m i s s u h t e i t a + i h m i s s u k u p o l v i e n + i h m i s s u s i + i h m i s s u v u n + i h m i s s y d ä m e t + i h m i s s y ö j ä + i h m i s t e n + i h m i s t e n k a l t a i s i s t a + i h m i s t e n k i n + i h m i s t e r v e y d e l l e + i h m i s t e r v e y d e n + i h m i s t e r v e y t e e n + i h m i s t i e d e + i h m i s t i e t e e t + i h m i s t o i m i n n a n + i h m i s t r a g e d i a + i h m i s t r a g e d i a n + i h m i s t r a g e d i a t + i h m i s t u h o l a i s i a + i h m i s t y y p p i ä + i h m i s t y ö + i h m i s t y ö v o i m a + i h m i s t y ö v o i m a a + i h m i s t y ö v o i m a n + i h m i s t ä + i h m i s u h r e i h i n + i h m i s u h r e i l t a + i h m i s u h r e j a + i h m i s u h r i + i h m i s u h r i a + i h m i s u h r i e n + i h m i s v a r t a l o a + i h m i s v e r t a + i h m i s v i h a a + i h m i s v i r r a l l e + i h m i s v i r r a n + i h m i s v i r r a s t a + i h m i s v i r r a t + i h m i s v i r t a + i h m i s v i r t a a + i h m i s v i r t a u k s e n + i h m i s v i r t o j e n + i h m i s v o i m a l l a + i h m i s v o i m a v a r o j a + i h m i s v o i m a v a r o j a a n + i h m i s v o i m i n + i h m i s v ä e s t ö l l e + i h m i s v ä e s t ö s t ä + i h m i s y h t e i s k u n n a l l e + i h m i s y h t e i s k u n t a + i h m i s y h t e i s ö + i h m i s y h t e i s ö i l l e + i h m i s y h t e i s ö i s s ä + i h m i s y h t e i s ö n + i h m i s y h t e i s ö s t ä + i h m i s y k s i l ö + i h m i s y k s i l ö i d e n + i h m i s y k s i l ö i l l e + i h m i s y k s i l ö l l e + i h m i s y k s i l ö n + i h m i s y s t ä v ä l l i n e n + i h m i s y s t ä v ä l l i s e m m ä n + i h m i s y s t ä v ä l l i s e m p i + i h m i s y s t ä v ä l l i s e m p i e n + i h m i s y s t ä v ä l l i s e m p ä ä + i h m i s y s t ä v ä l l i s i ä + i h m i s y s t ä v ä l l i s t ä + i h m i s y s t ä v ä l l i s y y t t ä + i h m i s y y d e l l e + i h m i s y y d e n + i h m i s y y t e e n + i h m i s y y t t ä + i h m i s ä l y + i h m i s ä ä n i + i h o k e l i a k i a + i h o k o s k e t u k s e n + i h o n a l a i s k e r r o s + i h o n h o i t o t u o t t e i t a + i h o n s i i r t o j e n + i h o n v ä r i + i h o n v ä r i i n + i h o n v ä r i l t ä ä n + i h o n v ä r i n + i h o n v ä r i s t ä + i h o n v ä r i s t ä ä n + i h o n v ä r i t + i h o n v ä r i ä + i h o s a i r a u k s i a + i h o s a i r a u k s i e n + i h o s y ö p i e n + i h o s y ö p ä + i h o s y ö p ä r i s k i + i h o s y ö p ä t a p a u k s e t + i h o s y ö p ä t a p a u s t e n + i h o s y ö p ä ä + i h o s y ö p ä ä n + i h o s y ö v ä l t ä + i h o s y ö v ä n + i h o s y ö v ä s t ä + i h o s y ö v ä t + i h o t t u m a t a p a u k s i s t a + i h o v a u r i o i t a + i h o v o i d e + i h o v o i t e i s t a + i i r i l ä i s e t + i i r i n + i i r i n k i e l e l l ä + i i r i n k i e l i s e t + i i r i n k i e l i s t e n + i i r i s t ä + i i v a n a n l i n n a + i k i a i k a i n e n + i k i a i k a i s e n + i k i a i k a i s i a + i k i a i k a i s t a + i k i l i i k k u j a + i k i l i i k k u j a a + i k i l i i k k u j a s s a + i k i l i i k k u j a s t a + i k i m e t s i ä + i k i m u i s t e t t a v a + i k i m u i s t o i s e n a + i k i m u i s t o i s i s t a + i k i o n n e l l i s i a + i k i s e n + i k i s e s t ä + i k i v a n h a + i k i v a n h a a + i k i v a n h a n + i k i v a n h a s s a + i k i v a n h a s t a + i k i v a n h a t + i k i v a n h o i s s a + i k i v a n h o j a + i k i v a n h o j e n + i k i v i i s a a n + i k k u n a l a u d a l l a + i k k u n a n + i k k u n a n h a l l i n t a o h j e l m a + i k k u n a n k a r m i t + i k k u n a n k e h y k s e t + i k k u n a n p e s i j ä t + i k k u n a n p u i t t e i s s a + i k k u n a p u i t t e e t + i k k u n a p u i t t e i d e n + i k k u n a v a i h e + i k k u n o i t a + i k o n e i s t a + i k o n i n u r k k a + i k u i s e n a + i k u i s i a + i k u i s i k s i + i k u i s u u s k i v e t + i k u i s u u s k o o d i + i k u i s u u s o n g e l m a + i k u i s u u s o n g e l m i a + i k u i s u u t e e n + i k ä d i r e k t i i v i ä + i k ä i h m i s e t + i k ä i h m i s i l l e + i k ä i h m i s i s t ä + i k ä i h m i s i ä + i k ä i h m i s t e n + i k ä i s e n ä + i k ä i s e t + i k ä i s i k s i + i k ä i s i ä + i k ä i s t ä + i k ä i s y y d e s t ä + i k ä j a k a u m a + i k ä j a k a u m a a + i k ä j o h t a m i n e n + i k ä j o h t a m i s t a + i k ä k a u d e t + i k ä k a u s i e n + i k ä k y s y m y k s e s t ä + i k ä l i s ä t + i k ä l u o k a n + i k ä l u o k a s s a + i k ä l u o k a s t a + i k ä l u o k a t + i k ä l u o k i s s a + i k ä l u o k i t u s j ä r j e s t e l m ä + i k ä l u o k i t u s j ä r j e s t e l m ä n + i k ä l u o k k a + i k ä l u o k k i a + i k ä l u o k k i e n + i k ä n s ä + i k ä n ä k ö k o h d a l l a + i k ä p e r u s t e i s t a + i k ä p r o f i i l i + i k ä p r o f i i l i n + i k ä p y r a m i d i + i k ä p y r a m i d i a + i k ä p y r a m i d i e n + i k ä p y r a m i d i i n + i k ä p y r a m i d i n + i k ä r a j a + i k ä r a j a a + i k ä r a j a a n + i k ä r a j a k s i + i k ä r a j a n + i k ä r a j a s t a + i k ä r a j a t + i k ä r a j o i h i n + i k ä r a j o i l l e + i k ä r a j o i s t a + i k ä r a j o i t u k s e n + i k ä r a j o i t u k s e t + i k ä r a j o i t u k s i a + i k ä r a j o i t u s t e n + i k ä r a j o j a + i k ä r a j o j e n + i k ä r a k e n n e + i k ä r a k e n n e t t a + i k ä r a k e n t e e n + i k ä r a k e n t e e s s a + i k ä r a k e n t e i d e n + i k ä r y h m i e n + i k ä r y h m i i n + i k ä r y h m i l l e + i k ä r y h m i l l ä + i k ä r y h m i s s ä + i k ä r y h m i s t ä + i k ä r y h m i ä + i k ä r y h m ä + i k ä r y h m ä l l e + i k ä r y h m ä l l e e n + i k ä r y h m ä n + i k ä r y h m ä n i + i k ä r y h m ä s s ä + i k ä r y h m ä s t ä + i k ä r y h m ä t + i k ä r y h m ä ä n + i k ä s u o s i t u k s e n + i k ä s y i s t ä + i k ä s y r j i n n ä n + i k ä s y r j i n n ä s t ä + i k ä s y r j i n t ä + i k ä s y r j i n t ä ä + i k ä s y r j i n t ä ä n + i k ä t e k i j ä n + i k ä t i e t o i s e n + i k ä t o v e r i n i + i k ä t o v e r i n s a + i k ä v a a t i m u s + i k ä v a i h e i s s a + i k ä v i m m i s t ä + i k ä v i m m ä k s i + i k ä v i n t ä + i k ä v i s t ä + i k ä v i ä + i k ä v u o d e n + i k ä v u o t e e n + i k ä v y y k s i i n + i k ä v ä k s e m m e + i k ä v ä k s e n i + i k ä v ä l t ä + i k ä v ä m p i i n + i k ä v ä m p ä ä + i k ä v ä n + i k ä v ä s t ä + i k ä v ä ä + i k ä ä n t y e s s ä + i k ä ä n t y e s s ä ä n + i k ä ä n t y m i s e e n + i k ä ä n t y m i s e n + i k ä ä n t y m i s e s t ä + i k ä ä n t y m i s k e h i t y k s e s t ä + i k ä ä n t y m i s k e h i t y s + i k ä ä n t y m i s k y s y m y k s e t + i k ä ä n t y m i s k y s y m y s + i k ä ä n t y m i s o n g e l m a + i k ä ä n t y m i s p r o s e s s i a + i k ä ä n t y m i s s u u n t a u k s e n + i k ä ä n t y m i s t a l o u s + i k ä ä n t y m i s t ä + i k ä ä n t y m ä s s ä + i k ä ä n t y n e e n + i k ä ä n t y n e e t + i k ä ä n t y n e i d e n + i k ä ä n t y n e i l l e + i k ä ä n t y n e i l l ä + i k ä ä n t y n e i s i i n + i k ä ä n t y n e i s t ä + i k ä ä n t y n e i t ä + i k ä ä n t y v i e n + i k ä ä n t y v i i n + i k ä ä n t y v i l l e + i k ä ä n t y v i l t ä + i k ä ä n t y v i s t ä + i k ä ä n t y v ä n + i k ä ä n t y v ä s t ä + i k ä ä n t y v ä t + i k ä ä n t y v ä ä + i k ä ä n t y y + i l a h d u t t a a + i l a h d u t t a a k i n + i l a h d u t t a n u t + i l a h d u t t a v a a + i l a h d u t t a v a m p a a + i l a h d u t t a v a n + i l a h d u t t a v a n a + i l a h d u t t a v a s s a + i l a h d u t t a v a t + i l a h d u t t a v i a + i l a h d u t t a v i m m i s t a + i l a h d u t t a v i n t a + i l a h d u t t i + i l a h t u n e e m p i + i l a h t u n e e n a + i l a h t u n e i t a + i l a h t u u k i n + i l k e i t ä + i l k e ä m i e l i s i ä + i l l a l l a + i l l a l l i s e l l a + i l l a l l i s e l l e + i l l a l l i s k e s k u s t e l u a + i l l a l l i s k e s k u s t e l u s s a + i l l a l l i s p ö y d ä s s ä + i l l a l l i s p ö y d ä s t ä + i l l a l l i s p ö y t ä ä n + i l l a l l i s t a u k o a + i l l a n + i l l i n o i s i n + i l l u u s i o a r g u m e n t t i + i l l u u s i o i t a + i l l u u s i o s s a + i l l u u s i o t a + i l m a a n + i l m a a n t u n e e t + i l m a a n t u n u t + i l m a a n t u n u t t a + i l m a a n t u v a t + i l m a h a l l i n t o + i l m a h e r r u u s + i l m a h y ö k k ä y k s e e n + i l m a h y ö k k ä y k s e n + i l m a h y ö k k ä y k s e s s ä + i l m a h y ö k k ä y k s e t + i l m a h y ö k k ä y s p r i k a a t i + i l m a h y ö k k ä y s t e n + i l m a i l u a + i l m a i l u a l a + i l m a i l u a l a a + i l m a i l u a l a a n + i l m a i l u a l a l l a + i l m a i l u a l a l l a h a n + i l m a i l u a l a l l a k i n + i l m a i l u a l a l l a m m e + i l m a i l u a l a l l e + i l m a i l u a l a l t a + i l m a i l u a l a m m e + i l m a i l u a l a n + i l m a i l u a l a s t a + i l m a i l u a l u e + i l m a i l u a l u e e n + i l m a i l u a l u e e s t a + i l m a i l u a l u e t t a + i l m a i l u a s i o i t a + i l m a i l u e l i m e n + i l m a i l u h a l l i n n o n + i l m a i l u h a l l i n t o + i l m a i l u h a l l i n t o j e n + i l m a i l u h a l l i t u k s e n + i l m a i l u h a n k k e i s t a + i l m a i l u h e n k i l ö s t ö n + i l m a i l u i n s t i t u u t t i + i l m a i l u j u t u s s a + i l m a i l u j ä r j e s t e l m ä n + i l m a i l u j ä r j e s t e l m ä n s ä + i l m a i l u j ä r j e s t e l m ä s s ä + i l m a i l u j ä r j e s t e l m ä ä + i l m a i l u j ä r j e s t ö + i l m a i l u j ä r j e s t ö j e n + i l m a i l u j ä r j e s t ö n + i l m a i l u j ä r j e s t ö s s ä + i l m a i l u j ä r j e s t ö t + i l m a i l u j ä r j e s t ö ö n + i l m a i l u k e r h o i h i n + i l m a i l u k o n f e r e n s s i + i l m a i l u k o n f e r e n s s i n + i l m a i l u k o n f e r e n s s i s s a + i l m a i l u k y s y m y k s i s s ä + i l m a i l u k y s y m y k s i ä + i l m a i l u k ä s i k i r j a + i l m a i l u l a a k s o + i l m a i l u l a i t o k s e l l a + i l m a i l u l a i t o s + i l m a i l u l a k i + i l m a i l u l i i k e n n e + i l m a i l u l i i k e n n e t t ä + i l m a i l u l i i k e n t e e n + i l m a i l u l i i t o n + i l m a i l u l l a + i l m a i l u l l e + i l m a i l u l ä ä k e t i e d e + i l m a i l u m a k s u i s t a + i l m a i l u m a r k k i n a t + i l m a i l u m a r k k i n o i d e n + i l m a i l u m a r k k i n o i h i n + i l m a i l u m a r k k i n o i s t a + i l m a i l u m a r k k i n o i t a + i l m a i l u m u s e o + i l m a i l u n + i l m a i l u n o r m i e n + i l m a i l u n t u t k i m u s s e k t o r i l l a + i l m a i l u o p i s t o + i l m a i l u p a k e t t i + i l m a i l u p a l v e l u i t a + i l m a i l u p a l v e l u j a + i l m a i l u p a l v e l u j e n + i l m a i l u p a l v e l u t + i l m a i l u p o l i t i i k a n + i l m a i l u p o l i t i i k a s s a + i l m a i l u p o l i t i i k a s t a + i l m a i l u p o l i t i i k k a + i l m a i l u p o l i t i i k k a a + i l m a i l u p o l i t i i k k a a n + i l m a i l u p ä ä s t ö j e n + i l m a i l u s e k t o r i + i l m a i l u s e k t o r i l l e + i l m a i l u s o p i m u k s e n + i l m a i l u s o p i m u k s e s t a + i l m a i l u s o p i m u k s e t + i l m a i l u s o p i m u k s i a + i l m a i l u s o p i m u k s i i m m e + i l m a i l u s o p i m u k s i i n + i l m a i l u s o p i m u k s i s s a + i l m a i l u s o p i m u k s i s t a + i l m a i l u s o p i m u s + i l m a i l u s o p i m u s t a + i l m a i l u s o p i m u s t e n + i l m a i l u s s a + i l m a i l u s t a + i l m a i l u s u h t e i t a + i l m a i l u t e k n i i k a n + i l m a i l u t e k n o l o g i a + i l m a i l u t e k n o l o g i a a + i l m a i l u t e k n o l o g i a n + i l m a i l u t e o l l i s u u d e l l e + i l m a i l u t e o l l i s u u d e n + i l m a i l u t e o l l i s u u d e s s a + i l m a i l u t e o l l i s u u d e s t a + i l m a i l u t e o l l i s u u s + i l m a i l u t e o l l i s u u s y r i t y s t e n + i l m a i l u t e o l l i s u u t e e n + i l m a i l u t e o l l i s u u t t a + i l m a i l u t i e d o t u s t a + i l m a i l u t o i m i n n a n + i l m a i l u t u o t t e e l l e + i l m a i l u t u o t t e i d e n + i l m a i l u t u r v a l l i s u u d e n + i l m a i l u t u r v a l l i s u u s + i l m a i l u t u r v a l l i s u u s a l a a + i l m a i l u t u r v a l l i s u u t t a + i l m a i l u t u t k i m u k s e e n + i l m a i l u t u t k i m u k s i a + i l m a i l u t y y p p i e n + i l m a i l u t y ö r y h m ä n + i l m a i l u u n + i l m a i l u v a l v o n t a a + i l m a i l u v a r u s t e i d e n + i l m a i l u v e r k k o + i l m a i l u v i r a n o m a i n e n + i l m a i l u v i r a n o m a i s e l l e + i l m a i l u v i r a n o m a i s e n + i l m a i l u v i r a n o m a i s e t + i l m a i l u v i r a n o m a i s i a + i l m a i l u v i r a n o m a i s i a k a a n + i l m a i l u v i r a n o m a i s i i n + i l m a i l u v i r a n o m a i s i l l a + i l m a i l u v i r a n o m a i s i l l e + i l m a i l u v i r a n o m a i s i s t a + i l m a i l u v i r a n o m a i s t a + i l m a i l u v i r a n o m a i s t e n + i l m a i l u v i r a n o m a i s t e n s a + i l m a i l u v i r a s t o + i l m a i l u v y ö h y k e + i l m a i l u y r i t y s t e n + i l m a i s e e + i l m a i s e e n + i l m a i s e m a a + i l m a i s e m a a n + i l m a i s e m a l l a + i l m a i s e m a t + i l m a i s e m a t t a + i l m a i s e m i a + i l m a i s e m i e n i + i l m a i s e m i s e e n + i l m a i s e m i s t a + i l m a i s e m m e + i l m a i s e n + i l m a i s e t + i l m a i s e v a t + i l m a i s i + i l m a i s i a + i l m a i s i i n + i l m a i s i m i a + i l m a i s i m m e + i l m a i s i s i t t e + i l m a i s i v a t + i l m a i s j a k e l u + i l m a i s j a k e l u a + i l m a i s j a k e l u l e h t i + i l m a i s j a k e l u u n + i l m a i s k a a + i l m a i s k a a m m e + i l m a i s k a p p a l e i d e n + i l m a i s k u + i l m a i s k u a + i l m a i s k u i l l a + i l m a i s k u i n + i l m a i s k u i s s a + i l m a i s k u i s t a + i l m a i s k u j a + i l m a i s k u j e n + i l m a i s k u n + i l m a i s k u s t a + i l m a i s k u t + i l m a i s l a h j a + i l m a i s l a h o j e n + i l m a i s n u m e r o + i l m a i s p a k k a u s t a + i l m a i s p a l v e l u + i l m a i s p a l v e l u i d e n + i l m a i s p a l v e l u t + i l m a i s p e l i + i l m a i s p u h e l i n n u m e r o + i l m a i s s e e t + i l m a i s s u t + i l m a i s t a + i l m a i s t a a k s e e n + i l m a i s t a a n + i l m a i s t a k s e e n + i l m a i s t a k s e n i + i l m a i s t a r j o u k s e t + i l m a i s t a v a + i l m a i s t e n + i l m a i s t e s s a m m e + i l m a i s t e s s a n i + i l m a i s t i i n + i l m a i s t u i h i n + i l m a i s t u k i n + i l m a i s t u n a + i l m a i s t u t + i l m a i s u a + i l m a i s u j a + i l m a i s u k a n a v a + i l m a i s u k a n a v i e n + i l m a i s u k e i n o j e n + i l m a i s u m u o d o s s a + i l m a i s u m u o d o t + i l m a i s u m u o t o + i l m a i s u m u o t o j e n + i l m a i s u n + i l m a i s u n v a p a u d e l l e + i l m a i s u n v a p a u d e n + i l m a i s u n v a p a u d e n k i n + i l m a i s u n v a p a u d e s s a + i l m a i s u n v a p a u d e s t a + i l m a i s u n v a p a u s + i l m a i s u n v a p a u s o n g e l m i i n + i l m a i s u n v a p a u t e e n + i l m a i s u n v a p a u t e e n s a + i l m a i s u n v a p a u t e n s a + i l m a i s u n v a p a u t t a + i l m a i s u n v a p a u t t a a n + i l m a i s u s t a + i l m a i s u t a v a s t a a n + i l m a i s u v a p a u d e l l a + i l m a i s u v a p a u d e n + i l m a i s u v a p a u d e s t a + i l m a i s u v a p a u k s i e n + i l m a i s u v a p a u s + i l m a i s u v a p a u t e e n + i l m a i s u v a p a u t t a + i l m a i s u v a p a u t t a a n + i l m a i s u v ä l i n e e k s e e n + i l m a j o h d o t + i l m a j o h t o j e n + i l m a j ä r v i + i l m a j ä ä h d y t t e i n e n + i l m a k e h ä + i l m a k e h ä n + i l m a k e h ä p ä ä s t ö j e n + i l m a k e h ä s s ä + i l m a k e h ä t i e t e e t + i l m a k e h ä ä + i l m a k e m i a + i l m a k i e k k o + i l m a k i t a r a + i l m a k i v ä ä r i + i l m a k u l j e t u k s e n + i l m a k u l j e t u k s e s s a + i l m a k u l j e t u k s e t + i l m a k u l j e t u k s i a + i l m a k u l j e t u k s i l l e + i l m a k u l j e t u k s i s s a + i l m a k u l j e t u k s i s t a + i l m a k u l j e t u s + i l m a k u l j e t u s a l a a + i l m a k u l j e t u s j ä r j e s t e l m ä ä n + i l m a k u l j e t u s l i i t t o + i l m a k u l j e t u s t e n + i l m a k u l j e t u s v a l m i u k s i e n + i l m a k u l j e t u s v ä l i n e i t ä + i l m a k u v i a + i l m a k ä v e l i j ä + i l m a l a a t u a + i l m a l a i v a s t o n s a + i l m a l i i k e n n e + i l m a l i i k e n n e a l a l l a + i l m a l i i k e n n e a l a n + i l m a l i i k e n n e j ä r j e s t e l m i ä + i l m a l i i k e n n e j ä r j e s t e l m ä n + i l m a l i i k e n n e j ä r j e s t e l m ä s s ä + i l m a l i i k e n n e j ä r j e s t e l y j e n + i l m a l i i k e n n e p a l v e l u j e n + i l m a l i i k e n n e s o p i m u k s e s t a + i l m a l i i k e n n e s o p i m u k s i a + i l m a l i i k e n n e t t ä + i l m a l i i k e n n e v a l v o n t a j ä r j e s t e l m ä n + i l m a l i i k e n n e v e r k o n + i l m a l i i k e n n e v e r k o t + i l m a l i i k e n n e y h t e i s t y ö l l e + i l m a l i i k e n n e y h t e y k s i ä + i l m a l i i k e n t e e l l e + i l m a l i i k e n t e e m m e + i l m a l i i k e n t e e n + i l m a l i i k e n t e e s e e n + i l m a l i i k e n t e e s s ä + i l m a l i i k e n t e e s t ä + i l m a l ä m m i t y s + i l m a m a r k k i n a t + i l m a m a s s a + i l m a n l a a d u l l a + i l m a n l a a d u l l e + i l m a n l a a d u n + i l m a n l a a d u s s a + i l m a n l a a d u s t a + i l m a n l a a t u + i l m a n l a a t u a + i l m a n l a a t u a m m e + i l m a n l a a t u a s i a n t u n t i j o i d e n + i l m a n l a a t u d i r e k t i i v i + i l m a n l a a t u d i r e k t i i v i i n + i l m a n l a a t u d i r e k t i i v i n + i l m a n l a a t u d i r e k t i i v i s t ä + i l m a n l a a t u e h d o t u k s e n + i l m a n l a a t u i n d e k s i + i l m a n l a a t u k y s y m y k s i s s ä + i l m a n l a a t u n o r m e j a + i l m a n l a a t u n o r m i e n + i l m a n l a a t u n o r m i t + i l m a n l a a t u p o l i t i i k k a + i l m a n l a a t u p o l i t i i k k a a + i l m a n l a a t u s t a n d a r d e j a + i l m a n l a a t u s t a n d a r d i e n + i l m a n l a a t u s u u n n i t e l m a n s a + i l m a n l a a t u t a k u i t a + i l m a n l a a t u t a v o i t t e i s i i n + i l m a n l a a t u u n + i l m a n l a a t u v a a t i m u k s e t + i l m a n l a a t u v e r k o s t o n + i l m a n l a a t u v y ö h y k k e e s t ä + i l m a n l a a t u v y ö h y k k e i l l ä + i l m a n p a i n e + i l m a n p a i n e e s s a + i l m a n p u h t a u s m i t t a u k s i s t a + i l m a n p u h t a u s s t a n d a r d e i h i n + i l m a n p ä ä s t ö i h i n + i l m a n s a a s t e + i l m a n s a a s t e e n + i l m a n s a a s t e e t + i l m a n s a a s t e i d e n + i l m a n s a a s t e i l l e + i l m a n s a a s t e i l t a + i l m a n s a a s t e i s i i n + i l m a n s a a s t e i s s a + i l m a n s a a s t e i s t a + i l m a n s a a s t e i t a + i l m a n s a a s t e o n g e l m a + i l m a n s a a s t e o n g e l m a t + i l m a n s a a s t e o n g e l m i s t a + i l m a n s a a s t e p e r ä i s i i n + i l m a n s a a s t e p ä ä s t ö i s t ä + i l m a n s a a s t e p ä ä s t ö j e n + i l m a n s a a s t e t i l e j ä + i l m a n s a a s t e t t a + i l m a n s a a s t u m i n e n + i l m a n s a a s t u m i s e n + i l m a n s a a s t u m i s t a + i l m a n s a a s t u t t a j i i n + i l m a n s u o d a t i n + i l m a n s u o j e l u n + i l m a n s u o j e l u n o r m i e n + i l m a n s u u n t a + i l m a n t u k e a + i l m a n v a i h d o s t a + i l m a n v a i h t o j ä r j e s t e l m ä + i l m a n v a i h t o k o n e + i l m a n v a s t u s k e r r o i n + i l m a o p e r a a t i o i t a + i l m a p a l l o + i l m a p a l l o j a + i l m a p e r s p e k t i i v i + i l m a p i i r i + i l m a p i i r i i n + i l m a p i i r i n + i l m a p i i r i s s ä + i l m a p i i r i ä + i l m a p i s t o o l i + i l m a p o l i t i i k a l t a + i l m a p o m m i t u k s i a + i l m a p o m m i t u k s i l l a + i l m a p o m m i t u k s i s s a + i l m a p o m m i t u s + i l m a p o m m i t u s t e n + i l m a p u n t a r e i t a + i l m a p u o l u s t u k s e n + i l m a p u o l u s t u s j ä r j e s t e l m ä + i l m a p u o l u s t u s t a + i l m a p u s s i s s a + i l m a p ä ä s t ö i h i n + i l m a p ä ä s t ö i s t ä + i l m a p ä ä s t ö j e n + i l m a p ä ä s t ö j ä + i l m a p ä ä s t ö t i l i t + i l m a r a h t i a + i l m a r a j a t + i l m a r a j o i l l a + i l m a r a j o j e n + i l m a s i l t a a + i l m a s i l t a v a l m i u k s i a + i l m a s i p u l i + i l m a s o d a n k ä y n n i n + i l m a s o d a n k ä y n t i + i l m a s o t a k a m p a n j a n + i l m a s s a + i l m a s t a a n p a + i l m a s t o a + i l m a s t o a l a + i l m a s t o a l a l l a + i l m a s t o a l a n + i l m a s t o a l o i t t e i d e n + i l m a s t o a l o i t t e i l l e + i l m a s t o a l u e e n + i l m a s t o a l u e i s t a + i l m a s t o a n a l y y s i i n + i l m a s t o a s i a + i l m a s t o a s i a a n + i l m a s t o a s i a l l e + i l m a s t o a s i a n t u n t i j o i d e n + i l m a s t o a s i a s s a + i l m a s t o a s i a t + i l m a s t o a s i o i d e n + i l m a s t o a s i o i s s a + i l m a s t o a s i o i s t a + i l m a s t o d i p l o m a t i a a + i l m a s t o d i p l o m a t i a n + i l m a s t o d i p l o m a t i a s s a + i l m a s t o e n n u s t e e t + i l m a s t o e p ä i l i j ö i d e n + i l m a s t o e r o j e n + i l m a s t o h a a s t e e s e e n + i l m a s t o h a a s t e i d e n + i l m a s t o h a a s t e i s i i n + i l m a s t o h a i t t o j a + i l m a s t o h a i t t o j e n + i l m a s t o h a n k k e e t + i l m a s t o h a n k k e i t a + i l m a s t o h e r k k y y s + i l m a s t o h i n n a n + i l m a s t o h u i p p u k o k o u k s e e n + i l m a s t o h u i p p u k o k o u k s e n + i l m a s t o h u i p p u k o k o u k s e s s a + i l m a s t o h u i p p u k o k o u k s e s t a + i l m a s t o h u i p p u k o k o u s + i l m a s t o h u i p p u k o k o u s t a + i l m a s t o h y s t e r i a n + i l m a s t o h y ö t y ä + i l m a s t o h ä i r i ö i t ä + i l m a s t o h ä i r i ö s t ä + i l m a s t o i l m i ö + i l m a s t o i l m i ö i d e n + i l m a s t o i n n i n + i l m a s t o i n n i s s a + i l m a s t o i n n i s t a + i l m a s t o i n n o v a a t i o p a l k i n n o n + i l m a s t o i n n o v a a t i o p a l k i n t o a + i l m a s t o i n t i a + i l m a s t o i n t i i n + i l m a s t o i n t i j ä r j e s t e l m i e n + i l m a s t o i n t i j ä r j e s t e l m i i n + i l m a s t o i n t i j ä r j e s t e l m i s s ä + i l m a s t o i n t i j ä r j e s t e l m i s t ä + i l m a s t o i n t i j ä r j e s t e l m i ä + i l m a s t o i n t i j ä r j e s t e l m ä + i l m a s t o i n t i j ä r j e s t e l m ä n + i l m a s t o i n t i j ä r j e s t e l m ä s t ä + i l m a s t o i n t i j ä r j e s t e l m ä t + i l m a s t o i n t i l a i t e + i l m a s t o i n t i l a i t t e e n + i l m a s t o i n t i l a i t t e e t + i l m a s t o i n t i l a i t t e i d e n + i l m a s t o i n t i l a i t t e i s s a + i l m a s t o i n t i l a i t t e i s s a a n + i l m a s t o i n t i l a i t t e i s t a + i l m a s t o i n t i l a i t t e i t a + i l m a s t o i n t i t e i p p i + i l m a s t o i n t i y k s i k k ö + i l m a s t o i n t i y k s i k ö t + i l m a s t o j a l a n j ä l k e m m e + i l m a s t o j o h t a j a + i l m a s t o j o h t a j u u d e n + i l m a s t o j ä r j e s t e l m ä + i l m a s t o j ä r j e s t e l m ä m m e + i l m a s t o j ä r j e s t e l m ä n + i l m a s t o j ä r j e s t e l m ä s s ä + i l m a s t o j ä r j e s t e l m ä ä + i l m a s t o j ä r j e s t y k s e l l e + i l m a s t o k a a o k s e n + i l m a s t o k a a o s t a + i l m a s t o k a a s u p ä ä s t ö j e n + i l m a s t o k a t a s t r o f e i h i n + i l m a s t o k a t a s t r o f e i s t a + i l m a s t o k a t a s t r o f i + i l m a s t o k a t a s t r o f i a + i l m a s t o k a t a s t r o f i e n + i l m a s t o k a t a s t r o f i i n + i l m a s t o k a t a s t r o f i l l a + i l m a s t o k a t a s t r o f i n + i l m a s t o k a t a s t r o f i s t a + i l m a s t o k e s k u k s e n + i l m a s t o k e s k u k s e s t a + i l m a s t o k e s k u s + i l m a s t o k e s k u s t e l u + i l m a s t o k e s k u s t e l u a + i l m a s t o k e s k u s t e l u i h i n + i l m a s t o k e s k u s t e l u i s s a + i l m a s t o k e s k u s t e l u n + i l m a s t o k e s k u s t e l u s s a + i l m a s t o k e s k u s t e l u s t a + i l m a s t o k e s k u s t e l u t + i l m a s t o k i e r t o i h i n + i l m a s t o k o h t a i s t a + i l m a s t o k o k o u k s e e n + i l m a s t o k o k o u k s e l l e + i l m a s t o k o k o u k s e n + i l m a s t o k o k o u k s e s s a + i l m a s t o k o k o u k s e s t a + i l m a s t o k o k o u s + i l m a s t o k o k o u s t a + i l m a s t o k o m i s s a a r i + i l m a s t o k o m i s s a a r i l l e + i l m a s t o k o n f e r e n s s i + i l m a s t o k o n f e r e n s s i a + i l m a s t o k o n f e r e n s s i i n + i l m a s t o k o n f e r e n s s i n + i l m a s t o k o n f e r e n s s i s s a + i l m a s t o k o n f e r e n s s i s t a + i l m a s t o k r i i s e i h i n + i l m a s t o k r i i s i + i l m a s t o k r i i s i i n + i l m a s t o k r i i s i n + i l m a s t o k r i i s i s s ä + i l m a s t o k r i i s i s t ä + i l m a s t o k r i i s i ä + i l m a s t o k r i t e e r i t + i l m a s t o k u s t a n n u k s i a + i l m a s t o k y s y m y k s e e n + i l m a s t o k y s y m y k s e n + i l m a s t o k y s y m y k s e s s ä + i l m a s t o k y s y m y k s e s t ä + i l m a s t o k y s y m y k s e t + i l m a s t o k y s y m y k s i i n + i l m a s t o k y s y m y k s i s s ä + i l m a s t o k y s y m y k s i s t ä + i l m a s t o k y s y m y k s i ä + i l m a s t o k y s y m y s + i l m a s t o k y s y m y s t e n + i l m a s t o k y s y m y s t ä + i l m a s t o l a i n s ä ä d ä n t ö h a n k k e i t a + i l m a s t o l i i t o n + i l m a s t o l l e + i l m a s t o l l i s e t + i l m a s t o l l i s t e n + i l m a s t o l u o k i t u s + i l m a s t o m a f i a + i l m a s t o m a k s u j a + i l m a s t o m a l l e i s s a + i l m a s t o m a l l i + i l m a s t o m a l l i i n + i l m a s t o m e r k i n t ö j ä + i l m a s t o m i e t i n n ö s t ä + i l m a s t o m u u t o k s e e n + i l m a s t o m u u t o k s e l l a + i l m a s t o m u u t o k s e l l e + i l m a s t o m u u t o k s e n + i l m a s t o m u u t o k s e s s a + i l m a s t o m u u t o k s e s t a + i l m a s t o m u u t o k s e t + i l m a s t o m u u t o k s i a + i l m a s t o m u u t o k s i i n + i l m a s t o m u u t o k s i l l a + i l m a s t o m u u t o k s i n e e n + i l m a s t o m u u t o k s i s t a + i l m a s t o m u u t o s + i l m a s t o m u u t o s k y s y m y k s e n + i l m a s t o m u u t o s t a + i l m a s t o m u u t o s t e n + i l m a s t o m u u t o s t y ö m m e + i l m a s t o n + i l m a s t o n e u t r a a l e i k s i + i l m a s t o n e u t r a a l e i n + i l m a s t o n e u v o t t e l u i h i n + i l m a s t o n e u v o t t e l u i s s a + i l m a s t o n e u v o t t e l u i s t a + i l m a s t o n e u v o t t e l u j a + i l m a s t o n e u v o t t e l u j e n + i l m a s t o n e u v o t t e l u j ä r j e s t e l m ä + i l m a s t o n e u v o t t e l u t + i l m a s t o n k o n f e r e n s s i s s a + i l m a s t o n l ä m p e n e m i s t ä + i l m a s t o n m u o k k a u s + i l m a s t o n m u u t o k s e e n + i l m a s t o n m u u t o k s e k s i + i l m a s t o n m u u t o k s e l l a + i l m a s t o n m u u t o k s e l l e + i l m a s t o n m u u t o k s e l t a + i l m a s t o n m u u t o k s e n + i l m a s t o n m u u t o k s e n k i n + i l m a s t o n m u u t o k s e s s a + i l m a s t o n m u u t o k s e s t a + i l m a s t o n m u u t o k s e t + i l m a s t o n m u u t o k s i a + i l m a s t o n m u u t o k s i e n + i l m a s t o n m u u t o k s i i n + i l m a s t o n m u u t o k s i l l a + i l m a s t o n m u u t o k s i l l e + i l m a s t o n m u u t o k s i l t a + i l m a s t o n m u u t o k s i s t a + i l m a s t o n m u u t o s + i l m a s t o n m u u t o s a i h e + i l m a s t o n m u u t o s a i h e t t a + i l m a s t o n m u u t o s a l l i a n s s i l l e + i l m a s t o n m u u t o s a s i a + i l m a s t o n m u u t o s a s i a a + i l m a s t o n m u u t o s a s i a a n + i l m a s t o n m u u t o s a s i a l i s t a l l e + i l m a s t o n m u u t o s a s i a n t u n t i j a n + i l m a s t o n m u u t o s a s i a s s a + i l m a s t o n m u u t o s a s i a t + i l m a s t o n m u u t o s a s i o i s s a + i l m a s t o n m u u t o s a s i o i t a + i l m a s t o n m u u t o s e h d o t u k s i a + i l m a s t o n m u u t o s h a a s t e e n + i l m a s t o n m u u t o s h a a s t e e s e e n + i l m a s t o n m u u t o s h a a s t e e s t a + i l m a s t o n m u u t o s h a l l i n t o a + i l m a s t o n m u u t o s h a l l i n t o o n + i l m a s t o n m u u t o s h a n k k e i s s a + i l m a s t o n m u u t o s h u i p p u k o k o u k s e n + i l m a s t o n m u u t o s h u i p p u k o k o u s t a + i l m a s t o n m u u t o s h y s t e e r i k k o j e n + i l m a s t o n m u u t o s h y s t e r i a n + i l m a s t o n m u u t o s i l m i ö t ä + i l m a s t o n m u u t o s i l m i ö ö n + i l m a s t o n m u u t o s j o h t a j i n a + i l m a s t o n m u u t o s j ä r j e s t e l m i s s ä + i l m a s t o n m u u t o s j ä r j e s t e l m ä n + i l m a s t o n m u u t o s j ä r j e s t e l m ä s t ä + i l m a s t o n m u u t o s j ä r j e s t e l m ä ä + i l m a s t o n m u u t o s j ä r j e s t e l m ä ä n + i l m a s t o n m u u t o s k a a s u i s t a + i l m a s t o n m u u t o s k a t a s t r o f i n + i l m a s t o n m u u t o s k e s k u s t e l u + i l m a s t o n m u u t o s k e s k u s t e l u a + i l m a s t o n m u u t o s k e s k u s t e l u i h i n + i l m a s t o n m u u t o s k e s k u s t e l u n + i l m a s t o n m u u t o s k e s k u s t e l u s s a + i l m a s t o n m u u t o s k e s k u s t e l u s t a + i l m a s t o n m u u t o s k e s k u s t e l u u n + i l m a s t o n m u u t o s k o k o u k s e n + i l m a s t o n m u u t o s k o k o u k s e s s a + i l m a s t o n m u u t o s k o k o u k s e s s a k i n + i l m a s t o n m u u t o s k o k o u k s i s s a + i l m a s t o n m u u t o s k o k o u s + i l m a s t o n m u u t o s k o k o u s t a + i l m a s t o n m u u t o s k o m i t e a s s a + i l m a s t o n m u u t o s k o n f e r e n s s e j a + i l m a s t o n m u u t o s k o n f e r e n s s i + i l m a s t o n m u u t o s k o n f e r e n s s i a + i l m a s t o n m u u t o s k o n f e r e n s s i i n + i l m a s t o n m u u t o s k o n f e r e n s s i n + i l m a s t o n m u u t o s k o n f e r e n s s i s s a + i l m a s t o n m u u t o s k o n f l i k t i k s i + i l m a s t o n m u u t o s k o n v e n t t i + i l m a s t o n m u u t o s k r i i s i i n + i l m a s t o n m u u t o s k y s y m y k s e e n + i l m a s t o n m u u t o s k y s y m y k s e l l e + i l m a s t o n m u u t o s k y s y m y k s e n + i l m a s t o n m u u t o s k y s y m y k s e s s ä + i l m a s t o n m u u t o s k y s y m y k s e t + i l m a s t o n m u u t o s k y s y m y k s i i n + i l m a s t o n m u u t o s k y s y m y k s i s s ä + i l m a s t o n m u u t o s k y s y m y k s i s t ä + i l m a s t o n m u u t o s k y s y m y s + i l m a s t o n m u u t o s k y s y m y s t e n + i l m a s t o n m u u t o s k y s y m y s t ä + i l m a s t o n m u u t o s l a i n + i l m a s t o n m u u t o s l a i n s ä ä d ä n n ö n + i l m a s t o n m u u t o s l a i n s ä ä d ä n t ö ä + i l m a s t o n m u u t o s l i i t t o u m a + i l m a s t o n m u u t o s l i i t t o u m a a + i l m a s t o n m u u t o s l i i t t o u m a a n + i l m a s t o n m u u t o s l i i t t o u m a l l e + i l m a s t o n m u u t o s l i i t t o u m a n + i l m a s t o n m u u t o s l i i t t o u m a s t a + i l m a s t o n m u u t o s m a k s u + i l m a s t o n m u u t o s m a k s u i s t a + i l m a s t o n m u u t o s n e u v o t t e l u i d e n + i l m a s t o n m u u t o s n e u v o t t e l u i h i n + i l m a s t o n m u u t o s n e u v o t t e l u i l l e + i l m a s t o n m u u t o s n e u v o t t e l u i s s a + i l m a s t o n m u u t o s n e u v o t t e l u i s t a + i l m a s t o n m u u t o s n e u v o t t e l u j a + i l m a s t o n m u u t o s o h j e l m a + i l m a s t o n m u u t o s o h j e l m a a + i l m a s t o n m u u t o s o h j e l m a a n + i l m a s t o n m u u t o s o h j e l m a l l a + i l m a s t o n m u u t o s o h j e l m a n + i l m a s t o n m u u t o s o h j e l m a s s a + i l m a s t o n m u u t o s o h j e l m a s t a + i l m a s t o n m u u t o s o n g e l m a a + i l m a s t o n m u u t o s o n g e l m a a n + i l m a s t o n m u u t o s o n g e l m a n + i l m a s t o n m u u t o s o n g e l m a s t a + i l m a s t o n m u u t o s o n g e l m i i n + i l m a s t o n m u u t o s p a k e t i n + i l m a s t o n m u u t o s p a k e t i s s a + i l m a s t o n m u u t o s p a k e t i s t a + i l m a s t o n m u u t o s p a k e t t i + i l m a s t o n m u u t o s p a k e t t i a + i l m a s t o n m u u t o s p a k e t t i i n + i l m a s t o n m u u t o s p a k o l a i s t e n + i l m a s t o n m u u t o s p a n e e l i + i l m a s t o n m u u t o s p a n e e l i i n + i l m a s t o n m u u t o s p a n e e l i n + i l m a s t o n m u u t o s p e r i a a t t e e n + i l m a s t o n m u u t o s p o l i t i i k a l l a + i l m a s t o n m u u t o s p o l i t i i k a l l e + i l m a s t o n m u u t o s p o l i t i i k a n + i l m a s t o n m u u t o s p o l i t i i k a s s a + i l m a s t o n m u u t o s p o l i t i i k a s t a + i l m a s t o n m u u t o s p o l i t i i k a t + i l m a s t o n m u u t o s p o l i t i i k k a + i l m a s t o n m u u t o s p o l i t i i k k a a + i l m a s t o n m u u t o s p o l i t i i k k a a n + i l m a s t o n m u u t o s p o l i t i i k k a m m e + i l m a s t o n m u u t o s p r o s e s s i i n + i l m a s t o n m u u t o s p r o s e s s i s s a + i l m a s t o n m u u t o s p r o s e s s i s t a + i l m a s t o n m u u t o s p y r k i m y k s e t + i l m a s t o n m u u t o s p ä ä t ö s l a u s e l m a s t a + i l m a s t o n m u u t o s r a h a s t o n + i l m a s t o n m u u t o s r a h o i t u s t a + i l m a s t o n m u u t o s r a p o r t i n + i l m a s t o n m u u t o s r i s k e i h i n + i l m a s t o n m u u t o s r y h m ä n + i l m a s t o n m u u t o s s o p i m u k s e e n + i l m a s t o n m u u t o s s o p i m u k s e n + i l m a s t o n m u u t o s s o p i m u k s e s s a + i l m a s t o n m u u t o s s o p i m u k s e s t a + i l m a s t o n m u u t o s s o p i m u k s i a + i l m a s t o n m u u t o s s o p i m u k s i i n + i l m a s t o n m u u t o s s o p i m u s + i l m a s t o n m u u t o s s o p i m u s t a + i l m a s t o n m u u t o s s t r a t e g i a + i l m a s t o n m u u t o s s t r a t e g i a a + i l m a s t o n m u u t o s s t r a t e g i a n + i l m a s t o n m u u t o s s t r a t e g i a n s a + i l m a s t o n m u u t o s s t r a t e g i a s t a + i l m a s t o n m u u t o s s u u n n i t e l m a n + i l m a s t o n m u u t o s s y k l i i n + i l m a s t o n m u u t o s s y y t ö k s i s t ä + i l m a s t o n m u u t o s s ä ä n t ö j e n + i l m a s t o n m u u t o s t a + i l m a s t o n m u u t o s t a i s t e l u s s a + i l m a s t o n m u u t o s t a v o i t e t t a + i l m a s t o n m u u t o s t a v o i t t e e n + i l m a s t o n m u u t o s t a v o i t t e e n s a + i l m a s t o n m u u t o s t a v o i t t e e t + i l m a s t o n m u u t o s t a v o i t t e i d e n + i l m a s t o n m u u t o s t a v o i t t e i s i i m m e + i l m a s t o n m u u t o s t a v o i t t e i s i i n + i l m a s t o n m u u t o s t a v o i t t e i t a + i l m a s t o n m u u t o s t e n + i l m a s t o n m u u t o s t i e t o a + i l m a s t o n m u u t o s t i l a n t e i s t a + i l m a s t o n m u u t o s t o i m e t + i l m a s t o n m u u t o s t o i m i e n + i l m a s t o n m u u t o s t o i m i s t a + i l m a s t o n m u u t o s t u t k i m u k s e e n + i l m a s t o n m u u t o s t y ö h ö n + i l m a s t o n m u u t o s t y ö m m e + i l m a s t o n m u u t o s u h k a + i l m a s t o n m u u t o s u l o t t u v u u s + i l m a s t o n m u u t o s v a i k u t u k s i a + i l m a s t o n m u u t o s v a i k u t u s t e n + i l m a s t o n m u u t o s v a l i o k u n n a l l e + i l m a s t o n m u u t o s v a l i o k u n n a n + i l m a s t o n m u u t o s v a l i o k u n n a s s a + i l m a s t o n m u u t o s v a l i o k u n t a + i l m a s t o n m u u t o s v i i t t a u k s e t + i l m a s t o n m u u t o s v ä i t t e i s i i n + i l m a s t o n p a k e t i s t a + i l m a s t o n s u o j e l i j a n a + i l m a s t o n s u o j e l u + i l m a s t o n s u o j e l u a + i l m a s t o n s u o j e l u a s i o i d e n + i l m a s t o n s u o j e l u d i p l o m a t i a a + i l m a s t o n s u o j e l u j ä r j e s t e l m i i n + i l m a s t o n s u o j e l u j ä r j e s t e l m ä ä + i l m a s t o n s u o j e l u k y s y m y k s e e n + i l m a s t o n s u o j e l u k y s y m y s + i l m a s t o n s u o j e l u l a i n s ä ä d ä n n ö s s ä + i l m a s t o n s u o j e l u l l e + i l m a s t o n s u o j e l u n + i l m a s t o n s u o j e l u o h j e l m a + i l m a s t o n s u o j e l u o h j e l m a a + i l m a s t o n s u o j e l u o h j e l m a n + i l m a s t o n s u o j e l u p a k e t i n + i l m a s t o n s u o j e l u p a k e t i s s a + i l m a s t o n s u o j e l u p a k e t t i + i l m a s t o n s u o j e l u p o l i t i i k a l l e + i l m a s t o n s u o j e l u p o l i t i i k a n + i l m a s t o n s u o j e l u p o l i t i i k a s t a + i l m a s t o n s u o j e l u p o l i t i i k k a + i l m a s t o n s u o j e l u p o l i t i i k k a a + i l m a s t o n s u o j e l u s o p i m u k s e l l e + i l m a s t o n s u o j e l u s o p i m u s + i l m a s t o n s u o j e l u s s a + i l m a s t o n s u o j e l u s t a + i l m a s t o n s u o j e l u s t r a t e g i a + i l m a s t o n s u o j e l u t a v o i t t e e t + i l m a s t o n s u o j e l u t a v o i t t e i s t a + i l m a s t o n s u o j e l u t a v o i t t e i t a + i l m a s t o n s u o j e l u t a v o i t t e i t t e n s a + i l m a s t o n s u o j e l u t o i m e n a + i l m a s t o n s u o j e l u t o i m e n p i t e e t + i l m a s t o n s u o j e l u t o i m e n p i t e i s i i n + i l m a s t o n s u o j e l u t o i m e n p i t e i s t ä + i l m a s t o n s u o j e l u t o i m e n p i t e i t ä + i l m a s t o n s u o j e l u t o i m i a + i l m a s t o n s u o j e l u t o i m i e n + i l m a s t o n s u o j e l u t o i m i i n + i l m a s t o n s u o j e l u u n + i l m a s t o n s u u n n i t e l m a n + i l m a s t o n s ä ä n t e l y ä + i l m a s t o n t u t k i j a t + i l m a s t o n v a i h d o s + i l m a s t o n v a i h t e l u s t a + i l m a s t o o n + i l m a s t o p a k e t i l l a + i l m a s t o p a k e t i l l e + i l m a s t o p a k e t i n + i l m a s t o p a k e t i s s a + i l m a s t o p a k e t i s t a + i l m a s t o p a k e t t i + i l m a s t o p a k e t t i a + i l m a s t o p a k e t t i i n + i l m a s t o p a k e t t i m m e + i l m a s t o p a k o l a i n e n + i l m a s t o p a k o l a i s e t + i l m a s t o p a k o l a i s i a + i l m a s t o p a k o l a i s t e n + i l m a s t o p a k o l a i s u u s + i l m a s t o p a n e e l i + i l m a s t o p a n e e l i s s a + i l m a s t o p a n k i s t a + i l m a s t o p e l o t t e l u n + i l m a s t o p e r u s t e e t + i l m a s t o p e r u s t e t t a + i l m a s t o p e r ä i n e n + i l m a s t o p o l i i t i k k o + i l m a s t o p o l i i t i k o t + i l m a s t o p o l i i t t i n e n + i l m a s t o p o l i i t t i s e e n + i l m a s t o p o l i i t t i s e n + i l m a s t o p o l i i t t i s e s t a + i l m a s t o p o l i i t t i s e s t i + i l m a s t o p o l i i t t i s e t + i l m a s t o p o l i i t t i s i a + i l m a s t o p o l i i t t i s i i n + i l m a s t o p o l i i t t i s t e n + i l m a s t o p o l i t i i k a l l a + i l m a s t o p o l i t i i k a l l e + i l m a s t o p o l i t i i k a n + i l m a s t o p o l i t i i k a s s a + i l m a s t o p o l i t i i k a s t a + i l m a s t o p o l i t i i k a s t a m m e + i l m a s t o p o l i t i i k k a + i l m a s t o p o l i t i i k k a a + i l m a s t o p o l i t i i k k a a n + i l m a s t o p o l i t i i k k a a n s a + i l m a s t o p o l i t i i k k a k i n + i l m a s t o p o l i t i i k k a m m e + i l m a s t o p o l i t i i k k a n s a + i l m a s t o p o l i t i i k k a s u u n n i t e l m i e n + i l m a s t o p o l i t i i k k a y h t e i s t y ö l l ä + i l m a s t o p o n n i s t u k s e n + i l m a s t o p r o s e s s i + i l m a s t o p r o s e s s i a + i l m a s t o p r o s e s s i n + i l m a s t o p ä ä s t ö j ä + i l m a s t o r a h a s t o + i l m a s t o r a h a s t o n + i l m a s t o r a h a s t o o n + i l m a s t o r a h a s t o s t a + i l m a s t o r a h o i t u k s e n + i l m a s t o r a h o i t u k s e s t a + i l m a s t o r a h o i t u s + i l m a s t o r a h o i t u s k y s y m y s + i l m a s t o r a h o i t u s t a + i l m a s t o r i k o l l i s i a + i l m a s t o r i s k i e n + i l m a s t o r i s k i ä + i l m a s t o s e r t i f i k a a t i n + i l m a s t o s e r t i f i k a a t t e j a + i l m a s t o s i t o u m u k s e t + i l m a s t o s i t o u m u k s i a m m e + i l m a s t o s i t o u m u k s i i n + i l m a s t o s k a n d a a l i t + i l m a s t o s k e p t i k o i k s i + i l m a s t o s k e p t i k o i l l e + i l m a s t o s k e p t i k o n + i l m a s t o s k e p t i k o t + i l m a s t o s o p i m u k s e e n + i l m a s t o s o p i m u k s e l l a + i l m a s t o s o p i m u k s e l l e + i l m a s t o s o p i m u k s e n + i l m a s t o s o p i m u k s e s s a + i l m a s t o s o p i m u k s e s t a + i l m a s t o s o p i m u k s e t + i l m a s t o s o p i m u k s i a + i l m a s t o s o p i m u k s i i n + i l m a s t o s o p i m u k s i s s a + i l m a s t o s o p i m u k s i s t a + i l m a s t o s o p i m u s + i l m a s t o s o p i m u s p r o s e s s i a + i l m a s t o s o p i m u s t a + i l m a s t o s o p i m u s t e n + i l m a s t o s t a + i l m a s t o s t r a t e g i a a + i l m a s t o s t r a t e g i a a n + i l m a s t o s t r a t e g i a n + i l m a s t o s t r a t e g i a s s a + i l m a s t o s t r a t e g i o i h i n + i l m a s t o s t r a t e g i o i t a + i l m a s t o s u o j e l u s t a + i l m a s t o s u u n n i t e l m a a + i l m a s t o s u u n n i t e l m a s t a + i l m a s t o s u u n n i t e l m i e n + i l m a s t o s u u n n i t e l m i i n + i l m a s t o s y i d e n + i l m a s t o s y k l e j ä + i l m a s t o s y k l i e n + i l m a s t o s y k l i t + i l m a s t o s ä ä n n ö k s i l l ä + i l m a s t o t a a k a n + i l m a s t o t a s a p a i n o n + i l m a s t o t a s e + i l m a s t o t a s e e l t a a n + i l m a s t o t a v o i t e + i l m a s t o t a v o i t e t t a + i l m a s t o t a v o i t t e e m m e + i l m a s t o t a v o i t t e e n + i l m a s t o t a v o i t t e e n s a + i l m a s t o t a v o i t t e e t + i l m a s t o t a v o i t t e i d e m m e + i l m a s t o t a v o i t t e i d e n + i l m a s t o t a v o i t t e i d e n s a + i l m a s t o t a v o i t t e i s i i n + i l m a s t o t a v o i t t e i s s a + i l m a s t o t a v o i t t e i s t a + i l m a s t o t a v o i t t e i s t a m m e + i l m a s t o t a v o i t t e i t a + i l m a s t o t a v o i t t e i t a m m e + i l m a s t o t a v o i t t e i t t e n s a + i l m a s t o t e k i j ö i d e n + i l m a s t o t e k n o l o g i a a n + i l m a s t o t e k n o l o g i a n + i l m a s t o t e k n o l o g i a r a h a s t o s t a + i l m a s t o t e m p a u s + i l m a s t o t i e d e t t ä + i l m a s t o t i e t e e n + i l m a s t o t i e t e i l i j ä t + i l m a s t o t i e t o k a n t a + i l m a s t o t i l a n t e e n + i l m a s t o t i l a n t e i s t a + i l m a s t o t o i m e n p i t e i d e n + i l m a s t o t o i m e n p i t e i s i i n + i l m a s t o t o i m e n p i t e i t ä + i l m a s t o t o i m i a + i l m a s t o t o i m i e n + i l m a s t o t o i m i i n + i l m a s t o t o i m i l l e + i l m a s t o t o i m i n t a a + i l m a s t o t o i m i s s a + i l m a s t o t u h o + i l m a s t o t u o m i o i s t u i m e n + i l m a s t o t u r v a l l i s u u s + i l m a s t o t u t k i j a + i l m a s t o t u t k i j a t + i l m a s t o t u t k i m u k s e s s a + i l m a s t o t u t k i m u k s e t + i l m a s t o t y ö h ö n + i l m a s t o t y ö l l e + i l m a s t o t y ö p a i k k o j a + i l m a s t o t y ö s k e n t e l y ä + i l m a s t o t y ö s s ä + i l m a s t o t y ö s t ä + i l m a s t o u h k a + i l m a s t o u h k a a + i l m a s t o u h k i e n + i l m a s t o u l o t t u v u u s + i l m a s t o u s k o n n o l l e + i l m a s t o v a a t i m u k s i a + i l m a s t o v a h i n k o i h i n + i l m a s t o v a h i n k o j e n + i l m a s t o v a i h t e l u t + i l m a s t o v a i k u t u k s e n + i l m a s t o v a i k u t u k s e t + i l m a s t o v a i k u t u k s i a + i l m a s t o v a i k u t u k s i i n + i l m a s t o v a i k u t u s + i l m a s t o v a i k u t u s t e n + i l m a s t o v a l i o k u n n a n + i l m a s t o v a s t u u s t a m m e + i l m a s t o v e l a s t a + i l m a s t o v e l k a + i l m a s t o v e l k a a + i l m a s t o v e l v o i t t e e n s a + i l m a s t o v e r o a + i l m a s t o v e r o i n a + i l m a s t o v e r o i s t a + i l m a s t o v e r o j e n + i l m a s t o v e r o s t a + i l m a s t o v i r a s t o + i l m a s t o v i r a s t o a + i l m a s t o v i r a s t o n + i l m a s t o v i r a s t o o n + i l m a s t o v i r k a m i e s + i l m a s t o v y ö h y k e t t ä + i l m a s t o v y ö h y k k e e t + i l m a s t o v y ö h y k k e i d e n + i l m a s t o v y ö h y k k e i s t ä + i l m a s t o y h t e i s t y ö h ö n + i l m a s t o y s t ä v ä l l i n e n + i l m a s t o y s t ä v ä l l i s e e n + i l m a s t o y s t ä v ä l l i s e l l e + i l m a s t o y s t ä v ä l l i s e n + i l m a s t o y s t ä v ä l l i s i i n + i l m a s t o y s t ä v ä l l i s i l l e + i l m a s t o y s t ä v ä l l i s i l t ä + i l m a s t o y s t ä v ä l l i s i m m ä k s i + i l m a s t o y s t ä v ä l l i s i ä + i l m a s t o y s t ä v ä l l i s t e n + i l m a s t o y s t ä v ä l l i s t ä + i l m a s t r a t e g i a s t a + i l m a s ä h k ö j o h d o i s t a + i l m a t a n k k a u s + i l m a t a n k k e r e i t a + i l m a t i e t e e l l i s e n + i l m a t i e t e e n + i l m a t i e t e e n l a i t o k s e t + i l m a t i e y h t e y k s i ä + i l m a t i i v i i s s ä + i l m a t i l a + i l m a t i l a a + i l m a t i l a a n + i l m a t i l a k i i s t o j a + i l m a t i l a k ä y t ä v i i n + i l m a t i l a l l a + i l m a t i l a l l e + i l m a t i l a l o h k o j e n + i l m a t i l a m m e + i l m a t i l a n + i l m a t i l a n k ä y t t ö + i l m a t i l a s s a + i l m a t i l a s t a + i l m a t i l a s t a a n + i l m a t i l o j e n + i l m a t o r j u n t a + i l m a t o r j u n t a o h j u k s e t + i l m a t o r j u n t a o h j u k s i a + i l m a t o r j u n t a o h j u k s i i n + i l m a t o r j u n t a o h j u s + i l m a t o r j u n t a o h j u s t a + i l m a t o r j u n t a o h j u s t e n + i l m a t o r j u n t a r y k m e n t t i + i l m a t o r j u n t a t y k k i + i l m a t u k e a + i l m a t u r v a l l i s u u s v i r a s t o + i l m a u k s i a + i l m a u k s i n + i l m a u k s i s t a + i l m a v a l o k u v a u s + i l m a v a l v o n t a + i l m a v a l v o n t a a + i l m a v a l v o n t a a n + i l m a v a l v o n t a j ä r j e s t e l m ä + i l m a v i r r o i s t a + i l m a v i r t a v o i m a l a + i l m a v o i m a j o h t o j a + i l m a v o i m a t + i l m a v o i m i a + i l m a v o i m i e n + i l m a v o i m i i n + i l m a v o i m i l l e + i l m a y h t e y d e s t ä + i l m e i l y ä + i l m e i s e k s i + i l m e i s e l l ä + i l m e i s e l t ä + i l m e i s e m m i k s i + i l m e i s e m m i l t ä + i l m e i s e m m ä k s i + i l m e i s e m p i + i l m e i s e m p i ä + i l m e i s e m p ä ä + i l m e i s e n + i l m e i s e n ä + i l m e i s e s t i k i n + i l m e i s e s t i k ä ä n + i l m e i s e s t ä + i l m e i s e t + i l m e i s i k s i + i l m e i s i m m i s t ä + i l m e i s i m m ä t + i l m e i s i m p i ä + i l m e i s i n + i l m e i s i n t ä + i l m e i s i ä + i l m e i s t ä + i l m e n e e + i l m e n e m i s m u o d o t + i l m e n e m i s m u o t o i h i n + i l m e n e v i e n + i l m e n e v ä + i l m e n e v ä t + i l m e n e v ä ä n + i l m e n i + i l m e n n e e s t ä + i l m e n n e e t + i l m e n n e i d e n + i l m e n n e i t ä + i l m e n n y t + i l m e n s i + i l m e n t y m ä ä + i l m e n t ä m ä s t ä + i l m e n t ä v ä n + i l m e n t ä v ä t + i l m e n t ä ä + i l m e s t y i v ä t + i l m e s t y n e e n + i l m e s t y n e e s t ä + i l m e s t y n y t + i l m e s t y v ä n + i l m e s t y y + i l m e t e s s ä + i l m e t ä + i l m i a n n o n + i l m i a n t a j a l t a + i l m i a n t a j a v a l t i o s t a + i l m i a n t a j i a + i l m i a n t a m i s m e n e t t e l y ä + i l m i a n t o j a + i l m i a n t o j e n + i l m i a n t o k y s y m y s + i l m i a n t o s ä ä n t ö j e n + i l m i a n t o t y ö k a l u j a + i l m i s e l v ä s t ä + i l m i s e l v ä t + i l m i s e l v ä ä + i l m i s e l v ä ä n + i l m i ö i d e n + i l m i ö i h i n + i l m i ö i s t ä + i l m i ö i t ä + i l m i ö k s i + i l m i ö l t ä + i l m i ö n + i l m i ö s t ä + i l m i ö t + i l m i ö t ä + i l m o i t a n + i l m o i t a n k i n + i l m o i t e t a a n + i l m o i t e t t i i n + i l m o i t e t t u a + i l m o i t e t u n + i l m o i t i t t e + i l m o i t t a a + i l m o i t t a a k s e e n + i l m o i t t a a k s e n i + i l m o i t t a e s s a a n + i l m o i t t a e s s a m m e + i l m o i t t a i s i n + i l m o i t t a i s i v a t + i l m o i t t a k a a + i l m o i t t a m a a n + i l m o i t t a m a l l a + i l m o i t t a m a m m e + i l m o i t t a m a n + i l m o i t t a m a n n e + i l m o i t t a m a n s a + i l m o i t t a m a s t a + i l m o i t t a m a t t a + i l m o i t t a m i s e k s i + i l m o i t t a m i s m e n e t t e l y ä + i l m o i t t a m i s s t a n d a r d i e n + i l m o i t t a m i s v e l v o l l i n e n + i l m o i t t a m i s v e l v o l l i s u u d e l l a + i l m o i t t a m i s v e l v o l l i s u u d e n + i l m o i t t a m i s v e l v o l l i s u u k s i n + i l m o i t t a m i s v e l v o l l i s u u t t a + i l m o i t t a n e e t + i l m o i t t a n u t + i l m o i t t a u t u m i s j a k s o n + i l m o i t t a u t u m i s m e n e t t e l y n + i l m o i t t a u t u m i s m e n e t t e l y s t ä + i l m o i t t a u t u m i s t e n + i l m o i t t a u t u n u t + i l m o i t t a v a n + i l m o i t t a v a t + i l m o i t t i + i l m o i t u k s e e n + i l m o i t u k s e e n n e + i l m o i t u k s e l l a + i l m o i t u k s e n + i l m o i t u k s e n a l a i s e s t a + i l m o i t u k s e n n e + i l m o i t u k s e s s a + i l m o i t u k s e s t a + i l m o i t u k s e t + i l m o i t u k s i a + i l m o i t u k s i i n + i l m o i t u k s i s t a + i l m o i t u k s i s t a n n e + i l m o i t u s a i k o j a + i l m o i t u s a s e t u s + i l m o i t u s a s i a k i r j o i s t a + i l m o i t u s a s i a n + i l m o i t u s e h d o t u s t a + i l m o i t u s j ä r j e s t e l m i ä + i l m o i t u s j ä r j e s t e l m ä + i l m o i t u s j ä r j e s t e l m ä n + i l m o i t u s j ä r j e s t e l m ä s t ä + i l m o i t u s j ä r j e s t e l m ä t + i l m o i t u s j ä r j e s t e l m ä ä + i l m o i t u s j ä r j e s t e l m ä ä n + i l m o i t u s j ä r j e s t e l m ä ä n s ä + i l m o i t u s j ä r j e s t e l y + i l m o i t u s k y n n y k s i ä + i l m o i t u s m e k a n i s m e j a + i l m o i t u s m e n e t e l m i ä + i l m o i t u s m e n e t t e l y + i l m o i t u s m e n e t t e l y i h i n + i l m o i t u s m e n e t t e l y i s s ä + i l m o i t u s m e n e t t e l y i s t ä + i l m o i t u s m e n e t t e l y j e n + i l m o i t u s m e n e t t e l y j ä + i l m o i t u s m e n e t t e l y l l ä + i l m o i t u s m e n e t t e l y n + i l m o i t u s m e n e t t e l y t + i l m o i t u s m e n e t t e l y y n + i l m o i t u s m e n e t t e l y ä + i l m o i t u s m u o d o l l i s u u k s i s t a + i l m o i t u s n o r m i t + i l m o i t u s o s a p u o l e t + i l m o i t u s p a k k o + i l m o i t u s p r o s e s s i n + i l m o i t u s r a j a n + i l m o i t u s s ä ä n n ö k s i ä + i l m o i t u s t a + i l m o i t u s t a a k a s t a + i l m o i t u s t a n i + i l m o i t u s t a u l u l l a + i l m o i t u s t a u l u m m e + i l m o i t u s t a u l u s t a + i l m o i t u s t e k s t i s t ä + i l m o i t u s t e m m e + i l m o i t u s t e n + i l m o i t u s v a a t i m u k s e s t a + i l m o i t u s v a a t i m u k s e t + i l m o i t u s v a a t i m u k s i a + i l m o i t u s v a a t i m u k s i i n + i l m o i t u s v a a t i m u s t e n + i l m o i t u s v a i k u t u k s e e n + i l m o i t u s v e l v o i t t e i t a + i l m o i t u s v e l v o l l i s u u d e n + i l m o i t u s v e l v o l l i s u u d e s t a + i l m o i t u s v e l v o l l i s u u d e t + i l m o i t u s v e l v o l l i s u u k s i a + i l m o i t u s v e l v o l l i s u u k s i a a n + i l m o i t u s v e l v o l l i s u u k s i s t a + i l m o i t u s v e l v o l l i s u u s + i l m o i t u s v e l v o l l i s u u t t a + i l m o j e n + i l o a k i n + i l o i s e e n + i l o i s e m m a k s i + i l o i s e m m a n + i l o i s e m p i + i l o i s e n a + i l o i s i a + i l o i t a + i l o i t e s s a n n e + i l o i t k a a m m e + i l o i t s e e + i l o i t s e m a t t a + i l o i t s e m m e + i l o i t s e n + i l o i t s e n k i n + i l o i t s e v a n s a + i l o i t t a v a + i l o k a a s u + i l o k s e m m e + i l o k s e n i + i l o l l e + i l o n a i h e + i l o n i + i l o n k y y n e l e i n + i l o n l ä h t e i t ä + i l o n p i l a a j a k s i + i l o n p i l a a j a l t a + i l o n p i l a a j a n a + i l o o n + i l o t u l i t e a l a n + i l o t u l i t e o n n e t t o m u u s + i l o t u l i t e t e h d a s + i l o t u l i t e v a r a s t o n + i l o t u l i t u s o n n e t t o m u u s + i l o t u l i t u s t e h d a s + i l o t u l i t u s v ä l i n e d i r e k t i i v i ä + i l o u u t i n e n + i l o u u t i s e n + i l o u u t i s t a + i l t a a + i l t a a n + i l t a h e l o k k i + i l t a h u v i t + i l t a i s t u n n o i s s a + i l t a i s t u n n o n + i l t a i s t u n n o s s a + i l t a i s t u n t o + i l t a i s t u n t o a + i l t a i s t u n t o i h i n + i l t a i s t u n t o j e n + i l t a i s t u n t o o n + i l t a j a k s o a + i l t a k a a k a o n s a + i l t a k e s k u s t e l u j e m m e + i l t a k o u l u n + i l t a k ä v e l y n + i l t a l e n n o n + i l t a l u k e m i s t a + i l t a m y ö h ä l l ä + i l t a m y ö h ä ä n + i l t a n a + i l t a o h j e l m a n + i l t a p ä i v ä + i l t a p ä i v ä k e s k u s t e l u i h i n + i l t a p ä i v ä k e s k u s t e l u u n + i l t a p ä i v ä l e h d e s s ä + i l t a p ä i v ä l e h d e t + i l t a p ä i v ä l e h d i s t ä + i l t a p ä i v ä l e h d i s t ö n + i l t a p ä i v ä l e h t i + i l t a p ä i v ä l e h t i e n + i l t a p ä i v ä l l ä + i l t a p ä i v ä n + i l t a p ä i v ä n ä + i l t a p ä i v ä t o i m i n t o j e n + i l t a p ä i v ä ä + i l t a p ä i v ä ä n + i l t a r u o k a i l u u n + i l t a s a t u + i l t a s a t u a + i l t a s a t u j a + i l t a t a p a h t u m i s s a + i l t a u u t i s t e n + i l t a v e l v o l l i s u u k s i a n i + i l t a v u o r o n + i l t a v u o r o o n + i l v e i l i j ä b a r b i + i l v e i l i j ä t + i l v e i l y ä + i m a g o a + i m a g o k a m p a n j a s t a + i m a g o k y s y m y s + i m a g o l l e + i m a g o m a i n o n t a a + i m a g o m a i n o n t a a n + i m a g o n r a k e n t a j a t + i m a g o n s a + i m a g o s y i s t ä + i m e l ä k i r s i k k a + i m e l ä k u r j e n h e r n e + i m e t t ä v i e n + i m e t t ä ä + i m e t y k s e e n + i m e t y k s e l l ä + i m e t y k s e n + i m e v ä i s k u o l l e i s u u d e n + i m e v ä i s k u o l l e i s u u s + i m e v ä i s k u o l l e i s u u s a s t e + i m e v ä i s k u o l l e i s u u t t a + i m e v ä i s t e n + i m e v ä i s t e n r a v i n n o s s a + i m e v ä i s t e n r a v i n t o + i m e v ä t + i m i t o i n t i l a i n s ä ä d ä n t ö ä + i m m a t e r i a a l i o i k e u d e n + i m m a t e r i a a l i o i k e u d e t + i m m a t e r i a a l i o i k e u k s i a + i m m a t e r i a a l i o i k e u k s i a m m e + i m m a t e r i a a l i o i k e u k s i e n + i m m a t e r i a a l i o i k e u k s i i n + i m m a t e r i a a l i o i k e u k s i l l e + i m m a t e r i a a l i o i k e u k s i n a + i m m a t e r i a a l i o i k e u k s i s t a + i m m a t e r i a a l i o i k e u s j ä r j e s t e l m ä n + i m m a t e r i a a l i o i k e u s l a u t a k u n n a l l e + i m m a t e r i a a l i o i k e u s l a u t a k u n t a + i m m a t e r i a a l i o i k e u t t a + i m m e n k o r e n t o + i m m u n i s o i n t i o h j e l m i e n + i m m u n i t e e t t i a + i m m u n i t e e t t i j ä r j e s t e l m ä n + i m m u u n i j ä r j e s t e l m ä + i m m u u n i j ä r j e s t e l m ä m m e + i m m u u n i j ä r j e s t e l m ä n + i m m u u n i j ä r j e s t e l m ä n s ä + i m m u u n i j ä r j e s t e l m ä s s ä k i n + i m m u u n i j ä r j e s t e l m ä ä + i m m u u n i j ä r j e s t e l m ä ä n + i m m u u n i k a t o t a u t i a + i m m u u n i k a t o v i r u k s e n + i m m u u n i k a t o v i r u s + i m m u u n i k a t o v i r u s t a + i m m u u n i p u u t o k s e s t a + i m m u u n i p u u t o s + i m m u u n i v ä l i t t e i n e n + i m p e d a n s s i s o v i t u s + i m p e r i a l i s m i a + i m p e r i a l i s m i n + i m p e r i a l i s t i e n + i m p e r i a l i s t i j o h t a j i e n + i m p e r i a l i s t i k e s k u k s i s t a + i m p e r i a l i s t i m a h d i t + i m p e r i a l i s t i p o l i t i i k a l l a + i m p e r i a l i s t i s e l l e + i m p e r i a l i s t i s e n + i m p e r i a l i s t i s e s t a + i m p e r i a l i s t i s e s t i + i m p e r i a l i s t i s e t + i m p e r i a l i s t i s i a + i m p e r i a l i s t i s i i n + i m p e r i a l i s t i s i l l e + i m p e r i a l i s t i s i s t a + i m p e r i a l i s t i s s a + i m p e r i a l i s t i s t a + i m p e r i a l i s t i s t e n + i m p e r i a l i s t i v a l l o i l l a + i m p e r i u m e i h i n + i m p e r i u m e i l t a + i m p e r i u m i t + i m p l a n t t e j a + i m p l a n t t i e n + i m p l a n t t i l e i k k a u k s i s t a + i m p l a n t t i r e k i s t e r i n + i m p l e m e n t a a t i o l u k u j a + i m p r o v i s o i m a t t a + i m p r o v i s o i t u a + i m p u l s s i n o m a i s e s t i + i m p u l s s i ä ä n e n + i m u e v ä m o n n i t + i m u k a l a + i m u k u p p i + i m u k ä r h i v i l l i v i i n i + i m u l a i t t e i d e n + i m u m e n e t e l m ä n + i m u p u m p p u + i m u p u m p p u v a i k u t u k s e l l e + i m u p u m p p u v a i k u t u k s e n + i m u s o l m u k e + i m u s o l m u k e s y ö p ä ä + i m u s o l m u k k e e t + i m u s u o n i s t o + i m u v a i k u t u s + i m u v a i k u t u s t a + i n a k t i v o i n t i t o i m i s t a + i n a r i n s a a m e l a i s e t + i n d e k s i i n + i n d e k s i l u k u i n a + i n d e k s i n + i n d e k s i r a h a s t o + i n d e k s i r a p o r t t i a + i n d e k s i s s ä + i n d e k s o i n t i l a u s e k k e i d e n + i n d i f f e r e n s s i k ä y r ä + i n d i g o a r a + i n d i g o k a r d i n a a l i + i n d i g o k a r m i i n i + i n d i g o l a p s i + i n d i g o n a a k k a + i n d i k a a t t o r e i d e n + i n d i k a a t t o r e i h i n + i n d i k a a t t o r e i s t a + i n d i k a a t t o r e i t a + i n d i k a a t t o r e j a + i n d i k a a t t o r i e n + i n d i k a a t t o r i f u n k t i o + i n d i k a a t t o r i j ä r j e s t e l m ä + i n d i k a a t t o r i l a j i + i n d i k a a t t o r i l l a + i n d i k a a t t o r i m u u t t u j i a + i n d i k a a t t o r i r y h m ä + i n d i k a a t t o r i t + i n d i k a a t t o r i t a u l u k o n + i n d i k a a t t o r i t y y p i n + i n d i v i d u a l i s t i s e m p i + i n d o n e s i a a + i n d o n e s i a a n + i n d o n e s i a l t a + i n d o n e s i a n + i n d o n e s i a n k ä k i k y y h k y + i n d o n e s i a n m ä n t y + i n d o n e s i a s s a + i n d o n e s i a s t a + i n d u k t i o l a k i + i n d u k t i o l a t a u s + i n d u k t i o l ä m m i t y s + i n d u k t i o s i l m u k k a + i n e r t i a s u u n n i s t u s + i n f e k t i o a a l l o n + i n f e k t i o i d e n + i n f e k t i o i l l e + i n f e k t i o i s t a + i n f e k t i o i t a + i n f e k t i o l u k u i h i n + i n f e k t i o m a h d o l l i s u u s + i n f e k t i o s a i r a u d e t + i n f e k t i o s a i r a u k s i a + i n f e k t i o s a i r a u k s i e n + i n f e k t i o t + i n f e k t i o t a u d i t + i n f e k t i o t a u t e i n a + i n f e k t i o t a u t e j a + i n f e k t i o t a u t i e n + i n f e k t i o t u l e h d u k s e t + i n f e k t i o v a a r o j a + i n f l a a t i o a r v i o i h i n + i n f l a a t i o a s t e + i n f l a a t i o a s t e e l l a + i n f l a a t i o a s t e e m m e + i n f l a a t i o a s t e e n + i n f l a a t i o a s t e e n s a + i n f l a a t i o a s t e e s e e n + i n f l a a t i o a s t e e s t a + i n f l a a t i o a s t e e t + i n f l a a t i o a s t e i s t a + i n f l a a t i o a s t e t t a + i n f l a a t i o e h t o j e n + i n f l a a t i o e n n u s t e e t + i n f l a a t i o e n n u s t e i d e n + i n f l a a t i o e n n u s t e i t a + i n f l a a t i o e r o o n + i n f l a a t i o e r o t + i n f l a a t i o h a a r u k k a + i n f l a a t i o h e r k k ä ä n + i n f l a a t i o h e r k ä l l ä + i n f l a a t i o i n d e k s i + i n f l a a t i o i n d e k s i i n + i n f l a a t i o i n d e k s i ä + i n f l a a t i o i n d i k a a t t o r i t + i n f l a a t i o j a r r u + i n f l a a t i o k a u d e l l a + i n f l a a t i o k a u s i + i n f l a a t i o k e h i t y k s e e n + i n f l a a t i o k e h i t y k s e n + i n f l a a t i o k e h i t y s + i n f l a a t i o k e r r o i n t a + i n f l a a t i o k e r t o i m i e n + i n f l a a t i o k e r t o m u s t a + i n f l a a t i o k i e r t e e n + i n f l a a t i o k o r o t u s + i n f l a a t i o k r i t e e r e j ä + i n f l a a t i o k r i t e e r i + i n f l a a t i o k r i t e e r i e n + i n f l a a t i o k r i t e e r i n + i n f l a a t i o k r i t e e r i s t ä + i n f l a a t i o k r i t e e r i ä + i n f l a a t i o k u s t a n n u k s i a + i n f l a a t i o k u u m e t t a + i n f l a a t i o k ä s i t t e e l l ä + i n f l a a t i o l i s ä y k s e t + i n f l a a t i o l i s ä ä + i n f l a a t i o l u k e m i e n + i n f l a a t i o l u k e m i i n + i n f l a a t i o l u v u i s t a + i n f l a a t i o l u v u t + i n f l a a t i o m u k a u t u k s e n + i n f l a a t i o n + i n f l a a t i o n i n d e k s i ä + i n f l a a t i o n v a s t a i n e n + i n f l a a t i o n v a s t a i s e e n + i n f l a a t i o n v a s t a i s e t + i n f l a a t i o n ä k y m i n ä + i n f l a a t i o o n + i n f l a a t i o p a i n e + i n f l a a t i o p a i n e e t + i n f l a a t i o p a i n e i d e n + i n f l a a t i o p a i n e i s i i n + i n f l a a t i o p a i n e i t a + i n f l a a t i o p a i n e t t a + i n f l a a t i o p e l k o o n + i n f l a a t i o p e l o l l a a n + i n f l a a t i o p i i k k i + i n f l a a t i o p r o s e n t i t + i n f l a a t i o p r o s e n t t e i h i n + i n f l a a t i o p r o s e n t t i + i n f l a a t i o p r o s e n t t i a + i n f l a a t i o r a j a a + i n f l a a t i o r a j a n + i n f l a a t i o r a j o i t u k s i s t a + i n f l a a t i o r i s k i + i n f l a a t i o r i s k i n + i n f l a a t i o s t a + i n f l a a t i o s u u n t a u k s i s t a + i n f l a a t i o t a + i n f l a a t i o t a s o + i n f l a a t i o t a s o a + i n f l a a t i o t a s o i h i n + i n f l a a t i o t a s o j a + i n f l a a t i o t a s o n + i n f l a a t i o t a s o o n + i n f l a a t i o t a v o i t e + i n f l a a t i o t a v o i t e t t a + i n f l a a t i o t a v o i t t e e l l a + i n f l a a t i o t a v o i t t e e n + i n f l a a t i o t a v o i t t e e s s a + i n f l a a t i o t a v o i t t e e t + i n f l a a t i o t a v o i t t e i d e n + i n f l a a t i o t a v o i t t e i s t a + i n f l a a t i o t a v o i t t e i t a + i n f l a a t i o t i l a n n e + i n f l a a t i o t i l a s t o i s t a + i n f l a a t i o t i l a s t o j e n + i n f l a a t i o t y y p p i e n + i n f l a a t i o u h k a + i n f l a a t i o v a a r a o n g e l m a t + i n f l a a t i o v a i k u t u k s e n + i n f l a a t i o v a i k u t u k s e t + i n f l a a t i o v a k a u d e s t a + i n f l a a t i o v a r a u s + i n f l a a t i o v a u h d i n + i n f l a a t i o v a u h t i + i n f l a a t i o v a u h t i a + i n f l u e n s s a a + i n f l u e n s s a e p i d e m i a + i n f l u e n s s a e p i d e m i a a n + i n f l u e n s s a e p i d e m i a n + i n f l u e n s s a e p i d e m i a s t a + i n f l u e n s s a e p i d e m i a t + i n f l u e n s s a h a r j o i t u k s e e n + i n f l u e n s s a i n f e k t i o + i n f l u e n s s a j u t u s s a + i n f l u e n s s a k a u d e n + i n f l u e n s s a l t a + i n f l u e n s s a l ä ä k e t t ä + i n f l u e n s s a n + i n f l u e n s s a p a n d e m i a + i n f l u e n s s a p a n d e m i a a + i n f l u e n s s a p a n d e m i a a n + i n f l u e n s s a p a n d e m i a n + i n f l u e n s s a p a n d e m i a s t a + i n f l u e n s s a p a n d e m i o i d e n + i n f l u e n s s a p a n d e m i o i t a + i n f l u e n s s a r o k o t e + i n f l u e n s s a r o k o t t e e s t a + i n f l u e n s s a r o k o t t e i s t a + i n f l u e n s s a r o k o t u s k a m p a n j o i d e n + i n f l u e n s s a r o k o t u s s t r a t e g i o i t a + i n f l u e n s s a r o k o t u s t e n + i n f l u e n s s a t a p a u s t a + i n f l u e n s s a t y ö r y h m ä + i n f l u e n s s a u h k a + i n f l u e n s s a v i r u k s e e n + i n f l u e n s s a v i r u k s e n + i n f l u e n s s a v i r u k s i a + i n f l u e n s s a v i r u s + i n f l u e n s s a v i r u s r o k o t t e i t a + i n f o k ö y h y y s + i n f o r m a a t i o a i n e i s t o a + i n f o r m a a t i o a j a n + i n f o r m a a t i o a l a n + i n f o r m a a t i o a r k k i t e h t u u r i + i n f o r m a a t i o a v a r u u d e n + i n f o r m a a t i o e r o j a + i n f o r m a a t i o j ä r j e s t e l m i ä + i n f o r m a a t i o k a m p a n j a + i n f o r m a a t i o k a n a v i a + i n f o r m a a t i o k e s k u k s e l l e + i n f o r m a a t i o k e s k u k s e n + i n f o r m a a t i o k e s k u k s e n a + i n f o r m a a t i o k e s k u k s e s t a + i n f o r m a a t i o k e s k u s + i n f o r m a a t i o k u s t a n n u k s e t + i n f o r m a a t i o k u s t a n n u k s i a + i n f o r m a a t i o k u s t a n n u s t e n + i n f o r m a a t i o k ä y t ä n n ö t + i n f o r m a a t i o k ö y h y y s + i n f o r m a a t i o l o g i s t i i k k a + i n f o r m a a t i o l u k u t a i t o + i n f o r m a a t i o m a a i l m a n + i n f o r m a a t i o m a r k k i n o i d e n + i n f o r m a a t i o m u o t o i l u + i n f o r m a a t i o n v a i h d o l l e + i n f o r m a a t i o p i s t e i t ä + i n f o r m a a t i o p o l i i t t i n e n + i n f o r m a a t i o p o l i t i i k a n + i n f o r m a a t i o p o l i t i i k k a a + i n f o r m a a t i o p o l i t i i k k a m m e + i n f o r m a a t i o s o d a n + i n f o r m a a t i o s o d a n k ä y n t i + i n f o r m a a t i o s t r a t e g i a s s a + i n f o r m a a t i o t a + i n f o r m a a t i o t e k n i i k a n + i n f o r m a a t i o t e k n i i k k a + i n f o r m a a t i o t e k n i i k k a a + i n f o r m a a t i o t e k n i s e t + i n f o r m a a t i o t e k n o l o g i a + i n f o r m a a t i o t e k n o l o g i a a + i n f o r m a a t i o t e k n o l o g i a n + i n f o r m a a t i o t e k n o l o g i a s s a + i n f o r m a a t i o t e k n o l o g i a t + i n f o r m a a t i o t e k n o l o g i o i d e n + i n f o r m a a t i o t e k n o l o g i o i t a + i n f o r m a a t i o t e o r i a + i n f o r m a a t i o t u l v a + i n f o r m a a t i o t u l v a n + i n f o r m a a t i o t u l v a s s a + i n f o r m a a t i o t u o t t e i s i i n + i n f o r m a a t i o t u r v a l l i s u u s + i n f o r m a a t i o t u r v a t t o m u u s + i n f o r m a a t i o t u t k i m u s + i n f o r m a a t i o v a l l a n k u m o u k s e n + i n f o r m a a t i o v ä y l i ä + i n f o r m a a t i o y h t e i s k u n n a n + i n f o r m a a t i o y h t e i s k u n n a s s a + i n f o r m a a t i o y h t e i s k u n t a + i n f o r m a a t i o y h t e i s k u n t a a + i n f o r m a a t i o ä h k y + i n f o r m a t i i v i s e m m a k s i + i n f o r m o i d a a n + i n f o r m o i d u k s i + i n f o r m o i m i s e s t a + i n f r a p u n a k a m e r o i n + i n f r a p u n a l a m p p u j e n + i n f r a p u n a p o m m i t e k n o l o g i a n + i n f r a p u n a s p e k t r o s k o p i a + i n f r a p u n a t ä h t i t i e d e + i n f r a s t r u k t u u r e i d e n + i n f r a s t r u k t u u r e i h i n + i n f r a s t r u k t u u r e i l l a + i n f r a s t r u k t u u r e i s t a + i n f r a s t r u k t u u r e i s t a a n + i n f r a s t r u k t u u r e j a + i n f r a s t r u k t u u r i a + i n f r a s t r u k t u u r i a l o i l l a + i n f r a s t r u k t u u r i a l o i t t e e n + i n f r a s t r u k t u u r i e m m e + i n f r a s t r u k t u u r i e n + i n f r a s t r u k t u u r i h a k k e i t a + i n f r a s t r u k t u u r i h a n k e + i n f r a s t r u k t u u r i h a n k e t t a + i n f r a s t r u k t u u r i h a n k k e e s t a + i n f r a s t r u k t u u r i h a n k k e e t + i n f r a s t r u k t u u r i h a n k k e i d e n + i n f r a s t r u k t u u r i h a n k k e i l l a + i n f r a s t r u k t u u r i h a n k k e i l l e + i n f r a s t r u k t u u r i h a n k k e i s i i n + i n f r a s t r u k t u u r i h a n k k e i s s a + i n f r a s t r u k t u u r i h a n k k e i s s a a n + i n f r a s t r u k t u u r i h a n k k e i s t a + i n f r a s t r u k t u u r i h a n k k e i t a + i n f r a s t r u k t u u r i i n + i n f r a s t r u k t u u r i j ä r j e s t e l m ä + i n f r a s t r u k t u u r i k a p a s i t e e t i n + i n f r a s t r u k t u u r i k a p a s i t e e t t i a + i n f r a s t r u k t u u r i k e h i t y k s e e n + i n f r a s t r u k t u u r i k e h i t y k s e s t ä + i n f r a s t r u k t u u r i k i l p a i l u + i n f r a s t r u k t u u r i k i l p a i l u a + i n f r a s t r u k t u u r i k s i + i n f r a s t r u k t u u r i k u s t a n n u k s e t + i n f r a s t r u k t u u r i k u s t a n n u k s i a + i n f r a s t r u k t u u r i k u s t a n n u k s i i n + i n f r a s t r u k t u u r i k u s t a n n u k s i s t a + i n f r a s t r u k t u u r i k u s t a n n u s t e n + i n f r a s t r u k t u u r i k y s y m y k s i i n + i n f r a s t r u k t u u r i k y s y m y k s i s s ä + i n f r a s t r u k t u u r i k y s y m y k s i s t ä + i n f r a s t r u k t u u r i k ä s i t t e i d e n + i n f r a s t r u k t u u r i k ä y t t ö m a k s u j e n + i n f r a s t r u k t u u r i l l a + i n f r a s t r u k t u u r i l l e + i n f r a s t r u k t u u r i m a k s u i h i n + i n f r a s t r u k t u u r i m a k s u i s t a + i n f r a s t r u k t u u r i m a k s u j a + i n f r a s t r u k t u u r i m a k s u j e n + i n f r a s t r u k t u u r i m a k s u n s a + i n f r a s t r u k t u u r i m a k s u t + i n f r a s t r u k t u u r i m e n o j e n + i n f r a s t r u k t u u r i m ä ä r ä r a h o i s t a + i n f r a s t r u k t u u r i n + i n f r a s t r u k t u u r i o h j e l m a s s a + i n f r a s t r u k t u u r i o h j e l m a t + i n f r a s t r u k t u u r i o h j e l m i a + i n f r a s t r u k t u u r i o h j e l m i i n + i n f r a s t r u k t u u r i o n g e l m a n s a + i n f r a s t r u k t u u r i o n g e l m a t + i n f r a s t r u k t u u r i o n g e l m i e n + i n f r a s t r u k t u u r i p a k e t i s s a + i n f r a s t r u k t u u r i p a k e t t i + i n f r a s t r u k t u u r i p a k e t t i a + i n f r a s t r u k t u u r i p a l v e l u i t a + i n f r a s t r u k t u u r i p a l v e l u j a + i n f r a s t r u k t u u r i p a r a n n u k s i a + i n f r a s t r u k t u u r i p a r a n n u s t e n + i n f r a s t r u k t u u r i p o l i t i i k a n + i n f r a s t r u k t u u r i p o l i t i i k k a + i n f r a s t r u k t u u r i p o l i t i i k k a a + i n f r a s t r u k t u u r i p o l i t i i k k a a n s a + i n f r a s t r u k t u u r i p r o j e k t i t + i n f r a s t r u k t u u r i r a h a s t o n + i n f r a s t r u k t u u r i r a h a s t o s t a m m e + i n f r a s t r u k t u u r i r a j o i t u s t e n + i n f r a s t r u k t u u r i r a k e n t e i t a + i n f r a s t r u k t u u r i s e k t o r i n + i n f r a s t r u k t u u r i s i j o i t u k s i i n + i n f r a s t r u k t u u r i s i j o i t u k s i s t a + i n f r a s t r u k t u u r i s s a + i n f r a s t r u k t u u r i s t a + i n f r a s t r u k t u u r i s t r a t e g i a m m e + i n f r a s t r u k t u u r i s u u n n i t e l m a a + i n f r a s t r u k t u u r i s u u n n i t t e l u s s a + i n f r a s t r u k t u u r i t + i n f r a s t r u k t u u r i t a r p e e t + i n f r a s t r u k t u u r i t a r p e i d e n + i n f r a s t r u k t u u r i t a r p e i t a + i n f r a s t r u k t u u r i t a r v e t t a + i n f r a s t r u k t u u r i t a s o l l e + i n f r a s t r u k t u u r i t a v o i t t e e t + i n f r a s t r u k t u u r i t i l a n n e + i n f r a s t r u k t u u r i t i l a n t e e n + i n f r a s t r u k t u u r i t o i m e n p i t e i s i i n + i n f r a s t r u k t u u r i t o i m e n p i t e i t ä + i n f r a s t r u k t u u r i t o i m i a + i n f r a s t r u k t u u r i t o i m i e n + i n f r a s t r u k t u u r i t o i m i l l a + i n f r a s t r u k t u u r i t o i m i n + i n f r a s t r u k t u u r i t u k e a + i n f r a s t r u k t u u r i t u k i e n + i n f r a s t r u k t u u r i t u k i o h j e l m i a + i n f r a s t r u k t u u r i t u t k i m u k s e e n + i n f r a s t r u k t u u r i t y ö t + i n f r a s t r u k t u u r i t ö i h i n + i n f r a s t r u k t u u r i t ö i l l e + i n f r a s t r u k t u u r i t ö i l l ä + i n f r a s t r u k t u u r i t ö i s s ä + i n f r a s t r u k t u u r i t ö i t ä + i n f r a s t r u k t u u r i v a a t i m u k s i a + i n f r a s t r u k t u u r i v a h i n g o i s t a + i n f r a s t r u k t u u r i v a i h t o e h t o j a + i n f r a s t r u k t u u r i v e r k k o + i n f r a s t r u k t u u r i v e r k k o i h i n + i n f r a s t r u k t u u r i v e r k k o j a + i n f r a s t r u k t u u r i v e r k k o j e n + i n f r a s t r u k t u u r i v e r k o i s t a + i n f r a s t r u k t u u r i v e r k o k s i + i n f r a s t r u k t u u r i v e r k o n + i n f r a s t r u k t u u r i v e r k o s t o + i n f r a s t r u k t u u r i v e r k o s t o i s t a + i n f r a s t r u k t u u r i v e r k o s t o j e n + i n f r a s t r u k t u u r i v e r k o s t o n + i n f r a s t r u k t u u r i v e r k o t + i n f r a s t r u k t u u r i v i r a n o m a i s i l t a + i n f r a s t r u k t u u r i y h t e y d e n + i n f r a s t r u k t u u r i y h t e y d e t + i n f r a s t r u k t u u r i y r i t y k s e n + i n g u u š i t + i n h i m i l l i s e e n + i n h i m i l l i s e l l ä + i n h i m i l l i s e m m ä k s i + i n h i m i l l i s e m m ä n + i n h i m i l l i s e m m ä s t ä + i n h i m i l l i s e m p i + i n h i m i l l i s e m p i e n + i n h i m i l l i s e m p i ä + i n h i m i l l i s e m p ä ä + i n h i m i l l i s e m p ä ä n + i n h i m i l l i s e n + i n h i m i l l i s e s s ä + i n h i m i l l i s e s t ä + i n h i m i l l i s e t + i n h i m i l l i s i i n + i n h i m i l l i s i l l ä + i n h i m i l l i s i m m i s t ä + i n h i m i l l i s i n + i n h i m i l l i s i n t ä + i n h i m i l l i s i s t ä + i n h i m i l l i s i ä + i n h i m i l l i s t e n + i n h i m i l l i s t ä m i s t ä + i n h i m i l l i s y y d e n + i n h i m i l l i s y y d e s t ä + i n h i m i l l i s y y t t ä + i n h i m i l l i s y y t t ä ä n + i n h o t t a v a m p a a + i n h o t t a v a s t a + i n h o t u i m m a k s i + i n j e k t i o n e u l o j e n + i n k a k e r t t u l i + i n k a k u r p p a + i n k a s i r k u t + i n k a t + i n k a t i i r a + i n k a v a l t i o n + i n k e r i l ä i s e t + i n k v i s i t i o h a l l i n n o s t a + i n k v i s i t i o m a l l i i n + i n k v i s i t i o m a l l i n + i n n o i s s a n i + i n n o i t e t t a v a + i n n o i t t a a + i n n o i t t a j i n a + i n n o i t t a m a a n + i n n o i t t a m a n a + i n n o i t t a n e e t + i n n o i t t a v i s t a + i n n o i t u s t a + i n n o k k a a m m i n + i n n o k k a a n a + i n n o k k a a s t a + i n n o k k a i m m i n + i n n o k k a i m p i a + i n n o k k a i m p i e n + i n n o k k a i n a + i n n o k k a i t a + i n n o k k u u d e s t a + i n n o k k u u t t a + i n n o n + i n n o s s a a n + i n n o s t a a + i n n o s t a v a a + i n n o s t a v a m m a l l a + i n n o s t a v a m p i a + i n n o s t a v i m m i s t a + i n n o s t a v i n + i n n o s t e t t a v a + i n n o s t u a + i n n o s t u i + i n n o s t u k o + i n n o s t u m i s e l l e + i n n o s t u m m e + i n n o s t u n e e m m i n + i n n o s t u n e e m p a a + i n n o s t u n e e m p i a + i n n o s t u n e e n a + i n n o s t u n e e t + i n n o s t u n e i s u u t e n s a + i n n o s t u n e i t a + i n n o s t u n u t t a + i n n o s t u s t a + i n n o s t u t a a n + i n n o s t u v a t + i n n o t o n t a + i n n o t t o m u u d e s t a + i n n o v a a t i o a i h e t t a + i n n o v a a t i o a l a + i n n o v a a t i o a l a a n + i n n o v a a t i o a l a l l a + i n n o v a a t i o a l a n + i n n o v a a t i o a l l i a n s s i n + i n n o v a a t i o a l o i t e t t a + i n n o v a a t i o a l o i t t e e n + i n n o v a a t i o a l o i t t e i d e n + i n n o v a a t i o b u d j e t t i a + i n n o v a a t i o e k o s y s t e e m i + i n n o v a a t i o h a a s t e e s e e n + i n n o v a a t i o h a k u i n e n + i n n o v a a t i o h a l u + i n n o v a a t i o h a n k e + i n n o v a a t i o h a n k k e e n + i n n o v a a t i o h a n k k e i d e n + i n n o v a a t i o h a n k k e i s s a + i n n o v a a t i o h a n k k e i t a + i n n o v a a t i o h e n g e n + i n n o v a a t i o h e n k e ä + i n n o v a a t i o h u i p p u k o k o u k s e n s a + i n n o v a a t i o i d e n + i n n o v a a t i o i h i n + i n n o v a a t i o i l m a p i i r i n + i n n o v a a t i o i l m a s t o a k i n + i n n o v a a t i o i n d i k a a t t o r i n + i n n o v a a t i o i n v e s t o i n t i e n + i n n o v a a t i o i s s a + i n n o v a a t i o i s t a + i n n o v a a t i o i t a + i n n o v a a t i o j o h t a m i n e n + i n n o v a a t i o j o h t o + i n n o v a a t i o j o h t o i s e n + i n n o v a a t i o j o u r n a l i s m i + i n n o v a a t i o j u n a s t a + i n n o v a a t i o j ä r j e s t e l m i e n + i n n o v a a t i o j ä r j e s t e l m ä + i n n o v a a t i o j ä r j e s t e l m ä t + i n n o v a a t i o k a p a s i t e e t i s t a + i n n o v a a t i o k a p a s i t e e t t i + i n n o v a a t i o k e h i t y s t ä + i n n o v a a t i o k e s k u k s e n + i n n o v a a t i o k e s k u k s i a + i n n o v a a t i o k e s k u k s i i n + i n n o v a a t i o k e s k u s t e n + i n n o v a a t i o k e t j u + i n n o v a a t i o k e t j u a + i n n o v a a t i o k e t j u n + i n n o v a a t i o k i l p a i l u s s a + i n n o v a a t i o k i l p a i l u u n + i n n o v a a t i o k l u s t e r e i d e n + i n n o v a a t i o k o k o u s + i n n o v a a t i o k o n v e n t i n + i n n o v a a t i o k o n v e n t i s s a + i n n o v a a t i o k u i l u + i n n o v a a t i o k u i l u a + i n n o v a a t i o k u l t t u u r i a + i n n o v a a t i o k u m p p a n u u d e n + i n n o v a a t i o k u m p p a n u u d e s s a + i n n o v a a t i o k u m p p a n u u d e t + i n n o v a a t i o k u m p p a n u u k s i a + i n n o v a a t i o k u m p p a n u u k s i e n + i n n o v a a t i o k u m p p a n u u k s i s s a + i n n o v a a t i o k u m p p a n u u k s i s t a + i n n o v a a t i o k u m p p a n u u s + i n n o v a a t i o k y k y + i n n o v a a t i o k y k y i s e m p i ä + i n n o v a a t i o k y k y n s ä + i n n o v a a t i o k y k y y n + i n n o v a a t i o k y k y ä + i n n o v a a t i o k y k y ä ä n + i n n o v a a t i o k y s y m y k s i s t ä + i n n o v a a t i o k y v y n + i n n o v a a t i o k y v y s t ä + i n n o v a a t i o k ä s i t t e e n + i n n o v a a t i o l a b o r a t o r i o i t a + i n n o v a a t i o l a b o r a t o r i o n a + i n n o v a a t i o m a h d o l l i s u u d e t + i n n o v a a t i o m a h d o l l i s u u k s i a + i n n o v a a t i o m a h d o l l i s u u k s i a a n + i n n o v a a t i o m a h d o l l i s u u k s i e n + i n n o v a a t i o m a h d o l l i s u u k s i i n + i n n o v a a t i o m a h d o l l i s u u k s i l l a + i n n o v a a t i o m a r k k i n o i l l a + i n n o v a a t i o m a r k k i n o i t a + i n n o v a a t i o m e n e t e l m i e n + i n n o v a a t i o m e n o i h i n + i n n o v a a t i o m e n o j e n + i n n o v a a t i o m i e t i n n ö s s ä + i n n o v a a t i o n + i n n o v a a t i o n e u v o s t o t + i n n o v a a t i o n ä k y m ä t + i n n o v a a t i o o n + i n n o v a a t i o p a i n e + i n n o v a a t i o p a i n e i t a + i n n o v a a t i o p a i n o p i s t e e t + i n n o v a a t i o p a n e e l i n + i n n o v a a t i o p a r a d o k s i + i n n o v a a t i o p e d a g o g i i k k a + i n n o v a a t i o p e r u s t e i s t a + i n n o v a a t i o p o h j a n + i n n o v a a t i o p o l i t i i k a l l a + i n n o v a a t i o p o l i t i i k a l l e + i n n o v a a t i o p o l i t i i k a n + i n n o v a a t i o p o l i t i i k a s s a + i n n o v a a t i o p o l i t i i k a s t a + i n n o v a a t i o p o l i t i i k k a + i n n o v a a t i o p o l i t i i k k a a + i n n o v a a t i o p o l i t i i k k a a m m e + i n n o v a a t i o p o l i t i i k k a a n + i n n o v a a t i o p o l i t i i k k a m m e + i n n o v a a t i o p o l i t i i k k a n s a + i n n o v a a t i o p o l i t i i k k o j a + i n n o v a a t i o p o l i t i i k k o j e n + i n n o v a a t i o p o n n i s t e l u j a + i n n o v a a t i o p o t e n t i a a l i + i n n o v a a t i o p o t e n t i a a l i a + i n n o v a a t i o p r o s e s s e i s s a + i n n o v a a t i o p r o s e s s i + i n n o v a a t i o p r o s e s s i a + i n n o v a a t i o p r o s e s s i n + i n n o v a a t i o p r o s e s s i s s a + i n n o v a a t i o p r o s e s s i t + i n n o v a a t i o p u i t e o h j e l m a s s a + i n n o v a a t i o p ä i v ä t + i n n o v a a t i o p ä ä o m a n + i n n o v a a t i o r a h a s t o + i n n o v a a t i o r a h a s t o i h i n + i n n o v a a t i o r a h a s t o n + i n n o v a a t i o r a h a s t o o n + i n n o v a a t i o r a h a s t o s t a + i n n o v a a t i o r a k e n t e e s e e n + i n n o v a a t i o r i n t a m i a + i n n o v a a t i o r y ö p p y y n + i n n o v a a t i o s e k t o r i + i n n o v a a t i o s e t e l i + i n n o v a a t i o s o p i m u s t a + i n n o v a a t i o s s a k i n + i n n o v a a t i o s t a + i n n o v a a t i o s t r a t e g i a + i n n o v a a t i o s t r a t e g i a a + i n n o v a a t i o s t r a t e g i a l l e + i n n o v a a t i o s t r a t e g i a n + i n n o v a a t i o s t r a t e g i a s t a + i n n o v a a t i o s t r a t e g i a t + i n n o v a a t i o s t r a t e g i o i t a + i n n o v a a t i o s u u n n i t e l m a + i n n o v a a t i o s u u n n i t e l m a s t a + i n n o v a a t i o s y k l e j ä + i n n o v a a t i o s y k l i e n + i n n o v a a t i o s y k l i s s ä + i n n o v a a t i o t + i n n o v a a t i o t a + i n n o v a a t i o t a h t i a + i n n o v a a t i o t a i t o j e n + i n n o v a a t i o t a l o u t e e n + i n n o v a a t i o t a r p e e s e e n + i n n o v a a t i o t a s o a + i n n o v a a t i o t a v o i t t e i t a + i n n o v a a t i o t e k i j ä + i n n o v a a t i o t e k n i i k k a + i n n o v a a t i o t h a n + i n n o v a a t i o t i e t o k a n t a + i n n o v a a t i o t o i m e t + i n n o v a a t i o t o i m i a + i n n o v a a t i o t o i m i e n + i n n o v a a t i o t o i m i i n + i n n o v a a t i o t o i m i n n a n + i n n o v a a t i o t o i m i n n a s t a + i n n o v a a t i o t o i m i n t a a + i n n o v a a t i o t o i m i n t a a n + i n n o v a a t i o t o i m i n t a a n s a + i n n o v a a t i o t o i m i s s a + i n n o v a a t i o t o i m i s t a + i n n o v a a t i o t u e n + i n n o v a a t i o t u k e a + i n n o v a a t i o t u k i + i n n o v a a t i o t u k i m e n e t t e l y i s s ä + i n n o v a a t i o t y ö t ä + i n n o v a a t i o u n i o n i + i n n o v a a t i o u n i o n i a + i n n o v a a t i o u n i o n i a l o i t e + i n n o v a a t i o u n i o n i a l o i t t e e l l e + i n n o v a a t i o u n i o n i a l o i t t e e s e e n + i n n o v a a t i o u n i o n i a l o i t t e e s s a + i n n o v a a t i o u n i o n i h a n k k e e s s a + i n n o v a a t i o u n i o n i h a n k k e e s t a + i n n o v a a t i o u n i o n i k s i + i n n o v a a t i o u n i o n i l i p p u l a i v a + i n n o v a a t i o u n i o n i l l a + i n n o v a a t i o u n i o n i n + i n n o v a a t i o u n i o n i s s a + i n n o v a a t i o u n i o n i s t a + i n n o v a a t i o v a j e t t a + i n n o v a a t i o v a l l a n k u m o u k s e n + i n n o v a a t i o v a l m i u d e t + i n n o v a a t i o v a l m i u k s i a + i n n o v a a t i o v a l m i u k s i e n + i n n o v a a t i o v a l m i u k s i i n + i n n o v a a t i o v a l m i u t e n s a + i n n o v a a t i o v a u h t i + i n n o v a a t i o v e r k k o j a + i n n o v a a t i o v e r k o s t o i l l e + i n n o v a a t i o v e r k o s t o j a + i n n o v a a t i o v e r k o s t o s t a + i n n o v a a t i o v o i m a a + i n n o v a a t i o v o i m a a n + i n n o v a a t i o v ä l i n e e t + i n n o v a a t i o y h t e i s k u n t a a + i n n o v a a t i o y h t e i s t y ö t ä + i n n o v a a t i o y h t e i s ö i s s ä + i n n o v a a t i o y h t e i s ö i s t ä + i n n o v a a t i o y h t e i s ö j e n + i n n o v a a t i o y h t e i s ö t + i n n o v a a t i o y k s i k k ö + i n n o v a a t i o y k s i k ö t + i n n o v a a t i o y m p ä r i s t ö + i n n o v a a t i o y r i t y k s e n + i n n o v a t i i v i s e k s i + i n n o v a t i i v i s e m m a n + i n n o v a t i i v i s e m m a t + i n n o v a t i i v i s e m m i n + i n n o v a t i i v i s e m p a a + i n n o v a t i i v i s e m p i + i n n o v a t i i v i s e m p i a + i n n o v a t i i v i s e n a + i n n o v a t i i v i s e s t i + i n n o v a t i i v i s e t + i n n o v a t i i v i s i a + i n n o v a t i i v i s i i n + i n n o v a t i i v i s i l l e + i n n o v a t i i v i s i m m a t + i n n o v a t i i v i s i m m i l l a + i n n o v a t i i v i s i m m i s t a + i n n o v a t i i v i s i m p a n a + i n n o v a t i i v i s i m p i a + i n n o v a t i i v i s i m p i i n + i n n o v a t i i v i s i n + i n n o v a t i i v i s i n e + i n n o v a t i i v i s i s t a + i n n o v a t i i v i s t a + i n n o v a t i i v i s t e n + i n n o v a t i i v i s u u d e s t a + i n n o v a t i i v i s u u t t a a n + i n n o v o i n n i l l e + i n n o v o i n n i n + i n n o v o i n n i s s a + i n n o v o i n n i s t a + i n n o v o i n t i a + i n n o v o i n t i a l a + i n n o v o i n t i a l o i t t e e n + i n n o v o i n t i a l u e + i n n o v o i n t i a l u e e n + i n n o v o i n t i e d e l l y t y k s e t + i n n o v o i n t i h a l u t t o m u u s + i n n o v o i n t i h a n k k e i d e n + i n n o v o i n t i h a n k k e i s i i n + i n n o v o i n t i i n + i n n o v o i n t i j ä r j e s t e l m ä s s ä + i n n o v o i n t i j ä r j e s t e l m ä t + i n n o v o i n t i k a p a s i t e e t i n + i n n o v o i n t i k a p a s i t e e t t i n s a + i n n o v o i n t i k e s k u k s i i n + i n n o v o i n t i k e s k u s t e n + i n n o v o i n t i k e t j u + i n n o v o i n t i k e t j u a + i n n o v o i n t i k e t j u n + i n n o v o i n t i k u i l u j a + i n n o v o i n t i k u i l u n + i n n o v o i n t i k u l t t u u r i a + i n n o v o i n t i k u m p p a n u u d e n + i n n o v o i n t i k u m p p a n u u s + i n n o v o i n t i k u s t a n n u k s e t + i n n o v o i n t i k y k y + i n n o v o i n t i k y k y i n e n + i n n o v o i n t i k y k y i s i ä + i n n o v o i n t i k y k y ä + i n n o v o i n t i k y k y ä ä n + i n n o v o i n t i k y v y n + i n n o v o i n t i m a h d o l l i s u u k s i a + i n n o v o i n t i m a h d o l l i s u u k s i e n + i n n o v o i n t i m a h d o l l i s u u k s i l l e + i n n o v o i n t i m a h d o l l i s u u k s i s t a + i n n o v o i n t i m a l l i + i n n o v o i n t i m a l l i a + i n n o v o i n t i m a l l i n + i n n o v o i n t i m e n e t t e l y j ä + i n n o v o i n t i m e n o j a + i n n o v o i n t i o h j e l m a + i n n o v o i n t i o h j e l m a n + i n n o v o i n t i o h j e l m a s t a + i n n o v o i n t i o h j e l m i i n + i n n o v o i n t i o h j e l m i s s a a n + i n n o v o i n t i o h j e l m i s t a + i n n o v o i n t i o p a s t a + i n n o v o i n t i p a l k i n t o j ä r j e s t e l m i ä + i n n o v o i n t i p e r i n t e i t ä + i n n o v o i n t i p o l i t i i k a n + i n n o v o i n t i p o l i t i i k k a + i n n o v o i n t i p o l i t i i k k a a + i n n o v o i n t i p o l i t i i k k a a n + i n n o v o i n t i p o l i t i i k k o j e n + i n n o v o i n t i p o n n i s t u s t e n + i n n o v o i n t i p o t e n t i a a l i a + i n n o v o i n t i p o t e n t i a a l i a a n + i n n o v o i n t i p o t e n t i a a l i n + i n n o v o i n t i p u i t t e i s s a + i n n o v o i n t i r a h o i t u s + i n n o v o i n t i r y p p ä i d e n + i n n o v o i n t i s t r a t e g i a + i n n o v o i n t i s t r a t e g i a a + i n n o v o i n t i s t r a t e g i a n + i n n o v o i n t i s u u n n i t e l m a + i n n o v o i n t i s u u n n i t e l m a n + i n n o v o i n t i s y k l i s s ä + i n n o v o i n t i t a r k o i t u k s i i n + i n n o v o i n t i t o i m i i n + i n n o v o i n t i t o i m i n n a s s a + i n n o v o i n t i t o i m i n t a a + i n n o v o i n t i t u l o s t e n + i n n o v o i n t i t y ö l l e + i n n o v o i n t i v a l m i u k s i a + i n n o v o i n t i v a l m i u k s i a a n + i n n o v o i n t i v a l m i u k s i e n + i n n o v o i n t i v a l m i u k s i e n s a + i n n o v o i n t i v ä l i n e e n + i n n o v o i n t i y h t e i s ö + i n n o v o i n t i y h t e i s ö j e n + i n n o v o i n t i y h t e i s ö t + i n n o v o i n t i y k s i k ö n + i n o s i i n i m o n o f o s f a a t t i + i n s i n ö ö r e j ä m m e + i n s i n ö ö r i i n + i n s i n ö ö r i l i i t t o j e n + i n s i n ö ö r i n + i n s i n ö ö r i t a i d o i l l e + i n s i n ö ö r i t o i m i s t o i h i n + i n s i n ö ö r i t o i m i s t o j e n + i n s i n ö ö r i t y ö + i n s p i r a a t i o l ä h d e + i n s p i r a a t i o n + i n s p i r a a t i o n l ä h t e e n ä + i n s p i r a a t i o t a + i n s p i r o i t a v a + i n s t i t u t i o n a a l i s e e n + i n s t i t u t i o n a a l i s e l l a + i n s t i t u t i o n a a l i s e l l e + i n s t i t u t i o n a a l i s e n + i n s t i t u t i o n a a l i s e n a + i n s t i t u t i o n a a l i s e s s a + i n s t i t u t i o n a a l i s e s t a + i n s t i t u t i o n a a l i s e s t i + i n s t i t u t i o n a a l i s e t + i n s t i t u t i o n a a l i s i a + i n s t i t u t i o n a a l i s i i n + i n s t i t u t i o n a a l i s i n + i n s t i t u t i o n a a l i s i s s a + i n s t i t u t i o n a a l i s i s t a + i n s t i t u t i o n a a l i s t a + i n s t i t u t i o n a a l i s t e n + i n s t i t u t i o n a a l i s t u n e e s t a + i n s t i t u t i o n a l i s o i d a + i n s t i t u t i o n a l i s o i d u s t a + i n s t i t u t i o n a l i s o i m a a n + i n s t i t u t i o n a l i s o i t a v a + i n s t i t u t i o n a l i s o i v a t + i n s t i t u u t i n + i n s t i t u u t i o h a n k e + i n s t i t u u t i o i d e n + i n s t i t u u t i o i d e n k i n + i n s t i t u u t i o i h i n + i n s t i t u u t i o i l l e + i n s t i t u u t i o i s s a + i n s t i t u u t i o i s t a + i n s t i t u u t i o i t a + i n s t i t u u t i o k e h y s + i n s t i t u u t i o m a l l i + i n s t i t u u t i o o n + i n s t i t u u t i o r a k e n t e e n + i n s t i t u u t i o r a k e n t e e s e e n + i n s t i t u u t i o t + i n s t i t u u t t i a + i n s t r u m e n t a a l i r o c k + i n s t r u m e n t e i l l a + i n s t r u m e n t t e j a + i n s t r u m e n t t i m u u t t u j a + i n s u l i i n i k y n ä + i n s u l i i n i p u m p p u + i n s u l i i n i r e s e p t o r i + i n s u l i i n i r e s i s t e n s s i + i n s u l i i n i t u o t a n n o s s a + i n s u l i i n i š o k k i h o i t o + i n t e g r a a l i f u n k t i o + i n t e g r a a l i k a a v a + i n t e g r a a l i t e s t i + i n t e g r a a l i y h t ä l ö + i n t e g r a a t i o a a l t o + i n t e g r a a t i o a s i o i s t a + i n t e g r a a t i o a s k e l i a + i n t e g r a a t i o a s t e + i n t e g r a a t i o f o o r u m i s t a + i n t e g r a a t i o h a n k e + i n t e g r a a t i o h a n k k e e s t a + i n t e g r a a t i o h a n k k e i d e n + i n t e g r a a t i o h a n k k e i t a + i n t e g r a a t i o i n t o i l u s s a a n + i n t e g r a a t i o j ä r j e s t e l y j e n + i n t e g r a a t i o j ä r j e s t ö t + i n t e g r a a t i o k i e r r o k s e l l e + i n t e g r a a t i o k o m p e t e n s s i k e s k u s + i n t e g r a a t i o k r i i s i ä + i n t e g r a a t i o k y k y + i n t e g r a a t i o k y k y ä + i n t e g r a a t i o k y v y n + i n t e g r a a t i o k y v y s s ä + i n t e g r a a t i o l l e + i n t e g r a a t i o m a l l i + i n t e g r a a t i o m a l l i a + i n t e g r a a t i o m a l l i s t a + i n t e g r a a t i o m i n i s t e r i + i n t e g r a a t i o m u o d o t + i n t e g r a a t i o n + i n t e g r a a t i o n ä k ö k u l m a n + i n t e g r a a t i o o n + i n t e g r a a t i o p o l i t i i k a n + i n t e g r a a t i o p o l i t i i k a s s a + i n t e g r a a t i o p o l i t i i k a s t a + i n t e g r a a t i o p o l i t i i k a t + i n t e g r a a t i o p o l i t i i k k a + i n t e g r a a t i o p o l i t i i k k a a + i n t e g r a a t i o p o l i t i i k k o j a + i n t e g r a a t i o p o l i t i i k k o j e n + i n t e g r a a t i o p o l i t i i k o i s s a + i n t e g r a a t i o p r o j e k t e i s t a + i n t e g r a a t i o p r o j e k t i n a + i n t e g r a a t i o p r o s e s s e i s t a + i n t e g r a a t i o p r o s e s s i + i n t e g r a a t i o p r o s e s s i a + i n t e g r a a t i o p r o s e s s i i n + i n t e g r a a t i o p r o s e s s i l l e + i n t e g r a a t i o p r o s e s s i n + i n t e g r a a t i o p r o s e s s i s s a + i n t e g r a a t i o p y r k i m y k s i i n + i n t e g r a a t i o r a h a s t o + i n t e g r a a t i o r a h a s t o a + i n t e g r a a t i o s o p i m u s t a + i n t e g r a a t i o s t a n d a r d i t + i n t e g r a a t i o s t r a t e g i a a + i n t e g r a a t i o s t r a t e g i a n + i n t e g r a a t i o s t r a t e g i a s t a + i n t e g r a a t i o t a + i n t e g r a a t i o t e h t ä v ä + i n t e g r a a t i o t e k i j ä + i n t e g r a a t i o t o i m i e n + i n t e g r a a t i o t o i m i s t a + i n t e g r a a t i o v a l m i u d e k s i + i n t e g r a a t i o v a l m i u d e n + i n t e g r a a t i o v a l m i u d e s t a + i n t e g r a a t i o v a l m i u k s i s t a + i n t e g r a a t i o v a l m i u s + i n t e g r a a t i o v a l m i u t e e n + i n t e g r a a t i o v a l m i u t e e n s a + i n t e g r a a t i o v a l m i u t t a + i n t e g r a a t i o v a l m i u t t a m m e + i n t e g r a a t i o v i r a s t o + i n t e g r a a t i o y h t e i s t y ö s t ä + i n t e g r o i d a + i n t e g r o i d a a n + i n t e g r o i d u i m m i s t a + i n t e g r o i d u m p a a + i n t e g r o i d u m p i + i n t e g r o i d u n + i n t e g r o i d u s s a + i n t e g r o i m i s e e n + i n t e g r o i m i s e k s i + i n t e g r o i m i s o n g e l m i i n + i n t e g r o i m i s p o l i t i i k a n + i n t e g r o i m i s p o l i t i i k k a a + i n t e g r o i m i s p r o s e s s i n + i n t e g r o i m i s s t r a t e g i a t + i n t e g r o i m i s s t r a t e g i o i d e n + i n t e g r o i m i s s t r a t e g i o i t a + i n t e g r o i m i s t a + i n t e g r o i n t i a l o j a + i n t e g r o i n t i h a n k k e i s t a + i n t e g r o i n t i j ä r j e s t e l m ä + i n t e g r o i n t i j ä r j e s t e l y ä + i n t e g r o i n t i k e h y k s e e n + i n t e g r o i n t i k y k y y n + i n t e g r o i n t i k y k y ä + i n t e g r o i n t i k y v y s t ä + i n t e g r o i n t i m a l l e i s t a + i n t e g r o i n t i m e k a n i s m e j a + i n t e g r o i n t i o n g e l m a t + i n t e g r o i n t i p o l i t i i k a n + i n t e g r o i n t i p o l i t i i k k a + i n t e g r o i n t i p o l i t i i k k a a + i n t e g r o i n t i p o l i t i i k k a a n + i n t e g r o i n t i p o l i t i i k k o j e n + i n t e g r o i n t i p r o s e s s i + i n t e g r o i n t i p r o s e s s i a + i n t e g r o i n t i r a k e n t e e t + i n t e g r o i n t i s t r a t e g i a l l a + i n t e g r o i n t i s t r a t e g i a t + i n t e g r o i n t i s t r a t e g i o i l l e + i n t e g r o i n t i s t r a t e g i o i t a + i n t e g r o i n t i t o i m e n p i t e i t ä + i n t e g r o i n t i t o i m i a + i n t e g r o i n t i t o i m i e n + i n t e g r o i n t i t o i m i i n + i n t e g r o i n t i t y ö h ö n + i n t e g r o i n t i v a l m i u d e n + i n t e g r o i n t i v a l m i u d e s t a + i n t e g r o i n t i v a l m i u s + i n t e g r o i n t i v a l m i u t e e n + i n t e g r o i n t i v a l m i u t t a a n + i n t e g r o i t a v a + i n t e g r o i t a v i k s i + i n t e g r o i t u + i n t e g r o i t u a + i n t e g r o i t u j a + i n t e g r o i t u m a a n + i n t e g r o i t u m i s e e n + i n t e g r o i t u m i s e n + i n t e g r o i t u m i s e n s a + i n t e g r o i t u m i s e s s a + i n t e g r o i t u m i s e s t a + i n t e g r o i t u m i s h a n k k e e t + i n t e g r o i t u m i s m a h d o l l i s u u k s i e n + i n t e g r o i t u m i s p e r u s t e e t + i n t e g r o i t u m i s p r o s e s s i + i n t e g r o i t u m i s p r o s e s s i a + i n t e g r o i t u m i s p r o s e s s i l l e + i n t e g r o i t u m i s p r o s e s s i n + i n t e g r o i t u m i s p r o s e s s i s s a + i n t e g r o i t u m i s t a + i n t e g r o i t u m i s t o i m i e n + i n t e g r o i t u m i s v a l m i u t t a + i n t e g r o i t u n e e t + i n t e g r o i t u n u t + i n t e g r o i t u u + i n t e g r o i v a m p i + i n t e l l e k t u a a l i s e s t i + i n t e l l e k t u a a l i s t e n + i n t e n s i i v i k a l a s t u s + i n t e n s i i v i k u r s s i e n + i n t e n s i i v i s e m m i l l ä + i n t e n s i i v i s e m m i n + i n t e n s i i v i s e m m ä l l e + i n t e n s i i v i s e m m ä n + i n t e n s i i v i s e m m ä t + i n t e n s i i v i s e m p i + i n t e n s i i v i s e m p i ä + i n t e n s i i v i s e m p ä ä + i n t e n s i i v i s e s t ä + i n t e n s i i v i s i m m i s t ä + i n t e n s i i v i s i s s ä + i n t e n s i i v i s t ä + i n t e n s i t e e t t i t a v o i t e + i n t e r a k t i i v i s e n + i n t e r f e r o n i k o e + i n t e r m o d a a l i k u l j e t u s t e n + i n t e r m o d a a l i s e k s i + i n t e r m o d a a l i s e s t i + i n t e r m o d a a l i t e r m i n a a l i t + i n t e r n a t i o n a a l i a + i n t e r n e t e i s t ä + i n t e r n e t f o o r u m i n + i n t e r n e t h u i j a u k s i a + i n t e r n e t h u i j a u s + i n t e r n e t h u u t o k a u p p o i h i n + i n t e r n e t i i n + i n t e r n e t i l l e + i n t e r n e t i n + i n t e r n e t i s s ä + i n t e r n e t i s s ä k i n + i n t e r n e t i s t ä + i n t e r n e t i ä + i n t e r n e t k o k o u k s e t + i n t e r n e t l i i t t y m ä ä + i n t e r n e t l u e t t e l o + i n t e r n e t m a k s u j ä r j e s t e l m ä t + i n t e r n e t m a r k k i n o i t a + i n t e r n e t m y y n n i n + i n t e r n e t p a l v e l u i t a + i n t e r n e t p a l v e l u j a + i n t e r n e t p a l v e l u n t a r j o a j i a + i n t e r n e t p a l v e l u n t a r j o a j i e n + i n t e r n e t p a l v e l u n t a r j o a j i i n + i n t e r n e t p e d o f i l i a n + i n t e r n e t p o r t a a l e i s s a + i n t e r n e t p o r t a a l i + i n t e r n e t p ä ä t e l a i t e + i n t e r n e t r i k o k s i a + i n t e r n e t s e n s u u r i s t a + i n t e r n e t s i s ä l l ö n + i n t e r n e t s i s ä l l ö s t ä + i n t e r n e t s i v u j a + i n t e r n e t s i v u s t o a + i n t e r n e t s i v u s t o i l l a + i n t e r n e t s i v u s t o j a + i n t e r n e t s i v u s t o j e n + i n t e r n e t s i v u s t o l l a + i n t e r n e t s i v u s t o s t a + i n t e r n e t s i v u s t o t + i n t e r n e t s t r a t e g i a + i n t e r n e t t e k n o l o g i a n + i n t e r n e t v a r a u k s e t + i n t e r n e t v i e s t i n t ä ä n + i n t e r n e t y h t e y d e n + i n t e r n e t y h t e y k s i e n + i n t e r n e t y h t e y k s i s t ä + i n t e r n e t y h t e y k s i ä + i n t e r n e t y h t e y s + i n t e r n e t y m p ä r i s t ö + i n t e r n o i n t i k e s k u k s e t + i n t e r n o i n t i l e i r e i l l e + i n t e r n o i n t i l e i r i l l e + i n t e r v e n t i o a l o i h i n + i n t e r v e n t i o a l u e e n + i n t e r v e n t i o a l u e e s e e n + i n t e r v e n t i o h i n n a n + i n t e r v e n t i o h i n n a s t a + i n t e r v e n t i o h i n n a t + i n t e r v e n t i o h i n n o i s s a + i n t e r v e n t i o h i n n o i s t a + i n t e r v e n t i o h i n t a + i n t e r v e n t i o h i n t a a + i n t e r v e n t i o h i n t a a n + i n t e r v e n t i o h i n t a j ä r j e s t e l m ä + i n t e r v e n t i o h i n t o i h i n + i n t e r v e n t i o h i n t o j a + i n t e r v e n t i o h i n t o j e n + i n t e r v e n t i o i k ä ä + i n t e r v e n t i o i t a + i n t e r v e n t i o j a k s o + i n t e r v e n t i o j a k s o a + i n t e r v e n t i o j a k s o j e n + i n t e r v e n t i o j a k s o n + i n t e r v e n t i o j o u k k o j a + i n t e r v e n t i o j o u k k o j e n + i n t e r v e n t i o j o u k o n + i n t e r v e n t i o j o u k o t + i n t e r v e n t i o j ä r j e s t e l m i e n + i n t e r v e n t i o j ä r j e s t e l m ä + i n t e r v e n t i o j ä r j e s t e l m ä n + i n t e r v e n t i o j ä r j e s t e l m ä s s ä + i n t e r v e n t i o j ä r j e s t e l m ä s t ä + i n t e r v e n t i o j ä r j e s t e l m ä ä + i n t e r v e n t i o j ä r j e s t e l m ä ä n + i n t e r v e n t i o j ä r j e s t e l y y n + i n t e r v e n t i o k a t t o o n + i n t e r v e n t i o k e i n o t + i n t e r v e n t i o k e s k e i s e k s i + i n t e r v e n t i o k e s k u s + i n t e r v e n t i o k u r s s i e n + i n t e r v e n t i o k u s t a n n u k s i s s a + i n t e r v e n t i o k y k y + i n t e r v e n t i o k y k y ä + i n t e r v e n t i o k y n n y k s i i n + i n t e r v e n t i o k y n n y s + i n t e r v e n t i o m e k a n i s m e j a + i n t e r v e n t i o m e k a n i s m i + i n t e r v e n t i o m e k a n i s m i e n + i n t e r v e n t i o m e k a n i s m i n + i n t e r v e n t i o m e k a n i s m i t + i n t e r v e n t i o m u o d o t + i n t e r v e n t i o m u o t o j a + i n t e r v e n t i o m ä ä r ä n + i n t e r v e n t i o m ä ä r ä ä + i n t e r v e n t i o n i s t i s e m m a l l e + i n t e r v e n t i o n i s t i s e m p i + i n t e r v e n t i o n i s t i s e t + i n t e r v e n t i o n j ä r j e s t e l m ä + i n t e r v e n t i o n m e k a n i s m e i h i n + i n t e r v e n t i o p e r u s t e i d e n + i n t e r v e n t i o p o l i t i i k a n + i n t e r v e n t i o p o l i t i i k a s t a + i n t e r v e n t i o p o l i t i i k k a + i n t e r v e n t i o p o l i t i i k k a a + i n t e r v e n t i o p o l i t i i k k a a n s a + i n t e r v e n t i o p o l i t i i k k o j e n + i n t e r v e n t i o r a h a s t o n + i n t e r v e n t i o r a j a a + i n t e r v e n t i o r a j a n + i n t e r v e n t i o r e s u r s s e j a + i n t e r v e n t i o r y h m ä + i n t e r v e n t i o r y h m ä n + i n t e r v e n t i o s o k e r i a + i n t e r v e n t i o s t r a t e g i a t + i n t e r v e n t i o s u u n n i t e l m a + i n t e r v e n t i o s ä ä n t e l y n + i n t e r v e n t i o s ä ä n t e l y ä + i n t e r v e n t i o t a + i n t e r v e n t i o t a r j o u s k i l p a i l u a + i n t e r v e n t i o t e h t ä v ä t + i n t e r v e n t i o t e h t ä v ä ä n + i n t e r v e n t i o t o i m e n p i d e + i n t e r v e n t i o t o i m e n p i d e t t ä + i n t e r v e n t i o t o i m e n p i t e i d e n + i n t e r v e n t i o t o i m e n p i t e i s i i n + i n t e r v e n t i o t o i m e n p i t e i s t ä + i n t e r v e n t i o t o i m e n p i t e i t ä + i n t e r v e n t i o t o i m e t + i n t e r v e n t i o t o i m i + i n t e r v e n t i o t o i m i i n + i n t e r v e n t i o t u k e a + i n t e r v e n t i o t u r v a v e r k k o + i n t e r v e n t i o v a i h e e s s a + i n t e r v e n t i o v a l t a a + i n t e r v e n t i o v a r a s t o i h i n + i n t e r v e n t i o v a r a s t o i l l a + i n t e r v e n t i o v a r a s t o i s t a + i n t e r v e n t i o v a r a s t o j a + i n t e r v e n t i o v a r a s t o j e n + i n t e r v e n t i o v a r a s t o s t a + i n t e r v e n t i o v a r a s t o t + i n t e r v e n t i o v a r a t + i n t e r v e n t i o v i l j a a + i n t e r v e n t i o v i r a s t o + i n t e r v e n t i o v ä l i n e + i n t e r v e n t i o v ä l i n e e n + i n t e r v e n t i o v ä l i n e e n s ä + i n t e r v e n t i o v ä l i n e e t + i n t e r v e n t i o v ä l i n e i d e n + i n t e r v e n t i o v ä l i n e i s t ä + i n t e r v e n t i o v ä l i n e i t ä + i n t i a a n e j a + i n t i a a n i e n e m m i s t ö i s i ä + i n t i a a n i k e s ä + i n t i a a n i l e s k i + i n t i a a n i l i i k e + i n t i a a n i l i i k k e e n + i n t i a a n i n s u l k a + i n t i a a n i p o k e r i + i n t i a a n i p ä ä l l i k k ö + i n t i a a n i r e s e r v a a t t i + i n t i a a n i r i i s i + i n t i a a n i s o d a t + i n t i a a n i t + i n t i a a n i v ä e s t ö + i n t i a a n i v ä e s t ö n + i n t i a a n i y h t e i s ö ä + i n t i a a n i y l i p i s t o j e n + i n t i a l a i s e l l a + i n t i a l a i s i i n + i n t i a l a i s t e n + i n t i a l a i s t y ö n t e k i j ä l l ä + i n t i a l a i s y h t e i s ö n + i n t i i m e i m p i ä + i n t i m i t e e t t i s u o j a n + i n t o h i m o a + i n t o h i m o i s t e n + i n t o h i m o j a + i n t o h i m o t + i n t o u d u t t a v a + i n t r e s s e i h i n + i n t r e s s e i n e e n + i n t r e s s e i s t ä + i n t r e s s e j ä + i n t r e s s e j ä ä n + i n t r e s s i e n + i n t r e s s i e r o t + i n t r e s s i o s a p u o l i a + i n t r e s s i r y h m i e n + i n t r e s s i t + i n t r e s s i t a h o i l t a + i n t u i t i o p u m p p u + i n u i i t t i k o i r a + i n u i i t t i y h t e i s ö j e n + i n u i t t i k i e l e t + i n u l i i n i s i i r a p i n + i n v e n t a a r i a + i n v e n t a a r i o j ä r j e s t e l m ä + i n v e n t a a r i o j ä r j e s t e l m ä n + i n v e n t a a r i o j ä r j e s t e l m ä t + i n v e n t a a r i o k y s y m y s t ä + i n v e n t a a r i o p a l v e l u j a + i n v e n t o i n t i m e n e t t e l y n + i n v e s t i t u u r a r i i t a + i n v e s t o i d a + i n v e s t o i j a r y h m i s s ä + i n v e s t o i j a r y h m i ä + i n v e s t o i j a t + i n v e s t o i j i a + i n v e s t o i j i e n + i n v e s t o i k a a m m e + i n v e s t o i m a a n + i n v e s t o i m a l l a + i n v e s t o i m i s e s t a + i n v e s t o i n e e t + i n v e s t o i n n e i l l a + i n v e s t o i n n e i l l a a n + i n v e s t o i n n e i l l e + i n v e s t o i n n e i s s a + i n v e s t o i n n e i s t a + i n v e s t o i n n i s t a + i n v e s t o i n n i t + i n v e s t o i n t e i h i n + i n v e s t o i n t e i n a + i n v e s t o i n t e j a + i n v e s t o i n t e j a a n + i n v e s t o i n t e j a m m e + i n v e s t o i n t i a + i n v e s t o i n t i a a l l o n + i n v e s t o i n t i a j a t t e l u + i n v e s t o i n t i a l a l l a + i n v e s t o i n t i a l a n + i n v e s t o i n t i a l a t + i n v e s t o i n t i a l i j ä ä m ä n + i n v e s t o i n t i a l o i l l a + i n v e s t o i n t i a l o i l l e + i n v e s t o i n t i a l o i t e + i n v e s t o i n t i a p u a + i n v e s t o i n t i a s t e + i n v e s t o i n t i a s t e e s e e n + i n v e s t o i n t i a v u s t u k s e n a + i n v e s t o i n t i b o n u k s i a + i n v e s t o i n t i b u d j e t t i + i n v e s t o i n t i e d e l l y t y k s e t + i n v e s t o i n t i e d e l l y t y k s i ä + i n v e s t o i n t i e d e l l y t y s t e n + i n v e s t o i n t i e h d o t + i n v e s t o i n t i e h d o t u s + i n v e s t o i n t i e n + i n v e s t o i n t i e p ä v a r m u u t e e n + i n v e s t o i n t i h a l u k k u u s + i n v e s t o i n t i h a l u k k u u t t a + i n v e s t o i n t i h a n k k e e t + i n v e s t o i n t i h a n k k e i d e n + i n v e s t o i n t i h a n k k e i l l e + i n v e s t o i n t i h a n k k e i s i i n + i n v e s t o i n t i h a n k k e i s t a + i n v e s t o i n t i h a n k k e i t a + i n v e s t o i n t i h e l p o t u k s i a + i n v e s t o i n t i h e r k k y y s + i n v e s t o i n t i h y ö d y n + i n v e s t o i n t i i n + i n v e s t o i n t i j a k s o + i n v e s t o i n t i j o h t a j a t + i n v e s t o i n t i j u n a s t a + i n v e s t o i n t i j ä r j e s t e l m i l l ä + i n v e s t o i n t i j ä r j e s t e l m ä + i n v e s t o i n t i j ä r j e s t e l m ä n + i n v e s t o i n t i j ä r j e s t e l m ä t + i n v e s t o i n t i j ä r j e s t e l y i s t ä + i n v e s t o i n t i j ä r j e s t e l y j e n + i n v e s t o i n t i j ä r j e s t e l y j ä + i n v e s t o i n t i k a n n u s t i m i a + i n v e s t o i n t i k a n n u s t i m i e n + i n v e s t o i n t i k a n n u s t i n t e n + i n v e s t o i n t i k a p a s i t e e t i n + i n v e s t o i n t i k a p a s i t e e t i s t a + i n v e s t o i n t i k a u p p a a + i n v e s t o i n t i k e h i t y s t ä + i n v e s t o i n t i k e h y k s e e n + i n v e s t o i n t i k e h y s + i n v e s t o i n t i k i e l l o n + i n v e s t o i n t i k i e l t o + i n v e s t o i n t i k i e l t o a + i n v e s t o i n t i k i e l t o o n + i n v e s t o i n t i k o h d e + i n v e s t o i n t i k o h t e i t a + i n v e s t o i n t i k o m i t e a n + i n v e s t o i n t i k o m i t e a s s a + i n v e s t o i n t i k o m i t e o i t a + i n v e s t o i n t i k o m p o n e n t t i + i n v e s t o i n t i k o r o n + i n v e s t o i n t i k r i t e e r e i h i n + i n v e s t o i n t i k u l u i h i n + i n v e s t o i n t i k u m p p a n i + i n v e s t o i n t i k u m p p a n i t + i n v e s t o i n t i k u m p p a n u u k s i e n s a + i n v e s t o i n t i k u m p p a n u u s + i n v e s t o i n t i k u s t a n n u k s e t + i n v e s t o i n t i k u s t a n n u k s i a + i n v e s t o i n t i k u s t a n n u k s i a a n + i n v e s t o i n t i k u s t a n n u k s i i n + i n v e s t o i n t i k u s t a n n u k s i s t a + i n v e s t o i n t i k u s t a n n u s t e n + i n v e s t o i n t i k y k y + i n v e s t o i n t i k y k y y n + i n v e s t o i n t i k y k y ä + i n v e s t o i n t i k y s y m y k s e e n + i n v e s t o i n t i k y s y m y k s e t + i n v e s t o i n t i k ä y t t ä y t y m i n e n + i n v e s t o i n t i l a i n a + i n v e s t o i n t i l a i n o j e n + i n v e s t o i n t i l a k e j a + i n v e s t o i n t i l a m a + i n v e s t o i n t i l e i k k a u s t e n + i n v e s t o i n t i l u p a u k s e t + i n v e s t o i n t i l u v u s s a + i n v e s t o i n t i l u v u s t a + i n v e s t o i n t i l u v u t + i n v e s t o i n t i m a h d o l l i s u u d e n + i n v e s t o i n t i m a h d o l l i s u u d e t + i n v e s t o i n t i m a h d o l l i s u u k s i a + i n v e s t o i n t i m a h d o l l i s u u k s i e n + i n v e s t o i n t i m a h d o l l i s u u k s i e n s a + i n v e s t o i n t i m a h d o l l i s u u k s i i n + i n v e s t o i n t i m a h d o l l i s u u k s i s t a + i n v e s t o i n t i m a r k k i n o i l l e + i n v e s t o i n t i m e k a n i s m i t + i n v e s t o i n t i m e n e t e l m i e n + i n v e s t o i n t i m e n e t t e l y i s t ä + i n v e s t o i n t i m e n o i h i n + i n v e s t o i n t i m e n o i s t a + i n v e s t o i n t i m e n o j a + i n v e s t o i n t i m e n o j e n + i n v e s t o i n t i m e n o t + i n v e s t o i n t i m ä ä r i ä + i n v e s t o i n t i m ä ä r ä r a h a t + i n v e s t o i n t i m ä ä r ä y k s i s t ä + i n v e s t o i n t i n ä k y m i e n + i n v e s t o i n t i n ä k y m ä t + i n v e s t o i n t i o h j e l m a + i n v e s t o i n t i o h j e l m a a + i n v e s t o i n t i o h j e l m a n + i n v e s t o i n t i o h j e l m a n s a + i n v e s t o i n t i o h j e l m a s s a + i n v e s t o i n t i o h j e l m a t + i n v e s t o i n t i o h j e l m i a + i n v e s t o i n t i o h j e l m i i n + i n v e s t o i n t i o h j e l m i s s a + i n v e s t o i n t i o h j e l m i s t a + i n v e s t o i n t i o i k e u k s i e n + i n v e s t o i n t i o l o i s t a + i n v e s t o i n t i o l o s u h t e i d e n + i n v e s t o i n t i o s u u d e t + i n v e s t o i n t i o s u u s + i n v e s t o i n t i p a i k a s t a + i n v e s t o i n t i p a i k k a a + i n v e s t o i n t i p a i k k a n a + i n v e s t o i n t i p a k e t t i e n + i n v e s t o i n t i p a l v e l u d i r e k t i i v i ä + i n v e s t o i n t i p a l v e l u j e n + i n v e s t o i n t i p a l v e l u t o i m i n t a a + i n v e s t o i n t i p a n k e i l l e + i n v e s t o i n t i p a n k e i s t a + i n v e s t o i n t i p a n k i l l a + i n v e s t o i n t i p a n k i l l e + i n v e s t o i n t i p a n k i l t a + i n v e s t o i n t i p a n k i n + i n v e s t o i n t i p a n k i s s a + i n v e s t o i n t i p a n k i s t a + i n v e s t o i n t i p a n k i t + i n v e s t o i n t i p a n k k e j a + i n v e s t o i n t i p a n k k i + i n v e s t o i n t i p a n k k i a + i n v e s t o i n t i p a n k k i e n + i n v e s t o i n t i p a n k k i i n + i n v e s t o i n t i p a n k k i i r e j a + i n v e s t o i n t i p a n k k i i r i e n + i n v e s t o i n t i p a n k k i n a + i n v e s t o i n t i p a n k k i r y h m ä + i n v e s t o i n t i p e r i a a t t e i d e n + i n v e s t o i n t i p o l i t i i k a n + i n v e s t o i n t i p o l i t i i k a s s a + i n v e s t o i n t i p o l i t i i k a s t a + i n v e s t o i n t i p o l i t i i k k a + i n v e s t o i n t i p o l i t i i k k a a + i n v e s t o i n t i p o l i t i i k k a a n + i n v e s t o i n t i p o l i t i i k k a n s a + i n v e s t o i n t i p o t e n t i a a l i a a n + i n v e s t o i n t i p r o s e n t t i + i n v e s t o i n t i p r o s e s s e j a m m e + i n v e s t o i n t i p u l a s t a + i n v e s t o i n t i p ä ä o m a + i n v e s t o i n t i p ä ä o m a a + i n v e s t o i n t i p ä ä t ö k s e n + i n v e s t o i n t i p ä ä t ö k s e n s ä + i n v e s t o i n t i p ä ä t ö k s e s s ä + i n v e s t o i n t i p ä ä t ö k s e t + i n v e s t o i n t i p ä ä t ö k s i s s ä ä n + i n v e s t o i n t i p ä ä t ö k s i ä + i n v e s t o i n t i p ä ä t ö s + i n v e s t o i n t i r a h a s t o + i n v e s t o i n t i r a h a s t o a + i n v e s t o i n t i r a h a s t o i h i n + i n v e s t o i n t i r a h a s t o j a + i n v e s t o i n t i r a h a s t o j e n + i n v e s t o i n t i r a h a s t o l l e + i n v e s t o i n t i r a h a s t o n + i n v e s t o i n t i r a h a s t o o n + i n v e s t o i n t i r a h a s t o s t a + i n v e s t o i n t i r a h o i t u k s e n + i n v e s t o i n t i r a h o i t u s + i n v e s t o i n t i r a t k a i s u t + i n v e s t o i n t i r e s u r s s e i h i n + i n v e s t o i n t i r e s u r s s e j a + i n v e s t o i n t i r e s u r s s i n s a + i n v e s t o i n t i r i s k i e n + i n v e s t o i n t i r i s k i n + i n v e s t o i n t i r i s k i t + i n v e s t o i n t i s i g n a a l e j a + i n v e s t o i n t i s i t o u m u k s i a + i n v e s t o i n t i s o p i m u k s e e n + i n v e s t o i n t i s o p i m u k s e l l a + i n v e s t o i n t i s o p i m u k s e n + i n v e s t o i n t i s o p i m u k s e n s a + i n v e s t o i n t i s o p i m u k s e s t a + i n v e s t o i n t i s o p i m u k s e t + i n v e s t o i n t i s o p i m u k s i a + i n v e s t o i n t i s o p i m u k s i e n + i n v e s t o i n t i s o p i m u k s i i n + i n v e s t o i n t i s o p i m u k s i l l a + i n v e s t o i n t i s o p i m u k s i l t a + i n v e s t o i n t i s o p i m u k s i s t a + i n v e s t o i n t i s o p i m u s + i n v e s t o i n t i s o p i m u s t a + i n v e s t o i n t i s o p i m u s t e n + i n v e s t o i n t i s t r a t e g i a + i n v e s t o i n t i s t r a t e g i a a + i n v e s t o i n t i s t r a t e g i a n + i n v e s t o i n t i s t r a t e g i a n s a + i n v e s t o i n t i s t r a t e g i a s s a + i n v e s t o i n t i s t r a t e g i a s t a + i n v e s t o i n t i s t r a t e g i a t + i n v e s t o i n t i s t r a t e g i o i d e n + i n v e s t o i n t i s t r a t e g i o i h i n + i n v e s t o i n t i s t r a t e g i o i t a + i n v e s t o i n t i s u h t e e s t a + i n v e s t o i n t i s u h t e e t + i n v e s t o i n t i s u h t e i d e n + i n v e s t o i n t i s u h t e i s s a + i n v e s t o i n t i s u h t e i s t a + i n v e s t o i n t i s u h t e i t a + i n v e s t o i n t i s u o j a + i n v e s t o i n t i s u o j a a + i n v e s t o i n t i s u o j a l a u s e k k e e n + i n v e s t o i n t i s u o j a s o p i m u k s i a + i n v e s t o i n t i s u o j a s o p i m u k s i i n + i n v e s t o i n t i s u o j a s o p i m u s + i n v e s t o i n t i s u o j a s o p i m u s t a + i n v e s t o i n t i s u u n n i t e l m a + i n v e s t o i n t i s u u n n i t e l m a l l a + i n v e s t o i n t i s u u n n i t e l m a n + i n v e s t o i n t i s u u n n i t e l m a n s a + i n v e s t o i n t i s u u n n i t e l m a s t a + i n v e s t o i n t i s u u n n i t e l m a t + i n v e s t o i n t i s u u n n i t e l m i a + i n v e s t o i n t i s u u n n i t e l m i a a n + i n v e s t o i n t i s u u n n i t e l m i e n + i n v e s t o i n t i s u u n n i t e l m i i n + i n v e s t o i n t i s u u n n i t e l m i l l e + i n v e s t o i n t i s u u n n i t e l m i l l e e n + i n v e s t o i n t i s u u n n i t e l m i s t a + i n v e s t o i n t i s u u n t a v i i v o i l l a + i n v e s t o i n t i s ä ä n t ö j e n + i n v e s t o i n t i s ä ä n t ö j ä + i n v e s t o i n t i s ä ä s t ö i h i n + i n v e s t o i n t i s ä ä t i ö + i n v e s t o i n t i t a h t i + i n v e s t o i n t i t a k u i d e n + i n v e s t o i n t i t a k u i t a + i n v e s t o i n t i t a l o u s a r v i o + i n v e s t o i n t i t a r k o i t u k s i i n + i n v e s t o i n t i t a r p e e m m e + i n v e s t o i n t i t a r p e e t + i n v e s t o i n t i t a r p e i s i i n + i n v e s t o i n t i t a r p e i s t a + i n v e s t o i n t i t a r p e i t a + i n v e s t o i n t i t a r v e + i n v e s t o i n t i t a s e i t a + i n v e s t o i n t i t a s o + i n v e s t o i n t i t a s o j e m m e + i n v e s t o i n t i t a s o n + i n v e s t o i n t i t a s o o n + i n v e s t o i n t i t a v o i t t e e n + i n v e s t o i n t i t a v o i t t e e s e e n + i n v e s t o i n t i t i l a i s u u k s i e n + i n v e s t o i n t i t o i m e n p i d e t t ä + i n v e s t o i n t i t o i m e n p i t e i s t ä + i n v e s t o i n t i t o i m e n p i t e i t ä + i n v e s t o i n t i t o i m e t + i n v e s t o i n t i t o i m i a + i n v e s t o i n t i t o i m i a a n + i n v e s t o i n t i t o i m i a m m e + i n v e s t o i n t i t o i m i e n + i n v e s t o i n t i t o i m i i n + i n v e s t o i n t i t o i m i n n a n + i n v e s t o i n t i t o i m i n t a a + i n v e s t o i n t i t u e n + i n v e s t o i n t i t u e s t a + i n v e s t o i n t i t u e t + i n v e s t o i n t i t u i s t a + i n v e s t o i n t i t u k e a + i n v e s t o i n t i t u k e e n + i n v e s t o i n t i t u k e n a + i n v e s t o i n t i t u k i + i n v e s t o i n t i t u k i a + i n v e s t o i n t i t u k i e n + i n v e s t o i n t i t u k i h a k e m u s t e n + i n v e s t o i n t i t u k i k y s y m y s + i n v e s t o i n t i t u o t t e e t + i n v e s t o i n t i t u o t t e i d e n + i n v e s t o i n t i t u o t t o j e n + i n v e s t o i n t i t u r v a a + i n v e s t o i n t i t u r v a l l i s u u t t a + i n v e s t o i n t i t y y p p i e n + i n v e s t o i n t i t y ö r y h m ä + i n v e s t o i n t i v a i h t o e h t o j a + i n v e s t o i n t i v a j e + i n v e s t o i n t i v a j e i s i i n + i n v e s t o i n t i v a l m i u d e t + i n v e s t o i n t i v a l m i u k s i a + i n v e s t o i n t i v a l m i u k s i s s a + i n v e s t o i n t i v a l m i u t t a + i n v e s t o i n t i v a r a n t o + i n v e s t o i n t i v a r m u u s + i n v e s t o i n t i v a r m u u t t a + i n v e s t o i n t i v a r o j e n + i n v e s t o i n t i v a u h t i + i n v e s t o i n t i v e l v o i t t e e t + i n v e s t o i n t i v e r k o s t o n + i n v e s t o i n t i v i r a n o m a i n e n + i n v e s t o i n t i v i r a s t o + i n v e s t o i n t i v i r r a t + i n v e s t o i n t i v i r r o i s t a + i n v e s t o i n t i v i r t a + i n v e s t o i n t i v i r t a a n + i n v e s t o i n t i v i r t o j a + i n v e s t o i n t i v i r t o j e n + i n v e s t o i n t i v ä l i n e e l l ä + i n v e s t o i n t i v ä l i n e e n + i n v e s t o i n t i v ä l i n e e n ä + i n v e s t o i n t i v ä l i n e e s e e n + i n v e s t o i n t i v ä l i n e i t ä + i n v e s t o i n t i v ä l i n e t t ä + i n v e s t o i n t i y h t e y k s i e n + i n v e s t o i n t i y m p ä r i s t ö + i n v e s t o i n t i y m p ä r i s t ö n + i n v e s t o i n t i y m p ä r i s t ö ä + i n v e s t o i n t i y r i t y k s e t + i n v e s t o i n t i y r i t y k s i e n + i n v e s t o i n t i y r i t y k s i ä + i n v e s t o i n t i y r i t y s t e n + i n v e s t o i t a v a + i n v e s t o i t a v a n + i n v e s t o i t u + i n v e s t o i v a + i n v e s t o i v a t + i n v e s t o i v i e n + i n v e s t o i v i l l e + i o n i h i l a + i o n i k a n a v a + i o n i m o o t t o r i + i o n i n v a i h t o + i o n i n v a i h t o k r o m a t o g r a f i a + i o n i s a a t i o k a m m i o + i o n i s e l e k t i i v i n e n + i o n i s i d o s + i o n i s o i t u m i s e n e r g i a + i o n i s o i v a l l a + i o n i s o i v i e n + i o n i s o i v i l l a + i o n i v i r t a + i o w a t + i p a n a t + i r a k i l a i s e l l e + i r a k i l a i s e l t a + i r a k i l a i s e t + i r a k i l a i s e t k i n + i r a k i l a i s i a + i r a k i l a i s i i n + i r a k i l a i s i l l a + i r a k i l a i s i l l e + i r a k i l a i s j o u k k o j e n + i r a k i l a i s k a u p u n g e i s s a + i r a k i l a i s k u m p p a n e i h i m m e + i r a k i l a i s k u m p p a n e i t a + i r a k i l a i s l a s t e n + i r a k i l a i s m i e s t e n + i r a k i l a i s n a i s t e n + i r a k i l a i s p a k o l a i s i a + i r a k i l a i s p a k o l a i s i l l e + i r a k i l a i s p a k o l a i s i s t a + i r a k i l a i s p a k o l a i s t a + i r a k i l a i s p a k o l a i s t e n + i r a k i l a i s s i v i i l e j ä + i r a k i l a i s s i v i i l i s t ä + i r a k i l a i s s i v i i l i t + i r a k i l a i s t a + i r a k i l a i s t e n + i r a k i l a i s t y t t ö + i r a k i l a i s t y y l i n e n + i r a k i l a i s v a n k i e n + i r a k i l a i s v a n k i l o i s s a + i r a k i l a i s y h t i ö i d e n + i r a k i l a i s y s t ä v i s t ä n i + i r a n i l a i s d i p l o m a a t i t + i r a n i l a i s e n + i r a n i l a i s e t + i r a n i l a i s h a l l i n t o + i r a n i l a i s i a + i r a n i l a i s i i n + i r a n i l a i s i l l a + i r a n i l a i s i l l e + i r a n i l a i s i s s a + i r a n i l a i s l a p s i l l e + i r a n i l a i s n a i n e n + i r a n i l a i s n a i s e t + i r a n i l a i s n a i s i s t a + i r a n i l a i s o p i s k e l i j o i d e n + i r a n i l a i s p a k o l a i s i a + i r a n i l a i s p a k o l a i s i l t a + i r a n i l a i s t e n + i r a n i l a i s u h r i e n + i r a n i l a i s y h t e i s k u n t a + i r a n i l a i s y h t e i s ö + i r l a n t i l a i s e n + i r l a n t i l a i s e n a + i r l a n t i l a i s e s t a + i r l a n t i l a i s e t + i r l a n t i l a i s i a + i r l a n t i l a i s i i n + i r l a n t i l a i s i l l a + i r l a n t i l a i s i l l e + i r l a n t i l a i s i l t a + i r l a n t i l a i s i s s a + i r l a n t i l a i s i s t a + i r l a n t i l a i s j o u k k o j e n + i r l a n t i l a i s j ä s e n e n ä + i r l a n t i l a i s j ä s e n e t + i r l a n t i l a i s k o l l e g a m m e + i r l a n t i l a i s l e h d i s t ö + i r l a n t i l a i s p a p i n + i r l a n t i l a i s p a p p i + i r l a n t i l a i s p a t a l j o o n a t + i r l a n t i l a i s p e r h e i l l e + i r l a n t i l a i s p e r h e t t ä + i r l a n t i l a i s s a n o m a l e h d i s s ä + i r l a n t i l a i s s o t i l a i t a + i r l a n t i l a i s t a + i r l a n t i l a i s t e n + i r l a n t i l a i s v a s t a i s i a + i r l a n t i l a i s y r i t y k s e t + i r l a n t i l a i s y r i t y k s i l l ä + i r l a n t i l a i s y r i t y s + i r l a n t i l a i s y r i t y s t e n + i r o n i s e l t a + i r o n i s e m p i + i r o n i s e n + i r o n i s i n t a + i r o n i s t a + i r r a l l a a n + i r r a t i o n a a l i l u k u + i r r o t e t a a n + i r r o t t a a + i r r o t t a m a l l a + i r r o t t a m i s e k s i + i r r o t t a m i s t a + i r r o t t a u t u a + i r r o t t a u t u m i s o i k e u d e n + i r r o t t a u t u m i s o i k e u s + i r r o t t a u t u m i s p y r k i m y k s e e n + i r r o t t a u t u m i s p y r k i m y k s i ä + i r s t a i l u n + i r t a a n t u m i s s t r a t e g i a a + i r t a a n t u m i s s t r a t e g i a n a + i r t a a n t u m i s s t r a t e g i a s t a + i r t a i m e s t a + i r t a u d u t t a v a + i r t a u t u a + i r t a u t u i v a t + i r t a u t u m a a n + i r t a u t u m i s e n + i r t a u t u m i s m e k a n i s m e j a + i r t a u t u m i s m e n e t t e l y + i r t a u t u m i s o i k e u t t a + i r t a u t u m i s p o l i t i i k k o j a + i r t a u t u m i s p y r k i m y k s i ä + i r t a u t u m i s s t r a t e g i a + i r t a u t u m i s s t r a t e g i a a + i r t a u t u m i s s t r a t e g i a l l a + i r t a u t u m i s s t r a t e g i a n + i r t a u t u m i s s t r a t e g i a s t a + i r t a u t u m i s s t r a t e g i a t + i r t a u t u m i s s t r a t e g i o i d e m m e + i r t a u t u m i s s t r a t e g i o i d e n + i r t a u t u m i s s t r a t e g i o i h i n + i r t a u t u m i s s t r a t e g i o i t a + i r t a u t u m i s s u u n n i t e l m a + i r t a u t u m i s t a + i r t a u t u n u t + i r t i s a n o a + i r t i s a n o m i s a a l l o n + i r t i s a n o m i s a i k a a + i r t i s a n o m i s a i k o j a + i r t i s a n o m i s a j a l l a + i r t i s a n o m i s a j a t + i r t i s a n o m i s e t + i r t i s a n o m i s i a + i r t i s a n o m i s i i n + i r t i s a n o m i s i l m i ö ö n + i r t i s a n o m i s i l m o i t u k s e n + i r t i s a n o m i s i l m o i t u k s i a + i r t i s a n o m i s i s t a + i r t i s a n o m i s k i e l t o + i r t i s a n o m i s k i e l t o a + i r t i s a n o m i s k u s t a n n u k s i a + i r t i s a n o m i s l a u s e k e + i r t i s a n o m i s m e n e t t e l y j ä + i r t i s a n o m i s p a k e t t e j a + i r t i s a n o m i s r a h a a + i r t i s a n o m i s s a k k o a + i r t i s a n o m i s s a k k o j a + i r t i s a n o m i s s u o j a n + i r t i s a n o m i s s u u n n i t e l m a t + i r t i s a n o m i s s u u n n i t e l m i a + i r t i s a n o m i s s u u n n i t e l m i e n + i r t i s a n o m i s s u u n n i t e l m i l l a + i r t i s a n o m i s s y y t + i r t i s a n o m i s t a + i r t i s a n o m i s t a p a u k s i s s a + i r t i s a n o m i s t a r v e t t a + i r t i s a n o m i s t e n + i r t i s a n o m i s t u k i a + i r t i s a n o t a a n + i r t i s a n o t t u j a + i r t i s a n o t t u j a a n + i r t i s a n o t t u j e n + i r t i s a n o t u i l l e + i r t i s a n o u t u i + i r t i s a n o u t u m i s t a + i r t i s a n o v a n s a + i r t o k a r k k i + i r t o k i v i ä + i r t o k u o r m a t + i r t o l a s t i a l u k s e n + i r t o l a s t i a l u k s e t + i r t o l a s t i a l u k s i l l a + i r t o l a s t i a l u k s i l l e + i r t o l a s t i a l u s + i r t o l a s t i a l u s l i i k e n t e e s t ä + i r t o l a s t i a l u s t a + i r t o l a s t i a l u s t e n + i r t o n a i s i a + i r t o p i s t e i t ä + i r t o s e m e n t t i k a u p p a a + i r t o s o l u n ä y t e + i r t o t a v a r a a + i r t o t a v a r a k u l j e t u k s i n a + i r t o t a v a r a n a + i r t o t a v a r a t o i m i t u k s e t + i r t o t u p a k a n + i r t o t u p a k a s t a + i r t o t u p a k k a + i r v i k u v a k s i + i r v i k u v a s t a + i r v o k a s t a + i s i e n + i s i ä + i s k e e + i s k e l m ä k a r u s e l l i + i s k e l m ä m u s i i k k i + i s k e l m ä p a r a a t i + i s k e ä + i s k i a s v a i v a + i s k i e s s ä + i s k i e s s ä ä n + i s k o s t a m a l l a + i s k o s t e t t a v a + i s k u a + i s k u a a l t o + i s k u i h i n + i s k u i n + i s k u i s s a n n e + i s k u i s t a + i s k u j a + i s k u j e n + i s k u j o u k k o + i s k u j o u k k o a + i s k u k u u m e n n u s + i s k u k y k y i s e m p i n ä + i s k u l a u s e + i s k u l a u s e e k s i + i s k u l a u s e e l l a + i s k u l a u s e e n + i s k u l a u s e e n a + i s k u l a u s e e n a a n + i s k u l a u s e i d e n + i s k u l a u s e i l l e + i s k u l a u s e i t a + i s k u n + i s k u n v a i m e n n i n + i s k u n v a i m e n t i m e t + i s k u n v a i m e n t i m i a + i s k u p o l i t i i k a n + i s k u p o l i t i i k a s t a + i s k u r y h m ä + i s k u r y h m ä s t ä + i s k u r y h m ä t + i s k u s a n a n + i s k u s s a + i s k u s t a + i s k u s u h d e + i s k u s y v y y s + i s k u t + i s k u t i l a v u u s + i s k u u n + i s k u v o i m a a + i s k u y r i t y s + i s l a m i a + i s l a m i l a i s e l t a + i s l a m i l a i s e m p i + i s l a m i l a i s e n + i s l a m i l a i s e s s a + i s l a m i l a i s e s t a + i s l a m i l a i s e t + i s l a m i l a i s f u n d a m e n t a l i s t e j a + i s l a m i l a i s h a l l i n t o + i s l a m i l a i s i a + i s l a m i l a i s i k s i + i s l a m i l a i s i l l e + i s l a m i l a i s i s s a + i s l a m i l a i s p e r ä i s e l l e + i s l a m i l a i s t a + i s l a m i l a i s t e n + i s l a m i l a i s t e r r o r i s t i e n + i s l a m i l a i s t e r r o r i s t i t + i s l a m i l a i s u u d e n + i s l a m i l a i s u u d e s s a + i s l a m i l a i s u u t t a + i s l a m i l a i s y h t e i s ö i s s ä + i s l a m i l a i s y h t e i s ö j e n + i s l a m i l l e + i s l a m i n + i s l a m i n u s k o + i s l a m i n u s k o a + i s l a m i n u s k o i s e s s a + i s l a m i n u s k o i s e t + i s l a m i n u s k o i s i a + i s l a m i n u s k o i s i l l a + i s l a m i n u s k o i s t a + i s l a m i n u s k o i s t e n + i s l a m i n u s k o n + i s l a m i n u s k o o n + i s l a m i n v a s t a i n e n + i s l a m i n v a s t a i s e n + i s l a m i n v a s t a i s e t + i s l a m i n v a s t a i s t e n + i s l a m i n v a s t a i s u u d e n + i s l a m i n v a s t a i s u u t t a + i s l a m i s t a + i s l a m i s t e i l l e + i s l a m i s t i e n + i s l a m i s t i f u n d a m e n t a l i s t e j a + i s l a m i s t i f u n d a m e n t a l i s t i e n + i s l a m i s t i f u n d a m e n t a l i s t i t + i s l a m i s t i j o h t a j a a + i s l a m i s t i j o h t a j i e n + i s l a m i s t i j ä r j e s t ö j e n + i s l a m i s t i j ä r j e s t ö n + i s l a m i s t i k a p i n a l l i s t e n + i s l a m i s t i l i i k k e i d e n + i s l a m i s t i m i e l e n o s o i t t a j a n + i s l a m i s t i o p p o s i t i o + i s l a m i s t i p u o l u e + i s l a m i s t i p u o l u e i d e n + i s l a m i s t i r y h m i t t y m i e n + i s l a m i s t i r y h m ä + i s l a m i s t i r y h m ä t + i s l a m i s t i r y h m ä ä + i s l a m i s t i s e t + i s l a m i s t i s i a + i s l a m i s t i s i i n + i s l a m i s t i t + i s l a m i s t i t a i s t e l i j o i d e n + i s l a m i s t i t e r r o r i s m i + i s l a m i s t i t e r r o r i s m i a + i s l a m i s t i t e r r o r i s m i i n + i s l a m i s t i t e r r o r i s m i l l a + i s l a m i s t i t e r r o r i s m i n + i s l a m i s t i t e r r o r i s m i s t a + i s l a m i s t i t e r r o r i s t e i k s i + i s l a m i s t i t e r r o r i s t e i l l e + i s l a m i s t i t e r r o r i s t i e n + i s l a m i s t i t e r r o r i s t i t + i s l a m i s t i v a l t i o i d e n + i s l a m o f o b i a n + i s l a n n i l l e + i s l a n n i n + i s l a n n i n h e v o n e n + i s l a n n i n k a m p a s i m p u k k a + i s l a n n i n l a m m a s k o i r a + i s l a n n i n s i m p u k k a + i s l a n t i i n + i s l a n t i l a i s i s t a + i s l a n t i l a i s t e n + i s o a f r i k a n k a i j a + i s o a l b a t r o s s i + i s o a l v e j u u r i + i s o a m y y l i a s e t a a t t i + i s o a m y y l i n i t r i i t t i + i s o a n o p i n k i e l i + i s o b u t y y l i a s e t a a t t i + i s o b u t y y l i k e t o n i + i s o f t a a l i h a p p o + i s o g l u k o o s i + i s o g l u k o o s i a + i s o g l u k o o s i k i i n t i ö t + i s o g l u k o o s i t a p a u k s e s s a + i s o h a a r a h a u k k a + i s o h a a r a k i i t ä j ä + i s o h a p e r o + i s o h a u k k a k e h r ä ä j ä + i s o h a u k k a p ö l l ö + i s o h e l m i l a v a s t a j a + i s o h e v o s a n t i l o o p p i + i s o h e v o s e n k e n k ä y ö k k ö + i s o h i e r a k k a + i s o h i i r e n h ä n t ä l e p a k k o + i s o h i i r i m a k i + i s o h i r v e n j ä k ä l ä + i s o h u i l u v a r i s + i s o h u i s k u k e r t t u + i s o h u i s k u l e p i n k ä i n e n + i s o i s o i s ä n s ä + i s o i s o v a n h e m p a n i + i s o i s o ä i t i e m m e + i s o i s o ä i t i n i + i s o i s ä m m e + i s o i s ä n i + i s o i s ä p a r a d o k s i + i s o i s ä v a s i k o i t a + i s o j a + i s o j a l k a p ö l l ö + i s o j u m a l t e n k u k k a + i s o j u o k s u t i m a l i + i s o j u o v a n a p s i j a + i s o j ä r v i s i m p u k k a + i s o k a a l i k ä r p ä n e n + i s o k a a r i k o l i b r i + i s o k a i j a n e n + i s o k a i s l a k e r t t u n e n + i s o k a i v a j a + i s o k a k t u s s i r k k u + i s o k a l j u m e s i k k o + i s o k a r p a l o + i s o k a r v i a i s p i s t i ä i n e n + i s o k a s u a a r i + i s o k a t k a r a p u + i s o k a u l u s k a i j a + i s o k e i h ä s r a u s k u + i s o k e i j u + i s o k e i j u k o r e n t o + i s o k e l t a s i i p i + i s o k e n k ä i s e t + i s o k e r t t u r a s t a s + i s o k i e k k o k o t i l o + i s o k i h u + i s o k i p u a j a + i s o k i r j o p e i p p i + i s o k i r v i n e n + i s o k i s s a n h ä n t ä + i s o k i u r u k e r t t u + i s o k o l m i l e h t i + i s o k o n n a n t a t a r + i s o k o r a l l i s a m m a l + i s o k o r v a + i s o k o s k e l o + i s o k o t i p ä ä s t ä i n e n + i s o k r a s s i + i s o k u l t a k u t o j a + i s o k u l t a s i i p i + i s o k u r n u s i m p p u + i s o k u r p p a + i s o k ä p y l i n t u + i s o k ö y n n ö s k r a s s i + i s o l a a t i o m e k a n i s m i + i s o l a a t t i k i e l i + i s o l a m p i s u k e l t a j a + i s o l a t v u s k o t t a r a i n e n + i s o l a u k k u + i s o l e h t i k u u s i p i s t i ä i n e n + i s o l e h t i l e h m u s + i s o l e n t ä v ä k o i r a + i s o l e p a k k o + i s o l e p i n k ä i n e n + i s o l i m a s k a + i s o l i n n u n r u o h o + i s o l l a + i s o l l e + i s o l o k k i + i s o l t a + i s o l u m m e + i s o m a a s i r k k u + i s o m a k s a r u o h o + i s o m a l i k k a + i s o m a l l u a i n e n + i s o m a r j a s t a j a + i s o m a t k i j a + i s o m e r i l i i t ä j ä + i s o m e r i m e t s o + i s o m e s i t a n g a r a + i s o m i t t a r i + i s o m m i k s i + i s o m p i + i s o m p i a + i s o m u s t a h a u k k a + i s o m u s t a k a i j a + i s o m u s t a r a s t a s + i s o m u u r a h a i s k a r h u + i s o m u u r a h a i s t a s k u + i s o m y r s k y l i i t ä j ä + i s o m y r s k y l i i t ä j ä t + i s o n a k k e l i + i s o n a u r a j a + i s o n i r k k o + i s o n o k i k a n a + i s o n o k i m e s i k k o + i s o n o k i p e i p p o + i s o n o k k a k a i j a + i s o n o k k a k i p u a j a + i s o n o k k a m e s i k k o + i s o n o k k a m u u r a + i s o n o k k a r a s t a s + i s o n o k k a t i i r a + i s o n o k k o s p e r h o n e n + i s o n v e l j e l t ä + i s o n v e l j e n + i s o n v e l j e n s ä + i s o n y s ä m u u r a + i s o o n + i s o p a n d a + i s o p e n s a s n ä r h i + i s o p i h t i h ä n t ä + i s o p i i k k i p y r s t ö + i s o p i i s k u + i s o p i s t o o l i + i s o p o s l i i n i k u k k a + i s o p r o p y y l i a m i i n i s u o l a a + i s o p r o p y y l i a s e t a a t t i + i s o p r o p y y l i k l o r i d i + i s o p u k i n j u u r i + i s o p u k s i p u u + i s o p u n a p e i p p o + i s o p u s s i k a n i i n i + i s o p u u s i r k k u + i s o p y r s t ö h a u k k a + i s o p y s t y n o k k a + i s o p ö k k e l ö k e h r ä ä j ä + i s o r a i t a k e r t t u + i s o r a i t a y ö k k ö n e n + i s o r a s t a s m u u r a + i s o r i i k i n k u k k o k e h r ä ä j ä + i s o r i t a r i n k a n n u s + i s o r o k k o r o k o t e + i s o r o k k o r o k o t t e i d e n + i s o r o k k o v i r u s + i s o r o t t a + i s o r u o h o k a i j a + i s o r u s o k a s + i s o r u s o k y y h k y + i s o r u u s u k i r v a + i s o r ö l l i + i s o s e e p r a n u o l i a i n e n + i s o s i i l i k a l a + i s o s i l m ä t o n n i k a l a + i s o s i l m ä t o n n i k a l a a + i s o s i m p p u + i s o s i r p p i k i p u a j a + i s o s i r p p i s i i p i + i s o s i r r i + i s o s i s k o m m e + i s o s i s k o n s a + i s o s i t r u u n a h a p p o + i s o s i t t i ä i n e n + i s o s s a + i s o s t a + i s o s u d e n p o r k k a n a + i s o s u k a s t a p a k u l o + i s o s u l k u k o t i l o + i s o t a k i a i n e n + i s o t a l v i k k i + i s o t a l v i o + i s o t a s k u r a p u + i s o t i i k e r i h a i k a r a + i s o t i k k a n e n + i s o t i n a m i + i s o t r a p p i + i s o t r a p p i k a n t a + i s o t r o g o n i + i s o t r u m p e t t i k ö y n n ö s + i s o t u l i t ö y h t ö + i s o t u o m i p i h l a j a + i s o t u u l e n k a l a + i s o t u u l i h a u k k a + i s o t y r a n n i + i s o t y t ö n k o r e n t o + i s o t ä h t i p u t k i + i s o t ä p l ä s i v e t t i k i s s a + i s o t ä t i n i + i s o t ö p ö r a s t a s + i s o t ö r m ä p ä ä s k y + i s o t ö y h t ö a n g e r v o + i s o t ö y h t ö n a p s u + i s o u k o n k o r e n t o + i s o v a h a k o i s a + i s o v a n h e m p a m m e + i s o v a n h e m p a n s a + i s o v a n h e m p i a + i s o v a s a r a h a i + i s o v e l i + i s o v e l i y h t e i s k u n n a s s a + i s o v e l i y h t e i s k u n t a a + i s o v e l j e n + i s o v e l j e n s ä + i s o v e l j e n ä + i s o v e l j e s t ä + i s o v e l j e ä + i s o v e l j i n ä + i s o v e r e n i m i j ä + i s o v e s i h e r n e + i s o v e s i p ä ä s k y + i s o v e s i r i k k o + i s o v i i k s i s i i p p a + i s o v i l i s t ä j ä + i s o v o i h a p p o + i s o v o i r o u s k u + i s o v u o r i m e s i k k o + i s o y m p y r ä + i s r a e l i l a i s a r m e i j a n + i s r a e l i l a i s e n + i s r a e l i l a i s e t + i s r a e l i l a i s h a l l i n t o + i s r a e l i l a i s i a + i s r a e l i l a i s i i n + i s r a e l i l a i s i l l a + i s r a e l i l a i s i l l e + i s r a e l i l a i s i s s a + i s r a e l i l a i s k y l i e n + i s r a e l i l a i s l a p s e n + i s r a e l i l a i s l a p s e t k i n + i s r a e l i l a i s l a s t a + i s r a e l i l a i s l ä ä k ä r i + i s r a e l i l a i s m i e h e n + i s r a e l i l a i s m i n i s t e r i n + i s r a e l i l a i s n a i s e n + i s r a e l i l a i s n a i s e t + i s r a e l i l a i s n u o r e t + i s r a e l i l a i s n u o r t e n + i s r a e l i l a i s o h j u s t e n + i s r a e l i l a i s o s a p u o l e n + i s r a e l i l a i s p a l e s t i i n a l a i s e e n + i s r a e l i l a i s p e r h e i t ä + i s r a e l i l a i s p o i k a + i s r a e l i l a i s r a d i k a a l e i l t a + i s r a e l i l a i s s i i r t o k u n t i e n + i s r a e l i l a i s s i i r t o l a i s i s t a + i s r a e l i l a i s s i v i i l e i h i n + i s r a e l i l a i s s o t i l a a n + i s r a e l i l a i s s o t i l a a t + i s r a e l i l a i s s o t i l a i d e n + i s r a e l i l a i s s o t i l a i t a + i s r a e l i l a i s s o t i l a s + i s r a e l i l a i s t e n + i s r a e l i l a i s t u r i s t e j a + i s r a e l i l a i s t u r i s t i e n + i s r a e l i l a i s t y t ö n + i s r a e l i l a i s v a l t u u s k u n n a n + i s r a e l i l a i s v a n h e m p i e n + i s r a e l i l a i s v i r a n o m a i s t e n + i s r a e l i l a i s v ä e s t ö n + i s r a e l i l a i s ä i t i ä + i s t u a + i s t u a k s e m m e + i s t u e n + i s t u e s s a m m e + i s t u e s s a n n e + i s t u i + i s t u i m e t + i s t u i n j ä r j e s t e l y i h i n + i s t u i n r i v i s s ä + i s t u i n r y h m i ä + i s t u i v a t + i s t u k a n + i s t u k k a h o r m o n i + i s t u m a a n + i s t u m a p a i k a l t a n i + i s t u m a p a i k k a n i + i s t u m a s t a + i s t u m i s a l u e e n + i s t u m m e + i s t u n + i s t u n n o i l l e m m e + i s t u n n o i s s a + i s t u n n o i s t a + i s t u n n o n + i s t u n n o n j a k s o n + i s t u n n o s s a + i s t u n n o s s a a n + i s t u n n o s s a m m e + i s t u n n o s t a m m e + i s t u n n o t + i s t u n t o a + i s t u n t o a i k a t a u l u + i s t u n t o a i k a t a u l u n s a + i s t u n t o a i k a t a u l u s t a + i s t u n t o a i k o i h i n + i s t u n t o a n n e + i s t u n t o a s i a k i r j a s s a + i s t u n t o h e n k i l ö s t ö ä + i s t u n t o i h i n + i s t u n t o i l t a n a + i s t u n t o j a + i s t u n t o j a k s o + i s t u n t o j a k s o a + i s t u n t o j a k s o i l l a + i s t u n t o j a k s o i l l e + i s t u n t o j a k s o i s t a + i s t u n t o j a k s o j a + i s t u n t o j a k s o j e n + i s t u n t o j a k s o k s i + i s t u n t o j a k s o l l a + i s t u n t o j a k s o l l e + i s t u n t o j a k s o m m e + i s t u n t o j a k s o n + i s t u n t o j a k s o n n e + i s t u n t o j a k s o o n + i s t u n t o j a k s o s s a + i s t u n t o j a k s o s t a + i s t u n t o j a k s o t + i s t u n t o j a k s o v i i k o i l l a + i s t u n t o j a o s t o n + i s t u n t o j e m m e + i s t u n t o j e n + i s t u n t o k a l e n t e r i + i s t u n t o k a l e n t e r i e s i t y k s e s t ä + i s t u n t o k a l e n t e r i k s i + i s t u n t o k a l e n t e r i m m e + i s t u n t o k a l e n t e r i n + i s t u n t o k a l e n t e r i s t a + i s t u n t o k a l e n t e r i s t a a n + i s t u n t o k a l e n t e r i s t a m m e + i s t u n t o k a l e n t e r i ä ä n e s t y k s e t + i s t u n t o k a u d e l l a + i s t u n t o k a u d e l l e + i s t u n t o k a u d e n + i s t u n t o k a u d e s t a + i s t u n t o k a u s i + i s t u n t o k a u s i e n + i s t u n t o k a u t t a + i s t u n t o k e s k u s t e l u s s a + i s t u n t o m a r a t o n e i s s a + i s t u n t o m m e + i s t u n t o n s a + i s t u n t o o m m e + i s t u n t o o n + i s t u n t o p a i k a s t a + i s t u n t o p a l v e l u + i s t u n t o p a l v e l u i d e n + i s t u n t o p a l v e l u i s s a + i s t u n t o p a l v e l u i s t a + i s t u n t o p a l v e l u j a + i s t u n t o p a l v e l u j a o s t o + i s t u n t o p a l v e l u j a o s t o l l e + i s t u n t o p a l v e l u j a o s t o n + i s t u n t o p a l v e l u j e n + i s t u n t o p a l v e l u l l e + i s t u n t o p a l v e l u n + i s t u n t o p a l v e l u o s a s t o + i s t u n t o p a l v e l u o s a s t o l l e + i s t u n t o p a l v e l u s t a + i s t u n t o p a l v e l u t + i s t u n t o p a l v e l u y k s i k k ö + i s t u n t o p ä i v i n ä + i s t u n t o p ä i v i n ä k ä ä n + i s t u n t o p ä i v ä + i s t u n t o p ä i v ä n ä + i s t u n t o p ö y t ä k i r j a a n + i s t u n t o p ö y t ä k i r j a s t a + i s t u n t o p ö y t ä k i r j a t + i s t u n t o r y t m i n + i s t u n t o s a l i + i s t u n t o s a l i a + i s t u n t o s a l i i n + i s t u n t o s a l i m m e + i s t u n t o s a l i n + i s t u n t o s a l i s s a + i s t u n t o s a l i s s a m m e + i s t u n t o s a l i s t a + i s t u n t o s e l o s t u k s e e n + i s t u n t o s e l o s t u k s e s t a + i s t u n t o s e l o s t u k s e t + i s t u n t o s e l o s t u k s i a + i s t u n t o s e l o s t u k s i i n + i s t u n t o s e l o s t u k s i s s a + i s t u n t o s e l o s t u k s i s t a + i s t u n t o s e l o s t u s + i s t u n t o s e l o s t u s t a + i s t u n t o s e l o s t u s t e n + i s t u n t o t y ö h ö n + i s t u n t o u u t i s i s s a + i s t u n t o v i i k k o + i s t u n t o v i i k k o a + i s t u n t o v i i k k o j e n + i s t u n t o v i i k o i l l a + i s t u n t o v i i k o l l a + i s t u n t o v i i k o n + i s t u n t o v i i k o s s a + i s t u n t o y k s i k k ö + i s t u n t o y k s i k ö n + i s t u n t o ä ä n e s t y s + i s t u t a a n + i s t u t e t t a v a + i s t u t e t u i l l a + i s t u t t a k a a m m e + i s t u t t a m i s e k s i + i s t u t t e + i s t u t u s h i n n a n + i s t u t u s k a l o j a + i s t u t u s k a u s i + i s t u t u s k ä y t ä n n ö i s t ä + i s t u t u s k ä y t ä n t ö j ä + i s t u t u s o i k e u d e n + i s t u t u s o i k e u d e t + i s t u t u s o i k e u k s i a + i s t u t u s o i k e u k s i e n + i s t u t u s o i k e u k s i i n + i s t u t u s o i k e u s j ä r j e s t e l m ä n + i s t u t u s t o i m i a + i s t u t u s v u o d e s t a + i s t u u + i s t u v a t + i s y y s l o m a + i s y y s l o m a a + i s y y s l o m a a n + i s y y s l o m a l l a + i s y y s l o m a l l e + i s y y s l o m a n + i s y y s l o m i a + i s y y s l o m i e n + i s y y s t u t k i m u s + i s y y s v a p a a + i s y y s v a p a a l l a + i s y y s v a p a a n + i s y y s v a p a a s e e n + i s y y s v a p a a s t a + i s y y s v a p a a t a + i s y y s v a p a i t a + i s ä h a h m o + i s ä k i n + i s ä k s i + i s ä l l e e n + i s ä m m e + i s ä n + i s ä n i + i s ä n m a a + i s ä n m a a h a n s a + i s ä n m a a l i i t t o + i s ä n m a a l l i s t e n + i s ä n m a a l l i s u u d e s t a + i s ä n m a a l l i s u u s + i s ä n m a a n i + i s ä n m a a n r a k k a u t e m m e + i s ä n m a a s t a a n + i s ä n m a a t a + i s ä n m a a t t o m i e n + i s ä n m a i d e n + i s ä n n ä n v i i r i + i s ä n n ö i d ä + i s ä n p ä i v ä + i s ä n t ä j ä s e n v a l t i o + i s ä n t ä j ä s e n v a l t i o s s a + i s ä n t ä k a u p u n g i s s a + i s ä n t ä k a u p u n g i s s a m m e + i s ä n t ä k a u p u n k i m m e + i s ä n t ä k u m p p a n i n + i s ä n t ä m a a + i s ä n t ä m a a l l e + i s ä n t ä m a a n + i s ä n t ä m a a n s a + i s ä n t ä m a a s s a + i s ä n t ä m a a t + i s ä n t ä m a a t a + i s ä n t ä m a a t a m m e + i s ä n t ä m a i d e n + i s ä n t ä m a i d e n s a + i s ä n t ä m a i h i n + i s ä n t ä m a i l l a + i s ä n t ä m a i l l e + i s ä n t ä m a i s s a + i s ä n t ä m a i s s a a n + i s ä n t ä m a i t a + i s ä n t ä o r g a n i s a a t i o i l l e + i s ä n t ä o r g a n i s a a t i o n + i s ä n t ä p e r h e i d e n + i s ä n t ä p e r h e i s i i n + i s ä n t ä p e r h e i s s ä + i s ä n t ä p e r h e i t ä ä n + i s ä n t ä v a l t i o + i s ä n t ä v a l t i o i d e n + i s ä n t ä v a l t i o n + i s ä n t ä v a l t i o n k i n + i s ä n t ä v a l t i o s s a + i s ä n t ä v a l t i o t + i s ä n t ä v a l t i o t a + i s ä n t ä y h t e i s k u n n i s s a + i s ä n t ä y h t e i s k u n n i s s a a n + i s ä n t ä y h t e i s k u n t a a + i s ä n t ä y h t e i s ö j ä + i s ä n t ä y r i t y s t ä + i s ä n ä + i s ä s t ä + i s ä s t ä n i + i s ä t + i t a l i a a + i t a l i a a n + i t a l i a a n h a n + i t a l i a k i n + i t a l i a k s i + i t a l i a l a i s e e n + i t a l i a l a i s e n + i t a l i a l a i s e t + i t a l i a l a i s i a + i t a l i a l a i s i l l e + i t a l i a l a i s j ä r j e s t ä j i l l e + i t a l i a l a i s j ä s e n e n + i t a l i a l a i s j ä s e n e t + i t a l i a l a i s j ä s e n i l l e + i t a l i a l a i s k a u p u n g i s s a + i t a l i a l a i s k o l l e g o i d e m m e + i t a l i a l a i s k o l l e g o i s t a + i t a l i a l a i s k o l l e g o j e n + i t a l i a l a i s m i n i s t e r i n + i t a l i a l a i s n a i s e l l e + i t a l i a l a i s n a i s t a + i t a l i a l a i s p e r h e i l l e + i t a l i a l a i s p o l i i t i k o t + i t a l i a l a i s r i k o l l i s i i n + i t a l i a l a i s s a k s a l a i n e n + i t a l i a l a i s s o d a t + i t a l i a l a i s t a + i t a l i a l a i s t e n + i t a l i a l a i s v ä h e m m i s t ö i l l e + i t a l i a l a i s v ä h e m m i s t ö l l e + i t a l i a l a i s y h d y s v a l t a l a i s e n + i t a l i a l a i s y h t i ö l l ä + i t a l i a l l e + i t a l i a n + i t a l i a n a j o k o i r a + i t a l i a n k i e l i n e n + i t a l i a n k i e l i s e l l e + i t a l i a n k i e l i s e n + i t a l i a n k i e l i s e s s ä + i t a l i a n k i e l i s e t + i t a l i a n k i e l i s t e n + i t a l i a n k i e l i s t ä + i t a l i a n p a i m e n k o i r a + i t a l i a n r a i h e i n ä + i t a l i a n s u o m a l a i s e n + i t a l i a n s u s i k o i r a + i t a l i a n t a l v e n t ä h t i + i t a l i a n t y ö h e v o n e n + i t a l i a n v a s t a i s t a + i t a l i a n v i n t t i k o i r a + i t a l i a s s a + i t a l i a s s a k i n + i t a l i a s t a + i t k e t t ä ä + i t k i j ä n a i s i n a + i t k u h ä l y t i n + i t k u l u h t a k a n a + i t k u m u u r i + i t k u m u u r i l l a + i t k u p a j u + i t k u p i l l i + i t k u u n + i t s e a i h e u t e t t u j e n + i t s e a i h e u t e t u s t a + i t s e a r v i o i n n i n + i t s e a r v i o i n n i s s a + i t s e a r v i o i n t i a + i t s e a r v i o i n t i i n + i t s e a r v i o i n t i p r o s e s s i s t a + i t s e a r v i o i n t i t e s t e j ä + i t s e a r v i o n + i t s e a s e t e t u s t a + i t s e e m m e + i t s e e n s ä + i t s e h a l l i n n o i n n i n + i t s e h a l l i n n o l l a + i t s e h a l l i n n o l l e + i t s e h a l l i n n o n + i t s e h a l l i n n o s t a + i t s e h a l l i n n o t + i t s e h a l l i n t o a + i t s e h a l l i n t o a l u e + i t s e h a l l i n t o a l u e e l l a + i t s e h a l l i n t o a l u e e l l e + i t s e h a l l i n t o a l u e e l t a + i t s e h a l l i n t o a l u e e n + i t s e h a l l i n t o a l u e e s e e n + i t s e h a l l i n t o a l u e e t + i t s e h a l l i n t o a l u e i d e n + i t s e h a l l i n t o a l u e i l l a + i t s e h a l l i n t o a l u e i l l e + i t s e h a l l i n t o a l u e i l t a + i t s e h a l l i n t o a l u e i s i i n + i t s e h a l l i n t o a l u e i s t a + i t s e h a l l i n t o a l u e t t a + i t s e h a l l i n t o a s e m a + i t s e h a l l i n t o a s e m a n + i t s e h a l l i n t o e l i m e n + i t s e h a l l i n t o e l i m e s t ä + i t s e h a l l i n t o e l i m i ä + i t s e h a l l i n t o j ä r j e s t e l m i ä + i t s e h a l l i n t o j ä r j e s t e l m ä + i t s e h a l l i n t o j ä r j e s t e l y i s t ä + i t s e h a l l i n t o l a i n + i t s e h a l l i n t o l a k i + i t s e h a l l i n t o m a l l i + i t s e h a l l i n t o o n + i t s e h a l l i n t o s o p i m u k s e n + i t s e h a l l i n t o t a h o j e n + i t s e h a l l i n t o v a a t i m u k s i a + i t s e h a l l i n t o v i r a n o m a i s e l l e + i t s e h a l l i n t o v i r a n o m a i s e t + i t s e h a l l i n t o v i r a n o m a i s i a + i t s e h a l l i n t o v i r a n o m a i s t e n + i t s e h i l l i n n ä n + i t s e h i l l i n n ä s t ä + i t s e h i l l i n t ä ä + i t s e h i l l i n t ä ä n + i t s e i l m o i t u s p e r i a a t e t t a + i t s e i s a r v o a + i t s e i s a r v o n a + i t s e j ä r j e s t e l y y n + i t s e k e h u a + i t s e k e h u i l l a + i t s e k e s k e i s i ä + i t s e k e s k e i s y y d e s t ä + i t s e k i n + i t s e k k y y d e n + i t s e k k y y d e s t ä + i t s e k k y y d e t + i t s e k k y y t e e n + i t s e k k y y t e n s ä + i t s e k k y y t t ä + i t s e k k ä i k s i + i t s e k k ä ä m p i + i t s e k k ä ä m p ä ä + i t s e k o r o s t u k s e e n + i t s e k r i i t t i s e n + i t s e k r i i t t i s e s t ä + i t s e k r i i t t i s i n ä + i t s e k r i i t t i s i ä + i t s e k r i i t t i s t ä + i t s e k r i i t t i s y y d e n + i t s e k r i i t t i s y y s + i t s e k r i i t t i s y y t e e n + i t s e k r i i t t i s y y t t ä + i t s e k r i t i i k i l l e + i t s e k r i t i i k i l l ä + i t s e k r i t i i k i n + i t s e k r i t i i k i s s ä + i t s e k r i t i i k k i i n + i t s e k r i t i i k k i ä + i t s e k s e e n + i t s e k u n n i o i t u k s e l l e m m e + i t s e k u n n i o i t u k s e n + i t s e k u n n i o i t u k s e n s a + i t s e k u n n i o i t u s t a + i t s e k u r i a + i t s e k u r i i n + i t s e k u r i l l e + i t s e k u r i n + i t s e k u r i s t a + i t s e k ä s i t t e l i j ö i d e n + i t s e k ä s i t t e l i j ö i l l e + i t s e k ä s i t t e l i j ö i s t ä + i t s e k ä s i t t e l y + i t s e k ä s i t t e l y l l e + i t s e k ä s i t t e l y m a h d o l l i s u u k s i e n + i t s e k ä s i t t e l y n + i t s e k ä s i t t e l y n ä + i t s e k ä s i t t e l y s t ä + i t s e k ä s i t t e l y y n + i t s e k ä s i t t e l y ä + i t s e k ä s t ä + i t s e l l e + i t s e l l e e n + i t s e l l e m m e + i t s e l l e n i + i t s e l l ä m m e + i t s e l l ä ä n + i t s e l t ä m m e + i t s e l t ä ä n + i t s e l u o t t a m u k s e k s i + i t s e l u o t t a m u k s e l l a + i t s e l u o t t a m u k s e m m e + i t s e l u o t t a m u k s e n + i t s e l u o t t a m u k s e n s a + i t s e l u o t t a m u k s e s t a + i t s e l u o t t a m u s t a + i t s e l ä ä k i n n ä n + i t s e l ä ä k i n n ä s t ä + i t s e l ä ä k i n t ä ä + i t s e m m e + i t s e m u r h a a + i t s e m u r h a a n + i t s e m u r h a e h d o k k a i t a + i t s e m u r h a i s k u + i t s e m u r h a i s k u i h i n + i t s e m u r h a i s k u i l l a + i t s e m u r h a i s k u i s s a + i t s e m u r h a i s k u i s t a + i t s e m u r h a i s k u j a + i t s e m u r h a i s k u j e n + i t s e m u r h a i s k u n + i t s e m u r h a i s k u s t a + i t s e m u r h a i s k u t + i t s e m u r h a i s k u u n + i t s e m u r h a k o m m a n d o j e n + i t s e m u r h a l u k u j a + i t s e m u r h a l u k u j e n + i t s e m u r h a l u v u t + i t s e m u r h a n + i t s e m u r h a o p e r a a t i o i h i n + i t s e m u r h a p o l i t i i k a l l e + i t s e m u r h a p o m m i + i t s e m u r h a p o m m i e n + i t s e m u r h a p o m m i t + i t s e m u r h a p o m m i t t a j a + i t s e m u r h a p o m m i t t a j a a + i t s e m u r h a p o m m i t t a j a n + i t s e m u r h a p o m m i t t a j a t + i t s e m u r h a p o m m i t t a j i a + i t s e m u r h a p o m m i t t a j i e n + i t s e m u r h a p o m m i t t a j i k s i + i t s e m u r h a p o m m i t t a j i n a + i t s e m u r h a p o m m i t t a j i s t a + i t s e m u r h a p o m m i t u k s e s t a + i t s e m u r h a p o m m i t u k s e t + i t s e m u r h a p o m m i t u k s i a + i t s e m u r h a p o m m i t u k s i i n + i t s e m u r h a p o m m i t u k s i l t a + i t s e m u r h a p o m m i t u s + i t s e m u r h a p o m m i t u s t a + i t s e m u r h a p o m m i t u s t e n + i t s e m u r h a p r o s e n t t i + i t s e m u r h a r e k i s t e r i + i t s e m u r h a r y h m ä + i t s e m u r h a s i e m e n t e n + i t s e m u r h a t + i t s e m u r h a t e r r o r i s t e j a + i t s e m u r h a t e r r o r i s t i e n + i t s e m u r h a t e r r o r i s t i t + i t s e m u r h a v i e s t i + i t s e m u r h a v y ö t + i t s e m u r h a v y ö t ä + i t s e m u r h a y r i t y k s e e n + i t s e m u r h a y r i t y k s e s t ä + i t s e m u r h a y r i t y k s e t + i t s e m u r h a y r i t y k s i i n + i t s e m u r h a y r i t y k s i ä + i t s e m u r h a y r i t y s + i t s e m u r h a y r i t y s t e n + i t s e m u r h a y r i t y s t ä + i t s e m u r h i a + i t s e m u r h i e n + i t s e m u r h i n a + i t s e m u r h i s t a + i t s e m ä ä r ä y s o i k e u s + i t s e m ä ä r ä ä m i n e n + i t s e m ä ä r ä ä m i s e e n + i t s e m ä ä r ä ä m i s e n + i t s e m ä ä r ä ä m i s o i k e u d e k s i + i t s e m ä ä r ä ä m i s o i k e u d e l l a + i t s e m ä ä r ä ä m i s o i k e u d e l l e + i t s e m ä ä r ä ä m i s o i k e u d e n + i t s e m ä ä r ä ä m i s o i k e u d e s s a + i t s e m ä ä r ä ä m i s o i k e u d e s t a + i t s e m ä ä r ä ä m i s o i k e u d e s t a a n + i t s e m ä ä r ä ä m i s o i k e u d e s t a m m e + i t s e m ä ä r ä ä m i s o i k e u d e t + i t s e m ä ä r ä ä m i s o i k e u k s i a + i t s e m ä ä r ä ä m i s o i k e u k s i e n + i t s e m ä ä r ä ä m i s o i k e u t e e n + i t s e m ä ä r ä ä m i s o i k e u t e m m e + i t s e m ä ä r ä ä m i s o i k e u t e n s a + i t s e m ä ä r ä ä m i s o i k e u t t a + i t s e m ä ä r ä ä m i s o i k e u t t a a n + i t s e m ä ä r ä ä m i s p e r i a a t t e e n + i t s e m ä ä r ä ä m i s t ä + i t s e m ä ä r ä ä m i s v a l t a a + i t s e m ä ä r ä ä m i s v a l t a a n + i t s e n i + i t s e n s ä + i t s e n ä i s e e n + i t s e n ä i s e k s i + i t s e n ä i s e l l ä + i t s e n ä i s e m m ä k s i + i t s e n ä i s e m m ä n + i t s e n ä i s e m p i + i t s e n ä i s e m p i n ä + i t s e n ä i s e m p i ä + i t s e n ä i s e n + i t s e n ä i s e n ä + i t s e n ä i s e s s ä + i t s e n ä i s e s t ä + i t s e n ä i s e t + i t s e n ä i s i i n + i t s e n ä i s i l l e + i t s e n ä i s i l l ä + i t s e n ä i s i m m ä s t ä + i t s e n ä i s i n e + i t s e n ä i s i n ä + i t s e n ä i s i s s ä + i t s e n ä i s i s t ä + i t s e n ä i s i ä + i t s e n ä i s t e n + i t s e n ä i s t y e s s ä + i t s e n ä i s t y i + i t s e n ä i s t y i s i + i t s e n ä i s t y i s i v ä t + i t s e n ä i s t y i v ä t + i t s e n ä i s t y m i s e n + i t s e n ä i s t y m i s e n s ä + i t s e n ä i s t y m i s e s t ä + i t s e n ä i s t y m i s e s t ä ä n + i t s e n ä i s t y m i s h a l u t + i t s e n ä i s t y m i s k e h i t y k s e n + i t s e n ä i s t y m i s l i i k k e i d e n + i t s e n ä i s t y m i s p r o s e s s i + i t s e n ä i s t y m i s p r o s e s s i a + i t s e n ä i s t y m i s p r o s e s s i n + i t s e n ä i s t y m i s p y r k i m y k s e t + i t s e n ä i s t y m i s p y r k i m y k s i i n + i t s e n ä i s t y m i s t ä + i t s e n ä i s t y m i s t ä ä n + i t s e n ä i s t y n e e s t ä + i t s e n ä i s t y n e e t + i t s e n ä i s t y n e i l l e + i t s e n ä i s t y n e i t ä + i t s e n ä i s t y n y t + i t s e n ä i s t y t t y ä + i t s e n ä i s t y v ä t + i t s e n ä i s t y y + i t s e n ä i s t y ä + i t s e n ä i s t ä m i s p o l i t i i k k a a + i t s e n ä i s y y d e n + i t s e n ä i s y y d e n a u k i o + i t s e n ä i s y y d e n j u l i s t u s + i t s e n ä i s y y d e n j ä l k e i s e n + i t s e n ä i s y y d e s t ä + i t s e n ä i s y y s a j a t u k s i a + i t s e n ä i s y y s a u k i o l l a + i t s e n ä i s y y s j u h l a l l i s u u k s i s s a + i t s e n ä i s y y s j u l i s t u k s e e n + i t s e n ä i s y y s j u l i s t u k s e l l a + i t s e n ä i s y y s j u l i s t u k s e n + i t s e n ä i s y y s j u l i s t u k s e s s a + i t s e n ä i s y y s j u l i s t u k s e s t a + i t s e n ä i s y y s j u l i s t u k s e t + i t s e n ä i s y y s j u l i s t u s + i t s e n ä i s y y s j u l i s t u s t a + i t s e n ä i s y y s j u l i s t u s t a a n + i t s e n ä i s y y s j u l i s t u s t e n + i t s e n ä i s y y s l i i k e + i t s e n ä i s y y s l i i k k e e n + i t s e n ä i s y y s l i i k k e e t + i t s e n ä i s y y s l i i k k e i s s ä + i t s e n ä i s y y s l i i k k e i t ä + i t s e n ä i s y y s m i e l i s e n + i t s e n ä i s y y s m i e l i s i i n + i t s e n ä i s y y s p r o s e s s i + i t s e n ä i s y y s p u o l u e + i t s e n ä i s y y s p u o l u e e l l e + i t s e n ä i s y y s p u o l u e e n + i t s e n ä i s y y s p u o l u e e s e e n + i t s e n ä i s y y s p u o l u e e s s a + i t s e n ä i s y y s p u o l u e e s t a + i t s e n ä i s y y s p u o l u e e t + i t s e n ä i s y y s p u o l u e t t a + i t s e n ä i s y y s p y r k i m y k s e t + i t s e n ä i s y y s p y r k i m y k s i i n s ä + i t s e n ä i s y y s p y r k i m y k s i s s ä + i t s e n ä i s y y s p y r k i m y k s i ä + i t s e n ä i s y y s p y r k i m y s t e n + i t s e n ä i s y y s p ä i v ä + i t s e n ä i s y y s p ä i v ä n + i t s e n ä i s y y s p ä i v ä ä + i t s e n ä i s y y s p ä i v ä ä n s ä + i t s e n ä i s y y s s o d a n + i t s e n ä i s y y s s o d a t + i t s e n ä i s y y s s o d i s t a + i t s e n ä i s y y s s o t a + i t s e n ä i s y y s s o t a a + i t s e n ä i s y y s t a h t o + i t s e n ä i s y y s t a i s t e l i j a n + i t s e n ä i s y y s t a i s t e l i j o i d e n + i t s e n ä i s y y s t a i s t e l u a + i t s e n ä i s y y s t a i s t e l u i s s a + i t s e n ä i s y y s t a i s t e l u n + i t s e n ä i s y y s t a i s t e l u n s a + i t s e n ä i s y y s t a i s t e l u s s a + i t s e n ä i s y y s t a i s t e l u u n + i t s e n ä i s y y s t o i v e e t + i t s e n ä i s y y s v a a l e j a + i t s e n ä i s y y s v a a t i m u k s i s t a + i t s e n ä i s y y t e e n + i t s e n ä i s y y t e n s ä + i t s e n ä i s y y t t ä + i t s e n ä ä n + i t s e o h j a u t u v u u s t e o r i a + i t s e o h j a u t u v u u t e e n + i t s e o i k e u t u k s e s t a + i t s e o i v a l l u s + i t s e o r g a n i s o i t u m i n e n + i t s e p a l v e l u j ä r j e s t e l m ä s t ä + i t s e p a l v e l u k a u p p a + i t s e p a l v e l u k e s k u k s e n + i t s e p a l v e l u l a i t o k s e k s i + i t s e p a l v e l u m e n t a l i t e e t i s t a + i t s e p a l v e l u m e n t a l i t e e t t i + i t s e p a l v e l u m y y m ä l ä + i t s e p a l v e l u m y y m ä l ä ä + i t s e p a l v e l u n + i t s e p a l v e l u p e s u l a + i t s e p a r a n t a v i i n + i t s e p e t o k s e e n + i t s e p e t o k s e n + i t s e p e t o s t a + i t s e p i n t a i s e l l a + i t s e p i n t a i s e s t a + i t s e p i n t a i s t e n + i t s e p u o l u s t u k s e e n + i t s e p u o l u s t u k s e k s i + i t s e p u o l u s t u k s e l l a + i t s e p u o l u s t u k s e m m e + i t s e p u o l u s t u k s e n + i t s e p u o l u s t u k s e n a + i t s e p u o l u s t u s j o u k k o j a + i t s e p u o l u s t u s l a j i + i t s e p u o l u s t u s o i k e u t t a + i t s e p u o l u s t u s p u o l u e + i t s e p u o l u s t u s t a + i t s e p u o l u s t u s t i l a n t e e s s a + i t s e p u o l u s t u s t o i n t a + i t s e p ä i s e m m i n + i t s e p ä i s i m m i n + i t s e p ä i s y y t e e n + i t s e r a h o i t u k s e e n + i t s e r e f l e k t i o + i t s e r i i t t o i s e e n + i t s e r i i t t o i s u u d e s t a m m e + i t s e s e n s u u r i a + i t s e s e n s u u r i i n + i t s e s e n s u u r i k s i + i t s e s e n s u u r i l l e + i t s e s e n s u u r i n + i t s e s e n s u u r i s t a + i t s e s i m i l a a r i n e n + i t s e s s ä ä n + i t s e s t ä + i t s e s t ä m m e + i t s e s t ä ä n + i t s e s t ä ä n s e l v y y k s i n ä + i t s e s t ä ä n s e l v y y k s i ä + i t s e s t ä ä n s e l v ä ä + i t s e s u g g e s t i o o n + i t s e s u g g e s t i o p o l i t i i k k a + i t s e s u g g e s t i o p o l i t i i k k a a + i t s e s u o j e l u a + i t s e s u o j e l u s t a + i t s e s u o j e l u s ä ä n t ö j e n + i t s e s u o j e l u t o i m e n p i t e i s t ä + i t s e s y r j i n t ä ä + i t s e s y t t y m i s l ä m p ö t i l a + i t s e s ä ä n t e l y + i t s e s ä ä n t e l y a l o i t e + i t s e s ä ä n t e l y e l i m i ä + i t s e s ä ä n t e l y e l i n + i t s e s ä ä n t e l y h a l u k k u u d e n + i t s e s ä ä n t e l y j ä r j e s t e l m i ä + i t s e s ä ä n t e l y j ä r j e s t e l m ä + i t s e s ä ä n t e l y j ä r j e s t e l m ä ä + i t s e s ä ä n t e l y k e h y s t e n + i t s e s ä ä n t e l y l l e + i t s e s ä ä n t e l y l l ä + i t s e s ä ä n t e l y m a h d o l l i s u u d e n + i t s e s ä ä n t e l y m a h d o l l i s u u t e e n + i t s e s ä ä n t e l y m e k a n i s m e j a + i t s e s ä ä n t e l y m e n e t e l m ä + i t s e s ä ä n t e l y m e n e t t e l y j ä + i t s e s ä ä n t e l y m e n e t t e l y t + i t s e s ä ä n t e l y m u o t o j a + i t s e s ä ä n t e l y n + i t s e s ä ä n t e l y n k i n + i t s e s ä ä n t e l y p r o s e s s i e n + i t s e s ä ä n t e l y p u i t t e e t + i t s e s ä ä n t e l y p y r k i m y k s i ä + i t s e s ä ä n t e l y r a t k a i s u t + i t s e s ä ä n t e l y s s ä + i t s e s ä ä n t e l y s t ä + i t s e s ä ä n t e l y t o i m i a + i t s e s ä ä n t e l y v a i h t o e h t o j e n + i t s e s ä ä n t e l y v a l t u u d e t + i t s e s ä ä n t e l y v i r a n o m a i n e n + i t s e s ä ä n t e l y v i r a n o m a i s e t + i t s e s ä ä n t e l y v ä l i n e e m m e + i t s e s ä ä n t e l y v ä l i n e i t ä + i t s e s ä ä n t e l y y n + i t s e s ä ä n t e l y ä + i t s e s ä ä t e l e v ä ä + i t s e s ä ä t e l y m e k a n i s m i e n + i t s e s ä ä t e l y n + i t s e s ä ä t e l y s t ä + i t s e s ä ä t e l y t o i m i e n + i t s e s ä ä t e l y v a l m i u s + i t s e s ä ä t e l y y n + i t s e s ä ä t e l y ä + i t s e t e h o s t u s t a + i t s e t i e t o i s e e n + i t s e t i e t o i s e n + i t s e t i e t o i s e s t a + i t s e t o i m i v a t + i t s e t u h o a + i t s e t u h o i s a + i t s e t u h o i s a s t a + i t s e t u h o i s e e n + i t s e t u h o i s e n a + i t s e t u h o i s e t + i t s e t u h o i s i a + i t s e t u h o i s t a + i t s e t u h o i s u u s + i t s e t u h o m e k a n i s m i a + i t s e t u h o n + i t s e t u h o o n + i t s e t u h o u t u m i s m e k a n i s m i + i t s e t u h o u t u m i s t a + i t s e t u n t e m u s t a + i t s e t u n t o a + i t s e t u n t o a a n + i t s e t u n t o m m e + i t s e t u n t o o n + i t s e t u t k i s k e l u a + i t s e t u t k i s k e l u n + i t s e t u t k i s k e l u u n + i t s e t u t k i s t e l u a + i t s e t u t k i s t e l u u n + i t s e t y y t y v ä i s i ä + i t s e t y y t y v ä i s y y d e s t ä + i t s e t y y t y v ä i s y y t e e n + i t s e v a l t a i s e m p i + i t s e v a l t a i s i a + i t s e v a l t a i s i i n + i t s e v a l t a i s i l l e + i t s e v a l t a i s i s s a + i t s e v a l t a i s i s t a + i t s e v a l t a i s t a + i t s e v a l t a i s t e n + i t s e v a l v o n n a n + i t s e v a l v o n n a s t a + i t s e v a r m a a + i t s e v a r m a a n + i t s e v a r m a n + i t s e v a r m a n a + i t s e v a r m a s t a + i t s e v a r m e m m a n + i t s e v a r m e m m i n + i t s e v a r m e m p i + i t s e v a r m e m p i a + i t s e v a r m e m p i i n + i t s e v a r m o i n a + i t s e v a r m o j a + i t s e v a r m u u d e n + i t s e v a r m u u t t a + i t s e ä m m e + i t s e ä m m e k i n + i t s e ä n i + i t s e ä n n e + i t s e ä ä n + i t u n a t a + i t u r a d a n + i t u r a t a a n + i t u s o l u j a + i t u s o l u j e n + i t ä a a s i a l a i s e n + i t ä a a s i a l a i s i l l a + i t ä a a s i a s s a + i t ä a f r i k k a l a i s i a + i t ä a l u e i d e n + i t ä a l u e i t a + i t ä b l o k i n + i t ä b l o k i s s a + i t ä b l o k i s t a + i t ä b l o k k i + i t ä b l o k k i a + i t ä b l o k k i i n + i t ä b l o k k i n a + i t ä e n g l a n t i l a i s t e n + i t ä e u r o o p p a l a i n e n + i t ä e u r o o p p a l a i s e e n + i t ä e u r o o p p a l a i s e n + i t ä e u r o o p p a l a i s e t + i t ä e u r o o p p a l a i s i a + i t ä e u r o o p p a l a i s i i n + i t ä e u r o o p p a l a i s i l l a + i t ä e u r o o p p a l a i s i l l e + i t ä e u r o o p p a l a i s i l t a + i t ä e u r o o p p a l a i s i s s a + i t ä e u r o o p p a l a i s i s t a + i t ä e u r o o p p a l a i s t a + i t ä e u r o o p p a l a i s t e n + i t ä i n t i a l a i n e n + i t ä i s e e n + i t ä i s e l l e + i t ä i s e l l ä + i t ä i s e m p ä ä + i t ä i s e n + i t ä i s e s s ä + i t ä i s e s t ä + i t ä i s e t + i t ä i s i l l e + i t ä i s i m m ä l l e + i t ä i s i s t ä + i t ä i s t e n + i t ä i s t ä + i t ä k a a s u l l a + i t ä l a a j e n e m i n e n + i t ä l a a j e n e m i s e e n + i t ä l a a j e n e m i s e n + i t ä l a a j e n e m i s e s t a + i t ä l a a j e n e m i s s t r a t e g i a a + i t ä l a a j e n e m i s t a + i t ä l a a j e n n u s + i t ä l a a j e n t u m i n e n + i t ä l a a j e n t u m i s e e n + i t ä l a a j e n t u m i s e l l a + i t ä l a a j e n t u m i s e l l a k i n + i t ä l a a j e n t u m i s e l l e + i t ä l a a j e n t u m i s e n + i t ä l a a j e n t u m i s e n s a + i t ä l a a j e n t u m i s e s s a + i t ä l a a j e n t u m i s e s t a + i t ä l a a j e n t u m i s p r o j e k t i + i t ä l a a j e n t u m i s t a + i t ä m a i h i n + i t ä m a r k k i n o i d e n + i t ä m a r k k i n o i s t a + i t ä m e r e e n + i t ä m e r e l l e + i t ä m e r e l l ä + i t ä m e r e l t ä + i t ä m e r e n + i t ä m e r e n m a a k u n n a t + i t ä m e r e n m a a t + i t ä m e r e s s ä + i t ä m e r e s t ä + i t ä m e r i + i t ä m e r i s t r a t e g i a + i t ä m e r i s t r a t e g i a n + i t ä m e r i t u t k i m u s o h j e l m a n + i t ä m e r t a + i t ä m i s a i k a + i t ä m i s a i k a a + i t ä m i s a j a n + i t ä m i s a j a s t a + i t ä m i s o n g e l m i n e e n + i t ä m i t a l i + i t ä n a a p u r e i d e m m e + i t ä n a a p u r e i d e n + i t ä n a a p u r e i h i m m e + i t ä n a a p u r e i h i n + i t ä n a a p u r e i h i n s a + i t ä n a a p u r e i l l e + i t ä n a a p u r e i l l e m m e + i t ä n a a p u r e i s t a m m e + i t ä n a a p u r e i t a + i t ä n a a p u r e i t a m m e + i t ä n a a p u r i + i t ä n a a p u r i e m m e + i t ä n a a p u r i e n + i t ä n a a p u r i l l e + i t ä n a a p u r i m m e + i t ä n a a p u r i n + i t ä n a a p u r i n s a + i t ä n a a p u r i s s a m m e + i t ä n a a p u r i t + i t ä o r t o d o k s i s e e n + i t ä o s a a + i t ä o s a a n + i t ä o s a n + i t ä o s a s s a + i t ä o s a s t a + i t ä o s i i n + i t ä o s i s s a + i t ä p o l i t i i k a n + i t ä p o l i t i i k k a n s a + i t ä p u o l a l a i s e e n + i t ä p u o l e l l a + i t ä p u o l e l t a + i t ä r a j a + i t ä r a j a a + i t ä r a j a a n + i t ä r a j a l l a + i t ä r a j a l l a a n + i t ä r a j a l l a m m e + i t ä r a j a l l e + i t ä r a j a l l e e n + i t ä r a j a l l e m m e + i t ä r a j a m m e + i t ä r a j a n + i t ä r a j a s t a + i t ä r a j o i h i n + i t ä r a j o i l l a + i t ä r a j o i l l a m m e + i t ä r a j o i l l e + i t ä r a j o i l l e m m e + i t ä r a j o j a + i t ä r a j o j e n + i t ä r a n n a l l a + i t ä r a n n i k k o + i t ä r a n n i k k o a + i t ä r a n n i k o l l a + i t ä r a n n i k o l l e + i t ä r a n n i k o l t a + i t ä r a n n i k o n + i t ä r i n t a m a + i t ä r o m a a n i s e t + i t ä r y h m ä n + i t ä s a k s a l a i n e n + i t ä s a k s a l a i s e n a + i t ä s a k s a l a i s e t + i t ä s a k s a l a i s i a + i t ä s a k s a l a i s i i n + i t ä s a k s a l a i s i l l e + i t ä s a k s a l a i s t e n + i t ä s l a a v i t + i t ä s u o m a l a i s e l l a + i t ä s u o m e n k a r j a + i t ä t i m o r i l a i s e n + i t ä t i m o r i l a i s e t + i t ä t i m o r i l a i s i a + i t ä t i m o r i l a i s i i n + i t ä t i m o r i l a i s i l l a + i t ä t i m o r i l a i s i l l e + i t ä t i m o r i l a i s i s t a + i t ä t i m o r i l a i s t a + i t ä t i m o r i l a i s t e n + i t ä t u o n n i l l a + i t ä v a l l a l l a + i t ä v a l l a l l e + i t ä v a l l a n + i t ä v a l l a n a j o k o i r a + i t ä v a l l a n p i n s e r i + i t ä v a l l a s s a + i t ä v a l l a s t a + i t ä v a l t a + i t ä v a l t a a + i t ä v a l t a a n + i t ä v a l t a b o i k o t t i + i t ä v a l t a l a i s e n a + i t ä v a l t a l a i s e s t a + i t ä v a l t a l a i s e t + i t ä v a l t a l a i s i a + i t ä v a l t a l a i s i s t a + i t ä v a l t a l a i s j ä s e n e t + i t ä v a l t a l a i s n a i s i a + i t ä v a l t a l a i s p u h u j a + i t ä v a l t a l a i s t a + i t ä v a l t a l a i s t e n + i t ä v a l t a l a i s v i r a s t o t + i t ä v a l t i o i d e n + i t ä v a l t i o i s t a + i t ä ä + i t ä ä n + i v a n o v i l l e k i n + i v a n o v i n + i v a t t a v a + i ä k k ä i d e n + i ä k k ä i l l e + i ä k k ä i l l ä + i ä k k ä i s i i n + i ä k k ä i s t ä + i ä k k ä i t ä + i ä k k ä ä m m i l l e + i ä k k ä ä t + i ä l l ä + i ä n i k u i n e n + i ä n i k u i s e n + i ä n i k u i s i s t a + i ä n m ä ä r i t y s m e n e t e l m ä + i ä s s ä + i ä s t ä + i ä s t ä ä n + j a a k a a n + j a a m m e + j a a n k i n + j a a r i t t e l u a + j a a r i t t e l u n + j a a r i t t e l u t + j a a t t e k o + j a a v a l a i s e t + j a a v a n h y y p p ä + j a a v a n i h m i n e n + j a a v a n k o t t a r a i n e n + j a a v a n k ä s n ä k ä ä r m e + j a a v a n l o i s t o r a s t a s + j a a v a n m a i n a + j a a v a n m e r e n + j a a v a n m e r i + j a a v a n m e r i m e t s o + j a a v a n m e t s ä k e r t t u n e n + j a a v a n p ö l l ö n e n + j a a v a n s a m m a l + j a a v a n s a n i a i n e n + j a a v a n s a r v i k u o n o + j a a v a n t i i k e r i + j a a v a n t r o g o n i + j a a v a n t u r t u r i k y y h k y + j a a v a n t y l l i + j a a v a n v a r p u s p ö l l ö + j a d e i i t t i k a a l i + j a d e s o t u r i + j a e t a + j a e t a a n + j a e t a a n k i n + j a e t t a e s s a + j a e t t a i s i i n + j a e t t a v a k s i + j a e t t a v a n a + j a e t t i i n + j a e t t u a + j a e t u i l l a + j a e t u i s t a + j a e t u m p a a + j a e t u n + j a e t u s t a + j a g i a n t e n n i + j a h k a i l e v a n + j a h k a i l l a + j a h k a i l u a j a n j a k s o i h i n + j a h t i h ä m ä h ä k i t + j a k a a + j a k a a k s e e n + j a k a a k s e m m e + j a k a a n t u a + j a k a a n t u i s i m m e + j a k a a n t u n e e m m a l t a + j a k a a n t u u + j a k a e s s a a n + j a k a e s s a m m e + j a k a e s s a n n e + j a k a i s i m m e + j a k a i s i v a t + j a k a k a a m m e + j a k a m a a n + j a k a m a l l a + j a k a m a t t a + j a k a m a t t o m u u d e n + j a k a m i s e e n + j a k a m i s e k s i + j a k a m i s e n + j a k a m i s e s s a + j a k a m i s e s t a + j a k a m i s j ä r j e s t e l m ä s s ä + j a k a m i s k ä y t ä n t ö j e n + j a k a m i s m a h d o l l i s u u d e n + j a k a m i s m e n e t e l m ä n + j a k a m i s m e n e t e l m ä s t ä + j a k a m i s p e r u s t e e t + j a k a m i s p o l i t i i k a s t a + j a k a m i s s u u n n i t e l m i a + j a k a m i s t a + j a k a n e e t + j a k a r a n d a h a p p o + j a k a u t u a + j a k a u t u i v a t + j a k a u t u m i s e e n + j a k a u t u m i s e n + j a k a u t u m i s e s s a + j a k a u t u m i s e s t a + j a k a u t u n e e s s a + j a k a u t u n e e t + j a k a u t u n e i l l a + j a k a u t u n e i s s a + j a k a u t u u + j a k a u t u v a m m e + j a k a v a a + j a k a v a n + j a k a v a t + j a k a v i e n + j a k e l e v a t + j a k e l i j a j ä r j e s t ö j e n + j a k e l i j a n a + j a k e l i j o i d e n + j a k e l i j o i l l e + j a k e l u a + j a k e l u a l a + j a k e l u a l a a n + j a k e l u a l a l l a + j a k e l u a l a l l e + j a k e l u a l a n + j a k e l u a l o i l l a + j a k e l u a s i o i t a + j a k e l u e d e l l y t y k s e t + j a k e l u h i n t a + j a k e l u i n f r a s t r u k t u u r i n + j a k e l u j ä r j e s t e l m i e n + j a k e l u j ä r j e s t e l m i l l ä + j a k e l u j ä r j e s t e l m i s s ä + j a k e l u j ä r j e s t e l m i s t ä + j a k e l u j ä r j e s t e l m ä + j a k e l u j ä r j e s t e l m ä l l e + j a k e l u j ä r j e s t e l m ä n + j a k e l u j ä r j e s t e l m ä n s ä + j a k e l u j ä r j e s t e l m ä s s ä + j a k e l u j ä r j e s t e l m ä t + j a k e l u j ä r j e s t e l m ä ä + j a k e l u j ä r j e s t e l m ä ä n + j a k e l u j ä t t i e n + j a k e l u k a n a v a + j a k e l u k a n a v a a + j a k e l u k a n a v a t + j a k e l u k a n a v i a + j a k e l u k a n a v i e n + j a k e l u k a n a v i i n + j a k e l u k a n a v i s t a + j a k e l u k a p a s i t e e t t i + j a k e l u k a p a s i t e e t t i a + j a k e l u k e s k u k s e e n + j a k e l u k e s k u k s i a + j a k e l u k e s k u s + j a k e l u k e t j u a + j a k e l u k e t j u i h i n + j a k e l u k e t j u i s t a + j a k e l u k e t j u j a + j a k e l u k e t j u j e n + j a k e l u k e t j u l l e + j a k e l u k e t j u n + j a k e l u k e t j u s s a + j a k e l u k e t j u t + j a k e l u k e t j u u n + j a k e l u k r i t e e r i e n + j a k e l u k u s t a n n u k s e t + j a k e l u k u s t a n n u k s i a + j a k e l u k u s t a n n u k s i n + j a k e l u l a i t t e i s i i n + j a k e l u l a i t t e i t a + j a k e l u m a k s u i l l a + j a k e l u m a l l i + j a k e l u m a l l i e n + j a k e l u m a r k k i n o i d e n + j a k e l u m e n e t e l m i ä m m e + j a k e l u m o n o p o l e j a + j a k e l u m o n o p o l i + j a k e l u m o n o p o l i t + j a k e l u m u o d o t + j a k e l u n + j a k e l u o h j e l m a + j a k e l u o h j e l m a n + j a k e l u o h j e l m a s t a + j a k e l u o h j e l m a t + j a k e l u o l o j e n + j a k e l u o n g e l m a t + j a k e l u p a i k k a + j a k e l u p a l v e l u i h i n + j a k e l u p a l v e l u n + j a k e l u p a l v e l u n s a + j a k e l u p a l v e l u s t a + j a k e l u p i i r e j ä + j a k e l u p i s t e e s s ä + j a k e l u p i s t e e s t ä + j a k e l u p i s t e i t ä + j a k e l u p o r r a s + j a k e l u p o r t a a s s a + j a k e l u p r o s e s s i + j a k e l u p u o l e l l a + j a k e l u p u o l i + j a k e l u r a k e n n e + j a k e l u r a k e n t e i d e n + j a k e l u r a k e n t e i s t a + j a k e l u r e i t t e j ä + j a k e l u r e i t t i e n + j a k e l u r y h m ä t + j a k e l u s e k t o r i + j a k e l u s e k t o r i l l a k i n + j a k e l u s e k t o r i n + j a k e l u s o p i m u k s i a + j a k e l u s o p i m u s t e n + j a k e l u s t r a t e g i a a + j a k e l u s u u n n i t e l m a n + j a k e l u t a p a a + j a k e l u t a p o j a + j a k e l u t a p o j e n + j a k e l u t a v o i s s a + j a k e l u t e i h i n + j a k e l u t e k n i i k o i t a + j a k e l u u n + j a k e l u v a l t i o n + j a k e l u v e r k k o + j a k e l u v e r k k o i h i n + j a k e l u v e r k k o j a + j a k e l u v e r k k o j e n + j a k e l u v e r k k o o n + j a k e l u v e r k o n + j a k e l u v e r k o s t o + j a k e l u v e r k o s t o i s t a + j a k e l u v e r k o s t o j e n + j a k e l u v e r k o s t o n s a + j a k e l u v e r k o s t o o n + j a k e l u v e r k o s t o t + j a k e l u v e r k o t + j a k e l u y h t i ö i l t ä + j a k e l u y h t i ö i s s ä + j a k e l u y h t i ö t + j a k e l u y l i v a l t a n s a + j a k e l u y r i t y k s e t + j a k e l u y r i t y s t e n + j a k k i l i i t i n + j a k k u t y y p p i n e n + j a k o a + j a k o a s t e i k k o a + j a k o a v a i n + j a k o b i i n i k ä k i + j a k o b i i n i l a i s v a l t i o i d e n + j a k o b i i t t i k a p i n a t + j a k o e d e l l y t y k s i s s ä + j a k o h i h n a + j a k o i + j a k o j a + j a k o j e n + j a k o j ä r j e s t e l m i i n + j a k o j ä r j e s t e l m ä + j a k o j ä r j e s t e l m ä l l ä + j a k o j ä r j e s t e l m ä n + j a k o j ä r j e s t e l m ä s s ä + j a k o j ä r j e s t e l m ä ä + j a k o j ä r j e s t e l m ä ä n + j a k o j ä r j e s t e l y j ä + j a k o k r i t e e r i i n + j a k o k u l m a + j a k o k ä y t ä n t ö ä + j a k o l a s k u n + j a k o l i n j a + j a k o l i n j a a + j a k o l i n j a n + j a k o l i n j a n a + j a k o l i n j a t + j a k o l i n j o i h i n + j a k o l i n j o i l l a + j a k o l i n j o j a + j a k o l i n j o j e n + j a k o l u o n t e e s e e n + j a k o m a h d o l l i s u u d e s t a + j a k o m a h d o l l i s u u k s i e n + j a k o m a l l i n + j a k o m a l l i s s a + j a k o m e k a n i s m i n + j a k o m e n e t e l m i e n + j a k o m e n e t e l m ä s t ä + j a k o m e n e t t e l y j e n + j a k o m e n e t t e l y j ä + j a k o m e n e t t e l y n + j a k o o n + j a k o p a i k k o i n a + j a k o p e r i a a t t e e t + j a k o p e r i a a t t e i t a + j a k o p e r u s t e + j a k o p e r u s t e e t + j a k o p e r u s t e i s i i n + j a k o p e r u s t e i t a + j a k o p o l i t i i k k a + j a k o s o p i m u s + j a k o s u o d i n + j a k o s u u n n i t e l m a + j a k o s u u n n i t e l m a a + j a k o s u u n n i t e l m a n + j a k o s u u n n i t e l m a n s a + j a k o s u u n n i t e l m a t + j a k o s u u n n i t e l m i a + j a k o s u u n n i t e l m i e n + j a k o t i s l a u s + j a k o v a r m u u t t a + j a k o v i i v a + j a k o y h t ä l ö + j a k s o i s s a + j a k s o j a + j a k s o l l a + j a k s o n + j a k s o t e t t a v a + j a k s o t t a i s e s t i + j a l a n j ä l k e ä + j a l a n j ä l k i ä + j a l a n j ä l k i ä ä n + j a l a n k u l k i j a l i i k e n n e t t ä + j a l a n k u l k i j a t u r v a l l i s u u d e n + j a l a n k u l k i j a y s t ä v ä l l i n e n + j a l a n k u l k i j a y s t ä v ä l l i s e m p i ä + j a l a n k u l k i j a y s t ä v ä l l i s e s t ä + j a l a n k u l k i j a y s t ä v ä l l i s i ä + j a l a n k u l k i j o i d e n + j a l a n k u l k i j o i l l e + j a l a n s i j a a + j a l a s s a a n + j a l a t + j a l a v a k a r h u n v a t u k k a + j a l a v a k e l t a y ö k k ö n e n + j a l k a f e t i s i s m i + j a l k a h i k i + j a l k a k l a a n i + j a l k a k ä y t ä v i ä + j a l k a n i + j a l k a n s a + j a l k a p a l l o + j a l k a p a l l o a + j a l k a p a l l o a g e n t t i e n + j a l k a p a l l o a k a t e m i o i d e n + j a l k a p a l l o a l a + j a l k a p a l l o a l a n + j a l k a p a l l o e l i n t e n + j a l k a p a l l o e r o t u o m a r i + j a l k a p a l l o e r o t u o m a r i n a + j a l k a p a l l o f a n e i l l e + j a l k a p a l l o f a n e j a + j a l k a p a l l o f a n i + j a l k a p a l l o f a n i a + j a l k a p a l l o f a n i e n + j a l k a p a l l o f a n i n + j a l k a p a l l o f a n i n a + j a l k a p a l l o f a n i t + j a l k a p a l l o h a r r a s t a j i a + j a l k a p a l l o h u l i g a a n e i l l e + j a l k a p a l l o h u l i g a a n e i s t a + j a l k a p a l l o h u l i g a a n e j a + j a l k a p a l l o h u l i g a a n i + j a l k a p a l l o h u l i g a a n i e n + j a l k a p a l l o h u l i g a a n i e n s a + j a l k a p a l l o h u l i g a a n i t + j a l k a p a l l o h u l i g a n i s m i + j a l k a p a l l o h u l i g a n i s m i n + j a l k a p a l l o h u l i g a n i s m i s t a + j a l k a p a l l o i l i j a n + j a l k a p a l l o i l i j a t + j a l k a p a l l o i l i j o i d e n + j a l k a p a l l o i l i j o i n a + j a l k a p a l l o i l i j o i s t a + j a l k a p a l l o i l u a + j a l k a p a l l o i l u m a r k k i n o i l l a + j a l k a p a l l o i l u n + j a l k a p a l l o i l u s s a + j a l k a p a l l o j o u k k u e + j a l k a p a l l o j o u k k u e e l l a + j a l k a p a l l o j o u k k u e e l l e + j a l k a p a l l o j o u k k u e e l l e n n e + j a l k a p a l l o j o u k k u e e l t a + j a l k a p a l l o j o u k k u e e m m e + j a l k a p a l l o j o u k k u e e n + j a l k a p a l l o j o u k k u e e n s a + j a l k a p a l l o j o u k k u e e s e e n + j a l k a p a l l o j o u k k u e e s s a + j a l k a p a l l o j o u k k u e i d e n + j a l k a p a l l o j o u k k u e i l t a + j a l k a p a l l o j o u k k u e i s t a + j a l k a p a l l o j o u k k u e i t a + j a l k a p a l l o j u h l a + j a l k a p a l l o j u h l a a + j a l k a p a l l o j ä r j e s t ö + j a l k a p a l l o j ä r j e s t ö i l l e + j a l k a p a l l o k a n n a t t a j i a + j a l k a p a l l o k a n n a t t a j i l l e + j a l k a p a l l o k e n t i l l e + j a l k a p a l l o k e n t i l l ä + j a l k a p a l l o k e n t t i e n + j a l k a p a l l o k e n t t i ä m m e + j a l k a p a l l o k e n t ä l l e + j a l k a p a l l o k e n t ä l l ä + j a l k a p a l l o k e n t ä l t ä + j a l k a p a l l o k e n t ä n + j a l k a p a l l o k e r h o j a m m e + j a l k a p a l l o k e r h o n + j a l k a p a l l o k i e l e s t ä + j a l k a p a l l o k i l p a i l u t + j a l k a p a l l o k i s o j e n + j a l k a p a l l o k u l t t u u r i + j a l k a p a l l o l a i n s ä ä d ä n t ö + j a l k a p a l l o l e g e n d a + j a l k a p a l l o l i i g a + j a l k a p a l l o l i i g a a + j a l k a p a l l o l i i g a k a u s i + j a l k a p a l l o l i i g a n + j a l k a p a l l o l i i g a s s a + j a l k a p a l l o l i i g o i s s a + j a l k a p a l l o l i i t o l l e + j a l k a p a l l o l i i t o n + j a l k a p a l l o l i i t o t + j a l k a p a l l o l i i t t o + j a l k a p a l l o l i i t t o a + j a l k a p a l l o l i i t t o j e n + j a l k a p a l l o m a a i l m a + j a l k a p a l l o m a a i l m a a + j a l k a p a l l o m a a i l m a a n + j a l k a p a l l o m a a j o u k k u e + j a l k a p a l l o m a a j o u k k u e e s s a + j a l k a p a l l o m a a j o u k k u e i s t a + j a l k a p a l l o m a i s s a + j a l k a p a l l o m e l l a k k a + j a l k a p a l l o m e s t a r u u s k i l p a i l u i h i n + j a l k a p a l l o m e s t a r u u t e e n + j a l k a p a l l o n + j a l k a p a l l o o n + j a l k a p a l l o p e l e j ä + j a l k a p a l l o p e l i e n + j a l k a p a l l o p e l i i n + j a l k a p a l l o p e l i n + j a l k a p a l l o p e l i s t ä + j a l k a p a l l o p e l i ä + j a l k a p a l l o p e r h e + j a l k a p a l l o p i i r e i h i n + j a l k a p a l l o r a s i s m i a + j a l k a p a l l o s e u r a + j a l k a p a l l o s e u r a a + j a l k a p a l l o s e u r a l l e + j a l k a p a l l o s e u r a n + j a l k a p a l l o s e u r a t + j a l k a p a l l o s e u r o j a + j a l k a p a l l o s e u r o j e n + j a l k a p a l l o s k a n d a a l i + j a l k a p a l l o s o t a + j a l k a p a l l o s s a + j a l k a p a l l o s t a + j a l k a p a l l o s t a d i o n + j a l k a p a l l o s t a d i o n e i l l a + j a l k a p a l l o s t a d i o n i l l a + j a l k a p a l l o s t a d i o n i l l e + j a l k a p a l l o t a p a h t u m i e n + j a l k a p a l l o t a r i n a l t a + j a l k a p a l l o t e o l l i s u u d e s s a + j a l k a p a l l o t t e l u i s s a + j a l k a p a l l o t u l o s t e n + j a l k a p a l l o t u r n a u k s e n + j a l k a p a l l o t u r n a u k s e s t a + j a l k a p a l l o t u r n a u k s e t + j a l k a p a l l o t u r n a u s + j a l k a p a l l o t ä h t i + j a l k a p a l l o t ä h t i ä + j a l k a p a l l o v a l m e n t a j a a + j a l k a p a l l o v e r t a u s t a + j a l k a p a l l o v i r a n o m a i s e t + j a l k a p a l l o v i r a n o m a i s i a + j a l k a p a l l o v i r a n o m a i s i l l e + j a l k a p a l l o v i r a n o m a i s t e n + j a l k a p a l l o v ä k i v a l t a a n + j a l k a p a l l o y h d i s t y s + j a l k a p a l l o y h t e i s ö + j a l k a p r ä s s i + j a l k a r a u d a n + j a l k a r a u d a t + j a l k a r a u d o i l l a + j a l k a r a u t a t y y p i t + j a l k a r a u t a t y y p p i ä + j a l k a r a u t o i h i n + j a l k a r a u t o j a + j a l k a r a u t o j e n + j a l k a s i e n i + j a l k a v a i m o l l e + j a l k a v a m m o i h i n + j a l k a v i a t + j a l k a v ä e n s o t i l a i t a + j a l k a v ä k e ä + j a l k a v ä k i d i v i s i o o n a + j a l k a v ä k i m a a m i i n a t + j a l k a v ä k i m i i n a a + j a l k a v ä k i m i i n a k a m p a n j a n + j a l k a v ä k i m i i n a k i e l t o a + j a l k a v ä k i m i i n a k y s y m y k s e s s ä + j a l k a v ä k i m i i n a o n g e l m a + j a l k a v ä k i m i i n a t + j a l k a v ä k i m i i n o i h i n + j a l k a v ä k i m i i n o i k s i + j a l k a v ä k i m i i n o i l l a + j a l k a v ä k i m i i n o i l l e + j a l k a v ä k i m i i n o i s t a + j a l k a v ä k i m i i n o j a + j a l k a v ä k i m i i n o j e n + j a l k a v ä k i p a t a l j o o n a a + j a l k a v ä k i p r i k a a t i + j a l k i n e a l a + j a l k i n e a l a a n + j a l k i n e a l a l l a + j a l k i n e a l a l l e + j a l k i n e a l a n + j a l k i n e i l l e + j a l k i n e k a u p p a + j a l k i n e m a r k k i n a t + j a l k i n e s e k t o r i l l a + j a l k i n e t a p a u s + j a l k i n e t a p a u s t a + j a l k i n e t e h t a a l l e + j a l k i n e t e o l l i s u u d e l l e + j a l k i n e t e o l l i s u u d e n + j a l k i n e t e o l l i s u u d e s s a + j a l k i n e t e o l l i s u u d e s t a + j a l k i n e t e o l l i s u u s + j a l k i n e t e o l l i s u u t t a + j a l k i n e t e o l l i s u u t t a a n + j a l k i n e t u l l e j a + j a l k i n e t u l l i e n + j a l k i n e t u o n n i n + j a l k i n e t u o n t i i n + j a l k i n e t u o t a n t o + j a l k i n e t u o t t a j i e n + j a l k i n e v a l m i s t a j a t + j a l k i n e v a l m i s t a j i a + j a l k i n e v a l m i s t a j i e n + j a l k i n e v i e n n i l l e + j a l k i n e y r i t y s t e n + j a l k o i h i n s a + j a l k o j e n s a + j a l o a + j a l o h a i k a r a + j a l o i h i n + j a l o i l l a a n + j a l o i l l e e n + j a l o i l l e m m e + j a l o i m m i s t a + j a l o i s s a a n + j a l o k a a s u t + j a l o k a a s u y h d i s t e + j a l o k a s t a n j a + j a l o k i v e t + j a l o k i v i e n + j a l o k i v i k a u p p a + j a l o k i v i l i i g a + j a l o k i v i r y n n ä k ö n + j a l o k o r a l l i n + j a l o m e t a l l e i h i n + j a l o m e t a l l e j a + j a l o m e t a l l i + j a l o m e t a l l i e n + j a l o m i e l i n e n + j a l o m i e l i s e m m i n + j a l o m i e l i s e m m ä n + j a l o m i e l i s e m p i + j a l o m i e l i s e m p i ä + j a l o m i e l i s e n + j a l o m i e l i s e s t i + j a l o m i e l i s i s t ä + j a l o m i e l i s y y d e s t ä n n e + j a l o m i e l i s y y t t ä + j a l o m p a a + j a l o m p a a n + j a l o n + j a l o p u u m e t s i ä + j a l o p u u m e t s ä t + j a l o p u u s t a + j a l o s t a a + j a l o s t a j i a + j a l o s t a j i e n + j a l o s t a j i l l e + j a l o s t a m i s k e t j u s s a + j a l o s t a m o i s s a m m e + j a l o s t a m o p o l t t o a i n e i l l e + j a l o s t e i d e n + j a l o s t e i s i i n + j a l o s t e i s s a + j a l o s t e t t a v a + j a l o s t e t t u j e n + j a l o s t e t u i k s i + j a l o s t e t u i l l e + j a l o s t e t u i s s a + j a l o s t e t u n + j a l o s t u k s e e n + j a l o s t u k s e n + j a l o s t u k s e s s a + j a l o s t u k s e s t a + j a l o s t u s a l a a + j a l o s t u s a l a l l a + j a l o s t u s a l a l l e + j a l o s t u s a l a n + j a l o s t u s a r v o + j a l o s t u s a r v o a + j a l o s t u s a r v o m a k s u + j a l o s t u s a r v o s t a + j a l o s t u s k a p a s i t e e t i n + j a l o s t u s k a p a s i t e e t i s t a + j a l o s t u s k a p a s i t e e t i t + j a l o s t u s k a p a s i t e e t t i + j a l o s t u s k a p a s i t e e t t i a + j a l o s t u s k a p a s i t e e t t i i n + j a l o s t u s k a p a s i t e e t t i m m e + j a l o s t u s k a r j a n + j a l o s t u s k e r t o i m e t + j a l o s t u s k e r t o i m i a + j a l o s t u s k e s k u k s e e n + j a l o s t u s k e t j u + j a l o s t u s k e t j u n + j a l o s t u s k e t j u u n + j a l o s t u s k i l p a i l u j e n + j a l o s t u s k o n e i d e n + j a l o s t u s l a i t o k s e s s a + j a l o s t u s l a i t o k s e t + j a l o s t u s l a i t o k s i a + j a l o s t u s l a i t o k s i s s a + j a l o s t u s l a i t o s + j a l o s t u s m a r k k i n o i t a + j a l o s t u s m a t e r i a a l i n + j a l o s t u s m e n e t e l m i s t ä + j a l o s t u s m e n e t t e l y + j a l o s t u s m e n e t t e l y n + j a l o s t u s m e n e t t e l y y n + j a l o s t u s m e n e t t e l y ä + j a l o s t u s n a u d a t + j a l o s t u s o h j e l m i a + j a l o s t u s o h j e l m i l l e + j a l o s t u s p a i k k a + j a l o s t u s p a i k k a a + j a l o s t u s p r o s e s s i i n + j a l o s t u s p r o s e s s i n + j a l o s t u s p r o s e s s i s s a + j a l o s t u s p u o l e l l a + j a l o s t u s r a k e n t e i t a m m e + j a l o s t u s s e k t o r i i n + j a l o s t u s s e k t o r i l l e + j a l o s t u s s e k t o r i n + j a l o s t u s t a p o i h i n + j a l o s t u s t a r k o i t u k s i i n + j a l o s t u s t e h t a i s i i n + j a l o s t u s t e o l l i s u u d e l l e + j a l o s t u s t e o l l i s u u d e l l e m m e + j a l o s t u s t e o l l i s u u d e n + j a l o s t u s t e o l l i s u u d e n k i n + j a l o s t u s t e o l l i s u u d e s s a + j a l o s t u s t e o l l i s u u d e s s a k i n + j a l o s t u s t e o l l i s u u k s i e m m e + j a l o s t u s t e o l l i s u u s + j a l o s t u s t e o l l i s u u t e e n + j a l o s t u s t e o l l i s u u t e m m e + j a l o s t u s t e o l l i s u u t t a + j a l o s t u s t o i m i n n a s s a + j a l o s t u s t o i m i n t a a + j a l o s t u s t o i m i n t a a n + j a l o s t u s t u e n + j a l o s t u s t u e t + j a l o s t u s t u k e a + j a l o s t u s t u k i + j a l o s t u s t u k i a + j a l o s t u s t u k i j ä r j e s t e l m ä + j a l o s t u s t u o t a n n o n + j a l o s t u s t u o t t e e t + j a l o s t u s t u o t t e i d e n + j a l o s t u s t u o t t e i t a + j a l o s t u s v a a t i m u k s e t + j a l o s t u s v a i h e e s e e n + j a l o s t u s v a i h e e s s a + j a l o s t u s v a i h e i d e n + j a l o s t u s v a i h e i s t a + j a l o s t u s v a l m i s t e i d e n + j a l o s t u s v a l m i u d e t + j a l o s t u s y h d i s t y k s e n + j a l o s t u s y h t i ö i h i n + j a l o s t u s y r i t y k s e l l e + j a l o s t u s y r i t y k s e t + j a l o s t u s y r i t y s + j a l o s t u s y r i t y s t e n + j a l o s u k u i s t e n + j a l o t + j a l u s s o l m u + j a l u s t a l l e + j a l u s t a l t a a n + j a l u s t i n l i h a s + j a n o k e s k u s + j a n o o n + j a o s s a + j a o s t a + j a o s t o l l e + j a o t t e l u a + j a o t t e l u n + j a p a n i a + j a p a n i i n + j a p a n i l a i s e t + j a p a n i l a i s i a + j a p a n i l a i s i l l e + j a p a n i l a i s i s t a + j a p a n i l a i s t e n + j a p a n i l l e + j a p a n i l t a + j a p a n i n + j a p a n i n a l b a t r o s s i + j a p a n i n a n g e r v o + j a p a n i n a p r i k o o s i + j a p a n i n b u l b u l i + j a p a n i n e s i k k o + j a p a n i n h a p p o m a r j a + j a p a n i n h e m l o k k i + j a p a n i n h i r v i + j a p a n i n h o r t e n s i a + j a p a n i n h u m a l a + j a p a n i n h u p p u r a s t a s + j a p a n i n h ä m y h a i k a r a + j a p a n i n i i b i s + j a p a n i n j ä t t i s a l a m a n t e r i + j a p a n i n k e l l u k k a + j a p a n i n k e l t a s i r k k u + j a p a n i n k u r p p a + j a p a n i n k y y h k y + j a p a n i n l a i k k u k ö y n n ö s + j a p a n i n l e h t i k u u s i + j a p a n i n l o k k i + j a p a n i n l u u m u + j a p a n i n m a k a k i + j a p a n i n m a k r i l l i + j a p a n i n m a r j a k u u s i + j a p a n i n m e r i + j a p a n i n m e r i m e t s o + j a p a n i n m u s t a m ä n t y + j a p a n i n n o k i r a s t a s + j a p a n i n n o k k a v a r p u n e n + j a p a n i n p a r a t i i s i m o n a r k k i + j a p a n i n p i h t a + j a p a n i n p i k k u t i k k a + j a p a n i n p u n a r a s t a s + j a p a n i n p y s t y k o r v a + j a p a n i n r i l l i + j a p a n i n r u u s u k v i t t e n i + j a p a n i n s a h a + j a p a n i n s a h a h a i + j a p a n i n s i n i s a d e + j a p a n i n t a m m i s i l k k i k e h r ä ä j ä + j a p a n i n t a t a r + j a p a n i n t e r r i e r i + j a p a n i n t i l h i + j a p a n i n t u l i l i s k o + j a p a n i n t ä h t i a n i s + j a p a n i n u l p u k k a + j a p a n i n u n i h i i r i + j a p a n i n u u n i l i n t u + j a p a n i n v a a h t e r a + j a p a n i n v a t u k k a + j a p a n i n v i h e r t i k k a + j a p a n i n v i i r i ä i n e n + j a p a n i n v ä s t ä r ä k k i + j a p a n i s s a + j a p a n i s t a + j a r r u a + j a r r u i l l a + j a r r u j e n + j a r r u j ä r j e s t e l m i i n + j a r r u j ä r j e s t e l m i ä + j a r r u j ä r j e s t e l m ä ä + j a r r u l a i t t e i t a + j a r r u n a + j a r r u n e s t e + j a r r u t + j a r r u t a m m e k i n + j a r r u t e l l a + j a r r u t e t a + j a r r u t e t a a n + j a r r u t e t t a i s i i n + j a r r u t e t t a v a + j a r r u t e t t u + j a r r u t t a a + j a r r u t t a i s i + j a r r u t t a m a a n + j a r r u t t a m a s s a + j a r r u t t a m a t t a + j a r r u t t a n e e n + j a r r u t t a n e e t + j a r r u t t a n u t + j a r r u t t a v a + j a r r u t t a v a n + j a r r u t t a v a t + j a r r u t t a v i e n + j a r r u t t e l u a + j a r r u t u k s e n + j a r r u t u s j ä r j e s t e l m ä + j a r r u t u s j ä r j e s t e l m ä l l ä + j a r r u t u s l a k o i s t a + j a r r u t u s m a t k a + j a r r u t u s m a t k a t + j a r r u t u s p o l i t i i k k a a + j a r r u t ö n k k ä n ä + j a s m i i n i r i i s i + j a s m i i n i t e e + j a s m i i n i v a l l a n k u m o u k s e e n + j a s m i i n i v a l l a n k u m o u k s e n + j a s m i i n i v a l l a n k u m o u k s e s s a + j a s m i i n i v a l l a n k u m o u s + j a s m i i n i v a l l a n k u m o u s t a + j a s p i s y ö k k ö n e n + j a t k a a + j a t k a a k o + j a t k a a k s e e n + j a t k a a k s e m m e + j a t k a a k s e n i + j a t k a e n + j a t k a e s s a a n + j a t k a e s s a m m e + j a t k a i s i + j a t k a i s i m m e + j a t k a i s i n + j a t k a i s i t t e k o + j a t k a i s i v a t + j a t k a k a a + j a t k a k a a m m e + j a t k a m a a n + j a t k a m a l l a + j a t k a m a s s a + j a t k a m a s t a + j a t k a m i s e e n + j a t k a m i s e k s i + j a t k a m i s e l l e + j a t k a m i s e s s a + j a t k a m i s e s t a + j a t k a m i s t a + j a t k a m m e + j a t k a m m e k o + j a t k a n + j a t k a n e e t + j a t k a n u t + j a t k a t t e + j a t k a t t e k o + j a t k a v a n + j a t k a v a n s a + j a t k a v a t + j a t k a v a t k i n + j a t k a v a t k o + j a t k e t a + j a t k e t a a n + j a t k e t a a n k o + j a t k e t a a n p a s + j a t k e t t a e s s a + j a t k e t t a i s i + j a t k e t t a i s i i n + j a t k e t t a v a + j a t k e t t a v i l l e + j a t k o a + j a t k o a i k a + j a t k o a i k a a + j a t k o a i k a m a h d o l l i s u u d e t + j a t k o a i k a v a a t i m u k s e m m e + j a t k o a j a n + j a t k o e h d o t u s + j a t k o h o i d o s t a + j a t k o i + j a t k o i m m e + j a t k o i t t e + j a t k o i v a t + j a t k o j a l o s t a j i e n + j a t k o j a l o s t u k s e e n + j a t k o j a l o s t u k s e s t a + j a t k o j a l o s t u s a l a a n + j a t k o j a l o s t u s t a + j a t k o j o h t o + j a t k o j ä r j e s t e l y j ä + j a t k o j ä r j e s t e l y s t ä + j a t k o j ä r j e s t e l y ä + j a t k o k a m p p a i l u u n + j a t k o k a u d e n + j a t k o k e h i t t e l y l l e + j a t k o k e h i t t e l y s s ä + j a t k o k e h i t t ä m i n e n + j a t k o k e h i t t ä m i s t ä + j a t k o k e h i t y k s e e n + j a t k o k e h i t y k s e l l e + j a t k o k e h i t y k s e n + j a t k o k e h i t y k s e s t ä + j a t k o k e h i t y s + j a t k o k e h i t y s t ä + j a t k o k e r t o m u s t a + j a t k o k e s k u s t e l u + j a t k o k e s k u s t e l u a + j a t k o k e s k u s t e l u i h i n + j a t k o k e s k u s t e l u i l l e + j a t k o k e s k u s t e l u i s s a + j a t k o k e s k u s t e l u j a + j a t k o k e s k u s t e l u j e n + j a t k o k e s k u s t e l u l l e + j a t k o k e s k u s t e l u n + j a t k o k e s k u s t e l u t + j a t k o k e s k u s t e l u u n + j a t k o k o k o u s + j a t k o k o n f e r e n s s i + j a t k o k o u l u t u k s e e n + j a t k o k o u l u t u k s e l l a + j a t k o k o u l u t u k s e l l e + j a t k o k o u l u t u k s e n + j a t k o k o u l u t u k s e n s a + j a t k o k o u l u t u k s e s s a + j a t k o k o u l u t u k s e s t a + j a t k o k o u l u t u s + j a t k o k o u l u t u s a l o i t e t t a + j a t k o k o u l u t u s j ä r j e s t e l m i e n + j a t k o k o u l u t u s j ä r j e s t e l m i i n + j a t k o k o u l u t u s j ä r j e s t e l m ä + j a t k o k o u l u t u s j ä r j e s t e l m ä t + j a t k o k o u l u t u s l a i t o k s i l t a + j a t k o k o u l u t u s m a h d o l l i s u u k s i a + j a t k o k o u l u t u s m a h d o l l i s u u k s i e n + j a t k o k o u l u t u s o h j e l m a + j a t k o k o u l u t u s o h j e l m a n + j a t k o k o u l u t u s o h j e l m i a + j a t k o k o u l u t u s o h j e l m i l l e + j a t k o k o u l u t u s p a i k a n + j a t k o k o u l u t u s r a k e n n e t t a + j a t k o k o u l u t u s t a + j a t k o k o u l u t u s t o i m e t + j a t k o k o u l u t u s t o i m i a + j a t k o k o u l u t u s t o i m i n t a a n + j a t k o k o u l u t u s t o i m i s t a + j a t k o k o u l u t u s v e r k o s t o + j a t k o k o u l u t u s v e r k o s t o n + j a t k o k u s t a n n u s t e n + j a t k o k y s y m y k s e e n i + j a t k o k y s y m y k s e n + j a t k o k y s y m y k s e n i + j a t k o k y s y m y k s e s t ä + j a t k o k y s y m y s + j a t k o k ä s i t t e l y + j a t k o k ä s i t t e l y l a i t o k s e t + j a t k o k ä s i t t e l y n + j a t k o k ä s i t t e l y s s ä + j a t k o k ä s i t t e l y y n + j a t k o k ä s i t t e l y ä + j a t k o k ä y t t ä j i l l e + j a t k o k ä y t t ö ä + j a t k o l a a j e n e m i n e n + j a t k o l a a j e n t u m i n e n + j a t k o l a a j e n t u m i s e n + j a t k o l a u s e + j a t k o l e n n o i s t a + j a t k o l e n n o l l e + j a t k o l e n n o l t a + j a t k o l e n t o + j a t k o m e n e t t e l y + j a t k o m e n e t t e l y k s i + j a t k o m e n e t t e l y s t ä + j a t k o m e n e t t e l y t a p a a + j a t k o m e n e t t e l y y n + j a t k o n e u v o j a + j a t k o n e u v o t t e l u i h i n + j a t k o n e u v o t t e l u i l l e + j a t k o n e u v o t t e l u i s s a + j a t k o n e u v o t t e l u j a + j a t k o n e u v o t t e l u j e n + j a t k o n e u v o t t e l u t + j a t k o n ä k y m i s t ä + j a t k o p ä ä t ö k s e t + j a t k o r a h o i t u s + j a t k o r a t k a i s u i s s a + j a t k o s e l v i t t e l y j ä + j a t k o s o p i m u k s i a + j a t k o s o t a + j a t k o s s a k i n + j a t k o s t a + j a t k o s u u n n i t e l m a a + j a t k o s u u n n i t e l m a n + j a t k o s u u n n i t e l m i a + j a t k o s ä ä d ö s t ä + j a t k o t o i m e n a + j a t k o t o i m e n p i t e e t + j a t k o t o i m e n p i t e i n + j a t k o t o i m e n p i t e i s i i n + j a t k o t o i m e n p i t e i s s ä + j a t k o t o i m e n p i t e i s t ä + j a t k o t o i m e n p i t e i t ä + j a t k o t o i m e t + j a t k o t o i m i + j a t k o t o i m i a + j a t k o t o i m i a a n + j a t k o t o i m i e n + j a t k o t o i m i i n + j a t k o t o i m i l l e + j a t k o t o i m i n n a n + j a t k o t o i m i s t a + j a t k o t o i m i s t a a n + j a t k o t u t k i m u k s e l l e + j a t k o t u t k i m u k s e n + j a t k o t u t k i m u k s i a + j a t k o t u t k i m u k s i i n + j a t k o t u t k i m u s + j a t k o t u t k i m u s t a + j a t k o t y ö + j a t k o t y ö l l e + j a t k o t y ö n + j a t k o t y ö s k e n t e l y + j a t k o t y ö s k e n t e l y l l e + j a t k o t y ö s k e n t e l y s s ä + j a t k o t y ö s k e n t e l y ä + j a t k o t y ö s s ä + j a t k o u r a l l a a n + j a t k o u u d i s t u k s i a + j a t k o v a l m i s t e l u l l e + j a t k o v a l m i s t e l u u n + j a t k u a + j a t k u e s s a a n + j a t k u i + j a t k u i s i + j a t k u i v a t + j a t k u m a a n + j a t k u m i s e e n + j a t k u m i s e l l e + j a t k u m i s e n + j a t k u m i s e s t a + j a t k u m i s t a + j a t k u n e e l l e + j a t k u n e e s t a + j a t k u n e i d e n + j a t k u n e i s t a + j a t k u n u t + j a t k u t t a v a + j a t k u u + j a t k u u k o + j a t k u v a a + j a t k u v a a n + j a t k u v a l l a + j a t k u v a l t a + j a t k u v a m p i e n + j a t k u v a n + j a t k u v a n a + j a t k u v a s s a + j a t k u v a s t a + j a t k u v a t + j a t k u v i a + j a t k u v i e n + j a t k u v i i n + j a t k u v i l l a + j a t k u v i n + j a t k u v i s s a + j a t k u v i s t a + j a t k u v u u d e n + j a t k u v u u d e s t a + j a t k u v u u s e h t o j e n + j a t k u v u u s h e n g e s s ä + j a t k u v u u s l e i k k a u s + j a t k u v u u s p e r i a a t t e e s t a + j a t k u v u u s v e l v o i t t e e n + j a t k u v u u s y h t ä l ö + j a t k u v u u t t a + j a t u l i n t a r h a + j a u h a v a n + j a u h e l i h a + j a u h e l i h a a + j a u h e l i h a a n + j a u h e l i h a n + j a u h e l i h a s t a + j a u h e m a a l a u s + j a u h e m e t a l l u r g i a + j a u h e m u o d o s s a + j a u h e u k o n s i e n i + j a u h o a + j a u h o a m a t s o n i + j a u h o j e n + j a u h o k o i s a + j a u h o k y n s i k ä s + j a u h o n + j a u h o n p a r a n n e + j a u h o p u n k k i + j a u h o s a v i k k a + j a u h o s i e n i + j a u h o t + j a z z f e s t i v a a l i + j a z z l a u l a j a + j a z z p i a n o + j a z z s t a n d a r d e i s t a + j a z z s t a n d a r d i + j a z z t a n s s i + j a z z y h t y e + j e e s u k s e n + j e n g i r a i s k a u k s e t + j e n i s e i + j e n i s e i l ä i s k i e l e t + j e n i v y ö h y k k e e t + j e n k k i k i n + j e s u i i t a t + j i h a d i a + j i h a d i s t i t e r r o r i s m i + j i i r i s a h a + j o d i a + j o d i e t a a n i + j o d i e t i k k a h a p p o + j o d i h a p e r o + j o d i h a p p o + j o d i h e p t a f l u o r i d i + j o d i k l o r i d i + j o e l l a + j o e n p e n k e r e e l l ä + j o e n r a n n o i l l a + j o e n r a n t a v a l t i o t + j o e n u o m a a + j o e n u o m a s s a + j o e s t a + j o g u r t t i j u o m a t + j o g u r t t i t u o t t e i t a + j o h a n n e k s e n l e i p ä p u u + j o h a n n e k s e n l e i p ä ä + j o h a n n e k s e n l e i v ä l l e + j o h a n n e k s e n l e i v ä n + j o h a n n e k s e n l e i v ä s t ä + j o h a n n e k s e n l e i v ä t + j o h d a k a a n + j o h d a n n a i s d i r e k t i i v e i h i n + j o h d a n n a i s d i r e k t i i v i + j o h d a n n a i s d i r e k t i i v i e n + j o h d a n n a i s d i r e k t i i v i n + j o h d a n n a i s d i r e k t i i v i s s ä + j o h d a n n a i s d i r e k t i i v i ä + j o h d a n n a i s i a + j o h d a n n a i s i l l a + j o h d a n n a i s i l l e + j o h d a n n a i s i n a + j o h d a n n a i s i n s t r u m e n t e i s t a + j o h d a n n a i s i n s t r u m e n t i t + j o h d a n n a i s i n s t r u m e n t t e j a + j o h d a n n a i s i n s t r u m e n t t i e n + j o h d a n n a i s i s t a + j o h d a n n a i s k a u p o i s s a + j o h d a n n a i s k y s y m y k s e s s ä + j o h d a n n a i s m a r k k i n a t + j o h d a n n a i s m a r k k i n o i d e n + j o h d a n n a i s m a r k k i n o i l l a + j o h d a n n a i s m a r k k i n o i t a + j o h d a n n a i s p ö r s s i s s ä + j o h d a n n a i s s o p i m u k s i a + j o h d a n n a i s s o p i m u k s i i n + j o h d a n n a i s s o p i m u k s i l l a + j o h d a n n a i s s o p i m u s t e n + j o h d a n n a i s t e n + j o h d a n n a i s t u o t t e i d e n + j o h d a n n a i s t u o t t e i s t a + j o h d a n n a i s v ä l i n e i d e n + j o h d a n n a i s v ä l i n e i s i i n + j o h d a n n o n + j o h d a n n o s s a + j o h d a n n o s s a a n + j o h d a n n o s s a n i + j o h d a n t o h u o m a u t u k s e e n n e + j o h d a n t o k a p p a l e e s e e n + j o h d a n t o k a p p a l e e t + j o h d a n t o k e r t o m u s + j o h d a n t o k e s k u s t e l u s s a + j o h d a n t o l a u s u m i s t a + j o h d a n t o p u h e e n i + j o h d a n t o p u h e e n v u o r o + j o h d a n t o p u h e e n v u o r o n i + j o h d a n t o p u h e e n v u o r o o n + j o h d a n t o p u h e e n v u o r o o n n e + j o h d a n t o p u h e e n v u o r o s s a + j o h d a n t o p u h e e n v u o r o s s a a n + j o h d a n t o p u h e e n v u o r o s s a n i + j o h d a n t o p u h e e n v u o r o s s a n n e + j o h d a n t o p u h e e n v u o r o s t a n i + j o h d a n t o p u h e e s s a a n + j o h d a n t o p u h e t t a n n e + j o h d a n t o s a n a t + j o h d a n t o s a n o i s s a a n + j o h d a n t o t e k s t i s s ä + j o h d a n t o v i r k e + j o h d a n t o v i r k k e e s e e n + j o h d a n t o v i r k k e e s s ä + j o h d a t e t t a v a + j o h d a t t e + j o h d e t t a v a + j o h d e t t u a + j o h d e t t u j e n + j o h d e t t u u n + j o h d e t u k s i + j o h d e t u n + j o h d e t u s s a + j o h d e t u t + j o h d o l l a n i + j o h d o l l a n n e + j o h d o n + j o h d o n m u k a i n e n + j o h d o n m u k a i s e e n + j o h d o n m u k a i s e l l a + j o h d o n m u k a i s e l l e + j o h d o n m u k a i s e l t a + j o h d o n m u k a i s e m m a k s i + j o h d o n m u k a i s e m m a l l a + j o h d o n m u k a i s e m m a n + j o h d o n m u k a i s e m m a s s a + j o h d o n m u k a i s e m m a s t a + j o h d o n m u k a i s e m m a t + j o h d o n m u k a i s e m m i k s i + j o h d o n m u k a i s e m m i l l a + j o h d o n m u k a i s e m m i n + j o h d o n m u k a i s e m p a a + j o h d o n m u k a i s e m p a a n + j o h d o n m u k a i s e m p a n a + j o h d o n m u k a i s e m p i + j o h d o n m u k a i s e m p i a + j o h d o n m u k a i s e m p i i n + j o h d o n m u k a i s e n + j o h d o n m u k a i s e n a + j o h d o n m u k a i s e s s a + j o h d o n m u k a i s e s t a + j o h d o n m u k a i s e s t i + j o h d o n m u k a i s e t + j o h d o n m u k a i s i a + j o h d o n m u k a i s i m m i s t a + j o h d o n m u k a i s t a a + j o h d o n m u k a i s t a m a a n + j o h d o n m u k a i s t a m i s e k s i + j o h d o n m u k a i s t a m i s e s s a + j o h d o n m u k a i s t a m i s p o l i t i i k k a + j o h d o n m u k a i s t e n + j o h d o n m u k a i s u u d e l l a + j o h d o n m u k a i s u u d e n + j o h d o n m u k a i s u u d e s t a + j o h d o n m u k a i s u u s + j o h d o n m u k a i s u u s k y s y m y k s i i n + j o h d o n m u k a i s u u s m e k a n i s m e j a + j o h d o n m u k a i s u u s o n g e l m a + j o h d o n m u k a i s u u s o n g e l m i e n + j o h d o n m u k a i s u u s p e r i a a t e t t a + j o h d o n m u k a i s u u s p e r i a a t t e e l l a + j o h d o n m u k a i s u u s p e r i a a t t e i d e n + j o h d o n m u k a i s u u s s y i s t ä + j o h d o n m u k a i s u u s v a a t i m u s + j o h d o n m u k a i s u u s v a a t i m u s t e n + j o h d o n m u k a i s u u t e e n + j o h d o n m u k a i s u u t t a + j o h d o n m u k a i s u u t t a a n + j o h d o n m u k a i s u u t t a k i n + j o h d o s s a + j o h d o t t o m a t + j o h t a a + j o h t a a k o + j o h t a e s s a + j o h t a e s s a a n + j o h t a e s s a m m e + j o h t a e s s a n i + j o h t a i s i + j o h t a i s i t t e + j o h t a i s i v a t + j o h t a j a a + j o h t a j a a n + j o h t a j a e h d o k a s + j o h t a j a k a k s i k o n + j o h t a j a k s i + j o h t a j a k y v y t + j o h t a j a l l e + j o h t a j a m m e + j o h t a j a n + j o h t a j a n a + j o h t a j a n r o o l i + j o h t a j a n v a i h d o s t a + j o h t a j a p a i k o i s t a + j o h t a j a p o l v e n + j o h t a j a t + j o h t a j a t a s o i s t a + j o h t a j a t a s o n + j o h t a j a v a l t i o + j o h t a j i a + j o h t a j i a a n + j o h t a j i e m m e + j o h t a j i e n + j o h t a j i e n k i n + j o h t a j i k s i + j o h t a j i l l e + j o h t a j i l l e n n e + j o h t a j i l t a + j o h t a j i s t a + j o h t a j u u d e s t a + j o h t a j u u s a s e m a + j o h t a j u u s k r i i s i n + j o h t a j u u s k r i i s i s t ä + j o h t a j u u s t y h j i ö + j o h t a j u u s v a j e + j o h t a j u u t e e n + j o h t a j u u t t a + j o h t a j u u t t a m m e + j o h t a m a + j o h t a m a a + j o h t a m a a n + j o h t a m a a n n e + j o h t a m a a n s a + j o h t a m a l l a + j o h t a m a n + j o h t a m a n a + j o h t a m a n i + j o h t a m a n n e + j o h t a m a n s a + j o h t a m a s s a + j o h t a m a s s a n i + j o h t a m a s t a n i + j o h t a m a t + j o h t a m a t t a + j o h t a m i n a + j o h t a m i s e e n + j o h t a m i s e s s a + j o h t a m i s e s t a + j o h t a m i s j ä r j e s t e l m i e n + j o h t a m i s j ä r j e s t e l m ä l l ä + j o h t a m i s j ä r j e s t e l y i s t ä + j o h t a m i s k o u l u t u s o h j e l m a n + j o h t a m i s k u l t t u u r i + j o h t a m i s k u l t t u u r i k s i + j o h t a m i s k y k y + j o h t a m i s k y k y y n + j o h t a m i s k y k y ä + j o h t a m i s k y k y ä ä n + j o h t a m i s k y v y i s t ä + j o h t a m i s k ä y t ä n t ö j e n s ä + j o h t a m i s m e n e t t e l y j e n + j o h t a m i s o h j e l m a + j o h t a m i s o n g e l m i a + j o h t a m i s o t t e e s e e n + j o h t a m i s p o t e n t i a a l i i n + j o h t a m i s p r o s e s s e j a + j o h t a m i s p ä ä t ö k s i ä + j o h t a m i s r a k e n t e e s e e n + j o h t a m i s r a k e n t e i s s a + j o h t a m i s s o d a n k ä y n t i + j o h t a m i s s t r a t e g i a + j o h t a m i s s t r a t e g i a s t a m m e + j o h t a m i s t a + j o h t a m i s t a i d o n + j o h t a m i s t a i d o t + j o h t a m i s t a i t o a + j o h t a m i s t a i t o j a + j o h t a m i s t a i t o j e m m e + j o h t a m i s t a i t o j e n + j o h t a m i s t a p a a + j o h t a m i s t a p a a n + j o h t a m i s t a p o j e n + j o h t a m i s t o i m e n p i t e e n ä + j o h t a m i s t y y l i + j o h t a m i s t y y l i i n + j o h t a m i s t y y l i i n s ä + j o h t a m i s v a s t u u + j o h t a m i s v a s t u u s t a + j o h t a n e e n + j o h t a n e e t + j o h t a n e i s t a + j o h t a n u t + j o h t a v a a n + j o h t a v a k s i + j o h t a v a l l a + j o h t a v a m p i + j o h t a v a n + j o h t a v a s s a + j o h t a v a t + j o h t a v i a + j o h t a v i e n + j o h t a v i i n + j o h t a v i l l e + j o h t a v i l t a + j o h t a v i s s a + j o h t e i s i i n + j o h t i + j o h t i v a t + j o h t o a + j o h t o a a n + j o h t o a i h e e n + j o h t o a j a t u k s e l l e + j o h t o a j a t u k s e n + j o h t o a j a t u k s e n a + j o h t o a j a t u s + j o h t o a j a t u s t a + j o h t o a s e m a + j o h t o a s e m a a + j o h t o a s e m a a m m e + j o h t o a s e m a a n + j o h t o a s e m a a n s a + j o h t o a s e m a l l e + j o h t o a s e m a m m e + j o h t o a s e m a n + j o h t o a s e m a n s a + j o h t o a s e m a s s a + j o h t o a s e m a s t a + j o h t o a s e m a s t a a n + j o h t o a s e m a s t a n n e + j o h t o a s e m a t + j o h t o a s e m i e n + j o h t o a s e m i i n + j o h t o a s e m i s s a + j o h t o a s e m i s t a + j o h t o e l i i t t i ä + j o h t o e l i m e l l e + j o h t o e l i m e t + j o h t o e l i m i i n + j o h t o e l i m i l l e + j o h t o e l i m i s s ä + j o h t o e l i n + j o h t o e l i n t e n + j o h t o h a h m o + j o h t o h a h m o a + j o h t o h a h m o i l l e + j o h t o h a h m o i s t a + j o h t o h a h m o j a + j o h t o h a h m o j e n + j o h t o h a h m o t + j o h t o h e n k i l ö i d e n + j o h t o h e n k i l ö i s t ä + j o h t o h e n k i l ö i t ä + j o h t o h e n k i l ö l l e + j o h t o h e n k i l ö s t ö + j o h t o h e n k i l ö s t ö n + j o h t o h e n k i l ö s t ö ö n + j o h t o h e n k i l ö t + j o h t o k o k e m u k s e n + j o h t o k o m i t e a + j o h t o k o m i t e a n + j o h t o k o m i t e a s s a + j o h t o k u n n a l l a + j o h t o k u n n a l l e + j o h t o k u n n a n + j o h t o k u n n a s s a + j o h t o k u n n a s t a + j o h t o k u n n a t + j o h t o k u n n i s s a + j o h t o k u n t a + j o h t o k u n t a a + j o h t o k u n t a a n + j o h t o k u n t a n n e + j o h t o k u n t a p a i k a n + j o h t o k u n t a p a i k k a n s a + j o h t o k u n t i a + j o h t o k u n t i e n + j o h t o k u n t i i n + j o h t o l a n k a + j o h t o n e u v o s t o + j o h t o p a i k k a a + j o h t o p a i k k o j e n + j o h t o p a i k o i l l a + j o h t o p a i k o i s t a + j o h t o p e r i a a t e + j o h t o p ä ä t e l m i s t ä + j o h t o p ä ä t e l m i ä + j o h t o p ä ä t ö k s e e n + j o h t o p ä ä t ö k s e m m e + j o h t o p ä ä t ö k s e n + j o h t o p ä ä t ö k s e n n e + j o h t o p ä ä t ö k s e n s ä + j o h t o p ä ä t ö k s e s t ä + j o h t o p ä ä t ö k s e t + j o h t o p ä ä t ö k s i e n + j o h t o p ä ä t ö k s i e n n e + j o h t o p ä ä t ö k s i i n + j o h t o p ä ä t ö k s i s s ä + j o h t o p ä ä t ö k s i s t ä + j o h t o p ä ä t ö k s i s t ä ä n + j o h t o p ä ä t ö k s i ä + j o h t o p ä ä t ö s + j o h t o p ä ä t ö s t e n + j o h t o p ä ä t ö s t ä + j o h t o r a k e n n e + j o h t o r a k e n t e e n + j o h t o r a k e n t e e t + j o h t o r a k e n t e i d e n + j o h t o r a k e n t e i s t a + j o h t o r a k e n t e i t a + j o h t o r o o l i + j o h t o r o o l i n + j o h t o r y h m i e n + j o h t o r y h m ä + j o h t o r y h m ä n + j o h t o r y h m ä s s ä + j o h t o r y h m ä s t ä + j o h t o r y h m ä ä + j o h t o r y h m ä ä n i + j o h t o s o l u k k o + j o h t o s ä v e l + j o h t o s ä ä n t ö n ä + j o h t o t a s o l l a + j o h t o t a s o n + j o h t o t e h t ä v i e n + j o h t o t e h t ä v i i n + j o h t o t e h t ä v i s s ä + j o h t o t e h t ä v i s t ä + j o h t o t e h t ä v i ä + j o h t o t e h t ä v ä + j o h t o t e h t ä v ä m m e + j o h t o t e h t ä v ä ä + j o h t o t e h t ä v ä ä n + j o h t o t e h t ä v ä ä n s ä + j o h t o t ä h t e n ä + j o h t o t ä h t i + j o h t o v a i k u t u s + j o h t o v a s t u u + j o h t o v i r k o j a + j o h t o v y y h t i i n + j o h t u a + j o h t u i + j o h t u i p a + j o h t u i v a t + j o h t u n e e t + j o h t u n e i d e n + j o h t u n u t + j o h t u u + j o h t u u k i n + j o h t u u k o + j o h t u v a + j o h t u v a n + j o h t u v a t + j o h t u v a t k o + j o h t u v i a + j o h t u v i e n + j o h t u v i l t a + j o h t u v i s t a + j o i d e n + j o i h i n + j o i k u a r a + j o i l l a + j o i l l e + j o i l t a + j o i n a + j o i s s a + j o i s t a + j o i t a + j o k a i n e n h a n + j o k a i s e e n + j o k a i s e l l a + j o k a i s e l l a h a n + j o k a i s e l l e + j o k a i s e l t a + j o k a i s e n + j o k a i s e s s a + j o k a i s e s t a + j o k a i s t a + j o k a m i e h e n o i k e u d e t + j o k a m i e h e n o i k e u s + j o k a p ä i v ä i s e e n + j o k a p ä i v ä i s e l l ä + j o k a p ä i v ä i s e n + j o k a p ä i v ä i s e n ä + j o k a p ä i v ä i s e s s ä + j o k a p ä i v ä i s e s t ä + j o k a p ä i v ä i s e t + j o k a p ä i v ä i s i i n + j o k a p ä i v ä i s i k s i + j o k a p ä i v ä i s i s t ä + j o k a p ä i v ä i s i ä + j o k a p ä i v ä i s t e n + j o k a p ä i v ä i s t ä + j o k a v u o t i s e e n + j o k a v u o t i s e n + j o k a v u o t i s e s t a + j o k a v u o t i s e t + j o k a v u o t i s i a + j o k e e n + j o k e r i m e r k k i + j o k i a + j o k i a l u e e l l a + j o k i a l u e e t + j o k i a l u e i d e n + j o k i a l u e i l l a + j o k i a l u e i s i i n + j o k i a l u e i t a + j o k i a l u e t t a + j o k i a m a t s o n i + j o k i b u l b u l i + j o k i d i r e k t i i v i + j o k i e l i ö s t ö n + j o k i e n + j o k i h a n k e + j o k i h e l m i s i m p u k k a + j o k i h y y p p ä + j o k i i m m e + j o k i i n + j o k i j ä r j e s t e l m i ä + j o k i k a i j a n e n + j o k i k e r t t u l i + j o k i k o h t a i s e s t i + j o k i k o m i s s i o i d e n + j o k i k o m i s s i o i t a + j o k i k o m i t e a + j o k i k u l j e t u k s i a + j o k i k y t t ä + j o k i k ä ä r m e k o t k a + j o k i l a a k s o j e n + j o k i l a i v o j e n + j o k i l e p p ä l i n t u + j o k i l i i k e n n e + j o k i l i i k e n n e t t ä + j o k i l i i k e n t e e n + j o k i l i i k e n t e e s e e n + j o k i l u i k e r o + j o k i m o n n i t + j o k i m o o t t o r i t e i s t ä + j o k i n a p s u + j o k i p a j u + j o k i p ä ä s k y t + j o k i r a j a + j o k i r a s t a a t + j o k i r e i t t i e n + j o k i s a t a m i a + j o k i s a t a m i e n + j o k i s a t a m i s s a + j o k i s e u d u i l l a + j o k i s o k e u s + j o k i s u i s t o i l l e + j o k i s u i s t o t + j o k i t i i r a + j o k i t i m a l i + j o k i v a l k o t a m m i + j o k i v e d e n + j o k i v e r k o n + j o k i v e s i s t ö m m e + j o k i v e s i ä + j o k i y h t e i s t y ö s o p i m u s + j o l l a i s e n + j o l l a i s e t + j o l l a i s i a + j o l l a i s t a + j o l l e + j o l t a + j o n k i n a s t e i s e e n + j o n k i n a s t e i s e n + j o n k i n a s t e i s e s s a + j o n k i n a s t e i s e s t a + j o n k i n a s t e i s i a + j o n k i n a s t e i s i s s a + j o n k i n a s t e i s t a + j o n k i n l a i s e e n + j o n k i n l a i s e k s i + j o n k i n l a i s e l l a + j o n k i n l a i s e l l e + j o n k i n l a i s e n + j o n k i n l a i s e n a + j o n k i n l a i s e s s a + j o n k i n l a i s e s t a + j o n k i n l a i s e t + j o n k i n l a i s i a + j o n k i n l a i s i i n + j o n k i n l a i s i l l e + j o n k i n l a i s i n + j o n k i n l a i s i s t a + j o n k i n l a i s t a + j o n k i n l a i s t e n + j o n k i n n ä k ö i s e e n + j o n o i h i n + j o n o j a + j o n o n + j o n o o n + j o n o t + j o n o t e t t u a a n + j o n o t t a a + j o n o t t a e s s a a n + j o n o t t a m a a n + j o n o t t a v a t + j o n o t u s a i k o j a + j o n o t u s a i k o j a a n + j o n o t u s a j a t + j o n o t u s l i s t a + j o n o t u s l i s t a a + j o n o t u s l i s t a l l a + j o n o t u s l i s t a l l e + j o n o t u s l i s t a t + j o n o t u s l i s t a t a r i n a + j o n o t u s l i s t o i h i n + j o n o t u s l i s t o i l l a + j o n o t u s l i s t o i l l e + j o n o t u s l i s t o i s t a + j o n o t u s l i s t o j e n + j o n o t u s l u e t t e l o i t a + j o r u b a t + j o s k u s h a n + j o s s a + j o s s i t t e l e m a t t a + j o s s i t t e l u a + j o s s i t t e l u j a + j o u d u i m m e + j o u d u i n + j o u d u m m e + j o u d u n + j o u d u t e t t a i s i i n + j o u d u t e t t a v a + j o u d u t t a a + j o u d u t t a a k s e e n + j o u d u t t a m i s e k s i + j o u d u t t a n u t + j o u d u t t a v a n + j o u d u t t u + j o u d u t t u a a n + j o u h e v a a + j o u h e v a a n + j o u h i h a p s u k o l i b r i + j o u h i h i e t a k y y h k y + j o u h i s a r a + j o u h i s o m p a s a m m a l + j o u h i s o r s a + j o u k k o a + j o u k k o a r m a h d u k s e t + j o u k k o e l ä i n r ä ä k k ä y k s e n + j o u k k o e p i d e m i o i d e n + j o u k k o e v a k u o i n n i t + j o u k k o h a l l u s i n a a t i o + j o u k k o h a u d a k s i + j o u k k o h a u d a n + j o u k k o h a u d a s t a + j o u k k o h a u d a t + j o u k k o h a u d o i l l e + j o u k k o h a u d o i s s a + j o u k k o h a u d o i s t a + j o u k k o h a u t a + j o u k k o h a u t a a + j o u k k o h a u t a u s m a i d e n + j o u k k o h a u t a u s t e n + j o u k k o h a u t o i h i n + j o u k k o h a u t o i n e e n + j o u k k o h a u t o j a + j o u k k o h a u t o j e n + j o u k k o h y l k ä ä m i s t ä + j o u k k o h y s t e r i a a + j o u k k o h y s t e r i a n + j o u k k o h y s t e r i a s t a + j o u k k o h ä ä d ö t + j o u k k o h ä ä t ö j ä + j o u k k o i h i n + j o u k k o i n a + j o u k k o i n v a a s i o i h i n + j o u k k o i r t i s a n o m i n e n + j o u k k o i r t i s a n o m i s e n + j o u k k o i r t i s a n o m i s e t + j o u k k o i r t i s a n o m i s i a + j o u k k o i r t i s a n o m i s i i n + j o u k k o i r t i s a n o m i s i l l a + j o u k k o i r t i s a n o m i s i l l e + j o u k k o i r t i s a n o m i s i s s a + j o u k k o i r t i s a n o m i s i s t a + j o u k k o i r t i s a n o m i s t a + j o u k k o i r t i s a n o m i s t e n + j o u k k o i t s e m u r h a + j o u k k o i t s e m u r h a l t a + j o u k k o j a + j o u k k o j a a n + j o u k k o j a m m e + j o u k k o j a n s a + j o u k k o j e m m e + j o u k k o j e n + j o u k k o j e n k u l j e t u s v e n e + j o u k k o j e n s a + j o u k k o k a n n e + j o u k k o k a n n e j ä r j e s t e l m ä + j o u k k o k a n n e t t a + j o u k k o k a n t e e n + j o u k k o k a n t e e s t a + j o u k k o k a n t e i l l a + j o u k k o k a n t e i s t a + j o u k k o k a n t e i t a + j o u k k o k a p i n a n + j o u k k o k a r k o t u k s e e n + j o u k k o k a r k o t u k s e l t a + j o u k k o k a r k o t u k s e s t a + j o u k k o k a r k o t u k s e t + j o u k k o k a r k o t u k s i a + j o u k k o k a r k o t u k s i l l a + j o u k k o k a r k o t u k s i l l e + j o u k k o k a r k o t u k s i n a + j o u k k o k a r k o t u k s i s t a + j o u k k o k a r k o t u s + j o u k k o k a r k o t u s m ä ä r ä y s t ä + j o u k k o k a r k o t u s p o l i t i i k k a a + j o u k k o k a r k o t u s t a + j o u k k o k a r k o t u s t e n + j o u k k o k a t o a m i s e t + j o u k k o k o k o o n t u m i s e s s a + j o u k k o k o k o u s + j o u k k o k u l j e t u k s e t + j o u k k o k u l j e t u k s i a + j o u k k o k u o l e m a n + j o u k k o k ö y h y y d e n + j o u k k o l a i l l i s t a m i n e n + j o u k k o l a i l l i s t a m i s e n + j o u k k o l a i l l i s t a m i s e t + j o u k k o l a i l l i s t a m i s i a + j o u k k o l a i l l i s t a m i s p o l i t i i k a n + j o u k k o l a i l l i s t a m i s p r o s e s s e j a + j o u k k o l a i l l i s t a m i s t a + j o u k k o l a i l l i s t a m i s t e n + j o u k k o l a i n a m a r k k i n a t + j o u k k o l a i n a m a r k k i n o i d e n + j o u k k o l a i n a m a r k k i n o i t a + j o u k k o l i i k e n n e + j o u k k o l i i k e n n e m u o t o j a + j o u k k o l i i k e n n e t t ä + j o u k k o l i i k e n n e v e r k k o a + j o u k k o l i i k e n n e v e r k o s t o i s t a + j o u k k o l i i k e n n e v ä l i n e i d e n + j o u k k o l i i k e n n e v ä l i n e i s s ä + j o u k k o l i i k e n n e v ä l i n e i t ä + j o u k k o l i i k e n t e e l l ä + j o u k k o l i i k e n t e e n + j o u k k o l i i k e n t e e s e e n + j o u k k o l i i k e n t e e s t ä + j o u k k o l i i k e t t ä + j o u k k o l i i k k e e n + j o u k k o l i i k k e e s e e n + j o u k k o l i i k k e i t ä + j o u k k o l ä h t ö ä + j o u k k o l ä ä k i t y k s e s t ä + j o u k k o m a a h a n m u u t o l l e + j o u k k o m a a h a n m u u t o n + j o u k k o m a a h a n m u u t o s t a + j o u k k o m a a h a n m u u t t o + j o u k k o m a a h a n m u u t t o a + j o u k k o m a a h a n m u u t t o o n + j o u k k o m a a s t a p o i s t a m i n e n + j o u k k o m a r k k i n o i n n i s t a + j o u k k o m a r k k i n o i n t i + j o u k k o m e l l a k o i n t i a + j o u k k o m i e l e n o s o i t u k s e t + j o u k k o m i e l e n o s o i t u k s i a + j o u k k o m i e l e n o s o i t u k s i i n + j o u k k o m i e l e n o s o i t u k s i s s a + j o u k k o m i e l e n o s o i t u s t e n + j o u k k o m u r h a + j o u k k o m u r h a a + j o u k k o m u r h a a j a + j o u k k o m u r h a a j a s t a + j o u k k o m u r h a a j a t + j o u k k o m u r h a a j i e n + j o u k k o m u r h a a n + j o u k k o m u r h a n + j o u k k o m u r h a s s a + j o u k k o m u r h a s t a + j o u k k o m u r h a t + j o u k k o m u r h i a + j o u k k o m u r h i e n + j o u k k o m u r h i i n + j o u k k o m u r h i s s a + j o u k k o m u r h i s t a + j o u k k o m u u t o s t a + j o u k k o m u u t o t + j o u k k o m u u t t o + j o u k k o m u u t t o a + j o u k k o m u u t t o i h i n + j o u k k o m u u t t o o n + j o u k k o n e u r o o s i + j o u k k o n s a + j o u k k o n ä l ä n h ä t ä + j o u k k o o m m e + j o u k k o p a k o + j o u k k o p a k o i l m i ö i h i n + j o u k k o p a k o o n + j o u k k o p a k o t i l a n n e + j o u k k o p a k o t i l a n t e i s s a + j o u k k o p a l a u t t a m i n e n + j o u k k o p a l u u + j o u k k o p a o n + j o u k k o p e t o k s e e n + j o u k k o p i d ä t y k s e t + j o u k k o p i d ä t y k s i i n + j o u k k o p i d ä t y k s i s t ä + j o u k k o p i d ä t y k s i ä + j o u k k o p i d ä t y s t e n + j o u k k o p i d ä t y s t ä + j o u k k o p r o t e s t i i n + j o u k k o p s y k o l o g i a + j o u k k o p s y k o o s i a + j o u k k o p s y k o p a t o l o g i a a + j o u k k o r a i s k a t t i i n + j o u k k o r a i s k a u k s e n + j o u k k o r a i s k a u k s e t + j o u k k o r a i s k a u k s i a + j o u k k o r a i s k a u k s i i n + j o u k k o r a i s k a u k s i s t a + j o u k k o r a i s k a u s + j o u k k o r a i s k a u s t a p a u s + j o u k k o r a i s k a u s t e n + j o u k k o r a n g a i s t u k s e l t a + j o u k k o r a n g a i s t u k s e n + j o u k k o r a n g a i s t u k s e s t a + j o u k k o r a n g a i s t u k s e t + j o u k k o r a n g a i s t u k s i a + j o u k k o r a n g a i s t u k s i s t a + j o u k k o r a n k a i s u + j o u k k o r a n k a i s u a + j o u k k o r i k k o m u k s i a + j o u k k o r i k k o m u k s i s t a + j o u k k o r i k o k s e e n + j o u k k o r i k o s t a + j o u k k o r i t u a a l i t e u r a s t u s + j o u k k o r o k o t u k s i i n + j o u k k o r o k o t u s o h j e l m a + j o u k k o r o k o t u s t e n + j o u k k o r o v i o i t a + j o u k k o s i i r t o l a i s u u d e l l e + j o u k k o s i i r t o l a i s u u s + j o u k k o s i i r t o l a i s u u t e e n + j o u k k o s i i r t o l a i s u u t t a + j o u k k o s o d a n k ä y n n i l l ä + j o u k k o s u k u p u u t t o + j o u k k o s u r m a s u u n n i t e l m a + j o u k k o t a p a h t u m a t + j o u k k o t a p a h t u m i e n + j o u k k o t a r k a s t u k s i a + j o u k k o t a r k a s t u s o h j e l m i e n + j o u k k o t a v o i t t e e n + j o u k k o t a v o i t t e e s e e n + j o u k k o t a v o i t t e i t a + j o u k k o t e l o i t u k s e t + j o u k k o t e l o i t u k s i a + j o u k k o t e l o i t u k s i s s a + j o u k k o t e l o i t u k s i s t a + j o u k k o t e l o i t u s + j o u k k o t e r r o r i + j o u k k o t e r r o r i a + j o u k k o t e u r a s t u k s e e n + j o u k k o t e u r a s t u k s e l t a + j o u k k o t e u r a s t u k s e n + j o u k k o t e u r a s t u k s e t + j o u k k o t e u r a s t u k s i a + j o u k k o t e u r a s t u k s i s t a + j o u k k o t e u r a s t u s + j o u k k o t e u r a s t u s t a + j o u k k o t i e d o n v ä l i t y k s e e n + j o u k k o t i e d o t u k s e n + j o u k k o t i e d o t u s + j o u k k o t i e d o t u s v ä l i n e + j o u k k o t i e d o t u s v ä l i n e e n + j o u k k o t i e d o t u s v ä l i n e e t + j o u k k o t i e d o t u s v ä l i n e i d e n + j o u k k o t i e d o t u s v ä l i n e i l l e + j o u k k o t i e d o t u s v ä l i n e i l l ä + j o u k k o t i e d o t u s v ä l i n e i l t ä + j o u k k o t i e d o t u s v ä l i n e i s i i n + j o u k k o t i e d o t u s v ä l i n e i s s ä + j o u k k o t i e d o t u s v ä l i n e i s t ä + j o u k k o t i e d o t u s v ä l i n e i t ä + j o u k k o t i e d o t u s v ä l i n e m a r k k i n o i d e n + j o u k k o t i e d o t u s v ä l i n e o h j e l m i l t a + j o u k k o t u h o + j o u k k o t u h o a + j o u k k o t u h o a m i n e n + j o u k k o t u h o a s e + j o u k k o t u h o a s e e n + j o u k k o t u h o a s e e n s a + j o u k k o t u h o a s e e t + j o u k k o t u h o a s e e t o n + j o u k k o t u h o a s e i d e n + j o u k k o t u h o a s e i d e n s a + j o u k k o t u h o a s e i k s i + j o u k k o t u h o a s e i l l a + j o u k k o t u h o a s e i l l a a n + j o u k k o t u h o a s e i s i i n + j o u k k o t u h o a s e i s t a + j o u k k o t u h o a s e i s t a a n + j o u k k o t u h o a s e i t a + j o u k k o t u h o a s e k y s y m y k s e s s ä + j o u k k o t u h o a s e o h j e l m a n + j o u k k o t u h o a s e o h j e l m i e n + j o u k k o t u h o a s e t t a + j o u k k o t u h o n + j o u k k o t u h o n n a k s i + j o u k k o t u h o n t a a + j o u k k o t u h o n t a n ä l ä n h ä t ä + j o u k k o t u h o n t a r i k o k s i s t a + j o u k k o t u h o s t a + j o u k k o t u h o v ä l i n e i d e n + j o u k k o t u o t a n t o a + j o u k k o t u r i s m i n + j o u k k o t y ö t t ö m y y d e n + j o u k k o t y ö t t ö m y y d e s t ä + j o u k k o t y ö t t ö m y y s + j o u k k o t y ö t t ö m y y s o n g e l m a + j o u k k o t y ö t t ö m y y s t i l a n t e e s s a + j o u k k o t y ö t t ö m y y t e e n + j o u k k o t y ö t t ö m y y t t ä + j o u k k o v a a t e i s i i n + j o u k k o v a a t e i s t a + j o u k k o v a a t e i t a + j o u k k o v a i n o + j o u k k o v a i n o a + j o u k k o v a l v o n n a n + j o u k k o v a l v o n t a + j o u k k o v a n g i t s e m i s i l l a + j o u k k o v a n g i t s e m i s t e n + j o u k k o v a r a s t o i n t i + j o u k k o v a s t a r i n t a a + j o u k k o v a s t u s t u k s e s t a + j o u k k o v e l k a k i r j a h u u t o k a u p p a + j o u k k o v e l k a k i r j a l a i n a n + j o u k k o v e l k a k i r j a l a i n a t + j o u k k o v e l k a k i r j a l a i n o i h i n + j o u k k o v e l k a k i r j a l a i n o i s t a + j o u k k o v e l k a k i r j a l a i n o j a + j o u k k o v e l k a k i r j a l a i n o j e n + j o u k k o v e l k a k i r j a m a r k k i n a a + j o u k k o v e l k a k i r j a m a r k k i n a t + j o u k k o v e l k a k i r j a m a r k k i n o i d e n + j o u k k o v e l k a k i r j a m a r k k i n o i l l a + j o u k k o v e l k a k i r j a m a r k k i n o i l l e + j o u k k o v e l k a k i r j a m a r k k i n o i s t a + j o u k k o v e l k a k i r j a m a r k k i n o i t a + j o u k k o v e l k a k i r j a t + j o u k k o v e l k a k i r j o i h i n + j o u k k o v e l k a k i r j o i l l e + j o u k k o v e l k a k i r j o j a + j o u k k o v e l k a k i r j o j e n + j o u k k o v e t o o m u k s i a + j o u k k o v i e s t i m e t + j o u k k o v i e s t i m i i n + j o u k k o v i e s t i m i l l e + j o u k k o v i e s t i m i l l e e n + j o u k k o v i e s t i m i s s ä + j o u k k o v i e s t i m i ä + j o u k k o v i e s t i n t e n + j o u k k o v i e s t i n t ä + j o u k k o v i e s t i n t ä k a n a v i s s a + j o u k k o v i e s t i n t ä o b s e r v a t o r i o + j o u k k o v i e s t i n t ä v ä l i n e + j o u k k o v i e s t i n t ä v ä l i n e e t + j o u k k o v i e s t i n t ä ä + j o u k k o v o i m a a + j o u k k o v ä h e n t ä m i s e s t ä + j o u k k o v ä h e n t ä m i s e t + j o u k k o v ä h e n t ä m i s i ä + j o u k k o v ä h e n t ä m i s t e n + j o u k k o v ä h e n t ä m i s t ä + j o u k k o v ä k i v a l t a a + j o u k k o v ä k i v a l t a i s u u k s i a + j o u k k o v ä k i v a l t a i s u u k s i s t a + j o u k k u e e l l a n n e + j o u k k u e e l l e + j o u k k u e e n + j o u k k u e e s s a n n e + j o u k k u e h e n g e n + j o u k k u e h e n g e s t ä + j o u k k u e h e n k e e n + j o u k k u e h e n k e ä + j o u k k u e i l l e + j o u k k u e i s s a + j o u k k u e i t a + j o u k k u e i t a a n + j o u k k u e j u o k s u + j o u k k u e m e s t a r u u s k i l p a i l u t + j o u k k u e p e l a a j a + j o u k k u e p e l a a j a n a + j o u k k u e p e l a a j i a + j o u k k u e p e l i + j o u k k u e p e l i ä + j o u k k u e t y ö s k e n t e l y ä + j o u k k u e u r h e i l u s s a + j o u k o i l l a + j o u k o i l t a a n + j o u k o i s s a + j o u k o i s t a + j o u k o l l a + j o u k o n + j o u k o s s a a n + j o u k o s s a m m e + j o u k o t + j o u l u a + j o u l u a a t t o + j o u l u a a t t o a + j o u l u a a t t o n a + j o u l u a i k a a n + j o u l u a r m a h d u s t a + j o u l u b o n u k s i a + j o u l u h a l k o + j o u l u h u r r i k a a n i + j o u l u i l l a l l i n e n + j o u l u i s e n + j o u l u i s i n + j o u l u j u h l a s t a + j o u l u j u h l a t k i n + j o u l u j u h l i s t a a n + j o u l u j u m a l a n p a l v e l u k s e n + j o u l u k a l e n t e r i + j o u l u k a p i n a + j o u l u k e r t o m u s + j o u l u k i n k k u + j o u l u k o r i s t e + j o u l u k o r t t e j a + j o u l u k o r t t i + j o u l u k o r t t i e n + j o u l u k s i + j o u l u k u k k a + j o u l u k u u + j o u l u k u u h u n + j o u l u k u u n + j o u l u k u u s e e n + j o u l u k u u s e n + j o u l u k u u s e n s a + j o u l u k u u s i + j o u l u k u u s i a + j o u l u k u u s i k a u p p i a a t + j o u l u k u u s i k s i + j o u l u k u u s i v a i k u t e l m a a n + j o u l u k u u s i v i r u s + j o u l u k u u s s a + j o u l u k u u s t a + j o u l u k u u t a + j o u l u k u v a e l m a + j o u l u l a h j a + j o u l u l a h j a a + j o u l u l a h j a k s i + j o u l u l a h j a n + j o u l u l a h j a n a + j o u l u l a h j a r a h o i n a + j o u l u l a h j a s t a + j o u l u l a h j a t + j o u l u l a h j o i k s i + j o u l u l a h j o j a + j o u l u l a h j o j a k a a n + j o u l u l a h j o j e n + j o u l u l a u l u + j o u l u l a u l u i s t a + j o u l u l o m a a + j o u l u l o m a l l a + j o u l u l o m a l l e + j o u l u l o m a n + j o u l u l o m i a + j o u l u m a r k k i n a t + j o u l u m a r k k i n o i h i n + j o u l u m a r k k i n o i t a + j o u l u m i e l e e n n e + j o u l u m u s i i k k i + j o u l u n + j o u l u n a + j o u l u n a i k a a n + j o u l u n a j a n + j o u l u n a l u s a i k a a n + j o u l u o r a t o r i o + j o u l u p a t a + j o u l u p u k i k s i + j o u l u p u k i l l e + j o u l u p u k i l t a + j o u l u p u k i n + j o u l u p u k k i + j o u l u p u k k i a + j o u l u p u k k i i n + j o u l u p u k k i p o l i t i i k a n + j o u l u p u k k i p o l i t i i k k a a + j o u l u p u u + j o u l u p u u n + j o u l u p ä i v ä n + j o u l u p ä i v ä n ä + j o u l u r a h o i h i n + j o u l u r a u h a + j o u l u s a a r e n + j o u l u s a a r e n f r e g a t t i l i n t u + j o u l u s a a r e n p ö l l ö + j o u l u s a a r e n s u u l a + j o u l u s a a r i + j o u l u s e i k k a i l u + j o u l u s e i m i + j o u l u s e i m i a s e t e l m a s t a + j o u l u s e s o n k i + j o u l u s o p i m u k s e n + j o u l u s t a + j o u l u s t a m m e + j o u l u t a r i n a + j o u l u t a u k o + j o u l u t a u k o a + j o u l u t a u o n + j o u l u t o i v o m u s + j o u l u t o r i + j o u l u y ö + j o u l u y ö n ä + j o u r n a l i s m i p a l k i n t o + j o u r n a l i s m i p a l k i n t o o n + j o u r n a l i s t i e n + j o u r n a l i s t i i k a n + j o u r n a l i s t i l i i t t o + j o u r n a l i s t i y h d i s t y k s e l l e + j o u r n a l i s t i y h d i s t y k s e n + j o u s i k v a r t e t t i + j o u s i k v a r t e t t o + j o u s i m i e h e n + j o u s i o r k e s t e r i + j o u s i s e k s t e t t o + j o u s i s o i t i n + j o u s t a a + j o u s t a m a a n + j o u s t a m a l l a + j o u s t a m a t t a + j o u s t a m a t t o m a k s i + j o u s t a m a t t o m a m m a k s i + j o u s t a m a t t o m a m m a n + j o u s t a m a t t o m a m p i + j o u s t a m a t t o m a m p i a + j o u s t a m a t t o m a n + j o u s t a m a t t o m a t + j o u s t a m a t t o m i a + j o u s t a m a t t o m i s t a + j o u s t a m a t t o m u u d e s t a + j o u s t a m a t t o m u u t t a + j o u s t a m i n e n + j o u s t a m i s k y k y + j o u s t a v a a + j o u s t a v a a n + j o u s t a v a k s i + j o u s t a v a l l a + j o u s t a v a m m a k s i + j o u s t a v a m m a l l a + j o u s t a v a m m a l l e + j o u s t a v a m m a l t a + j o u s t a v a m m a n + j o u s t a v a m m a s t a + j o u s t a v a m m a t + j o u s t a v a m m i k s i + j o u s t a v a m m i l l a + j o u s t a v a m m i n + j o u s t a v a m m i s t a + j o u s t a v a m p a a + j o u s t a v a m p a a n + j o u s t a v a m p a n a + j o u s t a v a m p i + j o u s t a v a m p i a + j o u s t a v a m p i e n + j o u s t a v a m p i i n + j o u s t a v a n + j o u s t a v a n a + j o u s t a v a s s a + j o u s t a v a t + j o u s t a v i a + j o u s t a v i e n + j o u s t a v i i n + j o u s t a v i l l a + j o u s t a v i m m a t + j o u s t a v i m m i s t a + j o u s t a v i m p i a + j o u s t a v i n + j o u s t a v i n a + j o u s t a v i s s a + j o u s t a v i s t a + j o u s t a v o i t e t a + j o u s t a v o i t e t a a n + j o u s t a v o i t e t t a v a + j o u s t a v o i t e t t i i n + j o u s t a v o i t t a a + j o u s t a v o i t t a m a a n + j o u s t a v o i t t a m a l l a + j o u s t a v o i t t a m i n e n + j o u s t a v o i t t a m i s e e n + j o u s t a v o i t t a m i s e k s i + j o u s t a v o i t t a m i s e l l a + j o u s t a v o i t t a m i s e n + j o u s t a v o i t t a m i s t a + j o u s t a v u u d e k s i + j o u s t a v u u d e l l a + j o u s t a v u u d e n + j o u s t a v u u d e n t a r v e t t a + j o u s t a v u u d e s s a + j o u s t a v u u d e s t a + j o u s t a v u u s a j a t t e l u a + j o u s t a v u u s a j a t u k s e e n + j o u s t a v u u s a r v i o i n n i n + j o u s t a v u u s a s i a n + j o u s t a v u u s e l e m e n t i t + j o u s t a v u u s j ä r j e s t e l m ä n + j o u s t a v u u s k l a u s u u l i + j o u s t a v u u s k r i t e e r e i t ä + j o u s t a v u u s k r i t e e r i e n + j o u s t a v u u s k y s y m y k s e e n + j o u s t a v u u s l a u s e k e + j o u s t a v u u s l a u s e k e t t a + j o u s t a v u u s l a u s e k k e e n + j o u s t a v u u s l a u s e k k e e t + j o u s t a v u u s l a u s e k k e i s i i n + j o u s t a v u u s l a u s e k k e i t a + j o u s t a v u u s m a k s u n s a + j o u s t a v u u s m e k a n i s m e i l l a + j o u s t a v u u s m e k a n i s m e j a + j o u s t a v u u s m e n e t e l m i e n + j o u s t a v u u s p e r i a a t e + j o u s t a v u u s p e r i a a t e t t a + j o u s t a v u u s p e r i a a t t e e n + j o u s t a v u u s p i l a r i i n + j o u s t a v u u s r a j a a n + j o u s t a v u u s s e i k k o i h i n + j o u s t a v u u s s ä ä n n ö k s e t + j o u s t a v u u s s ä ä n n ö s t e n + j o u s t a v u u s t a s o m m e + j o u s t a v u u s t a s o n + j o u s t a v u u s t a v o i t t e i t a + j o u s t a v u u s t e k i j ä t + j o u s t a v u u s t e k i j ä ä + j o u s t a v u u s t e k i j ö i t ä + j o u s t a v u u s t o i m i a + j o u s t a v u u s v a a t i m u k s e t + j o u s t a v u u s v a a t i m u s + j o u s t a v u u s v a a t i m u s t e n + j o u s t a v u u s v a r a + j o u s t a v u u s v ä l i n e e n + j o u s t a v u u s v ä l i n e i t ä + j o u s t a v u u s v ä l i n e t t ä + j o u s t a v u u t e e n + j o u s t a v u u t t a + j o u s t a v u u t t a a n + j o u s t e t a a n + j o u s t e t t a v a + j o u s t o a + j o u s t o a j a t u k s e n + j o u s t o i h i n + j o u s t o i n s t r u m e n t i l l a + j o u s t o i n s t r u m e n t i n + j o u s t o i n s t r u m e n t t i + j o u s t o i n s t r u m e n t t i a + j o u s t o i s t a + j o u s t o j a + j o u s t o j e n + j o u s t o j ä r j e s t e l m ä + j o u s t o j ä r j e s t e l m ä n + j o u s t o j ä r j e s t e l m ä ä + j o u s t o k a t t o + j o u s t o l a u s e k e + j o u s t o l a u s e k e t t a + j o u s t o l a u s e k k e e n + j o u s t o l a u s e k k e e t + j o u s t o l a u s e k k e i t a + j o u s t o m a h d o l l i s u u d e n + j o u s t o m a h d o l l i s u u k s i a + j o u s t o m a h d o l l i s u u s + j o u s t o m a l l i a + j o u s t o m a r g i n a a l i + j o u s t o m a r g i n a a l i a + j o u s t o m a r g i n a a l i i n + j o u s t o m a r g i n a a l i n + j o u s t o m e k a n i s m e i l l e + j o u s t o m e k a n i s m e i s t a + j o u s t o m e k a n i s m e j a + j o u s t o m e k a n i s m i + j o u s t o m e k a n i s m i a + j o u s t o m e k a n i s m i e n + j o u s t o m e k a n i s m i i n + j o u s t o m e k a n i s m i l l a + j o u s t o m e k a n i s m i n + j o u s t o m e k a n i s m i t + j o u s t o m e n e t e l m ä n + j o u s t o m e n e t t e l y y n + j o u s t o n + j o u s t o n v a r a a + j o u s t o p e r i a a t e t t a + j o u s t o p i i k k i ä e s + j o u s t o r a h a s t o a + j o u s t o r a h a s t o n + j o u s t o r a h a s t o s t a + j o u s t o t + j o u s t o t a s o + j o u s t o t e k i j ö i t ä + j o u s t o t o i m e n p i d e + j o u s t o t o i m e n p i d e t t ä + j o u s t o t o i m e n p i t e e l l ä + j o u s t o t o i m e n p i t e e t + j o u s t o t o i m e n p i t e i d e n + j o u s t o t o i m i a + j o u s t o t u r v a a + j o u s t o t u r v a e h d o t u k s i l l e + j o u s t o t u r v a j ä r j e s t e l m ä + j o u s t o t u r v a k y s y m y k s e s t ä + j o u s t o t u r v a k ä s i t t e e n + j o u s t o t u r v a m a l l i + j o u s t o t u r v a m a l l i a + j o u s t o t u r v a m a l l i n + j o u s t o t u r v a m a l l i s t a + j o u s t o t u r v a p e r i a a t e t t a + j o u s t o t u r v a p e r i a a t t e e n + j o u s t o t u r v a p e r i a a t t e i d e n + j o u s t o t u r v a p e r i a a t t e i t a + j o u s t o t u r v a p o l i t i i k a s t a + j o u s t o t u r v a p o l i t i i k k a + j o u s t o t u r v a s t a + j o u s t o t u r v a s t r a t e g i o i t a + j o u s t o t u r v a s t r a t e g i s t a + j o u s t o t u r v a t a v o i t t e i t a + j o u s t o t y ö n + j o u s t o v a a t i m u k s e e n + j o u s t o v a a t i m u s + j o u s t o v a r a + j o u s t o v a r a a + j o u s t o v a r a n + j o u s t o v a r a s t a + j o u s t o v a r a u k s e n + j o u s t o v a r a u k s e s s a + j o u s t o v a r a u k s e s t a + j o u s t o v a r a u s t a + j o u s t o v ä l i n e + j o u s t o v ä l i n e e k s i + j o u s t o v ä l i n e e l l ä + j o u s t o v ä l i n e e n + j o u s t o v ä l i n e e s e e m m e + j o u s t o v ä l i n e e s e e n + j o u s t o v ä l i n e e s s ä + j o u s t o v ä l i n e e s t ä + j o u s t o v ä l i n e i d e n + j o u s t o v ä l i n e i s i i n + j o u s t o v ä l i n e i t ä + j o u s t o v ä l i n e t t ä + j o u t a v a n p ä i v ä i n e n + j o u t a v i a + j o u t i l a i n a + j o u t o k ä y n n i n + j o u t o m a a + j o u t o m a a k s i + j o u t s e n h a n h i + j o u t s e n l a m p i + j o u t s e n l a u l u + j o u t s e n l a u l u l t a + j o u t s e n l a u l u n + j o u t s e n l a u l u n i + j o u t s e n l a u l u n n e + j o u t s e n m e r k k i + j o u t s e n m e r k k i i n + j o u t s e n p r i n s e s s a + j o u t u a + j o u t u e s s a + j o u t u e s s a a n + j o u t u e s s a m m e + j o u t u i + j o u t u i s i + j o u t u i s i m m e + j o u t u i s i v a t + j o u t u i v a t + j o u t u k o + j o u t u m a s s a + j o u t u m a s t a + j o u t u m a t t a + j o u t u n e e n + j o u t u n e e n s a + j o u t u n e e t + j o u t u n e i d e n + j o u t u n e i l l e + j o u t u n e i t a + j o u t u n u t + j o u t u u + j o u t u v a n s a + j o u t u v a t + j o u t u v a t k i n + j o u t u v i e n + j u d o t e k n i i k a t + j u g u r t e i s s a + j u h a n n u s t u r i l a s + j u h l a h e t k e l l ä + j u h l a h e t k i + j u h l a i l t a a + j u h l a i s t u n n o l l a + j u h l a i s t u n n o n + j u h l a i s t u n n o s s a + j u h l a i s t u n t o + j u h l a i s t u n t o a + j u h l a i s t u n t o i h i n + j u h l a i s t u n t o m m e + j u h l a i s t u n t o o n + j u h l a i s t u n t o o n n e + j u h l a j u o m i s e e n + j u h l a k a u s i + j u h l a k a u t e n a + j u h l a k o k o u k s e e n + j u h l a k u l k u e i s i i n + j u h l a l l i s e m p i + j u h l a l l i s e n + j u h l a l l i s i a + j u h l a l l i s u u d e s s a + j u h l a l l i s u u k s i e n + j u h l a l l i s u u k s i i n + j u h l a m i e l e e n n e + j u h l a m i e l e n + j u h l a n + j u h l a p u h e e t + j u h l a p u h e i d e n + j u h l a p u h e i s s a + j u h l a p u h e i s s a a n + j u h l a p u h e i s s a h a n + j u h l a p u h e i s t a + j u h l a p u h e i t a + j u h l a p u h e t t a a n + j u h l a p u h u j a t + j u h l a p y h i e n + j u h l a p y h i i n s ä + j u h l a p y h ä ä + j u h l a p ä i v i e n + j u h l a p ä i v i n ä + j u h l a p ä i v i n ä k i n + j u h l a p ä i v i ä + j u h l a p ä i v ä + j u h l a p ä i v ä k s i + j u h l a p ä i v ä n + j u h l a p ä i v ä n ä + j u h l a p ä i v ä t + j u h l a p ä i v ä ä + j u h l a r a h a + j u h l a r i t u a a l i + j u h l a s e r e m o n i o i t a + j u h l a s o l m i o k o l i b r i + j u h l a t a p a h t u m a + j u h l a t a p a h t u m i e n + j u h l a t i l a i s u u k s i a + j u h l a t i l a i s u u k s i s s a + j u h l a t u n n e l m a a n + j u h l a t u u l e l l a + j u h l a v u o d e n + j u h l a v u o s i + j u h l a v u o t t a + j u h l a ä ä n e s t y k s e l l e + j u h l i a + j u h l i i + j u h l i k a a m m e + j u h l i m a a n + j u h l i m m e + j u h l i n e i d e n + j u h l i s t a a + j u h l i s t a a k s e e n + j u h l i s t a e s s a m m e + j u h l i s t a m a a n + j u h l i s t a m i s e k s i + j u h l i s t e t t a v a + j u h l i t a a n + j u h l i t t a e s s a + j u l i s t a a + j u l i s t a e n + j u l i s t a e s s a a n + j u l i s t a k a a m m e + j u l i s t a n + j u l i s t a n e e t + j u l i s t a n u t + j u l i s t a u t u a + j u l i s t a u t u i + j u l i s t a u t u m i s e n s a + j u l i s t a u t u v a n + j u l i s t a v a n s a + j u l i s t e i s i i n + j u l i s t e i t a + j u l i s t e k a m p a n j a + j u l i s t e k a m p a n j a a + j u l i s t e k a m p a n j a n + j u l i s t e k a m p a n j o i h i n + j u l i s t e t a a n + j u l i s t e t t a i s i i n + j u l i s t e t t a v a + j u l i s t e t t i i n + j u l i s t i + j u l i s t u k s e e n + j u l i s t u k s e l l a + j u l i s t u k s e n + j u l i s t u k s e s s a + j u l i s t u k s e s t a + j u l i s t u k s i a + j u l i s t u k s i i n + j u l i s t u k s i l l a + j u l i s t u k s i l l e + j u l i s t u k s i s s a + j u l i s t u k s i s t a + j u l i s t u s e h d o t u s + j u l i s t u s h a n + j u l i s t u s l u o n n o k s e n + j u l i s t u s l u o n n o s + j u l i s t u s t a + j u l i s t u s t e n + j u l k a i s e e + j u l k a i s e m a + j u l k a i s e m a t + j u l k a i s e m a t t a + j u l k a i s e m i s e n + j u l k a i s e m i s s ä ä n n ö t + j u l k a i s e m m e + j u l k a i s e v a t + j u l k a i s i + j u l k a i s i m m e + j u l k a i s s e e s s a + j u l k a i s s u t + j u l k a i s t a + j u l k a i s t a a n + j u l k a i s t a i s i i n + j u l k a i s t a v a + j u l k a i s t a v i e n + j u l k a i s t i i n + j u l k a i s t u i s t a + j u l k a i s t u j a + j u l k a i s t u j e n + j u l k a i s t u s s a + j u l k a i s u a i k o i h i n + j u l k a i s u a l a a + j u l k a i s u a r k i s t o + j u l k a i s u i h i n + j u l k a i s u i s s a + j u l k a i s u i s t a + j u l k a i s u j e n + j u l k a i s u j ä r j e s t e l y t + j u l k a i s u k i e l l o n + j u l k a i s u k u s t a n n u k s i a + j u l k a i s u k y s y m y k s e e n + j u l k a i s u l u p a a + j u l k a i s u m a k s u u n + j u l k a i s u m e n e t e l m i l l e + j u l k a i s u m e n e t e l m i ä + j u l k a i s u m e n e t e l m ä t + j u l k a i s u m e n e t t e l y j e n + j u l k a i s u m u o t o j a + j u l k a i s u o h j e l m a + j u l k a i s u p a l v e l u i t a + j u l k a i s u p ä i v ä m ä ä r ä n + j u l k a i s u s a r j a s s a + j u l k a i s u s ä ä n t ö j e n + j u l k a i s u t + j u l k a i s u t e k n i i k k a + j u l k a i s u t o i m i n t a + j u l k a i s u t o i m i s t o + j u l k a i s u t o i m i s t o o n + j u l k a i s u v a a t i m u k s e t + j u l k a i s u v a a t i m u k s i a + j u l k a i s u v a a t i m u k s i i n + j u l k a i s u v a a t i m u s t e n + j u l k a i s u v e l v o i t t e e t + j u l k a i s u v e l v o i t t e i t a + j u l k a i s u y k s i k k ö j ä + j u l k e a a + j u l k e a l t a + j u l k e a m p i + j u l k e s i + j u l k i l a u s u m a a + j u l k i l a u s u m a e h d o t u k s e n + j u l k i l a u s u m a e h d o t u k s i a + j u l k i l a u s u m a l i i t e + j u l k i l a u s u m a l l a + j u l k i l a u s u m a l u o n n o k s e n + j u l k i l a u s u m a l u o n n o k s e s s a + j u l k i l a u s u m a l u o n n o s + j u l k i l a u s u m a n + j u l k i l a u s u m a s s a + j u l k i l a u s u m a s s a a n + j u l k i l a u s u m a s t a + j u l k i l a u s u m a s t a n n e + j u l k i l a u s u m a t + j u l k i l a u s u m a t e k s t i n + j u l k i l a u s u m i a + j u l k i l a u s u m i e n + j u l k i l a u s u m i i m m e + j u l k i l a u s u m i i n + j u l k i l a u s u m i l l a + j u l k i l a u s u m i s s a + j u l k i l a u s u m i s s a a n + j u l k i l a u s u m i s t a + j u l k i s a s i a m i e h e l l e + j u l k i s a s i a m i e h e n + j u l k i s a s i a m i e h e n ä + j u l k i s a s i a m i e h e t + j u l k i s a s i a m i e s + j u l k i s a s i a m i e s t ä + j u l k i s e e n + j u l k i s e l l a + j u l k i s e l l a k i n + j u l k i s e l l e + j u l k i s e l t a + j u l k i s e m m a k s i + j u l k i s e m m i n + j u l k i s e m p i + j u l k i s e n + j u l k i s e n a + j u l k i s e s s a + j u l k i s e s s a k a a n + j u l k i s e s t a + j u l k i s e s t i k a a n + j u l k i s e s t i k i n + j u l k i s e t + j u l k i s h a l l i n n o i l l a + j u l k i s h a l l i n n o i l l e + j u l k i s h a l l i n n o i s s a + j u l k i s h a l l i n n o l l a + j u l k i s h a l l i n n o l l e + j u l k i s h a l l i n n o l l e m m e + j u l k i s h a l l i n n o l l i s i a + j u l k i s h a l l i n n o l l i s i s t a + j u l k i s h a l l i n n o n + j u l k i s h a l l i n n o s s a + j u l k i s h a l l i n n o s t a + j u l k i s h a l l i n n o t + j u l k i s h a l l i n t o + j u l k i s h a l l i n t o a + j u l k i s h a l l i n t o a a n + j u l k i s h a l l i n t o i h i n + j u l k i s h a l l i n t o j e n + j u l k i s h a l l i n t o m i n i s t e r i + j u l k i s h a l l i n t o m m e + j u l k i s h a l l i n t o n s a + j u l k i s h a l l i n t o o n + j u l k i s h y ö d y k k e e t + j u l k i s h y ö d y k k e i d e n + j u l k i s h y ö d y k k e i s i i n + j u l k i s h y ö d y k k e i t ä + j u l k i s h y ö d y k k e i t ä ä n + j u l k i s i a + j u l k i s i i n + j u l k i s i k s i + j u l k i s i l l a + j u l k i s i l l e + j u l k i s i l t a + j u l k i s i n + j u l k i s i s s a + j u l k i s i s t a + j u l k i s i v u k s i + j u l k i s i v u n + j u l k i s o i k e u d e l l i n e n + j u l k i s o i k e u d e l l i s e n + j u l k i s o i k e u d e l l i s e s t a + j u l k i s o i k e u d e l l i s e s t i + j u l k i s o i k e u d e l l i s i a + j u l k i s o i k e u d e l l i s i l t a + j u l k i s o i k e u d e l l i s t a + j u l k i s o i k e u d e n + j u l k i s o i k e u k s i i n + j u l k i s o i k e u s + j u l k i s o i k e u t e e n + j u l k i s o i k e u t t a + j u l k i s o m i s t e i s i a + j u l k i s p a l v e l u j e n + j u l k i s p a l v e l u t + j u l k i s p o l i t i i k a n + j u l k i s r a h o i t u k s e l l a + j u l k i s s e k t o r e i l l a + j u l k i s s e k t o r i i n + j u l k i s s e k t o r i l l a + j u l k i s s e k t o r i n + j u l k i s t a a + j u l k i s t a l o u d e l l i s e l t a + j u l k i s t a l o u d e n + j u l k i s t a l o u d e s s a + j u l k i s t a l o u d e s t a + j u l k i s t a l o u d e t + j u l k i s t a l o u k s i a + j u l k i s t a l o u k s i e n + j u l k i s t a l o u k s i e n s a + j u l k i s t a l o u k s i i n + j u l k i s t a l o u s + j u l k i s t a l o u t e e n + j u l k i s t a l o u t e m m e + j u l k i s t a l o u t e n s a + j u l k i s t a l o u t t a + j u l k i s t a l o u t t a a n + j u l k i s t a m a a n + j u l k i s t a m a t t a + j u l k i s t a m a t t o m a n a + j u l k i s t a m i s a l o i t t e i t a + j u l k i s t a m i s m e n e t t e l y i s t ä + j u l k i s t a m i s s ä ä n n ö t + j u l k i s t a m i s t a + j u l k i s t a m i s v a a t i m u k s i a + j u l k i s t a m i s v e l v o i t t e e l l e + j u l k i s t a m i s v e l v o i t t e e n + j u l k i s t a m i s v e l v o l l i s u u d e s t a + j u l k i s t a m i s v e l v o l l i s u u k s i e n + j u l k i s t a v a n + j u l k i s t e n + j u l k i s u u d e l l e + j u l k i s u u d e l t a + j u l k i s u u d e n + j u l k i s u u d e s s a + j u l k i s u u d e s t a + j u l k i s u u s a r v o l t a a n + j u l k i s u u s k a m p a n j a a n + j u l k i s u u s k a m p a n j a l l a + j u l k i s u u s k a m p a n j a n + j u l k i s u u s k a m p a n j o i h i n + j u l k i s u u s k a m p a n j o i l l a + j u l k i s u u s k a m p a n j o i s s a + j u l k i s u u s k a m p a n j o i t a + j u l k i s u u s k e s k u s t e l u u n + j u l k i s u u s k i k k a + j u l k i s u u s k u v a + j u l k i s u u s k u v a a + j u l k i s u u s k u v a a m m e + j u l k i s u u s k u v a l l e m m e + j u l k i s u u s k u v a n s a + j u l k i s u u s n ä k ö k o h d a t + j u l k i s u u s p e l i + j u l k i s u u s p e r i a a t e + j u l k i s u u s p e r i a a t e t t a + j u l k i s u u s p e r i a a t t e e n + j u l k i s u u s p e r i a a t t e e s s a + j u l k i s u u s p e r i a a t t e e s t a + j u l k i s u u s p o n n i s t e l u j a m m e + j u l k i s u u s s ä ä n n ö t + j u l k i s u u s s ä ä n t ö + j u l k i s u u s t a p a h t u m i a + j u l k i s u u s t e m p p u i h i n + j u l k i s u u s t e m p p u j a + j u l k i s u u s t e m p u k s i + j u l k i s u u s t e m p u n + j u l k i s u u s t o i m e t + j u l k i s u u s t y ö h ö n + j u l k i s u u s t y ö n + j u l k i s u u s t y ö s t ä + j u l k i s u u s t y ö t ä + j u l k i s u u t e e n + j u l k i s u u t t a + j u l k i s v i r a n o m a i s e n + j u l k i s v i r a n o m a i s e n a + j u l k i s v i r a n o m a i s e t + j u l k i s v i r a n o m a i s i a + j u l k i s v i r a n o m a i s i l l e + j u l k i s v i r a n o m a i s i n a + j u l k i s v i r a n o m a i s t e n + j u l k i s y h t e i s ö + j u l k i s y h t e i s ö j e n + j u l k i s y h t e i s ö j ä + j u l k i s y r i t y s t e n + j u l m a a + j u l m a a n + j u l m a l l a + j u l m a l l e + j u l m a l t a + j u l m a n + j u l m a n a + j u l m a s t a + j u l m e m p a a + j u l m e m p i a + j u l m i a + j u l m i e n + j u l m i i n + j u l m i m m a n + j u l m i m m a t + j u l m i m m i l l e + j u l m i m m i s s a + j u l m i m m i s t a + j u l m i m p a n a + j u l m i m p i a + j u l m i m p i e n + j u l m i n + j u l m i s t a + j u l m u u d e s t a + j u l m u u d e t + j u l m u u k s i a + j u l m u u k s i e n + j u l m u u k s i i n + j u l m u u k s i l l e + j u l m u u k s i l t a + j u l m u u k s i n a + j u l m u u k s i s s a + j u l m u u k s i s t a + j u m a l a a n + j u m a l a a p e l k ä ä v ä t + j u m a l a g e e n i + j u m a l a i s e l l a + j u m a l a l l e + j u m a l a n k u v a + j u m a l a n p a l v e l u k s e s s a + j u m a l a n p a l v e l u k s i a + j u m a l a n p a l v e l u k s i i n + j u m a l a n p a l v e l u s + j u m a l a n p a l v e l u s n a u h o i t e t t a + j u m a l a n p a l v e l u s p a i k k o j a + j u m a l a n p a l v e l u s t e n + j u m a l a n p i l k a n + j u m a l a n p i l k a s t a + j u m a l a n p i l k k a l a e i s s a + j u m a l a n p i l k k a l a e i s t a + j u m a l a n p i l k k a l a i n + j u m a l a n p i l k k a l a i n s ä ä d ä n n ö s s ä + j u m a l a n p i l k k a l a i n s ä ä d ä n t ö + j u m a l a n p i l k k a l a i n s ä ä d ä n t ö ä + j u m a l a n p i l k k a l a i s t a + j u m a l a n p i l k k a l a i t + j u m a l a n p i l k k a l a k e j a + j u m a l a n p i l k k a l a k i + j u m a l a n p i l k k a l a k i a + j u m a l a n p i l k k a l a k i e n + j u m a l a n p i l k k a l a k i i n + j u m a l a n p i l k k a l a k i n a + j u m a l a n p i l k k a p ä i v ä + j u m a l a n p i l k k a s y y t t e e n + j u m a l a n p i l k k a s y y t ö k s e n + j u m a l a n p i l k k a s y y t ö s t e n + j u m a l a t t o m a a n + j u m a l h a r h a + j u m a l i s t a + j u m a l o l e n n o i l l e + j u m a l u u s k o m p l e k s i + j u m b o j e t i l l ä + j u m b o j e t i n + j u m b o j e t i s t ä + j u m b o j e t t e j ä + j u m b o j e t t i + j u m b o j e t t i e n + j u m b o j e t t i ä + j u m i u d u m m e + j u m i u t e t a a n + j u m i u t u a + j u m i u t u n e e t + j u m i u t u u + j u m p p a p a l l o + j u n a a n + j u n a h e n k i l ö k u n n a n + j u n a h e n k i l ö k u n t a + j u n a h e n k i l ö k u n t a a + j u n a h e n k i l ö k u n t a a n + j u n a h y ö k k ä y k s e s t ä + j u n a h y ö k k ä y s + j u n a h y ö k k ä y s t ä + j u n a i s k u s t a + j u n a i s k u u n + j u n a k o h t a u s + j u n a k u l j e t u s t e n + j u n a l a k o s t a + j u n a l a u t t a + j u n a l i i k e n n e + j u n a l i i k e n n e t t ä + j u n a l i i k e n t e e n + j u n a l i i k e n t e e s s ä + j u n a l i i k e n t e e s t ä + j u n a l i p p u + j u n a l i p p u a + j u n a l i p p u j a m m e + j u n a l i p u n + j u n a l i p u t + j u n a l l a + j u n a m a t k a + j u n a m a t k a i l u s t a + j u n a m a t k a l l a + j u n a m a t k o i l l a + j u n a m a t k o i s t a + j u n a m a t k u s t a j a t + j u n a m a t k u s t a j i a + j u n a m a t k u s t a j i e n + j u n a m a t k u s t a j i i n + j u n a m a t k u s t a j i l l e + j u n a m a t k u s t a j i n a k i n + j u n a m a t k u s t a j i s t a + j u n a m a t k u s t a m i s t a + j u n a n k u l j e t t a j a + j u n a n k u l j e t t a j i a + j u n a n k u l j e t t a j i e n + j u n a n r o m u u n + j u n a n v a l v o n t a j ä r j e s t e l m ä + j u n a n v a u n u + j u n a n v a u n u j a + j u n a o n n e t t o m u u d e n + j u n a o n n e t t o m u u d e s s a + j u n a o n n e t t o m u u d e s t a + j u n a o n n e t t o m u u d e t + j u n a o n n e t t o m u u k s i a + j u n a o n n e t t o m u u k s i s s a + j u n a o n n e t t o m u u s + j u n a o n n e t t o m u u t e e n + j u n a p a l v e l u j e n + j u n a p o m m i t + j u n a r a d o i l l a + j u n a r a h t i + j u n a r a h t i l i i k e n n e t t ä + j u n a r a t a + j u n a r y ö s t ö + j u n a s t a + j u n a s u o r i t t a j a + j u n a t u r m a + j u n a t u r m a a + j u n a t u r m a n + j u n a t u r m i e n + j u n a t u r m i s t a + j u n a v a i h t o e h d o s t a + j u n a v a i h t o e h t o j a + j u n a v a u n u a + j u n a v a u n u j a + j u n a v a u n u j e n + j u n a v a u n u n + j u n a y h t e y d e n + j u n a y h t e y d e s t ä + j u n a y h t e y d e t + j u n a y h t e y k s i e n + j u n a y h t e y k s i n + j u n a y h t e y k s i ä + j u n a y h t e y s + j u n a y h t e y t t ä + j u n a y h t i ö i d e n + j u n a y k s i k ö i d e n + j u n i a + j u n i e n + j u n i i n + j u n i l l e + j u n i o r e i t a + j u n i o r i j o u k k u e l a i s i s t a + j u n i o r i j ä s e n + j u n i o r i j ä s e n i ä + j u n i o r i j ä ä k i e k k o + j u n i o r i o s a p u o l i + j u n i s s a + j u n i s t a + j u n t a l l e + j u n t a n + j u n t t a h a l l i t u k s e l l e + j u o d a + j u o d e s s a a n + j u o d e s s a n i + j u o k s e m i s e e n + j u o k s e v i a + j u o k s e v i e n + j u o k s e v i i n + j u o k s e v i s t a + j u o k s u a m m e + j u o k s u h a u d a n t i e + j u o k s u h a u t a s o t a + j u o k s u h ä m ä h ä k i t + j u o k s u k e n k i i n + j u o k s u k i l p a i l u + j u o k s u k i l p a i l u u n + j u o k s u p o i k a n s a + j u o k s u p o i k i n a + j u o k s u r a t a + j u o k s u t u s i n v e s t o i n t e j a + j u o l u k k a p a j u + j u o l u k k a s i n i s i i p i + j u o m a a n s a + j u o m a h a l u k k u u t t a + j u o m a j o g u r t t i + j u o m a k e l p o i s t a + j u o m a k o r i + j u o m a k u l t t u u r i n + j u o m a k u l t t u u r i s t a + j u o m a l a k o s s a + j u o m a n v a l m i s t u s t e o l l i s u u s + j u o m a p a k k a u k s i i n + j u o m a p e l i + j u o m a r y h m i e n + j u o m a s e k o i t u k s e t + j u o m a s e k o i t u k s i a + j u o m a s e k o i t u k s i s t a + j u o m a t + j u o m a t e o l l i s u u d e n + j u o m a t e o l l i s u u d e s s a + j u o m a t e o l l i s u u s + j u o m a t e o l l i s u u t t a + j u o m a t i e t ä m y k s e n + j u o m a t o t t u m u s t e n + j u o m a t u o t t e i s t a + j u o m a v a l m i s t a j i e n + j u o m a v e d e l l e + j u o m a v e d e l l ä + j u o m a v e d e l t ä + j u o m a v e d e n + j u o m a v e d e n h a n k i n t a + j u o m a v e d e s s ä + j u o m a v e d e s s ä m m e + j u o m a v e d e s t ä + j u o m a v e d e s t ä m m e + j u o m a v e s i + j u o m a v e s i a l t a i d e n + j u o m a v e s i a l t a i t a + j u o m a v e s i d i r e k t i i v i + j u o m a v e s i d i r e k t i i v i k s i + j u o m a v e s i d i r e k t i i v i l l ä + j u o m a v e s i d i r e k t i i v i n + j u o m a v e s i d i r e k t i i v i s s ä + j u o m a v e s i e n + j u o m a v e s i h u o l l o n + j u o m a v e s i h u o l t o + j u o m a v e s i h u o l t o a + j u o m a v e s i h u o l t o o n + j u o m a v e s i i n + j u o m a v e s i j o h t o j a + j u o m a v e s i k a i v o j a + j u o m a v e s i k r i i s i s t ä + j u o m a v e s i k y s y m y k s e e n + j u o m a v e s i l a a d u n + j u o m a v e s i l ä h t e i d e n + j u o m a v e s i o n g e l m a + j u o m a v e s i p u l a n + j u o m a v e s i s a n k o o n + j u o m a v e s i s t r a t e g i a t + j u o m a v e s i t a r p e i d e n + j u o m a v e s i t u o t a n n o l l e + j u o m a v e s i v a r a s t o j a + j u o m a v e s i v a r a s t o j e n + j u o m a v e s i v a r a s t o n a + j u o m a v e s i v a r a t + j u o m a v e s i v a r o i s t a + j u o m a v e s i v a r o j a + j u o m a v e s i v a r o j e n + j u o m a v e s i v e r k o s t o i h i n + j u o m a v e s i ä + j u o m a v e t e e n + j u o m a v e t e m m e + j u o m a v e t e n s ä + j u o m a v e t e n ä + j u o m a v e t t ä + j u o m a v e t t ä m m e + j u o m i a + j u o m i e n + j u o m i i n + j u o m i s e e n + j u o m i s e s t a + j u o m i s p o l i t i i k k a a + j u o m i s r i i p p u v u u s + j u o m i s t a + j u o m u v a a k s i a i n e n + j u o n i t e l l a a n + j u o n i t t e l e m i s e s t a + j u o n i t t e l u k o k o u k s e n + j u o n t a a + j u o n t a v a s t a + j u o n t a v a t + j u o n t u u + j u o n t u v a t + j u o p p o l i n t u + j u o p u a + j u o p u n e e m p a n a + j u o r u k o u l u + j u o r u p a l s t o j e n + j u o s t a + j u o s t a a n + j u o t t o p a i k k o j a + j u o t t o r e h u u n + j u o t t o v a s i k k a a + j u o t u a a n + j u o v a b a s i l i s k i + j u o v a b a s s i + j u o v a d e l f i i n i + j u o v a g n u u + j u o v a h y e e n a + j u o v a h y l j e + j u o v a i m u b a r b i + j u o v a k e n g u r u + j u o v a k o r a l l i m o n n i + j u o v a k o r u a h v e n + j u o v a k u u k a l a + j u o v a k ä k i k y y h k y + j u o v a m a a o r a v a + j u o v a m a n g u s t i + j u o v a m a r l i i n i + j u o v a m u u n t a j a + j u o v a o k a m o n n i + j u o v a p a l l o k a l a + j u o v a p i n g v i i n i t + j u o v a p o s k i h u u l i k a l a + j u o v a p o s k i t o k k o + j u o v a p u n a t ä p l ä + j u o v a p y r s t ö k o t i n g a + j u o v a p ä ä k e r t t u l i + j u o v a r i n t a k o t i n g a + j u o v a s a k a a l i + j u o v a s i i l i k a l a + j u o v a s k i n k k i + j u o v a s u l k a h a u t o j a + j u o v a t o k a + j u o v a t ä p l ä t i k k a + j u o v a v a a n i j a + j u o v a v a r a a n i + j u o v a v ä l s k ä r i + j u p i k k i k i e l e t + j u r i d i s e e n + j u r i d i s e t + j u r i d i s i a + j u r i d i s i i n + j u r i d i s i s t a + j u r i d i s t a + j u r i s t e j a + j u r i s t i e m m e + j u r i s t i e n + j u r i s t i l i n g v i s t i e n + j u r i s t i l i n g v i s t i n e n + j u r i s t i t + j u t t e l e m a a n + j u t t u a + j u t t u j a + j u t t u j e n + j u t t u r u u h k a + j u t u s s a + j u t u s t e l l e s s a m m e + j u t u s t e l u a + j u u d a k s e n k o r v a + j u u d a k s e n p u u + j u u r e n s a + j u u r e t + j u u r e t t o m a t + j u u r i a + j u u r i a a n + j u u r i h o i t o + j u u r i h o i t o a + j u u r i k a a n + j u u r i k a s k i r v a + j u u r i k a s k ä r p ä n e n + j u u r i k a s m e l a s s i s t a + j u u r i k a s p o h j a i s e n + j u u r i k a s s o k e r i + j u u r i k a s s o k e r i t e h t a a n + j u u r i k a s s o k e r i y r i t y s t ä + j u u r i k a s t u o t a n t o o n + j u u r i k u n t a + j u u r i k ä ä v ä t + j u u r i l a s i s i i p i + j u u r i m u s i i k k i + j u u r i n e e n + j u u r i n i m i p a l v e l i n + j u u r i n y s t y r ä + j u u r i p a i n e + j u u r i s i k u r i a l a l l a + j u u r i s t o t + j u u r i t e s t i + j u u r i t t u + j u u r r u t e t t a v a + j u u r r u t e t t u a + j u u r r u t t a m i s e k s i + j u u r t u m a a n + j u u r t u n e i t a + j u u s t o h ö y l ä m e n e t e l m ä + j u u s t o h ö y l ä m e n e t e l m ä ä + j u u s t o h ö y l ä m e n e t t e l y s t ä + j u u s t o h ö y l ä m e n e t t e l y ä + j u u s t o l a j e j a + j u u s t o m y y m ä l ä s t ä + j u u s t o n a k s u t + j u u s t o n i m i k k e e t + j u u s t o n k o r v i k k e i d e n + j u u s t o n t u o t a n n o n + j u u s t o n v a l m i s t a j a t + j u u s t o p u n k k i + j u u s t o s ä m p y l ä n + j u u s t o t u o t t e i d e n + j u u s t o t y y p p i + j u u t a l a i s a s u t u k s e n + j u u t a l a i s a s u t u s + j u u t a l a i s a u t o n o m i s e k s i + j u u t a l a i s a u t o n o m i s e l l a + j u u t a l a i s b e r b e r i + j u u t a l a i s e e n + j u u t a l a i s e t + j u u t a l a i s g h e t t o a + j u u t a l a i s h a l l i n n o n + j u u t a l a i s h a u t a u s m a a n + j u u t a l a i s i a + j u u t a l a i s i i n + j u u t a l a i s i l l e + j u u t a l a i s i l t a + j u u t a l a i s i s t a + j u u t a l a i s i t a l i a + j u u t a l a i s j ä r j e s t ö j e n + j u u t a l a i s k a n s a + j u u t a l a i s k a n s a a + j u u t a l a i s k i e l e t + j u u t a l a i s k o n g r e s s i + j u u t a l a i s k o n g r e s s i l l e + j u u t a l a i s k o n g r e s s i n + j u u t a l a i s k r e i k k a + j u u t a l a i s k r i s t i l l i s e e n + j u u t a l a i s k r i s t i l l i s e n + j u u t a l a i s k r i s t i l l i s e s t ä + j u u t a l a i s k r i s t i l l i s i i n + j u u t a l a i s k r i s t i l l i s t e n + j u u t a l a i s l a p s e n + j u u t a l a i s l a p s i a + j u u t a l a i s l a p s i s t a + j u u t a l a i s m i e h e n + j u u t a l a i s p a r t i s a a n e j a + j u u t a l a i s p i i r i t + j u u t a l a i s p o i k i e n + j u u t a l a i s p o l i i t i k k o j a + j u u t a l a i s p r i k a a t i a + j u u t a l a i s p r o v e n s a a l i + j u u t a l a i s r a n s k a + j u u t a l a i s s i i r t o k u n n i s t a + j u u t a l a i s s i i r t o k u n t a + j u u t a l a i s s i i r t o k u n t i e n + j u u t a l a i s s i i r t o l a i s i s t a + j u u t a l a i s s o t a + j u u t a l a i s t a d ž i k k i + j u u t a l a i s t e n + j u u t a l a i s t e n v a s t a i s i s t a + j u u t a l a i s t u t k i m u k s e n + j u u t a l a i s u h r e j a + j u u t a l a i s u u d e l l e + j u u t a l a i s v a i n o a + j u u t a l a i s v a i n o i h i n + j u u t a l a i s v a i n o i s t a + j u u t a l a i s v a i n o j e n + j u u t a l a i s v a l t i o + j u u t a l a i s v a l t i o k s i + j u u t a l a i s v a l t i o l l e + j u u t a l a i s v a l t i o n + j u u t a l a i s v a l t i o n a + j u u t a l a i s v a l t i o t a + j u u t a l a i s v a s t a i n e n + j u u t a l a i s v a s t a i s e e n + j u u t a l a i s v a s t a i s e n + j u u t a l a i s v a s t a i s e s t a + j u u t a l a i s v a s t a i s e t + j u u t a l a i s v a s t a i s i a + j u u t a l a i s v a s t a i s i i n + j u u t a l a i s v a s t a i s i l l a + j u u t a l a i s v a s t a i s t a + j u u t a l a i s v a s t a i s t e n + j u u t a l a i s v a s t a i s u u d e n + j u u t a l a i s v a s t a i s u u d e s t a + j u u t a l a i s v a s t a i s u u k s i a + j u u t a l a i s v a s t a i s u u s + j u u t a l a i s v a s t a i s u u t e e n + j u u t a l a i s v a s t a i s u u t t a + j u u t a l a i s v e r t a + j u u t a l a i s v i h a + j u u t a l a i s v i h a a + j u u t a l a i s v i h a a n + j u u t a l a i s v i h a m i e l i s y y d e n + j u u t a l a i s v i h a n + j u u t a l a i s v i h a s t a + j u u t a l a i s v ä e s t ö n ä + j u u t a l a i s v ä h e m m i s t ö n + j u u t a l a i s y h t e i s ö + j u u t a l a i s y h t e i s ö i s t ä + j u u t a l a i s y h t e i s ö n + j u u t a l a i s y h t e i s ö t + j u u t t i j ä r j e s t ö + j u u t t i j ä r j e s t ö j e n + j u u t t i j ä r j e s t ö n + j u u t t u a + j u u t t u i s i + j u u t t u m a t t a + j u u t t u u + j u u t t u v a t + j u u t u i m m e + j u u t u m m e + j u u t u t a a n + j y l i n ä ä + j y m y a n t e n n i m o n n i + j y r k e m m i l l ä + j y r k e m m i s t ä + j y r k e m m ä t + j y r k e m p i + j y r k e m p i i n + j y r k e m p i ä + j y r k e m p ä ä + j y r k i m m i l l e + j y r k i m p i ä + j y r k k i i n + j y r k k i ä + j y r k k ä n ä + j y r k k ä ä + j y r k k ä ä n + j y r k k ä ä n k i n + j y r k ä n + j y r k ä s s ä + j y r ä t k ö + j y r ä y s m e l u s t a + j y r ä y s p o l i t i i k k a + j y r ä y s p o l i t i i k k a a + j y r ä y s t e k n i i k k a a + j y v ä m a r k k i n a t + j y v ä s t a t t i + j y v ä v i s k i t i s l a a m o t + j ä h m e y d e l l ä ä n + j ä i h i n + j ä i k i n + j ä i l l ä + j ä i s i + j ä i s i v ä t + j ä i s i v ä t k i n + j ä i s s ä + j ä i s t ä + j ä i v ä t + j ä k ä l ä t a m m i y ö k k ö n e n + j ä l j e n n e t e k n i i k k a + j ä l j e n n ö k s e n + j ä l j e n n ö k s i ä + j ä l j e n t ä m i s e n + j ä l j e t + j ä l j i t e l l ä + j ä l j i t e l m ä a s e e n + j ä l j i t e l m ä e l i n t a r v i k k e i s i i n + j ä l j i t e l m ä e l i n t a r v i k k e i s t a + j ä l j i t e l m ä e l i n t a r v i k k e i t a + j ä l j i t e l m ä l ä ä k k e i t ä + j ä l j i t e l m ä t u o t t e e t + j ä l j i t e l m ä t u o t t e i d e n + j ä l j i t e l m ä t u o t t e i l l a + j ä l j i t e l m ä t u o t t e i t a + j ä l j i t e t t ä v y y d e n + j ä l j i t e t t ä v y y d e s t ä + j ä l j i t e t t ä v y y s j ä r j e s t e l m i e n + j ä l j i t e t t ä v y y s j ä r j e s t e l m i ä + j ä l j i t e t t ä v y y s j ä r j e s t e l m ä + j ä l j i t e t t ä v y y s j ä r j e s t e l m ä n + j ä l j i t e t t ä v y y s j ä r j e s t e l m ä s s ä + j ä l j i t e t t ä v y y s j ä r j e s t e l m ä t + j ä l j i t e t t ä v y y s j ä r j e s t e l m ä ä + j ä l j i t e t t ä v y y s j ä r j e s t e l m ä ä n + j ä l j i t e t t ä v y y s j ä r j e s t e l y + j ä l j i t e t t ä v y y s k y s y m y s + j ä l j i t e t t ä v y y s k y s y m y s t ä + j ä l j i t e t t ä v y y s p e r i a a t t e i d e n + j ä l j i t e t t ä v y y s p r o s e s s i a + j ä l j i t e t t ä v y y s s ä ä n n ö i l l ä + j ä l j i t e t t ä v y y s s ä ä n t ö j ä + j ä l j i t e t t ä v y y s t o i m e n p i t e i t ä + j ä l j i t e t t ä v y y s t o i m i s t a + j ä l j i t e t t ä v y y s v a a t i m u k s e t + j ä l j i t e t t ä v y y s v a a t i m u s + j ä l j i t e t t ä v y y s v a a t i m u s t a + j ä l j i t e t t ä v y y s v e l v o i t e + j ä l j i t e t t ä v y y t e e n + j ä l j i t e t t ä v y y t t ä + j ä l j i t t e l e m i s e s t ä + j ä l j i t t e l y r i k o s + j ä l j i t t e l y t o i m i n t a a n s a + j ä l j i t t ä m i s e e n + j ä l j i t t ä m i s e k s i + j ä l j i t t ä m i s e l i m e k s i + j ä l j i t t ä m i s e s s ä + j ä l j i t t ä m i s j ä r j e s t e l m i l l e + j ä l j i t t ä m i s j ä r j e s t e l m ä ä + j ä l j i t t ä m i s k e i n o + j ä l j i t t ä m i s o h j e l m a + j ä l j i t t ä m i s o h j e l m a a + j ä l j i t t ä m i s o h j e l m a l l e + j ä l j i t t ä m i s o h j e l m a n + j ä l j i t t ä m i s o h j e l m a s t a + j ä l j i t t ä m i s p o l i t i i k k a + j ä l j i t t ä m i s t ä + j ä l j i t t ä m ä ä n + j ä l j i t t ä ä + j ä l j i t y s h a n k k e e n + j ä l j i t y s j ä r j e s t e l m i ä + j ä l j i t y s j ä r j e s t e l m ä + j ä l j i t y s j ä r j e s t e l m ä s t ä + j ä l j i t y s j ä r j e s t e l m ä t + j ä l j i t y s j ä r j e s t e l m ä ä + j ä l j i t y s m e n e t e l m i s t ä + j ä l j i t y s m e n e t e l m i ä + j ä l j i t y s o h j e l m a + j ä l j i t y s o h j e l m a n + j ä l j i t y s o h j e l m i s t o j a + j ä l j i t y s t o i m i i n + j ä l j i t y s t ä + j ä l k e e n j ä ä m i n e n + j ä l k e e n j ä ä n e e t + j ä l k e e n j ä ä n e i m p i i n + j ä l k e e n j ä ä n e i s y y t t ä + j ä l k e e n k i n + j ä l k e i s e e n + j ä l k e i s e l l e + j ä l k e i s e n + j ä l k e i s e s s ä + j ä l k e i s e s t ä + j ä l k e i s i l l e + j ä l k e i s i s s ä + j ä l k e i s t e n + j ä l k e i s t ä + j ä l k e l ä i s i s s ä + j ä l k e l ä i s i s t ä + j ä l k e m m e + j ä l k e ä k ä ä n + j ä l k i a r v i o i n n e i s t a + j ä l k i a r v i o i n n i n + j ä l k i a r v i o i n n i t + j ä l k i a r v i o i n t i + j ä l k i a r v i o i n t i a + j ä l k i a r v i o i n t i r a p o r t t i a + j ä l k i a s e n n e t u l l a + j ä l k i a s e n n u k s e e n + j ä l k i a s e n n u s k u s t a n n u k s e t + j ä l k i a s e n n u s o s i a + j ä l k i a s e n n u s p r o s e s s i e n + j ä l k i a s e n t a m i s e e n + j ä l k i a s e n t a m i s e n + j ä l k i a s e n t a m i s t a + j ä l k i d e m o k r a a t t i s t a + j ä l k i d e m o k r a a t t i s t e n + j ä l k i e h k ä i s y + j ä l k i e h k ä i s y p i l l e r i + j ä l k i e h k ä i s y p i l l e r i s t ä + j ä l k i f a s i s t i s t e n + j ä l k i h o i d o n + j ä l k i h o i d o s t a + j ä l k i h o i t o + j ä l k i h o i t o o n + j ä l k i h u o l l o n + j ä l k i h u o l t o + j ä l k i j ä r i s t y k s i s t ä + j ä l k i k a n s a l l i s e n + j ä l k i k a n s a l l i s t a + j ä l k i k e s k i a i k a i n e n + j ä l k i k e y n e s i l ä i n e n + j ä l k i k e y n e s i l ä i s y y d e s t ä + j ä l k i k i r j o i t u s + j ä l k i k o l o n i a l i s m i n + j ä l k i k o l o n i a l i s t i n e n + j ä l k i k o l o n i a l i s t i s t e n + j ä l k i k o m m u n i s t e i k s i + j ä l k i k o m m u n i s t i n e n + j ä l k i k o m m u n i s t i s e k s i + j ä l k i k o m m u n i s t i s e n a + j ä l k i k o m m u n i s t i s e s t a + j ä l k i k o m m u n i s t i s i l l e + j ä l k i k ä s i t t e l y t e k n i i k a s t a + j ä l k i k ä s i t t e l y v a i h e e s s a + j ä l k i k ä s i t t e l y ä + j ä l k i k ä t e i s a r v i o i n n i n + j ä l k i k ä t e i s a r v i o i n t i e n + j ä l k i k ä t e i s e n + j ä l k i k ä t e i s j ä r j e s t e l y i l l ä + j ä l k i k ä t e i s t a r k a s t u k s e n + j ä l k i k ä t e i s t a r k a s t u k s e t + j ä l k i k ä t e i s t a r k a s t u k s i s t a + j ä l k i k ä t e i s t a r k a s t u s + j ä l k i k ä t e i s t ä + j ä l k i k ä t e i s v a l v o n t a a + j ä l k i k ä y t t ö ä + j ä l k i l i b e r a l i s t i s e e n + j ä l k i m a r k k i n a t i l a n n e + j ä l k i m a r k k i n o i d e n + j ä l k i m a r k k i n o i h i n + j ä l k i m a r k k i n o i l l a + j ä l k i m a r k k i n o i l t a + j ä l k i m a u n + j ä l k i m m ä i s e n + j ä l k i m m ä i s e s s ä + j ä l k i m m ä i s e s t ä + j ä l k i m m ä i s e t + j ä l k i m m ä i s i i n + j ä l k i m m ä i s i ä + j ä l k i n a t i o n a l i s t i n e n + j ä l k i n e u v o t t e l u i s t a + j ä l k i o s a a + j ä l k i p e l i ä + j ä l k i p o l v i l l e + j ä l k i p o l v i l l e m m e + j ä l k i p u h d i s t u s t e k n i i k k a a + j ä l k i p u o l e l l a + j ä l k i p u o l i s k o a + j ä l k i p u o l i s k o l l a + j ä l k i p u o l i s k o l l e + j ä l k i p u o l i s k o l t a + j ä l k i r a h o i t u s t a + j ä l k i r u o k a k u l t t u u r i i n + j ä l k i r u o k a t a l o u s + j ä l k i s e u r a n n a s s a + j ä l k i s o s i a l i s t i s i s s a + j ä l k i s t r u k t u r a l i s m i + j ä l k i t a r k a s t u k s e n + j ä l k i t a r k a s t u k s e t + j ä l k i t a r k a s t u s j ä r j e s t e l m ä + j ä l k i t a r k a s t u s m e n e t e l m ä ä + j ä l k i t a r k i s t u s t a + j ä l k i t o i m e t + j ä l k i t o i m i a + j ä l k i t u o t a n n o s s a + j ä l k i t u o t a n t o a + j ä l k i t u t k i m u k s i s t a + j ä l k i v a a t i m u k s i a + j ä l k i v a i h e e k s i + j ä l k i v a i k u t u k s e t + j ä l k i v a i k u t u k s i a + j ä l k i v a i k u t u k s i s t a + j ä l k i v a l v o n t a + j ä l k i v a l v o n t a a + j ä l k i v a l v o n t a a n + j ä l k i v i i s a a n a + j ä l k i v i i s a u d e n + j ä l k i v i i s a u t e e n + j ä l k i v i i s a u t t a + j ä l k i ä + j ä l l e e n k ä s i t t e l y k a p a s i t e e t i s s a + j ä l l e e n k ä s i t t e l y l a i t o k s e e n + j ä l l e e n k ä s i t t e l y l a i t o k s e n + j ä l l e e n k ä s i t t e l y l a i t o k s e n s a + j ä l l e e n k ä s i t t e l y l a i t o k s e t + j ä l l e e n k ä s i t t e l y l a i t o k s i a + j ä l l e e n k ä s i t t e l y l a i t o k s i i n + j ä l l e e n k ä s i t t e l y l a i t o k s i s s a + j ä l l e e n k ä s i t t e l y l a i t o s + j ä l l e e n k ä s i t t e l y l a i t o s t e n + j ä l l e e n k ä s i t t e l y s o p i m u s t a + j ä l l e e n k ä s i t t e l y t e k n i i k a n + j ä l l e e n k ä s i t t e l y t o i m e t + j ä l l e e n k ä s i t t e l y t o i m i t u k s e t + j ä l l e e n m y y j i l l e + j ä l l e e n m y y n t i a l a l l a + j ä l l e e n m y y n t i h i n t a a + j ä l l e e n m y y n t i h i n t o j e n + j ä l l e e n m y y n t i k e t j u j e n + j ä l l e e n m y y n t i k o r v a u k s e e n + j ä l l e e n m y y n t i k o r v a u k s e n + j ä l l e e n m y y n t i k o r v a u k s e s t a + j ä l l e e n m y y n t i k o r v a u k s i s t a + j ä l l e e n m y y n t i k o r v a u s + j ä l l e e n m y y n t i k o r v a u s o i k e u d e l l a + j ä l l e e n m y y n t i k o r v a u s o i k e u d e n + j ä l l e e n m y y n t i k o r v a u s o i k e u t t a + j ä l l e e n m y y n t i k o r v a u s t a + j ä l l e e n m y y n t i k o r v a u s t e n + j ä l l e e n m y y n t i m a r k k i n o i d e n + j ä l l e e n m y y n t i p i s t e i s i i n + j ä l l e e n m y y n t i p i s t e i s t ä + j ä l l e e n m y y n t i s o p i m u k s i i n + j ä l l e e n r a h o i t u s o p e r a a t i o i d e n + j ä l l e e n r a h o i t u s o p e r a a t i o i s s a + j ä l l e e n r a h o i t u s t o i m i e n + j ä l l e e n r a h o i t u s v ä l i n e e n ä + j ä l l e e n r a k e n n e t a a n + j ä l l e e n r a k e n n e t t a v a + j ä l l e e n r a k e n n u k s e e n + j ä l l e e n r a k e n n u k s e n + j ä l l e e n r a k e n n u s a p u + j ä l l e e n r a k e n n u s a p u a + j ä l l e e n r a k e n n u s a p u u n + j ä l l e e n r a k e n n u s a v u k s i + j ä l l e e n r a k e n n u s a v u l l a + j ä l l e e n r a k e n n u s a v u l l e + j ä l l e e n r a k e n n u s a v u n + j ä l l e e n r a k e n n u s a v u s t a + j ä l l e e n r a k e n n u s a v u s t u k s e e n + j ä l l e e n r a k e n n u s h a n k k e e n + j ä l l e e n r a k e n n u s h a n k k e e s t a + j ä l l e e n r a k e n n u s h a n k k e i d e n + j ä l l e e n r a k e n n u s h a n k k e i l l e + j ä l l e e n r a k e n n u s h a n k k e i t a + j ä l l e e n r a k e n n u s k a u s i + j ä l l e e n r a k e n n u s k o m i s s i o n + j ä l l e e n r a k e n n u s k o m i s s i o o n + j ä l l e e n r a k e n n u s k o n f e r e n s s i i n + j ä l l e e n r a k e n n u s k u l u j e n + j ä l l e e n r a k e n n u s m a r k k i n o i l l e + j ä l l e e n r a k e n n u s o h j e l m a + j ä l l e e n r a k e n n u s o h j e l m a a + j ä l l e e n r a k e n n u s o h j e l m a a n + j ä l l e e n r a k e n n u s o h j e l m a l l e + j ä l l e e n r a k e n n u s o h j e l m a n + j ä l l e e n r a k e n n u s o h j e l m a s t a + j ä l l e e n r a k e n n u s o h j e l m i a + j ä l l e e n r a k e n n u s o h j e l m i e n + j ä l l e e n r a k e n n u s o h j e l m i i n + j ä l l e e n r a k e n n u s o h j e l m i s t a + j ä l l e e n r a k e n n u s o r g a n i s a a t i o + j ä l l e e n r a k e n n u s o s u u d e n + j ä l l e e n r a k e n n u s p a k e t t i a + j ä l l e e n r a k e n n u s p a n k i s s a + j ä l l e e n r a k e n n u s p o l i t i i k k a a + j ä l l e e n r a k e n n u s p o n n i s t e l u i s t a a n + j ä l l e e n r a k e n n u s p o n n i s t e l u j a + j ä l l e e n r a k e n n u s p o n n i s t e l u j e n + j ä l l e e n r a k e n n u s p o n n i s t u k s i s t a + j ä l l e e n r a k e n n u s p r o j e k t i + j ä l l e e n r a k e n n u s p r o j e k t i e n + j ä l l e e n r a k e n n u s p r o j e k t i t + j ä l l e e n r a k e n n u s p r o s e s s e i h i n + j ä l l e e n r a k e n n u s p r o s e s s i + j ä l l e e n r a k e n n u s p r o s e s s i a + j ä l l e e n r a k e n n u s p r o s e s s i e n + j ä l l e e n r a k e n n u s p r o s e s s i i n + j ä l l e e n r a k e n n u s p r o s e s s i n + j ä l l e e n r a k e n n u s p r o s e s s i s s a + j ä l l e e n r a k e n n u s p r o s e s s i s t a + j ä l l e e n r a k e n n u s r a h a s t o + j ä l l e e n r a k e n n u s r a h a s t o i s t a + j ä l l e e n r a k e n n u s r a h a s t o j e n + j ä l l e e n r a k e n n u s r a h a s t o n + j ä l l e e n r a k e n n u s r a h o i t u s j ä r j e s t e l y n + j ä l l e e n r a k e n n u s r y h m i e n + j ä l l e e n r a k e n n u s s u u n n i t e l m a + j ä l l e e n r a k e n n u s s u u n n i t e l m a a + j ä l l e e n r a k e n n u s s u u n n i t e l m a a n + j ä l l e e n r a k e n n u s s u u n n i t e l m a l l e + j ä l l e e n r a k e n n u s s u u n n i t e l m a n + j ä l l e e n r a k e n n u s s u u n n i t e l m a s s a + j ä l l e e n r a k e n n u s s u u n n i t e l m a t + j ä l l e e n r a k e n n u s s u u n n i t e l m i e n + j ä l l e e n r a k e n n u s s u u n n i t e l m i s t a + j ä l l e e n r a k e n n u s t a + j ä l l e e n r a k e n n u s t a r k o i t u k s i i n + j ä l l e e n r a k e n n u s t a r p e e s e e n + j ä l l e e n r a k e n n u s t a r p e e t + j ä l l e e n r a k e n n u s t a r p e i s i i n + j ä l l e e n r a k e n n u s t a r p e i t a + j ä l l e e n r a k e n n u s t a r v e + j ä l l e e n r a k e n n u s t a r v e t t a + j ä l l e e n r a k e n n u s t a r v i k k e i t a + j ä l l e e n r a k e n n u s t e h t ä v i e n + j ä l l e e n r a k e n n u s t e h t ä v ä + j ä l l e e n r a k e n n u s t e h t ä v ä ä n + j ä l l e e n r a k e n n u s t o i m e n p i t e i n e e n + j ä l l e e n r a k e n n u s t o i m i a + j ä l l e e n r a k e n n u s t o i m i e n + j ä l l e e n r a k e n n u s t o i m i i n + j ä l l e e n r a k e n n u s t o i m i n n a n + j ä l l e e n r a k e n n u s t o i m i n n a s t a + j ä l l e e n r a k e n n u s t o i m i n t a a + j ä l l e e n r a k e n n u s t o i m i n t o j a m m e + j ä l l e e n r a k e n n u s t o i m i s s a + j ä l l e e n r a k e n n u s t o i m i s t o + j ä l l e e n r a k e n n u s t u e n + j ä l l e e n r a k e n n u s t u k e a + j ä l l e e n r a k e n n u s t u k i + j ä l l e e n r a k e n n u s t y ö + j ä l l e e n r a k e n n u s t y ö h ö n + j ä l l e e n r a k e n n u s t y ö n + j ä l l e e n r a k e n n u s t y ö s s ä + j ä l l e e n r a k e n n u s t y ö s t ä + j ä l l e e n r a k e n n u s t y ö t + j ä l l e e n r a k e n n u s t y ö t ä + j ä l l e e n r a k e n n u s t ö i d e n + j ä l l e e n r a k e n n u s t ö i h i n + j ä l l e e n r a k e n n u s t ö i s s ä + j ä l l e e n r a k e n n u s t ö i t ä + j ä l l e e n r a k e n n u s u r a k a s s a + j ä l l e e n r a k e n n u s u r a k k a + j ä l l e e n r a k e n n u s v a i h e + j ä l l e e n r a k e n n u s v a i h e e s e e n + j ä l l e e n r a k e n n u s v a i h e e s s a + j ä l l e e n r a k e n n u s v a i h e t t a + j ä l l e e n r a k e n n u s v a r a t + j ä l l e e n r a k e n n u s v a r o j a + j ä l l e e n r a k e n n u s v i r a s t o + j ä l l e e n r a k e n n u s v i r a s t o a + j ä l l e e n r a k e n n u s v i r a s t o k s i + j ä l l e e n r a k e n n u s v i r a s t o m m e + j ä l l e e n r a k e n n u s v i r a s t o n + j ä l l e e n r a k e n n u s v i r a s t o o n + j ä l l e e n r a k e n n u s v i r a s t o s t a + j ä l l e e n r a k e n t a a + j ä l l e e n r a k e n t a m a a n + j ä l l e e n r a k e n t a m a s s a + j ä l l e e n r a k e n t a m i s a i k a t a u l u n + j ä l l e e n r a k e n t a m i s a v u s t a + j ä l l e e n r a k e n t a m i s e e n + j ä l l e e n r a k e n t a m i s e n + j ä l l e e n r a k e n t a m i s e s s a + j ä l l e e n r a k e n t a m i s e s s a k i n + j ä l l e e n r a k e n t a m i s e s t a + j ä l l e e n r a k e n t a m i s h a n k e t t a + j ä l l e e n r a k e n t a m i s h a n k k e e s s a + j ä l l e e n r a k e n t a m i s k a u d e n + j ä l l e e n r a k e n t a m i s k u s t a n n u k s i a + j ä l l e e n r a k e n t a m i s o h j e l m i a + j ä l l e e n r a k e n t a m i s p o l i t i i k a s s a + j ä l l e e n r a k e n t a m i s p r o s e s s i i n + j ä l l e e n r a k e n t a m i s p r o s e s s i n + j ä l l e e n r a k e n t a m i s s u u n n i t e l m a n + j ä l l e e n r a k e n t a m i s t a + j ä l l e e n r a k e n t a m i s t o i m i e n + j ä l l e e n r a k e n t a m i s t o i m i i n + j ä l l e e n r a k e n t a m i s t u e n + j ä l l e e n r a k e n t a m i s t u e s t a + j ä l l e e n r a k e n t a m i s t y ö h ö n + j ä l l e e n r a k e n t a m i s t y ö l t ä + j ä l l e e n r a k e n t a m i s t y ö s s ä + j ä l l e e n r a k e n t a m i s t y ö t ä + j ä l l e e n r a k e n t a m i s v a i h e e s e e n + j ä l l e e n r a k e n t a m i s v i r a s t o n + j ä l l e e n v a k u u t u s a l a + j ä l l e e n v a k u u t u s a l a n + j ä l l e e n v a k u u t u s d i r e k t i i v i + j ä l l e e n v a k u u t u s d i r e k t i i v i k s i + j ä l l e e n v a k u u t u s d i r e k t i i v i n + j ä l l e e n v a k u u t u s d i r e k t i i v i s s ä + j ä l l e e n v a k u u t u s d i r e k t i i v i ä + j ä l l e e n v a k u u t u s j ä r j e s t e l m ä n + j ä l l e e n v a k u u t u s j ä r j e s t e l m ä ä + j ä l l e e n v a k u u t u s m a k s u j e n + j ä l l e e n v a k u u t u s m a r k k i n o i l l a + j ä l l e e n v a k u u t u s p a l v e l u j e n + j ä l l e e n v a k u u t u s s o p i m u s + j ä l l e e n v a k u u t u s s u o j a + j ä l l e e n v a k u u t u s t o i m i a l a s t a + j ä l l e e n v a k u u t u s y h t i ö i t ä + j ä l l e e n v a k u u t u s y h t i ö t + j ä l l e e n v a k u u t u s y r i t y k s e e n + j ä l l e e n v a k u u t u s y r i t y k s e l l e + j ä l l e e n v a k u u t u s y r i t y k s e t + j ä l l e e n v a k u u t u s y r i t y k s i i n + j ä l l e e n v a k u u t u s y r i t y k s i l l e + j ä l l e e n v a k u u t u s y r i t y k s i ä + j ä l l e e n v a k u u t u s y r i t y s t e n + j ä l l e e n v i e n t i k i e l t o + j ä l l e e n v i e n t i ä + j ä l l e n r a k e n n u s p r o s e s s i i n + j ä l l e n r a k e n n u s v a r a t + j ä m e r ä m m i n + j ä m e r ä m m ä n + j ä m ä k ä m m i n + j ä m ä k ä m m ä n + j ä m ä k ä m p i + j ä m ä k ä m p ä ä + j ä n i s e l ä i m i s t ä + j ä n i s h o u s u i s t a + j ä n i s j ä r v i + j ä n i s s a a r i + j ä n i s t ä m i s e n + j ä n i s t ä m ä ä n + j ä n i s t ä v ä t + j ä n i s t ä ä + j ä n k ä k u r p p a + j ä n n e n e l i k u l m i o + j ä n n i t e j ä r j e s t e l m ä n + j ä n n i t e p e s ä k k e i d e n + j ä n n i t e r e f e r e n s s i + j ä n n i t t e e t + j ä n n i t t e i d e n + j ä n n i t t e i s i i n + j ä n n i t t e i t ä + j ä n n i t t y n e e n ä + j ä n n i t t y n e i n ä + j ä n n i t t y n e i t ä + j ä n n i t t ä v i i n + j ä n n i t t ä v i m m i s t ä + j ä n n i t t ä v i m m ä n + j ä n n i t t ä v i m m ä s t ä + j ä n n i t t ä v i m p i ä + j ä n n i t t ä v i n + j ä n n i t t ä v i n t ä + j ä n n i t t ä v i ä + j ä n n i t t ä v ä l l e + j ä n n i t t ä v ä m m ä n + j ä n n i t t ä v ä m m ä t + j ä n n i t t ä v ä m p i + j ä n n i t t ä v ä m p i ä + j ä n n i t t ä v ä m p ä ä + j ä n n i t y k s e n + j ä n n i t y k s e n e t s i j ä t + j ä n n i t y k s e t + j ä n n i t y s k o r r o o s i o + j ä n n i t y s t e k i j ö i t ä + j ä n n i t y s t i l a n t e i d e n + j ä n n i t y s t ä + j ä n ö n a p i l a + j ä n ö n m u s t e s i e n i + j ä n ö n s a l a a t t i + j ä n ö n s a r a + j ä n ö n v i h m a + j ä r e i t ä + j ä r e ä m m ä t + j ä r e ä m p i i n + j ä r e ä m p i ä + j ä r i s t y s a l u e e l l a + j ä r i s t y s a l u e e n + j ä r i s t y s h e r k i m p i ä + j ä r j e l l e + j ä r j e l l i s e m p i + j ä r j e l l ä + j ä r j e n + j ä r j e n k i n + j ä r j e n k ä y t ö n + j ä r j e n v a s t a i s e l t a + j ä r j e n v a s t a i s e n + j ä r j e n v a s t a i s e s t i + j ä r j e n v a s t a i s t a + j ä r j e s t e l l ä ä n + j ä r j e s t e l m i e n + j ä r j e s t e l m i e n s ä + j ä r j e s t e l m i i n + j ä r j e s t e l m i l l e + j ä r j e s t e l m i l l ä + j ä r j e s t e l m i s s ä + j ä r j e s t e l m i s s ä ä n + j ä r j e s t e l m i s t ä + j ä r j e s t e l m i ä + j ä r j e s t e l m i ä m m e + j ä r j e s t e l m ä a r k k i t e h t u u r i + j ä r j e s t e l m ä a r k k i t e h t u u r i n + j ä r j e s t e l m ä i n n o v a a t i o i d e n + j ä r j e s t e l m ä i n n o v a a t i o i h i n + j ä r j e s t e l m ä i n t e g r a a t i o + j ä r j e s t e l m ä k o o r d i n a a t t o r i + j ä r j e s t e l m ä k o o r d i n a a t t o r i n + j ä r j e s t e l m ä k r i i s i + j ä r j e s t e l m ä k r i i s i i n + j ä r j e s t e l m ä k r i i s i n + j ä r j e s t e l m ä k r i i s i s t ä + j ä r j e s t e l m ä k u t s u + j ä r j e s t e l m ä k u v a u s t e n + j ä r j e s t e l m ä l l e + j ä r j e s t e l m ä l l i s e e n + j ä r j e s t e l m ä l l i s e k s i + j ä r j e s t e l m ä l l i s e m m i k s i + j ä r j e s t e l m ä l l i s e m m i n + j ä r j e s t e l m ä l l i s e m m ä k s i + j ä r j e s t e l m ä l l i s e m m ä l l e + j ä r j e s t e l m ä l l i s e m m ä l l ä + j ä r j e s t e l m ä l l i s e m m ä s t ä + j ä r j e s t e l m ä l l i s e m p i + j ä r j e s t e l m ä l l i s e m p i ä + j ä r j e s t e l m ä l l i s e m p ä ä + j ä r j e s t e l m ä l l i s e n + j ä r j e s t e l m ä l l i s e t + j ä r j e s t e l m ä l l i s i m m i n + j ä r j e s t e l m ä l l i s i ä + j ä r j e s t e l m ä l l i s t e n + j ä r j e s t e l m ä l l ä + j ä r j e s t e l m ä m a l l e j a + j ä r j e s t e l m ä m m e + j ä r j e s t e l m ä m u u t o k s i a + j ä r j e s t e l m ä m u u t o s + j ä r j e s t e l m ä m ä ä r i t e l m i e n + j ä r j e s t e l m ä n + j ä r j e s t e l m ä n ä + j ä r j e s t e l m ä o p e r a a t t o r e i d e n + j ä r j e s t e l m ä o p e r a a t t o r e i t a + j ä r j e s t e l m ä p e r u s t e i n e n + j ä r j e s t e l m ä p o h j a i s t a + j ä r j e s t e l m ä r a k e n n e t t a + j ä r j e s t e l m ä r a t k a i s u j e n + j ä r j e s t e l m ä r i s k e i l t ä + j ä r j e s t e l m ä r i s k e i n e e n + j ä r j e s t e l m ä r i s k e j ä + j ä r j e s t e l m ä r i s k i + j ä r j e s t e l m ä r i s k i e n + j ä r j e s t e l m ä r i s k i i n + j ä r j e s t e l m ä r i s k i k o m i t e a + j ä r j e s t e l m ä r i s k i k o m i t e a a + j ä r j e s t e l m ä r i s k i k o m i t e a a n + j ä r j e s t e l m ä r i s k i k o m i t e a l l a + j ä r j e s t e l m ä r i s k i k o m i t e a n + j ä r j e s t e l m ä r i s k i k o m i t e a s t a + j ä r j e s t e l m ä r i s k i n + j ä r j e s t e l m ä r i s k i t + j ä r j e s t e l m ä r i s k i ä + j ä r j e s t e l m ä s s ä + j ä r j e s t e l m ä s s ä m m e + j ä r j e s t e l m ä s t ä + j ä r j e s t e l m ä t + j ä r j e s t e l m ä v a l l a n k u m o u s + j ä r j e s t e l m ä v a l m i s t a j i e n + j ä r j e s t e l m ä v i k a + j ä r j e s t e l m ä v i r h e + j ä r j e s t e l m ä v i r h e e s t ä + j ä r j e s t e l m ä v i r h e e t + j ä r j e s t e l m ä v i r h e i d e n + j ä r j e s t e l m ä v i r h e i l l e + j ä r j e s t e l m ä ä + j ä r j e s t e l m ä ä n + j ä r j e s t e l m ä ä n s ä + j ä r j e s t e l y i h i n + j ä r j e s t e l y i l l ä + j ä r j e s t e l y i s s ä + j ä r j e s t e l y i s t ä + j ä r j e s t e l y i t ä + j ä r j e s t e l y j e n + j ä r j e s t e l y j ä + j ä r j e s t e l y j ä ä n + j ä r j e s t e l y k o m i t e a + j ä r j e s t e l y k o m i t e a a + j ä r j e s t e l y k o m i t e a a n + j ä r j e s t e l y k o m i t e a l l e + j ä r j e s t e l y k o m i t e a n + j ä r j e s t e l y k o n e i s t o n + j ä r j e s t e l y k u l u j a + j ä r j e s t e l y k ä y t ä n t ö j e n + j ä r j e s t e l y k ä y t ä n t ö ä + j ä r j e s t e l y l l ä + j ä r j e s t e l y l u o n t e i s e t + j ä r j e s t e l y m a h d o l l i s u u k s i a + j ä r j e s t e l y n + j ä r j e s t e l y n ä k ö k o h d i s t a + j ä r j e s t e l y p e r i a a t e t t a + j ä r j e s t e l y p e r i a a t t e i s i i n + j ä r j e s t e l y p o l i t i i k k a a + j ä r j e s t e l y p r o s e s s i s t a + j ä r j e s t e l y r a t a p i h a l l a + j ä r j e s t e l y s t ä + j ä r j e s t e l y t + j ä r j e s t e l y t o i m e n p i t e i s i i n + j ä r j e s t e l y t o i m e t + j ä r j e s t e l y t o i m i k u n n a n + j ä r j e s t e l y t o i m i k u n t a + j ä r j e s t e l y t o i m i k u n t a a + j ä r j e s t e l y y n + j ä r j e s t e l y ä + j ä r j e s t e t t i i n + j ä r j e s t e t t y ä + j ä r j e s t e t t ä e s s ä + j ä r j e s t e t t ä i s i i n + j ä r j e s t e t t ä v i s t ä + j ä r j e s t e t t ä v i ä + j ä r j e s t e t t ä v ä l l e + j ä r j e s t e t t ä v ä ä + j ä r j e s t e t y i s s ä + j ä r j e s t e t y n + j ä r j e s t e t y s s ä + j ä r j e s t e t y t + j ä r j e s t e t ä ä n + j ä r j e s t e t ä ä n k ö + j ä r j e s t i + j ä r j e s t i n + j ä r j e s t i t t e + j ä r j e s t i v ä t + j ä r j e s t y k s e e n + j ä r j e s t y k s e k s i + j ä r j e s t y k s e n + j ä r j e s t y k s e n p i d o n + j ä r j e s t y k s e n s ä + j ä r j e s t y k s e s s ä + j ä r j e s t y k s e s s ä ä n + j ä r j e s t y k s e s t ä + j ä r j e s t y s h ä i r i ö s t ä + j ä r j e s t y s k e h y s t e n + j ä r j e s t y s k y s y m y s + j ä r j e s t y s t o i m i s t a + j ä r j e s t y s t ä + j ä r j e s t y s v a l l a n + j ä r j e s t y s v o i m a m m e + j ä r j e s t y s y h t e i s k u n t a + j ä r j e s t y y + j ä r j e s t ä e s s ä m m e + j ä r j e s t ä e s s ä ä n + j ä r j e s t ä i s i m m e + j ä r j e s t ä j i n ä + j ä r j e s t ä j ä k o m i t e a n + j ä r j e s t ä j ä m a a n + j ä r j e s t ä k ä ä + j ä r j e s t ä k ä ä m m e + j ä r j e s t ä m i s e e n + j ä r j e s t ä m i s e k s i + j ä r j e s t ä m i s e s s ä + j ä r j e s t ä m i s e s t ä + j ä r j e s t ä m i s k u s t a n n u k s i i n + j ä r j e s t ä m i s m a h d o l l i s u u k s i a + j ä r j e s t ä m i s t ä + j ä r j e s t ä m m e + j ä r j e s t ä m ä l l ä + j ä r j e s t ä m ä s s ä + j ä r j e s t ä m ä s t ä + j ä r j e s t ä m ä t t ä + j ä r j e s t ä m ä ä n + j ä r j e s t ä n + j ä r j e s t ä n e e t + j ä r j e s t ä n y t + j ä r j e s t ä t t e + j ä r j e s t ä v ä t + j ä r j e s t ä y t y m i s e e n + j ä r j e s t ä y t y m i s e n + j ä r j e s t ä y t y m i s e s t ä + j ä r j e s t ä y t y m i s i s t u n n o n + j ä r j e s t ä y t y m i s i s t u n t o + j ä r j e s t ä y t y m i s o i k e u d e l l e + j ä r j e s t ä y t y m i s o i k e u d e n + j ä r j e s t ä y t y m i s o i k e u d e s t a + j ä r j e s t ä y t y m i s o i k e u d e t + j ä r j e s t ä y t y m i s o i k e u k s i a + j ä r j e s t ä y t y m i s o i k e u k s i e n + j ä r j e s t ä y t y m i s o i k e u k s i s t a + j ä r j e s t ä y t y m i s o i k e u s + j ä r j e s t ä y t y m i s o i k e u t t a + j ä r j e s t ä y t y m i s t a p a + j ä r j e s t ä y t y m i s v a p a u d e n + j ä r j e s t ä y t y m i s v a p a u d e s t a + j ä r j e s t ä y t y m i s v a p a u s + j ä r j e s t ä y t y m i s v a p a u t e e n + j ä r j e s t ä y t y m i s v a p a u t t a + j ä r j e s t ä y t y m ä ä n + j ä r j e s t ä y t y n e e l l e + j ä r j e s t ä y t y n e e l l ä + j ä r j e s t ä y t y n e e l t ä + j ä r j e s t ä y t y n e e m m i n + j ä r j e s t ä y t y n e e m m ä s t ä + j ä r j e s t ä y t y n e e m p ä ä + j ä r j e s t ä y t y n e e m p ä ä n + j ä r j e s t ä y t y n e e n + j ä r j e s t ä y t y n e e s e e n + j ä r j e s t ä y t y n e e s t ä + j ä r j e s t ä y t y n e e t + j ä r j e s t ä y t y n e i d e n + j ä r j e s t ä y t y n e i l l ä + j ä r j e s t ä y t y n e i t ä + j ä r j e s t ä y t y n y t t ä + j ä r j e s t ä y t y ä + j ä r j e s t ä ä + j ä r j e s t ä ä k s e e n + j ä r j e s t ö a k t i v i s t i t + j ä r j e s t ö i h i n + j ä r j e s t ö i l l e + j ä r j e s t ö i l l e e n + j ä r j e s t ö i l l ä + j ä r j e s t ö i s s ä + j ä r j e s t ö i s t ä + j ä r j e s t ö j e n + j ä r j e s t ö j e n k i n + j ä r j e s t ö j o h t a j i l l e + j ä r j e s t ö j ä + j ä r j e s t ö l i i t t o u t u m a t + j ä r j e s t ö n + j ä r j e s t ö n ä + j ä r j e s t ö r a k e n n e t t a a n + j ä r j e s t ö r a k e n t e e n + j ä r j e s t ö r y h m i l l e + j ä r j e s t ö s s ä + j ä r j e s t ö t + j ä r j e s t ö t a s o l l a + j ä r j e s t ö t k i n + j ä r j e s t ö t o i m i n n a l l a + j ä r j e s t ö t o i m i n t a + j ä r j e s t ö t o i m i n t a a + j ä r j e s t ö t o i m i n t a a n + j ä r j e s t ö v e r k o s t o + j ä r j e s t ö ä + j ä r j e t t ö m i i n + j ä r j e t t ö m i l l ä + j ä r j e t t ö m i m m i s t ä + j ä r j e t t ö m i ä + j ä r j e t t ö m y y k s i i n + j ä r j e t t ö m y y t e e n + j ä r j e t t ö m y y t t ä + j ä r j e t t ö m ä l t ä + j ä r j e t t ö m ä m m ä k s i + j ä r j e t t ö m ä m m ä l t ä + j ä r j e t t ö m ä m p i ä + j ä r j e t t ö m ä m p ä ä + j ä r j e t t ö m ä n + j ä r j e t t ö m ä s s ä + j ä r j e t t ö m ä s t ä + j ä r j e t t ö m ä ä n + j ä r j e t ö n t ä + j ä r j i l t ä m m e + j ä r k e e n + j ä r k e e n k ä y p ä ä + j ä r k e i l y l l e + j ä r k e i s t ä m i s a l o i t t e e n + j ä r k e i s t ä m i s e k s i + j ä r k e i s t ä m i s e s t ä + j ä r k e i s t ä m i s h a n k e + j ä r k e i s t ä m i s h a n k e t t a + j ä r k e i s t ä m i s p y r k i m y s t e n + j ä r k e i s t ä m i s t o i m i i n + j ä r k e i s t ä m i s t ä + j ä r k e i s t ä m i s y r i t y k s i ä + j ä r k e i s t ä m ä ä n + j ä r k e i s t ä ä + j ä r k e i s t ä ä k s e e n + j ä r k e v i e n + j ä r k e v i i n + j ä r k e v i m m i l l e + j ä r k e v i m m i n + j ä r k e v i m m i s t ä + j ä r k e v i m m ä l t ä + j ä r k e v i n + j ä r k e v i n t ä + j ä r k e v i n ä + j ä r k e v i s t ä + j ä r k e v i ä + j ä r k e v y y d e n + j ä r k e v y y d e s t ä + j ä r k e v y y s s y i s t ä + j ä r k e v y y t t ä + j ä r k e v ä k s i + j ä r k e v ä l l ä + j ä r k e v ä l t ä + j ä r k e v ä m m i k s i + j ä r k e v ä m m i l l ä + j ä r k e v ä m m ä k s i + j ä r k e v ä m m ä l l ä + j ä r k e v ä m m ä l t ä + j ä r k e v ä m m ä n + j ä r k e v ä m m ä s t ä + j ä r k e v ä m m ä t + j ä r k e v ä m p i + j ä r k e v ä m p i e n + j ä r k e v ä m p i ä + j ä r k e v ä m p ä n ä + j ä r k e v ä m p ä ä + j ä r k e v ä m p ä ä n + j ä r k e v ä n + j ä r k e v ä n ä + j ä r k e v ä s s ä + j ä r k e v ä s t ä + j ä r k e v ä t + j ä r k e v ä t k i n + j ä r k e v ä ä + j ä r k e v ä ä k ä ä n + j ä r k e v ä ä n + j ä r k e ä + j ä r k e ä ä n + j ä r k i i m m e + j ä r k i i n s ä + j ä r k i k i n + j ä r k i p e r u s t e i t a + j ä r k i p e r ä i s e m m ä k s i + j ä r k i p e r ä i s e m m ä n + j ä r k i p e r ä i s e m p i + j ä r k i p e r ä i s e m p ä ä + j ä r k i p e r ä i s e n ä + j ä r k i p e r ä i s t ä m i s e n + j ä r k i p e r ä i s t ä m i s p r o s e s s i s t a + j ä r k i p e r ä i s t ä m ä ä n + j ä r k i p e r ä i s t ä ä + j ä r k i p o h j a l t a + j ä r k i p u h e t t a + j ä r k i s y i s t ä + j ä r k i s y i t ä + j ä r k k y m ä t t ö m ä n + j ä r k y t e t t y ä + j ä r k y t t i + j ä r k y t t i v ä t + j ä r k y t t y n e e n ä + j ä r k y t t y n e i t ä + j ä r k y t t ä m ä t t ä + j ä r k y t t ä n e e t + j ä r k y t t ä n y t + j ä r k y t t ä v i e n + j ä r k y t t ä v i m m i s t ä + j ä r k y t t ä v i m m ä n + j ä r k y t t ä v i m m ä t + j ä r k y t t ä v i m p i ä + j ä r k y t t ä v i n + j ä r k y t t ä v i n t ä + j ä r k y t t ä v i s t ä + j ä r k y t t ä v i ä + j ä r k y t t ä v ä l l ä + j ä r k y t t ä v ä m m ä k s i + j ä r k y t t ä v ä m p i + j ä r k y t t ä v ä m p i ä + j ä r k y t t ä v ä m p ä ä + j ä r k y t t ä v ä n + j ä r k y t t ä v ä s t ä + j ä r k y t t ä v ä t + j ä r k y t t ä v ä ä + j ä r k y t t ä ä + j ä r k y t y i m m e + j ä r k y t y k s e k s e n i + j ä r k y t y k s e n + j ä r k y t y k s i ä + j ä r k ä h t ä m ä t t ä + j ä r v e ä + j ä r v i e n + j ä r v i h i r v i ö + j ä r v i k a l o i s s a + j ä r v i k o i s a + j ä r v i k o r t e + j ä r v i k o u l u + j ä r v i s i e n i + j ä r v i s y y h y + j ä r v i s ä t k i n + j ä r v i v e t t ä + j ä s e n a l u e e l l a + j ä s e n a l u e e l t a m m e + j ä s e n e e n + j ä s e n e h d o k a s + j ä s e n e h d o k a s k a u p u n k i e n + j ä s e n e h d o k a s m a a + j ä s e n e h d o k a s m a a k s i + j ä s e n e h d o k a s m a a l l a + j ä s e n e h d o k a s m a a n a + j ä s e n e h d o k a s m a a s s a + j ä s e n e h d o k a s m a a s t a + j ä s e n e h d o k a s m a a t + j ä s e n e h d o k a s m a a t a + j ä s e n e h d o k a s m a i d e n + j ä s e n e h d o k a s m a i h i n + j ä s e n e h d o k a s m a i l l e + j ä s e n e h d o k a s m a i l t a + j ä s e n e h d o k a s m a i s s a + j ä s e n e h d o k a s m a i s s a k i n + j ä s e n e h d o k a s m a i s t a + j ä s e n e h d o k a s m a i t a + j ä s e n e h d o k a s r y h m ä n + j ä s e n e h d o k a s t a + j ä s e n e h d o k a s v a l t i o + j ä s e n e h d o k a s v a l t i o i d e n + j ä s e n e h d o k a s v a l t i o i h i n + j ä s e n e h d o k a s v a l t i o i l l a + j ä s e n e h d o k a s v a l t i o i l l e + j ä s e n e h d o k a s v a l t i o i n a + j ä s e n e h d o k a s v a l t i o i s s a + j ä s e n e h d o k a s v a l t i o i s t a + j ä s e n e h d o k a s v a l t i o i t a + j ä s e n e h d o k a s v a l t i o k s i + j ä s e n e h d o k a s v a l t i o l t a + j ä s e n e h d o k a s v a l t i o n + j ä s e n e h d o k a s v a l t i o t + j ä s e n e h d o k a s v a l t i o t a + j ä s e n e h d o k k a a l l a + j ä s e n e h d o k k a a l l e + j ä s e n e h d o k k a a n + j ä s e n e h d o k k a a n a + j ä s e n e h d o k k a a n n e + j ä s e n e h d o k k a a t + j ä s e n e h d o k k a i d e n + j ä s e n e h d o k k a i l l e + j ä s e n e h d o k k a i l t a + j ä s e n e h d o k k a i n a + j ä s e n e h d o k k a i s i i n + j ä s e n e h d o k k a i s t a + j ä s e n e h d o k k a i t a + j ä s e n e h d o k k u u d e n + j ä s e n e h d o k k u u d e s t a + j ä s e n e h t o j a + j ä s e n e k s e e n + j ä s e n e k s i + j ä s e n e l l e + j ä s e n e l l ä + j ä s e n e l t ä + j ä s e n e m m e + j ä s e n e n + j ä s e n e n s ä + j ä s e n e n ä + j ä s e n e s s ä + j ä s e n e s t ä + j ä s e n e t + j ä s e n e t k i n + j ä s e n e t k ä ä n + j ä s e n h a k e m u k s e e n + j ä s e n h a k e m u k s e n + j ä s e n h a k e m u k s e n s a + j ä s e n h a k e m u k s i l l e + j ä s e n h a l l i t u s t e n + j ä s e n i e m m e + j ä s e n i e n + j ä s e n i i n + j ä s e n i k s e e n + j ä s e n i k s i + j ä s e n i l l e + j ä s e n i l l e n n e + j ä s e n i l l ä + j ä s e n i l t ä + j ä s e n i n ä + j ä s e n i s t ä + j ä s e n i s t ä m m e + j ä s e n i s t ö s s ä + j ä s e n i ä + j ä s e n i ä m m e + j ä s e n i ä ä n + j ä s e n j o u k o l l a + j ä s e n j ä r j e s t ö i l l e e n + j ä s e n j ä r j e s t ö j e n + j ä s e n k a n d i d a a t t i n a + j ä s e n k a n s o i s t a + j ä s e n k a n s o j a + j ä s e n k a s s a n + j ä s e n k a u d e n + j ä s e n k i i n t i ö n s ä + j ä s e n k i n + j ä s e n k i r k o s t a + j ä s e n k o l l e g a + j ä s e n k o l l e g a a m m e + j ä s e n k o l l e g a a n i + j ä s e n k o l l e g a a n s a + j ä s e n k o l l e g a l l e m m e + j ä s e n k o l l e g a m m e + j ä s e n k o l l e g a n i + j ä s e n k o l l e g a t + j ä s e n k o l l e g o i d e n + j ä s e n k o l l e g o i d e n i + j ä s e n k o l l e g o i h i n + j ä s e n k o l l e g o i h i n i + j ä s e n k o l l e g o i l l a n i + j ä s e n k o l l e g o i l l e m m e + j ä s e n k o l l e g o i l l e n i + j ä s e n k o l l e g o i l t a n i + j ä s e n k o l l e g o i n a m m e + j ä s e n k o l l e g o i s t a n i + j ä s e n k o l l e g o i t a + j ä s e n k o l l e g o i t a n i + j ä s e n k o l l e g o j a + j ä s e n k o l l e g o j a a n + j ä s e n k o l l e g o j a n i + j ä s e n k o l l e g o j e m m e + j ä s e n k o l l e g o j e n + j ä s e n k o l l e g o j e n i + j ä s e n k o r t t i a + j ä s e n l u e t t e l o + j ä s e n l u e t t e l o o n + j ä s e n m a a + j ä s e n m a a h a n + j ä s e n m a a l l a + j ä s e n m a a l l e + j ä s e n m a a l t a + j ä s e n m a a m m e + j ä s e n m a a n + j ä s e n m a a n a + j ä s e n m a a s s a + j ä s e n m a a s t a + j ä s e n m a a t + j ä s e n m a a t a + j ä s e n m a a t k i n + j ä s e n m a i d e m m e + j ä s e n m a i d e n + j ä s e n m a i d e n k i n + j ä s e n m a i d e n s a + j ä s e n m a i h i m m e + j ä s e n m a i h i n + j ä s e n m a i l l a + j ä s e n m a i l l e + j ä s e n m a i l l e k i n + j ä s e n m a i l t a + j ä s e n m a i s s a + j ä s e n m a i s s a m m e + j ä s e n m a i s t a + j ä s e n m a i t a + j ä s e n m a i t t e n + j ä s e n m a k s u + j ä s e n m a k s u a + j ä s e n m a k s u a l e n n u k s e n + j ä s e n m a k s u i l l a + j ä s e n m a k s u i n a + j ä s e n m a k s u j a + j ä s e n m a k s u j e n + j ä s e n m a k s u n a + j ä s e n m a k s u p a l a u t u k s i a + j ä s e n m a k s u r a h o i t u k s e n + j ä s e n m a k s u s t a a n + j ä s e n m a k s u t + j ä s e n m a k s u v a r o j a + j ä s e n m a m i l l e + j ä s e n m ä ä r ä + j ä s e n m ä ä r ä l l e + j ä s e n m ä ä r ä l l ä + j ä s e n m ä ä r ä l t ä ä n + j ä s e n m ä ä r ä n + j ä s e n m ä ä r ä n s ä + j ä s e n m ä ä r ä ä + j ä s e n n e l l y m m i n + j ä s e n n e l l y m m ä l l e + j ä s e n n e l l y m p i + j ä s e n n e l l y m p ä ä + j ä s e n n e l l y m p ä ä n + j ä s e n n e l l y n + j ä s e n n e l t y + j ä s e n n e t t y j ä + j ä s e n n e t y m m ä s t ä + j ä s e n n e t y m p ä ä + j ä s e n n e t ä ä n + j ä s e n n e u v o t t e l u i s s a + j ä s e n n i m i t y k s e t + j ä s e n n u m e r o + j ä s e n o r g a n i s a a t i o k s i + j ä s e n o r g a n i s a a t i o n + j ä s e n p u o l u e e t + j ä s e n p u o l u e i t a m m e + j ä s e n r y h m ä ä + j ä s e n t a l t i o i s s a + j ä s e n t e m m e + j ä s e n t e n + j ä s e n t e n k i n + j ä s e n t e n k o l l e g i o l t a + j ä s e n t e n s ä + j ä s e n t o v e r e i d e n i + j ä s e n t o v e r i a m m e + j ä s e n t y m i n e n + j ä s e n t y n e e m m i n + j ä s e n t y n e e m m ä n + j ä s e n t y n e i l t ä + j ä s e n t y n y t t ä + j ä s e n t ä + j ä s e n t ä k i n + j ä s e n t ä m i s e k s i + j ä s e n t ä n s ä + j ä s e n v a l i o i d e n + j ä s e n v a l i o i l l e + j ä s e n v a l i o i s s a + j ä s e n v a l i o n + j ä s e n v a l i o t + j ä s e n v a l t i o + j ä s e n v a l t i o a l o i t t e e n + j ä s e n v a l t i o e h d o k a s + j ä s e n v a l t i o e h d o k k a a n + j ä s e n v a l t i o e h d o k k a a n a + j ä s e n v a l t i o e h d o k k a a t + j ä s e n v a l t i o e h d o k k a i d e n + j ä s e n v a l t i o e h d o k k a i l l a + j ä s e n v a l t i o e h d o k k a i t a + j ä s e n v a l t i o i d e m m e + j ä s e n v a l t i o i d e n + j ä s e n v a l t i o i d e n h a n + j ä s e n v a l t i o i d e n k a a n + j ä s e n v a l t i o i d e n k i n + j ä s e n v a l t i o i d e n k o + j ä s e n v a l t i o i d e n n e + j ä s e n v a l t i o i d e n s a + j ä s e n v a l t i o i h i m m e + j ä s e n v a l t i o i h i n + j ä s e n v a l t i o i h i n n e + j ä s e n v a l t i o i h i n s a + j ä s e n v a l t i o i k s e e n + j ä s e n v a l t i o i k s i + j ä s e n v a l t i o i l l a + j ä s e n v a l t i o i l l a k a a n + j ä s e n v a l t i o i l l a k i n + j ä s e n v a l t i o i l l a m m e + j ä s e n v a l t i o i l l e + j ä s e n v a l t i o i l l e e n + j ä s e n v a l t i o i l l e h a n + j ä s e n v a l t i o i l l e k a a n + j ä s e n v a l t i o i l l e k i n + j ä s e n v a l t i o i l l e m m e + j ä s e n v a l t i o i l t a + j ä s e n v a l t i o i l t a a n + j ä s e n v a l t i o i l t a k a a n + j ä s e n v a l t i o i l t a k i n + j ä s e n v a l t i o i l t a m m e + j ä s e n v a l t i o i n + j ä s e n v a l t i o i n a + j ä s e n v a l t i o i n e e n + j ä s e n v a l t i o i s s a + j ä s e n v a l t i o i s s a a n + j ä s e n v a l t i o i s s a h a n + j ä s e n v a l t i o i s s a k a a n + j ä s e n v a l t i o i s s a k i n + j ä s e n v a l t i o i s s a m m e + j ä s e n v a l t i o i s s a n n e + j ä s e n v a l t i o i s t a + j ä s e n v a l t i o i s t a a n + j ä s e n v a l t i o i s t a m m e + j ä s e n v a l t i o i t a + j ä s e n v a l t i o i t a a n + j ä s e n v a l t i o i t a k i n + j ä s e n v a l t i o i t a m m e + j ä s e n v a l t i o i t t e m m e + j ä s e n v a l t i o i t t e n + j ä s e n v a l t i o i t t e n s a + j ä s e n v a l t i o k i n + j ä s e n v a l t i o k o h t a i n e n + j ä s e n v a l t i o k o h t a i s e s t i + j ä s e n v a l t i o k o h t a i s e t + j ä s e n v a l t i o k o h t a i s i a + j ä s e n v a l t i o k o h t a i s i s t a + j ä s e n v a l t i o k o h t a i s t a + j ä s e n v a l t i o k o h t a i s t e n + j ä s e n v a l t i o k o l l e g a a m m e + j ä s e n v a l t i o k o l l e g a l l e m m e + j ä s e n v a l t i o k s i + j ä s e n v a l t i o k y n n y k s i ä + j ä s e n v a l t i o l l a + j ä s e n v a l t i o l l a k a a n + j ä s e n v a l t i o l l e + j ä s e n v a l t i o l l e k i n + j ä s e n v a l t i o l l e m m e + j ä s e n v a l t i o l t a + j ä s e n v a l t i o m m e + j ä s e n v a l t i o n + j ä s e n v a l t i o n a + j ä s e n v a l t i o n i + j ä s e n v a l t i o n k a a n + j ä s e n v a l t i o n k i n + j ä s e n v a l t i o n n e + j ä s e n v a l t i o n s a + j ä s e n v a l t i o o m m e + j ä s e n v a l t i o o n + j ä s e n v a l t i o o n s a + j ä s e n v a l t i o r y h m ä n + j ä s e n v a l t i o r y h m ä ä + j ä s e n v a l t i o s s a + j ä s e n v a l t i o s s a a n + j ä s e n v a l t i o s s a k i n + j ä s e n v a l t i o s s a m m e + j ä s e n v a l t i o s s a n i + j ä s e n v a l t i o s t a + j ä s e n v a l t i o s t a a n + j ä s e n v a l t i o t + j ä s e n v a l t i o t a + j ä s e n v a l t i o t a a n + j ä s e n v a l t i o t a m m e + j ä s e n v a l t i o t a s o a + j ä s e n v a l t i o t a s o l l a + j ä s e n v a l t i o t a s o n + j ä s e n v a l t i o t h a n + j ä s e n v a l t i o t k a a n + j ä s e n v a l t i o t k i n + j ä s e n v a l t i o t t a + j ä s e n v a l t i s s a + j ä s e n v a l t o i h i n + j ä s e n v a l t o j e n + j ä s e n v e l v o i t t e e n s a + j ä s e n y y d e l l e + j ä s e n y y d e n + j ä s e n y y d e s t ä + j ä s e n y y d e s t ä ä n + j ä s e n y y s a n o m u k s e n s a + j ä s e n y y s a n o m u k s e s t a + j ä s e n y y s a n o m u s + j ä s e n y y s e d e l l y t y k s e t + j ä s e n y y s e d e l l y t y k s i ä + j ä s e n y y s e d e l l y t y s t e n + j ä s e n y y s e h d o i s t a + j ä s e n y y s e h d o k a s m a a t + j ä s e n y y s e h d o k a s m a i d e n + j ä s e n y y s e h d o k k a a l l e + j ä s e n y y s e h d o k k a a n + j ä s e n y y s e h d o k k a a t + j ä s e n y y s e h d o k k a i d e n + j ä s e n y y s e h d o k k u u d e n + j ä s e n y y s e h d o k k u u d e s t a + j ä s e n y y s e h d o t + j ä s e n y y s e h t o + j ä s e n y y s e h t o i h i n + j ä s e n y y s e h t o j a + j ä s e n y y s e h t o j a a n + j ä s e n y y s e h t o j e n + j ä s e n y y s e t u j a + j ä s e n y y s h a k e m u k s e e n + j ä s e n y y s h a k e m u k s e l l e + j ä s e n y y s h a k e m u k s e m m e + j ä s e n y y s h a k e m u k s e n + j ä s e n y y s h a k e m u k s e n s a + j ä s e n y y s h a k e m u k s e s s a + j ä s e n y y s h a k e m u k s e s t a + j ä s e n y y s h a k e m u k s e t + j ä s e n y y s h a k e m u k s i a + j ä s e n y y s h a k e m u k s i s t a + j ä s e n y y s h a k e m u s + j ä s e n y y s h a k e m u s t a + j ä s e n y y s k a n n u s t i m e n + j ä s e n y y s k a u d e n + j ä s e n y y s k e h i t y s + j ä s e n y y s k e l p o i s u u d e n + j ä s e n y y s k r i t e e r e i d e n + j ä s e n y y s k r i t e e r e i h i n + j ä s e n y y s k r i t e e r e i t ä + j ä s e n y y s k r i t e e r e j ä + j ä s e n y y s k r i t e e r i + j ä s e n y y s k r i t e e r i e n + j ä s e n y y s k r i t e e r i k s i + j ä s e n y y s k r i t e e r i t + j ä s e n y y s k y s y m y k s e s s ä + j ä s e n y y s l a s k u + j ä s e n y y s l u p a u k s e n + j ä s e n y y s m a h d o l l i s u u d e t + j ä s e n y y s m a h d o l l i s u u k s i a + j ä s e n y y s m a h d o l l i s u u k s i e n + j ä s e n y y s m a h d o l l i s u u s + j ä s e n y y s m a h d o l l i s u u t t a + j ä s e n y y s m a k s u a + j ä s e n y y s m a k s u n + j ä s e n y y s n e u v o t t e l u + j ä s e n y y s n e u v o t t e l u i d e m m e + j ä s e n y y s n e u v o t t e l u i d e n + j ä s e n y y s n e u v o t t e l u i h i n + j ä s e n y y s n e u v o t t e l u i l l e + j ä s e n y y s n e u v o t t e l u i s s a + j ä s e n y y s n e u v o t t e l u i s t a + j ä s e n y y s n e u v o t t e l u i t a + j ä s e n y y s n e u v o t t e l u j a + j ä s e n y y s n e u v o t t e l u j e n + j ä s e n y y s n e u v o t t e l u k i e r r o s + j ä s e n y y s n e u v o t t e l u n s a + j ä s e n y y s n e u v o t t e l u p r o s e s s i n + j ä s e n y y s n e u v o t t e l u s s a + j ä s e n y y s n e u v o t t e l u s t a + j ä s e n y y s n e u v o t t e l u t + j ä s e n y y s n ä k y m i e n + j ä s e n y y s n ä k y m i i n + j ä s e n y y s n ä k y m i l l e + j ä s e n y y s n ä k y m i l l ä + j ä s e n y y s n ä k y m i s t ä + j ä s e n y y s n ä k y m i ä + j ä s e n y y s n ä k y m ä + j ä s e n y y s n ä k y m ä n + j ä s e n y y s o i k e u k s i e n + j ä s e n y y s p e r s p e k t i i v i + j ä s e n y y s p r o s e s s i n + j ä s e n y y s p r o s e s s i s s a + j ä s e n y y s p y r k i m y k s e t + j ä s e n y y s p y r k i m y k s i l l e + j ä s e n y y s p y r k i m y k s i s s ä + j ä s e n y y s p y r k i m y k s i s t ä + j ä s e n y y s p y r k i m y k s i ä + j ä s e n y y s s o p i m u k s e n s a + j ä s e n y y s s o p i m u k s e s t a + j ä s e n y y s s o p i m u s + j ä s e n y y s s o p i m u s t e n + j ä s e n y y s t a v o i t t e i l l e + j ä s e n y y s t o i v e i d e n + j ä s e n y y s t o i v e i t a + j ä s e n y y s v a a t i m u k s e t + j ä s e n y y s v a a t i m u k s i a + j ä s e n y y s v a a t i m u k s i i n + j ä s e n y y s v a a t i m u k s i s t a + j ä s e n y y s v a l m e n n u s o h j e l m a n + j ä s e n y y s v a l m i s t e l u i h i n + j ä s e n y y s v a l m i s t e l u i l l e + j ä s e n y y s v a l m i s t e l u i s s a + j ä s e n y y s v a l m i s t e l u i s s a a n + j ä s e n y y s v a l m i s t e l u i t a + j ä s e n y y s v a l m i s t e l u j a + j ä s e n y y s v a l m i s t e l u j e n + j ä s e n y y s v a l m i s t e l u t + j ä s e n y y s v e l v o i t t e e t + j ä s e n y y s v e l v o i t t e i d e n + j ä s e n y y s v e l v o i t t e i s i i n + j ä s e n y y s v e l v o i t t e i s t a + j ä s e n y y s v e l v o i t t e i s t a a n + j ä s e n y y s ä ä n e s t y k s e s s ä + j ä s e n y y t e e n + j ä s e n y y t t ä + j ä t e a i n e e l l a + j ä t e a i n e i d e n + j ä t e a i n e i l l e + j ä t e a i n e i t a + j ä t e a i n e k s e n + j ä t e a l a l l a + j ä t e a l a l l e + j ä t e a l a n + j ä t e a l t a a n + j ä t e a l t a a t + j ä t e a l t a i d e n + j ä t e a l t a i s t a + j ä t e a l t a i t a + j ä t e a l u e e t + j ä t e a l u e i d e n + j ä t e a l u e i s i i n + j ä t e a l u e i s t a + j ä t e a l u e i t a + j ä t e a l u k s e l l e + j ä t e a l u s + j ä t e a s i a t + j ä t e a s i o i s s a + j ä t e a s i o i s t a + j ä t e a u t o + j ä t e d i r e k t i i v i + j ä t e d i r e k t i i v i i n + j ä t e d i r e k t i i v i k s i + j ä t e d i r e k t i i v i n + j ä t e d i r e k t i i v i s s ä + j ä t e d i r e k t i i v i s t ä + j ä t e d i r e k t i i v i ä + j ä t e h a l l i n n o n + j ä t e h i e r a r k i a + j ä t e h i e r a r k i a a + j ä t e h i e r a r k i a a n + j ä t e h i e r a r k i a l l e + j ä t e h i e r a r k i a n + j ä t e h i e r a r k i a s s a + j ä t e h u o l l o l l a + j ä t e h u o l l o l l e + j ä t e h u o l l o n + j ä t e h u o l l o s s a + j ä t e h u o l l o s t a + j ä t e h u o l t o + j ä t e h u o l t o a + j ä t e h u o l t o a a n + j ä t e h u o l t o a l a l l a + j ä t e h u o l t o a m m e + j ä t e h u o l t o a s e t u k s e n + j ä t e h u o l t o a s e t u k s i i n + j ä t e h u o l t o a s e t u s t e n + j ä t e h u o l t o a s i o i t a + j ä t e h u o l t o d i r e k t i i v i e n + j ä t e h u o l t o d i r e k t i i v i ä + j ä t e h u o l t o e h d o t u k s i a + j ä t e h u o l t o f o o r u m i n + j ä t e h u o l t o h a n k k e i d e n + j ä t e h u o l t o h a n k k e i l l e + j ä t e h u o l t o h a n k k e i s i i n + j ä t e h u o l t o h a n k k e i t a + j ä t e h u o l t o h i e r a r k i a + j ä t e h u o l t o i n f r a s t r u k t u u r i + j ä t e h u o l t o j ä r j e s t e l m i e n + j ä t e h u o l t o j ä r j e s t e l m ä + j ä t e h u o l t o j ä r j e s t e l m ä n + j ä t e h u o l t o j ä r j e s t e l m ä n s ä + j ä t e h u o l t o k r i i s i n + j ä t e h u o l t o k r i i s i s t ä + j ä t e h u o l t o k y s y m y s t e n + j ä t e h u o l t o l a i t o k s e n a + j ä t e h u o l t o l a k i + j ä t e h u o l t o m a k s u j e n + j ä t e h u o l t o m a r k k i n o i t a + j ä t e h u o l t o m e n e t e l m ä t + j ä t e h u o l t o n o r m i t + j ä t e h u o l t o n s a + j ä t e h u o l t o o n + j ä t e h u o l t o p a l v e l u j a + j ä t e h u o l t o p o l i t i i k a s s a + j ä t e h u o l t o p o l i t i i k k a + j ä t e h u o l t o p o l i t i i k k a a + j ä t e h u o l t o p o l i t i i k k a a n + j ä t e h u o l t o r a t k a i s u j a + j ä t e h u o l t o r a t k a i s u n a + j ä t e h u o l t o s t r a t e g i a + j ä t e h u o l t o s t r a t e g i a a + j ä t e h u o l t o s t r a t e g i a n + j ä t e h u o l t o s t r a t e g i o i l l e + j ä t e h u o l t o s t r a t e g i o i s s a + j ä t e h u o l t o s t r a t e g i o i t a + j ä t e h u o l t o s u u n n i t e l m a + j ä t e h u o l t o s u u n n i t e l m a a + j ä t e h u o l t o s u u n n i t e l m a n + j ä t e h u o l t o s u u n n i t e l m a s t a + j ä t e h u o l t o s u u n n i t e l m a t + j ä t e h u o l t o s u u n n i t e l m i a + j ä t e h u o l t o s u u n n i t e l m i e n + j ä t e h u o l t o s u u n n i t e l m i s s a + j ä t e h u o l t o s ä ä n n ö k s i ä + j ä t e h u o l t o t e o l l i s u u d e s s a + j ä t e h u o l t o t i l a n n e + j ä t e h u o l t o t i l a n t e e n + j ä t e h u o l t o t o i m i a + j ä t e h u o l t o t o i m i n t o j e n + j ä t e h u o l t o y r i t y s + j ä t e i n d i k a a t t o r e i d e n + j ä t e i n f r a s t r u k t u u r i n + j ä t e j ä r j e s t e l m ä + j ä t e j ä r j e s t e l m ä s s ä + j ä t e j ä r v e t + j ä t e k a a s u i l l e k i n + j ä t e k a a s u i s t a + j ä t e k a s a n + j ä t e k a t a s t r o f i + j ä t e k a u p a n + j ä t e k a u p p a a + j ä t e k i e r r o n + j ä t e k r i i s i + j ä t e k r i i s i i n + j ä t e k r i i s i n + j ä t e k r i i s i s s ä + j ä t e k r i i s i s t ä + j ä t e k r i i s i ä + j ä t e k u l j e t u k s e t + j ä t e k u l j e t u k s i a + j ä t e k y s y m y k s e e n + j ä t e k y s y m y k s e n + j ä t e k y s y m y k s e s t ä + j ä t e k y s y m y k s i i n + j ä t e k y s y m y k s i s s ä + j ä t e k y s y m y s + j ä t e k y s y m y s t ä + j ä t e l a a t u j a + j ä t e l a i n + j ä t e l a i n s ä ä d ä n n ö k s i + j ä t e l a i n s ä ä d ä n n ö l l e + j ä t e l a i n s ä ä d ä n n ö n + j ä t e l a i n s ä ä d ä n n ö s s ä + j ä t e l a i n s ä ä d ä n t ö + j ä t e l a i n s ä ä d ä n t ö ä + j ä t e l a i n s ä ä d ä n t ö ö n + j ä t e l a i t o s t e n + j ä t e l a j i n + j ä t e l a k e j a + j ä t e l a k i a + j ä t e l i e j u n + j ä t e l i e j u s t a + j ä t e l i e t e + j ä t e l i e t e t t ä + j ä t e l i e t t e e n + j ä t e l i e t t e e s t ä + j ä t e l i e t t e e t + j ä t e l u e t t e l o a + j ä t e l u o k k i i n + j ä t e m a f i a n + j ä t e m a k s u + j ä t e m a r k k i n o i l l a + j ä t e m a t e r i a a l i e n + j ä t e m a t e r i a a l i n + j ä t e m a t k a i l u n + j ä t e m u o t o + j ä t e m ä ä r i e n + j ä t e m ä ä r i i n + j ä t e m ä ä r ä + j ä t e m ä ä r ä n + j ä t e m ä ä r ä t + j ä t e m ä ä r ä ä + j ä t e n ä k ö k u l m a s t a + j ä t e o n g e l m a + j ä t e o n g e l m a a + j ä t e o n g e l m a a m m e + j ä t e o n g e l m a a n + j ä t e o n g e l m a a n s a + j ä t e o n g e l m a m m e + j ä t e o n g e l m a n + j ä t e o n g e l m a s t a + j ä t e o n g e l m a t + j ä t e o n g e l m i a + j ä t e o n g e l m i a a n + j ä t e p a d o i s s a + j ä t e p a l l o j e n + j ä t e p a p e r i a + j ä t e p a p e r i n + j ä t e p o l i t i i k a l l a + j ä t e p o l i t i i k a n + j ä t e p o l i t i i k a s s a + j ä t e p o l i t i i k k a + j ä t e p o l i t i i k k a a + j ä t e p o l i t i i k k a a n + j ä t e p o l i t i i k k o j e n + j ä t e p u i t e d i r e k t i i v i n + j ä t e p u i t e d i r e k t i i v i ä + j ä t e p u s s e j a + j ä t e p y ö r r e + j ä t e p ä ä s t ö i s t ä + j ä t e p ä ä s t ö j ä + j ä t e r a a k a + j ä t e r i k o k s e t + j ä t e r i k o s t e n + j ä t e r u o k i n n a n + j ä t e s e k t o r i a + j ä t e s i i r r o t + j ä t e s i i r t o a + j ä t e s i i r t o a s e t u k s e n + j ä t e s i i r t o a s e t u s t a + j ä t e s i i r t o j e n + j ä t e s t r a t e g i a + j ä t e s t r a t e g i o i d e n + j ä t e s u u n n i t e l m a + j ä t e s u u n n i t e l m a n + j ä t e s ä i l i ö i s t ä + j ä t e t e k n i i k o i t a + j ä t e t i l a n n e + j ä t e t i l a s t o i s t a + j ä t e t o n n i n + j ä t e t t i i n + j ä t e t t y + j ä t e t t y j e n + j ä t e t t ä + j ä t e t t ä i s i + j ä t e t t ä k ö ö n + j ä t e t u l v a s t a + j ä t e t u n k i o l l e + j ä t e t u o t e + j ä t e t u o t t e e t + j ä t e t u o t t e i d e n + j ä t e t u o t t e i l l e + j ä t e t u o t t e i s t a + j ä t e t u o t t e i t a + j ä t e t u r i s m i k s i + j ä t e t u r i s m i n + j ä t e t y i l l ä + j ä t e t y n + j ä t e t y t + j ä t e t y y p e i l l e + j ä t e t y y p i t + j ä t e t y y p p e j ä + j ä t e t y y p p i e n + j ä t e t ä + j ä t e t ä ä n + j ä t e t ä ä n k ö + j ä t e t ä ä n p ä + j ä t e u u n i l a i t o k s i s t a + j ä t e v a a t i m u s t e n + j ä t e v a l v o n t a j ä r j e s t e l m ä + j ä t e v a s t u u s e e n s a + j ä t e v e d e n + j ä t e v e d e n k ä s i t t e l y + j ä t e v e d e n k ä s i t t e l y l a i t o k s e t + j ä t e v e d e n k ä s i t t e l y l a i t o s + j ä t e v e d e n k ä s i t t e l y y n + j ä t e v e d e n p u h d i s t a m o + j ä t e v e d e n p u h d i s t a m o i d e n + j ä t e v e d e n p u h d i s t a m o i l l a + j ä t e v e d e n p u h d i s t a m o i s s a + j ä t e v e d e n p u h d i s t a m o i t a + j ä t e v e d e n p u h d i s t a m o j a + j ä t e v e d e n p u h d i s t a m o n + j ä t e v e d e n p u h d i s t u s + j ä t e v e d e n p u h d i s t u s l a i t o s + j ä t e v e d e s t ä + j ä t e v e d e t + j ä t e v e r k o t + j ä t e v e r o + j ä t e v e r o j a + j ä t e v e r o n + j ä t e v e s i + j ä t e v e s i a l a l l a + j ä t e v e s i a l a n + j ä t e v e s i a l l a s + j ä t e v e s i d i r e k t i i v i + j ä t e v e s i e n + j ä t e v e s i h a n k e t t a + j ä t e v e s i h u o l l o n + j ä t e v e s i h u o l t o + j ä t e v e s i h u o l t o a + j ä t e v e s i j ä r j e s t e l m i s s ä m m e + j ä t e v e s i j ä r j e s t e l m ä n + j ä t e v e s i l i e t e + j ä t e v e s i l i e t e t t ä + j ä t e v e s i l i e t t e e l l e + j ä t e v e s i l i e t t e e n + j ä t e v e s i p u m p u n + j ä t e v e s i s t ä + j ä t e v e s i v e r k o s t o j e n + j ä t e v e s i v e r o + j ä t e v e s i ä + j ä t e v e t e e n + j ä t e v e t e n s ä + j ä t e v e t e n ä + j ä t e v e t t ä + j ä t e v i e n t i a s e t u k s e n + j ä t e v i e n t i a s e t u s t a + j ä t e v i r r a n + j ä t e v i r r a s s a + j ä t e v i r r a s t a + j ä t e v i r r a t + j ä t e v i r r o i l l e + j ä t e v i r r o i s t a + j ä t e v i r t a + j ä t e v i r t a a + j ä t e v i r t a a n + j ä t e v i r t a n a + j ä t e v i r t o j a + j ä t e v i r t o j e n + j ä t e v u o r e m m e + j ä t e v u o r e n + j ä t e v u o r i + j ä t e v u o r i s t a + j ä t e v u o r t a + j ä t e y h t i ö + j ä t e ö l j y + j ä t e ö l j y d i r e k t i i v i ä + j ä t e ö l j y j e n + j ä t e ö l j y j ä + j ä t e ö l j y n + j ä t e ö l j y t + j ä t e ö l j y ä + j ä t i m m e + j ä t t e e k s i + j ä t t e e n + j ä t t e e n h ä v i t y s j ä r j e s t e l m ä n + j ä t t e e n k a a t o p a i k o i l l a + j ä t t e e n k e r ä y s + j ä t t e e n k e r ä y s i n f r a s t r u k t u u r i + j ä t t e e n k e r ä y s j ä r j e s t e l m i ä + j ä t t e e n k e r ä y s j ä r j e s t e l m ä t + j ä t t e e n k e r ä y s p a i k k o j e n + j ä t t e e n k e r ä ä j i ä + j ä t t e e n k i e r r ä t y s l a i t o s t a + j ä t t e e n k i e r r ä t y s o h j e l m i a + j ä t t e e n k u l j e t u s + j ä t t e e n k ä s i t t e l y + j ä t t e e n k ä s i t t e l y a l a + j ä t t e e n k ä s i t t e l y a l a n + j ä t t e e n k ä s i t t e l y k ä y t ä n n ö t + j ä t t e e n k ä s i t t e l y l a i t o k s e t + j ä t t e e n k ä s i t t e l y l a i t o k s i a + j ä t t e e n k ä s i t t e l y l a i t o k s i i n + j ä t t e e n k ä s i t t e l y l a i t o s t e n + j ä t t e e n k ä s i t t e l y l a i t t e e t + j ä t t e e n k ä s i t t e l y l a i t t e i s t o t + j ä t t e e n k ä s i t t e l y m e n e t e l m ä t + j ä t t e e n k ä s i t t e l y m u o t o a + j ä t t e e n k ä s i t t e l y n + j ä t t e e n k ä s i t t e l y p a i k k o i h i n + j ä t t e e n k ä s i t t e l y p a i k k o j e n + j ä t t e e n k ä s i t t e l y p o l i t i i k a n + j ä t t e e n k ä s i t t e l y p o l i t i i k a s s a + j ä t t e e n k ä s i t t e l y p r o s e s s i n + j ä t t e e n k ä s i t t e l y s u u n n i t e l m a + j ä t t e e n k ä s i t t e l y s ä ä n t ö j ä + j ä t t e e n k ä s i t t e l y t a p o j a + j ä t t e e n k ä s i t t e l y v a i h e e s s a + j ä t t e e n k ä s i t t e l y ä + j ä t t e e n l a j i t t e l u a l o j e n + j ä t t e e n l a j i t t e l u s u u n n i t e l m a a + j ä t t e e n p o i s t o s t a + j ä t t e e n p o l t o l l a + j ä t t e e n p o l t o n + j ä t t e e n p o l t o s s a + j ä t t e e n p o l t o s t a + j ä t t e e n p o l t t a j a + j ä t t e e n p o l t t o + j ä t t e e n p o l t t o a + j ä t t e e n p o l t t o d i r e k t i i v i i n + j ä t t e e n p o l t t o d i r e k t i i v i n + j ä t t e e n p o l t t o d i r e k t i i v i s t ä + j ä t t e e n p o l t t o j ä r j e s t e l m ä t + j ä t t e e n p o l t t o k a p a s i t e e t t i a + j ä t t e e n p o l t t o l a i t o k s e n + j ä t t e e n p o l t t o l a i t o k s e s s a + j ä t t e e n p o l t t o l a i t o k s e s t a + j ä t t e e n p o l t t o l a i t o k s e t + j ä t t e e n p o l t t o l a i t o k s i a + j ä t t e e n p o l t t o l a i t o k s i i n + j ä t t e e n p o l t t o l a i t o k s i l l e + j ä t t e e n p o l t t o l a i t o k s i s s a + j ä t t e e n p o l t t o l a i t o k s i s t a + j ä t t e e n p o l t t o l a i t o s + j ä t t e e n p o l t t o l a i t o s t a + j ä t t e e n p o l t t o l a i t o s t e n + j ä t t e e n p o l t t o o n + j ä t t e e n p o l t t o u u n i i n + j ä t t e e n s ä + j ä t t e e n t a l t e e n o t t o j ä r j e s t e l m ä t + j ä t t e e n t o i m i t t a m i s v e l v o l l i s u u s + j ä t t e e n t u o n t i a + j ä t t e e n t u o t a n n o n + j ä t t e e n t u o t t a j i a + j ä t t e e n ä + j ä t t e e s e e n + j ä t t e e s t ä + j ä t t e e t + j ä t t e i d e n + j ä t t e i d e n k e r u u + j ä t t e i d e n k i e r r ä t y s + j ä t t e i d e n k ä s i t t e l y + j ä t t e i d e n k ä s i t t e l y l a i t o k s i l l e + j ä t t e i d e n k ä s i t t e l y l a i t o s + j ä t t e i d e n k ä s i t t e l y l a i t o s t e n + j ä t t e i d e n k ä s i t t e l y m e n e t e l m i ä + j ä t t e i d e n k ä s i t t e l y n + j ä t t e i d e n k ä s i t t e l y o n g e l m a n + j ä t t e i d e n k ä s i t t e l y p o l i t i i k k a a + j ä t t e i d e n k ä s i t t e l y s s ä + j ä t t e i d e n k ä s i t t e l y t o i m i l l a + j ä t t e i d e n l a j i t t e l u s s a + j ä t t e i d e n p o l t t o + j ä t t e i d e n p o l t t o a + j ä t t e i d e n p o l t t o d i r e k t i i v i i n + j ä t t e i d e n p o l t t o l a i t o k s i a + j ä t t e i d e n p o l t t o o n + j ä t t e i d e n p u h d i s t u s + j ä t t e i d e n s i i r t o a s e t u s t a + j ä t t e i l l e + j ä t t e i l l e m m e + j ä t t e i l l ä + j ä t t e i n ä + j ä t t e i s i i n + j ä t t e i s s ä + j ä t t e i s t ä + j ä t t e i t ä + j ä t t i a g a a v e + j ä t t i a s k e l + j ä t t i a s k e l e l l e + j ä t t i a s k e l i n + j ä t t i h a i m o n n i + j ä t t i h a n k e + j ä t t i h a r p p a u k s e n + j ä t t i h y l k y a h v e n + j ä t t i k o l i b r i + j ä t t i k o n n a m o n n i + j ä t t i k o r t e + j ä t t i k u r p i t s a + j ä t t i k u t o j a + j ä t t i k u u k u n e n + j ä t t i l a s k u + j ä t t i l i n t u s i i p i + j ä t t i l ä i s a l b a t r o s s i + j ä t t i l ä i s a s k e l i a + j ä t t i l ä i s e t + j ä t t i l ä i s h a i + j ä t t i l ä i s h i r v i a n t i l o o p p i + j ä t t i l ä i s k a l m a r i t + j ä t t i l ä i s k o a l a + j ä t t i l ä i s l e p a k k o + j ä t t i l ä i s m a j a v a + j ä t t i l ä i s m e t s ä k a r j u + j ä t t i l ä i s m u s t a h e v o s a n t i l o o p p i + j ä t t i l ä i s m u u r a h a i s k ä p y + j ä t t i l ä i s m ä i s e k s i + j ä t t i l ä i s p a t s a a t + j ä t t i l ä i s p l a n e e t t a + j ä t t i l ä i s s a u k k o + j ä t t i l ä i s s i i p p a + j ä t t i l ä i s s i i r a t + j ä t t i l ä i s s i r k k a l i n t u + j ä t t i l ä i s s k i n k k i + j ä t t i l ä i s t a s k u r a p u + j ä t t i l ä i s t ä h t i + j ä t t i l ä i s v y ö t i ä i n e n + j ä t t i m a l i k k a + j ä t t i m a r s k i n l i l j a + j ä t t i m e r i a h v e n + j ä t t i m u n t j a k k i + j ä t t i m y y m ä l ä + j ä t t i m y y m ä l ä n + j ä t t i n a a p u r i n + j ä t t i p a l s a m i + j ä t t i p e i k o n l e h t i + j ä t t i p e r s i k k a + j ä t t i p i h t a + j ä t t i p o i m u l e h t i + j ä t t i p o p p e l i + j ä t t i p o t t i n a + j ä t t i p u t k e t + j ä t t i p u u p i s t i ä i n e n + j ä t t i p ö k k ö v e h k a + j ä t t i r u o k o + j ä t t i s o p i m u k s e e n + j ä t t i s u k e l t a j a + j ä t t i t u i j a + j ä t t i t y ö t t ö m y y d e n + j ä t t i t y ö t t ö m y y s + j ä t t i v o i t t o j a + j ä t t i v ä t + j ä t t i y h t i ö i d e n + j ä t t ä e s s ä m m e + j ä t t ä e s s ä ä n + j ä t t ä i s i v ä t + j ä t t ä k ä ä m m e + j ä t t ä m i s e e n + j ä t t ä m i s e n + j ä t t ä m i s e s t ä + j ä t t ä m i s t ä + j ä t t ä m ä l l ä + j ä t t ä m ä m m e + j ä t t ä m ä n i + j ä t t ä m ä t t ä + j ä t t ä m ä ä n + j ä t t ä n e e t + j ä t t ä n y t + j ä t t ä v ä n + j ä t t ä v ä t + j ä t t ä y t y n y t + j ä t t ä y t y v ä n s ä + j ä t t ä y t y ä + j ä t t ä ä + j ä t t ä ä k s e e n + j ä t t ä ä k ö + j ä t ä m m e k ö + j ä t ä n + j ä t ö k s i ä + j ä y h y y s m o m e n t t i + j ä y k e m m i n + j ä y k e m m ä k s i + j ä y k e m p i + j ä y k e m p i ä + j ä y k i l l ä + j ä y k i s t y m i s e s t ä + j ä y k k i ä + j ä y k k y y t t ä + j ä y k ä k s i + j ä y k ä t + j ä y t ä n e e n + j ä y t ä v ä s t ä + j ä ä a l u e i l l a + j ä ä d e s s ä + j ä ä d y t e t t y i n ä + j ä ä d y t e t y s t ä + j ä ä d y t t ä i s i + j ä ä d y t t ä m i s e e n + j ä ä d y t t ä m i s e n + j ä ä d y t t ä m i s e s s ä + j ä ä d y t t ä m i s e s t ä + j ä ä d y t t ä m i s i ä + j ä ä d y t t ä m i s l a u s e k k e e n + j ä ä d y t t ä m i s p y y n t ö + j ä ä d y t t ä m i s t ä + j ä ä d y t t ä m ä l l ä + j ä ä d y t t ä m ä s s ä + j ä ä d y t t ä m ä ä n + j ä ä d y t t ä ä + j ä ä d y t y s k a p a s i t e e t t i k i n + j ä ä d y t y s k ä s i t t e l y n + j ä ä d y t y s m e k a n i s m i s t a + j ä ä d y t y s p ä ä t ö s + j ä ä d ä k s e e n + j ä ä d ä ä n + j ä ä h a k k u + j ä ä h a l l i + j ä ä h d y t y s a i k o j a + j ä ä h d y t y s a l a a + j ä ä h d y t y s a l a l l a + j ä ä h d y t y s a l u s + j ä ä h d y t y s d i r e k t i i v i ä + j ä ä h d y t y s e l e m e n t t i + j ä ä h d y t y s j ä r j e s t e l m i i n + j ä ä h d y t y s j ä r j e s t e l m i s s ä + j ä ä h d y t y s j ä r j e s t e l m i s t ä + j ä ä h d y t y s j ä r j e s t e l m i ä + j ä ä h d y t y s j ä r j e s t e l m ä + j ä ä h d y t y s j ä r j e s t e l m ä n + j ä ä h d y t y s j ä r j e s t e l m ä s s ä + j ä ä h d y t y s k e t j u + j ä ä h d y t y s l a i t o k s i a + j ä ä h d y t y s l a i t t e e t + j ä ä h d y t y s l a i t t e i d e n + j ä ä h d y t y s l a i t t e i s i i n + j ä ä h d y t y s l a i t t e i t a + j ä ä h d y t y s l e v y + j ä ä h d y t y s n e s t e i t ä + j ä ä h d y t y s p u m p p u j e n + j ä ä h d y t y s t o r n i + j ä ä h d y t y s v e d e n + j ä ä h y l l y + j ä ä h y v ä i s e t + j ä ä h y v ä i s k ä y n n i l l e + j ä ä h y v ä i s l a h j a + j ä ä h y v ä i s p u h e e n i + j ä ä h y v ä i s p u h e e n v u o r o n i + j ä ä h y v ä i s p u h e e s s a a n + j ä ä h y v ä i s p u h e e s s a n n e + j ä ä h y v ä i s p u h e e s t a + j ä ä h y v ä i s p u h e t t a + j ä ä h y v ä i s s a n a n + j ä ä h y v ä i s v i e r a i l u + j ä ä j o g u r t t i + j ä ä j ä r v i + j ä ä k a a p p e j a + j ä ä k a a p p i e n + j ä ä k a a p p i t e o l l i s u u d e n + j ä ä k a i r a u s n ä y t e + j ä ä k a l a + j ä ä k a r h u + j ä ä k a r h u a + j ä ä k a r h u i h i n + j ä ä k a r h u i s s a + j ä ä k a r h u i s t a + j ä ä k a r h u j a + j ä ä k a r h u j e n + j ä ä k a r h u k a n n a s t a + j ä ä k a r h u k a n t a + j ä ä k a r h u n + j ä ä k a r h u s t a + j ä ä k a r h u t + j ä ä k a u d e n + j ä ä k a u s i + j ä ä k a u t t a + j ä ä k e n t t i i n + j ä ä k e r r o k s e t + j ä ä k i d e + j ä ä k i e k k o + j ä ä k i e k k o a + j ä ä k i e k k o f a n i + j ä ä k i e k k o k a u k a l o + j ä ä k i e k k o l e i j o n i s t a + j ä ä k i e k k o l i i g a + j ä ä k i e k k o l i i g o i s t a + j ä ä k i e k k o l i i t o n + j ä ä k i e k k o l i i t t o + j ä ä k i e k k o m a a j o u k k u e + j ä ä k i e k k o m a i l a + j ä ä k i e k k o m a i l a k u v i o n + j ä ä k i e k k o m a i l a n + j ä ä k i e k k o s a r j a + j ä ä k i e k k o v ä k i v a l t a + j ä ä k i e k o n + j ä ä k i i p e i l y + j ä ä k i l p i + j ä ä k i n + j ä ä k o l k k a + j ä ä k u i k k a + j ä ä k y l m ä ä + j ä ä k ä r i p r i k a a t i + j ä ä k ä r i r y k m e n t t i + j ä ä k ö + j ä ä k ö ö n + j ä ä l a u t o i l l a + j ä ä l e i n i k k i + j ä ä l l e + j ä ä l o k k i + j ä ä l u o k i t u s + j ä ä l u o l a + j ä ä m a s s a + j ä ä m e r e l l e + j ä ä m e r e n + j ä ä m e r e n k a t e d r a a l i + j ä ä m e r e n s e i t i + j ä ä m e r e n t u r s k a + j ä ä m e r e n t ä h t i m ö + j ä ä m e r i + j ä ä m i n e n + j ä ä m i s e n + j ä ä m i s e s t ä + j ä ä m i ä + j ä ä m m e + j ä ä m m e k ö + j ä ä m ä r a j a t + j ä ä m ä t + j ä ä m ä t a s o l t a + j ä ä m ä ä n + j ä ä n e e + j ä ä n e e n + j ä ä n e e t + j ä ä n e i d e n + j ä ä n e i t ä + j ä ä n e u l a n e n + j ä ä n h o i t o k o n e + j ä ä n m u r t a j a n a + j ä ä n n ö s a k t i i v i s u u s + j ä ä n n ö s a n a l y y s i ä + j ä ä n n ö s a r v o + j ä ä n n ö s a r v o a + j ä ä n n ö s b u d j e t t i + j ä ä n n ö s j ä n n i t y s + j ä ä n n ö s k u s t a n n u k s i s t a + j ä ä n n ö s l a u s e + j ä ä n n ö s m a t e r i a a l i a + j ä ä n n ö s m ä ä r i e n + j ä ä n n ö s r i s k i + j ä ä n n ö s r i s k i e n + j ä ä n n ö s r i s k i ä + j ä ä n n ö s s o k e r i a + j ä ä n n ö s s o p i m u k s e e n + j ä ä n n ö s t u o t t e i d e n + j ä ä n n ö s v a r a t + j ä ä n n ö s v a r o i s t a + j ä ä n n ö s v i r h e i d e n + j ä ä n p u s k i j a t + j ä ä n t e i t ä + j ä ä n y t + j ä ä n y t t ä + j ä ä o l o i s t a + j ä ä p a l a + j ä ä p a l l o l i i t t o + j ä ä p a l l o m a a j o u k k u e + j ä ä p e i t e + j ä ä p e i t t e e l l ä + j ä ä s o t a a n + j ä ä s p e e d w a y + j ä ä t a n s s i + j ä ä t e e + j ä ä t e h t a i t a + j ä ä t e l ö a u t o + j ä ä t e l ö b a a r i + j ä ä t e l ö k a k k u + j ä ä t e l ö k e k s i + j ä ä t e l ö k i o s k i n + j ä ä t e l ö k o n e + j ä ä t e l ö n + j ä ä t e l ö p ä ä n s ä r k y + j ä ä t e l ö s o o d a + j ä ä t e l ö s s ä + j ä ä t e l ö s t ä + j ä ä t e l ö ä + j ä ä t i e + j ä ä t i e t o j a + j ä ä t i k k ö j ä + j ä ä t i k k ö j ä r v i + j ä ä t i k ö n + j ä ä t i k ö t + j ä ä t t e + j ä ä t u u l e n + j ä ä t y n e e t + j ä ä t y n e i d e n + j ä ä u r h e i l u l i i t t o + j ä ä u r h e i l u p a l a t s i + j ä ä v a h v i s t e t t u j a + j ä ä v a h v i s t u s t a + j ä ä v e s i h a a s t e + j ä ä v i r t a + j ä ä v u o r e e n + j ä ä v u o r i a l u e i t a + j ä ä v ä n + j ä ä v ä t + j ä ä v ä t k ö + k a a d e t t a e s s a + k a a d e t t a v a + k a a d e t u s t a + k a a k a o a l a l l a + k a a k a o b o i k o t i l l a + k a a k a o j a u h e + k a a k a o j u o m a + k a a k a o k i p u a j a + k a a k a o m a r k k i n o i h i n + k a a k a o n t u o t a n n o n + k a a k a o n t u o t t a j a + k a a k a o n t u o t t a j a m a i l l e + k a a k a o n t u o t t a j a m a i t a + k a a k a o n t u o t t a j a t + k a a k a o n t u o t t a j i a + k a a k a o n t u o t t a j i e n + k a a k a o n t u o t t a j i i n + k a a k a o n t u o t t a j i s t a + k a a k a o n v i e j i i n + k a a k a o n v i e j ä m a i d e n + k a a k a o n v i e n n i s t ä + k a a k a o n v i l j e l i j ö i d e n + k a a k a o p a p u j e n + k a a k a o p a v u n + k a a k a o p o h j a i n e n + k a a k a o p o h j a i s i i n + k a a k a o p u u + k a a k a o r a s t a s + k a a k a o s a d o s t a + k a a k a o s o p i m u k s e n + k a a k a o s o p i m u s t a + k a a k a o t a + k a a k a o t e o l l i s u u d e n + k a a k a o t e o l l i s u u s + k a a k a o t u o t t e i s t a + k a a k a o v i e j ä m a i t a + k a a k a o v i l j e l m i e n + k a a k a o v i l j e l m i l l e + k a a k a o v i l j e l m i l l ä + k a a k a o v i l j e l m i l t ä + k a a k a o v i l j e l y s s ä + k a a k a o v i l p p i + k a a k a o v o i + k a a k a o v o i n + k a a k a o v o i s t a + k a a k a o v o i t a + k a a k e l i u u n i + k a a k k o i s a a s i a l a i s e n + k a a k k o i s a a s i a l a i s t e n + k a a k k o i s e n g l a n t i l a i s e t + k a a k k o i s e s t a + k a a k k o i s e u r o o p p a l a i n e n + k a a k k o i s e u r o o p p a l a i s i a + k a a k k o i s n u r k a n + k a a k k o i s o s a + k a a k k o i s o s a a + k a a k k o i s o s a a n + k a a k k o i s o s a n + k a a k k o i s o s a s s a + k a a k k o i s o s i i n + k a a k k o i s o s i s s a + k a a k k o i s r a j a + k a a k k o i s r a n n i k k o a + k a a k k o i s r a n n i k o n + k a a k k o o n + k a a l i k i r v a + k a a l i k o i + k a a l i k ä r p ä n e n + k a a l i k ä ä r y l e e t + k a a l i p e r h o n e n + k a a l i v a l v a t t i + k a a l i y ö k k ö n e n + k a a m e a l l a + k a a m o s m a s e n n u s + k a a o k s e e n + k a a o k s e s t a + k a a o s p ä i v ä t + k a a o s t a + k a a o s t e o r i a + k a a o s t e o r i a s t a + k a a o s t i l a s s a + k a a o s y h t e i s k u n t a + k a a p a n n e e t + k a a p e i s s a a n + k a a p e l e i d e n + k a a p e l i a l u s + k a a p e l i e n + k a a p e l i k u i t u + k a a p e l i m o d e e m i + k a a p e l i n m i t t a + k a a p e l i o p e r a a t t o r e i l l e + k a a p e l i r a d i o + k a a p e l i r a i t i o t i e + k a a p e l i t + k a a p e l i t e k n i i k k a a + k a a p e l i t e l e v i s i o + k a a p e l i t e l e v i s i o n + k a a p e l i t e l e v i s i o p a k e t e i s t a + k a a p e l i t e l e v i s i o t a + k a a p e l i t e l e v i s i o v e r k k o j e n + k a a p e l i t e l e v i s i o y h t i ö l l e + k a a p e l i v e r k k o j a + k a a p e l i v e r k k o j e n + k a a p e l i v e r k o t + k a a p e l i y h t i ö + k a a p p a u s t a p a u k s i a + k a a p p a u s y r i t y k s e n + k a a p p i k a s v i s s y ö j ä + k a a p p i s ä n k y + k a a p u p u t k i h a n k k e e s s a + k a a r a k a k s i k k o + k a a r i h i t s a u s + k a a r i k a i k u + k a a r i l a m p p u + k a a r i n u o l i a i n e n + k a a r i p i s t e s i i p i + k a a r i r i t a r i y ö k k ö n e n + k a a r i s i l t a + k a a r n a k u o r i a i s e l l e + k a a r n a k u o r i a i s e t + k a a r n a k u o r i a i s t e n + k a a r r e l l a + k a a r r e l l a a n + k a a r t e i s s a + k a a r t e l e m a t t a + k a a r t e l u a + k a a r t e l u u n + k a a r t i n a r m e i j a + k a a s u a + k a a s u a l a + k a a s u a l a a + k a a s u a l a l l a + k a a s u a l a l l a k i n + k a a s u a l a n + k a a s u a l o i l l a + k a a s u a l o i l l e + k a a s u a s e + k a a s u a s e t t a + k a a s u d i p l o m a t i a s t a + k a a s u d i r e k t i i v i + k a a s u d i r e k t i i v i i n + k a a s u d i r e k t i i v i n + k a a s u d i r e k t i i v i s s ä + k a a s u d i r e k t i i v i s t ä + k a a s u d i r e k t i i v i ä + k a a s u e r i s t e i s i ä + k a a s u e s i i n t y m i ä + k a a s u h a n a a + k a a s u h a n a t + k a a s u h a n k k e e n + k a a s u h a n k k e i s i i n + k a a s u h a n o j e n + k a a s u h ö y r y v o i m a l o i d e n + k a a s u i n f r a s t r u k t u u r e i h i n + k a a s u i n f r a s t r u k t u u r i + k a a s u i n f r a s t r u k t u u r i h a n k k e e t + k a a s u i n f r a s t r u k t u u r i h a n k k e i d e n + k a a s u i n f r a s t r u k t u u r i i n + k a a s u i n f r a s t r u k t u u r i n + k a a s u i n f r a s t r u k t u u r i s s a a n + k a a s u i n f r a s t r u k t u u r i s t a + k a a s u i n v e s t o i n t i e n + k a a s u i s k u i s s a + k a a s u i s t a + k a a s u j a + k a a s u j e n + k a a s u j o h d o t + k a a s u j o h t o j e n + k a a s u j o u s i + k a a s u j ä r j e s t e l m ä + k a a s u j ä ä h d y t t e i s e t + k a a s u k a m m i o + k a a s u k a m m i o i d e n + k a a s u k a m m i o i h i n + k a a s u k a m m i o i s s a + k a a s u k a m m i o i s t a + k a a s u k a m m i o i t a + k a a s u k a m m i o t + k a a s u k a r t e l l i n + k a a s u k a u p a l l e + k a a s u k a u p p a a + k a a s u k a u p p o j a + k a a s u k a u p p o j e n + k a a s u k a u t t a k u l k u j ä r j e s t e l m ä n + k a a s u k e l l o + k a a s u k e n t i l l e + k a a s u k e n t t i e n + k a a s u k e n t t i ä + k a a s u k e n t ä t + k a a s u k i i s t a + k a a s u k i i s t a a + k a a s u k i i s t a a n + k a a s u k i i s t a n + k a a s u k i i s t a n a + k a a s u k i i s t a s s a + k a a s u k i i s t a s t a + k a a s u k o n d e n s a a t t i + k a a s u k o n f l i k t i + k a a s u k o n f l i k t i n + k a a s u k o r i i n + k a a s u k r i i s e i s s ä + k a a s u k r i i s i + k a a s u k r i i s i i n + k a a s u k r i i s i n + k a a s u k r i i s i s s ä + k a a s u k r i i s i s t ä + k a a s u k r i i s i t + k a a s u k r i i s i ä + k a a s u k r o m a t o g r a f i a + k a a s u k u l j e t u k s i s t a + k a a s u k u o l i o + k a a s u k u o l i o o n + k a a s u k y s y m y k s e n + k a a s u k y s y m y s + k a a s u k ä ä p i ö + k a a s u l a i n + k a a s u l a i t o k s i s t a + k a a s u l a i t o s h a n k k e e n + k a a s u l a i t t e e t + k a a s u l a s k u + k a a s u l a s k u j e n + k a a s u l a s k u t + k a a s u l i i t ä n t ä + k a a s u l i n j a a + k a a s u l i n j a n + k a a s u l l a + k a a s u l ä h t e e s t ä + k a a s u l ä h t e e t + k a a s u l ä h t e i d e n + k a a s u l ä h t e i t ä + k a a s u l ä m m i t t i m i s t ä + k a a s u l ä m m i t y s t ä + k a a s u l ö y d ö n + k a a s u m a r k k i n a t + k a a s u m a r k k i n o i d e n + k a a s u m a r k k i n o i h i n + k a a s u m a r k k i n o i l l a + k a a s u m a r k k i n o i l l e + k a a s u m a r k k i n o i s t a + k a a s u m a r k k i n o i t a + k a a s u m i t t a r e i t a + k a a s u m o n o p o l i + k a a s u m o n o p o l i a + k a a s u m ä ä r ä n + k a a s u n + k a a s u n a a m a r e i t a + k a a s u n a a m a r i + k a a s u n e s t e j o u s i t u s + k a a s u n h i n n a n + k a a s u n h i n t a + k a a s u n h i n t o i h i n + k a a s u n h i n t o j e n + k a a s u n j a k e l u v e r k o n + k a a s u n k u l j e t u s j ä r j e s t e l m ä n + k a a s u n k u l j e t u s r e i t t i + k a a s u n k u l u t t a j i e n + k a a s u n k u l u t u k s e m m e + k a a s u n m u o d o s t u s t a + k a a s u n m y y j ä + k a a s u n p o r a u k s e e n + k a a s u n s a a n n i n + k a a s u n s i i r t o i n f r a s t r u k t u u r i n + k a a s u n s i i r t o o n + k a a s u n s i i r t o v e r k k o i h i n + k a a s u n s i i r t o v e r k k o j e n + k a a s u n s i i r t o v e r k o n + k a a s u n t a r j o a j a n s a + k a a s u n t o i m i t t a j a + k a a s u n t o i m i t t a j a n + k a a s u n t o i m i t t a j a n s a + k a a s u n t o i m i t t a j a n s a k i n + k a a s u n t o i m i t t a j a v a l i k o i m a a + k a a s u n t o i m i t t a j i a + k a a s u n t o i m i t t a j i e n + k a a s u n t o i m i t t a j i i n + k a a s u n t o i m i t u k s e n + k a a s u n t o i m i t u k s e s t a + k a a s u n t o i m i t u k s e t + k a a s u n t o i m i t u k s i a + k a a s u n t o i m i t u k s i i n + k a a s u n t o i m i t u k s i s s a + k a a s u n t o i m i t u k s i s t a + k a a s u n t o i m i t u s n ä k y m i s t ä + k a a s u n t o i m i t u s r e i t t i + k a a s u n t o i m i t u s s o p i m u k s e n + k a a s u n t o i m i t u s s o p i m u k s i a + k a a s u n t o i m i t u s t e n + k a a s u n t o i m i t u s t u r v a l l i s u u d e n + k a a s u n t o i m i t u s v a r m u u s + k a a s u n t o i m i t u s v e r k k o j e n + k a a s u n t u o n n i s t a + k a a s u n t u o n t i + k a a s u n t u o n t i l ä h t e i d e n + k a a s u n t u o n t i m o n o p o l i a + k a a s u n t u o t a n n o n + k a a s u n t u o t a n t o + k a a s u n t u o t a n t o a + k a a s u n v a p a u t t a m i s d i r e k t i i v i + k a a s u n v i e j ä v a l t i o k s i + k a a s u o n g e l m i a + k a a s u p a k e t i n + k a a s u p i t o i s u u t t a + k a a s u p o l i t i i k k a a + k a a s u p o l k i m e l t a + k a a s u p o l t i n u u n e j a + k a a s u p u l a t + k a a s u p u l l o + k a a s u p u l l o i h i n + k a a s u p u l l o j a + k a a s u p u r k a u s l a m p p u + k a a s u p u t k e a + k a a s u p u t k e e n + k a a s u p u t k e l l a + k a a s u p u t k e l l e + k a a s u p u t k e n + k a a s u p u t k e n s a + k a a s u p u t k e s t a + k a a s u p u t k e t + k a a s u p u t k i + k a a s u p u t k i a + k a a s u p u t k i e m m e + k a a s u p u t k i e n + k a a s u p u t k i h a n k e + k a a s u p u t k i h a n k k e e l l a + k a a s u p u t k i h a n k k e e n + k a a s u p u t k i h a n k k e e s e e n + k a a s u p u t k i h a n k k e e s s a + k a a s u p u t k i h a n k k e i d e n + k a a s u p u t k i h a n k k e i s t a + k a a s u p u t k i i n + k a a s u p u t k i j ä r j e s t e l m ä s s ä + k a a s u p u t k i l l a + k a a s u p u t k i l l e + k a a s u p u t k i s t a + k a a s u p u t k i s t a a n + k a a s u p u t k i s t o + k a a s u p u t k i s t o a + k a a s u p u t k i s t o j a + k a a s u p u t k i s t o n + k a a s u p u t k i s u u n n i t e l m a + k a a s u p u t k i v e r k o s t o i h i n + k a a s u p u t k i v e r k o t + k a a s u p u t k i v ä y l ä l l ä + k a a s u p u t k i y h t e y s + k a a s u p ä ä s t ö i s s ä + k a a s u p ä ä s t ö i s t ä + k a a s u p ä ä s t ö j e m m e + k a a s u p ä ä s t ö j e n + k a a s u p ä ä s t ö j ä + k a a s u p ä ä s t ö t + k a a s u r e i t i n + k a a s u r e s e r v a a t t i + k a a s u r i i d a n + k a a s u r i i d a s t a + k a a s u r i i p p u v u u d e n + k a a s u r i i p p u v u u s + k a a s u r i i p p u v u u t t a + k a a s u r i i t a + k a a s u r ä j ä h d y k s e s t ä + k a a s u r ä j ä h d y s + k a a s u s a a r r o l l a + k a a s u s e k t o r i l l a + k a a s u s e o s t e n + k a a s u s o d a l l e + k a a s u s o d a n + k a a s u s o d a s s a + k a a s u s o p i m u k s e s s a + k a a s u s o p i m u k s e s t a + k a a s u s o p i m u k s i a + k a a s u s o p i m u k s i s s a + k a a s u s o p i m u s t e n + k a a s u s o t a + k a a s u s o t a a n + k a a s u s t a + k a a s u s ä i l i ö a l u k s i l l a a n + k a a s u s ä i l i ö a l u s t e n + k a a s u s ä i l i ö i d e n + k a a s u s ä i l i ö l ä m m i t t i m i ä + k a a s u t a l o u d e n + k a a s u t a n k k e r e i d e n + k a a s u t e o l l i s u u d e l l e + k a a s u t e o l l i s u u d e n + k a a s u t e o l l i s u u d e s s a + k a a s u t e o l l i s u u t e e n + k a a s u t e o l l i s u u t e n s a + k a a s u t e r m i n a a l i + k a a s u t e r m i n a a l i l l e + k a a s u t e r m i n a a l i n + k a a s u t o i m i t t a j i i n + k a a s u t o i m i t u k s e m m e + k a a s u t o i m i t u k s e n s a + k a a s u t o i m i t u k s e t + k a a s u t o i m i t u k s i a + k a a s u t o i m i t u k s i a a n + k a a s u t o i m i t u k s i e n + k a a s u t o i m i t u k s i i n + k a a s u t o i m i t u k s i s s a + k a a s u t o i m i t u k s i s s a a n + k a a s u t o i m i t u k s i s t a + k a a s u t o i m i t u s k r i i s i + k a a s u t o i m i t u s m o n o p o l i s t a + k a a s u t o i m i t u s t e n + k a a s u t o i m i t u s t e n s a + k a a s u t u o n n i n + k a a s u t u o n n i s t a + k a a s u t u o t a n t o + k a a s u t u r b i i n e i h i n + k a a s u t u r b i i n e j a + k a a s u t u r b i i n i e n + k a a s u t u r b i i n i t + k a a s u t u r b i i n i v e t u r i + k a a s u t u r b i i n i v o i m a n + k a a s u t u t k i m u k s e n + k a a s u v a k i o + k a a s u v a l a i s t u s + k a a s u v a r a n n o i s t a + k a a s u v a r a n n o t + k a a s u v a r a n t o j a + k a a s u v a r a n t o j e n + k a a s u v a r a s t o + k a a s u v a r a s t o a + k a a s u v a r a s t o i h i n + k a a s u v a r a s t o i l l e + k a a s u v a r a s t o i s t a + k a a s u v a r a s t o j a + k a a s u v a r a s t o j e n + k a a s u v a r a s t o t + k a a s u v a r a t + k a a s u v a r o i h i n + k a a s u v a r o i s t a + k a a s u v a r o j a + k a a s u v a r o j e n + k a a s u v a u n u + k a a s u v e l k a + k a a s u v e r k k o + k a a s u v e r k k o i h i n + k a a s u v e r k k o j a + k a a s u v e r k k o j e n + k a a s u v e r k k o o n + k a a s u v e r k o n + k a a s u v e r k o s s a + k a a s u v e r k o t + k a a s u v i r r a n + k a a s u v i r t o i h i n + k a a s u v i r t o j a + k a a s u v o i m a l a + k a a s u v o i m a l a i n v e s t o i n t i e n + k a a s u v o i m a l a i t o s t e n + k a a s u v o i m a l a t + k a a s u v o i m a l o i d e n + k a a s u v o i m a l o i t a + k a a s u v ä h e n n y k s i i n + k a a s u y h d i s t e t t ä + k a a s u y h t e e n l i i t ä n t ä h a n k k e i t a + k a a s u y h t e y k s i ä + k a a s u y h t i ö + k a a s u y h t i ö i d e n + k a a s u y h t i ö i h i n + k a a s u y h t i ö i t ä + k a a s u y h t i ö t + k a a s u y r i t y s t e n + k a a s u ö l j y + k a a s u ö l j y j e n + k a a s u ö l j y j ä + k a a s u ö l j y n + k a a s u ö l j y y n + k a a t a a + k a a t a i s i + k a a t o i + k a a t o p a i k a k s i + k a a t o p a i k a l l e + k a a t o p a i k a l t a + k a a t o p a i k a n + k a a t o p a i k a t + k a a t o p a i k k a + k a a t o p a i k k a a + k a a t o p a i k k a d i r e k t i i v i + k a a t o p a i k k a d i r e k t i i v i n + k a a t o p a i k k a d i r e k t i i v i s s ä + k a a t o p a i k k a d i r e k t i i v i s t ä + k a a t o p a i k k a d i r e k t i i v i ä + k a a t o p a i k k a j ä r j e s t e l m ä t + k a a t o p a i k k a j ä t t e e k s i + k a a t o p a i k k a k a a s u a + k a a t o p a i k k a k u s t a n n u k s i a + k a a t o p a i k k a k ä y t ä n n ö i s s ä + k a a t o p a i k k a l a j i t t e l u s t a + k a a t o p a i k k a n a + k a a t o p a i k k a o p e r a a t t o r e i l l e + k a a t o p a i k k a p ä ä s t ö t + k a a t o p a i k k a r a t a + k a a t o p a i k k a s u u n n i t t e l u n + k a a t o p a i k k o i h i n + k a a t o p a i k k o i n a + k a a t o p a i k k o j a + k a a t o p a i k k o j e n + k a a t o p a i k o i l l a + k a a t o p a i k o i l l e + k a a t o p a i k o i s t a + k a a t o s a d e + k a a t o s a t e e s e e n + k a a t o s a t e e s s a + k a a t o s a t e e t + k a a t o s a t e i d e n + k a a t o s a t e i t a + k a a t u a + k a a t u i + k a a t u m a a n + k a a t u m i s e n + k a a t u m i s k o e + k a a t u m i s v a a r a + k a a t u m i s v a a r a s s a + k a a t u n e e n + k a a t u n e i d e n + k a a t u n u t t a + k a a t u u + k a a v a i l e e k o + k a a v a i l e m i s t a a n + k a a v a i l l a a n + k a a v a i l l u s s a + k a a v a k k e i t a + k a a v a m a i s e l l a + k a a v a m a i s e m p i + k a a v a m a i s i a + k a a v a m a i s i i n + k a a v a m a i s u u t e e n + k a a v i o i t a + k a a v i o n + k a a v o i t t a m i s e k s i + k a a v o i t u k s e e n + k a a v o i t u k s e n + k a a v o i t u k s e s t a + k a a v o i t u s h a k e m u k s i s t a + k a a v o i t u s h a n k k e e t + k a a v o i t u s h a n k k e i s i i n + k a a v o i t u s k y s y m y s t e n + k a a v o i t u s l a i n s ä ä d ä n t ö + k a a v o i t u s l u p a a + k a a v o i t u s o h j e l m a n + k a a v o i t u s p o l i t i i k a l l a + k a a v o i t u s p o l i t i i k a n + k a a v o i t u s p o l i t i i k k a + k a a v o i t u s r a j o i t u s t e n + k a a v o i t u s s t r a t e g i a a n + k a a v o i t u s s t r a t e g i a s s a + k a a v o i t u s s u u n n i t e l m i a + k a a v o i t u s t a + k a a v o i t u s t a p a u k s i a + k a a v o i t u s t o i m i a + k a b a r e e l a u l a j a t a r + k a b a r e e t a i t e i l i j a + k a b i n e t i l l e + k a b i n e t i s s a a n + k a b i n e t i s s a n n e + k a b i n e t t e j a + k a b i n e t t i a n i + k a b i n e t t i e n + k a b i n e t t i i n + k a b i n e t t i k e s k u s t e l u t + k a b i n e t t i m i n i s t e r i + k a b i n e t t i n i + k a b i n e t t i p a i k k a a + k a b i n e t t i p o l i t i i k k a a + k a b i n e t t i p ä ä l l i k k ö n i + k a b i n e t t i p ä ä l l i k k ö n s ä + k a b i n e t t i p ä ä l l i k k ö n ä + k a b i n e t t i p ä ä l l i k k ö ä n i + k a b i n e t t i p ä ä l l i k k ö ö n + k a b i n e t t i p ä ä l l i k ö i d e n + k a b i n e t t i p ä ä l l i k ö l l e + k a b i n e t t i p ä ä l l i k ö l l ä + k a b i n e t t i p ä ä l l i k ö l t ä + k a b i n e t t i p ä ä l l i k ö n + k a b i n e t t i t a s o n + k a b o t a a s i a l a + k a b o t a a s i a l u s t e n + k a b o t a a s i j ä r j e s t e l m ä s t ä + k a b o t a a s i j ä r j e s t e l m ä ä n + k a b o t a a s i j ä r j e s t e l y i s t ä + k a b o t a a s i k i e l l o t + k a b o t a a s i k ä s i t t e e n + k a b o t a a s i l i i k e n n e + k a b o t a a s i l i i k e n n e o i k e u d e t + k a b o t a a s i l i i k e n n e t o i m i l l e + k a b o t a a s i l i i k e n n e t t ä + k a b o t a a s i l i i k e n t e e l l e + k a b o t a a s i l i i k e n t e e s e e n + k a b o t a a s i l i i k e n t e e s t ä + k a b o t a a s i l l a + k a b o t a a s i m a h d o l l i s u u d e t + k a b o t a a s i m a r k k i n a n s a + k a b o t a a s i m a r k k i n o i d e n + k a b o t a a s i m a r k k i n o i t a + k a b o t a a s i m a t k o j a + k a b o t a a s i o i k e u s + k a b o t a a s i o p e r a a t i o t a + k a b o t a a s i p a l v e l u j a + k a b o t a a s i p a l v e l u t + k a b o t a a s i r a j o i t u k s e n + k a b o t a a s i r a j o i t u k s e t + k a b o t a a s i r a j o i t u s + k a b o t a a s i s ä ä n n ö i s t ä + k a b o t a a s i s ä ä n t ö j ä + k a b o t a a s i t o i m e t + k a b o t a a s i t o i m i n t a a + k a b o t a a s i v a p a u t u k s e s t a + k a c h i n i t + k a d e h d i t t a v a a + k a d e h d i t t a v a m p i + k a d e h d i t t a v a t + k a d e h t i a + k a d e h t i v a t + k a d e p u h e i s i i n + k a d e t t i k o u l u + k a d m i u m h y d r o k s i d i + k a d m i u m i n + k a d m i u m j o d i d i + k a d m i u m k i e l l o n + k a d m i u m k l o r i d i + k a d m i u m m i e t i n t ö + k a d m i u m m ä ä r i ä + k a d m i u m o k s i d i + k a d m i u m p a r i s t o j a + k a d m i u m p a r i s t o j e n + k a d m i u m p i t o i s u u d e s t a + k a d m i u m p i t o i s u u s + k a d m i u m r a j o i t u k s e l l a + k a d m i u m r a j o j e n k i n + k a d m i u m t e l l u r i d i + k a d m i u m t e l l u r i d i a + k a d m i u m t e l l u r i d i a u r i n k o k e n n o i l l a + k a d m i u m t e l l u r i d i a u r i n k o k e n n o j e n + k a d m i u m t e l l u r i d i s t a + k a d m i u m t e l l u r i d i y h d i s t e i s t ä + k a d o n n e e n + k a d o n n e e t + k a d o n n e i d e n + k a d o n n e i l l e + k a d o n n e i s i i n + k a d o n n e i s t a + k a d o n n e i t a + k a d o t e t a a n + k a d o t e t t i i n + k a d o t t a a + k a d o t t a i s i + k a d o t t a k o + k a d o t t a m a s s a + k a d o t t a m a t t a + k a d o t t a n e e t + k a d u i l l a + k a d u i l l e + k a d u l l a + k a d u n + k a d u n k u l m a s s a + k a d u n m i e h e l l e + k a d u n m i e h e n + k a d u n m i e h e t + k a d u n n i m i k y l t i t + k a d u n n i m i s t ä + k a d u n v a r s i k a u p p o j e n + k a f f e r i k i i t ä j ä + k a f f e r i l u h t a k a n a + k a f f e r i p u h v e l i + k a f k a m a i s e s t a + k a h a k a t + k a h a k o i s t a + k a h d e k s a a + k a h d e k s a a n + k a h d e k s a k s i + k a h d e k s a l l a + k a h d e k s a l t a + k a h d e k s a n a + k a h d e k s a n k e r t a i s e s t i + k a h d e k s a n k e r t a i s e t + k a h d e k s a n k u l m i o l u k u + k a h d e k s a n k y m m e n e n v i i d e n + k a h d e k s a n k y m m e n v u o t i n e n + k a h d e k s a n n e l l e + k a h d e k s a n n e n + k a h d e k s a n n e s s a + k a h d e k s a n o s a i s e n + k a h d e k s a n s i v u i s e n + k a h d e k s a n s i v u i s t a + k a h d e k s a n v u o t i a i t a + k a h d e k s a n v u o t i s e e n + k a h d e k s a s o s a a + k a h d e k s a s o s a n + k a h d e k s a s s a + k a h d e k s a s t a + k a h d e k s i + k a h d e k s i s e n k y m m e n t ä + k a h d e l l a + k a h d e l l e + k a h d e l t a + k a h d e n k a a n + k a h d e n k e s k i s e t + k a h d e n k e s k i s t e n + k a h d e n k y m m e n e n k a h d e k s a n + k a h d e n k y m m e n e n k a h d e n + k a h d e n k y m m e n e n s e i t s e m ä n + k a h d e n k y m m e n e n t u h a n n e n + k a h d e n k y m m e n e n v i i d e n + k a h d e n l a i s e l l a + k a h d e n l a i s e l l e + k a h d e n l a i s e n + k a h d e n l a i s e s t a + k a h d e n l a i s e t + k a h d e n l a i s i a + k a h d e n l a i s i i n + k a h d e n l a i s i l l a + k a h d e n l a i s i s t a + k a h d e n l a i s t a + k a h d e n l a i s t e n + k a h d e n n e n k y m m e n e n n e n e n s i m m ä i s e n + k a h d e n n e n k y m m e n e n n e n k o l m a n n e n + k a h d e n n e n k y m m e n e n n e n v i i d e n n e n + k a h d e n n e s t a k y m m e n e n n e s t ä k o l m a n n e s t a + k a h d e n t o i s t a m i l j o o n a n + k a h d e n v ä l i s e e n + k a h d e n v ä l i s e l l ä + k a h d e n v ä l i s e m p ä ä + k a h d e n v ä l i s e n + k a h d e n v ä l i s e n ä + k a h d e n v ä l i s e s s ä + k a h d e n v ä l i s e t + k a h d e n v ä l i s i i n + k a h d e n v ä l i s i l l ä + k a h d e n v ä l i s i s s ä + k a h d e n v ä l i s i s t ä + k a h d e n v ä l i s i ä + k a h d e n v ä l i s t e n + k a h d e n v ä l i s t ä + k a h d e s k y m m e n e s k u u d e s + k a h d e s k y m m e n e s s e i t s e m ä s + k a h d e s k y m m e n e s v i i d e s + k a h d e s s a + k a h d e s s a k y m m e n e s s ä k a h d e s s a + k a h d e s t a + k a h d e s t a k a a n + k a h d e s t a k i n + k a h d e s t a k y m m e n e s t ä s e i t s e m ä s t ä + k a h d e s t o i s t a o s i a + k a h d e s t o i s t a o s i e n + k a h d e s t o i s t a o s i i n + k a h d e t + k a h l e h t i m i s e n + k a h l e i s i i n + k a h l e i t a + k a h l i t s e e + k a h l u u s y v y y s + k a h m a i s t a + k a h t a k a a n + k a h t a l a i s e e n + k a h t a l a i s e s s a + k a h t a l a i s e s t i + k a h t a l a i s e t + k a h t a l a i s i a + k a h t a l a i s i i n + k a h t a l a i s t a + k a h t e e n + k a h t e e n k y m m e n e e n v i i t e e n + k a h t e n a + k a h t i a j a k o a + k a h t i a j a o n + k a h v i a + k a h v i a l a n + k a h v i e k s t r a k t i a + k a h v i h a p p o + k a h v i h i n t o j e n + k a h v i j ä r j e s t ö s s ä + k a h v i k e t s a a l i + k a h v i k r i i s i + k a h v i k r i i s i s t ä + k a h v i k r i i s i ä + k a h v i k u p i l l i s e s t a + k a h v i k u p i n + k a h v i k u p p i a a n + k a h v i k u p p o s e e n + k a h v i l a n o m i s t a j i l l e + k a h v i l a s s a + k a h v i l o i s s a + k a h v i l o i s t a + k a h v i m a r k k i n a t + k a h v i m a r k k i n o i d e n + k a h v i n k u l u t t a j a m a a + k a h v i n p a a h t i m o i d e n + k a h v i n p o r o i s t a + k a h v i n t u o t a n t o o n + k a h v i n t u o t t a j a m a i t a + k a h v i n t u o t t a j i e n + k a h v i n t u o t t a j i s t a + k a h v i n v i e j ä + k a h v i n v i l j e l i j ä l l ä + k a h v i n v i l j e l i j ä n + k a h v i n v i l j e l i j ä t + k a h v i n v i l j e l i j ä ä + k a h v i n v i l j e l i j ö i d e n + k a h v i n v i l j e l i j ö i h i n + k a h v i n v i l j e l i j ö i l l e + k a h v i n v i l j e l y a l u e i l l e + k a h v i p e n s a a n + k a h v i p e n s a s + k a h v i p e u k a l o i n e n + k a h v i p ö l l ö n e n + k a h v i p ö y t ä p u h e e s t a + k a h v i s u o d a t i n t e n + k a h v i t a u o l l a + k a h v i t r u s t i a + k a h v i t u o n n i s t a + k a h v i u u t e t t a + k a i h i l e i k k a u k s i i n + k a i h i l e i k k a u s t a + k a i h t a n u t + k a i j a p a l l o k a l a + k a i k e l l a + k a i k e l l e + k a i k e l t a + k a i k e n + k a i k e n i k ä i s e t + k a i k e n i k ä i s i i n + k a i k e n i k ä i s i l l e + k a i k e n i k ä i s i n ä + k a i k e n i k ä i s i ä + k a i k e n i k ä i s t e n + k a i k e n i k ä i s t ä + k a i k e n k a r v a i s e t + k a i k e n k a r v a i s i l l a + k a i k e n k a t t a v a a + k a i k e n k a t t a v a a n + k a i k e n k a t t a v a n + k a i k e n k a t t a v a n a + k a i k e n k a t t a v a s t a + k a i k e n k a t t a v i a + k a i k e n k o k o i s i l l e + k a i k e n k o k o i s t e n + k a i k e n l a i s e e n + k a i k e n l a i s e l l a + k a i k e n l a i s e l l e + k a i k e n l a i s e l t a + k a i k e n l a i s e n + k a i k e n l a i s e s s a + k a i k e n l a i s e s t a + k a i k e n l a i s e t + k a i k e n l a i s i a + k a i k e n l a i s i e n + k a i k e n l a i s i i n + k a i k e n l a i s i k s i + k a i k e n l a i s i l l a + k a i k e n l a i s i l l e + k a i k e n l a i s i l t a + k a i k e n l a i s i n + k a i k e n l a i s i s s a + k a i k e n l a i s i s t a + k a i k e n l a i s t a + k a i k e n l a i s t e n + k a i k e n m u o t o i s e t + k a i k e s s a + k a i k e s t a + k a i k i l l a + k a i k i l l e + k a i k i l t a + k a i k i s s a + k a i k k e a + k a i k k e e n + k a i k k e m m e + k a i k k e n i + k a i k k e n n e + k a i k k e n s a + k a i k k e u d e n h i s t o r i a + k a i k k i a + k a i k k i e n + k a i k k i h a n + k a i k k i i n + k a i k k i n a i s e n + k a i k k i n a i s e s t a + k a i k k i n e + k a i k k i n e e n + k a i k k i t i e t ä v ä n + k a i k k i v a l t i u t t a + k a i k k i v o i p a a + k a i k k i v o i p a a n + k a i k k i v o i p u u t e e n + k a i k k i v o i v a l l a + k a i k k i v o i v a l l e + k a i k k i v o i v a n + k a i k u e s s a + k a i k u j a + k a i k u k a m m i o + k a i k u k o p p a + k a i k u l a i t e + k a i k u l u o t a i n a a l l o t + k a i k u l u o t a i n j ä r j e s t e l m i e n + k a i k u l u o t a i n t e n + k a i k u p o h j a + k a i k u p o h j a a + k a i k u p o h j a k s i + k a i k u p o h j a n a + k a i m a a + k a i n a l o k a r v a + k a i p a a m a a n + k a i p a a m a s t a + k a i p a a m m e + k a i p a a n + k a i p a a v a a + k a i p a a v a t + k a i p a a v i a + k a i r a n o k i p e r h o n e n + k a i r a s a m m a l + k a i s l a k e r t t u n e n + k a i s l a k u t o j a + k a i s l a m e r i m e t s o + k a i s t a l t a + k a i s t a m e t r i + k a i s t a n l e v e y s k a p a s i t e e t t i + k a i s t a v a h t i a + k a i s t a v a h t i j ä r j e s t e l m ä t + k a i s t a v i l j e l y + k a i t a f i l m i + k a i t a k ä m m e k k ä + k a i t a n o k k a k i p u a j a + k a i t a n o k k a k i u r u + k a i t a n o k k a k u o v i + k a i t a n o k k a k u t o j a + k a i t a n o k k a l o k k i + k a i t a n o k k a v a r i s + k a i t a p a r a t i i s i l e s k i + k a i t a p y s t y n o k k a + k a i t s e l m u k s e s t a + k a i u t i n t a + k a i v a j a s a m m a k k o + k a i v a m i s e e n + k a i v a n n a i s a l o i l l a + k a i v a n n a i s i a + k a i v a n n a i s j ä t t e e s t ä + k a i v a n n a i s j ä t t e i d e n + k a i v a n n a i s t e o l l i s u u d e l l e + k a i v a n n a i s t e o l l i s u u d e n + k a i v a n n a i s t e o l l i s u u d e s s a + k a i v a n n a i s t e o l l i s u u d e s t a + k a i v a n n a i s t e o l l i s u u s + k a i v a n n a i s t e o l l i s u u t e e n + k a i v a n n a i s t e o l l i s u u t t a + k a i v a n n a i s t o i m i n n a n + k a i v a n n a i s v a r a t + k a i v a t a a n + k a i v a t t u a + k a i v a t t u j a + k a i v a t t u j e n + k a i v a t u l l a + k a i v a t u n + k a i v a t u t + k a i v a u d u t a + k a i v a u s r y h m ä n + k a i v a u t u v a t + k a i v e t t a v a + k a i v e t t i i n + k a i v i n k o n e i d e n + k a i v i n k o n e i l l a + k a i v o k s i a + k a i v o k s i s s a + k a i v o k s i s t a + k a i v o n p o r a u s h a n k k e i s i i n + k a i v o s a l a + k a i v o s a l a a + k a i v o s a l a l l a + k a i v o s a l a m m e + k a i v o s a l a n + k a i v o s a l a s t a + k a i v o s a l o i l l a + k a i v o s a l u e + k a i v o s a l u e e l l a + k a i v o s a l u e e l l e + k a i v o s a l u e e l t a + k a i v o s a l u e e n + k a i v o s a l u e i d e n + k a i v o s a l u e i t a + k a i v o s h a n k e + k a i v o s h a n k k e e l l e + k a i v o s h a n k k e e n + k a i v o s h a n k k e e t + k a i v o s h a n k k e i d e n + k a i v o s h a n k k e i s i i n + k a i v o s h a n k k e i t a + k a i v o s i n s i n ö ö r i n ä + k a i v o s j ä t e + k a i v o s j ä t e d i r e k t i i v e j ä + k a i v o s j ä t e d i r e k t i i v i + k a i v o s j ä t e d i r e k t i i v i k s i + k a i v o s j ä t e d i r e k t i i v i n + k a i v o s j ä t e d i r e k t i i v i ä + k a i v o s j ä t e h u o l l o n + k a i v o s j ä t e t t ä + k a i v o s j ä t t e e n + k a i v o s j ä t t e i d e n + k a i v o s j ä t t e i s i i n + k a i v o s j ä t t e i t ä + k a i v o s k o h t e i t a + k a i v o s l a i n s ä ä d ä n n ö k s i + k a i v o s l a i t t e i d e n + k a i v o s m i e h e n + k a i v o s o n n e t t o m u u d e n + k a i v o s o n n e t t o m u u d e t + k a i v o s o n n e t t o m u u k s i a + k a i v o s o n n e t t o m u u k s i e n + k a i v o s o n n e t t o m u u k s i l l a + k a i v o s o n n e t t o m u u s + k a i v o s o n n e t t o m u u t t a + k a i v o s o p e r a a t i o i h i n + k a i v o s p e r i n t e e t + k a i v o s p r o j e k t i + k a i v o s r e s u r s s i e n + k a i v o s t e k n i i k a n + k a i v o s t e k n i i k k a + k a i v o s t e k n i i k k a a + k a i v o s t e k n i i k o i d e n + k a i v o s t e k n i i k o i s t a + k a i v o s t e k n i i k o i t a + k a i v o s t e o l l i s u u d e n + k a i v o s t e o l l i s u u d e s s a + k a i v o s t e o l l i s u u d e s t a + k a i v o s t e o l l i s u u s + k a i v o s t e o l l i s u u s a l u e i l l e + k a i v o s t e o l l i s u u s j ä t t e i d e n + k a i v o s t e o l l i s u u t e e n + k a i v o s t e o l l i s u u t t a + k a i v o s t e o l l i s u u t t a a n + k a i v o s t e o l l i s u u t t a k a a n + k a i v o s t o i m i n n a l l e + k a i v o s t o i m i n n a n + k a i v o s t o i m i n n a s t a + k a i v o s t o i m i n t a + k a i v o s t o i m i n t a a + k a i v o s t o i m i n t a a n + k a i v o s t o i m i n t a i n t r e s s e j ä + k a i v o s t o i m i n t a l a i t e t e o l l i s u u s + k a i v o s t o i m i n t a l u v a t + k a i v o s t o i m i n t a m u o d o n + k a i v o s t o i m i n t o j e n + k a i v o s t u o t a n t o a + k a i v o s t u o t t e i d e n + k a i v o s t y ö h a n k e + k a i v o s t y ö l ä i s t e n + k a i v o s v i r a n o m a i n e n + k a i v o s y h t e i s t y ö + k a i v o s y h t e i s ö j ä + k a i v o s y h t i ö + k a i v o s y h t i ö i d e n + k a i v o s y h t i ö i l l ä + k a i v o s y h t i ö i t ä + k a i v o s y h t i ö n + k a i v o s y h t i ö s s ä + k a i v o s y h t i ö t + k a i v o s y r i t y k s i l l e + k a i v o s y r i t y k s i l t ä + k a i v o s y r i t y s t e n + k a i v u t y ö + k a j o a m a t t a + k a j o s a l a m a + k a k k o s a s u n t o i h i n + k a k k o s d i v i s i o o n a s s a + k a k k o s k a s t i a + k a k k o s k i e l i + k a k k o s l i i g a + k a k k o s l i i g a n + k a k k o s l u o k a n + k a k k o s m i e s + k a k k o s v a i h e e s e e n + k a k k o s v a i h t e e l l e + k a k k u k u v a + k a k k u p a l o j e n + k a k s i j a k o i s e e n + k a k s i j a k o i s e n + k a k s i j a k o i s e s t i + k a k s i j a k o i s t a + k a k s i j a k o i s u u d e n + k a k s i j a k o i s u u t e e n + k a k s i k a m a r i j ä r j e s t e l m ä n + k a k s i k a m a r i j ä r j e s t e l m ä ä + k a k s i k e r r o k s i s i a + k a k s i k e r r o k s i s i i n + k a k s i k i e l i s i ä + k a k s i k i e l i s t ä + k a k s i k i e l i s y y s j ä r j e s t e l m ä n + k a k s i k y m m e n t ä k e r t a i s t u n u t + k a k s i k y m m e n t ä t u h a t t a + k a k s i k ä y t t ö i s e n + k a k s i k ä y t t ö i s e t + k a k s i k ä y t t ö t u o t t e e t + k a k s i k ä y t t ö t u o t t e i d e n + k a k s i k ä y t t ö t u o t t e i t a + k a k s i l u o k k a i n e n + k a k s i l u o k k a i s e n + k a k s i m i n u u t t i s e n i + k a k s i n a a m a i s e l t a + k a k s i n a a m a i s e n + k a k s i n a a m a i s e s t i + k a k s i n a a m a i s i a + k a k s i n a a m a i s t a + k a k s i n a a m a i s u u d e n + k a k s i n a a m a i s u u d e s t a + k a k s i n a a m a i s u u t e e n + k a k s i n a a m a i s u u t e n s a + k a k s i n a a m a i s u u t t a + k a k s i n a i s i s t a + k a k s i n a i s j ä r j e s t e l m ä l l e + k a k s i n a i s m o r a a l i + k a k s i n a i s m o r a a l i a + k a k s i n a i s m o r a a l i i n + k a k s i n a i s m o r a a l i l l e + k a k s i n a i s m o r a a l i m m e + k a k s i n a i s m o r a a l i n + k a k s i n a i s m o r a a l i s t a + k a k s i n a i s m o r a a l i s t a m m e + k a k s i n a i s m o r a a l i s u u t e e n + k a k s i n a i s m o r a l i s m i + k a k s i n a i s m o r a l i s m i a + k a k s i n a i s m o r a l i s m i a a n + k a k s i n a i s m o r a l i s m i i n + k a k s i n a i s m o r a l i s m i l l e + k a k s i n a i s m o r a l i s m i n + k a k s i n a i s m o r a l i s m i n a + k a k s i n a i s m o r a l i s m i n s a + k a k s i n a i s m o r a l i s m i s t a + k a k s i n a i s m o r a l i s m i s t a a n + k a k s i n a i s m o r a l i s t e i l t a + k a k s i n a i s m o r a l i s t e j a + k a k s i n a i s m o r a l i s t i s e n a + k a k s i n a i s m o r a l i s t i s i l t a + k a k s i n a i s m o r a l i s t i s t a + k a k s i n a i s t a + k a k s i n a i s u u t t a + k a k s i n a p a i s e m m a s s a + k a k s i n a p a i s t a + k a k s i n a p a i s u u t t a + k a k s i n k e r t a i s e e n + k a k s i n k e r t a i s e k s i + k a k s i n k e r t a i s e l l a + k a k s i n k e r t a i s e n + k a k s i n k e r t a i s e n a + k a k s i n k e r t a i s e s t a + k a k s i n k e r t a i s e t + k a k s i n k e r t a i s t a a + k a k s i n k e r t a i s t a m a a n + k a k s i n k e r t a i s t a m i s t a + k a k s i n k e r t a i s t a v a t + k a k s i n k e r t a i s t e n + k a k s i n k e r t a i s t e t a a n + k a k s i n k e r t a i s t e t t a v a + k a k s i n k e r t a i s t e t t u a + k a k s i n k e r t a i s t u a + k a k s i n k e r t a i s t u i + k a k s i n k e r t a i s t u i s i + k a k s i n k e r t a i s t u m i s t a + k a k s i n k e r t a i s t u u + k a k s i n k e r t a i s t u v a n + k a k s i n o p e u k s i n e n + k a k s i n o p e u k s i s e n + k a k s i n o p e u k s i s e s t a + k a k s i n t a i s t e l u + k a k s i n t a i s t e l u p i s t o o l i t + k a k s i n u m e r o i s i a + k a k s i n u m e r o i s i n + k a k s i n u m e r o i s t a + k a k s i n u m e r o t a s o l l a + k a k s i n u m e r o t a s o l l e + k a k s i n u m e r o t a s o n + k a k s i o s a i s e n + k a k s i o s a i s e s s a + k a k s i o s a i s e s t a + k a k s i o s a i s t a + k a k s i p u o l i s t a + k a k s i p u o l u e j ä r j e s t e l m ä n + k a k s i p u o l u e j ä r j e s t e l m ä ä n + k a k s i p y ö r ä i s i l l e + k a k s i p y ö r ä i s i s t ä + k a k s i p y ö r ä i s i ä + k a k s i p y ö r ä i s t e n + k a k s i p ä i v ä i n e n + k a k s i p ä i v ä i s e n + k a k s i p ä i v ä i s e s s ä + k a k s i p ä i v ä i s i s s ä + k a k s i r u n k o i s i a + k a k s i r u n k o i s i l l a + k a k s i r u n k o i s i s t a + k a k s i r u n k o i s t e n + k a k s i s a t a a t u h a t t a + k a k s i s a t a a v i i s i k y m m e n t ä + k a k s i s e l i t t e i s e s t i + k a k s i s e l i t t e i s y y d e s t ä + k a k s i s u u n t a i s e k s i + k a k s i s u u n t a i s e n + k a k s i s u u n t a i s e n a + k a k s i s u u n t a i s e s t a + k a k s i s u u n t a i s e s t i + k a k s i s u u n t a i s t a + k a k s i s u u n t a i s t e n + k a k s i t a h o i s e e n + k a k s i t a h o i s e l l a + k a k s i t a h o i s e n + k a k s i t a h o i s e s s a + k a k s i t a h o i s e s t a + k a k s i t a h o i s e s t i + k a k s i t a h o i s e t + k a k s i t a h o i s i a + k a k s i t a h o i s t a + k a k s i t a h t i m o o t t o r e i s t a + k a k s i t a h t i m o o t t o r i e n + k a k s i t a h t i m o o t t o r i t + k a k s i t a h t i s t e n + k a k s i t a s o i s e e n + k a k s i t a s o i s e k s i + k a k s i t a s o i s e n + k a k s i t a s o i s e t + k a k s i t a s o i s i a + k a k s i t a s o i s t a + k a k s i t e r ä i s e s t ä + k a k s i t e r ä i s t ä + k a k s i t o i s t a k e r t a i s e n a + k a k s i t o i s t a k e r t a i s e s t i + k a k s i t o i s t a s i v u i s e n a + k a k s i t o i s t a v u o t i a i t a + k a k s i t o i s t a v u o t i a s + k a k s i t o n n i s e t + k a k s i v a i h e i s e e n + k a k s i v a i h e i s e l l a + k a k s i v a i h e i s e l t a + k a k s i v a i h e i s e n + k a k s i v a i h e i s e s s a + k a k s i v a i h e i s e s t a + k a k s i v a i h e i s e s t i + k a k s i v a i h e i s t a + k a k s i v a u h t i s e l l e + k a k s i v u o t i s e e n + k a k s i v u o t i s e n + k a k s i v u o t i s e s s a + k a k s i v u o t i s e s t a + k a k s i v u o t i s i a + k a k s i v u o t i s i k s i + k a k s i v u o t i s i s s a + k a k s i v u o t i s k a u t e n a + k a k s i v u o t i s t e n + k a k s o i s a g e n t t i + k a k s o i s a r v i o i n t i l a u s e k k e e n + k a k s o i s a s e m a + k a k s o i s a s e m a n s a + k a k s o i s a s p e k t i t e o r i a + k a k s o i s b u d j e t o i n t i + k a k s o i s d i k t a t u u r i + k a k s o i s e d u s t a j a n t o i m i + k a k s o i s e d u s t u s + k a k s o i s e h d o t u k s e n + k a k s o i s e h d o t u s + k a k s o i s e h d o t u s t a n i + k a k s o i s e l ä m ä ä + k a k s o i s e n e m m i s t ö + k a k s o i s e n e m m i s t ö j ä r j e s t e l m ä + k a k s o i s e n e m m i s t ö j ä r j e s t e l m ä n + k a k s o i s e n e m m i s t ö j ä r j e s t e l m ä s t ä + k a k s o i s e n e m m i s t ö j ä r j e s t e l m ä ä + k a k s o i s e n e m m i s t ö l l ä + k a k s o i s e n e m m i s t ö n + k a k s o i s e n e m m i s t ö p e r i a a t e + k a k s o i s e n e m m i s t ö p e r i a a t e t t a + k a k s o i s e n e m m i s t ö p ä ä t ö k s e e n + k a k s o i s e n e m m i s t ö p ä ä t ö k s e t + k a k s o i s e n e m m i s t ö p ä ä t ö k s i i n + k a k s o i s e n e m m i s t ö s ä ä n n ö n + k a k s o i s e n e m m i s t ö ä + k a k s o i s e n e m m i s t ö ä ä n e s t y k s e e n + k a k s o i s e n e m m i s t ö ä ä n e s t y k s e t + k a k s o i s e n e m m i s t ö ä ä n e s t y k s i l l ä + k a k s o i s e n e m m i s t ö ö n + k a k s o i s h a a s t e e n + k a k s o i s h a a s t e e s e e n + k a k s o i s h e n k i l ö l l i s y y t t ä + k a k s o i s h i n n o i t t e l u + k a k s o i s h i n n o i t t e l u a + k a k s o i s h i n n o i t t e l u j ä r j e s t e l m i e n + k a k s o i s h i n n o i t t e l u j ä r j e s t e l m ä n + k a k s o i s h i n n o i t t e l u k a m p a n j a t + k a k s o i s h i n n o i t t e l u k a m p a n j o i d e n + k a k s o i s h i n n o i t t e l u l l e + k a k s o i s h i n n o i t t e l u n + k a k s o i s h i n n o i t t e l u s t a + k a k s o i s h i n n o i t t e l u u n + k a k s o i s h i n n o i t t e l u v e l v o i t e + k a k s o i s h i n t a j ä r j e s t e l m ä ä n + k a k s o i s h y v ä k s y n t ä + k a k s o i s i d e n t i t e e t t i + k a k s o i s i s k u + k a k s o i s j ä r j e s t e l m i ä + k a k s o i s j ä r j e s t e l m ä + k a k s o i s j ä r j e s t e l m ä k s i + k a k s o i s j ä r j e s t e l m ä l l e + k a k s o i s j ä r j e s t e l m ä n + k a k s o i s j ä r j e s t e l m ä s s ä + k a k s o i s j ä r j e s t e l m ä ä + k a k s o i s j ä r j e s t e l m ä ä n + k a k s o i s k a n s a l a i s u u d e l l e + k a k s o i s k a n s a l a i s u u d e n + k a k s o i s k a n s a l a i s u u d e s t a + k a k s o i s k a n s a l a i s u u s + k a k s o i s k a n s a l a i s u u t e e n + k a k s o i s k a n s a l a i s u u t t a + k a k s o i s k a n t a l i h a s + k a k s o i s k e s k u s t e l u s s a + k a k s o i s k i r j a n p i d o n + k a k s o i s k o n k u r s s i + k a k s o i s k o n s e r t t o + k a k s o i s k u l t t u u r i t e o r i a + k a k s o i s k y t k i n v a i h t e i s t o + k a k s o i s k ä y n n i s t y s + k a k s o i s k ä y t t ö + k a k s o i s k ä y t t ö ö n + k a k s o i s k ä y t ö n + k a k s o i s l a i d o i t u k s e n + k a k s o i s l a i d o i t u k s e s t a + k a k s o i s l a i d o i t u s + k a k s o i s l a i d o i t u s t a + k a k s o i s l a s k u t u k s e e n + k a k s o i s l e g i t i m i t e e t t i ä + k a k s o i s l u k k o a + k a k s o i s l u o d i k k o + k a k s o i s l u o n n e + k a k s o i s l u o n t e e l l a + k a k s o i s l u o n t e e l l e + k a k s o i s l ä h e s t y m i s t a p a a + k a k s o i s m a n d a a t i n + k a k s o i s m a n d a a t t i a + k a k s o i s m a r k k i n o i h i n + k a k s o i s m e n e s t y s + k a k s o i s m e r k i n n ä l l ä + k a k s o i s m e r k i n n ä n + k a k s o i s m e r k i n n ä s t ä + k a k s o i s m e r k i n n ä t + k a k s o i s m e r k i n t ä + k a k s o i s m e r k i n t ä ä + k a k s o i s m i e t i n n ö n + k a k s o i s m o r a a l i + k a k s o i s m o r a a l i a + k a k s o i s m o r a a l i m m e + k a k s o i s m o r a l i s m i n + k a k s o i s m u r h a + k a k s o i s m u r h a n + k a k s o i s n i m i + k a k s o i s n o r m e j a + k a k s o i s n o r m i t + k a k s o i s o i k e u s p e r u s t a + k a k s o i s o i k e u s p e r u s t a a n + k a k s o i s o i k e u s p e r u s t a k s i + k a k s o i s p e l i n + k a k s o i s p e r u s s o p i m u k s e s t a + k a k s o i s p e r u s t a n + k a k s o i s p i l a r i + k a k s o i s p i l a r i t + k a k s o i s p l a n e e t t a + k a k s o i s p o h j a + k a k s o i s p o h j i a + k a k s o i s p o t k u + k a k s o i s p r o v o k a a t i o + k a k s o i s p u h e e n j o h t a j u u t t a + k a k s o i s p ä ä k a u p u n g i k s i + k a k s o i s r a k k a u t t a + k a k s o i s r a k o k o e + k a k s o i s r a n g a i s t a v u u d e n + k a k s o i s r a n g a i s t a v u u d e s t a + k a k s o i s r a n g a i s t a v u u s + k a k s o i s r a n g a i s t a v u u t e e n + k a k s o i s r a n g a i s t a v u u t t a + k a k s o i s r a n g a i s t u k s e n + k a k s o i s r a n g a i s t u k s e s t a + k a k s o i s r a n g a i s t u s + k a k s o i s r i s t i + k a k s o i s r o o l i + k a k s o i s r o o l i a + k a k s o i s r u n g o i l l a + k a k s o i s r u n g o i s t a + k a k s o i s r u n g o l l a + k a k s o i s r u n g o s t a + k a k s o i s r u n g o t + k a k s o i s r u n k o + k a k s o i s r u n k o a + k a k s o i s r u n k o a s e t u s t a + k a k s o i s r u n k o i s i a + k a k s o i s r u n k o i s i l l a + k a k s o i s r u n k o i s i s s a + k a k s o i s r u n k o j a + k a k s o i s r u n k o j e n + k a k s o i s r u n k o o n + k a k s o i s r u n k o r a k e n n e t t a + k a k s o i s r u o k o l e h d y k k ä s o i t t i m e t + k a k s o i s s a a r t o o n + k a k s o i s s e i n i s s ä + k a k s o i s s e u r a n n a s t a + k a k s o i s s h a k k i + k a k s o i s s i d o s + k a k s o i s s i s a r e n s a + k a k s o i s s o k k o k o e + k a k s o i s s o t i l a s + k a k s o i s s t a n d a r d e i h i n + k a k s o i s s t a n d a r d e i s t a + k a k s o i s s t a n d a r d e j a + k a k s o i s s t a n d a r d i e n + k a k s o i s s t a n d a r d i j ä r j e s t e l m ä ä n + k a k s o i s s t a n d a r d i n + k a k s o i s s t a n d a r d i s t a + k a k s o i s s t a n d a r d i t + k a k s o i s s t r a t e g i a + k a k s o i s s t r a t e g i a m m e + k a k s o i s s t r a t e g i a n + k a k s o i s s u h d e + k a k s o i s s y r j i n t ä + k a k s o i s s ä n g y n + k a k s o i s s ä ä n t e l y ä + k a k s o i s t a r k o i t u s + k a k s o i s t a v o i t e + k a k s o i s t a v o i t t e e n + k a k s o i s t e h t ä v ä + k a k s o i s t e h t ä v ä n + k a k s o i s t e h t ä v ä s s ä + k a k s o i s t e h t ä v ä ä + k a k s o i s t o r n e i h i n + k a k s o i s t o r n i + k a k s o i s t o r n i e n + k a k s o i s t o r n i t + k a k s o i s t ä h t i + k a k s o i s u r a n + k a k s o i s v a i k u t u k s e l t a + k a k s o i s v a j e e n s a + k a k s o i s v a l t u u t u k s e n s a + k a k s o i s v a r m i s t u k s e n + k a k s o i s v a s t u u t a + k a k s o i s v e l i + k a k s o i s v e l j e n + k a k s o i s v e l j e n i + k a k s o i s v e l j e ä n i + k a k s o i s v e l v o l l i s u u s + k a k s o i s v e r o t u k s e e n + k a k s o i s v e r o t u k s e l l e + k a k s o i s v e r o t u k s e n + k a k s o i s v e r o t u k s e s t a + k a k s o i s v e r o t u s + k a k s o i s v e r o t u s t a + k a k s o i s v i e s t i + k a k s o i s v o i t o n + k a k s o i s v y ö h y k k e e s t ä + k a k s o i s y h t e i s ö s s ä + k a k s o i s y h t e i s ö s t ä + k a k s o i s y h t e i s ö ä + k a k s o s e t + k a k s o s i s t a + k a k s o s k i d e + k a k s o s p a r a d o k s i + k a k s o s s i s a r + k a k s o s t u t k i m u s + k a k t u s h i i r i h a u k k a + k a k t u s m a t k i j a + k a k t u s p e u k a l o i n e n + k a k t u s p ö l l ö + k a k t u s s i r p p i m a t k i j a + k a k u n + k a k u n p a l a s i s t a + k a k u s t a + k a l a a + k a l a b a r p a p u + k a l a h u u h k a j a + k a l a h u u h k a j a t + k a l a h u u t o k a u p a s s a + k a l a h u u t o k a u p p a a + k a l a h u u t o k a u p p o i h i n + k a l a j a u h e e k s i + k a l a j a u h e e n + k a l a j a u h e t t a + k a l a j a u h o + k a l a j a u h o a + k a l a j a u h o j e n + k a l a j a u h o k s i + k a l a j a u h o k y s y m y k s e e n + k a l a j a u h o n + k a l a j a u h o o n + k a l a j a u h o r e h u n + k a l a j a u h o s t a + k a l a j a u h o t e o l l i s u u d e l l e + k a l a j a u h o t e o l l i s u u s + k a l a k a n n a l l e + k a l a k a n n a n + k a l a k a n n a s s a + k a l a k a n n a s t a + k a l a k a n n a t + k a l a k a n n o i l l a + k a l a k a n n o i l l e + k a l a k a n n o i l l e e n + k a l a k a n n o i s s a + k a l a k a n n o i s s a m m e + k a l a k a n n o i s t a + k a l a k a n t a + k a l a k a n t a a + k a l a k a n t a a m m e + k a l a k a n t a m m e + k a l a k a n t a p e r u s t a i s e n + k a l a k a n t a s o p i m u k s e s s a + k a l a k a n t o i h i n + k a l a k a n t o j a + k a l a k a n t o j a m m e + k a l a k a n t o j e m m e + k a l a k a n t o j e n + k a l a k a s t i k e + k a l a k a u p a n + k a l a k e i t o k s i + k a l a k e i t o n + k a l a k e i t t o + k a l a k i i n t i ö i s t ä + k a l a k i i n t i ö t + k a l a k u o l l e i s u u t t a + k a l a l a j e i h i n + k a l a l a j e i l l e + k a l a l a j e i s t a + k a l a l a j e i s t a a n + k a l a l a j e i s t a m m e + k a l a l a j e j a + k a l a l a j i + k a l a l a j i a + k a l a l a j i e m m e + k a l a l a j i e n + k a l a l a j i i n + k a l a l a j i l l a + k a l a l a j i n + k a l a l a j i s t a + k a l a l a j i t + k a l a l a s t u s a l u e i d e n + k a l a l a s t u s s o p i m u k s e n + k a l a l o k k i + k a l a l u u j a u h o a + k a l a m a r k k i n a t + k a l a m a r k k i n o i d e n + k a l a m a r k k i n o i l l a + k a l a m ä ä r i e n + k a l a m ä ä r i s t ä + k a l a m ä ä r i ä + k a l a m ä ä r ä t + k a l a m ä ä r ä ä + k a l a n + k a l a n h i n n a n + k a l a n h i n t a + k a l a n j a l o s t a j a a + k a l a n j a l o s t u k s e s t a + k a l a n j a l o s t u s + k a l a n j a l o s t u s a l a + k a l a n j a l o s t u s a l a a + k a l a n j a l o s t u s a l a l l e + k a l a n j a l o s t u s a l a s t a + k a l a n j a l o s t u s l a i t o k s i s s a + k a l a n j a l o s t u s t a + k a l a n j a l o s t u s t e h t a i d e n + k a l a n j a l o s t u s t e o l l i s u u d e n + k a l a n j a l o s t u s t e o l l i s u u d e s s a + k a l a n j a l o s t u s t e o l l i s u u d e s t a + k a l a n j a l o s t u s t e o l l i s u u s + k a l a n j a l o s t u s t e o l l i s u u t e e n + k a l a n j a l o s t u s t o i m i n t a a + k a l a n j a l o s t u s y r i t y k s i ä + k a l a n k a s v a t t a m o i l l a + k a l a n k a s v a t u s a l a a + k a l a n k u l j e t u s a l u s t e n + k a l a n k u l u t u k s e n + k a l a n k ä s i t t e l y + k a l a n m a k s a ö l j y + k a l a n p o i k a s i a + k a l a n p o i k a s t e n + k a l a n p u u t t e e m m e + k a l a n p y y d y k s i l l e + k a l a n p y y n n i s s ä + k a l a n p y y n t i + k a l a n p y y n t i o i k e u k s i e n + k a l a n p y y n t i p a i k o i s s a + k a l a n p y y n t i t e k n i i k o i h i n + k a l a n p y y n t i ä + k a l a n r e h u + k a l a n r u o k a + k a l a n r u o t o k a a v i o + k a l a n s a + k a l a n s a a l i i l l e + k a l a n s a a l i i n + k a l a n s a a l i i t + k a l a n s a a l i i t a + k a l a n s a a n n i n + k a l a n s i l m ä + k a l a n s u o j e l u j ä r j e s t e l m i ä + k a l a n t u o j a n a + k a l a n t u o n t i + k a l a n t u o n t i a + k a l a n t u o t a n n o n + k a l a n t u o t a n n o s t a + k a l a n t u o t a n t o a + k a l a n v a l k u a i s e n + k a l a n v i l j e l i j ö i d e n + k a l a n v i l j e l i j ö i l l ä + k a l a n v i l j e l y + k a l a n v i l j e l y a l a + k a l a n v i l j e l y l a i t o k s e e n + k a l a n v i l j e l y l a i t o k s e n + k a l a n v i l j e l y l a i t o k s e t + k a l a n v i l j e l y l a i t o k s i i n + k a l a n v i l j e l y l a i t o s + k a l a n v i l j e l y l a i t o s t e n + k a l a n v i l j e l y n + k a l a n v i l j e l y s e k t o r i a + k a l a n v i l j e l y s s ä + k a l a n v i l j e l y s t ä + k a l a n v i l j e l y t a p o j e m m e + k a l a n v i l j e l y t e o l l i s u u d e l l e + k a l a n v i l j e l y t i l o i l l a + k a l a n v i l j e l y t u o t a n t o + k a l a n v i l j e l y y n + k a l a n v i l j e l y ä + k a l a o n n e a + k a l a p a r v e t + k a l a p a r v i e n + k a l a p o h j a i s t a + k a l a p o l i t i i k a n + k a l a p o l i t i i k k a a n + k a l a p o r r a s + k a l a p u i k k o + k a l a p u i k k o j a + k a l a p ä i v ä + k a l a p ö l l ö + k a l a p ö l l ö t + k a l a r e h u n + k a l a r e h u t e o l l i s u u s + k a l a r e t k e l t ä + k a l a r i k k a u k s i e n + k a l a s a a l i i d e n + k a l a s a a l i i d e n s a + k a l a s a a l i i n + k a l a s a a l i i s t a + k a l a s a a l i s t a + k a l a s a i r a u k s i e n + k a l a s a t a m a + k a l a s a t a m a m m e + k a l a s a t a m a t + k a l a s o t i e n + k a l a s s a + k a l a s t a a + k a l a s t a j a h a u k k a + k a l a s t a j a j ä r j e s t ö j e n + k a l a s t a j a k i s s a + k a l a s t a j a k u n i n g a s + k a l a s t a j a k y l i i n + k a l a s t a j a k y l ä n + k a l a s t a j a k y l ä t + k a l a s t a j a l e p a k k o + k a l a s t a j a n l i n n a k e + k a l a s t a j a p e r h e e t + k a l a s t a j a p o l v e n + k a l a s t a j a r y h m ä n + k a l a s t a j a r y h m ä t + k a l a s t a j a r y h m ä ä + k a l a s t a j a s a a r e n t o + k a l a s t a j a s u k u p o l v i l l e + k a l a s t a j a t + k a l a s t a j a v a r i s + k a l a s t a j a v e n e e s t ä + k a l a s t a j a y h t e i s ö i l l e + k a l a s t a j a y h t e i s ö j e n + k a l a s t a j a y h t e i s ö j ä + k a l a s t a j a y h t e i s ö s s ä + k a l a s t a j a y h t e i s ö t + k a l a s t a j i a + k a l a s t a j i a m m e + k a l a s t a j i e m m e + k a l a s t a j i e n + k a l a s t a j i i n + k a l a s t a j i l l a + k a l a s t a j i l l e + k a l a s t a j i l l e e n + k a l a s t a j i l l e m m e + k a l a s t a j i l t a + k a l a s t a j i l t a m m e + k a l a s t a j i n a + k a l a s t a j i s t a + k a l a s t a m a a n + k a l a s t a m i s e e n + k a l a s t a m i s e n + k a l a s t a m i s t a + k a l a s t a v a t + k a l a s t a v i i n + k a l a s t a v i l l e + k a l a s t e l u u n + k a l a s t e t a a n + k a l a s t e t t a v a a + k a l a s t e t t i i n + k a l a s t u k s e e n + k a l a s t u k s e l l a + k a l a s t u k s e l l e + k a l a s t u k s e n + k a l a s t u k s e n h a l l i n t a j ä r j e s t e l m ä n + k a l a s t u k s e n h a l l i n t a m a l l i + k a l a s t u k s e n h o i d o n + k a l a s t u k s e n h o i d o s s a + k a l a s t u k s e n h o i d o s t a + k a l a s t u k s e n h o i t o + k a l a s t u k s e n h o i t o a + k a l a s t u k s e n h o i t o e l i n t e n + k a l a s t u k s e n h o i t o j ä r j e s t e l m i e n + k a l a s t u k s e n h o i t o j ä r j e s t e l m ä + k a l a s t u k s e n h o i t o j ä r j e s t ö i s s ä + k a l a s t u k s e n h o i t o j ä r j e s t ö j e n + k a l a s t u k s e n h o i t o j ä r j e s t ö n + k a l a s t u k s e n h o i t o j ä r j e s t ö t + k a l a s t u k s e n h o i t o m a l l i + k a l a s t u k s e n h o i t o m a l l i a + k a l a s t u k s e n h o i t o o n + k a l a s t u k s e n h o i t o p o l i t i i k a l l a + k a l a s t u k s e n h o i t o s u u n n i t e l m a s t a + k a l a s t u k s e n h o i t o s u u n n i t e l m i e n + k a l a s t u k s e n h o i t o t o i m e n p i t e e t + k a l a s t u k s e n h o i t o t o i m i e n + k a l a s t u k s e n s e u r a n t a k e s k u k s e n s a + k a l a s t u k s e n v a l v o n t a a + k a l a s t u k s e n v a l v o n t a j ä r j e s t e l m ä s t ä + k a l a s t u k s e n v a l v o n t a o h j e l m i e n + k a l a s t u k s e n v a l v o n t a o h j e l m i l l e + k a l a s t u k s e n v a l v o n t a v i r a s t o + k a l a s t u k s e n v a l v o n t a v i r a s t o a + k a l a s t u k s e n v a l v o n t a v i r a s t o l l a + k a l a s t u k s e n v a l v o n t a v i r a s t o n + k a l a s t u k s e n v a l v o n t a v i r a s t o o n + k a l a s t u k s e s s a + k a l a s t u k s e s t a + k a l a s t u k s i a + k a l a s t u k s i l l e + k a l a s t u s a i k a a + k a l a s t u s a i k o j a + k a l a s t u s a l a + k a l a s t u s a l a a + k a l a s t u s a l a a m m e + k a l a s t u s a l a a n + k a l a s t u s a l a a n s a + k a l a s t u s a l a l l a + k a l a s t u s a l a l l a k i n + k a l a s t u s a l a l l a m m e + k a l a s t u s a l a l l e + k a l a s t u s a l a l l e m m e + k a l a s t u s a l a l t a + k a l a s t u s a l a m m e + k a l a s t u s a l a n + k a l a s t u s a l a n k a a n + k a l a s t u s a l a n s a + k a l a s t u s a l a s t a + k a l a s t u s a l o i h i n + k a l a s t u s a l o i l l e + k a l a s t u s a l o j e n + k a l a s t u s a l u e + k a l a s t u s a l u e e k s i + k a l a s t u s a l u e e l l a + k a l a s t u s a l u e e l l e + k a l a s t u s a l u e e n + k a l a s t u s a l u e e n s a + k a l a s t u s a l u e e s t a + k a l a s t u s a l u e e t + k a l a s t u s a l u e i d e n + k a l a s t u s a l u e i l l a + k a l a s t u s a l u e i l l e + k a l a s t u s a l u e i l t a + k a l a s t u s a l u e i s i i n + k a l a s t u s a l u e i s t a + k a l a s t u s a l u e i t a + k a l a s t u s a l u e i t t e m m e + k a l a s t u s a l u e t a u l u k k o + k a l a s t u s a l u e t t a + k a l a s t u s a l u k s e e n + k a l a s t u s a l u k s e l l a + k a l a s t u s a l u k s e l l e + k a l a s t u s a l u k s e n + k a l a s t u s a l u k s e s s a + k a l a s t u s a l u k s e t + k a l a s t u s a l u k s i a + k a l a s t u s a l u k s i a a n + k a l a s t u s a l u k s i a m m e + k a l a s t u s a l u k s i i n + k a l a s t u s a l u k s i l l a + k a l a s t u s a l u k s i l l e + k a l a s t u s a l u k s i l t a + k a l a s t u s a l u k s i l t a a n + k a l a s t u s a l u k s i s s a + k a l a s t u s a l u k s i s s a m m e + k a l a s t u s a l u k s i s t a + k a l a s t u s a l u s + k a l a s t u s a l u s r e k i s t e r i i n + k a l a s t u s a l u s t a + k a l a s t u s a l u s t e m m e + k a l a s t u s a l u s t e n + k a l a s t u s a l u s t e n s a + k a l a s t u s a s i a i n m i n i s t e r i + k a l a s t u s a s i a i n n e u v o s t o + k a l a s t u s a s i a s t a + k a l a s t u s a s i o i s s a + k a l a s t u s a s i o i t a + k a l a s t u s b i o l o g i e n + k a l a s t u s b u d j e t i n + k a l a s t u s b u d j e t i s t a + k a l a s t u s b u d j e t t i a + k a l a s t u s e d e l l y t y k s i ä + k a l a s t u s e d e l l y t y s t e n + k a l a s t u s e h d o i s t a + k a l a s t u s e l i n k e i n o + k a l a s t u s e l i n k e i n o a + k a l a s t u s e l i n k e i n o i l l e + k a l a s t u s e l i n k e i n o l l e + k a l a s t u s e l i n k e i n o l l e m m e + k a l a s t u s e l i n k e i n o m m e + k a l a s t u s e l i n k e i n o n + k a l a s t u s e l i n k e i n o n s a + k a l a s t u s e l i n k e i n o o n + k a l a s t u s e l i n k e i n o s s a + k a l a s t u s e l i n k e i n o s t a + k a l a s t u s e t u j a + k a l a s t u s e t u j e n + k a l a s t u s e t u j e n s a + k a l a s t u s h a l l i n n o n + k a l a s t u s h a l l i n t o a + k a l a s t u s h a l l i n t o j ä r j e s t e l m i e n + k a l a s t u s h a l l i n t o n s a + k a l a s t u s h a l l i t u k s e n + k a l a s t u s h a n k e t t a + k a l a s t u s h a n k k e i s i i n + k a l a s t u s i n f r a s t r u k t u u r i a + k a l a s t u s i n f r a s t r u k t u u r i a a n + k a l a s t u s i n t r e s s e j ä + k a l a s t u s i n t r e s s e j ä ä n + k a l a s t u s j ä r j e s t e l m i e n + k a l a s t u s j ä r j e s t e l m i i n + k a l a s t u s j ä r j e s t e l m i ä + k a l a s t u s j ä r j e s t e l m ä + k a l a s t u s j ä r j e s t ö + k a l a s t u s j ä r j e s t ö i h i n + k a l a s t u s j ä r j e s t ö i l l e + k a l a s t u s j ä r j e s t ö i l l ä + k a l a s t u s j ä r j e s t ö i s s ä + k a l a s t u s j ä r j e s t ö i s t ä + k a l a s t u s j ä r j e s t ö j e n + k a l a s t u s j ä r j e s t ö j ä + k a l a s t u s j ä r j e s t ö n + k a l a s t u s j ä r j e s t ö s s ä + k a l a s t u s j ä r j e s t ö t + k a l a s t u s j ä r j e s t ö ä + k a l a s t u s j ä r j e s t ö ö n + k a l a s t u s k a p a s i t e e t i n + k a l a s t u s k a p a s i t e e t i s t a + k a l a s t u s k a p a s i t e e t i t + k a l a s t u s k a p a s i t e e t t i + k a l a s t u s k a p a s i t e e t t i a + k a l a s t u s k a p a s i t e e t t i a a n + k a l a s t u s k a p a s i t e e t t i i n + k a l a s t u s k a u d e l l a + k a l a s t u s k a u d e l l e + k a l a s t u s k a u d e n + k a l a s t u s k a u p u n g e i s t a m m e + k a l a s t u s k a u s i + k a l a s t u s k a u s i e n + k a l a s t u s k a u s i l l a + k a l a s t u s k a u t t a + k a l a s t u s k e s k u s t e l u + k a l a s t u s k e s k u s t e l u a + k a l a s t u s k e s k u s t e l u n + k a l a s t u s k e s k u s t e l u u n + k a l a s t u s k e t j u n + k a l a s t u s k i e l l o n + k a l a s t u s k i e l l o s t a + k a l a s t u s k i e l l o t + k a l a s t u s k i e l t o + k a l a s t u s k i e l t o a + k a l a s t u s k i e l t o a j o i s t a + k a l a s t u s k i e l t o a l u e e t + k a l a s t u s k i e l t o a l u e i l l a + k a l a s t u s k i e l t o a l u e i s i i n + k a l a s t u s k i e l t o j a + k a l a s t u s k i e l t o k a u s i a + k a l a s t u s k i e l t o o n + k a l a s t u s k i i n t i ö + k a l a s t u s k i i n t i ö i d e n + k a l a s t u s k i i n t i ö i h i n + k a l a s t u s k i i n t i ö i s t ä + k a l a s t u s k i i n t i ö i t ä + k a l a s t u s k i i n t i ö i t ä ä n + k a l a s t u s k i i n t i ö n + k a l a s t u s k i i n t i ö s t ä + k a l a s t u s k i i n t i ö t + k a l a s t u s k i i n t i ö t ä + k a l a s t u s k i i n t i ö ö n + k a l a s t u s k i i s t a n + k a l a s t u s k i i s t o j e n + k a l a s t u s k o m i s s a a r i + k a l a s t u s k o m i s s i o + k a l a s t u s k o m i s s i o i d e n + k a l a s t u s k o m i s s i o l l a + k a l a s t u s k o m i s s i o n + k a l a s t u s k o m i s s i o o n + k a l a s t u s k o m i s s i o s s a + k a l a s t u s k o m i s s i o t a + k a l a s t u s k o m i t e a + k a l a s t u s k o m i t e a n + k a l a s t u s k o m i t e a s s a + k a l a s t u s k o u l u t u s + k a l a s t u s k r i i s i l l ä + k a l a s t u s k r i t e e r e i d e n + k a l a s t u s k u l t t u u r i n + k a l a s t u s k u m p p a n i s o p i m u k s i s s a + k a l a s t u s k u m p p a n u u k s i a + k a l a s t u s k u m p p a n u u s + k a l a s t u s k u m p p a n u u s s o p i m u k s e e n + k a l a s t u s k u m p p a n u u s s o p i m u k s e l l a + k a l a s t u s k u m p p a n u u s s o p i m u k s e n + k a l a s t u s k u m p p a n u u s s o p i m u k s e s t a + k a l a s t u s k u m p p a n u u s s o p i m u k s e t + k a l a s t u s k u m p p a n u u s s o p i m u k s i a + k a l a s t u s k u m p p a n u u s s o p i m u k s i i m m e + k a l a s t u s k u m p p a n u u s s o p i m u k s i i n + k a l a s t u s k u m p p a n u u s s o p i m u k s i k s i + k a l a s t u s k u m p p a n u u s s o p i m u k s i s s a + k a l a s t u s k u m p p a n u u s s o p i m u k s i s t a + k a l a s t u s k u m p p a n u u s s o p i m u s + k a l a s t u s k u m p p a n u u s s o p i m u s t a + k a l a s t u s k u m p p a n u u s s o p i m u s t e n + k a l a s t u s k u o l e v u u d e l l e + k a l a s t u s k u o l e v u u d e n + k a l a s t u s k u o l e v u u s + k a l a s t u s k u o l e v u u t e n a + k a l a s t u s k u o l e v u u t t a + k a l a s t u s k u o l l e i s u u d e n + k a l a s t u s k u o l l e i s u u s + k a l a s t u s k u o r m i t u s + k a l a s t u s k y l i e n + k a l a s t u s k y s y m y k s e e n + k a l a s t u s k y s y m y k s e n + k a l a s t u s k y s y m y k s e s t ä + k a l a s t u s k y s y m y k s i s s ä + k a l a s t u s k y s y m y k s i s t ä + k a l a s t u s k y s y m y k s i ä + k a l a s t u s k y s y m y s + k a l a s t u s k y s y m y s t e n + k a l a s t u s k y s y m y s t ä + k a l a s t u s k ä y t ä n n ö i l t ä + k a l a s t u s k ä y t ä n n ö i s t ä + k a l a s t u s k ä y t ä n n ö t + k a l a s t u s k ä y t ä n t e i t ä + k a l a s t u s k ä y t ä n t ö + k a l a s t u s k ä y t ä n t ö j e n + k a l a s t u s k ä y t ä n t ö j ä + k a l a s t u s l a i l l a + k a l a s t u s l a i n + k a l a s t u s l a i n s ä ä d ä n n ö l l e + k a l a s t u s l a i n s ä ä d ä n n ö n + k a l a s t u s l a i n s ä ä d ä n n ö s s ä + k a l a s t u s l a i n s ä ä d ä n t ö + k a l a s t u s l a i n s ä ä d ä n t ö ä + k a l a s t u s l a i n s ä ä d ä n t ö ö n + k a l a s t u s l a i v a + k a l a s t u s l a i v a s t o + k a l a s t u s l a i v a s t o a + k a l a s t u s l a i v a s t o a a n + k a l a s t u s l a i v a s t o i l l a + k a l a s t u s l a i v a s t o i l l e + k a l a s t u s l a i v a s t o i l l e e n + k a l a s t u s l a i v a s t o i n f r a s t r u k t u u r i s t a + k a l a s t u s l a i v a s t o i s t a + k a l a s t u s l a i v a s t o j a + k a l a s t u s l a i v a s t o j a a n + k a l a s t u s l a i v a s t o j e m m e + k a l a s t u s l a i v a s t o j e n + k a l a s t u s l a i v a s t o k a p a s i t e e t i n + k a l a s t u s l a i v a s t o k a p a s i t e e t t i a + k a l a s t u s l a i v a s t o l l a + k a l a s t u s l a i v a s t o l l e + k a l a s t u s l a i v a s t o m m e + k a l a s t u s l a i v a s t o n + k a l a s t u s l a i v a s t o n s a + k a l a s t u s l a i v a s t o o n + k a l a s t u s l a i v a s t o p o l i t i i k a n + k a l a s t u s l a i v a s t o p o l i t i i k k a + k a l a s t u s l a i v a s t o p o l i t i i k k a a + k a l a s t u s l a i v a s t o s s a + k a l a s t u s l a i v a s t o s t a + k a l a s t u s l a i v a s t o t + k a l a s t u s l a i v o i s s a + k a l a s t u s l a i v o j a + k a l a s t u s l a i v o j e n + k a l a s t u s l a i v u e e t + k a l a s t u s l a i v u e i l l e + k a l a s t u s l a k e j a m m e + k a l a s t u s l a k i + k a l a s t u s l a k i a l o i t e t t a + k a l a s t u s l a k i e n + k a l a s t u s l i p p u j e n + k a l a s t u s l i s e n s s e j ä + k a l a s t u s l i s e n s s i j ä r j e s t e l m ä ä n + k a l a s t u s l i s e n s s i m a k s u j a + k a l a s t u s l i s e n s s i t + k a l a s t u s l u p a + k a l a s t u s l u p a a + k a l a s t u s l u p i a + k a l a s t u s l u p i e n + k a l a s t u s l u v a n + k a l a s t u s l u v a t + k a l a s t u s l u v i s t a + k a l a s t u s l ä h d e + k a l a s t u s m a h d o l l i s u u d e n + k a l a s t u s m a h d o l l i s u u d e t + k a l a s t u s m a h d o l l i s u u k s i a + k a l a s t u s m a h d o l l i s u u k s i a a n + k a l a s t u s m a h d o l l i s u u k s i e n + k a l a s t u s m a h d o l l i s u u k s i e n k i n + k a l a s t u s m a h d o l l i s u u k s i i n + k a l a s t u s m a h d o l l i s u u k s i l l e + k a l a s t u s m a h d o l l i s u u k s i l t a a n + k a l a s t u s m a h d o l l i s u u k s i s t a + k a l a s t u s m a h d o l l i s u u k s i s t a a n + k a l a s t u s m a h d o l l i s u u s + k a l a s t u s m a h d o l l i s u u t e n s a + k a l a s t u s m a h t e j a + k a l a s t u s m a h t i + k a l a s t u s m a i d e n + k a l a s t u s m a r k k i n o i d e n + k a l a s t u s m a r k k i n o i s t a + k a l a s t u s m a r k k i n o i t a a n + k a l a s t u s m a t k a i l u t o i m i n n a n + k a l a s t u s m a t k o i l l a + k a l a s t u s m a t k o i l l e + k a l a s t u s m a t k o j a + k a l a s t u s m e n e t e l m i e n + k a l a s t u s m e n e t e l m i i n + k a l a s t u s m e n e t e l m i s t ä + k a l a s t u s m e n e t e l m i ä + k a l a s t u s m e n e t e l m i ä ä n + k a l a s t u s m e n e t e l m ä + k a l a s t u s m e n e t e l m ä t + k a l a s t u s m i n i s t e r e i d e n + k a l a s t u s m i n i s t e r e i l l e m m e + k a l a s t u s m i n i s t e r e i t ä + k a l a s t u s m i n i s t e r i + k a l a s t u s m i n i s t e r i e n + k a l a s t u s m i n i s t e r i n + k a l a s t u s m i n i s t e r i t + k a l a s t u s m i n i s t e r i ö + k a l a s t u s m i n i s t e r i ö l l e + k a l a s t u s m i n i s t e r i ö n + k a l a s t u s m u o d o s s a + k a l a s t u s m u o d o s t a + k a l a s t u s m u o d o t + k a l a s t u s m u o t o + k a l a s t u s m u o t o j a + k a l a s t u s m u o t o j e n + k a l a s t u s m u o t o n a + k a l a s t u s m ä ä r i e n + k a l a s t u s m ä ä r i i n + k a l a s t u s m ä ä r ä r a h a t + k a l a s t u s m ä ä r ä y s t e n + k a l a s t u s n e u v o s t o + k a l a s t u s n e u v o s t o j a + k a l a s t u s n e u v o s t o l l e + k a l a s t u s n e u v o s t o n + k a l a s t u s n e u v o s t o o n + k a l a s t u s n e u v o s t o s s a + k a l a s t u s n e u v o t t e l u i t a + k a l a s t u s n e u v o t t e l u j e n + k a l a s t u s n e u v o t t e l u s t r a t e g i a n + k a l a s t u s o h j e e s e e n + k a l a s t u s o h j e l m a + k a l a s t u s o h j e l m a l l e + k a l a s t u s o i k e u d e n + k a l a s t u s o i k e u d e s t a + k a l a s t u s o i k e u d e t + k a l a s t u s o i k e u k s i a + k a l a s t u s o i k e u k s i e n + k a l a s t u s o i k e u k s i e n s a + k a l a s t u s o i k e u k s i i n + k a l a s t u s o i k e u k s i s t a + k a l a s t u s o i k e u s + k a l a s t u s o i k e u s p e r u s t a i n e n + k a l a s t u s o i k e u s p e r u s t a i s i s t a + k a l a s t u s o i k e u s p e r u s t a i s t a + k a l a s t u s o i k e u t e n s a + k a l a s t u s o l o t + k a l a s t u s o n g e l m a t + k a l a s t u s o n g e l m i e n + k a l a s t u s o n g e l m i i n + k a l a s t u s o n n e t t o m u u d e t + k a l a s t u s o n n e t t o m u u k s i e n + k a l a s t u s o n n e t t o m u u k s i s t a + k a l a s t u s o p e r a a t i o i d e n + k a l a s t u s o r g a n i s a a t i o i h i n + k a l a s t u s o s u u d e s t a + k a l a s t u s o s u u s k u n t i e n + k a l a s t u s p a i k a t + k a l a s t u s p a i k k a k u n t i e n + k a l a s t u s p a i k k a m m e + k a l a s t u s p a i k k o j a + k a l a s t u s p a i n e + k a l a s t u s p a i n e t t a + k a l a s t u s p e l i + k a l a s t u s p e r i n n e + k a l a s t u s p e r i n t e e n + k a l a s t u s p e r i n t e i t ä + k a l a s t u s p e t o k s e t + k a l a s t u s p i i r i e n + k a l a s t u s p o l i i t t i s i a + k a l a s t u s p o l i t i i k a l l a + k a l a s t u s p o l i t i i k a l l e + k a l a s t u s p o l i t i i k a l t a + k a l a s t u s p o l i t i i k a n + k a l a s t u s p o l i t i i k a s s a + k a l a s t u s p o l i t i i k a s t a + k a l a s t u s p o l i t i i k k a + k a l a s t u s p o l i t i i k k a a + k a l a s t u s p o l i t i i k k a a k i n + k a l a s t u s p o l i t i i k k a a m m e + k a l a s t u s p o l i t i i k k a a n + k a l a s t u s p o l i t i i k k a a n s a + k a l a s t u s p o l i t i i k k a k i n + k a l a s t u s p o l i t i i k k a m m e + k a l a s t u s p o l i t i i k k a n a + k a l a s t u s p o l i t i i k k a n s a + k a l a s t u s p o l i t i i k k a p a k e t t i + k a l a s t u s p o l i t i i k k o j e n + k a l a s t u s p o n n i s t e l u j a + k a l a s t u s p o n n i s t e l u j a a n + k a l a s t u s p o n n i s t e l u j e n + k a l a s t u s p o n n i s t u k s e n + k a l a s t u s p o n n i s t u k s i a + k a l a s t u s p o n n i s t u s a s i a a n + k a l a s t u s p o n n i s t u s t e n + k a l a s t u s p y y d y k s i l l e + k a l a s t u s p y y d y s t e n + k a l a s t u s p ä i v i e n + k a l a s t u s p ä i v i ä + k a l a s t u s p ä i v ä k i r j a a + k a l a s t u s p ä i v ä k i r j a m e r k i n t ö i h i n + k a l a s t u s p ä i v ä t + k a l a s t u s p ä i v ä ä + k a l a s t u s p ö y t ä k i r j a + k a l a s t u s p ö y t ä k i r j a a + k a l a s t u s p ö y t ä k i r j a n + k a l a s t u s p ö y t ä k i r j a s t a + k a l a s t u s p ö y t ä k i r j o j a + k a l a s t u s p ö y t ä k i r j o j e n + k a l a s t u s r a h a s t o + k a l a s t u s r a h a s t o a + k a l a s t u s r a h a s t o j e n + k a l a s t u s r a h a s t o n + k a l a s t u s r a h a s t o o n + k a l a s t u s r a h a s t o s t a + k a l a s t u s r a j a t + k a l a s t u s r a j o i t u k s e t + k a l a s t u s r a j o i t u k s i a + k a l a s t u s r a j o i t u s a l u e i d e n + k a l a s t u s r a j o i t u s t a + k a l a s t u s r a j o i t u s t e n + k a l a s t u s r e i t i t + k a l a s t u s r e s u r s s e j a a n + k a l a s t u s r i i t a + k a l a s t u s s a a l i i t + k a l a s t u s s a t a m a + k a l a s t u s s a t a m a a + k a l a s t u s s a t a m i a + k a l a s t u s s a t a m i l l e + k a l a s t u s s a t a m i s s a + k a l a s t u s s e k t o r e i h i n + k a l a s t u s s e k t o r e i t a + k a l a s t u s s e k t o r i + k a l a s t u s s e k t o r i a + k a l a s t u s s e k t o r i e n s a + k a l a s t u s s e k t o r i i n + k a l a s t u s s e k t o r i l l a + k a l a s t u s s e k t o r i l l e + k a l a s t u s s e k t o r i n + k a l a s t u s s e s o n g i n + k a l a s t u s s o p i m u k s e e n + k a l a s t u s s o p i m u k s e k s i + k a l a s t u s s o p i m u k s e l l a + k a l a s t u s s o p i m u k s e l l e + k a l a s t u s s o p i m u k s e n + k a l a s t u s s o p i m u k s e n s a + k a l a s t u s s o p i m u k s e s s a + k a l a s t u s s o p i m u k s e s t a + k a l a s t u s s o p i m u k s e t + k a l a s t u s s o p i m u k s i a + k a l a s t u s s o p i m u k s i a m m e + k a l a s t u s s o p i m u k s i e m m e + k a l a s t u s s o p i m u k s i i n + k a l a s t u s s o p i m u k s i l l a + k a l a s t u s s o p i m u k s i l l e + k a l a s t u s s o p i m u k s i s s a + k a l a s t u s s o p i m u k s i s s a m m e + k a l a s t u s s o p i m u k s i s t a + k a l a s t u s s o p i m u s + k a l a s t u s s o p i m u s k y s y m y s + k a l a s t u s s o p i m u s n e u v o t t e l u i d e n + k a l a s t u s s o p i m u s n e u v o t t e l u j e n + k a l a s t u s s o p i m u s p o l i t i i k k a a + k a l a s t u s s o p i m u s p ö y t ä k i r j a n + k a l a s t u s s o p i m u s t a + k a l a s t u s s o p i m u s t e m m e + k a l a s t u s s o p i m u s t e n + k a l a s t u s s t r a t e g i a a + k a l a s t u s s u h t e e t + k a l a s t u s s u h t e i d e n + k a l a s t u s s u h t e i d e n s a + k a l a s t u s s u h t e i s t a + k a l a s t u s s u h t e i t a + k a l a s t u s s u o j a v y ö h y k k e e s t ä + k a l a s t u s s u o j e l u a l u e + k a l a s t u s s u o j e l u a l u e e n + k a l a s t u s s u o j e l u a l u e t t a + k a l a s t u s s u u n n i t e l m a + k a l a s t u s s u u n n i t e l m a a + k a l a s t u s s u u n n i t e l m a n + k a l a s t u s s u u n n i t e l m i a + k a l a s t u s s u u n n i t e l m i e n + k a l a s t u s s u u n n i t e l m i s t a + k a l a s t u s s ä ä d ö k s i ä + k a l a s t u s s ä ä n n ö i s t ä + k a l a s t u s s ä ä n n ö t + k a l a s t u s s ä ä n t ö j ä + k a l a s t u s t a + k a l a s t u s t a k a a n + k a l a s t u s t a p o i h i n + k a l a s t u s t a p o j a + k a l a s t u s t a r k a s t a j a t + k a l a s t u s t a r k a s t a j i s t a + k a l a s t u s t a r k a s t u k s i a + k a l a s t u s t a r p e i t a + k a l a s t u s t a r v i k k e i t a + k a l a s t u s t a s o j e n + k a l a s t u s t a s o n + k a l a s t u s t a u o s t a + k a l a s t u s t a v a n + k a l a s t u s t a v a t + k a l a s t u s t e k n i i k a n + k a l a s t u s t e k n i i k k a + k a l a s t u s t e k n i i k k a a + k a l a s t u s t e k n i i k o i d e n + k a l a s t u s t e k n i i k o i h i n + k a l a s t u s t e k n i i k o i s t a + k a l a s t u s t e k n i i k o i t a + k a l a s t u s t e k n o l o g i a n + k a l a s t u s t e o l l i s u u d e l l a + k a l a s t u s t e o l l i s u u d e l l e + k a l a s t u s t e o l l i s u u d e l l e e n + k a l a s t u s t e o l l i s u u d e n + k a l a s t u s t e o l l i s u u d e n k i n + k a l a s t u s t e o l l i s u u d e s s a + k a l a s t u s t e o l l i s u u d e s t a + k a l a s t u s t e o l l i s u u d e s t a a n + k a l a s t u s t e o l l i s u u k s i s t a + k a l a s t u s t e o l l i s u u s + k a l a s t u s t e o l l i s u u t e e n + k a l a s t u s t e o l l i s u u t e m m e + k a l a s t u s t e o l l i s u u t e n s a + k a l a s t u s t e o l l i s u u t t a + k a l a s t u s t e o l l i s u u t t a a n + k a l a s t u s t e o l l i s u u t t a k a a n + k a l a s t u s t i l a n t e i t a + k a l a s t u s t o i m e n p i t e i t ä + k a l a s t u s t o i m e t + k a l a s t u s t o i m i a + k a l a s t u s t o i m i e n + k a l a s t u s t o i m i n n a l l a + k a l a s t u s t o i m i n n a l l e + k a l a s t u s t o i m i n n a l t a + k a l a s t u s t o i m i n n a n + k a l a s t u s t o i m i n n a s s a + k a l a s t u s t o i m i n n a s t a + k a l a s t u s t o i m i n n o i l l e + k a l a s t u s t o i m i n t a + k a l a s t u s t o i m i n t a a + k a l a s t u s t o i m i n t a a n + k a l a s t u s t o i m i n t a a n s a + k a l a s t u s t o i m i n t a n s a + k a l a s t u s t o i m i n t o j e n + k a l a s t u s t o i m i s t a m m e + k a l a s t u s t u k i a + k a l a s t u s t u k i e n + k a l a s t u s t u o t a n n o n + k a l a s t u s t u o t a n t o + k a l a s t u s t u o t t e e t + k a l a s t u s t u o t t e i d e n + k a l a s t u s t u o t t e i l l e + k a l a s t u s t u o t t e i s i i n + k a l a s t u s t u o t t e i s t a + k a l a s t u s t u o t t e i t a + k a l a s t u s t u o t t e i t a a n + k a l a s t u s t u t k i m u k s e e n + k a l a s t u s t u t k i m u k s i a + k a l a s t u s t u t k i m u s + k a l a s t u s t u t k i m u s t a + k a l a s t u s t u t k i m u s t u l o s t e n + k a l a s t u s t y y p p i e n + k a l a s t u s t y ö n t e k i j ö i d e n + k a l a s t u s t y ö r y h m ä + k a l a s t u s u l k o p o l i t i i k a n + k a l a s t u s u u d i s t u k s e m m e + k a l a s t u s u u d i s t u k s e n + k a l a s t u s u u d i s t u s + k a l a s t u s u u d i s t u s t a + k a l a s t u s v a i h e e s s a + k a l a s t u s v a l i o k u n n a n + k a l a s t u s v a l i o k u n n a s s a + k a l a s t u s v a l i o k u n t a + k a l a s t u s v a l i o k u n t a a n + k a l a s t u s v a l t i o i d e n + k a l a s t u s v a l t i o i l l a + k a l a s t u s v a l t i o i l l e + k a l a s t u s v a l t i o s s a n i + k a l a s t u s v a l t i o t + k a l a s t u s v a l v o n t a a + k a l a s t u s v a l v o n t a v i r a s t o a + k a l a s t u s v a l v o n t a v i r a s t o n + k a l a s t u s v a p a u t t a + k a l a s t u s v a r o i l l e + k a l a s t u s v a r o j a + k a l a s t u s v e n e + k a l a s t u s v e n e e n + k a l a s t u s v e n e e t + k a l a s t u s v e n e i d e n + k a l a s t u s v e n e i t ä + k a l a s t u s v e n e k a p a s i t e e t i n + k a l a s t u s v e r k k o i h i n + k a l a s t u s v e r k o n + k a l a s t u s v e s i e n + k a l a s t u s v e s i l l e + k a l a s t u s v e s i l l e e n + k a l a s t u s v e s i l l ä + k a l a s t u s v e s i l l ä ä n + k a l a s t u s v e s i s s ä m m e + k a l a s t u s v e s i ä + k a l a s t u s v i r a n o m a i s e t + k a l a s t u s v i r a n o m a i s t e n + k a l a s t u s v i r a s t o + k a l a s t u s v i r a s t o n + k a l a s t u s v o i m a v a r o j e n + k a l a s t u s v u o d e n + k a l a s t u s v u o s i e n + k a l a s t u s v y ö h y k e + k a l a s t u s v y ö h y k e t t ä + k a l a s t u s v y ö h y k k e e l l ä + k a l a s t u s v y ö h y k k e e n + k a l a s t u s v y ö h y k k e e t + k a l a s t u s v y ö h y k k e i d e n + k a l a s t u s v y ö h y k k e i l l e + k a l a s t u s v y ö h y k k e i l l ä + k a l a s t u s v y ö h y k k e i t ä + k a l a s t u s v ä l i n e + k a l a s t u s v ä l i n e e t + k a l a s t u s v ä l i n e i d e n + k a l a s t u s v ä l i n e i s i i n + k a l a s t u s v ä l i n e i t ä + k a l a s t u s y h d i s t y k s e n + k a l a s t u s y h d y s k u n t i i n + k a l a s t u s y h t e i s t y ö t ä + k a l a s t u s y h t e i s ö + k a l a s t u s y h t e i s ö i h i n + k a l a s t u s y h t e i s ö i l l e + k a l a s t u s y h t e i s ö i l l e m m e + k a l a s t u s y h t e i s ö i l l ä + k a l a s t u s y h t e i s ö i s s ä + k a l a s t u s y h t e i s ö j e m m e + k a l a s t u s y h t e i s ö j e n + k a l a s t u s y h t e i s ö j e n s ä + k a l a s t u s y h t e i s ö j ä + k a l a s t u s y h t e i s ö j ä m m e + k a l a s t u s y h t e i s ö m m e + k a l a s t u s y h t e i s ö n + k a l a s t u s y h t e i s ö t + k a l a s t u s y h t e i s ö ä + k a l a s t u s y h t e i s ö ä m m e + k a l a s t u s y h t e i s ö ö n + k a l a s t u s y k s i n o i k e u s + k a l a s t u s y r i t y k s e n + k a l a s t u s y r i t y k s e t + k a l a s t u s y r i t y k s i i n + k a l a s t u s y r i t y k s i l l e + k a l a s t u s y r i t y k s i l l ä + k a l a s t u s y r i t y k s i s s ä + k a l a s t u s y r i t y k s i s t ä + k a l a s t u s y r i t y k s i ä + k a l a s t u s y r i t y s + k a l a s t u s y r i t y s t e n + k a l a s t u s y r i t y s t ä + k a l a s ä i l y k e a l a a + k a l a s ä i l y k e t e o l l i s u u d e n + k a l a s ä i l y k e t e o l l i s u u s + k a l a s ä i l y k e t u o t a n n o s t a + k a l a s ä i l y k k e e t + k a l a s ä i l y k k e i d e n + k a l a s ä i l y k k e i l l ä + k a l a s ä i l y k k e i t ä + k a l a s ä ä s k i k e s k u k s e s s a + k a l a t + k a l a t a l o u d e l l e + k a l a t a l o u d e n + k a l a t a l o u d e s s a + k a l a t a l o u d e s t a + k a l a t a l o u s + k a l a t a l o u s a l a + k a l a t a l o u s a l a a + k a l a t a l o u s a l a a m m e + k a l a t a l o u s a l a a n + k a l a t a l o u s a l a a n s a + k a l a t a l o u s a l a k i n + k a l a t a l o u s a l a l l a + k a l a t a l o u s a l a l l a m m e + k a l a t a l o u s a l a l l e + k a l a t a l o u s a l a n + k a l a t a l o u s a l a s t a + k a l a t a l o u s a r v i o + k a l a t a l o u s a s i a n + k a l a t a l o u s a s i o i s t a + k a l a t a l o u s a s i o i t a + k a l a t a l o u s b u d j e t i n + k a l a t a l o u s b u d j e t t i a + k a l a t a l o u s i n t r e s s i t + k a l a t a l o u s k o m i s s i o + k a l a t a l o u s k o m i s s i o s s a + k a l a t a l o u s k o m i t e a + k a l a t a l o u s k r i i s i ä + k a l a t a l o u s k y s y m y k s e e n + k a l a t a l o u s l u v u s t a + k a l a t a l o u s m i n i s t e r e i d e n + k a l a t a l o u s m i n i s t e r i e n + k a l a t a l o u s m i n i s t e r i n e u v o s t o a + k a l a t a l o u s m i n i s t e r i ö n + k a l a t a l o u s n e u v o s t o + k a l a t a l o u s n e u v o s t o j e n + k a l a t a l o u s n e u v o s t o n + k a l a t a l o u s n e u v o s t o s s a + k a l a t a l o u s p o l i i t t i s i a + k a l a t a l o u s p o l i t i i k a n + k a l a t a l o u s p o l i t i i k a s s a + k a l a t a l o u s p o l i t i i k a s t a + k a l a t a l o u s p o l i t i i k k a + k a l a t a l o u s p o l i t i i k k a a + k a l a t a l o u s p o l i t i i k k a a n + k a l a t a l o u s r a h a s t o + k a l a t a l o u s r a h a s t o a + k a l a t a l o u s r a h a s t o l l a + k a l a t a l o u s r a h a s t o l l e + k a l a t a l o u s r a h a s t o n + k a l a t a l o u s r a h a s t o o n + k a l a t a l o u s r a h a s t o s s a + k a l a t a l o u s r a h a s t o s t a + k a l a t a l o u s r a h a s t o t + k a l a t a l o u s s e k t o r i a a n + k a l a t a l o u s s e k t o r i i n + k a l a t a l o u s s e k t o r i l l e + k a l a t a l o u s s o p i m u k s e n + k a l a t a l o u s s o p i m u k s i a + k a l a t a l o u s s o p i m u s t a + k a l a t a l o u s s o p i m u s t e n + k a l a t a l o u s t e o l l i s u u d e n + k a l a t a l o u s t e o l l i s u u d e s s a + k a l a t a l o u s t i e d e + k a l a t a l o u s t u o t t e e t + k a l a t a l o u s t u o t t e i d e n + k a l a t a l o u s t u o t t e i l l e + k a l a t a l o u s t u o t t e i s t a + k a l a t a l o u s t u o t t e i t a + k a l a t a l o u s v a l i o k u n n a l l a + k a l a t a l o u s v a l i o k u n n a l l e + k a l a t a l o u s v a l i o k u n n a l t a + k a l a t a l o u s v a l i o k u n n a n + k a l a t a l o u s v a l i o k u n n a s s a + k a l a t a l o u s v a l i o k u n n a s s a m m e + k a l a t a l o u s v a l i o k u n n a s t a + k a l a t a l o u s v a l i o k u n t a + k a l a t a l o u s v a l i o k u n t a a + k a l a t a l o u s v a l i o k u n t a a m m e + k a l a t a l o u s v a l i o k u n t a a n + k a l a t a l o u s v a l i o k u n t a k a a n + k a l a t a l o u s v a l i o k u n t a m m e + k a l a t a l o u s v a l i o k u n t a n n e + k a l a t a l o u t e e n + k a l a t a l o u t e m m e + k a l a t a l o u t t a + k a l a t a u d i t + k a l a t a u t e i h i n + k a l a t a u t e j a + k a l a t a u t i e n + k a l a t e o l l i s u u d e l l a + k a l a t e o l l i s u u d e l l e + k a l a t e o l l i s u u d e n + k a l a t e o l l i s u u d e s s a + k a l a t e o l l i s u u d e s t a + k a l a t e o l l i s u u s + k a l a t e o l l i s u u s a l a a + k a l a t e o l l i s u u t t a + k a l a t i i r a + k a l a t o i m i t u s t e n + k a l a t o n n i a + k a l a t o r i + k a l a t u o t a n n o n + k a l a t u o t a n n o s t a + k a l a t u o t a n t o + k a l a t u o t a n t o o n + k a l a t u o t e t u l l e i s t a + k a l a t u o t t a j i e n + k a l a t u o t t e e n + k a l a t u o t t e e t + k a l a t u o t t e i d e n + k a l a t u o t t e i s i i n + k a l a t u o t t e i s t a + k a l a t u o t t e i t a + k a l a v a e l l u k s e n + k a l a v a r a + k a l a v a r a m m e + k a l a v a r a n n o t + k a l a v a r a n s a + k a l a v a r a n t o i h i n + k a l a v a r a n t o j a + k a l a v a r a t + k a l a v a r o i h i n + k a l a v a r o i l l a m m e + k a l a v a r o i l l e + k a l a v a r o i s s a + k a l a v a r o i s t a + k a l a v a r o j a + k a l a v a r o j a a n + k a l a v a r o j a m m e + k a l a v a r o j e m m e + k a l a v a r o j e n + k a l a v a r o j e n s a + k a l a v e d e t + k a l a v e r k k o + k a l a v e r k k o j a + k a l a v e r k k o j e n + k a l a v e r k o i s s a + k a l a v e s i e n + k a l a v e s i l l e + k a l a v e s i l t ä + k a l a v e s i ä + k a l a v e t e n s ä + k a l a v i l j e l y s t e n + k a l a ö l j y + k a l a ö l j y j ä + k a l a ö l j y k s i + k a l a ö l j y n + k a l a ö l j y t e o l l i s u u d e l l a + k a l a ö l j y t e o l l i s u u d e l l e + k a l a ö l j y ä + k a l d e a l a i s e t + k a l e n j i n i t + k a l e n t e r i e h d o t u s t a + k a l e n t e r i l u o n n o k s e e n + k a l e n t e r i n + k a l e n t e r i p ä i v ä ä + k a l e n t e r i s a t t u m a n + k a l e n t e r i t y t ö t + k a l e n t e r i v i i k k o a + k a l e n t e r i v i i k o n + k a l e n t e r i v u o d e n + k a l e n t e r i v u o d e s t a + k a l e n t e r i v u o n n a + k a l e n t e r i v u o s i + k a l e n t e r i v u o s i i n + k a l e n t e r i v u o s i k s i + k a l e n t e r i v u o t e e n + k a l e n t e r i v u o t t a + k a l e n t e r i ä ä n e s t y k s e t + k a l e v a n t u l e t + k a l i f o r n i a l a i s e n + k a l i n g a + k a l i u m a s e t a a t t i + k a l i u m b r o m i d i + k a l i u m f l u o r i d i + k a l i u m f o r m i a a t t i + k a l i u m h y d r i d i + k a l i u m h y d r o k s i d i + k a l i u m j o d i d i + k a l i u m k a r b o n a a t t i + k a l i u m k l o r a a t t i + k a l i u m k l o r i d i + k a l i u m k r o m a a t t i + k a l i u m n i t r a a t i n + k a l i u m n i t r a a t i s t a + k a l i u m n i t r a a t t i + k a l i u m n i t r a a t t i a + k a l i u m n i t r i i t t i + k a l i u m o k s i d i + k a l i u m p e r k l o r a a t t i + k a l i u m p y r o s u l f a a t t i + k a l i u m s u l f a a t i n + k a l i u m s u l f a a t t i + k a l i u m s u l f i d i + k a l i u m s u p e r o k s i d i + k a l i u m s y a n a a t t i + k a l i u m s y a n i d i + k a l i u m s y a n i d i n + k a l i u m t i o s y a n a a t t i + k a l i u m v e t y k a r b o n a a t t i + k a l i u m v e t y o k s a l a a t t i + k a l i u m v e t y s u l f a a t t i + k a l j a k e l l u n t a + k a l j u i i b i s + k a l j u k o t i n g a + k a l j u k u l t a s a d e + k a l j u m e s i k k o + k a l j u n a a m a k a i j a + k a l j u n a a m a m e s i k k o + k a l j u p ä ä k o t k a + k a l j u r o t t a + k a l j u s i l m ä r a s t a s + k a l k i t s e m i s e e n + k a l k k i k i v e n + k a l k k i l a a s t i + k a l k k i m a a r i a n k ä m m e k k ä + k a l k k i n i i t t y + k a l k k i p ö l y l l e + k a l k k i s i e m e n k o t i l o + k a l k k i s i e n e t + k a l k k i t e h d a s + k a l k k i t e o l l i s u u d e n + k a l k k i t e o l l i s u u t e e n + k a l k k u n a k o n d o r i + k a l k k u n a n k a s v a t u k s e n + k a l l a s i l t a + k a l l a s t a + k a l l e i m m a l l a + k a l l e i m m a n + k a l l e i m m a t + k a l l e i m m i s t a + k a l l e i m p a n a + k a l l e i m p i a + k a l l e i m p i e n + k a l l e i n + k a l l e i n t a + k a l l e l l a a n + k a l l e u d e n + k a l l i i d e n + k a l l i i k s i + k a l l i i l l a + k a l l i i l t a + k a l l i i m m a k s i + k a l l i i m m a l l a + k a l l i i m m a l l e + k a l l i i m m a n + k a l l i i m m a s s a + k a l l i i m m a s t a + k a l l i i m m a t + k a l l i i m m i k s i + k a l l i i m m i l l a + k a l l i i m m i l l e + k a l l i i m m i l t a + k a l l i i m m i n + k a l l i i m m i s s a + k a l l i i m m i s t a + k a l l i i m p a a + k a l l i i m p a a n + k a l l i i m p i + k a l l i i m p i a + k a l l i i m p i e n + k a l l i i m p i i n + k a l l i i m p i n a + k a l l i i n + k a l l i i s e e n + k a l l i i s t a + k a l l i i t + k a l l i i t a + k a l l i o i m a r r e + k a l l i o k e r r o s t u m i i n + k a l l i o k i e l o + k a l l i o k i i p e i l y + k a l l i o k i r v i n e n + k a l l i o k o h o k k i + k a l l i o k y y h k y + k a l l i o k ä ä r m e + k a l l i o m a a l a u k s e t + k a l l i o m a a l a u k s i s s a + k a l l i o m a a l a u s + k a l l i o m a k s a r u o h o + k a l l i o m u o d o s t e l m i i n + k a l l i o n a k k e l i + k a l l i o n a u h u s + k a l l i o p a l m i k k o s a m m a l + k a l l i o p e r ä ä n + k a l l i o p i i r r o k s e t + k a l l i o p u l l o p u u + k a l l i o p ä ä s k y + k a l l i o p ä ä s k y t + k a l l i o s i n i s i i p i + k a l l i o s i r k k u + k a l l i o t a i d e + k a l l i o t i e r a s a m m a l + k a l l i o t ö y h t ö p i n g v i i n i + k a l l i o v a r p u n e n + k a l l i o v i l i s t ä j ä + k a l l i o v u o r e t + k a l l i s a r v o i n e n + k a l l i s a r v o i s e k s i + k a l l i s a r v o i s i a + k a l l i s a r v o i s i m p a a n + k a l l i s a r v o i s i m p i a + k a l l i s a r v o i s i n + k a l l i s a r v o i s i n t a + k a l l i s a r v o i s t a + k a l l i s t u i s i + k a l l i s t u i v a t + k a l l i s t u m i s e e n + k a l l i s t u n e e t + k a l l i s t u n e i t a + k a l l i s t u u + k a l l i s t u v a t + k a l l o i n d e k s i + k a l l o n m u r t u m a + k a l l o n m u r t u m a n + k a l m a n h a j u i s i a + k a l m a n r a l l i + k a l m a r i n s a l m i + k a l m o k o r p p i k o t k a + k a l m u k i t + k a l m u k k i a r o + k a l o i h i n + k a l o i l l e + k a l o i s s a + k a l o i s t a + k a l o i s t a a n + k a l o j a + k a l o j e n + k a l o m e l i e l e k t r o d i + k a l o r e i t a + k a l o r i a r v o + k a l o r i a r v o n + k a l o r i s i s ä l t ö + k a l o r i t a r p e i s t a + k a l o t t i a l u e e l l a + k a l o t t i a l u e e n + k a l o t t i a l u e t t a + k a l o t t i g i b b o n i + k a l o t t i t a s k u + k a l p a e r a k k o k o l i b r i + k a l p a r i t a r i s t o + k a l p e n e e + k a l p e n e v a t + k a l s i u m a s e t a a t t i + k a l s i u m b e n t s o a a t t i + k a l s i u m b r o m i d i + k a l s i u m d i v e t y f o s f a a t t i + k a l s i u m f l u o r i d i + k a l s i u m f o s f a a t t i + k a l s i u m h y d r o k s i d i + k a l s i u m k a n a v a n + k a l s i u m k a r b i d i + k a l s i u m k a r b o n a a t t i + k a l s i u m k l o r a a t t i + k a l s i u m k l o r i d i + k a l s i u m n i t r a a t t i + k a l s i u m o k s i d i + k a l s i u m s i t r a a t t i + k a l s i u m s u o l o j e n + k a l s i u m t i t a n a a t t i + k a l s i u m v e t y f o s f a a t t i + k a l t a i s e n + k a l t a i s e t + k a l t a i s i a + k a l t a i s i i n + k a l t a i s i l l a n i + k a l t a i s i l l e m m e + k a l t a i s i n a + k a l t a i s i s t a + k a l t a i s t e n + k a l t e v a l l e + k a l u s t a a + k a l u s t e i s s a + k a l u s t o a + k a l u s t o l u e t t e l o + k a l u s t o n + k a l u s t o o n + k a l u s t o p ä ä l l i k ö i t ä + k a l u s t o s t a + k a l u s t u s l a i v a s t o j e n + k a l v i n i s t i s t a + k a l v o j ä n n i t e + k a l v o k e n n o t e k n i i k a l l a + k a l v o p r o t e i i n i + k a l v o s i i p i + k a l v o t e k n i i k k a a + k a m a l a a + k a m a l a m p a a + k a m a l i i n + k a m a l i m m i s t a + k a m a l i s t a + k a m a l u u d e s t a + k a m a r e i d e n + k a m a r i j u n k k a r i + k a m a r i k u o r o + k a m a r i m u s i i k k i + k a m a r i m u s i i k k i a + k a m a r i p o p + k a m a r i s s a + k a m b a t + k a m b o d ž a l a i s i l l a + k a m b o d ž a l a i s t e n + k a m e l e o n t t i l e h t i + k a m e l i a n a i n e n + k a m e l i k i l p a i l u t + k a m e l i s t a + k a m e r a m i e h e n + k a m e r a o p e r a a t t o r i + k a m e r a p u h e l i n + k a m e r a r y h m ä + k a m e r a t + k a m e r a t e k n i i k a n + k a m e r a v a l v o n t a + k a m e r a v a l v o n t a j ä r j e s t e l m ä ä + k a m e r a y h t e y d e n + k a m e r o i d e n + k a m e r o i t a + k a m e r u n i l a i s e s s a + k a m f e r i p u u + k a m i k a z e t y y l i i n + k a m m a n + k a m m i o l e p a t u s + k a m m i o t a k y k a r d i a + k a m m i o v ä l i s e i n ä a u k k o + k a m m i o v ä r i n ä + k a m m o t t a v a m p i + k a m m o t t a v a m p i a + k a m m o t t a v a n + k a m m o t t a v i a + k a m m o t t a v i m m i s t a + k a m m o t t a v i s t a + k a m o m i l l a s a u n i o + k a m o m i l l a t e e t ä + k a m p a a m o a + k a m p a a m o p a l v e l u i h i n + k a m p a a m o t u k i + k a m p a k e r a a m i n e n + k a m p a k ä p y p a l m u + k a m p a m e d u u s a n + k a m p a m e r i t ä h t i + k a m p a n j a a + k a m p a n j a a n + k a m p a n j a a n s a + k a m p a n j a j o h t a j a + k a m p a n j a j ä r j e s t ö t + k a m p a n j a j ä r j e s t ö ä + k a m p a n j a k o o r d i n a a t t o r i + k a m p a n j a l l a + k a m p a n j a l l a a n + k a m p a n j a n + k a m p a n j a n a + k a m p a n j a n s a + k a m p a n j a p ä i v i ä + k a m p a n j a p ä ä l l i k k ö + k a m p a n j a r y h m i e n + k a m p a n j a r y h m i i n + k a m p a n j a r y h m ä t + k a m p a n j a s s a a n + k a m p a n j a s s a n n e + k a m p a n j a s t a + k a m p a n j a s u u n n i t e l m a n + k a m p a n j a t + k a m p a n j a t a p a h t u m a n + k a m p a n j a t a p a h t u m i i n + k a m p a n j o i d a + k a m p a n j o i d a k s e e n + k a m p a n j o i d e n + k a m p a n j o i d e s s a a n + k a m p a n j o i h i n + k a m p a n j o i m i n e n + k a m p a n j o i m m e + k a m p a n j o i n n i n + k a m p a n j o i n t i a + k a m p a n j o i n t i a i k a a + k a m p a n j o i n t i i n + k a m p a n j o i n t i t a r k o i t u k s i i n + k a m p a n j o i t a + k a m p a n j o i t a v a + k a m p a o k a m o n n i + k a m p a s a h a r a u s k u + k a m p a s a m m a l + k a m p a s a n i a i n e n + k a m p a s a r v i s e t + k a m p a v e n u s s i m p u k k a + k a m p e l a k a l o j e n + k a m p e l a k i i n t i ö t ä + k a m p i l i i r a + k a m p p a i l e e + k a m p p a i l e m a a n + k a m p p a i l e m a t t a + k a m p p a i l e m m e + k a m p p a i l e v a a + k a m p p a i l e v a l l e + k a m p p a i l e v a t + k a m p p a i l t a v a + k a m p p a i l u a + k a m p p a i l u a a n + k a m p p a i l u l l e + k a m p p a i l u s s a + k a m p p a i l u s t a a n + k a m p p a i l u u n + k a m p u r a j a l k a + k a m p u s r a d i o + k a n a a + k a n a a l i n + k a n a a l i s a a r e t + k a n a a l i s a a r i a + k a n a a l i s a a r i l l a + k a n a a l i s a a r i l l e + k a n a a l i t u n n e l i + k a n a a l i t u n n e l i a + k a n a a l i t u n n e l i n + k a n a a l i t u n n e l i s s a + k a n a a l i t u n n e l i s t a + k a n a a l i v e r k o s t o + k a n a d a + k a n a d a l a i s e t + k a n a d a l a i s t e n + k a n a d a n i l v e s + k a n a d a n r a n s k a l a i s e t + k a n a f i l e e n s ä + k a n a f i l e i s t ä + k a n a h a u k k a + k a n a h ä k k i e n + k a n a i l l a l l i s t a + k a n a i n f l u e n s s a + k a n a k e i t t o + k a n a k o h t a i s e n + k a n a k y y h k y t + k a n a l a s s a + k a n a n k a s v a t t a j i a + k a n a n k i r p p u + k a n a n l e n t o + k a n a n l i h a + k a n a n l i h a a + k a n a n l i h a a n + k a n a n l i h a n + k a n a n l i h a n t u o t t a j i a + k a n a n l i h a s t a + k a n a n m u n a m a r k k i n o i d e n + k a n a n m u n a m a r k k i n o i l l a + k a n a p a r o i l l e + k a n a p u n k k i + k a n a r i a l i n n u i l l e + k a n a t a l o u s + k a n a t a r h a n + k a n a v a a + k a n a v a h a n k k e e n + k a n a v a k i r j o n t a + k a n a v a l a i v o j e n + k a n a v a l i i k e n t e e n + k a n a v a l l a + k a n a v a l m i s t e i t a + k a n a v a l o g o + k a n a v a m a n i a + k a n a v a n + k a n a v a r k a u d e s t a + k a n a v a t r a n s i s t o r i + k a n a v a v e r k o s t o n + k a n a v i a + k a n a v i e n + k a n a v i i n + k a n a v i s t a + k a n a v o i d a a n + k a n a v o i m i s e k s i + k a n a v o i t a i s i i n + k a n a v o i t a v a + k a n d i d a a t t i a s e m a + k a n d i d a a t t i a s e m a a n + k a n d i d a a t t i a s e m a s t a + k a n d i d a a t t i m a i s s a + k a n d i d a a t t i o p i n t o i h i n + k a n d i d a a t t i o p i n t o j e n s a + k a n e l i e r a k k o k o l i b r i + k a n e l i h a a s t e + k a n e l i h a p p o + k a n e l i k i r v i n e n + k a n e l i k o r v a k o t t a r a i n e n + k a n e l i k u r k k u k i p u a j a + k a n e l i l e p i n k ä i s t y r a n n i + k a n e l i p e r ä t r o g o n i + k a n e l i p e u k a l o i n e n + k a n e l i p ö l l ö n e n + k a n e l i s a p e l i k o l i b r i + k a n e l i s e i t i k k i + k a n e l i s o r s a + k a n e l i t i k k a n e n + k a n e l i t y r a n n i + k a n e l i v a r p u n e n + k a n e m b u t + k a n e r v a m i t t a r i + k a n g a s a j u r u o h o + k a n g a s h a p e r o + k a n g a s k a r h u n s a m m a l + k a n g a s k e l t a v a l m u s k a + k a n g a s k o r t e + k a n g a s k ä r p ä s s i e n i + k a n g a s k ä ä r m e + k a n g a s l i m a s e i t i k k i + k a n g a s l o h i s i e n i + k a n g a s m a i t i k k a + k a n g a s p e r h o n e n + k a n g a s r a h k a s a m m a l + k a n g a s r o u s k u + k a n g a s r u s o k a s + k a n g a s s i n i s i i p i + k a n g a s s i r k k a + k a n g a s t a t t i + k a n g a s v u o k k o + k a n i h y p p y + k a n i n + k a n i t i l o j a + k a n k a a l l e + k a n k a a n p a i n a n t a + k a n k a a s t a + k a n k i a s e t i n l a i t e + k a n k i r a u t a + k a n n a b i k s e n + k a n n a b i s l e i v o n n a i n e n + k a n n a b i s t u o t t e i d e n + k a n n a b i s v i l j e l m i ä + k a n n a b i s y h d i s t y s + k a n n a k s e n + k a n n a l t a m m e + k a n n a n + k a n n a n i l m a u k s e n + k a n n a n m u o d o s t u k s e e n + k a n n a n m u u t o k s e n + k a n n a n m u u t o s + k a n n a n o t o i s s a + k a n n a n o t o i s s a a n + k a n n a n o t o i s s a n i + k a n n a n o t o i s t a + k a n n a n o t o l l a + k a n n a n o t o l l a a n + k a n n a n o t o l l e + k a n n a n o t o n + k a n n a n o t o s s a a n + k a n n a n o t o s t a + k a n n a n o t o t + k a n n a n o t t o + k a n n a n o t t o a + k a n n a n o t t o a n n e + k a n n a n o t t o i h i n + k a n n a n o t t o j a + k a n n a n o t t o j a n i + k a n n a n o t t o j e n + k a n n a n o t t o n i + k a n n a n o t t o n s a + k a n n a n o t t o o n + k a n n a n v a i h t o + k a n n a s s a a n + k a n n a s s a m m e + k a n n a s s a n n e + k a n n a s t a a n + k a n n a s t a m m e + k a n n a s t a n i + k a n n a t + k a n n a t a m m e + k a n n a t a m m e k i n + k a n n a t a m m e k o + k a n n a t a n + k a n n a t a n k i n + k a n n a t a n k o + k a n n a t a t t e + k a n n a t a t t e k o + k a n n a t e t a + k a n n a t e t a a n + k a n n a t e t a a n k o + k a n n a t e t t a v a a + k a n n a t e t t a v a m m a n + k a n n a t e t t a v a n a + k a n n a t e t t a v i a + k a n n a t i m m e + k a n n a t t a a + k a n n a t t a a k i n + k a n n a t t a a k o + k a n n a t t a a k s e m m e + k a n n a t t a e s s a a n + k a n n a t t a e s s a m m e + k a n n a t t a e s s a n i + k a n n a t t a i s i + k a n n a t t a i s i k i n + k a n n a t t a i s i k o + k a n n a t t a i s i k o h a n + k a n n a t t a i s i m m e + k a n n a t t a i s i n + k a n n a t t a i s i t t e + k a n n a t t a i s i v a t + k a n n a t t a j a k s i + k a n n a t t a j a n + k a n n a t t a j a n a + k a n n a t t a j a r y h m i e n + k a n n a t t a j a t + k a n n a t t a j a y h d i s t y k s e t + k a n n a t t a j a y h d i s t y s t e n + k a n n a t t a j i a + k a n n a t t a j i a a n + k a n n a t t a j i e n + k a n n a t t a j i e n s a + k a n n a t t a j i i n i + k a n n a t t a j i i n s a + k a n n a t t a j i k s i + k a n n a t t a j i l l e + k a n n a t t a j i n a + k a n n a t t a k a a + k a n n a t t a k a a m m e + k a n n a t t a m a a n + k a n n a t t a m a m m e + k a n n a t t a m a n + k a n n a t t a m a s s a m m e + k a n n a t t a m a s s a n i + k a n n a t t a m a s t a + k a n n a t t a m a t t a + k a n n a t t a m a t t o m a m p i e n + k a n n a t t a m a t t o m a n a + k a n n a t t a m a t t o m i a + k a n n a t t a n e e + k a n n a t t a n e e n a + k a n n a t t a n e e t + k a n n a t t a n u t + k a n n a t t a v a a + k a n n a t t a v a a n + k a n n a t t a v a k s i + k a n n a t t a v a m m a k s i + k a n n a t t a v a m m i k s i + k a n n a t t a v a m m i n + k a n n a t t a v a m p a a + k a n n a t t a v a m p i + k a n n a t t a v a m p i a + k a n n a t t a v a m p i i n + k a n n a t t a v a n + k a n n a t t a v a n i + k a n n a t t a v a n n e + k a n n a t t a v a n s a + k a n n a t t a v a t + k a n n a t t a v a t k o + k a n n a t t a v i a + k a n n a t t a v i m m a k s i + k a n n a t t a v i m m a l l e + k a n n a t t a v i m m a t + k a n n a t t a v i m m i l l a + k a n n a t t a v i m m i s s a + k a n n a t t a v i m m i s t a + k a n n a t t a v i m p i a + k a n n a t t a v i n + k a n n a t t a v i n t a + k a n n a t t a v u u d e n + k a n n a t t a v u u s a j a t t e l u + k a n n a t t a v u u s a j a t t e l u a + k a n n a t t a v u u s a r v i o i n n i t + k a n n a t t a v u u s k r i t e e r i e n + k a n n a t t a v u u s l u k u j e n + k a n n a t t a v u u s n ä k y m ä t + k a n n a t t a v u u s n ä k ö k o h d a t + k a n n a t t a v u u s o n g e l m i a + k a n n a t t a v u u s o n g e l m i e n + k a n n a t t a v u u s r a j a n + k a n n a t t a v u u s s y i s t ä + k a n n a t t a v u u s t a s o + k a n n a t t a v u u s t e k i j ä + k a n n a t t a v u u s v a a t i m u k s i i n + k a n n a t t a v u u t e e n + k a n n a t t a v u u t t a + k a n n a t t a v u u t t a a n + k a n n a t t i + k a n n a t t i v a t + k a n n a t u k s e e m m e + k a n n a t u k s e e n + k a n n a t u k s e l l a + k a n n a t u k s e m m e + k a n n a t u k s e n + k a n n a t u k s e n n e + k a n n a t u k s e n s a + k a n n a t u s e r o + k a n n a t u s l u v u t + k a n n a t u s p o h j a + k a n n a t u s p o h j a a + k a n n a t u s p o h j a n + k a n n a t u s s e u r a t + k a n n a t u s t a + k a n n a t u s t a n i + k a n n e k e l p o i s e t + k a n n e k e l p o i s i a + k a n n e o i k e u d e n + k a n n e o i k e u k s i a + k a n n e o i k e u t t a + k a n n e t a a n + k a n n e t t a v a k s i + k a n n e t t a v a t + k a n n e t t a v i i n + k a n n e t u t + k a n n e v y ö r y + k a n n e v ä l i n e e n + k a n n i b a l i s m i k i e l t o + k a n n o i l l a m m e + k a n n o i s s a + k a n n o i s s a a n + k a n n o i s t a + k a n n o i s t a a n + k a n n o i s t a n n e + k a n n o l l e + k a n n u k s e n s a + k a n n u s k i l p i k o n n a + k a n n u s k i u r u + k a n n u s s i n i s i i p i + k a n n u s t a a + k a n n u s t a a k i n + k a n n u s t a a k s e e n + k a n n u s t a a k s e m m e + k a n n u s t a a k s e n i + k a n n u s t a a k s e n n e + k a n n u s t a i s i + k a n n u s t a j a n a + k a n n u s t a k a a + k a n n u s t a k a a m m e + k a n n u s t a m a a n + k a n n u s t a m a l l a + k a n n u s t a m i s e k s e e n + k a n n u s t a m i s e k s i + k a n n u s t a m i s t a p a + k a n n u s t a m m e + k a n n u s t a n + k a n n u s t a n e e t + k a n n u s t a n k i n + k a n n u s t a t t e k o + k a n n u s t a v a m m a n + k a n n u s t a v a m m i n + k a n n u s t a v a m p a a + k a n n u s t a v a m p a a n + k a n n u s t a v a m p i + k a n n u s t a v a m p i a + k a n n u s t a v a n + k a n n u s t a v a s t a + k a n n u s t a v a t + k a n n u s t a v i a + k a n n u s t e j ä r j e s t e l m ä + k a n n u s t e j ä r j e s t e l m ä ä + k a n n u s t e t a a n + k a n n u s t e t a a n k i n + k a n n u s t e t a a n k o + k a n n u s t e t t a e s s a + k a n n u s t e t t a i s i i n + k a n n u s t e t t a v a + k a n n u s t i + k a n n u s t i m e n a + k a n n u s t i m e t + k a n n u s t i m i a + k a n n u s t i m i e n + k a n n u s t i m i n + k a n n u s t i m i n a + k a n n u s t i m i s t a + k a n n u s t i n e l v y t y s + k a n n u s t i n e r ä + k a n n u s t i n j ä r j e s t e l m i ä + k a n n u s t i n j ä r j e s t e l m ä + k a n n u s t i n j ä r j e s t e l m ä n + k a n n u s t i n j ä r j e s t e l m ä n ä + k a n n u s t i n j ä r j e s t e l m ä s t ä + k a n n u s t i n j ä r j e s t e l m ä t + k a n n u s t i n j ä r j e s t e l m ä ä + k a n n u s t i n j ä r j e s t e l m ä ä n + k a n n u s t i n k e i n o t + k a n n u s t i n k ä y t ä n t ö j ä + k a n n u s t i n l o u k k u + k a n n u s t i n m e k a n i s m e j a + k a n n u s t i n o h j e l m a a + k a n n u s t i n o h j e l m a n + k a n n u s t i n o h j e l m a n s a + k a n n u s t i n o h j e l m i a + k a n n u s t i n p a k e t e i s t a + k a n n u s t i n p a k e t i n + k a n n u s t i n p a k e t i t + k a n n u s t i n p a k e t t e j a + k a n n u s t i n p a k e t t i + k a n n u s t i n r a k e n n e + k a n n u s t i n r a k e n t e i s t a + k a n n u s t i n s u u n n i t e l m a n + k a n n u s t i n t a + k a n n u s t i n t o i m e n p i t e e t + k a n n u s t i n t o i m e n p i t e i t ä + k a n n u s t i n t o i m i i n + k a n n u s t i n v a i k u t u s + k a n n u s t u s j ä r j e s t e l m i s t ä + k a n n u s t u s j ä r j e s t e l m i ä + k a n n u s t u s j ä r j e s t e l m ä + k a n n u s t u s j ä r j e s t e l m ä k s i + k a n n u s t u s j ä r j e s t e l m ä n + k a n n u s t u s j ä r j e s t e l y n + k a n n u s t u s j ä r j e s t e l y t + k a n n u s t u s l a u s e k e + k a n n u s t u s m e n e t e l m ä + k a n n u s t u s m e n e t t e l y n + k a n n u s t u s m e n e t t e l y y n + k a n n u s t u s o h j e l m a t + k a n n u s t u s o h j e l m i a + k a n n u s t u s o h j e l m i e n + k a n n u s t u s p a k e t i l l a + k a n n u s t u s p a k e t t i + k a n n u s t u s p a l k k i o + k a n n u s t u s p o l i t i i k a n + k a n n u s t u s p o l i t i i k a s s a + k a n n u s t u s t a + k a n n u s t u s t o i m e t + k a n n u s t u s v e l v o i t e + k a n o i h i n + k a n o j a + k a n o j e n + k a n o o p p i a s t i a + k a n o o t t e j a + k a n o o t t i l i i t o n + k a n o o t t i l i i t t o + k a n o o t t i p o o l o + k a n s a a + k a n s a a m m e + k a n s a a n + k a n s a a n i + k a n s a a n s a + k a n s a i n l i i t o n + k a n s a i n l i i t t o + k a n s a i n l i i t t o o n + k a n s a i n o i k e u d e l l i n e n + k a n s a i n o i k e u d e l l i s i a + k a n s a i n o i k e u d e n + k a n s a i n o i k e u t t a + k a n s a i n v a e l l u k s e n + k a n s a i n v a e l l u s + k a n s a i n v a e l l u s a i k a + k a n s a i n v a e l l u s t a + k a n s a i n v ä l i n e n + k a n s a i n v ä l i s e e n + k a n s a i n v ä l i s e k s i + k a n s a i n v ä l i s e l l e + k a n s a i n v ä l i s e l l ä + k a n s a i n v ä l i s e l l ä k i n + k a n s a i n v ä l i s e l t ä + k a n s a i n v ä l i s e m m i n + k a n s a i n v ä l i s e m m ä l l ä + k a n s a i n v ä l i s e m p i ä + k a n s a i n v ä l i s e m p ä ä + k a n s a i n v ä l i s e n + k a n s a i n v ä l i s e n ä + k a n s a i n v ä l i s e s s ä + k a n s a i n v ä l i s e s t i + k a n s a i n v ä l i s e s t i k i n + k a n s a i n v ä l i s e s t ä + k a n s a i n v ä l i s e t + k a n s a i n v ä l i s i i n + k a n s a i n v ä l i s i k s i + k a n s a i n v ä l i s i l l e + k a n s a i n v ä l i s i l l ä + k a n s a i n v ä l i s i l t ä + k a n s a i n v ä l i s i m m i s t ä + k a n s a i n v ä l i s i n + k a n s a i n v ä l i s i n ä + k a n s a i n v ä l i s i s s ä + k a n s a i n v ä l i s i s t ä + k a n s a i n v ä l i s i ä + k a n s a i n v ä l i s o i k e u d e l l i n e n + k a n s a i n v ä l i s o i k e u d e l l i s e s t a + k a n s a i n v ä l i s o i k e u d e l l i s t a + k a n s a i n v ä l i s o i k e u d e l l i s t e n + k a n s a i n v ä l i s t e n + k a n s a i n v ä l i s t e n k i n + k a n s a i n v ä l i s t y e s s ä + k a n s a i n v ä l i s t y m i s e e n + k a n s a i n v ä l i s t y v ä t + k a n s a i n v ä l i s t y y + k a n s a i n v ä l i s t ä m i s t ä + k a n s a i n v ä l i s y y s + k a n s a i n v ä l i s y y s p o l i t i i k k a a + k a n s a i n v ä l i s y y t t ä + k a n s a i n y h t e i s ö + k a n s a i n y h t e i s ö a s i a i n m i n i s t e r i + k a n s a i n y h t e i s ö l t ä + k a n s a i n y h t e i s ö n + k a n s a k u n n a n + k a n s a k u n n a t + k a n s a k u n n i s s a + k a n s a k u n n i s t a + k a n s a k u n t a + k a n s a k u n t a n a + k a n s a k u n t a n ä k e m y s t ä + k a n s a k u n t i a + k a n s a k u n t i e m m e + k a n s a k u n t i e n + k a n s a k u n t i e n v a n k i l a n + k a n s a k u n t i i n + k a n s a l a i s a g e n d a l l a + k a n s a l a i s a k t i i v i s u u t t a + k a n s a l a i s a k t i v i s m i + k a n s a l a i s a k t i v i s t e i h i n + k a n s a l a i s a k t i v i s t e i l l e + k a n s a l a i s a k t i v i s t e j a + k a n s a l a i s a k t i v i s t i e n + k a n s a l a i s a k t i v i s t i n + k a n s a l a i s a k t i v i s t i t + k a n s a l a i s a l o i t e + k a n s a l a i s a l o i t e o i k e u d e l l a + k a n s a l a i s a l o i t e t t a + k a n s a l a i s a l o i t t e e l l a + k a n s a l a i s a l o i t t e e l l e + k a n s a l a i s a l o i t t e e n + k a n s a l a i s a l o i t t e e n a + k a n s a l a i s a l o i t t e e s e e n + k a n s a l a i s a l o i t t e e s s a + k a n s a l a i s a l o i t t e e s t a + k a n s a l a i s a l o i t t e e t + k a n s a l a i s a l o i t t e i d e n + k a n s a l a i s a l o i t t e i l l e + k a n s a l a i s a l o i t t e i n e e n + k a n s a l a i s a l o i t t e i s i i n + k a n s a l a i s a l o i t t e i s s a + k a n s a l a i s a l o i t t e i t a + k a n s a l a i s a r e e n a + k a n s a l a i s a r m e i j a + k a n s a l a i s a r v o t + k a n s a l a i s a s i a k i r j a a n + k a n s a l a i s a s i a k i r j a n a + k a n s a l a i s d e m o k r a a t t i n e n + k a n s a l a i s d i p l o m a t i a + k a n s a l a i s e l l a + k a n s a l a i s e l l e + k a n s a l a i s e m m e + k a n s a l a i s e m m e k i n + k a n s a l a i s e n + k a n s a l a i s e n a + k a n s a l a i s e n n e + k a n s a l a i s e n s a + k a n s a l a i s e s t a + k a n s a l a i s e t + k a n s a l a i s e t h a n + k a n s a l a i s e t k a a n + k a n s a l a i s e t k i n + k a n s a l a i s f o o r u m i + k a n s a l a i s f o o r u m i a + k a n s a l a i s f o o r u m i e n + k a n s a l a i s f o o r u m i l l a + k a n s a l a i s f o o r u m i n + k a n s a l a i s f o o r u m i s s a + k a n s a l a i s h a l l i n n o n + k a n s a l a i s h a n k k e e l l e + k a n s a l a i s h a n k k e e t + k a n s a l a i s h a n k k e i d e n + k a n s a l a i s h a n k k e i s t a + k a n s a l a i s h a n k k e i t a + k a n s a l a i s i a + k a n s a l a i s i a a n + k a n s a l a i s i a k a a n + k a n s a l a i s i a k i n + k a n s a l a i s i a m m e + k a n s a l a i s i d e n t i t e e t i n + k a n s a l a i s i d e n t i t e e t t i + k a n s a l a i s i i m m e + k a n s a l a i s i i n + k a n s a l a i s i i n s a + k a n s a l a i s i l l a + k a n s a l a i s i l l a k i n + k a n s a l a i s i l l a m m e + k a n s a l a i s i l l e + k a n s a l a i s i l l e e n + k a n s a l a i s i l l e m m e + k a n s a l a i s i l l e n n e + k a n s a l a i s i l t a + k a n s a l a i s i l t a a n + k a n s a l a i s i l t a m m e + k a n s a l a i s i n a + k a n s a l a i s i s s a + k a n s a l a i s i s s a m m e + k a n s a l a i s i s t a + k a n s a l a i s i s t a a n + k a n s a l a i s i s t a k i n + k a n s a l a i s i s t a m m e + k a n s a l a i s i s t a n n e + k a n s a l a i s j o u k k o a + k a n s a l a i s j ä n n i t t e i d e n + k a n s a l a i s j ä r j e s t y k s e n + k a n s a l a i s j ä r j e s t ö + k a n s a l a i s j ä r j e s t ö a k t i v i s t e i l t a + k a n s a l a i s j ä r j e s t ö a k t i v i s t i + k a n s a l a i s j ä r j e s t ö f o o r u m i + k a n s a l a i s j ä r j e s t ö f o o r u m i n + k a n s a l a i s j ä r j e s t ö h a n k k e e n + k a n s a l a i s j ä r j e s t ö i h i n + k a n s a l a i s j ä r j e s t ö i k s i + k a n s a l a i s j ä r j e s t ö i l l e + k a n s a l a i s j ä r j e s t ö i l l ä + k a n s a l a i s j ä r j e s t ö i l t ä + k a n s a l a i s j ä r j e s t ö i s s ä + k a n s a l a i s j ä r j e s t ö i s t ä + k a n s a l a i s j ä r j e s t ö j e n + k a n s a l a i s j ä r j e s t ö j e n k i n + k a n s a l a i s j ä r j e s t ö j ä + k a n s a l a i s j ä r j e s t ö k e n t t ä + k a n s a l a i s j ä r j e s t ö k e n t ä l l ä + k a n s a l a i s j ä r j e s t ö k e n t ä s s ä + k a n s a l a i s j ä r j e s t ö k o k o u k s e n + k a n s a l a i s j ä r j e s t ö k o m i t e a + k a n s a l a i s j ä r j e s t ö k u m p p a n i e n + k a n s a l a i s j ä r j e s t ö l a k i + k a n s a l a i s j ä r j e s t ö l l e + k a n s a l a i s j ä r j e s t ö l l ä + k a n s a l a i s j ä r j e s t ö l t ä + k a n s a l a i s j ä r j e s t ö n + k a n s a l a i s j ä r j e s t ö s o p i m u s t a + k a n s a l a i s j ä r j e s t ö t + k a n s a l a i s j ä r j e s t ö t k i n + k a n s a l a i s j ä r j e s t ö t o i m i n n a n + k a n s a l a i s j ä r j e s t ö t o i m i n t a + k a n s a l a i s j ä r j e s t ö v e r k o s t o a + k a n s a l a i s j ä r j e s t ö v e r k o s t o j e n + k a n s a l a i s j ä r j e s t ö y h t e i s ö n + k a n s a l a i s j ä r j e s t ö ä + k a n s a l a i s j ä r j e s t ö ö n + k a n s a l a i s k a m a r i + k a n s a l a i s k a s v a t u s t a + k a n s a l a i s k e s k e i s e e n + k a n s a l a i s k e s k e i s e m p i + k a n s a l a i s k e s k e i s e m p ä ä + k a n s a l a i s k e s k e i s e n + k a n s a l a i s k e s k e i s t ä + k a n s a l a i s k e s k u s t e l u + k a n s a l a i s k e s k u s t e l u a + k a n s a l a i s k e s k u s t e l u i h i n + k a n s a l a i s k e s k u s t e l u j a + k a n s a l a i s k e s k u s t e l u j e n + k a n s a l a i s k e s k u s t e l u n + k a n s a l a i s k e s k u s t e l u u n + k a n s a l a i s k o m i s s i o + k a n s a l a i s k o m i s s i o n + k a n s a l a i s k o m i t e a + k a n s a l a i s k o n f l i k t i s t a + k a n s a l a i s k o n g r e s s i n + k a n s a l a i s k o u l u t u k s e n + k a n s a l a i s k r i t e e r i ä + k a n s a l a i s k u l t t u u r i + k a n s a l a i s k u l t t u u r i n + k a n s a l a i s k u l u t t a j i e n + k a n s a l a i s k u n n o n + k a n s a l a i s l e v o t t o m u u d e k s i + k a n s a l a i s l e v o t t o m u u d e t + k a n s a l a i s l e v o t t o m u u k s i a + k a n s a l a i s l e v o t t o m u u k s i e n + k a n s a l a i s l e v o t t o m u u t e e n + k a n s a l a i s l i i k e + k a n s a l a i s l i i k e h d i n t ä + k a n s a l a i s l i i k e t t ä + k a n s a l a i s l i i k k e e n + k a n s a l a i s l i i k k e e t + k a n s a l a i s l i i k k e i d e n + k a n s a l a i s l i i k k e i t ä + k a n s a l a i s l i i t o n + k a n s a l a i s l ä h e i s e m p ä ä + k a n s a l a i s l ä h e i s e n + k a n s a l a i s l ä h e i s y y d e n + k a n s a l a i s l ä h e i s y y s + k a n s a l a i s l ä h e i s y y s k ä ä n + k a n s a l a i s l ä h e i s y y t t ä + k a n s a l a i s l ä h t ö i s e n + k a n s a l a i s l ä h t ö i s i ä + k a n s a l a i s l ä h t ö i s t ä + k a n s a l a i s m e d i a + k a n s a l a i s m e d i a n + k a n s a l a i s m e d i a s t a + k a n s a l a i s m e d i o i d e n + k a n s a l a i s m i e l e n o s o i t u s t e n + k a n s a l a i s m i e l i p i d e + k a n s a l a i s m i e l i p i d e t t ä + k a n s a l a i s m i e l i p i t e e l l ä + k a n s a l a i s m i e l i p i t e e n + k a n s a l a i s m i e l i p i t e e s e e n + k a n s a l a i s m i e l i p i t e e s t ä + k a n s a l a i s m i e l i p i t e i s t ä + k a n s a l a i s m i l i i s i n + k a n s a l a i s n ä k ö k u l m a + k a n s a l a i s o h j e l m a k s i + k a n s a l a i s o h j e l m a t + k a n s a l a i s o i k e u d e k s i + k a n s a l a i s o i k e u d e n + k a n s a l a i s o i k e u d e s t a + k a n s a l a i s o i k e u d e t + k a n s a l a i s o i k e u k s i a + k a n s a l a i s o i k e u k s i a a n + k a n s a l a i s o i k e u k s i a m m e + k a n s a l a i s o i k e u k s i e m m e + k a n s a l a i s o i k e u k s i e n + k a n s a l a i s o i k e u k s i e n s a + k a n s a l a i s o i k e u k s i i n + k a n s a l a i s o i k e u k s i i n s a + k a n s a l a i s o i k e u k s i k s i + k a n s a l a i s o i k e u k s i l l a + k a n s a l a i s o i k e u k s i l l e + k a n s a l a i s o i k e u k s i n e e n + k a n s a l a i s o i k e u k s i s s a + k a n s a l a i s o i k e u k s i s t a + k a n s a l a i s o i k e u k s i s t a m m e + k a n s a l a i s o i k e u s + k a n s a l a i s o i k e u s a k t i v i s t i + k a n s a l a i s o i k e u s j ä r j e s t ö i l l e + k a n s a l a i s o i k e u s j ä r j e s t ö n + k a n s a l a i s o i k e u s k i r j a + k a n s a l a i s o i k e u s l a k i a + k a n s a l a i s o i k e u s l i i k e + k a n s a l a i s o i k e u s l i i k k e e t + k a n s a l a i s o i k e u s l i i k k e i t ä + k a n s a l a i s o i k e u s l o u k k a u s t e n + k a n s a l a i s o i k e u s p e r u s k i r j a a + k a n s a l a i s o i k e u s p o l i t i i k k a + k a n s a l a i s o i k e u s r y h m i e n + k a n s a l a i s o i k e u s t a i s t e l i j a + k a n s a l a i s o i k e u s t a i s t e l i j o i d e n + k a n s a l a i s o i k e u s t i l a n n e t t a + k a n s a l a i s o i k e u t e m m e + k a n s a l a i s o i k e u t e n a + k a n s a l a i s o i k e u t e n s a + k a n s a l a i s o i k e u t t a + k a n s a l a i s o p e t u k s e e n + k a n s a l a i s o p p o s i t i o + k a n s a l a i s o s a l l i s t u m i s e e n + k a n s a l a i s o s a l l i s t u m i s e n + k a n s a l a i s o s a l l i s t u m i s t a + k a n s a l a i s p a i n o t t e i s t a + k a n s a l a i s p a l k i n n o n + k a n s a l a i s p a l v e l u a + k a n s a l a i s p a n e e l i a + k a n s a l a i s p a n e e l i e n + k a n s a l a i s p e r i n t e i d e m m e + k a n s a l a i s p e r u s t a i s e n + k a n s a l a i s p r o t e s t i s t a + k a n s a l a i s p u o l u e e s e e n + k a n s a l a i s r i n t a m a + k a n s a l a i s r o h k e u d e s t a + k a n s a l a i s r o h k e u t t a + k a n s a l a i s r y h m i e n + k a n s a l a i s r y h m i i n + k a n s a l a i s r y h m i l l e + k a n s a l a i s r y h m i l l ä + k a n s a l a i s r y h m i s s ä + k a n s a l a i s r y h m i s t ä ä n + k a n s a l a i s r y h m i ä + k a n s a l a i s r y h m ä + k a n s a l a i s r y h m ä l l e + k a n s a l a i s r y h m ä n + k a n s a l a i s r y h m ä t + k a n s a l a i s r y h m ä ä + k a n s a l a i s s o d a k s i + k a n s a l a i s s o d a n + k a n s a l a i s s o d a s t a + k a n s a l a i s s o d a t + k a n s a l a i s s o d i s s a + k a n s a l a i s s o d i s t a + k a n s a l a i s s o p i m u k s e n + k a n s a l a i s s o t a + k a n s a l a i s s o t a a + k a n s a l a i s s o t a a n + k a n s a l a i s s o t a n s a + k a n s a l a i s s o t i a + k a n s a l a i s s o t i e n + k a n s a l a i s s o t i i n + k a n s a l a i s s u h t e i d e n + k a n s a l a i s s u u r v a l t a + k a n s a l a i s t a + k a n s a l a i s t a h d o s t a + k a n s a l a i s t a i d o i s t a + k a n s a l a i s t a m m e + k a n s a l a i s t a p a a m i s e e n + k a n s a l a i s t a s o n + k a n s a l a i s t e m m e + k a n s a l a i s t e n + k a n s a l a i s t e n k i n + k a n s a l a i s t e n n e + k a n s a l a i s t e n s a + k a n s a l a i s t i e d o t t a m i s e n + k a n s a l a i s t i e d o t u k s e e n + k a n s a l a i s t i e d o t u s t a + k a n s a l a i s t o i m i j o i d e n + k a n s a l a i s t o i m i k u n t a + k a n s a l a i s t o i m i k u n t a a + k a n s a l a i s t o i m i k u n t i e n + k a n s a l a i s t o i m i n n a l l e + k a n s a l a i s t o i m i n n a n + k a n s a l a i s t o i m i n n a s t a + k a n s a l a i s t o i m i n n a s t a a n + k a n s a l a i s t o i m i n t a + k a n s a l a i s t o i m i n t a a + k a n s a l a i s t o i m i n t a a n + k a n s a l a i s t o i m i s s a + k a n s a l a i s t o t t e l e m a t t o m u u d e n + k a n s a l a i s t o t t e l e m a t t o m u u s + k a n s a l a i s t o t t e l e m a t t o m u u t e e n + k a n s a l a i s t o t t e l e m a t t o m u u t t a + k a n s a l a i s t u n t e e n + k a n s a l a i s t u r v a a + k a n s a l a i s t u r v a l l i s u u d e n + k a n s a l a i s t y y t y v ä i s y y t t ä + k a n s a l a i s u l o t t u v u u s + k a n s a l a i s u n i o n i + k a n s a l a i s u s k o n t o + k a n s a l a i s u u d e n + k a n s a l a i s u u d e s t a + k a n s a l a i s u u d e t t o m a n + k a n s a l a i s u u d e t t o m i a + k a n s a l a i s u u d e t t o m i e n + k a n s a l a i s u u d e t t o m i l l e + k a n s a l a i s u u s a j a t u k s e n + k a n s a l a i s u u s a s i a t + k a n s a l a i s u u s e d e l l y t y s + k a n s a l a i s u u s j ä r j e s t e l y t + k a n s a l a i s u u s j ä s e n v a l t i o + k a n s a l a i s u u s j ä s e n v a l t i o l l e + k a n s a l a i s u u s k o k e i t a + k a n s a l a i s u u s k y s y m y k s e s t ä + k a n s a l a i s u u s k y s y m y k s i i n + k a n s a l a i s u u s k y s y m y k s i s s ä + k a n s a l a i s u u s k y s y m y k s i ä + k a n s a l a i s u u s k y s y m y s t e n + k a n s a l a i s u u s l a i n + k a n s a l a i s u u s l a i s t a + k a n s a l a i s u u s l a k i + k a n s a l a i s u u s l a k i e n s a + k a n s a l a i s u u s l a u s e k k e e n + k a n s a l a i s u u s o h j e l m a + k a n s a l a i s u u s o i k e u k s i a + k a n s a l a i s u u s o i k e u k s i e n + k a n s a l a i s u u s p o l i t i i k k a + k a n s a l a i s u u s s e k t o r i + k a n s a l a i s u u s s t a t u s t a + k a n s a l a i s u u t e e n + k a n s a l a i s u u t t a + k a n s a l a i s v a l i s t u s + k a n s a l a i s v a l i s t u s t a + k a n s a l a i s v a l i t u s v a l i o k u n n a s s a + k a n s a l a i s v a l i t u s v a l i o k u n t a + k a n s a l a i s v a l m e n n u s + k a n s a l a i s v a l t i o + k a n s a l a i s v a l t i o t a + k a n s a l a i s v a l t u u t e t u n + k a n s a l a i s v a l v o n t a r y h m ä n + k a n s a l a i s v a p a u d e n + k a n s a l a i s v a p a u d e t + k a n s a l a i s v a p a u k s i a + k a n s a l a i s v a p a u k s i a a n + k a n s a l a i s v a p a u k s i a m m e + k a n s a l a i s v a p a u k s i e n + k a n s a l a i s v a p a u k s i e n s a + k a n s a l a i s v a p a u k s i i m m e + k a n s a l a i s v a p a u k s i i n + k a n s a l a i s v a p a u k s i l l e + k a n s a l a i s v a p a u k s i s t a + k a n s a l a i s v a p a u s + k a n s a l a i s v a p a u s j ä r j e s t ö j e n + k a n s a l a i s v a p a u s v a l i o k u n n a l l e + k a n s a l a i s v a p a u s v a l i o k u n n a n + k a n s a l a i s v a p a u s v a l i o k u n t a + k a n s a l a i s v a p a u t e n s a + k a n s a l a i s v a s t a i s e n + k a n s a l a i s v a s t a i s t e n + k a n s a l a i s v a s t a r i n t a + k a n s a l a i s v a s t u u + k a n s a l a i s v a s t u u j ä r j e s t e l m ä + k a n s a l a i s v a s t u u n + k a n s a l a i s v a s t u u t a + k a n s a l a i s v e l v o l l i s u u d e s t a + k a n s a l a i s v e l v o l l i s u u k s i e n + k a n s a l a i s v e l v o l l i s u u k s i l t a + k a n s a l a i s v e l v o l l i s u u s + k a n s a l a i s v e l v o l l i s u u t e m m e + k a n s a l a i s v e l v o l l i s u u t e n s a + k a n s a l a i s v e l v o l l i s u u t t a + k a n s a l a i s v u o r o p u h e l u + k a n s a l a i s v u o r o p u h e l u a + k a n s a l a i s v u o r o p u h e l u n + k a n s a l a i s y h d i s t y s t e n + k a n s a l a i s y h t e i s k u n n a k s i + k a n s a l a i s y h t e i s k u n n a l l a + k a n s a l a i s y h t e i s k u n n a l l a k i n + k a n s a l a i s y h t e i s k u n n a l l e + k a n s a l a i s y h t e i s k u n n a l l e m m e + k a n s a l a i s y h t e i s k u n n a l t a + k a n s a l a i s y h t e i s k u n n a n + k a n s a l a i s y h t e i s k u n n a s s a + k a n s a l a i s y h t e i s k u n n a s s a m m e + k a n s a l a i s y h t e i s k u n n a s t a + k a n s a l a i s y h t e i s k u n n a t + k a n s a l a i s y h t e i s k u n n i l l e + k a n s a l a i s y h t e i s k u n n i s s a m m e + k a n s a l a i s y h t e i s k u n t a + k a n s a l a i s y h t e i s k u n t a a + k a n s a l a i s y h t e i s k u n t a a k i n + k a n s a l a i s y h t e i s k u n t a a m m e + k a n s a l a i s y h t e i s k u n t a a n + k a n s a l a i s y h t e i s k u n t a a n k i n + k a n s a l a i s y h t e i s k u n t a a n s a + k a n s a l a i s y h t e i s k u n t a f o o r u m i + k a n s a l a i s y h t e i s k u n t a f o o r u m i n + k a n s a l a i s y h t e i s k u n t a h a n k k e i s i i n + k a n s a l a i s y h t e i s k u n t a h a n k k e i t a + k a n s a l a i s y h t e i s k u n t a j ä r j e s t ö i l l e + k a n s a l a i s y h t e i s k u n t a k e s k u s t e l u s s a + k a n s a l a i s y h t e i s k u n t a k i n + k a n s a l a i s y h t e i s k u n t a m m e + k a n s a l a i s y h t e i s k u n t a n a + k a n s a l a i s y h t e i s k u n t a o h j e l m a + k a n s a l a i s y h t e i s k u n t a o p e r a a t i o + k a n s a l a i s y h t e i s k u n t a s u h t e i d e n + k a n s a l a i s y h t e i s k u n t i a + k a n s a l a i s y h t e i s k u n t i e n + k a n s a l a i s y h t e i s t y ö n + k a n s a l a i s y h t e i s y h t e i s k u n t a a n + k a n s a l a i s y h t e i s ö j e n + k a n s a l a i s y h t e i s ö n + k a n s a l a i s y s t ä v ä l l i n e n + k a n s a l a i s y s t ä v ä l l i s e m p i + k a n s a l a i s y s t ä v ä l l i s e n + k a n s a l a i s y s t ä v ä l l i s t e n + k a n s a l a i s y s t ä v ä l l i s t ä + k a n s a l a i s y s t ä v ä l l i s y y t e e n + k a n s a l l a + k a n s a l l e + k a n s a l l e e n + k a n s a l l i s a a r t e i t a m m e + k a n s a l l i s a a t t e i t a + k a n s a l l i s a r k i s t o + k a n s a l l i s a r m e i j a + k a n s a l l i s a r m e i j a k s i + k a n s a l l i s a r m e i j a n + k a n s a l l i s a u t o m m e + k a n s a l l i s b a l e t t i + k a n s a l l i s b a l e t t i i n + k a n s a l l i s b o l š e v i s m i + k a n s a l l i s d e m o k r a a t i t + k a n s a l l i s d e m o k r a t i a + k a n s a l l i s d e m o k r a t i o i d e n + k a n s a l l i s e e n + k a n s a l l i s e e p o s + k a n s a l l i s e k s i + k a n s a l l i s e l l a + k a n s a l l i s e l l e + k a n s a l l i s e l t a + k a n s a l l i s e l ä i n + k a n s a l l i s e m m i s s a + k a n s a l l i s e n + k a n s a l l i s e n a + k a n s a l l i s e s s a + k a n s a l l i s e s s a k i n + k a n s a l l i s e s t a + k a n s a l l i s e t + k a n s a l l i s g a l l e r i a + k a n s a l l i s h e n g e n + k a n s a l l i s h y m n i i n + k a n s a l l i s h y m n i n + k a n s a l l i s h y m n i s s ä + k a n s a l l i s h y m n i s t ä + k a n s a l l i s h y m n i t + k a n s a l l i s h y m n i ä + k a n s a l l i s i a + k a n s a l l i s i d e n t i t e e t i n + k a n s a l l i s i i n + k a n s a l l i s i k s i + k a n s a l l i s i l l a + k a n s a l l i s i l l e + k a n s a l l i s i l t a + k a n s a l l i s i l t a v i r a n o m a i s i l t a + k a n s a l l i s i n + k a n s a l l i s i n a + k a n s a l l i s i s s a + k a n s a l l i s i s t a + k a n s a l l i s j ä r j e s t ö j e n + k a n s a l l i s k a a r t i + k a n s a l l i s k a a r t i a + k a n s a l l i s k a a r t i a s i a s t a + k a n s a l l i s k a a r t i l l e + k a n s a l l i s k a a r t i m m e + k a n s a l l i s k a a r t i n + k a n s a l l i s k i e l i + k a n s a l l i s k i e l i l l ä + k a n s a l l i s k i e l t ä + k a n s a l l i s k i i h k o i l u a + k a n s a l l i s k i i h k o n + k a n s a l l i s k i r j a s t o + k a n s a l l i s k i r j a s t o i s s a + k a n s a l l i s k i r j a s t o n + k a n s a l l i s k i r j a s t o n s a + k a n s a l l i s k o k o u k s e e n + k a n s a l l i s k o k o u k s e l l e + k a n s a l l i s k o k o u k s e l t a + k a n s a l l i s k o k o u k s e n + k a n s a l l i s k o k o u k s e s s a + k a n s a l l i s k o k o u k s e s t a + k a n s a l l i s k o k o u s + k a n s a l l i s k o k o u s t a + k a n s a l l i s k o k o u s v a a l e j a + k a n s a l l i s k o k o u s v a a l i e n + k a n s a l l i s k o k o u s v a a l i t + k a n s a l l i s k o m m u n i s t i s t a + k a n s a l l i s k o n g r e s s i + k a n s a l l i s k o n g r e s s i n + k a n s a l l i s k o n s e r v a t i s m i + k a n s a l l i s k o n v e n t t i + k a n s a l l i s k u k k a + k a n s a l l i s l a u l u + k a n s a l l i s l a u l u a + k a n s a l l i s l a u l u i s t a + k a n s a l l i s l a u l u n s a + k a n s a l l i s l a u l u s s a + k a n s a l l i s l a u l u t + k a n s a l l i s l a u l u u n + k a n s a l l i s l i b e r a l i s m i + k a n s a l l i s l i i k k e e s e e n + k a n s a l l i s l i p p u + k a n s a l l i s l i p p u n s a + k a n s a l l i s l i p u i s t a + k a n s a l l i s l i p u n + k a n s a l l i s l i p u s t a + k a n s a l l i s m a i s e m a t + k a n s a l l i s m i e l i s e e n + k a n s a l l i s m i e l i s e m m ä n + k a n s a l l i s m i e l i s e s s ä + k a n s a l l i s m i e l i s e t + k a n s a l l i s m i e l i s i s t ä + k a n s a l l i s m i e l i s i ä + k a n s a l l i s m i e l i s t e n + k a n s a l l i s m i e l i s t ä + k a n s a l l i s m i e l i s y y d e n + k a n s a l l i s m i e l i s y y d e s t ä + k a n s a l l i s m i e l i s y y d e s t ä ä n + k a n s a l l i s m i e l i s y y s + k a n s a l l i s m i e l i s y y t t ä + k a n s a l l i s m i e l i s y y t t ä n i + k a n s a l l i s m u s e o + k a n s a l l i s m u s e o i d e n + k a n s a l l i s m u s e o n + k a n s a l l i s m u s e o t + k a n s a l l i s n e u v o s t o + k a n s a l l i s n e u v o s t o j a + k a n s a l l i s n e u v o s t o n + k a n s a l l i s n e u v o s t o s s a + k a n s a l l i s o i k e u d e t + k a n s a l l i s o i k e u k s i i n + k a n s a l l i s o m a i s u u d e l l e + k a n s a l l i s o m a i s u u d e n + k a n s a l l i s o m a i s u u t t a + k a n s a l l i s o o p p e r a + k a n s a l l i s o r k e s t e r i + k a n s a l l i s p a n k i n + k a n s a l l i s p a n k k i i n + k a n s a l l i s p e l i + k a n s a l l i s p e l i s t ä + k a n s a l l i s p o h j a i s e t + k a n s a l l i s p o p u l i s m i + k a n s a l l i s p o p u l i s t i + k a n s a l l i s p u i s t o + k a n s a l l i s p u i s t o a + k a n s a l l i s p u i s t o i k s i + k a n s a l l i s p u i s t o i l l e + k a n s a l l i s p u i s t o i s t a + k a n s a l l i s p u i s t o i s t a a n + k a n s a l l i s p u i s t o j a + k a n s a l l i s p u i s t o j e n + k a n s a l l i s p u i s t o j e n s a + k a n s a l l i s p u i s t o n + k a n s a l l i s p u i s t o o n + k a n s a l l i s p u i s t o s s a + k a n s a l l i s p u i s t o s t a + k a n s a l l i s p u i s t o t + k a n s a l l i s p u k u + k a n s a l l i s p u k u a + k a n s a l l i s p u k u u n + k a n s a l l i s p u o l u e + k a n s a l l i s p u o l u e e n + k a n s a l l i s p u o l u e e n s a + k a n s a l l i s p u o l u e e s s a + k a n s a l l i s p u u + k a n s a l l i s p ä i v i e n + k a n s a l l i s p ä i v i n e e n + k a n s a l l i s p ä i v i ä + k a n s a l l i s p ä i v ä + k a n s a l l i s p ä i v ä k s e m m e + k a n s a l l i s p ä i v ä n + k a n s a l l i s p ä i v ä n n e + k a n s a l l i s p ä i v ä n ä + k a n s a l l i s p ä i v ä n ä ä n + k a n s a l l i s p ä i v ä ä + k a n s a l l i s r i n t a m a + k a n s a l l i s r i n t a m a a n + k a n s a l l i s r i n t a m a s s a + k a n s a l l i s r o m a n t i i k k a + k a n s a l l i s r u n o i l i j a + k a n s a l l i s r u n o i l i j a m m e + k a n s a l l i s r u n o i l i j a n + k a n s a l l i s s a n k a r e i d e n s a + k a n s a l l i s s a n k a r i + k a n s a l l i s s o s i a l i s m i + k a n s a l l i s s o s i a l i s m i a + k a n s a l l i s s o s i a l i s m i i n + k a n s a l l i s s o s i a l i s m i l l a + k a n s a l l i s s o s i a l i s m i l t a + k a n s a l l i s s o s i a l i s m i n + k a n s a l l i s s o s i a l i s m i s s a + k a n s a l l i s s o s i a l i s m i s t a + k a n s a l l i s s o s i a l i s t e j a + k a n s a l l i s s o s i a l i s t i e n + k a n s a l l i s s o s i a l i s t i n e n + k a n s a l l i s s o s i a l i s t i s e n + k a n s a l l i s s o s i a l i s t i s e s s a + k a n s a l l i s s o s i a l i s t i s e s t a + k a n s a l l i s s o s i a l i s t i s t e n + k a n s a l l i s s o s i a l i s t i t + k a n s a l l i s s o t a + k a n s a l l i s s t a d i o n + k a n s a l l i s s u u n n i t e l m a t + k a n s a l l i s s y m b o l i + k a n s a l l i s s y n d i k a l i s m i + k a n s a l l i s t a a + k a n s a l l i s t a l o u k s i a + k a n s a l l i s t a m i s t a + k a n s a l l i s t a m i s t o i m e n p i t e e t + k a n s a l l i s t a m i s t o i m i s t a + k a n s a l l i s t a m i s y r i t y k s e e n + k a n s a l l i s t e a t t e r i + k a n s a l l i s t e n + k a n s a l l i s t e n k i n + k a n s a l l i s t u n n e + k a n s a l l i s t u n n e t t a + k a n s a l l i s t u n n o s t a + k a n s a l l i s t u n n u s + k a n s a l l i s t u n t e e n + k a n s a l l i s t u n t e e s e e n + k a n s a l l i s t u n t e i t a + k a n s a l l i s t u o t t e e n + k a n s a l l i s t y ö h u o n e e t + k a n s a l l i s u u d e n + k a n s a l l i s u u d e s t a a n + k a n s a l l i s u u d e s t a m m e + k a n s a l l i s u u k s i a + k a n s a l l i s u u k s i e n + k a n s a l l i s u u k s i s t a + k a n s a l l i s u u s a a t t e e t + k a n s a l l i s u u s e r o j e n + k a n s a l l i s u u s k o o d i s t a + k a n s a l l i s u u s k y s y m y s + k a n s a l l i s u u s o i k e u d e t + k a n s a l l i s u u s o i k e u k s i a + k a n s a l l i s u u s o n g e l m a s t a + k a n s a l l i s u u s o n g e l m a t + k a n s a l l i s u u s o n g e l m i i n + k a n s a l l i s u u s p e r i a a t t e i s t a a n + k a n s a l l i s u u s p e r u s t e i s e t + k a n s a l l i s u u s p o l i t i i k a n + k a n s a l l i s u u s p o l i t i i k a s t a + k a n s a l l i s u u s r a j o i s t a + k a n s a l l i s u u s r a j o i t u k s e t + k a n s a l l i s u u s r a j o j e n + k a n s a l l i s u u s s ä ä n n ö t + k a n s a l l i s u u s t u n n u k s e k s i + k a n s a l l i s u u s t u n n u s + k a n s a l l i s u u s t u n n u s t a + k a n s a l l i s u u s t u n n u s t e n + k a n s a l l i s u u t e e n + k a n s a l l i s u u t e n s a + k a n s a l l i s u u t t a + k a n s a l l i s v a a l e j a + k a n s a l l i s v a l t i o + k a n s a l l i s v a l t i o i d e m m e + k a n s a l l i s v a l t i o i d e n + k a n s a l l i s v a l t i o i h i n + k a n s a l l i s v a l t i o i l l a + k a n s a l l i s v a l t i o i l l e + k a n s a l l i s v a l t i o i l t a + k a n s a l l i s v a l t i o i n a + k a n s a l l i s v a l t i o i s s a + k a n s a l l i s v a l t i o i s s a a n + k a n s a l l i s v a l t i o i s s a k i n + k a n s a l l i s v a l t i o i s s a m m e + k a n s a l l i s v a l t i o i s t a + k a n s a l l i s v a l t i o i s t a a n + k a n s a l l i s v a l t i o i t a + k a n s a l l i s v a l t i o i t a a n + k a n s a l l i s v a l t i o i t a m m e + k a n s a l l i s v a l t i o i t t e m m e + k a n s a l l i s v a l t i o j ä r j e s t e l m ä + k a n s a l l i s v a l t i o k s i + k a n s a l l i s v a l t i o k ä s i t t e e s e e n + k a n s a l l i s v a l t i o l l a + k a n s a l l i s v a l t i o l l e + k a n s a l l i s v a l t i o l t a + k a n s a l l i s v a l t i o n + k a n s a l l i s v a l t i o n a + k a n s a l l i s v a l t i o o n + k a n s a l l i s v a l t i o s s a + k a n s a l l i s v a l t i o s s a a n + k a n s a l l i s v a l t i o s t a + k a n s a l l i s v a l t i o t + k a n s a l l i s v a l t i o t a + k a n s a l l i s v a l t i o t h a n + k a n s a l l i s v a r a l l i s u u d e s t a m m e + k a n s a l l i s v a r a l l i s u u s + k a n s a l l i s v i r a n o m a i s t e n + k a n s a l l i s v ä e s t ö n + k a n s a l l i s v ä r e i h i n i + k a n s a l l i s y h t e i s ö m m e + k a n s a l t a + k a n s a m m e + k a n s a m u r h i a + k a n s a n + k a n s a n a r k k i t e h t u u r i p e r i n t ö ö n + k a n s a n a r m e i j a + k a n s a n a r m e i j a a + k a n s a n d e m o k r a a t t i n e n + k a n s a n d e m o k r a t i a + k a n s a n d e m o k r a t i o i d e n + k a n s a n d e m o k r a t i o i h i n + k a n s a n d e m o k r a t i o i l l a + k a n s a n d e m o k r a t i o i s s a + k a n s a n e d u s t a j a + k a n s a n e d u s t a j a n + k a n s a n e d u s t a j a n a + k a n s a n e d u s t a j a t + k a n s a n e d u s t a j i a + k a n s a n e d u s t a j i e n + k a n s a n e d u s t a j i e n s a + k a n s a n e d u s t a j i i n + k a n s a n e d u s t a j i l l e + k a n s a n e d u s t a j i n a + k a n s a n e d u s t a j i s t a + k a n s a n e d u s t u s e l i n t ä + k a n s a n e d u s t u s l a i t o k s e e n + k a n s a n e d u s t u s l a i t o k s e n + k a n s a n e d u s t u s l a i t o k s e t + k a n s a n e d u s t u s l a i t o k s i l l e e n + k a n s a n e d u s t u s l a i t o k s i s s a + k a n s a n e d u s t u s l a i t o s + k a n s a n e d u s t u s l a i t o s t a m m e + k a n s a n e d u s t u s l a i t o s t e n + k a n s a n e d u s t u s t a + k a n s a n e l ä k e l a i t o s t e n + k a n s a n e n e m m i s t ö j ä + k a n s a n e t y m o l o g i a + k a n s a n h u v i a + k a n s a n i + k a n s a n j u h l a + k a n s a n k a m p a n j a + k a n s a n k a p i t a l i s m i a + k a n s a n k e i t t i ö + k a n s a n k i e l i l l e + k a n s a n k i e l t e n + k a n s a n k i i h o t t a j i a + k a n s a n k i i h o t t a j i l t a + k a n s a n k i i h o t t a j i n a + k a n s a n k i i h o t u k s e e n + k a n s a n k i i h o t u k s e k s i + k a n s a n k i i h o t u k s e n + k a n s a n k i i h o t u s + k a n s a n k i i h o t u s t a + k a n s a n k i r j a s t o j a + k a n s a n k o d i n + k a n s a n k o k o u k s e l l e + k a n s a n k o k o u k s e n + k a n s a n k o k o u k s i s t a + k a n s a n k o k o u s + k a n s a n k o m i s s a a r i e n + k a n s a n k o n g r e s s i + k a n s a n k o n g r e s s i i n + k a n s a n k o n g r e s s i n + k a n s a n k u l t t u u r i n + k a n s a n k u n t i e n + k a n s a n l a i n s ä ä d ä n t ö + k a n s a n l a u l u j a + k a n s a n l i i k e + k a n s a n l i i k e t t ä + k a n s a n l i i k k e e l l e + k a n s a n l i i k k e e n + k a n s a n l i i k k e e t + k a n s a n l i i k k e i d e n + k a n s a n l i i k k e i l t ä + k a n s a n l i i k k e i n ä + k a n s a n l i i k k e i t ä + k a n s a n l i i k u n n a n + k a n s a n l i i k u n t a + k a n s a n l i i t o n + k a n s a n l u o n t e i d e n + k a n s a n l ä h e i s e m p i + k a n s a n m u r h a + k a n s a n m u r h a a + k a n s a n m u r h a a n + k a n s a n m u r h a k s i + k a n s a n m u r h a l t a + k a n s a n m u r h a n + k a n s a n m u r h a p o l i t i i k a n + k a n s a n m u r h a p o l i t i i k k a a + k a n s a n m u r h a r i k o k s e t + k a n s a n m u r h a r i k o k s i k s i + k a n s a n m u r h a r i k o k s i l l e + k a n s a n m u r h a r i k o s t e n + k a n s a n m u r h a s o p i m u k s e n + k a n s a n m u r h a s t a + k a n s a n m u r h a s t r a t e g i a a n + k a n s a n m u r h a s t r a t e g i a l l e + k a n s a n m u r h a s u u n n i t e l m a n s a + k a n s a n m u r h a s u u n n i t e l m a s t a + k a n s a n m u r h a t o i m i a + k a n s a n m u r h i e n + k a n s a n m u r h i l t a + k a n s a n m u r h i s t a + k a n s a n m u s i i k i n + k a n s a n m u s i i k i s t a + k a n s a n n e u v o s t o l l a + k a n s a n n o u s u + k a n s a n n o u s u a + k a n s a n n o u s u i h i n + k a n s a n n o u s u i s s a + k a n s a n n o u s u i s t a + k a n s a n n o u s u j a + k a n s a n n o u s u j e n + k a n s a n n o u s u k s i + k a n s a n n o u s u n + k a n s a n n o u s u s t a + k a n s a n n o u s u t + k a n s a n n o u s u u n + k a n s a n o p i s t o + k a n s a n o s a l l e + k a n s a n o s i a + k a n s a n o s i e n + k a n s a n p a n k i t + k a n s a n p a r a n n u s + k a n s a n p u o l e e n + k a n s a n p u o l u e + k a n s a n p u o l u e e l l a + k a n s a n p u o l u e e l l e + k a n s a n p u o l u e e l t a + k a n s a n p u o l u e e m m e + k a n s a n p u o l u e e n + k a n s a n p u o l u e e n a + k a n s a n p u o l u e e s e e n + k a n s a n p u o l u e e s s a + k a n s a n p u o l u e e s t a + k a n s a n p u o l u e i l l e + k a n s a n p u o l u e t t a + k a n s a n r i n t a m a + k a n s a n r i n t a m a a + k a n s a n r i n t a m a n + k a n s a n r i n t a m a p u o l u e e n + k a n s a n r y h m i e n + k a n s a n r y h m i i n + k a n s a n r y h m i l t ä + k a n s a n r y h m i s s ä + k a n s a n r y h m i ä + k a n s a n s a + k a n s a n s a n o n t a a + k a n s a n s i v i s t y k s e s t ä + k a n s a n s i v i s t y s t y ö n + k a n s a n s u o s i o n + k a n s a n s u o s i o t a + k a n s a n s u v e r e n i t e e t t i + k a n s a n t a i d e + k a n s a n t a i s t e l i j o i t a + k a n s a n t a i t e i l i j a + k a n s a n t a l o u d e l l e + k a n s a n t a l o u d e l l i n e n + k a n s a n t a l o u d e l l i s e n + k a n s a n t a l o u d e l l i s e s t i + k a n s a n t a l o u d e l l i s e s t i k i n + k a n s a n t a l o u d e l l i s e t + k a n s a n t a l o u d e l l i s i a + k a n s a n t a l o u d e l l i s i s t a + k a n s a n t a l o u d e n + k a n s a n t a l o u d e s s a + k a n s a n t a l o u d e s t a + k a n s a n t a l o u d e t + k a n s a n t a l o u k s i a + k a n s a n t a l o u k s i a a n + k a n s a n t a l o u k s i e m m e + k a n s a n t a l o u k s i e n + k a n s a n t a l o u k s i i n + k a n s a n t a l o u k s i l l e + k a n s a n t a l o u s + k a n s a n t a l o u s m i n i s t e r i + k a n s a n t a l o u s t i e t e i l i j ä + k a n s a n t a l o u t e e n + k a n s a n t a l o u t e e n k i n + k a n s a n t a l o u t e m m e + k a n s a n t a l o u t e n s a + k a n s a n t a l o u t t a + k a n s a n t a n s s i + k a n s a n t a n s s i a + k a n s a n t a r i n a + k a n s a n t a r i n o i s t a + k a n s a n t a s a v a l l a l l e + k a n s a n t a s a v a l l a n + k a n s a n t a s a v a l l a s s a + k a n s a n t a s a v a l l a s t a + k a n s a n t a s a v a l t a + k a n s a n t a s a v a l t a a + k a n s a n t a s a v a l t a a n + k a n s a n t a u t e j a + k a n s a n t a u t i + k a n s a n t e r v e y d e l l e + k a n s a n t e r v e y d e l l e k i n + k a n s a n t e r v e y d e l l i n e n + k a n s a n t e r v e y d e l l i s e e n + k a n s a n t e r v e y d e l l i s e k s i + k a n s a n t e r v e y d e l l i s e n + k a n s a n t e r v e y d e l l i s e n ä + k a n s a n t e r v e y d e l l i s e s s ä + k a n s a n t e r v e y d e l l i s e s t ä + k a n s a n t e r v e y d e l l i s e t + k a n s a n t e r v e y d e l l i s i i n + k a n s a n t e r v e y d e l l i s i l l ä + k a n s a n t e r v e y d e l l i s i n + k a n s a n t e r v e y d e l l i s i s t ä + k a n s a n t e r v e y d e l l i s i s t ä k i n + k a n s a n t e r v e y d e l l i s i ä + k a n s a n t e r v e y d e l l i s t e n + k a n s a n t e r v e y d e l l i s t ä + k a n s a n t e r v e y d e l l ä + k a n s a n t e r v e y d e l t ä + k a n s a n t e r v e y d e n + k a n s a n t e r v e y d e n k i n + k a n s a n t e r v e y d e n k ä ä n + k a n s a n t e r v e y d e s s ä + k a n s a n t e r v e y d e s t ä + k a n s a n t e r v e y s + k a n s a n t e r v e y s a i h e i t a + k a n s a n t e r v e y s a l a a + k a n s a n t e r v e y s a l a a n + k a n s a n t e r v e y s a l a l l a + k a n s a n t e r v e y s a l a n + k a n s a n t e r v e y s a s i a + k a n s a n t e r v e y s a s i o i d e n + k a n s a n t e r v e y s a s i o i h i n + k a n s a n t e r v e y s a s i o i l l a + k a n s a n t e r v e y s a s i o i s s a + k a n s a n t e r v e y s a s i o i s t a + k a n s a n t e r v e y s a s i o i t a + k a n s a n t e r v e y s f o o r u m i n + k a n s a n t e r v e y s h a i t t o j e n + k a n s a n t e r v e y s j ä r j e s t e l m ä l l e + k a n s a n t e r v e y s j ä r j e s t e l m ä n + k a n s a n t e r v e y s j ä r j e s t e l m ä s s ä + k a n s a n t e r v e y s j ä r j e s t e l m ä t + k a n s a n t e r v e y s k a m p a n j o i d e n + k a n s a n t e r v e y s k a m p a n j o i h i n + k a n s a n t e r v e y s k r i i s i e n + k a n s a n t e r v e y s k r i i s i n + k a n s a n t e r v e y s k r i i s i t + k a n s a n t e r v e y s k r i t e e r e i h i n + k a n s a n t e r v e y s k y s y m y k s e n ä + k a n s a n t e r v e y s k y s y m y k s e t + k a n s a n t e r v e y s k y s y m y k s i l l e + k a n s a n t e r v e y s k y s y m y k s i s s ä + k a n s a n t e r v e y s k y s y m y s + k a n s a n t e r v e y s k y s y m y s t e n + k a n s a n t e r v e y s k ä y t ä n t ö j e n + k a n s a n t e r v e y s l a i n s ä ä d ä n t ö + k a n s a n t e r v e y s l a i t o k s e n + k a n s a n t e r v e y s l a i t o s + k a n s a n t e r v e y s l a i t o s t e n + k a n s a n t e r v e y s l ä h t ö k o h t i e n + k a n s a n t e r v e y s m e n o i s t a + k a n s a n t e r v e y s m e n o j a + k a n s a n t e r v e y s n o r m i e n + k a n s a n t e r v e y s n ä k ö k o h d a t + k a n s a n t e r v e y s n ä k ö k o h t i a + k a n s a n t e r v e y s n ä k ö k o h t i e n + k a n s a n t e r v e y s o h j e l m a + k a n s a n t e r v e y s o h j e l m a a + k a n s a n t e r v e y s o h j e l m a a n + k a n s a n t e r v e y s o h j e l m a m m e + k a n s a n t e r v e y s o h j e l m a n + k a n s a n t e r v e y s o h j e l m a s s a + k a n s a n t e r v e y s o h j e l m a s t a + k a n s a n t e r v e y s o h j e l m a t + k a n s a n t e r v e y s o h j e l m i a + k a n s a n t e r v e y s o h j e l m i e m m e + k a n s a n t e r v e y s o h j e l m i e n + k a n s a n t e r v e y s o h j e l m i i n + k a n s a n t e r v e y s o h j e l m i l l a + k a n s a n t e r v e y s o n g e l m a + k a n s a n t e r v e y s o n g e l m a a + k a n s a n t e r v e y s o n g e l m a m m e + k a n s a n t e r v e y s o n g e l m a n + k a n s a n t e r v e y s o n g e l m a n a + k a n s a n t e r v e y s o n g e l m a s t a + k a n s a n t e r v e y s o n g e l m i a + k a n s a n t e r v e y s o n g e l m i e n + k a n s a n t e r v e y s o n g e l m i i n + k a n s a n t e r v e y s o n g e l m i s s a + k a n s a n t e r v e y s o n g e l m i s t a + k a n s a n t e r v e y s p a l v e l u j a + k a n s a n t e r v e y s p a l v e l u j e n + k a n s a n t e r v e y s p a l v e l u t + k a n s a n t e r v e y s p o l i i t t i n e n + k a n s a n t e r v e y s p o l i t i i k a l l a + k a n s a n t e r v e y s p o l i t i i k a l l e + k a n s a n t e r v e y s p o l i t i i k a n + k a n s a n t e r v e y s p o l i t i i k a s s a + k a n s a n t e r v e y s p o l i t i i k a s t a + k a n s a n t e r v e y s p o l i t i i k k a + k a n s a n t e r v e y s p o l i t i i k k a a + k a n s a n t e r v e y s p o l i t i i k k a a n + k a n s a n t e r v e y s p o l i t i i k k a m m e + k a n s a n t e r v e y s p o l i t i i k k o j e n + k a n s a n t e r v e y s p u o l e e n + k a n s a n t e r v e y s r i s k i + k a n s a n t e r v e y s r i s k i n + k a n s a n t e r v e y s s t a n d a r d i e n + k a n s a n t e r v e y s s t r a t e g i a a + k a n s a n t e r v e y s s t r a t e g i a s s a m m e + k a n s a n t e r v e y s s t r a t e g i o i t a + k a n s a n t e r v e y s s y i s t ä + k a n s a n t e r v e y s t a v o i t t e i d e n + k a n s a n t e r v e y s t i l a n n e t t a + k a n s a n t e r v e y s t o i m e n p i d e + k a n s a n t e r v e y s t o i m i n t a a + k a n s a n t e r v e y s t o i m i s s a + k a n s a n t e r v e y s t y ö h ö n + k a n s a n t e r v e y s t y ö s t ä + k a n s a n t e r v e y s u h k a + k a n s a n t e r v e y s u h k i a + k a n s a n t e r v e y s u h k i e n + k a n s a n t e r v e y s u h k i i n + k a n s a n t e r v e y s v a a r a + k a n s a n t e r v e y s v a a t i m u k s i a + k a n s a n t e r v e y s v a i k u t u s t e n + k a n s a n t e r v e y s v i r a n o m a i s e n + k a n s a n t e r v e y s v i r a n o m a i s i a + k a n s a n t e r v e y s v i r a n o m a i s t e n + k a n s a n t e r v e y t e e n + k a n s a n t e r v e y t t ä + k a n s a n t u h o + k a n s a n t u l o + k a n s a n t u l o l l e + k a n s a n t u l o n + k a n s a n t u l o n a + k a n s a n t u l o o n + k a n s a n t u l o s t a + k a n s a n t u l o s t a a n + k a n s a n t u o m i o i s t u i m e n + k a n s a n t u o m i o i s t u i m e n a + k a n s a n t u o m i o i s t u i m e s s a + k a n s a n t u o m i o i s t u i m i a + k a n s a n t u o m i o i s t u i n + k a n s a n t u o t e + k a n s a n t u o t t e e n + k a n s a n t u o t t e e s t a + k a n s a n t u o t t e e s t a a n + k a n s a n u r h e i l u a + k a n s a n u s k o + k a n s a n v a a l e j a + k a n s a n v a a l i + k a n s a n v a l i s t u k s e n + k a n s a n v a l l a l l e + k a n s a n v a l l a n + k a n s a n v a l l a n k u m o u s t a + k a n s a n v a l l a s t a + k a n s a n v a l t a + k a n s a n v a l t a a + k a n s a n v a l t a i s i s s a + k a n s a n v a l t a i s t a m i s k e h i t y s + k a n s a n v a l t a i s t a m i s k y s y m y k s i ä + k a n s a n v a l t a i s t a m i s p o l i t i i k a n + k a n s a n v a l t a i s t a m i s t a + k a n s a n v a l t a i s u u s + k a n s a n v a l t a p r o j e k t i e n + k a n s a n v a l t i o i d e n + k a n s a n v a s t a i n e n + k a n s a n v a s t a i s e e n + k a n s a n v a s t a i s e n + k a n s a n v a s t a i s e n a + k a n s a n v a s t a i s i a + k a n s a n v a s t a i s i l l a + k a n s a n v a s t a i s i l l e + k a n s a n v a s t a i s t a + k a n s a n v a s t a i s t e n + k a n s a n v i h o l l i n e n + k a n s a n v i i s a u s + k a n s a n v ä l i s e t + k a n s a n ä ä n e s t y k s e e n + k a n s a n ä ä n e s t y k s e l l ä + k a n s a n ä ä n e s t y k s e n + k a n s a n ä ä n e s t y k s e n ä + k a n s a n ä ä n e s t y k s e s s ä + k a n s a n ä ä n e s t y k s e s t ä + k a n s a n ä ä n e s t y k s e t + k a n s a n ä ä n e s t y k s i i n + k a n s a n ä ä n e s t y k s i l l e + k a n s a n ä ä n e s t y k s i l l ä + k a n s a n ä ä n e s t y k s i s s ä + k a n s a n ä ä n e s t y k s i s t ä + k a n s a n ä ä n e s t y k s i ä + k a n s a n ä ä n e s t y s + k a n s a n ä ä n e s t y s f a r s s i a + k a n s a n ä ä n e s t y s h a n k e + k a n s a n ä ä n e s t y s k a m p a n j a a + k a n s a n ä ä n e s t y s k a m p a n j a a n + k a n s a n ä ä n e s t y s k a m p a n j a n + k a n s a n ä ä n e s t y s k a m p a n j a s s a + k a n s a n ä ä n e s t y s k a m p a n j a t + k a n s a n ä ä n e s t y s k a m p a n j o i d e n + k a n s a n ä ä n e s t y s k a m p a n j o i h i n + k a n s a n ä ä n e s t y s k a m p a n j o i n t i a + k a n s a n ä ä n e s t y s k a m p a n j o i s s a + k a n s a n ä ä n e s t y s k a m p a n j o i s t a + k a n s a n ä ä n e s t y s k o m i t e a + k a n s a n ä ä n e s t y s k r i i s i n + k a n s a n ä ä n e s t y s l i i k k e e l l e + k a n s a n ä ä n e s t y s m e n e t t e l y + k a n s a n ä ä n e s t y s p e l o l l e + k a n s a n ä ä n e s t y s p r o s e s s i a + k a n s a n ä ä n e s t y s p r o s e s s i i n + k a n s a n ä ä n e s t y s p r o s e s s i n + k a n s a n ä ä n e s t y s p u o l u e + k a n s a n ä ä n e s t y s p u o l u e t t a + k a n s a n ä ä n e s t y s p ä i v ä + k a n s a n ä ä n e s t y s r y h m ä + k a n s a n ä ä n e s t y s t e n + k a n s a n ä ä n e s t y s t u l o k s e s t a + k a n s a n ä ä n e s t y s t u l o k s e t + k a n s a n ä ä n e s t y s t u l o k s i a + k a n s a n ä ä n e s t y s t u l o k s i i n + k a n s a n ä ä n e s t y s t u l o s + k a n s a n ä ä n e s t y s t ä + k a n s a n ä ä n e s t y s v a a t i m u k s e n + k a n s a n ä ä n e s t y s v a i h e e s s a + k a n s a n ä ä n e s t y s v i i k o s t a + k a n s a n ä ä n e s t y s v ä l i n e + k a n s a p u o l u e + k a n s a p u o l u e e n + k a n s a p u o l u e e n a + k a n s a s t a + k a n s a t + k a n s a t e r v e y d e l l e + k a n s a t e r v e y d e n + k a n s a t e r v e y s o n g e l m a a + k a n s a t e r v e y s p o l i t i i k k a a n + k a n s a t e r v e y t e e n + k a n s a t e r v e y t t ä + k a n s a t h a n + k a n s a t i e d e k o n g r e s s i l l e + k a n s a t k a a n + k a n s i l e h t i + k a n s i p a p e r i + k a n s i p ä ä l l y s t ö + k a n s i s i v u l l a + k a n s i t u o l i i n s a + k a n s l e r i n + k a n s l i a m i n i s t e r i + k a n s l i a n + k a n s l i a p ä ä l l i k k ö + k a n s o i h i n + k a n s o i l l a + k a n s o i l l e + k a n s o i l l e e n + k a n s o i l t a + k a n s o i s t a + k a n s o i t t a v a t + k a n s o j a + k a n s o j e m m e + k a n s o j e n + k a n s o j e n s a + k a n s o j e n v ä l i s e s t ä + k a n s s a a n + k a n s s a i h m i s e m m e + k a n s s a i h m i s e t + k a n s s a i h m i s i l l e + k a n s s a i h m i s t e m m e + k a n s s a i h m i s t e n + k a n s s a m a t k u s t a j i k s e e n + k a n s s a m m e + k a n s s a n n e + k a n t a a + k a n t a a k s e e n + k a n t a a m m e + k a n t a a n i + k a n t a a n n e + k a n t a a n s a + k a n t a e s s a a n + k a n t a j a n + k a n t a j a p r o t e i i n i + k a n t a j a t + k a n t a j i e n + k a n t a k i e l i + k a n t a k i r j a + k a n t a k i r j a a + k a n t a k i r j a a n + k a n t a k i r j a n + k a n t a l a h t i + k a n t a l u k u j ä r j e s t e l m ä + k a n t a l u k u l a j i t t e l u + k a n t a l u o n n o s + k a n t a m a a + k a n t a m a a n + k a n t a m a s s a + k a n t a m a s t a m m e + k a n t a m i s e n + k a n t a m i s m e n e t e l m i s t ä + k a n t a m i s m e n e t e l m i ä + k a n t a m i s t a + k a n t a m m e + k a n t a n i + k a n t a n n e + k a n t a n s a + k a n t a p i s t e a v a r u u s + k a n t a s o l u + k a n t a s o l u h o i d o n + k a n t a s o l u h o i t o + k a n t a s o l u i h i n + k a n t a s o l u i l l a + k a n t a s o l u i l l a a n + k a n t a s o l u i l l e + k a n t a s o l u i s t a + k a n t a s o l u j a + k a n t a s o l u j a m m e + k a n t a s o l u j e n + k a n t a s o l u k a n n a n + k a n t a s o l u k a n n a t + k a n t a s o l u k y s y m y k s e s t ä + k a n t a s o l u l a i n s ä ä d ä n t ö ä + k a n t a s o l u l i n j a t + k a n t a s o l u l i n j o i h i n + k a n t a s o l u l i n j o j a + k a n t a s o l u l i n j o j e n + k a n t a s o l u m u o d o n + k a n t a s o l u p o t e n t i a a l i + k a n t a s o l u p r o j e k t i t + k a n t a s o l u t + k a n t a s o l u t u t k i m u k s e e n + k a n t a s o l u t u t k i m u k s e l l a + k a n t a s o l u t u t k i m u k s e l l e + k a n t a s o l u t u t k i m u k s e n + k a n t a s o l u t u t k i m u k s e s s a + k a n t a s o l u t u t k i m u k s e s t a + k a n t a s o l u t u t k i m u k s e t + k a n t a s o l u t u t k i m u s + k a n t a s o l u t u t k i m u s t a + k a n t a s o l u v a i h e e s s a + k a n t a s u o m i + k a n t a t i e + k a n t a v a a + k a n t a v a t + k a n t a v e r k o n h a l t i j o i d e n + k a n t a v ä e s t ö n + k a n t e e m m e + k a n t e e n + k a n t e e s e e n + k a n t e e s t a + k a n t e i d e n + k a n t e i l l e + k a n t e i s i i n + k a n t e i s t a + k a n t e i t a + k a n t e l i j a n + k a n t e l i j a t + k a n t e l i j o i s t a + k a n t e l u a + k a n t e l u i d e n + k a n t e l u i h i n + k a n t e l u i s t a + k a n t e l u i t a + k a n t e l u j a + k a n t e l u j e n + k a n t e l u l o m a k e + k a n t e l u l o m a k k e e n + k a n t e l u m e n e t t e l y n + k a n t e l u m e n e t t e l y y n + k a n t e l u m ä ä r ä n + k a n t e l u n + k a n t e l u s t a + k a n t e l u t + k a n t o a a l t o + k a n t o i h i n + k a n t o j a + k a n t o j a a n + k a n t o j a m m e + k a n t o j a n i + k a n t o j e m m e + k a n t o j e n + k a n t o j e n s a + k a n t o j y r s i n + k a n t o j ä r j e s t e l m i e n + k a n t o j ä r j e s t e l m i s t ä + k a n t o k y k y + k a n t o k y v y n + k a n t o k ä ä p ä + k a n t o l i i n a + k a n t o m e n e t t e l y ä + k a n t o n a p a n a h i k a s + k a n t o r a k e t e i l l a + k a n t o r a k e t i n + k a n t o r a k e t t i + k a n t o r a k e t t i j ä r j e s t e l m ä + k a n t o r a k e t t i j ä r j e s t e l m ä n + k a n t o t a t t i + k a n t t i a a l t o + k a n u r i t + k a n u u n a n k u u l a p u u + k a n u u n a n k u u l a r a l l i + k a o o t t i s e m p i a + k a o o t t i s t a + k a o o t t i s t e n + k a p a s i t e e t i n + k a p a s i t e e t i s s a a n + k a p a s i t e e t i s t a + k a p a s i t e e t t i a + k a p a s i t e e t t i r a j o i t u k s e t + k a p a s i t e e t t i r a j o i t u k s i a + k a p a s i t e e t t i t a r p e e t + k a p a s i t e e t t i t a v o i t t e e t + k a p a s i t e e t t i t a v o i t t e i t a + k a p a s i t e e t t i v ä h e n n y s t e n + k a p e a a + k a p e a k a t s e i n e n + k a p e a k a t s e i s e e n + k a p e a k a t s e i s e l l e + k a p e a k a t s e i s e n + k a p e a k a t s e i s i s t a + k a p e a k a t s e i s t a + k a p e a k a t s e i s u u d e n + k a p e a k a t s e i s u u s + k a p e a k a t s e i s u u t e e n + k a p e a m p i + k a p e a o s m a n k ä ä m i + k a p e a r a i t e i n e n + k a p e a r u n k o i s t e n + k a p e a r u n k o k o n e + k a p e i k o i s s a + k a p e l l i m e s t a r i a + k a p e t i n g i t + k a p i l l a a r i e l e k t r o f o r e e s i + k a p i n a a + k a p i n a a n + k a p i n a j o h t a j a + k a p i n a j o u k k o j e n + k a p i n a l i i k k e i d e n + k a p i n a l i i k k e i t ä + k a p i n a l i i t t o + k a p i n a l l i s a r m e i j a a + k a p i n a l l i s a r m e i j a n + k a p i n a l l i s a r m e i j a t + k a p i n a l l i s e t + k a p i n a l l i s h y ö k k ä y s t e n + k a p i n a l l i s i l t a + k a p i n a l l i s j o h t a j a + k a p i n a l l i s j o h t a j a n + k a p i n a l l i s j o u k k o i h i n + k a p i n a l l i s j o u k k o j e n + k a p i n a l l i s j o u k o s t a + k a p i n a l l i s j o u k o t + k a p i n a l l i s j ä r j e s t ö + k a p i n a l l i s l e i r e i k s i + k a p i n a l l i s l i i k e + k a p i n a l l i s l i i k k e e k s i + k a p i n a l l i s l i i k k e e n + k a p i n a l l i s l i i k k e e t + k a p i n a l l i s l i i k k e i s t ä + k a p i n a l l i s l i i k k e i t ä + k a p i n a l l i s r y h m i e n + k a p i n a l l i s r y h m i i n + k a p i n a l l i s r y h m i l t ä + k a p i n a l l i s r y h m i s t ä + k a p i n a l l i s r y h m i t t y m ä + k a p i n a l l i s r y h m i ä + k a p i n a l l i s r y h m ä + k a p i n a l l i s r y h m ä n + k a p i n a l l i s r y h m ä t + k a p i n a l l i s r y h m ä ä + k a p i n a l l i s r y h m ä ä n + k a p i n a l l i s s o t i l a i d e n + k a p i n a l l i s t e n + k a p i n a t i l a n t e i s s a + k a p i n b u l b u l i + k a p i n h i i r i h a u k k a + k a p i n k e r t t u + k a p i n k i u r u + k a p i n k o r p p i k o t k a + k a p i n k o t t a r a i n e n + k a p i n k u t o j a + k a p i n l e i j o n a + k a p i n m e r i m e t s o + k a p i n m e s i k k o + k a p i n m e t s ä k e r t t u n e n + k a p i n m u u r a h a i s k ä p y + k a p i n o i n t i a + k a p i n o i s t a + k a p i n p e n s a s l e p i n k ä i n e n + k a p i n r a s t a s + k a p i n s o r s a + k a p i n s u u l a + k a p i n t i a i s k e r t t u + k a p i n t ä p l ä t i k k a + k a p i t a l i s m i a + k a p i t a l i s m i h y ö k k ä y k s e l l ä + k a p i t a l i s m i i n + k a p i t a l i s m i l l a + k a p i t a l i s m i n + k a p i t a l i s m i s s a + k a p i t a l i s m i s t a + k a p i t a l i s o i n t i i n + k a p i t a l i s t e i l l a + k a p i t a l i s t i m a f i a n + k a p i t a l i s t i p o l i t i i k k o i h i n + k a p i t a l i s t i r y h m i e n + k a p i t a l i s t i r y h m i l l e + k a p i t a l i s t i r y h m i ä + k a p i t a l i s t i s e n + k a p i t a l i s t i s e s s a + k a p i t a l i s t i s e s t a + k a p i t a l i s t i s e t + k a p i t a l i s t i s i a + k a p i t a l i s t i s i l l a + k a p i t a l i s t i s i s t a + k a p i t a l i s t i s t a + k a p i t a l i s t i s t e n + k a p i t a l i s t i v a l t i o i s s a + k a p i t a l i s t i v a l t o j e n + k a p i t a l i s t i y h t y m i e n + k a p i t a l i s t i y h t y m ä ä + k a p p a l e e n + k a p p a l e e s e e n + k a p p a l e e s s a + k a p p a l e i d e n + k a p p a l e i d e n k i n + k a p p a l e i k s i + k a p p a l e i s s a + k a p p a l e t t a + k a p p a l u k u + k a p r i i s i a + k a p s e l i h o t e l l i + k a p t e e n e i s t a + k a p t e e n i a + k a p t e e n i l u u t n a n t t i + k a p t e e n i n + k a p u l a k i e l e l l ä + k a p u l a k i e l e s t ä + k a p u l a k i e l t ä + k a p u l a t i e + k a p u l o i t a + k a p u s i i n i a p i n a t + k a p u s i i n i t + k a p u s t a h a i k a r a + k a p u s t a r i n t a + k a r a i i t i t + k a r a k o r u m i n u u n i l i n t u + k a r a k t e r i t a n s s i + k a r a m e l l i t o k k o + k a r a n m e r i + k a r a n s a l m i + k a r a n t e e n i a i k a + k a r a n t e e n i a i k a a + k a r a n t e e n i i n + k a r a n t e e n i j ä r j e s t e l m ä ä n s ä + k a r a n t e e n i j ä r j e s t e l y t + k a r a n t e e n i m ä ä r ä y k s i l l e + k a r a n t e e n i m ä ä r ä y k s i ä + k a r a n t e e n i m ä ä r ä y s t e n + k a r a n t e e n i s t a + k a r a n t e e n i t o i m e t + k a r a n t e e n i v y ö h y k k e i t ä + k a r a o k e p a r l a m e n t t i + k a r a o k e p a r l a m e n t t i a + k a r a o k e p a r l a m e n t t i i n + k a r a s i l l a + k a r a s t a + k a r a t a k s e e n + k a r b a m o y y l i f o s f a a t t i + k a r b i d i l a m p p u + k a r b o k s y y l i h a p o t + k a r b o n a a t t i e s t e r i + k a r b o n a a t t i k o v u u s + k a r b o n a a t t i m i n e r a a l i + k a r b o n y y l i s u l f i d i + k a r d i n a a l i h y v e e t + k a r d i n a a l i k a l a + k a r d i n a a l i k o l l e g i o + k a r d i n a a l i k u t o j a + k a r d i n a a l i l u r i + k a r d i n a a l i m e s i k k o + k a r d i n a a l i m u n a u k s e e n + k a r d i n a a l i m u n a u k s e n a + k a r d i n a a l i t e t r a + k a r d i n a a l i v i r h e + k a r d i n a a l i v i r h e e n n e + k a r d i n a a l i v i r h e t t ä + k a r e n i t + k a r e n s s i a i k o j a + k a r h e a p i l l i k e + k a r h u j ä r v i + k a r h u k o p l a + k a r h u k o p l a l t a + k a r h u k o p l a n + k a r h u k s i + k a r h u l l e + k a r h u m a k a k i + k a r h u n + k a r h u n j u u r i + k a r h u n k a t s e l u s a f a r e j a + k a r h u n k ö y n n ö s + k a r h u n l a u k k a + k a r h u n m e t s ä s t y s + k a r h u n p a l v e l u k s e n + k a r h u n p a l v e l u s + k a r h u n p a l v o n t a + k a r h u n p u t k i + k a r h u n r u o h o + k a r h u s a a r i + k a r i b i a l a i s t u o t t a j i e n + k a r i b i t + k a r i e s t a + k a r i k o t + k a r i k u k k o + k a r i l l e + k a r i m e t s o + k a r i m i n + k a r i n + k a r i s t e t a a n + k a r i t s a n + k a r i u t u a + k a r i u t u i v a t + k a r i u t u n e e t + k a r i u t u v a t + k a r j a a + k a r j a a m m e + k a r j a i s s u t + k a r j a k a n t a + k a r j a k a n t a a + k a r j a k a n t a a n + k a r j a k a n t o j e n + k a r j a k a s v a t u s t o i m i n t o j a + k a r j a k a u p a n + k a r j a k u l j e t u k s i a + k a r j a k u l j e t u s t e n + k a r j a k u o l e m i e n + k a r j a l a n k a n n a s + k a r j a l a n k a r h u k o i r a + k a r j a l a n p a i s t i + k a r j a l a n p i i r a k k a + k a r j a l a n r u u s u + k a r j a l a u m a n + k a r j a l l e + k a r j a m a r k k i n a t + k a r j a m a r k k i n o i d e n + k a r j a m a r k k i n o i l l a + k a r j a m a r k k i n o i s t a + k a r j a m m e + k a r j a m ä ä r ä s t ä + k a r j a n + k a r j a n h o i d o n + k a r j a n h o i d o s s a + k a r j a n h o i d o s t a + k a r j a n h o i t a j a t + k a r j a n h o i t o + k a r j a n h o i t o a + k a r j a n h o i t o a l a + k a r j a n h o i t o a l a l l a + k a r j a n h o i t o k ä y t ä n t ö j e n + k a r j a n h o i t o k ä y t ä n t ö ä + k a r j a n h o i t o l a i t o k s i a + k a r j a n h o i t o m e n e t e l m i ä + k a r j a n h o i t o o n + k a r j a n h o i t o s e k t o r i + k a r j a n k a s v a t t a j a + k a r j a n k a s v a t t a j a m m e + k a r j a n k a s v a t t a j a t + k a r j a n k a s v a t t a j a y h t e i s ö + k a r j a n k a s v a t t a j i a + k a r j a n k a s v a t t a j i e m m e + k a r j a n k a s v a t t a j i e n + k a r j a n k a s v a t t a j i i n + k a r j a n k a s v a t t a j i l l a + k a r j a n k a s v a t t a j i l l e + k a r j a n k a s v a t t a j i l t a + k a r j a n k a s v a t u k s e e n + k a r j a n k a s v a t u k s e l l a + k a r j a n k a s v a t u k s e l l e + k a r j a n k a s v a t u k s e l l e m m e + k a r j a n k a s v a t u k s e l t a + k a r j a n k a s v a t u k s e m m e + k a r j a n k a s v a t u k s e n + k a r j a n k a s v a t u k s e s s a + k a r j a n k a s v a t u k s e s t a + k a r j a n k a s v a t u s + k a r j a n k a s v a t u s a l a + k a r j a n k a s v a t u s a l a a + k a r j a n k a s v a t u s a l a a n + k a r j a n k a s v a t u s a l a l l a + k a r j a n k a s v a t u s a l a l l e + k a r j a n k a s v a t u s a l a l l e m m e + k a r j a n k a s v a t u s a l a l t a + k a r j a n k a s v a t u s a l a n + k a r j a n k a s v a t u s a l o i l l e + k a r j a n k a s v a t u s j ä r j e s t e l m ä s t ä + k a r j a n k a s v a t u s k ä y t ä n n ö t + k a r j a n k a s v a t u s m a i t a + k a r j a n k a s v a t u s m e n e t e l m ä t + k a r j a n k a s v a t u s p o l i t i i k a n + k a r j a n k a s v a t u s p r o s e s s i s t a + k a r j a n k a s v a t u s r a k e n t e i d e n + k a r j a n k a s v a t u s s e k t o r i + k a r j a n k a s v a t u s t a + k a r j a n k a s v a t u s t a v o i l l e + k a r j a n k a s v a t u s t i l a t + k a r j a n k a s v a t u s t i l o i l l a + k a r j a n k a s v a t u s t i l o j e n + k a r j a n k a s v a t u s t o i m i n t a + k a r j a n k a s v a t u s t o i m i n t a a n + k a r j a n k a s v a t u s y k s i k k ö ä + k a r j a n k a s v a t u s y r i t y k s e t + k a r j a n k u l j e t u k s e n + k a r j a n k u l j e t u k s i a + k a r j a n k u l j e t u k s i i n + k a r j a n k u l j e t u s + k a r j a n k u l j e t u s a u t o i h i n + k a r j a n k u l j e t u s t e n + k a r j a n l a n n a n + k a r j a n l a n t a a + k a r j a n l i h o t u k s e s s a + k a r j a n o m i s t a j i a + k a r j a n r e h u + k a r j a n r e h u a + k a r j a n r e h u a l a l l a + k a r j a n r e h u i s s a + k a r j a n r e h u n + k a r j a n r e h u s k a n d a a l e j a + k a r j a n r e h u t e o l l i s u u d e l l a + k a r j a n r e h u u n + k a r j a n r u o k i n t a t e o l l i s u u s + k a r j a n s u o j e l u u n + k a r j a n t u o t a n n o s t a + k a r j a n t u o t a n t o + k a r j a n t u o t a n t o j ä r j e s t e l m ä s s ä + k a r j a n t u o t t a j i e n + k a r j a n v ä l i t t ä j ä t + k a r j a p u s k u r e i h i n + k a r j a p u s k u r e i s t a + k a r j a p u s k u r e i t a + k a r j a p u s k u r i + k a r j a p u s k u r i e n + k a r j a p u s k u r i t + k a r j a r a h a s t o + k a r j a r e h u n + k a r j a r o d u i s t a + k a r j a r o d u s t a + k a r j a s s a + k a r j a s t a a n + k a r j a t + k a r j a t a l o u d e l l i s e n + k a r j a t a l o u d e n + k a r j a t a l o u d e s s a + k a r j a t a l o u s + k a r j a t a l o u s a l a + k a r j a t a l o u s a l a a n + k a r j a t a l o u s a l a l l e + k a r j a t a l o u s a l a n + k a r j a t a l o u s k r i i s e j ä + k a r j a t a l o u s t u o t t e e t + k a r j a t a l o u s y r i t y k s e s s ä + k a r j a t a l o u t e e n + k a r j a t a l o u t t a + k a r j a t a u d e i s t a + k a r j a t e o l l i s u u d e n + k a r j a t e o l l i s u u s + k a r j a t i e t o k a n t o i h i n + k a r j a t i h e y s + k a r j a t i l a a + k a r j a t i l a k s i + k a r j a t i l a l l i s e l l e + k a r j a t i l a l t a + k a r j a t i l a s t a + k a r j a t i l a t + k a r j a t i l o i h i n + k a r j a t i l o i l l e + k a r j a t i l o j a + k a r j a t i l o j e n + k a r j a t u o t a n n o n + k a r j a t u o t a n n o s s a a n + k a r j a v a u n u i h i n + k a r j u k a l a t e o l l i s u u t t a + k a r j u k a l a v e r k k o j e n + k a r k a u s s e k u n t i + k a r k a u s v u o s i + k a r k a u s v u o s i n a + k a r k e a m p a a n + k a r k e a m p i a + k a r k e a n + k a r k k i p u s s i e n + k a r k k i p u s s i n + k a r k o t e t a a n + k a r k o t e t t i i n + k a r k o t e t t u + k a r k o t e t t u j e n + k a r k o t t a a + k a r k o t t a a k s e e n + k a r k o t t a m a l l a + k a r k o t t a m i s j ä r j e s t e l m ä ä + k a r k o t t a m i s m a h d o l l i s u u k s i a + k a r k o t t a m i s p ä ä t ö k s e n + k a r k o t t a m i s p ä ä t ö s t e n + k a r k o t t a m i s t a + k a r k o t t a m i s t a r k o i t u k s e s s a + k a r k o t t a m i s u h k a a + k a r k o t u k s e l t a + k a r k o t u k s e t + k a r k o t u k s i a + k a r k o t u k s i s t a + k a r k o t u s k e i n o j e n + k a r k o t u s k e s k u k s e s s a + k a r k o t u s k e s k u k s i i n + k a r k o t u s k e s k u k s i s s a + k a r k o t u s k i e l t o + k a r k o t u s k o n e i s t o n + k a r k o t u s k o n e t t a + k a r k o t u s k ä s i t t e l y ä + k a r k o t u s m a h d o l l i s u u k s i a + k a r k o t u s m e n e t t e l y l l ä + k a r k o t u s m e n e t t e l y n + k a r k o t u s m e n e t t e l y ä + k a r k o t u s m ä ä r ä y k s i ä + k a r k o t u s m ä ä r ä y s t e n + k a r k o t u s m ä ä r ä y s t ä + k a r k o t u s o i k e u s + k a r k o t u s o i k e u t t a + k a r k o t u s p e r u s t e i t a + k a r k o t u s p o l i t i i k a n + k a r k o t u s p o l i t i i k k a a + k a r k o t u s p o l i t i i k k a a n s a + k a r k o t u s p y y n t ö ä + k a r k o t u s p ä ä t ö k s e n + k a r k o t u s p ä ä t ö k s e t + k a r k o t u s p ä ä t ö k s i s t ä + k a r k o t u s p ä ä t ö k s i ä + k a r k o t u s p ä ä t ö s + k a r k o t u s p ä ä t ö s t e n + k a r k o t u s p ä ä t ö s t ä + k a r k o t u s p ä ä t ö s t ä ä n + k a r k o t u s t a + k a r k o t u s t e n + k a r k o t u s t o i m e n + k a r k o t u s t o i m e n p i t e e n + k a r m a i s e v a a + k a r m e a s t a + k a r m e a t + k a r m e i m p a a n + k a r m e i t a + k a r m e l i i t t a l u o s t a r i + k a r m i i n i k o r u s i m p p u + k a r m i i n i t a n g a r a + k a r m i n + k a r n e v a a l i v i i k k o + k a r o l i i n i t + k a r o l i n g i t + k a r p a l o m e h u + k a r r i k o i d a + k a r s i a + k a r s i m a a n + k a r s i m i s e l l a + k a r s i n n a t + k a r s i n o g e e n e i l t a + k a r s i n o g e e n i a + k a r s i n o g e e n i d i r e k t i i v i i n + k a r s i n o g e e n i d i r e k t i i v i s t ä + k a r s i n o g e e n i k s i + k a r s i n o g e e n i l l e + k a r s i n o g e e n i n + k a r s i n o g e e n i n a + k a r s i n o g e e n i s e t + k a r s i n o g e e n i s i a + k a r s i n o g e e n i s i l l a + k a r s i n t a l u e t t e l o i t a + k a r s i t a a n + k a r s i t t a i s i i n + k a r s i t t a v a + k a r t a l l a + k a r t a l t a + k a r t a n + k a r t a n l u k i j a + k a r t a n o s s a + k a r t a s t a + k a r t e l l e i h i n + k a r t e l l e j a + k a r t e l l i a j a t t e l u n + k a r t e l l i a s i a a n + k a r t e l l i e n + k a r t e l l i h i n n o i t t e l u s t a + k a r t e l l i k i e l l o s t a + k a r t e l l i k i e l t o + k a r t e l l i l a i n s ä ä d ä n n ö l l ä + k a r t e l l i l a i n s ä ä d ä n n ö n + k a r t e l l i l a i n s ä ä d ä n t ö ä + k a r t e l l i l a i s t a + k a r t e l l i m e n e t t e l y j ä + k a r t e l l i n v a s t a i s e s t a + k a r t e l l i o i k e u d e n + k a r t e l l i p o l i t i i k a n + k a r t e l l i p o l i t i i k a s t a + k a r t e l l i s o p i m u k s e t + k a r t e l l i s o p i m u k s i a + k a r t e l l i s o p i m u k s i i n + k a r t e l l i s o p i m u s t e n + k a r t e l l i s t a + k a r t e l l i s t r a t e g i a a + k a r t e l l i s ä ä n n ö i s s ä + k a r t e l l i s ä ä n n ö t + k a r t e l l i s ä ä n t ö j e n + k a r t e l l i t + k a r t e l l i t a p a u k s i s s a + k a r t e l l i t i l a n n e + k a r t e l l i t o i m i n n a s t a + k a r t e l l i t u t k i m u k s e e n + k a r t e l l i v a l v o n t a a + k a r t e l l i v i r a n o m a i s t a + k a r t e s i o l a i s e s t i + k a r t i o h u h t a s i e n i + k a r t i o k o h o k k i + k a r t i o k o t i l o + k a r t i o l e i k k a u s + k a r t i o v a h a k a s + k a r t o i t t a a + k a r t o i t t a m a a n + k a r t o i t t a m a t t o m a l l e + k a r t o i t t a m i s e s t a + k a r t o i t t a m i s p r o s e s s i + k a r t o i t t a m i s p r o s e s s i s s a + k a r t o i t u s j ä r j e s t e l m ä s t ä + k a r t o i t u s k e r t o m u k s e t + k a r t o i t u s o h j e l m a a + k a r t o i t u s p a l v e l u i t a + k a r t o i t u s p e r i a a t e t t a + k a r t o i t u s p r o s e s s i + k a r t o i t u s p r o s e s s i n + k a r t o i t u s t a + k a r t o i t u s t u t k i m u k s i a + k a r t o i t u s v a l t u u s k u n t a + k a r t o i t u s v i r a s t o o n + k a r t t a a + k a r t t a a k s e e n + k a r t t a a n + k a r t t a j ä r j e s t e l m ä + k a r t t a k i e l i + k a r t t a m a l l a + k a r t t a p a l l o k a l a + k a r t t a p a l v e l u + k a r t t a p o h j o i n e n + k a r t t a p r o j e k t i o + k a r t t a t i e d o t + k a r t t a v a t + k a r t t e l i + k a r t t o j a + k a r t t o j e n + k a r t u s i a a n i l u o s t a r i + k a r t u t t a m i s j ä r j e s t e l m i i n + k a r u i m m i s s a + k a r u i m m i s t a + k a r u i s t a + k a r u l l a + k a r u m p i + k a r u s e l l i a + k a r u s e l l i a j e l u a + k a r u s e l l i a l a l l a + k a r u s e l l i k a u p p a p e t o s t e n + k a r u s e l l i p e t o k s e k s i + k a r u s e l l i p e t o k s i a + k a r u s e l l i p e t o k s i i n + k a r u s e l l i p e t o k s i n a + k a r u s e l l i p e t o k s i s t a + k a r u s e l l i p e t o s + k a r u s e l l i p e t o s t e n + k a r u s e l l i s t a + k a r u u d e n + k a r v a h o r s m a + k a r v a i m p i a + k a r v a i t a + k a r v a k a m u t + k a r v a k i v i y r t t i + k a r v a k u i s m a + k a r v a k u o n o v o m p a t t i + k a r v a l e h t i + k a r v a m a n s i k k a + k a r v a m e s i h e i n ä + k a r v a n l ä h t ö ä + k a r v a n o p a t + k a r v a n s a + k a r v a p ä ä m u u r a + k a r v a r i s t i m a t a r a + k a r v a r o u s k u + k a r v a s h i k k o r i + k a r v a s k u r k k u + k a r v a s o l u l e u k e m i a + k a r v a t u p p i + k a r v a u k o n k o r e n t o + k a r v a v y ö k ä ä p ä + k a r v i a i s k o i s o + k a s a a n t u v a t + k a s a i n v ä l i s e n + k a s a p a n o s + k a s a s i v a t + k a s a u t u m i s e n + k a s a u t u m i s p i s t e + k a s a u t u v a a + k a s a u t u v a t + k a s e t t i a s e m a + k a s e t t i n a u h u r i t + k a s e t t i s o i t i n + k a s i n o a + k a s i n o a s i a k k a a t + k a s i n o i l l e + k a s i n o i l m a p i i r i i n + k a s i n o i t a + k a s i n o k a p i t a l i s m i + k a s i n o k a p i t a l i s m i a + k a s i n o k a p i t a l i s m i i n + k a s i n o k a p i t a l i s m i k s i + k a s i n o k a p i t a l i s m i n + k a s i n o k a p i t a l i s m i s s a + k a s i n o k a p i t a l i s m i s t a + k a s i n o k o m p r o m i s s i + k a s i n o k o m p r o m i s s i s t a + k a s i n o m e n t a l i t e e t i s t a + k a s i n o m e n t a l i t e e t t i a + k a s i n o m o n o p o l i + k a s i n o p a n k i t + k a s i n o p e l e i s t ä + k a s i n o t a l o u d e n + k a s i n o t a l o u d e s s a + k a s i n o t a l o u d e s t a + k a s i n o t a l o u k s i k s i + k a s i n o t a l o u s + k a s i n o t a l o u t t a + k a s i p a l l o + k a s k a d i h ä i r i ö + k a s k a d i j ä r j e s t e l m ä + k a s k a d i t + k a s k e s s a + k a s k i v i l j e l y + k a s k u n + k a s s a a n + k a s s a a t i o t u o m i o i s t u i m e e n + k a s s a a t i o t u o m i o i s t u i m e s s a + k a s s a a t i o t u o m i o i s t u i n + k a s s a k o n e + k a s s a k r i i s i + k a s s a k r i i s i ä + k a s s a l l a + k a s s a l l e + k a s s a n + k a s s a n h a l l i n n a s t a + k a s s a n h a l l i n t a t e k n i i k a t + k a s s a o p e r a a t i o t + k a s s a p e r u s t e i s e n + k a s s a s t a + k a s s a t + k a s s a t i l a n t e e n + k a s s a t u o t e o s a + k a s s a v a j e e n s a + k a s s a v a r a n t o a + k a s s a v a r a n t o s u h d e + k a s s a v i r r a n + k a s s a v i r r a t + k a s s a v i r t a + k a s s a v i r t a a + k a s s a v i r t a a n s a + k a s s a v i r t a l a s k e l m a a + k a s s a v i r t a l a s k e l m a n + k a s s a v i r t a o n g e l m i a + k a s s a v i r t a o n g e l m i e n + k a s s a v i r t a o n g e l m i s t a + k a s s a v i r t o j a + k a s s a v i r t o j e n + k a s s o i h i n + k a s s o j a + k a s s o j e n + k a s t a n j a k i i t ä j ä + k a s t a n j a k o t i n g a + k a s t a n j a k u h a n k e i t t ä j ä + k a s t a n j a k u t o j a + k a s t a n j a l a k k i t i m a l i + k a s t a n j a m i i n a a j a k o i + k a s t a n j a p e r ä k i p u a j a + k a s t a n j a p o s k i k e r t t u l i + k a s t a n j a r a s t u l i + k a s t a n j a r u t t o + k a s t a n j a s e l k ä t y r a n n i + k a s t a n j a s i e p p o k e r t t u + k a s t a n j a s i r k k u + k a s t a n j a s u t i p u u + k a s t a n j a t a t t i + k a s t a n j a t i m a n t t i k o l i b r i + k a s t a n j a t ö y h t ö t i k k a + k a s t a n j a u k o n s i e n i + k a s t a n j a v a r p u n e n + k a s t e k ä s k y + k a s t e l e m a a n + k a s t e l l a + k a s t e l u a s i a n t u n t i j o i s t a + k a s t e l u h a n k k e e t + k a s t e l u h a n k k e i t a + k a s t e l u i n f r a s t r u k t u u r e i l l e + k a s t e l u j ä r j e s t e l m i e n + k a s t e l u j ä r j e s t e l m i i n + k a s t e l u j ä r j e s t e l m i ä + k a s t e l u j ä r j e s t e l m ä + k a s t e l u j ä r j e s t e l m ä t + k a s t e l u k a n n u p e r i a a t t e e l l a + k a s t e l u k a n n u p e r i a a t t e e s t a + k a s t e l u k i i n t i ö i d e n + k a s t e l u m a a k s i + k a s t e l u m e n e t e l m i e n + k a s t e l u n + k a s t e l u o h j e l m a n + k a s t e l u o n g e l m a n + k a s t e l u t e k n i i k a t + k a s t e l u t e k n i i k o i h i n + k a s t e l u v e d e n + k a s t e l u v e d e s t ä + k a s t e l u v e s i e n + k a s t e l u v e t t ä + k a s t e m a l j a + k a s t e m a t o + k a s t e m e k k o + k a s t e p i s t e + k a s t i j ä r j e s t e l m ä + k a s t i j ä r j e s t e l m ä n + k a s t i j ä r j e s t e l m ä s t ä + k a s t i j ä r j e s t e l m ä ä + k a s t i j ä r j e s t e l m ä ä n + k a s t i l a i t o k s e n a + k a s t i l a i t o k s e s s a + k a s t i l a i t o s t a + k a s t i p o h j a i s e s t a + k a s t i s y r j i n t ä + k a s t i t t o m a n + k a s t i t t o m i e n + k a s t o i v a t + k a s t u u + k a s v a a + k a s v a a k i n + k a s v a a k s e e n + k a s v a e s s a + k a s v a i n s a i r a u k s i s t a + k a s v a i s i + k a s v a i s i v a t + k a s v a m a a n + k a s v a m a l l a + k a s v a m a s s a + k a s v a m i s e n + k a s v a m i s e s t a + k a s v a m i s t a + k a s v a m i s t a a n + k a s v a n e e t + k a s v a t + k a s v a t a t + k a s v a t e t a a n + k a s v a t e t a a n k o + k a s v a t e t t a i s i i n + k a s v a t e t t a v a + k a s v a t e t t a v i k s i + k a s v a t e t t a v i s s a + k a s v a t e t t u j e n + k a s v a t t a a + k a s v a t t a a k s e e n + k a s v a t t a a k s e m m e + k a s v a t t a i s i + k a s v a t t a j a a n + k a s v a t t a j a s e u r a n + k a s v a t t a j a s e u r o j a + k a s v a t t a j a t + k a s v a t t a j i a m m e + k a s v a t t a j i e n + k a s v a t t a j i l l e + k a s v a t t a m a a n + k a s v a t t a m a l l a + k a s v a t t a m a t t a + k a s v a t t a m i s e e n + k a s v a t t a m i s e k s i + k a s v a t t a m i s e n + k a s v a t t a m i s t a + k a s v a t t a m o i l l a + k a s v a t t a n e e t + k a s v a t t a n u t + k a s v a t t a v a t + k a s v a t t e j a + k a s v a t t i e n + k a s v a t t i p e l a a j i a + k a s v a t u k s e e n + k a s v a t u k s e l l e + k a s v a t u k s e n + k a s v a t u k s e n k i n + k a s v a t u k s e s s a + k a s v a t u k s e s t a + k a s v a t u s a l a l l a + k a s v a t u s a l u s t a + k a s v a t u s e l ä i m i i n + k a s v a t u s f i l o s o f i a + k a s v a t u s f o o r u m i n + k a s v a t u s j ä r j e s t e l m i e n + k a s v a t u s j ä r j e s t e l m i e n s ä + k a s v a t u s j ä r j e s t e l m i s s ä + k a s v a t u s j ä r j e s t e l m i s t ä + k a s v a t u s j ä r j e s t ö t + k a s v a t u s k a m p a n j o i t a + k a s v a t u s k a p a s i t e e t i n + k a s v a t u s k e i n o j a + k a s v a t u s l a i t o k s i s s a + k a s v a t u s l a i t o s t e n + k a s v a t u s m a t e r i a a l i a + k a s v a t u s m e n e t e l m i e n + k a s v a t u s m e n e t e l m i l l e + k a s v a t u s m e n e t e l m i l l ä + k a s v a t u s o i k e u d e s t a + k a s v a t u s o l o i l t a + k a s v a t u s p a i k k a a + k a s v a t u s p r o s e s s i + k a s v a t u s p s y k o l o g i + k a s v a t u s p s y k o l o g i a + k a s v a t u s s o s i o l o g i a + k a s v a t u s t a + k a s v a t u s t a r k o i t u k s i i n + k a s v a t u s t a s o l l a + k a s v a t u s t a v o i t t e e t + k a s v a t u s t e h t ä v ä + k a s v a t u s t e h t ä v ä t + k a s v a t u s t e h t ä v ä ä + k a s v a t u s t e h t ä v ä ä n s ä + k a s v a t u s t e o l l i s u u t t a + k a s v a t u s t i e d e + k a s v a t u s t i l o i l l a + k a s v a t u s t y ö + k a s v a t u s v a i h e e s t a + k a s v a t u s v a l i n n a t + k a s v a t u s y k s i k ö i d e n + k a s v a v a a + k a s v a v a a n + k a s v a v a k s i + k a s v a v a l l a + k a s v a v a l t a + k a s v a v a n + k a s v a v a s s a + k a s v a v a s t a + k a s v a v a t + k a s v a v i a + k a s v a v i e n + k a s v a v i i n + k a s v a v i s t a + k a s v e i l l e + k a s v e i s t a m m e + k a s v e j a + k a s v e t t a v a + k a s v i a + k a s v i a i n e i d e n + k a s v i a i n e i t a + k a s v i a l a a n + k a s v i a l a n + k a s v i a n a t o m i a + k a s v i a n t i b i o o t t i e n + k a s v i e n + k a s v i e n s u o j e l u + k a s v i e n s u o j e l u a + k a s v i e n s u o j e l u n + k a s v i e n s u o j e l u s t a + k a s v i e n s u o j e l u u n + k a s v i f y s i o l o g i a + k a s v i g e e n i v a r o j a + k a s v i g e e n i v a r o j e n + k a s v i h o r m o n i + k a s v i h u o n e + k a s v i h u o n e i l m i ö + k a s v i h u o n e i l m i ö l l e + k a s v i h u o n e i l m i ö n + k a s v i h u o n e i l m i ö s s ä + k a s v i h u o n e i l m i ö s t ä + k a s v i h u o n e i l m i ö t ä + k a s v i h u o n e i l m i ö t ä k i n + k a s v i h u o n e i l m i ö ö n + k a s v i h u o n e k a a s u + k a s v i h u o n e k a a s u a + k a s v i h u o n e k a a s u i h i n + k a s v i h u o n e k a a s u i l l a + k a s v i h u o n e k a a s u i l l e + k a s v i h u o n e k a a s u i l m i ö t ä + k a s v i h u o n e k a a s u i n t e n s i i v i s y y s + k a s v i h u o n e k a a s u i n t e n s i t e e t t i ä + k a s v i h u o n e k a a s u i s s a + k a s v i h u o n e k a a s u i s t a + k a s v i h u o n e k a a s u j a + k a s v i h u o n e k a a s u j a a n + k a s v i h u o n e k a a s u j e n + k a s v i h u o n e k a a s u k i i n t i ö i t ä + k a s v i h u o n e k a a s u n + k a s v i h u o n e k a a s u n a + k a s v i h u o n e k a a s u p i t o i s u u k s i a + k a s v i h u o n e k a a s u p i t o i s u u t t a + k a s v i h u o n e k a a s u p ä ä s t ö i h i n + k a s v i h u o n e k a a s u p ä ä s t ö i l l ä + k a s v i h u o n e k a a s u p ä ä s t ö i l t ä + k a s v i h u o n e k a a s u p ä ä s t ö i n ä + k a s v i h u o n e k a a s u p ä ä s t ö i s s ä + k a s v i h u o n e k a a s u p ä ä s t ö i s t ä + k a s v i h u o n e k a a s u p ä ä s t ö i s t ä m m e + k a s v i h u o n e k a a s u p ä ä s t ö j e n + k a s v i h u o n e k a a s u p ä ä s t ö j e n v a l v o n t a j ä r j e s t e l m ä + k a s v i h u o n e k a a s u p ä ä s t ö j ä + k a s v i h u o n e k a a s u p ä ä s t ö j ä ä n + k a s v i h u o n e k a a s u p ä ä s t ö k a u p a n + k a s v i h u o n e k a a s u p ä ä s t ö k i i n t i ö i d e n + k a s v i h u o n e k a a s u p ä ä s t ö l u v i s t a + k a s v i h u o n e k a a s u p ä ä s t ö m m e + k a s v i h u o n e k a a s u p ä ä s t ö o i k e u k s i a + k a s v i h u o n e k a a s u p ä ä s t ö o i k e u k s i e n + k a s v i h u o n e k a a s u p ä ä s t ö t + k a s v i h u o n e k a a s u p ä ä s t ö t a s o t + k a s v i h u o n e k a a s u s t a + k a s v i h u o n e k a a s u s ä ä s t ö j ä + k a s v i h u o n e k a a s u t + k a s v i h u o n e k a a s u t a s a p a i n o a + k a s v i h u o n e k a a s u t u o t a n n o n + k a s v i h u o n e k a a s u t u o t a n t o a + k a s v i h u o n e k a a s u v a i k u t u k s e s t a + k a s v i h u o n e k a s v i e n + k a s v i h u o n e m a l l i t + k a s v i h u o n e p ä ä s t ö i h i n + k a s v i h u o n e p ä ä s t ö i s s ä + k a s v i h u o n e p ä ä s t ö i s t ä + k a s v i h u o n e p ä ä s t ö j e n + k a s v i h u o n e p ä ä s t ö j ä + k a s v i h u o n e p ä ä s t ö j ä ä n + k a s v i h u o n e p ä ä s t ö o i k e u k s i e n + k a s v i h u o n e p ä ä s t ö r a j o i t u k s i i n + k a s v i h u o n e p ä ä s t ö t + k a s v i h u o n e s a n a s t o a + k a s v i h u o n e t a k u u m m e + k a s v i h u o n e v a i k u t u k s e n + k a s v i h u o n e v a i k u t u s + k a s v i h u u t o k a u p a t + k a s v i h y g i e n i a + k a s v i h y g i e n i a n + k a s v i j a l o s t u k s e s s a + k a s v i k a n t o j a + k a s v i k o h t a i s e s t i + k a s v i k u d o k s e t + k a s v i l a h k o i s t a + k a s v i l a j e i h i n + k a s v i l a j e i l l a + k a s v i l a j e i s t a + k a s v i l a j e j a + k a s v i l a j i + k a s v i l a j i a + k a s v i l a j i e n + k a s v i l a j i k e l u e t t e l o o n + k a s v i l a j i k e t t a + k a s v i l a j i k k e e t + k a s v i l a j i k k e i d e n + k a s v i l a j i k k e i s i i n + k a s v i l a j i k k e i s s a + k a s v i l a j i k k e i t a + k a s v i l a j i n + k a s v i l a j i t + k a s v i l a j i v i r a s t o l l e + k a s v i l l i s u u t t a + k a s v i l ä ä k e a l a n + k a s v i l ä ä k e k o m i t e a l l a + k a s v i l ä ä k k e e n + k a s v i l ä ä k k e i d e n + k a s v i l ä ä k k e i l t ä + k a s v i l ä ä k k e i s t ä + k a s v i l ä ä k k e i t ä + k a s v i m a i t o + k a s v i m o n o g r a f i o i t a + k a s v i m o r f o l o g i a + k a s v i m y r k k y j ä + k a s v i n h o i t o t u o t t e i t a + k a s v i n j a l o s t a j a t + k a s v i n j a l o s t u k s e n + k a s v i n j a l o s t u k s e s t a + k a s v i n s u o j a + k a s v i n s u o j e l u + k a s v i n s u o j e l u a + k a s v i n s u o j e l u a i n e + k a s v i n s u o j e l u a i n e a s e t u k s e e n + k a s v i n s u o j e l u a i n e a s e t u s t a + k a s v i n s u o j e l u a i n e d i r e k t i i v i n + k a s v i n s u o j e l u a i n e e l l e + k a s v i n s u o j e l u a i n e e n + k a s v i n s u o j e l u a i n e e n a + k a s v i n s u o j e l u a i n e e t + k a s v i n s u o j e l u a i n e e t h a n + k a s v i n s u o j e l u a i n e i d e n + k a s v i n s u o j e l u a i n e i l l a + k a s v i n s u o j e l u a i n e i l t a + k a s v i n s u o j e l u a i n e i n a + k a s v i n s u o j e l u a i n e i s i i n + k a s v i n s u o j e l u a i n e i s t a + k a s v i n s u o j e l u a i n e i t a + k a s v i n s u o j e l u a i n e p o l i t i i k a n + k a s v i n s u o j e l u a i n e t i l a s t o j a + k a s v i n s u o j e l u a k i n + k a s v i n s u o j e l u a l a l l a + k a s v i n s u o j e l u a l a l l a k i n + k a s v i n s u o j e l u a l o i h i n + k a s v i n s u o j e l u a s e t u s + k a s v i n s u o j e l u a s i a t + k a s v i n s u o j e l u a s i o i t a + k a s v i n s u o j e l u d i r e k t i i v i n + k a s v i n s u o j e l u h a n k k e i l l e + k a s v i n s u o j e l u h o i t o + k a s v i n s u o j e l u k ä y t ä n t ö j e n + k a s v i n s u o j e l u l a i n s ä ä d ä n n ö n + k a s v i n s u o j e l u m e n e t e l m ä t + k a s v i n s u o j e l u n + k a s v i n s u o j e l u n ä k ö k o h t i e n + k a s v i n s u o j e l u o n g e l m a t + k a s v i n s u o j e l u p o l i t i i k a n + k a s v i n s u o j e l u p o l i t i i k k a a + k a s v i n s u o j e l u p o l i t i i k k a a n + k a s v i n s u o j e l u s s a + k a s v i n s u o j e l u s t a n d a r d e i h i n + k a s v i n s u o j e l u t e k n i i k a n + k a s v i n s u o j e l u t o i m e n p i t e i s i i n + k a s v i n s u o j e l u t o i m e t + k a s v i n s u o j e l u t o i m i a + k a s v i n s u o j e l u t o i m i e n + k a s v i n s u o j e l u t o i m i n n a n + k a s v i n s u o j e l u t o i m i s t a + k a s v i n s u o j e l u t u o t e v a l i k o i m a a n + k a s v i n s u o j e l u t u o t t e i d e n + k a s v i n s u o j e l u t u o t t e i l l a + k a s v i n s u o j e l u t u o t t e i s t a + k a s v i n s u o j e l u t u o t t e i t a + k a s v i n s u o j e l u u n + k a s v i n s u o j e l u v a a t i m u k s i a + k a s v i n s u o j e l u v i r a s t o + k a s v i n t u o t a n n o s t a + k a s v i n v i l j e l i j ö i d e n + k a s v i n v i l j e l y k i n + k a s v i n v i l j e l y n + k a s v i n v i l j e l y t i l a s t o i s t a + k a s v i n v i l j e l y t i l a s t o j e n + k a s v i n v i l j e l y t i l a s t o t + k a s v i n v i l j e l y y n + k a s v i n v i l j e l y ä + k a s v i p a t o l o g i a + k a s v i p e i t e t t ä + k a s v i p e i t t e e n + k a s v i p e r ä i s e t + k a s v i p e r ä i s i ä + k a s v i p e r ä i s t e n + k a s v i p o h j a i s i l l a + k a s v i p o l t t o a i n e i d e n + k a s v i p r o t e i i n e i h i n + k a s v i p r o t e i i n e i l l a + k a s v i p r o t e i i n i a + k a s v i p r o t e i i n i e n + k a s v i p r o t e i i n i n + k a s v i p r o t e i i n i s i s ä l l ö n + k a s v i p r o t e i i n i s t a m m e + k a s v i p r o t e i i n i t + k a s v i p r o t e i i n i v a j e + k a s v i r a s v a + k a s v i r a s v a a + k a s v i r a s v a a n + k a s v i r a s v a n + k a s v i r a s v a n a + k a s v i r a s v a s t a + k a s v i r a s v a t + k a s v i r a s v o i l l a + k a s v i r a s v o j a + k a s v i r a s v o j e n + k a s v i r a v i n n e y h d i s t e i l t ä + k a s v i r a v i n t o a + k a s v i r o h d o k s i a + k a s v i r o h d o k s i k s i + k a s v i r o h d o k s i s t a + k a s v i r o h d o s a l a + k a s v i r o h d o s t e n + k a s v i r o h d o s v a l m i s t e i d e n + k a s v i r o h d o s v a l m i s t e i l l a + k a s v i r o h d o s v a l m i s t e i s t a + k a s v i r o h d o s v a l m i s t e i t a + k a s v i r o h d o s v a l m i s t e k o m i t e a n + k a s v i r o h d o s v a l m i s t e t t a + k a s v i s o l u t + k a s v i s p r o t e i i n i e n + k a s v i s r a s v a a + k a s v i s r a s v a t u o t t e i d e n + k a s v i s r a s v o i l l a + k a s v i s r a s v o i s t a + k a s v i s r a s v o j a + k a s v i s r a s v o j e n + k a s v i s r u o k a + k a s v i s r u o k a a + k a s v i s r u o k a v i i k k o + k a s v i s s y ö j ä k s i + k a s v i s s y ö n n i s t ä + k a s v i s s y ö n t i ä + k a s v i s t o l l e + k a s v i s t o n + k a s v i s ö l j y j e n + k a s v i s ö l j y j ä + k a s v i s ö l j y s t ä + k a s v i t + k a s v i t a r k a s t u k s i a + k a s v i t a u d e i l l e + k a s v i t a u t e j a + k a s v i t a u t i e n + k a s v i t e k s t i i l i k u i d u t + k a s v i t i e t e e l l i n e n + k a s v i t u o t a n n o n + k a s v i t u o t a n n o s t a + k a s v i t u o t t e i d e n + k a s v i t u o t t e i s i i n + k a s v i t u o t t e i t a + k a s v i v a l k u a i s a i n e e n + k a s v i v a l k u a i s e l l a + k a s v i v a l k u a i s e n + k a s v i v a l k u a i s e n e r g i a + k a s v i v a l k u a i s e s t a + k a s v i v a l k u a i s e t + k a s v i v a l k u a i s i a + k a s v i v a l k u a i s i i n + k a s v i v a l k u a i s i s t a + k a s v i v a l k u a i s r a v i n n o s s a + k a s v i v a l k u a i s t a + k a s v i v a l k u a i s t a r p e i d e m m e + k a s v i v a l k u a i s t e n + k a s v i v a l k u a i s t u o t a n n o n + k a s v i v a l k u a i s t u o t a n t o + k a s v i v a l k u a i s t u o t a n t o a + k a s v i v a l k u a i s v a j e + k a s v i v a l k u a i s v a j e t t a + k a s v i v a r i a n t t i n a + k a s v i v i l j e l y n + k a s v i ö l j y + k a s v i ö l j y a l a a + k a s v i ö l j y e s t e r i + k a s v i ö l j y i l l e + k a s v i ö l j y j e n + k a s v i ö l j y j ä + k a s v i ö l j y l l e + k a s v i ö l j y n + k a s v i ö l j y s e k o i t u k s i a + k a s v i ö l j y s t ä + k a s v i ö l j y t o n n i n + k a s v o h e r m o + k a s v o i + k a s v o i l l e + k a s v o i n a + k a s v o j a a n + k a s v o j e n k o h o t u s + k a s v o j e n k o h o t u s t a + k a s v o j e n m e n e t y s t ä + k a s v o j e n s i i r t o + k a s v o k u v a + k a s v o n s a + k a s v o s u o j u k s i s t a + k a s v o t + k a s v o v o i d e + k a s v o v o i t e e n i + k a s v o v o i t e i d e n + k a s v u a + k a s v u a a n + k a s v u a l a + k a s v u a l a l l a + k a s v u a l o i l l e + k a s v u a l o i t e + k a s v u a l o i t e t t a + k a s v u a l o i t t e e n + k a s v u a l o i t t e e s e e n + k a s v u a l o i t t e e s e e n s a + k a s v u a l o i t t e e s s a + k a s v u a l o i t t e e s t a + k a s v u a l o j e n + k a s v u a l u e + k a s v u a l u e e l l e + k a s v u a l u e i d e n + k a s v u a l u e i k s i + k a s v u a l u e i l l a + k a s v u a l u e i l l e + k a s v u a l u e i t a + k a s v u a l u s t a + k a s v u a l u s t a a + k a s v u a l u s t a n + k a s v u a l u s t a n a + k a s v u a l u s t o i n a + k a s v u a n a l y y s i + k a s v u a r v i o i d e n + k a s v u a s t e + k a s v u a s t e e s e e n + k a s v u a s t e e s t a + k a s v u a s t e e t + k a s v u a s t e i l l a + k a s v u a s t e i s t a + k a s v u a s t e t t a + k a s v u a s t e t t a a n + k a s v u b u u m i + k a s v u b u u m i a + k a s v u e d e l l y t y s t e n + k a s v u e l e m e n t t i + k a s v u e n n u s t e + k a s v u e n n u s t e e k s i + k a s v u e n n u s t e e m m e + k a s v u e n n u s t e e s e e n + k a s v u e n n u s t e e t + k a s v u e n n u s t e i d e n + k a s v u e n n u s t e i s i i n + k a s v u e n n u s t e i s t a + k a s v u e n n u s t e i s t a a n + k a s v u e n n u s t e i t a + k a s v u e n n u s t e i t a m m e + k a s v u e n n u s t e t t a + k a s v u e n n u s t e t t a a n + k a s v u h a a s t e e s e e n + k a s v u h a a s t e i s i i n + k a s v u h a k u i s e m p i a + k a s v u h a k u i s i a + k a s v u h a l u k k u u d e n + k a s v u h a l u k k u u t e e n + k a s v u h a n k k e e t + k a s v u h o r m o n e i l l a + k a s v u h o r m o n e i s t a + k a s v u h o r m o n e j a + k a s v u h o r m o n i + k a s v u h o r m o n i a + k a s v u h o r m o n i e n + k a s v u h o r m o n i n + k a s v u h u o n e k a a s u p ä ä s t ö j e n + k a s v u i n d e k s i t + k a s v u i n v e s t o i n t e i h i n + k a s v u i n v e s t o i n t e j a + k a s v u k a u d e n + k a s v u k a u d e t + k a s v u k a u s i + k a s v u k a u s i n a + k a s v u k a u t t a + k a s v u k e h y k s e e n + k a s v u k e s k u k s i i n + k a s v u k e s k u k s i k s i + k a s v u k i n + k a s v u k i p u j a + k a s v u k r i i s e i h i n + k a s v u k r i i s i n + k a s v u k r i i s i s t ä + k a s v u k r i t e e r e i h i n + k a s v u k r i t e e r e j ä + k a s v u k r i t e e r i n + k a s v u k u i l u s t a + k a s v u k y k y + k a s v u k y k y ä + k a s v u k y k y ä m m e + k a s v u k y s y m y k s e n + k a s v u k y s y m y k s i s t ä + k a s v u k ä s i t y k s e n + k a s v u l l a a n + k a s v u l l a m m e + k a s v u l l e + k a s v u l l i s e n + k a s v u l o g i i k k a a n + k a s v u l u k u + k a s v u l u k u i h i n + k a s v u l u k u i n a + k a s v u l u k u j a + k a s v u l u k u j a a n + k a s v u l u k u j e n + k a s v u l u k u j e n s a + k a s v u l u v u i s s a + k a s v u l u v u i s t a + k a s v u l u v u n + k a s v u l u v u s t a + k a s v u l u v u t + k a s v u l ä h t e i k s i + k a s v u l ä h t e i l l ä + k a s v u l ä h t e i s i i n + k a s v u l ä h t ö i s e m p ä ä + k a s v u l ä h t ö i s e n + k a s v u m a h d o l l i s u u d e t + k a s v u m a h d o l l i s u u k s i a + k a s v u m a h d o l l i s u u k s i a m m e + k a s v u m a h d o l l i s u u k s i e m m e + k a s v u m a h d o l l i s u u k s i e n + k a s v u m a h d o l l i s u u k s i i m m e + k a s v u m a h d o l l i s u u k s i i n + k a s v u m a h d o l l i s u u k s i k s i + k a s v u m a h d o l l i s u u k s i s t a + k a s v u m a h d o l l i s u u s + k a s v u m a h d o l l i s u u t e n s a + k a s v u m a l l e i h i n + k a s v u m a l l e i s t a + k a s v u m a l l i + k a s v u m a l l i a + k a s v u m a l l i e n + k a s v u m a l l i i n + k a s v u m a l l i l l a + k a s v u m a l l i m m e + k a s v u m a l l i n + k a s v u m a l l i n a + k a s v u m a l l i s t a + k a s v u m e r k k e j ä + k a s v u m o o t t o r i + k a s v u m u o t o j a + k a s v u n + k a s v u n a + k a s v u n e d i s t ä j i e n + k a s v u n e d i s t ä j i i n + k a s v u n e d i s t ä j i n ä + k a s v u n e d i s t ä j ä t + k a s v u n e d i s t ä j ä ä + k a s v u n l ä h d e + k a s v u n o p e u d e n + k a s v u n o p e u s + k a s v u n r a j o i t e g e e n i + k a s v u n ä k y m i e n + k a s v u n ä k y m i i m m e + k a s v u n ä k y m i i n + k a s v u n ä k y m i s t ä + k a s v u n ä k y m i ä + k a s v u n ä k y m ä m m e + k a s v u n ä k y m ä n + k a s v u n ä k y m ä t + k a s v u o b l i g a a t i o + k a s v u o d o t u k s e t + k a s v u o h j e l m a a + k a s v u o h j e l m a a m m e + k a s v u o h j e l m a n s a + k a s v u o h j e l m i e n + k a s v u o h j e l m i s t a + k a s v u o l e t u k s i a + k a s v u o l e t u k s i i n + k a s v u o l o s u h t e i s t a + k a s v u p a i k k a + k a s v u p a i n o t t e i n e n + k a s v u p a k e t i n + k a s v u p a k e t i s t a + k a s v u p a k e t t i + k a s v u p a k e t t i a + k a s v u p a k o s t a + k a s v u p e r u s t a n + k a s v u p i s t e t t ä + k a s v u p o h j a a + k a s v u p o h j a n + k a s v u p o l i t i i k a k s i + k a s v u p o l i t i i k a l l a + k a s v u p o l i t i i k a l l e + k a s v u p o l i t i i k a l l e m m e + k a s v u p o l i t i i k a n + k a s v u p o l i t i i k a s t a + k a s v u p o l i t i i k k a + k a s v u p o l i t i i k k a a + k a s v u p o l i t i i k k a a n + k a s v u p o l i t i i k k a m m e + k a s v u p o l i t i i k k o j a + k a s v u p o t e n t i a a l i + k a s v u p o t e n t i a a l i a + k a s v u p o t e n t i a a l i a a n + k a s v u p o t e n t i a a l i a m m e + k a s v u p o t e n t i a a l i i n + k a s v u p o t e n t i a a l i m m e + k a s v u p o t e n t i a a l i n + k a s v u p o t e n t i a a l i n s a + k a s v u p o t e n t i a a l i s t a + k a s v u p r o s e n t i n + k a s v u p r o s e n t i s t a + k a s v u p r o s e n t t e j a + k a s v u p r o s e n t t i + k a s v u p r o s e s s e j a + k a s v u p r o s e s s i + k a s v u p r o s e s s i a + k a s v u p r o s e s s i l l e + k a s v u p r o s e s s i n + k a s v u p r o s e s s i s s a + k a s v u p r o s e s s i s t a + k a s v u p y r ä h d y k s i ä + k a s v u p y r ä h d y s + k a s v u p ä ä m ä ä r ä + k a s v u r a h a s t o + k a s v u r a t k a i s u t + k a s v u r e s u r s s i t + k a s v u s e l v i t y k s e e n + k a s v u s e l v i t y k s e l l ä + k a s v u s e l v i t y k s e n + k a s v u s e l v i t y k s e n s ä + k a s v u s e l v i t y k s e s s ä + k a s v u s e l v i t y k s e s t ä + k a s v u s e l v i t y k s i l l ä + k a s v u s e l v i t y s + k a s v u s e l v i t y s t ä + k a s v u s o l u u n + k a s v u s o p i m u k s e e n + k a s v u s o p i m u k s e k s i + k a s v u s o p i m u k s e l l a + k a s v u s o p i m u k s e l l e + k a s v u s o p i m u k s e n + k a s v u s o p i m u k s e n a + k a s v u s o p i m u k s e s s a + k a s v u s o p i m u k s e s t a + k a s v u s o p i m u k s e t + k a s v u s o p i m u k s i a + k a s v u s o p i m u k s i s s a + k a s v u s o p i m u s + k a s v u s o p i m u s t a + k a s v u s o p i m u s t e n + k a s v u s s a + k a s v u s s a a n + k a s v u s t a + k a s v u s t r a t e g i a + k a s v u s t r a t e g i a a + k a s v u s t r a t e g i a a n + k a s v u s t r a t e g i a l l a + k a s v u s t r a t e g i a m m e + k a s v u s t r a t e g i a n + k a s v u s t r a t e g i a n s a + k a s v u s t r a t e g i a s s a + k a s v u s t r a t e g i a s t a + k a s v u s t r a t e g i o i d e n + k a s v u s t r a t e g i o i d e n s a + k a s v u s t r a t e g i o i h i n + k a s v u s t r a t e g i o i t a + k a s v u s u u n n i t e l m a n + k a s v u s u u n n i t e l m a s s a + k a s v u s u u n n i t e l m i e n + k a s v u s u u n n i t e l m i k s i + k a s v u s u u n t a u k s e n + k a s v u s u u n t a u k s i a + k a s v u s u u n t a u k s i i n + k a s v u s u u n t a u s + k a s v u s y k l i i n + k a s v u t a r p e i s i i n + k a s v u t a r p e i t a + k a s v u t a s o + k a s v u t a s o a + k a s v u t a s o n + k a s v u t a s o t + k a s v u t a v o i t e + k a s v u t a v o i t t e e m m e + k a s v u t a v o i t t e e t + k a s v u t a v o i t t e i d e n + k a s v u t a v o i t t e i s i i n + k a s v u t a v o i t t e i t a + k a s v u t e k i j ä + k a s v u t e k i j ä n + k a s v u t e k i j ä n ä + k a s v u t e k i j ä t + k a s v u t e k i j ö i s t ä + k a s v u t e k i j ö i t ä + k a s v u t o i m e n p i t e i s t ä + k a s v u t o i m e n p i t e i t ä + k a s v u u n + k a s v u v a i h e + k a s v u v a i h e i s s a + k a s v u v a i h e t t a + k a s v u v a i k e u k s i e n + k a s v u v a i k u t u k s e n + k a s v u v a i k u t u k s e t + k a s v u v a j e + k a s v u v a u h d i l l a + k a s v u v a u h d i n + k a s v u v a u h d i s s a + k a s v u v a u h d i t + k a s v u v a u h t i + k a s v u v a u h t i a + k a s v u v a u h t i i n + k a s v u v a u h t i m m e + k a s v u v a u h t i n s a + k a s v u v o i m a i s i m m a k s i + k a s v u v o i m a n + k a s v u v o i m a t + k a s v u v u o s i e n + k a s v u v ä l i n e + k a s v u v ä l i n e e n ä + k a s v u y m p ä r i s t ö n + k a s v u y r i t y s t e n + k a t a j a m i t t a r i + k a t a j a n m a r j o i s t a + k a t a j a p i k k u m i t t a r i + k a t a j a r a s t a s + k a t a k o m b i k u l t t u u r i + k a t a l a a n i a + k a t a l a a n i e d u s t a j a a + k a t a l a a n i k s i + k a t a l a a n i l l a + k a t a l a a n i n + k a t a l a a n i n k i e l i n e n + k a t a l a a n i n k i e l i s e n + k a t a l a a n i n k i e l i s e n ä + k a t a l a a n i n k i e l i s i n + k a t a l a a n i n k i e l i s i ä + k a t a l i m m i s t a + k a t a l i m p i a + k a t a l o n i a l a i s e n a + k a t a l o n i a l a i s e t + k a t a l o n i a l a i s i a + k a t a l o n i a n + k a t a l o n i a n p a i m e n k o i r a + k a t a l y s a a t t o r e i l l a + k a t a l y s a a t t o r e i l l e + k a t a l y s a a t t o r e i n a + k a t a l y s a a t t o r e i s t a + k a t a l y s a a t t o r e i t a + k a t a l y s a a t t o r i a + k a t a l y s a a t t o r i e n + k a t a l y s a a t t o r i j ä r j e s t e l m i i n + k a t a l y s a a t t o r i j ä r j e s t e l m i ä + k a t a l y s a a t t o r i l a i t t e i d e n + k a t a l y s a a t t o r i l l a + k a t a l y s a a t t o r i n a + k a t a l y s a a t t o r i r o o l i l l a + k a t a l y s a a t t o r i s t a + k a t a l y s a a t t o r i t + k a t a l y s a a t t o r i t e k n i i k a n + k a t a l y s a a t t o r i t e k n i i k k a + k a t a l y s a a t t o r i t e o l l i s u u d e s s a + k a t a l y s a a t t o r i v a i k u t u k s e n + k a t a l y s a a t t o r i v a l m i s t a j a t + k a t a m a r a a n i a l u k s i l t a + k a t a m a r a a n i l a u t o i s s a + k a t a r s i s v a i k u t u s + k a t a s t r o f a a l i s e m m a n + k a t a s t r o f a a l i s e n + k a t a s t r o f a a l i s e t + k a t a s t r o f a a l i s i a + k a t a s t r o f a a l i s i m m i s t a + k a t a s t r o f a a l i s t a + k a t a s t r o f e i h i n + k a t a s t r o f e i l t a + k a t a s t r o f e i s s a + k a t a s t r o f e i s t a + k a t a s t r o f e j a + k a t a s t r o f i a + k a t a s t r o f i a l t t i u s + k a t a s t r o f i a l u e + k a t a s t r o f i a l u e e k s i + k a t a s t r o f i a l u e e l l a + k a t a s t r o f i a l u e e l l e + k a t a s t r o f i a l u e e n + k a t a s t r o f i a l u e e t + k a t a s t r o f i a l u e i d e n + k a t a s t r o f i a l u e i k s i + k a t a s t r o f i a l u e i l l a + k a t a s t r o f i a l u e i l l e + k a t a s t r o f i a l u e i t a + k a t a s t r o f i a l u e t t a + k a t a s t r o f i a p u + k a t a s t r o f i a p u a + k a t a s t r o f i a p u m e k a n i s m i a + k a t a s t r o f i a p u r a h a s t o + k a t a s t r o f i a p u r a h a s t o n + k a t a s t r o f i a p u u n + k a t a s t r o f i a v u l l a + k a t a s t r o f i a v u n + k a t a s t r o f i a v u s t a + k a t a s t r o f i e l o k u v a + k a t a s t r o f i e l o k u v a n + k a t a s t r o f i e l o k u v i a + k a t a s t r o f i e l o k u v i s t a + k a t a s t r o f i e n + k a t a s t r o f i h a l l i n t a p o l i t i i k k a + k a t a s t r o f i h e r k i m m i l l ä + k a t a s t r o f i i n + k a t a s t r o f i k s i + k a t a s t r o f i k y t ä t + k a t a s t r o f i l t a + k a t a s t r o f i n + k a t a s t r o f i n e h k ä i s y ä + k a t a s t r o f i n h a l l i n t a a n + k a t a s t r o f i n h a l l i n t a r e s u r s s e j a + k a t a s t r o f i n h a l l i n t a r y h m ä t + k a t a s t r o f i n t i l a n t e e n + k a t a s t r o f i n t o r j u n t a a + k a t a s t r o f i n t o r j u n t a v a l m i u k s i a + k a t a s t r o f i o h j e l m a n + k a t a s t r o f i o h j e l m i a + k a t a s t r o f i p ä i v ä n ä + k a t a s t r o f i r a h a s t o + k a t a s t r o f i r a h a s t o a + k a t a s t r o f i r a h a s t o n + k a t a s t r o f i r a h a s t o s s a + k a t a s t r o f i r a h a s t o s t a + k a t a s t r o f i r a h o i t u s + k a t a s t r o f i r i s k i n + k a t a s t r o f i r i s k i ä + k a t a s t r o f i s k e n a a r i o i h i n + k a t a s t r o f i s s a + k a t a s t r o f i s t a + k a t a s t r o f i s t r a t e g i a a n s a + k a t a s t r o f i s u o j a o h j e l m a n + k a t a s t r o f i s u u n n i t e l m a n + k a t a s t r o f i s u u n n i t e l m i e n + k a t a s t r o f i t + k a t a s t r o f i t a p a h t u m i s t a + k a t a s t r o f i t a p a u k s i s s a + k a t a s t r o f i t e o r i a + k a t a s t r o f i t i l a n n e + k a t a s t r o f i t i l a n n e v a l m i u t t a + k a t a s t r o f i t i l a n t e e n + k a t a s t r o f i t i l a n t e e s e e n + k a t a s t r o f i t i l a n t e e s s a + k a t a s t r o f i t i l a n t e e t + k a t a s t r o f i t i l a n t e i s i i n + k a t a s t r o f i t i l a n t e i s s a + k a t a s t r o f i t i l a n t e i t a + k a t a s t r o f i t o i m i e n + k a t a s t r o f i t o i m i n n a n + k a t a s t r o f i t u e n + k a t a s t r o f i t u k e a + k a t a s t r o f i t u r i s m i s t a + k a t a s t r o f i t y y p p e i h i n + k a t a s t r o f i v a a r a a + k a t a s t r o f i v a l m i u d e n + k a t a s t r o f i v a l m i u d e s t a + k a t a s t r o f i v a l m i u d e t + k a t a s t r o f i v a l m i u k s i a + k a t a s t r o f i v a l m i u k s i e n + k a t a s t r o f i v a l m i u k s i l l e + k a t a s t r o f i v a l m i u s + k a t a s t r o f i v a l m i u s j o u k o t + k a t a s t r o f i v a l m i u s j ä r j e s t e l m ä n + k a t a s t r o f i v a l m i u s m e n e t t e l y j e n + k a t a s t r o f i v a l m i u t e e n + k a t a s t r o f i v a l m i u t t a + k a t a s t r o f i y k s i k ö i l l e + k a t a s t r o f i y k s i k ö t + k a t e d r a a l i e n + k a t e d r a a l i k o u l u + k a t e e d e r i s o s i a l i s m i a + k a t e e d e r i s o s i a l i s m i s t a + k a t e g o r i a a + k a t e g o r i a s s a + k a t e g o r i a t + k a t e g o r i a t e o r i a + k a t e g o r i a v i r h e + k a t e g o r i o i h i n + k a t e k a l v o + k a t e m u s t e s i e n i + k a t e t a a n + k a t e t t a v a + k a t e t u o t t o l a s k e n t a + k a t e v a r a u s + k a t e v i l j e l y + k a t i f o r i s i n + k a t i f o r i s k i n + k a t i n + k a t i n j u u s t o m a l v a + k a t i n l i e k o + k a t i t + k a t k a i s e m i s e k s i + k a t k a i s i + k a t k a i s i n t a + k a t k a i s t a v a + k a t k a i s u k r i t e e r e j ä + k a t k a r a p u a + k a t k a r a p u a l a a n + k a t k a r a p u j a + k a t k a r a p u k a l a + k a t k a r a p u k r i i s i s t ä + k a t k a r a p u s a a l i i d e n + k a t k a r a v u i l l e + k a t k a r a v u n + k a t k a r a v u n p y y n t i a l u k s i l l a + k a t k a r a v u n t u o t a n t o + k a t k e a m i s e s t a + k a t k e a m i s p i s t e e s e e n + k a t k e a m i s p i s t e e s s ä + k a t k e r a a + k a t k e r a m p i a + k a t k e r a n + k a t k e r a n s u l o i n e n + k a t k e r i a + k a t k e r i m m i s t a + k a t k e r i m p a a n + k a t k e r i n t a + k a t k e r u u t t a + k a t k o k s e e n + k a t k o k s i s s a + k a t k o k ä v e l y + k a t k o s k i r j o + k a t o a a + k a t o a i s i v a t + k a t o a m a a n + k a t o a m a s s a + k a t o a m i s e t + k a t o a m i s i a + k a t o a m i s t a p a u k s e s t a + k a t o a m i s t a p a u k s e t + k a t o a m i s t a p a u s t a + k a t o a m i s t a p a u s t e n + k a t o a v a t + k a t o d i s ä d e + k a t o d i s ä d e p u t k i s s a + k a t o i l t a + k a t o l i l a i s i a + k a t o l i s e s s a + k a t o l i s e s t a + k a t o l i s e t + k a t o l i s i s t a + k a t o l i s t e n + k a t o l i s u u t t a + k a t o s i + k a t o s i v a t + k a t o s t a + k a t o v u o s i a + k a t o v u o s i e n + k a t s a n t o k a n t o j a + k a t s a s t a m i s e e n + k a t s a s t a m i s l a i t o k s i a + k a t s a s t e t t a v a + k a t s a s t u s j ä r j e s t e l m ä n + k a t s a s t u s j ä r j e s t e l m ä ä n + k a t s a u k s e n + k a t s a u k s e n i + k a t s a u k s e s s a n i + k a t s a u k s e t + k a t s a u s t a + k a t s e e m m e + k a t s e e n + k a t s e e n i + k a t s e e n s a + k a t s e e t + k a t s e k o n t a k t i + k a t s e l i s i + k a t s e l l a + k a t s e l l e e t + k a t s e l l e s s a + k a t s e l l e s s a n i + k a t s e l u a i k a + k a t s e l u k o r t e i s t a + k a t s e l u k o r t t i + k a t s e l u k u l m a n + k a t s e l u t o t t u m u k s i a + k a t s o a + k a t s o e s s a + k a t s o e s s a a n + k a t s o e s s a m m e + k a t s o e s s a n i + k a t s o i + k a t s o i m m e + k a t s o i n + k a t s o i t t e + k a t s o i v a t + k a t s o j a l u v u n + k a t s o j a l u v u t + k a t s o j a s t a + k a t s o k a a + k a t s o k a a h a n + k a t s o k a a m m e + k a t s o m a a n + k a t s o m a l l a a n + k a t s o m a m m e + k a t s o m a n s a + k a t s o m i a a n + k a t s o m i a n i + k a t s o m i a n n e + k a t s o m i e m m e + k a t s o m i i n s a + k a t s o m m e + k a t s o m m e k i n + k a t s o m m e k o + k a t s o m o p a l o + k a t s o n + k a t s o n e e t + k a t s o n k i n + k a t s o n u t + k a t s o o + k a t s o o k i n + k a t s o o k o + k a t s o t a a n + k a t s o t a a n k o + k a t s o t a a n p a + k a t s o t a a n p a s + k a t s o t t a e s s a + k a t s o t t a i s i i n + k a t s o t t a v a + k a t s o t t a v a t + k a t s o t t e k o + k a t s o t t i i n + k a t s o t t u n a + k a t s o t u i m m i s t a + k a t s o t u s s a + k a t s o v a t + k a t t a a + k a t t a a k s e e n + k a t t a i s i + k a t t a m a + k a t t a m a a n + k a t t a m a l l a + k a t t a m a n + k a t t a m a s t a + k a t t a m a t t a + k a t t a m i s e e n + k a t t a m i s e k s i + k a t t a m i s j ä r j e s t e l m ä ä + k a t t a n u t + k a t t a v a a + k a t t a v a a n + k a t t a v a l l a + k a t t a v a m m a k s i + k a t t a v a m m a l l a + k a t t a v a m m a l l e + k a t t a v a m m a n + k a t t a v a m m a s t a + k a t t a v a m m a t + k a t t a v a m m i n + k a t t a v a m p a a + k a t t a v a m p a a n + k a t t a v a m p i + k a t t a v a m p i a + k a t t a v a m p i i n + k a t t a v a n + k a t t a v a s s a + k a t t a v a s t a + k a t t a v a t + k a t t a v a t k o + k a t t a v i a + k a t t a v i e n + k a t t a v i i n + k a t t a v i l l a + k a t t a v i m m a n + k a t t a v i m m a t + k a t t a v i m m i s t a + k a t t a v i m p i a + k a t t a v i n + k a t t a v i s t a + k a t t a v u u s a l u e e l l a + k a t t a v u u s e t u j a + k a t t e e t o n t a + k a t t e e t t o m a l t a + k a t t e i t a + k a t t e i t a a n + k a t t o f u n k t i o + k a t t o h a i k a r a + k a t t o i k k u n a + k a t t o j e n + k a t t o j ä r j e s t e l m ä + k a t t o j ä r j e s t ö + k a t t o j ä r j e s t ö j e n + k a t t o j ä r j e s t ö j ä + k a t t o j ä r j e s t ö n + k a t t o j ä r j e s t ö n ä + k a t t o j ä r j e s t ö t + k a t t o m e h i t ä h t i + k a t t o n a + k a t t o r a j a n + k a t t o r a k e n n e + k a t t o r a k e n t e e s e e n + k a t t o r i s t i k k o + k a t t o t i i l e t + k a t t o v a i k u t u s + k a t t o v i r a s t o o n + k a t u a + k a t u e s i i n t y j ä + k a t u h a i t + k a t u h a u k k a + k a t u j a l k a p a l l o + k a t u j a m m e + k a t u j u n a + k a t u k a r t t a + k a t u k a u p p i a a t + k a t u k e r j ä l ä i s t e n + k a t u k i e k k o + k a t u k i l p i e n + k a t u k y l t i t + k a t u l a m p u i s t a + k a t u l a p s e t + k a t u l a p s i + k a t u l a p s i a + k a t u l a p s i e n + k a t u l a p s i i n + k a t u l a p s i k s i + k a t u l a p s i l l e + k a t u l a p s i o h j e l m a + k a t u l a p s i s t a + k a t u l a s t e n + k a t u l e h d e t + k a t u l e v o t t o m u u k s i s s a + k a t u l i i k e n n e t t ä + k a t u m a a n + k a t u m a a s t u r i + k a t u m a r k k i n a t + k a t u m i e l e n o s o i t t a j a s t a + k a t u m i e l e n o s o i t u k s e t + k a t u m i e l e n o s o i t u k s i a + k a t u m i e l e n o s o i t u k s i s s a + k a t u m i e l e n o s o i t u s t e n + k a t u m u s p i l l e r e i t ä + k a t u m u s p i l l e r i + k a t u m u s p i l l e r i i n + k a t u m u s p i l l e r i s t ä + k a t u m u s p i l l e r i ä + k a t u o j a s s a + k a t u p a r l a m e n t t i + k a t u p r o s t i t u u t i o t a + k a t u p r o t e s t i t + k a t u r a t a + k a t u r i k o l l i s e t + k a t u r i k o l l i s u u t t a + k a t u t a i d e + k a t u t a i s t e l u i s s a + k a t u t a p a h t u m a + k a t u t a p p e l u i s t a + k a t u t a p p e l u s t a + k a t u t a s o l l a + k a t u t y ö h ö n + k a t u v a l a i s t u k s e e n + k a t u v a l a i s t u k s e n + k a t u v a l a i s t u s + k a t u v a l a i s t u s r a t k a i s u j a + k a t u v a l a i s t u s t a + k a t u v a l o + k a t u v a l o j a + k a t u v a l o j e n + k a t u v a l o t + k a t u v ä k i v a l l a k s i + k a t u v ä k i v a l l a n + k a t u v ä k i v a l t a + k a u a a k a a n + k a u a n h a n + k a u a n k a a n + k a u a n k o + k a u a s k a n t o i s e e n + k a u a s k a n t o i s e l l a + k a u a s k a n t o i s e l l e + k a u a s k a n t o i s e l t a + k a u a s k a n t o i s e m m a l l a + k a u a s k a n t o i s e m m a l l e + k a u a s k a n t o i s e m m a n + k a u a s k a n t o i s e m m a t + k a u a s k a n t o i s e m m i s t a + k a u a s k a n t o i s e m p a a + k a u a s k a n t o i s e m p i + k a u a s k a n t o i s e m p i a + k a u a s k a n t o i s e n + k a u a s k a n t o i s e n a + k a u a s k a n t o i s e s s a + k a u a s k a n t o i s e s t a + k a u a s k a n t o i s e s t i + k a u a s k a n t o i s e t + k a u a s k a n t o i s i a + k a u a s k a n t o i s i i n + k a u a s k a n t o i s i k s i + k a u a s k a n t o i s i l l e + k a u a s k a n t o i s i m m a s t a + k a u a s k a n t o i s i m m a t + k a u a s k a n t o i s i m m i s t a + k a u a s k a n t o i s i n + k a u a s k a n t o i s i n a + k a u a s k a n t o i s i n t a + k a u a s k a n t o i s i s s a + k a u a s k a n t o i s i s t a + k a u a s k a n t o i s t a + k a u a s k a n t o i s t e n + k a u d e k s i + k a u d e l l a + k a u d e l l a a n + k a u d e l l e + k a u d e l t a + k a u d e n + k a u e m p a n a k i n + k a u e m p i a + k a u h a k u o r m a i n + k a u h e a a + k a u h e a m m i k s i + k a u h e a m p a a + k a u h e a m p i a + k a u h e a n + k a u h e a s t a + k a u h e i m m a n + k a u h e i m m i s t a + k a u h e i m p a a n + k a u h e i m p i a + k a u h e i n t a + k a u h e i s t a + k a u h e i t a + k a u h e u k s i s t a + k a u h i s t e l e v a t + k a u h i s t u i n + k a u h i s t u t t a a + k a u h i s t u t t a v a a + k a u h i s t u t t a v a l l a + k a u h i s t u t t a v a l l e + k a u h i s t u t t a v a m m a t + k a u h i s t u t t a v a n + k a u h i s t u t t a v a n a + k a u h i s t u t t a v a s t a + k a u h i s t u t t a v a s t i + k a u h i s t u t t a v a t + k a u h i s t u t t a v i a + k a u h i s t u t t a v i e n + k a u h i s t u t t a v i i n + k a u h i s t u t t a v i m m i s t a + k a u h i s t u t t a v i m p i a + k a u h i s t u t t a v i m p i e n + k a u h i s t u t t a v i m p i i n + k a u h i s t u t t a v i n + k a u h i s t u t t a v i s s a + k a u h i s t u t t a v i s t a + k a u h u a + k a u h u e l o k u v a + k a u h u e l o k u v i s t a + k a u h u e s i m e r k k i n ä + k a u h u f i l m i n + k a u h u i s s a a n + k a u h u i s t a + k a u h u j u t t u + k a u h u j u t t u j a + k a u h u k a u p p a + k a u h u k e i t t i ö + k a u h u k e r t o m u k s e s s a + k a u h u k e r t o m u k s e t + k a u h u k e r t o m u k s i i n + k a u h u k e r t o m u s t a + k a u h u k i r j a l l i s u u s + k a u h u k o m e d i a + k a u h u k s e n i + k a u h u k u v a + k a u h u k u v a n + k a u h u k u v a t + k a u h u k u v i a + k a u h u k u v i i n + k a u h u m a a + k a u h u n e l o s e t + k a u h u n k i e r r e + k a u h u n t a s a p a i n o a + k a u h u n t u n t e i d e n + k a u h u n ä y t e l m ä + k a u h u s k e n a a r i o + k a u h u s k e n a a r i o i n e e n + k a u h u s k e n a a r i o i s t a + k a u h u s k e n a a r i o i t a + k a u h u s k e n a a r i o l t a + k a u h u s t a + k a u h u t a l v e a + k a u h u t a r i n a + k a u h u t a r i n a a + k a u h u t a r i n a t + k a u h u t a r i n o i d e n + k a u h u t a r i n o i h i n + k a u h u t a r i n o i l l a + k a u h u t a r i n o i l t a + k a u h u t a r i n o i s s a + k a u h u t a r i n o i s t a + k a u h u t a r i n o i t a + k a u h u t i l a s t o i s s a + k a u k a i s e e n + k a u k a i s e k s i + k a u k a i s e l t a + k a u k a i s e m m a l l a + k a u k a i s e m m a l t a + k a u k a i s e m m a n k i n + k a u k a i s e m m a s s a + k a u k a i s e m m a t + k a u k a i s e m m i l l e + k a u k a i s e m m i s s a + k a u k a i s e m p a a + k a u k a i s e m p a a n + k a u k a i s e m p i + k a u k a i s e m p i a + k a u k a i s e m p i e n + k a u k a i s e m p i e n k i n + k a u k a i s e m p i i n k i n + k a u k a i s e s s a + k a u k a i s e s t a + k a u k a i s e t + k a u k a i s i l l e + k a u k a i s i l t a + k a u k a i s i m m a t + k a u k a i s i m p a a n + k a u k a i s i n a + k a u k a i s i s s a + k a u k a i s i s t a + k a u k a i s t a + k a u k a i s t e n + k a u k a l o p a l l o + k a u k a l o p i k a l u i s t e l u + k a u k a l o p i k a l u i s t e l u n + k a u k a s i a l a i s e t + k a u k a s i a n t e e r i + k a u k o h a v a i n n o i n n i n + k a u k o h e n k i l ö l i i k e n t e e l l e + k a u k o i d ä n + k a u k o i d ä s s ä + k a u k o i d ä s t ä + k a u k o i t ä + k a u k o i t ä ä + k a u k o i t ä ä n + k a u k o j u n i i n + k a u k o j ä ä h d y t y s + k a u k o j ä ä h d y t y s t ä + k a u k o k a l a s t u s a l u s t a + k a u k o k a r t o i t u k s e l l a + k a u k o k a r t o i t u k s e l l e + k a u k o k a r t o i t u k s e n + k a u k o k a r t o i t u k s e s t a + k a u k o k a r t o i t u s + k a u k o k a r t o i t u s e l i i t i n + k a u k o k a r t o i t u s m e n e t e l m i e n + k a u k o k a r t o i t u s s a t e l l i i t t i + k a u k o k a r t o i t u s s o v e l l u k s e t + k a u k o k a r t o i t u s s o v e l l u s t e n + k a u k o k a r t o i t u s t a + k a u k o k a r t o i t u s t e k n i i k a n + k a u k o k a r t o i t u s t e k n i i k a t + k a u k o k a r t o i t u s t e k n i i k k a + k a u k o k a r t o i t u s t e k n i i k o i t a + k a u k o k a t s e i n e n + k a u k o k a t s e i s e l l a + k a u k o k a t s e i s e m m a k s i + k a u k o k a t s e i s e m p a a + k a u k o k a t s e i s e m p i + k a u k o k a t s e i s e n a + k a u k o k a t s e i s e s t i + k a u k o k a t s e i s e t + k a u k o k a t s e i s i a + k a u k o k a t s e i s i m m i s t a + k a u k o k a t s e i s u u d e s s a + k a u k o k a t s e i s u u t t a + k a u k o k u l k e u t u m i s t a + k a u k o l i i k e n n e + k a u k o l i i k e n n e t t ä + k a u k o l i i k e n t e e n + k a u k o l i i k e n t e e s e e n + k a u k o l i i k e n t e e s s ä + k a u k o l u o t a i m i l l a + k a u k o l ä m m i t y k s e e n + k a u k o l ä m m i t y k s e n + k a u k o l ä m m i t y s + k a u k o l ä m m i t y s k o h t e e t + k a u k o l ä m m i t y s t ä + k a u k o l ä m m ö l l e + k a u k o l ä m m ö n + k a u k o l ä m p ö + k a u k o l ä m p ö i n v e s t o i n t e j a + k a u k o l ä m p ö j ä r j e s t e l m i ä + k a u k o l ä m p ö l a i t o s t e n + k a u k o l ä m p ö v e r k k o i h i n + k a u k o l ä m p ö v e r k o t + k a u k o l ä m p ö ä + k a u k o l ä m p ö ö n + k a u k o l ä ä k e t i e d e t t ä + k a u k o n ä k ö i n e n + k a u k o n ä k ö i s e k s i + k a u k o n ä k ö i s e l l e + k a u k o n ä k ö i s e m m i n + k a u k o n ä k ö i s e m m ä n + k a u k o n ä k ö i s e m p i + k a u k o n ä k ö i s e m p i e n + k a u k o n ä k ö i s e m p i ä + k a u k o n ä k ö i s e m p ä ä + k a u k o n ä k ö i s e m p ä ä n + k a u k o n ä k ö i s e n + k a u k o n ä k ö i s e s t i + k a u k o n ä k ö i s e s t ä + k a u k o n ä k ö i s e t + k a u k o n ä k ö i s i n + k a u k o n ä k ö i s i s t ä + k a u k o n ä k ö i s i ä + k a u k o n ä k ö i s t e n + k a u k o n ä k ö i s t ä + k a u k o n ä k ö i s y y d e s t ä + k a u k o n ä k ö i s y y s + k a u k o n ä k ö i s y y t e e n + k a u k o n ä k ö i s y y t t ä + k a u k o p a l v e l u t + k a u k o p u h e l u + k a u k o p u h e l u i d e n + k a u k o p u h e l u i s s a + k a u k o p u h e l u i s t a + k a u k o p u h e l u i t a + k a u k o p u h e l u j a + k a u k o p u h e l u j e n + k a u k o p u h e l u m a k s u j e n + k a u k o p u h e l u t i e d o t u s + k a u k o p u t k i + k a u k o s e u r a n t a a n + k a u k o s ä ä d i n + k a u k o s ä ä t ö p e r i a a t t e e l l a + k a u k o t a v a r a l i i k e n n e + k a u k o v a i k u t u s + k a u k o v a l v o n t a j ä r j e s t e l m ä + k a u k o v a l v o n t a v i r a s t o + k a u k o v i e n t i ä + k a u k o y h t e y k s i ä + k a u l a k o r u s k a n d a a l i + k a u l a k y l k i l u u + k a u l a r a n k a + k a u l a s s a + k a u l u r i e r a k k o k o l i b r i + k a u l u r i l u r i + k a u l u r i s e p p ä + k a u l u s h a i + k a u l u s h a i k a r a + k a u l u s h e l t t a s i e p p o + k a u l u s k a r h u + k a u l u s k e i j u + k a u l u s k o t t a r a i n e n + k a u l u s l e g u a a n i + k a u l u s l i s k o + k a u l u s l u r i + k a u l u s m a a t ä h t i + k a u l u s m a n g a b i + k a u l u s p a i t a + k a u l u s p e k a r i + k a u l u s t u r p i a a l i + k a u l u s v a r p u s p ö l l ö + k a u l u s v ä l s k ä r i + k a u n a a + k a u n a n t u n t e e t + k a u n e i m m a n + k a u n e i m m a t + k a u n e i m m i s t a + k a u n e i m p i a + k a u n e i m p i e n + k a u n e i n + k a u n e u d e l l a + k a u n e u d e s t a + k a u n e u s k i l p a i l u + k a u n e u s k i l p a i l u a + k a u n e u s k i l p a i l u j a + k a u n e u s k i l p a i l u n + k a u n e u s k i l p a i l u n a + k a u n e u s k i l p a i l u s t a + k a u n e u s k i l p a i l u t + k a u n e u s k i r u r g i e n + k a u n e u s k ä s i t y s t ä + k a u n e u s l e i k k a u k s e e n + k a u n e u s l e i k k a u k s i a + k a u n e u s l e i k k a u s + k a u n e u s p a l k i n t o a + k a u n e u s p i l k k u + k a u n e u s p i l k k u j a + k a u n e u s v i r h e + k a u n e u s v i r h e e n + k a u n e u s v i r h e i s t ä + k a u n e u t e e n + k a u n i i d e n + k a u n i i k s i + k a u n i i l l a + k a u n i i l l e + k a u n i i m m a t + k a u n i i m p i + k a u n i i m p i a + k a u n i i n + k a u n i i n e + k a u n i i s i i n + k a u n i i s t a + k a u n i i t + k a u n i i t a + k a u n i s t a v a t + k a u n i s t e l e m a t t a + k a u n i s t e l e v a l l a + k a u n i s t e l e v a t + k a u n i s t e l l a + k a u n i s t e l l a k s e e n + k a u n i s t e l t i i n p a + k a u n i s t e l u a + k a u n i s t e l u u n + k a u n o a m a t s o n i + k a u n o j a l k a t a t t i + k a u n o k a i s e n i + k a u n o k i i t ä j ä i n e n + k a u n o k o t i n g a + k a u n o m e r i m e t s o + k a u n o p u h e i s e m m i n + k a u n o p u h e i s e s t i + k a u n o p u h e i s u u d e l l a a n + k a u n o p u h e i s u u t e e n + k a u n o p u h e i s u u t t a + k a u n o p u h e i s u u t t a n n e + k a u n o p u n a h a t t u + k a u n o r u o h o k a i j a + k a u n o s e k o y ö k k ö n e n + k a u n o s i r k k u + k a u n o t i i r a + k a u n o t r o g o n i + k a u n o v a r p u m i t t a r i + k a u n o v i i k u n a k a i j a + k a u p a l l e + k a u p a l l i s e e n + k a u p a l l i s e l l a + k a u p a l l i s e l t a + k a u p a l l i s e m p a a + k a u p a l l i s e m p i + k a u p a l l i s e n + k a u p a l l i s e n a + k a u p a l l i s e s s a + k a u p a l l i s e s t a + k a u p a l l i s e t + k a u p a l l i s i a + k a u p a l l i s i i n + k a u p a l l i s i l l e + k a u p a l l i s i l t a + k a u p a l l i s i n + k a u p a l l i s i s s a + k a u p a l l i s i s t a + k a u p a l l i s t a m i s e e n + k a u p a l l i s t e n + k a u p a l l i s t u m i n e n + k a u p a l l i s t u m i s p a i n e i d e n + k a u p a l l i s u u d e l l e + k a u p a n + k a u p a n a l a + k a u p a n e d i s t ä m i s e l i n t e n + k a u p a n e s t e i d e n + k a u p a n e s t e i t ä + k a u p a n h i e r o n t a a + k a u p a n k ä v i j ä k a n s a + k a u p a n k ä y n n i l l e + k a u p a n k ä y n n i n + k a u p a n k ä y n n i s s ä + k a u p a n k ä y n n i s t ä + k a u p a n k ä y n t i + k a u p a n k ä y n t i a l u e + k a u p a n k ä y n t i a l u e t t a + k a u p a n k ä y n t i a s e m a + k a u p a n k ä y n t i a s e m a a m m e + k a u p a n k ä y n t i i n + k a u p a n k ä y n t i j ä r j e s t e l m i e n + k a u p a n k ä y n t i j ä r j e s t e l m i i n + k a u p a n k ä y n t i j ä r j e s t e l m i ä + k a u p a n k ä y n t i j ä r j e s t e l m ä + k a u p a n k ä y n t i j ä r j e s t e l m ä m m e + k a u p a n k ä y n t i j ä r j e s t e l m ä ä + k a u p a n k ä y n t i j ä r j e s t e l y j e n + k a u p a n k ä y n t i j ä r j e s t e l y j ä + k a u p a n k ä y n t i k a p a s i t e e t t i a + k a u p a n k ä y n t i k a u d e l l a + k a u p a n k ä y n t i k a u d e l l e + k a u p a n k ä y n t i k e i n o j e n + k a u p a n k ä y n t i k e s k u s t e n + k a u p a n k ä y n t i k i e l t o + k a u p a n k ä y n t i k u l u i h i n + k a u p a n k ä y n t i k u m p p a n i n a + k a u p a n k ä y n t i k y k y + k a u p a n k ä y n t i l u p i a + k a u p a n k ä y n t i m a h d e i s t a + k a u p a n k ä y n t i m a h d o l l i s u u d e t + k a u p a n k ä y n t i m a h d o l l i s u u k s i a + k a u p a n k ä y n t i m a h d o l l i s u u k s i e n + k a u p a n k ä y n t i m a h d o l l i s u u k s i s t a + k a u p a n k ä y n t i m a l l e i h i n + k a u p a n k ä y n t i m a l l e j a + k a u p a n k ä y n t i m a l l i a + k a u p a n k ä y n t i m a l l i e n + k a u p a n k ä y n t i m a l l i n + k a u p a n k ä y n t i m e n e t t e l y j ä + k a u p a n k ä y n t i m u o t o a + k a u p a n k ä y n t i m u o t o j a + k a u p a n k ä y n t i n ä k ö k u l m a t + k a u p a n k ä y n t i o s a p u o l t e n + k a u p a n k ä y n t i o s a s t a + k a u p a n k ä y n t i p r o s e s s i n + k a u p a n k ä y n t i t a p o j a + k a u p a n k ä y n t i t a v a t + k a u p a n k ä y n t i t e m p p u j a + k a u p a n k ä y n t i t i l a i s u u t t a + k a u p a n k ä y n t i t i l a n t e e s t a + k a u p a n k ä y n t i t o i m i e n + k a u p a n k ä y n t i u s k o n n o s s a a n + k a u p a n k ä y n t i v a l m i u d e t + k a u p a n k ä y n t i v a l m i u k s i a + k a u p a n k ä y n t i v a l u u t t a + k a u p a n k ä y n t i v a r a s t o a + k a u p a n k ä y n t i v a r a s t o n s a + k a u p a n k ä y n t i v a r a s t o o n + k a u p a n k ä y n t i v a r a s t o s s a + k a u p a n k ä y n t i v e l v o i t e t t a + k a u p a n k ä y n t i v e r k k o i h i n + k a u p a n k ä y n t i v e r k o s t o j e n + k a u p a n k ä y n t i v e r k o s t o t + k a u p a n k ä y n t i y h t e i s ö + k a u p a n k ä y n t i y m p ä r i s t ö + k a u p a n k ä y n t i y m p ä r i s t ö n + k a u p a n k ä y n t i ä + k a u p a n p i t o r a k e n t e i d e n + k a u p a n p ä ä l l i s i k s i + k a u p a n s u o j a j ä r j e s t e l m ä ä m m e + k a u p a n s u o j a k e i n o j a + k a u p a n s u o j a k e i n o j a a n + k a u p a n s u o j a k e i n o n + k a u p a n s u o j e l u t o i m e n p i t e i t ä + k a u p a n t e k o a + k a u p a n t e k o v ä l i n e e n ä + k a u p a n t e o n + k a u p a n t e o s t a + k a u p a s s a + k a u p a s t a + k a u p a t + k a u p o i s s a + k a u p o i s t a + k a u p p a a k a a n + k a u p p a a n + k a u p p a a v a t + k a u p p a b l o k i l l e + k a u p p a b l o k i n + k a u p p a b l o k i t + k a u p p a b o i k o t i l l a a n + k a u p p a b o i k o t i t + k a u p p a b o i k o t t e j a + k a u p p a b o i k o t t i + k a u p p a d i p l o m a t i a l l a + k a u p p a e d e l l y t y s t e n + k a u p p a e d u i s t a + k a u p p a e d u i s t a m m e + k a u p p a e d u s t a j a + k a u p p a e d u t + k a u p p a e h d o i l l a + k a u p p a e h d o i s t a + k a u p p a e h d o t + k a u p p a e h d o t u k s e s t a + k a u p p a e h t o j a + k a u p p a e h t o j e n + k a u p p a e l i m i s s ä + k a u p p a e r i m i e l i s y y k s i i n + k a u p p a e r i m i e l i s y y k s i ä + k a u p p a e s t e e t + k a u p p a e s t e i d e n + k a u p p a e s t e i t ä + k a u p p a e t u a + k a u p p a e t u i s u u k s i e n + k a u p p a e t u i s u u s j ä r j e s t e l m i e n + k a u p p a e t u j a + k a u p p a e t u j e m m e + k a u p p a e t u j e n + k a u p p a e t u n n e + k a u p p a e t u u d e t + k a u p p a e t u u k s i a + k a u p p a e t u u k s i e n + k a u p p a e t u u k s i e n s a + k a u p p a e t u u k s i i n + k a u p p a e t u u s j ä r j e s t e l m i e n + k a u p p a e t u u s j ä r j e s t e l m ä + k a u p p a e t u u s j ä r j e s t e l m ä l l ä m m e + k a u p p a e t u u s k o h t e l u + k a u p p a e t u u s k o h t e l u s t a + k a u p p a e t u u s s o p i m u k s e k s i + k a u p p a e t u u s s o p i m u k s e s s a + k a u p p a e t u u s s o p i m u k s i s t a + k a u p p a e t u u s s o p i m u s t e n + k a u p p a e t u u s s ä ä n t ö j e n + k a u p p a f i l o s o f i a n + k a u p p a h a i t o i l l a + k a u p p a h a l l i + k a u p p a h a l l i n t o a + k a u p p a h a n k e + k a u p p a h i n n a n + k a u p p a h i n n a s t a + k a u p p a h i n n o i s t a + k a u p p a h i n t o i n a + k a u p p a h i n t o j e n + k a u p p a h u o n e + k a u p p a h u o n e i d e n + k a u p p a i n t r e s s e i s t ä + k a u p p a i n t r e s s e j ä + k a u p p a i n t r e s s i e n + k a u p p a j ä r j e s t e l m i e n + k a u p p a j ä r j e s t e l m i i n + k a u p p a j ä r j e s t e l m i ä + k a u p p a j ä r j e s t e l m ä + k a u p p a j ä r j e s t e l m ä l l e + k a u p p a j ä r j e s t e l m ä n + k a u p p a j ä r j e s t e l m ä n ä + k a u p p a j ä r j e s t e l m ä s s ä + k a u p p a j ä r j e s t e l m ä s t ä + k a u p p a j ä r j e s t e l m ä t + k a u p p a j ä r j e s t e l m ä ä + k a u p p a j ä r j e s t e l m ä ä n + k a u p p a j ä r j e s t e l y + k a u p p a j ä r j e s t e l y i d e n + k a u p p a j ä r j e s t e l y i h i n + k a u p p a j ä r j e s t e l y i s s ä + k a u p p a j ä r j e s t e l y i s t ä + k a u p p a j ä r j e s t e l y j e n + k a u p p a j ä r j e s t e l y j ä + k a u p p a j ä r j e s t e l y t + k a u p p a j ä r j e s t ö + k a u p p a j ä r j e s t ö j e n + k a u p p a j ä r j e s t ö j ä + k a u p p a j ä r j e s t ö k s i + k a u p p a j ä r j e s t ö l l e + k a u p p a j ä r j e s t ö l l ä + k a u p p a j ä r j e s t ö l t ä + k a u p p a j ä r j e s t ö n + k a u p p a j ä r j e s t ö s s ä + k a u p p a j ä r j e s t ö s t ä + k a u p p a j ä r j e s t ö ä + k a u p p a j ä r j e s t ö ö n + k a u p p a k a m a r e i l l e + k a u p p a k a m a r e i t a + k a u p p a k a m a r i + k a u p p a k a m a r i e n + k a u p p a k a m a r i i n + k a u p p a k a m a r i n + k a u p p a k a m a r i t + k a u p p a k a n a v i a + k a u p p a k a u d e k s i + k a u p p a k a u d e n + k a u p p a k e r t o m u k s e t + k a u p p a k e s k u k s e k s i + k a u p p a k e s k u k s e s s a + k a u p p a k e s k u k s i a + k a u p p a k e s k u k s i i n + k a u p p a k e s k u s + k a u p p a k e s k u s t e l u i s s a + k a u p p a k e t j u + k a u p p a k e t j u i h i n + k a u p p a k e t j u i l l a + k a u p p a k e t j u i s t a + k a u p p a k e t j u j e n + k a u p p a k e t j u n + k a u p p a k e t j u s s a + k a u p p a k e t j u t + k a u p p a k i e l i + k a u p p a k i e l l o n + k a u p p a k i e l l o s t a + k a u p p a k i e l t o + k a u p p a k i e l t o a + k a u p p a k i i n t i ö t + k a u p p a k i i s t a + k a u p p a k i i s t a a + k a u p p a k i i s t a l l e + k a u p p a k i i s t a n + k a u p p a k i i s t a t + k a u p p a k i i s t o i h i n + k a u p p a k i i s t o i s s a + k a u p p a k i i s t o i s t a + k a u p p a k i i s t o j a + k a u p p a k i i s t o j e n + k a u p p a k i l p a i l i j o i s t a + k a u p p a k i l p a i l u + k a u p p a k i l p a i l u a + k a u p p a k i l p a i l u s s a + k a u p p a k i r j a s t a + k a u p p a k o h d e + k a u p p a k o k o n a i s u u t t a + k a u p p a k o m i s s a a r i + k a u p p a k o m i s s a a r i n + k a u p p a k o m i s s a a r i n a + k a u p p a k o m i s s i o s s a + k a u p p a k o m i t e a + k a u p p a k o m i t e a n + k a u p p a k o m p p a n i a + k a u p p a k o n f l i k t i a + k a u p p a k o n f l i k t i s t a + k a u p p a k o r k e a k o u l u + k a u p p a k u i l u n + k a u p p a k u j a k s i + k a u p p a k u l t t u u r e i t a + k a u p p a k u m p p a n e i d e m m e + k a u p p a k u m p p a n e i d e n + k a u p p a k u m p p a n e i d e n s a + k a u p p a k u m p p a n e i h i m m e + k a u p p a k u m p p a n e i h i n + k a u p p a k u m p p a n e i l l a + k a u p p a k u m p p a n e i l l a a n + k a u p p a k u m p p a n e i l l a m m e + k a u p p a k u m p p a n e i l l e + k a u p p a k u m p p a n e i l l e e n + k a u p p a k u m p p a n e i l l e m m e + k a u p p a k u m p p a n e i l t a + k a u p p a k u m p p a n e i l t a a n + k a u p p a k u m p p a n e i n a + k a u p p a k u m p p a n e i s t a + k a u p p a k u m p p a n e i s t a m m e + k a u p p a k u m p p a n e i t a + k a u p p a k u m p p a n e i t a a n + k a u p p a k u m p p a n e i t a m m e + k a u p p a k u m p p a n e i t t e m m e + k a u p p a k u m p p a n e i t t e n s a + k a u p p a k u m p p a n e j a + k a u p p a k u m p p a n i + k a u p p a k u m p p a n i a + k a u p p a k u m p p a n i e m m e + k a u p p a k u m p p a n i e n + k a u p p a k u m p p a n i e n s a + k a u p p a k u m p p a n i i m m e + k a u p p a k u m p p a n i i n + k a u p p a k u m p p a n i k s i + k a u p p a k u m p p a n i l l e + k a u p p a k u m p p a n i l t a + k a u p p a k u m p p a n i m m e + k a u p p a k u m p p a n i n + k a u p p a k u m p p a n i n a + k a u p p a k u m p p a n i n s a + k a u p p a k u m p p a n i t + k a u p p a k u m p p a n u u d e l l e + k a u p p a k u m p p a n u u d e n + k a u p p a k u m p p a n u u k s i a + k a u p p a k u m p p a n u u k s i s t a + k a u p p a k u m p p a n u u s + k a u p p a k u m p p a n u u s s o p i m u k s i i n + k a u p p a k u m p p a n u u t t a + k a u p p a k u s t a n n u k s i s t a + k a u p p a k y s y m y k s e n + k a u p p a k y s y m y k s e t + k a u p p a k y s y m y k s i i n + k a u p p a k y s y m y k s i s s ä + k a u p p a k y s y m y k s i s t ä + k a u p p a k y s y m y k s i ä + k a u p p a k y s y m y k s i ä h ä n + k a u p p a k y s y m y s + k a u p p a k y s y m y s t e n + k a u p p a k y s y m y s t ä + k a u p p a k ä y t ä n n ö i s s ä + k a u p p a k ä y t ä n n ö i s t ä + k a u p p a k ä y t ä n n ö n + k a u p p a k ä y t ä n n ö t + k a u p p a k ä y t ä n t e i s s ä + k a u p p a k ä y t ä n t e i s t ä + k a u p p a k ä y t ä n t ö j e n + k a u p p a k ä y t ä n t ö j ä + k a u p p a l a i n + k a u p p a l a i n s ä ä d ä n n ö n + k a u p p a l a i n s ä ä d ä n n ö s t ä + k a u p p a l a i n s ä ä d ä n t ö + k a u p p a l a i n s ä ä d ä n t ö j ä + k a u p p a l a i v a l l a + k a u p p a l a i v a n r a k e n n u s + k a u p p a l a i v a r e i t t e j ä + k a u p p a l a i v a s t o + k a u p p a l a i v a s t o a + k a u p p a l a i v a s t o a a n + k a u p p a l a i v a s t o j e m m e + k a u p p a l a i v a s t o j e n + k a u p p a l a i v a s t o m m e + k a u p p a l a i v a s t o n + k a u p p a l a i v a s t o s s a + k a u p p a l a i v a s t o s t a + k a u p p a l a i v a s t o t + k a u p p a l a i v a s t o y h d i s t y k s e n + k a u p p a l a i v a t + k a u p p a l a i v o i l l a + k a u p p a l a i v o i s t a + k a u p p a l a i v o j e n + k a u p p a l a k e j a + k a u p p a l a k i a + k a u p p a l a k i i n + k a u p p a l e i k i n + k a u p p a l i i k e n t e e s s ä + k a u p p a l i i t o t + k a u p p a l i i t t o + k a u p p a l i i t t o a + k a u p p a l i i t t o n a + k a u p p a l i i t t o u t u m a l l a + k a u p p a l i i t t y m ä n + k a u p p a l u k u i h i n + k a u p p a l u o t o t + k a u p p a l u p i e n + k a u p p a l u v i s t a + k a u p p a l u v u i s t a + k a u p p a l u v u n + k a u p p a m a a i l m a a n + k a u p p a m a h d i l l e + k a u p p a m a h d i n + k a u p p a m a h d i t + k a u p p a m a h d o l l i s u u d e t + k a u p p a m a h d o l l i s u u k s i a + k a u p p a m a h d o l l i s u u k s i i n + k a u p p a m a h d o l l i s u u k s i s t a + k a u p p a m a h t e i h i n + k a u p p a m a h t i + k a u p p a m a h t i a + k a u p p a m a h t i a a n + k a u p p a m a h t i e n + k a u p p a m a h t i n a + k a u p p a m a i h i n + k a u p p a m a l l i e n + k a u p p a m a r k e t t i + k a u p p a m a r k k i n o i d e n + k a u p p a m a r k k i n o i l l a + k a u p p a m a t k a t + k a u p p a m a t k u s t a j a n + k a u p p a m e k a n i s m i + k a u p p a m e n e t t e l y j ä + k a u p p a m e r e n k u l k u + k a u p p a m e r e n k u l k u m m e + k a u p p a m e r e n k u l u n + k a u p p a m e r e n k u l u s t a + k a u p p a m i n i s t e r e i d e n + k a u p p a m i n i s t e r i + k a u p p a m i n i s t e r i e n + k a u p p a m i n i s t e r i n + k a u p p a m i n i s t e r i n ä + k a u p p a m i n i s t e r i t + k a u p p a m i n i s t e r i ö + k a u p p a m i n i s t e r i ö n + k a u p p a m m e + k a u p p a m o n o p o l e j a + k a u p p a m y ö n n y t y k s e n + k a u p p a m y ö n n y t y k s e t + k a u p p a m y ö n n y t y k s i s t ä + k a u p p a m y ö n n y t y k s i ä + k a u p p a m y ö n n y t y s t e n + k a u p p a m ä ä r ä s t ä + k a u p p a m ä ä r ä y k s i e n + k a u p p a m ä ä r ä y k s i ä + k a u p p a m ä ä r ä y s t e n + k a u p p a n e u v o s t o + k a u p p a n e u v o t t e l i j a n a + k a u p p a n e u v o t t e l i j o i t a + k a u p p a n e u v o t t e l u i d e n + k a u p p a n e u v o t t e l u i h i n + k a u p p a n e u v o t t e l u i l l e + k a u p p a n e u v o t t e l u i l l e m m e + k a u p p a n e u v o t t e l u i s s a + k a u p p a n e u v o t t e l u i s s a a n + k a u p p a n e u v o t t e l u i s t a + k a u p p a n e u v o t t e l u i t a + k a u p p a n e u v o t t e l u j a + k a u p p a n e u v o t t e l u j e n + k a u p p a n e u v o t t e l u k i e r r o k s e l l e + k a u p p a n e u v o t t e l u k i e r r o k s e n + k a u p p a n e u v o t t e l u k i e r r o k s i i n + k a u p p a n e u v o t t e l u k i e r r o k s i s t a + k a u p p a n e u v o t t e l u k i e r r o s + k a u p p a n e u v o t t e l u k i e r r o s t a + k a u p p a n e u v o t t e l u k o m i t e a a n + k a u p p a n e u v o t t e l u k o m i t e a n + k a u p p a n e u v o t t e l u m m e + k a u p p a n e u v o t t e l u t + k a u p p a n e u v o t t e l u v a l m i u k s i e n + k a u p p a n i m e n + k a u p p a n i m i + k a u p p a n i m i k k e i d e n + k a u p p a n i m i k k e i s t ä + k a u p p a n ä k ö k o h d a t + k a u p p a n ä k ö k o h t a + k a u p p a o h j e l m a s t a + k a u p p a o i k e u d e l l i s t e n + k a u p p a o i k e u d e n + k a u p p a o i k e u d e s t a + k a u p p a o i k e u s + k a u p p a o i k e u s p r o s e s s e i h i n + k a u p p a o i k e u t e e n + k a u p p a o i k e u t t a + k a u p p a o l o j e n + k a u p p a o n g e l m a + k a u p p a o s a p u o l e t + k a u p p a o s u u t t a m m e + k a u p p a p a i k a n + k a u p p a p a i k a t + k a u p p a p a i k k a + k a u p p a p a i k k a a + k a u p p a p a i k k o j a + k a u p p a p a i k k o j e n + k a u p p a p a i k o i l l e + k a u p p a p a k e t t i + k a u p p a p a k o t t e e t + k a u p p a p a k o t t e i d e n + k a u p p a p a k o t t e i l l a + k a u p p a p a k o t t e i s i i n + k a u p p a p a k o t t e i s t a + k a u p p a p a k o t t e i t a + k a u p p a p o l i i t t i n e n + k a u p p a p o l i i t t i s e e n + k a u p p a p o l i i t t i s e k s i + k a u p p a p o l i i t t i s e n + k a u p p a p o l i i t t i s e s s a + k a u p p a p o l i i t t i s e s t i + k a u p p a p o l i i t t i s e t + k a u p p a p o l i i t t i s i a + k a u p p a p o l i i t t i s i i n + k a u p p a p o l i i t t i s i s s a + k a u p p a p o l i i t t i s i s t a + k a u p p a p o l i i t t i s t a + k a u p p a p o l i i t t i s t e n + k a u p p a p o l i t i i k a l l a + k a u p p a p o l i t i i k a l l a m m e + k a u p p a p o l i t i i k a l l e + k a u p p a p o l i t i i k a l l e e n + k a u p p a p o l i t i i k a l t a + k a u p p a p o l i t i i k a n + k a u p p a p o l i t i i k a n k i n + k a u p p a p o l i t i i k a s s a + k a u p p a p o l i t i i k a s s a a n + k a u p p a p o l i t i i k a s s a m m e + k a u p p a p o l i t i i k a s t a + k a u p p a p o l i t i i k a s t a m m e + k a u p p a p o l i t i i k a t + k a u p p a p o l i t i i k k a + k a u p p a p o l i t i i k k a a + k a u p p a p o l i t i i k k a a m m e + k a u p p a p o l i t i i k k a a n + k a u p p a p o l i t i i k k a a n s a + k a u p p a p o l i t i i k k a m m e + k a u p p a p o l i t i i k k a n n e + k a u p p a p o l i t i i k k a n s a + k a u p p a p o l i t i i k k o i h i n + k a u p p a p o l i t i i k k o j a + k a u p p a p o l i t i i k k o j a m m e + k a u p p a p o l i t i i k o i s s a a n + k a u p p a p o t e n t i a a l i a + k a u p p a p r o t e k t i o n i s m i i n + k a u p p a p u u t a r h a + k a u p p a p u u t a r h u r e i s t a + k a u p p a r a j o i t t e i t a + k a u p p a r a j o i t u k s e n s a + k a u p p a r a j o i t u k s i a + k a u p p a r a j o i t u s t e n + k a u p p a r e i t i t + k a u p p a r e i t t e j ä + k a u p p a r e i t t i e n + k a u p p a r e i t t i ä + k a u p p a r e k i s t e r e i h i n + k a u p p a r e k i s t e r i + k a u p p a r e k i s t e r i e n + k a u p p a r e k i s t e r i i n + k a u p p a r e k i s t e r i l l e + k a u p p a r e k i s t e r i t + k a u p p a r e k i s t e r i ä + k a u p p a r i i d a n + k a u p p a r i i d a t + k a u p p a r i i d o i s s a + k a u p p a r i i d o i s t a + k a u p p a r i i t a + k a u p p a r i i t a a n + k a u p p a r i i t a m m e + k a u p p a r i i t o i h i n + k a u p p a r i i t o j a + k a u p p a r i i t o j e n + k a u p p a r y h m i t t y m i e n + k a u p p a r y h m i t t y m i s t ä + k a u p p a r y h m i t t y m ä + k a u p p a r y h m i t t y m ä l l ä + k a u p p a r y h m i t t y m ä n + k a u p p a r y h m i t t y m ä n ä + k a u p p a r y h m i t t y m ä s t ä + k a u p p a r y h m i t t y m ä t + k a u p p a r y h m i t t y m ä ä + k a u p p a r y h m ä + k a u p p a r y h m ä n + k a u p p a s a a r r o l l a + k a u p p a s a a r r o n + k a u p p a s a a r r o s s a + k a u p p a s a a r r o s t a + k a u p p a s a a r r o s t a a n + k a u p p a s a a r r o t + k a u p p a s a a r t o + k a u p p a s a a r t o a + k a u p p a s a a r t o j a + k a u p p a s a a r t o k y s y m y k s e e n + k a u p p a s a a r t o k y s y m y s t ä + k a u p p a s a a r t o o n + k a u p p a s a a r t o p o l i t i i k k a + k a u p p a s a a r t o p o l i t i i k k a a n + k a u p p a s a a r t o u h k a + k a u p p a s a l a i s u u k s i a + k a u p p a s a n k t i o i l l a + k a u p p a s a n k t i o i t a + k a u p p a s a n k t i o t + k a u p p a s a t a m i e n + k a u p p a s e l k k a u k s e n + k a u p p a s e u r a a m u k s e t + k a u p p a s i t o u m u k s e t + k a u p p a s i t o u m u k s i a + k a u p p a s o d a l l a + k a u p p a s o d a n + k a u p p a s o d a s s a + k a u p p a s o d a s t a + k a u p p a s o d i l l a + k a u p p a s o p i m u k s e e n + k a u p p a s o p i m u k s e l l a + k a u p p a s o p i m u k s e l l e + k a u p p a s o p i m u k s e m m e + k a u p p a s o p i m u k s e n + k a u p p a s o p i m u k s e n s a + k a u p p a s o p i m u k s e s s a + k a u p p a s o p i m u k s e s t a + k a u p p a s o p i m u k s e t + k a u p p a s o p i m u k s i a + k a u p p a s o p i m u k s i a a n + k a u p p a s o p i m u k s i a m m e + k a u p p a s o p i m u k s i e n + k a u p p a s o p i m u k s i i m m e + k a u p p a s o p i m u k s i i n + k a u p p a s o p i m u k s i i n s a + k a u p p a s o p i m u k s i l l a + k a u p p a s o p i m u k s i l l e + k a u p p a s o p i m u k s i s s a + k a u p p a s o p i m u k s i s s a a n + k a u p p a s o p i m u k s i s s a m m e + k a u p p a s o p i m u k s i s t a + k a u p p a s o p i m u s + k a u p p a s o p i m u s e h d o t u s t a + k a u p p a s o p i m u s n e u v o t t e l u j a + k a u p p a s o p i m u s n e u v o t t e l u j e n + k a u p p a s o p i m u s t a + k a u p p a s o p i m u s t e m m e + k a u p p a s o p i m u s t e n + k a u p p a s o t a + k a u p p a s o t a a + k a u p p a s o t a a n + k a u p p a s o t i a + k a u p p a s o t i e n + k a u p p a s t r a t e g i a + k a u p p a s t r a t e g i a a + k a u p p a s t r a t e g i a l l a + k a u p p a s t r a t e g i a n + k a u p p a s t r a t e g i a s s a + k a u p p a s u h d e + k a u p p a s u h d e t t a + k a u p p a s u h t e e m m e + k a u p p a s u h t e e n + k a u p p a s u h t e e n s a + k a u p p a s u h t e e s s a + k a u p p a s u h t e e s t a + k a u p p a s u h t e e t + k a u p p a s u h t e i d e m m e + k a u p p a s u h t e i d e n + k a u p p a s u h t e i l l a + k a u p p a s u h t e i l l a m m e + k a u p p a s u h t e i l l e + k a u p p a s u h t e i l l e m m e + k a u p p a s u h t e i s i i m m e + k a u p p a s u h t e i s i i n + k a u p p a s u h t e i s i i n s a + k a u p p a s u h t e i s s a + k a u p p a s u h t e i s s a a n + k a u p p a s u h t e i s s a m m e + k a u p p a s u h t e i s t a + k a u p p a s u h t e i s t a m m e + k a u p p a s u h t e i t a + k a u p p a s u h t e i t a a n + k a u p p a s u h t e i t a m m e + k a u p p a s u h t e i t t e m m e + k a u p p a s u m m a l l e + k a u p p a s u o j a t o i m i a + k a u p p a s u u r v a l l a n + k a u p p a s ä ä n n ö i l l e + k a u p p a s ä ä n n ö i l l ä + k a u p p a s ä ä n n ö i s s ä + k a u p p a s ä ä n n ö k s e t + k a u p p a s ä ä n n ö k s i s t ä m m e + k a u p p a s ä ä n n ö k s i ä + k a u p p a s ä ä n n ö s t e n + k a u p p a s ä ä n n ö t + k a u p p a s ä ä n t ö i h i n + k a u p p a s ä ä n t ö j e n + k a u p p a s ä ä n t ö j ä + k a u p p a s ä ä n t ö j ä m m e + k a u p p a t a i s t e l u + k a u p p a t a l o u d e l l e + k a u p p a t a p a a + k a u p p a t a p a a n + k a u p p a t a p a h t u m a a + k a u p p a t a p o j a + k a u p p a t a p o j e n + k a u p p a t a r i f f e i n a + k a u p p a t a r i f f i e n + k a u p p a t a r i f f i t + k a u p p a t a s a p a i n o a + k a u p p a t a s e + k a u p p a t a s e e m m e + k a u p p a t a s e e n + k a u p p a t a s e e n s a + k a u p p a t a s e e s e e n + k a u p p a t a s e e s s a + k a u p p a t a s e e s t a + k a u p p a t a s e i s i i n + k a u p p a t a s e i t a + k a u p p a t a v a n + k a u p p a t a v a r a + k a u p p a t a v a r a a + k a u p p a t a v a r a k s i + k a u p p a t a v a r a n + k a u p p a t a v a r a n a + k a u p p a t a v a r o i d e n + k a u p p a t a v a r o i h i n + k a u p p a t a v a r o i l l e + k a u p p a t a v a r o i n a + k a u p p a t a v a r o i t a + k a u p p a t a v a s t a + k a u p p a t a v o i l l e + k a u p p a t a v o i t t e i d e n + k a u p p a t a v o i t t e i s i i n + k a u p p a t i e t e e t + k a u p p a t i e t o j a + k a u p p a t i l a s t o j a + k a u p p a t i l a s t o j e n + k a u p p a t o i m e a + k a u p p a t o i m e n p i t e i d e n + k a u p p a t o i m e n p i t e i l l e + k a u p p a t o i m e n p i t e i s i i n + k a u p p a t o i m e n p i t e i t ä + k a u p p a t o i m e t + k a u p p a t o i m i a + k a u p p a t o i m i a m m e + k a u p p a t o i m i e n + k a u p p a t o i m i n n a n + k a u p p a t o i m i n t a + k a u p p a t u k e a + k a u p p a t u k i a a n + k a u p p a t u l o i s t a + k a u p p a t u l o t + k a u p p a t u o m i o i s t u i m e s s a + k a u p p a t u o m i o i s t u i n t a + k a u p p a t u o t t e i d e n + k a u p p a t u o t t e i s t a + k a u p p a u l o t t u v u u s + k a u p p a v a i h d o n + k a u p p a v a i h d o s s a + k a u p p a v a i h t o + k a u p p a v a i h t o a + k a u p p a v a i h t o e h d o l l e + k a u p p a v a i h t o e h t o j a + k a u p p a v a i h t o j a + k a u p p a v a i h t o j e n + k a u p p a v a i h t o k i n + k a u p p a v a j e + k a u p p a v a j e e l l a a n + k a u p p a v a j e e m m e + k a u p p a v a j e e n + k a u p p a v a j e e s t a + k a u p p a v a j e e t + k a u p p a v a j e i t a + k a u p p a v a j e j ä r j e s t e l m ä + k a u p p a v a j e t t a + k a u p p a v a j e t t a a n + k a u p p a v a j e t t a m m e + k a u p p a v a l i o k u n n a n + k a u p p a v a l i o k u n t i e n + k a u p p a v a l l o i s t a + k a u p p a v a l t a + k a u p p a v a l t a n a + k a u p p a v a l t i o + k a u p p a v a l t u u s k u n n a n + k a u p p a v a l t u u s k u n t a + k a u p p a v a l u u t a n + k a u p p a v a l u u t t a + k a u p p a v a l u u t t a a + k a u p p a v e l a n + k a u p p a v e l k a n s a + k a u p p a v e l v o i t t e e m m e + k a u p p a v e l v o i t t e i d e n + k a u p p a v e r k o i l l a + k a u p p a v e r k o i s s a + k a u p p a v e r k o s t o i s s a + k a u p p a v e r k o s t o j e n + k a u p p a v e r k o s t o o n + k a u p p a v i r a s t o + k a u p p a v i r r a n + k a u p p a v i r r a s s a + k a u p p a v i r r a t + k a u p p a v i r r o i l t a + k a u p p a v i r r o i s t a + k a u p p a v i r t a a + k a u p p a v i r t o i h i m m e + k a u p p a v i r t o i h i n + k a u p p a v i r t o j a + k a u p p a v i r t o j e n + k a u p p a v u o r o p u h e l u n + k a u p p a v y ö h y k k e e k s i + k a u p p a v y ö h y k k e e n + k a u p p a v ä l i n e i d e n + k a u p p a v ä y l ä t + k a u p p a y h d i s t e l m i i n + k a u p p a y h d i s t y k s e t + k a u p p a y h d i s t y s + k a u p p a y h d i s t y s t e n + k a u p p a y h t e i s t y ö + k a u p p a y h t e i s t y ö l l e + k a u p p a y h t e i s t y ö l l ä + k a u p p a y h t e i s t y ö n + k a u p p a y h t e i s t y ö t ä + k a u p p a y h t e i s ö + k a u p p a y h t e y d e t + k a u p p a y h t e y k s i e n + k a u p p a y h t e y k s i ä + k a u p p a y m p ä r i s t ö + k a u p p a y m p ä r i s t ö n + k a u p p a y m p ä r i s t ö s s ä + k a u p p a y r i t y k s i ä + k a u p p i a a n + k a u p p i a i d e n + k a u p p i a i t a + k a u p p i a s k a n s o j a + k a u p p i a s k i r j a n p i t o a + k a u p p i a s t a + k a u p p o j a + k a u p p o j e n + k a u p u n g e i l l a + k a u p u n g e i l l e + k a u p u n g e i s s a + k a u p u n g e i s s a m m e + k a u p u n g e i s t a + k a u p u n g i l l e + k a u p u n g i n + k a u p u n g i n h a l l i t u k s e e n + k a u p u n g i n h a l l i t u k s e n + k a u p u n g i n h a l l i t u k s e s s a + k a u p u n g i n h a l l i t u k s e s t a + k a u p u n g i n h a l l i t u k s e t + k a u p u n g i n h a l l i t u k s i a + k a u p u n g i n h a l l i t u k s i l l e + k a u p u n g i n h a l l i t u s + k a u p u n g i n h a l l i t u s t e n + k a u p u n g i n i s ä t + k a u p u n g i n j o h t a j a + k a u p u n g i n j o h t a j a n + k a u p u n g i n j o h t a j a t + k a u p u n g i n j o h t a j i a + k a u p u n g i n k i r j a s t o + k a u p u n g i n k i r k k o + k a u p u n g i n m u s e o + k a u p u n g i n m u s e o t a + k a u p u n g i n m u u r i + k a u p u n g i n o o p p e r a + k a u p u n g i n o r k e s t e r i + k a u p u n g i n o s a + k a u p u n g i n o s a t + k a u p u n g i n o s a v a a l e i h i n + k a u p u n g i n o s i a + k a u p u n g i n o s i e n + k a u p u n g i n o s i s s a + k a u p u n g i n p r e f e k t i + k a u p u n g i n p u i s t o + k a u p u n g i n r a k e n n u s p e l i + k a u p u n g i n t a l o + k a u p u n g i n t a l o i h i n + k a u p u n g i n t a l o i s s a + k a u p u n g i n t a l o l l a + k a u p u n g i n t a l o n + k a u p u n g i n t e a t t e r i + k a u p u n g i n v a l t u u s t o + k a u p u n g i n v a l t u u s t o a + k a u p u n g i n v a l t u u s t o j e n + k a u p u n g i n v a l t u u s t o n + k a u p u n g i n v a l t u u s t o o n + k a u p u n g i n v a l t u u s t o s s a + k a u p u n g i n v a l t u u t e t t u + k a u p u n g i n v a l t u u t e t t u j a + k a u p u n g i n v a l t u u t e t t u n a + k a u p u n g i n v a l t u u t e t t u u n + k a u p u n g i n v a l t u u t e t u l l e + k a u p u n g i n v a l t u u t e t u n + k a u p u n g i n v a l t u u t e t u t + k a u p u n g i s s a + k a u p u n g i s t u m i s e n + k a u p u n g i s t u m i s e s t a + k a u p u n g i s t u m i s p o l i t i i k k a a + k a u p u n g i s t u m i s p r o s e s s i l l a + k a u p u n g i s t u m i s p r o s e s s i n + k a u p u n g i s t u m i s s u u n t a u k s e n + k a u p u n g i t + k a u p u n k e i h i m m e + k a u p u n k e i h i n + k a u p u n k e j a + k a u p u n k i a + k a u p u n k i a j o n e u v o j e n + k a u p u n k i a j o n e u v o n + k a u p u n k i a j o o n + k a u p u n k i a k u p u n k t i o + k a u p u n k i a l u e + k a u p u n k i a l u e e l l a + k a u p u n k i a l u e e l l e + k a u p u n k i a l u e e n + k a u p u n k i a l u e e s t a + k a u p u n k i a l u e e t + k a u p u n k i a l u e e t k i n + k a u p u n k i a l u e i d e m m e + k a u p u n k i a l u e i d e n + k a u p u n k i a l u e i l l a + k a u p u n k i a l u e i l l a k i n + k a u p u n k i a l u e i l l a m m e + k a u p u n k i a l u e i l l e + k a u p u n k i a l u e i l l e m m e + k a u p u n k i a l u e i l t a + k a u p u n k i a l u e i s i i n + k a u p u n k i a l u e i s t a + k a u p u n k i a l u e i t a + k a u p u n k i a l u e t t a + k a u p u n k i a r k k i t e h t u u r i a + k a u p u n k i a r k k i t e h t u u r i n + k a u p u n k i a s i o i d e n + k a u p u n k i a s i o i s t a + k a u p u n k i a s i o i t a + k a u p u n k i a s u k k a i d e n + k a u p u n k i a s u n t o j e n + k a u p u n k i a s u t u k s e n + k a u p u n k i a u t o i n a + k a u p u n k i b u s s i t + k a u p u n k i c o w b o y t + k a u p u n k i e k o l o g i a + k a u p u n k i e l ä m ä n + k a u p u n k i e l ä m ä s t ä + k a u p u n k i e l ä m ä ä + k a u p u n k i e l ä m ä ä n + k a u p u n k i e m m e + k a u p u n k i e n + k a u p u n k i e n k i n + k a u p u n k i f o o r u m i s s a + k a u p u n k i h a n k k e i d e n + k a u p u n k i i n + k a u p u n k i j o u k k o l i i k e n n e t t ä + k a u p u n k i j ä r j e s t e l m i e n + k a u p u n k i j ä r j e s t e l m ä n + k a u p u n k i j ä r j e s t e l m ä ä + k a u p u n k i j ä r j e s t e l m ä ä n + k a u p u n k i j ä t e + k a u p u n k i j ä t t e i d e n + k a u p u n k i k a a s u + k a u p u n k i k a u p a s s a + k a u p u n k i k e h i t t ä m i s e n + k a u p u n k i k e h i t t ä m i s p o l i t i i k k a a n + k a u p u n k i k e h i t y k s e e n + k a u p u n k i k e h i t y k s e n + k a u p u n k i k e h i t y k s e s s ä + k a u p u n k i k e h i t y k s e s t ä + k a u p u n k i k e h i t y s + k a u p u n k i k e h i t y s h a n k k e i t a + k a u p u n k i k e h i t y s s u u n n i t e l m i a + k a u p u n k i k e h i t y s t o i m i a + k a u p u n k i k e h i t y s t o i m i s s a + k a u p u n k i k e h i t y s t ä + k a u p u n k i k e i n o t t e l u n + k a u p u n k i k e s k e i s e t + k a u p u n k i k e s k i t t y m i i n + k a u p u n k i k e s k i t t y m i ä + k a u p u n k i k e s k i t t y m ä + k a u p u n k i k e s k u k s i a + k a u p u n k i k e s k u k s i i n + k a u p u n k i k e s k u k s i l l a + k a u p u n k i k e s k u k s i s s a + k a u p u n k i k e s k u k s i s t a + k a u p u n k i k e s k u s t e m m e + k a u p u n k i k e s k u s t e n + k a u p u n k i k e s k u s t o i s s a + k a u p u n k i k e s k u s t o j e n + k a u p u n k i k o k o n a i s u u s + k a u p u n k i k o k o n a i s u u t e e n + k a u p u n k i k u l j e t u k s i a + k a u p u n k i k u l t t u u r i a + k a u p u n k i k u l t t u u r i n + k a u p u n k i k u m p p a n u u k s i e n + k a u p u n k i k y s y m y k s e e n + k a u p u n k i k y s y m y k s e s t ä + k a u p u n k i k y s y m y k s i i n + k a u p u n k i k y s y m y k s i s s ä + k a u p u n k i k y s y m y k s i ä + k a u p u n k i k y s y m y s + k a u p u n k i k y s y m y s t ä + k a u p u n k i k ä m p p ä + k a u p u n k i l a i s e l ä m ä n + k a u p u n k i l a i s e t + k a u p u n k i l a i s i a + k a u p u n k i l a i s i k s i + k a u p u n k i l a i s s o t i e n + k a u p u n k i l e n t o a s e m a n + k a u p u n k i l e n t o a s e m i s t a + k a u p u n k i l i i k e n n e + k a u p u n k i l i i k e n n e f o o r u m e i h i n + k a u p u n k i l i i k e n n e j ä r j e s t e l m i e n + k a u p u n k i l i i k e n n e j ä r j e s t e l m i s t ä + k a u p u n k i l i i k e n n e j ä r j e s t e l m ä + k a u p u n k i l i i k e n n e j ä r j e s t e l m ä n + k a u p u n k i l i i k e n n e j ä r j e s t e l m ä ä + k a u p u n k i l i i k e n n e k u l t t u u r i a + k a u p u n k i l i i k e n n e k y s y m y k s e n + k a u p u n k i l i i k e n n e o l o s u h t e i t a + k a u p u n k i l i i k e n n e p a l v e l u j a + k a u p u n k i l i i k e n n e p o l i t i i k a s t a + k a u p u n k i l i i k e n n e p o l i t i i k k a a n + k a u p u n k i l i i k e n n e r a k e n n e + k a u p u n k i l i i k e n n e s u u n n i t e l m a + k a u p u n k i l i i k e n n e s u u n n i t e l m a n + k a u p u n k i l i i k e n n e s u u n n i t e l m i e n + k a u p u n k i l i i k e n n e t t ä + k a u p u n k i l i i k e n n e v e r k o i s t a + k a u p u n k i l i i k e n t e e l l e + k a u p u n k i l i i k e n t e e l l ä + k a u p u n k i l i i k e n t e e n + k a u p u n k i l i i k e n t e e s e e n + k a u p u n k i l i i k e n t e e s s ä + k a u p u n k i l i i k e n t e e s t ä + k a u p u n k i l i i k k u m i s t a + k a u p u n k i l o g i s t i i k k a + k a u p u n k i l o g i s t i i k k a a + k a u p u n k i m a a n t i e d e + k a u p u n k i m a t k a i l u + k a u p u n k i m a t k a i l u u n + k a u p u n k i m e t s ä + k a u p u n k i m m e + k a u p u n k i n e u v o s t o n + k a u p u n k i n ä k ö k o h t a + k a u p u n k i o h j e l m i e n + k a u p u n k i o i k e u d e t + k a u p u n k i o l o i s s a + k a u p u n k i o n g e l m i a + k a u p u n k i p o l i i t t i s i s t a + k a u p u n k i p o l i t i i k a k s i + k a u p u n k i p o l i t i i k a n + k a u p u n k i p o l i t i i k a s s a + k a u p u n k i p o l i t i i k a s t a + k a u p u n k i p o l i t i i k k a + k a u p u n k i p o l i t i i k k a a + k a u p u n k i p o l i t i i k k a a n + k a u p u n k i p o l i t i i k k a a n s a + k a u p u n k i p o l i t i i k k o j e n + k a u p u n k i p u o l u e + k a u p u n k i p y ö r ä j ä r j e s t e l m ä + k a u p u n k i r a i d e l i i k e n n e + k a u p u n k i r a k e n n e + k a u p u n k i r a k e n n u s t e n + k a u p u n k i r a k e n t a m i n e n + k a u p u n k i r a k e n t a m i s e e n + k a u p u n k i r a k e n t a m i s e n + k a u p u n k i r a k e n t e e n + k a u p u n k i r a k e n t e e s e e n + k a u p u n k i r a k e n t e i t a + k a u p u n k i r a t a v e r k o s t o o n + k a u p u n k i r e n e s s a n s s i + k a u p u n k i s a a r e k e i l m i ö + k a u p u n k i s a i r a a l o i s s a + k a u p u n k i s i s s i o p e r a a t i o i s s a + k a u p u n k i s o d a n + k a u p u n k i s o s i o l o g i a + k a u p u n k i s o t a a + k a u p u n k i s t r a t e g i a + k a u p u n k i s t r a t e g i a a + k a u p u n k i s t r a t e g i a n + k a u p u n k i s t r a t e g i o i t a + k a u p u n k i s u u n n i t e l m a a + k a u p u n k i s u u n n i t e l m i e n + k a u p u n k i s u u n n i t e l m i s s a + k a u p u n k i s u u n n i t t e l i j a n a + k a u p u n k i s u u n n i t t e l i j a t + k a u p u n k i s u u n n i t t e l i j o i d e n + k a u p u n k i s u u n n i t t e l u + k a u p u n k i s u u n n i t t e l u a + k a u p u n k i s u u n n i t t e l u a s i o i s t a + k a u p u n k i s u u n n i t t e l u h a n k e + k a u p u n k i s u u n n i t t e l u i n e e n + k a u p u n k i s u u n n i t t e l u k i l p a i l u n + k a u p u n k i s u u n n i t t e l u m a l l e j a + k a u p u n k i s u u n n i t t e l u n + k a u p u n k i s u u n n i t t e l u p o l i t i i k k a + k a u p u n k i s u u n n i t t e l u p o l i t i i k k a a + k a u p u n k i s u u n n i t t e l u p o l i t i i k k a m m e + k a u p u n k i s u u n n i t t e l u s s a + k a u p u n k i s u u n n i t t e l u s t a + k a u p u n k i s u u n n i t t e l u s ä ä n t ö j ä + k a u p u n k i s u u n n i t t e l u u n + k a u p u n k i t a a j a m i a + k a u p u n k i t a a j a m i e n + k a u p u n k i t a a j a m i s s a + k a u p u n k i t a l o u s t i e d e + k a u p u n k i t a r i n a + k a u p u n k i t a s o n + k a u p u n k i t e e m a k o h t a i s e n + k a u p u n k i t e i t ä + k a u p u n k i t i l a s t o j a + k a u p u n k i t u l l i e n + k a u p u n k i t u n n e l e i d e n + k a u p u n k i t u t k i m u s + k a u p u n k i t y y p p i n e n + k a u p u n k i u l o t t u v u u d e n + k a u p u n k i u l o t t u v u u d e s t a + k a u p u n k i u l o t t u v u u s + k a u p u n k i u l o t t u v u u t e e n + k a u p u n k i u l o t t u v u u t t a + k a u p u n k i v a l t i o + k a u p u n k i v a l t i o i d e n + k a u p u n k i v a l t i o i h i n + k a u p u n k i v a l t i o i n a + k a u p u n k i v a l t i o i t a + k a u p u n k i v a l t i o s s a + k a u p u n k i v a l t i o t + k a u p u n k i v e r k k o + k a u p u n k i v e r k o s t o + k a u p u n k i v i l j e l y + k a u p u n k i v i r a n o m a i s t e n + k a u p u n k i v ä e s t ö l l ä + k a u p u n k i v ä e s t ö n + k a u p u n k i v ä e s t ö s t ä + k a u p u n k i v ä e s t ö ö n + k a u p u n k i v ä h e m m i s t ö ä + k a u p u n k i v ä k i v a l l a n + k a u p u n k i y h t e i s ö a l o i t e + k a u p u n k i y h t e i s ö i h i n + k a u p u n k i y h t e i s ö i l l e + k a u p u n k i y h t e i s ö i s s ä + k a u p u n k i y h t e i s ö j e n + k a u p u n k i y h t e i s ö ä + k a u p u n k i y k s i k ö i d e n + k a u p u n k i y m p ä r i s t ö + k a u p u n k i y m p ä r i s t ö i h i n + k a u p u n k i y m p ä r i s t ö i s s ä + k a u p u n k i y m p ä r i s t ö i s t ä + k a u p u n k i y m p ä r i s t ö j e n + k a u p u n k i y m p ä r i s t ö l l e + k a u p u n k i y m p ä r i s t ö n + k a u p u n k i y m p ä r i s t ö s s ä + k a u p u n k i y m p ä r i s t ö s t ä + k a u p u n k i y m p ä r i s t ö ä + k a u p u n k i y m p ä r i s t ö ö n + k a u r a j u u r i + k a u r i i n m e t s ä s t ä j ä + k a u s i a + k a u s i h e d e l m i s t ä + k a u s i k e r t o m u k s e n + k a u s i k e r t o m u k s e s s a + k a u s i k e r t o m u k s e s t a + k a u s i k e r t o m u k s i a + k a u s i k e r t o m u s + k a u s i k o h t a i s e s t i + k a u s i k o r t i n + k a u s i l i p u n + k a u s i l u o n t e i s i a + k a u s i l u o n t e i s i s t a + k a u s i l u o n t e i s u u s + k a u s i l u o n t e i s u u s t e k i j ö i s t ä + k a u s i l u o n t o i s u u d e s t a + k a u s i n a + k a u s i p o r r a s t u s p a l k k i o + k a u s i p o r r a s t u s p a l k k i o n + k a u s i t e k i j ö i s t ä + k a u s i t t a i s i a + k a u s i t y ö h ö n + k a u s i t y ö l ä i s i s t ä + k a u s i t y ö l ä i s t e n + k a u s i t y ö l ä i s t ä + k a u s i t y ö n + k a u s i t y ö n t e k i j ä + k a u s i t y ö n t e k i j ä k y s y m y k s e e n + k a u s i t y ö n t e k i j ä n + k a u s i t y ö n t e k i j ä t + k a u s i t y ö n t e k i j ä ä + k a u s i t y ö n t e k i j ö i d e n + k a u s i t y ö n t e k i j ö i h i n + k a u s i t y ö n t e k i j ö i l l ä + k a u s i t y ö n t e k i j ö i n ä + k a u s i t y ö n t e k i j ö i s t ä + k a u s i t y ö n t e k i j ö i t ä + k a u s i t y ö s s ä + k a u s i t y ö t e o l l i s u u t t a + k a u s i t y ö t t ö m y y d e s t ä + k a u s i t y ö t t ö m y y s + k a u s i t y ö t ä + k a u s i t y ö v o i m a n + k a u s i t ö i d e n + k a u s i v a i h t e l u i d e n + k a u s i v a i h t e l u i s t a + k a u s i v a i h t e l u i t a + k a u s i v a i h t e l u j e n + k a u s i v a i h t e l u n + k a u s i v a i h t e l u t + k a u s i v a i k u t u k s e t + k a u t e m m e + k a u t e n a + k a u t e n i + k a u t e n n e + k a u t e n s a + k a u t t a k u l j e t u k s e n + k a u t t a k u l j e t u s r e i t t i e n + k a u t t a k u l k u a l u e + k a u t t a k u l k u a l u e e n a + k a u t t a k u l k u a l u e i l l a + k a u t t a k u l k u a l u e i t a + k a u t t a k u l k u a l u e t t a + k a u t t a k u l k u a s i a k i r j o j e n + k a u t t a k u l k u a s i a t + k a u t t a k u l k u a s i o i d e n + k a u t t a k u l k u d i r e k t i i v i l l e + k a u t t a k u l k u f o o r u m i + k a u t t a k u l k u j ä r j e s t e l m ä + k a u t t a k u l k u j ä r j e s t e l m ä n + k a u t t a k u l k u j ä r j e s t e l y j ä + k a u t t a k u l k u j ä r j e s t e l y n + k a u t t a k u l k u k e n t t i e n + k a u t t a k u l k u k e s k u k s e n a + k a u t t a k u l k u k e s k u k s i a + k a u t t a k u l k u k e s k u k s i s s a + k a u t t a k u l k u k e s k u s + k a u t t a k u l k u k e s k u s t e n + k a u t t a k u l k u k i e l l o t + k a u t t a k u l k u k u l j e t u k s i s t a + k a u t t a k u l k u k y s y m y k s e s t ä + k a u t t a k u l k u k y s y m y s + k a u t t a k u l k u k ä y t ä v i ä + k a u t t a k u l k u k ä y t ä v ä ä + k a u t t a k u l k u l a i t o k s e t + k a u t t a k u l k u l e i r e j ä + k a u t t a k u l k u l e n t o i h i n + k a u t t a k u l k u l e n t o k e n t i l l ä + k a u t t a k u l k u l e n t o k e n t ä n + k a u t t a k u l k u l i i k e n n e + k a u t t a k u l k u l i i k e n n e s o p i m u k s e s t a + k a u t t a k u l k u l i i k e n n e t t ä + k a u t t a k u l k u l i i k e n t e e n + k a u t t a k u l k u l i i k e n t e e s e e n + k a u t t a k u l k u l i i k e n t e e s t ä + k a u t t a k u l k u l u p a + k a u t t a k u l k u l u p i e n + k a u t t a k u l k u l u v a n + k a u t t a k u l k u m a a + k a u t t a k u l k u m a a h a n + k a u t t a k u l k u m a a n + k a u t t a k u l k u m a a n a + k a u t t a k u l k u m a a s s a + k a u t t a k u l k u m a a s t a + k a u t t a k u l k u m a a t + k a u t t a k u l k u m a i d e n + k a u t t a k u l k u m a i h i n + k a u t t a k u l k u m a i l l e + k a u t t a k u l k u m a i n a + k a u t t a k u l k u m a i s s a + k a u t t a k u l k u m a i s t a + k a u t t a k u l k u m a i t a + k a u t t a k u l k u m a t k a l l a + k a u t t a k u l k u m a t k a t + k a u t t a k u l k u m a t k o j a + k a u t t a k u l k u m e n e t t e l y j ä + k a u t t a k u l k u m e n e t t e l y n + k a u t t a k u l k u o i k e u s + k a u t t a k u l k u o n g e l m a n + k a u t t a k u l k u o n g e l m a t + k a u t t a k u l k u o n g e l m i i n + k a u t t a k u l k u p a i k k a + k a u t t a k u l k u p a i k k o j e n + k a u t t a k u l k u p i s t e e t + k a u t t a k u l k u p o l i t i i k k a + k a u t t a k u l k u p ö y t ä k i r j a n + k a u t t a k u l k u p ö y t ä k i r j a s s a + k a u t t a k u l k u p ö y t ä k i r j o i h i n + k a u t t a k u l k u r e i t e i s t ä + k a u t t a k u l k u r e i t i t + k a u t t a k u l k u r e i t t e i n ä + k a u t t a k u l k u r e i t t i e n + k a u t t a k u l k u s a t a m i a + k a u t t a k u l k u s o p i m u k s e l l e + k a u t t a k u l k u s o p i m u k s e n + k a u t t a k u l k u s o p i m u k s e s s a + k a u t t a k u l k u s o p i m u k s e s t a + k a u t t a k u l k u s o p i m u s + k a u t t a k u l k u s ä ä n n ö t + k a u t t a k u l k u t a p a u k s i s s a + k a u t t a k u l k u t a v a r o i d e n + k a u t t a k u l k u t i e + k a u t t a k u l k u t i l a n t e i s s a + k a u t t a k u l k u v a l t i o + k a u t t a k u l k u v a l t i o i d e n + k a u t t a k u l k u v a l t i o i h i n + k a u t t a k u l k u v a l t i o i l l e + k a u t t a k u l k u v a l t i o i n a + k a u t t a k u l k u v a l t i o i s s a + k a u t t a k u l k u v a l t i o i s s a k i n + k a u t t a k u l k u v a l t i o i s t a + k a u t t a k u l k u v a l t i o i t a + k a u t t a k u l k u v a l t i o n a + k a u t t a k u l k u v a l t i o o n + k a u t t a k u l k u v a l t i o s s a + k a u t t a k u l k u v a l t i o s t a + k a u t t a k u l k u v e r k k o j e n + k a u t t a k u l k u v i i s u m e j a + k a u t t a k u l k u v i i s u m i a s i a t + k a u t t a k u l k u v i i s u m i n + k a u t t a k u l k u v i i s u m i s t a + k a u t t a k u l u s t a + k a v a h t a a + k a v a h t a m a t t o m i l l e + k a v a l a n + k a v a l l e t a a n + k a v a l l u k s e e n + k a v a l l u k s i s t a + k a v a l l u s o n g e l m a a + k a v a l l u s t e n + k a v e n n e t a a n + k a v e n n e t t a v a + k a v e n n e t t u + k a v e n t a a + k a v e n t a a k s e e n + k a v e n t a i s i + k a v e n t a m a a n + k a v e n t a m i s e k s i + k a v e n t a m i s e n + k a v e n t a m i s t a + k a v e n t a v a t + k a v e n t u m i s e n + k a v e r e i l t a n i + k a v e r i k a p i t a l i s m i + k a v e r i k a p i t a l i s m i i n + k a v e r i k a p i t a l i s m i k s i + k a v e r i k a p i t a l i s m i n + k a v e r i n s a + k a v e r i v e r k o s t o i h i n + k a v e r u u d e n + k a v i a a r i m ä ä r i l l ä + k a v i o e l ä i m e t + k a v i o e l ä i m i ä + k a v i o e l ä i n t e n + k a š m i r i l a i s t e n + k a š m i r v i l l a + k e h i t e l l ä + k e h i t e l t ä e s s ä + k e h i t e t t ä e s s ä + k e h i t e t t ä i s i i n + k e h i t e t y s t ä + k e h i t e t ä + k e h i t e t ä ä n + k e h i t t e l e e + k e h i t t e l e m ä s s ä + k e h i t t e l e m ä ä n i + k e h i t t e l y a s t e e l l a + k e h i t t e l y s s ä + k e h i t t e l y t y ö + k e h i t t e l y v a i h e e n + k e h i t t i v ä t + k e h i t t y e s s ä + k e h i t t y i + k e h i t t y i s i + k e h i t t y i v ä t + k e h i t t y m i s e e n + k e h i t t y m i s e l l e + k e h i t t y m i s e n + k e h i t t y m i s e s t ä + k e h i t t y m i s k y v y n + k e h i t t y m i s m a h d o l l i s u u d e n + k e h i t t y m i s m a h d o l l i s u u d e t + k e h i t t y m i s m a h d o l l i s u u k s i a + k e h i t t y m i s m a h d o l l i s u u k s i a m m e + k e h i t t y m i s m a h d o l l i s u u k s i i n + k e h i t t y m i s m e k a n i s m i e n + k e h i t t y m i s t ä + k e h i t t y m i s t ä ä n + k e h i t t y m i s v a i h e e s s a + k e h i t t y m i s v o i m a v a r a n s a + k e h i t t y m ä s s ä + k e h i t t y m ä t t ö m i m m i l l ä + k e h i t t y m ä t t ö m i m m ä t + k e h i t t y m ä t t ö m i m m ä t k i n + k e h i t t y m ä t t ö m i m p i ä + k e h i t t y m ä t t ö m i ä + k e h i t t y m ä t t ö m ä m p ä ä + k e h i t t y m ä ä n + k e h i t t y n e e l l e + k e h i t t y n e e l l ä + k e h i t t y n e e m m i l l e + k e h i t t y n e e m m i l l ä + k e h i t t y n e e m m i s s ä + k e h i t t y n e e m m ä l l e + k e h i t t y n e e m m ä l l ä + k e h i t t y n e e m m ä s s ä + k e h i t t y n e e m m ä s t ä + k e h i t t y n e e m m ä t + k e h i t t y n e e m p i + k e h i t t y n e e m p i e n + k e h i t t y n e e m p i i n + k e h i t t y n e e m p i ä + k e h i t t y n e e m p ä n ä + k e h i t t y n e e m p ä ä + k e h i t t y n e e m p ä ä n + k e h i t t y n e e n + k e h i t t y n e e s s ä + k e h i t t y n e e s t ä + k e h i t t y n e e t + k e h i t t y n e i d e n + k e h i t t y n e i k s i + k e h i t t y n e i l l e + k e h i t t y n e i l l ä + k e h i t t y n e i l t ä + k e h i t t y n e i m m i l l e + k e h i t t y n e i m m i s s ä + k e h i t t y n e i m m i s t ä + k e h i t t y n e i m m ä k s i + k e h i t t y n e i m m ä l l e + k e h i t t y n e i m m ä n k i n + k e h i t t y n e i m m ä s t ä + k e h i t t y n e i m m ä t + k e h i t t y n e i m p i e n + k e h i t t y n e i m p i i n + k e h i t t y n e i m p i ä + k e h i t t y n e i m p ä ä n + k e h i t t y n e i n + k e h i t t y n e i n t ä + k e h i t t y n e i s i i n + k e h i t t y n e i s s ä + k e h i t t y n e i s t ä + k e h i t t y n e i s y y d e n + k e h i t t y n e i t ä + k e h i t t y n y t t ä + k e h i t t y v i e n + k e h i t t y v i i n + k e h i t t y v i l l e + k e h i t t y v i l t ä + k e h i t t y v i s s ä + k e h i t t y v i s t ä + k e h i t t y v i ä + k e h i t t y v ä n + k e h i t t y v ä s t ä + k e h i t t y v ä t + k e h i t t y v ä ä + k e h i t t y v ä ä n + k e h i t t y y + k e h i t t y ä + k e h i t t y ä k s e e n + k e h i t t ä e s s ä m m e + k e h i t t ä e s s ä ä n + k e h i t t ä i s i + k e h i t t ä k ä ä + k e h i t t ä k ä ä m m e + k e h i t t ä m i e m m e + k e h i t t ä m i l l ä m m e + k e h i t t ä m i s a i k a + k e h i t t ä m i s a l o i t t e e t + k e h i t t ä m i s a l o i t t e i s i i n + k e h i t t ä m i s e e n + k e h i t t ä m i s e k s i + k e h i t t ä m i s e l l e + k e h i t t ä m i s e n + k e h i t t ä m i s e s s ä + k e h i t t ä m i s e s t ä + k e h i t t ä m i s h a a s t e e s e e n + k e h i t t ä m i s h a n k e + k e h i t t ä m i s h a n k k e e m m e + k e h i t t ä m i s h a n k k e e s e e n + k e h i t t ä m i s h a n k k e i d e n + k e h i t t ä m i s h a n k k e i s i i n + k e h i t t ä m i s h a n k k e i t a + k e h i t t ä m i s h e n k i l ö s t ö n + k e h i t t ä m i s i n f r a s t r u k t u u r i e n + k e h i t t ä m i s i n t e n s i i v i s i ä + k e h i t t ä m i s j ä r j e s t e l m i ä + k e h i t t ä m i s j ä r j e s t e l m ä + k e h i t t ä m i s j ä r j e s t e l m ä n + k e h i t t ä m i s k e s k u s t a + k e h i t t ä m i s k u l u j a + k e h i t t ä m i s k u l u j e n + k e h i t t ä m i s k u m p p a n u u d e t + k e h i t t ä m i s k u m p p a n u u k s i e n + k e h i t t ä m i s k u m p p a n u u k s i i n + k e h i t t ä m i s k u m p p a n u u k s i s t a + k e h i t t ä m i s k u m p p a n u u s s o p i m u k s i s t a + k e h i t t ä m i s k u m p p a n u u t t a + k e h i t t ä m i s k u s t a n n u k s i s t a + k e h i t t ä m i s k u s t a n n u s t e n + k e h i t t ä m i s k y s y m y k s i ä + k e h i t t ä m i s k y s y m y s + k e h i t t ä m i s l a u t a k u n t a + k e h i t t ä m i s m a h d o l l i s u u d e t + k e h i t t ä m i s m a h d o l l i s u u k s i a + k e h i t t ä m i s m a h d o l l i s u u k s i e n + k e h i t t ä m i s m a h d o l l i s u u k s i i n + k e h i t t ä m i s m a h d o l l i s u u k s i s t a + k e h i t t ä m i s m a h d o l l i s u u t e n a + k e h i t t ä m i s m a l l e i h i n + k e h i t t ä m i s m a l l e j a + k e h i t t ä m i s m a l l i + k e h i t t ä m i s m a l l i a + k e h i t t ä m i s m a l l i n + k e h i t t ä m i s m a n d a a t t i i n + k e h i t t ä m i s m e k a n i s m i n + k e h i t t ä m i s m e n o i h i n + k e h i t t ä m i s m e n o j a + k e h i t t ä m i s m e n o j e n + k e h i t t ä m i s m e n o t + k e h i t t ä m i s m ä ä r ä r a h a t + k e h i t t ä m i s m ä ä r ä r a h o i h i n + k e h i t t ä m i s n ä k y m i s t ä + k e h i t t ä m i s o h j e l m a + k e h i t t ä m i s o h j e l m a a + k e h i t t ä m i s o h j e l m a a n + k e h i t t ä m i s o h j e l m a n + k e h i t t ä m i s o h j e l m a s t a + k e h i t t ä m i s o h j e l m a t + k e h i t t ä m i s o h j e l m i a + k e h i t t ä m i s o h j e l m i e n + k e h i t t ä m i s o h j e l m i i n + k e h i t t ä m i s p i i r i e n + k e h i t t ä m i s p o l i t i i k a l l a + k e h i t t ä m i s p o l i t i i k a n + k e h i t t ä m i s p o l i t i i k a s t a + k e h i t t ä m i s p o l i t i i k a t + k e h i t t ä m i s p o l i t i i k k a + k e h i t t ä m i s p o l i t i i k k a a + k e h i t t ä m i s p o l i t i i k k a a n + k e h i t t ä m i s p o l i t i i k k o j a + k e h i t t ä m i s p o l i t i i k k o j e n + k e h i t t ä m i s p o t e n t i a a l i a + k e h i t t ä m i s p o t e n t i a a l i n + k e h i t t ä m i s p r o j e k t e j a + k e h i t t ä m i s p r o s e s s i a + k e h i t t ä m i s p r o s e s s i l l e + k e h i t t ä m i s p y r k i m y k s e t + k e h i t t ä m i s p y r k i m y k s i ä + k e h i t t ä m i s r a h a s t o n + k e h i t t ä m i s r a h a s t o o n + k e h i t t ä m i s r a h a s t o s t a + k e h i t t ä m i s r a h o i t u k s e e n + k e h i t t ä m i s r a k e n t e e t + k e h i t t ä m i s r i s k e i h i n + k e h i t t ä m i s r i s k i + k e h i t t ä m i s r i s k i s t ä + k e h i t t ä m i s r y h m i e n + k e h i t t ä m i s s o p i m u s t a + k e h i t t ä m i s s o p i m u s t e n + k e h i t t ä m i s s t r a t e g i a a + k e h i t t ä m i s s t r a t e g i a a m m e + k e h i t t ä m i s s t r a t e g i a m m e + k e h i t t ä m i s s t r a t e g i a n + k e h i t t ä m i s s t r a t e g i a s t a + k e h i t t ä m i s s t r a t e g i o i h i n + k e h i t t ä m i s s t r a t e g i o i t a + k e h i t t ä m i s s u u n n i t e l m a + k e h i t t ä m i s s u u n n i t e l m a a + k e h i t t ä m i s s u u n n i t e l m a a n s a + k e h i t t ä m i s s u u n n i t e l m a n + k e h i t t ä m i s s u u n n i t e l m a s s a + k e h i t t ä m i s s u u n n i t e l m a t + k e h i t t ä m i s s u u n n i t e l m i a + k e h i t t ä m i s s u u n n i t e l m i a a n + k e h i t t ä m i s s u u n n i t e l m i e n + k e h i t t ä m i s s u u n n i t e l m i i n + k e h i t t ä m i s s u u n n i t e l m i s s a a n + k e h i t t ä m i s s u u n n i t e l m i s t a + k e h i t t ä m i s s ä ä t i ö n + k e h i t t ä m i s s ä ä t i ö t ä + k e h i t t ä m i s t a r k o i t u k s i i n + k e h i t t ä m i s t a r p e i s t a + k e h i t t ä m i s t a r p e i t a + k e h i t t ä m i s t a v o i t t e e t + k e h i t t ä m i s t a v o i t t e i t a + k e h i t t ä m i s t o i m e n p i t e e t + k e h i t t ä m i s t o i m e n p i t e i d e n + k e h i t t ä m i s t o i m e n p i t e i s i i n + k e h i t t ä m i s t o i m e n p i t e i t ä + k e h i t t ä m i s t o i m e t + k e h i t t ä m i s t o i m i a + k e h i t t ä m i s t o i m i a a n + k e h i t t ä m i s t o i m i e n + k e h i t t ä m i s t o i m i i n + k e h i t t ä m i s t o i m i n + k e h i t t ä m i s t o i m i n n a l l a + k e h i t t ä m i s t o i m i n n a n + k e h i t t ä m i s t o i m i n t a a + k e h i t t ä m i s t o i m i n t a a n + k e h i t t ä m i s t o i m i s s a + k e h i t t ä m i s t o i m i s t a + k e h i t t ä m i s t u k e a + k e h i t t ä m i s t y ö + k e h i t t ä m i s t y ö h ö n + k e h i t t ä m i s t y ö t ä + k e h i t t ä m i s t ä + k e h i t t ä m i s v a i h e + k e h i t t ä m i s v a i h e e n + k e h i t t ä m i s v a i h e e s e e n + k e h i t t ä m i s v a i h e e s s a + k e h i t t ä m i s v a i h e i s i i n + k e h i t t ä m i s v a i h e i t a + k e h i t t ä m i s v a i k u t u s t a + k e h i t t ä m i s v a l t a a + k e h i t t ä m i s v a r a a + k e h i t t ä m i s v a r a t + k e h i t t ä m i s v a r o i h i n + k e h i t t ä m i s v a r o i l l a + k e h i t t ä m i s v a r o i s t a + k e h i t t ä m i s v a r o j e n + k e h i t t ä m i s v a u h t i + k e h i t t ä m i s v ä l i n e + k e h i t t ä m i s v ä l i n e e s t ä + k e h i t t ä m i s v ä l i n e i d e n + k e h i t t ä m i s v ä l i n e i t ä + k e h i t t ä m i s y h t e i s t y ö n + k e h i t t ä m ä l l ä + k e h i t t ä m ä m m e + k e h i t t ä m ä s s ä + k e h i t t ä m ä ä n + k e h i t t ä m ä ä n n e + k e h i t t ä n e e t + k e h i t t ä n y t + k e h i t t ä v i ä + k e h i t t ä v ä t + k e h i t t ä ä + k e h i t t ä ä k s e e n + k e h i t t ä ä k s e m m e + k e h i t y k s e e n + k e h i t y k s e e n s ä + k e h i t y k s e l l e + k e h i t y k s e n + k e h i t y k s e n k i n + k e h i t y k s e n s ä + k e h i t y k s e s s ä + k e h i t y k s e s t ä + k e h i t y k s e s t ä m m e + k e h i t y k s e s t ä ä n + k e h i t y k s i s t ä + k e h i t y k s i ä + k e h i t y m m e + k e h i t y s a g e n d a n + k e h i t y s a i k a t a u l u + k e h i t y s a i k a t a u l u a + k e h i t y s a i k o j a + k e h i t y s a j a n k o h t a n a + k e h i t y s a j a t t e l u + k e h i t y s a j a t t e l u n + k e h i t y s a k s e l i a + k e h i t y s a k t i v i s t e j a + k e h i t y s a l a a + k e h i t y s a l a a n + k e h i t y s a l a l l a + k e h i t y s a l a n + k e h i t y s a l a t + k e h i t y s a l o i t t e e n a + k e h i t y s a l o i t t e e s t a + k e h i t y s a l o i t t e e t + k e h i t y s a l o i t t e i d e n + k e h i t y s a l o i t t e i s i i n + k e h i t y s a l o i t t e i t a + k e h i t y s a l o j e n + k e h i t y s a l u e + k e h i t y s a l u e e n + k e h i t y s a l u e e s t a + k e h i t y s a l u e i d e n + k e h i t y s a l u e i l l a + k e h i t y s a l u e i n a + k e h i t y s a l u e i s i i n + k e h i t y s a l u e i t a + k e h i t y s a l u e r a h a s t o a + k e h i t y s a l u e t t a + k e h i t y s a p u + k e h i t y s a p u a + k e h i t y s a p u a a n + k e h i t y s a p u a l o i t t e i s s a + k e h i t y s a p u a l o i t t e i t a + k e h i t y s a p u a m m e + k e h i t y s a p u a n n e + k e h i t y s a p u a s i a s s a + k e h i t y s a p u b u d j e t e i s s a m m e + k e h i t y s a p u b u d j e t i n + k e h i t y s a p u b u d j e t i s s a + k e h i t y s a p u b u d j e t t i e n + k e h i t y s a p u b u d j e t t i i n + k e h i t y s a p u h a n k k e i d e n + k e h i t y s a p u h a n k k e i t a + k e h i t y s a p u j e n + k e h i t y s a p u j ä r j e s t e l m ä t + k e h i t y s a p u j ä r j e s t ö j e n + k e h i t y s a p u j ä r j e s t ö n + k e h i t y s a p u k e l p o i s u u d e n + k e h i t y s a p u k o h t e i s t a m m e + k e h i t y s a p u k o m i t e a + k e h i t y s a p u k o m i t e a n + k e h i t y s a p u k o m i t e a s s a + k e h i t y s a p u k u m p p a n i n + k e h i t y s a p u k u s t a n n u k s i a + k e h i t y s a p u k u u s e e n + k e h i t y s a p u k y s y m y k s i i n + k e h i t y s a p u l a h j o i t u s + k e h i t y s a p u l u e t t e l o s t a + k e h i t y s a p u l u k u i h i n + k e h i t y s a p u m e n o i h i n + k e h i t y s a p u m i n i s t e r i m m e + k e h i t y s a p u m m e + k e h i t y s a p u m ä ä r ä r a h o i s t a + k e h i t y s a p u m ä ä r ä r a h o j a + k e h i t y s a p u m ä ä r ä r a h o j a a n + k e h i t y s a p u n a + k e h i t y s a p u n s a + k e h i t y s a p u o h j e l m a n + k e h i t y s a p u o h j e l m a t + k e h i t y s a p u o h j e l m i a + k e h i t y s a p u o h j e l m i e m m e + k e h i t y s a p u o h j e l m i e n + k e h i t y s a p u o h j e l m i e n k i n + k e h i t y s a p u o h j e l m i i m m e + k e h i t y s a p u o h j e l m i i n + k e h i t y s a p u o h j e l m i s s a + k e h i t y s a p u o h j e l m i s t a m m e + k e h i t y s a p u o p e r a a t i o i l l e + k e h i t y s a p u p o l i t i i k a l l e + k e h i t y s a p u p o l i t i i k a n + k e h i t y s a p u p o l i t i i k a s s a + k e h i t y s a p u p o l i t i i k a s s a a n + k e h i t y s a p u p o l i t i i k a s s a m m e + k e h i t y s a p u p o l i t i i k a s t a + k e h i t y s a p u p o l i t i i k a s t a a n + k e h i t y s a p u p o l i t i i k k a + k e h i t y s a p u p o l i t i i k k a a + k e h i t y s a p u p o l i t i i k k a a m m e + k e h i t y s a p u p o l i t i i k k a a n + k e h i t y s a p u p o l i t i i k k a m m e + k e h i t y s a p u p o l i t i i k k o j a a n + k e h i t y s a p u p o l i t i i k k o j e n + k e h i t y s a p u p o l i t i i k o i s s a + k e h i t y s a p u r a h a s t o j a + k e h i t y s a p u r a h a t + k e h i t y s a p u r a h o i s t a m m e + k e h i t y s a p u r a h o j e n + k e h i t y s a p u r i i p p u v u u t t a + k e h i t y s a p u s i t o u m u k s e t + k e h i t y s a p u s i t o u m u k s i i n + k e h i t y s a p u s i t o u m u k s i s t a + k e h i t y s a p u s i t o u m u s t e n + k e h i t y s a p u s o p i m u s + k e h i t y s a p u s o p i m u s t a + k e h i t y s a p u t a l o u s a r v i o t a + k e h i t y s a p u t a v o i t e + k e h i t y s a p u t a v o i t t e e n s a + k e h i t y s a p u t a v o i t t e i d e n + k e h i t y s a p u t o i m i a + k e h i t y s a p u t o i m i e n + k e h i t y s a p u t o i m i i m m e + k e h i t y s a p u t o i m i l l a + k e h i t y s a p u t u k i + k e h i t y s a p u t y ö n t e k i j ä n ä + k e h i t y s a p u t y ö n t e k i j ö i d e n + k e h i t y s a p u t y ö n t e k i j ö i l l e + k e h i t y s a p u u m m e + k e h i t y s a p u u n + k e h i t y s a p u v a r a t + k e h i t y s a p u v a r o i l l a + k e h i t y s a p u v a r o j a + k e h i t y s a p u v a r o j e n + k e h i t y s a p u v a r o j e n s a + k e h i t y s a p u y h t e i s t y ö t ä + k e h i t y s a p u y k s i k ö n + k e h i t y s a s i a l i s t a + k e h i t y s a s i a l i s t a l l a + k e h i t y s a s i a t + k e h i t y s a s i o i d e n + k e h i t y s a s i o i h i n + k e h i t y s a s i o i s s a + k e h i t y s a s i o i s t a + k e h i t y s a s k e l + k e h i t y s a s t e + k e h i t y s a s t e e l l a + k e h i t y s a s t e e l t a a n + k e h i t y s a s t e e n + k e h i t y s a s t e e n s a + k e h i t y s a s t e e s t a + k e h i t y s a s t e e t + k e h i t y s a s t e t t a + k e h i t y s a v u k s i + k e h i t y s a v u l l a + k e h i t y s a v u l l a m m e + k e h i t y s a v u l l e + k e h i t y s a v u n + k e h i t y s a v u n a n t a j a + k e h i t y s a v u s s a + k e h i t y s a v u s s a m m e + k e h i t y s a v u s t a + k e h i t y s a v u s t a a n + k e h i t y s a v u s t a m m e + k e h i t y s b i o l o g i a + k e h i t y s b u d j e t i n + k e h i t y s b u d j e t i s t a + k e h i t y s b u d j e t t i + k e h i t y s b u d j e t t i a + k e h i t y s e d e l l y t y k s e t + k e h i t y s e d e l l y t y k s i ä + k e h i t y s e d e l l y t y s t e n + k e h i t y s e h d o t u k s e t + k e h i t y s e h d o t u k s i a + k e h i t y s e n n u s t e + k e h i t y s e n n u s t e e t + k e h i t y s e r o + k e h i t y s e r o i h i n + k e h i t y s e r o i s t a + k e h i t y s e r o j a + k e h i t y s e r o j e n + k e h i t y s e r o t + k e h i t y s h a a s t e + k e h i t y s h a a s t e e t + k e h i t y s h a a s t e i d e n + k e h i t y s h a a s t e i s i i n + k e h i t y s h a a s t e i t a + k e h i t y s h a n k e + k e h i t y s h a n k e t t a + k e h i t y s h a n k k e e l l e + k e h i t y s h a n k k e e t + k e h i t y s h a n k k e i d e n + k e h i t y s h a n k k e i l l a + k e h i t y s h a n k k e i l l e + k e h i t y s h a n k k e i s i i n + k e h i t y s h a n k k e i s s a + k e h i t y s h a n k k e i s t a + k e h i t y s h a n k k e i t a + k e h i t y s h ä i r i ö i d e n + k e h i t y s h ä i r i ö i t ä + k e h i t y s h ä i r i ö t + k e h i t y s i n d e k s i n + k e h i t y s i n d i k a a t t o r e i s t a + k e h i t y s i n d i k a a t t o r e i t a + k e h i t y s i n s i n ö ö r i e n + k e h i t y s i n s t r u m e n t t e j a + k e h i t y s i n v e s t o i n n i t + k e h i t y s i n v e s t o i n t e j a + k e h i t y s j a k s o + k e h i t y s j a k s o a + k e h i t y s j ä r j e s t e l m ä + k e h i t y s j ä r j e s t e l m ä m m e + k e h i t y s j ä r j e s t ö + k e h i t y s j ä r j e s t ö j e n + k e h i t y s j ä r j e s t ö n + k e h i t y s j ä r j e s t ö ö n + k e h i t y s k a p a s i t e e t i n + k e h i t y s k a s v u n + k e h i t y s k a u d e n + k e h i t y s k e l p o i s i a + k e h i t y s k e r t o m u s + k e h i t y s k e s k u k s i a + k e h i t y s k e s k u s + k e h i t y s k e s k u s t e l u + k e h i t y s k e s k u s t e n + k e h i t y s k i e r r o k s e n + k e h i t y s k o m i t e a + k e h i t y s k o m i t e a a n + k e h i t y s k o n f e r e n s s i n + k e h i t y s k o n f e r e n s s i s s a + k e h i t y s k o n s e p t i n + k e h i t y s k r i i s i + k e h i t y s k r i i s i i n + k e h i t y s k r i t e e r i n + k e h i t y s k r i t e e r i t + k e h i t y s k r i t i i k k i + k e h i t y s k u i l u a + k e h i t y s k u i l u n + k e h i t y s k u i l u u n + k e h i t y s k u l k u a + k e h i t y s k u l k u a a n + k e h i t y s k u l k u u n + k e h i t y s k u l u i s t a + k e h i t y s k u l u n + k e h i t y s k u l u t + k e h i t y s k u m p p a n e i d e n + k e h i t y s k u m p p a n e i l l e m m e + k e h i t y s k u m p p a n e i t a a n + k e h i t y s k u m p p a n i e n + k e h i t y s k u m p p a n u u d e n + k e h i t y s k u s t a n n u k s e t + k e h i t y s k u s t a n n u k s i a + k e h i t y s k u s t a n n u k s i s t a + k e h i t y s k u s t a n n u s t e n + k e h i t y s k u v a s t a + k e h i t y s k y k y + k e h i t y s k y k y i n e n + k e h i t y s k y k y i s e n + k e h i t y s k y k y y n + k e h i t y s k y k y ä + k e h i t y s k y s y m y k s e e n + k e h i t y s k y s y m y k s e t + k e h i t y s k y s y m y k s i i n + k e h i t y s k y s y m y k s i s s ä + k e h i t y s k y s y m y k s i s t ä + k e h i t y s k y s y m y k s i ä + k e h i t y s k y s y m y s + k e h i t y s k y s y m y s t e n + k e h i t y s k y s y m y s t ä + k e h i t y s k y v y l l e + k e h i t y s k y v y n + k e h i t y s k ä y r ä ä + k e h i t y s l a a t i k o n + k e h i t y s l a a t i k o s t a + k e h i t y s l a i n a t + k e h i t y s l a i t o k s e t + k e h i t y s l a i t o s t e n + k e h i t y s l a u s e k e + k e h i t y s l a u s e k e t t a + k e h i t y s l i n j a a + k e h i t y s l i n j a n a + k e h i t y s l i n j a t + k e h i t y s l i n j o i l l e + k e h i t y s l i n j o i s t a + k e h i t y s l i n j o j a + k e h i t y s l ä h e s t y m i s t a v a n + k e h i t y s l ä h t ö i n e n + k e h i t y s m a a + k e h i t y s m a a h a n + k e h i t y s m a a h a n k k e i d e n + k e h i t y s m a a i l m a a n + k e h i t y s m a a k o n t a k t e i h i n + k e h i t y s m a a k s i + k e h i t y s m a a k u m p p a n e i d e n + k e h i t y s m a a k u m p p a n e i d e n s a + k e h i t y s m a a k u m p p a n e i h i m m e + k e h i t y s m a a k u m p p a n e i h i n s a + k e h i t y s m a a k u m p p a n e i s t a m m e + k e h i t y s m a a k u m p p a n i e n + k e h i t y s m a a k u m p p a n i e n s a + k e h i t y s m a a k u m p p a n i m m e + k e h i t y s m a a l a i s i l l e + k e h i t y s m a a l i s t a l l a + k e h i t y s m a a l l a + k e h i t y s m a a l l e + k e h i t y s m a a n + k e h i t y s m a a n a + k e h i t y s m a a n t i e d e + k e h i t y s m a a o s a p u o l i a + k e h i t y s m a a p o l i t i i k a n + k e h i t y s m a a p o l i t i i k k a + k e h i t y s m a a r a h a s t o n + k e h i t y s m a a r y h m i ä + k e h i t y s m a a r y h m ä n + k e h i t y s m a a s i j o i t u s t e n + k e h i t y s m a a s s a + k e h i t y s m a a s t a + k e h i t y s m a a s u h t e i d e n s a + k e h i t y s m a a t + k e h i t y s m a a t a + k e h i t y s m a a t a s o l l a + k e h i t y s m a a t k i n + k e h i t y s m a a t u t k i m u s + k e h i t y s m a a y s t ä v ä l l i n e n + k e h i t y s m a h d o l l i s u u d e n + k e h i t y s m a h d o l l i s u u d e t + k e h i t y s m a h d o l l i s u u k s i a + k e h i t y s m a h d o l l i s u u k s i a a n + k e h i t y s m a h d o l l i s u u k s i a m m e + k e h i t y s m a h d o l l i s u u k s i e n + k e h i t y s m a h d o l l i s u u k s i i n + k e h i t y s m a h d o l l i s u u k s i l l e + k e h i t y s m a h d o l l i s u u k s i s t a + k e h i t y s m a h d o l l i s u u s + k e h i t y s m a h d o l l i s u u t e n a + k e h i t y s m a h d o l l i s u u t e n s a + k e h i t y s m a i d e n + k e h i t y s m a i d e n k i n + k e h i t y s m a i h i n + k e h i t y s m a i h i n k i n + k e h i t y s m a i k s i + k e h i t y s m a i l l a + k e h i t y s m a i l l a k i n + k e h i t y s m a i l l e + k e h i t y s m a i l t a + k e h i t y s m a i n a + k e h i t y s m a i s s a + k e h i t y s m a i s s a k a a n + k e h i t y s m a i s s a k i n + k e h i t y s m a i s t a + k e h i t y s m a i t a + k e h i t y s m a i t a k a a n + k e h i t y s m a i t a k i n + k e h i t y s m a l l e i h i n + k e h i t y s m a l l e j a + k e h i t y s m a l l i + k e h i t y s m a l l i a + k e h i t y s m a l l i a a n + k e h i t y s m a l l i a k o + k e h i t y s m a l l i a m m e + k e h i t y s m a l l i e n + k e h i t y s m a l l i i m m e + k e h i t y s m a l l i i n + k e h i t y s m a l l i k s i + k e h i t y s m a l l i l l a + k e h i t y s m a l l i l l e + k e h i t y s m a l l i m m e + k e h i t y s m a l l i n + k e h i t y s m a l l i n s a + k e h i t y s m a l l i s s a + k e h i t y s m a l l i s t a + k e h i t y s m a l l i t + k e h i t y s m a r g i n a a l i + k e h i t y s m a s s a + k e h i t y s m e k a n i s m e i h i n + k e h i t y s m e k a n i s m e j a + k e h i t y s m e k a n i s m i + k e h i t y s m e n o j a + k e h i t y s m e n o t + k e h i t y s m e r k i n t ä + k e h i t y s m i n i s t e r e i d e n + k e h i t y s m i n i s t e r i + k e h i t y s m i n i s t e r i e n + k e h i t y s m i n i s t e r i n ä + k e h i t y s m ä ä r ä r a h o i s s a + k e h i t y s m ä ä r ä r a h o i s t a + k e h i t y s n e u v o s t o + k e h i t y s n e u v o s t o n + k e h i t y s n e u v o s t o s s a + k e h i t y s n e u v o t t e l u i s s a + k e h i t y s n o p e u s + k e h i t y s n o r m e j a + k e h i t y s n ä k e m y s t ä + k e h i t y s n ä k y m i e n + k e h i t y s n ä k y m i i n + k e h i t y s n ä k y m i s t ä + k e h i t y s n ä k y m i ä + k e h i t y s n ä k y m ä t + k e h i t y s n ä k ö k o h d a t + k e h i t y s n ä k ö k o h d i s t a + k e h i t y s n ä k ö k o h t a + k e h i t y s n ä k ö k o h t i a + k e h i t y s n ä k ö k o h t i e n + k e h i t y s n ä k ö k o h t i i n + k e h i t y s n ä k ö k u l m a + k e h i t y s n ä k ö k u l m a a + k e h i t y s n ä k ö k u l m a a n + k e h i t y s n ä k ö k u l m a n + k e h i t y s n ä k ö k u l m a s t a + k e h i t y s n ä k ö k u l m a t + k e h i t y s o h j e l m a + k e h i t y s o h j e l m a a + k e h i t y s o h j e l m a a n + k e h i t y s o h j e l m a l l a + k e h i t y s o h j e l m a l l e + k e h i t y s o h j e l m a l t a + k e h i t y s o h j e l m a m m e + k e h i t y s o h j e l m a n + k e h i t y s o h j e l m a n a + k e h i t y s o h j e l m a s s a + k e h i t y s o h j e l m a s t a + k e h i t y s o h j e l m a s u u n n i t t e l u p o l i t i i k o i l l e + k e h i t y s o h j e l m a t + k e h i t y s o h j e l m i a + k e h i t y s o h j e l m i e n + k e h i t y s o h j e l m i e n s a + k e h i t y s o h j e l m i i n + k e h i t y s o h j e l m i k s i + k e h i t y s o h j e l m i l l a + k e h i t y s o h j e l m i l l a a n + k e h i t y s o h j e l m i l l e + k e h i t y s o h j e l m i s s a + k e h i t y s o h j e l m i s s a m m e + k e h i t y s o h j e l m i s t a + k e h i t y s o n g e l m a + k e h i t y s o n g e l m a t + k e h i t y s o n g e l m i a + k e h i t y s o n g e l m i e n + k e h i t y s o n g e l m i i n + k e h i t y s o n g e l m i s t a + k e h i t y s o s a s t o j a + k e h i t y s o s a s t o l l a + k e h i t y s o s u u s + k e h i t y s p a i n o t t e i s e n + k e h i t y s p a k e t i n + k e h i t y s p a k e t i s s a + k e h i t y s p a k e t i s t a + k e h i t y s p a k e t t i + k e h i t y s p a k e t t i a + k e h i t y s p a l v e l u i d e n + k e h i t y s p a n k e i l l e + k e h i t y s p a n k e i s t a + k e h i t y s p a n k i k s i + k e h i t y s p a n k i l l e + k e h i t y s p a n k i n + k e h i t y s p a n k i s s a + k e h i t y s p a n k i s t a + k e h i t y s p a n k i t + k e h i t y s p a n k k i + k e h i t y s p a n k k i a + k e h i t y s p a n k k i e m m e + k e h i t y s p a n k k i e n + k e h i t y s p a n k k i i n + k e h i t y s p a n k k i n a + k e h i t y s p e r i a a t t e i t a + k e h i t y s p o l i i t i k k o + k e h i t y s p o l i i t i k k o j e n + k e h i t y s p o l i i t t i n e n + k e h i t y s p o l i i t t i s e n + k e h i t y s p o l i i t t i s e s t i + k e h i t y s p o l i i t t i s e t + k e h i t y s p o l i i t t i s i a + k e h i t y s p o l i i t t i s i l l e + k e h i t y s p o l i i t t i s i s s a + k e h i t y s p o l i i t t i s i s t a + k e h i t y s p o l i i t t i s t a + k e h i t y s p o l i i t t i s t e n + k e h i t y s p o l i t i i k a k s i + k e h i t y s p o l i t i i k a l l a + k e h i t y s p o l i t i i k a l l e + k e h i t y s p o l i t i i k a l l e e n + k e h i t y s p o l i t i i k a l t a + k e h i t y s p o l i t i i k a n + k e h i t y s p o l i t i i k a s s a + k e h i t y s p o l i t i i k a s s a a n + k e h i t y s p o l i t i i k a s s a m m e + k e h i t y s p o l i t i i k a s t a + k e h i t y s p o l i t i i k k a + k e h i t y s p o l i t i i k k a a + k e h i t y s p o l i t i i k k a a m m e + k e h i t y s p o l i t i i k k a a n + k e h i t y s p o l i t i i k k a a n s a + k e h i t y s p o l i t i i k k a h a n + k e h i t y s p o l i t i i k k a m m e + k e h i t y s p o l i t i i k k a n s a + k e h i t y s p o l i t i i k k o i h i n + k e h i t y s p o l i t i i k k o j a + k e h i t y s p o l i t i i k k o j e m m e + k e h i t y s p o l i t i i k k o j e n + k e h i t y s p o l i t i i k o i l l a + k e h i t y s p o l i t i i k o i l l e + k e h i t y s p o l i t i i k o i s s a + k e h i t y s p o n n i s t e l u i h i n + k e h i t y s p o n n i s t e l u i t a + k e h i t y s p o n n i s t e l u j a + k e h i t y s p o n n i s t e l u j e n + k e h i t y s p o n n i s t e l u t + k e h i t y s p o t e n t i a a l i + k e h i t y s p o t e n t i a a l i a + k e h i t y s p r i o r i t e e t i t + k e h i t y s p r o j e k t e i s s a + k e h i t y s p r o j e k t i + k e h i t y s p r o j e k t i e n + k e h i t y s p r o s e s s e i h i n + k e h i t y s p r o s e s s e i s s a + k e h i t y s p r o s e s s e i s s a a n + k e h i t y s p r o s e s s e i s t a + k e h i t y s p r o s e s s e j a + k e h i t y s p r o s e s s i + k e h i t y s p r o s e s s i a + k e h i t y s p r o s e s s i e n + k e h i t y s p r o s e s s i i n + k e h i t y s p r o s e s s i n + k e h i t y s p r o s e s s i s s a + k e h i t y s p r o s e s s i s t a + k e h i t y s p s y k o l o g i a + k e h i t y s p u i t t e i s i i n + k e h i t y s p u o l u e + k e h i t y s p u o l u e e n s a + k e h i t y s p u o l u e t t a + k e h i t y s p y r k i m y k s i s t ä + k e h i t y s p y r k i m y s t e n + k e h i t y s p ä i v i l l e + k e h i t y s p ä i v i l l ä + k e h i t y s p ä i v ä n + k e h i t y s p ä ä m ä ä r i ä + k e h i t y s p ä ä m ä ä r ä + k e h i t y s p ä ä m ä ä r ä t + k e h i t y s p ä ä o m a a + k e h i t y s r a h a s t o + k e h i t y s r a h a s t o a + k e h i t y s r a h a s t o i l l a + k e h i t y s r a h a s t o i l l e + k e h i t y s r a h a s t o i s s a + k e h i t y s r a h a s t o i s t a + k e h i t y s r a h a s t o j a + k e h i t y s r a h a s t o j e n + k e h i t y s r a h a s t o k o m i t e a s s a + k e h i t y s r a h a s t o l l a + k e h i t y s r a h a s t o l l e + k e h i t y s r a h a s t o n + k e h i t y s r a h a s t o o n + k e h i t y s r a h a s t o s s a + k e h i t y s r a h a s t o s t a + k e h i t y s r a h a s t o v a r o i s t a + k e h i t y s r a h o i t u k s e e n + k e h i t y s r a h o i t u k s e n + k e h i t y s r a h o i t u k s e s t a + k e h i t y s r a h o i t u s + k e h i t y s r a h o i t u s k o k o u k s e n + k e h i t y s r a h o i t u s k o n f e r e n s s i s s a + k e h i t y s r a h o i t u s t a + k e h i t y s r a h o i t u s y h t e i s t y ö + k e h i t y s r a k e n t e e n + k e h i t y s r a k e n t e i d e n + k e h i t y s r a p o r t i s s a + k e h i t y s r a t k a i s u t + k e h i t y s r e s u r s s e j a + k e h i t y s r e s u r s s e j a m m e + k e h i t y s r e s u r s s i t + k e h i t y s r i s k e j ä + k e h i t y s r i s k i s t ä + k e h i t y s r o o l i i n + k e h i t y s r y h m i e n + k e h i t y s r y h m ä + k e h i t y s r y h m ä n + k e h i t y s r y h m ä ä + k e h i t y s s a i r a u d e s t a + k e h i t y s s e k t o r e i l l a + k e h i t y s s e k t o r i n + k e h i t y s s e m i n a a r e j a + k e h i t y s s k e n a a r i o + k e h i t y s s o p i m u k s i a + k e h i t y s s o p i m u k s i e n + k e h i t y s s o p i m u k s i i n + k e h i t y s s o p i m u k s i l l e + k e h i t y s s o p i m u k s i s s a + k e h i t y s s o p i m u k s i s t a + k e h i t y s s o p i m u s + k e h i t y s s o p i m u s t a + k e h i t y s s o p i m u s t e n + k e h i t y s s t r a t e g i a + k e h i t y s s t r a t e g i a a + k e h i t y s s t r a t e g i a a n + k e h i t y s s t r a t e g i a l l a + k e h i t y s s t r a t e g i a l l e + k e h i t y s s t r a t e g i a m m e + k e h i t y s s t r a t e g i a n + k e h i t y s s t r a t e g i a n a + k e h i t y s s t r a t e g i a n s a + k e h i t y s s t r a t e g i a s s a + k e h i t y s s t r a t e g i a s s a a n + k e h i t y s s t r a t e g i a s s a m m e + k e h i t y s s t r a t e g i a s t a + k e h i t y s s t r a t e g i a t + k e h i t y s s t r a t e g i o i d e n + k e h i t y s s t r a t e g i o i h i n + k e h i t y s s t r a t e g i o i h i n s a + k e h i t y s s t r a t e g i o i l l e + k e h i t y s s t r a t e g i o i s s a + k e h i t y s s t r a t e g i o i s s a a n + k e h i t y s s t r a t e g i o i s t a + k e h i t y s s t r a t e g i o i s t a a n + k e h i t y s s t r a t e g i o i t a + k e h i t y s s t r a t e g i o i t a a n + k e h i t y s s u h t e i s s a + k e h i t y s s u u n n i s t a + k e h i t y s s u u n n i t e l m a + k e h i t y s s u u n n i t e l m a a + k e h i t y s s u u n n i t e l m a l l a + k e h i t y s s u u n n i t e l m a l l e + k e h i t y s s u u n n i t e l m a m m e + k e h i t y s s u u n n i t e l m a n + k e h i t y s s u u n n i t e l m a s s a + k e h i t y s s u u n n i t e l m a t + k e h i t y s s u u n n i t e l m i a + k e h i t y s s u u n n i t e l m i a a n + k e h i t y s s u u n n i t e l m i e n + k e h i t y s s u u n n i t e l m i i n + k e h i t y s s u u n n i t e l m i s s a + k e h i t y s s u u n n i t e l m i s t a + k e h i t y s s u u n n i t t e l u + k e h i t y s s u u n t a + k e h i t y s s u u n t a a n + k e h i t y s s u u n t a u k s e t + k e h i t y s s u u n t a u k s i a + k e h i t y s s u u n t a u s + k e h i t y s s u u n t a v i i v o j a + k e h i t y s s u u n t i a + k e h i t y s s u u n t i e n + k e h i t y s s u u n t i i n + k e h i t y s s u u n t i n a + k e h i t y s s y k l i + k e h i t y s s ä ä n n ö k s i ä + k e h i t y s t a h o j a + k e h i t y s t a h t i a + k e h i t y s t a l o u d e l l e + k e h i t y s t a p a a + k e h i t y s t a p o i h i n + k e h i t y s t a r k o i t u k s i i n + k e h i t y s t a r p e e t + k e h i t y s t a r p e i d e n + k e h i t y s t a r p e i d e n s a + k e h i t y s t a r p e i l t a a n + k e h i t y s t a r p e i s i i n + k e h i t y s t a r p e i s t a + k e h i t y s t a r p e i s t a a n + k e h i t y s t a r p e i t a + k e h i t y s t a s o + k e h i t y s t a s o a + k e h i t y s t a s o a a n + k e h i t y s t a s o a m m e + k e h i t y s t a s o i n d e k s e i h i n + k e h i t y s t a s o i s s a + k e h i t y s t a s o i s t a + k e h i t y s t a s o j a + k e h i t y s t a s o j e n + k e h i t y s t a s o l l a + k e h i t y s t a s o l l e + k e h i t y s t a s o l t a a n + k e h i t y s t a s o m m e + k e h i t y s t a s o n + k e h i t y s t a s o n s a + k e h i t y s t a s o o n + k e h i t y s t a s o s s a + k e h i t y s t a s o s t a + k e h i t y s t a s o t + k e h i t y s t a v o i s t a + k e h i t y s t a v o i t e + k e h i t y s t a v o i t e t t a + k e h i t y s t a v o i t t e e m m e + k e h i t y s t a v o i t t e e n + k e h i t y s t a v o i t t e e n a + k e h i t y s t a v o i t t e e n s a + k e h i t y s t a v o i t t e e s e e n + k e h i t y s t a v o i t t e e s t a + k e h i t y s t a v o i t t e e t + k e h i t y s t a v o i t t e i d e m m e + k e h i t y s t a v o i t t e i d e n + k e h i t y s t a v o i t t e i d e n s a + k e h i t y s t a v o i t t e i l l a + k e h i t y s t a v o i t t e i l t a a n + k e h i t y s t a v o i t t e i s i i m m e + k e h i t y s t a v o i t t e i s i i n + k e h i t y s t a v o i t t e i s i i n s a + k e h i t y s t a v o i t t e i s s a + k e h i t y s t a v o i t t e i s t a + k e h i t y s t a v o i t t e i t a + k e h i t y s t a v o i t t e i t a m m e + k e h i t y s t e h t ä v ä + k e h i t y s t e k i j ä + k e h i t y s t e k i j ö i k s i + k e h i t y s t e k i j ö i s t ä + k e h i t y s t e o r i o i h i n + k e h i t y s t i l a n n e + k e h i t y s t i l a n t e e s t a + k e h i t y s t o i m e n + k e h i t y s t o i m e n p i t e i d e n + k e h i t y s t o i m e t + k e h i t y s t o i m i a + k e h i t y s t o i m i e m m e + k e h i t y s t o i m i e n + k e h i t y s t o i m i i n + k e h i t y s t o i m i l l e + k e h i t y s t o i m i n + k e h i t y s t o i m i n n a n + k e h i t y s t o i m i n t a a + k e h i t y s t o i m i s t o j a + k e h i t y s t o i m i s t o l l e + k e h i t y s t u e k s i + k e h i t y s t u e n + k e h i t y s t u e s t a + k e h i t y s t u k e a + k e h i t y s t u k e e n + k e h i t y s t u k i a + k e h i t y s t u k i a p u a + k e h i t y s t u k i a s i o i s s a + k e h i t y s t u k i e n + k e h i t y s t u k i k e l p o i n e n + k e h i t y s t u k i t e h t ä v ä s s ä + k e h i t y s t u l o k s e t + k e h i t y s t u l o k s i i n + k e h i t y s t u l o k s i s t a + k e h i t y s t y ö + k e h i t y s t y ö h a n k k e e s t a + k e h i t y s t y ö h ö n + k e h i t y s t y ö h ö n s ä + k e h i t y s t y ö k u m p p a n i e m m e + k e h i t y s t y ö k y s y m y k s i s s ä + k e h i t y s t y ö n + k e h i t y s t y ö n s ä + k e h i t y s t y ö p a l v e l u s t a + k e h i t y s t y ö p o l i t i i k a l l e + k e h i t y s t y ö p o l i t i i k k a a + k e h i t y s t y ö p o n n i s t e l u i l l a + k e h i t y s t y ö s s ä + k e h i t y s t y ö s s ä m m e + k e h i t y s t y ö s t ä + k e h i t y s t y ö t ä + k e h i t y s t y ö t ä m m e + k e h i t y s t y ö t ä ä n + k e h i t y s t y ö v a l i o k u n n a n + k e h i t y s t y ö v a l i o k u n t a a + k e h i t y s t ä + k e h i t y s t ä ä n + k e h i t y s u l o t t u v u u d e n + k e h i t y s u l o t t u v u u d e s t a + k e h i t y s u l o t t u v u u s + k e h i t y s u l o t t u v u u t e e n + k e h i t y s u l o t t u v u u t t a + k e h i t y s u s k o a + k e h i t y s v a a t i m u k s e t + k e h i t y s v a a t i m u k s i e n + k e h i t y s v a i h e + k e h i t y s v a i h e e l l e + k e h i t y s v a i h e e n + k e h i t y s v a i h e e s e e n + k e h i t y s v a i h e e s s a + k e h i t y s v a i h e e s s a a n + k e h i t y s v a i h e e s t a + k e h i t y s v a i h e i d e n + k e h i t y s v a i h e i s i i n + k e h i t y s v a i h e i s s a + k e h i t y s v a i h e t t a + k e h i t y s v a i h t o e h t o j a + k e h i t y s v a i k u t u k s i a + k e h i t y s v a l i o k u n n a n + k e h i t y s v a l i o k u n n a s s a + k e h i t y s v a l i o k u n t a + k e h i t y s v a l i o k u n t a m m e + k e h i t y s v a l m i u k s i e n + k e h i t y s v a l t i o i d e n + k e h i t y s v a m m a + k e h i t y s v a m m a i s e n + k e h i t y s v a m m a i s i a + k e h i t y s v a m m a i s i k s i + k e h i t y s v a m m a i s i l l a + k e h i t y s v a m m a i s t e n + k e h i t y s v a m m o i s t a + k e h i t y s v a m m o j e n + k e h i t y s v a r o i n a + k e h i t y s v a r o i s t a + k e h i t y s v a r o j a + k e h i t y s v a r o j e n + k e h i t y s v a u h d i n + k e h i t y s v i r a n o m a i n e n + k e h i t y s v i r a s t o + k e h i t y s v i r a s t o k i n + k e h i t y s v i r a s t o k s i + k e h i t y s v o i m a l l e + k e h i t y s v o i m a s t a + k e h i t y s v ä l i n e + k e h i t y s v ä l i n e e t + k e h i t y s v ä l i n e i d e n + k e h i t y s v ä l i n e i t ä + k e h i t y s v ä l i n e t t ä + k e h i t y s y h t e i s p o l i t i i k k a + k e h i t y s y h t e i s t y ö + k e h i t y s y h t e i s t y ö a l o i t t e i t a + k e h i t y s y h t e i s t y ö a l o j e n + k e h i t y s y h t e i s t y ö a p u a + k e h i t y s y h t e i s t y ö a p u n a + k e h i t y s y h t e i s t y ö a p u u n + k e h i t y s y h t e i s t y ö a s i a t + k e h i t y s y h t e i s t y ö a s i o i s s a + k e h i t y s y h t e i s t y ö a s i o i s t a + k e h i t y s y h t e i s t y ö a s i o i t a + k e h i t y s y h t e i s t y ö a s p e k t i n + k e h i t y s y h t e i s t y ö a v u n + k e h i t y s y h t e i s t y ö a v u s t a + k e h i t y s y h t e i s t y ö b u d j e t e i s t a + k e h i t y s y h t e i s t y ö b u d j e t i n + k e h i t y s y h t e i s t y ö b u d j e t i s s a + k e h i t y s y h t e i s t y ö b u d j e t i s t a + k e h i t y s y h t e i s t y ö b u d j e t t i + k e h i t y s y h t e i s t y ö b u d j e t t i a + k e h i t y s y h t e i s t y ö h a n k e + k e h i t y s y h t e i s t y ö h a n k k e e n + k e h i t y s y h t e i s t y ö h a n k k e e t + k e h i t y s y h t e i s t y ö h a n k k e i d e n + k e h i t y s y h t e i s t y ö h a n k k e i l t a + k e h i t y s y h t e i s t y ö h a n k k e i s i i n + k e h i t y s y h t e i s t y ö h a n k k e i s s a + k e h i t y s y h t e i s t y ö h a n k k e i t a + k e h i t y s y h t e i s t y ö h e n k i l ö s t ö ä + k e h i t y s y h t e i s t y ö h ö m m e + k e h i t y s y h t e i s t y ö h ö n + k e h i t y s y h t e i s t y ö j ä r j e s t e l m ä n + k e h i t y s y h t e i s t y ö j ä r j e s t ö + k e h i t y s y h t e i s t y ö j ä r j e s t ö i l l e + k e h i t y s y h t e i s t y ö j ä r j e s t ö j e n + k e h i t y s y h t e i s t y ö j ä r j e s t ö j ä + k e h i t y s y h t e i s t y ö j ä r j e s t ö n + k e h i t y s y h t e i s t y ö j ä r j e s t ö t + k e h i t y s y h t e i s t y ö k a s v a t u s + k e h i t y s y h t e i s t y ö k e h y s t ä + k e h i t y s y h t e i s t y ö k e s k u s t e l u l l e + k e h i t y s y h t e i s t y ö k i e r r o k s e s s a + k e h i t y s y h t e i s t y ö k o m i s s a a r i n + k e h i t y s y h t e i s t y ö k o m i t e a + k e h i t y s y h t e i s t y ö k s i + k e h i t y s y h t e i s t y ö k u m p p a n e i l l a + k e h i t y s y h t e i s t y ö k u m p p a n e i l l e m m e + k e h i t y s y h t e i s t y ö k u m p p a n e i t a + k e h i t y s y h t e i s t y ö k u m p p a n i + k e h i t y s y h t e i s t y ö k u m p p a n i e m m e + k e h i t y s y h t e i s t y ö k u m p p a n i e n + k e h i t y s y h t e i s t y ö k u m p p a n i m m e + k e h i t y s y h t e i s t y ö k u m p p a n i t + k e h i t y s y h t e i s t y ö k y s y m y k s e e n + k e h i t y s y h t e i s t y ö k y s y m y k s i ä + k e h i t y s y h t e i s t y ö k ä y t ä n n ö n + k e h i t y s y h t e i s t y ö l l e + k e h i t y s y h t e i s t y ö l l e m m e + k e h i t y s y h t e i s t y ö l l ä + k e h i t y s y h t e i s t y ö m e n o j a + k e h i t y s y h t e i s t y ö m i n i s t e r e i d e n + k e h i t y s y h t e i s t y ö m i n i s t e r i + k e h i t y s y h t e i s t y ö m i n i s t e r i e n + k e h i t y s y h t e i s t y ö m i n i s t e r i n ä + k e h i t y s y h t e i s t y ö m i n i s t e r i t + k e h i t y s y h t e i s t y ö m m e + k e h i t y s y h t e i s t y ö m u o t o a + k e h i t y s y h t e i s t y ö m ä ä r ä r a h o i h i n + k e h i t y s y h t e i s t y ö m ä ä r ä r a h o i s t a + k e h i t y s y h t e i s t y ö m ä ä r ä r a h o j a + k e h i t y s y h t e i s t y ö m ä ä r ä r a h o j a m m e + k e h i t y s y h t e i s t y ö m ä ä r ä r a h o j e n + k e h i t y s y h t e i s t y ö n + k e h i t y s y h t e i s t y ö n e u v o s t o + k e h i t y s y h t e i s t y ö n e u v o s t o k i n + k e h i t y s y h t e i s t y ö n e u v o s t o l l a + k e h i t y s y h t e i s t y ö n e u v o s t o n + k e h i t y s y h t e i s t y ö n e u v o t t e l u i s s a m m e + k e h i t y s y h t e i s t y ö n t e k i j ö i d e n + k e h i t y s y h t e i s t y ö n t e k i j ö i s t ä + k e h i t y s y h t e i s t y ö o h j e l m a a n + k e h i t y s y h t e i s t y ö o h j e l m a l l a + k e h i t y s y h t e i s t y ö o h j e l m a l l a m m e + k e h i t y s y h t e i s t y ö o h j e l m a m m e + k e h i t y s y h t e i s t y ö o h j e l m a n + k e h i t y s y h t e i s t y ö o h j e l m a s t a + k e h i t y s y h t e i s t y ö o h j e l m a t + k e h i t y s y h t e i s t y ö o h j e l m i a + k e h i t y s y h t e i s t y ö o h j e l m i e m m e + k e h i t y s y h t e i s t y ö o h j e l m i e n + k e h i t y s y h t e i s t y ö o h j e l m i e n s a + k e h i t y s y h t e i s t y ö o h j e l m i i n + k e h i t y s y h t e i s t y ö o h j e l m i l l a + k e h i t y s y h t e i s t y ö o h j e l m i s s a + k e h i t y s y h t e i s t y ö o r g a n i s a a t i o i t a + k e h i t y s y h t e i s t y ö o s a s t o s t a + k e h i t y s y h t e i s t y ö p a k e t i s s a + k e h i t y s y h t e i s t y ö p a k e t t i a n n e + k e h i t y s y h t e i s t y ö p i l a r i n + k e h i t y s y h t e i s t y ö p o l i i t t i n e n + k e h i t y s y h t e i s t y ö p o l i i t t i s e s t a + k e h i t y s y h t e i s t y ö p o l i i t t i s i a + k e h i t y s y h t e i s t y ö p o l i i t t i s t e n + k e h i t y s y h t e i s t y ö p o l i t i i k a l l a + k e h i t y s y h t e i s t y ö p o l i t i i k a l l e + k e h i t y s y h t e i s t y ö p o l i t i i k a l l e m m e + k e h i t y s y h t e i s t y ö p o l i t i i k a n + k e h i t y s y h t e i s t y ö p o l i t i i k a s s a + k e h i t y s y h t e i s t y ö p o l i t i i k a s s a a n + k e h i t y s y h t e i s t y ö p o l i t i i k a s s a k i n + k e h i t y s y h t e i s t y ö p o l i t i i k a s s a m m e + k e h i t y s y h t e i s t y ö p o l i t i i k a s t a + k e h i t y s y h t e i s t y ö p o l i t i i k a s t a a n + k e h i t y s y h t e i s t y ö p o l i t i i k a s t a m m e + k e h i t y s y h t e i s t y ö p o l i t i i k a t + k e h i t y s y h t e i s t y ö p o l i t i i k k a + k e h i t y s y h t e i s t y ö p o l i t i i k k a a + k e h i t y s y h t e i s t y ö p o l i t i i k k a a m m e + k e h i t y s y h t e i s t y ö p o l i t i i k k a a n + k e h i t y s y h t e i s t y ö p o l i t i i k k a a n s a + k e h i t y s y h t e i s t y ö p o l i t i i k k a m m e + k e h i t y s y h t e i s t y ö p o l i t i i k k a n s a + k e h i t y s y h t e i s t y ö p o l i t i i k k o i h i n + k e h i t y s y h t e i s t y ö p o l i t i i k k o j a + k e h i t y s y h t e i s t y ö p o l i t i i k k o j e n + k e h i t y s y h t e i s t y ö p o l i t i i k o i l l a + k e h i t y s y h t e i s t y ö p o l i t i i k o i l t a + k e h i t y s y h t e i s t y ö p o l i t i i k o i s s a + k e h i t y s y h t e i s t y ö p o n n i s t e l u j a m m e + k e h i t y s y h t e i s t y ö p o n n i s t e l u t + k e h i t y s y h t e i s t y ö p r i o r i t e e t e i l l e + k e h i t y s y h t e i s t y ö p r o j e k t e j a + k e h i t y s y h t e i s t y ö p r o s e s s e j a + k e h i t y s y h t e i s t y ö p r o s e s s i e n + k e h i t y s y h t e i s t y ö p r o s e s s i i n + k e h i t y s y h t e i s t y ö p r o s e s s i t + k e h i t y s y h t e i s t y ö p ä i v i l l e + k e h i t y s y h t e i s t y ö p ä i v ä + k e h i t y s y h t e i s t y ö r a h a t + k e h i t y s y h t e i s t y ö r a h o i s t a + k e h i t y s y h t e i s t y ö r a h o i t u s t a + k e h i t y s y h t e i s t y ö r a h o j a + k e h i t y s y h t e i s t y ö r a h o j e n + k e h i t y s y h t e i s t y ö r y h m ä + k e h i t y s y h t e i s t y ö s o p i m u k s e n + k e h i t y s y h t e i s t y ö s o p i m u k s i a + k e h i t y s y h t e i s t y ö s o p i m u k s i s s a + k e h i t y s y h t e i s t y ö s o p i m u s + k e h i t y s y h t e i s t y ö s o p i m u s t a + k e h i t y s y h t e i s t y ö s o p i m u s t e n + k e h i t y s y h t e i s t y ö s s ä + k e h i t y s y h t e i s t y ö s s ä m m e + k e h i t y s y h t e i s t y ö s t r a t e g i a a + k e h i t y s y h t e i s t y ö s t r a t e g i a m m e + k e h i t y s y h t e i s t y ö s t r a t e g i a n + k e h i t y s y h t e i s t y ö s t r a t e g i a n s a + k e h i t y s y h t e i s t y ö s t r a t e g i a s t a + k e h i t y s y h t e i s t y ö s t r a t e g i o i d e m m e + k e h i t y s y h t e i s t y ö s t r a t e g i o i h i n + k e h i t y s y h t e i s t y ö s t ä + k e h i t y s y h t e i s t y ö s u h d e t t a + k e h i t y s y h t e i s t y ö s u h t e e n + k e h i t y s y h t e i s t y ö s u h t e i s s a a n + k e h i t y s y h t e i s t y ö s u u n n i t e l m i a + k e h i t y s y h t e i s t y ö s ä ä d ö k s e n + k e h i t y s y h t e i s t y ö s ä ä n n ö k s i ä + k e h i t y s y h t e i s t y ö t a v o i t t e e n a + k e h i t y s y h t e i s t y ö t a v o i t t e e t + k e h i t y s y h t e i s t y ö t a v o i t t e i d e n + k e h i t y s y h t e i s t y ö t a v o i t t e i s i i n + k e h i t y s y h t e i s t y ö t a v o i t t e i t a + k e h i t y s y h t e i s t y ö t e h t ä v ä m m e + k e h i t y s y h t e i s t y ö t e h t ä v ä s s ä n i + k e h i t y s y h t e i s t y ö t o i m e m m e + k e h i t y s y h t e i s t y ö t o i m i + k e h i t y s y h t e i s t y ö t o i m i a + k e h i t y s y h t e i s t y ö t o i m i e n + k e h i t y s y h t e i s t y ö t o i m i i n + k e h i t y s y h t e i s t y ö t o i m i l t a + k e h i t y s y h t e i s t y ö t u e s t a + k e h i t y s y h t e i s t y ö t u e s t a a n + k e h i t y s y h t e i s t y ö t u k i + k e h i t y s y h t e i s t y ö t u k i t a v o i t t e e n + k e h i t y s y h t e i s t y ö t ä + k e h i t y s y h t e i s t y ö t ä m m e + k e h i t y s y h t e i s t y ö t ä ä n + k e h i t y s y h t e i s t y ö u l o t t u v u u t e e n + k e h i t y s y h t e i s t y ö v a l i o k u n n a l l a + k e h i t y s y h t e i s t y ö v a l i o k u n n a l l e + k e h i t y s y h t e i s t y ö v a l i o k u n n a l l e m m e + k e h i t y s y h t e i s t y ö v a l i o k u n n a l t a + k e h i t y s y h t e i s t y ö v a l i o k u n n a n + k e h i t y s y h t e i s t y ö v a l i o k u n n a s s a + k e h i t y s y h t e i s t y ö v a l i o k u n n a s s a m m e + k e h i t y s y h t e i s t y ö v a l i o k u n n a s t a + k e h i t y s y h t e i s t y ö v a l i o k u n t a + k e h i t y s y h t e i s t y ö v a l i o k u n t a a + k e h i t y s y h t e i s t y ö v a l i o k u n t a a n + k e h i t y s y h t e i s t y ö v a l i o k u n t a k i n + k e h i t y s y h t e i s t y ö v a l i o k u n t a m m e + k e h i t y s y h t e i s t y ö v a l i o k u n t a n a + k e h i t y s y h t e i s t y ö v a l i o k u n t a n s a + k e h i t y s y h t e i s t y ö v a l m i u k s i e n + k e h i t y s y h t e i s t y ö v a r a m m e + k e h i t y s y h t e i s t y ö v a r a t + k e h i t y s y h t e i s t y ö v a r o i s t a + k e h i t y s y h t e i s t y ö v a r o j a + k e h i t y s y h t e i s t y ö v a r o j e n + k e h i t y s y h t e i s t y ö v e l v o i t t e i t a a n + k e h i t y s y h t e i s t y ö v i r a s t o + k e h i t y s y h t e i s t y ö v ä l i n e + k e h i t y s y h t e i s t y ö v ä l i n e e l l e + k e h i t y s y h t e i s t y ö v ä l i n e e l l ä + k e h i t y s y h t e i s t y ö v ä l i n e e n + k e h i t y s y h t e i s t y ö v ä l i n e e s e e n + k e h i t y s y h t e i s t y ö v ä l i n e e s s ä + k e h i t y s y h t e i s t y ö v ä l i n e e s t ä + k e h i t y s y h t e i s t y ö v ä l i n e i t ä ä n + k e h i t y s y h t e i s t y ö v ä l i n e t t ä + k e h i t y s y h t e i s t y ö y k s i k k ö j e n + k e h i t y s y h t e i s v a l i o k u n t a + k e h i t y s y h t e i s y ö v ä l i n e i d e n + k e h i t y s y h t e i s ö + k e h i t y s y h t e i s ö n + k e h i t y s y h t e i s ö s t ä + k e h i t y s y h t e i s ö ö n + k e h i t y s y h t e y k s i i n + k e h i t y s y k s i k k ö j ä + k e h i t y s y m p ä r i s t ö + k e h i t y s y r i t y k s e t + k e h i ä + k e h n o m m i n + k e h n o m p i a + k e h n o t + k e h n ä m i t t a r i + k e h n ä s i e n i + k e h o a a n + k e h o a m m e + k e h o n + k e h o n h o i t o l a i t t e e t + k e h o n k i e l i + k e h o n m u o k k a u s + k e h o n p a i n o h a r j o i t t e l u + k e h o o n s a + k e h o s t a + k e h o s t a a n + k e h o t a i d e + k e h o t a m m e + k e h o t a m m e k i n + k e h o t a n + k e h o t a n k i n + k e h o t e t a + k e h o t e t a a n + k e h o t e t a a n k i n + k e h o t e t t a v a + k e h o t e t t i i n + k e h o t e t t u + k e h o t i n + k e h o t i t t e + k e h o t t a a + k e h o t t a a k s e e n + k e h o t t a a k s e m m e + k e h o t t a a k s e n i + k e h o t t a e s s a + k e h o t t a e s s a a n + k e h o t t a e s s a m m e + k e h o t t a i s i m m e + k e h o t t a i s i n + k e h o t t a i s i n k i n + k e h o t t a k a a + k e h o t t a k a a m m e + k e h o t t a m a a n + k e h o t t a m a l l a + k e h o t t a m a t t a + k e h o t t a n e e t + k e h o t t a n u t + k e h o t t a v a t + k e h o t t i + k e h o t u k s e k s i + k e h o t u k s e s s a + k e h o t u k s i a + k e h o t u s t a + k e h r u u h u o n e + k e h r ä ä j ä m i t t a r i + k e h t a i s i + k e h u a + k e h u e n + k e h u i + k e h u i t t e + k e h u m i s t a + k e h u n u t + k e h u s k e l l a + k e h u t a + k e h u t a a n + k e h y k s e e n + k e h y k s e n + k e h y k s e t + k e h y k s i l l ä + k e h y k s i ä + k e h y s a s i a k i r j a a + k e h y s d i r e k t i i v i + k e h y s d i r e k t i i v i n + k e h y s d i r e k t i i v i s s ä + k e h y s d i r e k t i i v i s t ä + k e h y s d i r e k t i i v i ä + k e h y s e d e l l y t y k s i ä + k e h y s e h d o t + k e h y s e h d o t u k s e e n + k e h y s e h d o t u s + k e h y s j ä r j e s t e l m ä + k e h y s k a u d e n + k e h y s k e r t o m u s + k e h y s o h j e l m a l l a + k e h y s o h j e l m a n + k e h y s o h j e l m a s s a + k e h y s o h j e l m i s t a + k e h y s p ä ä t ö k s i i n + k e h y s p ä ä t ö k s i s t ä + k e h y s s o p i m u k s e n + k e h y s s o p i m u k s e s s a + k e h y s s o p i m u k s e s t a + k e h y s s o p i m u s + k e h y s s o p i m u s t e n + k e h y s t a l o u s a r v i o o n + k e h y s t y s p a l v e l u i t a + k e h ä k u k k a h a p p o + k e h ä k u l m a + k e h ä k u n i n k a a t + k e h ä l a j i + k e h ä l i h a s + k e h ä n + k e h ä p ä ä t e l m ä + k e h ä r a t a + k e h ä r o k o t u k s e e n + k e h ä r o k o t u s t a + k e h ä s a h a + k e h ä s s ä + k e h ä t i e + k e h ä t i e h a n k k e e n + k e h ä t i e n + k e h ä t y t t ö + k e i d a s s o i d e n + k e i d a s s o i l l a + k e i d a s s u o t + k e i d a s v a r p u n e n + k e i h ä s a k a a s i a + k e i h ä s h a a r a p a l m u + k e i h ä s k ä ä r m e + k e i h ä s m i t t a r i + k e i h ä s r a u s k u + k e i h ä s r a u s k u t + k e i h ä s t y t ö n k o r e n t o + k e i h ä ä n h e i t t o + k e i h ä ä n h e i t t ä j ä n ä + k e i j u k a l a + k e i j u t i i r a + k e i j u t i k k a + k e i k a h d u s p i s t e + k e i k a r i j a l o h a u k k a + k e i k a r i l i n t u h a u k k a + k e i k a r i t i k k a + k e i k u t t a a + k e i n o a + k e i n o h e d e l m ö i t y k s e e n + k e i n o h e d e l m ö i t y k s e l l ä + k e i n o h e d e l m ö i t y k s e n + k e i n o h e d e l m ö i t y s + k e i n o h e d e l m ö i t y s t ä + k e i n o h e d e l m ö i t y s y r i t y k s i s t ä + k e i n o h o r i s o n t t i + k e i n o i h i n + k e i n o i l l a + k e i n o i l t a + k e i n o i m m u u n i j ä r j e s t e l m ä + k e i n o i n + k e i n o i n a + k e i n o i s t a + k e i n o i s t a m m e + k e i n o j a + k e i n o j e n + k e i n o k a s t e l u a l u e i l l a + k e i n o k a s t e l u s u u n n i t e l m i e n + k e i n o k e m i a + k e i n o k s i + k e i n o k u d o s t a + k e i n o l a m m i k o i s s a + k e i n o l a n n o i t t e i d e n + k e i n o l i h a + k e i n o l t a + k e i n o m m e + k e i n o n + k e i n o n a + k e i n o r u s k e t u s a l a n + k e i n o s i e m e n n y k s e n + k e i n o s i e m e n n y k s e s s ä + k e i n o s i e m e n n y s + k e i n o s i e m e n n y s a l a + k e i n o s t a + k e i n o s y d ä n + k e i n o t + k e i n o t e k o i n e n + k e i n o t e k o i s e e n + k e i n o t e k o i s e m m a k s i + k e i n o t e k o i s e n + k e i n o t e k o i s e s t a + k e i n o t e k o i s e s t i + k e i n o t e k o i s i a + k e i n o t e k o i s i i n + k e i n o t e k o i s i n + k e i n o t e k o i s t a + k e i n o t e k o i s t e n + k e i n o t e l l a k s e e n + k e i n o t e l t a v a + k e i n o t o d e l l i s u u d e s s a + k e i n o t t e l e m a a n + k e i n o t t e l e m a l l a + k e i n o t t e l i j a t + k e i n o t t e l i j a t k i n + k e i n o t t e l i j a y s t ä v i s t ä ä n + k e i n o t t e l i j o i d e n + k e i n o t t e l i j o i l l e + k e i n o t t e l i j o i t a + k e i n o t t e l u a + k e i n o t t e l u h y ö k k ä y k s e n + k e i n o t t e l u h y ö k k ä y k s e t + k e i n o t t e l u h y ö k k ä y k s i ä + k e i n o t t e l u i l m i ö ö n + k e i n o t t e l u k a u p p a + k e i n o t t e l u k a u p p o i n a + k e i n o t t e l u k o n e i s t o j e n + k e i n o t t e l u k s i + k e i n o t t e l u k u p l a a n + k e i n o t t e l u k u p l a n + k e i n o t t e l u k u p l a t + k e i n o t t e l u k u p l i a + k e i n o t t e l u k u p l i e n + k e i n o t t e l u k ä y t t ä y t y m i s e n + k e i n o t t e l u l i i k k e i d e n + k e i n o t t e l u l l a + k e i n o t t e l u l u o n t e i s i a + k e i n o t t e l u m a f i a a + k e i n o t t e l u m a f i a n + k e i n o t t e l u m a h d o l l i s u u d e n + k e i n o t t e l u m a r k k i n a t + k e i n o t t e l u n + k e i n o t t e l u o d o t u k s e t + k e i n o t t e l u o n g e l m a a + k e i n o t t e l u o p e r a a t i o i l l a + k e i n o t t e l u p e l e i h i n s ä + k e i n o t t e l u p r o s e s s e j a + k e i n o t t e l u p ä ä o m a l l e + k e i n o t t e l u p ä ä o m a n + k e i n o t t e l u p ä ä o m i e n + k e i n o t t e l u s s a + k e i n o t t e l u s t a + k e i n o t t e l u t + k e i n o t t e l u t a l o u t t a + k e i n o t t e l u t a r k o i t u k s i i n + k e i n o t t e l u t o i m e t + k e i n o t t e l u t o i m i a + k e i n o t t e l u t o i m i e n + k e i n o t t e l u t o i m i i n + k e i n o t t e l u t o i m i l l e + k e i n o t t e l u t o i m i s t a + k e i n o t t e l u t y y p p i e n + k e i n o t t e l u u n + k e i n o t t e l u v a p a a + k e i n o t t e l u v a p a u t t a + k e i n o t t e l u v e r o s t a + k e i n o t t e l u v i m m a + k e i n o t t e l u v o i t o i l l e + k e i n o t t e l u v o i t o t + k e i n o t t e l u v o i t t o j a + k e i n o t t e l u v o i t t o j e n + k e i n o t t e l u v ä l i n e e k s i + k e i n o t u r k i k s e l t a + k e i n o t u r k i k s i n a + k e i n o v a l i k o i m a + k e i n o v a l i k o i m a s s a + k e i n o v a l i n t a + k e i n o v a l o s s a + k e i n o v e r i + k e i n u t u o l i + k e i n u v a n + k e i s a r i a m a t s o n i + k e i s a r i f r e g a t t i l i n t u + k e i s a r i h u m m e r i + k e i s a r i h u m m e r i a + k e i s a r i h u m m e r i k a n n o i l l e + k e i s a r i h u m m e r i k a n t o i h i n + k e i s a r i h u m m e r i k a n t o j a + k e i s a r i h u m m e r i k a n t o j e n + k e i s a r i h u m m e r i n + k e i s a r i h u m m e r i s a a l i i s s a + k e i s a r i h u m m e r i s a a l i i t + k e i s a r i k a l a + k e i s a r i k o t k a + k e i s a r i k o t k i a + k e i s a r i k u n n i s s a + k e i s a r i k ä r p ä s s i e n i + k e i s a r i l e i k k a u s + k e i s a r i l o k k i + k e i s a r i n + k e i s a r i n e l ä m ä n l a n k a + k e i s a r i n k a n a v a + k e i s a r i n l e i k k a u s t e n + k e i s a r i n p i k a r i l i l j a + k e i s a r i n v i h r e ä + k e i s a r i n v i i t t a + k e i s a r i p i n g v i i n i + k e i s a r i p u u + k e i s a r i s a r v i n o k k a + k e i s a r i s k o r p i o n i + k e i s a r i t a m a r i i n i + k e i s a r i t e t r a + k e i s a r i t u l i k ä r k i + k e i s a r i t u r a k o + k e i t t i ö j ä t e + k e i t t i ö j ä t t e i t ä + k e i t t i ö k a l u s t e e t + k e i t t i ö l a b o r a t o r i o s s a + k e i t t i ö s s ä + k e i t t i ö t a r i n o i t a + k e i t t i ö t a r v i k k e i t a + k e i t t i ö v e i t s i + k e i t t i ö v i s p i l ö i s s ä + k e i t t i ö v ä i t t e l y + k e i t t i ö v ä l i n e i d e n + k e i t t i ö v ä l i n e i s i i n + k e i t t i ö v ä l i n e i s s ä m m e + k e i t t o a + k e i t t o b a n a a n i + k e i t t o k i r j a + k e i t t o k i r j a a + k e i t t o k i r j a r e s e p t e j ä + k e i t t o l a i t t e i s i i n + k e i t t o l a i t t e i s t a + k e i t t o m a a l i + k e i t t o t a i d o n + k e i t t o t a i d o s t a + k e i t t o v ä l i n e i t ä + k e i t t ä m i s e e n + k e i t t ä m ö a l u s + k e k o k a n a + k e k o k o i + k e k o l a v a s t a j a + k e k o m u u r a h a i n e n + k e k o n o k k a k u t o j a + k e k o o n + k e k o v a l m u s k a + k e k s e l i ä i m m i l l ä + k e k s e l i ä i m m i s t ä + k e k s e l i ä i m p ä ä n + k e k s e l i ä i s y y t t ä + k e k s e l i ä i t ä + k e k s e l i ä ä m m ä s t ä + k e k s e l i ä ä m p i + k e k s e l i ä ä m p i ä + k e k s e l i ä ä m p ä ä + k e k s i e n + k e k s i k ä ä + k e k s i m ä n s ä + k e k s i m ä s s ä + k e k s i n n ö k s i + k e k s i n n ö l l i s y y d e n + k e k s i n n ö l l i s y y d e s s ä + k e k s i n n ö l l i s y y t e e n + k e k s i n t ö i h i n + k e k s i n t ö j e n + k e k s i n t ö j ä + k e k s i n t ö j ä ä n + k e k s i n t ö m e s s u i l l a + k e k s i n y t + k e k s i t e h t a a n + k e k s i t e o l l i s u u s a l a n + k e k s i t t y j ä + k e k s i ä + k e k s i ä k s e e n + k e k ä l e h a r j a t a n g a r a + k e k ä l e k a k a d u + k e k ä l e k e r t t u r a s t a s + k e k ä l e p e i p p o + k e k ä l e p i i s p a + k e l i o n g e l m a n + k e l k k a j e n g i + k e l k k a j ä ä k i e k k o + k e l k k a n n e + k e l k k a n s a + k e l l a r e i s s a + k e l l a r i h u o n e i s i i n + k e l l o h a t t u + k e l l o h y a s i n t t i + k e l l o j e n + k e l l o k a n e r v a + k e l l o k a t k e r o + k e l l o k u r j e n k a n e r v a + k e l l o k ö y n n ö s + k e l l o l a s i + k e l l o m e s i k k o + k e l l o n a i k a a n + k e l l o n a i k a j ä r j e s t e l m ä n + k e l l o n a j a n + k e l l o n s o i t t o + k e l l o p e l i a p p e l s i i n i + k e l l o p i k a r i k u l t t u u r i + k e l l o p u n a m e s i k k o + k e l l o s e p p ä v e r t a u s + k e l l o s i n i l a t v a + k e l l o t + k e l l o t a a j u u s + k e l l o t a l v i k k i + k e l l o t o r n i + k e l l u v i e n + k e l o p ä ä s k y + k e l p o i s i a + k e l p o i s u u s e h d o t + k e l p o i s u u s e h t o i h i n + k e l p o i s u u s e h t o j a + k e l p o i s u u s e h t o j e n + k e l p o i s u u s j ä r j e s t e l m ä + k e l p o i s u u s j ä r j e s t e l m ä s t ä + k e l p o i s u u s k o e + k e l p o i s u u s k o k e e n + k e l p o i s u u s k o k e e s e e n + k e l p o i s u u s k o k e e t + k e l p o i s u u s k o k e i d e n + k e l p o i s u u s k o k e i t a + k e l p o i s u u s k r i t e e r e i h i n + k e l p o i s u u s k r i t e e r e i s t ä + k e l p o i s u u s k r i t e e r e j ä + k e l p o i s u u s k r i t e e r i n ä + k e l p o i s u u s k r i t e e r i t + k e l p o i s u u s l u o k i t u k s e n + k e l p o i s u u s n o r m e j a + k e l p o i s u u s o i k e u d e t + k e l p o i s u u s o n g e l m i a + k e l p o i s u u s p e r u s t e e t + k e l p o i s u u s p e r u s t e i s i i n + k e l p o i s u u s p e r u s t e i t a + k e l p o i s u u s s ä ä n n ö i s t ä + k e l p o i s u u s s ä ä n t ö j e n + k e l p o i s u u s t a r k a s t u k s e n + k e l p o i s u u s v a a t i m u k s e t + k e l p o i s u u s v a a t i m u k s i n + k e l p o i s u u s v ä ä r i s t y m i l l e + k e l p u u t u s k o k e i s i i n + k e l t a b u l b u l i + k e l t a e v ä t o n n i k a l a + k e l t a h a a r a k a s + k e l t a h a p e r o + k e l t a h a r j a l e p i n k ä i n e n + k e l t a h e l m i p ö l l ö + k e l t a h e l t t a m e s i k k o + k e l t a h e l t t a v a h a k a s + k e l t a h e m p p o + k e l t a h e r t t u a k a l a + k e l t a h i e r a k k a + k e l t a h o u s u s i r k k u + k e l t a h u i s k u k e r t t u + k e l t a h y t y k k ä + k e l t a i s e n j o e n + k e l t a i s i a + k e l t a j a l k a k u r p p a + k e l t a j a l k a k y y h k y + k e l t a j a l k a l o k k i + k e l t a j a l k a t a t t i + k e l t a j a l k a v i k l o + k e l t a k a l j u m e s i k k o + k e l t a k a n n u s r u o h o + k e l t a k a r d i n a a l i + k e l t a k a r t t a j ä k ä l ä + k e l t a k a t k e r o + k e l t a k a u r a + k e l t a k e r t t u + k e l t a k e r t t u l i + k e l t a k i r v i n e n + k e l t a k o i v u + k e l t a k o s m o s + k e l t a k o t i l o a h v e n + k e l t a k u l m a k e r t t u l i + k e l t a k u l t a k ä p y + k e l t a k u r j e n m i e k k a + k e l t a k u r k k u b u l b u l i + k e l t a k u r k k u m e s i k k o + k e l t a k u r k k u v ä s t ä r ä k k i + k e l t a k u u m e + k e l t a k u u m e h y t t y n e n + k e l t a k ä r p ä s s i e n i + k e l t a k ä ä p i ö a h v e n + k e l t a l a h o r u s o k a s + k e l t a l a k k i k u t o j a + k e l t a l a u k k a + k e l t a l a u l u m e s i k k o + k e l t a l e h d o k k i + k e l t a l e v ä t + k e l t a l i e k o + k e l t a l i m a s e i t i k k i + k e l t a l u p i i n i + k e l t a l y i j y k e r t t u + k e l t a m a j a v a n k a a l i + k e l t a m a k s a r u o h o + k e l t a m a r j a k o t i n g a + k e l t a m a t a r a + k e l t a m e s i s i e n i + k e l t a m u s t a m o n a r k k i + k e l t a m ä n t y + k e l t a n a a m a k u t o j a + k e l t a n a r s i s s i + k e l t a n i i t t y p e r h o n e n + k e l t a n o k k a k o t i n g a + k e l t a n o k k a m e s i k k o + k e l t a o h d a k e + k e l t a o l i i v i s i e p p o + k e l t a o l k i y ö k k ö n e n + k e l t a o t s a s e p p ä + k e l t a p a i d a t + k e l t a p a r a t i i s i l i n t u + k e l t a p e i p p i + k e l t a p e r ä b u l b u l i + k e l t a p e r ä k e r t t u l i + k e l t a p e r ä p i i s p a + k e l t a p e r ä t i k k a + k e l t a p i e n n a r s i e n i + k e l t a p i i k k i u n i k k o + k e l t a p i n s e t t i k a l a + k e l t a p o s k i b u l b u l i + k e l t a p o s k i t r o g o n i + k e l t a p y r s t ö k e t t u k a l a + k e l t a p y r s t ö p i i k k i m a k r i l l i + k e l t a p y r s t ö v ä l s k ä r i + k e l t a p ä ä a m a t s o n i + k e l t a p ä ä h a u k k a + k e l t a p ä ä k a i j a n e n + k e l t a p ä ä k e r t t u l i + k e l t a p ä ä l u r i + k e l t a p ä ä m e s i k k o + k e l t a p ä ä s i r k k u + k e l t a r a p u t o k k o + k e l t a r a u h a n e n + k e l t a r e s e d a + k e l t a r i l l i k e r t t u l i + k e l t a r i n t a k e r t t u l i + k e l t a r i n t a l e p i n k ä i n e n + k e l t a r i n t a l u r i + k e l t a r i n t a m e s i k k o + k e l t a r i p s i m o n n i + k e l t a r i t a r i y ö k k ö n e n + k e l t a r o u s k u + k e l t a r o u s s i n + k e l t a s a u r a m o + k e l t a s e l k ä p i i s p a + k e l t a s i i p i p e i p p o + k e l t a s i i p i s i r k k u + k e l t a s i l k k i k e r t t u n e n + k e l t a s i l m ä p i n g v i i n i + k e l t a s i l m ä t r o g o n i + k e l t a s i l m ä v ä l s k ä r i + k e l t a s i n a p p i + k e l t a s o i h t u + k e l t a s o r m u s t i n k u k k a + k e l t a s u k a s n o k k a + k e l t a s u o l a h e i n ä m i t t a r i + k e l t a s ä i h k y b u l b u l i + k e l t a s ä n k i y ö k k ö n e n + k e l t a t a h m a y r t t i + k e l t a t a l v i k k i + k e l t a t i k k a + k e l t a t o k k o + k e l t a t u p p i n o k k a + k e l t a t ä p l ä b u l b u l i + k e l t a v a t s a k a r d i n a a l i + k e l t a v a t s a l e p i n k ä i n e n + k e l t a v a t s a m u r m e l i + k e l t a v i h r e ä ä + k e l t a v i i k s i b u l b u l i + k e l t a v i i r u b u l b u l i + k e l t a v u o k k o + k e l t a v y ö s e i t i k k i + k e l t a v ä l s k ä r i + k e l t a v ä s t ä r ä k k i + k e l t a ä n g e l m ä + k e l t t i e n m e r e n + k e l t t i e n m e r i + k e l t t i e n v i n t t i k o i r a + k e l t t i m e r i + k e l t t i t i i k e r i + k e l v o l l i s e m m a n + k e m i a l l i s e l l e + k e m i a l l i s e l t a + k e m i a l l i s e n + k e m i a l l i s e n a + k e m i a l l i s i a + k e m i a l l i s i i n + k e m i a l l i s i l l a + k e m i a l l i s i l l e + k e m i a l l i s i n + k e m i a l l i s i n a + k e m i a l l i s i s t a + k e m i a l l i s t e n + k e m i a n + k e m i a n a l a n + k e m i a n l a b o r a t o r i o + k e m i a n l a i t o k s e t + k e m i a n l a i t o s t a + k e m i a n o p e t t a j a n a + k e m i a n p a l k i n n o n + k e m i a n p a l k i n t o + k e m i a n p o l i t i i k k a + k e m i a n t e h d a s + k e m i a n t e h d a s t a + k e m i a n t e h t a a n + k e m i a n t e h t a a t + k e m i a n t e h t a i d e n + k e m i a n t e h t a i s i i n + k e m i a n t e h t a i t a + k e m i a n t e k n i i k k a + k e m i a n t e o l l i s u u d e l l a + k e m i a n t e o l l i s u u d e l l e + k e m i a n t e o l l i s u u d e n + k e m i a n t e o l l i s u u d e s s a + k e m i a n t e o l l i s u u d e s t a + k e m i a n t e o l l i s u u d e s t a m m e + k e m i a n t e o l l i s u u s + k e m i a n t e o l l i s u u t e e n + k e m i a n t e o l l i s u u t e m m e + k e m i a n t e o l l i s u u t t a + k e m i a n y r i t y s + k e m i a t e o l l i s u u d e n + k e m i k a a l e i h i n + k e m i k a a l e i l l a + k e m i k a a l e i l t a + k e m i k a a l e i s t a + k e m i k a a l e j a + k e m i k a a l i a + k e m i k a a l i a l a l l a + k e m i k a a l i a l a l l e + k e m i k a a l i a s e t u k s e e n + k e m i k a a l i a s e t u k s e l l a + k e m i k a a l i a s e t u k s e n + k e m i k a a l i a s e t u s + k e m i k a a l i a s e t u s t a + k e m i k a a l i a s i o i s t a + k e m i k a a l i d i r e k t i i v e j ä + k e m i k a a l i d i r e k t i i v i + k e m i k a a l i d i r e k t i i v i e h d o t u k s e n + k e m i k a a l i d i r e k t i i v i h ä n + k e m i k a a l i d i r e k t i i v i i n + k e m i k a a l i d i r e k t i i v i l l e + k e m i k a a l i d i r e k t i i v i n + k e m i k a a l i d i r e k t i i v i s t ä + k e m i k a a l i d i r e k t i i v i ä + k e m i k a a l i e n + k e m i k a a l i e n k ä y t t ö ä + k e m i k a a l i j ä r j e s t ö j e n + k e m i k a a l i k a a l i l a i n s ä ä d ä n t ö ä + k e m i k a a l i k y s y m y s + k e m i k a a l i l a i n s ä ä d ä n n ö k s i + k e m i k a a l i l a i n s ä ä d ä n n ö l l e + k e m i k a a l i l a i n s ä ä d ä n n ö l l ä + k e m i k a a l i l a i n s ä ä d ä n n ö n + k e m i k a a l i l a i n s ä ä d ä n n ö s s ä + k e m i k a a l i l a i n s ä ä d ä n n ö s t ä + k e m i k a a l i l a i n s ä ä d ä n t ö + k e m i k a a l i l a i n s ä ä d ä n t ö ä + k e m i k a a l i l a i n s ä ä d ä n t ö ä ä n + k e m i k a a l i l a i n s ä ä d ä n t ö ö n + k e m i k a a l i l a k i a + k e m i k a a l i o n n e t t o m u u d e n + k e m i k a a l i p a k e t i n + k e m i k a a l i p o h j a i s t e n + k e m i k a a l i p o l i t i i k a l l e + k e m i k a a l i p o l i t i i k a n + k e m i k a a l i p o l i t i i k a s s a + k e m i k a a l i p o l i t i i k a s t a + k e m i k a a l i p o l i t i i k k a + k e m i k a a l i p o l i t i i k k a a + k e m i k a a l i p o l i t i i k k a a m m e + k e m i k a a l i p o l i t i i k k a a n + k e m i k a a l i p o l i t i i k k a m m e + k e m i k a a l i p ä ä s t ö i s t ä + k e m i k a a l i r i s k e j ä + k e m i k a a l i r i s k i e n + k e m i k a a l i r y h m ä ä n + k e m i k a a l i s a a s t e i t a + k e m i k a a l i s t a + k e m i k a a l i s t r a t e g i a a + k e m i k a a l i s t r a t e g i a k s i + k e m i k a a l i s ä ä d ö k s e t + k e m i k a a l i s ä ä n t e l y + k e m i k a a l i s ä ä n t e l y ä + k e m i k a a l i t + k e m i k a a l i t a n k k e r e i d e n + k e m i k a a l i t a n k k e r i + k e m i k a a l i t e h t a a t + k e m i k a a l i t e o l l i s u u d e l l e + k e m i k a a l i t e o l l i s u u d e l t a + k e m i k a a l i t e o l l i s u u d e n + k e m i k a a l i t e o l l i s u u d e s s a + k e m i k a a l i t e o l l i s u u s + k e m i k a a l i t e o l l i s u u t t a + k e m i k a a l i t u o t a n t o + k e m i k a a l i t u o t a n t o a + k e m i k a a l i t u o t t a j i e n + k e m i k a a l i t u o t t e i d e n + k e m i k a a l i t u o t t e i t a + k e m i k a a l i t u r v a l l i s u u s + k e m i k a a l i t u r v a l l i s u u s r a p o r t i n + k e m i k a a l i t u r v a l l i s u u s r a p o r t i t + k e m i k a a l i t u r v a l l i s u u s r a p o r t t i + k e m i k a a l i t u r v a l l i s u u s r a p o r t t i a + k e m i k a a l i t u r v a l l i s u u s r a p o r t t i e n + k e m i k a a l i t u r v a l l i s u u t e e n + k e m i k a a l i u u d i s t u k s e n + k e m i k a a l i u u d i s t u s + k e m i k a a l i v a n a + k e m i k a a l i v i r a s t o + k e m i k a a l i v i r a s t o a + k e m i k a a l i v i r a s t o k a a n + k e m i k a a l i v i r a s t o l l a + k e m i k a a l i v i r a s t o l l e + k e m i k a a l i v i r a s t o n + k e m i k a a l i v i r a s t o o n + k e m i k a a l i v i r a s t o s s a + k e m i k a a l i v i r a s t o s t a + k e m i k a a l i y h d i s t e e t + k e m i k a a l i y h t i ö t + k e m i k a a l i y r i t y k s i s s ä + k e m i k a a l i y r i t y s t e n + k e n d o l i i t t o + k e n g i s t ä + k e n g u r u p o l i t i i k a k s i + k e n g u r u r y h m ä n + k e n g ä n n u m e r o + k e n g ä n p o h j a t + k e n i a l a i s e t + k e n i a l a i s p o l i i t i k o t + k e n i a l a i s t e n + k e n k i ä + k e n k ä p a r i n + k e n k ä p a r i s t a + k e n k ä p o m m i m i e h e n + k e n k ä t e h d a s t a + k e n k ä t e o l l i s u u d e n + k e n k ä t e o l l i s u u s + k e n k ä t e o l l i s u u t e e n + k e n k ä t e o l l i s u u t e n s a + k e n k ä t e o l l i s u u t t a + k e n k ä v o i d e + k e n n e l y s k ä + k e n n o p e r h o k a l a + k e n r a a l i a m i r a a l i + k e n r a a l i b a s s o + k e n r a a l i e v e r s t i + k e n r a a l i j u n t t a + k e n r a a l i k u v e r n ö ö r i + k e n r a a l i l u u t n a n t t i + k e n r a a l i m a j u r i + k e n r a a l i t + k e n t t ä a l u e i l l a + k e n t t ä a s i a n t u n t i j a m m e + k e n t t ä e d i t o r i + k e n t t ä h a n k k e i t a + k e n t t ä h a r j o i t u k s i a + k e n t t ä h e n k i l ö k u n t a a n + k e n t t ä h e n k i l ö s t ö l l e + k e n t t ä h e n k i l ö s t ö n + k e n t t ä h y y p p ä + k e n t t ä k a p a s i t e e t i n + k e n t t ä k e i t i n + k e n t t ä k e i t t i ö i t ä + k e n t t ä k e i t t o a s t i a + k e n t t ä k e r t t u l i + k e n t t ä k e r t t u n e n + k e n t t ä k i i t ä j ä i n e n + k e n t t ä k o e v a i h e e s t a + k e n t t ä k o k e i l l e + k e n t t ä k o k e i s i i n + k e n t t ä k o k e i t a + k e n t t ä k ä y n t e i h i n + k e n t t ä m y y r ä + k e n t t ä o i k e u s + k e n t t ä o p e r a a t i o i d e n + k e n t t ä o p e r a a t i o l l e + k e n t t ä p i i s p a + k e n t t ä p o s t i + k e n t t ä p u h e l i n + k e n t t ä p ä i v ä + k e n t t ä r a d i o + k e n t t ä r a t a + k e n t t ä r e s u r s s i e m m e + k e n t t ä s a i r a a l a + k e n t t ä s a i r a a l a a + k e n t t ä s a i r a a l a a n + k e n t t ä s a i r a a l a s s a + k e n t t ä s a i r a a l o i d e n + k e n t t ä s a i r a a l o i h i n + k e n t t ä s a i r a a l o i t a + k e n t t ä t a s o l l a + k e n t t ä t e s t a u k s e n + k e n t t ä t e s t a u s + k e n t t ä t u k e e n + k e n t t ä t u t k i m u s + k e n t t ä t u t k i m u s t a + k e n t t ä t u t k i m u s t u l o k s i l l a + k e n t t ä t y r ä k k i + k e n t t ä t y ö n + k e n t t ä t y ö n t e k i j ä m m e + k e n t t ä t y ö r y h m i e n + k e n t t ä t y ö t ä + k e n t t ä v a l v o n n a n + k e n t t ä v i e s t i j ä r j e s t e l m ä + k e n t t ä y h t ä l ö t + k e n t ä l l e + k e n t ä l l ä + k e n t ä l t ä + k e n t ä t + k e p p i h e v o n e n + k e p p i h e v o s e n a n i + k e p p i i n s ä + k e p p i m e n e t t e l y n + k e p p i n ä + k e p p i ä + k e p p o s e t + k e p u l i k o n s t e i h i n + k e p u l i k o n s t e i n + k e r a a m i s e t + k e r a m i i k k a t e o l l i s u u t t a + k e r a t a a n i s u l f a a t t i + k e r h o j e n + k e r h o n a + k e r j u u l l e + k e r j ä l ä i s i ä + k e r j ä l ä i s o o p p e r a + k e r j ä l ä i s v a l t i o + k e r j ä t ä ä n + k e r j ä y s m a f i o i d e n + k e r j ä ä m i s k i e l t o + k e r j ä ä v ä s t ä + k e r m a a + k e r m a j ä r j e s t e l y n + k e r m a s i e p p o + k e r m a s s a + k e r m a v a a h t o + k e r m a v a t s a b u l b u l i + k e r o s i i n i a + k e r o s i i n i n + k e r o s i i n i v e r o + k e r o s i i n i v e r o a + k e r o s i i n i v e r o n + k e r o s i i n i v e r o o n + k e r o s i i n i v e r o s t a + k e r o s i i n i v e r o t + k e r r a n n a i s v a i k u t u k s e n + k e r r a n n a i s v a i k u t u k s e s t a + k e r r a n n a i s v a i k u t u k s e t + k e r r a n n a i s v a i k u t u k s i a + k e r r a n n a i s v a i k u t u s + k e r r a n n a i s v a i k u t u s t a + k e r r a n n a i s v a i k u t u s t e n + k e r r a t a + k e r r o i n v a i k u t u k s e l l a + k e r r o i n v a i k u t u s + k e r r o i t t e + k e r r o k s e n + k e r r o k s i i n + k e r r o m m e + k e r r o n + k e r r o n k i n + k e r r o n p a + k e r r o n t a m e n e t e l m ä t + k e r r o p a + k e r r o s h y p y t + k e r r o s i n t r u u s i o + k e r r o s m a a l a u s + k e r r o s t a l o + k e r r o s t a l o a + k e r r o s t a l o a s u n n o i s s a + k e r r o s t a l o i h i n + k e r r o s t a l o i l l a + k e r r o s t a l o i s s a + k e r r o s t a l o i s t a + k e r r o s t a l o j a + k e r r o s t a l o p o m m i t + k e r r o s t a l o t + k e r r o t a a n + k e r r o t t a k o o n + k e r r o t t u + k e r r o t t u n a + k e r r y t t ä m i n e n + k e r s k a i l u a + k e r s k a i l u k s i + k e r t a a n + k e r t a j u o m i s e n + k e r t a j u o m i s t a + k e r t a j y s ä y k s e n ä + k e r t a k a i k k i s e n + k e r t a k a i k k i s i n a + k e r t a k o r v a u k s e n + k e r t a k o r v a u k s i a + k e r t a k o r v a u k s i n e e n + k e r t a k o r v a u s + k e r t a k ä y t t ö a j a t t e l u + k e r t a k ä y t t ö a j a t t e l u s t a + k e r t a k ä y t t ö a m e r i k k a l a i s e k s i + k e r t a k ä y t t ö a s t i a t + k e r t a k ä y t t ö e l ä m ä n m u o t o m m e + k e r t a k ä y t t ö h y ö d y k k e i t ä + k e r t a k ä y t t ö k a m e r a + k e r t a k ä y t t ö l a i t t e i t a + k e r t a k ä y t t ö m a a h a n m u u t t o p o l i t i i k k a + k e r t a k ä y t t ö p a k k a u k s i s t a + k e r t a k ä y t t ö p a k k a u s t e n + k e r t a k ä y t t ö s y ö m ä p u i k k o j a + k e r t a k ä y t t ö t a v a r a + k e r t a k ä y t t ö t a v a r o i d e n + k e r t a k ä y t t ö t u o t t e i n a + k e r t a k ä y t t ö t u o t t e i t a + k e r t a k ä y t t ö t y ö n t e k i j ä + k e r t a k ä y t t ö t y ö n t e k i j ö i l l e + k e r t a k ä y t t ö t y ö n t e k i j ö i t ä + k e r t a k ä y t t ö t ö l k e i s t ä + k e r t a k ä y t t ö t ö l k i t + k e r t a k ä y t t ö y h t e i s k u n n a n + k e r t a l u o n t e i n e n + k e r t a l u o n t e i s i a + k e r t a l u o n t o i s i a + k e r t a l u o n t o i s i s t a + k e r t a l u o n t o i s t e n + k e r t a m a k s u i h i n + k e r t a m a k s u j ä r j e s t e l m ä ä + k e r t a m a k s u j ä r j e s t e l m ä ä n + k e r t a m a k s u n + k e r t a m a k s u s t a + k e r t a m a k s u s u u n n i t e l m a + k e r t a p a l k k i o n + k e r t a s u m m a + k e r t a s u m m a n + k e r t a s u m m a n a + k e r t a s u m m i e n + k e r t a s u o r i t u k s e n + k e r t a s u o r i t u k s e t + k e r t a s u o r i t u s m a k s u j a + k e r t a s u o r i t u s m a k s u t + k e r t a s u o r i t u s t a + k e r t a s u o r i t u s t e n + k e r t a u s h a r j o i t u k s e t + k e r t a u s k o u l u t u s + k e r t a u s k u r s s e i h i n + k e r t a ä ä n e s t y k s e e n + k e r t a ä ä n e s t y s + k e r t a ä ä n e s t y s t ä + k e r t o a + k e r t o a k s e e n + k e r t o a k s e m m e + k e r t o a k s e n i + k e r t o a k s e n n e + k e r t o e s s a a n + k e r t o e s s a m m e + k e r t o e s s a n i + k e r t o i + k e r t o i k i n + k e r t o i m e l l a + k e r t o i s i k o + k e r t o i s i m m e + k e r t o i s i n + k e r t o i s i t t e + k e r t o i s i t t e k o + k e r t o i s i v a t + k e r t o i v a t + k e r t o k a a + k e r t o k a a m m e + k e r t o m a a n + k e r t o m a l l a + k e r t o m a n n e + k e r t o m a s t a + k e r t o m a t t a + k e r t o m e r k k i + k e r t o m u k s e e m m e + k e r t o m u k s e e n + k e r t o m u k s e l l e e n + k e r t o m u k s e n + k e r t o m u k s e n s a + k e r t o m u k s e s s a + k e r t o m u k s e s s a a n + k e r t o m u k s e s s a m m e + k e r t o m u k s e s s a n n e + k e r t o m u k s e s t a + k e r t o m u k s e s t a m m e + k e r t o m u k s e s t a n n e + k e r t o m u k s e t + k e r t o m u k s i a + k e r t o m u k s i i n + k e r t o m u k s i s t a + k e r t o m u s j a k s o n + k e r t o m u s k i n + k e r t o m u s l u o n n o k s e n + k e r t o m u s l u o n n o s + k e r t o m u s l u o n n o s t a + k e r t o m u s t a + k e r t o m u s t e n + k e r t o m u s t y ö s s ä + k e r t o o + k e r t o t a u l u + k e r t o v a n + k e r t o v a t + k e r t t u k u t o j a + k e r t t u l i t + k e r t t u r a s t a s + k e r t t u s b u l b u l i + k e r t t u s i r k k u + k e r t u t + k e r t y m ä k i e k k o + k e r t y m ä k y n n y s + k e r t y v i i n + k e r t y y + k e r u u j ä r j e s t e l m i e n + k e r u u j ä r j e s t e l m ä n + k e r u u j ä r j e s t e l m ä t + k e r u u j ä r j e s t e l m ä ä + k e r u u j ä r j e s t e l m ä ä n + k e r u u k u s t a n n u k s e t + k e r u u n + k e r u u s e e n + k e r u u t a + k e r ä i l y a j o n e u v o j a + k e r ä i l y a u t o j a + k e r ä i l y a u t o t + k e r ä i l y a u t o t k i n + k e r ä i l y k o r t i t + k e r ä i l y k o r t t i p e l i + k e r ä i l y s i i r r o l l a + k e r ä i l y s i i r r o t + k e r ä k u r m i t s a + k e r ä t t i i n + k e r ä t t y + k e r ä t t y j e n + k e r ä t t y j ä + k e r ä t t y ä + k e r ä t t y ä ä n + k e r ä t y i s t ä + k e r ä t y n + k e r ä t y t + k e r ä t ä + k e r ä t ä k s e e n + k e r ä t ä ä n + k e r ä y k s e e n + k e r ä y s a s t e + k e r ä y s a s t e e n + k e r ä y s a s t e e s e e n + k e r ä y s a s t e t t a + k e r ä y s j ä r j e s t e l m i e n + k e r ä y s j ä r j e s t e l m i i n + k e r ä y s j ä r j e s t e l m i ä + k e r ä y s j ä r j e s t e l m ä + k e r ä y s j ä r j e s t e l m ä n + k e r ä y s j ä r j e s t e l m ä t + k e r ä y s j ä r j e s t e l m ä ä + k e r ä y s k e s k u k s i s s a + k e r ä y s k i i n t i ö + k e r ä y s l a i t o k s i a + k e r ä y s m a h d o l l i s u u k s i a + k e r ä y s m e n e t e l m ä k s i + k e r ä y s p i s t e e s e e n + k e r ä y s p i s t e e s t ä + k e r ä y s p i s t e e t + k e r ä y s p i s t e i d e n + k e r ä y s p i s t e i s i i n + k e r ä y s p i s t e i s t ä + k e r ä y s p i s t e i t ä + k e r ä y s s t r a t e g i o i d e n + k e r ä y s t a v o i t e + k e r ä y s t a v o i t e t t a + k e r ä y s t a v o i t t e e k s i + k e r ä y s t a v o i t t e e n + k e r ä y s t a v o i t t e e t + k e r ä y s t a v o i t t e i d e n + k e r ä y s t a v o i t t e i s i i n + k e r ä y s t a v o i t t e i s t a + k e r ä y s t a v o i t t e i t a + k e r ä y s t ä + k e r ä y s v a a t i m u s t e n + k e r ä y s v e l v o l l i s u u d e s t a + k e r ä ä m i s a j a n + k e r ä ä m i s e e n + k e r ä ä m i s e k s i + k e r ä ä m i s e l l e + k e r ä ä m i s e n + k e r ä ä m i s e s t ä + k e r ä ä m i s k e i n o t + k e r ä ä m i s k u s t a n n u k s e t + k e r ä ä m i s l u v u n + k e r ä ä m i s t a v o i s t a + k e r ä ä m i s t ä + k e r ä ä m ä l l ä + k e r ä ä m ä s s ä + k e r ä ä m ä s t ä + k e r ä ä m ä ä n + k e r ä ä n t y n e e t + k e r ä ä v ä t + k e s a n n o i d u i l l a + k e s a n n o i k s i + k e s a n n o i n n i n + k e s a n n o i n n i s t a + k e s a n n o i n t i a + k e s a n n o i n t i a l a + k e s a n n o i n t i a l a n + k e s a n n o i n t i a l a s t a + k e s a n n o i n t i a l u e i t a + k e s a n n o i n t i a s t e e n + k e s a n n o i n t i a s t e e s t a + k e s a n n o i n t i i n + k e s a n n o i n t i j ä r j e s t e l m ä n + k e s a n n o i n t i j ä r j e s t e l m ä ä + k e s a n n o i n t i j ä r j e s t e l m ä ä n + k e s a n n o i n t i k a u t t a + k e s a n n o i n t i k o r v a u k s e n + k e s a n n o i n t i m a k s u + k e s a n n o i n t i m a k s u j e n + k e s a n n o i n t i m ä ä r i ä + k e s a n n o i n t i m ä ä r ä + k e s a n n o i n t i m ä ä r ä t + k e s a n n o i n t i o h j e l m a a + k e s a n n o i n t i o s u u k s i i n + k e s a n n o i n t i p a l k k i o i d e n + k e s a n n o i n t i p r o s e n t i n + k e s a n n o i n t i s ä ä n t e l y + k e s a n n o i n t i v e l v o i t e + k e s a n n o i n t i v e l v o i t e t t a + k e s a n n o i n t i v e l v o i t t e e n + k e s a n n o i n t i v e l v o i t t e e n s a + k e s a n n o i t u j e n + k e s a n n o l l a + k e s a n n o l l e + k e s a n t o a l a n + k e s a n t o a l u e i d e n + k e s a n t o a l u e i t a + k e s a n t o a s t e t t a + k e s a n t o m a a + k e s a n t o m a a l l a + k e s a n t o m a a t a + k e s a n t o m a i l l a + k e s a n t o m a i l l e + k e s a n t o m a i t a + k e s a n t o p e l l o i l l a + k e s a n t o p e l l o i l l a a n + k e s a n t o p e l t o j a + k e s a n t o p r o s e n t t i + k e s a n t o t u e s t a + k e s a n t o v i l j e l m i e n + k e s i s + k e s k e i s e e n + k e s k e i s e k s i + k e s k e i s e l l e + k e s k e i s e l l ä + k e s k e i s e m m ä k s i + k e s k e i s e m m ä l l e + k e s k e i s e m m ä n + k e s k e i s e m m ä s s ä + k e s k e i s e m p i + k e s k e i s e m p i e n + k e s k e i s e m p ä ä + k e s k e i s e m p ä ä n + k e s k e i s e n + k e s k e i s e n ä + k e s k e i s e s s ä + k e s k e i s e s t ä + k e s k e i s e t + k e s k e i s i i n + k e s k e i s i k s i + k e s k e i s i l l ä + k e s k e i s i l t ä + k e s k e i s i m m i l l e + k e s k e i s i m m i l l ä + k e s k e i s i m m i s s ä + k e s k e i s i m m i s t ä + k e s k e i s i m m ä k s i + k e s k e i s i m m ä n + k e s k e i s i m m ä s s ä + k e s k e i s i m m ä s t ä + k e s k e i s i m m ä t + k e s k e i s i m p i e n + k e s k e i s i m p i i n + k e s k e i s i m p i ä + k e s k e i s i m p ä n ä + k e s k e i s i m p ä ä n + k e s k e i s i n + k e s k e i s i n t ä + k e s k e i s i n ä + k e s k e i s i s s ä + k e s k e i s i s t ä + k e s k e i s i ä + k e s k e i s t e n + k e s k e i s t ä + k e s k e i s v o i m a + k e s k e n e r ä i s e k s i + k e s k e n e r ä i s e m p i + k e s k e n e r ä i s e n + k e s k e n e r ä i s e t + k e s k e n e r ä i s i s s ä + k e s k e n e r ä i s i s t ä + k e s k e n e r ä i s i ä + k e s k e n e r ä i s t e n + k e s k e n e r ä i s t ä + k e s k e n m e n o i s t a + k e s k e n m e n o n + k e s k e n ä ä n + k e s k e y t e t t i i n + k e s k e y t e t t y j e n + k e s k e y t e t t ä e s s ä + k e s k e y t e t y k s i + k e s k e y t e t y n + k e s k e y t e t y s t ä + k e s k e y t e t ä ä n + k e s k e y t e t ä ä n k ö + k e s k e y t i n + k e s k e y t i t t e + k e s k e y t t i + k e s k e y t t ä e s s ä ä n + k e s k e y t t ä m i s a s t e e n + k e s k e y t t ä m i s e e n + k e s k e y t t ä m i s e k s i + k e s k e y t t ä m i s e s t ä + k e s k e y t t ä m i s l a u s e k e + k e s k e y t t ä m i s l a u s e k k e e n + k e s k e y t t ä m i s l a u s e k k e e s e e n + k e s k e y t t ä m i s l a u s e k k e e s s a + k e s k e y t t ä m i s l u k u + k e s k e y t t ä m i s m e k a n i s m i a + k e s k e y t t ä m i s m e k a n i s m i s t a + k e s k e y t t ä m i s m e n e t t e l y n + k e s k e y t t ä m i s m e n e t t e l y ä + k e s k e y t t ä m i s p e r i a a t e t t a + k e s k e y t t ä m i s p y y n n ö n + k e s k e y t t ä m i s s o p i m u s t e n + k e s k e y t t ä m i s t a p a u k s i i n + k e s k e y t t ä m i s t o i m e n p i t e i s i i n + k e s k e y t t ä m i s t o i n t a + k e s k e y t t ä m i s t ä + k e s k e y t t ä m ä ä n + k e s k e y t t ä v i s t ä + k e s k e y t t ä ä + k e s k e y t t ä ä k s e e n + k e s k e y t y i + k e s k e y t y k s e t t ä + k e s k e y t y k s i l t ä + k e s k e y t y m i s r i s k i s t ä + k e s k e y t y m ä t ö n t ä + k e s k e y t y n y t + k e s k e y t y n y t t ä + k e s k e y t y s l a u s e k k e e n + k e s k e y t y s m e k a n i s m i + k e s k e y t y s m e k a n i s m i l l a + k e s k e y t y s m e n e t t e l y n + k e s k e y t y s m e n e t t e l y y n + k e s k e y t y y + k e s k e y t ä m m e + k e s k e y t ä n + k e s k i a a l t o l ä h e t y k s e t + k e s k i a a l t o l ä h e t y k s i i n + k e s k i a a s i a l a i n e n + k e s k i a a s i a l a i s e e n + k e s k i a a s i a l a i s e n + k e s k i a a s i a l a i s t a + k e s k i a a s i a s s a + k e s k i a f r i k a n + k e s k i a f r i k a s s a + k e s k i a i k a + k e s k i a i k a a + k e s k i a i k a a n + k e s k i a i k a i n e n + k e s k i a i k a i s e e n + k e s k i a i k a i s e k s i + k e s k i a i k a i s e l l e + k e s k i a i k a i s e t + k e s k i a i k a i s t a + k e s k i a i k a i s t e n + k e s k i a i k a n a + k e s k i a i k a t a p a h t u m a + k e s k i a j a k s i + k e s k i a j a l l a + k e s k i a j a l l e + k e s k i a j a l t a + k e s k i a j a n + k e s k i a j a s t a + k e s k i a l u e i d e n + k e s k i a m e r i k k a l a i n e n + k e s k i a m e r i k k a l a i s e n + k e s k i a m e r i k k a l a i s e s s a + k e s k i a m e r i k k a l a i s i l l e + k e s k i a m e r i k k a l a i s t e n + k e s k i a n o m a l i a + k e s k i a n s i o + k e s k i a n s i o i h i n + k e s k i a n s i o i s t a + k e s k i a n s i o t + k e s k i a r v o + k e s k i a r v o a + k e s k i a r v o j a + k e s k i a r v o l u v u n + k e s k i a r v o n + k e s k i a r v o s t a + k e s k i a s t e e l l e + k e s k i a s t e e l t a + k e s k i a s t e e n + k e s k i a t l a k s e n t a m a z i g h t + k e s k i b i k o l + k e s k i e n g l a n t i + k e s k i e u r o o p p a l a i n e n + k e s k i e u r o o p p a l a i s e n + k e s k i e u r o o p p a l a i s e n a + k e s k i e u r o o p p a l a i s e t + k e s k i e u r o o p p a l a i s i l l a + k e s k i e u r o o p p a l a i s i l l e + k e s k i e u r o o p p a l a i s i l t a + k e s k i e u r o o p p a l a i s i s t a + k e s k i e u r o o p p a l a i s t a + k e s k i e u r o o p p a l a i s t e n + k e s k i h a k u v o i m a + k e s k i h i n n a t + k e s k i h i n t a + k e s k i h i n t a a + k e s k i h i n t a l u o k a n + k e s k i h i n t a n s a + k e s k i h i n t o j a + k e s k i h i n t o j e n + k e s k i j o h d o n + k e s k i j o h d o s s a + k e s k i j u r a k a u s i + k e s k i k a i d e t i e + k e s k i k a s t i i n + k e s k i k e s ä l l ä + k e s k i k e s ä n + k e s k i k o h d a n + k e s k i k o h t a a + k e s k i k o k o + k e s k i k o k o i n e n + k e s k i k o k o i s e e n + k e s k i k o k o i s e l l a + k e s k i k o k o i s e l t a + k e s k i k o k o i s e n + k e s k i k o k o i s e n a + k e s k i k o k o i s e s s a + k e s k i k o k o i s e s t a + k e s k i k o k o i s e t + k e s k i k o k o i s i a + k e s k i k o k o i s i i n + k e s k i k o k o i s i k s i + k e s k i k o k o i s i l l a + k e s k i k o k o i s i l l e + k e s k i k o k o i s i s s a + k e s k i k o k o i s i s t a + k e s k i k o k o i s t a + k e s k i k o k o i s t e n + k e s k i k o k o o n + k e s k i k o o s t a + k e s k i k o r k e u t t a + k e s k i k u r s s i + k e s k i k u u k a u s i p a l k k a + k e s k i l e v e y s a s t e e t + k e s k i l i i k e + k e s k i l i i k e r e s o n a n s s i + k e s k i l o n t o o l a i s e n + k e s k i l u k u + k e s k i l u o k a k s i + k e s k i l u o k a l l a + k e s k i l u o k a l l e + k e s k i l u o k a n + k e s k i l u o k a s t a + k e s k i l u o k a t + k e s k i l u o k i l l a + k e s k i l u o k k a + k e s k i l u o k k a a + k e s k i l u o k k a a n + k e s k i l u o k k a i s e t + k e s k i l u o k k a i s i a + k e s k i l u o k k a i s i l l e + k e s k i l u o k k a i s t a + k e s k i l u o k k i e n + k e s k i l ä m m ö n + k e s k i l ä m p ö t i l a + k e s k i l ä m p ö t i l a a + k e s k i l ä m p ö t i l a k s i + k e s k i l ä m p ö t i l a n + k e s k i l ä m p ö t i l o j e n + k e s k i l ä n n e n + k e s k i l ä n n e s s ä + k e s k i l ä n s i + k e s k i m a a s t o s t a + k e s k i m a t k a n + k e s k i m ä ä r ä i n e n + k e s k i m ä ä r ä i s e e n + k e s k i m ä ä r ä i s e n + k e s k i m ä ä r ä i s e t + k e s k i m ä ä r ä i s t ä + k e s k i n k e r t a i s i s t a + k e s k i n k e r t a i s t e n + k e s k i n k e r t a i s u u d e s t a + k e s k i n o p e u s + k e s k i n o r m a a l i + k e s k i n ä i s e e n + k e s k i n ä i s e n + k e s k i n ä i s e s s ä + k e s k i n ä i s e s t ä + k e s k i n ä i s e t + k e s k i n ä i s i i n + k e s k i n ä i s i l l e + k e s k i n ä i s i s s ä + k e s k i n ä i s i s t ä + k e s k i n ä i s i ä + k e s k i n ä i s t e n + k e s k i n ä i s t ä + k e s k i o s a a + k e s k i o s a n + k e s k i o s a s s a + k e s k i o s a t + k e s k i o s i s t a + k e s k i p a k o i s v o i m a + k e s k i p a k o i s v o i m i a + k e s k i p a l k a s t a + k e s k i p a l k k a + k e s k i p a l k k o j a + k e s k i p a l k k o j e n + k e s k i p a l k o i s t a + k e s k i p e l i + k e s k i p i s t e + k e s k i p i s t e e k s i + k e s k i p i s t e e n ä + k e s k i p i s t e e s e e n + k e s k i p i s t e e s s ä + k e s k i p i s t e e t + k e s k i p i s t e t t ä + k e s k i p i t k i l l ä + k e s k i p i t k i n ä + k e s k i p i t k i s t ä + k e s k i p i t k ä l l e + k e s k i p i t k ä l l ä + k e s k i p i t k ä n + k e s k i p i t k ä ä + k e s k i p i t u u s + k e s k i p l a t o n i s m i + k e s k i p o h j o i n e n + k e s k i p ä i v ä l l ä + k e s k i p ä i v ä ä + k e s k i p ä i v ä ä n + k e s k i s a a r e n t o + k e s k i s e l ä n n e + k e s k i s o r m i + k e s k i s u r i l l e + k e s k i s u u r e e n + k e s k i s u u r e l l a + k e s k i s u u r e l l e + k e s k i s u u r e l t a + k e s k i s u u r e n + k e s k i s u u r e n a + k e s k i s u u r e s s a + k e s k i s u u r e s t a + k e s k i s u u r e t + k e s k i s u u r i + k e s k i s u u r i a + k e s k i s u u r i e n + k e s k i s u u r i i n + k e s k i s u u r i l l a + k e s k i s u u r i l l e + k e s k i s u u r i l t a + k e s k i s u u r i n + k e s k i s u u r i s s a + k e s k i s u u r i s t a + k e s k i s u u r i y r i t y k s i ä + k e s k i s u u r t a + k e s k i s u u r t e n + k e s k i s y k s y n + k e s k i s y v y y s + k e s k i s ä i l i ö i s s ä + k e s k i t a a j u i s t e n + k e s k i t a l v i + k e s k i t a s o + k e s k i t a s o a + k e s k i t a s o l l a + k e s k i t a s o l l e + k e s k i t a s o n + k e s k i t a s o s t a + k e s k i t e t t y i h i n + k e s k i t e t t y j e n + k e s k i t e t t y j ä + k e s k i t e t t y n ä + k e s k i t e t t y ä + k e s k i t e t t ä i s i i n + k e s k i t e t y l l e + k e s k i t e t y l l ä + k e s k i t e t y m m i n + k e s k i t e t y m m i s t ä + k e s k i t e t y m m ä k s i + k e s k i t e t y m m ä l l ä + k e s k i t e t y m m ä n + k e s k i t e t y m m ä s t ä + k e s k i t e t y m p i + k e s k i t e t y m p ä ä + k e s k i t e t y n + k e s k i t e t y s s ä + k e s k i t e t y s t ä + k e s k i t e t y t + k e s k i t e t ä ä n + k e s k i t i e + k e s k i t i e n + k e s k i t i e t ä + k e s k i t r i a s k a u s i + k e s k i t t i + k e s k i t t y i + k e s k i t t y i s i n + k e s k i t t y k ä ä + k e s k i t t y k ä ä m m e + k e s k i t t y m i e n + k e s k i t t y m i i n + k e s k i t t y m i l t ä + k e s k i t t y m i s a s t e + k e s k i t t y m i s e e n + k e s k i t t y m i s e n + k e s k i t t y m i s e s t ä + k e s k i t t y m i s h ä i r i ö i n ä + k e s k i t t y m i s i l m i ö n + k e s k i t t y m i s i l m i ö t ä + k e s k i t t y m i s k e h i t y k s e n + k e s k i t t y m i s k y k y ä + k e s k i t t y m i s o n g e l m i i n + k e s k i t t y m i s p r o s e s s e i h i n + k e s k i t t y m i s p r o s e s s i + k e s k i t t y m i s p r o s e s s i a + k e s k i t t y m i s p r o s e s s i l l a + k e s k i t t y m i s p r o s e s s i n + k e s k i t t y m i s p y r k i m y s t e n + k e s k i t t y m i s t a p a u k s i s t a + k e s k i t t y m i s t a s o + k e s k i t t y m i s t o i m i e n + k e s k i t t y m i s t ä + k e s k i t t y m i s v a i h e + k e s k i t t y m i s v a i k e u k s i a + k e s k i t t y m i ä + k e s k i t t y m ä a s i a k i r j o i s s a + k e s k i t t y m ä l l ä + k e s k i t t y m ä s ä ä n n ö t + k e s k i t t y m ä s ä ä n t ö + k e s k i t t y m ä t + k e s k i t t y n e e m m i n + k e s k i t t y n e e m p i + k e s k i t t y n e e m p i e n + k e s k i t t y n e e m p ä ä + k e s k i t t y n y t t ä + k e s k i t t y v ä + k e s k i t t y v ä n + k e s k i t t y v ä t + k e s k i t t y y + k e s k i t t y y k i n + k e s k i t t y ä + k e s k i t t y ä k s e e n + k e s k i t t y ä k ö + k e s k i t t ä k ä ä m m e + k e s k i t t ä m i s e k s i + k e s k i t t ä m i s e n + k e s k i t t ä m i s p e r i a a t e t t a + k e s k i t t ä m i s p e r i a a t t e e n + k e s k i t t ä m i s p r o s e s s i + k e s k i t t ä m i s p r o s e s s i a + k e s k i t t ä m i s p r o s e s s i n + k e s k i t t ä m i s p y r k i m y k s i ä + k e s k i t t ä m i s s ä ä n n ö n + k e s k i t t ä m i s s ä ä n n ö t + k e s k i t t ä m i s s ä ä n t ö ö n + k e s k i t t ä m i s t ä + k e s k i t t ä m i s v a i k u t u s + k e s k i t t ä m i s v ä l i n e e k s i + k e s k i t t ä m ä l l ä + k e s k i t t ä m ä ä n + k e s k i t t ä ä + k e s k i t t ä ä k s e e n + k e s k i t t ä ä k ö + k e s k i t u l o + k e s k i t u l o i n e n + k e s k i t u l o i s i a + k e s k i t u l o i s i l l e + k e s k i t u l o i s i s s a + k e s k i t u l o i s t a + k e s k i t u l o i s t e n + k e s k i t u l o n + k e s k i t u l o t + k e s k i t u l o t a s o + k e s k i t u l o t a s o a + k e s k i t u l o t a s o n + k e s k i t u l o t a s o s t a + k e s k i t u o t a n t o m ä ä r ä + k e s k i t u o t t a v u u s + k e s k i t y m m e + k e s k i t y n + k e s k i t y n k i n + k e s k i t y s l e i r e i h i n + k e s k i t y s l e i r e i k s i + k e s k i t y s l e i r e i l l e + k e s k i t y s l e i r e i l l ä + k e s k i t y s l e i r e i l l ä ä n + k e s k i t y s l e i r e i l t ä + k e s k i t y s l e i r e i n e e n + k e s k i t y s l e i r e i s s ä + k e s k i t y s l e i r e i s t ä + k e s k i t y s l e i r e j ä + k e s k i t y s l e i r i + k e s k i t y s l e i r i e n + k e s k i t y s l e i r i i n + k e s k i t y s l e i r i k s i + k e s k i t y s l e i r i l l e + k e s k i t y s l e i r i l l ä + k e s k i t y s l e i r i m u i s t o m e r k k i e n + k e s k i t y s l e i r i n + k e s k i t y s l e i r i s s ä + k e s k i t y s l e i r i s t ä + k e s k i t y s l e i r i t + k e s k i t y s l e i r i t r a g e d i a a + k e s k i t y s l e i r i ä + k e s k i t y t t i i n + k e s k i t y t t y + k e s k i t y t t ä i s i i n + k e s k i t y t ä ä n + k e s k i t y t ä ä n p ä + k e s k i t y ö a i k a a + k e s k i t ä t t e + k e s k i v a l t a k u n t a + k e s k i v a r t a l o l i h a v u u s + k e s k i v e r t o a + k e s k i v e r t o a s u k k a a t + k e s k i v e r t o a u t o i l i j a l l e + k e s k i v e r t o e s p a n j a l a i s e l l e + k e s k i v e r t o e u r o o p p a l a i n e n + k e s k i v e r t o e u r o o p p a l a i s e s t a + k e s k i v e r t o h i n t o j a + k e s k i v e r t o h ö l k k ä ä j ä + k e s k i v e r t o i h m i n e n + k e s k i v e r t o i h m i s e l l e + k e s k i v e r t o i h m i s e n + k e s k i v e r t o i r a k i l a i n e n + k e s k i v e r t o k a n s a l a i n e n + k e s k i v e r t o k a n s a l a i s e l l e + k e s k i v e r t o k a n s a l a i s e n + k e s k i v e r t o k a n s a l a i s e s t a + k e s k i v e r t o k a n s a l a i s e t + k e s k i v e r t o k a n s a l a i s t e n + k e s k i v e r t o k a u p a n + k e s k i v e r t o k o n s u l t i n + k e s k i v e r t o k u l u t t a j a + k e s k i v e r t o k u l u t t a j a a + k e s k i v e r t o k u l u t t a j a n + k e s k i v e r t o k u l u t t a j a n a + k e s k i v e r t o k u l u t t a j a t + k e s k i v e r t o k u l u t t a j i s t a + k e s k i v e r t o l e h m ä + k e s k i v e r t o m a a h a n m u u t t a j a + k e s k i v e r t o m a a n v i l j e l i j ä + k e s k i v e r t o m a a t + k e s k i v e r t o m a t k a i l i j o i t a + k e s k i v e r t o m a t k u s t a j a n + k e s k i v e r t o m a t k u s t a j i a + k e s k i v e r t o p a l k a s t a + k e s k i v e r t o p a r l a m e n t a a r i k k o + k e s k i v e r t o p e r h e + k e s k i v e r t o p e r h e e n + k e s k i v e r t o r a n s k a l a i s e l l e + k e s k i v e r t o t u l o i s t a + k e s k i v e r t o t u o t t e i l t a + k e s k i v e r t o v i l j e l i j ä + k e s k i v e r t o v i l j e l i j ä n + k e s k i v e r t o v ä e s t ö ä + k e s k i v e r t o y r i t t ä j ä + k e s k i v i i k k o a a m u + k e s k i v i i k k o a a m u i s i n + k e s k i v i i k k o a a m u k s i + k e s k i v i i k k o a a m u n + k e s k i v i i k k o a a m u n a + k e s k i v i i k k o a a m u p ä i v ä n ä + k e s k i v i i k k o a a m u u n + k e s k i v i i k k o i l l a n + k e s k i v i i k k o i l t a + k e s k i v i i k k o i l t a a + k e s k i v i i k k o i l t a a n + k e s k i v i i k k o i l t a n a + k e s k i v i i k k o i l t a p ä i v ä k s i + k e s k i v i i k k o i l t a p ä i v ä l l e + k e s k i v i i k k o i l t a p ä i v ä n + k e s k i v i i k k o i l t a p ä i v ä n i + k e s k i v i i k k o i l t a p ä i v ä n ä + k e s k i v i i k k o i l t a p ä i v ä ä + k e s k i v i i k k o n a + k e s k i v i i k k o o n + k e s k i v i i k k o y ö n ä + k e s k i v i i k o l l e + k e s k i v i i k o n + k e s k i v i r h e + k e s k i v ä l i n + k e s k i y l ä n g ö i l l e + k e s k i y l ä n g ö i l l ä + k e s k i y l ä n g ö l l e + k e s k i y l ä n g ö l l ä + k e s k i y l ä n g ö n + k e s k i y l ä n k ö + k e s k i y l ä n k ö j e n + k e s k i y l ä n k ö ä + k e s k i y ö + k e s k i y ö h ö n + k e s k i y ö l l ä + k e s k i y ö n + k e s k i y ö t ä + k e s k i ä ä n i k a i u t i n + k e s k i ö s s ä + k e s k i ö ö n + k e s k o s e k s i + k e s k o s e l l e + k e s k u k s e e n + k e s k u k s e n + k e s k u k s e n a + k e s k u k s e s s a + k e s k u k s e s t a + k e s k u k s e t + k e s k u k s i a + k e s k u k s i i n + k e s k u k s i s s a + k e s k u k s i s t a + k e s k u s a l u e + k e s k u s a l u e e t + k e s k u s a l u e i d e n + k e s k u s a l u e i l l e + k e s k u s a l u e i s i i n + k e s k u s a l u e i t a + k e s k u s a r m e i j a a + k e s k u s a u k i o l l a + k e s k u s e l i m e n + k e s k u s e l i m e t + k e s k u s e l i m i i n + k e s k u s e l i n + k e s k u s e l i n t e n + k e s k u s e l i n t ä + k e s k u s h a h m o n a + k e s k u s h a l l i n n o i s t a + k e s k u s h a l l i n n o l l a + k e s k u s h a l l i n n o l l e + k e s k u s h a l l i n n o n + k e s k u s h a l l i n n o s s a + k e s k u s h a l l i n n o s t a + k e s k u s h a l l i n n o t + k e s k u s h a l l i n t o + k e s k u s h a l l i n t o a + k e s k u s h a l l i n t o j e n + k e s k u s h a l l i n t o j ä r j e s t e l m ä + k e s k u s h a l l i n t o n a + k e s k u s h a l l i n t o o n + k e s k u s h a l l i n t o v e t o i n e n + k e s k u s h a l l i t u k s e l l e + k e s k u s h a l l i t u k s e n + k e s k u s h a l l i t u s + k e s k u s h a l l i t u s t a + k e s k u s h a l l i t u s t e n + k e s k u s h e r m o s t o + k e s k u s h e r m o s t o a + k e s k u s h e r m o s t o n + k e s k u s h e r m o s t o o n + k e s k u s h e r m o s t o s t a + k e s k u s h y ö k k ä ä j ä + k e s k u s i n s t i t u u t i o i d e n + k e s k u s j o h d o n + k e s k u s j o h t o + k e s k u s j o h t o i n e n + k e s k u s j o h t o i s e m p a a + k e s k u s j o h t o i s e m p i + k e s k u s j o h t o i s e s s a + k e s k u s j o h t o i s e s t i + k e s k u s j o h t o i s i a + k e s k u s j o h t o i s t a + k e s k u s j ä r j e s t e l m ä + k e s k u s j ä r j e s t e l m ä n + k e s k u s j ä r j e s t e l m ä n ä + k e s k u s j ä r j e s t e l m ä s t ä + k e s k u s j ä r j e s t e l m ä ä + k e s k u s j ä r j e s t e l m ä ä n + k e s k u s j ä r j e s t ö + k e s k u s j ä r j e s t ö n + k e s k u s k a t t i l a s t a + k e s k u s k i r j a n p i t o j ä r j e s t e l m ä ä n + k e s k u s k o m i s s i o + k e s k u s k o m i t e a + k e s k u s k o m i t e a n + k e s k u s k o u l u i s s a + k e s k u s k u l m a + k e s k u s k u r s s i n + k e s k u s k u r s s i s s a + k e s k u s l a i t o k s i i n + k e s k u s l e n t o a s e m i e n + k e s k u s l i h a t o r i + k e s k u s l i i t t o + k e s k u s l u k i t u s + k e s k u s l ä m m i t y s a l a a n + k e s k u s l ä m m i t y s k a t t i l o i d e n + k e s k u s l ä m p ö v o i m a l o i d e n + k e s k u s m u i s t i + k e s k u s m u i s t i a + k e s k u s n e u v o s t o n + k e s k u s o h j e l m a k s i + k e s k u s o s a + k e s k u s o s a a n + k e s k u s o s a n + k e s k u s o s t o p i s t e i t ä + k e s k u s p a i k k a k u n n a l l e + k e s k u s p a i k k a t e o r i a + k e s k u s p a n k e i l l a + k e s k u s p a n k e i l l a a n + k e s k u s p a n k e i l l e + k e s k u s p a n k e i l t a + k e s k u s p a n k e i s s a + k e s k u s p a n k e i s t a + k e s k u s p a n k i l l a + k e s k u s p a n k i l l e + k e s k u s p a n k i l l e e n + k e s k u s p a n k i l t a + k e s k u s p a n k i n + k e s k u s p a n k i n k i n + k e s k u s p a n k i s s a + k e s k u s p a n k i s t a + k e s k u s p a n k i t + k e s k u s p a n k k e i h i n + k e s k u s p a n k k e i n e e n + k e s k u s p a n k k e j a + k e s k u s p a n k k i + k e s k u s p a n k k i a + k e s k u s p a n k k i e n + k e s k u s p a n k k i e n s a + k e s k u s p a n k k i i n + k e s k u s p a n k k i i n k o + k e s k u s p a n k k i i r e i l l e + k e s k u s p a n k k i i r e i l t a + k e s k u s p a n k k i i r i e n + k e s k u s p a n k k i j ä r j e s t e l m ä + k e s k u s p a n k k i j ä r j e s t e l m ä l l e + k e s k u s p a n k k i j ä r j e s t e l m ä l l ä + k e s k u s p a n k k i j ä r j e s t e l m ä n + k e s k u s p a n k k i j ä r j e s t e l m ä s s ä + k e s k u s p a n k k i j ä r j e s t e l m ä ä + k e s k u s p a n k k i j ä r j e s t e l m ä ä n + k e s k u s p a n k k i k a a n + k e s k u s p a n k k i k i n + k e s k u s p a n k k i k ä y t ä n t ö ä + k e s k u s p a n k k i l a i n + k e s k u s p a n k k i l a i n s ä ä d ä n t ö ä ä n + k e s k u s p a n k k i m m e + k e s k u s p a n k k i n a + k e s k u s p a n k k i n a m m e + k e s k u s p a n k k i n s a + k e s k u s p a n k k i t o i m i n n a s s a + k e s k u s p e l i + k e s k u s p i l a r i n a + k e s k u s p o o l i i n + k e s k u s p u i s t o s s a + k e s k u s p u t k i r u n k o + k e s k u s r a h a s t o + k e s k u s r a h a s t o o n + k e s k u s r a h o i t u s y k s i k k ö + k e s k u s r a u t a t i e a s e m a + k e s k u s r e k i s t e r i i n + k e s k u s r e k i s t e r i n + k e s k u s r e k i s t e r i s s ä + k e s k u s r e k i s t e r i ä + k e s k u s r i k o s p o l i i s i + k e s k u s r i k o s r e k i s t e r i i n + k e s k u s r i k o s t u o m i o i s t u i m e n + k e s k u s s a i r a a l a + k e s k u s s e l v i t y s t o i m i s t o + k e s k u s s e l v i t y s y h t i ö n + k e s k u s s t a d i o n + k e s k u s t a a j a m a + k e s k u s t a a n + k e s k u s t a h a l l i t u s + k e s k u s t a l a i s u u t e e n + k e s k u s t a n u o r e t + k e s k u s t a o i k e i s t o + k e s k u s t a o i k e i s t o a + k e s k u s t a o i k e i s t o h a l l i t u s + k e s k u s t a o i k e i s t o l a i n e n + k e s k u s t a o i k e i s t o l a i n e n k i n + k e s k u s t a o i k e i s t o l a i s e l l e + k e s k u s t a o i k e i s t o l a i s e n + k e s k u s t a o i k e i s t o l a i s e t + k e s k u s t a o i k e i s t o l a i s i a + k e s k u s t a o i k e i s t o l a i s i l l e + k e s k u s t a o i k e i s t o l a i s t e n + k e s k u s t a o i k e i s t o n + k e s k u s t a o i k e i s t o s s a + k e s k u s t a p u o l u e + k e s k u s t a p u o l u e e n + k e s k u s t a r y h m i e n + k e s k u s t a s o l l a + k e s k u s t a s o l t a + k e s k u s t a t + k e s k u s t a v a s e m m i s t o + k e s k u s t a v a s e m m i s t o a + k e s k u s t a v a s e m m i s t o l a i n e n + k e s k u s t a v a s e m m i s t o l a i s e e n + k e s k u s t a v a s e m m i s t o l a i s e n + k e s k u s t a v a s e m m i s t o l a i s e t + k e s k u s t a v a s e m m i s t o l a i s i a + k e s k u s t a v a s e m m i s t o l a i s t e n + k e s k u s t a v a s e m m i s t o n + k e s k u s t a v a s e m m i s t o r y h m i e n + k e s k u s t e l e e + k e s k u s t e l e m a a n + k e s k u s t e l e m a l l a + k e s k u s t e l e m a s s a + k e s k u s t e l e m a s t a + k e s k u s t e l e m a t t a + k e s k u s t e l e m i n e n + k e s k u s t e l e m m e + k e s k u s t e l e m m e h a n + k e s k u s t e l e t t e + k e s k u s t e l e v a n + k e s k u s t e l e v a t + k e s k u s t e l i + k e s k u s t e l i k i n + k e s k u s t e l i m m e + k e s k u s t e l i n + k e s k u s t e l i s i + k e s k u s t e l i s i m m e + k e s k u s t e l i v a t + k e s k u s t e l i v a t k o + k e s k u s t e l k a a + k e s k u s t e l k a a m m e + k e s k u s t e l l a + k e s k u s t e l l a a n + k e s k u s t e l l a a n k o + k e s k u s t e l l a k a a n + k e s k u s t e l l a k s e e n + k e s k u s t e l l a k s e m m e + k e s k u s t e l l a k s e n i + k e s k u s t e l l a k s e n n e + k e s k u s t e l l e e t + k e s k u s t e l l e s s a + k e s k u s t e l l e s s a a n + k e s k u s t e l l e s s a m m e + k e s k u s t e l l e s s a n i + k e s k u s t e l l e s s a n n e + k e s k u s t e l l u i s t a + k e s k u s t e l l u n + k e s k u s t e l l u t + k e s k u s t e l t a e s s a + k e s k u s t e l t a i s i i n + k e s k u s t e l t a v a + k e s k u s t e l t a v a a + k e s k u s t e l t a v a k s i + k e s k u s t e l t a v a n a + k e s k u s t e l t a v a n a m m e + k e s k u s t e l t a v i a + k e s k u s t e l t i i n + k e s k u s t e l t u + k e s k u s t e l t u a + k e s k u s t e l t u a a n + k e s k u s t e l t u a m m e + k e s k u s t e l t u a n i + k e s k u s t e l u a + k e s k u s t e l u a a n + k e s k u s t e l u a i h e i d e n + k e s k u s t e l u a i h e i s t a + k e s k u s t e l u a i k a a + k e s k u s t e l u a j a l l a + k e s k u s t e l u a j a n + k e s k u s t e l u a j a t + k e s k u s t e l u a l o i t t e i t a + k e s k u s t e l u a l u e + k e s k u s t e l u a m m e + k e s k u s t e l u a n n e + k e s k u s t e l u a r e e n a k s i + k e s k u s t e l u a r e e n a n + k e s k u s t e l u a s i a k i r j a + k e s k u s t e l u a s i a k i r j a a + k e s k u s t e l u a s i a k i r j a a n + k e s k u s t e l u a s i a k i r j a l l a + k e s k u s t e l u a s i a k i r j a n + k e s k u s t e l u a s i a k i r j a n a + k e s k u s t e l u a s i a k i r j a s s a + k e s k u s t e l u a s i a k i r j a s s a a n + k e s k u s t e l u a s i a k i r j a t + k e s k u s t e l u a s i a k i r j o i s t a + k e s k u s t e l u a s i a k i r j o j a + k e s k u s t e l u e l i n + k e s k u s t e l u f o o r u m e i h i n + k e s k u s t e l u f o o r u m e i l l a + k e s k u s t e l u f o o r u m e i l l e + k e s k u s t e l u f o o r u m e i s s a + k e s k u s t e l u f o o r u m e j a + k e s k u s t e l u f o o r u m i + k e s k u s t e l u f o o r u m i a + k e s k u s t e l u f o o r u m i a l o i t t e e l l e + k e s k u s t e l u f o o r u m i i n + k e s k u s t e l u f o o r u m i k s i + k e s k u s t e l u f o o r u m i l l a + k e s k u s t e l u f o o r u m i n + k e s k u s t e l u f o o r u m i n a + k e s k u s t e l u h a l u k k u u d e n + k e s k u s t e l u h a l u k k u u d e s t a + k e s k u s t e l u h a l u k k u u s + k e s k u s t e l u i h i m m e + k e s k u s t e l u i h i n + k e s k u s t e l u i l l a + k e s k u s t e l u i l l e + k e s k u s t e l u i l l e m m e + k e s k u s t e l u i l m a p i i r i i n + k e s k u s t e l u i l m a p i i r i ä + k e s k u s t e l u i l t a + k e s k u s t e l u i n + k e s k u s t e l u i s s a + k e s k u s t e l u i s s a a n + k e s k u s t e l u i s s a k i n + k e s k u s t e l u i s s a m m e + k e s k u s t e l u i s s a n i + k e s k u s t e l u i s t a + k e s k u s t e l u i s t a n i + k e s k u s t e l u i s t a n n e + k e s k u s t e l u i t a + k e s k u s t e l u i t t a + k e s k u s t e l u j a + k e s k u s t e l u j a m m e + k e s k u s t e l u j e m m e + k e s k u s t e l u j e n + k e s k u s t e l u j ä r j e s t e l m ä + k e s k u s t e l u j ä r j e s t y s t ä + k e s k u s t e l u k a n a v i a + k e s k u s t e l u k a n a v i e n + k e s k u s t e l u k e r h o + k e s k u s t e l u k e r h o i k s i + k e s k u s t e l u k e r h o i n a + k e s k u s t e l u k e r h o j a + k e s k u s t e l u k e r h o k s i + k e s k u s t e l u k e r h o s s a + k e s k u s t e l u k e r h o s t a + k e s k u s t e l u k i e r r o k s e e n + k e s k u s t e l u k i e r r o k s e l l a + k e s k u s t e l u k i e r r o k s e n + k e s k u s t e l u k i e r r o s + k e s k u s t e l u k i e r r o s t a + k e s k u s t e l u k i e r r o s t e n + k e s k u s t e l u k i n + k e s k u s t e l u k l u b i + k e s k u s t e l u k u l t t u u r i a + k e s k u s t e l u k u l t t u u r i n + k e s k u s t e l u k u l t t u u r i s t a + k e s k u s t e l u k u m p p a n e i d e m m e + k e s k u s t e l u k u m p p a n e i h i n s a + k e s k u s t e l u k u m p p a n e i k s i + k e s k u s t e l u k u m p p a n e i l l e e n + k e s k u s t e l u k u m p p a n e i l l e m m e + k e s k u s t e l u k u m p p a n e i n a a n + k e s k u s t e l u k u m p p a n e i n a m m e + k e s k u s t e l u k u m p p a n e i t a + k e s k u s t e l u k u m p p a n i + k e s k u s t e l u k u m p p a n i k s i + k e s k u s t e l u k u m p p a n i m m e + k e s k u s t e l u k u m p p a n i n a + k e s k u s t e l u k u m p p a n i n a m m e + k e s k u s t e l u k u m p p a n i n a n n e + k e s k u s t e l u k u m p p a n i n i + k e s k u s t e l u k u m p p a n i t + k e s k u s t e l u k u t s u n a + k e s k u s t e l u l i n j a t + k e s k u s t e l u l l a + k e s k u s t e l u l l e + k e s k u s t e l u m a h d o l l i s u u d e t + k e s k u s t e l u m a h d o l l i s u u k s i a + k e s k u s t e l u m a h d o l l i s u u t t a + k e s k u s t e l u m a r a t o n i s s a a n + k e s k u s t e l u m e n e t e l m i e n s ä + k e s k u s t e l u m m e + k e s k u s t e l u m m e k i n + k e s k u s t e l u m u o d o n + k e s k u s t e l u m u o t o + k e s k u s t e l u n + k e s k u s t e l u n a i h e + k e s k u s t e l u n a i h e e k s i + k e s k u s t e l u n a i h e e m m e + k e s k u s t e l u n a i h e e n a + k e s k u s t e l u n a i h e e s e e m m e + k e s k u s t e l u n a i h e e s t a m m e + k e s k u s t e l u n a i h e i d e n + k e s k u s t e l u n a i h e i s i i n + k e s k u s t e l u n a i h e i s t a + k e s k u s t e l u n a i h e i s t a m m e + k e s k u s t e l u n a i h e i t a + k e s k u s t e l u n a i h e i t a m m e + k e s k u s t e l u n a i h e t t a + k e s k u s t e l u n a l u s t u k s e s t a + k e s k u s t e l u n n e + k e s k u s t e l u n v a p a u t t a + k e s k u s t e l u o h j e l m a + k e s k u s t e l u o h j e l m i i n + k e s k u s t e l u p a l s t a + k e s k u s t e l u p a l s t a t + k e s k u s t e l u p a l s t o i l l a + k e s k u s t e l u p i i r i + k e s k u s t e l u p o h j a n + k e s k u s t e l u p r o s e s s i + k e s k u s t e l u p r o s e s s i a + k e s k u s t e l u p r o s e s s i n + k e s k u s t e l u p r o s e s s i s s a + k e s k u s t e l u p u h e e n v u o r o i l l e + k e s k u s t e l u p u h e e n v u o r o i s s a + k e s k u s t e l u p u h e e n v u o r o s s a + k e s k u s t e l u p u h e e n v u o r o s s a n i + k e s k u s t e l u p u h e e n v u o r o t + k e s k u s t e l u p u o l i a + k e s k u s t e l u p u o l t a + k e s k u s t e l u p y y n t ö j e n + k e s k u s t e l u p ö y d ä n + k e s k u s t e l u r y h m i i n + k e s k u s t e l u r y h m ä + k e s k u s t e l u r y h m ä n ä + k e s k u s t e l u s a r j o j e n + k e s k u s t e l u s e m i n a a r e j a + k e s k u s t e l u s s a + k e s k u s t e l u s s a m m e + k e s k u s t e l u s t a + k e s k u s t e l u s t a k i n + k e s k u s t e l u s t a m m e + k e s k u s t e l u s ä ä n n ö t + k e s k u s t e l u t + k e s k u s t e l u t a s o l l a + k e s k u s t e l u t e r a p i a + k e s k u s t e l u t e r a p i a a + k e s k u s t e l u t i l a i s u u s + k e s k u s t e l u t o i v e e t + k e s k u s t e l u t u n n i l l e + k e s k u s t e l u u m m e + k e s k u s t e l u u n + k e s k u s t e l u v a i h e + k e s k u s t e l u v a i h e e n + k e s k u s t e l u v a i h e e s e e n + k e s k u s t e l u v a i h e e s s a + k e s k u s t e l u v a i h e e s t a + k e s k u s t e l u v a i h e t t a + k e s k u s t e l u v a l m i u d e n + k e s k u s t e l u v a l m i u d e s t a + k e s k u s t e l u y h t e y s + k e s k u s t e l u y h t e y t e e n + k e s k u s t i e d o s t o + k e s k u s t i e d o s t o s s a + k e s k u s t i e d u s t e l u p a l v e l u + k e s k u s t i e d u s t e l u p a l v e l u l l a + k e s k u s t i e d u s t e l u p a l v e l u n + k e s k u s t i e t o k a n n a n + k e s k u s t i e t o k a n n a s t a + k e s k u s t i e t o k a n t a + k e s k u s t i e t o k a n t a a + k e s k u s t i e t o k a n t a a n + k e s k u s t i e t o k o n e e s e e n + k e s k u s t i e t o p a n k k e i h i n + k e s k u s t i e t o p a n k k i e n + k e s k u s t i l a s t o t o i m i s t o + k e s k u s t o i h i n + k e s k u s t o i m i s t o n + k e s k u s t o i m i s t o n a + k e s k u s t o i m i s t o s s a + k e s k u s t o i s s a + k e s k u s t o i s t a + k e s k u s t o j a + k e s k u s t o j e n + k e s k u s t o r i + k e s k u s v a a l i k o m i t e a n + k e s k u s v a a l i l a u t a k u n n a l l e + k e s k u s v a a l i l a u t a k u n n a n + k e s k u s v a a l i l a u t a k u n n a s s a + k e s k u s v a a l i l a u t a k u n t a + k e s k u s v a a l i l a u t a k u n t a a + k e s k u s v a a l i l a u t a k u n t a a n + k e s k u s v a a l i y k s i k k ö m m e + k e s k u s v a l l a l l e + k e s k u s v a l l a n + k e s k u s v a l l a t + k e s k u s v a l t a + k e s k u s v a l t i o + k e s k u s v a l t i o n + k e s k u s v a l t i o t a + k e s k u s v a l v o n n a n + k e s k u s v a l v o n t a a + k e s k u s v a l v o n t a j ä r j e s t e l m ä ä + k e s k u s v a r a u s j ä r j e s t e l m i i n + k e s k u s v a r a u s j ä r j e s t e l m i s t ä + k e s k u s v a s t a p u o l i a + k e s k u s v a s t a p u o l i s e l v i t y k s e e n + k e s k u s v a s t a p u o l i s e l v i t y s + k e s k u s v i r a n o m a i n e n + k e s k u s v i r a n o m a i s e e n + k e s k u s v i r a n o m a i s e l l e + k e s k u s v i r a n o m a i s e n + k e s k u s v i r a n o m a i s e t + k e s k u s v i r a n o m a i s i a + k e s k u s v i r a n o m a i s i l l e + k e s k u s v i r a n o m a i s t e n + k e s k u s v i r a s t o + k e s k u s v i r a s t o a + k e s k u s v i r a s t o j a + k e s k u s v i r a s t o n + k e s k u s y h t e y s p i s t e i t ä + k e s k u s y h t e y s v i r a n o m a i n e n + k e s k u s y h t e y s v i r a n o m a i s e k s i + k e s k u s y h t e y s v i r a n o m a i s t e n + k e s k u s y k s i k k ö + k e s k u s y k s i k k ö ö n + k e s k u s y k s i k ö i h i n + k e s k u s y k s i k ö n + k e s k u s y k s i k ö s t ä + k e s k u s y l ä n g ö l l e + k e s k u s y l ä n g ö l l ä + k e s k u s y l ä n k ö ä + k e s k u u d e s s a a n + k e s k u u d e s s a m m e + k e s k u u d e s t a a n + k e s t e t t ä v i k s i + k e s t o a + k e s t o i k ä + k e s t o k u l u t u s h y ö d y k e + k e s t o k y k y y n + k e s t o l t a a n + k e s t o m a g n e e t t i e n + k e s t o n + k e s t o p a p e r i n + k e s t o s k a n d a a l i n + k e s t o s t a + k e s t ä i s i + k e s t ä i s i v ä t + k e s t ä m ä t t ö m i e n + k e s t ä m ä t t ö m i n + k e s t ä m ä t t ö m i ä + k e s t ä m ä t t ö m y y t e e n + k e s t ä m ä t t ö m ä l l e + k e s t ä m ä t t ö m ä l t ä + k e s t ä m ä t t ö m ä m p ä ä + k e s t ä m ä t t ö m ä n + k e s t ä m ä t t ö m ä n ä + k e s t ä m ä t t ö m ä t + k e s t ä m ä t ö n t ä + k e s t ä m ä ä n + k e s t ä n e e l l ä + k e s t ä n e e n + k e s t ä n e e s s ä + k e s t ä n e e s t ä + k e s t ä n e i d e n + k e s t ä n e i s s ä + k e s t ä n y t + k e s t ä v i e n + k e s t ä v i i n + k e s t ä v i m m i s t ä + k e s t ä v i m m ä k s i + k e s t ä v i m m ä l l ä + k e s t ä v i m m ä n + k e s t ä v i n + k e s t ä v i n t ä + k e s t ä v i ä + k e s t ä v y y s a j o + k e s t ä v y y s a s i a s t a + k e s t ä v y y s a s i o i t a + k e s t ä v y y s j u o k s u + k e s t ä v y y s j ä r j e s t e l m ä l l ä + k e s t ä v y y s k e s k u s t e l u s t a + k e s t ä v y y s k o k e e t + k e s t ä v y y s k r i t e e r e i h i n + k e s t ä v y y s k r i t e e r e i s t ä + k e s t ä v y y s k r i t e e r e i t ä + k e s t ä v y y s k r i t e e r e j ä + k e s t ä v y y s k r i t e e r i e n + k e s t ä v y y s k r i t e e r i n + k e s t ä v y y s k r i t e e r i t + k e s t ä v y y s k r i t e e r i ä + k e s t ä v y y s k y s y m y k s e e n + k e s t ä v y y s k ä s i t t e e n + k e s t ä v y y s l u v u s s a + k e s t ä v y y s n ä k ö k o h d a t + k e s t ä v y y s n ä k ö k o h t i e n + k e s t ä v y y s n ä k ö k u l m a n + k e s t ä v y y s o h j e l m a n + k e s t ä v y y s o n g e l m a s t a + k e s t ä v y y s o n g e l m i a + k e s t ä v y y s p e r i a a t e + k e s t ä v y y s p e r i a a t t e e s e e n + k e s t ä v y y s p e r i a a t t e i s i i n + k e s t ä v y y s p e r u s t e e n + k e s t ä v y y s p e r u s t e i t a + k e s t ä v y y s p i l a r i i n + k e s t ä v y y s p o l i t i i k a n + k e s t ä v y y s p o l i t i i k k a a + k e s t ä v y y s s o p i m u s t a + k e s t ä v y y s s t r a t e g i a + k e s t ä v y y s s t r a t e g i a a + k e s t ä v y y s s t r a t e g i a l l a + k e s t ä v y y s s t r a t e g i o i d e n + k e s t ä v y y s s t r a t e g i o i t a + k e s t ä v y y s s u k k u l a j u o k s u + k e s t ä v y y s s y i s t ä + k e s t ä v y y s s ä ä n t ö j ä + k e s t ä v y y s t a v o i t t e i d e n + k e s t ä v y y s t e s t i n + k e s t ä v y y s t i l i t + k e s t ä v y y s t o i m i a + k e s t ä v y y s u l o t t u v u u d e n + k e s t ä v y y s v a a t i m u k s e n + k e s t ä v y y s v a a t i m u k s i a + k e s t ä v y y s v a j e + k e s t ä v y y t e e n + k e s t ä v y y t t ä + k e s t ä v ä k s i + k e s t ä v ä l l e + k e s t ä v ä l l ä + k e s t ä v ä l t ä + k e s t ä v ä m m i k s i + k e s t ä v ä m m i l l e + k e s t ä v ä m m i l l ä + k e s t ä v ä m m i n + k e s t ä v ä m m ä k s i + k e s t ä v ä m m ä l l e + k e s t ä v ä m m ä l l ä + k e s t ä v ä m m ä n + k e s t ä v ä m m ä s t ä + k e s t ä v ä m m ä t + k e s t ä v ä m p i + k e s t ä v ä m p i e n + k e s t ä v ä m p i i n + k e s t ä v ä m p i ä + k e s t ä v ä m p ä ä + k e s t ä v ä m p ä ä n + k e s t ä v ä n + k e s t ä v ä s s ä + k e s t ä v ä s t ä + k e s t ä v ä t + k e s t ä v ä ä + k e s t ä v ä ä n + k e s t ä ä + k e s t ä ä k s e e n + k e s y h a n h i + k e s y k y y h k y + k e s y m p ä ä + k e s ä a i k a + k e s ä a i k a a + k e s ä a i k a a n + k e s ä a i k a d i r e k t i i v i + k e s ä a i k a j ä r j e s t e l m ä l l ä + k e s ä a i k a j ä r j e s t e l m ä ä n + k e s ä a i k a j ä r j e s t e l y j e n + k e s ä a i k a j ä r j e s t e l y j ä + k e s ä a i k a s ä ä n n ö k s i s t ä + k e s ä a i k o j e n + k e s ä a j a n + k e s ä a j a s t a + k e s ä h a r s o + k e s ä h e t k e t + k e s ä h i t t i + k e s ä i h o t t u m a + k e s ä i s t u n t o t a u o n + k e s ä j u h l i i n + k e s ä j ä ä + k e s ä j ä ä n + k e s ä k a u d e k s i + k e s ä k a u d e l l a + k e s ä k a u d e n + k e s ä k i r j a + k e s ä k i s o i s s a + k e s ä k o l m i o + k e s ä k o u l u i s s a + k e s ä k o u l u j e n + k e s ä k u i s e n + k e s ä k u r s s e i l l e + k e s ä k u u + k e s ä k u u h u n + k e s ä k u u k a u s i e n + k e s ä k u u k a u s i i n + k e s ä k u u k a u s i n a + k e s ä k u u k s i + k e s ä k u u l i i k e + k e s ä k u u n + k e s ä k u u r u o h o + k e s ä k u u s s a + k e s ä k u u s s a h a n + k e s ä k u u s t a + k e s ä k u u t a + k e s ä l a a k e r i + k e s ä l e i m u + k e s ä l e s k i + k e s ä l i i g a + k e s ä l l ä + k e s ä l o m a + k e s ä l o m a a + k e s ä l o m a a n s a + k e s ä l o m a k a u d e n + k e s ä l o m a k a u t t a + k e s ä l o m a l l a + k e s ä l o m a l l a n i + k e s ä l o m a l l e + k e s ä l o m a l t a a n + k e s ä l o m a m a t k a + k e s ä l o m a m a t k a i l u u n + k e s ä l o m a n + k e s ä l o m a s i l p o m i s e k s i + k e s ä l o m a s i l p o m i s e n + k e s ä l o m a s t a a n + k e s ä l o m a t a u k o a + k e s ä l o m i a + k e s ä l o m i e n + k e s ä l o m i l l e e n + k e s ä l u k e m i s e k s e n n e + k e s ä m a r u n a + k e s ä m ö k i l l ä + k e s ä m ö k k i + k e s ä m ö k k i a s u t u s t a + k e s ä m ö k k i e n + k e s ä n + k e s ä n ä + k e s ä o l y m p i a l a i s e t + k e s ä o l y m p i a l a i s i i n + k e s ä o l y m p i a l a i s i s s a + k e s ä o l y m p i a l a i s t e n + k e s ä p a l a t s i + k e s ä p a r a l y m p i a l a i s e t + k e s ä p i e n n a r s i e n i + k e s ä p i k k u s y d ä n + k e s ä p u i s t o + k e s ä p u r j o + k e s ä p ä i v i ä + k e s ä p ä i v ä + k e s ä p ä i v ä n s e i s a u s + k e s ä r e n k a a t + k e s ä s a d e + k e s ä s a d o t + k e s ä s a t e e n + k e s ä s y p r e s s i + k e s ä t a u k o + k e s ä t a u k o a + k e s ä t a u k o o n + k e s ä t a u o l l e + k e s ä t a u o n + k e s ä t e a t t e r i + k e s ä u n i v e r s i a d i t + k e s ä u r h e i l u l a j i e n + k e s ä y ö n + k e t j u i s s a + k e t j u k a r u s e l l i + k e t j u k a u p a l l e + k e t j u k i r j e + k e t j u l ä h e s t y m i s t a p a a n + k e t j u m u r t o l u k u + k e t j u n + k e t j u n h a l l i n n a n + k e t j u n h a l l i n t a + k e t j u p e t o s t e n + k e t j u p o l t t a j i a + k e t j u r e a k t i o + k e t j u r e a k t i o i d e n + k e t j u r e a k t i o i t a + k e t j u r e a k t i o l t a + k e t j u r e a k t i o n + k e t j u r e a k t i o n a + k e t j u r e a k t i o o n + k e t j u r e a k t i o s t a + k e t j u r e a k t i o t a + k e t j u s i l t a + k e t j u s s a + k e t j u s ä ä n t ö + k e t j u t o i m i t t a j i e n + k e t j u v ä l i t y s + k e t j u y r i t y k s i i n + k e t k u t e a t t e r i + k e t o a i n e + k e t o h a n h i k k i + k e t o h e i n ä s i r k k a + k e t o h o p e a t ä p l ä + k e t o h ä r k k i + k e t o k a t k e r o + k e t o k u l t a s i i p i + k e t o k ä e n m i n t t u + k e t o m a r u n a + k e t o n e i l i k k a + k e t o n o i d a n l u k k o + k e t o n u k k i + k e t o p a r t a s a m m a l + k e t o p y y j u o k s i j a + k e t o s i l m ä r u o h o + k e t o s i n i s i i p i + k e t o t ä d y k e + k e t s u p p i v a i k u t u s t a + k e t t u a + k e t t u h a i t + k e t t u j a h t i + k e t t u k a l a + k e t t u s i r k k u + k e t t u t a r h a u s + k e t t u t a r h o j a + k e t t u t e r r i e r i + k e t u n h ä n n ä t + k e t u n l i e k o + k e t u n m e t s ä s t y k s e n + k e t u n m e t s ä s t y k s e s t ä + k e t u n m e t s ä s t y s + k e t u n r a u d a t + k e t u n r a u d o i l l a + k e t u n r a u t o j a + k e u h k o a h t a u m a t a u d i n + k e u h k o a h t a u m a t a u t i + k e u h k o a s t m a s t a + k e u h k o f i b r o o s i + k e u h k o f i b r o o s i a + k e u h k o i k s i + k e u h k o i s s a a n + k e u h k o j e n + k e u h k o k u u m e e l l a + k e u h k o k u u m e e s e e n + k e u h k o l a s k i m o + k e u h k o n s i i r t o + k e u h k o p a i s e + k e u h k o p a r e n k y y m i s a i r a u d e t + k e u h k o p u s s i + k e u h k o p u t k e n s a i r a u k s i a + k e u h k o r a k k u l a + k e u h k o s a i r a u d e n + k e u h k o s a i r a u k s i a + k e u h k o s a i r a u k s i s t a + k e u h k o s a i r a u s + k e u h k o s a i r a u t e e n + k e u h k o s a i r a u t t a + k e u h k o s a m m a l + k e u h k o s y ö p ä + k e u h k o s y ö p ä p o t i l a i s t a + k e u h k o s y ö p ä r i s k i ä + k e u h k o s y ö p ä t a p a u k s i s t a + k e u h k o s y ö p ä ä + k e u h k o s y ö p ä ä n + k e u h k o s y ö v ä l t ä + k e u h k o s y ö v ä n + k e u h k o s y ö v ä s t ä + k e u h k o v a u r i o i h i n + k e u h k o v e r e n p a i n e t a u t i + k e u h k o v e r i t u l p p a + k e u h k o ö d e e m a + k e u l a p o r t t i + k e u l a p o t k u r i + k e u l a s i m p u t + k e v e n n e t ä ä n + k e v e n t ä i s i + k e v e n t ä i s i v ä t + k e v e n t ä m i n e n + k e v e n t ä m i s e k s i + k e v e n t ä m i s p y r k i m y s t e n + k e v e n t ä m i s t o i m i a + k e v e n t ä m i s t ä + k e v e n t ä v ä t + k e v e n t ä ä + k e v e n t ä ä k s e e n + k e v y e l t ä + k e v y e m m i k s i + k e v y e m m i n + k e v y e m m ä n + k e v y e m m ä t + k e v y e m p i + k e v y e m p i ä + k e v y e m p ä ä + k e v y e n + k e v y e t + k e v y i d e n + k e v y i n + k e v y i s i i n + k e v y i s t ä + k e v y i t ä + k e v y t a s e e t + k e v y t a s e i d e n + k e v y t a s e i l l a + k e v y t a s e i s i i n + k e v y t a s e i s t a + k e v y t a s e i t a + k e v y t a s e v a r a s t o i s t a + k e v y t k e n k ä i n e n + k e v y t m a i t o t u o t t e i d e n + k e v y t m i e l i s e n ä + k e v y t m i e l i s e s t i + k e v y t s o r a + k e v y t t ä + k e v y t v e n e + k e v ä t e s i k k o + k e v ä t h a l l o j e n + k e v ä t h a n h i k k i + k e v ä t h u i p p u k o k o u k s e l l a + k e v ä t h u i p p u k o k o u k s e n + k e v ä t h u i p p u k o k o u k s e s s a + k e v ä t h u i p p u k o k o u s + k e v ä t h u i p p u k o k o u s t a + k e v ä t k a i h o n k u k k a + k e v ä t k e l l o + k e v ä t k e r t o m u k s e n s a + k e v ä t k e r t o m u s t a + k e v ä t k o k o u k s e n + k e v ä t k o k o u k s e s s a + k e v ä t k o k o u k s e s t a + k e v ä t k o k o u k s i s s a + k e v ä t k o k o u s + k e v ä t k o k o u s t a + k e v ä t k y n s i m ö + k e v ä t l e i n i k k i + k e v ä t l i n n u n h e r n e + k e v ä t l i n n u n s i l m ä + k e v ä t m e t s ä s t y k s e e n + k e v ä t m e t s ä s t y k s e l l e + k e v ä t m e t s ä s t y k s e n + k e v ä t m e t s ä s t y k s e s t ä + k e v ä t m e t s ä s t y k s i l l ä + k e v ä t m e t s ä s t y s + k e v ä t m e t s ä s t y s k a u t t a + k e v ä t m e t s ä s t y s t ä + k e v ä t n u r m i k k a + k e v ä t o f f e n s i i v i + k e v ä t p a k k a s e t + k e v ä t p i i p p o + k e v ä t p u t k i + k e v ä t r a p o r t i n + k e v ä t r a p o r t i s s a + k e v ä t r a p o r t t i a + k e v ä t r u u s u l e i n i k k i + k e v ä t s a h r a m i + k e v ä t s i i v o u k s e n + k e v ä t s i i v o u s + k e v ä t s i i v o u s t a + k e v ä t t a s k u r u o h o + k e v ä t t a u k o a + k e v ä t t e m p p e l i n + k e v ä t t u l v a t + k e v ä t t u u l i a + k e v ä t t ä h t i m ö + k e v ä t u h r i + k e v ä t v i l l a s e l k ä + k e v ä ä l l ä + k e v ä ä n + k e v ä ä n ä + k h m e r i e n + k h m e r i h a l l i t u k s e n + k h m e r i t + k h o i s a n k i e l e t + k i c k a p o o t + k i d e k o n e + k i d e r a k e n n e + k i d e t a n k o p r o s e s s i + k i d e v e s i + k i d e v i o l e t t i + k i d n a p p a u k s e n s a + k i d n a p p a u s v a r o i t u s + k i d n a p p a u s v a r o i t u s t e n + k i d u s h a i t + k i d u s n o k k a r a u s k u + k i d u t e t a + k i d u t e t a a n + k i d u t e t t a v a k s i + k i d u t e t t a v i k s i + k i d u t e t t u + k i d u t e t t u j e n + k i d u t t a m a l l a + k i d u t t a m i s e s t a + k i d u t t a m i s t a + k i d u t u k s e e n + k i d u t u k s e n + k i d u t u k s e n v a s t a i n e n + k i d u t u k s e n v a s t a i s e n + k i d u t u k s e n v a s t a i s e t + k i d u t u k s e n v a s t a i s t a + k i d u t u k s e s t a + k i d u t u k s e s t a k i n + k i d u t u k s e t + k i d u t u k s i i n + k i d u t u k s i s t a + k i d u t u s a s e i s i i n + k i d u t u s e p ä i l y j ä + k i d u t u s k a m m i o i d e n + k i d u t u s k a m m i o i s s a + k i d u t u s k a m m i o i s t a + k i d u t u s k a m m i o k s i + k i d u t u s k e s k u k s i n a + k i d u t u s k e s k u k s i s s a + k i d u t u s k e s k u s t a + k i d u t u s k o h t a u s t a + k i d u t u s k u o l e m a + k i d u t u s k y s y m y k s e s s ä + k i d u t u s l e i r e i l l ä + k i d u t u s l e i r i t + k i d u t u s l e n n o i s t a + k i d u t u s l e n t o j a + k i d u t u s l e n t o j e n + k i d u t u s m e n e t e l m i e n + k i d u t u s m e n e t e l m i s t ä + k i d u t u s m e n e t e l m i ä + k i d u t u s m e n e t e l m ä + k i d u t u s m u o d o k s i + k i d u t u s m u o d o t + k i d u t u s s y y t ö k s e t + k i d u t u s s y y t ö k s i ä + k i d u t u s t a + k i d u t u s t a p a u k s e s t a + k i d u t u s t a p a u k s e t + k i d u t u s t a p a u k s i i n + k i d u t u s t a p a u k s i s s a + k i d u t u s t a p a u k s i s t a + k i d u t u s t a p a u s t a + k i d u t u s t a r k o i t u k s i i n + k i d u t u s t a v a s t a + k i d u t u s v a n k i l a n a + k i d u t u s v a n k i l o i d e n + k i d u t u s v ä i t t e i s t ä + k i d u t u s v ä l i n e e n ä + k i d u t u s v ä l i n e i d e n + k i d u t u s v ä l i n e i k s i + k i d u t u s v ä l i n e i s s ä + k i d u t u s v ä l i n e i t ä + k i e h k u r a k i e l o + k i e h k u r a v e s i r u t t o + k i e h k u r a ä r v i ä + k i e h t o v a a + k i e h t o v a a n + k i e h t o v a m p a a + k i e h t o v a m p i a + k i e h t o v a m p i i n + k i e h t o v i a + k i e h t o v i m m i s t a + k i e h t o v i n + k i e h u m i s p i s t e + k i e h u m i s p i s t e e n + k i e h u m i s p i s t e e s e e n + k i e h u m i s p i s t e i t ä + k i e h u t u s v e s i r e a k t o r i + k i e k k o h a i t t a s y l i n t e r i + k i e k k o k a l a + k i e k k o k a m e r a + k i e k o n h e i t t o + k i e l e l l e + k i e l e l l i s e e n + k i e l e l l i s e l l ä + k i e l e l l i s e n + k i e l e l l i s e t + k i e l e l l i s i i n + k i e l e l l i s i ä + k i e l e l l i s t e n + k i e l e l l i s t ä + k i e l e l l ä + k i e l e l l ä m m e + k i e l e l l ä ä n + k i e l e n + k i e l e n h a l k a i s u + k i e l e n i + k i e l e n k ä y t t ö + k i e l e n k ä y t t ö ä + k i e l e n k ä y t t ö ä m m e + k i e l e n k ä y t t ö ö n + k i e l e n k ä y t ö n + k i e l e n k ä y t ö s t ä + k i e l e n o p e t u k s e e n + k i e l e n o p e t u s m e n e t e l m i ä + k i e l e n o p e t u s o h j e l m i s s a + k i e l e n o p e t u s t a + k i e l e n o p e t u s t u n t i e n + k i e l e n o p p i m i s e n + k i e l e n o p p i m i s m e t o d i + k i e l e n o s a a m i s e n + k i e l e n s u u n n i t t e l u + k i e l e n s ä + k i e l e n t u n n i s t u s + k i e l e n v a i h t o + k i e l e n ä + k i e l e s t ä + k i e l e t + k i e l i a l u e + k i e l i a l u e e l t a + k i e l i a l u e e n + k i e l i a l u e e s e e n + k i e l i a l u e i d e n + k i e l i a l u e i l l e + k i e l i a l u e i s i i n + k i e l i a l u e i s t a + k i e l i a l u e i t a + k i e l i a l u e t t a + k i e l i a p u a + k i e l i a s e t u k s i n + k i e l i a s i a n t u n t i j a t + k i e l i a s i a n t u n t i j o i d e n + k i e l i a s i o i h i n + k i e l i a s i o i t a + k i e l i a s u l t a a n + k i e l i e n + k i e l i e r o j e n + k i e l i e s t e + k i e l i f i l o s o f i a + k i e l i h a l l i n t o + k i e l i h a n k k e i t a + k i e l i h e g e m o n i a s t a + k i e l i h i s t o r i a + k i e l i i m m e + k i e l i i n + k i e l i j ä r j e s t e l m ä + k i e l i j ä r j e s t e l m ä m m e + k i e l i j ä r j e s t e l m ä n + k i e l i j ä r j e s t e l m ä s t ä + k i e l i j ä r j e s t e l m ä ä + k i e l i j ä r j e s t e l m ä ä n + k i e l i j ä r j e s t e l y + k i e l i j ä r j e s t e l y i h i n + k i e l i j ä r j e s t e l y i s s ä + k i e l i j ä r j e s t e l y i s t ä + k i e l i j ä r j e s t e l y j e n + k i e l i j ä r j e s t e l y j ä + k i e l i j ä r j e s t e l y n + k i e l i j ä r j e s t e l y s t ä + k i e l i j ä r j e s t e l y t + k i e l i j ä r j e s t e l y y n + k i e l i j ä r j e s t e l y ä + k i e l i k a m p e l a k a n n o i l l a + k i e l i k a m p e l a k a n t a + k i e l i k a m p e l a k a n t o i h i n + k i e l i k a m p e l a k a n t o j a + k i e l i k a m p e l a k a n t o j e n + k i e l i k a m p e l a k i i n t i ö s t ä + k i e l i k e s k u k s e t + k i e l i k i i s t a a + k i e l i k i i s t a a n + k i e l i k i i s t a s t a + k i e l i k o k e e n + k i e l i k o k e i s t a + k i e l i k o o d i + k i e l i k o u l u j e n + k i e l i k o u l u n + k i e l i k o u l u t + k i e l i k o u l u t u k s e e n + k i e l i k o u l u t u k s e n + k i e l i k o u l u t u k s e s t a + k i e l i k o u l u t u s t a + k i e l i k u l t t u u r i n + k i e l i k u n t a + k i e l i k u r s s e i l l a + k i e l i k u r s s e i l l e + k i e l i k u r s s e j a + k i e l i k u r s s i t + k i e l i k u v a + k i e l i k y l p y + k i e l i k y s y m y k s e e n + k i e l i k y s y m y k s e n + k i e l i k y s y m y k s e s s ä + k i e l i k y s y m y k s e s t ä + k i e l i k y s y m y k s e t + k i e l i k y s y m y k s i l l e + k i e l i k y s y m y k s i s s ä + k i e l i k y s y m y k s i ä + k i e l i k y s y m y s + k i e l i k y s y m y s t ä + k i e l i l a i n + k i e l i l a i n s ä ä d ä n n ö n + k i e l i l a i n s ä ä d ä n t ö + k i e l i l a i n s ä ä d ä n t ö ä + k i e l i l a i s s a + k i e l i l a i s t a + k i e l i l a k e j a + k i e l i l a k i + k i e l i l a k i a + k i e l i l a k i e n s a + k i e l i l a k i i n + k i e l i l a k i m m e + k i e l i l l e + k i e l i l l ä + k i e l i l u u + k i e l i m o s a i i k i n + k i e l i m u u r e j a + k i e l i m u u r i + k i e l i m u u r i a + k i e l i m u u r i e n + k i e l i m u u r i n + k i e l i m u u r i s t a + k i e l i m u u r i t + k i e l i m u u t o k s i n + k i e l i n ä k ö k o h t a + k i e l i n ä k ö k o h t i i n + k i e l i o h j e l m a + k i e l i o i k e u k s i a + k i e l i o i k e u k s i e n + k i e l i o i k e u k s i n + k i e l i o i k e u k s i s t a + k i e l i o n g e l m a + k i e l i o n g e l m a a n + k i e l i o n g e l m a n + k i e l i o n g e l m a s t a + k i e l i o n g e l m a t + k i e l i o n g e l m i a + k i e l i o n g e l m i e n + k i e l i o n g e l m i s s a + k i e l i o n g e l m i s t a + k i e l i o p e t u s t a + k i e l i o p i n t a r k i s t i n + k i e l i o p i n t o j a + k i e l i o p p i j ä r j e s t e l m i i n + k i e l i o p p i v i r h e + k i e l i o s a s t o j e n + k i e l i o s a s t o t + k i e l i p a l v e l u a + k i e l i p a l v e l u i h i n + k i e l i p a l v e l u i l l e + k i e l i p a l v e l u i n e e n + k i e l i p a l v e l u i s s a + k i e l i p a l v e l u j a + k i e l i p a l v e l u j e n + k i e l i p a l v e l u n + k i e l i p e l i + k i e l i p e r h e e s e e n + k i e l i p e r i a a t t e e s t a + k i e l i p e r i n t ö ä ä n + k i e l i p e s ä + k i e l i p o l i i t t i s e l l e + k i e l i p o l i t i i k a l l a + k i e l i p o l i t i i k a l l e + k i e l i p o l i t i i k a n + k i e l i p o l i t i i k a s s a + k i e l i p o l i t i i k a s s a a n + k i e l i p o l i t i i k a s t a + k i e l i p o l i t i i k k a + k i e l i p o l i t i i k k a a + k i e l i p o l i t i i k k a a m m e + k i e l i p o l i t i i k k a a n + k i e l i p o l i t i i k k a a n s a + k i e l i r a j o j a + k i e l i r a j o j e n + k i e l i r e f o r m i + k i e l i r i i d a s t a + k i e l i r i i t o j e n + k i e l i r y h m i e n + k i e l i r y h m i i n + k i e l i r y h m i l l e + k i e l i r y h m i s s ä + k i e l i r y h m i ä + k i e l i r y h m ä + k i e l i r y h m ä n + k i e l i r y h m ä t + k i e l i s a a r e k k e i t a + k i e l i s a l k k u + k i e l i s e i k o i s t a + k i e l i s e k t o r i l l a + k i e l i s i d o n n a i n e n + k i e l i s o i t i n + k i e l i s t ä + k i e l i s u k u l a i s e t + k i e l i s u u n n i t e l m a a + k i e l i s y ö p ä + k i e l i s y ö v ä n + k i e l i s ä ä n n ö i s t ä + k i e l i s ä ä n n ö s t e n + k i e l i s ä ä n t ö j ä + k i e l i t a i d o l l a + k i e l i t a i d o n + k i e l i t a i d o s t a + k i e l i t a i d o s t a a n + k i e l i t a i d o t + k i e l i t a i s t e l u + k i e l i t a i t o + k i e l i t a i t o a + k i e l i t a i t o a a n + k i e l i t a i t o a m m e + k i e l i t a i t o h a n + k i e l i t a i t o i n d i k a a t t o r i + k i e l i t a i t o i n d i k a a t t o r i a + k i e l i t a i t o i n d i k a a t t o r i l l a + k i e l i t a i t o i n d i k a a t t o r i n + k i e l i t a i t o i n d i k a a t t o r i s t a + k i e l i t a i t o k o k e e s s a + k i e l i t a i t o n i + k i e l i t a i t o n s a + k i e l i t a i t o o n + k i e l i t a i t o r e k i s t e r i ä + k i e l i t a i t o t i l a n t e e s e e n + k i e l i t a i t o t o d i s t u k s e e n + k i e l i t a i t o v a a t i m u k s e t + k i e l i t a r k a s t u k s e t + k i e l i t a r p e i d e n + k i e l i t e k n o l o g i a + k i e l i t i e t ä m y s t ä + k i e l i t i l a n n e t t a + k i e l i t o i s i n n o i s s a + k i e l i t o i s i n n o t + k i e l i t o i s i n t o i h i n + k i e l i t o i s i n t o i n a + k i e l i t o i s i n t o j a + k i e l i u u d i s t u s p o l i t i i k k a + k i e l i v a a t i m u k s i a + k i e l i v a i k e u d e t + k i e l i v a i k e u k s i e n + k i e l i v a l i k o i m a a + k i e l i v a l i k o i m a n + k i e l i v a l i n t a a n + k i e l i v a l m i u k s i a + k i e l i v e r s i o + k i e l i v e r s i o i d e n + k i e l i v e r s i o i h i n + k i e l i v e r s i o i s s a + k i e l i v e r s i o i s t a + k i e l i v e r s i o i t a + k i e l i v e r s i o n + k i e l i v e r s i o s s a + k i e l i v e r s i o t + k i e l i v e r s i o t a + k i e l i v i i t e k e h y k s e n + k i e l i v i r a s t o + k i e l i v i r h e + k i e l i v i r h e i t ä + k i e l i v ä h e m m i s t ö + k i e l i v ä h e m m i s t ö i h i n + k i e l i v ä h e m m i s t ö j e n + k i e l i v ä h e m m i s t ö j ä + k i e l i v ä h e m m i s t ö j ä ä n + k i e l i v ä h e m m i s t ö t + k i e l i v ä h e m m i s t ö ä + k i e l i v ä k i v a l t a a + k i e l i v ä t + k i e l i y h t e i s ö j e n + k i e l i y h t e i s ö l l ä + k i e l i y h t e i s ö ä + k i e l i y k s i k k ö j e n + k i e l i y k s i k ö i l l e + k i e l i y k s i k ö i t ä + k i e l i y k s i k ö l l e + k i e l i y k s i k ö t + k i e l i y l i o p i s t o l l e + k i e l i ä + k i e l i ä m m e + k i e l l e t t i i n + k i e l l e t t y j e n + k i e l l e t t y j ä + k i e l l e t t y ä + k i e l l e t t ä i s i + k i e l l e t t ä i s i i n + k i e l l e t y t + k i e l l e t ä ä n + k i e l l o l l a + k i e l l o n + k i e l l o s t a + k i e l l o t + k i e l l ä m m e + k i e l o k u k k o + k i e l s i + k i e l s i v ä t + k i e l t e i s e e n + k i e l t e i s e l t ä + k i e l t e i s e m m i k s i + k i e l t e i s e m m i n + k i e l t e i s e m m ä k s i + k i e l t e i s e m m ä n + k i e l t e i s e m m ä t + k i e l t e i s e m p i + k i e l t e i s e m p i ä + k i e l t e i s e m p ä n ä + k i e l t e i s e m p ä ä + k i e l t e i s e n + k i e l t e i s e n ä + k i e l t e i s e s t ä + k i e l t e i s e t + k i e l t e i s i i n + k i e l t e i s i l t ä + k i e l t e i s i m m i l l ä ä n + k i e l t e i s i m m i n + k i e l t e i s i m m ä t + k i e l t e i s i m p i i n + k i e l t e i s i m p i ä + k i e l t e i s i m p ä ä n + k i e l t e i s i n + k i e l t e i s i n e + k i e l t e i s i n ä + k i e l t e i s i s t ä + k i e l t e i s i ä + k i e l t e i s t e n + k i e l t e i s t ä + k i e l t e n + k i e l t e n o p e t u k s e e n + k i e l t e n o p e t u k s e l l e + k i e l t e n o p e t u k s e n + k i e l t e n o p e t u k s e s s a + k i e l t e n o p e t u k s e s t a + k i e l t e n o p e t u s + k i e l t e n o p e t u s m e n e t e l m i s t ä + k i e l t e n o p e t u s t a + k i e l t o a + k i e l t o a l u e + k i e l t o a l u e e n + k i e l t o a l u e t t a + k i e l t o i h i n + k i e l t o j a + k i e l t o j e n + k i e l t o k a m p a n j o i t a + k i e l t o k a u d e l l a + k i e l t o l a u s e k k e e n + k i e l t o m e n e t e l m ä t + k i e l t o m e n e t t e l y s s ä + k i e l t o m e n e t t e l y t + k i e l t o n a + k i e l t o o n + k i e l t o p o l i t i i k a l l a + k i e l t o p o l i t i i k a n + k i e l t o p o l i t i i k a s t a + k i e l t o p o l i t i i k k o j a + k i e l t o p r o s e s s i i n + k i e l t o p ä ä t ö k s e s t ä + k i e l t o p ä ä t ö s t ä + k i e l t o s o p i m u k s e n + k i e l t o s o p i m u s t a + k i e l t o t a r v e t t a + k i e l t o t o i m e n p i t e e s e e n + k i e l t o t o i m e n p i t e e t + k i e l t o t o i m e n p i t e i t ä + k i e l t o t o i m e t + k i e l t o v a r a u s + k i e l t o v e r b i + k i e l t ä + k i e l t ä e n + k i e l t ä e s s ä ä n + k i e l t ä i s i + k i e l t ä i s i m m e + k i e l t ä k ä ä n + k i e l t ä m i s e e n + k i e l t ä m i s e k s i + k i e l t ä m i s e n + k i e l t ä m i s e s t ä + k i e l t ä m i s p ä ä t ö s t ä + k i e l t ä m i s t ä + k i e l t ä m ä l l ä + k i e l t ä m ä ä n + k i e l t ä n e e t + k i e l t ä n e i s t ä + k i e l t ä n y t + k i e l t ä v ä t + k i e l t ä v ä ä n + k i e l t ä y d y i m m e + k i e l t ä y d y i t t e + k i e l t ä y d y m m e + k i e l t ä y d y t t e k ö + k i e l t ä y d y t ä ä n + k i e l t ä y t y e s s ä ä n + k i e l t ä y t y i + k i e l t ä y t y i s i + k i e l t ä y t y m i s e s t ä ä n + k i e l t ä y t y m i s p e r u s t e e t + k i e l t ä y t y m i s p e r u s t e i t a + k i e l t ä y t y m ä l l ä + k i e l t ä y t y m ä ä n + k i e l t ä y t y n e e t + k i e l t ä y t y v ä t + k i e l t ä y t y y + k i e l t ä y t y ä + k i e l t ä ä + k i e m u r o i t a + k i e r o a + k i e r o j a + k i e r r e a k a a s i a + k i e r r e j o u s i + k i e r r e k o r k k i + k i e r r e p o r t a a t + k i e r r e t t ä + k i e r r o k s e n + k i e r r o s l u k u + k i e r r o s t a + k i e r r o s v a a l i t a p a + k i e r r ä t e t t ä v i ä + k i e r r ä t e t t ä v y y d e s t ä + k i e r r ä t e t t ä v ä k s i + k i e r r ä t e t t ä v ä t + k i e r r ä t e t y n + k i e r r ä t e t ä ä n + k i e r r ä t t ä m i s e s t ä + k i e r r ä t t ä ä + k i e r r ä t y k s e e n + k i e r r ä t y k s e l l e + k i e r r ä t y k s e n + k i e r r ä t y k s e s s ä + k i e r r ä t y k s e s t ä + k i e r r ä t y s a j a t t e l u + k i e r r ä t y s a l a + k i e r r ä t y s a l a l l a + k i e r r ä t y s a l a n + k i e r r ä t y s a l u e t t a + k i e r r ä t y s a s t e + k i e r r ä t y s a s t e e l l a a n + k i e r r ä t y s a s t e e n s a + k i e r r ä t y s a s t e e s e e n + k i e r r ä t y s a s t e i n + k i e r r ä t y s a s t e i t a + k i e r r ä t y s a s t e t t a + k i e r r ä t y s i n f r a s t r u k t u u r i + k i e r r ä t y s i n f r a s t r u k t u u r i n + k i e r r ä t y s i n f r a s t r u k t u u r i s s a + k i e r r ä t y s j ä r j e s t e l m i e n + k i e r r ä t y s j ä r j e s t e l m i e n s ä + k i e r r ä t y s j ä r j e s t e l m i i n + k i e r r ä t y s j ä r j e s t e l m i s t ä + k i e r r ä t y s j ä r j e s t e l m i ä + k i e r r ä t y s j ä r j e s t e l m ä + k i e r r ä t y s j ä r j e s t e l m ä t + k i e r r ä t y s j ä r j e s t e l m ä ä + k i e r r ä t y s j ä r j e s t e l m ä ä n + k i e r r ä t y s j ä t t e e l l e + k i e r r ä t y s k a p a s i t e e t i n + k i e r r ä t y s k a p a s i t e e t t i + k i e r r ä t y s k a p a s i t e e t t i n s a + k i e r r ä t y s k e l p o i s i a + k i e r r ä t y s k e s k u k s e n a + k i e r r ä t y s k e s k u k s e t + k i e r r ä t y s k e s k u k s i a + k i e r r ä t y s k i i n t i ö + k i e r r ä t y s k i i n t i ö i d e n + k i e r r ä t y s k i i n t i ö t + k i e r r ä t y s k u i t u + k i e r r ä t y s k u l t t u u r i a + k i e r r ä t y s k u s t a n n u k s e t + k i e r r ä t y s k u s t a n n u k s i a + k i e r r ä t y s l a i t o k s e s s a + k i e r r ä t y s l a i t o k s i a + k i e r r ä t y s l a i t o k s i k s i + k i e r r ä t y s l a i t o s + k i e r r ä t y s l a i t o s t a + k i e r r ä t y s l a i t o s t e n + k i e r r ä t y s l u v u t + k i e r r ä t y s m a h d o l l i s u u k s i a + k i e r r ä t y s m a h d o l l i s u u k s i s t a + k i e r r ä t y s m a l l i + k i e r r ä t y s m a r k k i n o i d e n + k i e r r ä t y s m a r k k i n o i l l a + k i e r r ä t y s m a t e r i a a l e i s t a + k i e r r ä t y s m a t e r i a a l i n + k i e r r ä t y s m a t e r i a a l i t + k i e r r ä t y s m o n o p o l i n + k i e r r ä t y s m ä ä r i ä + k i e r r ä t y s n o r m e i s t a + k i e r r ä t y s o h j e l m a n s a + k i e r r ä t y s o h j e l m i l l a + k i e r r ä t y s o n g e l m a a + k i e r r ä t y s p a l v e l u j a + k i e r r ä t y s p e r i a a t t e e l l a + k i e r r ä t y s p i s t e i t ä + k i e r r ä t y s p o l i t i i k a n + k i e r r ä t y s p o l i t i i k k a a + k i e r r ä t y s p r o s e n t i t + k i e r r ä t y s p r o s e s s i + k i e r r ä t y s p r o s e s s i i n + k i e r r ä t y s p r o s e s s i s s a + k i e r r ä t y s r a t k a i s u j a + k i e r r ä t y s r e h u t e h d a s + k i e r r ä t y s s e k t o r i n + k i e r r ä t y s s i t o u m u k s i a + k i e r r ä t y s s t a n d a r d i t + k i e r r ä t y s s t r a t e g i a n + k i e r r ä t y s s u u n n i t e l m a + k i e r r ä t y s t a s o a + k i e r r ä t y s t a v o i t e + k i e r r ä t y s t a v o i t t e e n + k i e r r ä t y s t a v o i t t e e s e e n + k i e r r ä t y s t a v o i t t e e t + k i e r r ä t y s t a v o i t t e i d e n + k i e r r ä t y s t a v o i t t e i l l e + k i e r r ä t y s t a v o i t t e i s i i n + k i e r r ä t y s t a v o i t t e i t a + k i e r r ä t y s t e h o k k u u d e n + k i e r r ä t y s t e k n i i k o i d e n + k i e r r ä t y s t e k n i i k o i t a + k i e r r ä t y s t e k n o l o g i a n + k i e r r ä t y s t e o l l i s u u d e s t a + k i e r r ä t y s t e o l l i s u u t t a + k i e r r ä t y s t i l a n n e + k i e r r ä t y s t o i m e t + k i e r r ä t y s t u t k i m u k s e e n + k i e r r ä t y s t ä + k i e r r ä t y s t ö i h i n + k i e r r ä t y s v e l v o l l i s u u d e n + k i e r r ä t y s y h t e i s k u n n a k s i + k i e r r ä t y s y h t e i s k u n n a n + k i e r r ä t y s y h t e i s k u n t a + k i e r r ä t y s y h t e i s k u n t a a + k i e r r ä t y s y h t e i s k u n t a a n + k i e r r ä t y s y r i t y k s i ä + k i e r r ä t y s y r i t y s + k i e r r ä t y s ä ä n n ö k s i ä + k i e r t e e n + k i e r t e e s e e n + k i e r t e e s s ä + k i e r t e e s t ä + k i e r t e i s g a l a k s i + k i e r t e i s h ä n t ä m u u r a h a i s k ä p y + k i e r t e l e m ä t t ä + k i e r t e l e m ä ä n + k i e r t o a i k a + k i e r t o h a k a t y k k i + k i e r t o i l m a h e n g i t y s + k i e r t o i l m i ö ö n + k i e r t o j ä r j e s t e l m ä l l ä + k i e r t o j ä r j e s t e l m ä s t ä + k i e r t o k a n k i + k i e r t o k i i t ä j ä + k i e r t o k i r j e + k i e r t o k i r j e e s s ä + k i e r t o k o u l u j a + k i e r t o k u l k u + k i e r t o k u l k u a + k i e r t o k u l k u u n + k i e r t o k u l u n + k i e r t o k y t k i n + k i e r t o l a i s e l ä m ä n + k i e r t o l a i s e l ä m ä n t y y l e j ä + k i e r t o l a i s e l ä m ä ä + k i e r t o l a i s e l ä m ä ä n + k i e r t o l a i s e t + k i e r t o l a i s l e i r i n + k i e r t o l i i k e n n e t t ä + k i e r t o l i i k e n t e e n + k i e r t o m a l l i + k i e r t o m a t k a l l e + k i e r t o m e n e t t e l y n + k i e r t o m e n e t t e l y s t ä + k i e r t o m u u t o l l e + k i e r t o m u u t o n + k i e r t o m u u t o s s a + k i e r t o m u u t o s t a + k i e r t o m u u t t o + k i e r t o m u u t t o a + k i e r t o m u u t t o o n + k i e r t o n i k a m a n i v e l + k i e r t o o n + k i e r t o p e r i a a t t e e n + k i e r t o r a t a m a n ö ö v e r i + k i e r t o s i i r t o l a i s u u d e n + k i e r t o s i i r t o l a i s u u s + k i e r t o s i i r t o l a i s u u s h a n k k e e s t a + k i e r t o s i i r t o l a i s u u t t a + k i e r t o s t r a t e g i o i t a + k i e r t o t a t a r + k i e r t o t e i t ä + k i e r t o t i e + k i e r t o t i e k s i + k i e r t o t i e n + k i e r t o t i e t ä + k i e r t o t u k i n e e n + k i e r t o v i i s u m i e n + k i e r t u e i s t a + k i e r t ä j ä h e r m o + k i e r t ä j ä k a l v o s i n + k i e r t ä m ä ä n + k i e r t ä v i l l ä + k i e r t ä v ä l l ä + k i e r t ä v ä n + k i e r t ä v ä s t ä + k i e r t ä v ä t + k i e r t ä v ä ä + k i e r t ä ä + k i e r t ä ä k s e e n + k i e t o u t u v a t + k i h a r a n ä r h i + k i h a r a p e l i k a a n i + k i h a r a t ö y h t ö n a p s i j a + k i h l a j a i s i s s a + k i h l a s o r m u s + k i h o t + k i i h d y t i n r e a k t o r i + k i i h d y t t ä m i s e k s i + k i i h d y t t ä ä + k i i h d y t t ä ä k s e m m e + k i i h d y t t ä ä k ö + k i i h d y t y s k i s a t + k i i h k e i d e n + k i i h k e i m m i n + k i i h k e i m m i s t ä + k i i h k e i m p i e n + k i i h k e i n t ä + k i i h k e i s i i n + k i i h k e i t ä + k i i h k e ä k s i + k i i h k e ä m m i k s i + k i i h k e ä m m i n + k i i h k e ä m p i ä + k i i h k e ä n + k i i h k e ä s s ä + k i i h k e ä t k i n + k i i h k e ä ä + k i i h k e ä ä n + k i i h k o f e m i n i s m i n + k i i h k o f u n d a m e n t a l i s t i t + k i i h k o h i n d u l a i s u u d e s t a + k i i h k o i l e m a t t a + k i i h k o i l i j o i d e n + k i i h k o i l i j o i l l e + k i i h k o i l i j o i t a + k i i h k o i s l a m i l a i n e n + k i i h k o i s l a m i l a i s e n + k i i h k o i s l a m i l a i s e t + k i i h k o i s l a m i l a i s t e n + k i i h k o i s ä n m a a l l i s u u d e n + k i i h k o i s ä n m a a l l i s u u s + k i i h k o k a n s a l l i s e t + k i i h k o m u s l i m i e n + k i i h k o m u s l i m i t + k i i h k o n a t i o n a l i s m i k s i + k i i h k o p a l e s t i i n a l a i s t e n + k i i h k o t t o m a m m i n + k i i h k o u s k o n n o l l i s i a + k i i h k o u s k o n n o l l i s u u s + k i i h o t t u m i n e n + k i i h o t u s k a m p a n j o i d e n + k i i h o t u s p u h e e t + k i i h o t u s p u h e i s t a a n + k i i h o t u s s a n o j a + k i i h o t u s t o i m e t + k i i h t y e s s ä + k i i h t y i + k i i h t y m i s e e n + k i i h t y m y s t ä ä n + k i i h t y m ä s s ä + k i i h t y n e e t + k i i h t y v i n ä + k i i h t y v ä + k i i h t y v ä l l ä + k i i h t y v ä n + k i i h t y v ä s s ä + k i i h t y y + k i i h t y ä + k i i k a r i t ä h t ä i n + k i i l a e n k e l i k a l a + k i i l a k y l k i + k i i l a n + k i i l a n o k k a k o l i b r i + k i i l a p y r s t ö k o t k a + k i i l a s a p e l i k o l i b r i + k i i l a s ä p p i k a l a + k i i l a v u o k k o k a l a + k i i l l e m u s t e s i e n i + k i i l l o t t a m i s t a + k i i l t o a s t i a t + k i i l t o a s t i o i t a + k i i l t o k a k a d u + k i i l t o k o t t a r a i n e n + k i i l t o k u o r i a i s e t + k i i l t o k u r j e n p o l v i + k i i l t o l a t v u s k o t t a r a i n e n + k i i l t o l e s k i + k i i l t o m a l v a + k i i l t o m a t o + k i i l t o n o k i r a s t a s + k i i l t o p a j u + k i i l t o p e n s a s + k i i l t o r a u n i o i n e n + k i i l t o t u h k a p e n s a s + k i i l t o t u o m i + k i i l t o t ä d y k e + k i i n a a n + k i i n a k i n + k i i n a l a i s a k t i v i s t i + k i i n a l a i s a l u k s e s t a + k i i n a l a i s d i p l o m a a t t i + k i i n a l a i s e k s i + k i i n a l a i s e l l a + k i i n a l a i s e s t a + k i i n a l a i s e t + k i i n a l a i s i a + k i i n a l a i s i a k a a n + k i i n a l a i s i l l e + k i i n a l a i s i s t a + k i i n a l a i s m i e h i ä + k i i n a l a i s m i e l i n e n + k i i n a l a i s s a a r e k k e i t a + k i i n a l a i s t a + k i i n a l a i s t e n + k i i n a l a i s v a s t a i s t a + k i i n a l a i s v i r a n o m a i s t e n + k i i n a l a i s v i r k a m i e s t e n + k i i n a l a i s v ä h e m m i s t ö n + k i i n a l a i s y h t e i s k u n n a s t a + k i i n a l a i s y h t e i s ö n + k i i n a l a i s y r i t y k s e t + k i i n a l a i s y r i t y s t e n + k i i n a l l a + k i i n a l l e + k i i n a l t a + k i i n a n + k i i n a n a a v i k k o k i s s a + k i i n a n a l l i g a a t t o r i + k i i n a n a u r i n k o m ä y r ä + k i i n a n b u l b u l i + k i i n a n h a r j a k o i r a + k i i n a n i s o l e p i n k ä i n e n + k i i n a n j ä t t i s a l a m a n t e r i + k i i n a n k a a l i + k i i n a n k a a n + k i i n a n k a t a j a + k i i n a n k e l l o s a m m a k k o + k i i n a n k e r t t u n e n + k i i n a n k i e l i s e l l e + k i i n a n k i n + k i i n a n k o t t a r a i n e n + k i i n a n k u u m e i s e n + k i i n a n k u u s i + k i i n a n k ä ä p i ö h a m s t e r i + k i i n a n k ä ä p i ö t u l i l i s k o + k i i n a n l a i k k u k ö y n n ö s + k i i n a n l a u l u r a s t a s + k i i n a n l o i s t o f a s a a n i + k i i n a n m u n t j a k k i + k i i n a n m u u r i e n + k i i n a n m u u r i t e o r i a + k i i n a n n a k k e l i + k i i n a n n a u r u l o k k i + k i i n a n p o k e r i + k i i n a n p u n a p u u + k i i n a n r i i s i h a i k a r a + k i i n a n r i t a r i n k a n n u s + k i i n a n r u n k o j ä ä r ä + k i i n a n r u u s u + k i i n a n s i e p p o k e r t t u + k i i n a n s i n i s a d e + k i i n a n s i p u l i + k i i n a n s o t k a + k i i n a n t a m m i s i l k k i k e h r ä ä j ä + k i i n a n t i i k e r i + k i i n a n t i m a l i + k i i n a n t u o n e n s i i p i + k i i n a n u u n i l i n t u + k i i n a n v a r i s + k i i n a n v u o r i s i r k k u + k i i n a n š a k k i + k i i n a s s a + k i i n a s s a k i n + k i i n a s t a + k i i n n e k o h d a n + k i i n n e k o h d a t + k i i n n e k o h t a + k i i n n e k o h t a a + k i i n n e k o h t a n a + k i i n n e k o h t i a + k i i n n e l a i n a a + k i i n n e l a i n a m a r k k i n a t + k i i n n e l a i n a n + k i i n n e l a i n a t + k i i n n e l a i n o i n a + k i i n n e l a i n o i s s a + k i i n n e l a i n o j a + k i i n n e l a i n o j e n + k i i n n e o b l i g a a t i o t + k i i n n i j ä ä m i s e n + k i i n n i o t e t t a v a a + k i i n n i o t t a m i s e s t a + k i i n n i o t t o r a h a s t o + k i i n n i o t t o r a h a s t o k s i + k i i n n i t e t t i i n + k i i n n i t e t t ä i s i i n + k i i n n i t e t ä + k i i n n i t e t ä ä n + k i i n n i t i m m e + k i i n n i t t i + k i i n n i t t i v ä t + k i i n n i t t y i + k i i n n i t t ä i s i + k i i n n i t t ä i s i n + k i i n n i t t ä i s i v ä t + k i i n n i t t ä m i s e k s i + k i i n n i t t ä m i s e s t ä + k i i n n i t t ä m i s t ä + k i i n n i t t ä m ä l l ä + k i i n n i t t ä m ä n + k i i n n i t t ä m ä t t ä + k i i n n i t t ä m ä ä n + k i i n n i t t ä n e e t + k i i n n i t t ä n y t + k i i n n i t t ä v i ä + k i i n n i t t ä v ä n + k i i n n i t t ä v ä n s ä + k i i n n i t t ä ä + k i i n n i t t ä ä k s e e n + k i i n n i t t ä ä k s e m m e + k i i n n i t t ä ä k s e n i + k i i n n i t y k s e n h a l t i j o i d e n + k i i n n i t y s a r v o p a p e r i m a r k k i n o i l l e + k i i n n i t y s l u o t o i s t a + k i i n n i t y s l u o t o n + k i i n n i t y s l u o t t o + k i i n n i t y s l u o t t o a + k i i n n i t y s l u o t t o j a + k i i n n i t y s l u o t t o j e n + k i i n n i t y s l u o t t o k o r o l l a + k i i n n i t y s l u o t t o k r i i s i l l ä + k i i n n i t y s l u o t t o m a r k k i n o i l l a + k i i n n i t y s m a r k k i n o i l l e + k i i n n i t y s n a s t o j a + k i i n n i t y s p a l v e l u i s s a + k i i n n i t y s p a l v e l u j e n + k i i n n i t y s r e k i s t e r i t o i m i s t o i s s a + k i i n n i t y s t u l p p a + k i i n n i t ä m m e + k i i n n i t ä m m e k i n + k i i n n i t ä m m e k ö + k i i n n i t ä n + k i i n n i t ä t t e + k i i n n o s t a a + k i i n n o s t a i s i + k i i n n o s t a k a a n + k i i n n o s t a v a a + k i i n n o s t a v a a n + k i i n n o s t a v a k s i + k i i n n o s t a v a l l a + k i i n n o s t a v a m m a k s i + k i i n n o s t a v a m m a n + k i i n n o s t a v a m m a s t a + k i i n n o s t a v a m m a t + k i i n n o s t a v a m p a a + k i i n n o s t a v a m p i + k i i n n o s t a v a m p i a + k i i n n o s t a v a m p i e n + k i i n n o s t a v a n + k i i n n o s t a v a s t a + k i i n n o s t a v a t + k i i n n o s t a v i a + k i i n n o s t a v i i n + k i i n n o s t a v i m m i s t a + k i i n n o s t a v i m p i a + k i i n n o s t a v i m p i n a + k i i n n o s t a v i n + k i i n n o s t a v i n t a + k i i n n o s t a v i s t a + k i i n n o s t i + k i i n n o s t u a + k i i n n o s t u k s e e n + k i i n n o s t u k s e n + k i i n n o s t u k s e n i l m a i s u p y y n n ö t + k i i n n o s t u k s e n i l m a i s u p y y n t ö + k i i n n o s t u k s e n i l m a i s u p y y n t ö j e n + k i i n n o s t u k s e n i l m a i s u p y y n t ö ä + k i i n n o s t u k s e n s a + k i i n n o s t u k s e s t a + k i i n n o s t u k s e s t a a n + k i i n n o s t u k s e s t a n n e + k i i n n o s t u m a a n + k i i n n o s t u n e e m p i + k i i n n o s t u n e e m p i a + k i i n n o s t u n e e n a + k i i n n o s t u n e i d e n + k i i n n o s t u n e i l l a + k i i n n o s t u n e i l l e + k i i n n o s t u n e i m p i a + k i i n n o s t u n e i m p i e n + k i i n n o s t u n e i n + k i i n n o s t u n e i n a + k i i n n o s t u n e i t a + k i i n n o s t u s t a + k i i n t e i d e n + k i i n t e i n ä + k i i n t e i s s ä + k i i n t e i s t ä + k i i n t e i s t ö a l a + k i i n t e i s t ö a l a a + k i i n t e i s t ö a l a l l a + k i i n t e i s t ö a l a l l e + k i i n t e i s t ö a l a n + k i i n t e i s t ö a r v o + k i i n t e i s t ö b i s n e s t ä + k i i n t e i s t ö h a l l i n n a n + k i i n t e i s t ö h a l l i n n a s t a + k i i n t e i s t ö h a l l i n t a a + k i i n t e i s t ö h a n k k e i d e n + k i i n t e i s t ö h a n k k e i l l e + k i i n t e i s t ö h a n k k e i t a + k i i n t e i s t ö h i n t o j e n + k i i n t e i s t ö h u i j a u k s i s t a + k i i n t e i s t ö i n f l a a t i o o n + k i i n t e i s t ö i n v e s t o i n t e i h i n + k i i n t e i s t ö i n v e s t o i n t i o h j e l m a t + k i i n t e i s t ö i s t ä + k i i n t e i s t ö j e n + k i i n t e i s t ö j ä + k i i n t e i s t ö j ä ä n + k i i n t e i s t ö k a u p a n + k i i n t e i s t ö k a u p a s s a + k i i n t e i s t ö k a u p o i l l a + k i i n t e i s t ö k a u p o i s s a + k i i n t e i s t ö k a u p o i s t a + k i i n t e i s t ö k a u p p o i h i n + k i i n t e i s t ö k a u p p o j e n + k i i n t e i s t ö k e i n o t t e l i j a t + k i i n t e i s t ö k e i n o t t e l u + k i i n t e i s t ö k e i n o t t e l u a + k i i n t e i s t ö k e i n o t t e l u n + k i i n t e i s t ö k e i n o t t e l u u n + k i i n t e i s t ö k i i m a + k i i n t e i s t ö k r i i s i l l ä + k i i n t e i s t ö k r i i s i n ä + k i i n t e i s t ö k r i i s i ä + k i i n t e i s t ö k u l u t + k i i n t e i s t ö k u p l a + k i i n t e i s t ö k u p l a a + k i i n t e i s t ö k u p l a n + k i i n t e i s t ö k u p l a n s a + k i i n t e i s t ö k u p l a t + k i i n t e i s t ö l a i n o j a + k i i n t e i s t ö l a i n s ä ä d ä n t ö + k i i n t e i s t ö m a r k k i n o i d e n + k i i n t e i s t ö m a r k k i n o i l l a + k i i n t e i s t ö m a r k k i n o i l l e + k i i n t e i s t ö m a r k k i n o i t a + k i i n t e i s t ö m e n o j a + k i i n t e i s t ö m e n o j e n + k i i n t e i s t ö n + k i i n t e i s t ö n o m i s t a j i e n + k i i n t e i s t ö n v ä l i t t ä j i e n + k i i n t e i s t ö n v ä l i t t ä j i l l e + k i i n t e i s t ö n v ä l i t t ä j ä t + k i i n t e i s t ö o h j e l m a n + k i i n t e i s t ö o m i s t a j a + k i i n t e i s t ö o s t o + k i i n t e i s t ö p o l i i t t i s t e n + k i i n t e i s t ö p o l i t i i k a l l e + k i i n t e i s t ö p o l i t i i k a n + k i i n t e i s t ö p o l i t i i k a s t a + k i i n t e i s t ö p o l i t i i k k a + k i i n t e i s t ö p o l i t i i k k a a + k i i n t e i s t ö p o l i t i i k k a a n + k i i n t e i s t ö p o l i t i i k k o j a + k i i n t e i s t ö r a h a s t o i h i n + k i i n t e i s t ö r a h a s t o i s t a + k i i n t e i s t ö r a h a s t o j a + k i i n t e i s t ö r a k e n t a j i l l e + k i i n t e i s t ö r e k i s t e r i + k i i n t e i s t ö r e k i s t e r i j ä r j e s t e l m ä n + k i i n t e i s t ö r e k i s t e r i n + k i i n t e i s t ö s i j o i t u k s i a + k i i n t e i s t ö s i j o i t u k s i s t a + k i i n t e i s t ö s k a n d a a l i e n + k i i n t e i s t ö s t r a t e g i a + k i i n t e i s t ö s t r a t e g i a a + k i i n t e i s t ö s t r a t e g i a l l e + k i i n t e i s t ö s t r a t e g i a n + k i i n t e i s t ö t + k i i n t e i s t ö t a r p e e t + k i i n t e i s t ö v a k u u s + k i i n t e i s t ö v a r a u k s e e n + k i i n t e i s t ö v a r a u s t a + k i i n t e i s t ö v e r o + k i i n t e i s t ö v e r o a + k i i n t e i s t ö v i r a n o m a i s e n + k i i n t e i s t ö v ä l i t t ä j i l t ä + k i i n t e i s t ö y h t i ö t + k i i n t e i s t ö y r i t t ä j ä + k i i n t e i s t ö y r i t t ä j ä ä n + k i i n t e i s t ö š o k i n + k i i n t e i t ä + k i i n t e y t t ä m i s t u t k i m u k s e n + k i i n t e y t t ä m ä ä n + k i i n t e ä h i n t a i s t e n + k i i n t e ä k o r k o i s e t + k i i n t e ä k s i + k i i n t e ä m m i n + k i i n t e ä m p i + k i i n t e ä n + k i i n t e ä s t ä + k i i n t e ä t + k i i n t e ä ä + k i i n t e ä ä n + k i i n t i ö a j a t t e l u + k i i n t i ö a r v i o t + k i i n t i ö e h d o t u k s i a + k i i n t i ö e h d o t u s + k i i n t i ö h i n n o i s t a + k i i n t i ö h u u t o k a u p a s s a + k i i n t i ö i d e n + k i i n t i ö i h i n + k i i n t i ö i l l ä + k i i n t i ö i n ä + k i i n t i ö i s t ä + k i i n t i ö i t y + k i i n t i ö i t ä + k i i n t i ö i t ä ä n + k i i n t i ö j a k o j e n + k i i n t i ö j a o l l e + k i i n t i ö j a o n + k i i n t i ö j ä r j e s t e l m i e n + k i i n t i ö j ä r j e s t e l m i l l e + k i i n t i ö j ä r j e s t e l m i ä + k i i n t i ö j ä r j e s t e l m ä + k i i n t i ö j ä r j e s t e l m ä l l ä + k i i n t i ö j ä r j e s t e l m ä m m e + k i i n t i ö j ä r j e s t e l m ä n + k i i n t i ö j ä r j e s t e l m ä s s ä + k i i n t i ö j ä r j e s t e l m ä s t ä + k i i n t i ö j ä r j e s t e l m ä t + k i i n t i ö j ä r j e s t e l m ä ä + k i i n t i ö j ä r j e s t e l m ä ä n + k i i n t i ö j ä r j e s t e l y + k i i n t i ö j ä r j e s t e l y j e n + k i i n t i ö j ä r j e s t e l y n + k i i n t i ö k e h y s t ä + k i i n t i ö k y s y m y k s e n + k i i n t i ö k y s y m y s + k i i n t i ö k y s y m y s t ä + k i i n t i ö k ä y t ä n n ö n + k i i n t i ö l e i k k a u k s i a + k i i n t i ö l e i k k a u k s i l l a + k i i n t i ö l i s ä y k s e t + k i i n t i ö l i s ä y s t e n + k i i n t i ö l l e + k i i n t i ö l o i k k a r e i d e n + k i i n t i ö m e k a n i s m i i n + k i i n t i ö n + k i i n t i ö n h a l t i j a + k i i n t i ö n l e i k k a u s + k i i n t i ö n ä k ö k o h t a a n + k i i n t i ö o i k e u d e t + k i i n t i ö o n g e l m a a + k i i n t i ö o s u u d e t + k i i n t i ö o s u u k s i s t a + k i i n t i ö p a k o l a i s i a + k i i n t i ö p e r i a a t e + k i i n t i ö p e r u s t e i s t e n + k i i n t i ö p o l i t i i k a l l a + k i i n t i ö p o l i t i i k a n + k i i n t i ö p o l i t i i k k a + k i i n t i ö p o l i t i i k k a a + k i i n t i ö p o l i t i i k k a a n + k i i n t i ö r a j o i t u k s i s t a + k i i n t i ö r a n g a i s t u k s i s t a + k i i n t i ö r a n g a i s t u s t e n + k i i n t i ö s i i r t o + k i i n t i ö s o k e r i a + k i i n t i ö s o k e r i k s i + k i i n t i ö s u o j a + k i i n t i ö s ä ä n t e l y n + k i i n t i ö t + k i i n t i ö t a s o s t a + k i i n t i ö t a v o i t e + k i i n t i ö t a v o i t t e i d e m m e + k i i n t i ö t u o t a n n o s t a + k i i n t i ö t ä + k i i n t i ö v a i h t o e h t o + k i i n t i ö v a p a a + k i i n t i ö v a p a a n + k i i n t i ö v a p a a t a + k i i n t i ö v a r a n t o a + k i i n t i ö v u o d e s t a + k i i n t i ö v ä l i n e i d e n + k i i n t o j ä ä + k i i n t o l e v y + k i i n t o l e v y l l e + k i i n t o p a l l o + k i i n t o p i s t e + k i i n t o p i s t e e m m e + k i i n t o p i s t e e n + k i i n t o p i s t e e n ä + k i i n t o p i s t e e n ä ä n + k i i n t o p i s t e e t + k i i n t o p i s t e i d e n + k i i n t o p i s t e i n ä + k i i n t o p i s t e i s i i n + k i i n t o p i s t e i t ä + k i i n t o p i s t e l a u s e + k i i n t o p i s t e t t ä + k i i n t y m y s s u h d e + k i i n t y m y s s u h d e t e o r i a + k i i n t y n e i t ä + k i i n t y ä + k i i p e i l y l i i t t o + k i i p e i l y t e l i n e + k i i p e ä m ä ä n + k i i p i j ä k a l a t + k i i p i j ä t i m a l i + k i i r a s t o r s t a i n a + k i i r e e l l i s e e n + k i i r e e l l i s e k s i + k i i r e e l l i s e m m i k s i + k i i r e e l l i s e m m i n + k i i r e e l l i s e m m ä n + k i i r e e l l i s e m m ä s s ä + k i i r e e l l i s e m p i + k i i r e e l l i s e m p i e n + k i i r e e l l i s e m p i n ä + k i i r e e l l i s e m p i ä + k i i r e e l l i s e m p i ä k i n + k i i r e e l l i s e m p ä n ä + k i i r e e l l i s e m p ä ä + k i i r e e l l i s e m p ä ä n + k i i r e e l l i s e n + k i i r e e l l i s e n ä + k i i r e e l l i s e s s ä + k i i r e e l l i s e s t ä + k i i r e e l l i s e t + k i i r e e l l i s i i n + k i i r e e l l i s i k s i + k i i r e e l l i s i m m i n + k i i r e e l l i s i m m i s t ä + k i i r e e l l i s i m m ä k s i + k i i r e e l l i s i m m ä n + k i i r e e l l i s i m m ä s t ä + k i i r e e l l i s i m m ä t + k i i r e e l l i s i m p i e n + k i i r e e l l i s i m p i i n + k i i r e e l l i s i m p i n ä + k i i r e e l l i s i m p i ä + k i i r e e l l i s i m p ä n ä + k i i r e e l l i s i n + k i i r e e l l i s i n t ä + k i i r e e l l i s i n ä + k i i r e e l l i s i s s ä + k i i r e e l l i s i s t ä + k i i r e e l l i s i ä + k i i r e e l l i s t e n + k i i r e e l l i s t ä + k i i r e e l l i s y y d e n + k i i r e e l l i s y y d e s t ä + k i i r e e l l i s y y s a s t e e t + k i i r e e l l i s y y s j ä r j e s t e l m ä ä + k i i r e e l l i s y y s k e s k u s t e l u + k i i r e e l l i s y y s k e s k u s t e l u s s a + k i i r e e l l i s y y s k y s y m y k s i i n + k i i r e e l l i s y y s l e i m a n + k i i r e e l l i s y y s m e n e t t e l y + k i i r e e l l i s y y s m e n e t t e l y n + k i i r e e l l i s y y s m e n e t t e l y s s ä + k i i r e e l l i s y y s m e n e t t e l y y n + k i i r e e l l i s y y s m e n e t t e l y ä + k i i r e e l l i s y y s p y y n n ö n + k i i r e e l l i s y y s p y y n t ö ä + k i i r e e l l i s y y s p ä ä t ö k s e m m e + k i i r e e l l i s y y s p ä ä t ö s t ä + k i i r e e l l i s y y s ä ä n e s t y k s e s t ä + k i i r e e l l i s y y t t ä + k i i r e e l l ä + k i i r e e n + k i i r e e s e e n + k i i r e e s s ä + k i i r e e t t ä + k i i r e h d i m m e + k i i r e h d i t t i i n + k i i r e h d i t y n + k i i r e h d i t ä ä n + k i i r e h t i e s s ä ä n + k i i r e h t i k ä ä m m e + k i i r e h t i m i s e s t ä + k i i r e h t i m ä n s ä + k i i r e h t i m ä ä n + k i i r e h t i v ä t + k i i r e h t i ä + k i i r e i m m i n + k i i r e i s e m m i n + k i i r e i s e m m ä k s i + k i i r e i s e m p i ä k i n + k i i r e i s i m m i n + k i i r e i s i m m ä n + k i i r e i s i m p i ä + k i i r e i s i n + k i i r e i s i s s ä + k i i r e i s i ä + k i i r e t t ä + k i i r u h t a m a l l a + k i i r u n a n k e l l o + k i i r u n a s t a + k i i s t a a + k i i s t a j u t t u j e n + k i i s t a k a p u l a + k i i s t a k a p u l a a + k i i s t a k a p u l a k s i + k i i s t a k a p u l a n a + k i i s t a k a p u l a s s a + k i i s t a k a p u l o i n a + k i i s t a k o h d a t + k i i s t a k o h d i k s i + k i i s t a k o h d i s t a + k i i s t a k o h t a + k i i s t a k u m p p a n i n + k i i s t a k y s y m y k s e e n + k i i s t a k y s y m y k s e n ä + k i i s t a k y s y m y k s e s t ä + k i i s t a k y s y m y k s e t + k i i s t a k y s y m y k s i i n + k i i s t a k y s y m y k s i s s ä + k i i s t a k y s y m y k s i ä + k i i s t a k y s y m y s + k i i s t a k y s y m y s t e n + k i i s t a k y s y m y s t ä + k i i s t a n + k i i s t a n a i h e + k i i s t a n a i h e e n + k i i s t a n a i h e i s t a + k i i s t a n a l a i n e n + k i i s t a n a l a i s e k s i + k i i s t a n a l a i s e l l e + k i i s t a n a l a i s e l t a + k i i s t a n a l a i s e m m a s t a + k i i s t a n a l a i s e m p a a + k i i s t a n a l a i s e m p a a n + k i i s t a n a l a i s e m p i + k i i s t a n a l a i s e m p i a + k i i s t a n a l a i s e m p i e n + k i i s t a n a l a i s e n + k i i s t a n a l a i s e n a + k i i s t a n a l a i s e s s a + k i i s t a n a l a i s e s t a + k i i s t a n a l a i s e t + k i i s t a n a l a i s i a + k i i s t a n a l a i s i i n + k i i s t a n a l a i s i l l e + k i i s t a n a l a i s i m m a k s i + k i i s t a n a l a i s i m m a n + k i i s t a n a l a i s i m m a t + k i i s t a n a l a i s i m m i s s a + k i i s t a n a l a i s i m m i s t a + k i i s t a n a l a i s i m p a a n + k i i s t a n a l a i s i m p i a + k i i s t a n a l a i s i m p i e n + k i i s t a n a l a i s i m p i i n + k i i s t a n a l a i s i n + k i i s t a n a l a i s i n t a + k i i s t a n a l a i s i s s a + k i i s t a n a l a i s i s t a + k i i s t a n a l a i s t a + k i i s t a n a l a i s t e n + k i i s t a n a l a i s u u d e s t a a n + k i i s t a n a l a i s u u s + k i i s t a n r a t k a i s u e l i n + k i i s t a n r a t k a i s u m e k a n i s m i n + k i i s t a n r a t k a i s u m e n e t t e l y n + k i i s t a n r a t k a i s u m e n e t t e l y s t ä + k i i s t a n s a + k i i s t a p u o l e t + k i i s t a s s a + k i i s t a s t a + k i i s t a t + k i i s t a t a l o u d e s t a + k i i s t a t o n t a + k i i s t a t t a + k i i s t a t t o m a l l e + k i i s t a t t o m a m m i n + k i i s t a t t o m a m p i + k i i s t a t t o m a n + k i i s t a t t o m a n a + k i i s t a t t o m a t + k i i s t a t t o m i a + k i i s t a t t o m i n + k i i s t e l e m m e + k i i s t e l e m ä l l ä + k i i s t e l e m ä t t ä + k i i s t e l l y i m m i s t ä + k i i s t e l l y i m p i e n + k i i s t e l l y i m p i ä + k i i s t e l l y i n + k i i s t e l l y i s s ä + k i i s t e l l y m p i + k i i s t e l l y s t ä + k i i s t e l l ä + k i i s t e l l ä ä n + k i i s t e l t y + k i i s t e l t y y n + k i i s t e l t y ä + k i i s t e l t y ä m m e + k i i s t e l t ä e s s ä + k i i s t e l y y n + k i i s t e t ä ä n + k i i s t o i h i n + k i i s t o i s s a + k i i s t o i s t a + k i i s t o j a + k i i s t o j e n + k i i s t o j e n r a t k a i s u m e n e t e l m ä n + k i i s t o j e n r a t k a i s u m e n e t t e l y n + k i i s t o j e n r a t k a i s u p r o s e s s i + k i i s t ä e s s ä ä n + k i i s t ä m i s t ä + k i i s t ä m ä t t ö m i ä + k i i s t ä m ä t t ö m ä t + k i i s t ä m ä t ö n t ä + k i i s t ä v ä t + k i i s t ä ä + k i i s t ä ä k s e e n + k i i t e l l ä + k i i t e l t i i n k i n + k i i t e t t y ä n i + k i i t e t t ä v i n + k i i t e t t ä v ä l l ä + k i i t e t t ä v ä n + k i i t e t t ä v ä s t ä + k i i t e t t ä v ä ä + k i i t e t y i m m i s t ä + k i i t e t y n + k i i t o h ä m ä h ä k i t + k i i t o k s e e n + k i i t o k s e m m e + k i i t o k s e n + k i i t o k s e n i + k i i t o k s e n s a + k i i t o k s e t + k i i t o k s i a + k i i t o k s i a n i + k i i t o k s i i n + k i i t o k s i i n i + k i i t o l l i s e m p i + k i i t o l l i s e m p i a + k i i t o l l i s i a + k i i t o l l i s i n + k i i t o l l i s i n a + k i i t o l l i s u u d e n v e l a s s a + k i i t o l l i s u u d e n v e l a s t a + k i i t o l l i s u u t e m m e + k i i t o l l i s u u t e n i + k i i t o l l i s u u t t a m m e + k i i t o r a t a k a p a s i t e e t t i + k i i t o s k i n + k i i t o s s a n o i l l a n i + k i i t o s t a + k i i t o s t e n + k i i t t e l e m ä s s ä + k i i t t ä e s s ä m m e + k i i t t ä e s s ä n i + k i i t t ä i s i n + k i i t t ä k ä ä m m e + k i i t t ä m i s e n + k i i t t ä m ä l l ä + k i i t t ä m ä s t ä + k i i t t ä m ä t t ä + k i i t t ä n e e t + k i i t t ä n y t + k i i t t ä ä + k i i t t ä ä k i n + k i i t t ä ä k s e n i + k i i t ä m m e + k i i t ä n + k i i t ä n k i n + k i i t ä ä + k i i v a a m m i n + k i i v a a m p i a + k i i v a a t + k i i v a i m m i l l a a n + k i i v a i m m i n + k i i v a i m m i s t a + k i i v a i n + k i i v a i s i i n + k i i v a i s s a + k i i v a i s t a + k i i v a i t a + k i i v a i t a k i n + k i i v a s t a + k i i v a s t u n e e m m a l t a + k i i v i h i i l e e n + k i i v i k ö y n n ö s + k i k k a i l u u n + k i k u j u t + k i l j u h a n h i + k i l j u k o t k a + k i l j u m e r i k o t k a + k i l j u v a t + k i l k k a r u o h o + k i l o a + k i l o a k a a n + k i l o g r a m m a n + k i l o h i n n a n + k i l o h i n t a + k i l o h i n t a a n + k i l o l t a + k i l o m e t r e i h i n + k i l o m e t r e j ä + k i l o m e t r i e n + k i l o m e t r i i n + k i l o m e t r i k o h t a i n e n + k i l o m e t r i k u s t a n n u k s e t + k i l o m e t r i l l ä + k i l o m e t r i l t ä + k i l o m e t r i n + k i l o m e t r i s s ä + k i l o m e t r i t a k s a n + k i l o m e t r i ä + k i l o p o n d i + k i l o w a t t i p ä i v i e n + k i l o w a t t i p ä i v i k s i + k i l o w a t t i p ä i v ä r a j o i t u k s i a + k i l o w a t t i p ä i v ä r a j o i t u k s i e n + k i l o w a t t i t u n n e i s t a + k i l o w a t t i t u n n i n + k i l o w a t t i t u n n i s s a + k i l o w a t t i t u n t i a + k i l o w a t t i t u n t i m i t t a r i + k i l p a i l e e + k i l p a i l e m a a n + k i l p a i l e m a s t a + k i l p a i l e v a a + k i l p a i l e v a t + k i l p a i l e v i a + k i l p a i l e v i e n + k i l p a i l e v i l l a + k i l p a i l e v i s t a + k i l p a i l i j a a + k i l p a i l i j a a n + k i l p a i l i j a m a a s t a + k i l p a i l i j a m a a t + k i l p a i l i j a m a i d e m m e + k i l p a i l i j a m a i d e n + k i l p a i l i j a m a i s s a + k i l p a i l i j a m m e + k i l p a i l i j a n + k i l p a i l i j a n s a + k i l p a i l i j a s a t e l l i i t e i s t a + k i l p a i l i j a t + k i l p a i l i j a v a l t i o i s s a + k i l p a i l i j o i d e m m e + k i l p a i l i j o i d e n + k i l p a i l i j o i d e n s a + k i l p a i l i j o i l l e + k i l p a i l i j o i t a m m e + k i l p a i l i s i v a t + k i l p a i l k a a m m e + k i l p a i l l a + k i l p a i l l a a n + k i l p a i l l a k s e e n + k i l p a i l l a k s e m m e + k i l p a i l t a e s s a + k i l p a i l t a v a + k i l p a i l t u + k i l p a i l u a + k i l p a i l u a i h e e s t a + k i l p a i l u a j a t t e l u + k i l p a i l u a l a a + k i l p a i l u a l a l l a + k i l p a i l u a n a l y y s i s s ä + k i l p a i l u a r e e n o i t a + k i l p a i l u a r v i o i n t e j a + k i l p a i l u a s e m a + k i l p a i l u a s e m a a + k i l p a i l u a s e m a a m m e + k i l p a i l u a s e m a a n + k i l p a i l u a s e m a a n s a + k i l p a i l u a s e m a l l e + k i l p a i l u a s e m a m m e + k i l p a i l u a s e m a n + k i l p a i l u a s e m a n s a + k i l p a i l u a s e m a s s a + k i l p a i l u a s e m a s t a + k i l p a i l u a s e m i e n + k i l p a i l u a s e m i i n + k i l p a i l u a s e m i s s a + k i l p a i l u a s e m i s t a + k i l p a i l u a s e t e l m a a + k i l p a i l u a s e t e l m a n + k i l p a i l u a s e t u s t e n + k i l p a i l u a s i a + k i l p a i l u a s i a s s a + k i l p a i l u a s i a t + k i l p a i l u a s i o i d e n + k i l p a i l u a s i o i s s a + k i l p a i l u a s i o i s t a + k i l p a i l u a s i o i t a + k i l p a i l u d i r e k t i i v i + k i l p a i l u d i r e k t i i v i e n + k i l p a i l u d y n a m i i k a l l e + k i l p a i l u d y n a m i i k k a a + k i l p a i l u e d e l l y t y k s e t + k i l p a i l u e d e l l y t y k s i i n + k i l p a i l u e d e l l y t y k s i l l e + k i l p a i l u e d e l l y t y k s i l l ä + k i l p a i l u e d e l l y t y k s i n + k i l p a i l u e d e l l y t y k s i s t ä + k i l p a i l u e d e l l y t y k s i ä + k i l p a i l u e d e l l y t y k s i ä k ä ä n + k i l p a i l u e d e l l y t y s t e n + k i l p a i l u e d u i s t a + k i l p a i l u e d u k s i + k i l p a i l u e d u l l e + k i l p a i l u e d u n + k i l p a i l u e d u s t a + k i l p a i l u e d u t + k i l p a i l u e h d o i l l e + k i l p a i l u e h d o i s t a + k i l p a i l u e h d o t + k i l p a i l u e h t o i h i n + k i l p a i l u e h t o j a + k i l p a i l u e h t o j e n + k i l p a i l u e l e m e n t t i + k i l p a i l u e l e m e n t t i e n + k i l p a i l u e r o j a + k i l p a i l u e r o j e n + k i l p a i l u e t u + k i l p a i l u e t u a + k i l p a i l u e t u a a n + k i l p a i l u e t u a m m e + k i l p a i l u e t u i h i n + k i l p a i l u e t u i n a + k i l p a i l u e t u j a + k i l p a i l u e t u j a a n + k i l p a i l u e t u j e m m e + k i l p a i l u e t u j e n + k i l p a i l u e t u m m e + k i l p a i l u e t u n a + k i l p a i l u e t u n s a + k i l p a i l u e t u u n + k i l p a i l u f i l o s o f i a m m e + k i l p a i l u f o o r u m i s t a + k i l p a i l u h a a s t e e n + k i l p a i l u h a a s t e e s e e n + k i l p a i l u h a a s t e e s t a + k i l p a i l u h a a s t e i s i i n + k i l p a i l u h a a s t e i t a + k i l p a i l u h a i t a n + k i l p a i l u h a i t a t + k i l p a i l u h a i t o i s t a + k i l p a i l u h a i t t a + k i l p a i l u h a i t t a a + k i l p a i l u h a i t t a a n + k i l p a i l u h a i t t o j a + k i l p a i l u h a i t t o j e m m e + k i l p a i l u h a n + k i l p a i l u h e n g e n + k i l p a i l u h e n g e s s ä + k i l p a i l u h e n k e ä + k i l p a i l u h e n k i + k i l p a i l u h e n k i s e m m i s t ä + k i l p a i l u h e n k i s e m m ä n + k i l p a i l u h e n k i s e m m ä s s ä + k i l p a i l u h e n k i s e m p i + k i l p a i l u h e n k i s e t + k i l p a i l u h e n k i s t ä + k i l p a i l u h e n k i s y y t t ä + k i l p a i l u h u l l u t u s + k i l p a i l u h ä i r i ö i d e n + k i l p a i l u h ä i r i ö i h i n + k i l p a i l u h ä i r i ö i t ä + k i l p a i l u i d e o l o g i o i d e n + k i l p a i l u i h i n + k i l p a i l u i s t a + k i l p a i l u j e n + k i l p a i l u j ä r j e s t e l m i e n + k i l p a i l u j ä r j e s t e l m ä + k i l p a i l u j ä r j e s t e l m ä l l e + k i l p a i l u j ä r j e s t e l m ä n + k i l p a i l u j ä r j e s t e l m ä s t ä + k i l p a i l u j ä r j e s t e l m ä ä + k i l p a i l u j ä r j e s t e l m ä ä n + k i l p a i l u j ä r j e s t e l y j e n + k i l p a i l u j ä r j e s t e l y n + k i l p a i l u j ä r j e s t e l y y n + k i l p a i l u k a p a s i t e e t t i i n + k i l p a i l u k e h i t y k s e e n + k i l p a i l u k e h y s + k i l p a i l u k e i n o + k i l p a i l u k e i n o i n + k i l p a i l u k e i n o n a + k i l p a i l u k e i n o t + k i l p a i l u k e n t t ä + k i l p a i l u k e n t t ä n ä + k i l p a i l u k e r t o m u k s e s t a + k i l p a i l u k e r t o m u s t a + k i l p a i l u k e s k e i s e m p ä ä n + k i l p a i l u k i e l e n + k i l p a i l u k i e l l o t + k i l p a i l u k i e l t o a + k i l p a i l u k i e l t o l a u s e k k e e n + k i l p a i l u k i e l t o s o p i m u s + k i l p a i l u k o m i s s a a r i n + k i l p a i l u k o m i s s i o + k i l p a i l u k o m i s s i o n + k i l p a i l u k o m i t e a a + k i l p a i l u k r i t e e r i t + k i l p a i l u k s i + k i l p a i l u k u l t t u u r i + k i l p a i l u k u l t t u u r i n + k i l p a i l u k u l t t u u r i s s a + k i l p a i l u k u m p p a n i m m e + k i l p a i l u k u r i + k i l p a i l u k u t s u + k i l p a i l u k y i s e m m ä k s i + k i l p a i l u k y i s i m m ä n + k i l p a i l u k y k y + k i l p a i l u k y k y i n d e k s i + k i l p a i l u k y k y i n d e k s i s s ä + k i l p a i l u k y k y i n e n + k i l p a i l u k y k y i s e k s i + k i l p a i l u k y k y i s e m m i k s i + k i l p a i l u k y k y i s e m m i l l e + k i l p a i l u k y k y i s e m m i l l ä + k i l p a i l u k y k y i s e m m i n + k i l p a i l u k y k y i s e m m ä k s i + k i l p a i l u k y k y i s e m m ä l l e + k i l p a i l u k y k y i s e m m ä n + k i l p a i l u k y k y i s e m m ä s t ä + k i l p a i l u k y k y i s e m m ä t + k i l p a i l u k y k y i s e m p i + k i l p a i l u k y k y i s e m p i e n + k i l p a i l u k y k y i s e m p i i n + k i l p a i l u k y k y i s e m p i ä + k i l p a i l u k y k y i s e m p ä ä + k i l p a i l u k y k y i s e m p ä ä n + k i l p a i l u k y k y i s e n + k i l p a i l u k y k y i s e n ä + k i l p a i l u k y k y i s e s t ä + k i l p a i l u k y k y i s e t + k i l p a i l u k y k y i s i i n + k i l p a i l u k y k y i s i k s i + k i l p a i l u k y k y i s i l l ä + k i l p a i l u k y k y i s i l t ä + k i l p a i l u k y k y i s i m m i k s i + k i l p a i l u k y k y i s i m m i l l ä + k i l p a i l u k y k y i s i m m i s t ä + k i l p a i l u k y k y i s i m m ä k s i + k i l p a i l u k y k y i s i m m ä n + k i l p a i l u k y k y i s i m m ä s t ä + k i l p a i l u k y k y i s i m m ä t + k i l p a i l u k y k y i s i m p i e n + k i l p a i l u k y k y i s i m p i i n + k i l p a i l u k y k y i s i m p i ä + k i l p a i l u k y k y i s i m p ä n ä + k i l p a i l u k y k y i s i n + k i l p a i l u k y k y i s i n t ä + k i l p a i l u k y k y i s i n ä + k i l p a i l u k y k y i s i s t ä + k i l p a i l u k y k y i s i ä + k i l p a i l u k y k y i s t e n + k i l p a i l u k y k y i s t ä + k i l p a i l u k y k y i s y y d e n + k i l p a i l u k y k y k e r t o m u s t a + k i l p a i l u k y k y k u i l u n + k i l p a i l u k y k y m a h d o l l i s u u k s i e n + k i l p a i l u k y k y m a h d o l l i s u u k s i i m m e + k i l p a i l u k y k y m a l l i a + k i l p a i l u k y k y m m e + k i l p a i l u k y k y n e u v o s t o + k i l p a i l u k y k y n e u v o s t o a + k i l p a i l u k y k y n e u v o s t o l l e + k i l p a i l u k y k y n e u v o s t o n + k i l p a i l u k y k y n e u v o s t o o n + k i l p a i l u k y k y n e u v o s t o s s a + k i l p a i l u k y k y n s ä + k i l p a i l u k y k y o h j e l m a m m e + k i l p a i l u k y k y o n g e l m a + k i l p a i l u k y k y o n g e l m i a + k i l p a i l u k y k y p a k e t i n + k i l p a i l u k y k y p a k e t t i + k i l p a i l u k y k y p a r a m e t r i + k i l p a i l u k y k y p e l i n + k i l p a i l u k y k y p o l i t i i k a n + k i l p a i l u k y k y p o l i t i i k k a a + k i l p a i l u k y k y p o l i t i i k k a a n + k i l p a i l u k y k y p o t e n t i a a l i n + k i l p a i l u k y k y r a p o r t e i s t a + k i l p a i l u k y k y r a p o r t i n + k i l p a i l u k y k y s e i k a t + k i l p a i l u k y k y s o p i m u k s e s s a + k i l p a i l u k y k y s o p i m u k s e s t a + k i l p a i l u k y k y s o p i m u k s e t + k i l p a i l u k y k y s o p i m u s + k i l p a i l u k y k y s t r a t e g i a + k i l p a i l u k y k y s t r a t e g i a a + k i l p a i l u k y k y s t r a t e g i a l l e + k i l p a i l u k y k y s t r a t e g i a n + k i l p a i l u k y k y t a v o i t e t t a + k i l p a i l u k y k y t a v o i t t e e n + k i l p a i l u k y k y t a v o i t t e i l l e + k i l p a i l u k y k y t a v o i t t e i t a + k i l p a i l u k y k y t e k i j ö i d e n + k i l p a i l u k y k y t e s t e j ä + k i l p a i l u k y k y t e s t i + k i l p a i l u k y k y t e s t i ä + k i l p a i l u k y k y v a l m i u d e t + k i l p a i l u k y k y y n + k i l p a i l u k y k y ä + k i l p a i l u k y k y ä k ä ä n + k i l p a i l u k y k y ä m m e + k i l p a i l u k y k y ä ä n + k i l p a i l u k y s y m y k s i s s ä + k i l p a i l u k y s y m y k s i ä + k i l p a i l u k y s y m y s + k i l p a i l u k y s y m y s t e n + k i l p a i l u k y s y m y s t ä + k i l p a i l u k y v y l l e + k i l p a i l u k y v y l l e m m e + k i l p a i l u k y v y l t ä ä n + k i l p a i l u k y v y n + k i l p a i l u k y v y s s ä + k i l p a i l u k y v y s t ä + k i l p a i l u k y v y s t ä m m e + k i l p a i l u k y v y t t ö m i l l e + k i l p a i l u k y v y t t ö m y y d e s t ä m m e + k i l p a i l u k y v y t t ö m y y t e e n + k i l p a i l u k y v y t t ö m ä m p i e n + k i l p a i l u k ä y t ä n n ö i s t ä + k i l p a i l u k ä y t ä n n ö k s i + k i l p a i l u k ä y t ä n n ö t + k i l p a i l u k ä y t ä n t ö j ä + k i l p a i l u l a i n + k i l p a i l u l a i n s ä ä d ä n n ö l l e + k i l p a i l u l a i n s ä ä d ä n n ö l l i s e s s ä + k i l p a i l u l a i n s ä ä d ä n n ö l l i s t e n + k i l p a i l u l a i n s ä ä d ä n n ö l l ä + k i l p a i l u l a i n s ä ä d ä n n ö n + k i l p a i l u l a i n s ä ä d ä n n ö s s ä + k i l p a i l u l a i n s ä ä d ä n n ö s t ä + k i l p a i l u l a i n s ä ä d ä n t ö + k i l p a i l u l a i n s ä ä d ä n t ö j e n + k i l p a i l u l a i n s ä ä d ä n t ö t a p a u k s i s s a + k i l p a i l u l a i n s ä ä d ä n t ö ä + k i l p a i l u l a i n s ä ä d ä n t ö ä ä n + k i l p a i l u l a i n s ä ä d ä n t ö ö n + k i l p a i l u l a i s t a + k i l p a i l u l a i t + k i l p a i l u l a k i + k i l p a i l u l a k i a + k i l p a i l u l a k i e n + k i l p a i l u l a k i i n + k i l p a i l u l a u t a k u n n i s s a + k i l p a i l u l l a + k i l p a i l u l l e + k i l p a i l u l t a + k i l p a i l u l u o n n e + k i l p a i l u m a h d o l l i s u u d e n + k i l p a i l u m a h d o l l i s u u d e t + k i l p a i l u m a h d o l l i s u u k s i a + k i l p a i l u m a h d o l l i s u u k s i s t a + k i l p a i l u m a l l e j a + k i l p a i l u m a l l i + k i l p a i l u m a l l i e n + k i l p a i l u m a r k k i n a t + k i l p a i l u m a r k k i n o i d e n + k i l p a i l u m a r k k i n o i h i n + k i l p a i l u m a r k k i n o i t a + k i l p a i l u m e k a n i s m i l l a + k i l p a i l u m e n e t e l m ä + k i l p a i l u m e n e t e l m ä t + k i l p a i l u m e n e t t e l y + k i l p a i l u m e n e t t e l y i h i n + k i l p a i l u m e n e t t e l y i s s ä + k i l p a i l u m e n e t t e l y ä + k i l p a i l u m i n i s t e r i + k i l p a i l u m i n i s t e r i n + k i l p a i l u m y ö n t e i s y y s + k i l p a i l u m ä ä r ä y k s e t + k i l p a i l u m ä ä r ä y k s i e n + k i l p a i l u m ä ä r ä y k s i ä + k i l p a i l u m ä ä r ä y s t e n + k i l p a i l u n + k i l p a i l u n a + k i l p a i l u n e h t o j a + k i l p a i l u n e u t r a l i t e e t t i a + k i l p a i l u n e u v o s t o n + k i l p a i l u n e u v o s t o o n + k i l p a i l u n r a j o i t u k s i a + k i l p a i l u n r a j o i t u s t a + k i l p a i l u n v a s t a i n e n + k i l p a i l u n v a s t a i s e n + k i l p a i l u n v a s t a i s e s t a + k i l p a i l u n v a s t a i s e s t i + k i l p a i l u n v a s t a i s e t + k i l p a i l u n v a s t a i s i a + k i l p a i l u n v a s t a i s i i n + k i l p a i l u n v a s t a i s i l l a + k i l p a i l u n v a s t a i s i l l e + k i l p a i l u n v a s t a i s i l t a + k i l p a i l u n v a s t a i s t a + k i l p a i l u n v a s t a i s t e n + k i l p a i l u n v a s t a i s u u t e e n + k i l p a i l u n v ä ä r i s t y m i e n + k i l p a i l u n v ä ä r i s t y m i s t ä + k i l p a i l u n v ä ä r i s t y m i ä + k i l p a i l u n v ä ä r i s t y m ä t + k i l p a i l u n ä k e m y k s e e n + k i l p a i l u n ä k e m y k s e m m e + k i l p a i l u n ä k y m ä t + k i l p a i l u n ä k ö k o h d a t + k i l p a i l u n ä k ö k o h d i s t a + k i l p a i l u n ä k ö k o h t i a + k i l p a i l u n ä k ö k o h t i e n + k i l p a i l u n ä k ö k u l m a + k i l p a i l u n ä k ö k u l m i e n + k i l p a i l u o i k e u d e l l a + k i l p a i l u o i k e u d e l l i s e s t i + k i l p a i l u o i k e u d e n + k i l p a i l u o i k e u d e s s a + k i l p a i l u o i k e u d e s t a + k i l p a i l u o i k e u s + k i l p a i l u o i k e u t e e n + k i l p a i l u o i k e u t t a + k i l p a i l u o l o i h i n + k i l p a i l u o l o j a + k i l p a i l u o l o j e n + k i l p a i l u o l o s u h t e e t + k i l p a i l u o l o s u h t e i d e n + k i l p a i l u o l o s u h t e i s i i n + k i l p a i l u o l o s u h t e i s s a + k i l p a i l u o l o s u h t e i s t a + k i l p a i l u o l o s u h t e i t a + k i l p a i l u o l o t + k i l p a i l u o n g e l m a + k i l p a i l u o n g e l m a a + k i l p a i l u o n g e l m a n + k i l p a i l u o n g e l m a t + k i l p a i l u o n g e l m i a + k i l p a i l u o n g e l m i e n + k i l p a i l u o n g e l m i i n + k i l p a i l u p a i n e + k i l p a i l u p a i n e e l l e + k i l p a i l u p a i n e e n + k i l p a i l u p a i n e e s e e n + k i l p a i l u p a i n e e s t a + k i l p a i l u p a i n e e t + k i l p a i l u p a i n e i d e n + k i l p a i l u p a i n e i l t a + k i l p a i l u p a i n e i s i i n + k i l p a i l u p a i n e i s t a + k i l p a i l u p a i n e i t a + k i l p a i l u p a i n e t t a + k i l p a i l u p a r a m e t r i n a + k i l p a i l u p e r i a a t e + k i l p a i l u p e r i a a t e t t a + k i l p a i l u p e r i a a t t e e l l e + k i l p a i l u p e r i a a t t e e n + k i l p a i l u p e r i a a t t e e s t a + k i l p a i l u p e r i a a t t e e t + k i l p a i l u p e r i a a t t e i d e n + k i l p a i l u p e r u s t e i d e n + k i l p a i l u p o h j a n + k i l p a i l u p o l i i t t i n e n + k i l p a i l u p o l i i t t i s e n + k i l p a i l u p o l i i t t i s e s t i + k i l p a i l u p o l i i t t i s e t + k i l p a i l u p o l i i t t i s i a + k i l p a i l u p o l i i t t i s i s t a + k i l p a i l u p o l i i t t i s t e n + k i l p a i l u p o l i t i i k a k s i + k i l p a i l u p o l i t i i k a l l a + k i l p a i l u p o l i t i i k a l l e + k i l p a i l u p o l i t i i k a n + k i l p a i l u p o l i t i i k a s s a + k i l p a i l u p o l i t i i k a s s a a n + k i l p a i l u p o l i t i i k a s t a + k i l p a i l u p o l i t i i k a s t a m m e + k i l p a i l u p o l i t i i k a s t a n n e + k i l p a i l u p o l i t i i k k a + k i l p a i l u p o l i t i i k k a a + k i l p a i l u p o l i t i i k k a a n + k i l p a i l u p o l i t i i k k a a n s a + k i l p a i l u p o l i t i i k k a m m e + k i l p a i l u p o l i t i i k k a n s a + k i l p a i l u p o t e n t i a a l i a + k i l p a i l u p r o s e s s i + k i l p a i l u p r o s e s s i a + k i l p a i l u p r o s e s s i n + k i l p a i l u p u i t t e i s s a + k i l p a i l u p u i t t e i s t a + k i l p a i l u p u u t t e e t + k i l p a i l u p ä i v i s t ä + k i l p a i l u p ä i v ä + k i l p a i l u p ä i v ä n + k i l p a i l u p ä ä o s a s t o + k i l p a i l u p ä ä t ö s t e n + k i l p a i l u r a h a s t o n + k i l p a i l u r a j o i t u k s e t + k i l p a i l u r a k e n n e + k i l p a i l u r a k e n t e e s e e n + k i l p a i l u s e i k a t + k i l p a i l u s o d a n + k i l p a i l u s o p i m u s t a + k i l p a i l u s o t a a + k i l p a i l u s s a + k i l p a i l u s t a + k i l p a i l u s t a n d a r d i e n + k i l p a i l u s t r a t e g i a a + k i l p a i l u s t r a t e g i a m m e + k i l p a i l u s u h d e t t a + k i l p a i l u s u h t e i d e n + k i l p a i l u s u h t e i s i i m m e + k i l p a i l u s u h t e i s i i n + k i l p a i l u s u h t e i t a + k i l p a i l u s u o j a a + k i l p a i l u s u o j a n a + k i l p a i l u s y i s t ä + k i l p a i l u s ä ä d ö s t e n + k i l p a i l u s ä ä n n ö i l l e + k i l p a i l u s ä ä n n ö i l l ä + k i l p a i l u s ä ä n n ö i l t ä + k i l p a i l u s ä ä n n ö i s s ä + k i l p a i l u s ä ä n n ö i s t ä + k i l p a i l u s ä ä n n ö i s t ä ä n + k i l p a i l u s ä ä n n ö k s i e n + k i l p a i l u s ä ä n n ö k s i l l ä + k i l p a i l u s ä ä n n ö k s i s t ä + k i l p a i l u s ä ä n n ö k s i ä + k i l p a i l u s ä ä n n ö s t e n + k i l p a i l u s ä ä n n ö s t ö j e n + k i l p a i l u s ä ä n n ö s t ö n + k i l p a i l u s ä ä n n ö t + k i l p a i l u s ä ä n n ö t k i n + k i l p a i l u s ä ä n t ö i h i n + k i l p a i l u s ä ä n t ö j e n + k i l p a i l u s ä ä n t ö j ä + k i l p a i l u s ä ä n t ö j ä m m e + k i l p a i l u s ä ä n t ö ä + k i l p a i l u t a i s t e l u s s a + k i l p a i l u t a l o u d e s s a + k i l p a i l u t a l o u t e e n + k i l p a i l u t a l o u t t a + k i l p a i l u t a p a u k s i a + k i l p a i l u t a p a u s + k i l p a i l u t a p a u s t e n + k i l p a i l u t a s a p a i n o + k i l p a i l u t a s o + k i l p a i l u t a s o a a n + k i l p a i l u t a s o j e n + k i l p a i l u t a s o n s a + k i l p a i l u t a v o i t t e e t + k i l p a i l u t e k i j ä + k i l p a i l u t e k i j ä n + k i l p a i l u t e k i j ä n ä + k i l p a i l u t e k i j ä ä + k i l p a i l u t e k i j ö i d e n + k i l p a i l u t e k i j ö i t ä + k i l p a i l u t i l a n n e + k i l p a i l u t i l a n n e t t a + k i l p a i l u t i l a n t e e l l e + k i l p a i l u t i l a n t e e n + k i l p a i l u t i l a n t e e s e e n + k i l p a i l u t i l a n t e e s s a + k i l p a i l u t i l a n t e e s t a + k i l p a i l u t i l a n t e e t + k i l p a i l u t i l a n t e i t a + k i l p a i l u t o i m i n t a a + k i l p a i l u t t a a + k i l p a i l u t t a m i s e e n + k i l p a i l u t t a m i s e n + k i l p a i l u t t a m i s e s t a + k i l p a i l u t t a m i s m e n e t t e l y i s s ä + k i l p a i l u t t a m i s m u o t o j a + k i l p a i l u t t a m i s t a + k i l p a i l u t u o m i o i s t u i m e n + k i l p a i l u u n + k i l p a i l u v a a r a n + k i l p a i l u v a a t i m u k s e t + k i l p a i l u v a a t i m u k s i a + k i l p a i l u v a a t i m u s t e n + k i l p a i l u v a h v u u s + k i l p a i l u v a i k e u k s i a + k i l p a i l u v a i k e u k s i s t a + k i l p a i l u v a i k u t u k s e t + k i l p a i l u v a i k u t u k s i a + k i l p a i l u v a i k u t u k s i s t a + k i l p a i l u v a i k u t u s + k i l p a i l u v a i k u t u s u l o t t u v u u d e n + k i l p a i l u v a j e t t a + k i l p a i l u v a k o i l u s t a + k i l p a i l u v a k o i l u u n + k i l p a i l u v a l t i k s e m m e + k i l p a i l u v a l t i k s i + k i l p a i l u v a l t t i + k i l p a i l u v a l t t i a + k i l p a i l u v a l t t i n a + k i l p a i l u v a l t t i n a a n + k i l p a i l u v a p a u d e n + k i l p a i l u v a p a u t t a + k i l p a i l u v a s t a i s e t + k i l p a i l u v e r k o s t o n + k i l p a i l u v i r a n o m a i n e n + k i l p a i l u v i r a n o m a i s e l l a + k i l p a i l u v i r a n o m a i s e l l e + k i l p a i l u v i r a n o m a i s e l t a + k i l p a i l u v i r a n o m a i s e n + k i l p a i l u v i r a n o m a i s e n a + k i l p a i l u v i r a n o m a i s e t + k i l p a i l u v i r a n o m a i s i a + k i l p a i l u v i r a n o m a i s i i n + k i l p a i l u v i r a n o m a i s i l l a + k i l p a i l u v i r a n o m a i s i l l e + k i l p a i l u v i r a n o m a i s i s t a + k i l p a i l u v i r a n o m a i s t a + k i l p a i l u v i r a n o m a i s t e n + k i l p a i l u v i r a s t o n + k i l p a i l u v o i m i e n + k i l p a i l u v u o s i n a + k i l p a i l u v ä l i n e e n + k i l p a i l u v ä l i n e e t + k i l p a i l u v ä l i n e i t ä + k i l p a i l u v ä l i n e i t ä ä n + k i l p a i l u v ä l i n e t t ä + k i l p a i l u v ä ä r i s t y m i e n + k i l p a i l u v ä ä r i s t y m i i n + k i l p a i l u v ä ä r i s t y m i n ä + k i l p a i l u v ä ä r i s t y m i s t ä + k i l p a i l u v ä ä r i s t y m i ä + k i l p a i l u v ä ä r i s t y m ä + k i l p a i l u v ä ä r i s t y m ä ä + k i l p a i l u y h t e i s k u n n a s s a + k i l p a i l u y k s i k k ö m m e + k i l p a i l u y m p ä r i s t ö + k i l p a i l u y m p ä r i s t ö n + k i l p a i l u y m p ä r i s t ö s s ä + k i l p a i l u y m p ä r i s t ö ä + k i l p a i l u y m p ä r i s t ö ö n + k i l p a j u o k s u + k i l p a j u o k s u a + k i l p a j u o k s u s t a + k i l p a j u o k s u u n + k i l p a k e n t t ä n ä + k i l p a k u m p p a n e i h i n s a + k i l p a k u m p p a n i m m e + k i l p a p e l a a m i n e n + k i l p a p u r j e h d u s s ä ä n n ö t + k i l p a p y ö r ä i l y s s ä + k i l p a r a d o i l l a + k i l p a r a d o i l l e + k i l p a r a t s a s t u s k a u s i + k i l p a u r h e i l u s s a + k i l p a v a r u s t e l u + k i l p a v a r u s t e l u a + k i l p a v a r u s t e l u l l a + k i l p a v a r u s t e l u n + k i l p a v a r u s t e l u s s a + k i l p a v a r u s t e l u s t a + k i l p a v a r u s t e l u u n + k i l p i k o n n a + k i l p i k o n n a g r a f i i k k a + k i l p i k o n n a l a i v a + k i l p i k o n n a l a j i s t a + k i l p i k o n n a l i e m i + k i l p i k o n n a n + k i l p i r a u h a s h o r m o n i + k i l p i r a u h a s s a i r a u k s i s t a + k i l p i r a u h a s s y ö p ä + k i l p i r a u h a s s y ö p ä t a p a u k s e n + k i l p i r a u h a s s y ö p ä t a p a u s t e n + k i l p i r a u h a s s y ö p ä ä n + k i l p i r a u h a s s y ö v ä n + k i l p i r a u h a s s y ö v ä s t ä + k i l p i t e o r i a + k i l p i t u l i v u o r i + k i l t a j ä r j e s t e l m ä + k i l t a j ä r j e s t e l m ä n + k i m a l a i s k o l i b r i + k i m a l a i s k u o r i a i n e n + k i m a l a i s p a l l o k a l a + k i m a l a i s t e n + k i m a l a i s t o k k o + k i m b r i s o t a + k i m m o i s a m p i + k i m o l e p a k k o + k i m p p u m u s t e s i e n i + k i m p p u t e o r i a + k i n k k u v o i l e i p ä + k i n k k u v o i l e i v ä s t ä + k i n k u t + k i n o l i i n i h a p p o + k i n t a a l l a + k i o s k e i s t a + k i o s k i k i r j a l l i s u u s + k i p e i m m i n + k i p e i n + k i p e i t ä + k i p e r i e n + k i p e r i m m i s t ä + k i p e r i ä + k i p e r ä l l ä + k i p e r ä m m ä n + k i p e r ä m p i + k i p e r ä m p i ä + k i p e r ä s t ä + k i p e r ä ä + k i p e ä m m i n + k i p e ä m m ä n + k i p e ä ä + k i p i n ä s e p p ä + k i p i n ä s y t y t y s m o o t t o r e i t a + k i p i n ä t y ö s t ö + k i p s i j ä l j e n n ö k s i ä + k i p u k o h t i a + k i p u k y n n y k s e m m e + k i p u k y n n y k s e n ä + k i p u k y n n y s + k i p u l ä ä k k e i s i i n + k i p u l ä ä k k e i t ä + k i p u p i s t e + k i p u p i s t e i s i i n + k i p u r a j a + k i p u r a j a l l a + k i p u r a j a l l e + k i r a h v i a k a a s i a + k i r a h v i k ä r s ä k ä s + k i r e i k s i + k i r g i i s e i l l e + k i r g i i s i t + k i r i l o v i a + k i r i l o v i n + k i r i s t e t ä ä n + k i r i s t y k s e e n + k i r i s t y k s e l l e + k i r i s t y k s e l t ä + k i r i s t y m i n e n + k i r i s t y m i s s u u n t a u k s e n + k i r i s t y m i s t ä + k i r i s t y n e e n + k i r i s t y n e e s t ä + k i r i s t y s e h d o t u k s e n + k i r i s t y s k e i n o + k i r i s t y s k e i n o n a + k i r i s t y s k i r j e + k i r i s t y s m a h d o l l i s u u d e t + k i r i s t y s m u o t o + k i r i s t y s t a k t i i k k a + k i r i s t y s t o i m i a + k i r i s t y s t o i m i a a n + k i r i s t y s t o i m i s t a + k i r i s t y s t ä + k i r i s t y s v a a t i m u k s i a + k i r i s t y s y r i t y k s i l l e + k i r i s t y s y r i t y k s i ä + k i r i s t y s y r i t y s t e n + k i r i s t y v ä + k i r i s t y y + k i r i s t ä m i s e k s i + k i r i s t ä m i s t ä + k i r i s t ä m m e + k i r i s t ä m ä ä n + k i r i s t ä v ä t + k i r i s t ä ä + k i r i s t ä ä k s e e n + k i r j a a m i s j ä r j e s t e l m ä n + k i r j a a m i s t a + k i r j a a n + k i r j a h a n k k e e s t a + k i r j a h i s t o r i a + k i r j a h y l l y s t ä + k i r j a i l i j a l i i t t o + k i r j a i l i j a t + k i r j a i l i j o i t a + k i r j a i m e l l i s e s s a + k i r j a i m e n + k i r j a i m e s s a + k i r j a i m e t + k i r j a i m i a + k i r j a i m i l l a + k i r j a k a s a n + k i r j a k a u p a l l e + k i r j a k a u p a n + k i r j a k a u p a s s a + k i r j a k a u p a t + k i r j a k a u p o i l t a + k i r j a k a u p o i s t a + k i r j a k a u p p a + k i r j a k a u p p a a + k i r j a k a u p p a t o i m i n t a + k i r j a k e r h o t + k i r j a k i n + k i r j a k o m i t e a l t a + k i r j a l a i n o j a + k i r j a l l a + k i r j a l l i s e n + k i r j a l l i s e n a + k i r j a l l i s e s s a + k i r j a l l i s e s t a + k i r j a l l i s i a + k i r j a l l i s i k s i + k i r j a l l i s i n a + k i r j a l l i s i s s a + k i r j a l l i s i s t a + k i r j a l l i s t a + k i r j a l l i s t e n + k i r j a l l i s u u d e n + k i r j a l l i s u u s h u i p p u k o k o u s t a + k i r j a l l i s u u s k r i i t i k k o + k i r j a l l i s u u s k r i i t i k k o n a + k i r j a l l i s u u s k r i t i i k k i + k i r j a l l i s u u s l e h d e n + k i r j a l l i s u u s p a l k i n n o n + k i r j a l l i s u u s p a l k i n t o + k i r j a l l i s u u s t e o s + k i r j a l l i s u u s t i e d e + k i r j a l l i s u u t t a + k i r j a m a a l a u s + k i r j a m a r k k i n o i d e n + k i r j a m a r k k i n o i h i n + k i r j a m a r k k i n o i l l a + k i r j a m e s s u i l l e + k i r j a m e s s u t + k i r j a m u o d o s s a + k i r j a n + k i r j a n h i n t a j ä r j e s t e l m i e n + k i r j a n h i n t o j e n + k i r j a n n e e t + k i r j a n n u t + k i r j a n p a i n a j a + k i r j a n p i d o k s i + k i r j a n p i d o l l i n e n + k i r j a n p i d o l l i s i a + k i r j a n p i d o l l i s i i n + k i r j a n p i d o l l i s i l l a + k i r j a n p i d o n + k i r j a n p i d o s s a + k i r j a n p i d o s s a a n + k i r j a n p i d o s t a + k i r j a n p i d o t + k i r j a n p i t o + k i r j a n p i t o a + k i r j a n p i t o a i n e i s t o n + k i r j a n p i t o a m m e + k i r j a n p i t o a p u l a i s e n + k i r j a n p i t o a s i a k i r j a + k i r j a n p i t o a s i a n a + k i r j a n p i t o a s i a s s a + k i r j a n p i t o d i r e k t i i v i + k i r j a n p i t o d i r e k t i i v i e n + k i r j a n p i t o h a l l i n t o a + k i r j a n p i t o h e n k i + k i r j a n p i t o j ä r j e s t e l m i e n + k i r j a n p i t o j ä r j e s t e l m i i n + k i r j a n p i t o j ä r j e s t e l m i s s ä + k i r j a n p i t o j ä r j e s t e l m i s t ä + k i r j a n p i t o j ä r j e s t e l m i ä + k i r j a n p i t o j ä r j e s t e l m ä + k i r j a n p i t o j ä r j e s t e l m ä l l ä + k i r j a n p i t o j ä r j e s t e l m ä n + k i r j a n p i t o j ä r j e s t e l m ä n s ä + k i r j a n p i t o j ä r j e s t e l m ä s s ä + k i r j a n p i t o j ä r j e s t e l m ä s t ä + k i r j a n p i t o j ä r j e s t e l m ä t + k i r j a n p i t o j ä r j e s t e l m ä ä + k i r j a n p i t o j ä r j e s t e l m ä ä n + k i r j a n p i t o k e h y s t ä + k i r j a n p i t o k i k k a i l u l l e + k i r j a n p i t o k ä s i t t e i t ä + k i r j a n p i t o k ä y t ä n n ö i s t ä + k i r j a n p i t o k ä y t ä n n ö n + k i r j a n p i t o k ä y t ä n t ö j e n + k i r j a n p i t o k ä y t ä n t ö j ä + k i r j a n p i t o l a i n s ä ä d ä n t ö + k i r j a n p i t o m a l l i l l a + k i r j a n p i t o m a l l i n + k i r j a n p i t o m e n e t e l m i ä + k i r j a n p i t o m e n e t e l m ä s t ä + k i r j a n p i t o m e n e t e l m ä ä + k i r j a n p i t o m e n e t t e l y i s t ä + k i r j a n p i t o m e n e t t e l y j e n + k i r j a n p i t o m e n e t t e l y j ä + k i r j a n p i t o m e n e t t e l y t + k i r j a n p i t o m e n e t t e l y ä + k i r j a n p i t o m ä ä r ä y k s i ä + k i r j a n p i t o m ä ä r ä y s t e n + k i r j a n p i t o n o r m e i s t a + k i r j a n p i t o n o r m i t + k i r j a n p i t o o n + k i r j a n p i t o p a l v e l u j a + k i r j a n p i t o p a l v e l u j e n + k i r j a n p i t o p e l l e i l y j ä + k i r j a n p i t o p e r i a a t t e i n + k i r j a n p i t o p e r i a a t t e i t a + k i r j a n p i t o p e r i a a t t e i t a a n + k i r j a n p i t o p e t o s + k i r j a n p i t o p r o s e s s i e n + k i r j a n p i t o p r o s e s s i s s a + k i r j a n p i t o p u i t t e e t + k i r j a n p i t o r a s i t u k s i s t a + k i r j a n p i t o s k a n d a a l i n + k i r j a n p i t o s t a n d a r d e i s t a + k i r j a n p i t o s t a n d a r d e j a + k i r j a n p i t o s t a n d a r d i + k i r j a n p i t o s t a n d a r d i a + k i r j a n p i t o s t a n d a r d i e n + k i r j a n p i t o s t a n d a r d i n + k i r j a n p i t o s t a n d a r d i t + k i r j a n p i t o s y i s t ä + k i r j a n p i t o s ä ä n n ö i l l ä + k i r j a n p i t o s ä ä n n ö i s t ä + k i r j a n p i t o s ä ä n n ö k s e t + k i r j a n p i t o s ä ä n n ö k s i ä + k i r j a n p i t o s ä ä n n ö s t e n + k i r j a n p i t o s ä ä n n ö s t ö n + k i r j a n p i t o s ä ä n n ö s t ö n n e + k i r j a n p i t o s ä ä n n ö t + k i r j a n p i t o s ä ä n t ö i h i n + k i r j a n p i t o s ä ä n t ö j e n + k i r j a n p i t o s ä ä n t ö j ä + k i r j a n p i t o t a k e i t a + k i r j a n p i t o t a p a + k i r j a n p i t o t a p a a m m e + k i r j a n p i t o t a v a n + k i r j a n p i t o t a v a s t a + k i r j a n p i t o t e h t ä v i i n s ä + k i r j a n p i t o t e m p p u j a + k i r j a n p i t o t i e t o j e n + k i r j a n p i t o t i l a n t e e s t a + k i r j a n p i t o t o i m i + k i r j a n p i t o t o i m i s t o t + k i r j a n p i t o u u d i s t u k s i a + k i r j a n p i t o u u d i s t u s t a + k i r j a n p i t o v a a t i m u k s e t + k i r j a n p i t o v a a t i m u k s i a + k i r j a n p i t o v a a t i m u k s i s t a + k i r j a n p i t o v a a t i m u s t e n + k i r j a n p i t o v a i k u t u k s e t + k i r j a n p i t o v e l v o l l i s u u k s i s t a + k i r j a n p i t o v e l v o l l i s u u s + k i r j a n p i t o v i r h e + k i r j a n p i t o v i r h e i t ä + k i r j a n p i t o v ä l i n e + k i r j a n p i t o v ä l i n e e t + k i r j a n p i t o v ä l i n e i s i i n + k i r j a n p i t o y r i t y k s i ä + k i r j a n p i t o y r i t y s + k i r j a n p i t ä j i e n + k i r j a n p i t ä j ä l t ä + k i r j a n p i t ä j ä m e n t a l i t e e t i l l a a n + k i r j a n p i t ä j ä m e n t a l i t e e t i n + k i r j a n p i t ä j ä n k i n + k i r j a n p i t ä j ä n ä + k i r j a n p i t ä j ä ä + k i r j a n t u o t a n n o n + k i r j a p a i n o i l l e + k i r j a p i t o s t a n d a r d i t + k i r j a r o v i o + k i r j a r o v i o i d e n + k i r j a s e s s a n n e + k i r j a s i n k o k o + k i r j a s i n k o k o a + k i r j a s s a + k i r j a s s a a n + k i r j a s s a n n e + k i r j a s t a + k i r j a s t o a s i o i t a + k i r j a s t o j a + k i r j a s t o j e n + k i r j a s t o j e n k i n + k i r j a s t o j ä r j e s t e l m ä + k i r j a s t o k o r t e i s t a + k i r j a s t o k o r t t i + k i r j a s t o l a i t o k s e n + k i r j a s t o l a i t o s + k i r j a s t o m a n i f e s t i i n + k i r j a s t o n + k i r j a s t o p a l v e l u j a + k i r j a s t o p a l v e l u t + k i r j a s t o t + k i r j a s t o t o i m i n n a l l e + k i r j a s t o v e r k k o + k i r j a s t o v e r k o s t o + k i r j a s t o y h t e i s t y ö + k i r j a t + k i r j a t a + k i r j a t a a n + k i r j a t e o l l i s u u t t a + k i r j a t k i n + k i r j a t t a i s i i n + k i r j a t t a v a + k i r j a t t a v a n + k i r j a t t u j a + k i r j a u k s i k s i + k i r j a u t u m i s v e l v o i t e + k i r j a v a a n + k i r j a v a l i o t + k i r j e e n + k i r j e e n k i r j o i t t a j a t + k i r j e e n v a i h d o k s i + k i r j e e n v a i h d o l l a + k i r j e e n v a i h d o l l e + k i r j e e n v a i h d o n + k i r j e e n v a i h d o s s a + k i r j e e n v a i h d o s t a + k i r j e e n v a i h t a j a n + k i r j e e n v a i h t a j a p a n k k i m e n e t t e l y ä + k i r j e e n v a i h t o + k i r j e e n v a i h t o a + k i r j e e n v a i h t o m e n e t t e l y ä + k i r j e e n v a i h t o n a + k i r j e e n v a i h t o o n + k i r j e e s e e n + k i r j e e s e e n n e + k i r j e e s s ä + k i r j e e s s ä n i + k i r j e e s t ä + k i r j e e t + k i r j e i d e n + k i r j e i l l ä + k i r j e i l l ä ä n + k i r j e i s t ä + k i r j e i t ä + k i r j e k i n + k i r j e k u o r i s s a + k i r j e k y y h k y + k i r j e l a a t i k k o + k i r j e l m ä ä + k i r j e l u o n n o k s e n + k i r j e l u o n n o s t a + k i r j e l ä h e t y s t e n + k i r j e o p i s t o + k i r j e p o m m e i l l a + k i r j e p o m m e j a + k i r j e p o m m i + k i r j e p o m m i m u r h a a j a k s i + k i r j e s a l a i s u u d e n + k i r j e s a l a i s u u t e e n + k i r j e s h a k k i + k i r j e v u o r e t + k i r j o a + k i r j o b a r b i + k i r j o d e l f i i n i + k i r j o d u r r a + k i r j o h y l j e + k i r j o i t a t t e + k i r j o i t e t a a n + k i r j o i t e t t a i s i i n + k i r j o i t e t t u a + k i r j o i t e t u i s t a + k i r j o i t e t u l l a + k i r j o i t i t t e + k i r j o i t t a a + k i r j o i t t a a k s e n i + k i r j o i t t a e s s a a n + k i r j o i t t a e s s a n i + k i r j o i t t a i s i t t e + k i r j o i t t a j a l t a + k i r j o i t t a j a n a + k i r j o i t t a j a t + k i r j o i t t a j i e n + k i r j o i t t a j i l l e + k i r j o i t t a k a a m m e + k i r j o i t t a m a a n + k i r j o i t t a m i s t a + k i r j o i t t a n u t + k i r j o i t t a u t u m i s m e n e t t e l y ä + k i r j o i t u k s e l l a n n e + k i r j o i t u k s e t + k i r j o i t u k s i a + k i r j o i t u s a s u n + k i r j o i t u s j ä r j e s t e l m ä + k i r j o i t u s k i l p a i l u n + k i r j o i t u s k i l p a i l u s s a + k i r j o i t u s p a p e r i a + k i r j o i t u s p ö y t ä t u t k i m u k s e e n + k i r j o i t u s s ä ä n t ö j ä + k i r j o i t u s t a i d e t t a + k i r j o i t u s t a i d o n + k i r j o i t u s t a i t o + k i r j o i t u s t a i t o j a + k i r j o i t u s t a p a a + k i r j o i t u s t a v a s t a + k i r j o i t u s v i r h e + k i r j o i t u s v i r h e t t ä + k i r j o j a + k i r j o j a a n + k i r j o j e n + k i r j o j o k i k o r e n t o + k i r j o k a l a s t a j a + k i r j o k e h r ä ä j ä + k i r j o k e i s a r i k a l a + k i r j o k e n t t ä m i t t a r i + k i r j o k e r t t u + k i r j o k i i v i + k i r j o k i p u a j a + k i r j o k o r p p i k o t k a + k i r j o k o r t e + k i r j o k o t i n g a + k i r j o l a u l u m e s i k k o + k i r j o l e p i n k ä i s t y r a n n i + k i r j o l e u k a p e r h o n e n + k i r j o l o h i + k i r j o m a a t i m a l i + k i r j o m e r i e n k e l i + k i r j o m e s i k k o + k i r j o n a a m a p ö l l ö n e n + k i r j o n a h k a h a p e r o + k i r j o n i v e l v i r n a + k i r j o n o k i m e s i k k o + k i r j o p a p u r i k k o + k i r j o p i k a r i l i l j a + k i r j o p i l l i k e + k i r j o p y y f a s a a n i + k i r j o r a s t a a t + k i r j o r i n t a b u l b u l i + k i r j o r ö n s y l i l j a + k i r j o s a l v i a + k i r j o s i e p p o + k i r j o s i i p i k i u r u + k i r j o s i i p i k u t o j a + k i r j o s i i p i k ä p y l i n t u + k i r j o s i i p i t a n s s i j a + k i r j o s u k k a k o l i b r i + k i r j o t u l i k r u u n u + k i r j o t ä p l ä k o i + k i r j o t ö p ö s i e p p o + k i r j o u k o n k o r e n t o + k i r j o v a r a a n i + k i r j o v a s k i y ö k k ö n e n + k i r j o v e r k k o p e r h o n e n + k i r j o v i i r i p y r s t ö + k i r j o v i u h k a p y r s t ö + k i r k a s t u s v u o r i + k i r k a s t u u + k i r k a s v a l o h o i t o + k i r k k a u t t a + k i r k k o a + k i r k k o a r k k i t e h t u u r i + k i r k k o h i s t o r i a + k i r k k o h i s t o r i a n + k i r k k o i s k u + k i r k k o i s ä + k i r k k o j a + k i r k k o j e n + k i r k k o k u n t a + k i r k k o k u r i + k i r k k o k y l ä + k i r k k o l a i v a + k i r k k o m u s i i k k i + k i r k k o o n + k i r k k o p r o v i n s s i + k i r k k o p ä i v ä t + k i r k k o s l a a v i + k i r k k o u r k u j e n + k i r k k o v a l t i o + k i r k k o v a l t i o t a + k i r k k o v u o s i + k i r k k o y h t e i s ö ä + k i r k o l l i s i a + k i r k o l l i s k o k o u s + k i r k o l l i s t e n + k i r k o l l i s v e r o + k i r k o n + k i r k o n k e l l o + k i r k o n k i n + k i r k o n k i r j a + k i r k o n o p e t t a j a + k i r k o n t o r n i + k i r k o n t o r n i t + k i r k o n v ä k i + k i r o s a n a + k i r o t t u j a + k i r o t u t + k i r o u k s e k s i + k i r p p u s i r k u k s e n + k i r p p u s i r k u s + k i r p p u s i r k u s t a + k i r p p u t o r e i h i n + k i r p p u t o r e i l l a + k i r p p u t o r i + k i r p p u t o r i l l a + k i r p p u t o r i l t a + k i r s i k a n k i e r r e l e h t i v i r u s + k i r s i k k a b a r b i + k i r s i k k a l u u m u + k i r s i k k a p e r h o n e n + k i r s i k k a p u i d e n + k i r s i k k a p u i s t o + k i r s i k k a s u k a r a p u + k i r s i k k a t e t r a + k i r s i k k a t o m a a t i t + k i r s i k k a t o m a a t t i + k i r s i k k a t o r t t u a + k i r s i k o i l l e + k i r s i k o i t a + k i r u r g i a a + k i r v i s k o l i b r i + k i r v o i t t a n u t + k i s a h a l l i + k i s a j ä r j e s t ä j ä n ä + k i s a l i p p u j e n + k i s a t + k i s a y l e i s ö ä + k i s k o a j o n e u v o i s s a + k i s k o a j o n e u v o j a + k i s k o i l l e + k i s k u r i h i n n a t + k i s k u r i h i n n o i n + k i s k u r i h i n t a a n + k i s o i h i n + k i s o i s s a + k i s o i s t a + k i s o j a + k i s o j e n + k i s s a a + k i s s a i h m i s e t + k i s s a k e t t u + k i s s a m a k i + k i s s a n h ä n n ä n v e t o a + k i s s a n k e l l o + k i s s a n k ä p ä l ä + k i s s a n l i h a + k i s s a n n a h k o j a + k i s s a n o m i s t a j a t + k i s s a n p o l k k a + k i s s a n r u o a l l a + k i s s a n r u o a n + k i s s a n r u o a s s a + k i s s a n r u o k a + k i s s a n r u o k a a n + k i s s a n s i l m ä o i r e y h t y m ä + k i s s a n s i l m ä s u m u + k i s s a n ä y t t e l y + k i s s a r o d u i s t a + k i s s a r u t t o + k i s s a t a n s s i j a + k i s s a t e o l l i s u u s + k i s s a t u r k i s t u o t t e i l l e + k i s s o j e n + k i t a h a i + k i t a k i e l e k e + k i t a l u u + k i t a m o s k i i t t o k a l a + k i t a r a e f e k t i + k i t a r a s o o l o + k i t a r a v a h v i s t i n + k i t a r i s a + k i t e y t e t ä ä n + k i t e y t t ä ä + k i t e y t y s t e n + k i t i n ä t i m a l i + k i t k a a + k i t k a h ä v i ö i h i n + k i t k a h ä v i ö t ä + k i t k a k e r r o i n + k i t k a k u s t a n n u s t e n + k i t k a t + k i t k a t o n t a + k i t k a t t a + k i t k a t t o m a a n + k i t k a t t o m a l l a + k i t k a t t o m a m m i n + k i t k a t y ö t t ö m y y t t ä + k i t k a v a s t u s t a + k i t k e m i n e n + k i t k e m i s e k s i + k i t k e m i s s t r a t e g i a t + k i t k e m i s t ä + k i t k e m ä ä n + k i t k e ä + k i t k e ä k s e e n + k i t s a a m m i n + k i t s a a m p i + k i t s a s t a + k i t u v a n + k i u k u s t u a + k i u k u s t u m a a n + k i u r u k e r t t u + k i u r u s i r k k u + k i u s a l l i s e m m a k s i + k i u s a l l i s i a + k i u s a l l i s i n t a + k i u s a l l i s t a + k i u s a l l i s t a k i n + k i u s a n k a p p a l e i t a + k i u s a n t e k o o n + k i u s a u k s e e n + k i u s a u k s e n + k i u s a u s t a + k i v e e n + k i v e n + k i v e n h a k k a a j a t + k i v e n h e i t o n + k i v e n j ä r k ä l e t t ä + k i v e n k i n + k i v e n k o v a n + k i v e n k o v a n a + k i v e n k o v i i n + k i v e n n u o l i a i n e n + k i v e n n u o l i a i s e t + k i v e n n ä i s a i n e + k i v e n n ä i s a i n e i d e n + k i v e n n ä i s a i n e i t a + k i v e n n ä i s a i n e l i s i e n + k i v e n n ä i s a i n e l i s ä ä + k i v e n n ä i s a i n e m y r k y t y s + k i v e n n ä i s a i n e p i t o i s u u t t a + k i v e n n ä i s e s i i n t y m i ä + k i v e n n ä i s l i s i e n + k i v e n n ä i s p o l t t o a i n e i d e n + k i v e n n ä i s p u l l o + k i v e n n ä i s v a l m i s t e i t a + k i v e n n ä i s v e d e l l e + k i v e n n ä i s v e d e s t ä + k i v e n n ä i s v e d e t + k i v e n n ä i s v e s i + k i v e n n ä i s v e s i e n + k i v e n n ä i s v e s i l ä h t e i d e n + k i v e n n ä i s v e s i s t ä + k i v e n n ä i s v e t e e n + k i v e n n ä i s v e t t ä + k i v e n n ä i s ö l j y i h i n + k i v e n n ä i s ö l j y i l l e + k i v e n n ä i s ö l j y j e n + k i v e n n ä i s ö l j y j ä + k i v e n n ä i s ö l j y y n + k i v e s k u k k a r o + k i v e s o n g e l m i n a + k i v e s s y ö p ä + k i v i h i i l e l l e + k i v i h i i l e l l ä + k i v i h i i l e n + k i v i h i i l e n t u o n n i s t a + k i v i h i i l e n t u o t a n n o s s a + k i v i h i i l e n t u o t a n t o + k i v i h i i l e n t u o t a n t o a + k i v i h i i l i + k i v i h i i l i a l a l l a + k i v i h i i l i a l a n + k i v i h i i l i a s e t u s t a + k i v i h i i l i h u i p p u + k i v i h i i l i k a i v o k s e s s a + k i v i h i i l i k a i v o k s i a a n + k i v i h i i l i k a i v o k s i l l e + k i v i h i i l i k a i v o s t e n + k i v i h i i l i k a i v o s t e o l l i s u u d e n + k i v i h i i l i m a r k k i n a t + k i v i h i i l i m a r k k i n o i d e n + k i v i h i i l i r e s u r s s e j a + k i v i h i i l i t a l o u d e s t a + k i v i h i i l i t e k n i i k k a a + k i v i h i i l i t e k n o l o g i a + k i v i h i i l i t e k n o l o g i a a + k i v i h i i l i t e k n o l o g i a n + k i v i h i i l i t e o l l i s u u d e l l e + k i v i h i i l i t e o l l i s u u d e n + k i v i h i i l i t e o l l i s u u d e s s a + k i v i h i i l i t e o l l i s u u d e s t a + k i v i h i i l i t e o l l i s u u s + k i v i h i i l i t e r v a + k i v i h i i l i t e r v a l l a + k i v i h i i l i t u k i + k i v i h i i l i t u o t a n t o + k i v i h i i l i t u o t t e e t + k i v i h i i l i t u o t t e i d e n + k i v i h i i l i t u t k i m u k s e n + k i v i h i i l i t u t k i m u s t e n + k i v i h i i l i v a r a n t o j e n + k i v i h i i l i v a r a t + k i v i h i i l i v o i m a l o i d e n + k i v i h i i l i v o i m a l o i s s a + k i v i h i i l i y h t i ö t + k i v i h i i l t ä + k i v i h u m m e r i + k i v i j a l k a n a + k i v i j a l k o j a + k i v i j ä ä t i k k ö + k i v i k a u d e l l a + k i v i k a u d e l l e + k i v i k a u d e l t a + k i v i k a u d e n + k i v i k a u d e n o m a i s e n a + k i v i k a u p u n k i + k i v i k a u s i + k i v i k a u s i k a a n + k i v i k a u t e e n + k i v i k a u t i s i l l a + k i v i k a u t i s i s s a + k i v i k i r k o i s t a + k i v i k k o a l v e j u u r i + k i v i k k o k i l p i r u o h o + k i v i k k o k u r j e n p o l v i + k i v i k k o k ä e n m i n t t u + k i v i k k o p ä ä s k y k a h l a a j a + k i v i k k o r a s t a a t + k i v i k k o r a s t a s + k i v i k k o s a t a k i e l i + k i v i k k o s i r k k u + k i v i k k o t a p a k u l o + k i v i k k o t ö y h t ö k i u r u + k i v i k k o u u n i l i n t u + k i v i k o i v u + k i v i k y n s i s a m m a l + k i v i l a a k e r i + k i v i l a u t t a + k i v i m u r s k a + k i v i m u u r i e n + k i v i m u u r i h y ö k k ä y s + k i v i n i l k k a + k i v i n ä ä t ä + k i v i r a k e n n e l m i i n + k i v i s a a r e n + k i v i s a a r i + k i v i s a k a s t i + k i v i s e i n ä l l e + k i v i s e i n ä n + k i v i s e i n ä ä + k i v i s i l t a + k i v i s i m p p u + k i v i t a s k u + k i v i t a u l u i h i n + k i v i t e t t i i n + k i v i t t ä m i s e l t ä + k i v i t t ä m i s e s t ä + k i v i t t ä m i s k i e l t o + k i v i t t ä m i s k ä y t ä n n ö n + k i v i t t ä m ä l l ä + k i v i t y k s e t + k i v i t y s k u o l e m a + k i v i t y s k u o l e m a a n + k i v i t y s k u o l e m a l t a + k i v i t y s k u o l e m a n t u o m i o t a + k i v i t y s t a p a u s + k i v i t y s t e n + k i v i t y s t u o m i o + k i v i t y s t u o m i o i s t a + k i v i t y s t u o m i o n + k i v i ä + k i v u l i a a m m a k s i + k i v u l i a a t + k i v u n + k i v u n l i e v i t y k s e e n + k i v u n l i e v i t y k s e s s ä + k i v u n l i e v i t y s h o i t o j a + k i v u t + k i v u t t a + k i v u t t o m a m p a a + k i v u t t o m a m p i + k i v u t t o m a t + k i v u t t o m i a + k i v u t t o m i n a + k i v ä ä r e i h i n + k i v ä ä r i n p e r ä l l ä + k l a a n e i h i n + k l a a n i e n + k l a a n i j ä r j e s t e l m ä + k l a a n i r a k e n t e i s i i n + k l a m y d i a t a r t u n n a t + k l a r i n e t t i k o n s e r t t o + k l a s s i k o n + k l a s s i s e e n + k l a s s i s e k s i + k l a s s i s e m p i + k l a s s i s e n + k l a s s i s i s t a + k l a s s i s t a + k l e m e n t i i n e i s t ä + k l e m e n t i i n i a s i a s t a + k l e m e n t i i n i a s i o i h i n + k l i i n i s e e n + k l i i n i s e l l ä + k l i i n i s e n + k l i i n i s e s s ä + k l i i n i s e s t ä + k l i i n i s e t + k l i i n i s i i n + k l i i n i s i l l e + k l i i n i s i l l ä + k l i i n i s i s s ä + k l i i n i s i s t ä + k l i i n i s i ä + k l i i n i s t e n + k l i i n i s t ä + k l i n i k o i h i n + k l i t o r i k s e n + k l o o n a a m i n e n + k l o o n a a m i s e n + k l o o n a a m i s e s t a + k l o o n a a m i s m e n e t e l m ä t + k l o o n a t a + k l o o n a t t u j e n + k l o o n a t u i s t a + k l o o n a t u t + k l o o n a u k s e e n + k l o o n a u k s e l l a + k l o o n a u k s e l l e + k l o o n a u k s e n + k l o o n a u k s e s s a + k l o o n a u k s e s t a + k l o o n a u s a s i a n + k l o o n a u s k i e l l o t + k l o o n a u s k i e l t o + k l o o n a u s k i e l t o a + k l o o n a u s k o e + k l o o n a u s k o k e e t + k l o o n a u s k o k e i t a + k l o o n a u s m e n e t e l m i e n + k l o o n a u s m e n e t e l m i ä + k l o o n a u s m e n e t e l m ä n + k l o o n a u s m e n e t e l m ä t + k l o o n a u s p r o s e s s e i s s a + k l o o n a u s p r o s e s s e j a + k l o o n a u s p r o s e s s i s s a + k l o o n a u s s k a n d a a l i + k l o o n a u s t a + k l o o n a u s t a p a u k s i s t a + k l o o n a u s t e k n i i k a n + k l o o n a u s t e k n i i k a t + k l o o n a u s t e k n i i k k a a + k l o o n a u s t e k n i i k o i d e n + k l o o n a u s t e k n i i k o i s t a + k l o o n a u s t e k n i i k o i t a + k l o o n a u s t e k n o l o g i a n + k l o o n a u s t u t k i m u k s e e n + k l o o n a u s t u t k i m u s t a + k l o o n i e n + k l o o n i s o d a t + k l o o n i s o t i l a a t + k l o o n i t + k l o o n i t e k n i i k a s s a + k l o o r a t t u j a + k l o o r i a l k a l i l a i t o k s e t + k l o o r i a l k a l i l a i t o k s i s t a + k l o o r i a l k a l i t e o l l i s u u d e n + k l o o r i a l k a l i t e o l l i s u u s + k l o o r i a s e t y y l i k l o r i d i + k l o o r i a t o m i a + k l o o r i b e n t s o e h a p p o + k l o o r i e t i k k a h a p p o + k l o o r i f l u o r i h i i l i v e t y j ä + k l o o r i f l u o r i h i i l i v e t y m ä ä r i e n + k l o o r i h a p p o + k l o o r i k ä s i t e l t y j e n + k l o o r i k ä s i t e l t y ä + k l o o r i m e t y y l i m e t y y l i e e t t e r i + k l o o r i m ä ä r ä + k l o o r i n i t r a a t t i + k l o o r i p e r b e n t s o e h a p p o + k l o o r i p i t o i s u u s + k l o o r i p r o p a a n i h a p p o + k l o o r i p ä ä s t ö j e n + k l o o r i r i k k i h a p p o + k l o o r i t a b l e t t i a + k l o r i d i p i t o i s u u s + k l o r i d i r i p u l i + k l o r o g e e n i h a p p o + k l o v n i m e s i k k o + k l u b i l u o k a n + k l u s t e r i a l o i t t e e n + k l u s t e r i a l o i t t e i t a + k l u s t e r i t + k l u s t e r i v e r k k o j a + k o a k s i a a l i k a a p e l i + k o a l a a + k o a l a n + k o a l i t i o h a l l i t u k s e e n + k o a l i t i o h a l l i t u k s e l l e + k o a l i t i o h a l l i t u k s e l t a + k o a l i t i o h a l l i t u k s e n + k o a l i t i o h a l l i t u k s e s s a + k o a l i t i o h a l l i t u k s e s t a + k o a l i t i o h a l l i t u s + k o a l i t i o h a l l i t u s t a + k o a l i t i o j o u k k o i h i n + k o a l i t i o j o u k k o j a + k o a l i t i o j o u k k o j e n + k o a l i t i o j o u k k o m m e + k o a l i t i o j o u k o t + k o a l i t i o k o m p r o m i s s i + k o a l i t i o k u m p p a n e i d e n n e + k o a l i t i o k u m p p a n i + k o a l i t i o k u m p p a n i a n n e + k o a l i t i o k u m p p a n i n + k o a l i t i o n + k o a l i t i o n m u o d o s t u k s e s t a + k o a l i t i o o n + k o a l i t i o p u o l u e + k o a l i t i o p u o l u e e n + k o a l i t i o p u o l u e e t + k o a l i t i o p u o l u e i d e n + k o a l i t i o s o p i m u k s e e n + k o a l i t i o s o p i m u k s e n + k o a l i t i o s o p i m u k s e n s a + k o a l i t i o s o p i m u k s e s s a + k o a l i t i o s o p i m u k s e t + k o a l i t i o s o p i m u s + k o a l i t i o s o p i m u s t a + k o a l i t i o s t a + k o b o l t t i a s e t a a t t i + k o b o l t t i h y d r o k s i d i + k o b o l t t i k a n u u n a + k o b o l t t i k a r b o n a a t t i + k o b o l t t i k a r d i n a a l i + k o b o l t t i k l o r i d i + k o b o l t t i k o l i b r i + k o b o l t t i k o t t a r a i n e n + k o b o l t t i m o n a r k k i + k o b o l t t i n a a k k a + k o b o l t t i n i t r a a t t i + k o b o l t t i o k s i d i + k o b o l t t i p e i p p o + k o b o l t t i p y ö r ö p ä ä + k o b o l t t i s u l f a a t t i + k o d e i l l e + k o d e i s s a + k o d e i s t a a n + k o d i f i o i d a + k o d i f i o i d a a n + k o d i f i o i d u t + k o d i f i o i m a a n + k o d i f i o i m i n e n + k o d i f i o i m i s t a + k o d i f i o i n t i a + k o d i f i o i n t i a l o i t e + k o d i f i o i n t i a l u e t t a + k o d i f i o i n t i e h d o t u s + k o d i f i o i n t i e n + k o d i f i o i n t i h a n k e + k o d i f i o i n t i h a n k k e e s e e n + k o d i f i o i n t i k y s y m y s t ä + k o d i f i o i n t i m e n e t t e l y + k o d i f i o i n t i m e n e t t e l y y n + k o d i f i o i n t i p r o s e s s i + k o d i f i o i n t i p r o s e s s i n + k o d i f i o i n t i p r o s e s s i s t a + k o d i f i o i n t i p y r k i m y k s e t + k o d i f i o i n t i t a r v e t t a + k o d i f i o i n t i t e k s t i n + k o d i n + k o d i n h o i t o a l a n + k o d i n h o i t o p a l v e l u a + k o d i n h o i t o p a l v e l u i d e n + k o d i n h o i t o p a l v e l u j e n + k o d i n h o i t o t i l a + k o d i n h o i t o t y ö + k o d i n h o i t o t y ö p a i k o i s t a + k o d i n h o i t o t ö i s s ä + k o d i n h o i v a p a l v e l u j e n + k o d i n k o n e + k o d i n k o n e e t + k o d i n k o n e i d e n + k o d i n k o n e i s i i n + k o d i n k o n e i s s a + k o d i n k o n e i s t a + k o d i n k o n e i t a + k o d i n k o n e i t a a n + k o d i n k o n e k a u p p a + k o d i n p u o l u s t a j a + k o d i s s a a n + k o d i s t a + k o d i s t a a n + k o d i t o n t a + k o d i t t o m a k s i + k o d i t t o m i a + k o d i t t o m i e n + k o d i t t o m i k s i + k o d i t t o m i l l e + k o d i t t o m i n a + k o d i t t o m i s t a + k o d i t t o m u u d e n + k o d i t t o m u u s k y s y m y k s i ä + k o d i t t o m u u s o n g e l m a a + k o d i t t o m u u s s t r a t e g i o i t a + k o e a i k a + k o e a i k a a + k o e a i k a n a + k o e a i k o j e n + k o e a j a l l a + k o e a j a n + k o e a j a n j a k s o a + k o e a l a n a + k o e a l u e + k o e a m p u m i s e e n + k o e f u u s i o r e a k t o r i n + k o e h a n k e + k o e h a n k e l u e t t e l o n + k o e h a n k e t t a + k o e h a n k k e e n + k o e h a n k k e e n a + k o e h a n k k e e s e e n + k o e h a n k k e e s t a + k o e h a n k k e e t + k o e h a n k k e i d e n + k o e h a n k k e i s i i n + k o e h a n k k e i s s a + k o e h a n k k e i s t a + k o e h a n k k e i t a + k o e h e n k i l ö i d e n + k o e k a l a s t u k s e n + k o e k a l a s t u k s e s t a + k o e k a l a s t u k s i a + k o e k a l a s t u s + k o e k a l a s t u s t o i m e n p i t e e t + k o e k a n i i n e i n a + k o e k a n i i n e j a + k o e k a n i i n i + k o e k a n i i n i n + k o e k a n i i n i n a + k o e k a s v e j a + k o e k a u d e t + k o e k a u s i + k o e k e n t t ä + k o e k e n t t ä n ä + k o e k e n t ä k s i + k o e k i e l t o + k o e k u l j e t u k s i a + k o e k y s y m y k s e t + k o e k ä y t t ö + k o e k ä y t ö n + k o e l a b o r a t o r i o n + k o e l e n n o i s t a + k o e l e n n o n + k o e l e n n o t + k o e l e n t o + k o e l e n t o j a + k o e l e n t ä j ä + k o e l u o n t e i s e s t i + k o e l u o n t o i s e s t i + k o e l ä ä k k e i t ä + k o e m a t k u s t a j a + k o e m e n e t e l m i e n + k o e m e n e t e l m i i n + k o e m e n e t e l m i ä + k o e m e n e t t e l y ä + k o e m m e + k o e m m e k o + k o e m u o t o j e n + k o e n t s y y m e j ä + k o e o l o j e n + k o e p a i k a s s a + k o e p a l l o + k o e p a p e r i n + k o e p e n k k i n ä + k o e p o r a u k s i l t a + k o e p r o j e k t e j a + k o e p r o j e k t i + k o e p r o t o t y y p i n + k o e p u t k e t + k o e p u t k i + k o e p u t k i h e d e l m ö i t y k s e e n + k o e p u t k i h e d e l m ö i t y k s e l l ä + k o e p u t k i h e d e l m ö i t y k s e n + k o e p u t k i h e d e l m ö i t y k s e s s ä + k o e p u t k i h e d e l m ö i t y k s e s t ä + k o e p u t k i h e d e l m ö i t y k s i i n + k o e p u t k i h e d e l m ö i t y k s i s s ä + k o e p u t k i h e d e l m ö i t y s + k o e p u t k i h e d e l m ö i t y s h o i t o a + k o e p u t k i h e d e l m ö i t y s h o i t o j e n + k o e p u t k i h e d e l m ö i t y s m e n e t e l m ä n + k o e p u t k i i n + k o e p u t k i k o k e i l l a + k o e p u t k i t i l a n t e e s t a + k o e r a k e t t i a + k o e r e a k t o r e i s s a + k o e r e a k t o r e i t a + k o e r e a k t o r i s t a + k o e r ä j ä y t y k s e t + k o e s a t e l l i i t t i + k o e s i g n a a l i e n + k o e t a a n + k o e t a p a u k s e n a + k o e t a p a u k s i a + k o e t a p a u s + k o e t a r k o i t u k s e s s a + k o e t a r k o i t u k s i s s a + k o e t e l l a + k o e t e l l a a n + k o e t e l l e e n + k o e t e l l e e t + k o e t e l l u i m m a n + k o e t e l l u n + k o e t e l l u t + k o e t e l t i i n + k o e t e l t u a + k o e t i n k i v e k s i + k o e t i n k i v e l l ä + k o e t i n k i v e n + k o e t i n k i v e n ä + k o e t i n k i v e s t ä ä n + k o e t i n k i v i + k o e t t a e s s a a n + k o e t t a k a a m m e + k o e t t a v a t + k o e t t e k o + k o e t t e l e e + k o e t t e l e m a s t a + k o e t t e l e m a t + k o e t t e l e m i s s a + k o e t t e l e m u k s e t + k o e t t e l e m u k s i s s a a n + k o e t t e l e v a a n + k o e t t e l e v a t + k o e t t e l i v a t + k o e t t u + k o e t t u a + k o e t u k s e l l a + k o e t u k s e l l e + k o e t u k s i a + k o e t u l o k s i a + k o e t u s a i k a a + k o e t u s t a + k o e v a a t i m u s t e m m e + k o e v a i h e + k o e v a i h e e n + k o e v a i h e e s e e n + k o e v a i h e t t a + k o e v i h e l l y k s e e n + k o e v i l j e l m i ä + k o e v i l j e l m i ä ä n + k o e v u o t e n a + k o e ä ä n e s t y k s e n + k o e ä ä n e s t y s + k o g n i t i i v i s i a + k o g n i t i o t i e d e + k o h d a l l a a n + k o h d a l l a k a a n + k o h d a l l e e n + k o h d a n + k o h d a n n e e n + k o h d a n n e e t + k o h d a n n e i d e n + k o h d a n n u t t a + k o h d a s s a + k o h d a s t a + k o h d a t + k o h d a t a + k o h d a t a k s e e n + k o h d a t a k s e m m e + k o h d a t e s s a a n + k o h d a t e s s a m m e + k o h d a t e s s a n n e + k o h d a t k a a + k o h d a t k a a m m e + k o h d a t t a e s s a + k o h d a t t a v a + k o h d e a j a n j a k s o + k o h d e a l a k s i + k o h d e a l o i h i n + k o h d e a l o i l l a + k o h d e a l o j e n + k o h d e a l u e + k o h d e a l u e e l l a + k o h d e a l u e e s e e n + k o h d e a l u e e t + k o h d e a l u e i d e n + k o h d e a l u e i l l a + k o h d e a l u e i l l e + k o h d e a l u e i s i i n + k o h d e a v u k s i + k o h d e h a k i j a t + k o h d e h i n t o j e n + k o h d e j ä s e n v a l t i o n + k o h d e k a l o j e n + k o h d e k i e l i e n + k o h d e k u l t t u u r i n + k o h d e l a j e i h i n + k o h d e l a j i e n + k o h d e l k a a m m e + k o h d e l l a + k o h d e l l a a n + k o h d e l l e e t + k o h d e l l e s s a m m e + k o h d e l l u i k s i + k o h d e l l u t + k o h d e l t a i s i i n + k o h d e l t a v a + k o h d e l t i i n + k o h d e l t u + k o h d e l u v u t + k o h d e m a a + k o h d e m a a h a n + k o h d e m a a l l a + k o h d e m a a l l e + k o h d e m a a n + k o h d e m a a n s a + k o h d e m a a p e r i a a t e + k o h d e m a a p e r i a a t t e e l l a + k o h d e m a a p e r i a a t t e e s e e n + k o h d e m a a p e r i a a t t e e s t a + k o h d e m a a p e r i a a t t e i t a + k o h d e m a a s s a + k o h d e m a a s t a + k o h d e m a a t + k o h d e m a a t a + k o h d e m a i d e n + k o h d e m a i h i n + k o h d e m a i l l e + k o h d e m a i s s a + k o h d e m a i s s a k i n + k o h d e m a i s t a + k o h d e m a i s t a m m e + k o h d e m a i t a + k o h d e m a r k k i n a + k o h d e m a r k k i n o i d e n + k o h d e n n e t a a n + k o h d e n n e t t a v a + k o h d e n n e t t u + k o h d e n n e t t u a + k o h d e n n e t t u j a + k o h d e n n e t t u j e n + k o h d e n n e t u i l l a + k o h d e n n e t u m m a l l a + k o h d e n n e t u m m a n + k o h d e n n e t u m m a s t a + k o h d e n n e t u m m i n + k o h d e n n e t u m p a a + k o h d e n n e t u m p i + k o h d e n n e t u m p i a + k o h d e n n e t u m p i i n + k o h d e n n u t t a v a + k o h d e n t a a + k o h d e n t a m a a n + k o h d e n t a m i s e n + k o h d e n t a m i s e s s a + k o h d e n t a m i s j ä r j e s t e l m ä + k o h d e n t a m i s k ä y t ä n t ö ä + k o h d e n t a m i s m e k a n i s m i + k o h d e n t a m i s t a + k o h d e r y h m i e n + k o h d e r y h m i i n + k o h d e r y h m i l l e + k o h d e r y h m i s t ä + k o h d e r y h m i ä + k o h d e r y h m ä + k o h d e r y h m ä k s i + k o h d e r y h m ä l l e + k o h d e r y h m ä m m e + k o h d e r y h m ä n + k o h d e r y h m ä n ä + k o h d e r y h m ä t + k o h d e r y h m ä ä + k o h d e r y h m ä ä n + k o h d e v a l t i o i d e n + k o h d e v a l t i o l l a + k o h d e v a l t i o n + k o h d e v a l t i o t + k o h d e v e r k k o h i n n a t + k o h d e v e r k k o h i n t o j e n + k o h d e v e r k k o m a k s u j a + k o h d e v e r k k o m a r k k i n o i d e n + k o h d e v u o s i + k o h d e y h t i ö i l l e + k o h d e y h t i ö l l ä + k o h d e y h t i ö n + k o h d e y l e i s ö j ä + k o h d e y l e i s ö n + k o h d e y l e i s ö n ä + k o h d e y l e i s ö ä + k o h d e y l e i s ö ä ä n + k o h d e y r i t y k s e n + k o h d e y r i t y s + k o h d e y r i t y s t e n + k o h d i l t a a n + k o h d i n + k o h d i s s a + k o h d i s t a a + k o h d i s t a a k s e e n + k o h d i s t a k a a + k o h d i s t a m a a n + k o h d i s t a m a t t o m i e n + k o h d i s t e t t a v a + k o h d i s t e t t a v a a + k o h d i s t e t t a v i e n + k o h d i s t e t t u i h i n + k o h d i s t e t t u j a + k o h d i s t e t u m m a n + k o h d i s t e t u m m i n + k o h d i s t e t u m p i + k o h d i s t u a + k o h d i s t u i v a t + k o h d i s t u m i n e n + k o h d i s t u n e e t + k o h d i s t u n e i s i i n + k o h d i s t u n u t + k o h d i s t u n u t t a + k o h d i s t u t t a v a + k o h d i s t u u + k o h d i s t u v a a + k o h d i s t u v a a n + k o h d i s t u v a n + k o h d i s t u v a t + k o h d i s t u v i a + k o h d i s t u v i s t a + k o h d u n k a u l a n s y ö p ä + k o h d u n k a u l a n s y ö v i s t ä + k o h d u n k a u l a n s y ö v ä l t ä + k o h d u n k a u l a n s y ö v ä n + k o h d u n k a u l a s y ö p ä + k o h d u n k a u l a s y ö p ä ä + k o h d u n k a u l a s y ö v ä n + k o h d u n s u u + k o h e e s i o a j a t u k s e n + k o h e e s i o a l a a + k o h e e s i o a l a l l a + k o h e e s i o a l u e i d e n + k o h e e s i o a l u e i l l a + k o h e e s i o a l u e i t a + k o h e e s i o a s e t u s t a + k o h e e s i o b u d j e t i s t a + k o h e e s i o b u d j e t t i + k o h e e s i o b u d j e t t i i n + k o h e e s i o e h d o t u k s i s s a + k o h e e s i o f i l o s o f i a a + k o h e e s i o f o o r u m i + k o h e e s i o f o o r u m i a + k o h e e s i o f o o r u m i n + k o h e e s i o f o o r u m i s s a + k o h e e s i o h a n k k e i d e n + k o h e e s i o h a n k k e i s s a + k o h e e s i o h a n k k e i t a + k o h e e s i o i n v e s t o i n t i e n + k o h e e s i o k e r t o m u k s e e n + k o h e e s i o k e r t o m u k s e n + k o h e e s i o k e r t o m u k s e s s a + k o h e e s i o k e r t o m u k s e s t a + k o h e e s i o k e r t o m u k s i s t a + k o h e e s i o k e r t o m u s + k o h e e s i o k e r t o m u s t a + k o h e e s i o k e r t o m u s t a a n + k o h e e s i o k e s k u s t e l u + k o h e e s i o k e s k u s t e l u s s a + k o h e e s i o k r i t e e r i n + k o h e e s i o k u i l u + k o h e e s i o k y s y m y k s e e n + k o h e e s i o m a a + k o h e e s i o m a a l l e + k o h e e s i o m a a s s a + k o h e e s i o m a a s t a + k o h e e s i o m a a t + k o h e e s i o m a a t a + k o h e e s i o m a a t k a a n + k o h e e s i o m a i d e n + k o h e e s i o m a i h i n + k o h e e s i o m a i l l a + k o h e e s i o m a i l l e + k o h e e s i o m a i l t a + k o h e e s i o m a i s s a + k o h e e s i o m a i s t a + k o h e e s i o m a i t a + k o h e e s i o m a l l i a + k o h e e s i o m e n o j e n + k o h e e s i o m ä ä r ä r a h a t + k o h e e s i o m ä ä r ä r a h o j a + k o h e e s i o n + k o h e e s i o n ä k ö k o h d a n + k o h e e s i o n ä k ö k o h d a t + k o h e e s i o n ä k ö k u l m a s t a + k o h e e s i o o n + k o h e e s i o p a k e t i n + k o h e e s i o p e r i a a t t e e n + k o h e e s i o p o h j a i s e e n + k o h e e s i o p o l i i t t i s e e n + k o h e e s i o p o l i i t t i s e n + k o h e e s i o p o l i i t t i s e t + k o h e e s i o p o l i i t t i s i a + k o h e e s i o p o l i i t t i s i s s a + k o h e e s i o p o l i i t t i s t a + k o h e e s i o p o l i i t t i s t e n + k o h e e s i o p o l i t i i k a k s i + k o h e e s i o p o l i t i i k a l l a + k o h e e s i o p o l i t i i k a l l a k i n + k o h e e s i o p o l i t i i k a l l e + k o h e e s i o p o l i t i i k a l t a + k o h e e s i o p o l i t i i k a n + k o h e e s i o p o l i t i i k a s s a + k o h e e s i o p o l i t i i k a s s a a n + k o h e e s i o p o l i t i i k a s s a m m e + k o h e e s i o p o l i t i i k a s t a + k o h e e s i o p o l i t i i k a t + k o h e e s i o p o l i t i i k k a + k o h e e s i o p o l i t i i k k a a + k o h e e s i o p o l i t i i k k a a m m e + k o h e e s i o p o l i t i i k k a a n + k o h e e s i o p o l i t i i k k a a n s a + k o h e e s i o p o l i t i i k k a k i n + k o h e e s i o p o l i t i i k k a m m e + k o h e e s i o p o l i t i i k k a n s a + k o h e e s i o p o l i t i i k k o i h i n + k o h e e s i o p o l i t i i k k o j a + k o h e e s i o p o l i t i i k k o j e n + k o h e e s i o p o l i t i i k o i l l a + k o h e e s i o p o l i t i i k o i l l e + k o h e e s i o p o l i t i i k o i s t a + k o h e e s i o p o n n i s t e l u t + k o h e e s i o p r o s e s s e i h i n + k o h e e s i o p r o s e s s i + k o h e e s i o p r o s e s s i a + k o h e e s i o p r o s e s s i s s a + k o h e e s i o p y r k i m y s t e m m e + k o h e e s i o r a h a s t o + k o h e e s i o r a h a s t o a + k o h e e s i o r a h a s t o a l o i t t e i s t a + k o h e e s i o r a h a s t o a s e t u k s e s t a + k o h e e s i o r a h a s t o a s e t u s t a + k o h e e s i o r a h a s t o a s i a s t a + k o h e e s i o r a h a s t o h a n k k e i s i i n + k o h e e s i o r a h a s t o i h i n + k o h e e s i o r a h a s t o i l l a + k o h e e s i o r a h a s t o i l l e + k o h e e s i o r a h a s t o i l t a + k o h e e s i o r a h a s t o i s s a + k o h e e s i o r a h a s t o i s t a + k o h e e s i o r a h a s t o j a + k o h e e s i o r a h a s t o j e n + k o h e e s i o r a h a s t o k e l p o i s u u d e n + k o h e e s i o r a h a s t o l l a + k o h e e s i o r a h a s t o l l e + k o h e e s i o r a h a s t o l t a + k o h e e s i o r a h a s t o m a i d e n + k o h e e s i o r a h a s t o n + k o h e e s i o r a h a s t o n a + k o h e e s i o r a h a s t o o n + k o h e e s i o r a h a s t o p o l i t i i k k a a n + k o h e e s i o r a h a s t o r a h o i t u s t a + k o h e e s i o r a h a s t o s s a + k o h e e s i o r a h a s t o s t a + k o h e e s i o r a h a s t o t + k o h e e s i o r a h a s t o t u k e a + k o h e e s i o r a h a s t o t u k i e n + k o h e e s i o r a h a s t o u u d i s t u k s e s s a + k o h e e s i o r a h a s t o v a r a t + k o h e e s i o r a h a s t o v a r o j a + k o h e e s i o r a h o i t u k s e n + k o h e e s i o r a h o i t u k s e s t a + k o h e e s i o r a h o i t u s + k o h e e s i o r a h o i t u s p a k e t i s s a + k o h e e s i o r a h o i t u s t a + k o h e e s i o r a h o j e n + k o h e e s i o r a p o r t i n + k o h e e s i o r a p o r t i s s a + k o h e e s i o r a p o r t i s t a + k o h e e s i o r a p o r t t i + k o h e e s i o r a p o r t t i a + k o h e e s i o r a p o r t t i i n + k o h e e s i o s t a + k o h e e s i o s t r a t e g i a a + k o h e e s i o s t r a t e g i a n + k o h e e s i o s t r a t e g i a t + k o h e e s i o s t r a t e g i o i t a + k o h e e s i o s ä ä n n ö i s t ä + k o h e e s i o t a + k o h e e s i o t a l o u s a r v i o t a + k o h e e s i o t a r p e e n + k o h e e s i o t a v o i t e + k o h e e s i o t a v o i t e t t a + k o h e e s i o t a v o i t e t t a m m e + k o h e e s i o t a v o i t t e e n + k o h e e s i o t a v o i t t e e t + k o h e e s i o t a v o i t t e i d e n + k o h e e s i o t a v o i t t e i s s a a n + k o h e e s i o t a v o i t t e i t a + k o h e e s i o t a v o i t t e i t a a n + k o h e e s i o t o i m e n p i t e i s i i n + k o h e e s i o t o i m e t + k o h e e s i o t o i m i a + k o h e e s i o t o i m i i n + k o h e e s i o t o i m i s s a + k o h e e s i o t o i m i s t a + k o h e e s i o t u e n + k o h e e s i o t u k e a + k o h e e s i o t y ö k a l u + k o h e e s i o u l o t t u v u u s + k o h e e s i o v a a t i m u k s i a + k o h e e s i o v a j e t t a + k o h e e s i o v a l t i o i h i n + k o h e e s i o v a l t i o i l l e + k o h e e s i o v a l t i o i t a + k o h e e s i o v a l t i o n + k o h e e s i o v a l t i o s s a + k o h e e s i o v a l t i o t + k o h e e s i o v a l t i o t a + k o h e e s i o v a r a t + k o h e e s i o v a r o i s t a + k o h e e s i o v a r o j a + k o h e e s i o v a r o j e n + k o h e e s i o v o i m a s t a + k o h e e s i o v ä l i n e e m m e + k o h e e s i o v ä l i n e e s t ä + k o h e e s i o v ä l i n e e t + k o h e e s i o v ä l i n e i d e n + k o h e e s i o v ä l i n e i l l ä + k o h e e s i o v ä l i n e i s t ä + k o h e n e e + k o h e n e m a s s a + k o h e n n e t a a n + k o h e n n e t t a v a + k o h e n n u t t a v a + k o h e n t a a + k o h e n t a m a a n + k o h e n t a m i s e k s i + k o h e n t a m i s e s t a + k o h e n t u m a s s a + k o h i n a s u h d e + k o h i s t e n + k o h o a m i s e e n + k o h o a m i s e s t a + k o h o k o h d a n + k o h o k o h t a + k o h o p a i n o + k o h o r t t i e l ä i m i ä + k o h o r t t i e l ä i n t e n + k o h o t t a a + k o h o t t a m a t t a + k o h o t t a m i s e k s i + k o h o t t i v a t + k o h t a a k o + k o h t a a m a a m m e + k o h t a a m a a n + k o h t a a m a t + k o h t a a m a t t a + k o h t a a m i s e k s i + k o h t a a m i s e s t a + k o h t a a m i s p a i k a n + k o h t a a m i s p a i k k a + k o h t a a m i s p a i k k o j a + k o h t a a m i s v y ö h y k e + k o h t a a m m e + k o h t a a n i + k o h t a a v a t + k o h t a a v i s t a + k o h t a l a i s e n + k o h t a l o a + k o h t a l o a a n + k o h t a l o k a s t a + k o h t a l o k k a a k s i + k o h t a l o k k a a t + k o h t a l o k k a i k s i + k o h t a l o k k a i l t a + k o h t a l o k k a i m p i i n + k o h t a l o k k a i n + k o h t a l o k k a i s t a + k o h t a l o k k a i t a + k o h t a l o m m e + k o h t a l o n + k o h t a l o n k y s y m y s + k o h t a l o n k y s y m y s t ä + k o h t a l o n p y ö r ä + k o h t a l o n s a + k o h t a l o n y h t e y d e s t ä + k o h t a l o n y ö + k o h t a l o o n + k o h t a l o s t a + k o h t a l o s t a a n + k o h t a l o t o v e r e i t a + k o h t a l o t o v e r i e n + k o h t a n a + k o h t a s i v a t + k o h t a u k s e t + k o h t a u s k u l m a + k o h t a u s p a i k a k s i + k o h t a u s p a i k k a + k o h t a u s p a i k k o i n a + k o h t e e k s i + k o h t e e n + k o h t e e n a + k o h t e e n s a + k o h t e e s e e n s a + k o h t e e t t a + k o h t e i d e n + k o h t e i k s i + k o h t e i s i i n + k o h t e i s t a + k o h t e i t a + k o h t e i t a a n + k o h t e l e m m e + k o h t e l e v a n s a + k o h t e l i a a m m i n + k o h t e l i a a m p a a + k o h t e l i a a n + k o h t e l i a a n a + k o h t e l i a a s e e n + k o h t e l i a a t + k o h t e l i a i m m i n + k o h t e l i a i s i i n + k o h t e l i a i s u u d e s t a + k o h t e l i a i s u u k s i a + k o h t e l i a i s u u k s i e n + k o h t e l i a i s u u k s i s t a + k o h t e l i a i s u u s k o k o u k s e k s i + k o h t e l i a i s u u s k y s y m y s + k o h t e l i a i s u u s v a a t i m u k s i a + k o h t e l i a i t a + k o h t e l u a + k o h t e l u l l a + k o h t e l u n + k o h t e l u n s a + k o h t e l u s s a + k o h t e l u s t a + k o h t e l u u n + k o h t i a + k o h t i e n + k o h t i i n + k o h t u u d e l l a + k o h t u u d e n + k o h t u u d e s s a + k o h t u u h i n n a l l a + k o h t u u h i n n o i n + k o h t u u h i n t a a n + k o h t u u h i n t a i n e n + k o h t u u h i n t a i s e e n + k o h t u u h i n t a i s e m p a a + k o h t u u h i n t a i s e n + k o h t u u h i n t a i s e s t a + k o h t u u h i n t a i s e s t i + k o h t u u h i n t a i s e t + k o h t u u h i n t a i s i a + k o h t u u h i n t a i s i i n + k o h t u u h i n t a i s i n a + k o h t u u h i n t a i s i s t a + k o h t u u h i n t a i s t a + k o h t u u h i n t a i s t e n + k o h t u u h i n t o i h i n + k o h t u u k u s t a n n u k s i n + k o h t u u k ä y t t ä j ä + k o h t u u k ä y t t ä j ä n ä + k o h t u u k ä y t t ö + k o h t u u k ä y t t ö ä + k o h t u u l l i n e n k i n + k o h t u u l l i s e e n + k o h t u u l l i s e l l a + k o h t u u l l i s e l l e + k o h t u u l l i s e m m a l t a + k o h t u u l l i s e m m a s s a + k o h t u u l l i s e m m i k s i + k o h t u u l l i s e m m i l l a + k o h t u u l l i s e m m i l l e + k o h t u u l l i s e m m i n + k o h t u u l l i s e m p a a + k o h t u u l l i s e m p a n a + k o h t u u l l i s e m p i + k o h t u u l l i s e m p i a + k o h t u u l l i s e m p i i n + k o h t u u l l i s e n + k o h t u u l l i s e n a + k o h t u u l l i s e s s a + k o h t u u l l i s e t + k o h t u u l l i s i a + k o h t u u l l i s i k s i + k o h t u u l l i s i l t a + k o h t u u l l i s i m p a a n + k o h t u u l l i s i n + k o h t u u l l i s i n a + k o h t u u l l i s i s s a + k o h t u u l l i s i s t a + k o h t u u l l i s t a m a l l a + k o h t u u l l i s u u s l a u s e k e + k o h t u u l l i s u u s l a u s e k e t t a + k o h t u u l l i s u u s n ä k ö k o h d a t + k o h t u u l l i s u u s p e r i a a t t e e n + k o h t u u n + k o h t u u s p e r i a a t e + k o h t u u t o n t a + k o h t u u t t o m a k s i + k o h t u u t t o m a l t a + k o h t u u t t o m a n + k o h t u u t t o m a s s a + k o h t u u t t o m a s t a + k o h t u u t t o m a t + k o h t u u t t o m i a + k o h t u u t t o m i e n + k o h t u u t t o m i l l a + k o h t u u t t o m i l l e + k o h t u u t t o m i s t a + k o h t u u t t o m u u k s i s t a + k o h t u u t t o m u u t e e n + k o i k i l i + k o i l l i s e e n + k o i l l i s e l l a + k o i l l i s e n + k o i l l i s k o l k k a + k o i l l i s k o n g o n l e i j o n a + k o i l l i s o s a + k o i l l i s o s a s s a + k o i l l i s o s a s t a + k o i l l i s o s i s s a + k o i l l i s p u o l e l l a + k o i l l i s r a j a l l a + k o i l l i s r a n n i k o l l a + k o i l l i s t a + k o i l l i s v ä y l ä + k o i m m e + k o i r a a + k o i r a i h m i s i l l e + k o i r a k u i s k a a j a + k o i r a l o h i + k o i r a l u h t a k a n a + k o i r a n e l ä m ä ä + k o i r a n h e i n ä + k o i r a n h e i s i + k o i r a n h e i s i m a t o + k o i r a n k a s v a t t a j a + k o i r a n k e k s i + k o i r a n k e k s i t + k o i r a n k i e l i + k o i r a n k y n n e n + k o i r a n l i h a + k o i r a n p u t k i + k o i r a n p u t k i l a t t a k o i + k o i r a n p ö k k ö s i e n i + k o i r a n r u o k a + k o i r a n r u o k a a + k o i r a n r u u a n + k o i r a n r u u s u + k o i r a n s a + k o i r a n v e h n ä + k o i r a n ä y t t e l y + k o i r a p u i s t o + k o i r a p ö l l ö + k o i r a r o d u i s t a + k o i r a r o d u t + k o i r a r o t u + k o i r a s a l a m a n t e r i + k o i r a t + k o i r a t a n s s i + k o i r a t a p p e l u + k o i r a t u t k a + k o i r a t y y p e i s t ä + k o i r a v a l j a k k o a j o + k o i r i a + k o i r i e n + k o i r i s t a + k o i r u o h o + k o i s a m i t t a r i + k o i s a s i i p i + k o i s a y ö k k ö n e n + k o i t t a a + k o i t t a e s s a + k o i t t a n e e n + k o i t t a n u t + k o i t u a + k o i t u i s i + k o i t u n e i s t a + k o i t u u + k o i t u u k o + k o i t u v a + k o i t u v i i n + k o i v u h a p e r o + k o i v u h i i r i + k o i v u k e h r ä ä j ä + k o i v u l a h o r u s o k a s + k o i v u l a s i s i i p i + k o i v u l e h t o m i t t a r i + k o i v u l o v i m i t t a r i + k o i v u m i t t a r i + k o i v u n k a n t o s i e n i + k o i v u n p u n i k k i t a t t i + k o i v u r o u s k u + k o i v u s a a r i + k o i v u s e i t i k k i + k o i v u t y t t ö p e r h o n e n + k o i v u v i n o k a s + k o i v u v y ö m i t t a r i + k o i y ö k k ö n e n + k o k a i i n i k a u p a n + k o k a i i n i k a u p a s t a + k o k a i i n i k y s y m y k s e s t ä + k o k a i i n i n + k o k a i i n i t a k a v a r i k o t + k o k a i i n i v i l j e l m i e n + k o k a i i n i v i l j e l m ä t + k o k a l e h t i e n + k o k a p u u n + k o k e a + k o k e e + k o k e e n + k o k e e s s a + k o k e e t + k o k e i d e n + k o k e i l e m i s e n + k o k e i l e m m e + k o k e i l k a a m m e + k o k e i l l a + k o k e i l l a a n + k o k e i l l a a n p a + k o k e i l l a k s e e n + k o k e i l t a + k o k e i l t a v a + k o k e i l t u + k o k e i l t u k i n + k o k e i l u a j a n j a k s o + k o k e i l u a j a n j a k s o a + k o k e i l u a l u e e k s i + k o k e i l u a l u e e n + k o k e i l u a l u e e n a + k o k e i l u f o o r u m i e n + k o k e i l u h a k k e i t a + k o k e i l u h a n k e + k o k e i l u h a n k e t t a + k o k e i l u h a n k e v a i h e e n + k o k e i l u h a n k k e e k s i + k o k e i l u h a n k k e e l l e + k o k e i l u h a n k k e e n + k o k e i l u h a n k k e e n a + k o k e i l u h a n k k e e s e e n + k o k e i l u h a n k k e e s s a m m e + k o k e i l u h a n k k e e s t a + k o k e i l u h a n k k e e t + k o k e i l u h a n k k e i d e n + k o k e i l u h a n k k e i l l e + k o k e i l u h a n k k e i n + k o k e i l u h a n k k e i s i i n + k o k e i l u h a n k k e i s t a + k o k e i l u h a n k k e i t a + k o k e i l u i h i n + k o k e i l u i s t a + k o k e i l u j a a n + k o k e i l u j a k s o n + k o k e i l u j ä r j e s t e l m ä + k o k e i l u j ä r j e s t e l m ä n + k o k e i l u j ä r j e s t e l m ä ä + k o k e i l u k e n t t ä + k o k e i l u l a b o r a t o r i o k s i + k o k e i l u l a i t o s t e n + k o k e i l u l l i s i a + k o k e i l u l u o n t e i s e s t i + k o k e i l u l u o n t o i s e s t i + k o k e i l u l u o n t o i s i a + k o k e i l u m a a k s i + k o k e i l u m a a s t a + k o k e i l u m a i s s a + k o k e i l u m e n e t e l m i e n + k o k e i l u m o d u u l i e n + k o k e i l u m u o d o s s a a n + k o k e i l u n + k o k e i l u n a + k o k e i l u n o m a i s e s t i + k o k e i l u n o m a i s t a + k o k e i l u o h j e l m a + k o k e i l u o h j e l m a l l e + k o k e i l u o h j e l m a n + k o k e i l u o h j e l m i a + k o k e i l u o h j e l m i e n + k o k e i l u p e r u s t a l t a + k o k e i l u p i i l o l i n s s e j ä + k o k e i l u p i i l o l i n s s i e n + k o k e i l u p o h j a l t a + k o k e i l u p r o j e k t i n + k o k e i l u s t a + k o k e i l u t a p a u s + k o k e i l u t a s o l l a + k o k e i l u t o i m e e n + k o k e i l u t o i m e n p i t e i l l e + k o k e i l u t o i m e s t a + k o k e i l u t o i m i a + k o k e i l u t o i m i e n + k o k e i l u t o i m i n n a n + k o k e i l u t o i m i s t a + k o k e i l u t u t k i m u k s i a + k o k e i l u v a i h e + k o k e i l u v a i h e e n + k o k e i l u v a i h e e n a + k o k e i l u v a i h e e s s a + k o k e i l u v a i h e e s t a + k o k e i l u v a i h e t t a + k o k e i s i i n + k o k e i s s a + k o k e i t a + k o k e m a a n + k o k e m a n + k o k e m a t t o m a m m a t + k o k e m a t t o m i m m a t k i n + k o k e m a t t o m u u t t a n i + k o k e m u k s e e n + k o k e m u k s e l l a + k o k e m u k s e m m e + k o k e m u k s e n + k o k e m u k s e n a + k o k e m u k s e n i + k o k e m u k s e n n e + k o k e m u k s e n s a + k o k e m u k s e s t a + k o k e m u k s e s t a a n + k o k e m u k s e s t a n i + k o k e m u k s e t + k o k e m u k s i a + k o k e m u k s i a a n + k o k e m u k s i a m m e + k o k e m u k s i e m m e + k o k e m u k s i e n + k o k e m u k s i e n s a + k o k e m u k s i i n + k o k e m u k s i i n i + k o k e m u k s i n e e n + k o k e m u k s i s t a + k o k e m u k s i s t a a n + k o k e m u k s i s t a n i + k o k e m u k s i s t a n n e + k o k e m u s p ä ä o m a a m m e + k o k e m u s t a + k o k e m u s t a a n + k o k e m u s t a n i + k o k e m u s t e m m e + k o k e m u s t e n + k o k e m u s t e n i + k o k e m u s t e n s a + k o k e m u s t e n v a i h d o n + k o k e m u s t e n v a i h d o s t a + k o k e m u s t e n v a i h t o + k o k e m u s t e n v a i h t o a + k o k e m u s t e n v a i h t o n s a + k o k e m u s t e n v a i h t o o n + k o k e n e e m m a n + k o k e n e e m m a t + k o k e n e e m m i s t a + k o k e n e e m p i a + k o k e n e e m p i e n + k o k e n e e t + k o k e n e e t k i n + k o k e n e i m m i s t a + k o k e n e i n + k o k e n e i n t a + k o k e n e i s t a + k o k e n e i t a + k o k e v a t + k o k i a + k o k i n + k o k k e j a + k o k k i d i o s t a a t i t + k o k k i d i o s t a a t t e j a + k o k k i s o t a + k o k o a a + k o k o a i k a i n e n + k o k o a i k a i s e s s a + k o k o a i k a i s e s t a + k o k o a i k a i s e s t i + k o k o a i k a i s i a + k o k o a i k a i s i i n + k o k o a i k a i s i l l a + k o k o a i k a i s i l l e + k o k o a i k a i s t a + k o k o a i k a i s t e n + k o k o a i k a t y ö h ö n + k o k o a i k a t y ö s s ä + k o k o a i k a t y ö t ä + k o k o a i s i + k o k o a m a a n + k o k o a m a l l a + k o k o a m a n s a + k o k o a m i s e k s i + k o k o a m i s e l l e + k o k o a m i s e n + k o k o a m i s e s s a + k o k o a m i s e s t a + k o k o a m i s l i n j a l l a + k o k o a m i s t a + k o k o a m i s t e o l l i s u u t t a + k o k o a m m e + k o k o a v a t + k o k o e l m a k s i + k o k o e l m a l e v y + k o k o e r o i h i n + k o k o e r o i s t a + k o k o e r o t t e l u k r o m a t o g r a f i a + k o k o i s e l l e + k o k o i s i s s a + k o k o j ä r j e s t e l m ä t + k o k o j ä r j e s t y s s ä ä n t ö + k o k o k e h o t ä r i n ä + k o k o k e h o t ä r i n ä n + k o k o k e h o t ä r i n ä s t ä + k o k o k e h o t ä r i n ä ä + k o k o l u o k i s s a + k o k o m e r k i n t ä j ä r j e s t e l m ä + k o k o m e r k i n t ä j ä r j e s t e l m ä n + k o k o m e r k i n t ö j ä + k o k o n a i s a i k a + k o k o n a i s a i k a t a u l u + k o k o n a i s a i k a t a u l u a + k o k o n a i s a i k a t a u l u l l a + k o k o n a i s a i k a t a u l u u n + k o k o n a i s a j a s t a + k o k o n a i s a j a t u k s e e n + k o k o n a i s a j a t u k s e s t a + k o k o n a i s a l e n n u s t a + k o k o n a i s a l i j ä ä m ä + k o k o n a i s a l t i s t u m i s e n + k o k o n a i s a l u e + k o k o n a i s a n a l y y s i n + k o k o n a i s a n n o k s e n + k o k o n a i s a p u + k o k o n a i s a p u a + k o k o n a i s a p u r a h a s t o o n + k o k o n a i s a r v i o + k o k o n a i s a r v i o i d e n + k o k o n a i s a r v i o i n n i n + k o k o n a i s a r v i o i n n i s t a + k o k o n a i s a r v i o i n t i a + k o k o n a i s a r v i o l t a + k o k o n a i s a r v i o m m e + k o k o n a i s a r v i o n + k o k o n a i s a r v i o o m m e + k o k o n a i s a r v i o s s a a n + k o k o n a i s a r v i o s t a + k o k o n a i s a r v i o t a + k o k o n a i s a r v o + k o k o n a i s a r v o s t a + k o k o n a i s a s i a k i r j a n + k o k o n a i s a s i a y h t e y d e s s ä + k o k o n a i s a v u s t a + k o k o n a i s a v u s t a m m e + k o k o n a i s b r u t t o k a n s a n t u o t e + k o k o n a i s b r u t t o k a n s a n t u o t t e e s t a + k o k o n a i s b u d j e t i k s i + k o k o n a i s b u d j e t i n + k o k o n a i s b u d j e t i s s a + k o k o n a i s b u d j e t i s t a + k o k o n a i s b u d j e t t i + k o k o n a i s b u d j e t t i a + k o k o n a i s b u d j e t t i i n + k o k o n a i s b u d j e t t i k e h y k s e s t ä + k o k o n a i s b u d j e t t i m e n o i s s a + k o k o n a i s e h d o t u k s e e n + k o k o n a i s e h d o t u k s e k s i + k o k o n a i s e h d o t u k s e n + k o k o n a i s e h d o t u s t a a n + k o k o n a i s e m p i + k o k o n a i s e n + k o k o n a i s e n e m m i s t ö n + k o k o n a i s e n e r g i a m ä ä r ä s t ä + k o k o n a i s e n e r g i a n + k o k o n a i s e n e r g i a n k u l u t u k s e e n + k o k o n a i s e n e r g i a n k u l u t u k s e s t a + k o k o n a i s e n e r g i a n t a r p e e s t a + k o k o n a i s e n e r g i a t a r p e e s t a + k o k o n a i s e n e r g i a t e h o k k u u d e n + k o k o n a i s e n e r g i a t u o t a n n o s t a + k o k o n a i s e n n u s t e + k o k o n a i s e s i t y k s e n + k o k o n a i s e s i t y k s e s s ä + k o k o n a i s e s i t y s + k o k o n a i s e s t a + k o k o n a i s e t + k o k o n a i s e t u + k o k o n a i s h a a s t e e n a + k o k o n a i s h a l l i n n a s t a + k o k o n a i s h a l l i n t o m e n o i s t a + k o k o n a i s h a l l i n t o m e n o j e n + k o k o n a i s h a n k e t t a + k o k o n a i s h a n k k e e m m e + k o k o n a i s h a n k k e e n + k o k o n a i s h e d e l m ä l l i s y y s l u k u + k o k o n a i s h e i j a s t u m i n e n + k o k o n a i s h i i l i v a r a s t o t + k o k o n a i s h i n n a k s i + k o k o n a i s h i n n a n + k o k o n a i s h i n n a s t a + k o k o n a i s h i n t a + k o k o n a i s h i n t a a + k o k o n a i s h i n t a a n + k o k o n a i s h i n t a i n t e r v e n t i o t a + k o k o n a i s h y ö t y s u h d e t t a + k o k o n a i s h y ö t y y n + k o k o n a i s h y ö t y ä + k o k o n a i s i a + k o k o n a i s i l l e + k o k o n a i s i n f r a s t r u k t u u r i a + k o k o n a i s i n v e s t o i n n e i s t a + k o k o n a i s i n v e s t o i n n i t + k o k o n a i s i n v e s t o i n t i e n + k o k o n a i s i n v e s t o i n t i t a r p e e s t a + k o k o n a i s j ä r j e s t e l m ä ä + k o k o n a i s j ä r j e s t e l m ä ä n + k o k o n a i s j ä r j e s t e l y j ä + k o k o n a i s j ä r j e s t e l y s s ä + k o k o n a i s j ä r j e s t e l y ä + k o k o n a i s j ä s e n m ä ä r ä + k o k o n a i s k a l a s a a l i i s t a + k o k o n a i s k a l a s t u k s e n + k o k o n a i s k a l a s t u s k a p a s i t e e t t i a + k o k o n a i s k a l a t u o t a n n o s t a + k o k o n a i s k a l a v a r a t + k o k o n a i s k a n s a n t u l o s t a + k o k o n a i s k a n s a n t u o t t e e s e e n + k o k o n a i s k a n t a a + k o k o n a i s k a p a s i t e e t t i + k o k o n a i s k a p a s i t e e t t i a + k o k o n a i s k a s v i h u o n e k a a s u p ä ä s t ö j ä + k o k o n a i s k a s v u + k o k o n a i s k a s v u a + k o k o n a i s k a s v u s t a + k o k o n a i s k a t s a u k s e n + k o k o n a i s k a t s a u s + k o k o n a i s k a u d e n + k o k o n a i s k a u p a s t a + k o k o n a i s k e h i t y k s e s t ä + k o k o n a i s k e h i t y s t ä + k o k o n a i s k e h y k s e n + k o k o n a i s k e h y k s e n ä + k o k o n a i s k e h y k s e s s ä + k o k o n a i s k e h y s + k o k o n a i s k e h y s t ä + k o k o n a i s k e r t o m u k s e e n + k o k o n a i s k e s k u s t e l u a + k o k o n a i s k e s k u s t e l u s s a + k o k o n a i s k e s t o + k o k o n a i s k e s t o n + k o k o n a i s k e s t ä v y y t e e n + k o k o n a i s k i i n t i ö n + k o k o n a i s k i i n t i ö s t ä + k o k o n a i s k i i n t i ö t ä + k o k o n a i s k i i n t i ö ö n + k o k o n a i s k i l p a i l u k y k y + k o k o n a i s k i l p a i l u k y k y ä m m e + k o k o n a i s k i r j e e n v a i h t o m m e + k o k o n a i s k o m p r o m i s s i + k o k o n a i s k o m p r o m i s s i a + k o k o n a i s k o m p r o m i s s i n + k o k o n a i s k o m p r o m i s s i s t a + k o k o n a i s k o m p r o m i s s i s t a a n + k o k o n a i s k o n f l i k t i n + k o k o n a i s k o n s e p t i + k o k o n a i s k o n s e p t i a + k o k o n a i s k o n s e p t i i n + k o k o n a i s k o n s t r u k t i o n + k o k o n a i s k o n t e k s t i n + k o k o n a i s k o r v a u k s e s t a + k o k o n a i s k o r v a u s + k o k o n a i s k r i t i i k k i ä + k o k o n a i s k u l j e t u s a i k o j a + k o k o n a i s k u l u i h i n + k o k o n a i s k u l u i s t a + k o k o n a i s k u l u j e n + k o k o n a i s k u l u t u k s e n + k o k o n a i s k u l u t u k s e s t a + k o k o n a i s k u l u t u s + k o k o n a i s k u l u t u s t a + k o k o n a i s k u s t a n n u k s e k s i + k o k o n a i s k u s t a n n u k s e n s a + k o k o n a i s k u s t a n n u k s e t + k o k o n a i s k u s t a n n u k s i a + k o k o n a i s k u s t a n n u k s i a a n + k o k o n a i s k u s t a n n u k s i i n + k o k o n a i s k u s t a n n u k s i k s i + k o k o n a i s k u s t a n n u k s i l t a a n + k o k o n a i s k u s t a n n u k s i s s a + k o k o n a i s k u s t a n n u k s i s t a + k o k o n a i s k u s t a n n u s + k o k o n a i s k u s t a n n u s i n d e k s i + k o k o n a i s k u s t a n n u s t e n + k o k o n a i s k u s t a n n u s v a s t a a v u u t t a + k o k o n a i s k u v a + k o k o n a i s k u v a a + k o k o n a i s k u v a a n + k o k o n a i s k u v a n + k o k o n a i s k u v a s t a + k o k o n a i s k y s y n n ä n + k o k o n a i s k y s y n n ä s t ä + k o k o n a i s k y s y n t ä ä + k o k o n a i s k ä s i t e + k o k o n a i s k ä s i t y k s e n + k o k o n a i s k ä s i t y s + k o k o n a i s k ä s i t y s t ä + k o k o n a i s k ä y t t ä j i ä + k o k o n a i s k ä y t t ö a s t e + k o k o n a i s k ä y t ö s s ä + k o k o n a i s l a a d u n + k o k o n a i s l a a j u u t t a + k o k o n a i s l a a t u + k o k o n a i s l a a t u a + k o k o n a i s l a i n a m ä ä r ä + k o k o n a i s l a s k e l m a n n e + k o k o n a i s l a s k u n + k o k o n a i s l a s k u s t a + k o k o n a i s l i i k e n n e j ä r j e s t e l m ä s t ä + k o k o n a i s l i i k e v a i h d o s t a + k o k o n a i s l i i k e v a i h t o + k o k o n a i s l i n j a u s t a + k o k o n a i s l i s ä a r v o s t a + k o k o n a i s l o g i i k k a + k o k o n a i s l u k u + k o k o n a i s l u k u j a + k o k o n a i s l u k u m ä ä r ä + k o k o n a i s l u k u m ä ä r ä s t ä + k o k o n a i s l u v u t + k o k o n a i s l y h e n n y s t ä + k o k o n a i s l ä h e s t y m i s t a p a + k o k o n a i s l ä h e s t y m i s t a v a l l e + k o k o n a i s l ä h e s t y m i s t a v a s t a + k o k o n a i s m a a + k o k o n a i s m a a h a n m u u t t o a + k o k o n a i s m a a n p u o l u s t u s + k o k o n a i s m a a p i n t a + k o k o n a i s m a k s u i h i n + k o k o n a i s m a k s u t + k o k o n a i s m a k s u t a r p e e s t a + k o k o n a i s m a l l i + k o k o n a i s m a r k k i n a o s u u t t a + k o k o n a i s m a r k k i n o i l l e + k o k o n a i s m a r k k i n o i s t a + k o k o n a i s m a t k a + k o k o n a i s m e l u + k o k o n a i s m e l u n + k o k o n a i s m e n e s t y s t ä + k o k o n a i s m e n e t t e l y s s ä + k o k o n a i s m e n o i h i n + k o k o n a i s m e n o i s t a + k o k o n a i s m e n o i s t a a n + k o k o n a i s m e n o j a + k o k o n a i s m e n o j e n + k o k o n a i s m e n o t + k o k o n a i s m u u t t u j a t + k o k o n a i s m y y n t i i n + k o k o n a i s m ä ä r i i n + k o k o n a i s m ä ä r i s t ä + k o k o n a i s m ä ä r i ä + k o k o n a i s m ä ä r ä + k o k o n a i s m ä ä r ä k s i + k o k o n a i s m ä ä r ä l l e + k o k o n a i s m ä ä r ä l l ä + k o k o n a i s m ä ä r ä l t ä ä n + k o k o n a i s m ä ä r ä n + k o k o n a i s m ä ä r ä n ä + k o k o n a i s m ä ä r ä r a h a + k o k o n a i s m ä ä r ä r a h a a + k o k o n a i s m ä ä r ä r a h a n + k o k o n a i s m ä ä r ä r a h a s i i r r o s t a + k o k o n a i s m ä ä r ä r a h a s i i r t o n a + k o k o n a i s m ä ä r ä r a h a s t a + k o k o n a i s m ä ä r ä r a h a t + k o k o n a i s m ä ä r ä r a h o i h i n + k o k o n a i s m ä ä r ä r a h o i k s i + k o k o n a i s m ä ä r ä r a h o i n a + k o k o n a i s m ä ä r ä r a h o i s t a + k o k o n a i s m ä ä r ä r a h o j a + k o k o n a i s m ä ä r ä r a h o j e n + k o k o n a i s m ä ä r ä s s ä + k o k o n a i s m ä ä r ä s t ä + k o k o n a i s m ä ä r ä ä + k o k o n a i s m ä ä r ä ä n + k o k o n a i s n e t t o t u l o + k o k o n a i s n e t t o t u l o t + k o k o n a i s n e u v o t t e l u i h i n + k o k o n a i s n e u v o t t e l u j e n + k o k o n a i s n ä k e m y k s e e n + k o k o n a i s n ä k e m y k s e l l ä + k o k o n a i s n ä k e m y k s e n + k o k o n a i s n ä k e m y k s e s s ä + k o k o n a i s n ä k e m y s + k o k o n a i s n ä k e m y s t ä + k o k o n a i s n ä k y m ä + k o k o n a i s n ä k y m ä n + k o k o n a i s n ä k y m ä s s ä + k o k o n a i s n ä k ö k u l m a a + k o k o n a i s o h j e l m a + k o k o n a i s o h j e l m a l l e + k o k o n a i s o h j e l m a n + k o k o n a i s o h j e l m a n s a + k o k o n a i s o h j e l m a s s a + k o k o n a i s o h j e l m a s t a + k o k o n a i s o n g e l m a + k o k o n a i s o n g e l m a s t a + k o k o n a i s o s u u s + k o k o n a i s p a i n o n + k o k o n a i s p a i n o s t a + k o k o n a i s p a k e t i n + k o k o n a i s p a k e t i s s a + k o k o n a i s p a k e t i s t a + k o k o n a i s p a k e t i s t a k i n + k o k o n a i s p a k e t t i + k o k o n a i s p a k e t t i a + k o k o n a i s p a k e t t i i n + k o k o n a i s p a k e t t i n a + k o k o n a i s p a k o k a a s u p ä ä s t ö i h i n + k o k o n a i s p a l k a n + k o k o n a i s p a l k k a k u s t a n n u k s e t + k o k o n a i s p a l v e l u l l a + k o k o n a i s p a n o k s e l l e e n + k o k o n a i s p a r a n n u k s e n + k o k o n a i s p i l a a n t u m i n e n + k o k o n a i s p i n t a + k o k o n a i s p i t u u d e l t a a n + k o k o n a i s p i t u u s + k o k o n a i s p o h d i n t a a + k o k o n a i s p o i s t u m a n + k o k o n a i s p o l i i t t i s i a + k o k o n a i s p o l i t i i k a n + k o k o n a i s p o l i t i i k a s s a + k o k o n a i s p o l i t i i k k a + k o k o n a i s p o l i t i i k k a a + k o k o n a i s p o n n i s t u k s i i n + k o k o n a i s p o n n i s t u s t e n + k o k o n a i s p r o j e k t i s s a + k o k o n a i s p r o s e s s i i n + k o k o n a i s p r o s e s s i n + k o k o n a i s p r o s e s s i s s a + k o k o n a i s p y r k i m y k s e s t ä + k o k o n a i s p y r k i m y k s i ä + k o k o n a i s p y r k i m y s + k o k o n a i s p y y n n i n + k o k o n a i s p y y n t i m ä ä r ä s t ä + k o k o n a i s p y y n t i p o n n i s t u k s e n + k o k o n a i s p y y n t i p o n n i s t u s t a + k o k o n a i s p ä ä o m a s t a + k o k o n a i s p ä ä s t ö i h i n + k o k o n a i s p ä ä s t ö i s t ä + k o k o n a i s p ä ä s t ö j e n + k o k o n a i s p ä ä s t ö j ä + k o k o n a i s p ä ä s t ö j ä ä n + k o k o n a i s p ä ä s t ö k i i n t i ö + k o k o n a i s p ä ä s t ö t + k o k o n a i s r a h a m ä ä r ä + k o k o n a i s r a h o i t u k s e e n + k o k o n a i s r a h o i t u k s e n + k o k o n a i s r a h o i t u k s e s t a + k o k o n a i s r a h o i t u s + k o k o n a i s r a h o i t u s k e h y k s e s t ä + k o k o n a i s r a h o i t u s k e h y s t ä + k o k o n a i s r a h o i t u s o s u u s + k o k o n a i s r a h o i t u s p a k e t t i + k o k o n a i s r a h o i t u s p u i t t e i s t a + k o k o n a i s r a h o i t u s t a + k o k o n a i s r a h o i t u s t a s o + k o k o n a i s r a k e n n e t t a + k o k o n a i s r a k e n t e e n + k o k o n a i s r a k e n t e e s e e n + k o k o n a i s r a k e n t e e s s a + k o k o n a i s r a k e n t e e s t a + k o k o n a i s r a p o r t t i i m m e + k o k o n a i s r a s i t u s + k o k o n a i s r a t k a i s u + k o k o n a i s r a t k a i s u a + k o k o n a i s r a t k a i s u j a + k o k o n a i s r a t k a i s u j e n + k o k o n a i s r a t k a i s u l l a + k o k o n a i s r a t k a i s u l l e + k o k o n a i s r a t k a i s u n + k o k o n a i s r a t k a i s u s s a + k o k o n a i s r a t k a i s u s t a + k o k o n a i s r a t k a i s u t + k o k o n a i s r a t k a i s u u n + k o k o n a i s r a u h a n s o p i m u k s e e n + k o k o n a i s r e a k t i o t a + k o k o n a i s r e f o r m i + k o k o n a i s r e f o r m i a + k o k o n a i s r e m o n t t i a + k o k o n a i s r e s u r s s e j a + k o k o n a i s r e s u r s s i e n + k o k o n a i s r i k k i p ä ä s t ö i s t ä + k o k o n a i s r i s k e j ä + k o k o n a i s r i s k i + k o k o n a i s r i s k i ä + k o k o n a i s r u o k a v a l i o s s a + k o k o n a i s s a a l i i d e n + k o k o n a i s s a a l i i s t a + k o k o n a i s s a a l i s k i i n t i ö + k o k o n a i s s a a l i s m ä ä r i ä + k o k o n a i s s a a n n i n + k o k o n a i s s a a s t e m ä ä r ä ä n + k o k o n a i s s a k o n + k o k o n a i s s a l d o + k o k o n a i s s e l v i t y s + k o k o n a i s s i i r r o l l a + k o k o n a i s s i i r r o l l e + k o k o n a i s s i i r r o n + k o k o n a i s s i i r t o e h d o t u k s e e n + k o k o n a i s s i i r t o j e n + k o k o n a i s s i i r t o o n + k o k o n a i s s i s ä l l ö n + k o k o n a i s s i s ä l l ö s t ä + k o k o n a i s s i t o u m u k s e t + k o k o n a i s s i t o u m u s t a + k o k o n a i s s o p i m u k s e e n + k o k o n a i s s o p i m u k s e n + k o k o n a i s s o p i m u k s e s s a + k o k o n a i s s o p i m u k s e s t a + k o k o n a i s s o p i m u s + k o k o n a i s s o p i m u s t a + k o k o n a i s s t r a t e g i a + k o k o n a i s s t r a t e g i a a + k o k o n a i s s t r a t e g i a a m m e + k o k o n a i s s t r a t e g i a a n + k o k o n a i s s t r a t e g i a n + k o k o n a i s s t r a t e g i a s s a + k o k o n a i s s t r a t e g i a s t a + k o k o n a i s s t r a t e g i a t + k o k o n a i s s u l k e u m a + k o k o n a i s s u m m a + k o k o n a i s s u m m a a + k o k o n a i s s u m m a a n + k o k o n a i s s u m m a l l e + k o k o n a i s s u m m a l t a a n + k o k o n a i s s u m m a n + k o k o n a i s s u m m a s t a + k o k o n a i s s u m m a t + k o k o n a i s s u m m i e n + k o k o n a i s s u m m i n a + k o k o n a i s s u o r i t u s + k o k o n a i s s u u n n i t e l m a + k o k o n a i s s u u n n i t e l m a a + k o k o n a i s s u u n n i t e l m a a n + k o k o n a i s s u u n n i t e l m a n + k o k o n a i s s u u n n i t e l m a s s a + k o k o n a i s s u u n n i t e l m a s t a + k o k o n a i s s u u n n i t e l m i i n + k o k o n a i s s u u n n i t t e l u a + k o k o n a i s s u u n n i t t e l u n + k o k o n a i s s u u n n i t t e l u p r o s e s s i s s a + k o k o n a i s s u u n n i t t e l u s t a + k o k o n a i s s u u n t a u k s e s t a + k o k o n a i s s u u n t a u s t a + k o k o n a i s s u u r e e n + k o k o n a i s s y n t e e s i + k o k o n a i s s ä ä s t ö i s s ä + k o k o n a i s s ä ä s t ö j ä + k o k o n a i s s ä ä s t ö t + k o k o n a i s t a a k a s s a + k o k o n a i s t a l o u d e l l e m m e + k o k o n a i s t a l o u d e l l i n e n + k o k o n a i s t a l o u d e l l i s e n + k o k o n a i s t a l o u d e l l i s e s t i + k o k o n a i s t a l o u d e l l i s t a + k o k o n a i s t a l o u d e n + k o k o n a i s t a l o u d e s t a + k o k o n a i s t a l o u s + k o k o n a i s t a l o u s a r v i o + k o k o n a i s t a l o u s a r v i o i s t a + k o k o n a i s t a l o u s a r v i o n + k o k o n a i s t a l o u s a r v i o o n + k o k o n a i s t a l o u s a r v i o s s a + k o k o n a i s t a l o u s a r v i o s t a + k o k o n a i s t a l o u s a r v i o t a + k o k o n a i s t a l o u s a v u s t a + k o k o n a i s t a l o u t e e n + k o k o n a i s t a p p i o t + k o k o n a i s t a r j o n n a s t a + k o k o n a i s t a r j o n t a t i l a n t e e s s a + k o k o n a i s t a r j o u k s e t + k o k o n a i s t a r k a s t e l u s t a + k o k o n a i s t a r k a s t e l u u n + k o k o n a i s t a r k i s t u k s e n a + k o k o n a i s t a r k i s t u s + k o k o n a i s t a r k o i t u k s e e n + k o k o n a i s t a r p e e n + k o k o n a i s t a r p e e s t a + k o k o n a i s t a r p e e t + k o k o n a i s t a r v e + k o k o n a i s t a s a p a i n o + k o k o n a i s t a s a p a i n o a + k o k o n a i s t a s a p a i n o n + k o k o n a i s t a s e + k o k o n a i s t a s o + k o k o n a i s t a s o a + k o k o n a i s t a s o l l a + k o k o n a i s t a s o n + k o k o n a i s t a s o s t a + k o k o n a i s t a v o i t e + k o k o n a i s t a v o i t e t t a + k o k o n a i s t a v o i t e t t a m m e + k o k o n a i s t a v o i t t e e n + k o k o n a i s t a v o i t t e e n a + k o k o n a i s t a v o i t t e e s e e n + k o k o n a i s t a v o i t t e e s s a m m e + k o k o n a i s t a v o i t t e e t + k o k o n a i s t a v o i t t e i d e n + k o k o n a i s t a v o i t t e i s i i n + k o k o n a i s t e h o k k u u t t a + k o k o n a i s t e k s t i + k o k o n a i s t e n + k o k o n a i s t e r v e e l l i s y y d e s t ä + k o k o n a i s t i e d o t + k o k o n a i s t i e t o j a + k o k o n a i s t i l a n n e + k o k o n a i s t i l a n n e t t a + k o k o n a i s t i l a n t e e l l e + k o k o n a i s t i l a n t e e n + k o k o n a i s t i l a n t e e s e e n + k o k o n a i s t i l a n t e e s t a + k o k o n a i s t o i m i e n + k o k o n a i s t o i m i n t a t a p a + k o k o n a i s t o i m i n t o j e m m e + k o k o n a i s t o i m i s t o p i n t a + k o k o n a i s t o n n i s t o s t a + k o k o n a i s t u e s t a + k o k o n a i s t u k e a + k o k o n a i s t u k e n a + k o k o n a i s t u k i + k o k o n a i s t u l o + k o k o n a i s t u l o i s t a + k o k o n a i s t u l o j e n + k o k o n a i s t u l o k s e e n + k o k o n a i s t u l o k s e n a + k o k o n a i s t u l o k s e s s a + k o k o n a i s t u l o k s i a + k o k o n a i s t u l o k s i s t a + k o k o n a i s t u l o s + k o k o n a i s t u l o s t a + k o k o n a i s t u l o t + k o k o n a i s t u o n n i n + k o k o n a i s t u o n n i s t a + k o k o n a i s t u o n n i s t a m m e + k o k o n a i s t u o t a n n o n + k o k o n a i s t u o t a n n o s t a + k o k o n a i s t u o t a n n o s t a m m e + k o k o n a i s t u o t a n t o + k o k o n a i s t u o t a n t o k a p a s i t e e t i s t a + k o k o n a i s t u o t a n t o k a p a s i t e e t t i a + k o k o n a i s t u o t a n t o k i i n t i ö n + k o k o n a i s t u o t a n t o n s a + k o k o n a i s t u o t t a v u u t t a + k o k o n a i s t u r v a l l i s u u d e s t a + k o k o n a i s t u t k i m u s t a + k o k o n a i s t y ö a i k a + k o k o n a i s t y ö a i k a a + k o k o n a i s t y ö a j a n + k o k o n a i s t y ö a j a s t a + k o k o n a i s t y ö a j o i s t a + k o k o n a i s t y ö l l i s y y d e s t ä + k o k o n a i s t y ö l l i s y y s + k o k o n a i s t y ö l l i s y y s a s t e t t a + k o k o n a i s t y ö l l i s y y s p o l i t i i k a s t a + k o k o n a i s t y ö t t ö m y y d e n + k o k o n a i s t y ö t t ö m y y d e s t ä + k o k o n a i s t y ö t t ö m y y s + k o k o n a i s t y ö t t ö m y y s a s t e + k o k o n a i s t y ö v o i m a s t a + k o k o n a i s t y ö v o i m a s t a m m e + k o k o n a i s t ä y d e n t ä v y y s + k o k o n a i s u u d e k s i + k o k o n a i s u u d e n + k o k o n a i s u u d e s s a a n + k o k o n a i s u u d e s s a h a n + k o k o n a i s u u d e s t a + k o k o n a i s u u d i s t u k s e n + k o k o n a i s u u d i s t u k s e s s a + k o k o n a i s u u d i s t u k s e s t a + k o k o n a i s u u d i s t u s t a + k o k o n a i s u u d i s t u s t e n + k o k o n a i s u u k s i a + k o k o n a i s u u k s i n a + k o k o n a i s u u t e n a + k o k o n a i s u u t t a + k o k o n a i s v a h i n g o i s t a + k o k o n a i s v a h i n k o i h i n + k o k o n a i s v a i k u t e l m a a + k o k o n a i s v a i k u t e l m a m m e + k o k o n a i s v a i k u t t a v u u t t a + k o k o n a i s v a i k u t u k s e n + k o k o n a i s v a i k u t u k s e t + k o k o n a i s v a i k u t u k s i a + k o k o n a i s v a i k u t u s + k o k o n a i s v a i k u t u s t a + k o k o n a i s v a j e + k o k o n a i s v a l t a i n e n + k o k o n a i s v a l t a i s e e n + k o k o n a i s v a l t a i s e l l a + k o k o n a i s v a l t a i s e m m a l l a + k o k o n a i s v a l t a i s e m m a l l e + k o k o n a i s v a l t a i s e m m a n + k o k o n a i s v a l t a i s e m m a s s a + k o k o n a i s v a l t a i s e m m a s t a + k o k o n a i s v a l t a i s e m m i n + k o k o n a i s v a l t a i s e m m i s s a + k o k o n a i s v a l t a i s e m m i s t a + k o k o n a i s v a l t a i s e m p a a + k o k o n a i s v a l t a i s e m p a a n + k o k o n a i s v a l t a i s e m p i + k o k o n a i s v a l t a i s e m p i a + k o k o n a i s v a l t a i s e m p i e n + k o k o n a i s v a l t a i s e n + k o k o n a i s v a l t a i s e s s a + k o k o n a i s v a l t a i s e s t a + k o k o n a i s v a l t a i s e s t i + k o k o n a i s v a l t a i s e t + k o k o n a i s v a l t a i s i a + k o k o n a i s v a l t a i s i n + k o k o n a i s v a l t a i s t a + k o k o n a i s v a l t a i s u u t t a + k o k o n a i s v a l v o n n a n + k o k o n a i s v a l v o n t a a + k o k o n a i s v a r a s t o i s t a + k o k o n a i s v a r a u k s e n + k o k o n a i s v a r a u k s e s t a + k o k o n a i s v a r o i s t a + k o k o n a i s v a r o j e n + k o k o n a i s v a s t a u s + k o k o n a i s v a s t u u + k o k o n a i s v a s t u u n + k o k o n a i s v a s t u u n s a + k o k o n a i s v a s t u u s t a + k o k o n a i s v a s t u u t a a n + k o k o n a i s v e l a n + k o k o n a i s v e l a s t a + k o k o n a i s v e l k a + k o k o n a i s v e l k a a + k o k o n a i s v e l k a a n + k o k o n a i s v e l k a a n t u m i n e n + k o k o n a i s v e l k a a n t u m i s e n + k o k o n a i s v e l v o i t t e e m m e + k o k o n a i s v e r o a s t e + k o k o n a i s v e r o a s t e e n + k o k o n a i s v e r o r a s i t u s t a + k o k o n a i s v e r o t a a k k a a + k o k o n a i s v e r o t u k s e m m e + k o k o n a i s v e r o t u l o t + k o k o n a i s v e r o t u s + k o k o n a i s v e r o t u s t a + k o k o n a i s v e r t a i l u a r v o a + k o k o n a i s v e s i v a r o i s t a + k o k o n a i s v i e n n i s t ä + k o k o n a i s v i e n n i s t ä m m e + k o k o n a i s v i e n t i + k o k o n a i s v i i n i n v i l j e l y a l a n + k o k o n a i s v i l j e l y a l a a + k o k o n a i s v i l j e l y a l a s t a + k o k o n a i s v i s i o + k o k o n a i s v o i t o t + k o k o n a i s v u o s i t u l o k s e e n + k o k o n a i s v ä e s t ö m ä ä r ä ä n + k o k o n a i s v ä e s t ö n + k o k o n a i s v ä e s t ö s t ä + k o k o n a i s v ä e s t ö ö n + k o k o n a i s v ä h e n n y k s e s t ä + k o k o n a i s v ä h e n n y s t ä + k o k o n a i s v ä k i l u k u u n + k o k o n a i s v ä k i l u v u s t a + k o k o n a i s y l ä r a j a + k o k o n a i s y m p ä r i s t ö v a i k u t u k s e t + k o k o n a i s ä ä n e s t y k s e e n + k o k o n a i s ä ä n e s t y k s e n + k o k o n a i s ä ä n e s t y k s e s s ä + k o k o n a i s ä ä n e s t y k s e s t ä + k o k o n a i s ä ä n i m ä ä r ä + k o k o n s a + k o k o o j a v i e m ä r i t u n n e l i + k o k o o m a d i r e k t i i v i n + k o k o o m a e h d o t u k s e n + k o k o o m a e h d o t u k s e s t a + k o k o o m a l ä h e s t y m i s t a v a n + k o k o o m a p a k e t i s t a + k o k o o m a p a k e t t i a + k o k o o m a t e k s t i i n + k o k o o m u k s e n + k o k o o m u s h a l l i t u k s e n + k o k o o m u s h a l l i t u k s i a + k o k o o m u s h a l l i t u s + k o k o o m u s p u o l u e + k o k o o m u s p u o l u e e n + k o k o o m u s p u o l u e t t a + k o k o o m u s v a l t u u s k u n t a + k o k o o n n u m m e + k o k o o n n u m m e k o + k o k o o n n u t t a v a + k o k o o n p a n o a + k o k o o n p a n o a s i a s s a + k o k o o n p a n o j a + k o k o o n p a n o l a i t o s t a + k o k o o n p a n o l i n j a + k o k o o n p a n o l i n j a l l a + k o k o o n p a n o l l a + k o k o o n p a n o l t a a n + k o k o o n p a n o n + k o k o o n p a n o s t a + k o k o o n p a n o t + k o k o o n p a n o t e h d a s + k o k o o n p a n o t e h t a i l l e + k o k o o n p a n o t o i m i n t o j a + k o k o o n p a n o t o i m i n t o n a + k o k o o n t u a + k o k o o n t u e s s a a n + k o k o o n t u e s s a m m e + k o k o o n t u i + k o k o o n t u i s i v a t + k o k o o n t u i v a t + k o k o o n t u m a a n + k o k o o n t u m i s i a a n + k o k o o n t u m i s i s s a + k o k o o n t u m i s k i e l l o t + k o k o o n t u m i s l u p a a + k o k o o n t u m i s o i k e u s + k o k o o n t u m i s p a i k a s t a + k o k o o n t u m i s p a i k a s t a a n + k o k o o n t u m i s p a i k a t + k o k o o n t u m i s p a i k k o i h i n + k o k o o n t u m i s t a + k o k o o n t u m i s v a p a u d e n + k o k o o n t u m i s v a p a u d e s t a + k o k o o n t u m i s v a p a u s + k o k o o n t u m i s v a p a u t e e n + k o k o o n t u m i s v a p a u t t a + k o k o o n t u n e e l l e + k o k o o n t u n e e s s a + k o k o o n t u n e e t + k o k o o n t u n e i d e n + k o k o o n t u n e i n a + k o k o o n t u n u t + k o k o o n t u u + k o k o o n t u v a + k o k o o n t u v a a + k o k o o n t u v a n + k o k o o n t u v a s s a + k o k o o n t u v a t + k o k o o n t u v i e n + k o k o p ä i v ä h o i d o n + k o k o p ä i v ä i n e n + k o k o p ä i v ä i s e n + k o k o p ä i v ä i s e s s ä + k o k o p ä i v ä i s e t + k o k o p ä i v ä i s i k s i + k o k o p ä i v ä i s i s t ä + k o k o p ä i v ä i s i ä + k o k o p ä i v ä i s t e n + k o k o p ä i v ä i s t ä + k o k o p ä i v ä t o i m i s e s t i + k o k o p ä i v ä t o i m i s i a + k o k o p ä i v ä t o i m i s i l l e + k o k o p ä i v ä t o i m i s i s t a + k o k o p ä i v ä t y ö + k o k o p ä i v ä t y ö h ö n + k o k o p ä i v ä t y ö n + k o k o p ä i v ä t y ö s s ä + k o k o p ä i v ä t y ö s t ä + k o k o p ä i v ä t y ö t ä + k o k o r a j o i t u k s e t + k o k o r a j o i t u k s i a + k o k o r a j o i t u s + k o k o r a k e n t e e s t a + k o k o s i + k o k o s i m m e + k o k o s i v u n + k o k o s u k e l t a j a s o r s a t + k o k o u k s e e n + k o k o u k s e k s i + k o k o u k s e l l a + k o k o u k s e l l e + k o k o u k s e m m e + k o k o u k s e n + k o k o u k s e n s a + k o k o u k s e s s a + k o k o u k s e s s a a n + k o k o u k s e s s a m m e + k o k o u k s e s t a + k o k o u k s e s t a a n + k o k o u k s e s t a m m e + k o k o u k s e t + k o k o u k s i a + k o k o u k s i e n + k o k o u k s i i n + k o k o u k s i l l a + k o k o u k s i s s a + k o k o u k s i s s a a n + k o k o u k s i s s a m m e + k o k o u k s i s t a + k o k o u s a i k a t a u l u i s t a + k o k o u s a i k a t a u l u j e n + k o k o u s a s i a k i r j o j a + k o k o u s b u s s e i s s a + k o k o u s h u o n e + k o k o u s h u o n e e n + k o k o u s h u o n e e n s a + k o k o u s h u o n e e s t a + k o k o u s h u o n e e t + k o k o u s h u o n e i d e n + k o k o u s h u o n e i s s a + k o k o u s h u o n e i s s a m m e + k o k o u s h u o n e i s t a + k o k o u s j a k s o a + k o k o u s k i e r r o k s e n + k o k o u s k o h t a i s e s t i + k o k o u s k u l u j a + k o k o u s k u s t a n n u k s e t + k o k o u s o h j e l m a n + k o k o u s p a i k a k s i + k o k o u s p a i k k a + k o k o u s p a i k o i l l a m m e + k o k o u s p a k e t i t + k o k o u s p a l v e l u t + k o k o u s p ä i v ä n ä + k o k o u s p ä i v ä ä + k o k o u s p ö y t ä k i r j a t + k o k o u s p ö y t ä k i r j o j a + k o k o u s p ö y t ä k i r j o j e n + k o k o u s s a l e i h i n + k o k o u s s a l i i n + k o k o u s s a l i n + k o k o u s s a l i s s a + k o k o u s t a h t i a + k o k o u s t e n + k o k o u s t i l a + k o k o u s t i l o i h i n + k o k o u s t i l o i s s a + k o k o u s t i l o j a + k o k o u s t y ö s k e n t e l y y n + k o k o u s v a l m i s t e l u j e n + k o k o v u o t i s t a + k o k s i h i i l i k a i v o k s e t + k o l a p ä h k i n ä + k o l a r e i s s a + k o l a r e i t a + k o l a u k s e n + k o l a u k s i a + k o l e a m m a k s i + k o l e r a e p i d e m i a + k o l e r a e p i d e m i a a + k o l e r a e p i d e m i a n + k o l e r a e p i d e m i o i h i n + k o l e r a n + k o l e r a t a p a u s t a + k o l e r a v a a r a a + k o l e s t e r o l i a r v o i s t a + k o l e s t e r o l i a r v o j a + k o l e s t e r o l i i n + k o l e s t e r o l i s t a + k o l e s t e r o l i t a s o j a + k o l h o o s i n a i n e n + k o l h o o s i t y y l i s e n + k o l i b a k t e e r i + k o l i b r i h a u k k a + k o l i b r i k u k k a + k o l i i n i a s e t y y l i t r a n s f e r a a s i + k o l i k k o a u t o m a a t i t + k o l i k k o a u t o m a a t t e j a + k o l i k k o j a + k o l i k k o j e n + k o l i k k o j o h t a j i e n + k o l i k k o k o n e i l l a + k o l i k k o m ä ä r i ä + k o l i k k o p e l i + k o l i k o i d e n + k o l i k o i h i n + k o l i k o i n a + k o l i k o i s s a + k o l i k o i s t a + k o l i k o i s t a a n + k o l i k o i t a + k o l i k o l l a + k o l i k o n + k o l i k o n v a l m i s t u s m e n e t e l m i i n + k o l i k o s s a + k o l i k o t + k o l j a k a n n a t + k o l j a k i i n t i ö t ä + k o l j a s a a l i i s t a + k o l k i s s a + k o l l e g a a + k o l l e g a a m m e + k o l l e g a a n i + k o l l e g a a n n e + k o l l e g a h a n + k o l l e g a j o u k k o a + k o l l e g a l l a m m e + k o l l e g a l l a n i + k o l l e g a l l e + k o l l e g a l l e e n + k o l l e g a l l e m m e + k o l l e g a l l e n i + k o l l e g a l l e n n e + k o l l e g a l t a + k o l l e g a l t a m m e + k o l l e g a l t a n i + k o l l e g a m m e + k o l l e g a n + k o l l e g a n a + k o l l e g a n a a n + k o l l e g a n i + k o l l e g a n i k i n + k o l l e g a n n e + k o l l e g a n s a + k o l l e g a s s a n i + k o l l e g a s t a m m e + k o l l e g a t + k o l l e g a t k i n + k o l l e g i a a l i s e n + k o l l e g i a a l i s e n a + k o l l e g i a a l i s e s s a + k o l l e g i a a l i s e s t i + k o l l e g i o l l e + k o l l e g i o n + k o l l e g i o n a + k o l l e g i o n n e + k o l l e g i o o n + k o l l e g i o s s a + k o l l e g i o s s a k i n + k o l l e g i o t a + k o l l e g o i d e m m e + k o l l e g o i d e n + k o l l e g o i d e n i + k o l l e g o i d e n n e + k o l l e g o i d e n s a + k o l l e g o i h i m m e + k o l l e g o i h i n + k o l l e g o i h i n i + k o l l e g o i h i n s a + k o l l e g o i l l a + k o l l e g o i l l a n i + k o l l e g o i l l e + k o l l e g o i l l e e n + k o l l e g o i l l e m m e + k o l l e g o i l l e n i + k o l l e g o i l l e n n e + k o l l e g o i l t a + k o l l e g o i l t a a n + k o l l e g o i l t a m m e + k o l l e g o i l t a n i + k o l l e g o i n e e n + k o l l e g o i s s a + k o l l e g o i s s a n i + k o l l e g o i s t a + k o l l e g o i s t a a n + k o l l e g o i s t a k i n + k o l l e g o i s t a m m e + k o l l e g o i s t a n i + k o l l e g o i s t a n i h a n + k o l l e g o i s t a n i k i n + k o l l e g o i s t a n n e + k o l l e g o i t a + k o l l e g o i t a a n + k o l l e g o i t a m m e + k o l l e g o i t a n i + k o l l e g o i t a n n e + k o l l e g o i t t e n i + k o l l e g o i t t e n i k i n + k o l l e g o j a + k o l l e g o j a m m e + k o l l e g o j a n i + k o l l e g o j a n i k i n + k o l l e g o j a n n e + k o l l e g o j e m m e + k o l l e g o j e n + k o l l e g o j e n i + k o l l e g o j e n i k i n + k o l l e g o j e n s a + k o l l e k t i i v i s e e n + k o l l e k t i i v i s e n + k o l l e k t i i v i s e s t a + k o l l e k t i i v i s e t + k o l l e k t i i v i s i a + k o l l e k t i i v i s i i n + k o l l e k t i i v i s i l l a + k o l l e k t i i v i s i n + k o l l e k t i i v i s i s s a + k o l l e k t i i v i s i s t a + k o l l e k t i i v i s o p i m u k s e n + k o l l e k t i i v i s o p i m u k s i l l a + k o l l e k t i i v i s o p i m u k s i n a + k o l l e k t i i v i s o p i m u s + k o l l e k t i i v i s o p i m u s t a + k o l l e k t i i v i s o p i m u s t e n + k o l l e k t i i v i s t a + k o l l e k t i i v i s t e n + k o l l e k t i i v i v a l i t u s t e n + k o l l i v u o r e t + k o l m a n n e k s e e n + k o l m a n n e k s e l l a + k o l m a n n e k s e l l e + k o l m a n n e k s e n + k o l m a n n e k s e s s a + k o l m a n n e k s e s t a + k o l m a n n e k s i + k o l m a n n e l l a + k o l m a n n e l l e + k o l m a n n e n + k o l m a n n e n k i n + k o l m a n n e s s a + k o l m a n n e s t a + k o l m a n n e t + k o l m a n s i a + k o l m a n s i e n + k o l m a n s i i n + k o l m a n s i k s i + k o l m a n s i l l a + k o l m a n s i l l e + k o l m a n s i l t a + k o l m a n s i s s a + k o l m a n s i s t a + k o l m a n t e e n + k o l m a n t e n a + k o l m a s k i n + k o l m a s o s a a + k o l m a s o s a a n + k o l m a s o s a l l a + k o l m a s o s a n + k o l m a s o s a s s a + k o l m a s o s a s t a + k o l m a t t a + k o l m e a + k o l m e e n + k o l m e k s i + k o l m e k y m m e n t ä k a k s i + k o l m e k y m m e n t ä k o l m e + k o l m e k y m m e n t ä s e i t s e m ä n + k o l m e k y m m e n t ä t u h a t t a + k o l m e k y m m e n t ä v i i s i + k o l m e l l a + k o l m e l l e + k o l m e l l e k y m m e n e l l e v i i d e l l e + k o l m e l t a + k o l m e m i n u u t t i s e e n + k o l m e m i n u u t t i s e n + k o l m e n + k o l m e n a + k o l m e n k y m m e n e n v i i d e n + k o l m e n l a i s e t + k o l m e n l a i s i a + k o l m e n l a i s i i n + k o l m e n l a i s t a + k o l m e o s a i n e n + k o l m e s a t a a t u h a t t a + k o l m e s a t a a v i i s i k y m m e n t ä + k o l m e s i v u i s e n + k o l m e s s a + k o l m e s s a k a a n + k o l m e s t a + k o l m e t o i s t a v u o t i n e n + k o l m e t u h a t v u o t i n e n + k o l m e t u h a t v u o t i s e s s a + k o l m e v a i h e i s e n + k o l m e v u o t i a a t + k o l m e v u o t i a i l l e + k o l m e v u o t i a i l t a + k o l m e v u o t i a i s t a + k o l m e v u o t i a i t a + k o l m e v u o t i a s + k o l m e v u o t i s t a r k a s t u k s e s s a + k o l m e v u o t i s t a r k i s t u s t a + k o l m i a i v o t e o r i a + k o l m i a l f a r e a k t i o + k o l m i j a k o + k o l m i j a k o i s e e n + k o l m i j a k o i s e s t a + k o l m i j a o n + k o l m i k a n t a f o o r u m i n + k o l m i k a n t a h a l l i n n o n + k o l m i k a n t a h u i p p u k o k o u k s e s s a + k o l m i k a n t a i s e s t a + k o l m i k a n t a i s i s s a + k o l m i k a n t a j u l i s t u k s e n + k o l m i k a n t a j u l i s t u k s e s s a + k o l m i k a n t a j u l i s t u s + k o l m i k a n t a j ä r j e s t e l m ä n + k o l m i k a n t a k a u p p a + k o l m i k a n t a k a u p p a a + k o l m i k a n t a k e s k u s t e l u i s s a + k o l m i k a n t a k e s k u s t e l u m e n e t t e l y ä + k o l m i k a n t a k o k o o n p a n o s s a + k o l m i k a n t a k o k o u k s e n + k o l m i k a n t a k o k o u k s e s s a + k o l m i k a n t a k o k o u k s e s t a + k o l m i k a n t a k o k o u k s i a + k o l m i k a n t a k o k o u k s i s s a + k o l m i k a n t a k o k o u s + k o l m i k a n t a k o k o u s t a + k o l m i k a n t a k o m i s s i o n + k o l m i k a n t a k o m i t e a a + k o l m i k a n t a k o m i t e a n + k o l m i k a n t a k o m i t e o i d e n + k o l m i k a n t a k o m p r o m i s s i a + k o l m i k a n t a l i i t o n + k o l m i k a n t a m e k a n i s m i + k o l m i k a n t a m e n e t e l m ä ä n s ä + k o l m i k a n t a m e n e t t e l y + k o l m i k a n t a m e n e t t e l y n + k o l m i k a n t a m e n e t t e l y s s ä + k o l m i k a n t a n e u v o t t e l u + k o l m i k a n t a n e u v o t t e l u a + k o l m i k a n t a n e u v o t t e l u i d e n + k o l m i k a n t a n e u v o t t e l u i h i n + k o l m i k a n t a n e u v o t t e l u i l l e + k o l m i k a n t a n e u v o t t e l u i s s a + k o l m i k a n t a n e u v o t t e l u i s s a a n + k o l m i k a n t a n e u v o t t e l u j a + k o l m i k a n t a n e u v o t t e l u j e n + k o l m i k a n t a n e u v o t t e l u m m e + k o l m i k a n t a n e u v o t t e l u s s a + k o l m i k a n t a n e u v o t t e l u t + k o l m i k a n t a n e u v o t t e l u u n + k o l m i k a n t a p e r i a a t t e e l l a + k o l m i k a n t a p ä ä t ö k s e n + k o l m i k a n t a r a k e n n e + k o l m i k a n t a s o p i m u k s e l l a + k o l m i k a n t a s o p i m u k s e l l e + k o l m i k a n t a s o p i m u k s e n + k o l m i k a n t a s o p i m u k s e s s a + k o l m i k a n t a s o p i m u k s e s t a + k o l m i k a n t a s o p i m u k s e t + k o l m i k a n t a s o p i m u k s i a + k o l m i k a n t a s o p i m u k s i i n + k o l m i k a n t a s o p i m u k s i s s a + k o l m i k a n t a s o p i m u k s i s t a + k o l m i k a n t a s o p i m u s + k o l m i k a n t a s o p i m u s p r o s e s s i + k o l m i k a n t a s o p i m u s t a + k o l m i k a n t a s o p i m u s t e n + k o l m i k a n t a s u h d e t t a + k o l m i k a n t a t a p a a m i s e s s a + k o l m i k a n t a t a p a a m i s i l l a + k o l m i k a n t a t y ö r y h m ä + k o l m i k a n t a t y ö r y h m ä n + k o l m i k a n t a v a i h e e s s a + k o l m i k a n t a v a l t u u s k u n n a n + k o l m i k a n t a v a l t u u s k u n t a + k o l m i k a n t a v a l t u u s k u n t a a + k o l m i k a n t a v u o r o p u h e l u n + k o l m i k a n t a v u o r o p u h e l u t + k o l m i k a n t a y h t e i s t y ö k s i + k o l m i k a n t a y h t e i s t y ö n + k o l m i k a n t a y h t e i s t y ö s t ä + k o l m i k a n t a y h t e i s t y ö t ä + k o l m i k o l k k a h a t t u + k o l m i k o n + k o l m i k y m m e n v u o t i n e n + k o l m i k y m m e n v u o t i s e e n + k o l m i k y m m e n v u o t i s e n + k o l m i k y m m e n v u o t i s e s t a + k o l m i l i i t t o + k o l m i l i i t t o o n + k o l m i l i t r a i s i a + k o l m i l o i k k a + k o l m i n + k o l m i n a p a i s e n + k o l m i n k e r t a i s e l l a + k o l m i n k e r t a i s e n + k o l m i n k e r t a i s e s t a + k o l m i n k e r t a i s e t + k o l m i n k e r t a i s t a a + k o l m i n k e r t a i s t a i s i + k o l m i n k e r t a i s t e t t u + k o l m i n k e r t a i s t u i + k o l m i n k e r t a i s t u n u t + k o l m i n k e r t a i s t u u + k o l m i n o p e u k s i n e n + k o l m i n u m e r o i s e e n + k o l m i o a a l t o + k o l m i o e p ä y h t ä l ö + k o l m i o k a + k o l m i o k a u p p a + k o l m i o k u v a e l m a a + k o l m i o l u k u + k o l m i o m a t r i i s i + k o l m i o m i t t a u s t o r n i + k o l m i o n + k o l m i o o n + k o l m i o r u u n i y ö k k ö n e n + k o l m i o s a i n e n + k o l m i o s a i s e e n + k o l m i o s a i s e n + k o l m i o s a i s e s t a + k o l m i o t ä p l ä k i p u a j a + k o l m i p i i k k i + k o l m i p u o l u e k o a l i t i o + k o l m i p y ö r i i n + k o l m i p y ö r ä i s i ä + k o l m i p y ö r ä i s t e n + k o l m i p ä i v ä i n e n + k o l m i p ä i v ä i s e e n + k o l m i p ä i v ä i s e l l e + k o l m i p ä i v ä i s e s s ä + k o l m i p ä i v ä i s t ä + k o l m i r a t s u p e l i + k o l m i s e n k y m m e n t ä + k o l m i s ä d e t y r ä k k i + k o l m i t a a j u u s p u h e l i n + k o l m i t a h o i s e n + k o l m i t a h o i s e s t a + k o l m i t a s o i s e k s i + k o l m i t a s o i s e n + k o l m i t i e k a t a l y s a a t t o r i e n + k o l m i t u n t i s e e n + k o l m i u l o t t e i n e n + k o l m i u l o t t e i s e n + k o l m i u l o t t e i s t a + k o l m i u l o t t e i s u u d e n + k o l m i u l o t t e i s u u s + k o l m i v a i h e i n e n + k o l m i v a i h e i s e n + k o l m i v a i h e i s e s t a + k o l m i v a i h e k a u p a n + k o l m i v a i h e v i r t a + k o l m i v a r v a s l a i s k i a i n e n + k o l m i v a r v a s l a i s k i a i s e t + k o l m i v u o t i a a t + k o l m i v u o t i a i d e n + k o l m i v u o t i a i l l e + k o l m i v u o t i a i l t a + k o l m i v u o t i a i n a + k o l m i v u o t i a i s i i n + k o l m i v u o t i a i s t a + k o l m i v u o t i a i t a + k o l m i v u o t i a s + k o l m i v u o t i n e n + k o l m i v u o t i s e e n + k o l m i v u o t i s e k s i + k o l m i v u o t i s e l l a + k o l m i v u o t i s e n + k o l m i v u o t i s e s t a + k o l m i v u o t i s e t + k o l m i v u o t i s i a + k o l m i v u o t i s i i n + k o l m i v u o t i s i s t a + k o l m i v u o t i s j a k s o n a + k o l m i v u o t i s k a u d e k s i + k o l m i v u o t i s k a u d e l l a + k o l m i v u o t i s k a u d e n + k o l m i v u o t i s s u u n n i t e l m a a n + k o l m i v u o t i s s u u n n i t e l m a t + k o l m i v u o t i s s y k l i + k o l m i v u o t i s t a + k o l m i v u o t i s t e n + k o l m i v u o t i s v a i h e t t a + k o l m i v y ö m i t t a r i + k o l m i v y ö t y l l i + k o l m o i s a g e n t t i + k o l m o i s g i l j o t i i n i + k o l m o i s h e r m o + k o l m o i s h e r m o s ä r k y + k o l m o i s i n t e r v e n t i o + k o l m o i s k r u u n u + k o l m o i s p i s t e + k o l o b o a + k o l o k e r t t u l i + k o l o n i a l i s m i a + k o l o n i a l i s m i i n + k o l o n i a l i s m i l t a + k o l o n i a l i s m i s t a + k o l o n i a l i s t i s e e n + k o l o r a d o n k u o r i a i n e n + k o l o r a t u u r i s o p r a a n o + k o l o r e k t a a l i s e n + k o l o s s i k a l m a r i + k o l o t t i + k o l o t y l l i + k o l t a n s a a m e + k o l u m b i a l a i s e s s a + k o l u m b i a l a i s i a + k o l u m b i a l a i s t e n + k o m b i n a a t i o i d e n + k o m b i n a a t i o p e r i a a t e + k o m e a t + k o m e d i a e l o k u v a + k o m e d i a e l o k u v i s t a + k o m e d i a e s i i n t y m i n e n + k o m e d i a o h j e l m a + k o m e d i a s a r j a s s a + k o m e e t t o j a + k o m e n n e l t a v a n a + k o m e n n u s k e t j u n + k o m e n t a j a k a p t e e n i + k o m e n t a j a n + k o m e n t o j ä r j e s t e l m i l l ä + k o m e n t o j ä r j e s t e l m ä ä + k o m e n t o j ä r j e s t e l m ä ä n + k o m e n t o k e s k u k s e t + k o m e n t o k e s k u k s i a + k o m e n t o k e s k u s t e n + k o m e n t o k e t j u + k o m e n t o k e t j u a + k o m e n t o k e t j u i s t a + k o m e n t o k i e l i + k o m e n t o l i i t t y m ä + k o m e n t o l i n j a + k o m e n t o p o r r a s t a + k o m e n t o r a k e n n e + k o m e n t o r a k e n t e e n + k o m e n t o r a k e n t e i d e n + k o m e n t o r a k e n t e i s s a + k o m e n t o r a k e n t e i t a + k o m e n t o s a r j a k i e l i + k o m e n t o t a l o u d e s t a + k o m e n t o t a l o u s + k o m e n t o t a l o u t t a + k o m e n t o t i e + k o m e n t o v a s t u u s s a + k o m e n t o v y ö + k o m i s a r i o n a + k o m i s s a a r e i s t a + k o m i s s a a r e j a + k o m i s s a a r i a + k o m i s s a a r i e h d o k a s + k o m i s s a a r i e n + k o m i s s a a r i i n + k o m i s s a a r i k o l l e g a n i + k o m i s s a a r i k o l l e g i o + k o m i s s a a r i k o l l e g i o n + k o m i s s a a r i k ä s k y + k o m i s s a a r i l l a + k o m i s s a a r i l l e + k o m i s s a a r i l t a + k o m i s s a a r i n + k o m i s s a a r i n k a a n + k o m i s s a a r i r y h m ä n + k o m i s s a a r i t + k o m i s s a a r i t a s o l l a + k o m i s s a a r i v a l i n n a t + k o m i s s i o h a n + k o m i s s i o k a a n + k o m i s s i o k i n + k o m i s s i o k s i + k o m i s s i o k u l t t u u r i + k o m i s s i o l l a + k o m i s s i o l l a k a a n + k o m i s s i o l l a k i n + k o m i s s i o l l e + k o m i s s i o l l e k a a n + k o m i s s i o l l e k i n + k o m i s s i o l t a + k o m i s s i o n + k o m i s s i o n k a a n + k o m i s s i o n k i n + k o m i s s i o n k o l l e g i o l l e + k o m i s s i o n n e + k o m i s s i o o n + k o m i s s i o r a k e n t e e n + k o m i s s i o s s a + k o m i s s i o s s a k a a n + k o m i s s i o s s a k i n + k o m i s s i o s s a n n e + k o m i s s i o s t a + k o m i s s i o t a + k o m i s s i o t a k i n + k o m i s s i o v a l t a + k o m i s s i o v i i t t a u s + k o m i t + k o m i t e a a + k o m i t e a a n + k o m i t e a j ä r j e s t e l m ä + k o m i t e a j ä r j e s t e l m ä n + k o m i t e a j ä r j e s t e l m ä ä + k o m i t e a k e s k u s t e l u i s s a + k o m i t e a k o k o u k s i i n + k o m i t e a k o k o u k s i s s a + k o m i t e a k o k o u s t a + k o m i t e a k ä s i t t e l y n + k o m i t e a k ä s i t t e l y ä + k o m i t e a l a i n s ä ä d ä n t ö ä + k o m i t e a l l a + k o m i t e a l l e + k o m i t e a l t a + k o m i t e a m e n e t t e l y + k o m i t e a m e n e t t e l y a i h e e s t a + k o m i t e a m e n e t t e l y i s s ä + k o m i t e a m e n e t t e l y i s t ä + k o m i t e a m e n e t t e l y i t ä + k o m i t e a m e n e t t e l y j e n + k o m i t e a m e n e t t e l y j ä + k o m i t e a m e n e t t e l y j ä r j e s t e l m ä n + k o m i t e a m e n e t t e l y l l e + k o m i t e a m e n e t t e l y l l ä + k o m i t e a m e n e t t e l y n + k o m i t e a m e n e t t e l y r e k i s t e r i i n + k o m i t e a m e n e t t e l y s s ä + k o m i t e a m e n e t t e l y s t ä + k o m i t e a m e n e t t e l y s ä ä n n ö s t e n + k o m i t e a m e n e t t e l y t + k o m i t e a m e n e t t e l y y n + k o m i t e a m e n e t t e l y ä + k o m i t e a n + k o m i t e a p ä ä t ö k s i l l ä + k o m i t e a p ä ä t ö k s i ä + k o m i t e a r a k e n n e + k o m i t e a r a k e n t e e s e e n + k o m i t e a s s a + k o m i t e a s t a + k o m i t e a t y ö s k e n t e l y n + k o m i t e a v a i h e e s s a + k o m i t e a v a l t u u k s i a + k o m i t e o i d e n + k o m i t e o i k s i + k o m i t e o i l l a + k o m i t e o i s t a + k o m i t o l o g i a a + k o m i t o l o g i a a n + k o m i t o l o g i a e h d o t u k s e s t a + k o m i t o l o g i a i d e o l o g i a a n + k o m i t o l o g i a j ä r j e s t e l m ä + k o m i t o l o g i a j ä r j e s t e l m ä n + k o m i t o l o g i a j ä r j e s t e l m ä ä + k o m i t o l o g i a j ä r j e s t e l y j e n + k o m i t o l o g i a k e s k u s t e l u + k o m i t o l o g i a k e s k u s t e l u j a + k o m i t o l o g i a k o m i t e a + k o m i t o l o g i a k o m i t e a s s a + k o m i t o l o g i a k o m i t e o i d e n + k o m i t o l o g i a k o m i t e o i s s a + k o m i t o l o g i a k o m i t e o i t a + k o m i t o l o g i a k y s y m y k s e e n + k o m i t o l o g i a k y s y m y k s e n + k o m i t o l o g i a k y s y m y k s e s s ä + k o m i t o l o g i a k y s y m y k s e s t ä + k o m i t o l o g i a k y s y m y s + k o m i t o l o g i a k y s y m y s t ä + k o m i t o l o g i a k ä y t ä n n ö l t ä + k o m i t o l o g i a k ä y t ä n t ö j ä + k o m i t o l o g i a k ä y t ä n t ö ö n + k o m i t o l o g i a l a b y r i n t i n + k o m i t o l o g i a l a i n s ä ä d ä n t ö ä + k o m i t o l o g i a m e n e t e l m ä ä + k o m i t o l o g i a m e n e t t e l y + k o m i t o l o g i a m e n e t t e l y i h i n + k o m i t o l o g i a m e n e t t e l y i s s ä + k o m i t o l o g i a m e n e t t e l y j e n + k o m i t o l o g i a m e n e t t e l y j ä + k o m i t o l o g i a m e n e t t e l y l l ä + k o m i t o l o g i a m e n e t t e l y n + k o m i t o l o g i a m e n e t t e l y p ä ä t ö k s e e n + k o m i t o l o g i a m e n e t t e l y r e k i s t e r i n + k o m i t o l o g i a m e n e t t e l y s s ä + k o m i t o l o g i a m e n e t t e l y s s ä k i n + k o m i t o l o g i a m e n e t t e l y s t ä + k o m i t o l o g i a m e n e t t e l y t + k o m i t o l o g i a m e n e t t e l y y n + k o m i t o l o g i a m e n e t t e l y ä + k o m i t o l o g i a m ä ä r ä y s t e n + k o m i t o l o g i a n + k o m i t o l o g i a o n g e l m a + k o m i t o l o g i a p ä ä t ö k s e e n + k o m i t o l o g i a p ä ä t ö k s e n + k o m i t o l o g i a p ä ä t ö k s e n t e k o o n + k o m i t o l o g i a p ä ä t ö k s e s s ä + k o m i t o l o g i a p ä ä t ö k s e s t ä + k o m i t o l o g i a p ä ä t ö k s i s t ä + k o m i t o l o g i a p ä ä t ö s + k o m i t o l o g i a p ä ä t ö s t ä + k o m i t o l o g i a s o p i m u k s e n + k o m i t o l o g i a s o p i m u s + k o m i t o l o g i a s s a + k o m i t o l o g i a s t a + k o m i t o l o g i a s ä ä n n ö i s t ä + k o m i t o l o g i a s ä ä n n ö k s i ä + k o m i t o l o g i a s ä ä n n ö s t e n + k o m i t o l o g i a s ä ä n t ö j e n + k o m i t o l o g i a s ä ä n t ö j ä + k o m i t o l o g i a t a r k i s t u k s i a + k o m i t o l o g i a t a r k i s t u s + k o m i t o l o g i a t a s o l l a + k o m i t o l o g i a t o i m e n p i t e e t + k o m i t o l o g i a t y ö h ö n + k o m i t o l o g i a u u d i s t u k s e s s a a n + k o m i t o l o g i a u u d i s t u s + k o m i t o l o g i a v a l t u u k s i e n + k o m m a n d o h y ö k k ä y k s e n + k o m m a n d o i s k u a + k o m m a n d o j o u k k o j a + k o m m a n d o y k s i k k ö ä + k o m m e l l u k s i l t a + k o m m e n t e i s s a + k o m m e n t e i s s a n i + k o m m e n t e i s t a + k o m m e n t e i s t a a n + k o m m e n t e i s t a n n e + k o m m e n t i n + k o m m e n t i t + k o m m e n t o i d a + k o m m e n t o i d a a n + k o m m e n t o i d a k s e m m e + k o m m e n t o i d e s s a a n + k o m m e n t o i m a a n + k o m m e n t o i m a t t a + k o m m e n t o i n + k o m m e n t o i s i n + k o m m e n t t e i h i n + k o m m e n t t e j a + k o m m e n t t e j a n i + k o m m e n t t e j a n n e + k o m m e n t t i a + k o m m e n t t i e n + k o m m e n t t i i n + k o m m e n t t i n i + k o m m e n t t i n n e + k o m m u n i k a a t i o j ä r j e s t e l m ä ä + k o m m u n i k a a t i o m a h d o l l i s u u k s i e n + k o m m u n i k a a t i o m u o t o + k o m m u n i k a a t i o s e k t o r i l l a + k o m m u n i k a a t i o s t r a t e g i a + k o m m u n i k a a t i o s t r a t e g i a a n + k o m m u n i k a a t i o t a + k o m m u n i k a a t i o t e k n i i k k a + k o m m u n i k a a t i o t e k n i i k o i t a + k o m m u n i k a a t i o t e k n o l o g i a a n + k o m m u n i k a a t i o t e k n o l o g i a s t a + k o m m u n i k a a t i o v ä l i n e + k o m m u n i k a a t i o v ä l i n e i d e n + k o m m u n i k o i d a + k o m m u n i k o i n t i i n + k o m m u n i k o i n t i k a n a v a n a + k o m m u n i k o i n t i k y k y + k o m m u n i k o i n t i k y k y m m e + k o m m u n i k o i n t i o n g e l m i a + k o m m u n i k o i n t i t a p a a + k o m m u n i k o i t a v a + k o m m u n i s m i a + k o m m u n i s m i h a l l i n t o + k o m m u n i s m i h a l l i n t o a + k o m m u n i s m i i n + k o m m u n i s m i k o k e i l u + k o m m u n i s m i n + k o m m u n i s m i n v a s t a i n e n + k o m m u n i s m i n v a s t a i s e l l a + k o m m u n i s m i n v a s t a i s e n + k o m m u n i s m i n v a s t a i s u u d e n + k o m m u n i s m i n v a s t a i s u u s + k o m m u n i s m i n v a s t a i s u u t t a + k o m m u n i s m i o i k e u d e n k ä y n t i ä + k o m m u n i s m i v u o s i e n + k o m m u n i s t e j a + k o m m u n i s t i a j a n + k o m m u n i s t i a k t i v i s t i + k o m m u n i s t i b l o k i n + k o m m u n i s t i b l o k k i i n + k o m m u n i s t i d i k t a a t t o r i + k o m m u n i s t i d i k t a a t t o r i t + k o m m u n i s t i d i k t a t u u r e i h i n + k o m m u n i s t i d i k t a t u u r e i s t a + k o m m u n i s t i d i k t a t u u r i + k o m m u n i s t i d i k t a t u u r i a + k o m m u n i s t i d i k t a t u u r i e n + k o m m u n i s t i d i k t a t u u r i i n + k o m m u n i s t i d i k t a t u u r i l l e + k o m m u n i s t i d i k t a t u u r i n + k o m m u n i s t i d i k t a t u u r i s s a + k o m m u n i s t i d i k t a t u u r i s t a + k o m m u n i s t i d i k t a t u u r i t + k o m m u n i s t i e n + k o m m u n i s t i h a l l i n n o i s s a + k o m m u n i s t i h a l l i n n o i s t a + k o m m u n i s t i h a l l i n n o l l e + k o m m u n i s t i h a l l i n n o n + k o m m u n i s t i h a l l i n n o s t a + k o m m u n i s t i h a l l i n t o + k o m m u n i s t i h a l l i n t o a + k o m m u n i s t i h a l l i n t o j e n + k o m m u n i s t i h a l l i n t o o n + k o m m u n i s t i h a l l i t u k s e l t a + k o m m u n i s t i h a l l i t u k s e n + k o m m u n i s t i h a l l i t u k s i a + k o m m u n i s t i h a l l i t u k s i l t a + k o m m u n i s t i h a l l i t u s + k o m m u n i s t i h a l l i t u s t a + k o m m u n i s t i j o h t a j a + k o m m u n i s t i j o h t a j a t + k o m m u n i s t i j o h t a j i e n + k o m m u n i s t i j o h t a j i l l e + k o m m u n i s t i j o h t o i s e t + k o m m u n i s t i j o u k o t + k o m m u n i s t i j ä r j e s t e l m i e n + k o m m u n i s t i j ä r j e s t e l m i l l e + k o m m u n i s t i j ä r j e s t e l m ä + k o m m u n i s t i j ä r j e s t e l m ä n + k o m m u n i s t i j ä r j e s t e l m ä ä + k o m m u n i s t i j ä s e n + k o m m u n i s t i j ä s e n e n + k o m m u n i s t i j ä s e n t ä + k o m m u n i s t i k a u d e n + k o m m u n i s t i l i i t o s t a + k o m m u n i s t i l i i t t o l a i s e t + k o m m u n i s t i l u o k a t + k o m m u n i s t i m a a s t a + k o m m u n i s t i m a a t + k o m m u n i s t i m a i d e n + k o m m u n i s t i m a i h i n + k o m m u n i s t i m a i l l e + k o m m u n i s t i m a i s s a + k o m m u n i s t i m a i s t a + k o m m u n i s t i m a i t a + k o m m u n i s t i n e n k i n + k o m m u n i s t i n u o r t e n + k o m m u n i s t i p a r t i s a a n e i l t a + k o m m u n i s t i p r e s i d e n t t i + k o m m u n i s t i p r o p a g a n d a a + k o m m u n i s t i p u o l e n + k o m m u n i s t i p u o l u e + k o m m u n i s t i p u o l u e e l t a + k o m m u n i s t i p u o l u e e n + k o m m u n i s t i p u o l u e e s e e n + k o m m u n i s t i p u o l u e e s t a + k o m m u n i s t i p u o l u e e t + k o m m u n i s t i p u o l u e i d e n + k o m m u n i s t i p u o l u e i s t a + k o m m u n i s t i p u o l u e i t a + k o m m u n i s t i p u o l u e t t a + k o m m u n i s t i p ä ä m i n i s t e r i + k o m m u n i s t i r y h m ä n + k o m m u n i s t i r y h m ä ä n + k o m m u n i s t i s e n + k o m m u n i s t i s i a + k o m m u n i s t i s i i n + k o m m u n i s t i s i s s a + k o m m u n i s t i s t e n + k o m m u n i s t i t + k o m m u n i s t i t o v e r e i l l e e n + k o m m u n i s t i t o v e r i t + k o m m u n i s t i t y r a n n i + k o m m u n i s t i t y r a n n i a a + k o m m u n i s t i v a i n o j e n + k o m m u n i s t i v a i n o t + k o m m u n i s t i v a k o o j a + k o m m u n i s t i v a l l a n + k o m m u n i s t i v a l t i o + k o m m u n i s t i v a l t i o i d e n + k o m m u n i s t i v a l t i o i h i n + k o m m u n i s t i v a l t i o i l l e + k o m m u n i s t i v a l t i o i s s a + k o m m u n i s t i v a l t i o i s t a + k o m m u n i s t i v a l t i o n + k o m m u n i s t i v a l t i o s s a + k o m m u n i s t i v a l t i o t + k o m m u n i s t i v a l t i o t a + k o m m u n i s t i v a n k e j a + k o m m u n i s t i v i r a n o m a i s e t + k o m m u n i s t i v i r a n o m a i s t e n + k o m m u n i s t i y h t e i s ö s t ä + k o m m u n i s t i y s t ä v i i n + k o m o r e i s t a + k o m o r i e n + k o m o r i e n k e r t t u n e n + k o m o r i e n k y y h k y + k o m o r i e n m u s t a b u l b u l i + k o m o r i e n r a s t a s + k o m o r i e n s i n i k y y h k y + k o m p a r a t i i v i s e n + k o m p a s s i m e d u u s a + k o m p a s t e l l a + k o m p a s t u m i s e n + k o m p a s t u s k i v e e n + k o m p a s t u s k i v e k s i + k o m p a s t u s k i v e n + k o m p a s t u s k i v e n ä + k o m p a s t u s k i v e s t ä + k o m p a s t u s k i v e t + k o m p a s t u s k i v e ä + k o m p a s t u s k i v i + k o m p a s t u s k i v i e n + k o m p a s t u s k i v i i n + k o m p a s t u s k i v i s t ä + k o m p a s t u s k i v i ä + k o m p a s t u t t u + k o m p a s t u v a t + k o m p e n s a a t i o k o r v a u k s e n + k o m p e n s a a t i o m ä ä r ä t + k o m p e n s a a t i o s o p i m u s + k o m p e n s a a t i o s t a + k o m p e n s a a t i o v a a t i m u k s i a + k o m p e n s o i m a t t o m i e n + k o m p e n s o i m i s e k s i + k o m p e n s o i t a v a + k o m p e n s o i v i i n + k o m p e t e n s s i a l u e i d e n s a + k o m p i e n g a + k o m p l e k s i k o n j u g a a t t i + k o m p l e k s i k y s y m y s + k o m p l e k s i l l a + k o m p l e k s i l u k u + k o m p l e k s i s u u s t e o r i a + k o m p l e m e n t t i k u l m a t + k o m p l i k a a t i o i s t a + k o m p o n e n t t i e n + k o m p o n e n t t i v a l m i s t a j a t + k o m p o n e n t t i v i d e o + k o m p o n e n t t i v i k a + k o m p o s i i t t i m a t e r i a a l e j a + k o m p o s i i t t i m a t e r i a a l i e n + k o m p o s i i t t i v i d e o + k o m p o s t i k ä y m ä l ä + k o m p o s t o i m a l l a + k o m p o s t o i n t i d i r e k t i i v i n + k o m p o s t o i n t i j ä r j e s t e l m i ä + k o m p o s t o i n t i l a i t o k s e n + k o m p o s t o i t a v a t + k o m p r o m i s s e i h i n + k o m p r o m i s s e i l l a + k o m p r o m i s s e i l l e + k o m p r o m i s s e i n a + k o m p r o m i s s e i s s a + k o m p r o m i s s e i s t a + k o m p r o m i s s e j a + k o m p r o m i s s e j a k i n + k o m p r o m i s s i a + k o m p r o m i s s i a a n + k o m p r o m i s s i a n n e + k o m p r o m i s s i a r t i k l o i s s a + k o m p r o m i s s i a r v i o i t a + k o m p r o m i s s i a s i a k i r j a + k o m p r o m i s s i a s i a k i r j a a + k o m p r o m i s s i a s i a k i r j a a n + k o m p r o m i s s i a s i a k i r j a n + k o m p r o m i s s i a s i a k i r j a s t a + k o m p r o m i s s i d i r e k t i i v i + k o m p r o m i s s i e h d o k a s + k o m p r o m i s s i e h d o t u k s e e n + k o m p r o m i s s i e h d o t u k s e l l a + k o m p r o m i s s i e h d o t u k s e l l a a n + k o m p r o m i s s i e h d o t u k s e l l e + k o m p r o m i s s i e h d o t u k s e m m e + k o m p r o m i s s i e h d o t u k s e n + k o m p r o m i s s i e h d o t u k s e n a + k o m p r o m i s s i e h d o t u k s e n i + k o m p r o m i s s i e h d o t u k s e n n e + k o m p r o m i s s i e h d o t u k s e n s a + k o m p r o m i s s i e h d o t u k s e s s a + k o m p r o m i s s i e h d o t u k s e s s a a n + k o m p r o m i s s i e h d o t u k s e s s a m m e + k o m p r o m i s s i e h d o t u k s e s t a + k o m p r o m i s s i e h d o t u k s e t + k o m p r o m i s s i e h d o t u k s i a + k o m p r o m i s s i e h d o t u k s i i n + k o m p r o m i s s i e h d o t u k s i l l a + k o m p r o m i s s i e h d o t u k s i s s a + k o m p r o m i s s i e h d o t u k s i s t a + k o m p r o m i s s i e h d o t u s + k o m p r o m i s s i e h d o t u s p a k e t t i a + k o m p r o m i s s i e h d o t u s t a + k o m p r o m i s s i e h d o t u s t e n + k o m p r o m i s s i e l e e n ä + k o m p r o m i s s i e n + k o m p r o m i s s i e s i t y k s e e n + k o m p r o m i s s i e s i t y k s e n + k o m p r o m i s s i e s i t y k s e s s ä + k o m p r o m i s s i e s i t y k s e s t ä + k o m p r o m i s s i e s i t y k s e t + k o m p r o m i s s i e s i t y k s i i n + k o m p r o m i s s i e s i t y k s i ä + k o m p r o m i s s i e s i t y s + k o m p r o m i s s i e s i t y s t e n + k o m p r o m i s s i e s i t y s t ä + k o m p r o m i s s i h a k u i s e s t a + k o m p r o m i s s i h a l u a n n e + k o m p r o m i s s i h a l u k a s + k o m p r o m i s s i h a l u k k u u d e n + k o m p r o m i s s i h a l u k k u u d e s t a + k o m p r o m i s s i h a l u k k u u d e s t a a n + k o m p r o m i s s i h a l u k k u u s + k o m p r o m i s s i h a l u k k u u t e e n + k o m p r o m i s s i h a l u k k u u t t a + k o m p r o m i s s i h a n + k o m p r o m i s s i h e n g e n + k o m p r o m i s s i h e n g e s s ä + k o m p r o m i s s i h e n g e s t ä + k o m p r o m i s s i h e n g e s t ä ä n + k o m p r o m i s s i h e n k e e n n e + k o m p r o m i s s i h e n k e ä + k o m p r o m i s s i h e n k i + k o m p r o m i s s i i n + k o m p r o m i s s i j ä r j e s t e l m ä s s ä + k o m p r o m i s s i j ä r j e s t e l y + k o m p r o m i s s i j ä r j e s t e l y l l ä + k o m p r o m i s s i j ä r j e s t e l y n + k o m p r o m i s s i k a n n a n + k o m p r o m i s s i k a n t a + k o m p r o m i s s i k a n t a a + k o m p r o m i s s i k a n t a a n + k o m p r o m i s s i k a n t o j a + k o m p r o m i s s i k e l p o i n e n + k o m p r o m i s s i k o k o n a i s u u s + k o m p r o m i s s i k o k o u k s e s s a + k o m p r o m i s s i k o k o u k s i s s a + k o m p r o m i s s i k o n e i s t o + k o m p r o m i s s i l a i n s ä ä d ä n n ö n + k o m p r o m i s s i l a i n s ä ä d ä n n ö s s ä + k o m p r o m i s s i l a i n s ä ä d ä n t ö a s i a k i r j a + k o m p r o m i s s i l i n j a + k o m p r o m i s s i l i n j a a + k o m p r o m i s s i l i n j a n + k o m p r o m i s s i l l a + k o m p r o m i s s i l l e + k o m p r o m i s s i l u o n n o k s e l l a + k o m p r o m i s s i l u o n n o k s e l l e + k o m p r o m i s s i l u o n n o k s e s t a + k o m p r o m i s s i l u o n n o s + k o m p r o m i s s i l ä h e s t y m i s t a v a n + k o m p r o m i s s i l ä h t ö k o h d a n + k o m p r o m i s s i m a h d o l l i s u u d e n + k o m p r o m i s s i m a l l e j a + k o m p r o m i s s i m e n e t e l m ä + k o m p r o m i s s i m e n e t e l m ä n + k o m p r o m i s s i m e n e t t e l y + k o m p r o m i s s i m e n e t t e l y y n + k o m p r o m i s s i m i e t i n t ö + k o m p r o m i s s i m u u t o k s e n + k o m p r o m i s s i m u u t o s e h d o t u s + k o m p r o m i s s i m ä ä r i t e l m ä + k o m p r o m i s s i m ä ä r ä + k o m p r o m i s s i n + k o m p r o m i s s i n a + k o m p r o m i s s i n e u v o t t e l u i h i n + k o m p r o m i s s i n e u v o t t e l u i l l a + k o m p r o m i s s i n e u v o t t e l u i s s a + k o m p r o m i s s i n e u v o t t e l u j a + k o m p r o m i s s i n e u v o t t e l u j e n + k o m p r o m i s s i n h a l u i s e s t i + k o m p r o m i s s i n l a a d i n n a n + k o m p r o m i s s i n t a r k i s t u k s e n + k o m p r o m i s s i n ä k e m y k s e n + k o m p r o m i s s i p a k e t e i l l a + k o m p r o m i s s i p a k e t i l l a + k o m p r o m i s s i p a k e t i l l e + k o m p r o m i s s i p a k e t i n + k o m p r o m i s s i p a k e t i s s a + k o m p r o m i s s i p a k e t i s t a + k o m p r o m i s s i p a k e t t i + k o m p r o m i s s i p a k e t t i a + k o m p r o m i s s i p a k e t t i e h d o t u k s e e n + k o m p r o m i s s i p a k e t t i i n + k o m p r o m i s s i p a k e t t i n a + k o m p r o m i s s i p o l i t i i k a s t a + k o m p r o m i s s i p o l i t i i k k a a + k o m p r o m i s s i p ä ä t ö k s e n + k o m p r o m i s s i p ä ä t ö s l a u s e l m a + k o m p r o m i s s i p ä ä t ö s l a u s e l m a a + k o m p r o m i s s i p ä ä t ö s l a u s e l m a a m m e + k o m p r o m i s s i p ä ä t ö s l a u s e l m a a n + k o m p r o m i s s i p ä ä t ö s l a u s e l m a e h d o t u s t a + k o m p r o m i s s i p ä ä t ö s l a u s e l m a e s i t y k s e e n + k o m p r o m i s s i p ä ä t ö s l a u s e l m a e s i t y k s e n + k o m p r o m i s s i p ä ä t ö s l a u s e l m a e s i t y k s e s s ä + k o m p r o m i s s i p ä ä t ö s l a u s e l m a e s i t y k s e s t ä + k o m p r o m i s s i p ä ä t ö s l a u s e l m a l l a + k o m p r o m i s s i p ä ä t ö s l a u s e l m a l l e + k o m p r o m i s s i p ä ä t ö s l a u s e l m a l u o n n o k s e n + k o m p r o m i s s i p ä ä t ö s l a u s e l m a n + k o m p r o m i s s i p ä ä t ö s l a u s e l m a s s a + k o m p r o m i s s i p ä ä t ö s l a u s e l m a s s a a n + k o m p r o m i s s i p ä ä t ö s l a u s e l m a s s a m m e + k o m p r o m i s s i p ä ä t ö s l a u s e l m a s t a + k o m p r o m i s s i p ä ä t ö s l a u s e l m i e n + k o m p r o m i s s i p ä ä t ö s l a u s e l m i s s a + k o m p r o m i s s i p ä ä t ö s l a u s e l m i s t a + k o m p r o m i s s i p ä ä t ö s t ä + k o m p r o m i s s i r a t k a i s u + k o m p r o m i s s i r a t k a i s u a + k o m p r o m i s s i r a t k a i s u a m m e + k o m p r o m i s s i r a t k a i s u j a + k o m p r o m i s s i r a t k a i s u j e n + k o m p r o m i s s i r a t k a i s u l l e + k o m p r o m i s s i r a t k a i s u n + k o m p r o m i s s i r a t k a i s u n a + k o m p r o m i s s i r a t k a i s u s s a + k o m p r o m i s s i r a t k a i s u s t a + k o m p r o m i s s i r a t k a i s u t + k o m p r o m i s s i r a t k a i s u u n + k o m p r o m i s s i s o p i m u k s e e n + k o m p r o m i s s i s o p i m u k s e n + k o m p r o m i s s i s o p i m u k s e s s a + k o m p r o m i s s i s o p i m u k s i i n + k o m p r o m i s s i s o p i m u s + k o m p r o m i s s i s o p i m u s t a + k o m p r o m i s s i s s a + k o m p r o m i s s i s s a m m e + k o m p r o m i s s i s t a + k o m p r o m i s s i s t a m m e + k o m p r o m i s s i s u m m a n + k o m p r o m i s s i s u u n n i t e l m a s t a + k o m p r o m i s s i t + k o m p r o m i s s i t a h t o a + k o m p r o m i s s i t a i d o s t a a n + k o m p r o m i s s i t a r j o u s t a + k o m p r o m i s s i t a r k a s t u k s e l l a + k o m p r o m i s s i t a r k a s t u k s i a + k o m p r o m i s s i t a r k a s t u s e h d o t u s + k o m p r o m i s s i t a r k i s t u k s e e n + k o m p r o m i s s i t a r k i s t u k s e k s i + k o m p r o m i s s i t a r k i s t u k s e l l a + k o m p r o m i s s i t a r k i s t u k s e l l e + k o m p r o m i s s i t a r k i s t u k s e n + k o m p r o m i s s i t a r k i s t u k s e n a + k o m p r o m i s s i t a r k i s t u k s e n i + k o m p r o m i s s i t a r k i s t u k s e n n e + k o m p r o m i s s i t a r k i s t u k s e s s a + k o m p r o m i s s i t a r k i s t u k s e s s a a n + k o m p r o m i s s i t a r k i s t u k s e s t a + k o m p r o m i s s i t a r k i s t u k s e t + k o m p r o m i s s i t a r k i s t u k s i a + k o m p r o m i s s i t a r k i s t u k s i a n n e + k o m p r o m i s s i t a r k i s t u k s i i n + k o m p r o m i s s i t a r k i s t u k s i k s i + k o m p r o m i s s i t a r k i s t u k s i l l a + k o m p r o m i s s i t a r k i s t u k s i n + k o m p r o m i s s i t a r k i s t u k s i n a + k o m p r o m i s s i t a r k i s t u k s i n e e n + k o m p r o m i s s i t a r k i s t u k s i s s a + k o m p r o m i s s i t a r k i s t u k s i s s a a n + k o m p r o m i s s i t a r k i s t u k s i s t a + k o m p r o m i s s i t a r k i s t u s + k o m p r o m i s s i t a r k i s t u s e h d o t u k s e n + k o m p r o m i s s i t a r k i s t u s e h d o t u s t a + k o m p r o m i s s i t a r k i s t u s e h d o t u s t e n + k o m p r o m i s s i t a r k i s t u s l u o n n o k s e e n + k o m p r o m i s s i t a r k i s t u s p a k e t i n + k o m p r o m i s s i t a r k i s t u s p a k e t t i + k o m p r o m i s s i t a r k i s t u s p a k e t t i a + k o m p r o m i s s i t a r k i s t u s p a k e t t i i n + k o m p r o m i s s i t a r k i s t u s t a + k o m p r o m i s s i t a r k i s t u s t e n + k o m p r o m i s s i t a s o n + k o m p r o m i s s i t e k s t e i l l e + k o m p r o m i s s i t e k s t e i s s ä + k o m p r o m i s s i t e k s t e j ä + k o m p r o m i s s i t e k s t i + k o m p r o m i s s i t e k s t i e n + k o m p r o m i s s i t e k s t i i n + k o m p r o m i s s i t e k s t i l l ä + k o m p r o m i s s i t e k s t i m m e + k o m p r o m i s s i t e k s t i n + k o m p r o m i s s i t e k s t i n i + k o m p r o m i s s i t e k s t i s s ä + k o m p r o m i s s i t e k s t i s t ä + k o m p r o m i s s i t e k s t i t + k o m p r o m i s s i t e k s t i ä + k o m p r o m i s s i t o i m e n p i d e + k o m p r o m i s s i t u l o k s e n + k o m p r o m i s s i v a l m i i n a + k o m p r o m i s s i v a l m i u d e n + k o m p r o m i s s i v a l m i u d e s t a + k o m p r o m i s s i v a l m i u d e s t a a n + k o m p r o m i s s i v a l m i u s + k o m p r o m i s s i v a l m i u t e n s a + k o m p r o m i s s i v a l m i u t t a + k o m p r o m i s s i v a s t a u s + k o m p r o m i s s i v e r s i o m m e + k o m p r o m i s s i v e r s i o n + k o m p r o m i s s i v e r s i o t a + k o m p r o m i s s i y r i t y k s e n ä + k o m p r o m i s s i y r i t y k s i s t ä + k o n d e n s a a t i o r e a k t i o + k o n d e n s a a t t o r i m i k r o f o n i + k o n d i t i o n a a l i a + k o n d i t i o n a a l i s s a + k o n d i t o r i a t u o t t e e t + k o n d o m i e n + k o n d o m i k i e l t o + k o n d o m i l l a + k o n d o m i p a k k a u s t a + k o n d o r i k o t k a l e g i o o n a + k o n d o r i t + k o n d r o i t i i n i s u l f a a t t i + k o n d u k t a n s s i k v a n t t i + k o n e d i r e k t i i v i + k o n e d i r e k t i i v i i n + k o n e d i r e k t i i v i n + k o n e d i r e k t i i v i s t ä + k o n e d i r e k t i i v i ä + k o n e e l l i s t e t u m p a a + k o n e e n + k o n e e n e l i n + k o n e e n r a k e n n u s a l a n + k o n e e n r a k e n n u s s e k t o r i i n + k o n e e n r a k e n n u s t a + k o n e e n r a k e n n u s t e o l l i s u u d e n + k o n e e s e e n + k o n e e t + k o n e i d e n + k o n e i n s i n ö ö r e j ä + k o n e i n s i n ö ö r i t + k o n e i s t o n + k o n e i s t o s s a + k o n e i s t o s t a + k o n e i t a + k o n e k a n t o j e n + k o n e k i e l i + k o n e k i r j o n t a + k o n e k i v ä ä r e i n + k o n e k i v ä ä r i + k o n e k i v ä ä r i l a u k a u k s i a + k o n e k i v ä ä r i l l ä + k o n e k i v ä ä r i t + k o n e k i v ä ä r i t u l e l l a + k o n e k ä ä n t ä m i n e n + k o n e l u e t t a v i a + k o n e l u o k k a a n + k o n e m e s t a r e i t a + k o n e m e s t a r i + k o n e m i e h i s t ö n + k o n e n ä k ö + k o n e o p p i m i n e n + k o n e p a j a t e o l l i s u u d e n + k o n e p a j a t e o l l i s u u t e e n + k o n e p e l t i e n + k o n e p i s t o o l i + k o n e r i k o i s t a + k o n e t e h o + k o n e t e k n i i k k a + k o n e t e k n i s i s t ä + k o n e t e l e g r a m m i + k o n e t e o l l i s u u d e l l e + k o n e t e o l l i s u u s + k o n e t e o l l i s u u t t a + k o n e t i e t o i s u u s + k o n e t u l i a s e + k o n e t u o t a n n o n + k o n e t u o t a n t o + k o n e t u o t a n t o o n + k o n e t u r v a l l i s u u s + k o n e t y y p p e i h i n + k o n e t y y p p i e n + k o n e u r a k o i t s i j a t + k o n e v a l m i s t u s + k o n e v a l t a + k o n e ä ä n e s t y k s e e n + k o n e ä ä n e s t y k s e l l ä + k o n e ä ä n e s t y k s e n + k o n e ä ä n e s t y k s e n ä + k o n e ä ä n e s t y k s e s s ä + k o n e ä ä n e s t y k s e s t ä + k o n e ä ä n e s t y k s i ä + k o n e ä ä n e s t y s + k o n e ä ä n e s t y s j ä r j e s t e l m ä ä + k o n e ä ä n e s t y s l a i t t e e t + k o n e ä ä n e s t y s t ä + k o n f e d e r a a t i o a r t i k l a t + k o n f e d e r a a t i o n + k o n f e d e r a a t i o r y h m ä + k o n f e d e r a a t i o r y h m ä l t ä + k o n f e d e r a a t i o r y h m ä n + k o n f e d e r a a t i o r y h m ä s s ä + k o n f e d e r a a t i o r y h m ä ä + k o n f e d e r a a t i o r y h m ä ä n + k o n f e r e n s s e i l l e + k o n f e r e n s s e i s s a + k o n f e r e n s s e j a + k o n f e r e n s s i a + k o n f e r e n s s i e d u s t a j a n + k o n f e r e n s s i i n + k o n f e r e n s s i j ä r j e s t e l m ä + k o n f e r e n s s i j ä r j e s t e l m ä n + k o n f e r e n s s i k e r t o m u k s e n + k o n f e r e n s s i k e s k u k s e e n + k o n f e r e n s s i k e s k u k s e s s a + k o n f e r e n s s i k e s k u k s e s t a + k o n f e r e n s s i k e s k u s + k o n f e r e n s s i k o h t e i s t a + k o n f e r e n s s i l l a + k o n f e r e n s s i l l e + k o n f e r e n s s i l t a + k o n f e r e n s s i m a t k a i l u a + k o n f e r e n s s i n + k o n f e r e n s s i o s a n o t t a j a t + k o n f e r e n s s i p a l v e l u u n + k o n f e r e n s s i s a l e j a + k o n f e r e n s s i s o p i m u k s e t + k o n f e r e n s s i s s a + k o n f e r e n s s i s t a + k o n f e r e n s s i t + k o n f e r e n s s i t i l a t + k o n f e r e n s s i t i l o j a + k o n f e r e n s s i v a l m i s t e l u j a + k o n f i r m a a t i o h o l i s m i + k o n f l i k t e i h i n + k o n f l i k t e i s s a + k o n f l i k t e i s t a + k o n f l i k t e j a + k o n f l i k t i a + k o n f l i k t i a i k a n a + k o n f l i k t i a l u e + k o n f l i k t i a l u e e l l a + k o n f l i k t i a l u e e l l e + k o n f l i k t i a l u e e l t a + k o n f l i k t i a l u e e n + k o n f l i k t i a l u e i d e n + k o n f l i k t i a l u e i l l a + k o n f l i k t i a l u e i l l e + k o n f l i k t i a l u e i l t a + k o n f l i k t i a l u e i t a + k o n f l i k t i a l u e t t a + k o n f l i k t i a n a l y y s i n + k o n f l i k t i a s e n t e i d e n + k o n f l i k t i e n + k o n f l i k t i e n e h k ä i s y + k o n f l i k t i e n e h k ä i s y v e r k o s t o a + k o n f l i k t i e n e h k ä i s y v i i k k o + k o n f l i k t i e n e s t o n + k o n f l i k t i e n e s t o s s a + k o n f l i k t i e n e s t ä j ä n ä + k o n f l i k t i h e n k i l ö s t ö l l e + k o n f l i k t i h e r k i n t ä + k o n f l i k t i i n + k o n f l i k t i k y s y m y k s i ä + k o n f l i k t i l i n j a t + k o n f l i k t i l i n j o j a + k o n f l i k t i l ä h t e i t ä + k o n f l i k t i m u o t o j a + k o n f l i k t i n + k o n f l i k t i n a i h e i t a + k o n f l i k t i n e h k ä i s y + k o n f l i k t i n e h k ä i s y l l e + k o n f l i k t i n e h k ä i s y n + k o n f l i k t i n e h k ä i s y p o l i t i i k k a + k o n f l i k t i n e h k ä i s y s s ä + k o n f l i k t i n e h k ä i s y s t ä + k o n f l i k t i n e h k ä i s y t o i m i + k o n f l i k t i n e h k ä i s y v e r k o s t o n + k o n f l i k t i n e h k ä i s y v ä l i n e i d e n + k o n f l i k t i n e h k ä i s y y n + k o n f l i k t i n e h k ä i s y ä + k o n f l i k t i n e s t o + k o n f l i k t i n e s t o a + k o n f l i k t i n e s t o j ä r j e s t e l m ä + k o n f l i k t i n e s t o k e s k u k s e s t a + k o n f l i k t i n e s t o k e s k u s + k o n f l i k t i n e s t o l l a + k o n f l i k t i n e s t o n + k o n f l i k t i n e s t o o n + k o n f l i k t i n e s t o s s a + k o n f l i k t i n e s t o s t a + k o n f l i k t i n e s t o t e h t ä v i i n + k o n f l i k t i n e s t o t e h t ä v i s s ä + k o n f l i k t i n e s t o t o i m i i n + k o n f l i k t i n e s t o t y ö n + k o n f l i k t i n e s t o t y ö s s ä + k o n f l i k t i n e s t o v e r k o s t o n + k o n f l i k t i n h a l l i n n a k s i + k o n f l i k t i n h a l l i n n a n + k o n f l i k t i n h a l l i n t a + k o n f l i k t i n h a l l i n t a a + k o n f l i k t i n h a l l i n t a a n + k o n f l i k t i n h a l l i n t a s t r a t e g i o i t a + k o n f l i k t i n h a l l i n t a u l o t t u v u u d e n + k o n f l i k t i n j ä l k e i s e s s ä + k o n f l i k t i n j ä l k e i s i s s ä + k o n f l i k t i n j ä l k e i s t ä + k o n f l i k t i n l ä h t e e t + k o n f l i k t i n r a t k a i s u + k o n f l i k t i n r a t k a i s u a + k o n f l i k t i n r a t k a i s u m e k a n i s m e i h i n + k o n f l i k t i n r a t k a i s u m e n e t t e l y j ä + k o n f l i k t i n r a t k a i s u n + k o n f l i k t i n r a t k a i s u o h j e l m i a m m e + k o n f l i k t i n r a t k a i s u p r o s e s s i + k o n f l i k t i n r a t k a i s u p r o s e s s i i n + k o n f l i k t i n r a t k a i s u s s a + k o n f l i k t i n r a t k a i s u s t a + k o n f l i k t i n r a t k a i s u t a v o i l l a + k o n f l i k t i n r a t k a i s u u n + k o n f l i k t i n s a + k o n f l i k t i n t o r j u n n a n + k o n f l i k t i n t o r j u n n a s s a + k o n f l i k t i n t o r j u n t a + k o n f l i k t i n t o r j u n t a o p e r a a t i o i d e n + k o n f l i k t i n t o r j u n t a p o l i t i i k k a a + k o n f l i k t i n t o r j u n t a t o i m i i n + k o n f l i k t i n t u t k i j a t + k o n f l i k t i p e s ä k e a l u e e l l a + k o n f l i k t i p e s ä k k e e n ä + k o n f l i k t i p e s ä k k e e t + k o n f l i k t i p e s ä k k e i d e n + k o n f l i k t i p e s ä k k e i s s ä + k o n f l i k t i p e s ä k k e i t ä + k o n f l i k t i r i s k i t + k o n f l i k t i s s a + k o n f l i k t i s t a + k o n f l i k t i s t r a t e g i o i h i n + k o n f l i k t i t + k o n f l i k t i t a p a u k s i a + k o n f l i k t i t e k i j ä n ä + k o n f l i k t i t e o r i a + k o n f l i k t i t i l a n n e + k o n f l i k t i t i l a n t e e n + k o n f l i k t i t i l a n t e e s s a + k o n f l i k t i t i l a n t e e s t a + k o n f l i k t i t i l a n t e e t + k o n f l i k t i t i l a n t e i d e n + k o n f l i k t i t i l a n t e i s i i n + k o n f l i k t i t i l a n t e i s s a + k o n f l i k t i t i l a n t e i s t a + k o n f l i k t i t i l a n t e i t a + k o n f l i k t i t i m a n t i t + k o n f l i k t i t i m a n t t i e n + k o n f l i k t i v a a r a s s a + k o n f l i k t i v a l t i o i s s a + k o n f l i k t i v a l t i o t + k o n f l i k t i v u o s i e n + k o n f l i k t i v y ö h y k k e i l l e + k o n f o r m i s m i s t a + k o n g o j o e n + k o n g o j o k i + k o n g o l a i s e t + k o n g o l a i s i l l e + k o n g o l a i s j o u k o i l l e + k o n g o l a i s l a s t e n + k o n g o l a i s n a i s i a + k o n g o l a i s o s a p u o l i a + k o n g o l a i s t e n + k o n g o n + k o n g o n h a r l e k i i n i + k o n g o n k a h v i + k o n g o n k a i j a + k o n g o n k e r t t u + k o n g o n k e r t t u r a s t a s + k o n g o n k i r v i n e n + k o n g o n k u t o j a + k o n g o n k y y h k y + k o n g o n k ä ä r m e h a u k k a + k o n g o n m e t s ä k e r t t u n e n + k o n g o n m u u r a h a i s r a s t a s + k o n g o n p a l l o k a l a + k o n g o n p a r a t i i s i m o n a r k k i + k o n g o n r i i k i n k u k k o + k o n g o n r u s k o b u l b u l i + k o n g o n t e t r a + k o n g o n t i k k a n e n + k o n g o n t ö p ö k e r t t u n e n + k o n g o n t ö p ö s i e p p o + k o n g o n u u n i l i n t u + k o n g o n v a h a n o k k a + k o n g o n v a r p u s h a u k k a + k o n g o n v i h e r b u l b u l i + k o n g o o n + k o n g o p u n a i n e n + k o n g o s s a + k o n g o s t a + k o n g o t + k o n g r e s s i a + k o n g r e s s i a s i a k i r j o i s s a + k o n g r e s s i e n + k o n g r e s s i i n + k o n g r e s s i j o h t a j i a + k o n g r e s s i k e s k u s + k o n g r e s s i k o h d e + k o n g r e s s i l l e + k o n g r e s s i m a t k a i l u n + k o n g r e s s i n + k o n g r e s s i p u o l u e + k o n g r e s s i s s a + k o n g r e s s i s t a + k o n g r e s s i v a a l e i s s a + k o n g r e s s i v a a l i e n + k o n g r e s s i v a a l i t + k o n g r u e n s s i p e r i a a t t e e n + k o n k r e e t t i s e e n + k o n k r e e t t i s e k s i + k o n k r e e t t i s e l l a + k o n k r e e t t i s e m m a k s i + k o n k r e e t t i s e m m a l l a + k o n k r e e t t i s e m m a n + k o n k r e e t t i s e m m a s t a + k o n k r e e t t i s e m m a t + k o n k r e e t t i s e m m i k s i + k o n k r e e t t i s e m m i l l e + k o n k r e e t t i s e m m i n + k o n k r e e t t i s e m m i s t a + k o n k r e e t t i s e m p a a + k o n k r e e t t i s e m p a a n + k o n k r e e t t i s e m p i + k o n k r e e t t i s e m p i a + k o n k r e e t t i s e m p i e n + k o n k r e e t t i s e m p i i n + k o n k r e e t t i s e n + k o n k r e e t t i s e s s a + k o n k r e e t t i s e s t a + k o n k r e e t t i s e t + k o n k r e e t t i s i a + k o n k r e e t t i s i i n + k o n k r e e t t i s i k s i + k o n k r e e t t i s i l l a + k o n k r e e t t i s i l l e + k o n k r e e t t i s i m m i l l a a n + k o n k r e e t t i s i m m i n + k o n k r e e t t i s i m m i s s a + k o n k r e e t t i s i m m i s t a + k o n k r e e t t i s i m p a a n + k o n k r e e t t i s i m p i a + k o n k r e e t t i s i n + k o n k r e e t t i s i n a + k o n k r e e t t i s i s s a + k o n k r e e t t i s i s t a + k o n k r e e t t i s t e n + k o n k r e e t t i s u u d e n + k o n k r e t i a a + k o n k r e t i a a n + k o n k r e t i a n + k o n k r e t i s o i d a + k o n k r e t i s o i d a a n + k o n k r e t i s o i d a k s e m m e + k o n k r e t i s o i m a a n + k o n k r e t i s o i m i n e n + k o n k r e t i s o i m i s e k s i + k o n k r e t i s o i m i s e s s a + k o n k r e t i s o i n t i a + k o n k r e t i s o i t a v a + k o n k r e t i s o i t i i n + k o n k r e t i s o i t u a + k o n k r e t i s o i t u i + k o n k r e t i s o i t u m i s e n + k o n k r e t i s o i t u m i s t a + k o n k r e t i s o i t u n e e t + k o n k r e t i s o i t u n u t + k o n k r e t i s o i t u u + k o n k r e t i s o i t u v a t + k o n k u r s s e j a + k o n k u r s s i a + k o n k u r s s i a a l l o n + k o n k u r s s i a a l t o + k o n k u r s s i a a l t o o n + k o n k u r s s i a l t t i i t a + k o n k u r s s i e n + k o n k u r s s i h a k e m u k s e n + k o n k u r s s i i n + k o n k u r s s i j ä r j e s t e l m ä + k o n k u r s s i l a i n s ä ä d ä n n ö l l ä + k o n k u r s s i l a i n s ä ä d ä n n ö n + k o n k u r s s i l a i n s ä ä d ä n n ö s s ä + k o n k u r s s i l a i n s ä ä d ä n t ö + k o n k u r s s i l a i n s ä ä d ä n t ö ä + k o n k u r s s i l a i n s ä ä d ä n t ö ö n + k o n k u r s s i l a i t + k o n k u r s s i l t a + k o n k u r s s i m e k a n i s m i n + k o n k u r s s i m e n e t t e l y s s ä + k o n k u r s s i n + k o n k u r s s i o i k e u t t a + k o n k u r s s i p a n k k e i h i n + k o n k u r s s i p a n k k i e n + k o n k u r s s i p e s ä + k o n k u r s s i r a h a s t o a + k o n k u r s s i r a h a s t o l l e + k o n k u r s s i r i s k i l l e + k o n k u r s s i s t a + k o n k u r s s i s u o j a a + k o n k u r s s i t + k o n k u r s s i t a p a u k s e s s a + k o n k u r s s i t a p a u k s i s s a + k o n k u r s s i v a k u u t u k s e s t a + k o n n a k o p l a + k o n n a k ä r p ä n e n + k o n n a m o n n i + k o n n a n + k o n n a n l e i n i k k i + k o n n a n l i e k o + k o n n a n t ä d y k e + k o n n a n u l p u k k a + k o n n a t + k o n n u n l a h t i + k o n s e n s u k s e n + k o n s e n s u s a r v o j e n + k o n s e n s u s a s i a k i r j a + k o n s e n s u s a s i a k i r j a l l a + k o n s e n s u s a s i a k i r j a n + k o n s e n s u s e f e k t i + k o n s e n s u s e h d o t u s + k o n s e n s u s h a l l i t u k s e n + k o n s e n s u s h a l l i t u s + k o n s e n s u s h e n k e ä + k o n s e n s u s k r i i s i i n + k o n s e n s u s k u l t t u u r i + k o n s e n s u s k y k y i s e k s i + k o n s e n s u s m i e t i n n ö s s ä + k o n s e n s u s o h j e l m a + k o n s e n s u s p e r i a a t e + k o n s e n s u s p e r i a a t t e e n + k o n s e n s u s p o h j a i s e n + k o n s e n s u s p o h j a i s i i n + k o n s e n s u s p o l i t i i k a n + k o n s e n s u s p r e s i d e n t i n + k o n s e n s u s p ä ä m i n i s t e r i n + k o n s e n s u s s ä ä n t ö + k o n s e n s u s t a + k o n s e n s u s t e k s t i + k o n s e n s u s t e k s t i n + k o n s e n s u s t e k s t i s t ä + k o n s e n s u s t e k s t i ä + k o n s e n s u s t y ö t ä + k o n s e n s u s v a a t i m u s + k o n s e p t e j a + k o n s e p t i a l b u m i + k o n s e p t i a u t o + k o n s e p t i a u t o j a a n + k o n s e p t i o t a + k o n s e r n e i l l e + k o n s e r n e i l t a + k o n s e r n e i s s a + k o n s e r n e j a + k o n s e r n i e n + k o n s e r n i l o b b a a j a + k o n s e r n i m a l l i + k o n s e r n i n + k o n s e r n i n s i s ä i s i ä + k o n s e r n i r a k e n t e i d e n + k o n s e r n i s t a + k o n s e r n i t + k o n s e r n i t a s o l l a + k o n s e r n i y h t i ö n + k o n s e r t t i h a l l e i s t a + k o n s e r t t i k e s k u s + k o n s e r t t i k i e r t u e i s t a + k o n s e r t t i p i a n i s t i e n + k o n s e r t t i s a l e i s s a + k o n s e r t t i s a l i a + k o n s e r t t i t a l o + k o n s e r t t i t i l o j a + k o n s e r v a t i i v e i h i n + k o n s e r v a t i i v e j a + k o n s e r v a t i i v i e d u s t a j i e n + k o n s e r v a t i i v i e h d o k k a a m m e + k o n s e r v a t i i v i e n + k o n s e r v a t i i v i h a l l i n n o n + k o n s e r v a t i i v i h a l l i n t o + k o n s e r v a t i i v i h a l l i t u k s e l t a + k o n s e r v a t i i v i h a l l i t u k s e n + k o n s e r v a t i i v i h a l l i t u k s e s s a + k o n s e r v a t i i v i h a l l i t u k s e t + k o n s e r v a t i i v i h a l l i t u s + k o n s e r v a t i i v i h a l l i t u s t a + k o n s e r v a t i i v i j o h t a j a + k o n s e r v a t i i v i j o h t o i n e n + k o n s e r v a t i i v i j ä s e n + k o n s e r v a t i i v i j ä s e n e n + k o n s e r v a t i i v i j ä s e n e t + k o n s e r v a t i i v i j ä s e n i s t ä + k o n s e r v a t i i v i j ä s e n i ä + k o n s e r v a t i i v i j ä s e n t e n + k o n s e r v a t i i v i j ä s e n t ä + k o n s e r v a t i i v i k o l l e g a l l e n i + k o n s e r v a t i i v i k o l l e g a l t a a n + k o n s e r v a t i i v i k o l l e g a m m e + k o n s e r v a t i i v i k o l l e g a n i + k o n s e r v a t i i v i k o l l e g o i d e n i + k o n s e r v a t i i v i k o l l e g o i s t a n i + k o n s e r v a t i i v i k o l l e g o i t a m m e + k o n s e r v a t i i v i k o l l e g o j e n i + k o n s e r v a t i i v i l i b e r a a l i n a + k o n s e r v a t i i v i l t a + k o n s e r v a t i i v i m i n i s t e r i e n + k o n s e r v a t i i v i n a + k o n s e r v a t i i v i p o l i i t i k o t + k o n s e r v a t i i v i p u o l u e + k o n s e r v a t i i v i p u o l u e e l l a + k o n s e r v a t i i v i p u o l u e e l l e + k o n s e r v a t i i v i p u o l u e e n + k o n s e r v a t i i v i p u o l u e e s e e n + k o n s e r v a t i i v i p u o l u e e s s a + k o n s e r v a t i i v i p u o l u e e s t a + k o n s e r v a t i i v i p u o l u e e t + k o n s e r v a t i i v i p u o l u e i d e n + k o n s e r v a t i i v i p u o l u e i s t a + k o n s e r v a t i i v i p u o l u e t t a + k o n s e r v a t i i v i p ä ä m i n i s t e r i + k o n s e r v a t i i v i p ä ä m i n i s t e r i n + k o n s e r v a t i i v i p ä ä m i n i s t e r i ä + k o n s e r v a t i i v i r y h m i e n + k o n s e r v a t i i v i r y h m ä + k o n s e r v a t i i v i r y h m ä n + k o n s e r v a t i i v i r y h m ä t + k o n s e r v a t i i v i r y h m ä ä + k o n s e r v a t i i v i r y h m ä ä n + k o n s e r v a t i i v i s e m m a t + k o n s e r v a t i i v i s e m p a a + k o n s e r v a t i i v i s e m p i + k o n s e r v a t i i v i s e m p i a + k o n s e r v a t i i v i s e m p i e n + k o n s e r v a t i i v i s e n + k o n s e r v a t i i v i s e t + k o n s e r v a t i i v i s i a + k o n s e r v a t i i v i s i m p i a + k o n s e r v a t i i v i s i m p i e n + k o n s e r v a t i i v i t + k o n s e r v a t i i v i t a h o j e n + k o n s e r v a t i i v i v a l t u u s k u n t a + k o n s e r v a t i i v i y s t ä v i e m m e + k o n s e r v a t i i v i y s t ä v i l l e e n + k o n s e r v a t i i v i y s t ä v i l l e m m e + k o n s e r v a t i i v i y s t ä v ä ä n i + k o n s e r v a t i s m i n + k o n s o l i d o i d a + k o n s o l i d o i d a k s e e n + k o n s o l i d o i d u s t a + k o n s o l i d o i n t i a + k o n s o l i d o i n t i m e k a n i s m e j a + k o n s o l i d o i n t i m e n e t t e l y + k o n s o l i d o i n t i p o l i t i i k k a a + k o n s o l i d o i t u a + k o n s o l i d o i t u i h i n + k o n s o l i s o t a + k o n s t a n t i n + k o n s t i t u e n t t i a n a l y y s i + k o n s t r u k t i o k i e l i o p p i + k o n s t r u k t i o t e h t ä v ä + k o n s u l a a t i s t a + k o n s u l a a t t i a + k o n s u l a a t t i p a l v e l u i d e n + k o n s u l e i s t a + k o n s u l i a p u + k o n s u l i a p u a + k o n s u l i a p u u n + k o n s u l i a s i a t + k o n s u l i a s i o i h i n + k o n s u l i a s i o i s t a + k o n s u l i a s i o i t a + k o n s u l i a v u s t a + k o n s u l i e d u s t u s + k o n s u l i e d u s t u s t o + k o n s u l i e d u s t u s t o j e n + k o n s u l i e d u s t u s t o l l e + k o n s u l i e d u s t u s t o n + k o n s u l i e d u s t u s t o t + k o n s u l i j ä r j e s t e l m ä ä + k o n s u l i o h j e i s s a + k o n s u l i o h j e i s t o + k o n s u l i o h j e i s t o a + k o n s u l i o h j e i s t o i h i n + k o n s u l i o h j e i s t o n + k o n s u l i o h j e i s t o o n + k o n s u l i o h j e i s t o s s a + k o n s u l i o h j e i s t o s t a + k o n s u l i o s a s t o l l a + k o n s u l i p a l v e l u j a + k o n s u l i p a l v e l u j e n + k o n s u l i p a l v e l u t + k o n s u l i s u h t e i s s a + k o n s u l i s u h t e i s t a + k o n s u l i s u h t e i t a + k o n s u l i s u o j e l u a + k o n s u l i s u o j e l u u n + k o n s u l i t e h t ä v i ä + k o n s u l i t o i m i n t o j a + k o n s u l i t o i m i n t o j e n + k o n s u l i v e r k o s t o j e n + k o n s u l i v i r a n o m a i s e n + k o n s u l i v i r a n o m a i s e t + k o n s u l i v i r a n o m a i s i i n + k o n s u l i v i r a n o m a i s i l t a + k o n s u l i v i r a n o m a i s t e n + k o n s u l i v i r a n o m a i s t e n s a + k o n s u l i v i r a s t o j a + k o n s u l i v i r a s t o j e n + k o n s u l i y h t e i s t y ö n + k o n s u l i y h t e i s t y ö t ä + k o n s u l t a a t i o k i e r r o k s e m m e + k o n s u l t a a t i o r y h m ä t + k o n s u l t i n + k o n s u l t o i m a a n + k o n s u l t o i m a t t a + k o n s u l t o i n n i s t a + k o n s u l t o i n t i a + k o n s u l t o i n t i j ä r j e s t e l m i e n + k o n s u l t o i n t i k o m i t e a s s a + k o n s u l t o i n t i k u l u j a + k o n s u l t o i n t i m a t k o j a + k o n s u l t o i n t i p r o s e s s i n + k o n s u l t o i n t i p u i t t e i t a + k o n s u l t o i n t i y r i t y k s e n + k o n s u l t o i n t i y r i t y k s e t + k o n s u l t t i p a l k k i o t + k o n s u l t t i p a l v e l u j e n + k o n s u l t t i s e l v i t y k s e e n + k o n s u l t t i s e l v i t y s + k o n s u l t t i s o p i m u k s e n + k o n s u l t t i s o p i m u k s i a + k o n s u l t t i t o i m i s t o + k o n s u l t t i t o i m i s t o t + k o n s u l t t i t u t k i m u s + k o n s u l t t i y r i t y k s e l l e + k o n s u l t t i y r i t y k s e l t ä + k o n s u l t t i y r i t y k s e n + k o n s u l t t i y r i t y k s i l l e + k o n s u l t t i y r i t y s t e n + k o n t a k t i i n + k o n t a k t i l a j i + k o n t a k t i m e n e t e l m ä + k o n t a k t i m u o v i + k o n t a k t i r y h m ä + k o n t a k t i r y h m ä n + k o n t a k t i r y h m ä s s ä + k o n t a k t i r y h m ä s t ä + k o n t a k t i r y h m ä ä + k o n t a k t i r y h m ä ä n + k o n t e i s s a + k o n t e k s t i i n s a + k o n t e k s t i s t a + k o n t i n u u m i h y p o t e e s i + k o n t i t + k o n t r o l l i a + k o n t r o l l i j ä r j e s t e l m i ä + k o n t r o l l i k o m i t e a + k o n t r o l l i l i n j a n + k o n t r o l l i m e k a n i s m e j a + k o n t r o l l i m e n e t t e l y t + k o n t r o l l i r y h m ä ä + k o n t r o l l i t o i m e n p i t e i t ä + k o n t r o l l i y h t e i s k u n t a + k o n t r o l l o i d a + k o n t r o l l o i m i s e k s i + k o n t r o l l o i m i s e s t a + k o n t r o l l o i n t i k e i n o j a + k o n t r o l l o i t u a + k o n t r o l l o i v a t + k o n t t e i h i n + k o n t t i a + k o n t t i a l a n + k o n t t i a l u k s e t + k o n t t i a l u k s i s t a + k o n t t i a l u s + k o n t t i a l u s s a t a m a n + k o n t t i a l u s t e n + k o n t t i a s e m a t + k o n t t i k u l j e t u k s e t + k o n t t i k u l j e t u k s i a + k o n t t i l i i k e n n e + k o n t t i l i i k e n t e e l l e + k o n t t i l i i k e n t e e s s ä + k o n t t i p i n o j e n + k o n t t i r a h d i n + k o n t t i s a t a m a + k o n t t i t e r m i n a a l i t + k o n t t i t u r v a l l i s u u s a l o i t t e e s t a + k o n t t o r e i s s a + k o n t t o r e i s t a + k o n t t o r i r a k e n n u k s i a + k o n t t o r i r o t a t + k o n t u k i m a l a i n e n + k o n v e n t t i m e t o d i a + k o n v e r g e n s s i a l u e i t a + k o n v e r g e n s s i a n a l y y s e j ä + k o n v e r g e n s s i k r i t e e r e i h i n + k o n v e r g e n s s i k r i t e e r e i l l e + k o n v e r g e n s s i k r i t e e r e i s t ä + k o n v e r g e n s s i k r i t e e r e i t ä + k o n v e r g e n s s i k r i t e e r i e n + k o n v e r g e n s s i k r i t e e r i t + k o n v e r g e n s s i o h j e l m i a + k o n v e r g e n s s i s t a + k o n v e r g e n s s i t a v o i t e a l u e i n a + k o n v e r g e n s s i v a a t i m u k s i e n + k o n v e r s i o h a n k k e i s i i n + k o n v e r s i o h ä i r i ö + k o n v e r s i o t o i m e t + k o n v e r s i o t u t k i m u k s e e n + k o o d a a m a t t o m a t + k o o d a u k s e e n + k o o d a u s j ä r j e s t e l m ä + k o o d a u s j ä r j e s t e l m ä l l e + k o o d a u s j ä r j e s t e l m ä n + k o o d a u s j ä r j e s t e l m ä s t ä + k o o d a u s t a p o j a + k o o d a u s t e o r i a + k o o d e k s i l l a + k o o d e k s i l u o n n o k s e n + k o o d e k s i m a l l i + k o o d e k s i s s a + k o o d i a + k o o d i a h a n + k o o d i a v a i n t e n + k o o d i j ä r j e s t e l m ä + k o o d i k i e l e l l ä + k o o d i k i e l i n e n + k o o d i n i m e l t ä ä n + k o o d i n i m e t + k o o d i n i m i + k o o d i n u m e r o i l l a + k o o d i n u m e r o t + k o o d i n v a i h t o + k o o k o s k u t o j a + k o o k o s l u r i + k o o k o s m a i t o + k o o k o s p a l m u j a + k o o k o s r a p u + k o o k o s s a a r e n s i r k k u + k o o k o s s a a r e t + k o o k o s s a a r i + k o o k o s ö l j y + k o o k o s ö l j y l l ä + k o o l t a a n + k o o m i s e l t a + k o o n n u t + k o o r d i n a a t i o e l i n + k o o r d i n a a t i o j ä r j e s t e l m ä + k o o r d i n a a t i o j ä r j e s t e l m ä ä + k o o r d i n a a t i o k e s k u k s e l l e + k o o r d i n a a t i o k e s k u k s e n + k o o r d i n a a t i o k o k o u k s e e n + k o o r d i n a a t i o k o k o u k s i s t a + k o o r d i n a a t i o k o m i t e a n + k o o r d i n a a t i o m a h d o l l i s u u k s i a + k o o r d i n a a t i o m e k a n i s m e j a + k o o r d i n a a t i o m e k a n i s m i n + k o o r d i n a a t i o m e n e t e l m i e n + k o o r d i n a a t i o m e n e t e l m ä + k o o r d i n a a t i o m e n e t e l m ä l l ä + k o o r d i n a a t i o m e n e t e l m ä n + k o o r d i n a a t i o m e n e t e l m ä ä + k o o r d i n a a t i o m e n e t e l m ä ä n + k o o r d i n a a t i o m e n e t t e l y j e n + k o o r d i n a a t i o m e n e t t e l y ä + k o o r d i n a a t i o p i s t e e n ä + k o o r d i n a a t i o p o l i t i i k k o j e n + k o o r d i n a a t i o p r o s e s s i + k o o r d i n a a t i o p r o s e s s i i n + k o o r d i n a a t i o p r o s e s s i n + k o o r d i n a a t i o p r o s e s s i s s a + k o o r d i n a a t i o r a k e n t e e s t a + k o o r d i n a a t i o s i d o s + k o o r d i n a a t i o s t a + k o o r d i n a a t i o s u u n n i t e l m i a + k o o r d i n a a t i o t a + k o o r d i n a a t i o t e h t ä v ä + k o o r d i n a a t i o t o i m i i n + k o o r d i n a a t i o v i r a s t o s t a + k o o r d i n a a t t i j ä r j e s t e l m ä + k o o r d i n a a t t i m i t t a u s k o n e + k o o r d i n a a t t o r e i l l e + k o o r d i n a a t t o r e i l t a + k o o r d i n a a t t o r e i t a + k o o r d i n a a t t o r i a + k o o r d i n a a t t o r i e n + k o o r d i n a a t t o r i k o l l e g a a n i + k o o r d i n a a t t o r i k o l l e g a n i + k o o r d i n a a t t o r i k s i + k o o r d i n a a t t o r i l l e + k o o r d i n a a t t o r i m m e + k o o r d i n a a t t o r i n + k o o r d i n a a t t o r i n a + k o o r d i n a a t t o r i n s a + k o o r d i n a a t t o r i s t a + k o o r d i n a a t t o r i t + k o o r d i n o i d a + k o o r d i n o i d a a n + k o o r d i n o i d a a n k o + k o o r d i n o i d a k s e e n + k o o r d i n o i d a k s e m m e + k o o r d i n o i d u i m p i e n + k o o r d i n o i d u i n + k o o r d i n o i d u i s s a + k o o r d i n o i d u i s t a + k o o r d i n o i d u l l a + k o o r d i n o i d u l l e + k o o r d i n o i d u m m a l l a + k o o r d i n o i d u m m a n + k o o r d i n o i d u m m a s t a + k o o r d i n o i d u m m i n + k o o r d i n o i d u m p a a + k o o r d i n o i d u m p i + k o o r d i n o i d u m p i a + k o o r d i n o i d u n + k o o r d i n o i d u s t a + k o o r d i n o i j a n + k o o r d i n o i j a n a + k o o r d i n o i m a a n + k o o r d i n o i m a l l a + k o o r d i n o i m a s s a + k o o r d i n o i m a t o n + k o o r d i n o i m a t o n t a + k o o r d i n o i m a t t o m i e n + k o o r d i n o i m a t t o m i l l a + k o o r d i n o i m i s e k s i + k o o r d i n o i n n i n + k o o r d i n o i n n i s s a + k o o r d i n o i n n i s t a + k o o r d i n o i n t i a + k o o r d i n o i n t i a l o i t t e e t + k o o r d i n o i n t i a s e m a a + k o o r d i n o i n t i a s e t u k s e s s a + k o o r d i n o i n t i a s e t u s + k o o r d i n o i n t i a s e t u s t a + k o o r d i n o i n t i a s i o i s s a + k o o r d i n o i n t i a v u n + k o o r d i n o i n t i e l i m e l l e + k o o r d i n o i n t i e l i m e n + k o o r d i n o i n t i e l i m e n ä + k o o r d i n o i n t i e l i m e s s ä + k o o r d i n o i n t i e l i n + k o o r d i n o i n t i i n + k o o r d i n o i n t i j a k s o n + k o o r d i n o i n t i j ä r j e s t e l m i ä + k o o r d i n o i n t i j ä r j e s t e l m i ä m m e + k o o r d i n o i n t i j ä r j e s t e l m ä + k o o r d i n o i n t i j ä r j e s t e l m ä m m e + k o o r d i n o i n t i j ä r j e s t e l m ä n + k o o r d i n o i n t i j ä r j e s t e l m ä s t ä + k o o r d i n o i n t i j ä r j e s t e l m ä ä + k o o r d i n o i n t i j ä r j e s t e l m ä ä n + k o o r d i n o i n t i j ä r j e s t e l y j ä + k o o r d i n o i n t i k a u s i + k o o r d i n o i n t i k e h y s + k o o r d i n o i n t i k e s k u k s e n + k o o r d i n o i n t i k e s k u k s e t + k o o r d i n o i n t i k e s k u k s i a + k o o r d i n o i n t i k e s k u k s i s t a + k o o r d i n o i n t i k e s k u s + k o o r d i n o i n t i k e s k u s t e n + k o o r d i n o i n t i k i n + k o o r d i n o i n t i k o k o u k s i i n + k o o r d i n o i n t i k o k o u s t e n + k o o r d i n o i n t i k o m i t e a + k o o r d i n o i n t i k o m i t e a a n + k o o r d i n o i n t i k o m i t e a n + k o o r d i n o i n t i k o m i t e a s s a + k o o r d i n o i n t i k y k y ä + k o o r d i n o i n t i k y s y m y k s i s s ä + k o o r d i n o i n t i k y s y m y s + k o o r d i n o i n t i k y v y t + k o o r d i n o i n t i k y v y t t ö m y y d e n + k o o r d i n o i n t i k ä y t ä n n ö s s ä + k o o r d i n o i n t i m a h d o l l i s u u d e t + k o o r d i n o i n t i m a h d o l l i s u u k s i a + k o o r d i n o i n t i m a h d o l l i s u u k s i e m m e + k o o r d i n o i n t i m a h d o l l i s u u s + k o o r d i n o i n t i m a h d o l l i s u u t t a + k o o r d i n o i n t i m e k a n i s m e j a + k o o r d i n o i n t i m e k a n i s m i + k o o r d i n o i n t i m e k a n i s m i a + k o o r d i n o i n t i m e k a n i s m i e n + k o o r d i n o i n t i m e k a n i s m i i n + k o o r d i n o i n t i m e k a n i s m i n + k o o r d i n o i n t i m e k a n i s m i t + k o o r d i n o i n t i m e n e t e l m i e n + k o o r d i n o i n t i m e n e t e l m i i n + k o o r d i n o i n t i m e n e t e l m i n ä + k o o r d i n o i n t i m e n e t e l m i s t ä + k o o r d i n o i n t i m e n e t e l m i ä + k o o r d i n o i n t i m e n e t e l m i ä m m e + k o o r d i n o i n t i m e n e t e l m ä + k o o r d i n o i n t i m e n e t e l m ä l l ä + k o o r d i n o i n t i m e n e t e l m ä n + k o o r d i n o i n t i m e n e t e l m ä s s ä + k o o r d i n o i n t i m e n e t e l m ä s t ä + k o o r d i n o i n t i m e n e t e l m ä ä + k o o r d i n o i n t i m e n e t e l m ä ä n + k o o r d i n o i n t i m e n e t t e l y + k o o r d i n o i n t i m e n e t t e l y i h i n + k o o r d i n o i n t i m e n e t t e l y i s t ä + k o o r d i n o i n t i m e n e t t e l y j e n + k o o r d i n o i n t i m e n e t t e l y j ä + k o o r d i n o i n t i m e n e t t e l y l l ä + k o o r d i n o i n t i m e n e t t e l y n + k o o r d i n o i n t i m e n e t t e l y s t ä + k o o r d i n o i n t i m e n e t t e l y t + k o o r d i n o i n t i m e n e t t e l y ä + k o o r d i n o i n t i m e t o d e j a + k o o r d i n o i n t i m e t o d i l l a + k o o r d i n o i n t i m u o t o + k o o r d i n o i n t i n e u v o s t o n + k o o r d i n o i n t i n i m i t t ä j ä t + k o o r d i n o i n t i o h j e l m a a n + k o o r d i n o i n t i o n g e l m a s t a + k o o r d i n o i n t i o n g e l m i a + k o o r d i n o i n t i p i s t e e t + k o o r d i n o i n t i p i s t e i d e n + k o o r d i n o i n t i p o l i t i i k a n + k o o r d i n o i n t i p o l i t i i k k a + k o o r d i n o i n t i p o n n i s t e l u j e n + k o o r d i n o i n t i p r o s e s s i + k o o r d i n o i n t i p r o s e s s i a + k o o r d i n o i n t i p r o s e s s i i n + k o o r d i n o i n t i p r o s e s s i n + k o o r d i n o i n t i p y r k i m y k s i ä + k o o r d i n o i n t i r a k e n n e + k o o r d i n o i n t i r a k e n t e e n + k o o r d i n o i n t i r a k e n t e e s s a + k o o r d i n o i n t i r a k e n t e e t + k o o r d i n o i n t i r a k e n t e i d e n + k o o r d i n o i n t i r o o l i + k o o r d i n o i n t i r o o l i n s a + k o o r d i n o i n t i r o o l i s t a + k o o r d i n o i n t i r y h m i e n + k o o r d i n o i n t i r y h m i l l e + k o o r d i n o i n t i r y h m ä + k o o r d i n o i n t i r y h m ä n + k o o r d i n o i n t i r y h m ä ä + k o o r d i n o i n t i s t r a t e g i a l l a + k o o r d i n o i n t i s t r a t e g i o i h i n + k o o r d i n o i n t i s u u n n i t e l m a a + k o o r d i n o i n t i s u u n n i t e l m a n + k o o r d i n o i n t i s ä ä n n ö t + k o o r d i n o i n t i t a p a a + k o o r d i n o i n t i t a p o j a + k o o r d i n o i n t i t a r p e e n + k o o r d i n o i n t i t a r p e e s t a + k o o r d i n o i n t i t a r p e i t a + k o o r d i n o i n t i t a r v e t t a + k o o r d i n o i n t i t a s o + k o o r d i n o i n t i t e h t ä v i e n + k o o r d i n o i n t i t e h t ä v i i n + k o o r d i n o i n t i t e h t ä v i s t ä + k o o r d i n o i n t i t e h t ä v i ä + k o o r d i n o i n t i t e h t ä v ä + k o o r d i n o i n t i t e h t ä v ä n + k o o r d i n o i n t i t e h t ä v ä n s ä + k o o r d i n o i n t i t e h t ä v ä s t ä + k o o r d i n o i n t i t e h t ä v ä ä + k o o r d i n o i n t i t e h t ä v ä ä n s ä + k o o r d i n o i n t i t o i m e n p i t e e t + k o o r d i n o i n t i t o i m e t + k o o r d i n o i n t i t o i m i a + k o o r d i n o i n t i t o i m i e n + k o o r d i n o i n t i t o i m i i n + k o o r d i n o i n t i t o i m i n t o a + k o o r d i n o i n t i t o i m i s t a + k o o r d i n o i n t i t o i m i s t o + k o o r d i n o i n t i t u k e a + k o o r d i n o i n t i t y ö h ö n + k o o r d i n o i n t i t y ö m m e + k o o r d i n o i n t i t y ö n + k o o r d i n o i n t i t y ö s t ä + k o o r d i n o i n t i t y ö t ä + k o o r d i n o i n t i v a i h e + k o o r d i n o i n t i v a i k e u k s i e n + k o o r d i n o i n t i v a j e e n + k o o r d i n o i n t i v a l m i u k s i e n + k o o r d i n o i n t i v a l t a + k o o r d i n o i n t i v e l v o l l i s u u t e n s a + k o o r d i n o i n t i v e r k o s t o + k o o r d i n o i n t i v e r k o s t o n + k o o r d i n o i n t i v i r a s t o + k o o r d i n o i n t i v i r a s t o a + k o o r d i n o i n t i v ä l i n e + k o o r d i n o i n t i v ä l i n e e k s i + k o o r d i n o i n t i v ä l i n e e n + k o o r d i n o i n t i v ä l i n e i d e n + k o o r d i n o i n t i v ä l i n e i t ä + k o o r d i n o i n t i v ä l i n e i t ä m m e + k o o r d i n o i n t i v ä l i n e t t ä + k o o r d i n o i n t i y h t e i s t y ö t ä + k o o r d i n o i n t i y k s i k k ö + k o o r d i n o i n t i y k s i k k ö n ä + k o o r d i n o i n t i y k s i k ö l t ä + k o o r d i n o i n t i y k s i k ö n + k o o r d i n o i n t i y k s i k ö t + k o o r d i n o i t a e s s a + k o o r d i n o i t a v a + k o o r d i n o i t t e k o + k o o r d i n o i t u a + k o o r d i n o i t u i h i n + k o o r d i n o i t u j a + k o o r d i n o i t u j e n + k o o r d i n o i t u n a + k o o r d i n o i t u u n + k o o r d i n o i v a n + k o o r d i n o i v a n a + k o o s t e m e r k k i + k o o s t e t t a v a + k o o s t u i p a + k o o s t u m u k s e n + k o o s t u t t a v a + k o o s t u u + k o o s t u v a + k o o s t u v a n + k o o t a + k o o t a a n + k o o t a a n k o + k o o t e s s a a n + k o o t e s s a n n e + k o o t t a i s i i n + k o o t t a v a + k o o t t a v a a + k o o t t a v a s t a + k o o t t i i n + k o o t t u a + k o o t t u j e n + k o p e a n a + k o p i o i d a + k o p i o i n t i m a k s u j e n + k o p i o i n t i o i k e u k s i e n + k o p i o i n t i o i k e u t t a + k o p i o i n t i p a l v e l u i s s a + k o p i o i n t i s u o j a n + k o p i o i n t i t o i m i a + k o p i o i n u t + k o p i o i t a + k o p i o k o n e h u o n e e s e e n + k o p i o k y n ä + k o p i o l ä ä k k e e t + k o p i o n + k o p i o n a + k o p i o n s a + k o p i o s u o j a d i r e k t i i v i + k o p i o s u o j a l a k i a + k o p p e l o k ä ä p ä + k o p p i s i e m e n i s e t + k o p t i k i r k k o a + k o p t i k i r k o n + k o p t i k r i s t i t t y i h i n + k o p t i k r i s t i t t y j e n + k o p t i k r i s t i t t y j ä + k o p t i k r i s t i t t y ä + k o p t i k r i s t i t y i l l e + k o p t i k r i s t i t y t + k o p t i l a i s k r i s t i t t y j e n + k o p t i l a i s k r i s t i t y i l l e + k o p t i p i i s p a + k o p t i v ä h e m m i s t ö n + k o p t i v ä h e m m i s t ö ö n + k o p t i y h t e i s ö + k o p t i y h t e i s ö n + k o p t i y h t e i s ö ä + k o r a l l i a + k o r a l l i h a u k k a k a l a + k o r a l l i m e r e n + k o r a l l i m e r i + k o r a l l i m o n n i t + k o r a l l i r i u t a t + k o r a l l i r i u t t a + k o r a l l i r i u t t o i h i n + k o r a l l i r i u t t o j e n + k o r a l l i s a a r i + k o r a l l i s o r m i s a m m a k k o + k o r a l l i t u o t t e i d e n + k o r e a a + k o r e a a n + k o r e a h a n + k o r e a l a i s a u t o i s s a + k o r e a l a i s e t + k o r e a l l a + k o r e a l t a + k o r e a n + k o r e a n k u u s i + k o r e a n p i h t a + k o r e a n s a l m i + k o r e a n s i r k k a l i n t u + k o r e a s s a + k o r e a s t a + k o r e o i d e n + k o r i i n + k o r i n r a k e n n u s + k o r i n t i n l a h t i + k o r i p a j u + k o r i p a l l o i l i j o i t a + k o r i p a l l o l i i g a + k o r i p a l l o l i i t o s s a + k o r i p a l l o m a a j o u k k u e + k o r i p a l l o n + k o r i p a l l o s s a + k o r i s t e i t a + k o r i s t e k a s v e i s t a + k o r i s t e k a s v e j a + k o r i s t e k a s v i a l a n + k o r i s t e k a s v i e n + k o r i s t e k a s v i t + k o r i s t e l i n t u j e n + k o r i s t e l t u j a + k o r j a a m a a n + k o r j a a m a l l a + k o r j a a m a s s a + k o r j a a m a t o n t a + k o r j a a m i s e e n + k o r j a a m i s e k s i + k o r j a a m i s e s t a + k o r j a a m i s t a + k o r j a a m i s v e l v o l l i s u u d e s s a + k o r j a a m o i d e n + k o r j a a m o i l l e + k o r j a a m o i l t a + k o r j a a m o i t a + k o r j a a m o j e n + k o r j a a m o n + k o r j a a n + k o r j a a n t u i s i + k o r j a a n t u m i s e n + k o r j a a n t u m i s t a + k o r j a a n t u u + k o r j a a v a a + k o r j a a v a k s i + k o r j a a v a l l a + k o r j a a v a n + k o r j a a v a s s a k i n + k o r j a a v a s t a + k o r j a a v a t + k o r j a a v i a + k o r j a a v i e n + k o r j a a v i i n + k o r j a i s i m m e + k o r j a s i + k o r j a t a + k o r j a t a a n + k o r j a t a a n k o + k o r j a t a k s e e n + k o r j a t a k s e m m e + k o r j a t k a a + k o r j a t k a a m m e + k o r j a t t a i s i i n + k o r j a t t a v a + k o r j a t t a v a a + k o r j a t t a v i a + k o r j a t t a v i s s a + k o r j a t t u a + k o r j a u k s e l l a + k o r j a u k s e n + k o r j a u k s e s t a + k o r j a u k s e t + k o r j a u k s i a + k o r j a u k s i e n + k o r j a u k s i s t a + k o r j a u s a j a n j a k s o + k o r j a u s a j a s s a + k o r j a u s a l a l l a + k o r j a u s a l a l l e + k o r j a u s k a n a v i a + k o r j a u s k e l v o t t o m i a + k o r j a u s k e r r o i n j ä r j e s t e l m ä + k o r j a u s k e r r o i n t a + k o r j a u s k e r t o i m e n + k o r j a u s k e r t o i m i e n + k o r j a u s k u s t a n n u k s e t + k o r j a u s k u s t a n n u k s i s t a + k o r j a u s k u s t a n n u s t e n + k o r j a u s l a s k u j a + k o r j a u s l a s k u t + k o r j a u s l a u s e k e + k o r j a u s l a u s e k e t t a + k o r j a u s l a u s e k k e e l l a + k o r j a u s l a u s e k k e e n + k o r j a u s l a u s e k k e e s e e n + k o r j a u s l a u s e k k e e s s a + k o r j a u s l a u s e k k e e s t a + k o r j a u s l a u s e k k e e t + k o r j a u s m a a l a u s t u o t t e i d e n + k o r j a u s m a a l a u s t u o t t e i s t a + k o r j a u s m a h d o l l i s u u t e e n + k o r j a u s m a r k k i n a t + k o r j a u s m a r k k i n o i h i n + k o r j a u s m e k a n i s m e i h i n + k o r j a u s m e k a n i s m e i l l a + k o r j a u s m e k a n i s m e j a + k o r j a u s m e k a n i s m i + k o r j a u s m e k a n i s m i a + k o r j a u s m e k a n i s m i i n + k o r j a u s m e k a n i s m i l l e + k o r j a u s m e k a n i s m i s t a + k o r j a u s m e k a n i s m i t + k o r j a u s m e n e t e l m i s t ä + k o r j a u s m e n e t e l m ä ä + k o r j a u s m e n e t t e l y i l l ä + k o r j a u s m e n e t t e l y t + k o r j a u s n a u h a + k o r j a u s n e s t e + k o r j a u s n ä k ö k o h t i a + k o r j a u s o s a t + k o r j a u s p a l v e l u i h i n + k o r j a u s p a l v e l u j a + k o r j a u s p ä ä t ö s t e n + k o r j a u s r a t k a i s u + k o r j a u s s u u n n i t e l m a + k o r j a u s s u u n n i t e l m a n + k o r j a u s t a + k o r j a u s t a r k o i t u k s i i n + k o r j a u s t a r v e + k o r j a u s t e l a k o i l l a + k o r j a u s t e n + k o r j a u s t e o l l i s u u d e n + k o r j a u s t e o l l i s u u s + k o r j a u s t i e d o n + k o r j a u s t i e d o t + k o r j a u s t i e t o j a + k o r j a u s t i e t o j e n + k o r j a u s t o i m e n p i d e + k o r j a u s t o i m e n p i t e e t + k o r j a u s t o i m e n p i t e i d e n + k o r j a u s t o i m e n p i t e i l l e + k o r j a u s t o i m e n p i t e i s i i n + k o r j a u s t o i m e n p i t e i t ä + k o r j a u s t o i m e t + k o r j a u s t o i m i a + k o r j a u s t o i m i e n + k o r j a u s t o i m i i n + k o r j a u s t o i m i l l a + k o r j a u s t o i m i n n a n + k o r j a u s t o i m i s s a + k o r j a u s t y ö n + k o r j a u s t y ö t + k o r j a u s t y ö t ä + k o r j a u s t ö i d e n + k o r j a u s t ö i h i n + k o r j a u s t ö i s s ä + k o r j a u s t ö i t ä + k o r j a u s v a i h t o e h t o j a + k o r j a u s v e r k k o + k o r j a u t t a m i s e e n + k o r j u u p a i k a n + k o r k e a a + k o r k e a a n + k o r k e a j ä n n i t e j o h t o j a + k o r k e a j ä n n i t e j ä r j e s t e l m ä + k o r k e a j ä n n i t e l i n j a a + k o r k e a j ä n n i t e l i n j o i h i n + k o r k e a k i r k o l l i s u u s + k o r k e a k o r k o i s i l l a + k o r k e a k o u l u + k o r k e a k o u l u a + k o r k e a k o u l u a l a + k o r k e a k o u l u a l a l l a + k o r k e a k o u l u a l a n + k o r k e a k o u l u a l u e + k o r k e a k o u l u a l u e e n + k o r k e a k o u l u a l u e t t a + k o r k e a k o u l u i h i n + k o r k e a k o u l u i l l a + k o r k e a k o u l u i l l e + k o r k e a k o u l u i n s t i t u u t t e j a + k o r k e a k o u l u i n s t i t u u t t i e n + k o r k e a k o u l u i s s a + k o r k e a k o u l u i s s a a n + k o r k e a k o u l u i s s a m m e + k o r k e a k o u l u i s t a + k o r k e a k o u l u j a + k o r k e a k o u l u j e n + k o r k e a k o u l u j ä r j e s t e l m i e m m e + k o r k e a k o u l u j ä r j e s t e l m i e n + k o r k e a k o u l u j ä r j e s t e l m i e n s ä + k o r k e a k o u l u j ä r j e s t e l m i i n + k o r k e a k o u l u j ä r j e s t e l m i ä ä n + k o r k e a k o u l u j ä r j e s t e l m ä + k o r k e a k o u l u j ä r j e s t e l m ä m m e + k o r k e a k o u l u j ä r j e s t e l m ä n + k o r k e a k o u l u k e s k u k s i s t a + k o r k e a k o u l u k o u l u t u s + k o r k e a k o u l u k u r s s e i h i n + k o r k e a k o u l u l a i t o k s e n + k o r k e a k o u l u l a i t o k s e t + k o r k e a k o u l u l a i t o k s i a + k o r k e a k o u l u l a i t o k s i i n + k o r k e a k o u l u l a i t o k s i s s a + k o r k e a k o u l u l a i t o s t e n + k o r k e a k o u l u m a h d o l l i s u u k s i e n + k o r k e a k o u l u n + k o r k e a k o u l u n s a + k o r k e a k o u l u o p e t t a j a + k o r k e a k o u l u o p e t t a j a n + k o r k e a k o u l u o p e t t a j a n a + k o r k e a k o u l u o p e t u k s e e n + k o r k e a k o u l u o p e t u k s e l l e + k o r k e a k o u l u o p e t u k s e n + k o r k e a k o u l u o p e t u k s e s s a + k o r k e a k o u l u o p e t u k s e s t a + k o r k e a k o u l u o p e t u s + k o r k e a k o u l u o p e t u s j ä r j e s t e l m i e m m e + k o r k e a k o u l u o p e t u s t a + k o r k e a k o u l u o p i n n o i k s i + k o r k e a k o u l u o p i n n o i s s a + k o r k e a k o u l u o p i n n o i s t a + k o r k e a k o u l u o p i n t o j e n + k o r k e a k o u l u o p i s k e l i j a t + k o r k e a k o u l u o p i s k e l i j o i d e n + k o r k e a k o u l u o p i s k e l i j o i s t a + k o r k e a k o u l u p i i r e i s s ä + k o r k e a k o u l u p o l i t i i k k o j a + k o r k e a k o u l u s e k t o r i l l a + k o r k e a k o u l u s s a + k o r k e a k o u l u s t a + k o r k e a k o u l u t + k o r k e a k o u l u t a s o i s e n + k o r k e a k o u l u t a s o l l a + k o r k e a k o u l u t a u s t a + k o r k e a k o u l u t u t k i m u k s e n + k o r k e a k o u l u t u t k i n n o n + k o r k e a k o u l u t u t k i n n o s t a + k o r k e a k o u l u t u t k i n t o + k o r k e a k o u l u t u t k i n t o a + k o r k e a k o u l u t u t k i n t o j a + k o r k e a k o u l u t u t k i n t o j a a n + k o r k e a k o u l u t u t k i n t o j e n + k o r k e a k o u l u t u t k i n t o o n + k o r k e a k o u l u y h t e i s t y ö n + k o r k e a k o u l u y h t e i s ö + k o r k e a k o u l u y h t e i s ö n + k o r k e a k u l t t u u r e i s s a + k o r k e a k u l t t u u r i i n + k o r k e a k u l t t u u r i n + k o r k e a k u l t t u u r i s t a + k o r k e a l a a t u i n e n + k o r k e a l a a t u i s e e n + k o r k e a l a a t u i s e k s i + k o r k e a l a a t u i s e l l a + k o r k e a l a a t u i s e l l e + k o r k e a l a a t u i s e m m a n + k o r k e a l a a t u i s e m m i s t a + k o r k e a l a a t u i s e m p a a + k o r k e a l a a t u i s e m p a a n + k o r k e a l a a t u i s e m p i a + k o r k e a l a a t u i s e m p i i n + k o r k e a l a a t u i s e n + k o r k e a l a a t u i s e n a + k o r k e a l a a t u i s e s s a + k o r k e a l a a t u i s e s t a + k o r k e a l a a t u i s e s t i + k o r k e a l a a t u i s e t + k o r k e a l a a t u i s i a + k o r k e a l a a t u i s i e n + k o r k e a l a a t u i s i i n + k o r k e a l a a t u i s i l l a + k o r k e a l a a t u i s i l l e + k o r k e a l a a t u i s i m m a n + k o r k e a l a a t u i s i m m i s t a + k o r k e a l a a t u i s i m p i a + k o r k e a l a a t u i s i n a + k o r k e a l a a t u i s i s t a + k o r k e a l a a t u i s t a + k o r k e a l a a t u i s t e n + k o r k e a l a a t u i s u u d e n + k o r k e a l a a t u i s u u d e s t a + k o r k e a l e n t o i s i a + k o r k e a l e n t o i s i s s a + k o r k e a l e n t o i s t e n + k o r k e a l u o k k a i n e n + k o r k e a l u o k k a i s e k s i + k o r k e a l u o k k a i s e l l e + k o r k e a l u o k k a i s e m p i a + k o r k e a l u o k k a i s e n + k o r k e a l u o k k a i s e s t a + k o r k e a l u o k k a i s e t + k o r k e a l u o k k a i s i a + k o r k e a l u o k k a i s i i n + k o r k e a l u o k k a i s i l l e + k o r k e a l u o k k a i s t a + k o r k e a l u o k k a i s t e n + k o r k e a m m a k s i + k o r k e a m m a l l a + k o r k e a m m a l l e + k o r k e a m m a l t a + k o r k e a m m a n + k o r k e a m m a s s a + k o r k e a m m a t + k o r k e a m m i k s i + k o r k e a m m i l l a + k o r k e a m m i n + k o r k e a m m i s t a + k o r k e a m p a a + k o r k e a m p a a n + k o r k e a m p i + k o r k e a m p i a + k o r k e a m p i e n + k o r k e a m p i i n + k o r k e a m p i n a + k o r k e a n + k o r k e a n a + k o r k e a o k t a a n i s t a + k o r k e a p a i n e l a i t t e e t + k o r k e a p a i n e m e n e t e l m ä l l ä + k o r k e a p a l k k a i s e t + k o r k e a p a l k k a i s i a + k o r k e a p a l k k a i s i n + k o r k e a p a l k k a i s i s t a + k o r k e a p a l k k a i s t e n + k o r k e a s s a + k o r k e a s t a + k o r k e a s u h d a n t e e n + k o r k e a t + k o r k e a t a s o i n e n + k o r k e a t a s o i s e e n + k o r k e a t a s o i s e l l a + k o r k e a t a s o i s e l l e + k o r k e a t a s o i s e m m a n + k o r k e a t a s o i s e m m a s t a + k o r k e a t a s o i s e m m a t + k o r k e a t a s o i s e m p a a + k o r k e a t a s o i s e m p i a + k o r k e a t a s o i s e n + k o r k e a t a s o i s e n a + k o r k e a t a s o i s e s t a + k o r k e a t a s o i s e s t i + k o r k e a t a s o i s e t + k o r k e a t a s o i s i a + k o r k e a t a s o i s i l l a + k o r k e a t a s o i s i n a + k o r k e a t a s o i s i n t a + k o r k e a t a s o i s i s t a + k o r k e a t a s o i s t a + k o r k e a t a s o i s t a k i n + k o r k e a t a s o i s t e n + k o r k e a t u l o i s i l l e + k o r k e a t u o t t o i s t e n + k o r k e i d e n + k o r k e i k s i + k o r k e i m m a l l a + k o r k e i m m a l l e + k o r k e i m m a l t a + k o r k e i m m a n + k o r k e i m m a s s a + k o r k e i m m a s t a + k o r k e i m m a t + k o r k e i m m i l l a + k o r k e i m m i l l a a n + k o r k e i m m i l l e + k o r k e i m m i l t a + k o r k e i m m i n + k o r k e i m m i s s a + k o r k e i m p a a n + k o r k e i m p i a + k o r k e i m p i e n + k o r k e i m p i i n + k o r k e i n + k o r k e i n a + k o r k e i n t a + k o r k e i s i i n + k o r k e i s s a + k o r k e i s t a + k o r k e i t a + k o r k e u d e l l a a n + k o r k e u k s i i n + k o r k e u s e r o j e n + k o r k e u s h y p p y + k o r k e u s p o r r a s t u s + k o r k e u t e n s a + k o r k i n j a l o s t u s a l a l l a + k o r k k i j ä t e + k o r k k i k a u p p a a + k o r k k i t a m m e a + k o r k k i t a m m e n + k o r k k i t a m m e t + k o r k k i t a m m i + k o r k k i t a m m i a + k o r k k i t a m m i e n + k o r k o a + k o r k o a a n + k o r k o a s t e + k o r k o a s t e e l l a + k o r k o a s t e e t + k o r k o a s t e i s s a + k o r k o a s t e t t a + k o r k o h e l p o t u k s e t + k o r k o i h i n + k o r k o i n a + k o r k o j a + k o r k o j a a n + k o r k o j e n + k o r k o j e n a l e n n u s t e n + k o r k o k a n n a n + k o r k o k a n n a s t a + k o r k o k a n n a s t a m m e + k o r k o k a n n a t + k o r k o k a n n o i s t a + k o r k o k a n t a + k o r k o k a n t a a + k o r k o k a n t a a n s a + k o r k o k a n t o i h i n + k o r k o k a n t o j a + k o r k o k a n t o j e n + k o r k o k a t o t + k o r k o k a t t o a + k o r k o k e h i t y k s e e n + k o r k o k e h i t y s + k o r k o k e h i t y s t ä + k o r k o k e n k ä + k o r k o k u l u i h i n + k o r k o k u l u j a + k o r k o k u s t a n n u k s i a + k o r k o l e i k k a u k s e t + k o r k o m a k s u i n a + k o r k o m a k s u i s t a + k o r k o m a k s u j a + k o r k o m a k s u j e n + k o r k o m a k s u t + k o r k o m a r g i n a a l i e n + k o r k o m a r k k i n o i l t a + k o r k o m e n o i n a + k o r k o m e n o j a + k o r k o m e n o j e n + k o r k o m e n o t + k o r k o m u u t o k s i a + k o r k o m u u t o k s i s t a + k o r k o o n + k o r k o p o l i t i i k a l l a + k o r k o p o l i t i i k a n + k o r k o p o l i t i i k a s s a + k o r k o p o l i t i i k a s s a a n + k o r k o p o l i t i i k k a + k o r k o p o l i t i i k k a a + k o r k o p o l i t i i k k a a n + k o r k o p r e e m i o l l a + k o r k o p r o s e n t e i l l a + k o r k o p r o s e n t i n + k o r k o p r o s e n t i t + k o r k o p r o s e n t t e i h i n + k o r k o p r o s e n t t e j a + k o r k o p r o s e n t t i + k o r k o p r o s e n t t i a + k o r k o p r o s e n t t i e n + k o r k o p r o s e n t t i i n + k o r k o p ä ä t ö k s i i n + k o r k o p ä ä t ö k s i l l ä + k o r k o p ä ä t ö k s i s s ä + k o r k o p ä ä t ö k s i ä + k o r k o r a h a s t o + k o r k o r a s i t u s t a + k o r k o s t r a t e g i a + k o r k o s u h d a n t e e n + k o r k o s w a p e j a + k o r k o t a a k k a + k o r k o t a l l e t u s t e n + k o r k o t a s o + k o r k o t a s o a + k o r k o t a s o a a n + k o r k o t a s o e r o n + k o r k o t a s o i h i n + k o r k o t a s o j a + k o r k o t a s o j e n + k o r k o t a s o l l a + k o r k o t a s o l l e + k o r k o t a s o m m e + k o r k o t a s o n + k o r k o t a s o o n + k o r k o t a s o p o l i t i i k a n + k o r k o t a s o s t a + k o r k o t a s o t + k o r k o t a v o i t t e i t a + k o r k o t u e l l a + k o r k o t u e n + k o r k o t u e s t a + k o r k o t u e t + k o r k o t u k e a + k o r k o t u k e n a + k o r k o t u k i + k o r k o t u k i a + k o r k o t u k i e n + k o r k o t u k i i n + k o r k o t u k i j ä r j e s t e l m ä + k o r k o t u k i j ä r j e s t e l m ä ä + k o r k o t u k i l a i n a n + k o r k o t u k i l a i n o i s t a + k o r k o t u k i l a i n o j a + k o r k o t u k i l u o t o i s t a + k o r k o t u k i o h j e l m a n + k o r k o t u k i p a k e t i n + k o r k o t u k i v ä l i n e + k o r k o t u k i v ä l i n e i t ä + k o r k o t u l o i s t a + k o r k o t u l o j a + k o r k o t u l o j e n + k o r k o t u o t o s t a + k o r k o t u o t t o + k o r k o t u o t t o a + k o r k o v e r o a + k o r n i t + k o r o i l l a + k o r o i n + k o r o i s s a + k o r o i s t a + k o r o k o i + k o r o l l a + k o r o l l i s e t + k o r o n + k o r o n a a r i a n g i o p l a s t i a + k o r o n a l e n n u k s e t + k o r o n a l e n n u k s i a + k o r o n a l e n n u k s i l l a + k o r o n a l e n n u s + k o r o n k i s k u r e i d e n + k o r o n k i s k u r i e n + k o r o n l a s k u + k o r o n l a s k u a + k o r o n m a k s u a + k o r o n m a k s u t u k i a + k o r o n m a k s u u n + k o r o n m u u t o k s i n + k o r o n n o s t o + k o r o n n o s t o a + k o r o n n o s t o i s t a + k o r o n n o s t o j e n + k o r o n n o s t o l l a + k o r o n n o s t o o n + k o r o n n o s t o p ä ä t ö s + k o r o n n o s t o s s a + k o r o n n o s t o s t a + k o r o n n o u s u n + k o r o s t a a + k o r o s t a a k i n + k o r o s t a a k s e e n + k o r o s t a a k s e m m e + k o r o s t a a k s e n i + k o r o s t a e n + k o r o s t a e s s a a n + k o r o s t a e s s a m m e + k o r o s t a e s s a n i + k o r o s t a e s s a n n e + k o r o s t a i s i m m e + k o r o s t a i s i n + k o r o s t a i s i n k i n + k o r o s t a k a a m m e + k o r o s t a m a a n + k o r o s t a m a l l a + k o r o s t a m a s t a + k o r o s t a m a t t a + k o r o s t a m i a + k o r o s t a m i s e k s i + k o r o s t a m i s t a + k o r o s t a m m e + k o r o s t a n + k o r o s t a n e e t + k o r o s t a n e e t k i n + k o r o s t a n k i n + k o r o s t a n u t + k o r o s t a t t e + k o r o s t a v a s s a + k o r o s t a v a t + k o r o s t e t a + k o r o s t e t a a n + k o r o s t e t a a n k i n + k o r o s t e t a a n k o + k o r o s t e t t a e s s a + k o r o s t e t t a i s i i n + k o r o s t e t t a k o o n + k o r o s t e t t a v a + k o r o s t e t t a v a n + k o r o s t e t t i i n + k o r o s t e t t i i n k i n + k o r o s t e t t u + k o r o s t e t t u a + k o r o s t i + k o r o s t i m m e + k o r o s t i n + k o r o s t i t t e + k o r o s t i v a t + k o r o s t u m a a n + k o r o s t u n e e m p a a + k o r o s t u n e e m p i + k o r o s t u u + k o r o s t u v a t + k o r o t + k o r o t a n + k o r o t e t a a n + k o r o t e t t a v a + k o r o t e t t i i n + k o r o t e t t u a + k o r o t t a a + k o r o t t a m a a n + k o r o t t a m a l l a + k o r o t t a m a t t a + k o r o t t a m i s e e n + k o r o t t a m i s e h d o t u s t a + k o r o t t a m i s e k s i + k o r o t t o m a l l a + k o r o t t o m a n + k o r o t t o m a t + k o r o t t o m i a + k o r o t t o m i s t a + k o r o t u k s e k s i + k o r o t u k s e l l e + k o r o t u k s e n + k o r o t u k s e s t a + k o r o t u k s i a + k o r o t u s t a + k o r p i a l v e j u u r i + k o r p i k a r h u n s a m m a l + k o r p i k e r t t u l i + k o r p i n m u s t a t u k k a i n e n + k o r p i n p o l s k a + k o r p i n p o r t t i + k o r p i p a a t s a m a + k o r p i r a h k a s a m m a l + k o r p i r a s t a s + k o r p i r o u s k u + k o r p i s a a r i + k o r p i s i e p p a r i + k o r p i t + k o r p p i k o t k a m a i s t e n + k o r p p i k o t k a t + k o r p p u j a u h o + k o r p r a a l i k e r t t u + k o r p r a a l i k o l i b r i + k o r r e k t i m m a s t a + k o r r e k t i m p i + k o r r e k t i u d e n + k o r r e l a a t i o k e r r o i n + k o r r e l a a t i o t e k i j ö i t ä + k o r r u p t i o a s t e + k o r r u p t i o e h d o t u k s e n + k o r r u p t i o e p ä i l y i n + k o r r u p t i o e p ä i l y k s e t + k o r r u p t i o e p ä i l y ä + k o r r u p t i o h u o l i e n + k o r r u p t i o i n d e k s i s s ä + k o r r u p t i o j ä r j e s t e l m i ä + k o r r u p t i o k y s y m y k s e e n + k o r r u p t i o k y s y m y k s i i n + k o r r u p t i o k y s y m y s t ä + k o r r u p t i o k ä y t t ö ö n + k o r r u p t i o k ä y t ä n t ö j ä + k o r r u p t i o m u o t o j a + k o r r u p t i o n + k o r r u p t i o n l ä h t e e k s i + k o r r u p t i o n t o r j u n n a n + k o r r u p t i o n t o r j u n t a s t r a t e g i o i t a + k o r r u p t i o n v a s t a i n e n + k o r r u p t i o n v a s t a i s e n + k o r r u p t i o n v a s t a i s i a + k o r r u p t i o o n + k o r r u p t i o p e d o n + k o r r u p t i o p i i r i s s ä ä n + k o r r u p t i o p y r k i m y k s e t + k o r r u p t i o r i s k i + k o r r u p t i o s k a n d a a l e j a + k o r r u p t i o s k a n d a a l i e n + k o r r u p t i o s k a n d a a l i s t a + k o r r u p t i o s k a n d a a l i t + k o r r u p t i o s t a + k o r r u p t i o s y y t t e i d e n + k o r r u p t i o s y y t t e i s i i n + k o r r u p t i o s y y t ö k s e t + k o r r u p t i o s y y t ö k s i ä + k o r r u p t i o s y y t ö s t e n + k o r r u p t i o t a + k o r r u p t i o t a p a u k s e t + k o r r u p t i o t a p a u k s i a + k o r r u p t i o t a p a u k s i i n + k o r r u p t i o t a p a u k s i s s a + k o r r u p t i o t a p a u k s i s t a + k o r r u p t i o t a p a u s + k o r r u p t i o t u t k i m u k s i s t a + k o r r u p t i o v ä i t t e e n s ä + k o r r u p t o i t u n e e m p i + k o r r u p t o i t u n e e n + k o r r u p t o i t u n e e t + k o r r u p t o i t u n e i d e n + k o r r u p t o i t u n e i l l a + k o r r u p t o i t u n e i m m a k s i + k o r r u p t o i t u n e i m m a t + k o r r u p t o i t u n e i m m i l t a + k o r r u p t o i t u n e i m m i s t a + k o r r u p t o i t u n e i m p i a + k o r r u p t o i t u n e i s i i n + k o r r u p t o i t u n e i s t a + k o r r u p t o i t u n e i t a + k o r r u p t o i t u n u t t a + k o r s i k a n n a k k e l i + k o r s i k a n r i t a r i + k o r s i k a n s a h r a m i + k o r s i r e h u j e n + k o r s i r e h u n + k o r s i r e h u s a t o + k o r t e i l l a + k o r t i l l a + k o r t i l t a n i + k o r t i n + k o r t i t + k o r t t e j a + k o r t t e j a a n + k o r t t i a + k o r t t i e n + k o r t t i i n + k o r t t i j ä r j e s t e l m ä + k o r t t i j ä r j e s t e l m ä n + k o r t t i m a k s u j e n + k o r t t i m m e + k o r t t i n i + k o r t t i n s a + k o r t t i p a k k a + k o r t t i p e l i + k o r t t i r a t k a i s u j a + k o r t t i t a l o + k o r t t i t a l o a + k o r t t i t a l o t + k o r t t i t e m p p u + k o r t t i v a l m i s t a j i l l e + k o r u l a u s e + k o r u l a u s e e k s i + k o r u l a u s e e m m e + k o r u l a u s e e t + k o r u l a u s e i d e n s a + k o r u l a u s e i k s i + k o r u l a u s e i l l e + k o r u l a u s e i n + k o r u l a u s e i n e m m e + k o r u l a u s e i s i i n + k o r u l a u s e i s t a + k o r u l a u s e i t a + k o r u l a u s e t t a + k o r u l u r i + k o r u n a n + k o r u p a r t a h a i + k o r u p i i s p a n h a t t u + k o r u p u h e i d e n + k o r u p u h e i t a + k o r u r i h m a k a l a + k o r u r u h t i n a s k a l a + k o r u s a n o j a + k o r u t e t r a + k o r v a a k o + k o r v a a m a a n + k o r v a a m a s s a + k o r v a a m a t o n t a + k o r v a a m a t t a + k o r v a a m a t t o m a m p i + k o r v a a m a t t o m a n + k o r v a a m a t t o m a s t a + k o r v a a m a t t o m i a + k o r v a a m i s a s i a s s a + k o r v a a m i s e e n + k o r v a a m i s e k s i + k o r v a a m i s e s s a + k o r v a a m i s e s t a + k o r v a a m i s m e n e t t e l y n + k o r v a a m i s p e r i a a t e + k o r v a a m i s p e r i a a t e t t a + k o r v a a m i s p e r i a a t t e e n + k o r v a a m i s p e r i a a t t e e s e e n + k o r v a a m i s p e r i a a t t e e s t a + k o r v a a m i s p o l i t i i k a n + k o r v a a m i s s u u n n i t e l m a + k o r v a a m i s s u u n n i t e l m a s t a + k o r v a a m i s s u u n n i t e l m i a + k o r v a a m i s s u u n n i t e l m i e n + k o r v a a m i s t a + k o r v a a m i s v e l v o l l i s u u d e n + k o r v a a m m e k o + k o r v a a n s a + k o r v a a v a k s i + k o r v a a v a n + k o r v a a v a s s a + k o r v a a v a t + k o r v a a v i a + k o r v a a v i e n + k o r v a a v i l l a + k o r v a a v i l l e + k o r v a a v u u s p e r i a a t e + k o r v a a v u u s p e r i a a t t e e s e e n + k o r v a a v u u s p e r i a a t t e e s t a + k o r v a h y l k e e t + k o r v a i s i + k o r v a k e n ä t k e l m ä + k o r v a k o i r a + k o r v a k o r p p i k o t k a + k o r v a k y n t t i l ä h o i t o + k o r v a l a p p u s t e r e o t + k o r v a l u i d e n + k o r v a m e d u u s a + k o r v a m e r k i n + k o r v a m e r k i n n ä s t ä + k o r v a m e r k i n n ä t + k o r v a m e r k i n t ä j ä r j e s t e l m ä s s ä + k o r v a m e r k i n t ä m a l l i + k o r v a m e r k i n t ä ä + k o r v a m e r k i t s e m i s t ä + k o r v a m e r k i t s e m m e + k o r v a m e r k i t y t + k o r v a m e r k k e j ä + k o r v a m e r k k i + k o r v a m e r k k i e n + k o r v a m e r k k i ä + k o r v a m m e + k o r v a n i + k o r v a n n e e s t a + k o r v a n s a + k o r v a p u u s t i + k o r v a s i e n i + k o r v a s i i l i + k o r v a s i i p p a + k o r v a s o l m i o k o l i b r i + k o r v a s s a + k o r v a s y l k i r a u h a n e n + k o r v a t + k o r v a t a + k o r v a t a a n + k o r v a t a k s e e n + k o r v a t a m a r i i n i + k o r v a t e s s a a n + k o r v a t o r v i + k o r v a t r o g o n i + k o r v a t t a i s i i n + k o r v a t t i i n + k o r v a t t i i n k i n + k o r v a t t u + k o r v a t u l e h d u k s i s t a + k o r v a t u l e h d u s + k o r v a t u l e h d u s t a + k o r v a u k s e e n + k o r v a u k s e k s i + k o r v a u k s e l l e + k o r v a u k s e n + k o r v a u k s e n h a k u t a p o i h i n + k o r v a u k s e s t a + k o r v a u k s e t + k o r v a u k s e t t a + k o r v a u k s e t t o m a n + k o r v a u k s e t t o m a s t a + k o r v a u k s i a + k o r v a u k s i a m m e + k o r v a u k s i e n + k o r v a u k s i i m m e + k o r v a u k s i i n + k o r v a u k s i l l a + k o r v a u k s i l l e + k o r v a u k s i n a + k o r v a u k s i s t a + k o r v a u s a s i a + k o r v a u s a s i a a + k o r v a u s a s i a a n + k o r v a u s a s i a t + k o r v a u s a s t e i k o n + k o r v a u s a s t e t t a + k o r v a u s e d u s t a j a j ä r j e s t e l m ä + k o r v a u s e d u s t a j a j ä r j e s t e l m ä ä + k o r v a u s e d u s t a j a n + k o r v a u s e d u s t a j i e n + k o r v a u s e h d o t + k o r v a u s e h d o t u k s i a + k o r v a u s e h t o i h i n + k o r v a u s e h t o j a + k o r v a u s e l i m e e n + k o r v a u s e l i m i ä + k o r v a u s h a k e m u k s e s t a + k o r v a u s h a k e m u s t a + k o r v a u s h a k e m u s t e n + k o r v a u s i n v e s t o i n t e j a + k o r v a u s j ä r j e s t e l m i e n + k o r v a u s j ä r j e s t e l m i s t ä + k o r v a u s j ä r j e s t e l m i ä + k o r v a u s j ä r j e s t e l m ä + k o r v a u s j ä r j e s t e l m ä l l ä + k o r v a u s j ä r j e s t e l m ä n + k o r v a u s j ä r j e s t e l m ä s s ä + k o r v a u s j ä r j e s t e l m ä s t ä + k o r v a u s j ä r j e s t e l m ä t + k o r v a u s j ä r j e s t e l m ä ä + k o r v a u s j ä r j e s t e l m ä ä n + k o r v a u s j ä r j e s t e l y i h i n + k o r v a u s j ä r j e s t e l y i l l ä + k o r v a u s j ä r j e s t e l y j e n + k o r v a u s j ä r j e s t e l y j ä + k o r v a u s j ä r j e s t e l y n ä + k o r v a u s k a n t e i d e n + k o r v a u s k a p a s i t e e t i n + k o r v a u s k a s s o j a + k o r v a u s k e l p o i n e n + k o r v a u s k e l p o i s i a + k o r v a u s k e r r o i n t a + k o r v a u s k i e l t o a + k o r v a u s k u l t t u u r i a + k o r v a u s k u s t a n n u k s i i n + k o r v a u s k y s y m y k s i i n + k o r v a u s k y s y m y s + k o r v a u s k y s y m y s t e n + k o r v a u s k y s y m y s t ä + k o r v a u s k ä s i t t e e n + k o r v a u s k ä y t ä n t ö ä + k o r v a u s l a k i a l o i t t e e n + k o r v a u s l a u s e k k e e n + k o r v a u s l a u s e k k e e s e e n + k o r v a u s l o m a k k e i s i i n s a + k o r v a u s m a h d o l l i s u u t t a + k o r v a u s m a k s u i l l e + k o r v a u s m a k s u j a + k o r v a u s m a k s u j e n + k o r v a u s m a k s u s t a + k o r v a u s m a k s u s u u n n i t e l m a + k o r v a u s m a k s u t + k o r v a u s m a t k a i l u + k o r v a u s m e k a n i s m e j a + k o r v a u s m e k a n i s m i + k o r v a u s m e k a n i s m i a + k o r v a u s m e k a n i s m i e n + k o r v a u s m e k a n i s m i n + k o r v a u s m e k a n i s m i t + k o r v a u s m e n e t t e l y + k o r v a u s m e n e t t e l y i s t ä + k o r v a u s m e n e t t e l y j e n + k o r v a u s m e n e t t e l y j ä + k o r v a u s m e n e t t e l y n + k o r v a u s m e n e t t e l y s t ä + k o r v a u s m e n e t t e l y y n + k o r v a u s m u o d o i s t a + k o r v a u s m u o t o + k o r v a u s m ä ä r i e n + k o r v a u s m ä ä r i ä + k o r v a u s m ä ä r ä + k o r v a u s m ä ä r ä n + k o r v a u s m ä ä r ä t + k o r v a u s o h j e l m a a + k o r v a u s o i k e u d e n + k o r v a u s o i k e u d e n k ä y n t i ä + k o r v a u s o i k e u k s i a + k o r v a u s o i k e u k s i s t a + k o r v a u s o i k e u t t a + k o r v a u s o n g e l m a + k o r v a u s p a k e t i s t a + k o r v a u s p a k e t i t + k o r v a u s p a k e t t e i h i n + k o r v a u s p a k e t t i + k o r v a u s p a k e t t i a + k o r v a u s p a k e t t i i n + k o r v a u s p e r i a a t e + k o r v a u s p e r i a a t e t t a + k o r v a u s p e r i a a t t e e l l a + k o r v a u s p e r i a a t t e e n + k o r v a u s p e r i a a t t e e n a + k o r v a u s p e r i a a t t e e s e e n + k o r v a u s p e r i a a t t e e s t a + k o r v a u s p e r i a a t t e e t + k o r v a u s p o l i t i i k a l l a a n + k o r v a u s p o l i t i i k a s s a + k o r v a u s p o l i t i i k k a a + k o r v a u s p r o s e s s i a + k o r v a u s p y y n n ö t + k o r v a u s p ä ä t ö k s i ä + k o r v a u s r a h a s t o + k o r v a u s r a h a s t o a + k o r v a u s r a h a s t o a s i a s s a + k o r v a u s r a h a s t o j a + k o r v a u s r a h a s t o j e n + k o r v a u s r a h a s t o j ä r j e s t e l m ä n + k o r v a u s r a h a s t o n + k o r v a u s r a h a s t o o n + k o r v a u s r a h a s t o s t a + k o r v a u s r a j o i s t a + k o r v a u s r a j o j e n + k o r v a u s r a k e n t e i s t a + k o r v a u s r a k e n t e i t a + k o r v a u s s u m m a a + k o r v a u s s u m m a a n + k o r v a u s s u m m a s t a + k o r v a u s s u m m a t + k o r v a u s s u m m i a + k o r v a u s s u u n n i t e l m a + k o r v a u s s u u n n i t e l m a t + k o r v a u s s ä ä n n ö k s e t + k o r v a u s s ä ä n n ö k s i ä + k o r v a u s s ä ä n n ö t + k o r v a u s s ä ä n t e l y + k o r v a u s s ä ä n t ö j e n + k o r v a u s s ä ä n t ö j ä + k o r v a u s t a + k o r v a u s t a a k a n + k o r v a u s t a a n + k o r v a u s t a k u u t + k o r v a u s t a r i f f i t + k o r v a u s t a s o + k o r v a u s t a s o a + k o r v a u s t a s o i h i n + k o r v a u s t a s o i s t a + k o r v a u s t a s o j e n + k o r v a u s t a s o n + k o r v a u s t a s o t + k o r v a u s t e n + k o r v a u s t o i m e n p i t e e k s i + k o r v a u s t o i m e n p i t e e t + k o r v a u s t o i m e n p i t e i s i i n + k o r v a u s t o i m e n p i t e i t ä + k o r v a u s t o i m e t + k o r v a u s t o i m i a + k o r v a u s t o i m i e l i m e n + k o r v a u s t o i m i e l i m e s t ä + k o r v a u s t o i m i e l i m i n ä + k o r v a u s t o i m i e l i n + k o r v a u s t o i m i e l i n t e n + k o r v a u s t o i m i e l i n t ä + k o r v a u s t o i m i k u n n a s t a + k o r v a u s t u e n + k o r v a u s t u e t + k o r v a u s t u k i e n + k o r v a u s v a a t i m u k s e n + k o r v a u s v a a t i m u k s e t + k o r v a u s v a a t i m u k s i a + k o r v a u s v a a t i m u k s i i n + k o r v a u s v a a t i m u k s i s t a + k o r v a u s v a a t i m u s l o m a k k e e t + k o r v a u s v a a t i m u s t e n + k o r v a u s v a s t u u + k o r v a u s v a s t u u j ä r j e s t e l m ä + k o r v a u s v a s t u u j ä r j e s t e l m ä ä + k o r v a u s v a s t u u n + k o r v a u s v a s t u u s e e n + k o r v a u s v a s t u u s ä ä n n ö t + k o r v a u s v a s t u u t a s o + k o r v a u s v e l v o i t t e e t + k o r v a u s v e l v o i t t e i s i i n + k o r v a u s v e l v o l l i s i l l a + k o r v a u s v e l v o l l i s u u d e n + k o r v a u s v e l v o l l i s u u s + k o r v a u s v e l v o l l i s u u s r i s k i e n + k o r v a u s v e l v o l l i s u u t t a + k o r v a y ö k k ö + k o r v i a a n + k o r v i i n i + k o r v i k e a i n e + k o r v i k e a i n e i d e n + k o r v i k e a l k o h o l i + k o r v i k e k a s v i r a s v o j e n + k o r v i k e k o m i t e a + k o r v i k e o i k e u d e n k ä y n n i n + k o r v i k e s u k l a a + k o r v i k e s u k l a a t a + k o r v i k e t a i s t e l u i l l e + k o r v i k e v a l m i s t a j i s t a + k o r v i k k e e t t a + k o r v i l l e n i + k o r v i s s a m m e + k o s i n i l a u s e + k o s i s k e l e v i a + k o s i s k e l l a + k o s k e a + k o s k e e + k o s k e e h a n + k o s k e e k o + k o s k e k o + k o s k e m a a n + k o s k e m a t t a + k o s k e m a t t o m u u d e n + k o s k e m a t t o m u u d e s t a + k o s k e m a t t o m u u d e s t a n i + k o s k e m a t t o m u u s k y s y m y k s e s s ä + k o s k e m a t t o m u u s k y s y m y k s e t + k o s k e m a t t o m u u s k y s y m y k s i ä + k o s k e m a t t o m u u s l a u s e k k e i t a + k o s k e m a t t o m u u s m e n e t t e l y j ä + k o s k e m a t t o m u u s n ä k ö k o h t i a + k o s k e m a t t o m u u s s o p i m u k s e n + k o s k e m a t t o m u u s s o p i m u k s e t + k o s k e m a t t o m u u s s o p i m u k s i a + k o s k e m a t t o m u u s s o p i m u s t a + k o s k e m a t t o m u u s s o p i m u s t e n + k o s k e m a t t o m u u s s u o j a + k o s k e m a t t o m u u s t a p a u k s i a + k o s k e m a t t o m u u s t a p a u s t a + k o s k e m a t t o m u u t e m m e + k o s k e m a t t o m u u t e n s a + k o s k e m a t t o m u u t t a + k o s k e m a t t o m u u t t a a n + k o s k e n e e s s a + k o s k e n e e t + k o s k e n e i s s a + k o s k e n k o r v a + k o s k e n u t + k o s k e t i n s o i t i n + k o s k e t t a a + k o s k e t t a e s s a + k o s k e t t a v a a + k o s k e t t a v a n + k o s k e t t a v a s s a + k o s k e t t a v a s t a + k o s k e t t a v a t + k o s k e t t a v i a + k o s k e t t a v i i n + k o s k e t t e l u m a t e r i a a l i + k o s k e t u k s e s t a + k o s k e t u k s i i n + k o s k e t u k s i s s a + k o s k e t u s a l l e r g i a n + k o s k e t u s k a k s o i s t ä h t i + k o s k e t u s k o h t i a + k o s k e t u s p i s t e + k o s k e t u s s ä ä n t ö + k o s k e v a a + k o s k e v a a n + k o s k e v a k s i + k o s k e v a l l e + k o s k e v a n + k o s k e v a s s a + k o s k e v a s t a + k o s k e v a t + k o s k e v i a + k o s k e v i a k a a n + k o s k e v i e n + k o s k e v i i n + k o s k e v i l l a + k o s k e v i l l e + k o s k e v i s s a + k o s k e v i s t a + k o s k i e s s a a n + k o s k i h a r a k k a + k o s k i k a r a + k o s k i l u o k i t u s + k o s k i p u j o t t e l u + k o s k i s a m m a k k o + k o s k i s i + k o s k i s i v a t + k o s k i s o r s a + k o s k i s y ö k s y + k o s k i t a p a k u l o + k o s k i v a t + k o s k i v a t p a + k o s k i v ä s t ä r ä k k i + k o s m e e t t i s i l t a + k o s m e e t t i s i s t a + k o s m e e t t i s t e n + k o s m e t i i k k a a + k o s m e t i i k k a d i r e k t i i v i + k o s m e t i i k k a d i r e k t i i v i i n + k o s m e t i i k k a d i r e k t i i v i n + k o s m e t i i k k a d i r e k t i i v i s s ä + k o s m e t i i k k a d i r e k t i i v i ä + k o s m e t i i k k a k o m i t e a a n + k o s m e t i i k k a l o b b a u s + k o s m e t i i k k a m a r k k i n o i s t a + k o s m e t i i k k a t e o l l i s u u d e l l e + k o s m e t i i k k a t e o l l i s u u d e n + k o s m e t i i k k a t e o l l i s u u d e s s a + k o s m e t i i k k a t e o l l i s u u d e s t a + k o s m e t i i k k a t e o l l i s u u s + k o s m e t i i k k a t e o l l i s u u t e e n + k o s m e t i i k k a t e o l l i s u u t e n n e + k o s m e t i i k k a t e o l l i s u u t t a + k o s m e t i i k k a t u o t t e e t + k o s m e t i i k k a t u o t t e i d e n + k o s m e t i i k k a v a l m i s t a j a n + k o s m e t i i k k a v a l m i s t e + k o s m e t i i k k a v a l m i s t e i d e n + k o s m e t i i k k a y h t i ö t + k o s m e t i i k k a y r i t y k s i l l e + k o s o r i n + k o s o v o l a i s e t + k o s o v o l a i s i i n + k o s o v o l a i s i l l a + k o s o v o l a i s i l l e + k o s o v o l a i s i s t a + k o s o v o l a i s p a n t t i v a n g i t + k o s o v o l a i s t e n + k o s r a e n k o t t a r a i n e n + k o s t a a + k o s t a j a t + k o s t a s + k o s t a u t u u + k o s t e a n + k o s t e i k k o k a s v i + k o s t e i k k o k e r t t u n e n + k o s t e i k k o l u o n t o t y y p p i e n + k o s t e i k k o v a h v e r o + k o s t e u s p i t o i s u u d e s t a + k o s t e u s p i t o i s u u s + k o s t e u s p i t o i s u u t e e n + k o s t e u s p r o s e n t t i + k o s t e u s p r o s e n t t i a + k o s t e u s p y y h e + k o s t e u s t a s a p a i n o + k o s t e u s t a s o i s t a + k o s t e u s v a u r i o + k o s t i + k o s t o b o i k o t e i s t a + k o s t o i s k u j a + k o s t o k e i n o n a + k o s t o m i e l i a l a a + k o s t o n + k o s t o n h a l u a + k o s t o n h i m o a + k o s t o n h i m o i n e n + k o s t o n h i m o i s e s t i + k o s t o n h i m o o n + k o s t o n j a n o a + k o s t o n k i e r r e + k o s t o n k i e r r e t t ä + k o s t o n k i e r t e e s t ä + k o s t o s t a + k o s t o t o i m e n a + k o s t o t o i m e n p i t e e t + k o s t o t o i m e n p i t e i d e n + k o s t o t o i m e n p i t e i n ä + k o s t o t o i m e n p i t e i s i i n + k o s t o t o i m e n p i t e i s t ä + k o s t o t o i m e n p i t e i t ä + k o s t o t o i m e t + k o s t o t o i m i + k o s t o t o i m i a + k o s t o t o i m i i n + k o s t o t o i m i s t a + k o s t o v a a t i m u k s i a + k o s t o v a a t i m u k s i n + k o t a n g e n t t i l a u s e + k o t e i h i n s a + k o t e j a a n + k o t e l o k i l p i k o n n a t + k o t e l o p a l k k i s i l t a + k o t i a a n + k o t i a l u e e l l a a n + k o t i a l u e e l l a n i + k o t i a l u e e n i + k o t i a p u a + k o t i a r e s t e i s t a + k o t i a r e s t i + k o t i a r e s t i a + k o t i a r e s t i a a n + k o t i a r e s t i i n + k o t i a r e s t i n + k o t i a r e s t i s s a + k o t i a r e s t i s t a + k o t i a s k a r e i s t a + k o t i a v u n + k o t i e l ä i m e t + k o t i e l ä i m i e m m e + k o t i e l ä i m i i n + k o t i e l ä i m i l l e + k o t i e l ä i m i n ä + k o t i e l ä i m i s t ä + k o t i e l ä i m i ä + k o t i e l ä i n j a l o s t u k s e n + k o t i e l ä i n m a i t a + k o t i e l ä i n p a l k k i o i t a + k o t i e l ä i n t a l o u d e l l e + k o t i e l ä i n t a l o u d e n + k o t i e l ä i n t e n + k o t i e l ä i n t i l a s t o i s t a + k o t i e l ä i n t i l a s t o j a + k o t i e l ä i n t i l a s t o t + k o t i e l ä i n t i l o i l l e + k o t i e l ä i n t u o t a n n o n + k o t i e l ä i n t u o t a n n o s s a + k o t i e l ä i n t u o t a n t o + k o t i e l ä i n t u o t a n t o a + k o t i e l ä i n t u o t a n t o a a n + k o t i e l ä i n t u o t t a j i e n + k o t i e l ä i n t u o t t e i t a + k o t i e l ä m ä n + k o t i e t s i n n ä n + k o t i e t s i n t ä m ä ä r ä y k s e n + k o t i e t s i n t ö j e n + k o t i e t s i n t ö j ä + k o t i h i i r i + k o t i h o i d o l l a + k o t i h o i d o n + k o t i h o i d o s t a + k o t i h o i t a j a + k o t i h o i t a j a n a + k o t i h o i t a j i n a + k o t i h o i t o + k o t i h o i t o a + k o t i h o i t o o n + k o t i h o i t o p a l v e l u i h i n + k o t i h o i t o p a l v e l u j a + k o t i h o i t o p a l v e l u t + k o t i i m m e + k o t i i n p a l u u l l e + k o t i i n p a l u u n + k o t i i n p a l u u o i k e u d e n + k o t i i n p a l u u p o l i t i i k k a a + k o t i i n p a l u u p r o j e k t i n + k o t i i n p a l u u t a + k o t i i n s a + k o t i j o u k k u e e n s a + k o t i j ä r v e s t ä ä n + k o t i j ä s e n v a l t i o + k o t i j ä s e n v a l t i o l t a a n + k o t i j ä s e n v a l t i o m m e + k o t i j ä s e n v a l t i o n + k o t i j ä s e n v a l t i o n i + k o t i j ä s e n v a l t i o n s a + k o t i j ä s e n v a l t i o o n i + k o t i j ä s e n v a l t i o o n s a + k o t i j ä s e n v a l t i o s s a + k o t i j ä s e n v a l t i o s s a a n + k o t i j ä s e n v a l t i o s t a a n + k o t i k a t u n i + k o t i k a u p u n g e i s s a m m e + k o t i k a u p u n g e i s t a m m e + k o t i k a u p u n g i s s a + k o t i k a u p u n g i s s a n i + k o t i k a u p u n g i s t a n i + k o t i k a u p u n k i a a n + k o t i k a u p u n k i e n + k o t i k a u p u n k i i n i + k o t i k a u p u n k i i n s a + k o t i k a u p u n k i n i + k o t i k a u p u n k i n s a + k o t i k e n t t ä e t u + k o t i k e n t ä l l ä + k o t i k e n t ä l l ä n i + k o t i k e n t ä l l ä ä n + k o t i k i r k k o j e n + k o t i k i r k k o y h t e i s ö j e n + k o t i k i s s o j a + k o t i k i s s o j e n + k o t i k o n n u i l t a a n + k o t i k u l m i l l a + k o t i k u n n a s t a a n + k o t i k u n t a a n i + k o t i k y l i i n + k o t i k y l i i n s ä + k o t i k y l ä s s ä n i + k o t i k y l ä ä n i + k o t i k ä y n t i ä + k o t i k ä y t t ö ö n + k o t i k ä y t ö s t ä + k o t i l a i v a s t o + k o t i l e n n o l l e e n + k o t i l e n n o n + k o t i l o h a u k k a + k o t i l o k u k k a + k o t i l ä k s y j ä + k o t i l ä k s y n s ä + k o t i m a a + k o t i m a a h a n + k o t i m a a h a n i + k o t i m a a h a n n e + k o t i m a a h a n s a + k o t i m a a k u n n a s s a n i + k o t i m a a l l a a n + k o t i m a a l l a n i + k o t i m a a l l e e n + k o t i m a a l l e n i + k o t i m a a m m e + k o t i m a a n + k o t i m a a n a a n + k o t i m a a n i + k o t i m a a n i k i n + k o t i m a a n k a u p a n + k o t i m a a n k a u p p a a + k o t i m a a n l e n n o i l l a + k o t i m a a n l e n n o i s t a + k o t i m a a n l e n t o i h i n + k o t i m a a n l e n t o j a + k o t i m a a n l i i k e n n e + k o t i m a a n l i i k e n t e e n + k o t i m a a n l i i k e n t e e s s ä + k o t i m a a n m a k s u j e n + k o t i m a a n m a r k k i n o i l l e + k o t i m a a n m a t k o j a + k o t i m a a n n e + k o t i m a a n s a + k o t i m a a s s a + k o t i m a a s s a a n + k o t i m a a s s a k i n + k o t i m a a s s a m m e + k o t i m a a s s a n i + k o t i m a a s s a n n e + k o t i m a a s s a n n e k i n + k o t i m a a s t a a n + k o t i m a a s t a m m e + k o t i m a a s t a n i + k o t i m a a s t a n n e + k o t i m a a t + k o t i m a a t a + k o t i m a a t a a n + k o t i m a a t a n i + k o t i m a a t a n n e + k o t i m a i d e m m e + k o t i m a i d e n + k o t i m a i d e n s a + k o t i m a i h i m m e + k o t i m a i h i n n e + k o t i m a i h i n s a + k o t i m a i l l e m m e + k o t i m a i n e n + k o t i m a i s e m i s s a a n + k o t i m a i s e n + k o t i m a i s i a + k o t i m a i s i i n + k o t i m a i s i l l a + k o t i m a i s i n + k o t i m a i s s a + k o t i m a i s s a a n + k o t i m a i s s a m m e + k o t i m a i s s a m m e k i n + k o t i m a i s s a n n e + k o t i m a i s t a a n + k o t i m a i s t e n + k o t i m a i t a + k o t i m a i t a a n + k o t i m a i t a m m e + k o t i m a i t a n n e + k o t i m a r k k i n a + k o t i m a r k k i n a h i n n a t + k o t i m a r k k i n a m m e + k o t i m a r k k i n a t + k o t i m a r k k i n o i d e n + k o t i m a r k k i n o i h i n + k o t i m a r k k i n o i h i n s a + k o t i m a r k k i n o i k s e e n + k o t i m a r k k i n o i k s i + k o t i m a r k k i n o i l l a + k o t i m a r k k i n o i l l a a n + k o t i m a r k k i n o i l l e + k o t i m a r k k i n o i l t a + k o t i m a r k k i n o i n a + k o t i m a r k k i n o i s t a + k o t i m a r k k i n o i t a + k o t i m a r k k i n o i t a a n + k o t i m a s s a a n + k o t i m a t k a + k o t i m a t k a a + k o t i m a t k a l l a + k o t i m a t k a l l a a n + k o t i m a t k a l l a n i + k o t i m m e + k o t i m u s e o + k o t i m y y n n i n + k o t i m y y n t i t i l a n t e e s s a + k o t i m y y n t i ä + k o t i n a a n + k o t i n s a + k o t i o l o i h i n + k o t i o l o j e n + k o t i o p e t u s + k o t i o r j i k s i + k o t i o r j i n a + k o t i o r j i s t a + k o t i o r j u u d e l l e + k o t i o r j u u d e n + k o t i o r j u u s + k o t i o r j u u t e n a + k o t i o s a v a l t i o n i + k o t i o s a v a l t i o s s a n i + k o t i o v e a n i + k o t i o v e l l a m m e + k o t i o v e l l e + k o t i o v e l l e e n + k o t i o v e l t a + k o t i p a i k a l l e e n + k o t i p a i k a n + k o t i p a i k a s s a + k o t i p a i k a s s a a n + k o t i p a i k a s s a n i + k o t i p a i k k a + k o t i p a i k k a a n s a + k o t i p a i k k a k u n n a l l a n i + k o t i p a i k k a k u n n a l t a + k o t i p a i k k a n s a + k o t i p a i k k a o i k e u t e n s a + k o t i p a i k k o j a a n + k o t i p a i k k o j e n + k o t i p a l v e l u i s s a + k o t i p a l v e l u i t a + k o t i p a l v e l u j e n + k o t i p a l v e l u t + k o t i p a n k k i i n + k o t i p a n k k i p a l v e l u t + k o t i p i h l a j a + k o t i p i i r i s s ä ä n + k o t i p u o l e s s a + k o t i p u o l u e e n s a + k o t i p u u t a r h a a n + k o t i p ä ä s t ä i n e n + k o t i p ä ä s t ä i s o p o s s u m i + k o t i r a n n i k o l t a n i + k o t i r i n t a m a + k o t i r i n t a m a l l a + k o t i r i n t a m a s t a + k o t i r y s s ä + k o t i s a a r t a n i + k o t i s a t a m a + k o t i s a t a m a n + k o t i s a t a m a n i + k o t i s a t a m a s t a + k o t i s a t a m i s t a + k o t i s e u d u i l l a a n + k o t i s e u d u i l t a a n + k o t i s e u d u l l a a n + k o t i s e u d u l l a n i + k o t i s e u d u l l a s i + k o t i s e u d u l l e e n + k o t i s e u d u l l e n i + k o t i s e u d u l t a a n + k o t i s e u d u l t a n i + k o t i s e u t u a + k o t i s e u t u a l u e + k o t i s e u t u a n i + k o t i s e u t u m u s e o + k o t i s e u t u n i + k o t i s e u t u n s a + k o t i s e u t u u n i + k o t i s i r k k a + k o t i s i v u + k o t i s i v u i h i n + k o t i s i v u i l l a + k o t i s i v u i l l a a n + k o t i s i v u i l t a + k o t i s i v u j a + k o t i s i v u j e n + k o t i s i v u l l a + k o t i s i v u l l e + k o t i s i v u l l e e n + k o t i s i v u n + k o t i s i v u n n e + k o t i s i v u t + k o t i s o v e l l u k s i i n + k o t i s y n n y t y s + k o t i t a l o u d e l l e + k o t i t a l o u d e s s a + k o t i t a l o u d e t + k o t i t a l o u k s i a + k o t i t a l o u k s i e n + k o t i t a l o u k s i i n + k o t i t a l o u k s i l l e + k o t i t a l o u k s i s s a + k o t i t a l o u k s i s t a + k o t i t a l o u s a s i a k a s + k o t i t a l o u s a s i a k k a a t + k o t i t a l o u s a s i a k k a i d e n + k o t i t a l o u s a s i a k k a i l l e + k o t i t a l o u s a s i a k k a i t a + k o t i t a l o u s h y ö d y k k e i s t ä + k o t i t a l o u s j ä t e + k o t i t a l o u s j ä t e t t ä + k o t i t a l o u s j ä t t e e n + k o t i t a l o u s j ä t t e e s s ä + k o t i t a l o u s j ä t t e e s t ä + k o t i t a l o u s j ä t t e i d e n + k o t i t a l o u s j ä t t e i l l ä + k o t i t a l o u s j ä t t e i s i i n + k o t i t a l o u s j ä t t e i s t ä + k o t i t a l o u s j ä t t e i t ä + k o t i t a l o u s k e m i k a a l i t + k o t i t a l o u s k o n e e t + k o t i t a l o u s k o n e i t a + k o t i t a l o u s k u l u t t a j a t + k o t i t a l o u s k u l u t t a j i a + k o t i t a l o u s k u l u t t a j i e n + k o t i t a l o u s k u l u t t a j i l l e + k o t i t a l o u s k ä y t t ä j ä t + k o t i t a l o u s k ä y t t ö ä + k o t i t a l o u s k ä y t t ö ö n + k o t i t a l o u s k ä y t ö s t ä + k o t i t a l o u s l a i t t e i d e n + k o t i t a l o u s l i s ä + k o t i t a l o u s m e n o i s t a a n + k o t i t a l o u s m e n o j a + k o t i t a l o u s m e n o j a a n + k o t i t a l o u s n ä k ö k u l m a a n + k o t i t a l o u s p a l v e l u i h i n + k o t i t a l o u s p a l v e l u j a + k o t i t a l o u s p a l v e l u t + k o t i t a l o u s s e k t o r i l l a + k o t i t a l o u s s e k t o r i n + k o t i t a l o u s s ä ä s t ä j i e n + k o t i t a l o u s t a r p e i s i i n + k o t i t a l o u s t a v a r a t + k o t i t a l o u s t a v a r o i d e n + k o t i t a l o u s t u o t t e i s s a + k o t i t a l o u s t y ö h ö n + k o t i t a l o u s t y ö n + k o t i t a l o u s t y ö n t e k i j ä n ä + k o t i t a l o u s t y ö s s ä + k o t i t a l o u s t y ö t ä + k o t i t a l o u s t ö i s s ä + k o t i t a l o u s t ö i t ä + k o t i t a r v e v i l j e l i j ä t + k o t i t a r v e v i l j e l i j ö i d e n + k o t i t a r v e v i l j e l y + k o t i t a r v e v i l j e l y l l e + k o t i t a r v e v i l j e l y n + k o t i t a r v e v i l j e l y t u o t a n n o l l a a n + k o t i t a r v e v i l j e l y ä + k o t i t e a t t e r i + k o t i t e h t ä v i s t ä + k o t i t e h t ä v i s t ä ä n + k o t i t e h t ä v i ä + k o t i t e h t ä v ä n s ä + k o t i t e h t ä v ä t + k o t i t e o l l i s u u d e n + k o t i t e o l l i s u u s + k o t i t e o l l i s u u t t a + k o t i t i e t o k o n e + k o t i t i e t o k o n e i d e n s a + k o t i t i e t o k o n e i s i i n + k o t i t y ö + k o t i t y ö h ö n + k o t i t y ö l l ä + k o t i t y ö n + k o t i t y ö n t e k i j ä + k o t i t y ö n t e k i j ä n + k o t i t y ö n t e k i j ä t + k o t i t y ö n t e k i j ö i d e n + k o t i t y ö n t e k i j ö i h i n + k o t i t y ö n t e k i j ö i k s i + k o t i t y ö n t e k i j ö i l l e + k o t i t y ö n t e k i j ö i s t ä + k o t i t y ö n t e k i j ö i t ä + k o t i t y ö n ä + k o t i t y ö s t ä + k o t i t y ö t + k o t i t y ö t ä + k o t i t ö i d e n + k o t i t ö i h i n + k o t i t ö i s t ä + k o t i t ö i t ä + k o t i u t e t t a v a + k o t i u t t a m i s a l o i t t e e t + k o t i u t t a m i s e k s i + k o t i u t t a m i s p o l i t i i k a s t a + k o t i u t t a m i s p o l i t i i k a t + k o t i u t t a m i s p o l i t i i k k a + k o t i u t t a m i s p o l i t i i k k a a + k o t i u t t a m i s t o i m e n p i t e i t ä + k o t i u t t a m i s t o i m i a + k o t i u t t a m i s t u k e a + k o t i v a l t i o + k o t i v a l t i o i d e m m e + k o t i v a l t i o i d e n s a + k o t i v a l t i o i l l e + k o t i v a l t i o i s s a a n + k o t i v a l t i o i s s a m m e + k o t i v a l t i o i s s a m m e k i n + k o t i v a l t i o i t t e m m e + k o t i v a l t i o l l e + k o t i v a l t i o n + k o t i v a l t i o n i + k o t i v a l t i o n s a + k o t i v a l t i o o n s a + k o t i v a l t i o s s a + k o t i v a l t i o s s a a n + k o t i v a l t i o s s a n i + k o t i v a l t i o s t a + k o t i v a l t i o s t a a n + k o t i v a l t i o t a + k o t i v a l t i o t a a n + k o t i v a l t i o v e r o t u k s e s t a + k o t i v a l t i o v e r o t u s t a + k o t i v e r k o n + k o t i v e s i e n + k o t i v e s i l l ä + k o t i v e s i l t ä + k o t i v i l j e l i j ö i d e n + k o t i v ä k i v a l l a n + k o t i v ä k i v a l l a s s a + k o t i v ä k i v a l l a s t a + k o t i v ä k i v a l t a + k o t i v ä k i v a l t a a + k o t i v ä k i v a l t a a n + k o t i y l e i s ö n + k o t i y m p ä r i s t ö n + k o t i y m p ä r i s t ö s s ä + k o t i y m p ä r i s t ö s t ä + k o t i y m p ä r i s t ö ö n + k o t i ä i t e j ä + k o t i ä i t i + k o t i ä i t i e n + k o t k a m a t t o + k o t k a n + k o t k a n s i i p i + k o t k a r a u s k u t + k o t k a s u m u + k o t o a a n + k o t o a n i + k o t o i s a k s i + k o t o k o l i t + k o t o k o t + k o t o n a a n + k o t o n a k i n + k o t o n a m m e + k o t o p e r ä i s i ä + k o t o u t e t t a v a + k o t o u t t a m a t t a + k o t o u t t a m i s a l o i t t e i t a + k o t o u t t a m i s a s i a t + k o t o u t t a m i s e e n + k o t o u t t a m i s e s s a + k o t o u t t a m i s e s t a + k o t o u t t a m i s f o o r u m i + k o t o u t t a m i s f o o r u m i a + k o t o u t t a m i s h a n k k e e t + k o t o u t t a m i s h a n k k e i s s a + k o t o u t t a m i s h a n k k e i s t a + k o t o u t t a m i s i n n o s s a m m e + k o t o u t t a m i s j a k s o l l a + k o t o u t t a m i s k e i n o + k o t o u t t a m i s k y v y s t ä + k o t o u t t a m i s l a i n s ä ä d ä n t ö ä + k o t o u t t a m i s m a l l i e n + k o t o u t t a m i s o h j e l m i a + k o t o u t t a m i s o n g e l m a a + k o t o u t t a m i s o n g e l m i e n + k o t o u t t a m i s p o l i t i i k a l l e + k o t o u t t a m i s p o l i t i i k a n + k o t o u t t a m i s p o l i t i i k a s s a + k o t o u t t a m i s p o l i t i i k a s t a + k o t o u t t a m i s p o l i t i i k k a + k o t o u t t a m i s p o l i t i i k k a a + k o t o u t t a m i s p o l i t i i k k a a n + k o t o u t t a m i s p o l i t i i k k a a n s a + k o t o u t t a m i s p o l i t i i k k a m m e + k o t o u t t a m i s p o l i t i i k k o i h i n + k o t o u t t a m i s p o l i t i i k k o j a + k o t o u t t a m i s p r o s e s s i a + k o t o u t t a m i s r a h a s t o a + k o t o u t t a m i s r a h a s t o l l a + k o t o u t t a m i s r a h a s t o n + k o t o u t t a m i s r a h a s t o o n + k o t o u t t a m i s s t r a t e g i o i t a + k o t o u t t a m i s s u u n n i t e l m a s s a + k o t o u t t a m i s t a + k o t o u t t a m i s t a v o i t e + k o t o u t t a m i s t o i m e n p i d e t t ä + k o t o u t t a m i s t o i m e n p i t e e t + k o t o u t t a m i s t o i m e n p i t e i d e n + k o t o u t t a m i s t o i m i a + k o t o u t t a m i s t o i m i e m m e + k o t o u t t a m i s t o i m i e n + k o t o u t t a m i s t o i m i l l e + k o t o u t t a m i s u l o t t u v u u d e n + k o t o u t t a m i s v i r a s t o n + k o t o u t u m a a n + k o u k k u a m i n e n + k o u k k u p a i n i + k o u l u a + k o u l u a i k o j e n + k o u l u a i n e + k o u l u a i n e i d e n + k o u l u a i n e i s i i n + k o u l u a j a n + k o u l u a m m u s k e l u + k o u l u a m p u m i s i a + k o u l u a s t e i l l a + k o u l u a t e r i a t + k o u l u a t e r i o i d e n + k o u l u b u s s e i l l a + k o u l u b u s s e i s s a + k o u l u b u s s e j a + k o u l u b u s s i + k o u l u b u s s i a + k o u l u b u s s i e n + k o u l u b u s s i n + k o u l u b u s s i t + k o u l u b u s s i t u r m a s s a + k o u l u e s i m e r k k i + k o u l u h a n k k e e t + k o u l u h e d e l m i e n + k o u l u h e d e l m i i n + k o u l u h e d e l m i ä + k o u l u h e d e l m ä + k o u l u h e d e l m ä j ä r j e s t e l m i e n + k o u l u h e d e l m ä j ä r j e s t e l m i l l e + k o u l u h e d e l m ä j ä r j e s t e l m ä + k o u l u h e d e l m ä j ä r j e s t e l m ä n + k o u l u h e d e l m ä j ä r j e s t e l m ä s s ä + k o u l u h e d e l m ä j ä r j e s t e l m ä s t ä + k o u l u h e d e l m ä j ä r j e s t e l m ä ä + k o u l u h e d e l m ä j ä r j e s t e l m ä ä n + k o u l u h e d e l m ä j ä r j e s t e l y n + k o u l u h e d e l m ä k a m p a n j a + k o u l u h e d e l m ä k a m p a n j a a + k o u l u h e d e l m ä n + k o u l u h e d e l m ä o h j e l m a + k o u l u h e d e l m ä o h j e l m a a + k o u l u h e d e l m ä s o p i m u s + k o u l u h e d e l m ä t + k o u l u i h i n + k o u l u i k ä i s e l t ä + k o u l u i k ä i s i l l e + k o u l u i k ä i s i s t ä + k o u l u i k ä i s i ä + k o u l u i l l a + k o u l u i s s a + k o u l u i s t a + k o u l u i ä s s ä + k o u l u j a + k o u l u j a k i n + k o u l u j e n + k o u l u j ä r j e s t e l m i e n + k o u l u j ä r j e s t e l m i e n s ä + k o u l u j ä r j e s t e l m i l l e + k o u l u j ä r j e s t e l m i ä + k o u l u j ä r j e s t e l m ä + k o u l u j ä r j e s t e l m ä n + k o u l u j ä r j e s t e l m ä n s ä + k o u l u j ä r j e s t e l m ä s s ä + k o u l u j ä r j e s t e l m ä s t ä + k o u l u j ä r j e s t e l m ä ä + k o u l u j ä r j e s t e l m ä ä n + k o u l u k a a p p a u s + k o u l u k a r t t o i h i n + k o u l u k a s v a t u k s e s s a + k o u l u k a s v a t u k s e s t a + k o u l u k i r j a e s i m e r k e i l l ä + k o u l u k i r j a k o m i t e a s s a + k o u l u k i r j a m a r k k i n a t + k o u l u k i r j a t + k o u l u k i r j o i h i n + k o u l u k i r j o i s s a + k o u l u k i r j o j a + k o u l u k i r j o j e n + k o u l u k i u s a a m i n e n + k o u l u k i u s a a m i s t a + k o u l u k i u s a t t u j a + k o u l u k o k e m u k s i a a n + k o u l u k u l j e t u k s i a + k o u l u k u n n a t + k o u l u k u n t a + k o u l u k u n t a a + k o u l u k u n t i i n + k o u l u k y y t i + k o u l u l a i n s ä ä d ä n t ö ä + k o u l u l a i s e t + k o u l u l a i s e t k i n + k o u l u l a i s i a + k o u l u l a i s i i n + k o u l u l a i s i l l e + k o u l u l a i s i l t a + k o u l u l a i s s u k u p o l v i + k o u l u l a i s t a + k o u l u l a i s t e n + k o u l u l a i s v a i h t o + k o u l u l a i s v a i h t o a + k o u l u l a i s v i e r a i t a + k o u l u l a i t o k s e n + k o u l u l a i t o k s e s s a + k o u l u l a i t o s + k o u l u l a i t o s t e n + k o u l u l a i v a + k o u l u l a k i + k o u l u l a u k u t + k o u l u l i i k u n n a n + k o u l u l i i k u n n a n o p e t u s t a + k o u l u l i i k u n n a s t a + k o u l u l i i k u n t a + k o u l u l i i k u n t a a + k o u l u l i i k u n t a a n + k o u l u l l a + k o u l u l u o k a n + k o u l u l u o k a t + k o u l u l u o k i s s a + k o u l u l u o k k i a + k o u l u l u o k k i e n + k o u l u l u o k k i i n + k o u l u l ä ä k e t i e d e + k o u l u l ä ä k e t i e t e e k s i + k o u l u l ä ä k e t i e t e e l l e + k o u l u l ä ä k e t i e t e e n + k o u l u m a a i l m a n + k o u l u m a a i l m a s t a + k o u l u m a i d o n + k o u l u m a i d o s t a + k o u l u m a i t o + k o u l u m a i t o a + k o u l u m a i t o a s i a a + k o u l u m a i t o j ä r j e s t e l m ä + k o u l u m a i t o j ä r j e s t e l m ä n + k o u l u m a i t o j ä r j e s t e l m ä s s ä + k o u l u m a i t o j ä r j e s t e l m ä ä + k o u l u m a i t o j ä r j e s t e l m ä ä n + k o u l u m a i t o j ä r j e s t e l y + k o u l u m a i t o j ä r j e s t e l y n + k o u l u m a i t o j ä r j e s t e l y ä + k o u l u m a i t o o n + k o u l u m a k s u j a + k o u l u m a k s u t + k o u l u m a l l i + k o u l u m a l l i a + k o u l u m a t t i + k o u l u m e n e s t y k s e e n + k o u l u m e n e s t y k s e n + k o u l u m e n e s t y s + k o u l u m e n e s t y s t ä + k o u l u m u o t o j e n + k o u l u m ä ä r ä r a h o j a + k o u l u n + k o u l u n k ä y n n i n + k o u l u n k ä y n n i s t ä + k o u l u n k ä y n t i + k o u l u n k ä y n t i a s t e + k o u l u n k ä y n t i a v u s t u s t a + k o u l u n k ä y n t i i n + k o u l u n k ä y n t i m a h d o l l i s u u d e t + k o u l u n k ä y n t i m a h d o l l i s u u t t a + k o u l u n k ä y n t i n s ä + k o u l u n k ä y n t i o i k e u d e n + k o u l u n k ä y n t i ä + k o u l u n p e n k i l l ä + k o u l u n s a + k o u l u o h j e l m a + k o u l u o h j e l m i e n + k o u l u o p e t u k s e e n + k o u l u o p e t u k s e n + k o u l u o p e t u k s e s s a + k o u l u o p e t u k s e s t a + k o u l u o p e t u s + k o u l u o p e t u s t a + k o u l u p a l o + k o u l u p i i r i + k o u l u p o h j a i s e s s a + k o u l u p o i s s a o l o i h i n + k o u l u p o j a n + k o u l u p s y k o l o g i + k o u l u p u d o k k a i d e n + k o u l u p u k u + k o u l u p ä i v i n ä + k o u l u p ä i v ä n ä + k o u l u p ä i v ä ä + k o u l u r a k e n n u k s e n + k o u l u r a k e n n u s + k o u l u r e p p u + k o u l u r e p u n + k o u l u r e t k e n + k o u l u r u o a n + k o u l u r u o k a a + k o u l u r u o k a i l u + k o u l u r u o k a i l u j ä r j e s t e l m ä + k o u l u r u o k a i l u s t a + k o u l u r u o k a l a t + k o u l u r u o k a l o i d e n + k o u l u r u o k a l o i s t a + k o u l u s i h t e e r i n + k o u l u s s a + k o u l u s s a a n + k o u l u s t a + k o u l u s t r e s s i + k o u l u s u o r i t u k s i a a n + k o u l u s u o r i t u k s i i n + k o u l u s u r m a + k o u l u s u r m a t + k o u l u t + k o u l u t a r v i k k e i s t a + k o u l u t a r v i k k e i t a + k o u l u t a s o l l a + k o u l u t e r v e y d e n h u o l l o s s a + k o u l u t e t a a n + k o u l u t e t t a v a + k o u l u t e t t u a + k o u l u t e t t u j a + k o u l u t e t t u j e n + k o u l u t e t u i l l a + k o u l u t e t u i l l e + k o u l u t e t u i m m i l l e + k o u l u t e t u i m p i a + k o u l u t e t u i s t a + k o u l u t e t u m m a t + k o u l u t e t u m p a a + k o u l u t e t u m p i a + k o u l u t e t u n + k o u l u t e t u s t a + k o u l u t e t u t + k o u l u t i e d o n + k o u l u t i e t o v e r k k o + k o u l u t i l a n t e e n s a + k o u l u t o d i s t u k s e n + k o u l u t o d i s t u k s e s s a + k o u l u t o d i s t u k s i s t a a n + k o u l u t o v e r e i l l e e n + k o u l u t o v e r i e n + k o u l u t t a a + k o u l u t t a a k s e m m e + k o u l u t t a m a a n + k o u l u t t a m a l l a + k o u l u t t a m a t t a + k o u l u t t a m a t t o m i a + k o u l u t t a m a t t o m i e n + k o u l u t t a m i s e e n + k o u l u t t a m i s e n + k o u l u t t a m i s j ä r j e s t e l m i ä + k o u l u t t a m i s t a + k o u l u t t a u t u a + k o u l u t t a u t u m i s e e n + k o u l u t t a u t u m i s t a + k o u l u t u k s e e n + k o u l u t u k s e k s i + k o u l u t u k s e l l a + k o u l u t u k s e l l e + k o u l u t u k s e l l i s e s t i + k o u l u t u k s e l l i s e t + k o u l u t u k s e l l i s t a + k o u l u t u k s e n + k o u l u t u k s e n s a + k o u l u t u k s e n v a s t a i s t a + k o u l u t u k s e s s a + k o u l u t u k s e s t a + k o u l u t u k s e s t a a n + k o u l u t u k s e t + k o u l u t u n n e i l l a + k o u l u t u n t i e n + k o u l u t u s a k k r e d i t o i n t i + k o u l u t u s a l a + k o u l u t u s a l a a + k o u l u t u s a l a a n + k o u l u t u s a l a l l a + k o u l u t u s a l a l l e + k o u l u t u s a l a n + k o u l u t u s a l a n s a + k o u l u t u s a l a s t a + k o u l u t u s a l o i h i n + k o u l u t u s a l o i l l a + k o u l u t u s a l o i t e + k o u l u t u s a l o i t t e e s t a + k o u l u t u s a l o i t t e i d e n + k o u l u t u s a l o i t t e i s t a + k o u l u t u s a l o i t t e i t a + k o u l u t u s a l u e + k o u l u t u s a l u e e l l a + k o u l u t u s a l u e e n + k o u l u t u s a l u e e s t a + k o u l u t u s a l u e t t a + k o u l u t u s a p u r a h o i h i n + k o u l u t u s a s i a t + k o u l u t u s a s i o i d e n + k o u l u t u s a s i o i h i n + k o u l u t u s a s i o i s s a + k o u l u t u s a s i o i s t a + k o u l u t u s a s i o i t a + k o u l u t u s a s t e e l l e + k o u l u t u s a s t e e n + k o u l u t u s a s t e i l l a + k o u l u t u s a s t e t t a + k o u l u t u s a v u n + k o u l u t u s b u d j e t e i s s a + k o u l u t u s b u d j e t i n + k o u l u t u s b u d j e t i s t a + k o u l u t u s b u d j e t t e j a + k o u l u t u s e h d o t u s t e n + k o u l u t u s e r o i s t a + k o u l u t u s e s i m e r k i n + k o u l u t u s f i l o s o f i a + k o u l u t u s f o o r u m i + k o u l u t u s h a a s t e i s i i n + k o u l u t u s h a n k e v e r k o s t o n + k o u l u t u s h a n k k e e s e e n + k o u l u t u s h a n k k e e s t a + k o u l u t u s h a n k k e e t + k o u l u t u s h a n k k e i d e n + k o u l u t u s h a n k k e i l l e + k o u l u t u s h a n k k e i s i i m m e + k o u l u t u s h a n k k e i s i i n + k o u l u t u s h a n k k e i s s a + k o u l u t u s h a n k k e i t a + k o u l u t u s h y ö k k ä y s + k o u l u t u s i n d i k a a t t o r i t + k o u l u t u s i n f r a s t r u k t u u r i a + k o u l u t u s i n s t i t u u t i o i t a + k o u l u t u s i n s t i t u u t i o i t a m m e + k o u l u t u s i n s t i t u u t i o t + k o u l u t u s i n s t i t u u t i s s a + k o u l u t u s i n s t i t u u t t i a + k o u l u t u s i n v e s t o i n n e i s t a + k o u l u t u s i n v e s t o i n n i t + k o u l u t u s i n v e s t o i n t e i h i n + k o u l u t u s i n v e s t o i n t e j a + k o u l u t u s i n v e s t o i n t i e n + k o u l u t u s j a k s o + k o u l u t u s j a k s o a + k o u l u t u s j a k s o i h i n + k o u l u t u s j a k s o i s t a + k o u l u t u s j a k s o j a + k o u l u t u s j a k s o j e n + k o u l u t u s j a k s o n + k o u l u t u s j a k s o o n + k o u l u t u s j a k s o t + k o u l u t u s j ä r j e s t e l m i e m m e + k o u l u t u s j ä r j e s t e l m i e n + k o u l u t u s j ä r j e s t e l m i e n s ä + k o u l u t u s j ä r j e s t e l m i i m m e + k o u l u t u s j ä r j e s t e l m i i n + k o u l u t u s j ä r j e s t e l m i i n s ä + k o u l u t u s j ä r j e s t e l m i l l e + k o u l u t u s j ä r j e s t e l m i l l e e n + k o u l u t u s j ä r j e s t e l m i l l e m m e + k o u l u t u s j ä r j e s t e l m i l l ä + k o u l u t u s j ä r j e s t e l m i s s ä + k o u l u t u s j ä r j e s t e l m i s s ä m m e + k o u l u t u s j ä r j e s t e l m i s t ä + k o u l u t u s j ä r j e s t e l m i s t ä m m e + k o u l u t u s j ä r j e s t e l m i ä + k o u l u t u s j ä r j e s t e l m i ä m m e + k o u l u t u s j ä r j e s t e l m i ä ä n + k o u l u t u s j ä r j e s t e l m ä + k o u l u t u s j ä r j e s t e l m ä l l e + k o u l u t u s j ä r j e s t e l m ä l l ä + k o u l u t u s j ä r j e s t e l m ä m m e + k o u l u t u s j ä r j e s t e l m ä n + k o u l u t u s j ä r j e s t e l m ä n s ä + k o u l u t u s j ä r j e s t e l m ä s s ä + k o u l u t u s j ä r j e s t e l m ä s t ä + k o u l u t u s j ä r j e s t e l m ä t + k o u l u t u s j ä r j e s t e l m ä ä + k o u l u t u s j ä r j e s t e l m ä ä m m e + k o u l u t u s j ä r j e s t e l m ä ä n + k o u l u t u s j ä r j e s t e l m ä ä n s ä + k o u l u t u s j ä r j e s t e l y i s s ä + k o u l u t u s j ä r j e s t e l y t + k o u l u t u s j ä r j e s t ö j e n + k o u l u t u s j ä r j e s t ö j ä + k o u l u t u s k a m p a n j a + k o u l u t u s k a m p a n j a t + k o u l u t u s k a m p a n j o i d e n + k o u l u t u s k a m p a n j o i h i n + k o u l u t u s k a m p a n j o i l l e + k o u l u t u s k a m p a n j o i s s a + k o u l u t u s k a m p a n j o i t a + k o u l u t u s k a n a v a + k o u l u t u s k a p a s i t e e t i n + k o u l u t u s k e s k u k s e k s i + k o u l u t u s k e s k u k s e n + k o u l u t u s k e s k u k s e s s a + k o u l u t u s k e s k u k s e t + k o u l u t u s k e s k u k s i a + k o u l u t u s k e s k u k s i e m m e + k o u l u t u s k e s k u k s i i n + k o u l u t u s k e s k u k s i s s a + k o u l u t u s k e s k u s + k o u l u t u s k e s k u s t a + k o u l u t u s k e s k u s t e l u l l e + k o u l u t u s k e s k u s t e l u s s a + k o u l u t u s k e s k u s t e n + k o u l u t u s k i r j o l l e + k o u l u t u s k o k e i l u s t a + k o u l u t u s k o k e m u k s e e n + k o u l u t u s k o k e m u k s e n a + k o u l u t u s k o k e m u k s i a + k o u l u t u s k o k e m u k s i i n + k o u l u t u s k o k e m u s + k o u l u t u s k o k o n a i s u u k s i e n + k o u l u t u s k o r v a u k s e n + k o u l u t u s k o r v a u k s e s t a + k o u l u t u s k o r v a u k s e t + k o u l u t u s k o r v a u k s i a + k o u l u t u s k o r v a u k s i s t a + k o u l u t u s k o r v a u s + k o u l u t u s k u l t t u u r i a + k o u l u t u s k u l u i s t a a n + k o u l u t u s k u r s s e i l l e + k o u l u t u s k u r s s e j a + k o u l u t u s k u r s s i e n + k o u l u t u s k u r s s i t + k o u l u t u s k u s t a n n u k s e t + k o u l u t u s k u s t a n n u k s i a + k o u l u t u s k u s t a n n u k s i i n + k o u l u t u s k u s t a n n u k s i s t a + k o u l u t u s k u s t a n n u s t e n + k o u l u t u s k y s y m y k s e e n + k o u l u t u s k y s y m y k s e s s ä + k o u l u t u s k y s y m y k s e s t ä + k o u l u t u s k y s y m y k s i i n + k o u l u t u s k y s y m y k s i l l e + k o u l u t u s k y s y m y k s i ä + k o u l u t u s k y s y m y s + k o u l u t u s k y s y m y s t ä + k o u l u t u s k ä s i t y s t ä + k o u l u t u s k ä y t ä n t ö j ä + k o u l u t u s l a i n + k o u l u t u s l a i n s ä ä d ä n n ö n + k o u l u t u s l a i t o k s e m m e + k o u l u t u s l a i t o k s e n + k o u l u t u s l a i t o k s e s s a + k o u l u t u s l a i t o k s e s t a + k o u l u t u s l a i t o k s e t + k o u l u t u s l a i t o k s i a + k o u l u t u s l a i t o k s i i m m e + k o u l u t u s l a i t o k s i i n + k o u l u t u s l a i t o k s i l l e + k o u l u t u s l a i t o k s i s s a + k o u l u t u s l a i t o k s i s t a + k o u l u t u s l a i t o s + k o u l u t u s l a i t o s t e n + k o u l u t u s l a k i + k o u l u t u s l a k i a + k o u l u t u s l e i r e i l l e + k o u l u t u s l e i r e i l l ä + k o u l u t u s l e i r e j ä + k o u l u t u s l e i r i e n + k o u l u t u s l e i r i n ä + k o u l u t u s l e i r i t + k o u l u t u s m a h d o l l i s u u d e t + k o u l u t u s m a h d o l l i s u u k s i a + k o u l u t u s m a h d o l l i s u u k s i a a n + k o u l u t u s m a h d o l l i s u u k s i e n + k o u l u t u s m a h d o l l i s u u k s i i n + k o u l u t u s m a h d o l l i s u u k s i s s a + k o u l u t u s m a h d o l l i s u u t t a + k o u l u t u s m a k s u t + k o u l u t u s m a l l i + k o u l u t u s m a l l i a + k o u l u t u s m a l l i e n + k o u l u t u s m a l l i m m e + k o u l u t u s m a l l i n + k o u l u t u s m a l l i s t a + k o u l u t u s m a r k k i n a t + k o u l u t u s m a r k k i n o i d e n + k o u l u t u s m a r k k i n o i l l a + k o u l u t u s m a r k k i n o i n n i n + k o u l u t u s m a r k k i n o i t a + k o u l u t u s m a t e r i a a l i a + k o u l u t u s m a t e r i a a l i n + k o u l u t u s m e n e t e l m i e n + k o u l u t u s m e n e t e l m i s t ä + k o u l u t u s m e n e t e l m i ä + k o u l u t u s m e n e t e l m ä n ä + k o u l u t u s m e n o i s s a + k o u l u t u s m e n o j a + k o u l u t u s m e n o j e n + k o u l u t u s m e n o t + k o u l u t u s m o d u u l e i l l e + k o u l u t u s m o d u u l e j a + k o u l u t u s m u o d o t + k o u l u t u s m u o t o + k o u l u t u s m u o t o j a + k o u l u t u s m u o t o j e n + k o u l u t u s m u o t o o n + k o u l u t u s m ä ä r ä r a h a t + k o u l u t u s m ä ä r ä r a h o i h i n + k o u l u t u s m ä ä r ä r a h o j a + k o u l u t u s m ä ä r ä r a h o j a a n + k o u l u t u s n e u v o s t o n + k o u l u t u s n e u v o s t o s t a + k o u l u t u s n o r m i e n + k o u l u t u s n o r m i t + k o u l u t u s n ä k y m ä t + k o u l u t u s n ä k ö k o h d a t + k o u l u t u s n ä k ö k o h t a + k o u l u t u s n ä k ö k o h t a a + k o u l u t u s o h j e l m a + k o u l u t u s o h j e l m a a + k o u l u t u s o h j e l m a a n + k o u l u t u s o h j e l m a l l e + k o u l u t u s o h j e l m a m m e + k o u l u t u s o h j e l m a n + k o u l u t u s o h j e l m a s s a + k o u l u t u s o h j e l m a s t a + k o u l u t u s o h j e l m a t + k o u l u t u s o h j e l m i a + k o u l u t u s o h j e l m i a m m e + k o u l u t u s o h j e l m i e m m e + k o u l u t u s o h j e l m i e n + k o u l u t u s o h j e l m i i m m e + k o u l u t u s o h j e l m i i n + k o u l u t u s o h j e l m i i n s a + k o u l u t u s o h j e l m i l l a + k o u l u t u s o h j e l m i l l a m m e + k o u l u t u s o h j e l m i l l e + k o u l u t u s o h j e l m i s s a + k o u l u t u s o h j e l m i s s a a n + k o u l u t u s o h j e l m i s t a + k o u l u t u s o h j e l m i s t o j e n + k o u l u t u s o i k e u t t a + k o u l u t u s o l o j e n + k o u l u t u s o l o s u h t e i t a + k o u l u t u s o n g e l m a n s a + k o u l u t u s o n g e l m i i n + k o u l u t u s o p e r a a t i o + k o u l u t u s o p e r a a t i o i t a + k o u l u t u s o p e r a a t i o n + k o u l u t u s o p e r a a t i o t a + k o u l u t u s o p p a i d e n + k o u l u t u s o p p a i t a + k o u l u t u s o s a s s a + k o u l u t u s o s a s t o t + k o u l u t u s p a i k a n + k o u l u t u s p a i k a s t a + k o u l u t u s p a i k k a + k o u l u t u s p a i k k a a + k o u l u t u s p a i k k o j a + k o u l u t u s p a i k o i s t a + k o u l u t u s p a l v e l u + k o u l u t u s p a l v e l u i d e n + k o u l u t u s p a l v e l u i l l e m m e + k o u l u t u s p a l v e l u i s t a + k o u l u t u s p a l v e l u i t a + k o u l u t u s p a l v e l u j a + k o u l u t u s p a l v e l u j e n + k o u l u t u s p a l v e l u t + k o u l u t u s p a n o s + k o u l u t u s p a s s i + k o u l u t u s p a s s i a + k o u l u t u s p a s s i j ä r j e s t e l m ä + k o u l u t u s p a s s i n + k o u l u t u s p a s s i s t a + k o u l u t u s p o h j a n + k o u l u t u s p o l i i t t i n e n + k o u l u t u s p o l i i t t i s e n a + k o u l u t u s p o l i i t t i s e t + k o u l u t u s p o l i i t t i s i a + k o u l u t u s p o l i i t t i s t a + k o u l u t u s p o l i i t t i s t e n + k o u l u t u s p o l i t i i k a l l a + k o u l u t u s p o l i t i i k a n + k o u l u t u s p o l i t i i k a s s a + k o u l u t u s p o l i t i i k a s t a + k o u l u t u s p o l i t i i k k a + k o u l u t u s p o l i t i i k k a a + k o u l u t u s p o l i t i i k k a a n + k o u l u t u s p o l i t i i k k o j a + k o u l u t u s p o l i t i i k k o j e m m e + k o u l u t u s p o l i t i i k k o j e n + k o u l u t u s p r o f i i l e j a + k o u l u t u s p r o s e s s i a + k o u l u t u s p r o s e s s i i n + k o u l u t u s p r o s e s s i n + k o u l u t u s p r o s e s s i s s a + k o u l u t u s p y r k i m y k s i ä m m e + k o u l u t u s r a k e n n e t t a + k o u l u t u s r a k e n t e e n s a + k o u l u t u s r a k e n t e i s t a + k o u l u t u s r a t k a i s u j e n + k o u l u t u s r e s u r s s e j a + k o u l u t u s s e k t o r e i h i n + k o u l u t u s s e k t o r i + k o u l u t u s s e k t o r i a + k o u l u t u s s e k t o r i e n + k o u l u t u s s e k t o r i i n + k o u l u t u s s e k t o r i l l a + k o u l u t u s s e k t o r i l l e + k o u l u t u s s e k t o r i l t a + k o u l u t u s s e k t o r i n + k o u l u t u s s e m i n a a r e i s t a + k o u l u t u s s e m i n a a r e j a + k o u l u t u s s e m i n a a r i a + k o u l u t u s s i s ä l l ö s t ä + k o u l u t u s s o p i m u k s e n + k o u l u t u s s o p i m u k s i a + k o u l u t u s s t a n d a r d i e n + k o u l u t u s s t r a t e g i a + k o u l u t u s s t r a t e g i a a + k o u l u t u s s t r a t e g i a n + k o u l u t u s s t r a t e g i o i h i n + k o u l u t u s s t r a t e g i o i t a + k o u l u t u s s u h t e i d e n + k o u l u t u s s u u n n i t e l m a a + k o u l u t u s s u u n n i t e l m a a n + k o u l u t u s s u u n n i t e l m a n + k o u l u t u s s u u n n i t e l m i a + k o u l u t u s s u u n n i t e l m i a a n + k o u l u t u s s u u n t a u s t e n + k o u l u t u s s u u n t i e n + k o u l u t u s s y m p o s i u m i s t a + k o u l u t u s s ä ä n n ö k s i ä + k o u l u t u s s ä ä n n ö s t e n + k o u l u t u s s ä ä t i ö + k o u l u t u s s ä ä t i ö l l ä + k o u l u t u s s ä ä t i ö n + k o u l u t u s s ä ä t i ö s t ä + k o u l u t u s s ä ä t i ö t ä + k o u l u t u s s ä ä t i ö ö n + k o u l u t u s t a + k o u l u t u s t a a n + k o u l u t u s t a m m e + k o u l u t u s t a r j o n t a a + k o u l u t u s t a r p e e n + k o u l u t u s t a r p e e n s a + k o u l u t u s t a r p e i d e n + k o u l u t u s t a r p e i s t a + k o u l u t u s t a r v e + k o u l u t u s t a r v e t t a a n + k o u l u t u s t a s o + k o u l u t u s t a s o a + k o u l u t u s t a s o i h i n + k o u l u t u s t a s o i l l a + k o u l u t u s t a s o i l t a + k o u l u t u s t a s o j e m m e + k o u l u t u s t a s o j e n + k o u l u t u s t a s o l l e + k o u l u t u s t a s o n + k o u l u t u s t a s o n s a + k o u l u t u s t a s o o n + k o u l u t u s t a s o s s a + k o u l u t u s t a s o s t a + k o u l u t u s t a s o s t a a n + k o u l u t u s t a s o t + k o u l u t u s t a u s t a + k o u l u t u s t a u s t a a n s a + k o u l u t u s t a u s t a n + k o u l u t u s t a v a t + k o u l u t u s t a v o i t t e e t + k o u l u t u s t a v o i t t e i d e n + k o u l u t u s t a v o i t t e i s i i n + k o u l u t u s t a v o i t t e i t a a n + k o u l u t u s t e h t ä v ä + k o u l u t u s t e o r i a s s a n i + k o u l u t u s t i l a i s u u k s i a + k o u l u t u s t i l a i s u u t t a + k o u l u t u s t i l a n n e t t a + k o u l u t u s t i l a n t e e s t a a n + k o u l u t u s t i l a s t o j e n + k o u l u t u s t i l a s t o t + k o u l u t u s t i l o i s s a + k o u l u t u s t o d i s t u k s e n + k o u l u t u s t o d i s t u k s e s s a + k o u l u t u s t o d i s t u s + k o u l u t u s t o i m e n p i d e t t ä + k o u l u t u s t o i m e n p i t e i d e n + k o u l u t u s t o i m e n p i t e i s i i n + k o u l u t u s t o i m e n p i t e i s t ä + k o u l u t u s t o i m e n p i t e i t ä + k o u l u t u s t o i m e t + k o u l u t u s t o i m i a + k o u l u t u s t o i m i e n + k o u l u t u s t o i m i i n + k o u l u t u s t o i m i l l a + k o u l u t u s t o i m i n + k o u l u t u s t o i m i n n a n + k o u l u t u s t o i m i n n a s t a + k o u l u t u s t o i m i n t a a + k o u l u t u s t o i m i n t a a n + k o u l u t u s t o i m i n t a a n s a + k o u l u t u s t u e n + k o u l u t u s t u e s t a + k o u l u t u s t u k e a + k o u l u t u s t u k i + k o u l u t u s t u o t o s t e n + k o u l u t u s t y y p p i e n + k o u l u t u s t y ö + k o u l u t u s u n i o n i n + k o u l u t u s u u d i s t u k s e n + k o u l u t u s u u d i s t u k s i a + k o u l u t u s u u d i s t u s + k o u l u t u s u u d i s t u s p r o s e s s i i n + k o u l u t u s u u d i s t u s t a + k o u l u t u s u u d i s t u s t e n + k o u l u t u s v a a t i m u k s e t + k o u l u t u s v a a t i m u k s i a + k o u l u t u s v a a t i m u k s i a a n + k o u l u t u s v a a t i m u k s i i n + k o u l u t u s v a a t i m u k s i s s a + k o u l u t u s v a a t i m u k s i s t a + k o u l u t u s v a a t i m u s t e n + k o u l u t u s v a i h d o n + k o u l u t u s v a i h d o s s a + k o u l u t u s v a i h e e s s a + k o u l u t u s v a i h e i s s a + k o u l u t u s v a i h t o + k o u l u t u s v a i h t o a + k o u l u t u s v a i h t o e h t o j a + k o u l u t u s v a i h t o i h i n + k o u l u t u s v a i h t o j a + k o u l u t u s v a i h t o o n + k o u l u t u s v a j e + k o u l u t u s v a j e e s t a + k o u l u t u s v a l i o k u n n a n + k o u l u t u s v a l i o k u n n a s s a + k o u l u t u s v a r o i s t a + k o u l u t u s v e r k o i s s a + k o u l u t u s v e r k o n + k o u l u t u s v e r k o s t o + k o u l u t u s v e r k o s t o a + k o u l u t u s v e r k o s t o j a + k o u l u t u s v e r k o s t o j e n + k o u l u t u s v e r k o s t o s t a + k o u l u t u s v i r a s t o + k o u l u t u s v ä l i n e e n ä + k o u l u t u s v ä l i n e i t ä + k o u l u t u s v ä y l i e n + k o u l u t u s v ä y l i ä + k o u l u t u s v ä y l ä n s ä + k o u l u t u s y h t e i s k u n n a k s i + k o u l u t u s y h t e i s k u n t a a + k o u l u t u s y h t e i s t y ö + k o u l u t u s y h t e i s t y ö n + k o u l u t u s y h t e i s t y ö s t ä + k o u l u t u s y h t e i s t y ö t ä + k o u l u t u s y h t e i s ö + k o u l u t u s y m p ä r i s t ö l l e + k o u l u t u s y m p ä r i s t ö s t ä + k o u l u t u s y m p ä r i s t ö ö n + k o u l u t y y p i s t ä + k o u l u t y ö n + k o u l u u n + k o u l u v a i h t o + k o u l u v e l v o l l i s u u d e n + k o u l u v e l v o l l i s u u k s i e n s a + k o u l u v e r k o s t o + k o u l u v i e r a i l u t + k o u l u v i i k k o o n + k o u l u v i i k o n + k o u l u v u o d e n + k o u l u v u o s i + k o u l u v u o s i e n + k o u l u v u o s i n a + k o u l u v u o s i s t a + k o u l u v u o t t a + k o u l u v ä k i v a l t a + k o u l u v ä k i v a l t a a + k o u l u y h t e i s ö n + k o u l u y m p ä r i s t ö n + k o u l u y m p ä r i s t ö s s ä + k o u r a a + k o u r a a n t u n t u v a m p a a + k o u r a a n t u n t u v i a + k o u r a a n t u n t u v i n + k o u r a n + k o u r i i n t u n t u v a m p a a + k o u r i i n t u n t u v i a + k o u r i i n t u n t u v i i n + k o u r i s t u k s e n o m a i s e s t i + k o v a k a l v o + k o v a k o u r a i n e n + k o v a k o u r a i s e m p a a + k o v a k o u r a i s e n + k o v a k o u r a i s e t + k o v a k o u r a i s t e n + k o v a k s i + k o v a k u o r i a i s l a j i n + k o v a l e v y l l ä + k o v a l e v y n + k o v a l e v y y n + k o v a l i n j a i s e m p i + k o v a m e t a l l i + k o v a n + k o v a n a + k o v a o n n i s i a + k o v a o n n i s t a + k o v a o s a i s i m p i e n + k o v a o t t e i n e n + k o v a o t t e i s e s t i + k o v a o t t e i s e t + k o v a o t t e i s i a + k o v a o t t e i s t a + k o v a p a l k k a i s t e n + k o v a p i n t a i n e n + k o v a p i n t a i s i m m a t k i n + k o v a s t a + k o v a s t i k i n + k o v a s y d ä m i s e l l ä + k o v a t + k o v a ä ä n i s e s t i + k o v a ä ä n i s e s t ä + k o v a ä ä n i s i m p i ä + k o v a ä ä n i s i n + k o v e m m a l t a + k o v e m m a t + k o v e m m i k s i + k o v e m m i n + k o v e m p a a + k o v e m p i a + k o v e n e e + k o v e n e v a + k o v e n n e t a a n + k o v e n n e t t a v a + k o v e n t a m a a n + k o v e n t u m i s e s t a + k o v i a + k o v i e n + k o v i m m i n + k o v u u s a s t e e n + k p e l l e t + k r a n a a t e i n + k r a n a a t e i s s a + k r a n a a t i n h e i t i n + k r a n a a t i n h e i t i n i s k u t + k r a n a a t i n h e i t i n t e n + k r a n a a t i n h e i t i n t u l e n + k r a n a a t t i k o n e k i v ä ä r i + k r a v a t t i a + k r e a t i i n i k i n a a s i + k r e i k a k s i + k r e i k a l l a + k r e i k a l l e + k r e i k a n + k r e i k a n a k a n t t i + k r e i k a n k i e l i n e n + k r e i k a n k i e l i s e n + k r e i k a n k i e l i s e s t ä + k r e i k a n k i l p i k o n n a + k r e i k a n p a i m e n k o i r a + k r e i k a n p i h t a + k r e i k a n s a m m a k k o + k r e i k a n v e n ä l ä i s t e n + k r e i k a n v e n ä l ä i s t ä + k r e i k a s s a + k r e i k a s s a k i n + k r e i k a s t a + k r e i k k a a + k r e i k k a a k a a n + k r e i k k a a n + k r e i k k a l a i s a l u e e l l a + k r e i k k a l a i s e l t a + k r e i k k a l a i s e n + k r e i k k a l a i s e t + k r e i k k a l a i s i a + k r e i k k a l a i s i l l e + k r e i k k a l a i s i s t a + k r e i k k a l a i s j ä s e n + k r e i k k a l a i s j ä s e n i l l e + k r e i k k a l a i s k a t o l i n e n + k r e i k k a l a i s k a t o l i s i a + k r e i k k a l a i s k a t o l i s i k s i + k r e i k k a l a i s k a t o l i s t e n + k r e i k k a l a i s k a u s i e n + k r e i k k a l a i s k o l l e g a n i + k r e i k k a l a i s m i n i s t e r i n + k r e i k k a l a i s n y r k k e i l y + k r e i k k a l a i s o m i s t e i s e n + k r e i k k a l a i s o m i s t u k s e s s a + k r e i k k a l a i s o r t o d o k s i s e n + k r e i k k a l a i s o r t o d o k s i s t a + k r e i k k a l a i s o s a + k r e i k k a l a i s o s a n + k r e i k k a l a i s s y n t y i s e n + k r e i k k a l a i s t a + k r e i k k a l a i s t e n + k r e i k k a l a i s v ä e s t ö n + k r e i k k a l a i s v ä h e m m i s t ö + k r e i k k a l a i s v ä h e m m i s t ö j e n + k r e i k k a l a i s v ä h e m m i s t ö n + k r e i k k a l a i s v ä h e m m i s t ö ä + k r e i k k a l a i s v ä h e m m i s t ö ö n + k r e i k k a l a i s y h t i ö n + k r e i v e j ä + k r e i v i k u n n a n v a l t u u s t o a + k r e i v i k u n n a n v a l t u u s t o j a + k r e i v i k u n n a s s a n i + k r e i v i k u n n i l l a + k r e i v i k u n n i l l e + k r e i v i k u n t a + k r e i v i k u n t a j ä r j e s t e l m ä + k r e i v i k u n t a n e u v o s t o m m e + k r e i v i k u n t i a + k r e i v i k u n t i e n + k r e i v i s o t a + k r e n a t ö ö r i d i v i s i o o n a + k r e o l i k i e l i + k r e o l i p e r h e i t ä + k r e o l i t + k r e o l i v ä h e m m i s t ö + k r e s o l i p u n a i n e n + k r i i s e i h i n + k r i i s e i l l e + k r i i s e i l l ä + k r i i s e i s s ä + k r i i s e i s t ä + k r i i s e j ä + k r i i s i a a l l o n + k r i i s i a i k a a + k r i i s i a i k a n a + k r i i s i a i k o i n a + k r i i s i a i k o j a + k r i i s i a i k o j e n + k r i i s i a j a n + k r i i s i a j a n j a k s o + k r i i s i a j a n j a k s o i s t a + k r i i s i a j a n k o h d a l l a + k r i i s i a j a s t a + k r i i s i a l a + k r i i s i a l o i l t a + k r i i s i a l o i s t a + k r i i s i a l u e + k r i i s i a l u e e l l a + k r i i s i a l u e e l l e + k r i i s i a l u e e n + k r i i s i a l u e e t + k r i i s i a l u e i d e n + k r i i s i a l u e i l l a + k r i i s i a l u e i l l e + k r i i s i a l u e i l t a + k r i i s i a l u e i s i i n + k r i i s i a l u e i s t a + k r i i s i a l u e i t a + k r i i s i a p u a + k r i i s i a s i a k i r j o i s t a + k r i i s i a v u n + k r i i s i e h d o i s t a + k r i i s i e n + k r i i s i e n e h k ä i s y n + k r i i s i e n e h k ä i s y v e r k o s t o a + k r i i s i e n e h k ä i s y v e r k o s t o o n + k r i i s i e n h a l l i n n a n + k r i i s i e n h a l l i n n a s s a + k r i i s i e n h a l l i n n a s t a + k r i i s i e n h a l l i n t a + k r i i s i e n h a l l i n t a a + k r i i s i e n h a l l i n t a a n + k r i i s i e n h a l l i n t a k a t e g o r i a a n + k r i i s i e n h a l l i n t a s t r a t e g i a n + k r i i s i e n t o r j u n n a s s a + k r i i s i h a l l i n n o l l a + k r i i s i h a l l i n t o + k r i i s i h a l l i n t o k y k y ä m m e + k r i i s i h a r j o i t u k s i s s a + k r i i s i h a r j o i t u s + k r i i s i h e r k k y y d e s t ä + k r i i s i h e r k ä s t ä + k r i i s i h e t k e ä + k r i i s i h e t k i n ä + k r i i s i i n + k r i i s i j a k s o + k r i i s i j a k s o n + k r i i s i j ä r j e s t e l m ä + k r i i s i k a r t e l l e i l l a + k r i i s i k a r t o i t u s + k r i i s i k a r t t o j e n + k r i i s i k a u d e n + k r i i s i k a u s i + k r i i s i k a u t e n a + k r i i s i k a u t t a + k r i i s i k e s k u s t a + k r i i s i k e s k u s t e n + k r i i s i k o h d i s t a + k r i i s i k o h t e i d e n + k r i i s i k o k o u s + k r i i s i k o m i t e a n + k r i i s i k o m i t e a s s a + k r i i s i k s i + k r i i s i k u l t t u u r i l l a + k r i i s i k u u k a u s i e n + k r i i s i l i n j o i h i n + k r i i s i m a i d e n + k r i i s i m a i s s a + k r i i s i m a l l i n + k r i i s i m e k a n i s m e j a + k r i i s i m e k a n i s m i + k r i i s i m e k a n i s m i a + k r i i s i m e k a n i s m i e n + k r i i s i m e k a n i s m i i n + k r i i s i m e k a n i s m i n + k r i i s i m e k a n i s m i s t a + k r i i s i m m e + k r i i s i n + k r i i s i n a i h e u t t a j i s t a + k r i i s i n e h k ä i s y k e h y k s e n + k r i i s i n e h k ä i s y k e s k u s + k r i i s i n e h k ä i s y m e k a n i s m i + k r i i s i n e h k ä i s y n + k r i i s i n e h k ä i s y s s ä + k r i i s i n e h k ä i s y y n + k r i i s i n e h k ä i s y ä + k r i i s i n e s t o j ä r j e s t e l m i ä + k r i i s i n e s t o n + k r i i s i n e u v o t t e l u i s s a + k r i i s i n h a l l i n n a k s i + k r i i s i n h a l l i n n a l l e + k r i i s i n h a l l i n n a n + k r i i s i n h a l l i n n a n k i n + k r i i s i n h a l l i n n a s s a + k r i i s i n h a l l i n n a s t a + k r i i s i n h a l l i n n o l l a a n + k r i i s i n h a l l i n n o s s a + k r i i s i n h a l l i n t a + k r i i s i n h a l l i n t a a + k r i i s i n h a l l i n t a a n + k r i i s i n h a l l i n t a e l i m i i n + k r i i s i n h a l l i n t a h a r j o i t u k s i a + k r i i s i n h a l l i n t a j o u k k o j a + k r i i s i n h a l l i n t a j o u k k o j e n + k r i i s i n h a l l i n t a j o u k o i s s a + k r i i s i n h a l l i n t a j o u k o i s t a + k r i i s i n h a l l i n t a j o u k o t + k r i i s i n h a l l i n t a j ä r j e s t e l m i e n + k r i i s i n h a l l i n t a j ä r j e s t e l m i ä + k r i i s i n h a l l i n t a j ä r j e s t e l m ä + k r i i s i n h a l l i n t a j ä r j e s t e l m ä m m e + k r i i s i n h a l l i n t a j ä r j e s t e l m ä n + k r i i s i n h a l l i n t a j ä r j e s t e l m ä s s ä + k r i i s i n h a l l i n t a j ä r j e s t e l m ä t + k r i i s i n h a l l i n t a j ä r j e s t e l m ä ä + k r i i s i n h a l l i n t a j ä r j e s t e l y j e n + k r i i s i n h a l l i n t a j ä r j e s t e l y t + k r i i s i n h a l l i n t a k a p a s i t e e t t i a + k r i i s i n h a l l i n t a k e h y k s e s t ä + k r i i s i n h a l l i n t a k e h y s t ä + k r i i s i n h a l l i n t a k e i n o j e n + k r i i s i n h a l l i n t a k e s k u k s e n + k r i i s i n h a l l i n t a k e s k u s + k r i i s i n h a l l i n t a k e s k u s t e n + k r i i s i n h a l l i n t a k o m i t e a + k r i i s i n h a l l i n t a k o m i t e a s s a + k r i i s i n h a l l i n t a k o n s e p t i n + k r i i s i n h a l l i n t a k y k y + k r i i s i n h a l l i n t a k y k y ä ä n + k r i i s i n h a l l i n t a k y v y n + k r i i s i n h a l l i n t a l ä h e s t y m i s t a p a + k r i i s i n h a l l i n t a m a h d o l l i s u u d e t + k r i i s i n h a l l i n t a m a l l e i s t a + k r i i s i n h a l l i n t a m a l l i + k r i i s i n h a l l i n t a m e k a n i s m e i s t a + k r i i s i n h a l l i n t a m e k a n i s m e j a + k r i i s i n h a l l i n t a m e k a n i s m i + k r i i s i n h a l l i n t a m e k a n i s m i a + k r i i s i n h a l l i n t a m e k a n i s m i e n + k r i i s i n h a l l i n t a m e k a n i s m i i n + k r i i s i n h a l l i n t a m e k a n i s m i l l a + k r i i s i n h a l l i n t a m e k a n i s m i n + k r i i s i n h a l l i n t a m e k a n i s m i s t a + k r i i s i n h a l l i n t a m e k a n i s m i t + k r i i s i n h a l l i n t a m e n e t e l m i n + k r i i s i n h a l l i n t a m e n e t e l m ä s t ä + k r i i s i n h a l l i n t a m e n e t t e l y + k r i i s i n h a l l i n t a m e n e t t e l y j e n + k r i i s i n h a l l i n t a m e n e t t e l y t + k r i i s i n h a l l i n t a m ä ä r ä y s t e n + k r i i s i n h a l l i n t a n ä k ö k o h t i a + k r i i s i n h a l l i n t a o h j e l m a s s a + k r i i s i n h a l l i n t a o h j e l m i a + k r i i s i n h a l l i n t a o p e r a a t i o + k r i i s i n h a l l i n t a o p e r a a t i o i d e n + k r i i s i n h a l l i n t a o p e r a a t i o i h i n + k r i i s i n h a l l i n t a o p e r a a t i o i s s a + k r i i s i n h a l l i n t a o p e r a a t i o i t a + k r i i s i n h a l l i n t a o p e r a a t i o n + k r i i s i n h a l l i n t a o p e r a a t i o o n + k r i i s i n h a l l i n t a o p e r a a t i o t a + k r i i s i n h a l l i n t a o r g a n i s a a t i o k s i + k r i i s i n h a l l i n t a o r g a n i s a a t i o t a + k r i i s i n h a l l i n t a p o l i t i i k a n + k r i i s i n h a l l i n t a p o l i t i i k a s s a + k r i i s i n h a l l i n t a p o l i t i i k k a + k r i i s i n h a l l i n t a p o l i t i i k k a a m m e + k r i i s i n h a l l i n t a p u i t t e e t + k r i i s i n h a l l i n t a p y r k i m y k s i i n + k r i i s i n h a l l i n t a r a h a s t o + k r i i s i n h a l l i n t a r a h a s t o j e n + k r i i s i n h a l l i n t a r a h a s t o n + k r i i s i n h a l l i n t a r a h a s t o o n + k r i i s i n h a l l i n t a r a k e n t e i d e n + k r i i s i n h a l l i n t a s o l u + k r i i s i n h a l l i n t a s o l u n + k r i i s i n h a l l i n t a s t r a t e g i a + k r i i s i n h a l l i n t a s u u n n i t e l m i e n + k r i i s i n h a l l i n t a t e h t ä v i e n + k r i i s i n h a l l i n t a t e h t ä v i i n + k r i i s i n h a l l i n t a t e h t ä v i s s ä + k r i i s i n h a l l i n t a t e h t ä v ä + k r i i s i n h a l l i n t a t e h t ä v ä s s ä + k r i i s i n h a l l i n t a t e k n i i k k o j a + k r i i s i n h a l l i n t a t i l a n t e e s e e n + k r i i s i n h a l l i n t a t i l a n t e i s s a + k r i i s i n h a l l i n t a t i l a s s a + k r i i s i n h a l l i n t a t o i m e n p i t e i t ä + k r i i s i n h a l l i n t a t o i m e t + k r i i s i n h a l l i n t a t o i m i a + k r i i s i n h a l l i n t a t o i m i a m m e + k r i i s i n h a l l i n t a t o i m i e n + k r i i s i n h a l l i n t a t o i m i i n + k r i i s i n h a l l i n t a t o i m i n n a n + k r i i s i n h a l l i n t a t o i m i n n a s s a + k r i i s i n h a l l i n t a t o i m i n t a a + k r i i s i n h a l l i n t a t o i m i s t a + k r i i s i n h a l l i n t a v a l m i u k s i a + k r i i s i n h a l l i n t a v a l m i u k s i a a n + k r i i s i n h a l l i n t a v a l m i u k s i e n + k r i i s i n h a l l i n t a v a l m i u k s i i n + k r i i s i n h a l l i n t a v o i m a v a r o j a + k r i i s i n h a l l i n t a v o i m a v a r o j a a n + k r i i s i n h a l l i n t a v ä l i n e + k r i i s i n h a l l i n t a v ä l i n e e n + k r i i s i n h a l l i n t a v ä l i n e e n ä + k r i i s i n h a l l i n t a v ä l i n e e s e e n + k r i i s i n h a l l i n t a v ä l i n e e t + k r i i s i n h a l l i n t a v ä l i n e i d e n + k r i i s i n h a l l i n t a v ä l i n e i s t ä + k r i i s i n h a l l i n t a v ä l i n e i t ä + k r i i s i n h a l l i n t a y h t e i s t y ö n + k r i i s i n h a l l i n t a y h t e i s t y ö s t ä + k r i i s i n h a l l i n t a y k s i k ö n + k r i i s i n h a l l i n t o a + k r i i s i n h a l l i n t o m m e + k r i i s i n h a l l i t s i j o i t a + k r i i s i n h e t k i s t ä + k r i i s i n j ä l k e i s e e n + k r i i s i n j ä l k e i s e n + k r i i s i n j ä l k e i s e s s ä + k r i i s i n j ä l k e i s i ä + k r i i s i n j ä l k e i s t e n + k r i i s i n k o o r d i n o i n t i j ä r j e s t e l y i k s i + k r i i s i n r a t k a i s e m i s e s s a + k r i i s i n r a t k a i s u a + k r i i s i n r a t k a i s u j ä r j e s t e l m ä + k r i i s i n r a t k a i s u j ä r j e s t e l m ä ä n + k r i i s i n r a t k a i s u k e h y s + k r i i s i n r a t k a i s u k e h y s t ä + k r i i s i n r a t k a i s u m e k a n i s m i + k r i i s i n r a t k a i s u m e k a n i s m i a + k r i i s i n r a t k a i s u m e k a n i s m i k s i + k r i i s i n r a t k a i s u m e k a n i s m i n + k r i i s i n r a t k a i s u m e k a n i s m i s t a + k r i i s i n r a t k a i s u p u i t t e i s i i n + k r i i s i n r a t k a i s u y r i t y k s e t + k r i i s i n t o r j u n n a n + k r i i s i n t o r j u n n a s s a + k r i i s i n t o r j u n t a m e k a n i s m i n + k r i i s i n t o r j u n t a r a h a s t o o n + k r i i s i n t o r j u n t a s t r a t e g i o i d e n + k r i i s i n t o r j u n t a t o i m e t + k r i i s i n t o r j u n t a t o i m i a + k r i i s i n t o r j u n t a t o i m i e n + k r i i s i n t o r j u n t a v ä l i n e t t ä + k r i i s i n v a l v o n t a k y v y n + k r i i s i n v a s t a i n e n + k r i i s i n v a s t a i s e l l e + k r i i s i n v a s t a i s e n + k r i i s i n v a s t a i s e s t a + k r i i s i n v a s t a i s i a + k r i i s i n v a s t a i s i n a + k r i i s i n ä + k r i i s i n ä k y m ä + k r i i s i o h j e l m a l l a + k r i i s i o h j e l m a n + k r i i s i o l o i s s a + k r i i s i o l o s u h t e e t + k r i i s i o l o s u h t e i s s a + k r i i s i o p e r a a t i o i d e n + k r i i s i o p e r a a t i o i h i n + k r i i s i o p e r a a t i o i l l e + k r i i s i o p e r a a t i o o n + k r i i s i p a i k a l l a + k r i i s i p a k e t i s s a + k r i i s i p a k e t i s t a + k r i i s i p e s ä k e + k r i i s i p e s ä k e t t ä + k r i i s i p e s ä k k e e s e e n + k r i i s i p e s ä k k e e t + k r i i s i p e s ä k k e i d e n + k r i i s i p e s ä k k e i s i i n + k r i i s i p e s ä k k e i s s ä + k r i i s i p e s ä k k e i s t ä + k r i i s i p i s t e e n + k r i i s i r a h a s t o + k r i i s i r a h a s t o a + k r i i s i r a h a s t o n + k r i i s i r a h a s t o s t a + k r i i s i r e s i s t e n t t i e n + k r i i s i r y h m i e n + k r i i s i r y h m ä + k r i i s i r y h m ä n + k r i i s i r y h m ä ä + k r i i s i s i m u l o i n n i n + k r i i s i s s ä + k r i i s i s s ä m m e + k r i i s i s t r a t e g i a + k r i i s i s t ä + k r i i s i s u h d a n t e e s e e n + k r i i s i t + k r i i s i t a l o u s p a k e t i n + k r i i s i t a p a u k s e s s a + k r i i s i t a r p e e s e e n + k r i i s i t e k i j ö i d e n + k r i i s i t i e t o i n e n + k r i i s i t i e t o i s u u t t a + k r i i s i t i l a n + k r i i s i t i l a n n e + k r i i s i t i l a n n e t t a + k r i i s i t i l a n t e e k s i + k r i i s i t i l a n t e e n + k r i i s i t i l a n t e e s e e n + k r i i s i t i l a n t e e s s a + k r i i s i t i l a n t e e s t a + k r i i s i t i l a n t e e t + k r i i s i t i l a n t e i d e n + k r i i s i t i l a n t e i s i i n + k r i i s i t i l a n t e i s s a + k r i i s i t i l a n t e i s t a + k r i i s i t i l a n t e i t a + k r i i s i t i l a s s a + k r i i s i t i s l a u k s e e n + k r i i s i t i s l a u k s e n + k r i i s i t i s l a u k s e s t a + k r i i s i t i s l a u s + k r i i s i t i s l a u s t o i m e t + k r i i s i t o i m e n p i t e e t + k r i i s i t o i m e n p i t e i d e n + k r i i s i t o i m e n p i t e i s i i n + k r i i s i t o i m e n p i t e i t ä + k r i i s i t o i m e t + k r i i s i t o i m i a + k r i i s i t o i m i n n a n + k r i i s i t o i m i n t a m e k a n i s m i n + k r i i s i v a i h e t t a + k r i i s i v a l i o k u n n a n + k r i i s i v a l i o k u n n a s s a + k r i i s i v a l i o k u n t a + k r i i s i v a l m i u k s i e n + k r i i s i v a l m i u s m e k a n i s m i l l e + k r i i s i v a l m i u t t a + k r i i s i v a l t i o + k r i i s i v e r o + k r i i s i v e r o n a + k r i i s i v i e s t i n t ä + k r i i s i v u o s i + k r i i s i v u o s i e n + k r i i s i v u o s i n a + k r i i s i v ä l i n e i t ä + k r i i s i y k s i k k ö + k r i i s i y k s i k ö n + k r i i s i y k s i k ö s t ä + k r i i s i ä + k r i i t i k o i l l a + k r i i t t i s e e n + k r i i t t i s e k s i + k r i i t t i s e l l ä + k r i i t t i s e m m i k s i + k r i i t t i s e m m i n + k r i i t t i s e m m ä k s i + k r i i t t i s e m m ä l l ä + k r i i t t i s e m m ä n + k r i i t t i s e m m ä t + k r i i t t i s e m p i + k r i i t t i s e m p i ä + k r i i t t i s e m p ä ä + k r i i t t i s e m p ä ä n + k r i i t t i s e n + k r i i t t i s e n ä + k r i i t t i s e s s ä + k r i i t t i s e s t i k i n + k r i i t t i s e s t ä + k r i i t t i s e t + k r i i t t i s i l l ä + k r i i t t i s i m m i l l e + k r i i t t i s i m m i s t ä + k r i i t t i s i m m ä t + k r i i t t i s i m p i ä + k r i i t t i s i n + k r i i t t i s i n t ä + k r i i t t i s i n ä + k r i i t t i s i s t ä + k r i i t t i s i ä + k r i i t t i s t e n + k r i i t t i s t ä + k r i i t t i s y y d e s t ä n i + k r i i t t i s y y d e s t ä ä n + k r i k e t i n p e l a a j i l l e + k r i k e t t i d i p l o m a t i a + k r i k e t t i j o u k k u e + k r i k e t t i j o u k k u e e n + k r i k e t t i j o u k k u e i t a + k r i k e t t i n ä k ö k u l m a + k r i k e t t i o t t e l u + k r i k e t t i p a l l o j a + k r i l l i h y l j e + k r i l l i ö l j y + k r i m i n a a l i j ä r j e s t e l m ä n + k r i m i n a a l i j ä r j e s t e l m ä s s ä + k r i m i n a a l i p o l i t i i k a n + k r i m i n a a l i p o l i t i i k k a + k r i m i n a a l i p s y k o l o g i a + k r i m i n a l i s o i d a + k r i m i n a l i s o i m a a n + k r i m i n a l i s o i m i s e k s i + k r i m i n a l i s o i n n i s t a + k r i m i n a l i s o i n t i k a m p a n j a a + k r i m i n a l i s o i t a v a + k r i m i n a l i s o i t a v a k s i + k r i m i n a l i s o i t u + k r i m i n a l i s o i v a + k r i m i n a l i s o i v a a + k r i m i n t a t a a r i n + k r i s t a l l i a l a l l a + k r i s t a l l i k a l l o + k r i s t a l l i l u o l a + k r i s t a l l i n k i r k a s + k r i s t a l l i n k i r k a s t a + k r i s t a l l i n k i r k k a a k s i + k r i s t a l l i n k i r k k a a n + k r i s t a l l i n k i r k k a a n a + k r i s t a l l i n k i r k k a a t + k r i s t a l l i n k i r k k a i t a + k r i s t a l l i p a l a t s i + k r i s t a l l i p a l l o + k r i s t a l l i p a l l o a + k r i s t a l l i p a l l o n + k r i s t a l l i p a l l o o n + k r i s t a l l i p a l l o o n i + k r i s t a l l i p a l l o o n s a + k r i s t a l l i p a l l o s t a + k r i s t a l l i s u o l a + k r i s t a l l i v a n k i l a + k r i s t a l l i y ö + k r i s t i k u n n a n + k r i s t i l l i d e m o k r a a t i t + k r i s t i l l i s d e m o k r a a t e i l l a + k r i s t i l l i s d e m o k r a a t e i l l e + k r i s t i l l i s d e m o k r a a t e i s s a + k r i s t i l l i s d e m o k r a a t e i s t a + k r i s t i l l i s d e m o k r a a t i l l e + k r i s t i l l i s d e m o k r a a t i n + k r i s t i l l i s d e m o k r a a t i t + k r i s t i l l i s d e m o k r a a t i t h a n + k r i s t i l l i s d e m o k r a a t t e i h i n + k r i s t i l l i s d e m o k r a a t t e i n a + k r i s t i l l i s d e m o k r a a t t e j a + k r i s t i l l i s d e m o k r a a t t i + k r i s t i l l i s d e m o k r a a t t i e n + k r i s t i l l i s d e m o k r a a t t i k o l l e g a n i + k r i s t i l l i s d e m o k r a a t t i n a + k r i s t i l l i s d e m o k r a a t t i r y h m ä n + k r i s t i l l i s d e m o k r a a t t i s e n a + k r i s t i l l i s d e m o k r a a t t i s i l l a + k r i s t i l l i s d e m o k r a a t t i s i l t a + k r i s t i l l i s d e m o k r a t i a + k r i s t i l l i s e e n + k r i s t i l l i s e m p i + k r i s t i l l i s e n + k r i s t i l l i s e t + k r i s t i l l i s i ä + k r i s t i l l i s s o s i a l i s t i + k r i s t i l l i s s o s i a l i s t i s t a + k r i s t i l l i s t e n + k r i s t i n u s k o a + k r i s t i n u s k o n + k r i s t i n u s k o o n + k r i s t i n u s k o s s a + k r i s t i n u s k o s t a + k r i s t i t t y i h i n + k r i s t i t t y j e n + k r i s t i t t y j ä + k r i s t i t y i l l e + k r i s t i t y i s t ä + k r i s t i t y k s i + k r i s t i t y t + k r i s t i t y t h ä n + k r i t e e r e i d e n + k r i t e e r e i h i m m e + k r i t e e r e i h i n + k r i t e e r e i l l e + k r i t e e r e i l l ä + k r i t e e r e i s s ä + k r i t e e r e i s t ä + k r i t e e r e i t ä + k r i t e e r e j ä + k r i t e e r i a r v o t + k r i t e e r i e n + k r i t e e r i k s i + k r i t e e r i n ä + k r i t e e r i t + k r i t e e r i ä + k r i t i i k i l l ä + k r i t i i k i n + k r i t i i k i n s i e t o k y k y ä + k r i t i i k i s t ä + k r i t i i k i s t ä m m e + k r i t i i k i t t ä + k r i t i i k i t t ö m ä n ä + k r i t i i k k i i n + k r i t i i k k i m m e + k r i t i i k k i n i + k r i t i i k k i ä + k r i t i s o i d a + k r i t i s o i d a a n + k r i t i s o i d a a n p a + k r i t i s o i d e s s a a n + k r i t i s o i m a s t a + k r i t i s o i m a t t a + k r i t i s o i m i s t a + k r i t i s o i m m e + k r i t i s o i m m e k i n + k r i t i s o i n + k r i t i s o i n e e t + k r i t i s o i n u t + k r i t i s o i t a v a + k r i t i s o i t i i n + k r i t i s o i t u + k r i t i s o i v a t + k r i t i s o i v i i n + k r o a a t e i l l a + k r o a a t i t + k r o a a t t e j a + k r o a a t t i a l u e e n a + k r o a a t t i e n + k r o a a t t i h a l l i t u k s e n + k r o a a t t i l a s t a + k r o a a t t i t a l o n o m i s t a j a l l e + k r o a a t t i y h t e i s ö n + k r o a t i a a + k r o a t i a a n + k r o a t i a k i n + k r o a t i a l l a + k r o a t i a l l e + k r o a t i a n + k r o a t i a n k i e l i s e n + k r o a t i a n p a i m e n k o i r a + k r o a t i a s s a + k r o a t i a s t a + k r o k e t t i p e r u n o i t a + k r o k o t i i l i h a i + k r o k o t i i l i k l u b i s t a + k r o k o t i i l i m i e s + k r o k o t i i l i n + k r o k o t i i l i n k y y n e l e e t + k r o k o t i i l i n k y y n e l e i t ä + k r o k o t i i l i n k y y n e l i ä + k r o k o t i i l i n k y y n e l t e n + k r o k o t i i l i n v a r t i j a + k r o k o t i i l i v a r a a n i + k r o m i d i o k s i d i + k r o m i h a p p o + k r o m i h y d r o k s i d i + k r o m i k a r b o n y y l i + k r o m i l l a + k r o m i n + k r o m i p i n n o i t u k s e e n + k r o m i p i t o i s u u d e l l e + k r o m i s u l f a a t t i + k r o m i t a s o j e n + k r o m i t r i o k s i d i + k r o n i k a t + k r u s i f i k s i k e s k u s t e l u + k r u u n a a v a n + k r u u n a j a i s m e s s u + k r u u n u a + k r u u n u e e t t e r i t + k r u u n u e r a k k o h a u k k a + k r u u n u h i e t a k y y h k y + k r u u n u h y y p p ä + k r u u n u k o r k k i + k r u u n u k u r k i + k r u u n u k y y h k y t + k r u u n u m e d u u s a t + k r u u n u m u u r a + k r u u n u n j a l o k i v i + k r u u n u n o k i k a n a + k r u u n u n p e r i l l i n e n + k r u u n u n p r i n s s i + k r u u n u n p r i n s s i n + k r u u n u n s i i r t o m a a + k r u u n u n s i i r t o m a a t + k r u u n u s u v i k a k k a r a + k r u u n u t a p a k u l o + k r u u n u t i k a n k o n t t i + k r u u n u v i h e r k a i j a + k r y p t a u s r a j o i t u s t e n + k r y p t a u s t u o t t e e t + k r y p t a u s t u o t t e i d e n + k r y p t a u s t u o t t e i t a + k r y p t i s e n + k r y p t o g r a f i a l l e + k r y p t o k a l v i n i s t i t + k r y s o t i i l i a s b e s t i a + k r y s o t i i l i a s b e s t i k u i d u i l l e + k s e n o n l a m p p u + k s e n o n t e t r a f l u o r i d i + k s y l e n o l i o r a n s s i + k u d o k s e t + k u d o k s i a + k u d o s d i r e k t i i v i s t ä + k u d o s n e s t e + k u d o s p a n k k e i n a + k u d o s p a n k k i e n + k u d o s s o p e u t u v u u t t a + k u d o s t a + k u d o s t e k n o l o g i a + k u d o s t e k n o l o g i a a + k u d o s t e k n o l o g i a n + k u d o s t e k n o l o g i a s t a + k u d o s t e k n o l o g i a t u o t t e i t a + k u d o s t e n + k u d o s t e n k e r u u p r o s e s s i n + k u d o s t y y p p e j ä + k u d o s v i l j e l y + k u d o s v i l j e l y s s ä + k u h a n k e i t t ä j ä + k u h a n k e i t t ä j ä t + k u h e r r u s k u u k a u t e n n e + k u h e r r u s k u u k a u t t a + k u h i s e e + k u h m u j ä k ä l ä + k u h n i n + k u i h t u m i s t a + k u i h t u u + k u i k u i + k u i l u a + k u i l u a n a l y y s i + k u i l u j e n + k u i l u k a u p u n k i + k u i l u l l a + k u i l u n + k u i l u s t a + k u i n k a h a n + k u i t t a a m i n e n + k u i t u h a m p p u a + k u i t u h a m p p u u n + k u i t u k a n k a a t + k u i t u k a s v e i s t a + k u i t u k a s v i e n + k u i t u k o o s t u m u k s e n + k u i t u l i i t i n + k u i t u m a i s e t + k u i t u n i m i + k u i t u o p t i i k a n + k u i t u o p t i i k k a + k u i t u o p t i s i i n + k u i t u p e l l a v a l l e + k u i t u p e l l a v a n + k u i t u t y y p p i ä + k u i v a m a i t o a + k u i v a m a i t o t u o t t e i s s a + k u i v a n + k u i v a n n e e t + k u i v a r e h u a + k u i v a r e h u n + k u i v a r e h u t u o t a n n o s t a + k u i v a t e l a k k a + k u i v a t i s l a u s + k u i v a t t a m i s t a + k u i v a t t u j a + k u i v a t u n + k u i v a t u s m e n e t e l m ä t + k u i v a u s k a a p p i + k u i v a u s p r o s e s s i i n + k u i v a u s r u m p u + k u i v a u s r u m p u j a + k u i v a u s y k s i k k ö + k u i v a u s y k s i k ö n + k u i v i n a + k u i v u e s s a a n + k u i v u u d e n + k u i v u u d e n s e u r a n t a k e s k u s + k u i v u u d e s t a + k u i v u u s a l u e i l l a + k u i v u u s i n d e k s i + k u i v u u s j a k s o t + k u i v u u s k a u s i a + k u i v u u s k a u s i s t a + k u i v u u s o l o j a + k u i v u u s o n g e l m a + k u i v u u s o n g e l m a a n + k u i v u u s o n g e l m a n + k u i v u u s o n g e l m a s t a + k u i v u u s r i n t a m a + k u i v u u s s t r e s s i + k u i v u u s t a p a u s t e n + k u i v u u t e e n + k u j a n j u o k s u + k u k i s t a m a a n + k u k i s t a m i s t a + k u k i s t e t t a v a + k u k i s t e t t u + k u k i s t u m i s t a + k u k i s t u t t u a + k u k k a h ä m ä h ä k k i + k u k k a i s k i e l i + k u k k a i s t u t u k s i a + k u k k a i s v i i k o t + k u k k a i s v o i m a n + k u k k a k a a l i k o r v a t + k u k k a k a s v i h u o n e e l l e + k u k k a k a u p a t + k u k k a k i m p u n + k u k k a l a a t i k k o + k u k k a l a a t i k o n + k u k k a l o g o + k u k k a r o l l e + k u k k a r o n + k u k k a r o s t a + k u k k a s i a + k u k k a s i d o n t a + k u k k a u u n i l i n t u + k u k k a v i l j e l y a l a a + k u k k i a + k u k k i e n + k u k k i m i s a i k a a n + k u k k i v a n + k u k k i v i a + k u k k o t a i s t e l u i s t a + k u k k o t a i s t e l u j e n + k u k k u l a s t a + k u k k u r a k s i + k u k o i s t a a + k u k o i s t a m a a n + k u k o i s t a m i n e n + k u k o i s t a m i s t a + k u k o i s t a v a m m a s t a + k u k o i s t a v a t + k u k o i s t a v i m m i s t a + k u k o i s t u s t a a n + k u k o n k o r a l l i p u u + k u l i n a a r i n e n + k u l i s s e i s s a + k u l i s s e j a + k u l i s s i a v i o l i i t t o i h i n + k u l i s s i a v i o l i i t t o j a + k u l j e m m e k o + k u l j e n k i n + k u l j e t a a n + k u l j e t e t a a n + k u l j e t e t t a v i s t a + k u l j e t e t t i i n + k u l j e t t a a + k u l j e t t a a k s e e n + k u l j e t t a j a a + k u l j e t t a j a a n + k u l j e t t a j a k o h t a i s e e n + k u l j e t t a j a k o h t a i s e n + k u l j e t t a j a k o r t t i + k u l j e t t a j a k o r t t i e n + k u l j e t t a j a k o u l u t u k s e n + k u l j e t t a j a k o u l u t u s + k u l j e t t a j a k ä y t t ä y t y m i s e n + k u l j e t t a j a l l a + k u l j e t t a j a n + k u l j e t t a j a n t u t k i n t o + k u l j e t t a j a n v a s t u u k s i + k u l j e t t a j a p a r k a + k u l j e t t a j a p u l a n + k u l j e t t a j a r y h m i e n + k u l j e t t a j a r y h m i s s ä + k u l j e t t a j a r y h m ä l l e + k u l j e t t a j a s k a n d a a l i + k u l j e t t a j a t + k u l j e t t a j a t o d i s t u k s e n + k u l j e t t a j a t o d i s t u k s i a + k u l j e t t a j a t o d i s t u s + k u l j e t t a j a t o d i s t u s t a + k u l j e t t a j a y r i t t ä j i e n + k u l j e t t a j a y r i t t ä j i l l e + k u l j e t t a j i a + k u l j e t t a j i e n + k u l j e t t a j i i n + k u l j e t t a j i l l e + k u l j e t t a j i n a + k u l j e t t a j i s t a + k u l j e t t a m i s e e n + k u l j e t t a v a + k u l j e t t a v a n a + k u l j e t t a v i e n + k u l j e t t u + k u l j e t t u a a n + k u l j e t u k s e e n + k u l j e t u k s e l l a h a n + k u l j e t u k s e n + k u l j e t u k s e n a i k a i s e t + k u l j e t u k s e s t a + k u l j e t u k s e t + k u l j e t u k s i a + k u l j e t u k s i a a n + k u l j e t u k s i i n + k u l j e t u k s i s s a + k u l j e t u k s i s t a + k u l j e t u s a i k a + k u l j e t u s a i k a a + k u l j e t u s a i k a a n + k u l j e t u s a i k a t a u l u a + k u l j e t u s a i k o j a + k u l j e t u s a i k o j e n + k u l j e t u s a j a l l e + k u l j e t u s a j a n + k u l j e t u s a j a t + k u l j e t u s a j o i s s a + k u l j e t u s a j o i s t a + k u l j e t u s a j o n e u v o j e n + k u l j e t u s a l a + k u l j e t u s a l a a + k u l j e t u s a l a a n + k u l j e t u s a l a l l a + k u l j e t u s a l a l l e + k u l j e t u s a l a l t a + k u l j e t u s a l a n + k u l j e t u s a l a s t a + k u l j e t u s a l o i h i n + k u l j e t u s a l o i l l a + k u l j e t u s a l o j e n + k u l j e t u s a l u k s e e n + k u l j e t u s a l u k s e t + k u l j e t u s a l u k s i a + k u l j e t u s a l u k s i i n + k u l j e t u s a l u k s i l l a + k u l j e t u s a l u k s i l l e + k u l j e t u s a l u k s i s t a + k u l j e t u s a p u t o i m e s t a + k u l j e t u s a s i a k i r j a + k u l j e t u s a s i a k i r j a a + k u l j e t u s a s i o i d e n + k u l j e t u s a s i o i s t a + k u l j e t u s d i r e k t i i v i + k u l j e t u s d i r e k t i i v i n + k u l j e t u s d i r e k t i i v i ä + k u l j e t u s e h d o i s t a + k u l j e t u s e h d o t + k u l j e t u s e h t o i h i n + k u l j e t u s e h t o j e n + k u l j e t u s e l i n k e i n o l l e + k u l j e t u s h a n k k e i s i i n + k u l j e t u s h i n t o i h i n + k u l j e t u s h i n t o j a + k u l j e t u s i n f r a s t r u k t u u r e j a + k u l j e t u s i n f r a s t r u k t u u r i + k u l j e t u s i n f r a s t r u k t u u r i e n + k u l j e t u s j ä r j e s t e l m i e n + k u l j e t u s j ä r j e s t e l m i i n + k u l j e t u s j ä r j e s t e l m i s t ä + k u l j e t u s j ä r j e s t e l m i ä + k u l j e t u s j ä r j e s t e l m ä + k u l j e t u s j ä r j e s t e l m ä l l ä + k u l j e t u s j ä r j e s t e l m ä n + k u l j e t u s j ä r j e s t e l m ä s t ä + k u l j e t u s j ä r j e s t e l m ä t + k u l j e t u s j ä r j e s t e l m ä ä + k u l j e t u s j ä r j e s t e l m ä ä n + k u l j e t u s j ä r j e s t e l y + k u l j e t u s j ä r j e s t e l y i s t ä + k u l j e t u s k a l u s t o a + k u l j e t u s k a l u s t o n + k u l j e t u s k a l u s t o o n + k u l j e t u s k a p a s i t e e t i l t a a n + k u l j e t u s k a p a s i t e e t i n + k u l j e t u s k a p a s i t e e t i s s a + k u l j e t u s k a p a s i t e e t i s t a + k u l j e t u s k a p a s i t e e t t i + k u l j e t u s k a p a s i t e e t t i i n + k u l j e t u s k e t j u a + k u l j e t u s k e t j u i s t a + k u l j e t u s k e t j u n + k u l j e t u s k e t j u s s a + k u l j e t u s k e t j u u n + k u l j e t u s k i e l l o i s t a + k u l j e t u s k i e l t o + k u l j e t u s k i e l t o o n + k u l j e t u s k o n e + k u l j e t u s k o n e e n + k u l j e t u s k o n s e r n i e n + k u l j e t u s k o n t t i s a t a m a + k u l j e t u s k u s t a n n u k s e t + k u l j e t u s k u s t a n n u k s i a + k u l j e t u s k u s t a n n u k s i i n + k u l j e t u s k u s t a n n u k s i s s a + k u l j e t u s k u s t a n n u k s i s t a + k u l j e t u s k u s t a n n u s t e n + k u l j e t u s k y k y ä + k u l j e t u s k y s y m y k s e k s i + k u l j e t u s k ä y t ä n n ö t + k u l j e t u s k ä y t ä v i l l ä + k u l j e t u s l a a t i k o i t a + k u l j e t u s l a i n s ä ä d ä n n ö n + k u l j e t u s l a i n s ä ä d ä n t ö ä + k u l j e t u s l a k o s t a + k u l j e t u s l e n t o k o n e + k u l j e t u s l e n t o k o n e e s e e n + k u l j e t u s l e n t o k o n e h a n k k e e s s a + k u l j e t u s l e n t o k o n e i t a + k u l j e t u s l i i k e n n e + k u l j e t u s l i i k k e e s s ä k i n + k u l j e t u s l i i k k e e t + k u l j e t u s l i i k k e i d e n + k u l j e t u s l i i k k e i l l e + k u l j e t u s l i i k k e i s i i n + k u l j e t u s l i i k k e i t ä + k u l j e t u s l i n j a t + k u l j e t u s l u p a n s a + k u l j e t u s l u p i a + k u l j e t u s l u p i e n + k u l j e t u s m a h d o l l i s u u k s i e n + k u l j e t u s m a h d o l l i s u u k s i s t a + k u l j e t u s m a k s u i s s a + k u l j e t u s m a k s u i s t a + k u l j e t u s m a k s u j e n + k u l j e t u s m a k s u t + k u l j e t u s m a r k k i n a t + k u l j e t u s m a r k k i n o i d e n + k u l j e t u s m a r k k i n o i l l a + k u l j e t u s m a r k k i n o i t a + k u l j e t u s m a t k a n + k u l j e t u s m a t k a s t a + k u l j e t u s m a t k a t + k u l j e t u s m a t k o i l l a + k u l j e t u s m a t k o i s t a + k u l j e t u s m a t k o j a + k u l j e t u s m a t k o j e n + k u l j e t u s m e n e t e l m i e n + k u l j e t u s m e n e t e l m ä t + k u l j e t u s m e n e t t e l y i d e n + k u l j e t u s m u o d o i l l e + k u l j e t u s m u o d o i s s a + k u l j e t u s m u o d o i s t a + k u l j e t u s m u o d o l l a + k u l j e t u s m u o d o l l e + k u l j e t u s m u o d o n + k u l j e t u s m u o d o s t a + k u l j e t u s m u o d o t + k u l j e t u s m u o t o + k u l j e t u s m u o t o a + k u l j e t u s m u o t o i h i n + k u l j e t u s m u o t o i n a + k u l j e t u s m u o t o j a + k u l j e t u s m u o t o j a k a u m a n + k u l j e t u s m u o t o j e n + k u l j e t u s m u o t o n a + k u l j e t u s m u o t o o n + k u l j e t u s m u o t o y h d i s t e l m i e n + k u l j e t u s m ä ä r i e n + k u l j e t u s n o r m i t + k u l j e t u s o h j e l m a a + k u l j e t u s o h j e l m i a + k u l j e t u s o l o i h i n + k u l j e t u s o l o i s t a + k u l j e t u s o l o j a + k u l j e t u s o l o j e n + k u l j e t u s o l o s u h t e e t + k u l j e t u s o l o s u h t e i d e n + k u l j e t u s o l o s u h t e i s t a + k u l j e t u s o l o t + k u l j e t u s o n g e l m a a + k u l j e t u s o n g e l m a t + k u l j e t u s o n g e l m i a + k u l j e t u s o n g e l m i s t a + k u l j e t u s o p e r a a t i o i t a + k u l j e t u s o p e r a a t i o n + k u l j e t u s o p e r a a t i o t + k u l j e t u s p a k k a u k s i i n + k u l j e t u s p a l v e l u + k u l j e t u s p a l v e l u i d e n + k u l j e t u s p a l v e l u i h i n + k u l j e t u s p a l v e l u i l l e + k u l j e t u s p a l v e l u i s t a + k u l j e t u s p a l v e l u i t a + k u l j e t u s p a l v e l u j a + k u l j e t u s p a l v e l u j e n + k u l j e t u s p a l v e l u t + k u l j e t u s p a l v e l u y r i t y k s e n + k u l j e t u s p a l v e l u y r i t y s + k u l j e t u s p a n s s a r i a j o n e u v o + k u l j e t u s p o l i t i i k a n + k u l j e t u s p o l i t i i k k a + k u l j e t u s p o l i t i i k k a a + k u l j e t u s p r o s e s s i s s a + k u l j e t u s r a j o i t u k s i a + k u l j e t u s r a t k a i s u + k u l j e t u s r e i t e i l l e + k u l j e t u s r e i t e i l l ä + k u l j e t u s r e i t e i s t ä + k u l j e t u s r e i t i n + k u l j e t u s r e i t i t + k u l j e t u s r e i t t e i h i n + k u l j e t u s r e i t t e j ä + k u l j e t u s r e i t t e j ä m m e + k u l j e t u s r e i t t i + k u l j e t u s r e i t t i e n + k u l j e t u s r e i t t i n s ä + k u l j e t u s r e i t t i n ä + k u l j e t u s r e s u r s s e j a + k u l j e t u s s a a r t o a + k u l j e t u s s e k t o r i + k u l j e t u s s e k t o r i a + k u l j e t u s s e k t o r i i n + k u l j e t u s s e k t o r i l l a + k u l j e t u s s e k t o r i n + k u l j e t u s s o p i m u k s e n + k u l j e t u s s o p i m u s t a + k u l j e t u s s ä i l i ö + k u l j e t u s s ä i l i ö i d e n + k u l j e t u s s ä i l i ö i t ä + k u l j e t u s s ä i l i ö s t ä + k u l j e t u s s ä ä d ö k s e t + k u l j e t u s s ä ä n n ö k s e n s ä + k u l j e t u s s ä ä n n ö n + k u l j e t u s s ä ä n n ö t + k u l j e t u s s ä ä n t ö j e n + k u l j e t u s s ä ä n t ö j ä + k u l j e t u s t a + k u l j e t u s t a p a + k u l j e t u s t a p a a + k u l j e t u s t a p o j a + k u l j e t u s t a p o j e n + k u l j e t u s t a r k o i t u k s i i n + k u l j e t u s t a r p e e t + k u l j e t u s t a r p e i s t a + k u l j e t u s t a r p e i s t a a n + k u l j e t u s t a r p e i t a + k u l j e t u s t a r v e t t a + k u l j e t u s t a r v i k k e i d e n + k u l j e t u s t a v a n + k u l j e t u s t a v a t + k u l j e t u s t e i t ä + k u l j e t u s t e k n i i k k a a n + k u l j e t u s t e n + k u l j e t u s t e o l l i s u u d e l l e + k u l j e t u s t e o l l i s u u d e n + k u l j e t u s t e o l l i s u u d e s s a + k u l j e t u s t e o l l i s u u s + k u l j e t u s t e o r e e m a + k u l j e t u s t i l a n n e + k u l j e t u s t o i m i n t o j e n + k u l j e t u s t o t t u m u k s i a m m e + k u l j e t u s t u e n + k u l j e t u s t u k e a + k u l j e t u s t u k e e m m e + k u l j e t u s t u k i + k u l j e t u s t u k i j ä r j e s t e l m ä + k u l j e t u s t u r v a l l i s u u d e n + k u l j e t u s t u r v a l l i s u u t t a + k u l j e t u s t y ö n t e k i j ö i d e n + k u l j e t u s t y ö v ä e n + k u l j e t u s v a a t i m u s t e n + k u l j e t u s v a i h t o e h t o j a + k u l j e t u s v a i h t o e h t o j e n + k u l j e t u s v a l v o n t a m u o t o a + k u l j e t u s v a u n u a + k u l j e t u s v a u n u i s s a + k u l j e t u s v e r k k o j e n + k u l j e t u s v e r k k o m m e + k u l j e t u s v e r k o s t o + k u l j e t u s v e r k o s t o j e n s a + k u l j e t u s v e r k o s t o o n + k u l j e t u s v e r k o s t o t + k u l j e t u s v i r r a t + k u l j e t u s v ä l i n e + k u l j e t u s v ä l i n e i d e n + k u l j e t u s v ä l i n e i l l e + k u l j e t u s v ä l i n e i s i i n + k u l j e t u s v ä l i n e i s t ä + k u l j e t u s v ä l i n e i s t ö ä + k u l j e t u s v ä l i n e i t ä + k u l j e t u s v ä l i n e k o h t a i s i a + k u l j e t u s v ä y l i e n + k u l j e t u s v ä y l i ä + k u l j e t u s v ä y l ä n + k u l j e t u s v ä y l ä n ä + k u l j e t u s y h t e i s t y ö p r o s e s s i a + k u l j e t u s y h t e y k s i e n + k u l j e t u s y h t e y t e n ä + k u l j e t u s y h t i ö i d e n + k u l j e t u s y h t i ö i l l e + k u l j e t u s y h t i ö i l t ä + k u l j e t u s y h t i ö i t ä + k u l j e t u s y h t i ö l t ä + k u l j e t u s y h t i ö n + k u l j e t u s y h t i ö t + k u l j e t u s y k s i k k ö j ä + k u l j e t u s y k s i k ö i s s ä + k u l j e t u s y r i t t ä j i e n + k u l j e t u s y r i t t ä j i l l ä + k u l j e t u s y r i t t ä j ä t + k u l j e t u s y r i t y k s e n + k u l j e t u s y r i t y k s e t + k u l j e t u s y r i t y k s i i n + k u l j e t u s y r i t y k s i l l e + k u l j e t u s y r i t y k s i l l ä + k u l j e t u s y r i t y k s i l t ä + k u l j e t u s y r i t y k s i ä + k u l j e t u s y r i t y s + k u l j e t u s y r i t y s t e m m e + k u l j e t u s y r i t y s t e n + k u l j e t u s y r i t y s t e n k i n + k u l k e a + k u l k e e + k u l k e k a a + k u l k e k a a m m e + k u l k e m a a n + k u l k e m a t t a + k u l k e n e e t + k u l k e n u t + k u l k e u t u v a t + k u l k e v a a + k u l k e v a n + k u l k e v a s t a + k u l k e v a t + k u l k e v i s s a + k u l k u a + k u l k u a a l t o p u t k i + k u l k u e e s e e n + k u l k u e e t + k u l k u e s t e i t ä + k u l k u k a a v i o + k u l k u k a u p p i a s s e u d u l l a + k u l k u k e l p o i s i a + k u l k u k i s s a t + k u l k u k o i r a + k u l k u k o i r a n + k u l k u k o i r a t + k u l k u k o i r i a + k u l k u k o i r i e n + k u l k u k o r t t i + k u l k u l u p a + k u l k u l u p i a + k u l k u l u v a l l a n i + k u l k u m u o d o t + k u l k u n e u v o + k u l k u n e u v o j a + k u l k u n e u v o k a u p a t + k u l k u r e i t e i l l ä + k u l k u r e i t e i s t ä + k u l k u r e i t t i e n + k u l k u s e t + k u l k u t a u t e j a + k u l k u t a u t i + k u l k u t a u t i u h k a + k u l k u v a i h t o e h d o n + k u l k u v e s i l l ä + k u l k u v ä l i n e + k u l k u v ä l i n e e n ä + k u l k u v ä l i n e i d e n + k u l k u v ä l i n e i s i i n + k u l k u v ä l i n e i t ä + k u l k u v ä y l i i n + k u l k u v ä y l i l l ä m m e + k u l k u v ä y l ä ä + k u l k u y h t e y d e n + k u l k u y h t e y d e t + k u l k u y h t e y k s i e n + k u l k u y h t e y k s i ä + k u l k u y ö k k ö n e n + k u l l a n + k u l l a n h u u h d o n t a + k u l l a n h u u h t o j i e n + k u l l a n k a i v a j a t + k u l l a n k a i v a m i n e n + k u l l a n k a i v a m i s e e n + k u l l a n k a i v a m i s e s s a + k u l l a n k a i v a m i s e s t a + k u l l a n k a i v u s s a + k u l l a n k a i v u u n + k u l l a n t u o t t a j a + k u l l o i s e n k i n + k u l l o i s e t k i n + k u l m a h a m m a s + k u l m a h a m m a s l i h a s + k u l m a h i o m a k o n e + k u l m a i s t u i m e t + k u l m a k a u p p o j e n + k u l m a k i i h t y v y y s + k u l m a k i v e e n + k u l m a k i v e k s i + k u l m a k i v e n + k u l m a k i v e n ä + k u l m a k i v i + k u l m a k i v i e n + k u l m a k i v i s t ä + k u l m a k i v i ä + k u l m a l e h t i m i t t a r i + k u l m a l ä p i m i t t a + k u l m a l ä v i s t y s + k u l m a m i n u u t t i + k u l m a n o p e u s + k u l m a p i s t e i d e n + k u l m a r i t a r i y ö k k ö n e n + k u l m a s o h v a + k u l m a t a a j u u s + k u l m a t e t r a + k u l m i k k a a s t a + k u l m i l l e + k u l m i n a a t i o p i s t e + k u l m i n o i t u i + k u l m i n o i t u u k i n + k u l o h y y p p ä + k u l o k e r t t u l i + k u l o k i r v i n e n + k u l o p y y j u o k s i j a + k u l o r a s t a s + k u l o s a m m a l + k u l o t u k s e t + k u l t a a m i s e n + k u l t a b a s s i + k u l t a b u l b u l i + k u l t a d u b l e e + k u l t a e s i i n t y m i ä + k u l t a e s i n e e t + k u l t a f a r m a r i + k u l t a f a s a a n i + k u l t a h a m m a s + k u l t a h a m s t e r i + k u l t a h a p e r o + k u l t a h a t t u + k u l t a h e l m i l a v a s t a j a + k u l t a h e m p p o + k u l t a h e r u k k a + k u l t a h u n t u l a v a s t a j a + k u l t a i n e n n o u t a j a + k u l t a i s e k s i + k u l t a i s e n + k u l t a i s e n a + k u l t a i s e s t a + k u l t a i s e t + k u l t a i s i a + k u l t a i s t e n + k u l t a j u n a + k u l t a k a i v a u k s e t + k u l t a k a i v o k s e t + k u l t a k a i v o k s i a + k u l t a k a i v o k s i s s a + k u l t a k a i v o s t o i m i n n a s s a + k u l t a k a n i i n i k a l a + k u l t a k a n n a n + k u l t a k a n t a + k u l t a k a n t a a n + k u l t a k a r d i n a a l i + k u l t a k a s o j e n s a + k u l t a k a u d e l l a + k u l t a k a u l u s p i i s p a + k u l t a k a u l u s t i k k a + k u l t a k a u t t a + k u l t a k e l t a s i i p i + k u l t a k e r t t u l i + k u l t a k i r v i n e n + k u l t a k i u r u + k u l t a k o l i k k o + k u l t a k o l i k o i d e n + k u l t a k o n n a + k u l t a k o n t i a i s e t + k u l t a k r u u n u m e s i k k o + k u l t a k r u u n u t a n g a r a + k u l t a k u l m a p ö l l ö + k u l t a k u l m a s i r k k u + k u l t a k u o r e + k u l t a k u o r i a i n e n + k u l t a k u p o l i n e n + k u l t a k u r k k u h a r l e k i i n i + k u l t a k u r k k u l e p i n k ä i n e n + k u l t a k u r k k u v ä s t ä r ä k k i + k u l t a k u t o j a + k u l t a k u u m e + k u l t a k u u m e e l l a + k u l t a k u u m e e n + k u l t a k u u m e e s s a + k u l t a k y n ä l l ä + k u l t a k y s y m y k s e s s ä + k u l t a k ä r p ä n e n + k u l t a k ä r s ä m ö + k u l t a k ö y n n ö s + k u l t a l a k k i k u t o j a + k u l t a l a m p i + k u l t a l a v a s t a j a + k u l t a l e u k a p e r h o n e n + k u l t a l e v ä t + k u l t a l o i s t o k a i j a + k u l t a l u i k e r o + k u l t a m a i n a + k u l t a m a l m i e s i i n t y m i s s ä + k u l t a m a m o + k u l t a m a r k k a + k u l t a m i t a l e j a + k u l t a m i t a l i + k u l t a m i t a l i e n + k u l t a m i t a l i n + k u l t a m u n i a + k u l t a n a a m a m a i n a + k u l t a n a i n e n + k u l t a n i s k a k u t o j a + k u l t a n i s k a t i k k a + k u l t a n o k k a h e m p p o + k u l t a n o k k a t i m a l i + k u l t a n u o l i + k u l t a o k s i d i + k u l t a p a l l o k a l a + k u l t a p a n d a + k u l t a p a r a t i i s i k a i j a + k u l t a p e r ä + k u l t a p e r ä h a r l e k i i n i + k u l t a p e r ä k a s i k k i + k u l t a p i i k k i m a k r i l l i + k u l t a p i i s k u + k u l t a p i i s p a + k u l t a p i k k u m o n a r k k i + k u l t a p i s t i ä i s e t + k u l t a p o i k a + k u l t a p o s k i a m a t s o n i + k u l t a p y r s t ö + k u l t a p y r s t ö k o l i b r i + k u l t a p y r s t ö k o r a l l i a h v e n + k u l t a p y r s t ö l u i k e r o + k u l t a p y r s t ö m u r e e n a + k u l t a p y r s t ö s a t e e n k a a r i k a l a + k u l t a p ä ä m a i n a + k u l t a p ä ä t a n s s i j a + k u l t a p ö l l ö + k u l t a p ö l y ä + k u l t a r a h a + k u l t a r a h a n + k u l t a r a n n i k k o + k u l t a r a p u t o k k o + k u l t a r e u n a i s i i n + k u l t a r i k k o + k u l t a r i n t a + k u l t a r i n t a b u l b u l i + k u l t a r i n t a k a r d i n a a l i + k u l t a r i n t a k o t i n g a + k u l t a r i n t a s i r k k u + k u l t a r o u s k u + k u l t a r y n n ä k ö n + k u l t a r y n t ä y s + k u l t a s a d e k a s s i a + k u l t a s a h r a m i + k u l t a s a k a a l i + k u l t a s e e p r a k a l a + k u l t a s e l k ä k u t o j a + k u l t a s e l k ä p i i s p a + k u l t a s i e p p o k e r t t u + k u l t a s i i l i k a k t u s + k u l t a s i i p i b u l b u l i + k u l t a s i i p i k e r t t u l i + k u l t a s i i p i m e s i k k o + k u l t a s i i p i p e i p p o + k u l t a s i r k k u + k u l t a s u o n i + k u l t a t i i k e r i p e i p p o + k u l t a t i k k a + k u l t a t ä h d e n + k u l t a t ö y h t ö k a k a d u + k u l t a t ö y h t ö p i n g v i i n i + k u l t a t ö y h t ö s i r k k u + k u l t a t ö y h t ö t i k k a + k u l t a u k s e s t a + k u l t a u s t a + k u l t a u u n i l i n t u + k u l t a v a r a n t o a + k u l t a v a r a n t o i n a + k u l t a v a r a n t o j a + k u l t a v a r a n t o j a a n + k u l t a v a r a n t o j e n + k u l t a v a r a n t o n s a + k u l t a v a t s a l a v a s t a j a + k u l t a v a t s a t i k k a + k u l t a v a t s a v i h e l t ä j ä + k u l t t i e l o k u v a + k u l t t i o p e r e t t i + k u l t t u u r e i h i n + k u l t t u u r e i l l e + k u l t t u u r e i s t a + k u l t t u u r e j a + k u l t t u u r i a + k u l t t u u r i a a n + k u l t t u u r i a a r t e e t + k u l t t u u r i a a r t e i d e n + k u l t t u u r i a a r t e i s t a + k u l t t u u r i a a r t e i s t a m m e + k u l t t u u r i a a r t e i t a + k u l t t u u r i a i h e i s i i n + k u l t t u u r i a k t i v i t e e t t e j a + k u l t t u u r i a l a + k u l t t u u r i a l a a + k u l t t u u r i a l a a n + k u l t t u u r i a l a l l a + k u l t t u u r i a l a l l e + k u l t t u u r i a l a l t a + k u l t t u u r i a l a n + k u l t t u u r i a l a t + k u l t t u u r i a l o i l l a + k u l t t u u r i a l o i t e + k u l t t u u r i a l o i t t e i d e n + k u l t t u u r i a l o i t t e i s t a + k u l t t u u r i a l o i t t e i t a + k u l t t u u r i a l o j a + k u l t t u u r i a l o j e n + k u l t t u u r i a l u e + k u l t t u u r i a l u e e n + k u l t t u u r i a l u e e n a + k u l t t u u r i a l u e e s e e n + k u l t t u u r i a l u e i d e n + k u l t t u u r i a l u e i t a + k u l t t u u r i a l u e t t a + k u l t t u u r i a m m e + k u l t t u u r i a n t r o p o l o g i a + k u l t t u u r i a r e e n a + k u l t t u u r i a r t i k l a n + k u l t t u u r i a r v o + k u l t t u u r i a r v o a + k u l t t u u r i a r v o i h i n + k u l t t u u r i a r v o i l l e + k u l t t u u r i a r v o i s t a + k u l t t u u r i a r v o i s t a m m e + k u l t t u u r i a r v o j a + k u l t t u u r i a r v o j a a n + k u l t t u u r i a r v o j a m m e + k u l t t u u r i a r v o j e m m e + k u l t t u u r i a r v o j e n + k u l t t u u r i a r v o l t a a n + k u l t t u u r i a r v o m m e + k u l t t u u r i a r v o n s a + k u l t t u u r i a r v o o n + k u l t t u u r i a r v o t + k u l t t u u r i a s i a n t u n t e m u k s e n + k u l t t u u r i a s i a n t u n t i j o i t a + k u l t t u u r i a s i a t + k u l t t u u r i a s i o i d e n + k u l t t u u r i a s i o i h i n + k u l t t u u r i a s i o i l l e + k u l t t u u r i a s i o i s s a + k u l t t u u r i a s i o i s t a + k u l t t u u r i a s i o i t a + k u l t t u u r i b u d j e t i n + k u l t t u u r i b u d j e t t i + k u l t t u u r i b u d j e t t i a + k u l t t u u r i b u d j e t t i i n + k u l t t u u r i d i a l o g i a + k u l t t u u r i d i p l o m a a t t i n e n + k u l t t u u r i d i p l o m a t i a + k u l t t u u r i d i p l o m a t i a a + k u l t t u u r i d i p l o m a t i a a n + k u l t t u u r i d i p l o m a t i a l l a + k u l t t u u r i d i p l o m a t i a l l e + k u l t t u u r i d i p l o m a t i a n + k u l t t u u r i d y n a m i i k a n + k u l t t u u r i e l e m e n t t e j ä + k u l t t u u r i e l i m i l l e + k u l t t u u r i e l i m i ä + k u l t t u u r i e l i n k e i n o + k u l t t u u r i e l i n k e i n o t + k u l t t u u r i e l ä m ä + k u l t t u u r i e l ä m ä l l e + k u l t t u u r i e l ä m ä n + k u l t t u u r i e l ä m ä s s ä + k u l t t u u r i e l ä m ä s t ä + k u l t t u u r i e l ä m ä ä + k u l t t u u r i e l ä m ä ä n + k u l t t u u r i e m m e + k u l t t u u r i e n + k u l t t u u r i e n s a + k u l t t u u r i e n v ä l i n e n + k u l t t u u r i e n v ä l i s e l l ä + k u l t t u u r i e n v ä l i s e n + k u l t t u u r i e n v ä l i s e s t ä + k u l t t u u r i e n v ä l i s e t + k u l t t u u r i e n v ä l i s i ä + k u l t t u u r i e n v ä l i s t ä + k u l t t u u r i e r o + k u l t t u u r i e r o i h i n + k u l t t u u r i e r o i l l a + k u l t t u u r i e r o i s t a + k u l t t u u r i e r o j a + k u l t t u u r i e r o j e n + k u l t t u u r i e r o n + k u l t t u u r i e r o s t a + k u l t t u u r i e r o t + k u l t t u u r i e s i n e e n ä + k u l t t u u r i e s i n e e t + k u l t t u u r i e s i n e i d e n + k u l t t u u r i e s i n e i l l ä + k u l t t u u r i e s i n e i s t ä + k u l t t u u r i e s i n e i t ä + k u l t t u u r i e s t e i d e n + k u l t t u u r i e t u j a m m e + k u l t t u u r i e v o l u u t i o + k u l t t u u r i f i l o s o f i + k u l t t u u r i f i l o s o f i a a n s a + k u l t t u u r i f o o r u m i + k u l t t u u r i f o o r u m i a + k u l t t u u r i f o o r u m i e n + k u l t t u u r i f o o r u m i n + k u l t t u u r i f o o r u m i s s a + k u l t t u u r i h a h m o t + k u l t t u u r i h a l l i n n o n + k u l t t u u r i h a n k e + k u l t t u u r i h a n k e t t a + k u l t t u u r i h a n k k e e l l a + k u l t t u u r i h a n k k e e s e e n + k u l t t u u r i h a n k k e e t + k u l t t u u r i h a n k k e i d e n + k u l t t u u r i h a n k k e i d e n s a + k u l t t u u r i h a n k k e i l l e + k u l t t u u r i h a n k k e i s i i n + k u l t t u u r i h a n k k e i s t a + k u l t t u u r i h a n k k e i t a + k u l t t u u r i h e n k e ä + k u l t t u u r i h e n k i l ö i h i n + k u l t t u u r i h e n k i l ö i s t ä + k u l t t u u r i h i s t o r i a + k u l t t u u r i h i s t o r i a a + k u l t t u u r i h i s t o r i a l l i n e n + k u l t t u u r i h i s t o r i a l l i s e n + k u l t t u u r i h i s t o r i a n + k u l t t u u r i h y ö d y k e + k u l t t u u r i h y ö d y k k e e l l e + k u l t t u u r i h y ö d y k k e i d e n + k u l t t u u r i h y ö d y k k e i t ä + k u l t t u u r i i n + k u l t t u u r i j o h t a j i l l e + k u l t t u u r i j ä r j e s t y s t ä + k u l t t u u r i j ä r j e s t ö + k u l t t u u r i j ä r j e s t ö i l l e + k u l t t u u r i j ä r j e s t ö i s s ä + k u l t t u u r i j ä r j e s t ö j e n + k u l t t u u r i j ä r j e s t ö j ä + k u l t t u u r i j ä r j e s t ö n + k u l t t u u r i j ä r j e s t ö t + k u l t t u u r i k a a n o n + k u l t t u u r i k a m p a n j o i t a + k u l t t u u r i k a n s a + k u l t t u u r i k a n s a n a + k u l t t u u r i k a r t t a a + k u l t t u u r i k a s v a t u k s e n + k u l t t u u r i k a s v a t u s t a + k u l t t u u r i k a u p u n g e i k s i + k u l t t u u r i k a u p u n g i n + k u l t t u u r i k a u p u n g i t + k u l t t u u r i k a u p u n k e i h i n + k u l t t u u r i k a u p u n k e j a + k u l t t u u r i k a u p u n k i + k u l t t u u r i k a u p u n k i a + k u l t t u u r i k a u p u n k i e n + k u l t t u u r i k a u p u n k i t a p a h t u m a + k u l t t u u r i k a u p u n k i v u o d e n + k u l t t u u r i k e h i t y k s e l l e + k u l t t u u r i k e s k u k s e e n + k u l t t u u r i k e s k u k s e n + k u l t t u u r i k e s k u k s i a + k u l t t u u r i k e s k u s + k u l t t u u r i k i r j o a + k u l t t u u r i k i r j o n + k u l t t u u r i k o h t e e t + k u l t t u u r i k o h t e i d e n + k u l t t u u r i k o h t e i l l a + k u l t t u u r i k o h t e i s i i n + k u l t t u u r i k o h t e i t a + k u l t t u u r i k o k e m u k s e s t a + k u l t t u u r i k o k e m u k s i a + k u l t t u u r i k o k e m u k s i a m m e + k u l t t u u r i k o k e m u s + k u l t t u u r i k o k o e l m a t + k u l t t u u r i k o m i s s a a r i + k u l t t u u r i k o m i t e a + k u l t t u u r i k o m i t e a n + k u l t t u u r i k o n f l i k t e j a + k u l t t u u r i k o n t a k t e j a + k u l t t u u r i k o n t e k s t i s s a + k u l t t u u r i k o n t e k s t i s t a + k u l t t u u r i k u d o s t a + k u l t t u u r i k u u k a u s i + k u l t t u u r i k u u k a u s i h a n k e t t a + k u l t t u u r i k u u k a u t t a + k u l t t u u r i k y s y m y k s e n + k u l t t u u r i k y s y m y k s e t + k u l t t u u r i k y s y m y k s i i n + k u l t t u u r i k y s y m y k s i s s ä + k u l t t u u r i k y s y m y k s i s t ä + k u l t t u u r i k y s y m y k s i ä + k u l t t u u r i k y s y m y s + k u l t t u u r i k y s y m y s t e n + k u l t t u u r i k y s y m y s t ä + k u l t t u u r i k ä s i t e t t ä + k u l t t u u r i k ä s i t y k s e l l e + k u l t t u u r i l a i t o k s e n a + k u l t t u u r i l a i t o k s e s t a + k u l t t u u r i l a i t o k s e t + k u l t t u u r i l a i t o k s i i n + k u l t t u u r i l a i t o k s i l l e + k u l t t u u r i l a i t o k s i s s a + k u l t t u u r i l a i t o s t a + k u l t t u u r i l a i t o s t e n + k u l t t u u r i l i i k e + k u l t t u u r i l i i k k e i t ä + k u l t t u u r i l l a + k u l t t u u r i l l e + k u l t t u u r i l l e m m e + k u l t t u u r i l l i s e n + k u l t t u u r i l l i s e s t i + k u l t t u u r i l l i s i a + k u l t t u u r i l t a a n + k u l t t u u r i m a a + k u l t t u u r i m a a i l m a + k u l t t u u r i m a a i l m a a + k u l t t u u r i m a a i l m a n + k u l t t u u r i m a a n t i e d e + k u l t t u u r i m a h d o l l i s u u d e t + k u l t t u u r i m a i s e m a + k u l t t u u r i m a i s e m a a + k u l t t u u r i m a i s e m a a m m e + k u l t t u u r i m a i s e m a a n + k u l t t u u r i m a i s e m a l l e + k u l t t u u r i m a i s e m a m m e + k u l t t u u r i m a i s e m a n + k u l t t u u r i m a i s e m a t + k u l t t u u r i m a i s e m i e n + k u l t t u u r i m a i s e m i n e e n + k u l t t u u r i m a i s e m i s t a m m e + k u l t t u u r i m a i s t a + k u l t t u u r i m a l l i + k u l t t u u r i m a l l i e n + k u l t t u u r i m a l l i i n + k u l t t u u r i m a l l i n + k u l t t u u r i m a l l i t + k u l t t u u r i m a r k k i n a t + k u l t t u u r i m a r k k i n o i l l a + k u l t t u u r i m a r x i l a i s u u s + k u l t t u u r i m a t k a i l i j o i l l e + k u l t t u u r i m a t k a i l u + k u l t t u u r i m a t k a i l u a + k u l t t u u r i m a t k a i l u a a n + k u l t t u u r i m a t k a i l u l l e + k u l t t u u r i m a t k a i l u n + k u l t t u u r i m a t k a i l u r e i t t i e n + k u l t t u u r i m a t k a i l u s t a + k u l t t u u r i m a t k a i l u u n + k u l t t u u r i m e n o i s t a + k u l t t u u r i m i n i s t e r e i l t ä + k u l t t u u r i m i n i s t e r e i s t ä + k u l t t u u r i m i n i s t e r i + k u l t t u u r i m i n i s t e r i e n + k u l t t u u r i m i n i s t e r i l l e + k u l t t u u r i m i n i s t e r i n + k u l t t u u r i m i n i s t e r i n e u v o s t o s s a + k u l t t u u r i m i n i s t e r i t + k u l t t u u r i m i n i s t e r i ä + k u l t t u u r i m i n i s t e r i ö + k u l t t u u r i m i n i s t e r i ö i d e n + k u l t t u u r i m i n i s t e r i ö i t ä + k u l t t u u r i m i n i s t e r i ö k i n + k u l t t u u r i m i n i s t e r i ö n + k u l t t u u r i m m e + k u l t t u u r i m o n u m e n t i t + k u l t t u u r i m o n u m e n t t e j a + k u l t t u u r i m o n u m e n t t i + k u l t t u u r i m o s a i i k k i + k u l t t u u r i m o s a i i k k i a + k u l t t u u r i m u i s t o m e r k k e j ä + k u l t t u u r i m u i s t o m e r k k i e n + k u l t t u u r i m u o t o i h i n + k u l t t u u r i m u u r e j a + k u l t t u u r i m u u t o k s e n + k u l t t u u r i m u u t o s + k u l t t u u r i m u u t o s t a + k u l t t u u r i m ä ä r ä r a h o i s t a + k u l t t u u r i n + k u l t t u u r i n e n k i n + k u l t t u u r i n e u v o s t o + k u l t t u u r i n e u v o s t o n + k u l t t u u r i n e u v o s t o s s a + k u l t t u u r i n o r m e j a + k u l t t u u r i n s a + k u l t t u u r i n t u t k i m u s + k u l t t u u r i n v a i h d o s s a + k u l t t u u r i n v a s t a i s t a + k u l t t u u r i n ä k e m y s + k u l t t u u r i n ä k ö k o h d a t + k u l t t u u r i n ä k ö k o h d i l l a + k u l t t u u r i n ä k ö k o h d i s t a + k u l t t u u r i n ä k ö k o h t a + k u l t t u u r i n ä k ö k o h t a a + k u l t t u u r i n ä k ö k o h t i a + k u l t t u u r i n ä k ö k o h t i e n + k u l t t u u r i n ä k ö k o h t i i n + k u l t t u u r i n ä k ö k u l m a + k u l t t u u r i n ä k ö k u l m a n + k u l t t u u r i n ä y t t ä m ö t + k u l t t u u r i o h j e l m a + k u l t t u u r i o h j e l m a a + k u l t t u u r i o h j e l m a a m m e + k u l t t u u r i o h j e l m a a n + k u l t t u u r i o h j e l m a l l e + k u l t t u u r i o h j e l m a m m e + k u l t t u u r i o h j e l m a n + k u l t t u u r i o h j e l m a s s a + k u l t t u u r i o h j e l m a s t a + k u l t t u u r i o h j e l m a s ä ä t i ö + k u l t t u u r i o h j e l m a t + k u l t t u u r i o h j e l m i a + k u l t t u u r i o h j e l m i e n + k u l t t u u r i o h j e l m i i n + k u l t t u u r i o h j e l m i l l a + k u l t t u u r i o h j e l m i l l e + k u l t t u u r i o h j e l m i s s a + k u l t t u u r i o h j e l m i s t a + k u l t t u u r i o i k e u d e t + k u l t t u u r i o i k e u k s i e n + k u l t t u u r i o i k e u k s i s t a + k u l t t u u r i o i k e u s s o p i m u k s i i n + k u l t t u u r i o l o s u h t e i s i i n + k u l t t u u r i o m a i s u u d e n + k u l t t u u r i o m a i s u u s + k u l t t u u r i o m a i s u u t e n a + k u l t t u u r i o m a i s u u t t a + k u l t t u u r i o n g e l m a s t a + k u l t t u u r i o n g e l m a t + k u l t t u u r i o n g e l m i e n + k u l t t u u r i o p p i m i s e n + k u l t t u u r i o r g a n i s a a t i o i s s a + k u l t t u u r i o r g a n i s a a t i o i t a + k u l t t u u r i o r g a n i s a a t i o t + k u l t t u u r i o s i a + k u l t t u u r i p a k e t i s t a + k u l t t u u r i p a k o t t e i t a + k u l t t u u r i p a l k i n t o j a + k u l t t u u r i p a l v e l u i d e n + k u l t t u u r i p a l v e l u i h i n + k u l t t u u r i p a l v e l u i l l e + k u l t t u u r i p a l v e l u i t a + k u l t t u u r i p a l v e l u j a + k u l t t u u r i p a l v e l u j e m m e + k u l t t u u r i p a l v e l u j e n + k u l t t u u r i p a l v e l u k s i + k u l t t u u r i p a l v e l u t + k u l t t u u r i p e r i n n e + k u l t t u u r i p e r i n n e t t ä + k u l t t u u r i p e r i n n ö l l e + k u l t t u u r i p e r i n n ö l l e m m e + k u l t t u u r i p e r i n n ö n + k u l t t u u r i p e r i n n ö n k i n + k u l t t u u r i p e r i n n ö s s ä + k u l t t u u r i p e r i n n ö s t ä + k u l t t u u r i p e r i n n ö s t ä m m e + k u l t t u u r i p e r i n n ö t + k u l t t u u r i p e r i n t e e m m e + k u l t t u u r i p e r i n t e e n + k u l t t u u r i p e r i n t e e s e e n + k u l t t u u r i p e r i n t e e t + k u l t t u u r i p e r i n t e i d e n + k u l t t u u r i p e r i n t e i s i i n + k u l t t u u r i p e r i n t e i s s ä + k u l t t u u r i p e r i n t e i s t ä + k u l t t u u r i p e r i n t e i t t e n s ä + k u l t t u u r i p e r i n t e i t ä + k u l t t u u r i p e r i n t e i t ä ä n + k u l t t u u r i p e r i n t ö + k u l t t u u r i p e r i n t ö a l a l l a + k u l t t u u r i p e r i n t ö a l o i t t e i t a + k u l t t u u r i p e r i n t ö h a n k e + k u l t t u u r i p e r i n t ö h a n k k e i s i i n + k u l t t u u r i p e r i n t ö k e s k u k s e n + k u l t t u u r i p e r i n t ö k o h t e i d e n + k u l t t u u r i p e r i n t ö k o h t e i l l e + k u l t t u u r i p e r i n t ö k o h t e i s i i n + k u l t t u u r i p e r i n t ö k o h t e i t a + k u l t t u u r i p e r i n t ö l e i m a n + k u l t t u u r i p e r i n t ö l u e t t e l o o n + k u l t t u u r i p e r i n t ö m m e + k u l t t u u r i p e r i n t ö n s ä + k u l t t u u r i p e r i n t ö n ä + k u l t t u u r i p e r i n t ö o h j e l m a n + k u l t t u u r i p e r i n t ö o h j e l m a s t a + k u l t t u u r i p e r i n t ö p a l k i n t o a + k u l t t u u r i p e r i n t ö t u n n u k s e k s i + k u l t t u u r i p e r i n t ö t u n n u k s e l l a + k u l t t u u r i p e r i n t ö t u n n u k s e l l e + k u l t t u u r i p e r i n t ö t u n n u k s e n + k u l t t u u r i p e r i n t ö t u n n u k s e s t a + k u l t t u u r i p e r i n t ö t u n n u s + k u l t t u u r i p e r i n t ö t u n n u s a l o i t t e e n + k u l t t u u r i p e r i n t ö t u n n u s o h j e l m a a n + k u l t t u u r i p e r i n t ö t u n n u s t a + k u l t t u u r i p e r i n t ö v a r a t + k u l t t u u r i p e r i n t ö v ä i t t e e n + k u l t t u u r i p e r i n t ö ä + k u l t t u u r i p e r i n t ö ä m m e + k u l t t u u r i p e r i n t ö ä ä n + k u l t t u u r i p e r i n t ö ö m m e + k u l t t u u r i p e r i n t ö ö n + k u l t t u u r i p e r i n t ö ö n s ä + k u l t t u u r i p e r s o o n a l l i s u u k s i a + k u l t t u u r i p e r u s t a a + k u l t t u u r i p e r u s t a s t a + k u l t t u u r i p e r u s t e i s t a + k u l t t u u r i p i i r e i s s ä + k u l t t u u r i p i i r e i s s ä m m e + k u l t t u u r i p i i r i ä + k u l t t u u r i p i i r t e e t + k u l t t u u r i p i i r t e i s t ä + k u l t t u u r i p i i r t e i t ä + k u l t t u u r i p o h j a + k u l t t u u r i p o i k k e u k s e n + k u l t t u u r i p o i k k e u s + k u l t t u u r i p o i k k e u s k y s y m y k s e e n + k u l t t u u r i p o i k k e u s t a a n + k u l t t u u r i p o l i i t i k k o n a + k u l t t u u r i p o l i i t t i n e n + k u l t t u u r i p o l i i t t i s e e n + k u l t t u u r i p o l i i t t i s e l t a + k u l t t u u r i p o l i i t t i s e n + k u l t t u u r i p o l i i t t i s e s t a + k u l t t u u r i p o l i i t t i s e s t i + k u l t t u u r i p o l i i t t i s e t + k u l t t u u r i p o l i i t t i s i a + k u l t t u u r i p o l i i t t i s i s s a + k u l t t u u r i p o l i i t t i s i s t a + k u l t t u u r i p o l i i t t i s t e n + k u l t t u u r i p o l i t i i k a l l a + k u l t t u u r i p o l i t i i k a l l e + k u l t t u u r i p o l i t i i k a l t a + k u l t t u u r i p o l i t i i k a n + k u l t t u u r i p o l i t i i k a s s a + k u l t t u u r i p o l i t i i k a s s a m m e + k u l t t u u r i p o l i t i i k a s t a + k u l t t u u r i p o l i t i i k a t + k u l t t u u r i p o l i t i i k k a + k u l t t u u r i p o l i t i i k k a a + k u l t t u u r i p o l i t i i k k a a m m e + k u l t t u u r i p o l i t i i k k a a n + k u l t t u u r i p o l i t i i k k a a n s a + k u l t t u u r i p o l i t i i k k a m m e + k u l t t u u r i p o l i t i i k k a n s a + k u l t t u u r i p o l i t i i k k o j a + k u l t t u u r i p o l i t i i k k o j a a n + k u l t t u u r i p o l i t i i k k o j e n + k u l t t u u r i p o l i t i i k o i l l e + k u l t t u u r i p o t e n t i a a l i a + k u l t t u u r i p r o s e s s i + k u l t t u u r i p u i t e o h j e l m a n + k u l t t u u r i p u u n + k u l t t u u r i p ä i v ä ä + k u l t t u u r i p ä ä k a u p u n g e i k s i + k u l t t u u r i p ä ä k a u p u n g e i s t a + k u l t t u u r i p ä ä k a u p u n g i k s i + k u l t t u u r i p ä ä k a u p u n g i l l a + k u l t t u u r i p ä ä k a u p u n g i n + k u l t t u u r i p ä ä k a u p u n g i s s a + k u l t t u u r i p ä ä k a u p u n g i s t a + k u l t t u u r i p ä ä k a u p u n g i t + k u l t t u u r i p ä ä k a u p u n k e i h i n + k u l t t u u r i p ä ä k a u p u n k e j a + k u l t t u u r i p ä ä k a u p u n k i + k u l t t u u r i p ä ä k a u p u n k i a + k u l t t u u r i p ä ä k a u p u n k i e n + k u l t t u u r i p ä ä k a u p u n k i h a n k e + k u l t t u u r i p ä ä k a u p u n k i h a n k k e e n + k u l t t u u r i p ä ä k a u p u n k i i n + k u l t t u u r i p ä ä k a u p u n k i m a l l i n + k u l t t u u r i p ä ä k a u p u n k i n a + k u l t t u u r i p ä ä k a u p u n k i o h j e l m a + k u l t t u u r i p ä ä k a u p u n k i t a p a h t u m a a + k u l t t u u r i p ä ä k a u p u n k i t o i m i n n a n + k u l t t u u r i p ä ä k a u p u n k i t o i m i n t a + k u l t t u u r i p ä ä k a u p u n k i t o i m i n t a a n + k u l t t u u r i p ä ä k a u p u n k i v u o d e n + k u l t t u u r i p ä ä k a u p u n k i v u o t t a + k u l t t u u r i r a h a s t o + k u l t t u u r i r a h a s t o a + k u l t t u u r i r a h a s t o n + k u l t t u u r i r a j a t + k u l t t u u r i r a j o i s t a + k u l t t u u r i r a j o j e n + k u l t t u u r i r a k e n n u k s i i n + k u l t t u u r i r a k e n t e i d e n + k u l t t u u r i r e i t i t + k u l t t u u r i r e i t t e j ä + k u l t t u u r i r e i t t i + k u l t t u u r i r e l a t i v i s m i + k u l t t u u r i r e l a t i v i s m i a + k u l t t u u r i r e l a t i v i s m i l l a + k u l t t u u r i r e l a t i v i s m i l l e + k u l t t u u r i r e l a t i v i s m i n + k u l t t u u r i r e l a t i v i s m i n s a + k u l t t u u r i r e l a t i v i s t i t + k u l t t u u r i r e s u r s s e i h i n + k u l t t u u r i r e s u r s s e j a + k u l t t u u r i r e s u r s s i e m m e + k u l t t u u r i r i k k a u s + k u l t t u u r i r i k k a u t t a + k u l t t u u r i r i n t a m a l l a + k u l t t u u r i r y h m i i n + k u l t t u u r i r y h m i ä + k u l t t u u r i s a a r t o + k u l t t u u r i s e e n + k u l t t u u r i s e i k o i s t a + k u l t t u u r i s e k s i + k u l t t u u r i s e k t o r e i t a a n + k u l t t u u r i s e k t o r i + k u l t t u u r i s e k t o r i l l e + k u l t t u u r i s e k t o r i n + k u l t t u u r i s e l l e + k u l t t u u r i s e n + k u l t t u u r i s e n a + k u l t t u u r i s e s t a + k u l t t u u r i s e t + k u l t t u u r i s h o k k i + k u l t t u u r i s i a + k u l t t u u r i s i d o n n a i n e n + k u l t t u u r i s i d o n n a i s e s t a + k u l t t u u r i s i d o n n a i s i a + k u l t t u u r i s i i n + k u l t t u u r i s i j o i t u k s i a + k u l t t u u r i s i s t a + k u l t t u u r i s i s ä l l ö n + k u l t t u u r i s i s ä l l ö s t ä + k u l t t u u r i s i s ä l l ö t + k u l t t u u r i s i s ä l t ö + k u l t t u u r i s i s ä l t ö j e n + k u l t t u u r i s i s ä l t ö ä + k u l t t u u r i s i s ä l t ö ö n + k u l t t u u r i s i t e e t + k u l t t u u r i s i t e i d e n + k u l t t u u r i s i t e i t ä + k u l t t u u r i s o k k i a + k u l t t u u r i s o p i m u k s e l l a + k u l t t u u r i s o p i m u k s e s t a + k u l t t u u r i s o t a + k u l t t u u r i s s a + k u l t t u u r i s t a + k u l t t u u r i s t a a n + k u l t t u u r i s t a n d a r d e i s t a + k u l t t u u r i s t e n + k u l t t u u r i s t r a t e g i a + k u l t t u u r i s t r a t e g i a a + k u l t t u u r i s u h t e e t + k u l t t u u r i s u h t e i d e n + k u l t t u u r i s u h t e i d e n s a + k u l t t u u r i s u h t e i s i i n + k u l t t u u r i s u h t e i s t a + k u l t t u u r i s u h t e i t a + k u l t t u u r i s y i s t ä + k u l t t u u r i s y m b o l e j a + k u l t t u u r i s y m b o l i e n + k u l t t u u r i s ä ä t i ö + k u l t t u u r i s ä ä t i ö i d e n + k u l t t u u r i s ä ä t i ö i t ä + k u l t t u u r i s ä ä t i ö n + k u l t t u u r i t + k u l t t u u r i t a h o j e n + k u l t t u u r i t a i d o t + k u l t t u u r i t a i s t e l u + k u l t t u u r i t a i s t e l u n a + k u l t t u u r i t a l o + k u l t t u u r i t a l o u d e k s i + k u l t t u u r i t a l o u t e e n + k u l t t u u r i t a p a h t u m a + k u l t t u u r i t a p a h t u m a a n + k u l t t u u r i t a p a h t u m a l l e + k u l t t u u r i t a p a h t u m a t + k u l t t u u r i t a p a h t u m i a + k u l t t u u r i t a p a h t u m i e n + k u l t t u u r i t a p a h t u m i i n + k u l t t u u r i t a p a h t u m i l l e + k u l t t u u r i t a p a h t u m i s s a + k u l t t u u r i t a p a h t u m i s t a + k u l t t u u r i t a p o j e n + k u l t t u u r i t a r j o n n a l l a + k u l t t u u r i t a r j o n n a l l e + k u l t t u u r i t a r j o n n a n + k u l t t u u r i t a r j o n t a + k u l t t u u r i t a r j o n t a a + k u l t t u u r i t a r j o n t a a n + k u l t t u u r i t a r k o i t u k s i i n + k u l t t u u r i t a r p e i s i i n + k u l t t u u r i t a u s t a + k u l t t u u r i t a u s t a a + k u l t t u u r i t a u s t a a n + k u l t t u u r i t a u s t a a n s a + k u l t t u u r i t a u s t a n s a + k u l t t u u r i t a u s t a s t a a n + k u l t t u u r i t a u s t o j a + k u l t t u u r i t a v a r o i t a + k u l t t u u r i t a v o i t t e e m m e + k u l t t u u r i t a v o i t t e e t + k u l t t u u r i t e k i j ä + k u l t t u u r i t e k i j ä s t ä + k u l t t u u r i t e k i j ä t + k u l t t u u r i t e k i j ö i d e n + k u l t t u u r i t e k i j ö i s t ä + k u l t t u u r i t e k i j ö i t ä + k u l t t u u r i t e k o j e n + k u l t t u u r i t e o k s i a + k u l t t u u r i t e o l l i s u u d e l l a + k u l t t u u r i t e o l l i s u u d e l l e + k u l t t u u r i t e o l l i s u u d e n + k u l t t u u r i t e o l l i s u u d e s s a + k u l t t u u r i t e o l l i s u u d e s t a + k u l t t u u r i t e o l l i s u u d e t + k u l t t u u r i t e o l l i s u u k s i a + k u l t t u u r i t e o l l i s u u s + k u l t t u u r i t e o l l i s u u t e e n + k u l t t u u r i t e o l l i s u u t e m m e + k u l t t u u r i t e o l l i s u u t t a + k u l t t u u r i t e o l o g i a + k u l t t u u r i t e o s + k u l t t u u r i t e o s t e n + k u l t t u u r i t e s t i + k u l t t u u r i t i e d o t + k u l t t u u r i t i e t o i s u u d e n + k u l t t u u r i t i e t o i s u u t t a + k u l t t u u r i t i e t o u d e l l e + k u l t t u u r i t i e t ä m y k s e m m e + k u l t t u u r i t i e t ä m y s t ä + k u l t t u u r i t i l a i s u u k s i e n + k u l t t u u r i t i l a i s u u k s i s s a + k u l t t u u r i t o i m e n + k u l t t u u r i t o i m e n p i d e + k u l t t u u r i t o i m e t + k u l t t u u r i t o i m i + k u l t t u u r i t o i m i a + k u l t t u u r i t o i m i a a n + k u l t t u u r i t o i m i e n + k u l t t u u r i t o i m i j a a + k u l t t u u r i t o i m i j o i d e n + k u l t t u u r i t o i m i l l e + k u l t t u u r i t o i m i n n a l l a + k u l t t u u r i t o i m i n n a l t a + k u l t t u u r i t o i m i n n a n + k u l t t u u r i t o i m i n t a + k u l t t u u r i t o i m i n t a a + k u l t t u u r i t o i m i n t a a n + k u l t t u u r i t o i m i n t a o h j e l m a s t a + k u l t t u u r i t o i m i n t o i h i n + k u l t t u u r i t o i m i n t o j a + k u l t t u u r i t o i m i n t o j e n + k u l t t u u r i t o i m i s s a m m e + k u l t t u u r i t o i m i s t a + k u l t t u u r i t o t t u m u k s i s t a m m e + k u l t t u u r i t u k e a + k u l t t u u r i t u o t a n n o n + k u l t t u u r i t u o t a n n o s s a + k u l t t u u r i t u o t a n t o + k u l t t u u r i t u o t a n t o j e n + k u l t t u u r i t u o t a n t o o n + k u l t t u u r i t u o t e + k u l t t u u r i t u o t o k s i a + k u l t t u u r i t u o t t e e n + k u l t t u u r i t u o t t e e n a + k u l t t u u r i t u o t t e e s e e n + k u l t t u u r i t u o t t e e t + k u l t t u u r i t u o t t e i d e n + k u l t t u u r i t u o t t e i l l a m m e + k u l t t u u r i t u o t t e i l l e + k u l t t u u r i t u o t t e i s i i n + k u l t t u u r i t u o t t e i s t a + k u l t t u u r i t u o t t e i s t a m m e + k u l t t u u r i t u o t t e i t a + k u l t t u u r i t y ö l l ä + k u l t t u u r i t y ö n t e k i j ä t + k u l t t u u r i t y ö s s ä + k u l t t u u r i t y ö t ä + k u l t t u u r i u l o t t u v u u d e n + k u l t t u u r i u l o t t u v u u d e s t a + k u l t t u u r i u l o t t u v u u k s i a + k u l t t u u r i u l o t t u v u u k s i s t a + k u l t t u u r i u l o t t u v u u s + k u l t t u u r i u l o t t u v u u t t a + k u l t t u u r i v a i h d o n + k u l t t u u r i v a i h d o s s a + k u l t t u u r i v a i h t o + k u l t t u u r i v a i h t o a + k u l t t u u r i v a i h t o i h i n + k u l t t u u r i v a i h t o j a + k u l t t u u r i v a i h t o o n + k u l t t u u r i v a i k u t u k s e s t a + k u l t t u u r i v a i k u t u k s i a + k u l t t u u r i v a i k u t u s + k u l t t u u r i v a l i k o i m a a n s a + k u l t t u u r i v a l i o k u n n a l l e + k u l t t u u r i v a l i o k u n n a n + k u l t t u u r i v a l i o k u n n a s s a + k u l t t u u r i v a l i o k u n t a + k u l t t u u r i v a l i o k u n t a a + k u l t t u u r i v a l i o k u n t a a n + k u l t t u u r i v a l l a n k u m o u k s e e n + k u l t t u u r i v a l l a n k u m o u k s e l l a + k u l t t u u r i v a l l a n k u m o u k s e l t a + k u l t t u u r i v a l l a n k u m o u k s e n + k u l t t u u r i v a l l a n k u m o u k s e s t a + k u l t t u u r i v a l l a n k u m o u s + k u l t t u u r i v a l l a n k u m o u s t a + k u l t t u u r i v a l t e i s t a a n + k u l t t u u r i v a r a + k u l t t u u r i v a r a t + k u l t t u u r i v a r o j a + k u l t t u u r i v a r o j e n + k u l t t u u r i v e r k k o j a + k u l t t u u r i v e r k o s t o j a + k u l t t u u r i v e r k o s t o j e n + k u l t t u u r i v e r k o t + k u l t t u u r i v i e n t i ä + k u l t t u u r i v i e s t i ä + k u l t t u u r i v i i s u m e i t a + k u l t t u u r i v i i s u m i a + k u l t t u u r i v i r a s t o a + k u l t t u u r i v i r a s t o t + k u l t t u u r i v i r t a u k s i a + k u l t t u u r i v o i m i i n + k u l t t u u r i v u o d e n + k u l t t u u r i v u o r o p u h e l u + k u l t t u u r i v u o r o p u h e l u n + k u l t t u u r i v u o t e n s a + k u l t t u u r i v u o t t a + k u l t t u u r i v ä h e m m i s t ö i l l e + k u l t t u u r i v ä h e m m i s t ö j e n + k u l t t u u r i v ä h e m m i s t ö j ä + k u l t t u u r i v ä l i n e + k u l t t u u r i v ä l i n e i s t ö ä + k u l t t u u r i y h d i s t y k s e t + k u l t t u u r i y h d i s t y k s i ä + k u l t t u u r i y h d i s t y s + k u l t t u u r i y h t e i s t y ö + k u l t t u u r i y h t e i s t y ö h a n k k e i d e n + k u l t t u u r i y h t e i s t y ö h ö n + k u l t t u u r i y h t e i s t y ö n + k u l t t u u r i y h t e i s t y ö s o p i m u k s i a + k u l t t u u r i y h t e i s t y ö s s ä + k u l t t u u r i y h t e i s t y ö s t ä + k u l t t u u r i y h t e i s t y ö s u u n n i t e l m a + k u l t t u u r i y h t e i s t y ö s u u n n i t e l m a n + k u l t t u u r i y h t e i s t y ö t ä + k u l t t u u r i y h t e i s ö + k u l t t u u r i y h t e i s ö j e n + k u l t t u u r i y h t e i s ö ö n + k u l t t u u r i y h t e n ä i s y y s + k u l t t u u r i y h t e y d e t + k u l t t u u r i y h t e y k s i e n + k u l t t u u r i y h t e y k s i l l ä + k u l t t u u r i y h t e y k s i n + k u l t t u u r i y m p ä r i s t ö + k u l t t u u r i y m p ä r i s t ö j e n + k u l t t u u r i y m p ä r i s t ö l l e + k u l t t u u r i y m p ä r i s t ö n + k u l t t u u r i y m p ä r i s t ö s s ä ä n + k u l t t u u r i y m p ä r i s t ö ä + k u l t t u u r i y m p ä r i s t ö ö n + k u l t t u u r i y m p ä r i s t ö ö n s ä + k u l t t u u r i y r i t y k s i s s ä + k u l t t u u r i y r i t y s t e n + k u l u b u d j e t i n + k u l u i + k u l u i h i n + k u l u i s t a + k u l u i t t a + k u l u i v a t + k u l u j a + k u l u j e n + k u l u j e n v a l v o n t a m e k a n i s m e j a + k u l u j ä r j e s t e l m ä + k u l u j ä r j e s t e l m ä n + k u l u j ä r j e s t e l m ä s t ä + k u l u j ä r j e s t e l m ä ä + k u l u k a t o n + k u l u k o r j a u s j ä r j e s t e l m ä + k u l u k o r v a u k s e e n + k u l u k o r v a u k s e n + k u l u k o r v a u k s e t + k u l u k o r v a u k s i a + k u l u k o r v a u k s i e n + k u l u k o r v a u k s i i m m e + k u l u k o r v a u k s i i n + k u l u k o r v a u k s i n a + k u l u k o r v a u k s i s s a + k u l u k o r v a u k s i s t a + k u l u k o r v a u s j ä r j e s t e l m ä + k u l u k o r v a u s j ä r j e s t e l m ä n + k u l u k o r v a u s j ä r j e s t e l m ä t + k u l u k o r v a u s j ä r j e s t e l m ä ä + k u l u k o r v a u s j ä r j e s t e l m ä ä m m e + k u l u k o r v a u s j ä r j e s t e l y ä + k u l u k o r v a u s k y s y m y s t ä + k u l u k o r v a u s k ä y t ä n n ö s t ä + k u l u k o r v a u s s ä ä n n ö s t e n + k u l u k o r v a u s s ä ä n t ö j ä + k u l u k o r v a u s t e n + k u l u k o r v a u s v a a t i m u k s i a + k u l u k y s y m y s + k u l u m e n e t t e l y i h i n + k u l u n e e k s i + k u l u n e e n + k u l u n e e n a + k u l u n e i d e n + k u l u n e i l l a + k u l u n e i n a + k u l u n s a + k u l u n u t t a + k u l u n v a l v o n t a + k u l u n v a l v o n t a m e n e t t e l y j ä + k u l u p e r u s t e i s t e n + k u l u p o l i t i i k a n + k u l u p o l i t i i k a s s a + k u l u p u o l e l l a + k u l u t + k u l u t a m m e k o + k u l u t e t a a n + k u l u t e t a a n k i n + k u l u t e t t a v a + k u l u t e t t a v a a + k u l u t e t t u + k u l u t t a a + k u l u t t a a k s e m m e + k u l u t t a e n + k u l u t t a e s s a a n + k u l u t t a i s i v a t + k u l u t t a j a a + k u l u t t a j a a n + k u l u t t a j a b o i k o t i s t a + k u l u t t a j a b u d j e t i s s a + k u l u t t a j a d i r e k t i i v i i n + k u l u t t a j a d i r e k t i i v i s s ä + k u l u t t a j a d i r e k t i i v i t + k u l u t t a j a e l e k t r o n i i k a n + k u l u t t a j a e l i n t e n + k u l u t t a j a f o o r u m i s t a + k u l u t t a j a h i n n a n + k u l u t t a j a h i n n a t + k u l u t t a j a h i n n o i s s a + k u l u t t a j a h i n t a + k u l u t t a j a h i n t a a n + k u l u t t a j a h i n t a i n d e k s i + k u l u t t a j a h i n t a i n d e k s i i n + k u l u t t a j a h i n t a i n d e k s i l l ä + k u l u t t a j a h i n t a i n d e k s i n + k u l u t t a j a h i n t a i n d e k s i s t ä + k u l u t t a j a h i n t a t i l a n t e e n + k u l u t t a j a h i n t o i h i n + k u l u t t a j a h i n t o i n a + k u l u t t a j a h i n t o j a + k u l u t t a j a h i n t o j e n + k u l u t t a j a i n d e k s i + k u l u t t a j a i n f o r m a a t i o + k u l u t t a j a i n f o r m a a t i o s t a + k u l u t t a j a i n s u o j a + k u l u t t a j a i n s u o j a a n + k u l u t t a j a j o h t o i s t a + k u l u t t a j a j ä r j e s t e l m ä ä + k u l u t t a j a j ä r j e s t ö + k u l u t t a j a j ä r j e s t ö i h i n + k u l u t t a j a j ä r j e s t ö i l l e + k u l u t t a j a j ä r j e s t ö i l l ä + k u l u t t a j a j ä r j e s t ö i l t ä + k u l u t t a j a j ä r j e s t ö i s t ä + k u l u t t a j a j ä r j e s t ö j e n + k u l u t t a j a j ä r j e s t ö j e n k i n + k u l u t t a j a j ä r j e s t ö j ä + k u l u t t a j a j ä r j e s t ö n + k u l u t t a j a j ä r j e s t ö t + k u l u t t a j a j ä r j e s t ö ä + k u l u t t a j a k a l e n t e r i + k u l u t t a j a k a m p a n j o i d e n + k u l u t t a j a k a n s a l a i s e l l e + k u l u t t a j a k a s v a t u k s e e n + k u l u t t a j a k a s v a t u s + k u l u t t a j a k a s v a t u s k a m p a n j a l l a + k u l u t t a j a k a s v a t u s t a + k u l u t t a j a k a u p a n + k u l u t t a j a k e s k u k s e e n + k u l u t t a j a k e s k u k s e n + k u l u t t a j a k e s k u k s e t + k u l u t t a j a k e s k u k s i a + k u l u t t a j a k e s k u k s i i n + k u l u t t a j a k e s k u k s i l l a + k u l u t t a j a k e s k u k s i s s a + k u l u t t a j a k e s k u s + k u l u t t a j a k e s k u s t e n + k u l u t t a j a k e s k u s v e r k o s t o n + k u l u t t a j a k e t j u s s a + k u l u t t a j a k i n + k u l u t t a j a k o h t i i n + k u l u t t a j a k u l t t u u r i + k u l u t t a j a k y s y m y k s e t + k u l u t t a j a k ä y t t ä y t y m i s e l l e + k u l u t t a j a k ä y t t ä y t y m i s e n + k u l u t t a j a k ä y t t ä y t y m i s e s s ä + k u l u t t a j a k ä y t t ä y t y m i s e s t ä + k u l u t t a j a k ä y t t ä y t y m i s t ä + k u l u t t a j a k ä y t t ö ö n + k u l u t t a j a k ä y t ä n t ö i h i n + k u l u t t a j a k ä y t ö s t ä + k u l u t t a j a l a i n s ä ä d ä n n ö k s i + k u l u t t a j a l a i n s ä ä d ä n n ö l l e + k u l u t t a j a l a i n s ä ä d ä n n ö l l ä + k u l u t t a j a l a i n s ä ä d ä n n ö n + k u l u t t a j a l a i n s ä ä d ä n n ö s s ä + k u l u t t a j a l a i n s ä ä d ä n t ö + k u l u t t a j a l a i n s ä ä d ä n t ö ä + k u l u t t a j a l a i n s ä ä d ä n t ö ö n + k u l u t t a j a l a i s s a + k u l u t t a j a l a i t t e i d e n + k u l u t t a j a l a u t a k u n t i e n + k u l u t t a j a l e h d e s s ä + k u l u t t a j a l i i k e + k u l u t t a j a l i i k k e i l l e + k u l u t t a j a l i i t o l t a + k u l u t t a j a l i i t o n + k u l u t t a j a l i i t o s t a + k u l u t t a j a l i i t t o + k u l u t t a j a l i i t t o a + k u l u t t a j a l l a + k u l u t t a j a l l e + k u l u t t a j a l u o k k i i n + k u l u t t a j a l u o t o i s t a + k u l u t t a j a l u o t t a m u s t a + k u l u t t a j a l u o t t o a + k u l u t t a j a l u o t t o d i r e k t i i v i s s ä + k u l u t t a j a l u o t t o j a + k u l u t t a j a l u o t t o j e n + k u l u t t a j a l u o t t o s o p i m u k s e t + k u l u t t a j a l ä h t ö i s e s t ä + k u l u t t a j a l ä h t ö i s i ä + k u l u t t a j a m a a s t a + k u l u t t a j a m a i d e n + k u l u t t a j a m a i h i n + k u l u t t a j a m a i l l e + k u l u t t a j a m a i n o n t a a + k u l u t t a j a m a i s s a + k u l u t t a j a m a k s u j e n + k u l u t t a j a m a l l e j a + k u l u t t a j a m a r k k i n a t + k u l u t t a j a m a r k k i n a t k i n + k u l u t t a j a m a r k k i n o i d e n + k u l u t t a j a m a r k k i n o i l l a + k u l u t t a j a m a r k k i n o i l l e + k u l u t t a j a m a r k k i n o i t a + k u l u t t a j a m e r k i n t ö j ä + k u l u t t a j a m ä ä r ä l l ä + k u l u t t a j a n + k u l u t t a j a n e u v o j i e n + k u l u t t a j a n e u v o n n a n + k u l u t t a j a n e u v o n t a a + k u l u t t a j a n e u v o n t a a n + k u l u t t a j a n e u v o n t a k e s k u s t e n + k u l u t t a j a n e u v o s t o + k u l u t t a j a n e u v o s t o n + k u l u t t a j a n e u v o s t o s s a + k u l u t t a j a n o i k e u d e t + k u l u t t a j a n o i k e u k s i a + k u l u t t a j a n o i k e u k s i i n + k u l u t t a j a n o i k e u k s i s t a + k u l u t t a j a n o i k e u s d i r e k t i i v i s s ä + k u l u t t a j a n o r m e j a + k u l u t t a j a n o r m i e n + k u l u t t a j a n s u o j a + k u l u t t a j a n s u o j a a + k u l u t t a j a n s u o j a a n + k u l u t t a j a n s u o j a d i r e k t i i v e i h i n + k u l u t t a j a n s u o j a d i r e k t i i v e j ä + k u l u t t a j a n s u o j a d i r e k t i i v i + k u l u t t a j a n s u o j a d i r e k t i i v i e n + k u l u t t a j a n s u o j a d i r e k t i i v i i n + k u l u t t a j a n s u o j a d i r e k t i i v i l l ä + k u l u t t a j a n s u o j a d i r e k t i i v i s t ä + k u l u t t a j a n s u o j a d i r e k t i i v i ä + k u l u t t a j a n s u o j a e l i m i ä + k u l u t t a j a n s u o j a e s i t y s + k u l u t t a j a n s u o j a j ä r j e s t e l m ä n + k u l u t t a j a n s u o j a j ä r j e s t e l m ä ä + k u l u t t a j a n s u o j a j ä r j e s t ö + k u l u t t a j a n s u o j a j ä r j e s t ö i h i n + k u l u t t a j a n s u o j a j ä r j e s t ö i l l ä + k u l u t t a j a n s u o j a j ä r j e s t ö j e n + k u l u t t a j a n s u o j a j ä r j e s t ö j ä + k u l u t t a j a n s u o j a j ä r j e s t ö t + k u l u t t a j a n s u o j a k e s k u k s i a + k u l u t t a j a n s u o j a k y s y m y k s i i n + k u l u t t a j a n s u o j a k y s y m y k s i l l e + k u l u t t a j a n s u o j a k y s y m y k s i ä + k u l u t t a j a n s u o j a k y s y m y s + k u l u t t a j a n s u o j a k y s y m y s t ä + k u l u t t a j a n s u o j a l a i n + k u l u t t a j a n s u o j a l a i n s ä ä d ä n n ö n + k u l u t t a j a n s u o j a l a i n s ä ä d ä n n ö s t ä + k u l u t t a j a n s u o j a l a i n s ä ä d ä n t ö + k u l u t t a j a n s u o j a l a i n s ä ä d ä n t ö ä + k u l u t t a j a n s u o j a l a i s t a + k u l u t t a j a n s u o j a l a k i + k u l u t t a j a n s u o j a l a k i e n + k u l u t t a j a n s u o j a l a k i m m e + k u l u t t a j a n s u o j a l i i t t o + k u l u t t a j a n s u o j a l l a + k u l u t t a j a n s u o j a l l a a n + k u l u t t a j a n s u o j a l l e + k u l u t t a j a n s u o j a m e k a n i s m e j a + k u l u t t a j a n s u o j a m e k a n i s m i e n + k u l u t t a j a n s u o j a m m e + k u l u t t a j a n s u o j a m ä ä r ä y k s i ä + k u l u t t a j a n s u o j a n + k u l u t t a j a n s u o j a n o r m e j a + k u l u t t a j a n s u o j a n o r m i t + k u l u t t a j a n s u o j a n ä k ö k o h d a t + k u l u t t a j a n s u o j a o h j e l m a + k u l u t t a j a n s u o j a o h j e l m a a + k u l u t t a j a n s u o j a o h j e l m a n + k u l u t t a j a n s u o j a o h j e l m i e n + k u l u t t a j a n s u o j a o i k e u k s i e n + k u l u t t a j a n s u o j a o i k e u k s i e n s a + k u l u t t a j a n s u o j a o n g e l m a + k u l u t t a j a n s u o j a o n g e l m i a + k u l u t t a j a n s u o j a o n g e l m i i n + k u l u t t a j a n s u o j a p a k e t t i a + k u l u t t a j a n s u o j a p e r i a a t t e e n + k u l u t t a j a n s u o j a p e r i n n e + k u l u t t a j a n s u o j a p o l i t i i k a l t a + k u l u t t a j a n s u o j a p o l i t i i k a n + k u l u t t a j a n s u o j a p o l i t i i k a s s a + k u l u t t a j a n s u o j a p o l i t i i k a s t a + k u l u t t a j a n s u o j a p o l i t i i k k a + k u l u t t a j a n s u o j a p o l i t i i k k a a + k u l u t t a j a n s u o j a p o l i t i i k k a a m m e + k u l u t t a j a n s u o j a r y h m i ä + k u l u t t a j a n s u o j a s s a + k u l u t t a j a n s u o j a s t a + k u l u t t a j a n s u o j a s t a n d a r d i t + k u l u t t a j a n s u o j a s t r a t e g i a + k u l u t t a j a n s u o j a s t r a t e g i a s t a + k u l u t t a j a n s u o j a s t r a t e g i o i t a + k u l u t t a j a n s u o j a s ä ä d ö s t e n + k u l u t t a j a n s u o j a s ä ä n n ö i s s ä + k u l u t t a j a n s u o j a s ä ä n n ö s t e n + k u l u t t a j a n s u o j a s ä ä n n ö s t ö n + k u l u t t a j a n s u o j a s ä ä n n ö s t ö s t ä + k u l u t t a j a n s u o j a s ä ä n n ö t + k u l u t t a j a n s u o j a s ä ä n t ö j e n + k u l u t t a j a n s u o j a s ä ä n t ö j ä + k u l u t t a j a n s u o j a s ä ä n t ö j ä m m e + k u l u t t a j a n s u o j a t a h o j a + k u l u t t a j a n s u o j a t a k u u n + k u l u t t a j a n s u o j a t a k u u s t a + k u l u t t a j a n s u o j a t a k u u t a + k u l u t t a j a n s u o j a t e h t ä v ä n s ä + k u l u t t a j a n s u o j a t o i m e n p i t e i d e n + k u l u t t a j a n s u o j a t o i m e n p i t e i s i i n + k u l u t t a j a n s u o j a t o i m i + k u l u t t a j a n s u o j a t o i m i e n + k u l u t t a j a n s u o j a t o i m i i n + k u l u t t a j a n s u o j a t o i m i l l a + k u l u t t a j a n s u o j a t o i m i s t o j a + k u l u t t a j a n s u o j a v a a t i m u k s e t + k u l u t t a j a n s u o j a v a a t i m u k s i l l e + k u l u t t a j a n s u o j a v a a t i m u s t e n + k u l u t t a j a n s u o j a v a l i o k u n n a n + k u l u t t a j a n s u o j a v a l i o k u n n a s s a + k u l u t t a j a n s u o j a v a l i o k u n t a + k u l u t t a j a n s u o j a v a l i o k u n t a a + k u l u t t a j a n s u o j a v a l i o k u n t a m m e + k u l u t t a j a n s u o j a v e r k o s t o j e n + k u l u t t a j a n s u o j a v i r a n o m a i n e n + k u l u t t a j a n s u o j a v i r a n o m a i s e t + k u l u t t a j a n s u o j a v i r a n o m a i s i a + k u l u t t a j a n s u o j a v i r a n o m a i s t e n + k u l u t t a j a n s u o j a v i r a s t o i l l e + k u l u t t a j a n s u o j a v i r a s t o n + k u l u t t a j a n s u o j a v ä l i n e i d e n + k u l u t t a j a n s u o j a v ä l i n e i l l e + k u l u t t a j a n s u o j a y h t e i s t y ö t ä + k u l u t t a j a n s u o j a y k s i k k ö ä + k u l u t t a j a n s u o j e l i j a t + k u l u t t a j a n s u o j e l u + k u l u t t a j a n s u o j e l u a + k u l u t t a j a n s u o j e l u j ä r j e s t e l m ä + k u l u t t a j a n s u o j e l u l a k i e n + k u l u t t a j a n s u o j e l u l l e + k u l u t t a j a n s u o j e l u n + k u l u t t a j a n s u o j e l u p o l i t i i k a n + k u l u t t a j a n s u o j e l u s s a + k u l u t t a j a n s u o j e l u s t a + k u l u t t a j a n s u o j e l u u n + k u l u t t a j a n v a l i n n a n + k u l u t t a j a n v a l i s t u k s e e n + k u l u t t a j a n v a l i s t u s t a + k u l u t t a j a n ä k ö k o h d a n + k u l u t t a j a n ä k ö k o h d a t + k u l u t t a j a n ä k ö k o h t i e n + k u l u t t a j a n ä k ö k u l m a + k u l u t t a j a n ä k ö k u l m a a + k u l u t t a j a n ä k ö k u l m a s t a + k u l u t t a j a o h j e l m a + k u l u t t a j a o h j e l m a s s a + k u l u t t a j a o h j e l m i a + k u l u t t a j a o i k e u k s i a + k u l u t t a j a o i k e u k s i e n + k u l u t t a j a o i k e u t t a + k u l u t t a j a o n g e l m i e n + k u l u t t a j a o n g e l m i s t a + k u l u t t a j a o r g a n i s a a t i o i d e n + k u l u t t a j a o s u u s t o i m i n t a y r i t y k s i ä + k u l u t t a j a p a i n o t t e i s e t + k u l u t t a j a p a l v e l u n + k u l u t t a j a p a l v e l u t + k u l u t t a j a p a r k a + k u l u t t a j a p a t r i o t i s m i a + k u l u t t a j a p e r i a a t t e i t a + k u l u t t a j a p o l i i t t i n e n + k u l u t t a j a p o l i i t t i s e l t a + k u l u t t a j a p o l i i t t i s e n + k u l u t t a j a p o l i i t t i s e s s a + k u l u t t a j a p o l i i t t i s e s t a + k u l u t t a j a p o l i i t t i s i a + k u l u t t a j a p o l i i t t i s i i n + k u l u t t a j a p o l i i t t i s i s s a + k u l u t t a j a p o l i i t t i s t a + k u l u t t a j a p o l i i t t i s t e n + k u l u t t a j a p o l i t i i k a l l e + k u l u t t a j a p o l i t i i k a n + k u l u t t a j a p o l i t i i k a s s a + k u l u t t a j a p o l i t i i k a s t a + k u l u t t a j a p o l i t i i k k a + k u l u t t a j a p o l i t i i k k a a + k u l u t t a j a p o l i t i i k k a a n + k u l u t t a j a p r o f i i l i a a n + k u l u t t a j a p u h e l i m e n + k u l u t t a j a p u o l i + k u l u t t a j a p ä i v ä n ä + k u l u t t a j a p ä i v ä ä + k u l u t t a j a r a p o r t e i s t a + k u l u t t a j a r a p o r t t i e n + k u l u t t a j a r i i t o i h i n + k u l u t t a j a r i i t o j e n + k u l u t t a j a r o o l i + k u l u t t a j a r y h m i e n + k u l u t t a j a r y h m i i n + k u l u t t a j a r y h m i l l e + k u l u t t a j a r y h m i s t ä + k u l u t t a j a r y h m i ä + k u l u t t a j a r y h m ä + k u l u t t a j a r y h m ä n + k u l u t t a j a r y h m ä s t ä + k u l u t t a j a r y h m ä t + k u l u t t a j a r y h m ä ä n + k u l u t t a j a s e k t o r e i l l e + k u l u t t a j a s i v u s t o i l l a + k u l u t t a j a s o p i m u k s e e n + k u l u t t a j a s o p i m u k s e s t a + k u l u t t a j a s o p i m u k s e t + k u l u t t a j a s o p i m u k s i a + k u l u t t a j a s o p i m u k s i i n + k u l u t t a j a s o p i m u s l a i n s ä ä d ä n n ö n + k u l u t t a j a s o p i m u s o i k e u d e l l i s e n + k u l u t t a j a s o p i m u s o i k e u t t a + k u l u t t a j a s o p i m u s t a + k u l u t t a j a s o p i m u s t e n + k u l u t t a j a s o v e l l u k s i s s a + k u l u t t a j a s t a n d a r d i a + k u l u t t a j a s t a n d a r d i t + k u l u t t a j a s t r a t e g i a + k u l u t t a j a s t r a t e g i a a + k u l u t t a j a s t r a t e g i a n + k u l u t t a j a s t r a t e g i a s s a + k u l u t t a j a s u h t e i t a + k u l u t t a j a s u o j a + k u l u t t a j a s u o j a a + k u l u t t a j a s u o j a a n + k u l u t t a j a s u o j a k y s y m y k s e n + k u l u t t a j a s u o j a l l a + k u l u t t a j a s u o j a l l e + k u l u t t a j a s u o j a n + k u l u t t a j a s u o j a p o l i t i i k k a + k u l u t t a j a s u o j a s t a + k u l u t t a j a s u o j a v ä l i n e i d e n + k u l u t t a j a s u o j e l u n + k u l u t t a j a s ä ä n n ö s t ö n + k u l u t t a j a s ä ä n n ö s t ö ö n + k u l u t t a j a s ä ä n n ö t + k u l u t t a j a s ä ä n t ö j e n + k u l u t t a j a s ä ä n t ö j ä + k u l u t t a j a t + k u l u t t a j a t a i t o j a + k u l u t t a j a t a s o l l a + k u l u t t a j a t i e d o n + k u l u t t a j a t i e d o t t a m i s e e n + k u l u t t a j a t i e d o t u k s e e n + k u l u t t a j a t i e d o t u k s e n + k u l u t t a j a t i e d o t u k s e s t a + k u l u t t a j a t i e d o t u s + k u l u t t a j a t i e d o t u s o h j e l m a a + k u l u t t a j a t i e d o t u s t a + k u l u t t a j a t i e t o + k u l u t t a j a t i e t o a + k u l u t t a j a t i e t o i h i n + k u l u t t a j a t i e t o i s u u d e n + k u l u t t a j a t i e t o j a + k u l u t t a j a t i e t o u t t a + k u l u t t a j a t k i n + k u l u t t a j a t o i m i n t o j e n + k u l u t t a j a t o i m i t u k s e n + k u l u t t a j a t o t t u m u s t e n + k u l u t t a j a t u o t t e e t + k u l u t t a j a t u o t t e i d e n + k u l u t t a j a t u o t t e i s i i n + k u l u t t a j a t u o t t e i s s a + k u l u t t a j a t u o t t e i t a + k u l u t t a j a t u r v a + k u l u t t a j a t u r v a a + k u l u t t a j a t u r v a l l i s u u d e l l e + k u l u t t a j a t u r v a l l i s u u d e n + k u l u t t a j a t u r v a l l i s u u t t a + k u l u t t a j a t u t k i m u k s i s t a + k u l u t t a j a t u t k i m u s + k u l u t t a j a t y y p p e j ä + k u l u t t a j a t y y t y v ä i s y y d e n + k u l u t t a j a t y y t y v ä i s y y d e s t ä + k u l u t t a j a t y y t y v ä i s y y s + k u l u t t a j a t y y t y v ä i s y y t t ä + k u l u t t a j a v a a t i m u k s i a + k u l u t t a j a v a a t i m u s t e n + k u l u t t a j a v a h i n g o i s t a + k u l u t t a j a v a l i s t u k s e e n + k u l u t t a j a v a l i s t u k s e l l e + k u l u t t a j a v a l i s t u k s e n + k u l u t t a j a v a l i s t u k s e n s a + k u l u t t a j a v a l i s t u k s e s t a + k u l u t t a j a v a l i s t u s + k u l u t t a j a v a l i s t u s k y s y m y s t ä + k u l u t t a j a v a l i s t u s t a + k u l u t t a j a v a l l a n k u m o u s + k u l u t t a j a v a l t i o i d e n + k u l u t t a j a v a l t u u k s i a + k u l u t t a j a v e r o + k u l u t t a j a v e r o s t a + k u l u t t a j a v e t o i s e e n + k u l u t t a j a v e t o i s e s t a + k u l u t t a j a v i h a m i e l i s i n ä + k u l u t t a j a v i r a n o m a i s e t + k u l u t t a j a v i r a n o m a i s t e n + k u l u t t a j a v i r a s t o a + k u l u t t a j a v u o r o p u h e l u + k u l u t t a j a y h d i s t y k s e n + k u l u t t a j a y h d i s t y k s e t + k u l u t t a j a y h d i s t y k s i ä + k u l u t t a j a y h d i s t y s + k u l u t t a j a y h d i s t y s t e n + k u l u t t a j a y h d i s t y s t ä + k u l u t t a j a y l i j ä ä m ä ä + k u l u t t a j a y s t ä v ä l l i n e n + k u l u t t a j a y s t ä v ä l l i s e l l ä + k u l u t t a j a y s t ä v ä l l i s e m m ä t + k u l u t t a j a y s t ä v ä l l i s e m p i + k u l u t t a j a y s t ä v ä l l i s e m p i ä + k u l u t t a j a y s t ä v ä l l i s e m p ä ä + k u l u t t a j a y s t ä v ä l l i s e n + k u l u t t a j a y s t ä v ä l l i s e s t ä + k u l u t t a j a y s t ä v ä l l i s i ä + k u l u t t a j a y s t ä v ä l l i s t ä + k u l u t t a j a y s t ä v ä l l i s y y d e n + k u l u t t a j i a + k u l u t t a j i a m m e + k u l u t t a j i e n + k u l u t t a j i e n e t u j e n + k u l u t t a j i e n k a a n + k u l u t t a j i e n s u o j e l u + k u l u t t a j i i n + k u l u t t a j i l l a + k u l u t t a j i l l a k i n + k u l u t t a j i l l e + k u l u t t a j i l l e k a a n + k u l u t t a j i l l e m m e + k u l u t t a j i l t a + k u l u t t a j i n a + k u l u t t a j i s s a + k u l u t t a j i s t a + k u l u t t a k a a m m e + k u l u t t a m a a n + k u l u t t a m a t t a + k u l u t t a m i e n s a + k u l u t t a m i s t a p a a + k u l u t t a v a t + k u l u t t a v i a + k u l u t t a v i e n + k u l u t t u a k a a n + k u l u t u k s e e n + k u l u t u k s e n + k u l u t u k s e s s a + k u l u t u k s e s t a + k u l u t u k s e s t a m m e + k u l u t u s a l u e t t a + k u l u t u s a r v o i l l a + k u l u t u s a r v o t + k u l u t u s a s i o i s t a + k u l u t u s e l e k t r o n i i k k a + k u l u t u s e l e k t r o n i i k k a t u o t t e i d e n + k u l u t u s e l i n t a r v i k k e i d e n + k u l u t u s h a l u k k u u s + k u l u t u s h e n k i s e l l ä + k u l u t u s h e t k e e n + k u l u t u s h o u k u t u s t e n + k u l u t u s h u i p p u j a + k u l u t u s h u l l u u d e n + k u l u t u s h y s t e r i a s t a + k u l u t u s h y ö d y k e + k u l u t u s h y ö d y k e a n s a a n + k u l u t u s h y ö d y k e s e k t o r i a + k u l u t u s h y ö d y k e t t ä + k u l u t u s h y ö d y k k e e k s i + k u l u t u s h y ö d y k k e i d e n + k u l u t u s h y ö d y k k e i s i i n + k u l u t u s h y ö d y k k e i s s ä + k u l u t u s h y ö d y k k e i s t ä + k u l u t u s h y ö d y k k e i t ä + k u l u t u s i l m a p i i r i ä + k u l u t u s i n f o r m a a t i o + k u l u t u s j u h l a a n s a + k u l u t u s j ä r j e s t e l m i s t ä + k u l u t u s k e l p o i s t a + k u l u t u s k e s k u k s i a + k u l u t u s k e s k u k s i i n + k u l u t u s k e s k u k s i s t a + k u l u t u s k r i i s i s t ä + k u l u t u s k u l t t u u r i a + k u l u t u s k u l t t u u r i s s a + k u l u t u s k u l t t u u r i s t a + k u l u t u s k y s y n n ä n + k u l u t u s k y s y n n ä s t ä + k u l u t u s k y s y n t ä + k u l u t u s k y s y n t ä ä n + k u l u t u s k ä y t t ä y t y m i n e n + k u l u t u s k ä y t t ä y t y m i s e n + k u l u t u s k ä y t t ä y t y m i s t ä + k u l u t u s k ä y t t ä y t y m i s t ä m m e + k u l u t u s k ä y t t ä y t y m i s t ä ä n + k u l u t u s k ä y t ä n t ö i h i n + k u l u t u s k ö y h y y t t ä + k u l u t u s l a i n a a + k u l u t u s l u o t o i s t a + k u l u t u s l u o t o l l e + k u l u t u s l u o t o n + k u l u t u s l u o t o t + k u l u t u s l u o t t o + k u l u t u s l u o t t o a + k u l u t u s l u o t t o d i r e k t i i v i + k u l u t u s l u o t t o d i r e k t i i v i i n + k u l u t u s l u o t t o d i r e k t i i v i k s i + k u l u t u s l u o t t o d i r e k t i i v i n + k u l u t u s l u o t t o d i r e k t i i v i s s ä + k u l u t u s l u o t t o d i r e k t i i v i s t ä + k u l u t u s l u o t t o i n a + k u l u t u s l u o t t o j a + k u l u t u s l u o t t o j e n + k u l u t u s l u o t t o j ä r j e s t e l y i s s ä + k u l u t u s l u o t t o k o r k o j e n + k u l u t u s l u o t t o l a k i + k u l u t u s l u o t t o l a k i e n + k u l u t u s l u o t t o l u o t t o m a r k k i n a t + k u l u t u s l u o t t o m a r k k i n a t + k u l u t u s l u o t t o m a r k k i n o i d e n + k u l u t u s l u o t t o m a r k k i n o i l l a + k u l u t u s l u o t t o m a r k k i n o i t a + k u l u t u s l u o t t o s o p i m u k s e t + k u l u t u s l u o t t o s o p i m u k s i a + k u l u t u s l u o t t o s o p i m u k s i s t a + k u l u t u s l u o t t o s o p i m u s t e n + k u l u t u s l u o t t o t a p a u k s e s t a + k u l u t u s l u o t t o t i e d o t + k u l u t u s l u o t t o t i e t o l o m a k k e e s s a + k u l u t u s l u o t t o t o i m i n t a a + k u l u t u s l u o t t o t u o t t e i t a + k u l u t u s l u o t t o v a i h t o e h t o j a + k u l u t u s m a a i l m a + k u l u t u s m a a s s a + k u l u t u s m a h d o l l i s u u k s i a + k u l u t u s m a l l e i s s a + k u l u t u s m a l l e j a + k u l u t u s m a l l i a + k u l u t u s m a l l i e m m e + k u l u t u s m a l l i e n + k u l u t u s m a l l i n + k u l u t u s m a r k k i n a t + k u l u t u s m a r k k i n o i d e n + k u l u t u s m e n e t e l m i e n + k u l u t u s m e n o i h i n + k u l u t u s m e n o j a + k u l u t u s m e n o j e n + k u l u t u s m u o t o j a + k u l u t u s m ä ä r ä + k u l u t u s n o r m e j a + k u l u t u s o h j e l m i a + k u l u t u s p i s t e e n + k u l u t u s p o l i t i i k k a + k u l u t u s p o t e n t i a a l i + k u l u t u s p ä ä t ö k s i i n + k u l u t u s r i i t o j e n + k u l u t u s r i p u l i i n + k u l u t u s s e k t o r e i l l e + k u l u t u s s o t a + k u l u t u s t a + k u l u t u s t a l o u d e n + k u l u t u s t a p a m m e + k u l u t u s t a p o i h i n s a + k u l u t u s t a p o j a + k u l u t u s t a r p e e s t a + k u l u t u s t a r p e i d e n + k u l u t u s t a r p e i s i i n + k u l u t u s t a r p e i s i i n s a + k u l u t u s t a r p e i t a + k u l u t u s t a r v i k k e i s t a + k u l u t u s t a s o + k u l u t u s t a s o a + k u l u t u s t a s o i l l a + k u l u t u s t a s o n + k u l u t u s t a s o o n + k u l u t u s t a v a r a + k u l u t u s t a v a r a a + k u l u t u s t a v a r a k s i + k u l u t u s t a v a r a m a r k k i n o i t a + k u l u t u s t a v a r a n + k u l u t u s t a v a r a n a + k u l u t u s t a v a r a s s a + k u l u t u s t a v a r a t + k u l u t u s t a v a r a t e o l l i s u u d e n + k u l u t u s t a v a r a t e o l l i s u u d e s t a + k u l u t u s t a v a r a v a l m i s t a j a t + k u l u t u s t a v a r o i d e n + k u l u t u s t a v a r o i h i n + k u l u t u s t a v a r o i l l a + k u l u t u s t a v a r o i l l e + k u l u t u s t a v a r o i s s a + k u l u t u s t a v a r o i s s a m m e + k u l u t u s t a v a r o i s t a + k u l u t u s t a v a r o i t a + k u l u t u s t a v a r o i t a a n + k u l u t u s t o i m i n t a a n + k u l u t u s t o t t u m u k s e t + k u l u t u s t o t t u m u k s i a + k u l u t u s t o t t u m u k s i a a n + k u l u t u s t o t t u m u k s i a m m e + k u l u t u s t o t t u m u k s i e n + k u l u t u s t o t t u m u k s i i n + k u l u t u s t o t t u m u k s i l l e + k u l u t u s t o t t u m u k s i s s a + k u l u t u s t o t t u m u k s i s t a + k u l u t u s t o t t u m u k s i s t a a n + k u l u t u s t o t t u m u s t e m m e + k u l u t u s t o t t u m u s t e n + k u l u t u s t u e n + k u l u t u s t u k e a + k u l u t u s t u k e e n + k u l u t u s t u k i + k u l u t u s t u o t e t t a + k u l u t u s t u o t t e e n + k u l u t u s t u o t t e e s t a + k u l u t u s t u o t t e e t + k u l u t u s t u o t t e i d e n + k u l u t u s t u o t t e i s i i n + k u l u t u s t u o t t e i s t a + k u l u t u s t u o t t e i t a + k u l u t u s v a i h e e s s a + k u l u t u s v a l i n t o j e n s a + k u l u t u s v e d e n + k u l u t u s v e r o + k u l u t u s v e r o a + k u l u t u s v e r o i h i n + k u l u t u s v e r o i s t a + k u l u t u s v e r o j a + k u l u t u s v e r o j e n + k u l u t u s v e r o n a + k u l u t u s v e r o t + k u l u t u s v e r o t u s t a + k u l u t u s v i e t i n + k u l u t u s v o i m a a + k u l u t u s y h t e i s k u n n a l l e + k u l u t u s y h t e i s k u n n a s s a + k u l u t u s y h t e i s k u n n a s t a m m e + k u l u t u s y h t e i s k u n t a + k u l u t u s y h t e i s k u n t a a + k u l u t u s y h t e i s k u n t a m m e + k u l u t u s y m p ä r i s t ö ö n + k u l u u + k u l u v a a n + k u l u v a n + k u l u v i a + k u m i k a n a + k u m i k ö y s i + k u m i l e i m a s i m e l l a + k u m i l e i m a s i m e n + k u m i l e i m a s i m e n a + k u m i l e i m a s i m i n a + k u m i l e i m a s i n + k u m i l e i m a s i n p a r l a m e n t t i + k u m i l e i m a s i n t a + k u m i l u o d e i l l a + k u m i l u o d e i s t a + k u m i l u o t e i h i n + k u m i l u o t e j a + k u m i m i e s + k u m i n + k u m i n a u h a + k u m i p y ö r ä l i i k e n t e e n + k u m i s a a p p a a t + k u m i t e h d a s + k u m i v e n e + k u m i v e n e e s s ä + k u m i v i i k u n a + k u m i v i l j e l m i l l ä + k u m m a l l i s e m p a a + k u m m a l l i s e n + k u m m a l l i s i a + k u m m a l l i s i m p i a + k u m m a l l i s t a + k u m m a l l i s u u d e s t a + k u m m a l t a + k u m m a n + k u m m e l i t u r s k a + k u m m e l i t u r s k a a + k u m m e l i t u r s k a a n + k u m m e l i t u r s k a k a n n a n + k u m m e l i t u r s k a k a n n a t + k u m m e l i t u r s k a k a n t a + k u m m e l i t u r s k a k a n t a a + k u m m e l i t u r s k a k a n t a a n + k u m m e l i t u r s k a k a n t o j e n + k u m m e l i t u r s k a n + k u m m e l i t u r s k a s a a l i i d e n + k u m m e l i t u r s k a t + k u m m e l i t u r s k a v a r o i h i n + k u m m e m m i k s i + k u m m e m m i n + k u m m e m p a a + k u m m e m p i a + k u m m i l a p s i t o i m i n t a + k u m m i t o i m i n t a m a l l i s t a + k u m m i t u s i l m a l a i v a t + k u m m i t u s j u n a + k u m m i t u s j u t t u + k u m m i t u s k a r t a n o + k u m m i t u s k e s k u s t e l u s s a + k u m m i t u s n e u l a t + k u m m i t u s s a m m a k k o + k u m m i t u s s i m p u t + k u m o a a + k u m o a m a a n + k u m o a m i s e k s i + k u m o a m i s e s t a + k u m o a m i s p o l i t i i k k o j a + k u m o a m i s t a + k u m o a v a t + k u m o t a a n + k u m o t a k s e e n + k u m o u k s e l l i s e m p i + k u m o u k s e l l i s i a + k u m p a a n + k u m p a r e l a s k u + k u m p p a n e i d e m m e + k u m p p a n e i d e n + k u m p p a n e i h i n + k u m p p a n e i k s e e n + k u m p p a n e i k s i + k u m p p a n e i l l a + k u m p p a n e i l l e + k u m p p a n e i l l e e n + k u m p p a n e i l l e m m e + k u m p p a n e i l t a a n + k u m p p a n e i l t a m m e + k u m p p a n e i n a + k u m p p a n e i s t a + k u m p p a n e i s t a a n + k u m p p a n e i s t a m m e + k u m p p a n e i t a + k u m p p a n e i t a a n + k u m p p a n e i t a m m e + k u m p p a n i a + k u m p p a n i a l u e i d e n + k u m p p a n i e m m e + k u m p p a n i e n + k u m p p a n i e n k i n + k u m p p a n i h a l l i t u k s e t + k u m p p a n i h a l l i t u s t e m m e + k u m p p a n i h a l l i t u s t e n + k u m p p a n i i n + k u m p p a n i j ä r j e s t ö + k u m p p a n i j ä r j e s t ö i l l e + k u m p p a n i j ä r j e s t ö j e n + k u m p p a n i j ä r j e s t ö j ä + k u m p p a n i j ä r j e s t ö m m e + k u m p p a n i j ä r j e s t ö ä + k u m p p a n i k a n s o j e n + k u m p p a n i k s i + k u m p p a n i l l e e n + k u m p p a n i m a a + k u m p p a n i m a a h a n + k u m p p a n i m a a m m e + k u m p p a n i m a a n + k u m p p a n i m a a s s a + k u m p p a n i m a a s t a + k u m p p a n i m a a t + k u m p p a n i m a a t a + k u m p p a n i m a i d e m m e + k u m p p a n i m a i d e n + k u m p p a n i m a i h i n + k u m p p a n i m a i l l a + k u m p p a n i m a i l l e + k u m p p a n i m a i l l e e n + k u m p p a n i m a i l l e m m e + k u m p p a n i m a i l t a + k u m p p a n i m a i s s a + k u m p p a n i m a i s s a m m e + k u m p p a n i m a i s t a + k u m p p a n i m a i t a + k u m p p a n i m a i t a m m e + k u m p p a n i m a i t t e m m e + k u m p p a n i m m e + k u m p p a n i n + k u m p p a n i n a + k u m p p a n i n s a + k u m p p a n i o r g a n i s a a t i o i d e n + k u m p p a n i o r g a n i s a a t i o i t a + k u m p p a n i r y h m i e n + k u m p p a n i s t a + k u m p p a n i t + k u m p p a n i v a l i k o i m a a n s a + k u m p p a n i v a l t i o + k u m p p a n i v a l t i o i d e m m e + k u m p p a n i v a l t i o i d e n + k u m p p a n i v a l t i o i d e n s a + k u m p p a n i v a l t i o i h i m m e + k u m p p a n i v a l t i o i h i n + k u m p p a n i v a l t i o i l l a + k u m p p a n i v a l t i o i l l e + k u m p p a n i v a l t i o i l l e m m e + k u m p p a n i v a l t i o i s s a + k u m p p a n i v a l t i o i s s a m m e + k u m p p a n i v a l t i o i s t a + k u m p p a n i v a l t i o i s t a m m e + k u m p p a n i v a l t i o i t a + k u m p p a n i v a l t i o l l e + k u m p p a n i v a l t i o m m e + k u m p p a n i v a l t i o n + k u m p p a n i v a l t i o s t a + k u m p p a n i v a l t i o t + k u m p p a n i v e r k o s t o j a + k u m p p a n i v ä l i n e t t ä + k u m p p a n u u d e l l a + k u m p p a n u u d e l l e + k u m p p a n u u d e n + k u m p p a n u u d e s s a + k u m p p a n u u d e s t a + k u m p p a n u u d e t + k u m p p a n u u k s i a + k u m p p a n u u k s i e n + k u m p p a n u u k s i i n + k u m p p a n u u k s i s s a + k u m p p a n u u k s i s s a m m e + k u m p p a n u u k s i s t a + k u m p p a n u u s a i h e e s t a + k u m p p a n u u s a l o i t e + k u m p p a n u u s a l o i t t e e t + k u m p p a n u u s a l o i t t e i d e n + k u m p p a n u u s a l o i t t e i l l e m m e + k u m p p a n u u s a l o i t t e i s i i n + k u m p p a n u u s a l u e i d e n + k u m p p a n u u s a l u e i s t a + k u m p p a n u u s a s e m a + k u m p p a n u u s a s e m a a + k u m p p a n u u s a s i a + k u m p p a n u u s e d e l l y t y k s e t + k u m p p a n u u s f o o r u m i + k u m p p a n u u s f o o r u m i n + k u m p p a n u u s h a n k k e e n + k u m p p a n u u s h a n k k e i d e n + k u m p p a n u u s h a n k k e i t a + k u m p p a n u u s h e n g e s s ä + k u m p p a n u u s h e n g e s t ä m m e + k u m p p a n u u s h e n k e ä + k u m p p a n u u s j u l i s t u s + k u m p p a n u u s j ä r j e s t e l m i e n + k u m p p a n u u s j ä r j e s t e l m i i n + k u m p p a n u u s j ä r j e s t e l m ä + k u m p p a n u u s j ä r j e s t e l m ä l l e + k u m p p a n u u s j ä r j e s t e l m ä n + k u m p p a n u u s j ä r j e s t e l m ä s s ä + k u m p p a n u u s j ä r j e s t e l m ä s t ä + k u m p p a n u u s j ä r j e s t e l y j ä + k u m p p a n u u s j ä r j e s t e l y l l ä + k u m p p a n u u s j ä r j e s t e l y t + k u m p p a n u u s j ä r j e s t ö j e n + k u m p p a n u u s j ä r j e s t ö j ä + k u m p p a n u u s j ä r j e s t ö ä + k u m p p a n u u s k e h y k s e l l e + k u m p p a n u u s k e h y s + k u m p p a n u u s k e h y s t ä + k u m p p a n u u s k e r t o m u k s i a + k u m p p a n u u s k o k o u s + k u m p p a n u u s k o n f e r e n s s i a + k u m p p a n u u s k y s y m y s + k u m p p a n u u s k ä s i t e t t ä + k u m p p a n u u s k ä s i t t e e s e e n + k u m p p a n u u s k ä y t ä n t ö ä + k u m p p a n u u s l a u s e k k e e n + k u m p p a n u u s l a u t a k u n t i e n + k u m p p a n u u s m a a m m e + k u m p p a n u u s m a a n + k u m p p a n u u s m a a s t a + k u m p p a n u u s m a a t + k u m p p a n u u s m a a t a l o u s + k u m p p a n u u s m a h d o l l i s u u k s i a + k u m p p a n u u s m a i d e m m e + k u m p p a n u u s m a i d e n + k u m p p a n u u s m a i h i n + k u m p p a n u u s m a i l l e + k u m p p a n u u s m a i l l e m m e + k u m p p a n u u s m a i s s a + k u m p p a n u u s m a i s s a m m e + k u m p p a n u u s m a i t a + k u m p p a n u u s m a l l i + k u m p p a n u u s m a l l i a + k u m p p a n u u s m a l l i n + k u m p p a n u u s m e k a n i s m i n + k u m p p a n u u s m e n e t e l m ä + k u m p p a n u u s m e n e t e l m ä ä + k u m p p a n u u s m e n e t t e l y s t ä + k u m p p a n u u s m u o d o i s s a + k u m p p a n u u s m u o d o i s t a + k u m p p a n u u s m u o t o j a + k u m p p a n u u s m u o t o n a + k u m p p a n u u s n e u v o s t o + k u m p p a n u u s n e u v o s t o n + k u m p p a n u u s n e u v o t t e l u j a + k u m p p a n u u s n ä k y m ä t + k u m p p a n u u s o h j e l m a + k u m p p a n u u s o h j e l m a a + k u m p p a n u u s o h j e l m a a n + k u m p p a n u u s o h j e l m a n + k u m p p a n u u s o h j e l m a s s a + k u m p p a n u u s o h j e l m a t + k u m p p a n u u s o h j e l m i a + k u m p p a n u u s o h j e l m i e n + k u m p p a n u u s o h j e l m i s s a + k u m p p a n u u s o h j e l m i s t a + k u m p p a n u u s o r g a n i s a a t i o i d e n + k u m p p a n u u s p a n k k i e n + k u m p p a n u u s p e r i a a t e + k u m p p a n u u s p e r i a a t e t t a + k u m p p a n u u s p e r i a a t t e e l l e + k u m p p a n u u s p e r i a a t t e e n + k u m p p a n u u s p e r i a a t t e e s e e n + k u m p p a n u u s p e r i a a t t e e s s a + k u m p p a n u u s p e r i a a t t e e s t a + k u m p p a n u u s p e r i a a t t e e t + k u m p p a n u u s p e r i a a t t e i d e n + k u m p p a n u u s p e r i a a t t e i t a + k u m p p a n u u s p o l i t i i k a n + k u m p p a n u u s p o l i t i i k a s t a + k u m p p a n u u s p o l i t i i k k a + k u m p p a n u u s p o l i t i i k k a a + k u m p p a n u u s p o l i t i i k k a a n + k u m p p a n u u s p r o j e k t i t + k u m p p a n u u s p r o s e s s i e n + k u m p p a n u u s p r o s e s s i i n + k u m p p a n u u s p u i t e s o p i m u k s e n + k u m p p a n u u s p u i t e s o p i m u s j ä r j e s t e l m ä + k u m p p a n u u s p u i t t e e t + k u m p p a n u u s r a k e n n e + k u m p p a n u u s r a k e n t e i d e n + k u m p p a n u u s r a k e n t e i t a + k u m p p a n u u s r o o l i n + k u m p p a n u u s r y h m ä + k u m p p a n u u s s i s u k k u u d e k s i + k u m p p a n u u s s i t o u m u s + k u m p p a n u u s s o p i m u k s e e n + k u m p p a n u u s s o p i m u k s e k s i + k u m p p a n u u s s o p i m u k s e l l a + k u m p p a n u u s s o p i m u k s e l l e + k u m p p a n u u s s o p i m u k s e m m e + k u m p p a n u u s s o p i m u k s e n + k u m p p a n u u s s o p i m u k s e s s a + k u m p p a n u u s s o p i m u k s e s t a + k u m p p a n u u s s o p i m u k s e t + k u m p p a n u u s s o p i m u k s i a + k u m p p a n u u s s o p i m u k s i e n + k u m p p a n u u s s o p i m u k s i e n s a + k u m p p a n u u s s o p i m u k s i i n + k u m p p a n u u s s o p i m u k s i k s i + k u m p p a n u u s s o p i m u k s i l l a + k u m p p a n u u s s o p i m u k s i l l e + k u m p p a n u u s s o p i m u k s i s s a + k u m p p a n u u s s o p i m u k s i s t a + k u m p p a n u u s s o p i m u s + k u m p p a n u u s s o p i m u s l u o n n o k s e e n + k u m p p a n u u s s o p i m u s l u o n n o k s e n + k u m p p a n u u s s o p i m u s t a + k u m p p a n u u s s o p i m u s t e n + k u m p p a n u u s s t r a t e g i a + k u m p p a n u u s s t r a t e g i a a + k u m p p a n u u s s t r a t e g i a n + k u m p p a n u u s s t r a t e g i a s t a + k u m p p a n u u s s u h d e + k u m p p a n u u s s u h d e m u o t o j a + k u m p p a n u u s s u h d e t t a + k u m p p a n u u s s u h t e e l l e + k u m p p a n u u s s u h t e e n + k u m p p a n u u s s u h t e e s e e n + k u m p p a n u u s s u h t e e s t a + k u m p p a n u u s s u h t e e t + k u m p p a n u u s s u h t e i d e m m e + k u m p p a n u u s s u h t e i s s a + k u m p p a n u u s s u h t e i t a + k u m p p a n u u s s u h t e i t a m m e + k u m p p a n u u s s u u n n i t e l m a + k u m p p a n u u s t a p a a m i s i a + k u m p p a n u u s t a s o l l a + k u m p p a n u u s t o i m e t + k u m p p a n u u s t o i m i a + k u m p p a n u u s t o i m i n n a n + k u m p p a n u u s t u t k i m u s h a n k k e i t a + k u m p p a n u u s t y ö s k e n t e l y ä + k u m p p a n u u s v a i h d o s s a + k u m p p a n u u s v a l t i o i d e m m e + k u m p p a n u u s v a l t i o i d e n + k u m p p a n u u s v a l t i o i h i n + k u m p p a n u u s v a l t i o i s s a + k u m p p a n u u s v a l t i o i t a + k u m p p a n u u s v a l t i o k s i + k u m p p a n u u s v a l t i o n + k u m p p a n u u s v a l t i o o m m e + k u m p p a n u u s v a l t i o s s a + k u m p p a n u u s v a l t i o t + k u m p p a n u u s v a l t i o t a + k u m p p a n u u s v e r k o n + k u m p p a n u u s v ä l i n e + k u m p p a n u u s v ä l i n e e l l e + k u m p p a n u u s v ä l i n e e n + k u m p p a n u u s v ä l i n e i t ä + k u m p p a n u u s v ä l i n e t t ä + k u m p p a n u u s y h t e i s ö ä m m e + k u m p p a n u u s y h t e y k s i ä + k u m p p a n u u s y l i o p i s t o j e n + k u m p p a n u u t e e n + k u m p p a n u u t t a + k u m p p a n u u t t a m m e + k u m p u k e r r o s p i l v i + k u m p u p i l v i + k u m u l a a t i o a l u e e l t a + k u m u l a a t i o a l u e i t a + k u m u l a a t i o j ä r j e s t e l m ä + k u m u l a a t i o l l e + k u m u l a t i i v i s i s t a + k u n i n g a s a j a t u k s i a + k u n i n g a s a l b a t r o s s i + k u n i n g a s a n t i l o o p p i + k u n i n g a s d o l l a r i s t a + k u n i n g a s e u k a l y p t u s + k u n i n g a s f a s a a n i + k u n i n g a s f r e g a t t i l i n t u + k u n i n g a s g a m b i i t t i + k u n i n g a s h a r l e k i i n i + k u n i n g a s h i i r i h a u k k a + k u n i n g a s h u o n e + k u n i n g a s h u o n e e s t a + k u n i n g a s h u o n e i d e n + k u n i n g a s h u o n e i l l e + k u n i n g a s h y m n i + k u n i n g a s i n t i a l a i n e n + k u n i n g a s j ä t k ä + k u n i n g a s k a i j a t + k u n i n g a s k o b r a + k u n i n g a s k o n d o r i + k u n i n g a s k o t i l o + k u n i n g a s k u n n a l l a + k u n i n g a s k u n n a l l e + k u n i n g a s k u n n a l t a + k u n i n g a s k u n n a n + k u n i n g a s k u n n a s s a + k u n i n g a s k u n n a s s a h a n + k u n i n g a s k u n n a s s a k a a n + k u n i n g a s k u n n a s s a k i n + k u n i n g a s k u n n a s t a + k u n i n g a s k u n n a t + k u n i n g a s k u n t a + k u n i n g a s k u n t a a + k u n i n g a s k u n t a a n + k u n i n g a s k ä ä r m e + k u n i n g a s l i i k e + k u n i n g a s l i l j a + k u n i n g a s l o h i + k u n i n g a s l u e t t e l o + k u n i n g a s m a g n o l i a + k u n i n g a s m a k r i l l i + k u n i n g a s m e r i k o t k a + k u n i n g a s o s t e r i v i n o k a s + k u n i n g a s p a r i + k u n i n g a s p e r h e + k u n i n g a s p e r h e e l l e + k u n i n g a s p e r h e e l t ä + k u n i n g a s p e r h e e n + k u n i n g a s p e r h e e s e e n + k u n i n g a s p e r h e e s t ä + k u n i n g a s p e r h e t t ä + k u n i n g a s p i n g v i i n i + k u n i n g a s p y t o n + k u n i n g a s r a p u + k u n i n g a s r o t t a + k u n i n g a s s a n i a i n e n + k u n i n g a s s o t i l a s p e l i t + k u n i n g a s t i i r a + k u n i n g a s t r a p p i + k u n i n g a s t u k a a n i + k u n i n g a s v e s i + k u n i n g a s v ä r i s u o r a + k u n i n g a t a r g a m b i i t t i + k u n i n g a t a r i n t i a l a i n e n + k u n i n g a t a r m e h i l ä i n e n + k u n i n g a t a r n e i d o n k i e l i + k u n i n g a t a r r a t s u n + k u n i n g a t a r s o t i l a s p e l i t + k u n i n g a t a r ä i d i n + k u n i n g a t a r ä i t i + k u n i n g a t t a r e n + k u n i n k a a l l i s e n + k u n i n k a a l l i s e t + k u n i n k a a n t i e + k u n i n k a a n t i e n + k u n i n k a a t + k u n i n k a i s t a + k u n n a l l i s h a l l i n n o l l e + k u n n a l l i s h a l l i n n o n + k u n n a l l i s h a l l i n n o t + k u n n a l l i s h a l l i n t o + k u n n a l l i s i a + k u n n a l l i s i s s a + k u n n a l l i s j ä t e t t ä + k u n n a l l i s n e u v o s t o n + k u n n a l l i s p a l v e l u i s s a + k u n n a l l i s p a l v e l u j e n + k u n n a l l i s p i i r i + k u n n a l l i s p o l i i t i k k o j a + k u n n a l l i s p o l i i t i k k o j e n + k u n n a l l i s p o l i i t i k o i l l e + k u n n a l l i s p o l i t i i k a s s a + k u n n a l l i s t a s o l l a + k u n n a l l i s t e k n i i k k a a n + k u n n a l l i s v a a l e i h i n + k u n n a l l i s v a a l e i s s a + k u n n a l l i s v a a l e i s t a + k u n n a l l i s v a a l e j a + k u n n a l l i s v a a l i e n + k u n n a l l i s v a a l i o i k e u d e n + k u n n a l l i s v a a l i t + k u n n a l l i s v i r a n o m a i s e t + k u n n a l l i s v i r a n o m a i s i a + k u n n a l l i s v i r a n o m a i s i i n + k u n n a l l i s v i r a n o m a i s t e n + k u n n a n h a l l i t u k s e l l e + k u n n a n j o h t a j i a m m e + k u n n a n o s a + k u n n a n v a l t u u s t o + k u n n a n v a l t u u s t o a + k u n n a n v a l t u u s t o i s s a + k u n n a n v a l t u u s t o j a + k u n n a n v a l t u u s t o j e n + k u n n a n v a l t u u s t o n + k u n n a n v a l t u u s t o s s a + k u n n a n v a l t u u s t o t + k u n n a n v a l t u u t e t t u + k u n n a n v a l t u u t e t t u a + k u n n a n v a l t u u t e t t u j a + k u n n a n v a l t u u t e t t u j e n + k u n n a n v a l t u u t e t t u n a + k u n n a n v i r a n o m a i s e t + k u n n a n v i r a n o m a i s t e n + k u n n a s s a + k u n n a t + k u n n i a a + k u n n i a h i m o i n e n + k u n n i a h i m o i s i m m a n + k u n n i a j ä s e n + k u n n i a j ä s e n e k s i + k u n n i a j ä s e n e n + k u n n i a j ä s e n e t + k u n n i a j ä s e n i l l e + k u n n i a j ä s e n i ä + k u n n i a j ä s e n j ä r j e s t e l m ä ä + k u n n i a j ä s e n y y k s i ä + k u n n i a j ä s e n y y s + k u n n i a j ä s e n y y t e n s ä + k u n n i a k a n s a l a i n e n + k u n n i a k a n s a l a i s e n + k u n n i a k o m p p a n i a + k u n n i a k o n s u l i a + k u n n i a k o o d i n + k u n n i a k s i + k u n n i a k ä s i t e + k u n n i a l a u k a u k s i n + k u n n i a l e g i o o n a + k u n n i a l l a + k u n n i a l l i s e l t a + k u n n i a l l i s e m m i s t a + k u n n i a l l i s e n a + k u n n i a l l i s e t + k u n n i a l l i s i i n + k u n n i a l l i s i n + k u n n i a l l i s i s t a + k u n n i a l l i s u u s k u i l u n + k u n n i a m a i n i n n a n + k u n n i a m e r k k i + k u n n i a m u r h a + k u n n i a m u r h a n + k u n n i a m u r h a t + k u n n i a m u r h i a + k u n n i a m u r h i e n + k u n n i a m u r h i i n + k u n n i a m u r h i s s a + k u n n i a m u r h i s t a + k u n n i a n + k u n n i a n a r v o i s e t + k u n n i a n a r v o i s i a + k u n n i a n a r v o i s i l l e + k u n n i a n h i m o + k u n n i a n h i m o a + k u n n i a n h i m o i n e n + k u n n i a n h i m o i s e e n + k u n n i a n h i m o i s e k s i + k u n n i a n h i m o i s e l l a + k u n n i a n h i m o i s e l t a + k u n n i a n h i m o i s e m m a k s i + k u n n i a n h i m o i s e m m a l l a + k u n n i a n h i m o i s e m m a l t a + k u n n i a n h i m o i s e m m a n + k u n n i a n h i m o i s e m m a s s a + k u n n i a n h i m o i s e m m a s t a + k u n n i a n h i m o i s e m m a t + k u n n i a n h i m o i s e m m i k s i + k u n n i a n h i m o i s e m m i l l a + k u n n i a n h i m o i s e m m i l l e + k u n n i a n h i m o i s e m m i n + k u n n i a n h i m o i s e m m i s t a + k u n n i a n h i m o i s e m p a a + k u n n i a n h i m o i s e m p a a n + k u n n i a n h i m o i s e m p i + k u n n i a n h i m o i s e m p i a + k u n n i a n h i m o i s e m p i a k i n + k u n n i a n h i m o i s e m p i e n + k u n n i a n h i m o i s e m p i i n + k u n n i a n h i m o i s e n + k u n n i a n h i m o i s e s s a + k u n n i a n h i m o i s e s t a + k u n n i a n h i m o i s e s t i + k u n n i a n h i m o i s e t + k u n n i a n h i m o i s i a + k u n n i a n h i m o i s i i n + k u n n i a n h i m o i s i m m a k s i + k u n n i a n h i m o i s i m m a n + k u n n i a n h i m o i s i m m a s t a + k u n n i a n h i m o i s i m m a t + k u n n i a n h i m o i s i m m a t k a a n + k u n n i a n h i m o i s i m m a t k i n + k u n n i a n h i m o i s i m m i s s a + k u n n i a n h i m o i s i m m i s t a + k u n n i a n h i m o i s i m p a n a + k u n n i a n h i m o i s i m p i a + k u n n i a n h i m o i s i m p i e n + k u n n i a n h i m o i s i n + k u n n i a n h i m o i s i n t a + k u n n i a n h i m o i s i s s a + k u n n i a n h i m o i s i s t a + k u n n i a n h i m o i s t a + k u n n i a n h i m o i s t e n + k u n n i a n h i m o n + k u n n i a n h i m o o n + k u n n i a n h i m o s t a + k u n n i a n h i m o t t o m a m p i + k u n n i a n h i m o t t o m a n a + k u n n i a n h i m o t t o m i a + k u n n i a n l o u k k a u k s e k s i + k u n n i a n l o u k k a u k s e s t a + k u n n i a n l o u k k a u k s e t + k u n n i a n l o u k k a u k s i a + k u n n i a n l o u k k a u s j u t t u n s a + k u n n i a n l o u k k a u s j u t u s s a + k u n n i a n l o u k k a u s r i k o k s e s t a + k u n n i a n o s o i t u k s e n a + k u n n i a n o s o i t u k s e n i + k u n n i a n o s o i t u k s e s t a + k u n n i a n o s o i t u s + k u n n i a n v a r t i j a + k u n n i a o i k e u k s i a + k u n n i a p a i k a l l a + k u n n i a p a i k a l l e + k u n n i a p a i k a l l e e n + k u n n i a p a i k a n + k u n n i a p a i k k a + k u n n i a p a i k k a a + k u n n i a p a l k i n t o + k u n n i a p u h e e n j o h t a j a + k u n n i a p u h e e n j o h t a j a k s i + k u n n i a r i k o k s e t + k u n n i a r i k o k s i a + k u n n i a r i k o k s i i n + k u n n i a r i k o k s i l t a + k u n n i a r i k o k s i s t a + k u n n i a r i k o s t e n + k u n n i a s y i s t ä + k u n n i a t e h t ä v ä + k u n n i a t o h t o r i + k u n n i a t t o m i m m i s t a + k u n n i a t u t k i n t o + k u n n i a v e l k a + k u n n i a v e l k a n i + k u n n i a v i e r a a k s e e n + k u n n i a v i e r a a k s i + k u n n i a v i e r a a n a + k u n n i a v i e r a i d e n + k u n n i a v i e r a s a i t i o o m m e + k u n n i a v i e r a s a i t i o s s a + k u n n i a v ä k i v a l t a + k u n n i l l e + k u n n i o i t a m m e + k u n n i o i t a m m e k o + k u n n i o i t a n + k u n n i o i t e t a + k u n n i o i t e t a a n + k u n n i o i t e t a a n k o + k u n n i o i t e t t a i s i i n + k u n n i o i t e t t a v a a + k u n n i o i t e t t a v a l t a + k u n n i o i t e t t a v a t + k u n n i o i t e t t a v i a + k u n n i o i t e t t a v i m m i s t a + k u n n i o i t e t u i m m a n + k u n n i o i t e t u i m p i a + k u n n i o i t t a a + k u n n i o i t t a a k s e e n + k u n n i o i t t a a k s e m m e + k u n n i o i t t a a k s e n i + k u n n i o i t t a e n + k u n n i o i t t a i s i + k u n n i o i t t a i s i v a t + k u n n i o i t t a k a a + k u n n i o i t t a k a a m m e + k u n n i o i t t a m a a n + k u n n i o i t t a m a l l a + k u n n i o i t t a m a s t a + k u n n i o i t t a m a t t a + k u n n i o i t t a m i s e e n + k u n n i o i t t a m i s e k s i + k u n n i o i t t a m i s e l l e + k u n n i o i t t a m i s e n + k u n n i o i t t a m i s e s s a + k u n n i o i t t a m i s e s t a + k u n n i o i t t a m i s t a + k u n n i o i t t a n e e t + k u n n i o i t t a n u t + k u n n i o i t t a v a a + k u n n i o i t t a v a a n + k u n n i o i t t a v a m m a n + k u n n i o i t t a v a m m i n + k u n n i o i t t a v a m p a a + k u n n i o i t t a v a m p a a n + k u n n i o i t t a v a m p i a + k u n n i o i t t a v a m p i e n + k u n n i o i t t a v a m p i i n + k u n n i o i t t a v a n + k u n n i o i t t a v a n i + k u n n i o i t t a v a n s a + k u n n i o i t t a v a s t a + k u n n i o i t t a v a t + k u n n i o i t t a v i a + k u n n i o i t t a v i e n + k u n n i o i t t a v i m m i n + k u n n i o i t t i + k u n n i o i t u k s e e n + k u n n i o i t u k s e l l a + k u n n i o i t u k s e m m e + k u n n i o i t u k s e n + k u n n i o i t u k s e n i + k u n n i o i t u k s e n o s o i t u s + k u n n i o i t u k s e n s a + k u n n i o i t u k s e s s a + k u n n i o i t u k s e s t a + k u n n i o i t u s t a + k u n n i o i t u s t a a n + k u n n i o i t u s t a m m e + k u n n i o i t u s t a n i + k u n n i o i t u s t a n n e + k u n n i s s a + k u n n i s t a + k u n n o l l i s e e n + k u n n o l l i s e n + k u n n o l l i s e t + k u n n o l l i s i a + k u n n o l l i s i l l a + k u n n o l l i s t a + k u n n o s s a p i d o s t a + k u n n o s s a p i t o s e k t o r i l l a + k u n n o s s a p i t o t y ö n + k u n n o s t a a k s e m m e + k u n n o s t a m i n e n + k u n n o s t a m i s e e n + k u n n o s t a m i s e k s i + k u n n o s t a m i s e l l e + k u n n o s t a m i s e s t a + k u n n o s t a m i s o h j e l m a + k u n n o s t a m i s o h j e l m a t + k u n n o s t a m i s s t r a t e g i a + k u n n o s t a m i s t a + k u n n o s t a m i s t a r v e t t a + k u n n o s t a m i s t o i m i a + k u n n o s t a u t u i + k u n n o s t a u t u n u t + k u n n o s t e t t a v a + k u n n o s t e t t u + k u n n o s t u s h a n k k e e s s a + k u n n o s t u s h a n k k e e t + k u n n o s t u s h a n k k e i d e n + k u n n o s t u s h a n k k e i t a + k u n n o s t u s k e h y s t ä + k u n n o s t u s k u l u i s t a + k u n n o s t u s k u s t a n n u k s i i n + k u n n o s t u s o h j e l m a + k u n n o s t u s o h j e l m a a + k u n n o s t u s o h j e l m a l l a a n + k u n n o s t u s o h j e l m a m m e + k u n n o s t u s o h j e l m a n + k u n n o s t u s o h j e l m i l l e + k u n n o s t u s o h j e l m i s t a + k u n n o s t u s p r o s e s s i + k u n n o s t u s s u u n n i t e l m i a + k u n n o s t u s s u u n n i t e l m i e n + k u n n o s t u s t a + k u n n o s t u s t a r p e e t + k u n n o s t u s t o i m e n p i t e i d e n + k u n n o s t u s t o i m e t + k u n n o s t u s t o i m i a + k u n n o s t u s t y ö h ö n + k u n n o s t u s t y ö t + k u n n o s t u s t ö i d e n + k u n n o s t u s t ö i h i n + k u n n o s t u s t ö i t ä + k u n n o s t u s v a a t i m u k s i i n + k u n n o s t u s v a i h e e s t a + k u n n o s t u s v a i h e t t a + k u n t a j ä r j e s t ö t + k u n t a k o o d i + k u n t a l a a j e n n u s + k u n t a l ä ä n i n h a l l i t u k s i k s i + k u n t a t a s o l l a + k u n t a t a s o n + k u n t a u u d i s t u s + k u n t a v a a l i t + k u n t i a + k u n t i e n + k u n t o i s u u s k o k e e n + k u n t o k l u b i + k u n t o l a i t t e i t a + k u n t o p i i r i + k u n t o p y ö r ä + k u n t o s a l i + k u n t o s a l i l a i t t e e t + k u n t o t a r k a s t u k s i i n + k u n t o t e s t i + k u n t o u t u s a p u a + k u n t o u t u s j ä r j e s t e l m ä n + k u n t o u t u s k e i n o + k u n t o u t u s k e s k u k s e t + k u n t o u t u s k e s k u k s i a + k u n t o u t u s k e s k u k s i l l e + k u n t o u t u s k e s k u s t a + k u n t o u t u s k e s k u s t e n + k u n t o u t u s l e i r e i l t ä + k u n t o u t u s o h j e l m a a n + k u n t o u t u s o h j e l m i a + k u n t o u t u s o h j e l m i i n + k u n t o u t u s o h j e l m i s s a + k u n t o u t u s p a l v e l u i t a + k u n t o u t u s p a l v e l u j e n + k u n t o u t u s s t r a t e g i a + k u n t o u t u s t a + k u n t o u t u s t e r a p i a a n + k u n t o u t u s t o i m i l l e + k u n t o u t u s t y ö n + k u n t o u t u s t y ö t ä + k u n t o v a l m i s t e i d e n + k u o h u k e r m a a + k u o h u n n a n + k u o h u t t a n e e t + k u o h u t t a v a a + k u o h u t t a v a s s a + k u o h u t t a v a t + k u o h u v i i n i + k u o h u v i i n i n + k u o h u v i i n i ä + k u o k k a v i e r a a t + k u o k k a v i e r a i l u + k u o k k a v i e r a i n a + k u o k k i m i s t a + k u o l a j o k i + k u o l a n n o r j a l a i s e t + k u o l a n r i k k o + k u o l a n v u o n o + k u o l e e + k u o l e e k o + k u o l e m a a + k u o l e m a a n + k u o l e m a a n s a + k u o l e m a a n t u o m i t t u a + k u o l e m a a n t u o m i t t u i h i n + k u o l e m a a n t u o m i t t u j a + k u o l e m a a n t u o m i t t u j e n + k u o l e m a a n t u o m i t u i l l a + k u o l e m a a n t u o m i t u i s t a + k u o l e m a a n t u o m i t u n + k u o l e m a a n t u o m i t u t + k u o l e m a l t a + k u o l e m a n + k u o l e m a n j o u k k o j a + k u o l e m a n j o u k o t + k u o l e m a n j ä l k e i s i ä + k u o l e m a n k a u p p i a i d e n + k u o l e m a n k a u p p i a i t a + k u o l e m a n k e l l o + k u o l e m a n l a a k s o + k u o l e m a n l a a k s o k s i + k u o l e m a n l a i v a a + k u o l e m a n l e i r e i h i n + k u o l e m a n l e i r e i l l e + k u o l e m a n l e i r e i l l ä + k u o l e m a n l e i r e j ä + k u o l e m a n l e i r i + k u o l e m a n l e i r i k s i + k u o l e m a n l e i r i l l e + k u o l e m a n l e i r i n + k u o l e m a n l o u k k u + k u o l e m a n m a r s s i + k u o l e m a n o t t e l u + k u o l e m a n p a r t i o + k u o l e m a n p a r t i o i d e n + k u o l e m a n p a r t i o i t a + k u o l e m a n p a r t i o n + k u o l e m a n p a r t i o t + k u o l e m a n p e l k o + k u o l e m a n p e l k o a + k u o l e m a n p o r t t i + k u o l e m a n r a j a k o k e m u s + k u o l e m a n r a n g a i s t u k s e e n + k u o l e m a n r a n g a i s t u k s e l l a + k u o l e m a n r a n g a i s t u k s e l l e + k u o l e m a n r a n g a i s t u k s e l t a + k u o l e m a n r a n g a i s t u k s e n + k u o l e m a n r a n g a i s t u k s e n s a + k u o l e m a n r a n g a i s t u k s e s s a + k u o l e m a n r a n g a i s t u k s e s t a + k u o l e m a n r a n g a i s t u k s e t + k u o l e m a n r a n g a i s t u k s i a + k u o l e m a n r a n g a i s t u k s i e n + k u o l e m a n r a n g a i s t u k s i i n + k u o l e m a n r a n g a i s t u k s i l l a + k u o l e m a n r a n g a i s t u k s i s s a + k u o l e m a n r a n g a i s t u k s i s t a + k u o l e m a n r a n g a i s t u s + k u o l e m a n r a n g a i s t u s a s i a a + k u o l e m a n r a n g a i s t u s a s i a s s a + k u o l e m a n r a n g a i s t u s j ä r j e s t e l m i s s ä + k u o l e m a n r a n g a i s t u s k i e l t o + k u o l e m a n r a n g a i s t u s k y s y m y k s e s s ä + k u o l e m a n r a n g a i s t u s l a k i + k u o l e m a n r a n g a i s t u s t a + k u o l e m a n r a n g a i s t u s t e n + k u o l e m a n r a n g a i s t u s t u o m i o + k u o l e m a n r i s k i n + k u o l e m a n s e l l e i s s ä + k u o l e m a n s e l l i s s ä + k u o l e m a n s y n t i + k u o l e m a n s y n t i n ä + k u o l e m a n s y n t i ä + k u o l e m a n s y y + k u o l e m a n t a n s s i + k u o l e m a n t a p a u k s e e n + k u o l e m a n t a p a u k s e s s a + k u o l e m a n t a p a u k s e s t a + k u o l e m a n t a p a u k s e t + k u o l e m a n t a p a u k s i a + k u o l e m a n t a p a u k s i e n + k u o l e m a n t a p a u k s i l t a + k u o l e m a n t a p a u k s i s t a + k u o l e m a n t a p a u s t a + k u o l e m a n t a p a u s t e n + k u o l e m a n t e l o i t u s t e n + k u o l e m a n t u o m i o + k u o l e m a n t u o m i o i d e n + k u o l e m a n t u o m i o i h i n + k u o l e m a n t u o m i o i l l a + k u o l e m a n t u o m i o i l t a + k u o l e m a n t u o m i o i s t a + k u o l e m a n t u o m i o i t a + k u o l e m a n t u o m i o l l a + k u o l e m a n t u o m i o l l e + k u o l e m a n t u o m i o n + k u o l e m a n t u o m i o n s a + k u o l e m a n t u o m i o o n + k u o l e m a n t u o m i o s t a + k u o l e m a n t u o m i o t + k u o l e m a n t u o m i o t a + k u o l e m a n t u o m i o t a a n + k u o l e m a n t u o m i o t a k i n + k u o l e m a n t u o m i s t a + k u o l e m a n t u o m i t t u j e n + k u o l e m a n t u o m i t u i l l e + k u o l e m a n t u o t t a m u s + k u o l e m a n t ä h t i + k u o l e m a n v a a r a + k u o l e m a n v a a r a a + k u o l e m a n v a a r a a n + k u o l e m a n v a a r a l l e + k u o l e m a n v a a r a l l i s t a + k u o l e m a n v a a r a n + k u o l e m a n v a a r a s s a + k u o l e m a n v a k a v a + k u o l e m a n v e n e i d e n + k u o l e m a r a n g a i s t u k s e n + k u o l e m a s t a + k u o l e m a t + k u o l e m i a + k u o l e m i e n + k u o l e m i l l e + k u o l e m i s t a + k u o l e t t a v a l l a + k u o l e t t a v a m p i e n + k u o l e t t a v a n + k u o l e t t a v i a + k u o l e v a t + k u o l e v i e n + k u o l e v u u s t a s o j e n + k u o l e v u u s t a u l u k o i t a + k u o l e v u u t t a + k u o l i + k u o l i n i s k u a + k u o l i n i s k u n + k u o l i n k a m p p a i l u u n + k u o l i n k e l l o i s t a + k u o l i n k e l l o j a + k u o l i n s y i s t ä + k u o l i n s y i t ä + k u o l i n s y y n t u t k i n n a n + k u o l i n s y y n ä + k u o l i n s y y s t ä + k u o l i n s y y t ä + k u o l i n t o d i s t u k s e k s i + k u o l i n t o d i s t u k s e s s a + k u o l i n t o d i s t u s t a + k u o l i v a t + k u o l l a + k u o l l e e k s i + k u o l l e e n + k u o l l e e n m e r e n + k u o l l e e t + k u o l l e i d e n + k u o l l e i l l e + k u o l l e i l t a + k u o l l e i s i i n + k u o l l e i s t a + k u o l l e i s u u d e n + k u o l l e i s u u s a s t e + k u o l l e i s u u s a s t e e n + k u o l l e i s u u s a s t e e s s a + k u o l l e i s u u s a s t e e s t a + k u o l l e i s u u s l u k u i h i n + k u o l l e i s u u s l u k u j a + k u o l l e i s u u s l u k u j e n + k u o l l e i s u u s l u v u i s s a + k u o l l e i s u u s l u v u i s t a + k u o l l e i s u u s l u v u t + k u o l l e i s u u s t i l a s t o i s s a + k u o l l e i s u u t e e n + k u o l l e i s u u t e n s a + k u o l l e i s u u t t a + k u o l l e i t a + k u o l l u t m e r i + k u o l l u t t a + k u o l o n k a l p e u s + k u o l o n k a n k e u s + k u o l o n k o l a r e i s t a + k u o l o n k y l m y y s + k u o l o n s y ö j ä t + k u o l o n u h r e i h i n + k u o l o n u h r e i n e e n + k u o l o n u h r e i s t a + k u o l o n u h r e j a + k u o l o n u h r i + k u o l o n u h r i a + k u o l o n u h r i e n + k u o l o n u h r i t + k u o l o n v u o d e t + k u o l t a v a + k u o l t u a a n + k u o n o a n k e r i a a t + k u o n o b a r b i + k u o n o k a l a t + k u o n o k o p p a l a k e j a + k u o p i o n + k u o p p a i s e n + k u o p p a k e r a m i i k k a + k u o p p a p y y d y s + k u o p p a r i n t a + k u o r e n + k u o r e s s a + k u o r e t + k u o r e v e s i + k u o r i t u t + k u o r m a l i i n a + k u o r m a u s t i h e y t t ä + k u o r m a v a u n u i s s a + k u o r m i t t a a + k u o r m i t t a m a a n + k u o r m i t t a m a s t a + k u o r m i t t a m a t t a + k u o r m i t t a v a t + k u o r m i t t a v i a + k u o r m i t t u m i s e n + k u o r m i t u k s e s t a + k u o r m i t u s t a + k u o r m i t u s t e k i j ä t + k u o r m i t u s t i h e y d e s t ä + k u o r o k o l i b r i + k u o r o l a u s u n n a s t a + k u o r o s s a + k u o r o t i m a l i + k u o r t a + k u o v i s i r r i + k u p a r i a i n e i d e n + k u p a r i a l a + k u p a r i b r o m i d i + k u p a r i e r a k k o k o l i b r i + k u p a r i h a p s u k o l i b r i + k u p a r i h u i p p u + k u p a r i j a k a m a r i + k u p a r i j o d i d i + k u p a r i j ä r j e s t e l m ä ä n + k u p a r i k a i v o s t e n s a + k u p a r i k a r b o n a a t t i + k u p a r i k l o r i d i + k u p a r i k y s y m y k s e s t ä + k u p a r i l a a t t a + k u p a r i m a t e r i a a l i e n + k u p a r i o k s i d i + k u p a r i p i t o i s u u s + k u p a r i p o h j a i s t e n + k u p a r i p u t k i s t a + k u p a r i p y r s t ö k o t t a r a i n e n + k u p a r i s m a r a g d i k o l i b r i + k u p a r i s o n n i + k u p a r i s o r s a + k u p a r i s o r s a t + k u p a r i s u l f a a t t i + k u p a r i t a r k i s t u k s e t + k u p a r i t a s k u k o l i b r i + k u p a r i t e o l l i s u u d e l l e + k u p a r i t e o l l i s u u d e s t a + k u p a r i t e o l l i s u u t e e n + k u p a r i t e t r a + k u p a r i t u l o i l l a + k u p a r i t ö p ö k o l i b r i + k u p a r i y ö k k ö n e n + k u p l a a + k u p l a h a l l i + k u p l a h y l j e + k u p l a k a m m i o + k u p l a k s i + k u p l a l a j i t t e l u + k u p l a m u o v i + k u p l a n + k u p l a s t a + k u p l a t a l o u d e n + k u p l a t a l o u s + k u p l a v u o k k o + k u p p a k o k e e t + k u p p i k i v i + k u p u h a p e r o + k u p u l i m a s k a + k u p u m e l o n i k a k t u s + k u r d e i h i n + k u r d e i l l e + k u r d e i s t a + k u r d e j a + k u r d i a + k u r d i a l k u p e r ä ä + k u r d i a l u e + k u r d i a l u e e l l a + k u r d i a l u e e n + k u r d i a l u e e s t a + k u r d i a l u e i d e n + k u r d i a l u e i l l a + k u r d i e d u s t a j i a + k u r d i e l i m i e n + k u r d i e n + k u r d i h a l l i t u k s e n + k u r d i h a l l i t u s t a + k u r d i h e i m o n + k u r d i h e i m o o n + k u r d i j o h t a j a + k u r d i j o h t a j a n + k u r d i j o h t a j i e n + k u r d i j o u k k o j e n + k u r d i j ä r j e s t ö j ä + k u r d i j ä r j e s t ö n + k u r d i j ä s e n e n + k u r d i k a n s a + k u r d i k a n s a a + k u r d i k a n s a l a i s t e n + k u r d i k a n s a l l a + k u r d i k a n s a l l e + k u r d i k a n s a l t a + k u r d i k a n s a n + k u r d i k a n s a n e d u s t a j a t + k u r d i k a n s a n e d u s t a j i e n + k u r d i k a n s a n e d u s t a j i s t a + k u r d i k a n s a s t a + k u r d i k a p i n a l l i s e t + k u r d i k a u p u n g e i s s a + k u r d i k a u p u n g i n j o h t a j a n + k u r d i k a u p u n g i s s a + k u r d i k a u p u n k i i n + k u r d i k o n f l i k t i n + k u r d i k u l t t u u r i n + k u r d i k y l i e n + k u r d i k y l ä ä + k u r d i k y s y m y k s e e n + k u r d i k y s y m y k s e l l e + k u r d i k y s y m y k s e n + k u r d i k y s y m y k s e n s ä + k u r d i k y s y m y k s e s s ä + k u r d i k y s y m y k s e s t ä + k u r d i k y s y m y s + k u r d i k y s y m y s t ä + k u r d i l a p s i a + k u r d i l i i k e t t ä + k u r d i m a t k a i l i j a a + k u r d i m i e l e n o s o i t t a j i e n + k u r d i m i e l i n e n + k u r d i m i e l i s e n + k u r d i n a i s e s t a + k u r d i n a i s i a + k u r d i n a i s t e n + k u r d i n k i e l i s e n + k u r d i n k i e l i s e t + k u r d i n k i e l i s t e n + k u r d i n k i e l i s t ä + k u r d i o h j e l m i a + k u r d i o n g e l m a + k u r d i o n g e l m a a + k u r d i o n g e l m a a n + k u r d i o n g e l m a l l e + k u r d i o n g e l m a n + k u r d i o n g e l m a s t a + k u r d i p a k o l a i s e t + k u r d i p a k o l a i s i a + k u r d i p a k o l a i s i l l e + k u r d i p a k o l a i s i s t a + k u r d i p a k o l a i s k y s y m y k s e s s ä + k u r d i p a k o l a i s t a + k u r d i p a k o l a i s t e n + k u r d i p a r l a m e n t a a r i k k o a + k u r d i p a r l a m e n t a a r i k o s t a + k u r d i p o l i i t i k k o + k u r d i p o l i i t i k k o j e n + k u r d i p o r m e s t a r e i t a + k u r d i p o r m e s t a r i a + k u r d i p u o l u e e n + k u r d i p u o l u e i l l e + k u r d i r y h m i e n + k u r d i r y h m i s t ä + k u r d i r y h m i t t y m ä ä + k u r d i s e l k k a u s t a + k u r d i s e p a r a t i s t i t + k u r d i s e u d u n + k u r d i s t a + k u r d i s y n t y p e r ä ä + k u r d i t + k u r d i t a i s t e l i j o i d e n + k u r d i t i l a n n e + k u r d i t k a a n + k u r d i t y t t ö + k u r d i t y ö n t e k i j ö i d e n + k u r d i v a n k e j a + k u r d i v a s t a i n e n + k u r d i v i r a n o m a i s e t + k u r d i v i r a n o m a i s t e n + k u r d i v ä e s t ö + k u r d i v ä e s t ö l l e + k u r d i v ä e s t ö l l ä + k u r d i v ä e s t ö n + k u r d i v ä e s t ö ä + k u r d i v ä e s t ö ö n + k u r d i v ä h e m m i s t ö + k u r d i v ä h e m m i s t ö l l ä + k u r d i v ä h e m m i s t ö n + k u r d i v ä h e m m i s t ö t + k u r d i v ä h e m m i s t ö ä + k u r d i y h t e i s ö j ä + k u r d i y h t e i s ö l l e + k u r d i y h t e i s ö l l ä + k u r d i y h t e i s ö n + k u r d i y h t e i s ö ä + k u r d i y s t ä v i ä n i + k u r d i ä ä n e s t ä j i ä + k u r e n u o t t a a + k u r e n u o t t a l a i v a s t o n + k u r g a a n i k u l t t u u r i + k u r h o m y k e r ö k o i + k u r i a + k u r i i n + k u r i i r i p a l v e l u j e n + k u r i i r i s h a k k i + k u r i i r i y r i t y k s e t + k u r i m e k a n i s m i a + k u r i n a l a i n e n + k u r i n a l a i s e e n + k u r i n a l a i s e m m i n + k u r i n a l a i s e m p a a + k u r i n a l a i s e m p i + k u r i n a l a i s e m p i a + k u r i n a l a i s e n a + k u r i n a l a i s e s t a + k u r i n a l a i s e s t i + k u r i n a l a i s t a + k u r i n a l a i s t e n + k u r i n a l a i s u u d e l l a + k u r i n a l a i s u u d e n + k u r i n a l a i s u u d e s t a + k u r i n a l a i s u u s + k u r i n a l a i s u u t e e n + k u r i n a l a i s u u t e n a + k u r i n a l a i s u u t t a + k u r i n p a l a u t u s t a + k u r i n p i d o l l i s i a + k u r i n p i d o l l i s i i n + k u r i n p i d o l l i s i s t a + k u r i n p i d o l l i s t e n + k u r i n p i t o a s i a a + k u r i n p i t o a s i a t + k u r i n p i t o a s i o i t a + k u r i n p i t o j ä r j e s t e l m ä + k u r i n p i t o j ä r j e s t e l m ä s t ä + k u r i n p i t o l a i s t a + k u r i n p i t o l a u t a k u n n a n + k u r i n p i t o l a u t a k u n n a s s a + k u r i n p i t o l a u t a k u n n a t + k u r i n p i t o l a u t a k u n t a + k u r i n p i t o l a u t a k u n t a a n + k u r i n p i t o l a u t a k u n t i i n + k u r i n p i t o m e n e t t e l y + k u r i n p i t o m e n e t t e l y i h i n + k u r i n p i t o m e n e t t e l y i s s ä + k u r i n p i t o m e n e t t e l y i s t ä + k u r i n p i t o m e n e t t e l y i t ä + k u r i n p i t o m e n e t t e l y j e n + k u r i n p i t o m e n e t t e l y j ä + k u r i n p i t o m e n e t t e l y j ä ä n + k u r i n p i t o m e n e t t e l y n + k u r i n p i t o m e n e t t e l y s s ä + k u r i n p i t o m e n e t t e l y t + k u r i n p i t o m e n e t t e l y y n + k u r i n p i t o m e n e t t e l y ä + k u r i n p i t o n e u v o s t o s t a + k u r i n p i t o o n + k u r i n p i t o s ä ä n n ö i l t ä + k u r i n p i t o s ä ä n n ö k s e t + k u r i n p i t o t a p a u s t a + k u r i n p i t o t o i m e n p i t e i d e n + k u r i n p i t o t o i m e n p i t e i s i i n + k u r i n p i t o t o i m e n p i t e i t ä + k u r i n p i t o t o i m i a + k u r i n p i t o t o i m i e n + k u r i n p i t o t o i m i i n + k u r i n p i t o t o i m i l l a + k u r i n p i t o t o i m i s t a + k u r i n p i t o t o i m i s t o n + k u r i n p i t o v a l t a a + k u r i s s a + k u r i s t a v a t + k u r i s t u m i s k u o l e m a k i n + k u r i s t u s l ä p p ä + k u r i s t u s o t e t t a + k u r i s t u s o t t e e s s a + k u r i t u s m u o t o j a + k u r j a s s a + k u r j e m p a a + k u r j e n j a l k a + k u r j e n k a n e r v a + k u r j e n k e l l o + k u r j i e n + k u r j i m m a t + k u r j i m m i s s a + k u r j i s s a + k u r j i s t u m i s e e n + k u r j u u d e n + k u r j u u d e s s a + k u r j u u d e s t a + k u r j u u s o n g e l m a a + k u r j u u t e e n + k u r j u u t t a + k u r k i s t a a + k u r k k u k e s k u s t e l u n + k u r k k u k i p u a + k u r k k u k i r v a + k u r k k u l a u l u + k u r k k u m i k r o f o n i + k u r k k u p a i s e + k u r k k u p a s t i l l i + k u r k k u s k a n d a a l i s t a + k u r k o t t a a + k u r k u l l a a n + k u r k u n t u o t t a j i l l e + k u r m i t s a j u o k s i j a + k u r n u s i m p u t + k u r n u t u s t a + k u r o a + k u r o a k s e e n + k u r o m a a n + k u r p i t s a l y h t y + k u r s s e i h i n + k u r s s e i l l a + k u r s s e i l l e + k u r s s e j a + k u r s s i a + k u r s s i e n + k u r s s i i n + k u r s s i k e h i t y k s e n + k u r s s i k e h i t y s + k u r s s i k e h i t y s t ä + k u r s s i k i r j a l l i s u u t t a + k u r s s i l t a a n + k u r s s i m a r k k i n o i d e n + k u r s s i m m e + k u r s s i n + k u r s s i n k o r j a u k s e s s a + k u r s s i r i s k i + k u r s s i s s a + k u r s s i s t a + k u r s s i s t a a n + k u r s s i t + k u r s s i v a i h t e l u i d e n + k u r s s i v a i h t e l u j a + k u r s s i v a i h t e l u r i s k i + k u r s s i v a i h t e l u t + k u r t t u j u u r e k a s + k u r t t u k a a l i + k u r t t u r u u s u + k u r t t u s i e n i + k u r v i n o k k a k o l i b r i + k u s k a i l l a a n + k u s t a n n e t a a n + k u s t a n n u k s e l l a a n + k u s t a n n u k s e t + k u s t a n n u k s e t k i n + k u s t a n n u k s i a + k u s t a n n u k s i a a n + k u s t a n n u k s i e n + k u s t a n n u k s i i n + k u s t a n n u k s i l l a + k u s t a n n u k s i l t a a n + k u s t a n n u k s i n + k u s t a n n u k s i s s a + k u s t a n n u k s i s t a + k u s t a n n u k s i t t a + k u s t a n n u s a l a + k u s t a n n u s a n a l y y s i + k u s t a n n u s a n a l y y s i n + k u s t a n n u s a n s o j e n + k u s t a n n u s a r v i o + k u s t a n n u s a r v i o i d e n + k u s t a n n u s a r v i o i h i n + k u s t a n n u s a r v i o i n t e j a + k u s t a n n u s a r v i o i s s a a n + k u s t a n n u s a r v i o i t a + k u s t a n n u s a r v i o m e n e t e l m i s t ä + k u s t a n n u s a r v i o n + k u s t a n n u s a r v i o t a + k u s t a n n u s a r v o a + k u s t a n n u s e d u n + k u s t a n n u s e l e m e n t i t + k u s t a n n u s e n n u s t e i t a + k u s t a n n u s e r i e n + k u s t a n n u s e r o j a + k u s t a n n u s e r o j e n + k u s t a n n u s e r o t + k u s t a n n u s e t u + k u s t a n n u s h a i t t a + k u s t a n n u s h a l l i n n a s s a + k u s t a n n u s h i n n a n + k u s t a n n u s h i n t o i h i n + k u s t a n n u s h y ö d y n + k u s t a n n u s h y ö t y + k u s t a n n u s h y ö t y a n a l y y s e i n + k u s t a n n u s h y ö t y a n a l y y s i + k u s t a n n u s h y ö t y a n a l y y s i n + k u s t a n n u s h y ö t y a n a l y y s i s t ä + k u s t a n n u s h y ö t y a n a l y y s i ä + k u s t a n n u s h y ö t y a r v i o + k u s t a n n u s h y ö t y j e n + k u s t a n n u s h y ö t y k y s y m y k s e e n + k u s t a n n u s h y ö t y s u h d e + k u s t a n n u s h y ö t y s u h d e t t a + k u s t a n n u s h y ö t y s u h t e e n + k u s t a n n u s h y ö t y s u h t e e s t a + k u s t a n n u s h y ö t y ä + k u s t a n n u s i n f l a a t i o + k u s t a n n u s j a k a u m a s t a + k u s t a n n u s j a k o p e r i a a t t e e n + k u s t a n n u s j a o n + k u s t a n n u s k e h i t y s t ä + k u s t a n n u s k i l p a i l u k y v y n + k u s t a n n u s k o h t i a + k u s t a n n u s k u o r m i t u s + k u s t a n n u s k y s y m y k s e e n + k u s t a n n u s k y s y m y k s e s s ä + k u s t a n n u s k y s y m y k s e s t ä + k u s t a n n u s k y s y m y k s e t + k u s t a n n u s k y s y m y k s i l l ä + k u s t a n n u s k y s y m y s + k u s t a n n u s k y s y m y s t ä + k u s t a n n u s l a s k e l m a n + k u s t a n n u s l a s k e l m i e n + k u s t a n n u s l a s k e l m i s s a + k u s t a n n u s l a s k e l m i s t a + k u s t a n n u s l a s k e n t a a + k u s t a n n u s l e i k k a u s t e n + k u s t a n n u s l u o k k i a + k u s t a n n u s n e u t r a a l i + k u s t a n n u s n e u t r a a l i u d e n + k u s t a n n u s n e u t r a a l i u s + k u s t a n n u s n o u s u i h i n + k u s t a n n u s n ä k ö k o h d a t + k u s t a n n u s n ä k ö k o h d i s t a + k u s t a n n u s n ä k ö k o h t a a + k u s t a n n u s n ä k ö k o h t i a + k u s t a n n u s n ä k ö k u l m i a + k u s t a n n u s o n g e l m a + k u s t a n n u s o n g e l m a a n + k u s t a n n u s o n g e l m a t k i n + k u s t a n n u s o p t i m a a l i s t a + k u s t a n n u s o p t i m a a l i s t e n + k u s t a n n u s o s i o o n + k u s t a n n u s o s u u d e s t a + k u s t a n n u s p a i k k a l a s k e n t a a + k u s t a n n u s p a i k k a l a s k e n t a a n + k u s t a n n u s p a i k k o j a + k u s t a n n u s p a i n e + k u s t a n n u s p a i n e i d e n + k u s t a n n u s p a i n e i t a + k u s t a n n u s p e r i a a t t e i t a + k u s t a n n u s p e r u s t a n + k u s t a n n u s p e r u s t e i s e s t i + k u s t a n n u s p o h j a a n s a + k u s t a n n u s p o l i t i i k a s s a + k u s t a n n u s r a j a + k u s t a n n u s r a k e n n e t t a + k u s t a n n u s r a k e n t e e n + k u s t a n n u s r a k e n t e e s e e n + k u s t a n n u s r a k e n t e e s t a + k u s t a n n u s r a k e n t e e t + k u s t a n n u s r a k e n t e i d e n + k u s t a n n u s r a k e n t e i t a + k u s t a n n u s r a s i t t e e t + k u s t a n n u s r a s i t t e i d e n + k u s t a n n u s r a s i t u k s i a + k u s t a n n u s r a s i t u s + k u s t a n n u s r y h m i e n + k u s t a n n u s r y h m i ä + k u s t a n n u s s e l v i t y k s e s s ä + k u s t a n n u s s e u r a a m u s t e n + k u s t a n n u s s i d o n n a i s i a + k u s t a n n u s s y i l l ä + k u s t a n n u s s y i s t ä + k u s t a n n u s s ä ä n t ö i h i n + k u s t a n n u s s ä ä n t ö j e n + k u s t a n n u s s ä ä s t ö i h i n + k u s t a n n u s s ä ä s t ö j e n + k u s t a n n u s s ä ä s t ö j ä + k u s t a n n u s s ä ä s t ö t + k u s t a n n u s s ä ä s t ö t o i m e n p i t e i s i i n + k u s t a n n u s t a a k k a + k u s t a n n u s t a l o u s + k u s t a n n u s t a s o + k u s t a n n u s t a s o j a + k u s t a n n u s t a s o n + k u s t a n n u s t e h o k a s t a + k u s t a n n u s t e h o k k a a k s i + k u s t a n n u s t e h o k k a a l l a + k u s t a n n u s t e h o k k a a m m a k s i + k u s t a n n u s t e h o k k a a m m a n + k u s t a n n u s t e h o k k a a m m i l l e + k u s t a n n u s t e h o k k a a m m i n + k u s t a n n u s t e h o k k a a m p a a + k u s t a n n u s t e h o k k a a m p a a n + k u s t a n n u s t e h o k k a a m p i + k u s t a n n u s t e h o k k a a m p i a + k u s t a n n u s t e h o k k a a m p i e n + k u s t a n n u s t e h o k k a a n + k u s t a n n u s t e h o k k a a n a + k u s t a n n u s t e h o k k a a s e e n + k u s t a n n u s t e h o k k a a t + k u s t a n n u s t e h o k k a i d e n + k u s t a n n u s t e h o k k a i m m a k s i + k u s t a n n u s t e h o k k a i m m a n + k u s t a n n u s t e h o k k a i m m a t + k u s t a n n u s t e h o k k a i m m i l l a + k u s t a n n u s t e h o k k a i m m i s t a + k u s t a n n u s t e h o k k a i n + k u s t a n n u s t e h o k k a i n a + k u s t a n n u s t e h o k k a i n t a + k u s t a n n u s t e h o k k a i s t a + k u s t a n n u s t e h o k k a i t a + k u s t a n n u s t e h o k k u u d e n + k u s t a n n u s t e h o k k u u d e s s a + k u s t a n n u s t e h o k k u u d e s t a + k u s t a n n u s t e h o k k u u s + k u s t a n n u s t e h o k k u u s a n a l y y s i + k u s t a n n u s t e h o k k u u s l a s k e l m a + k u s t a n n u s t e h o k k u u s p e r i a a t t e e n + k u s t a n n u s t e h o k k u u s t u t k i m u s + k u s t a n n u s t e h o k k u u t e e n + k u s t a n n u s t e h o k k u u t t a + k u s t a n n u s t e k i j ä + k u s t a n n u s t e k i j ä n ä + k u s t a n n u s t e k i j ä t + k u s t a n n u s t e k i j ö i t ä + k u s t a n n u s t e n + k u s t a n n u s t e n a r v i o i n t i a + k u s t a n n u s t e n j a k o a + k u s t a n n u s t e n j a k o p e r i a a t t e i t a + k u s t a n n u s t e n s a + k u s t a n n u s t u e n + k u s t a n n u s t y y p i t + k u s t a n n u s t y y p p e j ä + k u s t a n n u s v a i k u t t a v a + k u s t a n n u s v a i k u t t a v i n + k u s t a n n u s v a i k u t u k s e t + k u s t a n n u s v a i k u t u k s i a + k u s t a n n u s v a i k u t u k s i s t a + k u s t a n n u s v a i k u t u s a r v i o i t a + k u s t a n n u s v a i k u t u s t e n + k u s t a n n u s v a l t a i n e n + k u s t a n n u s v a l t a i s e n + k u s t a n n u s v a l v o n t a + k u s t a n n u s v a l v o n t a a n + k u s t a n n u s v a s t a a v u u d e n + k u s t a n n u s v a s t a a v u u s + k u s t a n n u s v a s t u u + k u s t a n n u s v e r t a i l u u n + k u s t a n t a a + k u s t a n t a j i e n + k u s t a n t a m o a + k u s t a n t a m o i d e n + k u s t a n t a m o i l l e + k u s t a n t a m o i m p e r i u m i a + k u s t a n t a m o i s t a + k u s t a n t a m o i t a + k u s t a n t a m o j e n + k u s t a n t a m o n + k u s t a n t a m o t + k u s t a n t a m o t h a n + k u s t e n + k u t e m i s a j a n j a k s o j e n + k u t i s t u u + k u t i s t u v i e n + k u t i t t e l e v a t + k u t s u a + k u t s u a k o + k u t s u e s s a a n + k u t s u i + k u t s u i k i n + k u t s u i m m e + k u t s u i s i + k u t s u i s i n + k u t s u i s i n k i n + k u t s u i t t e + k u t s u i t t e k i n + k u t s u j ä r j e s t e l m ä ä + k u t s u k a a m m e + k u t s u m a a m m e + k u t s u m a l l a + k u t s u m a s t a + k u t s u m a t t a + k u t s u m e r k k i + k u t s u m m e + k u t s u m m e k o + k u t s u m u s k o h t a l o + k u t s u m u s t a + k u t s u n + k u t s u n e e t + k u t s u n n a t + k u t s u n s a + k u t s u n t a m e l l a k k a + k u t s u n u t + k u t s u t a a n + k u t s u t t a k o o n + k u t s u t t a v a + k u t s u t t i i n + k u t s u t t u a + k u t s u t t u j e n + k u t s u t t u u n + k u t s u t u i l l a + k u t s u t u k s i + k u t s u t u n + k u t s u t u t + k u t s u u + k u t s u u n i + k u t s u v a a t i m u s t e n + k u t s u v a i k u t u k s e n + k u t s u v a t + k u t s u v i e r a a t + k u t s u v i e r a i l l e + k u t s u v i e r a s l i s t a n + k u t s u v i e r a s t a + k u t u a i k a + k u t u a i k a a n + k u t u a i k a n a + k u t u a i k o j a + k u t u a j a t + k u t u a l u e e l l a + k u t u a l u e e l l e + k u t u a l u e e t + k u t u a l u e i d e n + k u t u a l u e i l l a + k u t u a l u e i t a + k u t u a l u e i t a a n + k u t u a l u e t t a + k u t u j o k i i n + k u t u k a u s i + k u t u k y p s i ä + k u t u k ä y t t ä y t y m i n e n + k u t u n j u u s t o + k u t u p a i k a t + k u t u p a i k k o j e n + k u t u p a i k o i l l a + k u t u p a i k o i l l e e n + k u t u v a l t i o p e r i a a t e t t a + k u u a s e m a + k u u a u t o + k u u b a l a i s e n + k u u b a l a i s e t + k u u b a l a i s i i n + k u u b a l a i s i l l e + k u u b a l a i s m i e s t ä + k u u d e k s i + k u u d e l l a + k u u d e l l e + k u u d e l t a + k u u d e n + k u u d e n n e k s e n + k u u d e n n e k s i + k u u d e n n e n + k u u d e n n e s s a + k u u d e n n e s t a + k u u d e n t e e n + k u u d e s o s a a + k u u d e s o s a n + k u u d e s s a + k u u d e s t a + k u u d e t t a + k u u h u l l u u s + k u u i l l u u s i o + k u u k a l e n t e r i + k u u k a u d e k s i + k u u k a u d e l l a + k u u k a u d e n + k u u k a u d e s s a + k u u k a u d e s t a + k u u k a u d e t + k u u k a u s i + k u u k a u s i a + k u u k a u s i a n s i o n s a + k u u k a u s i b u d j e t i s t a a n + k u u k a u s i e l ä k e t t ä + k u u k a u s i e n + k u u k a u s i e n n a k k o m a k s u j a + k u u k a u s i i n + k u u k a u s i k a t s a u k s e s s a + k u u k a u s i k o r o t u k s e n + k u u k a u s i k o r o t u k s e t + k u u k a u s i k o r o t u k s e t k i n + k u u k a u s i k o r o t u k s i a + k u u k a u s i k o r o t u k s i l l a + k u u k a u s i k o r o t u k s i s t a + k u u k a u s i k o r o t u s j ä r j e s t e l m ä + k u u k a u s i k o r o t u s t a + k u u k a u s i k o r o t u s t e n + k u u k a u s i k o r t i t + k u u k a u s i k o r v a u k s e n + k u u k a u s i k s i + k u u k a u s i l l e + k u u k a u s i m a k s u j a + k u u k a u s i m a k s u n + k u u k a u s i m ä ä r i ä + k u u k a u s i n a + k u u k a u s i p a l k a l l a + k u u k a u s i p a l k a l l a m m e + k u u k a u s i p a l k a s t a + k u u k a u s i p a l k a s t a a n + k u u k a u s i p a l k k a + k u u k a u s i p a l k k a a + k u u k a u s i p a l k k i o + k u u k a u s i r a p o r t t i i n + k u u k a u s i s t a + k u u k a u s i t a p a a m i s e s s a + k u u k a u s i t a v o i t t e i d e n n e + k u u k a u s i t t a i n + k u u k a u s i t t a i n e n + k u u k a u s i t t a i s e e n + k u u k a u s i t t a i s e l l e + k u u k a u s i t t a i s e s s a + k u u k a u s i t t a i s i a + k u u k a u s i t t a i s t e n + k u u k a u s i t u l o i s t a a n + k u u k a u s i t u l o j e n + k u u k a u s i t u l o t + k u u k a u s i v a u h t i a + k u u k a u t e e n + k u u k a u t e n a + k u u k a u t i s k u p p i + k u u k a u t t a + k u u k a u t t a k a a n + k u u k u l k i j a + k u u l a k ä r k i k y n ä + k u u l a k ä r k i k y n ä n + k u u l a l a a k e r i + k u u l a l a a k e r i t e h d a s + k u u l a m a k r i l l i + k u u l a m o o t t o r i + k u u l a m y l l y + k u u l a n t y ö n t ö + k u u l a r e a k t o r i + k u u l e e + k u u l e m a a n + k u u l e m a l l a + k u u l e m a m m e + k u u l e m a n i + k u u l e m a s s a + k u u l e m a s t a m m e + k u u l e m a s t a n i + k u u l e m a t t a + k u u l e m i e n i + k u u l e m i i m m e + k u u l e m i s a i k a a + k u u l e m i s a j a n j a k s o + k u u l e m i s a j a n j a k s o n + k u u l e m i s a s i a k i r j a + k u u l e m i s a s i a k i r j a a + k u u l e m i s a s i a k i r j a a n + k u u l e m i s a s i a k i r j a a n n e + k u u l e m i s a s i a k i r j a n + k u u l e m i s a s i a k i r j a s s a + k u u l e m i s a s i a k i r j a t + k u u l e m i s a s i a k i r j o j a + k u u l e m i s a s i a k i r j o j e n + k u u l e m i s d i r e k t i i v e j ä + k u u l e m i s e e n + k u u l e m i s e k s i + k u u l e m i s e l i n t e n + k u u l e m i s e n + k u u l e m i s e s s a + k u u l e m i s e s s a n i + k u u l e m i s e s s a n n e + k u u l e m i s e s t a + k u u l e m i s e t + k u u l e m i s h a r j o i t u k s e k s i + k u u l e m i s i a + k u u l e m i s i i n + k u u l e m i s i l l a + k u u l e m i s i s s a + k u u l e m i s i s s a n i + k u u l e m i s i s s a n n e + k u u l e m i s i s t a + k u u l e m i s j a k s o n + k u u l e m i s j ä r j e s t e l m ä + k u u l e m i s j ä r j e s t e l m ä s s ä + k u u l e m i s j ä r j e s t e l m ä ä + k u u l e m i s j ä r j e s t e l y i s s ä + k u u l e m i s j ä r j e s t e l y i s t ä + k u u l e m i s j ä r j e s t e l y n + k u u l e m i s k i e r r o k s e l l a + k u u l e m i s k i e r r o k s e n + k u u l e m i s k i e r r o s + k u u l e m i s k i e r r o s t a + k u u l e m i s k o k o u s t a + k u u l e m i s k o m i t e o i d e n + k u u l e m i s k ä y t ä n t ö j ä + k u u l e m i s l a i n s ä ä d ä n t ö ä + k u u l e m i s m e k a n i s m e j a + k u u l e m i s m e k a n i s m i + k u u l e m i s m e k a n i s m i a + k u u l e m i s m e k a n i s m i n + k u u l e m i s m e k a n i s m i t + k u u l e m i s m e n e t t e l y a s i a s s a + k u u l e m i s m e n e t t e l y i h i n + k u u l e m i s m e n e t t e l y i n e e n + k u u l e m i s m e n e t t e l y i s s ä + k u u l e m i s m e n e t t e l y i s t ä + k u u l e m i s m e n e t t e l y j e n + k u u l e m i s m e n e t t e l y j ä + k u u l e m i s m e n e t t e l y j ä r j e s t e l m ä + k u u l e m i s m e n e t t e l y l l e + k u u l e m i s m e n e t t e l y l l ä + k u u l e m i s m e n e t t e l y n + k u u l e m i s m e n e t t e l y s s ä + k u u l e m i s m e n e t t e l y s s ä m m e + k u u l e m i s m e n e t t e l y s t ä + k u u l e m i s m e n e t t e l y t + k u u l e m i s m e n e t t e l y v a i h e e s s a + k u u l e m i s m e n e t t e l y y n + k u u l e m i s m e n e t t e l y ä + k u u l e m i s m e n e t t e l y ä k i n + k u u l e m i s o h j e i t a + k u u l e m i s o i k e u k s i a + k u u l e m i s o i k e u k s i e n + k u u l e m i s o i k e u k s i s t a + k u u l e m i s o i k e u s + k u u l e m i s o i k e u t t a + k u u l e m i s p e r i a a t t e i t a + k u u l e m i s p r o s e s s e i h i n + k u u l e m i s p r o s e s s e i s t a + k u u l e m i s p r o s e s s e j a + k u u l e m i s p r o s e s s i + k u u l e m i s p r o s e s s i a + k u u l e m i s p r o s e s s i i n + k u u l e m i s p r o s e s s i m m e + k u u l e m i s p r o s e s s i n + k u u l e m i s p r o s e s s i s s a + k u u l e m i s p r o s e s s i s t a + k u u l e m i s p ä i v ä n + k u u l e m i s p ä i v ä ä n + k u u l e m i s r y h m ä + k u u l e m i s s ä ä n n ö i l l e + k u u l e m i s t a + k u u l e m i s t a a n + k u u l e m i s t a n i + k u u l e m i s t e n + k u u l e m i s t i l a i s u u d e n + k u u l e m i s t i l a i s u u d e s s a + k u u l e m i s t i l a i s u u d e s s a a n + k u u l e m i s t i l a i s u u d e t + k u u l e m i s t i l a i s u u k s i a + k u u l e m i s t i l a i s u u k s i i n + k u u l e m i s t i l a i s u u k s i s s a + k u u l e m i s t i l a i s u u k s i s s a k i n + k u u l e m i s t i l a i s u u k s i s s a m m e + k u u l e m i s t i l a i s u u k s i s t a + k u u l e m i s t i l a i s u u t t a + k u u l e m i s v a i h e + k u u l e m i s v a i h e e n + k u u l e m i s v a i h e e s s a + k u u l e m i s v a l l a s t a + k u u l e m i s v e l v o i t t e e t + k u u l e m i s v e l v o i t t e i t a + k u u l e m m e + k u u l e n + k u u l e v a m m e + k u u l e v a n i + k u u l e v a n s a + k u u l e v a t + k u u l i j a k u n n a n + k u u l i j a t + k u u l i j o i d e n + k u u l i m m e + k u u l i m m e k i n + k u u l i n + k u u l i n k o + k u u l i s i m m e + k u u l i s i v a t + k u u l i t k o + k u u l i t t e + k u u l i t t e k o + k u u l i v a t + k u u l k a a + k u u l k a a m m e + k u u l l a a n + k u u l l a k i n + k u u l l a k s e e n + k u u l l a k s e m m e + k u u l l a k s e n i + k u u l l e e t + k u u l l e e t k a a n + k u u l l e e t k i n + k u u l l e s s a a n + k u u l l e s s a m m e + k u u l l e s s a n i + k u u l l e s s a n n e + k u u l l u i k s i + k u u l l u k s i + k u u l l u t + k u u l o e l i m i s s ä + k u u l o h a r h a + k u u l o j ä r j e s t e l m ä ä n + k u u l o k k e e t + k u u l o k o i r a + k u u l o k o j e i s s a + k u u l o k y n n y s + k u u l o l a i t e + k u u l o n + k u u l o n m e n e t y k s i s t ä + k u u l o n s u o j a u s + k u u l o o n k a a n + k u u l o p u h e i t a + k u u l o s t a a + k u u l o s t a a k i n + k u u l o s t a i s i + k u u l o s t a n k o + k u u l o s t a v a n i + k u u l o s t a v a s t a + k u u l o s t a v a t + k u u l o s u o j a i m e t + k u u l o s u o j a i m i a + k u u l o v a m m a + k u u l o v a m m a i n e n + k u u l o v a m m a i s e t + k u u l o v a m m a i s i l l e + k u u l o v a m m a n + k u u l o v a u r i o + k u u l o v a u r i o i d e n + k u u l o v a u r i o i s t a + k u u l o v a u r i o i t a + k u u l o v a u r i o n + k u u l t a i s i i n + k u u l t a v a a + k u u l t i i n k o + k u u l t o a h v e n + k u u l t o u k o n s i e n i + k u u l t u a + k u u l t u a a n + k u u l t u a m m e + k u u l t u a n i + k u u l t u i h i n + k u u l u a + k u u l u e s s a a n + k u u l u i + k u u l u i s a a + k u u l u i s a l l a + k u u l u i s a m p i a + k u u l u i s a n + k u u l u i s a s s a + k u u l u i s a s t a + k u u l u i s a t + k u u l u i s i + k u u l u i s i a + k u u l u i s i e n + k u u l u i s i m m a l l e + k u u l u i s i m m a t + k u u l u i s i m m i s t a + k u u l u i s i m p i a + k u u l u i s i n + k u u l u i s i v a t + k u u l u i v a t + k u u l u i v a t k o + k u u l u m a a n + k u u l u m a t t a + k u u l u m a t t o m a t + k u u l u m a t t o m i a + k u u l u m i s e s t a + k u u l u m m e + k u u l u n + k u u l u n e e t + k u u l u n u t + k u u l u s t e l l a + k u u l u s t e l u i s s a + k u u l u s t e l u j e n + k u u l u s t e l u k e i n o n a + k u u l u s t e l u k ä y t ä n n ö t + k u u l u s t e l u m e n e t e l m i s t ä + k u u l u s t e l u m e n e t e l m i ä + k u u l u s t e l u m e n e t t e l y i s s ä + k u u l u s t e l u n + k u u l u s t e l u t e k n i i k a t + k u u l u s t e l u t e k n i i k o i h i n + k u u l u s t e l u t e k n i i k o i s t a + k u u l u s t e l u u n + k u u l u s t e l u y r i t y k s i i n + k u u l u t e t t u + k u u l u t t a v a + k u u l u t t e k i n + k u u l u t u s a s e t u k s i a + k u u l u t u s j ä r j e s t e l m ä + k u u l u t u s j ä r j e s t e l m ä ä + k u u l u t u s l u e t t e l o i s t a + k u u l u t u s t e n + k u u l u u k i n + k u u l u u k o + k u u l u v a a + k u u l u v a a n + k u u l u v a k s i + k u u l u v a m m i n + k u u l u v a n + k u u l u v a s s a + k u u l u v a t + k u u l u v a t k i n + k u u l u v a t k o + k u u l u v i a + k u u l u v i e n + k u u l u v u u d e n t u n n e + k u u m a a + k u u m a i l m a p a l l o + k u u m a i l m a p a l l o a + k u u m a i l m a p u h a l l i n + k u u m a k a l l e j a + k u u m a k ä s i t t e l y ä + k u u m a l l a + k u u m a n + k u u m a n a + k u u m a s s a + k u u m e i s e n a + k u u m e k o u r i s t u s + k u u m e m i t t a r e i d e n + k u u m e m i t t a r e i h i n + k u u m e m i t t a r e i t a + k u u m e m i t t a r i + k u u m e m i t t a r i e n + k u u m e m i t t a r i n + k u u m e n n u s k ä s i t t e l y j e n + k u u m e n s i + k u u m e p u u + k u u m e t a u d i n + k u u m i e n + k u u m o d u u l i + k u u n n e l k a a + k u u n n e l k a a m m e + k u u n n e l k a a p a + k u u n n e l l a + k u u n n e l l a a n + k u u n n e l l a a n k o + k u u n n e l l a k s e m m e + k u u n n e l l e e t + k u u n n e l l e s s a + k u u n n e l l e s s a n i + k u u n n e l l u t + k u u n n e l t a v a + k u u n n e l t u + k u u n n e l t u a a n + k u u n n e l t u a m m e + k u u n n e l t u a n i + k u u n p i m e n n y s + k u u n s i r p p i + k u u n t e l e e + k u u n t e l e m a a n + k u u n t e l e m a s s a + k u u n t e l e m a t t a + k u u n t e l e m a t t a k i n + k u u n t e l e n + k u u n t e l e t t e + k u u n t e l e v a m m a n + k u u n t e l e v a t + k u u n t e l i m m e + k u u n t e l i n + k u u n t e l i s i + k u u n t e l i t t e k o + k u u n t e l u a + k u u n t e l u a i k a n a + k u u n t e l u a s e m i a + k u u n t e l u j ä r j e s t e l m ä n + k u u n t e l u k e s k u k s e n + k u u n t e l u k y k y ä + k u u n t e l u k y v y n + k u u n t e l u m e n e t t e l y n + k u u n t e l u n + k u u n t e l u t a i d o i s t a a n + k u u n t e l u t a i d o l l a a n + k u u n t e l u t a i d o s t a + k u u n t e l u t a i d o s t a a n + k u u n t e l u t a p a u k s i a + k u u n t e l u t i l a s s a + k u u n t e l u u n + k u u n t e l u v a i h e + k u u n t e l u v a l m i u d e s t a a n + k u u p e r h o k a l a + k u u p r i n s e s s a + k u u p ö l y ä + k u u r i n t a t a s k u + k u u r i t a r i + k u u r o i l l a + k u u r o i l l e + k u u r o i s t a + k u u r o j e n + k u u r o l l e + k u u r o m y k k i e n + k u u r o p i l v i + k u u r o p i l v i j o n o + k u u r o s o k e i l l e + k u u r o t + k u u r o u t u m i s e s t a + k u u s a m a k i i t ä j ä + k u u s a m a p e r h o n e n + k u u s e e n + k u u s e n h e r k k u s i e n i + k u u s e n k y n s i k ä ä p ä + k u u s e n k ä p y n a h i k a s + k u u s e n l e p p ä r o u s k u + k u u s e n s u o m u o r a k a s + k u u s i e n + k u u s i h a p e r o + k u u s i k a r v a j a l k a + k u u s i k a u t i n e n + k u u s i k e r t t u l i + k u u s i k o h t a i n e n + k u u s i k u l m i o l u k u + k u u s i k u u k a u t i n e n + k u u s i k u u k a u t i s e n + k u u s i k u u k a u t i s e s t a + k u u s i k u u k a u t i s t a + k u u s i k u u k a u t i s t e n + k u u s i l a h o k k a + k u u s i l o k k i + k u u s i m e t r i s e n + k u u s i n k e r t a i s e k s i + k u u s i n k e r t a i s e n + k u u s i n k e r t a i s e s t i + k u u s i n k e r t a i s t u i + k u u s i n k e r t a i s t u n e e n + k u u s i n k e r t a i s t u n e e t + k u u s i n k e r t a i s t u n u t + k u u s i n u m e r o i s e n + k u u s i o k o l o a v a i n + k u u s i p e u r a + k u u s i p o r t a i s t a + k u u s i s e i t s e m ä n + k u u s i s i v u i n e n + k u u s i t i a i n e n + k u u s i t u h a t k e r t a i s i k s i + k u u s i v u o t i a a l l e + k u u s i v u o t i a a n + k u u s i v u o t i a a n a + k u u s i v u o t i a i d e n + k u u s i v u o t i a i k s i k a a n + k u u s i v u o t i a i l t a + k u u s i v u o t i a i n a + k u u s i v u o t i a i t a + k u u s i v u o t i a s + k u u s i v u o t i a s t a + k u u s i v u o t i n e n + k u u s i v u o t i s e k s i + k u u s i v u o t i s e n + k u u s i v u o t i s e s s a + k u u s i v u o t i s e s t a + k u u s i v u o t i s e t + k u u s i v u o t i s k a u d e k s i + k u u s i v u o t i s o h j e l m a a + k u u s i v y ö v y ö t i ä i n e n + k u u s s a + k u u t a m o k e i k k a + k u u t a m o s o n a a t t i a + k u u t e e n + k u u t e n a + k u u t i o i t a + k u u t i o j u u r i + k u u t i o k i l o m e t r i ä + k u u t i o m e d u u s a t + k u u t i o m e t r i + k u u t i o m e t r i e n + k u u t i o m e t r i h i n n a l l a a n + k u u t i o m e t r i i n + k u u t i o m e t r i l t ä + k u u t i o m e t r i n + k u u t i o m e t r i s s ä + k u u t i o m e t r i ä + k u u t i o s e n t t i m e t r i ä + k u u t i o t a + k u u t i o t a l o t + k u u t o s t e n + k u u t t a k y m m e n t ä k a h t a + k u u t y t ö n k o r e n t o + k u u t ä p l ä + k u v a a m a a n + k u v a a m a s t a n n e + k u v a a n + k u v a a v a a + k u v a a v a m p a a + k u v a a v a m p i + k u v a a v a t + k u v a a v i e n + k u v a i l e m a s s a n i + k u v a i l e n + k u v a i l e t t e + k u v a i l e v a m m a n + k u v a i l e v a m p i a + k u v a i l i + k u v a i l l a + k u v a i l l e n + k u v a i l t i i n + k u v a i l u t u l k k a u k s e n + k u v a i l u t u l k k a u s + k u v a k i e l t o + k u v a k i r j a + k u v a k i r j a t + k u v a k i r j o j a + k u v a k i v i + k u v a k u l t t u u r i n + k u v a k u m p u + k u v a m a a k a r i t + k u v a m a n i p u l a a t i o + k u v a m a t e r i a a l i a + k u v a n + k u v a n a u h a t + k u v a n k ä s i t t e l y + k u v a n k ä s i t t e l y o h j e l m a + k u v a n l a a d u n + k u v a n l a a d u s t a + k u v a n l u k i j a + k u v a n n u t + k u v a n p a k k a u s + k u v a n s u o d a t u s o h j e l m a a + k u v a n t a m i s t e k n i i k a s t a + k u v a n ä y t t e l y + k u v a p a l v e l u k e s k u k s e n + k u v a p u t k i + k u v a p u t k i l t a + k u v a p u t k i n ä y t t ö m a r k k i n o i d e n + k u v a r u n o + k u v a r u u d u l t a + k u v a r u u d u n + k u v a s a a s t e i d e n + k u v a s i + k u v a s i n + k u v a s s a + k u v a s t a a + k u v a s t a m a a n + k u v a s t a v a t + k u v a s t a v a t k i n + k u v a s t e t t a v a + k u v a s t i v a t + k u v a s u h d e + k u v a t + k u v a t a + k u v a t a a j u u s + k u v a t a a n + k u v a t a i d e + k u v a t a i d e a k a t e m i a + k u v a t a i t e e t + k u v a t a i t e i l i j a l l e + k u v a t a i t e i l i j o i d e n + k u v a t a i t e i l i j o i t a + k u v a t a k s e n i + k u v a t a r k k a a m o + k u v a t e s s a m m e + k u v a t i e d o n h a k u + k u v a t i e d o s t o m u o d o t + k u v a t i e t o j a + k u v a t t a v a + k u v a t t i i n + k u v a t t u a + k u v a t t u j a + k u v a t t u u n + k u v a t u n + k u v a t y y p i t + k u v a u k s e e n + k u v a u k s e n + k u v a u k s i s s a + k u v a u s l a u s e + k u v a u s m e n e t e l m ä + k u v a u s p a i k k a j ä r j e s t ä j ä + k u v a u s r y h m ä + k u v a u s s i h t e e r i + k u v a v a r o i t u s t e n + k u v a v i e s t i n t ä + k u v e r n ö ö r i k s i + k u v e r n ö ö r i l l e + k u v e r n ö ö r i n + k u v e t t a a n + k u v i a + k u v i e n + k u v i i n + k u v i o l u k u + k u v i s s a + k u v i s t a + k u v i t e l k a a + k u v i t e l k a a m m e + k u v i t e l k a a m m e p a + k u v i t e l k a a p a + k u v i t e l k o + k u v i t e l l a + k u v i t e l l a a n + k u v i t e l l a a n k o + k u v i t e l l a a n p a + k u v i t e l l a k a a n + k u v i t e l l e e t + k u v i t e l l u s t a + k u v i t e l l u t + k u v i t e l m a a + k u v i t e l m i a + k u v i t e l t a v i s s a + k u v i t e l t i i n + k u v i t t e e l l i s e e n + k u v i t t e l e m a s t a + k u w a i t i l a i s v a n k i e n + k v a n t t i a l g o r i t m i + k v a n t t i d a r w i n i s m i + k v a n t t i f y y s i k k o + k v a n t t i g r a v i t a a t i o + k v a n t t i k e m i a + k v a n t t i k e n t t ä t e o r i a + k v a n t t i k o s m o l o g i a + k v a n t t i l u k u + k v a n t t i m e k a n i i k a n + k v a n t t i m e k a n i i k k a + k v a n t t i m y s t i i k k a + k v a n t t i p o r t t i + k v a n t t i s a l a u s + k v a n t t i s u p e r p o s i t i o + k v a n t t i s ä h k ö d y n a m i i k k a + k v a n t t i t e l e p o r t a a t i o + k v a n t t i t e o r i a + k v a n t t i t e o r i a s t a + k v a n t t i t i e t o i s u u s + k v a n t t i t i e t o k o n e + k v a n t t i v a a h t o + k v a n t t i v a r a s + k v a n t t i v ä r i d y n a m i i k k a + k v a r k k i e p o o k k i + k v a r k k i t ä h t i + k v a r t e t i l l a + k v a r t e t i n + k v a r t e t i s s a + k v a r t e t t i i n + k v a r t e t t i k o k o u k s e s s a m m e + k v a r t e t t i k u m p p a n e i d e n s a + k v a r t e t t i r y h m ä n + k v a r t e t t i r y h m ä s s ä + k v a r t s i k e l l o + k v a s i k i r e ä + k v a s i k u u + k v a s i s o t a + k v a s i u s k o n t o + k v a s i v a l t i o i t a + k v e e k a r i m a t k i j a + k v e e n i t + k v e s t o r e i d e n + k v e s t o r e i l l e + k v e s t o r e i s t a + k v e s t o r i e h d o k k a a t + k v e s t o r i e n + k v e s t o r i e n k o l l e g i o n + k v e s t o r i k o l l e g a n i + k v e s t o r i k o l l e g i o + k v e s t o r i k o l l e g i o l l e + k v e s t o r i k o l l e g i o n + k v e s t o r i k o l l e g i o o n + k v e s t o r i k o l l e g i o s s a + k v e s t o r i k o l l e g i o t a + k v e s t o r i n a + k v e s t o r i t + k y e n n e e t + k y e n n y t + k y e t t y + k y e t ä + k y e t ä k s e e n + k y e t ä k s e m m e + k y h m y h a a h k a + k y h m y j o u t s e n + k y h m y k u r n u s i m p p u + k y h m y k u t i n a + k y h m y n a r s k u + k y h m y n i s k a k r o k o t i i l i + k y h m y p a l l o k a l a + k y h m y p i l k k a s i i p i + k y h m y r u u s u + k y h m y s o r s a + k y h ä t t y i h i n + k y h ä t t y j e n + k y h ä ä m i s t ä + k y h ä ä m ä l l ä + k y i l l e + k y i t ä + k y k e n e e + k y k e n e e k ö + k y k e n e m m e k ö + k y k e n e m ä t t ä + k y k e n e t t e k ö + k y k e n e v i e n + k y k e n e v i m p i ä + k y k e n e v i m p ä n ä + k y k e n e v ä m m e + k y k e n e v ä m p i + k y k e n e v ä m p i ä + k y k e n e v ä n + k y k e n e v ä n s ä + k y k e n e v ä t + k y k e n i + k y k e n i s i k ö + k y k e n i s i v ä t + k y k l o o p p i m u u r i + k y k y i h i m m e + k y k y j e n + k y k y j e n e t s i n t ä ä n + k y k y j e n s ä + k y k y j ä + k y k y j ä ä n + k y k y n s ä + k y k y y m m e + k y k y y n + k y k y ä + k y k y ä m m e + k y k y ä ä n + k y l i e n + k y l i e n s ä + k y l i i n + k y l i s s ä + k y l k i a s e n t o + k y l k i l u u n k o h o t t a j a l i h a s + k y l k i l u u v e s i l i s k o + k y l k i r u s t o + k y l k i v ä l i l i h a s + k y l l ä h ä n + k y l l ä i s e k s i + k y l l ä i s e t + k y l l ä s t y m i s a s t e + k y l l ä s t y n e i t ä + k y l l ä s t y ä + k y l m i e n + k y l m i m m i s t ä + k y l m i n ä + k y l m i s s ä + k y l m y y d e s t ä + k y l m y y s a a v i k k o + k y l m y y s n a p a + k y l m ä a a l t o + k y l m ä f u u s i o + k y l m ä k e t j u + k y l m ä k e t j u a + k y l m ä k e t j u n + k y l m ä k e t j u s s a + k y l m ä k i s k o i s e m p i + k y l m ä k i s k o i s u u t t a + k y l m ä k s i + k y l m ä k u i v a u s + k y l m ä k u l j e t u s a j o n e u v o s s a + k y l m ä k ä s i t t e l y y n + k y l m ä k ä s i t t e l y ä + k y l m ä k ä y n n i s t y k s e s t ä + k y l m ä k ä y n n i s t y s m e n e t t e l y t + k y l m ä l a i t t e i d e n + k y l m ä n + k y l m ä n v e d e n + k y l m ä n ä + k y l m ä p u r i s t e t t u a + k y l m ä p ä i s e s t i + k y l m ä p ä i s i n ä + k y l m ä p ä i s t ä + k y l m ä p ä i s y y t t ä + k y l m ä r e k a n + k y l m ä s t ä + k y l m ä s y d ä m i s i ä + k y l m ä s ä i l i ö i h i n + k y l m ä s ä i l y t y s h u o n e i s i i n + k y l m ä t + k y l m ä t e k n i i k k a + k y l m ä t e k n i k k o j a + k y l m ä v e r i n e n + k y l m ä v e r i s e s t i + k y l m ä v e r i s e t + k y l m ä v e r i s y y t t ä + k y l m ä v i t r i i n e i h i n + k y l p i + k y l p y a n k k a + k y l p y l ä a l u e i l l a + k y l p y l ä h o t e l l i + k y l p y l ä k a u p u n g i n + k y l p y l ä m a t k a i l u a + k y l p y t u o t t e i t a + k y l p y t y n n y r i + k y l p y v e d e n + k y l p y v e s i ä + k y l p y v e t e e n + k y l t i s s ä n n e + k y l t i t + k y l t t e j ä + k y l v i + k y l v i t t e + k y l v ä v ä t + k y l v ä ä + k y l v ö a j a n + k y l v ö k a u s i k a a n + k y l v ö k o n e + k y l v ö p ä i v ä ä + k y l v ö s i e m e n e t + k y l v ö s i e m e n i i n + k y l v ö s i e m e n i s s ä + k y l v ö s i e m e n i ä + k y l v ö s i e m e n t e n + k y l ä a u k i o i l l a + k y l ä b u l b u l i + k y l ä d e m o k r a t i a o h j e l m a n + k y l ä h u l l u + k y l ä k a r h i a i n e n + k y l ä k a u p p o j a + k y l ä k e l l u k k a + k y l ä k o k o u k s i i n + k y l ä k o t t a r a i n e n + k y l ä k u r j e n p o l v i + k y l ä k u t o j a + k y l ä l e p i n k ä i n e n + k y l ä l e s k i + k y l ä l l e + k y l ä l o i s t o k o t t a r a i n e n + k y l ä m a l v a + k y l ä m a t k i j a + k y l ä n e i d o n k i e l i + k y l ä n e u v o s t o i s t a + k y l ä n e u v o s t o j e n + k y l ä n u r m i k k a + k y l ä p a r l a m e n t t i e n + k y l ä p o l i i s i n a + k y l ä s i r k k u + k y l ä t + k y l ä t a s o + k y l ä t a s o l l a + k y l ä t e u r a s t a m o i t a + k y l ä t u r p i a a l i + k y l ä v a r t i o i n t i a + k y l ä v a r t i o i n t i j ä r j e s t e l m ä + k y l ä v a r t i o i n t i j ä r j e s t e l m ä n + k y l ä y h t e i s ö k u l t t u u r i s t a + k y l ä y h t e i s ö t + k y m m e n e e n + k y m m e n e l l ä + k y m m e n e l t ä + k y m m e n e n k e r t a i n e n + k y m m e n e n n e n + k y m m e n e n ä + k y m m e n e s o s a a + k y m m e n e s o s a n + k y m m e n e s s ä + k y m m e n e s t ä + k y m m e n e t + k y m m e n e t t u h a n n e t + k y m m e n e t t ä + k y m m e n i e n + k y m m e n i e n m i l j a r d i e n + k y m m e n i e n t u h a n s i e n + k y m m e n i i n t u h a n s i i n + k y m m e n i l l e + k y m m e n i l l e t u h a n s i l l e + k y m m e n i l l ä + k y m m e n i l l ä t u h a n s i l l a + k y m m e n i s s ä + k y m m e n i s t ä t u h a n s i s t a + k y m m e n i ä + k y m m e n i ä m i l j o o n i a + k y m m e n i ä t u h a n s i a + k y m m e n k e r t a i n e n + k y m m e n k e r t a i s e l l e + k y m m e n k e r t a i s e n + k y m m e n k e r t a i s e s t i + k y m m e n k e r t a i s e t + k y m m e n k e r t a i s t a a + k y m m e n k e r t a i s t a m i s t a + k y m m e n k e r t a i s t u m a a n + k y m m e n k e r t a i s t u n e e t + k y m m e n k e r t a i s t u n u t + k y m m e n k e r t a i s t u u + k y m m e n k u l m i o l u k u + k y m m e n k u u k a u t i s e n + k y m m e n l u o k i t t e l u + k y m m e n p i i k k i + k y m m e n p o t e n s s i m u o t o + k y m m e n s i v u i s e s s a + k y m m e n s o r m i j ä r j e s t e l m ä + k y m m e n t ä + k y m m e n v u o t i a a n + k y m m e n v u o t i a a s t a + k y m m e n v u o t i a i t a + k y m m e n v u o t i a s + k y m m e n v u o t i a s t a + k y m m e n v u o t i n e n + k y m m e n v u o t i s e l l e + k y m m e n v u o t i s e n + k y m m e n v u o t i s e t + k y m m e n v u o t i s i a + k y m m e n v u o t i s i i n + k y m m e n v u o t i s j u h l a a + k y m m e n v u o t i s k a u d e l l a + k y m m e n v u o t i s k a u d e n + k y m m e n v u o t i s k a u d e s t a + k y m m e n v u o t i s k a u t e n a + k y m m e n v u o t i s k a u t t a + k y m m e n v u o t i s o h j e l m a + k y m m e n v u o t i s p ä i v ä n + k y m m e n v u o t i s p ä i v ä n ä + k y m m e n v u o t i s s u u n n i t e l m a + k y m m e n v u o t i s s u u n n i t e l m a s t a + k y m m e n v u o t i s t a + k y m p i n + k y m p p i k e r h o + k y m r i t + k y n n y k s e l l ä + k y n n y k s i ä + k y n n y s a l u e e n + k y n n y s a l u e e s t a + k y n n y s a r v o + k y n n y s a r v o a + k y n n y s a r v o i h i n + k y n n y s a r v o i s s a + k y n n y s a r v o i s t a + k y n n y s a r v o j a + k y n n y s a r v o j e n + k y n n y s a r v o n + k y n n y s a r v o o n + k y n n y s a r v o s t a + k y n n y s a r v o t + k y n n y s a r v o v a a t i m u k s e t + k y n n y s h i n t o j a + k y n n y s h i n t o j e n + k y n n y s j ä r j e s t e l m ä n + k y n n y s k y s y m y k s e m m e + k y n n y s m ä ä r ä ä + k y n n y s r a j o i h i n + k y n n y s r a j o j e n + k y n n y s t a s o l l e + k y n n y s t a s o n + k y n n y s v a a t i m u k s i a + k y n n y s v a i h e + k y n n y s v a i k u t u k s e t + k y n n y s v a i k u t u s + k y n n y s v a i k u t u s t a + k y n s i h a n h i + k y n s i h y y p p ä + k y n s i k o r i s t e l u + k y n s i l a k k a + k y n s i l e i k k u r i + k y n s i m ö k r a s s i + k y n s i n + k y n s i r a u s k u + k y n s i s a k s e n s a + k y n s i v e s i + k y n s i v i i l a + k y n s i v i i l o j a + k y n t t i l ä k a k t u s + k y n t t i l ä m i e l e n o s o i t u s + k y n t t i l ä m i e l e n o s o i t u s t a + k y n t t i l ä n + k y n t t i l ä n t u o t t a j i e n + k y n t t i l ä n v a l o s s a + k y n t t i l ä t + k y n t t i l ö i t ä + k y n t ä ä + k y n t ä ä k ö + k y n t ö m e n e t e l m i ä + k y n ä j a l a v a + k y n ä k a l a + k y n ä k a t a j a + k y n ä n t e r o i t i n + k y n ä ä n s ä + k y p r o s l a i s e t + k y p r o s l a i s i a + k y p r o s l a i s t e n + k y p s e m m i n + k y p s e m m ä l l e + k y p s e m p i + k y p s e m p i ä + k y p s e m p ä ä + k y p s i m p i ä + k y p s i ä + k y p s y m i s e e n + k y p s y t t ä m i s l ä m p ö t i l a a + k y p s y t t ä m i s m e n e t e l m ä t + k y p s y y d e n + k y p s y y s k o e + k y p s y y t e e n + k y p s y y t e n s ä + k y p s ä s s ä + k y p s ä t + k y p ä r ä k a s u a a r i + k y p ä r ä k o l i b r i + k y p ä r ä s u k e l l u s + k y p ä r ä v a n g a + k y r m y s i m p p u + k y s e e n a l a i s e e n + k y s e e n a l a i s e k s i + k y s e e n a l a i s e l l a + k y s e e n a l a i s e m m a n + k y s e e n a l a i s e m p a a + k y s e e n a l a i s e m p i + k y s e e n a l a i s e n + k y s e e n a l a i s e n a + k y s e e n a l a i s e s t i + k y s e e n a l a i s e t + k y s e e n a l a i s i a + k y s e e n a l a i s i i n + k y s e e n a l a i s i k s i + k y s e e n a l a i s i m m a t + k y s e e n a l a i s i n + k y s e e n a l a i s i n a + k y s e e n a l a i s i s t a + k y s e e n a l a i s t a a + k y s e e n a l a i s t a a k s e e n + k y s e e n a l a i s t a i s i + k y s e e n a l a i s t a i s i m m e + k y s e e n a l a i s t a k o + k y s e e n a l a i s t a m a a n + k y s e e n a l a i s t a m a l l a + k y s e e n a l a i s t a m a s s a + k y s e e n a l a i s t a m a t t a + k y s e e n a l a i s t a m i s e k s i + k y s e e n a l a i s t a m i s e s t a + k y s e e n a l a i s t a m i s i a + k y s e e n a l a i s t a m i s t a + k y s e e n a l a i s t a m m e + k y s e e n a l a i s t a n + k y s e e n a l a i s t a n e e t + k y s e e n a l a i s t a n u t + k y s e e n a l a i s t a t t e + k y s e e n a l a i s t a v a t + k y s e e n a l a i s t a v i a + k y s e e n a l a i s t a v i l l e + k y s e e n a l a i s t e t a + k y s e e n a l a i s t e t a a n + k y s e e n a l a i s t e t a k a a n + k y s e e n a l a i s t e t t a i s i i n + k y s e e n a l a i s t e t t a v a n + k y s e e n a l a i s t e t t i i n + k y s e e n a l a i s t e t t u + k y s e e n a l a i s t e t u i k s i + k y s e e n a l a i s t i + k y s e e n a l a i s t i t t e + k y s e e n a l a i s t i v a t + k y s e e s e e n + k y s e e s s ä h ä n + k y s e h ä n + k y s e i s e e n + k y s e i s e l l e + k y s e i s e l l ä + k y s e i s e n + k y s e i s e s s ä + k y s e i s e s t ä + k y s e i s e t + k y s e i s i i n + k y s e i s i l l e + k y s e i s i l l ä + k y s e i s i s s ä + k y s e i s i ä + k y s e i s t e n + k y s e k ä ä n + k y s e l e e + k y s e l e m ä t t ä + k y s e l t y + k y s e l y i h i n + k y s e l y i h i n s ä + k y s e l y i s s ä + k y s e l y i t ä + k y s e l y j ä + k y s e l y k a a v a k k e e n + k y s e l y s t ä + k y s e l y t e h t ä v ä ä + k y s e l y t i l a i s u u d e n + k y s e l y t u n n e i l l a + k y s e l y t u n n e i l l e + k y s e l y t u n n i l l a + k y s e l y t u n n i l l a m m e + k y s e l y t u n n i l l e + k y s e l y t u n n i l t a + k y s e l y t u n n i n + k y s e l y t u n n i s t a + k y s e l y t u n n i t + k y s e l y t u n t e i h i n + k y s e l y t u n t i + k y s e l y t u n t i a + k y s e l y t u n t i e n + k y s e l y t u n t i i n + k y s e l y t u n t i j ä r j e s t e l m ä n + k y s e l y t u n t i l i i t e + k y s e l y t u n t i m e n e t t e l y n + k y s e l y t u t k i m u s t e n + k y s s ä k u r k i + k y s t i s e n + k y s y e s s ä m m e + k y s y e s s ä n i + k y s y e s s ä n n e + k y s y e s s ä ä n + k y s y i + k y s y i n + k y s y i n k i n + k y s y i s i k i n + k y s y i s i m m e + k y s y i s i n + k y s y i s i n k i n + k y s y i t t e + k y s y i t t e k ö + k y s y i v ä t + k y s y j ä k i n + k y s y j ä l l e + k y s y j ä n + k y s y j ä ä + k y s y k ä ä + k y s y k ä ä m m e + k y s y k ä ä p ä + k y s y m m e + k y s y m m e k i n + k y s y m y k s e e m m e + k y s y m y k s e e n + k y s y m y k s e e n i + k y s y m y k s e e n k ä ä n + k y s y m y k s e e n n e + k y s y m y k s e e n s ä + k y s y m y k s e k s i + k y s y m y k s e l l ä + k y s y m y k s e l l ä n i + k y s y m y k s e l l ä ä n + k y s y m y k s e m m e + k y s y m y k s e n + k y s y m y k s e n e s i t t ä j ä n + k y s y m y k s e n i + k y s y m y k s e n n e + k y s y m y k s e n s ä + k y s y m y k s e n ä + k y s y m y k s e s s ä + k y s y m y k s e s s ä k i n + k y s y m y k s e s s ä m m e + k y s y m y k s e s s ä n i + k y s y m y k s e s s ä n n e + k y s y m y k s e s s ä ä n + k y s y m y k s e s t ä + k y s y m y k s e s t ä n n e + k y s y m y k s e s t ä ä n + k y s y m y k s e t + k y s y m y k s i i m m e + k y s y m y k s i i n + k y s y m y k s i i n i + k y s y m y k s i i n n e + k y s y m y k s i i n s ä + k y s y m y k s i l l e + k y s y m y k s i l l ä + k y s y m y k s i n ä + k y s y m y k s i s s ä + k y s y m y k s i s s ä ä n + k y s y m y k s i s t ä + k y s y m y k s i s t ä n i + k y s y m y k s i s t ä n n e + k y s y m y k s i ä + k y s y m y k s i ä k i n + k y s y m y k s i ä n i + k y s y m y k s i ä n n e + k y s y m y s h ä n + k y s y m y s k i e r r o k s e n + k y s y m y s l i s t a l l a + k y s y m y s l o m a k k e e s s a + k y s y m y s l u e t t e l o + k y s y m y s l u e t t e l o a + k y s y m y s l u e t t e l o i t a + k y s y m y s l u e t t e l o o n + k y s y m y s l u e t t e l o s s a + k y s y m y s l u e t t e l o s t a + k y s y m y s m e r k i n + k y s y m y s m e r k i t + k y s y m y s m e r k k e i h i n + k y s y m y s m e r k k e j ä + k y s y m y s m e r k k i + k y s y m y s m e r k k i e n + k y s y m y s m e r k k i i n + k y s y m y s m e r k k i n ä + k y s y m y s m e r k k i y ö k k ö n e n + k y s y m y s m e r k k i ä + k y s y m y s r y h m ä l l e + k y s y m y s s a r j a + k y s y m y s s a r j a a n + k y s y m y s s a r j a n + k y s y m y s t e n + k y s y m y s t u l v a n + k y s y m y s t u n n i l l a + k y s y m y s t ä + k y s y m y s t ä n i + k y s y m ä s s ä + k y s y m ä t t ä + k y s y m ä ä n + k y s y n + k y s y n k i n + k y s y n n ä l l e + k y s y n n ä l l ä + k y s y n n ä n + k y s y n n ä n h a l l i n t a + k y s y n n ä n h a l l i n t a t o i m i a + k y s y n n ä s t ä + k y s y n t ä h u i p p u i h i n + k y s y n t ä k ä y r ä t + k y s y n t ä k ä y r ä ä + k y s y n t ä l ä h t ö i s t ä + k y s y n t ä p a i n o t t e i s t a + k y s y n t ä p o l i t i i k k a a + k y s y n t ä p o l i t i i k k a a n + k y s y n t ä p o l i t i i k k o i h i n + k y s y n t ä p o t e n t i a a l i n + k y s y n t ä p u o l e e n + k y s y n t ä p u o l e l l a + k y s y n t ä p u o l e l l a k a a n + k y s y n t ä p u o l e n + k y s y n t ä p u o l i + k y s y n t ä p u o l t a + k y s y n t ä s i v u l l a + k y s y n t ä v e t o i n e n + k y s y n t ä v e t o i s e s t a + k y s y n t ä v e t o i s e s t i + k y s y n t ä ä + k y s y n t ä ä n + k y s y n y t + k y s y t t e + k y s y t t i i n + k y s y t t y j ä + k y s y t t ä e s s ä + k y s y t t ä i s i i n + k y s y t t ä v ä ä + k y s y t ä + k y s y t ä ä n + k y s y t ä ä n k i n + k y s y v ä t + k y s y y + k y s y ä + k y t e e + k y t e m ä s t ä + k y t k e m ä t t ä + k y t k e n t ä e p ä t a s a p a i n o + k y t k e n t ä r i m a + k y t k e n t ä v i r t a + k y t k e n t ö j ä + k y t k e y t y v ä t + k y t k e y t y y + k y t k i m i s s ä + k y t k i n l a i t o k s i s s a + k y t k y k a u p a s t a + k y t k y k a u p p a a n + k y t k ö k s e t + k y t k ö k s i s s ä + k y t t y r ä k a l a + k y t t y r ä l o h i + k y t t y r ä n i r k k o + k y t ö k a r h u n s a m m a l + k y v y k k y y d e s t ä ä n + k y v y k k ä i m m i s t ä + k y v y k k ä i m p i ä + k y v y k k ä i t ä + k y v y k k ä ä m m ä t + k y v y k k ä ä m p i + k y v y k k ä ä m p i ä + k y v y s t ä + k y v y s t ä m m e + k y v y t + k y v y t t ö m i ä + k y v y t t ö m y y d e s t ä + k y v y t t ö m y y d e s t ä ä n + k y v y t t ö m ä m p i ä + k y y h k y h a p e r o + k y y h k y h a u k k a + k y y h k y n h e r n e + k y y h k y p r i o n i + k y y h k y s l a k k a p e r i a a t e + k y y n e l h a p e r o + k y y n e l k a a s u + k y y n e l k a a s u a + k y y n e l k a a s u l l a + k y y n e l k a a s u n + k y y n e l k a a s u p o m m e j a + k y y n e l k a a s u u n + k y y n e l k a n a v a + k y y n e l k i u r u + k y y n e l m ä n t y + k y y n e l p u s s i + k y y n e l r a u h a n e n + k y y n e l y ö k k ö n e n + k y y n i s e l t ä + k y y n i s e m m i n + k y y n i s e m p i ä + k y y n i s e m p ä ä + k y y n i s e n + k y y n i s i m m i n + k y y n i s i m m ä k s i + k y y n i s i m m ä n + k y y n i s t ä + k y y n i s y y s + k ä d e l l i s i l l e + k ä d e l l i s i l l ä + k ä d e l l ä + k ä d e n k ä ä n t e e s s ä + k ä d e n o j e n n u k s e e n + k ä d e n o j e n n u k s e n + k ä d e n o j e n n u k s e n a + k ä d e n o j e n n u s + k ä d e n o j e n n u s t a + k ä d e n p u r i s t u k s i a + k ä d e n p u r i s t u k s i l l a + k ä d e n s i j o j a + k ä d e n v ä ä n n ö n + k ä d e n v ä ä n n ö s s ä + k ä d e n v ä ä n t ö + k ä d e n v ä ä n t ö ä + k ä d e s s ä + k ä d e s s ä n i + k ä d e s t ä + k ä d e t + k ä e n k a a l i + k ä e n k u k k a + k ä e n p i i k a + k ä k i k e l l o + k ä k i t r o g o n i + k ä m m e n t i e t o k o n e + k ä n n i k u s k i + k ä n n y k k ä p u h e l u j e n + k ä n n y k k ä p u h e l u t + k ä n n y k k ä ä n + k ä n n y k ä n + k ä n n y k ä n h e i t t o + k ä n n y k ä t + k ä n s ä t u h k e l o + k ä p e r t y ä + k ä p y l e h m ä + k ä p y p e r h o k a l a + k ä p y r a u h a n e n + k ä p y r ö y h e l ö k o t i n g a + k ä p y t i k k a + k ä r j e s s ä + k ä r j i s t y e s s ä + k ä r j i s t y i + k ä r j i s t y m i n e n + k ä r j i s t y m i s e e n + k ä r j i s t y m i s e s t ä + k ä r j i s t y m ä s s ä + k ä r j i s t y n e e m m ä l t ä + k ä r j i s t y n e e t + k ä r j i s t y n y t + k ä r j i s t y v ä t + k ä r j i s t y y + k ä r j i s t y ä + k ä r j i s t ä i s i + k ä r j i s t ä m i s t ä + k ä r j i s t ä m ä t t ä + k ä r j i s t ä m ä ä n + k ä r k e e n + k ä r k e m m e + k ä r k e v i e n + k ä r k e v ä ä + k ä r k i a s e m i s s a + k ä r k i e h d o k k a a n a + k ä r k i h a n k k e e l l e m m e + k ä r k i j o u k o s s a + k ä r k i k a a r t i i n + k ä r k i m a a + k ä r k i m a i d e n + k ä r k i m a i h i n + k ä r k i s i j a a + k ä r k i s i j o i l l a + k ä r k i t e k n o l o g i a n + k ä r k k ä ä m p i + k ä r k k ä ä t + k ä r p p ä m a k i t + k ä r p ä n n a h k a v i i t t a + k ä r p ä s l o u k k u + k ä r p ä s t e n + k ä r r y i l t ä + k ä r r y n p y ö r i e n + k ä r r y n p y ö r ä g a l a k s i + k ä r s i e n + k ä r s i e s s ä m m e + k ä r s i i + k ä r s i j ö i n ä + k ä r s i m i s t ä + k ä r s i m m e + k ä r s i m y k s e e n + k ä r s i m y k s e n + k ä r s i m y k s e t + k ä r s i m y k s i i n + k ä r s i m y k s i l l ä + k ä r s i m y k s i l t ä + k ä r s i m y k s i s t ä + k ä r s i m y k s i ä + k ä r s i m y s k u k k a + k ä r s i m y s t e n + k ä r s i m y s t ä + k ä r s i m ä n s ä + k ä r s i m ä t t ä + k ä r s i m ä t t ö m i k s i + k ä r s i m ä t t ö m i n ä + k ä r s i m ä t t ö m y y t t ä + k ä r s i m ä t t ö m ä k s i + k ä r s i m ä t t ö m ä n ä + k ä r s i m ä t t ö m ä s t i k i n + k ä r s i m ä ä n + k ä r s i n e e n + k ä r s i n e e t + k ä r s i n e i d e n + k ä r s i n e i l l e + k ä r s i n e i t ä + k ä r s i n y t + k ä r s i s i + k ä r s i t t y ä m m e + k ä r s i t t y ä ä n + k ä r s i t y t + k ä r s i v i e n + k ä r s i v i i n + k ä r s i v i l l e + k ä r s i v i s t ä + k ä r s i v i ä + k ä r s i v ä l l i s e m p i + k ä r s i v ä l l i s e m p i ä + k ä r s i v ä l l i s e s t ä + k ä r s i v ä l l i s i ä + k ä r s i v ä l l i s y y d e s t ä n n e + k ä r s i v ä l l i s y y t e m m e + k ä r s i v ä l l i s y y t t ä + k ä r s i v ä l l i s y y t t ä n n e + k ä r s i v ä l l i s y y t t ä ä n + k ä r s i v ä n + k ä r s i v ä t + k ä r s i ä + k ä r s ä k a l l a + k ä r s ä n i r k k o + k ä r s ä n o k k a s i i l i + k ä r s ä n u o l i a i n e n + k ä r s ä p u s s i p ä ä s t ä i n e n + k ä r v e n n e t t y + k ä r ä j ä t u o m a r e i d e n + k ä r ä j ö i d ä k s e e n + k ä r ä j ö i n t i k u l t t u u r i n + k ä s i a s e + k ä s i a s e i d e n + k ä s i a s e i l l a + k ä s i a s e i s t a + k ä s i e n + k ä s i e n k u i v a a j a + k ä s i e n p e s u p ä i v ä + k ä s i h u u h d e + k ä s i i n n e + k ä s i i n s ä + k ä s i j a r r u k ä ä n n ö s + k ä s i k a n u u n a + k ä s i k a u p p a l ä ä k e t t ä + k ä s i k a u p p a l ä ä k k e i d e n + k ä s i k a u p p a l ä ä k k e i s i i n + k ä s i k a u p p a l ä ä k k e i s t ä + k ä s i k i r j a + k ä s i k i r j a a + k ä s i k i r j a n + k ä s i k i r j a s t a + k ä s i k i r j a t + k ä s i k i r j o i t u k s e e n + k ä s i k i r j o i t u s t a + k ä s i k i r v e s + k ä s i k o n s o l i + k ä s i k r a n a a t t i + k ä s i l a u k k u i h i n + k ä s i l a u k k u j e n + k ä s i l a u k u s s a + k ä s i m a t k a t a v a r a s ä ä n t ö j ä + k ä s i m a t k a t a v a r a t + k ä s i m a t k a t a v a r o i d e n + k ä s i m a t k a t a v a r o i s s a + k ä s i m a t k a t a v a r o i s s a a n + k ä s i m a t k a t a v a r o i s t a + k ä s i m a t k a t a v a r o i t a + k ä s i m e r k i n + k ä s i m e r k k i + k ä s i m i k r o f o n i t + k ä s i n e e t + k ä s i p a l l o m a a j o u k k u e + k ä s i p a l l o n p e l a a j a n + k ä s i s a h a + k ä s i s s ä m m e + k ä s i s t ä m m e + k ä s i s t ä ä n + k ä s i t e a n a l y y s i + k ä s i t e k a r t t a + k ä s i t e l a i n o p p i + k ä s i t e l k ä ä m m e + k ä s i t e l l e e t + k ä s i t e l l e i d e n + k ä s i t e l l e s s ä + k ä s i t e l l e s s ä m m e + k ä s i t e l l e s s ä n n e + k ä s i t e l l e s s ä ä n + k ä s i t e l l y i k s i + k ä s i t e l l y i l l ä + k ä s i t e l l y i s t ä + k ä s i t e l l y s t ä + k ä s i t e l l y t + k ä s i t e l l ä + k ä s i t e l l ä k s e e n + k ä s i t e l l ä k s e m m e + k ä s i t e l l ä k s e n i + k ä s i t e l l ä ä n + k ä s i t e l l ä ä n k i n + k ä s i t e l t i i n + k ä s i t e l t y i h i n + k ä s i t e l t y j e n + k ä s i t e l t y j ä + k ä s i t e l t y y n + k ä s i t e l t ä e s s ä + k ä s i t e l t ä i s i + k ä s i t e l t ä i s i i n + k ä s i t e l t ä v i e n + k ä s i t e l t ä v i i n + k ä s i t e l t ä v i k s i + k ä s i t e l t ä v i l l ä + k ä s i t e l t ä v i n ä + k ä s i t e l t ä v i n ä m m e + k ä s i t e l t ä v i n ä ä n + k ä s i t e l t ä v i s s ä + k ä s i t e l t ä v i ä + k ä s i t e l t ä v ä k s e e n + k ä s i t e l t ä v ä k s e m m e + k ä s i t e l t ä v ä k s e n i + k ä s i t e l t ä v ä k s i + k ä s i t e l t ä v ä n + k ä s i t e l t ä v ä n ä + k ä s i t e l t ä v ä n ä m m e + k ä s i t e l t ä v ä n ä ä n + k ä s i t e l t ä v ä s s ä + k ä s i t e l t ä v ä s t ä + k ä s i t e l t ä v ä t + k ä s i t e l t ä v ä ä + k ä s i t e l t ä v ä ä n + k ä s i t e o l l i s u u d e n + k ä s i t e o l l i s u u d e s s a + k ä s i t e o l l i s u u s + k ä s i t e o l l i s u u s a l a l l a + k ä s i t e o l l i s u u s a l a n + k ä s i t e o l l i s u u s a l o j e n + k ä s i t e o l l i s u u s y r i t y k s i e n + k ä s i t e o l l i s u u s y r i t y k s i i n + k ä s i t e o l l i s u u s y r i t y k s i ä + k ä s i t e o l l i s u u s y r i t y s t e n + k ä s i t e o l l i s u u t e e n + k ä s i t e p a r i i n + k ä s i t e t a i d e + k ä s i t e t t i i n + k ä s i t e t t ä + k ä s i t e t t ä v ä m p i + k ä s i t t e e k s i + k ä s i t t e e l l e + k ä s i t t e e l l i s e e n + k ä s i t t e e l l i s e m m i n + k ä s i t t e e l l i s e m p ä ä + k ä s i t t e e n + k ä s i t t e e s e e n + k ä s i t t e e s s ä + k ä s i t t e e s t ä + k ä s i t t e e s t ä n n e + k ä s i t t e e t + k ä s i t t e i d e n + k ä s i t t e i s s ä + k ä s i t t e i t ä + k ä s i t t e l e e + k ä s i t t e l e e k i n + k ä s i t t e l e m i s e e n + k ä s i t t e l e m i s e k s i + k ä s i t t e l e m i s e n + k ä s i t t e l e m i s e s t ä + k ä s i t t e l e m i s t ä m m e + k ä s i t t e l e m m e + k ä s i t t e l e m m e k ö + k ä s i t t e l e m ä l l ä + k ä s i t t e l e m ä m m e + k ä s i t t e l e m ä n i + k ä s i t t e l e m ä s s ä m m e + k ä s i t t e l e m ä s t ä + k ä s i t t e l e m ä s t ä m m e + k ä s i t t e l e m ä t t ä + k ä s i t t e l e m ä t t ö m i e n + k ä s i t t e l e m ä t t ö m ä n ä + k ä s i t t e l e m ä t ö n t ä + k ä s i t t e l e m ä ä m m e + k ä s i t t e l e m ä ä n + k ä s i t t e l e n + k ä s i t t e l e t t e + k ä s i t t e l e v i s s ä + k ä s i t t e l e v i ä + k ä s i t t e l e v ä + k ä s i t t e l e v ä n + k ä s i t t e l e v ä s s ä + k ä s i t t e l e v ä t + k ä s i t t e l e v ä t k ö + k ä s i t t e l e v ä ä + k ä s i t t e l e v ä ä n + k ä s i t t e l i + k ä s i t t e l i m m e + k ä s i t t e l i n + k ä s i t t e l i s i m m e + k ä s i t t e l i s i n + k ä s i t t e l i t t e + k ä s i t t e l i v ä t + k ä s i t t e l y a i k a + k ä s i t t e l y a i k a a + k ä s i t t e l y a i k a a n + k ä s i t t e l y a i k a t a u l u j a + k ä s i t t e l y a i k o j a + k ä s i t t e l y a i k o j e n + k ä s i t t e l y a i n e e t + k ä s i t t e l y a i n e i d e n + k ä s i t t e l y a i n e i k s i + k ä s i t t e l y a i n e i s i i n + k ä s i t t e l y a i n e i t a + k ä s i t t e l y a j a n + k ä s i t t e l y a j a n k o h t a + k ä s i t t e l y a j a t + k ä s i t t e l y a j o i n + k ä s i t t e l y e r o t + k ä s i t t e l y i s s ä ä n + k ä s i t t e l y j e n + k ä s i t t e l y j ä + k ä s i t t e l y j ä r j e s t e l m i s t ä + k ä s i t t e l y j ä r j e s t e l m i ä + k ä s i t t e l y j ä r j e s t e l m ä l l ä + k ä s i t t e l y j ä r j e s t e l m ä t + k ä s i t t e l y j ä r j e s t y k s e e n + k ä s i t t e l y j ä r j e s t y k s e n + k ä s i t t e l y j ä r j e s t y k s e s s ä + k ä s i t t e l y j ä r j e s t y k s e s t ä + k ä s i t t e l y j ä r j e s t y k s e s t ä m m e + k ä s i t t e l y j ä r j e s t y s + k ä s i t t e l y j ä r j e s t y s t ä + k ä s i t t e l y k a p a s i t e e t t i a m m e + k ä s i t t e l y k e s k u k s i i n + k ä s i t t e l y k i e l e e n + k ä s i t t e l y k i e l e t + k ä s i t t e l y k i e l t ä + k ä s i t t e l y k r i t e e r i t + k ä s i t t e l y k u l u j a + k ä s i t t e l y k u l u j e n + k ä s i t t e l y k u l u t + k ä s i t t e l y k u s t a n n u k s e t + k ä s i t t e l y k u s t a n n u k s i i n + k ä s i t t e l y k u s t a n n u k s i s t a + k ä s i t t e l y k y v y n + k ä s i t t e l y l a i t o k s e e n + k ä s i t t e l y l a i t o k s e s s a + k ä s i t t e l y l a i t o k s i a + k ä s i t t e l y l a i t o k s i i n + k ä s i t t e l y l a i t o k s i s s a + k ä s i t t e l y l a i t o s + k ä s i t t e l y l a i t o s t a + k ä s i t t e l y l a i t o s t e n + k ä s i t t e l y l a i t t e e t + k ä s i t t e l y l a i t t e i s i i n + k ä s i t t e l y l l e + k ä s i t t e l y m a k s u + k ä s i t t e l y m a t e r i a a l e j a + k ä s i t t e l y m e k a n i s m i + k ä s i t t e l y m e n e t e l m i e n + k ä s i t t e l y m e n e t e l m i ä + k ä s i t t e l y m e n e t e l m ä s t ä + k ä s i t t e l y m e n e t e l m ä t + k ä s i t t e l y m e n e t e l m ä ä + k ä s i t t e l y m e n e t t e l y + k ä s i t t e l y m e n e t t e l y i s t ä + k ä s i t t e l y m e n e t t e l y j ä + k ä s i t t e l y m e n e t t e l y n + k ä s i t t e l y m e n e t t e l y s t ä + k ä s i t t e l y m e n e t t e l y t + k ä s i t t e l y m e n e t t e l y ä + k ä s i t t e l y m u o t o a + k ä s i t t e l y n + k ä s i t t e l y n i + k ä s i t t e l y n o p e u s + k ä s i t t e l y n s ä + k ä s i t t e l y o h j e e t + k ä s i t t e l y o h j e l m i i n + k ä s i t t e l y p a i k k a + k ä s i t t e l y p a l v e l u i t a + k ä s i t t e l y p a l v e l u j a + k ä s i t t e l y p a l v e l u s t a + k ä s i t t e l y p r o s e s s e j a + k ä s i t t e l y p r o s e s s i n + k ä s i t t e l y r a t k a i s u i h i n + k ä s i t t e l y s s ä + k ä s i t t e l y s s ä m m e + k ä s i t t e l y s s ä ä n + k ä s i t t e l y s t ä + k ä s i t t e l y s u u n n i t e l m a + k ä s i t t e l y t a p a + k ä s i t t e l y t a p a a + k ä s i t t e l y t a p a a n + k ä s i t t e l y t a p o i h i n + k ä s i t t e l y t a v a n + k ä s i t t e l y t o i m i s t a + k ä s i t t e l y v a i h e e s s a + k ä s i t t e l y v a i h e i s s a + k ä s i t t e l y v a i h e i t a + k ä s i t t e l y v a i h t o e h t o j a + k ä s i t t e l y v a i k e u d e t + k ä s i t t e l y v e r k k o a + k ä s i t t e l y v i r h e e t + k ä s i t t e l y v u o r o s s a + k ä s i t t e l y y n + k ä s i t t e l y y n s ä + k ä s i t t e l y ä + k ä s i t t ä m ä t t ä + k ä s i t t ä m ä t t ö m i e n + k ä s i t t ä m ä t t ö m i ä + k ä s i t t ä m ä t t ö m ä l t ä + k ä s i t t ä m ä t t ö m ä m m ä l l e + k ä s i t t ä m ä t t ö m ä m p i + k ä s i t t ä m ä t t ö m ä m p ä ä + k ä s i t t ä m ä t t ö m ä n + k ä s i t t ä m ä t t ö m ä s t ä + k ä s i t t ä m ä t ö n t ä + k ä s i t t ä m ä ä n + k ä s i t t ä n e e t + k ä s i t t ä n y t + k ä s i t t ä v ä t + k ä s i t t ä v ä ä + k ä s i t t ä ä + k ä s i t t ä ä k s e n i + k ä s i t y k s e e n + k ä s i t y k s e l l e + k ä s i t y k s e m m e + k ä s i t y k s e n + k ä s i t y k s e n i + k ä s i t y k s e n s ä + k ä s i t y k s e s s ä + k ä s i t y k s e t + k ä s i t y k s i l l e + k ä s i t y k s i ä + k ä s i t y k s i ä m m e + k ä s i t y s e r o j a + k ä s i t y s k y k y ä + k ä s i t y s t e m m e + k ä s i t y s t ä + k ä s i t y s t ä m m e + k ä s i t y ö + k ä s i t y ö a l a + k ä s i t y ö a l a a n + k ä s i t y ö a l a l l a + k ä s i t y ö a l a n + k ä s i t y ö a l o i l l a + k ä s i t y ö a l o i s t a + k ä s i t y ö a l o j e n + k ä s i t y ö a m m a t e i l l e + k ä s i t y ö a m m a t i n + k ä s i t y ö a m m a t t i e n + k ä s i t y ö h ö n + k ä s i t y ö k a l u i s s a + k ä s i t y ö l ä i s a l a s t a + k ä s i t y ö l ä i s a l a t + k ä s i t y ö l ä i s a l o i l l e + k ä s i t y ö l ä i s a l o j e n + k ä s i t y ö l ä i s a m m a t i s s a + k ä s i t y ö l ä i s a m m a t i t + k ä s i t y ö l ä i s a m m a t t e j a + k ä s i t y ö l ä i s e t + k ä s i t y ö l ä i s i i n + k ä s i t y ö l ä i s i l l ä + k ä s i t y ö l ä i s i ä + k ä s i t y ö l ä i s t e n + k ä s i t y ö l ä i s t e o l l i s u u d e n + k ä s i t y ö l ä i s t e o l l i s u u t t a + k ä s i t y ö l ä i s t u o t t e i l l e + k ä s i t y ö l ä i s t y y p p i s t e n + k ä s i t y ö l ä i s y h d i s t y s t e n + k ä s i t y ö l ä i s y r i t y k s e t + k ä s i t y ö l ä i s y r i t y s t e n + k ä s i t y ö l ä i s y y d e n + k ä s i t y ö m m e + k ä s i t y ö n + k ä s i t y ö t a i t o j a a n + k ä s i t y ö t e o l l i s u u d e l l e + k ä s i t y ö t e o l l i s u u d e n + k ä s i t y ö t e o l l i s u u t e e n + k ä s i t y ö t e o l l i s u u t t a m m e + k ä s i t y ö t ä + k ä s i t y ö y r i t y k s e m m e + k ä s i t y ö y r i t y k s i l l e + k ä s i t y ö y r i t y k s i ä + k ä s i t y ö y r i t y s t e n + k ä s i t ä r i n ä + k ä s i t ä r i n ä s t ä + k ä s i t ä r i n ä ä n + k ä s i ä + k ä s i ä m m e + k ä s i ä ä n + k ä s k y n a n t o k e t j u + k ä s k y s s ä + k ä s k y s t ä + k ä s k y v a l t a a + k ä s k y y n + k ä s k y ä + k ä s n ä s i k a + k ä t e e n + k ä t e e n i + k ä t e i s a u t o m a a t t e j a + k ä t e i s e n + k ä t e i s e u r o j e n + k ä t e i s e u r o o n + k ä t e i s h i n t a a n + k ä t e i s k a s s a s t a + k ä t e i s k a u p p a + k ä t e i s k o r t t i + k ä t e i s m a k s u j a + k ä t e i s m a k s u j e n + k ä t e i s m a k s u t + k ä t e i s m a k s u v e l v o l l i s u u s + k ä t e i s n o s t o j e n + k ä t e i s r a h a l i i k e n n e + k ä t e i s r a h a l i i k e n n e t t ä + k ä t e i s r a h a l i i k e n t e e n + k ä t e i s r a h a l l a + k ä t e i s r a h a n + k ä t e i s t a l o u t t a + k ä t e i s t a r p e i s t a + k ä t e i s t ä + k ä t e i s v a l u u t t a n a + k ä t e i s v a r a n s a + k ä t e i s v a r a v u o r e t + k ä t e i s v a r o i h i n + k ä t e i s v a r o i l l a + k ä t e i s v a r o j e n + k ä t e i s v i r r a n + k ä t e l l ä + k ä t e m m e + k ä t e n i + k ä t e n s ä + k ä t e v ä l l ä + k ä t e v ä m m i n + k ä t e v ä m p ä ä + k ä t k e t t y ä + k ä t k e t ä ä n + k ä t k e v ä t + k ä t k e y d y m m e k ö + k ä t k y t k u o l e m a + k ä t k y t k u o l e m a s t a + k ä t k y t k u o l e m a t + k ä t k y t k u o l e m i e n + k ä t t e l e v ä t + k ä t t e n t a p u t u k s i a + k ä v e l e m i s e n + k ä v e l e m ä ä n + k ä v e l e v i ä + k ä v e l l e n + k ä v e l l e s s ä n i + k ä v e l l ä + k ä v e l t i i n + k ä v e l y e t ä i s y y d e l l ä + k ä v e l y k a t u + k ä v e l y k e p p i + k ä v e l y m u k a v u u t e e n + k ä v e l y t u o l i + k ä v e l y v a u h d i l l a + k ä v i + k ä v i j ä m ä ä r ä + k ä v i j ä s e u r a n t a + k ä v i k i n + k ä v i m m e + k ä v i s i + k ä v i v ä t + k ä v ä i s e e + k ä y d e s s ä n i + k ä y d e s s ä ä n + k ä y d y i s s ä + k ä y d y i s t ä + k ä y d y n + k ä y d y s t ä + k ä y d y t + k ä y d ä + k ä y d ä k s e e n + k ä y d ä ä n + k ä y d ä ä n h ä n + k ä y k ä ä + k ä y k ä ä m m e + k ä y k ö + k ä y m i e m m e + k ä y m i e n + k ä y m i e n i + k ä y m i e n s ä + k ä y m i i n + k ä y m i s s ä n i + k ä y m i s s ä ä n + k ä y m i s t e o l l i s u u d e n + k ä y m i s t e o l l i s u u d e s t a + k ä y m i s t u o t e + k ä y m m e + k ä y m ä l ä k ä y t t ä y t y m i n e n + k ä y m ä l ö i d e n + k ä y m ä m m e + k ä y m ä n i + k ä y m ä s s ä + k ä y m ä t t ä + k ä y m ä ä m m e + k ä y m ä ä n + k ä y n + k ä y n e e t + k ä y n n i s s ä + k ä y n n i s t e t t i i n + k ä y n n i s t e t t y + k ä y n n i s t e t t y j e n + k ä y n n i s t e t t y y n + k ä y n n i s t e t t y ä + k ä y n n i s t e t t ä e s s ä + k ä y n n i s t e t t ä v ä s s ä + k ä y n n i s t e t y n + k ä y n n i s t e t y s t ä + k ä y n n i s t e t y t + k ä y n n i s t e t ä ä n + k ä y n n i s t e t ä ä n k ö + k ä y n n i s t i + k ä y n n i s t i m m e + k ä y n n i s t i v ä t + k ä y n n i s t y e s s ä + k ä y n n i s t y i + k ä y n n i s t y i v ä t + k ä y n n i s t y m i s e n + k ä y n n i s t y m i s t ä + k ä y n n i s t y m ä s s ä + k ä y n n i s t y m ä ä n + k ä y n n i s t y n e e t + k ä y n n i s t y n y t + k ä y n n i s t y s a k k u + k ä y n n i s t y s j ä r j e s t e l m ä n + k ä y n n i s t y s k a m p a n j a a + k ä y n n i s t y s k u s t a n n u k s e t + k ä y n n i s t y s o h j e l m i a + k ä y n n i s t y s r a h a n a + k ä y n n i s t y s r a h a s t o + k ä y n n i s t y s r a h a s t o i l l a + k ä y n n i s t y s r a h a s t o n a + k ä y n n i s t y s t o i m e t + k ä y n n i s t y s t u e t + k ä y n n i s t y s v a i h e e n + k ä y n n i s t y s v a i h e e s s a + k ä y n n i s t y s v a i k e u k s i e n + k ä y n n i s t y s v a i k e u k s i s t a + k ä y n n i s t y t t y ä + k ä y n n i s t y v ä + k ä y n n i s t y v ä n + k ä y n n i s t y v ä t + k ä y n n i s t y v ä ä n + k ä y n n i s t y y + k ä y n n i s t y ä + k ä y n n i s t ä i s i + k ä y n n i s t ä m i s a j a n k o h d a s t a + k ä y n n i s t ä m i s e e n + k ä y n n i s t ä m i s e k s i + k ä y n n i s t ä m i s e n + k ä y n n i s t ä m i s e s s ä + k ä y n n i s t ä m i s e s t ä + k ä y n n i s t ä m i s o n g e l m a t + k ä y n n i s t ä m i s t ä + k ä y n n i s t ä m i s v a i h e + k ä y n n i s t ä m i ä + k ä y n n i s t ä m m e + k ä y n n i s t ä m ä l l ä + k ä y n n i s t ä m ä m m e + k ä y n n i s t ä m ä s s ä + k ä y n n i s t ä m ä s t ä + k ä y n n i s t ä m ä t t ä + k ä y n n i s t ä m ä ä n + k ä y n n i s t ä n e e t + k ä y n n i s t ä n y t + k ä y n n i s t ä ä + k ä y n n i s t ä ä k s e e n + k ä y n n i s t ä ä k s e m m e + k ä y n n i s t ä ä k s e n n e + k ä y n n i s t ä ä k ö + k ä y n t i i n + k ä y n t i k o r t e i s t a + k ä y n t i k o r t i s t a + k ä y n t i k o r t t e j a + k ä y n t i k o r t t i + k ä y n t i k o r t t i e n + k ä y n t i k o r t t i m m e + k ä y n y t + k ä y n y t k i n + k ä y r ä l a u s e + k ä y r ä n o k k a + k ä y r ä n o k k a k a i v a j a + k ä y r ä s i r p p i k i p u a j a + k ä y r ä ä + k ä y t e t t i i n + k ä y t e t t y i n ä + k ä y t e t t y j e n + k ä y t e t t y j ä + k ä y t e t t y n ä + k ä y t e t t y ä + k ä y t e t t y ä ä n + k ä y t e t t ä e s s ä + k ä y t e t t ä i s i i n + k ä y t e t t ä v i e n + k ä y t e t t ä v i l l e + k ä y t e t t ä v i n ä + k ä y t e t t ä v i s s ä + k ä y t e t t ä v i s s ä m m e + k ä y t e t t ä v i s s ä n n e + k ä y t e t t ä v i s s ä ä n + k ä y t e t t ä v i ä + k ä y t e t t ä v ä k s i + k ä y t e t t ä v ä n ä + k ä y t e t t ä v ä s t ä + k ä y t e t t ä v ä t + k ä y t e t t ä v ä ä + k ä y t e t t ä v ä ä n + k ä y t e t t ä ä n + k ä y t e t y i l l e + k ä y t e t y i s s ä + k ä y t e t y i s t ä + k ä y t e t y n + k ä y t e t y s t ä + k ä y t e t y t + k ä y t e t ä + k ä y t e t ä ä n + k ä y t e t ä ä n k i n + k ä y t e t ä ä n k ö + k ä y t i i n + k ä y t i i n k i n + k ä y t i m m e + k ä y t i m m e p ä + k ä y t t i + k ä y t t i v ä t + k ä y t t ä e n + k ä y t t ä e s s ä + k ä y t t ä e s s ä m m e + k ä y t t ä e s s ä ä n + k ä y t t ä i s i + k ä y t t ä i s i m m e + k ä y t t ä i s i n k ö + k ä y t t ä i s i t t e + k ä y t t ä j i e n + k ä y t t ä j i i n + k ä y t t ä j i k s i + k ä y t t ä j i l l e + k ä y t t ä j i l l e e n + k ä y t t ä j i l l ä + k ä y t t ä j i l t ä + k ä y t t ä j i s t ä + k ä y t t ä j i ä + k ä y t t ä j ä i n f o r m a a t i o t a + k ä y t t ä j ä j ä r j e s t ö j e n + k ä y t t ä j ä j ä r j e s t ö t + k ä y t t ä j ä k e s k e i n e n + k ä y t t ä j ä k e s k e i s t ä + k ä y t t ä j ä k e t j u n + k ä y t t ä j ä k o k e m u s + k ä y t t ä j ä k s i + k ä y t t ä j ä l l e + k ä y t t ä j ä l t ä + k ä y t t ä j ä l u o k k a + k ä y t t ä j ä l ä h t ö i s e t + k ä y t t ä j ä l ä h t ö i s i ä + k ä y t t ä j ä m a i h i n + k ä y t t ä j ä m a i l l a + k ä y t t ä j ä m a k s u i n + k ä y t t ä j ä m a k s u s t a + k ä y t t ä j ä n + k ä y t t ä j ä n ä + k ä y t t ä j ä p a l v e l u i t a + k ä y t t ä j ä p r o f i i l i i n + k ä y t t ä j ä p u o l e l t a + k ä y t t ä j ä r y h m i e n + k ä y t t ä j ä r y h m i i n + k ä y t t ä j ä r y h m i l l e + k ä y t t ä j ä r y h m i l t ä + k ä y t t ä j ä r y h m i ä + k ä y t t ä j ä r y h m ä l l e + k ä y t t ä j ä r y h m ä t + k ä y t t ä j ä s t ä + k ä y t t ä j ä t + k ä y t t ä j ä t a s o l l e + k ä y t t ä j ä t i e t o i h i n + k ä y t t ä j ä t i l i e n + k ä y t t ä j ä t u r v a l l i s u u d e n + k ä y t t ä j ä t y y t y v ä i s y y s + k ä y t t ä j ä t y y t y v ä i s y y s s e u r a n n a n + k ä y t t ä j ä v a a t i m u s t e n + k ä y t t ä j ä y h t e i s ö ö n + k ä y t t ä j ä y r i t y k s e l t ä + k ä y t t ä j ä y r i t y k s e n + k ä y t t ä j ä y r i t y k s e s t ä + k ä y t t ä j ä y r i t y k s e t + k ä y t t ä j ä y r i t y k s i i n + k ä y t t ä j ä y r i t y s + k ä y t t ä j ä y r i t y s t ä + k ä y t t ä j ä y s t ä v ä l l i n e n + k ä y t t ä j ä y s t ä v ä l l i s e k s i + k ä y t t ä j ä y s t ä v ä l l i s e m m i k s i + k ä y t t ä j ä y s t ä v ä l l i s e m m ä n + k ä y t t ä j ä y s t ä v ä l l i s e m m ä t + k ä y t t ä j ä y s t ä v ä l l i s e m p i + k ä y t t ä j ä y s t ä v ä l l i s e m p i e n + k ä y t t ä j ä y s t ä v ä l l i s e m p i ä + k ä y t t ä j ä y s t ä v ä l l i s e m p ä ä + k ä y t t ä j ä y s t ä v ä l l i s e m p ä ä n + k ä y t t ä j ä y s t ä v ä l l i s e n + k ä y t t ä j ä y s t ä v ä l l i s e n ä + k ä y t t ä j ä y s t ä v ä l l i s e s t ä + k ä y t t ä j ä y s t ä v ä l l i s e t + k ä y t t ä j ä y s t ä v ä l l i s i n t ä + k ä y t t ä j ä y s t ä v ä l l i s i ä + k ä y t t ä j ä y s t ä v ä l l i s t e n + k ä y t t ä j ä y s t ä v ä l l i s t ä + k ä y t t ä j ä y s t ä v ä l l i s y y d e n + k ä y t t ä j ä y s t ä v ä l l i s y y d e s t ä + k ä y t t ä j ä y s t ä v ä l l i s y y s + k ä y t t ä j ä y s t ä v ä l l i s y y t t ä + k ä y t t ä j ä ä + k ä y t t ä k ä ä + k ä y t t ä k ä ä m m e + k ä y t t ä m i e m m e + k ä y t t ä m i s e e n + k ä y t t ä m i s e k s i + k ä y t t ä m i s e s t ä + k ä y t t ä m i s t ä + k ä y t t ä m ä l l ä + k ä y t t ä m ä m m e + k ä y t t ä m ä n n e + k ä y t t ä m ä s t ä + k ä y t t ä m ä t t ä + k ä y t t ä m ä t t ö m i e n + k ä y t t ä m ä t t ö m i s t ä + k ä y t t ä m ä t t ö m i ä + k ä y t t ä m ä t t ö m ä t + k ä y t t ä m ä ä + k ä y t t ä m ä ä m m e + k ä y t t ä m ä ä n + k ä y t t ä n e e n + k ä y t t ä n e e t + k ä y t t ä n e i t ä + k ä y t t ä n y t + k ä y t t ä v i e n + k ä y t t ä v i l l e + k ä y t t ä v i l t ä + k ä y t t ä v i s t ä + k ä y t t ä v i ä + k ä y t t ä v ä l l e + k ä y t t ä v ä n + k ä y t t ä v ä t + k ä y t t ä v ä t k ö + k ä y t t ä y d y t ä ä n + k ä y t t ä y t y i s i + k ä y t t ä y t y m i s e e n + k ä y t t ä y t y m i s e l l ä ä n + k ä y t t ä y t y m i s e s s ä + k ä y t t ä y t y m i s g e n e t i i k k a + k ä y t t ä y t y m i s h ä i r i ö i s t ä + k ä y t t ä y t y m i s h ä i r i ö i t ä + k ä y t t ä y t y m i s k a a v o j e n + k ä y t t ä y t y m i s k u l t t u u r i n s a + k ä y t t ä y t y m i s m a l l e i s s a + k ä y t t ä y t y m i s m a l l e i s t a + k ä y t t ä y t y m i s m a l l e j a + k ä y t t ä y t y m i s m a l l e j a m m e + k ä y t t ä y t y m i s m a l l i e n + k ä y t t ä y t y m i s m e n e t e l m i ä + k ä y t t ä y t y m i s m u o t o a + k ä y t t ä y t y m i s n o r m e j a + k ä y t t ä y t y m i s n o r m i t + k ä y t t ä y t y m i s o n g e l m i a + k ä y t t ä y t y m i s o n g e l m i i n + k ä y t t ä y t y m i s s t a n d a r d e j a + k ä y t t ä y t y m i s s ä ä n n ö i l l e + k ä y t t ä y t y m i s s ä ä n n ö i l l ä + k ä y t t ä y t y m i s s ä ä n n ö n + k ä y t t ä y t y m i s s ä ä n n ö s t ö + k ä y t t ä y t y m i s s ä ä n n ö s t ö j ä + k ä y t t ä y t y m i s s ä ä n n ö s t ö n + k ä y t t ä y t y m i s s ä ä n n ö s t ö s t ä + k ä y t t ä y t y m i s s ä ä n n ö t + k ä y t t ä y t y m i s s ä ä n t ö + k ä y t t ä y t y m i s s ä ä n t ö j e n + k ä y t t ä y t y m i s s ä ä n t ö j ä + k ä y t t ä y t y m i s s ä ä n t ö ä + k ä y t t ä y t y m i s t a p a m m e + k ä y t t ä y t y m i s t a p o i h i n + k ä y t t ä y t y m i s t a p o j a + k ä y t t ä y t y m i s t i e d e + k ä y t t ä y t y m i s t u t k i m u k s i i n + k ä y t t ä y t y m i s t ä + k ä y t t ä y t y m i s t ä m m e + k ä y t t ä y t y m i s t ä ä n + k ä y t t ä y t y m ä l l ä + k ä y t t ä y t y n e e t + k ä y t t ä y t y v i s t ä + k ä y t t ä y t y v ä t + k ä y t t ä y t y y + k ä y t t ä y t y ä + k ä y t t ä ä + k ä y t t ä ä k s e e n + k ä y t t ä ä k s e m m e + k ä y t t ä ä k ö + k ä y t t ö a i k a + k ä y t t ö a j a l t a + k ä y t t ö a j a n + k ä y t t ö a j a s t a + k ä y t t ö a l a + k ä y t t ö a l i j ä ä m ä n + k ä y t t ö a l u e i d e n + k ä y t t ö a l u e i l l e + k ä y t t ö a l u e i t a + k ä y t t ö a s t e + k ä y t t ö a s t e e n + k ä y t t ö a s t e e s e e n + k ä y t t ö a s t e e s t a + k ä y t t ö a s t e e t + k ä y t t ö a s t e i t a + k ä y t t ö a s t e t t a + k ä y t t ö d i r e k t i i v i ä + k ä y t t ö e d e l l y t y k s e t + k ä y t t ö e d e l l y t y s t e n + k ä y t t ö e s i n e e t + k ä y t t ö e s i n e i n ä + k ä y t t ö h i n t a i n d i k a a t t o r i a + k ä y t t ö h i n t o j a + k ä y t t ö h i n t o j e n + k ä y t t ö i k ä + k ä y t t ö i k ä n s ä + k ä y t t ö i k ä ä + k ä y t t ö i ä l t ä + k ä y t t ö i ä n + k ä y t t ö j ä + k ä y t t ö j ä r j e s t e l m i s t ä + k ä y t t ö j ä r j e s t e l m i ä + k ä y t t ö j ä r j e s t e l m ä + k ä y t t ö j ä r j e s t e l m ä m m e + k ä y t t ö j ä r j e s t e l m ä n + k ä y t t ö j ä r j e s t e l m ä t + k ä y t t ö k a p a s i t e e t i n + k ä y t t ö k a p a s i t e e t t e i h i n + k ä y t t ö k a p a s i t e e t t i m m e + k ä y t t ö k a t t e i s i i n + k ä y t t ö k e l p o i s e e n + k ä y t t ö k e l p o i s e m m a k s i + k ä y t t ö k e l p o i s e m m a l l a + k ä y t t ö k e l p o i s e m m a n + k ä y t t ö k e l p o i s e m m i k s i + k ä y t t ö k e l p o i s e m p a a + k ä y t t ö k e l p o i s e m p i + k ä y t t ö k e l p o i s e m p i a + k ä y t t ö k e l p o i s e m p i e n + k ä y t t ö k e l p o i s i a + k ä y t t ö k e l p o i s i m p i e n + k ä y t t ö k e l p o i s i n a + k ä y t t ö k e l p o i s t e n + k ä y t t ö k e l v o t t o m a k s i + k ä y t t ö k e l v o t t o m a n a + k ä y t t ö k e l v o t t o m i e n + k ä y t t ö k e l v o t t o m i k s i + k ä y t t ö k i e l l o n + k ä y t t ö k i e l l o s t a + k ä y t t ö k i e l t o + k ä y t t ö k i e l t o a + k ä y t t ö k i i n t i ö i t ä + k ä y t t ö k o i r a + k ä y t t ö k r i t e e r i t + k ä y t t ö k u l u i s t a + k ä y t t ö k u l u j a + k ä y t t ö k u s t a n n u k s e t + k ä y t t ö k u s t a n n u k s i a + k ä y t t ö k u s t a n n u k s i i n + k ä y t t ö k u s t a n n u k s i l t a a n + k ä y t t ö k u s t a n n u k s i s t a + k ä y t t ö k u s t a n n u s t e n + k ä y t t ö l a i t t e e t + k ä y t t ö l i i t t y m ä + k ä y t t ö l i i t t y m ä j ä r j e s t e l m i l l ä + k ä y t t ö l i i t t y m ä k o m p o n e n t t i + k ä y t t ö l u o k k i a + k ä y t t ö l u o k k i e n + k ä y t t ö l u p a a + k ä y t t ö l u v a l l e + k ä y t t ö l ä m p ö t i l a a n + k ä y t t ö m a h d o l l i s u u d e n + k ä y t t ö m a h d o l l i s u u d e t + k ä y t t ö m a h d o l l i s u u k s i a + k ä y t t ö m a h d o l l i s u u k s i e n + k ä y t t ö m a h d o l l i s u u s + k ä y t t ö m a h d o l l i s u u t t a + k ä y t t ö m a k s u i h i n + k ä y t t ö m a k s u i s t a + k ä y t t ö m a k s u j a + k ä y t t ö m a k s u j e n + k ä y t t ö m a k s u j ä r j e s t e l m i e n + k ä y t t ö m a k s u j ä r j e s t e l m ä + k ä y t t ö m a k s u j ä r j e s t e l m ä ä + k ä y t t ö m a k s u j ä r j e s t e l m ä ä n + k ä y t t ö m a k s u l l a + k ä y t t ö m a k s u n + k ä y t t ö m a k s u t + k ä y t t ö m a s s a n a + k ä y t t ö m e n o t + k ä y t t ö m u o t o j e n + k ä y t t ö n s ä + k ä y t t ö o h j e + k ä y t t ö o h j e e n a + k ä y t t ö o h j e e t + k ä y t t ö o h j e i n e e n + k ä y t t ö o h j e i s s a + k ä y t t ö o h j e i t a + k ä y t t ö o i k e u d e n + k ä y t t ö o i k e u d e s t a + k ä y t t ö o i k e u d e t + k ä y t t ö o i k e u k s i a + k ä y t t ö o i k e u k s i e n + k ä y t t ö o i k e u k s i i n + k ä y t t ö o i k e u k s i l l a + k ä y t t ö o i k e u k s i s s a + k ä y t t ö o i k e u s + k ä y t t ö o i k e u s j ä r j e s t e l m ä ä + k ä y t t ö o i k e u s s o p i m u k s i s t a + k ä y t t ö o i k e u s u r a k o i t a + k ä y t t ö o i k e u t e e n + k ä y t t ö o i k e u t e n a + k ä y t t ö o i k e u t t a + k ä y t t ö o l o j a + k ä y t t ö o l o s u h t e i s i i n s a + k ä y t t ö o l o t + k ä y t t ö o m a i s u u s + k ä y t t ö o m a i s u u s l u e t t e l o n + k ä y t t ö o n g e l m i s t a + k ä y t t ö o p a s t a + k ä y t t ö o p p a a n + k ä y t t ö p a i k a s s a + k ä y t t ö p a k k o + k ä y t t ö p a k o n + k ä y t t ö p e r u s t e i d e n + k ä y t t ö p ä i v ä + k ä y t t ö p ä i v ä s t ä + k ä y t t ö p ä i v ä ä + k ä y t t ö p ä ä o m a + k ä y t t ö p ä ä o m a a n + k ä y t t ö p ä ä o m a n + k ä y t t ö r a h a s t o j e n + k ä y t t ö r a j o i t u k s i a + k ä y t t ö r a j o i t u k s i i n + k ä y t t ö r a j o i t u k s i l l e + k ä y t t ö r a j o i t u s t e n + k ä y t t ö s u u n n i t e l m a + k ä y t t ö s u u n n i t e l m i e n + k ä y t t ö s ä ä n t ö i h i n + k ä y t t ö t a i d e + k ä y t t ö t a i t o a + k ä y t t ö t a p a + k ä y t t ö t a p a s u o j a + k ä y t t ö t a p a u s k a a v i o + k ä y t t ö t a p o i h i n + k ä y t t ö t a p o j e n + k ä y t t ö t a r k o i t u k s e e n + k ä y t t ö t a r k o i t u k s e n + k ä y t t ö t a r k o i t u k s e n s a + k ä y t t ö t a r k o i t u k s e t + k ä y t t ö t a r k o i t u k s i a + k ä y t t ö t a r k o i t u s + k ä y t t ö t a r k o i t u s t a + k ä y t t ö t a r k o i t u s t e n + k ä y t t ö t a s o a + k ä y t t ö t a v a r a n a + k ä y t t ö t a v a t + k ä y t t ö t a v o i s t a + k ä y t t ö t a v o i t t e e t + k ä y t t ö t e h o k k u u d e n + k ä y t t ö t e k n i i k o i t a + k ä y t t ö t e s t i i n + k ä y t t ö t i e t o k i r j a u k s i i n + k ä y t t ö t i l i + k ä y t t ö t i l o j a + k ä y t t ö t o i m i e n + k ä y t t ö t o t t u m u k s i i n + k ä y t t ö t u e t + k ä y t t ö t u k e a + k ä y t t ö t u k i + k ä y t t ö t u r v a l l i s u u d e n + k ä y t t ö t u r v a l l i s u u d e s t a + k ä y t t ö t u r v a l l i s u u s t i e d o t e + k ä y t t ö t u r v a l l i s u u s t i e d o t t e i d e n + k ä y t t ö t u r v a l l i s u u s t i e d o t t e i s i i n + k ä y t t ö t u r v a l l i s u u s t i e d o t t e i t a + k ä y t t ö t u r v a l l i s u u t t a + k ä y t t ö v a i h e + k ä y t t ö v a i h e e n + k ä y t t ö v a i h e e s s a + k ä y t t ö v a l m i i n a + k ä y t t ö v a l m i i t a + k ä y t t ö v a l m i s + k ä y t t ö v a l m i u d e n + k ä y t t ö v a l m i u s + k ä y t t ö v a r a + k ä y t t ö v a r m u u s n o r m e i k s i + k ä y t t ö v a r m u u s n o r m e j a + k ä y t t ö v a r o j a + k ä y t t ö v e d e s s ä + k ä y t t ö v e r o + k ä y t t ö v e r o a + k ä y t t ö v e r o l l a + k ä y t t ö v e r o n + k ä y t t ö v e r o o n + k ä y t t ö v o i m a + k ä y t t ö v o i m a j ä r j e s t e l m i i n + k ä y t t ö v o i m a j ä r j e s t e l m i ä + k ä y t t ö v o i m a j ä r j e s t e l m ä ä n + k ä y t t ö v o i m a n a + k ä y t t ö v o i m a t e k n i i k k a + k ä y t t ö v o i m a t e k n i i k k a a + k ä y t t ö v o i m a t e k n o l o g i a a + k ä y t t ö v o i m a t e k n o l o g i o i d e n + k ä y t t ö v o i m a t e k n o l o g i o i t a + k ä y t t ö v u o d e n + k ä y t t ö ä + k ä y t t ö ö m m e + k ä y t t ö ö n + k ä y t t ö ö n o t e t u t + k ä y t t ö ö n o t o n + k ä y t t ö ö n o t o s t a + k ä y t t ö ö n o t t a m i s e k s i + k ä y t t ö ö n o t t o a + k ä y t t ö ö n o t t o a i k a a + k ä y t t ö ö n o t t o a j a n k o h t a a + k ä y t t ö ö n o t t o h a n k e + k ä y t t ö ö n o t t o k o k e m u s + k ä y t t ö ö n o t t o k u s t a n n u k s e t + k ä y t t ö ö n o t t o k y n n y k s e n + k ä y t t ö ö n o t t o k y n n y s + k ä y t t ö ö n o t t o m a h d o l l i s u u k s i s t a + k ä y t t ö ö n o t t o m e n e t t e l y n + k ä y t t ö ö n o t t o m e n e t t e l y ä + k ä y t t ö ö n o t t o o n + k ä y t t ö ö n o t t o p r o s e s s i n + k ä y t t ö ö n o t t o p ä i v ä + k ä y t t ö ö n o t t o p ä i v ä m ä ä r ä + k ä y t t ö ö n o t t o p ä i v ä m ä ä r ä n + k ä y t t ö ö n o t t o p ä i v ä m ä ä r ä s t ä + k ä y t t ö ö n o t t o p ä i v ä m ä ä r ä ä n + k ä y t t ö ö n o t t o p ä i v ä ä + k ä y t t ö ö n o t t o p ä i v ä ä n + k ä y t t ö ö n o t t o s t r a t e g i a a + k ä y t t ö ö n o t t o s u u n n i t e l m a + k ä y t t ö ö n o t t o s ä ä n n ö s t ö s t ä + k ä y t t ö ö n o t t o t u e n + k ä y t t ö ö n o t t o v a i h e + k ä y t t ö ö n o t t o v a i h e e n + k ä y t t ö ö n o t t o v a i h e e s s a + k ä y t t ö ö n s ä + k ä y t y + k ä y t y i h i n + k ä y t y j e n + k ä y t y j ä + k ä y t y y n + k ä y t y ä + k ä y t y ä ä n + k ä y t ä e s s ä + k ä y t ä m m e + k ä y t ä m m e k ö + k ä y t ä m m e p ä + k ä y t ä n + k ä y t ä n n e s ä ä n n ö i l l e + k ä y t ä n n e s ä ä n n ö i l l ä + k ä y t ä n n e s ä ä n n ö i s s ä + k ä y t ä n n e s ä ä n n ö i s t ä + k ä y t ä n n e s ä ä n n ö n + k ä y t ä n n e s ä ä n n ö t + k ä y t ä n n e s ä ä n t ö + k ä y t ä n n e s ä ä n t ö e h d o t u s t e n + k ä y t ä n n e s ä ä n t ö i h i n + k ä y t ä n n e s ä ä n t ö j e n + k ä y t ä n n e s ä ä n t ö j e n s ä + k ä y t ä n n e s ä ä n t ö j ä + k ä y t ä n n e s ä ä n t ö j ä m m e + k ä y t ä n n e s ä ä n t ö r y h m ä + k ä y t ä n n e s ä ä n t ö t y ö r y h m ä + k ä y t ä n n ö i l l e + k ä y t ä n n ö i l l ä + k ä y t ä n n ö i s s ä + k ä y t ä n n ö i s t ä + k ä y t ä n n ö k s i + k ä y t ä n n ö l l e + k ä y t ä n n ö l l i s e e n + k ä y t ä n n ö l l i s e l l ä + k ä y t ä n n ö l l i s e l t ä + k ä y t ä n n ö l l i s e m m i n + k ä y t ä n n ö l l i s e m m i s t ä + k ä y t ä n n ö l l i s e m m ä l l e + k ä y t ä n n ö l l i s e m m ä l l ä + k ä y t ä n n ö l l i s e m m ä n + k ä y t ä n n ö l l i s e m p i + k ä y t ä n n ö l l i s e m p i i n + k ä y t ä n n ö l l i s e m p i ä + k ä y t ä n n ö l l i s e m p ä ä + k ä y t ä n n ö l l i s e m p ä ä n + k ä y t ä n n ö l l i s e n + k ä y t ä n n ö l l i s e n ä + k ä y t ä n n ö l l i s e s s ä + k ä y t ä n n ö l l i s e s t ä + k ä y t ä n n ö l l i s i k s i + k ä y t ä n n ö l l i s i l l ä + k ä y t ä n n ö l l i s i m m i k s i + k ä y t ä n n ö l l i s i m m ä n + k ä y t ä n n ö l l i s i n t ä + k ä y t ä n n ö l l i s i ä + k ä y t ä n n ö l l i s i ä k i n + k ä y t ä n n ö l l i s y y s t a r k i s t u k s i a + k ä y t ä n n ö l l i s y y s t e s t i t + k ä y t ä n n ö l l i s y y t t ä + k ä y t ä n n ö n + k ä y t ä n n ö n l ä h e i n e n + k ä y t ä n n ö n l ä h e i s e m m i l l e + k ä y t ä n n ö n l ä h e i s e m m i l l ä + k ä y t ä n n ö n l ä h e i s e m m i n + k ä y t ä n n ö n l ä h e i s e m m i s t ä + k ä y t ä n n ö n l ä h e i s e m m ä n + k ä y t ä n n ö n l ä h e i s e m p i + k ä y t ä n n ö n l ä h e i s e m p i ä + k ä y t ä n n ö n l ä h e i s e m p i ä k i n + k ä y t ä n n ö n l ä h e i s e m p ä ä + k ä y t ä n n ö n l ä h e i s e m p ä ä n + k ä y t ä n n ö n l ä h e i s e s t ä + k ä y t ä n n ö n l ä h e i s e t + k ä y t ä n n ö n l ä h e i s i m m i s t ä + k ä y t ä n n ö n l ä h e i s i n ä + k ä y t ä n n ö n l ä h e i s i ä + k ä y t ä n n ö n l ä h e i s t ä + k ä y t ä n n ö n l ä h e i s y y s + k ä y t ä n n ö n l ä h e i s y y t t ä + k ä y t ä n n ö n t a s o n + k ä y t ä n n ö s s ä + k ä y t ä n n ö s s ä k i n + k ä y t ä n n ö s t ä + k ä y t ä n n ö t + k ä y t ä n t e e n ä + k ä y t ä n t e i d e n + k ä y t ä n t e i l t ä + k ä y t ä n t e i s t ä + k ä y t ä n t e i t ä + k ä y t ä n t ö i h i n + k ä y t ä n t ö j e n + k ä y t ä n t ö j ä + k ä y t ä n t ö j ä m m e + k ä y t ä n t ö j ä ä n + k ä y t ä n t ö m m e + k ä y t ä n t ö n ä + k ä y t ä n t ö n ä m m e + k ä y t ä n t ö y h t e i s ö + k ä y t ä n t ö ä + k ä y t ä n t ö ö n + k ä y t ä t + k ä y t ä t t e + k ä y t ä v i e n + k ä y t ä v i i n + k ä y t ä v i l l e + k ä y t ä v i l l ä + k ä y t ä v i s s ä + k ä y t ä v i s t ä + k ä y t ä v i ä + k ä y t ä v ä a j a t t e l u + k ä y t ä v ä h a u t a + k ä y t ä v ä k e s k u s t e l u i s t a + k ä y t ä v ä k e s k u s t e l u j e n + k ä y t ä v ä l l ä + k ä y t ä v ä n + k ä y t ä v ä n a a p u r i n a + k ä y t ä v ä p e l i ä + k ä y t ä v ä r a t k a i s u + k ä y t ä v ä ä + k ä y t ä v ä ä n + k ä y t ö k s e e n + k ä y t ö k s e e n s ä + k ä y t ö k s e m m e + k ä y t ö k s e n n e + k ä y t ö k s e s t ä + k ä y t ö k s e s t ä ä n + k ä y t ö l l e + k ä y t ö l l ä + k ä y t ö n + k ä y t ö s h ä i r i ö + k ä y t ö s h ä i r i ö i t ä + k ä y t ö s n o r m e j a + k ä y t ö s s ä + k ä y t ö s s ä m m e + k ä y t ö s s ä ä n + k ä y t ö s s ä ä n n ö t + k ä y t ö s s ä ä n t ö i h i n + k ä y t ö s t a p o j a + k ä y t ö s t ä + k ä y t ö s t ä p o i s t a m i s o h j e l m i s t a + k ä y t ö s t ä p o i s t a m i s p r o s e s s i + k ä y t ö s t ä p o i s t a m i s p r o s e s s i l l e + k ä y t ö s t ä p o i s t a m i s p r o s e s s i n + k ä y t ö s t ä p o i s t a m i s p r o s e s s i s s a + k ä y t ö s t ä p o i s t a m i s t a + k ä y t ö s t ä p o i s t a m i s t e h t ä v i i n + k ä y t ö s t ä p o i s t a m i s t o i m i a + k ä y t ö s t ä p o i s t a m i s v u o s i + k ä y t ö s t ä p o i s t o a + k ä y t ö s t ä p o i s t o h a n k k e i t a + k ä y t ö s t ä p o i s t o j ä t e t t ä + k ä y t ö s t ä p o i s t o o n + k ä y t ö s t ä p o i s t o p r o s e s s i + k ä y t ö s t ä p o i s t o r a h a s t o a + k ä y t ö s t ä p o i s t o r a h a s t o i s t a + k ä y t ö s t ä p o i s t o r a h a s t o j a + k ä y t ö s t ä p o i s t o r a h a s t o j e n + k ä y t ö s t ä p o i s t o r a h a s t o n + k ä y t ö s t ä p o i s t o r a h a s t o t + k ä y t ö s t ä p o i s t o s u u n n i t e l m a t + k ä y t ö s t ä p o i s t o s u u n n i t e l m i a + k ä y t ö s t ä p o i s t o t o i m e n + k ä y t ö s t ä p o i s t o t o i m e t + k ä y t ö s t ä p o i s t o t o i m i a + k ä y t ö s t ä p o i s t o t o i m i e n + k ä y t ö s t ä p o i s t o t o i m i i n + k ä y t ö s t ä p o i s t o t o i m i l t a + k ä y t ö s t ä p o i s t o t y ö h ö n + k ä y t ö s t ä p o i s t o t y ö t + k ä y t ö s t ä p o i s t o v a r o j e n + k ä y t ö s v a l i k o i m a + k ä y v i e n + k ä y v i l l e + k ä y v i ä + k ä y v ä n + k ä y v ä t + k ä ä n n e k o h d a k s i + k ä ä n n e k o h d a l l e + k ä ä n n e k o h d a n + k ä ä n n e k o h d a s s a + k ä ä n n e k o h d a s t a + k ä ä n n e k o h t a + k ä ä n n e k o h t a a + k ä ä n n e k o h t a a n + k ä ä n n e k o h t a n a + k ä ä n n e k o h t i a + k ä ä n n e k o h t i e n + k ä ä n n e p i s t e + k ä ä n n e t t y ä + k ä ä n n e t t y ä ä n + k ä ä n n e t t ä + k ä ä n n e t t ä e s s ä + k ä ä n n e t t ä v ä n ä + k ä ä n n e t y l l ä + k ä ä n n e t y n + k ä ä n n e t y s s ä + k ä ä n n e t y s t ä + k ä ä n n e t ä + k ä ä n n e t ä ä n k i n + k ä ä n n e t ä ä n p ä + k ä ä n n y n + k ä ä n n y t e t t y + k ä ä n n y t e t t y ä + k ä ä n n y t e t ä + k ä ä n n y t e t ä ä n + k ä ä n n y t t ä m i s p o l i i t i k k o j a + k ä ä n n y t t ä m i s t ä + k ä ä n n y t t ä m ä ä n + k ä ä n n y t t ä v ä t + k ä ä n n y t t ä ä + k ä ä n n y t y s t e h t ä v ä ä n s ä + k ä ä n n ä t t ä ä + k ä ä n n ö k s e s t ä + k ä ä n n ö k s e t + k ä ä n n ö k s i s s ä + k ä ä n n ö k s i s t ä + k ä ä n n ö s a i k o j e n + k ä ä n n ö s a i n e i s t o a m m e + k ä ä n n ö s j ä r j e s t e l m i i n + k ä ä n n ö s j ä r j e s t e l m ä n + k ä ä n n ö s j ä r j e s t e l m ä ä + k ä ä n n ö s j ä r j e s t e l y i h i n + k ä ä n n ö s j ä r j e s t e l y i s t ä + k ä ä n n ö s j ä r j e s t e l y ä + k ä ä n n ö s k a p a s i t e e t i n + k ä ä n n ö s k a p a s i t e e t t i a + k ä ä n n ö s k e s k u k s e n + k ä ä n n ö s k e s k u k s e s s a + k ä ä n n ö s k e s k u s + k ä ä n n ö s k e s k u s t a + k ä ä n n ö s k i k k a i l u i l l a + k ä ä n n ö s k u l u i s t a + k ä ä n n ö s k u l u j a + k ä ä n n ö s k u l u j e n + k ä ä n n ö s k u r s s i e n + k ä ä n n ö s k u s t a n n u k s e t + k ä ä n n ö s k u s t a n n u k s i a + k ä ä n n ö s k u s t a n n u k s i i n + k ä ä n n ö s k u s t a n n u k s i s t a + k ä ä n n ö s k u s t a n n u s t e n + k ä ä n n ö s m a f i a n + k ä ä n n ö s m e n o i s s a + k ä ä n n ö s m e n o j a + k ä ä n n ö s m u i s t i + k ä ä n n ö s o n g e l m a + k ä ä n n ö s o n g e l m a n + k ä ä n n ö s o n g e l m a s t a + k ä ä n n ö s o n g e l m i a + k ä ä n n ö s o s a s t o + k ä ä n n ö s o s a s t o a + k ä ä n n ö s p a k k o a + k ä ä n n ö s p a l k i n t o + k ä ä n n ö s p a l k k i o i d e n + k ä ä n n ö s p a l v e l u + k ä ä n n ö s p a l v e l u a + k ä ä n n ö s p a l v e l u i h i n + k ä ä n n ö s p a l v e l u i l l e + k ä ä n n ö s p a l v e l u i s s a + k ä ä n n ö s p a l v e l u i s t a + k ä ä n n ö s p a l v e l u j a + k ä ä n n ö s p a l v e l u j e n + k ä ä n n ö s p a l v e l u t + k ä ä n n ö s p e l l e i l y + k ä ä n n ö s r e s u r s s e j a + k ä ä n n ö s s e i k a s t a + k ä ä n n ö s t a r p e i d e n + k ä ä n n ö s t e n + k ä ä n n ö s t i e d e + k ä ä n n ö s t o i m i n n a s s a + k ä ä n n ö s t o i m i n t a a + k ä ä n n ö s t o i m i s t o s s a + k ä ä n n ö s t y ö + k ä ä n n ö s t y ö k a l u s t a + k ä ä n n ö s t y ö s t ä + k ä ä n n ö s v a a t i m u k s i a + k ä ä n n ö s v a a t i m u k s i s t a + k ä ä n n ö s v a a t i m u s t e n + k ä ä n n ö s v a i k e u k s i a + k ä ä n n ö s v a i k e u k s i s t a + k ä ä n n ö s v e l v o i t t e i t a + k ä ä n n ö s v e r s i o i t a + k ä ä n n ö s v i r h e + k ä ä n n ö s v i r h e e k s i + k ä ä n n ö s v i r h e e n + k ä ä n n ö s v i r h e e s e e n + k ä ä n n ö s v i r h e e s t ä + k ä ä n n ö s v i r h e i d e n + k ä ä n n ö s v i r h e i s t ä + k ä ä n n ö s v i r h e i t ä + k ä ä n n ö s v i r h e t t ä + k ä ä n n ö s y k s i k k ö + k ä ä n n ö s y k s i k k ö ö n + k ä ä n n ö s y k s i k ö i s s ä + k ä ä n n ö s y k s i k ö i t ä + k ä ä n n ö s y k s i k ö t + k ä ä n s i n + k ä ä n t e e n t e k e v i m p ä n ä + k ä ä n t e e n t e k e v ä + k ä ä n t e e n t e k e v ä ä + k ä ä n t e e s e e n + k ä ä n t e i s a g o n i s t i + k ä ä n t e i s a l k i o + k ä ä n t e i s f u n k t i o + k ä ä n t e i s k o p i o i j a e n t s y y m i + k ä ä n t e i s l u k u + k ä ä n t e i s n i m i p a l v e l u + k ä ä n t e i s o s m o o s i + k ä ä n t e i s s u u n n i t t e l u n + k ä ä n t e i s t i e d o s t o + k ä ä n t e i t ä + k ä ä n t y e s s ä ä n + k ä ä n t y m ä s s ä + k ä ä n t y m ä ä n + k ä ä n t y n e e t + k ä ä n t y y + k ä ä n t y ä + k ä ä n t ä e n + k ä ä n t ä e s s ä ä n + k ä ä n t ä i s i t t e + k ä ä n t ä j i e m m e + k ä ä n t ä j i e n + k ä ä n t ä j i e n p ä i v ä + k ä ä n t ä j ä r e k i s t e r i n + k ä ä n t ä j ä t + k ä ä n t ä m i s e e n + k ä ä n t ä m i s e k s i + k ä ä n t ä m i s r e s u r s s e j a + k ä ä n t ä m ä ä n + k ä ä n t ä n y t + k ä ä n t ä v ä + k ä ä n t ä ä + k ä ä n t ä ä k s e e n + k ä ä n t ä ä k s e m m e + k ä ä n t ö k o h t a + k ä ä n t ö p u o l e l l a + k ä ä n t ö p u o l e n a + k ä ä n t ö p u o l e n s a + k ä ä n t ö p u o l i + k ä ä n t ö p u o l i a + k ä ä n t ö p u o l t a + k ä ä n t ö p ö y t ä + k ä ä p i ö b u l l t e r r i e r i + k ä ä p i ö e l l i p s i g a l a k s i + k ä ä p i ö e s i k k o + k ä ä p i ö g a l a g o + k ä ä p i ö g a l a k s i + k ä ä p i ö h a m m a s k a r p p i + k ä ä p i ö h e d e l m ä l e p a k k o + k ä ä p i ö h e i s i m a t o + k ä ä p i ö h e v o s e n k e n k ä y ö k k ö + k ä ä p i ö h i i r i + k ä ä p i ö h o p e a t ä p l ä + k ä ä p i ö k a i m a a n i + k ä ä p i ö k e i j u + k ä ä p i ö k e r t t u + k ä ä p i ö k o i r a + k ä ä p i ö k o t i l o + k ä ä p i ö k r o k o t i i l i + k ä ä p i ö k y n s i s a m m a k k o + k ä ä p i ö l a u h a + k ä ä p i ö l e p a k k o + k ä ä p i ö l l e + k ä ä p i ö m a n g u s t i + k ä ä p i ö m i t t a r i + k ä ä p i ö n o v a + k ä ä p i ö n u o l i a i n e n + k ä ä p i ö p a j u + k ä ä p i ö p a l l o k a l a + k ä ä p i ö p i n s e r i + k ä ä p i ö p l a n e e t t a + k ä ä p i ö p o l i t i i k k a a + k ä ä p i ö p ä ä s t ä i n e n + k ä ä p i ö r i h m a k a l a + k ä ä p i ö s f e r o i d i g a l a k s i + k ä ä p i ö s i k a + k ä ä p i ö s n a u t s e r i + k ä ä p i ö s o r s a t + k ä ä p i ö s u p p u s u u + k ä ä p i ö t a p p a r a k a l a + k ä ä p i ö t y t ö n k o r e n t o + k ä ä p i ö t ä h t i + k ä ä p i ö v a l a s + k ä ä p i ö v a l o h a i + k ä ä p i ö v i r t a h e p o + k ä ä p i ö y l ä n k ö j u o k s i j a + k ä ä r e p a p e r i + k ä ä r e t o r t t u + k ä ä r i t t y j ä + k ä ä r i t t ä v ä n + k ä ä r i t ä ä n + k ä ä r m e e n k i e l i + k ä ä r m e e n l a u k k a + k ä ä r m e e n l u m o o j a + k ä ä r m e e n m y r k k y + k ä ä r m e e n p a l v o n t a + k ä ä r m e e n p i s t o n y r t t i + k ä ä r m e e n y r t t i + k ä ä r m e k a k t u s + k ä ä r m e k a m m i o + k ä ä r m e k a u l a + k ä ä r m e k o t k a + k ä ä r m e k u o p p a + k ä ä r m e s a a r i + k ä ä r m e t a l o + k ä ä r m e t ä h d e t + k ä ä r ö n i r k k o + k ö l i k ä ä r m e + k ö l i n + k ö l i p a l l o k a l a + k ö m p e l ö m p ä n ä + k ö m p e l ö m p ä ä + k ö n t t ä s u m m a n a + k ö n t t ä s u m m a v e r o + k ö n t t ä s u m m i i n + k ö n t t ä s u m m i n a + k ö y d e n v e d o n + k ö y d e n v e t o + k ö y d e n v e t o a + k ö y h d y t e t t y ä + k ö y h d y t e t y l l ä + k ö y h d y t e t y n + k ö y h d y t e t y s t ä + k ö y h d y t t ä i s i + k ö y h e m m i l l e + k ö y h e m m i s s ä + k ö y h e m m i s t ä + k ö y h e m m ä t + k ö y h e m p i e n + k ö y h e m p i n ä + k ö y h e m p i ä + k ö y h i e n + k ö y h i i n + k ö y h i k s i + k ö y h i l l e + k ö y h i l l ä + k ö y h i l t ä + k ö y h i m m i l l e + k ö y h i m m i l l ä + k ö y h i m m i l t ä + k ö y h i m m i s s ä + k ö y h i m m i s t ä + k ö y h i m m ä l l e + k ö y h i m m ä l l ä + k ö y h i m m ä n + k ö y h i m m ä s t ä + k ö y h i m m ä t + k ö y h i m p i e n + k ö y h i m p i i n + k ö y h i m p i ä + k ö y h i m p ä ä n + k ö y h i n t ä + k ö y h i n ä + k ö y h i s s ä + k ö y h i s t ä + k ö y h i ä + k ö y h i ä k i n + k ö y h t y i v ä t + k ö y h t y m i n e n + k ö y h t y m i s e e n + k ö y h t y m i s e n + k ö y h t y m i s o h j e l m a + k ö y h t y m i s t ä + k ö y h t y m ä s s ä + k ö y h t y v i e n + k ö y h t y v ä t + k ö y h t y y + k ö y h t y ä + k ö y h y y d e l l e + k ö y h y y d e l l ä + k ö y h y y d e n + k ö y h y y d e n p o i s t a m i s o h j e l m i i n + k ö y h y y d e n t o r j u n t a + k ö y h y y d e n t o r j u n t a a + k ö y h y y d e n t o r j u n t a f o o r u m i + k ö y h y y d e n t o r j u n t a f o o r u m i i n + k ö y h y y d e n t o r j u n t a f o o r u m i k s i + k ö y h y y d e n t o r j u n t a f o o r u m i n + k ö y h y y d e n t o r j u n t a f o o r u m i s t a + k ö y h y y d e n t o r j u n t a p o l i t i i k a n + k ö y h y y d e n t o r j u n t a s t r a t e g i a a + k ö y h y y d e n t o r j u n t a s t r a t e g i o i d e n + k ö y h y y d e n v a s t a i n e n + k ö y h y y d e n v a s t a i s e e n + k ö y h y y d e n v a s t a i s e s t a + k ö y h y y d e n v ä h e n t ä m i s t o i m e t + k ö y h y y d e n v ä h e n t ä m i s t ä + k ö y h y y d e s s ä + k ö y h y y d e s t ä + k ö y h y y s a a l t o i h i n + k ö y h y y s a s t e + k ö y h y y s a s t e t t a + k ö y h y y s i n d e k s i + k ö y h y y s i n d e k s i ä + k ö y h y y s i n d i k a a t t o r e i t a + k ö y h y y s i n d i k a a t t o r i + k ö y h y y s i n d i k a a t t o r i e n + k ö y h y y s i n d i k a a t t o r i i n + k ö y h y y s k e s k i t t y m i ä + k ö y h y y s k e t j u + k ö y h y y s k i e r t e e n + k ö y h y y s k i l p a i l u n + k ö y h y y s k u i l u n + k ö y h y y s k y s y m y k s i ä + k ö y h y y s l o u k k u + k ö y h y y s l o u k k u a + k ö y h y y s l o u k k u u n + k ö y h y y s l o u k u n + k ö y h y y s l o u k u s s a + k ö y h y y s l o u k u s t a + k ö y h y y s l o u k u s t a a n + k ö y h y y s l u k u j a + k ö y h y y s l u k u j a a n + k ö y h y y s n o r m i + k ö y h y y s n o r m i s t a + k ö y h y y s o h j e l m a s t a + k ö y h y y s o h j e l m i i n + k ö y h y y s o h j e l m i s s a + k ö y h y y s o n g e l m a + k ö y h y y s o n g e l m a a + k ö y h y y s o n g e l m a n + k ö y h y y s o n g e l m a t + k ö y h y y s o n g e l m i a + k ö y h y y s o n g e l m i e n + k ö y h y y s p e s ä k k e i d e n + k ö y h y y s p e s ä k k e i s i i n + k ö y h y y s p e s ä k k e i t ä + k ö y h y y s r a h a s t o n + k ö y h y y s r a j a + k ö y h y y s r a j a a + k ö y h y y s r a j a l l a + k ö y h y y s r a j a n + k ö y h y y s r a j a n a + k ö y h y y s r a j a t + k ö y h y y s r a j o j a + k ö y h y y s r a j o j e n + k ö y h y y s r i k o s + k ö y h y y s r i s k i + k ö y h y y s r i s k i l l e + k ö y h y y s r i s k i l t ä + k ö y h y y s r i s k i n + k ö y h y y s r i s k i n s ä + k ö y h y y s r i s k i r a j a + k ö y h y y s r i s k i s s ä + k ö y h y y s r i s k i s t ä + k ö y h y y s r i s k i ä + k ö y h y y s s a a r e k k e i d e n + k ö y h y y s s t r a t e g i a + k ö y h y y s s t r a t e g i a n + k ö y h y y s s t r a t e g i o i k s i + k ö y h y y s t a s o + k ö y h y y s t a s o a + k ö y h y y s t a s o i h i n + k ö y h y y s t a s o n + k ö y h y y s t a s o o n + k ö y h y y s u h k a + k ö y h y y s v a a r a s s a + k ö y h y y s v y ö h y k e + k ö y h y y s v y ö h y k k e i d e n + k ö y h y y t e e n + k ö y h y y t t ä + k ö y h y y t t ä ä n + k ö y h ä l l e + k ö y h ä n + k ö y h ä t + k ö y h ä ä + k ö y h ä ä n + k ö y n n ö s h o r t e n s i a + k ö y n n ö s k o i s o + k ö y s i k i i p e i l y + k ö y s i r a t a + k ö y s i r a t a a + k ö y s i r a t a l a i t t e i s t o i s t a + k ö y s i r a t a l a i t t e i s t o j a + k ö y s i r a t a l a i t t e i s t o j e n + k ö y s i r a t a t a l o u d e n + k ö y s i r a t a y r i t y k s e s s ä + k ö y s i r a t o j a + k ö y s i r a t o j e n + k ö y t t ä + l a a d i m m e + l a a d i m m e k o + l a a d i n + l a a d i n n a s s a + l a a d i n n a s t a + l a a d i n t a a n + l a a d i n t a m e n e t e l m ä n + l a a d i n t a m e n e t e l m ä ä + l a a d i n t a m e n e t t e l y s t ä + l a a d i n t a p r o s e s s i + l a a d i n t a p r o s e s s i a + l a a d i n t a p r o s e s s i s s a + l a a d i n t a p r o s e s s i s t a + l a a d i n t a v a i h e e s s a + l a a d i n t a v i r h e e n + l a a d i t a a n + l a a d i t t a e s s a + l a a d i t t a v a + l a a d i t t a v a n + l a a d i t t a v a t + l a a d i t t a v i s s a + l a a d i t t a v i s t a + l a a d i t t i i n + l a a d i t t u + l a a d i t t u a + l a a d i t t u a a n + l a a d i t t u j a + l a a d i t t u j e n + l a a d i t u l l e + l a a d i t u n + l a a d i t u s s a + l a a d i t u t + l a a d u k a s t a + l a a d u k k a a l l a + l a a d u k k a a l l e + l a a d u k k a a m m a k s i + l a a d u k k a a m m a l l a + l a a d u k k a a m m a n + l a a d u k k a a m m a t + l a a d u k k a a m m i l l a + l a a d u k k a a m m i n + l a a d u k k a a m m i s t a + l a a d u k k a a m p a a + l a a d u k k a a m p a a n + l a a d u k k a a m p i + l a a d u k k a a m p i a + l a a d u k k a a m p i e n + l a a d u k k a a m p i i n + l a a d u k k a a m p i n a + l a a d u k k a a n + l a a d u k k a a s e e n + l a a d u k k a a s s a + l a a d u k k a a s t a + l a a d u k k a a t + l a a d u k k a i d e n + l a a d u k k a i l l a + l a a d u k k a i l l e + l a a d u k k a i l t a + l a a d u k k a i m m a t + l a a d u k k a i m p i a + l a a d u k k a i n a + l a a d u k k a i s i i n + l a a d u k k a i s s a + l a a d u k k a i s t a + l a a d u k k a i t a + l a a d u k k u u d e n + l a a d u k k u u d e s t a + l a a d u l l a + l a a d u l l i s e e n + l a a d u l l i s e m p i + l a a d u l l i s e s t i k i n + l a a d u l l i s e t + l a a d u l l i s i a + l a a d u l l i s i i n + l a a d u l l i s t e n + l a a d u l t a a n + l a a d u n + l a a d u n a r v i o i n n i s s a + l a a d u n a r v i o i n n i s t a + l a a d u n a r v i o i n t i + l a a d u n a r v i o i n t i j ä r j e s t e l m i ä + l a a d u n a r v i o i n t i j ä r j e s t e l m ä + l a a d u n a r v i o i n t i j ä r j e s t e l m ä t + l a a d u n a r v i o i n t i k e h i t y k s e e n + l a a d u n a r v i o i n t i o h j e l m a + l a a d u n a r v i o i n t i v e r k o s t o a + l a a d u n a r v i o i n t i v e r k o s t o n + l a a d u n h a l l i n t a j ä r j e s t e l m ä + l a a d u n m ä ä r i t y s p ä ä m ä ä r ä n + l a a d u n p a r a n n u k s i a + l a a d u n p a r a n n u s k a m p a n j a a n + l a a d u n p a r a n n u s o h j e l m i e n + l a a d u n p a r a n n u s t o i m i a + l a a d u n p a r a n t a m i s e e n + l a a d u n s u o j e l u j ä r j e s t e l m i e n + l a a d u n s u o j e l u j ä r j e s t e l m ä s t ä + l a a d u n t a k a a m i n e n + l a a d u n t a k a a m i s e s t a + l a a d u n t a r k k a i l u + l a a d u n t a r k k a i l u a + l a a d u n t a r k k a i l u p o l i t i i k k a a + l a a d u n t a r k k a i l u s s a + l a a d u n v a l v o j i k s i + l a a d u n v a l v o n n a l l a + l a a d u n v a l v o n n a l l e + l a a d u n v a l v o n n a n + l a a d u n v a l v o n n a s t a + l a a d u n v a l v o n t a a + l a a d u n v a l v o n t a a n + l a a d u n v a l v o n t a e l i m e n + l a a d u n v a l v o n t a e l i n + l a a d u n v a l v o n t a j ä r j e s t e l m i ä + l a a d u n v a l v o n t a j ä r j e s t e l m ä + l a a d u n v a l v o n t a m e k a n i s m e i n e e n + l a a d u n v a l v o n t a m e k a n i s m i + l a a d u n v a l v o n t a m e n e t e l m i ä + l a a d u n v a l v o n t a t e s t i n + l a a d u n v a l v o n t a t i e t o j e n + l a a d u n v a r m i s t u k s e e n + l a a d u n v a r m i s t u k s e n + l a a d u n v a r m i s t u k s e s t a + l a a d u n v a r m i s t u k s i i n + l a a d u n v a r m i s t u s + l a a d u n v a r m i s t u s e l i n t e n + l a a d u n v a r m i s t u s j ä r j e s t e l m i e n + l a a d u n v a r m i s t u s j ä r j e s t e l m i i n + l a a d u n v a r m i s t u s j ä r j e s t e l m i l l e + l a a d u n v a r m i s t u s j ä r j e s t e l m i s t ä + l a a d u n v a r m i s t u s j ä r j e s t e l m i ä + l a a d u n v a r m i s t u s j ä r j e s t e l m i ä ä n + l a a d u n v a r m i s t u s j ä r j e s t e l m ä n + l a a d u n v a r m i s t u s j ä r j e s t e l m ä n s ä + l a a d u n v a r m i s t u s m e k a n i s m e j a + l a a d u n v a r m i s t u s m e k a n i s m i t + l a a d u n v a r m i s t u s o h j e l m i e n + l a a d u n v a r m i s t u s s t a n d a r d e j a + l a a d u n v a r m i s t u s t a + l a a d u n v a r m i s t u s t a r k a s t u k s i a + l a a d u n v a r m i s t u s v e r k o s t o n + l a a d u n v a r m i s t u s v e r k o s t o o n + l a a d u s s a + l a a d u s t a + l a a d u s t a a n + l a a h u s a n k k u r i + l a a h u s p i i s p a + l a a h u s t y r a n n i + l a a j a a + l a a j a a n + l a a j a k a i s t a a + l a a j a k a i s t a h a n k k e e t + l a a j a k a i s t a h a n k k e i d e n + l a a j a k a i s t a i n e n + l a a j a k a i s t a i n f r a s t r u k t u u r e i h i n + l a a j a k a i s t a i n f r a s t r u k t u u r i a + l a a j a k a i s t a i n f r a s t r u k t u u r i i n + l a a j a k a i s t a i n f r a s t r u k t u u r i l l a + l a a j a k a i s t a i n f r a s t r u k t u u r i n + l a a j a k a i s t a i n t e r n e t + l a a j a k a i s t a i n t e r n e t i i n + l a a j a k a i s t a i n t e r n e t i n + l a a j a k a i s t a i n t e r n e t i ä + l a a j a k a i s t a i n v e s t o i n t e i h i n + l a a j a k a i s t a i s e n + l a a j a k a i s t a j ä r j e s t e l m i s s ä + l a a j a k a i s t a k a p a s i t e e t i n + l a a j a k a i s t a k a p a s i t e e t t i + l a a j a k a i s t a k a t t a v u u s + l a a j a k a i s t a k a t t a v u u t t a + l a a j a k a i s t a k y s y n t ä ä n + l a a j a k a i s t a m a k s u t + l a a j a k a i s t a m a r k k i n o i l l a + l a a j a k a i s t a n + l a a j a k a i s t a p a l v e l u i l l e + l a a j a k a i s t a p a l v e l u i s s a + l a a j a k a i s t a p a l v e l u i t a + l a a j a k a i s t a p a l v e l u j a + l a a j a k a i s t a p a l v e l u j e n + l a a j a k a i s t a p a l v e l u t + l a a j a k a i s t a p o l i t i i k a l l a + l a a j a k a i s t a s t r a t e g i a + l a a j a k a i s t a s t r a t e g i o i t a + l a a j a k a i s t a t + l a a j a k a i s t a t e k n i i k a n + l a a j a k a i s t a t e k n i i k k a + l a a j a k a i s t a t e k n o l o g i o i d e n + l a a j a k a i s t a t o i m i i n + l a a j a k a i s t a t u k i + l a a j a k a i s t a v a l m i u d e t + l a a j a k a i s t a v a l m i u k s i a + l a a j a k a i s t a v e r k k o h a n k k e i t a + l a a j a k a i s t a v e r k k o i h i n + l a a j a k a i s t a v e r k k o j a + l a a j a k a i s t a v e r k k o j e n + l a a j a k a i s t a v e r k k o o n + l a a j a k a i s t a v e r k o n + l a a j a k a i s t a v e r k o s t o j a + l a a j a k a i s t a v e r k o t + l a a j a k a i s t a v i e s t i n n ä l l e + l a a j a k a i s t a v i e s t i n n ä n + l a a j a k a i s t a v i e s t i n t ä a l a n + l a a j a k a i s t a v i e s t i n t ä p a l v e l u t + l a a j a k a i s t a v i e s t i n t ä ä + l a a j a k a i s t a y h t e y d e n + l a a j a k a i s t a y h t e y d e t + l a a j a k a i s t a y h t e y k s i e n + l a a j a k a i s t a y h t e y k s i i n + l a a j a k a i s t a y h t e y k s i ä + l a a j a k a i s t a y h t e y s + l a a j a k a i s t a y h t e y s h a n k k e i s t a + l a a j a k a i s t a y h t e y t t ä + l a a j a k a n t o i n e n + l a a j a k a n t o i s e e n + l a a j a k a n t o i s e m m a n + l a a j a k a n t o i s e m m a s t a + l a a j a k a n t o i s e m p i + l a a j a k a n t o i s e m p i a + l a a j a k a n t o i s e n + l a a j a k a n t o i s e s t a + l a a j a k a n t o i s e s t i + l a a j a k a n t o i s e t + l a a j a k a n t o i s i a + l a a j a k a n t o i s i m m i n + l a a j a k a n t o i s i s s a + l a a j a k a n t o i s t e n + l a a j a k a n t o i s u u t e e n + l a a j a k a t s e i s e m p i a + l a a j a k a t s e i s i m p i a + l a a j a k a t s e i s u u s + l a a j a k s i + l a a j a k u l m a o b j e k t i i v i + l a a j a k u l m a p e i l i ä + l a a j a k u v a m u o d o l l e + l a a j a l l a + l a a j a l l e + l a a j a l t a + l a a j a m i t t a i n e n + l a a j a m i t t a i s e e n + l a a j a m i t t a i s e k s i + l a a j a m i t t a i s e l l a + l a a j a m i t t a i s e l l e + l a a j a m i t t a i s e m p a a + l a a j a m i t t a i s e m p i i n + l a a j a m i t t a i s e n + l a a j a m i t t a i s e n a + l a a j a m i t t a i s e s s a + l a a j a m i t t a i s e s t a + l a a j a m i t t a i s e s t i + l a a j a m i t t a i s e t + l a a j a m i t t a i s i a + l a a j a m i t t a i s i i n + l a a j a m i t t a i s i l l a + l a a j a m i t t a i s i l l e + l a a j a m i t t a i s i l t a + l a a j a m i t t a i s i m p a a n + l a a j a m i t t a i s i s s a + l a a j a m i t t a i s i s t a + l a a j a m i t t a i s t a + l a a j a m i t t a i s t e n + l a a j a n + l a a j a n a + l a a j a p e r ä i n e n + l a a j a p e r ä i s e m m ä n + l a a j a p e r ä i s e m p ä ä + l a a j a p e r ä i s t ä m i s e s t ä + l a a j a p e r ä i s t ä m i s p a l k k i o i d e n + l a a j a p e r ä i s t ä m i s p a l k k i o i t a + l a a j a p e r ä i s t ä m i s p a l k k i o t a + l a a j a p o h j a i n e n + l a a j a p o h j a i s e l l a + l a a j a p o h j a i s e l l e + l a a j a p o h j a i s e m p a a + l a a j a p o h j a i s e n + l a a j a p o h j a i s e s s a + l a a j a p o h j a i s e s t a + l a a j a p o h j a i s e s t i + l a a j a p o h j a i s e t + l a a j a p o h j a i s i a + l a a j a p o h j a i s i s t a + l a a j a p o h j a i s t a + l a a j a p o h j a i s u u s + l a a j a r u n k o k o n e + l a a j a s s a + l a a j a s t a + l a a j a t + l a a j a v a i k u t t e i s t e n + l a a j a v e r k k o + l a a j e m m a k s i + l a a j e m m a l l a + l a a j e m m a l l a k i n + l a a j e m m a l l e + l a a j e m m a l t a + l a a j e m m a n + l a a j e m m a s s a + l a a j e m m a s t a + l a a j e m m a t + l a a j e m m i l l a k i n + l a a j e m m i n + l a a j e m m i n k a a n + l a a j e m m i n k i n + l a a j e m m i s s a + l a a j e m m i s t a + l a a j e m p a a + l a a j e m p a a n + l a a j e m p a a n k i n + l a a j e m p a n a + l a a j e m p i + l a a j e m p i a + l a a j e m p i e n + l a a j e m p i i n + l a a j e m p i k i n + l a a j e n e e + l a a j e n e m i s e l l a + l a a j e n e m i s e n + l a a j e n e m i s e s t a + l a a j e n e m i s h e t k e l l ä + l a a j e n e m i s k y s y m y s + l a a j e n e m i s k y v y n + l a a j e n e m i s m a h d o l l i s u u d e t + l a a j e n e m i s m a h d o l l i s u u k s i a + l a a j e n e m i s n e u v o t t e l u i h i n + l a a j e n e m i s n e u v o t t e l u i l l e + l a a j e n e m i s n e u v o t t e l u j e n + l a a j e n e m i s n e u v o t t e l u t + l a a j e n e m i s p e r u s t e e t + l a a j e n e m i s p o l i t i i k a n + l a a j e n e m i s p r o s e s s i + l a a j e n e m i s p r o s e s s i a + l a a j e n e m i s p r o s e s s i i n + l a a j e n e m i s p r o s e s s i n + l a a j e n e m i s p r o s e s s i s s a + l a a j e n e m i s p y r k i m y k s e n + l a a j e n e m i s s t r a t e g i a a + l a a j e n e m i s s t r a t e g i a n + l a a j e n e m i s t a + l a a j e n e m i s t a r p e i s i i n + l a a j e n e m i s t a v o i t t e i d e n + l a a j e n e m i s t o i m e t + l a a j e n e m i s t y ö t ä + l a a j e n n e t a + l a a j e n n e t a a n + l a a j e n n e t t a e s s a + l a a j e n n e t t a i s i i n + l a a j e n n e t t a v a + l a a j e n n e t t a v a k s i + l a a j e n n e t t i i n + l a a j e n n e t t u a + l a a j e n n e t t u j e n + l a a j e n n e t t u u n + l a a j e n n e t u s s a + l a a j e n n u s h a n k k e e s e e n + l a a j e n n u s k e s k u s t e l u + l a a j e n n u s k o r t t i + l a a j e n n u s n e u v o t t e l u i s s a + l a a j e n n u s n e u v o t t e l u j a + l a a j e n n u s p r o s e s s i n + l a a j e n n u s p r o s e s s i s t a + l a a j e n n u s s u u n n i t e l m i a + l a a j e n n u s t a + l a a j e n n u s t a r k o i t u k s i i n + l a a j e n n u s v a i h e + l a a j e n n u s v a i h e t t a + l a a j e n n u s v a r a u s + l a a j e n n u t t a v a + l a a j e n n u t t u a + l a a j e n s i + l a a j e n t a a + l a a j e n t a a k s e e n + l a a j e n t a a k s e m m e + l a a j e n t a i s i n + l a a j e n t a k a a m m e + l a a j e n t a m a a n + l a a j e n t a m a l l a + l a a j e n t a m a t t a + l a a j e n t a m i s e e n + l a a j e n t a m i s e k s i + l a a j e n t a m i s e l l e + l a a j e n t a m i s e n + l a a j e n t a m i s e s t a + l a a j e n t a m i s m a h d o l l i s u u k s i a + l a a j e n t a m i s m e n e t e l m i s t ä + l a a j e n t a m i s o h j e l m a a n + l a a j e n t a m i s p a i n e e n + l a a j e n t a m i s p o l i t i i k k a a + l a a j e n t a m i s p r o s e s s i n + l a a j e n t a m i s p y r k i m y s t e n + l a a j e n t a m i s s u u n n i t e l m i a + l a a j e n t a m i s t a + l a a j e n t a m i s t e h t ä v ä + l a a j e n t a n e e t + l a a j e n t a v a t + l a a j e n t u a + l a a j e n t u e s s a + l a a j e n t u e s s a a n + l a a j e n t u m a l l a + l a a j e n t u m a s s a + l a a j e n t u m i s a a l l o n + l a a j e n t u m i s a a l l o s t a + l a a j e n t u m i s a a l t o + l a a j e n t u m i s a a l t o a + l a a j e n t u m i s a g e n d a + l a a j e n t u m i s a i h e e n + l a a j e n t u m i s a i h e e s t a + l a a j e n t u m i s a i k a t a u l u n + l a a j e n t u m i s a i k a t a u l u s s a + l a a j e n t u m i s a i k a t a u l u s s a a n + l a a j e n t u m i s a i k a t a u l u u n + l a a j e n t u m i s a l u e e k s i + l a a j e n t u m i s a s i a a + l a a j e n t u m i s a s i a a n + l a a j e n t u m i s a s i a s s a + l a a j e n t u m i s a s i a s t a + l a a j e n t u m i s a s i o i d e n + l a a j e n t u m i s a s i o i h i n + l a a j e n t u m i s a s i o i s s a + l a a j e n t u m i s a s i o i s t a + l a a j e n t u m i s b u d j e t t i + l a a j e n t u m i s b u d j e t t i a + l a a j e n t u m i s e d e l l y t y k s i l l e + l a a j e n t u m i s e d e l l y t y k s i ä + l a a j e n t u m i s e e n + l a a j e n t u m i s e l l a + l a a j e n t u m i s e l l e + l a a j e n t u m i s e n + l a a j e n t u m i s e s s a + l a a j e n t u m i s e s t a + l a a j e n t u m i s e s t a k a a n + l a a j e n t u m i s e t + l a a j e n t u m i s h a a s t e + l a a j e n t u m i s h a n k e + l a a j e n t u m i s h a n k e t t a + l a a j e n t u m i s h a n k k e e l l e + l a a j e n t u m i s h a n k k e e n + l a a j e n t u m i s h a n k k e e s e e n + l a a j e n t u m i s h a n k k e e s s a + l a a j e n t u m i s h a n k k e e s t a + l a a j e n t u m i s h i s t o r i a n + l a a j e n t u m i s i a + l a a j e n t u m i s i d e a l i s m i + l a a j e n t u m i s i i n + l a a j e n t u m i s i l l e + l a a j e n t u m i s i n n o n + l a a j e n t u m i s i n v e s t o i n t e j a + l a a j e n t u m i s i s s a + l a a j e n t u m i s j u h l a l l i s u u k s i s s a + l a a j e n t u m i s j u l i s t u k s e t + l a a j e n t u m i s k a m p a n j a a n + l a a j e n t u m i s k a m p a n j a n + l a a j e n t u m i s k e h i t y k s e l l e + l a a j e n t u m i s k e h i t y k s e m m e + l a a j e n t u m i s k e h i t y k s e n + l a a j e n t u m i s k e h i t y k s e s s ä + l a a j e n t u m i s k e h i t y k s e s t ä + l a a j e n t u m i s k e h i t y s + l a a j e n t u m i s k e h i t y s t ä + l a a j e n t u m i s k e l p o i n e n + l a a j e n t u m i s k e l p o i s e k s i + l a a j e n t u m i s k e l p o i s i k s i + l a a j e n t u m i s k e s k u s t e l u + l a a j e n t u m i s k e s k u s t e l u a + l a a j e n t u m i s k e s k u s t e l u i h i m m e + l a a j e n t u m i s k e s k u s t e l u i s s a + l a a j e n t u m i s k e s k u s t e l u n + l a a j e n t u m i s k e s k u s t e l u s s a + l a a j e n t u m i s k e s k u s t e l u u n + l a a j e n t u m i s k i e r r o k s e e n + l a a j e n t u m i s k i e r r o k s e l l a + l a a j e n t u m i s k i e r r o k s e l l e + l a a j e n t u m i s k i e r r o k s e n + l a a j e n t u m i s k i e r r o k s e s t a + l a a j e n t u m i s k i e r r o k s e t + l a a j e n t u m i s k i e r r o k s i l l a + l a a j e n t u m i s k i e r r o k s i s t a + l a a j e n t u m i s k i e r r o s + l a a j e n t u m i s k i e r r o s t a + l a a j e n t u m i s k i e r r o s t e n + l a a j e n t u m i s k i e r t e e s e e n + l a a j e n t u m i s k o k e m u k s e t + l a a j e n t u m i s k o m i s s i o n + l a a j e n t u m i s k r i t e e r e i h i n + l a a j e n t u m i s k r i t e e r e i s t ä + l a a j e n t u m i s k r i t e e r i e n + l a a j e n t u m i s k r i t e e r i k s i + l a a j e n t u m i s k r i t e e r i ä + l a a j e n t u m i s k u l u j e n + l a a j e n t u m i s k u l u t + l a a j e n t u m i s k u m p p a n u u d e n + l a a j e n t u m i s k u n n o s s a + l a a j e n t u m i s k u s t a n n u k s e t + l a a j e n t u m i s k u s t a n n u k s i a + l a a j e n t u m i s k u s t a n n u k s i s t a + l a a j e n t u m i s k u s t a n n u s t e n + l a a j e n t u m i s k u u m e e k s i + l a a j e n t u m i s k u u m e e n + l a a j e n t u m i s k y k y i n e n + l a a j e n t u m i s k y k y i s e k s i + l a a j e n t u m i s k y k y i s e n + l a a j e n t u m i s k y k y i s i ä + l a a j e n t u m i s k y s y m y k s e e n + l a a j e n t u m i s k y s y m y k s e n + l a a j e n t u m i s k y s y m y k s e s s ä + l a a j e n t u m i s k y s y m y k s e s t ä + l a a j e n t u m i s k y s y m y k s i s t ä + l a a j e n t u m i s k y s y m y k s i ä + l a a j e n t u m i s k y s y m y s + l a a j e n t u m i s k y s y m y s t e n + l a a j e n t u m i s k y s y m y s t ä + l a a j e n t u m i s l u p a u k s e n s a + l a a j e n t u m i s m a h d o l l i s u u d e t + l a a j e n t u m i s m a h d o l l i s u u k s i a + l a a j e n t u m i s m a h d o l l i s u u k s i s t a + l a a j e n t u m i s m a h d o l l i s u u s + l a a j e n t u m i s m a i d e n + l a a j e n t u m i s m a i l l e + l a a j e n t u m i s m a i s s a + l a a j e n t u m i s m e n e t t e l y + l a a j e n t u m i s m e n e t t e l y n + l a a j e n t u m i s m e n e t t e l y s s ä + l a a j e n t u m i s m e n e t t e l y s t ä n n e + l a a j e n t u m i s m e n e t t e l y y n + l a a j e n t u m i s m e n e t t e l y ä + l a a j e n t u m i s m e n o j a + l a a j e n t u m i s m i e t i n n ö i s t ä + l a a j e n t u m i s m y ö n t e i s i m m i s t ä + l a a j e n t u m i s m y ö n t e i s i m m ä t + l a a j e n t u m i s n e u v o t t e l u a + l a a j e n t u m i s n e u v o t t e l u i d e n + l a a j e n t u m i s n e u v o t t e l u i h i n + l a a j e n t u m i s n e u v o t t e l u i l l e + l a a j e n t u m i s n e u v o t t e l u i s s a + l a a j e n t u m i s n e u v o t t e l u i s t a + l a a j e n t u m i s n e u v o t t e l u i t a + l a a j e n t u m i s n e u v o t t e l u j a + l a a j e n t u m i s n e u v o t t e l u j a m m e + l a a j e n t u m i s n e u v o t t e l u j e n + l a a j e n t u m i s n e u v o t t e l u t + l a a j e n t u m i s n ä k y m i e n + l a a j e n t u m i s n ä k y m i i n + l a a j e n t u m i s n ä k y m i l l ä + l a a j e n t u m i s n ä k y m i s t ä + l a a j e n t u m i s n ä k y m ä + l a a j e n t u m i s n ä k y m ä n + l a a j e n t u m i s n ä k ö a l o i s t a + l a a j e n t u m i s n ä k ö k o h t a a n + l a a j e n t u m i s n ä k ö k u l m a s t a + l a a j e n t u m i s o h j e l m a + l a a j e n t u m i s o h j e l m a a + l a a j e n t u m i s o h j e l m a a n + l a a j e n t u m i s o h j e l m a m m e + l a a j e n t u m i s o h j e l m a n + l a a j e n t u m i s o h j e l m a s s a a n + l a a j e n t u m i s o s i n k o j a + l a a j e n t u m i s p a k e t i n + l a a j e n t u m i s p a k e t i s s a + l a a j e n t u m i s p a k e t t i + l a a j e n t u m i s p a k e t t i a + l a a j e n t u m i s p a k e t t i a m m e + l a a j e n t u m i s p e r i a a t e t t a + l a a j e n t u m i s p o l i t i i k a l l a + l a a j e n t u m i s p o l i t i i k a l l e + l a a j e n t u m i s p o l i t i i k a n + l a a j e n t u m i s p o l i t i i k a s s a + l a a j e n t u m i s p o l i t i i k a s t a + l a a j e n t u m i s p o l i t i i k k a + l a a j e n t u m i s p o l i t i i k k a a + l a a j e n t u m i s p o l i t i i k k a a m m e + l a a j e n t u m i s p o l i t i i k k a a n + l a a j e n t u m i s p o l i t i i k k a a n s a + l a a j e n t u m i s p o l i t i i k k a m m e + l a a j e n t u m i s p o n n i s t e l u i l l e + l a a j e n t u m i s p r o j e k t i + l a a j e n t u m i s p r o j e k t i n + l a a j e n t u m i s p r o s e s s e i s t a + l a a j e n t u m i s p r o s e s s i a + l a a j e n t u m i s p r o s e s s i i n + l a a j e n t u m i s p r o s e s s i l l a + l a a j e n t u m i s p r o s e s s i l l e + l a a j e n t u m i s p r o s e s s i m m e + l a a j e n t u m i s p r o s e s s i n + l a a j e n t u m i s p r o s e s s i s s a + l a a j e n t u m i s p r o s e s s i s t a + l a a j e n t u m i s p r o s e s s i t + l a a j e n t u m i s p y r k i m y k s e t + l a a j e n t u m i s p y r k i m y k s i ä + l a a j e n t u m i s p y r k i m y s t e n + l a a j e n t u m i s p ä i v ä m ä ä r ä ä + l a a j e n t u m i s p ä ä t e l m i ä + l a a j e n t u m i s p ä ä t ö k s e s t ä + l a a j e n t u m i s p ä ä t ö s + l a a j e n t u m i s p ä ä t ö s t ä + l a a j e n t u m i s p ö y t ä k i r j a + l a a j e n t u m i s r a t k a i s u j e n + l a a j e n t u m i s s i t o u m u k s i a + l a a j e n t u m i s s o p i m u k s e l l a + l a a j e n t u m i s s o p i m u k s e n + l a a j e n t u m i s s o p i m u k s e n a + l a a j e n t u m i s s o p i m u k s e t + l a a j e n t u m i s s o p i m u k s i a + l a a j e n t u m i s s o p i m u k s i i n + l a a j e n t u m i s s o p i m u s t e n + l a a j e n t u m i s s t r a t e g i a + l a a j e n t u m i s s t r a t e g i a a + l a a j e n t u m i s s t r a t e g i a a m m e + l a a j e n t u m i s s t r a t e g i a a n + l a a j e n t u m i s s t r a t e g i a l l a + l a a j e n t u m i s s t r a t e g i a m m e + l a a j e n t u m i s s t r a t e g i a n + l a a j e n t u m i s s t r a t e g i a n s a + l a a j e n t u m i s s t r a t e g i a p a p e r i n + l a a j e n t u m i s s t r a t e g i a s s a m m e + l a a j e n t u m i s s t r a t e g i a s t a + l a a j e n t u m i s s t r a t e g i o i t a + l a a j e n t u m i s s u h t e e n + l a a j e n t u m i s s u u n n i t e l m a + l a a j e n t u m i s s u u n n i t e l m a a + l a a j e n t u m i s s u u n n i t e l m a a n + l a a j e n t u m i s s u u n n i t e l m a n + l a a j e n t u m i s s u u n n i t e l m a t + l a a j e n t u m i s s u u n n i t e l m i a + l a a j e n t u m i s s u u n n i t e l m i e n + l a a j e n t u m i s s u u n n i t e l m i i n s a + l a a j e n t u m i s t a + l a a j e n t u m i s t a k a a n + l a a j e n t u m i s t a r p e e t + l a a j e n t u m i s t a v o i t e + l a a j e n t u m i s t a v o i t t e e n + l a a j e n t u m i s t e h t ä v ä n + l a a j e n t u m i s t e n + l a a j e n t u m i s t o i v e i s i i n + l a a j e n t u m i s t y ö t ä + l a a j e n t u m i s u l o t t u v u u s + l a a j e n t u m i s v a i h e + l a a j e n t u m i s v a i h e e n + l a a j e n t u m i s v a i h e e s e e n + l a a j e n t u m i s v a i h e e s s a + l a a j e n t u m i s v a i h t o e h t o + l a a j e n t u m i s v a l m i s t e l u i h i n + l a a j e n t u m i s v a l m i s t e l u i s s a + l a a j e n t u m i s v a l m i s t e l u i s t a + l a a j e n t u m i s v a l m i s t e l u j a + l a a j e n t u m i s v a l m i s t e l u j e n + l a a j e n t u m i s v a l m i s t e l u t + l a a j e n t u m i s v a l m i u d e s t a + l a a j e n t u m i s v a l t i o i d e n + l a a j e n t u m i s v a u h t i + l a a j e n t u m i s v u o n n a + l a a j e n t u m i s v y ö r y + l a a j e n t u m i s v ä s y m y k s e n + l a a j e n t u m i s v ä s y m y k s e s t ä + l a a j e n t u m i s v ä s y m y s + l a a j e n t u m i s v ä s y m y s t ä + l a a j e n t u m i s y r i t y s t ä + l a a j e n t u n e e l l e + l a a j e n t u n e e n + l a a j e n t u n e e s e e n + l a a j e n t u n e e s s a + l a a j e n t u n e e s s a k i n + l a a j e n t u n e e s t a + l a a j e n t u n e e t + l a a j e n t u n u t k a a n + l a a j e n t u n u t t a + l a a j e n t u u + l a a j e n t u v a t + l a a j e n t u v i e n + l a a j i m m a l l a k a a n + l a a j i m m a n + l a a j i m m a s s a + l a a j i m m a s s a k a a n + l a a j i m m a s t a + l a a j i m m a t + l a a j i m m i n + l a a j i m m i s t a + l a a j i m p i a + l a a j i m p i i n + l a a j i n + l a a j i n t a + l a a j o i h i n + l a a j o i k s i + l a a j o i l l e + l a a j o i n + l a a j o i n a + l a a j o i s s a + l a a j o i s t a + l a a j o j a + l a a j o j e n + l a a j u i s e e n + l a a j u i s e l l e + l a a j u i s e n + l a a j u i s e n a + l a a j u i s e s s a + l a a j u i s e s t a + l a a j u i s e s t i + l a a j u i s e t + l a a j u i s i a + l a a j u i s i i n + l a a j u i s i n a + l a a j u i s i s s a + l a a j u i s i s t a + l a a j u i s t a + l a a j u i s t e n + l a a j u i s t e n k i n + l a a j u u d e l t a a n + l a a j u u d e n + l a a j u u d e s s a a n + l a a j u u d e s t a + l a a j u u t e e n s a + l a a j u u t e n s a + l a a j u u t t a + l a a k e r i h e i s i + l a a k e r i k i r s i k k a + l a a k e r i m e t s ä n + l a a k e r i n l e h t i + l a a k e r i n ä s i ä + l a a k e r i p u u + l a a k e r i p u u k s i + l a a k e r i s e p p e l e + l a a k i o b a s a l t i t + l a a k s o a + l a a k s o a l u e i s i i n + l a a k s o a r h o + l a a k s o n + l a a k s o n i + l a a n t u m a t t o m a n a + l a a n t u n e e t + l a a n t u n u t + l a a s t a r e i l l a + l a a s t a r i a + l a a s t a r i l l a + l a a s t a r i n + l a a s t a r i n a + l a a s t a r i p o l i t i i k k a + l a a s t a r i r a t k a i s u + l a a s t a r i s t a + l a a s t a r i t + l a a t i + l a a t i a + l a a t i a k s e e n + l a a t i e s s a + l a a t i e s s a a n + l a a t i e s s a m m e + l a a t i e s s a n i + l a a t i e s s a n n e + l a a t i i + l a a t i j a a + l a a t i j a n + l a a t i j a n s a + l a a t i j a r y h m ä ä + l a a t i j a t + l a a t i j o i l l e + l a a t i j o i s t a + l a a t i j o i t a + l a a t i k a a m m e + l a a t i k k o l e i j a + l a a t i k o i d e n + l a a t i k o i s s a + l a a t i m a + l a a t i m a a n + l a a t i m a l l a + l a a t i m a n + l a a t i m a n i + l a a t i m a n s a + l a a t i m a s s a + l a a t i m a s t a + l a a t i m a t t a + l a a t i m i n + l a a t i m i s e e n + l a a t i m i s e h d o t u s t a + l a a t i m i s e k s i + l a a t i m i s e l l e + l a a t i m i s e n + l a a t i m i s e n a + l a a t i m i s e s s a + l a a t i m i s e s t a + l a a t i m i s j ä r j e s t e l m ä n + l a a t i m i s k r i t e e r e j ä + l a a t i m i s m e n e t t e l y + l a a t i m i s m e n e t t e l y y n + l a a t i m i s p r o s e s s i + l a a t i m i s p r o s e s s i i n + l a a t i m i s p r o s e s s i n + l a a t i m i s p r o s e s s i s s a + l a a t i m i s p r o s e s s i s t a + l a a t i m i s r y h m ä + l a a t i m i s t a + l a a t i m i s v a i h e e s s a + l a a t i n e e t + l a a t i n u t + l a a t i s i + l a a t i s i m m e + l a a t i v a t + l a a t t a t e k t o n i i k k a + l a a t u a + l a a t u a a n + l a a t u a j a t t e l u u n + l a a t u a l o i t t e i t a + l a a t u a r v i o i n n i n + l a a t u a r v i o i n n i t + l a a t u a r v i o i n t i j ä r j e s t e l m ä + l a a t u a r v i o i t a + l a a t u a r v o j a + l a a t u a u t o j a + l a a t u d i r e k t i i v i i n + l a a t u e l i n t a r v i k k e i s i i n + l a a t u e l i n t a r v i k k e i s t a + l a a t u e l i n t a r v i k k e i t a + l a a t u e l o k u v i a + l a a t u e r o j a + l a a t u h a n k k e i t a + l a a t u h u n a j a a + l a a t u h u n a j a a n + l a a t u h u n a j a n + l a a t u h u n a j a s t a + l a a t u h y ö d y k k e i t ä + l a a t u i m a g o + l a a t u i n d e k s i ä + l a a t u i n d i k a a t t o r e i d e n + l a a t u i n d i k a a t t o r e i h i n + l a a t u i n d i k a a t t o r e i t a + l a a t u i n d i k a a t t o r i e n + l a a t u i n d i k a a t t o r i t + l a a t u i n v e s t o i n t i e n + l a a t u j o h t a m i n e n + l a a t u j ä r j e s t e l m i e n + l a a t u j ä r j e s t e l m i i n + l a a t u j ä r j e s t e l m i l l ä + l a a t u j ä r j e s t e l m i ä + l a a t u j ä r j e s t e l m ä + l a a t u j ä r j e s t e l m ä n + l a a t u j ä r j e s t e l m ä t + l a a t u j ä r j e s t e l m ä ä + l a a t u j ä r j e s t e l m ä ä n + l a a t u k e h y k s e n + l a a t u k e h y k s e s t ä + l a a t u k e s k e i s i ä + l a a t u k i e r t e e s e e n + l a a t u k i l p a i l u n + l a a t u k i r j a l l i s u u d e s t a + l a a t u k o u l u t u s t a + l a a t u k r i t e e r e i h i n + l a a t u k r i t e e r e i s s ä + l a a t u k r i t e e r e i s t ä + l a a t u k r i t e e r e i t ä + l a a t u k r i t e e r e j ä + l a a t u k r i t e e r i + l a a t u k r i t e e r i e n + l a a t u k r i t e e r i n + l a a t u k r i t e e r i t + l a a t u k u l j e t t a j i a + l a a t u k u l u i s t a + l a a t u k u v a + l a a t u k y s y m y k s e e n + l a a t u k y s y m y s t ä + l a a t u k ä s i t t e i t ä + l a a t u l a j i k k e i d e n + l a a t u l e h t i ä + l a a t u l e l u j a + l a a t u l i h a a + l a a t u l i h a n + l a a t u l i h a n a + l a a t u l i h a n v a l m i s t u s + l a a t u l u o k a n + l a a t u l u o k a s t a + l a a t u l u o k i t u k s e n + l a a t u l u o k i t u s + l a a t u l u o k k a + l a a t u l u o k k a a + l a a t u l u o k k a n s a + l a a t u m a a t a l o u s t u o t e + l a a t u m a i n i n n a l l a + l a a t u m a i n i n n a n + l a a t u m a i n i n t a + l a a t u m a r k k i n o i d e n + l a a t u m e r k e i s t ä + l a a t u m e r k i n + l a a t u m e r k i n n ä l l ä + l a a t u m e r k i n n ä n + l a a t u m e r k i n n ä s t ä + l a a t u m e r k i n n ä t + l a a t u m e r k i n n ö i s t ä + l a a t u m e r k i n t ä + l a a t u m e r k i n t ä j ä r j e s t e l m ä + l a a t u m e r k i n t ä j ä r j e s t e l m ä n + l a a t u m e r k i n t ä j ä r j e s t e l m ä s t ä + l a a t u m e r k i n t ä n ä + l a a t u m e r k i n t ä ä + l a a t u m e r k i n t ö j e n + l a a t u m e r k i n t ö j ä + l a a t u m e r k i s t ä + l a a t u m e r k i t + l a a t u m e r k k e j ä + l a a t u m e r k k i + l a a t u m e r k k i e n + l a a t u m e r k k i i n + l a a t u m e r k k i ä + l a a t u m ä ä r i t e l m ä l l ä + l a a t u m ä ä r i t t e l y s s ä + l a a t u n o r m e i h i n + l a a t u n o r m e i k s i + l a a t u n o r m e i l l a + l a a t u n o r m e i s t a + l a a t u n o r m e j a + l a a t u n o r m i + l a a t u n o r m i e n + l a a t u n o r m i n + l a a t u n o r m i s t a + l a a t u n o r m i t + l a a t u n s a + l a a t u n ä k ö k o h d a t + l a a t u n ä k ö k o h d i l l a + l a a t u n ä k ö k o h t i a + l a a t u n ä k ö k o h t i e n + l a a t u o d o t u k s e t + l a a t u o l o s u h t e i t a + l a a t u o m i n a i s u u k s i l l e + l a a t u o n g e l m a t + l a a t u o n g e l m i a + l a a t u o n g e l m i e n + l a a t u o n g e l m i i n + l a a t u p a k e t i n + l a a t u p a l k i n n o n + l a a t u p a l v e l u i h i n + l a a t u p a l v e l u j a + l a a t u p a l v e l u j e n + l a a t u p a r a m e t r e j ä + l a a t u p e r i a a t t e i t a + l a a t u p e r u s k i r j a + l a a t u p e r u s k i r j a a + l a a t u p e r u s k i r j a a n + l a a t u p e r u s k i r j a n + l a a t u p e r u s t e e s e e n + l a a t u p e r u s t e e t + l a a t u p e r u s t e i d e n + l a a t u p e r u s t e i t a + l a a t u p i i r i + l a a t u p o l i i t t i s e s t i + l a a t u p o l i t i i k a l l a + l a a t u p o l i t i i k a l l e + l a a t u p o l i t i i k a n + l a a t u p o l i t i i k a s s a + l a a t u p o l i t i i k a s t a + l a a t u p o l i t i i k k a + l a a t u p o l i t i i k k a a + l a a t u p o l i t i i k k a a n + l a a t u p o l i t i i k k a a n s a + l a a t u p o l i t i i k k a m m e + l a a t u r a v i n n o l l e + l a a t u s e i k k o j a + l a a t u s e l v i t y k s e n + l a a t u s e r t i f i k a a t t i e n + l a a t u s e r t i f i o i n n i n + l a a t u s e r t i f i o i n t i a + l a a t u s i n e t i n + l a a t u s i n e t t i n ä + l a a t u s p e s i f i k a a t i o i s t a + l a a t u s t a n d a r d e i h i n + l a a t u s t a n d a r d e i s s a + l a a t u s t a n d a r d e i s t a + l a a t u s t a n d a r d e j a + l a a t u s t a n d a r d e j a m m e + l a a t u s t a n d a r d i e n + l a a t u s t a n d a r d i e n s a + l a a t u s t a n d a r d i t + l a a t u s t r a t e g i a + l a a t u s t r a t e g i a a + l a a t u s t r a t e g i a a n + l a a t u s t r a t e g i a n + l a a t u s u h d e + l a a t u s u h t e e n + l a a t u s u k l a a n + l a a t u s u u n n i t e l m i a + l a a t u t a k e e t + l a a t u t a k e i t a + l a a t u t a k u i t a + l a a t u t a k u u + l a a t u t a k u u j ä r j e s t e l m ä ä + l a a t u t a k u u n + l a a t u t a k u u t i e d o t + l a a t u t a r k a s t u k s i a + l a a t u t a r k i s t u k s e t + l a a t u t a r k i s t u k s i a + l a a t u t a s o + l a a t u t a s o a + l a a t u t a s o j a + l a a t u t a s o l l a + l a a t u t a s o l l e + l a a t u t a s o n + l a a t u t a v o i t e t t a + l a a t u t a v o i t t e e t + l a a t u t a v o i t t e i d e n + l a a t u t a v o i t t e i s i i n + l a a t u t a v o i t t e i t a + l a a t u t e k i j ö i d e n + l a a t u t e s t a u s v a a t i m u k s e t + l a a t u t i e t o i n e n + l a a t u t i e t o i s e t + l a a t u t i l o j a + l a a t u t o d i s t u k s e n + l a a t u t o d i s t u s + l a a t u t o d i s t u s t a + l a a t u t o i m e t + l a a t u t u k e e n + l a a t u t u k i r y h m ä + l a a t u t u k i r y h m ä n s ä + l a a t u t u o t a n n o n + l a a t u t u o t a n n o s t a a n + l a a t u t u o t a n t o + l a a t u t u o t a n t o a + l a a t u t u o t a n t o o n + l a a t u t u o t e + l a a t u t u o t e t t a + l a a t u t u o t t e e l l e + l a a t u t u o t t e e m m e + l a a t u t u o t t e e n + l a a t u t u o t t e e n a + l a a t u t u o t t e e t + l a a t u t u o t t e i d e n + l a a t u t u o t t e i l l e + l a a t u t u o t t e i s i i n + l a a t u t u o t t e i t a + l a a t u t u o t t e i t a m m e + l a a t u t u o t t e i t t e m m e + l a a t u t u p a k a n + l a a t u t u r i s m i n + l a a t u t u t k i m u s t e n + l a a t u u n + l a a t u v a a t i m u k s e n + l a a t u v a a t i m u k s e n a + l a a t u v a a t i m u k s e n s a + l a a t u v a a t i m u k s e t + l a a t u v a a t i m u k s i a + l a a t u v a a t i m u k s i e n + l a a t u v a a t i m u k s i i n + l a a t u v a a t i m u k s i l l a + l a a t u v a a t i m u k s i n e e n + l a a t u v a a t i m u k s i s t a + l a a t u v a a t i m u k s i s t a a n + l a a t u v a a t i m u s t a + l a a t u v a a t i m u s t e n + l a a t u v a l v o n t a a + l a a t u v e r t a i l u t + l a a t u v i i n e i h i n + l a a t u v i i n e i k s i + l a a t u v i i n e i l l e + l a a t u v i i n e i s s ä + l a a t u v i i n e j ä + l a a t u v i i n e j ä ä n + l a a t u v i i n i + l a a t u v i i n i e n + l a a t u v i i n i n + l a a t u v i i n i t + l a a t u v i i n i ä + l a a t u ö l j y ä + l a a v a l a m p p u + l a a v a l e g u a a n i + l a a v a l o k k i + l a a v a r a s t a s + l a a v a t u n n e l i + l a a v a v i r r a n + l a b o r a n t t i y h d i s t y s + l a b o r a t o r i o a n a l y y s e j ä + l a b o r a t o r i o a s i a n t u n t i j o i d e n + l a b o r a t o r i o d i a g n o o s e i n e e n + l a b o r a t o r i o d i a g n o o s i t + l a b o r a t o r i o d i r e k t i i v i + l a b o r a t o r i o e l ä i m i l l ä + l a b o r a t o r i o e l ä i n t e n + l a b o r a t o r i o h e n k i l ö k u n t a a + l a b o r a t o r i o i d e n + l a b o r a t o r i o i l l e + l a b o r a t o r i o i n a + l a b o r a t o r i o i s s a + l a b o r a t o r i o i t a + l a b o r a t o r i o k e m i k a a l i e n + l a b o r a t o r i o k o k e e t + l a b o r a t o r i o k o k e i d e n + l a b o r a t o r i o k o k e i t a + l a b o r a t o r i o k u s t a n n u k s i i n + l a b o r a t o r i o l a i t t e i t a + l a b o r a t o r i o m e n e t e l m i e n + l a b o r a t o r i o m e n e t t e l y i t ä + l a b o r a t o r i o m o d u u l i + l a b o r a t o r i o n + l a b o r a t o r i o p o h j a i s t e n + l a b o r a t o r i o s o i j a a + l a b o r a t o r i o t a + l a b o r a t o r i o t e k n i i k k a a + l a b o r a t o r i o t e k n i k o t + l a b o r a t o r i o t e k n o l o g i a n + l a b o r a t o r i o t e s t e i h i n + l a b o r a t o r i o t e s t e i s s ä + l a b o r a t o r i o t e s t e j ä + l a b o r a t o r i o t e s t i e n + l a b o r a t o r i o t o i m i n n a n + l a b o r a t o r i o t o i m i n t a + l a b o r a t o r i o t o i m i n t a a + l a b o r a t o r i o t u t k i m u k s i l l a + l a b o r a t o r i o t u t k i m u s m e n e t e l m i e n + l a b o r a t o r i o t y ö n + l a b o r a t o r i o t y ö s k e n t e l y ä ä n + l a b o r a t o r i o t y ö t ä + l a b o r a t o r i o v a i h e e s s a + l a b o r a t o r i o v a l t i o i t a + l a b o r a t o r i o v a l v o n n a s t a + l a b o r a t o r i o v a l v o n t a + l a b o r a t o r i o v e r k o s t o + l a b o r a t o r i o v e r k o s t o j a + l a b o r a t o r i o v ä l i n e i s t ö + l a b o u r h a l l i t u s + l a b r a d o r i n m e r i + l a b r a d o r i n n o u t a j a + l a b r a d o r i n s o r s a + l a b y r i n t t i t a i s t e l u + l a d a t a + l a d a t a k s e e n + l a d o n o v e l t a + l a e i k s i + l a e i l l a + l a e i l l e + l a e i l t a + l a e i s s a m m e + l a e i s t a + l a g u u n i a l u e e l l e + l a g u u n i l l e + l a g u u n i s u m u + l a h d e n + l a h d e s s a + l a h j a k a u p p a + l a h j a k k a a m p i + l a h j a k k a i d e n + l a h j a k k a i m m a s t a + l a h j a k k a i m m a t + l a h j a k k a i m m i l l e + l a h j a k k a i m m i s t a + l a h j a k k a i t a + l a h j a k k u u k s i a + l a h j a k k u u t t a + l a h j a k o r t t i + l a h j a n t o i m i t u s p a l v e l u t + l a h j a s t a + l a h j a t + l a h j a t a l o u s + l a h j a t o i v o m u k s i s t a + l a h j a t t o m i a + l a h j a v e r o + l a h j a v e r o t u s + l a h j o a + l a h j o a k s e e n + l a h j o i s t a + l a h j o i t e t t a e s s a + l a h j o i t t a j a h a l l i t u k s i l t a + l a h j o i t t a j a k e s k e i s i ä + l a h j o i t t a j a k o n f e r e n s s i + l a h j o i t t a j a m a a k s i + l a h j o i t t a j a m a a s t a + l a h j o i t t a j a m a a t + l a h j o i t t a j a m a i d e n + l a h j o i t t a j a m a i h i n + l a h j o i t t a j a m a i t a + l a h j o i t t a j a t u e s t a + l a h j o i t t a j a v a l t i o i d e n + l a h j o i t t a j a v a l t i o i l l e + l a h j o i t t a j a v a l t i o t + l a h j o i t t a j a y h t e i s ö n + l a h j o i t t a j i a + l a h j o i t t a j i e n + l a h j o i t u k s e n a + l a h j o i t u k s e t + l a h j o i t u k s i a + l a h j o i t u k s i n a + l a h j o i t u k s i s t a + l a h j o i t u s j ä r j e s t e l m ä + l a h j o i t u s j ä r j e s t e l m ä n + l a h j o i t u s j ä r j e s t e l m ä ä + l a h j o i t u s k y s y m y s + l a h j o i t u s t e n + l a h j o i t u s t u l o j a + l a h j o i t u s t u l o j e n + l a h j o i t u s v e r k o s t o a + l a h j o j e n + l a h j o n n a k s i + l a h j o n n a n + l a h j o n n a n t o r j u n n a l l a + l a h j o n n a n t o r j u n n a n + l a h j o n n a n t o r j u n t a + l a h j o n n a n t o r j u n t a o s a s t o + l a h j o n n a n t o r j u n t a p o l i t i i k a n + l a h j o n n a n t o r j u n t a p o l i t i i k a s t a + l a h j o n n a n t o r j u n t a t a v a s t a + l a h j o n n a n t o r j u n t a t o i m e a + l a h j o n n a n v a s t a i n e n + l a h j o n n a s t a + l a h j o n t a a + l a h j o n t a a n + l a h j o n t a o n g e l m i e n + l a h j o n t a p r o s e s s i i n + l a h j o n t a s k a n d a a l e j a + l a h j o n t a s k a n d a a l i + l a h j o n t a s k a n d a a l i i n + l a h j o n t a s k a n d a a l i n + l a h j o n t a s y y t e + l a h j o n t a s y y t t e i t ä + l a h j o n t a s y y t ö k s e t + l a h j o n t a t a p a u k s e t + l a h j o n t a t a p a u k s i a + l a h j o n t a t a p a u k s i i n + l a h j o n t a t a p a u k s i s s a + l a h j o n t a t a p a u s t e n + l a h j u k s i a + l a h j u k s i e n + l a h j u s k a s s a n a + l a h j u s k a s s a t + l a h j u s r a h a n + l a h j u s r a h a s t o i s t a + l a h j u s t a + l a h k o h a l l i t u s + l a h k o j a o n + l a h k o j e n + l a h o a v a t + l a h o n n u t + l a h o p u u s s a + l a h o s a m m a l + l a h t i v a l a i d e n + l a h t i v a l a i s t a + l a h t i v a l a s + l a h u t + l a i d a n + l a i d u n a l u e i l l a + l a i d u n h y y p p ä + l a i d u n j ä r j e s t e l m ä m m e + l a i d u n k a n a l o i s s a + l a i d u n k i u r u + l a i d u n m a a + l a i d u n m a a l l e + l a i d u n m a a n + l a i d u n m a a p a l k k i o t a + l a i d u n m a a s t a + l a i d u n m a a t + l a i d u n m a a t a + l a i d u n m a i d e n + l a i d u n m a i l l a + l a i d u n m a i t a + l a i d u n t a l o u s + l a i d u n t a m i s t e k n i i k o i s t a + l a i d u n t a m i s t u e n + l a i h a k s i + l a i h a n + l a i h d u t u s l e i k k a u s + l a i h d u t u s t u o t t e i s t a + l a i h e m p i a + l a i h o i n + l a i h t u m i n e n + l a i h t u v a t + l a i k k u k e n t t ä m i t t a r i + l a i k k u p u s s i m i t t a r i + l a i k k u p y r s t ö k o l i b r i + l a i k s i + l a i l l a m m e + l a i l l i s e e n + l a i l l i s e k s i + l a i l l i s e l t a + l a i l l i s e m m a n + l a i l l i s e n + l a i l l i s e s s a + l a i l l i s e s t a + l a i l l i s e t + l a i l l i s i a + l a i l l i s i i n + l a i l l i s i l l a + l a i l l i s i l l e + l a i l l i s i n + l a i l l i s i s s a + l a i l l i s i s t a + l a i l l i s t a a + l a i l l i s t a a k s e e n + l a i l l i s t a m a a n + l a i l l i s t a m i s a a l l o i s t a + l a i l l i s t a m i s a a l t o j a + l a i l l i s t a m i s a l o i t e + l a i l l i s t a m i s e e n + l a i l l i s t a m i s e k s i + l a i l l i s t a m i s e s t a + l a i l l i s t a m i s i i n + l a i l l i s t a m i s j ä r j e s t e l m i ä + l a i l l i s t a m i s k e s k u s t e l u s t a + l a i l l i s t a m i s m e n e t t e l y i l l ä + l a i l l i s t a m i s p o l i t i i k a l l a + l a i l l i s t a m i s p o l i t i i k a s t a + l a i l l i s t a m i s p o l i t i i k k a + l a i l l i s t a m i s p r o s e s s i a + l a i l l i s t a m i s p r o s e s s i s t a + l a i l l i s t a m i s t a + l a i l l i s t a m i s t o i m e t + l a i l l i s t a v a t + l a i l l i s t e n + l a i l l i s t e t a a n + l a i l l i s t e t t a i s i i n + l a i l l i s t e t t a v a + l a i l l i s t e t t u j a + l a i l l i s u u d e l t a a n + l a i l l i s u u d e n + l a i l l i s u u d e s t a + l a i l l i s u u s k r i i s i s t ä + l a i l l i s u u s k y s y m y k s e e n + l a i l l i s u u s k y s y m y k s e n + l a i l l i s u u s k y s y m y k s i i n + l a i l l i s u u s k y s y m y s + l a i l l i s u u s o i k e u s + l a i l l i s u u s o n g e l m i s t a + l a i l l i s u u s p e r i a a t e + l a i l l i s u u s p e r i a a t e t t a + l a i l l i s u u s p e r i a a t t e e l l e + l a i l l i s u u s p e r i a a t t e e n + l a i l l i s u u s p e r i a a t t e e s e e n + l a i l l i s u u s p e r i a a t t e i t a + l a i l l i s u u s p e r u s t a + l a i l l i s u u s p e r u s t a a + l a i l l i s u u s p e r u s t a n + l a i l l i s u u s p o h j a a + l a i l l i s u u s p o h j a n + l a i l l i s u u s t o d i s t u s + l a i l l i s u u s v a l v o n n a n + l a i l l i s u u s v a l v o n t a a + l a i l l i s u u t e e n + l a i l l i s u u t t a + l a i m e a a + l a i m e a a n + l a i m e a l t a + l a i m e i l l a + l a i m e i l t a + l a i m e n t a a + l a i m e n t a m i s k i e l t o + l a i m e n t a m i s t e k i j ä n + l a i m i n l y ö + l a i m i n l y ö d ä + l a i m i n l y ö m i s e n + l a i m i n l y ö m ä t t ä + l a i m i n l y ö n e e t + l a i m i n l y ö n n e i s t ä + l a i m i n l y ö n n i k s i + l a i m i n l y ö n n i l l ä + l a i m i n l y ö n n i n + l a i m i n l y ö n n i s t ä + l a i m i n l y ö n n i t + l a i m i n l y ö n t e j ä + l a i m i n l y ö n t i + l a i m i n l y ö n t i e n + l a i m i n l y ö n t i i n + l a i m i n l y ö n t i s y n n e i s t ä + l a i m i n l y ö n t i ä + l a i m i n l y ö n y t + l a i m i n l y ö n y t t ä + l a i m i n l y ö v ä t + l a i m i n l ö i v ä t + l a i n a a k a a n + l a i n a a m a l l a + l a i n a a n + l a i n a e h d o i l l a + l a i n a e h d o i n + l a i n a e h d o i s s a + l a i n a e h t o i h i n + l a i n a e h t o j a + l a i n a e h t o j e n + l a i n a h a k e m u k s e n + l a i n a h a k e m u k s e t + l a i n a h a k e m u s + l a i n a j ä r j e s t e l m ä + l a i n a j ä r j e s t e l m ä n + l a i n a j ä r j e s t e l y i s s ä + l a i n a j ä r j e s t e l y j e n + l a i n a j ä r j e s t e l y t + l a i n a j ä r j e s t e l y ä + l a i n a k a n s a l l i s u u d e l l a + l a i n a k e n g i s s ä + l a i n a k o r k o j a + l a i n a k o r o i l l a + l a i n a k o r o l l a + l a i n a k r i i s i + l a i n a k s i + l a i n a k u s t a n n u k s e t + l a i n a k u s t a n n u k s i a + l a i n a k u s t a n n u k s i i n + l a i n a k u s t a n n u s t e n + l a i n a m a h d o l l i s u u k s i a + l a i n a m a h d o l l i s u u s + l a i n a m a n d a a t t i + l a i n a m a r k k i n a t + l a i n a m a r k k i n o i l l a + l a i n a m e n e t t e l y j ä + l a i n a m ä ä r ä n + l a i n a n a + l a i n a n a n t a j a + l a i n a n a n t a j a p a n k i n + l a i n a n a n t a j i l l e + l a i n a n a n t a j i l t a + l a i n a n a n t a j i s t a + l a i n a n a n t o a + l a i n a n a n t o a a n + l a i n a n a n t o k a p a s i t e e t t i + l a i n a n a n t o k a p a s i t e e t t i a + l a i n a n a n t o k y k y + l a i n a n a n t o p o l i t i i k a s t a + l a i n a n a n t o p o l i t i i k k a a n + l a i n a n a n t o p o l i t i i k k a n s a + l a i n a n a n t o p ä i v ä n + l a i n a n a n t o p ä ä t ö k s i s t ä + l a i n a n a n t o s t r a t e g i a a n s a + l a i n a n a n t o s ä ä n t ö j e n + l a i n a n a n t o t o i m i n t a a + l a i n a n a n t o v a l t u u t u k s e n + l a i n a n a n t o v a l t u u t u s + l a i n a n h a l l i n t a k e i n o j a + l a i n a n h o i t o m a k s u i h i n + l a i n a n m a k s u e r i e n + l a i n a n m a k s u t a u s t a + l a i n a n o t t o a + l a i n a n o t t o k i e l t o a + l a i n a n o t t o t a r v e + l a i n a n s a a j i s t a + l a i n a n s a a n n i n + l a i n a n s a a n n i s t a + l a i n a n s a a n t i + l a i n a n s a a n t i a + l a i n a n s a a n t i m a h d o l l i s u u k s i a + l a i n a n s a a n t i v a i k e u d e t + l a i n a o h j e l m i e n + l a i n a o h j e l m i s t a + l a i n a o p e r a a t i o i t a + l a i n a o p t i o i d e n + l a i n a p a k e t i n + l a i n a p a k e t t i e n + l a i n a p a l v e l u t + l a i n a p o h j a + l a i n a p o l i t i i k a l l a a n + l a i n a p ä ä t ö k s e e n + l a i n a p ä ä t ö k s i s s ä + l a i n a r a h a a + l a i n a r a h a n + l a i n a r a h a s t o j a + l a i n a r a h a s t o n + l a i n a r a h o i t u k s e n + l a i n a r a h o i t u s + l a i n a r a h o i t u s e h t o i h i n + l a i n a r a h o i t u s t a + l a i n a r i s k e i s t ä + l a i n a s i + l a i n a s i t o u m u k s i a + l a i n a s i t o u m u s t e n + l a i n a s i t t e + l a i n a s o p i m u k s e e n + l a i n a s o p i m u k s e n + l a i n a s o p i m u k s e s s a + l a i n a s o p i m u s + l a i n a s o p i m u s t a + l a i n a t + l a i n a t a + l a i n a t a a n + l a i n a t a k a u k s e t + l a i n a t a k a u k s i a + l a i n a t a k a u k s i i n + l a i n a t a k a u k s i s t a + l a i n a t a k s e n i + l a i n a t a k u i d e n + l a i n a t a k u i h i n + l a i n a t a k u i l l a + l a i n a t a k u i n a + l a i n a t a k u i t a + l a i n a t a k u u + l a i n a t a k u u j ä r j e s t e l m i e n + l a i n a t a k u u j ä r j e s t e l m i i n + l a i n a t a k u u o h j e l m i a + l a i n a t a k u u s t a + l a i n a t a k u u t + l a i n a t a k u u t a + l a i n a t a r j o u k s i a + l a i n a t e s s a n i + l a i n a t o i m i n n a s s a + l a i n a t o i m i n t a a + l a i n a t t u + l a i n a t t u j a + l a i n a t u k e a + l a i n a t u k i j ä r j e s t e l m ä n + l a i n a t u o t t e i t a + l a i n a u k s i a + l a i n a u s a l a l l a + l a i n a u s k u s t a n n u k s i l l a + l a i n a u s k u s t a n n u s t e n + l a i n a u s m a h d o l l i s u u k s i e n + l a i n a u s m a k s u i s t a + l a i n a u s m e r k e i l l ä + l a i n a u s m e r k e i s s ä + l a i n a u s m e r k i t + l a i n a u s m e r k k e i h i n + l a i n a u s m e r k k e j ä + l a i n a u s m e r k k i + l a i n a u s m e r k k i e n + l a i n a u s s t a n d a r d e i s t a + l a i n a u s t o i m i n n a n + l a i n a u s t o i m i n t a + l a i n a u s t o i m i n t a a + l a i n a u s t o i m i n t a a n s a + l a i n a u s v a l m i u k s i a + l a i n a u s v a l m i u k s i a a n + l a i n a v a a t i m u k s e e n + l a i n a v a k u u s j ä r j e s t e l m ä t + l a i n a v a l u u t t a + l a i n k a p p a l e e n a + l a i n k a p p a l e t t a + l a i n k o h d a s t a + l a i n k o h d i s s a + l a i n k o h t i a + l a i n k o h t i e n + l a i n k u u l i a i n e n + l a i n k u u l i a i s e n + l a i n k u u l i a i s e t + l a i n k u u l i a i s i a + l a i n k u u l i a i s i l l e + l a i n k u u l i a i s t a + l a i n k u u l i a i s t e n + l a i n k u u l i a i s u u d e n + l a i n k u u l i a i s u u t t a + l a i n k ä y t t ö + l a i n k ä y t t ö a l u e e l l a a n + l a i n k ä y t t ö a l u e e n + l a i n k ä y t t ö e l i n + l a i n k ä y t t ö j ä r j e s t e l m ä n + l a i n k ä y t t ö l a u t a k u n t i e n + l a i n k ä y t t ö v a l t a + l a i n k ä y t t ö v a l t a a + l a i n k ä y t t ö v a l t a a n + l a i n k ä y t t ö ö n + l a i n k ä y t ö n + l a i n l a a d i n t a + l a i n l a a d i n t a p r o s e s s i i n + l a i n l a a t i j a t + l a i n l a a t i j o i d e n + l a i n m u k a i n e n + l a i n m u k a i s e e n + l a i n m u k a i s e l l a + l a i n m u k a i s e m p a a + l a i n m u k a i s e n a + l a i n m u k a i s e s t i + l a i n m u k a i s e t + l a i n m u k a i s i a + l a i n m u k a i s i l l a + l a i n m u k a i s t a + l a i n m u k a i s t e n + l a i n m u k a i s u u s k y s y m y s + l a i n m u k a i s u u t t a + l a i n m u u t o k s e e n + l a i n m u u t o k s e l l a + l a i n m u u t o k s e n + l a i n m u u t o k s e t + l a i n m u u t o k s i a + l a i n m u u t o k s i s t a + l a i n m u u t o s t a + l a i n m u u t o s t e n + l a i n o i h i n + l a i n o i l l a + l a i n o i l l e + l a i n o i n a + l a i n o i s t a + l a i n o i s t a m m e + l a i n o j a + l a i n o j e n + l a i n o l e t t a m a a n + l a i n o p i l l i s e n + l a i n o p i l l i s e s t a + l a i n o p i l l i s e s t i + l a i n o p i l l i s e t + l a i n o p i l l i s i i n + l a i n o p i l l i s t e n + l a i n o p p i n e e t + l a i n o p p i n e i d e n + l a i n r i k k o j i a + l a i n r i k k o j i e n + l a i n r i k k o j i l l e + l a i n r i k k o j i l t a + l a i n r i k k o m i n e n + l a i n r i k k o m u k s i a + l a i n r i k k o m u k s i i n + l a i n r i k k o m u s p r o s e s s i n + l a i n s u o j a + l a i n s u o j a l l a + l a i n s u o j a n + l a i n s u o j a t o n + l a i n s ä ä d ä n n ä s s ä + l a i n s ä ä d ä n n ö i l l ä + l a i n s ä ä d ä n n ö i s s ä + l a i n s ä ä d ä n n ö i s s ä ä n + l a i n s ä ä d ä n n ö i s t ä + l a i n s ä ä d ä n n ö k s i + l a i n s ä ä d ä n n ö l l e + l a i n s ä ä d ä n n ö l l i n e n + l a i n s ä ä d ä n n ö l l i s e e n + l a i n s ä ä d ä n n ö l l i s e n + l a i n s ä ä d ä n n ö l l i s e s s ä + l a i n s ä ä d ä n n ö l l i s e s t ä + l a i n s ä ä d ä n n ö l l i s e t + l a i n s ä ä d ä n n ö l l i s i i n + l a i n s ä ä d ä n n ö l l i s i k s i + l a i n s ä ä d ä n n ö l l i s i l l ä + l a i n s ä ä d ä n n ö l l i s i n + l a i n s ä ä d ä n n ö l l i s i s s ä + l a i n s ä ä d ä n n ö l l i s i s t ä + l a i n s ä ä d ä n n ö l l i s i ä + l a i n s ä ä d ä n n ö l l i s t e n + l a i n s ä ä d ä n n ö l l i s t ä + l a i n s ä ä d ä n n ö l l ä + l a i n s ä ä d ä n n ö l l ä ä n + l a i n s ä ä d ä n n ö n + l a i n s ä ä d ä n n ö n k ä ä n + l a i n s ä ä d ä n n ö s s ä + l a i n s ä ä d ä n n ö s s ä k i n + l a i n s ä ä d ä n n ö s s ä m m e + l a i n s ä ä d ä n n ö s s ä ä n + l a i n s ä ä d ä n n ö s t ä + l a i n s ä ä d ä n n ö s t ä ä n + l a i n s ä ä d ä n n ö t + l a i n s ä ä d ä n t ä + l a i n s ä ä d ä n t ä m a l l e j a + l a i n s ä ä d ä n t ä m a l l i e n + l a i n s ä ä d ä n t ä m e n e t e l m i n + l a i n s ä ä d ä n t ä m e n e t t e l y + l a i n s ä ä d ä n t ä m e n e t t e l y i l t ä + l a i n s ä ä d ä n t ä m e n e t t e l y j e n + l a i n s ä ä d ä n t ä m e n e t t e l y y n + l a i n s ä ä d ä n t ä p r o s e s s i + l a i n s ä ä d ä n t ä p r o s e s s i a + l a i n s ä ä d ä n t ä p r o s e s s i i n + l a i n s ä ä d ä n t ä p r o s e s s i n + l a i n s ä ä d ä n t ä p r o s e s s i s s a + l a i n s ä ä d ä n t ä p r o s e s s i s s a m m e + l a i n s ä ä d ä n t ä p r o s e s s i s t a + l a i n s ä ä d ä n t ä t e h t ä v ä ä + l a i n s ä ä d ä n t ä t o i m i e n + l a i n s ä ä d ä n t ä t o i m i l l e + l a i n s ä ä d ä n t ä t y ö h ö m m e + l a i n s ä ä d ä n t ä t y ö h ö n + l a i n s ä ä d ä n t ä t y ö m m e + l a i n s ä ä d ä n t ä t y ö n s ä + l a i n s ä ä d ä n t ä t y ö s t ä + l a i n s ä ä d ä n t ä t y ö s t ä m m e + l a i n s ä ä d ä n t ä t y ö t ä + l a i n s ä ä d ä n t ä t y ö t ä m m e + l a i n s ä ä d ä n t ä v a l l a n + l a i n s ä ä d ä n t ä v a l t a + l a i n s ä ä d ä n t ä v a l t a a + l a i n s ä ä d ä n t ä v a l t a a n + l a i n s ä ä d ä n t ä v a l t a a n s a + l a i n s ä ä d ä n t ä v a l t u u d e t + l a i n s ä ä d ä n t ä v a l t u u k s i a + l a i n s ä ä d ä n t ä v a l t u u k s i e n + l a i n s ä ä d ä n t ä v a l t u u k s i s t a + l a i n s ä ä d ä n t ä v ä l i n e i d e n + l a i n s ä ä d ä n t ä ä n + l a i n s ä ä d ä n t ö + l a i n s ä ä d ä n t ö a i k a t a u l u n + l a i n s ä ä d ä n t ö a l a l l a + l a i n s ä ä d ä n t ö a l a n + l a i n s ä ä d ä n t ö a l o i t e + l a i n s ä ä d ä n t ö a l o i t e o i k e u d e n + l a i n s ä ä d ä n t ö a l o i t e o i k e u s + l a i n s ä ä d ä n t ö a l o i t e o i k e u t e n s a + l a i n s ä ä d ä n t ö a l o i t e t t a + l a i n s ä ä d ä n t ö a l o i t t e e k s i + l a i n s ä ä d ä n t ö a l o i t t e e l l a + l a i n s ä ä d ä n t ö a l o i t t e e l l e + l a i n s ä ä d ä n t ö a l o i t t e e l l e m m e + l a i n s ä ä d ä n t ö a l o i t t e e n + l a i n s ä ä d ä n t ö a l o i t t e e s e e n + l a i n s ä ä d ä n t ö a l o i t t e e s s a + l a i n s ä ä d ä n t ö a l o i t t e e s t a + l a i n s ä ä d ä n t ö a l o i t t e e t + l a i n s ä ä d ä n t ö a l o i t t e i d e m m e + l a i n s ä ä d ä n t ö a l o i t t e i d e n + l a i n s ä ä d ä n t ö a l o i t t e i d e n s a + l a i n s ä ä d ä n t ö a l o i t t e i l l a + l a i n s ä ä d ä n t ö a l o i t t e i l l e + l a i n s ä ä d ä n t ö a l o i t t e i s i i n + l a i n s ä ä d ä n t ö a l o i t t e i s s a + l a i n s ä ä d ä n t ö a l o i t t e i s s a a n + l a i n s ä ä d ä n t ö a l o i t t e i s t a + l a i n s ä ä d ä n t ö a l o i t t e i s t a a n + l a i n s ä ä d ä n t ö a l o i t t e i t a + l a i n s ä ä d ä n t ö a l u e e l l e + l a i n s ä ä d ä n t ö a l u e i d e n + l a i n s ä ä d ä n t ö a r s e n a a l i + l a i n s ä ä d ä n t ö a s e t u k s e t + l a i n s ä ä d ä n t ö a s i a k i r j a + l a i n s ä ä d ä n t ö a s i a k i r j a a + l a i n s ä ä d ä n t ö a s i a k i r j a a n + l a i n s ä ä d ä n t ö a s i a k i r j a n + l a i n s ä ä d ä n t ö a s i a k i r j a s s a + l a i n s ä ä d ä n t ö a s i a k i r j a t + l a i n s ä ä d ä n t ö a s i a k i r j o i h i n + l a i n s ä ä d ä n t ö a s i a k i r j o i s s a + l a i n s ä ä d ä n t ö a s i a k i r j o j a + l a i n s ä ä d ä n t ö a s i a k i r j o j e m m e + l a i n s ä ä d ä n t ö a s i a k i r j o j e n + l a i n s ä ä d ä n t ö a s i a n t u n t e m u k s e n + l a i n s ä ä d ä n t ö a s i a s s a + l a i n s ä ä d ä n t ö a s i a s t a + l a i n s ä ä d ä n t ö a s i a t + l a i n s ä ä d ä n t ö a s i o i d e n + l a i n s ä ä d ä n t ö a s i o i s s a + l a i n s ä ä d ä n t ö a s i o i s t a + l a i n s ä ä d ä n t ö a s i o i t a + l a i n s ä ä d ä n t ö e h d o t u k s e e n + l a i n s ä ä d ä n t ö e h d o t u k s e e n s a + l a i n s ä ä d ä n t ö e h d o t u k s e k s i + l a i n s ä ä d ä n t ö e h d o t u k s e l l a + l a i n s ä ä d ä n t ö e h d o t u k s e l l e + l a i n s ä ä d ä n t ö e h d o t u k s e l l e m m e + l a i n s ä ä d ä n t ö e h d o t u k s e l t a + l a i n s ä ä d ä n t ö e h d o t u k s e m m e + l a i n s ä ä d ä n t ö e h d o t u k s e n + l a i n s ä ä d ä n t ö e h d o t u k s e n n e + l a i n s ä ä d ä n t ö e h d o t u k s e n s a + l a i n s ä ä d ä n t ö e h d o t u k s e s s a + l a i n s ä ä d ä n t ö e h d o t u k s e s s a a n + l a i n s ä ä d ä n t ö e h d o t u k s e s s a k i n + l a i n s ä ä d ä n t ö e h d o t u k s e s s a m m e + l a i n s ä ä d ä n t ö e h d o t u k s e s s a n n e + l a i n s ä ä d ä n t ö e h d o t u k s e s t a + l a i n s ä ä d ä n t ö e h d o t u k s e t + l a i n s ä ä d ä n t ö e h d o t u k s i a + l a i n s ä ä d ä n t ö e h d o t u k s i a a n + l a i n s ä ä d ä n t ö e h d o t u k s i a m m e + l a i n s ä ä d ä n t ö e h d o t u k s i e n + l a i n s ä ä d ä n t ö e h d o t u k s i i m m e + l a i n s ä ä d ä n t ö e h d o t u k s i i n + l a i n s ä ä d ä n t ö e h d o t u k s i i n s a + l a i n s ä ä d ä n t ö e h d o t u k s i k s i + l a i n s ä ä d ä n t ö e h d o t u k s i l l a + l a i n s ä ä d ä n t ö e h d o t u k s i l l e + l a i n s ä ä d ä n t ö e h d o t u k s i n e e n + l a i n s ä ä d ä n t ö e h d o t u k s i s s a + l a i n s ä ä d ä n t ö e h d o t u k s i s s a a n + l a i n s ä ä d ä n t ö e h d o t u k s i s t a + l a i n s ä ä d ä n t ö e h d o t u s + l a i n s ä ä d ä n t ö e h d o t u s l u o n n o k s i a + l a i n s ä ä d ä n t ö e h d o t u s l u o n n o s t a + l a i n s ä ä d ä n t ö e h d o t u s p y y n t ö j e n + l a i n s ä ä d ä n t ö e h d o t u s s a r j a n + l a i n s ä ä d ä n t ö e h d o t u s t a + l a i n s ä ä d ä n t ö e h d o t u s t e m m e + l a i n s ä ä d ä n t ö e h d o t u s t e n + l a i n s ä ä d ä n t ö e l i m e k s i + l a i n s ä ä d ä n t ö e l i m e l l e + l a i n s ä ä d ä n t ö e l i m e l l ä + l a i n s ä ä d ä n t ö e l i m e l t ä + l a i n s ä ä d ä n t ö e l i m e n + l a i n s ä ä d ä n t ö e l i m e n ä + l a i n s ä ä d ä n t ö e l i m e s s ä + l a i n s ä ä d ä n t ö e l i m e s t ä + l a i n s ä ä d ä n t ö e l i m e t + l a i n s ä ä d ä n t ö e l i m i e n + l a i n s ä ä d ä n t ö e l i m i l l e + l a i n s ä ä d ä n t ö e l i m i s s ä + l a i n s ä ä d ä n t ö e l i m i s t ä + l a i n s ä ä d ä n t ö e l i m i ä + l a i n s ä ä d ä n t ö e l i n + l a i n s ä ä d ä n t ö e l i n t e n + l a i n s ä ä d ä n t ö e l i n t ä + l a i n s ä ä d ä n t ö e s i t y k s e k s i + l a i n s ä ä d ä n t ö e s i t y k s e m m e + l a i n s ä ä d ä n t ö e s i t y k s e n + l a i n s ä ä d ä n t ö e s i t y k s e s t ä + l a i n s ä ä d ä n t ö e s i t y k s i n + l a i n s ä ä d ä n t ö e s i t y k s i ä + l a i n s ä ä d ä n t ö e s i t y s + l a i n s ä ä d ä n t ö e s i t y s t ä + l a i n s ä ä d ä n t ö e t i i k k a a m m e + l a i n s ä ä d ä n t ö h a n k e + l a i n s ä ä d ä n t ö h a n k e t t a + l a i n s ä ä d ä n t ö h a n k k e e n + l a i n s ä ä d ä n t ö h a n k k e e s e e n + l a i n s ä ä d ä n t ö h a n k k e e s s a + l a i n s ä ä d ä n t ö h a n k k e e s t a + l a i n s ä ä d ä n t ö h a n k k e i d e n + l a i n s ä ä d ä n t ö h a n k k e i s s a + l a i n s ä ä d ä n t ö h a n k k e i s t a + l a i n s ä ä d ä n t ö h a n k k e i t a + l a i n s ä ä d ä n t ö h i e r a r k i a n + l a i n s ä ä d ä n t ö i h i n + l a i n s ä ä d ä n t ö i l m a p i i r i n + l a i n s ä ä d ä n t ö i l m a p i i r i s t ä + l a i n s ä ä d ä n t ö i n s t r u m e n t i l l a + l a i n s ä ä d ä n t ö i n t o + l a i n s ä ä d ä n t ö i s t u n n o i s s a + l a i n s ä ä d ä n t ö j a k s o n + l a i n s ä ä d ä n t ö j e n + l a i n s ä ä d ä n t ö j ä + l a i n s ä ä d ä n t ö j ä r j e s t e l m i e n + l a i n s ä ä d ä n t ö j ä r j e s t e l m i ä + l a i n s ä ä d ä n t ö j ä r j e s t e l m ä + l a i n s ä ä d ä n t ö j ä r j e s t e l m ä m m e + l a i n s ä ä d ä n t ö j ä r j e s t e l m ä n + l a i n s ä ä d ä n t ö j ä r j e s t e l m ä n s ä + l a i n s ä ä d ä n t ö j ä r j e s t e l m ä s s ä + l a i n s ä ä d ä n t ö j ä r j e s t e l m ä s s ä m m e + l a i n s ä ä d ä n t ö j ä r j e s t e l m ä s t ä + l a i n s ä ä d ä n t ö j ä r j e s t e l m ä ä + l a i n s ä ä d ä n t ö j ä r j e s t e l m ä ä n + l a i n s ä ä d ä n t ö j ä r j e s t e l y j ä + l a i n s ä ä d ä n t ö j ä r j e s t e l y s t ä + l a i n s ä ä d ä n t ö k a m a r i n a + l a i n s ä ä d ä n t ö k a u d e l l a + l a i n s ä ä d ä n t ö k a u d e l l e + l a i n s ä ä d ä n t ö k a u d e n + l a i n s ä ä d ä n t ö k a u s i + l a i n s ä ä d ä n t ö k a u s i e n + l a i n s ä ä d ä n t ö k a u s i s t a + l a i n s ä ä d ä n t ö k a u t e e n + l a i n s ä ä d ä n t ö k a u t t a + l a i n s ä ä d ä n t ö k e h i t y s + l a i n s ä ä d ä n t ö k e h y k s e e n + l a i n s ä ä d ä n t ö k e h y k s e k s i + l a i n s ä ä d ä n t ö k e h y k s e l l e + l a i n s ä ä d ä n t ö k e h y k s e l l ä + l a i n s ä ä d ä n t ö k e h y k s e m m e + l a i n s ä ä d ä n t ö k e h y k s e n + l a i n s ä ä d ä n t ö k e h y k s e n ä + l a i n s ä ä d ä n t ö k e h y k s e s s ä + l a i n s ä ä d ä n t ö k e h y k s e s s ä m m e + l a i n s ä ä d ä n t ö k e h y k s e s t ä + l a i n s ä ä d ä n t ö k e h y k s e t + l a i n s ä ä d ä n t ö k e h y k s i i n + l a i n s ä ä d ä n t ö k e h y k s i ä + l a i n s ä ä d ä n t ö k e h y s + l a i n s ä ä d ä n t ö k e h y s t e n + l a i n s ä ä d ä n t ö k e h y s t ä + l a i n s ä ä d ä n t ö k e h y s t ä ä n + l a i n s ä ä d ä n t ö k e i n o + l a i n s ä ä d ä n t ö k e i n o i l l a + l a i n s ä ä d ä n t ö k e i n o j a + l a i n s ä ä d ä n t ö k e r r o s + l a i n s ä ä d ä n t ö k e s k u s t e l u a + l a i n s ä ä d ä n t ö k e s k u s t e l u j e n + l a i n s ä ä d ä n t ö k e s k u s t e l u n + l a i n s ä ä d ä n t ö k e s k u s t e l u s s a + l a i n s ä ä d ä n t ö k e s k u s t e l u t + l a i n s ä ä d ä n t ö k i e r r o s + l a i n s ä ä d ä n t ö k o k e m u s + l a i n s ä ä d ä n t ö k o k o n a i s u u d e n + l a i n s ä ä d ä n t ö k o k o n a i s u u s + l a i n s ä ä d ä n t ö k o k o n a i s u u t t a + l a i n s ä ä d ä n t ö k o m i t e a n + l a i n s ä ä d ä n t ö k o n e + l a i n s ä ä d ä n t ö k o n e i s t o + l a i n s ä ä d ä n t ö k o n e i s t o a + l a i n s ä ä d ä n t ö k u l t t u u r i a n n e + l a i n s ä ä d ä n t ö k u l t t u u r i m m e + l a i n s ä ä d ä n t ö k u l t t u u r i n + l a i n s ä ä d ä n t ö k u m p p a n i + l a i n s ä ä d ä n t ö k u m p p a n i a + l a i n s ä ä d ä n t ö k u r i s t a + l a i n s ä ä d ä n t ö k y k y ä m m e + l a i n s ä ä d ä n t ö k y s y m y k s e e n + l a i n s ä ä d ä n t ö k y s y m y k s i s s ä + l a i n s ä ä d ä n t ö k y s y m y k s i ä + l a i n s ä ä d ä n t ö k y s y m y s t e n + l a i n s ä ä d ä n t ö k y s y m y s t ä + l a i n s ä ä d ä n t ö k y v y s t ä + l a i n s ä ä d ä n t ö k ä s i t t e l y + l a i n s ä ä d ä n t ö k ä s i t t e l y n + l a i n s ä ä d ä n t ö k ä s i t t e l y y n + l a i n s ä ä d ä n t ö k ä y t ä n n ö n + l a i n s ä ä d ä n t ö k ä y t ä n n ö s s ä + l a i n s ä ä d ä n t ö k ä y t ä n t e e t + l a i n s ä ä d ä n t ö k ä y t ä n t ö j e n + l a i n s ä ä d ä n t ö k ä y t ä n t ö ä + l a i n s ä ä d ä n t ö k ä y t ä n t ö ö n + l a i n s ä ä d ä n t ö l a a d u n + l a i n s ä ä d ä n t ö l u o n n o k s e e n s a + l a i n s ä ä d ä n t ö l u o n n o k s e l l a + l a i n s ä ä d ä n t ö l u o n n o k s e l l a a n + l a i n s ä ä d ä n t ö l u o n n o k s e n + l a i n s ä ä d ä n t ö l u o n n o k s e s s a + l a i n s ä ä d ä n t ö l u o n n o k s e s t a + l a i n s ä ä d ä n t ö l u o n n o k s i a + l a i n s ä ä d ä n t ö l u o n n o k s i s t a + l a i n s ä ä d ä n t ö l u o n n o s + l a i n s ä ä d ä n t ö l u o n n o s p a k e t t i + l a i n s ä ä d ä n t ö l u o n n o s t a + l a i n s ä ä d ä n t ö l u o n n o s t e n + l a i n s ä ä d ä n t ö l u o n t e e n s a + l a i n s ä ä d ä n t ö m a h d o l l i s u u k s i a + l a i n s ä ä d ä n t ö m a l l i + l a i n s ä ä d ä n t ö m a l l i a + l a i n s ä ä d ä n t ö m a r a t o n i n + l a i n s ä ä d ä n t ö m a t k a n + l a i n s ä ä d ä n t ö m e k a n i s m e i h i n + l a i n s ä ä d ä n t ö m e k a n i s m e j a + l a i n s ä ä d ä n t ö m e k a n i s m i + l a i n s ä ä d ä n t ö m e k a n i s m i a + l a i n s ä ä d ä n t ö m e n e s t y s t ä + l a i n s ä ä d ä n t ö m e n e t e l m i e n + l a i n s ä ä d ä n t ö m e n e t e l m i ä + l a i n s ä ä d ä n t ö m e n e t e l m ä + l a i n s ä ä d ä n t ö m e n e t e l m ä n + l a i n s ä ä d ä n t ö m e n e t e l m ä s t ä + l a i n s ä ä d ä n t ö m e n e t t e l y + l a i n s ä ä d ä n t ö m e n e t t e l y i h i n + l a i n s ä ä d ä n t ö m e n e t t e l y i l l e + l a i n s ä ä d ä n t ö m e n e t t e l y i n + l a i n s ä ä d ä n t ö m e n e t t e l y i s s ä + l a i n s ä ä d ä n t ö m e n e t t e l y i s s ä ä n + l a i n s ä ä d ä n t ö m e n e t t e l y i s t ä + l a i n s ä ä d ä n t ö m e n e t t e l y i s t ä ä n + l a i n s ä ä d ä n t ö m e n e t t e l y i t ä + l a i n s ä ä d ä n t ö m e n e t t e l y j e n + l a i n s ä ä d ä n t ö m e n e t t e l y j ä + l a i n s ä ä d ä n t ö m e n e t t e l y k s i + l a i n s ä ä d ä n t ö m e n e t t e l y l l e + l a i n s ä ä d ä n t ö m e n e t t e l y l l ä + l a i n s ä ä d ä n t ö m e n e t t e l y m m e + l a i n s ä ä d ä n t ö m e n e t t e l y n + l a i n s ä ä d ä n t ö m e n e t t e l y n s ä + l a i n s ä ä d ä n t ö m e n e t t e l y n ä + l a i n s ä ä d ä n t ö m e n e t t e l y s s ä + l a i n s ä ä d ä n t ö m e n e t t e l y s s ä m m e + l a i n s ä ä d ä n t ö m e n e t t e l y s t ä + l a i n s ä ä d ä n t ö m e n e t t e l y t + l a i n s ä ä d ä n t ö m e n e t t e l y y n + l a i n s ä ä d ä n t ö m e n e t t e l y ä + l a i n s ä ä d ä n t ö m e n e t t e l y ä m m e + l a i n s ä ä d ä n t ö m i e t i n n ö n + l a i n s ä ä d ä n t ö m i e t i n n ö s s ä + l a i n s ä ä d ä n t ö m i e t i n n ö s t ä + l a i n s ä ä d ä n t ö m i e t i n n ö t + l a i n s ä ä d ä n t ö m i e t i n t ö + l a i n s ä ä d ä n t ö m i e t i n t ö j e n + l a i n s ä ä d ä n t ö m i e t i n t ö j ä + l a i n s ä ä d ä n t ö m m e + l a i n s ä ä d ä n t ö m u u t o k s e e n + l a i n s ä ä d ä n t ö m u u t o k s e t + l a i n s ä ä d ä n t ö m u u t o k s i a + l a i n s ä ä d ä n t ö m u u t o k s i i n + l a i n s ä ä d ä n t ö m u u t o k s i l l a + l a i n s ä ä d ä n t ö m u u t o s + l a i n s ä ä d ä n t ö m u u t o s t a + l a i n s ä ä d ä n t ö m u u t o s t e n + l a i n s ä ä d ä n t ö m ä ä r ä n + l a i n s ä ä d ä n t ö m ä ä r ä y k s i e n + l a i n s ä ä d ä n t ö n e u v o s t o + l a i n s ä ä d ä n t ö n e u v o s t o a + l a i n s ä ä d ä n t ö n e u v o s t o l l e + l a i n s ä ä d ä n t ö n e u v o s t o n + l a i n s ä ä d ä n t ö n e u v o s t o o n + l a i n s ä ä d ä n t ö n o r m e i s t a + l a i n s ä ä d ä n t ö n o r m i + l a i n s ä ä d ä n t ö n o r m i e n + l a i n s ä ä d ä n t ö n s ä + l a i n s ä ä d ä n t ö o h j e l m a + l a i n s ä ä d ä n t ö o h j e l m a a + l a i n s ä ä d ä n t ö o h j e l m a a m m e + l a i n s ä ä d ä n t ö o h j e l m a a n + l a i n s ä ä d ä n t ö o h j e l m a a n s a + l a i n s ä ä d ä n t ö o h j e l m a l l a a n + l a i n s ä ä d ä n t ö o h j e l m a n + l a i n s ä ä d ä n t ö o h j e l m a n a + l a i n s ä ä d ä n t ö o h j e l m a n s a + l a i n s ä ä d ä n t ö o h j e l m a s s a + l a i n s ä ä d ä n t ö o h j e l m a s s a a n + l a i n s ä ä d ä n t ö o h j e l m a s s a m m e + l a i n s ä ä d ä n t ö o h j e l m a s t a + l a i n s ä ä d ä n t ö o h j e l m a s t a n n e + l a i n s ä ä d ä n t ö o h j e l m a t + l a i n s ä ä d ä n t ö o h j e l m i a + l a i n s ä ä d ä n t ö o h j e l m i e n + l a i n s ä ä d ä n t ö o h j e l m i i n + l a i n s ä ä d ä n t ö o i k e u d e n + l a i n s ä ä d ä n t ö o i k e u d e s t a + l a i n s ä ä d ä n t ö o i k e u d e t + l a i n s ä ä d ä n t ö o i k e u k s i a + l a i n s ä ä d ä n t ö o i k e u k s i a a n + l a i n s ä ä d ä n t ö o i k e u s + l a i n s ä ä d ä n t ö o i k e u t e e n + l a i n s ä ä d ä n t ö o i k e u t t a + l a i n s ä ä d ä n t ö o n g e l m a + l a i n s ä ä d ä n t ö o n g e l m i a + l a i n s ä ä d ä n t ö o s a p u o l i + l a i n s ä ä d ä n t ö o s a s s a + l a i n s ä ä d ä n t ö o s u u d e n + l a i n s ä ä d ä n t ö p a k e t e i s t a + l a i n s ä ä d ä n t ö p a k e t i l l a + l a i n s ä ä d ä n t ö p a k e t i l l e + l a i n s ä ä d ä n t ö p a k e t i n + l a i n s ä ä d ä n t ö p a k e t i s s a + l a i n s ä ä d ä n t ö p a k e t i s t a + l a i n s ä ä d ä n t ö p a k e t i t + l a i n s ä ä d ä n t ö p a k e t t e i h i n + l a i n s ä ä d ä n t ö p a k e t t e j a + l a i n s ä ä d ä n t ö p a k e t t i + l a i n s ä ä d ä n t ö p a k e t t i a + l a i n s ä ä d ä n t ö p a k e t t i e n + l a i n s ä ä d ä n t ö p a k e t t i i n + l a i n s ä ä d ä n t ö p e r i a a t e + l a i n s ä ä d ä n t ö p e r i a a t t e i d e n + l a i n s ä ä d ä n t ö p e r i a a t t e i t a + l a i n s ä ä d ä n t ö p e r i n t e i l l e + l a i n s ä ä d ä n t ö p e r u s t a + l a i n s ä ä d ä n t ö p e r u s t a a + l a i n s ä ä d ä n t ö p e r u s t a n + l a i n s ä ä d ä n t ö p e r u s t a s t a + l a i n s ä ä d ä n t ö p e r u s t a t + l a i n s ä ä d ä n t ö p e s u a + l a i n s ä ä d ä n t ö p i l a r i a + l a i n s ä ä d ä n t ö p o h j a + l a i n s ä ä d ä n t ö p o h j a a + l a i n s ä ä d ä n t ö p r o s e s s e i h i n + l a i n s ä ä d ä n t ö p r o s e s s e i l l e + l a i n s ä ä d ä n t ö p r o s e s s e i s s a + l a i n s ä ä d ä n t ö p r o s e s s e i s t a + l a i n s ä ä d ä n t ö p r o s e s s e j a + l a i n s ä ä d ä n t ö p r o s e s s i + l a i n s ä ä d ä n t ö p r o s e s s i a + l a i n s ä ä d ä n t ö p r o s e s s i a a n + l a i n s ä ä d ä n t ö p r o s e s s i a h a n + l a i n s ä ä d ä n t ö p r o s e s s i a m m e + l a i n s ä ä d ä n t ö p r o s e s s i e n + l a i n s ä ä d ä n t ö p r o s e s s i i n + l a i n s ä ä d ä n t ö p r o s e s s i l l e + l a i n s ä ä d ä n t ö p r o s e s s i m m e + l a i n s ä ä d ä n t ö p r o s e s s i n + l a i n s ä ä d ä n t ö p r o s e s s i s s a + l a i n s ä ä d ä n t ö p r o s e s s i s s a m m e + l a i n s ä ä d ä n t ö p r o s e s s i s t a + l a i n s ä ä d ä n t ö p r o s e s s i t + l a i n s ä ä d ä n t ö p u i t t e e t + l a i n s ä ä d ä n t ö p u i t t e i d e n + l a i n s ä ä d ä n t ö p u i t t e i l l a + l a i n s ä ä d ä n t ö p u i t t e i s s a + l a i n s ä ä d ä n t ö p u i t t e i t a + l a i n s ä ä d ä n t ö p u o l e e n + l a i n s ä ä d ä n t ö p u o l e l l a + l a i n s ä ä d ä n t ö p u u t a + l a i n s ä ä d ä n t ö p y r a m i d i s t a + l a i n s ä ä d ä n t ö p ä ä t ö k s e e n + l a i n s ä ä d ä n t ö p ä ä t ö k s e l l ä + l a i n s ä ä d ä n t ö p ä ä t ö k s e n + l a i n s ä ä d ä n t ö p ä ä t ö k s e n s ä + l a i n s ä ä d ä n t ö p ä ä t ö k s e t + l a i n s ä ä d ä n t ö p ä ä t ö k s i i n + l a i n s ä ä d ä n t ö p ä ä t ö k s i ä + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a a + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a a n + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a a n k i n + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a e h d o t u k s e n + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a e h d o t u k s e s s a + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a e h d o t u s t a + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a e s i t y k s e e n + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a e s i t y k s e n + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a e s i t y k s e s s ä + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a e s i t y k s e s t ä + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a e s i t y s + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a e s i t y s t ä + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a k s i + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a l l e + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a l u o n n o k s e n + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a l u o n n o k s e s t a + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a l u o n n o s t a + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a n + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a n a + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a n k a a n + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a s s a + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a s s a a n + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a s t a + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m a t + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m i a + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m i k s i + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m i s s a + l a i n s ä ä d ä n t ö p ä ä t ö s l a u s e l m i s t a + l a i n s ä ä d ä n t ö p ä ä t ö s l u o n n o k s e s t a + l a i n s ä ä d ä n t ö p ä ä t ö s t e n + l a i n s ä ä d ä n t ö r a k e n t e e s e e n + l a i n s ä ä d ä n t ö r a t k a i s u i h i n + l a i n s ä ä d ä n t ö r a t k a i s u i s t a + l a i n s ä ä d ä n t ö r a t k a i s u j a + l a i n s ä ä d ä n t ö r a t k a i s u j e n + l a i n s ä ä d ä n t ö r i n t a m a l l a + l a i n s ä ä d ä n t ö r o o l i n + l a i n s ä ä d ä n t ö s t r a t e g i a a + l a i n s ä ä d ä n t ö s t r a t e g i a a n + l a i n s ä ä d ä n t ö s t r a t e g i o i d e m m e + l a i n s ä ä d ä n t ö s t r a t e g i o i d e n + l a i n s ä ä d ä n t ö s t r a t e g i o i t a + l a i n s ä ä d ä n t ö s u o s i t u s t a + l a i n s ä ä d ä n t ö s u u n n i t e l m a a + l a i n s ä ä d ä n t ö s u u n n i t e l m a n + l a i n s ä ä d ä n t ö s u u n n i t e l m a t + l a i n s ä ä d ä n t ö s u u n n i t e l m i a + l a i n s ä ä d ä n t ö s u u n n i t t e l u n + l a i n s ä ä d ä n t ö s ä ä d ö k s e t + l a i n s ä ä d ä n t ö s ä ä d ö k s i ä + l a i n s ä ä d ä n t ö t a a k k a + l a i n s ä ä d ä n t ö t a p a + l a i n s ä ä d ä n t ö t a p a a + l a i n s ä ä d ä n t ö t a p a u k s i s t a + l a i n s ä ä d ä n t ö t a r k i s t u k s e l l a + l a i n s ä ä d ä n t ö t a r k i s t u k s e n + l a i n s ä ä d ä n t ö t a r k i s t u k s e s s a + l a i n s ä ä d ä n t ö t a r k i s t u k s e t + l a i n s ä ä d ä n t ö t a r k i s t u k s i a + l a i n s ä ä d ä n t ö t a r k i s t u k s i s t a + l a i n s ä ä d ä n t ö t a r k i s t u s + l a i n s ä ä d ä n t ö t a r p e e n + l a i n s ä ä d ä n t ö t a r p e e s t a + l a i n s ä ä d ä n t ö t a r v e t t a + l a i n s ä ä d ä n t ö t a u k o o n + l a i n s ä ä d ä n t ö t a u o n + l a i n s ä ä d ä n t ö t a v a n + l a i n s ä ä d ä n t ö t e h t a a s e e n + l a i n s ä ä d ä n t ö t e h t ä v i e n + l a i n s ä ä d ä n t ö t e h t ä v i i n + l a i n s ä ä d ä n t ö t e h t ä v i s t ä ä n + l a i n s ä ä d ä n t ö t e h t ä v i ä + l a i n s ä ä d ä n t ö t e h t ä v ä + l a i n s ä ä d ä n t ö t e h t ä v ä m m e + l a i n s ä ä d ä n t ö t e h t ä v ä n + l a i n s ä ä d ä n t ö t e h t ä v ä n s ä + l a i n s ä ä d ä n t ö t e h t ä v ä ä + l a i n s ä ä d ä n t ö t e k n i i k a k s i + l a i n s ä ä d ä n t ö t e k n i i k a n + l a i n s ä ä d ä n t ö t e k n i i k k a + l a i n s ä ä d ä n t ö t e k s t e i h i n + l a i n s ä ä d ä n t ö t e k s t e i s s ä + l a i n s ä ä d ä n t ö t e k s t e i s t ä + l a i n s ä ä d ä n t ö t e k s t e j ä + l a i n s ä ä d ä n t ö t e k s t i + l a i n s ä ä d ä n t ö t e k s t i e n + l a i n s ä ä d ä n t ö t e k s t i e n s ä + l a i n s ä ä d ä n t ö t e k s t i i n + l a i n s ä ä d ä n t ö t e k s t i k s i + l a i n s ä ä d ä n t ö t e k s t i n + l a i n s ä ä d ä n t ö t e k s t i s s ä + l a i n s ä ä d ä n t ö t e k s t i s t ä + l a i n s ä ä d ä n t ö t e k s t i t + l a i n s ä ä d ä n t ö t e k s t i ä + l a i n s ä ä d ä n t ö t i e + l a i n s ä ä d ä n t ö t i l a n n e + l a i n s ä ä d ä n t ö t o i m e a + l a i n s ä ä d ä n t ö t o i m e l l a + l a i n s ä ä d ä n t ö t o i m e n + l a i n s ä ä d ä n t ö t o i m e n a + l a i n s ä ä d ä n t ö t o i m e n p i d e + l a i n s ä ä d ä n t ö t o i m e n p i d e t t ä + l a i n s ä ä d ä n t ö t o i m e n p i t e e t + l a i n s ä ä d ä n t ö t o i m e n p i t e i d e n + l a i n s ä ä d ä n t ö t o i m e n p i t e i k s i + l a i n s ä ä d ä n t ö t o i m e n p i t e i n + l a i n s ä ä d ä n t ö t o i m e n p i t e i s i i n + l a i n s ä ä d ä n t ö t o i m e n p i t e i t ä + l a i n s ä ä d ä n t ö t o i m e s t a + l a i n s ä ä d ä n t ö t o i m e t + l a i n s ä ä d ä n t ö t o i m i + l a i n s ä ä d ä n t ö t o i m i a + l a i n s ä ä d ä n t ö t o i m i a m m e + l a i n s ä ä d ä n t ö t o i m i e n + l a i n s ä ä d ä n t ö t o i m i i n + l a i n s ä ä d ä n t ö t o i m i k s i + l a i n s ä ä d ä n t ö t o i m i l l a + l a i n s ä ä d ä n t ö t o i m i l l e + l a i n s ä ä d ä n t ö t o i m i n n a n + l a i n s ä ä d ä n t ö t o i m i n n a s s a + l a i n s ä ä d ä n t ö t o i m i n n a s t a + l a i n s ä ä d ä n t ö t o i m i n t a + l a i n s ä ä d ä n t ö t o i m i n t a a + l a i n s ä ä d ä n t ö t o i m i n t a a n + l a i n s ä ä d ä n t ö t o i m i s s a + l a i n s ä ä d ä n t ö t o i m i s s a a n + l a i n s ä ä d ä n t ö t o i m i s s a k i n + l a i n s ä ä d ä n t ö t o i m i s t a + l a i n s ä ä d ä n t ö t o i m i v a l t a + l a i n s ä ä d ä n t ö t o i m i v a l t a a + l a i n s ä ä d ä n t ö t o i m i v a l t a a n + l a i n s ä ä d ä n t ö t o i m i v a l t a a n s a + l a i n s ä ä d ä n t ö t o i n t a + l a i n s ä ä d ä n t ö t u l v a a + l a i n s ä ä d ä n t ö t y h j i ö + l a i n s ä ä d ä n t ö t y y p p i s e n + l a i n s ä ä d ä n t ö t y ö + l a i n s ä ä d ä n t ö t y ö h ö m m e + l a i n s ä ä d ä n t ö t y ö h ö n + l a i n s ä ä d ä n t ö t y ö h ö n k i n + l a i n s ä ä d ä n t ö t y ö h ö n s ä + l a i n s ä ä d ä n t ö t y ö k s i + l a i n s ä ä d ä n t ö t y ö l l e + l a i n s ä ä d ä n t ö t y ö l l e e n + l a i n s ä ä d ä n t ö t y ö l l ä + l a i n s ä ä d ä n t ö t y ö m m e + l a i n s ä ä d ä n t ö t y ö n + l a i n s ä ä d ä n t ö t y ö n s ä + l a i n s ä ä d ä n t ö t y ö o h j e l m a + l a i n s ä ä d ä n t ö t y ö s k e n t e l y n + l a i n s ä ä d ä n t ö t y ö s s ä + l a i n s ä ä d ä n t ö t y ö s s ä k i n + l a i n s ä ä d ä n t ö t y ö s s ä m m e + l a i n s ä ä d ä n t ö t y ö s t ä + l a i n s ä ä d ä n t ö t y ö t ä + l a i n s ä ä d ä n t ö t y ö t ä m m e + l a i n s ä ä d ä n t ö t y ö t ä ä n + l a i n s ä ä d ä n t ö t ö i d e n + l a i n s ä ä d ä n t ö u u d i s t u k s e n + l a i n s ä ä d ä n t ö u u d i s t u k s e t + l a i n s ä ä d ä n t ö u u d i s t u k s i a + l a i n s ä ä d ä n t ö u u d i s t u k s i i n + l a i n s ä ä d ä n t ö u u d i s t u s + l a i n s ä ä d ä n t ö u u d i s t u s p a k e t i n + l a i n s ä ä d ä n t ö u u d i s t u s t e n + l a i n s ä ä d ä n t ö v a a l i t + l a i n s ä ä d ä n t ö v a a t i m u k s e t + l a i n s ä ä d ä n t ö v a a t i m u k s i a + l a i n s ä ä d ä n t ö v a i h e + l a i n s ä ä d ä n t ö v a i h e e s s a + l a i n s ä ä d ä n t ö v a i h e t t a + l a i n s ä ä d ä n t ö v a i k u t u s t e n + l a i n s ä ä d ä n t ö v a l i o k u n t i e n + l a i n s ä ä d ä n t ö v a l l a k s i + l a i n s ä ä d ä n t ö v a l l a n + l a i n s ä ä d ä n t ö v a l l a s t a + l a i n s ä ä d ä n t ö v a l l a s t a a n + l a i n s ä ä d ä n t ö v a l m i u k s i i n + l a i n s ä ä d ä n t ö v a l t a + l a i n s ä ä d ä n t ö v a l t a a + l a i n s ä ä d ä n t ö v a l t a a m m e + l a i n s ä ä d ä n t ö v a l t a a n + l a i n s ä ä d ä n t ö v a l t a a n s a + l a i n s ä ä d ä n t ö v a l t a m m e + l a i n s ä ä d ä n t ö v a l t u u d e t + l a i n s ä ä d ä n t ö v a l t u u k s i a + l a i n s ä ä d ä n t ö v a l t u u k s i a m m e + l a i n s ä ä d ä n t ö v a l t u u k s i e n + l a i n s ä ä d ä n t ö v a l t u u k s i e n s a + l a i n s ä ä d ä n t ö v a l t u u t e n s a + l a i n s ä ä d ä n t ö v a l v o n t a a + l a i n s ä ä d ä n t ö v a s t u u + l a i n s ä ä d ä n t ö v a s t u u n + l a i n s ä ä d ä n t ö v e l v o i t t e e n s a + l a i n s ä ä d ä n t ö v e l v o l l i s u u d e n + l a i n s ä ä d ä n t ö v e l v o l l i s u u k s i a + l a i n s ä ä d ä n t ö v e r k o n + l a i n s ä ä d ä n t ö v i i d a k o n + l a i n s ä ä d ä n t ö v i r a n o m a i n e n + l a i n s ä ä d ä n t ö v i r a n o m a i s e l l e + l a i n s ä ä d ä n t ö v i r a n o m a i s e n + l a i n s ä ä d ä n t ö v i r a n o m a i s e t + l a i n s ä ä d ä n t ö v i r a n o m a i s i l l a + l a i n s ä ä d ä n t ö v i r a n o m a i s t e n + l a i n s ä ä d ä n t ö v i r a s t o i l l a + l a i n s ä ä d ä n t ö v u o r o p u h e l u n + l a i n s ä ä d ä n t ö v ä l i n e + l a i n s ä ä d ä n t ö v ä l i n e e k s i + l a i n s ä ä d ä n t ö v ä l i n e e l l e + l a i n s ä ä d ä n t ö v ä l i n e e l l ä + l a i n s ä ä d ä n t ö v ä l i n e e n + l a i n s ä ä d ä n t ö v ä l i n e e s e e n + l a i n s ä ä d ä n t ö v ä l i n e e s t ä + l a i n s ä ä d ä n t ö v ä l i n e e t + l a i n s ä ä d ä n t ö v ä l i n e i d e n + l a i n s ä ä d ä n t ö v ä l i n e i n ä + l a i n s ä ä d ä n t ö v ä l i n e i s i i n + l a i n s ä ä d ä n t ö v ä l i n e i s s ä + l a i n s ä ä d ä n t ö v ä l i n e i t ä + l a i n s ä ä d ä n t ö v ä l i n e i t ä m m e + l a i n s ä ä d ä n t ö v ä l i n e t t ä + l a i n s ä ä d ä n t ö y h t e i s t y ö + l a i n s ä ä d ä n t ö y m p ä r i s t ö + l a i n s ä ä d ä n t ö y m p ä r i s t ö n + l a i n s ä ä d ä n t ö y m p ä r i s t ö s s ä + l a i n s ä ä d ä n t ö y m p ä r i s t ö ä + l a i n s ä ä d ä n t ö y r i t y k s e t + l a i n s ä ä d ä n t ö ä + l a i n s ä ä d ä n t ö ä m m e + l a i n s ä ä d ä n t ö ä n s ä + l a i n s ä ä d ä n t ö ä ä n + l a i n s ä ä d ä n t ö ö m m e + l a i n s ä ä d ä n t ö ö n + l a i n s ä ä d ä n t ö ö n s ä + l a i n s ä ä d ö l l ä + l a i n s ä ä n t ö p a k e t i n + l a i n s ä ä n t ö t o i m i n t a a + l a i n s ä ä t ä j i e n + l a i n s ä ä t ä j i e n k i n + l a i n s ä ä t ä j i l l e + l a i n s ä ä t ä j i l l ä + l a i n s ä ä t ä j i l t ä + l a i n s ä ä t ä j i n ä + l a i n s ä ä t ä j i s t ä + l a i n s ä ä t ä j i ä + l a i n s ä ä t ä j ä + l a i n s ä ä t ä j ä k s i + l a i n s ä ä t ä j ä l l e + l a i n s ä ä t ä j ä n + l a i n s ä ä t ä j ä n ä + l a i n s ä ä t ä j ä o m i n a i s u u t e n s a + l a i n s ä ä t ä j ä t + l a i n s ä ä t ä j ä t k i n + l a i n s ä ä t ä j ä ä + l a i n s ä ä t ä m i s e e n + l a i n s ä ä t ä m i s e n + l a i n s ä ä t ä m i s j ä r j e s t y k s e e n + l a i n s ä ä t ä m i s j ä r j e s t y k s e n + l a i n s ä ä t ä m i s j ä r j e s t y k s e s s ä + l a i n s ä ä t ä m i s j ä r j e s t y k s e s t ä + l a i n s ä ä t ä m i s j ä r j e s t y s t ä + l a i n s ä ä t ä m i s m a h d o l l i s u u k s i a + l a i n s ä ä t ä m i s m e n e t t e l y i s t ä + l a i n s ä ä t ä m i s m e n e t t e l y n + l a i n s ä ä t ä m i s m e n e t t e l y y n + l a i n s ä ä t ä m i s p r o s e s s i i n + l a i n s ä ä t ä m i s p r o s e s s i n + l a i n s ä ä t ä m i s t y ö t ä + l a i n s ä ä t ä m i s v a l t u u k s i n + l a i n s ä ä t ö i n n o s t u s + l a i n t a u l u j a + l a i n t u l k i n n a n + l a i n t u l k i n n a s s a + l a i n t u l k i n t a + l a i n t u l k i n t a t a v a l l e + l a i n v a l i n n a n + l a i n v a l i n t a a + l a i n v a l i n t a a n + l a i n v a l i n t a o i k e u s + l a i n v a l i n t a s ä ä n n ö t + l a i n v a l i n t a s ä ä n t ö j e n + l a i n v a l v o j i a + l a i n v a l v o n n a n + l a i n v a l v o n n a s s a + l a i n v a l v o n n a s t a + l a i n v a l v o n t a + l a i n v a l v o n t a a + l a i n v a l v o n t a a n + l a i n v a l v o n t a e l i m e n + l a i n v a l v o n t a e l i m i i n + l a i n v a l v o n t a e l i m i ä m m e + l a i n v a l v o n t a e l i n t e n + l a i n v a l v o n t a h e n k i l ö s t ö l l e e n + l a i n v a l v o n t a j ä r j e s t e l m i e n + l a i n v a l v o n t a j ä r j e s t e l m ä ä + l a i n v a l v o n t a j ä r j e s t e l m ä ä n + l a i n v a l v o n t a k e h y s t ä + l a i n v a l v o n t a k o n e i s t o a + l a i n v a l v o n t a k o o r d i n o i n t i a a n + l a i n v a l v o n t a k o u l u t u s t a + l a i n v a l v o n t a m e k a n i s m e i l l a + l a i n v a l v o n t a m e k a n i s m i + l a i n v a l v o n t a m e k a n i s m i e n + l a i n v a l v o n t a m e k a n i s m i t + l a i n v a l v o n t a m e n e t t e l y m m e + l a i n v a l v o n t a p e r i n t e e t + l a i n v a l v o n t a t a r k o i t u k s i a + l a i n v a l v o n t a t a r k o i t u k s i i n + l a i n v a l v o n t a t a r k o i t u s + l a i n v a l v o n t a t o i m i a + l a i n v a l v o n t a t y ö + l a i n v a l v o n t a v a l t u u k s i e n + l a i n v a l v o n t a v i r a n o m a i s e l l a + l a i n v a l v o n t a v i r a n o m a i s e m m e + l a i n v a l v o n t a v i r a n o m a i s e t + l a i n v a l v o n t a v i r a n o m a i s i a + l a i n v a l v o n t a v i r a n o m a i s i i n + l a i n v a l v o n t a v i r a n o m a i s i l l a + l a i n v a l v o n t a v i r a n o m a i s i l l a m m e + l a i n v a l v o n t a v i r a n o m a i s i l l e + l a i n v a l v o n t a v i r a n o m a i s i l t a + l a i n v a l v o n t a v i r a n o m a i s t e m m e + l a i n v a l v o n t a v i r a n o m a i s t e n + l a i n v a l v o n t a v i r a s t o + l a i n v a l v o n t a v i r a s t o i h i n + l a i n v a l v o n t a v i r a s t o i l l a + l a i n v a l v o n t a v i r a s t o i l l e + l a i n v a l v o n t a v i r a s t o i s t a + l a i n v a l v o n t a v i r a s t o j e n + l a i n v a l v o n t a y h t e i s t y ö n + l a i n v a l v o n t a y k s i k ö t + l a i n v a s t a i n e n + l a i n v a s t a i s e e n + l a i n v a s t a i s e n a + l a i n v a s t a i s e s s a + l a i n v a s t a i s e s t i + l a i n v a s t a i s i a + l a i n v a s t a i s i i n + l a i n v a s t a i s i k s i + l a i n v a s t a i s t a + l a i n v a s t a i s t e n + l a i n v a s t a i s u u d e s t a + l a i n v a s t a i s u u k s i i n + l a i n v a s t a i s u u s + l a i n v o i m a + l a i n v o i m a a + l a i n v o i m a a n + l a i n v o i m a i n e n + l a i n v o i m a i s e e n + l a i n v o i m a i s e k s i + l a i n v o i m a i s e s t a + l a i n v o i m a i s i a + l a i n v o i m a i s i k s i + l a i n v o i m a i s t a + l a i n v o i m a i s u u t e e n + l a i n v o i m a i s u u t t a + l a i n v o i m a n + l a i n v o i m a s t a + l a i s k e m m a t + l a i s s a + l a i s t a a + l a i s t a v a t + l a i t a h y ö k k ä ä j ä + l a i t e a j u r i + l a i t e h a n k i n n a t + l a i t e h a n k i n t o i h i n + l a i t e k a n t a a n + l a i t e k ä s i k i r j o i l l e + l a i t e m a r k k i n o i t a + l a i t e r a k e n t e e n + l a i t e r o m u n + l a i t e r o m u s t a + l a i t e s t a n d a r d e j a + l a i t e s u k e l l u s + l a i t e t a a n p a + l a i t e t t a + l a i t e t u o t a n t o a l a n + l a i t e t y y p p i + l a i t e v a l m i s t a j a t + l a i t e v a l m i s t a j i a + l a i t e v a l m i s t a j i e n + l a i t e v i a n + l a i t e v i a s t a + l a i t o k s e l l e + l a i t o k s e n + l a i t o k s e s s a + l a i t o k s e t + l a i t o k s i a + l a i t o k s i a a n + l a i t o k s i i n + l a i t o k s i l l a + l a i t o k s i l l e + l a i t o k s i s s a + l a i t o k s i s t a + l a i t o n t a + l a i t o s a s u m i s e l l e + l a i t o s h o i d o n + l a i t o s h o i d o s s a + l a i t o s h o i d o s t a + l a i t o s h o i t o a + l a i t o s o l o i s t a + l a i t o s t e n + l a i t t a a + l a i t t a i s i + l a i t t a k a a m m e + l a i t t e e n s a + l a i t t e e s e e n + l a i t t e e s t a + l a i t t e e t + l a i t t e i d e n + l a i t t e i l l a + l a i t t e i s i i n + l a i t t e i s t a + l a i t t e i s t a a n + l a i t t e i s t o a l a l l a + l a i t t e i s t o i n v e s t o i n t e j a + l a i t t e i s t o j e n + l a i t t e i s t o k i i h d y t y s + l a i t t e i s t o k u s t a n n u k s e t + l a i t t e i s t o k u s t a n n u k s i a + l a i t t e i s t o k u v a u s k i e l i + l a i t t e i s t o n + l a i t t e i s t o t a r p e i s t a + l a i t t e i s t o v a l m i s t a j i e n + l a i t t e i t a + l a i t t e i t a a n + l a i t t o m a a n + l a i t t o m a k s i + l a i t t o m a l l a + l a i t t o m a l t a + l a i t t o m a n + l a i t t o m a n a + l a i t t o m a s s a + l a i t t o m a s t a + l a i t t o m a t + l a i t t o m i a + l a i t t o m i e n + l a i t t o m i i n + l a i t t o m i k s i + l a i t t o m i l l e + l a i t t o m i n a + l a i t t o m i s s a + l a i t t o m i s t a + l a i t t o m u u d e t + l a i t t o m u u k s i a + l a i t t o m u u k s i e n + l a i t t o m u u k s i i n + l a i t t o m u u k s i l t a + l a i t t o m u u k s i s t a + l a i t t o m u u s o l e t u s + l a i t t o m u u s t i l a n t e i s s a + l a i t u m i a + l a i t u m i e n + l a i t u m i l l a + l a i t u m i l l e + l a i t u m i l t a + l a i t u r i i n + l a i t u r i o v i + l a i t u r i s t a + l a i v a a n + l a i v a d i r e k t i i v i + l a i v a i n r a k e n n u s t e o l l i s u u t t a + l a i v a k a a p p a u s + l a i v a k u l j e t u k s i i n + l a i v a l a t o m u s + l a i v a l i i k e n n e t e o l l i s u u d e l l e + l a i v a l i i k e n n e t t ä + l a i v a l i i k e n t e e l l e + l a i v a l i i k e n t e e n + l a i v a l i i k e n t e e s e e n + l a i v a l i i k e n t e e s t ä + l a i v a l i n j o j a + l a i v a l l a + l a i v a m a t k u s t a j i a + l a i v a m a t o + l a i v a n + l a i v a n k o r j a u s t a + l a i v a n k o r j a u s t e o l l i s u u d e n + l a i v a n k o r j a u s t e o l l i s u u s + l a i v a n m o o t t o r e i h i n + l a i v a n o m i s t a j a t + l a i v a n o m i s t a j i e n + l a i v a n o m i s t a j i l l a + l a i v a n o m i s t a j i l l e + l a i v a n o m i s t a j i l t a + l a i v a n r a k e n n u k s e s t a + l a i v a n r a k e n n u s a l a + l a i v a n r a k e n n u s a l a a + l a i v a n r a k e n n u s a l a a m m e + l a i v a n r a k e n n u s a l a a n + l a i v a n r a k e n n u s a l a l l a + l a i v a n r a k e n n u s a l a l l e + l a i v a n r a k e n n u s a l a l t a + l a i v a n r a k e n n u s a l a n + l a i v a n r a k e n n u s a l o j a + l a i v a n r a k e n n u s d i r e k t i i v i + l a i v a n r a k e n n u s i n t e r v e n t i o r a h a s t o n + l a i v a n r a k e n n u s k a p a s i t e e t t i + l a i v a n r a k e n n u s k a p a s i t e e t t i a + l a i v a n r a k e n n u s l a i t o s + l a i v a n r a k e n n u s m a a + l a i v a n r a k e n n u s m a i t a + l a i v a n r a k e n n u s m a r k k i n a t + l a i v a n r a k e n n u s m a r k k i n o i d e n + l a i v a n r a k e n n u s m a r k k i n o i h i n + l a i v a n r a k e n n u s m a r k k i n o i l l a + l a i v a n r a k e n n u s m a r k k i n o i l l e + l a i v a n r a k e n n u s m a r k k i n o i t a + l a i v a n r a k e n n u s o h j e l m a a + l a i v a n r a k e n n u s p o l i t i i k a n + l a i v a n r a k e n n u s p o l i t i i k a s t a + l a i v a n r a k e n n u s p o l i t i i k k a + l a i v a n r a k e n n u s p o l i t i i k k a a + l a i v a n r a k e n n u s p o l i t i i k k a a n s a + l a i v a n r a k e n n u s s a t a m i s t a + l a i v a n r a k e n n u s s e k t o r i l l a + l a i v a n r a k e n n u s t a + l a i v a n r a k e n n u s t e l a k o i d e n + l a i v a n r a k e n n u s t e o l l i s u u d e l l a + l a i v a n r a k e n n u s t e o l l i s u u d e l l e + l a i v a n r a k e n n u s t e o l l i s u u d e n + l a i v a n r a k e n n u s t e o l l i s u u d e s s a + l a i v a n r a k e n n u s t e o l l i s u u d e s t a + l a i v a n r a k e n n u s t e o l l i s u u s + l a i v a n r a k e n n u s t e o l l i s u u s a l u e i d e n + l a i v a n r a k e n n u s t e o l l i s u u t e e n + l a i v a n r a k e n n u s t e o l l i s u u t e m m e + l a i v a n r a k e n n u s t e o l l i s u u t e n s a + l a i v a n r a k e n n u s t e o l l i s u u t t a + l a i v a n r a k e n n u s t e o l l i s u u t t a a n + l a i v a n r a k e n n u s t e o l l i s u u t t a m m e + l a i v a n r a k e n n u s t u i s t a + l a i v a n r a k e n n u s t u k e a + l a i v a n r a k e n t a j a v a l t i o t + l a i v a n r a k e n t a j i e n + l a i v a n r o m u t t a m i n e n + l a i v a n r o m u t t a m i s e e n + l a i v a n r o m u t u k s e e n + l a i v a n r o m u t u k s e n + l a i v a n r o m u t u s + l a i v a n r o m u t u s k ä y t ä n n ö t + l a i v a n r o m u t u s s t r a t e g i a + l a i v a n r o m u t u s t o i m i n n a n + l a i v a n r o m u t u s t o i m i n t a a + l a i v a n r o m u t u s t o i m i n t a a n + l a i v a n r u n k o j e n + l a i v a n s a + l a i v a n v a r u s t a j a n + l a i v a n v a r u s t a j a t + l a i v a n v a r u s t a j i a + l a i v a n v a r u s t a j i e n + l a i v a n v a r u s t a j i l l e + l a i v a n v a r u s t a j i s t a + l a i v a n v a r u s t a m o i d e n + l a i v a n v a r u s t a m o i h i n + l a i v a n v a r u s t a m o i l l e + l a i v a n v a r u s t a m o j a + l a i v a o n n e t t o m u u d e t + l a i v a o n n e t t o m u u k s i e n + l a i v a p o l t t o a i n e i t a + l a i v a r e i t e i s t ä + l a i v a r e i t i l l ä + l a i v a r e i t i t + l a i v a r e i t t e j ä + l a i v a r e i t t i e n + l a i v a r e k i s t e r i n + l a i v a s a a t t u e e s t a + l a i v a s t a + l a i v a s t o a + l a i v a s t o a l a + l a i v a s t o a r s e n a a l i + l a i v a s t o i h i m m e + l a i v a s t o i l l e + l a i v a s t o i n e e n + l a i v a s t o j a + l a i v a s t o j e n + l a i v a s t o k a l u s t o a + l a i v a s t o k a m p a n j a + l a i v a s t o k a p a s i t e e t i n + l a i v a s t o k a p a s i t e e t t i + l a i v a s t o k a p a s i t e e t t i a + l a i v a s t o k a p a s i t e e t t i a a n + l a i v a s t o k o o n + l a i v a s t o n + l a i v a s t o n o s i a + l a i v a s t o n t e l a k k a + l a i v a s t o p o l i t i i k a l l a + l a i v a s t o p o l i t i i k a l l e + l a i v a s t o p o l i t i i k a n + l a i v a s t o p o l i t i i k a s t a + l a i v a s t o p o l i t i i k k a + l a i v a s t o p o l i t i i k k a a + l a i v a s t o s e g m e n t i l l e + l a i v a s t o s e g m e n t i t + l a i v a s t o s e g m e n t t i e n + l a i v a s t o s e k t o r i l l a + l a i v a s t o s o p i m u s + l a i v a s t o s t a + l a i v a s t o t + l a i v a s t o t u k i k o h d a s s a + l a i v a s t o t y k k i + l a i v a s t o u p s e e r i + l a i v a s t o v a h v u u d e n + l a i v a s t o v a l m i u k s i a + l a i v a s t o v a l m i u k s i e n + l a i v a s t o y k s i k k ö j ä + l a i v a s t o y k s i k ö n + l a i v a s t o y k s i k ö t + l a i v a s u u n n i t t e l u + l a i v a t + l a i v a t a n k k i e n + l a i v a t e l a k a t + l a i v a t e l a k k a t e o l l i s u u t t a + l a i v a t e l a k o i d e n + l a i v a t e l a k o i l l e m m e + l a i v a t e l a k o i t a a n + l a i v a t e o l l i s u u d e n + l a i v a t e o l l i s u u t e e n + l a i v a t e o l l i s u u t e m m e + l a i v a t e o l l i s u u t t a + l a i v a t i l a u k s i a + l a i v a t u n n e l i + l a i v a t u o t a n t o a a n + l a i v a t u r v a l l i s u u d e s s a + l a i v a t u r v a l l i s u u t t a + l a i v a t y y p p e j ä + l a i v a t y y p p i e n + l a i v a u u t i s i a + l a i v a v a k u u t u s j ä r j e s t e l m ä ä + l a i v a v a r u s t e e t + l a i v a v a r u s t e i d e n + l a i v a v e r t a u s t a + l a i v a v ä y l i l l ä + l a i v a v ä y l i s t ä + l a i v a v ä y l i ä + l a i v a v ä y l ä t + l a i v a y h t i ö i d e n + l a i v a y h t i ö i h i n + l a i v a y h t i ö i l t ä + l a i v a y h t i ö i t ä + l a i v a y h t i ö l t ä + l a i v a y h t i ö n + l a i v a y h t i ö t + l a i v o i h i n + l a i v o i l l a + l a i v o i s s a + l a i v o i s t a + l a i v o j a + l a i v o j e n + l a j e i l l e + l a j e i s t a + l a j e j a + l a j i a + l a j i e m m e + l a j i e n + l a j i k e l i s t a l l e + l a j i k e r y h m ä + l a j i k e r y h m ä l l e + l a j i k i i n t i ö i t ä + l a j i k i i n t i ö n + l a j i k k e i d e n + l a j i k k e i k s i + l a j i k o h t a i n e n + l a j i k o h t a i s e s t i + l a j i k o h t a i s i a + l a j i k o h t a i s t a + l a j i l l a + l a j i l u e t t e l o s s a + l a j i n + l a j i n i m i e n + l a j i n m u k a i s e l l a + l a j i n m u k a i s t a + l a j i p u h t a u s + l a j i r a j a t + l a j i r y h m i s s ä + l a j i s s a a n + l a j i t + l a j i t e l t u j e n + l a j i t o v e r e i t a + l a j i t o v e r e i t a a n + l a j i t t e l u a l g o r i t m i + l a j i t t e l u m e n e t e l m i e n + l a j i t t e l u o h j e l m i a + l a j i t t e l u r i s t i k o i l l a + l a j i t t e l u t e k n o l o g i a a + l a k a i s e e + l a k a i s e m a a n + l a k a i s i t t e + l a k a i s t a + l a k a i s t a v a + l a k a t a + l a k a t k a a + l a k a t k a a m m e + l a k a t k o o n + l a k a t t a v a + l a k e i h i n + l a k e j a + l a k e l a n d i n t e r r i e r i + l a k i a + l a k i a l o i t e o i k e u s + l a k i a l o i t e t t a + l a k i a l o i t t e e l l a + l a k i a l o i t t e e n + l a k i a l o i t t e e s e e n + l a k i a l o i t t e e s t a + l a k i a l o i t t e i d e n + l a k i a l o i t t e i s i i n + l a k i a l o i t t e i s t a + l a k i a l o i t t e i t a + l a k i a m m a t t i e n + l a k i a p u u n + l a k i a r s e n a a l i a + l a k i a s e t u s r i k k o m u k s i a + l a k i a s e t u s t a + l a k i a s e t u s t e n + l a k i a s i a i n t o i m i s t o j a + l a k i a s i a i n t o i m i s t o l l e + l a k i a s i a i n t o i m i s t o t + l a k i a s i a i n v a l i o k u n n a n + l a k i a s i a n t u n t i j a + l a k i a s i a n t u n t i j a t + l a k i a s i a n t u n t i j o i d e n + l a k i a s i a n t u n t i j o i t a n n e + l a k i a s i o i t a + l a k i a s ä ä t ä v ä n + l a k i a s ä ä t ä v ä n ä + l a k i a s ä ä t ä v ä s t ä + l a k i a v u s t a + l a k i e h d o t u k s e e n + l a k i e h d o t u k s e n + l a k i e h d o t u k s e n s a + l a k i e h d o t u k s e s s a + l a k i e h d o t u k s e s t a + l a k i e h d o t u k s e t + l a k i e h d o t u k s i a + l a k i e h d o t u k s i e n + l a k i e h d o t u k s i s t a + l a k i e h d o t u s l i s t a a + l a k i e h d o t u s l u o n n o k s i a + l a k i e h d o t u s o i k e u s + l a k i e h d o t u s t a + l a k i e h d o t u s t e n + l a k i e h d o t u s t e n s a + l a k i e n + l a k i e n s a + l a k i e s i t y k s e e n + l a k i e s i t y k s e l l ä + l a k i e s i t y k s e n + l a k i e s i t y k s e s t ä + l a k i e s i t y k s e t + l a k i e s i t y k s i ä + l a k i e s i t y s l u o n n o k s e n + l a k i e s i t y s t ä + l a k i h a n k e + l a k i h a n k k e i t a + l a k i i n + l a k i j ä r j e s t e l m i e n + l a k i j ä ä t i k ö t + l a k i k e h y k s e e n + l a k i k e h y k s e s s ä + l a k i k e h y s t ä + l a k i k i e l e l l ä + l a k i k i r j a a n + l a k i k i r j a s t a + l a k i k i r j o i s t a + l a k i k o k o e l m a n + l a k i k o k o n a i s u u d e s s a + l a k i k o k o n a i s u u s + l a k i k o m i t e a n + l a k i k o n e i s t o + l a k i k o u l u t u s k e s k u k s e n + l a k i k ä s i t t e e s t ä + l a k i k ä s i t t e i t ä + l a k i l u e t t e l o a + l a k i l u o n n o k s e e n + l a k i l u o n n o k s e l l a + l a k i l u o n n o k s e n + l a k i l u o n n o k s e s t a + l a k i l u o n n o k s e t + l a k i l u o n n o s + l a k i l u o n n o s t a + l a k i m i e h e n + l a k i m i e h e n ä + l a k i m i e h e t + l a k i m i e h i ä + l a k i m i e s a m m a t i n + l a k i m i e s a m m a t t e j a + l a k i m i e s a m m a t t i e n + l a k i m i e s a m m a t t i k u n t a + l a k i m i e s a r m e i j o i l l e e n + l a k i m i e s h a r j o i t t e l i j a n a + l a k i m i e s j ä r j e s t ö j e n + l a k i m i e s j ä r j e s t ö t + l a k i m i e s k o l l e g o i d e n i + l a k i m i e s k u n n a l l e + l a k i m i e s k u n n a l t a + l a k i m i e s k u n t a + l a k i m i e s t e n + l a k i m i e s v e r k o s t o + l a k i m m e + l a k i m u u t o k s i a + l a k i m u u t o k s i i n + l a k i m u u t o s e h d o t u k s e n s a + l a k i m u u t o s t e n + l a k i m ä ä r ä y s m e n e t t e l y j e n + l a k i n s a + l a k i n ä k ö k o h d i s t a + l a k i o s a s t o + l a k i o s a s t o a m m e + l a k i o s a s t o l l e + l a k i o s a s t o l l e m m e + l a k i o s a s t o l t a + l a k i o s a s t o l t a n n e + l a k i o s a s t o m m e + l a k i o s a s t o n + l a k i p a k e t i l l e + l a k i p a k e t t i + l a k i p a k e t t i a + l a k i p a k e t t i i n + l a k i p a l v e l u j e n + l a k i p e r u s t a a + l a k i p o h j a n + l a k i p u i t e + l a k i p y k ä l i e n + l a k i p y k ä l i ä + l a k i r a t k a i s u a + l a k i s ä ä d ö k s i ä + l a k i s ä ä d ö s t ä + l a k i s ä ä t e i s e n + l a k i s ä ä t e i s e t + l a k i s ä ä t e i s i i n + l a k i s ä ä t e i s i n + l a k i s ä ä t e i s i ä + l a k i t + l a k i t e h d a s + l a k i t e k s t e i h i n + l a k i t e k s t e i k s i + l a k i t e k s t e i n ä + l a k i t e k s t e i s s ä + l a k i t e k s t e i s t ä + l a k i t e k s t e j ä + l a k i t e k s t i e n + l a k i t e k s t i e n n e + l a k i t e k s t i i n + l a k i t e k s t i k s i + l a k i t e k s t i n + l a k i t e k s t i s s ä + l a k i t e k s t i s t ä + l a k i t e k s t i t + l a k i t e k s t i ä + l a k i t e r m e i n + l a k i t e r m e j ä + l a k i t i e d o n + l a k i t i e t o a + l a k i t o i m i s t o i s t a + l a k i t o i m i s t o j a + l a k i t y h j i ö t ä + l a k i u u d i s t u k s e n + l a k i u u d i s t u k s e t + l a k i u u d i s t u k s i s s a + l a k i u u d i s t u s m i n i s t e r i ö n + l a k i u u d i s t u s p a k e t i n + l a k i u u d i s t u s t a + l a k i u u d i s t u s t e n + l a k i v a a t i m u s t e n + l a k i v ä l i n e i d e n + l a k k a a m m e + l a k k a a v a t + l a k k a k ä ä p ä + l a k k a s i k i n + l a k k a s p r i i + l a k k a u t e t a a n + l a k k a u t e t t a i s i i n + l a k k a u t e t t a v a + l a k k a u t e t t u j a + l a k k a u t t a a + l a k k a u t t a i s i + l a k k a u t t a k a a m m e + l a k k a u t t a m a a n + l a k k a u t t a m a l l a + l a k k a u t t a m i s e h d o t u k s e s t a + l a k k a u t t a m i s e h d o t u s + l a k k a u t t a m i s e n + l a k k a u t t a m i s e s t a + l a k k a u t t a m i s t a + l a k k a u t t a m i s t o i m i l l a + l a k k a u t t a m i s v a i h e i d e n + l a k k i m e s i k k o + l a k k o a + l a k k o i l l e e t + l a k k o i l u n + l a k k o j a + l a k k o k a l e n t e r i a + l a k k o l i i k k e i s t ä + l a k k o n e u v o t t e l u t + l a k k o o n + l a k k o s u l k u j a + l a k k o t o i m e n p i t e i n + l a k k o t o i m e t + l a k k o t o i m i s t a + l a k k o v a p a u t e e n + l a k k o v a r t i o o n + l a k k o v a r t i o t + l a k m u s k o e + l a k m u s p a p e r i k o e + l a k m u s t e s t i + l a k o n + l a k o n r i k k o j i l l e + l a k o s s a + l a k o t a t + l a k r i t s i p i i p u t + l a k r i t s i r o u s k u + l a m a a n n u k s e s s a + l a m a a n n u t t a a + l a m a a n n u t t a v i a + l a m a a n t u i + l a m a a n t u i s i + l a m a a n t u i v a t + l a m a a n t u m a a n + l a m a a n t u m i s a i k a a + l a m a a n t u n e i s u u d e s t a m m e + l a m a a n t u u + l a m a k a u s i + l a m a n + l a m a n t i i n i + l a m a o l o s u h t e i s s a + l a m a u t t a a + l a m a u t u n u t t a + l a m a v u o t t a + l a m b a d i + l a m b d a k a l k y y l i + l a m b e r t i a + l a m b e r t i n + l a m i n a a t t i l a t t i a + l a m m a s a l a + l a m m a s a l a a + l a m m a s a l a l l a + l a m m a s a l a l l e + l a m m a s a l a n + l a m m a s a l k i o i d e n + l a m m a s k a n t a + l a m m a s k i i n t i ö i t ä + l a m m a s k u l j e t u s t e n + l a m m a s l a u m a + l a m m a s l a u m a a + l a m m a s t a r h a u s m e n e t t e l y j e n + l a m m a s t e o l l i s u u d e n + l a m m a s t e o l l i s u u t t a + l a m m a s t i l o j e n + l a m m a s t u o t a n n o n + l a m m a s t u o t a n n o s t a + l a m m i k k o v i l j e l y l l ä + l a m m i k k o v i l j e l y n + l a m p a a n k a s v a t t a j a + l a m p a a n k a s v a t t a j a t + l a m p a a n k a s v a t t a j i e n + l a m p a a n k a s v a t t a j i i m m e + l a m p a a n k a s v a t t a j i l l e + l a m p a a n k a s v a t u k s e n + l a m p a a n k a s v a t u k s e s s a + l a m p a a n k a s v a t u k s e s t a + l a m p a a n k a s v a t u s + l a m p a a n k a s v a t u s a l a + l a m p a a n k a s v a t u s a l a a + l a m p a a n k a s v a t u s a l a a m m e + l a m p a a n k a s v a t u s a l a n + l a m p a a n l i h a a + l a m p a a n l i h a s t a + l a m p a a n m a i d o l l a + l a m p a a n m a i t o j u u s t o a + l a m p a a n n a h k a i s i a + l a m p a a n n a t a + l a m p a a n n e n ä s a i v a r t a j a + l a m p a a n r u h o n + l a m p a a n t u o t a n n o n + l a m p a a n t u o t a n t o + l a m p a a n t u o t a n t o a l a a + l a m p a a n t u o t a n t o o n + l a m p a a t k i n + l a m p a i d e n + l a m p a i l l e + l a m p a i s i i n + l a m p a i s t a + l a m p a i t a + l a m p i s i i p p a + l a m p i s o r s a + l a m p i v i k l o + l a m p p u j a + l a m p p u j e n + l a m p p u k ä r p ä n e n + l a m p u t + l a n g a t + l a n g a t t o m a a n + l a n g a t t o m i i n + l a n g e t e t a a n + l a n g e t e t t a e s s a + l a n g e t e t t a v a + l a n g e t e t t a v a s t a + l a n g e t e t t a v i e n + l a n g e t e t t i i n + l a n g e t e t t u + l a n g e t e t t u a + l a n g e t e t t u j e n + l a n g e t e t u i l l a + l a n g e t e t u i s t a + l a n g e t t a a + l a n g e t t a m i s e k s i + l a n g o t + l a n k a l a u a n t a i + l a n k a p u h e l i m i i n + l a n k a p u h e l i n t e n + l a n k a p u h e l u j e n + l a n k a p y r s t ö + l a n k e a a + l a n k e a m a s t a + l a n k e a v a t + l a n k k u j u u r i + l a n n a s t a + l a n n e h a l v a u s + l a n n i s t a a + l a n n i s t a m a t t a + l a n n i s t a v a a + l a n n i s t a v a m p a a + l a n n i s t e t a a n + l a n n i s t u i + l a n n o i t e a n n o k s e n + l a n n o i t e d i r e k t i i v i n + l a n n o i t e l i e t e a s i a s s a + l a n n o i t e p u l s s i n + l a n n o i t e r a s i t u s t a + l a n n o i t e t e h t a a n + l a n n o i t e t e h t a a s t a + l a n n o i t e t e h t a i d e n + l a n n o i t e t u o t a n t o + l a n n o i t e t u o t t e i s i i n + l a n n o i t t e e n l e v i t i n + l a n n o i t t e e t + l a n n o i t t e i d e n + l a n n o i t t e i s t a + l a n n o i t t e i t a + l a n t a a n i o k s i d i + l a n t a k a u l u s s i e n i + l a n t a m a d o n l a k k i + l a n t a n a + l a n t a y l i j ä ä m i i n + l a n t t i l a u t a p e l i + l a o d i k e a + l a o s i l a i s t e n + l a p a s o r s a + l a p a s o t k a + l a p i n + l a p i n a l p p i r u u s u + l a p i n k a s t i k k a + l a p i n k e l t a p e r h o n e n + l a p i n k y n s i m ö + l a p i n k ä m m e k k ä + l a p i n l e i n i k k i + l a p i n l e m m i k k i + l a p i n n o k i p e r h o n e n + l a p i n o r v o k k i + l a p i n u u n i l i n t u + l a p s e e n + l a p s e l l a + l a p s e l l e + l a p s e l l e e n + l a p s e l l i s t a + l a p s e m m e + l a p s e n + l a p s e n a + l a p s e n i + l a p s e n k e n g i s s ä + l a p s e n k e n g i s s ä ä n + l a p s e n l a p s i l l e m m e k i n + l a p s e n m u r h a a j a n + l a p s e n m u r h a a j i a + l a p s e n m u r h i i n + l a p s e n p e s u + l a p s e n r a i s k a a j a a + l a p s e n r a i s k a a j i a + l a p s e n s a + l a p s e n s a a m i s i ä s s ä + l a p s e n s u o j e l u a + l a p s e n t a p p a j a + l a p s e n v a h t e j a + l a p s e n ä ä n i + l a p s e s i + l a p s e s t a + l a p s e t + l a p s e t t o m i e n + l a p s e t t o m i l l a + l a p s e t t o m u u s h o i t o j e n + l a p s i a + l a p s i a a n + l a p s i a m m e + l a p s i a s i a a n + l a p s i a s i a m i e h e t + l a p s i a s i a n + l a p s i a v i o l i i t o i l l e + l a p s i a v i o l i i t o t + l a p s i a v i o l i i t t o j a + l a p s i e n + l a p s i h a l v a u s + l a p s i i n + l a p s i i n s a + l a p s i k a a p p a u k s e n + l a p s i k a a p p a u k s e s t a + l a p s i k a a p p a u k s e t + l a p s i k a a p p a u k s i a + l a p s i k a a p p a u k s i i n + l a p s i k a a p p a u k s i s t a + l a p s i k a a p p a u s + l a p s i k a a p p a u s t a p a u k s i s s a + l a p s i k a a p p a u s t e n + l a p s i k a u p a n + l a p s i k a u p a s t a + l a p s i k a u p p a + l a p s i k a u p p a a + l a p s i k a u p p a a n + l a p s i k a u p p i a i d e n + l a p s i k a u p p i a i t a + l a p s i k e r j ä l ä i s t e n + l a p s i k e s k e i s e m p ä ä + l a p s i k e s k e i s e n + l a p s i k e s k e i s t ä + l a p s i k i n + l a p s i k u o l e m a a + l a p s i k u o l e m i s t a + l a p s i k u o l l e i s u u d e n + l a p s i k u o l l e i s u u d e s s a + l a p s i k u o l l e i s u u d e s t a + l a p s i k u o l l e i s u u s + l a p s i k u o l l e i s u u s l u k u j a + l a p s i k u o l l e i s u u s l u v u t + l a p s i k u o l l e i s u u t e e n + l a p s i k u o l l e i s u u t e n a + l a p s i k u o l l e i s u u t t a + l a p s i k ö y h y y d e n + l a p s i k ö y h y y s + l a p s i k ö y h y y s o n g e l m a a + l a p s i k ö y h y y t e e n + l a p s i k ö y h y y t t ä + l a p s i l i s i e n + l a p s i l i s i ä + l a p s i l i s ä + l a p s i l i s ä p o l i t i i k k a a n + l a p s i l i s ä ä + l a p s i l l a + l a p s i l l e + l a p s i l l e e n + l a p s i l l e k a a n + l a p s i l l e m m e + l a p s i l l e n s a + l a p s i l t a + l a p s i l u k k o + l a p s i m a i n o k s i i n + l a p s i m a r k k i n o i n a + l a p s i m u r h i s t a + l a p s i m ä ä r ä + l a p s i m ä ä r ä s t ä + l a p s i n e r o + l a p s i o i k e u s a s i a m i e h e n + l a p s i o r j a a + l a p s i o r j a t + l a p s i o r j i e n + l a p s i o r j u u d e s t a + l a p s i o r j u u s + l a p s i p a k o l a i n e n + l a p s i p a k o l a i s e t + l a p s i p a r k a + l a p s i p e r h e e t + l a p s i p e r h e i d e n + l a p s i p e r h e i l l e + l a p s i p e r h e i s i i n + l a p s i p e r h e i s t ä + l a p s i p e r h e i t ä + l a p s i p o l i t i i k k a a + l a p s i p o r n o + l a p s i p o r n o a + l a p s i p o r n o a i n e i s t o n + l a p s i p o r n o g r a f i a + l a p s i p o r n o g r a f i a a + l a p s i p o r n o g r a f i a a n + l a p s i p o r n o g r a f i a l l a + l a p s i p o r n o g r a f i a l t a + l a p s i p o r n o g r a f i a n + l a p s i p o r n o g r a f i a r i k o k s i s s a + l a p s i p o r n o g r a f i a s i v u s t o i l l e + l a p s i p o r n o g r a f i a s i v u s t o j a + l a p s i p o r n o g r a f i a s s a + l a p s i p o r n o g r a f i a s t a + l a p s i p o r n o g r a f i a v e r k k o j a + l a p s i p o r n o g r a f i a v e r k o s t o t + l a p s i p o r n o g r a f i n e n + l a p s i p o r n o g r a f i s e l l a + l a p s i p o r n o g r a f i s e n + l a p s i p o r n o g r a f i s i a + l a p s i p o r n o g r a f i s t a + l a p s i p o r n o g r a f i s t e n + l a p s i p o r n o k a u p p a + l a p s i p o r n o k u v i a + l a p s i p o r n o n + l a p s i p o r n o o n + l a p s i p o r n o r i k o k s i s t a + l a p s i p o r n o s t a + l a p s i p o r n o t a p a u k s e t + l a p s i p o t i l a i d e n + l a p s i p o t i l a i l l e + l a p s i p r o s t i t u o i d u i s t a + l a p s i p r o s t i t u o i t u j a + l a p s i p r o s t i t u u t i o + l a p s i p r o s t i t u u t i o n + l a p s i p r o s t i t u u t i o o n + l a p s i p r o s t i t u u t i o s t a + l a p s i p r o s t i t u u t i o t a + l a p s i p u o l e n + l a p s i r i k o l l i s t e n + l a p s i r y h m i l l e + l a p s i r y h m i ä + l a p s i s e k s i k a u p p a + l a p s i s e k s i m a i n o s t e n + l a p s i s e k s i m a t k a i l u + l a p s i s e k s i m a t k a i l u a + l a p s i s e k s i m a t k a i l u n + l a p s i s e k s i m a t k a i l u u n + l a p s i s e k s i t u r i s m i a + l a p s i s e k s i t u r i s m i l t a + l a p s i s e k s i t u r i s m i n + l a p s i s e k s i t u r i s m i s t a + l a p s i s i n f o n i a + l a p s i s o t i l a a k s i + l a p s i s o t i l a a n a + l a p s i s o t i l a a t + l a p s i s o t i l a i d e n + l a p s i s o t i l a i k s i + l a p s i s o t i l a i l l e + l a p s i s o t i l a i n a + l a p s i s o t i l a i s i i n + l a p s i s o t i l a i s t a + l a p s i s o t i l a i s t a a n + l a p s i s o t i l a i t a + l a p s i s o t i l a s + l a p s i s o t i l a s k y s y m y k s e s s ä + l a p s i s o t i l a s o n g e l m a a + l a p s i s o t i l a s t a + l a p s i s t a + l a p s i s t a m m e + l a p s i s u k u p o l v e l l a + l a p s i t t a + l a p s i t y ö + l a p s i t y ö h ö n + l a p s i t y ö l l e + l a p s i t y ö l t ä + l a p s i t y ö l ä i s t ä + l a p s i t y ö n + l a p s i t y ö n t e k i j ö i k s i + l a p s i t y ö s t ä + l a p s i t y ö t ä + l a p s i t y ö v o i m a + l a p s i t y ö v o i m a a + l a p s i t y ö v o i m a a n + l a p s i t y ö v o i m a l l a + l a p s i t y ö v o i m a n + l a p s i t y ö v o i m a s s a + l a p s i t y ö v o i m a s t a + l a p s i t y ö v o i m i n + l a p s i u h r e i h i n + l a p s i u h r e i l l e + l a p s i u h r e i s t a + l a p s i u h r e j a + l a p s i u h r i e n + l a p s i u h r i t + l a p s i v a r a s t o n a + l a p s i v i h a m i e l i s e m m ä k s i + l a p s i v u o d e + l a p s i y s t ä v ä l l i n e n + l a p s i y s t ä v ä l l i s e l l ä + l a p s i y s t ä v ä l l i s e m m ä k s i + l a p s i y s t ä v ä l l i s e m m ä n + l a p s i y s t ä v ä l l i s e m p ä ä + l a p s i y s t ä v ä l l i s e n + l a p s i y s t ä v ä l l i s i m m ä k s i + l a p s i y s t ä v ä l l i s i ä + l a p s i y s t ä v ä l l i s t e n + l a p s u u d e n k o t i + l a p s u u d e s s a + l a p s u u d e s s a a n + l a p s u u d e s t a + l a p s u u s e v a n k e l i u m i + l a p s u u s m u i s t o n i + l a p s u u s v u o t e n i + l a s e r e t ä i s y y s m i t t a r i + l a s e r h a r p p u + l a s e r k e i l a u s + l a s e r l e i k k a u s + l a s e r o s o i t i n + l a s e r o s o i t t i m e t + l a s e r s y t y t y s + l a s e r s ä t e e t + l a s e r t e k n i i k k a + l a s e r t u l o s t i m i e n + l a s e r t u l o s t i n + l a s i a l a + l a s i a l a a + l a s i a n k e r i a a n + l a s i a n k e r i a i d e n + l a s i a n k e r i a i t a + l a s i a n k e r i a s + l a s i a n k e r i a s k a n t a + l a s i a n k e r i a s k a n t o j a + l a s i a n k e r i a s t a + l a s i h a r m o n i k k a + l a s i h e l m i p e l i + l a s i k a i t e e t + l a s i k a t o l l a + l a s i k a t o n + l a s i k a t o s t a + l a s i k a t t o + l a s i k a t t o i l m i ö + l a s i k a t t o o n + l a s i k a u p a s s a + l a s i k o p e i s s a + l a s i k o t i l o + l a s i k u i t u + l a s i k u i t u k a a p e l i v e r k o n + l a s i k u i t u t a p a u k s e s t a + l a s i k u v u s s a + l a s i l i m a e t a n a + l a s i l l i s e n + l a s i m a a l a u s + l a s i m a l l i e n + l a s i m u u r i n + l a s i n + l a s i n a l u n e n + l a s i n e g a t i i v i + l a s i n k i r k k a a l l a + l a s i o h j a a m o + l a s i p a l a t s e i s s a + l a s i p a l a t s i a + l a s i p a l l o n + l a s i p u l l o i h i n + l a s i p u l l o i s s a + l a s i p u l l o j e n + l a s i p u r k i s s a + l a s i s t a + l a s i t a l o i s s a + l a s i t a l o s s a + l a s i t e h d a s + l a s i t e o l l i s u u d e n + l a s i t e t r a + l a s i t i i l i + l a s i t o r n e i h i n s a + l a s i t o r n i s s a + l a s i t o r n i s t a + l a s i t o r n i s t a a n + l a s i t r a n s i t i o + l a s i v e i t s i k a l a t + l a s k e a + l a s k e a k s e e n + l a s k e e + l a s k e l m a n + l a s k e l m a t + l a s k e l m i a + l a s k e l m i e n + l a s k e l m i e n i + l a s k e l m i s s a + l a s k e l m i s t a + l a s k e l m o i v i a + l a s k e m a a n + l a s k e m a l l a + l a s k e m i s e k s i + l a s k e m i s e l t a + l a s k e m i s t a + l a s k e m i s t a p a a + l a s k e n e e t + l a s k e n n a l l i s e e n + l a s k e n n a l l i s t a + l a s k e n n a n + l a s k e n t a e s i m e r k k i e n + l a s k e n t a j ä r j e s t e l m i e n + l a s k e n t a j ä r j e s t e l m i s s ä + l a s k e n t a j ä r j e s t e l m ä + l a s k e n t a j ä r j e s t e l m ä l l e + l a s k e n t a j ä r j e s t e l m ä n + l a s k e n t a k a a v a + l a s k e n t a k r i t e e r i i n + l a s k e n t a k u l u k o r v a u k s i a + l a s k e n t a l a j i t t e l u + l a s k e n t a m a l l e i l l a + l a s k e n t a m a l l e i s t a + l a s k e n t a m a l l i + l a s k e n t a m a l l i n + l a s k e n t a m a l l i t + l a s k e n t a m e n e t e l m i e n + l a s k e n t a m e n e t e l m i i n + l a s k e n t a m e n e t e l m i l l ä + l a s k e n t a m e n e t e l m i s t ä + l a s k e n t a m e n e t e l m i ä + l a s k e n t a m e n e t e l m ä + l a s k e n t a m e n e t e l m ä l l ä + l a s k e n t a m e n e t e l m ä n + l a s k e n t a m e n e t e l m ä s t ä + l a s k e n t a m e n e t e l m ä t + l a s k e n t a m e n e t e l m ä ä + l a s k e n t a m e n e t t e l y + l a s k e n t a m e n e t t e l y j ä + l a s k e n t a p e r u s t e e n + l a s k e n t a p e r u s t e e n a + l a s k e n t a p e r u s t e e t + l a s k e n t a p e r u s t e i d e n + l a s k e n t a p e r u s t e i s t a + l a s k e n t a p e r u s t e i t a + l a s k e n t a p e r u s t e t t a + l a s k e n t a p o h j a a + l a s k e n t a s o t k u n + l a s k e n t a s ä ä n n ö t + l a s k e n t a t a p a + l a s k e n t a t a p a a + l a s k e n t a t a p o j a + l a s k e n t a t a v a n + l a s k e n t a t a v a s s a + l a s k e n t a t a v a t + l a s k e n t a t u l o k s i s t a + l a s k e n t a v a i h e e n + l a s k e n t a v i r h e + l a s k e t a a n + l a s k e t t a e s s a + l a s k e t t a i s i i n + l a s k e t t e l u k e s k u k s i s t a + l a s k e t t e l u r i n t e i s i i n + l a s k e t t u n a + l a s k e u d u t t u a m m e + l a s k e u m a l t a + l a s k e u m a n + l a s k e u t u e s s a + l a s k e u t u m i s e n + l a s k e u t u m i s k i e l t o + l a s k e u t u m i s l u p i a a n + l a s k e u t u m i s l u p i e n + l a s k e u t u m i s l u v a n + l a s k e u t u m i s l u v a t + l a s k e u t u m i s m a h d o l l i s u u k s i a + l a s k e u t u m i s m a k s u i s s a + l a s k e u t u m i s m a k s u j e n + l a s k e u t u m i s m a n ö ö v e r e i s s ä + l a s k e u t u m i s m e n e t e l m i e n + l a s k e u t u m i s m e n e t t e l y j ä + l a s k e u t u m i s o i k e u d e t + l a s k e u t u m i s o i k e u k s i a + l a s k e u t u m i s o i k e u k s i e n + l a s k e u t u m i s o i k e u t t a + l a s k e u t u m i s y r i t y k s e n + l a s k e v a a n + l a s k e v a n + l a s k e v a t + l a s k i m o t u k o s + l a s k o s t y r ä k k i + l a s k u a + l a s k u i s s a + l a s k u j a + l a s k u j ä r j e s t y s + l a s k u k a a n + l a s k u k a u d e l l a + l a s k u k a u p a k s i + l a s k u k i e r r e + l a s k u k i e r r o s + l a s k u k i e r t e e s e e n + l a s k u k o n e e t + l a s k u k o n e i s i i n + l a s k u l u v u t + l a s k u m e n e t e l m ä t + l a s k u n + l a s k u o p i l l i s e s t i + l a s k u p e r u s t a n a + l a s k u p o r t a i d e n + l a s k u s i i v e k k e e t + l a s k u s s a + l a s k u s t a + l a s k u s u h d a n n e + l a s k u s u h d a n n e v a i k u t u k s i s t a + l a s k u s u h d a n t e e n + l a s k u s u h d a n t e e s e e n + l a s k u s u h d a n t e e s s a + l a s k u s u h d a n t e e s t a + l a s k u s u h d a n t e i s t a + l a s k u s u u n t a + l a s k u s u u n t a a + l a s k u s u u n t a a n + l a s k u s u u n t a u k s e n + l a s k u s u u n t a u k s e s t a + l a s k u s u u n t a u s + l a s k u s u u n t a u s t a + l a s k u t + l a s k u t a i d o n + l a s k u t a p a a + l a s k u t a p a a n s a + l a s k u t a v a n + l a s k u t a v a s t a + l a s k u t e h t ä v ä + l a s k u t e h t ä v ä k s i + l a s k u t i k k u + l a s k u t o i m i t u k s e k s i + l a s k u t o i m i t u k s i i n + l a s k u t o i m i t u k s i s t a + l a s k u t t a a + l a s k u t u s j ä r j e s t e l m i ä + l a s k u t u s j ä r j e s t e l m ä n + l a s k u t u s j ä r j e s t e l m ä s t ä + l a s k u t u s k ä y t ä n n ö i s t ä + l a s k u t u s m e n e t e l m ä + l a s k u t u s s ä ä n n ö t + l a s k u t u s s ä ä n t ö j e n + l a s k u t u s t a l l e n t e i t a + l a s k u t u s t a r k o i t u k s i i n + l a s k u t u s t i e t o j e n + l a s k u u n + l a s k u v a r j o d i v i s i o o n a + l a s k u v a r j o h y p p ä ä j i ä + l a s k u v e d e n + l a s k u v i r h e e n + l a s k u v i r h e e s e e n + l a s k u v i r h e e s t ä + l a s k u š o k i l t a + l a s s a k u u m e + l a s t a a j i a + l a s t a a m i s e s t a + l a s t a t t a e s s a + l a s t a t t a v a + l a s t a t t i i n + l a s t a u s a i k a + l a s t a u s a l a n + l a s t a u s a s e m i a + l a s t a u s a s i a k i r j o i s s a + l a s t a u s h e n k i l ö k u n n a n + l a s t a u s h i s s i + l a s t a u s h i s s i e n + l a s t a u s h i s s i n + l a s t a u s l a i t t e i s t o s t a + l a s t a u s l u i s k a a + l a s t a u s l u i s k i e n + l a s t a u s m ä ä r i i n + l a s t a u s m ä ä r i s t ä + l a s t a u s m ä ä r i ä + l a s t a u s r a m p p i e n + l a s t a u s t a p o j a + l a s t a u s y k s i k k ö + l a s t a u s y k s i k k ö j ä + l a s t a u s y k s i k ö i d e n + l a s t a u s y k s i k ö i t ä + l a s t a u s y k s i k ö n + l a s t e m m e + l a s t e n + l a s t e n e l o k u v i a + l a s t e n e l o k u v i s t a + l a s t e n f i l m e i h i n + l a s t e n h a n k k i m i s h a l u k k u u d e n + l a s t e n h a n k k i m i s t o i v e i d e n + l a s t e n h o i d o l l a + l a s t e n h o i d o n + l a s t e n h o i d o s s a + l a s t e n h o i d o s t a + l a s t e n h o i t a j a l l e + l a s t e n h o i t a j i a + l a s t e n h o i t o a + l a s t e n h o i t o a l a n + l a s t e n h o i t o i n f r a s t r u k t u u r i e n + l a s t e n h o i t o j a k s o i l l e + l a s t e n h o i t o j ä r j e s t e l m i e n + l a s t e n h o i t o j ä r j e s t e l m i ä + l a s t e n h o i t o j ä r j e s t e l m ä + l a s t e n h o i t o j ä r j e s t e l m ä ä + l a s t e n h o i t o j ä r j e s t e l m ä ä n + l a s t e n h o i t o j ä r j e s t e l y i s t ä + l a s t e n h o i t o j ä r j e s t e l y j ä + l a s t e n h o i t o l a i t o k s i a + l a s t e n h o i t o l a i t o s t a + l a s t e n h o i t o l a i t o s t e n + l a s t e n h o i t o m a h d o l l i s u u k s i e n + l a s t e n h o i t o m a k s u j e n + l a s t e n h o i t o o n + l a s t e n h o i t o p a i k k a a + l a s t e n h o i t o p a i k k o j a + l a s t e n h o i t o p a i k k o j e n + l a s t e n h o i t o p a l v e l u i d e n + l a s t e n h o i t o p a l v e l u i h i n + l a s t e n h o i t o p a l v e l u i s t a + l a s t e n h o i t o p a l v e l u i t a + l a s t e n h o i t o p a l v e l u j a + l a s t e n h o i t o p a l v e l u j e n + l a s t e n h o i t o p a l v e l u t + l a s t e n h o i t o r a k e n t e i t a + l a s t e n h o i t o s t r a t e g i a a + l a s t e n h o i t o s t r a t e g i a n + l a s t e n h o i t o s u u n n i t e l m a + l a s t e n h o i t o t a r v i k k e i d e n + l a s t e n h o i t o t a r v i k k e i l l a + l a s t e n h o i t o t a r v i k k e i l l e + l a s t e n h o i t o t a r v i k k e i s i i n + l a s t e n h o i t o t a r v i k k e i s s a + l a s t e n h o i t o t a v o i t t e e n + l a s t e n h o i t o t a v o i t t e e t + l a s t e n h o i t o t a v o i t t e i d e n + l a s t e n h o i t o t e h t ä v i i n + l a s t e n h o i t o t u k i + l a s t e n h o i t o t u o t t e i d e n + l a s t e n h o i t o t u o t t e i s s a + l a s t e n h o i t o v a i h t o e h t o j a + l a s t e n h o i t o v a l m i u k s i e n + l a s t e n h o i t o v a p a a s e e n + l a s t e n h o i t o v a s t u u n + l a s t e n h o i t o v e l v o i t t e i t a a n + l a s t e n h o i t o v e l v o l l i s u u k s i e n + l a s t e n h o i t o v e r k o s t o j a + l a s t e n h o i t o v u o s i l t a + l a s t e n h o i t o v ä l i n e i d e n + l a s t e n j a l k i n e i d e n + l a s t e n k a n a v a + l a s t e n k a s v a t u k s e s t a + l a s t e n k e n g i s t ä + l a s t e n k e n g ä t + l a s t e n k e n k i ä + l a s t e n k e s k u k s e s s a + l a s t e n k i n + l a s t e n k i r j a p ä i v ä + l a s t e n k i r j o i h i n + l a s t e n k i r j o i l l e + l a s t e n k i r j o j a + l a s t e n k i r j o j e n + l a s t e n k o d e i s s a + l a s t e n k o d i s s a + l a s t e n k o n f e r e n s s i s s a + l a s t e n l i n n a + l a s t e n l o r u + l a s t e n l ä ä k k e e t + l a s t e n l ä ä k k e i d e n + l a s t e n l ä ä k k e i l l e + l a s t e n l ä ä k k e i s t ä + l a s t e n l ä ä k k e i t ä + l a s t e n o h j e l m a a + l a s t e n o h j e l m i a + l a s t e n o h j e l m i e n + l a s t e n o h j e l m i l l e + l a s t e n o h j e l m i s s a + l a s t e n o i k e u k s i a + l a s t e n o i k e u k s i e n + l a s t e n p ä i v ä + l a s t e n r a h a s t o + l a s t e n r a i s k a a j a + l a s t e n r a i s k a a j a t + l a s t e n r e u m a + l a s t e n r u o a n + l a s t e n r u o a t + l a s t e n r u o i s s a + l a s t e n r u o i s t a + l a s t e n r u o k a a + l a s t e n r u o k a p u r k e i s s a + l a s t e n r u o k a t u o t t e i d e n + l a s t e n r u o k i a + l a s t e n r u o k i e n + l a s t e n r u o k i i n + l a s t e n r y ö s t ö t + l a s t e n s a i r a a l a s s a + l a s t e n s i e p p a u s t a p a u k s i s s a + l a s t e n s o p i m u s t a + l a s t e n s u o j e l u a + l a s t e n s u o j e l u a l a + l a s t e n s u o j e l u j ä r j e s t ö j e n + l a s t e n s u o j e l u k y s y m y k s e e n + l a s t e n s u o j e l u k y s y m y k s e t + l a s t e n s u o j e l u l a i n + l a s t e n s u o j e l u l a i n s ä ä d ä n t ö + l a s t e n s u o j e l u l a i n s ä ä d ä n t ö ö n + l a s t e n s u o j e l u l i i t o n + l a s t e n s u o j e l u n + l a s t e n s u o j e l u o h j e l m a + l a s t e n s u o j e l u p o l i t i i k a n + l a s t e n s u o j e l u p o l i t i i k k a + l a s t e n s u o j e l u p o l i t i i k k a a + l a s t e n s u o j e l u p o l i t i i k k a a n + l a s t e n s u o j e l u p o l i t i i k k o i h i n + l a s t e n s u o j e l u s t a + l a s t e n s u o j e l u s ä ä d ö s t e n + l a s t e n s u o j e l u t a i s t e l u s s a + l a s t e n s u o j e l u u n + l a s t e n s u o j e l u v i r a s t o + l a s t e n t a r h a a n + l a s t e n t a r h a n + l a s t e n t a r h a n o p e t t a j a k o u l u + l a s t e n t a r h a p a i k a n + l a s t e n t a r h a s s a + l a s t e n t a r h a v e r k k o o n + l a s t e n t a r h o j a + l a s t e n t a u d e i s t a + l a s t e n t a u t e i h i n + l a s t e n t a u t e j a + l a s t e n t a u t i o s a s t o o n + l a s t e n t a v a r o i h i n + l a s t e n t u o t t e i d e n + l a s t e n t u o t t e i s t a + l a s t e n v a l i o k u n t a + l a s t e n v a u n u t + l a s t e n v e r k o n + l a s t i j ä ä m i e n + l a s t i j ä ä m i l l e + l a s t i j ä ä m i s t ä + l a s t i j ä ä m i ä + l a s t i j ä ä m ä t + l a s t i k u l t t i + l a s t i k u l t t i t i e d e + l a s t i l u o k a n + l a s t i l u o k a s t a + l a s t i n k ä s i t t e l i j ö i d e n + l a s t i n k ä s i t t e l y + l a s t i n k ä s i t t e l y l l e + l a s t i n k ä s i t t e l y m a r k k i n o i t a + l a s t i n k ä s i t t e l y n + l a s t i n k ä s i t t e l y p a l v e l u j e n + l a s t i n k ä s i t t e l y s s ä + l a s t i n k ä s i t t e l y y n + l a s t i n k ä s i t t e l y ä + l a s t i n p u r k a m i s e n + l a s t i n p u r k a m i s m e n e t t e l y j e n + l a s t i n p u r k u + l a s t i n p u r k u s u u n n i t e l m a + l a s t i n p u r k u s ä ä n n ö s t ö n + l a s t i n p u r u s t a + l a s t i t y y p i n + l a s t i v i r t a a + l a t a a m a t t a + l a t a a v i e n + l a t a u s a s e m i l l e + l a t a u s i n f r a s t r u k t u u r i + l a t a u s i n f r a s t r u k t u u r i t + l a t a u s j ä r j e s t e l m i ä + l a t a u s j ä r j e s t e l m ä ä + l a t a u s l a i t t e i d e n + l a t a u s m e n e t e l m ä t + l a t a u s p i s t e e t + l a t a u s p i s t e i d e n + l a t e r a a n i k o n s i i l i + l a t i n a k s i + l a t i n a l a i s a m e r i k k a l a i n e n + l a t i n a l a i s a m e r i k k a l a i s e l l a + l a t i n a l a i s a m e r i k k a l a i s e l l e + l a t i n a l a i s a m e r i k k a l a i s e n + l a t i n a l a i s a m e r i k k a l a i s e t + l a t i n a l a i s a m e r i k k a l a i s i a + l a t i n a l a i s a m e r i k k a l a i s i l l e + l a t i n a l a i s a m e r i k k a l a i s i n a + l a t i n a l a i s a m e r i k k a l a i s i s t a + l a t i n a l a i s a m e r i k k a l a i s t a + l a t i n a l a i s a m e r i k k a l a i s t e n + l a t i n a l a i s e e n + l a t i n a l a i s e l l e + l a t i n a l a i s e n + l a t i n a l a i s e s s a + l a t i n a l a i s e s t a + l a t i n a n + l a t i n a n k i e l e n + l a t i n a n k i e l i s e l l ä + l a t i n a n k i e l i s e n + l a t i s t a m i n e n + l a t t a y ö k k ö n e n + l a t t e a m p i + l a t t e a m p i a + l a t t e i t a + l a t t e u k s i a + l a t t i a k a n a l o i t a + l a t t i a l ä m m i t y s + l a t t i a n h o i t o t u o t t e i s s a + l a t t i a p i n t o j a + l a t t i a p ä ä l l y s t e i d e n + l a t t i a p ä ä l l y s t e i s s ä + l a t t i a s i e n i + l a t t i o i l l a + l a t u r e i d e n + l a t u r e i t a + l a t v i a a n + l a t v i a k i n + l a t v i a l a i s i a + l a t v i a l l e + l a t v i a n j u u t a l a i s e n + l a t v i a s s a + l a t v i a s t a + l a t v u s k e r t t u l i + l a t v u s k u t o j a + l a t v u s l a u l u m e s i k k o + l a t v u s t r o g o n i + l a u a n t a i a a m u n a + l a u a n t a i n a + l a u a n t a i s e t + l a u a n t a i y ö n ä + l a u k a i s e m a l l a + l a u k a i s e m i s e k s i + l a u k a i s e v a a + l a u k a i s t a a n + l a u k a i s t a e s s a + l a u k a i s t a k s e e n + l a u k a i s u a l u s t a + l a u k a i s u a l u s t a l t a + l a u k a i s u a l u s t o j a + l a u k a i s u i k k u n a + l a u k a i s u j ä r j e s t e l m ä n + l a u k a i s u l a i t e a l a n + l a u k a i s u l a i t t e i s t a + l a u k a i s u m e k a n i s m e i s t a + l a u k a i s u p a l v e l u j e n + l a u k a i s u p a l v e l u n + l a u k a i s u p ä i v ä ä + l a u k a u k s e t + l a u k a u k s i a + l a u k a u s t e n v a i h d o n + l a u k a u s t e n v a i h d o s s a + l a u k i n + l a u k k a n e i l i k k a + l a u k k a u r h e i l u + l a u k k u m i t t a r i + l a u l a a + l a u l a j a t + l a u l e l m a m u s i i k k i + l a u l u b u l b u l i + l a u l u j o u t s e n + l a u l u j u h l a t + l a u l u k a i j a + l a u l u k e r t t u l i + l a u l u k i l p a i l u + l a u l u k i l p a i l u n + l a u l u k i l p a i l u s s a + l a u l u m e s i k k o + l a u l u n + l a u l u r a s t a s + l a u l u s a r j a + l a u l u s i r k k u + l a u l u t + l a u l u t a s k u + l a u l u t u r p i a a l i + l a u m a e l ä i n + l a u m a m e n t a l i t e e t t i + l a u m a n h a l l i n n a n + l a u m a n v a r t i j a + l a u p e u d e n t e k o a + l a u s e e l l a + l a u s e e n + l a u s e e n v a s t i k e + l a u s e e s e e n n e + l a u s e e s s a + l a u s e e s t a + l a u s e i s t a + l a u s e i t a + l a u s e k e p a k e t t i + l a u s e k e t t a + l a u s e k k e e n + l a u s e k k e e t + l a u s e k k e i d e n + l a u s e k k e i t a + l a u s e t t a + l a u s u a + l a u s u e s s a + l a u s u m a a + l a u s u m a a n + l a u s u m a n + l a u s u m a s t a + l a u s u m a s t a n i + l a u s u m a t t a + l a u s u m i a + l a u s u m i i n + l a u s u m i n + l a u s u m i s t a + l a u s u n + l a u s u n n o i l l a + l a u s u n n o i l l a a n + l a u s u n n o i s s a + l a u s u n n o i s s a m m e + l a u s u n n o i s t a + l a u s u n n o l l a + l a u s u n n o n + l a u s u n n o s s a + l a u s u n n o s s a a n + l a u s u n n o s s a n i + l a u s u n n o s s a n n e + l a u s u n n o s t a + l a u s u n n o s t a n n e + l a u s u n n o t + l a u s u n t o a + l a u s u n t o a a n + l a u s u n t o a n n e + l a u s u n t o e h d o t u k s e e n + l a u s u n t o e h d o t u k s e n s a + l a u s u n t o e h d o t u k s e s s a + l a u s u n t o e h d o t u k s e s t a + l a u s u n t o e h d o t u s + l a u s u n t o e h d o t u s t a + l a u s u n t o i h i n + l a u s u n t o j a + l a u s u n t o j e n + l a u s u n t o j e n s a + l a u s u n t o k i e r r o k s e n + l a u s u n t o l u o n n o k s e e m m e + l a u s u n t o l u o n n o k s e e n + l a u s u n t o l u o n n o k s e m m e + l a u s u n t o l u o n n o k s e n + l a u s u n t o l u o n n o k s e n i + l a u s u n t o l u o n n o k s e n n e + l a u s u n t o l u o n n o k s e n s a + l a u s u n t o l u o n n o k s e s s a + l a u s u n t o l u o n n o k s e s s a n i + l a u s u n t o l u o n n o s + l a u s u n t o m e n e t t e l y + l a u s u n t o m e n e t t e l y n + l a u s u n t o m e n e t t e l y ä + l a u s u n t o m m e + l a u s u n t o n i + l a u s u n t o n n e + l a u s u n t o n s a + l a u s u n t o o n + l a u s u n t o p y y n n ö n + l a u s u n t o v a l t a + l a u s u n u t + l a u s u t t i i n + l a u s u t t u + l a u s u t t u j a + l a u s u u + l a u t a k u n n a n + l a u t a k u n t a + l a u t a k u n t a a + l a u t a m i e s + l a u t a n a u h a + l a u t a p a s i a n s s i + l a u t a p e l e i s t ä + l a u t a p e l i + l a u t a s a n t e n n e j a + l a u t a s a n t e n n i + l a u t a s a n t e n n i i n + l a u t a s e l l e e n + l a u t a s i a + l a u t a s i l l e m m e + l a u t a s v e n t t i i l i + l a u t a s ä e s + l a u t o i l l a + l a u t t a k a a p p a r i a + l a u t t a k a t s a s t u s t i e t o k a n t a a + l a u t t a k a t s a s t u s t i e t o k a n t a a n + l a u t t a l i i k e n n e + l a u t t a l i i k e n n e l i n j o i s t a + l a u t t a l i i k e n n e p a l v e l u i s s a + l a u t t a l i i k e n n e t t ä + l a u t t a l i i k e n n e y h t e y k s i s t ä + l a u t t a l i i k e n t e e l l e + l a u t t a l i i k e n t e e n + l a u t t a l i i k e n t e e n h a r j o i t t a j i e n + l a u t t a l i i k e n t e e n h a r j o i t t a j i l l e + l a u t t a l i i k e n t e e s e e n + l a u t t a l i i k e n t e e s s ä + l a u t t a l i n j o i s t a + l a u t t a l i n j o j a + l a u t t a l i p p u j e n + l a u t t a m a k s u j e n + l a u t t a o n n e t t o m u u d e l l a + l a u t t a o n n e t t o m u u d e n + l a u t t a o n n e t t o m u u d e t + l a u t t a o p e r a a t t o r i t + l a u t t a p a l v e l u a + l a u t t a p a l v e l u i d e n + l a u t t a s a t a m a + l a u t t a s a t a m a a n + l a u t t a s k a n d a a l i s s a + l a u t t a t u r v a l l i s u u s t i e d o i s t a + l a u t t a v a r u s t a m o j e n + l a u t t a y h t e y d e n + l a u t t a y h t e y d e t + l a u t t a y h t e y k s i e n + l a u t t a y h t e y k s i i n + l a u t t a y h t e y s + l a u t t a y h t e y t t ä + l a u t t a y h t i ö i d e n + l a u t t a y h t i ö i l l e + l a u t t a y h t i ö i t ä + l a u t t a y h t i ö t + l a u t t a y h t i ö t ä + l a u t t a y l i t y s t ä + l a u t t o j e n + l a v a n s a a r i + l a v a n t a u t i + l a v a n t a u t i i n + l a v a r u n o u s + l a v e t t i v a u n u + l e g e n d a a r i s i l l a + l e g e n d a a r i s t a + l e g e n d a s t a + l e g e n d a t + l e g i o o n a l a i s t a u t i + l e g i o o n a l a i s t a u t i i n + l e g i t i i m e i s t ä + l e g i t i i m e j ä + l e g i t i i m i m m ä n + l e g i t i i m i m p i + l e g i t i i m i m p ä n ä + l e g i t i i m i m p ä ä + l e g i t i i m i y d e l l e + l e g i t i i m i y d e s t ä + l e g i t i i m i y s k r i i s i + l e g i t i i m i y s k r i i s i i n + l e g i t i i m i y t t ä + l e g i t i i m i y t t ä ä n + l e g i t i m i t e e t i n + l e g i t i m i t e e t t i k r i i s i + l e g i t i m i t e e t t i k r i i s i i n + l e g i t i m i t e e t t i k y s y m y s + l e g i t i m i t e e t t i o n g e l m a + l e g i t i m i t e e t t i o n g e l m i a + l e g i t i m i t e e t t i o n g e l m i e n + l e g i t i m i t e e t t i t a s o a + l e g i t i m i t e e t t i ä + l e g i t i m o i d a a n + l e g i t i m o i d a k s e e n + l e g i t i m o i m i s e k s i + l e h d e n + l e h d e n l e i k k a a j a m u u r a h a i n e n + l e h d e n m u o t o i s t a + l e h d e s s ä + l e h d e t + l e h d i s s ä + l e h d i s t ä + l e h d i s t ö a n a l y y s i + l e h d i s t ö e l i m i l l e + l e h d i s t ö e n n a k k o a + l e h d i s t ö h a a s t a t t e l u j a + l e h d i s t ö h a a s t a t t e l u j e n + l e h d i s t ö h a a s t a t t e l u s s a + l e h d i s t ö h u o n e + l e h d i s t ö h u o n e e s s a + l e h d i s t ö i n s t i t u u t t i + l e h d i s t ö j u l k a i s u n s a + l e h d i s t ö j u l k a i s u t + l e h d i s t ö k a m p a n j a + l e h d i s t ö k a m p a n j a n + l e h d i s t ö k a m p a n j a t + l e h d i s t ö k a m p a n j o i d e n + l e h d i s t ö k a t s a u k s e t + l e h d i s t ö k a t s a u k s i s s a + l e h d i s t ö k a t s a u s + l e h d i s t ö k e s k u k s e e n + l e h d i s t ö k e s k u k s e m m e + l e h d i s t ö k e s k u k s e s t a + l e h d i s t ö k o h u n + l e h d i s t ö k o k o u k s e n + l e h d i s t ö k o l l e g o i l l a n i + l e h d i s t ö k o n f e r e n s s e i l l a + l e h d i s t ö k o n f e r e n s s e i n + l e h d i s t ö k o n f e r e n s s e i s t a + l e h d i s t ö k o n f e r e n s s i + l e h d i s t ö k o n f e r e n s s i a + l e h d i s t ö k o n f e r e n s s i i n + l e h d i s t ö k o n f e r e n s s i n + l e h d i s t ö k o n f e r e n s s i s s a + l e h d i s t ö k o n f e r e n s s i s s a n n e + l e h d i s t ö k o r t t i + l e h d i s t ö l a i l l e + l e h d i s t ö l a i n + l e h d i s t ö l a i n s ä ä d ä n n ö n + l e h d i s t ö l a i t + l e h d i s t ö l a k i + l e h d i s t ö l a k i a + l e h d i s t ö l a u s u n t o a + l e h d i s t ö l e h t e r i l l ä + l e h d i s t ö l i i t t o + l e h d i s t ö l l e + l e h d i s t ö n + l e h d i s t ö n e u v o s t o + l e h d i s t ö n v a p a u d e l l e + l e h d i s t ö n v a p a u d e n + l e h d i s t ö n v a p a u d e s s a + l e h d i s t ö n v a p a u d e s t a + l e h d i s t ö n v a p a u k s i s t a + l e h d i s t ö n v a p a u s + l e h d i s t ö n v a p a u s i n d e k s i l l ä + l e h d i s t ö n v a p a u s i n d e k s i n + l e h d i s t ö n v a p a u s l a k i + l e h d i s t ö n v a p a u t e e n + l e h d i s t ö n v a p a u t t a + l e h d i s t ö p a l k i n n o n + l e h d i s t ö p a l v e l u + l e h d i s t ö p a l v e l u a + l e h d i s t ö p a l v e l u m m e + l e h d i s t ö p a l v e l u s s a + l e h d i s t ö p a l v e l u t + l e h d i s t ö p ä ä o s a s t o + l e h d i s t ö r a p o r t t e i h i n + l e h d i s t ö r a p o r t t i e n + l e h d i s t ö r i k o k s i a + l e h d i s t ö s a l i n + l e h d i s t ö s a l i s s a + l e h d i s t ö s e n s u u r i + l e h d i s t ö s e n s u u r i i n + l e h d i s t ö s e n s u u r i n + l e h d i s t ö s e n s u u r i s t a + l e h d i s t ö s s ä + l e h d i s t ö s t ä + l e h d i s t ö t a h o j e n + l e h d i s t ö t i e d o t e + l e h d i s t ö t i e d o t e l u e t t e l o s s a + l e h d i s t ö t i e d o t e t t a + l e h d i s t ö t i e d o t t a j a n + l e h d i s t ö t i e d o t t e e l l e + l e h d i s t ö t i e d o t t e e n + l e h d i s t ö t i e d o t t e e n n e + l e h d i s t ö t i e d o t t e e s s a + l e h d i s t ö t i e d o t t e e s s a a n + l e h d i s t ö t i e d o t t e e s s a n n e + l e h d i s t ö t i e d o t t e e s t a + l e h d i s t ö t i e d o t t e e s t a a n + l e h d i s t ö t i e d o t t e e t + l e h d i s t ö t i e d o t t e i d e n + l e h d i s t ö t i e d o t t e i k s i + l e h d i s t ö t i e d o t t e i l l a + l e h d i s t ö t i e d o t t e i n + l e h d i s t ö t i e d o t t e i s i i n + l e h d i s t ö t i e d o t t e i s s a + l e h d i s t ö t i e d o t t e i s s a a n + l e h d i s t ö t i e d o t t e i s s a n i + l e h d i s t ö t i e d o t t e i s t a + l e h d i s t ö t i e d o t t e i t a + l e h d i s t ö t i e d o t t e i t a a n + l e h d i s t ö t i e t o j e n + l e h d i s t ö t i l a i s u u d e n + l e h d i s t ö t i l a i s u u d e s s a + l e h d i s t ö t i l a i s u u d e s s a a n + l e h d i s t ö t i l a i s u u d e s s a m m e + l e h d i s t ö t i l a i s u u d e s s a n n e + l e h d i s t ö t i l a i s u u d e t + l e h d i s t ö t i l a i s u u k s i a + l e h d i s t ö t i l a i s u u k s i e n + l e h d i s t ö t i l a i s u u k s i i n + l e h d i s t ö t i l a i s u u k s i s s a + l e h d i s t ö t i l a i s u u k s i s t a + l e h d i s t ö t i l a i s u u s + l e h d i s t ö t i l a i s u u s h u o n e t t a + l e h d i s t ö t i l a i s u u t e e m m e + l e h d i s t ö t i l a i s u u t e e n + l e h d i s t ö t i l a i s u u t t a + l e h d i s t ö t i l a i s u u t t a a n + l e h d i s t ö t i l a n a + l e h d i s t ö t o i m i s t o a s i a a n + l e h d i s t ö t o i m i s t o j e n + l e h d i s t ö t o i m i s t o l l a + l e h d i s t ö t o i m i s t o m m e + l e h d i s t ö u u d i s t u s t a + l e h d i s t ö v a p a u d e n + l e h d i s t ö v a p a u s + l e h d i s t ö v a p a u t e e n + l e h d i s t ö v a p a u t t a + l e h d i s t ö v a s t a a n o t t o a + l e h d i s t ö v a s t a a v a + l e h d i s t ö v i r k a i l i j a n + l e h d i s t ö v u o d o i s t a + l e h d i s t ö v u o t o j e n + l e h d i s t ö y k s i k k ö + l e h d i s t ö ä + l e h d i s t ö ö n + l e h m i e n + l e h m i i n k i n + l e h m i p o j i l l e + l e h m i s t ä + l e h m u s k e l t a y ö k k ö n e n + l e h m u s k i i t ä j ä + l e h m u s k i r v a + l e h m ä h a i k a r a + l e h m ä n + l e h m ä n k a u p a k s i + l e h m ä n k a u p a n + l e h m ä n k a u p a s t a + l e h m ä n k a u p a t + l e h m ä n k a u p o i k s i + l e h m ä n k a u p o i l l e + l e h m ä n k a u p o i s s a + l e h m ä n k a u p o i s t a + l e h m ä n k a u p p a + l e h m ä n k a u p p a a + l e h m ä n k a u p p a a n + l e h m ä n k a u p p o i h i n + l e h m ä n k a u p p o j a + l e h m ä n k a u p p o j e n + l e h m ä n m a i d o s t a + l e h m ä n m a i t o a + l e h m ä n r u h o n + l e h m ä n t a t t i + l e h m ä r o t u i h i n + l e h m ä r o t u j e n + l e h m ä s t ä + l e h m ä t h ä n + l e h m ä t u r p i a a l i + l e h t e e n + l e h t e r e i l l e + l e h t e r e i l l ä + l e h t e r e i s t ä + l e h t e r i l l e + l e h t e r i l l ä + l e h t e r i l t ä + l e h t e r i n + l e h t e ä + l e h t i a r t i k k e l e i d e n + l e h t i a r t i k k e l e i h i n + l e h t i a r t i k k e l e i s s a + l e h t i a r t i k k e l e i s t a + l e h t i a r t i k k e l e i t a + l e h t i a r t i k k e l e j a + l e h t i a r t i k k e l i + l e h t i a r t i k k e l i a + l e h t i a r t i k k e l i e n + l e h t i a r t i k k e l i n + l e h t i a r t i k k e l i s s a + l e h t i a r t i k k e l i s t a + l e h t i a r t i k k e l i t + l e h t i b u l b u l i + l e h t i e n + l e h t i h a a s t a t t e l u i h i n i + l e h t i j o u s i + l e h t i j u t t u i h i n + l e h t i j u t t u j e n + l e h t i j u t u s s a + l e h t i k a n t o j ä ä r ä + l e h t i k a t s a u k s e s t a + l e h t i k i o s k e i h i n + l e h t i k i o s k i a + l e h t i k i r j a s t o j a + l e h t i k i r j o i t u k s e t + l e h t i k i r j o i t u k s i a + l e h t i k i r j o i t u k s i i n + l e h t i k i r j o i t u k s i s s a + l e h t i k i r j o i t u k s i s t a + l e h t i k o j u i s t a + l e h t i k o n s e r n e i l l e + l e h t i k u l t a + l e h t i k u o r i a i s e t + l e h t i k u s t a n t a j i a + l e h t i k u u s e n t a t t i + l e h t i l a i t o k s i a + l e h t i l e i k e k o o s t e t t a + l e h t i l e i k k e i s i i n + l e h t i m e t s ä + l e h t i m e t s ä n + l e h t i m i e h e l l e + l e h t i m i e h i ä + l e h t i m i e s l i i t o l l e + l e h t i m i e s r e k i s t e r i i n + l e h t i m i e s t a p a u k s e l l a + l e h t i m i e s t a p a u k s e s t a + l e h t i m i e s t e n + l e h t i m u o t o + l e h t i n u n n a + l e h t i o t s i k o i t a + l e h t i o t s i k o s s a + l e h t i p o l t e + l e h t i p u h a l l i n + l e h t i p u i d e n + l e h t i p u i s t a + l e h t i p u i t a + l e h t i p u u l a j i t + l e h t i p u u m e t s i ä + l e h t i p u u p ö l y l t ä + l e h t i p u u p ö l y n + l e h t i p u u t + l e h t i r a p o r t t e j a + l e h t i s a h a + l e h t i t a l o t + l e h t i t i e d o t + l e h t i t i e t o j a + l e h t i t i e t o j e n + l e h t i t u p a k a s t a + l e h t i u u t i s e n a + l e h t i u u t i s i s s a + l e h t i u u t i s o i n n i s t a + l e h t i ä + l e h t o a k i l e i j a + l e h t o a r h o + l e h t o h e p o k a t t i + l e h t o h o p e a t ä p l ä + l e h t o h o r s m a + l e h t o i m i k k ä + l e h t o j a l a v a + l e h t o k e r t t u + l e h t o k e r t t u l i + l e h t o k i e l o + l e h t o k o r t e + l e h t o k o r v a s i e n i + l e h t o k o t i l o + l e h t o k u r p p a + l e h t o k u u s a m a + l e h t o l e h v ä s a m m a l + l e h t o l i t u k k a + l e h t o l o h i s i e n i + l e h t o m a i t i k k a + l e h t o m a t a r a + l e h t o n a t a + l e h t o n e i d o n v a i p p a + l e h t o n o i d a n l u k k o + l e h t o n u r m i k k a + l e h t o p a l s a m i + l e h t o p ä h k ä m ö + l e h t o p ö l l ö + l e h t o r i t + l e h t o r i t v a s a m m a l + l e h t o s a r a + l e h t o s i n i j u u r i + l e h t o s i n i l a t v a + l e h t o s i n i s i i p i + l e h t o t i k a n k o n t t i + l e h t o t ä h t i m ö + l e h t o u k o n h a t t u + l e h t o v ä h ä m i t t a r i + l e h t o ä n g e l m ä + l e h v ä b u l b u l i + l e h v ä m i t t a r i + l e h v ä m u s t e s i e n i + l e i j a h i i h t o + l e i j a p o i k a + l e i j o n a k o i r a + l e i j o n a k u n i n g a s + l e i j o n a n h a r j a s + l e i j o n a n h ä k k i i n + l e i j o n a n k i t a + l e i j o n a n m e t s ä s t y k s e s t ä + l e i j o n a n m e t s ä s t y s t ä + l e i j o n a n o s a + l e i j o n a n o s a a + l e i j o n a n o s a n + l e i j o n a n o s a s t a + l e i j o n a n o s u u s + l e i j o n a p o p u l a a t i o + l e i j o n a p o r t t i + l e i j o n a s y d ä n + l e i j o n a t + l e i j u k a t a l y y t t i n e n + l e i j u k e r r o s k a t t i l a + l e i k a n n u t + l e i k a t a + l e i k a t a a n + l e i k a t a a n p a + l e i k a t a k s e e n + l e i k a t e n + l e i k a t e s s a a n + l e i k a t t a v a + l e i k a t t i i n + l e i k a t t u a a n + l e i k a t u n + l e i k i m m e + l e i k i s t ä + l e i k i t e l l ä + l e i k i t t e l e v ä n + l e i k k a a m a a n + l e i k k a a m a l l a + l e i k k a a m a t t a + l e i k k a a m i s e k s i + l e i k k a a m i s e l l e + l e i k k a a m i s e s t a + l e i k k a a m i s t a + l e i k k a a m m e + l e i k k a a m o i s s a + l e i k k a a m o i s t a + l e i k k a a m o n + l e i k k a a m o t + l e i k k a a v a t + l e i k k a i s i + l e i k k a s i + l e i k k a u k s e e n + l e i k k a u k s e n + l e i k k a u k s e s t a + l e i k k a u k s e t + l e i k k a u k s i a + l e i k k a u k s i e n + l e i k k a u k s i i n + l e i k k a u k s i k s i + l e i k k a u k s i l l a + l e i k k a u k s i s s a + l e i k k a u k s i s t a + l e i k k a u s h a a v o j e n + l e i k k a u s j ä n n i t y s + l e i k k a u s k i r v e s + l e i k k a u s o h j e l m a l l e e n + l e i k k a u s o h j e l m i l l a + l e i k k a u s p o l i t i i k a n + l e i k k a u s p o l i t i i k k a + l e i k k a u s p o t i l a i l l a + l e i k k a u s p ä i v ä m ä ä r ä s t ä + l e i k k a u s p ä i v ä s t ä + l e i k k a u s s a l e i h i n + l e i k k a u s s a l i + l e i k k a u s s a l i i n + l e i k k a u s s a l i s s a + l e i k k a u s s t r a t e g i a a + l e i k k a u s s u u n n i t e l m i a + l e i k k a u s t a + l e i k k a u s t e k n i i k a t + l e i k k a u s t e n + l e i k k a u s t o i m e t + l e i k k i a u t o + l e i k k i a u t o i s s a + l e i k k i i + l e i k k i i n + l e i k k i k a l u t e o l l i s u u s + l e i k k i k e n g u r u + l e i k k i k i e l i + l e i k k i k ö + l e i k k i m i s t ä + l e i k k i m ö k k i + l e i k k i p a i k k o j e n + l e i k k i p a r l a m e n t t i n a + l e i k k i p u i s t o i k s i + l e i k k i s o t i l a i l l a + l e i k k i t e r a p i a + l e i k k i t i l a a + l e i k k i v ä t + l e i k k i ä + l e i k k o k u k i s t a + l e i k k o k u k k a + l e i k k o k u k k i a + l e i k k o k u k k i e n + l e i k k o k u k k i i n + l e i k k u r i h a i + l e i k k u u p u i m u r e i t a + l e i k k u u p u i m u r i + l e i m a a m a t t a + l e i m a a m i n e n + l e i m a a m i s e k s i + l e i m a a m i s e n + l e i m a a m i s j ä r j e s t e l m ä n + l e i m a a m i s t a + l e i m a a v a t + l e i m a h d u s p i s t e + l e i m a h t a m i s e e n + l e i m a n + l e i m a n n e e t + l e i m a s i + l e i m a s i n e t t i + l e i m a s i n k o n e i k s i + l e i m a t t a v a + l e i m a u t u m i s e s t a + l e i m a u t u m i s t a + l e i m a v e r o + l e i m o j a + l e i n e n i l l e + l e i n e n i n + l e i n e n i ä + l e i p ä j o n o i s s a + l e i p ä k a u p p o j a + l e i p ä k o n e + l e i p ä k u o r i a i n e n + l e i p ä p e r i n t e e s e e n + l e i p ä t e o l l i s u u d e n + l e i r e i h i n + l e i r e i l l e + l e i r e i l l ä + l e i r e i s s ä + l e i r e i s t ä + l e i r e j ä + l e i r i k u t o j a + l e i r i n + l e i r i n t ä a l u e e l l a + l e i r i ä + l e i s h m a n i a a s i a + l e i s i + l e i v o n t a s u m u t t e i s s a + l e i v ä n + l e i v ä n j a k e l u u n + l e i v ä s t ä m m e + l e l u a l a + l e l u a l a l l a + l e l u a l a s t a + l e l u a s e i t a + l e l u d i r e k t i i v i + l e l u d i r e k t i i v i i n + l e l u d i r e k t i i v i l l ä + l e l u d i r e k t i i v i n + l e l u d i r e k t i i v i s s ä + l e l u d i r e k t i i v i s t ä + l e l u d i r e k t i i v i ä + l e l u e h d o t u s + l e l u e r ä + l e l u h y l j e + l e l u i s s a + l e l u i s t a + l e l u j a + l e l u j a k i n + l e l u j e n + l e l u k a u p o i s s a + l e l u k r i i s i s t ä + l e l u k y s y m y s t ä + l e l u l a a t i k o n + l e l u m a l l e i s t a + l e l u m a r k k i n a t + l e l u m a r k k i n o i d e n s a + l e l u m a r k k i n o i l l a + l e l u m u s e o + l e l u n o s i s s a + l e l u s s a + l e l u t a r i n a t + l e l u t e h t a a s t a + l e l u t e o l l i s u u d e l l e + l e l u t e o l l i s u u d e n + l e l u t e o l l i s u u d e s s a + l e l u t e o l l i s u u s + l e l u t u r v a l l i s u u s + l e l u t u r v a l l i s u u s a l a l l a + l e l u t u r v a l l i s u u s d i r e k t i i v i + l e l u t u r v a l l i s u u s d i r e k t i i v i i n + l e l u t u r v a l l i s u u s d i r e k t i i v i n + l e l u t u r v a l l i s u u s d i r e k t i i v i ä + l e l u t u r v a l l i s u u s l a i n s ä ä d ä n n ö n + l e l u t u r v a l l i s u u s l a i n s ä ä d ä n n ö s t ä + l e l u t u r v a l l i s u u s l a i n s ä ä d ä n t ö + l e l u t u r v a l l i s u u s l a i n s ä ä d ä n t ö m m e + l e l u t u r v a l l i s u u t t a + l e l u u n + l e l u v a l m i s t a j a + l e l u v a l m i s t a j a a + l e l u v a l m i s t a j a n + l e l u v a l m i s t a j a s t a + l e l u v a l m i s t a j a t + l e l u v a l m i s t a j i e n + l e l u v a l m i s t a j i i n + l e l u v a l m i s t a j i l l e + l e l u y h t i ö + l e l u y r i t y k s e t + l e m m e n j u o m a + l e m m e n l a i v a + l e m m e n l o m a l l a + l e m m e n l o u k k u + l e m m e n l u k k o + l e m m i k i n o m i s t a j i e n k i n + l e m m i k i t + l e m m i k k e j ä ä n + l e m m i k k i d e k k a r i + l e m m i k k i e l ä i m i i n + l e m m i k k i e l ä i m i ä + l e m m i k k i e l ä i m i ä ä n + l e m m i k k i e l ä i n + l e m m i k k i e l ä i n k a u p p a a n + l e m m i k k i e l ä i n p a s s i h a n k e + l e m m i k k i e l ä i n p o p u l a a t i o n s a + l e m m i k k i e l ä i n t e n + l e m m i k k i f r e t e i s s ä + l e m m i k k i k a n i + l e m m i k k i k a n o j a + l e m m i k k i k a u p p a + l e m m i k k i k o i r a t + l e m m i k k i k o i r i i n + l e m m i k k i k o i r i l l a + l e m m i k k i l i n n u i s t a + l e m m i k k i p a s s i j ä r j e s t e l m ä s s ä + l e m m i k k i t o d i s t u s + l e m p e ä m p i + l e m p e ä m p i ä + l e m p i a i h e + l e m p i a i h e e n i + l e m p i a i h e e s e e n i + l e m p i a i h e e s e e n n e + l e m p i a i h e e s t a a n + l e m p i a i h e i s i i n + l e m p i a i h e i s t a a n + l e m p i a i h e i s t a n n e + l e m p i a i h e i t a n i + l e m p i d o g m i a + l e m p i e s i m e r k e i s t ä n i + l e m p i h a n k k e i s i i n + l e m p i h a n k k e i t a a n + l e m p i h a r r a s t u s + l e m p i h e d e l m i ä + l e m p i j u o m a n i + l e m p i l a p s i + l e m p i l e i v o n n a i s e n i + l e m p i l e l u n s a + l e m p i m a r j o j a n i + l e m p i m u s i i k k i a m m e + l e m p i r u n o i l i j a + l e m p i s a n o n t a a + l e m p i t e l e v i s i o + l e n k i k s i + l e n k i n + l e n k k i t o s s u + l e n n o i l l a + l e n n o i l l e + l e n n o i s t a + l e n n o i s t a a n + l e n n o k k a i s t a + l e n n o l l a + l e n n o l l e + l e n n o l l e e n + l e n n o n + l e n n o n h a l l i n n a n + l e n n o n j o h d o l l e + l e n n o n j o h d o n + l e n n o n j o h d o s s a + l e n n o n j o h d o s t a + l e n n o n j o h t a j a + l e n n o n j o h t a j a n + l e n n o n j o h t a j a t + l e n n o n j o h t a j i a + l e n n o n j o h t a j i e n + l e n n o n j o h t a j i i n + l e n n o n j o h t a j i l l a + l e n n o n j o h t a j i l l e + l e n n o n j o h t a j i l t a + l e n n o n j o h t a j i s t a + l e n n o n j o h t o + l e n n o n j o h t o a + l e n n o n j o h t o a l o i t t e e l l e + l e n n o n j o h t o j ä r j e s t e l m i e n + l e n n o n j o h t o j ä r j e s t e l m ä + l e n n o n j o h t o j ä r j e s t e l m ä n + l e n n o n j o h t o j ä r j e s t e l m ä t + l e n n o n j o h t o k e s k u k s e n a + l e n n o n j o h t o k e s k u k s e s t a + l e n n o n j o h t o k e s k u k s i a + l e n n o n j o h t o k e s k u k s i e n + l e n n o n j o h t o k e s k u s + l e n n o n j o h t o k e s k u s t a + l e n n o n j o h t o k e s k u s t e n + l e n n o n j o h t o l a i t t e i s t o + l e n n o n j o h t o o n + l e n n o n j o h t o p a l v e l u i d e n + l e n n o n j o h t o p a l v e l u i h i n + l e n n o n j o h t o p a l v e l u i s t a + l e n n o n j o h t o p a l v e l u j e n + l e n n o n j o h t o p a l v e l u n + l e n n o n j o h t o t o r n e j a + l e n n o n j o h t o t o r n i + l e n n o n j o h t o t o r n i e n + l e n n o n j o h t o t o r n i s s a + l e n n o n j o h t o v i r a n o m a i s t e n + l e n n o n n u m e r o t + l e n n o n v a l v o n n a n + l e n n o n v a l v o n n a s t a + l e n n o n v a l v o n t a + l e n n o n v a l v o n t a a + l e n n o n v a l v o n t a a n s a + l e n n o n v a l v o n t a h e n k i l ö s t ö + l e n n o n v a l v o n t a j ä r j e s t e l m ä + l e n n o n v a l v o n t a j ä r j e s t e l m ä n + l e n n o n v a l v o n t a j ä r j e s t e l m ä ä + l e n n o n v a l v o n t a k e s k u k s e l l a + l e n n o n v a l v o n t a k e s k u s t a + l e n n o n v a l v o n t a o r g a n i s a a t i o t a a n + l e n n o n v a l v o n t a p a l v e l u + l e n n o n v a l v o n t a p a l v e l u j a + l e n n o n v a l v o n t a p a l v e l u j e n + l e n n o n v a l v o n t a t o r n i n + l e n n o n v a r m i s t u k s e e n + l e n n o n v a r m i s t u k s e n + l e n n o n v a r m i s t u k s e s s a + l e n n o n v a r m i s t u k s e s t a + l e n n o n v a r m i s t u s + l e n n o n v a r m i s t u s a l a n + l e n n o n v a r m i s t u s j ä r j e s t e l m i e n + l e n n o n v a r m i s t u s j ä r j e s t e l m i s t ä m m e + l e n n o n v a r m i s t u s j ä r j e s t e l m ä + l e n n o n v a r m i s t u s l a i t t e i l l e + l e n n o n v a r m i s t u s p a l v e l u i d e n + l e n n o n v a r m i s t u s p a l v e l u i l l a + l e n n o n v a r m i s t u s p a l v e l u j a + l e n n o n v a r m i s t u s p a l v e l u j e n + l e n n o n v a r m i s t u s p a l v e l u n + l e n n o n v a r m i s t u s p a l v e l u t + l e n n o n v a r m i s t u s t a + l e n n o s t a + l e n n o t + l e n n ä m m e + l e n n ä t e t t ä i s i i n + l e n s i + l e n t e l y ä + l e n t o a i k a + l e n t o a i k a a n + l e n t o a i k a r a j o i t u k s i a + l e n t o a i k a r a j o i t u k s i i n + l e n t o a i k a s ä ä n n ö k s e t + l e n t o a i k a t a u l u i s t a + l e n t o a i k a t a u l u j a + l e n t o a i k a t a u l u n i + l e n t o a i k a t a u l u t + l e n t o a i k o j a + l e n t o a i k o j e n + l e n t o a j a n + l e n t o a j a t + l e n t o a l a a + l e n t o a l a l l a + l e n t o a l u e e s t a + l e n t o a l u e t t a + l e n t o a s e m a + l e n t o a s e m a a + l e n t o a s e m a a n + l e n t o a s e m a h a l l i n t o a + l e n t o a s e m a i n f r a s t r u k t u u r i e n + l e n t o a s e m a i n f r a s t r u k t u u r i h a n k k e i d e n + l e n t o a s e m a i n v e s t o i n t i e n + l e n t o a s e m a i s k u t + l e n t o a s e m a j ä r j e s t e l m i k s i + l e n t o a s e m a j ä r j e s t e l m i ä + l e n t o a s e m a j ä r j e s t e l m ä k s i + l e n t o a s e m a j ä r j e s t e l m ä n + l e n t o a s e m a j ä r j e s t e l m ä ä + l e n t o a s e m a k a p a s i t e e t i n + l e n t o a s e m a k a p a s i t e e t t i a + l e n t o a s e m a k a p a s i t e e t t i i n + l e n t o a s e m a k s u i s t a + l e n t o a s e m a k u s t a n n u k s i a + l e n t o a s e m a l l e + l e n t o a s e m a m a k s u i h i n + l e n t o a s e m a m a k s u i h i n s a + l e n t o a s e m a m a k s u i l l e + l e n t o a s e m a m a k s u i l t a + l e n t o a s e m a m a k s u i s s a + l e n t o a s e m a m a k s u i s t a + l e n t o a s e m a m a k s u j a + l e n t o a s e m a m a k s u j e n + l e n t o a s e m a m a k s u j ä r j e s t e l m i s s ä + l e n t o a s e m a m a k s u t + l e n t o a s e m a m a r k k i n o i d e n + l e n t o a s e m a m a r k k i n o i t a + l e n t o a s e m a n + l e n t o a s e m a p a l v e l u i d e n + l e n t o a s e m a p a l v e l u i h i n + l e n t o a s e m a p a l v e l u j e n + l e n t o a s e m a t + l e n t o a s e m a t e k n i i k a s t a + l e n t o a s e m a t e r m i n a a l e j a + l e n t o a s e m a t y ö n t e k i j ö i d e n + l e n t o a s e m a v e r k k o a + l e n t o a s e m a v e r k k o j a + l e n t o a s e m a v e r k k o j e n + l e n t o a s e m a v e r k k o k y s y m y s + l e n t o a s e m a v e r k o i s t a + l e n t o a s e m a v e r k o n + l e n t o a s e m a v e r k o s t o + l e n t o a s e m a v e r k o t + l e n t o a s e m a v i r a n o m a i s t e n + l e n t o a s e m i a + l e n t o a s e m i e n + l e n t o a s e m i i n s a + l e n t o a s e m i l l a + l e n t o a s e m i l l e + l e n t o a s e m i l t a + l e n t o a u t o + l e n t o d y n a m i i k k a + l e n t o e m ä n t i e n + l e n t o e m ä n t i ä + l e n t o e m ä n t ä + l e n t o h e n k i l ö k u n n a n + l e n t o h e n k i l ö k u n t a + l e n t o h e n k i l ö s t ö + l e n t o h e n k i l ö s t ö l l e + l e n t o h e n k i l ö s t ö n + l e n t o h i e k k a + l e n t o h i n n a t + l e n t o h i n n o i s t a + l e n t o h i n t o j a + l e n t o h i n t o j e n + l e n t o i h i n + l e n t o j a + l e n t o j e n + l e n t o j ä r j e s t e l m ä + l e n t o j ä r j e s t e l y i s t ä + l e n t o k a l u s t o a + l e n t o k a l u s t o a a n + l e n t o k a l u s t o o n + l e n t o k a p a s i t e e t i n + l e n t o k a p t e e n i e n + l e n t o k a p t e e n i n + l e n t o k a p t e e n i t + l e n t o k e l p o i s u u s s ä ä n t ö j ä + l e n t o k e l p o i s u u s t o d i s t u k s e t + l e n t o k e l p o i s u u s t o d i s t u s t e n + l e n t o k e l p o i s u u s v a a t i m u k s i a + l e n t o k e n t i l l e + l e n t o k e n t i l l ä + l e n t o k e n t i s t ä + l e n t o k e n t t i e n + l e n t o k e n t t i e n k i n + l e n t o k e n t t i ä + l e n t o k e n t t ä + l e n t o k e n t t ä a l u e i l l a + l e n t o k e n t t ä b u s s i s s a + l e n t o k e n t t ä h a l l i n n o n + l e n t o k e n t t ä h e n k i l ö k u n n a n + l e n t o k e n t t ä h e n k i l ö s t ö + l e n t o k e n t t ä i n f r a s t r u k t u u r e i s t a + l e n t o k e n t t ä i n f r a s t r u k t u u r i e n + l e n t o k e n t t ä i n f r a s t r u k t u u r i i n + l e n t o k e n t t ä i n f r a s t r u k t u u r i n + l e n t o k e n t t ä j u l i s t e i t a + l e n t o k e n t t ä j ä t t e e n + l e n t o k e n t t ä k a p a s i t e e t i n + l e n t o k e n t t ä k a p a s i t e e t i s t a + l e n t o k e n t t ä k a p a s i t e e t t i a + l e n t o k e n t t ä k a p a s i t e e t t i e n + l e n t o k e n t t ä m a k s u j a + l e n t o k e n t t ä m a k s u t + l e n t o k e n t t ä m e l u n + l e n t o k e n t t ä m e l u u n + l e n t o k e n t t ä p a l o a u t o + l e n t o k e n t t ä p a l v e l u i h i n + l e n t o k e n t t ä p a l v e l u j e n + l e n t o k e n t t ä r a k e n n e t t a + l e n t o k e n t t ä t a r k a s t u s t e n + l e n t o k e n t t ä t e r m i n a a l e j a + l e n t o k e n t t ä t e r m i n a a l i a + l e n t o k e n t t ä t u r v a l l i s u u t e e n + l e n t o k e n t t ä t y ö n t e k i j ä t + l e n t o k e n t t ä t y ö n t e k i j ö i d e n + l e n t o k e n t t ä v a a t i m u k s i a + l e n t o k e n t t ä v a l v o n t a + l e n t o k e n t t ä v e r k k o j a + l e n t o k e n t t ä v e r k k o j e n + l e n t o k e n t t ä v e r k o s t o s t a + l e n t o k e n t t ä v e r o i h i n + l e n t o k e n t t ä v e r o j e n + l e n t o k e n t t ä v e r o n + l e n t o k e n t t ä v i r a n o m a i n e n + l e n t o k e n t t ä v i r a n o m a i s e n + l e n t o k e n t t ä v i r a n o m a i s e t + l e n t o k e n t t ä v i r a n o m a i s i a + l e n t o k e n t t ä v i r a n o m a i s i l l a + l e n t o k e n t t ä v i r a n o m a i s i l l e + l e n t o k e n t t ä v i r a n o m a i s t e n + l e n t o k e n t t ä v y ö h y k k e i s t ä + l e n t o k e n t t ä y h t e y d e l l ä + l e n t o k e n t ä l l e + l e n t o k e n t ä l l ä + l e n t o k e n t ä n + l e n t o k e n t ä t + l e n t o k e s ä ä + l e n t o k i e l l o l l a + l e n t o k i e l l o n + l e n t o k i e l l o s s a + l e n t o k i e l l o s t a k i n + l e n t o k i e l l o t + l e n t o k i e l t o + l e n t o k i e l t o a + l e n t o k i e l t o a l u e + l e n t o k i e l t o a l u e e n + l e n t o k i e l t o a l u e e s e e n + l e n t o k i e l t o a l u e e s t a + l e n t o k i e l t o a l u e e t + l e n t o k i e l t o a l u e i d e n + l e n t o k i e l t o a l u e i t a + l e n t o k i e l t o a l u e t t a + l e n t o k i e l t o l i s t a a + l e n t o k i e l t o l u e t t e l o + l e n t o k i e l t o l u e t t e l o i t a + l e n t o k i e l t o l u e t t e l o o n + l e n t o k i e l t o o n + l e n t o k i e l t o v y ö h y k e + l e n t o k i e l t o v y ö h y k k e i d e n + l e n t o k i i n t i ö t + l e n t o k i l o m e t r e j ä + l e n t o k i l o m e t r e j ä m m e + l e n t o k i l o m e t r i ä + l e n t o k o k e m u s t e m m e + l e n t o k o n e + l e n t o k o n e b e n s i i n i n + l e n t o k o n e b o n g a r e i l l e + l e n t o k o n e b o n g a u s t a + l e n t o k o n e e l l a + l e n t o k o n e e n + l e n t o k o n e e n r a k e n n u s a l a n + l e n t o k o n e e n v a l m i s t a j a + l e n t o k o n e e n v a l m i s t a j i e n + l e n t o k o n e e s e e n + l e n t o k o n e e s s a + l e n t o k o n e e s t a + l e n t o k o n e e t + l e n t o k o n e h a r j o i t u k s i a + l e n t o k o n e i d e n + l e n t o k o n e i l l a + l e n t o k o n e i l l e + l e n t o k o n e i n s i n ö ö r i t + l e n t o k o n e i s i i n + l e n t o k o n e i s i i n s a + l e n t o k o n e i s k u i l t a + l e n t o k o n e i s s a + l e n t o k o n e i s t a + l e n t o k o n e i s t a a n + l e n t o k o n e i t a + l e n t o k o n e k a a p p a u k s e t + l e n t o k o n e k a a p p a u k s i i n + l e n t o k o n e k a a p p a u k s i s s a + l e n t o k o n e k a a p p a u k s i s t a + l e n t o k o n e k a a p p a u s + l e n t o k o n e k a u p o i s t a + l e n t o k o n e l e i k k i e n + l e n t o k o n e m e l u l l e + l e n t o k o n e m e l u u n + l e n t o k o n e m i e h i s t ö l l ä + l e n t o k o n e m o o t t o r i e n + l e n t o k o n e o n n e t t o m u u k s i e n + l e n t o k o n e o n n e t t o m u u t e e n + l e n t o k o n e p o l t t o a i n e e n + l e n t o k o n e p o l t t o a i n e i d e n + l e n t o k o n e s u u n n i t t e l i j a + l e n t o k o n e t e o l l i s u u d e l l e + l e n t o k o n e t e o l l i s u u d e n + l e n t o k o n e t e o l l i s u u d e s s a + l e n t o k o n e t e o l l i s u u d e s t a + l e n t o k o n e t e o l l i s u u s + l e n t o k o n e t e o l l i s u u t e e n + l e n t o k o n e t e o l l i s u u t t a + l e n t o k o n e t i l a k i n + l e n t o k o n e t t a + l e n t o k o n e t u r b i i n e j a + l e n t o k o n e t u r m a + l e n t o k o n e t y y p i n + l e n t o k o n e t y y p i s t ä + l e n t o k o n e t y y p i t + l e n t o k o n e t y y p p i e n + l e n t o k o n e v a l m i s t a j a + l e n t o k o n e v a l m i s t a j a a + l e n t o k o n e v a l m i s t a j i e n + l e n t o k o n e v a l m i s t a j i i n + l e n t o k o n e v a l m i s t a j i s t a + l e n t o k o n e v a l m i s t u k s e n + l e n t o k o u l u + l e n t o k u l j e t u k s e e n + l e n t o k u l j e t u k s e n + l e n t o k u l j e t u k s e t + l e n t o k u l j e t u k s i a + l e n t o k u l j e t u k s i i n + l e n t o k u l j e t u s + l e n t o k u l j e t u s a l a l l a + l e n t o k u l j e t u s a l a n + l e n t o k u l j e t u s p a l v e l u j e n + l e n t o k u l j e t u s p a l v e l u s s a + l e n t o k u l j e t u s s o p i m u s t e n + l e n t o k u l j e t u s t a + l e n t o k u l j e t u s t e n + l e n t o k u s t a n n u k s i a + l e n t o k y k y y n + l e n t o k ä s i k i r j a t + l e n t o k ä y t ä v i ä + l e n t o l e h t i s i ä + l e n t o l e h t i s t e n + l e n t o l e v i t y k s e e n + l e n t o l e v i t y k s e n + l e n t o l e v i t y k s i ä + l e n t o l e v i t y s + l e n t o l e v i t y s k i e l t o a + l e n t o l e v i t y s s u u n n i t e l m a + l e n t o l e v i t y s t e n + l e n t o l e v i t y s t ä + l e n t o l i i k e n n e + l e n t o l i i k e n n e a l a + l e n t o l i i k e n n e a l a a + l e n t o l i i k e n n e a l a a n + l e n t o l i i k e n n e a l a a n s a + l e n t o l i i k e n n e a l a l l a + l e n t o l i i k e n n e a l a l l e + l e n t o l i i k e n n e a l a n + l e n t o l i i k e n n e a l a s t a + l e n t o l i i k e n n e a l a t + l e n t o l i i k e n n e a l u e + l e n t o l i i k e n n e a l u e e n + l e n t o l i i k e n n e a l u e e s t a + l e n t o l i i k e n n e a s i a s s a + l e n t o l i i k e n n e d i r e k t i i v i n + l e n t o l i i k e n n e h ä n + l e n t o l i i k e n n e j ä r j e s t e l m i e n + l e n t o l i i k e n n e j ä r j e s t e l m ä + l e n t o l i i k e n n e j ä r j e s t e l m ä l l e + l e n t o l i i k e n n e j ä r j e s t e l m ä ä + l e n t o l i i k e n n e j ä r j e s t e l y s t ä + l e n t o l i i k e n n e j ä r j e s t e l y t + l e n t o l i i k e n n e k a a o s t a + l e n t o l i i k e n n e k e t j u n + l e n t o l i i k e n n e k y s y m y k s i s s ä + l e n t o l i i k e n n e l i i t o n + l e n t o l i i k e n n e l i i t t o + l e n t o l i i k e n n e m a k s u t + l e n t o l i i k e n n e m a r k k i n a t + l e n t o l i i k e n n e m a r k k i n o i d e n + l e n t o l i i k e n n e m a r k k i n o i h i n + l e n t o l i i k e n n e m a r k k i n o i l l a + l e n t o l i i k e n n e m a r k k i n o i s t a + l e n t o l i i k e n n e m a r k k i n o i t a + l e n t o l i i k e n n e o l o j e n + l e n t o l i i k e n n e p a k e t t i a + l e n t o l i i k e n n e p a l v e l u i d e n + l e n t o l i i k e n n e p a l v e l u i h i n + l e n t o l i i k e n n e p a l v e l u i s t a + l e n t o l i i k e n n e p a l v e l u j a + l e n t o l i i k e n n e p a l v e l u j e n + l e n t o l i i k e n n e p a l v e l u m a r k k i n o i d e n + l e n t o l i i k e n n e p a l v e l u t + l e n t o l i i k e n n e p o l i t i i k a n + l e n t o l i i k e n n e p o l i t i i k k a + l e n t o l i i k e n n e p o l i t i i k k a a + l e n t o l i i k e n n e p o l i t i i k k o j e n + l e n t o l i i k e n n e s o p i m u k s e e n + l e n t o l i i k e n n e s o p i m u k s e k s i + l e n t o l i i k e n n e s o p i m u k s e l l e + l e n t o l i i k e n n e s o p i m u k s e n + l e n t o l i i k e n n e s o p i m u k s e n a + l e n t o l i i k e n n e s o p i m u k s e n s a + l e n t o l i i k e n n e s o p i m u k s e s s a + l e n t o l i i k e n n e s o p i m u k s e s t a + l e n t o l i i k e n n e s o p i m u k s e t + l e n t o l i i k e n n e s o p i m u k s i a + l e n t o l i i k e n n e s o p i m u k s i i n + l e n t o l i i k e n n e s o p i m u k s i l l a + l e n t o l i i k e n n e s o p i m u k s i s s a + l e n t o l i i k e n n e s o p i m u k s i s t a + l e n t o l i i k e n n e s o p i m u s + l e n t o l i i k e n n e s o p i m u s n e u v o t t e l u j a + l e n t o l i i k e n n e s o p i m u s t a + l e n t o l i i k e n n e s o p i m u s t e n + l e n t o l i i k e n n e s u h t e i d e n + l e n t o l i i k e n n e s u h t e i t a + l e n t o l i i k e n n e t a r i f f e j a + l e n t o l i i k e n n e t e k n o l o g i a n + l e n t o l i i k e n n e t e o l l i s u u d e l l e + l e n t o l i i k e n n e t e o l l i s u u d e s t a + l e n t o l i i k e n n e t e o l l i s u u s + l e n t o l i i k e n n e t e o l l i s u u t e e n + l e n t o l i i k e n n e t o i m i n n a n + l e n t o l i i k e n n e t o i m i n t a + l e n t o l i i k e n n e t o i m i n t a a + l e n t o l i i k e n n e t t ä + l e n t o l i i k e n n e t u r v a l l i s u u t t a + l e n t o l i i k e n n e v e r k o s t a + l e n t o l i i k e n n e v e r k o s t o l l e + l e n t o l i i k e n n e v i r t o j e n + l e n t o l i i k e n n e y h t e i s t y ö t ä + l e n t o l i i k e n n e y h t e y d e t + l e n t o l i i k e n n e y h t e y k s i s s ä + l e n t o l i i k e n n e y h t i ö i h i n + l e n t o l i i k e n t e e l l e + l e n t o l i i k e n t e e l l ä + l e n t o l i i k e n t e e l t ä + l e n t o l i i k e n t e e m m e + l e n t o l i i k e n t e e n + l e n t o l i i k e n t e e n h a r j o i t t a j a n + l e n t o l i i k e n t e e n h a r j o i t t a j a t + l e n t o l i i k e n t e e n h a r j o i t t a j i e n + l e n t o l i i k e n t e e s e e n + l e n t o l i i k e n t e e s s ä + l e n t o l i i k e n t e e s t ä + l e n t o l i i k e n t e e s t ä m m e + l e n t o l i p p u + l e n t o l i p p u a + l e n t o l i p p u a a n + l e n t o l i p p u i h i n + l e n t o l i p p u j a + l e n t o l i p p u j e n + l e n t o l i p p u j e n k i n + l e n t o l i p p u j e n s a + l e n t o l i p p u n s a + l e n t o l i p p u p e t o k s e e n + l e n t o l i p p u v a r a u s t e n + l e n t o l i p p u v e r o + l e n t o l i p p u v e r o i h i n + l e n t o l i p p u v e r o s t a + l e n t o l i p u i s t a + l e n t o l i p u n + l e n t o l i p u s s a + l e n t o l i p u s t a + l e n t o l i p u t + l e n t o l u p a + l e n t o l u p a k i r j a + l e n t o l u p a n s a + l e n t o m a h d o l l i s u u k s i a + l e n t o m a i l i e n + l e n t o m a r k k i n a m m e + l e n t o m a r k k i n a t + l e n t o m a r k k i n o i l l a + l e n t o m a t k a + l e n t o m a t k a i l u + l e n t o m a t k a i l u a l a n + l e n t o m a t k a i l u n + l e n t o m a t k a i l u u n + l e n t o m a t k a k u s t a n n u k s i a + l e n t o m a t k a n + l e n t o m a t k a t a v a r o i d e n + l e n t o m a t k o i h i n + l e n t o m a t k o i l l e + l e n t o m a t k o i s s a + l e n t o m a t k o j a + l e n t o m a t k o j e n + l e n t o m a t k o j e n s a + l e n t o m a t k u s t a j a + l e n t o m a t k u s t a j a a + l e n t o m a t k u s t a j a n + l e n t o m a t k u s t a j a n a + l e n t o m a t k u s t a j a s t a + l e n t o m a t k u s t a j a t + l e n t o m a t k u s t a j a t i e t o j a + l e n t o m a t k u s t a j a t i e t o j e n + l e n t o m a t k u s t a j a v e r o + l e n t o m a t k u s t a j i a + l e n t o m a t k u s t a j i e n + l e n t o m a t k u s t a j i e n k i n + l e n t o m a t k u s t a j i l l e + l e n t o m a t k u s t a j i n a + l e n t o m a t k u s t a j i s t a + l e n t o m a t k u s t a j i s t a a n + l e n t o m a t k u s t a m i n e n + l e n t o m a t k u s t a m i s e e n + l e n t o m a t k u s t a m i s e n + l e n t o m a t k u s t a m i s e s s a + l e n t o m a t k u s t a m i s e s t a + l e n t o m a t k u s t a m i s t a + l e n t o m a t k u s t u k s e n + l e n t o m a t k u s t u k s e s s a + l e n t o m a t k u s t u s + l e n t o m a t k u s t u s t a + l e n t o m a t k u s t u s t a a n + l e n t o m a t k u s t u s v e r o t + l e n t o m e l u + l e n t o m e l u a + l e n t o m e l u n + l e n t o m e l u n o r m e j a + l e n t o m e l u s t a + l e n t o m e l u u n + l e n t o m e n e t t e l y j ä + l e n t o m i e h i s t ö ä + l e n t o m o o t t o r e i h i n + l e n t o m u o d o s t e l m a + l e n t o m u s e o + l e n t o m y r k y t y s t e n + l e n t o m ä ä r i e n + l e n t o n a v i g o i n t i i n + l e n t o n ä y t ö s o n n e t t o m u u s + l e n t o o n l ä h t ö m a s s a n + l e n t o p a k o t t e i t a + l e n t o p a l l o j o u k k u e + l e n t o p a l l o m a a j o u k k u e + l e n t o p a l l o n + l e n t o p a l v e l u + l e n t o p a l v e l u a l a + l e n t o p a l v e l u i t a + l e n t o p a l v e l u j a + l e n t o p a l v e l u j e n + l e n t o p a l v e l u s o p i m u k s e s t a + l e n t o p a l v e l u s o p i m u k s e t + l e n t o p a l v e l u s o p i m u k s i a + l e n t o p a l v e l u s o p i m u k s i s s a + l e n t o p a r a m e t r e j ä + l e n t o p e l k o + l e n t o p e t r o l i + l e n t o p e t r o l i n + l e n t o p e t r o l i v e r o t + l e n t o p i n t a + l e n t o p o l t t o a i n e + l e n t o p o l t t o a i n e e l l e + l e n t o p o l t t o a i n e e n + l e n t o p o l t t o a i n e e s t a + l e n t o p o l t t o a i n e i t a + l e n t o p o l t t o a i n e t t a + l e n t o p o l t t o a i n e v e r o n + l e n t o p o l t t o n e s t e i d e n + l e n t o p o l t t o n e s t e i l l e + l e n t o p o m m i + l e n t o p o s t i l i i k e n n e t t ä + l e n t o p u o l u s t u s + l e n t o r a h d i n + l e n t o r a h t i a + l e n t o r a h t i i n + l e n t o r a h t i j ä r j e s t e l m ä ä n + l e n t o r a h t i l i i k e n n e j ä r j e s t ö i h i n + l e n t o r a h t i m a r k k i n o i l l a + l e n t o r a t o j a + l e n t o r a t o j e n + l e n t o r e i t e i l l e + l e n t o r e i t e i l l ä + l e n t o r e i t e i s t ä + l e n t o r e i t i t + l e n t o r e i t t e j ä + l e n t o r e i t t i e n + l e n t o r e i t t i ä + l e n t o s a i r a a n k u l j e t u s t a + l e n t o s a m m u t u s k o n e i l t a + l e n t o s a t a m a + l e n t o s i m u l a a t t o r i + l e n t o s u k k a + l e n t o s u k k i e n + l e n t o s u u n n i t e l m a + l e n t o s u u n n i t e l m a a + l e n t o s u u n n i t e l m a a n s a + l e n t o s u u n n i t e l m a n + l e n t o s u u n n i t e l m i a + l e n t o s u u n n i t e l m i e n + l e n t o s u u n n i t e l m i s t a + l e n t o s ä ä n t ö j ä + l e n t o t e h o k k u u t t a + l e n t o t e o l l i s u u d e l l e + l e n t o t e o l l i s u u d e n + l e n t o t e s t a u k s e t + l e n t o t i e d o t u s a l u e + l e n t o t i e d o t u s a l u e e l l a + l e n t o t i e d o t u s a l u e e n + l e n t o t i e d o t u s a l u e e s e e n + l e n t o t i e d o t u s a l u e e t + l e n t o t i e d o t u s a l u e i t a + l e n t o t i e d o t u s a l u e t t a + l e n t o t i e t o i h i n + l e n t o t i e t o j a + l e n t o t o i m i n t a + l e n t o t o i m i n t a a + l e n t o t o i m i n t a a n + l e n t o t o i m i n t a t e h t ä v i i n + l e n t o t u k i a l u k s e l l e + l e n t o t u k i a l u k s e n + l e n t o t u k i a l u k s e t + l e n t o t u k i a l u k s i a + l e n t o t u k i a l u s + l e n t o t u k i a l u s t a + l e n t o t u k i k o h d a n + l e n t o t u k i k o h d a s t a + l e n t o t u k i k o h t a + l e n t o t u k i k o h t a n a + l e n t o t u n n i n + l e n t o t u n t i a + l e n t o t u r m a n + l e n t o t u r v a l l i s u u d e l l e + l e n t o t u r v a l l i s u u d e n + l e n t o t u r v a l l i s u u d e s s a + l e n t o t u r v a l l i s u u d e s t a + l e n t o t u r v a l l i s u u s + l e n t o t u r v a l l i s u u s a s e t u s + l e n t o t u r v a l l i s u u s a s i a n a + l e n t o t u r v a l l i s u u s e h t o j a + l e n t o t u r v a l l i s u u s j ä r j e s t e l m ä n + l e n t o t u r v a l l i s u u s j ä r j e s t ö n + l e n t o t u r v a l l i s u u s k e s k u s + l e n t o t u r v a l l i s u u s l a i n s ä ä d ä n n ö s s ä + l e n t o t u r v a l l i s u u s n o r m i e n + l e n t o t u r v a l l i s u u s o h j e l m a + l e n t o t u r v a l l i s u u s p a l v e l u i d e n + l e n t o t u r v a l l i s u u s p o l i t i i k k a + l e n t o t u r v a l l i s u u s p o l i t i i k k a a + l e n t o t u r v a l l i s u u s p o l i t i i k k a m m e + l e n t o t u r v a l l i s u u s r i s k e j ä + l e n t o t u r v a l l i s u u s s o p i m u k s e s t a + l e n t o t u r v a l l i s u u s s t a n d a r d i t + l e n t o t u r v a l l i s u u s s ä ä n t ö i h i n + l e n t o t u r v a l l i s u u s s ä ä n t ö j e n + l e n t o t u r v a l l i s u u s s ä ä t i ö + l e n t o t u r v a l l i s u u s t i l a n t e e s e e n + l e n t o t u r v a l l i s u u s t y ö n t e k i j ö i d e n + l e n t o t u r v a l l i s u u s v i r a n o m a i n e n + l e n t o t u r v a l l i s u u s v i r a n o m a i s e t + l e n t o t u r v a l l i s u u s v i r a n o m a i s i l l e + l e n t o t u r v a l l i s u u s v i r a n o m a i s t a + l e n t o t u r v a l l i s u u s v i r a n o m a i s t e n + l e n t o t u r v a l l i s u u s v i r a s t o + l e n t o t u r v a l l i s u u s v i r a s t o a + l e n t o t u r v a l l i s u u s v i r a s t o i l l e + l e n t o t u r v a l l i s u u s v i r a s t o l l a + l e n t o t u r v a l l i s u u s v i r a s t o l l e + l e n t o t u r v a l l i s u u s v i r a s t o n + l e n t o t u r v a l l i s u u s v i r a s t o o n + l e n t o t u r v a l l i s u u s v i r a s t o s t a + l e n t o t u r v a l l i s u u t e e n + l e n t o t u r v a l l i s u u t t a + l e n t o t u u l i v o i m a + l e n t o v a k u u t u s t e n + l e n t o v a l i k o i m a + l e n t o v a r a u s t i e t o j e n + l e n t o v a s t u u t a + l e n t o v e n e + l e n t o v e r o j a + l e n t o v i r a n o m a i s i l l e + l e n t o v y ö h y k e t t ä + l e n t o y h t e y d e t + l e n t o y h t e y k s i e n + l e n t o y h t e y k s i i n + l e n t o y h t e y k s i l l e + l e n t o y h t e y k s i s t ä + l e n t o y h t e y k s i ä + l e n t o y h t e y s + l e n t o y h t e y s k y s y m y k s e s s ä + l e n t o y h t e y t t ä + l e n t o y h t i ö + l e n t o y h t i ö a l a n + l e n t o y h t i ö a l l i a n s s i + l e n t o y h t i ö i d e m m e + l e n t o y h t i ö i d e n + l e n t o y h t i ö i h i n + l e n t o y h t i ö i l l e + l e n t o y h t i ö i l l e e n + l e n t o y h t i ö i l l e m m e + l e n t o y h t i ö i l l ä + l e n t o y h t i ö i l t ä + l e n t o y h t i ö i s s ä + l e n t o y h t i ö i s t ä + l e n t o y h t i ö i t ä + l e n t o y h t i ö l l e + l e n t o y h t i ö l t ä + l e n t o y h t i ö m a l l i + l e n t o y h t i ö n + l e n t o y h t i ö s t ä + l e n t o y h t i ö t + l e n t o y h t i ö t k i n + l e n t o y h t i ö t ä + l e n t o y h t i ö ö n + l e n t ä e n + l e n t ä e s s ä + l e n t ä e s s ä m m e + l e n t ä j i e n + l e n t ä j i ä + l e n t ä j ä l i i t t o j a + l e n t ä j ä p o j a l l e e n + l e n t ä j ä p u l a s t a + l e n t ä j ä t + l e n t ä k ä ä m m e + l e n t ä v i i n + l e n t ä v i ä + l e n t ä v ä t + l e n t ä ä + l e n t ä ä k s e e n + l e o p a r d i g e k k o + l e o p a r d i k i l p i k o n n a + l e o p a r d i k i s s a + l e o p a r d i l e g u a a n i + l e o p a r d i m i e h e t + l e o p a r d i m i e s + l e o p a r d i n k u k k a + l e p a k k o h a u k k a + l e p a k k o k i i t ä j ä + l e p a k k o l a j i t + l e p i n k ä i s k o t i n g a + l e p i n k ä i s m o n a r k k i + l e p i n k ä i s s i e p p o + l e p i n k ä i s t i m a l i + l e p o a + l e p o a i k a + l e p o a i k a a + l e p o a i k a a n + l e p o a i k a a n s a + l e p o a i k a j ä r j e s t e l m ä ä + l e p o a i k a n a + l e p o a i k a n s a + l e p o a i k a s ä ä n n ö s t e n + l e p o a i k o i h i n + l e p o a i k o i n a + l e p o a i k o j a + l e p o a i k o j a a n + l e p o a i k o j e n + l e p o a j a k s i + l e p o a j a n + l e p o a j a s t a + l e p o a j a t + l e p o a j o i l l e + l e p o a j o i l t a + l e p o a j o i s t a + l e p o a j o i s t a a n + l e p o a l u e e l l e + l e p o i t i ö + l e p o j a k s o + l e p o j a k s o a + l e p o j a k s o i h i n + l e p o j a k s o i s t a + l e p o j a k s o j a + l e p o j a k s o j e n + l e p o j a k s o n a + l e p o j a k s o n s a + l e p o j a k s o o n + l e p o k o d i l t a + l e p o m a s s a + l e p o o n + l e p o p a i k k a a + l e p o p a i k k o j a + l e p o p o t e n t i a a l i + l e p o p ä i v ä + l e p o p ä i v ä n ä + l e p o p ä i v ä ä + l e p o s i j a a n s a + l e p o s i t e e t + l e p o s o h v a k s i + l e p o s ä ä n t ö j ä + l e p o t a u k o + l e p o t a u k o a + l e p o t a u k o j a + l e p o t a u k o j e n + l e p o t a u o i l l a + l e p o t a u o i s t a + l e p o t a u o l l a + l e p o t a u o n + l e p o t a u o t + l e p o t i l a + l e p o t i l a a n + l e p o t u n n i t + l e p o t u n t e i h i n + l e p o t u n t e j a + l e p o v i r t a + l e p o v i r t a h ä v i ö i d e n + l e p o v i r t a h ä v i ö i s t ä + l e p p ä l i n t u + l e p p ä l o v i m i t t a r i + l e p p ä v a l k o m i t t a r i + l e p p ä y ö k k ö n e n + l e p r a h a n k k e e s e e n + l e p r a s t a + l e p s u m p i a + l e p t o n i e p o o k k i + l e p y t t e l y p o l i t i i k k a + l e p y t t ä ä k s e e n + l e p ä n t a t t i + l e s b o i h i n + l e s b o i s t a + l e s b o j e n + l e s b o k a n s a l a i s i a + l e s b o l i i k k e e s e e n + l e s b o t + l e s b o t a i t e i l i j a n + l e s i ä i s e t + l e s k e l t ä + l e s k e n e l ä k e t t ä + l e s k e n e l ä k k e e s e e n + l e s k e n e l ä k k e i d e n + l e s k e n e l ä k k e i t ä + l e s k i e n + l e s t i s s ä ä n + l e t k u n k i r i s t i n + l e t k u t k i n + l e u k a n i v e l + l e u k e m i a a + l e u k e m i a n + l e u k e m i a t a p a u k s i a + l e u k e m i a t a p a u s t a + l e u k e m i a t a p a u s t e n + l e u k e m i a t u t k i m u s + l e u k e m i a v i r u s + l e u k o o s i n + l e u k o o s i t a p a u k s i a + l e v a d i a + l e v e n t ä m i s e l l e + l e v e n t ä ä + l e v e y s a s t e + l e v e ä h u u l i s a r v i k u o n o + l e v e ä o s m a n k ä ä m i + l e v e ä r a i t e i n e n + l e v e ä t + l e v i k k i m ä ä r ä n + l e v i n n e e n + l e v i n n e i s y y s a l u e e l l a + l e v i n n e i s y y s a s t e + l e v i n n e i s y y s a s t e e s t a + l e v i n n y t + l e v i s i + l e v i s i v ä t + l e v i t e s s ä + l e v i t e t t y n ä + l e v i t e t ä ä n + l e v i t t i v ä t + l e v i t t ä i s i v ä t + l e v i t t ä m i s d i r e k t i i v i ä + l e v i t t ä m i s e e n + l e v i t t ä m i s e k s i + l e v i t t ä m i s e n + l e v i t t ä m i s e s s ä + l e v i t t ä m i s e s t ä + l e v i t t ä m i s o i k e u s + l e v i t t ä m i s t ä + l e v i t t ä m ä t t ä + l e v i t t ä n e e t + l e v i t t ä ä + l e v i t t ä ä k s e e n + l e v i t y k s e e n + l e v i t y k s e n + l e v i t y s j ä r j e s t e l m ä ä + l e v i t y s k o n e e t + l e v i t y s k o n e i d e n + l e v i t y s k o n e i s t a + l e v i t y s k o n e i s t o + l e v i t y s k o n e i s t o l l a + l e v i t y s p i n t a + l e v i t y s t o i m i n n a n + l e v i t y s v ä l i n e i t ä + l e v i t y s y h t i ö i d e n + l e v i t ä m m e + l e v i ä i s i + l e v i ä m i s e n + l e v i ä m i s e n n u s t e i s t a + l e v i ä m i s k a n a v a + l e v i ä m i s k a n a v a a + l e v i ä m i s k e h i t y k s e n + l e v i ä m i s m a l l e j a + l e v i ä m i s n o p e u s + l e v i ä m i s r i s k i + l e v i ä m i s r i s k i e n + l e v i ä m i s r i s k i s t ä + l e v i ä m i s r i s k i ä + l e v i ä m i s t a p a + l e v i ä m i s t a p a a n + l e v i ä m i s t a p o i h i n + l e v i ä m i s t a p o j a + l e v i ä m i s t a v o i s t a + l e v i ä m i s t ä + l e v i ä m ä s s ä + l e v i ä m ä ä n + l e v i ä v ä n + l e v i ä v ä s s ä + l e v i ä ä + l e v o l l e + l e v o l l i s e m m i n + l e v o n + l e v o t t o m a m m a k s i + l e v o t t o m a m m i k s i + l e v o t t o m a m p i + l e v o t t o m a s t a + l e v o t t o m i m m a l l e + l e v o t t o m u u d e t + l e v o t t o m u u k s i a + l e v o t t o m u u k s i e n + l e v o t t o m u u k s i i n + l e v o t t o m u u s p e s ä k e t t ä + l e v o t t o m u u s p e s ä k k e i s t ä + l e v o t t o m u u t t a + l e v y h a a r n i s k a + l e v y j a r r u + l e v y j ä + l e v y j ä t i t + l e v y k a u p p a + l e v y k k e i t ä + l e v y k u v a + l e v y m u i s t i + l e v y t e o l l i s u u d e l l e + l e v y t e o l l i s u u d e n + l e v y t e o l l i s u u s + l e v y t u o t t a j i a + l e v y t u o t t a j i l l e + l e v y t y s s o p i m u s + l e v y t y s t e n + l e v y v a r v a s g e k k o + l e v y ä + l e v ä b a r b i + l e v ä h d y s k e s k u k s e t + l e v ä h d y s p a i k k a h a n k e + l e v ä h d y s p a i k o i l l a + l e v ä k a t k a r a p u + l e v ä k e r r o s + l e v ä k o t i l o + l e v ä k u k i n t a + l e v ä k u k i n t a a + l e v ä k u k i n t o i h i n + l e v ä k u k i n t o j a + l e v ä m y r k k y n ä + l e v ä n n e i t ä + l e v ä n u o l i a i n e n + l e v ä p e r ä i s e s t i + l e v ä p e r ä i s y y d e n + l e v ä p o l t t o a i n e t e k n o l o g i a + l e v ä s i i r a + l e v ä s u k a r a p u + l e v ä v i i l a k a l a + l e z g i t + l i a a n i t i k k a n e n + l i a t a + l i b a n o n i l a i s e n + l i b a n o n i l a i s e t + l i b a n o n i l a i s i s s a + l i b a n o n i n s e t r i + l i b e r a a l e i h i n + l i b e r a a l e i l l e + l i b e r a a l e i l t a + l i b e r a a l e i m p i i n + l i b e r a a l e i n + l i b e r a a l e j a + l i b e r a a l e j a k i n + l i b e r a a l i a + l i b e r a a l i d e m o k r a a t e i l l a + l i b e r a a l i d e m o k r a a t e i l l e + l i b e r a a l i d e m o k r a a t e i l t a + l i b e r a a l i d e m o k r a a t i t + l i b e r a a l i d e m o k r a a t t e i h i n + l i b e r a a l i d e m o k r a a t t e i n a + l i b e r a a l i d e m o k r a a t t e j a + l i b e r a a l i d e m o k r a a t t i + l i b e r a a l i d e m o k r a a t t i a + l i b e r a a l i d e m o k r a a t t i e n + l i b e r a a l i d e m o k r a a t t i j ä s e n e t + l i b e r a a l i d e m o k r a a t t i n a + l i b e r a a l i d e m o k r a a t t i n e n + l i b e r a a l i d e m o k r a a t t i s e e n + l i b e r a a l i d e m o k r a a t t i s e l l e + l i b e r a a l i d e m o k r a a t t i s e n + l i b e r a a l i d e m o k r a a t t i s i l l e + l i b e r a a l i d e m o k r a a t t i s t a + l i b e r a a l i d e m o k r a a t t i s u u s + l i b e r a a l i d e m o k r a t i a + l i b e r a a l i d e m o k r a t i a l l e + l i b e r a a l i d e m o k r a t i a n + l i b e r a a l i d e m o k r a t i o i s s a + l i b e r a a l i e n + l i b e r a a l i e s i t t e l i j ä m m e + l i b e r a a l i f e m i n i s m i + l i b e r a a l i f i l o s o f i + l i b e r a a l i f u n d a m e n t a l i s t i e n + l i b e r a a l i h a l l i t u k s e n + l i b e r a a l i h a l l i t u s + l i b e r a a l i j o h t a j a n a + l i b e r a a l i j ä s e n + l i b e r a a l i j ä s e n e n + l i b e r a a l i j ä s e n e t + l i b e r a a l i j ä s e n t e n + l i b e r a a l i k a p i t a l i s m i s s a + l i b e r a a l i k e r h o o m m e + l i b e r a a l i k i i h k o i l i j a t + l i b e r a a l i k o l l e g a l l e n i + l i b e r a a l i k o l l e g a m m e + l i b e r a a l i k o l l e g a n i + l i b e r a a l i k o l l e g a t + l i b e r a a l i k o l l e g o i l l e + l i b e r a a l i k o l l e g o i l l e m m e + l i b e r a a l i k o l l e g o i s t a a n + l i b e r a a l i k o l l e g o j e m m e + l i b e r a a l i k o l l e g o j e n + l i b e r a a l i k o n s e r v a t i i v i t + l i b e r a a l i k o n s e r v a t i s m i + l i b e r a a l i l l e + l i b e r a a l i m i n i s t e r e i t ä + l i b e r a a l i m m a n + l i b e r a a l i m m a s s a + l i b e r a a l i m m a t + l i b e r a a l i m p a a + l i b e r a a l i m p a a n + l i b e r a a l i m p i + l i b e r a a l i m p i a + l i b e r a a l i m p i k i n + l i b e r a a l i n + l i b e r a a l i n a + l i b e r a a l i n a t i o n a l i s m i + l i b e r a a l i n u o r e t + l i b e r a a l i p e r h e e n + l i b e r a a l i p o l i i t i k k o + l i b e r a a l i p o l i i t i k k o n a + l i b e r a a l i p o l i i t i k o n + l i b e r a a l i p o l i t i i k a l l e + l i b e r a a l i p u o l u e + l i b e r a a l i p u o l u e e l t a + l i b e r a a l i p u o l u e e n + l i b e r a a l i p u o l u e e s e e n + l i b e r a a l i p u o l u e e t + l i b e r a a l i p u o l u e t t a + l i b e r a a l i p u r i s t i s e n + l i b e r a a l i p ä ä m i n i s t e r e i h i n + l i b e r a a l i r a d i k a a l i + l i b e r a a l i r y h m i e n + l i b e r a a l i r y h m i i n + l i b e r a a l i r y h m i t t y m ä n + l i b e r a a l i r y h m ä + l i b e r a a l i r y h m ä k i n + l i b e r a a l i r y h m ä l l e + l i b e r a a l i r y h m ä l l ä + l i b e r a a l i r y h m ä n + l i b e r a a l i r y h m ä n ä + l i b e r a a l i r y h m ä s s ä + l i b e r a a l i r y h m ä s t ä + l i b e r a a l i r y h m ä t + l i b e r a a l i r y h m ä ä + l i b e r a a l i r y h m ä ä n + l i b e r a a l i s e s t a + l i b e r a a l i s o s i a l i s t i e n + l i b e r a a l i s s a + l i b e r a a l i s t e n + l i b e r a a l i t + l i b e r a a l i t o v e r e i l t a a n + l i b e r a a l i v o i m i e n + l i b e r a a l i y s t ä v i ä m m e + l i b e r a a l i y s t ä v i ä n i + l i b e r a l i s m i i n + l i b e r a l i s m i n + l i b e r a l i s m i s t a + l i b e r a l i s o i m i s e s t a + l i b e r a l i s o i m i s k i e r r o k s i a + l i b e r a l i s o i n n i l l a + l i b e r a l i s o i n t i a + l i b e r a l i s o i n t i k i e r r o s + l i b e r a l i s o i n t i k o k e i l u l l a + l i b e r a l i s o i n t i m a l l i n + l i b e r a l i s o i n t i m e n e t t e l y j ä + l i b e r a l i s o i n t i m e n e t t e l y ä + l i b e r a l i s o i n t i p a k e t i l l a + l i b e r a l i s o i n t i p a k e t t i a + l i b e r a l i s o i n t i p o l i t i i k a l l a + l i b e r a l i s o i n t i p o l i t i i k a n + l i b e r a l i s o i n t i p o l i t i i k a s s a + l i b e r a l i s o i n t i p o l i t i i k k a + l i b e r a l i s o i n t i p r o s e s s e j a + l i b e r a l i s o i n t i p r o s e s s i a + l i b e r a l i s o i n t i p r o s e s s i e n + l i b e r a l i s o i n t i s i t o u m u k s i s t a + l i b e r a l i s o i n t i s u u n n i t e l m a + l i b e r a l i s o i n t i t a v o i t t e e s e e n + l i b e r a l i s o i n t i t o i m e n p i t e e t + l i b e r a l i s o i n t i t o i m i l l a + l i b e r a l i s o i n t i v a a t i m u k s i a + l i b e r a l i s t i s e n + l i b e r a l i s t i s e s s a + l i b e r a l i s t i s e t + l i b e r a l i s t i s i i n + l i b e r a l i s t i s t e n + l i b e r t a a r i p u o l u e + l i b y a l a i s l a p s i a + l i e h u a + l i e j u k a m p e l a + l i e j u k a n a + l i e j u s i m p u k k a + l i e j u t a s k u r a p u + l i e j u t o k k o + l i e k i n h e i t t i m e l l ä + l i e k k e i h i n + l i e k k i e n + l i e k k i h u n t u l a v a s t a j a + l i e k k i k a u l u r i k o l i b r i + l i e k k i k e r t t u l i + l i e k k i k u r k k u k o l i b r i + l i e k k i k u t o j a + l i e k k i n i s k a t i k k a + l i e k k i p u u + l i e k k i p y r s t ö a m a t s o n i + l i e k k i p ä ä k a r d i n a a l i + l i e k k i s u l a t u s + l i e k k i t i k k a n e n + l i e k k i v a t s a r a s t a s + l i e k k i v i h e r t i k k a + l i e k o v a r p i o + l i e m e s s ä + l i e m i k i l p i k o n n a + l i e m i k i l p i k o n n i a + l i e m i k u u t i o + l i e n e e k i n + l i e n e e k ö + l i e n n y t t ä m ä ä n + l i e n n y t y s p e r i a a t t e e l l a + l i e n n y t y s p r o s e s s i a + l i e n n y t y s p r o s e s s i s s a + l i e n n y t y s v y ö h y k k e e l l ä + l i e s i t u u l e t i n + l i e t e k a t a s t r o f i + l i e t e l a n n a n + l i e t e t t ä + l i e t s o a + l i e t s o m i s e s t a + l i e t s o n t a p u h e i s i i n s a + l i e t s o t a + l i e t s o v a l l e + l i e t s o v a n + l i e t s o v a t + l i e t t e e l l e + l i e t t e e n + l i e t t u a a + l i e t t u a a n + l i e t t u a l a i s e t + l i e t t u a l a i s p e r h e t t ä + l i e t t u a l a i s t e n + l i e t t u a l a i s y h t i ö i t ä + l i e t t u a l l e + l i e t t u a n + l i e t t u a n a j o k o i r a + l i e t t u a s s a + l i e t t u a s t a + l i e v e i l m i ö i d e n + l i e v e i l m i ö i t ä + l i e v e m m i k s i + l i e v e m m i n + l i e v e m m ä k s i + l i e v e m m ä n + l i e v e m m ä t + l i e v e m p i + l i e v e m p i n ä + l i e v e m p i ä + l i e v e m p ä ä + l i e v e n n e t ä ä n + l i e v e n n y s t o i m e t + l i e v e n n y s t o i m i e n + l i e v e n n y s y r i t y k s e t + l i e v e n t ä m i s e e n + l i e v e n t ä m i s e k s i + l i e v e n t ä m i s r i n t a m a + l i e v e n t ä m i s s u u n n i t e l m i i n + l i e v e n t ä m i s t a r v e + l i e v e n t ä m i s t a v o i t t e i s i i n + l i e v e n t ä m i s t o i m e n p i t e e t + l i e v e n t ä m i s t o i m e n p i t e i s t ä + l i e v e n t ä m i s t o i m e n p i t e i t ä + l i e v e n t ä m i s t o i m i a + l i e v e n t ä m i s t o i m i i n + l i e v e n t ä m i s t o i m i s t a + l i e v e n t ä m i s t ä + l i e v e n t ä m i s y r i t y k s i s t ä + l i e v e n t ä m ä t t ä + l i e v e n t ä m ä ä n + l i e v e n t ä n e e t + l i e v e n t ä ä + l i e v e n t ä ä k s e e n + l i e v e n t ä ä k s e m m e + l i e v e n t ä ä k s e n i + l i e v i m m ä t + l i e v i m p i ä + l i e v i t t ä k ä ä m m e + l i e v i t t ä m i s e e n + l i e v i t t ä m i s e k s i + l i e v i t t ä m i s o h j e l m i e n + l i e v i t t ä m i s t o i m i e n + l i e v i t t ä m i s t ä + l i e v i t t ä m ä ä n + l i e v i t t ä v i ä + l i e v i t t ä v ä n + l i e v i t t ä v ä t + l i e v i t t ä ä + l i e v i t t ä ä k s e e n + l i e v i t t ä ä k s e m m e + l i e v i t y k s e e n + l i e v i ä + l i f t a r e i l l e + l i g n i i t t i v o i m a l o i l l a + l i h a a + l i h a a n + l i h a e r i s t ä + l i h a e r ä + l i h a h a k k e l u s t a + l i h a h y g i e n i a a + l i h a j a l o s t e + l i h a j a l o s t e i d e n + l i h a j a l o s t e i s i i n + l i h a j a u h o + l i h a j a u h o a + l i h a j a u h o i l l a + l i h a j a u h o j a + l i h a j a u h o j e n + l i h a j a u h o l l a + l i h a j a u h o m ä ä r i ä + l i h a j a u h o n + l i h a j a u h o o n + l i h a k a r j a + l i h a k a r j a n k a s v a t t a j i i n + l i h a k a u p a n + l i h a k a u p o i l l a + l i h a k a u p o i s s a + l i h a k a u p o i s t a + l i h a k a u p p a a + l i h a k a u p p o j a + l i h a k i i s t a s s a + l i h a k i l o a + l i h a k i l o n + l i h a k s e t + l i h a l a a d u t + l i h a l a j i t + l i h a l a m p a i s t a + l i h a l e i k k e l e i d e n + l i h a l i i m a + l i h a l i i m a n + l i h a l i i m a n a + l i h a l i i m o i s t a + l i h a l l a + l i h a l l e + l i h a l t a + l i h a l u u j a u h o + l i h a l u u j a u h o a + l i h a l u u j a u h o i s t a + l i h a l u u j a u h o j e n + l i h a l u u j a u h o l l a + l i h a l u u j a u h o m ä ä r i e n + l i h a l u u j a u h o n + l i h a l u u j a u h o n a + l i h a l u u j a u h o n k i n + l i h a l u u j a u h o s s a + l i h a l u u j a u h o s t a + l i h a l u u j a u h o t + l i h a m a r k k i n a t + l i h a m a r k k i n o i h i n + l i h a m a r k k i n o i l l a + l i h a m a r k k i n o i l l a k i n + l i h a m a r k k i n o i l l e + l i h a m a r k k i n o i t a + l i h a m y l l y + l i h a m ä ä r i e n + l i h a n + l i h a n h i n t a + l i h a n h i n t o i h i n + l i h a n j a l o s t a m o i d e n + l i h a n j a l o s t a m o i t a + l i h a n j a l o s t u s l a i t o k s e n + l i h a n j a l o s t u s l a i t o k s i s s a + l i h a n j a l o s t u s l a i t o s t e n + l i h a n j a l o s t u s r y h m ä + l i h a n j a l o s t u s t e o l l i s u u d e n + l i h a n j a l o s t u s t e o l l i s u u s + l i h a n j a l o s t u s y r i t y k s e t + l i h a n k u l u t u s + l i h a n k u l u t u s t a + l i h a n m y y n n i s s ä + l i h a n o s i a + l i h a n p a l a + l i h a n p a l a a + l i h a n p a l a a n + l i h a n p a l o i s t a + l i h a n p a l o j a + l i h a n s y ö j i e n + l i h a n s y ö j ä + l i h a n s y ö j ä k a l a l a j e j a + l i h a n s y ö j ä k a s v i + l i h a n s y ö j ä t + l i h a n s y ö n t i + l i h a n t a r k a s t a j a a + l i h a n t a r k a s t a j i a + l i h a n t a r k a s t a j i e n + l i h a n t a r k a s t a j i l l a + l i h a n t a r k a s t a j i n a + l i h a n t a r k a s t u k s e s s a + l i h a n t a r k a s t u s j ä r j e s t e l m ä ä + l i h a n t a r k a s t u s l a i t o s t e n + l i h a n t a r k a s t u s p a l v e l u t + l i h a n t u o n n i n + l i h a n t u o n t i + l i h a n t u o t a n n o n + l i h a n t u o t a n n o s s a + l i h a n t u o t a n t o + l i h a n t u o t a n t o a + l i h a n t u o t a n t o a l a a n + l i h a n t u o t a n t o o n + l i h a n t u o t a n t o s e k t o r i n + l i h a n t u o t a n t o y k s i k ö t + l i h a n t u o t t a j a + l i h a n t u o t t a j a t + l i h a n t u o t t a j i e n + l i h a n t u o t t a j i l l e + l i h a n v a l v o n t a a n + l i h a o n g e l m a a n + l i h a o n g e l m a n + l i h a p a k e t t i + l i h a p a l a + l i h a p a l a a + l i h a p a l a n + l i h a p a l a t + l i h a p a l o i s t a + l i h a p a l o j a + l i h a p a l o j e n + l i h a p u l l a k u u r o j a + l i h a r e k k o j a + l i h a s d y s t r o f i a + l i h a s e k t o r i l l a + l i h a s i k a l a n + l i h a s i k o j a + l i h a s k a n d a a l i a + l i h a s k a n d a a l i e n + l i h a s k i p u + l i h a s k u d o s + l i h a s k u n t o h a r j o i t e + l i h a s k ä ä m i + l i h a s m a s s a a + l i h a s r a p p e u m a + l i h a s r e l a k s a n t i t + l i h a s t a + l i h a s t a u d i t + l i h a s v o i m a a + l i h a s ä i l y k k e e t + l i h a t a l o u d e n + l i h a t a r k a s t a j a + l i h a t a r k a s t a j a t + l i h a t a r k a s t u s t e n + l i h a t e h t a a l l a + l i h a t e h t a i k s i + l i h a t e o l l i s u u d e l t a + l i h a t e o l l i s u u d e n + l i h a t e o l l i s u u d e s s a + l i h a t e o l l i s u u s + l i h a t e o l l i s u u t e e n + l i h a t e o l l i s u u t e m m e + l i h a t e o l l i s u u t t a + l i h a t i l o j e n + l i h a t i s k e i l t ä + l i h a t o n n i n + l i h a t u k k i + l i h a t u o t e + l i h a t u o t t e e n + l i h a t u o t t e e s s a + l i h a t u o t t e e t + l i h a t u o t t e i d e n + l i h a t u o t t e i l l e + l i h a t u o t t e i s i i n + l i h a t u o t t e i s s a + l i h a t u o t t e i s t a + l i h a t u o t t e i s t a m m e + l i h a t u o t t e i t a + l i h a t y y p p i + l i h a t y y p p i ä + l i h a v a l m i s t e e t + l i h a v a l m i s t e i d e n + l i h a v a l m i s t e i h i n + l i h a v a l m i s t e i s i i n + l i h a v a l m i s t e i s s a + l i h a v a l m i s t e i t a + l i h a v a l m i s t e t t a + l i h a v a r a s t o t + l i h a v e i t s i + l i h a v e r o i s t a + l i h a v e r o j e n + l i h a v e r o n + l i h a v i e n + l i h a v i n a + l i h a v u o r i a + l i h a v u o r i i n + l i h a v u o r i l t a + l i h a v u u s e p i d e m i a + l i h a v u u s e p i d e m i a n + l i h a v u u s o n g e l m a a + l i h a v u u s o n g e l m a n + l i h a v u u s o n g e l m a s t a + l i h a v u u s t a p a u k s i s t a + l i h a v y ö h y k k e e n ä + l i h o j a + l i h o m i n e n + l i h o m i s e e n + l i h o t e t t a v a t + l i h o t t a m a t t o m i e n + l i h o t u s e l ä i m e t + l i h o t u s e l ä i m i i n + l i h o t u s e l ä i m i l l ä + l i h o t u s j ä r j e s t e l m i e n + l i h o t u s k e i n o s t a + l i h o t u s l a i t o s t e n + l i h o t u s v a i h e + l i h o t u s v a i h e e s s a + l i h o t u s y k s i k ö i d e n + l i h o t u s y k s i k ö s s ä + l i h o v a t + l i i a k s i k i n + l i i a l l a + l i i a l l i s e e n + l i i a l l i s e k s i + l i i a l l i s e l l a + l i i a l l i s e l l e + l i i a l l i s e l t a + l i i a l l i s e n + l i i a l l i s e n a + l i i a l l i s e s t a + l i i a l l i s e s t i + l i i a l l i s i a + l i i a l l i s i l l a + l i i a l l i s i l t a + l i i a l l i s i n a + l i i a l l i s i s t a + l i i a l l i s t a + l i i a l l i s t e n + l i i a l l i s u u k s i i n + l i i a n k i n + l i i a s t a + l i i a t + l i i g a c u p + l i i g a k a u s i + l i i g a k i l p a i l u + l i i g a n + l i i g a s e u r a a n + l i i g a t a u l u n + l i i k a a k i n + l i i k a a n + l i i k a h y ö d y n t ä m i n e n + l i i k a h y ö d y n t ä m i s e l t ä + l i i k a h y ö d y n t ä m i s e n + l i i k a h y ö d y n t ä m i s e s t ä + l i i k a i n v e s t o i n t e j a + l i i k a i n v e s t o i n t i i n + l i i k a k a l a s t a m m e + l i i k a k a l a s t u k s e e n + l i i k a k a l a s t u k s e l l e + l i i k a k a l a s t u k s e l t a + l i i k a k a l a s t u k s e n + l i i k a k a l a s t u k s e s t a + l i i k a k a l a s t u s + l i i k a k a l a s t u s o n g e l m a m m e + l i i k a k a l a s t u s o n g e l m i a + l i i k a k a l a s t u s t a + l i i k a k a n t a a + l i i k a k a n t a a n + l i i k a k a p a s i t e e t i l l a + l i i k a k a p a s i t e e t i n + l i i k a k a p a s i t e e t i s t a + l i i k a k a p a s i t e e t t i + l i i k a k a p a s i t e e t t i a + l i i k a k a p a s i t e e t t i a m m e + l i i k a k a p a s i t e e t t i i n + l i i k a k o r v a u s t a + l i i k a k u l u t u k s e e n + l i i k a k u l u t u k s e s t a m m e + l i i k a k u l u t u s + l i i k a k u l u t u s t a + l i i k a k u o r m i t u s t a + l i i k a k ä y t t ö + l i i k a k ä y t t ö ä + l i i k a k ä y t t ö ö n + l i i k a k ä y t ö n + l i i k a k ä y t ö s t ä + l i i k a l i h a v i a + l i i k a l i h a v u u d e s t a + l i i k a l i h a v u u s + l i i k a l i h a v u u s e p i d e m i a s t a + l i i k a l i h a v u u s o n g e l m a a + l i i k a l i h a v u u t t a + l i i k a m a k s u j e n + l i i k a m e l u a + l i i k a p a i n o s t u k s e n + l i i k a p y y n n i s t ä + l i i k a p ä ä s t ö m a k s u n + l i i k a r a h o i t t a m i s e e n + l i i k a r a k e n t a m i s e n + l i i k a r a s i t e t u i l l e + l i i k a s ä ä n n ö s t e l y ä + l i i k a s ä ä n t e l y + l i i k a s ä ä n t e l y s t ä + l i i k a s ä ä n t e l y y n + l i i k a s ä ä n t e l y ä + l i i k a t u o n n i s t a + l i i k a t u o n t i a + l i i k a t u o t a n n o n + l i i k a t u o t a n t o a + l i i k a t y ö v o i m a a + l i i k a u t t a m a t t a + l i i k a v e r o t u k s e e n + l i i k e a l a l l a + l i i k e a l a l l e + l i i k e a l a n + l i i k e a r v o k s i + l i i k e a s i o i t a + l i i k e h a n k k e e t + l i i k e h d i n t ä ä + l i i k e h e r m o + l i i k e h u o n e i s t o n a + l i i k e h u o n e i s t o t + l i i k e i d e a a n s a + l i i k e i d e o i d e n + l i i k e i d e o i t a a n + l i i k e i l m a i l u s e k t o r i l l a + l i i k e j u r i s t i n + l i i k e k e s k u k s i i n + l i i k e k e s k u s t e l u j a + l i i k e k e s k u s t e n + l i i k e k o h t e i n a + l i i k e k u m p p a n e i h i n + l i i k e k u m p p a n e i l l e + l i i k e k u m p p a n e i n a + l i i k e k u m p p a n e i t a + l i i k e k u m p p a n i n + l i i k e k u m p p a n i n a + l i i k e k u m p p a n i n s a + l i i k e k u s t a n n u k s i s t a + l i i k e k u s t a n n u s t e n + l i i k e k ä y t ä n t ö m a l l e i l l e + l i i k e l a i t o s t e n + l i i k e l e n n o i l l a + l i i k e l e n t o k o n e + l i i k e l e n t o k o n e e n + l i i k e l e n t o t o i m i n n a n + l i i k e l e n t o t o i m i n t a + l i i k e l e n t o t o i m i n t a a + l i i k e l e n t o y h t i ö i l l ä + l i i k e l o u n a a t + l i i k e m a a i l m a + l i i k e m a a i l m a a + l i i k e m a a i l m a a n + l i i k e m a a i l m a n + l i i k e m a a i l m a s s a + l i i k e m a l l i l t a a n + l i i k e m a t k a i l i j a t + l i i k e m a t k a i l i j o i d e n + l i i k e m a t k a i l i j o i l l e + l i i k e m a t k a i l i j o i t a + l i i k e m a t k a i l u a + l i i k e m a t k a i l u n + l i i k e m a t k a i l u u n + l i i k e m a t k a l u o k a s s a + l i i k e m a t k o i h i n + l i i k e m a t k o i l l a + l i i k e m a t k o j a + l i i k e m a t k u s t a j a + l i i k e m a t k u s t a m i s e e n + l i i k e m i e h e t + l i i k e m i e h i k s i + l i i k e m i e h i l l e + l i i k e m i e h i s t ä + l i i k e m i e h i ä + l i i k e m i e s l u o k a n + l i i k e m i e s r y h m ä n + l i i k e m i e s t e n + l i i k e m i t t a u s l a i t t e i d e n + l i i k e n n e a l a + l i i k e n n e a l a a + l i i k e n n e a l a a n + l i i k e n n e a l a l l a + l i i k e n n e a l a l l a k i n + l i i k e n n e a l a l l e + l i i k e n n e a l a n + l i i k e n n e a l a n k i n + l i i k e n n e a l a s t a + l i i k e n n e a l o i l l a + l i i k e n n e a l o i l t a + l i i k e n n e a l o j a + l i i k e n n e a l o j e n + l i i k e n n e a l u e + l i i k e n n e a l u e e n + l i i k e n n e a l u e e s e e n + l i i k e n n e a l u e i t a + l i i k e n n e a l u e t t a + l i i k e n n e a s i a k i r j a + l i i k e n n e a s i a k i r j a a + l i i k e n n e a s i a k i r j o j a + l i i k e n n e a s i a s s a + l i i k e n n e a s i a t + l i i k e n n e a s i o i d e n + l i i k e n n e a s i o i h i n + l i i k e n n e a s i o i s s a + l i i k e n n e a s i o i s t a + l i i k e n n e a s i o i t a + l i i k e n n e d i r e k t i i v i ä + l i i k e n n e h a n k e t t a + l i i k e n n e h a n k k e e s t a + l i i k e n n e h a n k k e e t + l i i k e n n e h a n k k e i d e n + l i i k e n n e h a n k k e i s i i n + l i i k e n n e h a n k k e i s s a + l i i k e n n e h a n k k e i s t a + l i i k e n n e h i n t o j e n + l i i k e n n e h ä i r i ö i d e n + l i i k e n n e h ä i r i ö i t ä + l i i k e n n e i n f a r k t i a + l i i k e n n e i n f r a s t r u k t u u r e i h i n + l i i k e n n e i n f r a s t r u k t u u r e j a + l i i k e n n e i n f r a s t r u k t u u r i + l i i k e n n e i n f r a s t r u k t u u r i a + l i i k e n n e i n f r a s t r u k t u u r i a a n + l i i k e n n e i n f r a s t r u k t u u r i e n + l i i k e n n e i n f r a s t r u k t u u r i h a n k k e i s i i n + l i i k e n n e i n f r a s t r u k t u u r i i n + l i i k e n n e i n f r a s t r u k t u u r i k u s t a n n u k s i a + l i i k e n n e i n f r a s t r u k t u u r i l l e + l i i k e n n e i n f r a s t r u k t u u r i n + l i i k e n n e i n f r a s t r u k t u u r i s s a + l i i k e n n e i n f r a s t r u k t u u r i s t a + l i i k e n n e i n f r a s t r u k t u u r i t + l i i k e n n e i n f r a s t r u k t u u r i v e r k k o + l i i k e n n e i n v e s t o i n n e i l l e + l i i k e n n e i n v e s t o i n t e i h i n + l i i k e n n e j ä r j e s t e l m i e m m e + l i i k e n n e j ä r j e s t e l m i e n + l i i k e n n e j ä r j e s t e l m i i m m e + l i i k e n n e j ä r j e s t e l m i i n + l i i k e n n e j ä r j e s t e l m i l l e + l i i k e n n e j ä r j e s t e l m i l l ä + l i i k e n n e j ä r j e s t e l m i s s ä + l i i k e n n e j ä r j e s t e l m i s t ä + l i i k e n n e j ä r j e s t e l m i ä + l i i k e n n e j ä r j e s t e l m ä + l i i k e n n e j ä r j e s t e l m ä l l e + l i i k e n n e j ä r j e s t e l m ä l l e e n + l i i k e n n e j ä r j e s t e l m ä l l ä + l i i k e n n e j ä r j e s t e l m ä m m e + l i i k e n n e j ä r j e s t e l m ä n + l i i k e n n e j ä r j e s t e l m ä n s ä + l i i k e n n e j ä r j e s t e l m ä s s ä + l i i k e n n e j ä r j e s t e l m ä s s ä m m e + l i i k e n n e j ä r j e s t e l m ä s t ä + l i i k e n n e j ä r j e s t e l m ä s t ä m m e + l i i k e n n e j ä r j e s t e l m ä t + l i i k e n n e j ä r j e s t e l m ä ä + l i i k e n n e j ä r j e s t e l m ä ä m m e + l i i k e n n e j ä r j e s t e l m ä ä n + l i i k e n n e j ä r j e s t e l y i s t ä + l i i k e n n e j ä r j e s t e l y j e n + l i i k e n n e j ä r j e s t e l y j ä + l i i k e n n e j ä r j e s t e l y t + l i i k e n n e j ä r j e s t ö t + l i i k e n n e k a a o k s e n + l i i k e n n e k a a o k s e s t a + l i i k e n n e k a a o s + l i i k e n n e k a a o s t a + l i i k e n n e k a l u s t o + l i i k e n n e k a p a s i t e e t i n + l i i k e n n e k a s v a t u s t a + l i i k e n n e k e s k u k s i l l a + l i i k e n n e k e s k u k s i s s a + l i i k e n n e k e s k u k s i s t a + l i i k e n n e k e s k u s t e n + l i i k e n n e k e t j u a + l i i k e n n e k e t j u i k s i + l i i k e n n e k e t j u j e n + l i i k e n n e k e t j u n + l i i k e n n e k i e l l o t + l i i k e n n e k i e l t o j a + l i i k e n n e k o m i s s a a r i + l i i k e n n e k o m i t e a n + l i i k e n n e k o n f e r e n s s i n + l i i k e n n e k o n f e r e n s s i t + l i i k e n n e k o n g r e s s i + l i i k e n n e k r i i s i + l i i k e n n e k r i i s i i n + l i i k e n n e k r i i s i k s i + l i i k e n n e k u l t t u u r i a + l i i k e n n e k u l t t u u r i n + l i i k e n n e k u m p p a n u u s + l i i k e n n e k u o l e m a + l i i k e n n e k u o l e m a a + l i i k e n n e k u o l e m a t + l i i k e n n e k u o l e m i a + l i i k e n n e k u o l e m i e n + l i i k e n n e k u o l e m i s t a + l i i k e n n e k u s t a n n u k s e t + l i i k e n n e k u s t a n n u k s i a + l i i k e n n e k u s t a n n u k s i s s a + l i i k e n n e k u s t a n n u s t e n + l i i k e n n e k y s y m y k s e e n + l i i k e n n e k y s y m y k s e n + l i i k e n n e k y s y m y k s e s s ä + l i i k e n n e k y s y m y k s i s t ä + l i i k e n n e k ä s i t y s + l i i k e n n e k ä y t t ä y t y m i n e n + l i i k e n n e k ä y t ä v i e n + l i i k e n n e k ä y t ä v i i n + l i i k e n n e k ä y t ä v i l l ä + l i i k e n n e k ä y t ä v i s t ä + l i i k e n n e k ä y t ä v i ä + l i i k e n n e k ä y t ä v ä + l i i k e n n e k ä y t ä v ä n + l i i k e n n e k ä y t ä v ä s s ä + l i i k e n n e k ä y t ä v ä ä + l i i k e n n e l a i n s ä ä d ä n n ö n + l i i k e n n e l a i n s ä ä d ä n t ö ä + l i i k e n n e l a i n s ä ä d ä n t ö ö n + l i i k e n n e l a i s s a + l i i k e n n e l a i t o k s e t + l i i k e n n e l e n t o k o n e t t a + l i i k e n n e l e n t ä j i ä + l i i k e n n e l e n t ä j ä + l i i k e n n e l u o k k a a n + l i i k e n n e m a h d o l l i s u u k s i a + l i i k e n n e m a k s u j a + l i i k e n n e m a k s u j e n + l i i k e n n e m a k s u t + l i i k e n n e m a l l e j a + l i i k e n n e m a l l i + l i i k e n n e m a r k k i n a t + l i i k e n n e m a r k k i n o i d e n + l i i k e n n e m a r k k i n o i l l a + l i i k e n n e m a r k k i n o i l l e + l i i k e n n e m a r k k i n o i s t a + l i i k e n n e m a r k k i n o i t a + l i i k e n n e m e l u n + l i i k e n n e m e n e t e l m i e n + l i i k e n n e m e n o i s t a + l i i k e n n e m e r k e i s t ä + l i i k e n n e m e r k i t + l i i k e n n e m e r k k e j ä + l i i k e n n e m e r k k i + l i i k e n n e m e r k k i e n + l i i k e n n e m i n i s t e r e i d e n + l i i k e n n e m i n i s t e r e i l l e + l i i k e n n e m i n i s t e r e i l t ä + l i i k e n n e m i n i s t e r e i t ä + l i i k e n n e m i n i s t e r e j ä + l i i k e n n e m i n i s t e r i + l i i k e n n e m i n i s t e r i e n + l i i k e n n e m i n i s t e r i e n s ä + l i i k e n n e m i n i s t e r i k o l l e g o i l t a a n + l i i k e n n e m i n i s t e r i l l e + l i i k e n n e m i n i s t e r i m m e + l i i k e n n e m i n i s t e r i n + l i i k e n n e m i n i s t e r i n e u v o s t o n + l i i k e n n e m i n i s t e r i n ä + l i i k e n n e m i n i s t e r i t + l i i k e n n e m i n i s t e r i ä + l i i k e n n e m i n i s t e r i ö + l i i k e n n e m i n i s t e r i ö n + l i i k e n n e m i n i s t e r i ö s s ä + l i i k e n n e m u o d o i l l a + l i i k e n n e m u o d o i l l e + l i i k e n n e m u o d o i l t a + l i i k e n n e m u o d o i s s a + l i i k e n n e m u o d o i s t a + l i i k e n n e m u o d o l l a + l i i k e n n e m u o d o l l e + l i i k e n n e m u o d o n + l i i k e n n e m u o d o s s a + l i i k e n n e m u o d o s t a + l i i k e n n e m u o d o t + l i i k e n n e m u o t o + l i i k e n n e m u o t o a + l i i k e n n e m u o t o i h i n + l i i k e n n e m u o t o j a + l i i k e n n e m u o t o j e n + l i i k e n n e m u o t o j e n k i n + l i i k e n n e m u o t o n a + l i i k e n n e m u o t o o n + l i i k e n n e m u o t o s i i r t y m ä + l i i k e n n e m u o t o s i i r t y m ä h a n k k e i d e n + l i i k e n n e m u o t o s i i r t y m ä n + l i i k e n n e m u o t o s i i r t y m ä t a v o i t t e e s t a + l i i k e n n e m u o t o s i i r t y m ä ä + l i i k e n n e m u o t o s i i r t y m ä ä n + l i i k e n n e m ä ä r i e n + l i i k e n n e m ä ä r i i n + l i i k e n n e m ä ä r i ä + l i i k e n n e m ä ä r i ä ä n + l i i k e n n e m ä ä r ä n + l i i k e n n e m ä ä r ä r a h o j a + l i i k e n n e m ä ä r ä t + l i i k e n n e m ä ä r ä ä + l i i k e n n e n e u v o s t o + l i i k e n n e n e u v o s t o a + l i i k e n n e n e u v o s t o l l e + l i i k e n n e n e u v o s t o l t a + l i i k e n n e n e u v o s t o n + l i i k e n n e n e u v o s t o s s a + l i i k e n n e o i k e u d e n + l i i k e n n e o i k e u d e t + l i i k e n n e o i k e u k s i a + l i i k e n n e o i k e u k s i e n + l i i k e n n e o i k e u k s i s t a + l i i k e n n e o i k e u s p ä i v ä n + l i i k e n n e o l o s u h t e e t + l i i k e n n e o l o s u h t e i d e n + l i i k e n n e o l o t + l i i k e n n e o n g e l m a + l i i k e n n e o n g e l m a a n + l i i k e n n e o n g e l m a n s a + l i i k e n n e o n g e l m a s t a + l i i k e n n e o n g e l m a t + l i i k e n n e o n g e l m i a + l i i k e n n e o n g e l m i a a n + l i i k e n n e o n g e l m i e n + l i i k e n n e o n g e l m i i n + l i i k e n n e o n g e l m i s t a + l i i k e n n e o n n e t t o m u u d e n + l i i k e n n e o n n e t t o m u u d e s s a + l i i k e n n e o n n e t t o m u u d e s t a + l i i k e n n e o n n e t t o m u u d e t + l i i k e n n e o n n e t t o m u u k s i a + l i i k e n n e o n n e t t o m u u k s i e n + l i i k e n n e o n n e t t o m u u k s i i n + l i i k e n n e o n n e t t o m u u k s i s s a + l i i k e n n e o n n e t t o m u u k s i s t a + l i i k e n n e o n n e t t o m u u s + l i i k e n n e o n n e t t o m u u s l u v u t + l i i k e n n e o n n e t t o m u u t e e n + l i i k e n n e o n n e t t o m u u t t a + l i i k e n n e o p e r a a t t o r i t + l i i k e n n e o s u u s + l i i k e n n e p a k e t t i a + l i i k e n n e p a l v e l u + l i i k e n n e p a l v e l u a + l i i k e n n e p a l v e l u h i n t o j e n + l i i k e n n e p a l v e l u i d e n + l i i k e n n e p a l v e l u i h i m m e + l i i k e n n e p a l v e l u i h i n + l i i k e n n e p a l v e l u i l l e + l i i k e n n e p a l v e l u i s s a + l i i k e n n e p a l v e l u i s t a + l i i k e n n e p a l v e l u i t a + l i i k e n n e p a l v e l u j a + l i i k e n n e p a l v e l u j e n + l i i k e n n e p a l v e l u n + l i i k e n n e p a l v e l u t + l i i k e n n e p i i k k e j ä + l i i k e n n e p o l i i s i + l i i k e n n e p o l i i t i k k o i n a + l i i k e n n e p o l i i t i k k o j e n + l i i k e n n e p o l i i t i k o t + l i i k e n n e p o l i i t t i n e n + l i i k e n n e p o l i i t t i s e n a + l i i k e n n e p o l i i t t i s e s s a + l i i k e n n e p o l i i t t i s e s t a + l i i k e n n e p o l i i t t i s e t + l i i k e n n e p o l i i t t i s i a + l i i k e n n e p o l i i t t i s i i n + l i i k e n n e p o l i i t t i s i s t a + l i i k e n n e p o l i i t t i s t e n + l i i k e n n e p o l i t i i k a l l a + l i i k e n n e p o l i t i i k a l l e + l i i k e n n e p o l i t i i k a n + l i i k e n n e p o l i t i i k a n k i n + l i i k e n n e p o l i t i i k a s s a + l i i k e n n e p o l i t i i k a s s a a n + l i i k e n n e p o l i t i i k a s t a + l i i k e n n e p o l i t i i k k a + l i i k e n n e p o l i t i i k k a a + l i i k e n n e p o l i t i i k k a a m m e + l i i k e n n e p o l i t i i k k a a n + l i i k e n n e p o l i t i i k k a a n s a + l i i k e n n e p o l i t i i k k a m m e + l i i k e n n e p o l i t i i k k a n a + l i i k e n n e p o l i t i i k k o j e n + l i i k e n n e p o l i t i i k o i s s a + l i i k e n n e p o l t t o a i n e i d e n + l i i k e n n e p o l t t o e i n e i d e n + l i i k e n n e p r o j e k t i e n + l i i k e n n e p u i s t o + l i i k e n n e p u l m i a + l i i k e n n e p ä ä o s a s t o n + l i i k e n n e p ä ä s t ö t + l i i k e n n e p ö y t ä k i r j a + l i i k e n n e p ö y t ä k i r j a l l a + l i i k e n n e p ö y t ä k i r j a n + l i i k e n n e p ö y t ä k i r j a s s a + l i i k e n n e r a h a s t o + l i i k e n n e r a h a s t o a + l i i k e n n e r a h a s t o n + l i i k e n n e r a j o i t u k s i a + l i i k e n n e r a k e n t e i d e n + l i i k e n n e r a s i t u s + l i i k e n n e r a t k a i s u j e n + l i i k e n n e r a t s i o i s s a + l i i k e n n e r e i t e i l l e + l i i k e n n e r e i t e i l l ä + l i i k e n n e r e i t i t + l i i k e n n e r e i t t e j ä + l i i k e n n e r e i t t i + l i i k e n n e r e i t t i e n + l i i k e n n e r e i t t i e n s ä + l i i k e n n e r e i t t i m m e + l i i k e n n e r i k k o m u k s e e n + l i i k e n n e r i k k o m u k s e n + l i i k e n n e r i k k o m u k s e t + l i i k e n n e r i k k o m u k s i a + l i i k e n n e r i k k o m u k s i i n + l i i k e n n e r i k k o m u k s i s t a + l i i k e n n e r i k k o m u s + l i i k e n n e r i k k o m u s t e n + l i i k e n n e r u h k a a n + l i i k e n n e r u u h k a + l i i k e n n e r u u h k a a + l i i k e n n e r u u h k a a n + l i i k e n n e r u u h k a s s a + l i i k e n n e r u u h k a t + l i i k e n n e r u u h k i a + l i i k e n n e r u u h k i e n + l i i k e n n e r u u h k i i n + l i i k e n n e r u u h k i s s a + l i i k e n n e r u u h k i s t a + l i i k e n n e s a k k o i h i n + l i i k e n n e s a k k o j e n + l i i k e n n e s a t e l l i i t t i j ä r j e s t e l m ä + l i i k e n n e s e k t o r e i h i n + l i i k e n n e s e k t o r e i l l a + l i i k e n n e s e k t o r i + l i i k e n n e s e k t o r i a + l i i k e n n e s e k t o r i l l a + l i i k e n n e s e k t o r i l l e + l i i k e n n e s e k t o r i l t a + l i i k e n n e s e k t o r i m m e + l i i k e n n e s e k t o r i n + l i i k e n n e s e k t o r i n s a + l i i k e n n e s e k t o r i s t a + l i i k e n n e s o p i m u k s e n + l i i k e n n e s o p i m u s + l i i k e n n e s o v e l l u k s i a + l i i k e n n e s o v e l l u k s i s t a + l i i k e n n e s t r a t e g i a + l i i k e n n e s t r a t e g i a a + l i i k e n n e s t r a t e g i a a n + l i i k e n n e s t r a t e g i a n + l i i k e n n e s t r a t e g i a s s a + l i i k e n n e s t r a t e g i o i h i n + l i i k e n n e s t r a t e g i o i s s a + l i i k e n n e s u u n n i t e l m a a n + l i i k e n n e s u u n n i t e l m a n + l i i k e n n e s u u n n i t e l m a n s a + l i i k e n n e s u u n n i t e l m i a + l i i k e n n e s u u n n i t e l m i e n + l i i k e n n e s u u n n i t t e l i j o i d e n + l i i k e n n e s u u n n i t t e l u + l i i k e n n e s u u n n i t t e l u a + l i i k e n n e s u u n n i t t e l u n + l i i k e n n e s u u n n i t t e l u s s a + l i i k e n n e s u u n n i t t e l u s t a + l i i k e n n e s u u n n i t t e l u u n + l i i k e n n e s ä ä n n ö i s t ä + l i i k e n n e s ä ä n n ö t + l i i k e n n e s ä ä n t ö i h i n + l i i k e n n e s ä ä n t ö j e n + l i i k e n n e s ä ä n t ö j ä + l i i k e n n e t a l o u d e n + l i i k e n n e t a l o u t t a a n + l i i k e n n e t a p a h t u m i e n + l i i k e n n e t a p a t u r m a k u o l e m i a + l i i k e n n e t a r p e e n + l i i k e n n e t a r p e e s e e n + l i i k e n n e t a r p e e s t a + l i i k e n n e t a r p e i d e n + l i i k e n n e t a r p e i t a + l i i k e n n e t a v o i t t e i s i i n + l i i k e n n e t e k n i i k k a a n + l i i k e n n e t e k n i i k o i h i n + l i i k e n n e t e l e m a t i i k k a + l i i k e n n e t e o l l i s u u s + l i i k e n n e t i e d o t + l i i k e n n e t i e d o t u s p a l v e l u j e n + l i i k e n n e t i e t o j a + l i i k e n n e t i e t o j e n + l i i k e n n e t i e t o j ä r j e s t e l m i ä + l i i k e n n e t i h e y d e n + l i i k e n n e t i h e y s + l i i k e n n e t i l a n t e e n + l i i k e n n e t i l a n t e e s e e n + l i i k e n n e t i l a n t e e s t a + l i i k e n n e t i l a n t e e t + l i i k e n n e t i l a n t e i t a + l i i k e n n e t o i m e n p i t e i d e n + l i i k e n n e t o i m i l l a + l i i k e n n e t o i m i n n o i s t a + l i i k e n n e t o i m i n t o j a + l i i k e n n e t t ä + l i i k e n n e t u l l e j a + l i i k e n n e t u l v a + l i i k e n n e t u r v a l l i s u u d e l l e + l i i k e n n e t u r v a l l i s u u d e n + l i i k e n n e t u r v a l l i s u u d e s s a + l i i k e n n e t u r v a l l i s u u d e s t a + l i i k e n n e t u r v a l l i s u u s + l i i k e n n e t u r v a l l i s u u s a l a n + l i i k e n n e t u r v a l l i s u u s a l o i t e + l i i k e n n e t u r v a l l i s u u s b u d j e t t i + l i i k e n n e t u r v a l l i s u u s k a m p a n j o i t a + l i i k e n n e t u r v a l l i s u u s k y s y m y k s e s t ä + l i i k e n n e t u r v a l l i s u u s k y s y m y k s i i n + l i i k e n n e t u r v a l l i s u u s n e u v o s t o + l i i k e n n e t u r v a l l i s u u s n e u v o s t o t + l i i k e n n e t u r v a l l i s u u s o h j e l m a + l i i k e n n e t u r v a l l i s u u s o h j e l m a s s a a n + l i i k e n n e t u r v a l l i s u u s o h j e l m a s t a + l i i k e n n e t u r v a l l i s u u s o n g e l m a + l i i k e n n e t u r v a l l i s u u s o n g e l m i a + l i i k e n n e t u r v a l l i s u u s p o l i t i i k k a a n + l i i k e n n e t u r v a l l i s u u s p ä i v ä + l i i k e n n e t u r v a l l i s u u s p ä i v ä n + l i i k e n n e t u r v a l l i s u u s r i k k o m u k s e t + l i i k e n n e t u r v a l l i s u u s s ä ä n n ö s t e n + l i i k e n n e t u r v a l l i s u u s t o i m e n p i t e i d e n + l i i k e n n e t u r v a l l i s u u s t o i m e n p i t e i s i i n + l i i k e n n e t u r v a l l i s u u s t o i m e n p i t e i t ä + l i i k e n n e t u r v a l l i s u u s t o i m i s s a + l i i k e n n e t u r v a l l i s u u s t y ö s s ä + l i i k e n n e t u r v a l l i s u u t e e n + l i i k e n n e t u r v a l l i s u u t e m m e k i n + l i i k e n n e t u r v a l l i s u u t t a + l i i k e n n e t u r v a l l i s u u t t a a n + l i i k e n n e t u r v a l l i s u u t t a m m e + l i i k e n n e t u r v a n + l i i k e n n e t u t k i m u s l a b o r a t o r i o + l i i k e n n e t y y p e i l l e + l i i k e n n e t y y p i t + l i i k e n n e v a a t i m u k s e t + l i i k e n n e v a a t i m u s t e n + l i i k e n n e v a h i n g o s t a + l i i k e n n e v a h i n k o j e n + l i i k e n n e v a h i n k o k o h t a i s i a + l i i k e n n e v a i h t o e h d o t + l i i k e n n e v a i h t o e h t o j a + l i i k e n n e v a i h t o e h t o j e n + l i i k e n n e v a i k e u k s i e n + l i i k e n n e v a k u u t u k s e n + l i i k e n n e v a k u u t u k s e s s a + l i i k e n n e v a k u u t u k s e t + l i i k e n n e v a k u u t u k s i a + l i i k e n n e v a k u u t u k s i s s a + l i i k e n n e v a k u u t u s + l i i k e n n e v a k u u t u s a l a n + l i i k e n n e v a k u u t u s a s i o i d e n + l i i k e n n e v a k u u t u s a s i o i s t a + l i i k e n n e v a k u u t u s a s i o i t a + l i i k e n n e v a k u u t u s d i r e k t i i v e i s s ä + l i i k e n n e v a k u u t u s d i r e k t i i v e j ä + l i i k e n n e v a k u u t u s d i r e k t i i v i + l i i k e n n e v a k u u t u s d i r e k t i i v i e n + l i i k e n n e v a k u u t u s d i r e k t i i v i i n + l i i k e n n e v a k u u t u s d i r e k t i i v i k s i + l i i k e n n e v a k u u t u s d i r e k t i i v i l u o n n o k s e n + l i i k e n n e v a k u u t u s d i r e k t i i v i n + l i i k e n n e v a k u u t u s d i r e k t i i v i s s ä + l i i k e n n e v a k u u t u s d i r e k t i i v i ä + l i i k e n n e v a k u u t u s j ä r j e s t e l m ä + l i i k e n n e v a k u u t u s k y s y m y k s e t + l i i k e n n e v a k u u t u s k y s y m y k s i s t ä + l i i k e n n e v a k u u t u s m a k s u j a + l i i k e n n e v a k u u t u s t e n + l i i k e n n e v a k u u t u s t o i m i s t o t + l i i k e n n e v a l i o k u n n a l l e + l i i k e n n e v a l i o k u n n a l t a + l i i k e n n e v a l i o k u n n a n + l i i k e n n e v a l i o k u n n a s s a + l i i k e n n e v a l i o k u n t a + l i i k e n n e v a l i o k u n t a a + l i i k e n n e v a l i o k u n t a a n + l i i k e n n e v a l o + l i i k e n n e v a l o i s s a + l i i k e n n e v a l o i s t a + l i i k e n n e v a l o j a + l i i k e n n e v a l o j e n + l i i k e n n e v a l o j ä r j e s t e l m ä + l i i k e n n e v a l o j ä r j e s t e l m ä l l ä + l i i k e n n e v a l o j ä r j e s t e l m ä n + l i i k e n n e v a l o j ä r j e s t e l m ä ä + l i i k e n n e v a l o m a l l i + l i i k e n n e v a l o m e r k i n n ö i l l ä + l i i k e n n e v a l o n + l i i k e n n e v a l o r a t k a i s u + l i i k e n n e v a l o t + l i i k e n n e v a l v o n t a a + l i i k e n n e v a l v o n t a j ä r j e s t e l m ä l l ä + l i i k e n n e v a r o i s t a + l i i k e n n e v a s t a a n o t i n + l i i k e n n e v e r k k o + l i i k e n n e v e r k k o a + l i i k e n n e v e r k k o h a n k k e e s t a + l i i k e n n e v e r k k o h a n k k e i s s a + l i i k e n n e v e r k k o h a n k k e i t a + l i i k e n n e v e r k k o i h i m m e + l i i k e n n e v e r k k o i h i n + l i i k e n n e v e r k k o j a + l i i k e n n e v e r k k o j a m m e + l i i k e n n e v e r k k o j e n + l i i k e n n e v e r k k o o n + l i i k e n n e v e r k k o o n s a + l i i k e n n e v e r k o i l l e + l i i k e n n e v e r k o i n + l i i k e n n e v e r k o i s s a + l i i k e n n e v e r k o i s t a + l i i k e n n e v e r k o j e n + l i i k e n n e v e r k o l l a + l i i k e n n e v e r k o n + l i i k e n n e v e r k o s s a + l i i k e n n e v e r k o s t a + l i i k e n n e v e r k o s t o + l i i k e n n e v e r k o s t o a + l i i k e n n e v e r k o s t o j a + l i i k e n n e v e r k o s t o j e n + l i i k e n n e v e r k o s t o m m e + l i i k e n n e v e r k o s t o n + l i i k e n n e v e r k o s t o o n + l i i k e n n e v e r k o s t o s s a + l i i k e n n e v e r k o t + l i i k e n n e v e r o t u s + l i i k e n n e v i r a n o m a i s i l l e + l i i k e n n e v i r a n o m a i s i s t a + l i i k e n n e v i r a n o m a i s t e n + l i i k e n n e v i r a s t o + l i i k e n n e v i r r a n + l i i k e n n e v i r r a t + l i i k e n n e v i r r o i s t a + l i i k e n n e v i r t a + l i i k e n n e v i r t a a + l i i k e n n e v i r t o i h i n + l i i k e n n e v i r t o j a + l i i k e n n e v i r t o j e n + l i i k e n n e v y ö r y n + l i i k e n n e v ä l i n e + l i i k e n n e v ä l i n e e m m e + l i i k e n n e v ä l i n e e n + l i i k e n n e v ä l i n e e n ä + l i i k e n n e v ä l i n e e s t ä + l i i k e n n e v ä l i n e e t + l i i k e n n e v ä l i n e i d e n + l i i k e n n e v ä l i n e i l l ä + l i i k e n n e v ä l i n e i s i i n + l i i k e n n e v ä l i n e i s s ä + l i i k e n n e v ä l i n e i s t ä + l i i k e n n e v ä l i n e i s t ä m m e + l i i k e n n e v ä l i n e i t ä + l i i k e n n e v ä l i n e t t ä + l i i k e n n e v ä y l i e n + l i i k e n n e v ä y l i i n + l i i k e n n e v ä y l i l l e + l i i k e n n e v ä y l i l l ä + l i i k e n n e v ä y l i ä + l i i k e n n e v ä y l ä + l i i k e n n e v ä y l ä n ä + l i i k e n n e v ä y l ä t + l i i k e n n e y h t e y d e s t ä + l i i k e n n e y h t e y d e t + l i i k e n n e y h t e y k s i e n + l i i k e n n e y h t e y k s i i n + l i i k e n n e y h t e y k s i l l ä + l i i k e n n e y h t e y k s i n + l i i k e n n e y h t e y k s i s t ä + l i i k e n n e y h t e y k s i ä + l i i k e n n e y h t i ö i d e n + l i i k e n n e y h t i ö i t ä + l i i k e n n e y h t i ö l l e + l i i k e n n e y h t i ö n + l i i k e n n e y m p y r ä k o i r a + l i i k e n n e y m p y r ä ä n + l i i k e n n e y m p ä r i s t ö ö n + l i i k e n n e y r i t y k s e n + l i i k e n n e y r i t y k s e t + l i i k e n n e y r i t y k s i s t ä + l i i k e n n e y r i t y k s i ä + l i i k e n n e y r i t y s + l i i k e n n ö i d ä + l i i k e n n ö i m ä + l i i k e n n ö i n t i j ä r j e s t e l m ä l l e + l i i k e n n ö i n t i k i e l e n + l i i k e n n ö i n t i l u p a n s a + l i i k e n n ö i n t i m a h d o l l i s u u k s i a + l i i k e n n ö i n t i m u o t o j a + l i i k e n n ö i n t i o i k e u k s i a + l i i k e n n ö i n t i o i k e u k s i e n + l i i k e n n ö i n t i o i k e u k s i s t a + l i i k e n n ö i n t i r e i t t i n ä + l i i k e n n ö i n t i y r i t y s t e n + l i i k e n n ö i t s i j ä t + l i i k e n n ö i t s i j ö i l l e + l i i k e n n ö i t s i j ö i t ä + l i i k e n n ö i v i l l e + l i i k e n n ö i v i ä + l i i k e n n ö i v ä t + l i i k e n t e e k s i + l i i k e n t e e l l ä + l i i k e n t e e n + l i i k e n t e e n h a l l i n t a j ä r j e s t e l m i l l e + l i i k e n t e e n h a l l i n t a j ä r j e s t e l m i ä + l i i k e n t e e n h a l l i n t a j ä r j e s t e l m ä s t ä + l i i k e n t e e n h a r j o i t t a j a + l i i k e n t e e n h a r j o i t t a j a l l a + l i i k e n t e e n h a r j o i t t a j a n + l i i k e n t e e n h a r j o i t t a j a t + l i i k e n t e e n h a r j o i t t a j i a + l i i k e n t e e n h a r j o i t t a j i e n + l i i k e n t e e n h a r j o i t t a j i i n + l i i k e n t e e n h a r j o i t t a j i l l a + l i i k e n t e e n h a r j o i t t a j i l l e + l i i k e n t e e n h a r j o i t t a j i l t a + l i i k e n t e e n k e h i t t ä m i s s u u n n i t e l m a n + l i i k e n t e e n k e h i t y k s e s t ä + l i i k e n t e e n k u l u n + l i i k e n t e e n o h j a u s + l i i k e n t e e n o h j a u s j ä r j e s t e l m ä n + l i i k e n t e e n o h j a u s j ä r j e s t e l m ä t + l i i k e n t e e n t u t k i m u s + l i i k e n t e e n v a l v o n n a n + l i i k e n t e e n v a l v o n t a + l i i k e n t e e n v a l v o n t a j ä r j e s t e l m i e n + l i i k e n t e e n v a l v o n t a j ä r j e s t e l m ä + l i i k e n t e e n v a l v o n t a j ä r j e s t e l m ä n + l i i k e n t e e s e e n + l i i k e n t e e s s ä + l i i k e n t e e s t ä + l i i k e p a l v e l u j e n + l i i k e p a n k e i l l e + l i i k e p a n k e i l t a + l i i k e p a n k i t + l i i k e p a n k k e j a + l i i k e p a n k k e j a m m e + l i i k e p a n k k i + l i i k e p a n k k i e n + l i i k e p a n k k i i n + l i i k e p a n k k i t o i m i n t a + l i i k e p e r i a a t t e i s t a a n + l i i k e p u h e l u i s s a + l i i k e r a k e n n u k s e t + l i i k e r a k e n n u k s i a + l i i k e r a t a + l i i k e r a t a k o v e t t u m a t a u t i a + l i i k e s a l a i s u u d e k s i + l i i k e s a l a i s u u d e n + l i i k e s a l a i s u u d e t + l i i k e s a l a i s u u k s i a + l i i k e s a l a i s u u k s i e n + l i i k e s a l a i s u u k s i s t a + l i i k e s a l a i s u u s + l i i k e s a l a i s u u t e e n + l i i k e s a l a i s u u t e n a + l i i k e s a l a i s u u t t a + l i i k e s o p i m u k s i a + l i i k e s o p i m u k s i s t a + l i i k e s u h d e + l i i k e s u h d e t t a + l i i k e s u h t e e n + l i i k e s u h t e e t + l i i k e s u h t e i s i i n + l i i k e s u h t e i s s a + l i i k e s u h t e i s t a + l i i k e s u h t e i t a + l i i k e s u u n n i t e l m a a + l i i k e s u u n n i t e l m a n + l i i k e s ä ä n n ö t + l i i k e t a l o u d e l l i n e n + l i i k e t a l o u d e l l i s e s t i + l i i k e t a l o u d e n + l i i k e t a l o u s y h t e i s ö n + l i i k e t a l o u t t a + l i i k e t a p a a m i s e e n + l i i k e t a p a a m i s e e n s a + l i i k e t a p a a m i s t e n + l i i k e t a p a h t u m i s t a a n + l i i k e t a p o j e n + l i i k e t a r k o i t u k s e s s a + l i i k e t a r k o i t u k s i s s a + l i i k e t i e t o j a + l i i k e t i l a i s u u k s i e n + l i i k e t i l a s s a + l i i k e t i l a t + l i i k e t i l o j e n + l i i k e t o i m e k s i + l i i k e t o i m e t + l i i k e t o i m i a + l i i k e t o i m i a a n + l i i k e t o i m i e n + l i i k e t o i m i i n + l i i k e t o i m i l t a + l i i k e t o i m i m e n e t e l m i l l ä + l i i k e t o i m i n n a l l e + l i i k e t o i m i n n a l l e e n + l i i k e t o i m i n n a n + l i i k e t o i m i n n a n h a r j o i t t a j i e n + l i i k e t o i m i n n a s s a + l i i k e t o i m i n n a s s a a n + l i i k e t o i m i n n a s t a + l i i k e t o i m i n n o i s s a + l i i k e t o i m i n n o i s t a + l i i k e t o i m i n t a + l i i k e t o i m i n t a a + l i i k e t o i m i n t a a n + l i i k e t o i m i n t a a n s a + l i i k e t o i m i n t a e d e l l y t y k s i ä + l i i k e t o i m i n t a e t u j a + l i i k e t o i m i n t a h a n k k e i d e n + l i i k e t o i m i n t a h a n k k e i t a + l i i k e t o i m i n t a h a n k k e i t a a n + l i i k e t o i m i n t a i d e o i l l e e n + l i i k e t o i m i n t a i l m a p i i r i ä + l i i k e t o i m i n t a i l m a s t o + l i i k e t o i m i n t a i l m a s t o a + l i i k e t o i m i n t a i n t r e s s i e n + l i i k e t o i m i n t a j ä r j e s t e l m i e n + l i i k e t o i m i n t a k e t j u j a + l i i k e t o i m i n t a k i e l t o + l i i k e t o i m i n t a k o k e m u s t a + l i i k e t o i m i n t a k u l t t u u r i a + l i i k e t o i m i n t a k u l t t u u r i i n + l i i k e t o i m i n t a k u m p p a n e i t a + l i i k e t o i m i n t a k ä y t ä n n ö i l t ä + l i i k e t o i m i n t a k ä y t ä n n ö i s t ä + l i i k e t o i m i n t a k ä y t ä n n ö n + l i i k e t o i m i n t a k ä y t ä n n ö t + l i i k e t o i m i n t a k ä y t ä n t ö i h i n + l i i k e t o i m i n t a k ä y t ä n t ö i h i n s ä + l i i k e t o i m i n t a k ä y t ä n t ö j e n + l i i k e t o i m i n t a k ä y t ä n t ö j ä + l i i k e t o i m i n t a m a h d o l l i s u u d e n + l i i k e t o i m i n t a m a h d o l l i s u u d e t + l i i k e t o i m i n t a m a h d o l l i s u u k s i a + l i i k e t o i m i n t a m a h d o l l i s u u k s i a a n + l i i k e t o i m i n t a m a h d o l l i s u u k s i e n + l i i k e t o i m i n t a m a h d o l l i s u u k s i i n + l i i k e t o i m i n t a m a h d o l l i s u u k s i s t a + l i i k e t o i m i n t a m a h d o l l i s u u s + l i i k e t o i m i n t a m a h d o l l i s u u t e n a + l i i k e t o i m i n t a m a l l e i h i n + l i i k e t o i m i n t a m a l l e j a + l i i k e t o i m i n t a m a l l e j a a n + l i i k e t o i m i n t a m a l l i + l i i k e t o i m i n t a m a l l i a + l i i k e t o i m i n t a m a l l i e n + l i i k e t o i m i n t a m a l l i i n + l i i k e t o i m i n t a m a l l i n + l i i k e t o i m i n t a m a l l i n a + l i i k e t o i m i n t a m a l l i p a t e n t t i e n + l i i k e t o i m i n t a m a l l i s t a + l i i k e t o i m i n t a m a l l i t + l i i k e t o i m i n t a m e n e t e l m i l l e + l i i k e t o i m i n t a m e n e t e l m i ä + l i i k e t o i m i n t a m e n e t t e l y j e n + l i i k e t o i m i n t a m e n e t t e l y j ä ä n + l i i k e t o i m i n t a m m e + l i i k e t o i m i n t a n a + l i i k e t o i m i n t a n s a + l i i k e t o i m i n t a p a i k k a n a + l i i k e t o i m i n t a p a i k k o j a + l i i k e t o i m i n t a p o l i t i i k k a a + l i i k e t o i m i n t a p o t e n t i a a l i n + l i i k e t o i m i n t a p r o s e s s e i s t a + l i i k e t o i m i n t a p r o s e s s e j a + l i i k e t o i m i n t a r a k e n t e i d e n + l i i k e t o i m i n t a r a t k a i s u + l i i k e t o i m i n t a r a t k a i s u n s a + l i i k e t o i m i n t a r i s k e j ä + l i i k e t o i m i n t a r i s k i + l i i k e t o i m i n t a s o p i m u k s e t + l i i k e t o i m i n t a s t r a t e g i a k s i + l i i k e t o i m i n t a s t r a t e g i o i l l e + l i i k e t o i m i n t a s t r a t e g i o i t a + l i i k e t o i m i n t a s u h d e + l i i k e t o i m i n t a s u h t e i d e n + l i i k e t o i m i n t a s u u n n i t e l m a + l i i k e t o i m i n t a s u u n n i t e l m a a + l i i k e t o i m i n t a s u u n n i t e l m a a n + l i i k e t o i m i n t a s u u n n i t e l m a n + l i i k e t o i m i n t a s u u n n i t e l m a n s a + l i i k e t o i m i n t a s u u n n i t e l m a s s a a n + l i i k e t o i m i n t a s u u n n i t e l m a s t a + l i i k e t o i m i n t a s u u n n i t e l m a t + l i i k e t o i m i n t a s u u n n i t e l m i e n + l i i k e t o i m i n t a s u u n n i t e l m i i n + l i i k e t o i m i n t a s y k l i i n + l i i k e t o i m i n t a t a p o j a + l i i k e t o i m i n t a t a p o j a a n + l i i k e t o i m i n t a t a v o i s s a + l i i k e t o i m i n t a t a v o i t t e e n + l i i k e t o i m i n t a v a r m u u s + l i i k e t o i m i n t a v e r k o s t o a a n + l i i k e t o i m i n t a v e r o i s t a + l i i k e t o i m i n t a v e t o i n e n + l i i k e t o i m i n t a y h t e i s ö j ä + l i i k e t o i m i n t a y h t e i s ö n + l i i k e t o i m i n t a y h t e i s ö t + l i i k e t o i m i n t a y h t e i s ö ä + l i i k e t o i m i n t a y h t e i s ö ö n + l i i k e t o i m i n t a y h t e y d e t + l i i k e t o i m i n t a y k s i k ö i t ä + l i i k e t o i m i n t a y k s i k ö n + l i i k e t o i m i n t a y m p ä r i s t ö + l i i k e t o i m i n t a y m p ä r i s t ö j e n + l i i k e t o i m i n t a y m p ä r i s t ö j ä + l i i k e t o i m i n t a y m p ä r i s t ö l l e + l i i k e t o i m i n t a y m p ä r i s t ö l l ä + l i i k e t o i m i n t a y m p ä r i s t ö n + l i i k e t o i m i n t a y m p ä r i s t ö s s ä + l i i k e t o i m i n t a y m p ä r i s t ö s t ä + l i i k e t o i m i n t a y m p ä r i s t ö s t ä m m e + l i i k e t o i m i n t a y m p ä r i s t ö ä + l i i k e t o i m i n t a y m p ä r i s t ö ö n + l i i k e t o i m i n t o j a + l i i k e t o i m i n t o j e n + l i i k e t o i m i s s a + l i i k e t o i m i s t a + l i i k e t o i m i v e r o a + l i i k e t o i m i v o i t t o j ä r j e s t e l m ä ä + l i i k e t o i m i v o i t t o m e n e t e l m ä + l i i k e t o i m i v o i t t o m e n e t e l m ä ä n + l i i k e t t ä + l i i k e t u n n i s t i n + l i i k e v a i h d o n + l i i k e v a i h d o s t a + l i i k e v a i h t o + l i i k e v a i h t o a + l i i k e v a i h t o a a n + l i i k e v a i h t o l u v u t + l i i k e v a i h t o n s a + l i i k e v a i h t o r a j o j e n + l i i k e v a i h t o v e r o + l i i k e v a i h t o v e r o a + l i i k e v a i h t o v e r o m m e + l i i k e v a i h t o v e r o m ä ä r ä n + l i i k e v a i h t o v e r o n + l i i k e v a i h t o v e r o o n + l i i k e v o i m a a + l i i k e v o i t o s t a + l i i k e v o i t o t + l i i k e v o i t t o a + l i i k e v o i t t o o n + l i i k e v o i t t o v e r o i s t a + l i i k e y h t e i s ö + l i i k e y h t e i s ö j e n + l i i k e y h t e i s ö n + l i i k e y h t e i s ö ä + l i i k e y h t e y k s i e n + l i i k e y h t e y k s i ä + l i i k e y m p ä r i s t ö s s ä + l i i k e y r i t y k s e t + l i i k e y r i t y k s i l l e + l i i k e y r i t y k s i l l ä + l i i k e y r i t y k s i n ä + l i i k e y r i t y k s i ä + l i i k e y r i t y s + l i i k e y r i t y s t e n + l i i k k e e l l e l a s k i j o i l t a + l i i k k e e l l e l a s k u n + l i i k k e e l l e p a n e m i s e k s i + l i i k k e e l l e p a n e v a a + l i i k k e e l l e p a n e v a n + l i i k k e e l l e p a n e v a n a + l i i k k e e l l e p a n i j a n a + l i i k k e e l t ä + l i i k k e e n + l i i k k e e n h a r j o i t t a j i l l e + l i i k k e e n j o h d o l l i s e s s a + l i i k k e e n j o h d o l l i s i s t a + l i i k k e e n j o h d o l l i s t a + l i i k k e e n j o h d o n + l i i k k e e n j o h t o + l i i k k e e n j o h t o j ä r j e s t e l m ä ä + l i i k k e e n j o h t o k y v y n + l i i k k e e n k a a p p a u s + l i i k k e e n o h j a i n + l i i k k e e n p e r u s t a m i s o i k e u s + l i i k k e e n p e r u s t a m i s o i k e u t t a + l i i k k e e s e e n + l i i k k e e s e e n l a s k i j o i d e n + l i i k k e e s e e n l a s k i j o i t a + l i i k k e e s t ä + l i i k k e e t + l i i k k e i d e n + l i i k k e i s s ä + l i i k k e i s s ä ä n + l i i k k e i s t ä + l i i k k e i t ä + l i i k k u a + l i i k k u a k s e e n + l i i k k u e s s a a n + l i i k k u j i e n + l i i k k u m a a n + l i i k k u m a r a j o i t t e i s i l l e + l i i k k u m a t i l a a + l i i k k u m a t i l a n + l i i k k u m a v a r a a + l i i k k u m a v a r a a m m e + l i i k k u m a v a r a a n + l i i k k u m a v a r a a n s a + l i i k k u m a v a r a l l e + l i i k k u m a v a r a m m e + l i i k k u m a v a r a n + l i i k k u m a v a r a t + l i i k k u m a v a r o i s t a + l i i k k u m a v a r o j a + l i i k k u m a v a r o j e n + l i i k k u m i s a v u s t u k s e n + l i i k k u m i s e d e l l y t y s t e n + l i i k k u m i s e e n + l i i k k u m i s e l l a + l i i k k u m i s e l l e + l i i k k u m i s e n + l i i k k u m i s e n s a + l i i k k u m i s e s t a + l i i k k u m i s e s t e + l i i k k u m i s j ä r j e s t e l m ä + l i i k k u m i s k e i n o + l i i k k u m i s k e s k u s + l i i k k u m i s m a h d o l l i s u u d e n + l i i k k u m i s m a h d o l l i s u u d e t + l i i k k u m i s m a h d o l l i s u u k s i a + l i i k k u m i s m a h d o l l i s u u s + l i i k k u m i s m u o t o j a + l i i k k u m i s o i k e u d e n + l i i k k u m i s o i k e u s + l i i k k u m i s o i k e u t t a a n + l i i k k u m i s r a j o i t e a l u e e l l a + l i i k k u m i s r a j o i t t e i t a + l i i k k u m i s r a j o i t u k s e t + l i i k k u m i s r a j o i t u k s i a + l i i k k u m i s r a j o i t u s t e n + l i i k k u m i s r a t k a i s u j e n + l i i k k u m i s t a + l i i k k u m i s t a m m e + l i i k k u m i s t a r k o i t u k s i i n + l i i k k u m i s t a r p e e s e e n + l i i k k u m i s t a r v e t t a + l i i k k u m i s t i e t o i h i n + l i i k k u m i s v a l m i u t t a + l i i k k u m i s v a p a u d e l l e + l i i k k u m i s v a p a u d e n + l i i k k u m i s v a p a u d e s t a + l i i k k u m i s v a p a u k s i e n + l i i k k u m i s v a p a u k s i s t a + l i i k k u m i s v a p a u s + l i i k k u m i s v a p a u t e e n + l i i k k u m i s v a p a u t e e n s a + l i i k k u m i s v a p a u t e m m e + l i i k k u m i s v a p a u t e n s a + l i i k k u m i s v a p a u t t a + l i i k k u m i s v a p a u t t a a n + l i i k k u m i s v a p a u t t a m m e + l i i k k u u + l i i k k u v a i s e m p i + l i i k k u v a i s i a + l i i k k u v a m m a n + l i i k k u v a m p a a + l i i k k u v a m p i + l i i k k u v a m p i a + l i i k k u v a t + l i i k k u v i a + l i i k k u v i e n + l i i k k u v i i n + l i i k k u v i s s a + l i i k k u v u u d e l l e + l i i k k u v u u d e n + l i i k k u v u u d e s t a + l i i k k u v u u d e s t a n n e + l i i k k u v u u s a p u r a h a a + l i i k k u v u u s a s i a t + l i i k k u v u u s a s t e e m m e + l i i k k u v u u s h a n k k e i s i i n + l i i k k u v u u s j a k s o + l i i k k u v u u s j ä r j e s t e l m ä + l i i k k u v u u s k e s k u s t e l u + l i i k k u v u u s k e s k u s t e n + l i i k k u v u u s k u m p p a n u u d e s t a + l i i k k u v u u s k u m p p a n u u d e t + l i i k k u v u u s k u m p p a n u u k s i a + l i i k k u v u u s k u m p p a n u u k s i e n + l i i k k u v u u s k u m p p a n u u s + l i i k k u v u u s k u m p p a n u u t t a + l i i k k u v u u s m a h d o l l i s u u k s i a + l i i k k u v u u s m a h d o l l i s u u k s i e n + l i i k k u v u u s m a h d o l l i s u u k s i i n + l i i k k u v u u s m a h d o l l i s u u k s i s t a + l i i k k u v u u s m u o t o j a + l i i k k u v u u s o h j e e t + l i i k k u v u u s o h j e l m a + l i i k k u v u u s o h j e l m a a + l i i k k u v u u s o h j e l m a a n + l i i k k u v u u s o h j e l m a n + l i i k k u v u u s o h j e l m i a + l i i k k u v u u s o h j e l m i e n + l i i k k u v u u s o h j e l m i i n + l i i k k u v u u s o h j e l m i l l a + l i i k k u v u u s o h j e l m i l l e + l i i k k u v u u s o h j e l m i s s a + l i i k k u v u u s o h j e l m i s t a + l i i k k u v u u s o i k e u s + l i i k k u v u u s o l e t u s t e n + l i i k k u v u u s o l o s u h t e i s t a + l i i k k u v u u s o n g e l m i a + l i i k k u v u u s o n g e l m i s t a + l i i k k u v u u s p a k e t t i a + l i i k k u v u u s p o l i t i i k a n + l i i k k u v u u s p o l i t i i k a t + l i i k k u v u u s p o l i t i i k k a a + l i i k k u v u u s p o l i t i i k k a a m m e + l i i k k u v u u s r a j o i t u k s e t + l i i k k u v u u s r a t k a i s u t + l i i k k u v u u s s u u n n i t e l m a + l i i k k u v u u s s u u n n i t e l m a n + l i i k k u v u u s t a s o n + l i i k k u v u u s t a s o n s a + l i i k k u v u u s t o t t u m u k s i a m m e + l i i k k u v u u s u l o t t u v u u d e n + l i i k k u v u u s v a a t i m u k s e m m e + l i i k k u v u u s v i r t o j e n + l i i k k u v u u t e e n + l i i k k u v u u t t a + l i i k k u v u u t t a a n + l i i k o j a + l i i k u n n a l l a + l i i k u n n a l l e + l i i k u n n a n + l i i k u n n a n o p e t t a j a n a + l i i k u n n a n o p e t t a j i a + l i i k u n n a n o p e t t a j i e n + l i i k u n n a n o p e t t a j i l l e + l i i k u n n a n o p e t u k s e e n + l i i k u n n a n o p e t u k s e n + l i i k u n n a n o p e t u k s e s t a + l i i k u n n a n o p e t u s + l i i k u n n a n o p e t u s t a + l i i k u n n a s t a + l i i k u n t a a + l i i k u n t a a n + l i i k u n t a e l i n o n g e l m i i n + l i i k u n t a e l i n s a i r a u d e t + l i i k u n t a e l i n v a m m o j e n + l i i k u n t a e s t e + l i i k u n t a e s t e i s e n + l i i k u n t a e s t e i s e t + l i i k u n t a e s t e i s i i n + l i i k u n t a e s t e i s i l l e + l i i k u n t a e s t e i s i ä + l i i k u n t a e s t e i s t e n + l i i k u n t a e s t e i s t ä + l i i k u n t a h a l l e j a + l i i k u n t a h a n k k e i t a + l i i k u n t a j ä r j e s t ö j e n + l i i k u n t a j ä r j e s t ö j ä + l i i k u n t a j ä r j e s t ö t + l i i k u n t a k a s v a t u k s e e n + l i i k u n t a k a s v a t u k s e l l e + l i i k u n t a k a s v a t u k s e n + l i i k u n t a k a s v a t u k s e s t a + l i i k u n t a k a s v a t u s + l i i k u n t a k a s v a t u s t a + l i i k u n t a k a s v a t u s t u n t i e n + l i i k u n t a k e s k u k s i a + l i i k u n t a k e s k u k s i s t a + l i i k u n t a k u l t t u u r i a + l i i k u n t a k y v y n + l i i k u n t a l i i t t o + l i i k u n t a m a h d o l l i s u u k s i i n + l i i k u n t a m u o t o j a + l i i k u n t a o p e t u s t a + l i i k u n t a p a i k o i l l e + l i i k u n t a r a j o i t t e e n + l i i k u n t a r a j o i t t e i s e n + l i i k u n t a r a j o i t t e i s e t + l i i k u n t a r a j o i t t e i s i a + l i i k u n t a r a j o i t t e i s i i n + l i i k u n t a r a j o i t t e i s i l l a + l i i k u n t a r a j o i t t e i s i l l e + l i i k u n t a r a j o i t t e i s i s t a + l i i k u n t a r a j o i t t e i s t e n + l i i k u n t a s a u m a + l i i k u n t a t e r a p i a l l a + l i i k u n t a t i e t e e s s ä + l i i k u n t a t i l a t + l i i k u n t a t i l o i s t a + l i i k u n t a t i l o j a + l i i k u n t a t i l o j e n + l i i k u n t a t o i m i n t a a + l i i k u n t a t o t t u m u k s i a + l i i k u n t a t u n n e i l l a + l i i k u n t a t u n n e i l t a + l i i k u n t a t u n n i t + l i i k u n t a t u n t e i h i n + l i i k u n t a t u n t e i h i n s a + l i i k u n t a t u n t e j a + l i i k u n t a t u n t i a + l i i k u n t a t u n t i e n + l i i k u n t a v a m m a i s t e n + l i i k u t a a n + l i i k u t e t a a n + l i i k u t t a a k o + l i i k u t t a m i s t o i m e t + l i i k u t t a v a a + l i i k u t t a v i m m i s t a + l i i k u t t a v i n + l i i k u t t a v i n t a + l i i k u t t i + l i i k u t u k s e n i + l i i l a j a l k a r i s a k a s + l i i m a k a u l a + l i i m a p u u + l i i m a t u s t a + l i i n a s o l m i o k o l i b r i + l i i o i t e l l a + l i i o i t e l l a a n + l i i o i t e l l e e t + l i i o i t e l l e n + l i i o i t e l l u i l t a + l i i o i t e l l u i s t a + l i i o i t e l l u l t a + l i i o i t e l l u s s a + l i i o i t e l t u a + l i i o i t e l t u j a + l i i o i t e l t u n a + l i i o i t t e l e e + l i i o i t t e l e m a t t a + l i i o i t t e l e t t e + l i i o i t t e l i + l i i o i t t e l i v a t + l i i o i t t e l u a + l i i o i t t e l u l t a + l i i o i t t e l u n + l i i t e a s i a k i r j o i s t a + l i i t e a s i a k i r j o j a + l i i t e t i e d o s t o + l i i t e t t ä + l i i t e t t ä i s i i n + l i i t e t y n + l i i t e t ä ä n + l i i t o h a u k k a + l i i t o i s t a + l i i t o k a l a t + l i i t o k i e k k o + l i i t o k s i s s a a n + l i i t o k s i s t a a n + l i i t o l e p i n k ä i n e n + l i i t o l l e + l i i t o n + l i i t o n a r k k u + l i i t o p u k u + l i i t o v a l t i o m a l l i s t a + l i i t t e e n + l i i t t e e n ä + l i i t t e e s e e n + l i i t t e e s s ä + l i i t t e e s t ä + l i i t t e e t + l i i t t e i d e n + l i i t t e i s i i n + l i i t t e i s s ä + l i i t t e i t t ä + l i i t t e i t ä + l i i t t o a r m e i j a n + l i i t t o h a l l i t u k s e e n + l i i t t o h a l l i t u k s e l l a + l i i t t o h a l l i t u k s e l l e + l i i t t o h a l l i t u k s e l t a + l i i t t o h a l l i t u k s e n + l i i t t o h a l l i t u k s e s s a + l i i t t o h a l l i t u k s e s t a + l i i t t o h a l l i t u s + l i i t t o h a l l i t u s j ä r j e s t e l m ä n s ä + l i i t t o h a l l i t u s t a + l i i t t o h a l l i t u s t e n + l i i t t o j a + l i i t t o j e n + l i i t t o k a n s l e r i + l i i t t o k a n s l e r i a + l i i t t o k a n s l e r i e h d o k a s t a a n + l i i t t o k a n s l e r i k s i + l i i t t o k a n s l e r i l l a + l i i t t o k a n s l e r i l l e + l i i t t o k a n s l e r i m m e + l i i t t o k a n s l e r i n + l i i t t o k a n s l e r i s t a + l i i t t o k a n s l e r i v a a l i e n + l i i t t o k o k o u k s e n + l i i t t o k o k o u k s e s t a + l i i t t o l a i s e n + l i i t t o l a i s e n n e + l i i t t o l a i s e t + l i i t t o l a i s h a l l i t u s + l i i t t o l a i s i a + l i i t t o l a i s i a m m e + l i i t t o l a i s i l l a + l i i t t o l a i s i l l e m m e + l i i t t o l a i s j ä r j e s t e l m i ä + l i i t t o l a i s m a i d e n + l i i t t o l a i s m a i h i n + l i i t t o l a i s s o t a + l i i t t o m a t r i i s i + l i i t t o n e u v o s t o + l i i t t o n e u v o s t o n + l i i t t o n e u v o s t o n a + l i i t t o o n + l i i t t o p a r l a m e n t i n + l i i t t o p a r l a m e n t i s t a + l i i t t o p o l i i s i a + l i i t t o p r e s i d e n t i n + l i i t t o p r e s i d e n t t i + l i i t t o p ä i v i l l ä + l i i t t o p ä i v ä v a a l i e n + l i i t t o p ä i v ä v a a l i k a m p a n j a n + l i i t t o s o p i m u k s e n + l i i t t o s o p i m u k s i a + l i i t t o s o p i m u s + l i i t t o s o p i m u s t e n + l i i t t o t a s a v a l l a l l a + l i i t t o t a s a v a l l a l l e + l i i t t o t a s a v a l l a n + l i i t t o t a s a v a l l a s s a + l i i t t o t a s a v a l l a s t a + l i i t t o t a s a v a l t a + l i i t t o t a s a v a l t a a + l i i t t o t a s a v a l t a a n + l i i t t o t a s o l l a + l i i t t o t u o m i o i s t u i m e n + l i i t t o t u o m i o i s t u i n + l i i t t o u d u m m e + l i i t t o u d u t t a v a + l i i t t o u m a h a l l i t u k s e n + l i i t t o u m a s i t o u m u k s i i n + l i i t t o u m i a + l i i t t o u t u k a a m m e + l i i t t o u t u m a k i n + l i i t t o u t u m a n + l i i t t o u t u m a t o n + l i i t t o u t u m a t o n t a + l i i t t o u t u m a t t o m a l l e + l i i t t o u t u m a t t o m a n + l i i t t o u t u m a t t o m a n a + l i i t t o u t u m a t t o m a s t a + l i i t t o u t u m a t t o m a t + l i i t t o u t u m a t t o m i a + l i i t t o u t u m a t t o m i e n + l i i t t o u t u m a t t o m i i n + l i i t t o u t u m a t t o m i l l e + l i i t t o u t u m a t t o m i s s a + l i i t t o u t u m a t t o m u u d e l l e + l i i t t o u t u m a t t o m u u d e s t a a n + l i i t t o u t u m a t t o m u u s + l i i t t o u t u m a t t o m u u s p o l i t i i k a n + l i i t t o u t u m i e n + l i i t t o u t u m i s m a h d o l l i s u u k s i a + l i i t t o u t u m i s p r o s e s s i a m m e + l i i t t o u t u n e e t + l i i t t o u t u n e i d e n + l i i t t o u t u u + l i i t t o v a l t i o + l i i t t o v a l t i o a j a t t e l u + l i i t t o v a l t i o a j a t u s t a + l i i t t o v a l t i o a r m e i j a + l i i t t o v a l t i o e l i m i i n + l i i t t o v a l t i o e l i n t e n + l i i t t o v a l t i o h a l l i t u k s e e n + l i i t t o v a l t i o h a l l i t u k s e l l e + l i i t t o v a l t i o h a n k e + l i i t t o v a l t i o i d e n + l i i t t o v a l t i o i h i n + l i i t t o v a l t i o i l l e + l i i t t o v a l t i o i s s a + l i i t t o v a l t i o i t a + l i i t t o v a l t i o j ä r j e s t e l m ä + l i i t t o v a l t i o j ä r j e s t e l m ä n + l i i t t o v a l t i o j ä r j e s t e l m ä n s ä + l i i t t o v a l t i o j ä r j e s t e l m ä s s ä ä n + l i i t t o v a l t i o j ä r j e s t e l m ä ä + l i i t t o v a l t i o j ä r j e s t e l m ä ä n + l i i t t o v a l t i o k e h i t y s t ä + l i i t t o v a l t i o k e h ä + l i i t t o v a l t i o k s i + l i i t t o v a l t i o k ä s i t e t t ä + l i i t t o v a l t i o l a i n s ä ä d ä n n ö n + l i i t t o v a l t i o l l e + l i i t t o v a l t i o l l i s t a + l i i t t o v a l t i o l t a + l i i t t o v a l t i o m a h d o l l i s u u k s i a + l i i t t o v a l t i o m a l l i + l i i t t o v a l t i o m a l l i a + l i i t t o v a l t i o m a l l i n + l i i t t o v a l t i o m e n e t t e l y n + l i i t t o v a l t i o m e t o d i + l i i t t o v a l t i o m u o d o n + l i i t t o v a l t i o m u o t o i s t a + l i i t t o v a l t i o n + l i i t t o v a l t i o n a + l i i t t o v a l t i o n m a l l i s e s t a + l i i t t o v a l t i o n s a + l i i t t o v a l t i o n v a s t a i s e s t a + l i i t t o v a l t i o n ä k ö k u l m a a + l i i t t o v a l t i o o n + l i i t t o v a l t i o o n s a + l i i t t o v a l t i o p i i r t e i t ä + l i i t t o v a l t i o p o h j a l t a + l i i t t o v a l t i o p o l i i s i a + l i i t t o v a l t i o p o l i t i i k k a a + l i i t t o v a l t i o p r o p a g a n d a + l i i t t o v a l t i o p r o p a g a n d a n + l i i t t o v a l t i o p r o s e s s i a + l i i t t o v a l t i o p y r k i m y k s i l l e + l i i t t o v a l t i o p ä i v ä v a a l i t + l i i t t o v a l t i o r a h a + l i i t t o v a l t i o r a k e n n e + l i i t t o v a l t i o r a k e n t e e n + l i i t t o v a l t i o r a k e n t e e s t a + l i i t t o v a l t i o r a k e n t e e s t a m m e + l i i t t o v a l t i o r a t k a i s u + l i i t t o v a l t i o r a t k a i s u a + l i i t t o v a l t i o s s a + l i i t t o v a l t i o s t a + l i i t t o v a l t i o s u u n n i t e l m a n + l i i t t o v a l t i o s u u n t a u s t a + l i i t t o v a l t i o t + l i i t t o v a l t i o t a + l i i t t o v a l t i o t a s o j a + l i i t t o v a l t i o t a s o l l a + l i i t t o v a l t i o t a s o n + l i i t t o v a l t i o t a s o o n + l i i t t o v a l t i o u l o t t u v u u d e n + l i i t t o v a l t i o v i r a n o m a i s t e n + l i i t t o v a l t i o y d i n + l i i t t o v a l t i o y t i m e e n + l i i t t o v a l t i o y t i m e s t ä + l i i t t y e s s ä + l i i t t y e s s ä m m e + l i i t t y e s s ä ä n + l i i t t y i + l i i t t y i s i + l i i t t y i s i n + l i i t t y i s i v ä t + l i i t t y i v ä t + l i i t t y i v ä t p ä + l i i t t y k ä ä m m e + l i i t t y m i e n + l i i t t y m i s a a l t o o n + l i i t t y m i s a i k a n a + l i i t t y m i s a i k a t a u l u + l i i t t y m i s a i k a t a u l u s s a + l i i t t y m i s a i k e i s t a + l i i t t y m i s a i k e i s t a a n + l i i t t y m i s a j a n k o h d a k s i + l i i t t y m i s a j a n k o h d a n + l i i t t y m i s a j a n k o h d a s t a + l i i t t y m i s a j a n k o h d a t + l i i t t y m i s a j a n k o h t a + l i i t t y m i s a j a n k o h t a a + l i i t t y m i s a j a n k o h t a a n + l i i t t y m i s a j a n k o h t a n a + l i i t t y m i s a s i a k i r j a + l i i t t y m i s a s i a k i r j a a + l i i t t y m i s a s i a k i r j a n + l i i t t y m i s a s i a k i r j a s s a + l i i t t y m i s e d e l l y t y k s e t + l i i t t y m i s e d e l l y t y s t e n + l i i t t y m i s e e n + l i i t t y m i s e h d o i s s a a n + l i i t t y m i s e h d o i s t a + l i i t t y m i s e h d o i s t a a n + l i i t t y m i s e h d o k k a a l l e + l i i t t y m i s e h d o k k a a n + l i i t t y m i s e h d o k k a i n a + l i i t t y m i s e h d o k k a i t a + l i i t t y m i s e h d o k k u u s + l i i t t y m i s e h d o k s i + l i i t t y m i s e h d o n + l i i t t y m i s e h d o t + l i i t t y m i s e h t o i h i n + l i i t t y m i s e h t o j a + l i i t t y m i s e h t o j e n + l i i t t y m i s e l l e + l i i t t y m i s e l l ä + l i i t t y m i s e n + l i i t t y m i s e n s ä + l i i t t y m i s e s s ä + l i i t t y m i s e s t ä + l i i t t y m i s h a k e m u k s e n + l i i t t y m i s h a k e m u k s e n s a + l i i t t y m i s h a k e m u k s e s t a + l i i t t y m i s h a k e m u k s i a + l i i t t y m i s h a k e m u k s i s t a + l i i t t y m i s h a k e m u s + l i i t t y m i s h a k e m u s t a + l i i t t y m i s h a k e m u s t a a n + l i i t t y m i s h a k e m u s t e n + l i i t t y m i s h e t k e l l ä + l i i t t y m i s h e t k e ä + l i i t t y m i s h e t k i + l i i t t y m i s i s s ä + l i i t t y m i s j o n o s s a + l i i t t y m i s j ä r j e s t e l m ä n + l i i t t y m i s j ä r j e s t e l y i s t ä + l i i t t y m i s k e h i t y k s e e n + l i i t t y m i s k e l p o i s i k s i + l i i t t y m i s k e l p o i s u u d e n + l i i t t y m i s k e l p o i s u u s + l i i t t y m i s k e r t o m u k s i a + l i i t t y m i s k e s k u s t e l u i s s a + l i i t t y m i s k e s k u s t e l u j a + l i i t t y m i s k e s k u s t e l u j e n + l i i t t y m i s k e s k u s t e l u t + l i i t t y m i s k i e r r o k s i e n + l i i t t y m i s k i e r r o k s i l l a + l i i t t y m i s k o n f e r e n s s e i h i n + l i i t t y m i s k o n f e r e n s s i + l i i t t y m i s k o n f e r e n s s i a + l i i t t y m i s k o n f e r e n s s i l l e + l i i t t y m i s k o n f e r e n s s i n + l i i t t y m i s k o n f e r e n s s i s s a + l i i t t y m i s k r i t e e r e i d e n + l i i t t y m i s k r i t e e r e i h i n + l i i t t y m i s k r i t e e r e i s t ä + l i i t t y m i s k r i t e e r e i t ä + l i i t t y m i s k r i t e e r e j ä + l i i t t y m i s k r i t e e r i + l i i t t y m i s k r i t e e r i e n + l i i t t y m i s k r i t e e r i k s i + l i i t t y m i s k r i t e e r i t + l i i t t y m i s k u m p p a n e i d e n + l i i t t y m i s k u m p p a n u u d e n + l i i t t y m i s k u m p p a n u u d e s s a + l i i t t y m i s k u m p p a n u u d e s t a + l i i t t y m i s k u m p p a n u u d e t + l i i t t y m i s k u m p p a n u u k s i a + l i i t t y m i s k u m p p a n u u k s i e n + l i i t t y m i s k u m p p a n u u k s i i n + l i i t t y m i s k u m p p a n u u k s i s s a + l i i t t y m i s k u m p p a n u u k s i s t a + l i i t t y m i s k u m p p a n u u s + l i i t t y m i s k u m p p a n u u s m a l l i + l i i t t y m i s k u m p p a n u u s s o p i m u k s e n + l i i t t y m i s k u m p p a n u u s s o p i m u k s e s s a + l i i t t y m i s k u m p p a n u u s s o p i m u k s e t + l i i t t y m i s k u m p p a n u u s s o p i m u k s i s s a + l i i t t y m i s k u m p p a n u u s s o p i m u s + l i i t t y m i s k u m p p a n u u s s o p i m u s t e n + l i i t t y m i s k u m p p a n u u t e e n + l i i t t y m i s k u m p p a n u u t t a + l i i t t y m i s k u s t a n n u k s e t + l i i t t y m i s k u s t a n n u k s i a + l i i t t y m i s k u u m e e s t a + l i i t t y m i s k y s y m y s t ä + l i i t t y m i s l ä h t ö i s y y s + l i i t t y m i s m a h d o l l i s u u d e n + l i i t t y m i s m a h d o l l i s u u d e t + l i i t t y m i s m a h d o l l i s u u k s i a + l i i t t y m i s m a h d o l l i s u u k s i e n + l i i t t y m i s m a h d o l l i s u u k s i s t a + l i i t t y m i s m a h d o l l i s u u s + l i i t t y m i s m a h d o l l i s u u t e e n + l i i t t y m i s m a h d o l l i s u u t t a + l i i t t y m i s m a l l i i n + l i i t t y m i s m a n d a a t e i s t a + l i i t t y m i s m e k a n i s m e i l l a + l i i t t y m i s m e n e t e l m ä ä + l i i t t y m i s m e n e t t e l y + l i i t t y m i s m e n e t t e l y j e n + l i i t t y m i s m e n e t t e l y n + l i i t t y m i s m e n e t t e l y s t ä + l i i t t y m i s m e n e t t e l y t + l i i t t y m i s m e n e t t e l y y n + l i i t t y m i s m e n e t t e l y ä + l i i t t y m i s n e u v o t t e l u i d e n + l i i t t y m i s n e u v o t t e l u i d e n s a + l i i t t y m i s n e u v o t t e l u i h i n + l i i t t y m i s n e u v o t t e l u i l l a + l i i t t y m i s n e u v o t t e l u i l l e + l i i t t y m i s n e u v o t t e l u i s s a + l i i t t y m i s n e u v o t t e l u i s s a a n + l i i t t y m i s n e u v o t t e l u i s s a k i n + l i i t t y m i s n e u v o t t e l u i s t a + l i i t t y m i s n e u v o t t e l u i t a + l i i t t y m i s n e u v o t t e l u j a + l i i t t y m i s n e u v o t t e l u j e n + l i i t t y m i s n e u v o t t e l u m m e + l i i t t y m i s n e u v o t t e l u n s a + l i i t t y m i s n e u v o t t e l u p e l i l l e + l i i t t y m i s n e u v o t t e l u p r o s e s s i + l i i t t y m i s n e u v o t t e l u p r o s e s s i a + l i i t t y m i s n e u v o t t e l u p r o s e s s i n + l i i t t y m i s n e u v o t t e l u t + l i i t t y m i s n ä k y m i e n + l i i t t y m i s n ä k y m i ä + l i i t t y m i s n ä k y m ä + l i i t t y m i s n ä k y m ä t + l i i t t y m i s p a k e t i s t a + l i i t t y m i s p e r i a a t t e i t a + l i i t t y m i s p e r u s t e e s e e n + l i i t t y m i s p e r u s t e e t + l i i t t y m i s p e r u s t e i d e n + l i i t t y m i s p e r u s t e i s s a + l i i t t y m i s p e r u s t e i s t a + l i i t t y m i s p r o s e s s e i h i n + l i i t t y m i s p r o s e s s e i s s a + l i i t t y m i s p r o s e s s i + l i i t t y m i s p r o s e s s i a + l i i t t y m i s p r o s e s s i a m m e + l i i t t y m i s p r o s e s s i e n + l i i t t y m i s p r o s e s s i i n + l i i t t y m i s p r o s e s s i l l e + l i i t t y m i s p r o s e s s i n + l i i t t y m i s p r o s e s s i n s a + l i i t t y m i s p r o s e s s i s s a + l i i t t y m i s p r o s e s s i s s a a n + l i i t t y m i s p r o s e s s i s t a + l i i t t y m i s p r o s e s s i t + l i i t t y m i s p y r k i m y k s i ä + l i i t t y m i s p y r k i m y s t e n + l i i t t y m i s p ä i v ä + l i i t t y m i s p ä i v ä k s i + l i i t t y m i s p ä i v ä m ä ä r ä + l i i t t y m i s p ä i v ä m ä ä r ä n + l i i t t y m i s p ä i v ä m ä ä r ä s t ä + l i i t t y m i s p ä i v ä m ä ä r ä ä + l i i t t y m i s p ä i v ä m ä ä r ä ä n + l i i t t y m i s p ä i v ä n + l i i t t y m i s p ä i v ä n ä + l i i t t y m i s p ä i v ä s t ä + l i i t t y m i s p ä i v ä s t ä ä n + l i i t t y m i s p ä i v ä ä + l i i t t y m i s p ä i v ä ä n + l i i t t y m i s p ä ä m ä ä r ä ä + l i i t t y m i s p ä ä t ö k s i l l e + l i i t t y m i s p ä ä t ö s + l i i t t y m i s p ä ä t ö s t ä + l i i t t y m i s p ö y t ä k i r j a a + l i i t t y m i s p ö y t ä k i r j a n + l i i t t y m i s p ö y t ä k i r j o j a + l i i t t y m i s s i t o u m u k s e n s a + l i i t t y m i s s i t o u m u k s e t + l i i t t y m i s s i t o u m u k s i a a n + l i i t t y m i s s k e n a a r i o + l i i t t y m i s s o p i m u k s e e n + l i i t t y m i s s o p i m u k s e e n s a + l i i t t y m i s s o p i m u k s e l l a + l i i t t y m i s s o p i m u k s e l l e + l i i t t y m i s s o p i m u k s e n + l i i t t y m i s s o p i m u k s e n s a + l i i t t y m i s s o p i m u k s e s s a + l i i t t y m i s s o p i m u k s e s s a a n + l i i t t y m i s s o p i m u k s e s t a + l i i t t y m i s s o p i m u k s e t + l i i t t y m i s s o p i m u k s i a + l i i t t y m i s s o p i m u k s i e n + l i i t t y m i s s o p i m u k s i i n + l i i t t y m i s s o p i m u k s i i n s a + l i i t t y m i s s o p i m u k s i l l a + l i i t t y m i s s o p i m u k s i l l e + l i i t t y m i s s o p i m u k s i s s a + l i i t t y m i s s o p i m u k s i s t a + l i i t t y m i s s o p i m u s l u o n n o k s e l l e + l i i t t y m i s s o p i m u s l u o n n o k s e n + l i i t t y m i s s o p i m u s t a + l i i t t y m i s s o p i m u s t a a n + l i i t t y m i s s o p i m u s t e n + l i i t t y m i s s t r a t e g i a + l i i t t y m i s s t r a t e g i a a + l i i t t y m i s s t r a t e g i a a n + l i i t t y m i s s t r a t e g i a n + l i i t t y m i s s t r a t e g i a s s a + l i i t t y m i s s t r a t e g i a s t a + l i i t t y m i s s t r a t e g i o i d e n + l i i t t y m i s s t r a t e g i o i t a + l i i t t y m i s s u u n n i t e l m a s t a + l i i t t y m i s s u u n n i t e l m i a + l i i t t y m i s t a i s t e l u u n + l i i t t y m i s t a v o i t t e e n + l i i t t y m i s t a v o i t t e e s e e n + l i i t t y m i s t a v o i t t e e s s a + l i i t t y m i s t i e + l i i t t y m i s t o i v e e t + l i i t t y m i s t o i v e i s i i n + l i i t t y m i s t o i v e i s t a a n + l i i t t y m i s t u e n + l i i t t y m i s t ä + l i i t t y m i s t ä ä n + l i i t t y m i s v a a t i m u k s e k s i + l i i t t y m i s v a a t i m u k s e t + l i i t t y m i s v a a t i m u k s i i n + l i i t t y m i s v a i h e + l i i t t y m i s v a i h e i s s a + l i i t t y m i s v a i h e t t a + l i i t t y m i s v a l m i s t e l u i h i n + l i i t t y m i s v a l m i s t e l u i s s a + l i i t t y m i s v a l m i s t e l u i s s a a n + l i i t t y m i s v a l m i s t e l u i s t a + l i i t t y m i s v a l m i s t e l u j a + l i i t t y m i s v a l m i s t e l u j e n + l i i t t y m i s v a l m i s t e l u j e n s a + l i i t t y m i s v a l m i s t e l u t + l i i t t y m i s v a l m i u d e s t a + l i i t t y m i s v a l m i u t t a + l i i t t y m i s v e l v o i t t e e t + l i i t t y m i s v i i v ä s t y s t e n + l i i t t y m i s v u o d e k s i + l i i t t y m i s v u o r o a a n + l i i t t y m i s v u o r o p u h e l u + l i i t t y m i s v u o r o p u h e l u s s a + l i i t t y m i s v u o t t a + l i i t t y m ä k o h d a t + l i i t t y m ä n u m e r o + l i i t t y m ä s s ä + l i i t t y m ä t e i d e n + l i i t t y m ä t t ä + l i i t t y m ä t t ö m i i n + l i i t t y m ä t t ö m i s t ä + l i i t t y m ä t t ö m i ä + l i i t t y m ä t t ö m ä t + l i i t t y m ä ä n + l i i t t y n e e n + l i i t t y n e e s s ä + l i i t t y n e e s t ä + l i i t t y n e e t + l i i t t y n e i d e n + l i i t t y n e i l l e + l i i t t y n e i l l ä + l i i t t y n e i s s ä + l i i t t y n e i s t ä + l i i t t y n e i t ä + l i i t t y v i e n + l i i t t y v i i n + l i i t t y v i l l e + l i i t t y v i l l ä + l i i t t y v i l t ä + l i i t t y v i s s ä + l i i t t y v i s t ä + l i i t t y v i ä + l i i t t y v ä n + l i i t t y v ä s t ä + l i i t t y v ä t + l i i t t y v ä t k i n + l i i t t y v ä t k ö + l i i t t y v ä ä + l i i t t y v ä ä n + l i i t t y y + l i i t t y y k i n + l i i t t y y k ö + l i i t t y ä + l i i t t y ä k s e e n + l i i t t ä i s i n + l i i t t ä k ä ä + l i i t t ä k ä ä m m e + l i i t t ä m i s e k s i + l i i t t ä m i s e s t ä + l i i t t ä m ä l l ä + l i i t t ä m ä t t ä + l i i t t ä m ä ä n + l i i t t ä ä + l i i t u k a u d e n + l i i t u l o u h o k s i a + l i i t u r o u s k u + l i i t y m m e k ö + l i i t y n + l i i t y n t ä p i s t e i t ä + l i i t y n t ä p y s ä k ö i n t i + l i i t y t t y ä m m e + l i i t y t t y ä ä n + l i i t ä m i n e n + l i i t ä n n ä i s a l o i l l a + l i i t ä n n ä i s a l o j e n + l i i t ä n n ä i s a s i a k i r j a t + l i i t ä n n ä i s i l m i ö t + l i i t ä n n ä i s j ä s e n + l i i t ä n n ä i s j ä s e n e k s i + l i i t ä n n ä i s j ä s e n y y d e n + l i i t ä n n ä i s j ä s e n y y s + l i i t ä n n ä i s k u m p p a n i a + l i i t ä n n ä i s k u m p p a n u u t t a + l i i t ä n n ä i s k u s t a n n u k s e t + l i i t ä n n ä i s m a i s s a + l i i t ä n n ä i s o r g a n i s a a t i o i h i n + l i i t ä n n ä i s p o l t t o l a i t o s t e n + l i i t ä n n ä i s s o p i m u k s e n + l i i t ä n n ä i s s ä ä n n ö t + l i i t ä n n ä i s t o i m e n p i d e + l i i t ä n n ä i s t o i m e n p i d e o h j e l m a n + l i i t ä n n ä i s t o i m e n p i t e e t + l i i t ä n n ä i s t o i m e n p i t e i d e n + l i i t ä n n ä i s t o i m e n p i t e i l l ä + l i i t ä n n ä i s t o i m e n p i t e i n + l i i t ä n n ä i s t o i m e n p i t e i s i i n + l i i t ä n n ä i s t o i m e n p i t e i s t ä + l i i t ä n n ä i s t o i m e n p i t e i t ä + l i i t ä n n ä i s t o i m e t + l i i t ä n n ä i s t o i m i a + l i i t ä n n ä i s t o i m i e n + l i i t ä n n ä i s t o i m i n n o t + l i i t ä n n ä i s t o i m i s s a + l i i t ä n n ä i s t o i m i s t a + l i i t ä n n ä i s t y ö p a i k a t + l i i t ä n n ä i s v a l t i o + l i i t ä n t ä k o h t a + l i i t ä n t ä l i i k e n t e e s s ä + l i i t ä n t ä m a k s u t + l i i v a t t e e s s a + l i i v i m e s i k k o + l i i v i n r a n t a + l i k a a m i s t a + l i k a i s e m m i l l e + l i k a i s i a + l i k a i s i m m a t k i n + l i k a i s i s t a + l i k a i s t e n + l i k a p y y k i n + l i k a p y y k i t + l i k a p y y k k i + l i k a p y y k k i ä ä n + l i k i n ä k ö i s y y d e n + l i k i n ä k ö i s y y d e s t ä m m e + l i k i n ä k ö i s y y t t ä + l i k v i d e i h i n + l i k v i d e i s t ä + l i k v i d i e n + l i k v i d i t e e t t i a s e m a a + l i k v i d i t e e t t i k r i i s i + l i k v i d i t e e t t i k r i i s i n + l i k v i d i t e e t t i k r i i s i n ä + l i k v i d i t e e t t i k r i i s i s t ä + l i k v i d i t e e t t i k r i i s i t + l i k v i d i t e e t t i l o u k u s s a + l i k v i d i t e e t t i m ä ä r ä ä + l i k v i d i t e e t t i n o r m e i h i n + l i k v i d i t e e t t i n o r m e i s s a + l i k v i d i t e e t t i n o r m i a + l i k v i d i t e e t t i n o r m i e n + l i k v i d i t e e t t i n o r m i t + l i k v i d i t e e t t i n ä k ö k o h t i i n + l i k v i d i t e e t t i o n g e l m a + l i k v i d i t e e t t i o n g e l m a s s a + l i k v i d i t e e t t i o n g e l m a t + l i k v i d i t e e t t i o n g e l m i a + l i k v i d i t e e t t i o n g e l m i e n + l i k v i d i t e e t t i o n g e l m i i n + l i k v i d i t e e t t i o n g e l m i s s a + l i k v i d i t e e t t i p e r u s t e i n e n + l i k v i d i t e e t t i p o l i i t t i s e t + l i k v i d i t e e t t i p r e e m i o + l i k v i d i t e e t t i p u l a + l i k v i d i t e e t t i p u l a a + l i k v i d i t e e t t i p u s k u r e i t a + l i k v i d i t e e t t i p u s k u r i n + l i k v i d i t e e t t i p u s k u r i s t a + l i k v i d i t e e t t i r i s k i + l i k v i d i t e e t t i t a r p e e s s a + l i k v i d i t e e t t i t o i m i a + l i k v i d i t e e t t i t u e n + l i k v i d i t e e t t i t u k e a + l i k v i d i t e e t t i v a a t i m u k s e t + l i k v i d i t e e t t i v a a t i m u k s i a + l i k v i d i t e e t t i v a j e e n + l i k v i d i t e e t t i v a r a n t o a + l i k v i d i t e e t t i ä + l i k ö ö r i v i i n e j ä + l i l a k e i j u a h v e n + l i l j a k u k k o + l i l l i p u t t i e n + l i m a k a l v o + l i m a k a l v o i l l e + l i m a k a l v o j a + l i m a k a l v o j e n + l i m a n p a p u + l i m a n u l j a s k a + l i m a s k a k o i s a + l i m a s k a s a n i a i n e n + l i m e t t i m e h u a + l i m i t t y v ä t + l i m o n a d e i s s a + l i m o n a d e i s t a + l i n e a a r i a l g e b r a + l i n e a a r i k o m b i n a a t i o + l i n e a a r i k u v a u s + l i n e a a r i l e i k k a u s t a + l i n e a a r i s e l l a + l i n e a a r i s e m p a a n + l i n e a a r i s e s t i + l i n e a a r i s e t + l i n e a a r i s t e n + l i n e a a r i s u u t t a + l i n g v i s t i j u r i s t i + l i n g v i s t i j u r i s t i e n + l i n g v i s t i j u r i s t i t + l i n j a a n s a + l i n j a k o n f e r e n s s e i l l e + l i n j a k o n f e r e n s s e j a + l i n j a k o n f e r e n s s i e n + l i n j a k o o d a u s + l i n j a k y s y m y k s e t + l i n j a l a i v a + l i n j a l i i k e n n e + l i n j a l i i k e n n e a l a l l e + l i n j a l i i k e n n e v a r u s t a m o i h i n + l i n j a l i i k e n n e v a r u s t a m o i l l e + l i n j a l i i k e n t e e n + l i n j a l l a + l i n j a m m e + l i n j a n + l i n j a n n e + l i n j a o r g a n i s a a t i o + l i n j a r a t k a i s u i s t a + l i n j a s s a + l i n j a s t a + l i n j a t + l i n j a t a a n + l i n j a t a s o + l i n j a u k s e t + l i n j a u k s i a + l i n j a u k s i i n + l i n j a v a r u s t a m o i l l a + l i n j a v ä l s k ä r i + l i n j o i h i n + l i n j o i l l a + l i n j o i s t a + l i n j o j a + l i n j o j e n + l i n k k e j ä + l i n k k i d i r e k t i i v i + l i n k k i d i r e k t i i v i i n + l i n k k i d i r e k t i i v i n + l i n k k i k i r j a s t o + l i n k k i r u t t o + l i n k k u v e i t s i + l i n n a k e t t a + l i n n a k e v e n e + l i n n a k k e e n + l i n n a k k e e s e e n + l i n n a k k e i t a + l i n n a s t a + l i n n a v u o r i + l i n n o i t t a u t u v a t + l i n n o i t u k s e e n + l i n n o i t u k s e l t a + l i n n o i t u k s e n + l i n n o i t u k s e n k a l t a i s e n + l i n n o i t u k s e s s a + l i n n o i t u k s e s t a + l i n n o i t u k s i a + l i n n o i t u s j ä r j e s t e l m ä + l i n n o i t u s m e n t a l i t e e t t i + l i n n o i t u s m e n t a l i t e e t t i a + l i n n o i t u s p o l i t i i k k a + l i n n o i t u s t a + l i n n u i s s a + l i n n u i s t a + l i n n u n m e t s ä s t y s + l i n n u n m u n i e n + l i n n u n m u n i s s a + l i n n u n p e s i e n + l i n n u n p e s ä + l i n n u n p ö n t t ö + l i n n u n r a d a n + l i n n u n r a t a + l i n n u n r u o h o y ö k k ö n e n + l i n n u n t i e + l i n n u t + l i n o l i h a p p o + l i n s s i h e i j a s t u s + l i n t u a r v o t + l i n t u a s e m a + l i n t u d i r e k t i i v e i h i n + l i n t u d i r e k t i i v i + l i n t u d i r e k t i i v i n + l i n t u d i r e k t i i v i s s ä + l i n t u d i r e k t i i v i s t ä + l i n t u d i r e k t i i v i ä + l i n t u h y t t y n e n + l i n t u i h i n + l i n t u i n f l u e n s s a + l i n t u i n f l u e n s s a a + l i n t u i n f l u e n s s a a n + l i n t u i n f l u e n s s a e p i d e m i a a + l i n t u i n f l u e n s s a e p i d e m i a a n + l i n t u i n f l u e n s s a e p i d e m i a n + l i n t u i n f l u e n s s a k r i i s i l l ä + l i n t u i n f l u e n s s a k r i i s i ä + l i n t u i n f l u e n s s a k s i + l i n t u i n f l u e n s s a l l a + l i n t u i n f l u e n s s a n + l i n t u i n f l u e n s s a p a n d e m i a + l i n t u i n f l u e n s s a p a n d e m i a a + l i n t u i n f l u e n s s a p a n d e m i a l t a + l i n t u i n f l u e n s s a p a n d e m i a n + l i n t u i n f l u e n s s a p a n d e m i a s t a + l i n t u i n f l u e n s s a p a n d e m i o i d e n + l i n t u i n f l u e n s s a p e s ä k k e i t ä + l i n t u i n f l u e n s s a r o k o t t e e t + l i n t u i n f l u e n s s a s t a + l i n t u i n f l u e n s s a t a p a u k s e e n + l i n t u i n f l u e n s s a t a p a u k s e t + l i n t u i n f l u e n s s a t a p a u k s i a + l i n t u i n f l u e n s s a t a p a u k s i s t a + l i n t u i n f l u e n s s a t a p a u s t e n + l i n t u i n f l u e n s s a t a r t u n n a n + l i n t u i n f l u e n s s a t a r t u n t a + l i n t u i n f l u e n s s a t a r t u n t o j e n + l i n t u i n f l u e n s s a t i l a n t e e s t a + l i n t u i n f l u e n s s a u h k a + l i n t u i n f l u e n s s a v i r u k s e n + l i n t u i n f l u e n s s a v i r u k s e s t a + l i n t u i n f l u e n s s a v i r u k s e t + l i n t u i n f l u e n s s a v i r u s + l i n t u j a + l i n t u j e n + l i n t u j e n s u o j e l u a + l i n t u j e n s u o j e l u a l u e + l i n t u j e n s u o j e l u d i r e k t i i v i n + l i n t u j e n s u o j e l u j ä r j e s t ö i l t ä + l i n t u j e n s u o j e l u u n + l i n t u k a n t o j a + l i n t u k o d o s s a m m e + l i n t u k o l e r a + l i n t u l a j e i s t a + l i n t u l a j i a + l i n t u l a j i e n + l i n t u l a j i n + l i n t u l a j i t + l i n t u l a n + l i n t u l a u t a + l i n t u m a l a r i a + l i n t u m ä ä r ä + l i n t u p a r a t i i s i a + l i n t u p o p u l a a t i o o n + l i n t u p u i s t o + l i n t u r u t o n + l i n t u r u t t o a + l i n t u r u t t o o n + l i n t u t a u d i s t a + l i n t u t y t t ö + l i n t u v i r u s + l i n t u v u o r i + l i n t u y h d y s k u n t i e n + l i n t u y h d y s k u n t i i n + l i p a s t a + l i p e ä v ä t + l i p p a l a k k i + l i p p u a + l i p p u a u t o m a a t e i s t a + l i p p u a u t o m a a t t i + l i p p u e a m i r a a l i + l i p p u j a + l i p p u j e n + l i p p u j e n j a k e l u j ä r j e s t e l m ä l l e + l i p p u j e n j a k o j ä r j e s t e l m ä s t ä ä n + l i p p u j ä r j e s t e l m i ä + l i p p u j ä r j e s t e l m ä ä + l i p p u j ä r j e s t e l y i s t ä + l i p p u j ä r j e s t e l y j ä + l i p p u k i r j o a h v e n + l i p p u k u l u i s t a + l i p p u l a i v a + l i p p u l a i v a e h d o t u k s e n + l i p p u l a i v a h a n k e + l i p p u l a i v a h a n k e t t a + l i p p u l a i v a h a n k k e e k s i + l i p p u l a i v a h a n k k e e n + l i p p u l a i v a h a n k k e e n a + l i p p u l a i v a h a n k k e e s e e n + l i p p u l a i v a h a n k k e e s s a + l i p p u l a i v a h a n k k e e s t a + l i p p u l a i v a h a n k k e e t + l i p p u l a i v a h a n k k e i d e n + l i p p u l a i v a h a n k k e i s t a + l i p p u l a i v a h a n k k e i t a + l i p p u l a i v a i d e a + l i p p u l a i v a l a j i + l i p p u l a i v a l e n t o y h t i ö i t ä ä n + l i p p u l a i v a o h j e l m i s t a + l i p p u l a i v a p o l i t i i k k a a + l i p p u l a i v a t a p a h t u m a + l i p p u l a i v a t o i m e n p i t e i t ä + l i p p u l a i v a v e s i e n + l i p p u l a u s e + l i p p u l e h t i k a l a + l i p p u l i n n a n + l i p p u m a a + l i p p u m a r k k i n o i l l a + l i p p u m ä ä r ä + l i p p u n a + l i p p u n s a + l i p p u p a l l o + l i p p u p a r a a t i s t a + l i p p u p e r u s t e i s e l l a + l i p p u p y r s t ö k o l i b r i + l i p p u s i m p u t + l i p p u t a n k o s o t a + l i p p u t e t r a + l i p p u t i e d o t + l i p p u t o i m i s t o i s s a + l i p p u t o i m i s t o j a + l i p p u t o i m i s t o n + l i p p u t u l o i l l a + l i p p u u n + l i p p u v a l a + l i p p u v a l t i o + l i p p u v a l t i o i d e n + l i p p u v a l t i o i h i n + l i p p u v a l t i o i l l e + l i p p u v a l t i o i n a + l i p p u v a l t i o i t a + l i p p u v a l t i o n + l i p p u v a l t i o o n + l i p p u v a l t i o s ä ä n n ö s t ö n + l i p p u v a l t i o t + l i p p u v a l t i o t a + l i p p u v a l t i o y h t i ö + l i p p u y h t i ö t + l i p p u ä ä n e s t y k s e e n + l i p p u ä ä n e s t y k s e n ä + l i p p u ä ä n e s t y k s e s s ä + l i p p u ä ä n e s t y s l a a t i k o t + l i p p u ä ä n e s t y s t ä + l i p s a h d u k s e s t a + l i p s u m a a n + l i p s u m i s t a + l i p s u n e e t + l i p s u t t a i s i i n + l i p u i s t a + l i p u l l a + l i p u n + l i p u n k a n t a j a + l i p u n k a n t a j i a + l i p u n m y y j ä t + l i p u n m y y n n i s s ä + l i p u n m y y n n i s t ä + l i p u n m y y n t i + l i p u n m y y n t i j ä r j e s t e l y i s s ä + l i p u n m y y n t i j ä r j e s t e l y t + l i p u n m y y n t i p i s t e i s s ä + l i p u n m y y n t i p o l i t i i k a s s a a n + l i p u n m y y n t i s y s t e e m i ä + l i p u n m y y n t i ä + l i p u n r y ö s t ö + l i p u s s a + l i p u s t a m m e + l i p u t + l i p u t e t t i i n + l i p u t t a a + l i p u t t a e n + l i s e n s i o i n t i j ä r j e s t e l m ä ä + l i s e n s i o i n t i m a l l i + l i s e n s i o i n t i p o l i t i i k a l l a + l i s e n s i o i n t i t o i m i n t o j a + l i s e n s o i n t i d i r e k t i i v i n + l i s e n s o i n t i h a k e m u s t a + l i s e n s o i n t i j ä r j e s t e l m ä n + l i s e n s o i n t i j ä r j e s t e l m ä s s ä + l i s e n s o i n t i j ä r j e s t e l m ä ä + l i s e n s o i n t i j ä r j e s t e l y j ä + l i s e n s o i n t i j ä r j e s t ö s t ä + l i s e n s o i n t i k y s y m y k s i ä + l i s e n s o i n t i m a l l i + l i s e n s o i n t i m a l l i s t a + l i s e n s o i n t i m e n e t e l m ä + l i s e n s o i n t i m ä ä r ä y k s i ä + l i s e n s o i n t i r a k e n t e i t a + l i s e n s s e i h i n + l i s e n s s e i s t ä + l i s e n s s e j ä + l i s e n s s i e h d o t + l i s e n s s i e h t o j e n + l i s e n s s i e n + l i s e n s s i h a k e m u k s e t + l i s e n s s i j ä r j e s t e l m i e n + l i s e n s s i j ä r j e s t e l m i ä + l i s e n s s i j ä r j e s t e l m ä + l i s e n s s i j ä r j e s t e l m ä n + l i s e n s s i j ä r j e s t e l m ä s t ä + l i s e n s s i j ä r j e s t e l y i h i n + l i s e n s s i k a u p p a + l i s e n s s i k s i + l i s e n s s i k u l u j a + l i s e n s s i k u s t a n n u s t e n + l i s e n s s i l l ä + l i s e n s s i m a k s u a + l i s e n s s i m a k s u i h i n + l i s e n s s i m a k s u i l l a + l i s e n s s i m a k s u i s t a + l i s e n s s i m a k s u j a + l i s e n s s i m a k s u j e n + l i s e n s s i m a k s u n + l i s e n s s i m a k s u t + l i s e n s s i n h a k i j o i t a + l i s e n s s i n v a r a i s t a + l i s e n s s i p o l i t i i k a l l e + l i s e n s s i s o p i m u k s e n + l i s e n s s i s o p i m u s + l i s e n s s i s o p i m u s t e n + l i s e n s s i s ä ä d ö s + l i s e n s s i v a a t i m u k s e t + l i s e n s s i v a a t i m u k s i s t a + l i s e n s s i v a l m i s t u s + l i s e n s s i v a l m i s t u s t a + l i s e n s s i y h t e e n s o p i v u u s + l i s e n s s i ä + l i s i n + l i s i ä + l i s k o h a u k k a + l i s k o l i n t u + l i s k o v a r p u s h a u k k a + l i s t a l l a + l i s t a l l e + l i s t a n + l i s t a t + l i s t a t t a k o o n + l i s t a t u s t a + l i s t a v a a l i + l i s t e r i a a + l i s t o i h i n + l i s t o i l l e + l i s t o i l l e e n + l i s t o i l t a + l i s t o i n a + l i s t o i s t a + l i s t o j a + l i s ä a i k a + l i s ä a i k a a + l i s ä a i k a a n + l i s ä a i n e + l i s ä a i n e d i r e k t i i v i i n + l i s ä a i n e d i r e k t i i v i n + l i s ä a i n e e n + l i s ä a i n e e s t a + l i s ä a i n e e t + l i s ä a i n e e t o n t a + l i s ä a i n e i d e n + l i s ä a i n e i n a + l i s ä a i n e i s i i n + l i s ä a i n e i s t a + l i s ä a i n e i t a + l i s ä a i n e l u e t t e l o + l i s ä a i n e l u e t t e l o i d e n + l i s ä a i n e l u e t t e l o i s t a + l i s ä a i n e l u e t t e l o n + l i s ä a i n e l u o k i s t a + l i s ä a i n e t t a + l i s ä a j a k s i + l i s ä a j a l l a + l i s ä a j a n + l i s ä a j a s t a + l i s ä a j a t u k s i a + l i s ä a l a + l i s ä a l e n n u s + l i s ä a l o i t t e i d e n + l i s ä a l o i t t e i t a + l i s ä a l t i s t u m i s e n i + l i s ä a l u e + l i s ä a l u e e s t a + l i s ä a m m u k s i a + l i s ä a n a l y y s e i l t ä + l i s ä a n a l y y s i n + l i s ä a n a l y y s i t + l i s ä a n a l y y s i ä + l i s ä a n n o s + l i s ä a n s i o t u l o t + l i s ä a p u + l i s ä a p u a + l i s ä a p u n a + l i s ä a p u o s a n + l i s ä a p u u n + l i s ä a r g u m e n t t i + l i s ä a r v i o i d e n + l i s ä a r v i o i n n i n + l i s ä a r v i o i n n i s t a + l i s ä a r v i o i n t e j a + l i s ä a r v i o i n t i a + l i s ä a r v i o i t a + l i s ä a r v o + l i s ä a r v o a + l i s ä a r v o a a n + l i s ä a r v o a m m e + l i s ä a r v o i l l a + l i s ä a r v o i s t a + l i s ä a r v o j e n + l i s ä a r v o k e t j u j e n + l i s ä a r v o k e t j u s s a + l i s ä a r v o k e t j u u n + l i s ä a r v o k s i + l i s ä a r v o l l a + l i s ä a r v o l l e + l i s ä a r v o l t a a n + l i s ä a r v o m m e + l i s ä a r v o n + l i s ä a r v o n a + l i s ä a r v o n s a + l i s ä a r v o o n + l i s ä a r v o p a l v e l u i t a + l i s ä a r v o p r o s e s s i a + l i s ä a r v o s t a + l i s ä a r v o s t a a n + l i s ä a r v o t + l i s ä a r v o t e k i j ö i t ä + l i s ä a r v o t u o t t e i t a + l i s ä a s e t u k s e s s a + l i s ä a s e t u k s i s t a + l i s ä a s e v o i m i e n + l i s ä a s i a k i r j a + l i s ä a s i a k i r j a a + l i s ä a s i a k i r j a n + l i s ä a s i a k i r j a t + l i s ä a s i a k i r j a v a a t i m u k s e s t a + l i s ä a s i a k i r j o j a + l i s ä a s i a n t u n t e m u s t a + l i s ä a s k e l + l i s ä a s k e l e e n + l i s ä a s k e l e e t + l i s ä a s k e l e i d e n + l i s ä a s k e l e i t a + l i s ä a s k e l i a + l i s ä a s k e l t a + l i s ä a u k k o j a + l i s ä a v o i m u u d e n + l i s ä a v o i m u u s p e r i a a t t e e n + l i s ä a v u n + l i s ä a v u s t a + l i s ä a v u s t a j a k o r v a u k s e n + l i s ä a v u s t u k s i a + l i s ä a v u s t u k s i i n + l i s ä a v u s t u s o h j e l m a a + l i s ä a v u s t u s o h j e l m i a + l i s ä a v u s t u s t a + l i s ä a v u s t u s t e n + l i s ä b u d j e t i l l a + l i s ä b u d j e t i n + l i s ä b u d j e t t i + l i s ä b u d j e t t i e s i t y k s e n + l i s ä b u d j e t t i e s i t y k s i ä + l i s ä b u d j e t t i n s a + l i s ä b y r o k r a t i a a + l i s ä b y r o k r a t i a l l a + l i s ä b y r o k r a t i a n + l i s ä d i r e k t i i v e j ä + l i s ä d i r e k t i i v i e n + l i s ä d o l l a r e i t a + l i s ä e d e l l y t y k s e n ä + l i s ä e d e l l y t y k s i i n + l i s ä e d e l l y t y k s i s t ä + l i s ä e d e l l y t y k s i ä + l i s ä e d i s t y k s e n + l i s ä e d i s t y k s e s t ä + l i s ä e d i s t y m i n e n + l i s ä e d i s t y s a s k e l i a + l i s ä e d i s t y s t ä + l i s ä e d u t + l i s ä e h d o i l l a + l i s ä e h d o i s t a + l i s ä e h d o k s i + l i s ä e h d o t + l i s ä e h d o t u k s e n + l i s ä e h d o t u k s e t + l i s ä e h d o t u k s i a + l i s ä e h d o t u k s i a n n e + l i s ä e h d o t u k s i i n + l i s ä e h d o t u k s i s t a + l i s ä e h d o t u s + l i s ä e h d o t u s t a + l i s ä e h t o j a + l i s ä e h t o j e n + l i s ä e l e m e n t i n + l i s ä e l e m e n t t e j ä + l i s ä e l e m e n t t i + l i s ä e l i n t a r v i k k e e t + l i s ä e l i n t a r v i k k e i s i i n + l i s ä e l v y t y s + l i s ä e l v y t y s s u u n n i t e l m i a + l i s ä e l ä k e + l i s ä e l ä k e j ä r j e s t e l m i e n + l i s ä e l ä k e j ä r j e s t e l m i i n + l i s ä e l ä k e j ä r j e s t e l m i l l e + l i s ä e l ä k e j ä r j e s t e l m i l l ä + l i s ä e l ä k e j ä r j e s t e l m i s s ä + l i s ä e l ä k e j ä r j e s t e l m i s t ä + l i s ä e l ä k e j ä r j e s t e l m i ä + l i s ä e l ä k e j ä r j e s t e l m ä + l i s ä e l ä k e j ä r j e s t e l m ä l l ä + l i s ä e l ä k e j ä r j e s t e l m ä n + l i s ä e l ä k e j ä r j e s t e l m ä s t ä + l i s ä e l ä k e j ä r j e s t e l m ä t + l i s ä e l ä k e j ä r j e s t e l m ä ä + l i s ä e l ä k e j ä r j e s t e l m ä ä n + l i s ä e l ä k e k a s s o i h i n + l i s ä e l ä k e k o m i t e a + l i s ä e l ä k e k y s y m y s + l i s ä e l ä k e o i k e u d e t + l i s ä e l ä k e o i k e u k s i e n + l i s ä e l ä k e o i k e u k s i i n + l i s ä e l ä k e o i k e u t e n s a + l i s ä e l ä k e r a h a s t o + l i s ä e l ä k e r a h a s t o j a + l i s ä e l ä k e r a h a s t o n + l i s ä e l ä k e r a h a s t o t + l i s ä e l ä k e t a r j o n n a n + l i s ä e l ä k e t t ä + l i s ä e l ä k e t u l o j a + l i s ä e l ä k e v i r a n o m a i n e n + l i s ä e l ä k e v i r a n o m a i s e e n + l i s ä e l ä k e v i r a n o m a i s e n + l i s ä e l ä k e v i r a n o m a i s e s t a + l i s ä e l ä k e v i r a n o m a i s t a + l i s ä e l ä k k e e n + l i s ä e l ä k k e e n s ä + l i s ä e l ä k k e e s e e n + l i s ä e l ä k k e e s t ä + l i s ä e l ä k k e e t + l i s ä e l ä k k e i d e n + l i s ä e l ä k k e i l l e + l i s ä e l ä k k e i l l ä + l i s ä e l ä k k e i s i i n + l i s ä e l ä k k e i s s ä + l i s ä e l ä k k e i s t ä + l i s ä e l ä k k e i t ä + l i s ä e n e r g i a a + l i s ä e n e r g i a h u o l l o s t a + l i s ä e n e r g i a m a h d o l l i s u u k s i e n + l i s ä e n n a k k o a r v i o s t a + l i s ä e n n a k k o a r v i o t a + l i s ä e n n a k k o m a k s u t + l i s ä e r i e n + l i s ä e s i m e r k i n + l i s ä e s i m e r k k e i h i n + l i s ä e s i m e r k k i + l i s ä e s i m e r k k i ä + l i s ä e s t e + l i s ä e s t e e k s i + l i s ä e s t e i t ä + l i s ä e t a p p i n a + l i s ä e t u + l i s ä e t u a + l i s ä e t u j a + l i s ä e t u j e n + l i s ä e t u n a + l i s ä e t u u d e t + l i s ä e t u u k s i a + l i s ä e t u u k s i e n + l i s ä e u r o a + l i s ä e u r o j a + l i s ä e u r o l l a + l i s ä h a a s t e + l i s ä h a a s t e e n + l i s ä h a a s t e e s e e n + l i s ä h a a s t e e s t a + l i s ä h a a s t e i s i i n + l i s ä h a a s t e i t a + l i s ä h a i t a t + l i s ä h a k e m u k s e t + l i s ä h a k e m u s t a + l i s ä h a n k a l u u k s i a + l i s ä h a n k k e i d e n + l i s ä h a n k k e i t a + l i s ä h a r k i n t a + l i s ä h a r k i n t a a + l i s ä h a r m i a + l i s ä h a r m o n i s o i n t i + l i s ä h e l p o t u k s i a + l i s ä h e n k i l ö k u n t a a + l i s ä h e n k i l ö s t ö + l i s ä h e n k i l ö s t ö n + l i s ä h e n k i l ö s t ö s t ä + l i s ä h e n k i l ö s t ö ä + l i s ä h e r m o + l i s ä h i n n o i l l a + l i s ä h i n t a + l i s ä h i n t a a + l i s ä h o u k u t i n + l i s ä h o u k u t t i m e n a + l i s ä h u o l e n a i h e + l i s ä h u o l i + l i s ä h u o l t a + l i s ä h u o m a u t u k s e n + l i s ä h u o m a u t u k s e n a + l i s ä h u o m a u t u k s e s s a + l i s ä h u o m a u t u k s e s t a + l i s ä h u o m a u t u k s i a + l i s ä h u o m a u t u k s i s t a + l i s ä h u o m a u t u k s i s t a a n + l i s ä h u o m a u t u s t a + l i s ä h u o m a u t u s t e n + l i s ä h u o m i o + l i s ä h u o m i o i t a + l i s ä h u o m i o n a + l i s ä h u o m i o s t a + l i s ä h u o m i o t a + l i s ä h y ö d y n + l i s ä h y ö k k ä y k s e t + l i s ä h y ö t y + l i s ä h y ö t y j ä + l i s ä h y ö t y n ä + l i s ä h y ö t y ä + l i s ä h ä v i k k i i n + l i s ä i d e o i t a + l i s ä i n d i k a a t t o r e i t a + l i s ä i n f r a s t r u k t u u r e i l l a + l i s ä i n n o v a a t i o i h i n + l i s ä i n t e g r a a t i o t a + l i s ä i n v e s t o i n n e i l l a + l i s ä i n v e s t o i n n e i l l e + l i s ä i n v e s t o i n n e i s t a + l i s ä i n v e s t o i n n i n + l i s ä i n v e s t o i n n i t + l i s ä i n v e s t o i n t e i h i n + l i s ä i n v e s t o i n t e j a + l i s ä i n v e s t o i n t i e n + l i s ä i s i + l i s ä i s i m m e + l i s ä i s i n + l i s ä i s i v ä t + l i s ä i s k u + l i s ä i s k u j e n + l i s ä i s t u n t o a + l i s ä i s t u n t o j a + l i s ä i s t u n t o j a k s o a + l i s ä j a k a u t u m i s t a + l i s ä j o u k k o j a + l i s ä j o u k k o j e n + l i s ä j o u k o i k s i + l i s ä j o u s t a v u u t t a + l i s ä j o u s t o a + l i s ä j o u s t o l l a + l i s ä j o u s t o n + l i s ä j u l m u u k s i l t a + l i s ä j u n a + l i s ä j ä l j i t e t t ä v y y d e n + l i s ä j ä r j e s t e l m ä t + l i s ä j ä s e n e t + l i s ä j ä s e n i s t ä + l i s ä j ä s e n i ä + l i s ä j ä s e n t ä + l i s ä j ä y k k y y s + l i s ä k a a s u n + l i s ä k a l a s t u s m a h d o l l i s u u k s i a + l i s ä k a n n a t u s t a + l i s ä k a n n u s t e i s i i n + l i s ä k a n n u s t e i s t a + l i s ä k a n n u s t i m e k s i + l i s ä k a n n u s t i m e n + l i s ä k a n n u s t i m e n a + l i s ä k a n n u s t i m i a + l i s ä k a n n u s t i m i l l a + l i s ä k a n n u s t i n + l i s ä k a n n u s t i n t a + l i s ä k a n n u s t u k s e s t a + l i s ä k a n s a l a i s u u s + l i s ä k a n s a n ä ä n e s t y s + l i s ä k a p a s i t e e t i n + l i s ä k a p a s i t e e t t e j a + l i s ä k a p a s i t e e t t i + l i s ä k a p a s i t e e t t i a + l i s ä k a p p a l e i h i n + l i s ä k a s v u a + l i s ä k a s v u l l e + l i s ä k a s v u n + l i s ä k a s v u u n + l i s ä k a t a s t r o f e i h i n + l i s ä k a t a s t r o f i a + l i s ä k a u s i + l i s ä k e h i t t ä m i s e k s i + l i s ä k e h i t t ä m i s e n + l i s ä k e h i t t ä m i s t ä + l i s ä k e h i t y k s e l l e + l i s ä k e h i t y k s e n + l i s ä k e h i t y s + l i s ä k e h i t y s t ä + l i s ä k e i n o + l i s ä k e i n o i s t a + l i s ä k e i n o j a + l i s ä k e i n o n + l i s ä k e i n o n a + l i s ä k e i n o t + l i s ä k e r r o k s e n + l i s ä k e s k u s t e l u + l i s ä k e s k u s t e l u a + l i s ä k e s k u s t e l u i h i n + l i s ä k e s k u s t e l u i l l e + l i s ä k e s k u s t e l u i s t a + l i s ä k e s k u s t e l u j a + l i s ä k e s k u s t e l u j e n + l i s ä k e s k u s t e l u l l e + l i s ä k e s k u s t e l u t + l i s ä k i e l t o j a + l i s ä k i e l t o j e n + l i s ä k i e r r o s + l i s ä k i i h o k e + l i s ä k i i n t i ö + l i s ä k i i n t i ö i d e n + l i s ä k i i n t i ö i h i n + l i s ä k i i n t i ö i l l ä + l i s ä k i i n t i ö i t ä + l i s ä k i i n t i ö o s u u d e t + l i s ä k i i n t i ö t ä + l i s ä k i l o m e t r e j ä + l i s ä k i l p a i l u + l i s ä k i l p i r a u h a n e n + l i s ä k o e t i n + l i s ä k o e t t a + l i s ä k o h d i s s a + l i s ä k o h t a + l i s ä k o h t a a + l i s ä k o h t a n a + l i s ä k o h t i a + l i s ä k o k e i t a + l i s ä k o k e m u k s e s t a + l i s ä k o k o u k s e t + l i s ä k o m m e n t i n + l i s ä k o m m e n t t e j a + l i s ä k o m m e n t t i a + l i s ä k o n f e r e n s s i n + l i s ä k o o r d i n o i n t i a + l i s ä k o r o t u k s e t + l i s ä k o r o t u k s i a + l i s ä k o r o t u s + l i s ä k o r v a u k s e n + l i s ä k o r v a u k s e s t a + l i s ä k o r v a u k s e t + l i s ä k o r v a u k s i a + l i s ä k o r v a u s + l i s ä k o u l u j a + l i s ä k o u l u t u k s e e n + l i s ä k o u l u t u k s e n + l i s ä k o u l u t u k s e s s a + l i s ä k o u l u t u k s e s t a + l i s ä k o u l u t u s + l i s ä k o u l u t u s t a + l i s ä k r i t e e r e i h i n + l i s ä k r i t e e r e i t ä + l i s ä k r i t e e r e j ä + l i s ä k r i t e e r i n ä + l i s ä k s e e n + l i s ä k u l j e t u k s e t + l i s ä k u l u i h i n + l i s ä k u l u i n + l i s ä k u l u i s t a + l i s ä k u l u i t t a + l i s ä k u l u j a + l i s ä k u l u j e n + l i s ä k u l u t + l i s ä k u l u t u s t a + l i s ä k u o r m i t u s t a + l i s ä k u s t a n n u k s e n a + l i s ä k u s t a n n u k s e t + l i s ä k u s t a n n u k s i a + l i s ä k u s t a n n u k s i e n + l i s ä k u s t a n n u k s i i n + l i s ä k u s t a n n u k s i l l a + l i s ä k u s t a n n u k s i l l e + l i s ä k u s t a n n u k s i l t a + l i s ä k u s t a n n u k s i n + l i s ä k u s t a n n u k s i n a + l i s ä k u s t a n n u k s i n e e n + l i s ä k u s t a n n u k s i s t a + l i s ä k u s t a n n u s + l i s ä k u s t a n n u s s u u n n i t e l m i s t a + l i s ä k u s t a n n u s t a + l i s ä k u s t a n n u s t e n + l i s ä k u u k a u d e n + l i s ä k u u k a u t t a + l i s ä k u u l e m i s e n + l i s ä k u u l e m i s i a + l i s ä k y s e l y y n n e + l i s ä k y s y m y k s e e n + l i s ä k y s y m y k s e e n i + l i s ä k y s y m y k s e e n i k i n + l i s ä k y s y m y k s e e n n e + l i s ä k y s y m y k s e e n s ä + l i s ä k y s y m y k s e k s i + l i s ä k y s y m y k s e l l ä + l i s ä k y s y m y k s e n + l i s ä k y s y m y k s e n i + l i s ä k y s y m y k s e n n e + l i s ä k y s y m y k s e n s ä + l i s ä k y s y m y k s e n ä + l i s ä k y s y m y k s e s s ä + l i s ä k y s y m y k s e s s ä n i + l i s ä k y s y m y k s e s s ä n n e + l i s ä k y s y m y k s e s s ä ä n + l i s ä k y s y m y k s e s t ä + l i s ä k y s y m y k s e s t ä n i + l i s ä k y s y m y k s e s t ä n n e + l i s ä k y s y m y k s e s t ä ä n + l i s ä k y s y m y k s e t + l i s ä k y s y m y k s i e n + l i s ä k y s y m y k s i i n + l i s ä k y s y m y k s i l l e + l i s ä k y s y m y k s i n ä + l i s ä k y s y m y k s i s s ä + l i s ä k y s y m y k s i s t ä + l i s ä k y s y m y k s i s t ä n n e + l i s ä k y s y m y k s i ä + l i s ä k y s y m y s + l i s ä k y s y m y s p y y n t ö ä + l i s ä k y s y m y s t e n + l i s ä k y s y m y s t ä + l i s ä k y s y m y s t ä n i + l i s ä k ä r s i m y k s e t + l i s ä k ä r s i m y s t ä + l i s ä k ä s i t t e l y k u l u j a + l i s ä k ä y t t ä j i ä + l i s ä k ä y t t ö m a h d o l l i s u u k s i e n + l i s ä l a a j e n n u s t a + l i s ä l a a j e n t a m i n e n + l i s ä l a a j e n t a m i s t a + l i s ä l a a j e n t u m i n e n + l i s ä l a a j e n t u m i s e e n + l i s ä l a a j e n t u m i s e l l e + l i s ä l a a j e n t u m i s e n + l i s ä l a a j e n t u m i s e s t a + l i s ä l a a j e n t u m i s e t + l i s ä l a a j e n t u m i s i a + l i s ä l a a j e n t u m i s i i n + l i s ä l a a j e n t u m i s i l l e + l i s ä l a a j e n t u m i s t a + l i s ä l a i n a a + l i s ä l a i n a n o t o n + l i s ä l a i n a u k s e e n + l i s ä l a i n o j e n + l i s ä l a i n s ä ä d ä n n ö s t ä + l i s ä l a i n s ä ä d ä n t ö + l i s ä l a i n s ä ä d ä n t ö t o i m i e n + l i s ä l a i n s ä ä d ä n t ö ä + l i s ä l a i n s ä ä d ä n t ö ö n + l i s ä l a i t t e i s t a + l i s ä l a j i a + l i s ä l a s k u + l i s ä l a u s e + l i s ä l a u s e k e + l i s ä l a u s u m a n + l i s ä l e i k k a u k s e t + l i s ä l e i k k a u k s i a + l i s ä l e i k k a u k s i l l a + l i s ä l e i k k a u s + l i s ä l e v y + l i s ä l i i k e n n e + l i s ä l i i k e n n e v ä l i n e t t ä + l i s ä l u e t t e l o i d e n + l i s ä l u e t t e l o n + l i s ä l u o k i t u k s e n + l i s ä l u p i a + l i s ä l y k k ä y s + l i s ä l y k k ä y s t ä + l i s ä l ä h t e e n ä + l i s ä l ä h t e i s t ä + l i s ä m a d a l l u k s e l l e + l i s ä m a h d o l l i s u u d e n + l i s ä m a h d o l l i s u u d e t + l i s ä m a h d o l l i s u u k s i a + l i s ä m a h d o l l i s u u s + l i s ä m a h d o l l i s u u t e n a + l i s ä m a h d o l l i s u u t t a + l i s ä m a i n i n t a + l i s ä m a i n i n t o j a + l i s ä m a i t o a + l i s ä m a k s u + l i s ä m a k s u a + l i s ä m a k s u i k s i + l i s ä m a k s u i s t a + l i s ä m a k s u j a + l i s ä m a k s u j e n + l i s ä m a k s u j ä r j e s t e l m ä ä + l i s ä m a k s u k y s y m y s + l i s ä m a k s u l l a + l i s ä m a k s u m ä ä r ä r a h o j a + l i s ä m a k s u n + l i s ä m a k s u s t a + l i s ä m a k s u t + l i s ä m a l l i a + l i s ä m a r k k i n o i d e n + l i s ä m a t e r i a a l i a + l i s ä m a t k a p ä i v i ä + l i s ä m e k a n i s m e j a + l i s ä m e k a n i s m i e n + l i s ä m e n e t t e l y + l i s ä m e n e t t e l y i l l ä + l i s ä m e n e t t e l y j ä + l i s ä m e n e t y k s i i n + l i s ä m e n o e r ä + l i s ä m e n o i h i n + l i s ä m e n o i l l a + l i s ä m e n o i l l e + l i s ä m e n o i s t a + l i s ä m e n o j a + l i s ä m e n o j e n + l i s ä m e n o t + l i s ä m e r k i n n ä s t ä + l i s ä m e r k i n n ä t + l i s ä m e r k i n t ä + l i s ä m e r k i n t ö j ä + l i s ä m e r k i t y s t ä + l i s ä m e r k k e j ä + l i s ä m i e t i n n ö n + l i s ä m i e t i n t ä a i k a a + l i s ä m i n u u t i n + l i s ä m i n u u t t i a + l i s ä m u k a u t u k s e e n + l i s ä m u k a u t u k s i a + l i s ä m u k a u t u k s i i n + l i s ä m u k a u t u s + l i s ä m u n u a i n e n + l i s ä m u n u a i s k a s v a i n + l i s ä m u n u a i s y d i n + l i s ä m u o d o l l i s u u k s i a + l i s ä m u o d o l l i s u u k s i e n + l i s ä m u o t o i l u + l i s ä m u o t o i l u a + l i s ä m u o t o i l u n + l i s ä m u u r i n + l i s ä m u u t o k s i a + l i s ä m u u t o k s i i n + l i s ä m u u t o k s i l l a + l i s ä m u u t o k s i s t a + l i s ä m u u t o s + l i s ä m y y n t i a r g u m e n t t i + l i s ä m y ö n n y t y k s e n ä + l i s ä m y ö n n y t y k s i i n + l i s ä m y ö n n y t y k s i s t ä + l i s ä m y ö n n y t y k s i ä + l i s ä m y ö n n y t y s t e n + l i s ä m ä ä r i t t e e t + l i s ä m ä ä r i t t e l y j ä + l i s ä m ä ä r ä + l i s ä m ä ä r ä a i k a n a + l i s ä m ä ä r ä a j a n + l i s ä m ä ä r ä n ä + l i s ä m ä ä r ä r a h a + l i s ä m ä ä r ä r a h a n + l i s ä m ä ä r ä r a h a p y y n t ö ä + l i s ä m ä ä r ä r a h a t + l i s ä m ä ä r ä r a h o i h i n + l i s ä m ä ä r ä r a h o i l l a + l i s ä m ä ä r ä r a h o i s s a + l i s ä m ä ä r ä r a h o i s t a + l i s ä m ä ä r ä r a h o j a + l i s ä m ä ä r ä r a h o j e n + l i s ä m ä ä r ä t + l i s ä m ä ä r ä y k s i i n + l i s ä m ä ä r ä y k s i ä + l i s ä m ä ä r ä y s t e n + l i s ä m ä ä r ä ä + l i s ä n + l i s ä n e l i ö m e t r i + l i s ä n e u v o t t e l u i d e n + l i s ä n e u v o t t e l u i h i n + l i s ä n e u v o t t e l u i l l e + l i s ä n e u v o t t e l u j a + l i s ä n e u v o t t e l u j e n + l i s ä n e u v o t t e l u o h j e i s t a + l i s ä n e u v o t t e l u t + l i s ä n i m e n + l i s ä n i m i t y s + l i s ä n n e e t + l i s ä n n y t + l i s ä n s ä + l i s ä n u m e r o + l i s ä n ä + l i s ä n ä k e m y k s i ä + l i s ä n ä k ö k o h t a + l i s ä n ä k ö k u l m a + l i s ä n ä p p ä i n + l i s ä n ä y t t e i t ä + l i s ä n ä y t t ö j e n + l i s ä n ä y t t ö ä + l i s ä o h j e i t a + l i s ä o h j e l m a a + l i s ä o h j e l m a l l a + l i s ä o h j e l m a n + l i s ä o h j e l m i a + l i s ä o h j e l m i e n + l i s ä o i k e u d e n k ä y n t i ä + l i s ä o i k e u k s i a + l i s ä o i k e u s + l i s ä o i k e u t t a + l i s ä o i r e + l i s ä o n g e l m a + l i s ä o n g e l m a a + l i s ä o n g e l m a n + l i s ä o n g e l m i a + l i s ä o n g e l m i e n + l i s ä o n g e l m i i n + l i s ä o p a s t u s t a + l i s ä o p i n t o i h i n + l i s ä o p p i m i n e n + l i s ä o s a + l i s ä o s o i t u k s e n a + l i s ä o s o i t u s + l i s ä o s t o v o i m a n + l i s ä o s u u k s i a + l i s ä o s u u k s i s t a + l i s ä p a i k a n + l i s ä p a i k a s t a + l i s ä p a i k k a + l i s ä p a i k k o j a + l i s ä p a i n e e s e e n + l i s ä p a i n e i s i i n + l i s ä p a i n e i t a + l i s ä p a i n o a + l i s ä p a i n o s t u s t a + l i s ä p a k e t i n + l i s ä p a k e t t i + l i s ä p a k e t t i a + l i s ä p a k o t t e i s t a + l i s ä p a k o t t e i t a + l i s ä p a l k k a a + l i s ä p a l k k i o + l i s ä p a l k k i o i t a + l i s ä p a l k k i o n + l i s ä p a l k k i o o n + l i s ä p a l k k i o s t a + l i s ä p a l k k i o t a + l i s ä p a l v e l u + l i s ä p a l v e l u i d e n + l i s ä p a l v e l u i s t a + l i s ä p a l v e l u i t a + l i s ä p a l v e l u j a + l i s ä p a n o k s e n a + l i s ä p a n o s + l i s ä p a n o s t u k s e l l a + l i s ä p a n o s t u k s e t + l i s ä p a n o s t u k s i a + l i s ä p a n o s t u s + l i s ä p a n o s t u s t a + l i s ä p a r a n n u k s e t + l i s ä p a r a n n u k s i a + l i s ä p a r a n n u k s i i n + l i s ä p a r a n n u k s i n + l i s ä p a r a n n u k s i s t a + l i s ä p a r a n n u s t a + l i s ä p a r a n n u s t e n + l i s ä p a t e n t t i s u o j a n + l i s ä p e i l i e n + l i s ä p e l o t t e i n a + l i s ä p e r s p e k t i i v i + l i s ä p e r u s t e + l i s ä p e r u s t e e n + l i s ä p e r u s t e i d e n + l i s ä p e r u s t e i t a + l i s ä p e r u s t e l u + l i s ä p e r u s t e l u j a + l i s ä p e t t y m y k s e t + l i s ä p i i r t e i n + l i s ä p i l a a n t u m i n e n + l i s ä p i l a a n t u m i s e n + l i s ä p i s t e i d e n + l i s ä p o h d i n n a n + l i s ä p o h d i n t a + l i s ä p o h d i n t a a + l i s ä p o i k k e u k s e t + l i s ä p o i k k e u k s i i n + l i s ä p o i k k e u s t e n + l i s ä p o l t t o a i n e s ä i l i ö + l i s ä p o l t t o a i n e t t a + l i s ä p o n n e n + l i s ä p o n n i s t e l u i h i n + l i s ä p o n n i s t e l u j a + l i s ä p o n n i s t e l u j e n + l i s ä p o n n i s t e l u t + l i s ä p o n n i s t u k s i a + l i s ä p o n n i s t u k s i i n + l i s ä p o n n i s t u s + l i s ä p o n t t a + l i s ä p r o p a g a n d a a n + l i s ä p r o s e n t i n + l i s ä p r o s e n t t i + l i s ä p u h d i n + l i s ä p u h e e n v u o r o n i + l i s ä p u h e e n v u o r o o n + l i s ä p u h t i a + l i s ä p u r k a m i s t a + l i s ä p y y n t ö j ä + l i s ä p ä i v i ä + l i s ä p ä i v ä + l i s ä p ä i v ä n + l i s ä p ä t e v y y d e n + l i s ä p ä ä o m a a + l i s ä p ä ä o m a k u l u t + l i s ä p ä ä o m a n + l i s ä p ä ä s t ö i l l ä + l i s ä p ä ä s t ö i s t ä + l i s ä p ä ä t e l m i ä + l i s ä p ä ä t ö k s i ä + l i s ä p ä ä t ö s l a u s e l m i a + l i s ä p ö y t ä k i r j a + l i s ä p ö y t ä k i r j a a + l i s ä p ö y t ä k i r j a a n + l i s ä p ö y t ä k i r j a h a n k k e e n + l i s ä p ö y t ä k i r j a n + l i s ä p ö y t ä k i r j a s s a + l i s ä p ö y t ä k i r j a s t a + l i s ä p ö y t ä k i r j a t + l i s ä p ö y t ä k i r j o i h i n + l i s ä p ö y t ä k i r j o i l l a + l i s ä p ö y t ä k i r j o i s s a + l i s ä p ö y t ä k i r j o i s t a + l i s ä p ö y t ä k i r j o j a + l i s ä p ö y t ä k i r j o j e n + l i s ä r a h a + l i s ä r a h a a + l i s ä r a h a l l a + l i s ä r a h a n + l i s ä r a h a s t o + l i s ä r a h a s t o a + l i s ä r a h a s t o n + l i s ä r a h a s t o o n + l i s ä r a h a s t o s t a + l i s ä r a h o i s t a + l i s ä r a h o i t t a m i s t a + l i s ä r a h o i t u k s e e n + l i s ä r a h o i t u k s e l l a + l i s ä r a h o i t u k s e n + l i s ä r a h o i t u k s e n a + l i s ä r a h o i t u k s e s t a + l i s ä r a h o i t u s + l i s ä r a h o i t u s a p u a + l i s ä r a h o i t u s a v u n + l i s ä r a h o i t u s j ä r j e s t e l m i e n + l i s ä r a h o i t u s m a h d o l l i s u u k s i a + l i s ä r a h o i t u s o s u u d e n + l i s ä r a h o i t u s p a i n e i d e n + l i s ä r a h o i t u s p y y n t ö + l i s ä r a h o i t u s t a + l i s ä r a h o i t u s t a r p e e n + l i s ä r a h o i t u s t a r p e i s i i n + l i s ä r a h o i t u s t a r v e + l i s ä r a h o i t u s t u e n + l i s ä r a h o i t u s t u k i + l i s ä r a h o i t u s v a a t i m u k s e t + l i s ä r a h o j a + l i s ä r a h o j e n + l i s ä r a j o i t t e i l l a + l i s ä r a j o i t t e i t a + l i s ä r a j o i t u k s e n a + l i s ä r a j o i t u k s e t + l i s ä r a j o i t u k s i a + l i s ä r a j o i t u k s i i n + l i s ä r a j o i t u k s i s t a + l i s ä r a j o i t u s + l i s ä r a j o i t u s t e n + l i s ä r a k e n n u k s e n + l i s ä r a k e n t a m i s e e n + l i s ä r a k e n t a m i s e n + l i s ä r a k e n t a m i s t a + l i s ä r a p o r t t e j a + l i s ä r a p o r t t i + l i s ä r a s i t e t t a + l i s ä r a s i t t e e t + l i s ä r a s i t t e i t a + l i s ä r a s i t u k s i a + l i s ä r a s i t u s t a + l i s ä r a t k a i s u j a + l i s ä r a v i n t e i d e n + l i s ä r a v i n t e i k s i + l i s ä r a v i n t o a i n e + l i s ä r a v i n t o t a r p e e t + l i s ä r e h u n + l i s ä r e s u r s s e i n + l i s ä r e s u r s s e i s t a + l i s ä r e s u r s s e j a + l i s ä r e s u r s s i + l i s ä r e s u r s s i e n + l i s ä r e s u r s s i t + l i s ä r e s u r s s i t a r p e e n + l i s ä r i k k a u s + l i s ä r i s k e i l l e + l i s ä r i s k e j ä + l i s ä r i s k i + l i s ä r i s k i n + l i s ä r i s k i t + l i s ä r i s t i r i i t o j a + l i s ä r o h k a i s u + l i s ä r o h k e u t t a + l i s ä r u o a n + l i s ä r y h m i s t ä + l i s ä s a a l i i d e n + l i s ä s a a l i i s i i n + l i s ä s a a s t u m i s e n + l i s ä s a a v u t u k s i a + l i s ä s a n k t i o i d e n + l i s ä s a n k t i o i t a + l i s ä s e i k k a + l i s ä s e i k k o j a + l i s ä s e k a a n n u s t a + l i s ä s e k t o r i l l a + l i s ä s e k u n t i a + l i s ä s e l i t y k s i ä + l i s ä s e l i t y s t ä + l i s ä s e l o s t u k s e n + l i s ä s e l v e n n y k s e t + l i s ä s e l v e n n y k s i i n + l i s ä s e l v e n n y k s i ä + l i s ä s e l v e n n y s t ä + l i s ä s e l v i t y k s e n + l i s ä s e l v i t y k s e t + l i s ä s e l v i t y k s i ä + l i s ä s e l v i t y s + l i s ä s e l v i t y s t e n + l i s ä s e l v i t y s t ä + l i s ä s e l v y y t t ä + l i s ä s e m i n a a r e j a + l i s ä s e u r a a m u k s i a + l i s ä s e u r a a m u s + l i s ä s e u r a n n a n + l i s ä s e u r a n t a a + l i s ä s e u r a n t a s ä ä n n ö k s e t + l i s ä s e u r a u k s e n a + l i s ä s e u r a u k s e t + l i s ä s e u r a u k s i s t a + l i s ä s i + l i s ä s i i r t y m ä a j a n + l i s ä s i j o i t u s t e n + l i s ä s i t o u m u k s e t + l i s ä s i t o u m u k s i a + l i s ä s i t o u m u k s i s t a + l i s ä s i v u + l i s ä s o p i m u k s i a + l i s ä s o p i m u k s i l l a + l i s ä s o p i m u k s i s t a + l i s ä s o p i m u s + l i s ä s u m m a + l i s ä s u m m a a + l i s ä s u m m a n + l i s ä s u m m i a + l i s ä s u o j a + l i s ä s u o j a a + l i s ä s u o j a l a u s e k e t t a + l i s ä s u o j a l a u s e k k e e n + l i s ä s u o j a n + l i s ä s u o j a t o d i s t u k s e l l a + l i s ä s u o j a t o d i s t u k s e l l e + l i s ä s u o j a t o d i s t u k s e n + l i s ä s u o j a t o d i s t u k s e s t a + l i s ä s u o j a t o d i s t u s + l i s ä s u o j a t o i m i + l i s ä s u o j a t o i m i e n + l i s ä s u o j a t o i m i s t a + l i s ä s u o j e l u a + l i s ä s u o r i t t e i t a + l i s ä s u o r i t u k s i i n + l i s ä s u u n n i t e l m a n + l i s ä s u u n n i t e l m i a + l i s ä s u u n t a v i i v o i s t a + l i s ä s y i t ä + l i s ä s y n e r g i a a + l i s ä s y s ä y k s e n + l i s ä s y s ä y s + l i s ä s y y + l i s ä s y y n + l i s ä s y y n ä + l i s ä s ä h k ö l i n j o j e n + l i s ä s ä i l i ö i t ä + l i s ä s ä ä d ö k s i ä + l i s ä s ä ä n n ö i l l ä + l i s ä s ä ä n n ö i s t ä + l i s ä s ä ä n n ö k s e t + l i s ä s ä ä n n ö k s i s t ä + l i s ä s ä ä n n ö k s i ä + l i s ä s ä ä n n ö s t e l y + l i s ä s ä ä n n ö s t e n + l i s ä s ä ä n n ö t + l i s ä s ä ä n t e l y + l i s ä s ä ä n t e l y j e n + l i s ä s ä ä n t e l y s t ä + l i s ä s ä ä n t e l y ä + l i s ä s ä ä n t ö j ä + l i s ä s ä ä s t ö i h i n + l i s ä s ä ä s t ö j ä + l i s ä s ä ä s t ö t o i m i e n + l i s ä s ä ä t e l y l l e + l i s ä s ä ä t e l y s t ä + l i s ä t a a j u u k s i a + l i s ä t a a j u u k s i e n + l i s ä t a a k a n + l i s ä t a a k a s t a + l i s ä t a a k k a + l i s ä t a a k k a a + l i s ä t a e + l i s ä t a e t t a + l i s ä t a k e e t + l i s ä t a k e i d e n + l i s ä t a k e i s i i n + l i s ä t a k e i s t a + l i s ä t a k e i t a + l i s ä t a k u i d e n + l i s ä t a k u i s i i n + l i s ä t a k u i t a + l i s ä t a k u u + l i s ä t a k u u n + l i s ä t a k u u t + l i s ä t a l o u s a p u a + l i s ä t a l o u s a r v i o + l i s ä t a l o u s a r v i o e h d o t u s + l i s ä t a l o u s a r v i o e s i t y k s e e n + l i s ä t a l o u s a r v i o e s i t y k s e n + l i s ä t a l o u s a r v i o e s i t y k s e s t ä + l i s ä t a l o u s a r v i o e s i t y k s i ä + l i s ä t a l o u s a r v i o e s i t y s + l i s ä t a l o u s a r v i o e s i t y s t ä + l i s ä t a l o u s a r v i o i d e n + l i s ä t a l o u s a r v i o i h i n + l i s ä t a l o u s a r v i o i s t a + l i s ä t a l o u s a r v i o i t a + l i s ä t a l o u s a r v i o k s i + l i s ä t a l o u s a r v i o l l a + l i s ä t a l o u s a r v i o l l e + l i s ä t a l o u s a r v i o m e n e t t e l y + l i s ä t a l o u s a r v i o m e n e t t e l y l l ä + l i s ä t a l o u s a r v i o n + l i s ä t a l o u s a r v i o o n + l i s ä t a l o u s a r v i o s s a + l i s ä t a l o u s a r v i o s t a + l i s ä t a l o u s a r v i o t + l i s ä t a l o u s a r v i o t a + l i s ä t a p a a m i s i a + l i s ä t a p p i o i t a + l i s ä t a r i f f i k i i n t i ö + l i s ä t a r i f f i k i i n t i ö t ä + l i s ä t a r k a s t e l u a + l i s ä t a r k a s t e l u j a + l i s ä t a r k a s t u k s e t + l i s ä t a r k a s t u s t e n + l i s ä t a r k e n n u k s e n + l i s ä t a r k e n n u k s i a + l i s ä t a r k e n n u s t a + l i s ä t a r k i s t u k s e e n + l i s ä t a r k i s t u k s e n + l i s ä t a r k i s t u k s e n a + l i s ä t a r k i s t u k s e s s a + l i s ä t a r k i s t u k s e s t a + l i s ä t a r k i s t u k s e t + l i s ä t a r k i s t u k s i a + l i s ä t a r k i s t u k s i a n i + l i s ä t a r k i s t u k s i i n + l i s ä t a r k i s t u k s i l l a + l i s ä t a r k i s t u k s i n a + l i s ä t a r k i s t u k s i n e e n + l i s ä t a r k i s t u k s i s s a + l i s ä t a r k i s t u k s i s t a + l i s ä t a r k i s t u s + l i s ä t a r k i s t u s t a + l i s ä t a r k i s t u s t e n + l i s ä t a r p e e n + l i s ä t a r p e e t + l i s ä t a r p e i s t a + l i s ä t a r p e i t a + l i s ä t a r t u n n a n + l i s ä t a r v e + l i s ä t a v o i t e + l i s ä t a v o i t t e e k s i + l i s ä t a v o i t t e e n + l i s ä t a v o i t t e e n a + l i s ä t a v o i t t e i t a + l i s ä t e h o a + l i s ä t e h t ä v i e n + l i s ä t e h t ä v i s t ä + l i s ä t e h t ä v i ä + l i s ä t e h t ä v ä n + l i s ä t e h t ä v ä n ä + l i s ä t e h t ä v ä t + l i s ä t e k i j ä + l i s ä t e k i j ä t + l i s ä t e k i j ä ä + l i s ä t e k i j ö i s t ä + l i s ä t e k i j ö i t ä + l i s ä t e k s t i l l ä + l i s ä t e n + l i s ä t e s s ä ä n + l i s ä t e s t e j ä + l i s ä t e s t i e n + l i s ä t e u r a s t u s o h j e l m a a + l i s ä t i e d o i l l a + l i s ä t i e d o i n + l i s ä t i e d o i s t a + l i s ä t i e d o n + l i s ä t i e d o s t a + l i s ä t i e d o t + l i s ä t i e d o t u s t a + l i s ä t i e d u s t e l u j a + l i s ä t i e t o + l i s ä t i e t o a + l i s ä t i e t o i h i n + l i s ä t i e t o j a + l i s ä t i e t o j e n + l i s ä t i e t o o n + l i s ä t i l a a + l i s ä t i l a n + l i s ä t i l a n n e k a t s a u k s e s t a + l i s ä t i l a s t o j a + l i s ä t i u k e n n u k s e t + l i s ä t i u k e n n u s + l i s ä t k ä ä m m e + l i s ä t o d i s t e + l i s ä t o d i s t e e n a + l i s ä t o d i s t e e t + l i s ä t o d i s t e i l l a + l i s ä t o d i s t e i t a + l i s ä t o i m e a + l i s ä t o i m e l i a i s u u t t a + l i s ä t o i m e m m e + l i s ä t o i m e n a + l i s ä t o i m e n p i d e + l i s ä t o i m e n p i d e p a k e t t i a + l i s ä t o i m e n p i t e e n ä + l i s ä t o i m e n p i t e e s e e n + l i s ä t o i m e n p i t e e s t ä + l i s ä t o i m e n p i t e e t + l i s ä t o i m e n p i t e i d e n + l i s ä t o i m e n p i t e i d e n s ä + l i s ä t o i m e n p i t e i k s i + l i s ä t o i m e n p i t e i l l ä + l i s ä t o i m e n p i t e i n + l i s ä t o i m e n p i t e i s i i n + l i s ä t o i m e n p i t e i s t ä + l i s ä t o i m e n p i t e i t ä + l i s ä t o i m e t + l i s ä t o i m i + l i s ä t o i m i a + l i s ä t o i m i e n + l i s ä t o i m i i n + l i s ä t o i m i l l a + l i s ä t o i m i l l e + l i s ä t o i m i n + l i s ä t o i m i n t a a + l i s ä t o i m i n t a a n + l i s ä t o i m i n t a s u u n n i t e l m a + l i s ä t o i m i s s a + l i s ä t o i m i s t a + l i s ä t o i m i t u k s e s t a + l i s ä t o i m i t u k s i a + l i s ä t o i m i v a l t u u k s i a + l i s ä t o i v e e t + l i s ä t o i v o a + l i s ä t o n n i + l i s ä t o n n i a + l i s ä t t i i n + l i s ä t t y + l i s ä t t y ä + l i s ä t t ä i s i i n + l i s ä t t ä k ö ö n + l i s ä t t ä v ä ä + l i s ä t u e n + l i s ä t u e s t a + l i s ä t u h o j e n + l i s ä t u h o t + l i s ä t u k e a + l i s ä t u k e e n + l i s ä t u k e m i s e k s i + l i s ä t u k e m m e + l i s ä t u k e n a + l i s ä t u k i + l i s ä t u k i a + l i s ä t u k i e n + l i s ä t u k i i n + l i s ä t u k i m u o t o j a + l i s ä t u l k i n t o j a + l i s ä t u l l e i t t a + l i s ä t u l l e j a + l i s ä t u l l i e n + l i s ä t u l l i e t u u k s i s t a + l i s ä t u l l i e t u u s j ä r j e s t e l m ä ä + l i s ä t u l l i m a k s u i s t a + l i s ä t u l l i t + l i s ä t u l o a + l i s ä t u l o i h i n + l i s ä t u l o i l l a + l i s ä t u l o i s t a + l i s ä t u l o j a + l i s ä t u l o j e n + l i s ä t u l o k s i + l i s ä t u l o k s i a + l i s ä t u l o n + l i s ä t u l o n l ä h d e + l i s ä t u l o s t e n + l i s ä t u l o t + l i s ä t u l o v i r r o i s t a + l i s ä t u n n e i l t a + l i s ä t u n n u s t u s + l i s ä t u o m i o t + l i s ä t u o n n i l l e + l i s ä t u o n n i n + l i s ä t u o t a n n o n + l i s ä t u o t o t + l i s ä t u o t t e i s i i n + l i s ä t u r v a + l i s ä t u r v a a + l i s ä t u r v a a n + l i s ä t u r v a l a u s e k k e i t a + l i s ä t u r v a l l i s u u t t a + l i s ä t u r v a n + l i s ä t u r v a s t a + l i s ä t u r v a t o i m e n p i t e i d e n + l i s ä t u r v a t o i m i a + l i s ä t u r v a t o i m i s t a + l i s ä t u t k i m u k s e e n + l i s ä t u t k i m u k s e l l a + l i s ä t u t k i m u k s e n + l i s ä t u t k i m u k s e t + l i s ä t u t k i m u k s i a + l i s ä t u t k i m u k s i e n + l i s ä t u t k i m u k s i i n + l i s ä t u t k i m u k s i l l a + l i s ä t u t k i m u k s i s s a a n + l i s ä t u t k i m u s + l i s ä t u t k i m u s o h j e l m a s t a + l i s ä t u t k i m u s t a + l i s ä t u t k i m u s t e n + l i s ä t u t k i n t o j e n + l i s ä t y n + l i s ä t y ö + l i s ä t y ö k a l u n + l i s ä t y ö l l e + l i s ä t y ö l l i s t ä m i s e s t ä + l i s ä t y ö l l ä + l i s ä t y ö n + l i s ä t y ö n t e k i j ä n + l i s ä t y ö n t e k i j ä s t ä + l i s ä t y ö n t e k i j ö i d e n + l i s ä t y ö p a i k a t + l i s ä t y ö p a i k k a + l i s ä t y ö p a i k k a a + l i s ä t y ö p a i k k o i h i n + l i s ä t y ö p a i k k o j a + l i s ä t y ö p a i k k o j e n + l i s ä t y ö s k e n t e l y l l e + l i s ä t y ö s t ä + l i s ä t y ö t t ö m y y t t ä + l i s ä t y ö t u n n e i s t a + l i s ä t y ö t ä + l i s ä t y ö v o i m a n + l i s ä t ä + l i s ä t ä k s e e n + l i s ä t ä k s e m m e + l i s ä t ä s m e n n y k s e t + l i s ä t ä y s i s t u n t o j a + l i s ä t ä ä n + l i s ä t ä ä n k ö + l i s ä t ö i s t ä + l i s ä t ö i t ä + l i s ä u h k a t + l i s ä u h k i a + l i s ä u h r a u k s i a + l i s ä u h r a u k s i i n + l i s ä u h r e j a + l i s ä u l o t t u v u u d e l t a + l i s ä u l o t t u v u u s + l i s ä u l o t t u v u u t e e n + l i s ä u u d i s t u k s e t + l i s ä u u d i s t u k s e t k i n + l i s ä u u d i s t u k s i a + l i s ä u u d i s t u k s i i n + l i s ä u u d i s t u k s i l l e + l i s ä u u d i s t u s t a + l i s ä v a a l e i l l a + l i s ä v a a t i m u k s e n a + l i s ä v a a t i m u k s e n s a + l i s ä v a a t i m u k s e t + l i s ä v a a t i m u k s i a + l i s ä v a a t i m u k s i a m m e + l i s ä v a a t i m u k s i e n + l i s ä v a a t i m u k s i l t a + l i s ä v a a t i m u k s i s t a + l i s ä v a a t i m u k s i t t a + l i s ä v a a t i m u s + l i s ä v a a t i m u s t e n + l i s ä v a h i n k o a + l i s ä v a h i n k o j a + l i s ä v a h i n k o j e n + l i s ä v a h v i s t u s t a + l i s ä v a i h e + l i s ä v a i h t o e h t o + l i s ä v a i h t o e h t o j a + l i s ä v a i h t o e h t o j e n + l i s ä v a i k e u k s i a + l i s ä v a i k e u k s i i n + l i s ä v a i k u t u s + l i s ä v a i k u t u s t a + l i s ä v a i k u t u s v a l t a a + l i s ä v a j e e n + l i s ä v a k a u d e n + l i s ä v a k u u d e k s i + l i s ä v a k u u d e n + l i s ä v a k u u d e t + l i s ä v a k u u k s i a + l i s ä v a k u u s j ä r j e s t e l m ä s t ä + l i s ä v a k u u s v a a t i m u k s i s t a + l i s ä v a k u u t t e l u t + l i s ä v a k u u t u k s e l l e + l i s ä v a k u u t u k s e n + l i s ä v a k u u t u k s e s t a + l i s ä v a k u u t u k s e t + l i s ä v a k u u t u s t e n + l i s ä v a l a i s t u s t a + l i s ä v a l i n t a k r i t e e r i n ä + l i s ä v a l m i s t e l u s s a + l i s ä v a l t a + l i s ä v a l t a a n s a + l i s ä v a l t u u d e t + l i s ä v a l t u u k s i a + l i s ä v a l t u u k s i e n + l i s ä v a l t u u t u s + l i s ä v a l v o n n a s t a + l i s ä v a l v o n t a + l i s ä v a l v o n t a a + l i s ä v a l v o n t a a n + l i s ä v a l v o n t a t o i m e n p i t e i t ä + l i s ä v a l v o n t a t o i m i a + l i s ä v a p a u t t a m i n e n + l i s ä v a p a u t t a m i s e e n + l i s ä v a p a u t t a m i s t a + l i s ä v a r a t + l i s ä v a r a u s + l i s ä v a r a u s t a + l i s ä v a r m u u t t a + l i s ä v a r o i l l a + l i s ä v a r o i s t a + l i s ä v a r o j a + l i s ä v a r o j e n + l i s ä v a r o t o i m i e n + l i s ä v a r o v a i s u u s t o i m e n p i t e i n ä + l i s ä v a r u s t e + l i s ä v a r u s t e e t + l i s ä v a r u s t e i d e n + l i s ä v a r u s t e i t a + l i s ä v a r u s t e l u u n + l i s ä v a r u s t e v a l m i s t a j i e n + l i s ä v a s t a u k s e l l e + l i s ä v a s t a u k s e s s a + l i s ä v a s t a u k s e s t a + l i s ä v a s t a u s t a + l i s ä v a s t u u + l i s ä v a s t u u t a + l i s ä v a s t u u v e l v o l l i s u u t t a + l i s ä v a u h t i a + l i s ä v a u r i o i d e n + l i s ä v a u r i o i l t a + l i s ä v e l k a + l i s ä v e l k a a + l i s ä v e l k a a n t u m i s e l l e + l i s ä v e l k a a n t u m i s t a + l i s ä v e l k o i h i n + l i s ä v e l v o i t e + l i s ä v e l v o i t e t t a + l i s ä v e l v o i t t e e t + l i s ä v e l v o i t t e i d e n + l i s ä v e l v o i t t e i l l a + l i s ä v e l v o i t t e i s i i n + l i s ä v e l v o i t t e i t a + l i s ä v e l v o l l i s u u k s i a + l i s ä v e l v o l l i s u u k s i e n + l i s ä v e r o + l i s ä v e r o a + l i s ä v e r o i h i n + l i s ä v e r o i l l a + l i s ä v e r o i l l e + l i s ä v e r o i s t a + l i s ä v e r o j a + l i s ä v e r o n + l i s ä v e r o s t a + l i s ä v e r o t + l i s ä v e r o t a a k a s t a + l i s ä v e r o t a a k k o i h i n + l i s ä v e r o t u s t a + l i s ä v e r o v ä h e n n y k s e t + l i s ä v e r t a i s a r v i o i n t i a + l i s ä v e t o o m u k s e n + l i s ä v e t o o m u s t e n + l i s ä v i e n n i s t ä + l i s ä v i i k k o + l i s ä v i i k o l t a + l i s ä v i i v e e t + l i s ä v i i v y t t e l y + l i s ä v i i v y t t e l y l l e + l i s ä v i i v y t y k s e t + l i s ä v i i v y t y k s i i n + l i s ä v i i v y t y k s i l l e + l i s ä v i i v y t y k s i s t ä + l i s ä v i i v y t y k s i ä + l i s ä v i i v y t y s + l i s ä v i i v y t y s t ä + l i s ä v i i v ä s t y k s e e n + l i s ä v i i v ä s t y k s e t + l i s ä v i i v ä s t y k s i ä + l i s ä v i i v ä s t y s t e n + l i s ä v i r a t + l i s ä v i r i k k e i t ä + l i s ä v i r k a a + l i s ä v i r k o j a + l i s ä v i r k o j e n + l i s ä v i t a m i i n e j a + l i s ä v o i m a a + l i s ä v o i m a v a r o i s t a + l i s ä v o i m a v a r o j a + l i s ä v o i m i a + l i s ä v o i m i e n + l i s ä v o i t o i s t a + l i s ä v o i t t o i h i n + l i s ä v o i t t o j a + l i s ä v o i t t o j e n + l i s ä v u o d e l l a + l i s ä v u o d e n + l i s ä v u o d e s t a + l i s ä v u o s i + l i s ä v u o s i a + l i s ä v u o s i s t a + l i s ä v u o t t a + l i s ä v y ö t ä + l i s ä v ä h e n n y k s e s t ä + l i s ä v ä h e n n y k s i s t ä + l i s ä v ä h e n n y k s i ä + l i s ä v ä h e n n y s + l i s ä v ä h e n n y s t ä + l i s ä v ä h e n t ä m i s e e n + l i s ä v ä h e n t ä m i s e l l e + l i s ä v ä l i n e + l i s ä v ä l i n e e n + l i s ä v ä l i n e e n ä + l i s ä v ä l i n e e s e e n + l i s ä v ä l i n e i d e n + l i s ä v ä l i n e i l l ä + l i s ä v ä l i n e i t ä + l i s ä v ä l i n e t t ä + l i s ä v ä ä r i s t y m ä t + l i s ä y d i n v o i m a l l e + l i s ä y d i n v o i m a n + l i s ä y h t e i s t y ö + l i s ä y h t e i s t y ö h ö n + l i s ä y h t e i s t y ö l l e + l i s ä y h t e i s t y ö s t ä + l i s ä y h t e i s t y ö t ä + l i s ä y h t e y k s i e n + l i s ä y k s e k s i + l i s ä y k s e n + l i s ä y k s e s t ä + l i s ä y k s e t + l i s ä y k s i l l ä + l i s ä y k s i s s ä + l i s ä y k s i t t ä + l i s ä y k s i t y i s k o h t i e n + l i s ä y k s i t y i s t ä m i n e n + l i s ä y k s i ä + l i s ä y l i j ä ä m ä ä n + l i s ä y s a i n e i s t o + l i s ä y s a i n e i s t o a + l i s ä y s a i n e i s t o n + l i s ä y s e h d o t u s + l i s ä y s e s i t y k s e n i + l i s ä y s l a j i t t e l u + l i s ä y s p a k e t i s t a + l i s ä y s p e r i a a t e t t a + l i s ä y s t a r v e + l i s ä y s t ä + l i s ä ä m i n e n k ä ä n + l i s ä ä m i s e e n + l i s ä ä m i s e k s i + l i s ä ä m i s e l l e + l i s ä ä m i s e l l ä + l i s ä ä m i s e n + l i s ä ä m i s e s s ä + l i s ä ä m i s e s t ä + l i s ä ä m i s k a n n u s t i m i e n + l i s ä ä m i s k r i t e e r i e n + l i s ä ä m i s m ä ä r ä + l i s ä ä m i s p y y n t ö + l i s ä ä m i s p y y n t ö j ä + l i s ä ä m i s t o i m i a + l i s ä ä m i s t ä + l i s ä ä m m e + l i s ä ä m m e k ö + l i s ä ä m ä l l ä + l i s ä ä m ä n + l i s ä ä m ä s s ä + l i s ä ä m ä s t ä + l i s ä ä m ä t t ä + l i s ä ä m ä ä n + l i s ä ä n k i n + l i s ä ä n t y e s s ä + l i s ä ä n t y i + l i s ä ä n t y i s i + l i s ä ä n t y i s i v ä t + l i s ä ä n t y m i s a i k a n a + l i s ä ä n t y m i s a i n e i s t o + l i s ä ä n t y m i s a i n e i s t o n + l i s ä ä n t y m i s a l u e i l l a + l i s ä ä n t y m i s a l u e i l l e e n + l i s ä ä n t y m i s a l u e i t a + l i s ä ä n t y m i s a l u e t t a + l i s ä ä n t y m i s e e n + l i s ä ä n t y m i s e l i m i ä + l i s ä ä n t y m i s e l l e + l i s ä ä n t y m i s e l l ä + l i s ä ä n t y m i s e l ä m ä n s ä + l i s ä ä n t y m i s e n + l i s ä ä n t y m i s e n ä + l i s ä ä n t y m i s e s s ä + l i s ä ä n t y m i s e s t ä + l i s ä ä n t y m i s i k ä ä + l i s ä ä n t y m i s i ä n + l i s ä ä n t y m i s i ä s s ä + l i s ä ä n t y m i s j ä r j e s t e l m ä l l e + l i s ä ä n t y m i s j ä r j e s t e l m ä n + l i s ä ä n t y m i s j ä r j e s t e l m ä ä n + l i s ä ä n t y m i s k i e r r o n + l i s ä ä n t y m i s k i e r t o a + l i s ä ä n t y m i s k l o o n a u s + l i s ä ä n t y m i s k l o o n a u s t a k a a n + l i s ä ä n t y m i s k y k y + l i s ä ä n t y m i s k y k y i s i ä + l i s ä ä n t y m i s k y k y y n + l i s ä ä n t y m i s k y k y ä + l i s ä ä n t y m i s k y v y n + l i s ä ä n t y m i s k y v y s s ä + l i s ä ä n t y m i s k ä y t t ä y t y m i s e e n s ä + l i s ä ä n t y m i s k ä y t t ä y t y m i s e s t ä + l i s ä ä n t y m i s l ä ä k e t i e t e e s t ä + l i s ä ä n t y m i s m e n e t e l m ä + l i s ä ä n t y m i s m y r k y l l i s e t + l i s ä ä n t y m i s o i k e u d e s t a + l i s ä ä n t y m i s o i k e u d e t + l i s ä ä n t y m i s o i k e u k s i a + l i s ä ä n t y m i s o i k e u k s i a a n + l i s ä ä n t y m i s o i k e u k s i e n + l i s ä ä n t y m i s o i k e u k s i e n s a + l i s ä ä n t y m i s o i k e u k s i i n + l i s ä ä n t y m i s o i k e u k s i i n s a + l i s ä ä n t y m i s o i k e u k s i l l e + l i s ä ä n t y m i s o i k e u k s i s t a + l i s ä ä n t y m i s o i k e u k s i s t a a n + l i s ä ä n t y m i s o i k e u s + l i s ä ä n t y m i s o i k e u t t a + l i s ä ä n t y m i s p a i k k o j e n + l i s ä ä n t y m i s t a r k o i t u k s e e n + l i s ä ä n t y m i s t a r k o i t u k s e s s a + l i s ä ä n t y m i s t a r k o i t u k s i i n + l i s ä ä n t y m i s t a r k o i t u k s i s s a + l i s ä ä n t y m i s t a v o i t t e e n s a + l i s ä ä n t y m i s t a v o i t t e i s e e n + l i s ä ä n t y m i s t a v o i t t e i s e s t a + l i s ä ä n t y m i s t e k n i i k k a a + l i s ä ä n t y m i s t e k n i i k o i l l a + l i s ä ä n t y m i s t e r v e y d e l l e + l i s ä ä n t y m i s t e r v e y d e l l i s e t + l i s ä ä n t y m i s t e r v e y d e l l ä + l i s ä ä n t y m i s t e r v e y d e n + l i s ä ä n t y m i s t e r v e y d e n h o i d o n + l i s ä ä n t y m i s t e r v e y d e n h o i t o a + l i s ä ä n t y m i s t e r v e y d e n h o i t o o n + l i s ä ä n t y m i s t e r v e y d e n h u o l l o l l e + l i s ä ä n t y m i s t e r v e y d e n h u o l l o n + l i s ä ä n t y m i s t e r v e y d e n h u o l l o s s a + l i s ä ä n t y m i s t e r v e y d e n h u o l l o s t a + l i s ä ä n t y m i s t e r v e y d e n h u o l t o + l i s ä ä n t y m i s t e r v e y d e n h u o l t o a + l i s ä ä n t y m i s t e r v e y d e n h u o l t o o n + l i s ä ä n t y m i s t e r v e y d e s s ä + l i s ä ä n t y m i s t e r v e y d e s t ä + l i s ä ä n t y m i s t e r v e y d e s t ä ä n + l i s ä ä n t y m i s t e r v e y s + l i s ä ä n t y m i s t e r v e y s a s i o i s s a + l i s ä ä n t y m i s t e r v e y s o h j e l m a a n + l i s ä ä n t y m i s t e r v e y s o h j e l m a l l e + l i s ä ä n t y m i s t e r v e y s o i k e u d e t + l i s ä ä n t y m i s t e r v e y s o i k e u k s i e n + l i s ä ä n t y m i s t e r v e y s o i k e u k s i s t a + l i s ä ä n t y m i s t e r v e y s p a l v e l u i d e n + l i s ä ä n t y m i s t e r v e y s p a l v e l u i t a + l i s ä ä n t y m i s t e r v e y s p a l v e l u j a + l i s ä ä n t y m i s t e r v e y s p a l v e l u j e n + l i s ä ä n t y m i s t e r v e y s p a l v e l u t + l i s ä ä n t y m i s t e r v e y s t a r v i k k e i s i i n + l i s ä ä n t y m i s t e r v e y s t a v o i t e t t a + l i s ä ä n t y m i s t e r v e y s v a l i s t u k s e n + l i s ä ä n t y m i s t e r v e y t e e n + l i s ä ä n t y m i s t e r v e y t e e n s ä + l i s ä ä n t y m i s t e r v e y t e n s ä + l i s ä ä n t y m i s t e r v e y t t ä + l i s ä ä n t y m i s t e r v e y t t ä ä n + l i s ä ä n t y m i s t o i m i n t a a n + l i s ä ä n t y m i s t o k s i s i a + l i s ä ä n t y m i s t ä + l i s ä ä n t y m i s t ä ä n + l i s ä ä n t y m i s y m p ä r i s t ö j e n + l i s ä ä n t y m i s y m p ä r i s t ö j ä + l i s ä ä n t y m ä s s ä + l i s ä ä n t y m ä t t ö m y y s t e r v e y d e s t ä + l i s ä ä n t y m ä ä n + l i s ä ä n t y n e e n + l i s ä ä n t y n e e s t ä + l i s ä ä n t y n e e t + l i s ä ä n t y n e i d e n + l i s ä ä n t y n e i s i i n + l i s ä ä n t y n e i s t ä + l i s ä ä n t y n y t t ä + l i s ä ä n t y v i e n + l i s ä ä n t y v i i n + l i s ä ä n t y v i l l ä + l i s ä ä n t y v i s t ä + l i s ä ä n t y v i ä + l i s ä ä n t y v ä + l i s ä ä n t y v ä l l e + l i s ä ä n t y v ä n + l i s ä ä n t y v ä s s ä + l i s ä ä n t y v ä s t ä + l i s ä ä n t y v ä t + l i s ä ä n t y v ä ä + l i s ä ä n t y v ä ä n + l i s ä ä n t y y + l i s ä ä n t y y k i n + l i s ä ä n t y y k ö + l i s ä ä n t y ä + l i s ä ä v i e n + l i s ä ä v i ä + l i s ä ä v ä m m e + l i s ä ä v ä n + l i s ä ä v ä t + l i s ä ä v ä t k ö + l i t a n i a a + l i t i u m a l u m i i n i h y d r i d i + l i t i u m b r o m i d i + l i t i u m f l u o r i d i + l i t i u m h e k s a f l u o r o f o s f a a t t i + l i t i u m h y d r i d i + l i t i u m h y d r o k s i d i + l i t i u m i o n i a k k u + l i t i u m i o n i p a r i s t o + l i t i u m i o n i p a r i s t o j a + l i t i u m k a r b o n a a t t i + l i t i u m k l o r i d i + l i t i u m k o b o l t t i o k s i d i + l i t i u m o k s i d i + l i t i u m p e r k l o r a a t t i + l i t i u m p o l y m e e r i a k k u + l i t i u m s u l f a a t t i + l i t r a a + l i t r a h i n t a + l i t r a h i n t a a + l i t r a h i n t a a n + l i t r a h i n t o j e n + l i t r a l t a + l i t r a s s a + l i t r a s t a + l i t u l a u k k a + l i t u r u o h o + l i u k e n e e + l i u k k a a l l a + l i u k k a a l l e + l i u k k a a n + l i u k k a a s e e n + l i u k o i s u u s t u l o + l i u k u h i h n a + l i u k u h i h n a l t a + l i u k u k ä y t ä v ä + l i u k u l a a k e r i + l i u k u l u k u + l i u k u m a t + l i u k u m ä k i + l i u k u o v i + l i u k u r e n g a s t i i v i s t e + l i u k u v o i d e + l i u o t i n a i n e i t a + l i u o t i n p o h j a i s t e n + l i u o t t i m i e n + l i u s k a h y t y k k ä + l i u s k a k u r j e n p o l v i + l i u s k a l e h t i h ä r ä n s i l m ä + l i u s k a m e r i e t a n a + l i u s k a n o k k a s o r s a + l i u s k a p y r s t ö + l i u s k a r a u n i o i n e n + l i u s k a v a t u k k a + l i u s k e e n + l i u s k e h i i l e l l ä + l i u s k e k a a s u a + l i u s k e k a a s u e u f o r i a a n + l i u s k e k a a s u l l e + l i u s k e k a a s u n + l i u s k e k a a s u s t a + l i u s k e k a a s u t o i m i n n o i l l e + l i u s k e k a a s u u n + l i u s k e k i r j o r a s t a s + l i u s k e k y y h k y + l i u s k e l e p i n k ä i n e n + l i u s k e l e p i n k ä i s t y r a n n i + l i u s k e l i n t u h a u k k a + l i u s k e r a s t u l i + l i u s k e t a p a k u l o + l i u s k e t r o g o n i + l i u s k e ö l j y + l i u s k e ö l j y l l e + l i v e a l b u m i + l i v e r t ä j ä k e r t t u l i + l i v e r t ä j ä t a p a k u l o + l i v e r t ä j ä t y r a n n i + l o a n h e i t t o k a m p a n j a s t a + l o a n h e i t t o o n + l o a n h e i t t o p o l i t i i k a n + l o b a t a a n + l o b b a a j a n a + l o b b a a j a r y h m i e n + l o b b a a j a r y h m i ä + l o b b a a j a t + l o b b a a j i a + l o b b a a j i e n + l o b b a a j i l l a + l o b b a a j i n a + l o b b a i s i + l o b b a r i j ä r j e s t ö n + l o b b a r i t + l o b b a u k s e s t a + l o b b a u s j ä r j e s t ö i l t ä + l o b b a u s j ä r j e s t ö j e n + l o b b a u s j ä r j e s t ö j ä + l o b b a u s j ä r j e s t ö t + l o b b a u s k a m p a n j a n + l o b b a u s k e i n o j e m m e + l o b b a u s k y s y m y k s e e n + l o b b a u s k y s y m y k s e s t ä + l o b b a u s k y s y m y s + l o b b a u s m a h d o l l i s u u d e t + l o b b a u s m e n e t e l m ä ä + l o b b a u s r y h m i e n + l o b b a u s r y h m i i n + l o b b a u s r y h m i ä + l o b b a u s r y h m ä + l o b b a u s r y h m ä n + l o b b a u s r y h m ä t + l o b b a u s s u h t e e t + l o b b a u s s u u n n i t e l m a + l o b b a u s t a + l o b b a u s t a p a u k s e t + l o b b a u s t o i m e t + l o b b a u s t o i m i a + l o b b a u s t o i m i n t a + l o b b a u s t o i m i n t a a n + l o b b a u s y h t i ö i t ä ä n + l o g i i k a n + l o g i i k a s t a + l o g i i k k a a + l o g i i k k a a n + l o g i i k k a p i i r i p e r h e + l o g i i k k a s y n t e e s i + l o g i s t i i k a s s a + l o g i s t i i k a s t a + l o g i s t i i k k a h a n k k e e s t a + l o g i s t i i k k a i n f r a s t r u k t u u r i n + l o g i s t i i k k a j ä r j e s t e l m i e n + l o g i s t i i k k a j ä r j e s t e l m i i n + l o g i s t i i k k a j ä r j e s t e l m i ä + l o g i s t i i k k a j ä r j e s t e l m ä n + l o g i s t i i k k a j ä r j e s t e l m ä s t ä + l o g i s t i i k k a j ä r j e s t e l m ä t + l o g i s t i i k k a k e s k u k s e t + l o g i s t i i k k a k e t j u + l o g i s t i i k k a k e t j u j a + l o g i s t i i k k a k e t j u n + l o g i s t i i k k a k e t j u s s a + l o g i s t i i k k a k e t j u u n + l o g i s t i i k k a k o n e i s t o o n + l o g i s t i i k k a k u m p p a n u u t t a + l o g i s t i i k k a k u s t a n n u k s i a + l o g i s t i i k k a m a l l e j a + l o g i s t i i k k a m a r k k i n o i d e n + l o g i s t i i k k a m i e t i n t ö ö n + l o g i s t i i k k a o n g e l m i a + l o g i s t i i k k a o n g e l m i i n + l o g i s t i i k k a p a l v e l u j a + l o g i s t i i k k a r e s u r s s i t + l o g i s t i i k k a s e k t o r i a + l o g i s t i i k k a s e k t o r i l l a + l o g i s t i i k k a t u e n + l o g i s t i i k k a t u k e a + l o g i s t i i k k a y h t i ö i s s ä + l o g i s t i i k k a y r i t y k s e t + l o g i s t i s e n a + l o g i s t i s e s t i + l o g i s t i s e t + l o g i s t i s i a + l o g i s t i s t a + l o h d u l l i s t a + l o h d u t a k a a n + l o h d u t o n t a + l o h d u t t a a + l o h d u t t a i s i + l o h d u t t a u t u a + l o h d u t t o m a l t a + l o h d u t u s p a l k i n t o + l o h e n + l o h e n k a l a s t a j i e n + l o h e n k a l a s t u k s e s s a + l o h e n k a l a s t u s k i e l t o + l o h e n k a l a s t u s t a + l o h e n k a s v a t t a j i e n + l o h e n k a s v a t t a j i l l e + l o h e n n o u s u u n + l o h e n p o i k a s e t + l o h e n p o i k a s t u o t a n t o + l o h e n s y ö n n i n + l o h e n t u o t t a j a t + l o h e n t u o t t a j i l l e + l o h e n v i e j i e n + l o h e n v i l j e l i j ä t + l o h e n v i l j e l i j ö i d e n + l o h e n v i l j e l y + l o h e n v i l j e l y s e k t o r i n + l o h e n v i l j e l y s s ä + l o h e n v i l j e l y t e o l l i s u u s + l o h e n v i l j e l y t e o l l i s u u t e m m e + l o h e n v i l j e l y t e o l l i s u u t t a + l o h e n v i l j e l y ä + l o h e n v i l j e l y ä ä n + l o h i a + l o h i f a r m e j a + l o h i f i l e i d e n + l o h i j o e s s a + l o h i j o k i + l o h i k a n n a n + l o h i k a n t a a + l o h i k a n t o j a + l o h i k a n t o j e n + l o h i k y s y m y k s e e n + l o h i k ä ä r m e e n + l o h i k ä ä r m e e s i + l o h i k ä ä r m e i k s i + l o h i k ä ä r m e k e i s a r i n + l o h i k ä ä r m e m i e s + l o h i k ä ä r m e m u u n n e l m a + l o h i k ä ä r m e t a n s s i + l o h i l o i n e n + l o h i l o i s e n + l o h i m a r k k i n o i d e n + l o h i m a r k k i n o i l l a + l o h i o n g e l m a n + l o h i p o p u l a a t i o s t a + l o h i s a a l i s + l o h i s i e n i + l o h i t e o l l i s u u d e n + l o h i t e o l l i s u u d e s t a + l o h i t e o l l i s u u s + l o h i t e o l l i s u u t t a + l o h i t i l a l l a + l o h i t i l o j a + l o h i v i l j e l m i l t ä + l o h k o a + l o h k o i h i n + l o h k o i k s i + l o h k o i s s a + l o h k o j a + l o h k o j e n + l o h k o k a a v i o + l o h k o m a t r i i s i + l o h k o p e r u n a t + l o h k o t + l o h k o v a i h e + l o h k o v a i h e e s s a + l o h t u a + l o h t u n a i s i l l e + l o h t u n a i s i l t a + l o h t u n a i s i n a + l o h t u n a i s i s t a + l o h t u n a i s j ä r j e s t e l m ä + l o h t u n a i s j ä r j e s t e l m ä n + l o h t u n a i s j ä r j e s t e l m ä ä n + l o h t u n a i s t e n + l o i m m e + l o i m u v a s k i y ö k k ö n e n + l o i s k a s v i + l o i s k u t o j a + l o i s s o r s a + l o i s t a t t i + l o i s t a v a a + l o i s t a v a l l a + l o i s t a v a n + l o i s t a v a n a + l o i s t a v a s t a + l o i s t a v a t + l o i s t a v i a + l o i s t e h o + l o i s t e l a m p p u + l o i s t e p u t k i l a m p u t + l o i s t o a l u k s e l l a + l o i s t o a u t o t + l o i s t o b a r b i + l o i s t o e s i m e r k i l t ä + l o i s t o e s i m e r k k e j ä + l o i s t o e s i m e r k k i + l o i s t o h a r a k k a + l o i s t o h o t e l l e j a + l o i s t o k a i j a + l o i s t o k e i s a r i k a l a + l o i s t o k e l t a j ä k ä l ä + l o i s t o k e r t t u l i + l o i s t o k i p u a j a + l o i s t o k k a i m p a n a + l o i s t o k o t i n g a + l o i s t o k o t t a r a i n e n + l o i s t o k u l t a s i i p i + l o i s t o k ä ä p i ö a h v e n + l o i s t o l e p i n k ä i n e n + l o i s t o m e d u u s a + l o i s t o m u r s k a a j a p e i p p o + l o i s t o n ä r h i + l o i s t o p e i p o t + l o i s t o s a l a n g a a n i + l o i s t o s i i p i s i m p p u + l o i s t o s o l m i o k o l i b r i + l o i s t o v i u h k a k e r t t u l i + l o i s t u t k i m u s t e n + l o i s v a l t i o i h i n + l o i t o n t a a + l o i t o n t a j a h e r m o + l o i t t o n e e + l o i t t o n i v a t + l o i t t o r e n g a s + l o i v a t + l o i v e m p i i n + l o j a a l e i m p i a + l o j a a l i m p a a + l o j a a l i m p i a + l o j a a l i s u u d e s t a + l o j a a l i s u u s p e r i a a t t e e s e e n + l o j a a l i s u u s p e r i a a t t e i t a + l o j a a l i u d e s t a + l o j a a l i u s k o n f l i k t e j a + l o j a a l i u s o s i n k o + l o j a a l i u s v e l v o i t t e i t a + l o j a l i s t i p u o l e n + l o j a l i s t i t e r r o r i s t i t + l o j u u + l o k a a n + l o k a k a m p a n j a + l o k a k u i s e s s a + l o k a k u u h u n + l o k a k u u l l e + l o k a k u u n + l o k a k u u s s a + l o k a k u u s t a + l o k a k u u t a + l o k a m a r r a s k u u s s a + l o k i k i r j a r i k k o m u s + l o m a a + l o m a e d u t + l o m a h o t e l l e i l l e + l o m a i l e m m e + l o m a i l e v a t + l o m a i l i j o i t a + l o m a j a k s o + l o m a j ä r j e s t e l y i h i n s ä + l o m a j ä r j e s t e l y j e n + l o m a j ä r j e s t e l y j ä + l o m a k a u d e n + l o m a k a u d e t + l o m a k a u s i + l o m a k a u s i i n + l o m a k a u s i s t a + l o m a k a u t t a + l o m a k k e e m m e + l o m a k k e i d e n + l o m a k k e i t a + l o m a k l u b e i h i n + l o m a k l u b e j a + l o m a k l u b i e n + l o m a k l u b i s s a + l o m a k l u b i t + l o m a k l u b i y r i t y k s i ä + l o m a k o h d e + l o m a k o h t e e n + l o m a k o h t e e n a + l o m a k o h t e e n n e + l o m a k o h t e i d e n + l o m a k o h t e i s i i n + l o m a k o h t e i s s a m m e + l o m a k o h t e i s t a m m e + l o m a k u s t a n n u s t e n + l o m a k u u k a u d e t + l o m a k u u k a u s i a + l o m a l l e + l o m a m a h d o l l i s u u k s i a + l o m a m a t k a i l u n + l o m a m a t k a l l a + l o m a m a t k a n + l o m a m a t k a n s a + l o m a m a t k a o s t o i h i n + l o m a m a t k o i s t a n i + l o m a m a t k o j a a n + l o m a m a t k o j e n + l o m a m a t k u s t a j a t + l o m a m e n o i s t a + l o m a m ä ä r ä y k s i ä + l o m a n + l o m a n s a + l o m a n v i e t t o p a i k o i s t a n i + l o m a n v i e t t o s a a r i + l o m a n v i e t t ä j i s t ä + l o m a o i k e u k s i a + l o m a o i k e u s + l o m a o p i n t o j ä r j e s t e l m ä s t ä + l o m a o s a k e a l a n + l o m a p a k e t t e j a + l o m a p a k e t t i i n + l o m a p a r a t i i s i + l o m a p ä i v ä t + l o m a r a h a t + l o m a s u u n n i t e l m a t + l o m a t + l o m a t e o l l i s u u d e n + l o m a t e r a p i a a + l o m a t u n n e l m i s s a + l o m a t u o t t e e n + l o m a t u o t t e e t + l o m a t u o t t e i d e n + l o m a t u o t t e i l l e + l o m a t u o t t e i s i i n + l o m a t u o t t e i s t a + l o m a t u o t t e i t a + l o m a u t u s t e n + l o m i a + l o m i t t u m i n e n + l o m i t u s l a j i t t e l u + l o m p a k o i s s a + l o m p a k o s t a + l o n k e r o p o r n o + l o n k k a h e r m o + l o n k k a l e i k k a u k s e e n + l o n k k a l u u + l o n k k a n i v e l d y s p l a s i a + l o n k k a p r o t e e s i + l o n k k a p r o t e e s i l e i k k a u s t a + l o n t o o l a i s e n a + l o n t o o l a i s m i e s t ä + l o o g i s e e n + l o o g i s e l t a + l o o g i s e m m i n + l o o g i s e m p a a + l o o g i s e m p i + l o o g i s e n + l o o g i s e n a + l o o g i s e s s a + l o o g i s e t + l o o g i s i a + l o o g i s i m p a a n + l o o g i s i n + l o o g i s i n t a + l o o g i s t a + l o o t u s a s e n t o + l o o t u s k u k k a + l o p e t a m m e + l o p e t a n + l o p e t a n k i n + l o p e t a t t e + l o p e t e t a + l o p e t e t a a n + l o p e t e t a a n k o + l o p e t e t a a n p a + l o p e t e t t a i s i i n + l o p e t e t t a v a + l o p e t e t t i i n + l o p e t e t t u + l o p e t e t t u a + l o p e t t a a + l o p e t t a a k s e e n + l o p e t t a a k s e m m e + l o p e t t a a k s e n i + l o p e t t a e s s a m m e + l o p e t t a i s i + l o p e t t a i s i m m e + l o p e t t a i s i n + l o p e t t a i s i v a t + l o p e t t a k a a + l o p e t t a k a a m m e + l o p e t t a m a a n + l o p e t t a m a i s i l l a n i + l o p e t t a m a l l a + l o p e t t a m a s s a + l o p e t t a m i s a i k a + l o p e t t a m i s a j a n k o h d a n + l o p e t t a m i s e e n + l o p e t t a m i s e k s i + l o p e t t a m i s e l l a + l o p e t t a m i s e n + l o p e t t a m i s e s s a + l o p e t t a m i s e s t a + l o p e t t a m i s p r o s e s s i + l o p e t t a m i s p r o s e s s i n + l o p e t t a m i s p ä i v ä m ä ä r i ä + l o p e t t a m i s s t r a t e g i o i d e n + l o p e t t a m i s t a + l o p e t t a n e e t + l o p e t t a v a m m e + l o p e t t a v a n + l o p e t t a v a t + l o p e t t a v i l l e + l o p e t t i + l o p e t t i v a t + l o p e t u k s e k s i + l o p e t u s m e n e t e l m ä t + l o p e t u s s t r a t e g i o i d e n + l o p p i a i s a a t t o + l o p p i a i s k a k k u + l o p p u a + l o p p u a a n + l o p p u a j a k s i + l o p p u a j a n + l o p p u a n a l y y s i n + l o p p u a r v i o + l o p p u a r v i o i n n i n + l o p p u a r v i o i n n i s t a + l o p p u a r v i o i n n i t + l o p p u a r v i o i n t i + l o p p u a r v i o n + l o p p u a r v i o s s a + l o p p u a s i a k i r j a + l o p p u a s i a k i r j a a n + l o p p u a s i a k i r j a n + l o p p u a s i a k i r j a s s a + l o p p u a s i a k i r j a s t a + l o p p u a s i a k i r j o i s s a + l o p p u a s i a k k a a l l e + l o p p u a s i a k k a a t + l o p p u a s i a k k a i d e n + l o p p u e l ä m ä n s ä + l o p p u e s s a + l o p p u h e t k i l l e + l o p p u h e t k i l l ä + l o p p u h i n n a s t a + l o p p u h i n t a a + l o p p u h i n t a a n + l o p p u h u i p e n n u k s e s t a + l o p p u h u o m a u t u k s e e n i + l o p p u h u o m a u t u k s e n + l o p p u h u o m a u t u k s e n a + l o p p u h u o m a u t u k s e n i + l o p p u h u o m a u t u k s e s t a + l o p p u h u o m a u t u k s e s t a a n + l o p p u h u o m a u t u k s i a + l o p p u h u o m a u t u k s i i n + l o p p u h u o m a u t u k s i s s a + l o p p u h u o m a u t u k s i s s a a n + l o p p u h u o m a u t u k s i s s a n i + l o p p u h u o m a u t u k s i s t a + l o p p u h u o m a u t u s + l o p p u h u o m a u t u s t a + l o p p u h u o m a u t u s t e n + l o p p u h u o m i o + l o p p u h u o m i o i d e n s a + l o p p u h u o m i o i t a + l o p p u h u o m i o k s i + l o p p u h u o m i o n + l o p p u h u o m i o n i + l o p p u i + l o p p u i s i + l o p p u i s i v a t + l o p p u i ä k s e e n + l o p p u j a k e l u u n + l o p p u j e n + l o p p u j u l i s t u k s e e n + l o p p u j u l i s t u k s e s s a + l o p p u j u l i s t u s t a + l o p p u j u l k i l a u s u m a + l o p p u j u l k i l a u s u m a a + l o p p u j u l k i l a u s u m a a n + l o p p u j u l k i l a u s u m a s s a + l o p p u j ä t t e e s t ä + l o p p u j ä t t e e t + l o p p u k a u d e k s i + l o p p u k e r t o m u k s e e n + l o p p u k e r t o m u k s e n + l o p p u k e r t o m u k s e n s a + l o p p u k e r t o m u k s e s s a + l o p p u k e r t o m u k s e s t a + l o p p u k e r t o m u k s e t + l o p p u k e r t o m u k s i a + l o p p u k e r t o m u s + l o p p u k e r t o m u s k i n + l o p p u k e r t o m u s l u o n n o k s e m m e + l o p p u k e s k u s t e l u n + l o p p u k e s ä l l ä + l o p p u k e s ä ä + l o p p u k e v ä ä l l ä + l o p p u k e v ä ä s t ä + l o p p u k i i h d y t y s t ä + l o p p u k i r i + l o p p u k i r i n + l o p p u k i r i s s ä + l o p p u k o h t a u k s e s t a + l o p p u k o h t i e n + l o p p u k o m m e n t i n + l o p p u k o m m e n t t i + l o p p u k o m m e n t t i i n + l o p p u k o m m e n t t i n i + l o p p u k o n f e r e n s s i s t a + l o p p u k u l u t t a j a + l o p p u k u l u t t a j a a n + l o p p u k u l u t t a j a l l e + l o p p u k u l u t t a j a n + l o p p u k u l u t t a j a t + l o p p u k u l u t t a j i a + l o p p u k u l u t t a j i e n + l o p p u k u l u t t a j i i n + l o p p u k u l u t t a j i l l a + l o p p u k u l u t t a j i l l e + l o p p u k u l u t u k s e e n + l o p p u k u l u t u k s e n + l o p p u k u l u t u k s e s s a + l o p p u k u l u t u k s e s t a + l o p p u k u s t a n n u s t a + l o p p u k u u k a u d e t + l o p p u k u u s t a + l o p p u k y s y m y k s e n + l o p p u k y s y m y k s e n i + l o p p u k y s y n n ä n + l o p p u k ä s i t t e l y + l o p p u k ä s i t t e l y j ä r j e s t e l m i i n + l o p p u k ä s i t t e l y n + l o p p u k ä s i t t e l y s t ä + l o p p u k ä s i t t e l y s u u n n i t e l m a n + l o p p u k ä s i t t e l y t + l o p p u k ä y t t ä j i e n + l o p p u k ä y t t ä j i i n + l o p p u k ä y t t ä j i l l e + l o p p u k ä y t t ä j i s t ä + l o p p u k ä y t t ä j i ä + l o p p u k ä y t t ä j ä + l o p p u k ä y t t ä j ä l l e + l o p p u k ä y t t ä j ä n + l o p p u k ä y t t ä j ä s t ä + l o p p u k ä y t t ä j ä t + l o p p u k ä y t t ä j ä t o d i s t u k s e t + l o p p u k ä y t t ä j ä t o d i s t u s + l o p p u k ä y t t ä j ä ä + l o p p u k ä y t t ä j ä ä n + l o p p u k ä y t t ö + l o p p u k ä y t t ö a s e e t + l o p p u k ä y t t ö p o t e n t i a a l i n + l o p p u k ä y t t ö r a t k a i s u j a + l o p p u k ä y t t ö ä + l o p p u k ä y t t ö ö n + l o p p u k ä y t ö n + l o p p u k ä y t ö s t ä + l o p p u l a s k u + l o p p u l a u s e e s e e n + l o p p u l a u s u n n o s s a a n + l o p p u l a u s u n n o s s a n n e + l o p p u l a u s u n n o t + l o p p u m a a n + l o p p u m a i s i l l a a n + l o p p u m a k s u j a + l o p p u m a k s u j e n + l o p p u m a k s u n + l o p p u m a k s u t + l o p p u m a s s a + l o p p u m a t k a l t a + l o p p u m a t t o m a n + l o p p u m e n e t t e l y ä + l o p p u m e t r e i l l ä + l o p p u m i e t i n n ö l l e + l o p p u m i e t i n n ö s t ä + l o p p u m i e t i n t ö + l o p p u m i s p ä i v ä m ä ä r ä + l o p p u m ä ä r ä y k s e t + l o p p u n e e t + l o p p u n e u v o t t e l u i s t a + l o p p u n e u v o t t e l u t + l o p p u n ä y t ö s + l o p p u o s a + l o p p u o s a a + l o p p u o s a a n + l o p p u o s a l l e + l o p p u o s a n + l o p p u o s a s s a + l o p p u o s a s t a + l o p p u o t t e l u + l o p p u o t t e l u a + l o p p u o t t e l u i s t a + l o p p u o t t e l u n + l o p p u p a l k a n + l o p p u p a l k k a a n + l o p p u p e l e i s s ä + l o p p u p e l i + l o p p u p e l i s s ä + l o p p u p e l i s t ä + l o p p u p i s t e e s e e n + l o p p u p i s t e t t ä + l o p p u p o n n i s t u k s e n a + l o p p u p u h e e n v u o r o + l o p p u p u h e e n v u o r o a a n + l o p p u p u h e e n v u o r o a n i + l o p p u p u h e e n v u o r o a n n e + l o p p u p u h e e n v u o r o n i + l o p p u p u h e e n v u o r o n s a + l o p p u p u h e e n v u o r o o n i + l o p p u p u h e e n v u o r o s s a + l o p p u p u h e e n v u o r o s s a a n + l o p p u p u h e e n v u o r o s s a n i + l o p p u p u h e e n v u o r o s s a n n e + l o p p u p u h e e n v u o r o s t a a n + l o p p u p u o l i s k o + l o p p u p u o l i s k o l l a + l o p p u p u o l i s k o l l e + l o p p u p u o l i s k o n + l o p p u p u o l i s k o o n + l o p p u p y r ä h d y k s e n + l o p p u p ä ä n + l o p p u p ä ä s s ä + l o p p u p ä ä t e l m i i n + l o p p u p ä ä t e l m i s s ä + l o p p u p ä ä t e l m i s s ä k i n + l o p p u p ä ä t e l m i s t ä + l o p p u p ä ä t e l m i ä + l o p p u p ä ä t e l m ä + l o p p u p ä ä t e l m ä n ä + l o p p u p ä ä t ö s l a u s e l m a + l o p p u p ä ä t ö s l a u s e l m a a + l o p p u p ä ä t ö s l a u s e l m a n + l o p p u p ä ä t ö s l a u s e l m i s t a + l o p p u r a n g a i s t u s t a a n + l o p p u r a p o r t i n + l o p p u r a p o r t i s s a + l o p p u r a p o r t i s t a + l o p p u r a p o r t t i + l o p p u r a p o r t t i a + l o p p u r a p o r t t i e n + l o p p u r a p o r t t i i n + l o p p u r a p o r t t i n s a + l o p p u r a t k a i s u + l o p p u r a t k a i s u n + l o p p u r a t k a i s u u n + l o p p u r u t i s t u k s e e n + l o p p u r y s ä y s + l o p p u s a a j i s t a + l o p p u s a l d o + l o p p u s a n a t + l o p p u s a n o i s t a + l o p p u s e l o n t e k o + l o p p u s e l v i t y k s e s s ä + l o p p u s e l v i t y s + l o p p u s i j o i t t a j i l l e + l o p p u s i j o i t t a m i s e e n + l o p p u s i j o i t t a m i s e n + l o p p u s i j o i t t a m i s e s s a + l o p p u s i j o i t t a m i s e s t a + l o p p u s i j o i t t a m i s t a + l o p p u s i j o i t u k s e e n + l o p p u s i j o i t u k s e n + l o p p u s i j o i t u k s e s s a + l o p p u s i j o i t u k s e s t a + l o p p u s i j o i t u s + l o p p u s i j o i t u s k o n s e p t e j a + l o p p u s i j o i t u s l a i t o k s i a + l o p p u s i j o i t u s l a i t o s + l o p p u s i j o i t u s l a i t o s t e n + l o p p u s i j o i t u s p a i k a s t a + l o p p u s i j o i t u s p a i k a t + l o p p u s i j o i t u s p a i k k a + l o p p u s i j o i t u s p a i k k a a n + l o p p u s i j o i t u s p a i k k a r a t k a i s u n + l o p p u s i j o i t u s p a i k k o j a + l o p p u s i j o i t u s p a i k k o j e n + l o p p u s i j o i t u s p a i k o i s s a + l o p p u s i j o i t u s r a t k a i s u n + l o p p u s i j o i t u s t a + l o p p u s i l a u s + l o p p u s i v u t + l o p p u s o p i m u k s e n + l o p p u s u m m a + l o p p u s u m m a a + l o p p u s u m m a a n + l o p p u s u m m a k s i + l o p p u s u m m a n + l o p p u s u o r a + l o p p u s u o r a a + l o p p u s u o r a l l a + l o p p u s u o r a l l e + l o p p u s u o r a n + l o p p u s y k s y l l ä + l o p p u s y k s y s t ä + l o p p u s ä i l y t y k s e e n + l o p p u s ä ä d ö k s e n ä + l o p p u s ä ä n n ö k s i i n + l o p p u s ä ä n n ö k s i ä + l o p p u t a r k a s t e l u s s a + l o p p u t a r k a s t u k s e s s a + l o p p u t a r k a s t u s + l o p p u t a r k i s t u s v a i h e e s s a + l o p p u t a v o i t e + l o p p u t a v o i t e t t a + l o p p u t a v o i t t e e n + l o p p u t e k s t i + l o p p u t e k s t i n + l o p p u t e k s t i t + l o p p u t i e d o n a n t o + l o p p u t u l o k s e e n + l o p p u t u l o k s e k s i + l o p p u t u l o k s e l l e + l o p p u t u l o k s e n + l o p p u t u l o k s e n a + l o p p u t u l o k s e s s a + l o p p u t u l o k s e s t a + l o p p u t u l o k s e t + l o p p u t u l o k s i a + l o p p u t u l o k s i i n + l o p p u t u l o k s i s t a + l o p p u t u l o s + l o p p u t u l o s t a + l o p p u t u l o s t e n + l o p p u t u o t a n n o s t a + l o p p u t u o t e + l o p p u t u o t e t t a + l o p p u t u o t t e e l l e + l o p p u t u o t t e e n + l o p p u t u o t t e e n a + l o p p u t u o t t e e s e e n + l o p p u t u o t t e e s s a + l o p p u t u o t t e e s t a + l o p p u t u o t t e i d e n + l o p p u t u o t t e i k s i + l o p p u t u o t t e i n a + l o p p u t u o t t e i s i i n + l o p p u t u o t t e i s s a + l o p p u t u o t t e i s t a + l o p p u t u o t t e i t a + l o p p u t u o t t e i t a m m e + l o p p u t u t k i n t o a + l o p p u u + l o p p u u n k i n + l o p p u v a i h e + l o p p u v a i h e e k s i + l o p p u v a i h e e n + l o p p u v a i h e e s e e n + l o p p u v a i h e e s s a + l o p p u v a i h e e s s a a n + l o p p u v a i h e e t + l o p p u v a i h e i d e n + l o p p u v a i h e i s s a + l o p p u v a i h e t t a + l o p p u v a i h e t t a a n + l o p p u v a l v o n n a n + l o p p u v a n + l o p p u v a r a s t o i n n i n + l o p p u v a r a s t o i n n i s t a + l o p p u v a r a s t o i n t i a + l o p p u v a r a s t o i n t i i n + l o p p u v a r a s t o i n t i k e i n o a + l o p p u v a r a s t o j e n + l o p p u v a s t a a n o t t a j a t + l o p p u v a t + l o p p u v e t o o m u s + l o p p u v i h e l l y k s e n s ä + l o p p u v i i k o l l a + l o p p u v i i k o s t a + l o p p u v i i v a n + l o p p u v u o d e k s i + l o p p u v u o d e l l e + l o p p u v u o d e n + l o p p u v u o d e s t a + l o p p u v u o n n a + l o p p u v u o s i + l o p p u v u o s i l l e + l o p p u v u o t t a + l o p p u y h t e e n v e d o n + l o p p u y h t e e n v e t o + l o p p u ä ä n e s t y k s e n + l o p p u ä ä n e s t y k s e s s ä + l o p p u ä ä n e s t y k s e s t ä + l o p p u ä ä n e s t y s + l o p p u ä ä n e s t y s t ä + l o p u i l l a a n + l o p u l l i s e e n + l o p u l l i s e l l a + l o p u l l i s e l l e + l o p u l l i s e m m a n + l o p u l l i s e m p i + l o p u l l i s e n + l o p u l l i s e n a + l o p u l l i s e s s a + l o p u l l i s e s t a + l o p u l l i s e t + l o p u l l i s i a + l o p u l l i s i i n + l o p u l l i s i s s a + l o p u l l i s i s t a + l o p u l l i s t a + l o p u l l i s t e n + l o p u l l i s u u d e s t a + l o p u l t a h a n + l o p u l t a k i n + l o p u n + l o p u t + l o p u t k i n + l o p u t o n t a + l o p u t t a v a + l o p u t t o m a a n + l o p u t t o m a l t a + l o p u t t o m a n + l o p u t t o m a s s a + l o p u t t o m a t + l o p u t t o m i a + l o p u t t o m i l l e + l o p u t t o m i s t a + l o p u t t u a + l o r d i k a n s l e r i + l o r d i k a n s l e r i a + l o r d i k a n s l e r i n + l o r d i l u u t n a n t t i + l o r d i n + l o r d i p r o t e k t o r i + l o t i n a p e l t o + l o t o t a + l o t t o n u m e r o k u u l u t t a j a n a + l o t t o t u l o k s e t + l o u h i k a l a + l o u h i k k o k i r v i n e n + l o u h i k k o t a s k u + l o u h i n n a s s a + l o u h i n n a s t a + l o u h i n t a m a h d o l l i s u u k s i a + l o u h i n t a m a h d o l l i s u u k s i s t a + l o u h i n t a m e n e t e l m i ä + l o u h i n t a p o t e n t i a a l i + l o u h i n t a t e k n i i k a t + l o u h i n t a t e k n i i k o i d e n + l o u h i n t a t o i m i n t a a + l o u h o k s i i n + l o u h o k s i s s a + l o u h o s t e o l l i s u u s + l o u h o s t e o l l i s u u t e e n + l o u k a n n e e n + l o u k a t a + l o u k a t a a n + l o u k a t e s s a + l o u k a t e s s a a n + l o u k a t t u n a + l o u k a t u k s i + l o u k a t u n + l o u k k a a m a a n + l o u k k a a m a t o n t a + l o u k k a a m a t t a + l o u k k a a m a t t o m a a n + l o u k k a a m a t t o m a n a + l o u k k a a m a t t o m i a + l o u k k a a m a t t o m u u s + l o u k k a a m i s e n + l o u k k a a m i s v ä i t t e e t + l o u k k a a n n u t t u a a n + l o u k k a a n t u a + l o u k k a a n t u i + l o u k k a a n t u i v a t + l o u k k a a n t u m i s a s t e + l o u k k a a n t u m i s e t + l o u k k a a n t u m i s i a + l o u k k a a n t u m i s i i n + l o u k k a a n t u m i s r i s k i n + l o u k k a a n t u m i s t e n + l o u k k a a n t u m i s v a a r a a + l o u k k a a n t u n e e t + l o u k k a a n t u n e i d e n + l o u k k a a n t u n e i l l e + l o u k k a a n t u n e i t a + l o u k k a a n t u n u t t a + l o u k k a a n t u u + l o u k k a a n t u v i e n + l o u k k a a v a a + l o u k k a a v a m p i a + l o u k k a a v a n + l o u k k a a v a t + l o u k k a a v i n + l o u k k a i s i + l o u k k a u k s e n a + l o u k k a u k s e t + l o u k k a u k s i a + l o u k k a u k s i e n + l o u k k a u k s i i n + l o u k k a u k s i l t a + l o u k k a u k s i s t a + l o u k k a u s t a + l o u k k a u s t e n + l o u k k u j a + l o u n a a l l a + l o u n a a l l e + l o u n a a n + l o u n a a n j u u r i p e r h o n e n + l o u n a i s a l u e e n + l o u n a i s i i n + l o u n a i s i s s a + l o u n a i s n u r k a s s a + l o u n a i s o s a a + l o u n a i s o s a s s a + l o u n a i s o s i e n + l o u n a i s o s i i n + l o u n a i s o s i s s a + l o u n a i s p u o l e l l a + l o u n a i s r a n n i k o l l a + l o u n a i s r e u n a l l a + l o u n a i s s u o m e n + l o u n a i s t a + l o u n a i t a + l o u n a s a i k a + l o u n a s a i k a a n + l o u n a s a j a l l a + l o u n a s a j a n + l o u n a s k e s k u s t e l u i s s a + l o u n a s l a a t i k k o + l o u n a s m a k k a r a p a k e t i s t a + l o u n a s s e t e l i + l o u n a s t a u o l l a + l o u n a s t a u o n + l o u n a s t u n n i n + l u b a n g a + l u e n n o i d a + l u e n n o i m a a n + l u e n n o i t s i j a t + l u e n t o s a l e j a + l u e n t o s a l i i n + l u e n t o s a l i s s a + l u e n t o s a r j a n + l u e t a a n + l u e t e l l a + l u e t e l l a a n + l u e t e l l e s s a n i + l u e t e l m a k o h t a a + l u e t e l m a k o h t a a n + l u e t e l t a v a + l u e t e l t u i h i n + l u e t e l t u j e n + l u e t t a e s s a + l u e t t a v a a + l u e t t a v a m p a a + l u e t t a v i s s a + l u e t t a v u u d e s t a + l u e t t a v u u t t a + l u e t t e l e m a n i + l u e t t e l e m a t t a + l u e t t e l e m i s e e n + l u e t t e l e n + l u e t t e l o a + l u e t t e l o e h d o t u k s i a + l u e t t e l o i d e n + l u e t t e l o i m a a n + l u e t t e l o i n n i l l a + l u e t t e l o i s t a + l u e t t e l o i t a + l u e t t e l o i t a v a + l u e t t e l o j a + l u e t t e l o j e n + l u e t t e l o l l a + l u e t t e l o l l e + l u e t t e l o n + l u e t t e l o o n + l u e t t e l o s s a + l u e t t e l o s t a + l u e t t u a m m e + l u e t t u a n i + l u e t t u n a + l u h i s t u i s i + l u h i s t u m a i s i l l a a n + l u h i s t u m i s p i s t e e s s ä + l u h i s t u n u t + l u h i s t u u + l u h t a h i i r i h a u k k a + l u h t a k a n a + l u h t a k a n n u s s i n i s i i p i + l u h t a k a s t i k k a + l u h t a k a s t i k k a h i t u k o i + l u h t a k e r t t u n e n + l u h t a k u i r i s a m m a l + l u h t a k u l t a s i i p i + l u h t a l e h t i m i t t a r i + l u h t a l e m m i k k i + l u h t a l i t u k k a + l u h t a m a t a r a + l u h t a n a a m i o k e r t t u l i + l u h t a p i i s p a + l u h t a s a r a + l u h t a s u o p u t k i + l u h t a t a p a k u l o + l u h t a t a s k u + l u h t a v a h a n o k k a + l u h t a v i l l a + l u h t a v u o h e n n o k k a + l u h t i t a l o + l u i d e n p o i s t o + l u i k e r o t + l u i k e r r e l l a k s e e n + l u i s k i e n + l u i s t a m a a n + l u i s t e l u l i i t t o + l u i s t i v a t + l u i s t o n e s t o + l u i s u a + l u i s u m a s s a + l u i s u m a s t a + l u i s u m i n e n + l u j a n a + l u j a t + l u j e m m a n + l u j e m m a t + l u j e m m i n + l u j e m p a a + l u j e m p a a n + l u j e m p i a + l u j i a + l u j i n a + l u j i t e m u o v i + l u j i t e t a a n + l u j i t e t t a i s i i n + l u j i t e t t a v a + l u j i t e t t u a + l u j i t e t u l t a + l u j i t t a a + l u j i t t a a k s e e n + l u j i t t a i s i + l u j i t t a k a a m m e + l u j i t t a m a a n + l u j i t t a m i s e e n + l u j i t t a m i s e h d o t u k s i a + l u j i t t a m i s e k s i + l u j i t t a m i s e l l e + l u j i t t a m i s e s s a + l u j i t t a m i s e s t a + l u j i t t a m i s p r o s e s s i a + l u j i t t a m i s p r o s e s s i n + l u j i t t a m i s p r o s e s s i s s a + l u j i t t a m i s t a + l u j i t t a v i e n + l u j i t t i + l u j i t t u i + l u j i t t u m i s p r o s e s s i + l u j i t t u u + l u j u u s o p p i + l u j u u t t a + l u k e a + l u k e e + l u k e k a a + l u k e k a a m m e + l u k e k a a p a + l u k e k o o n + l u k e m a a n + l u k e m a a n s a + l u k e m a m m e + l u k e m a n i + l u k e m a t t a + l u k e m a t t o m a t + l u k e m a t t o m i a + l u k e m a t t o m i e n + l u k e m a t t o m i i n + l u k e m a t t o m i l l e + l u k e m a t t o m i s t a + l u k e m i s e l t a + l u k e m i s e n + l u k e m i s k e l v o t o n + l u k e m i s v a i k e u k s i a + l u k e n e e n i + l u k i e s s a + l u k i e s s a a n + l u k i e s s a m m e + l u k i e s s a n i + l u k i h ä i r i ö i s i ä + l u k i j a k i r j e e n + l u k i j a k i r j e j o u r n a l i s m i + l u k i j a l l e + l u k i j a y s t ä v ä l l i s e l l ä + l u k i j a y s t ä v ä l l i s e t + l u k i j a y s t ä v ä l l i s i ä + l u k i j a y s t ä v ä l l i s t ä + l u k i o a s t e e n + l u k i o i d e n + l u k i o i k ä i s t ä + l u k i o k o u l u t u k s e s s a + l u k i o n + l u k i o s s a + l u k i o t a + l u k i s i n + l u k i s i v a t + l u k k i k ä m m e k k ä + l u k k i u t u m a t t o m a t + l u k k i u t u m i s e n e s t o j ä r j e s t e l m i ä + l u k k i u t u n u t + l u k k o p a i n i + l u k s u s a u t o n + l u k s u s a u t o t + l u k s u s e l ä m ä + l u k s u s e l ä m ä n + l u k s u s h u v i l o i s s a + l u k s u s i n v e s t o i n t i e n + l u k s u s j a h d i l l a + l u k s u s j a h d i n + l u k s u s n i m i t y k s e t + l u k s u s t a + l u k s u s t a v a r o i d e n + l u k s u s t u o t t e i t a + l u k u a + l u k u i h i n + l u k u i n a + l u k u i s a m m i l l e + l u k u i s a m p i i n + l u k u i s a t + l u k u i s i a + l u k u i s i e n + l u k u i s i i n + l u k u i s i l l a + l u k u i s i l l e + l u k u i s i l t a + l u k u i s i n + l u k u i s i n a + l u k u i s i s s a + l u k u i s i s t a + l u k u i s t e n + l u k u j a + l u k u j e n + l u k u j ä r j e s t e l m ä + l u k u j ä r j e s t y s + l u k u k a u s i m a k s u i l l a + l u k u k a u s i m a k s u j a + l u k u k a u s i m a k s u j e n + l u k u k a u s i m a k s u t + l u k u k i r j a + l u k u k u n t a + l u k u k u n t a s e u l a + l u k u l a i t e t t a + l u k u l a i t t e i t a + l u k u l o g i i k a n + l u k u m u i s t i + l u k u m ä ä r i ä + l u k u m ä ä r ä + l u k u m ä ä r ä i s e s t i + l u k u m ä ä r ä m m e + l u k u m ä ä r ä n s ä + l u k u m ä ä r ä s t ä + l u k u m ä ä r ä t + l u k u m ä ä r ä ä + l u k u m ä ä r ä ä n s ä + l u k u n o p e u s + l u k u p i i r i + l u k u s a l e j a + l u k u s u o r a + l u k u t a i d o n + l u k u t a i d o t o n + l u k u t a i d o t t o m a l t a + l u k u t a i d o t t o m i a + l u k u t a i d o t t o m u u d e n + l u k u t a i d o t t o m u u d e s t a + l u k u t a i d o t t o m u u s a s t e + l u k u t a i d o t t o m u u s l u v u t + l u k u t a i t o + l u k u t a i t o i s i a + l u k u t a i t o t e s t i s s ä + l u k u t e o r i a + l u k u u n + l u k u v u o d e k s i + l u k u v u o n n a + l u k u v u o s i a + l u m e a s t e r i + l u m e a v i o l i i t t o j a + l u m e l ä ä k e + l u m e n a j o + l u m e n t e k o k o n e i t a + l u m e o r g a n i s a a t i o + l u m e r a t k a i s u j a + l u m i a i t a + l u m i a p i n a + l u m i h a i k a r a + l u m i h a n h i + l u m i h a u v a t + l u m i h ä r k k i + l u m i j y v ä n e n + l u m i k e l l o + l u m i k e n k ä j ä n i s + l u m i k o r e n n o t + l u m i k o t i n g a + l u m i k u n i n g a t a r + l u m i k u r k i + l u m i k y y h k y + l u m i l a m m a s + l u m i l a u t a i l u n + l u m i l e h d o k k i + l u m i l e i n i k k i + l u m i l e o p a r d i + l u m i l i n g o i s s a + l u m i l i n k o + l u m i l y h t y + l u m i m i t t a r i + l u m i m y r s k y s s ä + l u m i m y y r ä + l u m i n o s i t e e t t i r e l a a t i o + l u m i p a l l o e f e k t i + l u m i p a l l o i l m i ö + l u m i p a l l o i l m i ö n + l u m i p a l l o m a a + l u m i p a l l o v a i k u t u k s e e n + l u m i p a l l o v a i k u t u k s e l l a + l u m i p a l l o v a i k u t u k s i a + l u m i p a l l o v a i k u t u s + l u m i p a l l o v a i k u t u s t e n + l u m i p e i t e + l u m i p i i p p o + l u m i p u l m u n e n + l u m i r a j a + l u m i r a j a n + l u m i r a k e n n e l m a + l u m i s a d e p a l l o + l u m i s a t e e n + l u m i s o k e u s + l u m i s o t a + l u m i t u i s k u + l u m i v a r p u n e n + l u m i v u o h i + l u m i v y ö r y i l t ä + l u m i v y ö r y k a t a s t r o f i s t a + l u m i v y ö r y o n n e t t o m u u k s i e n + l u m i y l ä n k ö j u o k s i j a + l u m m e k o i s a + l u m m e l a m p i k o r e n t o + l u m o u t u n e i t a + l u n a s t a m a t t a + l u n a s t u s v a i h e e s s a + l u n d i l l e + l u n d i n + l u n n a s r a h o i k s i + l u n n a s v a a t e i s i i n + l u n n a s v a a t i m u k s e t + l u n n a s v a a t i m u s t e n + l u n n i k o i r a + l u n t a + l u o d a + l u o d a a n + l u o d a k s e e n + l u o d a k s e m m e + l u o d a k s e n i + l u o d a k s e n n e + l u o d e s s a + l u o d e s s a m m e + l u o d i t + l u o d u l l a + l u o d u n + l u o j a l l e + l u o j a n + l u o j a s t a + l u o j i a + l u o k a a m m e + l u o k a n + l u o k a s s a + l u o k a s t a + l u o k a t + l u o k i k s i + l u o k i t e l l a + l u o k i t e l l a a n + l u o k i t e l l e s s a a n + l u o k i t e l l u i s t a + l u o k i t e l t a v a + l u o k i t e l t a v a a + l u o k i t e l t i i n k o + l u o k i t t e l e m a a n + l u o k i t t e l u e r o i s t a + l u o k i t t e l u j a + l u o k i t t e l u j e n + l u o k i t t e l u j ä r j e s t e l m ä + l u o k i t t e l u j ä r j e s t e l m ä s s ä + l u o k i t t e l u j ä r j e s t e l m ä s t ä + l u o k i t t e l u j ä r j e s t e l m ä t + l u o k i t t e l u j ä r j e s t e l m ä ä + l u o k i t t e l u k o o d i s t o a + l u o k i t t e l u l a i t o k s e n + l u o k i t t e l u l a i t o k s i a + l u o k i t t e l u l a i t o s + l u o k i t t e l u l u e t t e l o j e n + l u o k i t t e l u m u o t o j a + l u o k i t t e l u n + l u o k i t t e l u o n g e l m a t + l u o k i t t e l u p e r i a a t t e e n a + l u o k i t t e l u p e r u s t e i d e n + l u o k i t t e l u p e r u s t e i t a + l u o k i t t e l u p r o s e s s i i n + l u o k i t t e l u p y r k i m y k s i l t ä + l u o k i t t e l u s t a + l u o k i t t e l u t a s o a + l u o k i t t e l u t a s o j e n + l u o k i t u k s e n + l u o k i t u k s i a + l u o k i t u k s i l l a a n + l u o k i t u k s i s t a + l u o k i t u s a l a a + l u o k i t u s j ä r j e s t e l m i i n + l u o k i t u s j ä r j e s t e l m i ä + l u o k i t u s j ä r j e s t e l m i ä ä n + l u o k i t u s j ä r j e s t e l m ä + l u o k i t u s j ä r j e s t e l m ä n + l u o k i t u s j ä r j e s t e l m ä s t ä + l u o k i t u s j ä r j e s t e l m ä ä + l u o k i t u s j ä r j e s t e l m ä ä n s ä + l u o k i t u s l a i t o k s e n + l u o k i t u s l a i t o k s e t + l u o k i t u s l a i t o k s i a + l u o k i t u s l a i t o k s i i n + l u o k i t u s l a i t o k s i l l a + l u o k i t u s l a i t o k s i l l e + l u o k i t u s l a i t o k s i l t a + l u o k i t u s l a i t o k s i s s a + l u o k i t u s l a i t o k s i s t a + l u o k i t u s l a i t o s + l u o k i t u s l a i t o s a s e t u s + l u o k i t u s l a i t o s t a + l u o k i t u s l a i t o s t e n + l u o k i t u s m e n e t e l m i e n + l u o k i t u s m e n e t t e l y i d e n + l u o k i t u s m e n e t t e l y j e n + l u o k i t u s m e n e t t e l y t + l u o k i t u s p e r u s t e e t + l u o k i t u s p r o s e s s i n + l u o k i t u s p ä ä t ö k s i i n s ä + l u o k i t u s p ä ä t ö s t e n + l u o k i t u s t a + l u o k i t u s t e n + l u o k i t u s t o i m i n n a s t a + l u o k i t u s t o i m i n t a a + l u o k i t u s t o i m i s t a + l u o k i t u s t y y p i t + l u o k i t u s y h t i ö n + l u o k k a a + l u o k k a a n + l u o k k a e r o j a + l u o k k a e r o j e n + l u o k k a e r o t + l u o k k a e s t e i t ä + l u o k k a e t u j e n + l u o k k a h e g e m o n i a s t a + l u o k k a h u o n e i s s a + l u o k k a j a k o + l u o k k a j a o l t a + l u o k k a j ä r j e s t ö i n ä + l u o k k a k a a v i o + l u o k k a k o k o + l u o k k a k o k o j e n + l u o k k a k o k o u s + l u o k k a k u n t a + l u o k k a m e r k i n n ä s t ä + l u o k k a m e r k i n n ä t + l u o k k a n s a + l u o k k a n ä k ö k u l m a s t a + l u o k k a o i k e u d e s t a + l u o k k a p e r u s t a i s e e n + l u o k k a p e r u s t e i s i a + l u o k k a p e r u s t e i s t a + l u o k k a p o h j a i n e n + l u o k k a p o l i t i i k a k s i + l u o k k a r a k e n n e + l u o k k a r e t k i + l u o k k a s o d a l l a + l u o k k a s o d a n + l u o k k a s o d a s t a + l u o k k a s o r m u s + l u o k k a s o t a + l u o k k a s o t a a n + l u o k k a s o t i e n + l u o k k a s y r j i n t ä + l u o k k a s y r j i n t ä j ä r j e s t e l m ä n + l u o k k a t a i s t e l u + l u o k k a t a i s t e l u a + l u o k k a t a i s t e l u k s i + l u o k k a t a i s t e l u n + l u o k k a t a i s t e l u s s a + l u o k k a t a i s t o a + l u o k k a t i e t o i s e t + l u o k k a t i e t o i s t a + l u o k k a t o v e r i t + l u o k k a v a l i n t o j a + l u o k k a v i h a + l u o k k a v i h o l l i s e l l e + l u o k k a v i h o l l i s e n + l u o k k a v i h o l l i s t a + l u o k k a y h t e i s k u n n a s s a + l u o k k a y h t e i s t y ö s t ä + l u o k k a y h t e i s t y ö t ä + l u o k k i e n + l u o k k i i n + l u o l a h y e e n a + l u o l a k a h l a a j a + l u o l a k a r h u + l u o l a k o n n a m o n n i + l u o l a l e i j o n a + l u o l a l u o s t a r i + l u o l a m a d o n n a + l u o l a m i e s + l u o l a t + l u o l a v e r t a u s + l u o m a a m m e + l u o m a a n + l u o m a l l a + l u o m a s s a + l u o m a t t a + l u o m i s e e n + l u o m i s e k s i + l u o m i s e l l e + l u o m i s e n + l u o m i s e s s a + l u o m i s e s t a + l u o m i s h a l u a + l u o m i s h a l u u n + l u o m i s h a n k k e e s t a + l u o m i s k e i n o j e n + l u o m i s k e i n o n a + l u o m i s k e r t o m u k s e n + l u o m i s k e r t o m u k s e t + l u o m i s k y k y + l u o m i s p r o s e s s i + l u o m i s p r o s e s s i i n + l u o m i s p r o s e s s i s s a + l u o m i s p y r k i m y s t e n + l u o m i s t a + l u o m i s t a m m e + l u o m i s t a r p e e n + l u o m i s t a u t i k o k e i s i i n + l u o m i s v a i k u t u s t a + l u o m i s v o i m a + l u o m i s v o i m a a + l u o m i s y r i t y k s e k s i + l u o m i v ä r i + l u o m m e + l u o m m e k o + l u o m u a l a + l u o m u a s e t u s + l u o m u e l i n t a r v i k e t u o t a n n o n + l u o m u e l i n t a r v i k k e i d e n + l u o m u g e l a t i i n i a + l u o m u i h a n n e t t a + l u o m u k a n o i l l e + l u o m u k a s v a t u s + l u o m u k a s v i e n + l u o m u l i h a t u o t a n t o + l u o m u m a a n v i l j e l y l l e + l u o m u m a a t a l o u d e n + l u o m u m a a t a l o u t t a + l u o m u m e r k i n n ä n + l u o m u m e r k k i + l u o m u m e r k k i ä + l u o m u r u o a n + l u o m u r u o a s t a + l u o m u r u o k a a + l u o m u r u o k a t u o t t e i d e n + l u o m u t i l o i k s i + l u o m u t i l o i l l e + l u o m u t i l o i l t a + l u o m u t i l o j e n + l u o m u t u o t a n n o l l e + l u o m u t u o t a n n o n + l u o m u t u o t a n n o s s a + l u o m u t u o t a n t o + l u o m u t u o t a n t o a + l u o m u t u o t a n t o o n + l u o m u t u o t e + l u o m u t u o t t a j a t + l u o m u t u o t t a j i a + l u o m u t u o t t a j i e n + l u o m u t u o t t e e s t a + l u o m u t u o t t e i d e n + l u o m u t u o t t e i s i i n + l u o m u t u o t t e i s t a + l u o m u t u o t t e i t a + l u o m u v i i n i l l e + l u o m u v i l j e l i j ä t + l u o m u v i l j e l i j ö i d e m m e + l u o m u v i l j e l i j ö i d e n + l u o m u v i l j e l y + l u o m u v i l j e l y a l a + l u o m u v i l j e l y n + l u o m u v i l j e l y s s ä + l u o m u v i l j e l y s t ä + l u o m u v i l j e l y ä + l u o n a m m e + l u o n e e t + l u o n n e h d i n t a n a + l u o n n e h d i t t a v a + l u o n n e h t i a + l u o n n e h t i v a t + l u o n n e t t a + l u o n n e t t a a n + l u o n n i n + l u o n n i s s a + l u o n n o k s e e n + l u o n n o k s e n + l u o n n o k s e n a + l u o n n o k s e s s a + l u o n n o k s e s t a + l u o n n o k s i a + l u o n n o k s i l l e + l u o n n o k s i s s a + l u o n n o l l e + l u o n n o l l i n e n k i n + l u o n n o l l i s e e n + l u o n n o l l i s e l l a + l u o n n o l l i s e l t a + l u o n n o l l i s e m m i n + l u o n n o l l i s e m p a a + l u o n n o l l i s e m p i + l u o n n o l l i s e n + l u o n n o l l i s e s s a + l u o n n o l l i s e s t i k a a n + l u o n n o l l i s e s t i k i n + l u o n n o l l i s e t + l u o n n o l l i s i a + l u o n n o l l i s i i n + l u o n n o l l i s i k s i + l u o n n o l l i s i l l e + l u o n n o l l i s i m m a t + l u o n n o l l i s i m m i s t a + l u o n n o l l i s i m p i i n + l u o n n o l l i s i n + l u o n n o l l i s i n t a + l u o n n o l l i s i s s a + l u o n n o l l i s t a + l u o n n o l l i s t a k i n + l u o n n o l l i s t e n + l u o n n o n + l u o n n o n a i n e + l u o n n o n a i n e e t + l u o n n o n a i n e i s i i n + l u o n n o n a i n e i s t a + l u o n n o n a i n e i t a + l u o n n o n a l u e + l u o n n o n a l u e e t + l u o n n o n a l u e i d e n + l u o n n o n a l u e i l l e + l u o n n o n a l u e i s t a + l u o n n o n a l u e i t a + l u o n n o n a l u e i t a a n + l u o n n o n a l u e i t a m m e + l u o n n o n a r v o j a + l u o n n o n a r v o n + l u o n n o n e s t e e t + l u o n n o n e s t e i d e n + l u o n n o n e s t e i t ä + l u o n n o n f i l o s o f i a + l u o n n o n h a i t a s t a + l u o n n o n h a i t o i s t a + l u o n n o n h a i t o i s t a a n + l u o n n o n h a i t t a + l u o n n o n h a i t t a k o r v a u k s e n + l u o n n o n h a i t t a k o r v a u k s e t + l u o n n o n h a i t t a k o r v a u k s i a + l u o n n o n h a i t t a k o r v a u s t e n + l u o n n o n h a i t t o i h i n + l u o n n o n h a i t t o j a + l u o n n o n h a i t t o j e n + l u o n n o n h a r m o n i a n + l u o n n o n h i s t o r i a + l u o n n o n h u n a j a n + l u o n n o n i l m i ö + l u o n n o n i l m i ö i d e n + l u o n n o n i l m i ö i h i n + l u o n n o n i l m i ö i l l ä + l u o n n o n i l m i ö i s t ä + l u o n n o n i l m i ö i t ä + l u o n n o n i l m i ö n + l u o n n o n i l m i ö t + l u o n n o n i l m i ö t ä + l u o n n o n j o g u r t t i a + l u o n n o n j ä r j e s t e l m i i n + l u o n n o n j ä r j e s t y k s e n + l u o n n o n j ä r j e s t y s + l u o n n o n k a a s u + l u o n n o n k a a s u a + l u o n n o n k a a s u e s i i n t y m ä t + l u o n n o n k a a s u l l a + l u o n n o n k a a s u m a r k k i n o i t a + l u o n n o n k a a s u n + l u o n n o n k a a s u s t a + l u o n n o n k a p i t a l i s m i + l u o n n o n k a t a s t r o f e i h i n + l u o n n o n k a t a s t r o f e i k s i + l u o n n o n k a t a s t r o f e i l l a + l u o n n o n k a t a s t r o f e i l l e + l u o n n o n k a t a s t r o f e i l t a + l u o n n o n k a t a s t r o f e i s s a + l u o n n o n k a t a s t r o f e i s t a + l u o n n o n k a t a s t r o f e j a + l u o n n o n k a t a s t r o f i + l u o n n o n k a t a s t r o f i a + l u o n n o n k a t a s t r o f i a i h e e s e e n + l u o n n o n k a t a s t r o f i a l u e i l l e + l u o n n o n k a t a s t r o f i a p u a + l u o n n o n k a t a s t r o f i e n + l u o n n o n k a t a s t r o f i e n s a + l u o n n o n k a t a s t r o f i i n + l u o n n o n k a t a s t r o f i j a k s o + l u o n n o n k a t a s t r o f i k s i + l u o n n o n k a t a s t r o f i l l a + l u o n n o n k a t a s t r o f i l t a + l u o n n o n k a t a s t r o f i n + l u o n n o n k a t a s t r o f i s s a + l u o n n o n k a t a s t r o f i s t a + l u o n n o n k a t a s t r o f i t + l u o n n o n k a t a s t r o f i t i l a n t e i s s a + l u o n n o n k a t a s t r o f i t y y p p e j ä + l u o n n o n k a u n e u d e s t a + l u o n n o n k a u n e u s + l u o n n o n k a u n i i l l a + l u o n n o n k a u n i i t + l u o n n o n k a u n i i t a + l u o n n o n k a u n i s + l u o n n o n k a u n i s t a + l u o n n o n k i e r t o k a t t i l a + l u o n n o n k i v e n + l u o n n o n k i v e ä + l u o n n o n k i v i t u o t t e i d e n + l u o n n o n k u i d u t + l u o n n o n k u i t u + l u o n n o n k u i t u j e n + l u o n n o n l a b o r a t o r i o i s s a + l u o n n o n l a e i l l e + l u o n n o n l a e i s s a + l u o n n o n l a i k s i + l u o n n o n l a i n + l u o n n o n l a i t + l u o n n o n l a k e j a + l u o n n o n l a k i + l u o n n o n l a k i a + l u o n n o n l a k i e n + l u o n n o n l a k i i n + l u o n n o n l a n n o i t t e e n + l u o n n o n l o h e e n + l u o n n o n l o h e n + l u o n n o n l o h i + l u o n n o n l o h i a + l u o n n o n l o h i e n + l u o n n o n l o h i k a n n a l l e + l u o n n o n l o h i k a n n o i s t a + l u o n n o n l o h i k a n t a + l u o n n o n l o h i k a n t o j a + l u o n n o n l o h i k s i + l u o n n o n l ä ä k e t i e t e e n + l u o n n o n m a a i l m a n + l u o n n o n m a a n t i e t e e l l i s i ä + l u o n n o n m a i s e m a + l u o n n o n m a i s e m a l l a + l u o n n o n m a i s e m a n + l u o n n o n m a i s e m i a + l u o n n o n m a t e r i a a l e j a + l u o n n o n m a t e r i a a l i + l u o n n o n m e t s i e n + l u o n n o n m e t s ä s t ä + l u o n n o n m e t s ä t + l u o n n o n m o n o p o l i a + l u o n n o n m u i s t o m e r k k i + l u o n n o n m u k a i n e n + l u o n n o n m u k a i s e e n + l u o n n o n m u k a i s e k s i + l u o n n o n m u k a i s e l l a + l u o n n o n m u k a i s e l l e + l u o n n o n m u k a i s e l t a + l u o n n o n m u k a i s e m m a n + l u o n n o n m u k a i s e m p a a + l u o n n o n m u k a i s e m p i a + l u o n n o n m u k a i s e n + l u o n n o n m u k a i s e s s a + l u o n n o n m u k a i s e s t a + l u o n n o n m u k a i s e s t i + l u o n n o n m u k a i s i a + l u o n n o n m u k a i s i l l e + l u o n n o n m u k a i s i n + l u o n n o n m u k a i s i s s a + l u o n n o n m u k a i s i s t a + l u o n n o n m u k a i s t a + l u o n n o n m u k a i s t e n + l u o n n o n m u k a i s u u d e s t a + l u o n n o n m u k a i s u u s + l u o n n o n m u k a i s u u t t a + l u o n n o n m u l l i s t u k s e k s i + l u o n n o n m u l l i s t u k s e n + l u o n n o n m u l l i s t u k s e s t a + l u o n n o n m u l l i s t u k s e t + l u o n n o n m u l l i s t u k s i a + l u o n n o n m u l l i s t u k s i a h a n + l u o n n o n m u l l i s t u k s i e n + l u o n n o n m u l l i s t u k s i l l e + l u o n n o n m u l l i s t u k s i n a + l u o n n o n m u l l i s t u k s i s t a + l u o n n o n m u l l i s t u s + l u o n n o n m u l l i s t u s t e n + l u o n n o n o i k e u d e n + l u o n n o n o i k e u s + l u o n n o n o i k e u t t a + l u o n n o n o l o i h i n + l u o n n o n o l o i s t a + l u o n n o n o l o j e n + l u o n n o n o l o s u h t e e t + l u o n n o n o l o s u h t e i d e n + l u o n n o n o l o s u h t e i l t a a n + l u o n n o n o l o s u h t e i s s a + l u o n n o n o l o s u h t e i s t a + l u o n n o n o l o s u h t e i t a + l u o n n o n o l o t + l u o n n o n o m i n a i s u u k s i i n + l u o n n o n o n g e l m a + l u o n n o n o n g e l m i e n + l u o n n o n o n n e t t o m u u d e n + l u o n n o n o n n e t t o m u u d e s t a + l u o n n o n o n n e t t o m u u d e t + l u o n n o n o n n e t t o m u u k s i a + l u o n n o n o n n e t t o m u u k s i e n + l u o n n o n o n n e t t o m u u k s i i n + l u o n n o n o n n e t t o m u u k s i l t a + l u o n n o n o n n e t t o m u u k s i s t a + l u o n n o n o n n e t t o m u u s + l u o n n o n p a l v o n t a + l u o n n o n p e r i n n ö l l e + l u o n n o n p e r i n n ö n + l u o n n o n p e r i n n ö s t ä m m e + l u o n n o n p e r i n n ö t + l u o n n o n p e r i n t ö + l u o n n o n p e r i n t ö m m e + l u o n n o n p e r i n t ö n ä + l u o n n o n p e r i n t ö s ä ä t i ö + l u o n n o n p e r i n t ö ä + l u o n n o n p e r i n t ö ä m m e + l u o n n o n p e r i n t ö ä ä n + l u o n n o n p e r i n t ö ö n + l u o n n o n p u i s t o + l u o n n o n p u i s t o a + l u o n n o n p u i s t o i h i n + l u o n n o n p u i s t o j a + l u o n n o n p u i s t o n + l u o n n o n p u i s t o o n + l u o n n o n p u i s t o s s a + l u o n n o n p ä ä o m a a + l u o n n o n r e s e r v e j ä + l u o n n o n r e s u r s s e i s t a + l u o n n o n r i k k a u d e t + l u o n n o n r i k k a u k s i a + l u o n n o n r i k k a u k s i a a n + l u o n n o n r i k k a u k s i a m m e + l u o n n o n r i k k a u k s i e n + l u o n n o n r i k k a u k s i i n + l u o n n o n r i k k a u k s i l t a a n + l u o n n o n r i k k a u k s i s t a + l u o n n o n r i k k a u s + l u o n n o n r i s k i e n + l u o n n o n s u o j e l i j a + l u o n n o n s u o j e l i j a r y h m ä t + l u o n n o n s u o j e l i j a t k i n + l u o n n o n s u o j e l i j o i d e n + l u o n n o n s u o j e l u + l u o n n o n s u o j e l u a + l u o n n o n s u o j e l u a l o i t e + l u o n n o n s u o j e l u a l u e + l u o n n o n s u o j e l u a l u e e k s i + l u o n n o n s u o j e l u a l u e e l l a + l u o n n o n s u o j e l u a l u e e l l e + l u o n n o n s u o j e l u a l u e e t + l u o n n o n s u o j e l u a l u e i d e n + l u o n n o n s u o j e l u a l u e i l l a + l u o n n o n s u o j e l u a l u e i l l e + l u o n n o n s u o j e l u a l u e i s i i n + l u o n n o n s u o j e l u a l u e i s t a + l u o n n o n s u o j e l u a l u e i t a + l u o n n o n s u o j e l u a l u e t t a + l u o n n o n s u o j e l u d i r e k t i i v i e n + l u o n n o n s u o j e l u d i r e k t i i v i t + l u o n n o n s u o j e l u j ä r j e s t ö + l u o n n o n s u o j e l u j ä r j e s t ö j e n + l u o n n o n s u o j e l u j ä r j e s t ö s s ä + l u o n n o n s u o j e l u k a t a s t r o f e i s t a + l u o n n o n s u o j e l u l a i n s ä ä d ä n t ö + l u o n n o n s u o j e l u l i i t o n + l u o n n o n s u o j e l u l i i t t o + l u o n n o n s u o j e l u l l e + l u o n n o n s u o j e l u n + l u o n n o n s u o j e l u o h j e l m i i n + l u o n n o n s u o j e l u p o l i i t t i s e s t i + l u o n n o n s u o j e l u p o l i t i i k a n + l u o n n o n s u o j e l u p o l i t i i k k a a + l u o n n o n s u o j e l u p o l i t i i k k a a n + l u o n n o n s u o j e l u s s a + l u o n n o n s u o j e l u s t a + l u o n n o n s u o j e l u s ä ä t i ö n + l u o n n o n s u o j e l u t a r k o i t u k s i i n + l u o n n o n s u o j e l u t a v o i t t e i d e n + l u o n n o n s u o j e l u t o i m i a + l u o n n o n s u o j e l u u n + l u o n n o n s u o j e l u v e r k o s t o l l a + l u o n n o n s u o j e l u v i r a n o m a i s i i n + l u o n n o n s u o j e l u y h d i s t y k s e n + l u o n n o n s ä t e i l y n + l u o n n o n s ä t e i l y r i s k i + l u o n n o n s ä t e i l y y n + l u o n n o n s ä t e i l y ä + l u o n n o n s ä ä t i ö n + l u o n n o n t a l o u d e n + l u o n n o n t a p a h t u m a + l u o n n o n t a p a h t u m a n + l u o n n o n t a s a p a i n o n + l u o n n o n t i e d e + l u o n n o n t i e t e e n + l u o n n o n t i e t e e s e e n + l u o n n o n t i e t e i d e n + l u o n n o n t i e t e i l i j ä + l u o n n o n t i e t e i s i i n + l u o n n o n t i e t e i s s ä + l u o n n o n t i e t e i s t ä + l u o n n o n t i l a + l u o n n o n t i l a a n + l u o n n o n t i l a i s e n a + l u o n n o n t i l a s s a + l u o n n o n t u h o i s t a + l u o n n o n t u h o j a + l u o n n o n t u h o j e n + l u o n n o n t u h o n + l u o n n o n t u h o t + l u o n n o n t u o t e + l u o n n o n t u o t t e e l l a + l u o n n o n t u o t t e e n a + l u o n n o n t u o t t e e t + l u o n n o n t u o t t e i d e n + l u o n n o n t u o t t e i s i i n + l u o n n o n t u o t t e i s t a + l u o n n o n t u o t t e i t a + l u o n n o n u r a a n i a + l u o n n o n u r a a n i s s a + l u o n n o n u s k o n t o + l u o n n o n v a k i o + l u o n n o n v a l i n n a n + l u o n n o n v a l i n t a + l u o n n o n v a l i n t a a n + l u o n n o n v a l o n + l u o n n o n v a l o v i i t t a u s t e n + l u o n n o n v a r a + l u o n n o n v a r a a + l u o n n o n v a r a a m m e + l u o n n o n v a r a i s e e n + l u o n n o n v a r a i s e t + l u o n n o n v a r a i s i a + l u o n n o n v a r a i s i s t a + l u o n n o n v a r a i s t e n + l u o n n o n v a r a i s u u t e e n + l u o n n o n v a r a k a n t a a + l u o n n o n v a r a k i r o u s + l u o n n o n v a r a k s i + l u o n n o n v a r a k u s t a n n u k s e t + l u o n n o n v a r a k u s t a n n u k s i a + l u o n n o n v a r a m m e + l u o n n o n v a r a n + l u o n n o n v a r a n a + l u o n n o n v a r a n s a + l u o n n o n v a r a p e r u s t a a + l u o n n o n v a r a p e r u s t e i s i i n + l u o n n o n v a r a s t r a t e g i a + l u o n n o n v a r a s t r a t e g i a a n + l u o n n o n v a r a t + l u o n n o n v a r a v a r a s t o j e n + l u o n n o n v a r o i h i n + l u o n n o n v a r o i h i n s a + l u o n n o n v a r o i l l a + l u o n n o n v a r o i l l e + l u o n n o n v a r o i l l e m m e + l u o n n o n v a r o i l t a a n + l u o n n o n v a r o i s t a + l u o n n o n v a r o i s t a a n + l u o n n o n v a r o j a + l u o n n o n v a r o j a a n + l u o n n o n v a r o j a m m e + l u o n n o n v a r o j e m m e + l u o n n o n v a r o j e n + l u o n n o n v a r o j e n s a + l u o n n o n v a s t a i s e s t a + l u o n n o n v a s t a i s i s t a + l u o n n o n v a s t a i s t a + l u o n n o n v e s i + l u o n n o n v e s i e n + l u o n n o n v o i m a + l u o n n o n v o i m a n + l u o n n o n v o i m a t + l u o n n o n v o i m i a + l u o n n o n v o i m i e n + l u o n n o n v o i m i i n + l u o n n o n v o i m i s t a + l u o n n o n y m p ä r i s t ö + l u o n n o n y m p ä r i s t ö i s t ä + l u o n n o n y m p ä r i s t ö j e m m e + l u o n n o n y m p ä r i s t ö j ä + l u o n n o n y m p ä r i s t ö l l e + l u o n n o n y m p ä r i s t ö n + l u o n n o n y m p ä r i s t ö s s ä + l u o n n o n y m p ä r i s t ö s t ä + l u o n n o n y m p ä r i s t ö t + l u o n n o n y m p ä r i s t ö ä + l u o n n o n y m p ä r i s t ö ö n + l u o n n o n y m p ä r i s t ö ö n s ä + l u o n n o n y r t t i l ä ä k k e i t ä + l u o n n o n y s t ä v i l l e + l u o n n o s a s i a k i r j a + l u o n n o s a s i a k i r j a a + l u o n n o s a s i a k i r j a a n + l u o n n o s a s t e e l l a + l u o n n o s e h d o t u k s e l l a + l u o n n o s e h d o t u k s e t + l u o n n o s s a + l u o n n o s s u u n t a v i i v o i s s a + l u o n n o s t a a n + l u o n n o s t e k s t e j ä + l u o n n o s t e k s t i + l u o n n o s t e k s t i n + l u o n n o s t e k s t i s s ä + l u o n n o s t e k s t i ä + l u o n n o s t e l t i i n + l u o n n o s t e l u v a i h e e s s a + l u o n n o s t e l u v i r h e + l u o n n o s v a i h e e s s a + l u o n n o s v a l m i s t e l u i s s a + l u o n n o t t o m a t + l u o n n o t t o m i a + l u o n t a i s h o i t o m e n e t e l m i i n + l u o n t a i s t a l o u s + l u o n t e e l l e + l u o n t e e l t a a n + l u o n t e e n + l u o n t e e n o m a i s t a + l u o n t e e n p i i r t e i t ä + l u o n t e e n s a + l u o n t e e n s a k i n + l u o n t e e s e e n + l u o n t e e s t a + l u o n t e i d e n + l u o n t e v a a + l u o n t e v a m m i k s i + l u o n t e v a m m i n + l u o n t e v a m p a a + l u o n t e v i m m i n + l u o n t i a + l u o n t i i n + l u o n t o a + l u o n t o a l u e e m m e + l u o n t o a l u e i d e n + l u o n t o a l u e i t a + l u o n t o a s i o i s t a + l u o n t o d i r e k t i i v i + l u o n t o d i r e k t i i v i l l ä + l u o n t o d i r e k t i i v i n + l u o n t o d i r e k t i i v i ä + l u o n t o e l o k u v a + l u o n t o i s e t u + l u o n t o i s s u o r i t u k s e t + l u o n t o i s s u o r i t u k s i a + l u o n t o i s s u o r i t u k s i l l a + l u o n t o i s s u o r i t u s + l u o n t o i s s u o r i t u s t a + l u o n t o j ä r j e s t ö t k i n + l u o n t o k a p p a l e e n + l u o n t o k a p p a l e e t + l u o n t o k a p p a l e i n a + l u o n t o k u v a a j a t + l u o n t o k ä s i t y k s e m m e + l u o n t o m a t k a i l u y r i t t ä j y y d e n + l u o n t o m y ö n t e i s i ä + l u o n t o o n + l u o n t o p e r i n n ö n + l u o n t o p o l i t i i k k a a + l u o n t o s u u n n i t t e l u v i r a s t o + l u o n t o t y p p i d i r e k t i i v i n + l u o n t o t y y p i n + l u o n t o t y y p i t + l u o n t o t y y p p e j ä + l u o n t o t y y p p i a l u e i d e n + l u o n t o t y y p p i d i r e k t i i v e i l l ä ä n + l u o n t o t y y p p i d i r e k t i i v e j ä + l u o n t o t y y p p i d i r e k t i i v i + l u o n t o t y y p p i d i r e k t i i v i e n + l u o n t o t y y p p i d i r e k t i i v i i n + l u o n t o t y y p p i d i r e k t i i v i l l ä + l u o n t o t y y p p i d i r e k t i i v i m m e + l u o n t o t y y p p i d i r e k t i i v i n + l u o n t o t y y p p i d i r e k t i i v i s s ä + l u o n t o t y y p p i d i r e k t i i v i s t ä + l u o n t o t y y p p i d i r e k t i i v i ä + l u o n t o t y y p p i e n + l u o n t o t y y p p i k o m i t e a n + l u o n t o v a l o k u v a u s + l u o n t o y m p ä r i s t ö + l u o n t o y m p ä r i s t ö ö n + l u o n t o y s t ä v ä l l i s e m m ä n + l u o n t o y s t ä v ä l l i s e m p ä ä + l u o n t o y s t ä v ä l l i s t ä + l u o n t o ä i d i n + l u o n t o ä i t i ä + l u o p i o m a a k u n n a t + l u o p i o m a a k u n t i a + l u o p i o v a l t i o t a + l u o p u a + l u o p u e s s a a n + l u o p u i + l u o p u i s i + l u o p u i s i m m e + l u o p u i s i v a t + l u o p u k a a + l u o p u k a a m m e + l u o p u k o + l u o p u m a a n + l u o p u m a l l a + l u o p u m a s s a + l u o p u m a t t a + l u o p u m i s e k s i + l u o p u m i s h i n t a + l u o p u m i s i l m o i t u k s i a + l u o p u m i s i l m o i t u s t a + l u o p u m i s j ä r j e s t e l y y n + l u o p u m i s p o l i t i i k k a a + l u o p u m i s p r o s e s s i a + l u o p u m i s p ä i v ä m ä ä r i ä + l u o p u m i s s u u n n i t e l m a a + l u o p u m i s t a + l u o p u m i s t u k e a + l u o p u u + l u o p u u k o + l u o p u v a n s a + l u o p u v a t + l u o p u v i a + l u o s t a r i i n + l u o s t a r i k o k o n a i s u u s + l u o s t a r i k o u l u + l u o s t a r i p a n i m o + l u o s t a r i t + l u o t a e s s a + l u o t a i n r a k e t t i + l u o t a i s i i n + l u o t a i s i i n k i n + l u o t a k a a n + l u o t a m m e + l u o t a m m e k i n + l u o t a n + l u o t a n k i n + l u o t a t t e + l u o t a t t e k o + l u o t a v a + l u o t a v a k s i + l u o t e i s a l u e e l l e + l u o t e i s a l u e e l t a + l u o t e i s a l u e e s e e n + l u o t e i s a l u e i d e n + l u o t e i s a l u e i l l a + l u o t e i s a r m e i j a + l u o t e i s k a u k a s i a l a i s e t + l u o t e i s m a a k u n t a + l u o t e i s o s a + l u o t e i s o s a a + l u o t e i s o s a n + l u o t e i s o s a s s a + l u o t e i s o s i e n + l u o t e i s o s i s s a + l u o t e i s p r o v i n s s i s s a + l u o t e i s p u o l e l l a + l u o t e i s r a j a + l u o t e i s r a j a l l a + l u o t e i s r a j a n + l u o t e i s r a n n i k o l l a + l u o t e i s r e i t t i + l u o t e i s r e i t t i i n + l u o t e i s r e u n a n + l u o t e i s t e r r i t o r i o + l u o t e i s t e r r i t o r i o i d e n + l u o t e i s t e r r i t o r i o t + l u o t e i s v ä y l ä + l u o t e i s v ä y l ä n + l u o t e t a + l u o t e t a a n + l u o t e t t a v a a + l u o t e t t a v a k s i + l u o t e t t a v a m m a l l a + l u o t e t t a v a m m a n + l u o t e t t a v a m m a s t a + l u o t e t t a v a m m a t + l u o t e t t a v a m m i k s i + l u o t e t t a v a m m i n + l u o t e t t a v a m p a a + l u o t e t t a v a m p i + l u o t e t t a v a m p i a + l u o t e t t a v a m p i e n + l u o t e t t a v a m p i i n + l u o t e t t a v a m p i n a + l u o t e t t a v a n + l u o t e t t a v a n a + l u o t e t t a v a t + l u o t e t t a v i a + l u o t e t t a v i e n + l u o t e t t a v i i n + l u o t e t t a v i m m i n + l u o t e t t a v i m m i s t a + l u o t e t t a v i m p i a + l u o t e t t a v i m p i e n + l u o t e t t a v i m p i i n + l u o t e t t a v i n + l u o t e t t a v i n a + l u o t e t t a v i n t a + l u o t e t t a v i s t a + l u o t e t t a v u u d e s t a + l u o t e t t a v u u s m e r k i n n ä t + l u o t e t t a v u u s m e r k i n t ä j ä r j e s t e l m ä n + l u o t e t t a v u u s m e r k k e j ä + l u o t e t t a v u u s m e r k k i + l u o t e t t a v u u s m e r k k i ä + l u o t e t t a v u u s t e k n i i k k a + l u o t e t t a v u u s t e s t i n + l u o t e t t a v u u t e e n + l u o t e t t a v u u t t a + l u o t i i n + l u o t i j u n a j ä r j e s t e l m ä + l u o t i j u n a l i i k e n t e e n + l u o t i j u n a v e r k o n + l u o t i j u n i a + l u o t i j u n i e n + l u o t i s a t e e n + l u o t o k i r v i n e n + l u o t o n + l u o t o n a n n o n + l u o t o n a n n o s s a + l u o t o n a n n o s t a + l u o t o n a n t a j a + l u o t o n a n t a j a h a l l i t u s t e n + l u o t o n a n t a j a t + l u o t o n a n t a j a y r i t y k s i l l e + l u o t o n a n t a j i a + l u o t o n a n t a j i e n + l u o t o n a n t a j i i n + l u o t o n a n t a m i s e e n + l u o t o n a n t o + l u o t o n a n t o a + l u o t o n a n t o a a n + l u o t o n a n t o j ä r j e s t e l m ä l l ä + l u o t o n a n t o j ä r j e s t e l m ä n + l u o t o n a n t o k a p a s i t e e t t i + l u o t o n a n t o k a p a s i t e e t t i a + l u o t o n a n t o l a i t o k s i l l e + l u o t o n a n t o m e k a n i s m i s s a m m e + l u o t o n a n t o p a n k i n + l u o t o n a n t o p o l i t i i k a n + l u o t o n a n t o p o l i t i i k a s t a + l u o t o n a n t o p o l i t i i k k a a + l u o t o n a n t o p o l i t i i k k a a n + l u o t o n a n t o t o i m i n n a n + l u o t o n o t t a j a r y h m i e n + l u o t o n o t t o k a p a s i t e e t t i a + l u o t o n o t t o m a h d o l l i s u u k s i a + l u o t o n s a a j a t + l u o t o n s a a n n i n + l u o t o n s a a n n i s s a + l u o t o n s a a n t i + l u o t o n s a a n t i a + l u o t o n s a a n t i i n + l u o t o n s a a n t i m a h d o l l i s u u d e t + l u o t o n s a a n t i m a h d o l l i s u u k s i a + l u o t o n s a a n t i m a h d o l l i s u u k s i e n + l u o t o n s a a n t i t i l a n t e e s s a + l u o t o n s a a n t i v a i k e u k s i e n + l u o t o n t a r j o a j i a + l u o t o n v ä l i t t ä j i i n + l u o t o n v ä l i t y s t e n + l u o t o t u s m a r k k i n a t + l u o t o t u s m a r k k i n o i l l a + l u o t o t u s p o l i t i i k a n + l u o t o t u s p o l i t i i k a s t a + l u o t s a a v a t + l u o t s a u k s e s t a + l u o t s a u s j ä r j e s t e l m ä t + l u o t s a u s p a l v e l u i l l a + l u o t s a u s p a l v e l u i l l e + l u o t s a u s p a l v e l u i s t a + l u o t s a u s p a l v e l u i t a + l u o t s a u s p a l v e l u j a + l u o t s a u s p a l v e l u j e n + l u o t s a u s p a l v e l u t + l u o t s a u s t a + l u o t s a u s v e l v o l l i s u u s + l u o t s e j a + l u o t s i a + l u o t s i a l u k s e n + l u o t s i p a l v e l u i l l e + l u o t s i p a l v e l u i s t a + l u o t s i p a l v e l u j a + l u o t s i p a l v e l u n + l u o t s i t + l u o t t a a + l u o t t a e n + l u o t t a i s i + l u o t t a i s i m m e + l u o t t a i s i n + l u o t t a i s i v a t + l u o t t a k a a + l u o t t a k a a m m e + l u o t t a m a a n + l u o t t a m u k s e e n + l u o t t a m u k s e k s i + l u o t t a m u k s e l l e + l u o t t a m u k s e l l i s e m m a n + l u o t t a m u k s e l l i s e n + l u o t t a m u k s e l l i s e n a + l u o t t a m u k s e l l i s e t + l u o t t a m u k s e l l i s i a + l u o t t a m u k s e l l i s i n a + l u o t t a m u k s e l l i s t a + l u o t t a m u k s e l l i s u u d e n + l u o t t a m u k s e l l i s u u d e s t a + l u o t t a m u k s e l l i s u u s a s i a n + l u o t t a m u k s e l l i s u u s l a u s e k k e e n + l u o t t a m u k s e l l i s u u s l a u s e k k e e s t a + l u o t t a m u k s e l l i s u u s l a u s e k k e i t a + l u o t t a m u k s e l l i s u u s p e r i a a t t e e n + l u o t t a m u k s e l l i s u u s s i t o u m u s t a + l u o t t a m u k s e l l i s u u s s o p i m u k s e n + l u o t t a m u k s e l l i s u u s s y i s t ä + l u o t t a m u k s e l l i s u u s s ä ä n n ö t + l u o t t a m u k s e l l i s u u s s ä ä n t ö j ä + l u o t t a m u k s e l l i s u u s v a a t i m u k s i a + l u o t t a m u k s e l l i s u u s v e l v o i t t e i d e n + l u o t t a m u k s e l l i s u u t t a + l u o t t a m u k s e m m e + l u o t t a m u k s e n + l u o t t a m u k s e n n e + l u o t t a m u k s e n o s o i t u k s e n a + l u o t t a m u k s e n o s o i t u k s i a + l u o t t a m u k s e n o s o i t u s + l u o t t a m u k s e n s a + l u o t t a m u k s e s t a + l u o t t a m u s a s i a n a + l u o t t a m u s e l e e k s i + l u o t t a m u s e l i m e t + l u o t t a m u s e l i n + l u o t t a m u s h e n k i l ö i l l e + l u o t t a m u s h e n k i l ö i n ä + l u o t t a m u s h e n k i l ö j e n + l u o t t a m u s h e n k i l ö t + l u o t t a m u s h e n k i l ö ä + l u o t t a m u s h ä i r i ö + l u o t t a m u s k a t o a + l u o t t a m u s k e s k u s t e l u + l u o t t a m u s k i n + l u o t t a m u s k r i i s i + l u o t t a m u s k r i i s i i n + l u o t t a m u s k r i i s i k s i + l u o t t a m u s k r i i s i l l e + l u o t t a m u s k r i i s i l l ä + l u o t t a m u s k r i i s i n + l u o t t a m u s k r i i s i s s ä + l u o t t a m u s k r i i s i s t ä + l u o t t a m u s k r i i s i ä + l u o t t a m u s k u i l u n + l u o t t a m u s k y s y m y k s e e n + l u o t t a m u s k y s y m y k s i ä + l u o t t a m u s k y s y m y s + l u o t t a m u s l a u s e + l u o t t a m u s l a u s e e m m e + l u o t t a m u s l a u s e e n + l u o t t a m u s l a u s e e n s a + l u o t t a m u s l a u s e t t a + l u o t t a m u s l a u s e t t a a n + l u o t t a m u s l a u s e ä ä n e s t y k s e n + l u o t t a m u s l a u s e ä ä n e s t y k s e s s ä + l u o t t a m u s l a u s e ä ä n e s t y k s e s t ä + l u o t t a m u s l a u s e ä ä n e s t y s + l u o t t a m u s m e r k i n t ä j ä r j e s t e l m ä n + l u o t t a m u s m i e h e n + l u o t t a m u s m i e h e t + l u o t t a m u s m i e h i l l e + l u o t t a m u s m i e h i ä + l u o t t a m u s m i e s + l u o t t a m u s o n g e l m a + l u o t t a m u s o n g e l m a a + l u o t t a m u s o n g e l m a n + l u o t t a m u s o n g e l m i e n + l u o t t a m u s p o h j a + l u o t t a m u s p o h j a n + l u o t t a m u s p u l a + l u o t t a m u s p u l a a + l u o t t a m u s p u l a a n + l u o t t a m u s p u l a l l a + l u o t t a m u s p u l a n + l u o t t a m u s p u l a s t a + l u o t t a m u s s o p i m u k s e e n + l u o t t a m u s s o p i m u k s e n + l u o t t a m u s s o p i m u k s e s s a + l u o t t a m u s s o p i m u k s e s t a + l u o t t a m u s s o p i m u k s e t + l u o t t a m u s s o p i m u s + l u o t t a m u s s o p i m u s j ä r j e s t e l y j e n + l u o t t a m u s s o p i m u s t a + l u o t t a m u s s u h d e + l u o t t a m u s s u h d e t t a + l u o t t a m u s s u h t e e n + l u o t t a m u s s u h t e e s s a + l u o t t a m u s s u h t e e s t a + l u o t t a m u s s u h t e e t + l u o t t a m u s s u h t e i t a + l u o t t a m u s s u u n n i t e l m a a + l u o t t a m u s s ä ä n t ö ö n + l u o t t a m u s t a + l u o t t a m u s t a a n + l u o t t a m u s t a m m e + l u o t t a m u s t a n i + l u o t t a m u s t e h t ä v ä n + l u o t t a m u s t o i m i e n + l u o t t a m u s v a j e + l u o t t a m u s v a j e e n + l u o t t a m u s v a j e t t a + l u o t t a m u s v ä l i + l u o t t a m u s ä ä n e n + l u o t t a m u s ä ä n e s t y k s e l l ä + l u o t t a m u s ä ä n e s t y k s e l l ä ä n + l u o t t a m u s ä ä n e s t y k s e s s ä + l u o t t a m u s ä ä n e s t y k s e s t ä + l u o t t a m u s ä ä n e s t y s + l u o t t a m u s ä ä n e s t y s t ä + l u o t t a v a i s e m m a l l a + l u o t t a v a i s e m m a n + l u o t t a v a i s e m m i n + l u o t t a v a i s e m p a n a + l u o t t a v a i s e m p i + l u o t t a v a i s e m p i a + l u o t t a v a i s i k s i + l u o t t a v a i s i n + l u o t t a v a i s i n a + l u o t t a v a t + l u o t t e + l u o t t o a + l u o t t o a l a a + l u o t t o a l a l l a + l u o t t o a r v i o i d e n + l u o t t o a s i o i s s a + l u o t t o e h d o i s t a + l u o t t o e h d o t + l u o t t o e h t o j a + l u o t t o h a n o j e n + l u o t t o i h i n + l u o t t o i n a + l u o t t o j a + l u o t t o j e n + l u o t t o j o h d a n n a i s i a + l u o t t o j o h d a n n a i s i i n + l u o t t o j o h d a n n a i s i l l a + l u o t t o j o h d a n n a i s m a r k k i n o i d e n + l u o t t o j o h d a n n a i s t e n + l u o t t o j ä r j e s t e l m ä + l u o t t o j ä r j e s t e l m ä n + l u o t t o j ä r j e s t e l m ä ä n + l u o t t o j ä r j e s t e l y i s t ä + l u o t t o j ä r j e s t e l y n + l u o t t o j ä r j e s t e l y t + l u o t t o j ä r j e s t e l y ä + l u o t t o k a n a v i e n + l u o t t o k a t t o + l u o t t o k e l p o i s i a + l u o t t o k e l p o i s u u s + l u o t t o k e l p o i s u u s a r v i o i n n i n + l u o t t o k e l p o i s u u s l a i t o s t e n + l u o t t o k e l p o i s u u s l u o k i t u k s e e n s a + l u o t t o k e l p o i s u u s l u o k i t u k s e n + l u o t t o k e l p o i s u u s l u o k i t u k s e s t a + l u o t t o k e l p o i s u u s l u o k i t u s + l u o t t o k e l p o i s u u s l u o k i t u s l a i t o k s i e n + l u o t t o k e l p o i s u u s l u o k i t u s l a i t o s t e n + l u o t t o k e l p o i s u u s l u o k i t u s t e n + l u o t t o k e l p o i s u u s v a a t i m u k s i l l a + l u o t t o k e l p o i s u u t t a + l u o t t o k e l p o i s u u t t a a n + l u o t t o k o r k o + l u o t t o k o r k o a + l u o t t o k o r k o j e n + l u o t t o k o r t e i s t a + l u o t t o k o r t i l l a + l u o t t o k o r t i n + l u o t t o k o r t i t + l u o t t o k o r t t e i h i n + l u o t t o k o r t t e j a + l u o t t o k o r t t e j a a n + l u o t t o k o r t t e j a n i + l u o t t o k o r t t i + l u o t t o k o r t t i a + l u o t t o k o r t t i a n i + l u o t t o k o r t t i e n + l u o t t o k o r t t i j ä r j e s t e l m ä n + l u o t t o k o r t t i j ä r j e s t ö + l u o t t o k o r t t i k a u p a n + l u o t t o k o r t t i k a u p p o j a + l u o t t o k o r t t i k i e r r o n + l u o t t o k o r t t i k o k o i n e n + l u o t t o k o r t t i k o k o o n + l u o t t o k o r t t i m a i n e n + l u o t t o k o r t t i m a k s u + l u o t t o k o r t t i m a k s u j a + l u o t t o k o r t t i m a k s u j e n + l u o t t o k o r t t i m a k s u t + l u o t t o k o r t t i m a l l i n e n + l u o t t o k o r t t i m a l l i s t a + l u o t t o k o r t t i m a r k k i n a t + l u o t t o k o r t t i m e n o j a + l u o t t o k o r t t i m u o t o o n + l u o t t o k o r t t i n s a + l u o t t o k o r t t i n u m e r o i t a + l u o t t o k o r t t i n u m e r o t + l u o t t o k o r t t i o s t o j e n + l u o t t o k o r t t i p e t o k s e t + l u o t t o k o r t t i p e t o k s i i n + l u o t t o k o r t t i p e t o k s i l t a + l u o t t o k o r t t i p e t o k s i s s a + l u o t t o k o r t t i p e t o k s i s t a + l u o t t o k o r t t i p e t o s t e n + l u o t t o k o r t t i r i k o k s i s t a + l u o t t o k o r t t i r i k o l l i s u u t e e n + l u o t t o k o r t t i r i k o l l i s u u t t a + l u o t t o k o r t t i t i e d o t + l u o t t o k o r t t i t i e t o j a + l u o t t o k o r t t i t i e t o j e n + l u o t t o k o r t t i t i e t o v a r k a u s + l u o t t o k o r t t i t o i m i a l a l l a + l u o t t o k o r t t i t o i m i a l a n + l u o t t o k o r t t i v a r k a u t t a + l u o t t o k o r t t i y h t i ö i d e n + l u o t t o k o r t t i y h t i ö i s t ä + l u o t t o k o r t t i y h t i ö t + l u o t t o k r i i s i + l u o t t o k r i i s i i n + l u o t t o k r i i s i l l ä + l u o t t o k r i i s i n + l u o t t o k r i i s i s s ä + l u o t t o k r i i s i s t ä + l u o t t o k r i i s i ä + l u o t t o k u n t i e n + l u o t t o k u s t a n n u s t e n + l u o t t o l a i t o k s e l t a + l u o t t o l a i t o k s e n + l u o t t o l a i t o k s e t + l u o t t o l a i t o k s i a + l u o t t o l a i t o k s i i n + l u o t t o l a i t o k s i l l e + l u o t t o l a i t o k s i l t a + l u o t t o l a i t o k s i n a + l u o t t o l a i t o k s i s s a + l u o t t o l a i t o k s i s t a + l u o t t o l a i t o s + l u o t t o l a i t o s t e n + l u o t t o l a i t o s t y y p p i ä + l u o t t o l a m a + l u o t t o l a m a a + l u o t t o l a m a a n + l u o t t o l a m a n + l u o t t o l a m a s t a + l u o t t o l o m a k e + l u o t t o l o m a k k e e n + l u o t t o l u o k i t u k s e e n + l u o t t o l u o k i t u k s e n + l u o t t o l u o k i t u k s e n s a + l u o t t o l u o k i t u k s e s t a + l u o t t o l u o k i t u k s e t + l u o t t o l u o k i t u k s i a + l u o t t o l u o k i t u k s i i n + l u o t t o l u o k i t u k s i s s a + l u o t t o l u o k i t u k s i s t a + l u o t t o l u o k i t u s + l u o t t o l u o k i t u s a l a a + l u o t t o l u o k i t u s a l a a n + l u o t t o l u o k i t u s a l a l l a + l u o t t o l u o k i t u s a l a n + l u o t t o l u o k i t u s e l i n + l u o t t o l u o k i t u s k y k y ä + l u o t t o l u o k i t u s l a i t o k s e l l a + l u o t t o l u o k i t u s l a i t o k s e l t a + l u o t t o l u o k i t u s l a i t o k s e n + l u o t t o l u o k i t u s l a i t o k s e s t a + l u o t t o l u o k i t u s l a i t o k s e t + l u o t t o l u o k i t u s l a i t o k s i a + l u o t t o l u o k i t u s l a i t o k s i i n + l u o t t o l u o k i t u s l a i t o k s i l l a + l u o t t o l u o k i t u s l a i t o k s i l l e + l u o t t o l u o k i t u s l a i t o k s i l t a + l u o t t o l u o k i t u s l a i t o k s i s s a + l u o t t o l u o k i t u s l a i t o k s i s t a + l u o t t o l u o k i t u s l a i t o s + l u o t t o l u o k i t u s l a i t o s t a + l u o t t o l u o k i t u s l a i t o s t e n + l u o t t o l u o k i t u s m a l l i n + l u o t t o l u o k i t u s m a r k k i n o i d e n + l u o t t o l u o k i t u s m a r k k i n o i l l a + l u o t t o l u o k i t u s m e n e t t e l y i h i n + l u o t t o l u o k i t u s s ä ä t i ö + l u o t t o l u o k i t u s s ä ä t i ö k s i + l u o t t o l u o k i t u s s ä ä t i ö n + l u o t t o l u o k i t u s t a + l u o t t o l u o k i t u s t e n + l u o t t o l u o k i t u s t o i m i n n a n + l u o t t o l u o k i t u s v i r a s t o n + l u o t t o l u o k i t u s y r i t y s t e n + l u o t t o l ä h t e i t ä + l u o t t o m a h d o l l i s u u k s i a + l u o t t o m a h d o l l i s u u k s i e n + l u o t t o m a r k k i n a t + l u o t t o m a r k k i n o i d e n + l u o t t o m a r k k i n o i l l a + l u o t t o m a r k k i n o i l l e + l u o t t o m a r k k i n o i l t a + l u o t t o m a r k k i n o i t a + l u o t t o m e k a n i s m e j a + l u o t t o m e r k k i + l u o t t o n e u v o t t e l u n + l u o t t o p a l v e l u i d e n + l u o t t o p a n k k i e n + l u o t t o p e t o k s e t + l u o t t o p o l i t i i k a l l a + l u o t t o p o l i t i i k a n + l u o t t o p o l i t i i k a s t a + l u o t t o p o l i t i i k k a a + l u o t t o p o l i t i i k k a a n + l u o t t o p r o f i i l i + l u o t t o p u l a + l u o t t o p u l a a n + l u o t t o p u l a s t a + l u o t t o p y r a m i d i t + l u o t t o p ä ä o m a + l u o t t o r a h a + l u o t t o r a h a s t o j e n + l u o t t o r a h a s t o n + l u o t t o r a h a s t o o n + l u o t t o r a h o i t u s + l u o t t o r a h o i t u s t a + l u o t t o r a j a n + l u o t t o r a j a n s a + l u o t t o r a j o i t u k s e t + l u o t t o r a j o i t u k s i i n + l u o t t o r a j o i t u s t e n + l u o t t o r e k i s t e r e i s t ä + l u o t t o r i s k e i h i n + l u o t t o r i s k e i s t ä + l u o t t o r i s k i a n a l y y s e j ä + l u o t t o r i s k i a r v i o i t a + l u o t t o r i s k i e n + l u o t t o r i s k i j o h d a n n a i s e t + l u o t t o r i s k i j o h d a n n a i s i a + l u o t t o r i s k i j o h d a n n a i s i l l a + l u o t t o r i s k i j o h d a n n a i s i s t a + l u o t t o r i s k i j o h d a n n a i s m a r k k i n o i d e n + l u o t t o r i s k i j o h d a n n a i s t e n + l u o t t o r i s k i l l e + l u o t t o r i s k i n + l u o t t o r i s k i n v a i h t o s o p i m u k s i l l a + l u o t t o r i s k i n v a i h t o s o p i m u k s i l l e + l u o t t o r i s k i v a k u u t u k s i s t a + l u o t t o r i s k i ä + l u o t t o s e k t o r i l l a + l u o t t o s o p i m u k s i a + l u o t t o s o p i m u k s i i n + l u o t t o s o p i m u k s i s s a + l u o t t o s ä ä n n ö k s i ä + l u o t t o t a k u i d e n + l u o t t o t a k u i l l e + l u o t t o t a k u i s i i n + l u o t t o t a k u i t a + l u o t t o t a k u u l a i t o s t e n + l u o t t o t a k u u v a r a u k s i a + l u o t t o t a p a h t u m a a + l u o t t o t a p a h t u m a a n + l u o t t o t a p p i o + l u o t t o t a p p i o i d e n + l u o t t o t a p p i o i l l a + l u o t t o t a p p i o i t a + l u o t t o t a p p i o r i s k i t + l u o t t o t a p p i o t + l u o t t o t a p p i o v a r a u s t e n + l u o t t o t a r j o u k s e n s a + l u o t t o t a r j o u k s i a + l u o t t o t a r j o u k s i i n + l u o t t o t a r j o u s t e n + l u o t t o t a r p e i l l e + l u o t t o t i e d o t + l u o t t o t i e t o + l u o t t o t i e t o h i s t o r i a a + l u o t t o t i e t o j a a n + l u o t t o t i e t o j e n + l u o t t o t i e t o r e k i s t e r i s s ä + l u o t t o t i l a n t e e n + l u o t t o t i l i l l e m m e + l u o t t o t o i m i i n s a + l u o t t o t o i m i n n a n + l u o t t o t u e l l a + l u o t t o t u k e a + l u o t t o t u k e n a + l u o t t o v a k u u k s i a + l u o t t o v a k u u t u k s i a + l u o t t o v a k u u t u k s i i n + l u o t t o v a k u u t u s t a + l u o t t o v i r r a t + l u o t t o v i r t a + l u o t t o v i r t o j e n + l u o t t o v ä l i t t ä j ä + l u o t t o y h t i ö i d e n + l u o t u + l u o t u j a + l u o t u j e n + l u o v a a + l u o v a n + l u o v a n s a + l u o v a s s a + l u o v a s t a + l u o v a t + l u o v e m m i n + l u o v e m p a a + l u o v e m p i + l u o v e m p i a + l u o v i a + l u o v i e n + l u o v i i n + l u o v i m m i s t a + l u o v i s t a + l u o v u m m e + l u o v u n + l u o v u t a a n + l u o v u t e t t a v a + l u o v u t t a a + l u o v u t t a j a j o u k k o + l u o v u t t a j a k s i + l u o v u t t a j a l t a + l u o v u t t a j a m a a n + l u o v u t t a j a m a a t + l u o v u t t a j a n + l u o v u t t a j a p u l a + l u o v u t t a j a r e k i s t e r i i n + l u o v u t t a j a t + l u o v u t t a j i a + l u o v u t t a j i e n + l u o v u t t a j i k s i + l u o v u t t a j i s t a + l u o v u t t a m a a n + l u o v u t t a m a t o n t a + l u o v u t t a m a t t a + l u o v u t t a m a t t o m a n + l u o v u t t a m a t t o m a n a + l u o v u t t a m i s a i k a + l u o v u t t a m i s e d e l l y t y k s i ä + l u o v u t t a m i s e n + l u o v u t t a m i s e s t a + l u o v u t t a m i s j ä r j e s t e l m ä n + l u o v u t t a m i s j ä r j e s t e l y t + l u o v u t t a m i s k y s y m y s + l u o v u t t a m i s k ä y t ä n n ö n + l u o v u t t a m i s m e n e t t e l y + l u o v u t t a m i s m e n e t t e l y i h i n + l u o v u t t a m i s m e n e t t e l y i s t ä + l u o v u t t a m i s m e n e t t e l y j e n + l u o v u t t a m i s m e n e t t e l y j ä + l u o v u t t a m i s m e n e t t e l y n + l u o v u t t a m i s m e n e t t e l y s s ä + l u o v u t t a m i s m e n e t t e l y s t ä + l u o v u t t a m i s m e n e t t e l y t + l u o v u t t a m i s m e n e t t e l y y n + l u o v u t t a m i s m e n e t t e l y ä + l u o v u t t a m i s m ä ä r ä y k s e n + l u o v u t t a m i s m ä ä r ä y k s e s t ä + l u o v u t t a m i s m ä ä r ä y s + l u o v u t t a m i s p y y n t ö j e n + l u o v u t t a m i s s o p i m u k s e n + l u o v u t t a m i s s o p i m u s t a + l u o v u t t a m i s t a + l u o v u t t a m i s t a p a u k s i i n + l u o v u t t a v a t + l u o v u t t u + l u o v u t u k s e l l a + l u o v u t u k s e s s a + l u o v u t u k s e s t a + l u o v u t u k s e t + l u o v u t u k s i a + l u o v u t u k s i i n + l u o v u t u k s i l l a + l u o v u t u k s i s t a + l u o v u t u s a i k o j a + l u o v u t u s a s i o i s s a + l u o v u t u s j ä r j e s t e l m i e n + l u o v u t u s j ä r j e s t e l m ä + l u o v u t u s j ä r j e s t e l m ä s s ä + l u o v u t u s j ä r j e s t e l m ä ä + l u o v u t u s k a a v a k e + l u o v u t u s k ä y t ä n n ö n + l u o v u t u s k ä y t ä n t ö ä + l u o v u t u s l a i n s ä ä d ä n n ö s s ä + l u o v u t u s l a k i i n + l u o v u t u s l e n n o t + l u o v u t u s l e n t o j a + l u o v u t u s m a a h a n + l u o v u t u s m e n e t t e l y + l u o v u t u s m e n e t t e l y i l t ä + l u o v u t u s m e n e t t e l y i s s ä + l u o v u t u s m e n e t t e l y i t ä + l u o v u t u s m e n e t t e l y j e n + l u o v u t u s m e n e t t e l y j ä + l u o v u t u s m e n e t t e l y l l ä + l u o v u t u s m e n e t t e l y n + l u o v u t u s m e n e t t e l y t + l u o v u t u s m e n e t t e l y y n + l u o v u t u s m e n e t t e l y ä + l u o v u t u s m ä ä r i ä ä n + l u o v u t u s m ä ä r ä y k s e n + l u o v u t u s m ä ä r ä y s t ä + l u o v u t u s o h j e l m a + l u o v u t u s o h j e l m a n + l u o v u t u s p r o s e s s i a + l u o v u t u s p r o s e s s i i n + l u o v u t u s p y y n n ö i s t ä + l u o v u t u s p y y n n ö n + l u o v u t u s p y y n n ö t + l u o v u t u s p y y n t ö + l u o v u t u s p y y n t ö j e n + l u o v u t u s p y y n t ö j ä + l u o v u t u s p y y n t ö n s ä + l u o v u t u s p y y n t ö ä + l u o v u t u s p y y n t ö ö n + l u o v u t u s s o p i m u k s e e n + l u o v u t u s s o p i m u k s e n + l u o v u t u s s o p i m u k s e s s a + l u o v u t u s s o p i m u k s e s t a + l u o v u t u s s o p i m u k s e t + l u o v u t u s s o p i m u k s i a + l u o v u t u s s o p i m u k s i i n + l u o v u t u s s o p i m u k s i s s a + l u o v u t u s s o p i m u s + l u o v u t u s s o p i m u s l u o n n o k s e n + l u o v u t u s s o p i m u s l u o n n o s + l u o v u t u s s o p i m u s l u o n n o s t a + l u o v u t u s s o p i m u s t a + l u o v u t u s s o p i m u s t e n + l u o v u t u s s ä ä n n ö i s t ä + l u o v u t u s t a + l u o v u t u s t o i m i n n a n + l u o v u t u s u l a i n s ä ä d ä n n ö n + l u o v u t u s v e l v o l l i s u u s + l u o v u t u s v e r k o s t o s t a + l u o v u u d e l l a + l u o v u u d e l l e + l u o v u u d e n + l u o v u u s k a p a s i t e e t t i + l u o v u u s p o t e n t i a a l i a + l u o v u u s p o t e n t i a a l i l l e + l u o v u u s t a s o m m e + l u o v u u s t e k n i i k k a + l u o v u u s v e r k o s t o n + l u o v u u t e n s a + l u o v u u t t a + l u o v u u t t a m m e + l u p a a m a l l a + l u p a a m a m m e + l u p a a m a n + l u p a a m a t t a + l u p a a m i e n s a + l u p a a m m e + l u p a a n + l u p a a v a a + l u p a a v a a n + l u p a a v a l l a + l u p a a v a l t a + l u p a a v a m m a l t a + l u p a a v a m m a t + l u p a a v a m m i k s i + l u p a a v a m m i l t a + l u p a a v a m p a a + l u p a a v a m p i + l u p a a v a m p i a + l u p a a v a m p i i n + l u p a a v a n + l u p a a v a t + l u p a a v i a + l u p a a v i m m a n + l u p a a v i m m a t + l u p a a v i m m i s t a + l u p a a v i m p i a + l u p a a v i m p i e n + l u p a a v i m p i i n + l u p a a v i n + l u p a a v i n a + l u p a e h d o i n + l u p a e h d o t + l u p a e h d o t u k s e n + l u p a e h t o j e n + l u p a h a k e m u k s e e n + l u p a h a k e m u k s e t + l u p a h a k e m u k s i a + l u p a h a k e m u k s i i n + l u p a h a k e m u k s i s t a + l u p a h a k e m u s + l u p a h a k e m u s k u s t a n n u s t e n + l u p a h a k e m u s t e n + l u p a i l l e e t + l u p a i l t u + l u p a j ä r j e s t e l m i e n + l u p a j ä r j e s t e l m i ä + l u p a j ä r j e s t e l m ä + l u p a j ä r j e s t e l m ä l l ä + l u p a j ä r j e s t e l m ä n + l u p a j ä r j e s t e l m ä s t ä + l u p a j ä r j e s t e l m ä t + l u p a j ä r j e s t e l m ä ä + l u p a j ä r j e s t e l m ä ä n + l u p a j ä r j e s t e l y j e n + l u p a j ä r j e s t e l y j ä + l u p a j ä r j e s t e l y t + l u p a k i r j a j ä r j e s t e l m i s t ä + l u p a k i r j o j e n + l u p a k o r t t i + l u p a k ä y t ä n t ö j e n + l u p a l o m a k k e i s s a + l u p a m a k s u i n a + l u p a m a k s u i s t a + l u p a m a k s u j a + l u p a m a k s u t + l u p a m a r k k i n o i t a + l u p a m e n e t t e l y + l u p a m e n e t t e l y a s e t u s + l u p a m e n e t t e l y i h i n + l u p a m e n e t t e l y i s s ä + l u p a m e n e t t e l y i s t ä + l u p a m e n e t t e l y j e n + l u p a m e n e t t e l y j ä + l u p a m e n e t t e l y l l ä + l u p a m e n e t t e l y n + l u p a m e n e t t e l y s s ä + l u p a m e n e t t e l y s t ä + l u p a m e n e t t e l y t + l u p a m e n e t t e l y y n + l u p a m e n e t t e l y ä + l u p a n s a + l u p a p o l i t i i k k a + l u p a p r o s e s s i s s a + l u p a p y y n t ö + l u p a p y y n t ö j e n + l u p a p ä ä t ö k s i ä + l u p a s i + l u p a s i t t e + l u p a s i v a t + l u p a t y y p i s t ä + l u p a u d u i n + l u p a u k s e e n + l u p a u k s e m m e + l u p a u k s e n + l u p a u k s e n s a + l u p a u k s e s s a a n + l u p a u k s e s s a m m e + l u p a u k s e s t a + l u p a u k s e s t a a n + l u p a u k s e t + l u p a u k s i a + l u p a u k s i a a n + l u p a u k s i a m m e + l u p a u k s i i n + l u p a u k s i l l a + l u p a u k s i s s a + l u p a u k s i s t a + l u p a u k s i s t a a n + l u p a u s k o n f e r e n s s i k s i + l u p a u s t a + l u p a u s t a a n + l u p a u s t a m m e + l u p a u s t a n n e + l u p a u s t e m m e + l u p a u s t e n + l u p a u s t e n s a + l u p a u t u i + l u p a v a a t i m u k s e s t a + l u p a v a a t i m u k s i a + l u p a v a a t i m u k s i l l e + l u p a v a a t i m u k s i s t a + l u p a v a a t i m u s t a + l u p a v i r a n o m a i n e n + l u p a v i r a n o m a i s e e n + l u p a v i r a n o m a i s e l l e + l u p a v i r a n o m a i s i l l e + l u p a v i r a n o m a i s t e n + l u p a v i r a s t o t + l u p a v y ö h y k e t t ä + l u p i a + l u p i e n + l u p i i n i t + l u p i n e e n + l u r j u s r y h m ä l t ä + l u s i k k a r e v o n h ä n t ä + l u s i k k a s i r r i + l u s i k k a u i s t i n + l u u b r e k s i a + l u u h a u k i + l u u j a u h o + l u u j a u h o a + l u u j a u h o l l a + l u u j a u h o n + l u u j a u h o t + l u u j a u h o t o n n i e n + l u u j a u h o y r i t y k s i ä + l u u j ä r v i + l u u k a s v a i n + l u u k a u p u n k i + l u u k u d o s + l u u k u l l a + l u u k u n + l u u l e e + l u u l e m a l l a + l u u l e n + l u u l e n k i n + l u u l e n p a + l u u l e t t e k o + l u u l e v a n + l u u l e v a t + l u u l i + l u u l i h a a + l u u l i h a j a u h o a + l u u l i h a j a u h o k s i + l u u l i h a j a u h o l l a + l u u l i h a j a u h o n + l u u l i h a n + l u u l i i k u n t a m i t t a r i + l u u l i m m e + l u u l i n + l u u l i s i + l u u l l a + l u u l l a k s e n i + l u u l l u t + l u u l t a v i m m i n + l u u l t i i n + l u u l t u a + l u u m a r j a t + l u u m i t t a r i + l u u m u k o r u a h v e n + l u u m u k u r k k u k o t i n g a + l u u m u k y y h k y + l u u m u l a j i k k e e s e e n + l u u m u p i i r a k k a + l u u m u p ä ä k a i j a + l u u n m u r s k a a j a t + l u u n m u r t u m a + l u u n m u r t u m a n + l u u p i h v i t + l u u r a n g a n + l u u r a n k o l i h a s + l u u s a i r a u k s i e n + l u u s o d a t + l u u s t o n + l u u s t o s a i r a u d e t + l u u s t o s k l e r o o s i s t a + l u u t a h i k k o r i + l u u t a l ä t k ä ä + l u u t u h k a + l u u y d i n + l u u y d i n l u o v u t t a j i e n + l u u y d i n o n t e l o + l u u y d i n s i i r r o i l l a + l u u y d i n s i i r r o n + l u u y d i n s i i r r ä n n ä i s e n + l u u y d i n s i i r r ä n n ä i s t e n + l u u y d i n s i i r t o a + l u u y d i n s i i r t o j e n + l u u y d i n t u t k i m u s + l u u y d i n t ä + l u u y t i m e n + l u u y t i m e n s i i r t o + l u u y t i m e s t ä + l u v a k e s o p i m u k s i a + l u v a l l i s t e n + l u v a n + l u v a n a n t o h e t k e l l ä + l u v a n a n t o m e n e t t e l y + l u v a n a n t o m e n e t t e l y ä + l u v a n h a k i j o i d e n + l u v a n h a k u p r o s e s s i + l u v a n h a l t i j a + l u v a n h a l t i j a n + l u v a n h a l t i j a t + l u v a n h a l t i j o i d e n + l u v a n h a n k i n t a m e n e t t e l y j ä + l u v a n m a k s a j i e n + l u v a n m y ö n t ä m i s m e n e t t e l y + l u v a n m y ö n t ä m i s m e n e t t e l y j ä + l u v a n n e e t + l u v a n n u t + l u v a n v a r a i n e n + l u v a n v a r a i s i i n + l u v a t + l u v a t a + l u v a t a a n + l u v a t o n t a + l u v a t t a + l u v a t t a v a + l u v a t t i i n + l u v a t t o m a n + l u v a t t o m a s t a + l u v a t t o m i a + l u v a t t o m i e n + l u v a t t u a + l u v a t t u j a + l u v a t u s t a + l u v i s t a + l u v u i k s i + l u v u i l l a + l u v u i l l e + l u v u i l t a + l u v u i n + l u v u i s s a + l u v u i s t a + l u v u k s i + l u v u l l a + l u v u l l a k i n + l u v u l l e + l u v u n + l u v u s t a + l u v u t + l u x e m b u r g i a + l u x e m b u r g i i n + l u x e m b u r g i l a i s e n a + l u x e m b u r g i l a i s e t + l u x e m b u r g i n + l u x e m b u r g i s s a + l u x e m b u r g i s t a + l y h e n e e + l y h e n e v ä t + l y h e n i s i + l y h e n n e t t i i n + l y h e n n e t t y j e n + l y h e n n e t ä ä n + l y h e n n y k s e t + l y h e n n y s k u s t a n n u k s e t + l y h e n n y s s u u n n i t e l m a + l y h e n n y s t ä + l y h e n t e e l l e + l y h e n t y m i s t ä + l y h e n t ä m i s e k s i + l y h e n t ä m i s e s t ä + l y h e n t ä m i s t ä + l y h e n t ä ä + l y h i m m ä n + l y h t y h e r t t u a k a l a + l y h t y j u h l a + l y h t y k o i s o + l y h t y m e r i a h v e n + l y h t y p y l v ä ä s e e n + l y h y e k s i + l y h y e l l ä k i n + l y h y e l t ä + l y h y e m m i k s i + l y h y e m m i n + l y h y e m m i s t ä + l y h y e m m ä k s i + l y h y e m m ä n + l y h y e m m ä s s ä + l y h y e m m ä s s ä k i n + l y h y e m m ä t + l y h y e m p i + l y h y e m p i ä + l y h y e m p ä ä + l y h y e m p ä ä n + l y h y e n + l y h y e n ä + l y h y e s s ä + l y h y e s t i k ä ä n + l y h y e s t ä + l y h y e s t ä k i n + l y h y e t + l y h y i d e n + l y h y i l l e k i n + l y h y i l l ä + l y h y i n + l y h y i t ä + l y h y k ä i s e m p i + l y h y t a i k a i n e n + l y h y t a i k a i s e e n + l y h y t a i k a i s e k s i + l y h y t a i k a i s e l l a + l y h y t a i k a i s e l t a + l y h y t a i k a i s e m m a l l a + l y h y t a i k a i s e m p i i n + l y h y t a i k a i s e n + l y h y t a i k a i s e n a + l y h y t a i k a i s e s t a + l y h y t a i k a i s e s t i + l y h y t a i k a i s e t + l y h y t a i k a i s i a + l y h y t a i k a i s i i n + l y h y t a i k a i s i k s i + l y h y t a i k a i s i l l a + l y h y t a i k a i s i l t a + l y h y t a i k a i s i n + l y h y t a i k a i s i n a + l y h y t a i k a i s i s s a + l y h y t a i k a i s i s t a + l y h y t a i k a i s t a + l y h y t a i k a i s t e n + l y h y t a i k a i s u u t e n s a + l y h y t e l o k u v a + l y h y t e l o k u v a n + l y h y t h ä n t ä p ä ä s t ä i n e n + l y h y t i k ä i n e n + l y h y t i k ä i s e n + l y h y t i k ä i s e s t ä + l y h y t i k ä i s i k s i + l y h y t i k ä i s i ä + l y h y t i k ä i s t ä + l y h y t j ä n n i t t e i s e l l ä + l y h y t j ä n n i t t e i s i s t ä + l y h y t j ä n t e i s e s t i + l y h y t j ä n t e i s t e n + l y h y t j ä n t e i s t ä + l y h y t k a s v u i s u u s + l y h y t k a t s e i s t a + l y h y t k e s t o i n e n + l y h y t k e s t o i s e s t a + l y h y t k e s t o i s i a + l y h y t k e s t o i s i i n + l y h y t k e s t o i s i s s a + l y h y t k e s t o i s i s s a k i n + l y h y t k e s t o i s t a + l y h y t k e s t o i s t e n + l y h y t n ä k ö i n e n + l y h y t n ä k ö i s e e n + l y h y t n ä k ö i s e k s i + l y h y t n ä k ö i s e l l e + l y h y t n ä k ö i s e l l ä + l y h y t n ä k ö i s e l t ä + l y h y t n ä k ö i s e m m ä k s i + l y h y t n ä k ö i s e n + l y h y t n ä k ö i s e n ä + l y h y t n ä k ö i s e s s ä + l y h y t n ä k ö i s e s t i + l y h y t n ä k ö i s e s t ä + l y h y t n ä k ö i s e t + l y h y t n ä k ö i s i i n + l y h y t n ä k ö i s i l l e + l y h y t n ä k ö i s i l t ä + l y h y t n ä k ö i s i n + l y h y t n ä k ö i s i s t ä + l y h y t n ä k ö i s i s t ä k i n + l y h y t n ä k ö i s i ä + l y h y t n ä k ö i s t e n + l y h y t n ä k ö i s t ä + l y h y t n ä k ö i s y y d e n + l y h y t n ä k ö i s y y d e s t ä + l y h y t n ä k ö i s y y s + l y h y t n ä k ö i s y y t e e n + l y h y t n ä k ö i s y y t e n s ä + l y h y t n ä k ö i s y y t e n ä + l y h y t n ä k ö i s y y t t ä + l y h y t n ä k ö i s y y t t ä ä n + l y h y t s a n a i n e n + l y h y t s a n a i s u u t e n i + l y h y t s i i p i s e t + l y h y t t ä + l y i j y a k k u + l y i j y a k u t + l y i j y a s e t a a t t i + l y i j y a t s i d i + l y i j y d i o k s i d i + l y i j y f l u o r i d i + l y i j y h y d r o k s i d i + l y i j y j o d i d i + l y i j y k a m m i o m e n e t e l m ä + l y i j y k a r b o n a a t t i + l y i j y k e l t a s i i p i + l y i j y k e n g i s s ä + l y i j y k i r j a t + l y i j y k l o r i d i + l y i j y m a a l i + l y i j y m a a l i i n + l y i j y m o n a r k k i + l y i j y m o n o k s i d i + l y i j y m y r k y t y s + l y i j y n + l y i j y n i t r a a t t i + l y i j y o n g e l m a a n + l y i j y p a r i s t o j e n + l y i j y p i l l e i l l ä + l y i j y p i t o i s u u d e n + l y i j y p i t o i s u u k s i e n + l y i j y p i t o i s u u s + l y i j y p i t o i s u u t e e n + l y i j y p o h j a i s t e n + l y i j y p u t k e t + l y i j y p u t k i a + l y i j y p u t k i e n + l y i j y p u t k i i n + l y i j y p u t k i s t o j e n + l y i j y p u u + l y i j y s a a s t u m i s e n + l y i j y s o r s a + l y i j y s u l f a a t t i + l y i j y s u l f i d i + l y i j y t r o g o n i + l y i j y t t ö m ä n + l y i j y t u o t t e i s t a + l y i j y t y r a n n i + l y i j y v a h a n o k k a + l y i j y v a l k o i n e n + l y i j y v u o s i n a + l y k k ä y k s e n + l y k k ä y k s e s t ä + l y k k ä y k s i ä + l y k k ä y s a j a t + l y k k ä y s e h d o n + l y k k ä y s e h d o t u k s e l l a + l y k k ä y s e h d o t u k s e n + l y k k ä y s e h t o a + l y k k ä y s m a h d o l l i s u u s + l y k k ä y s m e k a n i s m i a + l y k k ä y s m e n e t t e l y t + l y k k ä y s p y y n n ö n + l y k k ä y s p y y n t ö + l y k k ä y s p ä ä t ö s + l y k k ä y s t e m p p u j a + l y k k ä y s t ä + l y k k ä y t y y + l y k k ä ä m i s e k s i + l y k k ä ä m i s e s t ä + l y k k ä ä m i s k e s k u s t e l u n + l y k k ä ä m i s l a u s e k e + l y k k ä ä m i s l a u s e k k e e n + l y k k ä ä m i s l a u s e k k e e s e e n + l y k k ä ä m i s p ä i v ä m ä ä r ä ä + l y k k ä ä m i s t ä + l y k k ä ä m m e k ö + l y k k ä ä m ä l l ä + l y k k ä ä m ä t t ä + l y k k ä ä m ä ä n + l y k k ä ä v i e n + l y k k ä ä v ä + l y k ä t t i i n + l y k ä t t y + l y k ä t t y j ä + l y k ä t ä + l y k ä t ä k s e e n + l y k ä t ä ä n + l y k ä t ä ä n k ö + l y m y h e m p p o + l y m y k a i j a + l y m y k e r t t u + l y m y k e r t t u l i + l y m y l a u l u m e s i k k o + l y m y n o k i k a n a + l y n k k a u k s e n a + l y n k k a u s m i e l i a l a a + l y n k k a u s o i k e u d e n + l y n k k a u s t u o m i o i s t u i n + l y n k k a u s v a a r a a + l y p s y k a r j a + l y p s y k a r j a a + l y p s y k a r j a n + l y p s y k a r j a t i l a t + l y p s y k a r j a t i l o i l l a + l y p s y k a r j a t i l o j a + l y p s y k o n e e m m e + l y p s y k o n e i d e n + l y p s y k o n e i s t a + l y p s y k o n e i t a + l y p s y l e h m i e n + l y p s y l e h m i l l e + l y p s y l e h m i l l ä + l y p s y l e h m i n ä + l y p s y l e h m i s t ä + l y p s y l e h m i ä + l y p s y l e h m ä + l y p s y l e h m ä k a r j a n + l y p s y l e h m ä l l ä + l y p s y l e h m ä n + l y p s y l e h m ä n ä + l y p s y l e h m ä p a l k k i o + l y p s y l e h m ä p a l k k i o n + l y p s y l e h m ä p a l k k i o t + l y p s y l e h m ä p a l k k i o t a + l y p s y l e h m ä t + l y p s y r o b o t t i + l y p s y u u h i a + l y r i i k k a a + l y s i i n i i n + l y s i i n i m a r k k i n o i d e n + l y y r a v i i k u n a + l y ö d ä + l y ö d ä ä n + l y ö m ä a s e e n a + l y ö m ä t t ä + l y ö n e e t + l y ö n t i v i r h e + l y ö n t i v i r h e e s t ä + l y ö n y t + l y ö t t ä y t y k ä ä m m e + l y ö t y i n ä + l y ö t y ä + l ä h d e a i n e i s t o n + l ä h d e a i n e i s t o s t a + l ä h d e a s i a k i r j a + l ä h d e h e t e k a a l i + l ä h d e k a k a d u + l ä h d e k o l i b r i + l ä h d e k o o d i + l ä h d e k o o d i a + l ä h d e k o o d i n + l ä h d e k o o d i s t a + l ä h d e k r i t i i k k i + l ä h d e k u t o j a + l ä h d e m a t e r i a a l i + l ä h d e m a t e r i a a l i n a + l ä h d e m m e + l ä h d e m u u n n o s + l ä h d e n + l ä h d e s a r a + l ä h d e s u o j a + l ä h d e s u o j a a + l ä h d e t t i i n + l ä h d e t ä ä n + l ä h d e t ä ä n p ä + l ä h d e v a l t i o k s i + l ä h d e v e r o + l ä h d e v e r o a + l ä h d e v e r o a s t e e n + l ä h d e v e r o i s t a + l ä h d e v e r o j e n + l ä h d e v e r o j ä r j e s t e l m ä + l ä h d e v e r o j ä r j e s t e l m ä n + l ä h d e v e r o j ä r j e s t e l m ä ä + l ä h d e v e r o n + l ä h d e v e r o p r o s e n t t i + l ä h d e v e r o s t a + l ä h d e v e r o t u s + l ä h d e v e r o t u s t a + l ä h d e v e s i ä + l ä h d e v e t t ä + l ä h e i s e l l e + l ä h e i s e l t ä + l ä h e i s e m m i k s i + l ä h e i s e m m i n + l ä h e i s e m m i s t ä + l ä h e i s e m m ä n + l ä h e i s e m m ä s s ä + l ä h e i s e m m ä t + l ä h e i s e m p i + l ä h e i s e m p i ä + l ä h e i s e m p ä ä + l ä h e i s e m p ä ä n + l ä h e i s e n + l ä h e i s e s s ä + l ä h e i s e s t ä + l ä h e i s e t + l ä h e i s i i n + l ä h e i s i i n s ä + l ä h e i s i l l e + l ä h e i s i l l e e n + l ä h e i s i m m i n + l ä h e i s i m m ä n + l ä h e i s i s t ä + l ä h e i s i s t ä ä n + l ä h e i s i ä + l ä h e i s i ä ä n + l ä h e i s t e n + l ä h e i s t e n s ä + l ä h e i s t ä + l ä h e i s y y d e n t u n t e e n + l ä h e i s y y d e s s ä k i n + l ä h e i s y y s k u l t t u u r i a + l ä h e i s y y s p e r i a a t e + l ä h e i s y y s p e r i a a t e t t a + l ä h e i s y y s p e r i a a t t e e l l a + l ä h e i s y y s p e r i a a t t e e n + l ä h e i s y y s p e r i a a t t e e s e e n + l ä h e i s y y s p e r i a a t t e e s t a + l ä h e i s y y s p o l i t i i k k a + l ä h e i s y y s p o l i t i i k k a a + l ä h e i s y y s p o l i t i i k k o j a + l ä h e l l e k ä ä n + l ä h e l l ä k ä ä n + l ä h e m m i n k i n + l ä h e n e e + l ä h e n e m i s h e t k i ä + l ä h e n e m ä s s ä + l ä h e n e v ä t + l ä h e n n e t ä ä n + l ä h e n n y t ä ä n + l ä h e n t y e n + l ä h e n t y e s s ä + l ä h e n t y i s i + l ä h e n t y i v ä t + l ä h e n t y m i s a l u e e l l a + l ä h e n t y m i s a l u e e t + l ä h e n t y m i s a l u e i d e n + l ä h e n t y m i s a l u e i l l a + l ä h e n t y m i s a l u e i l l e + l ä h e n t y m i s a l u e i s i i n + l ä h e n t y m i s a s e m a a + l ä h e n t y m i s a s t e + l ä h e n t y m i s e e n + l ä h e n t y m i s e h d o i s s a + l ä h e n t y m i s e h d o t + l ä h e n t y m i s e h t o i h i n + l ä h e n t y m i s e h t o j a + l ä h e n t y m i s e h t o j e n + l ä h e n t y m i s e k s i + l ä h e n t y m i s e l l e + l ä h e n t y m i s e n + l ä h e n t y m i s e s s ä + l ä h e n t y m i s e s t ä + l ä h e n t y m i s f i l o s o f i a n + l ä h e n t y m i s h a n k k e i t a + l ä h e n t y m i s i l m i ö + l ä h e n t y m i s j ä r j e s t e l m ä ä + l ä h e n t y m i s k e h i t y k s e n + l ä h e n t y m i s k e h i t y k s e s s ä + l ä h e n t y m i s k e h i t y s + l ä h e n t y m i s k e h i t y s k e r t o m u k s e s t a a n + l ä h e n t y m i s k e h i t y s t ä + l ä h e n t y m i s k e r t o m u k s e n + l ä h e n t y m i s k e r t o m u k s e n s a + l ä h e n t y m i s k e r t o m u k s e s s a + l ä h e n t y m i s k e r t o m u k s e s t a k i n + l ä h e n t y m i s k e r t o m u k s e t + l ä h e n t y m i s k e r t o m u k s i a + l ä h e n t y m i s k e r t o m u k s i s s a + l ä h e n t y m i s k e r t o m u k s i s s a a n + l ä h e n t y m i s k e r t o m u s + l ä h e n t y m i s k e r t o m u s t a + l ä h e n t y m i s k e r t o m u s t e n + l ä h e n t y m i s k e s k u s t e l u + l ä h e n t y m i s k o h t a + l ä h e n t y m i s k r i t e e r e i d e n + l ä h e n t y m i s k r i t e e r e i h i n + l ä h e n t y m i s k r i t e e r e i l l e + l ä h e n t y m i s k r i t e e r e i l l ä + l ä h e n t y m i s k r i t e e r e i s s ä + l ä h e n t y m i s k r i t e e r e i s t ä + l ä h e n t y m i s k r i t e e r e i t ä + l ä h e n t y m i s k r i t e e r e j ä + l ä h e n t y m i s k r i t e e r i + l ä h e n t y m i s k r i t e e r i e n + l ä h e n t y m i s k r i t e e r i n ä + l ä h e n t y m i s k r i t e e r i s t ä + l ä h e n t y m i s k r i t e e r i t + l ä h e n t y m i s k r i t e e r i ä + l ä h e n t y m i s m a i l l e + l ä h e n t y m i s m e n e t e l m ä + l ä h e n t y m i s m e n e t t e l y + l ä h e n t y m i s m e n e t t e l y t + l ä h e n t y m i s o h j e l m a + l ä h e n t y m i s o h j e l m a a + l ä h e n t y m i s o h j e l m a a n + l ä h e n t y m i s o h j e l m a a n s a + l ä h e n t y m i s o h j e l m a n + l ä h e n t y m i s o h j e l m a n s a + l ä h e n t y m i s o h j e l m a t + l ä h e n t y m i s o h j e l m i a + l ä h e n t y m i s o h j e l m i a a n + l ä h e n t y m i s o h j e l m i e n + l ä h e n t y m i s o h j e l m i i n + l ä h e n t y m i s o h j e l m i s s a + l ä h e n t y m i s o h j e l m i s t a + l ä h e n t y m i s p a i n e i t a + l ä h e n t y m i s p e r i a a t e + l ä h e n t y m i s p e r i a a t t e e n + l ä h e n t y m i s p e r u s t e + l ä h e n t y m i s p e r u s t e e t + l ä h e n t y m i s p e r u s t e i d e n + l ä h e n t y m i s p e r u s t e i l l a + l ä h e n t y m i s p e r u s t e i n e e n + l ä h e n t y m i s p e r u s t e i s i i n + l ä h e n t y m i s p e r u s t e i s t a + l ä h e n t y m i s p e r u s t e i t a + l ä h e n t y m i s p o l i t i i k a n + l ä h e n t y m i s p o l i t i i k k a + l ä h e n t y m i s p o l i t i i k k a a + l ä h e n t y m i s p o n n i s t u s t e m m e + l ä h e n t y m i s p r o s e s s i + l ä h e n t y m i s p r o s e s s i a + l ä h e n t y m i s p r o s e s s i a a n + l ä h e n t y m i s p r o s e s s i e n + l ä h e n t y m i s p r o s e s s i i n + l ä h e n t y m i s p r o s e s s i l l e + l ä h e n t y m i s p r o s e s s i n + l ä h e n t y m i s p r o s e s s i s s a + l ä h e n t y m i s p r o s e s s i s t a + l ä h e n t y m i s p y r k i m y k s e m m e + l ä h e n t y m i s p y r k i m y k s i s s ä + l ä h e n t y m i s p y r k i m y s t e m m e + l ä h e n t y m i s r a h a s t o a + l ä h e n t y m i s r a h a s t o n + l ä h e n t y m i s r a h o i t u k s e e n + l ä h e n t y m i s r a p o r t t i e n + l ä h e n t y m i s s o p i m u k s e n + l ä h e n t y m i s s t r a t e g i a a + l ä h e n t y m i s s t r a t e g i a s t a + l ä h e n t y m i s s u u n n i t e l m a + l ä h e n t y m i s s u u n n i t e l m a a + l ä h e n t y m i s s u u n n i t e l m a n s a + l ä h e n t y m i s s u u n n i t e l m i s t a + l ä h e n t y m i s s y i s t ä + l ä h e n t y m i s s ä ä n n ö l l ä + l ä h e n t y m i s s ä ä n n ö n + l ä h e n t y m i s s ä ä n t ö j e n + l ä h e n t y m i s s ä ä n t ö j ä + l ä h e n t y m i s s ä ä n t ö n ä + l ä h e n t y m i s t a v o i t e + l ä h e n t y m i s t a v o i t e a l u e i d e n + l ä h e n t y m i s t a v o i t e a l u e i l l a + l ä h e n t y m i s t a v o i t e a l u e i l l e + l ä h e n t y m i s t a v o i t e a l u e i s i i n + l ä h e n t y m i s t a v o i t e a l u e i t a + l ä h e n t y m i s t a v o i t e t t a + l ä h e n t y m i s t a v o i t t e e l l e + l ä h e n t y m i s t a v o i t t e e n + l ä h e n t y m i s t a v o i t t e e s e e n + l ä h e n t y m i s t a v o i t t e e s s a + l ä h e n t y m i s t a v o i t t e e s t a + l ä h e n t y m i s t a v o i t t e e t + l ä h e n t y m i s t a v o i t t e i d e n + l ä h e n t y m i s t a v o i t t e i t a + l ä h e n t y m i s t e k i j ö i l l ä + l ä h e n t y m i s t u k e a + l ä h e n t y m i s t y ö n + l ä h e n t y m i s t ä + l ä h e n t y m i s v a a t i m u k s e t + l ä h e n t y m i s v a a t i m u k s i a + l ä h e n t y m i s v a a t i m u k s i i n + l ä h e n t y m i s v a a t i m u s t e n + l ä h e n t y m i s v a i h e e l l e + l ä h e n t y m i s v ä l i n e e n + l ä h e n t y m i s v ä l i n e e t + l ä h e n t y m ä l l ä + l ä h e n t y m ä ä n + l ä h e n t y n e e n + l ä h e n t y n e e t + l ä h e n t y n y t + l ä h e n t y v i e n + l ä h e n t y v ä t + l ä h e n t y v ä ä + l ä h e n t y y + l ä h e n t y ä + l ä h e n t ä i s i + l ä h e n t ä m i s e k s i + l ä h e n t ä m i s e n + l ä h e n t ä m i s e s s ä + l ä h e n t ä m i s e s t ä + l ä h e n t ä m i s p o l i t i i k a n + l ä h e n t ä m i s p r o s e s s i + l ä h e n t ä m i s p r o s e s s i a + l ä h e n t ä m i s p y r k i m y k s i ä + l ä h e n t ä m i s s t r a t e g i a + l ä h e n t ä m i s s t r a t e g i a a n + l ä h e n t ä m i s s t r a t e g i a s s a + l ä h e n t ä m i s s t r a t e g i a t + l ä h e n t ä m i s t y ö t ä + l ä h e n t ä m i s t ä + l ä h e n t ä m i s v a a t i m u k s e n + l ä h e n t ä m ä l l ä + l ä h e n t ä m ä s s ä + l ä h e n t ä m ä ä n + l ä h e n t ä n y t + l ä h e n t ä ä + l ä h e n t ä ä k s e e n + l ä h e n t ä ä k s e m m e + l ä h e s t y e s s ä + l ä h e s t y e s s ä m m e + l ä h e s t y i s i + l ä h e s t y k ä ä m m e + l ä h e s t y m i s k e r t o m u k s e n + l ä h e s t y m i s k i e l t o + l ä h e s t y m i s k r i t e e r i e n + l ä h e s t y m i s o h j e l m i e n + l ä h e s t y m i s p e r u s t e e t + l ä h e s t y m i s p o l i t i i k a t + l ä h e s t y m i s p r o s e s s i + l ä h e s t y m i s s t r a t e g i a + l ä h e s t y m i s s ä ä n t ö j ä + l ä h e s t y m i s t a p a + l ä h e s t y m i s t a p a a + l ä h e s t y m i s t a p a a m m e + l ä h e s t y m i s t a p a a n + l ä h e s t y m i s t a p a a n i + l ä h e s t y m i s t a p a a n s a + l ä h e s t y m i s t a p a e r o n + l ä h e s t y m i s t a p a m m e + l ä h e s t y m i s t a p a n a + l ä h e s t y m i s t a p a n s a + l ä h e s t y m i s t a p o j a + l ä h e s t y m i s t a p o j e n + l ä h e s t y m i s t a v a l l a + l ä h e s t y m i s t a v a l l e + l ä h e s t y m i s t a v a l l e m m e + l ä h e s t y m i s t a v a l t a + l ä h e s t y m i s t a v a n + l ä h e s t y m i s t a v a s s a + l ä h e s t y m i s t a v a s t a + l ä h e s t y m i s t a v a t + l ä h e s t y m i s t a v o i s t a + l ä h e s t y m i s t a v o i t t e i d e n + l ä h e s t y m m e + l ä h e s t y m ä ä n + l ä h e s t y n e e t + l ä h e s t y n y t + l ä h e s t y t + l ä h e s t y t t y + l ä h e s t y t t ä e s s ä + l ä h e s t y t t ä v ä ä n + l ä h e s t y t ä ä n + l ä h e s t y v i e n + l ä h e s t y v ä m m e + l ä h e s t y v ä n + l ä h e s t y v ä s t ä + l ä h e s t y v ä t + l ä h e s t y v ä ä + l ä h e s t y y + l ä h e s t y ä + l ä h e t e j ä r j e s t e l m ä n + l ä h e t e t t i i n + l ä h e t e t t y + l ä h e t e t t y i h i n + l ä h e t e t t y j e n + l ä h e t e t t ä v i s t ä + l ä h e t e t y i l l e + l ä h e t e t y i s t ä + l ä h e t e t ä + l ä h e t e t ä ä n + l ä h e t t i l ä ä n + l ä h e t t i p a l v e l u + l ä h e t t i p a l v e l u a j o n e u v o j e n + l ä h e t t i p a l v e l u t + l ä h e t t i p e l i + l ä h e t t ä e s s ä n n e + l ä h e t t ä i s i m m e + l ä h e t t ä j ä m a a h a n + l ä h e t t ä j ä m a a n + l ä h e t t ä j ä m a i d e n + l ä h e t t ä j ä o r g a n i s a a t i o l l e + l ä h e t t ä j ä o r g a n i s a a t i o n + l ä h e t t ä j ä o r g a n i s a a t i o t + l ä h e t t ä j ä p a n k i l t a + l ä h e t t ä j ä v a l t i o + l ä h e t t ä j ä v a l t i o i d e n + l ä h e t t ä k ä ä + l ä h e t t ä k ä ä m m e + l ä h e t t ä m i s e k s i + l ä h e t t ä m i s e n + l ä h e t t ä m i s e s t ä + l ä h e t t ä m i s t ä + l ä h e t t ä m ä l l ä + l ä h e t t ä m ä s s ä + l ä h e t t ä m ä t t ä + l ä h e t t ä m ä ä n + l ä h e t t ä m ä ä n i + l ä h e t t ä n e e n + l ä h e t t ä n e e t + l ä h e t t ä n y t + l ä h e t t ä v i i n + l ä h e t t ä v ä t + l ä h e t t ä ä + l ä h e t t ä ä k s e e n + l ä h e t t ä ä k s e m m e + l ä h e t t ä ä k s e n i + l ä h e t y k s e s s ä + l ä h e t y k s e t + l ä h e t y k s i s t ä + l ä h e t y k s i ä + l ä h e t y s a i k a a n + l ä h e t y s a j a n + l ä h e t y s a j a s t a + l ä h e t y s a j a s t a a n + l ä h e t y s a s e m a n s a + l ä h e t y s a s e m a t + l ä h e t y s a s e m i e n + l ä h e t y s j ä r j e s t e l m i ä + l ä h e t y s j ä r j e s t e l m ä + l ä h e t y s j ä r j e s t e l m ä n + l ä h e t y s j ä r j e s t ö + l ä h e t y s k a p a s i t e e t t i + l ä h e t y s k i i n t i ö t + l ä h e t y s k o k o u s + l ä h e t y s l a i t t e e n s a + l ä h e t y s l a i t t e i d e n + l ä h e t y s l a i t t e i s t o n s a + l ä h e t y s l u p a + l ä h e t y s l u p i a + l ä h e t y s l u v a n + l ä h e t y s m e n e t e l m i ä + l ä h e t y s m e n e t t e l y i h i n + l ä h e t y s m ä ä r i ä + l ä h e t y s o i k e u d e t + l ä h e t y s o i k e u k s i a + l ä h e t y s o i k e u k s i s t a + l ä h e t y s p a l v e l u i h i n + l ä h e t y s p a l v e l u n + l ä h e t y s s a a r n a a j a t o i m i n t a + l ä h e t y s s a a r n a a j i e m m e + l ä h e t y s s e u r a + l ä h e t y s s i s ä l t ö j ä + l ä h e t y s t a a j u u k s i s t a + l ä h e t y s t a a j u u t e n s a + l ä h e t y s t a v a s t a + l ä h e t y s t e k n i i k k a a n + l ä h e t y s t o i m i l u p a + l ä h e t y s t o i m i n n a l l a + l ä h e t y s t o i m i n n a n + l ä h e t y s t o i m i n n a s s a + l ä h e t y s t o i m i n t a + l ä h e t y s t o i m i n t a a + l ä h e t y s t o i m i n t a y h t i ö + l ä h e t y s t y ö h e n k i s y y s + l ä h e t y s t y ö h ö n + l ä h e t y s t y ö j ä r j e s t ö j e n + l ä h e t y s t y ö s t ä + l ä h e t y s t y ö t ä + l ä h e t y s t ö i h i n + l ä h e t y s t ö i l l ä + l ä h e t y s t ö i s t ä + l ä h e t y s t ö j e n + l ä h e t y s t ö m m e + l ä h e t y s t ö n + l ä h e t y s t ö p a l v e l u j e n + l ä h e t y s t ö r a k e n n u k s e n s a + l ä h e t y s t ö v e r k o s t o n + l ä h e t y s t ö v i r k a m i e s t e n + l ä h e t y s t ö ö n + l ä h e t y s v e l v o l l i s u u s + l ä h e t y s v e r k k o + l ä h e t y s v ä l i n e i t ä + l ä h e t ä m m e + l ä h e t ä m m e k i n + l ä h e t ä n + l ä h i a i k o i n a + l ä h i a i k o i n a k i n + l ä h i a i k o j e n + l ä h i a j a n + l ä h i a l a t + l ä h i a l o i h i n + l ä h i a l o i l l a + l ä h i a l u e + l ä h i a l u e a p u a + l ä h i a l u e e l l a + l ä h i a l u e e l l a a n + l ä h i a l u e e l l a n i + l ä h i a l u e e m m e + l ä h i a l u e e n + l ä h i a l u e e n s a + l ä h i a l u e e s e e m m e + l ä h i a l u e e s e e n + l ä h i a l u e e t + l ä h i a l u e i d e n + l ä h i a l u e i l l a + l ä h i a l u e i l l a m m e + l ä h i a l u e i l l a n i + l ä h i a l u e i l l e + l ä h i a l u e i l l e m m e + l ä h i a l u e i l t a + l ä h i a l u e i l t a m m e + l ä h i a l u e i s i i n + l ä h i a l u e i t a + l ä h i a l u e i t a m m e + l ä h i a l u e p o l i t i i k a n + l ä h i a l u e p o l i t i i k k a + l ä h i a l u e s t r a t e g i a a + l ä h i a l u e s u u n n i l l a + l ä h i a l u e y h t e i s t y ö + l ä h i a l u e y h t e i s t y ö h ö n + l ä h i a l u e y h t e i s t y ö t ä + l ä h i a v a r u u t t a + l ä h i d e m o k r a t i a l l e + l ä h i e t ä i s y y d e l l ä + l ä h i e t ä i s y y d e l t ä + l ä h i h i s t o r i a + l ä h i h i s t o r i a a + l ä h i h i s t o r i a a n + l ä h i h i s t o r i a m m e + l ä h i h i s t o r i a n + l ä h i h i s t o r i a n s a + l ä h i h i s t o r i a s s a + l ä h i h i s t o r i a s s a a n + l ä h i h i s t o r i a s s a m m e + l ä h i h i s t o r i a s t a + l ä h i h o i d o s t a + l ä h i h o i t o p a l v e l u j e n + l ä h i j u n i e n + l ä h i k a u p a t + l ä h i k a u p o i s t a + l ä h i k a u p p a + l ä h i k a u p p a a + l ä h i k a u p p i a s + l ä h i k a u p p o i h i n + l ä h i k a u p p o j e n + l ä h i k e h i t y k s e s t ä + l ä h i k o n t a k t i e n + l ä h i k o u l u s t a + l ä h i k u n t o u t u k s e e n + l ä h i k u u k a u d e t + l ä h i k u u k a u s i a + l ä h i k u u k a u s i e n + l ä h i k u u k a u s i k s i + l ä h i k u u k a u s i n a + l ä h i k u v a u s + l ä h i l i i k e n n e + l ä h i l i i k e n n e p a l v e l u j e n + l ä h i l i i k e n n e v a u n u + l ä h i l i i k e n t e e n + l ä h i l i i k e n t e e s s ä + l ä h i l i n s s i + l ä h i m e n n e i s y y d e n + l ä h i m e n n e i s y y d e s s ä + l ä h i m e n n e i s y y d e s t ä ä n + l ä h i m e n n e i s y y s + l ä h i m e n n e i s y y t e e n + l ä h i m e n n e i s y y t e n s ä + l ä h i m e r e n k u l k u + l ä h i m e r e n k u l k u a + l ä h i m e r e n k u l k u u n + l ä h i m e r e n k u l u l l a + l ä h i m e r e n k u l u l l e + l ä h i m e r e n k u l u n + l ä h i m e r e n k u l u s s a + l ä h i m e r e n k u l u s t a + l ä h i m m i l l e + l ä h i m m ä i s i s t ä + l ä h i m m ä i s i s t ä m m e + l ä h i m m ä i s i ä + l ä h i m m ä i s i ä m m e + l ä h i m m ä i s i ä ä n + l ä h i m m ä i s t e m m e + l ä h i m m ä i s t e n + l ä h i m m ä i s t e n s ä + l ä h i m m ä i s t ä + l ä h i m m ä i s t ä m m e + l ä h i m m ä i s t ä s i + l ä h i m m ä i s t ä ä n + l ä h i m p i e n + l ä h i m p i i n + l ä h i m p i n e + l ä h i n a a p u r e i d e m m e + l ä h i n a a p u r e i d e n + l ä h i n a a p u r e i d e n s a + l ä h i n a a p u r e i h i m m e + l ä h i n a a p u r e i h i n + l ä h i n a a p u r e i h i n s a + l ä h i n a a p u r e i l l e m m e + l ä h i n a a p u r e i l t a + l ä h i n a a p u r e i s s a + l ä h i n a a p u r e i s s a m m e + l ä h i n a a p u r e i s t a + l ä h i n a a p u r e i t a + l ä h i n a a p u r e i t a a n + l ä h i n a a p u r e i t a m m e + l ä h i n a a p u r i + l ä h i n a a p u r i a + l ä h i n a a p u r i e m m e + l ä h i n a a p u r i l l e m m e + l ä h i n a a p u r i m m e + l ä h i n a a p u r i n + l ä h i n a a p u r i n a + l ä h i n a a p u r i s t a m m e + l ä h i n a a p u r i s t o o m m e + l ä h i n a a p u r i t + l ä h i n a a p u r u s t o a m m e + l ä h i n a a p u r u s t o m m e + l ä h i n a a p u r u s t o s s a a n + l ä h i n a a p u r u s t o s s a m m e + l ä h i o i k e u d e t + l ä h i o i k e u k s i l l e + l ä h i o i k e u k s i s t a + l ä h i o m a i s i a + l ä h i o m a i s i l l e + l ä h i p a l v e l u i d e n + l ä h i p a l v e l u i h i n + l ä h i p a l v e l u i l l a + l ä h i p a l v e l u j a + l ä h i p a l v e l u j e n + l ä h i p a l v e l u t + l ä h i p i i r i + l ä h i p i i r i s s ä m m e + l ä h i p o l i i s i + l ä h i p o l i i s i e n + l ä h i p o l i i s i s t a + l ä h i p o l i i s i t o i m i n n a s t a + l ä h i p o s t i t o i m i s t o t + l ä h i p ä i v i e n + l ä h i p ä i v i l l e + l ä h i p ä i v i n ä + l ä h i p ä i v i n ä k i n + l ä h i r u o a s s a + l ä h i r u o k a + l ä h i r u o k a p e r i a a t e + l ä h i s e u d u i l l a + l ä h i s e u d u i l l e + l ä h i s e u d u i l t a + l ä h i s e u t u j e n + l ä h i s o d a n + l ä h i s t ö l l ä + l ä h i s t ö n + l ä h i s u k u l a i s e n s a + l ä h i s u k u l a i s e t + l ä h i s u k u l a i s t e n + l ä h i s u k u l a i s t e n s a + l ä h i s u v u s s a a n + l ä h i s y t y t i n + l ä h i t a i s t e l u + l ä h i t e u r a s t a m o t + l ä h i t u l e v a i s u u d e l l e + l ä h i t u l e v a i s u u d e l t a + l ä h i t u l e v a i s u u d e n + l ä h i t u l e v a i s u u d e s s a + l ä h i t u l e v a i s u u d e s s a k a a n + l ä h i t u l e v a i s u u d e s s a k i n + l ä h i t u l e v a i s u u d e s t a + l ä h i t u l e v a i s u u s + l ä h i t u l e v a i s u u t e e n + l ä h i t u l e v a i s u u t t a + l ä h i t u n t e i n a + l ä h i t u o t a n n o n + l ä h i t u r v a l l i s u u t e e n + l ä h i t ä h d i s t ä + l ä h i u l k o m a a + l ä h i u l k o m a i s s a + l ä h i v a l t i o t + l ä h i v e r k k o + l ä h i v e r k k o t a p a h t u m a + l ä h i v e s i e n s ä + l ä h i v e s i k a l a s t u s t a + l ä h i v e s i l l e + l ä h i v i i k k o i n a + l ä h i v i i k k o j e n + l ä h i v i i k k o n a + l ä h i v i i k o i l l e + l ä h i v i i k o t + l ä h i v i r t o j e n + l ä h i v u o s i a + l ä h i v u o s i e n + l ä h i v u o s i k s i + l ä h i v u o s i k y m m e n i n ä + l ä h i v u o s i n a + l ä h i v u o s i n a k i n + l ä h i y h t e y d e n p i t o p a l v e l u j e n + l ä h i y h t i ö t + l ä h i y m p ä r i s t ö i s s ä m m e + l ä h i y m p ä r i s t ö l l e + l ä h i y m p ä r i s t ö m m e + l ä h i y m p ä r i s t ö n + l ä h i y m p ä r i s t ö s s ä + l ä h i y m p ä r i s t ö s s ä m m e + l ä h i y m p ä r i s t ö s s ä ä n + l ä h i y m p ä r i s t ö ä + l ä h i y m p ä r i s t ö ö m m e + l ä h i y m p ä r i s t ö ö n + l ä h i y m p ä r i s t ö ö n s ä + l ä h i ö h a n k k e i d e n + l ä h i ö i d e m m e + l ä h i ö i d e n + l ä h i ö i s s ä m m e + l ä h i ö l i i k e n t e e n + l ä h i ö o n g e l m a a + l ä h i ö t + l ä h t e e + l ä h t e e k i n + l ä h t e e k s i + l ä h t e e n + l ä h t e e n ä + l ä h t e e s t ä + l ä h t e i l l e + l ä h t e i s s ä + l ä h t e i s t ä + l ä h t e i t ä + l ä h t e k ä ä m m e + l ä h t e m ä s t ä + l ä h t e m ä t t ö m ä n + l ä h t e m ä ä n + l ä h t e n e e t + l ä h t e n y t + l ä h t e v i e n + l ä h t e v ä t + l ä h t e ä + l ä h t e ä k s e e n + l ä h t e ä k ö + l ä h t i e s s ä m m e + l ä h t i e s s ä n i + l ä h t i e s s ä ä n + l ä h t i v ä t + l ä h t ö a i k a + l ä h t ö a i k a a + l ä h t ö a i k a n i + l ä h t ö a i k o i h i n + l ä h t ö a i n e e n a + l ä h t ö a l u e e l l a + l ä h t ö a l u e e l l e + l ä h t ö a l u e e n + l ä h t ö a l u e e s e e n + l ä h t ö a l u e i d e n + l ä h t ö a l u e i l l a + l ä h t ö a l u e i l l e + l ä h t ö a l u e i l l e e n + l ä h t ö a l u e i t a + l ä h t ö a r v o i n a + l ä h t ö a s e m a + l ä h t ö a s e m i s s a + l ä h t ö a s e t e l m a + l ä h t ö a s e t e l m a a n + l ä h t ö a s e t e l m i a + l ä h t ö a s e t e l m i e n + l ä h t ö h a l l i s s a + l ä h t ö h e t k i + l ä h t ö j ä s e n v a l t i o + l ä h t ö j ä s e n v a l t i o l l a + l ä h t ö j ä s e n v a l t i o n + l ä h t ö j ä s e n v a l t i o o n s a + l ä h t ö j ä s e n v a l t i o s s a + l ä h t ö k a u p u n g i s t a + l ä h t ö k o h d a k s e e n + l ä h t ö k o h d a k s e m m e + l ä h t ö k o h d a k s e n i + l ä h t ö k o h d a k s i + l ä h t ö k o h d a l t a + l ä h t ö k o h d a n + l ä h t ö k o h d a s t a + l ä h t ö k o h d a s t a a n + l ä h t ö k o h d a t + l ä h t ö k o h d i k s i + l ä h t ö k o h d i l l a + l ä h t ö k o h d i l t a a n + l ä h t ö k o h d i s s a + l ä h t ö k o h d i s t a + l ä h t ö k o h d i s t a a n + l ä h t ö k o h d i s t a m m e + l ä h t ö k o h t a + l ä h t ö k o h t a a + l ä h t ö k o h t a a m m e + l ä h t ö k o h t a a n + l ä h t ö k o h t a a n i + l ä h t ö k o h t a e r o t + l ä h t ö k o h t a i s e s t i + l ä h t ö k o h t a m m e + l ä h t ö k o h t a n a + l ä h t ö k o h t a n a a n + l ä h t ö k o h t a n a m m e + l ä h t ö k o h t a n a n i + l ä h t ö k o h t a n i + l ä h t ö k o h t a n n e + l ä h t ö k o h t a t i e t o j a + l ä h t ö k o h t a t i l a n n e + l ä h t ö k o h t i a + l ä h t ö k o h t i a m m e + l ä h t ö k o h t i e n + l ä h t ö k o h t i i n + l ä h t ö k o h t i n a + l ä h t ö k u o p i s s a a n + l ä h t ö k u o p p i i n + l ä h t ö l a u k a u k s e n + l ä h t ö l a u k a u k s e n a + l ä h t ö l a u k a u s + l ä h t ö l a u k a u s t a + l ä h t ö l e n t o k e n t ä l l ä + l ä h t ö m a a + l ä h t ö m a a h a m m e + l ä h t ö m a a h a n + l ä h t ö m a a h a n s a + l ä h t ö m a a n + l ä h t ö m a a n a + l ä h t ö m a a n s a + l ä h t ö m a a p e r i a a t t e e n + l ä h t ö m a a p e r i a a t t e e s t a + l ä h t ö m a a s s a + l ä h t ö m a a s s a a n + l ä h t ö m a a s t a + l ä h t ö m a a s t a a n + l ä h t ö m a a t + l ä h t ö m a a t a + l ä h t ö m a i d e n + l ä h t ö m a i d e n s a + l ä h t ö m a i h i n + l ä h t ö m a i h i n s a + l ä h t ö m a i l l e + l ä h t ö m a i l l e e n + l ä h t ö m a i n a + l ä h t ö m a i s s a + l ä h t ö m a i s s a a n + l ä h t ö m a i s t a + l ä h t ö m a i s t a a n + l ä h t ö m a i t a + l ä h t ö m a t e r i a a l i a + l ä h t ö m e r k i n + l ä h t ö m e r k k i + l ä h t ö o l e t t a m u k s e e n + l ä h t ö o l e t t a m u s t a + l ä h t ö p a i k a s s a + l ä h t ö p a i k k a + l ä h t ö p a i k k a a n s a + l ä h t ö p a i k o i s s a + l ä h t ö p i s t e + l ä h t ö p i s t e e k s i + l ä h t ö p i s t e e m m e + l ä h t ö p i s t e e n ä + l ä h t ö p i s t e e n ä n i + l ä h t ö p i s t e e s e e m m e + l ä h t ö p i s t e e s e e n + l ä h t ö p i s t e e s e e n s ä + l ä h t ö p i s t e e s s ä + l ä h t ö p i s t e t t ä + l ä h t ö p o r t t i a l u e e l l a + l ä h t ö p ä i v ä n ä m m e + l ä h t ö s a t a m a s s a + l ä h t ö s e l v i t y s t i s k e i l l e + l ä h t ö s y i t ä + l ä h t ö t a s o a + l ä h t ö t a s o i s s a + l ä h t ö t a s o n + l ä h t ö t a s o t + l ä h t ö t e k s t i + l ä h t ö t i l a n n e + l ä h t ö t i l a n n e t t a + l ä h t ö t i l a n t e e s s a + l ä h t ö t i l a n t e e s t a + l ä h t ö t i l a n t e e t + l ä h t ö v a l m i s t e l u i s t a + l ä h t ö v a l t i o i h i n s a + l ä h t ö v a l t i o i l l e + l ä h t ö v a l t i o n s a + l ä h t ö v a l t i o o n + l ä h t ö v i h e l l y k s e n ä + l ä h t ö v i i v a + l ä h t ö v i i v a l l a + l ä h t ö v i i v a l l e + l ä h t ö v i i v a l t a + l ä h t ö y h t e i s k u n n a s s a + l ä i k e d e l f i i n i + l ä k s i ä i s l a h j a + l ä k s y j ä m m e + l ä k s y m m e + l ä k s y n s ä + l ä k s y t t ä ä + l ä k s y ä + l ä l l ä r i t + l ä m m i k k e e n ä ä n + l ä m m i n s y d ä m i s t ä + l ä m m i n s y d ä m i s y y t t ä + l ä m m i n t ä + l ä m m i n v e s i + l ä m m i n v e s i k a t t i l a n + l ä m m i n v e s i l a s k u i s t a a n + l ä m m i t e t y i l l e + l ä m m i t t ä ä + l ä m m i t y k s e e n + l ä m m i t y k s e n + l ä m m i t y s a l a n + l ä m m i t y s j ä r j e s t e l m i e n + l ä m m i t y s j ä r j e s t e l m ä + l ä m m i t y s j ä r j e s t e l m ä n + l ä m m i t y s j ä r j e s t e l m ä t + l ä m m i t y s k u l u j a k i n + l ä m m i t y s k u s t a n n u k s i a + l ä m m i t y s k u s t a n n u k s i s t a + l ä m m i t y s k u s t a n n u s t e n + l ä m m i t y s l a i t o k s i a + l ä m m i t y s l a i t o k s i s s a + l ä m m i t y s l a i t o s t e n + l ä m m i t y s l a i t t e e t + l ä m m i t y s l a i t t e i s t a + l ä m m i t y s l a i t t e i t a + l ä m m i t y s l a s k u j a a n + l ä m m i t y s m e n e t e l m ä l l ä + l ä m m i t y s m e n e t e l m ä n + l ä m m i t y s m u o t o + l ä m m i t y s o n g e l m i a + l ä m m i t y s p o t e n t i a a l i n + l ä m m i t y s p o t e n t i a a l i s t a + l ä m m i t y s t a r k o i t u k s i i n + l ä m m i t y s t a r v e l u k u + l ä m m i t y s t a r v i k k e i t a + l ä m m i t y s t ä + l ä m m i t y s v a i k u t u s + l ä m m i t y s v a i k u t u s k e r r o i n + l ä m m i t y s v e r k o s t o i h i n + l ä m m i t y s v e r o j e n + l ä m m i t y s ö l j y ä + l ä m m ö l l ä + l ä m m ö n + l ä m m ö n e r i s t e + l ä m m ö n e r i s t y s k y k y ä + l ä m m ö n e r i s t y s t e h o k k u u s + l ä m m ö n j o h t a v u u s + l ä m m ö n k e s t ä v ä ä + l ä m m ö n l ä h d e + l ä m m ö n l ä h t e i s t ä + l ä m m ö n l ä p ä i s y k e r r o i n + l ä m m ö n s i i r r i n + l ä m m ö n s i i r t y m i s k e r r o i n + l ä m m ö n t a r v e + l ä m m ö n t a r v e t t a + l ä m m ö n t u o t a n n o n + l ä m m ö n t u o t a n n o s s a + l ä m m ö n t u o t a n t o + l ä m m ö n t u o t a n t o a + l ä m m ö n t u o t t a j a t + l ä m m ö n t u o t t a j i e n + l ä m m ö n v a i h t i m i s s a + l ä m p e n e e + l ä m p e n e e k ö + l ä m p e n e m i s e e n + l ä m p e n e m i s e l l e + l ä m p e n e m i s e l l ä + l ä m p e n e m i s e n + l ä m p e n e m i s e s s ä + l ä m p e n e m i s e s t ä + l ä m p e n e m i s e t + l ä m p e n e m i s p r o s e s s i + l ä m p e n e m i s t ä + l ä m p e n e v ä t + l ä m p i m i i n + l ä m p i m i m m i n + l ä m p i m i n + l ä m p i m i n ä + l ä m p i m i s t ä + l ä m p i m ä m m i n + l ä m p i m ä m p ä ä + l ä m p i m ä n + l ä m p i m ä t + l ä m p i m ä ä n + l ä m p ö a a l l o t + l ä m p ö a a l t o + l ä m p ö a a l t o k a u s i e n + l ä m p ö a r v o + l ä m p ö e n e r g i a f u u s i o + l ä m p ö e n e r g i a f u u s i o n + l ä m p ö e n e r g i a n + l ä m p ö e n e r g i a s t a + l ä m p ö e r i s t y k s e e n + l ä m p ö e r i s t y k s e n + l ä m p ö e r i s t y k s e s t ä + l ä m p ö e r i s t y s + l ä m p ö e r i s t y s t ä + l ä m p ö j ä r j e s t e l m i e n + l ä m p ö k a a p p i + l ä m p ö k a m e r a + l ä m p ö k a p a s i t e e t t i + l ä m p ö k a r k a a m i n e n + l ä m p ö k a u d e t + l ä m p ö k a u s i i n + l ä m p ö k a u t t a + l ä m p ö k e s k u k s i s s a + l ä m p ö k i l p i + l ä m p ö k o h i n a + l ä m p ö k u o l e m a + l ä m p ö k u v a u s + l ä m p ö k u v i a + l ä m p ö k ä s i t t e l y ä + l ä m p ö l a a j e n e m i n e n + l ä m p ö l a a j e n t u m i s e s t a + l ä m p ö l a i t o k s i l l e + l ä m p ö l i i k e + l ä m p ö o k s i d i j ä l l e e n k ä s i t t e l y n + l ä m p ö p a t t e r e i h i n + l ä m p ö p o i s t o o n + l ä m p ö p r o s e s s i v a l m i s t e i d e n + l ä m p ö p u m p p u + l ä m p ö p u m p p u j e n + l ä m p ö p u m p p u j ä r j e s t e l m ä l l ä + l ä m p ö p u m p u i s t a + l ä m p ö p u t k i + l ä m p ö r e s i s t a n s s i + l ä m p ö s a a r e k e i l m i ö s t ä + l ä m p ö s a a s t e + l ä m p ö s o k k i p r o t e i i n i + l ä m p ö t e h o k k u u t t a + l ä m p ö t i l a + l ä m p ö t i l a a + l ä m p ö t i l a n + l ä m p ö t i l a n m u u t o k s i s t a + l ä m p ö t i l a n n o u s u n + l ä m p ö t i l a n s ä ä t ö j ä r j e s t e l m i ä + l ä m p ö t i l a n v a i h t e l u i s t a + l ä m p ö t i l a t a v o i t t e i s i i n + l ä m p ö t i l a t i l a s t o j e n + l ä m p ö t i l a v a a t i m u k s i i n + l ä m p ö t i l a v a i h t e l u a + l ä m p ö t i l o i h i n + l ä m p ö t i l o i s s a + l ä m p ö t ä h t ä i n + l ä m p ö u u d i s t u k s e n + l ä m p ö u u d i s t u k s e s t a + l ä m p ö u u d i s t u s + l ä m p ö v a i k u t u k s i a + l ä m p ö v a i k u t u s t e n + l ä m p ö v a s t u s + l ä m p ö v e r k o s t o i h i n + l ä m p ö v i r t a + l ä m p ö v i r t o j e n + l ä m p ö v o i m a k o n e + l ä m p ö v o i m a l a + l ä m p ö v o i m a l a a n + l ä m p ö v o i m a l a i t o s t e n + l ä m p ö v o i m a l a t + l ä m p ö v o i m a l o i d e n + l ä m p ö v o i m a l o i h i n + l ä m p ö v o i m a l o i l l e + l ä m p ö v o i m a l o i s s a + l ä m p ö v o i m a l o i t a + l ä m p ö v o i m a n + l ä m p ö v o i m a s e k t o r i n + l ä m p ö v u o + l ä m p ö v y ö h y k e + l ä m p ö y d i n e n e r g i a n + l ä m p ö y d i n f u u s i o + l ä m p ö y d i n f u u s i o n + l ä m p ö y d i n f u u s i o t a + l ä m p ö y d i n k o e r e a k t o r i + l ä m p ö y d i n k o e r e a k t o r i a + l ä m p ö y d i n k o e r e a k t o r i n + l ä m p ö y d i n k o k e e n + l ä m p ö y d i n r e a k t o r i h a n k k e e s e e n + l ä m p ö y d i n r e a k t o r i n + l ä m p ö y h t ä l ö + l ä m p ö ä + l ä n g e t + l ä n n e l l e k ä ä n + l ä n n e n + l ä n n e n a k s o l o t l i t + l ä n n e n a m b r a p u u + l ä n n e n e l o k u v i s t a + l ä n n e n h e i s i a n g e r v o + l ä n n e n h e l m i l a v a s t a j a + l ä n n e n h e l t t a m e s i k k o + l ä n n e n i s o s o r s i m o + l ä n n e n k a u l u s t r a p p i + l ä n n e n k e l t a b u l b u l i + l ä n n e n k i r j o l e p i n k ä i n e n + l ä n n e n k o n n a n m a r j a + l ä n n e n k o u k k u k a k a d u + l ä n n e n k r u u n u k y y h k y + l ä n n e n k u r h o + l ä n n e n k y l m ä n k u k k a + l ä n n e n l e h t i k u u s i + l ä n n e n m a a r i a n h e i n ä + l ä n n e n m a n s i k k a p u u + l ä n n e n p a l s a m i + l ä n n e n p i h t a + l ä n n e n p u u t a m a a n i + l ä n n e n r a t s a s t u s + l ä n n e n r o u s k u + l ä n n e n s a v a n n i o r a v a + l ä n n e n s y y s k o r e n t o + l ä n n e n t u l p p a a n i p u u + l ä n n e n v a r p u s p ö l l ö + l ä n n e n v a s t a i s e s t a + l ä n n e n v a s t a i s i a + l ä n n e n v a s t a i s t e n + l ä n n e n v i h e r m a m b a + l ä n s i a f r i k k a l a i s e n + l ä n s i a f r i k k a l a i s e s s a + l ä n s i a f r i k k a l a i s e t + l ä n s i a f r i k k a l a i s t a + l ä n s i a f r i k k a l a i s t e n + l ä n s i e l i n t a r v i k k e i t a + l ä n s i e u r o o p p a l a i n e n + l ä n s i e u r o o p p a l a i s e l l e + l ä n s i e u r o o p p a l a i s e n + l ä n s i e u r o o p p a l a i s e n a + l ä n s i e u r o o p p a l a i s e s t a + l ä n s i e u r o o p p a l a i s e t + l ä n s i e u r o o p p a l a i s i a + l ä n s i e u r o o p p a l a i s i i n + l ä n s i e u r o o p p a l a i s i l l e + l ä n s i e u r o o p p a l a i s i n a + l ä n s i e u r o o p p a l a i s i s s a + l ä n s i e u r o o p p a l a i s i s t a + l ä n s i e u r o o p p a l a i s t e n + l ä n s i j o u k k o j a + l ä n s i j o u k o t + l ä n s i l a i t u r i + l ä n s i l i i t o s t a + l ä n s i l i i t t o + l ä n s i l i i t t o l a i s e t + l ä n s i l i i t t o u m a + l ä n s i l i i t t o u t u n e i d e n + l ä n s i m a a i l m a + l ä n s i m a a i l m a a + l ä n s i m a a i l m a l l e + l ä n s i m a a i l m a n + l ä n s i m a a i l m a s s a + l ä n s i m a a l a i s e t + l ä n s i m a a l a i s i l l e + l ä n s i m a a l a i s i l t a + l ä n s i m a a l a i s v a s t a i s i s t a + l ä n s i m a a t + l ä n s i m a a t a + l ä n s i m a a t h a n + l ä n s i m a i d e n + l ä n s i m a i h i n + l ä n s i m a i l l a + l ä n s i m a i l l e + l ä n s i m a i n a + l ä n s i m a i n e n + l ä n s i m a i s e e n + l ä n s i m a i s e k s i + l ä n s i m a i s e m m i k s i + l ä n s i m a i s e m p a a + l ä n s i m a i s e n + l ä n s i m a i s e s t i + l ä n s i m a i s i a + l ä n s i m a i s i i n + l ä n s i m a i s i l l e + l ä n s i m a i s i n + l ä n s i m a i s i s s a + l ä n s i m a i s i s t a + l ä n s i m a i s s a + l ä n s i m a i s t e n + l ä n s i m a i t a + l ä n s i m a r k k i n o i l l e + l ä n s i m i e h i t t ä j i l l e + l ä n s i m i e l i n e n + l ä n s i m i e l i s e e n + l ä n s i m i e l i s e n + l ä n s i m i e l i s e t + l ä n s i m i e l i s i ä + l ä n s i m y ö n t e i s e s t ä + l ä n s i m y ö n t e i s i i n + l ä n s i m y ö n t e i s i k s i + l ä n s i n a a p u r i e n + l ä n s i n a a p u r i t + l ä n s i o s a + l ä n s i o s a n + l ä n s i o s a s s a + l ä n s i o s i a + l ä n s i p a p u a l a i s i a + l ä n s i p u o l e l l a + l ä n s i p u o l i + l ä n s i r a j a l l a + l ä n s i r a j a t + l ä n s i r a j o j e n + l ä n s i r a n n a l l a + l ä n s i r a n n a l l e + l ä n s i r a n n a l t a + l ä n s i r a n n a n + l ä n s i r a n n a s t a + l ä n s i r a n n i k k o + l ä n s i r a n n i k k o a + l ä n s i r a n n i k o l l a + l ä n s i r a n n i k o l l e + l ä n s i r a n n i k o l t a + l ä n s i r a n n i k o n + l ä n s i r a n n i k o n s a l a m a n t e r i + l ä n s i r a n t a + l ä n s i r a n t a a + l ä n s i r a n t a a n + l ä n s i r i n t a m a + l ä n s i r i n t a m a l l a + l ä n s i r i n t a m a l t a + l ä n s i r o m a a n i s e t + l ä n s i s a h a r a l a i s e t + l ä n s i s a h a r a l a i s i a + l ä n s i s a h a r a l a i s i l l e + l ä n s i s a h a r a l a i s t a + l ä n s i s a h a r a l a i s t e n + l ä n s i s a h a r a n + l ä n s i s a k s a l a i n e n + l ä n s i s a k s a l a i s e n a + l ä n s i s a k s a l a i s e t + l ä n s i s a k s a l a i s i l l e + l ä n s i s a t a m a + l ä n s i s l a a v i t + l ä n s i s u o m e n k a r j a + l ä n s i t u r i s t i e n + l ä n s i t u r k k i l a i n e n + l ä n s i t u u l t e n + l ä n s i u k r a i n a l a i s t e n + l ä n s i v a l l a t + l ä n s i v a l l o i l t a + l ä n s i v a l t i o i s s a + l ä n s i v a l t o j e n + l ä n s i v a s t a i s e n + l ä n s i v i h a m i e l i s i l l e + l ä n s i v u o r o p u h e l u n + l ä n s i y h t e y k s i e n + l ä n s i y r i t y k s e t + l ä n t e e n + l ä n t i s e n + l ä n t i s i ä + l ä n t i s t e n + l ä p i k u l k u a l u e + l ä p i k u l k u a l u e e n a + l ä p i k u l k u a l u e i l l a + l ä p i k u l k u j ä r j e s t e l m ä s t ä + l ä p i k u l k u k a u p p a a n + l ä p i k u l k u l i i k e n n e + l ä p i k u l k u l i i k e n t e e n + l ä p i k u l k u m a a + l ä p i k u l k u m a a n + l ä p i k u l k u m a h d o l l i s u u d e t + l ä p i k u l k u m a i d e n + l ä p i k u l k u m a i h i n + l ä p i k u l k u p a i k k a n a + l ä p i k u l k u r e i t t e j ä + l ä p i k u l k u r e i t t i + l ä p i k u l k u r e i t t i e n + l ä p i k u l k u r e i t t i n ä + l ä p i k u l k u s o p i m u k s e t + l ä p i k u l k u t e i l l ä + l ä p i k u l k u v a l t i o i t a + l ä p i k u l k u v ä y l ä s t ä + l ä p i k u l u n + l ä p i l e i k k a u s + l ä p i l y ö n t i j ä n n i t e + l ä p i m e n o a i k a + l ä p i m u r r o i s t a + l ä p i m u r r o l l e + l ä p i m u r r o n + l ä p i m u r t o + l ä p i m u r t o a + l ä p i m u r t o a a n + l ä p i m u r t o j a + l ä p i m u r t o k a m p a n j a + l ä p i m u r t o k a m p a n j a a + l ä p i m u r t o n a + l ä p i m u r t o t e k n o l o g i a a + l ä p i m u r t o t u t k i m u k s e n + l ä p i n ä k y m ä t t ö m i s s ä + l ä p i n ä k y m ä t t ö m y y s + l ä p i n ä k y m ä t t ö m ä m m i k s i + l ä p i n ä k y m ä t t ö m ä m m ä k s i + l ä p i n ä k y m ä t t ö m ä n + l ä p i n ä k y m ä t t ö m ä t + l ä p i n ä k y v i ä + l ä p i n ä k y v y y d e s t ä + l ä p i n ä k y v y y t t ä + l ä p i n ä k y v ä m m i k s i + l ä p i n ä k y v ä m m i n + l ä p i n ä k y v ä m m ä k s i + l ä p i n ä k y v ä m m ä l l ä + l ä p i n ä k y v ä m m ä n + l ä p i n ä k y v ä m m ä t + l ä p i n ä k y v ä m p i + l ä p i n ä k y v ä m p i ä + l ä p i n ä k y v ä m p ä ä + l ä p i n ä k y v ä s t i + l ä p i n ä k y v ä t + l ä p i n ä k y v ä ä + l ä p i v a l a i s u a l o i t t e e s t a + l ä p i v a l a i s u l a i t t e i t a + l ä p i v i e m i s e k s i + l ä p p ä v e n t t i i l i + l ä p ä i s e m ä ä n + l ä p ä i s e v ä t + l ä p ä i s y o m i n a i s u u d e n + l ä p ä i s y p e r i a a t e t t a + l ä p ä i s y p e r i a a t t e e l l a + l ä s k i k a p i n a + l ä s n ä o l e v a a + l ä s n ä o l e v a t + l ä s n ä o l e v i a + l ä s n ä o l e v i e n + l ä s n ä o l i j a t + l ä s n ä o l i j o i d e n + l ä s n ä o l i j o i l l e + l ä s n ä o l i j o i s t a + l ä s n ä o l i j o i t a + l ä s n ä o l o a + l ä s n ä o l o a a n + l ä s n ä o l o a n i + l ä s n ä o l o a s t e + l ä s n ä o l o h a l u t t o m u u d e s t a + l ä s n ä o l o k y s y m y k s e e n + l ä s n ä o l o l i s t a + l ä s n ä o l o l i s t a a + l ä s n ä o l o l i s t a a n + l ä s n ä o l o l i s t a l l a + l ä s n ä o l o l i s t a n + l ä s n ä o l o l i s t a s s a + l ä s n ä o l o l i s t a s t a + l ä s n ä o l o l i s t a t + l ä s n ä o l o l i s t o i h i n + l ä s n ä o l o l i s t o i s t a + l ä s n ä o l o l l a a n + l ä s n ä o l o l u e t t e l o i d e n + l ä s n ä o l o l u e t t e l o j e n + l ä s n ä o l o l u e t t e l o o n + l ä s n ä o l o l u e t t e l o s s a + l ä s n ä o l o l u e t t e l o t + l ä s n ä o l o n + l ä s n ä o l o n i + l ä s n ä o l o n n e + l ä s n ä o l o n s a + l ä s n ä o l o o n + l ä s n ä o l o o n s a + l ä s n ä o l o p o l i t i i k k a a + l ä s n ä o l o p ä i v i e n + l ä s n ä o l o p ä i v i ä + l ä s n ä o l o r e k i s t e r i + l ä s n ä o l o s t a + l ä s n ä o l o s t a a n + l ä s n ä o l o s t a n n e + l ä s n ä o l o t i l a n n e k i n + l ä s n ä o l o v e l v o i t e + l ä t t ä j a l k a + l ä v i s t ä j ä m a t r i i s i + l ä ä k e a a l o e + l ä ä k e a i n e e n + l ä ä k e a i n e i d e n + l ä ä k e a i n e i k s i + l ä ä k e a i n e i l l a + l ä ä k e a i n e i l l e + l ä ä k e a i n e i t a + l ä ä k e a i n e j ä ä m i ä + l ä ä k e a i n e k e m i a + l ä ä k e a i n e t u t k i m u s + l ä ä k e a i n e v i r a n o m a i s t a + l ä ä k e a i n e v i r a s t o + l ä ä k e a i n e v i r a s t o n + l ä ä k e a l a + l ä ä k e a l a a + l ä ä k e a l a a n + l ä ä k e a l a l l a + l ä ä k e a l a n + l ä ä k e a n n o s t a + l ä ä k e a p u + l ä ä k e a p u a + l ä ä k e a r v i o i n n i n + l ä ä k e a r v i o i n t i v i r a s t o + l ä ä k e a r v i o i n t i v i r a s t o a + l ä ä k e a r v i o i n t i v i r a s t o n + l ä ä k e a s i a a n + l ä ä k e a s i a n t u n t i j o i d e n + l ä ä k e a v u n + l ä ä k e a v u s t a + l ä ä k e a v u s t u s k a m p a n j a a + l ä ä k e b i s n e s t ä + l ä ä k e d i r e k t i i v i ä + l ä ä k e f o o r u m i + l ä ä k e f o o r u m i l l a + l ä ä k e h a l l i n t o v i r a n o m a i s e t + l ä ä k e h o i d o i l l a + l ä ä k e h o i d o i s t a + l ä ä k e h o i d o l l e + l ä ä k e h o i d o n + l ä ä k e h o i d o s s a + l ä ä k e h o i d o s s a a n + l ä ä k e h o i d o s t a + l ä ä k e h o i d o s t a a n + l ä ä k e h o i d o t + l ä ä k e h o i t o + l ä ä k e h o i t o a + l ä ä k e h o i t o o n + l ä ä k e h u o l t o + l ä ä k e h u o l t o a + l ä ä k e i n n o v a a t i o m a l l e j a + l ä ä k e j a k e l u n + l ä ä k e j ä r j e s t e l m ä l l e + l ä ä k e j ä t t e i s i i n + l ä ä k e k a n n a b i s + l ä ä k e k a s v i + l ä ä k e k a s v i e n + l ä ä k e k a u p a n + l ä ä k e k a u p p a a + l ä ä k e k a u p p a p o l i t i i k k a + l ä ä k e k e h i t y s p r o s e s s i n + l ä ä k e k o k e i d e n + l ä ä k e k u l u j a + l ä ä k e k u l u t + l ä ä k e k u s t a n n u k s e t + l ä ä k e k u s t a n n u k s i a + l ä ä k e l a b o r a t o r i o + l ä ä k e l a b o r a t o r i o i d e n + l ä ä k e l a b o r a t o r i o i l l e + l ä ä k e l a b o r a t o r i o i t a + l ä ä k e l a b o r a t o r i o t + l ä ä k e l a i n s ä ä d ä n n ö n + l ä ä k e l a i n s ä ä d ä n n ö s s ä + l ä ä k e l a i n s ä ä d ä n t ö + l ä ä k e l a i n s ä ä d ä n t ö p a k e t i s t a + l ä ä k e l a i n s ä ä d ä n t ö ä + l ä ä k e l a s k u t + l ä ä k e l u o k a t + l ä ä k e m a i n o n t a a + l ä ä k e m a r k k i n a t + l ä ä k e m a r k k i n o i d e n + l ä ä k e m a r k k i n o i h i n + l ä ä k e m a r k k i n o i l l a + l ä ä k e m a r k k i n o i l l e + l ä ä k e m a r k k i n o i t a + l ä ä k e m e n o j a + l ä ä k e m o n o p o l i e n + l ä ä k e m u o d o n + l ä ä k e m u o t o j a + l ä ä k e m y y n t i ä + l ä ä k e m ä ä r ä + l ä ä k e m ä ä r ä y k s i s t ä + l ä ä k e m ä ä r ä y s + l ä ä k e m ä ä r ä y s t e n + l ä ä k e m ä ä r ä y s t ä + l ä ä k e o i k e u k s i e n + l ä ä k e p a k e t i s t a + l ä ä k e p a k e t t i + l ä ä k e p a k k a u k s e s s a + l ä ä k e p a k k a u k s e t + l ä ä k e p a k k a u k s i s s a + l ä ä k e p a t e n t e i l l a + l ä ä k e p a t e n t t e j a + l ä ä k e p a t e n t t i o i k e u k s i e n + l ä ä k e p o l i t i i k k a + l ä ä k e p o l i t i i k k a a n + l ä ä k e p o l i t i i k k o j e n + l ä ä k e p u l a + l ä ä k e r a h a s t o a + l ä ä k e r e s e p t i + l ä ä k e r e s e p t i t + l ä ä k e r e s e p t i ä + l ä ä k e s e u r a n t a k e r t o m u k s e t + l ä ä k e t e h d a s t a + l ä ä k e t e h t a a l l a + l ä ä k e t e h t a a t + l ä ä k e t e h t a i d e n + l ä ä k e t e h t a i l l a + l ä ä k e t e h t a i t a + l ä ä k e t e k n i i k a s t a + l ä ä k e t e k n o l o g i a t + l ä ä k e t e k n o l o g i s t e n + l ä ä k e t e o l l i s u u d e l l a + l ä ä k e t e o l l i s u u d e l l e + l ä ä k e t e o l l i s u u d e l t a + l ä ä k e t e o l l i s u u d e n + l ä ä k e t e o l l i s u u d e s s a + l ä ä k e t e o l l i s u u d e s t a + l ä ä k e t e o l l i s u u d e t + l ä ä k e t e o l l i s u u s + l ä ä k e t e o l l i s u u s a l a a + l ä ä k e t e o l l i s u u s t u o t t e i d e n + l ä ä k e t e o l l i s u u s y r i t y k s i l l e + l ä ä k e t e o l l i s u u s y r i t y s + l ä ä k e t e o l l i s u u t e e n + l ä ä k e t e o l l i s u u t t a + l ä ä k e t i e d e + l ä ä k e t i e d e m u o t o j e n + l ä ä k e t i e d e t t ä + l ä ä k e t i e t e e k s i + l ä ä k e t i e t e e l l i s e e n + l ä ä k e t i e t e e l l i s e n + l ä ä k e t i e t e e l l i s e s t i + l ä ä k e t i e t e e l l i s e s t ä + l ä ä k e t i e t e e l l i s e t + l ä ä k e t i e t e e l l i s i i n + l ä ä k e t i e t e e l l i s i l l ä + l ä ä k e t i e t e e l l i s i n + l ä ä k e t i e t e e l l i s i s s ä + l ä ä k e t i e t e e l l i s i ä + l ä ä k e t i e t e e l l i s t ä + l ä ä k e t i e t e e n + l ä ä k e t i e t e e n ä + l ä ä k e t i e t e e s e e n + l ä ä k e t i e t e e s s ä + l ä ä k e t i e t e e t + l ä ä k e t i e t e i d e n + l ä ä k e t i e t e i l l e + l ä ä k e t i e t e i s i i n + l ä ä k e t i e t e i s t ä + l ä ä k e t i e t e i t ä + l ä ä k e t i e t o j e n + l ä ä k e t i e t o k a n t a + l ä ä k e t o i m i t u k s i a + l ä ä k e t t ä + l ä ä k e t u o t a n n o n + l ä ä k e t u o t a n t o k a p a s i t e e t t i a + l ä ä k e t u o t t e e l l a + l ä ä k e t u o t t e e s t a + l ä ä k e t u o t t e e t + l ä ä k e t u o t t e i d e n + l ä ä k e t u o t t e i n a + l ä ä k e t u o t t e i s i i n + l ä ä k e t u o t t e i s s a + l ä ä k e t u o t t e i s t a + l ä ä k e t u o t t e i t a + l ä ä k e t u r v a t o i m i n n a n + l ä ä k e t u r v a t o i m i n t a + l ä ä k e t u r v a t o i m i n t a j ä r j e s t e l m i ä + l ä ä k e t u r v a t o i m i n t a j ä r j e s t e l m ä s s ä + l ä ä k e t u r v a t o i m i n t a j ä r j e s t e l m ä s t ä + l ä ä k e t u t k i m u k s e e n + l ä ä k e t u t k i m u k s e n + l ä ä k e t u t k i m u k s i i n + l ä ä k e t u t k i m u s + l ä ä k e t u t k i m u s t a + l ä ä k e t u t k i m u s t e o l l i s u u s + l ä ä k e v a l i k o i m a n + l ä ä k e v a l m i s t a j a t + l ä ä k e v a l m i s t a j i e n + l ä ä k e v a l m i s t a j i l l e + l ä ä k e v a l m i s t a j i l t a + l ä ä k e v a l m i s t e e s t a + l ä ä k e v a l m i s t e e t + l ä ä k e v a l m i s t e i d e n + l ä ä k e v a l m i s t e i k s i + l ä ä k e v a l m i s t e i s i i n + l ä ä k e v a l m i s t e i s s a + l ä ä k e v a l m i s t e i s t a + l ä ä k e v a l m i s t e i t a + l ä ä k e v a l m i s t e k o m i t e a + l ä ä k e v a l m i s t e k o m i t e a s s a + l ä ä k e v a l m i s t e k o m i t e a s t a + l ä ä k e v a l v o n n a n + l ä ä k e v a l v o n t a a n + l ä ä k e v a l v o n t a j ä r j e s t e l m i e n + l ä ä k e v a l v o n t a j ä r j e s t e l m ä + l ä ä k e v a l v o n t a j ä r j e s t e l m ä n + l ä ä k e v a l v o n t a p r o s e s s e j a + l ä ä k e v a l v o n t a p r o s e s s i e n + l ä ä k e v a l v o n t a p r o s e s s i t + l ä ä k e v a l v o n t a r y h m ä s s ä + l ä ä k e v a l v o n t a t i e t o j e n + l ä ä k e v a l v o n t a t y ö r y h m ä + l ä ä k e v a l v o n t a t y ö r y h m ä s s ä + l ä ä k e v a l v o n t a v i r a s t o + l ä ä k e v a r a s t o j e n + l ä ä k e v a r a s t o t + l ä ä k e v i r a n o m a i s e n + l ä ä k e v i r a s t o + l ä ä k e v i r a s t o a + l ä ä k e v i r a s t o j a + l ä ä k e v i r a s t o k i n + l ä ä k e v i r a s t o l l a + l ä ä k e v i r a s t o l l e + l ä ä k e v i r a s t o n + l ä ä k e v i r a s t o o n + l ä ä k e v i r a s t o s s a + l ä ä k e v o i d e m ä ä r ä y k s e n + l ä ä k e v ä ä r e n n y k s i l l e + l ä ä k e v ä ä r e n n ö k s e t + l ä ä k e v ä ä r e n n ö k s i i n + l ä ä k e v ä ä r e n n ö k s i l l e + l ä ä k e v ä ä r e n n ö k s i l l ä + l ä ä k e v ä ä r e n n ö k s i l t ä + l ä ä k e v ä ä r e n n ö k s i s t ä + l ä ä k e v ä ä r e n n ö k s i ä + l ä ä k e v ä ä r e n n ö s t e n + l ä ä k e y h d i s t e l m i i n + l ä ä k e y h t i ö + l ä ä k e y h t i ö i d e n + l ä ä k e y h t i ö i l l e + l ä ä k e y h t i ö i l l ä + l ä ä k e y h t i ö i l t ä + l ä ä k e y h t i ö i s s ä + l ä ä k e y h t i ö i s t ä + l ä ä k e y h t i ö i t ä + l ä ä k e y h t i ö s s ä + l ä ä k e y h t i ö t + l ä ä k e y h t i ö t ä + l ä ä k e y r i t y k s e e n + l ä ä k e y r i t y k s e n + l ä ä k e y r i t y k s e t + l ä ä k e y r i t y k s i e n + l ä ä k e y r i t y k s i l l e + l ä ä k e y r i t y k s i l t ä + l ä ä k e y r i t y k s i ä + l ä ä k e y r i t y s + l ä ä k e y r i t y s t e n + l ä ä k i n n ä l l i s e n + l ä ä k i n n ä l l i s i s t ä + l ä ä k i n n ä l l i s t e n + l ä ä k i n n ä l l i s t ä + l ä ä k i n n ä s s ä + l ä ä k i n t ä a l a l l a + l ä ä k i n t ä a p u a + l ä ä k i n t ä a v u n + l ä ä k i n t ä a v u s t a j a a + l ä ä k i n t ä h a n k k e i d e n + l ä ä k i n t ä h e n k i l ö k u n n a l l e + l ä ä k i n t ä h e n k i l ö k u n n a n + l ä ä k i n t ä h e n k i l ö k u n t a + l ä ä k i n t ä h e n k i l ö s t ö + l ä ä k i n t ä h e n k i l ö s t ö l l e + l ä ä k i n t ä h e n k i l ö s t ö n + l ä ä k i n t ä h e n k i l ö s t ö s t ä + l ä ä k i n t ä h e n k i l ö s t ö ä + l ä ä k i n t ä h o i d o n + l ä ä k i n t ä h o i t o + l ä ä k i n t ä h o i t o a + l ä ä k i n t ä h u o l l o n + l ä ä k i n t ä h u o l t o o n + l ä ä k i n t ä j o u k k o i n a + l ä ä k i n t ä l a i t e o h j e l m i s t o + l ä ä k i n t ä l a i t e t t a + l ä ä k i n t ä l a i t t e i d e n + l ä ä k i n t ä l a i t t e i s s a + l ä ä k i n t ä l a i t t e i s t a + l ä ä k i n t ä l a i t t e i t a + l ä ä k i n t ä l a i v o j a + l ä ä k i n t ä m i e s + l ä ä k i n t ä o h j e i t a + l ä ä k i n t ä o h j e l m a n + l ä ä k i n t ä o i k e u s + l ä ä k i n t ä p a l v e l u i h i n + l ä ä k i n t ä p a l v e l u i s t a + l ä ä k i n t ä p a l v e l u j a + l ä ä k i n t ä p a l v e l u j e n + l ä ä k i n t ä p a l v e l u t + l ä ä k i n t ä p i s t e e t + l ä ä k i n t ä r e s u r s s e j a a n + l ä ä k i n t ä r y h m i ä + l ä ä k i n t ä r y h m ä ä + l ä ä k i n t ä t a r v i k k e e t + l ä ä k i n t ä t a r v i k k e i d e n + l ä ä k i n t ä t a r v i k k e i t a + l ä ä k i n t ä t a v a r o i d e n + l ä ä k i n t ä t o i m i i n + l ä ä k i n t ä t o i m i s s a + l ä ä k i n t ä t u e l l e + l ä ä k i n t ä t u e n + l ä ä k i n t ä v a r u s t e i t a + l ä ä k i n t ä v o i m a v a r o j e n + l ä ä k i n t ä y k s i k k ö + l ä ä k i n t ä y k s i k ö i t ä + l ä ä k i n t ä y k s i k ö t + l ä ä k i t s e m i s t ä + l ä ä k i t y s k u s t a n n u k s i s t a + l ä ä k k e e l l e + l ä ä k k e e l l ä + l ä ä k k e e n + l ä ä k k e e n ä + l ä ä k k e e s e e n + l ä ä k k e e s t ä + l ä ä k k e e t + l ä ä k k e i d e n + l ä ä k k e i k s i + l ä ä k k e i l l e + l ä ä k k e i l l ä + l ä ä k k e i l t ä + l ä ä k k e i n ä + l ä ä k k e i s i i n + l ä ä k k e i s s ä + l ä ä k k e i s t ä + l ä ä k k e i s t ä ä n + l ä ä k k e i t ä + l ä ä k ä r e i d e n + l ä ä k ä r e i l l e + l ä ä k ä r e i l l ä + l ä ä k ä r e i s t ä + l ä ä k ä r e i t ä + l ä ä k ä r i a p u a + l ä ä k ä r i a v u n + l ä ä k ä r i e n + l ä ä k ä r i h a r j o i t t e l i j a + l ä ä k ä r i h a r j o i t t e l i j a a + l ä ä k ä r i h a r j o i t t e l i j a t + l ä ä k ä r i h a r j o i t t e l i j o i d e m m e + l ä ä k ä r i h a r j o i t t e l i j o i d e n + l ä ä k ä r i h a r j o i t t e l i j o i h i n + l ä ä k ä r i h a r j o i t t e l i j o i l l e + l ä ä k ä r i h a r j o i t t e l i j o i s t a + l ä ä k ä r i h a r j o i t t e l i j o i t a + l ä ä k ä r i h e n k i l ö k u n t a + l ä ä k ä r i h o i d o n + l ä ä k ä r i h o i t o a + l ä ä k ä r i i n + l ä ä k ä r i j ä r j e s t ö n + l ä ä k ä r i k e s k u k s i a + l ä ä k ä r i k o l l e g o j e m m e + l ä ä k ä r i k o u l u t u k s e n + l ä ä k ä r i k o u l u t u s + l ä ä k ä r i k s i + l ä ä k ä r i k u n n a n + l ä ä k ä r i k u n n a s t a + l ä ä k ä r i k u n t a + l ä ä k ä r i k u n t a a + l ä ä k ä r i l i i t o n + l ä ä k ä r i l i i t t o + l ä ä k ä r i l i i t t o a + l ä ä k ä r i l l ä + l ä ä k ä r i l t ä + l ä ä k ä r i m m e + l ä ä k ä r i n + l ä ä k ä r i n a m m a t t i + l ä ä k ä r i n a p u + l ä ä k ä r i n a p u a + l ä ä k ä r i n h o i d o l t a + l ä ä k ä r i n h o i d o n + l ä ä k ä r i n h o i d o s t a + l ä ä k ä r i n h o i t o + l ä ä k ä r i n h o i t o a + l ä ä k ä r i n h o i t o i h i n + l ä ä k ä r i n h o i t o o n + l ä ä k ä r i n k u l u j a + l ä ä k ä r i n k u l u j a m m e + l ä ä k ä r i n l a u s u n n o l l a + l ä ä k ä r i n l a u s u n n o n + l ä ä k ä r i n l a u s u n n o t + l ä ä k ä r i n p a l k k i o t + l ä ä k ä r i n t a r k a s t u k s e e n + l ä ä k ä r i n t a r k a s t u k s e s s a + l ä ä k ä r i n t a r k a s t u k s e t + l ä ä k ä r i n t a r k a s t u k s i a + l ä ä k ä r i n t a r k a s t u k s i i n + l ä ä k ä r i n t a r k a s t u k s i l l a + l ä ä k ä r i n t a r k a s t u k s i s s a + l ä ä k ä r i n t a r k a s t u k s i s t a + l ä ä k ä r i n t a r k a s t u s + l ä ä k ä r i n t a r k a s t u s t e n + l ä ä k ä r i n t o d i s t u s + l ä ä k ä r i n t u t k i m u k s e n + l ä ä k ä r i n t u t k i m u s + l ä ä k ä r i n ä + l ä ä k ä r i o i k e u d e n k ä y n t i + l ä ä k ä r i p a l v e l u j a + l ä ä k ä r i p a l v e l u j e n + l ä ä k ä r i p a n e e l i + l ä ä k ä r i p u l a n + l ä ä k ä r i p u l a s t a + l ä ä k ä r i t + l ä ä k ä r i y h d i s t y k s e n + l ä ä k ä r i ä + l ä ä n i n h a l l i t u s + l ä ä n i n h a l l i t u s t a s o l l a + l ä ä n i n h e r r o j a + l ä ä n i n r o v a s t i + l ä ä n i n v a n k i l a + l ä ä n i t y s k u l t t u u r i n + l ö r p p ö l u r i + l ö y d e t t i i n + l ö y d e t t ä v i s s ä + l ö y d e t y n + l ö y d e t ä + l ö y d e t ä ä n + l ö y d e t ä ä n k ö + l ö y d ä m m e + l ö y d ä m m e k ö + l ö y d ö i s t ä ä n + l ö y d ö k s i ä ä n + l ö y h e m m i n + l ö y h e m m ä t + l ö y h e m p i + l ö y h e m p i e n + l ö y h e m p i i n + l ö y h e m p i ä + l ö y h e m p i ä k ä ä n + l ö y h e m p ä ä + l ö y h e n n e t ä ä n + l ö y h i ä + l ö y h k ä s e i t i k k i + l ö y h k ä v a l m u s k a + l ö y s e m p i i n + l ö y s e m p i ä + l ö y s i m m e + l ö y s i n + l ö y s i v ä t + l ö y s t y i + l ö y s ä t ä + l ö y s ä ä m i s t ä + l ö y t y i + l ö y t y m i n e n + l ö y t y m i s e k s i + l ö y t y m ä t t ä + l ö y t y n e e l l e + l ö y t y v ä t + l ö y t y y + l ö y t y y k ö + l ö y t y ä + l ö y t ä i s i + l ö y t ä k ä ä m m e + l ö y t ä m i s e e n + l ö y t ä m i s e k s i + l ö y t ä m i s e l l e + l ö y t ä m i s e s s ä + l ö y t ä m i s e s t ä + l ö y t ä m i s t ä + l ö y t ä m ä m m e + l ö y t ä m ä s s ä + l ö y t ä m ä s t ä + l ö y t ä m ä t t ä + l ö y t ä m ä ä n + l ö y t ä n e e n s ä + l ö y t ä n e e t + l ö y t ä n y t + l ö y t ä v ä n s ä + l ö y t ä v ä t + l ö y t ä v ä t k i n + l ö y t ä ä + l ö y t ä ä k s e e n + l ö y t ä ä k s e m m e + l ö y t ä ä k s e n n e + l ö y t ä ä k ö + l ö y t ö l a p s i + l ö y t ö r e t k e n ä + l ö y t ö r e t k e t + m a a e f e k t i a l u s + m a a e h d o k k a i t a + m a a e k o s y s t e e m i e n + m a a e l ä i m i s t ä + m a a e l ä i n + m a a e l ä i n t e n + m a a e m o + m a a g i s e n + m a a h a n + m a a h a n i + m a a h a n l a s k u j o u k o t + m a a h a n m u u t o l l a + m a a h a n m u u t o l l e + m a a h a n m u u t o n + m a a h a n m u u t o n a l a l l a + m a a h a n m u u t o s t a + m a a h a n m u u t t a j a a + m a a h a n m u u t t a j a e h d o k k a a t + m a a h a n m u u t t a j a e h d o k k a i t a + m a a h a n m u u t t a j a j e n g e j ä + m a a h a n m u u t t a j a k i i n t i ö i t ä + m a a h a n m u u t t a j a k i i n t i ö s t ä + m a a h a n m u u t t a j a k s i + m a a h a n m u u t t a j a l a p s e l l a + m a a h a n m u u t t a j a l a p s e n + m a a h a n m u u t t a j a l a p s e t + m a a h a n m u u t t a j a l a p s i + m a a h a n m u u t t a j a l a p s i a + m a a h a n m u u t t a j a l a p s i i n + m a a h a n m u u t t a j a l a p s i s t a + m a a h a n m u u t t a j a l a s t e n + m a a h a n m u u t t a j a m y ö n t e i n e n + m a a h a n m u u t t a j a n + m a a h a n m u u t t a j a n a i s e t + m a a h a n m u u t t a j a n a i s i a + m a a h a n m u u t t a j a n a i s i i n + m a a h a n m u u t t a j a n a i s i l l a + m a a h a n m u u t t a j a n a i s i l l e + m a a h a n m u u t t a j a n a i s i s t a + m a a h a n m u u t t a j a n a i s t a + m a a h a n m u u t t a j a n a i s t e n + m a a h a n m u u t t a j a n u o r t e n + m a a h a n m u u t t a j a o n g e l m a n + m a a h a n m u u t t a j a p e r h e e t + m a a h a n m u u t t a j a p e r h e i d e n + m a a h a n m u u t t a j a p e r h e i s s ä + m a a h a n m u u t t a j a p e r h e i t ä + m a a h a n m u u t t a j a p o l i i t i k k o + m a a h a n m u u t t a j a p o l i t i i k k a + m a a h a n m u u t t a j a p o t i l a i t a + m a a h a n m u u t t a j a r o m a n e j a + m a a h a n m u u t t a j a r o m a n i e n + m a a h a n m u u t t a j a r y h m i e n + m a a h a n m u u t t a j a r y h m i i n + m a a h a n m u u t t a j a r y h m i l l e + m a a h a n m u u t t a j a r y h m ä + m a a h a n m u u t t a j a r y h m ä n + m a a h a n m u u t t a j a r y h m ä t + m a a h a n m u u t t a j a r y h m ä ä + m a a h a n m u u t t a j a s t a + m a a h a n m u u t t a j a t + m a a h a n m u u t t a j a t a u s t a + m a a h a n m u u t t a j a t a u s t a i s i l l e + m a a h a n m u u t t a j a t a u s t a n + m a a h a n m u u t t a j a t u l v a + m a a h a n m u u t t a j a t u l v a a + m a a h a n m u u t t a j a t y t t ö j e n + m a a h a n m u u t t a j a t y y p p i e n + m a a h a n m u u t t a j a t y ö n t e k i j ä n + m a a h a n m u u t t a j a t y ö n t e k i j ä t + m a a h a n m u u t t a j a t y ö n t e k i j ö i d e n + m a a h a n m u u t t a j a t y ö n t e k i j ö i l l e + m a a h a n m u u t t a j a t y ö n t e k i j ö i s t ä + m a a h a n m u u t t a j a t y ö n t e k i j ö i t ä + m a a h a n m u u t t a j a t y ö v o i m a a + m a a h a n m u u t t a j a t y ö v o i m a n + m a a h a n m u u t t a j a v a n h e m m a t + m a a h a n m u u t t a j a v a n h e m p i a + m a a h a n m u u t t a j a v i r r a n + m a a h a n m u u t t a j a v i r r a t + m a a h a n m u u t t a j a v i r t o i h i n + m a a h a n m u u t t a j a v i r t o j a + m a a h a n m u u t t a j a v i r t o j e n + m a a h a n m u u t t a j a v ä e s t ö + m a a h a n m u u t t a j a v ä e s t ö i h i n + m a a h a n m u u t t a j a v ä e s t ö j e n + m a a h a n m u u t t a j a v ä e s t ö m m e + m a a h a n m u u t t a j a v ä e s t ö n + m a a h a n m u u t t a j a v ä e s t ö s t ä + m a a h a n m u u t t a j a v ä e s t ö ä + m a a h a n m u u t t a j a v ä e s t ö ö n + m a a h a n m u u t t a j a v ä h e m m i s t ö i h i n + m a a h a n m u u t t a j a v ä h e m m i s t ö j e n + m a a h a n m u u t t a j a v ä h e m m i s t ö j ä + m a a h a n m u u t t a j a y h t e i s ö i h i n + m a a h a n m u u t t a j a y h t e i s ö i l l e + m a a h a n m u u t t a j a y h t e i s ö i s s ä + m a a h a n m u u t t a j a y h t e i s ö j e n + m a a h a n m u u t t a j a y h t e i s ö j ä + m a a h a n m u u t t a j a y h t e i s ö s s ä + m a a h a n m u u t t a j a y h t e i s ö ä m m e + m a a h a n m u u t t a j i a + m a a h a n m u u t t a j i e n + m a a h a n m u u t t a j i i n + m a a h a n m u u t t a j i k s i + m a a h a n m u u t t a j i l l e + m a a h a n m u u t t a j i l t a + m a a h a n m u u t t a j i s t a + m a a h a n m u u t t o a + m a a h a n m u u t t o a a l l o l l e + m a a h a n m u u t t o a a l l o n + m a a h a n m u u t t o a a l t o + m a a h a n m u u t t o a a l t o a + m a a h a n m u u t t o a a l t o j a + m a a h a n m u u t t o a a l t o j e n + m a a h a n m u u t t o a i h e t t a + m a a h a n m u u t t o a l a a + m a a h a n m u u t t o a l a l l a + m a a h a n m u u t t o a l a n + m a a h a n m u u t t o a l u e + m a a h a n m u u t t o a s e m a + m a a h a n m u u t t o a s i a + m a a h a n m u u t t o a s i a a + m a a h a n m u u t t o a s i a a n + m a a h a n m u u t t o a s i a n + m a a h a n m u u t t o a s i a s s a + m a a h a n m u u t t o a s i a t + m a a h a n m u u t t o a s i o i d e n + m a a h a n m u u t t o a s i o i h i n + m a a h a n m u u t t o a s i o i s s a + m a a h a n m u u t t o a s i o i s t a + m a a h a n m u u t t o a s i o i t a + m a a h a n m u u t t o a s t e + m a a h a n m u u t t o a s t e e s t a + m a a h a n m u u t t o h i s t o r i a + m a a h a n m u u t t o i l m i ö + m a a h a n m u u t t o i l m i ö l l ä + m a a h a n m u u t t o i l m i ö n + m a a h a n m u u t t o i l m i ö s t ä + m a a h a n m u u t t o i l m i ö t ä + m a a h a n m u u t t o i l m i ö ö n + m a a h a n m u u t t o j ä r j e s t e l m i ä m m e + m a a h a n m u u t t o j ä r j e s t e l m ä + m a a h a n m u u t t o j ä r j e s t e l m ä n + m a a h a n m u u t t o j ä r j e s t e l m ä n s ä + m a a h a n m u u t t o j ä r j e s t e l m ä n ä + m a a h a n m u u t t o j ä r j e s t e l m ä ä + m a a h a n m u u t t o j ä r j e s t e l m ä ä n + m a a h a n m u u t t o k a n a v a a + m a a h a n m u u t t o k a n a v a t + m a a h a n m u u t t o k a n a v i a + m a a h a n m u u t t o k a n a v i e n + m a a h a n m u u t t o k a n a v i s t a + m a a h a n m u u t t o k a n n u s t i m e n + m a a h a n m u u t t o k e s k u k s i s s a + m a a h a n m u u t t o k e s k u s t e l u + m a a h a n m u u t t o k e s k u s t e l u a + m a a h a n m u u t t o k e s k u s t e l u n + m a a h a n m u u t t o k e s k u s t e l u s s a + m a a h a n m u u t t o k e s k u s t e l u s t a + m a a h a n m u u t t o k i e l l o n + m a a h a n m u u t t o k i e l l o s t a + m a a h a n m u u t t o k i e l t o + m a a h a n m u u t t o k i i n t i ö i d e n + m a a h a n m u u t t o k i i n t i ö i t ä + m a a h a n m u u t t o k i i n t i ö t + m a a h a n m u u t t o k o h d e + m a a h a n m u u t t o k o m i t e a + m a a h a n m u u t t o k o n f e r e n s s i + m a a h a n m u u t t o k o n f e r e n s s i a + m a a h a n m u u t t o k o n f e r e n s s i n + m a a h a n m u u t t o k r i i s i + m a a h a n m u u t t o k r i i s i s s ä + m a a h a n m u u t t o k r i i s i s t ä + m a a h a n m u u t t o k r i i s i ä + m a a h a n m u u t t o k r i t e e r i t + m a a h a n m u u t t o k y s y m y k s e e n + m a a h a n m u u t t o k y s y m y k s e n + m a a h a n m u u t t o k y s y m y k s e s s ä + m a a h a n m u u t t o k y s y m y k s e s t ä + m a a h a n m u u t t o k y s y m y k s e t + m a a h a n m u u t t o k y s y m y k s i i n + m a a h a n m u u t t o k y s y m y k s i s s ä + m a a h a n m u u t t o k y s y m y k s i s t ä + m a a h a n m u u t t o k y s y m y k s i ä + m a a h a n m u u t t o k y s y m y s + m a a h a n m u u t t o k y s y m y s t e n + m a a h a n m u u t t o k y s y m y s t ä + m a a h a n m u u t t o l a e i s s a + m a a h a n m u u t t o l a i l l a + m a a h a n m u u t t o l a i n + m a a h a n m u u t t o l a i n s ä ä d ä n n ö l l ä + m a a h a n m u u t t o l a i n s ä ä d ä n n ö n + m a a h a n m u u t t o l a i n s ä ä d ä n n ö s t ä + m a a h a n m u u t t o l a i n s ä ä d ä n t ö + m a a h a n m u u t t o l a i n s ä ä d ä n t ö ä + m a a h a n m u u t t o l a i s s a m m e + m a a h a n m u u t t o l a i s t a + m a a h a n m u u t t o l a k e i h i n + m a a h a n m u u t t o l a k e j a + m a a h a n m u u t t o l a k e j a a n + m a a h a n m u u t t o l a k i + m a a h a n m u u t t o l a k i a + m a a h a n m u u t t o l a k i a a n + m a a h a n m u u t t o l a k i e n + m a a h a n m u u t t o l a k i e n s a + m a a h a n m u u t t o l a k i i n + m a a h a n m u u t t o l a u s e k e + m a a h a n m u u t t o l i i k k e e n + m a a h a n m u u t t o l i i k k e i d e n + m a a h a n m u u t t o l i i k k e i s i i n + m a a h a n m u u t t o l u v u t + m a a h a n m u u t t o m a a + m a a h a n m u u t t o m a h d o l l i s u u d e t + m a a h a n m u u t t o m a i k s i + m a a h a n m u u t t o m a i l l e + m a a h a n m u u t t o m a k s u a + m a a h a n m u u t t o m e k a n i s m i e n + m a a h a n m u u t t o m e n e t t e l y + m a a h a n m u u t t o m e n e t t e l y i h i n + m a a h a n m u u t t o m e n e t t e l y j e n + m a a h a n m u u t t o m e n e t t e l y j ä + m a a h a n m u u t t o m e n e t t e l y n + m a a h a n m u u t t o m i e t i n t ö j ä + m a a h a n m u u t t o m i n i s t e r i + m a a h a n m u u t t o m i n i s t e r i n + m a a h a n m u u t t o m i n i s t e r i n ä + m a a h a n m u u t t o m y ö n t e i n e n + m a a h a n m u u t t o m y ö n t e i s e m p i ä + m a a h a n m u u t t o m y ö n t e i s t ä + m a a h a n m u u t t o m y ö n t e i s y y d e n + m a a h a n m u u t t o m ä ä r ä y k s i l l e + m a a h a n m u u t t o m ä ä r ä y k s i l l ä + m a a h a n m u u t t o m ä ä r ä y k s i ä ä n + m a a h a n m u u t t o n ä k ö k o h t i e n + m a a h a n m u u t t o o n + m a a h a n m u u t t o p a i n e + m a a h a n m u u t t o p a i n e e n + m a a h a n m u u t t o p a i n e e t + m a a h a n m u u t t o p a i n e i d e n + m a a h a n m u u t t o p a i n e i s t a + m a a h a n m u u t t o p a i n e i t a + m a a h a n m u u t t o p a i n e t t a + m a a h a n m u u t t o p a k e t i n + m a a h a n m u u t t o p a k e t i s s a + m a a h a n m u u t t o p a k e t t i + m a a h a n m u u t t o p o l i i t t i n e n + m a a h a n m u u t t o p o l i i t t i s e n + m a a h a n m u u t t o p o l i i t t i s i a + m a a h a n m u u t t o p o l i i t t i s i s t a + m a a h a n m u u t t o p o l i t i i k a k s i + m a a h a n m u u t t o p o l i t i i k a l l a + m a a h a n m u u t t o p o l i t i i k a l l e + m a a h a n m u u t t o p o l i t i i k a l t a + m a a h a n m u u t t o p o l i t i i k a l t a m m e + m a a h a n m u u t t o p o l i t i i k a n + m a a h a n m u u t t o p o l i t i i k a n k i n + m a a h a n m u u t t o p o l i t i i k a s s a + m a a h a n m u u t t o p o l i t i i k a s s a a n + m a a h a n m u u t t o p o l i t i i k a s s a k i n + m a a h a n m u u t t o p o l i t i i k a s s a m m e + m a a h a n m u u t t o p o l i t i i k a s t a + m a a h a n m u u t t o p o l i t i i k a s t a a n + m a a h a n m u u t t o p o l i t i i k a s t a m m e + m a a h a n m u u t t o p o l i t i i k a t + m a a h a n m u u t t o p o l i t i i k k a + m a a h a n m u u t t o p o l i t i i k k a a + m a a h a n m u u t t o p o l i t i i k k a a m m e + m a a h a n m u u t t o p o l i t i i k k a a n + m a a h a n m u u t t o p o l i t i i k k a a n s a + m a a h a n m u u t t o p o l i t i i k k a m m e + m a a h a n m u u t t o p o l i t i i k k a n s a + m a a h a n m u u t t o p o l i t i i k k o i h i n + m a a h a n m u u t t o p o l i t i i k k o i n e e n + m a a h a n m u u t t o p o l i t i i k k o j a + m a a h a n m u u t t o p o l i t i i k k o j e n + m a a h a n m u u t t o p o l i t i i k k o j e n s a + m a a h a n m u u t t o p o l i t i i k o i s s a + m a a h a n m u u t t o p o l i t i i k o i s t a + m a a h a n m u u t t o p o r t a a l i + m a a h a n m u u t t o p r o s e s s i e n + m a a h a n m u u t t o p r o s e s s i s s a + m a a h a n m u u t t o p r o s e s s i s t a + m a a h a n m u u t t o p r o s e s s i t + m a a h a n m u u t t o p u o l i + m a a h a n m u u t t o r e i t t e j ä + m a a h a n m u u t t o r i k o s t e n + m a a h a n m u u t t o r y h m ä n + m a a h a n m u u t t o s e k t o r i l l a + m a a h a n m u u t t o s o p i m u k s e l l a + m a a h a n m u u t t o s o p i m u k s e n + m a a h a n m u u t t o s o p i m u k s e s s a + m a a h a n m u u t t o s o p i m u k s e s t a + m a a h a n m u u t t o s o p i m u k s i a + m a a h a n m u u t t o s o p i m u s + m a a h a n m u u t t o s o p i m u s t a + m a a h a n m u u t t o s t r a t e g i a + m a a h a n m u u t t o s t r a t e g i a a + m a a h a n m u u t t o s t r a t e g i a m m e + m a a h a n m u u t t o s t r a t e g i a n + m a a h a n m u u t t o s t r a t e g i a s t a + m a a h a n m u u t t o s u u n t a u s + m a a h a n m u u t t o s y y n + m a a h a n m u u t t o s ä ä n n ö k s i l l ä + m a a h a n m u u t t o s ä ä n t ö j e n + m a a h a n m u u t t o s ä ä n t ö j ä + m a a h a n m u u t t o t a p a u k s e s s a + m a a h a n m u u t t o t a p a u k s i a + m a a h a n m u u t t o t a r k a s t u k s e t + m a a h a n m u u t t o t a r p e i t a + m a a h a n m u u t t o t a s a p a i n o + m a a h a n m u u t t o t i l a n n e + m a a h a n m u u t t o t i l a n n e t t a + m a a h a n m u u t t o t i l a n t e e s e e n + m a a h a n m u u t t o t i l a n t e e s t a + m a a h a n m u u t t o t o i m i l l a + m a a h a n m u u t t o t o i m i s t o i l l e + m a a h a n m u u t t o t o i m i s t o t + m a a h a n m u u t t o t u l v a + m a a h a n m u u t t o t u l v a l l e + m a a h a n m u u t t o t y ö r y h m ä + m a a h a n m u u t t o v a a t i m u s t e n + m a a h a n m u u t t o v a l v o n t a + m a a h a n m u u t t o v e r k o s t o j e n + m a a h a n m u u t t o v e r k o s t o t + m a a h a n m u u t t o v i r a n o m a i s e t + m a a h a n m u u t t o v i r a n o m a i s i a + m a a h a n m u u t t o v i r a n o m a i s i l l e + m a a h a n m u u t t o v i r a n o m a i s i l t a + m a a h a n m u u t t o v i r a n o m a i s t e n + m a a h a n m u u t t o v i r k a i l i j o i d e n + m a a h a n m u u t t o v i r r a n + m a a h a n m u u t t o v i r r a s t a + m a a h a n m u u t t o v i r r a t + m a a h a n m u u t t o v i r r o i l l e + m a a h a n m u u t t o v i r r o i s t a + m a a h a n m u u t t o v i r r o i s t a a n + m a a h a n m u u t t o v i r t a + m a a h a n m u u t t o v i r t a a + m a a h a n m u u t t o v i r t o i h i n + m a a h a n m u u t t o v i r t o j a + m a a h a n m u u t t o v i r t o j e n + m a a h a n m u u t t o v y ö h y k e + m a a h a n m u u t t o v y ö r y l t ä + m a a h a n m u u t t o v ä h e m m i s t ö i l l e + m a a h a n m u u t t o v ä h e m m i s t ö t + m a a h a n m u u t t o v ä y l i e n + m a a h a n m u u t t o y h t e i s t y ö + m a a h a n n e + m a a h a n p a l u u k i e l t o j a + m a a h a n p a l u u k i e l t o o n + m a a h a n p ä ä s y o i k e u d e n + m a a h a n p ä ä s y p o l i t i i k k a a + m a a h a n s a + m a a h a n t u l o a + m a a h a n t u l o a a l l o t + m a a h a n t u l o a s e m a l l a + m a a h a n t u l o a s e m i a + m a a h a n t u l o a s i o i s s a + m a a h a n t u l o j ä r j e s t e l m ä + m a a h a n t u l o k i e l l o n + m a a h a n t u l o k i e l t o + m a a h a n t u l o k i e l t o a + m a a h a n t u l o k i i n t i ö i s t ä + m a a h a n t u l o k o r t t i + m a a h a n t u l o l t a + m a a h a n t u l o l u p i e n + m a a h a n t u l o m a a n + m a a h a n t u l o m e n e t t e l y ä + m a a h a n t u l o p a i k k o i h i n + m a a h a n t u l o p i s t e i d e n + m a a h a n t u l o p i s t e i t ä + m a a h a n t u l o p o l i t i i k k a + m a a h a n t u l o p o l i t i i k k a a + m a a h a n t u l o p ä i v ä n s ä + m a a h a n t u l o r a j o i t u k s e t + m a a h a n t u l o r a j o i t u k s i a + m a a h a n t u l o r e i t t e j ä + m a a h a n t u l o r i k o k s i s t a + m a a h a n t u l o s ä ä n t ö i h i n + m a a h a n t u l o t a r k a s t u k s e n + m a a h a n t u l o t a r k a s t u k s i l l a + m a a h a n t u l o v a a t i m u k s i e n + m a a h a n t u l o v a l v o n t a + m a a h a n t u l o v i i s u m e i h i n + m a a h a n t u l o v i i s u m e i s t a + m a a h a n t u l o v i i s u m e j a + m a a h a n t u l o v i i s u m i a + m a a h a n t u l o v i i s u m i e n + m a a h a n t u l o v i i s u m i m a k s u j e n + m a a h a n t u l o v i i s u m i n + m a a h a n t u l o v i i s u m i s t a + m a a h a n t u l o v ä y l i ä + m a a h a n t u n k e u t u m i s t a + m a a h a n t u o j a k s i + m a a h a n t u o j a t + m a a h a n t u o j a v a l t i o i d e n + m a a h a n t u o j a v a l t i o i s t a + m a a h a n t u o j i e n + m a a h a n t u o j i k s i + m a a h a n t u o j i l l e + m a a h a n t u o j i s t a + m a a h a n t u o n t i a + m a a h a n t u o n t i i n + m a a h a n t u o n t i j ä r j e s t e l m ä ä + m a a h a n t u o n t i k i e l t o + m a a h a n t u o n t i k i e l t o a + m a a h a n t u o n t i m a k s u j e n + m a a h a n t u o n t i p o l i t i i k a n + m a a h a n t u o n t i v i r a n o m a i s t e n + m a a h a n t u o n t i y h t i ö t + m a a h a n t u o n t i y r i t y k s i ä + m a a h a n t u o t u a + m a a h i n n a t + m a a h o c k e y l i i t t o + m a a h o c k e y m a a j o u k k u e + m a a h o c k e y s s a + m a a h u m a l a + m a a h u o l i n n a n + m a a h u o l i n n a s t a + m a a h u o l i n t a + m a a h u o l i n t a a + m a a h u o l i n t a d i r e k t i i v i s t ä + m a a h u o l i n t a h e n k i l ö s t ö l t ä + m a a h u o l i n t a m a k s u j e n + m a a h u o l i n t a p a l v e l u d i r e k t i i v i ä + m a a h u o l i n t a p a l v e l u i s s a + m a a h u o l i n t a p a l v e l u i s t a + m a a h u o l i n t a p a l v e l u j a + m a a h u o l i n t a p a l v e l u j e n + m a a h u o l i n t a p a l v e l u t + m a a h u o l i n t a y r i t y k s e t + m a a h y ö k k ä y k s e l l ä + m a a h y ö k k ä y k s i s s ä + m a a i l m a a + m a a i l m a a m m e + m a a i l m a a n + m a a i l m a h a n + m a a i l m a k a u p a n + m a a i l m a k a u p a s t a + m a a i l m a k a u p p a a + m a a i l m a k a u p p a j ä r j e s t e l m ä n + m a a i l m a k i n + m a a i l m a k o l k a s s a + m a a i l m a k o l k a s t a + m a a i l m a k s i + m a a i l m a l a a j u i s e l l a + m a a i l m a l a a j u i s i a + m a a i l m a l a a j u i s i l l e + m a a i l m a l l a + m a a i l m a l l e + m a a i l m a l t a + m a a i l m a l u o k a n + m a a i l m a m a r k k i n a h i n t o i h i n + m a a i l m a m a r k k i n o i d e n + m a a i l m a m a r k k i n o i h i n + m a a i l m a m a r k k i n o i l l a + m a a i l m a m a r k k i n o i l t a + m a a i l m a m m e + m a a i l m a n + m a a i l m a n c u p + m a a i l m a n c u p i a + m a a i l m a n c u p i i n + m a a i l m a n c u p i n + m a a i l m a n c u p i s s a + m a a i l m a n c u p i s t a + m a a i l m a n e n n ä t y k s e n + m a a i l m a n e n n ä t y k s e t + m a a i l m a n e n n ä t y s + m a a i l m a n e n n ä t y s m a a + m a a i l m a n e n n ä t y s t ä + m a a i l m a n f o o r u m i n + m a a i l m a n h a l l i n n o n + m a a i l m a n h a l l i n n o s s a + m a a i l m a n h a l l i n t o + m a a i l m a n h a l l i n t o a + m a a i l m a n h a l l i t u k s e n + m a a i l m a n h a l l i t u s + m a a i l m a n h e r r u u d e s t a + m a a i l m a n h e r r u u t t a + m a a i l m a n h i n t o j e n + m a a i l m a n h i s t o r i a + m a a i l m a n h i s t o r i a a + m a a i l m a n h i s t o r i a a n + m a a i l m a n h i s t o r i a n + m a a i l m a n h i s t o r i a s s a + m a a i l m a n h i s t o r i a s t a + m a a i l m a n h u i p p u k o k o u k s e n + m a a i l m a n h u i p p u k o k o u s t a + m a a i l m a n j a m b o r e e + m a a i l m a n j o h t a j a + m a a i l m a n j o h t a j a n a + m a a i l m a n j o h t a j i a + m a a i l m a n j o h t a j i e n + m a a i l m a n j o h t a v a a + m a a i l m a n j ä r j e s t e l m ä s s ä + m a a i l m a n j ä r j e s t e l m ä ä + m a a i l m a n j ä r j e s t y k s e e n + m a a i l m a n j ä r j e s t y k s e l l e + m a a i l m a n j ä r j e s t y k s e m m e + m a a i l m a n j ä r j e s t y k s e n + m a a i l m a n j ä r j e s t y k s e s s ä + m a a i l m a n j ä r j e s t y k s e s t ä + m a a i l m a n j ä r j e s t y s + m a a i l m a n j ä r j e s t y s t ä + m a a i l m a n j ä r j e s t ö + m a a i l m a n j ä r j e s t ö j e n + m a a i l m a n j ä r j e s t ö n + m a a i l m a n k a i k k e u d e s t a + m a a i l m a n k a l e n t e r i + m a a i l m a n k a n s a l a i n e n + m a a i l m a n k a n s a l a i s i a + m a a i l m a n k a n s a l a i s t e n + m a a i l m a n k a n s a l a i s u u s + m a a i l m a n k a n s a l a i s u u t t a + m a a i l m a n k a r t a l l a + m a a i l m a n k a r t a l t a + m a a i l m a n k a r t t a + m a a i l m a n k a s i n o a + m a a i l m a n k a t s o m u k s e e n + m a a i l m a n k a t s o m u k s e k s i + m a a i l m a n k a t s o m u k s e l l i s t a + m a a i l m a n k a t s o m u k s e n + m a a i l m a n k a t s o m u k s e n s a + m a a i l m a n k a t s o m u s + m a a i l m a n k a t s o m u s t a + m a a i l m a n k a u p a l l e + m a a i l m a n k a u p a n + m a a i l m a n k a u p a s s a + m a a i l m a n k a u p a s t a + m a a i l m a n k a u p p a + m a a i l m a n k a u p p a a + m a a i l m a n k a u p p a a n + m a a i l m a n k a u p p a j ä r j e s t e l m ä + m a a i l m a n k a u p p a j ä r j e s t e l m ä n + m a a i l m a n k a u p p a j ä r j e s t e l m ä s t ä + m a a i l m a n k a u p p a j ä r j e s t e l m ä ä + m a a i l m a n k a u p p a j ä r j e s t e l m ä ä n + m a a i l m a n k a u p p a j ä r j e s t ö + m a a i l m a n k a u p p a j ä r j e s t ö n + m a a i l m a n k a u p p a j ä r j e s t ö s s ä + m a a i l m a n k a u p p a j ä r j e s t ö ö n + m a a i l m a n k a u p p a n e u v o t t e l u i s s a + m a a i l m a n k a u p p a n e u v o t t e l u j e n + m a a i l m a n k a u p p a n e u v o t t e l u t + m a a i l m a n k a u p p a p o l i t i i k a n + m a a i l m a n k a u p p a p o l i t i i k k a a n s a + m a a i l m a n k a u p p a s o p i m u k s e n + m a a i l m a n k a u p p a s o p i m u k s e s t a + m a a i l m a n k a u p p a s o p i m u k s e t + m a a i l m a n k a u p p a s o p i m u s t a + m a a i l m a n k a u p p o j a + m a a i l m a n k a u p u n k i + m a a i l m a n k e l l o + m a a i l m a n k e s k u s + m a a i l m a n k i e l e t + m a a i l m a n k i e l i + m a a i l m a n k i e l t ä + m a a i l m a n k i s a t + m a a i l m a n k i s o i h i n + m a a i l m a n k o k o u k s e n + m a a i l m a n k o k o u k s e s s a + m a a i l m a n k o k o u s + m a a i l m a n k o l k a l l a + m a a i l m a n k o l k a n + m a a i l m a n k o l k a s s a + m a a i l m a n k o l k a s s a a n + m a a i l m a n k o l k a s s a m m e + m a a i l m a n k o l k a s t a + m a a i l m a n k o l k i s s a + m a a i l m a n k o l k k a a + m a a i l m a n k o l k k a m m e + m a a i l m a n k o l k k i i n + m a a i l m a n k o m i s s i o n + m a a i l m a n k o m i s s i o s s a + m a a i l m a n k o m m u n i s m i + m a a i l m a n k o n f e r e n s s e j a + m a a i l m a n k o n f e r e n s s i + m a a i l m a n k o n f e r e n s s i a + m a a i l m a n k o n f e r e n s s i i n + m a a i l m a n k o n f e r e n s s i n + m a a i l m a n k o n f e r e n s s i s s a + m a a i l m a n k o n f e r e n s s i s t a + m a a i l m a n k o n g r e s s i + m a a i l m a n k o n g r e s s i i n + m a a i l m a n k o n g r e s s i l l e + m a a i l m a n k o n g r e s s i n + m a a i l m a n k r i i s i e n + m a a i l m a n k u l t t u u r i + m a a i l m a n k u l t t u u r i i n + m a a i l m a n k u l t t u u r i n + m a a i l m a n k u l t t u u r i p e r i n t ö a r v o a + m a a i l m a n k u r s s i a + m a a i l m a n k u u l u + m a a i l m a n k u u l u a + m a a i l m a n k u u l u i l l e + m a a i l m a n k u u l u j a + m a a i l m a n k u u l u l l e + m a a i l m a n k u u l u n + m a a i l m a n k u u l u t + m a a i l m a n k u v a + m a a i l m a n k u v a a + m a a i l m a n k u v a a m m e + m a a i l m a n k u v a a n s a + m a a i l m a n k u v a n + m a a i l m a n k u v a s t a + m a a i l m a n k u v i e n + m a a i l m a n k u v i i n + m a a i l m a n k y l ä + m a a i l m a n k y l ä n + m a a i l m a n k y l ä s s ä + m a a i l m a n k y l ä s t ä + m a a i l m a n k y l ä ä + m a a i l m a n k ä s i t y k s e s t ä + m a a i l m a n k ä s i t y k s i i m m e + m a a i l m a n k ä s i t y s t ä + m a a i l m a n l a a j u i n e n + m a a i l m a n l a a j u i s e e n + m a a i l m a n l a a j u i s e k s i + m a a i l m a n l a a j u i s e l l a + m a a i l m a n l a a j u i s e l l e + m a a i l m a n l a a j u i s e l t a + m a a i l m a n l a a j u i s e m m a n + m a a i l m a n l a a j u i s e m m a s s a + m a a i l m a n l a a j u i s e m m i n + m a a i l m a n l a a j u i s e m m i n k i n + m a a i l m a n l a a j u i s e m p a a + m a a i l m a n l a a j u i s e m p i i n + m a a i l m a n l a a j u i s e n + m a a i l m a n l a a j u i s e n a + m a a i l m a n l a a j u i s e s s a + m a a i l m a n l a a j u i s e s t a + m a a i l m a n l a a j u i s e s t i + m a a i l m a n l a a j u i s e s t i k i n + m a a i l m a n l a a j u i s e t + m a a i l m a n l a a j u i s i a + m a a i l m a n l a a j u i s i i n + m a a i l m a n l a a j u i s i k s i + m a a i l m a n l a a j u i s i l l a + m a a i l m a n l a a j u i s i l l e + m a a i l m a n l a a j u i s i s s a + m a a i l m a n l a a j u i s i s t a + m a a i l m a n l a a j u i s t a + m a a i l m a n l a a j u i s t e n + m a a i l m a n l a a j u i s t u e s s a + m a a i l m a n l a a j u i s t u m i s e e n + m a a i l m a n l a a j u i s t u m i s e n + m a a i l m a n l a a j u i s t u m i s e n k i n + m a a i l m a n l a a j u i s t u m i s e s s a + m a a i l m a n l a a j u i s t u m i s e s t a + m a a i l m a n l a a j u i s t u m i s i l m i ö n + m a a i l m a n l a a j u i s t u m i s k e h i t y k s e l l e + m a a i l m a n l a a j u i s t u m i s k e h i t y s t ä + m a a i l m a n l a a j u i s t u m i s k y s y m y k s e s s ä + m a a i l m a n l a a j u i s t u m i s o p i n + m a a i l m a n l a a j u i s t u m i s p r o s e s s e j a + m a a i l m a n l a a j u i s t u m i s p r o s e s s i a + m a a i l m a n l a a j u i s t u m i s p r o s e s s i i n + m a a i l m a n l a a j u i s t u m i s p r o s e s s i n + m a a i l m a n l a a j u i s t u m i s p r o s e s s i s s a + m a a i l m a n l a a j u i s t u m i s p r o s e s s i t + m a a i l m a n l a a j u i s t u m i s t a + m a a i l m a n l a a j u i s t u m i s t a i s t e l u + m a a i l m a n l a a j u i s t u v a s s a + m a a i l m a n l a a j u i s t u v a t + m a a i l m a n l i i g a + m a a i l m a n l i i t t o + m a a i l m a n l o p p u + m a a i l m a n l o p p u a + m a a i l m a n l o p u s t a + m a a i l m a n l u o k a n + m a a i l m a n l u o k k a a + m a a i l m a n m a h d i n + m a a i l m a n m a h d i s t a + m a a i l m a n m a h d i t + m a a i l m a n m a h t e i h i n + m a a i l m a n m a h t e j a + m a a i l m a n m a h t i + m a a i l m a n m a h t i e n + m a a i l m a n m a l l i + m a a i l m a n m a r k k i n a + m a a i l m a n m a r k k i n a h i n n a n + m a a i l m a n m a r k k i n a h i n n a t + m a a i l m a n m a r k k i n a h i n n o i l l a + m a a i l m a n m a r k k i n a h i n n o i n + m a a i l m a n m a r k k i n a h i n n o i s s a + m a a i l m a n m a r k k i n a h i n n o i s t a + m a a i l m a n m a r k k i n a h i n t a + m a a i l m a n m a r k k i n a h i n t a a + m a a i l m a n m a r k k i n a h i n t a a n + m a a i l m a n m a r k k i n a h i n t o i h i n + m a a i l m a n m a r k k i n a h i n t o j a + m a a i l m a n m a r k k i n a h i n t o j e n + m a a i l m a n m a r k k i n a n ä k y m ä t + m a a i l m a n m a r k k i n a o s u u d e t + m a a i l m a n m a r k k i n a o s u u k s i a + m a a i l m a n m a r k k i n a o s u u t e e n + m a a i l m a n m a r k k i n a o s u u t t a a n + m a a i l m a n m a r k k i n a t + m a a i l m a n m a r k k i n a t a s o l l a + m a a i l m a n m a r k k i n a t a s o o n + m a a i l m a n m a r k k i n a t i l a n n e + m a a i l m a n m a r k k i n a t i l a n n e t t a + m a a i l m a n m a r k k i n a t i l a n t e e l l e + m a a i l m a n m a r k k i n a t i l a n t e e s t a + m a a i l m a n m a r k k i n a t o i m i j a n + m a a i l m a n m a r k k i n a t o i m i t t a j i e n + m a a i l m a n m a r k k i n o i d e n + m a a i l m a n m a r k k i n o i h i n + m a a i l m a n m a r k k i n o i l l a + m a a i l m a n m a r k k i n o i l l a k i n + m a a i l m a n m a r k k i n o i l l e + m a a i l m a n m a r k k i n o i l t a + m a a i l m a n m a r k k i n o i l t a k i n + m a a i l m a n m a r k k i n o i s t a + m a a i l m a n m a r k k i n o i t a + m a a i l m a n m a t k a a j a + m a a i l m a n m e s t a r e i s t a + m a a i l m a n m e s t a r e i t a + m a a i l m a n m e s t a r i + m a a i l m a n m e s t a r i n + m a a i l m a n m e s t a r u u d e n + m a a i l m a n m e s t a r u u s k i l p a i l u i d e n + m a a i l m a n m e s t a r u u s k i l p a i l u i h i n + m a a i l m a n m e s t a r u u s k i l p a i l u i n a + m a a i l m a n m e s t a r u u s k i l p a i l u i s s a + m a a i l m a n m e s t a r u u s k i l p a i l u j e n + m a a i l m a n m e s t a r u u s k i l p a i l u t + m a a i l m a n m e s t a r u u s k i s a t + m a a i l m a n m e s t a r u u s k i s o i h i n + m a a i l m a n m e s t a r u u s k i s o i s s a + m a a i l m a n m e s t a r u u s k i s o i s t a + m a a i l m a n m e s t a r u u s k i s o j a + m a a i l m a n m e s t a r u u s k i s o j e n + m a a i l m a n m e s t a r u u s o t t e l u j a + m a a i l m a n m u s i i k k i + m a a i l m a n m u u t o k s e s t a + m a a i l m a n n a p a + m a a i l m a n n ä k e m y k s e s t ä ä n + m a a i l m a n n ä k e m y s t ä + m a a i l m a n n ä y t t e l y + m a a i l m a n n ä y t t e l y s s ä + m a a i l m a n n ä y t t ä m ö l l e + m a a i l m a n n ä y t t ä m ö l l ä + m a a i l m a n n ä y t t ä m ö l t ä + m a a i l m a n n ä y t t ä m ö n + m a a i l m a n o s a a + m a a i l m a n o s a a n + m a a i l m a n o s a n + m a a i l m a n o s a s s a + m a a i l m a n o s i i n + m a a i l m a n o s i s t a + m a a i l m a n p a l o + m a a i l m a n p a l o k s i + m a a i l m a n p a l o n + m a a i l m a n p a l o o n + m a a i l m a n p a n k i l l a + m a a i l m a n p a n k i l l e + m a a i l m a n p a n k i l t a + m a a i l m a n p a n k i n + m a a i l m a n p a n k i s s a + m a a i l m a n p a n k i s t a + m a a i l m a n p a n k k i + m a a i l m a n p a n k k i a + m a a i l m a n p a n k k i i n + m a a i l m a n p a n k k i k i n + m a a i l m a n p a r a n t a j a + m a a i l m a n p a t e n t t i i n + m a a i l m a n p e r i n n ö k s i + m a a i l m a n p e r i n t ö a l u e e k s i + m a a i l m a n p e r i n t ö k o h d e + m a a i l m a n p e r i n t ö k o h d e s t a t u s t a + m a a i l m a n p e r i n t ö k o h d e t t a + m a a i l m a n p e r i n t ö k o h t e e k s i + m a a i l m a n p e r i n t ö k o h t e e n + m a a i l m a n p e r i n t ö k o h t e e s t a + m a a i l m a n p e r i n t ö k o h t e i d e n + m a a i l m a n p e r i n t ö k o h t e i s i i n + m a a i l m a n p e r i n t ö k o h t e i s t a + m a a i l m a n p e r i n t ö k o m i t e a + m a a i l m a n p e r i n t ö l u e t t e l o + m a a i l m a n p e r i n t ö l u e t t e l o n + m a a i l m a n p e r i n t ö l u e t t e l o o n + m a a i l m a n p e r i n t ö l u e t t e l o o n s a + m a a i l m a n p e r i n t ö l u e t t e l o s s a + m a a i l m a n p e r i n t ö l u e t t e l o s t a + m a a i l m a n p e r i n t ö m m e + m a a i l m a n p e r i n t ö n ä + m a a i l m a n p e r i n t ö o h j e l m a n + m a a i l m a n p e r i n t ö s t a t u s t a + m a a i l m a n p e r i n t ö ä + m a a i l m a n p e r i n t ö ä m m e + m a a i l m a n p e r i n t ö ö n + m a a i l m a n p o l i i s i + m a a i l m a n p o l i i s i k s i + m a a i l m a n p o l i i s i n + m a a i l m a n p o l i i s i n a + m a a i l m a n p o l i i s i n s a + m a a i l m a n p o l i i t t i n e n + m a a i l m a n p o l i i t t i s e l l a + m a a i l m a n p o l i i t t i s e n + m a a i l m a n p o l i i t t i s e s s a + m a a i l m a n p o l i i t t i s e s t a + m a a i l m a n p o l i i t t i s e s t i + m a a i l m a n p o l i i t t i s t a + m a a i l m a n p o l i t i i k a l l e + m a a i l m a n p o l i t i i k a n + m a a i l m a n p o l i t i i k a s s a + m a a i l m a n p o l i t i i k k a + m a a i l m a n p o l i t i i k k a a + m a a i l m a n p o l i t i i k k a a n + m a a i l m a n p o s t i s o p i m u k s e s s a + m a a i l m a n p o s t i s o p i m u k s e s t a + m a a i l m a n p u u + m a a i l m a n p y l v ä s + m a a i l m a n p y ö r ä + m a a i l m a n r a k e n n u s + m a a i l m a n r a n k i n g + m a a i l m a n r a u h a + m a a i l m a n r a u h a a + m a a i l m a n r a u h a a n + m a a i l m a n r a u h a l l e + m a a i l m a n r a u h a n + m a a i l m a n r a u h a s t a + m a a i l m a n s a + m a a i l m a n s i l m ä + m a a i l m a n s i r k u s + m a a i l m a n s o d a k s i + m a a i l m a n s o d a l l a + m a a i l m a n s o d a l l e + m a a i l m a n s o d a n + m a a i l m a n s o d a s s a + m a a i l m a n s o d a s t a + m a a i l m a n s o d i s s a + m a a i l m a n s o t a + m a a i l m a n s o t a a + m a a i l m a n s o t a a n + m a a i l m a n s o t i a + m a a i l m a n s o t i e n + m a a i l m a n t a l o u d e k s i + m a a i l m a n t a l o u d e l l e + m a a i l m a n t a l o u d e l l e m m e + m a a i l m a n t a l o u d e l l i s e n + m a a i l m a n t a l o u d e n + m a a i l m a n t a l o u d e s s a + m a a i l m a n t a l o u d e s t a + m a a i l m a n t a l o u k s i s s a + m a a i l m a n t a l o u s + m a a i l m a n t a l o u t e e n + m a a i l m a n t a l o u t e m m e + m a a i l m a n t a l o u t t a + m a a i l m a n t a p a h t u m a + m a a i l m a n t a p a h t u m a t + m a a i l m a n t a p a h t u m i a + m a a i l m a n t a p a h t u m i i n + m a a i l m a n t a s o l l a + m a a i l m a n t e r v e y s j ä r j e s t ö + m a a i l m a n t i l a n n e + m a a i l m a n t i l a n n e t t a + m a a i l m a n t i l a n t e e n + m a a i l m a n t i l a n t e e s e e n + m a a i l m a n t i l a n t e e s s a + m a a i l m a n t u o t a n n o s t a + m a a i l m a n t u o t a n t o + m a a i l m a n u s k o n n o n + m a a i l m a n u s k o n n o t + m a a i l m a n u s k o n t o a + m a a i l m a n u u t i s t e n + m a a i l m a n v a l l a n + m a a i l m a n v a l l a n k u m o u s + m a a i l m a n v a l l a n k u m o u s t a + m a a i l m a n v a l l a t + m a a i l m a n v a l l o i s s a + m a a i l m a n v a l l o i s t a + m a a i l m a n v a l l o i t u s s t r a t e g i a a + m a a i l m a n v a l t a + m a a i l m a n v a l t a n a + m a a i l m a n v a l t i o t a + m a a i l m a n v a l t o i h i n + m a a i l m a n v a l t o j a + m a a i l m a n v a l t o j e n + m a a i l m a n v a l u u t a k s i + m a a i l m a n v a l u u t a n + m a a i l m a n v a l u u t t a + m a a i l m a n v a l u u t t a a + m a a i l m a n v a l u u t t a n a + m a a i l m a n v a l u u t t o j e n + m a a i l m a n v i i v a + m a a i l m a n y h t e i s ö + m a a i l m a n y h t e i s ö j e n + m a a i l m a n y h t e i s ö l t ä + m a a i l m a n y h t e i s ö n + m a a i l m a n y h t e i s ö n ä + m a a i l m a n y h t e i s ö s s ä + m a a i l m a n y h t e i s ö ä + m a a i l m a p a n k k i + m a a i l m a p e r i n t ö ä + m a a i l m a s o d a n + m a a i l m a s o t a a n + m a a i l m a s o t i a + m a a i l m a s s a + m a a i l m a s s a k i n + m a a i l m a s s a m m e + m a a i l m a s t a + m a a i l m a t a l o u d e s s a + m a a i l m a t a l o u s + m a a i l m a y m p ä r y s m a t k a a n + m a a i n s t i t u u t i n + m a a j o u k k o j a + m a a j o u k k o j a m m e + m a a j o u k k o j e n + m a a j o u k k u e + m a a j o u k k u e e n + m a a j o u k k u e e s s a + m a a j o u k k u e e t + m a a j o u k k u e i d e n + m a a j o u k k u e i l l a + m a a j o u k o i n + m a a j o u k o t + m a a k a a s u + m a a k a a s u a + m a a k a a s u a l a a + m a a k a a s u a l a a n + m a a k a a s u a l a n + m a a k a a s u a l o j e n + m a a k a a s u d i r e k t i i v i n + m a a k a a s u d i r e k t i i v i s s ä + m a a k a a s u d i r e k t i i v i ä + m a a k a a s u e s i i n t y m i e n + m a a k a a s u h u i p p u + m a a k a a s u j o h t o + m a a k a a s u k e n t ä t + m a a k a a s u k i n + m a a k a a s u k r i i s i s s ä + m a a k a a s u k y s y m y s + m a a k a a s u l l a + m a a k a a s u l l e + m a a k a a s u l ä h t e i d e n + m a a k a a s u l ä h t e i l l e + m a a k a a s u l ä h t e i s i i n + m a a k a a s u l ä h t e i s s ä + m a a k a a s u l ä h t e i s t ä + m a a k a a s u l ä h t e i t ä + m a a k a a s u m a r k k i n a t + m a a k a a s u m a r k k i n o i d e n + m a a k a a s u m a r k k i n o i l l a + m a a k a a s u m a r k k i n o i l l e + m a a k a a s u m a r k k i n o i t a + m a a k a a s u m u o t o j e n + m a a k a a s u n + m a a k a a s u n s i i r t o v e r k k o i h i n + m a a k a a s u n s i i r t o v e r k o t + m a a k a a s u p o l i t i i k k a + m a a k a a s u p u t k i + m a a k a a s u p u t k i a + m a a k a a s u p u t k i l l a + m a a k a a s u r a t k a i s u j a + m a a k a a s u s t a + m a a k a a s u t a n k k e r e i t a + m a a k a a s u t a r j o n n a n + m a a k a a s u t e r m i n a a l i + m a a k a a s u t o i m i t u k s i a + m a a k a a s u t o i m i t u k s i l l e + m a a k a a s u t o i m i t u k s i s s a + m a a k a a s u t o i m i t u k s i s t a + m a a k a a s u t o i m i t u s t e n + m a a k a a s u t u o t a n n o l l e + m a a k a a s u t u o t a n n o n + m a a k a a s u t u o t a n t o n s a + m a a k a a s u t u o t t e i s t a + m a a k a a s u u n + m a a k a a s u v a r a n t o j a + m a a k a a s u v a r a s t o i s t a m m e + m a a k a a s u v a r a s t o j e n + m a a k a a s u v a r a t + m a a k a a s u v a r o i s t a + m a a k a a s u v e r k k o i h i n + m a a k a a s u v e r k k o o n + m a a k a a s u v e r k o i s t a + m a a k a a s u v e r k o n + m a a k a i s t a l e + m a a k a i s t a l e e n + m a a k a l u s t o a + m a a k a r h u + m a a k a r h u u n + m a a k a u p o i s s a + m a a k a u p p a a + m a a k a u p p o i h i n + m a a k e i n o t t e l u l t a + m a a k e r r o k s e t + m a a k e r r o k s i s t a + m a a k e r t o m u k s i s t a + m a a k i i t ä j ä i s e t + m a a k i m a l a i n e n + m a a k o h t a i n e n + m a a k o h t a i s e e n + m a a k o h t a i s e n + m a a k o h t a i s e s t i + m a a k o h t a i s e t + m a a k o h t a i s i a + m a a k o h t a i s i i n + m a a k o h t a i s i l l e + m a a k o h t a i s i s t a + m a a k o h t a i s t a + m a a k o h t a i s t e n + m a a k o m i t e a + m a a k o n f e r e n s s i s s a + m a a k o o d e i s t a + m a a k o t k a + m a a k u l j e t u k s e n + m a a k u l j e t u k s e t + m a a k u l j e t u k s i a + m a a k u l j e t u k s i l l e + m a a k u l j e t u k s i s s a + m a a k u l j e t u k s i s t a + m a a k u l j e t u s a l a a n + m a a k u l j e t u s r e i t t i e n + m a a k u l j e t u s t e n + m a a k u n n i s s a + m a a k u n t a a n + m a a k u n t a h a l l i t u s + m a a k u n t a h a l l i t u s t a + m a a k u n t a j o h t a j i e n + m a a k u n t a l a k i + m a a k u n t a n e u v o s t o i h i n + m a a k u n t a n e u v o s t o j e n + m a a k u n t a n e u v o s t o n + m a a k u n t a p o l i t i i k k a a n + m a a k u n t a t a s o l l a + m a a k u n t a t a s o n + m a a k u n t a t a s o o n + m a a k u n t a v a a l e j a + m a a k u n t a v a a l i e n + m a a k u n t a v a a l i t + m a a k u n t i e n + m a a k u n t i i n + m a a k y s y m y s + m a a k y s y m y s t e n + m a a k ä r ä j ä k u n t a + m a a l a a m a a n + m a a l a i n + m a a l a i n s ä ä d ä n n ö n + m a a l a i s i n a + m a a l a i s j ä r j e l l e + m a a l a i s j ä r j e l l ä + m a a l a i s j ä r j e n + m a a l a i s j ä r j e s t ä + m a a l a i s j ä r k e e n + m a a l a i s j ä r k e e n n e + m a a l a i s j ä r k e ä + m a a l a i s j ä r k e ä m m e + m a a l a i s j ä r k e ä ä n + m a a l a i s j ä r k i + m a a l a i s j ä r k i k i n + m a a l a i s k i a i s e t + m a a l a i s k y l ä s s ä + m a a l a i s m a i s e m a + m a a l a i s m a r k k i n o i l l a + m a a l a i s n a i n e n + m a a l a i s n a i s e l l e + m a a l a i s n a i s i i n + m a a l a i s n u o r i s t a + m a a l a j i t e + m a a l a r e i t a + m a a l a r i + m a a l a r i n s y n d r o o m a + m a a l a r i n t e i p p i + m a a l a r i t + m a a l a u s u n n o i s t a + m a a l i a + m a a l i d i r e k t i i v i l l ä + m a a l i d i r e k t i i v i s s ä + m a a l i i k e n n e + m a a l i i k e n n e m a t k u s t a j i e n + m a a l i i k e n n e m u o t o j e n + m a a l i i k e n n e p a k e t t i a + m a a l i i k e n n e p a k e t t i i n + m a a l i i k e n n e r e i t t i ä + m a a l i i k e n n e t t ä + m a a l i i k e n n e v i r t o j e n + m a a l i i k e n t e e n + m a a l i i k e n t e e s e e n + m a a l i i n + m a a l i i n t u l o a + m a a l i i t t o + m a a l i k a m e r a + m a a l i l i n j a + m a a l i l i n j a a + m a a l i n + m a a l i n a + m a a l i n o s o i t u s l a s e r + m a a l i n p o i s t o a i n e + m a a l i n p o i s t o a i n e e n + m a a l i n p o i s t o a i n e i d e n + m a a l i n p o i s t o a i n e i s s a + m a a l i n p o i s t o a i n e s ä i l i ö i s t ä + m a a l i n p o i s t o o n + m a a l i n p o i s t o s t a + m a a l i s k u u h u n + m a a l i s k u u n + m a a l i s k u u s s a + m a a l i s k u u s t a + m a a l i s k u u t a + m a a l i t a u l u i k s i + m a a l i t a u l u j a + m a a l i t a u l u k s i + m a a l i t a u l u l a j i + m a a l i t e o l l i s u u d e l l e + m a a l i t e o l l i s u u d e s s a + m a a l i t e o l l i s u u s + m a a l i t o l p a t + m a a l i t u o t t e i t a + m a a l i v i i v a + m a a l i v i i v a l l a + m a a l i v i i v a l l e + m a a l i v i i v a n + m a a l i v i i v a t e k n o l o g i a + m a a l l a + m a a l l a m m e + m a a l l e + m a a l l e e n + m a a l l e m m e + m a a l l e n i + m a a l l e n n e + m a a l l i k k o j a + m a a l l i k k o k i n + m a a l l i k k o l i i k k e i d e n + m a a l l i k k o t a s a v a l t a a + m a a l l i k k o v a l t i o + m a a l l i k k o v a l t i o i d e n + m a a l l i k k o v a l t i o t a + m a a l l i k k o v e l i + m a a l l i k k o v i r a n o m a i s t e n + m a a l l i k k o v ä e s t ö ä + m a a l l i k k o y h t e i s k u n n a s t a + m a a l l i k k o y l e i s ö l l e + m a a l l i k o l l a + m a a l l i k o t + m a a l l i s e n + m a a l l i s i i n + m a a l l i s t u m i s p r o s e s s i + m a a l l i s t u n u t + m a a l l i s u u s p e r i a a t t e e n + m a a l t a + m a a l t a m u u t o n + m a a l t a p a k o a + m a a l t a p a o n + m a a l t a p a o s t a + m a a l u e t t e l o + m a a l u e t t e l o o n + m a a l ä m p ö + m a a l ä m p ö ä + m a a m e t a l l e i l l e + m a a m e t a l l e j a + m a a m e t a l l i e n + m a a m e t a l l i m i n e r a a l i e n + m a a m e t a l l i t + m a a m i e h i l l e m m e + m a a m i i n a k y s y m y k s e n + m a a m i i n a k y s y m y s + m a a m i i n a k y s y m y s t ä + m a a m i i n a o n g e l m a + m a a m i i n a p ä ä t ö s l a u s e l m a n + m a a m i i n a t + m a a m i i n o i h i n + m a a m i i n o i l l a + m a a m i i n o i s t a + m a a m i i n o j a + m a a m i i n o j e n + m a a m m e + m a a m o o t t o r i + m a a m y y r ä p ä ä s t ä i n e n + m a a m y y r ä s i r k a t + m a a m ä ä r ä n + m a a n a + m a a n a l a i s e e n + m a a n a l a i s i i n + m a a n a n a s t u s + m a a n a n t a i a a m u k s i + m a a n a n t a i a a m u n + m a a n a n t a i a a m u n a + m a a n a n t a i a a m u u n + m a a n a n t a i m i e l e n o s o i t u k s e t + m a a n a n t a i n + m a a n a n t a i n a + m a a n a n t a i n a k a a n + m a a n a n t a i s t a + m a a n a n t a i y ö n ä + m a a n h a n k i n t a a + m a a n h a n k i n t a l a k i + m a a n h a v a i n n o i n t i o h j e l m a + m a a n i + m a a n j a k o a + m a a n j ä r i s t y k s e e n + m a a n j ä r i s t y k s e n + m a a n j ä r i s t y k s e s t ä + m a a n j ä r i s t y k s e t + m a a n j ä r i s t y k s i i n + m a a n j ä r i s t y k s i s t ä + m a a n j ä r i s t y k s i ä + m a a n j ä r i s t y s + m a a n j ä r i s t y s a a l t o + m a a n j ä r i s t y s a l u e e l l a + m a a n j ä r i s t y s a l u e e l l e + m a a n j ä r i s t y s a l u e e t + m a a n j ä r i s t y s a l u e i d e n + m a a n j ä r i s t y s a l u e i l l a + m a a n j ä r i s t y s a l u e i l l e + m a a n j ä r i s t y s a l u e i t a + m a a n j ä r i s t y s a l u e t t a + m a a n j ä r i s t y s h e r k k ä n ä + m a a n j ä r i s t y s k a t a s t r o f i n + m a a n j ä r i s t y s k e s t ä v y y t t ä + m a a n j ä r i s t y s k r i i s i n + m a a n j ä r i s t y s o n g e l m a s t a + m a a n j ä r i s t y s p o l i t i i k k a + m a a n j ä r i s t y s r i s k i n + m a a n j ä r i s t y s t a p a u k s e s s a + m a a n j ä r i s t y s t i l a n t e i s s a + m a a n j ä r i s t y s t u t k i m u k s e s t a + m a a n j ä r i s t y s t ä + m a a n j ä r i s t y s u h r i e n + m a a n j ä r i s t y s v a a r a a + m a a n j ä r i s t y s v a l o t + m a a n k a a v o i t u s s u u n n i t t e l u u n + m a a n k a i s t a l l a + m a a n k i n + m a a n k o h o a m i n e n + m a a n k u i v a t u s k y s y m y k s e n + m a a n k ä y t t ö + m a a n k ä y t t ö h a n k k e i d e n + m a a n k ä y t t ö h a n k k e i t a + m a a n k ä y t t ö k y s y m y s + m a a n k ä y t t ö l a i n s ä ä d ä n t ö ö n + m a a n k ä y t t ö m a h d o l l i s u u k s i a + m a a n k ä y t t ö p o l i t i i k k a a + m a a n k ä y t t ö p o l i t i i k k o j e n + m a a n k ä y t t ö s u u n n i t e l m a + m a a n k ä y t t ö s u u n n i t e l m a a n + m a a n k ä y t t ö s u u n n i t e l m i a + m a a n k ä y t t ö s u u n n i t e l m i a a n + m a a n k ä y t t ö s u u n n i t e l m i e n + m a a n k ä y t t ö s u u n n i t e l m i i n + m a a n k ä y t t ö s u u n n i t e l m i l l e + m a a n k ä y t t ö s u u n n i t e l m i s s a + m a a n k ä y t t ö s u u n n i t t e l u n + m a a n k ä y t t ö s u u n n i t t e l u s s a + m a a n k ä y t t ö s u u n n i t t e l u u n + m a a n k ä y t t ö t a p o j a m m e + m a a n k ä y t t ö t a r k o i t u k s e n + m a a n k ä y t t ö ä + m a a n k ä y t t ö ö n + m a a n k ä y t ö l l e + m a a n k ä y t ö l l ä + m a a n k ä y t ö n + m a a n k ä y t ö s s ä + m a a n k ä y t ö s t ä + m a a n k ä y t ö s t ä m m e + m a a n l a a j u i n e n + m a a n l a a j u i s t a + m a a n m i e h e e n i + m a a n m i e h e l l e n i + m a a n m i e h e m m e + m a a n m i e h e m m e k i n + m a a n m i e h e n i + m a a n m i e h e n n e + m a a n m i e h e n s ä + m a a n m i e h e n ä + m a a n m i e h e t + m a a n m i e h i e n i + m a a n m i e h i e n s ä + m a a n m i e h i i m m e + m a a n m i e h i k s i + m a a n m i e h i l l e e n + m a a n m i e h i l l e m m e + m a a n m i e h i l l e n i + m a a n m i e h i l l e n n e + m a a n m i e h i l t ä n i + m a a n m i e h i l t ä ä n + m a a n m i e h i s s ä m m e + m a a n m i e h i s s ä n i + m a a n m i e h i s t ä m m e + m a a n m i e h i s t ä n i + m a a n m i e h i s t ä n n e + m a a n m i e h i ä + m a a n m i e h i ä m m e + m a a n m i e h i ä n i + m a a n m i e h i ä ä n + m a a n m i e s + m a a n m i e s t e m m e + m a a n m i e s t e n + m a a n m i e s t e n i + m a a n m i e s t e n n e + m a a n m i e s t e n s ä + m a a n m i e s t ä n i + m a a n m i t t a u s l a i t o s + m a a n n a i s i a n i + m a a n n e + m a a n o m i s t a j a t + m a a n o m i s t a j i a + m a a n o m i s t a j i e n + m a a n o m i s t a j i l l e + m a a n o m i s t u k s e e n + m a a n o m i s t u k s e n + m a a n o m i s t u k s e s t a + m a a n o m i s t u s + m a a n o m i s t u s k y s y m y k s e t + m a a n o m i s t u s k y s y m y k s i ä + m a a n o m i s t u s o i k e u d e n + m a a n o m i s t u s o i k e u d e s t a + m a a n o m i s t u s o i k e u k s i a + m a a n o m i s t u s o i k e u s + m a a n o m i s t u s o i k e u t t a + m a a n o m i s t u s t a + m a a n o m i s t u s u u d i s t u k s e n + m a a n o m i s t u s u u d i s t u s t a + m a a n o p e u s e n n ä t y s + m a a n o s a + m a a n o s a a + m a a n o s a a m m e + m a a n o s a l i i t t o j e n + m a a n o s a l l e m m e + m a a n o s a m m e + m a a n o s a n + m a a n o s a n a + m a a n o s a s s a + m a a n o s a s s a a n + m a a n o s a s s a m m e + m a a n o s a s t a m m e + m a a n o s a s t a n i + m a a n o s i a + m a a n o s i e m m e + m a a n o s i e n + m a a n o s i i n + m a a n o s i s s a + m a a n p a k o o n + m a a n p a o s s a + m a a n p a o s t a + m a a n p a r a n n u k s e e n + m a a n p a r a n n u s + m a a n p e t o k s e n + m a a n p e t o k s e s t a + m a a n p e t o s l a k i a + m a a n p e t o s s y y t ö k s e t + m a a n p i n n a l l a + m a a n p i n n a n + m a a n p u o l u s t u k s e n + m a a n p u o l u s t u s k o r k e a k o u l u + m a a n p u o l u s t u s k o u l u t u s y h d i s t y s + m a a n p u o l u s t u s s e k t o r i + m a a n p u o l u s t u s v e l v o l l i s u u s + m a a n p ä ä l l i s e e n + m a a n r a i v a u s t ö i d e n + m a a n r a k e n n u s h a n k k e i t a + m a a n r y ö s t ö ä + m a a n s a + m a a n s i s ä i s i ä + m a a n s u o j e l u l a i n s ä ä d ä n t ö + m a a n s u r u + m a a n t e i d e n + m a a n t e i l l e + m a a n t e i l l ä + m a a n t e i l l ä m m e + m a a n t e i t ä + m a a n t i e + m a a n t i e a j o n e u v o + m a a n t i e a j o n e u v o i h i n + m a a n t i e a j o n e u v o i s t a + m a a n t i e a j o n e u v o j a + m a a n t i e a j o n e u v o j e n + m a a n t i e a j o n e u v o n + m a a n t i e a l a n + m a a n t i e d e + m a a n t i e d e t i e t o u d e s t a + m a a n t i e h a n k k e i l l e + m a a n t i e j u n a + m a a n t i e j ä r j e s t e l m ä ä + m a a n t i e k a b o t a a s i + m a a n t i e k i i t ä j ä + m a a n t i e k u l j e t u k s e e n + m a a n t i e k u l j e t u k s e n + m a a n t i e k u l j e t u k s e s s a + m a a n t i e k u l j e t u k s e t + m a a n t i e k u l j e t u k s i a + m a a n t i e k u l j e t u k s i i n + m a a n t i e k u l j e t u k s i l l a + m a a n t i e k u l j e t u k s i l l e + m a a n t i e k u l j e t u k s i l t a + m a a n t i e k u l j e t u k s i s s a + m a a n t i e k u l j e t u k s i s t a + m a a n t i e k u l j e t u s + m a a n t i e k u l j e t u s a l a + m a a n t i e k u l j e t u s a l a a + m a a n t i e k u l j e t u s a l a l l a + m a a n t i e k u l j e t u s a l a l l e + m a a n t i e k u l j e t u s a l a n + m a a n t i e k u l j e t u s h a n k k e i t a + m a a n t i e k u l j e t u s l i i t t o o n + m a a n t i e k u l j e t u s t a + m a a n t i e k u l j e t u s t e n + m a a n t i e k u l j e t u s v e r k o s t o i s s a + m a a n t i e k u l j e t u s y r i t y s t e n + m a a n t i e k u o l e m a t + m a a n t i e l i i k e n n e + m a a n t i e l i i k e n n e a l a a + m a a n t i e l i i k e n n e j ä r j e s t e l m ä n + m a a n t i e l i i k e n n e m a r k k i n o i d e n + m a a n t i e l i i k e n n e m a r k k i n o i t a + m a a n t i e l i i k e n n e p a l v e l u i d e n + m a a n t i e l i i k e n n e t o i m i n t a a + m a a n t i e l i i k e n n e t t ä + m a a n t i e l i i k e n n e v e r k o n + m a a n t i e l i i k e n t e e l l e + m a a n t i e l i i k e n t e e m m e + m a a n t i e l i i k e n t e e n + m a a n t i e l i i k e n t e e n h a r j o i t t a j a n + m a a n t i e l i i k e n t e e s e e n + m a a n t i e l i i k e n t e e s s ä + m a a n t i e l i i k e n t e e s t ä + m a a n t i e n k ä y t t ä j i e n + m a a n t i e o n n e t t o m u u k s i e n + m a a n t i e o n n e t t o m u u k s i s s a + m a a n t i e o s u u k s i l l e + m a a n t i e o s u u k s i s t a + m a a n t i e o s u u s + m a a n t i e p o l i t i i k k a a + m a a n t i e p y ö r ä i l y + m a a n t i e r a h t i + m a a n t i e r a h t i k u l j e t u s t e n + m a a n t i e r o s v o u d e s t a + m a a n t i e r u u h k i a + m a a n t i e s e k t o r i + m a a n t i e s e k t o r i i n + m a a n t i e t a v a r a l i i k e n t e e n + m a a n t i e t e e l l i n e n + m a a n t i e t e e l l i s e e n + m a a n t i e t e e l l i s e l l ä + m a a n t i e t e e l l i s e l t ä + m a a n t i e t e e l l i s e n + m a a n t i e t e e l l i s e s s ä + m a a n t i e t e e l l i s e s t i + m a a n t i e t e e l l i s e s t i k i n + m a a n t i e t e e l l i s e s t ä + m a a n t i e t e e l l i s e t + m a a n t i e t e e l l i s i s s ä + m a a n t i e t e e l l i s i ä + m a a n t i e t e e l l i s t e n + m a a n t i e t e e l l i s t ä + m a a n t i e t e e l l i s t ä k i n + m a a n t i e t e e l l ä + m a a n t i e t e e n + m a a n t i e t e e s e e n + m a a n t i e t e e s t ä + m a a n t i e t u n n e l e i d e n + m a a n t i e t u n n e l e i s s a + m a a n t i e t u n n e l e i t a + m a a n t i e t u n n e l i + m a a n t i e t u n n e l i t + m a a n t i e t u r v a l l i s u u d e l l e + m a a n t i e t u r v a l l i s u u d e n + m a a n t i e t u r v a l l i s u u t t a + m a a n t i e v e r k k o + m a a n t i e v e r k k o a + m a a n t i e v e r k k o i h i n + m a a n t i e v e r k k o j e n + m a a n t i e v e r k k o o n + m a a n t i e v e r k o n + m a a n t i e v e r k o s t a + m a a n t i e v e r k o s t o + m a a n t i e v e r k o s t o n + m a a n v a i v a + m a a n v a l t a a j i a + m a a n v i l j e l i j ä + m a a n v i l j e l i j ä j ä r j e s t ö j e n + m a a n v i l j e l i j ä j ä r j e s t ö j ä + m a a n v i l j e l i j ä j ä r j e s t ö n + m a a n v i l j e l i j ä j ä r j e s t ö t + m a a n v i l j e l i j ä k o t i t a l o u d e n + m a a n v i l j e l i j ä k o t i t a l o u k s i e n + m a a n v i l j e l i j ä k s i + m a a n v i l j e l i j ä l i i t o n + m a a n v i l j e l i j ä l l e + m a a n v i l j e l i j ä n + m a a n v i l j e l i j ä n a i s e t + m a a n v i l j e l i j ä n a i s t e n + m a a n v i l j e l i j ä n ä + m a a n v i l j e l i j ä o i k e u s + m a a n v i l j e l i j ä p e r h e e l l e + m a a n v i l j e l i j ä p e r h e e s t ä + m a a n v i l j e l i j ä p e r h e e t + m a a n v i l j e l i j ä p e r h e i d e n + m a a n v i l j e l i j ä p e r h e i l l e + m a a n v i l j e l i j ä p e r h e i s t ä + m a a n v i l j e l i j ä p e r h e i t ä + m a a n v i l j e l i j ä p e r h e t t ä + m a a n v i l j e l i j ä r y h m i e n + m a a n v i l j e l i j ä r y h m i s s ä + m a a n v i l j e l i j ä r y h m ä n + m a a n v i l j e l i j ä r y h m ä t + m a a n v i l j e l i j ä t + m a a n v i l j e l i j ä t a u s t a + m a a n v i l j e l i j ä v ä e s t ö n + m a a n v i l j e l i j ä v ä e s t ö ä + m a a n v i l j e l i j ä y h t e i s ö j ä + m a a n v i l j e l i j ä y h t e i s ö l l e + m a a n v i l j e l i j ä y h t e i s ö n + m a a n v i l j e l i j ä y h t e i s ö ä k i n + m a a n v i l j e l i j ä y s t ä v ä l l i s i ä + m a a n v i l j e l i j ä ä + m a a n v i l j e l i j ö i d e m m e + m a a n v i l j e l i j ö i d e n + m a a n v i l j e l i j ö i h i n + m a a n v i l j e l i j ö i h i n s ä + m a a n v i l j e l i j ö i k s i + m a a n v i l j e l i j ö i l l e + m a a n v i l j e l i j ö i l l e m m e + m a a n v i l j e l i j ö i l l ä + m a a n v i l j e l i j ö i l t ä + m a a n v i l j e l i j ö i s t ä + m a a n v i l j e l i j ö i t ä + m a a n v i l j e l i j ö i t ä k ä ä n + m a a n v i l j e l i j ö i t ä m m e + m a a n v i l j e l y + m a a n v i l j e l y a l a + m a a n v i l j e l y a l a l l a + m a a n v i l j e l y a l u e i d e n + m a a n v i l j e l y a l u e i l l a + m a a n v i l j e l y a l u e i t a + m a a n v i l j e l y j ä r j e s t ö j e n + m a a n v i l j e l y k s e e n + m a a n v i l j e l y k s e n + m a a n v i l j e l y k s e s s ä + m a a n v i l j e l y k s e s t ä + m a a n v i l j e l y k ä y t ä n n ö l l ä + m a a n v i l j e l y k ä y t ä n n ö t + m a a n v i l j e l y k ä y t ä n t e e t + m a a n v i l j e l y k ä y t ä n t ö j e n + m a a n v i l j e l y k ä y t ä n t ö j ä + m a a n v i l j e l y l a j i k k e i d e n + m a a n v i l j e l y m a i l l a + m a a n v i l j e l y m e n e t e l m i i n + m a a n v i l j e l y m e n e t t e l y j ä + m a a n v i l j e l y n + m a a n v i l j e l y o l o s u h t e i s t a + m a a n v i l j e l y o l o s u h t e i t a + m a a n v i l j e l y p e r i n t e e n + m a a n v i l j e l y p o l i t i i k a n + m a a n v i l j e l y r a k e n t e e m m e + m a a n v i l j e l y s a l a n + m a a n v i l j e l y s a l a n s a + m a a n v i l j e l y s a l u e i l l a + m a a n v i l j e l y s a l u e i l l e + m a a n v i l j e l y s a l u e i l t a + m a a n v i l j e l y s a l u e i t a + m a a n v i l j e l y s a l u e t t a + m a a n v i l j e l y s a m m a t t i + m a a n v i l j e l y s e k t o r i l l a + m a a n v i l j e l y s e k t o r i l l e + m a a n v i l j e l y s k ä y t ä n n ö t + m a a n v i l j e l y s k ä y t ä n t ö j e n + m a a n v i l j e l y s m a a + m a a n v i l j e l y s m a a n + m a a n v i l j e l y s m a h d o l l i s u u d e t + m a a n v i l j e l y s m a i l l a + m a a n v i l j e l y s m e n o i h i n + m a a n v i l j e l y s t e k n i i k o i t a + m a a n v i l j e l y s t e o l l i s u u t t a + m a a n v i l j e l y s t u k e a + m a a n v i l j e l y s t u o t t e i t a + m a a n v i l j e l y s t ä + m a a n v i l j e l y s v a l t a i s i a + m a a n v i l j e l y s y h t e i s ö j e n + m a a n v i l j e l y t a l o u k s i a + m a a n v i l j e l y t a v a s t a + m a a n v i l j e l y t o i m i n t a a + m a a n v i l j e l y t u o t a n n o n + m a a n v i l j e l y v a s t a i s e n + m a a n v i l j e l y v ä e s t ö l l e + m a a n v i l j e l y y n + m a a n v i l j e l y ä + m a a n v u o k r a o i k e u k s i i n + m a a n v y ö r y m ä t + m a a o h j e l m a + m a a o h j e l m a n + m a a o h j e l m a s t a + m a a o h j e l m a t + m a a o h j e l m i e n + m a a o h j e l m i e n s a + m a a o h j e l m i i n + m a a o h j e l m i s s a + m a a o h j e l m i s s a a n + m a a o m a i s u u t t a + m a a o m i s t u k s e n + m a a o m i s t u s t a + m a a o p e r a a t i o i h i n + m a a o p e r a a t i o i s s a + m a a o s t o j a + m a a o t t e l u + m a a o t t e l u a + m a a p a l a s e s t a + m a a p a l l o + m a a p a l l o a + m a a p a l l o a m m e + m a a p a l l o l l a + m a a p a l l o m m e + m a a p a l l o n + m a a p a l l o s t a + m a a p a l s t a n + m a a p a l s t o i l l a + m a a p a l s t o j a + m a a p e r ä + m a a p e r ä d i r e k t i i v i + m a a p e r ä d i r e k t i i v i k s i + m a a p e r ä d i r e k t i i v i l l e + m a a p e r ä d i r e k t i i v i n + m a a p e r ä d i r e k t i i v i s t ä + m a a p e r ä d i r e k t i i v i ä + m a a p e r ä e r o o s i o + m a a p e r ä g e o l o g i a + m a a p e r ä k a r t o i t u s t a + m a a p e r ä k ä s i t t e l y ä + m a a p e r ä l l ä + m a a p e r ä l u e t t e l o + m a a p e r ä l u e t t e l o a + m a a p e r ä n + m a a p e r ä n s u o j e l u + m a a p e r ä n s u o j e l u d i r e k t i i v i n + m a a p e r ä n s u o j e l u d i r e k t i i v i s s ä + m a a p e r ä n s u o j e l u d i r e k t i i v i s t ä + m a a p e r ä n s u o j e l u j ä r j e s t e l m ä ä + m a a p e r ä n s u o j e l u l a i n s ä ä d ä n t ö + m a a p e r ä n s u o j e l u l l a + m a a p e r ä n s u o j e l u n + m a a p e r ä n s u o j e l u s t a + m a a p e r ä n s u o j e l u s t r a t e g i a + m a a p e r ä n s u o j e l u u n + m a a p e r ä n s ä + m a a p e r ä o l o i s s a + m a a p e r ä o l o j a + m a a p e r ä o l o s u h t e e t + m a a p e r ä o l o s u h t e i d e n + m a a p e r ä o l o t + m a a p e r ä p o l i t i i k a n + m a a p e r ä p o l i t i i k k a + m a a p e r ä p o l i t i i k k a a + m a a p e r ä p o l i t i i k k a a n s a + m a a p e r ä s s ä + m a a p e r ä s t ä + m a a p e r ä s t ä ä n + m a a p e r ä s ä ä d ö k s e t + m a a p e r ä t i e d e + m a a p e r ä t i l a n t e e s e e n + m a a p e r ä t o d i s t u s t e n + m a a p e r ä t y y p e i s t ä + m a a p e r ä t y y p i t + m a a p e r ä t y y p p e j ä + m a a p e r ä t y y p p i + m a a p e r ä t y y p p i e n + m a a p e r ä t y y p p i e n s ä + m a a p e r ä t y y p p i ä + m a a p e r ä v a i k u t u k s i a + m a a p e r ä ä + m a a p e r ä ä m m e + m a a p e r ä ä n + m a a p o l i t i i k a l l e e n + m a a p o l i t i i k k a + m a a p ä h k i n ä v o i + m a a p ä h k i n ä ö l j y + m a a p ä i v ä v a a l i t + m a a r a j a + m a a r a j a a + m a a r a j a a m m e + m a a r a j a l l a + m a a r a j a m m e + m a a r a j a n + m a a r a j a n y l i t y s a s e m i l l a + m a a r a j a o p e r a a t i o t + m a a r a j a t + m a a r a j o i h i n + m a a r a j o i l l a + m a a r a j o i l l a k i n + m a a r a j o i s t a + m a a r a j o j a + m a a r a j o j a a n + m a a r a j o j a m m e + m a a r a j o j e n + m a a r a p o r t e i s t a + m a a r a p o r t i t + m a a r a p o r t t e j a + m a a r a t a + m a a r e f o r m e i l l e + m a a r e f o r m i + m a a r e f o r m i a + m a a r e f o r m i i n + m a a r e f o r m i l l e + m a a r e f o r m i n + m a a r e f o r m i o h j e l m a + m a a r e f o r m i o h j e l m a l l a + m a a r e f o r m i o h j e l m a n + m a a r e f o r m i o h j e l m i a + m a a r e f o r m i p o l i t i i k a s s a + m a a r e f o r m i p o l i t i i k k a + m a a r e f o r m i s t a + m a a r e i t e i s t ä + m a a r e i t t e i h i n + m a a r e k i s t e r e i d e n + m a a r e k i s t e r e i h i n + m a a r e k i s t e r i + m a a r e k i s t e r i a s i a k i r j a t + m a a r e k i s t e r i e n + m a a r e k i s t e r i h a n k e + m a a r e k i s t e r i m e r k i n n ä t + m a a r e k i s t e r i n + m a a r e k i s t e r i t + m a a r e k i s t e r i ä + m a a r e k i s t e r i ä ä n + m a a r e s e r v i ä + m a a r y h m i e n + m a a r y h m i l l e + m a a r y h m i s t ä + m a a r y h m i ä + m a a r y h m ä l l e + m a a r y h m ä l l ä + m a a r y h m ä t + m a a r y h m ä ä + m a a r y h m ä ä n + m a a s a i b u l b u l i + m a a s a i t + m a a s e u d u i l l a + m a a s e u d u l l a + m a a s e u d u l l a k i n + m a a s e u d u l l a m m e + m a a s e u d u l l e + m a a s e u d u l l e k i n + m a a s e u d u l t a + m a a s e u d u n + m a a s e u d u s t a + m a a s e u t u + m a a s e u t u a + m a a s e u t u a l u e + m a a s e u t u a l u e e l l a + m a a s e u t u a l u e e l l e + m a a s e u t u a l u e e l t a + m a a s e u t u a l u e e m m e + m a a s e u t u a l u e e n + m a a s e u t u a l u e e t + m a a s e u t u a l u e i d e m m e + m a a s e u t u a l u e i d e n + m a a s e u t u a l u e i d e n s a + m a a s e u t u a l u e i l l a + m a a s e u t u a l u e i l l a k i n + m a a s e u t u a l u e i l l a m m e + m a a s e u t u a l u e i l l e + m a a s e u t u a l u e i l t a + m a a s e u t u a l u e i s i i n + m a a s e u t u a l u e i s t a + m a a s e u t u a l u e i s t a m m e + m a a s e u t u a l u e i t a + m a a s e u t u a l u e i t a a n + m a a s e u t u a l u e i t a m m e + m a a s e u t u a l u e t t a + m a a s e u t u a m m a t t i e n + m a a s e u t u a s i o i s t a + m a a s e u t u a s u k k a i s t a + m a a s e u t u a s u t u k s e n + m a a s e u t u e k o s y s t e e m i e n + m a a s e u t u e l i n k e i n o j e n + m a a s e u t u e l ä m ä + m a a s e u t u e l ä m ä l l e + m a a s e u t u e l ä m ä n + m a a s e u t u e l ä m ä ä + m a a s e u t u i n f r a s t r u k t u u r i n + m a a s e u t u i n v e s t o i n n i t + m a a s e u t u j e n + m a a s e u t u j ä r j e s t ö t + m a a s e u t u k e h i t y k s e s s ä + m a a s e u t u k e s k u k s i s t a m m e + m a a s e u t u k u l t t u u r i n + m a a s e u t u k u n n i s t a + m a a s e u t u k u n t i i n + m a a s e u t u k y l i e n + m a a s e u t u k y l i l l ä + m a a s e u t u m a i n e n + m a a s e u t u m a i s e m a s t a + m a a s e u t u m a i s e m a t + m a a s e u t u m a i s e m m a t + m a a s e u t u m a t k a i l u + m a a s e u t u m a t k a i l u l l a + m a a s e u t u m a t k a i l u l l e + m a a s e u t u m a t k a i l u n + m a a s e u t u m a t k a i l u s t a + m a a s e u t u m a t k a i l u t o i m i n t o j e n + m a a s e u t u m a t k a i l u u n + m a a s e u t u m e i j e r e i d e n + m a a s e u t u p a l k k i o t a + m a a s e u t u p a l v e l u i t a + m a a s e u t u p e r i n n ö n + m a a s e u t u p e r i n t ö ä + m a a s e u t u p i i r i ä + m a a s e u t u p i l a r i n + m a a s e u t u p o l i t i i k a k s i + m a a s e u t u p o l i t i i k a l l a + m a a s e u t u p o l i t i i k a l l e + m a a s e u t u p o l i t i i k a n + m a a s e u t u p o l i t i i k a s s a + m a a s e u t u p o l i t i i k a s t a + m a a s e u t u p o l i t i i k k a + m a a s e u t u p o l i t i i k k a a + m a a s e u t u p o l i t i i k k a a n + m a a s e u t u p o l i t i i k k a m m e + m a a s e u t u p o l i t i i k k o j a + m a a s e u t u p o s t i t o i m i s t o j e n + m a a s e u t u r a h a s t o + m a a s e u t u r a h a s t o a + m a a s e u t u r a h a s t o n + m a a s e u t u r a k e n n e t t a + m a a s e u t u r a k e n t e e l l e + m a a s e u t u r a k e n t e i d e n + m a a s e u t u s e k t o r i l l a + m a a s e u t u s t r a t e g i a + m a a s e u t u s t r a t e g i a l l a + m a a s e u t u s u u n n i t t e l u + m a a s e u t u t a l o u d e l l a + m a a s e u t u t a l o u d e n + m a a s e u t u t a l o u k s i a + m a a s e u t u t a l o u k s i l l e + m a a s e u t u t a l o u t t a + m a a s e u t u t e i l l ä + m a a s e u t u t e i s t ä m m e + m a a s e u t u t u k i e n + m a a s e u t u t u o t a n n o n + m a a s e u t u t u r i s m i + m a a s e u t u u n + m a a s e u t u v a l t a i s t a + m a a s e u t u v i r a s t o j a + m a a s e u t u v y ö h y k k e i d e n + m a a s e u t u v y ö h y k k e i t ä + m a a s e u t u v ä e s t ö + m a a s e u t u v ä e s t ö l l e + m a a s e u t u v ä e s t ö l l e e n + m a a s e u t u v ä e s t ö n + m a a s e u t u v ä e s t ö s t ä + m a a s e u t u v ä e s t ö t + m a a s e u t u v ä e s t ö ä + m a a s e u t u v ä e s t ö ä ä n + m a a s e u t u v ä e s t ö ö n + m a a s e u t u y h d y s k u n t a m m e + m a a s e u t u y h d y s k u n t i e n + m a a s e u t u y h t e i s k u n n a l l e + m a a s e u t u y h t e i s k u n n a n + m a a s e u t u y h t e i s k u n t a + m a a s e u t u y h t e i s k u n t a a + m a a s e u t u y h t e i s ö + m a a s e u t u y h t e i s ö i h i n + m a a s e u t u y h t e i s ö i l l e + m a a s e u t u y h t e i s ö i l l e m m e + m a a s e u t u y h t e i s ö i l l ä + m a a s e u t u y h t e i s ö i s s ä + m a a s e u t u y h t e i s ö i s t ä + m a a s e u t u y h t e i s ö j e m m e + m a a s e u t u y h t e i s ö j e n + m a a s e u t u y h t e i s ö j ä + m a a s e u t u y h t e i s ö j ä m m e + m a a s e u t u y h t e i s ö l l e + m a a s e u t u y h t e i s ö l l e m m e + m a a s e u t u y h t e i s ö m m e + m a a s e u t u y h t e i s ö n + m a a s e u t u y h t e i s ö n e u v o s t o + m a a s e u t u y h t e i s ö s s ä + m a a s e u t u y h t e i s ö t + m a a s e u t u y h t e i s ö ä + m a a s e u t u y h t e i s ö ä m m e + m a a s e u t u y h t e i s ö ö n + m a a s e u t u y k s i k ö i t ä + m a a s e u t u y l i o p i s t o + m a a s e u t u y m p ä r i s t ö + m a a s e u t u y m p ä r i s t ö i h i n + m a a s e u t u y m p ä r i s t ö j e n + m a a s e u t u y m p ä r i s t ö m m e + m a a s e u t u y m p ä r i s t ö n + m a a s e u t u y m p ä r i s t ö s s ä + m a a s e u t u y m p ä r i s t ö s t ä + m a a s e u t u y m p ä r i s t ö ä + m a a s e u t u y m p ä r i s t ö ö n + m a a s e u t u y r i t y s t e n + m a a s o d a n k ä y n t i + m a a s o t a a n + m a a s s a + m a a s s a a n + m a a s s a m m e + m a a s s a n i + m a a s t a + m a a s t a a n + m a a s t a k a r k o t u s m ä ä r ä y s t e n + m a a s t a k a r k o t u s t a + m a a s t a l ä h t ö r e k i s t e r i + m a a s t a m u u t t a j i a + m a a s t a m u u t t o a + m a a s t a m u u t t o k y s y m y s t ä + m a a s t a n i + m a a s t a n n e + m a a s t a p o i s t a m i s e t + m a a s t a p o i s t a m i s l a i n s ä ä d ä n n ö s t ä + m a a s t a p o i s t a m i s l a i n s ä ä d ä n t ö + m a a s t a p o i s t a m i s o i k e u d e l l e + m a a s t a p o i s t a m i s p ä ä t ö k s i ä + m a a s t a p o i s t a m i s p ä ä t ö s t e n + m a a s t a p o i s t a m i s t o i m e n p i t e i t ä + m a a s t a p o i s t a m i s t o i m i a + m a a s t a p o i s t u m i s l u p a a + m a a s t a p o i s t u m i s v i i s u m i a + m a a s t a p o i s t u m i s v i i s u m i t + m a a s t a v i e n t i l u p a h a k e m u k s i a + m a a s t a v i e n t i l u v a n + m a a s t o a j o n e u v o + m a a s t o a j o n e u v o i h i n + m a a s t o a j o n e u v o j a + m a a s t o a u t o + m a a s t o a u t o i h i n + m a a s t o a u t o i l l e + m a a s t o a u t o i s t a + m a a s t o a u t o j e n + m a a s t o a u t o l l a a n + m a a s t o a u t o t + m a a s t o h i i h d o n + m a a s t o h i i h t o + m a a s t o j u o k s u + m a a s t o m a l l i + m a a s t o p a l o i s t a + m a a s t o p a l o j e n + m a a s t o p a l o t + m a a s t o p o l k u p y ö r ä + m a a s t o p u k u + m a a s t o p y ö r ä i l y + m a a s t o p y ö r ä k ä s i t t e l y y n + m a a s t o p y ö r ä n + m a a s t o r a t s a s t u s + m a a s t o s s a + m a a s ä t e i l y + m a a t a a n + m a a t a i d e + m a a t a i s t e l u k o n e + m a a t a l o u d e l l a + m a a t a l o u d e l l e + m a a t a l o u d e l t a + m a a t a l o u d e n + m a a t a l o u d e n k i n + m a a t a l o u d e n t u k i r a h a s t o i s t a + m a a t a l o u d e n v a s t a i s t a + m a a t a l o u d e s s a + m a a t a l o u d e s t a + m a a t a l o u k s i s t a + m a a t a l o u s + m a a t a l o u s a i h e + m a a t a l o u s a i h e i t a + m a a t a l o u s a j a t t e l u l l e + m a a t a l o u s a j o n e u v o i s s a + m a a t a l o u s a k a t e m i a + m a a t a l o u s a l a + m a a t a l o u s a l a a + m a a t a l o u s a l a a m m e + m a a t a l o u s a l a a n + m a a t a l o u s a l a l l a + m a a t a l o u s a l a l l a k i n + m a a t a l o u s a l a l l e + m a a t a l o u s a l a l l e m m e + m a a t a l o u s a l a l t a + m a a t a l o u s a l a m m e + m a a t a l o u s a l a n + m a a t a l o u s a l a n s a + m a a t a l o u s a l a s t a + m a a t a l o u s a l a t + m a a t a l o u s a l o i h i n + m a a t a l o u s a l o i l l a + m a a t a l o u s a l o i t t e i s i i n + m a a t a l o u s a l o j a + m a a t a l o u s a l o j e n + m a a t a l o u s a l u e + m a a t a l o u s a l u e e l l a + m a a t a l o u s a l u e e l l e + m a a t a l o u s a l u e e l t a + m a a t a l o u s a l u e e t + m a a t a l o u s a l u e i d e n + m a a t a l o u s a l u e i l l a + m a a t a l o u s a l u e i l l a k i n + m a a t a l o u s a l u e i l l e + m a a t a l o u s a l u e i s i i n + m a a t a l o u s a l u e i s t a + m a a t a l o u s a l u e i t a + m a a t a l o u s a l u e t t a + m a a t a l o u s a p u u n + m a a t a l o u s a s e t u k s e l l a + m a a t a l o u s a s e t u k s e n + m a a t a l o u s a s i a + m a a t a l o u s a s i a k i r j a n + m a a t a l o u s a s i a n t u n t i j a + m a a t a l o u s a s i a n t u n t i j a t + m a a t a l o u s a s i a s s a + m a a t a l o u s a s i o i d e n + m a a t a l o u s a s i o i h i n + m a a t a l o u s a s i o i s s a + m a a t a l o u s a s i o i s t a + m a a t a l o u s a s i o i t a + m a a t a l o u s a v u s t u k s e t + m a a t a l o u s b r a n d i + m a a t a l o u s b u d j e t e i s s a + m a a t a l o u s b u d j e t i l l a + m a a t a l o u s b u d j e t i n + m a a t a l o u s b u d j e t i s s a + m a a t a l o u s b u d j e t i s t a + m a a t a l o u s b u d j e t t e j a m m e + m a a t a l o u s b u d j e t t i + m a a t a l o u s b u d j e t t i a + m a a t a l o u s b u d j e t t i e n + m a a t a l o u s b u d j e t t i i n + m a a t a l o u s b u d j e t t i m m e + m a a t a l o u s d i e s e l i n + m a a t a l o u s d i r e k t i i v i n + m a a t a l o u s e h d o t u k s e t + m a a t a l o u s e h d o t u k s i a + m a a t a l o u s e k o l o g i s e l l e + m a a t a l o u s e l i n k e i n o l l e + m a a t a l o u s e l i n k e i n o m m e + m a a t a l o u s e l i n k e i n o n + m a a t a l o u s e l i n k e i n o s t a + m a a t a l o u s e l i n t a r v i k e a l a + m a a t a l o u s e l i n t a r v i k e a l a l l a + m a a t a l o u s e l i n t a r v i k e a l a l l e + m a a t a l o u s e l i n t a r v i k e a l a n + m a a t a l o u s e l i n t a r v i k e t e o l l i s u u d e n + m a a t a l o u s e l i n t a r v i k e y h t y m ä t + m a a t a l o u s e l i n t a r v i k k e i d e n + m a a t a l o u s e l i n t a r v i k k e i s i i n + m a a t a l o u s e l i n t a r v i k k e i t a + m a a t a l o u s e s i t y k s i ä + m a a t a l o u s e t u j ä r j e s t ö + m a a t a l o u s f i l o s o f i a t + m a a t a l o u s f o o r u m e i l l a + m a a t a l o u s h a l l i n n o n + m a a t a l o u s h a l l i n n o s s a + m a a t a l o u s h a l l i n t o o n + m a a t a l o u s h a n k i n t o j e n + m a a t a l o u s h a n k k e e s e e n + m a a t a l o u s h a n k k e i d e n + m a a t a l o u s h i n n a t + m a a t a l o u s h i n n o i s t a + m a a t a l o u s h i n t a e h d o t u k s i s t a + m a a t a l o u s h i n t a k e s k u s t e l u a + m a a t a l o u s h i n t a p a k e t i n + m a a t a l o u s h i n t a p ä ä t ö k s i l l ä + m a a t a l o u s h i n t o i h i n + m a a t a l o u s h i n t o j a + m a a t a l o u s h i n t o j e n + m a a t a l o u s h y ö d y k e m a r k k i n o i l l a + m a a t a l o u s h y ö d y k k e e n + m a a t a l o u s h y ö d y k k e i d e n + m a a t a l o u s h y ö d y k k e i l l ä + m a a t a l o u s h y ö d y k k e i s t ä + m a a t a l o u s h y ö d y k k e i t ä + m a a t a l o u s i n f r a s t r u k t u u r i + m a a t a l o u s i n s t i t u u t t i e n + m a a t a l o u s j ä r j e s t e l m i e m m e + m a a t a l o u s j ä r j e s t e l m i e n + m a a t a l o u s j ä r j e s t e l m i ä + m a a t a l o u s j ä r j e s t e l m ä + m a a t a l o u s j ä r j e s t e l m ä m m e + m a a t a l o u s j ä r j e s t e l m ä n + m a a t a l o u s j ä r j e s t e l m ä t + m a a t a l o u s j ä r j e s t e l m ä ä + m a a t a l o u s j ä r j e s t ö + m a a t a l o u s j ä r j e s t ö i s s ä + m a a t a l o u s j ä r j e s t ö j e n + m a a t a l o u s j ä r j e s t ö j ä + m a a t a l o u s j ä r j e s t ö l l e + m a a t a l o u s j ä r j e s t ö n + m a a t a l o u s j ä r j e s t ö s s ä + m a a t a l o u s j ä r j e s t ö t + m a a t a l o u s j ä r j e s t ö ä + m a a t a l o u s j ä t t e e n + m a a t a l o u s j ä t t e e n k i n + m a a t a l o u s j ä t t e e s t ä + m a a t a l o u s j ä t t e i t ä + m a a t a l o u s k a n n a n + m a a t a l o u s k a n s a k u n n a l t a + m a a t a l o u s k a s v e i l l e + m a a t a l o u s k a u p a l l a + m a a t a l o u s k a u p a n + m a a t a l o u s k a u p p a + m a a t a l o u s k a u p p a a + m a a t a l o u s k a u p p a a n + m a a t a l o u s k a u p p a j ä r j e s t e l m ä n + m a a t a l o u s k e h i t y k s e n + m a a t a l o u s k e i n o t t e l u n + m a a t a l o u s k e m i a n t e o l l i s u u s + m a a t a l o u s k e m i k a a l e j a + m a a t a l o u s k e m i k a a l i e n + m a a t a l o u s k e m i k a a l i t e o l l i s u u s + m a a t a l o u s k e m i k a a l i t e o l l i s u u t t a + m a a t a l o u s k e s k u k s i s s a + m a a t a l o u s k e s k u s t e l u + m a a t a l o u s k e s k u s t e l u j a + m a a t a l o u s k e s k u s t e l u t + m a a t a l o u s k o m i s s a a r i + m a a t a l o u s k o m i s s a a r i e n s a + m a a t a l o u s k o m i s s a a r i n + m a a t a l o u s k o m i s s a a r i t + m a a t a l o u s k o m i t e a + m a a t a l o u s k o m i t e a n + m a a t a l o u s k o n e + m a a t a l o u s k o n e i d e n + m a a t a l o u s k o n e i s i i n + m a a t a l o u s k o n e i t a + m a a t a l o u s k o u l u t u s + m a a t a l o u s k r i i s i + m a a t a l o u s k r i i s i l l e + m a a t a l o u s k r i i s i n + m a a t a l o u s k u l t t u u r i + m a a t a l o u s k u l t t u u r i i n + m a a t a l o u s k u l t t u u r i n + m a a t a l o u s k u l u i h i n + m a a t a l o u s k u l u j a + m a a t a l o u s k u l u t + m a a t a l o u s k u s t a n n u k s i a + m a a t a l o u s k u s t a n n u s t e n + m a a t a l o u s k y s y m y k s e e n + m a a t a l o u s k y s y m y k s e n + m a a t a l o u s k y s y m y k s e s s ä + m a a t a l o u s k y s y m y k s e s t ä + m a a t a l o u s k y s y m y k s e t + m a a t a l o u s k y s y m y k s i i n + m a a t a l o u s k y s y m y k s i s s ä + m a a t a l o u s k y s y m y k s i s t ä + m a a t a l o u s k y s y m y k s i ä + m a a t a l o u s k y s y m y s t e n + m a a t a l o u s k ä y t t ö + m a a t a l o u s k ä y t t ö ö n + m a a t a l o u s k ä y t ä n n ö i l l e + m a a t a l o u s k ä y t ä n n ö i s t ä + m a a t a l o u s k ä y t ä n n ö k s i + m a a t a l o u s k ä y t ä n n ö n + m a a t a l o u s k ä y t ä n n ö s t ä + m a a t a l o u s k ä y t ä n n ö t + m a a t a l o u s k ä y t ä n t e i d e n + m a a t a l o u s k ä y t ä n t ö + m a a t a l o u s k ä y t ä n t ö i h i n + m a a t a l o u s k ä y t ä n t ö j e n + m a a t a l o u s k ä y t ä n t ö j ä + m a a t a l o u s k ä y t ä n t ö j ä m m e + m a a t a l o u s k ä y t ä n t ö m m e + m a a t a l o u s k ä y t ä n t ö ä + m a a t a l o u s k ä y t ä n t ö ö n + m a a t a l o u s k ä y t ö s s ä + m a a t a l o u s l a i n + m a a t a l o u s l a i n a t u e t + m a a t a l o u s l a i n o j a + m a a t a l o u s l a i n o j e n + m a a t a l o u s l a i n s ä ä d ä n n ö n + m a a t a l o u s l a i n s ä ä d ä n n ö s s ä + m a a t a l o u s l a i n s ä ä d ä n n ö s t ä + m a a t a l o u s l a i n s ä ä d ä n t ö + m a a t a l o u s l a i n s ä ä d ä n t ö k ä ä n + m a a t a l o u s l a i n s ä ä d ä n t ö ö n + m a a t a l o u s l a i t t e i d e n + m a a t a l o u s l a i t t e i t a + m a a t a l o u s l a k e i n e e n + m a a t a l o u s l a k i + m a a t a l o u s l i i t o l l e + m a a t a l o u s l i i t o t + m a a t a l o u s l o p p u t u o t a n n o s t a + m a a t a l o u s l u k u + m a a t a l o u s l u k u a + m a a t a l o u s l u k u u n + m a a t a l o u s l u o t t o l a i t o s t e n + m a a t a l o u s l u v u n + m a a t a l o u s l u v u s t a + m a a t a l o u s m a a + m a a t a l o u s m a a i l m a a + m a a t a l o u s m a a i l m a n + m a a t a l o u s m a a l l a + m a a t a l o u s m a a l l e + m a a t a l o u s m a a n + m a a t a l o u s m a a n a + m a a t a l o u s m a a s s a + m a a t a l o u s m a a s t a + m a a t a l o u s m a a s t a a n + m a a t a l o u s m a a t + m a a t a l o u s m a a t a + m a a t a l o u s m a h d i t + m a a t a l o u s m a i d e n + m a a t a l o u s m a i l l e + m a a t a l o u s m a i s e m a a + m a a t a l o u s m a i t a + m a a t a l o u s m a k s u i s s a + m a a t a l o u s m a k s u j a + m a a t a l o u s m a k s u j e n + m a a t a l o u s m a k s u n + m a a t a l o u s m a k s u t + m a a t a l o u s m a l l i + m a a t a l o u s m a l l i a + m a a t a l o u s m a l l i a a n + m a a t a l o u s m a l l i a m m e + m a a t a l o u s m a l l i e n + m a a t a l o u s m a l l i i n + m a a t a l o u s m a l l i k s i + m a a t a l o u s m a l l i l l e + m a a t a l o u s m a l l i l l e m m e + m a a t a l o u s m a l l i m m e + m a a t a l o u s m a l l i n + m a a t a l o u s m a l l i n n e + m a a t a l o u s m a l l i n s a + m a a t a l o u s m a l l i s s a + m a a t a l o u s m a l l i s t a + m a a t a l o u s m a r k k i n a j ä r j e s t y k s e n + m a a t a l o u s m a r k k i n a m e n o j e n + m a a t a l o u s m a r k k i n a m m e + m a a t a l o u s m a r k k i n a t + m a a t a l o u s m a r k k i n o i d e m m e + m a a t a l o u s m a r k k i n o i d e n + m a a t a l o u s m a r k k i n o i d e n s a + m a a t a l o u s m a r k k i n o i h i n + m a a t a l o u s m a r k k i n o i l l a + m a a t a l o u s m a r k k i n o i l l a m m e + m a a t a l o u s m a r k k i n o i l l e + m a a t a l o u s m a r k k i n o i l t a + m a a t a l o u s m a r k k i n o i s t a + m a a t a l o u s m a r k k i n o i t a + m a a t a l o u s m a r k k i n o i t a a n + m a a t a l o u s m a r k k i n o i t a m m e + m a a t a l o u s m a t e r i a a l e i s t a + m a a t a l o u s m a t k a i l u n + m a a t a l o u s m e n e t e l m i e n + m a a t a l o u s m e n e t e l m i ä + m a a t a l o u s m e n e t e l m i ä m m e + m a a t a l o u s m e n o i h i n + m a a t a l o u s m e n o i k s i + m a a t a l o u s m e n o i l l a + m a a t a l o u s m e n o i l l e + m a a t a l o u s m e n o i s s a + m a a t a l o u s m e n o i s t a + m a a t a l o u s m e n o j a + m a a t a l o u s m e n o j a a n + m a a t a l o u s m e n o j a m m e + m a a t a l o u s m e n o j e n + m a a t a l o u s m e n o t + m a a t a l o u s m e n o u u d i s t u s t a + m a a t a l o u s m e r k i n t ö j e n + m a a t a l o u s m i e t i n n ö i s t ä + m a a t a l o u s m i n i s t e r e i d e n + m a a t a l o u s m i n i s t e r e i l l e + m a a t a l o u s m i n i s t e r e i l l ä + m a a t a l o u s m i n i s t e r i + m a a t a l o u s m i n i s t e r i e n + m a a t a l o u s m i n i s t e r i i n + m a a t a l o u s m i n i s t e r i l l e + m a a t a l o u s m i n i s t e r i m m e + m a a t a l o u s m i n i s t e r i n + m a a t a l o u s m i n i s t e r i n e u v o s t o + m a a t a l o u s m i n i s t e r i n e u v o s t o n + m a a t a l o u s m i n i s t e r i n e u v o s t o s s a + m a a t a l o u s m i n i s t e r i n n e + m a a t a l o u s m i n i s t e r i n ä + m a a t a l o u s m i n i s t e r i t + m a a t a l o u s m i n i s t e r i ä + m a a t a l o u s m i n i s t e r i ö + m a a t a l o u s m i n i s t e r i ö n + m a a t a l o u s m u s e o + m a a t a l o u s m y ö n n y t y k s e t + m a a t a l o u s m y ö n n y t y k s i i n + m a a t a l o u s m y ö n n y t y s t e n + m a a t a l o u s m ä ä r ä r a h a t + m a a t a l o u s m ä ä r ä r a h o i h i n + m a a t a l o u s m ä ä r ä r a h o i s t a + m a a t a l o u s m ä ä r ä r a h o j a + m a a t a l o u s m ä ä r ä r a h o j e n + m a a t a l o u s n e u v o j i s t a + m a a t a l o u s n e u v o n t a p a l v e l u s t a + m a a t a l o u s n e u v o s t o + m a a t a l o u s n e u v o s t o a + m a a t a l o u s n e u v o s t o l l e + m a a t a l o u s n e u v o s t o n + m a a t a l o u s n e u v o s t o o n + m a a t a l o u s n e u v o s t o s s a + m a a t a l o u s n e u v o t t e l u i h i n + m a a t a l o u s n e u v o t t e l u i s s a + m a a t a l o u s n e u v o t t e l u i s t a + m a a t a l o u s n e u v o t t e l u j a + m a a t a l o u s n e u v o t t e l u j e n + m a a t a l o u s n e u v o t t e l u t + m a a t a l o u s n ä k ö k o h t i e n + m a a t a l o u s n ä y t t e l y + m a a t a l o u s n ä y t t e l y s s ä + m a a t a l o u s o h j e l m a + m a a t a l o u s o h j e l m a k s i + m a a t a l o u s o h j e l m a n + m a a t a l o u s o h j e l m i a + m a a t a l o u s o h j e l m i e n + m a a t a l o u s o h j e l m i s t a + m a a t a l o u s o l o s u h t e e t + m a a t a l o u s o m a i s u u t t a + m a a t a l o u s o n g e l m a + m a a t a l o u s o n g e l m i a + m a a t a l o u s o n g e l m i e n + m a a t a l o u s o n g e l m i s t a + m a a t a l o u s o p i s t o i s s a + m a a t a l o u s o r g a n i s a a t i o i l l e + m a a t a l o u s o s a a + m a a t a l o u s o s a a n + m a a t a l o u s o s a s t o + m a a t a l o u s o s i o o n + m a a t a l o u s o s u u d e s t a + m a a t a l o u s o s u u s k u n n a t + m a a t a l o u s o t s a k e + m a a t a l o u s o t s a k k e i d e n + m a a t a l o u s p a k e t e i s t a + m a a t a l o u s p a k e t t i a + m a a t a l o u s p e r i n n e t t ä + m a a t a l o u s p e r i n n ö n + m a a t a l o u s p e r ä i s e n + m a a t a l o u s p e r ä i s t ä + m a a t a l o u s p i l a r i + m a a t a l o u s p i l a r i n + m a a t a l o u s p o l i i t i k k o + m a a t a l o u s p o l i i t i k o t + m a a t a l o u s p o l i i t t i n e n + m a a t a l o u s p o l i i t t i s e e n + m a a t a l o u s p o l i i t t i s e n + m a a t a l o u s p o l i i t t i s e t + m a a t a l o u s p o l i i t t i s i a + m a a t a l o u s p o l i i t t i s i l l a + m a a t a l o u s p o l i i t t i s t a + m a a t a l o u s p o l i i t t i s t e n + m a a t a l o u s p o l i t i i k a k s i + m a a t a l o u s p o l i t i i k a l l a + m a a t a l o u s p o l i t i i k a l l a m m e + m a a t a l o u s p o l i t i i k a l l e + m a a t a l o u s p o l i t i i k a l l e m m e + m a a t a l o u s p o l i t i i k a l t a + m a a t a l o u s p o l i t i i k a n + m a a t a l o u s p o l i t i i k a n k i n + m a a t a l o u s p o l i t i i k a s s a + m a a t a l o u s p o l i t i i k a s s a a n + m a a t a l o u s p o l i t i i k a s s a m m e + m a a t a l o u s p o l i t i i k a s t a + m a a t a l o u s p o l i t i i k a s t a a n + m a a t a l o u s p o l i t i i k a t + m a a t a l o u s p o l i t i i k k a + m a a t a l o u s p o l i t i i k k a a + m a a t a l o u s p o l i t i i k k a a m m e + m a a t a l o u s p o l i t i i k k a a n + m a a t a l o u s p o l i t i i k k a a n n e + m a a t a l o u s p o l i t i i k k a a n s a + m a a t a l o u s p o l i t i i k k a k a a n + m a a t a l o u s p o l i t i i k k a k i n + m a a t a l o u s p o l i t i i k k a m m e + m a a t a l o u s p o l i t i i k k a n n e + m a a t a l o u s p o l i t i i k k a n s a + m a a t a l o u s p o l i t i i k k o i h i n + m a a t a l o u s p o l i t i i k k o j a + m a a t a l o u s p o l i t i i k k o j e m m e + m a a t a l o u s p o l i t i i k k o j e n + m a a t a l o u s p o l i t i i k o i s t a + m a a t a l o u s p o t e n t i a a l i n + m a a t a l o u s p r o j e k t e j a + m a a t a l o u s p r o j e k t i a + m a a t a l o u s p ä ä o s a s t o + m a a t a l o u s p ö y t ä k i r j a n + m a a t a l o u s r a a k a + m a a t a l o u s r a h a a + m a a t a l o u s r a h a s t o + m a a t a l o u s r a h a s t o a + m a a t a l o u s r a h a s t o i l l e + m a a t a l o u s r a h a s t o i s t a + m a a t a l o u s r a h a s t o j a + m a a t a l o u s r a h a s t o j e n + m a a t a l o u s r a h a s t o l l a + m a a t a l o u s r a h a s t o l l e + m a a t a l o u s r a h a s t o n + m a a t a l o u s r a h a s t o o n + m a a t a l o u s r a h a s t o s t a + m a a t a l o u s r a h a s t o t + m a a t a l o u s r a h o i t u k s e n + m a a t a l o u s r a h o i t u s t a + m a a t a l o u s r a k e n n e t t a + m a a t a l o u s r a k e n t e e l l e + m a a t a l o u s r a k e n t e e l t a a n + m a a t a l o u s r a k e n t e e n + m a a t a l o u s r a k e n t e e t + m a a t a l o u s r a k e n t e i d e n + m a a t a l o u s r a k e n t e i l l e + m a a t a l o u s r a k e n t e i s t a + m a a t a l o u s r e f o r m i a + m a a t a l o u s r e f o r m i i n + m a a t a l o u s r e f o r m i n + m a a t a l o u s r e h u i s s a + m a a t a l o u s r e h u t e o l l i s u u t t a + m a a t a l o u s r e s u r s s i t + m a a t a l o u s r i i d a n + m a a t a l o u s r o m a n t i k k o + m a a t a l o u s r o m m i + m a a t a l o u s r o m m i k s i + m a a t a l o u s r o m m i n + m a a t a l o u s r y h m i e n + m a a t a l o u s s a l k k u u n + m a a t a l o u s s e k t o r e i l l a + m a a t a l o u s s e k t o r e i l l e + m a a t a l o u s s e k t o r i + m a a t a l o u s s e k t o r i a + m a a t a l o u s s e k t o r i e n + m a a t a l o u s s e k t o r i i n + m a a t a l o u s s e k t o r i l l a + m a a t a l o u s s e k t o r i l l e + m a a t a l o u s s e k t o r i l t a + m a a t a l o u s s e k t o r i m m e + m a a t a l o u s s e k t o r i n + m a a t a l o u s s e k t o r i n s a + m a a t a l o u s s e k t o r i s t a + m a a t a l o u s s e k t o r i t + m a a t a l o u s s o p i m u k s e n + m a a t a l o u s s o p i m u k s e s t a + m a a t a l o u s s o p i m u k s i a + m a a t a l o u s s o p i m u s + m a a t a l o u s s o p i m u s t a + m a a t a l o u s s t r a t e g i a s s a + m a a t a l o u s s t r a t e g i o i d e n + m a a t a l o u s s u o s i t u k s e n + m a a t a l o u s s u u n n i t e l m i a + m a a t a l o u s s u u n t a v i i v a n + m a a t a l o u s s y i s t ä + m a a t a l o u s s ä h k ö + m a a t a l o u s s ä ä d ö k s e n + m a a t a l o u s s ä ä n t ö j ä + m a a t a l o u s t a l o u d e n + m a a t a l o u s t a l o u s a r v i o + m a a t a l o u s t a l o u s a r v i o n + m a a t a l o u s t a l o u s a r v i o o n + m a a t a l o u s t a l o u s a r v i o s t a + m a a t a l o u s t a r i f f e i s t a + m a a t a l o u s t a r i f f e j a + m a a t a l o u s t a r j o u s t a + m a a t a l o u s t a r k o i t u k s e e n + m a a t a l o u s t a r k o i t u k s e n + m a a t a l o u s t a r k o i t u k s i i n + m a a t a l o u s t a u s t a + m a a t a l o u s t a v a n + m a a t a l o u s t a v a r o i d e n + m a a t a l o u s t a v a r o i l l e + m a a t a l o u s t e k n i i k a n + m a a t a l o u s t e k n o l o g i a + m a a t a l o u s t e o l l i s e n + m a a t a l o u s t e o l l i s u u d e l l a + m a a t a l o u s t e o l l i s u u d e l l e + m a a t a l o u s t e o l l i s u u d e n + m a a t a l o u s t e o l l i s u u s + m a a t a l o u s t e o l l i s u u t t a + m a a t a l o u s t e o l l i s u u t t a m m e + m a a t a l o u s t i e t e e n + m a a t a l o u s t i e t e e s e e n + m a a t a l o u s t i e t e i l i j ä n + m a a t a l o u s t i l a n t e e s t a + m a a t a l o u s t i l a s t o i h i n + m a a t a l o u s t i l a s t o i s s a + m a a t a l o u s t i l a s t o j a + m a a t a l o u s t i l a s t o j e n + m a a t a l o u s t i l a s t o k o m i t e a n + m a a t a l o u s t i l a s t o t + m a a t a l o u s t i l i ä + m a a t a l o u s t i l o j e n + m a a t a l o u s t o i m e t + m a a t a l o u s t o i m i a l a + m a a t a l o u s t o i m i a l a m m e + m a a t a l o u s t o i m i a l a n + m a a t a l o u s t o i m i e n + m a a t a l o u s t o i m i j o i l l e + m a a t a l o u s t o i m i n n a l l a a n + m a a t a l o u s t o i m i n n a l l e + m a a t a l o u s t o i m i n n a n + m a a t a l o u s t o i m i n n a s s a + m a a t a l o u s t o i m i n n a s t a + m a a t a l o u s t o i m i n n a s t a a n + m a a t a l o u s t o i m i n t a + m a a t a l o u s t o i m i n t a a + m a a t a l o u s t o i m i n t a a n + m a a t a l o u s t o i m i n t a l i n j o i h i n + m a a t a l o u s t o i m i n t o j a + m a a t a l o u s t o i m i s t a + m a a t a l o u s t r a k t o r e i d e n + m a a t a l o u s t r a k t o r e i h i n + m a a t a l o u s t r a k t o r e i s s a + m a a t a l o u s t u e l l a + m a a t a l o u s t u e l l e + m a a t a l o u s t u e n + m a a t a l o u s t u e n s a a j i e n + m a a t a l o u s t u e s t a + m a a t a l o u s t u e t + m a a t a l o u s t u h o i s t a + m a a t a l o u s t u i l l e + m a a t a l o u s t u i s s a + m a a t a l o u s t u i s t a + m a a t a l o u s t u k e a + m a a t a l o u s t u k e e n + m a a t a l o u s t u k e m m e + m a a t a l o u s t u k e n s a + m a a t a l o u s t u k i + m a a t a l o u s t u k i a + m a a t a l o u s t u k i a a n + m a a t a l o u s t u k i e m m e + m a a t a l o u s t u k i e n + m a a t a l o u s t u k i i n + m a a t a l o u s t u k i j ä r j e s t e l m ä + m a a t a l o u s t u k i j ä r j e s t e l m ä n + m a a t a l o u s t u k i j ä r j e s t e l m ä ä m m e + m a a t a l o u s t u k i j ä r j e s t e l y t + m a a t a l o u s t u k i m a l l i n + m a a t a l o u s t u k i m e n o j a + m a a t a l o u s t u k i p e t o s t e n + m a a t a l o u s t u k i p o l i t i i k a n + m a a t a l o u s t u k i p o l i t i i k a s t a + m a a t a l o u s t u k i p o l i t i i k k a + m a a t a l o u s t u k i p o l i t i i k k a a n s a + m a a t a l o u s t u k i p o t i s t a + m a a t a l o u s t u k i t a p a u k s i a + m a a t a l o u s t u k i v ä l i n e i s t ö ä + m a a t a l o u s t u l l i e n + m a a t a l o u s t u l l i t a r i f f i e n + m a a t a l o u s t u l o + m a a t a l o u s t u l o a + m a a t a l o u s t u l o i h i n + m a a t a l o u s t u l o i s t a + m a a t a l o u s t u l o j a + m a a t a l o u s t u l o j e n + m a a t a l o u s t u l o k r i i s i ä + m a a t a l o u s t u l o n + m a a t a l o u s t u l o p o l i t i i k a l l a + m a a t a l o u s t u l o s t a + m a a t a l o u s t u l o s t a a n + m a a t a l o u s t u l o t + m a a t a l o u s t u l o t u k i e n + m a a t a l o u s t u o n n i l l e + m a a t a l o u s t u o t a n n o l l a + m a a t a l o u s t u o t a n n o l l e + m a a t a l o u s t u o t a n n o l l e k i n + m a a t a l o u s t u o t a n n o l t a + m a a t a l o u s t u o t a n n o n + m a a t a l o u s t u o t a n n o s s a + m a a t a l o u s t u o t a n n o s s a a n + m a a t a l o u s t u o t a n n o s s a m m e + m a a t a l o u s t u o t a n n o s t a + m a a t a l o u s t u o t a n n o s t a a n + m a a t a l o u s t u o t a n n o s t a m m e + m a a t a l o u s t u o t a n n o s t a n s a + m a a t a l o u s t u o t a n t o + m a a t a l o u s t u o t a n t o a + m a a t a l o u s t u o t a n t o a a n + m a a t a l o u s t u o t a n t o a m m e + m a a t a l o u s t u o t a n t o j ä r j e s t e l m ä + m a a t a l o u s t u o t a n t o j ä r j e s t e l m ä n + m a a t a l o u s t u o t a n t o l a i t o s t e n + m a a t a l o u s t u o t a n t o m a r k k i n o i d e n + m a a t a l o u s t u o t a n t o m m e + m a a t a l o u s t u o t a n t o n a + m a a t a l o u s t u o t a n t o n s a + m a a t a l o u s t u o t a n t o o m m e + m a a t a l o u s t u o t a n t o o n + m a a t a l o u s t u o t a n t o p o t e n t i a a l i n + m a a t a l o u s t u o t a n t o p r o s e s s i a + m a a t a l o u s t u o t a n t o t u e n + m a a t a l o u s t u o t a n t o t y y p p i e n + m a a t a l o u s t u o t a n t o v o i m a n a + m a a t a l o u s t u o t a n t o v ä l i n e i d e n + m a a t a l o u s t u o t e + m a a t a l o u s t u o t e h i n t o j a + m a a t a l o u s t u o t e m a r k k i n o i d e n + m a a t a l o u s t u o t e m a r k k i n o i l l e + m a a t a l o u s t u o t e r y h m i e n + m a a t a l o u s t u o t e t t a + m a a t a l o u s t u o t o s + m a a t a l o u s t u o t t a j a n + m a a t a l o u s t u o t t a j a s t a + m a a t a l o u s t u o t t a j a t + m a a t a l o u s t u o t t a j a y h t e i s ö n + m a a t a l o u s t u o t t a j i a + m a a t a l o u s t u o t t a j i e m m e + m a a t a l o u s t u o t t a j i e n + m a a t a l o u s t u o t t a j i i m m e + m a a t a l o u s t u o t t a j i i n + m a a t a l o u s t u o t t a j i l l e + m a a t a l o u s t u o t t a j i n a + m a a t a l o u s t u o t t a j i s t a + m a a t a l o u s t u o t t e e k s i + m a a t a l o u s t u o t t e e m m e + m a a t a l o u s t u o t t e e n + m a a t a l o u s t u o t t e e n a + m a a t a l o u s t u o t t e e s e e n + m a a t a l o u s t u o t t e e s t a + m a a t a l o u s t u o t t e e t + m a a t a l o u s t u o t t e i d e m m e + m a a t a l o u s t u o t t e i d e n + m a a t a l o u s t u o t t e i d e n s a + m a a t a l o u s t u o t t e i k s i + m a a t a l o u s t u o t t e i l l a + m a a t a l o u s t u o t t e i l l e + m a a t a l o u s t u o t t e i l l e e n + m a a t a l o u s t u o t t e i l t a + m a a t a l o u s t u o t t e i s i i n + m a a t a l o u s t u o t t e i s s a + m a a t a l o u s t u o t t e i s t a + m a a t a l o u s t u o t t e i t a + m a a t a l o u s t u o t t e i t a a n + m a a t a l o u s t u o t t e i t a n n e + m a a t a l o u s t u o t t e i t t e m m e + m a a t a l o u s t u t k i m u k s e n + m a a t a l o u s t u t k i m u k s e n a + m a a t a l o u s t u t k i m u s + m a a t a l o u s t u t k i m u s t a + m a a t a l o u s t u t k i m u s y k s i k k ö + m a a t a l o u s t u t k i m u s y k s i k ö n + m a a t a l o u s t y y p p i e n + m a a t a l o u s t y ö + m a a t a l o u s t y ö k a l u j a + m a a t a l o u s t y ö l l e + m a a t a l o u s t y ö n + m a a t a l o u s t y ö n t e k i j ä j ä r j e s t ö j e n + m a a t a l o u s t y ö n t e k i j ä l l e + m a a t a l o u s t y ö n t e k i j ä t + m a a t a l o u s t y ö n t e k i j ä ä + m a a t a l o u s t y ö n t e k i j ö i d e n + m a a t a l o u s t y ö n t e k i j ö i l l e + m a a t a l o u s t y ö p a i k a t + m a a t a l o u s t y ö s t ä + m a a t a l o u s t y ö t ä + m a a t a l o u s t y ö v o i m a s t a + m a a t a l o u s u u d i s t u k s e e n + m a a t a l o u s u u d i s t u k s e n + m a a t a l o u s u u d i s t u k s e s s a + m a a t a l o u s u u d i s t u k s e s s a a n + m a a t a l o u s u u d i s t u k s e s t a + m a a t a l o u s u u d i s t u k s e t + m a a t a l o u s u u d i s t u k s i a + m a a t a l o u s u u d i s t u k s i a m m e + m a a t a l o u s u u d i s t u k s i l l e + m a a t a l o u s u u d i s t u k s i s s a + m a a t a l o u s u u d i s t u k s i s t a + m a a t a l o u s u u d i s t u s + m a a t a l o u s u u d i s t u s l a i n + m a a t a l o u s u u d i s t u s t a + m a a t a l o u s u u d i s t u s t e n + m a a t a l o u s v a i h t o + m a a t a l o u s v a k u u t u k s e e n + m a a t a l o u s v a k u u t u s + m a a t a l o u s v a k u u t u s j ä r j e s t e l m i s s ä + m a a t a l o u s v a k u u t u s j ä r j e s t e l m ä + m a a t a l o u s v a k u u t u s j ä r j e s t e l y + m a a t a l o u s v a l i o k u n n a k s i + m a a t a l o u s v a l i o k u n n a l l a + m a a t a l o u s v a l i o k u n n a l l e + m a a t a l o u s v a l i o k u n n a l t a + m a a t a l o u s v a l i o k u n n a n + m a a t a l o u s v a l i o k u n n a s s a + m a a t a l o u s v a l i o k u n n a s s a m m e + m a a t a l o u s v a l i o k u n n a s t a + m a a t a l o u s v a l i o k u n n i s s a + m a a t a l o u s v a l i o k u n t a + m a a t a l o u s v a l i o k u n t a a + m a a t a l o u s v a l i o k u n t a a m m e + m a a t a l o u s v a l i o k u n t a a n + m a a t a l o u s v a l i o k u n t a k i n + m a a t a l o u s v a l i o k u n t a m m e + m a a t a l o u s v a l t a i s i s t a + m a a t a l o u s v a l t i o + m a a t a l o u s v a l t i o i s s a + m a a t a l o u s v a l t i o i t a + m a a t a l o u s v a l t i o n + m a a t a l o u s v a r a t + m a a t a l o u s v a r o i s t a + m a a t a l o u s v a r o j a + m a a t a l o u s v a r o j e n + m a a t a l o u s v a s t a i s t a + m a a t a l o u s v e r o i s t a + m a a t a l o u s v e r o t + m a a t a l o u s v e r o t u k s e s t a + m a a t a l o u s v i e n n i n + m a a t a l o u s v i e n n i s t ä + m a a t a l o u s v i e n t i + m a a t a l o u s v i e n t i t u e t + m a a t a l o u s v i e n t i t u k i e n + m a a t a l o u s v i l j e l y n + m a a t a l o u s v i r a s t o t + m a a t a l o u s v o i t o i s t a + m a a t a l o u s v u o d e n + m a a t a l o u s v u o s i + m a a t a l o u s v ä e s t ö + m a a t a l o u s v ä e s t ö l l e + m a a t a l o u s v ä e s t ö n + m a a t a l o u s v ä e s t ö ä + m a a t a l o u s y h t e i s k u n n a s s a + m a a t a l o u s y h t e i s k u n t a + m a a t a l o u s y h t e i s ö + m a a t a l o u s y h t e i s ö i h i n + m a a t a l o u s y h t e i s ö i s s ä + m a a t a l o u s y h t e i s ö i s s ä m m e + m a a t a l o u s y h t e i s ö i s t ä + m a a t a l o u s y h t e i s ö j e n + m a a t a l o u s y h t e i s ö j ä + m a a t a l o u s y h t e i s ö l l e + m a a t a l o u s y h t e i s ö m m e + m a a t a l o u s y h t e i s ö n + m a a t a l o u s y h t e i s ö s s ä + m a a t a l o u s y h t e i s ö t + m a a t a l o u s y h t e i s ö ä + m a a t a l o u s y h t e i s ö ö n + m a a t a l o u s y k s i k k ö j ä + m a a t a l o u s y k s i k ö n + m a a t a l o u s y l i j ä ä m i e n + m a a t a l o u s y m p ä r i s t ö n + m a a t a l o u s y m p ä r i s t ö ä + m a a t a l o u s y r i t t ä j i e n + m a a t a l o u s y r i t t ä j i n ä + m a a t a l o u s y r i t t ä j ä p e r h e e t + m a a t a l o u s y r i t t ä j ä t + m a a t a l o u s y r i t y k s e n + m a a t a l o u s y r i t y k s e t + m a a t a l o u s y r i t y k s i i n + m a a t a l o u s y r i t y k s i l l e + m a a t a l o u s y r i t y k s i s s ä + m a a t a l o u s y r i t y k s i s t ä + m a a t a l o u s y r i t y k s i ä + m a a t a l o u s y r i t y s + m a a t a l o u s y r i t y s t e n + m a a t a l o u s y r i t y s t o i m i n t a a + m a a t a l o u s y r i t y s t ä + m a a t a l o u t e e n + m a a t a l o u t e e n k i n + m a a t a l o u t e m m e + m a a t a l o u t e n s a + m a a t a l o u t t a + m a a t a l o u t t a a n + m a a t a l o u t t a m m e + m a a t a l o u t t a n s a + m a a t a n i + m a a t a s o a n t e n n i + m a a t a s o l l a + m a a t e n + m a a t e n i n + m a a t i e k u l j e t u s t e n + m a a t i e l i i k e n t e e s e e n + m a a t i e t o j a + m a a t i k k a + m a a t i l a a + m a a t i l a h a l l i n n o n + m a a t i l a h i n n a t + m a a t i l a h y ö k k ä y k s e t + m a a t i l a k o h t a i n e n + m a a t i l a k o h t a i s e e n + m a a t i l a l a i n + m a a t i l a l a k i + m a a t i l a l l a + m a a t i l a l o m i e n + m a a t i l a l t a + m a a t i l a m a l l i + m a a t i l a m a l l i n + m a a t i l a m a t k a i l u + m a a t i l a m a t k a i l u a + m a a t i l a m a t k a i l u l l a + m a a t i l a m a t k a i l u n + m a a t i l a m a t k a i l u s s a + m a a t i l a n + m a a t i l a p e r h e i t ä + m a a t i l a p e r h e t t ä + m a a t i l a r a k e n n u k s i a + m a a t i l a r y h m i e n + m a a t i l a t + m a a t i l a t a r k a s t u s t e n + m a a t i l a t a s o l l a + m a a t i l a t u o t t e i d e n + m a a t i l k u l l e + m a a t i l o i h i n + m a a t i l o i l l a + m a a t i l o i l l e + m a a t i l o i l t a + m a a t i l o i s t a + m a a t i l o j a + m a a t i l o j e n + m a a t k i n + m a a t t o m i l l a + m a a t u n n u k s i s t a + m a a t u n n u s + m a a t y r a n n i t + m a a t y ö l ä i s e t + m a a t y ö l ä i s i l l e + m a a t y ö l ä i s i s t ä + m a a t y ö l ä i s i ä + m a a t y ö l ä i s i ä ä n + m a a t y ö l ä i s t ä + m a a t y ö n t e k i j ä t + m a a u l k o r a j a + m a a u l k o r a j a t + m a a u l k o r a j o i l l a + m a a u l k o r a j o j a + m a a u l k o r a j o j e n + m a a u u d i s t u k s e e n + m a a u u d i s t u k s e n + m a a u u d i s t u k s e n s a + m a a u u d i s t u k s e s t a + m a a u u d i s t u k s e t + m a a u u d i s t u k s i a + m a a u u d i s t u k s i s t a + m a a u u d i s t u s + m a a u u d i s t u s t a + m a a v a l o + m a a v a r a + m a a v a r o j a m m e + m a a v a r o j e m m e + m a a v a r o j e n + m a a v o i m a t + m a a v ä r i t + m a a y h t e y d e t + m a a y h t e y k s i e n + m a a y h t e y s + m a a y h t e y t t ä + m a a y m p ä r i s t ö n + m a a ö l j y + m a a ö l j y l l ä + m a a ö l j y n t u o t t a j a v a l t i o i s t a + m a a ö l j y t e o l l i s u u s + m a a ö l j y t u o t e + m a a ö l j y t u o t e v a l i k o i m a a + m a a ö l j y v a r a t + m a a ö l j y v a r o j a + m a b a k i e l e t + m a b a t + m a c a o l a i s e t + m a c c h i a + m a c d i a r m a d a + m a c h i a v e l l i s t i s i i n + m a c h o i l u u n + m a c h o i m a g o n n e + m a c h o j o h t a j a t + m a c h o k u l t t u u r i + m a c i n a + m a d a g a s k a r i l a i s t e n + m a d a l l e t t a v a + m a d a l l u s p a i n e e s e e n + m a d a l l u s p a i n e e t + m a d a l l u s p a i n e i t a + m a d a l t a a + m a d a l t a a k s e m m e + m a d a l t u v a t + m a d e i r a a + m a d e i r a k a k k u + m a d e i r a l a i s i l l e + m a d e i r a l a i s t e n + m a d e i r a l l a + m a d e i r a n + m a d e i r a n h i p p i ä i n e n + m a d e i r a n k a a l i p e r h o n e n + m a d e i r a n k e i j u + m a d e i r a n k i i t ä j ä + m a d e i r a n k y y h k y + m a d e i r a n p a p u r i k k o + m a d e i r a n s i t r u u n a p e r h o n e n + m a d e i r a s s a + m a d e i r a v i i n i e n + m a d o n n a n + m a d o n n a n l i l j a + m a d r a s o i s s a + m a d r i g a a l i d r a a m a + m a f i a a + m a f i a h a l l i t u s + m a f i a i s k u a + m a f i a j e n g i e n + m a f i a j u t t u + m a f i a j ä r j e s t ö + m a f i a j ä r j e s t ö i l t ä + m a f i a j ä r j e s t ö i s t ä + m a f i a j ä r j e s t ö j e n + m a f i a j ä r j e s t ö t + m a f i a j ä r j e s t ö ä + m a f i a k r i i s i + m a f i a l l a + m a f i a n + m a f i a n t o r j u n t a y k s i k k ö + m a f i a o i k e u d e n k ä y n n i s t ä + m a f i a o r g a n i s a a t i o i d e n + m a f i a o r g a n i s a a t i o n + m a f i a p i i r e i h i n + m a f i a p o m o j a + m a f i a r a k e n t e e t + m a f i a r i k o k s e t + m a f i a r i k o l l i s i l t a + m a f i a r i k o l l i s t e n + m a f i a r y h m i s t ä + m a f i a r y h m i t t y m i e n + m a f i a r y h m ä t + m a f i a s t a + m a f i a s t a k a a n + m a f i a t o i m i n n a n + m a f i a t y y l i i n + m a f i a t y y l i s e t + m a f i a t y y p p i s e n + m a f i a t y y p p i s i l l e + m a f i a t y y p p i s t e n + m a f i a v a l t i o + m a f i a v e r k k o j e n + m a f i a v e r k o s t o j e n + m a f i a y h t e y k s i e n s ä + m a f i o s o j e n + m a g i a a + m a g m a k i v i + m a g m a s ä i l i ö + m a g n e e t e i s t a + m a g n e e t t i h o i t o + m a g n e e t t i k e n t t i e n + m a g n e e t t i k e n t t ä + m a g n e e t t i k o l a n g i o g r a f i a + m a g n e e t t i k u v a u s + m a g n e e t t i k u v a u s l a i t t e i s i i n + m a g n e e t t i k y t k i n + m a g n e e t t i l e l u i h i n + m a g n e e t t i n a u h a + m a g n e e t t i p i i r e i h i n + m a g n e e t t i r e s o n a n s s i k u v a u s + m a g n e e t t i r e s o n a n s s i k u v a u s t a + m a g n e e t t i s e n + m a g n e e t t i s t i m u l a a t i o + m a g n e e t t i t e k n i i k k a + m a g n e e t t i v a h v i s t i n + m a g n e e t t i v e n t t i i l i + m a g n e e t t i v u o + m a g n e s i u m h y d r o k s i d i + m a g n e s i u m k a r b o n a a t t i + m a g n e s i u m k l o r i d i + m a g n e s i u m n i t r a a t t i + m a g n e s i u m o k s i d i + m a g n e s i u m s e o k s e t + m a g n e s i u m s u l f a a t t i + m a g n e s i u m s u l f a a t t i i n + m a g n o l i a k e r t t u l i + m a h a h a a v a + m a h a k a l i + m a h a l a s k u + m a h a n e s t e + m a h a r a u h a n e n + m a h a s y ö p ä + m a h a s y ö p ä ä n + m a h a t m a k i r j e e t + m a h d a m m e k o h a n + m a h d i t + m a h d o l l i n e n k a a n + m a h d o l l i s e e n + m a h d o l l i s e k s i + m a h d o l l i s e l l a + m a h d o l l i s e l l e + m a h d o l l i s e l t a + m a h d o l l i s e m m a k s i + m a h d o l l i s e m m a l t a + m a h d o l l i s e n + m a h d o l l i s e n a + m a h d o l l i s e s s a + m a h d o l l i s e s t a + m a h d o l l i s e t + m a h d o l l i s i a + m a h d o l l i s i i n + m a h d o l l i s i k s i + m a h d o l l i s i l l a + m a h d o l l i s i l l e + m a h d o l l i s i l t a + m a h d o l l i s i m m a n + m a h d o l l i s i m m a t + m a h d o l l i s i n + m a h d o l l i s i n a + m a h d o l l i s i s s a + m a h d o l l i s i s t a + m a h d o l l i s t a a + m a h d o l l i s t a a k s e e n + m a h d o l l i s t a a k s e m m e + m a h d o l l i s t a i s i + m a h d o l l i s t a i s i v a t + m a h d o l l i s t a j a n a + m a h d o l l i s t a k a a n + m a h d o l l i s t a m a l l a + m a h d o l l i s t a m i s e k s i + m a h d o l l i s t a m i s e s s a + m a h d o l l i s t a m m e + m a h d o l l i s t a n e e t + m a h d o l l i s t a n u t + m a h d o l l i s t a v a + m a h d o l l i s t a v a n + m a h d o l l i s t a v a t + m a h d o l l i s t a v i a + m a h d o l l i s t e n + m a h d o l l i s t e t a a n + m a h d o l l i s t e t t a i s i i n + m a h d o l l i s t e t t a v a + m a h d o l l i s t i + m a h d o l l i s u u d e k s i + m a h d o l l i s u u d e n + m a h d o l l i s u u d e s t a + m a h d o l l i s u u d e t + m a h d o l l i s u u k s i a + m a h d o l l i s u u k s i a a n + m a h d o l l i s u u k s i a k a a n + m a h d o l l i s u u k s i a k i n + m a h d o l l i s u u k s i a m m e + m a h d o l l i s u u k s i e m m e + m a h d o l l i s u u k s i e n + m a h d o l l i s u u k s i e n s a + m a h d o l l i s u u k s i i m m e + m a h d o l l i s u u k s i i n + m a h d o l l i s u u k s i i n s a + m a h d o l l i s u u k s i l l a a n + m a h d o l l i s u u k s i s s a + m a h d o l l i s u u k s i s t a + m a h d o l l i s u u k s i s t a a n + m a h d o l l i s u u t e e n + m a h d o l l i s u u t e n a + m a h d o l l i s u u t e n s a + m a h d o l l i s u u t t a + m a h d o l l i s u u t t a m m e + m a h d o l l i s u u t t a n i + m a h d o t o n t a + m a h d o t t o m a k s i + m a h d o t t o m a l t a + m a h d o t t o m a m m a l t a + m a h d o t t o m a n a + m a h d o t t o m a s t a + m a h d o t t o m i a + m a h d o t t o m i n t a + m a h d o t t o m i s t a + m a h d o t t o m u u d e l t a + m a h l a t i k k a + m a h o n k i p l a n t a a s e j a + m a h t a i l e v i i n + m a h t a i s i m m e k o + m a h t a i s i n k o + m a h t a n e e k o + m a h t a v a a + m a h t a v a m p i + m a h t a v a t + m a h t a v i a + m a h t a v i m m a n + m a h t a v i m m a t + m a h t a v i m p i a + m a h t a v i m p i e n + m a h t a v i m p i i n + m a h t a v i n + m a h t a v i n t a + m a h t i a s e m a n + m a h t i e n + m a h t i k ä s k y ä + m a h t i m a i s s a + m a h t i p o n t i s e m p i i n + m a h t i p o n t i s e n + m a h t i p o n t i s i a + m a h t i p o n t i s t a + m a h t i p u o l u e e l l a + m a h t i s o r m u s + m a h t i v a l t i o i d e n s a + m a h t i v a l t i o n + m a h t u a + m a h t u m a a n + m a h t u u + m a i d e m m e + m a i d e n + m a i d e n k i n + m a i d e n n e + m a i d e n s a + m a i d o l l a + m a i d o n + m a i d o n h i n t a + m a i d o n h i n t o j e n + m a i d o n j a k e l u t e o l l i s u u d e n + m a i d o n j a l o s t u s t e o l l i s u u d e n + m a i d o n k o r v i k e t t a + m a i d o n k u l u t u k s e n + m a i d o n k u l u t u s + m a i d o n k u l u t u s t a + m a i d o n t a r j o n t a a + m a i d o n t u o t a n n o l l a + m a i d o n t u o t a n n o l l e + m a i d o n t u o t a n n o n + m a i d o n t u o t a n n o s s a + m a i d o n t u o t a n n o s t a + m a i d o n t u o t a n t o + m a i d o n t u o t a n t o a + m a i d o n t u o t a n t o a a n + m a i d o n t u o t a n t o a l a + m a i d o n t u o t a n t o a l a a + m a i d o n t u o t a n t o a l a l l a + m a i d o n t u o t a n t o a l a n + m a i d o n t u o t a n t o a l u e e n a + m a i d o n t u o t a n t o k i i n t i ö i d e n + m a i d o n t u o t a n t o k i i n t i ö t + m a i d o n t u o t a n t o k y k y + m a i d o n t u o t a n t o m m e + m a i d o n t u o t a n t o o n + m a i d o n t u o t t a j a + m a i d o n t u o t t a j a a + m a i d o n t u o t t a j a m m e + m a i d o n t u o t t a j a n + m a i d o n t u o t t a j a n a + m a i d o n t u o t t a j a r y h m ä l l e + m a i d o n t u o t t a j a t + m a i d o n t u o t t a j a y r i t y s t e n + m a i d o n t u o t t a j i a + m a i d o n t u o t t a j i a m m e + m a i d o n t u o t t a j i e m m e + m a i d o n t u o t t a j i e n + m a i d o n t u o t t a j i i n + m a i d o n t u o t t a j i k s i + m a i d o n t u o t t a j i l l a + m a i d o n t u o t t a j i l l e + m a i d o n t u o t t a j i l l e e n + m a i d o n t u o t t a j i l l e m m e + m a i d o n t u o t t a j i s s a + m a i d o n t u o t t a j i s t a + m a i d o n t u o t t a j i s t a m m e + m a i d o s s a + m a i h i m m e + m a i h i n n o u s u a l u s + m a i h i n n o u s u k o r t t i + m a i h i n n o u s u p a i k k o j a + m a i h i n n o u s u s o t a t o i m i + m a i h i n t u o n t i s a t a m i s s a + m a i l a p e l i + m a i l i m ä ä r ä ä + m a i l l a + m a i l l e + m a i l l e m m e + m a i l t a + m a i n e e l l e + m a i n e e n + m a i n e e n s a + m a i n e e s e e n + m a i n e e s e e n s a + m a i n e e s t a m m e + m a i n e i k k a i t a + m a i n e t t a + m a i n e t t a a n + m a i n e t t a m m e + m a i n i n n a n + m a i n i n n a t + m a i n i n n e e n i + m a i n i n n e e t + m a i n i n n e i l l e + m a i n i n n o i k s i + m a i n i n n u t + m a i n i n t a a + m a i n i n t o j a + m a i n i n t o j e n + m a i n i o t + m a i n i o t a + m a i n i t a + m a i n i t a a n + m a i n i t a a n k i n + m a i n i t a k s e n i + m a i n i t e s s a a n + m a i n i t e s s a m m e + m a i n i t e s s a n i + m a i n i t k a a m m e + m a i n i t s e e + m a i n i t s e m a + m a i n i t s e m a a + m a i n i t s e m a a n + m a i n i t s e m a a n i + m a i n i t s e m a a n n e + m a i n i t s e m a a n s a + m a i n i t s e m a l l a + m a i n i t s e m a l l a n i + m a i n i t s e m a n + m a i n i t s e m a n i + m a i n i t s e m a n n e + m a i n i t s e m a s s a + m a i n i t s e m a s s a n i + m a i n i t s e m a s s a n n e + m a i n i t s e m a s t a + m a i n i t s e m a t t a + m a i n i t s e m i a n n e + m a i n i t s e m i e n + m a i n i t s e m i i n i + m a i n i t s e m i i n n e + m a i n i t s e m i l l a n i + m a i n i t s e m i l t a n i + m a i n i t s e m i n e n + m a i n i t s e m i s e n + m a i n i t s e m i s t a + m a i n i t s e m i s t a n i + m a i n i t s e m i s t a n n e + m a i n i t s e n + m a i n i t s e t t e k i n + m a i n i t s e v a n + m a i n i t s e v a t + m a i n i t s i + m a i n i t s i k i n + m a i n i t s i m m e + m a i n i t s i n + m a i n i t s i s i n + m a i n i t s i t t e + m a i n i t s i t t e h a n + m a i n i t s i t t e k i n + m a i n i t s i v a t + m a i n i t s i v a t k i n + m a i n i t t a k o o n + m a i n i t t a v a a + m a i n i t t a v a t + m a i n i t t i i n + m a i n i t t i i n k i n + m a i n i t t u a + m a i n i t t u i h i n + m a i n i t t u j a + m a i n i t t u j e n + m a i n i t t u u n + m a i n i t u i s s a + m a i n i t u i s t a + m a i n i t u l l a + m a i n i t u n + m a i n i t u s s a + m a i n i t u s t a + m a i n i t u t + m a i n o k s i a + m a i n o k s i i n + m a i n o k s i l l a + m a i n o k s i l l e + m a i n o k s i s t a + m a i n o n n a k s i + m a i n o n n a l t a + m a i n o n n a n + m a i n o n n a s t a + m a i n o n t a a + m a i n o n t a a n + m a i n o n t a k i e l l o n + m a i n o n t a k i e l l o s t a + m a i n o n t a k i e l t o + m a i n o n t a k i e l t o a + m a i n o n t a k i e l t o j a + m a i n o n t a k u l u i s t a + m a i n o n t a k ä y t ä n n ö i l l ä + m a i n o n t a k ä y t ä n t ö j e n + m a i n o n t a k ä y t ä n t ö j ä + m a i n o n t a m a h d o l l i s u u d e t + m a i n o n t a m a h d o l l i s u u k s i i n + m a i n o n t a m a t e r i a a l e i s s a + m a i n o n t a m e n e t e l m i ä + m a i n o n t a m e n e t t e l y j e n + m a i n o n t a o i k e u k s i a + m a i n o n t a p o l i t i i k k a + m a i n o n t a s ä ä n n ö t + m a i n o n t a s ä ä n t ö j e n + m a i n o n t a t a r k o i t u k s i i n + m a i n o n t a t e k n i i k k a + m a i n o n t a t e k n i i k o i d e n + m a i n o n t a t o i m i a + m a i n o n t a t o i m i e n + m a i n o n t a t o i m i l l e + m a i n o n t a t y y p e i s t ä + m a i n o s a i k a a + m a i n o s a i n e i s t o n + m a i n o s a j a n + m a i n o s a l a + m a i n o s a l a a + m a i n o s a l a l l a + m a i n o s a l a l l e + m a i n o s a l a n + m a i n o s b u d j e t i l l a + m a i n o s e s i t t e i s i i n s ä + m a i n o s j u l i s t e i s s a a n + m a i n o s k a m p a n j a + m a i n o s k a m p a n j a a + m a i n o s k a m p a n j a a n + m a i n o s k a m p a n j a l l a + m a i n o s k a m p a n j a n + m a i n o s k a m p a n j a s t a + m a i n o s k a m p a n j a t + m a i n o s k a m p a n j o i d e n + m a i n o s k a m p a n j o i h i n + m a i n o s k a m p a n j o i l l a + m a i n o s k a m p a n j o i s s a + m a i n o s k a m p a n j o i s t a + m a i n o s k a m p a n j o i t a + m a i n o s k a t k o i s t a + m a i n o s k a t k o j a + m a i n o s k a t k o j e n + m a i n o s k e i n o n a + m a i n o s k i e l l o t + m a i n o s k i e l t o + m a i n o s k i e l t o a + m a i n o s k i e l t o i h i n + m a i n o s k i e l t o j a + m a i n o s k i e l t o o n + m a i n o s k u r i i n + m a i n o s k u v a n + m a i n o s k y l t e i l l ä + m a i n o s l a h j a n + m a i n o s l a i n s ä ä d ä n n ö n + m a i n o s l a u s e + m a i n o s l a u s e e n a + m a i n o s l a u s e e s e e n + m a i n o s l a u s e i s i i n + m a i n o s l a u s e t t a + m a i n o s l e h t i s i s t ä + m a i n o s m a k s u j a + m a i n o s m a r k k i n a t + m a i n o s m a r k k i n o i d e n + m a i n o s m a t e r i a a l e i s s a + m a i n o s m a t e r i a a l i + m a i n o s m a t e r i a a l i a + m a i n o s m a t e r i a a l i i n + m a i n o s m a t e r i a a l i n + m a i n o s m a t e r i a a l i s t a + m a i n o s m a t e r i a a l i s t a a n + m a i n o s n e u v o s t o + m a i n o s n e u v o s t o j a + m a i n o s p a l a t + m a i n o s p a l k i n t o a + m a i n o s p a l o j e n + m a i n o s p a l v e l u j a + m a i n o s p o s t i a + m a i n o s p y l v ä s t ä + m a i n o s p y l v ä ä l t ä + m a i n o s r a h o j e n + m a i n o s s o i t o i l t a + m a i n o s s t r a t e g i o i h i n + m a i n o s s ä h k ö p o s t i n + m a i n o s s ä h k ö p o s t i t + m a i n o s s ä ä n t ö j ä + m a i n o s t a a + m a i n o s t a m a m m e + m a i n o s t a m i s a i k a a n + m a i n o s t a m i s k i e l t o + m a i n o s t a m i s t a + m a i n o s t a r k o i t u k s i a + m a i n o s t a u k o i h i n + m a i n o s t a u k o j a + m a i n o s t a u l u a + m a i n o s t a u l u n + m a i n o s t a u o n + m a i n o s t e m p a u k s i a + m a i n o s t e m p p u + m a i n o s t e m p p u j e n + m a i n o s t e m p p u n a + m a i n o s t e m p u s t a + m a i n o s t e m p u t + m a i n o s t e n + m a i n o s t e o l l i s u u d e s s a + m a i n o s t e t t a v a + m a i n o s t e t u i s t a + m a i n o s t i l a n + m a i n o s t i l a s t a + m a i n o s t i m m e + m a i n o s t o i m e t + m a i n o s t o i m i s t o + m a i n o s t o i m i s t o i l l e + m a i n o s t o i m i s t o i s t a + m a i n o s t o i m i s t o j e n + m a i n o s t o i m i s t o l l a + m a i n o s t o i m i s t o t + m a i n o s t u l o i h i n + m a i n o s t u l o i s t a + m a i n o s t u l o j a + m a i n o s t u l o j e n + m a i n o s t u l o t + m a i n o s t u s k i e l t o a + m a i n o s t u s t a r k o i t u k s e s s a + m a i n o s v a i k u t u k s e s t a + m a i n o s v a l v o n n a n + m a i n o s v a r o j a + m a i n o s v a r o j e n + m a i n o s v i e s t e j ä + m a i n o s v i e s t i n t ä ä + m a i n o s v i e s t i t + m a i n o s y h t i ö i d e n + m a i n o s y h t i ö i l l e + m a i n o s y r i t y k s e t + m a i n o s y r i t y k s i i n + m a i n o s y r i t y k s i l l e + m a i s e m a a n + m a i s e m a m a a l a u s + m a i s e m a m a t k a i l u + m a i s e m a m a t k a i l u k o h t e e n + m a i s e m a n + m a i s e m a n h o i d o s s a + m a i s e m a n h o i t a j i a + m a i s e m a n h o i t o + m a i s e m a n h o i t o a + m a i s e m a n h o i t o o n + m a i s e m a n s u o j e l u n + m a i s e m a n s u o j e l u s t a + m a i s e m a p u u t a r h a + m a i s e m a r e i t t i ä + m a i s e m a s t a k a a n + m a i s e m a s u u n n i t t e l u + m a i s e m a s u u n n i t t e l u s s a + m a i s e m a s u u n n i t t e l u u n + m a i s e m a t y y p p e i h i n + m a i s e m a v a i k u t u k s e t + m a i s e m a v a l o k u v a u s + m a i s e m i a + m a i s e m i l l a + m a i s i n + m a i s s a m m e + m a i s s i a + m a i s s i a a n + m a i s s i g l u t e e n i r e h u a + m a i s s i h i u t a l e e t + m a i s s i j a u h o a + m a i s s i j a u h o s t a + m a i s s i k i i n t i ö i d e n + m a i s s i k i r v a + m a i s s i k o i s a + m a i s s i l a j i k k e i l l a + m a i s s i l a j i k k e i t a + m a i s s i l l e + m a i s s i m a r k k i n o i l l a + m a i s s i n + m a i s s i n t u o n t i a + m a i s s i n t u o t a n t o + m a i s s i n t u o t t a j a m m e + m a i s s i n v i l j e l y y n + m a i s s i n ä y t t e i t ä + m a i s s i p e l t o o n + m a i s s i s a a r e t + m a i s s i s a d o s t a + m a i s s i s a t o + m a i s s i s i i r a p i l l a + m a i s s i s i i r a p p e j a + m a i s s i s t a + m a i s s i s ä i l ö r e h u t u k i + m a i s s i t o n n i n + m a i s s i t u k i + m a i s s i t ä r k k e l y k s e n + m a i s s i t ä r k k e l y s + m a i s s i ö l j y + m a i s t a a n + m a i s t a m a a n + m a i s t e r i k u r s s e j a + m a i s t e r i k u r s s i e n + m a i s t e r i n + m a i s t e r i n k o u l u t u s o h j e l m a a + m a i s t e r i n o h j e l m a t + m a i s t e r i n t u t k i n t o a + m a i s t e r i o h j e l m a a + m a i s t i a i s i a + m a i s t r a a t t i e n + m a i t i a i s k e h r ä ä j ä + m a i t i a i s n e s t e + m a i t o a + m a i t o a h v e n + m a i t o a l a + m a i t o a l a a + m a i t o a l a a n + m a i t o a l a l l a + m a i t o a l a l l e + m a i t o a l a l t a + m a i t o a l a n + m a i t o a l a s t a + m a i t o a l l e r g i a + m a i t o a l o i l l a + m a i t o a l o j a + m a i t o a l o j e n + m a i t o a u t o n + m a i t o h a m m a s + m a i t o h a p p o + m a i t o h a p p o b a k t e e r i + m a i t o h o r s m a + m a i t o j a l o s t e i l l e + m a i t o j a u h e + m a i t o j a u h e e k s i + m a i t o j a u h e e l l e + m a i t o j a u h e e n + m a i t o j a u h e e s e e n + m a i t o j a u h e e s t a + m a i t o j a u h e s k a n d a a l i + m a i t o j a u h e t t a + m a i t o j e n + m a i t o j ä r j e s t e l m ä n + m a i t o j ä r v e t + m a i t o j ä r v i e n + m a i t o j ä r v i s t ä + m a i t o j ä r v i ä + m a i t o k a r j a e l ä i n t e n + m a i t o k a r j a t a l o u d e n + m a i t o k i i n t i ö + m a i t o k i i n t i ö i d e n + m a i t o k i i n t i ö i d e n s ä + m a i t o k i i n t i ö i h i n + m a i t o k i i n t i ö i s t ä + m a i t o k i i n t i ö i t ä + m a i t o k i i n t i ö i t ä ä n + m a i t o k i i n t i ö j ä r j e s t e l m ä + m a i t o k i i n t i ö j ä r j e s t e l m ä l l e + m a i t o k i i n t i ö j ä r j e s t e l m ä n + m a i t o k i i n t i ö j ä r j e s t e l m ä s t ä + m a i t o k i i n t i ö j ä r j e s t e l m ä ä + m a i t o k i i n t i ö j ä r j e s t e l m ä ä n + m a i t o k i i n t i ö k y s y m y s + m a i t o k i i n t i ö l l ä + m a i t o k i i n t i ö n + m a i t o k i i n t i ö n s ä + m a i t o k i i n t i ö o s u u s + m a i t o k i i n t i ö s t ä + m a i t o k i i n t i ö s t ä ä n + m a i t o k i i n t i ö t + m a i t o k i i n t i ö t ä + m a i t o k i i n t i ö v u o d e s t a + m a i t o k i i n t i ö ö n + m a i t o k r i i s i + m a i t o k r i i s i i n + m a i t o k r i i s i s s ä + m a i t o k r i i s i s t ä + m a i t o k u l j e t u s t e n + m a i t o k ä ä r m e + m a i t o l a k k o + m a i t o l e h m i l l e + m a i t o l e h m ä ä + m a i t o l e h t i m i t t a r i + m a i t o l i t r a + m a i t o l i t r a a + m a i t o l i t r a n + m a i t o l i t r a s t a + m a i t o l u o k a n + m a i t o l u o k a s t a + m a i t o m a r k k i n a t + m a i t o m a r k k i n o i d e n + m a i t o m a r k k i n o i h i n + m a i t o m a r k k i n o i l l a + m a i t o m a r k k i n o i l l e + m a i t o m a r k k i n o i s t a + m a i t o m a r k k i n o i t a + m a i t o m e r e n + m a i t o m e r e s s ä + m a i t o m e r i ä + m a i t o m ä ä r i e n + m a i t o m ä ä r ä s t ä + m a i t o p a k e t i n + m a i t o p a k k a u k s e t + m a i t o p a l k k i o t + m a i t o p o h j a i s e t + m a i t o p o h j a i s i s s a + m a i t o p o h j a i s t e n + m a i t o p o l i t i i k a s s a + m a i t o p o l i t i i k k a + m a i t o p o l i t i i k k a a + m a i t o p u l a n + m a i t o r a h a s t o + m a i t o r a h a s t o a + m a i t o r a h a s t o a s i a s s a + m a i t o r a h a s t o i n t e r v e n t i o n + m a i t o r a h a s t o k y s y m y k s e e n + m a i t o r a h a s t o l l e + m a i t o r a h a s t o n + m a i t o r a h a s t o n a + m a i t o r a h a s t o o n + m a i t o r a h a s t o s s a + m a i t o r a h a s t o s t a + m a i t o r a s v a n + m a i t o r a u h a n e n + m a i t o s e k t o r i l l a + m a i t o s e k t o r i l l e + m a i t o s u k l a a + m a i t o s u k l a a n + m a i t o s u k l a a n s a + m a i t o t a l o u d e n + m a i t o t a l o u s + m a i t o t a l o u s a l a a + m a i t o t a l o u s a l a l l a + m a i t o t a l o u s a l a n + m a i t o t a l o u s t u o t t e e t + m a i t o t a l o u s t u o t t e i d e n + m a i t o t a l o u s t u o t t e i s i i n + m a i t o t a l o u s t u o t t e i s t a + m a i t o t a l o u s t u o t t e i t a + m a i t o t e h t a i d e n + m a i t o t e o l l i s u u d e n + m a i t o t e o l l i s u u s + m a i t o t i i v i s t e + m a i t o t i l a + m a i t o t i l a a + m a i t o t i l a l l i n e n + m a i t o t i l a l l i s e l l e + m a i t o t i l a l l i s e t + m a i t o t i l a l l i s i l l e + m a i t o t i l a l l i s i l l e m m e + m a i t o t i l a l l i s t a + m a i t o t i l a t + m a i t o t i l o i l l a + m a i t o t i l o i l l e + m a i t o t i l o i s t a + m a i t o t i l o j e n + m a i t o t o i m i t u k s i a + m a i t o t o n k k a + m a i t o t o n n i a + m a i t o t u e n + m a i t o t u e t + m a i t o t u k e a + m a i t o t u k i a + m a i t o t u k i e n + m a i t o t u k i o h j e l m a a + m a i t o t u k i r a h a s t o n + m a i t o t u o t a n n o n + m a i t o t u o t a n t o k i i n t i ö t ä + m a i t o t u o t e + m a i t o t u o t e a l a + m a i t o t u o t e a l a a + m a i t o t u o t e a l a l l a + m a i t o t u o t e a l a l l e + m a i t o t u o t e a l a n + m a i t o t u o t e m a r k k i n o i d e n + m a i t o t u o t e r a h a s t o n + m a i t o t u o t t e e t + m a i t o t u o t t e i d e n + m a i t o t u o t t e i l l a + m a i t o t u o t t e i l l e + m a i t o t u o t t e i n a + m a i t o t u o t t e i s i i n + m a i t o t u o t t e i s s a + m a i t o t u o t t e i s t a + m a i t o t u o t t e i t a + m a i t o t ö l k i n + m a i t o v a l a s + m a i t o v a l m i s t e i d e n + m a i t o v a s i k a n + m a i t o v u o r e t + m a i t o v u o t t a + m a i t t e m m e + m a i t t e n s a + m a j a k a t + m a j a l a v a s t a j a + m a j e s t e e t i l l e e n + m a j e s t e e t t i n s a + m a j o i t e t t a v a + m a j o i t t a a + m a j o i t t a v i s t a + m a j o i t t u v a n + m a j o i t u k s e e n + m a j o i t u k s e l l e + m a j o i t u k s e n + m a j o i t u s a l a l l a + m a j o i t u s k a p a s i t e e t i n + m a j o i t u s k e s k u k s e t + m a j o i t u s k e s k u k s i a + m a j o i t u s k e s k u k s i i n + m a j o i t u s k o r v a u s t a + m a j o i t u s k u l u j e n + m a j o i t u s k u l u t + m a j o i t u s k u s t a n n u k s i i n + m a j o i t u s l a i t + m a j o i t u s l a i t o s t a + m a j o i t u s l a i t o s t e n + m a j o i t u s l i i k e j ä t e + m a j o i t u s t i l a t + m a j o i t u s t i l o i h i n + m a j o i t u s t i l o j a + m a k a a m i s t a + m a k a r o n i l a a t i k k o + m a k a r o n i l y r i i k k a + m a k a s s a r i n s a l m i + m a k e d o n i a a + m a k e d o n i a a n + m a k e d o n i a l a i s s o d a t + m a k e d o n i a l a i s s o t a + m a k e d o n i a l a i s t e n + m a k e d o n i a l a i s v ä e s t ö l l e + m a k e d o n i a l a i s v ä h e m m i s t ö n + m a k e d o n i a n + m a k e d o n i a n k i e l i s t e n + m a k e d o n i a n m ä n t y + m a k e d o n i a s s a + m a k e d o n i a s t a + m a k e i s t y y p i t + m a k e u t u s a i n e + m a k e u t u s a i n e d i r e k t i i v i ä + m a k e u t u s a i n e e n + m a k e u t u s a i n e e t + m a k e u t u s a i n e i d e n + m a k e u t u s a i n e i l l a + m a k e u t u s a i n e i n a + m a k e u t u s a i n e i t a + m a k i n a m i + m a k k a r a j u h l i l l a + m a k k a r a k o n e + m a k k a r a t a l o + m a k k a r o i s s a + m a k o n d e t + m a k r i l l i a h v e n + m a k r i l l i h a i + m a k r i l l i k a n n a n + m a k r i l l i k a n t a a + m a k r i l l i k a n t o j e n + m a k r i l l i k i i n t i ö + m a k r i l l i s a a l i i d e n + m a k r i l l i s a a l i i t a + m a k r i l l i t i l a n t e e s t a + m a k r i l l i t u o t t e i t a + m a k r o a l u e + m a k r o a l u e e k s i + m a k r o a l u e e l l a + m a k r o a l u e e l l i n e n + m a k r o a l u e e l l i s e e n + m a k r o a l u e e l l i s e n + m a k r o a l u e e l l i s e s t i + m a k r o a l u e e l l i s e t + m a k r o a l u e e l l i s i a + m a k r o a l u e e l l i s i i n + m a k r o a l u e e l l i s i l l a + m a k r o a l u e e l l i s i l l e + m a k r o a l u e e l l i s i s t a + m a k r o a l u e e l l i s t a + m a k r o a l u e e l l i s t e n + m a k r o a l u e e n + m a k r o a l u e e t + m a k r o a l u e i d e n + m a k r o a l u e i l l a + m a k r o a l u e i l l e + m a k r o a l u e i s i i n + m a k r o a l u e i t a + m a k r o a l u e k o k o n a i s u u k s i a + m a k r o a l u e s t r a t e g i a n + m a k r o a l u e s t r a t e g i a t + m a k r o a l u e s t r a t e g i o i d e n + m a k r o a l u e s t r a t e g i o i l l a + m a k r o a l u e s t r a t e g i o i s s a + m a k r o a l u e s t r a t e g i o i s t a + m a k r o a l u e s t r a t e g i o i t a + m a k r o a l u e t a s o n + m a k r o a l u e t t a + m a k r o e k o n o m i s i a + m a k r o e k o n o m i s i i n + m a k r o e k o n o m i s t e n + m a k r o m i t t a k a a v a s s a + m a k r o p o l i t i i k a n + m a k r o p o l i t i i k k o j a + m a k r o r a h o i t u s v a k a u t t a + m a k r o t a l o u d e l l i n e n + m a k r o t a l o u d e l l i s e e n + m a k r o t a l o u d e l l i s e l l a + m a k r o t a l o u d e l l i s e l l e + m a k r o t a l o u d e l l i s e l t a + m a k r o t a l o u d e l l i s e m p a a + m a k r o t a l o u d e l l i s e n + m a k r o t a l o u d e l l i s e n a + m a k r o t a l o u d e l l i s e s s a + m a k r o t a l o u d e l l i s e s t a + m a k r o t a l o u d e l l i s e s t i + m a k r o t a l o u d e l l i s e t + m a k r o t a l o u d e l l i s i a + m a k r o t a l o u d e l l i s i i n + m a k r o t a l o u d e l l i s i n + m a k r o t a l o u d e l l i s i n a + m a k r o t a l o u d e l l i s i s s a + m a k r o t a l o u d e l l i s i s t a + m a k r o t a l o u d e l l i s t a + m a k r o t a l o u d e l l i s t e n + m a k r o t a l o u d e n + m a k r o t a l o u d e s s a + m a k r o t a l o u s + m a k r o t a l o u s a n a l y y s e i h i n + m a k r o t a l o u s a p u a + m a k r o t a l o u s k e h y s + m a k r o t a l o u s k e h y s t ä + m a k r o t a l o u s p o l i i t t i s e t + m a k r o t a l o u s p o l i i t t i s i s t a + m a k r o t a l o u s p o l i t i i k a l l a + m a k r o t a l o u s p o l i t i i k a l l e + m a k r o t a l o u s p o l i t i i k a n + m a k r o t a l o u s p o l i t i i k a s s a + m a k r o t a l o u s p o l i t i i k a s s a m m e + m a k r o t a l o u s p o l i t i i k a s t a + m a k r o t a l o u s p o l i t i i k a t + m a k r o t a l o u s p o l i t i i k k a + m a k r o t a l o u s p o l i t i i k k a a + m a k r o t a l o u s p o l i t i i k k a a n + m a k r o t a l o u s p o l i t i i k k a m m e + m a k r o t a l o u s p o l i t i i k k o j a + m a k r o t a l o u s p o l i t i i k k o j a m m e + m a k r o t a l o u s p o l i t i i k k o j e n + m a k r o t a l o u s t o i m i a + m a k r o t a l o u t e e n + m a k r o t a l o u t t a + m a k r o t a s o a + m a k r o t a s o l l a + m a k r o t i l a s t o j a + m a k r o v a k a u s v a l v o n n a s s a + m a k r o v a l v o n n a s t a + m a k r o v a l v o n t a a + m a k r o v a l v o n t a e l i m e n + m a k r o v a l v o n t a e l i n + m a k r o v i r u k s i a + m a k r o v i r u s + m a k r o v u o r o p u h e l u u n + m a k s a a + m a k s a a k o + m a k s a a k s e e n + m a k s a e s s a a n + m a k s a i s i + m a k s a i s i v a t + m a k s a j a j ä s e n v a l t i o i d e n + m a k s a j a m a a t + m a k s a j a m a i d e n + m a k s a j a n + m a k s a j a t + m a k s a j a t i e t o i h i n + m a k s a j a v i r a s t o + m a k s a j a v i r a s t o i l l e + m a k s a j a v i r a s t o i n e e n + m a k s a j a v i r a s t o i s s a + m a k s a j a v i r a s t o j a + m a k s a j a v i r a s t o j e n + m a k s a j a v i r a s t o n + m a k s a j a v i r a s t o t + m a k s a j i a + m a k s a j i e n + m a k s a j i n a + m a k s a k a s v a i m i a + m a k s a k i r r o o s i + m a k s a l u o v u t u k s i a + m a k s a l ä i k k ä i s t ä + m a k s a m a a n + m a k s a m a d o t + m a k s a m a l l a + m a k s a m a s t a + m a k s a m a t t a + m a k s a m a t t o m a t + m a k s a m a t t o m i a + m a k s a m a t t o m i n a + m a k s a m i s e e n + m a k s a m i s e k s i + m a k s a m i s e n + m a k s a m i s m e n e t t e l y + m a k s a m i s m ä ä r ä y k s e n + m a k s a m i s m ä ä r ä y s + m a k s a m i s m ä ä r ä y s m e n e t t e l y + m a k s a m i s m ä ä r ä y s m e n e t t e l y n + m a k s a m i s m ä ä r ä y s m e n e t t e l y s t ä + m a k s a m i s m ä ä r ä y s m e n e t t e l y ä + m a k s a m i s t a + m a k s a m m e + m a k s a m m e k o + m a k s a n + m a k s a n e e t + m a k s a n s i i r t o + m a k s a n s i i r t o a + m a k s a s a i r a u k s i a + m a k s a s a i r a u k s i e n + m a k s a s y ö p ä + m a k s a s y ö p ä ä + m a k s a t a u t i e n + m a k s a t u k s e s t a + m a k s a t u l e h d u s + m a k s a t u s h a k e m u s t e n + m a k s a t u s p y y n t ö e n n u s t e e t + m a k s a t u s t a r p e i s t a + m a k s a t u s v a r o j a + m a k s a t u s v a r o j e n + m a k s a v a a + m a k s a v a t + m a k s a v a t k o + m a k s a v a u r i o i s t a + m a k s a v a u r i o i t a + m a k s a v i a + m a k s e t a + m a k s e t a a n + m a k s e t a a n k i n + m a k s e t t a i s i + m a k s e t t a v a a n + m a k s e t t a v a k s e e n + m a k s e t t a v a k s i + m a k s e t t a v a s t a + m a k s e t t a v a t + m a k s e t t a v i a + m a k s e t t a v i i n + m a k s e t t a v i k s i + m a k s e t t a v i s t a + m a k s e t t i i n + m a k s e t t u j a + m a k s e t t u j e n + m a k s e t t u n a + m a k s e t t u u n + m a k s e t u i s t a + m a k s e t u t + m a k s i m a a l i a j a t t e l u t a v a s t a + m a k s i m a a l i n e n + m a k s i m a a l i s e e n + m a k s i m a a l i s e s t i + m a k s i m a a l i s t a + m a k s i m i d i r e k t i i v i k s i + m a k s i m i d i r e k t i i v i n ä + m a k s i m i h i n t a + m a k s i m i k a p a s i t e e t t i i n + m a k s i m i k u l j e t u s a i k a + m a k s i m i l a i n o j e n + m a k s i m i m a k s u n + m a k s i m i m a k s u t + m a k s i m i m ä ä r i e n + m a k s i m i m ä ä r ä + m a k s i m i n o p e u s r a j o i t u k s e n + m a k s i m i o p p i l a s m ä ä r ä + m a k s i m i r a j a n + m a k s i m i s a k k o i h i n + m a k s i m i t e h o n s i i r t o l a u s e + m a k s i m i t u o t o s + m a k s i m i t u o t o s t a + m a k s i m i t u o t t o j e n + m a k s i m i t u o t t o o n + m a k s i m o i d a + m a k s i m o i d a k s e e n + m a k s i m o i d a k s e m m e + m a k s i m o i m i s e k s i + m a k s i m o i m m e + m a k s i m o i n t i i n + m a k s i m o i t a v a + m a k s o i + m a k s o i n + m a k s u a + m a k s u a i k a + m a k s u a i k a a + m a k s u a i k a d i r e k t i i v i n + m a k s u a i k o j a + m a k s u a i k o j e n + m a k s u a j a n + m a k s u a j a s t a + m a k s u a j a t + m a k s u a j o i s t a + m a k s u a l a n + m a k s u a l e n n u k s i a + m a k s u a l u e + m a k s u a l u e e k s i + m a k s u a l u e e n + m a k s u a l u e e s e e n + m a k s u a l u e e s t a + m a k s u a l u e t t a + m a k s u a s e m a n + m a k s u a s e t u k s e s s a + m a k s u a s i a m i e h i k s i + m a k s u a s i a m i e h i l l e + m a k s u a s i a m i e s j ä r j e s t e l m ä n + m a k s u a s t e + m a k s u a s t e i k o t + m a k s u a s t e i s s a + m a k s u a s t e t t a + m a k s u e h d o i s t a + m a k s u e h d o t + m a k s u e h t o i h i n + m a k s u e h t o j a + m a k s u e h t o j e n + m a k s u e l i m i ä + m a k s u e n n u s t e i s t a + m a k s u e r ä t + m a k s u e s t e i t ä + m a k s u e t u u k s i n + m a k s u h u o j e n n u k s i i n + m a k s u h y v i t y s t e n + m a k s u i h i n + m a k s u i l l a + m a k s u i l t a + m a k s u i s s a + m a k s u i s t a + m a k s u i s t a a n + m a k s u i s t a m m e + m a k s u j a + m a k s u j a k i n + m a k s u j e n + m a k s u j ä r j e s t e l m i e n + m a k s u j ä r j e s t e l m i i n + m a k s u j ä r j e s t e l m i l l e + m a k s u j ä r j e s t e l m i s s ä + m a k s u j ä r j e s t e l m i s s ä ä n + m a k s u j ä r j e s t e l m i s t ä + m a k s u j ä r j e s t e l m i ä + m a k s u j ä r j e s t e l m i ä ä n + m a k s u j ä r j e s t e l m ä + m a k s u j ä r j e s t e l m ä l l e + m a k s u j ä r j e s t e l m ä n + m a k s u j ä r j e s t e l m ä n k i n + m a k s u j ä r j e s t e l m ä p o l i t i i k k a a + m a k s u j ä r j e s t e l m ä s s ä + m a k s u j ä r j e s t e l m ä s t ä + m a k s u j ä r j e s t e l m ä t + m a k s u j ä r j e s t e l m ä ä + m a k s u j ä r j e s t e l m ä ä n + m a k s u j ä r j e s t e l y i t ä + m a k s u j ä r j e s t e l y j e n + m a k s u j ä r j e s t e l y j ä + m a k s u k a n a v a n + m a k s u k a t o s t a + m a k s u k a u d e n + m a k s u k a u s i e n + m a k s u k e i n o j a + m a k s u k e t j u n + m a k s u k e t j u s t a + m a k s u k i i s t a a + m a k s u k o r t e i l l a + m a k s u k o r t e i s s a + m a k s u k o r t i n + m a k s u k o r t t e j a + m a k s u k o r t t i + m a k s u k o r t t i a + m a k s u k o r t t i a l a l l a + m a k s u k o r t t i e n + m a k s u k o r t t i j ä r j e s t e l m i ä + m a k s u k o r t t i j ä r j e s t e l m ä t + m a k s u k o r t t i m a k s u j e n + m a k s u k o r t t i p e t o k s i a + m a k s u k o r t t i r i k o l l i s u u s + m a k s u k o r t t i r i k o l l i s u u t t a + m a k s u k o r t t i t o i m i a l a n + m a k s u k o r t t i t o i m i n n a n + m a k s u k r i i s i + m a k s u k u l t t u u r i + m a k s u k u r i a a n + m a k s u k y k y + m a k s u k y k y i s e m p i ä + m a k s u k y k y y n + m a k s u k y k y y n s ä + m a k s u k y k y ä + m a k s u k y s y m y k s i ä + m a k s u k y s y m y s + m a k s u k y v y n + m a k s u k y v y s t ä + m a k s u k y v y t t ö m y y s + m a k s u k y v y t t ö m y y s a s e t u k s e e n + m a k s u k y v y t t ö m y y s a s e t u k s e n + m a k s u k y v y t t ö m y y s d i r e k t i i v i + m a k s u k y v y t t ö m y y s d i r e k t i i v i n + m a k s u k y v y t t ö m y y s d i r e k t i i v i ä + m a k s u k y v y t t ö m y y s k r i i s i i n + m a k s u k y v y t t ö m y y s l a i n s ä ä d ä n t ö + m a k s u k y v y t t ö m y y s l a i n s ä ä d ä n t ö ä + m a k s u k y v y t t ö m y y s l a i n s ä ä d ä n t ö ä ä n + m a k s u k y v y t t ö m y y s l a k i e n + m a k s u k y v y t t ö m y y s m e n e t t e l y + m a k s u k y v y t t ö m y y s m e n e t t e l y i h i n + m a k s u k y v y t t ö m y y s m e n e t t e l y i s t ä + m a k s u k y v y t t ö m y y s m e n e t t e l y i t ä + m a k s u k y v y t t ö m y y s m e n e t t e l y j ä + m a k s u k y v y t t ö m y y s m e n e t t e l y s t ä + m a k s u k y v y t t ö m y y s m e n e t t e l y t + m a k s u k y v y t t ö m y y s m e n e t t e l y ä + m a k s u k y v y t t ö m y y s o i k e u s t a p a u k s i s t a + m a k s u k y v y t t ö m y y s r e k i s t e r e i t ä + m a k s u k y v y t t ö m y y s r e k i s t e r i t + m a k s u k y v y t t ö m y y s r i s k i + m a k s u k y v y t t ö m y y s t a p a u k s i a + m a k s u k y v y t t ö m y y s t a p a u k s i i n + m a k s u k y v y t t ö m y y s t i l a n t e i s i i n + m a k s u k y v y t t ö m y y s t i l a n t e i s s a + m a k s u k y v y t ö n + m a k s u k ä y t t ä y t y m i s t ä + m a k s u k ä y t ä n n ö t + m a k s u k ä y t ä n t ö + m a k s u k ä y t ä n t ö j e n + m a k s u k ä y t ä n t ö j ä + m a k s u l a i m i n l y ö n t i e n + m a k s u l a i t o s t e n + m a k s u l a i t t e e t + m a k s u l i i k e n n e + m a k s u l i i k e n n e t t ä + m a k s u l i i k e n t e e n + m a k s u l i i k e n t e e s s ä + m a k s u l l a + m a k s u l l i s i s t a + m a k s u l l i s t e n + m a k s u l u o t o t + m a k s u l ä h t e i t ä + m a k s u m a h d o l l i s u u k s i a + m a k s u m a l l i + m a k s u m a l l i e n + m a k s u m a l l i i n + m a k s u m a l l i n + m a k s u m a r k k i n a t + m a k s u m a r k k i n o i d e n + m a k s u m e n e t e l m i i n + m a k s u m e n e t e l m i ä + m a k s u m e n e t t e l y j e n + m a k s u m e n e t t e l y j ä + m a k s u m e n e t t e l y n s ä + m a k s u m e n e t t e l y s t ä + m a k s u m e n e t t e l y t + m a k s u m i e h e k s i + m a k s u m i e h i k s i + m a k s u m o r a a l i i n + m a k s u m ä ä r i e n + m a k s u m ä ä r ä a i k o i h i n + m a k s u m ä ä r ä a i k o j a + m a k s u m ä ä r ä r a h a + m a k s u m ä ä r ä r a h a e n n u s t e i s s a + m a k s u m ä ä r ä r a h a l i s ä y s + m a k s u m ä ä r ä r a h a l u v u n + m a k s u m ä ä r ä r a h a s u m m a n + m a k s u m ä ä r ä r a h a t + m a k s u m ä ä r ä r a h a v a j e e t + m a k s u m ä ä r ä r a h o i h i n + m a k s u m ä ä r ä r a h o i k s i + m a k s u m ä ä r ä r a h o i l l a + m a k s u m ä ä r ä r a h o i l l e + m a k s u m ä ä r ä r a h o i n a + m a k s u m ä ä r ä r a h o i n e e n + m a k s u m ä ä r ä r a h o i s s a + m a k s u m ä ä r ä r a h o i s t a + m a k s u m ä ä r ä r a h o j a + m a k s u m ä ä r ä r a h o j a a n + m a k s u m ä ä r ä r a h o j e n + m a k s u m ä ä r ä y k s e n + m a k s u m ä ä r ä y k s e t + m a k s u m ä ä r ä y k s i e n + m a k s u m ä ä r ä y k s i l l e + m a k s u m ä ä r ä y k s i ä + m a k s u m ä ä r ä y s + m a k s u m ä ä r ä y s m e n e t t e l y ä + m a k s u m ä ä r ä y s t e n + m a k s u m ä ä r ä y s t ä + m a k s u n + m a k s u n e u v o s t o + m a k s u n e u v o s t o n + m a k s u n k e r u u j ä r j e s t e l m ä t + m a k s u n l y k k ä y s t i l e i l l ä ä n + m a k s u n s a + m a k s u n v ä l i t y s t i e t o j a + m a k s u o h j e l m i s t a + m a k s u o n g e l m i a + m a k s u o n g e l m i i n + m a k s u o s o i t u k s e t + m a k s u o s u u d e n + m a k s u o s u u d e t + m a k s u o s u u k s i a + m a k s u o s u u k s i e n + m a k s u o s u u k s i i n + m a k s u o s u u k s i l l a + m a k s u o s u u k s i s t a + m a k s u o s u u s + m a k s u o s u u s a l e n n u k s e n + m a k s u o s u u s m a h d o l l i s u u d e t + m a k s u o s u u t t a + m a k s u p a k e t t i + m a k s u p a l v e l u a l a + m a k s u p a l v e l u d i r e k t i i v i + m a k s u p a l v e l u d i r e k t i i v i n + m a k s u p a l v e l u d i r e k t i i v i s t ä + m a k s u p a l v e l u i l l e + m a k s u p a l v e l u i t a + m a k s u p a l v e l u j a + m a k s u p a l v e l u j e n + m a k s u p a l v e l u l a i t o k s e t + m a k s u p a l v e l u m a r k k i n a t + m a k s u p a l v e l u m a r k k i n o i l l a + m a k s u p a l v e l u m a r k k i n o i t a + m a k s u p a l v e l u n + m a k s u p a l v e l u n t a r j o a j i e n + m a k s u p a l v e l u t + m a k s u p a r a m e t r e j a + m a k s u p e t o k s i a + m a k s u p i s t e i s s ä + m a k s u p o l i t i i k a l l a + m a k s u p o l i t i i k a s t a + m a k s u p r o s e s s i a + m a k s u p y y n n ö i s s ä + m a k s u p y y n n ö t + m a k s u p y y n t ö j ä + m a k s u p y y n t ö ä + m a k s u p ä i v ä n + m a k s u p ä ä t e + m a k s u p ä ä t ö s t ä + m a k s u r a k e n n e t t a + m a k s u r a k e n t e e s t a + m a k s u r a k e n t e i s s a + m a k s u r a n g a i s t u k s e t + m a k s u r a s i t u s + m a k s u r ä s t i e n + m a k s u r ä s t i t + m a k s u s e k k e i h i n + m a k s u s i t o u m u k s e t + m a k s u s i t o u m u k s i a + m a k s u s i t o u m u k s i i n + m a k s u s i t o u m u k s i s t a + m a k s u s i t o u m u s m ä ä r ä r a h a e s i t y s t ä + m a k s u s i t o u m u s m ä ä r ä r a h a s t a + m a k s u s i t o u m u s m ä ä r ä r a h a t + m a k s u s i t o u m u s m ä ä r ä r a h o i h i n + m a k s u s i t o u m u s m ä ä r ä r a h o i k s i + m a k s u s i t o u m u s m ä ä r ä r a h o i l l e + m a k s u s i t o u m u s m ä ä r ä r a h o i n a + m a k s u s i t o u m u s m ä ä r ä r a h o i s s a + m a k s u s i t o u m u s m ä ä r ä r a h o i s t a + m a k s u s i t o u m u s m ä ä r ä r a h o j a + m a k s u s i t o u m u s m ä ä r ä r a h o j e n + m a k s u s i t o u m u s t e n + m a k s u s t a + m a k s u s t r a t e g i a n + m a k s u s u l u n + m a k s u s u o r i t u k s i a + m a k s u s u o r i t u k s i k s i + m a k s u s u o r i t u s m ä ä r ä y s t ä + m a k s u s u o r i t u s t e n + m a k s u s ä ä n n ö t + m a k s u s ä ä n t ö j e n + m a k s u t + m a k s u t a a k a s t a + m a k s u t a a k k a a + m a k s u t a h t i + m a k s u t a h t i a + m a k s u t a p a + m a k s u t a p a a + m a k s u t a p a h t u m a a + m a k s u t a p a h t u m a j ä r j e s t e l m ä ä n + m a k s u t a p a h t u m a t + m a k s u t a p a h t u m a t i e d o t + m a k s u t a p a h t u m i a + m a k s u t a p a h t u m i e n + m a k s u t a p a h t u m i i n + m a k s u t a p o i h i n + m a k s u t a p o j a + m a k s u t a p o j e n + m a k s u t a r p e i s t a + m a k s u t a s a p a i n o n + m a k s u t a s e + m a k s u t a s e e n + m a k s u t a s e e n s a + m a k s u t a s e e s e e n + m a k s u t a s e e s s a + m a k s u t a s e e s t a + m a k s u t a s e i d e n + m a k s u t a s e i d e n s a + m a k s u t a s e i l l e + m a k s u t a s e i s i i n + m a k s u t a s e i t a + m a k s u t a s e j ä r j e s t e l m i ä + m a k s u t a s e j ä r j e s t e l y + m a k s u t a s e j ä r j e s t e l y n + m a k s u t a s e j ä r j e s t e l y y n + m a k s u t a s e j ä r j e s t e l y ä + m a k s u t a s e k r i i s e j ä + m a k s u t a s e k r i i s i s t ä ä n + m a k s u t a s e l a i n a a + m a k s u t a s e m e k a n i s m i a + m a k s u t a s e o n g e l m a + m a k s u t a s e o n g e l m i a + m a k s u t a s e o n g e l m i e n + m a k s u t a s e t i e t o j e n + m a k s u t a s e t i l a s t o i s t a + m a k s u t a s e t t a + m a k s u t a s e t t a a n + m a k s u t a s e t t a m m e + m a k s u t a s e t u e n + m a k s u t a s e t u k e a + m a k s u t a s e t u k e e n + m a k s u t a s e t u k i + m a k s u t a s e t u k i j ä r j e s t e l m ä + m a k s u t a s e t u k i o h j e l m i s s a + m a k s u t a s e v a a t i m u k s e t + m a k s u t a s e v a i k e u k s i a + m a k s u t a s e v a j e + m a k s u t a s e v a j e e n + m a k s u t a s e v ä l i n e + m a k s u t a s o + m a k s u t a s o a + m a k s u t a s o j a + m a k s u t a s o n + m a k s u t a s o o n + m a k s u t a v o i s t a + m a k s u t a v o i t t e i t a + m a k s u t e l e v i s i o + m a k s u t i h e y t t ä + m a k s u t o n t a + m a k s u t t a + m a k s u t t o m a l l a + m a k s u t t o m a n + m a k s u t t o m a t + m a k s u t t o m i a + m a k s u t t o m i s t a + m a k s u t t o m u u d e n + m a k s u t t o m u u d e s t a + m a k s u t u k e a + m a k s u v a a t i m u k s e k s i + m a k s u v a a t i m u k s i a + m a k s u v a a t i m u s + m a k s u v a a t i m u s t e n + m a k s u v a i k e u k s i a + m a k s u v a i k e u k s i i n + m a k s u v a i k e u k s i s t a + m a k s u v a k a u s + m a k s u v a l m i u d e n + m a k s u v a l m i u d e t + m a k s u v a l m i u s + m a k s u v a l m i u s j ä r j e s t e l m i ä + m a k s u v a l m i u s j ä r j e s t e l y t + m a k s u v a l m i u s k r i i s i + m a k s u v a l m i u s k r i i s i l l e + m a k s u v a l m i u s k r i i s i n + m a k s u v a l m i u s o n g e l m a t + m a k s u v a l m i u s o n g e l m i a + m a k s u v a l m i u s o n g e l m i e n + m a k s u v a l m i u s o n g e l m i i n + m a k s u v a l m i u s o n g e l m i l t a + m a k s u v a l m i u s o n g e l m i s t a + m a k s u v a l m i u s r i s k i n + m a k s u v a l m i u s s u h d e + m a k s u v a l m i u s t a r p e i s i i n + m a k s u v a l m i u s t a s o + m a k s u v a l m i u s t a s o a + m a k s u v a l m i u s t a s o t + m a k s u v a l m i u s t u k i + m a k s u v a l m i u s v a a t i m u s t a + m a k s u v a l m i u s v a i k e u k s i s t a + m a k s u v a l m i u s v a j e + m a k s u v a l m i u t t a + m a k s u v a l m i u t t a a n + m a k s u v a l u u t t a n a + m a k s u v a p a u d e n + m a k s u v a u h t i m m e + m a k s u v e l v o i t t e e s e e n + m a k s u v e l v o i t t e i t a a n + m a k s u v e l v o l l i s u u d e s t a a n + m a k s u v e l v o l l i s u u k s i a a n + m a k s u v e l v o l l i s u u k s i e n + m a k s u v e l v o l l i s u u k s i i n + m a k s u v e l v o l l i s u u t e n s a + m a k s u v e l v o l l i s u u t t a + m a k s u v i i v e i d e n + m a k s u v i i v e o n g e l m a + m a k s u v i i v ä s t y k s e e n + m a k s u v i i v ä s t y k s e n + m a k s u v i i v ä s t y k s e s t ä + m a k s u v i i v ä s t y k s e t + m a k s u v i i v ä s t y k s i e n + m a k s u v i i v ä s t y k s i i n + m a k s u v i i v ä s t y k s i l t ä + m a k s u v i i v ä s t y k s i s t ä + m a k s u v i i v ä s t y k s i ä + m a k s u v i i v ä s t y s + m a k s u v i i v ä s t y s d i r e k t i i v i + m a k s u v i i v ä s t y s d i r e k t i i v i n + m a k s u v i i v ä s t y s d i r e k t i i v i s t ä + m a k s u v i i v ä s t y s d i r e k t i i v i ä + m a k s u v i i v ä s t y s m a k s u i s t a + m a k s u v i i v ä s t y s o n g e l m a a + m a k s u v i i v ä s t y s o n g e l m a n + m a k s u v i i v ä s t y s t a p a u k s i s s a + m a k s u v i i v ä s t y s t a p a u s + m a k s u v i i v ä s t y s t e n + m a k s u v i i v ä s t y s t ä + m a k s u v i r a n o m a i s e t + m a k s u v i r a n o m a i s t e n + m a k s u v i r t o j a + m a k s u v ä l i n e + m a k s u v ä l i n e e k s e e n + m a k s u v ä l i n e e n + m a k s u v ä l i n e e n ä + m a k s u v ä l i n e e t + m a k s u v ä l i n e i d e n + m a k s u v ä l i n e i s i i n + m a k s u v ä l i n e i s t ä + m a k s u v ä l i n e i t ä + m a k s u v ä l i n e t t ä + m a k s u v ä l i t y s t i e d o t + m a k s u y m p ä r i s t ö + m a k u a + m a k u a i s t i m u k s i s t a + m a k u a s i a + m a k u a s i o i h i n + m a k u a s i o i s t a + m a k u h e r m o j a + m a k u i s i a + m a k u m i e l t y m y s t e n + m a k u n y s t y r ä n s ä + m a k u u a l u s t a + m a k u u h a a v a + m a k u u h u o n e e s s a a n + m a k u u h u o n e p o l i i s i s t a + m a k u u n i + m a k u u p u s s i + m a k u u v a u n u + m a k u u v a u n u s s a + m a l a g a s s i t + m a l a i j i k a r h u + m a l a i j i n k o n n a m o n n i + m a l a i j i t + m a l a k i i t t i h a r a k k a + m a l a k i i t t i v i h r e ä + m a l a r i a k u o l e m i s t a + m a l a r i a l ä ä k k e i d e n + m a l a r i a l ä ä k k e i t ä + m a l a r i a n + m a l a r i a p o t i l a s + m a l a r i a p ä i v ä + m a l a r i a p ä i v ä n ä + m a l a r i a p ä i v ä ä + m a l a r i a r o k o t e + m a l a r i a r o k o t e t t a + m a l a r i a r o k o t t e e n + m a l a r i a r o k o t t e e t + m a l a r i a t a p a u k s e t + m a l i n + m a l i n r u u s u p e i p p o + m a l j a a n s a + m a l j a k k o j e n + m a l j a n + m a l k a k a t t o + m a l l a s a l a a n + m a l l a s v i s k i + m a l l a s v i s k i l l ä + m a l l a s v i s k i n + m a l l a s v i s k i ä + m a l l e i l l e + m a l l e i s s a + m a l l e i s t a + m a l l e j a + m a l l i a + m a l l i a l u e e l l a + m a l l i a m m e + m a l l i a r v i o n + m a l l i d e m o k r a a t t i n a + m a l l i d e m o k r a t i a n + m a l l i e h d o k a s m a a n + m a l l i e n + m a l l i e s i m e r k i s t ä + m a l l i e s i m e r k k e j ä + m a l l i e s i m e r k k i + m a l l i e s i m e r k k i n ä + m a l l i e u r o o p p a l a i s e n + m a l l i h a n k e t t a + m a l l i h a n k k e i d e n + m a l l i h a n k k e i t a + m a l l i i n + m a l l i j u l k i l a u s u m a + m a l l i j ä r j e s t e l m ä + m a l l i k a p p a l e e s s a + m a l l i k e l p o i n e n + m a l l i k e l p o i s t a + m a l l i k s i + m a l l i l a i k s i + m a l l i l a i n s ä ä d ä n t ö ä + m a l l i l a k i a + m a l l i l a p s i + m a l l i l a u s e k k e e l l e + m a l l i l e n n o k k i + m a l l i l l a + m a l l i l l a n i + m a l l i l u o n n o k s i i n + m a l l i m a a + m a l l i m a a n + m a l l i m u s l i m i v a l t i o n a + m a l l i n + m a l l i n a + m a l l i n m u u t o s + m a l l i o i k e u d e t + m a l l i o i k e u k s i e n + m a l l i o l o s u h t e i s s a + m a l l i o p p i l a i l l e + m a l l i o p p i l a i t a + m a l l i o p p i l a s + m a l l i o r i + m a l l i o r i a + m a l l i o r i n + m a l l i o s a l l i s t u j a + m a l l i p o h j a i s t a + m a l l i p o l i t i i k k a a + m a l l i p r o j e k t i + m a l l i p r o j e k t i e n + m a l l i p y s ä k ö i n t i l u p a + m a l l i p y s ä k ö i n t i l u p a a n s a + m a l l i p ä ä t ö k s e n + m a l l i p ä ä t ö s + m a l l i r a j a h a n k k e i d e n + m a l l i r a t k a i s u i s s a m m e + m a l l i r o k o t t e i t a + m a l l i s e l v i t y s t ä + m a l l i s o p i m u k s e k s i + m a l l i s o p i m u k s e n + m a l l i s o p i m u k s i a + m a l l i s o p i m u s + m a l l i s o p i m u s t e n + m a l l i s o t i l a s + m a l l i s s a + m a l l i s t a + m a l l i s u o j a + m a l l i s u o j a d i r e k t i i v i l l ä + m a l l i s u o j a d i r e k t i i v i n + m a l l i s u o j a d i r e k t i i v i s s ä + m a l l i s u o j a d i r e k t i i v i ä + m a l l i s u o j a l a k i n s a + m a l l i s u o j a l l e + m a l l i s u o j a o n g e l m a + m a l l i s u o j a u k s e s s a + m a l l i s u o j i a + m a l l i s u u n n i t e l m a a n + m a l l i s ä ä n n ö t + m a l l i t + m a l l i t a p a u s t e n + m a l l i t e o r i a + m a l l i t i l o j a + m a l l i v a l t i o + m a l l i v a l t i o k s i + m a l l i v a n k i + m a l l i v a n k i n a + m a l l i v e r o s o p i m u k s e s s a + m a l l i v o i m a l a a + m a l m i n k ä s i t t e l y y n + m a l m i r i k k a u d e t + m a l m i r i k k a u k s i a + m a l m i v a r o j a + m a l t a a + m a l t a a n + m a l t a l a i s e t + m a l t a l a i s i a + m a l t a l a i s j ä s e n e t + m a l t a l a i s m i n i s t e r i l l e + m a l t a l a i s t e n + m a l t a l a i s t o i m i t t a j i l l e + m a l t a l l a + m a l t a l l e + m a l t a n + m a l t a s t a + m a l t i l l i s e m m a k s i + m a l t i l l i s e m m a n + m a l t i l l i s e m m i n + m a l t i l l i s e m p a a + m a l t i l l i s e m p a a n + m a l t i l l i s e m p i + m a l t i l l i s e m p i a + m a l t i l l i s e n + m a l t i l l i s e n a + m a l t i l l i s e s s a + m a l t i l l i s e t + m a l t i l l i s i a + m a l t i l l i s i m m a t + m a l t i l l i s i n + m a l t i l l i s t a + m a l t i l l i s t e n + m a l t i l l i s u u d e l l a + m a l t i l l i s u u d e n + m a l t i l l i s u u t t a + m a l t t a a + m a l t t a k a a + m a l t t a m a t t o m a n a + m a l t t a m a t t o m i n a + m a l t t i a + m a l t t i m m e + m a l v a k i e r t o + m a m e l u k k i a j a l t a + m a m m a n + m a m m o g r a f i a s e u l o n n a l l a + m a m m o g r a f i a s e u l o n n a n + m a m m o g r a f i a s e u l o n n a t + m a m m o g r a f i a s e u l o n t a + m a m m o g r a f i a s e u l o n t a a + m a m m o g r a f i a s e u l o n t a a n k i n + m a m m o g r a f i a s e u l o n t a k u v a a + m a m m o g r a f i a s e u l o n t a o h j e l m a + m a m m o g r a f i a s e u l o n t a o h j e l m a n + m a m m o g r a f i a s e u l o n t a o h j e l m a t + m a m m o g r a f i a s e u l o n t o i h i n + m a m m o g r a f i a s e u l o n t o j a + m a m m o g r a f i a s e u l o n t o j e n + m a m m o g r a f i a t a r k a s t u k s i a + m a m m u t t i k e s k u s t e n + m a m m u t t i m i t t a k a a v a n + m a m m u t t i p e t ä j ä + m a n c h e s t e r i n t e r r i e r i + m a n d a a t i s t a + m a n d a a t t i a + m a n d a r i i n i e n + m a n d a r i i n i k i i n a + m a n d a r i i n i k i i n a a + m a n d a r i i n i k i i n a s t a + m a n d a r i i n i s o r s a + m a n d a r i i n i t r o g o n i + m a n d a r i n i a + m a n g a a n i d i o k s i d i + m a n g a a n i k a r b o n a a t t i + m a n g a a n i k l o r i d i + m a n g a a n i s u l f a a t t i + m a n g a k a h v i l a + m a n g o p u i h i n + m a n g r o v e h a r a k k a + m a n g r o v e h a u k k a + m a n g r o v e h o h t o k o l i b r i + m a n g r o v e k ä ä r m e + m a n g r o v e l a u l u m e s i k k o + m a n g r o v e m e s i k k o + m a n g r o v e m e t s i e n + m a n g r o v e m e t s ä t + m a n g r o v e m o n a r k k i + m a n g r o v e p a l l o k a l a + m a n g r o v e s i r k k u + m a n g r o v e v a r p u s h a u k k a + m a n i k e a l a i s e n + m a n i p u l a a t i o h o i d o l l a + m a n i p u l a a t i o h o i t o + m a n i p u l a a t i o t + m a n i p u l o i m a a n + m a n i p u l o i m i s e s t a + m a n i p u l o i n n i n + m a n i p u l o i n t i a + m a n i p u l o i n t i i n + m a n i p u l o i n t i t a r k o i t u k s i i n + m a n k s i t + m a n n a p u u r o + m a n n a s a a r n i + m a n n e r a l u e e l l e + m a n n e r a l u e e t + m a n n e r a l u e i d e n + m a n n e r a l u e i l l a k i n + m a n n e r a l u e i s i i n + m a n n e r a l u e i t a + m a n n e r e u r o o p p a l a i s e l l e + m a n n e r e u r o o p p a l a i s e n + m a n n e r e u r o o p p a l a i s t e n + m a n n e r i l m a s t o + m a n n e r j a l u s t a + m a n n e r j a l u s t a a + m a n n e r j a l u s t a l l a + m a n n e r j a l u s t a l t a + m a n n e r j a l u s t a n + m a n n e r j a l u s t a s t a + m a n n e r j ä ä t i k k ö + m a n n e r l a a t t a a + m a n n e r l i i k u n n o t + m a n n e r m a a k o n g r e s s i + m a n n e r m a i s e l l a + m a n n e r m a r k k i n a t + m a n n e r n a a p u r e i s s a + m a n n e r t a l o u k s i l l e + m a n n e r t a l o u s + m a n n e r u n i o n i i n + m a n n e r y r i t y s t e n + m a n s i a + m a n s i k a n v i l j e l i j ä t + m a n s i k k a k a k k u u n + m a n s i k k a k i e l i + m a n s i k k a k i r j o s i i p i + m a n s i k k a l a j i k k e e t + m a n s i k k a m a r k k i n o i l l a + m a n s i k k a m e h u + m a n s i k k a p a i k k a + m a n s i k k a p i i r a k k a + m a n s i k k a r e k k o j a + m a n s i k k a s a m m a k k o + m a n s i k o i t a + m a n s i t + m a n t e l i h a p e r o + m a n t e l i h a p p o + m a n t e l i p i l v i + m a n t e l i p u i l l a + m a n t e l i p u u t a + m a n t e r e e l l a + m a n t e r e e l l a m m e + m a n t e r e e l l e + m a n t e r e e l l e m m e + m a n t e r e e m m e + m a n t e r e e n + m a n t e r e e n l a a j u i s e e n + m a n t e r e e n l a a j u i s i a + m a n t e r e e s e e m m e + m a n t e r e i d e n + m a n t e r e i l l a + m a n t e r e i s i i n + m a n t r a n + m a n t r a p o l i t i i k k a a + m a n t r o j a + m a n t t e l i s o l u l y m f o o m a + m a n t u k i m a l a i n e n + m a n t š u t + m a n u a a l i v a i h t e i s t o + m a n ö ö v e r i t i l a a + m a o l a i s k a p i n a l l i s e t + m a o l a i s k a p i n a l l i s i a + m a o l a i s k a p i n a l l i s t e n + m a o l a i s o n g e l m a a n + m a o l a i s s i s s i e n + m a o l a i s t e n + m a o r i m e r i m e t s o + m a o r i s o d a t + m a r a d i + m a r a t + m a r a t i n v i n t t i k o i r a + m a r a t o n i s t u n n o n + m a r a t o n i s t u n n o s s a + m a r a t o n k e s k u s t e l u a + m a r a t o n k e s k u s t e l u m m e + m a r a t o n k e s k u s t e l u u n + m a r a t o n m i e t i n t ö + m a r a t o n n e u v o t t e l u i h i n + m a r g a r i i n i h a p p o + m a r g i n a a l e i s s a m m e + m a r g i n a a l i a + m a r g i n a a l i k u s t a n n u k s e t + m a r g i n a a l i l l a + m a r g i n a a l i o n g e l m i s t a + m a r g i n a a l i p o l i t i i k k a a + m a r g i n a a l i r y h m i i n + m a r g i n a a l i r y h m i ä + m a r g i n a a l i r y h m ä + m a r g i n a a l i s e m p a a + m a r g i n a a l i s e s t a + m a r g i n a a l i s t a + m a r g i n a a l i v e r o + m a r h e t + m a r i a + m a r i a n n e + m a r i h u a n a a + m a r i k a n s a + m a r i k o + m a r i l a i n e n + m a r i n + m a r i n k i e l i n e n + m a r i n k i e l i s t ä + m a r i o n e t t e j a + m a r i o n e t t i h a l l i t u k s e n + m a r i t + m a r i v ä h e m m i s t ö n + m a r j a a + m a r j a l u d e + m a r j a m a r k k i n o i d e n + m a r j a m a r k k i n o i h i n + m a r j a m a r k k i n o i t a + m a r j a n k a s v a t t a j i e n + m a r j a n p o i m u r i + m a r j a n t u o t t a j i a + m a r j a n t u o t t a j i e n + m a r j a n t u o t t a j i l l e + m a r j a n v i l j e l i j ä t + m a r j a s a v i k k a + m a r j a t + m a r j a t u o m i p i h l a j a + m a r j o i s t a + m a r j o j a + m a r j o j e n + m a r j o j e n k a s v a t t a j i e n + m a r k a n + m a r k a t + m a r k k a a + m a r k k a a n + m a r k k e r i a v u s t e i n e n + m a r k k e r i g e e n e i h i n + m a r k k e r i g e e n i n + m a r k k e r i m u o t o j a + m a r k k e r i r o k o t e + m a r k k e r i r o k o t t e i d e n + m a r k k i n a b y r o k r a t i a n + m a r k k i n a d i r e k t i i v i + m a r k k i n a d y n a m i i k a n + m a r k k i n a d y n a m i i k k a a + m a r k k i n a d y n a m i i k k a a n + m a r k k i n a e d e l l y t y k s e t + m a r k k i n a e d e l l y t y k s i i n + m a r k k i n a e d e l l y t y k s i s t ä + m a r k k i n a e d e l l y t y k s i ä + m a r k k i n a e d e l l y t y s t e n + m a r k k i n a e d u n + m a r k k i n a e h d o i l l a + m a r k k i n a e h d o i n + m a r k k i n a e h d o t + m a r k k i n a e h t o i h i n + m a r k k i n a e h t o i s e n + m a r k k i n a e h t o i s e t + m a r k k i n a e h t o i s i s t a + m a r k k i n a e h t o j a + m a r k k i n a e h t o j e n + m a r k k i n a e n n u s t e i d e n + m a r k k i n a e n n u s t e i s i i n + m a r k k i n a e n n u s t e i t a + m a r k k i n a e s t e e t + m a r k k i n a e s t e i d e n + m a r k k i n a e s t e i s t ä + m a r k k i n a e s t e i t ä + m a r k k i n a e t u a + m a r k k i n a e t u j e n + m a r k k i n a f a n a a t i k k o j a + m a r k k i n a f i l o s o f i a + m a r k k i n a f i l o s o f i a a + m a r k k i n a f u n d a m e n t a l i s m i + m a r k k i n a f u n d a m e n t a l i s m i i n + m a r k k i n a f u n d a m e n t a l i s m i n n e + m a r k k i n a f u n d a m e n t a l i s t e j a + m a r k k i n a f u n d a m e n t a l i s t i e n + m a r k k i n a h a l l i n n o n + m a r k k i n a h e i l a h t e l u j a + m a r k k i n a h e n k e ä + m a r k k i n a h e n k i s e m p ä ä n + m a r k k i n a h e n k i s y y d e n + m a r k k i n a h e n k i s y y t e e n + m a r k k i n a h e n k i s y y t t ä + m a r k k i n a h i n n a l l a + m a r k k i n a h i n n a l t a a n + m a r k k i n a h i n n a n + m a r k k i n a h i n n a s s a + m a r k k i n a h i n n a s t a + m a r k k i n a h i n n a t + m a r k k i n a h i n n o i l l a + m a r k k i n a h i n n o i n + m a r k k i n a h i n n o i s s a + m a r k k i n a h i n n o i s t a + m a r k k i n a h i n t a + m a r k k i n a h i n t a a + m a r k k i n a h i n t a a n + m a r k k i n a h i n t a i n e n + m a r k k i n a h i n t a i s e n + m a r k k i n a h i n t a i s e t + m a r k k i n a h i n t a t u e s t a + m a r k k i n a h i n t o i h i m m e + m a r k k i n a h i n t o i h i n + m a r k k i n a h i n t o j a + m a r k k i n a h i n t o j e n + m a r k k i n a h y ö d y k k e e n ä + m a r k k i n a h ä i r i ö + m a r k k i n a h ä i r i ö i d e n + m a r k k i n a h ä i r i ö i h i n + m a r k k i n a h ä i r i ö i l l e + m a r k k i n a h ä i r i ö i t ä + m a r k k i n a h ä i r i ö t + m a r k k i n a i d e o l o g i a a n + m a r k k i n a i d e o l o g i a s t a + m a r k k i n a i n d i k a a t t o r i + m a r k k i n a i n f r a s t r u k t u u r i a + m a r k k i n a i n s t r u m e n t t e j a + m a r k k i n a i n t e r v e n t i o i d e n + m a r k k i n a i n t e r v e n t i o i h i n + m a r k k i n a i n t e r v e n t i o i l l a + m a r k k i n a i n t e r v e n t i o i n + m a r k k i n a i n t e r v e n t i o m e k a n i s m i t + m a r k k i n a i n t e r v e n t i o n + m a r k k i n a i n t e r v e n t i o t + m a r k k i n a i n t r e s s i e n + m a r k k i n a j o h t a j a + m a r k k i n a j o h t a j a a + m a r k k i n a j o h t a j a t + m a r k k i n a j o h t a j i a + m a r k k i n a j o h t a j i n a + m a r k k i n a j o h t o i n e n + m a r k k i n a j o h t o i s e n + m a r k k i n a j u m a l a + m a r k k i n a j ä r j e s t e l m i e n + m a r k k i n a j ä r j e s t e l m i i m m e + m a r k k i n a j ä r j e s t e l m ä + m a r k k i n a j ä r j e s t e l m ä n + m a r k k i n a j ä r j e s t e l m ä s s ä + m a r k k i n a j ä r j e s t e l m ä s t ä + m a r k k i n a j ä r j e s t e l m ä ä + m a r k k i n a j ä r j e s t e l m ä ä m m e + m a r k k i n a j ä r j e s t e l m ä ä n + m a r k k i n a j ä r j e s t e l y + m a r k k i n a j ä r j e s t e l y i h i n + m a r k k i n a j ä r j e s t e l y i s s ä + m a r k k i n a j ä r j e s t e l y i s t ä + m a r k k i n a j ä r j e s t e l y i t ä + m a r k k i n a j ä r j e s t e l y j e n + m a r k k i n a j ä r j e s t e l y j ä + m a r k k i n a j ä r j e s t e l y l l e + m a r k k i n a j ä r j e s t e l y l l ä + m a r k k i n a j ä r j e s t e l y m m e + m a r k k i n a j ä r j e s t e l y n + m a r k k i n a j ä r j e s t e l y s s ä + m a r k k i n a j ä r j e s t e l y s t ä + m a r k k i n a j ä r j e s t e l y s t ä m m e + m a r k k i n a j ä r j e s t e l y t + m a r k k i n a j ä r j e s t e l y t a p o j a + m a r k k i n a j ä r j e s t e l y t o i m i e n + m a r k k i n a j ä r j e s t e l y y n + m a r k k i n a j ä r j e s t e l y ä + m a r k k i n a j ä r j e s t y s + m a r k k i n a j ä r j e s t y s t ä + m a r k k i n a j ä r j e s t ö + m a r k k i n a j ä r j e s t ö j ä + m a r k k i n a j ä r j e s t ö j ä ä n + m a r k k i n a j ä t t e j ä + m a r k k i n a k a n n u s t i m i e n + m a r k k i n a k a p i t a l i s m i + m a r k k i n a k a p i t a l i s m i i n + m a r k k i n a k a p i t a l i s m i l l a + m a r k k i n a k e h i t y k s e e n + m a r k k i n a k e h i t y k s e n + m a r k k i n a k e h i t y k s e s s ä + m a r k k i n a k e h i t y k s e s t ä + m a r k k i n a k e h y s t ä + m a r k k i n a k e i n o i n + m a r k k i n a k e i n o t t e l i j o i h i n + m a r k k i n a k e i n o t t e l u n + m a r k k i n a k e l p o i s i a + m a r k k i n a k e s k e i s e e n + m a r k k i n a k e s k e i s e l t ä + m a r k k i n a k e s k e i s e m m ä k s i + m a r k k i n a k e s k e i s e m p i + m a r k k i n a k e s k e i s i ä + m a r k k i n a k i i n t i ö i d e n + m a r k k i n a k i i n t i ö i s t ä + m a r k k i n a k i l p a i l u a + m a r k k i n a k i l p a i l u n + m a r k k i n a k i l p a i l u u n + m a r k k i n a k o k e m u k s i s t a + m a r k k i n a k o k o a + m a r k k i n a k o m m u n i s m i k s i + m a r k k i n a k o n e i s t o n + m a r k k i n a k o o n + m a r k k i n a k o r k o i h i n + m a r k k i n a k o r k o j a + m a r k k i n a k o r k o j e n + m a r k k i n a k r i i s e i l t ä + m a r k k i n a k r i i s e j ä + m a r k k i n a k r i i s i + m a r k k i n a k r i i s i e n + m a r k k i n a k r i i s i i n + m a r k k i n a k r i i s i n + m a r k k i n a k r i i s i s t ä + m a r k k i n a k r i i s i ä + m a r k k i n a k u l u j e n + m a r k k i n a k u r i + m a r k k i n a k u r i a + m a r k k i n a k u r i i n + m a r k k i n a k u s t a n n u k s i i n + m a r k k i n a k y n n y k s i ä + m a r k k i n a k y s y m y k s e s s ä + m a r k k i n a k y s y m y s + m a r k k i n a k y s y m y s t e n + m a r k k i n a k y s y n n ä n + m a r k k i n a k y s y n t ä ä + m a r k k i n a k ä y t t ä y t y m i s e n + m a r k k i n a k ä y t t ä y t y m i s e s t ä ä n + m a r k k i n a k ä y t ä n n ö s t ä + m a r k k i n a k ä y t ä n n ö t + m a r k k i n a k ä y t ä n t ö i h i n + m a r k k i n a k ä y t ä n t ö j ä + m a r k k i n a l a a t u u n + m a r k k i n a l a e i l l e + m a r k k i n a l a e i s t a + m a r k k i n a l a i n s ä ä d ä n n ö n + m a r k k i n a l a i n s ä ä d ä n t ö ä + m a r k k i n a l a i t + m a r k k i n a l a i t o s t e n + m a r k k i n a l a k e j a + m a r k k i n a l a k i e n + m a r k k i n a l i b e r a a l i m p i + m a r k k i n a l i b e r a a l i s e n a + m a r k k i n a l i b e r a l i s m i + m a r k k i n a l i b e r a l i s m i n a + m a r k k i n a l o g i i k a l l e + m a r k k i n a l o g i i k a n + m a r k k i n a l o g i i k k a + m a r k k i n a l o g i i k k a a n + m a r k k i n a l o h k o i h i n + m a r k k i n a l o h k o i l l a + m a r k k i n a l ä h e s t y m i s t a p a a n + m a r k k i n a l ä h t ö i n e n + m a r k k i n a l ä h t ö i s e e n + m a r k k i n a l ä h t ö i s e l l ä + m a r k k i n a l ä h t ö i s e m m i k s i + m a r k k i n a l ä h t ö i s e m m ä t + m a r k k i n a l ä h t ö i s e m p ä ä + m a r k k i n a l ä h t ö i s e n + m a r k k i n a l ä h t ö i s e n ä + m a r k k i n a l ä h t ö i s e s t ä + m a r k k i n a l ä h t ö i s e t + m a r k k i n a l ä h t ö i s i ä + m a r k k i n a l ä h t ö i s t ä + m a r k k i n a l ä h t ö i s y y s + m a r k k i n a l ä h t ö i s y y t t ä + m a r k k i n a l ä h t ö k o h t i a + m a r k k i n a m a h d o l l i s u u d e t + m a r k k i n a m a h d o l l i s u u k s i a + m a r k k i n a m a h d o l l i s u u k s i e n + m a r k k i n a m a h d o l l i s u u k s i i n + m a r k k i n a m a h d o l l i s u u k s i s t a + m a r k k i n a m a h d o l l i s u u t e n a + m a r k k i n a m a l l i e n + m a r k k i n a m a l l i i n + m a r k k i n a m a l l i n + m a r k k i n a m e k a n i s m e i h i n + m a r k k i n a m e k a n i s m e i l l a + m a r k k i n a m e k a n i s m e i s s a + m a r k k i n a m e k a n i s m e i s t a + m a r k k i n a m e k a n i s m e j a + m a r k k i n a m e k a n i s m i + m a r k k i n a m e k a n i s m i a + m a r k k i n a m e k a n i s m i e n + m a r k k i n a m e k a n i s m i i n + m a r k k i n a m e k a n i s m i n + m a r k k i n a m e k a n i s m i t + m a r k k i n a m e n e s t y k s e e n + m a r k k i n a m e n e s t y s t ä + m a r k k i n a m e n e t e l m ä + m a r k k i n a m e n e t t e l y t + m a r k k i n a m e n o a + m a r k k i n a m e n o i h i n + m a r k k i n a m e n o i s t a + m a r k k i n a m e n o t + m a r k k i n a m o n e t a r i s m i + m a r k k i n a m o n o p o l i e n + m a r k k i n a m o n o p o l i i n + m a r k k i n a m o n o p o l i n + m a r k k i n a m u k a u t u k s e t + m a r k k i n a m u u t o k s e t + m a r k k i n a m u u t o k s i a + m a r k k i n a m u u t o k s i i n + m a r k k i n a m y ö n t e i n e n + m a r k k i n a m y ö n t e i s i ä + m a r k k i n a m y ö n t e i s t ä + m a r k k i n a m ä ä r i t e l m i ä + m a r k k i n a n h a l l i n t a t o i m i e n k i n + m a r k k i n a n s a + m a r k k i n a n ä k e m y s + m a r k k i n a n ä k e m y s t e n + m a r k k i n a n ä k y m i ä + m a r k k i n a n ä k y m ä n s ä + m a r k k i n a n ä k y m ä t + m a r k k i n a n ä k ö k o h d a t + m a r k k i n a n ä k ö k o h d i s t a + m a r k k i n a n ä k ö k o h t i a + m a r k k i n a n ä k ö k o h t i e n + m a r k k i n a n ä k ö k u l m a + m a r k k i n a o d o t u k s i a + m a r k k i n a o h j a u s v ä l i n e e t + m a r k k i n a o l o i h i n + m a r k k i n a o l o i s s a + m a r k k i n a o l o i s t a + m a r k k i n a o l o s u h t e e t + m a r k k i n a o l o s u h t e e t k i n + m a r k k i n a o l o s u h t e i d e n + m a r k k i n a o l o s u h t e i l l e + m a r k k i n a o l o s u h t e i s i i n + m a r k k i n a o l o s u h t e i s s a + m a r k k i n a o l o s u h t e i s t a + m a r k k i n a o l o s u h t e i t a + m a r k k i n a o l o t + m a r k k i n a o n g e l m a + m a r k k i n a o n g e l m i a + m a r k k i n a o n g e l m i e n + m a r k k i n a o n g e l m i i n + m a r k k i n a o p e r a a t i o i t a + m a r k k i n a o s a l l i s t u j i a + m a r k k i n a o s a p u o l e t + m a r k k i n a o s a p u o l i a + m a r k k i n a o s a p u o l i e n + m a r k k i n a o s a p u o l i i n + m a r k k i n a o s a p u o l i l l a + m a r k k i n a o s a p u o l i l l e + m a r k k i n a o s a p u o l i l t a + m a r k k i n a o s a p u o l t e n + m a r k k i n a o s u u d e l l a + m a r k k i n a o s u u d e l l a a n + m a r k k i n a o s u u d e n + m a r k k i n a o s u u d e s s a + m a r k k i n a o s u u d e s t a + m a r k k i n a o s u u d e s t a a n + m a r k k i n a o s u u d e t + m a r k k i n a o s u u k s i a + m a r k k i n a o s u u k s i a a n + m a r k k i n a o s u u k s i e n + m a r k k i n a o s u u k s i i n + m a r k k i n a o s u u k s i s t a + m a r k k i n a o s u u k s i s t a m m e + m a r k k i n a o s u u s + m a r k k i n a o s u u s k y n n y k s e n + m a r k k i n a o s u u s k y n n y s t e n + m a r k k i n a o s u u s l ä h e s t y m i s t a p a + m a r k k i n a o s u u s r a j a + m a r k k i n a o s u u s r a j o j e n + m a r k k i n a o s u u s s u u n n i t e l m a + m a r k k i n a o s u u t e e n + m a r k k i n a o s u u t e m m e + m a r k k i n a o s u u t e n s a + m a r k k i n a o s u u t t a + m a r k k i n a o s u u t t a a n + m a r k k i n a p a i k a k s i + m a r k k i n a p a i k a l l a + m a r k k i n a p a i k a l l e + m a r k k i n a p a i k a n + m a r k k i n a p a i k a s t a + m a r k k i n a p a i k k a + m a r k k i n a p a i k k a a + m a r k k i n a p a i n e + m a r k k i n a p a i n e i s i i n + m a r k k i n a p a i n e i t a + m a r k k i n a p e i t t o o n + m a r k k i n a p e l e j ä + m a r k k i n a p e l i s ä ä n t ö j e n + m a r k k i n a p e l i ä + m a r k k i n a p e r i a a t e + m a r k k i n a p e r i a a t t e e t + m a r k k i n a p e r i a a t t e i d e n + m a r k k i n a p e r i a a t t e i s i i n + m a r k k i n a p e r i a a t t e i s t a + m a r k k i n a p e r i a a t t e i t a + m a r k k i n a p e r u s t e i n + m a r k k i n a p e r u s t e i n e n + m a r k k i n a p e r u s t e i s e k s i + m a r k k i n a p e r u s t e i s e t + m a r k k i n a p e r u s t e i s i a + m a r k k i n a p e r u s t e i s i i n + m a r k k i n a p e r u s t e i s t e n + m a r k k i n a p i l a r i s t a + m a r k k i n a p o h j a i n e n + m a r k k i n a p o h j a i s e e n + m a r k k i n a p o h j a i s e n + m a r k k i n a p o h j a i s e s t i + m a r k k i n a p o h j a i s e t + m a r k k i n a p o h j a i s i a + m a r k k i n a p o h j a i s i l l a + m a r k k i n a p o h j a i s i s s a + m a r k k i n a p o h j a i s i s t a + m a r k k i n a p o h j a i s t a + m a r k k i n a p o h j a i s t e n + m a r k k i n a p o l i i s i n a + m a r k k i n a p o l i i t t i s e s t i + m a r k k i n a p o l i t i i k a n + m a r k k i n a p o l i t i i k a s s a + m a r k k i n a p o l i t i i k a s t a + m a r k k i n a p o l i t i i k k a + m a r k k i n a p o l i t i i k k a a + m a r k k i n a p o l i t i i k k a m m e + m a r k k i n a p o t e n t i a a l i + m a r k k i n a p o t e n t i a a l i a + m a r k k i n a p o t e n t i a a l i n + m a r k k i n a p r o j e k t i n a + m a r k k i n a p u i t t e i d e n + m a r k k i n a p u u t t e i t a + m a r k k i n a p ä ä s y l l e + m a r k k i n a p ä ä s y y n + m a r k k i n a p ä ä t ö k s i ä + m a r k k i n a r a d i k a l i s m i i n + m a r k k i n a r a h a l l a + m a r k k i n a r a h o i t u k s e e n + m a r k k i n a r a h o i t u s + m a r k k i n a r a j o i t u s t e n + m a r k k i n a r a k e n n e + m a r k k i n a r a k e n n e t t a + m a r k k i n a r a k e n t e e n s a + m a r k k i n a r a k e n t e e s e e n + m a r k k i n a r a k e n t e e s s a + m a r k k i n a r a k e n t e i d e n + m a r k k i n a r a k e n t e i s i i n + m a r k k i n a r a k e n t e i t a + m a r k k i n a r a k o j a + m a r k k i n a r a k o j e n + m a r k k i n a r a t k a i s u i k s i + m a r k k i n a r a t k a i s u i l l a + m a r k k i n a r a t k a i s u j a + m a r k k i n a r a t k a i s u j e n + m a r k k i n a r a t k a i s u n + m a r k k i n a r e a l i t e e t e i s t a + m a r k k i n a r e a l i t e e t t i e n + m a r k k i n a r i s k e i h i n + m a r k k i n a r i s k e j ä + m a r k k i n a s e g m e n t e i l l e + m a r k k i n a s e g m e n t e i l l ä + m a r k k i n a s e g m e n t i l l ä + m a r k k i n a s e g m e n t i n + m a r k k i n a s e g m e n t i t + m a r k k i n a s e g m e n t t e i h i n + m a r k k i n a s e g m e n t t e j ä + m a r k k i n a s e g m e n t t i + m a r k k i n a s e g m e n t t i ä + m a r k k i n a s e k t o r e i h i n + m a r k k i n a s e k t o r e i l l a + m a r k k i n a s e k t o r e i l l e + m a r k k i n a s e k t o r e i s t a + m a r k k i n a s e k t o r e i t a + m a r k k i n a s e k t o r i + m a r k k i n a s e k t o r i e n + m a r k k i n a s e k t o r i k s i + m a r k k i n a s e k t o r i n + m a r k k i n a s e l v i t y s + m a r k k i n a s i g n a a l e i h i n + m a r k k i n a s i i v u j e n + m a r k k i n a s i j o i t t a j i e n + m a r k k i n a s o s i a l i s t i n e n + m a r k k i n a s o v e l l u k s i a + m a r k k i n a s t a n d a r d e i h i n + m a r k k i n a s t r a t e g i a n s a + m a r k k i n a s u h t e i d e n + m a r k k i n a s u l k u m m e + m a r k k i n a s u o j a m ä ä r ä y k s e n + m a r k k i n a s u o j e l u s ä ä n t ö j ä + m a r k k i n a s u u n t a u k s e t + m a r k k i n a s u u n t a u k s i a + m a r k k i n a s u u n t a u k s i i n + m a r k k i n a s u u n t a u k s i s t a + m a r k k i n a s u u n t a u t u m i n e n + m a r k k i n a s u u n t a u t u m i s t a + m a r k k i n a s u u n t a u t u n e e l l e + m a r k k i n a s u u n t a u t u n e e m m i n + m a r k k i n a s u u n t a u t u n e e m p a a + m a r k k i n a s u u n t a u t u n e e m p a a n + m a r k k i n a s u u n t a u t u n e e m p i + m a r k k i n a s u u n t a u t u n e e m p i a + m a r k k i n a s u u n t a u t u n e e n + m a r k k i n a s u u n t a u t u n e e s e e n + m a r k k i n a s u u n t a u t u n e e t + m a r k k i n a s u u n t a u t u n e i n a + m a r k k i n a s u u n t a u t u n e i s u u d e n + m a r k k i n a s u u n t a u t u n e i s u u s + m a r k k i n a s u u n t a u t u n e i s u u t t a + m a r k k i n a s u u n t a u t u n u t t a + m a r k k i n a s y i s t ä + m a r k k i n a s y r j i n t ä k i e l t o a + m a r k k i n a s ä ä n n ö i l l e + m a r k k i n a s ä ä n n ö i l l ä + m a r k k i n a s ä ä n n ö i s s ä + m a r k k i n a s ä ä n n ö i s t ä + m a r k k i n a s ä ä n n ö s t e l y + m a r k k i n a s ä ä n n ö s t e n + m a r k k i n a s ä ä n n ö t + m a r k k i n a s ä ä n t e l y + m a r k k i n a s ä ä n t e l y m e k a n i s m e i h i n + m a r k k i n a s ä ä n t e l y n + m a r k k i n a s ä ä n t e l y s t ä + m a r k k i n a s ä ä n t e l y t o i m e n p i t e e t + m a r k k i n a s ä ä n t e l y v ä l i n e t t ä + m a r k k i n a s ä ä n t e l y ä + m a r k k i n a s ä ä n t ö + m a r k k i n a s ä ä n t ö i h i n + m a r k k i n a s ä ä n t ö j e n + m a r k k i n a s ä ä n t ö j ä + m a r k k i n a s ä ä n t ö t u o t t e i s t a + m a r k k i n a s ä ä t e l y m e k a n i s m e i s t a + m a r k k i n a t + m a r k k i n a t a k a a j a + m a r k k i n a t a k a a j a t + m a r k k i n a t a k a u s t o i m i a + m a r k k i n a t a l o u d e k s i + m a r k k i n a t a l o u d e l l a + m a r k k i n a t a l o u d e l l e + m a r k k i n a t a l o u d e l l i n e n + m a r k k i n a t a l o u d e l l i s e l l a + m a r k k i n a t a l o u d e l l i s t e n + m a r k k i n a t a l o u d e l t a + m a r k k i n a t a l o u d e n + m a r k k i n a t a l o u d e s s a + m a r k k i n a t a l o u d e s t a + m a r k k i n a t a l o u d e t + m a r k k i n a t a l o u k s i a + m a r k k i n a t a l o u k s i e n + m a r k k i n a t a l o u k s i k s i + m a r k k i n a t a l o u k s i l l e + m a r k k i n a t a l o u k s i n a + m a r k k i n a t a l o u k s i s s a + m a r k k i n a t a l o u k s i s t a + m a r k k i n a t a l o u s + m a r k k i n a t a l o u s a s e m a + m a r k k i n a t a l o u s a s e m a a + m a r k k i n a t a l o u s a s e m a n + m a r k k i n a t a l o u s a s e m a s t a + m a r k k i n a t a l o u s h e n k i s t ä + m a r k k i n a t a l o u s i n s t i t u u t i n + m a r k k i n a t a l o u s j ä r j e s t e l m i e n + m a r k k i n a t a l o u s j ä r j e s t e l m ä + m a r k k i n a t a l o u s j ä r j e s t e l m ä n + m a r k k i n a t a l o u s j ä r j e s t e l m ä ä n + m a r k k i n a t a l o u s k o h t e l u a + m a r k k i n a t a l o u s m a a + m a r k k i n a t a l o u s m a a k s i + m a r k k i n a t a l o u s m a a n + m a r k k i n a t a l o u s m a a t a + m a r k k i n a t a l o u s m a i n a + m a r k k i n a t a l o u s m a l l i + m a r k k i n a t a l o u s m a l l i a + m a r k k i n a t a l o u s m a l l i i n + m a r k k i n a t a l o u s m a l l i s t a + m a r k k i n a t a l o u s p o l i t i i k a n + m a r k k i n a t a l o u s p o l i t i i k k a a + m a r k k i n a t a l o u s v a a t i m u k s e n + m a r k k i n a t a l o u s y h t e i s k u n n i s t a + m a r k k i n a t a l o u s y h t e i s k u n t a + m a r k k i n a t a l o u t e e n + m a r k k i n a t a l o u t e m m e + m a r k k i n a t a l o u t e n a + m a r k k i n a t a l o u t e n s a + m a r k k i n a t a l o u t t a + m a r k k i n a t a l o u t t a m m e + m a r k k i n a t a r j o n n a n + m a r k k i n a t a r j o n t a a + m a r k k i n a t a s a p a i n o + m a r k k i n a t a s a p a i n o n + m a r k k i n a t a s o l l a + m a r k k i n a t a v a r a a + m a r k k i n a t a v a r a n a + m a r k k i n a t e r m e i n + m a r k k i n a t e r r o r i s t i p a n k k i e n + m a r k k i n a t e s t i + m a r k k i n a t e s t i n + m a r k k i n a t e s t i s t ä + m a r k k i n a t e s t i t + m a r k k i n a t e s t i ä + m a r k k i n a t h a n + m a r k k i n a t i e t o a + m a r k k i n a t i e t o i s u u d e n + m a r k k i n a t i e t o j a + m a r k k i n a t i e t o u t t a + m a r k k i n a t i e t ä m y k s e n + m a r k k i n a t i l a i s u u d e n + m a r k k i n a t i l a n n e + m a r k k i n a t i l a n n e t t a + m a r k k i n a t i l a n t e e n + m a r k k i n a t i l a n t e e s e e n + m a r k k i n a t i l a n t e e s s a + m a r k k i n a t i l a n t e e s t a + m a r k k i n a t i l a n t e e t + m a r k k i n a t i l a n t e i d e n + m a r k k i n a t i l a n t e i s i i n + m a r k k i n a t i l a n t e i t a + m a r k k i n a t o d e l l i s u u s + m a r k k i n a t o d e l l i s u u t e e n + m a r k k i n a t o i m e n p i d e + m a r k k i n a t o i m e n p i t e e n ä + m a r k k i n a t o i m e n p i t e e t + m a r k k i n a t o i m e n p i t e i d e n + m a r k k i n a t o i m e n p i t e i k s i + m a r k k i n a t o i m e n p i t e i n + m a r k k i n a t o i m e n p i t e i s t ä + m a r k k i n a t o i m e n p i t e i t ä + m a r k k i n a t o i m e t + m a r k k i n a t o i m i e n + m a r k k i n a t o i m i i n + m a r k k i n a t o i m i j a + m a r k k i n a t o i m i j a l l e + m a r k k i n a t o i m i j a n + m a r k k i n a t o i m i j a t + m a r k k i n a t o i m i j a t k i n + m a r k k i n a t o i m i j o i d e n + m a r k k i n a t o i m i j o i h i n + m a r k k i n a t o i m i j o i l l a + m a r k k i n a t o i m i j o i l l e + m a r k k i n a t o i m i j o i s t a + m a r k k i n a t o i m i j o i t a + m a r k k i n a t o i m i l t a + m a r k k i n a t o i m i n t a + m a r k k i n a t o i m i n t a a + m a r k k i n a t o i m i n t a a n + m a r k k i n a t o i m i s t a + m a r k k i n a t r e n d i t + m a r k k i n a t u e n + m a r k k i n a t u e t + m a r k k i n a t u k e a + m a r k k i n a t u k i + m a r k k i n a t u k i a + m a r k k i n a t u k i t o i m e n p i t e e n ä + m a r k k i n a t u k i t o i m e n p i t e i d e n + m a r k k i n a t u k i t o i m e n p i t e i s t ä + m a r k k i n a t u k i t o i m e n p i t e i t ä + m a r k k i n a t u k i t o i m i a + m a r k k i n a t u k i t o i m i e n + m a r k k i n a t u k i v ä l i n e i d e n + m a r k k i n a t u l o k k a i d e n + m a r k k i n a t u n n e l m a + m a r k k i n a t u o m i o i s t u i n + m a r k k i n a t u o t e + m a r k k i n a t u o t t e i s s a + m a r k k i n a t u t k i m u k s e e n + m a r k k i n a t u t k i m u k s e n + m a r k k i n a t u t k i m u k s i a + m a r k k i n a t u t k i m u k s i i n + m a r k k i n a t u t k i m u k s i l l a + m a r k k i n a t u t k i m u s + m a r k k i n a t u t k i m u s l a i t o s + m a r k k i n a t u t k i m u s t a + m a r k k i n a t u t k i m u s t u l o k s i a + m a r k k i n a t u t k i m u s v e r k o n + m a r k k i n a u s k o n + m a r k k i n a u u d i s t u k s e n + m a r k k i n a u u d i s t u k s i a + m a r k k i n a u u d i s t u k s i s s a + m a r k k i n a u u d i s t u k s i s t a + m a r k k i n a u u d i s t u s + m a r k k i n a u u d i s t u s t e n + m a r k k i n a v a a t i m u k s e t + m a r k k i n a v a a t i m u k s i i n + m a r k k i n a v a a t i m u s t e n + m a r k k i n a v a i h e e s s a + m a r k k i n a v a i h t e l u a + m a r k k i n a v a i h t e l u i d e n + m a r k k i n a v a i k u t u s t e n + m a r k k i n a v a l l a n k u m o u s t a + m a r k k i n a v a l t a a + m a r k k i n a v a l v o n n a l l a + m a r k k i n a v a l v o n n a l l e + m a r k k i n a v a l v o n n a n + m a r k k i n a v a l v o n n a s t a + m a r k k i n a v a l v o n t a + m a r k k i n a v a l v o n t a a + m a r k k i n a v a l v o n t a a n + m a r k k i n a v a l v o n t a e l i m i e n + m a r k k i n a v a l v o n t a e l i n t e n + m a r k k i n a v a l v o n t a i n t e r v e n t i o l l e + m a r k k i n a v a l v o n t a j ä r j e s t e l m ä + m a r k k i n a v a l v o n t a j ä r j e s t e l m ä n + m a r k k i n a v a l v o n t a j ä r j e s t e l m ä s t ä + m a r k k i n a v a l v o n t a j ä r j e s t e l m ä t + m a r k k i n a v a l v o n t a j ä r j e s t e l m ä ä + m a r k k i n a v a l v o n t a m e k a n i s m e i s t a + m a r k k i n a v a l v o n t a o r g a n i s a a t i o n + m a r k k i n a v a l v o n t a t e h t ä v ä n s ä + m a r k k i n a v a l v o n t a v e l v o i t t e i t a + m a r k k i n a v a l v o n t a v i r a n o m a i s e t + m a r k k i n a v a l v o n t a v i r a n o m a i s i a + m a r k k i n a v a l v o n t a v i r a n o m a i s t e n + m a r k k i n a v a p a u d e n + m a r k k i n a v a p a u k s i i n + m a r k k i n a v e r o t u k s e s s a + m a r k k i n a v e t o i n e n + m a r k k i n a v e t o i s e l l a + m a r k k i n a v e t o i s e m m i l l e + m a r k k i n a v e t o i s e m p a a + m a r k k i n a v e t o i s e s t i + m a r k k i n a v e t o i s i l l e + m a r k k i n a v e t o i s t a + m a r k k i n a v i r a n o m a i n e n + m a r k k i n a v i r a n o m a i s e n + m a r k k i n a v i r a n o m a i s e s t a + m a r k k i n a v i r a n o m a i s t a + m a r k k i n a v i r a n o m a i s t e n + m a r k k i n a v o i m a + m a r k k i n a v o i m a a + m a r k k i n a v o i m a a n + m a r k k i n a v o i m a k y s y m y s t ä + m a r k k i n a v o i m a n + m a r k k i n a v o i m a t + m a r k k i n a v o i m i a + m a r k k i n a v o i m i e n + m a r k k i n a v o i m i i n + m a r k k i n a v o i m i l l a + m a r k k i n a v o i m i l l e + m a r k k i n a v o i m i l t a + m a r k k i n a v o i m i s t a + m a r k k i n a v u o s i n a + m a r k k i n a v ä l i n e + m a r k k i n a v ä l i n e e n ä + m a r k k i n a v ä l i n e e s t ä + m a r k k i n a v ä l i n e e t + m a r k k i n a v ä l i n e i d e n + m a r k k i n a v ä l i n e i l l e + m a r k k i n a v ä l i n e i s i i n + m a r k k i n a v ä l i n e i s t ä + m a r k k i n a v ä l i n e i t ä + m a r k k i n a v ä l i t t ä j i ä + m a r k k i n a v ä ä r i n k ä y t ö s t e n + m a r k k i n a v ä ä r i s t y m i s t ä + m a r k k i n a v ä ä r i s t y m i ä + m a r k k i n a v ä ä r i s t y m ä n + m a r k k i n a v ä ä r i s t y m ä t + m a r k k i n a y h t e i s k u n n a s s a + m a r k k i n a y h t e i s k u n t a a n + m a r k k i n a y h t e i s ö + m a r k k i n a y h t e i s ö n ä + m a r k k i n a y m p ä r i s t ö + m a r k k i n a y m p ä r i s t ö n + m a r k k i n a y m p ä r i s t ö s s ä + m a r k k i n a y m p ä r i s t ö ä + m a r k k i n a y m p ä r i s t ö ö n + m a r k k i n a y s t ä v ä l l i s e m m ä t + m a r k k i n a y s t ä v ä l l i s e n + m a r k k i n a y s t ä v ä l l i s t ä + m a r k k i n o i d e m m e + m a r k k i n o i d e n + m a r k k i n o i h i n + m a r k k i n o i l l a + m a r k k i n o i l l a a n + m a r k k i n o i l l a k i n + m a r k k i n o i l l e + m a r k k i n o i l l e e n + m a r k k i n o i l l e m m e + m a r k k i n o i l t a + m a r k k i n o i n a + m a r k k i n o i n n i n + m a r k k i n o i n n i n e d i s t ä m i n e n + m a r k k i n o i n n i s s a + m a r k k i n o i n n i s t a + m a r k k i n o i n t i a + m a r k k i n o i n t i a l a l l a + m a r k k i n o i n t i a l o j e n + m a r k k i n o i n t i a u t o m a a t i o + m a r k k i n o i n t i a v u s t u s t e n + m a r k k i n o i n t i b u d j e t t i + m a r k k i n o i n t i d i r e k t i i v i ä + m a r k k i n o i n t i e d e l l y t y s t e n + m a r k k i n o i n t i e t u + m a r k k i n o i n t i i n + m a r k k i n o i n t i j ä r j e s t e l m ä + m a r k k i n o i n t i j ä r j e s t e l m ä m m e + m a r k k i n o i n t i j ä t t i + m a r k k i n o i n t i k a m p a n j a + m a r k k i n o i n t i k a m p a n j a a + m a r k k i n o i n t i k a m p a n j a n + m a r k k i n o i n t i k a m p a n j o i h i n + m a r k k i n o i n t i k a m p a n j o i l l a + m a r k k i n o i n t i k a m p a n j o i n a + m a r k k i n o i n t i k a m p a n j o i s s a m m e + m a r k k i n o i n t i k a m p a n j o i t a + m a r k k i n o i n t i k a n a v i e n + m a r k k i n o i n t i k e h i t y s t ä + m a r k k i n o i n t i k e i n o n a + m a r k k i n o i n t i k e t j u n + m a r k k i n o i n t i k e t j u u n + m a r k k i n o i n t i k i e l l o n + m a r k k i n o i n t i k i e l t o + m a r k k i n o i n t i k i e l t o a + m a r k k i n o i n t i k i e l t o j e n + m a r k k i n o i n t i k i e l t o o n + m a r k k i n o i n t i k u l u t + m a r k k i n o i n t i k u s t a n n u k s i i n + m a r k k i n o i n t i k u s t a n n u k s i s s a a n + m a r k k i n o i n t i l u p a + m a r k k i n o i n t i l u p a a + m a r k k i n o i n t i l u p i a + m a r k k i n o i n t i l u v a n + m a r k k i n o i n t i m a h d o l l i s u u k s i e n + m a r k k i n o i n t i m a h d o l l i s u u t e n a + m a r k k i n o i n t i m a k s u i s t a + m a r k k i n o i n t i m e n e t e l m i e n + m a r k k i n o i n t i m e n e t e l m i i n + m a r k k i n o i n t i m e n e t e l m i s t ä + m a r k k i n o i n t i m e n e t e l m i ä + m a r k k i n o i n t i m e n o t + m a r k k i n o i n t i m u o t o + m a r k k i n o i n t i m u o t o j a + m a r k k i n o i n t i n i m i + m a r k k i n o i n t i n ä k ö k o h d a t + m a r k k i n o i n t i n ä k ö k u l m a a + m a r k k i n o i n t i o h j e l m a + m a r k k i n o i n t i o h j e l m i e n + m a r k k i n o i n t i o l o s u h t e e t + m a r k k i n o i n t i o n g e l m a n + m a r k k i n o i n t i o n g e l m a t + m a r k k i n o i n t i o n g e l m i a + m a r k k i n o i n t i o s a a m i s t a + m a r k k i n o i n t i o s a s t o l l e + m a r k k i n o i n t i p o l i t i i k k a a + m a r k k i n o i n t i p r o s e s s i i n + m a r k k i n o i n t i p r o s e s s i s s a + m a r k k i n o i n t i r a k e n t e i d e n + m a r k k i n o i n t i r a k e n t e i s i i n + m a r k k i n o i n t i r a k e n t e i t a m m e + m a r k k i n o i n t i s o p i m u k s i a + m a r k k i n o i n t i s t r a t e g i a a + m a r k k i n o i n t i s t r a t e g i a n + m a r k k i n o i n t i s t r a t e g i o i d e n + m a r k k i n o i n t i s t r a t e g i o i t a + m a r k k i n o i n t i s ä ä n n ö i s t ä + m a r k k i n o i n t i t a p o i h i n + m a r k k i n o i n t i t e k n i i k o i d e n + m a r k k i n o i n t i t e k n i i k o i h i n + m a r k k i n o i n t i t e m p p u n a + m a r k k i n o i n t i t e m p u i l l a + m a r k k i n o i n t i t e o l l i s u u d e l l e + m a r k k i n o i n t i t e o l l i s u u d e l l e k i n + m a r k k i n o i n t i t e o l l i s u u d e n + m a r k k i n o i n t i t i e t o n a u h o j a + m a r k k i n o i n t i t i l a s t o j a + m a r k k i n o i n t i t o i m e n p i t e e t + m a r k k i n o i n t i t o i m e n p i t e i d e n + m a r k k i n o i n t i t o i m e n p i t e i t ä + m a r k k i n o i n t i t o i m e t + m a r k k i n o i n t i t o i m i a + m a r k k i n o i n t i t o i m i a a n + m a r k k i n o i n t i t o i m i i n + m a r k k i n o i n t i t u e n + m a r k k i n o i n t i t u k e a + m a r k k i n o i n t i t u k e e n + m a r k k i n o i n t i t u k i + m a r k k i n o i n t i v a a t i m u k s i a + m a r k k i n o i n t i v a i h e e s e e n + m a r k k i n o i n t i v e r k o s t o j a + m a r k k i n o i n t i v e r k o s t o j e n + m a r k k i n o i n t i v i e s t i n t ä + m a r k k i n o i n t i v u o d e k s i + m a r k k i n o i n t i v u o d e l l a + m a r k k i n o i n t i v u o d e l l e + m a r k k i n o i n t i v u o d e n + m a r k k i n o i n t i v u o d e s t a + m a r k k i n o i n t i v u o n n a + m a r k k i n o i n t i v u o s i + m a r k k i n o i n t i v u o s i a + m a r k k i n o i n t i v u o s i e n + m a r k k i n o i n t i v u o s i k s i + m a r k k i n o i n t i v u o t e e n + m a r k k i n o i n t i v u o t e n a + m a r k k i n o i n t i v u o t t a + m a r k k i n o i n t i v ä l i n e e l l ä + m a r k k i n o i n t i v ä l i n e e n ä + m a r k k i n o i n t i v ä l i n e e s t ä + m a r k k i n o i n t i v ä l i n e i t ä + m a r k k i n o i n t i v ä l i n e t t ä + m a r k k i n o i n t i y r i t y k s i s t ä + m a r k k i n o i n t i y r i t y k s i ä + m a r k k i n o i s t a + m a r k k i n o i t a + m a r k k i n o i t a a n + m a r k k i n o i t a k i n + m a r k k i n o i t a v a + m a r k k i n o i t a v i e n + m a r k k i n o i v a t + m a r m o r e i s t a + m a r m o r i k a u p u n g i n + m a r m o r i k i s s a + m a r m o r i m e s i k k o + m a r m o r i m i e s + m a r m o r i p a l a t s i + m a r m o r i p ö l l ö k e h r ä ä j ä + m a r m o r i r i s t i h ä m ä h ä k k i + m a r m o r i s i i p i + m a r m o r i s o r s a + m a r m o r i t + m a r m o r i t a p p a r a k a l a + m a r m o r i v e i s t o s k o k o e l m a n + m a r m o r i v e i s t o s t e n + m a r o k k o l a i s e t + m a r o k k o l a i s n a i s e n + m a r o k k o l a i s t e n + m a r o k k o l a i s v a n k i a + m a r o k k o l a i s v a n k i e n + m a r o k k o l a i s y h t e i s ö j e n + m a r r a s k e s i + m a r r a s k u i n e n + m a r r a s k u u h u n + m a r r a s k u u n + m a r r a s k u u s s a + m a r r a s k u u s t a + m a r r a s k u u t a + m a r s h a l l i n + m a r s h a l l i n s a a r e t + m a r s h a l l i n s a a r t e n + m a r s i l a i s e t + m a r s i l a i s i a + m a r s k i h e i n ä n + m a r s s i a + m a r s s i e n + m a r s s i j ä r j e s t y k s e n + m a r s s i m a l l a + m a r s s i v a t + m a r t i n i a + m a r t i n i i n + m a r t i n i l l e + m a r t i n i n + m a r t i n i s t a + m a r t t a l i i t t o + m a r t t y y r i e n + m a r t t y y r i k a n s a + m a r t t y y r i k a u p u n k i + m a r t t y y r i k r i s t i t t y j e n + m a r t t y y r i k u l t t u u r i a + m a r u n a s i r k k u + m a r x i l a i s e n + m a r x i s t i s t a + m a s a i l e i j o n a + m a s a l i t i t + m a s a s i + m a s e n n u s j a k s o + m a s e n n u s o i r e i t a + m a s e n t a v a a + m a s e n t a v a m p a a + m a s e n t a v a m p i + m a s e n t a v a m p i a + m a s e n t a v i a + m a s e n t a v i m m i s t a + m a s k u l i i n i s e s t i + m a s o k i s t i t + m a s s a d i g i t o i n t i i n + m a s s a e u r o o p p a l a i s u u d e s t a + m a s s a i l m i ö k s i + m a s s a i r t i s a n o m i s i l l a + m a s s a i r t i s a n o m i s t e n + m a s s a k a r k o t u k s e n + m a s s a k a r k o t u k s i a + m a s s a k a r k o t u k s i s t a + m a s s a k a r k o t u s t e n + m a s s a k o k o u k s e t + m a s s a k u l t t u u r i a + m a s s a k u l t t u u r i l l e + m a s s a k u l t t u u r i n + m a s s a k u l u t u s + m a s s a k u l u t u s h y ö d y k k e i t ä + m a s s a k u l u t u s m a r k k i n o i l l e + m a s s a k ö y h y y t t ä + m a s s a l i i k e h d i n n ä n + m a s s a l i i k e h d i n t ä ä n + m a s s a l i i k e t t ä + m a s s a l i i k k u v u u d e n + m a s s a l u k u + m a s s a l ä ä k i t y k s e n + m a s s a m a a h a n m u u t o n + m a s s a m a a h a n m u u t o s t a + m a s s a m a a h a n m u u t t o + m a s s a m a a h a n m u u t t o a + m a s s a m a a h a n m u u t t o p o l i t i i k k a + m a s s a m a r k k i n o i d e n + m a s s a m a r k k i n o i n t i i n + m a s s a m e d i a + m a s s a m u i s t i + m a s s a m u r h a a j a + m a s s a m u r h a a j a l l e + m a s s a m u r h a a j a t + m a s s a m u r h a a j i l t a + m a s s a m u r h a a n + m a s s a m u r h a n + m a s s a m u r h i a + m a s s a m u r h i e n + m a s s a m u r h i i n + m a s s a m u r h i l t a + m a s s a m u r h i s t a + m a s s a m u u t o n + m a s s a m u u t t o + m a s s a m u u t t o a + m a s s a m u u t t o a a l l o i s t a + m a s s a m u u t t o a a l l o s t a + m a s s a m u u t t o n a + m a s s a m u u t t o t i l a n t e i s s a + m a s s a m u u t t o v i r r o i l t a + m a s s a p o s t i t u k s i s t a + m a s s a p r o t e s t i t + m a s s a r o k o t u s p o l i t i i k k a a n + m a s s a r ä j ä h d y s t ä + m a s s a s i i r t o l a i s u u s + m a s s a s p e k t r o m e t r i + m a s s a s u h d e + m a s s a t a s e + m a s s a t a v a r a a + m a s s a t a v a r a n a + m a s s a t e l o i t u k s i s s a + m a s s a t e r r o r i s m i + m a s s a t e u r a s t u k s e t + m a s s a t e u r a s t u k s i e n + m a s s a t e u r a s t u k s i i n + m a s s a t u h o a s e i d e n + m a s s a t u h o a s e i t a + m a s s a t u h o v ä l i n e i t ä + m a s s a t u o n n i t + m a s s a t u o n t i a + m a s s a t u o t a n n o n + m a s s a t u o t a n n o s s a + m a s s a t u o t a n t o + m a s s a t u o t a n t o a + m a s s a t u o t a n t o n a + m a s s a t u o t a n t o o n + m a s s a t u o t a n t o y h t e i s k u n n a n + m a s s a t u o t t e i d e n + m a s s a t u o t t e i t a + m a s s a t u r i s m i a + m a s s a t u r i s m i i n + m a s s a t u r i s m i n + m a s s a t u r i s m i s t a + m a s s a t y ö t t ö m y y d e k s i + m a s s a t y ö t t ö m y y d e n + m a s s a t y ö t t ö m y y d e s t ä + m a s s a t y ö t t ö m y y s + m a s s a t y ö t t ö m y y t e e n + m a s s a t y ö t t ö m y y t t ä + m a s s a u r h e i l u + m a s s a u r h e i l u a + m a s s a u r h e i l u n + m a s s a u r h e i l u u n + m a s s a u u d e l l e e n j ä r j e s t e l y t + m a s s a v a a t i m u k s i a + m a s s a v a i m e n n i n + m a s s a v a l m i s t u k s e s s a + m a s s a v a l v o n n a n + m a s s a v i e s t i n n ä n + m a s s a v i i h d e + m a s s a v y ö r y ä + m a s s a y l i j ä ä m ä + m a s s i i v i p u u + m a s s i i v i s e k s i + m a s s i i v i s e t + m a s s i i v i s t a + m a s s o j a + m a s u u n i a + m a s u u n i k a a s u + m a t a k a n a + m a t a l a h i i l i s e n + m a t a l a h i i l i s i ä + m a t a l a j ä n n i t e d i r e k t i i v i + m a t a l a k o r k o i s i a + m a t a l a k o r k o i s i i n + m a t a l a k o r k o i s i l l a + m a t a l a k o r k o i s t e n + m a t a l a k s i + m a t a l a l a t t i a b u s s e j a + m a t a l a l a t t i a b u s s i + m a t a l a l a t t i a b u s s i e n + m a t a l a m m a l l a + m a t a l a m m a l l e + m a t a l a m m a n + m a t a l a m m a t + m a t a l a m m i s t a + m a t a l a m p a a + m a t a l a m p i e n + m a t a l a n + m a t a l a p a l k k a i s e l l a + m a t a l a p a l k k a i s e n + m a t a l a p a l k k a i s e s s a + m a t a l a p a l k k a i s e t + m a t a l a p a l k k a i s i a + m a t a l a p a l k k a i s i i n + m a t a l a p a l k k a i s i l l a + m a t a l a p a l k k a i s i l l e + m a t a l a p a l k k a i s i m p i a + m a t a l a p a l k k a i s i m p i e n + m a t a l a p a l k k a i s i s s a + m a t a l a p a l k k a i s i s t a + m a t a l a p a l k k a i s t a + m a t a l a p a l k k a i s t e n + m a t a l a p a l k k a i s u u d e n + m a t a l a p a l k k a i s u u s + m a t a l a p a l k k a i s u u t t a + m a t a l a t + m a t a l a t u l o i s e t + m a t a l a t u l o i s i a + m a t a l a t u l o i s i m m i l l e + m a t a l a t u l o i s t e n + m a t a l i k k o m e r i m e t s o + m a t a l i l l e + m a t a l i n + m a t a m a t a + m a t a r a k i i t ä j ä + m a t a u r a j o k i + m a t e l i + m a t e m a a t t i s e s t i + m a t e m a a t t i s e t + m a t e m a a t t i s i a + m a t e m a a t t i s t e n + m a t e m a t i i k a n o p e t t a j a + m a t e r i a a + m a t e r i a a l e i s t a + m a t e r i a a l e j a + m a t e r i a a l i a + m a t e r i a a l i a p u a + m a t e r i a a l i a v u n + m a t e r i a a l i e n + m a t e r i a a l i f y s i i k k a + m a t e r i a a l i h a n k i n t a + m a t e r i a a l i k o h t a i s e t + m a t e r i a a l i k o h t a i s i a + m a t e r i a a l i k o h t a i s t e n + m a t e r i a a l i n + m a t e r i a a l i n t o i m i t t a j i e n + m a t e r i a a l i o i k e u k s i a + m a t e r i a a l i r e s u r s s i t + m a t e r i a a l i s e l t a + m a t e r i a a l i s i a + m a t e r i a a l i s u o s i t u k s i a + m a t e r i a a l i t e h o k k u u t e e n + m a t e r i a a l i t e h o k k u u t t a + m a t e r i a a l i t e k n o l o g i o i t a + m a t e r i a a l i t i e d e + m a t e r i a a l i t u o t a n t o + m a t e r i a a l i t u t k i m u k s e l l e + m a t e r i a a l i t u t k i m u s + m a t e r i a a l i v a r a n n o t + m a t e r i a a l i v i r r a t + m a t e r i a a l i v i r r o i s t a + m a t e r i a a l i v i r t a t i l e j ä + m a t e r i a a l i v i r t a t i l i t + m a t e r i a a l i v i r t o i h i n + m a t e r i a a l i v i r t o j a + m a t e r i a a l i v i r t o j e n + m a t e r i a l i s m i n + m a t k a a n + m a t k a b u d j e t t i n i + m a t k a d i r e k t i i v i s s ä + m a t k a e h d o t + m a t k a e n d u r o + m a t k a e t u j a + m a t k a e v ä i t ä + m a t k a h i n t o j a + m a t k a i l e m i s e e n + m a t k a i l i j a a + m a t k a i l i j a r a u t a t i e t + m a t k a i l i j a r y h m i e n + m a t k a i l i j a r y h m i ä + m a t k a i l i j a t + m a t k a i l i j a v i r r a n + m a t k a i l i j a v i r r a t + m a t k a i l i j a v i r t o i h i n + m a t k a i l i j a v i r t o j a + m a t k a i l i j a v i r t o j e n + m a t k a i l i j o i l l e + m a t k a i l i j o i n a + m a t k a i l i j o i t a + m a t k a i l u a + m a t k a i l u a j a t t e l u + m a t k a i l u a l a + m a t k a i l u a l a a + m a t k a i l u a l a a n + m a t k a i l u a l a l l a + m a t k a i l u a l a l l e + m a t k a i l u a l a l l e m m e + m a t k a i l u a l a l t a + m a t k a i l u a l a n + m a t k a i l u a l a t + m a t k a i l u a l o i l l a + m a t k a i l u a l o i l l e + m a t k a i l u a l o i t t e i t a + m a t k a i l u a l o j a + m a t k a i l u a l o j e n + m a t k a i l u a l u e e n a + m a t k a i l u a l u e e t + m a t k a i l u a l u e i d e n + m a t k a i l u a l u e i l l a + m a t k a i l u a l u e i s t a + m a t k a i l u a l u e i t a + m a t k a i l u a l u k s i a + m a t k a i l u a r v o a + m a t k a i l u a s i a a + m a t k a i l u a s i o i h i n + m a t k a i l u a u t o + m a t k a i l u a u t o i s t a + m a t k a i l u b o i k o t t i i n + m a t k a i l u e l i n k e i n o + m a t k a i l u e l i n k e i n o a + m a t k a i l u e l i n k e i n o j e n + m a t k a i l u e l i n k e i n o l l a + m a t k a i l u e l i n k e i n o l l e + m a t k a i l u e l i n k e i n o n + m a t k a i l u e s i t t e e s t ä + m a t k a i l u f o o r u m i + m a t k a i l u f o o r u m i a + m a t k a i l u h a n k k e e t + m a t k a i l u h a n k k e i d e n + m a t k a i l u h a n k k e i s i i n + m a t k a i l u h a n k k e i s s a + m a t k a i l u h a r r a s t u k s e n + m a t k a i l u i l m i ö + m a t k a i l u i m a g o t + m a t k a i l u i n f r a s t r u k t u u r i n + m a t k a i l u i n v e s t o i n t e j a + m a t k a i l u j ä r j e s t ö + m a t k a i l u j ä r j e s t ö j e n + m a t k a i l u j ä r j e s t ö n + m a t k a i l u k a a n + m a t k a i l u k a u d e l l a + m a t k a i l u k a u d e n + m a t k a i l u k a u s i + m a t k a i l u k a u t t a + m a t k a i l u k e h i t y s t ä + m a t k a i l u k e s k u k s e k s i + m a t k a i l u k e s k u k s e t + m a t k a i l u k e s k u k s i i n + m a t k a i l u k e s k u k s i k s i + m a t k a i l u k e t j u u n + m a t k a i l u k o h d e + m a t k a i l u k o h d e m e r k i n + m a t k a i l u k o h d e t t a + m a t k a i l u k o h t e e n + m a t k a i l u k o h t e e n a + m a t k a i l u k o h t e e t + m a t k a i l u k o h t e i d e n + m a t k a i l u k o h t e i l l e + m a t k a i l u k o h t e i n a + m a t k a i l u k o h t e i s s a + m a t k a i l u k o h t e i s t a + m a t k a i l u k o h t e i t a + m a t k a i l u k o m p l e k s e i s t a + m a t k a i l u k o n f e r e n s s i + m a t k a i l u l a i v a + m a t k a i l u l l a + m a t k a i l u l l e + m a t k a i l u m a h d o l l i s u u k s i a + m a t k a i l u m a h d o l l i s u u k s i e n + m a t k a i l u m a j o i t u k s e e n + m a t k a i l u m a l l e j a + m a t k a i l u m a r k k i n a t + m a t k a i l u m a r k k i n o i d e n + m a t k a i l u m a r k k i n o i l l a + m a t k a i l u m e n o j a + m a t k a i l u m e s s u i l t a + m a t k a i l u m i n i s t e r i e n + m a t k a i l u m i n i s t e r i n + m a t k a i l u m u o d o t + m a t k a i l u m u o t o i h i n + m a t k a i l u m u o t o j a + m a t k a i l u m u o t o j e n + m a t k a i l u n + m a t k a i l u n e d i s t ä m i s h a n k k e i l l a + m a t k a i l u n e d i s t ä m i s p o l i t i i k k a a n + m a t k a i l u n e d i s t ä m i s t o i m i a + m a t k a i l u n e d i s t ä m i s t o i m i e n + m a t k a i l u n e u v o s t o a + m a t k a i l u n e u v o s t o n + m a t k a i l u n e u v o s t o o n + m a t k a i l u o h j e l m a n + m a t k a i l u o h j e l m a s s a + m a t k a i l u o h j e l m a s t a + m a t k a i l u o h j e l m i a + m a t k a i l u p a k e t i s s a + m a t k a i l u p a l v e l u a l a n + m a t k a i l u p a l v e l u i d e n + m a t k a i l u p a l v e l u i s s a + m a t k a i l u p a l v e l u i t a + m a t k a i l u p a l v e l u j a + m a t k a i l u p a l v e l u j a a n + m a t k a i l u p a l v e l u j e n + m a t k a i l u p a l v e l u t + m a t k a i l u p o l i t i i k a k s i + m a t k a i l u p o l i t i i k a l l e + m a t k a i l u p o l i t i i k a n + m a t k a i l u p o l i t i i k a s s a + m a t k a i l u p o l i t i i k a s t a + m a t k a i l u p o l i t i i k k a + m a t k a i l u p o l i t i i k k a a + m a t k a i l u p o l i t i i k k a a n + m a t k a i l u p o l i t i i k k o j a + m a t k a i l u p o l i t i i k k o j e n + m a t k a i l u p o t e n t i a a l i a + m a t k a i l u p ä ä k a u p u n g i n + m a t k a i l u r a h a + m a t k a i l u r e i t t e j ä + m a t k a i l u s a t a m a t + m a t k a i l u s e k t o r i i n + m a t k a i l u s e s o n g i n + m a t k a i l u s e s o n k i + m a t k a i l u s e s o n k i n a + m a t k a i l u s o p i m u k s i s s a + m a t k a i l u s s a + m a t k a i l u s t a + m a t k a i l u s t r a t e g i a + m a t k a i l u s t r a t e g i a a + m a t k a i l u s t r a t e g i a n + m a t k a i l u s t r a t e g i o i t a + m a t k a i l u s u o s i t u k s e t + m a t k a i l u s u u n n i t e l m a s s a + m a t k a i l u s u u n n i t e l m i a + m a t k a i l u s u u n t a u s t e n + m a t k a i l u t a l o u s + m a t k a i l u t a r j o n t a a + m a t k a i l u t a r k o i t u k s i i n + m a t k a i l u t e o l l i s u u d e l l e + m a t k a i l u t e o l l i s u u d e n + m a t k a i l u t e o l l i s u u d e s s a + m a t k a i l u t e o l l i s u u s + m a t k a i l u t e o l l i s u u t e m m e + m a t k a i l u t e o l l i s u u t t a + m a t k a i l u t i e + m a t k a i l u t i l a s t o i s t a + m a t k a i l u t i l a s t o j e n + m a t k a i l u t i l a s t o j ä r j e s t e l m ä ä + m a t k a i l u t i l a s t o t + m a t k a i l u t o i m i a + m a t k a i l u t o i m i j o i d e n + m a t k a i l u t o i m i n n a s t a + m a t k a i l u t o i m i n n o i l l a + m a t k a i l u t o i m i n t a + m a t k a i l u t o i m i n t a a n + m a t k a i l u t o i m i n t o j e n + m a t k a i l u t o i m i s t a + m a t k a i l u t o i m i s t o i h i n + m a t k a i l u t o i m i s t o t + m a t k a i l u t u l o i h i n + m a t k a i l u t u l o j a + m a t k a i l u t u l o j e n + m a t k a i l u t u l o n l ä h t e i d e n + m a t k a i l u t u o t e t t a m m e + m a t k a i l u t u o t t e i d e n + m a t k a i l u t u o t t e i t a + m a t k a i l u u n + m a t k a i l u v a l i o k u n n a l l a + m a t k a i l u v a l i o k u n n a n + m a t k a i l u v a l i o k u n n a n k u n n a n + m a t k a i l u v a l i o k u n n a s s a + m a t k a i l u v a l i o k u n t a + m a t k a i l u v a l i o k u n t a a + m a t k a i l u v a l i o k u n t a a n + m a t k a i l u v a l m i u k s i a + m a t k a i l u v a l t t e j a + m a t k a i l u v a u n u + m a t k a i l u v o i t t o j e n + m a t k a i l u y r i t t ä j i ä + m a t k a i l u y r i t t ä j y y s + m a t k a i l u y r i t t ä j ä t + m a t k a i l u y r i t y k s e t + m a t k a i l u y r i t y k s i l l e + m a t k a i l u y r i t y k s i l l ä + m a t k a i l u y r i t y k s i l l ä h ä n + m a t k a i l u y r i t y s t e n + m a t k a j ä r j e s t e l y i h i n s ä + m a t k a j ä r j e s t e l y i s s ä + m a t k a j ä r j e s t e l y i s t ä + m a t k a j ä r j e s t e l y j ä + m a t k a j ä r j e s t e l y n i + m a t k a j ä r j e s t e l y n s ä + m a t k a j ä r j e s t e l y t + m a t k a j ä r j e s t ä j i e n + m a t k a k e r t o m u s + m a t k a k i l o m e t r i l t ä + m a t k a k i l o m e t r i s t ä + m a t k a k o h d e t i e t o k a n t o j a + m a t k a k o h t e e n a + m a t k a k o h t e e s e e n s a + m a t k a k o h t e i d e n + m a t k a k o h t e i l l e + m a t k a k o h t e i s s a + m a t k a k o h t e i t a + m a t k a k o r t i n + m a t k a k o r t t i + m a t k a k o r v a u k s e t + m a t k a k o r v a u k s i a + m a t k a k o r v a u k s i e n + m a t k a k o r v a u k s i i n + m a t k a k o r v a u k s i s s a + m a t k a k o r v a u k s i s t a + m a t k a k o r v a u s + m a t k a k o r v a u s j ä r j e s t e l m ä + m a t k a k o r v a u s j ä r j e s t e l m ä h ä n + m a t k a k o r v a u s j ä r j e s t e l m ä n + m a t k a k o r v a u s j ä r j e s t e l m ä n s ä + m a t k a k o r v a u s j ä r j e s t e l m ä ä + m a t k a k o r v a u s j ä r j e s t e l m ä ä n + m a t k a k o r v a u s s ä ä n n ö t + m a t k a k o r v a u s t a + m a t k a k o r v a u s t e m m e + m a t k a k o r v a u s t e n + m a t k a k u l u i h i n + m a t k a k u l u i l l a + m a t k a k u l u i s t a + m a t k a k u l u i s t a a n + m a t k a k u l u j a + m a t k a k u l u j a m m e + m a t k a k u l u j e n + m a t k a k u l u j ä r j e s t e l m ä + m a t k a k u l u j ä r j e s t e l m ä l l ä + m a t k a k u l u k o r v a u k s e t + m a t k a k u l u k o r v a u k s i a + m a t k a k u l u k o r v a u k s i s s a + m a t k a k u l u k o r v a u k s i s t a + m a t k a k u l u k o r v a u s j ä r j e s t e l m ä ä + m a t k a k u l u k o r v a u s t e n + m a t k a k u l u t + m a t k a k u m p p a n e i d e n s a + m a t k a k u m p p a n e i t a + m a t k a k u m p p a n i + m a t k a k u s t a n n u k s e t + m a t k a k u s t a n n u k s i a + m a t k a k u s t a n n u k s i s t a + m a t k a k u s t a n n u s a s i a n + m a t k a k u s t a n n u s t e n + m a t k a l a s k u j a + m a t k a l a u k k u a + m a t k a l a u k k u d i p l o m a t i a + m a t k a l a u k k u j e n + m a t k a l a u k k u l a p s i + m a t k a l l a + m a t k a l l a n i + m a t k a l l e + m a t k a m u i s t o m y y m ä l ö i s t ä + m a t k a n + m a t k a n j ä r j e s t ä j i e n + m a t k a n j ä r j e s t ä j i i n + m a t k a n j ä r j e s t ä j i l l e + m a t k a n j ä r j e s t ä j i l t ä + m a t k a n j ä r j e s t ä j i ä + m a t k a n j ä r j e s t ä j ä + m a t k a n j ä r j e s t ä j ä l t ä + m a t k a n j ä r j e s t ä j ä n + m a t k a n j ä r j e s t ä j ä n s ä + m a t k a n j ä r j e s t ä j ä t + m a t k a n r e k i s t e r ö i n t i l a i t e + m a t k a n s a + m a t k a n v i e s t i n t ä a l a + m a t k a o h j e l m a a n n e + m a t k a o p a s + m a t k a o p p a a t + m a t k a p a h o i n v o i n t i + m a t k a p a k e t e i s s a + m a t k a p a k e t e i s t a + m a t k a p a k e t i s t a + m a t k a p a k e t i t + m a t k a p a k e t t e i h i n + m a t k a p a k e t t e j a + m a t k a p a k e t t i + m a t k a p a k e t t i a + m a t k a p a k e t t i d i r e k t i i v i + m a t k a p a k e t t i d i r e k t i i v i k s i + m a t k a p a k e t t i d i r e k t i i v i n + m a t k a p a k e t t i d i r e k t i i v i s s ä + m a t k a p a k e t t i d i r e k t i i v i ä + m a t k a p a k e t t i e n + m a t k a p a l v e l u i d e n + m a t k a p a l v e l u i s s a + m a t k a p a l v e l u i t a + m a t k a p a l v e l u j a + m a t k a p a l v e l u j e n + m a t k a p a r k k i + m a t k a p a s s i + m a t k a p u h e l i m e e n + m a t k a p u h e l i m e l l a + m a t k a p u h e l i m e l l a k i n + m a t k a p u h e l i m e l l a n i + m a t k a p u h e l i m e n + m a t k a p u h e l i m e n i + m a t k a p u h e l i m e n s a + m a t k a p u h e l i m e s s a + m a t k a p u h e l i m e s s a n n e + m a t k a p u h e l i m e s t a + m a t k a p u h e l i m e s t a n i + m a t k a p u h e l i m e s t a n n e + m a t k a p u h e l i m e t + m a t k a p u h e l i m i a + m a t k a p u h e l i m i a a n + m a t k a p u h e l i m i e n + m a t k a p u h e l i m i i n + m a t k a p u h e l i m i l l a + m a t k a p u h e l i m i l l a a n + m a t k a p u h e l i m i l l e + m a t k a p u h e l i m i s s a + m a t k a p u h e l i m i s t a + m a t k a p u h e l i n + m a t k a p u h e l i n a l a + m a t k a p u h e l i n a l a l l a + m a t k a p u h e l i n a l a n + m a t k a p u h e l i n a l a s t a + m a t k a p u h e l i n a n t e n n e j a + m a t k a p u h e l i n a s i a k k a a t + m a t k a p u h e l i n j ä r j e s t e l m i e n + m a t k a p u h e l i n j ä r j e s t e l m ä + m a t k a p u h e l i n j ä r j e s t e l m ä n + m a t k a p u h e l i n j ä r j e s t ö j e n + m a t k a p u h e l i n k a u p a s s a + m a t k a p u h e l i n k a u p p a + m a t k a p u h e l i n k e s k u s t e l u j a + m a t k a p u h e l i n k i u s a a m i s e n + m a t k a p u h e l i n k ä y t t ö ä + m a t k a p u h e l i n l a s k u i s t a + m a t k a p u h e l i n l a s k u n s a + m a t k a p u h e l i n l i i k e n n e + m a t k a p u h e l i n l i i k e n n e t t ä + m a t k a p u h e l i n l i i k e n t e e n + m a t k a p u h e l i n m a i n o n t a a + m a t k a p u h e l i n m a k s u i h i n + m a t k a p u h e l i n m a k s u j e n + m a t k a p u h e l i n m a r k k i n a t + m a t k a p u h e l i n m a r k k i n o i d e n + m a t k a p u h e l i n m a r k k i n o i l l a + m a t k a p u h e l i n m a s t o j a + m a t k a p u h e l i n n u m e r o a + m a t k a p u h e l i n n u m e r o i d e n + m a t k a p u h e l i n n u m e r o n + m a t k a p u h e l i n o p e r a a t t o r e i d e n + m a t k a p u h e l i n o p e r a a t t o r e i t a + m a t k a p u h e l i n o p e r a a t t o r i + m a t k a p u h e l i n o p e r a a t t o r i a + m a t k a p u h e l i n o p e r a a t t o r i e n + m a t k a p u h e l i n o p e r a a t t o r i n + m a t k a p u h e l i n o p e r a a t t o r i t + m a t k a p u h e l i n p a l v e l u a + m a t k a p u h e l i n p a l v e l u i s s a a n + m a t k a p u h e l i n p a l v e l u j e n + m a t k a p u h e l i n p a l v e l u n + m a t k a p u h e l i n p a l v e l u n t a r j o a j i e n + m a t k a p u h e l i n p a l v e l u t + m a t k a p u h e l i n p ä ä t t e e l l ä + m a t k a p u h e l i n s t a n d a r d i i n + m a t k a p u h e l i n t a + m a t k a p u h e l i n t a a n + m a t k a p u h e l i n t e k n i i k a n + m a t k a p u h e l i n t e k n i i k a s s a + m a t k a p u h e l i n t e k n i i k a s t a + m a t k a p u h e l i n t e k n i i k k a + m a t k a p u h e l i n t e k n i i k k a a n + m a t k a p u h e l i n t e k n o l o g i a a + m a t k a p u h e l i n t e k n o l o g i a n + m a t k a p u h e l i n t e l i n e i l l ä + m a t k a p u h e l i n t e n + m a t k a p u h e l i n t e n s a + m a t k a p u h e l i n t e o l l i s u u d e n + m a t k a p u h e l i n t e o l l i s u u s + m a t k a p u h e l i n t u k i a s e m a t + m a t k a p u h e l i n v a l m i s t a j a t + m a t k a p u h e l i n v a l m i s t u k s e s s a + m a t k a p u h e l i n v a r k a u k s i a + m a t k a p u h e l i n v a r k a u k s i e n + m a t k a p u h e l i n v e r k k o + m a t k a p u h e l i n v e r k k o j a + m a t k a p u h e l i n v e r k k o j e n + m a t k a p u h e l i n v e r k k o m m e + m a t k a p u h e l i n v e r k k o s u k u p o l v i i n + m a t k a p u h e l i n v e r k o i s s a + m a t k a p u h e l i n v e r k o n + m a t k a p u h e l i n v e r k o s s a + m a t k a p u h e l i n v e r k o s t o n + m a t k a p u h e l i n v e r k o t + m a t k a p u h e l i n v i e s t i e n + m a t k a p u h e l i n v i e s t i n n ä n + m a t k a p u h e l i n v i e s t i n n ä s s ä + m a t k a p u h e l i n v i e s t i n t ä + m a t k a p u h e l i n v i r u s + m a t k a p u h e l i n y h t e y d e t + m a t k a p u h e l i n y h t i ö i d e n + m a t k a p u h e l i n y h t i ö i t ä + m a t k a p u h e l i n y h t i ö t + m a t k a p u h e l i n y r i t y k s e n + m a t k a p u h e l i n y r i t y s t ä + m a t k a p u h e l u h i n t o j e n + m a t k a p u h e l u i s t a + m a t k a p u h e l u j e n + m a t k a p u h e l u l i i k e n t e e n + m a t k a p u h e l u t + m a t k a p ä i v ä k i r j o j a + m a t k a p ä i v ä t + m a t k a r a h a t + m a t k a r a j o i t u k s e t + m a t k a r a p o r t t i a m m e + m a t k a r a t s a s t u s + m a t k a r e i t t e j ä + m a t k a s i r k u s + m a t k a s o p i m u k s e e n + m a t k a s t a + m a t k a s u u n n i t e l m a t + m a t k a s u u n n i t e l m i a + m a t k a s u u n n i t e l m i a n i + m a t k a t + m a t k a t a v a r a k y s y m y s + m a t k a t a v a r a n + m a t k a t a v a r a t + m a t k a t a v a r o i d e n + m a t k a t a v a r o i l t a + m a t k a t a v a r o i s s a + m a t k a t a v a r o i s t a + m a t k a t a v a r o i t a + m a t k a t e l e v i s i o + m a t k a t e l e v i s i o i s s a + m a t k a t e s s a a n + m a t k a t i e t o j e n + m a t k a t i l i l l e + m a t k a t o i m i s t o + m a t k a t o i m i s t o a l a n + m a t k a t o i m i s t o a s i a + m a t k a t o i m i s t o i h i n s a + m a t k a t o i m i s t o i l l e + m a t k a t o i m i s t o i l t a + m a t k a t o i m i s t o i l t a a n + m a t k a t o i m i s t o i s s a + m a t k a t o i m i s t o i s t a + m a t k a t o i m i s t o j a + m a t k a t o i m i s t o j e m m e + m a t k a t o i m i s t o j e n + m a t k a t o i m i s t o l l a + m a t k a t o i m i s t o n + m a t k a t o i m i s t o s s a + m a t k a t o i m i s t o s t a + m a t k a t o i m i s t o t + m a t k a t o i m i s t o v i r k a i l i j o i s t a + m a t k a t u k i v a k u u t u k s e l l a + m a t k a t u o t t e i d e n + m a t k a t u o t t e i t a + m a t k a t u r v a + m a t k a v a i h t o e h t o j a + m a t k a v a i h t o e h t o j e n + m a t k a v a k u u t u k s e n + m a t k a v a k u u t u s + m a t k a v a k u u t u s j ä r j e s t e l m ä + m a t k a v a k u u t u s t a + m a t k a v a k u u t u s t e n + m a t k a v a l m i s t e l u j e n + m a t k a v a r a u s t e n + m a t k a v a r o i t u k s e n + m a t k a v e r k k o j e n + m a t k a v e r o o n + m a t k a v i e s t i m e t + m a t k a v i e s t i n a l a l l a + m a t k a v i e s t i n j ä r j e s t e l m ä n + m a t k a v i e s t i n k ä y t t ä j i e n + m a t k a v i e s t i n l a i t t e i d e n + m a t k a v i e s t i n l i s e n s s e j ä + m a t k a v i e s t i n m a r k k i n a t + m a t k a v i e s t i n m u o d o s s a + m a t k a v i e s t i n n ä n + m a t k a v i e s t i n n ä s s ä + m a t k a v i e s t i n o p e r a a t t o r i t + m a t k a v i e s t i n p a l v e l u i h i n + m a t k a v i e s t i n p a l v e l u j a + m a t k a v i e s t i n t e k n i i k k a + m a t k a v i e s t i n t ä + m a t k a v i e s t i n t ä a l a n + m a t k a v i e s t i n t ä m a r k k i n o i t a + m a t k a v i e s t i n t ä p a l v e l u i h i n + m a t k a v i e s t i n t ä s e k t o r i l l e + m a t k a v i e s t i n t ä t e k n i i k a n + m a t k a v i e s t i n t ä t e k n i i k k a a n + m a t k a v i e s t i n t ä t e o l l i s u u s + m a t k a v i e s t i n t ä v e r k k o j e n + m a t k a v i e s t i n t ä v e r k o i l l e + m a t k a v i e s t i n t ä v ä l i n e i d e n + m a t k a v i e s t i n t ä ä + m a t k a v i e s t i n t ä ä n + m a t k a v i e s t i n v e r k k o + m a t k a v i e s t i n v e r k k o j e n + m a t k a v i e s t i n v e r k o i s s a + m a t k a v i r k a i l i j a t + m a t k a y h t i ö n + m a t k a y h t i ö t + m a t k i j a k i u r u + m a t k i j a l i n t u h a u k k a + m a t k i j a m e s i k k o + m a t k i j a n a u k u j a + m a t k i j a v ä l s k ä r i + m a t k i m i s l a i n s ä ä d ä n t ö ä + m a t k o i h i n + m a t k o i l l a + m a t k o i l l a n i + m a t k o j a + m a t k o j e n + m a t k o j e n s a + m a t k u s t a a + m a t k u s t a a k s e e n + m a t k u s t a e s s a a n + m a t k u s t a e s s a m m e + m a t k u s t a e s s a n i + m a t k u s t a j a a + m a t k u s t a j a h e n k i l ö t i e t o j a + m a t k u s t a j a j u n a + m a t k u s t a j a j u n a l l a + m a t k u s t a j a j u n a t + m a t k u s t a j a j u n i a + m a t k u s t a j a j u n i e n + m a t k u s t a j a j u n i i n + m a t k u s t a j a j u n i s s a + m a t k u s t a j a j ä r j e s t ö j e n + m a t k u s t a j a k i l o m e t r e i s s ä + m a t k u s t a j a k i l o m e t r i ä + m a t k u s t a j a k o n e + m a t k u s t a j a k o n e i s t a + m a t k u s t a j a k u l j e t u k s i s t a a n + m a t k u s t a j a l a i v a + m a t k u s t a j a l a i v a l u o k i s t a + m a t k u s t a j a l a i v a n + m a t k u s t a j a l a i v a t + m a t k u s t a j a l a i v o i l l a + m a t k u s t a j a l a i v o i l l e + m a t k u s t a j a l a i v o i s s a + m a t k u s t a j a l a i v o j a + m a t k u s t a j a l a i v o j e n + m a t k u s t a j a l a u t a t + m a t k u s t a j a l a u t t a + m a t k u s t a j a l a u t t a a n + m a t k u s t a j a l a u t t o j e n + m a t k u s t a j a l e n n o t + m a t k u s t a j a l e n n o t k a a n + m a t k u s t a j a l e n t o k o n e e t + m a t k u s t a j a l e n t o k o n e i d e n + m a t k u s t a j a l e n t o k o n e i s s a + m a t k u s t a j a l e n t o l i i k e n n e t t ä + m a t k u s t a j a l e n t o l i i k e n t e e n + m a t k u s t a j a l e n t o l i i k e n t e e s s ä + m a t k u s t a j a l i i k e n n e + m a t k u s t a j a l i i k e n n e j ä r j e s t e l m ä + m a t k u s t a j a l i i k e n n e j ä r j e s t e l m ä n + m a t k u s t a j a l i i k e n n e m a r k k i n o i d e n + m a t k u s t a j a l i i k e n n e m a r k k i n o i h i n + m a t k u s t a j a l i i k e n n e m a r k k i n o i l l a + m a t k u s t a j a l i i k e n n e m a r k k i n o i t a a n + m a t k u s t a j a l i i k e n n e o s u u k s i e n + m a t k u s t a j a l i i k e n n e p a l v e l u j a + m a t k u s t a j a l i i k e n n e p a l v e l u j e n + m a t k u s t a j a l i i k e n n e t o i m i j a t + m a t k u s t a j a l i i k e n n e t t ä + m a t k u s t a j a l i i k e n n e v e r k o t + m a t k u s t a j a l i i k e n t e e l l e + m a t k u s t a j a l i i k e n t e e l t ä + m a t k u s t a j a l i i k e n t e e n + m a t k u s t a j a l i i k e n t e e n k i n + m a t k u s t a j a l i i k e n t e e s e e n + m a t k u s t a j a l i i k e n t e e s s ä + m a t k u s t a j a l i i k e n t e e s t ä + m a t k u s t a j a l l a + m a t k u s t a j a l u e t t e l o + m a t k u s t a j a l u e t t e l o i d e n + m a t k u s t a j a l u e t t e l o i s t a + m a t k u s t a j a l u e t t e l o i t a + m a t k u s t a j a l u e t t e l o j a + m a t k u s t a j a l u e t t e l o j e n + m a t k u s t a j a l u e t t e l o n + m a t k u s t a j a l u e t t e l o t + m a t k u s t a j a l u e t t e l o t i e t o j a + m a t k u s t a j a m a k s u t + m a t k u s t a j a m ä ä r i e n + m a t k u s t a j a m ä ä r i i n + m a t k u s t a j a m ä ä r i l l e + m a t k u s t a j a m ä ä r ä + m a t k u s t a j a m ä ä r ä l l e + m a t k u s t a j a m ä ä r ä n + m a t k u s t a j a m ä ä r ä t + m a t k u s t a j a m ä ä r ä ä + m a t k u s t a j a n + m a t k u s t a j a n a + m a t k u s t a j a p a i k k o j a + m a t k u s t a j a p a l v e l u i h i n + m a t k u s t a j a p a l v e l u i l l e + m a t k u s t a j a p a l v e l u i s s a + m a t k u s t a j a p a l v e l u i s t a + m a t k u s t a j a p a l v e l u i t a + m a t k u s t a j a p a l v e l u j a + m a t k u s t a j a p a l v e l u j e n + m a t k u s t a j a p a l v e l u t + m a t k u s t a j a r e k i s t e r e i d e n + m a t k u s t a j a r e k i s t e r e j ä + m a t k u s t a j a r e k i s t e r i + m a t k u s t a j a r e k i s t e r i e n + m a t k u s t a j a r e k i s t e r i j ä r j e s t e l m ä ä + m a t k u s t a j a r e k i s t e r i j ä r j e s t e l m ä ä n + m a t k u s t a j a r e k i s t e r i n + m a t k u s t a j a r e k i s t e r i s o p i m u k s e n + m a t k u s t a j a r e k i s t e r i s s ä + m a t k u s t a j a r e k i s t e r i t + m a t k u s t a j a r e k i s t e r i t i e d o i s t a + m a t k u s t a j a r e k i s t e r i t i e d o t + m a t k u s t a j a r e k i s t e r i t i e t o i h i n + m a t k u s t a j a r e k i s t e r i t i e t o j a + m a t k u s t a j a r e k i s t e r i t i e t o j e n + m a t k u s t a j a r e k i s t e r i t i e t o j ä r j e s t e l m ä + m a t k u s t a j a r e k i s t e r i t i e t o j ä r j e s t e l m ä n + m a t k u s t a j a r e k i s t e r i t i e t o j ä r j e s t e l m ä n s ä + m a t k u s t a j a r e k i s t e r i t i e t o j ä r j e s t e l m ä ä + m a t k u s t a j a r e k i s t e r i t i e t o p a k e t t i a + m a t k u s t a j a r e k i s t e r i t i e t o s o p i m u k s e s t a + m a t k u s t a j a r e k i s t e r i t i e t o s o p i m u s t a + m a t k u s t a j a r e k i s t e r i t i e t o t a p a u s + m a t k u s t a j a r e k i s t e r i ä + m a t k u s t a j a r y h m ä ä + m a t k u s t a j a s a t a m a + m a t k u s t a j a s i s ä l i i k e n n e p a l v e l u j e n + m a t k u s t a j a s t a + m a t k u s t a j a s u i h k u k o n e e n + m a t k u s t a j a t + m a t k u s t a j a t a r k a s t u k s i a + m a t k u s t a j a t i e d o i l l e + m a t k u s t a j a t i e d o i s t a + m a t k u s t a j a t i e d o t + m a t k u s t a j a t i e t o i h i n + m a t k u s t a j a t i e t o j a + m a t k u s t a j a t i e t o j a m m e + m a t k u s t a j a t i e t o j e n + m a t k u s t a j a t i e t o j ä r j e s t e l m ä s t ä + m a t k u s t a j a t i l a a n + m a t k u s t a j a t i l a n + m a t k u s t a j a t u r v a l l i s u u d e l l e + m a t k u s t a j a t u r v a l l i s u u d e n + m a t k u s t a j a t u r v a l l i s u u d e s t a + m a t k u s t a j a t u r v a l l i s u u t t a + m a t k u s t a j a v a u n u i h i n + m a t k u s t a j a v i r r a n + m a t k u s t a j a v i r r a t + m a t k u s t a j a v i r t o j a + m a t k u s t a j a v i r t o j e n + m a t k u s t a j a y h d i s t y s t e n + m a t k u s t a j a y s t ä v ä l l i s e t + m a t k u s t a j i a + m a t k u s t a j i e n + m a t k u s t a j i i n + m a t k u s t a j i l l a + m a t k u s t a j i l l e + m a t k u s t a j i s t a + m a t k u s t a m a a n + m a t k u s t a m a t t a + m a t k u s t a m i s e e n + m a t k u s t a m i s e n + m a t k u s t a m i s e s s a + m a t k u s t a m i s e s t a + m a t k u s t a m i s l u p a j ä r j e s t e l m ä + m a t k u s t a m i s m u k a v u u t t a + m a t k u s t a m i s o i k e u t t a + m a t k u s t a m i s v a p a u d e n + m a t k u s t a m m e + m a t k u s t a m o h e n k i l ö k u n n a l l a + m a t k u s t a m o h e n k i l ö k u n n a n + m a t k u s t a m o h e n k i l ö k u n t a + m a t k u s t a m o h e n k i l ö k u n t a a + m a t k u s t a m o h e n k i l ö s t ö + m a t k u s t a m o h e n k i l ö s t ö l l e + m a t k u s t a m o h e n k i l ö s t ö n + m a t k u s t a m o h e n k i l ö s t ö ä + m a t k u s t a m o m i e h i s t ö + m a t k u s t a m o m i e h i s t ö d i r e k t i i v i + m a t k u s t a m o m i e h i s t ö i s t ä + m a t k u s t a m o m i e h i s t ö j ä + m a t k u s t a m o m i e h i s t ö l l e + m a t k u s t a m o m i e h i s t ö l l ä + m a t k u s t a m o m i e h i s t ö n + m a t k u s t a m o m i e h i s t ö s s ä + m a t k u s t a m o m i e h i s t ö s t ä + m a t k u s t a m o m i e h i s t ö t + m a t k u s t a m o m i e h i s t ö ä + m a t k u s t a m o m i e h i s t ö ö n + m a t k u s t a m o n + m a t k u s t a m o o n + m a t k u s t a m o t u r v a l l i s u u t e e n + m a t k u s t a n + m a t k u s t a n e i d e n + m a t k u s t a n u t + m a t k u s t a v a i s t e n + m a t k u s t a v a l l a + m a t k u s t a v a n a + m a t k u s t a v a t + m a t k u s t a v i a + m a t k u s t a v i e n + m a t k u s t a v i i n + m a t k u s t a v i l l e + m a t k u s t a v i s t a + m a t k u s t e l l e e n + m a t k u s t e t t a e s s a + m a t k u s t e t t a v a + m a t k u s t e t t u a a n + m a t k u s t i n + m a t k u s t u s a i k a a + m a t k u s t u s a i k a t a u l u a + m a t k u s t u s a i k a t a u l u u n + m a t k u s t u s a l u e + m a t k u s t u s a l u e e s t a + m a t k u s t u s a s i a k i r j a + m a t k u s t u s a s i a k i r j a a + m a t k u s t u s a s i a k i r j a j ä l j e n n ö s t e n + m a t k u s t u s a s i a k i r j a j ä l j i t e l m i e n + m a t k u s t u s a s i a k i r j a k s i + m a t k u s t u s a s i a k i r j a n a + m a t k u s t u s a s i a k i r j a t + m a t k u s t u s a s i a k i r j o i h i n + m a t k u s t u s a s i a k i r j o i k s i + m a t k u s t u s a s i a k i r j o i s s a + m a t k u s t u s a s i a k i r j o i s t a + m a t k u s t u s a s i a k i r j o j a + m a t k u s t u s a s i a k i r j o j e n + m a t k u s t u s h a l u s t a + m a t k u s t u s h i s t o r i a + m a t k u s t u s j ä r j e s t e l m ä n + m a t k u s t u s j ä r j e s t e l m ä s t ä + m a t k u s t u s j ä r j e s t e l m ä ä n + m a t k u s t u s j ä r j e s t e l y i s t ä + m a t k u s t u s j ä r j e s t e l y j e n + m a t k u s t u s j ä r j e s t e l y j ä + m a t k u s t u s j ä r j e s t e l y t + m a t k u s t u s k a a o s + m a t k u s t u s k e i n o + m a t k u s t u s k e i n o j a + m a t k u s t u s k e i n o n a + m a t k u s t u s k i e l l o i s t a + m a t k u s t u s k i e l l o n + m a t k u s t u s k i e l l o s s a + m a t k u s t u s k i e l l o s t a + m a t k u s t u s k i e l l o t + m a t k u s t u s k i e l t o + m a t k u s t u s k i e l t o a + m a t k u s t u s k i e l t o i h i n + m a t k u s t u s k i e l t o j a + m a t k u s t u s k i e l t o j e n + m a t k u s t u s k i e l t o o n + m a t k u s t u s k i l o m e t r i l l e + m a t k u s t u s k o k e m u k s e e n + m a t k u s t u s k u l t t u u r i a + m a t k u s t u s k u l u j a + m a t k u s t u s k u l u t + m a t k u s t u s k u s t a n n u k s e t + m a t k u s t u s k u s t a n n u k s i a + m a t k u s t u s k u s t a n n u k s i s t a + m a t k u s t u s k y s y n n ä n + m a t k u s t u s k ä y t ä n n ö n + m a t k u s t u s l u o k i s s a + m a t k u s t u s l u o k k a + m a t k u s t u s l u p a + m a t k u s t u s l u p a a n + m a t k u s t u s l u p a j ä r j e s t e l m ä + m a t k u s t u s l u p a j ä r j e s t e l m ä n + m a t k u s t u s l u p a j ä r j e s t e l m ä ä + m a t k u s t u s l u p i e n + m a t k u s t u s l u v a n + m a t k u s t u s m a h d o l l i s u u d e t + m a t k u s t u s m a h d o l l i s u u k s i a + m a t k u s t u s m a h d o l l i s u u k s i e n + m a t k u s t u s m u k a v u u d e s t a + m a t k u s t u s m u k a v u u s + m a t k u s t u s m u o t o + m a t k u s t u s m u o t o i h i n + m a t k u s t u s o h j e e t + m a t k u s t u s o h j e i t a + m a t k u s t u s o i k e u d e n + m a t k u s t u s o i k e u s + m a t k u s t u s o i k e u s r a j o i t u s t e n + m a t k u s t u s o l o j a + m a t k u s t u s o l o s u h t e e t + m a t k u s t u s o n g e l m i a + m a t k u s t u s p u l m i e n s a + m a t k u s t u s r a j o i t t e e t + m a t k u s t u s r a j o i t t e i t a + m a t k u s t u s r a j o i t u k s e t + m a t k u s t u s r a j o i t u k s i a + m a t k u s t u s r a j o i t u k s i e n + m a t k u s t u s r a j o i t u k s i s t a + m a t k u s t u s r a j o i t u s t a + m a t k u s t u s r a j o i t u s t e n + m a t k u s t u s r u m b a a n + m a t k u s t u s s a a m i s i a + m a t k u s t u s s i r k u k s e e n + m a t k u s t u s s i r k u k s e l l e + m a t k u s t u s s i r k u k s e m m e + m a t k u s t u s s i r k u k s e n + m a t k u s t u s s i r k u k s e s s a + m a t k u s t u s s i r k u s + m a t k u s t u s s u u n t a a n + m a t k u s t u s t a r k o i t u k s i a + m a t k u s t u s t a v o i s t a + m a t k u s t u s t i e t o i h i n + m a t k u s t u s t i e t o j a + m a t k u s t u s t i l a n n e + m a t k u s t u s v a i h t o e h t o j e n + m a t k u s t u s v a i k e u d e t + m a t k u s t u s v a p a u d e n + m a t k u s t u s v a p a u s + m a t k u s t u s v a p a u t t a + m a t k u s t u s v a r o i t u s + m a t k u s t u s v i i s u m i + m a t o e t a n a + m a t o k s i + m a t o l ä ä k e t t ä + m a t o n + m a t r i i s i e k v i v a l e n s s i + m a t r i i s i e l e m e n t t i + m a t r i i s i o r g a n i s a a t i o + m a t t o j a + m a t t o j e n + m a t t o p o m m i t u s + m a t t o p y t o n + m a t t o t e h t a i s s a + m a t u r i t e e t t i p r o f i i l i + m a t u r i t e e t t i p r o f i i l i i n + m a t u r i t e e t t i s t r a t e g i a + m a u k k a i m m i s t a + m a u r i t a n i a l a i s i a + m a u s t a m i s t a + m a u s t e i t a + m a u s t e k a s v i t + m a u s t e k u r k k u + m a u s t e s a a r i l l a + m a u s t e s e k o i t u k s i a + m a u s t e t e o l l i s u u s + m a u s t e t u p a k k a a + m a u s t e y r t i t + m a u s t e y r t t e i h i n + m a u t t o m i s t a + m a y a k a l e n t e r i + m a y a k a n s a t + m a y a k e t s a a l i + m a y a k i e l e t + m e d i a a + m e d i a a n i t u l o o n + m e d i a a n i t u l o s t a + m e d i a e d u s t a j a n s a + m e d i a h e n k i l ö i d e n + m e d i a h y s t e r i a a + m e d i a h y s t e r i a n + m e d i a i m p e r i u m i a + m e d i a i m p e r i u m i n + m e d i a i m p e r i u m i n s a + m e d i a i n t r e s s i e n s ä + m e d i a j u l k i s u u t t a + m e d i a j ä r j e s t e l m i s s ä + m e d i a j ä r j e s t e l m ä + m e d i a j ä r j e s t e l m ä n + m e d i a j ä r j e s t e l m ä ä + m e d i a j ä t t i l ä i s e t + m e d i a k a m p a n j a l l a + m e d i a k a m p a n j o i t a + m e d i a k a n a v a t + m e d i a k a n a v i a + m e d i a k a n a v i e n + m e d i a k a s v a t u k s e n + m e d i a k a s v a t u k s e s t a + m e d i a k a s v a t u s + m e d i a k a s v a t u s t a + m e d i a k e i s a r i t + m e d i a k e n t t ä m m e + m e d i a k e s k u k s e n + m e d i a k e s k u s t a + m e d i a k o k o n a i s u u t t a + m e d i a k o m p e t e n s s i + m e d i a k o n t r o l l i + m e d i a k r i i t i k o t + m e d i a k r i i t t i s y y d e n + m e d i a l a e i s t a + m e d i a l a i l l a + m e d i a l a i n + m e d i a l a i n s ä ä d ä n n ö n + m e d i a l a i n s ä ä d ä n n ö s t ä + m e d i a l a i n s ä ä d ä n n ö s t ä ä n + m e d i a l a i n s ä ä d ä n t ö + m e d i a l a i s t a + m e d i a l a k e i h i n s a + m e d i a l a k i + m e d i a l a k i a + m e d i a l a k i a n s a + m e d i a l a k i i n + m e d i a l a k i n s a + m e d i a l u k u t a i d o n + m e d i a l u k u t a i d o s t a + m e d i a l u k u t a i t o + m e d i a l u k u t a i t o a + m e d i a l y n k k a u s t a + m e d i a l ä h e s t y m i s t a p a + m e d i a m a a i l m a l l e + m e d i a m a h t i e n + m e d i a m a i s e m a a + m e d i a m a l l i l l e + m e d i a m a l l i n + m e d i a m a r k k i n a t + m e d i a m a r k k i n o i d e n + m e d i a m o g u l i + m e d i a m o g u l i n + m e d i a m o n o p o l e j a + m e d i a m o n o p o l i e n + m e d i a m y r s k y n + m e d i a n e u v o s t o + m e d i a n e u v o s t o n + m e d i a n ä y t ö s + m e d i a o h j e l m i a + m e d i a o i k e u k s i a + m e d i a o i k e u k s i e n + m e d i a o m i s t a j a n a + m e d i a o m i s t u k s e n + m e d i a o m i s t u s t a + m e d i a o r g a n i s a a t i o i d e n + m e d i a o r g a n i s a a t i o i l l e + m e d i a p a l v e l u + m e d i a p a l v e l u i d e n + m e d i a p a l v e l u i h i n + m e d i a p a l v e l u i l l e + m e d i a p a l v e l u j a + m e d i a p a l v e l u j e n + m e d i a p a l v e l u n + m e d i a p a l v e l u t + m e d i a p a m p p u + m e d i a p e r u s t u s l a i n + m e d i a p e r u s t u s l a k i + m e d i a p l u r a l i s m i n + m e d i a p o l i t i i k a n + m e d i a p o l i t i i k a s s a m m e + m e d i a p o l i t i i k k a + m e d i a p o l i t i i k k a a + m e d i a p o l i t i i k k a a n + m e d i a p u h e e s s a a n + m e d i a r i k o k s i a + m e d i a r y h m i t t y m ä s s ä + m e d i a s e u r a n t a a + m e d i a s i r k u k s e n + m e d i a s i r k u k s i k s i + m e d i a s i r k u s + m e d i a s i s ä l l ö n + m e d i a s i s ä l l ö s t ä + m e d i a s i s ä l t ö j ä + m e d i a s i s ä l t ö ä + m e d i a s o i t i n + m e d i a s o i t t i m i s t a + m e d i a s o t i a + m e d i a s p e k t a a k k e l i + m e d i a t a i d e + m e d i a t a l o s s a + m e d i a t a p a h t u m a + m e d i a t a p a h t u m a a + m e d i a t a p a h t u m a k s i + m e d i a t a p a h t u m i a + m e d i a t a r j o n n a s t a + m e d i a t a v o i s t a + m e d i a t e m p p u n a + m e d i a t e m p u t + m e d i a t e o l l i s u u d e s s a + m e d i a t e r r o r i s m i l l e + m e d i a t i e t o i n e n + m e d i a t i e t o j e n + m e d i a t o i m i s t a + m e d i a t u o t e + m e d i a t u o t t e i l t a + m e d i a t u t k i m u s + m e d i a v a i k u t u k s e n + m e d i a v a i k u t u s + m e d i a v a l l a n + m e d i a v a l t a + m e d i a v a l t a a + m e d i a v a p a u s + m e d i a v e t o i s e n + m e d i a v i e s t i n n ä n + m e d i a v i r a n o m a i s v e r k o s t o + m e d i a v ä k i v a l t a + m e d i a y h t i ö i d e n + m e d i a y h t i ö i l l e + m e d i a y m p ä r i s t ö + m e d i a y m p ä r i s t ö m m e + m e d i a y m p ä r i s t ö n + m e d i a y m p ä r i s t ö ä + m e d i a y m p ä r i s t ö ö n + m e d i a y r i t y k s e t + m e d i a y r i t y k s i l l e + m e d i a y r i t y k s i s s ä + m e d i a y r i t y s t e n + m e g a f o n i d i p l o m a t i a + m e g a f o n i d i p l o m a t i a a + m e g a f o n i d i p l o m a t i a a n + m e g a h e r t s i m y y t t i + m e g a n + m e g a o n g e l m a n + m e g a o p e r a a t i o o n + m e g a r e k k o j e n + m e g a r i s k i + m e g a t a v u l t a + m e g a t e k n o l o g i a a n + m e g a t i e d e + m e g a v i s a + m e g a w a t t i + m e g a w a t t i a + m e g a w a t t i t u n t i + m e g a w a t t i t u n t i i n + m e h i l ä i s a l a a + m e h i l ä i s a l a n + m e h i l ä i s e n h o i d o n + m e h i l ä i s e t + m e h i l ä i s h a u k k a + m e h i l ä i s h o i d o n + m e h i l ä i s h o i d o s t a + m e h i l ä i s h o i t a j a m m e + m e h i l ä i s h o i t a j i a + m e h i l ä i s h o i t a j i e n + m e h i l ä i s h o i t a j i s t a + m e h i l ä i s h o i t o + m e h i l ä i s h o i t o a + m e h i l ä i s h o i t o a l a + m e h i l ä i s h o i t o a l a a + m e h i l ä i s h o i t o a l a l l a + m e h i l ä i s h o i t o a l a l l e + m e h i l ä i s h o i t o a l a n + m e h i l ä i s h o i t o a l a s t a + m e h i l ä i s h o i t o j ä r j e s t ö t + m e h i l ä i s h o i t o t o i m i n t a a + m e h i l ä i s h o i t o t o i m i n t a a n + m e h i l ä i s i i n + m e h i l ä i s i l l e + m e h i l ä i s i l l ä + m e h i l ä i s i s t ä + m e h i l ä i s i ä + m e h i l ä i s k a n n a n + m e h i l ä i s k a n n a s t a + m e h i l ä i s k a n n a s t a a n + m e h i l ä i s k a n n a t + m e h i l ä i s k a n t a + m e h i l ä i s k a n t a a + m e h i l ä i s k a n t o j e n + m e h i l ä i s k u n i n g a t a r + m e h i l ä i s k u n i n g a t t a r e n + m e h i l ä i s k u o l e m a t + m e h i l ä i s k u o l e m i e n + m e h i l ä i s k u o l e m i i n + m e h i l ä i s k u o l l e i s u u d e n + m e h i l ä i s k u o l l e i s u u d e s t a + m e h i l ä i s k u o l l e i s u u s + m e h i l ä i s k u o l l e i s u u t e e n + m e h i l ä i s k u o l l e i s u u t t a + m e h i l ä i s o h j e l m i e n + m e h i l ä i s p e s i e n + m e h i l ä i s p e s i e n s ä + m e h i l ä i s p o p u l a a t i o i d e n + m e h i l ä i s p o p u l a a t i o i l l e + m e h i l ä i s p o p u l a a t i o n + m e h i l ä i s p ö l y t y k s e s t ä + m e h i l ä i s s a i r a u k s i i n + m e h i l ä i s s y ö j ä + m e h i l ä i s s y ö j ä t + m e h i l ä i s t a l o u d e n + m e h i l ä i s t a n s s i + m e h i l ä i s t a r h a u k s e e n + m e h i l ä i s t a r h a u k s e n + m e h i l ä i s t a u d i t + m e h i l ä i s t a u t e j a + m e h i l ä i s t a u t i e n + m e h i l ä i s t e n + m e h i l ä i s t e n h o i d o n + m e h i l ä i s t e n h o i t a j a n + m e h i l ä i s t i l o j a + m e h i l ä i s t u o t t e i d e n + m e h i l ä i s t u o t t e i t a + m e h i l ä i s t u t k i m u k s e e n + m e h i l ä i s y h d y s k u n n a t + m e h i l ä i s y h d y s k u n t i a + m e h i l ä i s y h d y s k u n t i e n + m e h i l ä i s y h t e i s k u n t i a + m e h u a + m e h u j ä ä + m e h u t e o l l i s u u d e n + m e h u t e o l l i s u u d e s s a + m e i d ä n h ä n + m e i d ä n k i n + m e i h i n + m e i j e r i a l a + m e i j e r i a l a a n + m e i j e r i a l a l l a + m e i j e r i a l a l l e + m e i j e r i a l a n + m e i j e r i a l a s t a + m e i j e r i k o n s e r n i + m e i j e r i n + m e i j e r i t e o l l i s u u d e n + m e i j e r i t e o l l i s u u s + m e i j e r i t e o l l i s u u t e e n + m e i j e r i t i l a n n e t t a + m e i j e r i t u o t t e e t + m e i j e r i t u o t t e i d e n + m e i j e r i t u o t t e i l l e + m e i j e r i t u o t t e i s t a + m e i j e r i t u o t t e i t a + m e i j e r i y h t i ö i t ä + m e i j e r i y r i t y k s e s t ä + m e i j e r i y r i t y s t e n + m e i j e r i ä + m e i l l e + m e i l l ä + m e i l l ä h ä n + m e i l l ä k i n + m e i l t ä + m e i s t ä k i n + m e i t ä + m e k a n i s m e i s t a + m e k a n i s m e j a + m e k a n i s m i a + m e k a n i s m i l l a + m e k a n i s m i n + m e k a n i s m i s s a + m e k a n i s m i s t a + m e k a n i s m i t + m e k i n + m e k s i k o n d o g g i l e p a k k o + m e l a m i i n i m a i t o s k a n d a a l i + m e l a m i i n i s k a n d a a l i n + m e l a s s i k a t a s t r o f i + m e l a s s i l a k i + m e l k e i n p ä + m e l k o i s e n + m e l k o i s e s t a + m e l k o i s e s t i k i n + m e l k o i s i a + m e l k o i s t a + m e l l a k a n t o r j u n n a s s a + m e l l a k a n t o r j u n t a l a i t t e i t a + m e l l a k a t + m e l l a k k a p o l i i s e i l l a + m e l l a k k a p o l i i s e j a + m e l l a k k a p o l i i s i + m e l l a k k a p o l i i s i e n + m e l l a k o i d e n + m e l l a k o i s t a + m e l l a k o i t a + m e l l a k o i v a t + m e l o d i a a + m e l o t t e + m e l u a l t i s t u k s e n + m e l u a l t i s t u m i s e s t a + m e l u a l t t i i l l a + m e l u a m a l l a + m e l u a r v o + m e l u a r v o j e n + m e l u a s e t u k s e s t a + m e l u d i r e k t i i v i + m e l u d i r e k t i i v i n + m e l u d i r e k t i i v i ä + m e l u d u m p p a u s + m e l u e s t e + m e l u e s t e i t ä + m e l u h a i t a n + m e l u h a i t a s t a + m e l u h a i t a t + m e l u h a i t o i l l e + m e l u h a i t t a + m e l u h a i t t a a + m e l u h a i t t a o n g e l m a a n + m e l u h a i t t o i h i n + m e l u h a i t t o j a + m e l u h a i t t o j e n + m e l u h e r k i l l ä + m e l u h ä i r i ö i t ä + m e l u h ä i r i ö t + m e l u i n d i k a a t t o r e i t a + m e l u i n d i k a a t t o r i a + m e l u i n d i k a a t t o r i e n + m e l u i n d i k a a t t o r i n s a + m e l u i s a m p i a + m e l u i s i a + m e l u i s i l l a + m e l u i s i m m a t + m e l u i s i m p i e n + m e l u i s t e n + m e l u k a l j u m e s i k k o + m e l u k a r t a t + m e l u k a r t o i t u k s e e n + m e l u k a r t o i t u k s e n + m e l u k a r t o i t u k s e s s a + m e l u k a r t o i t u k s e t + m e l u k a r t o i t u s + m e l u k a r t o i t u s t a + m e l u k a r t t a + m e l u k a r t t o j e n + m e l u k i i n t i ö j ä r j e s t e l m ä n + m e l u k u o r m i t u k s e n + m e l u l l e + m e l u l t a + m e l u l u o k i t t e l u + m e l u l u o k i t t e l u k s i + m e l u l u o k i t u k s e n + m e l u l u o k i t u s t a + m e l u l u o k k i a + m e l u l u o k k i i n + m e l u l ä h t e i d e n + m e l u l ä h t e i s t ä + m e l u l ä h t e i t ä + m e l u m a k s u a + m e l u m a k s u i l l a + m e l u m a k s u i s s a + m e l u m a k s u i s t a + m e l u m a k s u j a + m e l u m a k s u j e n + m e l u m a k s u j ä r j e s t e l m ä t + m e l u m a k s u t + m e l u m ä ä r ä n + m e l u m ä ä r ä y k s e t + m e l u n + m e l u n h a l l i n n a n + m e l u n o r m e i s t a + m e l u n o r m e j a + m e l u n o r m i e n + m e l u n o r m i t + m e l u n t o r j u n n a n + m e l u n t o r j u n n a s s a + m e l u n t o r j u n n a s t a + m e l u n t o r j u n t a + m e l u n t o r j u n t a a + m e l u n t o r j u n t a o h j e l m a l l a + m e l u n t o r j u n t a p o l i t i i k a l l e + m e l u n t o r j u n t a p o l i t i i k a s t a + m e l u n v a i m e n n u s s a r j a + m e l u n v a l v o n t a a + m e l u n v a s t a i n e n + m e l u o n g e l m a + m e l u o n g e l m a a + m e l u o n g e l m a s t a + m e l u o n g e l m a t + m e l u o n g e l m i a + m e l u o n g e l m i s t a + m e l u p o l i t i i k a n + m e l u p o l i t i i k a s s a + m e l u p o l i t i i k a s t a + m e l u p o l i t i i k k a + m e l u p ä ä s t ö a r v o j e n + m e l u p ä ä s t ö i n ä + m e l u p ä ä s t ö j e n + m e l u p ä ä s t ö j ä + m e l u p ä ä s t ö t + m e l u r a j a t + m e l u r a j o i s t a + m e l u r a j o i t u s t e n + m e l u r a j o j a + m e l u s a a s t e + m e l u s a a s t e e l l e + m e l u s a a s t e e n + m e l u s a a s t e e s e e n + m e l u s a a s t e e s t a + m e l u s a a s t e i n d i k a a t t o r i a + m e l u s a a s t e i s t a + m e l u s a a s t e i t a + m e l u s a a s t e t t a + m e l u s a a s t e t y y p p e j ä + m e l u s t a + m e l u s t a n d a r d e j a + m e l u s t a n d a r d i e n + m e l u s u o j a + m e l u s u o j a a + m e l u s u o j a n + m e l u s ä ä n n ö k s i ä + m e l u t a s o + m e l u t a s o a + m e l u t a s o i l l e + m e l u t a s o i s t a + m e l u t a s o j a + m e l u t a s o j e n + m e l u t a s o l l e + m e l u t a s o n + m e l u t a s o o n + m e l u t a s o s s a + m e l u t a s o s t a + m e l u t a s o t + m e l u t e s t i e n + m e l u t i l a n n e t t a + m e l u t o r j u n t a a + m e l u u n + m e l u v e r o j e n + m e l u v y ö h y k e j a o s s a + m e n d e t + m e n e e + m e n e e k ö + m e n e h t y i + m e n e h t y i v ä t + m e n e h t y m i s a a l l o s t a + m e n e h t y n e e l l e + m e n e h t y n e i d e n + m e n e h t y n e i t ä + m e n e h t y v i e n + m e n e h t y v ä t + m e n e h t y y + m e n e h t y ä + m e n e i l l ä ä n + m e n e k i n e d i s t ä m i s k a m p a n j o i h i n + m e n e k i n e d i s t ä m i s k a m p a n j o i l l e + m e n e k i n e d i s t ä m i s k a m p a n j o i s s a + m e n e k i n e d i s t ä m i s k a m p a n j o i t a + m e n e k i n e d i s t ä m i s o h j e l m a a n + m e n e k i n e d i s t ä m i s p o l i t i i k a n + m e n e k i n e d i s t ä m i s t o i m e t + m e n e k i n e d i s t ä m i s t o i m i a + m e n e k i n e d i s t ä m i s t o i m i e n + m e n e k i n e d i s t ä m i s t o i m i l l a + m e n e k i n e d i s t ä m i s t o i m i s t a + m e n e k i n e d i s t ä m i s v ä l i n e e s e e n + m e n e k i n e d i s t ä m i s v ä l i n e i d e n + m e n e k i n e d i s t ä m i s v ä l i n e i s i i n + m e n e k k i m a h d o l l i s u u k s i a + m e n e k k i ä + m e n e m m e + m e n e m ä t t ä + m e n e m ä ä n + m e n e n + m e n e n k i n + m e n e s t y i + m e n e s t y i v ä t + m e n e s t y k s e e n + m e n e s t y k s e k k ä i k s i + m e n e s t y k s e k k ä i m m i n + m e n e s t y k s e k k ä i m m i s t ä + m e n e s t y k s e k k ä i m m ä l l e + m e n e s t y k s e k k ä i m m ä n + m e n e s t y k s e k k ä i m m ä t + m e n e s t y k s e k k ä i m p i e n + m e n e s t y k s e k k ä i m p i i n + m e n e s t y k s e k k ä i m p i n ä + m e n e s t y k s e k k ä i m p i ä + m e n e s t y k s e k k ä i n + m e n e s t y k s e k k ä i n t ä + m e n e s t y k s e k k ä i t ä + m e n e s t y k s e k k ä ä k s i + m e n e s t y k s e k k ä ä l l e + m e n e s t y k s e k k ä ä l l ä + m e n e s t y k s e k k ä ä m m i n + m e n e s t y k s e k k ä ä m m i s s ä + m e n e s t y k s e k k ä ä m p i + m e n e s t y k s e k k ä ä m p i ä + m e n e s t y k s e k k ä ä m p ä ä + m e n e s t y k s e k k ä ä n + m e n e s t y k s e k k ä ä s e e n + m e n e s t y k s e k k ä ä s s ä + m e n e s t y k s e k k ä ä s t ä + m e n e s t y k s e k k ä ä t + m e n e s t y k s e k s i + m e n e s t y k s e k ä s t ä + m e n e s t y k s e l l e + m e n e s t y k s e l l i s e m m i n + m e n e s t y k s e l l i s e m p i + m e n e s t y k s e l l i s e m p i ä + m e n e s t y k s e l l i s e m p ä ä + m e n e s t y k s e l l i s e s s ä + m e n e s t y k s e l l i s e s t ä + m e n e s t y k s e l l i s i m m i s t ä + m e n e s t y k s e l l i s i m m ä k s i + m e n e s t y k s e l l i s i m p i e n + m e n e s t y k s e l l i s i m p i ä + m e n e s t y k s e l l i s i n + m e n e s t y k s e l l i s i s t ä + m e n e s t y k s e l l i s i ä + m e n e s t y k s e l l i s t ä + m e n e s t y k s e l l ä + m e n e s t y k s e n + m e n e s t y k s e n h a l u + m e n e s t y k s e n j a n o n + m e n e s t y k s e n s ä + m e n e s t y k s e n ä + m e n e s t y k s e s t ä + m e n e s t y k s e s t ä n n e + m e n e s t y k s e t t ä + m e n e s t y k s i ä + m e n e s t y m i s e l l e + m e n e s t y m i s e n + m e n e s t y m i s e s s ä + m e n e s t y m i s m a h d o l l i s u u k s i a + m e n e s t y m i s n ä k ö a l o i s t a + m e n e s t y m i s t ä + m e n e s t y m ä t t ä + m e n e s t y m ä ä n + m e n e s t y n e e m p i + m e n e s t y n e e t + m e n e s t y n e i m m i s t ä + m e n e s t y n e i m m ä t + m e n e s t y n e i m p i ä + m e n e s t y n e i n + m e n e s t y s e l o k u v a n + m e n e s t y s h a n k k e i s i i n + m e n e s t y s i n d i k a a t t o r i + m e n e s t y s k e r t o m u k s e k s i + m e n e s t y s k e r t o m u k s i n a + m e n e s t y s k e r t o m u s + m e n e s t y s k e r t o m u s t a + m e n e s t y s m a l l i + m e n e s t y s o h j e l m a + m e n e s t y s p a i n e + m e n e s t y s p r o p a g a n d a s t a + m e n e s t y s r e s e p t i + m e n e s t y s r e s e p t i i n + m e n e s t y s s u u n n i t e l m a s t a + m e n e s t y s t a r i n a + m e n e s t y s t a r i n a a + m e n e s t y s t a r i n a a n + m e n e s t y s t a r i n a k s i + m e n e s t y s t a r i n a m m e + m e n e s t y s t a r i n a n + m e n e s t y s t a r i n a n a + m e n e s t y s t a r i n a s s a + m e n e s t y s t a r i n a s s a m m e + m e n e s t y s t a r i n a s t a + m e n e s t y s t a r i n a t + m e n e s t y s t a r i n o i d e n + m e n e s t y s t a r i n o i h i n + m e n e s t y s t a r i n o i l l a + m e n e s t y s t a r i n o i s t a + m e n e s t y s t a r i n o i t a + m e n e s t y s t e k i j ä + m e n e s t y s t e k i j ä t + m e n e s t y s t e k i j ö i t ä + m e n e s t y s t e n + m e n e s t y s t e o l o g i a + m e n e s t y s t ä + m e n e s t y s t ä m m e + m e n e s t y t ä ä n + m e n e s t y v i m m i s t ä + m e n e s t y v i m m ä t + m e n e s t y v ä m m ä k s i + m e n e s t y v ä m m ä n + m e n e s t y v ä m p i + m e n e s t y v ä m p i ä + m e n e s t y v ä s s ä + m e n e s t y y + m e n e s t y ä + m e n e s t y ä k s e m m e + m e n e t e l k ä ä + m e n e t e l l e e t + m e n e t e l l ä + m e n e t e l m i e n + m e n e t e l m i i n + m e n e t e l m i l l ä + m e n e t e l m i l t ä ä n + m e n e t e l m i n + m e n e t e l m i s t ä + m e n e t e l m i ä + m e n e t e l m i ä m m e + m e n e t e l m ä e h d o t u s + m e n e t e l m ä k e h i t y k s e n + m e n e t e l m ä k e h i t y s t ä + m e n e t e l m ä k e h y s + m e n e t e l m ä k e r t o m u k s e s t a + m e n e t e l m ä k s i + m e n e t e l m ä k y s y m y k s i s t ä + m e n e t e l m ä k y s y m y k s i ä + m e n e t e l m ä k y s y m y s + m e n e t e l m ä k y s y m y s t ä + m e n e t e l m ä l l ä + m e n e t e l m ä n + m e n e t e l m ä n ä + m e n e t e l m ä r a p o r t i s s a + m e n e t e l m ä s s ä + m e n e t e l m ä s t ä + m e n e t e l m ä t + m e n e t e l m ä v i r h e e s t ä + m e n e t e l m ä ä + m e n e t e l t i i n + m e n e t e t t i i n + m e n e t e t t y i h i n + m e n e t e t t y i n ä + m e n e t e t t y j ä + m e n e t e t t ä i s i + m e n e t e t y k s i + m e n e t e t y n + m e n e t e t y s t ä + m e n e t e t y t + m e n e t e t ä ä n + m e n e t i m m e + m e n e t t e k ö + m e n e t t e l e e + m e n e t t e l e m ä l l ä + m e n e t t e l e m ä ä n + m e n e t t e l y a s e t u k s e n + m e n e t t e l y a s i a t + m e n e t t e l y d i r e k t i i v i i n + m e n e t t e l y d i r e k t i i v i n + m e n e t t e l y e r o t + m e n e t t e l y h i e r a r k i a a + m e n e t t e l y i d e n + m e n e t t e l y i h i n + m e n e t t e l y i l l ä + m e n e t t e l y i l t ä + m e n e t t e l y i s s ä + m e n e t t e l y i s t ä + m e n e t t e l y i t ä + m e n e t t e l y j e m m e + m e n e t t e l y j e n + m e n e t t e l y j ä + m e n e t t e l y j ä m m e + m e n e t t e l y j ä r j e s t y s + m e n e t t e l y j ä ä n + m e n e t t e l y k e h y k s e n + m e n e t t e l y k i e l i ä + m e n e t t e l y k i k a l l a + m e n e t t e l y k u s t a n n u k s i a + m e n e t t e l y k y s y m y k s e n + m e n e t t e l y k y s y m y k s e s t ä + m e n e t t e l y k y s y m y k s e t + m e n e t t e l y k y s y m y k s i i n + m e n e t t e l y k y s y m y k s i l l ä + m e n e t t e l y k y s y m y k s i s s ä + m e n e t t e l y k y s y m y s + m e n e t t e l y k y s y m y s t e n + m e n e t t e l y k ä s i k i r j a a n + m e n e t t e l y l i n j a u k s e t + m e n e t t e l y l l e + m e n e t t e l y l l ä + m e n e t t e l y l t ä ä n + m e n e t t e l y m e k a n i s m e j a + m e n e t t e l y m u u t o k s e t + m e n e t t e l y m u u t o k s i a + m e n e t t e l y m ä ä r ä y s t e n + m e n e t t e l y n + m e n e t t e l y n o r m i e n + m e n e t t e l y n o r m i t + m e n e t t e l y o h j e + m e n e t t e l y o h j e e s t a + m e n e t t e l y o h j e e t + m e n e t t e l y o h j e i d e n + m e n e t t e l y o h j e i s t a + m e n e t t e l y o h j e i t a + m e n e t t e l y o i k e u d e l l i s e t + m e n e t t e l y o i k e u d e n + m e n e t t e l y o i k e u k s i a + m e n e t t e l y o i k e u t e e n + m e n e t t e l y o n g e l m a + m e n e t t e l y o n g e l m a n + m e n e t t e l y o n g e l m i a + m e n e t t e l y o n g e l m i s t a + m e n e t t e l y p e l i t + m e n e t t e l y p e l i ä + m e n e t t e l y p e r i a a t t e e t + m e n e t t e l y p e r i a a t t e i d e n + m e n e t t e l y p e r i a a t t e i s s a + m e n e t t e l y s e i k k o i h i n + m e n e t t e l y s i r k u k s e e n + m e n e t t e l y s s ä + m e n e t t e l y s t r a t e g i s i s t a + m e n e t t e l y s t ä + m e n e t t e l y s y i s t ä + m e n e t t e l y s ä ä n n ö i k s i + m e n e t t e l y s ä ä n n ö i l l ä + m e n e t t e l y s ä ä n n ö i s s ä + m e n e t t e l y s ä ä n n ö i s s ä k i n + m e n e t t e l y s ä ä n n ö i s t ä + m e n e t t e l y s ä ä n n ö k s i ä + m e n e t t e l y s ä ä n n ö n + m e n e t t e l y s ä ä n n ö s t ö + m e n e t t e l y s ä ä n n ö s t ö n + m e n e t t e l y s ä ä n n ö t + m e n e t t e l y s ä ä n t ö + m e n e t t e l y s ä ä n t ö i h i n + m e n e t t e l y s ä ä n t ö i n ä + m e n e t t e l y s ä ä n t ö j e n + m e n e t t e l y s ä ä n t ö j ä + m e n e t t e l y s ä ä n t ö j ä ä n + m e n e t t e l y s ä ä n t ö ä + m e n e t t e l y t + m e n e t t e l y t a a k a n + m e n e t t e l y t a a k k a a + m e n e t t e l y t a k e e t + m e n e t t e l y t a k e i d e n + m e n e t t e l y t a k e i l l e + m e n e t t e l y t a k e i s t a + m e n e t t e l y t a k e i t a + m e n e t t e l y t a k u i d e n + m e n e t t e l y t a k u i l l a + m e n e t t e l y t a k u i s i i n + m e n e t t e l y t a k u i s t a + m e n e t t e l y t a k u u + m e n e t t e l y t a k u u t + m e n e t t e l y t a p a + m e n e t t e l y t a p a a + m e n e t t e l y t a p a a n + m e n e t t e l y t a p a d i r e k t i i v i + m e n e t t e l y t a p a d i r e k t i i v i s t ä + m e n e t t e l y t a p a e h d o t u k s e n + m e n e t t e l y t a p a e h d o t u s t a + m e n e t t e l y t a p a k e s k u s t e l u i s t a + m e n e t t e l y t a p a k y s y m y k s e t + m e n e t t e l y t a p a k y s y m y k s i i n + m e n e t t e l y t a p a k y s y m y k s i l l e + m e n e t t e l y t a p a k y s y m y k s i ä + m e n e t t e l y t a p a m a l l i a + m e n e t t e l y t a p a n a + m e n e t t e l y t a p a o h j e e k s i + m e n e t t e l y t a p a o n g e l m a + m e n e t t e l y t a p a p ä ä t ö k s e t + m e n e t t e l y t a p a r i k k o m u k s i i n + m e n e t t e l y t a p a s y i s t ä + m e n e t t e l y t a p a s ä ä d ö k s i ä + m e n e t t e l y t a p a s ä ä n n ö i l l ä + m e n e t t e l y t a p a s ä ä n n ö i s t ä + m e n e t t e l y t a p a s ä ä n n ö n + m e n e t t e l y t a p a s ä ä n n ö s t ö + m e n e t t e l y t a p a s ä ä n n ö t + m e n e t t e l y t a p a s ä ä n t ö + m e n e t t e l y t a p a s ä ä n t ö i h i n + m e n e t t e l y t a p a s ä ä n t ö j ä + m e n e t t e l y t a p a v a i k e u k s i i n + m e n e t t e l y t a p a v a l i o k u n n a l l e + m e n e t t e l y t a p a v i r h e + m e n e t t e l y t a p a v ä l i k o h t a u k s e e n + m e n e t t e l y t a p o i h i n + m e n e t t e l y t a p o j a + m e n e t t e l y t a p o j e n + m e n e t t e l y t a p o j e n s a + m e n e t t e l y t a v a k s i + m e n e t t e l y t a v a l l a + m e n e t t e l y t a v a n + m e n e t t e l y t a v a s s a + m e n e t t e l y t a v a s t a + m e n e t t e l y t a v a t + m e n e t t e l y t a v o i l l a + m e n e t t e l y t a v o i s t a + m e n e t t e l y t a v o i s t a m m e + m e n e t t e l y t a v o i t t e e s t a + m e n e t t e l y v a a t i m u k s i a + m e n e t t e l y v a a t i m u k s i s t a + m e n e t t e l y v a i h e + m e n e t t e l y v a i h e e n + m e n e t t e l y v a i h e e s e e n + m e n e t t e l y v a i h e e s s a + m e n e t t e l y v a i h e i d e n + m e n e t t e l y v a i h e i s i i n + m e n e t t e l y v a i h e i t a + m e n e t t e l y v i r h e + m e n e t t e l y v i r h e e k s i + m e n e t t e l y v i r h e e n + m e n e t t e l y v i r h e e s t ä + m e n e t t e l y v i r h e e t + m e n e t t e l y v i r h e i d e n + m e n e t t e l y v i r h e i s i i n + m e n e t t e l y v i r h e i s t ä + m e n e t t e l y v i r h e i t ä + m e n e t t e l y v ä l i n e e n + m e n e t t e l y v ä l i n e e s e e n + m e n e t t e l y y n + m e n e t t e l y ä + m e n e t t e l y ä ä n + m e n e t t i + m e n e t t i v ä t + m e n e t t ä i s i + m e n e t t ä i s i m m e + m e n e t t ä i s i v ä t + m e n e t t ä m i e n s ä + m e n e t t ä m i s e e n + m e n e t t ä m i s e n + m e n e t t ä m i s e s t ä + m e n e t t ä m i s t ä + m e n e t t ä m i s v ä i t e + m e n e t t ä m ä i s i l l ä ä n + m e n e t t ä m ä s s ä + m e n e t t ä m ä t + m e n e t t ä m ä t t ä + m e n e t t ä n e e n + m e n e t t ä n e e t + m e n e t t ä n e i l l e + m e n e t t ä v i ä + m e n e t t ä v ä t + m e n e t t ä v ä t k ö + m e n e t t ä ä + m e n e t y k s e l t ä + m e n e t y k s e t + m e n e t y k s i i n + m e n e t y k s i l t ä + m e n e t y k s i s t ä + m e n e t y k s i ä + m e n e t y s t a r i n a a n + m e n e t y s t ä + m e n e t ä m m e + m e n e v i l l ä + m e n e v i ä + m e n e v ä n + m e n e v ä s t ä + m e n e v ä t + m e n e v ä t k ö + m e n e v ä ä + m e n e v ä ä n + m e n i s i + m e n i s i v ä t + m e n i v ä t + m e n k ä ä + m e n k ä ä m m e + m e n n e e n + m e n n e e s e e n + m e n n e e s s ä + m e n n e e t + m e n n e i s t ä + m e n n e i s y y d e l l e + m e n n e i s y y d e n + m e n n e i s y y d e s s ä + m e n n e i s y y d e s s ä m m e + m e n n e i s y y d e s t ä + m e n n e i s y y s k i n + m e n n e i s y y t e e n + m e n n e i s y y t e n s ä + m e n n e i s y y t t ä + m e n n e i t ä + m e n n e n + m e n n y t t ä + m e n n ä + m e n n ä k s e e n + m e n n ä k s e n i + m e n n ä k ö + m e n n ä ä n + m e n n ä ä n k i n + m e n n ä ä n k ö + m e n n ä ä n p ä + m e n o a l a a n + m e n o a l a n + m e n o a l a t + m e n o a l o i l l a + m e n o a l o j a + m e n o a l o j e n + m e n o a l u e + m e n o a l u e e l l a + m e n o a l u e e n + m e n o a l u e i l l a + m e n o a l u e i s t a + m e n o a l u e i t a + m e n o a r v i o + m e n o a r v i o i s t a + m e n o a r v i o o n + m e n o a s t e t t a + m e n o a u t o m a a t t i a + m e n o e h d o t u k s e t + m e n o e h d o t u s t a + m e n o e h d o t u s t e n + m e n o e r i e n + m e n o e r i ä + m e n o e r ä + m e n o e r ä n + m e n o e r ä s t ä + m e n o e r ä t + m e n o e r ä ä + m e n o i h i n + m e n o i l l a + m e n o i l l e + m e n o i l t a + m e n o i n + m e n o i n a + m e n o i s s a + m e n o i s t a + m e n o j a + m e n o j a a n + m e n o j e n + m e n o j ä r j e s t e l m ä n + m e n o k a t e g o r i a n + m e n o k a t t o + m e n o k a t t o a + m e n o k a t t o o n + m e n o k e h y k s e e n + m e n o k e h y k s e n + m e n o k e h y s + m e n o k e l p o i s u u t t a + m e n o k o h d a s t a + m e n o k o h d i s t a + m e n o k o h t a + m e n o k o h t a a + m e n o k o h t e i t a + m e n o k u l t t u u r i + m e n o k u l t t u u r i i n + m e n o k u l t t u u r i s s a m m e + m e n o l e i k k a u k s e t + m e n o l e i k k a u k s i a + m e n o l e i k k a u k s i i n + m e n o l e i k k a u k s i n a + m e n o l e i k k a u k s i n e e n + m e n o l e i k k a u s l i n j a n + m e n o l e i k k a u s t e n + m e n o l i n j a l l a + m e n o l i n j a u s + m e n o l i p u l l a + m e n o l i s ä y k s i s t ä + m e n o l i s ä y k s i ä + m e n o l i s ä y s + m e n o l u o k a n + m e n o l u o k a s s a + m e n o l u o k a s t a + m e n o l u o k a t + m e n o l u o k i s s a + m e n o l u o k i t u s + m e n o l u o k k a a n + m e n o l u o k k a k o h t a i s e s t i + m e n o l u o k k i a + m e n o l u o k k i e n + m e n o l u o k k i i n + m e n o m a t k a + m e n o m ä ä r i e n + m e n o n s a + m e n o n ä k y m i e n + m e n o p a i n e i t a + m e n o p a k e t t e j a + m e n o p o l i t i i k a n + m e n o p o l i t i i k a s s a + m e n o p o l i t i i k a s t a + m e n o p o l i t i i k k a + m e n o p o l i t i i k k a a + m e n o p o l i t i i k k a n s a + m e n o p o l i t i i k k o i h i n + m e n o p r o s e s s i n + m e n o p u o l e e n + m e n o p u o l e l l a + m e n o p u o l e l l a k i n + m e n o p u o l e l l e + m e n o p u o l e l t a + m e n o p u o l e l t a a n + m e n o p u o l e n + m e n o p u o l e s t a + m e n o p u o l i + m e n o p u o l t a + m e n o p u o l t a k i n + m e n o p ä ä t ö k s i s s ä + m e n o p ä ä t ö k s i s t ä + m e n o p ä ä t ö k s i ä + m e n o r a j a a + m e n o r a j a s s a + m e n o r a j o i t u k s i s t a + m e n o r a j o i t u s t e n + m e n o r a j o j a + m e n o r a k e n n e + m e n o r a k e n n e t t a + m e n o r a k e n t e e n + m e n o r a k e n t e e t + m e n o s i t o u m u k s i a + m e n o s i t o u m u s t e n + m e n o s u u n n i t e l m a n s a + m e n o s u u n n i t e l m a t + m e n o s u u n n i t e l m i a + m e n o s u u n n i t e l m i e n + m e n o s u u n n i t e l m i s s a + m e n o s u u n n i t e l m i s t a + m e n o s ä ä s t ö + m e n o s ä ä s t ö j ä + m e n o t + m e n o t a r p e e t + m e n o t a r p e i d e n + m e n o t a s o + m e n o t a s o l l a + m e n o t a s o l l e + m e n o t a s o n + m e n o t a s o o n + m e n o t a s o s t a + m e n o t a s o t + m e n o t a v o i t e t t a + m e n o t a v o i t t e e n + m e n o t a v o i t t e e n a + m e n o t a v o i t t e e t + m e n o t a v o i t t e i k s i + m e n o t a v o i t t e i n a + m e n o t a v o i t t e i t a + m e n o t i l a n n e + m e n o t y y p i n + m e n o v a a t i m u k s i a + m e n o v e l v o i t t e i d e n + m e n t i i n + m e n t o r o i n t i j ä r j e s t e l m ä n + m e n t o r o i n t i j ä r j e s t e l m ä t + m e n t y + m e n t y ä + m e n t ä e s s ä + m e n t ä i s i i n + m e r e e n + m e r e l l e + m e r e l l i s e m p i + m e r e l l ä + m e r e m m e + m e r e n + m e r e n a l a i s e e n + m e r e n a l a i s e t + m e r e n a l a i s i l l e + m e r e n a l a i s t e n + m e r e n e l ä v i e n + m e r e n j u m a l a + m e r e n k u l k i j a n + m e r e n k u l k i j a t + m e r e n k u l k i j o i d e n + m e r e n k u l k i j o i s t a + m e r e n k u l k i j o i t a + m e r e n k u l k u + m e r e n k u l k u a + m e r e n k u l k u a l a + m e r e n k u l k u a l a a + m e r e n k u l k u a l a a n + m e r e n k u l k u a l a l l a + m e r e n k u l k u a l a l l e + m e r e n k u l k u a l a m m e + m e r e n k u l k u a l a n + m e r e n k u l k u a l o i l l a + m e r e n k u l k u a l u e i d e n + m e r e n k u l k u a l u e i l l e + m e r e n k u l k u a l u e t t a + m e r e n k u l k u a m m a t t i e n + m e r e n k u l k u a m m a t t i i n + m e r e n k u l k u a s i o i d e n + m e r e n k u l k u a s i o i h i n + m e r e n k u l k u e l i n k e i n o + m e r e n k u l k u h a l l i n t o + m e r e n k u l k u h a l l i t u s + m e r e n k u l k u h e n k i l ö s t ö n + m e r e n k u l k u i n f r a s t r u k t u u r i n + m e r e n k u l k u i n s t i t u u t i n + m e r e n k u l k u i n s t i t u u t t i + m e r e n k u l k u j ä r j e s t e l m ä n + m e r e n k u l k u j ä r j e s t ö + m e r e n k u l k u j ä r j e s t ö l l e + m e r e n k u l k u j ä r j e s t ö n + m e r e n k u l k u j ä r j e s t ö s s ä + m e r e n k u l k u j ä r j e s t ö ä + m e r e n k u l k u j ä r j e s t ö ö n + m e r e n k u l k u k a l u s t o n + m e r e n k u l k u k a n s a k u n t a + m e r e n k u l k u k u l t t u u r i n + m e r e n k u l k u l a i n s ä ä d ä n n ö n + m e r e n k u l k u l a i n s ä ä d ä n t ö + m e r e n k u l k u l a i t o s t e n + m e r e n k u l k u l e h d i s s ä + m e r e n k u l k u m a a t + m e r e n k u l k u m a h d o l l i s u u k s i a + m e r e n k u l k u m a r k k i n o i l l a + m e r e n k u l k u m a r k k i n o i l l e + m e r e n k u l k u m i e h i s t ö j e n + m e r e n k u l k u m i e h i s t ö n + m e r e n k u l k u m i e h i s t ö s t ä + m e r e n k u l k u m i e h i s t ö t + m e r e n k u l k u m i e h i s t ö ä + m e r e n k u l k u m i e h i s t ö ö n + m e r e n k u l k u m i n i s t e r i ö + m e r e n k u l k u m u s e o + m e r e n k u l k u o n n e t t o m u u d e t + m e r e n k u l k u o n n e t t o m u u k s i a + m e r e n k u l k u o n n e t t o m u u k s i e n + m e r e n k u l k u o n n e t t o m u u k s i s t a + m e r e n k u l k u p a k e t i n + m e r e n k u l k u p a k e t i s s a + m e r e n k u l k u p a k e t i s t a + m e r e n k u l k u p a k e t t i + m e r e n k u l k u p a k e t t i i n + m e r e n k u l k u p a l v e l u i s s a + m e r e n k u l k u p a l v e l u j e n + m e r e n k u l k u p e r i n n e + m e r e n k u l k u p e r i n t e e n + m e r e n k u l k u p e r i n t e e s e e n + m e r e n k u l k u p o l i t i i k a n + m e r e n k u l k u p o l i t i i k k a a + m e r e n k u l k u p o l i t i i k k a a n + m e r e n k u l k u s e k t o r i l l a + m e r e n k u l k u s ä ä d ö k s i ä + m e r e n k u l k u s ä ä n n ö k s i ä + m e r e n k u l k u s ä ä n n ö t + m e r e n k u l k u s ä ä n t ö i h i n + m e r e n k u l k u t a l o u s + m e r e n k u l k u t e o l l i s u u d e l l e + m e r e n k u l k u t e o l l i s u u d e n + m e r e n k u l k u t e o l l i s u u d e s t a m m e + m e r e n k u l k u t e o l l i s u u t e m m e + m e r e n k u l k u t e o l l i s u u t e n s a + m e r e n k u l k u t e o l l i s u u t t a + m e r e n k u l k u t i e d o t + m e r e n k u l k u t i e t e e n + m e r e n k u l k u t o i m i n n a n + m e r e n k u l k u t o i m i n t a a + m e r e n k u l k u t u t k i m u k s e n + m e r e n k u l k u t y ö n t e k i j ö i d e n + m e r e n k u l k u u n + m e r e n k u l k u v a l t i o + m e r e n k u l k u v a l t i o i d e n + m e r e n k u l k u v a l t i o i l l a + m e r e n k u l k u v a l t i o i s t a + m e r e n k u l k u v a l t i o l l e + m e r e n k u l k u v a l t i o n a + m e r e n k u l k u v a l t i o t + m e r e n k u l k u v i r a n o m a i s e l l e + m e r e n k u l k u v i r a n o m a i s e n + m e r e n k u l k u v i r a n o m a i s e t + m e r e n k u l k u v i r a n o m a i s i l l e + m e r e n k u l k u v i r a n o m a i s t e n + m e r e n k u l k u v i r a s t o + m e r e n k u l k u v i r a s t o n + m e r e n k u l k u v ä l i n e e t + m e r e n k u l k u y h t e i s ö i s s ä + m e r e n k u l k u y h t e i s ö j e n + m e r e n k u l k u y h t e i s ö l l e + m e r e n k u l k u y h t e y k s i e n + m e r e n k u l k u y r i t y k s i l l e + m e r e n k u l k u y r i t y s t e n + m e r e n k u l u j ä r j e s t ö n + m e r e n k u l u l l a + m e r e n k u l u l l e + m e r e n k u l u n + m e r e n k u l u s s a + m e r e n k u l u s t a + m e r e n k u r k u n + m e r e n k u r k u s s a + m e r e n k ä v i j ö i t ä + m e r e n k ä y t ö n + m e r e n l a h d e k k e i s t a + m e r e n p i n n a n + m e r e n p i n t a + m e r e n p i n t a a + m e r e n p i n t a a n + m e r e n p o h j a + m e r e n p o h j a a + m e r e n p o h j a a n + m e r e n p o h j a n + m e r e n p o h j a s s a + m e r e n p o h j a s t a + m e r e n p o h j a t + m e r e n p o h j i a + m e r e n r a n t a k a u p u n g i s s a + m e r e n r a n t a k a u p u n k i i n + m e r e n r a n t a v a l t i o i d e n + m e r e n r a n t a v a l t i o i t a + m e r e n r a n t a v a l t i o t + m e r e n s u o j e l u a l u s t e n + m e r e n s u o j e l u h a n k k e i t a + m e r e n s u o j e l u s o p i m u k s e t + m e r e n t a k a i s e l l e + m e r e n t a k a i s e t + m e r e n t a k a i s i a + m e r e n t a k a i s i i n + m e r e n t a k a i s i l l a + m e r e n t a k a i s i l l e + m e r e n t a k a i s i l t a + m e r e n t a k a i s i s s a + m e r e n t a k a i s i s t a + m e r e n t a k a i s t e n + m e r e n t u t k i j a t + m e r e n t u t k i j o i d e n + m e r e n t u t k i j o i l l e + m e r e n t u t k i m u k s e e n + m e r e n t u t k i m u k s e l l e + m e r e n t u t k i m u k s e s s a + m e r e n t u t k i m u s + m e r e n t u t k i m u s i n f r a s t r u k t u u r i e n + m e r e n t u t k i m u s k e s k u s + m e r e n t u t k i m u s l a b o r a t o r i o s t a + m e r e n t u t k i m u s l a i t o k s e n + m e r e n t u t k i m u s l a i t o s + m e r e n t u t k i m u s l a i t o s t e n + m e r e n t u t k i m u s n e u v o s t o + m e r e n t u t k i m u s n e u v o s t o a + m e r e n t u t k i m u s n e u v o s t o n + m e r e n t u t k i m u s t a + m e r e n y l i t y k s e n + m e r e s s ä + m e r e s t ä + m e r i a j o k a s + m e r i a k v a a r i o + m e r i a k v a a r i o k a l o i s t a + m e r i a l a + m e r i a l a a n + m e r i a l a l l a + m e r i a l a n + m e r i a l o i t t e i d e n + m e r i a l o j e n + m e r i a l u e + m e r i a l u e e k s i + m e r i a l u e e l l a + m e r i a l u e e m m e + m e r i a l u e e n + m e r i a l u e e n a + m e r i a l u e e s e e n + m e r i a l u e e s t a + m e r i a l u e e t + m e r i a l u e i d e n + m e r i a l u e i l l a + m e r i a l u e i l l e + m e r i a l u e i s i i n + m e r i a l u e i s t a + m e r i a l u e i t a + m e r i a l u e k o h t a i s e e n + m e r i a l u e k o h t a i s e s t i + m e r i a l u e k o h t a i s i a + m e r i a l u e t t a + m e r i a l u k s i a + m e r i a l u k s i i n s a + m e r i a l u k s i l l a + m e r i a l u k s i s t a + m e r i a l u s t e n + m e r i a n k e r i a s + m e r i a n t u r a + m e r i a r k e o l o g i a + m e r i a s i a n t u n t i j a t + m e r i a s i o i d e n + m e r i a s i o i h i n + m e r i a s i o i h i n k i n + m e r i a s i o i s s a + m e r i a s i o i s t a + m e r i a s i o i t a + m e r i a s t e r i + m e r i a s t r o l a b i + m e r i b a s s i + m e r i b i o l o g i + m e r i b i o l o g i a + m e r i b i o l o g i a s t a + m e r i b i o l o g i s t e n + m e r i b i o l o g i t + m e r i d a + m e r i d i a a n i y m p y r ä + m e r i d i e s e l m o o t t o r e i d e n + m e r i d i e s e l m o o t t o r e i t a + m e r i d i e s e l m o o t t o r i e n + m e r i d i r e k t i i v i + m e r i e k o l o g e j a + m e r i e k o l o g i a + m e r i e k o l o g i a a + m e r i e k o l o g i a n + m e r i e k o l o g i e n + m e r i e k o s y s t e e m e i h i n + m e r i e k o s y s t e e m e i l l e + m e r i e k o s y s t e e m e i s t ä + m e r i e k o s y s t e e m e j ä + m e r i e k o s y s t e e m i e n + m e r i e k o s y s t e e m i i n + m e r i e k o s y s t e e m i n + m e r i e k o s y s t e e m i t + m e r i e k o s y s t e e m i ä + m e r i e l ä i m e t + m e r i e l ä i m i i n + m e r i e l ä i m i ä + m e r i e l ä i n l a j i e n + m e r i e m m e + m e r i e n + m e r i e n k e l i k a l a t + m e r i g e o l o g i a s t a + m e r i h a a r i k k o + m e r i h a l l i n t o r a k e n t e i d e n + m e r i h a n h i + m e r i h a n k k e i t a + m e r i h a r a k k a + m e r i h a u k k a + m e r i h i i r i + m e r i h i r v i ö + m e r i h i s t o r i a s s a + m e r i h u l i g a a n e j a + m e r i h ä t ä ä n + m e r i i n + m e r i j a l k a v ä k i + m e r i j ä r v i k s i + m e r i j ä ä + m e r i k a a l i + m e r i k a a p e l i + m e r i k a b o t a a s i a s e t u s t a + m e r i k a i s l a + m e r i k a l a s t a j a t + m e r i k a l a s t a j i a + m e r i k a l a s t a j i e n + m e r i k a l a s t u k s e e n + m e r i k a l a s t u k s e l l e + m e r i k a l a s t u k s e n + m e r i k a l a s t u k s e s t a + m e r i k a l a s t u s a l a l l a + m e r i k a l a s t u s a l u e e t + m e r i k a l a s t u s a l u k s i a + m e r i k a l a s t u s a l u s t e n + m e r i k a l a s t u s t a + m e r i k a l a s t u s t e o l l i s u u d e n + m e r i k a l a s t u s v i r a s t o n + m e r i k a l o j e n + m e r i k a n s a t + m e r i k a p t e e n i + m e r i k a r h u t + m e r i k a r t t a + m e r i k a r t t a a + m e r i k a s v i t + m e r i k a t a s t r o f e j a + m e r i k a t a s t r o f i e n + m e r i k e i j u + m e r i k e l p o i s u u s t o d i s t u k s i a + m e r i k e l p o i s u u s t o d i s t u s + m e r i k e l p o i s u u s t o d i s t u s t e n + m e r i k e l v o t t o m i a + m e r i k i h u + m e r i k i l p i k o n n a t + m e r i k i l p i k o n n i a + m e r i k i l p i k o n n i e n + m e r i k i s s a + m e r i k l u s t e r e i s s a + m e r i k l u s t e r i + m e r i k l u s t e r i e n + m e r i k l u s t e r i l l e + m e r i k l u s t e r i t + m e r i k o h o k k i + m e r i k o h t a i s e s t i + m e r i k o n t i n + m e r i k o n t t e j a + m e r i k o n t t i a + m e r i k o n t t i e n + m e r i k o r t t e i h i n + m e r i k o r t t i + m e r i k o r t t i e n + m e r i k o t i m a a n k a u p p a + m e r i k o t k a + m e r i k o t k a n + m e r i k o t k a t + m e r i k o t k i s s a + m e r i k o u l u t u k s e n + m e r i k o u r a + m e r i k u l j e t u k s e e n + m e r i k u l j e t u k s e n + m e r i k u l j e t u k s e s s a + m e r i k u l j e t u k s e s t a + m e r i k u l j e t u k s e t + m e r i k u l j e t u k s i a + m e r i k u l j e t u k s i i n + m e r i k u l j e t u k s i l l e + m e r i k u l j e t u k s i s s a + m e r i k u l j e t u k s i s t a + m e r i k u l j e t u s + m e r i k u l j e t u s a l a + m e r i k u l j e t u s a l a n + m e r i k u l j e t u s a l u s t e n + m e r i k u l j e t u s j ä r j e s t e l m ä ä n + m e r i k u l j e t u s k e t j u n + m e r i k u l j e t u s k e t j u s t a + m e r i k u l j e t u s k u s t a n n u s t e n + m e r i k u l j e t u s r e i t i t + m e r i k u l j e t u s r e i t t e j ä + m e r i k u l j e t u s t a + m e r i k u l j e t u s t e n + m e r i k u l j e t u s t e n s a + m e r i k u l j e t u s t e o l l i s u u d e n + m e r i k u l k u n e u v o l l a + m e r i k y s y m y k s e t + m e r i k y s y m y k s i i n + m e r i k ä y t ä v i e n + m e r i k ä y t ä v i i n + m e r i k ä y t ä v i ä + m e r i k ä y t ä v ä t + m e r i l a i n s ä ä d ä n n ö n + m e r i l a i n s ä ä d ä n n ö s s ä + m e r i l a i n s ä ä d ä n t ö ä + m e r i l a i n s ä ä d ä n t ö ö n + m e r i l a i s t a + m e r i l a i t o s t e n + m e r i l a j e j a + m e r i l a j i n + m e r i l a k i a + m e r i l a p i o s a m m a l + m e r i l e g u a a n i + m e r i l e i j o n a t + m e r i l e o p a r d i + m e r i l i i k e n n e + m e r i l i i k e n n e a l a + m e r i l i i k e n n e a l a a + m e r i l i i k e n n e a l a a n + m e r i l i i k e n n e a l a l l a + m e r i l i i k e n n e a l a l l e + m e r i l i i k e n n e a l a n + m e r i l i i k e n n e a l u e + m e r i l i i k e n n e a l u e e n + m e r i l i i k e n n e a l u e t t a + m e r i l i i k e n n e k a b o t a a s i n + m e r i l i i k e n n e k e t j u a + m e r i l i i k e n n e m a h d o l l i s u u k s i a + m e r i l i i k e n n e m a r k k i n o i l l a + m e r i l i i k e n n e m u o t o j a + m e r i l i i k e n n e o n n e t t o m u u k s i a + m e r i l i i k e n n e p a k e t i n + m e r i l i i k e n n e p a k e t t i + m e r i l i i k e n n e p a l v e l u i h i n + m e r i l i i k e n n e p a l v e l u j a + m e r i l i i k e n n e p o l i t i i k a l l a + m e r i l i i k e n n e p o l i t i i k a n + m e r i l i i k e n n e p o l i t i i k a s t a + m e r i l i i k e n n e p o l i t i i k k a + m e r i l i i k e n n e p o l i t i i k k a a + m e r i l i i k e n n e r e i t t i e n + m e r i l i i k e n n e s o p i m u k s e n + m e r i l i i k e n n e s o p i m u s t a + m e r i l i i k e n n e s t r a t e g i a + m e r i l i i k e n n e s t r a t e g i a a + m e r i l i i k e n n e s t r a t e g i a n + m e r i l i i k e n n e s ä ä n n ö t + m e r i l i i k e n n e t o i m i n t a + m e r i l i i k e n n e t t ä + m e r i l i i k e n n e t u r v a l l i s u u d e n + m e r i l i i k e n n e v ä y l i ä + m e r i l i i k e n n e y h t e y k s i ä + m e r i l i i k e n n e y h t i ö i s s ä + m e r i l i i k e n t e e l l e + m e r i l i i k e n t e e l l ä + m e r i l i i k e n t e e n + m e r i l i i k e n t e e s e e n + m e r i l i i k e n t e e s s ä + m e r i l i i k e n t e e s t ä + m e r i l i i t ä j ä + m e r i l i n j a + m e r i l i n n o i t u s + m e r i l i n n u t + m e r i l i n t u j e n + m e r i l l ä + m e r i l l ä m m e + m e r i l o h e n + m e r i l o h i k a n t a + m e r i l o k k i + m e r i l u k i t + m e r i l u o n n o n + m e r i l u o n n o n v a r o j a + m e r i l u o n n o n v a r o j e n + m e r i l u o n t o a + m e r i l ä m p ö v o i m a l a + m e r i m a a l a u s + m e r i m a h t i + m e r i m a i l i a + m e r i m a i l i i n + m e r i m a i l i n + m e r i m a k k a r a t + m e r i m a r u n a + m e r i m a t k a + m e r i m a t k a i l u + m e r i m a t k a i l u u n + m e r i m a t k a t + m e r i m a t k o i s t a + m e r i m a t k o j e n + m e r i m a t k u s t a j a s a t a m a + m e r i m e r k k i + m e r i m e s t a r i + m e r i m e t s o + m e r i m e t s o j e n + m e r i m e t s o k a n n a n + m e r i m e t s o k a n t a + m e r i m e t s o k a n t o j e n + m e r i m e t s o t + m e r i m e t s o v i t s a u k s e e n + m e r i m i e h i l l e + m e r i m i e h i s t ä + m e r i m i e h i ä m m e + m e r i m i e s s o l m u + m e r i m i e s s ä k k i + m e r i m i n i s t e r i + m e r i m i n i s t e r i n + m e r i m u s e o + m e r i n a h k a k i l p i k o n n a + m e r i n a h k i a i n e n + m e r i n i s ä k k ä i d e n + m e r i n i s ä k k ä i l l e + m e r i n i s ä k k ä i s i i n + m e r i n i s ä k k ä i t ä + m e r i n i s ä k k ä ä t + m e r i n i s ä k ä s k a n t a + m e r i n i s ä k ä s k o m i s s i o + m e r i n i s ä k ä s k u o l e m i s t a + m e r i n o r s u t + m e r i n ä k i n r u o h o + m e r i n ä t k e l m ä + m e r i o i k e u d e k s i + m e r i o i k e u d e l l i s e t + m e r i o i k e u d e n + m e r i o i k e u d e s s a + m e r i o i k e u s + m e r i o i k e u s s o p i m u k s e s t a + m e r i o i k e u s y l e i s s o p i m u k s e n + m e r i o i k e u s y l e i s s o p i m u s + m e r i o i k e u s y l e i s s o p i m u s t a + m e r i o i k e u t e e n + m e r i o i k e u t t a + m e r i o i k e u t t a m m e + m e r i o l o s u h t e e t + m e r i o l o s u h t e i d e n + m e r i o n n e t t o m u u d e n + m e r i o n n e t t o m u u d e s t a + m e r i o n n e t t o m u u d e t + m e r i o n n e t t o m u u k s i a + m e r i o n n e t t o m u u k s i e n + m e r i o n n e t t o m u u k s i i n + m e r i o n n e t t o m u u k s i l l a + m e r i o n n e t t o m u u k s i l l e + m e r i o n n e t t o m u u k s i l t a + m e r i o n n e t t o m u u k s i s s a + m e r i o n n e t t o m u u k s i s t a + m e r i o n n e t t o m u u s + m e r i o n n e t t o m u u s t a p a u k s i s s a + m e r i o n n e t t o m u u t t a + m e r i o p e r a a t i o + m e r i o p e r a a t i o i d e n + m e r i o p e r a a t i o i h i n + m e r i o p e r a a t i o i t a + m e r i o p e r a a t i o n + m e r i o p e r a a t i o n s a + m e r i o p e r a a t i o s t a + m e r i o p e r a a t i o t + m e r i o p e r a a t i o t a + m e r i o p e r a a t i o t a m m e + m e r i o t a k i l o k k i + m e r i p a k e t i n + m e r i p a k e t t i + m e r i p a l v e l u k s e n s a + m e r i p a l v e l u t + m e r i p a r t i o + m e r i p a r t i o r e i t e i s t ä + m e r i p e l a s t u k s e e n + m e r i p e l a s t u k s e t + m e r i p e l a s t u s a l u e t t a a n + m e r i p e l a s t u s t o i m e t + m e r i p e l a s t u s t o i m i e n + m e r i p e l a s t u s v ä l i n e i t ä + m e r i p e l a s t u s y k s i k ö i h i n + m e r i p e n i n k u l m a + m e r i p e n i n k u l m a a + m e r i p e n i n k u l m a a n + m e r i p e n i n k u l m a n + m e r i p e r i n t ö ö n + m e r i p i h k a h a p p o + m e r i p i h k a h a p p o a n h y d r i d i + m e r i p i h k a h u o n e + m e r i p i h k a k o t i l o + m e r i p o l i i s i + m e r i p o l i t i i k a l l a + m e r i p o l i t i i k a l l e + m e r i p o l i t i i k a l t a + m e r i p o l i t i i k a n + m e r i p o l i t i i k a s s a + m e r i p o l i t i i k a s s a a n + m e r i p o l i t i i k a s t a + m e r i p o l i t i i k k a + m e r i p o l i t i i k k a a + m e r i p o l i t i i k k a a m m e + m e r i p o l i t i i k k a a n + m e r i p o l i t i i k k a n s a + m e r i p o l i t i i k k o i h i n + m e r i p o l t t o a i n e i t a + m e r i p u o l u s t u s + m e r i p u o l u s t u s a l u e + m e r i p ä i v i e n + m e r i p ä i v ä + m e r i p ä i v ä n + m e r i p ä i v ä ä + m e r i p ä i v ä ä n + m e r i r a h t i a + m e r i r a h t i k u l j e t u k s i i n + m e r i r a h t i k u l j e t u s t e n + m e r i r a h t i l i i k e n t e e n + m e r i r a j a + m e r i r a j a a + m e r i r a j a k e s k u s + m e r i r a j a k i i s t a n s a + m e r i r a j a n + m e r i r a j a o p e r a a t i o i h i n + m e r i r a j a o p e r a a t i o s s a + m e r i r a j a s t a + m e r i r a j a t + m e r i r a j a t a r k a s t u k s i a + m e r i r a j a v a l v o n n a s t a + m e r i r a j a v a l v o n t a a + m e r i r a j a v a l v o n t a j ä r j e s t e l m ä n s ä + m e r i r a j o i h i n + m e r i r a j o i l l a + m e r i r a j o i l l a a n + m e r i r a j o i l l a m m e + m e r i r a j o i l l e + m e r i r a j o i l l e m m e + m e r i r a j o i l t a a n + m e r i r a j o i s t a + m e r i r a j o j a + m e r i r a j o j a a n + m e r i r a j o j a m m e + m e r i r a j o j e m m e + m e r i r a j o j e n + m e r i r a t a m o + m e r i r e i t e i l l e + m e r i r e i t e i l l ä + m e r i r e i t e i s t ä + m e r i r e i t t e j ä + m e r i r e i t t e j ä m m e + m e r i r e i t t i e n + m e r i r e i t t i ä + m e r i r e s u r s s e i h i n + m e r i r e s u r s s e j a + m e r i r o k k o + m e r i r o s v o a l u s t a + m e r i r o s v o a s u j a + m e r i r o s v o e l o k u v a + m e r i r o s v o i k s i + m e r i r o s v o j o u k o k s i + m e r i r o s v o j ä r j e s t ö j e n + m e r i r o s v o j ä r j e s t ö j ä + m e r i r o s v o l a i v a s t o + m e r i r o s v o l i p p u + m e r i r o s v o p o u k a m a + m e r i r o s v o r a d i o + m e r i r o s v o r a h a + m e r i r o s v o s a t a m i a + m e r i r o s v o t + m e r i r o s v o u d e n + m e r i r o s v o u d e s t a + m e r i r o s v o u k s e n + m e r i r o s v o u s + m e r i r o s v o u s t a p a u k s i a + m e r i r o s v o u s t a p a u s t e n + m e r i r o s v o u t e e n + m e r i r o s v o u t t a + m e r i r u o a s t a + m e r i s a a r r o n + m e r i s a a r t o + m e r i s a a r t o a + m e r i s a t a m a + m e r i s a t a m a h a n k k e i t a + m e r i s a t a m a p o l i t i i k a s t a + m e r i s a t a m i a + m e r i s a t a m i e n + m e r i s a t a m i i n + m e r i s a t a m i s s a + m e r i s a t a m i s t a + m e r i s a u k k o + m e r i s e l i t y s + m e r i s i i l i n + m e r i s i i l i t + m e r i s i n i k o r e n t o + m e r i s i p u l i + m e r i s i r r i + m e r i s o d a n k ä y n t i + m e r i s o l m u k k i + m e r i s o p i m u k s i s s a + m e r i s o p i m u s t e n + m e r i s o t a t o i m e t + m e r i s s ä m m e + m e r i s t r a t e g i a + m e r i s t r a t e g i a a + m e r i s t r a t e g i a a n + m e r i s t r a t e g i a d i r e k t i i v i + m e r i s t r a t e g i a d i r e k t i i v i i n + m e r i s t r a t e g i a d i r e k t i i v i k s i + m e r i s t r a t e g i a d i r e k t i i v i n + m e r i s t r a t e g i a d i r e k t i i v i s s ä + m e r i s t r a t e g i a d i r e k t i i v i ä + m e r i s t r a t e g i a l l a + m e r i s t r a t e g i a n + m e r i s t r a t e g i a p u i t e d i r e k t i i v i + m e r i s t r a t e g i a s t a + m e r i s t r a t e g i o i d e n + m e r i s t r a t e g i o i t a + m e r i s t ä + m e r i s u l a t + m e r i s u o j a v a l l i e n + m e r i s u o j e l u a l u e e t + m e r i s u o j e l u a l u e i d e n + m e r i s u o l a + m e r i t a i s t e l u m m e + m e r i t a i s t e l u s t a + m e r i t a l o u d e n + m e r i t a l o u d e s t a + m e r i t a l o u s + m e r i t a l o u t t a + m e r i t e i l l ä + m e r i t e i t ä + m e r i t e k n i s e t + m e r i t e k n i s i l l e + m e r i t e k n i s i ä + m e r i t e k n i s t e n + m e r i t e k n o l o g i a a + m e r i t e k n o l o g i a a n + m e r i t e k n o l o g i a n + m e r i t e o l l i s u u d e l l a + m e r i t e o l l i s u u d e n + m e r i t e o l l i s u u d e s t a + m e r i t e o l l i s u u s + m e r i t e o l l i s u u t e e n + m e r i t e o l l i s u u t t a m m e + m e r i t e r r o r i s m i k s i + m e r i t i e d e + m e r i t i e d e y h t e i s ö n + m e r i t i e d u s t e l u + m e r i t i e d u s t e l u k o n e e n + m e r i t i e n + m e r i t i e t + m e r i t i e t e e n + m e r i t i e t e e t + m e r i t i e t e i d e n + m e r i t i e t ä + m e r i t i e y h t e y s + m e r i t i e y h t e y t t ä + m e r i t i l a a n + m e r i t o r j u n t a o h j u s + m e r i t u l i + m e r i t u l l i t + m e r i t u o t t e i d e n + m e r i t u r s a s + m e r i t u r v a l l i s u u d e l l e + m e r i t u r v a l l i s u u d e n + m e r i t u r v a l l i s u u d e s s a + m e r i t u r v a l l i s u u d e s t a + m e r i t u r v a l l i s u u s + m e r i t u r v a l l i s u u s a l u e + m e r i t u r v a l l i s u u s a l u e e n + m e r i t u r v a l l i s u u s a l u e t t a + m e r i t u r v a l l i s u u s a s i o i s s a + m e r i t u r v a l l i s u u s k o m i t e a + m e r i t u r v a l l i s u u s k o m i t e a a n + m e r i t u r v a l l i s u u s k o m i t e a l l a + m e r i t u r v a l l i s u u s k o m i t e a n + m e r i t u r v a l l i s u u s k u l t t u u r i n + m e r i t u r v a l l i s u u s k y s y m y k s e s s ä + m e r i t u r v a l l i s u u s k y s y m y k s e t + m e r i t u r v a l l i s u u s k y s y m y s t e n + m e r i t u r v a l l i s u u s l a i n s ä ä d ä n t ö + m e r i t u r v a l l i s u u s n o r m e j a + m e r i t u r v a l l i s u u s n ä k ö k o h t i a + m e r i t u r v a l l i s u u s o n g e l m i a + m e r i t u r v a l l i s u u s p a k e t i l l a + m e r i t u r v a l l i s u u s p a k e t i l l e + m e r i t u r v a l l i s u u s p a k e t i n + m e r i t u r v a l l i s u u s p a k e t i s s a + m e r i t u r v a l l i s u u s p a k e t i s t a + m e r i t u r v a l l i s u u s p a k e t t i + m e r i t u r v a l l i s u u s p a k e t t i a + m e r i t u r v a l l i s u u s p o l i t i i k a s t a + m e r i t u r v a l l i s u u s p o l i t i i k k a a n + m e r i t u r v a l l i s u u s s o p i m u k s i s s a + m e r i t u r v a l l i s u u s s t r a t e g i a a + m e r i t u r v a l l i s u u s t o i m e n p i t e i t ä + m e r i t u r v a l l i s u u s t o i m i a + m e r i t u r v a l l i s u u s t y ö t ä + m e r i t u r v a l l i s u u s v a a t i m u k s i a + m e r i t u r v a l l i s u u s v e r k o s t o n + m e r i t u r v a l l i s u u s v i r a n o m a i n e n + m e r i t u r v a l l i s u u s v i r a n o m a i s e e n + m e r i t u r v a l l i s u u s v i r a s t o + m e r i t u r v a l l i s u u s v i r a s t o a + m e r i t u r v a l l i s u u s v i r a s t o l l a + m e r i t u r v a l l i s u u s v i r a s t o l l e + m e r i t u r v a l l i s u u s v i r a s t o l t a + m e r i t u r v a l l i s u u s v i r a s t o n + m e r i t u r v a l l i s u u s v i r a s t o n n e + m e r i t u r v a l l i s u u s v i r a s t o o n + m e r i t u r v a l l i s u u s v i r a s t o s s a + m e r i t u r v a l l i s u u s v i r a s t o s t a + m e r i t u r v a l l i s u u s y k s i k k ö ä + m e r i t u r v a l l i s u u t e e n + m e r i t u r v a l l i s u u t t a + m e r i t u t k i m u s + m e r i t u t k i m u s i n f r a s t r u k t u u r e j a + m e r i t u t k i m u s t a + m e r i t u u l e n + m e r i t u u l i + m e r i t u u l i s ä h k ö n + m e r i t u u l i v o i m a + m e r i t u u l i v o i m a a + m e r i t u u l i v o i m a h a n k k e e t + m e r i t u u l i v o i m a h a n k k e i t a + m e r i t u u l i v o i m a n + m e r i t u u l i v o i m a p u i s t o t + m e r i t u u l i v o i m a s t a + m e r i t u u l i v o i m a v e r k k o + m e r i t y r ä k k i + m e r i t y ö n + m e r i t y ö n o r m i e n + m e r i t y ö n t e k i j ö i d e n + m e r i t y ö o l o j a + m e r i t y ö p a i k k o j a + m e r i t y ö t ä + m e r i t y ö v o i m a a + m e r i u l k o r a j o j a + m e r i u l o t t u v u u s + m e r i v a l l a t + m e r i v a l t a + m e r i v a l t i o + m e r i v a l t i o i d e n + m e r i v a l t i o i l l e + m e r i v a l t o j e n + m e r i v a l v o n n a n + m e r i v a l v o n n a s s a + m e r i v a l v o n t a + m e r i v a l v o n t a a + m e r i v a l v o n t a a n + m e r i v a l v o n t a o h j e l m i i n + m e r i v a l v o n t a p a r t i o i s t a + m e r i v a l v o n t a t i e t o j e n + m e r i v a r o i h i m m e + m e r i v a r o i h i n + m e r i v a r o j a + m e r i v a r o j e m m e + m e r i v a r o j e n + m e r i v a r t i o k o u l u + m e r i v a r t i o s t o + m e r i v a r t i o s t o n + m e r i v e d e n + m e r i v e d e s t ä + m e r i v e d e t + m e r i v e r o j ä r j e s t e l m ä + m e r i v e r o j ä r j e s t e l m ä s t ä + m e r i v e r o j ä r j e s t e l m ä ä + m e r i v e r o n + m e r i v e s i a l u e + m e r i v e s i a l u e i l l a + m e r i v e s i e n + m e r i v e s i k y s y m y k s e e n + m e r i v e s i l l ä + m e r i v e s i s s ä + m e r i v e s i s t ä + m e r i v e s i ä + m e r i v e t e e n + m e r i v e t e n s ä + m e r i v e t t ä + m e r i v i e n t i k a u p a n + m e r i v i h v i l ä + m e r i v i r a n o m a i s t e n + m e r i v i r r a t + m e r i v i r r o i s s a + m e r i v i r t a + m e r i v i r t o j e n + m e r i v o i m a t + m e r i v o i m i a + m e r i v o i m i e n + m e r i v o i m i i n + m e r i v u o k o t + m e r i v ä y l ä n ä + m e r i y d i n j ä t t e e s t ä + m e r i y h t e y d e t + m e r i y h t e y k s i i n + m e r i y h t e y k s i ä + m e r i y h t e y t t ä + m e r i y m p ä r i s t ö + m e r i y m p ä r i s t ö a l a n + m e r i y m p ä r i s t ö i h i n + m e r i y m p ä r i s t ö j e n + m e r i y m p ä r i s t ö j ä + m e r i y m p ä r i s t ö j ä r j e s t ö i l t ä + m e r i y m p ä r i s t ö l l e + m e r i y m p ä r i s t ö l l e m m e + m e r i y m p ä r i s t ö l t ä + m e r i y m p ä r i s t ö m m e + m e r i y m p ä r i s t ö n + m e r i y m p ä r i s t ö p o l i t i i k a n + m e r i y m p ä r i s t ö p o l i t i i k a s s a + m e r i y m p ä r i s t ö p o l i t i i k k a + m e r i y m p ä r i s t ö p o l i t i i k k a a + m e r i y m p ä r i s t ö s s ä + m e r i y m p ä r i s t ö s t r a t e g i a + m e r i y m p ä r i s t ö s t r a t e g i a a + m e r i y m p ä r i s t ö s t r a t e g i a d i r e k t i i v i + m e r i y m p ä r i s t ö s t r a t e g i a s t a + m e r i y m p ä r i s t ö s t ä + m e r i y m p ä r i s t ö ä + m e r i y m p ä r i s t ö ö m m e + m e r i y m p ä r i s t ö ö n + m e r i y r i t y k s i ä + m e r i ä + m e r i ä m m e + m e r k e i s t ä + m e r k e l i l l e + m e r k e l i n + m e r k e l i ä + m e r k i l l e + m e r k i l l e p a n t a v a a + m e r k i l l e p a n t a v i n + m e r k i l l i s e e n + m e r k i l l i s e k s i + m e r k i l l i s e m p ä ä + m e r k i l l i s e n ä + m e r k i l l i s i n t ä + m e r k i l l i s t ä + m e r k i l l ä + m e r k i n + m e r k i n a n t o j ä r j e s t e l m i e n + m e r k i n a n t o j ä r j e s t e l m i ä + m e r k i n a n t o j ä r j e s t e l m ä + m e r k i n a n t o j ä r j e s t e l m ä n + m e r k i n a n t o j ä r j e s t e l m ä ä + m e r k i n a n t o p i s t o o l i + m e r k i n a n t o v i r h e + m e r k i n h a l t i j o i l l e + m e r k i n n e e t + m e r k i n n ä n + m e r k i n n ä s s ä + m e r k i n n ä s t ä + m e r k i n n ä t + m e r k i n n ö i l l ä + m e r k i n n ö i n + m e r k i n n ö i s s ä + m e r k i n n ö i s t ä + m e r k i n t ä a l o i t t e i s i i n + m e r k i n t ä a s e t u k s i a + m e r k i n t ä a s i o i s s a + m e r k i n t ä d i r e k t i i v i + m e r k i n t ä d i r e k t i i v i i n + m e r k i n t ä d i r e k t i i v i s s ä + m e r k i n t ä e h d o t u k s i a + m e r k i n t ä e h d o t u s + m e r k i n t ä h u i j a u s + m e r k i n t ä h u i j a u s t a + m e r k i n t ä j ä r j e s t e l m i e n + m e r k i n t ä j ä r j e s t e l m i i n + m e r k i n t ä j ä r j e s t e l m i s s ä + m e r k i n t ä j ä r j e s t e l m i s t ä + m e r k i n t ä j ä r j e s t e l m i ä + m e r k i n t ä j ä r j e s t e l m ä + m e r k i n t ä j ä r j e s t e l m ä l l ä + m e r k i n t ä j ä r j e s t e l m ä n + m e r k i n t ä j ä r j e s t e l m ä n s ä + m e r k i n t ä j ä r j e s t e l m ä s s ä + m e r k i n t ä j ä r j e s t e l m ä s t ä + m e r k i n t ä j ä r j e s t e l m ä t + m e r k i n t ä j ä r j e s t e l m ä ä + m e r k i n t ä j ä r j e s t e l m ä ä n + m e r k i n t ä k i e l i + m e r k i n t ä k r i t e e r e j ä + m e r k i n t ä k r i t e e r i t + m e r k i n t ä k y n n y s + m e r k i n t ä k y s y m y k s e n + m e r k i n t ä k y s y m y k s e t + m e r k i n t ä k y s y m y s + m e r k i n t ä k ä y t ä n n ö n + m e r k i n t ä l a j e i h i n + m e r k i n t ä l a k i a + m e r k i n t ä m a h d o l l i s u u d e t + m e r k i n t ä m e n e t t e l y + m e r k i n t ä m e n e t t e l y ä + m e r k i n t ä m ä ä r ä y k s e t + m e r k i n t ä m ä ä r ä y k s i s t ä + m e r k i n t ä m ä ä r ä y s t e n + m e r k i n t ä n o r m i t + m e r k i n t ä o h j e l m a a + m e r k i n t ä o n g e l m a a + m e r k i n t ä o n g e l m a n + m e r k i n t ä p a k k o + m e r k i n t ä p a k k o a + m e r k i n t ä p a k o s t a + m e r k i n t ä p o l i t i i k a l l a + m e r k i n t ä p o l i t i i k k a a + m e r k i n t ä r a j a + m e r k i n t ä r o k o t t e i d e n + m e r k i n t ä s ä ä n n ö i s t ä + m e r k i n t ä s ä ä n n ö k s i s t ä + m e r k i n t ä s ä ä n n ö k s i ä + m e r k i n t ä s ä ä n n ö t + m e r k i n t ä s ä ä n t ö j e n + m e r k i n t ä s ä ä n t ö j ä + m e r k i n t ä s ä ä n t ö j ä ä n + m e r k i n t ä t a k e i t a + m e r k i n t ä t e k n i i k k a a + m e r k i n t ä t i l a n t e e n + m e r k i n t ä v a a t i m u k s e n + m e r k i n t ä v a a t i m u k s e s t a + m e r k i n t ä v a a t i m u k s e t + m e r k i n t ä v a a t i m u k s i a + m e r k i n t ä v a a t i m u k s i e n + m e r k i n t ä v a a t i m u k s i i n + m e r k i n t ä v a a t i m u k s i l l a + m e r k i n t ä v a a t i m u k s i n e e n + m e r k i n t ä v a a t i m u k s i s t a + m e r k i n t ä v a a t i m u s + m e r k i n t ä v a a t i m u s t a + m e r k i n t ä v a a t i m u s t e n + m e r k i n t ä v a i h t o e h t o a + m e r k i n t ä v a i h t o e h t o j a + m e r k i n t ä v a l i k o i m a a + m e r k i n t ä v a p a u t u s k y n n y k s e n + m e r k i n t ä v e l v o i t e + m e r k i n t ä v e l v o i t t e e n + m e r k i n t ä v e l v o i t t e i d e n + m e r k i n t ä v e l v o i t t e i t a + m e r k i n t ä v e l v o l l i s u u d e n + m e r k i n t ä v e l v o l l i s u u d e s t a + m e r k i n t ä v e l v o l l i s u u s + m e r k i n t ä v i i d a k k o o n + m e r k i n t ä v i m m a + m e r k i n t ä ä + m e r k i n t ö i h i n + m e r k i n t ö j e n + m e r k i n t ö j ä + m e r k i n t ö j ä k ä ä n + m e r k i t + m e r k i t s e e + m e r k i t s e e k i n + m e r k i t s e e k ä ä n + m e r k i t s e e k ö + m e r k i t s e m i s a s e t u s + m e r k i t s e m i s e n + m e r k i t s e m i s e s s ä + m e r k i t s e m i s e s t ä + m e r k i t s e m i s j ä r j e s t e l m ä n + m e r k i t s e m i s j ä r j e s t e l m ä ä + m e r k i t s e m i s s ä ä n n ö s + m e r k i t s e m i s t ä + m e r k i t s e m i s v a a t i m u k s e n + m e r k i t s e m ä t t ä + m e r k i t s e m ä ä n + m e r k i t s e v ä t + m e r k i t s i + m e r k i t s i s i + m e r k i t s i s i k i n + m e r k i t s i s i v ä t + m e r k i t s i v ä t + m e r k i t t y j e n + m e r k i t t y j ä + m e r k i t t ä v i e n + m e r k i t t ä v i i n + m e r k i t t ä v i k s i + m e r k i t t ä v i l l e + m e r k i t t ä v i l l ä + m e r k i t t ä v i l t ä + m e r k i t t ä v i m m i l l e + m e r k i t t ä v i m m i s t ä + m e r k i t t ä v i m m ä k s i + m e r k i t t ä v i m m ä l l ä + m e r k i t t ä v i m m ä l t ä + m e r k i t t ä v i m m ä n + m e r k i t t ä v i m m ä s s ä + m e r k i t t ä v i m m ä s t ä + m e r k i t t ä v i m m ä t + m e r k i t t ä v i m m ä t k i n + m e r k i t t ä v i m p i e n + m e r k i t t ä v i m p i i n + m e r k i t t ä v i m p i n ä + m e r k i t t ä v i m p i ä + m e r k i t t ä v i m p ä n ä + m e r k i t t ä v i m p ä ä n + m e r k i t t ä v i n + m e r k i t t ä v i n t ä + m e r k i t t ä v i n ä + m e r k i t t ä v i s s ä + m e r k i t t ä v i s t ä + m e r k i t t ä v i ä + m e r k i t t ä v i ä k i n + m e r k i t t ä v y y d e n + m e r k i t t ä v ä k s i + m e r k i t t ä v ä l l ä + m e r k i t t ä v ä m m i k s i + m e r k i t t ä v ä m m i l l e + m e r k i t t ä v ä m m i n + m e r k i t t ä v ä m m i s t ä + m e r k i t t ä v ä m m ä k s i + m e r k i t t ä v ä m m ä l l e + m e r k i t t ä v ä m m ä n + m e r k i t t ä v ä m m ä s t ä + m e r k i t t ä v ä m m ä t + m e r k i t t ä v ä m p i + m e r k i t t ä v ä m p i e n + m e r k i t t ä v ä m p i i n + m e r k i t t ä v ä m p i n ä + m e r k i t t ä v ä m p i ä + m e r k i t t ä v ä m p ä n ä + m e r k i t t ä v ä m p ä ä + m e r k i t t ä v ä m p ä ä n + m e r k i t t ä v ä n + m e r k i t t ä v ä n ä + m e r k i t t ä v ä s s ä + m e r k i t t ä v ä s t ä + m e r k i t t ä v ä t + m e r k i t t ä v ä ä + m e r k i t t ä v ä ä n + m e r k i t y k s e e n + m e r k i t y k s e l l i s e e n + m e r k i t y k s e l l i s e m m i n + m e r k i t y k s e l l i s e m m ä n + m e r k i t y k s e l l i s e m m ä t + m e r k i t y k s e l l i s e m p i + m e r k i t y k s e l l i s e m p i ä + m e r k i t y k s e l l i s e m p ä ä + m e r k i t y k s e l l i s i m m i s t ä + m e r k i t y k s e l l i s i m m ä t + m e r k i t y k s e l l i s i m p i ä + m e r k i t y k s e l l i s i n + m e r k i t y k s e l l i s i s t ä + m e r k i t y k s e l l i s i ä + m e r k i t y k s e l t ä ä n + m e r k i t y k s e n + m e r k i t y k s e n s ä + m e r k i t y k s e s s ä + m e r k i t y k s e s s ä ä n + m e r k i t y k s e s t ä + m e r k i t y k s e s t ä m m e + m e r k i t y k s e s t ä ä n + m e r k i t y k s e t t ö m i l l ä + m e r k i t y k s e t t ö m i ä + m e r k i t y k s e t t ö m ä k s i + m e r k i t y k s e t t ö m ä l t ä + m e r k i t y k s e t t ö m ä m p i + m e r k i t y k s e t t ö m ä m p i ä + m e r k i t y k s e t t ö m ä m p ä ä + m e r k i t y k s e t ö n t ä + m e r k i t y k s i s s ä + m e r k i t y s e r o + m e r k i t y s e r o s t a + m e r k i t y s t ä + m e r k i t y s t ä k ä ä n + m e r k i t y s t ä ä n + m e r k i t y s v i v a h t e i l l e + m e r k i t ä ä n + m e r k k e i h i n + m e r k k e j ä + m e r k k i a i n e r o k o t t e i t a + m e r k k i a i n e r o k o t u k s e n + m e r k k i a i n e r o k o t u s + m e r k k i e n + m e r k k i h e n k i l ö i d e n + m e r k k i h e n k i l ö i h i n + m e r k k i h e n k i l ö i s t ä + m e r k k i h e t k i + m e r k k i i n + m e r k k i j o n o h a k u a l g o r i t m i + m e r k k i j ä r j e s t e l m ä + m e r k k i j ä r j e s t e l m ä n + m e r k k i j ä r j e s t e l m ä s t ä + m e r k k i j ä r j e s t e l m ä ä + m e r k k i k e n g ä t + m e r k k i k i e l t ä + m e r k k i n i m i t y k s i ä + m e r k k i n ä + m e r k k i o i k e u d e t + m e r k k i p a a l u n a + m e r k k i p y l v ä s + m e r k k i r o k o t t e i d e n + m e r k k i r o k o t t e i t a + m e r k k i s e l o s t u k s e n + m e r k k i t a p a h t u m a a + m e r k k i t a v a r o i d e n + m e r k k i t e s t i + m e r k k i t u o t t e i d e n + m e r k k i t u o t t e i s i i n + m e r k k i t u o t t e i s t a + m e r k k i t u o t t e i t a + m e r k k i v a a t t e i d e n + m e r k k i v a a t t e i t a + m e r k k i v a l o l a i t t e e t + m e r k k i v a l o l a i t t e i d e n + m e r k k i v a l o t + m e r k k i v i i d a k k o + m e r k k i v i i t t a u s + m e r k k i v i s k i t + m e r k k i ä + m e r k k i ä k ä ä n + m e r t e n + m e s i a n g e r v o + m e s i h e r t t a l e h t i + m e s i k o l i b r i + m e s i k ä m m e k k ä + m e s i m a a y ö k k ö n e n + m e s i m a r j a + m e s i m ä y r ä + m e s i s i l k k i y r t t i + m e s i s m a r a g d i k o l i b r i + m e s s i n k i b a r b i + m e s s u i h i n + m e s s u i l l a + m e s s u i l l e + m e s s u j ä r j e s t ä j ä + m e s s u k a u p u n k i e n + m e s s u k e s k u s + m e s s u t + m e s s u u n + m e s t a l l a + m e s t a r e i d e n + m e s t a r e i s t a + m e s t a r e i t a + m e s t a r i a + m e s t a r i e n + m e s t a r i h u i j a r i t + m e s t a r i s u o r i t u k s e n + m e s t a r i s u u n n i t e l m a + m e s t a r i t + m e s t a r u u s k i l p a i l u i h i n + m e s t a r u u s k i l p a i l u i s s a + m e s t a r u u s k i l p a i l u i t a + m e s t a r u u s k i l p a i l u j e n + m e s t a r u u s k i l p a i l u t + m e s t a r u u s k i s o j a + m e s t a r u u s k i s o j e n + m e s t a r u u s o t t e l u + m e s t a r u u s s a r j a + m e s t a r u u s t u r n a u s + m e s t a u k s e t + m e t a a n i h y d r a a t e i s t a + m e t a a n i h ä v i k k i + m e t a a n i k a a s u a + m e t a a n i k a a s u p ä ä s t ö j ä + m e t a a n i k a a s u s t a + m e t a a n i n + m e t a a n i p ä ä s t ö i s t ä + m e t a a n i p ä ä s t ö j e n + m e t a a n i p ä ä s t ö j ä + m e t a a n i p ä ä s t ö t + m e t a a n i s u l f o n i h a p p o + m e t a a n i s u l f o n y y l i k l o r i d i + m e t a d o n i n + m e t a e t i i k k a + m e t a l l e j a + m e t a l l i a + m e t a l l i a l a n + m e t a l l i a l o i l l a + m e t a l l i a r s e n i k k i + m e t a l l i e n + m e t a l l i e s i n e i d e n + m e t a l l i e s i n e i s t ä + m e t a l l i k o l i k o i h i n + m e t a l l i k o n s e n t r a a t t e j a + m e t a l l i k o o s t u m u k s e s t a + m e t a l l i k u u m e + m e t a l l i l e v y i n ä + m e t a l l i m a l m i e n + m e t a l l i m a l m i n + m e t a l l i m e s s u + m e t a l l i m u s i i k k i + m e t a l l i m y r k y t y k s e s t ä + m e t a l l i n i l m a i s i m e t + m e t a l l i n p a l j a s t i n + m e t a l l i o s i s t a + m e t a l l i p ö r s s i s s ä + m e t a l l i r a h a n + m e t a l l i r a h o j e n + m e t a l l i r o m u + m e t a l l i r o m u a + m e t a l l i r o m u l a s t i n + m e t a l l i r o m u n a + m e t a l l i s e o k s i a + m e t a l l i s i d o s + m e t a l l i s u l a t t a m o t + m e t a l l i t e o l l i s u u d e s s a + m e t a l l i t e o l l i s u u d e s t a + m e t a l l i t e o l l i s u u s + m e t a l l i t u o t t e i d e n + m e t a l l i t y ö n t e k i j ö i d e n + m e t a n o l i p i t o i s u u s + m e t a n o l i t a l o u d e n + m e t a n o l i t a l o u s + m e t a o i k e u s + m e t e l i ä + m e t e o r i p a r v i + m e t e o r i p a r v i s t a + m e t e o r o l o g i a s t a + m e t o d e i s t a + m e t o d i n + m e t o d i n ä y t t e l e m i n e n + m e t o d i o p i n + m e t o d i s t i k i r k k o + m e t o d o l o g i a k e s k u k s e n a + m e t o d o l o g i s e m p i i n + m e t o d o l o g i s e s t i + m e t o k s i d i m e t y y l i t r y p t a m i i n i + m e t r e i l l e + m e t r i j ä r j e s t e l m ä + m e t r i j ä r j e s t e l m ä n + m e t r i j ä r j e s t e l m ä ä + m e t r i n + m e t r i s o p i m u s + m e t r i ä + m e t r o a + m e t r o a s e m a + m e t r o a s e m a a + m e t r o a s e m a a n + m e t r o a s e m a l l a + m e t r o a s e m i l l a + m e t r o i s s a + m e t r o j u n a a + m e t r o j u n i a + m e t r o j ä r j e s t e l m i e n + m e t r o j ä r j e s t e l m i ä + m e t r o l i n j a + m e t r o l i n j a a + m e t r o l i n j a t + m e t r o l i p u n + m e t r o l o g i a d i r e k t i i v i e n + m e t r o l o g i a d i r e k t i i v i l l e + m e t r o l o g i a s ä ä n t ö j e n + m e t r o n + m e t r o p o l i a + m e t r o p o l i a l u e + m e t r o p o l i a l u e i l l a + m e t r o p o l i k r e i v i k u n t a + m e t s i e n + m e t s i e n h o i t o + m e t s i e n s u o j e l u a + m e t s i e n s u o j e l u l a k i + m e t s i e n s u o j e l u n + m e t s i e n s u o j e l u o h j e l m a + m e t s i e n s u o j e l u o h j e l m a a + m e t s i e n s u o j e l u p o l i t i i k k a + m e t s i e n s u o j e l u p o l i t i i k k a a + m e t s i e n s u o j e l u s t r a t e g i a n + m e t s i i n + m e t s i k s i + m e t s i k ö t + m e t s i l l e + m e t s i l l ä + m e t s i s s ä + m e t s i s t ä + m e t s i t t ä m i s e s t ä + m e t s i t t ä m i s t o i m i a + m e t s i t y s m ä ä r ä r a h o j e n + m e t s i t y s o h j e l m a + m e t s i t y s o h j e l m a a + m e t s i t y s o h j e l m a n + m e t s i t y s o h j e l m i i n + m e t s i t y s o h j e l m i l l e + m e t s i t y s o h j e l m i s t a + m e t s i t y s p o l i t i i k k a a + m e t s i t y s t o i m e n p i d e j ä r j e s t e l m ä + m e t s i t y s t o i m e n p i t e i s t ä + m e t s i t y s t o i m e n p i t e i t ä + m e t s i t y s t o i m i e n + m e t s i t y s t u e l l a + m e t s i t y s t u e n + m e t s i ä + m e t s i ä m m e + m e t s ä a l a + m e t s ä a l a a + m e t s ä a l a a m m e + m e t s ä a l a l l a + m e t s ä a l a l l e + m e t s ä a l a n + m e t s ä a l a s t a + m e t s ä a l u e e m m e + m e t s ä a l u e e t + m e t s ä a l u e i d e n + m e t s ä a l u e i l l a + m e t s ä a l u e i s i i n + m e t s ä a l u e i s t a + m e t s ä a l u e i t a + m e t s ä a l v e j u u r i + m e t s ä a p i l a + m e t s ä a r o + m e t s ä a s e t u k s e e n + m e t s ä a s e t u k s e l l e + m e t s ä a s i a + m e t s ä a s i a n t u n t i j o i d e n + m e t s ä a s i a t + m e t s ä a s i o i d e n + m e t s ä a s i o i s s a + m e t s ä a s i o i s t a + m e t s ä a u t o t i e t + m e t s ä b u l b u l i + m e t s ä d i r e k t i i v i s s ä + m e t s ä e k o s y s t e e m e j ä + m e t s ä e k o s y s t e e m i + m e t s ä e k o s y s t e e m i e n + m e t s ä e k o s y s t e e m i i n + m e t s ä e k o s y s t e e m i n + m e t s ä e t a n a + m e t s ä f o o r u m i n + m e t s ä h a a p a + m e t s ä h a k k u i s t a + m e t s ä h a l l i n n o l l i s t e n + m e t s ä h a l l i n n o n + m e t s ä h a l l i n t o + m e t s ä h a l l i n t o a + m e t s ä h a l l i t u s + m e t s ä h a n h i + m e t s ä h i i r i + m e t s ä h o i d o n + m e t s ä h o i t o a + m e t s ä i m a r r e + m e t s ä i n s t i t u u t t i + m e t s ä i s i m m ä n + m e t s ä j ä n i s + m e t s ä k a a l i k o i + m e t s ä k a d o s t a + m e t s ä k a r i b u + m e t s ä k a s t i k k a + m e t s ä k a t k e r o + m e t s ä k a t o a + m e t s ä k a u r i i l t a + m e t s ä k a u r i s + m e t s ä k e r r o s s a m m a l + m e t s ä k e s k u s t e l u u n + m e t s ä k i l p i k o n n a + m e t s ä k i m a l a i n e n + m e t s ä k i r v i n e n + m e t s ä k i s s a + m e t s ä k l u s t e r i + m e t s ä k l u s t e r i i n + m e t s ä k o m i s s i o s s a + m e t s ä k o m i t e a n + m e t s ä k o n e i d e n + m e t s ä k o r t e + m e t s ä k o u l u t u s + m e t s ä k u o l e m a t + m e t s ä k u r j e n p o l v i + m e t s ä k u t o j a + m e t s ä k u u s i + m e t s ä k y s y m y k s i e n + m e t s ä k y s y m y k s i i n + m e t s ä k y s y m y k s i s s ä + m e t s ä k y s y m y s + m e t s ä l a i n s ä ä d ä n n ö n + m e t s ä l a i n s ä ä d ä n t ö + m e t s ä l a i n s ä ä d ä n t ö s o p i m u s + m e t s ä l a i n s ä ä d ä n t ö ä + m e t s ä l a i t + m e t s ä l a u h a + m e t s ä l e h m u s + m e t s ä l e p a k k o + m e t s ä l i e k o s a m m a l + m e t s ä l i t u k k a + m e t s ä l l ä + m e t s ä l u m i p y y + m e t s ä m a a n + m e t s ä m a a s t a + m e t s ä m a f i a + m e t s ä m a i t i k k a + m e t s ä m i t t a r i + m e t s ä m y y r ä + m e t s ä n e m ä + m e t s ä n h a k k u i t a + m e t s ä n h a k k u u l l a + m e t s ä n h a k k u u t + m e t s ä n h a l l i n t a m a l l e j a + m e t s ä n h e n k i + m e t s ä n h o i d o l l e + m e t s ä n h o i d o n + m e t s ä n h o i d o s s a + m e t s ä n h o i d o s t a + m e t s ä n h o i t a j i l l e + m e t s ä n h o i t o + m e t s ä n h o i t o a + m e t s ä n h o i t o a l a n + m e t s ä n h o i t o k ä y t ä n n ö i s t ä + m e t s ä n h o i t o k ä y t ä n t ö j ä + m e t s ä n h o i t o l a k i i n + m e t s ä n h o i t o m a h d o l l i s u u k s i e n + m e t s ä n h o i t o m a l l i n + m e t s ä n h o i t o m e n e t e l m i e n + m e t s ä n h o i t o o n + m e t s ä n h o i t o p a l v e l u j a + m e t s ä n h o i t o p o l i t i i k a n + m e t s ä n h o i t o p o l i t i i k k a + m e t s ä n h o i t o p o l i t i i k k a a + m e t s ä n h o i t o s t r a t e g i a a + m e t s ä n h o i t o s t r a t e g i a n + m e t s ä n h o i t o s u u n n i t e l m i e n + m e t s ä n h o i t o t o i m e n p i t e e t + m e t s ä n h o i t o t o i m e n p i t e i t ä + m e t s ä n h o i t o t o i m i e n + m e t s ä n h o i t o t o i m i k u n n i s s a + m e t s ä n h o i t o t o i m i n + m e t s ä n h o i t o t u o t t e i d e n + m e t s ä n i e l u j e n + m e t s ä n i s t u t u k s e s t a + m e t s ä n i s t u t u s h a n k k e i t a + m e t s ä n i s t u t u s p o l i t i i k k a a + m e t s ä n i s t u t u s s u u n n i t e l m a + m e t s ä n i s t u t u s t a + m e t s ä n k ä y t t ö ö n + m e t s ä n o k i p e r h o n e n + m e t s ä n o m i s t a j a + m e t s ä n o m i s t a j a a + m e t s ä n o m i s t a j a n + m e t s ä n o m i s t a j a t + m e t s ä n o m i s t a j i a + m e t s ä n o m i s t a j i e n + m e t s ä n o m i s t a j i l l a + m e t s ä n o m i s t a j i l l e + m e t s ä n o m i s t a j i l t a + m e t s ä n o m i s t u s t a + m e t s ä n o r s u + m e t s ä n s u o j e l u + m e t s ä n s u o j e l u a + m e t s ä n s u o j e l u h a n k k e i t a + m e t s ä n s u o j e l u k y s y m y k s e t + m e t s ä n s u o j e l u k y s y m y k s i ä + m e t s ä n s u o j e l u n + m e t s ä n s u o j e l u o h j e l m a a n + m e t s ä n s u o j e l u o h j e l m a l l e + m e t s ä n s u o j e l u o h j e l m a n + m e t s ä n s u o j e l u o h j e l m i e n + m e t s ä n s u o j e l u t o i m e n p i d e t t ä + m e t s ä n s u o j e l u t o i m e t + m e t s ä n s u o j e l u t o i m i e n + m e t s ä n s u o j e l u t o i m i i n + m e t s ä n s u o j e l u u n + m e t s ä n t u o t a n t o a + m e t s ä n t u t k i m u s l a i t o s + m e t s ä n v a r t i j a + m e t s ä n v a r t i j a p e r h e t t ä + m e t s ä n v a r t i j o i d e n + m e t s ä n v i l j e l y a i n e i s t o + m e t s ä n v i l j e l y a i n e i s t o a + m e t s ä n v i l j e l y a i n e i s t o n + m e t s ä n ä t k e l m ä + m e t s ä o h j e l m a a + m e t s ä o h j e l m a n + m e t s ä o h j e l m a t + m e t s ä o h j e l m i a + m e t s ä o h j e l m i e n + m e t s ä o m e n a p u u + m e t s ä o n g e l m a a + m e t s ä o n g e l m a s t a + m e t s ä o r v o k k i + m e t s ä p a l o + m e t s ä p a l o a + m e t s ä p a l o a s i a a n + m e t s ä p a l o a s i a n t u n t i j o i s t a + m e t s ä p a l o i h i n + m e t s ä p a l o i l l e + m e t s ä p a l o i l t a + m e t s ä p a l o i n a + m e t s ä p a l o i n e e n + m e t s ä p a l o i s s a + m e t s ä p a l o i s t a + m e t s ä p a l o j a + m e t s ä p a l o j e n + m e t s ä p a l o k s i + m e t s ä p a l o n + m e t s ä p a l o r i s k i + m e t s ä p a l o r i s k i e n + m e t s ä p a l o s t a + m e t s ä p a l o t + m e t s ä p a l o v a a r a n + m e t s ä p a l o v a a r o j e n + m e t s ä p a l o v a r a n + m e t s ä p a p u r i k k o + m e t s ä p e r i n n ö n + m e t s ä p e r i n t ö m m e + m e t s ä p e r i n t ö ä + m e t s ä p e r i n t ö ä m m e + m e t s ä p e r u s t a i n e n + m e t s ä p e r u s t a i s e n + m e t s ä p e r u s t a i s t a + m e t s ä p e u r a + m e t s ä p i n t a + m e t s ä p i s t i n k o l i b r i + m e t s ä p o l i i t t i s e t + m e t s ä p o l i i t t i s i a + m e t s ä p o l i t i i k a l l e + m e t s ä p o l i t i i k a n + m e t s ä p o l i t i i k a s s a + m e t s ä p o l i t i i k a s t a + m e t s ä p o l i t i i k k a + m e t s ä p o l i t i i k k a a + m e t s ä p o l i t i i k k a a n + m e t s ä p o l i t i i k k a n s a + m e t s ä p o l i t i i k k o j a + m e t s ä p o l i t i i k k o j e n + m e t s ä p u o l e n + m e t s ä p u u l a j i e n + m e t s ä p ä ä o m a a + m e t s ä p ä ä s t ä i n e n + m e t s ä r a h a s t o t + m e t s ä r a u t a t i e + m e t s ä r e k i s t e r i + m e t s ä r e k i s t e r i e n + m e t s ä r e k i s t e r i ä + m e t s ä r e s e r v a a t t i i n + m e t s ä r i k o k s i s t a + m e t s ä r u u s u + m e t s ä r ä ä t ä l i + m e t s ä s a m m a k k o + m e t s ä s e k t o r i + m e t s ä s e k t o r i l l a + m e t s ä s e k t o r i l l e + m e t s ä s e k t o r i n + m e t s ä s e k t o r i s t a + m e t s ä s i n i n o k k a + m e t s ä s i t t i ä i n e n + m e t s ä s o p u l i + m e t s ä s t r a t e g i a + m e t s ä s t r a t e g i a a + m e t s ä s t r a t e g i a a n + m e t s ä s t r a t e g i a e s i t y k s e e n + m e t s ä s t r a t e g i a k s i + m e t s ä s t r a t e g i a l l a + m e t s ä s t r a t e g i a l l e + m e t s ä s t r a t e g i a n + m e t s ä s t r a t e g i a s s a + m e t s ä s t r a t e g i a s t a + m e t s ä s t r a t e g i o i d e n + m e t s ä s t r a t e g i o i l l e + m e t s ä s t y k s e e n + m e t s ä s t y s a s i o i s t a + m e t s ä s t y s k a u d e n + m e t s ä s t y s k a u d e s t a + m e t s ä s t y s k a u s i + m e t s ä s t y s k a u s i s t a + m e t s ä s t y s k i e l t o o n + m e t s ä s t y s k o i r a + m e t s ä s t y s k o k e m u k s i a + m e t s ä s t y s k ä y t ä n t ö + m e t s ä s t y s k ä y t ä n t ö j ä + m e t s ä s t y s l a i n + m e t s ä s t y s l a i n s ä ä d ä n t ö ä + m e t s ä s t y s l u v a n + m e t s ä s t y s m a h d o l l i s u u d e t + m e t s ä s t y s m a i l l e + m e t s ä s t y s m e n e t e l m i l l e + m e t s ä s t y s m e n e t e l m ä t + m e t s ä s t y s m u i s t o i s t a + m e t s ä s t y s m u i s t o j a + m e t s ä s t y s m u i s t o j e n + m e t s ä s t y s m ä ä r ä y k s i s t ä + m e t s ä s t y s r a j o i t u k s e t + m e t s ä s t y s r e t k i e n + m e t s ä s t y s s e u r a a n + m e t s ä s t y s s ä ä n n ö k s i ä + m e t s ä s t y s s ä ä n n ö t + m e t s ä s t y s s ä ä n t ö j ä + m e t s ä s t y s t a p o j e n + m e t s ä s t y s t ä + m e t s ä s t y s y h d i s t y s + m e t s ä s t ä j i e n + m e t s ä s t ä j i i n + m e t s ä s t ä j ä j ä r j e s t ö t + m e t s ä s t ä j ä p e r h e e s t ä + m e t s ä s t ä j ä t + m e t s ä s t ä ä + m e t s ä s u o m a l a i s e t + m e t s ä t + m e t s ä t a i m i t a r h a t a l o u t e e n + m e t s ä t a i m i t a r h o j e n + m e t s ä t a l o u d e l l a + m e t s ä t a l o u d e l l e + m e t s ä t a l o u d e l l e e n + m e t s ä t a l o u d e n + m e t s ä t a l o u d e s s a + m e t s ä t a l o u d e s t a + m e t s ä t a l o u s + m e t s ä t a l o u s a l a + m e t s ä t a l o u s a l a a + m e t s ä t a l o u s a l a a n + m e t s ä t a l o u s a l a l l a + m e t s ä t a l o u s a l a n + m e t s ä t a l o u s a s i o i t a + m e t s ä t a l o u s h a n k k e i d e n + m e t s ä t a l o u s j ä r j e s t e l m i e n + m e t s ä t a l o u s k e t j u n + m e t s ä t a l o u s m a i s e m a a k i n + m e t s ä t a l o u s m a l l i + m e t s ä t a l o u s m e n e t e l m ä t + m e t s ä t a l o u s m i n i s t e r i ö n + m e t s ä t a l o u s p o l i t i i k k a a + m e t s ä t a l o u s p o l i t i i k k a a n + m e t s ä t a l o u s p o l i t i i k k o j e n + m e t s ä t a l o u s s t r a t e g i a + m e t s ä t a l o u s s t r a t e g i a a + m e t s ä t a l o u s s t r a t e g i a n + m e t s ä t a l o u s s t r a t e g i a s s a + m e t s ä t a l o u s t o i m e n p i t e i s i i n + m e t s ä t a l o u s t o i m i l l a + m e t s ä t a l o u s t r a k t o r e i t a + m e t s ä t a l o u s t u o t a n n o s t a + m e t s ä t a l o u s t u o t a n t o + m e t s ä t a l o u s t u o t a n t o a + m e t s ä t a l o u s t y ö r y h m ä s s ä + m e t s ä t a l o u s y r i t y s t e n + m e t s ä t a l o u t e e n + m e t s ä t a l o u t t a + m e t s ä t e i d e n + m e t s ä t e k n o l o g i a n + m e t s ä t e o l l i s u u d e l l a m m e + m e t s ä t e o l l i s u u d e n + m e t s ä t e o l l i s u u d e s s a + m e t s ä t e o l l i s u u d e s t a + m e t s ä t e o l l i s u u s + m e t s ä t e o l l i s u u s k l u s t e r i + m e t s ä t e o l l i s u u s k l u s t e r i i n + m e t s ä t e o l l i s u u s t u o t a n n o s t a + m e t s ä t e o l l i s u u s t u o t t e i d e n + m e t s ä t e o l l i s u u t e e n + m e t s ä t e o l l i s u u t e m m e + m e t s ä t e o l l i s u u t t a + m e t s ä t i e d e + m e t s ä t i e t + m e t s ä t i e t o j ä r j e s t e l m i ä + m e t s ä t i l o i l l e + m e t s ä t o i m i e n + m e t s ä t r a k t o r e i d e n + m e t s ä t r a k t o r e i h i n + m e t s ä t r a k t o r e i t a + m e t s ä t r a k t o r i e n + m e t s ä t r a k t o r i t + m e t s ä t u h o j a + m e t s ä t u h o j e n + m e t s ä t u k i e n + m e t s ä t u o t e + m e t s ä t u o t e a l o j e n + m e t s ä t u o t t e e t + m e t s ä t u o t t e i d e n + m e t s ä t y p o l o g i a a + m e t s ä t y y p i s t ä + m e t s ä t y y p p i i n + m e t s ä t y ö n t e k i j ä t + m e t s ä t y ö n t e k i j ö i d e n + m e t s ä t ä h t i + m e t s ä t ä h t i m ö + m e t s ä t ö p ö s i e p p o + m e t s ä u n i k e k o + m e t s ä v a a h t e r a + m e t s ä v a h a n o k k a + m e t s ä v a h i n k o j e n + m e t s ä v a l t i o i h i n + m e t s ä v a l t i o n + m e t s ä v a r o i h i n + m e t s ä v a r o i s t a + m e t s ä v a r o j a + m e t s ä v a r o j a a n + m e t s ä v a r o j e n + m e t s ä v a r o j e n s a + m e t s ä v e l j e t + m e t s ä v i i r i ä i s e t + m e t s ä v i k l o + m e t s ä v i r a n o m a i s e t + m e t s ä v i r a n o m a i s t e n + m e t s ä v i r a s t o n + m e t s ä v i r n a + m e t s ä v y ö h y k k e i t ä + m e t s ä v ä s t ä r ä k k i + m e t s ä y h t i ö i d e n + m e t s ä y h t i ö i l l e + m e t s ä y h t i ö t + m e t s ä y l e i s s o p i m u k s e n + m e t s ä y l e i s s o p i m u k s e s t a + m e t s ä y m p ä r i s t ö + m e t s ä y r i t y s t e n + m e t s ä ä + m e t s ä ä n + m e t t e n + m e t y y l i a s e t a a t t i + m e t y y l i b r o m i d i + m e t y y l i b r o m i d i a + m e t y y l i b r o m i d i i n + m e t y y l i b r o m i d i n + m e t y y l i b r o m i d i s t a + m e t y y l i e l o h o p e a k s i + m e t y y l i j o d i d i + m e t y y l i k e l t a i n e n + m e t y y l i n + m e t y y l i n i t r i i t t i + m e t y y l i o r a n s s i + m e t y y l i p u n a i n e n + m e t y y l i s a l i s y l a a t t i + m e t y y l i s i n i n e n + m e t y y l i t e r t i ä ä r i b u t y y l i e e t t e r i + m e t y y l i t r a n s f e r a a s i + m e t y y l i v i n y y l i k e t o n i + m e t y y l i v i o l e t t i + m i a m i n + m i a m i s s a + m i a m i t + m i e d o m p a a + m i e h e l l e + m i e h e n + m i e h e n k ä m m e k k ä + m i e h e s t ä + m i e h e t + m i e h i i n + m i e h i l l e + m i e h i l l e e n + m i e h i l l e k i n + m i e h i l l ä + m i e h i s e t + m i e h i s i l l e + m i e h i s t e n + m i e h i s t ö d i r e k t i i v i + m i e h i s t ö d i r e k t i i v i ä + m i e h i s t ö i h i n + m i e h i s t ö i l l e + m i e h i s t ö i s t ä + m i e h i s t ö j e n + m i e h i s t ö j e n k i n + m i e h i s t ö l i s t o j a + m i e h i s t ö l l e + m i e h i s t ö l l ä + m i e h i s t ö l u e t t e l o n + m i e h i s t ö n + m i e h i s t ö n k u l j e t u s v a u n u + m i e h i s t ö s t ä + m i e h i s t ö t a r p e e n + m i e h i s t ö ä + m i e h i t e t t y i n ä + m i e h i t e t t y j e n + m i e h i t e t t y j ä + m i e h i t e t t y n ä + m i e h i t e t t y ä + m i e h i t e t y i l l e + m i e h i t e t y i l l ä + m i e h i t e t y i l t ä + m i e h i t e t y i s t ä + m i e h i t e t y l l e + m i e h i t e t y n + m i e h i t e t y s s ä + m i e h i t e t y t + m i e h i t t i v ä t + m i e h i t t ä j i e n + m i e h i t t ä j i l t ä + m i e h i t t ä j i n ä + m i e h i t t ä j i ä + m i e h i t t ä j ä a r m e i j a a + m i e h i t t ä j ä h a l l i n n o n + m i e h i t t ä j ä j o u k k o j a + m i e h i t t ä j ä j o u k k o j e n + m i e h i t t ä j ä j o u k o i l t a + m i e h i t t ä j ä j o u k o t + m i e h i t t ä j ä l i i t t o u m a n + m i e h i t t ä j ä n ä + m i e h i t t ä j ä s t ä + m i e h i t t ä j ä t + m i e h i t t ä j ä v a l l a k s i + m i e h i t t ä j ä v a l l a l l e + m i e h i t t ä j ä v a l l a n + m i e h i t t ä j ä v a l l a t + m i e h i t t ä j ä v a l l o i k s i + m i e h i t t ä j ä v a l t a + m i e h i t t ä j ä v a l t a a + m i e h i t t ä j ä v a l t a n a + m i e h i t t ä j ä v a l t i o + m i e h i t t ä j ä v a l t i o i d e n + m i e h i t t ä j ä v a l t i o n + m i e h i t t ä j ä v a l t i o t a + m i e h i t t ä j ä v a l t o j a + m i e h i t t ä j ä v a l t o j e n + m i e h i t t ä j ä v i r a n o m a i s t e n + m i e h i t t ä j ä ä + m i e h i t t ä m i l l ä + m i e h i t t ä m i l t ä ä n + m i e h i t t ä m i n e n + m i e h i t t ä m i s e s t ä + m i e h i t t ä m i s t ä + m i e h i t t ä m ä + m i e h i t t ä m ä l l ä + m i e h i t t ä m ä n ä + m i e h i t t ä m ä ä n + m i e h i t t ä n e e t + m i e h i t t ä n y t + m i e h i t t ä v i l l e + m i e h i t t ä v ä t + m i e h i t t ä v ä ä + m i e h i t t ä ä + m i e h i t t ä ä k s e e n + m i e h i t y k s e e n + m i e h i t y k s e l l e + m i e h i t y k s e n + m i e h i t y k s e s t ä + m i e h i t y s a r m e i j a + m i e h i t y s a r m e i j a a + m i e h i t y s a r m e i j a a n + m i e h i t y s a r m e i j a k s i + m i e h i t y s a r m e i j a n + m i e h i t y s a r m e i j a n a + m i e h i t y s a r m e i j a s t a + m i e h i t y s a r m e i j a t + m i e h i t y s a r m e i j o i t a + m i e h i t y s h a l l i n n o l l e + m i e h i t y s h a l l i n n o n + m i e h i t y s h a l l i n t o + m i e h i t y s h a l l i n t o a + m i e h i t y s h a l l i t u k s e n + m i e h i t y s h a l l i t u k s e s t a + m i e h i t y s h a l l i t u s + m i e h i t y s h a l l i t u s t a + m i e h i t y s j o u k k o + m i e h i t y s j o u k k o i h i n + m i e h i t y s j o u k k o i n a + m i e h i t y s j o u k k o j a + m i e h i t y s j o u k k o j a a n + m i e h i t y s j o u k k o j e n + m i e h i t y s j o u k k o n a + m i e h i t y s j o u k k o n s a + m i e h i t y s j o u k o i l l a + m i e h i t y s j o u k o i s t a + m i e h i t y s j o u k o t + m i e h i t y s k a u d e n + m i e h i t y s o p e r a a t i o + m i e h i t y s p o l i t i i k a l l a + m i e h i t y s p o l i t i i k a n + m i e h i t y s p o l i t i i k k a + m i e h i t y s p o l i t i i k k a a + m i e h i t y s r a k e n n e t t a + m i e h i t y s s u u n n i t e l m i e n s a + m i e h i t y s t i l a n + m i e h i t y s t o i m i a + m i e h i t y s t ä + m i e h i t y s v a l l a k s i + m i e h i t y s v a l l a l l e + m i e h i t y s v a l l a n + m i e h i t y s v a l l a s t a + m i e h i t y s v a l l a t + m i e h i t y s v a l t a + m i e h i t y s v a l t a n a + m i e h i t y s v a l t o j a + m i e h i t y s v a l t o j e n + m i e h i t y s v o i m a t + m i e h i t y s v o i m i e n + m i e h i t y s v u o d e n + m i e h i t y s v u o s i l t a + m i e h i t y s v u o s i s t a + m i e h i t y s v y ö h y k k e e l l ä + m i e h i t y s v y ö h y k k e i l t ä + m i e h i ä + m i e h i ä k i n + m i e h i ä k ä ä n + m i e k a l l a + m i e k a n n i e l e m i n e n + m i e k a n t u p p i p ä i v ä k ä s k y + m i e k a t + m i e k k a h ä n t ä t u l i l i s k o + m i e k k a i l u t e r m e i s t ä + m i e k k a k a l a n + m i e k k a p y r s t ö + m i e k k a r i t a r i k u n t a + m i e k k a s ä r k i + m i e k k a t a n s s i + m i e k k a v a l a i l l e + m i e k k a v a l a s + m i e k k a v a l k k u + m i e k k o j a + m i e l e e m m e + m i e l e e n i + m i e l e e n n e + m i e l e e n p a i n u v i m m i s t a + m i e l e i s e k s e e n + m i e l e i s i ä m m e + m i e l e k k y y t t ä + m i e l e k k ä ä m m i n + m i e l e k k ä ä m m ä k s i + m i e l e k k ä ä m m ä l l e + m i e l e k k ä ä m m ä t + m i e l e k k ä ä m p i + m i e l e k k ä ä m p i ä + m i e l e k k ä ä m p ä ä + m i e l e k k ä ä n + m i e l e k ä s t ä + m i e l e l l ä m m e + m i e l e l l ä n i + m i e l e l l ä n n e + m i e l e l l ä ä n + m i e l e n f i l o s o f i a + m i e l e n h a l l i n t a + m i e l e n i + m i e l e n i l m a u k s e t + m i e l e n k i i n n o n + m i e l e n k i i n n o s t a + m i e l e n k i i n n o s t a a n + m i e l e n k i i n n o s t a n n e + m i e l e n k i i n t o a + m i e l e n k i i n t o a m m e + m i e l e n k i i n t o i s e e n + m i e l e n k i i n t o i s e l l a + m i e l e n k i i n t o i s e m m a k s i + m i e l e n k i i n t o i s e m m a n + m i e l e n k i i n t o i s e m p a a + m i e l e n k i i n t o i s e m p a a n + m i e l e n k i i n t o i s e m p i + m i e l e n k i i n t o i s e m p i a + m i e l e n k i i n t o i s e n + m i e l e n k i i n t o i s e n a + m i e l e n k i i n t o i s e s s a + m i e l e n k i i n t o i s e s t a + m i e l e n k i i n t o i s e t + m i e l e n k i i n t o i s i a + m i e l e n k i i n t o i s i l l e + m i e l e n k i i n t o i s i m m a n + m i e l e n k i i n t o i s i m m a t + m i e l e n k i i n t o i s i m m i s t a + m i e l e n k i i n t o i s i m p i a + m i e l e n k i i n t o i s i m p i n a + m i e l e n k i i n t o i s i n + m i e l e n k i i n t o i s i n t a + m i e l e n k i i n t o i s i s t a + m i e l e n k i i n t o i s t a + m i e l e n k i i n t o i s t e n + m i e l e n k i i n t o n i + m i e l e n k i i n t o n s a + m i e l e n k i i n t o o n + m i e l e n m u u t o k s e e n + m i e l e n m u u t o k s e n + m i e l e n m u u t o k s e s t a + m i e l e n m u u t o k s i l l e + m i e l e n m u u t o s + m i e l e n o s o i t t a j a a + m i e l e n o s o i t t a j a j o u k k o a + m i e l e n o s o i t t a j a t + m i e l e n o s o i t t a j i a + m i e l e n o s o i t t a j i e n + m i e l e n o s o i t t a j i s t a + m i e l e n o s o i t u k s e e n + m i e l e n o s o i t u k s e n + m i e l e n o s o i t u k s e s s a + m i e l e n o s o i t u k s e t + m i e l e n o s o i t u k s i a + m i e l e n o s o i t u k s i i n + m i e l e n o s o i t u k s i l l a + m i e l e n o s o i t u k s i n + m i e l e n o s o i t u k s i s s a + m i e l e n o s o i t u k s i s t a + m i e l e n o s o i t u s + m i e l e n o s o i t u s k a m p a n j a t + m i e l e n o s o i t u s k i e l l o i s t a + m i e l e n o s o i t u s m a r s s i l l e + m i e l e n o s o i t u s o i k e u d e n + m i e l e n o s o i t u s o i k e u s + m i e l e n o s o i t u s o i k e u t t a + m i e l e n o s o i t u s t a + m i e l e n o s o i t u s t e n + m i e l e n o s o i t u s v a p a u d e n + m i e l e n r a u h a + m i e l e n r a u h a a + m i e l e n r a u h a l l a + m i e l e n r a u h a l l e + m i e l e n r a u h a m m e + m i e l e n r a u h a n + m i e l e n r a u h a n s a + m i e l e n r a u h a s t a a n + m i e l e n s ä + m i e l e n t e r v e y d e l l e + m i e l e n t e r v e y d e l l i s e t + m i e l e n t e r v e y d e l l i s i ä + m i e l e n t e r v e y d e l l i s t e n + m i e l e n t e r v e y d e l l ä + m i e l e n t e r v e y d e n + m i e l e n t e r v e y d e n h u o l l o s s a + m i e l e n t e r v e y d e s t ä + m i e l e n t e r v e y s + m i e l e n t e r v e y s a l a a + m i e l e n t e r v e y s a l a a n + m i e l e n t e r v e y s a l a l l a + m i e l e n t e r v e y s a l a n + m i e l e n t e r v e y s a s i a t + m i e l e n t e r v e y s a s i o i d e n + m i e l e n t e r v e y s h o i d o n + m i e l e n t e r v e y s h ä i r i ö i d e n + m i e l e n t e r v e y s h ä i r i ö i h i n + m i e l e n t e r v e y s h ä i r i ö i s e t + m i e l e n t e r v e y s h ä i r i ö i s t ä + m i e l e n t e r v e y s h ä i r i ö i t ä + m i e l e n t e r v e y s h ä i r i ö n ä + m i e l e n t e r v e y s h ä i r i ö t + m i e l e n t e r v e y s i n d i k a a t t o r i t + m i e l e n t e r v e y s j ä r j e s t e l m i e n + m i e l e n t e r v e y s j ä r j e s t e l m i ä + m i e l e n t e r v e y s j ä r j e s t e l m ä n + m i e l e n t e r v e y s j ä r j e s t e l m ä t + m i e l e n t e r v e y s k a m p a n j a t + m i e l e n t e r v e y s l a i n s ä ä d ä n t ö ä + m i e l e n t e r v e y s l a i t o k s i a + m i e l e n t e r v e y s l a i t o k s i i n + m i e l e n t e r v e y s m ä ä r ä r a h a t + m i e l e n t e r v e y s m ä ä r ä r a h o j e n + m i e l e n t e r v e y s o h j e l m a n + m i e l e n t e r v e y s o n g e l m a + m i e l e n t e r v e y s o n g e l m a i s e t + m i e l e n t e r v e y s o n g e l m a i s i a + m i e l e n t e r v e y s o n g e l m a i s i l l e + m i e l e n t e r v e y s o n g e l m a i s i s t a + m i e l e n t e r v e y s o n g e l m a i s t e n + m i e l e n t e r v e y s o n g e l m a t + m i e l e n t e r v e y s o n g e l m i a + m i e l e n t e r v e y s o n g e l m i e n + m i e l e n t e r v e y s o n g e l m i i n + m i e l e n t e r v e y s o n g e l m i s t a + m i e l e n t e r v e y s p a l v e l u i d e n + m i e l e n t e r v e y s p a l v e l u i t a + m i e l e n t e r v e y s p a l v e l u j e n + m i e l e n t e r v e y s p a l v e l u t + m i e l e n t e r v e y s p o l i t i i k a s t a m m e + m i e l e n t e r v e y s p o l i t i i k k a + m i e l e n t e r v e y s p o l i t i i k k a a + m i e l e n t e r v e y s p o t i l a i d e n + m i e l e n t e r v e y s p o t i l a i l l e + m i e l e n t e r v e y s p o t i l a i s t a + m i e l e n t e r v e y s p ä i v ä + m i e l e n t e r v e y s s a i r a u d e s t a + m i e l e n t e r v e y s s a i r a u d e t + m i e l e n t e r v e y s s a i r a u k s i a + m i e l e n t e r v e y s s a i r a u k s i e n + m i e l e n t e r v e y s s a i r a u k s i s t a + m i e l e n t e r v e y s s o p i m u k s e n + m i e l e n t e r v e y s s t r a t e g i a + m i e l e n t e r v e y s s t r a t e g i a a + m i e l e n t e r v e y s s t r a t e g i a s t a + m i e l e n t e r v e y s s ä ä n t ö n i + m i e l e n t e r v e y s t y ö h ö n + m i e l e n t e r v e y s t y ö n + m i e l e n t e r v e y s t y ö n t e k i j ö i d e n + m i e l e n t e r v e y s t y ö r y h m ä + m i e l e n t e r v e y s v ä l i n e e t + m i e l e n t e r v e y t e e n + m i e l e n t e r v e y t e e n i + m i e l e n t e r v e y t e m m e + m i e l e n t e r v e y t e n i + m i e l e n t e r v e y t t ä + m i e l e n t e r v e y t t ä n i + m i e l e n t e r v e y t t ä ä n + m i e l e n t i l a + m i e l e n t i l a a + m i e l e n t i l a a n + m i e l e n t i l a h ä i r i ö i s s ä + m i e l e n t i l a n + m i e l e n t i l a n s a + m i e l e s s ä + m i e l e s s ä m m e + m i e l e s s ä n i + m i e l e s s ä n n e + m i e l e s s ä ä n + m i e l e s t ä m m e + m i e l e s t ä n i + m i e l e s t ä n n e + m i e l e s t ä ä n + m i e l e t + m i e l e t t ö m i ä + m i e l e t t ö m y y k s i i n + m i e l e t t ö m y y k s i ä + m i e l e t t ö m y y t t ä + m i e l e t ö n t ä + m i e l i a i h e i s t a n i + m i e l i a i h e i s t a n n e + m i e l i a i h e i t a + m i e l i a i h e t t a + m i e l i a l a + m i e l i a l a a + m i e l i a l a a n + m i e l i a l a h ä i r i ö + m i e l i a l a m m e + m i e l i a l a n + m i e l i a l o j a + m i e l i h y v ä p e r i a a t e + m i e l i h y v ä ä + m i e l i i m m e + m i e l i i n + m i e l i j o h t e e n + m i e l i j o h t e e s t a + m i e l i k a p p a l e i t a a n + m i e l i k u v a + m i e l i k u v a a + m i e l i k u v a n + m i e l i k u v i t u k s e l l i s e m m a n + m i e l i k u v i t u k s e l l i s e m p i a + m i e l i k u v i t u k s e l l i s t e n + m i e l i k u v i t u k s e n + m i e l i k u v i t u k s e n n e + m i e l i k u v i t u k s e t t o m u u d e n + m i e l i k u v i t u s + m i e l i k u v i t u s h a r p p a u k s e l l e + m i e l i k u v i t u s h e n k i l ö + m i e l i k u v i t u s m a a i l m a + m i e l i k u v i t u s m a a i l m a a n + m i e l i k u v i t u s t a + m i e l i k u v i t u s t a m m e + m i e l i k u v i t u s y s t ä v ä + m i e l i p a h a a + m i e l i p a i k k o j a n i + m i e l i p i d e + m i e l i p i d e j o h t a j a t + m i e l i p i d e j o h t a j i a + m i e l i p i d e j o h t a j i e n + m i e l i p i d e j o h t a j i i n + m i e l i p i d e k i i s t a t + m i e l i p i d e k u o h u j e n + m i e l i p i d e k y s e l y + m i e l i p i d e k y s e l y i h i n + m i e l i p i d e k y s e l y i s s ä + m i e l i p i d e k y s e l y i s t ä + m i e l i p i d e k y s e l y j e n + m i e l i p i d e k y s e l y j ä + m i e l i p i d e k y s e l y n + m i e l i p i d e k y s e l y s s ä + m i e l i p i d e k y s e l y t + m i e l i p i d e k y s y m y k s e s t ä + m i e l i p i d e k y s y m y k s i i n + m i e l i p i d e k y s y m y k s i ä + m i e l i p i d e k y s y m y s + m i e l i p i d e k ä ä n + m i e l i p i d e l u k u j a + m i e l i p i d e m a f i a + m i e l i p i d e m i t t a r i a + m i e l i p i d e m i t t a u k s e n + m i e l i p i d e m i t t a u k s e s t a + m i e l i p i d e m i t t a u k s e t + m i e l i p i d e m i t t a u k s i a + m i e l i p i d e m i t t a u k s i e n + m i e l i p i d e m i t t a u k s i i n + m i e l i p i d e m i t t a u k s i n + m i e l i p i d e m i t t a u k s i s s a + m i e l i p i d e m i t t a u s + m i e l i p i d e m i t t a u s t a + m i e l i p i d e m i t t a u s t e n + m i e l i p i d e p o l i i s e i k s i + m i e l i p i d e p o l i i s i + m i e l i p i d e p o l i i s i n + m i e l i p i d e r i k k o m u k s e n + m i e l i p i d e r i k o k s e n + m i e l i p i d e r i k o k s e t + m i e l i p i d e r i k o k s i s t a + m i e l i p i d e r i k o l l i s t e n + m i e l i p i d e r i k o s t a + m i e l i p i d e r i s t i r i i t o j a + m i e l i p i d e s e n s u u r i i n + m i e l i p i d e s u u n t a u k s i a + m i e l i p i d e t a s o l l a + m i e l i p i d e t e r r o r i s m i a + m i e l i p i d e t i e d u s t e l u + m i e l i p i d e t i e d u s t e l u i s s a + m i e l i p i d e t i e d u s t e l u i s t a + m i e l i p i d e t i e d u s t e l u j e n + m i e l i p i d e t i e d u s t e l u n + m i e l i p i d e t i e d u s t e l u s t a + m i e l i p i d e t i e d u s t e l u t + m i e l i p i d e t t ä + m i e l i p i d e t t ä m m e + m i e l i p i d e t t ä n i + m i e l i p i d e t t ä ä n + m i e l i p i d e t u t k i m u k s e n + m i e l i p i d e t u t k i m u k s e s t a + m i e l i p i d e t u t k i m u k s e t + m i e l i p i d e t u t k i m u k s i a + m i e l i p i d e t u t k i m u k s i s s a + m i e l i p i d e t u t k i m u k s i s t a + m i e l i p i d e t u t k i m u s + m i e l i p i d e t u t k i m u s t e n + m i e l i p i d e v a i k u t t a j a + m i e l i p i d e v a i k u t t a j i e n + m i e l i p i d e v a i k u t t a j i l l a + m i e l i p i d e v a i k u t t a j i l l e + m i e l i p i d e v a n g e i l l e + m i e l i p i d e v a n g e i s t a + m i e l i p i d e v a n g i n + m i e l i p i d e v a n g i t + m i e l i p i d e v a n k e j a + m i e l i p i d e v a n k i + m i e l i p i d e v a n k i e n + m i e l i p i d e v a n k i t a p a u k s e t + m i e l i p i d e v a p a u d e n + m i e l i p i d e v a p a u t e e n + m i e l i p i d e v i v a h t e i t a + m i e l i p i d e v y ö r y ä + m i e l i p i t e e l l e + m i e l i p i t e e l l ä + m i e l i p i t e e m m e + m i e l i p i t e e n + m i e l i p i t e e n i + m i e l i p i t e e n i l m a i s u a + m i e l i p i t e e n i l m a i s u n + m i e l i p i t e e n i l m a i s u u n + m i e l i p i t e e n i l m a i s u v a p a u d e n + m i e l i p i t e e n i l m a u k s i e n + m i e l i p i t e e n i l m a u k s i i n + m i e l i p i t e e n i l m a u s + m i e l i p i t e e n m u o d o s t a j a t + m i e l i p i t e e n m u o d o s t a j i e n + m i e l i p i t e e n m u o d o s t u k s e n + m i e l i p i t e e n m u o d o s t u k s e s t a + m i e l i p i t e e n m u o d o s t u s + m i e l i p i t e e n m u o d o s t u s p a l v e l u i l l a + m i e l i p i t e e n m u o d o s t u s p r o s e s s i + m i e l i p i t e e n m u o d o s t u s p r o s e s s i e n + m i e l i p i t e e n m u o d o s t u s t a + m i e l i p i t e e n m u o k k a a j i a + m i e l i p i t e e n m u o k k a u s t y ö n + m i e l i p i t e e n n e + m i e l i p i t e e n s ä + m i e l i p i t e e n v a i h d o n + m i e l i p i t e e n v a i h d o s t a + m i e l i p i t e e n v a i h t o a + m i e l i p i t e e n v a i h t o o n + m i e l i p i t e e n v a p a u d e l l e + m i e l i p i t e e n v a p a u d e l t a + m i e l i p i t e e n v a p a u d e n + m i e l i p i t e e n v a p a u d e s t a + m i e l i p i t e e n v a p a u s + m i e l i p i t e e n v a p a u s p a l k i n n o n + m i e l i p i t e e n v a p a u s p a l k i n t o + m i e l i p i t e e n v a p a u s t i l a n n e + m i e l i p i t e e n v a p a u t e e n + m i e l i p i t e e n v a p a u t e n a + m i e l i p i t e e n v a p a u t t a + m i e l i p i t e e n v a p a u t t a a n + m i e l i p i t e e s e e n + m i e l i p i t e e s e e n s ä + m i e l i p i t e e s i + m i e l i p i t e e s s ä + m i e l i p i t e e s t ä + m i e l i p i t e e s t ä ä n + m i e l i p i t e e t + m i e l i p i t e i d e n + m i e l i p i t e i d e n v a i h d o l l e + m i e l i p i t e i d e n v a i h d o s t a + m i e l i p i t e i d e n v a i h t o o n + m i e l i p i t e i l l ä n n e + m i e l i p i t e i s i i m m e + m i e l i p i t e i s i i n + m i e l i p i t e i s s ä + m i e l i p i t e i s t ä + m i e l i p i t e i s t ä n i + m i e l i p i t e i s t ä ä n + m i e l i p i t e i t ä + m i e l i p i t e i t ä m m e + m i e l i p i t e i t ä n i + m i e l i p i t e i t ä n n e + m i e l i p i t e i t ä ä n + m i e l i p u o l i s e t + m i e l i r u o a t + m i e l i r u o k a m m e + m i e l i s a i r a a l a a n + m i e l i s a i r a a l a s t a + m i e l i s a i r a a l o i h i n + m i e l i s a i r a a t + m i e l i s a i r a i t a + m i e l i s a i r a u d e n + m i e l i s a i r a u d e s t a + m i e l i s a i r a u k s i a + m i e l i s a i r a u k s i e n + m i e l i s a i r a u k s i i n + m i e l i s a i r a u k s i s t a + m i e l i s a i r a u s + m i e l i s a i r a u t e e n + m i e l i s a i r a u t t a + m i e l i s a n o n n a s t a + m i e l i s s ä m m e + m i e l i s s ä n i + m i e l i s t e l l ä + m i e l i s t ä + m i e l i v a l l a l l e + m i e l i v a l l a n + m i e l i v a l t a + m i e l i v a l t a a + m i e l i v a l t a a n + m i e l i v a l t a i n e n + m i e l i v a l t a i n e n k i n + m i e l i v a l t a i s e l t a + m i e l i v a l t a i s e m p a a + m i e l i v a l t a i s e n + m i e l i v a l t a i s e s t a + m i e l i v a l t a i s e s t i + m i e l i v a l t a i s e t + m i e l i v a l t a i s i a + m i e l i v a l t a i s i s t a + m i e l i v a l t a i s t a + m i e l i v a l t a i s t e n + m i e l i v a l t a i s u u d e l t a + m i e l i v a l t a i s u u k s i e n + m i e l i v a l t a i s u u k s i i n + m i e l i v a l t a i s u u t t a + m i e l i ä + m i e l i ä m m e + m i e l l e k a r t t a + m i e l l e t ä ä n k ö + m i e l l e y h t y m i ä + m i e l l e y h t y m i ä n i + m i e l l y t t ä i s i k ä ä n + m i e l l y t t ä m i s e k s i + m i e l l y t t ä m ä ä n + m i e l l y t t ä v i m m i l l e + m i e l l y t t ä v i s s ä + m i e l l y t t ä v i ä + m i e l l y t t ä v ä k i n + m i e l l y t t ä v ä m m i k s i + m i e l l y t t ä v ä m m ä k s i + m i e l l y t t ä v ä m m ä n + m i e l l y t t ä v ä m p i + m i e l l y t t ä v ä m p i ä + m i e l l y t t ä v ä m p ä ä + m i e l l y t t ä v ä n + m i e l l y t t ä v ä s t ä + m i e l l y t t ä v ä ä + m i e l l y t t ä ä k s e e n + m i e l s i + m i e l t y m y k s e s t ä + m i e l t ä + m i e l t ä n i + m i e l t ä ä + m i e l t ä ä n + m i e l u i s a m p a a + m i e l u i s a m p i + m i e l u i s e m p i a + m i e l u i s i n + m i e l u i s t a + m i e l u u m m i n k i n + m i e s e h d o k k a i t a + m i e s j o h t a j i e n k i n + m i e s j ä s e n + m i e s j ä s e n e t + m i e s j ä s e n i ä + m i e s j ä s e n t ä + m i e s k i i n t i ö t + m i e s k o l l e g a m m e + m i e s k o l l e g a n s a + m i e s k o l l e g o i h i n + m i e s k o l l e g o i l l e n i + m i e s k o l l e g o i t a a n + m i e s k o l l e g o j e n + m i e s k u m p p a n i n + m i e s k u n t o a a n + m i e s k u o r o + m i e s l i i k e + m i e s l ä ä k ä r i t + m i e s m a l l i i n + m i e s m a l l i s t a + m i e s m i n i s t e r i + m i e s n ä k ö k u l m a a + m i e s p a r k a + m i e s p u h u j a + m i e s p u o l i s i l l e + m i e s r o o l e i s t a + m i e s r y h m i ä + m i e s s i v u o s a + m i e s s o v i n i s t i + m i e s s u k u p u o l i + m i e s t a n s s i j a + m i e s t e n + m i e s t e n p ä i v ä + m i e s t y y p p i i n + m i e s t y ö k u u k a u d e t + m i e s t y ö p ä i v ä ä + m i e s t ä + m i e s v a l t a i s e m p i a + m i e s v a l t a i s e n + m i e s v a l t a i s e s t a + m i e s v a l t a i s i a + m i e s v a l t a i s i i n + m i e s v a l t a i s i l l a + m i e s v a n g e i l l e + m i e s v a n k e i h i n + m i e s v a n k i e n + m i e t i m m e + m i e t i n + m i e t i n n ö i l l e + m i e t i n n ö i l l ä + m i e t i n n ö i s s ä + m i e t i n n ö i s s ä k i n + m i e t i n n ö i s s ä ä n + m i e t i n n ö i s t ä + m i e t i n n ö i s t ä ä n + m i e t i n n ö l l e + m i e t i n n ö l l e e n + m i e t i n n ö l l ä + m i e t i n n ö l l ä n i + m i e t i n n ö l l ä ä n + m i e t i n n ö n + m i e t i n n ö s s ä + m i e t i n n ö s s ä k i n + m i e t i n n ö s s ä m m e + m i e t i n n ö s s ä n i + m i e t i n n ö s s ä n n e + m i e t i n n ö s s ä ä n + m i e t i n n ö s t ä + m i e t i n n ö s t ä k i n + m i e t i n n ö s t ä n i + m i e t i n n ö s t ä ä n + m i e t i n n ö t + m i e t i n t ä a i k a + m i e t i n t ä a i k a a + m i e t i n t ä a j a n + m i e t i n t ä p r o s e s s i + m i e t i n t ä p r o s e s s i a + m i e t i n t ä r y h m i e n + m i e t i n t ä r y h m i l t ä + m i e t i n t ä r y h m ä + m i e t i n t ä r y h m ä l l e + m i e t i n t ä r y h m ä n + m i e t i n t ä r y h m ä n ä + m i e t i n t ä r y h m ä s s ä + m i e t i n t ä r y h m ä s t ä + m i e t i n t ä r y h m ä ä + m i e t i n t ä t a u k o + m i e t i n t ä t a u k o a + m i e t i n t ö a l o i t e + m i e t i n t ö a l o i t t e e s t a + m i e t i n t ö a l o i t t e i s i i n + m i e t i n t ö e h d o t u k s e e n + m i e t i n t ö e h d o t u k s e l l e + m i e t i n t ö e h d o t u k s e n + m i e t i n t ö e h d o t u k s e n s a + m i e t i n t ö e h d o t u k s e s s a + m i e t i n t ö e h d o t u k s e s s a a n + m i e t i n t ö e h d o t u k s e s t a + m i e t i n t ö e h d o t u s + m i e t i n t ö e h d o t u s t a + m i e t i n t ö e s i t y s + m i e t i n t ö h a n k e + m i e t i n t ö i h i n + m i e t i n t ö j e n + m i e t i n t ö j e n n e + m i e t i n t ö j e n s ä + m i e t i n t ö j ä + m i e t i n t ö k i n + m i e t i n t ö k o k o n a i s u u d e s t a + m i e t i n t ö l u o n n o k s e e n + m i e t i n t ö l u o n n o k s e e n i + m i e t i n t ö l u o n n o k s e e n s a + m i e t i n t ö l u o n n o k s e l l e + m i e t i n t ö l u o n n o k s e l l e n i + m i e t i n t ö l u o n n o k s e n + m i e t i n t ö l u o n n o k s e n i + m i e t i n t ö l u o n n o k s e n n e + m i e t i n t ö l u o n n o k s e n s a + m i e t i n t ö l u o n n o k s e s s a + m i e t i n t ö l u o n n o k s e s s a a n + m i e t i n t ö l u o n n o k s e s s a n i + m i e t i n t ö l u o n n o k s e s s a n n e + m i e t i n t ö l u o n n o k s e s t a + m i e t i n t ö l u o n n o k s e s t a a n + m i e t i n t ö l u o n n o k s e s t a n i + m i e t i n t ö l u o n n o k s i a + m i e t i n t ö l u o n n o k s i s s a + m i e t i n t ö l u o n n o k s i s s a n i + m i e t i n t ö l u o n n o k s i s t a + m i e t i n t ö l u o n n o s + m i e t i n t ö l u o n n o s t a + m i e t i n t ö l u o n n o s t a a n + m i e t i n t ö l u o n n o s t a n i + m i e t i n t ö l u o n n o s t e n + m i e t i n t ö m m e + m i e t i n t ö n i + m i e t i n t ö n n e + m i e t i n t ö n s ä + m i e t i n t ö p a k e t t i + m i e t i n t ö p a k e t t i a + m i e t i n t ö r y h m ä s s ä + m i e t i n t ö t e k s t i + m i e t i n t ö t e k s t i i n + m i e t i n t ö t e k s t i n + m i e t i n t ö t y ö h ö n + m i e t i n t ö t y ö n s ä + m i e t i n t ö t y ö s t ä + m i e t i n t ö v e r s i o s t a + m i e t i n t ö ä + m i e t i n t ö ä k i n + m i e t i n t ö ä m m e + m i e t i n t ö ä n i + m i e t i n t ö ä n n e + m i e t i n t ö ä ä n + m i e t i n t ö ö m m e + m i e t i n t ö ö n + m i e t i n t ö ö n i + m i e t i n t ö ö n n e + m i e t i n t ö ö n s ä + m i e t i t t ä v ä ä + m i e t i t ä ä n p ä + m i e t t e i n + m i e t t e i t ä + m i e t t e i t ä n n e + m i e t t e l i ä i k s i + m i e t t e l i ä ä k s i + m i e t t i e s s ä m m e + m i e t t i e s s ä ä n + m i e t t i i + m i e t t i k ä ä m m e + m i e t t i k ä ä p ä + m i e t t i m i s a i k a a + m i e t t i m i s a j a s t a + m i e t t i m i s h e t k i + m i e t t i m i s j a k s o a + m i e t t i m i s t a u k o + m i e t t i m i s t a u k o a + m i e t t i m i s t a u o l l a + m i e t t i m ä t t ä + m i e t t i m ä ä n + m i e t t i n e e t + m i e t t i n y t + m i e t t i v ä t + m i e t t i ä + m i g r a a t i o n + m i g r a a t i o t e o r i a + m i g r a a t i o t e s t i e n + m i i n a a j a t + m i i n a f r e g a t t i + m i i n a k e n t ä l l ä + m i i n a k i e l t o s o p i m u k s e n + m i i n a k o k o u s + m i i n a l a i v a + m i i n a n k ö y n n ö s + m i i n a n r a i v a u k s e e n + m i i n a n r a i v a u k s e n + m i i n a n r a i v a u k s e s s a + m i i n a n r a i v a u s + m i i n a n r a i v a u s a j o n e u v o j a + m i i n a n r a i v a u s o h j e l m a + m i i n a n r a i v a u s o h j e l m a n + m i i n a n r a i v a u s o p e r a a t i o n + m i i n a n r a i v a u s p o n n i s t u s t e n + m i i n a n r a i v a u s t a + m i i n a n r a i v a u s t e k n i i k k a a + m i i n a n r a i v a u s t o i m e t + m i i n a n r a i v a u s t o i m i a + m i i n a n r a i v a u s t o i m i i n + m i i n a n r a i v a u s t o i m i n t a a + m i i n a n r a i v a u s t o i m i n t a a n + m i i n a n r a i v a u s t y ö + m i i n a n r a i v a u s t y ö n + m i i n a o h j e l m i i n + m i i n a o n g e l m a a + m i i n a o n g e l m a n + m i i n a r ä j ä h d y k s e n + m i i n a t + m i i n a t o i m i n t a a n + m i i n o i h i n + m i i n o i s t a + m i i n o i t e t u l l e + m i i n o j a + m i i n o j e n + m i i n o j e n r a i v a u k s e n + m i i n o j e n r a i v a u s p a l v e l u + m i i n o j e n v a s t a i n e n + m i i n u s m e r k k i + m i i n u s p i s t e i d e n + m i i n u s p i s t e i l l ä + m i i n u s p i s t e i t ä + m i i n u s p u o l e l t a + m i k k e l i n + m i k k i h i i r i p a n k k i + m i k r o a a l t o j ä r j e s t e l m i e n + m i k r o a a l t o j ä r j e s t e l m ä t + m i k r o a a l t o l i n k k i + m i k r o a a l t o t e k n i i k a n + m i k r o a a l t o t e k n i i k k a + m i k r o a a l t o t e k n i i k k a a + m i k r o a a l t o t e k n i i k k a a n + m i k r o a a l t o u u n e i s s a + m i k r o a a l t o u u n e j a + m i k r o a a l t o u u n i + m i k r o a l u e e n + m i k r o a l u e e t + m i k r o a l u e i d e n + m i k r o a l u e i l l a + m i k r o a l u e i l l e + m i k r o a l u e i t a + m i k r o b i l ä ä k e h o i d o t + m i k r o b i l ä ä k e h o i t o a + m i k r o b i l ä ä k e r e s i s t e n s s i + m i k r o b i l ä ä k e r e s i s t e n s s i n + m i k r o b i l ä ä k e r e s i s t e n s s i o n g e l m a n + m i k r o b i l ä ä k e r e s i s t e n s s i ä + m i k r o b i l ä ä k k e i d e n + m i k r o b i l ä ä k k e i l l e + m i k r o b i l ä ä k k e i t ä + m i k r o b i o l o g i s e t + m i k r o b i o l o g i s t e n + m i k r o b i p u h d i s t u s t a + m i k r o b i t e o r i a + m i k r o e l e k t r o n i i k a n + m i k r o f o n e j a + m i k r o f o n i j ä r j e s t e l m i e n + m i k r o f o n i n + m i k r o f o n i n i + m i k r o f o n i p a l v e l u a + m i k r o h a l l i n n o i n n i n + m i k r o h a l l i n n o i n t i + m i k r o h a l l i n t o a + m i k r o h a n k e m e n e t t e l y ä + m i k r o h a n k e o h j e l m a + m i k r o h a n k e t t a + m i k r o h a n k k e i d e n + m i k r o h a n k k e i l l e + m i k r o h a n k k e i s i i n + m i k r o h a n k k e i s s a + m i k r o h a n k k e i t a + m i k r o h e d e l m ö i t y s + m i k r o h i u k k a s s a a s t e + m i k r o k o s m o k s e n + m i k r o l a i n a a + m i k r o l a i n a n + m i k r o l a i n a t + m i k r o l a i n o i l l a + m i k r o l a i n o j a + m i k r o l a i n o j e n + m i k r o l u o t o i l l a + m i k r o l u o t o i s s a + m i k r o l u o t o i s t a + m i k r o l u o t o j a + m i k r o l u o t o n + m i k r o l u o t o t + m i k r o l u o t t o + m i k r o l u o t t o a + m i k r o l u o t t o a l o i t e t t a + m i k r o l u o t t o h a n k k e e m m e + m i k r o l u o t t o h a n k k e e s t a + m i k r o l u o t t o h a n k k e i l l e + m i k r o l u o t t o i h i n + m i k r o l u o t t o i n a + m i k r o l u o t t o j a + m i k r o l u o t t o j e n + m i k r o l u o t t o j ä r j e s t e l m i e n + m i k r o l u o t t o j ä r j e s t e l m ä + m i k r o l u o t t o j ä r j e s t e l m ä n + m i k r o l u o t t o j ä r j e s t e l m ä t + m i k r o l u o t t o j ä r j e s t e l m ä ä + m i k r o l u o t t o k a m p a n j a + m i k r o l u o t t o l a i t o k s i a + m i k r o l u o t t o l a i t o s + m i k r o l u o t t o p a l v e l u j e n + m i k r o l u o t t o r a h a s t o i h i n + m i k r o l u o t t o s e k t o r i l l e + m i k r o l u o t t o v ä l i n e e n + m i k r o l u o t t o v ä l i n e i l l ä + m i k r o m a a i l m a n + m i k r o m a r k k i n a t + m i k r o n ä k ö k u l m a + m i k r o p e r s p e k t i i v i s t ä + m i k r o p i i r i + m i k r o p o l i i t t i s e e n + m i k r o r a h o i t t a m i s t a + m i k r o r a h o i t u k s e e n + m i k r o r a h o i t u k s e n + m i k r o r a h o i t u k s e s s a + m i k r o r a h o i t u s + m i k r o r a h o i t u s a i h e t t a + m i k r o r a h o i t u s e h d o t u s + m i k r o r a h o i t u s j ä r j e s t e l m i ä + m i k r o r a h o i t u s j ä r j e s t e l m ä + m i k r o r a h o i t u s j ä r j e s t e l m ä n + m i k r o r a h o i t u s j ä r j e s t e l y + m i k r o r a h o i t u s j ä r j e s t e l y j e n + m i k r o r a h o i t u s j ä r j e s t e l y j ä + m i k r o r a h o i t u s j ä r j e s t e l y l l e + m i k r o r a h o i t u s j ä r j e s t e l y l l ä + m i k r o r a h o i t u s j ä r j e s t e l y n + m i k r o r a h o i t u s j ä r j e s t e l y s s ä + m i k r o r a h o i t u s j ä r j e s t e l y s t ä + m i k r o r a h o i t u s j ä r j e s t e l y y n + m i k r o r a h o i t u s j ä r j e s t e l y ä + m i k r o r a h o i t u s l a i t o k s i a + m i k r o r a h o i t u s l a i t o k s i l l e + m i k r o r a h o i t u s l a i t o s + m i k r o r a h o i t u s l a i t o s t e n + m i k r o r a h o i t u s m e k a n i s m i + m i k r o r a h o i t u s o h j e l m a + m i k r o r a h o i t u s o h j e l m a k s i + m i k r o r a h o i t u s o h j e l m a l l a + m i k r o r a h o i t u s o h j e l m i s t a + m i k r o r a h o i t u s p a l v e l u + m i k r o r a h o i t u s p a l v e l u a + m i k r o r a h o i t u s p a l v e l u n + m i k r o r a h o i t u s t a + m i k r o r a h o i t u s t o i m i a + m i k r o r a h o i t u s t u k i + m i k r o r a h o i t u s v e r k k o j a + m i k r o r a h o i t u s v ä l i n e + m i k r o r a h o i t u s v ä l i n e e n + m i k r o r a h o i t u s v ä l i n e e s e e n + m i k r o r a h o i t u s v ä l i n e e s t ä + m i k r o r a h o i t u s v ä l i n e e t + m i k r o r a h o i t u s v ä l i n e i d e n + m i k r o r a h o i t u s v ä l i n e t t ä + m i k r o r a k e n t e e l l i s e t + m i k r o r u i s k e e l l a + m i k r o s i r u + m i k r o s i r u a + m i k r o s i r u j a + m i k r o s i r u n + m i k r o s i r u u n + m i k r o s y s t e e m i t + m i k r o t a l o u d e l l i n e n + m i k r o t a l o u d e l l i s e l l a + m i k r o t a l o u d e l l i s e n + m i k r o t a l o u d e l l i s e t + m i k r o t a l o u d e l l i s i a + m i k r o t a l o u d e l l i s i n e + m i k r o t a l o u d e l l i s t a + m i k r o t a l o u d e n + m i k r o t a l o u s + m i k r o t a l o u s p o l i t i i k k a a + m i k r o t a l o u t t a + m i k r o t a s o a + m i k r o t a s o l l a + m i k r o t e r ä + m i k r o t e s l a a + m i k r o t i e t o k o n e i t a + m i k r o t o i m i e l i n t ä + m i k r o t u k i + m i k r o t u o t a n t o + m i k r o t y ö p a i k k o j e n + m i k r o v a l t i o i d e n + m i k r o v a l t i o i s s a + m i k r o v a l v o n n a n + m i k r o v a l v o n t a + m i k r o v a l v o n t a a + m i k r o v e l k a o h j e l m a t + m i k r o v e s i v o i m a l a + m i k r o y h t e i s t u o t a n t o + m i k r o y h t e i s t u o t a n t o a + m i k r o y h t e i s t u o t a n t o l a i t o k s i l l e + m i k r o y h t e i s t u o t a n t o v o i m a l o i d e n + m i k r o y h t e i s ö + m i k r o y h t e i s ö i h i n + m i k r o y h t e i s ö i l l e + m i k r o y h t e i s ö i l t ä + m i k r o y h t e i s ö i s t ä + m i k r o y h t e i s ö j e n + m i k r o y h t e i s ö j ä + m i k r o y h t e i s ö t + m i k r o y r i t t ä j i k s i + m i k r o y r i t t ä j i l l e + m i k r o y r i t t ä j i ä + m i k r o y r i t t ä j y y t t ä + m i k r o y r i t t ä j ä + m i k r o y r i t t ä j ä t + m i k r o y r i t y k s e n + m i k r o y r i t y k s e s s ä + m i k r o y r i t y k s e t + m i k r o y r i t y k s i i n + m i k r o y r i t y k s i k s i + m i k r o y r i t y k s i l l e + m i k r o y r i t y k s i l l e e n + m i k r o y r i t y k s i n ä + m i k r o y r i t y k s i s s ä + m i k r o y r i t y k s i s t ä + m i k r o y r i t y k s i ä + m i k r o y r i t y s + m i k r o y r i t y s t e n + m i k r o y r i t y s t ä + m i k s a u s l a i t e + m i k s i k ö + m i k s i k ö h ä n + m i k s i p ä + m i l i i s e j ä + m i l i i s i e n + m i l i i s i j o h t a j a + m i l i i s i j o u k o t + m i l i i s i j ä r j e s t ö j e n + m i l i i s i n s ä + m i l i i s i r y h m ä + m i l i i s i t + m i l i t a r i s m i i n + m i l i t a r i s o i d a + m i l i t a r i s o i d a a n + m i l i t a r i s o i m a t t o m a n + m i l i t a r i s o i m i s m e n o j a + m i l i t a r i s t i s i m m i s t a + m i l i t a r i s t i s i m p i e n + m i l i t a r i s t i s t a + m i l j a r d e i h i n + m i l j a r d e i l l a + m i l j a r d e i s t a + m i l j a r d e j a + m i l j a r d i a + m i l j a r d i e n + m i l j a r d i i n + m i l j a r d i k s i + m i l j a r d i l l a + m i l j a r d i n + m i l j a r d i s t a + m i l j a r d i t + m i l j a r d i t u e t + m i l j o n ä ä r i a s i a n a j a j a t + m i l j o n ä ä r i k s i + m i l j o n ä ä r i p r i n s s i + m i l j o o n a a + m i l j o o n a a n + m i l j o o n a i s e s t a + m i l j o o n a k e r t a i s e n + m i l j o o n a l l a + m i l j o o n a l l e + m i l j o o n a l t a + m i l j o o n a n + m i l j o o n a s s a + m i l j o o n a s t a + m i l j o o n a t + m i l j o o n i a + m i l j o o n i a k a a n + m i l j o o n i e n + m i l j o o n i i n + m i l j o o n i k s i + m i l j o o n i l l a + m i l j o o n i l l e + m i l j o o n i l t a + m i l j o o n i s s a + m i l j o o n i s t a + m i l l a i s e e n + m i l l a i s e k s i + m i l l a i s e l l a + m i l l a i s e l t a + m i l l a i s e n + m i l l a i s e n a + m i l l a i s e s s a + m i l l a i s e s t a + m i l l a i s e t + m i l l a i s i a + m i l l a i s i i n + m i l l a i s i l l a + m i l l a i s i l t a + m i l l a i s i n + m i l l a i s i s s a + m i l l a i s t a + m i l l a i s t e n + m i l l e n n i u m j u l i s t u k s e n + m i l l e n n i u m k ä r p ä s e s t ä + m i l l i g r a m m a a n + m i l l i g r a m m a k a a n + m i l l i k a n i n + m i l l i m e t r i k o o n + m i l l i m e t r i n + m i l l i m e t r i n t a r k a t + m i n a n g k a b a u t + m i n b e i + m i n e r a a l e i s s a + m i n e r a a l e j a + m i n e r a a l i a i n e k s i a + m i n e r a a l i e n + m i n e r a a l i e s i i n t y m i ä + m i n e r a a l i e s i i n t y m ä t + m i n e r a a l i k a i v o s t e n + m i n e r a a l i k u o r m a a + m i n e r a a l i r i k k a u k s i a + m i n e r a a l i t u o t t e i d e n + m i n e r a a l i t ä r p ä t t i + m i n e r a a l i v a r a n t o i h i n + m i n e r a a l i v a r a t + m i n e r a a l i v a r o i h i n + m i n e r a a l i v a r o i l l a + m i n e r a a l i v a r o i s t a + m i n e r a a l i v a r o j a + m i n e r a a l i v a r o j e n + m i n e r a a l i v e d e l l e + m i n e r a a l i v e d e s s ä + m i n e r a a l i v e d e s t ä + m i n e r a a l i v e d e t + m i n e r a a l i v e s i + m i n e r a a l i v e s i p u l l o j e n + m i n e r a a l i v e s i v a l m i s t a j a n + m i n e r a a l i v e t e e n + m i n e r a a l i v e t t ä + m i n e r a a l i v i l l a + m i n e r a a l i v i l l a n + m i n e r a a l i ö l j y + m i n e r a a l i ö l j y j e n + m i n e r a a l i ö l j y n + m i n e r a a l i ö l j y t + m i n e r a a l i ö l j y t e o l l i s u u d e n + m i n e r a a l i ö l j y t e o l l i s u u s + m i n e r a a l i ö l j y v e r o j a + m i n e r a a l i ö l j y v e r o t + m i n e r a a l i ö l j y ä + m i n i a h v e n e t + m i n i a t y y r i h e v o n e n + m i n i a t y y r i k a m e r o i t a + m i n i a t y y r i m a a l a u s + m i n i a t y y r i p e l i + m i n i a t y y r i p u i s t o + m i n i a t y y r i u n i o n i + m i n i a t y y r i u n i o n i i n + m i n i b u d j e t e i s t a + m i n i b u d j e t i t + m i n i b u d j e t t e i h i n + m i n i b u d j e t t e j a + m i n i b u d j e t t i e n + m i n i g o l f + m i n i h u i p p u k o k o u k s i a + m i n i h u i p p u k o k o u k s i i n + m i n i h u i p p u k o k o u s + m i n i k o k o u s + m i n i k r i i s i n + m i n i m a a l i s e l l e + m i n i m a a l i s e n + m i n i m a a l i s e t + m i n i m a a l i s t a + m i n i m a l i s t i s i a + m i n i m i a j a n + m i n i m i a l u e e n + m i n i m i a r v o a + m i n i m i a s e n n e + m i n i m i e h d o i s t a + m i n i m i e h d o t u s + m i n i m i e l ä k e t t ä + m i n i m i h a r m o n i s o i n n i n + m i n i m i h i n t a + m i n i m i h i n t a t a k u i l l a + m i n i m i i n + m i n i m i k a p a s i t e e t i n + m i n i m i k i i n t i ö + m i n i m i k o m p r o m i s s i + m i n i m i k o o n + m i n i m i k r i t e e r e i t ä + m i n i m i k u u k a u s i p a l k a n + m i n i m i k y n n y k s i s t ä + m i n i m i l ä m p ö t i l a n + m i n i m i m ä ä r ä + m i n i m i m ä ä r ä n + m i n i m i m ä ä r ä ä + m i n i m i n + m i n i m i n o r m i t + m i n i m i p a l k a l l a + m i n i m i p a l k a l l e + m i n i m i p a l k a n + m i n i m i p a l k a s t a + m i n i m i p a l k a t + m i n i m i p a l k k a + m i n i m i p a l k k a a + m i n i m i p a l k k a a n + m i n i m i p a l k k a j ä r j e s t e l m ä + m i n i m i p a l k k a j ä r j e s t e l m ä n + m i n i m i p a l k k a j ä r j e s t e l m ä t a v o i t t e e s t a + m i n i m i p a l k k a l e i k k a u s t e n + m i n i m i p a l k k a m m e + m i n i m i p a l k k a p o l i t i i k k a + m i n i m i p a l k k a r a j a + m i n i m i p a l k k a u s + m i n i m i p a l k k o i h i n + m i n i m i p a l k k o j a + m i n i m i p a l k k o j e n + m i n i m i p a l k o i s t a + m i n i m i p a l v e l u i h i n + m i n i m i p a l v e l u t a s o n + m i n i m i p e r u s p a l k a s t a + m i n i m i p o l i t i i k k o j a + m i n i m i p ä ä t ö s + m i n i m i r a j a n + m i n i m i r a j a s t a + m i n i m i r a n g a i s t u k s e n + m i n i m i r a t k a i s u u n + m i n i m i r i s k i ä + m i n i m i s s ä + m i n i m i s t a n d a r d e i h i n + m i n i m i s t a n d a r d e i n + m i n i m i s t a n d a r d i n + m i n i m i s t a n d a r d i t + m i n i m i s ä ä n n ö k s i k s i + m i n i m i s ä ä n n ö t + m i n i m i t a r j o u s k o r k o + m i n i m i t a s o + m i n i m i t a s o a + m i n i m i t a s o l l a + m i n i m i t a s o n + m i n i m i t a s o t + m i n i m i t e k i j ä + m i n i m i t o i m e e n t u l o n + m i n i m i t o l e r a n s s i + m i n i m i t u l o + m i n i m i t u l o j a + m i n i m i t u l o t + m i n i m i t u n t i p a l k k a a + m i n i m i t u r v a l l i s u u s v ä l i + m i n i m i t y ö e h t o i h i n + m i n i m i v a a t i m u k s e n + m i n i m i v a a t i m u k s e t + m i n i m i v a a t i m u k s i a + m i n i m i v a a t i m u k s i s t a + m i n i m i v a l t i o s t a + m i n i m i v e r o t a s o t + m i n i m i v e r o t u k s e n + m i n i m i ä + m i n i m o i d a a n + m i n i m o i d a k s e e n + m i n i m o i d a k s e m m e + m i n i m o i m a a n + m i n i m o i m i s e k s i + m i n i m o i n t i s u u n n i t e l m a a + m i n i m o i t a v a + m i n i p a k e t t i + m i n i p a k e t t i a + m i n i p i l l e r i + m i n i r a h a s t o i s t a + m i n i s e s s i o + m i n i s i k a + m i n i s o p i m u k s e e n + m i n i s o p i m u k s e l l a + m i n i s o p i m u k s e n + m i n i s o p i m u k s e n a + m i n i s o p i m u k s e s t a + m i n i s o p i m u s + m i n i s o p i m u s t a + m i n i s o v i t t e l u n + m i n i s t e r e i d e n + m i n i s t e r e i h i n + m i n i s t e r e i l l e + m i n i s t e r e i s t ä + m i n i s t e r e i t ä + m i n i s t e r i a i k a n a n i + m i n i s t e r i e d u s t u s + m i n i s t e r i e n + m i n i s t e r i e n k o k o u k s e s s a + m i n i s t e r i i n + m i n i s t e r i j o u k k o + m i n i s t e r i j u l i s t u s + m i n i s t e r i k a u t e n n e + m i n i s t e r i k i e r r ä t y s + m i n i s t e r i k i n + m i n i s t e r i k o k o u k s e e n + m i n i s t e r i k o k o u k s e k s i + m i n i s t e r i k o k o u k s e l l a + m i n i s t e r i k o k o u k s e l l e + m i n i s t e r i k o k o u k s e n + m i n i s t e r i k o k o u k s e s s a + m i n i s t e r i k o k o u k s e s t a + m i n i s t e r i k o k o u k s e t + m i n i s t e r i k o k o u k s i a + m i n i s t e r i k o k o u k s i i n + m i n i s t e r i k o k o u k s i s s a + m i n i s t e r i k o k o u s + m i n i s t e r i k o k o u s t a + m i n i s t e r i k o k o u s t e n + m i n i s t e r i k o l l e g a m m e + m i n i s t e r i k o l l e g a n i + m i n i s t e r i k o l l e g a n n e + m i n i s t e r i k o l l e g o i l l e e n + m i n i s t e r i k o l l e g o i t a n n e + m i n i s t e r i k o l l e g o j e n i + m i n i s t e r i k o m i t e a + m i n i s t e r i k o m i t e a n + m i n i s t e r i k o m i t e a s s a + m i n i s t e r i k o n f e r e n s s e i s s a + m i n i s t e r i k o n f e r e n s s i + m i n i s t e r i k o n f e r e n s s i a + m i n i s t e r i k o n f e r e n s s i e n + m i n i s t e r i k o n f e r e n s s i i n + m i n i s t e r i k o n f e r e n s s i l l e + m i n i s t e r i k o n f e r e n s s i n + m i n i s t e r i k o n f e r e n s s i s s a + m i n i s t e r i k o n f e r e n s s i t + m i n i s t e r i k o n k l a a v i s s a + m i n i s t e r i k s i + m i n i s t e r i l a u s u m a + m i n i s t e r i l a u s u m a s s a + m i n i s t e r i l l e + m i n i s t e r i l l e e n + m i n i s t e r i m m e + m i n i s t e r i n + m i n i s t e r i n e u v o s t o + m i n i s t e r i n e u v o s t o a + m i n i s t e r i n e u v o s t o a k i n + m i n i s t e r i n e u v o s t o i l t a + m i n i s t e r i n e u v o s t o i s s a + m i n i s t e r i n e u v o s t o j a + m i n i s t e r i n e u v o s t o j e n + m i n i s t e r i n e u v o s t o k i n + m i n i s t e r i n e u v o s t o l l a + m i n i s t e r i n e u v o s t o l l e + m i n i s t e r i n e u v o s t o l t a + m i n i s t e r i n e u v o s t o l t a k i n + m i n i s t e r i n e u v o s t o m m e + m i n i s t e r i n e u v o s t o n + m i n i s t e r i n e u v o s t o n k i n + m i n i s t e r i n e u v o s t o n s a + m i n i s t e r i n e u v o s t o o n + m i n i s t e r i n e u v o s t o s s a + m i n i s t e r i n e u v o s t o s s a h a n + m i n i s t e r i n e u v o s t o s s a k i n + m i n i s t e r i n e u v o s t o s s a m m e + m i n i s t e r i n e u v o s t o s t a + m i n i s t e r i n e u v o s t o s t a k a a n + m i n i s t e r i n e u v o s t o t + m i n i s t e r i n e u v o t t e l u i h i n + m i n i s t e r i n e u v o t t e l u j a + m i n i s t e r i n s a l k k u a + m i n i s t e r i n s a l k k u j a + m i n i s t e r i n s a l k u s t a + m i n i s t e r i n v i r k o j a + m i n i s t e r i n ä + m i n i s t e r i p a i k k o j e n + m i n i s t e r i p a i k o i s t a + m i n i s t e r i p r e s i d e n t t i + m i n i s t e r i p r o s e s s i n + m i n i s t e r i t + m i n i s t e r i t a p a a m i n e n + m i n i s t e r i t a p a a m i s e e n + m i n i s t e r i t a p a a m i s e n + m i n i s t e r i t a p a a m i s e s s a + m i n i s t e r i t a p a a m i s i a + m i n i s t e r i t a p a a m i s i l l e + m i n i s t e r i t a p a a m i s i s s a + m i n i s t e r i t a p a a m i s t e n + m i n i s t e r i t a s o i h i n + m i n i s t e r i t a s o l l a + m i n i s t e r i t a s o l l e + m i n i s t e r i t a s o n + m i n i s t e r i t k ä ä n + m i n i s t e r i t r o i k a n + m i n i s t e r i t r o i k a s s a + m i n i s t e r i t r o i k k a + m i n i s t e r i t y ö r y h m ä ä n n e + m i n i s t e r i v a l t i o s i h t e e r i + m i n i s t e r i v a l t u u s k u n n a n + m i n i s t e r i v i i k o n + m i n i s t e r i y s t ä v ä + m i n i s t e r i ä + m i n i s t e r i ö i d e n + m i n i s t e r i ö i l l e + m i n i s t e r i ö i s s ä + m i n i s t e r i ö i t ä + m i n i s t e r i ö k o n e i s t o i h i n + m i n i s t e r i ö n + m i n i s t e r i ö n i + m i n i s t e r i ö t + m i n i s t e r i ö t a s o l l a + m i n i t a l o u s a r v i o i d e n + m i n i t a l o u s a r v i o k ä y t ä n t ö + m i n i t a l o u s a r v i o s t a + m i n i t y ö p a i k o i s s a + m i n i t ä y s i s t u n n o s s a + m i n i u n i o n i n + m i n i u u d i s t u s t a + m i n i y d i n a s e i l l a + m i n i y d i n a s e i t a + m i n k ä l a i s e e n + m i n k ä l a i s e l l a + m i n k ä l a i s e n + m i n k ä l a i s e s s a + m i n k ä l a i s e s t a + m i n k ä l a i s e t + m i n k ä l a i s i a + m i n k ä l a i s i i n + m i n k ä l a i s i n + m i n k ä l a i s t a + m i n k ä ä n l a i s e e n + m i n k ä ä n l a i s e k s i + m i n k ä ä n l a i s e l l a + m i n k ä ä n l a i s e l l e + m i n k ä ä n l a i s e n + m i n k ä ä n l a i s e s s a + m i n k ä ä n l a i s e s t a + m i n k ä ä n l a i s e t + m i n k ä ä n l a i s i a + m i n k ä ä n l a i s i i n + m i n k ä ä n l a i s i s s a + m i n k ä ä n l a i s i s t a + m i n k ä ä n l a i s t a + m i n k ä ä n l a i s t e n + m i n u a + m i n u a k i n + m i n u l l a + m i n u l l e + m i n u l l e k i n + m i n u l t a + m i n u n + m i n u n k a a n + m i n u n k i n + m i n u r s o n + m i n u s t a + m i n u s t a k i n + m i n u t k i n + m i n u u n + m i n u u t e i k s i + m i n u u t e i l l a + m i n u u t i k s i + m i n u u t i l l a + m i n u u t i n + m i n u u t i s s a + m i n u u t i s s a k i n + m i n u u t i s t a + m i n u u t i t + m i n u u t t e i n a + m i n u u t t e j a + m i n u u t t i a + m i n u u t t i a k a a n + m i n u u t t i e n + m i n u u t t i i n + m i n u u t t i k o h t a i s e t + m i n u u t t i m a k s u i h i n + m i n u u t t i n i + m i n u u t t i v a l s s i + m i n ä h ä n + m i s s i o n + m i s s i o n u o r e t + m i s s i s s i p i n k ä k i + m i s t e l i m e s i k k o + m i s t e l i n a p s i j a + m i s t e l i s i e p p o m e s i k k o + m i t a l e i s t a + m i t a l i a + m i t a l i n + m i t a l i s t e i s t a + m i t a l l a + m i t a t a + m i t a t a a n + m i t a t a a n k o + m i t a t t a v a + m i t a t t a v i k s i + m i t a t t a v i s s a + m i t a t t u n a + m i t e n k ä h ä n + m i t o i n + m i t o i s t a + m i t t a a m a t t o m i a + m i t t a a m i s e k s i + m i t t a a m i s e n + m i t t a a m i s e s t a + m i t t a a m i s t a + m i t t a a m m e + m i t t a b o s o n i + m i t t a e t s i n k a m e r a + m i t t a i n t e g r a a l i + m i t t a i s e k s i + m i t t a j ä r j e s t e l m ä + m i t t a j ä r j e s t e l m ä n + m i t t a j ä r j e s t e l m ä s t ä ä n + m i t t a k a a v a + m i t t a k a a v a a + m i t t a k a a v a a n + m i t t a k a a v a e d u i s s a + m i t t a k a a v a e d u n + m i t t a k a a v a e d u t + m i t t a k a a v a e t u + m i t t a k a a v a e t u a + m i t t a k a a v a e t u i h i n + m i t t a k a a v a e t u j a + m i t t a k a a v a e t u j e n + m i t t a k a a v a n + m i t t a k a a v a s s a + m i t t a k a a v a s ä ä s t ö j ä + m i t t a k a a v a t a l o u s + m i t t a k a a v a v a i k u t u s + m i t t a k a a v a v a i k u t u s t a + m i t t a k e n t t ä t e o r i a + m i t t a l a i t e + m i t t a l a i t t e e t + m i t t a l a i t t e i d e n + m i t t a l a i t t e i l l a + m i t t a l a i t t e i l l e + m i t t a l a i t t e i s s a + m i t t a l a i t t e i s t a + m i t t a l a i t t e i t a + m i t t a l a s i + m i t t a n a u h a + m i t t a p u i d e n + m i t t a p u i l l a + m i t t a p u i t a + m i t t a p u l l o + m i t t a p u u n + m i t t a p u u n a + m i t t a p u u t + m i t t a p u u t a + m i t t a r i k s i + m i t t a r i l e n t o + m i t t a r i m a l l i + m i t t a r i n a + m i t t a r i n l u e n n a n + m i t t a r i s ä ä o l o s u h t e i t a + m i t t a r i t + m i t t a r i y ö k k ö n e n + m i t t a s u h t e e t + m i t t a s u h t e i l t a a n + m i t t a s u h t e i s i i n + m i t t a s u h t e i s s a + m i t t a t i l a u s t o i m i n n a n + m i t t a u k s e s s a + m i t t a u k s i a + m i t t a u s a l u e e l l a + m i t t a u s a s e m i e n + m i t t a u s j ä r j e s t e l m i i n + m i t t a u s j ä r j e s t e l m i ä + m i t t a u s j ä r j e s t e l m ä + m i t t a u s j ä r j e s t e l m ä k s i + m i t t a u s j ä r j e s t e l m ä l l ä + m i t t a u s j ä r j e s t e l m ä n + m i t t a u s j ä r j e s t e l m ä t + m i t t a u s j ä r j e s t e l m ä ä + m i t t a u s j ä r j e s t e l m ä ä n + m i t t a u s k o k e m u s + m i t t a u s l a i t e d i r e k t i i v i n + m i t t a u s l a i t e d i r e k t i i v i ä + m i t t a u s l a i t t e e t + m i t t a u s l a i t t e i d e n + m i t t a u s l a i t t e i s i i n + m i t t a u s l a i t t e i s s a + m i t t a u s l a i t t e i s t a + m i t t a u s l a i t t e i t a + m i t t a u s l e n t o j a + m i t t a u s m e n e t e l m i e n + m i t t a u s m e n e t e l m i i n + m i t t a u s m e n e t e l m i s t ä + m i t t a u s m e n e t e l m i s t ä m m e + m i t t a u s m e n e t e l m i ä + m i t t a u s m e n e t e l m ä + m i t t a u s m e n e t e l m ä t + m i t t a u s m e n e t t e l y t a p o j a + m i t t a u s m e n e t t e l y ä + m i t t a u s o n g e l m i a + m i t t a u s p a i k k a + m i t t a u s p a l v e l u t + m i t t a u s p i s t e i d e n + m i t t a u s s ä ä n n ö t + m i t t a u s s ä ä n t ö j ä + m i t t a u s t a p a + m i t t a u s t a p o j a + m i t t a u s t a v o i t t e i s s a + m i t t a u s t e h t ä v i i n + m i t t a u s t e h t ä v i s s ä + m i t t a u s t e h t ä v i ä + m i t t a u s t e k n i i k a n + m i t t a u s t e k n i i k k a + m i t t a u s t e k n i i k k a a + m i t t a u s t e k n i i k o i s t a + m i t t a u s t i h e y t t ä + m i t t a u s t u l o k s i a + m i t t a u s v i r h e + m i t t a u s v ä l i n e i l l ä + m i t t a u s v ä l i n e i t ä + m i t t a v a a + m i t t a v a a n + m i t t a v a l l e + m i t t a v a m p a a + m i t t a v a m p i i n + m i t t a v a s s a k i n + m i t t a v a s t a + m i t t a v a t + m i t t a v i a + m i t t a v i i n + m i t t a v i s t a + m i t t a v ä l i n e + m i t t a v ä l i n e e k s i + m i t t a y k s i k k ö + m i t t a y k s i k k ö j ä + m i t t a y k s i k k ö ä + m i t t a y k s i k ö i s t ä + m i t t a y k s i k ö i t ä + m i t t a y k s i k ö s s ä + m i t t a y k s i k ö t + m i t t o j e n + m i t ä k ä + m i t ä p ä + m i t ä t t ö m i k s i + m i t ä t t ö m i s t ä + m i t ä t t ö m i ä + m i t ä t t ö m y y k s i s t ä + m i t ä t t ö m ä k s i + m i t ä t t ö m ä l t ä + m i t ä t t ö m ä m p i ä + m i t ä t t ö m ä t + m i t ä t ö i d y k s i + m i t ä t ö i d ä + m i t ä t ö i d ä ä n + m i t ä t ö i n t i ä + m i t ä t ö i t i i n + m i t ä t ö i t y j ä + m i t ä t ö i t y n y t + m i t ä t ö i t ä i s i i n + m i t ä ä n s a n o m a t t o m i a + m o b i i l i h i n n o i s s a + m o b i i l i k ä y t t ö j ä r j e s t e l m ä + m o b i i l i l a a j a k a i s t a i n t e r n e t i n + m o b i i l i l a a j a k a i s t a v e r k k o j e n + m o b i i l i l i i k e n t e e n + m o b i i l i l i i k e t o i m i n t a + m o b i i l i l i i k e t o i m i n t a a + m o b i i l i l ä h e t y s t e n + m o b i i l i m a k s a m i n e n + m o b i i l i m a k s u t + m o b i i l i o h j e l m i s t o + m o b i i l i o p e r a a t t o r e i d e n + m o b i i l i o p p i m i n e n + m o b i i l i p a l v e l u i l l e + m o b i i l i p a l v e l u t + m o b i i l i p e l i + m o b i i l i p o r n o + m o b i i l i s e k t o r i + m o b i i l i t e l e v i s i o + m o b i i l i t e l e v i s i o t a + m o b i i l i v e r k o i s s a + m o b i i l i v i e s t i m i ä + m o b i i l i v i e s t i n t ä + m o b i i l i v i e s t i n t ä ä k i n + m o b i l e n l a h d e n + m o b i l i s o i m i s e k s i + m o b i l i s o i n n i n + m o b i l i s o i t a v a + m o b i l i s o i v a t k i n + m o d a a l i l o g i i k k a + m o d e r n e i m m a n + m o d e r n e i m p i i n + m o d e r n e i s s a + m o d e r n i m m a n + m o d e r n i m p a a + m o d e r n i n + m o d e r n i s o i d a + m o d e r n i s o i n t i t o i m i e n + m o d e r n i s o i t a e s s a + m o d e r n i s o i t u m i s p y r k i m y k s e t + m o d e r n i s o i t u u + m o d e r n i s s a + m o d i f i o i t u + m o d i f i o i t u j e n + m o d u l a a t i o i n d e k s i + m o d u l i m u o t o + m o d u u l i e r ä + m o d u u l i r a k e n n e + m o h a w k i t + m o i t e k i r j e e l l ä + m o i t i t t a v a m p a a + m o i t i t t u + m o i t t e e n + m o i t t e e t o n t a + m o i t t e e t t o m a a n + m o i t t e e t t o m a k s i + m o i t t e e t t o m a l l e + m o i t t e e t t o m a l t a + m o i t t e e t t o m a m m i n + m o i t t e e t t o m a m p a a n + m o i t t e e t t o m a n + m o i t t e e t t o m a s s a + m o i t t e e t t o m a s t a + m o i t t e e t t o m i a + m o i t t e i d e n + m o i t t e i s i i n + m o i t t e i s t a + m o i t t e i t a + m o i t t i a + m o i t t i a k s e n i + m o i t t i i + m o i t t i m a a n + m o i t t i v a n + m o i t t i v a t + m o k i a + m o k i n + m o k k a l u i k e r o + m o k k a p a l a t + m o k k a p a n n u + m o l d o v a a + m o l d o v a j o k i + m o l d o v a l a i s e t + m o l d o v a l a i s i a + m o l d o v a l a i s t e n + m o l d o v a l a i s y h t e i s ö + m o l d o v a l l e + m o l d o v a n + m o l d o v a s s a + m o l d o v a s t a + m o l e k y y l e j ä + m o l e k y y l i b i o l o g i a + m o l e k y y l i b i o l o g i a n + m o l e k y y l i b i o l o g i a s t a + m o l e k y y l i b i o l o g i s i a + m o l e k y y l i e v o l u u t i o + m o l e k y y l i g a s t r o n o m i a + m o l e k y y l i g e n e t i i k a n + m o l e k y y l i g e n e t i i k k a + m o l e k y y l i k e l l o + m o l e k y y l i m a l l i n n u s + m o l e k y y l i m a s s a + m o l e k y y l i m i e s + m o l e k y y l i o r b i t a a l i + m o l e k y y l i p i l v i + m o l e k y y l i r a k e n n e + m o l e k y y l i r a k e n n e t t a + m o l e k y y l i s e u l a + m o l e k y y l i t a s o l l a + m o l e k y y l i t y y p i t y s m e n e t e l m i ä + m o l e m m a l l a + m o l e m m a l l e + m o l e m m a t + m o l e m m a t h a n + m o l e m m i l l a + m o l e m m i l l e + m o l e m m i l t a + m o l e m m i n + m o l e m m i n p u o l i s e e n + m o l e m m i n p u o l i s e l l e + m o l e m m i n p u o l i s e n + m o l e m m i n p u o l i s e s s a + m o l e m m i n p u o l i s e s t a + m o l e m m i n p u o l i s i a + m o l e m m i n p u o l i s i i n + m o l e m m i n p u o l i s t a + m o l e m m i n p u o l i s t e n + m o l e m m i s s a + m o l e m m i s t a + m o l e m p i a + m o l e m p i e n + m o l e m p i i n + m o l o g a + m o l o t + m o l o t o v i n + m o l y b d e e n i d i o k s i d i + m o l y b d e e n i d i s u l f i d i + m o l y b d e e n i h a p p o + m o l y b d e e n i t r i o k s i d i + m o l y b d e e n i t r i s u l f i d i + m o m e n t i l l e + m o m e n t i n m u u n n i n + m o m e n t t e j a + m o m e n t t i a v a i n + m o m e n t t i m a g n i t u d i + m o n a r k i t + m o n a r k k i p e r h o n e n + m o n a r k k i p e r h o s e t + m o n e e n + m o n e l l a + m o n e l l e + m o n e l t a + m o n e n + m o n e n a + m o n e n k e r t a i s e s t i + m o n e n k e s k i s e e n + m o n e n k e s k i s e n + m o n e n k e s k i s e s t i + m o n e n k e s k i s i i n + m o n e n k e s k i s t e n + m o n e n k i r j a v a a + m o n e n k i r j a v a t + m o n e n l a i s e l l e + m o n e n l a i s e l t a + m o n e n l a i s e n + m o n e n l a i s e s t a + m o n e n l a i s e t + m o n e n l a i s i a + m o n e n l a i s i i n + m o n e n l a i s i l l a + m o n e n l a i s i l l e + m o n e n l a i s i n + m o n e n l a i s i n a + m o n e n l a i s i s s a + m o n e n l a i s i s t a + m o n e n l a i s t a + m o n e n l a i s t e n + m o n e n m o i s t a + m o n e n t a s o i s t a + m o n e n v ä l i s e e n + m o n e n v ä l i s e l l e + m o n e n v ä l i s e l l ä + m o n e n v ä l i s e m m ä n + m o n e n v ä l i s e n + m o n e n v ä l i s e n ä + m o n e n v ä l i s e s s ä + m o n e n v ä l i s e s t ä + m o n e n v ä l i s e t + m o n e n v ä l i s i s s ä + m o n e n v ä l i s i ä + m o n e n v ä l i s t e n + m o n e n v ä l i s t ä + m o n e r o n + m o n e s s a + m o n e s s a k i n + m o n e s t a + m o n e s t a k i n + m o n e s t i k a a n + m o n e t + m o n e t a r i s m i i n + m o n e t a r i s t i s i a + m o n e t a r i s t i s t a + m o n e t k a a n + m o n f i l s + m o n f i l s i n + m o n f i l s i ä + m o n g o l i a + m o n g o l i a l l e + m o n g o l i a n + m o n g o l i a n g e r b i i l i + m o n g o l i a n h e v o n e n + m o n g o l i a n h i e t a k i u r u + m o n g o l i a n h i i r i h a u k k a + m o n g o l i a n k i r v i n e n + m o n g o l i a n k i u r u + m o n g o l i a n l o k k i + m o n g o l i a n v a a h t e r a + m o n g o l i a s t a + m o n g o l i n + m o n g o l i p o i m u + m o n g o l i v a l t a k u n t a + m o n i a + m o n i a k a a n + m o n i a l a i n e n + m o n i a l a i s e e n + m o n i a l a i s e l t a + m o n i a l a i s e m m a n + m o n i a l a i s e n + m o n i a l a i s e n a + m o n i a l a i s e s t a + m o n i a l a i s e s t i + m o n i a l a i s i a + m o n i a l a i s i s s a + m o n i a l a i s i s t a + m o n i a l a i s t a + m o n i a l a i s t e n + m o n i a l a i s u u d e n + m o n i a l a i s u u t t a + m o n i a l a t o i m i n t a + m o n i a l u e h y p o t e e s i + m o n i a m m a t i l l i s t a + m o n i a r v o i s e m m a s t a + m o n i a r v o i s e m p a a + m o n i a r v o i s e m p i + m o n i a r v o i s e m p i a + m o n i a r v o i s e s s a + m o n i a r v o i s t a + m o n i a r v o i s u u d e n + m o n i a r v o i s u u d e s t a + m o n i a r v o i s u u t t a + m o n i a v i o i s t e n + m o n i a v i o i s u u s t a p a u k s i s s a + m o n i a v i o i s u u t t a + m o n i e n + m o n i e t n i n e n + m o n i e t n i s e e n + m o n i e t n i s e l l e + m o n i e t n i s e n + m o n i e t n i s e s s ä + m o n i e t n i s e s t ä + m o n i e t n i s e t + m o n i e t n i s i ä + m o n i e t n i s t e n + m o n i e t n i s y y s + m o n i e t n i s y y t e e n + m o n i f u n k t i o n a a l i s t a + m o n i i n + m o n i k a a n + m o n i k a n a v a j a k e l u a + m o n i k a n s a l l i s e e n + m o n i k a n s a l l i s e n + m o n i k a n s a l l i s e s t i + m o n i k a n s a l l i s e t + m o n i k a n s a l l i s i a + m o n i k a n s a l l i s i l l a + m o n i k a n s a l l i s i l l e + m o n i k a n s a l l i s i s t a + m o n i k a n s a l l i s t e n + m o n i k a n s a l l i s u u t t a + m o n i k e m i k a a l i h e r k k y y s + m o n i k e r r o k s i s e t + m o n i k e s k u s t u t k i m u k s i i n + m o n i k i e l i s e n + m o n i k i e l i s e s t i + m o n i k i e l i s e t + m o n i k i e l i s i ä + m o n i k i e l i s y y d e n + m o n i k i e l i s y y d e s t ä + m o n i k i e l i s y y s a s i a n + m o n i k i e l i s y y s k e s k u s t e l u n + m o n i k i e l i s y y s k y s y m y k s e e n + m o n i k i e l i s y y s k y s y m y k s e n + m o n i k i e l i s y y s o h j e i s t o s s a + m o n i k i e l i s y y s p e r i a a t t e e n + m o n i k i e l i s y y s p o l i t i i k a n + m o n i k i e l i s y y s p o l i t i i k k a a n + m o n i k i e l i s y y s p o l i t i i k k a m m e + m o n i k i e l i s y y s s a l k k u + m o n i k i e l i s y y s s t r a t e g i a n + m o n i k i e l i s y y t t ä + m o n i k o s s a + m o n i k u i t u i s i a + m o n i k u i t u s o p i m u k s e n + m o n i k u i t u s o p i m u k s e s t a + m o n i k u i t u s o p i m u s + m o n i k u i t u s o p i m u s t e n + m o n i k u l m i o l a u s e + m o n i k u l m i o l u k u + m o n i k u l t t u u r i s e k s i + m o n i k u l t t u u r i s e m m i k s i + m o n i k u l t t u u r i s e m p i + m o n i k u l t t u u r i s e n + m o n i k u l t t u u r i s e s s a + m o n i k u l t t u u r i s e s t a + m o n i k u l t t u u r i s i m m i s t a + m o n i k u l t t u u r i s u u d e n + m o n i k u l t t u u r i s u u d e s t a + m o n i k u l t t u u r i s u u t e e n + m o n i k u l t t u u r i s u u t t a + m o n i k y m m e n m i l j o o n a i s e t + m o n i k ä y t t ö a l u k s i l l e + m o n i k ä y t ö n + m o n i l a j i k a l a s t u k s e e n + m o n i l a j i k a l a s t u k s e n + m o n i l a j i k a l a s t u k s e s s a + m o n i l a j i k a l a s t u k s e s t a + m o n i l a p s i s i a + m o n i l a p s i s i l l e + m o n i l a p s i s t a + m o n i l l a + m o n i l l a k a a n + m o n i l l e + m o n i l t a + m o n i l u k u i s e m p i a + m o n i l u k u i s i a + m o n i l u k u i s i m p i a + m o n i l ä ä k e r e s i s t e n t i t + m o n i l ä ä k e r e s i s t e n t t e j ä + m o n i l ä ä k e r e s i s t e n t t i e n + m o n i l ä ä k e r e s i s t e n t t i ä + m o n i m a a i l m a t u l k i n t a + m o n i m e r k i t y k s i s i ä + m o n i m e r k i t y k s i s y y t e e n + m o n i m e t a l l i l a m p p u + m o n i m i l j o n ä ä r i k s i + m o n i m i l j o n ä ä r i t u r i s t i n + m o n i m u o t o i s e m m a n + m o n i m u o t o i s e m m a s s a + m o n i m u o t o i s e m m a s t a + m o n i m u o t o i s e m m i n + m o n i m u o t o i s e m p a a + m o n i m u o t o i s e m p i + m o n i m u o t o i s e m p i a + m o n i m u o t o i s e n + m o n i m u o t o i s e n a + m o n i m u o t o i s i m m i l l a + m o n i m u o t o i s t a + m o n i m u o t o i s t e n + m o n i m u o t o i s u u d e l l e + m o n i m u o t o i s u u d e n + m o n i m u o t o i s u u d e s s a a n + m o n i m u o t o i s u u d e s t a + m o n i m u o t o i s u u s k e s k u s + m o n i m u o t o i s u u s m a r s s i l l e + m o n i m u o t o i s u u s p a r a a t i n + m o n i m u o t o i s u u s p o l i t i i k a s s a + m o n i m u o t o i s u u t e e n + m o n i m u o t o i s u u t e n s a + m o n i m u o t o i s u u t t a + m o n i m u o t o k u l j e t u k s e t + m o n i m u o t o l i i k e n n e t t ä + m o n i m u t k a i s e e n + m o n i m u t k a i s e l t a + m o n i m u t k a i s e m m a k s i + m o n i m u t k a i s e m m a l t a + m o n i m u t k a i s e m m a n + m o n i m u t k a i s e m m a s s a + m o n i m u t k a i s e m m a s t a + m o n i m u t k a i s e m m a t + m o n i m u t k a i s e m m i k s i + m o n i m u t k a i s e m m i l t a + m o n i m u t k a i s e m p a a + m o n i m u t k a i s e m p a a n + m o n i m u t k a i s e m p i + m o n i m u t k a i s e m p i a + m o n i m u t k a i s e m p i e n + m o n i m u t k a i s e m p i i n + m o n i m u t k a i s e n + m o n i m u t k a i s e n a + m o n i m u t k a i s e s s a + m o n i m u t k a i s e s t a + m o n i m u t k a i s e s t i + m o n i m u t k a i s e t + m o n i m u t k a i s i a + m o n i m u t k a i s i a k i n + m o n i m u t k a i s i i n + m o n i m u t k a i s i k s i + m o n i m u t k a i s i m m a k s i + m o n i m u t k a i s i m m a n + m o n i m u t k a i s i m m a s t a + m o n i m u t k a i s i m m a t + m o n i m u t k a i s i m m i s t a + m o n i m u t k a i s i m p i a + m o n i m u t k a i s i m p i e n + m o n i m u t k a i s i n + m o n i m u t k a i s i n t a + m o n i m u t k a i s i s s a + m o n i m u t k a i s i s t a + m o n i m u t k a i s t a a + m o n i m u t k a i s t a m i n e n + m o n i m u t k a i s t a m i s t a + m o n i m u t k a i s t e n + m o n i m u t k a i s t u i + m o n i m u t k a i s t u m i n e n + m o n i m u t k a i s t u m i s e e n + m o n i m u t k a i s t u n e e t + m o n i m u t k a i s t u n u t + m o n i m u t k a i s t u u + m o n i m u t k a i s t u v a n + m o n i m u t k a i s t u v a t + m o n i m u t k a i s u u d e n + m o n i m u t k a i s u u d e s s a + m o n i m u t k a i s u u d e s t a + m o n i n + m o n i n a + m o n i n a i s e m p i + m o n i n a i s e m p i a + m o n i n a i s e t + m o n i n a i s i a + m o n i n a i s i i n + m o n i n a i s i m m i l l a + m o n i n a i s i m p i e n + m o n i n a i s t e n + m o n i n a i s u u d e l l a + m o n i n a i s u u d e n + m o n i n a i s u u d e s s a + m o n i n a i s u u d e s s a a n + m o n i n a i s u u d e s t a + m o n i n a i s u u s h a n + m o n i n a p a i s e s s a + m o n i n a p a i s t a + m o n i n a p a i s u u t t a + m o n i n i s k a i n e n + m o n i n i s ä r o t t a + m o n i n k e r t a i n e n k i n + m o n i n k e r t a i s e n + m o n i n k e r t a i s e n a + m o n i n k e r t a i s e t + m o n i n k e r t a i s i k s i + m o n i n k e r t a i s i n + m o n i n k e r t a i s i n a + m o n i n k e r t a i s t a a + m o n i n k e r t a i s t a v a n + m o n i n k e r t a i s t e t t a v a + m o n i n k e r t a i s t e t t u + m o n i n o p e u k s i n e n + m o n i p e r i n t ä + m o n i p o l i o i k e u k s i s t a + m o n i p u o l i s e e n + m o n i p u o l i s e l l a + m o n i p u o l i s e l l e + m o n i p u o l i s e m m a l l e + m o n i p u o l i s e m m a n + m o n i p u o l i s e m m a s t a + m o n i p u o l i s e m m a t + m o n i p u o l i s e m m i n + m o n i p u o l i s e m m i s t a + m o n i p u o l i s e m p a a + m o n i p u o l i s e m p i + m o n i p u o l i s e m p i a + m o n i p u o l i s e m p i e n + m o n i p u o l i s e n + m o n i p u o l i s e s s a + m o n i p u o l i s e s t a + m o n i p u o l i s e t + m o n i p u o l i s i a + m o n i p u o l i s i i n + m o n i p u o l i s i l l e + m o n i p u o l i s i s t a + m o n i p u o l i s t a a + m o n i p u o l i s t a a k s e e n + m o n i p u o l i s t a m a a n + m o n i p u o l i s t a m i s e e n + m o n i p u o l i s t a m i s h a n k k e e s e e n + m o n i p u o l i s t a m i s h a n k k e i s i i n + m o n i p u o l i s t a m i s h a n k k e i t a + m o n i p u o l i s t a m i s o h j e l m i a + m o n i p u o l i s t a m i s p e r i a a t e t t a + m o n i p u o l i s t a m i s p o l i t i i k k a a + m o n i p u o l i s t a m i s s t r a t e g i a + m o n i p u o l i s t a m i s t a + m o n i p u o l i s t a m i s t a v o i t t e e n + m o n i p u o l i s t a m i s t o i m i a + m o n i p u o l i s t e t t a v a + m o n i p u o l i s t u m i n e n + m o n i p u o l i s t u u + m o n i p u o l i s u u d e s t a + m o n i p u o l u e d e m o k r a t i a + m o n i p u o l u e d e m o k r a t i a a + m o n i p u o l u e d e m o k r a t i a a n + m o n i p u o l u e d e m o k r a t i a n + m o n i p u o l u e d e m o k r a t i a s t a + m o n i p u o l u e e l l i s u u d e n + m o n i p u o l u e h a l l i t u k s e n + m o n i p u o l u e h a l l i t u k s e s t a + m o n i p u o l u e h a l l i t u s + m o n i p u o l u e i s e n + m o n i p u o l u e j ä r j e s t e l m ä n + m o n i p u o l u e j ä r j e s t e l m ä s s ä + m o n i p u o l u e j ä r j e s t e l m ä s t ä + m o n i p u o l u e j ä r j e s t e l m ä ä + m o n i p u o l u e j ä r j e s t e l m ä ä n + m o n i p u o l u e l i i k k e e n + m o n i p u o l u e v a a l e i s t a + m o n i p u o l u e v a a l i e n + m o n i p u o l u e v a a l i t + m o n i r a i t a n a u h u r i + m o n i r a i t e i n e n + m o n i s e l i t t e i s e m p i + m o n i s e l i t t e i s e s t i + m o n i s e l i t t e i s i ä + m o n i s e l i t t e i s y y k s i ä + m o n i s e l i t t e i s y y t t ä + m o n i s i k i ö r a s k a u s + m o n i s i k i ö s y n n y t y s t e n + m o n i s s a + m o n i s t a k i n + m o n i s t u s k o n e + m o n i s y i s e m p i ä + m o n i s y s t e e m i a t r o f i a + m o n i s ä i k e i s e n + m o n i t + m o n i t a h o i s e e n + m o n i t a h o i s e m m i k s i + m o n i t a h o i s e m m i s s a + m o n i t a h o i s e m p a a + m o n i t a h o i s e m p i + m o n i t a h o i s e m p i a + m o n i t a h o i s e m p i i n + m o n i t a h o i s e s t a + m o n i t a h o i s e s t i + m o n i t a h o i s e t + m o n i t a h o i s i a + m o n i t a h o i s i n + m o n i t a h o i s i s t a + m o n i t a h o i s t a + m o n i t a h o i s t e n + m o n i t a s o d e m o k r a t i a + m o n i t a s o h a l l i n n a n + m o n i t a s o h a l l i n n o n + m o n i t a s o h a l l i n t a + m o n i t a s o h a l l i n t o a + m o n i t a s o i s e e n + m o n i t a s o i s e l l a + m o n i t a s o i s e n + m o n i t a s o i s e s t a + m o n i t a s o i s t a + m o n i t a s o k a m e r a + m o n i t i e t e i s e s t i + m o n i t o i m i l a i t e + m o n i t o i m i n n a l l i n e n + m o n i t o i m i n n a l l i s e k s i + m o n i t o i m i n n a l l i s e n + m o n i t o i m i n n a l l i s t a + m o n i t o i m i n n a l l i s u u d e n + m o n i t o i m i n n a l l i s u u d e s t a + m o n i t o i m i n n a l l i s u u s + m o n i t o i m i s u u t t a + m o n i t o i m i t a l o j a + m o n i t o r o i n t i j ä r j e s t e l m ä + m o n i t o r o i n t i o i k e u d e t + m o n i t u l k i n t a i s e m p i + m o n i t u l k i n t a i s e s t a + m o n i t u l k i n t a i s i s s a + m o n i t u r v a v a k u u t u s t a + m o n i u l o t t e i s e e n + m o n i u l o t t e i s e m m a l l a + m o n i u l o t t e i s e n + m o n i u l o t t e i s e n a + m o n i u l o t t e i s e s t a + m o n i u l o t t e i s e s t i + m o n i u l o t t e i s t a + m o n i u s k o n n o l l i s e s s a + m o n i u s k o n t o i n e n + m o n i u s k o n t o i s e e n + m o n i u s k o n t o i s i i n + m o n i u s k o n t o i s u u t t a + m o n i v a i h e i s i a + m o n i v a i h e i s t a + m o n i v a s t u s t u s k y k y i s t e n + m o n i v e d o s m a l l i + m o n i v i v a h t e i s e m p i + m o n i v u o t i s e e n + m o n i v u o t i s e l l a + m o n i v u o t i s e l l e + m o n i v u o t i s e l t a + m o n i v u o t i s e n + m o n i v u o t i s e n a + m o n i v u o t i s e s s a + m o n i v u o t i s e s t a + m o n i v u o t i s e s t i + m o n i v u o t i s e t + m o n i v u o t i s i a + m o n i v u o t i s i i n + m o n i v u o t i s i l l a + m o n i v u o t i s i l l e + m o n i v u o t i s i s s a + m o n i v u o t i s i s t a + m o n i v u o t i s o h j e l m a + m o n i v u o t i s o h j e l m a n + m o n i v u o t i s o h j e l m i s s a + m o n i v u o t i s s u u n n i t e l m a n + m o n i v u o t i s s u u n n i t e l m a t + m o n i v u o t i s s u u n n i t t e l u + m o n i v u o t i s t a + m o n i v u o t i s t e n + m o n i v y ö l u r i + m o n i v y ö s e i t i k k i + m o n i v ä r i h a p e r o + m o n i ä l y k k y y s t e o r i a + m o n o e t n i n e n + m o n o e t n i s e n + m o n o h y b r i d i r i s t e y t y s + m o n o k u l t t u u r e i s t a + m o n o k u l t t u u r i i n + m o n o k u l t t u u r i l l a + m o n o n a t r i u m g l u t a m a a t t i a + m o n o n g a h e l a + m o n o p o l e i l l e + m o n o p o l e i n a + m o n o p o l e i s s a + m o n o p o l e j a + m o n o p o l i a a n + m o n o p o l i a l a l l a + m o n o p o l i a s e m a + m o n o p o l i a s e m a a + m o n o p o l i a s e m a a n + m o n o p o l i a s e m a a n s a + m o n o p o l i a s e m a n + m o n o p o l i a s e m a n s a + m o n o p o l i a s e m a s s a + m o n o p o l i a s e m a s t a + m o n o p o l i a s e m a t + m o n o p o l i a s e m i a + m o n o p o l i a s e m i e n + m o n o p o l i d i r e k t i i v i s t ä + m o n o p o l i e h d o i n + m o n o p o l i e n + m o n o p o l i e t u j e n + m o n o p o l i h i r v i ö i t ä + m o n o p o l i j ä r j e s t e l m i ä + m o n o p o l i j ä r j e s t e l m ä n + m o n o p o l i j ä r j e s t e l m ä ä n + m o n o p o l i j ä r j e s t e l y j e n + m o n o p o l i j ä r j e s t e l y j ä + m o n o p o l i j ä r j e s t e l y n + m o n o p o l i j ä r j e s t e l y ä + m o n o p o l i j ä t t i e n + m o n o p o l i k o n s e r n i e n + m o n o p o l i l e n t o y h t i ö i d e n + m o n o p o l i l u o n t e e n + m o n o p o l i m a a i l m a + m o n o p o l i m a r k k i n o i t a + m o n o p o l i m y ö n t e i n e n + m o n o p o l i n + m o n o p o l i o i k e u k s i s t a + m o n o p o l i o m a i s u u t t a + m o n o p o l i p e l i + m o n o p o l i p e l i n + m o n o p o l i p i i r i t + m o n o p o l i p ä ä o m a + m o n o p o l i p ä ä o m a a n + m o n o p o l i p ä ä o m a l l e + m o n o p o l i p ä ä o m a n + m o n o p o l i r a k e n t e i d e n + m o n o p o l i r a k e n t e i t a + m o n o p o l i r y h m i e n + m o n o p o l i r y h m i l l e + m o n o p o l i r y h m i t t y m i e n + m o n o p o l i r y h m i t t y m i l l e + m o n o p o l i r y h m i t t y m i ä + m o n o p o l i r y h m ä t + m o n o p o l i s o i s i + m o n o p o l i s o i t u m i s t a + m o n o p o l i s t i s e l l e + m o n o p o l i t + m o n o p o l i t a k t i i k k a + m o n o p o l i t a l o u t t a + m o n o p o l i t a p a u k s i s s a + m o n o p o l i t i l a n n e + m o n o p o l i t i l a n n e t t a + m o n o p o l i t i l a n t e e n + m o n o p o l i t i l a n t e e s e e n + m o n o p o l i t i l a n t e e s t a + m o n o p o l i t i l a n t e i d e n + m o n o p o l i t i l a n t e i l t a + m o n o p o l i t o i m e n + m o n o p o l i t o i m i t t a j i e n + m o n o p o l i t u l o t + m o n o p o l i v a k u u t u s y h t i ö i l l e + m o n o p o l i v a l l a s t a a n + m o n o p o l i v a l v o n t a + m o n o p o l i v o i t t o j e n + m o n o p o l i y h t i ö i d e n + m o n o p o l i y h t i ö i t ä + m o n o p o l i y h t i ö n + m o n o p o l i y h t i ö t ä + m o n o p o l i y r i t y k s i l l e + m o n o p o l i y r i t y k s i l l ä + m o n o p o l i y r i t y k s i ä + m o n o p o l i y r i t y s r y h m i l l e + m o n o p o l i y r i t y s t e n + m o n o t e i s t i s e n + m o n o t e i s t i s e t + m o n t a a + m o n t a a n i h a p p o + m o n t a k a a n + m o n t a k o + m o o l i m a s s a + m o o l i t i l a v u u s + m o o t t o r e i d e n + m o o t t o r e i n a + m o o t t o r e i t a + m o o t t o r i a + m o o t t o r i a j o n e u v o + m o o t t o r i a j o n e u v o a + m o o t t o r i a j o n e u v o a l a + m o o t t o r i a j o n e u v o a l a a + m o o t t o r i a j o n e u v o a l a a n + m o o t t o r i a j o n e u v o a l a l l a + m o o t t o r i a j o n e u v o a l a l l e + m o o t t o r i a j o n e u v o a l a n + m o o t t o r i a j o n e u v o i h i n + m o o t t o r i a j o n e u v o i l l a + m o o t t o r i a j o n e u v o i l l e + m o o t t o r i a j o n e u v o i s s a + m o o t t o r i a j o n e u v o i s t a + m o o t t o r i a j o n e u v o j a + m o o t t o r i a j o n e u v o j e n + m o o t t o r i a j o n e u v o k a u p a n + m o o t t o r i a j o n e u v o k o l l e g a t + m o o t t o r i a j o n e u v o l l a + m o o t t o r i a j o n e u v o l u o k i s s a + m o o t t o r i a j o n e u v o l u o k k i e n + m o o t t o r i a j o n e u v o m a r k k i n o i d e n + m o o t t o r i a j o n e u v o m a r k k i n o i s t a + m o o t t o r i a j o n e u v o n + m o o t t o r i a j o n e u v o s e k t o r i l l a + m o o t t o r i a j o n e u v o s t a + m o o t t o r i a j o n e u v o t + m o o t t o r i a j o n e u v o t e k n i i k a s s a + m o o t t o r i a j o n e u v o t e k n o l o g i a a + m o o t t o r i a j o n e u v o t e o l l i s u u d e l l e + m o o t t o r i a j o n e u v o t e o l l i s u u d e n + m o o t t o r i a j o n e u v o t e o l l i s u u d e s s a + m o o t t o r i a j o n e u v o t e o l l i s u u d e s t a + m o o t t o r i a j o n e u v o t e o l l i s u u s + m o o t t o r i a j o n e u v o t e o l l i s u u t t a + m o o t t o r i a j o n e u v o v a k u u t u k s i a + m o o t t o r i a j o n e u v o v a k u u t u s + m o o t t o r i a j o n e u v o v e r o + m o o t t o r i a j o n e u v o v e r o i n a + m o o t t o r i a j o n e u v o v e r o j e n + m o o t t o r i a j o n e u v o v e r o n + m o o t t o r i a j o n e u v o v e r o t u k s e s s a + m o o t t o r i a l a + m o o t t o r i a l a n + m o o t t o r i a l u s + m o o t t o r i a l u s t e n + m o o t t o r i e n + m o o t t o r i k s i + m o o t t o r i k u l k u n e u v o j a + m o o t t o r i l a i t t e i d e n + m o o t t o r i l a i v a + m o o t t o r i l i i k e n n e + m o o t t o r i l i i k e n n e t i e + m o o t t o r i l i i k e n n e v ä l i n e i s i i n + m o o t t o r i l i i k e n n e v ä l i n e i s s ä + m o o t t o r i l t a + m o o t t o r i m a r k k i n a t + m o o t t o r i m e l u a + m o o t t o r i n + m o o t t o r i n a + m o o t t o r i n v a l m i s t u s y r i t y k s e t + m o o t t o r i n ä y t t e l y j ä + m o o t t o r i p o l t t o a i n e e n a + m o o t t o r i p o l t t o a i n e i d e n + m o o t t o r i p o l t t o a i n e i s i i n + m o o t t o r i p o l t t o a i n e i s s a + m o o t t o r i p o l t t o ö l j y + m o o t t o r i p y ö r i e n + m o o t t o r i p y ö r i l l e + m o o t t o r i p y ö r i ä + m o o t t o r i p y ö r ä a l a l l a + m o o t t o r i p y ö r ä i l i j ä + m o o t t o r i p y ö r ä i l i j ä n ä + m o o t t o r i p y ö r ä i l i j ä t + m o o t t o r i p y ö r ä i l i j ö i l l e + m o o t t o r i p y ö r ä i l i j ö i t ä + m o o t t o r i p y ö r ä i l y s t r a t e g i a + m o o t t o r i p y ö r ä k e r h o + m o o t t o r i p y ö r ä k e r h o i h i n + m o o t t o r i p y ö r ä k o r t t i + m o o t t o r i p y ö r ä k o r t t i e n + m o o t t o r i p y ö r ä k u l j e t t a j i e n + m o o t t o r i p y ö r ä k y p ä r ä + m o o t t o r i p y ö r ä l l ä + m o o t t o r i p y ö r ä n + m o o t t o r i p y ö r ä o n n e t t o m u u k s i e n + m o o t t o r i p y ö r ä o n n e t t o m u u k s i s t a + m o o t t o r i p y ö r ä p ä i v ä k i r j a + m o o t t o r i p y ö r ä t + m o o t t o r i p y ö r ä t e o l l i s u u s + m o o t t o r i p y ö r ä t r i a l + m o o t t o r i p y ö r ä u r h e i l u + m o o t t o r i p y ö r ä ä + m o o t t o r i r a d o i s t a + m o o t t o r i r a t a + m o o t t o r i s a a t t u e i t a + m o o t t o r i s a h a j o u k k o m u r h a + m o o t t o r i s a h a m u r h a a j a + m o o t t o r i s a h a m u r h a t + m o o t t o r i s a h o i l l e + m o o t t o r i s a h o i s s a + m o o t t o r i s a h o i s t a + m o o t t o r i t + m o o t t o r i t e h d a s + m o o t t o r i t e h o + m o o t t o r i t e h o a + m o o t t o r i t e h o n + m o o t t o r i t e i d e m m e + m o o t t o r i t e i d e n + m o o t t o r i t e i l l e + m o o t t o r i t e i l l ä + m o o t t o r i t e i t ä + m o o t t o r i t e k n i i k a n + m o o t t o r i t e k n i i k a s s a + m o o t t o r i t e k n i i k k a a + m o o t t o r i t e k n i i k k a a n + m o o t t o r i t e k n i i k o i t a + m o o t t o r i t e k n i s i n + m o o t t o r i t e k n o l o g i a + m o o t t o r i t e k n o l o g i a a + m o o t t o r i t e o l l i s u u d e l l e + m o o t t o r i t e o l l i s u u d e l t a + m o o t t o r i t e o l l i s u u d e n + m o o t t o r i t e o l l i s u u d e s s a + m o o t t o r i t e o l l i s u u s + m o o t t o r i t e o l l i s u u t t a + m o o t t o r i t i e + m o o t t o r i t i e h a n k k e e l l e + m o o t t o r i t i e h a n k k e e s t a + m o o t t o r i t i e h a n k k e e t + m o o t t o r i t i e h a n k k e i t a + m o o t t o r i t i e i n v e s t o i n t e i h i n + m o o t t o r i t i e k i l o m e t r i n + m o o t t o r i t i e k u l j e t u k s e n + m o o t t o r i t i e k ä y t ä v ä l l e + m o o t t o r i t i e l i i t t y m i l l ä + m o o t t o r i t i e l u p a + m o o t t o r i t i e m a k s u i n + m o o t t o r i t i e m a k s u j e n + m o o t t o r i t i e m a k s u t a r r a t + m o o t t o r i t i e n + m o o t t o r i t i e o s u u d e n + m o o t t o r i t i e o s u u t t a + m o o t t o r i t i e p o l i i s i n + m o o t t o r i t i e p o l i t i i k a s s a + m o o t t o r i t i e s i l t a a + m o o t t o r i t i e t u k i a + m o o t t o r i t i e t u n n e l i + m o o t t o r i t i e v e r k o n + m o o t t o r i t i e v e r k o s t a + m o o t t o r i t i e v e r k o s t o a a n + m o o t t o r i t i e v e r k o s t o i h i n + m o o t t o r i t i e v e r k o s t o n + m o o t t o r i t i e v e r k o s t o t + m o o t t o r i t i e v ä y l i l l ä + m o o t t o r i t i e y h t i ö + m o o t t o r i t i e y h t i ö i d e n + m o o t t o r i t i e y h t i ö t + m o o t t o r i t o r p e d o v e n e + m o o t t o r i t y y p i t + m o o t t o r i t y y p p e i h i n + m o o t t o r i u r h e i l u + m o o t t o r i v a l m i s t a j a n + m o o t t o r i v a u n u + m o o t t o r i v e n e a j o k o r t t i i n + m o o t t o r i v e n e e l l ä + m o o t t o r i v e n e e t + m o o t t o r i v e n e i l y + m o o t t o r i v e n e i t ä + m o o t t o r i ö l j y + m o o t t o r i ö l j y j e n + m o o t t o r i ö l j y k u l j e t u s t e n + m o p o a + m o p o a j o k o r t i n + m o p o a j o k o r t i s t a + m o p o k o r t t i e n + m o p o m i e h e l l ä n i + m o r a a l i a + m o r a a l i a r v o i s t a + m o r a a l i a r v o j a + m o r a a l i a r v o j e n + m o r a a l i a s i o i s t a + m o r a a l i i n + m o r a a l i j ä r j e s t y s t ä + m o r a a l i k a d o n + m o r a a l i k a t o + m o r a a l i k r i i s i i n + m o r a a l i k y s y m y k s e n + m o r a a l i k ä s i t t e i d e n + m o r a a l i k ä s i t y k s e n + m o r a a l i k ä s i t y k s i e n + m o r a a l i k ä s i t y s t e n + m o r a a l i l a k i a + m o r a a l i l t a a n + m o r a a l i n + m o r a a l i n o r m e i h i n + m o r a a l i n o r m e i s t a + m o r a a l i n o r m i t + m o r a a l i n ä k e m y s t ä + m o r a a l i p a n i i k k i + m o r a a l i p e r i a a t t e e t + m o r a a l i p e r i a a t t e i l l a + m o r a a l i p s y k o l o g i a + m o r a a l i s a a r n a a + m o r a a l i s a a r n o j a + m o r a a l i s a a r n o j e n + m o r a a l i s e l l e + m o r a a l i s e n + m o r a a l i s e n a + m o r a a l i s e s s a + m o r a a l i s e s t a + m o r a a l i s e t + m o r a a l i s i a + m o r a a l i s i i n + m o r a a l i s i n e + m o r a a l i s i s t a + m o r a a l i s t a + m o r a a l i s t e n + m o r a a l i s y i s t ä + m o r a a l i s ä ä n n ö s t ö + m o r a a l i s ä ä n n ö s t ö n + m o r a a l i s ä ä n n ö s t ö ä + m o r a a l i s ä ä n n ö s t ö ö n + m o r a a l i s ä ä n t ö i h i n + m o r a a l i s ä ä n t ö j e n + m o r a a l i s ä ä n t ö j ä + m o r a a l i t i e t e e n + m o r a a l i t o n t a + m o r a a l i t t o m i a + m o r a a l i t t o m i m m a n + m o r a a l i t t o m i n t a + m o r a a l i v a a t i m u k s e t + m o r a l i s o i d a + m o r a l i s o i n n i s t a + m o r a l i s o i n t i a + m o r a l i s t i s i s t a + m o r m o n i r e f o r m a a t i o + m o r o j ä r v i + m o r o n i + m o r o t + m o r s i o s o r s a + m o s a i i k i n + m o s a i i k k i e v o l u u t i o + m o s a i i k k i k u v a s s a + m o s a i i k k i v i r u s + m o s a m b i k i l a i s t e n + m o s k e i j a j ä r j e s t e l m ä s s ä + m o s k e i j a t + m o s k e i j o i s s a + m o s k i i t t o r a n n i k k o + m o s k i i t t o v e r k k o j a + m o t i i v e i h i n + m o t i i v e j a + m o t i i v i e n s a + m o t i i v i n a + m o t i i v i t + m o t i v a a t i o n + m o t i v a a t i o s t a + m o t i v a a t i o t a + m o t i v o i t a v a + m o t i v o i t u n e e m p i a + m o t i v o i t u n e i t a + m o t i v o i v a n + m o t i v o i v a t + m o t o l l a + m o t o n e u r o n i t a u t i + m o t o n i + m o t o r i i k a l t a a n + m o t t o a a n + m o t t o n a m m e + m o u k a r i n h e i t t o + m o u k a t + m o z z a r e l l a t i k u t + m u i d e n + m u i d e n k a a n + m u i d e n k i n + m u i h i n + m u i h i n k a a n + m u i h i n k i n + m u i k s i + m u i l l a + m u i l l a k a a n + m u i l l a k i n + m u i l l e + m u i l l e k i n + m u i l t a + m u i n a i s a i k a i s e t + m u i n a i s e n + m u i n a i s e n g l a n t i + m u i n a i s e s s a + m u i n a i s e t + m u i n a i s h i s t o r i a a n + m u i n a i s h o l l a n t i + m u i n a i s i s t a + m u i n a i s j ä ä n n ö s + m u i n a i s k a n n a d a l a i n e n + m u i n a i s k i r k k o s l a a v i + m u i n a i s k r e i k a k s i + m u i n a i s k r e i k k a + m u i n a i s k r e i k k a a + m u i n a i s k r e i k k a l a i s t a + m u i n a i s k u l t t u u r i n + m u i n a i s n o r j a + m u i n a i s p r e u s s i l a i s e t + m u i n a i s p r e u s s i n + m u i s s a + m u i s s a k a a n + m u i s s a k i n + m u i s t a a + m u i s t a a k s e n i + m u i s t a e n + m u i s t a e s s a n i + m u i s t a i s i + m u i s t a i s i m m e + m u i s t a k a a + m u i s t a k a a m m e + m u i s t a m a a n + m u i s t a m a t t a + m u i s t a m i s e n + m u i s t a m m e + m u i s t a m m e h a n + m u i s t a n + m u i s t a n e e + m u i s t a n e t t e + m u i s t a t t e + m u i s t a t t e h a n + m u i s t a t t e k o + m u i s t a v a n + m u i s t a v a t + m u i s t a v i n a n i + m u i s t e l e e + m u i s t e l e m a t t a + m u i s t e l e m m e + m u i s t e l e n + m u i s t e l k a a + m u i s t e l k a a m m e + m u i s t e l l a + m u i s t e l l a a n + m u i s t e l l a a n p a + m u i s t e l l e e t + m u i s t e l l e s s a m m e + m u i s t e l l e s s a n i + m u i s t e l m a t + m u i s t e l u t y ö n s ä + m u i s t e t a a n + m u i s t e t t a k o o n + m u i s t i a a n + m u i s t i a m m e + m u i s t i i n + m u i s t i i n p a n o i s s a n i + m u i s t i i n p a n o j a + m u i s t i k a t k o s + m u i s t i k o r t i n l u k i j a + m u i s t i k o r t t i + m u i s t i l a p u s s a n i + m u i s t i l i s t a n + m u i s t i m e t a l l i + m u i s t i n + m u i s t i n e l v y t t ä m i s p r o s e s s i s s a + m u i s t i n m e n e t y k s e e n + m u i s t i n m e n e t y k s e n + m u i s t i n m e n e t y k s e s t ä + m u i s t i n m e n e t y s + m u i s t i n m e n e t y s t ä + m u i s t i o h j e l m i a + m u i s t i o h j e l m i l l a + m u i s t i o i t a + m u i s t i o l l a + m u i s t i o n + m u i s t i o s s a + m u i s t i p i i r i + m u i s t i s a i r a u d e t + m u i s t i s a i r a u t e e n + m u i s t i s s a + m u i s t i s s a m m e + m u i s t i s t a + m u i s t i t i e t o h i s t o r i a + m u i s t i t i k k u j a + m u i s t i t o i m i n t o i h i n + m u i s t i v a i k e u k s i e n + m u i s t i v i r h e + m u i s t i v u o t o + m u i s t o a + m u i s t o h a l l i + m u i s t o h e t k e e n + m u i s t o i s s a m m e + m u i s t o i s s a n i + m u i s t o i s t a n i + m u i s t o j a + m u i s t o j e n + m u i s t o j e n i + m u i s t o j u h l a a n + m u i s t o j u h l i e n + m u i s t o j u m a l a n p a l v e l u k s e s s a + m u i s t o k e s k u k s e n a + m u i s t o k i r j o i t u k s i a + m u i s t o k i r k k o + m u i s t o k o l i k k o n a + m u i s t o k o l i k o t + m u i s t o k s i + m u i s t o l a a t t a a + m u i s t o m e r k e i s t ä + m u i s t o m e r k i n + m u i s t o m e r k i t + m u i s t o m e r k k e j ä + m u i s t o m e r k k i + m u i s t o m e r k k i e n + m u i s t o n + m u i s t o o n + m u i s t o p a i k k o j a + m u i s t o p a l k i n t o + m u i s t o p ä i v i ä + m u i s t o p ä i v ä + m u i s t o p ä i v ä k s i + m u i s t o p ä i v ä n + m u i s t o p ä i v ä n ä + m u i s t o p ä i v ä s t ä + m u i s t o p ä i v ä ä + m u i s t o s a n a t + m u i s t o s e r e m o n i a s s a + m u i s t o t + m u i s t o t i l a i s u u d e n + m u i s t o t i l a i s u u t t a + m u i s t o t y ö p a l v e l u + m u i s t o v i i k k o a + m u i s t u t a m m e + m u i s t u t a n + m u i s t u t a n k i n + m u i s t u t e t a a n + m u i s t u t e t a a n k i n + m u i s t u t e t t a k o o n + m u i s t u t e t t a v a + m u i s t u t e t t i i n + m u i s t u t e t t u + m u i s t u t i t t e + m u i s t u t t a a + m u i s t u t t a a k s e e n + m u i s t u t t a a k s e n i + m u i s t u t t a e s s a a n + m u i s t u t t a e s s a m m e + m u i s t u t t a i s i n + m u i s t u t t a i s i n k i n + m u i s t u t t a k a a + m u i s t u t t a k a a m m e + m u i s t u t t a m a a n + m u i s t u t t a m a l l a + m u i s t u t t a m a s s a + m u i s t u t t a m i n e n + m u i s t u t t a n e e t + m u i s t u t t a n u t + m u i s t u t t a v a l l e + m u i s t u t t a v a t + m u i s t u t t a v i n a + m u i s t u t t i + m u i s t u t t i k i n + m u i s t u t t i v a t + m u i s t u t u k s e n a + m u i s t u t u k s i a + m u i s t u t u s t a + m u i t a + m u i t a k a a n + m u i t a k i n + m u k a a n t u l o k y n n y k s i ä + m u k a i l t a v a + m u k a i s e k s i + m u k a i s e n + m u k a i s e n a + m u k a i s e s t a + m u k a i s e t + m u k a i s i a + m u k a i s i i n + m u k a i s t a + m u k a i s t e n + m u k a n a a n + m u k a n a n i + m u k a n a o l o a + m u k a u d u t t a v a + m u k a u t e t a a n + m u k a u t e t t a v a + m u k a u t e t t u j a + m u k a u t e t t u j e n + m u k a u t t a a + m u k a u t t a a k s e e n + m u k a u t t a a k s e m m e + m u k a u t t a e s s a a n + m u k a u t t a m a a n + m u k a u t t a m a l l a + m u k a u t t a m a t t a + m u k a u t t a m i n e n + m u k a u t t a m i s a s t e + m u k a u t t a m i s a s t e e s t a + m u k a u t t a m i s e e n + m u k a u t t a m i s e h d o t u k s e n + m u k a u t t a m i s e k s i + m u k a u t t a m i s e l l a + m u k a u t t a m i s e l t a + m u k a u t t a m i s e n + m u k a u t t a m i s e s t a + m u k a u t t a m i s h a n k k e i s i i n + m u k a u t t a m i s j ä r j e s t e l m ä ä + m u k a u t t a m i s k e i n o j a + m u k a u t t a m i s k u s t a n n u k s i a + m u k a u t t a m i s k y k y + m u k a u t t a m i s m e k a n i s m e i h i n + m u k a u t t a m i s m e k a n i s m e j a + m u k a u t t a m i s m e k a n i s m i e n + m u k a u t t a m i s m e k a n i s m i n + m u k a u t t a m i s m e k a n i s m i t + m u k a u t t a m i s m e n e t e l m ä + m u k a u t t a m i s m e n e t t e l y i s t ä + m u k a u t t a m i s m e n e t t e l y ä + m u k a u t t a m i s o h j e l m a a + m u k a u t t a m i s o h j e l m a n + m u k a u t t a m i s o h j e l m a t + m u k a u t t a m i s p o n n i s t e l u j a + m u k a u t t a m i s p r o s e n t t e j a + m u k a u t t a m i s p r o s e s s i + m u k a u t t a m i s p r o s e s s i a + m u k a u t t a m i s p r o s e s s i n + m u k a u t t a m i s p y r k i m y k s e t + m u k a u t t a m i s r a h a s t o s t a + m u k a u t t a m i s s u u n n i t e l m a a + m u k a u t t a m i s t a + m u k a u t t a m i s t a r p e i d e n + m u k a u t t a m i s t a s o s t a + m u k a u t t a m i s t o i m i a + m u k a u t t a m i s t u e n + m u k a u t t a m i s t u k e a + m u k a u t t a m i s t u k i + m u k a u t t a m i s t y ö t ä + m u k a u t t a m i s v a r a t + m u k a u t u a + m u k a u t u a k s e e n + m u k a u t u a k s e m m e + m u k a u t u k s e t + m u k a u t u k s i a + m u k a u t u k s i s t a + m u k a u t u m a a n + m u k a u t u m i s e k s i + m u k a u t u m i s h a n k k e i t a + m u k a u t u m i s k e i n o + m u k a u t u m i s k y k y + m u k a u t u m i s k y k y n s ä + m u k a u t u m i s k y k y y n + m u k a u t u m i s m u u t t u j i a + m u k a u t u m i s m u u t t u j i n a + m u k a u t u m i s p a i n e e n + m u k a u t u m i s p o n n i s t e l u j a + m u k a u t u m i s p o n n i s t e l u j e m m e + m u k a u t u m i s p o n n i s t e l u j e n + m u k a u t u m i s p r o s e s s e i h i n + m u k a u t u m i s p r o s e s s i n + m u k a u t u m i s t a + m u k a u t u m i s t a r p e e s t a + m u k a u t u m i s t o i m i a + m u k a u t u s e h d o t u k s e t + m u k a u t u s e h d o t u k s i a + m u k a u t u s j ä r j e s t e l m ä ä + m u k a u t u s j ä r j e s t e l y + m u k a u t u s k e i n o + m u k a u t u s k e r t o i m e n + m u k a u t u s m e k a n i s m e j a + m u k a u t u s m e k a n i s m i n a + m u k a u t u s m e n e t e l m ä + m u k a u t u s m e n e t t e l y t + m u k a u t u s m e n e t t e l y y n + m u k a u t u s o h j e l m a n + m u k a u t u s o h j e l m i a + m u k a u t u s p o l i t i i k a s t a + m u k a u t u s p r o s e s s e j a + m u k a u t u s p r o s e s s i a + m u k a u t u s s u u n n i t e l m a t + m u k a u t u s t a s o + m u k a u t u s t e n + m u k a u t u s t o i m e n p i t e e t + m u k a u t u s t o i m i i n + m u k a u t u s t o i m i s t a + m u k a u t u s t u e t + m u k a u t u s t u k e a + m u k a u t u v a i s e m p i a + m u k a u t u v a m p i + m u k a u t u v a t + m u k a v a a + m u k a v a k s i + m u k a v a l t a + m u k a v a m m a k s i + m u k a v a m m a n + m u k a v a m m a t + m u k a v a m p a a + m u k a v a m p i + m u k a v a m p i a + m u k a v a t + m u k a v i a + m u k a v u u d e n h a l u n s a + m u k a v u u s a l u e e n + m u k a v u u s k e n t t i e n + m u k a v u u s l i p p u + m u k a v u u s l i p p u a l u k s i a + m u k a v u u s l i p p u a l u s t e n + m u k a v u u s l i p p u i l m i ö n + m u k a v u u s l i p p u j a + m u k a v u u s l i p p u j e n + m u k a v u u s l i p p u j ä r j e s t e l m ä + m u k a v u u s l i p p u j ä r j e s t e l m ä ä + m u k a v u u s l i p p u j ä r j e s t e l m ä ä n + m u k a v u u s l i p p u k ä y t ä n t ö j ä + m u k a v u u s l i p p u k ä y t ä n t ö ö n + m u k a v u u s l i p p u l a i v a + m u k a v u u s l i p p u l a i v a a + m u k a v u u s l i p p u l a i v a j ä r j e s t e l m ä + m u k a v u u s l i p p u l a i v a t + m u k a v u u s l i p p u l a i v o i h i n + m u k a v u u s l i p p u l a i v o i l l a + m u k a v u u s l i p p u l a i v o i l l e + m u k a v u u s l i p p u l a i v o i s t a + m u k a v u u s l i p p u l a i v o j a + m u k a v u u s l i p p u l a i v o j e n + m u k a v u u s l i p p u s a t a m a t + m u k a v u u s l i p p u s a t a m i a + m u k a v u u s l i p p u s a t a m i e n + m u k a v u u s l i p p u s a t a m i k s i + m u k a v u u s l i p p u t ö i t ä + m u k a v u u s l i p p u v a l t i o + m u k a v u u s l i p p u v a l t i o i h i n + m u k a v u u s l i p p u v a l t i o i s t a + m u k a v u u s l i p u i s t a + m u k a v u u s l i p u n + m u k a v u u s l i p u t + m u k a v u u s l i p u t u k s e n + m u k a v u u s l i p u t u s t a + m u k a v u u s s a t a m i a + m u k a v u u s s y i s t ä + m u k a v u u s v y ö h y k e + m u k a v u u s v y ö h y k k e e l l e + m u k u l a k i r v e l i + m u k u l a k i v i k a t u j e n + m u k u l a k i v i s i ä + m u k u l a l e i n i k k i + m u k u l a n ä t k e l m ä + m u k u l a r i s a k a s + m u l l a h i t + m u l l a n + m u l l i s t a v a m p i + m u l l i s t a v a t + m u l l i s t a v i a + m u l l i s t u k s e s t a + m u l p e r i p e r h o n e n + m u l t i e t n i n e n + m u l t i e t n i s e n + m u l t i e t n i s e s s ä + m u l t i l a t e r a a l i s e s t i + m u l t i m e d i a a n + m u l t i m e d i a h a n k k e i d e n + m u l t i m e d i a i n n o s t u k s e n + m u l t i m e d i a l a i t t e e t + m u l t i m e d i a m a a i l m a n + m u l t i m e d i a n + m u l t i m e d i a o h j e l m a + m u l t i m e d i a p a l v e l u i l l e + m u l t i m e d i a p a l v e l u j e n + m u l t i m e d i a p o l i t i i k k a + m u l t i m e d i a p ä ä t t e e t + m u l t i m e d i a s i s ä l l ö n + m u l t i m e d i a s i s ä l t ö ä + m u l t i m e d i a s o v e l l u k s i a + m u l t i m e d i a t e o l l i s u u d e n + m u l t i m e d i a t e r m i n a a l e j a + m u l t i m e d i a t i e t o k o n e t t a + m u l t i m e d i a t o i m e t + m u l t i m e d i a t u o t t e e t + m u l t i m e d i a t u o t t e i d e n + m u l t i m e d i a t y ö r y h m ä + m u l t i m e d i a t y ö r y h m ä n + m u l t i m e d i a v e r k o s t o n + m u l t i m e d i a v i e s t i + m u l t i m e d i a v i e s t i n t ä v e r k k o j a + m u l t i m e d i a v ä l i n e e t + m u l t i m e d i a v ä l i n e i s t ö ä + m u l t i m o d a a l i j ä r j e s t e l y i h i n + m u l t i m o d a a l i k e s k u k s i k s i + m u l t i m o d a a l i k u l j e t u k s i a + m u l t i m o d a a l i k u l j e t u s t e n + m u l t i m o d a a l i l i i k e n n e + m u l t i m o d a a l i l i i k e n n e v e r k k o j a + m u l t i m o d a a l i n e n + m u l t i m o d a a l i p a l v e l u j a + m u l t i m o d a a l i s e k s i + m u l t i m o d a a l i s e n + m u l t i m o d a a l i s e t + m u l t i m o d a a l i s i i n + m u l t i p p e l i s k l e r o o s i + m u l t i p p e l i s k l e r o o s i a + m u l t i p p e l i s k l e r o o s i i n + m u l t i p p e l i s k l e r o o s i s t a + m u m m o n k a a t a j a t + m u m m o n p a l s a m i + m u m m o n s y y l ä k a k t u s + m u n a h a m m a s + m u n a h a p e r o + m u n a h e l i s t i n + m u n a k o k k e l i + m u n a m a r k k i n o i d e n + m u n a n j o h d i n + m u n a n k o r i s t e l u + m u n a n t u o t a n n o n + m u n a n t u o t a n n o s s a + m u n a n t u o t t a j a + m u n a n t u o t t a j a a + m u n a n t u o t t a j a k u n t i e n + m u n a n t u o t t a j a t + m u n a n t u o t t a j i a + m u n a n t u o t t a j i e n + m u n a r a k k u l a + m u n a s a r j a s y ö p ä + m u n a s a r j a s y ö p ä ä + m u n a s a r j a s y ö v ä n + m u n a s o l u + m u n a s o l u i l l a + m u n a s o l u j a + m u n a s o l u j e n + m u n a s o l u n + m u n a s o l u s t a + m u n a s o l u u n + m u n a s o l u v a r a s t o + m u n a s t a + m u n a t e o l l i s u u t e e n + m u n a t u o t t e e t + m u n a t u o t t e i l l e + m u n a t u o t t e i n a + m u n a t u o t t e i s t a + m u n a t u o t t e i t a + m u n a v a l m i s t e i d e n + m u n a v a l m i s t e t u o t a n t o a + m u n a v o i + m u n d a k i e l e t + m u n i a + m u n i e n + m u n i e n t u o t a n n o n + m u n i m i s h ä k k i e n + m u n i t u s k a n a l o i t a + m u n i v i a + m u n i v i e n + m u n k e i s t a + m u n k k e j a + m u n k k i h e d e l m ä k y y h k y + m u n k k i h y l j e + m u n k k i k o l i b r i + m u n k k i k o r p p i k o t k a + m u n k k i k o t i n g a + m u n k k i k u h a n k e i t t ä j ä + m u n k k i k u r k i + m u n k k i l u o s t a r e i l l e + m u n k k i t a s k u + m u n u a i s a l l a s + m u n u a i s e n s i i r t o + m u n u a i s k i v i s t ä + m u n u a i s k o t e l o + m u n u a i s l a s k i m o + m u n u a i s p o r t t i + m u n u a i s p y r a m i d i + m u n u a i s p ä i v ä + m u n u a i s s a i r a u t t a + m u n u a i s s i i r r ä n n ä i s t ä + m u n u a i s s i i r t o a + m u n u a i s s i i r t o o n + m u n u a i s t a u t i + m u n u a i s v a l t i m o + m u o d i k a s t a + m u o d o i l l a + m u o d o i l l e + m u o d o i s s a + m u o d o i s s a a n + m u o d o i s t a + m u o d o l l i s e k s i + m u o d o l l i s e m p a a + m u o d o l l i s e m p a a n + m u o d o l l i s e m p i + m u o d o l l i s e s t a + m u o d o l l i s e t + m u o d o l l i s i a + m u o d o l l i s i i n + m u o d o l l i s i s t a + m u o d o l l i s t a + m u o d o l l i s u u k s i a + m u o d o l l i s u u k s i e n + m u o d o l l i s u u k s i s t a + m u o d o l l i s u u t e n a + m u o d o l t a a n + m u o d o n + m u o d o n m u u t o s + m u o d o n m u u t o s t a + m u o d o s s a a n + m u o d o s t a a + m u o d o s t a a k s e e n + m u o d o s t a a k s e m m e + m u o d o s t a e s s a a n + m u o d o s t a k a a + m u o d o s t a k a a m m e + m u o d o s t a m a + m u o d o s t a m a a n + m u o d o s t a m a s s a + m u o d o s t a m a t + m u o d o s t a m a t t a + m u o d o s t a m i s t a + m u o d o s t a n u t + m u o d o s t a v a a + m u o d o s t a v a a n + m u o d o s t a v a n + m u o d o s t a v a t + m u o d o s t a v i a + m u o d o s t a v i e n + m u o d o s t a v i l l e + m u o d o s t e l m a l u i s t e l u + m u o d o s t e t a a n + m u o d o s t e t t a e s s a + m u o d o s t e t t a v a + m u o d o s t e t t u + m u o d o s t i + m u o d o s t i m m e + m u o d o s t i v a t + m u o d o s t u a + m u o d o s t u i + m u o d o s t u m i s t a + m u o d o s t u n e e l l e + m u o d o s t u n u t + m u o d o s t u t t a v a + m u o d o s t u u + m u o d o s t u u k o + m u o d o s t u v a t + m u o d o t + m u o k a t a + m u o k a t e s s a m m e + m u o k a t t a e s s a + m u o k a t t a i s i i n + m u o k a t t u i n a + m u o k a t t u n a + m u o k k a a m i s m a h d o l l i s u u d e t + m u o k k a a v a t + m u o k k a s i + m u o t i a + m u o t i a s i a + m u o t i h u l l u j a + m u o t i h u u m e i d e n + m u o t i j u o m i l l e + m u o t i k u v a + m u o t i m a u n + m u o t i m e r k i n + m u o t i m e s s u i l l a + m u o t i n ä y t ö s + m u o t i r u o k a l a j i + m u o t i s a n a + m u o t i s u u n n i t t e l i j a + m u o t i t a l o + m u o t i t a l o i s t a + m u o t i t e k i j ä t + m u o t i t e o l l i s u u d e n + m u o t i t e o l l i s u u s + m u o t i t u o t e + m u o t i t u o t t e i d e n + m u o t i t u o t t e i l l e + m u o t i t u o t t e i t a + m u o t i t y ö l l i s y y t t ä + m u o t i v i i k k o + m u o t o i l e m a t t a + m u o t o i l e m i s e e n + m u o t o i l e m i s e s t a + m u o t o i l e n + m u o t o i l e v a t + m u o t o i l i s i + m u o t o i l i t t e + m u o t o i l l a + m u o t o i l l a a n + m u o t o i l l a k s e e n + m u o t o i l l a k s e m m e + m u o t o i l l e s s a + m u o t o i l l e s s a m m e + m u o t o i l l u t + m u o t o i l t a e s s a + m u o t o i l t a v a + m u o t o i l t u a + m u o t o i l u a l o j e n + m u o t o i l u e h d o t u k s e t + m u o t o i l u i n s t i t u u t t i + m u o t o i l u j a + m u o t o i l u j e n + m u o t o i l u n + m u o t o i l u s s a + m u o t o i l u t + m u o t o i l u u n + m u o t o j a + m u o t o j e n + m u o t o k e s k u s t e l u i s t a + m u o t o k i e l i + m u o t o k i i s t o i h i n + m u o t o k y s y m y s + m u o t o k y s y m y s t e n + m u o t o p u u t a r h a + m u o t o s e i k a t + m u o t o s e i k k a n a + m u o t o s e i k k o j a + m u o t o s e i k k o j e n + m u o t o s e i k o i s t a + m u o t o s y i s t ä + m u o t o s ä ä n n ö s t e n + m u o t o u t u m a s s a + m u o t o u t u m i s v a i h e e s s a + m u o t o u t u m i s v a i k e u k s i a + m u o t o v a a t i m u k s e t + m u o t o v a a t i m u k s i a + m u o t o v a a t i m u k s i s s a a n + m u o t o v a a t i m u s + m u o t o v i r h e + m u o t o v i r h e e t + m u o t o v i r h e i d e n + m u o t o v i r h e i s t ä + m u o t t i i n + m u o v a a m a a n + m u o v a a m i s t a + m u o v a i l u v a h a + m u o v a t a + m u o v i a + m u o v i a l a l l a + m u o v i e s i n e + m u o v i e s i n e e n + m u o v i j ä t e + m u o v i j ä t e t t ä + m u o v i j ä t t e i d e n + m u o v i k a p p a l e e l l a + m u o v i k a s s e j a + m u o v i k a s s i + m u o v i k a s s i a + m u o v i k a s s i e n + m u o v i k a t o k s i i n + m u o v i k e i t o n + m u o v i k e r r o s + m u o v i k o r t e i l l e + m u o v i k o r t e i s s a + m u o v i k o r t i l l a + m u o v i k o r t i s s a + m u o v i k o r t t i m a l l i a + m u o v i l a a t t o j e n + m u o v i l e l u j a + m u o v i m a t e r i a a l e j a + m u o v i m i e s + m u o v i n p a l a n + m u o v i n u k e i l l e + m u o v i o s i e n + m u o v i p a k k a u k s i a + m u o v i p u l l o a + m u o v i p u l l o i s s a + m u o v i p u l l o j a + m u o v i p u l l o j e n + m u o v i p u s s e i h i n + m u o v i p u s s e i s t a + m u o v i p u s s i l l a + m u o v i p u s s i l l i s e n + m u o v i p u s s i n + m u o v i p u s s i s t a + m u o v i p u s s i t + m u o v i r a h a n + m u o v i r u n k o i n e n + m u o v i r ä j ä h d e + m u o v i r ä j ä h t e i t ä + m u o v i s e k a j ä t e + m u o v i s t a + m u o v i t a v a r o i d e n + m u o v i t e o l l i s u u s + m u o v i t u o t t e i d e n + m u r a h t e l e m m e + m u r a t t i s y k l a a m i + m u r a t t i t ä d y k e + m u r e e n a t + m u r e h t i v a t + m u r e n e e + m u r e n e m a s s a + m u r e n e m a s t a + m u r e n e m i s t a + m u r e n n e t t u + m u r e n t a a + m u r e n t a n e e t + m u r e n t u a + m u r e n t u n e e t + m u r h a a j a j o u k k i o i d e n + m u r h a a j a j o u k k i o n + m u r h a a j a n s a + m u r h a a j a t + m u r h a a j i a + m u r h a a j i l l a + m u r h a a m a a n + m u r h a a m a s t a + m u r h a e p ä i l l y s t ä + m u r h a e p ä i l y j ä + m u r h a h a l l i n t o a + m u r h a h a n + m u r h a i s k u + m u r h a i s k u i l l e + m u r h a i s k u j e n + m u r h a i s k u t + m u r h a k a m p a n j o i d e n + m u r h a k i e r t e e n + m u r h a k ä s k y n + m u r h a l u v u t + m u r h a m y s t e e r i + m u r h a n + m u r h a n h i m o + m u r h a n h i m o i s i m m a n + m u r h a n h i m o n s a + m u r h a n s a + m u r h a o i k e u d e n k ä y n t i + m u r h a o i k e u d e n k ä y n t i ä + m u r h a p o l i t i i k a s t a + m u r h a p o m m i t u s t e n + m u r h a p o o l i + m u r h a s a r j a n + m u r h a s i v a t + m u r h a s t a + m u r h a s y y t ö s + m u r h a t + m u r h a t a + m u r h a t a a n k o + m u r h a t a p a u k s e t + m u r h a t a p a u s t a + m u r h a t e o l l a a n + m u r h a t t i i n + m u r h a t u i l l e + m u r h a t u i s t a + m u r h a t u n + m u r h a t u t k i m u k s e n + m u r h a t u t k i m u k s e s t a + m u r h a t u t k i m u k s i a + m u r h a t u t k i m u s + m u r h a t u t k i m u s t e n + m u r h a u h k a u k s e t + m u r h a u u t i s e n + m u r h a v ä l i n e e k s i + m u r h a v ä l i n e i t ä + m u r h a y r i t y k s e l l ä + m u r h a y r i t y k s e n + m u r h a y r i t y k s e s s ä + m u r h a y r i t y k s e s t ä + m u r h a y r i t y k s e t + m u r h a y r i t y k s i s s ä + m u r h a y r i t y k s i s t ä + m u r h a y r i t y s + m u r h a y ö + m u r h e e l l i s e m p a a + m u r h e e l l i s e m p i + m u r h e e l l i s e n a + m u r h e e l l i s e s t a + m u r h e e l l i s e t + m u r h e e l l i s i a + m u r h e e l l i s i m m a t + m u r h e e l l i s i n + m u r h e e l l i s i n t a + m u r h e e l l i s i s s a + m u r h e e l l i s t a + m u r h e e l l i s t e n + m u r h e e n + m u r h e n ä y t e l m i e n + m u r h e n ä y t e l m i i n + m u r h e n ä y t e l m i s t ä + m u r h e n ä y t e l m i ä + m u r h e n ä y t e l m ä + m u r h e n ä y t e l m ä n + m u r h e n ä y t e l m ä s s ä + m u r h e n ä y t e l m ä s t ä + m u r h e n ä y t e l m ä t + m u r h e n ä y t e l m ä ä + m u r h e n ä y t e l m ä ä n + m u r h i a + m u r h i e n + m u r h i i n + m u r h i l t a + m u r h i s t a + m u r i n a l a u l u + m u r i s i + m u r i s i j a r i h m a k a l a + m u r o k e k s e j ä + m u r r e j a t k u m o + m u r r e t t a v a + m u r r o s i k ä i s e t + m u r r o s v a i h e e s s a + m u r s k a a m a t t a + m u r s k a a m o t + m u r s k a a v a a + m u r s k a e n e m m i s t ö + m u r s k a e n e m m i s t ö l l ä + m u r s k a t t i i n + m u r s k a u t u i v a t + m u r s k a v o i t o n + m u r s k a v o i t t o + m u r s k a v o i t t o a + m u r s k a v o i t t o o n + m u r t a a + m u r t a a k s e m m e + m u r t a m a a n + m u r t a m i s e k s i + m u r t a u t u a + m u r t o h ä l y t t i m i ä + m u r t o h ä l y t y s + m u r t o l a a s t i + m u r t o m a a h i i h t o a + m u r t o m a a h i i h t o o n + m u r t o v a r k a u d e n + m u r t o v e s i + m u r t o v e s i a l t a a n a + m u r t o v e s i a l u e t t a + m u r t o v e s i m e r i + m u r t o v i i v a + m u r t u a + m u r t u i + m u r t u i s i + m u r t u m a o i r e y h t y m ä + m u r t u m i s e n + m u r t u m i s e s t a + m u r t u m i s m e k a n i i k k a + m u r t u n e e l l e + m u r u s i a + m u r u s i i n + m u s e o a j o n e u v o + m u s e o a j o n e u v o j a + m u s e o a j o n e u v o t + m u s e o a r k i s t o i h i n + m u s e o a u t o j e n + m u s e o a u t o t + m u s e o e s i n e + m u s e o e s i n e e n ä + m u s e o e s i n e i t ä + m u s e o k o k o e l m i a + m u s e o k o k o e l m i e n + m u s e o k u o r i a i n e n + m u s e o l a i v a t + m u s e o l a i v o j e n + m u s e o r a u t a t e i h i n + m u s e o r a u t a t i e + m u s e o r a u t a t i e t + m u s e o t a v a r a a + m u s e o v i r a s t o + m u s i i k i n + m u s i i k i n j u l k a i s i j a t + m u s i i k i n k u s t a n t a j a t + m u s i i k i n t e k i j ö i d e n + m u s i i k i n t e o r i a + m u s i i k k i a + m u s i i k k i a k a t e m i a + m u s i i k k i a l a + m u s i i k k i a l a a + m u s i i k k i a l a a n + m u s i i k k i a l a l l a + m u s i i k k i a l a n + m u s i i k k i b ä n d i n + m u s i i k k i f e s t i v a a l i + m u s i i k k i f e s t i v a a l i t + m u s i i k k i f i l o s o f i a + m u s i i k k i j u h l a t + m u s i i k k i k a p p a l e + m u s i i k k i k a s v a t u s t a + m u s i i k k i k i l p a i l u + m u s i i k k i k i r j a s t o + m u s i i k k i k o m e d i a d u o + m u s i i k k i k o u l u + m u s i i k k i k o u l u j e n + m u s i i k k i k u s t a n t a j a t + m u s i i k k i k u s t a n t a m o + m u s i i k k i m a a i l m a n + m u s i i k k i m a r k k i n o i d e n + m u s i i k k i m a r k k i n o i l l a + m u s i i k k i m a r k k i n o i t a + m u s i i k k i m a t e r i a a l i a + m u s i i k k i m i e s + m u s i i k k i p a l k i n t o + m u s i i k k i p a l v e l u j e n + m u s i i k k i p e l i + m u s i i k k i p i i r e i s s ä + m u s i i k k i s e n s u u r i + m u s i i k k i s i v u s t o i l l e + m u s i i k k i s o i n t u + m u s i i k k i s o i t i n + m u s i i k k i t a l l e n t e i s t a + m u s i i k k i t a l o + m u s i i k k i t a p a h t u m i s t a + m u s i i k k i t a r j o n t a a + m u s i i k k i t e k n o l o g i a + m u s i i k k i t e o k s i a + m u s i i k k i t e o k s i i n + m u s i i k k i t e o k s i s t a + m u s i i k k i t e o l l i s u u d e l l e + m u s i i k k i t e o l l i s u u d e n + m u s i i k k i t e o l l i s u u d e s s a + m u s i i k k i t e o l l i s u u s + m u s i i k k i t e o l l i s u u t t a + m u s i i k k i t e o s t e n + m u s i i k k i t e r a p i a + m u s i i k k i t i e d o n h a k u + m u s i i k k i u u t i s i a + m u s i i k k i v i d e o + m u s i i k k i v i d e o f e s t i v a a l i t + m u s i i k k i v i d e o i s t a + m u s i i k k i v i s a + m u s i i k k i v u o d e n + m u s i i k k i y h t i ö i l l e + m u s i i k k i y h t i ö s s ä + m u s i i k k i y h t i ö t + m u s i i k k i ä ä n i t t e i d e n + m u s i i n e i s t a + m u s i k a a l i a + m u s k e t t i s o d a t + m u s k e t t i s o t u r i e n + m u s k e t t i s o t u r i m m e + m u s k e t t i s o t u r i n + m u s k o t t i p u u + m u s l i m e j a + m u s l i m i a k t i v i s t i e n + m u s l i m i a l a m a i s t e n + m u s l i m i a l u e e t + m u s l i m i a v i o l i i t o i s t a + m u s l i m i e d u s t u s t a + m u s l i m i e h d o k k a i t a + m u s l i m i e k s t r e m i s t i e n + m u s l i m i e n + m u s l i m i e n e m m i s t ö + m u s l i m i e n e m m i s t ö i s e n + m u s l i m i e n e m m i s t ö i s i l l ä + m u s l i m i e n e m m i s t ö l l e + m u s l i m i e n e m m i s t ö ä + m u s l i m i f a n a a t i k o t + m u s l i m i f u n d a m e n t a l i s m i i n + m u s l i m i f u n d a m e n t a l i s m i n + m u s l i m i f u n d a m e n t a l i s m i s t a + m u s l i m i f u n d a m e n t a l i s t i e n + m u s l i m i f u n d a m e n t a l i s t i r y h m i e n + m u s l i m i h a k k e r e i t a + m u s l i m i h a l l i t u k s e n + m u s l i m i j o h t a j a + m u s l i m i j o h t a j i e n + m u s l i m i j o h t o i s e t + m u s l i m i j ä r j e s t ö j e n + m u s l i m i k a n s a l a i s e t + m u s l i m i k a n s a l a i s i a + m u s l i m i k a n s a l a i s i i n + m u s l i m i k a n s a l a i s i l l a + m u s l i m i k a n s a l a i s i l l e + m u s l i m i k a n s a l a i s t e n + m u s l i m i k a p i n a l l i s t e n + m u s l i m i k u l t t u u r i + m u s l i m i k u l t t u u r i a + m u s l i m i k u l t t u u r i l l e + m u s l i m i k u l t t u u r i n + m u s l i m i l a s t e n + m u s l i m i l e h d i s t ö s s ä + m u s l i m i l i i g a l t a + m u s l i m i l i i k e t t ä + m u s l i m i l i i t t o + m u s l i m i l o b b a u s t a + m u s l i m i m a a + m u s l i m i m a a h a n m u u t t a j a t + m u s l i m i m a a h a n m u u t t a j i e n + m u s l i m i m a a h a n m u u t t a j i i n + m u s l i m i m a a i l m a + m u s l i m i m a a i l m a a + m u s l i m i m a a i l m a a n + m u s l i m i m a a i l m a l l e + m u s l i m i m a a i l m a n + m u s l i m i m a a i l m a s s a + m u s l i m i m a a i l m a s s a k i n + m u s l i m i m a a i l m a s t a + m u s l i m i m a a n + m u s l i m i m a a s s a + m u s l i m i m a a t + m u s l i m i m a i d e n + m u s l i m i m a i h i n + m u s l i m i m a i l l e + m u s l i m i m a i s s a + m u s l i m i m a i s t a + m u s l i m i m i e h e n + m u s l i m i m i e s t e n + m u s l i m i m i e s t ä + m u s l i m i n a a p u r i e n s a + m u s l i m i n a i n e n + m u s l i m i n a i s e t + m u s l i m i n a i s i a + m u s l i m i n a i s i i n + m u s l i m i n a i s t e n + m u s l i m i n u o r e t + m u s l i m i n u o r i a + m u s l i m i n u o r t e n + m u s l i m i o m i s t a j a + m u s l i m i p a i m e n t o l a i s e t + m u s l i m i p a k o l a i s i l l e + m u s l i m i p a p p i + m u s l i m i p e r h e e t + m u s l i m i p e r i n t e e t + m u s l i m i p u o l u e + m u s l i m i p u o l u e e n + m u s l i m i r a d i k a a l i t + m u s l i m i r a d i k a l i s m i a + m u s l i m i r y h m i e n + m u s l i m i r y h m i ä + m u s l i m i s a a r n a a j i e n + m u s l i m i s i i r t o l a i s t e n + m u s l i m i s i i r t o t y ö l ä i s t ä + m u s l i m i t + m u s l i m i t a i s t e l i j a t + m u s l i m i t a s a v a l l o i k s i + m u s l i m i t e r r o r i s m i n + m u s l i m i t e r r o r i s t e j a + m u s l i m i t e r r o r i s t i e n + m u s l i m i t e r r o r i s t i n + m u s l i m i t e r r o r i s t i t + m u s l i m i t y t t ö j e n + m u s l i m i t y t ö i l l e + m u s l i m i u s k o a + m u s l i m i u s k o n n o n + m u s l i m i v a l t a i s e s s a + m u s l i m i v a l t i o + m u s l i m i v a l t i o i d e n + m u s l i m i v a l t i o i s s a + m u s l i m i v a l t i o i s t a + m u s l i m i v a l t i o n + m u s l i m i v a l t i o n a + m u s l i m i v a l t i o o n + m u s l i m i v a l t i o s t a + m u s l i m i v a l t i o t + m u s l i m i v e l j e s k u n n a l l e + m u s l i m i v e l j e s k u n n a l t a + m u s l i m i v e l j e s k u n n a n + m u s l i m i v e l j e s k u n n a s t a + m u s l i m i v e l j e s k u n t a + m u s l i m i v e l j e s k u n t a a + m u s l i m i v e l j e s k u n t a a n + m u s l i m i v e l j i e n + m u s l i m i v i r a n o m a i s i a + m u s l i m i v o i m a t + m u s l i m i v o i t t o i s t a + m u s l i m i v ä e s t ö + m u s l i m i v ä e s t ö n + m u s l i m i v ä e s t ö s t ä + m u s l i m i v ä e s t ö ö n + m u s l i m i v ä h e m m i s t ö + m u s l i m i v ä h e m m i s t ö i h i n + m u s l i m i v ä h e m m i s t ö i l l e e n + m u s l i m i v ä h e m m i s t ö i l l ä + m u s l i m i v ä h e m m i s t ö j e n + m u s l i m i v ä h e m m i s t ö j ä + m u s l i m i v ä h e m m i s t ö n + m u s l i m i v ä h e m m i s t ö n s ä + m u s l i m i v ä h e m m i s t ö s t ä + m u s l i m i v ä h e m m i s t ö ä + m u s l i m i v ä h e m m i s t ö ö n + m u s l i m i y h t e i s k u n n i s s a + m u s l i m i y h t e i s ö + m u s l i m i y h t e i s ö i h i n + m u s l i m i y h t e i s ö i l l e + m u s l i m i y h t e i s ö i s s ä + m u s l i m i y h t e i s ö i s t ä + m u s l i m i y h t e i s ö j e n + m u s l i m i y h t e i s ö j ä + m u s l i m i y h t e i s ö l l e + m u s l i m i y h t e i s ö n + m u s l i m i y h t e i s ö t + m u s l i m i y h t e i s ö ä + m u s l i m i y h t e i s ö ö n + m u s l i m i ä ä r i l i i k e h d i n t ä + m u s t a b o n i i t t i + m u s t a b u l b u l i + m u s t a d e l f i i n i + m u s t a e v ä t o k a + m u s t a h a i k a r a + m u s t a h a i v e n k o l i b r i + m u s t a h a p e r o + m u s t a h a p s u k o l i b r i + m u s t a h a r a k k a + m u s t a h a r a k k a l e p i n k ä i n e n + m u s t a h a u k i + m u s t a h a u k k a + m u s t a h e r u k o i d e n + m u s t a h e v o s a n t i l o o p p i + m u s t a h e v o s m u u r a h a i n e n + m u s t a h i l k k a k e r t t u l i + m u s t a h i l k k a k u t o j a + m u s t a h o h t o k o l i b r i + m u s t a h u i l u v a r i s + m u s t a h u o t r a k a l a + m u s t a h u o t r a k a l a n + m u s t a h u p p u b u l b u l i + m u s t a h u p p u k a r d i n a a l i + m u s t a h u p p u l e p i n k ä i n e n + m u s t a h u p p u r a s t a s + m u s t a h u u l i k o b r a + m u s t a h u u l i t a r h a k o t i l o + m u s t a h ä m ä h ä k k i a p i n a + m u s t a h ä n t ä p r e e r i a k o i r a + m u s t a i h o i s t e n + m u s t a i n k a k o l i b r i + m u s t a j a l a t + m u s t a j a l k a h i l l e r i + m u s t a j a l k a k i s s a + m u s t a j a l k a t y l l i + m u s t a j a l o h a u k k a + m u s t a j a l o p ä h k i n ä + m u s t a j o k i + m u s t a j o u t s e n + m u s t a j u u r i + m u s t a k a a p u + m u s t a k a a p u k u t o j a + m u s t a k a i j a t + m u s t a k a k a d u + m u s t a k a n a h a u k k a + m u s t a k a r h u + m u s t a k a u l a j o u t s e n + m u s t a k a u l a j ä n i s + m u s t a k a u l a k o t i n g a + m u s t a k a u l a k u r k i + m u s t a k a u l a r a s t a s + m u s t a k a u l a u i k k u + m u s t a k a u l u s k e r t t u + m u s t a k a u l u s n a k k e l i + m u s t a k a u n o k k i + m u s t a k e i j u + m u s t a k i i t ä j ä + m u s t a k i t a t u r s k a + m u s t a k i t a t u r s k a a + m u s t a k i t a t u r s k a l l e + m u s t a k i t a t u r s k a n + m u s t a k i u r u + m u s t a k o i r a n k ö y n n ö s + m u s t a k o i s o + m u s t a k o i v u + m u s t a k o n d o r i + m u s t a k o n n a n m a r j a + m u s t a k o r a l l i t + m u s t a k o r v a + m u s t a k o t k a + m u s t a k o t t a r a i n e n + m u s t a k r u u n u k e r t t u l i + m u s t a k u l m a h a r l e k i i n i + m u s t a k u l m a k e r t t u n e n + m u s t a k u l m a t i k k a + m u s t a k u r k k u k a r d i n a a l i + m u s t a k u r k k u k u t o j a + m u s t a k u r k k u m e s i k k o + m u s t a k u r k k u m o n a r k k i + m u s t a k u r k k u n a a k k a + m u s t a k u r k k u p e i p p o + m u s t a k u r k k u r a u t i a i n e n + m u s t a k u r k k u r ä ä t ä l i + m u s t a k u r k k u s i e p p o + m u s t a k u r k k u s i r k k u + m u s t a k u t o j a + m u s t a k u u s i + m u s t a l a i k k u + m u s t a l a i s i a + m u s t a l a i s i k s i + m u s t a l a i s l e i r i n + m u s t a l a i s m i e s + m u s t a l a i s m o r s i a n + m u s t a l a i s o n g e l m a n + m u s t a l a i s o n g e l m i a + m u s t a l a i s p e r h e i t ä + m u s t a l a i s r a u k k o j a + m u s t a l a i s r y h m i e n + m u s t a l a i s v a s t a i s u u d e s t a + m u s t a l a i s v a s t a i s u u s + m u s t a l a i s v ä e s t ö + m u s t a l a i s v ä e s t ö s t ä + m u s t a l a i s v ä h e m m i s t ö n + m u s t a l a k k i b u l b u l i + m u s t a l a k k i n a k k e l i + m u s t a l a k k i p ö l l ö n e n + m u s t a l a k k i t a n s s i j a + m u s t a l a k k i t y r a n n i + m u s t a l a t v u s k o t t a r a i n e n + m u s t a l e p i n k ä i n e n + m u s t a l e p p ä l i n t u + m u s t a l e s k i + m u s t a l e u k a k u t o j a + m u s t a l i n n u n h e r n e + m u s t a l i n t u + m u s t a l i p e ä + m u s t a l l a + m u s t a l u r i + m u s t a m a a l a a m i s e k s i + m u s t a m a a l a a m i s t a + m u s t a m a a l a t a + m u s t a m a a l a u k s e l l a + m u s t a m a a l a u s k a m p a n j a + m u s t a m a a l a u s k a m p a n j a a + m u s t a m a a l a u s k a m p a n j o i t a + m u s t a m a k i + m u s t a m a m b a + m u s t a m a n g a b i + m u s t a m a r j a k a n u k k a + m u s t a m a r j a o r a p i h l a j a + m u s t a m a r j a s t a j a + m u s t a m a r l i i n i + m u s t a m e l a h a r a k k a + m u s t a m e r e n + m u s t a m e r i + m u s t a m e r i m e t s o + m u s t a m e s i k k o + m u s t a m o l l i + m u s t a m o n a r k k i + m u s t a m u l p e r i + m u s t a m u u r a h a i n e n + m u s t a m ö r s k y + m u s t a n a a m a k a r d i n a a l i + m u s t a n a a m a k u t o j a + m u s t a n a a m a l e i j o n a t a m a r i i n i + m u s t a n a a m a m u u r a + m u s t a n a a m a s u k e l t a j a + m u s t a n a u h a m u r e e n a + m u s t a n e o n t e t r a + m u s t a n i s k a t i i r a + m u s t a n m e r e n + m u s t a n m e r e n l o k k i + m u s t a n m e r i + m u s t a n m u l l a n + m u s t a n o k k a k o t i n g a + m u s t a n o k k a t i i r a + m u s t a n p ö r s s i n m a r k k i n o i l l a + m u s t a n r u u n i k k o + m u s t a n v o i k k o + m u s t a n y s ä k o l i b r i + m u s t a o h j a s b u l b u l i + m u s t a o t s a k o l i b r i + m u s t a o t s a l e p i n k ä i n e n + m u s t a o t s a n a k k e l i + m u s t a o t s a t y l l i + m u s t a p e h m e ä k i l p i k o n n a + m u s t a p i i k k i m o n n i + m u s t a p i t k ä j a l k a + m u s t a p o p p e l i + m u s t a p o s k i d e l f i i n i + m u s t a p o s k i k e r t t u l i + m u s t a p o s k i k u t o j a + m u s t a p y r s t ö k u i r i + m u s t a p y r s t ö m e s i k k o + m u s t a p y r s t ö p r e u s s i n a h v e n + m u s t a p y r s t ö t r o g o n i + m u s t a p y ö r i ä i n e n + m u s t a p ä ä k a r d i n a a l i + m u s t a p ä ä k e r t t u + m u s t a p ä ä k o t i n g a + m u s t a p ä ä k u t o j a + m u s t a p ä ä l o k k i + m u s t a p ä ä s i r k k u + m u s t a p ä ä s t ä i n e n + m u s t a p ä ä t a s k u + m u s t a p ä ä t a u d i n + m u s t a p ä ä t y l l i + m u s t a p ö r s s i + m u s t a r a s t a s + m u s t a r i n t a + m u s t a r i n t a k o t i n g a + m u s t a r i n t a t i k k a + m u s t a r o t t a + m u s t a r o u s k u + m u s t a r u o s t e p y r s t ö + m u s t a s a k u + m u s t a s a r v i k u o n o a + m u s t a s e l j a + m u s t a s i i p i k a r d i n a a l i + m u s t a s i i p i l e p i n k ä i n e n + m u s t a s i i p i l e s k i + m u s t a s i i p i l u r i + m u s t a s i i p i m o n a r k k i + m u s t a s i l m ä g a l a k s i + m u s t a s i n a p p i + m u s t a s i r u e t a n a + m u s t a s t a + m u s t a s u k k a i s e s t i + m u s t a s u o h a u k k a + m u s t a s u o k i l p i k o n n a + m u s t a s u o m u v a l m u s k a + m u s t a t + m u s t a t a m a r i i n i + m u s t a t a m m i + m u s t a t a p a k u l o + m u s t a t a s k u + m u s t a t e t r a + m u s t a t i i r a + m u s t a t i i r a t + m u s t a t o k k o + m u s t a t o r v i s i e n i + m u s t a t u p e l o + m u s t a t u p p i n o k k a + m u s t a t u r p i a a l i + m u s t a t ä p l ä t o k k o + m u s t a t ö y h t ö m o n a r k k i + m u s t a v a h a k a s + m u s t a v a l a s + m u s t a v a l k o i n e n + m u s t a v a l k o i s e e n + m u s t a v a l k o i s e n + m u s t a v a l k o i s e n a + m u s t a v a l k o i s e s t a + m u s t a v a l k o i s e s t i + m u s t a v a l k o i s e t + m u s t a v a l k o i s i a + m u s t a v a l k o i s i l l a + m u s t a v a l k o i s i s s a + m u s t a v a l k o i s t a + m u s t a v a l k o m o n a r k k i + m u s t a v a l o l a m p p u + m u s t a v a t s a k o t t a r a i n e n + m u s t a v a t s a t i i r a + m u s t a v e i t s i k a l a + m u s t a v i h r e ä + m u s t a v i i r u k i p u a j a + m u s t a v i k l o + m u s t a v y ö t a s k u + m u s t a v ä s t ä r ä k k i + m u s t e e n + m u s t e k a l a + m u s t e k a l a k a n t a a + m u s t e k a l a s a a l i i t + m u s t e k a s e t t e j a + m u s t e k a s e t t i + m u s t e k y n i i n + m u s t e l o i t s u + m u s t e m a a i l m a + m u s t e s u i h k u k i r j o i t t i m e n + m u s t e s u i h k u t u l o s t i n + m u s t e s u i h k u t u l o s t u k s e l l e + m u s t e s u i h k u t u l o s t u k s e s t a + m u s t e s y d ä n + m u s t e t a t t i + m u s t e t t a + m u s t i a + m u s t i e n + m u s t i k k a k e h r ä ä j ä + m u s t i k k a l e h t i m i t t a r i + m u s t i k k a l e h t o m i t t a r i + m u s t i k k a p i i r a k k a + m u s t i l l e + m u t a a t i o t a a j u u s + m u t a h a r a k k a + m u t a j ä t e v e s i a l t a i t a + m u t a n t t i k i l p i k o n n a t + m u t a n t t i n i n j a k i l p i k o n n a t + m u t a p u r k a u s + m u t a s a r a + m u t a v a r i k s e t + m u t a v a r i s + m u t k a t t o m a s t a + m u t k i a + m u t k i e n + m u t k i k a s t a + m u t k i k k a a m m a l t a + m u t k i k k a a m m i k s i + m u t k i k k a a m p a a + m u t k i k k a a m p i + m u t k i k k a a m p i a + m u t k i k k a a m p i e n + m u t k i k k a a s e e n + m u t k i k k a a s t a + m u t k i k k a i d e n + m u t k i k k a i m m a s s a + m u t k i k k a i m m i l l a a n + m u t k i k k a i m m i s t a + m u t k i k k a i s i i n + m u t k i s t a a + m u t k i s t a v i a + m u t k i s t i + m u t k i s t u a + m u t k i s t u u + m u t k i t t a + m u t t i a + m u u a l l a k a a n + m u u a l l a k i n + m u u a l l e k i n + m u u h u n + m u u h u n k a a n + m u u k a l a i s l e g i o o n a + m u u k a l a i s s y r j i n t ä ä + m u u k a l a i s v i h a + m u u k a l a i s v i h a a + m u u k a l a i s v i h a a n + m u u k a l a i s v i h a a n s a + m u u k a l a i s v i h a k s i + m u u k a l a i s v i h a m i e l i s e e n + m u u k a l a i s v i h a m i e l i s i l l ä + m u u k a l a i s v i h a m i e l i s i ä + m u u k a l a i s v i h a m i e l i s t e n + m u u k a l a i s v i h a m i e l i s t ä + m u u k a l a i s v i h a n + m u u k a l a i s v i h a s t a + m u u k i n + m u u k s i + m u u l i p e u r a + m u u l l a + m u u l l a k i n + m u u l l e + m u u l l o i n k a a n + m u u l l o i n k i n + m u u l t a + m u u l t a k a a n + m u u m i l a a k s o + m u u m i m a a i l m a + m u u m i m u k i + m u u m i o m u o t o k u v a t + m u u m i p e i k k o + m u u n a + m u u n a k i n + m u u n k a a n + m u u n k a l t a i s e t + m u u n k i e l i s e t + m u u n k i e l i s i s s ä + m u u n k i e l i s i s t ä + m u u n k i e l i s i ä + m u u n k i n + m u u n l a i n e n + m u u n l a i s e e n + m u u n l a i s e l l e + m u u n l a i s e n + m u u n l a i s e s s a + m u u n l a i s e t + m u u n l a i s i a + m u u n l a i s i i n + m u u n l a i s i l l a + m u u n l a i s i l l e + m u u n l a i s i s s a + m u u n l a i s i s t a + m u u n l a i s t a + m u u n l a i s t e n + m u u n m a a l a i s e s t a + m u u n m a a l a i s e t + m u u n m a a l a i s i a + m u u n n e l l u t + m u u n n e l m i a + m u u n n e l t u a + m u u n n e l t u j a + m u u n n e l t u j e n + m u u n n e t t u j a + m u u n n e t t u j e n + m u u n n e t u s s a + m u u n n o s s ä v e l l a j i + m u u n t a a + m u u n t a a k s e e n + m u u n t a e s s a a n + m u u n t a j a ö l j y ä + m u u n t a m i s k u s t a n n u k s i i n + m u u n t a m i s k u s t a n n u s t e n + m u u n t a m i s k ä y t ä n t ö ä + m u u n t a m i s t o i m e t + m u u n t a m i s t o i m i a + m u u n t e l u s t a + m u u n t o g e e n i s e n + m u u n t o g e e n i s e t + m u u n t o g e e n i s i i n + m u u n t o g e e n i s i k s i + m u u n t o g e e n i s i l l e + m u u n t o g e e n i s t e n + m u u n t o g e e n i s t ä + m u u n t o h u u m e + m u u n t o k u l u i s t a + m u u n t o k u l u j a + m u u n t o k u r s s e i l l a + m u u n t o k u r s s i e n + m u u n t o k u r s s i j ä r j e s t e l m ä + m u u n t o k u r s s i k s i + m u u n t o k u r s s i n + m u u n t o k u r s s i t + m u u n t o k u s t a n n u k s e t + m u u n t u v i a + m u u r a h a i s h a p p o + m u u r a h a i s k e k o + m u u r a h a i s m i e s + m u u r a h a i s p e i p p o + m u u r a h a i s p e r h o n e n + m u u r a h a i s p e s ä ä + m u u r a h a i s r a s t a a t + m u u r a h a i s r a s t a s + m u u r a h a i s s a p e l i k o l i b r i + m u u r a h a i s s i n i s i i p i + m u u r a h a i s t a n g a r a + m u u r a i n h o p e a t ä p l ä + m u u r a r e i l t a + m u u r e j a + m u u r i a + m u u r i e n + m u u r i g e k k o + m u u r i i n + m u u r i k e l l o + m u u r i k r u u n u + m u u r i n + m u u r i n m u r t a j a n a + m u u r i n m u r t a j i n a + m u u r i n r a k e n n u s p o l i t i i k a n + m u u r i n s ä r k i j ä + m u u r i n s ä r k i j ä n ä + m u u r i s t a + m u u r i t + m u u s s a + m u u s t a + m u u s t a h a n + m u u s t a k i n + m u u t a k a a n + m u u t a k i n + m u u t a m a a + m u u t a m a a n + m u u t a m a k s i + m u u t a m a l l a + m u u t a m a l t a + m u u t a m a n + m u u t a m a n a + m u u t a m a s s a + m u u t a m a s t a + m u u t a m a t + m u u t a m i a + m u u t a m i e n + m u u t a m i i n + m u u t a m i k s i + m u u t a m i l l a + m u u t a m i l l e + m u u t a m i n + m u u t a m i s s a + m u u t a m i s t a + m u u t a m m e + m u u t e n h a n + m u u t e n k a a n + m u u t e n k i n + m u u t e t a + m u u t e t a a n + m u u t e t t a e s s a + m u u t e t t a i s i i n + m u u t e t t a v a + m u u t e t t a v a a + m u u t e t t a v i a + m u u t e t t i i n + m u u t e t t u a + m u u t e t t u i n a + m u u t e t t u j e n + m u u t e t t u k i n + m u u t e t t u n a + m u u t e t u n + m u u t e t u s t a + m u u t i m m e + m u u t k a a n + m u u t k i n + m u u t o i n h a n + m u u t o i n k a a n + m u u t o i n k i n + m u u t o k s e e n + m u u t o k s e l l a + m u u t o k s e n + m u u t o k s e n h a k u + m u u t o k s e n h a k u a + m u u t o k s e n h a k u a i k a + m u u t o k s e n h a k u e l i m e m m e + m u u t o k s e n h a k u e l i n t e n + m u u t o k s e n h a k u e l i n t ä + m u u t o k s e n h a k u j ä r j e s t e l m i ä + m u u t o k s e n h a k u j ä r j e s t e l m ä n + m u u t o k s e n h a k u k e i n o j a + m u u t o k s e n h a k u k e i n o j e n + m u u t o k s e n h a k u k e i n o t + m u u t o k s e n h a k u k o m i t e a n + m u u t o k s e n h a k u k o m i t e a s s a + m u u t o k s e n h a k u k u v i o i t a + m u u t o k s e n h a k u k y s y m y s t ä + m u u t o k s e n h a k u k ä s i t t e l y + m u u t o k s e n h a k u m a h d o l l i s u u k s i s t a + m u u t o k s e n h a k u m a h d o l l i s u u s + m u u t o k s e n h a k u m a h d o l l i s u u t t a + m u u t o k s e n h a k u m e k a n i s m e j a + m u u t o k s e n h a k u m e k a n i s m i n + m u u t o k s e n h a k u m e n e t t e l y + m u u t o k s e n h a k u m e n e t t e l y j e n + m u u t o k s e n h a k u m e n e t t e l y n + m u u t o k s e n h a k u m e n e t t e l y s s ä + m u u t o k s e n h a k u m e n e t t e l y ä + m u u t o k s e n h a k u o i k e u d e n + m u u t o k s e n h a k u o i k e u d e n k ä y n n i n + m u u t o k s e n h a k u o i k e u d e s t a + m u u t o k s e n h a k u o i k e u s + m u u t o k s e n h a k u o i k e u t e e n + m u u t o k s e n h a k u o i k e u t t a + m u u t o k s e n h a k u o n g e l m i i n + m u u t o k s e n h a k u p r o s e s s i + m u u t o k s e n h a k u p r o s e s s i a + m u u t o k s e n h a k u t o i m i l l a + m u u t o k s e n h a k u t u o m i o i s t u i m e n + m u u t o k s e n h a k u t u o m i o i s t u i m e n a + m u u t o k s e n h a k u t u o m i o i s t u i n + m u u t o k s e n h a k u t u o m i o i s t u i n t a + m u u t o k s e n h a k u u n + m u u t o k s e n h a k u v a i h e e s s a + m u u t o k s e n h a l l i n n a n + m u u t o k s e n h a u n + m u u t o k s e n h a u s t a + m u u t o k s e n s a + m u u t o k s e n s e u r a n t a k e s k u k s e e n + m u u t o k s e n s e u r a n t a k e s k u k s e n + m u u t o k s e n t e k i j ö i l l ä + m u u t o k s e n t e k i j ö i t ä + m u u t o k s e s s a + m u u t o k s e s t a + m u u t o k s e t + m u u t o k s i a + m u u t o k s i e n + m u u t o k s i i n + m u u t o k s i l l a + m u u t o k s i l l e + m u u t o k s i n e e n + m u u t o k s i s s a + m u u t o k s i s t a + m u u t o k s i t t a + m u u t o s a i k o i n a + m u u t o s a l t t i i s s a + m u u t o s a s e t u k s e k s i + m u u t o s a s e t u k s e n + m u u t o s a s e t u k s e s t a + m u u t o s a s e t u s + m u u t o s a s e t u s t a + m u u t o s d i r e k t i i v i k s i + m u u t o s d i r e k t i i v i n + m u u t o s d i r e k t i i v i s s ä + m u u t o s d i r e k t i i v i ä + m u u t o s e h d o t u k s e e n + m u u t o s e h d o t u k s e l l a + m u u t o s e h d o t u k s e m m e + m u u t o s e h d o t u k s e n + m u u t o s e h d o t u k s e n a + m u u t o s e h d o t u k s e n i + m u u t o s e h d o t u k s e s s a + m u u t o s e h d o t u k s e s s a n i + m u u t o s e h d o t u k s e s t a + m u u t o s e h d o t u k s e t + m u u t o s e h d o t u k s i a + m u u t o s e h d o t u k s i i n + m u u t o s e h d o t u k s i k s i + m u u t o s e h d o t u k s i l l a + m u u t o s e h d o t u k s i l l e + m u u t o s e h d o t u k s i n + m u u t o s e h d o t u k s i n e e n + m u u t o s e h d o t u k s i s s a + m u u t o s e h d o t u k s i s t a + m u u t o s e h d o t u s + m u u t o s e h d o t u s t a + m u u t o s e h d o t u s t e n + m u u t o s e s i t y k s e n + m u u t o s e s i t y k s e s t ä + m u u t o s e s i t y k s e t + m u u t o s e s i t y k s i i n + m u u t o s e s i t y k s i l l ä + m u u t o s e s i t y k s i l l ä ä n + m u u t o s e s i t y k s i ä + m u u t o s e s i t y k s i ä m m e + m u u t o s e s i t y s + m u u t o s e s i t y s p a k e t t i + m u u t o s e s i t y s t e n + m u u t o s e s i t y s t ä + m u u t o s h a a s t e e s t a + m u u t o s h a h m o t e l m a + m u u t o s h a k e m u s t a + m u u t o s h a l u + m u u t o s h a l u a + m u u t o s h a l u k k u u s + m u u t o s h a l u k k u u t t a a n + m u u t o s h a l u n + m u u t o s h a l u u n + m u u t o s j o h t a j a a + m u u t o s j o h t a j i i n + m u u t o s j o u k o t + m u u t o s k a r u s e l l i i n + m u u t o s k a t a l y s a a t t o r i + m u u t o s k a u d e n + m u u t o s k e h i t y k s e n + m u u t o s k i r j e e s s ä ä n + m u u t o s k o n f e r e n s s i + m u u t o s k u m p p a n u u k s i e n + m u u t o s l a u s e k e + m u u t o s l i i k e h d i n t ä ä + m u u t o s l u e t t e l o a + m u u t o s m a l l i s s a + m u u t o s m e n e t t e l y + m u u t o s m e n e t t e l y i s s ä + m u u t o s m e n e t t e l y j e n + m u u t o s m e n e t t e l y n + m u u t o s m i e l i n e n + m u u t o s n ä l k ä + m u u t o s o h j e l m a a + m u u t o s o h j e l m a s t a + m u u t o s o h j e l m i a + m u u t o s o p e r a a t i o + m u u t o s p a i n e i s i i n + m u u t o s p a i n e i s t a + m u u t o s p a k e t t i + m u u t o s p e l k o + m u u t o s p e r u s t e i t a + m u u t o s p o l i t i i k k a a + m u u t o s p o n n i s t e l u i s t a a n + m u u t o s p o t e n t i a a l i a + m u u t o s p r o s e s s e i h i n + m u u t o s p r o s e s s e i s s a + m u u t o s p r o s e s s e j a a n + m u u t o s p r o s e s s i + m u u t o s p r o s e s s i a + m u u t o s p r o s e s s i e n + m u u t o s p r o s e s s i i n + m u u t o s p r o s e s s i k s i + m u u t o s p r o s e s s i l l e + m u u t o s p r o s e s s i n + m u u t o s p r o s e s s i s s a + m u u t o s p r o s e s s i s t a + m u u t o s p r o s e s s i t + m u u t o s p y y n t ö + m u u t o s p y y n t ö j ä + m u u t o s p y y n t ö ö n + m u u t o s p ä ä t ö k s i l t ä + m u u t o s p ö y t ä k i r j a n + m u u t o s r i n t a m a + m u u t o s s i v u a + m u u t o s s o p i m u k s e n a + m u u t o s s o p i m u k s e n n e + m u u t o s s o p i m u k s e s s a + m u u t o s s o p i m u s + m u u t o s s t r a t e g i a a n + m u u t o s s u u n n i t e l m a + m u u t o s s u u n n i t e l m a s t a + m u u t o s s u u n n i t e l m i s s a + m u u t o s s u u n t i e n + m u u t o s s ä ä d ö k s i s t ä + m u u t o s s ä ä d ö s t ä + m u u t o s t a + m u u t o s t a h t i + m u u t o s t a h t i a + m u u t o s t a r p e e n + m u u t o s t a r p e e s e e n + m u u t o s t a r p e e s t a + m u u t o s t a r p e i s t a + m u u t o s t a r p e i t a + m u u t o s t a r v e t t a + m u u t o s t a v o i t t e i s t a + m u u t o s t e k i j ä + m u u t o s t e k i j ö i t ä + m u u t o s t e k s t i + m u u t o s t e n + m u u t o s t e n h a k u m e n e t t e l y j e n + m u u t o s t i l a a + m u u t o s t i l a n t e i s s a + m u u t o s t i l a s s a + m u u t o s t o i m i a + m u u t o s t o i v e i t a + m u u t o s t o i v e i t a m m e + m u u t o s t o i v o m u k s i a + m u u t o s t ö i t ä + m u u t o s v a a t i m u k s e e n + m u u t o s v a a t i m u k s i a + m u u t o s v a a t i m u k s i i n + m u u t o s v a a t i m u k s i s t a a n + m u u t o s v a a t i m u s t e n + m u u t o s v a i h e e n + m u u t o s v a i h e e s s a + m u u t o s v a i h t o e h d o i s t a + m u u t o s v a i k u t u k s i i n + m u u t o s v a l m i u t t a + m u u t o s v a s t a i s i a + m u u t o s v a s t a r i n n a n + m u u t o s v a s t a r i n t a + m u u t o s v a s t a r i n t a a n + m u u t o s v a u h d i n + m u u t o s v a u h d i s t a + m u u t o s v a u h t i a + m u u t o s v o i m a + m u u t o s v o i m a a + m u u t o s v o i m a m m e + m u u t o s v o i m a n + m u u t o s v o i m a n a + m u u t o s v o i m a t + m u u t o s v o i m i e n + m u u t o s y r i t y k s e s t ä + m u u t t a a + m u u t t a a k o + m u u t t a a k s e e n + m u u t t a a k s e m m e + m u u t t a e s s a + m u u t t a e s s a a n + m u u t t a e s s a m m e + m u u t t a i s i + m u u t t a i s i n k i n + m u u t t a i s i t t e k o + m u u t t a j a t u l v a + m u u t t a j a v i r r a t + m u u t t a j a v i r t o j a + m u u t t a j a v i r t o j e n + m u u t t a k a a m m e + m u u t t a k a a p a + m u u t t a k o o n + m u u t t a m a a n + m u u t t a m a l l a + m u u t t a m a s s a + m u u t t a m a t t a + m u u t t a m a t t o m a n a + m u u t t a m i s d i r e k t i i v i + m u u t t a m i s e e n + m u u t t a m i s e h d o t u k s e n + m u u t t a m i s e k s i + m u u t t a m i s e s t a + m u u t t a m i s m e n e t t e l y + m u u t t a m i s m e n e t t e l y s s ä + m u u t t a m i s s o p i m u s + m u u t t a m i s t a + m u u t t a n e e t + m u u t t a v a n + m u u t t a v a n s a + m u u t t a v a t + m u u t t a v i s t a + m u u t t o a a l l o i s s a + m u u t t o a a l l o l t a + m u u t t o a a l l o s t a + m u u t t o a a l t o + m u u t t o a a l t o i h i n + m u u t t o a a l t o j a + m u u t t o a a l t o j e n + m u u t t o a i k a a n + m u u t t o a u t o i l l a + m u u t t o a u t o i s s a h a n + m u u t t o a u t o j a + m u u t t o h a u k a n + m u u t t o h a u k k a + m u u t t o h a u k k o j a + m u u t t o i l m i ö i h i n + m u u t t o i l m i ö t + m u u t t o k o h t e i t a + m u u t t o k u s t a n n u k s e t + m u u t t o k y y h k y + m u u t t o l a a t i k o i t a + m u u t t o l i i k e + m u u t t o l i i k e a l a l l a + m u u t t o l i i k e a s i o i s s a + m u u t t o l i i k e i l m i ö + m u u t t o l i i k e i l m i ö t ä + m u u t t o l i i k e j ä r j e s t e l m ä ä + m u u t t o l i i k e k e s k u s t e l u s s a + m u u t t o l i i k e k y s y m y k s e e n + m u u t t o l i i k e k y s y m y k s e n + m u u t t o l i i k e k y s y m y s + m u u t t o l i i k e k y s y m y s t ä + m u u t t o l i i k e o n g e l m i i n + m u u t t o l i i k e p o l i t i i k a n + m u u t t o l i i k e p o l i t i i k a s s a + m u u t t o l i i k e p o l i t i i k a s t a + m u u t t o l i i k e p o l i t i i k k a + m u u t t o l i i k e p o l i t i i k k a a + m u u t t o l i i k e p o l i t i i k k a k e s k u s t e l u n + m u u t t o l i i k e p r o s e s s i a + m u u t t o l i i k e s t r a t e g i a a + m u u t t o l i i k e t t ä + m u u t t o l i i k e v e r k o s t o + m u u t t o l i i k e v e r k o s t o n + m u u t t o l i i k k e e k s i + m u u t t o l i i k k e e n + m u u t t o l i i k k e e s e e n + m u u t t o l i i k k e e s t ä + m u u t t o l i i k k e e t + m u u t t o l i i k k e i d e n + m u u t t o l i i k k e i s i i n + m u u t t o l i i k k e i s t ä + m u u t t o l i i k k e i t ä + m u u t t o l i n n u i l l e + m u u t t o l i n n u i s t a + m u u t t o l i n n u t + m u u t t o l i n t u + m u u t t o l i n t u d i r e k t i i v i e n + m u u t t o l i n t u d i r e k t i i v i n + m u u t t o l i n t u d i r e k t i i v i ä + m u u t t o l i n t u i h i n + m u u t t o l i n t u j a + m u u t t o l i n t u j e n + m u u t t o l i n t u l a j e j a + m u u t t o l i n t u l a j i e n + m u u t t o m a t k a l l e + m u u t t o m i e h e t + m u u t t o p a i n e + m u u t t o p a i n e e n + m u u t t o p a i n e e s e e n + m u u t t o p a i n e e t + m u u t t o p a i n e i d e n + m u u t t o p a i n e i s i i n + m u u t t o p a i n e i s t a + m u u t t o p a i n e i t a + m u u t t o p a i n e m i t t a r i a + m u u t t o p a i n e t t a + m u u t t o p a l v e l u t + m u u t t o p o l i t i i k a n + m u u t t o r e i t t e j ä + m u u t t o r e i t t i e n + m u u t t o r e i t t i n s ä + m u u t t o r e i t t i ä + m u u t t o s i r k u k s e e n + m u u t t o s i r k u s + m u u t t o s u u n t a u k s i a + m u u t t o t a p p i o l u v u t + m u u t t o v i r r a n + m u u t t o v i r r a s t a + m u u t t o v i r r a t + m u u t t o v i r r o i k s i + m u u t t o v i r r o i l l e + m u u t t o v i r r o i s s a + m u u t t o v i r r o i s t a + m u u t t o v i r t a + m u u t t o v i r t a a + m u u t t o v i r t a a n + m u u t t o v i r t a u s t a + m u u t t o v i r t o i h i n + m u u t t o v i r t o j a + m u u t t o v i r t o j a a n + m u u t t o v i r t o j e n + m u u t t u a + m u u t t u i + m u u t t u i s i + m u u t t u j a a n + m u u t t u j a k s i + m u u t t u j a n a + m u u t t u j i a + m u u t t u m a a n + m u u t t u m a s s a + m u u t t u m a t t a + m u u t t u m a t t o m a n a + m u u t t u m a t t o m a s t a + m u u t t u m a t t o m i n a + m u u t t u m a t t o m u u d e n + m u u t t u m i s e e n + m u u t t u m i s t a + m u u t t u n e e + m u u t t u n e e n + m u u t t u n e e t + m u u t t u u + m u u t t u v a a n + m u u t t u v a n + m u u t t u v a s s a + m u u t t u v a t + m u u t t u v i s s a + m u u t t u v i s t a + m u u t t u v u u s p e r i a a t e + m u u t u m m e + m u u t u t a + m u u t u t t a v a + m u u t u t t u a + m y a n m a r i l a i s e s s a + m y e l i i n i t u p p e a + m y i v ä t + m y k e r ö n e i l i k k a + m y k e r ö s a v i k k a + m y k k ä e l o k u v a + m y l l e r r y k s e n + m y l l e r r y k s e s s ä + m y l l e r r y k s e s t ä + m y l l y i h i n + m y l l y k o s k i + m y l l y y n + m y l l ä r i n p o i k a + m y r k k y a i n e v u o t o j e n + m y r k k y a l u s + m y r k k y h e r k k u s i e n i + m y r k k y j e n + m y r k k y j o e n + m y r k k y j ä + m y r k k y j ä t e s k a n d a a l i i n + m y r k k y j ä t e t t ä + m y r k k y j ä t t e i s t ä ä n + m y r k k y j ä ä m i ä + m y r k k y k a a s u a + m y r k k y k a a s u j a + m y r k k y k a a s u n + m y r k k y k a a s u t + m y r k k y k e i s o + m y r k k y k e m i k a a l i + m y r k k y k e s t ä v i k s i + m y r k k y k i r v e l i + m y r k k y l e v i e n + m y r k k y l i e t e + m y r k k y l i e t e o n n e t t o m u u d e n + m y r k k y l i e t e v u o d o n + m y r k k y l i e t e v u o t o + m y r k k y m a a l i t u o t t e e t + m y r k k y m a d o n l a k k i + m y r k k y m a l i k k a + m y r k k y m a l j a + m y r k k y m u r a t t i + m y r k k y n ä + m y r k k y o n g e l m i a + m y r k k y p a d o n + m y r k k y p i l l e r i + m y r k k y p i l v e ä + m y r k k y p i l v i + m y r k k y p i t o i s u u k s i l l e + m y r k k y p ä ä s t ö i h i n + m y r k k y p ä ä s t ö i s t ä + m y r k k y p ä ä s t ö j e n + m y r k k y r a i h e i n ä + m y r k k y r i s a k a s + m y r k k y r u i s k e + m y r k k y s i n i l e v ä ä + m y r k k y t y n n y r i ä + m y r k k y u k o n s i e n i + m y r k k y v a i k u t u k s i s t a + m y r k k y v a r a s t o i h i n + m y r k k y v u o d o n + m y r k k y v u o t o + m y r k k y ä + m y r k y i l l e + m y r k y i l t ä + m y r k y k s i + m y r k y l l i s e m m i k s i + m y r k y l l i s e m p i ä + m y r k y l l i s e t + m y r k y l l i s i l l ä + m y r k y l l i s i l t ä + m y r k y l l i s i m m i s t ä + m y r k y l l i s i m p i i n + m y r k y l l i s i m p ä n ä + m y r k y l l i s i n t ä + m y r k y l l i s i s t ä + m y r k y l l i s i ä + m y r k y l l i s t ä + m y r k y l l i s y y d e s t ä + m y r k y l l i s y y s k o k e i l l a + m y r k y l l i s y y s k o k e i t a + m y r k y l l i s y y s t e s t e j ä + m y r k y l l i s y y s t u t k i m u k s e t + m y r k y l l i s y y s t u t k i m u k s i i n + m y r k y t e t t y + m y r k y t t ä n e e t + m y r k y t t ä ä + m y r k y t t ö m i e n + m y r k y t t ö m i ä + m y r k y t y s k e s k u s t e n s a + m y r k y t y s r i s k i n + m y r k y t y s s k a n d a a l i i n + m y r k y t y s t a p a u k s i s t a + m y r k y t y s t a p a u s t a + m y r k y t ö n t ä + m y r s k y b o n g a u s + m y r s k y e n n u s t e i s t a + m y r s k y j e n + m y r s k y j ä + m y r s k y k a t a s t r o f i + m y r s k y k e i j u + m y r s k y l a s i + m y r s k y l i n t u + m y r s k y l y h t y + m y r s k y n + m y r s k y n m e t s ä s t ä j ä t + m y r s k y o l o j a + m y r s k y p i l v e t + m y r s k y s t ä + m y r s k y s u k e l t a j a + m y r s k y s u k e l t a j a t + m y r s k y t + m y r s k y t u h o i h i n + m y r s k y t u h o j a + m y r s k y t u h o t + m y r s k y v a h i n k o j a + m y r s k y v a r o i t u s + m y r s k y v a u r i o i d e n + m y r s k y v u o k s i + m y r s k y y n + m y r s k y ä ä + m y s k i h i r v e t + m y s k i h i r v i + m y s k i k e n g u r u + m y s k i k u r j e n n o k k a + m y s k i m a l v a + m y s k i s o r s a + m y s l i p a t u k a n k a a n + m y s s y p i n g v i i n i + m y s s y r a s t a s + m y s t e e r i n ä y t e l m ä + m y s t e e r i u s k o n t o + m y s t i f i o i d a + m y s t i s e l t ä + m y y d e s s ä + m y y d e s s ä ä n + m y y d y i s t ä + m y y d y n + m y y d ä + m y y d ä k s e e n + m y y d ä ä n + m y y k ö + m y y m i s e s t ä + m y y m ä l l ä + m y y m ä l ä a p u l a i s i k s i + m y y m ä l ä k e t j u t + m y y m ä l ä s u u n n i t t e l u + m y y m ä t t ä + m y y m ä ä n + m y y n n i l l ä ä n + m y y n n i n + m y y n n i n e d i s t ä m i n e n + m y y n n i n e d i s t ä m i s a l o i t t e i t a m m e + m y y n n i n e d i s t ä m i s d i r e k t i i v i ä + m y y n n i n e d i s t ä m i s e e n + m y y n n i n e d i s t ä m i s e l l e + m y y n n i n e d i s t ä m i s e n + m y y n n i n e d i s t ä m i s e s t ä + m y y n n i n e d i s t ä m i s h a n k k e e t + m y y n n i n e d i s t ä m i s h a n k k e i t a + m y y n n i n e d i s t ä m i s j ä r j e s t e l m ä ä + m y y n n i n e d i s t ä m i s k a m p a n j a + m y y n n i n e d i s t ä m i s k a m p a n j a n + m y y n n i n e d i s t ä m i s k a m p a n j o i d e m m e + m y y n n i n e d i s t ä m i s k a m p a n j o i d e n + m y y n n i n e d i s t ä m i s k a m p a n j o i h i n + m y y n n i n e d i s t ä m i s k a m p a n j o i s t a + m y y n n i n e d i s t ä m i s k a m p a n j o i t a + m y y n n i n e d i s t ä m i s k e i n o + m y y n n i n e d i s t ä m i s m a k s u j a + m y y n n i n e d i s t ä m i s m a t e r i a a l i i n + m y y n n i n e d i s t ä m i s o h j e l m a n + m y y n n i n e d i s t ä m i s o h j e l m i a + m y y n n i n e d i s t ä m i s o h j e l m i e n + m y y n n i n e d i s t ä m i s p a l v e l u j a + m y y n n i n e d i s t ä m i s p o l i t i i k a n + m y y n n i n e d i s t ä m i s p o l i t i i k k a + m y y n n i n e d i s t ä m i s p o l i t i i k k a a + m y y n n i n e d i s t ä m i s r a h a s t o a + m y y n n i n e d i s t ä m i s r a h a s t o n + m y y n n i n e d i s t ä m i s r a h a s t o s t a + m y y n n i n e d i s t ä m i s t a p a h t u m i s s a + m y y n n i n e d i s t ä m i s t i l a i s u u k s i i n + m y y n n i n e d i s t ä m i s t o i m e n a + m y y n n i n e d i s t ä m i s t o i m e n p i t e i d e n + m y y n n i n e d i s t ä m i s t o i m e n p i t e i t ä + m y y n n i n e d i s t ä m i s t o i m e t + m y y n n i n e d i s t ä m i s t o i m i + m y y n n i n e d i s t ä m i s t o i m i a + m y y n n i n e d i s t ä m i s t o i m i e n + m y y n n i n e d i s t ä m i s t o i m i i n + m y y n n i n e d i s t ä m i s t o i m i l l e + m y y n n i n e d i s t ä m i s t o i m i n a + m y y n n i n e d i s t ä m i s t o i m i s t a + m y y n n i n e d i s t ä m i s t u i s t a + m y y n n i n e d i s t ä m i s t u k i a + m y y n n i n e d i s t ä m i s t u k i e n + m y y n n i n e d i s t ä m i s t ä + m y y n n i n e d i s t ä m i s v ä l i n e t t ä + m y y n n i n j ä l k e i s e n + m y y n n i n j ä l k e i s e t + m y y n n i n j ä l k e i s i s s ä + m y y n n i n j ä l k e i s t e n + m y y n n i n v a l v o n n a s t a + m y y n n i n v a l v o n t a + m y y n n i n v a l v o n t a j ä r j e s t e l m i e n + m y y n n i n v a l v o n t a j ä r j e s t e l m i i n + m y y n n i n v a l v o n t a j ä r j e s t e l m ä t + m y y n n i n v a l v o n t a j ä r j e s t e l m ä ä + m y y n n i s s ä + m y y n n i s t ä + m y y n t i a i k a a + m y y n t i a i k o i n a + m y y n t i a l u e i d e n + m y y n t i a p u l a i s e l l a + m y y n t i a r g u m e n t t i + m y y n t i a r g u m e n t t i n a + m y y n t i a r v o + m y y n t i a r v o a + m y y n t i a u t o m a a t t i + m y y n t i a u t o m a a t t i a + m y y n t i a u t o m a a t t i a l a n + m y y n t i a u t o m a a t t i e n + m y y n t i d y n a m i i k k a + m y y n t i e h d o i s t a + m y y n t i e h t o j e n + m y y n t i e t u j a + m y y n t i h e n k i l ö k u n n a n + m y y n t i h e n k i l ö s t ö l l ä + m y y n t i h e t k e l l ä + m y y n t i h i n n a l l a + m y y n t i h i n n a l l e + m y y n t i h i n n a n + m y y n t i h i n n a s t a + m y y n t i h i n n a t + m y y n t i h i n n o i l l a + m y y n t i h i n n o i s s a + m y y n t i h i n n o i s t a + m y y n t i h i n t a + m y y n t i h i n t a a + m y y n t i h i n t o j a + m y y n t i h i n t o j e n + m y y n t i h u i p p u j a + m y y n t i i n + m y y n t i j ä r j e s t e l m ä + m y y n t i j ä r j e s t e l m ä n + m y y n t i j ä r j e s t e l m ä n s ä + m y y n t i j ä r j e s t e l m ä s t ä + m y y n t i j ä r j e s t e l y i l l ä + m y y n t i k a n a v a + m y y n t i k a n a v a s t a + m y y n t i k a n a v i a + m y y n t i k a n a v i e n + m y y n t i k a s v e j a + m y y n t i k e i n o j e n + m y y n t i k e l p o i s i a + m y y n t i k e l v o t t o m i a + m y y n t i k e t j u + m y y n t i k e t j u j e n + m y y n t i k e t j u n + m y y n t i k e t j u s s a + m y y n t i k e t j u u n + m y y n t i k i e l l o l l e + m y y n t i k i e l l o n + m y y n t i k i e l l o s t a + m y y n t i k i e l t o + m y y n t i k i e l t o a + m y y n t i k i e l t o o n + m y y n t i k i i n t i ö t ä + m y y n t i k o j u i s t a + m y y n t i k o j u j e n + m y y n t i k r i i s i + m y y n t i k r i i s i n + m y y n t i k u s t a n n u k s e t + m y y n t i k u s t a n n u k s i s t a + m y y n t i k y s y m y s t ä + m y y n t i k ä y t ä n n ö i l t ä + m y y n t i k ä y t ä n t ö j e n + m y y n t i k ä y t ä n t ö j ä + m y y n t i l u k u i h i n + m y y n t i l u k u j a + m y y n t i l u p a + m y y n t i l u p a a + m y y n t i l u p a a n + m y y n t i l u p a h a k e m u s + m y y n t i l u p a p e r u s t e i s t a + m y y n t i l u p i a + m y y n t i l u p i e n + m y y n t i l u p i i n + m y y n t i l u v a n + m y y n t i l u v a t + m y y n t i l u v i s s a + m y y n t i l u v u i s t a + m y y n t i l u v u t + m y y n t i m a h d o l l i s u u d e t + m y y n t i m a h d o l l i s u u k s i a + m y y n t i m a h d o l l i s u u k s i e n + m y y n t i m a h d o l l i s u u s + m y y n t i m a r k k i n a t + m y y n t i m a r k k i n o i d e n + m y y n t i m a r k k i n o i l l a + m y y n t i m a r k k i n o i t a + m y y n t i m e n e s t y s + m y y n t i m e n e t e l m i ä + m y y n t i m e n e t e l m ä ä + m y y n t i m e n e t t e l y j e n + m y y n t i m o n o p o l i a + m y y n t i m o n o p o l i e n + m y y n t i m o n o p o l i n + m y y n t i n i m i k e + m y y n t i n i m i k e t t ä + m y y n t i n i m i t y s + m y y n t i n ä k ö k o h t a + m y y n t i o i k e u d e t + m y y n t i o i k e u k s i s t a + m y y n t i o n g e l m a + m y y n t i o n g e l m i a + m y y n t i o n g e l m i e n + m y y n t i o n g e l m i i n + m y y n t i p a i k a n + m y y n t i p a i k a s s a + m y y n t i p a i k a s t a + m y y n t i p a i k a t + m y y n t i p a i k k o j e n + m y y n t i p a i k o i l l a + m y y n t i p i s t e e n ä + m y y n t i p i s t e e s e e n + m y y n t i p i s t e e s s ä + m y y n t i p i s t e i d e n + m y y n t i p i s t e i s s ä + m y y n t i p i s t e i s t ä + m y y n t i p r o s e s s i + m y y n t i p ä i v ä + m y y n t i s o p i m u k s e n + m y y n t i s o p i m u k s i a + m y y n t i s o p i m u k s i s s a + m y y n t i s o p i m u s + m y y n t i s o p i m u s t a + m y y n t i s u u n n i t e l m i e n + m y y n t i t a k t i i k o i l t a + m y y n t i t a s o j e n + m y y n t i t e k n i i k o i s s a + m y y n t i t e k n i i k o i t a + m y y n t i t e m p p u + m y y n t i t i l a i s u u d e t + m y y n t i t i l a n t e e s s a + m y y n t i t o i m i a + m y y n t i t u l o i s t a + m y y n t i t u l o k s e t + m y y n t i t u l o s t a + m y y n t i t u l o t + m y y n t i t u o t t e i d e n + m y y n t i t u o t t o j a + m y y n t i t y k i t + m y y n t i v a i h e e s s a + m y y n t i v e r k o s t o + m y y n t i v e r k o s t o j a a n + m y y n t i v e r o a s t e t t a + m y y n t i v i e s t e i l l e + m y y n t i v o i t o t + m y y n t i v o i t t o v e r o + m y y n t i v o l y y m i + m y y n t i y h t e y d e n o t o i l t a + m y y n t i y r i t y k s e n s ä + m y y n t i ä + m y y n y t + m y y r ä e k i n o k o k k i + m y y r ä k u u m e + m y y r ä m i e s + m y y r ä n p o r r a s + m y y r ä t a p a k u l o + m y y t i i n + m y y t i n + m y y t t e j ä + m y y t t i s t ä + m y y t ä i s i i n + m y y t ä v i e n + m y y t ä v ä t + m y y v ä t + m y ö h e m m i l l e + m y ö h e m m i n k i n + m y ö h e m m i n k ä ä n + m y ö h e m m i s s ä + m y ö h e m m ä l l e + m y ö h e m m ä n + m y ö h e m m ä s s ä + m y ö h e m m ä s t ä + m y ö h e m p i ä + m y ö h e m p ä ä + m y ö h i m p ä ä n + m y ö h ä i s a n t i i k k i + m y ö h ä i s e l l ä + m y ö h ä i s e n + m y ö h ä i s e n ä + m y ö h ä i s e s s ä + m y ö h ä i s e s t ä + m y ö h ä i s e s t ä k i n + m y ö h ä i s h e r ä n n ä i n e n + m y ö h ä i s i l l a n + m y ö h ä i s i l t a a n + m y ö h ä i s i n + m y ö h ä i s i s s ä + m y ö h ä i s j u r a k a u s i + m y ö h ä i s k a u s i + m y ö h ä i s l a n n o i t u k s e s t a + m y ö h ä i s l i i t u k a u s i + m y ö h ä i s s y k s y l l ä + m y ö h ä i s t e n + m y ö h ä i s t r i a s k a u s i + m y ö h ä s t y e s s ä n i + m y ö h ä s t y i n + m y ö h ä s t y i v ä t + m y ö h ä s t y m i s e n i + m y ö h ä s t y m i s e s t ä + m y ö h ä s t y m i s i s s ä + m y ö h ä s t y m i s i s t ä + m y ö h ä s t y m i s i ä + m y ö h ä s t y m i s o n g e l m a a + m y ö h ä s t y m i s p ä i v ä s t ä + m y ö h ä s t y m i s t a p a u k s i a + m y ö h ä s t y m i s t a p a u k s i s s a + m y ö h ä s t y m i s t ä + m y ö h ä s t y m i s t ä m m e + m y ö h ä s t y m i s t ä n i + m y ö h ä s t y m m e + m y ö h ä s t y n e e n ä k i n + m y ö h ä s t y n e e t + m y ö h ä s t y n e i s t ä + m y ö h ä s t y n e i t ä + m y ö h ä s t y y + m y ö h ä s t y ä + m y ö h ä ä n k i n + m y ö n n e t t i i n + m y ö n n e t t y + m y ö n n e t t y i h i n + m y ö n n e t t y j e n + m y ö n n e t t y j ä + m y ö n n e t t y ä + m y ö n n e t t y ä ä n + m y ö n n e t t ä e s s ä + m y ö n n e t t ä i s i i n k i n + m y ö n n e t t ä k ö ö n + m y ö n n e t t ä v i e n + m y ö n n e t t ä v i i n + m y ö n n e t t ä v ä ä + m y ö n n e t t ä v ä ä n + m y ö n n e t y i s t ä + m y ö n n e t y n + m y ö n n e t y t + m y ö n n e t ä + m y ö n n e t ä ä n + m y ö n n e t ä ä n k ö + m y ö n n y i n + m y ö n n y t y k s e n + m y ö n n y t y k s e t + m y ö n n y t y k s i i n + m y ö n n y t y k s i s t ä + m y ö n n y t y k s i t t ä + m y ö n n y t y k s i ä + m y ö n n y t y s j ä r j e s t e l m ä + m y ö n n y t y s j ä r j e s t e l m ä n + m y ö n n y t y s p o l i t i i k a l t a + m y ö n n y t y s p o l i t i i k k a a + m y ö n n y t y s p o l i t i i k k a m m e + m y ö n n ä m m e + m y ö n n ä m m e k i n + m y ö n n ä m m e k ö + m y ö n n ä n + m y ö n s i + m y ö n s i k i n + m y ö n s i k ö + m y ö n s i m m e + m y ö n s i t t e k i n + m y ö n s i v ä t + m y ö n t e i n e n k i n + m y ö n t e i s e e n + m y ö n t e i s e k s i + m y ö n t e i s e l l e + m y ö n t e i s e l l ä + m y ö n t e i s e l t ä + m y ö n t e i s e m m i s t ä k i n + m y ö n t e i s e m m ä k s i + m y ö n t e i s e m m ä n + m y ö n t e i s e m m ä s s ä + m y ö n t e i s e m m ä t + m y ö n t e i s e m p i + m y ö n t e i s e m p i k i n + m y ö n t e i s e m p i n ä + m y ö n t e i s e m p i ä + m y ö n t e i s e m p ä n ä + m y ö n t e i s e m p ä ä + m y ö n t e i s e m p ä ä n + m y ö n t e i s e n + m y ö n t e i s e n ä + m y ö n t e i s e s s ä + m y ö n t e i s e s t ä + m y ö n t e i s e t + m y ö n t e i s e t k i n + m y ö n t e i s i e n + m y ö n t e i s i i n + m y ö n t e i s i k s i + m y ö n t e i s i l l ä + m y ö n t e i s i l l ä k i n + m y ö n t e i s i m m i s t ä + m y ö n t e i s i m m ä t + m y ö n t e i s i m p i i n + m y ö n t e i s i m p i ä + m y ö n t e i s i m p ä n ä + m y ö n t e i s i n + m y ö n t e i s i n t ä + m y ö n t e i s i n ä + m y ö n t e i s i s s ä + m y ö n t e i s i s t ä + m y ö n t e i s i ä + m y ö n t e i s i ä k i n + m y ö n t e i s t e n + m y ö n t e i s t ä + m y ö n t e i s t ä h ä n + m y ö n t e i s t ä k i n + m y ö n t e l i v ä t + m y ö n t y m ä t t ä + m y ö n t y v ä i s e m p i ä + m y ö n t y v ä t + m y ö n t ä e s s ä m m e + m y ö n t ä e s s ä ä n + m y ö n t ä i s i + m y ö n t ä i s i k ä ä n + m y ö n t ä i s i t t e + m y ö n t ä i s i v ä t + m y ö n t ä k ä ä + m y ö n t ä k ä ä m m e + m y ö n t ä m i s a i k a a + m y ö n t ä m i s a j a n k o h t a a + m y ö n t ä m i s e d e l l y t y k s e t + m y ö n t ä m i s e d e l l y t y k s i i n + m y ö n t ä m i s e d e l l y t y k s i s s ä + m y ö n t ä m i s e d e l l y t y k s i ä + m y ö n t ä m i s e e n + m y ö n t ä m i s e h d o t + m y ö n t ä m i s e h t o j a + m y ö n t ä m i s e k s i + m y ö n t ä m i s e l l e + m y ö n t ä m i s e l l ä + m y ö n t ä m i s e n + m y ö n t ä m i s e s s ä + m y ö n t ä m i s e s t ä + m y ö n t ä m i s j ä r j e s t e l m ä + m y ö n t ä m i s j ä r j e s t e l m ä n + m y ö n t ä m i s j ä r j e s t e l m ä s t ä + m y ö n t ä m i s j ä r j e s t e l m ä ä n + m y ö n t ä m i s k i e l t o + m y ö n t ä m i s k i e l t o a + m y ö n t ä m i s k r i t e e r e j ä + m y ö n t ä m i s k r i t e e r i e n + m y ö n t ä m i s k r i t e e r i n ä + m y ö n t ä m i s k r i t e e r i t + m y ö n t ä m i s k u s t a n n u k s e t + m y ö n t ä m i s k y n n y s t e n + m y ö n t ä m i s m e n e t t e l y + m y ö n t ä m i s m e n e t t e l y i h i n + m y ö n t ä m i s m e n e t t e l y j e n + m y ö n t ä m i s m e n e t t e l y j ä + m y ö n t ä m i s m e n e t t e l y n + m y ö n t ä m i s m e n e t t e l y t + m y ö n t ä m i s m e n e t t e l y y n + m y ö n t ä m i s m e n e t t e l y ä + m y ö n t ä m i s p e r u s t e e n + m y ö n t ä m i s p e r u s t e e n a + m y ö n t ä m i s p e r u s t e e t + m y ö n t ä m i s p e r u s t e i d e n + m y ö n t ä m i s p e r u s t e i l l a + m y ö n t ä m i s p e r u s t e i n a + m y ö n t ä m i s p e r u s t e i s i i n + m y ö n t ä m i s p e r u s t e i s s a + m y ö n t ä m i s p e r u s t e i s t a + m y ö n t ä m i s p e r u s t e i t a + m y ö n t ä m i s p r o s e s s i + m y ö n t ä m i s p r o s e s s i a + m y ö n t ä m i s p r o s e s s i n + m y ö n t ä m i s p r o s e s s i s s a + m y ö n t ä m i s p ä ä t ö k s e t + m y ö n t ä m i s t a p a + m y ö n t ä m i s t a p a a + m y ö n t ä m i s t a p a a n + m y ö n t ä m i s t ä + m y ö n t ä m i s v a a t i m u k s i e n + m y ö n t ä m i s v a i h e e s s a + m y ö n t ä m i s v a l t u u t u s t a + m y ö n t ä m ä l l ä + m y ö n t ä m ä s s ä + m y ö n t ä m ä s t ä + m y ö n t ä m ä t t ä + m y ö n t ä m ä ä + m y ö n t ä m ä ä n + m y ö n t ä n e e s e e n + m y ö n t ä n e e t + m y ö n t ä n e t t e + m y ö n t ä n y t + m y ö n t ä v ä t + m y ö n t ä v ä t k ö + m y ö n t ä ä + m y ö n t ä ä k s e e n + m y ö n t ä ä k s e m m e + m y ö n t ä ä k s e n i + m y ö t ä i l e n + m y ö t ä m i e l i n e n + m y ö t ä m i e l i s e m m i k s i + m y ö t ä m i e l i s e m m i l l e + m y ö t ä m i e l i s e m m ä n + m y ö t ä m i e l i s e m p i ä + m y ö t ä m i e l i s y y d e l l e + m y ö t ä m i e l i s y y d e s t ä + m y ö t ä m i e l i s y y t t ä + m y ö t ä t u n n o l l a + m y ö t ä t u n n o n + m y ö t ä t u n n o n o s o i t u s + m y ö t ä t u n t o a + m y ö t ä t u n t o i s e m m a l l a + m y ö t ä t u n t o i s e m p i + m y ö t ä t u n t o i s i n + m y ö t ä t u n t o l i i k e + m y ö t ä t u n t o m m e + m y ö t ä t u n t o n i + m y ö t ä t u n t o n s a + m y ö t ä t u n t o r e a k t i o i t a + m y ö t ä t u u l e n + m y ö t ä t u u l t a + m y ö t ä v a i k u t t a a + m y ö t ä v a i k u t t a a k s e e n + m y ö t ä v a i k u t t a a k s e n i + m y ö t ä v a i k u t t a m a a n + m y ö t ä v a i k u t t a m i s t a + m y ö t ä v a i k u t t a n e e t + m y ö t ä v a i k u t t a v a t + m y ö t ä v a i k u t u k s e e n + m y ö t ä v a i k u t u k s e l l a + m ä d ä n n e e t + m ä d ä n n ä i s y y d e t + m ä d ä t t ä ä + m ä d ä t y s l a i t o s + m ä e s t ä + m ä k e ä + m ä k i a p i l a + m ä k i a r h o + m ä k i a u t o + m ä k i h y p p y + m ä k i h y p p y l i n k o + m ä k i h y p p y y n + m ä k i h y p y n + m ä k i k a u r a + m ä k i k e n t t ä m i t t a r i + m ä k i k u i s m a + m ä k i k ä y n n i s t y s + m ä k i l e h t o l u s t e + m ä k i l e i n i k k i + m ä k i l i t u k k a + m ä k i r i k k o + m ä k i s i r k k u + m ä k i t e r v a k k o + m ä k i v i r v i l ä + m ä k ä r ä t + m ä n n y n h e r k k u t a t t i + m ä n n y n k ä ä p ä + m ä n n y n l e p p ä r o u s k u + m ä n n y n s u o m u o r a k a s + m ä n t y a n k e r o i n e n + m ä n t y k e h r ä ä j ä + m ä n t y k e r t t u l i + m ä n t y k i i t ä j ä + m ä n t y k u k k a + m ä n t y k u l k u r i n i r k k o + m ä n t y m a a o r a v a + m ä n t y m i t t a r i + m ä n t y n a k k e l i + m ä n t y n e u l a s m i t t a r i + m ä n t y n o k k a v a r p u n e n + m ä n t y n ä r h i + m ä n t y s i e p p o k e r t t u + m ä n t y s i r k k u + m ä n t y t i k k a + m ä n t y t u r i l a s + m ä n t y u u n i l i n t u + m ä n t y ö l j y + m ä n t ä k o m p r e s s o r i + m ä n t ä m o o t t o r i + m ä r e h t i j ö i d e n + m ä r e h t i j ö i h i n + m ä r e h t i j ö i t ä + m ä r k ä l ä m p ö t i l a + m ä r k ä p i d o n + m ä r k ä p i d o s t a + m ä r k ä p i t o + m ä r k ä p i t o a + m ä r s s y k o r i + m ä t ä k u u + m ä t ä n e e + m ä t ä n e v i s t ä + m ä t ä p a i s e e t + m ä t ä p a i s e t t a + m ä t ä s h e l m i k k ä + m ä t ä s r i k k o + m ä ä r i e n + m ä ä r i n + m ä ä r i s t ä + m ä ä r i t e l l e e + m ä ä r i t e l l e s s ä + m ä ä r i t e l l e s s ä m m e + m ä ä r i t e l l e s s ä n i + m ä ä r i t e l l e s s ä ä n + m ä ä r i t e l l y m p i ä + m ä ä r i t e l l y t + m ä ä r i t e l l ä + m ä ä r i t e l l ä k s e e n + m ä ä r i t e l l ä k s e m m e + m ä ä r i t e l l ä ä n + m ä ä r i t e l m i e n + m ä ä r i t e l m i s t ä + m ä ä r i t e l m i ä + m ä ä r i t e l m ä e h d o t u s + m ä ä r i t e l m ä l u e t t e l o + m ä ä r i t e l m ä n + m ä ä r i t e l m ä n s ä + m ä ä r i t e l m ä o n g e l m a a + m ä ä r i t e l m ä s s ä + m ä ä r i t e l m ä s t ä + m ä ä r i t e l m ä t + m ä ä r i t e l m ä v a a t i m u k s i a + m ä ä r i t e l m ä v a i h t o e h t o j e n + m ä ä r i t e l m ä ä + m ä ä r i t e l m ä ä n + m ä ä r i t e l t i i n + m ä ä r i t e l t y i h i n + m ä ä r i t e l t y j ä + m ä ä r i t e l t y n ä + m ä ä r i t e l t y ä + m ä ä r i t e l t ä e s s ä + m ä ä r i t e l t ä i s i i n + m ä ä r i t e t t i i n + m ä ä r i t e t t y j ä + m ä ä r i t e t t ä e s s ä + m ä ä r i t e t ä ä n + m ä ä r i t t e l e e + m ä ä r i t t e l e m i s e k s i + m ä ä r i t t e l e m i s e n + m ä ä r i t t e l e m i s e s s ä + m ä ä r i t t e l e m i s t ä + m ä ä r i t t e l e m m e + m ä ä r i t t e l e m ä l l ä + m ä ä r i t t e l e m ä t t ä + m ä ä r i t t e l e m ä t t ö m ä s s ä + m ä ä r i t t e l e m ä ä n + m ä ä r i t t e l e v ä t + m ä ä r i t t e l i + m ä ä r i t t e l i m m e + m ä ä r i t t e l y d i r e k t i i v i s t ä + m ä ä r i t t e l y e h t o j a + m ä ä r i t t e l y i l t ä ä n + m ä ä r i t t e l y j o u k k o + m ä ä r i t t e l y j ä r j e s t e l m i i n + m ä ä r i t t e l y k r i t e e r i e n + m ä ä r i t t e l y k y s y m y k s e e n + m ä ä r i t t e l y m e k a n i s m i e n + m ä ä r i t t e l y m e n e t e l m ä ä + m ä ä r i t t e l y n + m ä ä r i t t e l y o n g e l m a + m ä ä r i t t e l y o n g e l m a s t a + m ä ä r i t t e l y o n g e l m i a + m ä ä r i t t e l y o n g e l m i l t a + m ä ä r i t t e l y p i i r t e i s t ä + m ä ä r i t t e l y p r o s e s s i i n + m ä ä r i t t e l y p r o s e s s i n + m ä ä r i t t e l y s s ä + m ä ä r i t t e l y v a i h e + m ä ä r i t t e l y v a i h e e n + m ä ä r i t t e l y v a i h e e s s a + m ä ä r i t t e l y v a l t a a + m ä ä r i t t e l y ä + m ä ä r i t t ä e s s ä m m e + m ä ä r i t t ä e s s ä ä n + m ä ä r i t t ä k ä ä m m e + m ä ä r i t t ä m i s e k s i + m ä ä r i t t ä m i s e s s ä + m ä ä r i t t ä m i s e s t ä + m ä ä r i t t ä m i s m e n e t e l m ä + m ä ä r i t t ä m i s m e n e t e l m ä s s ä + m ä ä r i t t ä m i s o i k e u t t a + m ä ä r i t t ä m i s p e r u s t e e t + m ä ä r i t t ä m i s p y r k i m y k s e t + m ä ä r i t t ä m i s t ä + m ä ä r i t t ä m ä i s i l l ä m m e + m ä ä r i t t ä m ä s s ä + m ä ä r i t t ä m ä s t ä + m ä ä r i t t ä m ä t t ä + m ä ä r i t t ä m ä ä n + m ä ä r i t t ä v ä t + m ä ä r i t t ä ä + m ä ä r i t t ä ä k s e e n + m ä ä r i t t ä ä k s e m m e + m ä ä r i ä + m ä ä r ä a i k a + m ä ä r ä a i k a a + m ä ä r ä a i k a a n + m ä ä r ä a i k a i n e n + m ä ä r ä a i k a i s a r v i o i n n i s s a + m ä ä r ä a i k a i s a r v i o i n n i s t a + m ä ä r ä a i k a i s a r v i o i n t i + m ä ä r ä a i k a i s a r v i o i n t i a + m ä ä r ä a i k a i s a r v i o i n t i e n + m ä ä r ä a i k a i s a r v i o i n t i i n + m ä ä r ä a i k a i s a r v i o i n t i m e k a n i s m i + m ä ä r ä a i k a i s a r v i o i n t i m e k a n i s m i i n + m ä ä r ä a i k a i s a r v i o i n t i p r o s e s s i n + m ä ä r ä a i k a i s e e n + m ä ä r ä a i k a i s e k s i + m ä ä r ä a i k a i s e n + m ä ä r ä a i k a i s e s s a + m ä ä r ä a i k a i s e s t a + m ä ä r ä a i k a i s e t + m ä ä r ä a i k a i s i a + m ä ä r ä a i k a i s i i n + m ä ä r ä a i k a i s i s t a + m ä ä r ä a i k a i s k e r t o m u k s e e n + m ä ä r ä a i k a i s k e r t o m u k s e n + m ä ä r ä a i k a i s k e r t o m u k s e s s a + m ä ä r ä a i k a i s k e r t o m u k s e s s a a n + m ä ä r ä a i k a i s k e r t o m u k s e s s a m m e + m ä ä r ä a i k a i s k e r t o m u k s e s t a + m ä ä r ä a i k a i s k e r t o m u k s e t + m ä ä r ä a i k a i s k e r t o m u k s i a + m ä ä r ä a i k a i s k e r t o m u k s i i n + m ä ä r ä a i k a i s k e r t o m u k s i s s a + m ä ä r ä a i k a i s k e r t o m u k s i s s a a n + m ä ä r ä a i k a i s k e r t o m u k s i s t a + m ä ä r ä a i k a i s k e r t o m u s t a + m ä ä r ä a i k a i s s o p i m u k s i a + m ä ä r ä a i k a i s t a m i n e n + m ä ä r ä a i k a i s t a m i s e n + m ä ä r ä a i k a i s t a r k a s t e l u n + m ä ä r ä a i k a i s t a r k a s t u k s i a + m ä ä r ä a i k a i s t a r k a s t u s + m ä ä r ä a i k a i s t a r k a s t u s t e n + m ä ä r ä a i k a i s t a r k i s t u k s e e n + m ä ä r ä a i k a i s t e n + m ä ä r ä a i k a i s u u d e n + m ä ä r ä a i k a i s u u s + m ä ä r ä a i k o i h i n + m ä ä r ä a i k o i n e e n + m ä ä r ä a i k o j a + m ä ä r ä a i k o j a m m e + m ä ä r ä a i k o j a n i + m ä ä r ä a i k o j e n + m ä ä r ä a j a k s i + m ä ä r ä a j a l l a + m ä ä r ä a j a l l e + m ä ä r ä a j a n + m ä ä r ä a j a s s a + m ä ä r ä a j a s t a + m ä ä r ä a j a t + m ä ä r ä a j o i n + m ä ä r ä a j o i s s a + m ä ä r ä a j o i s t a + m ä ä r ä e n e m m i s t ö + m ä ä r ä e n e m m i s t ö i s t ä + m ä ä r ä e n e m m i s t ö j e n + m ä ä r ä e n e m m i s t ö j ä r j e s t e l m ä + m ä ä r ä e n e m m i s t ö k ä y t ä n n ö n + m ä ä r ä e n e m m i s t ö l l e + m ä ä r ä e n e m m i s t ö l l ä + m ä ä r ä e n e m m i s t ö m e n e t e l m ä ä n + m ä ä r ä e n e m m i s t ö m e n e t t e l y + m ä ä r ä e n e m m i s t ö m e n e t t e l y l l ä + m ä ä r ä e n e m m i s t ö m e n e t t e l y n + m ä ä r ä e n e m m i s t ö m e n e t t e l y y n + m ä ä r ä e n e m m i s t ö m e n e t t e l y ä + m ä ä r ä e n e m m i s t ö n + m ä ä r ä e n e m m i s t ö p e r i a a t e + m ä ä r ä e n e m m i s t ö p e r i a a t e t t a + m ä ä r ä e n e m m i s t ö p e r i a a t t e e l l a + m ä ä r ä e n e m m i s t ö p e r u s t e i s i a + m ä ä r ä e n e m m i s t ö p ä ä t ö k s e e n + m ä ä r ä e n e m m i s t ö p ä ä t ö k s e l l ä + m ä ä r ä e n e m m i s t ö p ä ä t ö k s e n + m ä ä r ä e n e m m i s t ö p ä ä t ö k s e n t e k o + m ä ä r ä e n e m m i s t ö p ä ä t ö k s e n t e k o a + m ä ä r ä e n e m m i s t ö p ä ä t ö k s e n t e k o o n + m ä ä r ä e n e m m i s t ö p ä ä t ö k s e n t e o n + m ä ä r ä e n e m m i s t ö p ä ä t ö k s e s t ä + m ä ä r ä e n e m m i s t ö p ä ä t ö k s e t + m ä ä r ä e n e m m i s t ö p ä ä t ö k s i e n + m ä ä r ä e n e m m i s t ö p ä ä t ö k s i i n + m ä ä r ä e n e m m i s t ö p ä ä t ö k s i l l ä + m ä ä r ä e n e m m i s t ö p ä ä t ö k s i n + m ä ä r ä e n e m m i s t ö p ä ä t ö k s i s t ä + m ä ä r ä e n e m m i s t ö p ä ä t ö k s i ä + m ä ä r ä e n e m m i s t ö p ä ä t ö s + m ä ä r ä e n e m m i s t ö p ä ä t ö s a s i a s s a + m ä ä r ä e n e m m i s t ö p ä ä t ö s j ä r j e s t e l m ä n + m ä ä r ä e n e m m i s t ö p ä ä t ö s k ä y t ä n t ö + m ä ä r ä e n e m m i s t ö p ä ä t ö s m e n e t t e l y y n + m ä ä r ä e n e m m i s t ö p ä ä t ö s p e r i a a t e + m ä ä r ä e n e m m i s t ö p ä ä t ö s t e n + m ä ä r ä e n e m m i s t ö p ä ä t ö s t ä + m ä ä r ä e n e m m i s t ö s t ä + m ä ä r ä e n e m m i s t ö s ä ä n n ö l l ä + m ä ä r ä e n e m m i s t ö s ä ä n n ö n + m ä ä r ä e n e m m i s t ö s ä ä n t ö + m ä ä r ä e n e m m i s t ö s ä ä n t ö ä + m ä ä r ä e n e m m i s t ö v a a t i m u k s e n + m ä ä r ä e n e m m i s t ö ä + m ä ä r ä e n e m m i s t ö ä ä n e s t y k s e e n + m ä ä r ä e n e m m i s t ö ä ä n e s t y k s e k s i + m ä ä r ä e n e m m i s t ö ä ä n e s t y k s e l l e + m ä ä r ä e n e m m i s t ö ä ä n e s t y k s e l l ä + m ä ä r ä e n e m m i s t ö ä ä n e s t y k s e n + m ä ä r ä e n e m m i s t ö ä ä n e s t y k s e s s ä + m ä ä r ä e n e m m i s t ö ä ä n e s t y k s e s t ä + m ä ä r ä e n e m m i s t ö ä ä n e s t y k s e t + m ä ä r ä e n e m m i s t ö ä ä n e s t y k s i e n + m ä ä r ä e n e m m i s t ö ä ä n e s t y k s i i n + m ä ä r ä e n e m m i s t ö ä ä n e s t y k s i s s ä + m ä ä r ä e n e m m i s t ö ä ä n e s t y k s i s t ä + m ä ä r ä e n e m m i s t ö ä ä n e s t y k s i ä + m ä ä r ä e n e m m i s t ö ä ä n e s t y s + m ä ä r ä e n e m m i s t ö ä ä n e s t y s j ä r j e s t e l m ä + m ä ä r ä e n e m m i s t ö ä ä n e s t y s t e n + m ä ä r ä e n e m m i s t ö ä ä n e s t y s t ä + m ä ä r ä e n e m m i s t ö ö n + m ä ä r ä e n e m m i s t ö ö n k i n + m ä ä r ä i l y n h a l u + m ä ä r ä i n d i k a a t t o r i t + m ä ä r ä j ä s e n v a l t i o + m ä ä r ä j ä s e n v a l t i o n + m ä ä r ä j ä s e n v a l t i o o n + m ä ä r ä j ä s e n v a l t i o s s a + m ä ä r ä k s i + m ä ä r ä l l e + m ä ä r ä l l i s e l l ä + m ä ä r ä l l i s e n + m ä ä r ä l l i s e n ä + m ä ä r ä l l i s e s t i k i n + m ä ä r ä l l i s e s t ä + m ä ä r ä l l i s e t + m ä ä r ä l l i s i i n + m ä ä r ä l l i s i l l ä + m ä ä r ä l l i s i n ä + m ä ä r ä l l i s i ä + m ä ä r ä l l i s t e n + m ä ä r ä l l i s t ä + m ä ä r ä l l ä k i n + m ä ä r ä m a a h a n + m ä ä r ä m a a n + m ä ä r ä m a a p e r i a a t e + m ä ä r ä m a a p e r i a a t e t t a + m ä ä r ä m a a s s a + m ä ä r ä n + m ä ä r ä n e n e m m i s t ö l l ä + m ä ä r ä n p ä i h i n + m ä ä r ä n p ä ä + m ä ä r ä n p ä ä h ä n s ä + m ä ä r ä n p ä ä m a a + m ä ä r ä n p ä ä m a a s s a + m ä ä r ä n p ä ä m a a s t a + m ä ä r ä n p ä ä s s ä + m ä ä r ä n p ä ä t ä + m ä ä r ä n p ä ä v a l t i o l l e + m ä ä r ä n p ä ä v a l t i o n + m ä ä r ä n s ä + m ä ä r ä o n g e l m i i n + m ä ä r ä o s u u d e t + m ä ä r ä p ä i v i e n + m ä ä r ä p ä i v i ä + m ä ä r ä p ä i v ä + m ä ä r ä p ä i v ä j ä r j e s t e l y i h i n + m ä ä r ä p ä i v ä l l e + m ä ä r ä p ä i v ä n ä + m ä ä r ä p ä i v ä s t ä + m ä ä r ä p ä i v ä t + m ä ä r ä p ä i v ä ä + m ä ä r ä p ä i v ä ä n + m ä ä r ä r a h a + m ä ä r ä r a h a a + m ä ä r ä r a h a e s i t y k s i ä + m ä ä r ä r a h a l e i k k a u k s e t + m ä ä r ä r a h a l e i k k a u k s i a + m ä ä r ä r a h a l e i k k a u k s i i n + m ä ä r ä r a h a l e i k k a u k s i l t a + m ä ä r ä r a h a l e i k k a u s t e n + m ä ä r ä r a h a l i s ä y k s e t + m ä ä r ä r a h a l i s ä y s + m ä ä r ä r a h a l i s ä y s t e n + m ä ä r ä r a h a l i s ä y s t ä + m ä ä r ä r a h a l l i s e s t i + m ä ä r ä r a h a m ä ä r ä t + m ä ä r ä r a h a n + m ä ä r ä r a h a n s a + m ä ä r ä r a h a o s u u k s i e n + m ä ä r ä r a h a o s u u s + m ä ä r ä r a h a p e r i a a t e t t a + m ä ä r ä r a h a p y y n t ö j ä + m ä ä r ä r a h a s i i r r o i l l a + m ä ä r ä r a h a s i i r r o i s t a + m ä ä r ä r a h a s i i r r o n + m ä ä r ä r a h a s i i r r o t + m ä ä r ä r a h a s i i r t o j a + m ä ä r ä r a h a s i i r t o p y y n n ö n + m ä ä r ä r a h a s i t o u m u k s i i n + m ä ä r ä r a h a s t a + m ä ä r ä r a h a s u m m a s t a + m ä ä r ä r a h a t + m ä ä r ä r a h a t a r p e e t + m ä ä r ä r a h a t a r p e i s i i n + m ä ä r ä r a h a t a r p e i t a + m ä ä r ä r a h a t a r v e + m ä ä r ä r a h a t a r v e t t a + m ä ä r ä r a h a v a a t i m u s t e n + m ä ä r ä r a h a v a j e + m ä ä r ä r a h a y l i t y k s e t + m ä ä r ä r a h o i h i n + m ä ä r ä r a h o i l l a + m ä ä r ä r a h o i s s a + m ä ä r ä r a h o i s t a + m ä ä r ä r a h o i t u s + m ä ä r ä r a h o j a + m ä ä r ä r a h o j e n + m ä ä r ä r a j o i t u k s i a + m ä ä r ä r a j o i t u s t e n + m ä ä r ä s i + m ä ä r ä s s ä + m ä ä r ä s t ä + m ä ä r ä t + m ä ä r ä t a v o i t t e i t a + m ä ä r ä t e s s ä ä n + m ä ä r ä t i e t o i s e e n + m ä ä r ä t i e t o i s e k s i + m ä ä r ä t i e t o i s e l l a + m ä ä r ä t i e t o i s e m m a k s i + m ä ä r ä t i e t o i s e m m a l l a + m ä ä r ä t i e t o i s e m m a n + m ä ä r ä t i e t o i s e m m a s t a + m ä ä r ä t i e t o i s e m m a t + m ä ä r ä t i e t o i s e m m i n + m ä ä r ä t i e t o i s e m m i s t a + m ä ä r ä t i e t o i s e m p a a + m ä ä r ä t i e t o i s e m p i + m ä ä r ä t i e t o i s e m p i a + m ä ä r ä t i e t o i s e m p i e n + m ä ä r ä t i e t o i s e n + m ä ä r ä t i e t o i s e s t a + m ä ä r ä t i e t o i s e s t i + m ä ä r ä t i e t o i s e t + m ä ä r ä t i e t o i s i a + m ä ä r ä t i e t o i s i i n + m ä ä r ä t i e t o i s i m m i n + m ä ä r ä t i e t o i s i m p i e n + m ä ä r ä t i e t o i s t a + m ä ä r ä t i e t o i s u u d e l l a + m ä ä r ä t i e t o i s u u d e s t a m m e + m ä ä r ä t i e t o i s u u s + m ä ä r ä t i e t o i s u u t t a + m ä ä r ä t i e t o i s u u t t a m m e + m ä ä r ä t k ä ä + m ä ä r ä t t i i n + m ä ä r ä t t y i h i n + m ä ä r ä t t y j e n + m ä ä r ä t t y j ä + m ä ä r ä t t ä e s s ä + m ä ä r ä t y i l l e + m ä ä r ä t y k s i + m ä ä r ä t y l l ä + m ä ä r ä t y n + m ä ä r ä t y t + m ä ä r ä t ä + m ä ä r ä t ä k s e e n + m ä ä r ä t ä ä n + m ä ä r ä t ä ä n k ö + m ä ä r ä v a h v u u s + m ä ä r ä v a l t i o s s a + m ä ä r ä v ä h e m m i s t ö + m ä ä r ä v ä h e m m i s t ö j e n + m ä ä r ä v ä h e m m i s t ö j ä + m ä ä r ä v ä h e m m i s t ö n + m ä ä r ä v ä h e m m i s t ö t + m ä ä r ä v ä h e m m i s t ö ä + m ä ä r ä v ä h e m m i s t ö ö n + m ä ä r ä y k s e e n + m ä ä r ä y k s e n + m ä ä r ä y k s e n s ä + m ä ä r ä y k s e t + m ä ä r ä y k s i e n + m ä ä r ä y k s i i n + m ä ä r ä y k s i k s i + m ä ä r ä y k s i l l e + m ä ä r ä y k s i s s ä + m ä ä r ä y k s i s t ä + m ä ä r ä y k s i ä + m ä ä r ä y k s i ä ä n + m ä ä r ä y s e h d o t u k s i s s a + m ä ä r ä y s e h d o t u s t a + m ä ä r ä y s r a k e n t e i t a + m ä ä r ä y s t e n + m ä ä r ä y s t ä + m ä ä r ä y s v a l t a a + m ä ä r ä y s v i i d a k o s t a + m ä ä r ä y t y i + m ä ä r ä y t y m ä ä n + m ä ä r ä y t y y + m ä ä r ä ä m i s e e n + m ä ä r ä ä m i s e k s i + m ä ä r ä ä m i s e s s ä + m ä ä r ä ä m i s e s t ä + m ä ä r ä ä m i s t ä + m ä ä r ä ä m i ä + m ä ä r ä ä m ä t + m ä ä r ä ä m ä t t ä + m ä ä r ä ä m ä t t ö m i ä + m ä ä r ä ä m ä ä n + m ä ä r ä ä n + m ä ä r ä ä v ä m p i + m ä ä r ä ä v ä n + m ä ä r ä ä v ä s t ä + m ä ä r ä ä v ä t + m ä ä r ä ä v ä ä + m ö k i l l ä ä n + m ö l y a p i n a t + m ö l y s a m m a k k o + m ö n j ä n + m ö n j ä v a h a k a s + m ö r k ö j ä + n a a m a l l a + n a a m a n s a + n a a m a r i p a l m u n ä ä t ä + n a a m a t + n a a m i a i s e t + n a a m i a i s i a + n a a m i o h e r t t u a k a l a + n a a m i o h o h t o k a i j a + n a a m i o h u v i t + n a a m i o h y y p p ä + n a a m i o i t u j e n + n a a m i o k a i j a n e n + n a a m i o k a n a h a u k k a + n a a m i o k e r t t u l i + n a a m i o k i u r u + n a a m i o k o t t a r a i n e n + n a a m i o k u h a n k e i t t ä j ä + n a a m i o k u k k a t a n g a r a + n a a m i o k u p a r i s o r s a + n a a m i o k y y h k y + n a a m i o l e h v ä k e r t t u + n a a m i o l e i j u + n a a m i o m a t k i j a + n a a m i o m u r h a a j a + n a a m i o n a + n a a m i o n s a + n a a m i o p a l l o k a l a + n a a m i o r u u s u p e i p p o + n a a m i o s e e p r a p e i p p o + n a a m i o s u u l a + n a a m i o t i a i s k e r t t u l i + n a a m i o t o r n i p ö l l ö + n a a m i o t r a p p i + n a a m i o t r o g o n i + n a a m i o t u l i p e r ä + n a a m i o v a h a n o k k a + n a a m i o v i h e l t ä j ä s o r s a + n a a m i o v i h e r t i k k a + n a a m i o v i i d a k k o h a r a k k a + n a a m i o v u o k k o k a l a + n a a p u r e i d e m m e + n a a p u r e i d e n + n a a p u r e i h i m m e + n a a p u r e i h i n + n a a p u r e i l l e m m e + n a a p u r e i l t a + n a a p u r e i s t a + n a a p u r e i s t a a n + n a a p u r e i s t a m m e + n a a p u r e i t a + n a a p u r e i t a a n + n a a p u r e i t a m m e + n a a p u r i a a n + n a a p u r i a l u e + n a a p u r i a l u e e l l a + n a a p u r i a l u e e n + n a a p u r i a l u e e s t a + n a a p u r i a l u e e s t a m m e + n a a p u r i a l u e e t + n a a p u r i a l u e i d e m m e + n a a p u r i a l u e i d e n + n a a p u r i a l u e i l l a + n a a p u r i a l u e i l l a m m e + n a a p u r i a l u e i l l e + n a a p u r i a l u e i l l e e n + n a a p u r i a l u e i s i i n + n a a p u r i a l u e i s t a + n a a p u r i a l u e i s t a m m e + n a a p u r i a l u e i t a + n a a p u r i a l u e i t a m m e + n a a p u r i a l u e i t t e n s a + n a a p u r i a p u + n a a p u r i a p u a + n a a p u r i a p u u n + n a a p u r i a v u n + n a a p u r i e h d o k a s v a l t i o i s s a + n a a p u r i e m m e + n a a p u r i e n s a + n a a p u r i h a u d a n + n a a p u r i h i n t o i h i n + n a a p u r i j ä s e n v a l t i o i d e n + n a a p u r i j ä s e n v a l t i o i h i n + n a a p u r i j ä s e n v a l t i o i l l a + n a a p u r i j ä s e n v a l t i o n + n a a p u r i j ä s e n v a l t i o s s a + n a a p u r i j ä s e n v a l t i o t + n a a p u r i k a n s a n + n a a p u r i k a n s a t + n a a p u r i k a n s o i h i n + n a a p u r i k a n s o j a + n a a p u r i k a n s o j e n + n a a p u r i k u m p p a n i e m m e + n a a p u r i k u m p p a n u u k s i i n + n a a p u r i k u n t i e n + n a a p u r i k y l ä n + n a a p u r i k y l ä n i + n a a p u r i m a a + n a a p u r i m a a h a n + n a a p u r i m a a h a n s a + n a a p u r i m a a k u n n i s s a + n a a p u r i m a a l l a + n a a p u r i m a a l l e + n a a p u r i m a a l l e e n + n a a p u r i m a a l l e m m e + n a a p u r i m a a m m e + n a a p u r i m a a n + n a a p u r i m a a n a + n a a p u r i m a a n i + n a a p u r i m a a n s a + n a a p u r i m a a s s a + n a a p u r i m a a s s a a n + n a a p u r i m a a s s a m m e + n a a p u r i m a a s t a + n a a p u r i m a a t + n a a p u r i m a a t a + n a a p u r i m a a t a m m e + n a a p u r i m a a t k a a n + n a a p u r i m a i d e m m e + n a a p u r i m a i d e n + n a a p u r i m a i d e n s a + n a a p u r i m a i h i m m e + n a a p u r i m a i h i n + n a a p u r i m a i h i n s a + n a a p u r i m a i k s e e n + n a a p u r i m a i l l a + n a a p u r i m a i l l e + n a a p u r i m a i l l e e n + n a a p u r i m a i l l e m m e + n a a p u r i m a i l t a + n a a p u r i m a i n a a n + n a a p u r i m a i s s a + n a a p u r i m a i s s a a n + n a a p u r i m a i s s a k i n + n a a p u r i m a i s s a m m e + n a a p u r i m a i s t a + n a a p u r i m a i s t a m m e + n a a p u r i m a i t a + n a a p u r i m a i t a a n + n a a p u r i m a i t a m m e + n a a p u r i m a i t t e m m e + n a a p u r i m a i t t e n s a + n a a p u r i m a n t e r e e l l a + n a a p u r i m a r k k i n o i d e n + n a a p u r i m m e + n a a p u r i n a + n a a p u r i n s a + n a a p u r i n t y t t ö + n a a p u r i p a i k k a k u n n a l l a + n a a p u r i p o l i t i i k a l l a m m e + n a a p u r i p o l i t i i k a s s a + n a a p u r i p o l i t i i k k a a + n a a p u r i p o l i t i i k k a m m e + n a a p u r i s a a r e l l a + n a a p u r i s a a r e t + n a a p u r i s a a r i + n a a p u r i s a a r t e n + n a a p u r i s a t a m i e n + n a a p u r i s i + n a a p u r i s s a + n a a p u r i s s a m m e + n a a p u r i s u h t e e t + n a a p u r i s u h t e i d e n + n a a p u r i s u h t e i d e n s a + n a a p u r i s u h t e i s i i n + n a a p u r i s u h t e i s t a + n a a p u r i s u h t e i t a + n a a p u r i t + n a a p u r i t a l o a + n a a p u r i t a s a v a l l o i s s a + n a a p u r i t a s a v a l t o j e n + n a a p u r i t a s o i s e s t i + n a a p u r i t i l o i l l a + n a a p u r i v a l t i o + n a a p u r i v a l t i o i d e m m e + n a a p u r i v a l t i o i d e n + n a a p u r i v a l t i o i d e n s a + n a a p u r i v a l t i o i h i m m e + n a a p u r i v a l t i o i h i n + n a a p u r i v a l t i o i h i n s a + n a a p u r i v a l t i o i l l a + n a a p u r i v a l t i o i l l e + n a a p u r i v a l t i o i l l e m m e + n a a p u r i v a l t i o i l l e n s a + n a a p u r i v a l t i o i l t a + n a a p u r i v a l t i o i s s a + n a a p u r i v a l t i o i s s a m m e + n a a p u r i v a l t i o i s t a + n a a p u r i v a l t i o i t a + n a a p u r i v a l t i o i t a a n + n a a p u r i v a l t i o l l a + n a a p u r i v a l t i o l l e + n a a p u r i v a l t i o l l e e n + n a a p u r i v a l t i o m m e + n a a p u r i v a l t i o n + n a a p u r i v a l t i o n n e + n a a p u r i v a l t i o n s a + n a a p u r i v a l t i o o m m e + n a a p u r i v a l t i o o n + n a a p u r i v a l t i o s s a + n a a p u r i v a l t i o s s a m m e + n a a p u r i v a l t i o s t a + n a a p u r i v a l t i o t + n a a p u r i v a l t i o t a + n a a p u r i v a l t i o t k i n + n a a p u r i y h t e i s t y ö n + n a a p u r i y h t e i s t y ö t ä + n a a p u r u s p o l i t i i k a n + n a a p u r u s s u h t e i d e n + n a a p u r u s t o a m m e + n a a p u r u s t o s s a + n a a p u r u u d e n + n a a p u r u u d e s t a + n a a p u r u u s a a t t e e l l e + n a a p u r u u s h e n g e s s ä + n a a p u r u u s k e t j u n + n a a p u r u u s k i i s t o j a + n a a p u r u u s k i i s t o j e n + n a a p u r u u s k o n f e r e n s s i + n a a p u r u u s k u m p p a n u u d e n + n a a p u r u u s k y s y m y k s e e n + n a a p u r u u s k y s y m y k s i ä + n a a p u r u u s k ä s i t e + n a a p u r u u s k ä s i t t e e n + n a a p u r u u s o h j e l m a a + n a a p u r u u s o h j e l m a a n + n a a p u r u u s o h j e l m a l l e + n a a p u r u u s o h j e l m a n + n a a p u r u u s o h j e l m a s t a + n a a p u r u u s o h j e l m i a + n a a p u r u u s o h j e l m i i n + n a a p u r u u s o h j e l m i s t a + n a a p u r u u s o n g e l m i e n + n a a p u r u u s p a k e t i s t a + n a a p u r u u s p o l i i t t i n e n + n a a p u r u u s p o l i i t t i s e n + n a a p u r u u s p o l i t i i k a l l a + n a a p u r u u s p o l i t i i k a l l a a n + n a a p u r u u s p o l i t i i k a l l a m m e + n a a p u r u u s p o l i t i i k a l l e + n a a p u r u u s p o l i t i i k a n + n a a p u r u u s p o l i t i i k a s s a + n a a p u r u u s p o l i t i i k a s s a a n + n a a p u r u u s p o l i t i i k a s s a m m e + n a a p u r u u s p o l i t i i k a s t a + n a a p u r u u s p o l i t i i k a s t a m m e + n a a p u r u u s p o l i t i i k a t + n a a p u r u u s p o l i t i i k k a + n a a p u r u u s p o l i t i i k k a a + n a a p u r u u s p o l i t i i k k a a m m e + n a a p u r u u s p o l i t i i k k a a n + n a a p u r u u s p o l i t i i k k a a n s a + n a a p u r u u s p o l i t i i k k a m m e + n a a p u r u u s p o l i t i i k k a n a + n a a p u r u u s p o l i t i i k k a n s a + n a a p u r u u s p o l i t i i k k o i h i n + n a a p u r u u s p o l i t i i k k o i n e e n + n a a p u r u u s p o l i t i i k k o j e n + n a a p u r u u s p o l i t i i k o i s s a + n a a p u r u u s p o l i t i i k o i s t a + n a a p u r u u s s o p i m u k s e t + n a a p u r u u s s o p i m u k s i i n + n a a p u r u u s s t r a t e g i a + n a a p u r u u s s t r a t e g i a a + n a a p u r u u s s t r a t e g i a a n + n a a p u r u u s s t r a t e g i a l l e m m e + n a a p u r u u s s t r a t e g i a n + n a a p u r u u s s t r a t e g i a s s a + n a a p u r u u s s t r a t e g i a s t a m m e + n a a p u r u u s s u h d e + n a a p u r u u s s u h d e p o l i t i i k a l l a + n a a p u r u u s s u h t e e m m e + n a a p u r u u s s u h t e e n + n a a p u r u u s s u h t e e t + n a a p u r u u s s u h t e i d e n + n a a p u r u u s s u h t e i l l a + n a a p u r u u s s u h t e i l l e + n a a p u r u u s s u h t e i s i i n + n a a p u r u u s s u h t e i s s a + n a a p u r u u s s u h t e i s s a m m e + n a a p u r u u s s u h t e i s t a + n a a p u r u u s s u h t e i t a + n a a p u r u u s s u h t e i t a m m e + n a a p u r u u s s u u n n i t e l m a a + n a a p u r u u s s u u n n i t e l m a n + n a a p u r u u s s u u n n i t e l m a n s a + n a a p u r u u s v a l t i o i d e n + n a a p u r u u s v e r k o s t o i s t a + n a a p u r u u s v ä l i n e + n a a p u r u u s v ä l i n e e n + n a a p u r u u s v ä l i n e e s t ä + n a a p u r u u s v ä l i n e t t ä + n a a p u r u u s y h t e i s t y ö r a h o i t u s v ä l i n e e k s i + n a a r a s l e i j o n a + n a f t a l e e n i s u l f o n a a t t i a + n a f t a n + n a g a n a m i + n a g a t + n a h k a e s i n e t t ä + n a h k a j a l k i n e a l a l l e + n a h k a j a l k i n e a l a n + n a h k a j a l k i n e i d e n + n a h k a j a l k i n e i l l e + n a h k a k e l t a s i i p i + n a h k a k e n g i l l e + n a h k a k e n k i e n + n a h k a m o n n i t + n a h k a p a s k a + n a h k a t a k k i + n a h k a t a k k i n n e + n a h k a t a v a r o i d e n + n a h k a t a v a r o i t a + n a h k a t e h d a s t a + n a h k a t e h t a i d e n + n a h k a t e o l l i s u u d e n + n a h k a t e o l l i s u u d e s t a + n a h k a t e o l l i s u u s + n a h k a t e o l l i s u u s t y ö n t e k i j ö i d e n + n a h k a t e o l l i s u u t e e n + n a h k a t u o t a n n o n + n a h k a t u o t e t o i m i a l o j e n + n a h k a t u o t t e e t + n a h k a t u o t t e i d e n + n a h k a t y ö n t e k i j ö i d e n + n a h k i a i s e t + n a h o i n + n a i i v e i n a + n a i i v e j a + n a i i v i a + n a i i v i i n + n a i m a t t o m a t + n a i m a t t o m i a + n a i s a k t i v i s t e i h i n + n a i s a k t i v i s t e j a + n a i s a k t i v i s t i a + n a i s a k t i v i s t i e n + n a i s a l a n + n a i s a s i a + n a i s a s i a a + n a i s a s i a a n + n a i s a s i a k e s k u s t e l u a + n a i s a s i a l i i k k e e n + n a i s a s i a l i i k k e e t + n a i s a s i a p o l i t i i k a n + n a i s a s i a t a i s t e l u a a n + n a i s a s i o i h i n + n a i s a s i o i s s a + n a i s a s i o i s t a + n a i s a s i o i t a + n a i s a v a r u u s l e n t ä j i s t ä + n a i s e d u s t a j i a + n a i s e d u s t a j i e n + n a i s e d u s t a j i l l e + n a i s e d u s t u k s e n + n a i s e d u s t u s + n a i s e e n + n a i s e h d o k a s t a + n a i s e h d o k k a i t a + n a i s e l l a + n a i s e l ä k e l ä i s i ä + n a i s e m a n s i p a a t i o a s i a s s a + n a i s e n + n a i s e n a + n a i s e n e m m i s t ö + n a i s e n v a i s t o n s a + n a i s e s t a + n a i s e t + n a i s e t k a a n + n a i s e t k i n + n a i s f o o r u m i + n a i s f o o r u m i l l e + n a i s f o o r u m i n + n a i s h e n k i l ö s t ö + n a i s i a + n a i s i i n + n a i s i l l a + n a i s i l l e + n a i s i s t a + n a i s i s t u m i s e e n + n a i s i s t u m i s e n + n a i s j o h t a j a n + n a i s j o h t a j i a + n a i s j o h t a j i e n + n a i s j ä r j e s t ö + n a i s j ä r j e s t ö i h i n + n a i s j ä r j e s t ö i l l e + n a i s j ä r j e s t ö i l l ä + n a i s j ä r j e s t ö i l t ä + n a i s j ä r j e s t ö i s s ä + n a i s j ä r j e s t ö i s t ä + n a i s j ä r j e s t ö j e n + n a i s j ä r j e s t ö j ä + n a i s j ä r j e s t ö j ä k i n + n a i s j ä r j e s t ö n + n a i s j ä r j e s t ö t + n a i s j ä r j e s t ö ä + n a i s j ä r j e s t ö ö n + n a i s j ä s e n + n a i s j ä s e n e m m e + n a i s j ä s e n e s t ä + n a i s j ä s e n e t + n a i s j ä s e n i l l e + n a i s j ä s e n i ä + n a i s j ä s e n t e n + n a i s j ä s e n t ä + n a i s k a n s a l a i s j ä r j e s t ö j ä + n a i s k a n s a n e d u s t a j i a + n a i s k a u p a n + n a i s k a u p a s t a + n a i s k a u p p a + n a i s k a u p p a a + n a i s k a u p p a a n + n a i s k a u p p a m a f i a + n a i s k e s k u s + n a i s k i i n t i ö + n a i s k i i n t i ö i d e n + n a i s k i i n t i ö i h i n + n a i s k i i n t i ö i s t ä + n a i s k i i n t i ö i t ä + n a i s k i i n t i ö t + n a i s k i i n t i ö t ä + n a i s k i r j a i l i j a + n a i s k o a l i t i o n + n a i s k o h t a l o + n a i s k o k k i a + n a i s k o l l e g a a m m e + n a i s k o l l e g o i d e m m e + n a i s k o l l e g o i l l e m m e + n a i s k o l l e g o i l t a n i + n a i s k o m i s s a a r i a + n a i s k o m i s s a a r i e n + n a i s k o m i s s a a r i l l e + n a i s k o m i s s a a r i n + n a i s k o n f e r e n s s i s s a + n a i s k u v a n + n a i s k y s y m y k s e e n + n a i s k y s y m y k s e l l e + n a i s k y s y m y k s e n + n a i s k y s y m y k s e s t ä + n a i s k y s y m y k s e t + n a i s k y s y m y k s i s t ä + n a i s k y s y m y k s i ä + n a i s k y s y m y s + n a i s k y s y m y s t ä + n a i s l i i k e + n a i s l i i k e t t ä + n a i s l i i k k e e l l e + n a i s l i i k k e e s e e n + n a i s l i i k k e i d e n + n a i s l i i k k e i s i i n + n a i s l i i t t o + n a i s l ä h t ö i s e s s ä + n a i s l ä ä k ä r e i h i n + n a i s l ä ä k ä r e i t ä + n a i s l ä ä k ä r i t + n a i s m a a h a n m u u t t a j i e n + n a i s m a a h a n m u u t t a j i i n + n a i s m a a n v i l j e l i j ä + n a i s m a a n v i l j e l i j ö i d e n + n a i s m a a n v i l j e l i j ö i l l e + n a i s m a t k u s t a j i i n + n a i s m e s t a r e i s t a + n a i s m i e l e n o s o i t t a j i a + n a i s m i e l e n o s o i t t a j i i n + n a i s m i n i s t e r e i t ä + n a i s m i n i s t e r i + n a i s m i n i s t e r i ä + n a i s m u r h a n + n a i s m u r h i e n + n a i s m u r h i s t a + n a i s n ä k ö k u l m a n + n a i s o i k e u s a k t i v i s t i + n a i s o p e t t a j a + n a i s o p e t t a j i e n + n a i s o p i s k e l i j a t + n a i s o p i s k e l i j o i d e n + n a i s o r j a k a u p p a + n a i s p a k o l a i s i l l e + n a i s p a k o l a i s i s t a + n a i s p a n t t i v a n k i n a + n a i s p a r a n + n a i s p a r l a m e n t a a r i k k o + n a i s p a r l a m e n t a a r i k k o j e n + n a i s p a r l a m e n t a a r i k o i d e n + n a i s p o l i i s e j a + n a i s p o l i i t i k k o + n a i s p o l i i t i k k o j a + n a i s p o l i i t i k k o n a + n a i s p o l i i t i k o i l l e + n a i s p o l i i t i k o l l e + n a i s p o l i i t i k o s t a + n a i s p o l i t i i k a n + n a i s p o l i t i i k k a + n a i s p o l i t i i k k a a + n a i s p o t i l a i t a + n a i s p r e s i d e n t t i + n a i s p r e s i d e n t t i ä + n a i s p r o f e s s o r e i t a + n a i s p r o j e k t e i l l e + n a i s p r o s t i t u o i t u j e n + n a i s p u h e m i e h e n + n a i s p u h e m i e s + n a i s p u h u j a a + n a i s p u h u j i i n + n a i s p u o l i s e l l e + n a i s p u o l i s i a + n a i s p u o l i s t e n + n a i s p ä ä m i n i s t e r i + n a i s p ä ä m i n i s t e r i k s i + n a i s p ä ä m i n i s t e r i n + n a i s r y h m i e n + n a i s r y h m i i n + n a i s r y h m i s t ä + n a i s r y h m i t t y m i e n + n a i s r y h m i t t y m i ä + n a i s r y h m i ä + n a i s r y h m ä + n a i s r y h m ä l l e + n a i s r y h m ä n + n a i s r y h m ä t + n a i s r y h m ä ä + n a i s r y h m ä ä n + n a i s s o t i l a i d e n + n a i s s u k u p o l v i + n a i s s u k u p u o l e n + n a i s s u k u p u o l i h o r m o n e j a + n a i s t a + n a i s t a r k k a i l i j o i d e n + n a i s t e k i j ä + n a i s t e n + n a i s t e n a m m a t t e i h i n + n a i s t e n k i n + n a i s t e n l e h t i + n a i s t e n l e h t i e n + n a i s t e n m i e h e t + n a i s t e n o i k e u k s i e n + n a i s t e n p ä i v ä + n a i s t e n p ä i v ä l l e + n a i s t e n p ä i v ä n + n a i s t e n p ä i v ä n ä + n a i s t e n p ä i v ä s t ä + n a i s t e n p ä i v ä ä + n a i s t e n t a u t i a + n a i s t o i m i t t a j a a + n a i s t o i m i t t a j a t + n a i s t u k i v e r k o s t o j a + n a i s t u o m a r e i d e n + n a i s t u r v a p a i k a n h a k i j o i d e n + n a i s t u t k i j a t + n a i s t u t k i j o i d e n + n a i s t u t k i j o i h i n + n a i s t u t k i j o i l l a + n a i s t u t k i j o i l l e + n a i s t u t k i j o i s t a + n a i s t u t k i j o i t a + n a i s t y y p i t + n a i s t y ö + n a i s t y ö l ä i s t e n + n a i s t y ö n t e k i j ä n + n a i s t y ö n t e k i j ä t + n a i s t y ö n t e k i j ä ä + n a i s t y ö n t e k i j ö i d e n + n a i s t y ö n t e k i j ö i h i n + n a i s t y ö n t e k i j ö i l l e + n a i s t y ö n t e k i j ö i s t ä + n a i s t y ö n t e k i j ö i t ä + n a i s t y ö n t e k i j ö i t ä m m e + n a i s t y ö v o i m a a + n a i s t y ö v o i m a n + n a i s t y ö v o i m a s t a + n a i s u h r e j a + n a i s u h r i e n + n a i s u l o t t u v u u s + n a i s u r h e i l u + n a i s v a j a u s + n a i s v a j e + n a i s v a l t a i s i a + n a i s v a l t a i s t a + n a i s v a l t a i s t e n + n a i s v a l t u u s k u n n a n + n a i s v a n g e i l l e + n a i s v a n g e i s t a + n a i s v a n g i n + n a i s v a n g i t + n a i s v a n k e j a + n a i s v a n k i e n + n a i s v a n k i l a s s a + n a i s v a n k i l o i s s a + n a i s v a r t a l o + n a i s v a r t i j a t + n a i s v a s t a i s e n a + n a i s v e r k k o j a + n a i s v e r k o s t o + n a i s v e r k o s t o i h i n + n a i s v e r k o s t o i l l a + n a i s v e r k o s t o i l l e + n a i s v e r k o s t o i s t a + n a i s v e r k o s t o j a + n a i s v e r k o s t o j e n + n a i s v e r k o s t o n + n a i s v e r k o s t o t + n a i s v i e r a i t a + n a i s v i l j e l i j ä + n a i s v i l j e l i j ä t + n a i s v i l j e l i j ö i d e n + n a i s v i r k a m i e s t e n + n a i s v ä e s t ö n + n a i s v ä e s t ö s t ä + n a i s v ä h e m m i s t ö i s t ä + n a i s y h d i s t y k s e t + n a i s y h d i s t y k s i l l e + n a i s y h d i s t y s t ä + n a i s y r i t t ä j i e n + n a i s y r i t t ä j i l l e + n a i s y r i t t ä j i l l ä + n a i s y r i t t ä j i ä + n a i s y r i t t ä j y y d e n + n a i s y r i t t ä j y y s + n a i s y r i t t ä j y y t t ä + n a i s y r i t t ä j ä + n a i s y r i t t ä j ä t + n a i s y s t ä v ä l l i s e m p i ä + n a i s y s t ä v ä m m e + n a i s ä ä n e s t ä j i e n + n a i s ä ä n e s t ä j i ä + n a k e r t a a + n a k e r t a v a t + n a k k e l i t ö p ö k e r t t u n e n + n a k k i p i i l o + n a k k i s ä m p y l ä + n a k u p y ö r ä + n a l l e k a r h u n + n a l l e k a r k k i + n a l l i l e l u j a + n a l l i l u k k o + n a l l i p y s s y + n a m a t + n a n o a e r o s o l i e n + n a n o a i n e s o s i a + n a n o a i n e s o s i e n + n a n o e l i n t a r v i k k e i t a + n a n o f y s i i k a n + n a n o h i u k k a s e t + n a n o h i u k k a s i a + n a n o h i u k k a s t e n + n a n o k o m p o s i i t i t + n a n o m a t e r i a a l e i s t a + n a n o m a t e r i a a l i e n + n a n o m a t e r i a a l i t + n a n o m u o d o s s a + n a n o n u p p u + n a n o p a i n a t u s l i t o g r a f i a + n a n o p u t k i + n a n o r a h o i t u s o h j e l m a + n a n o s a t e l l i i t t i + n a n o s i n k k i o k s i d i h i u k k a s i a + n a n o s o v e l l u k s i a + n a n o t a s o l l a + n a n o t e k n o l o g i a + n a n o t e k n o l o g i a a n + n a n o t e k n o l o g i a s t a + n a n o t e k n o l o g i a t e o l l i s u u d e n + n a n o t e k n o l o g i a t u o t t e i d e n + n a n o t e k n o l o g i o i s t a + n a n o t e k n o l o g i o i t a + n a p a a n s a + n a p a d y n a m o + n a p a h ä r k k i + n a p a j ä n i s + n a p a j ä ä s t ä + n a p a k e t t u + n a p a k o o r d i n a a t i s t o + n a p a k o t i l o + n a p a l ä v i s t y s + n a p a n u o r a + n a p a n u o r a a + n a p a n u o r a n + n a p a n u o r a s t a + n a p a n u o r a v e r e n + n a p a n u o r a v e r e s t ä + n a p a n u o r a v e r i + n a p a n u o r a v e r i p a n k k e j a + n a p a n u o r a v e r i p a n k k i e n + n a p a n u o r a v e r t a + n a p a p a j u + n a p a p i i r i + n a p a p i i r i l l e + n a p a p i i r i l l ä + n a p a p i i r i l t ä + n a p a p i i r i n + n a p a p i i r i ä + n a p a p o h j o i n e n + n a p a p y ö r r e + n a p a r u u v i + n a p a s e u d u l t a + n a p a s e u t u a l u e e l l a + n a p a t y r ä + n a p a t ä h t i + n a p i n p a i n a l l u k s e l l a + n a p o l i l a i s p o j a n + n a p o l i n + n a p o l i n l a h t i + n a p o l i n m a s t i f f i + n a p o l i s s a + n a p o l i s t a + n a p o n r a s t a s + n a p o n t i k k a n e n + n a p p i a + n a p p i p a r i s t o j a + n a p p u l a k e n k ä + n a r k o m a a n i t y y p i n + n a r r i e n + n a r r i n k a a v u l l a + n a r s i s s i k ä r p ä s s i e n i + n a r u t a r u + n a s e v a m m i n + n a s k a l i v y ö m e s i k k o + n a s t a k e h r ä ä j ä + n a t i o n a l i s m i a + n a t i o n a l i s m i i n + n a t i o n a l i s m i l l e + n a t i o n a l i s m i n + n a t i o n a l i s m i s t a + n a t i o n a l i s m i s y y t ö k s i i n + n a t i o n a l i s t e i h i n + n a t i o n a l i s t i e n + n a t i o n a l i s t i p u o l u e + n a t i o n a l i s t i p u o l u e e n + n a t i o n a l i s t i s e m p i + n a t i o n a l i s t i s e t + n a t i o n a l i s t i s i a + n a t i o n a l i s t i s i i n + n a t i o n a l i s t i s t e n + n a t i o n a l i s t i t y y l i s e e n + n a t o a + n a t o k a a n + n a t o m a a t + n a t o m a i d e n + n a t o o n + n a t o o n k i n + n a t r i u m a l g i n a a t i n + n a t r i u m a l u m i i n i h y d r i d i + n a t r i u m a l u m i n a a t t i + n a t r i u m a m i d i + n a t r i u m a s e t a a t t i + n a t r i u m a t s i d i + n a t r i u m b r o m i d i + n a t r i u m d i e t y y l i d i t i o k a r b a m a a t t i + n a t r i u m f l u o r i a s e t a a t t i + n a t r i u m f l u o r i d i + n a t r i u m f o s f a a t t i + n a t r i u m f o s f i i t t i + n a t r i u m g l u t a m a a t t i + n a t r i u m h e k s a f l u o r i s i l i k a a t t i + n a t r i u m h y d r o k s i d i + n a t r i u m h y d r o l y y s i m e n e t e l m ä ä + n a t r i u m j o d i d i + n a t r i u m j ä ä h d y t t e i s e t + n a t r i u m k a r b o n a a t t i + n a t r i u m k l o o r i a s e t a a t t i + n a t r i u m k l o r a a t t i + n a t r i u m k l o r i d i + n a t r i u m k l o r i d i a + n a t r i u m k r o m a a t t i + n a t r i u m m e t a v a n a d a a t t i + n a t r i u m m e t o k s i d i + n a t r i u m n i t r a a t t i + n a t r i u m n i t r i i t t i + n a t r i u m o k s i d i + n a t r i u m p e r k l o r a a t t i + n a t r i u m p e r o k s i d i + n a t r i u m p o l y a k r y l a a t t i + n a t r i u m p y r o f o s f a a t t i + n a t r i u m p y r o s u l f a a t t i + n a t r i u m p y r o s u l f i i t t i + n a t r i u m s u l f a a t t i + n a t r i u m s u l f i d i + n a t r i u m s u l f i i t t i + n a t r i u m s u p e r o k s i d i + n a t r i u m s y a n i d i + n a t r i u m t e t r a f l u o r o b o r a a t t i + n a t r i u m v e t y f o s f a a t t i + n a t r i u m v e t y k a r b o n a a t t i + n a t r i u m v e t y s u l f a a t t i + n a t r i u m v e t y s u l f i d i + n a t r i u m v e t y s u l f i i t t i + n a t s i d i k t a t u u r i + n a t s i d i k t a t u u r i n + n a t s i e n + n a t s i f a s i s m i n + n a t s i h a l l i n n o n + n a t s i h a l l i n n o s t a + n a t s i h a l l i n t o + n a t s i h a l l i n t o a + n a t s i h a l l i n t o j e n + n a t s i h a l l i n t o o n + n a t s i j o h t a j a t + n a t s i j o u k k o j a + n a t s i j ä r j e s t e l m ä s s ä + n a t s i k o r t t i + n a t s i k ä y t ä n n ö n + n a t s i l i i k k e e n + n a t s i m i e h i t t ä j i e n + n a t s i m i e h i t y k s e n + n a t s i m u r h a a j i e n + n a t s i p e r i n n ö s t ä + n a t s i p r o p a g a n d a + n a t s i p u o l u e + n a t s i p u o l u e e n + n a t s i r a a k a l a i s e t + n a t s i r e t o r i i k a l l a + n a t s i r i k o l l i s e t + n a t s i r i k o l l i s i a + n a t s i r i k o l l i s i s t a + n a t s i s m i a + n a t s i s o t a v e t e r a a n e j a + n a t s i s y m b o l e i d e n + n a t s i s y m b o l e i l l e + n a t s i s y m b o l i e n + n a t s i s y m b o l i i k k a + n a t s i t + n a t s i t e r r o r i l t a + n a t s i t e r r o r i n + n a t s i t e r v e h d y k s e n + n a t s i t e r v e h d y s + n a t s i t u n n u k s e n + n a t s i u f o t + n a t s i v a l l a n + n a t s i v a l l a s t a + n a u d a n + n a u d a n k a s v a t t a j a t + n a u d a n k a s v a t t a j i a + n a u d a n k a s v a t u k s e s s a + n a u d a n l i h a + n a u d a n l i h a a + n a u d a n l i h a a n + n a u d a n l i h a j a l o s t e i t a + n a u d a n l i h a j ä r j e s t e l m ä + n a u d a n l i h a j ä r j e s t e l y ä + n a u d a n l i h a k e s k u s t e l u n + n a u d a n l i h a k i e l t o + n a u d a n l i h a k i i s t a s t a + n a u d a n l i h a k r i i s i n + n a u d a n l i h a k y s y m y k s e s t ä + n a u d a n l i h a k y s y m y s + n a u d a n l i h a k y s y m y s t ä + n a u d a n l i h a l l a + n a u d a n l i h a m a r k k i n a t + n a u d a n l i h a m a r k k i n o i d e n + n a u d a n l i h a m a r k k i n o i h i m m e + n a u d a n l i h a m a r k k i n o i l l a + n a u d a n l i h a m a r k k i n o i l l e + n a u d a n l i h a m a r k k i n o i t a + n a u d a n l i h a m e r k i n n ä n + n a u d a n l i h a n + n a u d a n l i h a n t u o t a n n o l l e + n a u d a n l i h a n t u o t a n n o n + n a u d a n l i h a n t u o t a n n o s s a + n a u d a n l i h a n t u o t a n t o + n a u d a n l i h a n t u o t t a j a t + n a u d a n l i h a n t u o t t a j i a + n a u d a n l i h a n t u o t t a j i e n + n a u d a n l i h a n t u o t t a j i l l e + n a u d a n l i h a o n g e l m a + n a u d a n l i h a o n g e l m a n + n a u d a n l i h a p a l a + n a u d a n l i h a p a l k k i o n + n a u d a n l i h a s e k t o r i i n + n a u d a n l i h a s e k t o r i l l e + n a u d a n l i h a s o d a l l a + n a u d a n l i h a s o d a n + n a u d a n l i h a s o t a + n a u d a n l i h a s o t a a + n a u d a n l i h a s t a + n a u d a n l i h a t + n a u d a n l i h a t e o l l i s u u d e l l e + n a u d a n l i h a t e o l l i s u u d e n + n a u d a n l i h a t e o l l i s u u s + n a u d a n l i h a t e o l l i s u u t e m m e + n a u d a n l i h a t e o l l i s u u t t a + n a u d a n l i h a t o n n i n + n a u d a n l i h a t u l v a a + n a u d a n l i h a t u o m i o i s t u i n + n a u d a n l i h a t u o t a n n o n + n a u d a n l i h a t u o t a n n o s s a + n a u d a n l i h a t u o t t e e t + n a u d a n l i h a t u o t t e i d e n + n a u d a n l i h a t u o t t e i s t a + n a u d a n l i h a t u o t t e i t a + n a u d a n l i h a v u o r i + n a u d a n l i h a v u o r i a + n a u d a n l u i d e n + n a u d a n r a s v a a + n a u d a n r u h o i s t a + n a u d a n t a l i s t a + n a u d a n t u o t a n n o l l a + n a u d a n t u o t a n n o n + n a u d a t + n a u d o i l l e + n a u d o i l l e m m e + n a u h a a n + n a u h a k e r a a m i n e n + n a u h a n l i h a a + n a u h a p a r a t i i s i h a r a k k a + n a u h a s i l m u k k a + n a u h a v u o k k o k a l a + n a u k u m a t k i j a + n a u k u s u o k a n a + n a u k u t i m a l i + n a u l a n + n a u l o j a + n a u r a a k o + n a u r a t t a k o + n a u r a t t a m i s e s s a + n a u r e t t a v a a + n a u r e t t a v a k s i + n a u r e t t a v a m p a a + n a u r e t t a v a m p i + n a u r e t t a v a n + n a u r e t t a v a n a + n a u r e t t a v a t + n a u r e t t a v i a + n a u r e t t a v i k s i + n a u r e t t a v i l l a + n a u r e t t a v i n t a + n a u r e t t a v i s s a + n a u r e t t a v u u d e n + n a u r e t t a v u u d e s t a + n a u r i s p e r h o n e n + n a u r u j o o g a + n a u r u k y y h k y + n a u r u l i e j u k a n a + n a u r u l i v e r t ä j ä + n a u r u l o k k i + n a u r u n + n a u r u n a i h e + n a u r u n a l a i n e n + n a u r u n a l a i s e k s i + n a u r u n a l a i s e n + n a u r u n a l a i s i a + n a u r u n a l a i s i k s i + n a u r u t r o g o n i + n a u t a a + n a u t a e l ä i m e n + n a u t a e l ä i m e t + n a u t a e l ä i m i i n + n a u t a e l ä i m i s t ä + n a u t a e l ä i m i ä + n a u t a e l ä i n e p i d e m i a n + n a u t a e l ä i n p a l k k i o i d e n + n a u t a e l ä i n s e k t o r i l l a + n a u t a e l ä i n t e n + n a u t a e l ä i n t ä + n a u t a k a r j a a + n a u t a k a r j a n + n a u t a k a r j a n k a s v a t t a j i a + n a u t a k a r j a n k a s v a t u s t u o t t e i s i i n + n a u t a k a r j a r e h u s s a + n a u t a k a r j a r o t u j e n + n a u t a k a r j a s s a + n a u t a k a r j a s t a + n a u t a k a r j a t e o l l i s u u d e l l e + n a u t a k a r j a t e o l l i s u u t t a + n a u t a k a r j a t i l o j e n + n a u t a p a a r m a + n a u t a p e t o s t e n + n a u t a p o p u l a a t i o s t a + n a u t a r o d u i s t a + n a u t a y k s i k k ö j e n + n a u t a y k s i k k ö k e r r o i n t a + n a u t a y k s i k k ö ä + n a u t a y k s i k ö n + n a u t i n + n a u t i t t u a a n + n a u t i t t u n a + n a u t o i h i n + n a u t o j a + n a u t o j e n + n a u t t i a + n a u t t i e s s a m m e + n a u t t i i + n a u t t i k a a + n a u t t i m a a + n a u t t i m a a n + n a u t t i m i e m m e + n a u t t i s i t t e k o + n a u t t i v a t + n a u t t i v a t k i n + n a v a j o t + n a v a n y m p ä r y s t ä h t i + n a v a s s a + n a v e t a s t a + n a v i g o i d a + n a v i g o i n t i a l a l l e + n a v i g o i n t i a p u + n a v i g o i n t i j ä r j e s t e l m i e n + n a v i g o i n t i j ä r j e s t e l m i s t ä + n a v i g o i n t i j ä r j e s t e l m ä + n a v i g o i n t i j ä r j e s t e l m ä m m e + n a v i g o i n t i j ä r j e s t e l m ä n + n a v i g o i n t i j ä r j e s t e l m ä s s ä + n a v i g o i n t i j ä r j e s t e l m ä ä + n a v i g o i n t i j ä r j e s t e l y t + n a v i g o i n t i l a i t t e e n + n a v i g o i n t i l a i t t e e t + n a v i g o i n t i l a i t t e i t a + n a v i g o i n t i l i s ä j ä r j e s t e l m ä ä + n a v i g o i n t i m a h d o l l i s u u k s i a + n a v i g o i n t i m a r k k i n o i t a + n a v i g o i n t i o h j e l m a a n + n a v i g o i n t i o n g e l m a a n + n a v i g o i n t i o n g e l m i s t a + n a v i g o i n t i p a l v e l u j a + n a v i g o i n t i r e i t t i e n + n a v i g o i n t i s a t e l l i i t t i e n + n a v i g o i n t i t e k n o l o g i a s s a + n a v i g o i n t i t u r v a l l i s u u t e e n + n a v i g o i n t i u p s e e r e i n a + n a v i g o i n t i u p s e e r i + n a v i g o i n t i v e r k k o + n a v i g o i n t i v e r k k o o n + n d e b e l e t + n e g a t i i v i l i s t a a n + n e g a t i i v i s e k s i + n e g a t i i v i s e m p i + n e g a t i i v i s e n + n e g a t i i v i s e n a + n e g a t i i v i s e s s a + n e g a t i i v i s e s t a + n e g a t i i v i s i a + n e g a t i i v i s i a k i n + n e g a t i i v i s i k s i + n e g a t i i v i s i n + n e g a t i i v i s t a + n e i d o n h i u s p u u + n e i d o n h i u s s a n i a i n e n + n e i d o n k e n k ä + n e i d o n k i e l i k o i s a + n e i d o n k o r e n t o + n e i d o n l ä h d e + n e i d o n n a r s i s s i + n e i d o n v a h a k a s + n e i l i k k a v a l l a n k u m o u k s e n + n e i l i k k a v a l l a n k u m o u s + n e i l i k k a ö l j y + n e i t o k u r k i + n e i t o p e r h o n e n + n e i t o t o k k o + n e i t s e e l l i s t ä + n e i t s y t h ä k k i + n e i t s y t m a t k a + n e i t s y t m a t k a a n s a + n e i t s y t m a t k a l l a a n + n e i t s y t m a t k a l l e e n + n e i t s y t o l i i v i ö l j y n + n e i t s y t o l i i v i ö l j y s t ä + n e i t s y t o l i i v i ö l j y y n + n e i t s y t o l i i v i ö l j y ä + n e i t s y t p u h e e k s i + n e i t s y t p u h e e n + n e i t s y t p u h e e n i + n e i t s y t p u h e e n n e + n e i t s y t p u h e e n s a + n e i t s y t p u h e e s s a a n + n e i t s y t p u h e e s t a a n + n e i t s y t p u h e t t a + n e i t s y t s a a r e t + n e i t s y t s a a r t e n + n e i t s y t t o r n i + n e i t s y t ö l j y n + n e i t s y t ö l j y ä + n e i t s y y d e n + n e i t s y y s t e s t e i h i n + n e i t s y y s t e s t e j ä + n e i t s y y s t e s t i e n + n e i t s y y s t e s t i s s ä + n e i t s y y s t e s t i t + n e i t s y y t e n n e + n e k i n + n e l i a p i l a + n e l i h e n k i s e n + n e l i j u o v a h i i r i + n e l i k a i s t a i s i a + n e l i k e r r o k s i s i a + n e l i k y m m e n v u o t i s e s t a + n e l i l i i k e m ä ä r ä + n e l i l i i t t o + n e l i n + n e l i n k e r t a i n e n + n e l i n k e r t a i s e e n + n e l i n k e r t a i s e k s i + n e l i n k e r t a i s e n + n e l i n k e r t a i s e s t i + n e l i n k e r t a i s e t + n e l i n k e r t a i s i a + n e l i p i i k k i + n e l i p y ö r ä i s i ä + n e l i p y ö r ä i s t e n + n e l i p ä i n e n + n e l i p ä i v ä i n e n + n e l i p ä i v ä i s e e n + n e l i p ä i v ä i s e k s i + n e l i p ä i v ä i s e l l e + n e l i p ä i v ä i s e n + n e l i p ä i v ä i s i s t ä + n e l i r a a j a h a l v a u s t a + n e l i r a t s u p e l i + n e l i r y h m ä + n e l i s a r v i a n t i l o o p p i + n e l i s e n k y m m e n t ä + n e l i s i v u i s e s s a + n e l i t a h t i m o o t t o r e i d e n + n e l i t a h t i m o o t t o r e i h i n + n e l i t a h t i m o o t t o r e i l l a + n e l i t a h t i m o o t t o r i + n e l i t a h t i s i l l e + n e l i t a h t i s t e n + n e l i t a s o i s e n + n e l i t u n t i s e n + n e l i u l o t t e i s u u s + n e l i v a r v a s k i l p i k o n n a + n e l i v a r v a s s i i l i + n e l i v e k t o r i + n e l i v e t o + n e l i v e t o a j o n e u v o i h i n + n e l i v e t o a j o n e u v o j a + n e l i v e t o i s i a + n e l i v e t o i s i l l a + n e l i v u o t i a a t + n e l i v u o t i a i t a + n e l i v u o t i a s + n e l i v u o t i a s t a + n e l i v u o t i n e n + n e l i v u o t i s e e n + n e l i v u o t i s e l l a + n e l i v u o t i s e n + n e l i v u o t i s e s s a + n e l i v u o t i s i l l e + n e l i v u o t i s k a u d e k s i + n e l i v u o t i s k a u d e l l a + n e l i v u o t i s t a + n e l i v ä r i o n g e l m a + n e l i v ä r i s i i n + n e l i ö a s t e + n e l i ö j u u r i + n e l i ö j u u r i j ä r j e s t e l m ä + n e l i ö j u u r i t a r k i s t u k s e l l a + n e l i ö k i l o m e t r e i h i n + n e l i ö k i l o m e t r e i s t ä + n e l i ö k i l o m e t r i + n e l i ö k i l o m e t r i l l ä + n e l i ö k i l o m e t r i n + n e l i ö k i l o m e t r i ä + n e l i ö l u k u + n e l i ö m a i l i a + n e l i ö m a i l i n + n e l i ö m a s s a + n e l i ö m a t r i i s i + n e l i ö m e r i p e n i n k u l m a l l e + n e l i ö m e t r e i s s ä + n e l i ö m e t r i + n e l i ö m e t r i l l ä + n e l i ö m e t r i n + n e l i ö m e t r i ä + n e l i ö n j ä ä n n ö s + n e l i ö n j ä ä n n ö s l a u s e + n e l i ö p a l k k e j a + n e l i ö s e n t t i m e t r i e n + n e l i ö s e n t t i m e t r i n + n e l i ö s e n t t i ä + n e l i ö s e u l a + n e l i ö s i l m ä i s e n + n e l i ö s i l m ä i s i l l ä + n e l i ö s i l m ä i s i ä + n e l i ö s i l m ä n + n e l i ö s i l m ä v e r k k o a + n e l i ö s i l m ä v e r k o n + n e l j ä k s i + n e l j ä l l e + n e l j ä l l ä + n e l j ä l t ä + n e l j ä m i n u u t t i s e n + n e l j ä n + n e l j ä n k y m m e n e n k a h d e k s a n + n e l j ä n l a i s i a + n e l j ä n n e k s e l t ä + n e l j ä n n e k s i + n e l j ä n n e l l e + n e l j ä n n e n + n e l j ä n n e s m a r a t o n + n e l j ä n n e s m i l j o o n a + n e l j ä n n e s m i l j o o n a n + n e l j ä n n e s p r o s e n t i n + n e l j ä n n e s s ä + n e l j ä n n e s t u n n i n + n e l j ä n n e s t u n t i + n e l j ä n n e s t u n t i a + n e l j ä n n e s t ä + n e l j ä n n e s v u o d e n + n e l j ä n n e s v u o s i k a t s a u k s e t + n e l j ä n n e s v u o s i k a t s a u k s i a + n e l j ä n n e s v u o s i k a t s a u s + n e l j ä n n e s v u o s i k a t s a u s t a + n e l j ä n n e s v u o s i s a d a n + n e l j ä n n e s v u o s i s a t a + n e l j ä n n e s v u o s i t i e t o j e n + n e l j ä n n e s v u o s i t i l i n p i d o s t a + n e l j ä n n e s v u o s i t i l i n p i t o a + n e l j ä n n e s v u o s i t t a i n + n e l j ä n s i e n + n e l j ä n t e e n + n e l j ä n t e n ä + n e l j ä n ä + n e l j ä p ä i v ä i s t ä + n e l j ä s a t a a m i l j o o n a a + n e l j ä s o s a a + n e l j ä s o s a a n + n e l j ä s o s a v u o s i s a t a a + n e l j ä s s ä + n e l j ä s t ä + n e l j ä ä + n e l j ä ä n + n e l s o n j o k i + n e n e t s i t + n e n i i n s ä + n e n ä a p i n a + n e n ä f e t i s i s m i + n e n ä h u i l u + n e n ä h u u h t e l u + n e n ä k a r v a t + n e n ä l a s i t + n e n ä l ä v i s t y s + n e n ä o n t e l o + n e n ä s t ä + n e n ä t i p a t + n e n ä ä m m e + n e o n k i r j a i m i n + n e o n l u i k e r o + n e o n s a t e e n k a a r i k a l a + n e o n t e t r a + n e p a l i l a i s i s t a + n e p a l i l a i s t e n + n e p a l i n + n e p a l i s s a + n e p o t i s m i t o i m i n t a a + n e r o k k a a m m i n + n e r o k k a i m m i s t a + n e s t e h a p p i + n e s t e h e n g i t y s + n e s t e h o i t o + n e s t e i t ä + n e s t e k a a s u + n e s t e k a a s u a + n e s t e k a a s u l a i t t e i s t o i l l e + n e s t e k a a s u n + n e s t e k a a s u s ä i l i ö a l u k s e t + n e s t e k a a s u t e r m i n a a l e j a + n e s t e k a a s u t e r m i n a a l i e n + n e s t e k i d e n ä y t t ö + n e s t e k i e l l o n + n e s t e k r o m a t o g r a f i a + n e s t e m u o t o i s e n a + n e s t e m ä i s t e n + n e s t e p a k k a u s k a r t o n k i + n e s t e r a k e t t i + n e s t e s k a n n e r e i d e n + n e s t e s k a n n e r e i s t a + n e s t e s k a n n e r i t + n e s t e v e t y + n e s t e y t e t t y y n + n e s t e y t e t y n + n e s t e y t y k s e s t ä + n e t t i a p t e e k k i + n e t t i k a s i n o + n e t t i k a u p p a + n e t t i l a p s i a + n e t t i p a l v e l u t + n e t t i p o k e r i + n e t t i r i i p p u v u u s + n e t t i s i v u + n e t t i s i v u s t o i l l e + n e t t i s i v u s t o i l t a + n e t t i t e l e v i s i o + n e t t o a j a t t e l u + n e t t o a l i j ä ä m ä + n e t t o a r v o + n e t t o a s e m a a + n e t t o a s e m i a + n e t t o e n e r g i a + n e t t o e n e r g i a a + n e t t o e n e r g i a n t u o t t a j a + n e t t o e p ä t a s a p a i n o i l l e + n e t t o e p ä t a s a p a i n o j a + n e t t o e r o t u k s e n + n e t t o f r a n g i a + n e t t o h i n n a t + n e t t o h y ö d y n + n e t t o h y ö t y + n e t t o h y ö t y j i ä + n e t t o h y ö t y ä + n e t t o h ä v i ö t ä + n e t t o i n v e s t o i n n e i s t a + n e t t o j ä s e n m a k s u s t a + n e t t o j ä ä n n ö s t ä + n e t t o k a d o n + n e t t o k a s v u + n e t t o k a s v u u n + n e t t o k e s k i t u l o s t a + n e t t o k e s k u s t e l u a + n e t t o k e s k u s t e l u i s s a + n e t t o k o r k o t u l o + n e t t o k u l u i s t a + n e t t o k u l u j e n + n e t t o k u l u t + n e t t o k u s t a n n u k s e t + n e t t o k u s t a n n u k s i i n + n e t t o l e i k k a u s t a v o i t t e e n + n e t t o l i i k e v a i h t o + n e t t o m a a h a n m u u t t o + n e t t o m a a t a l o u s t u l o t + n e t t o m a k s a j a + n e t t o m a k s a j a a + n e t t o m a k s a j a j ä s e n v a l t i o i d e n + n e t t o m a k s a j a k e s k u s t e l u a + n e t t o m a k s a j a k e s k u s t e l u i l l e + n e t t o m a k s a j a k e s k u s t e l u l l a + n e t t o m a k s a j a k e s k u s t e l u n + n e t t o m a k s a j a k e s k u s t e l u n n e + n e t t o m a k s a j a k e s k u s t e l u s s a + n e t t o m a k s a j a k s i + n e t t o m a k s a j a k y s y m y s t ä + n e t t o m a k s a j a k ä s i t t e e s e e n + n e t t o m a k s a j a m a a t + n e t t o m a k s a j a m a i d e n + n e t t o m a k s a j a m a i s s a + n e t t o m a k s a j a m a i s t a + n e t t o m a k s a j a m a i t a + n e t t o m a k s a j a n + n e t t o m a k s a j a n a + n e t t o m a k s a j a o n g e l m a a + n e t t o m a k s a j a r y h m ä + n e t t o m a k s a j a s t a + n e t t o m a k s a j a t + n e t t o m a k s a j a t a s e i s t a a n + n e t t o m a k s a j a v a l t i o i d e n + n e t t o m a k s a j a v a l t i o t + n e t t o m a k s a j a v a l t i o t a + n e t t o m a k s a j i a + n e t t o m a k s a j i e n + n e t t o m a k s a j i k s i + n e t t o m a k s a j i l l a + n e t t o m a k s a j i l l e + n e t t o m a k s a j i l t a + n e t t o m a k s a j i n a + n e t t o m a k s a j i s t a + n e t t o m a k s u + n e t t o m a k s u j a + n e t t o m a k s u j e n + n e t t o m a k s u n + n e t t o m a k s u o s u u d e n + n e t t o m a k s u o s u u d e s t a + n e t t o m a k s u o s u u d e t + n e t t o m a k s u o s u u k s i a a n + n e t t o m a k s u o s u u k s i e n + n e t t o m a k s u o s u u k s i s t a + n e t t o m a k s u o s u u s + n e t t o m a k s u o s u u t e e n s a + n e t t o m a k s u o s u u t e m m e + n e t t o m a k s u o s u u t t a + n e t t o m a k s u s t a + n e t t o m a k s u t + n e t t o m a k s u t i l a n n e t t a + n e t t o m e n o i s t a + n e t t o m e n o j a + n e t t o m i t t o j a + n e t t o m ä ä r ä + n e t t o m ä ä r ä i s e n + n e t t o n y k y a r v o + n e t t o p a i n o + n e t t o p a l k a n + n e t t o p a l k a t + n e t t o p a l k k a a + n e t t o p a l k k a t a s o a + n e t t o p a l k k o j a + n e t t o p a l k o i l l e + n e t t o p ä ä o m a n + n e t t o r a h o i t t a j a + n e t t o r a h o i t u s o i k a i s u t + n e t t o r a h o i t u s o s u u k s i e n + n e t t o r a h o i t u s o s u u t t a a n + n e t t o s a a j a + n e t t o s a a j a j ä s e n v a l t i o t + n e t t o s a a j a m a a t + n e t t o s a a j a m a i t a + n e t t o s a a j a t + n e t t o s a a j i a + n e t t o s a a j i e n + n e t t o s a a j i l l a + n e t t o s a a j i l l e + n e t t o s a a j i s t a + n e t t o s a a m i s e t + n e t t o s a l d o i h i n + n e t t o s a l d o j a + n e t t o s a l d o j e n + n e t t o s a l d o n + n e t t o s i i r t o j a + n e t t o s i i r t o j e n + n e t t o s i i r t o n a + n e t t o s u b v e n t i o e k v i v a l e n t t i n a + n e t t o s u m m i i n + n e t t o s ä ä s t ö t + n e t t o t a s a p a i n o n + n e t t o t a s e i s i i n + n e t t o t a s e t t a + n e t t o t a v o i t e + n e t t o t u k i + n e t t o t u l o + n e t t o t u l o a + n e t t o t u l o i s t a + n e t t o t u l o i s t a a n + n e t t o t u l o j a a n + n e t t o t u l o j e n + n e t t o t u l o k s e n a + n e t t o t u l o k s e s t a + n e t t o t u l o n s i i r t o i h i n + n e t t o t u l o s + n e t t o t u l o t + n e t t o t u o j a + n e t t o t u o j a k s i + n e t t o t u o j i a + n e t t o t u o n t i + n e t t o t u o t e k e t j u + n e t t o t u o t o s t a + n e t t o t u o t t o + n e t t o t u o t t o a + n e t t o t y ö p a i k k a a + n e t t o t y ö p a i k k o j a + n e t t o v a i k u t u k s e t + n e t t o v a i k u t u s + n e t t o v a r a l l i s u u d e n + n e t t o v a r a l l i s u u s + n e t t o v a r a t + n e t t o v e l k a a n t u m i n e n + n e t t o v e l k a a n t u n e i s u u t t a + n e t t o v e l k o j a + n e t t o v e r o n m a k s a j a m a i d e n + n e t t o v i e j i ä + n e t t o v i e j ä + n e t t o v i e j ä k s i + n e t t o v i e j ä n + n e t t o v i e j ä s t ä + n e t t o v i e n n i s t ä + n e t t o v i e n t i + n e t t o v i e n t i m a i h i n + n e t t o v i e n t i m a i s s a + n e t t o v i e n t i ä + n e t t o v o i t o n + n e t t o v o i t o s s a + n e t t o v o i t o s t a a n + n e t t o v o i t o t + n e t t o v o i t t o + n e t t o v o i t t o a + n e t t o v o i t t o o n + n e t t o v ä e s t ö n k a s v u + n e t t o v ä h e n e m i s t ä + n e t t o v ä h e n n y k s e n + n e t t o v ä h e n n y k s e t + n e t t o v ä h e n n y s + n e t t o v ä h e n n y s t ä + n e u l a e r a k k o k o l i b r i + n e u l a k y n s i g a l a g o t + n e u l a n p i s t o t a p a t u r m a n + n e u l a n p i s t o t a p a t u r m i a + n e u l a n p i s t o t a p a t u r m i e n + n e u l a n p i s t o t a p a t u r m i s t a + n e u l a n p i s t o v a h i n g o t + n e u l a n p i s t o v a h i n k o j a + n e u l a n p i s t o v a m m a t + n e u l a n p i s t o v a m m o i l t a + n e u l a n p i s t o v a m m o i s t a + n e u l a n s i l m ä + n e u l a n s i l m ä ä n + n e u l a n v a i h t o + n e u l a s m a a t ä h t i + n e u l a v a h i n g o i l t a + n e u l a v i u l u + n e u l e a l a n + n e u l e g r a f f i t i + n e u l e k o n e + n e u l o j e n + n e u l o j e n v a i h t o + n e u r o b i o l o g i s e t + n e u r o l o g i s i a + n e u r o l o g i s i s t a + n e u r o o s i p a n d e m i a s t a + n e u r o t i e t e e s t ä + n e u r o v e r k o t + n e u t r a a l e j a + n e u t r a a l i a + n e u t r a a l i l l a + n e u t r a a l i m m i n + n e u t r a a l i m p a a + n e u t r a a l i m p a a n + n e u t r a a l i m p i + n e u t r a a l i s u u d e s t a + n e u t r a l i s a a t i o t e k n i i k k a + n e u t r a l i s o i m i s e k s i + n e u t r a l o i m i s e k s i + n e u t r i i n o t a u s t a + n e u t r o n i a k t i v o i n t i + n e u t r o n i e m i s s i o + n e u t r o n i p o m m i + n e u t r o n i s ä t e i l y + n e u t r o n i t ä h t i + n e u v o a + n e u v o a n t a j i e n + n e u v o i + n e u v o i s i n + n e u v o i s i n k i n + n e u v o i s t a + n e u v o j a n i + n e u v o j e n + n e u v o k k a a l l a + n e u v o k k a a m p i a + n e u v o k k u u d e l l a a n + n e u v o m a s t a + n e u v o m m e k i n + n e u v o n + n e u v o n a n t a j a + n e u v o n a n t a j a j ä s e n + n e u v o n a n t a j a l l e + n e u v o n a n t a j a n a + n e u v o n a n t a j a n r o o l i n + n e u v o n a n t a j a p i i r i + n e u v o n a n t a j a r y h m ä + n e u v o n a n t a j a r y h m ä n + n e u v o n a n t a j a r y h m ä ä + n e u v o n a n t a j i a + n e u v o n a n t a j i e n + n e u v o n a n t a j i s t a + n e u v o n a n t o + n e u v o n a n t o t e h t ä v i ä + n e u v o n k i n + n e u v o n n a n + n e u v o n n a s t a + n e u v o n t a a + n e u v o n t a j ä r j e s t e l m i ä + n e u v o n t a j ä r j e s t e l m ä + n e u v o n t a j ä r j e s t e l m ä n + n e u v o n t a k e s k u k s e n + n e u v o n t a k e s k u k s e t + n e u v o n t a k e s k u k s i a + n e u v o n t a k e s k u s + n e u v o n t a k e s k u s t a + n e u v o n t a k o m i t e a n + n e u v o n t a k y s y m y k s e e n + n e u v o n t a k ä y t ä n t ö + n e u v o n t a l a u t a k u n t a + n e u v o n t a p a k e t t i + n e u v o n t a p a l v e l u + n e u v o n t a p a l v e l u i d e n + n e u v o n t a p a l v e l u i h i n + n e u v o n t a p a l v e l u i s s a + n e u v o n t a p a l v e l u i s t a + n e u v o n t a p a l v e l u j a + n e u v o n t a p a l v e l u j e n + n e u v o n t a p a l v e l u n + n e u v o n t a p a l v e l u t + n e u v o n t a p i s t e e n + n e u v o n t a p o r t a a l i a + n e u v o n t a p u h e l i m e n + n e u v o n t a p u h e l i m i e n + n e u v o n t a r y h m ä n + n e u v o n t a t e h t ä v i e n + n e u v o n t a t o i m i s t o + n e u v o n t a t o i m i s t o j a + n e u v o n t a t u k e a + n e u v o o + n e u v o s t o a + n e u v o s t o a i k o i n a + n e u v o s t o a i k o j a + n e u v o s t o a i k o j e n + n e u v o s t o a j a l t a + n e u v o s t o a j a n + n e u v o s t o a l u e i l l a + n e u v o s t o a r m e i j a + n e u v o s t o a r m e i j a a + n e u v o s t o a r m e i j a n + n e u v o s t o b l o k i n + n e u v o s t o b l o k i s t a + n e u v o s t o b l o k k i + n e u v o s t o b o l s h e v i k k e j a + n e u v o s t o b y r o k r a t i a n + n e u v o s t o d i k t a a t t o r i + n e u v o s t o d i k t a t u u r i + n e u v o s t o d i k t a t u u r i e n + n e u v o s t o h a l l i n n o n + n e u v o s t o h a l l i n n o s t a + n e u v o s t o h a l l i n t o + n e u v o s t o h a l l i t u k s e n + n e u v o s t o h a n + n e u v o s t o h i s t o r i a n + n e u v o s t o i d e n t i t e e t i n + n e u v o s t o i d e o l o g i a n + n e u v o s t o i l l e + n e u v o s t o i m p e r i a l i s m i n + n e u v o s t o i m p e r i u m i + n e u v o s t o i m p e r i u m i a + n e u v o s t o i m p e r i u m i n + n e u v o s t o i s s a + n e u v o s t o j e n + n e u v o s t o j o h t a j a + n e u v o s t o j o h t a j i s t a + n e u v o s t o j o h t o + n e u v o s t o j o u k k o j a + n e u v o s t o j o u k k o j e n + n e u v o s t o j o u k o t + n e u v o s t o j ä r j e s t e l m ä + n e u v o s t o j ä r j e s t e l m ä l l e + n e u v o s t o j ä r j e s t e l m ä n + n e u v o s t o j ä r j e s t e l m ä s s ä + n e u v o s t o j ä r j e s t e l m ä s t ä + n e u v o s t o j ä r j e s t e l m ä ä + n e u v o s t o j ä r j e s t e l m ä ä n + n e u v o s t o k a l e n t e r i + n e u v o s t o k a n s a l a i s i l l e + n e u v o s t o k a n s a l a i s t a + n e u v o s t o k a n s a l a i s t e n + n e u v o s t o k a u d e l l a + n e u v o s t o k a u d e l l a k i n + n e u v o s t o k a u d e n + n e u v o s t o k i n + n e u v o s t o k o + n e u v o s t o k o m m u n i s m i + n e u v o s t o k o m m u n i s m i n + n e u v o s t o k o m m u n i s t i e n + n e u v o s t o l e i r i s t ä + n e u v o s t o l i i t o + n e u v o s t o l i i t o a + n e u v o s t o l i i t o k s i + n e u v o s t o l i i t o l l e + n e u v o s t o l i i t o l t a + n e u v o s t o l i i t o n + n e u v o s t o l i i t o s s a + n e u v o s t o l i i t o s t a + n e u v o s t o l i i t t o + n e u v o s t o l i i t t o a + n e u v o s t o l i i t t o l a i n e n + n e u v o s t o l i i t t o l a i s t y y p p i s e n + n e u v o s t o l i i t t o o n + n e u v o s t o l l a + n e u v o s t o l l a k i n + n e u v o s t o l l e + n e u v o s t o l l e k i n + n e u v o s t o l t a + n e u v o s t o l t a k i n + n e u v o s t o m a l l i s t a + n e u v o s t o m e n n e i s y y d e n + n e u v o s t o m e n t a l i t e e t i n + n e u v o s t o m i e h i t t ä j i e n + n e u v o s t o m i e h i t y k s e n + n e u v o s t o m i e h i t y k s e s t ä + n e u v o s t o m i e h i t y s + n e u v o s t o m i e h i t y s t ä + n e u v o s t o m i e l i s e n + n e u v o s t o n + n e u v o s t o n k i n + n e u v o s t o o n + n e u v o s t o p a n s s a r i t + n e u v o s t o p a r l a m e n t i s s a + n e u v o s t o p a r t i s a a n i t + n e u v o s t o p r o p a g a n d a + n e u v o s t o s o r r o n + n e u v o s t o s o r r o s t a + n e u v o s t o s o s i a l i s m i a + n e u v o s t o s s a + n e u v o s t o s s a k a a n + n e u v o s t o s s a k i n + n e u v o s t o s t a + n e u v o s t o s t a l i n i s t i t + n e u v o s t o t a l o u d e n + n e u v o s t o t a l o u s + n e u v o s t o t a s a v a l l a n + n e u v o s t o t a s a v a l l a s s a + n e u v o s t o t a s a v a l l a s t a + n e u v o s t o t a s a v a l l a t + n e u v o s t o t a s a v a l l o i s s a + n e u v o s t o t a s a v a l l o i s t a + n e u v o s t o t a s a v a l t a + n e u v o s t o t a s a v a l t a n s a + n e u v o s t o t a s a v a l t o i h i n + n e u v o s t o t a s a v a l t o j e n + n e u v o s t o t e k n i i k k a a + n e u v o s t o t o t a l i t a r i s m i + n e u v o s t o t o t a l i t a r i s m i n + n e u v o s t o t y y l i n e n + n e u v o s t o t y y l i s e n + n e u v o s t o t y y l i s e s s ä + n e u v o s t o t y y l i s e t + n e u v o s t o t y y l i s t e n + n e u v o s t o t y y l i s t ä + n e u v o s t o t y y p p i n e n + n e u v o s t o v a l l a n + n e u v o s t o v a l m i s t e i s e t + n e u v o s t o v a l m i s t e i s i a + n e u v o s t o v a l t a + n e u v o s t o v a l t a a + n e u v o s t o v a l t a a n + n e u v o s t o v a l t i o i s s a + n e u v o s t o v a l t i o i t a + n e u v o s t o v a l t i o t + n e u v o s t o v a p a u t t a j a n + n e u v o s t o v a s t a i s i k s i + n e u v o s t o v a s t a i s t e n + n e u v o s t o v a s t a i s u u s + n e u v o s t o v e n ä j ä + n e u v o s t o v e n ä j ä l l e + n e u v o s t o v i r a n o m a i s e t + n e u v o t + n e u v o t e l k a a m m e + n e u v o t e l l a + n e u v o t e l l a a n + n e u v o t e l l e e t + n e u v o t e l l e s s a + n e u v o t e l l e s s a a n + n e u v o t e l l e s s a m m e + n e u v o t e l l u n + n e u v o t e l l u t + n e u v o t e l t a e s s a + n e u v o t e l t a i s i i n + n e u v o t e l t a v a + n e u v o t e l t a v a n a + n e u v o t e l t a v i a + n e u v o t e l t a v i n a + n e u v o t e l t a v i s s a + n e u v o t e l t i i n + n e u v o t e l t u a + n e u v o t e l t u a a n + n e u v o t e l t u a n i + n e u v o t t e l e e + n e u v o t t e l e m a a n + n e u v o t t e l e m a l l a + n e u v o t t e l e m a n + n e u v o t t e l e m a s s a + n e u v o t t e l e m a t t a + n e u v o t t e l e m i s e s s a + n e u v o t t e l e m i s e s t a + n e u v o t t e l e m i s t a + n e u v o t t e l e m m e + n e u v o t t e l e m m e k o + n e u v o t t e l e t t e k o + n e u v o t t e l e v a t + n e u v o t t e l i j a k o l l e g a a n i + n e u v o t t e l i j a m a i l l e + n e u v o t t e l i j a n + n e u v o t t e l i j a n a + n e u v o t t e l i j a r y h m ä ä n s ä + n e u v o t t e l i j o i d e n + n e u v o t t e l i j o i l l e + n e u v o t t e l i j o i l t a k i n + n e u v o t t e l i j o i t a + n e u v o t t e l u a + n e u v o t t e l u a i h e + n e u v o t t e l u a i h e i n a + n e u v o t t e l u a i h e i s i i n + n e u v o t t e l u a i h e i s s a + n e u v o t t e l u a i k a a + n e u v o t t e l u a i k a n a + n e u v o t t e l u a i k a t a u l u + n e u v o t t e l u a i k a t a u l u i s t a + n e u v o t t e l u a l o i l l a + n e u v o t t e l u a l o i t t e i d e n + n e u v o t t e l u a l u e + n e u v o t t e l u a r e e n a n + n e u v o t t e l u a s e e n a + n e u v o t t e l u a s e m a + n e u v o t t e l u a s e m a a + n e u v o t t e l u a s e m a a m m e + n e u v o t t e l u a s e m a a n + n e u v o t t e l u a s e m a a n n e + n e u v o t t e l u a s e m a a n s a + n e u v o t t e l u a s e m a l l e m m e + n e u v o t t e l u a s e m a m m e + n e u v o t t e l u a s e m a n + n e u v o t t e l u a s e m a n a + n e u v o t t e l u a s e m a n n e + n e u v o t t e l u a s e m a n s a + n e u v o t t e l u a s e m a s s a + n e u v o t t e l u a s e m a s t a + n e u v o t t e l u a s e m a t + n e u v o t t e l u a s e m i a + n e u v o t t e l u a s e m i a m m e + n e u v o t t e l u a s e m i e n + n e u v o t t e l u a s e m i i n + n e u v o t t e l u a s e m i s s a + n e u v o t t e l u a s e m i s t a + n e u v o t t e l u a s e n n e + n e u v o t t e l u a s e n n e t t a + n e u v o t t e l u a s e n t e e s t a + n e u v o t t e l u a s e n t e e s t a a n + n e u v o t t e l u a s e t e l m i s t a + n e u v o t t e l u a s i a + n e u v o t t e l u a s i a k i r j a + n e u v o t t e l u a s i a k i r j a n + n e u v o t t e l u a s i a k i r j a s s a + n e u v o t t e l u a s i a k i r j a t + n e u v o t t e l u a s i a k i r j o i h i n + n e u v o t t e l u a s i a k i r j o j e n + n e u v o t t e l u a s i a l i s t a n + n e u v o t t e l u d i r e k t i i v i e n + n e u v o t t e l u d i r e k t i i v i l u o n n o k s i a + n e u v o t t e l u d i r e k t i i v i s s ä + n e u v o t t e l u d r a a m a + n e u v o t t e l u d y n a m i i k k a + n e u v o t t e l u e d u i s t a + n e u v o t t e l u e h d o t + n e u v o t t e l u e h d o t u k s i a + n e u v o t t e l u e h d o t u k s i s s a + n e u v o t t e l u e h d o t u s + n e u v o t t e l u e h t o j a + n e u v o t t e l u e h t o j e n + n e u v o t t e l u e l i m e e n + n e u v o t t e l u e l i m e n + n e u v o t t e l u e l i m e t + n e u v o t t e l u e s i m e r k k e j ä + n e u v o t t e l u e s i t y s t e n + n e u v o t t e l u f o o r u m e i h i n + n e u v o t t e l u f o o r u m i + n e u v o t t e l u f o o r u m i n a + n e u v o t t e l u h a l u a + n e u v o t t e l u h a l u k k u u d e s t a + n e u v o t t e l u h a l u k k u u t t a + n e u v o t t e l u h a l u s t a a n + n e u v o t t e l u h a n k k e i t a + n e u v o t t e l u h i s t o r i a s s a m m e + n e u v o t t e l u h u o n e e n + n e u v o t t e l u h u o n e i d e n + n e u v o t t e l u h u o n e i s s a + n e u v o t t e l u i d e n + n e u v o t t e l u i h i n + n e u v o t t e l u i l l a + n e u v o t t e l u i l l e + n e u v o t t e l u i l m a p i i r i n + n e u v o t t e l u i l m a p i i r i ä + n e u v o t t e l u i l m a s t o n + n e u v o t t e l u i s s a + n e u v o t t e l u i s s a m m e + n e u v o t t e l u i s t a + n e u v o t t e l u i s t a a n + n e u v o t t e l u i s t u n n o i s t a + n e u v o t t e l u i s t u n n o n + n e u v o t t e l u i s t u n n o s s a + n e u v o t t e l u i s t u n t o + n e u v o t t e l u i s t u n t o j a + n e u v o t t e l u i t a + n e u v o t t e l u j a + n e u v o t t e l u j a a n + n e u v o t t e l u j a k s o + n e u v o t t e l u j a k s o n + n e u v o t t e l u j a k s o t + n e u v o t t e l u j e n + n e u v o t t e l u j o u s t a v u u d e n + n e u v o t t e l u j ä r j e s t e l m ä + n e u v o t t e l u j ä r j e s t e l m ä n + n e u v o t t e l u k a n n a l l a + n e u v o t t e l u k a n n a l l e + n e u v o t t e l u k a n n a n + n e u v o t t e l u k a n n a s s a + n e u v o t t e l u k a n n a s s a a n + n e u v o t t e l u k a n n a s t a + n e u v o t t e l u k a n n a s t a a n + n e u v o t t e l u k a n n a t + n e u v o t t e l u k a n n o i s s a + n e u v o t t e l u k a n n o i s t a a n + n e u v o t t e l u k a n t a + n e u v o t t e l u k a n t a a + n e u v o t t e l u k a n t a a n + n e u v o t t e l u k a n t a m m e + n e u v o t t e l u k a n t a n s a + n e u v o t t e l u k a n t o i h i n + n e u v o t t e l u k a n t o j a + n e u v o t t e l u k a p a s i t e e t t i a + n e u v o t t e l u k a p p a l e i t a + n e u v o t t e l u k a u d e n + n e u v o t t e l u k a u s i + n e u v o t t e l u k e h y k s e e n + n e u v o t t e l u k e h y k s e n + n e u v o t t e l u k e h y k s e n ä + n e u v o t t e l u k e h y k s e s s ä + n e u v o t t e l u k e h y s + n e u v o t t e l u k e h y s l u o n n o k s e n + n e u v o t t e l u k e h y s l u o n n o k s e s s a + n e u v o t t e l u k e h y s t ä + n e u v o t t e l u k e i n o j a + n e u v o t t e l u k e i n o n a + n e u v o t t e l u k e i n o t + n e u v o t t e l u k e l p o i s i a + n e u v o t t e l u k e n t ä n + n e u v o t t e l u k i e r r o k s e e n + n e u v o t t e l u k i e r r o k s e l l a + n e u v o t t e l u k i e r r o k s e l l a m m e + n e u v o t t e l u k i e r r o k s e l l e + n e u v o t t e l u k i e r r o k s e l t a + n e u v o t t e l u k i e r r o k s e n + n e u v o t t e l u k i e r r o k s e s s a + n e u v o t t e l u k i e r r o k s e s t a + n e u v o t t e l u k i e r r o k s e t + n e u v o t t e l u k i e r r o k s i a + n e u v o t t e l u k i e r r o k s i i n + n e u v o t t e l u k i e r r o k s i l l a + n e u v o t t e l u k i e r r o k s i l l e + n e u v o t t e l u k i e r r o k s i s s a + n e u v o t t e l u k i e r r o s + n e u v o t t e l u k i e r r o s t a + n e u v o t t e l u k i e r r o s t e n + n e u v o t t e l u k o h d a n + n e u v o t t e l u k o h d a t + n e u v o t t e l u k o h d i s t a + n e u v o t t e l u k o h t a + n e u v o t t e l u k o h t e i d e n + n e u v o t t e l u k o k e m u s t a + n e u v o t t e l u k o k o n a i s u u d e s t a + n e u v o t t e l u k o k o n a i s u u t t a + n e u v o t t e l u k o k o u k s e e n + n e u v o t t e l u k o k o u k s e n + n e u v o t t e l u k o k o u k s e s s a + n e u v o t t e l u k o k o u k s e t + n e u v o t t e l u k o k o u k s i i n + n e u v o t t e l u k o k o u k s i s s a + n e u v o t t e l u k o k o u s + n e u v o t t e l u k o m i t e a + n e u v o t t e l u k o m i t e a a n + n e u v o t t e l u k o m i t e a n + n e u v o t t e l u k o m i t e o i d e n + n e u v o t t e l u k o m p r o m i s s i a + n e u v o t t e l u k o m p r o m i s s i s t a + n e u v o t t e l u k o n e i s t o + n e u v o t t e l u k o n f e r e n s s i + n e u v o t t e l u k o n f e r e n s s i i n + n e u v o t t e l u k o n f e r e n s s i n + n e u v o t t e l u k o r t t i n a + n e u v o t t e l u k o r t t i n a a n + n e u v o t t e l u k u m p p a n e i d e m m e + n e u v o t t e l u k u m p p a n e i d e n + n e u v o t t e l u k u m p p a n e i k s e e n + n e u v o t t e l u k u m p p a n e i l l e + n e u v o t t e l u k u m p p a n e i l l e e n + n e u v o t t e l u k u m p p a n e i l l e m m e + n e u v o t t e l u k u m p p a n e i l t a + n e u v o t t e l u k u m p p a n e i l t a m m e + n e u v o t t e l u k u m p p a n e i n a + n e u v o t t e l u k u m p p a n e i s t a + n e u v o t t e l u k u m p p a n e i s t a m m e + n e u v o t t e l u k u m p p a n e i t a + n e u v o t t e l u k u m p p a n e i t a a n + n e u v o t t e l u k u m p p a n e i t a m m e + n e u v o t t e l u k u m p p a n i + n e u v o t t e l u k u m p p a n i a + n e u v o t t e l u k u m p p a n i e n + n e u v o t t e l u k u m p p a n i e n n e + n e u v o t t e l u k u m p p a n i e n s a + n e u v o t t e l u k u m p p a n i k s i + n e u v o t t e l u k u m p p a n i m m e + n e u v o t t e l u k u m p p a n i n + n e u v o t t e l u k u m p p a n i n a + n e u v o t t e l u k u m p p a n i n i + n e u v o t t e l u k u m p p a n i s t a m m e + n e u v o t t e l u k u m p p a n i t + n e u v o t t e l u k u n t a + n e u v o t t e l u k u n t a a + n e u v o t t e l u k u n t a a m m e + n e u v o t t e l u k y k y ä + n e u v o t t e l u k y k y ä ä n + n e u v o t t e l u k y s y m y k s e n + n e u v o t t e l u k y s y m y k s e t + n e u v o t t e l u k y s y m y k s i ä + n e u v o t t e l u k y s y m y s + n e u v o t t e l u k y v y n + n e u v o t t e l u k ä y t ä n t ö + n e u v o t t e l u k ä y t ä n t ö j e n + n e u v o t t e l u k ä y t ä n t ö ä n n e + n e u v o t t e l u l i n j o j e n + n e u v o t t e l u l u k u + n e u v o t t e l u l u k u a + n e u v o t t e l u l u k u j a + n e u v o t t e l u l u k u j e n + n e u v o t t e l u l u k u u n + n e u v o t t e l u l u v u i l l e + n e u v o t t e l u l u v u i s t a + n e u v o t t e l u l u v u n + n e u v o t t e l u l u v u s s a + n e u v o t t e l u l u v u s t a + n e u v o t t e l u l u v u t + n e u v o t t e l u l ä h t ö k o h t a + n e u v o t t e l u m a h d o l l i s u u d e t + n e u v o t t e l u m a h d o l l i s u u k s i a + n e u v o t t e l u m a h d o l l i s u u k s i a a n + n e u v o t t e l u m a h d o l l i s u u s + n e u v o t t e l u m a l l i + n e u v o t t e l u m a l l i l l e + n e u v o t t e l u m a n d a a t i l l e + n e u v o t t e l u m a n d a a t i n + n e u v o t t e l u m a n d a a t i s s a + n e u v o t t e l u m a n d a a t i s t a + n e u v o t t e l u m a n d a a t t i + n e u v o t t e l u m a n d a a t t i a + n e u v o t t e l u m a n d a a t t i a a n + n e u v o t t e l u m a n d a a t t i i n + n e u v o t t e l u m a n d a a t t i m m e + n e u v o t t e l u m a r a t o n i s s a + n e u v o t t e l u m e k a n i s m e i h i n + n e u v o t t e l u m e k a n i s m i i n + n e u v o t t e l u m e n e t e l m i s t ä + n e u v o t t e l u m e n e t e l m i ä + n e u v o t t e l u m e n e t e l m ä + n e u v o t t e l u m e n e t t e l y + n e u v o t t e l u m e n e t t e l y i s t ä + n e u v o t t e l u m e n e t t e l y j e n + n e u v o t t e l u m e n e t t e l y j ä + n e u v o t t e l u m e n e t t e l y n + n e u v o t t e l u m e n e t t e l y s s ä + n e u v o t t e l u m e n e t t e l y s t ä + n e u v o t t e l u m e n e t t e l y t + n e u v o t t e l u m e n e t t e l y y n + n e u v o t t e l u m e n e t t e l y ä + n e u v o t t e l u m u o d o s t a + n e u v o t t e l u m u o t o + n e u v o t t e l u m u o t o a + n e u v o t t e l u n + n e u v o t t e l u n s a + n e u v o t t e l u n ä k ö k u l m a s t a + n e u v o t t e l u o h j e e t + n e u v o t t e l u o h j e i d e n + n e u v o t t e l u o h j e i k s i + n e u v o t t e l u o h j e i l l e + n e u v o t t e l u o h j e i s i i n + n e u v o t t e l u o h j e i s s a + n e u v o t t e l u o h j e i s s a m m e + n e u v o t t e l u o h j e i s t a + n e u v o t t e l u o h j e i t a + n e u v o t t e l u o h j e l m a + n e u v o t t e l u o h j e l m a a + n e u v o t t e l u o h j e l m a a n + n e u v o t t e l u o h j e l m a n + n e u v o t t e l u o h j e l m a s s a + n e u v o t t e l u o h j e l m a s t a + n e u v o t t e l u o i k e u k s i a + n e u v o t t e l u o i k e u s + n e u v o t t e l u o n g e l m i i n + n e u v o t t e l u o s a p u o l e k s i + n e u v o t t e l u o s a p u o l e t + n e u v o t t e l u o s a p u o l i + n e u v o t t e l u o s a p u o l i a + n e u v o t t e l u o s a p u o l i l l e + n e u v o t t e l u o s a p u o l t a + n e u v o t t e l u o s a p u o l t e n + n e u v o t t e l u p a i n e i t a + n e u v o t t e l u p a k e t i n + n e u v o t t e l u p a k e t i s s a m m e + n e u v o t t e l u p a k e t i s t a + n e u v o t t e l u p a k e t t i a + n e u v o t t e l u p a k e t t i i n + n e u v o t t e l u p e l i k s i + n e u v o t t e l u p e r i a a t t e e n i + n e u v o t t e l u p e r i a a t t e i s i i n + n e u v o t t e l u p e r i n t e i s t ä + n e u v o t t e l u p e r u s t a + n e u v o t t e l u p e r u s t a n a + n e u v o t t e l u p o h j a + n e u v o t t e l u p o h j a a + n e u v o t t e l u p o l i t i i k a n + n e u v o t t e l u p o l i t i i k k a a + n e u v o t t e l u p o l i t i i k k a n s a + n e u v o t t e l u p o l k u a + n e u v o t t e l u p o n n i s t e l u j a + n e u v o t t e l u p o n n i s t u k s i a + n e u v o t t e l u p r o s e s s e i h i n + n e u v o t t e l u p r o s e s s e i s s a + n e u v o t t e l u p r o s e s s e j a + n e u v o t t e l u p r o s e s s i + n e u v o t t e l u p r o s e s s i a + n e u v o t t e l u p r o s e s s i e n + n e u v o t t e l u p r o s e s s i i n + n e u v o t t e l u p r o s e s s i l l e + n e u v o t t e l u p r o s e s s i l t a + n e u v o t t e l u p r o s e s s i n + n e u v o t t e l u p r o s e s s i s s a + n e u v o t t e l u p r o s e s s i s t a + n e u v o t t e l u p r o s e s s i t + n e u v o t t e l u p u i t t e e t + n e u v o t t e l u p u i t t e i d e n + n e u v o t t e l u p u i t t e i t a + n e u v o t t e l u p u o l e t + n e u v o t t e l u p y r k i m y k s i ä + n e u v o t t e l u p y r k i m y k s i ä ä n + n e u v o t t e l u p ä ä o m a + n e u v o t t e l u p ö y d i l l ä + n e u v o t t e l u p ö y d i s s ä + n e u v o t t e l u p ö y d ä l l e + n e u v o t t e l u p ö y d ä n + n e u v o t t e l u p ö y d ä s s ä + n e u v o t t e l u p ö y d ä s t ä + n e u v o t t e l u p ö y t i e n + n e u v o t t e l u p ö y t i i n + n e u v o t t e l u p ö y t ä k i r j a n a + n e u v o t t e l u p ö y t ä ä + n e u v o t t e l u p ö y t ä ä n + n e u v o t t e l u r a j a t + n e u v o t t e l u r a k e n n e + n e u v o t t e l u r a k e n n e t t a a n + n e u v o t t e l u r a k e n t e e t + n e u v o t t e l u r a t k a i s u + n e u v o t t e l u r a t k a i s u a + n e u v o t t e l u r a t k a i s u i l l a + n e u v o t t e l u r a t k a i s u i l l e + n e u v o t t e l u r a t k a i s u i s t a + n e u v o t t e l u r a t k a i s u j e n + n e u v o t t e l u r a t k a i s u l l a + n e u v o t t e l u r a t k a i s u l l e + n e u v o t t e l u r a t k a i s u n + n e u v o t t e l u r a t k a i s u s s a + n e u v o t t e l u r a t k a i s u s t a + n e u v o t t e l u r a t k a i s u t + n e u v o t t e l u r a t k a i s u u n + n e u v o t t e l u r i n t a m a s s a + n e u v o t t e l u r y h m i e n + n e u v o t t e l u r y h m i i n + n e u v o t t e l u r y h m i l l e + n e u v o t t e l u r y h m i ä + n e u v o t t e l u r y h m ä + n e u v o t t e l u r y h m ä l l e + n e u v o t t e l u r y h m ä l l e e n + n e u v o t t e l u r y h m ä l l ä + n e u v o t t e l u r y h m ä n + n e u v o t t e l u r y h m ä n s ä + n e u v o t t e l u r y h m ä s s ä + n e u v o t t e l u r y h m ä s t ä m m e + n e u v o t t e l u r y h m ä ä + n e u v o t t e l u r y h m ä ä m m e + n e u v o t t e l u r y h m ä ä n + n e u v o t t e l u r y h m ä ä n n e + n e u v o t t e l u r y h m ä ä n s ä + n e u v o t t e l u s a a v u t u s t a + n e u v o t t e l u s i t o u m u k s i a + n e u v o t t e l u s o p i m u k s e e n + n e u v o t t e l u s o p i m u s + n e u v o t t e l u s s a + n e u v o t t e l u s t a + n e u v o t t e l u s t r a t e g i a + n e u v o t t e l u s t r a t e g i a a + n e u v o t t e l u s t r a t e g i a a m m e + n e u v o t t e l u s t r a t e g i a a n + n e u v o t t e l u s t r a t e g i a l l e + n e u v o t t e l u s t r a t e g i a m m e + n e u v o t t e l u s t r a t e g i a n + n e u v o t t e l u s t r a t e g i a n a + n e u v o t t e l u s t r a t e g i a s s a + n e u v o t t e l u s t r a t e g i o i s t a + n e u v o t t e l u s u o s i t u k s e t + n e u v o t t e l u s u u n n i t e l m a s s a + n e u v o t t e l u s u u n t a v i i v a t + n e u v o t t e l u s ä ä n n ö t + n e u v o t t e l u s ä ä n t ö j e n + n e u v o t t e l u t + n e u v o t t e l u t a i d o i l l e + n e u v o t t e l u t a i d o i n + n e u v o t t e l u t a i d o i s s a + n e u v o t t e l u t a i d o i s t a + n e u v o t t e l u t a i d o i s t a a n + n e u v o t t e l u t a i d o i s t a n n e + n e u v o t t e l u t a i d o n + n e u v o t t e l u t a i d o t + n e u v o t t e l u t a i t o + n e u v o t t e l u t a i t o a + n e u v o t t e l u t a i t o a a n + n e u v o t t e l u t a i t o i h i n + n e u v o t t e l u t a i t o j a + n e u v o t t e l u t a i t o j a a n + n e u v o t t e l u t a i t o j e n + n e u v o t t e l u t a i t o j e n s a + n e u v o t t e l u t a i t o n n e + n e u v o t t e l u t a i t o n s a + n e u v o t t e l u t a k t i i k a l t a + n e u v o t t e l u t a k t i i k a n + n e u v o t t e l u t a k t i i k a s t a + n e u v o t t e l u t a k t i i k k a + n e u v o t t e l u t a k t i i k k a a + n e u v o t t e l u t a k t i s i s t a + n e u v o t t e l u t a p a + n e u v o t t e l u t a p a a + n e u v o t t e l u t a r j o u k s e n + n e u v o t t e l u t a r j o u k s e n s a + n e u v o t t e l u t a r j o u k s e s s a + n e u v o t t e l u t a r j o u s + n e u v o t t e l u t a r k o i t u k s i a + n e u v o t t e l u t a r p e e s t a + n e u v o t t e l u t a s a p a i n o + n e u v o t t e l u t a v a s s a + n e u v o t t e l u t a v a s t a + n e u v o t t e l u t a v o i t t e e m m e + n e u v o t t e l u t a v o i t t e e n s a + n e u v o t t e l u t a v o i t t e e t + n e u v o t t e l u t a v o i t t e i s i i n + n e u v o t t e l u t a v o i t t e i s s a + n e u v o t t e l u t a v o i t t e i t a m m e + n e u v o t t e l u t e k s t e i k s i + n e u v o t t e l u t e k s t e j ä + n e u v o t t e l u t e k s t i + n e u v o t t e l u t e k s t i n + n e u v o t t e l u t e k s t i s t ä + n e u v o t t e l u t e k s t i t + n e u v o t t e l u t i e + n e u v o t t e l u t i e l l e + n e u v o t t e l u t i e n + n e u v o t t e l u t i e t + n e u v o t t e l u t i i m e j ä ä n + n e u v o t t e l u t i i m i n + n e u v o t t e l u t i l a i s u u t t a + n e u v o t t e l u t i l a n n e + n e u v o t t e l u t i l a n n e t t a + n e u v o t t e l u t i l a n t e e n + n e u v o t t e l u t i l a n t e e s e e n + n e u v o t t e l u t i l a n t e e s t a + n e u v o t t e l u t i l a s t o s s a + n e u v o t t e l u t o i m e k s i a n t o + n e u v o t t e l u t o i m e k s i a n t o a + n e u v o t t e l u t o i m i a + n e u v o t t e l u t o i m i n t a a + n e u v o t t e l u t o i m i v a l t u u d e t + n e u v o t t e l u t u l o k s e e n + n e u v o t t e l u t u l o k s e n + n e u v o t t e l u t u l o k s e n a + n e u v o t t e l u t u l o k s e s t a + n e u v o t t e l u t u l o k s e t + n e u v o t t e l u t u l o k s i a + n e u v o t t e l u t u l o k s i i n + n e u v o t t e l u t u l o k s i i n n e + n e u v o t t e l u t u l o k s i s t a + n e u v o t t e l u t u l o k s i s t a n n e + n e u v o t t e l u t u l o s + n e u v o t t e l u t u l o s t a + n e u v o t t e l u t u l o s t e n + n e u v o t t e l u t y ö + n e u v o t t e l u t y ö m m e + n e u v o t t e l u t y ö n + n e u v o t t e l u t y ö r y h m ä l l e + n e u v o t t e l u t y ö r y h m ä ä + n e u v o t t e l u t y ö s t ä + n e u v o t t e l u v a a t i m u k s e t + n e u v o t t e l u v a a t i m u k s i a + n e u v o t t e l u v a h v u u d e l l a + n e u v o t t e l u v a i h e + n e u v o t t e l u v a i h e e n + n e u v o t t e l u v a i h e e s e e n + n e u v o t t e l u v a i h e e s s a + n e u v o t t e l u v a i h e e t + n e u v o t t e l u v a i h e i d e n + n e u v o t t e l u v a i h e i s i i n + n e u v o t t e l u v a i h e i s t a + n e u v o t t e l u v a i h e t t a + n e u v o t t e l u v a i h t o e h t o j e n + n e u v o t t e l u v a l l a n + n e u v o t t e l u v a l m i u d e t + n e u v o t t e l u v a l m i u k s i a + n e u v o t t e l u v a l m i u k s i e n + n e u v o t t e l u v a l m i u t t a + n e u v o t t e l u v a l t a + n e u v o t t e l u v a l t a a + n e u v o t t e l u v a l t t e j a + n e u v o t t e l u v a l t t i + n e u v o t t e l u v a l t t i n a + n e u v o t t e l u v a l t u u d e n + n e u v o t t e l u v a l t u u d e s t a + n e u v o t t e l u v a l t u u d e t + n e u v o t t e l u v a l t u u k s i a + n e u v o t t e l u v a l t u u k s i a a n + n e u v o t t e l u v a l t u u k s i a m m e + n e u v o t t e l u v a l t u u k s i e n + n e u v o t t e l u v a l t u u k s i e n s a + n e u v o t t e l u v a l t u u k s i i n + n e u v o t t e l u v a l t u u k s i l l a + n e u v o t t e l u v a l t u u k s i l l e + n e u v o t t e l u v a l t u u k s i n + n e u v o t t e l u v a l t u u k s i s s a + n e u v o t t e l u v a l t u u k s i s s a k i n + n e u v o t t e l u v a l t u u k s i s t a + n e u v o t t e l u v a l t u u s + n e u v o t t e l u v a l t u u s k u n n a n + n e u v o t t e l u v a l t u u s k u n n i l l e + n e u v o t t e l u v a l t u u s k u n n i s s a + n e u v o t t e l u v a l t u u s k u n t a + n e u v o t t e l u v a l t u u s k u n t a a + n e u v o t t e l u v a l t u u s k u n t a a n + n e u v o t t e l u v a l t u u s k u n t i e n + n e u v o t t e l u v a l t u u s k u n t i i n + n e u v o t t e l u v a l t u u t e n n e + n e u v o t t e l u v a l t u u t t a + n e u v o t t e l u v a l t u u t u k s e e n + n e u v o t t e l u v a l t u u t u k s e n + n e u v o t t e l u v a l t u u t u k s e s s a + n e u v o t t e l u v a l t u u t u k s e s t a + n e u v o t t e l u v a l t u u t u k s e s t a n i + n e u v o t t e l u v a l t u u t u k s i s s a + n e u v o t t e l u v a l t u u t u s + n e u v o t t e l u v a l t u u t u s t a + n e u v o t t e l u v a r a + n e u v o t t e l u v a r a a + n e u v o t t e l u v a u h t i + n e u v o t t e l u v a u h t i a + n e u v o t t e l u v e r k o s t o s s a + n e u v o t t e l u v i i k k o i n a + n e u v o t t e l u v i r h e + n e u v o t t e l u v o i m a + n e u v o t t e l u v o i m a a + n e u v o t t e l u v o i m a m m e + n e u v o t t e l u v o i m a n + n e u v o t t e l u v u o d e n + n e u v o t t e l u v ä l i n e + n e u v o t t e l u v ä l i n e e n ä + n e u v o t t e l u v ä l i n e i n ä + n e u v o t t e l u v ä s y m y s t ä + n e u v o t t e l u y h t e y d e s s ä + n e u v o t t i i n k i n + n e u v o t t o m i a + n e u v o t t o m u u t e n n e + n e v a i m a r r e + n e v a n l a h t i + n e w t o n m e t r i + n e w t o n s e k u n t i + n e w y o r k i l a i s e s s a + n e w y o r k i l a i s e t + n e w y o r k i l a i s i a + n g a n a s a n i t + n g u n i t + n i c a r a g u a l a i s e t + n i e l a i s t a + n i e l l ä + n i e l u j a + n i e l u k a p a s i t e e t t i + n i e l u r i s a + n i e l u r i s a t u l e h d u k s e e n + n i e m i m a a l l a + n i e m i m a a n + n i e m i m a a t a + n i g e r i a l a i s n a i n e n + n i g e r i a l a i s n a i s e n + n i g e r i a l a i s n a i s t e n + n i h k e ä m m i n + n i i d e n + n i i d e n k i n + n i i h i n + n i i l l e + n i i l l ä + n i i l t ä + n i i n k i n + n i i n k ä ä n + n i i s s ä + n i i s s ä k i n + n i i t t o y ö k k ö n e n + n i i t t y h e i n ä s i r k k a + n i i t t y h e p o k a t t i + n i i t t y h o p e a t ä p l ä + n i i t t y h u m a l a + n i i t t y k i r v i n e n + n i i t t y l e i n i k k i + n i i t t y l i e k o s a m m a l + n i i t t y n a a m i o k e r t t u l i + n i i t t y n u r m i k k a + n i i t t y n ä t k e l m ä + n i i t t y r e n g a s k e h r ä ä j ä + n i i t t y r u s o y ö k k ö n e n + n i i t t y s a l v i a + n i i t t y s i r k k u + n i i t t y s u o h a u k k a + n i i t t y s u p p i l o h ä m ä h ä k k i + n i i t t y t y r a n n i + n i i t t y v a h a k a s + n i i t t y v i h e r s i i p i + n i i t t ä e s s ä m m e + n i i t t ä ä k s e e n + n i i t y i l l e + n i k a m a v a l t i m o + n i k a m a v ä l i l e v y + n i k k e l i a l l e r g i a + n i k k e l i a l l e r g i a s t a + n i k k e l i k a d m i u m + n i k k e l i k a d m i u m a k k u j e n + n i k k e l i k a d m i u m i a + n i k k e l i k a d m i u m i l l e + n i k k e l i k a d m i u m p a r i s t o i s t a + n i k k e l i k a d m i u m p a r i s t o j a + n i k k e l i k a d m i u m p a r i s t o j e n + n i k k e l i k a d m i u m p a r i s t o t + n i k k e l i k a r b o n y y l i + n i k k e l i k o l i k o i d e n + n i k k e l i k o l i k o i t a + n i k k e l i m a l m i k a s o i s t a + n i k k e l i m e t a l l i h y b r i d i p a r i s t o j a + n i k k e l i m e t a l l i h y b r i d i p a r i s t o t + n i k k e l i m e t a l l i h y b r i d i ä + n i k k e l i m e t a l l i h y d r i d i a k k u + n i k k e l i n + n i k k e l i o n g e l m a n + n i k k e l i p i t o i s u u t t a + n i k k e l i s i n k k i t e k n i i k k a + n i k k e l i s i s ä l l ö s t ä + n i k k e l i s u l f a a t t i + n i k k e l i ä + n i k o t i i n i a m i d i a d e n i i n i d i n u k l e o t i d i + n i k o t i i n i a m i d i a d e n i i n i d i n u k l e o t i d i f o s f a a t t i + n i k o t i i n i h o i t o a + n i k o t i i n i i n + n i k o t i i n i k o r v a u s h o i t o j e n + n i k o t i i n i m y r k y t y s + n i k o t i i n i p i t o i s u u k s i a + n i k o t i i n i p i t o i s u u t t a + n i k o t i i n i p u r u k u m i + n i k o t i i n i r i i p p u v u u d e n + n i k o t i i n i t u o t t e i d e n + n i l k a n n y r j ä h d y s t ä + n i l k k a a n + n i l o o t i t + n i m e k k ä i m m ä t + n i m e l l i s a r v o + n i m e l l i s a r v o a + n i m e l l i s a r v o i s i n a + n i m e l l i s a r v o j a + n i m e l l i s a r v o k s i + n i m e l l i s a r v o l t a a n + n i m e l l i s a r v o n + n i m e l l i s a r v o o n + n i m e l l i s a r v o s t a + n i m e l l i s e n + n i m e l l i s e s t ä + n i m e l l i s i s t ä + n i m e l l i s i s t ä k i n + n i m e l l i s k o r o s t a + n i m e l l i s l ä h e n t y m i s t ä + n i m e l l i s m ä ä r i e n + n i m e l l i s m ä ä r i s t ä + n i m e l l i s m ä ä r i ä + n i m e l l i s m ä ä r ä t + n i m e l l i s p a i n o j e n + n i m e l l i s p a l k k o j e n + n i m e l l i s s u m m i e n + n i m e l l i s t e n + n i m e l l i s v e r o t + n i m e l l ä + n i m e l l ä n i + n i m e l t ä + n i m e l t ä ä n + n i m e n + n i m e n h u u d o n + n i m e n h u u t o a + n i m e n h u u t o ä ä n e s t y k i s s ä + n i m e n h u u t o ä ä n e s t y k s e e n + n i m e n h u u t o ä ä n e s t y k s e k s i + n i m e n h u u t o ä ä n e s t y k s e l l e + n i m e n h u u t o ä ä n e s t y k s e l l ä + n i m e n h u u t o ä ä n e s t y k s e n + n i m e n h u u t o ä ä n e s t y k s e n k i n + n i m e n h u u t o ä ä n e s t y k s e n ä + n i m e n h u u t o ä ä n e s t y k s e s s ä + n i m e n h u u t o ä ä n e s t y k s e s t ä + n i m e n h u u t o ä ä n e s t y k s e t + n i m e n h u u t o ä ä n e s t y k s i i n + n i m e n h u u t o ä ä n e s t y k s i s s ä + n i m e n h u u t o ä ä n e s t y k s i s t ä + n i m e n h u u t o ä ä n e s t y k s i ä + n i m e n h u u t o ä ä n e s t y s + n i m e n h u u t o ä ä n e s t y s m e n e t e l m ä n + n i m e n h u u t o ä ä n e s t y s p y y n t ö ä + n i m e n h u u t o ä ä n e s t y s t e n + n i m e n h u u t o ä ä n e s t y s t ä + n i m e n h u u t o ä ä n i ä + n i m e n i + n i m e n i k i n + n i m e n m u u t o k s e n + n i m e n m u u t o k s e t + n i m e n m u u t o k s i a + n i m e n m u u t o s + n i m e n m u u t o s t a + n i m e n o m a a n + n i m e n o m a i s e l l a + n i m e n o m a i s e n + n i m e n o m a i s e n a + n i m e n o m a i s e s s a + n i m e n o m a i s e s t a + n i m e n o m a i s e s t i + n i m e n o m a i s e t + n i m e n o m a i s t a + n i m e n o m a i s t e n + n i m e n s ä + n i m e n s ä k i n + n i m e n v a i h d o k s i a k i n + n i m e s s ä ä n + n i m e t + n i m e t e s s ä ä n + n i m e t k ä ä m m e + n i m e t t i i n + n i m e t t ö m i l l ä + n i m e t t ö m i n ä + n i m e t t ö m i ä + n i m e t t ö m y y d e s t ä + n i m e t t ö m y y s k y s y m y k s e n + n i m e t t ö m y y s s u o j a a + n i m e t t ö m ä n ä + n i m e t ä + n i m e t ä ä n + n i m e ä m i s e s t ä + n i m e ä m i s l a u s e k e + n i m e ä m i s l a u s e k e t t a + n i m e ä m i s l a u s e k k e e l l a + n i m e ä m i s l a u s e k k e e n + n i m e ä m i s l a u s e k k e e t + n i m e ä m i s l a u s e k k e i t a + n i m e ä m i s o i k e u t t a + n i m e ä m i s p r o s e s s i + n i m e ä m i s t ä + n i m e ä m ä + n i m e ä m ä t t ä + n i m e ä m ä ä n + n i m e ä n i + n i m e ä n n e + n i m e ä ä n + n i m i a s i a + n i m i a s i a a n + n i m i a s i a n + n i m i a s i a s t a + n i m i e n + n i m i j ä r j e s t e l m ä n + n i m i j ä r j e s t e l m ä ä n + n i m i k e a l u e i l l a + n i m i k e s k u s t e l u + n i m i k e v a l i k o i m a n + n i m i k i i s t a + n i m i k i i s t a a + n i m i k i i s t a n + n i m i k i l p a i l u n + n i m i k i n + n i m i k k e e n + n i m i k k e i s t ö n + n i m i k k e i s t ö ä + n i m i k k e i t ä + n i m i k k o k a p p a l e + n i m i k y s y m y k s e e n + n i m i k y s y m y k s e n + n i m i k y s y m y k s e s s ä + n i m i k y s y m y k s e s t ä + n i m i k y s y m y s + n i m i k y s y m y s n e u v o t t e l u i t a + n i m i k y s y m y s t ä + n i m i l i s t a + n i m i l l ä + n i m i l u e t t e l o + n i m i l u e t t e l o a + n i m i l u e t t e l o i d e n + n i m i l u e t t e l o i h i n + n i m i l u e t t e l o i s t a + n i m i l u e t t e l o i t a + n i m i l u e t t e l o o n + n i m i l u e t t e l o s s a + n i m i l u e t t e l o s t a + n i m i l u e t t e l o t + n i m i o n g e l m a + n i m i o n g e l m a a n + n i m i o n g e l m a n + n i m i p ä i v ä + n i m i p ä i v ä n ä ä n + n i m i s e n + n i m i s e s s ä + n i m i s e s t ä + n i m i s i ä + n i m i s t ä + n i m i t e l t i i n + n i m i t e t t i i n + n i m i t e t t ä e s s ä + n i m i t e t ä ä n + n i m i t e t ä ä n k ö + n i m i t i e t o j e n + n i m i t i n + n i m i t t e l y ä + n i m i t t i + n i m i t t ä i s i n + n i m i t t ä j i e n + n i m i t t ä j ä n + n i m i t t ä j ä n ä + n i m i t t ä j ä ä + n i m i t t ä j ä ä n + n i m i t t ä k ä ä m m e + n i m i t t ä k ö ö n + n i m i t t ä m i s e e n + n i m i t t ä m i s e n + n i m i t t ä m i s e s t ä + n i m i t t ä m i s j ä r j e s t e l y j ä + n i m i t t ä m i s k o m i t e a + n i m i t t ä m i s m e n e t t e l y + n i m i t t ä m i s m e n e t t e l y i n e e n + n i m i t t ä m i s m e n e t t e l y i t ä + n i m i t t ä m i s m e n e t t e l y s t ä + n i m i t t ä m i s m e n e t t e l y ä + n i m i t t ä m i s p r o s e s s i a + n i m i t t ä m i s p r o s e s s i i n + n i m i t t ä m ä l l ä + n i m i t t ä m ä ä n + n i m i t t ä n e e l l e + n i m i t t ä ä + n i m i t y k s e n + n i m i t y k s e t + n i m i t y k s i l l ä + n i m i t y k s i s t ä + n i m i t y k s i ä + n i m i t y s a s i a + n i m i t y s e h d o t u k s e s t a + n i m i t y s h e t k e s t ä ä n + n i m i t y s j ä r j e s t e l m ä n + n i m i t y s k o m i t e a + n i m i t y s k o m i t e a n + n i m i t y s m e n e t e l m ä + n i m i t y s m e n e t e l m ä s t ä + n i m i t y s m e n e t t e l y + n i m i t y s m e n e t t e l y i s s ä + n i m i t y s m e n e t t e l y j e n + n i m i t y s m e n e t t e l y j ä + n i m i t y s m e n e t t e l y n + n i m i t y s m e n e t t e l y s s ä + n i m i t y s m e n e t t e l y t + n i m i t y s m e n e t t e l y y n + n i m i t y s m e n e t t e l y ä + n i m i t y s n e u v o t t e l u i h i n + n i m i t y s o i k e u d e s t a + n i m i t y s o n g e l m a a n + n i m i t y s p e r u s t e i t a + n i m i t y s p o l i t i i k a s t a + n i m i t y s p o l i t i i k k a + n i m i t y s p o l i t i i k k a a + n i m i t y s p r o s e s s e i s s a + n i m i t y s p r o s e s s i + n i m i t y s p r o s e s s i a + n i m i t y s p r o s e s s i i n + n i m i t y s p r o s e s s i n + n i m i t y s p r o s e s s i s s a + n i m i t y s p r o s e s s i s t a + n i m i t y s p ä ä t ö k s e t + n i m i t y s p ä ä t ö k s i ä + n i m i t y s s ä ä n t ö j ä + n i m i t y s t a r k o i t u s t a + n i m i t y s t e n + n i m i t y s t ä + n i m i t ä m m e + n i m i t ä n + n i m i ä + n i m i ä i s e t + n i o b i u m k a r b i d i + n i o b i u m n i t r i d i + n i o b i u m p e n t a k l o r i d i + n i o b i u m p e n t o k s i d i + n i p p u s i d e + n i p p u u n + n i p u k k a m u s t e s i e n i + n i p u t e t t u + n i p u t t a a + n i p u t t a e n + n i p u t t a m a l l a + n i p u t t a m i n e n + n i p u t t a m i s t a + n i s k a a n + n i s k a v a m m o i s t a + n i s k o i l l e m m e + n i s s e n + n i s ä k k ä i s t ä + n i s ä k ä s l a j i e n + n i s ä k ä s p o p u l a a t i o i t a + n i t r a a t e i l t a + n i t r a a t t e i h i n + n i t r a a t t i a + n i t r a a t t i d i r e k t i i v i + n i t r a a t t i d i r e k t i i v i e n + n i t r a a t t i d i r e k t i i v i i n + n i t r a a t t i d i r e k t i i v i l l ä + n i t r a a t t i d i r e k t i i v i n + n i t r a a t t i d i r e k t i i v i s s ä + n i t r a a t t i d i r e k t i i v i s t ä + n i t r a a t t i d i r e k t i i v i ä + n i t r a a t t i e n + n i t r a a t t i h e r k k ä ä + n i t r a a t t i l a i n s ä ä d ä n t ö ö n + n i t r a a t t i l ä h t e i d e n + n i t r a a t t i l ä h t e i t ä + n i t r a a t t i m ä ä r ä + n i t r a a t t i o h j e l m i a + n i t r a a t t i o n g e l m a + n i t r a a t t i o n g e l m a l l e + n i t r a a t t i o n g e l m a n + n i t r a a t t i p i t o i s u u d e n + n i t r a a t t i p i t o i s u u k s i a + n i t r a a t t i p i t o i s u u s + n i t r a a t t i p o h j a i s t e n + n i t r a a t t i p ä ä s t ö j e n + n i t r a a t t i p ä ä s t ö j ä + n i t r a a t t i r a j o i k s i + n i t r a a t t i s a a s t e + n i t r a a t t i s a a s t e i d e n + n i t r a a t t i s a a s t u m i n e n + n i t r a a t t i y h d i s t e i d e n + n i t r i i l i k u m i + n i t r o b e n t s o e h a p p o + n i t r o f e e n i k r i i s i + n i t r o f e e n i s k a n d a a l i + n i t r o f e e n i s k a n d a a l i a + n i t r o f e e n i t a p a u k s e s t a + n i t r o f e n o l i s t a + n i t r o f u r a a n i p i t o i s u u s + n i t r o g l y k o l i + n i t r o g l y s e r i i n i + n i t r o s a m i i n i m ä ä r ä t + n i u k a l l a + n i u k a n + n i u k a t + n i u k e m m a t + n i u k e m p i a + n i u k k a a + n i u k k a e n e r g i a i n e n + n i u k k o j a + n i u k o i k s i + n i u k o i l l a k i n + n i u k o i n + n i v a j o k i + n i v e l a k s e l i + n i v e l b u s s e i s t a + n i v e l b u s s e j a + n i v e l b u s s i + n i v e l b u s s i a + n i v e l b u s s i t + n i v e l k i p u j a + n i v e l o n g e l m i i n + n i v e l p u s s i + n i v e l r e u m a + n i v e l r e u m a a + n i v e l v a i v o i s t a + n i v e l v a u r i o i t a + n i v o t t a v a + n i v o u t u m i s t a + n i v o u t u u + n o b e l i s t i s t a + n o e n s u o d a t t i m e t + n o i d a n + n o i d a n k e h ä + n o i d a n k e h ä l l e + n o i d a n k e h ä n + n o i d a n k e h ä n ä + n o i d a n k e h ä s s ä + n o i d a n k e h ä s t ä + n o i d a n k e h ä s t ä ä n + n o i d a n k e h ä t + n o i d a n k e h ä ä + n o i d a n k e h ä ä n + n o i d a n n u o l i + n o i d a n t a p p a j a t + n o i s s a + n o i s t a + n o i t a h a n k e + n o i t a j a h t i + n o i t a n i r k k o + n o i t a o i k e u d e n k ä y n n i t + n o i t a p i i r i + n o i t a r u m p u + n o i t a s a p a t t i + n o i t a s i s k o k s e t + n o i t a v a i n o + n o i t a v a i n o a + n o i t a v a i n o i l l e + n o i t a v a i n o j a + n o i t a v a i n o l t a + n o i t a v a i n o n + n o i t a v a i n o o n + n o i t a v a i n o s t a + n o i t a v a i n o t + n o i t a v a s a r a + n o j a p y ö r ä + n o j a t u o l i k e n r a a l e j a + n o j a t u o l i v i l j e l i j ö i t ä + n o j a u d u t a a n + n o j a u d u t t a v a + n o k i a + n o k i a l b a t r o s s i + n o k i e r a k k o k o l i b r i + n o k i h a p e r o + n o k i h a u k k a + n o k i h a u k k a p ö l l ö + n o k i h i u k k a s i a + n o k i h i u k k a s s u o d a t t i m i e n + n o k i h i u k k a s s u o d a t t i m i s t a + n o k i h i u k k a s t e n + n o k i h u i l u k o r p p i + n o k i k a n a + n o k i k a r d i n a a l i + n o k i k a u l u r i k o l i b r i + n o k i k e i j u + n o k i k i i p i j ä + n o k i k u u k k e l i + n o k i l a u l u m e s i k k o + n o k i l e i j u + n o k i l e p i n k ä i n e n + n o k i l e p i n k ä i s t y r a n n i + n o k i l i n t u h a u k k a + n o k i l o k k i + n o k i m e r i h a r a k k a + n o k i m e s i k k o + n o k i m i t t a r i + n o k i n ä r h i + n o k i o t s a k e r t t u l i + n o k i o t s a t a s k u + n o k i p a l o k ä r k i + n o k i p e i p p o + n o k i p e r ä p e i p p o + n o k i p u n a p e i p p o + n o k i p ä ä b u l b u l i + n o k i p ä ä p o i m i j a + n o k i p ä ä s k y t + n o k i p ö l l ö + n o k i r a s t a s + n o k i r a s t u l i + n o k i r o u s k u + n o k i s e l k ä t y r a n n i + n o k i s i i p i + n o k i s i i p i l o k k i + n o k i s o r s a + n o k i s u o d a t t i m i e n + n o k i t a s k u + n o k i t i a i n e n + n o k i t i i r a + n o k i t i k k a + n o k i u u n i l i n t u + n o k i v a r i s + n o k i v e s i n a p s i j a + n o k i v i u h k a k e r t t u l i + n o k k a h a u k k a k a l a + n o k k a k o r i s t e + n o k k a k ä r r y + n o k k a p o k k a + n o k k a r a s t a s + n o k k a s i i l i + n o k k a v a l a a t + n o k k e l a a + n o k k e l a l l a + n o k k e l a m m a t + n o k k i m i s j ä r j e s t y s t ä + n o k k o s k o i s a + n o k k o s m a n e e t t i + n o k k o s p e r h o n e n + n o l a a m m e + n o l a t a + n o l l a a n + n o l l a b u d j e t i t + n o l l a b u d j e t o i n t i i n + n o l l a b u d j e t t i + n o l l a b u d j e t t i i n + n o l l a e n e r g i a r a k e n n u k s e t + n o l l a e n e r g i a r a k e n n u k s i a + n o l l a e n e r g i a r a k e n n u s t e n + n o l l a e n e r g i a t a l o + n o l l a e n e r g i a t a l o j a + n o l l a h a v a i t t a v u u s r a j a + n o l l a h i i l i t a l o u t t a + n o l l a h i n t o j a + n o l l a h y p o t e e s i + n o l l a i d e a a l i + n o l l a i n f l a a t i o + n o l l a k a n t a a + n o l l a k a s v u + n o l l a k a s v u a + n o l l a k a s v u n + n o l l a k a s v u s s a + n o l l a k a s v u s t a + n o l l a k a s v u u n + n o l l a k i i n t i ö + n o l l a k i i n t i ö i s t ä + n o l l a k i i n t i ö i t ä + n o l l a k i i n t i ö l l ä + n o l l a k i i n t i ö n + n o l l a k i i n t i ö s t ä + n o l l a k i i n t i ö t ä + n o l l a k i i n t i ö ö n + n o l l a k o h t a + n o l l a k o r o t u s + n o l l a k u s t a n n u k s i n + n o l l a k y n n y s a r v o + n o l l a l i n j a a + n o l l a l i n j a s s a + n o l l a m a a h a n m u u t o n + n o l l a m a a h a n m u u t o s t a + n o l l a m a a h a n m u u t t o + n o l l a m a t r i i s i + n o l l a m e r i d i a a n i + n o l l a n + n o l l a n ä l k ä ä n + n o l l a p a i n o t u s + n o l l a p e r u s t e i n e n + n o l l a p e r u s t e i s t a + n o l l a p i s t e e s e e n + n o l l a p i t o i s u u t t a + n o l l a p o h j a b u d j e t o i n n i n + n o l l a p o h j a b u d j e t o i n t i + n o l l a p o h j a b u d j e t o i n t i a + n o l l a p o h j a b u d j e t o i n t i i n + n o l l a p o h j a i s e e n + n o l l a p o h j a i s e n + n o l l a p o h j a i s t a + n o l l a p r o m i l l e r a j a a + n o l l a p ä i v ä h a a v o i t t u v u u s + n o l l a p ä ä s t ö j ä + n o l l a p ä ä s t ö t + n o l l a p ä ä s t ö t a v o i t t e e s e e n + n o l l a r a h o i t u s t a + n o l l a r a j a + n o l l a r a j a a + n o l l a r a t k a i s u + n o l l a r a t k a i s u u n + n o l l a r i s k i + n o l l a r i s k i i n + n o l l a r i s k i n + n o l l a r i s k i s t ä + n o l l a r i s k i ä + n o l l a s a a l i i s t a + n o l l a s i i r t o l a i s u u d e n + n o l l a s i i r t o l a i s u u s p o l i t i i k k a a n + n o l l a s i i r t o l a i s u u t e e n + n o l l a s i i r t o l a i s u u t t a + n o l l a s t a + n o l l a s u m m a m e r k k e i n ä + n o l l a s u m m a p e l e j ä + n o l l a s u m m a p e l i + n o l l a s u m m a p e l i i n + n o l l a s u m m a p e l i n ä + n o l l a s u m m a p e l i s t ä + n o l l a s u m m a p e l i ä + n o l l a t a k s a a + n o l l a t a r i f f i + n o l l a t a s o + n o l l a t a s o a + n o l l a t a s o l l e + n o l l a t a s o n + n o l l a t a v o i t t e e s e e n + n o l l a t i l a n t e e s s a + n o l l a t o l e r a n s s i + n o l l a t o l e r a n s s i a + n o l l a t o l e r a n s s i i n + n o l l a t o l e r a n s s i j ä r j e s t e l m ä ä + n o l l a t o l e r a n s s i l i n j a + n o l l a t o l e r a n s s i l i n j a a + n o l l a t o l e r a n s s i l i n j a n + n o l l a t o l e r a n s s i l i n j a s t a + n o l l a t o l e r a n s s i l l a + n o l l a t o l e r a n s s i l l e + n o l l a t o l e r a n s s i n + n o l l a t o l e r a n s s i p e r i a a t t e e n + n o l l a t o l e r a n s s i p o l i t i i k a n + n o l l a t o l e r a n s s i p o l i t i i k a s t a + n o l l a t o l e r a n s s i p o l i t i i k k a + n o l l a t o l e r a n s s i p o l i t i i k k a a + n o l l a t o l e r a n s s i p o l i t i i k k a a n + n o l l a t o l e r a n s s i s t a + n o l l a t o l e r a n s s i s t r a t e g i a + n o l l a t o l e r a n s s i s ä ä n t ö + n o l l a t o l e r a n s s i t e o r i a a + n o l l a t u o n n i n + n o l l a t u t k i m u s + n o l l a t u t k i m u s a l u e + n o l l a v a i h t o e h t o + n o l l a v a i h t o e h t o a + n o l l a v a j e e n + n o l l a v a j e e s e e n + n o l l a v a j e t t a + n o l l a v a l m i s t e v e r o n + n o l l a v a r a n t o p e r i a a t e t t a + n o l l a v a r a s t o i h i n + n o l l a v e k t o r i + n o l l a v e r o j ä r j e s t e l m i i n + n o l l a v e r o k a n n a n + n o l l a v e r o k a n t a + n o l l a v e r o k a n t a a + n o l l a v e r o t u k s e e n + n o l l a v e r o t u k s e n + n o l l a v e r o t u k s e s t a + n o l l a v i r h e + n o l l a v o i m a k a n t a + n o l o a + n o l o n a + n o m a d i k a n s o i h i n + n o m a d i l e i r i e n + n o m a d i p a i m e n i a + n o m a d i s i i r t o l a i s i a + n o m i n a l i s m i i n + n o n y y l i f e n o l i e t o k s y l a a t i s t a + n o n y y l i f e n o l i e t o k s y l a a t i t + n o o t t i e n + n o o t t i k r i i s i + n o p e a a + n o p e a a n + n o p e a k a s v u i s i a + n o p e a k s i + n o p e a l i i k k e i s e m m ä l l e + n o p e a l i i k k e i s e t + n o p e a l l a + n o p e a m m a k s i + n o p e a m m a l l a + n o p e a m m a l l e + n o p e a m m a n + n o p e a m m a s s a + n o p e a m m a s t a + n o p e a m m a t + n o p e a m p a a + n o p e a m p a a n + n o p e a m p i + n o p e a m p i a + n o p e a m p i e n + n o p e a m p i i n + n o p e a m p i n a + n o p e a n + n o p e a s s a + n o p e a s t a + n o p e a s t i k i n + n o p e a t + n o p e i d e n + n o p e i l l a + n o p e i m m a l l a + n o p e i m m i l l a a n + n o p e i m m i s t a + n o p e i m p i a + n o p e i n + n o p e i n t a + n o p e i s i i n + n o p e i s s a + n o p e i t a + n o p e u d e l l a + n o p e u d e l t a a n + n o p e u d e n + n o p e u d e n r a j o i t i n + n o p e u d e n r a j o i t i n t a + n o p e u d e n r a j o i t t i m e t + n o p e u d e n r a j o i t t i m i a + n o p e u d e n r a j o i t t i m i e n + n o p e u d e n r a j o i t t i m i l l a + n o p e u d e n r a j o i t t i m i s s a + n o p e u d e n s ä ä d i n + n o p e u d e n s ä ä t ö j ä r j e s t e l m ä t + n o p e u d e n v a l v o n n a n + n o p e u d e n v a l v o n t a a + n o p e u d e s s a + n o p e u d e s t a + n o p e u k s i e n + n o p e u k s i s t a + n o p e u s k y s y m y s t ä + n o p e u s l a s k u + n o p e u s l i s ä + n o p e u s r a j o i t t i m i a + n o p e u s r a j o i t u k s e k s i + n o p e u s r a j o i t u k s e n + n o p e u s r a j o i t u k s e t + n o p e u s r a j o i t u k s i a + n o p e u s r a j o i t u k s i i n + n o p e u s r a j o i t u k s i l l e + n o p e u s r a j o i t u k s i s t a + n o p e u s r a j o i t u s + n o p e u s r a j o i t u s s ä ä n t ö j ä + n o p e u s r a j o i t u s t a + n o p e u s r a j o i t u s t e n + n o p e u s t a r k a s t u k s i a + n o p e u s t a v o i t t e e n + n o p e u s v a l v o n t a + n o p e u s v a l v o n t a j ä r j e s t e l m ä n + n o p e u s v a l v o n t a j ä r j e s t e l m ä ä + n o p e u s v a l v o n t a k a m e r a + n o p e u s v a l v o n t a k a m e r o i t a + n o p e u t e e n + n o p e u t e t a a n + n o p e u t e t t a i s i i n + n o p e u t e t t a v a + n o p e u t e t t i i n + n o p e u t e t t u a + n o p e u t e t t u j a + n o p e u t e t t u u n + n o p e u t e t u l l a + n o p e u t e t u n + n o p e u t e t u s s a + n o p e u t e t u s t a + n o p e u t e t u t + n o p e u t t a + n o p e u t t a a + n o p e u t t a a k s e e n + n o p e u t t a i s i + n o p e u t t a m a a n + n o p e u t t a m a l l a + n o p e u t t a m a t t a + n o p e u t t a m i s e e n + n o p e u t t a m i s e k s i + n o p e u t t a m i s e n + n o p e u t t a m i s e s t a + n o p e u t t a m i s t a + n o p e u t t a n e e t + n o p e u t t a v a t + n o p e u t t i + n o p e u t u a + n o p e u t u u + n o p p a a + n o p p a p e r h o n e n + n o r f o l k i n t e r r i e r i + n o r j a l a i s i a + n o r j a l a i s t e n + n o r j a n + n o r j a n a m p i a i n e n + n o r j a n a r h o + n o r j a n h i r v i k o i r a + n o r j a n j ä k k ä r ä + n o r j a n k r i l l i + n o r j a n m e r i + n o r j a s s a + n o r j a s t a + n o r m a a l e i n a + n o r m a a l e j a + n o r m a a l i a + n o r m a a l i a i k o i n a + n o r m a a l i e l ä m ä n + n o r m a a l i e l ä m ä ä n + n o r m a a l i f l o o r a + n o r m a a l i h a l l i n t o o n + n o r m a a l i h i n t a + n o r m a a l i h i n t a i s i k s i + n o r m a a l i i n + n o r m a a l i j a k a u m a + n o r m a a l i k o u l u + n o r m a a l i k s i + n o r m a a l i k ä y t t ö ö n + n o r m a a l i k ä y t ä n n ö n + n o r m a a l i k ä y t ä n t ö n ä + n o r m a a l i k ä y t ä n t ö ä + n o r m a a l i k ä y t ö s t ä + n o r m a a l i l a i n s ä ä d ä n n ö n + n o r m a a l i l l a + n o r m a a l i l t a + n o r m a a l i m e n e t t e l y y n + n o r m a a l i m m a s t a + n o r m a a l i m m i k s i + n o r m a a l i m m i n + n o r m a a l i m p i + n o r m a a l i m u o t o + n o r m a a l i n + n o r m a a l i o b j e k t i i v i + n o r m a a l i o l o i s s a + n o r m a a l i o l o t + n o r m a a l i p a l k k a a + n o r m a a l i s s a + n o r m a a l i s t r e s s i s s ä + n o r m a a l i s ä ä n t ö j e n + n o r m a a l i t + n o r m a a l i t a k s a a n + n o r m a a l i t a p a u k s i s s a + n o r m a a l i t a s o l l e + n o r m a a l i t a s o o n + n o r m a a l i t i l a n t e e n + n o r m a a l i t i l a n t e e s s a + n o r m a a l i t i l a n t e i s s a + n o r m a a l i t y ö a j a n + n o r m a a l i t y ö n + n o r m a a l i v e r o k a n t o j e n + n o r m a a l i v u o d e n + n o r m a a l i v u o s i n a + n o r m a a l i y h t e i s k u n n a n + n o r m a l i s o i d a k s e m m e + n o r m a l i s o i m a a n + n o r m a l i s o i m i n e n + n o r m a l i s o i n t i p r o s e s s i + n o r m a l i s o i n t i p r o s e s s i a + n o r m a l i s o i n t i p r o s e s s i k s i + n o r m a l i s o i n t i p r o s e s s i n + n o r m a l i s o i t u m i s e s t a + n o r m a l i s o i t u v a n + n o r m a n n i v a l l o i t u s + n o r m a t i i v i s e n a + n o r m a t i i v i s e s t i + n o r m a t i i v i s t a + n o r m e i h i n + n o r m e i l l a + n o r m e i l l a a n + n o r m e i n e e n + n o r m e i s t a + n o r m e j a + n o r m i a + n o r m i e n + n o r m i h i e r a r k i a + n o r m i h i e r a r k i a a + n o r m i h i e r a r k i a a n + n o r m i h i e r a r k i a k s i + n o r m i h i e r a r k i a n + n o r m i j ä r j e s t e l m ä ä n + n o r m i k o k o n a i s u u s + n o r m i k s i + n o r m i m a a i l m a l l a a n + n o r m i n s a + n o r m i p u i t t e i s s a m m e + n o r m i t + n o r s u a s i a n t u n t i j a + n o r s u i l l e + n o r s u i s t a + n o r s u j a + n o r s u j e n + n o r s u k a a n + n o r s u k a n n a t + n o r s u k a n t a + n o r s u k a n t o i h i n + n o r s u k a n t o j a + n o r s u k a n t o j e n + n o r s u k y s y m y k s e s t ä + n o r s u l i n n u t + n o r s u n l u u + n o r s u n l u u k a u p a l l e + n o r s u n l u u k a u p a n + n o r s u n l u u k a u p p a + n o r s u n l u u k a u p p a a + n o r s u n l u u k a u p p a a n + n o r s u n l u u k i p u a j a + n o r s u n l u u r a n n i k k o + n o r s u n l u u r a n n i k k o a + n o r s u n l u u r a n n i k k o o n + n o r s u n l u u r a n n i k o l l a + n o r s u n l u u r a n n i k o l l e + n o r s u n l u u r a n n i k o l t a + n o r s u n l u u r a n n i k o n + n o r s u n l u u r a n n i k o s t a + n o r s u n l u u t o r n e i s s a + n o r s u n l u u t o r n e i s s a a n + n o r s u n l u u t o r n e j a + n o r s u n l u u t o r n i + n o r s u n l u u t o r n i e n + n o r s u n l u u t o r n i i m m e + n o r s u n l u u t o r n i i n + n o r s u n l u u t o r n i n + n o r s u n l u u t o r n i p o l i t i i k k a a + n o r s u n l u u t o r n i s s a + n o r s u n l u u t o r n i s s a a n + n o r s u n l u u t o r n i s t a + n o r s u n l u u t o r n i s t a a n + n o r s u n l u u t o r n i s t a m m e + n o r s u n l u u v a r a n n o i l l a + n o r s u n l u u v a r a s t o j e n + n o r s u n l u u v a r a s t o n s a + n o r s u n m e t s ä s t y s + n o r s u p o o l o + n o r s u p o p u l a a t i o + n o r s u p o p u l a a t i o n + n o r s u t e l o i t u s + n o r s u t e s t i + n o r s u t u o t t e i l l a + n o r w i c h i n t e r r i e r i + n o s t a a + n o s t a a k s e e n + n o s t a a k s e m m e + n o s t a i s i + n o s t a i s i v a t + n o s t a k a a + n o s t a k a a m m e + n o s t a m a a n + n o s t a m a t t a + n o s t a m i s e k s i + n o s t a m i s e s t a + n o s t a m i s t a + n o s t a m m e + n o s t a n u t + n o s t a t t a a + n o s t a v a t + n o s t a v i e n + n o s t e t a a n + n o s t e t t a e s s a + n o s t e t t i i n + n o s t e t t u i h i n + n o s t e t u i s t a + n o s t e t u t + n o s t i + n o s t o j ä r j e s t e l m ä ä n + n o s t o k a l u s t o a + n o s t o l a i t t e e t + n o s t o l a i t t e i l l a + n o s t o p a i n o s u m u + n o s t o t i i v i s t y s k o r k e u s + n o s t u r i a l u s + n o s t u r i n k u l j e t t a j a n t u t k i n t o a + n o s t u r i n k u l j e t t a j i i n + n o t a a r i k s i + n o t a a r i n + n o t k i s t a a + n o t k i s t a m a l l a + n o u d a t a m m e k i n + n o u d a t a m m e k o + n o u d a t e t a + n o u d a t e t a a n + n o u d a t e t a a n k o + n o u d a t e t t a i s i i n + n o u d a t e t t a v a + n o u d a t e t t a v a a + n o u d a t e t t a v a n a a n + n o u d a t e t t a v a t + n o u d a t e t t a v i a + n o u d a t e t t a v i e n + n o u d a t e t t a v i i n + n o u d a t e t t a v i k s i + n o u d a t e t t a v i s t a + n o u d a t e t t u + n o u d a t e t t u j a + n o u d a t e t u n + n o u d a t t a a + n o u d a t t a a k o + n o u d a t t a a k s e e n + n o u d a t t a a k s e m m e + n o u d a t t a a k s e n i + n o u d a t t a e n + n o u d a t t a e s s a a n + n o u d a t t a i s i + n o u d a t t a i s i m m e + n o u d a t t a i s i v a t + n o u d a t t a k a a + n o u d a t t a k a a m m e + n o u d a t t a m a a n + n o u d a t t a m a l l a + n o u d a t t a m a n + n o u d a t t a m a s s a + n o u d a t t a m a s t a + n o u d a t t a m a t t a + n o u d a t t a m a t t o m a t + n o u d a t t a m i s e e n + n o u d a t t a m i s e k s i + n o u d a t t a m i s e l l a + n o u d a t t a m i s e n + n o u d a t t a m i s e s t a + n o u d a t t a m i s o h j e l m a t + n o u d a t t a m i s o h j e l m i e n + n o u d a t t a m i s o h j e l m i l l a + n o u d a t t a m i s s ä ä n n ö i s t ä + n o u d a t t a m i s t a + n o u d a t t a m i s t a r v e t t a + n o u d a t t a n e e t + n o u d a t t a n e i d e n + n o u d a t t a n u t + n o u d a t t a v a n + n o u d a t t a v a n s a + n o u d a t t a v a t + n o u d a t t a v a t k o + n o u d a t t a v i e n + n o u d a t t a v i l l e + n o u d a t t i v a t k o + n o u s e e + n o u s e m a a n + n o u s e m a s s a + n o u s e m i s t a a n + n o u s e v a a + n o u s e v a n + n o u s e v a t + n o u s e v i a + n o u s e v i e n + n o u s e v i i n + n o u s e v i l l e + n o u s e v i s t a + n o u s i + n o u s i v a t + n o u s k a a m m e + n o u s s e e + n o u s s e e t + n o u s t a + n o u s t a v a + n o u s u a + n o u s u a a n + n o u s u j e n + n o u s u j o h t e i s t a + n o u s u k a u d e l l a + n o u s u k a u d e n + n o u s u k a u s i + n o u s u k a u s i e n + n o u s u k i e r r e t t ä + n o u s u k ä y r ä l l e + n o u s u l i i k k e e s t ä + n o u s u l l e + n o u s u n + n o u s u n o p e u s + n o u s u p a i n e i t a + n o u s u s t a + n o u s u s u h d a n n e + n o u s u s u h d a n n e t t a + n o u s u s u h d a n t e e n + n o u s u s u h d a n t e e s s a + n o u s u s u h d a n t e e s t a + n o u s u s u u n t a + n o u s u s u u n t a u k s e n + n o u s u s u u n t a u s + n o u s u u n + n o u s u v a i h e e s s a + n o u s u v a u h t i + n o u s u v e d e t + n o u s u v e s i + n o u t a a + n o u t o v e l k a a + n o v e l l i n + n u e r i t + n u h t e e t t o m i a + n u i j a h u u l i k a l a + n u i j a k u u k u n e n + n u i j a l l a + n u i j a m a a n j ä r v i + n u i j a m a l i k k a + n u i j a m e s i s i e n i + n u i j a n + n u i j a n i n j a + n u i j a p ä ä g a l a k s i + n u i j a p ä ä k a l a t + n u i j a s a r a + n u i j a s a r v i s i e n i + n u i j a s e i t i k k i + n u i j a s o t a + n u j e r r e t t u a + n u j e r t a a + n u j e r t a a k s e e n + n u j e r t a m a l l a + n u j e r t a m i s e k s i + n u j e r t a m i s e s t a + n u j e r t a n u t + n u k a h d i n + n u k a h t a m i s p i l l e r i + n u k a h t a m i s p i l l e r i n + n u k a h t a n e e n + n u k a h t a n e e n s a + n u k k a l i s ä k e + n u k k a p ä h k ä m ö + n u k k a t y r ä k k i + n u k k a v y ö k ä ä p ä + n u k k e h a l l i t u k s e l l e + n u k k e h a l l i t u k s e n + n u k k e h a l l i t u k s e t + n u k k e h a l l i t u k s i a + n u k k e h a l l i t u s + n u k k e h a l l i t u s t a + n u k k e k o t i + n u k k e k u n i n g a s + n u k k e l a a k s o + n u k k e p ä ä m i n i s t e r i ä + n u k k e t e a t t e r i + n u k k e t e a t t e r i a + n u k k e t e a t t e r i l a i s i a + n u k k e t e a t t e r i n + n u k k e t e a t t e r i s t a + n u k k e v a l t i o + n u k k e v a l t i o i d e n + n u k k e v a l t i o i t a + n u k k u a + n u k k u m a a n + n u k k u m a t t a + n u k k u u k o + n u k k u v i e n + n u k l e i i n i h a p p o j a + n u k l e o s i d i d i f o s f a a t t i k i n a a s i + n u k u m m e + n u l i k a t + n u m e r o a + n u m e r o a s e m a + n u m e r o a v a r u u t t a + n u m e r o i d e n + n u m e r o i l l a + n u m e r o i l l e + n u m e r o i n a + n u m e r o i n t i a l u e e n + n u m e r o i n t i j ä r j e s t e l m ä + n u m e r o i n t i j ä r j e s t e l m ä ä + n u m e r o i n t i o n g e l m a s t a + n u m e r o i n t i p o l i t i i k a s t a + n u m e r o i t a + n u m e r o j ä r j e s t e l m ä s t ä + n u m e r o j ä r j e s t y k s e s t ä + n u m e r o k o o d i l l a + n u m e r o k o o d i n + n u m e r o k y s y m y s + n u m e r o l e i k i l l e + n u m e r o l u k k o + n u m e r o l u k u t a i t o a + n u m e r o n + n u m e r o o n + n u m e r o p a l v e l u + n u m e r o p i r u + n u m e r o r e s u r s s e i h i n + n u m e r o s a r a k k e i d e n + n u m e r o s u u n n i t e l m a + n u m e r o t + n u m e r o t i e d o t + n u m e r o t i e d o t u s p a l v e l u i h i n + n u m e r o t i e t o i n e e n + n u m e r o t i e t o j a + n u m m i k i r v i n e n + n u m m i l i m a s e i t i k k i + n u m m i m a t a r a + n u m m i m e s i k k o + n u m m i p o n i + n u m m i r i e k k o + n u m m i t a t t i + n u n n a m i t t a r i + n u n n a t a s k u + n u o h o o j a n + n u o h o o j a t a p a k u l o + n u o l i a n k e r i a a t + n u o l i h a u k k a + n u o l i m y r k k y s a m m a k o t + n u o l i n o t a a t i o + n u o l i r i s t i + n u o l i s i i p i + n u o l i t r a p p i + n u o l i y ö k k ö n e n + n u o r a k e r a a m i n e n + n u o r a l l a + n u o r a l l a k ä v e l y ä + n u o r e e n + n u o r e k k u u t t a + n u o r e l l a + n u o r e l l e + n u o r e m m a t + n u o r e m m e + n u o r e m m i l l a + n u o r e m m i l l e + n u o r e m m i l l e e n + n u o r e m p a a + n u o r e m p a n a + n u o r e m p i + n u o r e m p i e n + n u o r e m p i n a + n u o r e n + n u o r e n a + n u o r e n n u s e l i k s i i r i + n u o r e n s a + n u o r e n t a m a a n + n u o r e n t a m i s e k s i + n u o r e n t a n u t + n u o r e n t u n e e t + n u o r e s t a + n u o r e t + n u o r i a + n u o r i a a n + n u o r i a m m e + n u o r i e m m e + n u o r i e n + n u o r i i m m e + n u o r i i n + n u o r i k s i + n u o r i l l a + n u o r i l l a m m e + n u o r i l l e + n u o r i l l e e n + n u o r i l l e m m e + n u o r i l t a + n u o r i m i e s + n u o r i m m i l l e + n u o r i m m i s s a + n u o r i m p i a + n u o r i m p i e n + n u o r i m p i i n + n u o r i n a + n u o r i n e e n + n u o r i p o l i t i i k a s t a + n u o r i s o a + n u o r i s o a l a l l a + n u o r i s o a l a n + n u o r i s o a l o i t t e i l l e + n u o r i s o a l o i t t e i s t a + n u o r i s o a l o i t t e i t a + n u o r i s o a m m e + n u o r i s o a s i a i n m i n i s t e r i i n + n u o r i s o a s i o i d e n + n u o r i s o a s i o i l l e + n u o r i s o a s i o i s s a + n u o r i s o a s i o i s t a + n u o r i s o a s i o i t a + n u o r i s o f e s t i v a a l i + n u o r i s o f o o r u m i + n u o r i s o f o o r u m i n + n u o r i s o f o o r u m i s s a + n u o r i s o h a n + n u o r i s o h a n k k e i s i i n + n u o r i s o h a n k k e i t a + n u o r i s o i l l e m m e + n u o r i s o j e n g e i h i n + n u o r i s o j o h t a j i e n + n u o r i s o j o u k k o + n u o r i s o j o u k o i s s a + n u o r i s o j u o p p o u s + n u o r i s o j ä r j e s t ö + n u o r i s o j ä r j e s t ö i h i n + n u o r i s o j ä r j e s t ö i l l e + n u o r i s o j ä r j e s t ö i s s ä + n u o r i s o j ä r j e s t ö j e n + n u o r i s o j ä r j e s t ö j ä + n u o r i s o j ä r j e s t ö j ä k i n + n u o r i s o j ä r j e s t ö n + n u o r i s o j ä r j e s t ö n s ä + n u o r i s o j ä r j e s t ö t + n u o r i s o j ä r j e s t ö t y ö h ö n + n u o r i s o j ä r j e s t ö ä + n u o r i s o j ä r j e s t ö ö n + n u o r i s o k a m p a n j a + n u o r i s o k a p i n a + n u o r i s o k a s v a t u k s e n + n u o r i s o k a s v a t u s t a + n u o r i s o k e r h o + n u o r i s o k i s a t + n u o r i s o k o r t t i a + n u o r i s o k o r t t i y h d i s t y k s e n + n u o r i s o k o u l u t u s p o l i t i i k a n + n u o r i s o k u l t t u u r i + n u o r i s o k u l t t u u r i a + n u o r i s o k u l t t u u r i k s i + n u o r i s o k u o l l e i s u u s + n u o r i s o k y s y m y k s e e n + n u o r i s o k y s y m y k s i l l ä + n u o r i s o k y s y m y s + n u o r i s o l i i k e + n u o r i s o l i i k k e e n + n u o r i s o l i i k k e e s s ä + n u o r i s o l i i k k e e s t ä + n u o r i s o l i i k k e i d e n + n u o r i s o l i i k k e i t ä + n u o r i s o l i i k u n t a a n + n u o r i s o l i i t t o + n u o r i s o l l a + n u o r i s o l l a m m e + n u o r i s o l l e + n u o r i s o l l e m m e + n u o r i s o m a t k a i l u n + n u o r i s o m i l i i s i n + n u o r i s o m i n i s t e r e i t ä + n u o r i s o m m e + n u o r i s o n + n u o r i s o n e u v o s t o i s s a + n u o r i s o n s a + n u o r i s o n s u o j e l u s t a + n u o r i s o o m m e + n u o r i s o o n + n u o r i s o o n s a + n u o r i s o p a l k i n n o n + n u o r i s o p a r l a m e n t i n + n u o r i s o p a r l a m e n t t i + n u o r i s o p a r l a m e n t t i a + n u o r i s o p a s s i a + n u o r i s o p o l i i t t i n e n + n u o r i s o p o l i i t t i s e n + n u o r i s o p o l i i t t i s i a + n u o r i s o p o l i t i i k a l l a + n u o r i s o p o l i t i i k a l l e + n u o r i s o p o l i t i i k a l l e m m e + n u o r i s o p o l i t i i k a n + n u o r i s o p o l i t i i k a s s a + n u o r i s o p o l i t i i k a s t a + n u o r i s o p o l i t i i k k a + n u o r i s o p o l i t i i k k a a + n u o r i s o p o l i t i i k k a a m m e + n u o r i s o p o l i t i i k k a a n + n u o r i s o p o l i t i i k k o j a + n u o r i s o p o l i t i i k o i l l e e n + n u o r i s o p o r t a a l i n + n u o r i s o p u i t e o h j e l m a + n u o r i s o p ä i v i i n + n u o r i s o r a h a s t o n + n u o r i s o r i k o l l i n e n + n u o r i s o r i k o l l i s i i n + n u o r i s o r i k o l l i s i l l e + n u o r i s o r i k o l l i s t a + n u o r i s o r i k o l l i s t e n + n u o r i s o r i k o l l i s u u d e n + n u o r i s o r i k o l l i s u u d e s t a + n u o r i s o r i k o l l i s u u s + n u o r i s o r i k o l l i s u u t t a + n u o r i s o r y h m i e n + n u o r i s o r y h m i i n + n u o r i s o r y h m ä + n u o r i s o r y h m ä l l e + n u o r i s o s e m i n a a r e j a + n u o r i s o s o p i m u k s e e n + n u o r i s o s o p i m u k s e n + n u o r i s o s o p i m u k s e s s a + n u o r i s o s o p i m u k s e s t a + n u o r i s o s o p i m u s + n u o r i s o s o p i m u s t a + n u o r i s o s s a + n u o r i s o s t a + n u o r i s o s t r a t e g i a + n u o r i s o s t r a t e g i a a + n u o r i s o s t r a t e g i a a n + n u o r i s o s t r a t e g i a l l e + n u o r i s o s t r a t e g i a n + n u o r i s o s t r a t e g i a s s a + n u o r i s o t a k u i t a + n u o r i s o t a k u u + n u o r i s o t a k u u n + n u o r i s o t a k u u s t a + n u o r i s o t a k u u t a + n u o r i s o t a l o + n u o r i s o t a l o a + n u o r i s o t a p a a m i s e n + n u o r i s o t a p a h t u m a n + n u o r i s o t a p a h t u m i e n + n u o r i s o t o i m e n + n u o r i s o t o i m i n n a n + n u o r i s o t o i m i n n a s s a + n u o r i s o t o i m i n t a a + n u o r i s o t o i m i n t a o h j e l m a + n u o r i s o t o i m i n t a o h j e l m a a + n u o r i s o t o i m i n t a o h j e l m a a n + n u o r i s o t o i m i n t a o h j e l m a l l a + n u o r i s o t o i m i n t a o h j e l m a n + n u o r i s o t y ö + n u o r i s o t y ö h ö n + n u o r i s o t y ö l l e + n u o r i s o t y ö l l i s t ä m i s o h j e l m i e n + n u o r i s o t y ö l l i s y y t e e n + n u o r i s o t y ö l l i s y y t t ä + n u o r i s o t y ö n t e k i j ä + n u o r i s o t y ö n t e k i j ä t + n u o r i s o t y ö n t e k i j ö i d e n + n u o r i s o t y ö s t ä + n u o r i s o t y ö t t ö m y y d e l l ä + n u o r i s o t y ö t t ö m y y d e n + n u o r i s o t y ö t t ö m y y d e s t ä + n u o r i s o t y ö t t ö m y y s + n u o r i s o t y ö t t ö m y y s a s t e + n u o r i s o t y ö t t ö m y y s a s t e e n + n u o r i s o t y ö t t ö m y y s a s t e e s t a + n u o r i s o t y ö t t ö m y y s l u k u j a + n u o r i s o t y ö t t ö m y y s l u v u t + n u o r i s o t y ö t t ö m y y t e e n + n u o r i s o t y ö t t ö m y y t t ä + n u o r i s o t y ö t ä + n u o r i s o u r h e i l i j o i l l e + n u o r i s o u r h e i l u + n u o r i s o u r h e i l u a + n u o r i s o v a i h d o l l e + n u o r i s o v a i h d o n + n u o r i s o v a i h d o s s a + n u o r i s o v a i h d o s t a + n u o r i s o v a i h d o t + n u o r i s o v a i h t o + n u o r i s o v a i h t o a + n u o r i s o v a i h t o i h i n + n u o r i s o v a i h t o j e n + n u o r i s o v a i h t o o n + n u o r i s o v a i h t o t o i m i n n a l l a + n u o r i s o v a l t u u s t o + n u o r i s o v a p a a e h t o i s t o i m i n n a n + n u o r i s o v i i k k o + n u o r i s o v i i k k o o n + n u o r i s o v i i k o l l e + n u o r i s o v i i k o n + n u o r i s o v i i k o t + n u o r i s o v i r a n o m a i s i a + n u o r i s o v i r a s t o j e n + n u o r i s o v ä k i v a l t a + n u o r i s o y h d i s t y k s i l l ä + n u o r i s o y h t e i s t y ö + n u o r i s o y h t e i s t y ö l l ä + n u o r i s o y h t e i s t y ö n + n u o r i s o y h t e i s ö j e n + n u o r i s s a + n u o r i s s a m m e + n u o r i s t a + n u o r i s t a a n + n u o r i s t a m m e + n u o r s u o m a l a i s e t + n u o r t a + n u o r t e m m e + n u o r t e n + n u o r t e n k i n + n u o r t e n k i r j a l l i s u u s + n u o r t u r k k i l a i s e t + n u o r u k a i s t e n + n u o r u u d e n h a a v e e n i + n u o r u u s i ä s s ä + n u o r u u s v u o d e t + n u o t e i s t a + n u o t i o m u s t e s i e n i + n u o t i o s a m m a l + n u o t t a r u o h o + n u o t t i k i r j o i t u s + n u p p u s a m m a l + n u r i n k u r i s e l t a + n u r i n k u r i s t a + n u r j a p u o l i + n u r k k a a n + n u r k k a k u n t a i s e s t i + n u r k k a m m e + n u r k k a n s a + n u r m i a j u r u o h o + n u r m i h e i n ä s i r k k a + n u r m i h e r k k u s i e n i + n u r m i h i i h t o + n u r m i h ä r k k i + n u r m i k a i v a j a + n u r m i k e i l a i l u + n u r m i k i r j o h e l t t a + n u r m i k k o r a s t a s + n u r m i k o h o k k i + n u r m i k o l l e + n u r m i l a u h a + n u r m i l a u k k a + n u r m i m a a m u n a + n u r m i m a i l a n e n + n u r m i n a h i k a s + n u r m i n a t a + n u r m i p a l k k i o i t a + n u r m i p i i p p o + n u r m i p u n t a r p ä ä + n u r m i r o u s k u + n u r m i r ö l l i + n u r m i s ä i l ö r e h u t u k e a + n u r m i t a t a r + n u r m i t u k i + n u r m i t ä d y k e + n u u s k a k i e l l o n + n u u s k a t u o t t e i t a + n y a m w e z i t + n y a n s o i m i s e s t a + n y k y a i k a + n y k y a i k a a + n y k y a i k a a n + n y k y a i k a i n e n + n y k y a i k a i s e e n + n y k y a i k a i s e k s i + n y k y a i k a i s e l l a + n y k y a i k a i s e l l e + n y k y a i k a i s e l t a + n y k y a i k a i s e m m a l l e + n y k y a i k a i s e m m a n + n y k y a i k a i s e m m i l l a + n y k y a i k a i s e m m i n + n y k y a i k a i s e m p a a + n y k y a i k a i s e m p a a n + n y k y a i k a i s e m p i + n y k y a i k a i s e m p i a + n y k y a i k a i s e m p i e n + n y k y a i k a i s e m p i i n + n y k y a i k a i s e n + n y k y a i k a i s e n a + n y k y a i k a i s e s s a + n y k y a i k a i s e s t a + n y k y a i k a i s e s t i + n y k y a i k a i s e t + n y k y a i k a i s i a + n y k y a i k a i s i l l a + n y k y a i k a i s i m m a k s i + n y k y a i k a i s i m m a l l a + n y k y a i k a i s i m m i s t a + n y k y a i k a i s i m p i a + n y k y a i k a i s i n + n y k y a i k a i s i n a + n y k y a i k a i s i s s a + n y k y a i k a i s t a a + n y k y a i k a i s t a m a a n + n y k y a i k a i s t a m i n e n + n y k y a i k a i s t a m i s e k s i + n y k y a i k a i s t a m i s e n + n y k y a i k a i s t a m i s e s s a + n y k y a i k a i s t a m i s e s t a + n y k y a i k a i s t a m i s m e n e t t e l y n + n y k y a i k a i s t a m i s n e u v o t t e l u i h i n + n y k y a i k a i s t a m i s o h j e l m a + n y k y a i k a i s t a m i s o h j e l m a n + n y k y a i k a i s t a m i s o h j e l m i l l a + n y k y a i k a i s t a m i s p r o s e s s e i h i n + n y k y a i k a i s t a m i s p r o s e s s i + n y k y a i k a i s t a m i s p y r k i m y k s e t + n y k y a i k a i s t a m i s p y r k i m y k s i ä + n y k y a i k a i s t a m i s r a h a s t o n + n y k y a i k a i s t a m i s r a h a s t o o n + n y k y a i k a i s t a m i s r a h a s t o s t a + n y k y a i k a i s t a m i s t a + n y k y a i k a i s t a m i s t a r p e i d e n + n y k y a i k a i s t a m i s t a r v e + n y k y a i k a i s t a m i s t u k e a + n y k y a i k a i s t a m i s v ä l i n e i t ä + n y k y a i k a i s t e n + n y k y a i k a i s t e t t a v a + n y k y a i k a i s t u a + n y k y a i k a i s t u m i s e k s i + n y k y a i k a i s u u t t a m m e + n y k y a i k a m m e + n y k y a i k a n a + n y k y a i k o i n a + n y k y a j a l l e + n y k y a j a n + n y k y a j a s s a + n y k y a j o i s t a + n y k y a r v i o i d e n + n y k y a s e m a + n y k y a s e t u k s e s s a + n y k y b a l e t t i + n y k y b u d j e t i s t a + n y k y d e m o k r a t i a a n + n y k y d e m o k r a t i a n + n y k y d e m o k r a t i o i d e n + n y k y d e m o k r a t i o i s s a + n y k y e l ä m ä n + n y k y e u r o o p p a l a i s t a + n y k y f i l o s o f i a + n y k y h a a s t e i s i i n + n y k y h a l l i n n o l l e + n y k y h a l l i n n o n + n y k y h a l l i n t o + n y k y h a l l i n t o a + n y k y h a l l i t u k s e e n + n y k y h a l l i t u k s e n + n y k y h a l l i t u s + n y k y h e t k e e n + n y k y h e t k e l l ä + n y k y h e t k e n + n y k y h e t k e ä + n y k y h e t k i + n y k y h i n n a s t a + n y k y h i n n o i l l a + n y k y h i n n o i n + n y k y h i n n o i s s a + n y k y h i n t a t a s o l l a + n y k y h i s t o r i a a + n y k y h i s t o r i a n + n y k y h i s t o r i a s s a + n y k y h i s t o r i a s t a + n y k y h i s t o r i o i t s i j o i t a + n y k y i h m i n e n + n y k y i h m i s k u n t a + n y k y i h m i s t e n + n y k y i h m i s t ä + n y k y i l m a p i i r i s s ä + n y k y i l m i ö s t ä + n y k y i l m i ö t ä + n y k y i s e e n + n y k y i s e l l e + n y k y i s e l l e e n + n y k y i s e l l ä + n y k y i s e l l ä ä n + n y k y i s e l l ä ä n k i n + n y k y i s e l t ä + n y k y i s e n + n y k y i s e n k i n + n y k y i s e n l a i s e s s a + n y k y i s e n ä + n y k y i s e s s ä + n y k y i s e s s ä k i n + n y k y i s e s t ä + n y k y i s e s t ä ä n + n y k y i s e t + n y k y i s e t k i n + n y k y i s i i n + n y k y i s i l l e + n y k y i s i l l ä + n y k y i s i l l ä ä n + n y k y i s i n h ä n + n y k y i s i n k i n + n y k y i s i n k ä ä n + n y k y i s i s s ä + n y k y i s i s s ä k i n + n y k y i s i s t ä + n y k y i s i ä + n y k y i s t e n + n y k y i s t ä + n y k y i s t ä k i n + n y k y j a k s o l l a + n y k y j a l k a p a l l o n + n y k y j o h t o + n y k y j ä r j e s t e l m i e n + n y k y j ä r j e s t e l m i ä + n y k y j ä r j e s t e l m ä + n y k y j ä r j e s t e l m ä l l e + n y k y j ä r j e s t e l m ä l l ä + n y k y j ä r j e s t e l m ä n + n y k y j ä r j e s t e l m ä s s ä + n y k y j ä r j e s t e l m ä s t ä + n y k y j ä r j e s t e l m ä ä + n y k y j ä r j e s t e l m ä ä n + n y k y j ä r j e s t e l y l l e + n y k y j ä r j e s t e l y s t ä + n y k y j ä r j e s t e l y ä + n y k y k a p a s i t e e t t i + n y k y k a p a s i t e e t t i i n + n y k y k a u p p a + n y k y k e h i t y k s e n + n y k y k e h i t y k s e s t ä + n y k y k e h i t y s + n y k y k e h i t y s t ä + n y k y k i e l e n + n y k y k i e l e s t ä + n y k y k i e l i e n + n y k y k i e l t e n + n y k y k o k o i n e n + n y k y k o k o i s e n + n y k y k o k o o n p a n o n + n y k y k o n t e k s t i s s a + n y k y k r e i k a n + n y k y k r e i k k a + n y k y k r e i k k a a + n y k y k r i i s i + n y k y k r i i s i n + n y k y k r i i s i s s ä + n y k y k r i t e e r i t + n y k y k u l t t u u r i l l e m m e + n y k y k u l u t u k s e l l a + n y k y k ä y t ä n n ö i s t ä + n y k y k ä y t ä n n ö n + n y k y k ä y t ä n n ö s t ä + n y k y k ä y t ä n n ö t + n y k y k ä y t ä n t ö + n y k y k ä y t ä n t ö j e n + n y k y k ä y t ä n t ö j ä + n y k y k ä y t ä n t ö ä + n y k y k ä y t ä n t ö ä ä n + n y k y k ä y t ä n t ö ö n + n y k y l a i n s ä ä d ä n n ö n + n y k y l a i n s ä ä d ä n n ö s s ä + n y k y l a i n s ä ä d ä n n ö s t ä + n y k y l a i n s ä ä d ä n t ö + n y k y l a i n s ä ä d ä n t ö m m e + n y k y l a i n s ä ä d ä n t ö ä + n y k y l ä ä k e t i e t e e l l e + n y k y l ä ä k e t i e t e e n + n y k y m a a i l m a + n y k y m a a i l m a a + n y k y m a a i l m a a n + n y k y m a a i l m a l l e + n y k y m a a i l m a n + n y k y m a a i l m a s s a + n y k y m a a i l m a s s a k i n + n y k y m a a i l m a s t a + n y k y m a h d o l l i s u u k s i s t a + n y k y m a i n o n n a n + n y k y m a l l i n + n y k y m a l l i s t a + n y k y m a r k k i n a t + n y k y m e d i o i d e n + n y k y m u o d o s s a + n y k y m u o d o s s a a n + n y k y m u o t o + n y k y m u o t o i n e n + n y k y m u s i i k k i + n y k y m ä ä r i t e l m i s t ä + n y k y m ä ä r ä ä n + n y k y n o r m i e n + n y k y n u o r e t + n y k y n u o r i a + n y k y n u o r i l l e + n y k y n u o r i s o + n y k y n u o r t e n + n y k y n ä k y m ä + n y k y o l o i h i n + n y k y o l o i s s a + n y k y o l o j a + n y k y o l o j e n + n y k y o l o s u h t e e t + n y k y o l o s u h t e i s s a + n y k y o l o t + n y k y o n g e l m a t + n y k y o n g e l m i i n + n y k y o n g e l m i s s a + n y k y p o l i t i i k a n + n y k y p o l i t i i k a s t a + n y k y p o l i t i i k k a + n y k y p o l i t i i k k a a + n y k y p o l i t i i k k o j a + n y k y p r o f i i l i s t a + n y k y p ä i v i e n + n y k y p ä i v ä n + n y k y p ä i v ä n ä + n y k y p ä i v ä ä + n y k y p ä i v ä ä n + n y k y r a j o j e n + n y k y r a t k a i s u j e n + n y k y r e s u r s s e i l l e + n y k y r e s u r s s e i n + n y k y r i k o l l i s u u d e n + n y k y r i k o l l i s u u t t a + n y k y s i j o i l l a a n + n y k y s i v i l i s a a t i o s s a + n y k y s o p i m u k s i s s a + n y k y s t r a t e g i a + n y k y s u h t e i s t a + n y k y s u k u p o l v e l l e + n y k y s u u n t a u k s e n + n y k y s u u n t a u k s e n a + n y k y s u u n t a u k s e s s a + n y k y s u u n t a u k s e s t a + n y k y s u u n t a u k s e t + n y k y s u u n t a u s + n y k y s u u n t a u s t a + n y k y s ä ä n n ö i l l ä + n y k y s ä ä n n ö k s e t + n y k y s ä ä n t ö + n y k y s ä ä n t ö j e n + n y k y t a h d i l l a + n y k y t a h t i i n + n y k y t a i d e + n y k y t a i d e t t a + n y k y t a i s t e l i j o i d e n + n y k y t a i t e e n + n y k y t a i t e i l i j o i d e n + n y k y t a i t e i l i j o i l l e + n y k y t a i t e i l i j o i t a + n y k y t a l o u d e n + n y k y t a l o u s + n y k y t a n s s i + n y k y t a p a h t u m a t + n y k y t a p a h t u m i s t a + n y k y t a p o j e n + n y k y t a r p e e t + n y k y t a r p e i d e n s a + n y k y t a r p e i s i i n + n y k y t a r p e i s i n + n y k y t a r p e i t a + n y k y t a s o + n y k y t a s o a + n y k y t a s o l l a + n y k y t a s o l l a a n + n y k y t a s o l l e e n + n y k y t a s o n + n y k y t a s o o n + n y k y t a s o s t a + n y k y t a v o i t t e i s t a + n y k y t e k n i i k a l l a + n y k y t e k n i i k a n + n y k y t e k n i i k k a + n y k y t e k n i i k k a a + n y k y t e k n o l o g i a + n y k y t e k n o l o g i a a + n y k y t e k n o l o g i a n + n y k y t e k n o l o g i a s s a + n y k y t e k n o l o g i a t + n y k y t e k n o l o g i o i d e n + n y k y t e o l l i s u u t t a + n y k y t e r m i e n + n y k y t e r r o r i s m i + n y k y t i e d e + n y k y t i e t e e n + n y k y t i e t e e s s ä + n y k y t i e t o + n y k y t i e t o o n + n y k y t i e t o u d e n + n y k y t i e t ä m y k s e n + n y k y t i e t ä m y k s e s s ä m m e + n y k y t i l a + n y k y t i l a a + n y k y t i l a a n + n y k y t i l a n + n y k y t i l a n n e + n y k y t i l a n n e t t a + n y k y t i l a n t e e l l e + n y k y t i l a n t e e l t a + n y k y t i l a n t e e m m e + n y k y t i l a n t e e n + n y k y t i l a n t e e s e e m m e + n y k y t i l a n t e e s e e n + n y k y t i l a n t e e s s a + n y k y t i l a n t e e s t a + n y k y t i l a s s a + n y k y t i l a s s a a n + n y k y t i l a s t a + n y k y t o d e l l i s u u d e n + n y k y t o d e l l i s u u d e s s a + n y k y t o d e l l i s u u s + n y k y t o d e l l i s u u t t a + n y k y t o i m i i n + n y k y t o i m i n n a n + n y k y t r e n d i + n y k y t u l o k s e t + n y k y t u o t a n n o s t a + n y k y t u o t t a j i e n + n y k y t u t k i m u k s e l l e + n y k y t u t k i m u k s e n + n y k y t u t k i m u s t a + n y k y t u t k i m u s t e n + n y k y u n i o n i n + n y k y u r h e i l u n + n y k y v a a t i m u k s e m m e + n y k y v a a t i m u k s i a + n y k y v a a t i m u s t e n + n y k y v a i h e e n + n y k y v a i h e e s s a + n y k y v a i k u t e l m a a + n y k y v a u h t i + n y k y v e r s i o + n y k y v e r s i o n + n y k y v ä e s t ö n + n y k y ä ä n k i n + n y l j e n n ä n + n y r e i s s ä ä n + n y r e y t t ä + n y r k e i n + n y r k k e i l i j ä t + n y r k k e i l l ä + n y r k k e i l y k e h i s s ä + n y r k k e i l y k e h ä n + n y r k k e i l y k e h ä s s ä + n y r k k e i l y k e h ä ä n + n y r k k e i l y l i i t t o + n y r k k e i l y o t t e l u a + n y r k k e i l y o t t e l u n + n y r k k e i l y o t t e l u u n + n y r k k i n s ä + n y r k k i r a u t a + n y r k k i s ä ä n t ö j ä n n e + n y s t y k ä r p ä s s i e n i + n y s t y m u k u l a k u u k u n e n + n y t h ä n + n y t k i n + n y t k ä ä n + n y y h k i e n + n ä e k ä ä n + n ä e m m e + n ä e m m e h ä n + n ä e m m e k i n + n ä e m m e k ä ä n + n ä e n + n ä e n k i n + n ä e n n ä i s a m m a t i n h a r j o i t t a j i k s i + n ä e n n ä i s d e m o k r a t i a + n ä e n n ä i s d e m o k r a t i a s t a + n ä e n n ä i s e e n + n ä e n n ä i s e l i i t i n + n ä e n n ä i s e l i i t t i + n ä e n n ä i s e n + n ä e n n ä i s e s t ä + n ä e n n ä i s h y v i n v o i n t i + n ä e n n ä i s j ä s e n y y t t ä + n ä e n n ä i s k e s k u s t e l u a + n ä e n n ä i s k e s k u s t e l u n a + n ä e n n ä i s k u l t t u u r i + n ä e n n ä i s m a a n t i e t e e l l i s i i n + n ä e n n ä i s m u i s t i + n ä e n n ä i s p e r u s t e l u n + n ä e n n ä i s p o l i t i i k k a a + n ä e n n ä i s p o l k u m y y n n i n + n ä e n n ä i s r a t k a i s u + n ä e n n ä i s r a t k a i s u k s i + n ä e n n ä i s r e k i s t e r i + n ä e n n ä i s s a t u n n a i s l u k u g e n e r a a t t o r i + n ä e n n ä i s s o p i m u k s i i n + n ä e n n ä i s s o p i m u s t e n + n ä e n n ä i s s u o s t u m u k s e e n + n ä e n n ä i s t e r r o r i s t e j a + n ä e n n ä i s t i e t e e l l i s e n + n ä e n n ä i s t o d e l l i s u u t t a + n ä e n n ä i s t u o m i o i s t u i m e n + n ä e n n ä i s t ä + n ä e n n ä i s u u d i s t u s + n ä e n n ä i s v a a l i + n ä e n n ä i s v a l t i o l l e + n ä e n n ä i s v a l t i o n + n ä e n n ä i s v a l t i o t a + n ä e n n ä i s v i l j e l y y n + n ä e t t e + n ä e t t e k ö + n ä h d e n + n ä h d e s s ä m m e + n ä h d e s s ä n i + n ä h d e s s ä ä n + n ä h d ä + n ä h d ä k s e m m e + n ä h d ä k s e n i + n ä h d ä k s e n n e + n ä h d ä ä n + n ä h k ä ä m m e + n ä h n e e t + n ä h n y t + n ä h t y + n ä h t y ä + n ä h t y ä n i + n ä h t y ä ä n + n ä h t ä v y y k s i ä m m e + n ä h t ä v ä k s i + n ä i d e n + n ä i h i n + n ä i l l e + n ä i l l ä + n ä i l l ä k ä ä n + n ä i m m e + n ä i n k i n + n ä i n ä + n ä i s s ä + n ä i s t ä + n ä i t t e + n ä i t ä + n ä i t ä h ä n + n ä k e e + n ä k e e k ö + n ä k e m i ä m m e + n ä k e m y k s e e m m e + n ä k e m y k s e e n + n ä k e m y k s e e n i + n ä k e m y k s e e n s ä + n ä k e m y k s e l l e + n ä k e m y k s e l l ä + n ä k e m y k s e m m e + n ä k e m y k s e n + n ä k e m y k s e n i + n ä k e m y k s e n n e + n ä k e m y k s e n s ä + n ä k e m y k s e s t ä + n ä k e m y k s e s t ä n n e + n ä k e m y k s e t + n ä k e m y k s i e m m e + n ä k e m y k s i i m m e + n ä k e m y k s i i n + n ä k e m y k s i i n i + n ä k e m y k s i i n s ä + n ä k e m y k s i l l e e n + n ä k e m y k s i l l ä + n ä k e m y k s i s s ä + n ä k e m y k s i s s ä n n e + n ä k e m y k s i s t ä + n ä k e m y k s i s t ä m m e + n ä k e m y k s i s t ä n n e + n ä k e m y k s i s t ä ä n + n ä k e m y k s i ä + n ä k e m y k s i ä m m e + n ä k e m y k s i ä n n e + n ä k e m y k s i ä ä n + n ä k e m y s e r o + n ä k e m y s e r o i h i n + n ä k e m y s e r o i s t a + n ä k e m y s e r o j a + n ä k e m y s e r o j e n + n ä k e m y s e r o j e n s a + n ä k e m y s e r o m m e + n ä k e m y s e r o n i + n ä k e m y s e r o n s a + n ä k e m y s e r o t + n ä k e m y s t e n + n ä k e m y s t e n i + n ä k e m y s t e n v a i h d o l l e + n ä k e m y s t e n v a i h d o n + n ä k e m y s t e n v a i h d o s t a + n ä k e m y s t e n v a i h t o + n ä k e m y s t e n v a i h t o a + n ä k e m y s t e n v a i h t o o n + n ä k e m y s t ä + n ä k e m y s t ä m m e + n ä k e m y s t ä n i + n ä k e m y s t ä n n e + n ä k e m y s t ä ä n + n ä k e m ä l t ä + n ä k e m ä m m e + n ä k e m ä n i + n ä k e m ä s t ä + n ä k e m ä s t ä ä n + n ä k e m ä t t ä + n ä k e m ä ä n + n ä k e v i l l e + n ä k e v i n ä n i + n ä k e v i n ä ä n + n ä k e v ä m m e + n ä k e v ä n i + n ä k e v ä t + n ä k i s i v ä t + n ä k y i + n ä k y i v ä t + n ä k y m i e n + n ä k y m i l l e + n ä k y m i n + n ä k y m i n e n + n ä k y m i s s ä + n ä k y m i s t ä + n ä k y m i ä + n ä k y m ä t + n ä k y m ä t t ö m i ä + n ä k y m ä t t ö m i ä k ä ä n + n ä k y m ä t t ö m ä m p i + n ä k y m ä t t ö m ä t + n ä k y m ä t ö n t ä + n ä k y n y t + n ä k y v i e n + n ä k y v i k s i + n ä k y v i m m i n + n ä k y v i m m i s t ä + n ä k y v i m m ä k s i + n ä k y v i m m ä n + n ä k y v i m m ä s t ä + n ä k y v i m m ä t + n ä k y v i m p i i n + n ä k y v i m p i ä + n ä k y v i m p ä n ä + n ä k y v i n + n ä k y v i n t ä + n ä k y v i s t ä m m e + n ä k y v i ä + n ä k y v y y d e s t ä + n ä k y v y y s o l o s u h t e e t + n ä k y v y y s o n g e l m a n + n ä k y v y y t t ä + n ä k y v ä k s i + n ä k y v ä m m i k s i + n ä k y v ä m m i n + n ä k y v ä m m ä k s i + n ä k y v ä m m ä n + n ä k y v ä m m ä s s ä + n ä k y v ä m m ä t + n ä k y v ä m p i + n ä k y v ä m p i e n + n ä k y v ä m p i ä + n ä k y v ä m p ä ä + n ä k y v ä m p ä ä n + n ä k y v ä n + n ä k y v ä s s ä + n ä k y v ä t + n ä k y v ä ä + n ä k y y k ö + n ä k y ä + n ä k ö a i s t i + n ä k ö a l a + n ä k ö a l a a + n ä k ö a l a n + n ä k ö a l a p a i k a l l a + n ä k ö a l o j a + n ä k ö e t ä i s y y d e l l ä + n ä k ö h a r h a n + n ä k ö h e r m o + n ä k ö k a n n a l t a + n ä k ö k a n n a n + n ä k ö k a n n a s t a + n ä k ö k a n n a t + n ä k ö k a n n o i l l a + n ä k ö k a n n o i l l e m m e + n ä k ö k a n n o i s t a + n ä k ö k a n t a + n ä k ö k a n t a a + n ä k ö k a n t a a m m e + n ä k ö k a n t a a n + n ä k ö k a n t a a n n e + n ä k ö k a n t a m m e + n ä k ö k a n t a n n e + n ä k ö k a n t a n s a + n ä k ö k a n t o i h i n + n ä k ö k a n t o j a + n ä k ö k a n t o j a a n + n ä k ö k a n t o j a m m e + n ä k ö k a n t o j a n n e + n ä k ö k a n t o j e n + n ä k ö k o h d a n + n ä k ö k o h d a s t a + n ä k ö k o h d a t + n ä k ö k o h d i l l a + n ä k ö k o h d i s s a + n ä k ö k o h d i s t a + n ä k ö k o h t a + n ä k ö k o h t a a + n ä k ö k o h t a a n + n ä k ö k o h t a n a + n ä k ö k o h t a n i + n ä k ö k o h t i a + n ä k ö k o h t i e n + n ä k ö k o h t i e n k i n + n ä k ö k o h t i i n + n ä k ö k u l m a + n ä k ö k u l m a a + n ä k ö k u l m a a m m e + n ä k ö k u l m a a n + n ä k ö k u l m a a n i + n ä k ö k u l m a n + n ä k ö k u l m a n i + n ä k ö k u l m a n n e + n ä k ö k u l m a n s a + n ä k ö k u l m a o t o s + n ä k ö k u l m a s t a m m e + n ä k ö k u l m a s t a n i + n ä k ö k u l m a t + n ä k ö k u l m i a + n ä k ö k u l m i a a n + n ä k ö k u l m i e n + n ä k ö k u l m i l l a + n ä k ö k u l m i l l a n n e + n ä k ö k u l m i n e e n + n ä k ö k u l m i s t a + n ä k ö k y k y ä + n ä k ö k y v y s t ä + n ä k ö l e n t o s ä ä n t ö j e n + n ä k ö m e r k k e i n e e n + n ä k ö o n g e l m a t + n ä k ö o n g e l m i s t a + n ä k ö p i i r i s s ä + n ä k ö r a j o i t t e i s e t + n ä k ö t e s t i e n + n ä k ö t o r n i + n ä k ö t u t k i m u s + n ä k ö v a m m a + n ä k ö v a m m a i s e t + n ä k ö v a m m a i s i a + n ä k ö v a m m a i s i l l e + n ä k ö v a m m a i s t a + n ä k ö v a m m a i s t e n + n ä l k i i n n y t t ä m i s p o l i t i i k a n + n ä l k i i n n y t t ä m i s p o l i t i i k k a + n ä l k i i n t y n e i s t ä + n ä l k ä a l u e i l l a + n ä l k ä i n d e k s i + n ä l k ä i s i ä + n ä l k ä k u i l u + n ä l k ä k u o l e m a a + n ä l k ä k u o l e m a l l e + n ä l k ä k u o l e m a n + n ä l k ä k u u r i l l e + n ä l k ä k u v a t + n ä l k ä l a k k o + n ä l k ä l a k k o a + n ä l k ä l a k k o a a n + n ä l k ä l a k k o i h i n + n ä l k ä l a k k o j a + n ä l k ä l a k k o j e n + n ä l k ä l a k k o k r i i s i + n ä l k ä l a k k o l a i n e n + n ä l k ä l a k k o l a i s e t + n ä l k ä l a k k o l a i s i s t a + n ä l k ä l a k k o l a i s t e n + n ä l k ä l a k k o n s a + n ä l k ä l a k k o o n + n ä l k ä l a k o i s t a + n ä l k ä l a k o l l a + n ä l k ä l a k o n + n ä l k ä l a k o s s a + n ä l k ä l a k o s t a + n ä l k ä l a k o t + n ä l k ä m e l l a k a t + n ä l k ä m e l l a k o i h i n + n ä l k ä m i e l e n o s o i t u k s i a + n ä l k ä o n g e l m a + n ä l k ä o n g e l m a n + n ä l k ä o n g e l m i a + n ä l k ä p a k o l a i s i a + n ä l k ä p a l k a l l e + n ä l k ä p a l k a t + n ä l k ä p a l k k a a + n ä l k ä p a l k k o i h i n + n ä l k ä p a l k k o j a + n ä l k ä p e l i + n ä l k ä p r o j e k t i n + n ä l k ä t i l a n n e t t a + n ä l k ä t r a g e d i a + n ä l k ä ä + n ä l k ä ä n + n ä l k ä ä n ä k e v i e n + n ä l ä n + n ä l ä n h ä d ä n + n ä l ä n h ä d ä s s ä + n ä l ä n h ä d ä s t ä + n ä l ä n h ä t i ä + n ä l ä n h ä t ä + n ä l ä n h ä t ä a l u e e k s i + n ä l ä n h ä t ä a l u e e n + n ä l ä n h ä t ä ä + n ä l ä n h ä t ä ä n + n ä l ä n t o r j u n t a t o i m i e n + n ä l ä n v a s t a i s e s t a + n ä l ä s t ä + n ä m ä k i n + n ä n n i l ä v i s t y s + n ä p e r r e l t i i n + n ä p e r t e l y ä + n ä p p e j ä ä n + n ä p p i m m e + n ä p p ä i m e s t ä + n ä p p ä i m i s t ö v e i s t o s + n ä p p ä i n p u h e l i n t a + n ä p ä y t t ä ä + n ä r k ä s t y n e e m p i ä + n ä r k ä s t y n e i n ä + n ä r k ä s t y n e i t ä + n ä r k ä s t y s t ä + n ä r k ä s t y t t y + n ä r k ä s t y ä + n ä s ä v i i s a i d e n + n ä t k e l m ä p u n a t ä p l ä + n ä t k e l m ä v i r n a + n ä y k k i j ä k i l p i k o n n a + n ä y t e i k k u n a + n ä y t e i k k u n a n a + n ä y t e i k k u n a o s t o s t e n + n ä y t e i k k u n a s s a + n ä y t e i k k u n o i d e n + n ä y t e i k k u n o i h i n + n ä y t e i k k u n o i t a + n ä y t e k a p p a l e + n ä y t e l l ä + n ä y t e l m i ä + n ä y t e l m ä ä n + n ä y t e t a p a h t u m a a + n ä y t e t a r k a s t u k s i a + n ä y t e t t i i n + n ä y t e t ä ä n + n ä y t i m m e + n ä y t t e e n o t t o k o h d a n + n ä y t t e e n o t t o k o h t a + n ä y t t e e n o t t o k o h t i e n + n ä y t t e e n o t t o k o h t i i n + n ä y t t e e n o t t o l a i t o k s e l l e + n ä y t t e e n o t t o m e n e t e l m i ä + n ä y t t e e n o t t o t a a j u u s + n ä y t t e i d e n + n ä y t t e i t ä + n ä y t t e l e m ä ä n + n ä y t t e l i j ö i s t ä + n ä y t t e l i j ö i t ä + n ä y t t e l y a l u e + n ä y t t e l y e s i n e i t ä + n ä y t t e l y h a l l e i s s a + n ä y t t e l y h a l l i + n ä y t t e l y h a l l i n + n ä y t t e l y i t ä + n ä y t t e l y k e s k u k s e s s a + n ä y t t e l y k e s k u s t a + n ä y t t e l y k u v i a + n ä y t t e l y l l ä + n ä y t t e l y o s a s t o s s a h a n + n ä y t t e l y s s ä + n ä y t t e l y t i l a a + n ä y t t e l y ä + n ä y t t i + n ä y t t i k i n + n ä y t t i v ä t + n ä y t t ä e s s ä ä n + n ä y t t ä i s i + n ä y t t ä k ä ä + n ä y t t ä k ä ä m m e + n ä y t t ä m i s e s t ä + n ä y t t ä m ä ä n + n ä y t t ä m ö a l a n + n ä y t t ä m ö l l e + n ä y t t ä m ö l l ä + n ä y t t ä m ö t a i t e e n + n ä y t t ä m ö t a i t e e s s a + n ä y t t ä m ö t e o k s i l l e + n ä y t t ä m ö t e o s t e n + n ä y t t ä m ö ä + n ä y t t ä n e e t + n ä y t t ä n y t + n ä y t t ä v i n + n ä y t t ä v i ä + n ä y t t ä v ä m m i n + n ä y t t ä v ä t + n ä y t t ä v ä t k ö + n ä y t t ä v ä ä n + n ä y t t ä ä + n ä y t t ä ä k i n + n ä y t t ä ä k s e e n + n ä y t t ä ä k s e m m e + n ä y t t ö l a i t e + n ä y t t ö m u i s t i + n ä y t t ö p ä ä t e d i r e k t i i v i n + n ä y t t ö p ä ä t e t y ö t ä + n ä y t t ö r u u d u l l a + n ä y t t ö t a u l u l l a + n ä y t t ö t i l a + n ä y t t ö ä + n ä y t ä n n ö s s ä + n ä y t ä t t e + n ä y t ö i s t ä + n ä y t ö n + n ä y t ö n o h j a i n + n ä y t ö s h a n k e t t a + n ä y t ö s h a n k k e i t a + n ä y t ö s l a j i + n ä y t ö s l u o n t e i s e t + n ä y t ö s o i k e u d e n k ä y n n e i s s ä + n ä y t ö s o i k e u d e n k ä y n n i n + n ä y t ö s o i k e u d e n k ä y n n i s s ä + n ä y t ö s o i k e u d e n k ä y n n i t + n ä y t ö s o i k e u d e n k ä y n t e i h i n + n ä y t ö s o i k e u d e n k ä y n t e j ä + n ä y t ö s o i k e u d e n k ä y n t i + n ä y t ö s o i k e u d e n k ä y n t i e n + n ä y t ö s o i k e u d e n k ä y n t i i n + n ä y t ö s o i k e u d e n k ä y n t i ä ä n + n ä y t ö s p o l i t i i k k a a n + n ä y t ö s v a a l i t + n ä ä d ä n k a r v a s i v e l l i n + n ä ä n t y y + n ä ö n t a r k a s t u s + n ä ö n t a r k k u u s + n ä ö s t ä ä n + n ö y r e m m i n + n ö y r e m p i + n ö y r e m p i ä + n ö y r i n + n ö y r i n ä + n ö y r i s t e l y ä + n ö y r i ä + n ö y r t y m ä ä n + n ö y r y y t e t ä ä n + n ö y r y y t t ä + n ö y r y y t t ä m ä l l ä + n ö y r y y t t ä v i m p i i n + n ö y r y y t t ä v ä m p i ä + n ö y r y y t t ä v ä s t ä + n ö y r y y t t ä ä + o b j e k t i i v i s e l l e + o b j e k t i i v i s e m m a n + o b j e k t i i v i s e m m i n + o b j e k t i i v i s e m p a a + o b j e k t i i v i s e m p a a n + o b j e k t i i v i s e m p i + o b j e k t i i v i s e m p i a + o b j e k t i i v i s e n + o b j e k t i i v i s e t + o b j e k t i i v i s i a + o b j e k t i i v i s i l l a + o b j e k t i i v i s i n a + o b j e k t i i v i s i s t a + o b j e k t i i v i s t a + o b j e k t i i v i s t e n + o b j e k t i i v i s u u s t a k u u + o b j e k t i k i e l i + o b j e k t i s u h d e t e o r i a + o b j e k t i t i e d o s t o + o b l i g a a t i o i d e n + o b l i g a a t i o i h i n + o b l i g a a t i o i t a + o b l i g a a t i o m a r k k i n a t + o b l i g a a t i o m a r k k i n o i d e n + o b l i g a a t i o m a r k k i n o i l t a + o b l i g a a t i o m a r k k i n o i t a + o b o e k o n s e r t t o + o b o e s o n a a t t i + o b s e r v a t o r i o n + o d o t a m m e + o d o t a m m e k i n + o d o t a m m e k o + o d o t a n + o d o t a n k i n + o d o t a t t e + o d o t a t t e k o + o d o t e l l a + o d o t e l l e n + o d o t e l l e s s a + o d o t e l l e s s a a n + o d o t e l l e s s a m m e + o d o t e l t a e s s a + o d o t e t a + o d o t e t a a n + o d o t e t a a n k i n + o d o t e t t a e s s a + o d o t e t t a i s i + o d o t e t t a i s i i n + o d o t e t t a v a + o d o t e t t a v a a + o d o t e t t a v i s s a + o d o t e t t i i n + o d o t e t t u a + o d o t e t t u j a + o d o t e t u n + o d o t i m m e + o d o t i m m e k i n + o d o t i n + o d o t t a a + o d o t t a a k a a n + o d o t t a a k i n + o d o t t a e n + o d o t t a e s s a + o d o t t a e s s a a n + o d o t t a e s s a m m e + o d o t t a e s s a n i + o d o t t a i s i + o d o t t a i s i m m e + o d o t t a k a a + o d o t t a k a a m m e + o d o t t a k o + o d o t t a m a + o d o t t a m a a n + o d o t t a m a s s a + o d o t t a m a t t o m a s s a + o d o t t a m a t t o m a t + o d o t t a m a t t o m i a + o d o t t a m a t t o m i e n + o d o t t a m a t t o m i i n + o d o t t a m a t t o m i s s a + o d o t t a m a t t o m i s t a + o d o t t a m i s e k s e n n e + o d o t t a n e e t + o d o t t a n u t + o d o t t a v a a n + o d o t t a v a m m e + o d o t t a v a n + o d o t t a v a n n e + o d o t t a v a s t a + o d o t t a v a t + o d o t t a v a t k o + o d o t t a v i e n + o d o t t e l e m a t t a + o d o t t e l e m i n e n + o d o t t e l u a i k o i h i n + o d o t t e l u p o l i t i i k a n + o d o t t i + o d o t t i v a t + o d o t u k s e l l a + o d o t u k s e m m e + o d o t u k s e n + o d o t u k s e n s a + o d o t u k s e t + o d o t u k s i a + o d o t u k s i a a n + o d o t u k s i a m m e + o d o t u k s i i n + o d o t u k s i l l a + o d o t u k s i l l e + o d o t u k s i l l e e n + o d o t u k s i s s a + o d o t u k s i s t a + o d o t u k s i s t a m m e + o d o t u s a i k a + o d o t u s a i k a a + o d o t u s a i k a a n + o d o t u s a i k a n a + o d o t u s a i k o i h i n + o d o t u s a i k o j a + o d o t u s a i k o j e n + o d o t u s a j a n + o d o t u s a j a s t a + o d o t u s a j a t + o d o t u s a j o i s t a + o d o t u s a l u e e l l a + o d o t u s a l u e e t + o d o t u s a r v o + o d o t u s a r v o a + o d o t u s h u o n e e s s a + o d o t u s h u o n e e t + o d o t u s h u o n e i s i i n + o d o t u s h u o n e i t a + o d o t u s h u o n e t t a + o d o t u s j o n o j a + o d o t u s j o n o t + o d o t u s l i s t a + o d o t u s l i s t a l l a + o d o t u s l i s t a l l e + o d o t u s l i s t a n + o d o t u s l i s t a t + o d o t u s l i s t o i h i n + o d o t u s l i s t o i l l a + o d o t u s l i s t o j a + o d o t u s l i s t o j e n + o d o t u s p e l i ä + o d o t u s t e m m e + o d o t u s t e n + o d o t u s t i l a + o f f s e t p a i n o + o h d a k e p e r h o n e n + o h e i s a l o j a + o h e i s a s i a k i r j o j a + o h e i s i l m i ö i t ä + o h e i s k u s t a n n u k s e t + o h e i s k u s t a n n u k s i n + o h e i s p a l v e l u j a + o h e i s s o p i m u k s i i n + o h e i s t a p a h t u m i a + o h e i s t a p a h t u m i s s a + o h e i s t o i m e n p i d e + o h e i s t o i m e n p i t e e n ä + o h e i s t o i m e n p i t e i d e n + o h e i s t o i m e n p i t e i s i i n + o h e i s t o i m e n p i t e i t ä + o h e i s t o i m i a + o h e i s t o i m i e n + o h e i s t o i m i i n + o h e i s t u h o i n a + o h e i s t y ö n + o h e i s v a i k u t u k s i a + o h e i s v a i k u t u k s i i n + o h e i s v a u r i o i t a + o h i l e n t o a n o m a l i a + o h i m e n e v ä ä + o h i m o l i h a s + o h i m o l o h k o + o h i m o l u u + o h i t a n k i n + o h i t t a a + o h i t t a m i s e k s i + o h i t t a n u t + o h i t u s j ä r j e s t e l m i ä + o h i t u s k a i s t a + o h i t u s k a i s t a l l a + o h i t u s k a i s t a l l e + o h i t u s k a i s t a n + o h i t u s l e i k k a u s + o h i t u s t i e n + o h j a a m a a n + o h j a a m a l l a + o h j a a m a s t a + o h j a a m a t t a + o h j a a m i s e e n + o h j a a m i s e k s i + o h j a a m i s t a + o h j a a m o j a + o h j a a m o l a i t t e i l l a + o h j a a m o m i e h i s t ö i l l ä + o h j a a m o m i e h i s t ö n + o h j a a m o m i e h i s t ö y h d i s t y s + o h j a a m o m i e h i s t ö ö n + o h j a a m o o n + o h j a a v a n + o h j a a v a t + o h j a a v i a + o h j a a v i e n + o h j a a v i s t a + o h j a i l e m a t o n t a + o h j a i l e v i a + o h j a i l t a v a + o h j a i l u m e k a n i s m i e n + o h j a i l u p o l i t i i k a k s i + o h j a i l u s s a + o h j a i l u v a r a + o h j a k s i i n + o h j a n n e e t + o h j a n n u t + o h j a s i v a t + o h j a s n o k i t i i r a + o h j a t + o h j a t a + o h j a t a a n + o h j a t a k s e e n + o h j a t a k s e m m e + o h j a t k a a m m e + o h j a t u m p a a + o h j a u k s e e n + o h j a u k s e l l a + o h j a u k s e l l e + o h j a u k s e n + o h j a u k s e s s a + o h j a u k s e s t a + o h j a u s h a n k k e e n + o h j a u s j a k s o + o h j a u s j a k s o a + o h j a u s j a k s o n + o h j a u s j a k s o o n + o h j a u s j ä r j e s t e l m i e n + o h j a u s j ä r j e s t e l m i s t ä + o h j a u s j ä r j e s t e l m i ä + o h j a u s j ä r j e s t e l m ä + o h j a u s j ä r j e s t e l m ä l l ä + o h j a u s j ä r j e s t e l m ä m m e + o h j a u s j ä r j e s t e l m ä n + o h j a u s j ä r j e s t e l m ä n s ä + o h j a u s j ä r j e s t e l m ä n ä + o h j a u s j ä r j e s t e l m ä s s ä + o h j a u s j ä r j e s t e l m ä s t ä + o h j a u s j ä r j e s t e l m ä ä + o h j a u s j ä r j e s t e l m ä ä n + o h j a u s j ä r j e s t e l y i h i n + o h j a u s k e h y s t ä + o h j a u s k e i n o + o h j a u s k e i n o i s t a + o h j a u s k e i n o j a + o h j a u s k e s k u k s i a + o h j a u s k e s k u k s i i n + o h j a u s k o m i t e a + o h j a u s k o m i t e a l l e + o h j a u s k o m i t e a l t a + o h j a u s k o m i t e a n + o h j a u s k o m i t e a s s a + o h j a u s k o m i t e a s t a + o h j a u s k o m i t e o i d e n + o h j a u s k o m i t e o i l l a + o h j a u s k o r k o + o h j a u s k o r k o a + o h j a u s k o r k o a a n + o h j a u s k o r k o j a + o h j a u s k o r k o j a a n + o h j a u s k o r k o j e n + o h j a u s k o r o n + o h j a u s l a i t t e e t + o h j a u s l a i t t e i s i i n + o h j a u s m a h d o l l i s u u k s i a + o h j a u s m a l l i + o h j a u s m a t e r i a a l i a + o h j a u s m e k a n i s m e i l l a + o h j a u s m e k a n i s m e i s t a + o h j a u s m e k a n i s m e j a + o h j a u s m e r k k i + o h j a u s m u o t o j a + o h j a u s o h j e l m a + o h j a u s o h j e l m a a + o h j a u s o h j e l m a a n + o h j a u s o h j e l m a n + o h j a u s o h j e l m a s t a + o h j a u s o h j e l m a t + o h j a u s o h j e l m i a + o h j a u s o h j e l m i e n + o h j a u s o h j e l m i l l a + o h j a u s o h j e l m i s s a + o h j a u s o h j e l m i s t a + o h j a u s p a k e t i n + o h j a u s p a k e t i s s a + o h j a u s p a k e t t i + o h j a u s p a k e t t i a + o h j a u s p a k e t t i i n + o h j a u s p a k e t t i n a + o h j a u s p a n e e l i + o h j a u s p a n e e l i i n + o h j a u s p a n e e l i n a + o h j a u s p e r u s t e i d e n + o h j a u s p u i t t e i t a + o h j a u s p y ö r ä + o h j a u s p y ö r ä ä n + o h j a u s r a h a s t o + o h j a u s r a h a s t o n + o h j a u s r a h a s t o s t a + o h j a u s r a k e n t e e n + o h j a u s r o o l i n + o h j a u s r y h m ä + o h j a u s r y h m ä k s i + o h j a u s r y h m ä n + o h j a u s r y h m ä s s ä + o h j a u s r y h m ä s t ä + o h j a u s s u u n n i t e l m a n + o h j a u s s u u n n i t e l m i e n + o h j a u s t a + o h j a u s t a m m e + o h j a u s t a n k o + o h j a u s t a r k o i t u k s i s s a + o h j a u s t a v a t + o h j a u s t e h o s t i n + o h j a u s t e h t ä v ä + o h j a u s t e h t ä v ä ä n + o h j a u s t i e t o a + o h j a u s t o i m e n p i t e i d e n + o h j a u s t o i m e n p i t e i l l ä + o h j a u s t o i m e t + o h j a u s t y ö r y h m ä + o h j a u s t y ö r y h m ä n + o h j a u s t y ö r y h m ä n n e + o h j a u s v a i k u t u k s i a + o h j a u s v a i k u t u s t a + o h j a u s v a u n u + o h j a u s v ä l i n e e n + o h j a u s v ä l i n e e t + o h j a u s v ä l i n e i d e n + o h j a u s v ä l i n e i n ä + o h j a u s v ä l i n e i s t ä + o h j a u s v ä l i n e i t ä + o h j e a r v o a + o h j e a r v o i s t a + o h j e a r v o j a + o h j e a r v o n + o h j e a r v o t + o h j e a s i a k i r j a + o h j e a s i a k i r j a n + o h j e a s i a k i r j a s s a + o h j e a s i a k i r j a t + o h j e e l l i s i a + o h j e e l l i s i i n + o h j e e n a + o h j e e t + o h j e h i n n a t + o h j e h i n t a + o h j e h i n t o j e n + o h j e i d e n + o h j e i s t a a + o h j e i s t o n + o h j e i s t u k s e n + o h j e i s t u s m e n e t t e l y ä + o h j e i s t u s t a + o h j e i t a + o h j e k e h y k s e n + o h j e k i r j a + o h j e k i r j a a + o h j e k i r j a n + o h j e k i r j a t + o h j e k ä s i k i r j a n + o h j e l m a a + o h j e l m a a n + o h j e l m a a n i + o h j e l m a a n n e + o h j e l m a a n s a + o h j e l m a e h d o t u k s i a + o h j e l m a e h d o t u s + o h j e l m a e h d o t u s t a + o h j e l m a e n n u s t e e t + o h j e l m a h a l l i n n o n + o h j e l m a i n t e r v e n t i o i d e n + o h j e l m a j a k s o + o h j e l m a j a k s o a + o h j e l m a j a k s o j e n + o h j e l m a j a k s o l l a + o h j e l m a j a k s o n + o h j e l m a j u l i s t u s + o h j e l m a k a u d e k s i + o h j e l m a k a u d e l l a + o h j e l m a k a u d e l l e + o h j e l m a k a u d e l t a + o h j e l m a k a u d e n + o h j e l m a k a u d e s t a + o h j e l m a k a u d e t + o h j e l m a k a u s i + o h j e l m a k a u s i a + o h j e l m a k a u s i e n + o h j e l m a k a u s i i n + o h j e l m a k a u s i l l a + o h j e l m a k a u s i n a + o h j e l m a k a u s i s t a + o h j e l m a k a u t e e n + o h j e l m a k a u t e n a + o h j e l m a k a u t t a + o h j e l m a k e h y k s e n + o h j e l m a k i e r r o s + o h j e l m a k o h t a a + o h j e l m a k o h t a i s e e n + o h j e l m a k o h t a i s e s t i + o h j e l m a k o h t i e n + o h j e l m a k o h t i i n n e + o h j e l m a k o m i t e a + o h j e l m a k o m i t e a a + o h j e l m a k o m i t e a n + o h j e l m a k o m i t e o i d e n + o h j e l m a k o m i t e o i h i n + o h j e l m a k o o r d i n a a t t o r i n a + o h j e l m a k u m p p a n i e n + o h j e l m a l a u s u m i e n + o h j e l m a l i n j o j e n s a + o h j e l m a l l a + o h j e l m a l l e + o h j e l m a l u o n n o k s e n + o h j e l m a l u o n n o k s i a a n + o h j e l m a l u o n n o s + o h j e l m a m e n e t t e l y i h i m m e + o h j e l m a m u s i i k k i + o h j e l m a m u u t o k s i a + o h j e l m a n + o h j e l m a n e u v o t t e l u i d e n + o h j e l m a n e u v o t t e l u j a + o h j e l m a n e u v o t t e l u t + o h j e l m a n j u l i s t u k s e n + o h j e l m a n s a + o h j e l m a n s u u n n i t t e l u k a u d e n + o h j e l m a n s u u n n i t t e l u k a u s i + o h j e l m a n s u u n n i t t e l u k a u t t a + o h j e l m a n s u u n n i t t e l u v a i h e e n + o h j e l m a o p a s + o h j e l m a o t s a k k e e s s a + o h j e l m a p a k e t i n + o h j e l m a p a k e t i s s a a n + o h j e l m a p a k e t t i + o h j e l m a p o h j a i s e n + o h j e l m a p o l i t i i k a n + o h j e l m a p u h e + o h j e l m a p u o l i s k o n + o h j e l m a p ä ä t ö k s e e n + o h j e l m a r a a k i l e + o h j e l m a r a h o i t u s + o h j e l m a r a k e n n e + o h j e l m a r a p o r t i n + o h j e l m a s i g n a a l i + o h j e l m a s i s ä l l ö n + o h j e l m a s i s ä l t ö ä + o h j e l m a s o p i m u k s e t + o h j e l m a s o p i m u k s i a + o h j e l m a s o p i m u k s i l l e + o h j e l m a s o p i m u s t a + o h j e l m a s o p i m u s t e n + o h j e l m a s s a + o h j e l m a s s a a n + o h j e l m a s s a n n e + o h j e l m a s t a + o h j e l m a s u k u p o l v e e n + o h j e l m a s u k u p o l v e l t a + o h j e l m a s u k u p o l v e n + o h j e l m a s u u n n i t e l m a + o h j e l m a s u u n n i t t e l u + o h j e l m a s u u n n i t t e l u a + o h j e l m a s u u n n i t t e l u n + o h j e l m a s u u n n i t t e l u p r o s e s s i n + o h j e l m a s u u n n i t t e l u s s a + o h j e l m a s u u n n i t t e l u t y ö t ä + o h j e l m a s u u n n i t t e l u u n + o h j e l m a s u u n n i t t e l u v a i h e e s e e n + o h j e l m a t + o h j e l m a t a r j o n n a n + o h j e l m a t a s o l l a + o h j e l m a t a v o i t e t t a + o h j e l m a t a v o i t t e e t + o h j e l m a t e o l l i s u u d e n + o h j e l m a t e o l l i s u u t e e n + o h j e l m a t i e t o j a + o h j e l m a t u k e a + o h j e l m a t u o t a n n o n + o h j e l m a t u o t a n t o a + o h j e l m a t y y p e i s t ä + o h j e l m a t y y p i s s ä + o h j e l m a t y ö t ä + o h j e l m a t y ö v a r a u k s e n + o h j e l m a t y ö v a r a u k s e s t a + o h j e l m a v a a t i m u k s e t + o h j e l m a v a i h t o e h t o i h i n + o h j e l m a v a l i k o i m a a + o h j e l m a v e r s i o t a + o h j e l m a v u o d e n + o h j e l m a v u o s i + o h j e l m a y h t e i s t y ö s t ä + o h j e l m a y r i t y s t e n + o h j e l m i a + o h j e l m i a a n + o h j e l m i e m m e + o h j e l m i e n + o h j e l m i i n + o h j e l m i k s i + o h j e l m i l l a + o h j e l m i l l e + o h j e l m i l l e m m e + o h j e l m i s s a + o h j e l m i s s a k a a n + o h j e l m i s s a m m e + o h j e l m i s t a + o h j e l m i s t o a + o h j e l m i s t o a l a + o h j e l m i s t o a l a l l a + o h j e l m i s t o a l a n + o h j e l m i s t o a s i a n t u n t i j a t + o h j e l m i s t o a s i a n t u n t i j o i t a + o h j e l m i s t o e l e m e n t i n + o h j e l m i s t o i l l e + o h j e l m i s t o i n n o v o i n t i a + o h j e l m i s t o i n s i n ö ö r e i l l ä + o h j e l m i s t o i s s a + o h j e l m i s t o i s t a + o h j e l m i s t o j a + o h j e l m i s t o j e n + o h j e l m i s t o j ä r j e s t e l m i e n + o h j e l m i s t o j ä r j e s t e l m i l l ä + o h j e l m i s t o j ä r j e s t e l m i ä + o h j e l m i s t o k e h i t t ä j i e n + o h j e l m i s t o k e h i t t ä j i l l ä + o h j e l m i s t o k e h i t t ä j i ä + o h j e l m i s t o k e h i t t ä j ä t + o h j e l m i s t o k e h i t y s + o h j e l m i s t o k e h i t y s t o i m i n t a a + o h j e l m i s t o k e h i t y s t ä + o h j e l m i s t o k e h y s + o h j e l m i s t o k e k s i n t ö n s ä + o h j e l m i s t o k e s k i ö s s ä + o h j e l m i s t o l i i k e t o i m i n t a + o h j e l m i s t o m a r k k i n o i l l a + o h j e l m i s t o m a r k k i n o i t a + o h j e l m i s t o m e n e t e l m i l l e + o h j e l m i s t o n + o h j e l m i s t o n k e h i t t ä j ä t + o h j e l m i s t o n t o i m i t t a j a t + o h j e l m i s t o p a k e t e i s s a + o h j e l m i s t o p a k e t t e j a + o h j e l m i s t o p a l v e l u j e n + o h j e l m i s t o p a t e n t e i l l a + o h j e l m i s t o p a t e n t e i s s a + o h j e l m i s t o p a t e n t e i s t a + o h j e l m i s t o p a t e n t i n + o h j e l m i s t o p a t e n t i t + o h j e l m i s t o p a t e n t o i n n i n + o h j e l m i s t o p a t e n t t e j a + o h j e l m i s t o p a t e n t t i + o h j e l m i s t o p a t e n t t i d i r e k t i i v i + o h j e l m i s t o p a t e n t t i d i r e k t i i v i k s i + o h j e l m i s t o p a t e n t t i d i r e k t i i v i n + o h j e l m i s t o p a t e n t t i d i r e k t i i v i ä + o h j e l m i s t o p a t e n t t i e n + o h j e l m i s t o p a t e n t t i h a k e m u k s i a + o h j e l m i s t o p a t e n t t i k ä y t ä n n ö s t ä + o h j e l m i s t o r a d i o + o h j e l m i s t o s e k t o r i n + o h j e l m i s t o s o v e l l u s + o h j e l m i s t o s o v e l l u s t e n + o h j e l m i s t o s u o d a t t i m i e n + o h j e l m i s t o s u u n n i t t e l i j a + o h j e l m i s t o s u u n n i t t e l i j o i d e n + o h j e l m i s t o t + o h j e l m i s t o t e k n i i k k a + o h j e l m i s t o t e o l l i s u u d e l l e + o h j e l m i s t o t e o l l i s u u d e n + o h j e l m i s t o t e o l l i s u u d e s s a + o h j e l m i s t o t e o l l i s u u d e s t a + o h j e l m i s t o t e o l l i s u u s + o h j e l m i s t o t e o l l i s u u t t a + o h j e l m i s t o t o i m i t t a j a n + o h j e l m i s t o t u o t a n t o + o h j e l m i s t o t u o t t e i t a + o h j e l m i s t o t y y p e i s t ä + o h j e l m i s t o v a a t i m u k s e t + o h j e l m i s t o v a l m i s t a j a t + o h j e l m i s t o v e l v o i t t e i d e n + o h j e l m i s t o v ä l i n e i s t ä + o h j e l m i s t o y h t i ö + o h j e l m i s t o y h t i ö i d e n + o h j e l m i s t o y h t i ö t + o h j e l m i s t o y r i t y k s i l l e + o h j e l m i s t o y r i t y k s i ä + o h j e l m i s t o y r i t y s t e n + o h j e l m o i j a n + o h j e l m o i n t i a j a l l a + o h j e l m o i n t i a s i a k i r j a a + o h j e l m o i n t i a s i a k i r j a t + o h j e l m o i n t i j a k s o j ä r j e s t e l m ä + o h j e l m o i n t i k a u d e l l a + o h j e l m o i n t i k a u d e l l e + o h j e l m o i n t i k a u d e n + o h j e l m o i n t i k a u s i + o h j e l m o i n t i k a u t e e n + o h j e l m o i n t i k a u t t a + o h j e l m o i n t i k e s k u s t e l u t + o h j e l m o i n t i k i e l i + o h j e l m o i n t i k i e l i s s ä + o h j e l m o i n t i k i e l i s t ä + o h j e l m o i n t i k i e l i ä + o h j e l m o i n t i k i e l t ä + o h j e l m o i n t i k ä y t ä n n ö t + o h j e l m o i n t i p a r a d i g m a + o h j e l m o i n t i p r o s e s s i s s a + o h j e l m o i n t i r a j a p i n t a + o h j e l m o i n t i v a i h e e s s a + o h j e l m o i n t i v a i k e u k s i a + o h j e l m o i n t i v i r h e + o h j e l m o i n t i v u o t t a + o h j e l m o i n t i v ä l i n e + o h j e l m o i n t i v ä l i n e e n + o h j e l m o i n t i y m p ä r i s t ö + o h j e l m o i t a v a + o h j e l m o i t u j a + o h j e l u k u + o h j e l u o n n o k s i a + o h j e n o r m e i k s i + o h j e n u o r a + o h j e n u o r a k s i + o h j e n u o r a m m e + o h j e n u o r a n a + o h j e n u o r a n a a n + o h j e n u o r a n a m m e + o h j e n u o r i a + o h j e n u o r i e n + o h j e n u o r i n a + o h j e s ä ä n n ö i s t ä + o h j e s ä ä n n ö k s i + o h j e s ä ä n n ö l l e + o h j e s ä ä n n ö n + o h j e s ä ä n n ö s t ä + o h j e s ä ä n n ö t + o h j e s ä ä n t ö + o h j e s ä ä n t ö a s i a s s a + o h j e s ä ä n t ö i h i n + o h j e s ä ä n t ö j ä + o h j e s ä ä n t ö l u o n n o k s e e n + o h j e s ä ä n t ö l u o n n o k s e l l a + o h j e s ä ä n t ö l u o n n o k s e n + o h j e s ä ä n t ö l u o n n o k s e s s a + o h j e s ä ä n t ö l u o n n o k s e s t a + o h j e s ä ä n t ö l u o n n o s + o h j e s ä ä n t ö l u o n n o s t a + o h j e s ä ä n t ö ä + o h j e s ä ä n t ö ö n + o h j e t a s o i h i n + o h j e t a s o i l l a + o h j e t a s o j a + o h j e t a s o j e n + o h j e t a s o t + o h j e v ä h i t t ä i s h i n t a + o h j u k s e n s a + o h j u k s e t + o h j u k s i a + o h j u s h y ö k k ä y k s e t + o h j u s h y ö k k ä y k s i ä + o h j u s i s k u + o h j u s i s k u i l t a + o h j u s i s k u j a + o h j u s i s k u j e n + o h j u s i s k u t + o h j u s j ä r j e s t e l m i ä + o h j u s j ä r j e s t e l m ä k y s y m y s t ä + o h j u s j ä r j e s t e l m ä n + o h j u s j ä r j e s t e l m ä s t ä + o h j u s j ä r j e s t e l m ä ä + o h j u s j ä r j e s t e l m ä ä n + o h j u s k i l p e e n + o h j u s k i l p e ä + o h j u s k i l p i + o h j u s k i l p i a s i a s s a + o h j u s k i l p i e n + o h j u s k i l p i s t r a t e g i a n + o h j u s k i l p i ä + o h j u s k i l v e n + o h j u s k i l v e s t ä + o h j u s k o k e e n + o h j u s k o k e i t a + o h j u s k r i i s i + o h j u s k y s y m y k s e l l ä + o h j u s o h j e l m i s t a a n + o h j u s o n g e l m a + o h j u s p u o l u s t u k s e e n + o h j u s p u o l u s t u k s e n + o h j u s p u o l u s t u k s e s t a + o h j u s p u o l u s t u s + o h j u s p u o l u s t u s h a n k k e e s e e n + o h j u s p u o l u s t u s j ä r j e s t e l m i e n + o h j u s p u o l u s t u s j ä r j e s t e l m i s s ä + o h j u s p u o l u s t u s j ä r j e s t e l m i ä + o h j u s p u o l u s t u s j ä r j e s t e l m ä + o h j u s p u o l u s t u s j ä r j e s t e l m ä a l o i t e t t a + o h j u s p u o l u s t u s j ä r j e s t e l m ä n + o h j u s p u o l u s t u s j ä r j e s t e l m ä s t ä + o h j u s p u o l u s t u s j ä r j e s t e l m ä ä + o h j u s p u o l u s t u s j ä r j e s t e l m ä ä n + o h j u s p u o l u s t u s k i l p i + o h j u s p u o l u s t u s k i l v e n + o h j u s p u o l u s t u s o h j e l m a a + o h j u s p u o l u s t u s s t r a t e g i a a + o h j u s p u o l u s t u s t a + o h j u s p u o l u s t u s v i r a s t o n + o h j u s s u o j a k i l p i + o h j u s t a + o h j u s t e k n i i k a n + o h j u s t e k n o l o g i a n + o h j u s t e n + o h j u s t e n t o r j u n t a j ä r j e s t e l m i e n + o h j u s t e n t o r j u n t a j ä r j e s t e l m ä + o h j u s t e n t o r j u n t a j ä r j e s t e l m ä n + o h j u s t e n t o r j u n t a j ä r j e s t e l m ä s t ä + o h j u s t e n t o r j u n t a j ä r j e s t e l m ä t + o h j u s t e n t o r j u n t a j ä r j e s t e l m ä ä + o h j u s t e n t o r j u n t a j ä r j e s t e l m ä ä n + o h j u s t e n t o r j u n t a k i l v e n + o h j u s t e n t o r j u n t a o h j e l m i e n s a + o h j u s t e o l l i s u u t t a + o h j u s t e s t a u k s i s t a + o h j u s t o r j u n t a h a n k e t t a + o h j u s t o r j u n t a j ä r j e s t e l m ä + o h j u s t o r j u n t a j ä r j e s t e l m ä n + o h j u s t o r j u n t a j ä r j e s t e l m ä ä n + o h j u s u h k a a n + o h j u s v e n e + o h j u s v e n e e t + o h j u s v i e n t i ä + o h r a r u o h o + o h u e m p i a + o h u t k a l v o n + o h u t k a l v o t r a n s i s t o r i + o h u t s a r v i l a m m a s + o h u t s u o l i + o i k a i s e m a a n + o i k a i s e m a s s a + o i k a i s e m a t t a + o i k a i s e m i s e k s i + o i k a i s e m i s t a + o i k a i s e t t e + o i k a i s t a + o i k a i s t a a n + o i k a i s t a k s e e n + o i k a i s t a k s e n i + o i k a i s t a v a + o i k a i s u a + o i k a i s u j ä r j e s t e l m ä ä + o i k a i s u k e i n o j a + o i k a i s u k e i n o t + o i k a i s u k i r j e e n + o i k a i s u k i r j e e s s ä + o i k a i s u k i r j e l m i e n + o i k a i s u k i r j e l m i l l ä + o i k a i s u k i r j e l m i s t ä + o i k a i s u k i r j e l m ä + o i k a i s u k i r j e l m ä h ä n + o i k a i s u k i r j e l m ä l l ä + o i k a i s u k i r j e l m ä m e n e t t e l y y n + o i k a i s u k i r j e l m ä n + o i k a i s u k i r j e l m ä n s ä + o i k a i s u k i r j e l m ä s s ä + o i k a i s u k i r j e l m ä s s ä ä n + o i k a i s u k i r j e l m ä s t ä + o i k a i s u k i r j e l m ä t + o i k a i s u k i r j e l m ä ä + o i k a i s u m a h d o l l i s u u k s i a + o i k a i s u n + o i k a i s u s t a + o i k a i s u t o i m e n p i t e e t + o i k a i s u v a a t i m u k s e e n + o i k e a a + o i k e a k s i + o i k e a k ä t i s y y s + o i k e a l i n j a i s i a + o i k e a m i e l i n e n + o i k e a m i e l i s e t + o i k e a m p a a + o i k e a m p i + o i k e a n + o i k e a n a + o i k e a n l a i s e e n + o i k e a n l a i s e n + o i k e a n l a i s e t + o i k e a n l a i s i a + o i k e a n l a i s i l l e + o i k e a n l a i s t a + o i k e a n l a i s t e n + o i k e a n s u u n t a i n e n + o i k e a n s u u n t a i s e e n + o i k e a n s u u n t a i s e k s i + o i k e a n s u u n t a i s e l l e + o i k e a n s u u n t a i s e l t a + o i k e a n s u u n t a i s e n + o i k e a n s u u n t a i s e n a + o i k e a n s u u n t a i s e s t a + o i k e a n s u u n t a i s e s t i + o i k e a n s u u n t a i s e t + o i k e a n s u u n t a i s i a + o i k e a n s u u n t a i s i l t a + o i k e a n s u u n t a i s i n a + o i k e a n s u u n t a i s t a + o i k e a n s u u n t a i s t e n + o i k e a n s ä v y i n e n + o i k e a o p p i s e s t i + o i k e a o p p i s u u t t a + o i k e a s t a + o i k e a s u h t a i s e m p i + o i k e a s u h t a i s e s t i + o i k e a s u h t a i s i a + o i k e a s u h t a i s i n + o i k e a s u h t e i s e s t i + o i k e a s u h t e i s i a + o i k e a s u u n t a i n e n + o i k e a s u u n t a i s i a + o i k e a t + o i k e a t a + o i k e i k s i + o i k e i l t a + o i k e i m m a s s a + o i k e i n a + o i k e i s s a + o i k e i s t a + o i k e i s t o a + o i k e i s t o d i k t a t u u r i e n + o i k e i s t o d i k t a t u u r i n + o i k e i s t o e l i i t t i + o i k e i s t o e n e m m i s t ö + o i k e i s t o e n e m m i s t ö n + o i k e i s t o f e d e r a l i s t e j a + o i k e i s t o h a l l i t u k s e n + o i k e i s t o h a l l i t u k s e t + o i k e i s t o h a l l i t u k s i s t a + o i k e i s t o h a l l i t u s + o i k e i s t o h a l l i t u s t a + o i k e i s t o h a l l i t u s t e n + o i k e i s t o k i n + o i k e i s t o k o l l e g o i h i n + o i k e i s t o l a i s e e n + o i k e i s t o l a i s e l l e + o i k e i s t o l a i s e n + o i k e i s t o l a i s e n e m m i s t ö n + o i k e i s t o l a i s e s t i + o i k e i s t o l a i s e t + o i k e i s t o l a i s h a l l i t u s + o i k e i s t o l a i s i a + o i k e i s t o l a i s i i n + o i k e i s t o l a i s i k s i + o i k e i s t o l a i s i m m i s t a + o i k e i s t o l a i s i s t a + o i k e i s t o l a i s m i e l i s y y d e s t ä + o i k e i s t o l a i s p o l i t i i k a n + o i k e i s t o l a i s t a + o i k e i s t o l a i s t a k a a n + o i k e i s t o l a i s t e n + o i k e i s t o l a i s u u t t a + o i k e i s t o l a i s v o i m a t + o i k e i s t o l i b e r a a l i t + o i k e i s t o l l e + o i k e i s t o n + o i k e i s t o o n + o i k e i s t o p a i n o t t e i n e n + o i k e i s t o p a i n o t u s + o i k e i s t o p o l i i t i k k o j e n + o i k e i s t o p o l i i t i k o t + o i k e i s t o p o l i t i i k a n + o i k e i s t o p o l i t i i k k a + o i k e i s t o p o l i t i i k k a a + o i k e i s t o p o l i t i i k k a a n + o i k e i s t o p o p u l i s m i + o i k e i s t o p o p u l i s t e i s t a + o i k e i s t o p o p u l i s t e j a + o i k e i s t o p o p u l i s t i e n + o i k e i s t o p o p u l i s t i n + o i k e i s t o p o p u l i s t i n e n + o i k e i s t o p o p u l i s t i s i a + o i k e i s t o p u o l u e + o i k e i s t o p u o l u e e t + o i k e i s t o p u o l u e i t a + o i k e i s t o p u o l u e t t a + o i k e i s t o r a d i k a a l i + o i k e i s t o r a d i k a a l i e n + o i k e i s t o r a d i k a a l i k s i + o i k e i s t o r a d i k a a l i t + o i k e i s t o r a d i k a l i s m i a + o i k e i s t o r a d i k a l i s m i n + o i k e i s t o r y h m i e n + o i k e i s t o r y h m i s t ä + o i k e i s t o r y h m ä + o i k e i s t o r y h m ä n + o i k e i s t o r y h m ä t + o i k e i s t o s i i v e n + o i k e i s t o s t a + o i k e i s t o v o i m i e n + o i k e i s t o v ä k i v a l t a a n + o i k e i s t o y r i t y s j o h t a j a n + o i k e i t a + o i k e u d e k s i + o i k e u d e l l a + o i k e u d e l l e + o i k e u d e l l i s e e n + o i k e u d e l l i s e k s i + o i k e u d e l l i s e l l a + o i k e u d e l l i s e l l e + o i k e u d e l l i s e l t a + o i k e u d e l l i s e n + o i k e u d e l l i s e n a + o i k e u d e l l i s e s s a + o i k e u d e l l i s e s t a + o i k e u d e l l i s e s t i k i n + o i k e u d e l l i s e t + o i k e u d e l l i s i a + o i k e u d e l l i s i i n + o i k e u d e l l i s i l l a + o i k e u d e l l i s i n + o i k e u d e l l i s i s s a + o i k e u d e l l i s i s t a + o i k e u d e l l i s t a + o i k e u d e l l i s t e n + o i k e u d e n + o i k e u d e n a l o i l l a + o i k e u d e n h a l t i j a + o i k e u d e n h a l t i j a n + o i k e u d e n h a l t i j a r y h m i e n + o i k e u d e n h a l t i j a t + o i k e u d e n h a l t i j o i d e n + o i k e u d e n h a l t i j o i h i n + o i k e u d e n h a l t i j o i l l e + o i k e u d e n h a l t i j o i s t a + o i k e u d e n h a l t i j o i t a + o i k e u d e n h o i d o n + o i k e u d e n h o i d o s t a + o i k e u d e n h o i t o + o i k e u d e n h o i t o a + o i k e u d e n i s t u n t o j e n + o i k e u d e n k ä s i t t e l y y n + o i k e u d e n k ä y n n e i l l e + o i k e u d e n k ä y n n e i l l ä + o i k e u d e n k ä y n n e i s s ä + o i k e u d e n k ä y n n e i s t ä + o i k e u d e n k ä y n n i n + o i k e u d e n k ä y n n i s s ä + o i k e u d e n k ä y n n i s t ä + o i k e u d e n k ä y n n i t + o i k e u d e n k ä y n t e i h i n + o i k e u d e n k ä y n t e j ä + o i k e u d e n k ä y n t i + o i k e u d e n k ä y n t i a i k o j e n + o i k e u d e n k ä y n t i a l u e e s e e n + o i k e u d e n k ä y n t i a s i a k i r j o i h i n + o i k e u d e n k ä y n t i a s i a k i r j o j a + o i k e u d e n k ä y n t i a s i a k i r j o j e n + o i k e u d e n k ä y n t i e n + o i k e u d e n k ä y n t i f a r s s i a + o i k e u d e n k ä y n t i f a r s s i s s a + o i k e u d e n k ä y n t i i n + o i k e u d e n k ä y n t i j ä r j e s t e l m i e n + o i k e u d e n k ä y n t i j ä r j e s t e l m i i n + o i k e u d e n k ä y n t i j ä r j e s t e l m ä n + o i k e u d e n k ä y n t i j ä r j e s t e l m ä ä + o i k e u d e n k ä y n t i k i e r r o s t a + o i k e u d e n k ä y n t i k u l u i h i n + o i k e u d e n k ä y n t i k u l u i s s a + o i k e u d e n k ä y n t i k u l u i s t a + o i k e u d e n k ä y n t i k u l u j a + o i k e u d e n k ä y n t i k u l u j a a n + o i k e u d e n k ä y n t i k u l u j e n + o i k e u d e n k ä y n t i k u l u n s a + o i k e u d e n k ä y n t i k u l u t + o i k e u d e n k ä y n t i k ä y t ä n n ö n + o i k e u d e n k ä y n t i l a s k u j a + o i k e u d e n k ä y n t i m a k s u j a + o i k e u d e n k ä y n t i m e n e t t e l y + o i k e u d e n k ä y n t i m e n e t t e l y i h i n + o i k e u d e n k ä y n t i m e n e t t e l y i s t ä + o i k e u d e n k ä y n t i m e n e t t e l y j e n + o i k e u d e n k ä y n t i m e n e t t e l y j ä + o i k e u d e n k ä y n t i m e n e t t e l y n + o i k e u d e n k ä y n t i m e n e t t e l y t + o i k e u d e n k ä y n t i m e n e t t e l y y n + o i k e u d e n k ä y n t i m e n e t t e l y ä + o i k e u d e n k ä y n t i n s ä + o i k e u d e n k ä y n t i p a i k k a a + o i k e u d e n k ä y n t i p r o s e s s e i s s a + o i k e u d e n k ä y n t i p r o s e s s i + o i k e u d e n k ä y n t i p r o s e s s i e n + o i k e u d e n k ä y n t i p r o s e s s i n + o i k e u d e n k ä y n t i p r o s e s s i t + o i k e u d e n k ä y n t i p ä i v ä n + o i k e u d e n k ä y n t i s ä ä n n ö t + o i k e u d e n k ä y n t i t a k e i t a + o i k e u d e n k ä y n t i v a i h e e s s a + o i k e u d e n k ä y n t i v a i h e t t a + o i k e u d e n k ä y n t i v a l t i o s s a + o i k e u d e n k ä y n t i ä + o i k e u d e n k ä y t t ä j ä n ä + o i k e u d e n k ä y t t ö + o i k e u d e n k ä y t t ö a l u e + o i k e u d e n k ä y t t ö a l u e e l l a + o i k e u d e n k ä y t t ö a l u e e n + o i k e u d e n k ä y t t ö a l u e i d e n + o i k e u d e n k ä y t t ö a l u e i s i i n + o i k e u d e n k ä y t t ö a l u e t t a + o i k e u d e n k ä y t t ö v a l l a n + o i k e u d e n k ä y t t ö v a l t a + o i k e u d e n k ä y t t ö ä + o i k e u d e n k ä y t t ö ö n + o i k e u d e n k ä y t ö l l e + o i k e u d e n k ä y t ö n + o i k e u d e n k ä y t ö s s ä + o i k e u d e n l o u k k a u k s i i n + o i k e u d e n l o u k k a u s m e n e t t e l y j ä + o i k e u d e n m u k a i n e n + o i k e u d e n m u k a i s e e n + o i k e u d e n m u k a i s e k s i + o i k e u d e n m u k a i s e l l a + o i k e u d e n m u k a i s e l t a + o i k e u d e n m u k a i s e m m a k s i + o i k e u d e n m u k a i s e m m a l l a + o i k e u d e n m u k a i s e m m a n + o i k e u d e n m u k a i s e m m a s t a + o i k e u d e n m u k a i s e m m a t + o i k e u d e n m u k a i s e m m i k s i + o i k e u d e n m u k a i s e m m i n + o i k e u d e n m u k a i s e m p a a + o i k e u d e n m u k a i s e m p a a n + o i k e u d e n m u k a i s e m p i + o i k e u d e n m u k a i s e m p i a + o i k e u d e n m u k a i s e n + o i k e u d e n m u k a i s e n a + o i k e u d e n m u k a i s e s s a + o i k e u d e n m u k a i s e s t a + o i k e u d e n m u k a i s e s t i + o i k e u d e n m u k a i s e t + o i k e u d e n m u k a i s e t k a a n + o i k e u d e n m u k a i s i a + o i k e u d e n m u k a i s i i n + o i k e u d e n m u k a i s i k s i + o i k e u d e n m u k a i s i l l e + o i k e u d e n m u k a i s i m p i e n + o i k e u d e n m u k a i s i n + o i k e u d e n m u k a i s i n t a + o i k e u d e n m u k a i s i s s a + o i k e u d e n m u k a i s i s t a + o i k e u d e n m u k a i s t a + o i k e u d e n m u k a i s t e n + o i k e u d e n m u k a i s u u d e n + o i k e u d e n m u k a i s u u d e s t a + o i k e u d e n m u k a i s u u s + o i k e u d e n m u k a i s u u s k y s y m y s + o i k e u d e n m u k a i s u u s p e r i a a t e t t a + o i k e u d e n m u k a i s u u s p e r i a a t t e e n + o i k e u d e n m u k a i s u u s p e r i a a t t e e s e e n + o i k e u d e n m u k a i s u u s p e r i a a t t e i t a + o i k e u d e n m u k a i s u u s s ä ä n n ö i s t ä + o i k e u d e n m u k a i s u u s t e o r i a + o i k e u d e n m u k a i s u u t e e n + o i k e u d e n m u k a i s u u t t a + o i k e u d e n o m i s t a j i l l e + o i k e u d e n o m i s t a j i l t a + o i k e u d e n t a j u + o i k e u d e n t a j u a + o i k e u d e n t a v o i t t e l u l l e e n + o i k e u d e n t a v o i t t e l u n s a + o i k e u d e n t u n n o s t a m m e + o i k e u d e n t u n t o + o i k e u d e n t u n t o m m e + o i k e u d e n t u n t o n i + o i k e u d e n t y ö n ä + o i k e u d e s s a + o i k e u d e s t a + o i k e u d e s t a a n + o i k e u d e t + o i k e u k s i a + o i k e u k s i a a n + o i k e u k s i a m m e + o i k e u k s i a n n e + o i k e u k s i e m m e + o i k e u k s i e n + o i k e u k s i e n s a + o i k e u k s i i n + o i k e u k s i i n s a + o i k e u k s i l l a + o i k e u k s i l l e + o i k e u k s i l l e e n + o i k e u k s i n + o i k e u k s i s s a a n + o i k e u k s i s t a + o i k e u k s i s t a a n + o i k e u s a l a a + o i k e u s a l a a n + o i k e u s a l a l l a + o i k e u s a l a l l e + o i k e u s a l a n + o i k e u s a l o j a + o i k e u s a l u e + o i k e u s a l u e e l l a + o i k e u s a l u e e l t a + o i k e u s a l u e e n + o i k e u s a l u e e n a + o i k e u s a l u e e s e e n + o i k e u s a l u e e s t a + o i k e u s a l u e t t a + o i k e u s a n t r o p o l o g i a + o i k e u s a p u + o i k e u s a p u a + o i k e u s a p u a k i n + o i k e u s a p u a n o m u s t a + o i k e u s a p u a s i a l l e + o i k e u s a p u d i r e k t i i v i + o i k e u s a p u j ä r j e s t e l m ä + o i k e u s a p u j ä r j e s t e l m ä n + o i k e u s a p u k e s k u k s i a + o i k e u s a p u m e n e t t e l y t + o i k e u s a p u o h j e l m a + o i k e u s a p u o p e r a a t i o n + o i k e u s a p u p a l v e l u j a + o i k e u s a p u p y y n t ö + o i k e u s a p u p y y n t ö i h i n + o i k e u s a p u p y y n t ö j e n + o i k e u s a p u p y y n t ö j ä + o i k e u s a p u t a p a u k s i i n + o i k e u s a p u u n + o i k e u s a p u y l e i s s o p i m u k s e n + o i k e u s a s e m a + o i k e u s a s e m a a + o i k e u s a s e m a a n + o i k e u s a s e m a a n s a + o i k e u s a s e m a n + o i k e u s a s e m a s s a + o i k e u s a s e m a s t a a n + o i k e u s a s i a i n + o i k e u s a s i a i n m i n i s t e r i ä + o i k e u s a s i a i n v a l i o k u n t a + o i k e u s a s i a k i r j o j e n + o i k e u s a s i a m i e h e e n + o i k e u s a s i a m i e h e l l e + o i k e u s a s i a m i e h e n + o i k e u s a s i a m i e h e n k i n + o i k e u s a s i a m i e h e n k ä ä n + o i k e u s a s i a m i e h e n ä + o i k e u s a s i a m i e h e s t ä + o i k e u s a s i a m i e h e s t ä k ä ä n + o i k e u s a s i a m i e h i ä + o i k e u s a s i a m i e s + o i k e u s a s i a m i e s a l o i t e + o i k e u s a s i a m i e s e h d o k k a a t + o i k e u s a s i a m i e s e l i n + o i k e u s a s i a m i e s h a n k e + o i k e u s a s i a m i e s i n s t i t u u t i o + o i k e u s a s i a m i e s i n s t i t u u t i o t a + o i k e u s a s i a m i e s j ä r j e s t e l m ä + o i k e u s a s i a m i e s k i n + o i k e u s a s i a m i e s l a i t o k s e l l a + o i k e u s a s i a m i e s l a i t o s t a + o i k e u s a s i a m i e s p a l v e l u j e n + o i k e u s a s i a m i e s t ä + o i k e u s a s i a m i e s v e r k o s t o n + o i k e u s a s i a n t u n t i j a + o i k e u s a s i a n t u n t i j a n + o i k e u s a s i a n t u n t i j a n a + o i k e u s a s i a n t u n t i j a t + o i k e u s a s i a n t u n t i j o i d e m m e + o i k e u s a s i a n t u n t i j o i d e n + o i k e u s a s i a n t u n t i j o i l l e + o i k e u s a s i a n t u n t i j o i t a + o i k e u s a s i a s s a + o i k e u s a s i a s t a + o i k e u s a s i a t + o i k e u s a s i o i d e n + o i k e u s a s i o i h i n + o i k e u s a s i o i s s a + o i k e u s a s i o i s t a + o i k e u s a s i o i t a + o i k e u s a s t e e n + o i k e u s a s t e e s e e n + o i k e u s a s t e e t + o i k e u s a u k k o j a + o i k e u s a v u n + o i k e u s a v u n a n n o n + o i k e u s a v u s s a + o i k e u s a v u s t a + o i k e u s a v u s t a j a + o i k e u s a v u s t a j a a + o i k e u s a v u s t a j a m m e + o i k e u s a v u s t a j a n + o i k e u s d i r e k t i i v i + o i k e u s e d u s t a j a a n s a + o i k e u s e d u s t a j a n + o i k e u s e d u s t a j a t + o i k e u s e d u s t u k s e n s a + o i k e u s e d u s t u s + o i k e u s e l i m e l t ä + o i k e u s e l i m e n s ä + o i k e u s e l i m e s s ä + o i k e u s e l i m i e n + o i k e u s e l i m i i n + o i k e u s e l i m i l l e + o i k e u s e l i m i s s ä + o i k e u s e l i m i ä + o i k e u s e l i n + o i k e u s e l i n t e n + o i k e u s e s t e i t ä + o i k e u s f i l o s o f i a + o i k e u s f o o r u m i + o i k e u s f o o r u m i t + o i k e u s h a l l i n n o n + o i k e u s h a l l i n n o s s a + o i k e u s h a l l i n n o t + o i k e u s h a l l i n t o + o i k e u s h a l l i n t o o n + o i k e u s h e n k i l ö + o i k e u s h e n k i l ö i d e n + o i k e u s h e n k i l ö i h i n + o i k e u s h e n k i l ö i l l e + o i k e u s h e n k i l ö i l l ä + o i k e u s h e n k i l ö i l t ä + o i k e u s h e n k i l ö i s t ä + o i k e u s h e n k i l ö i t ä + o i k e u s h e n k i l ö j ä + o i k e u s h e n k i l ö k s i + o i k e u s h e n k i l ö l l e + o i k e u s h e n k i l ö l l i s y y d e n + o i k e u s h e n k i l ö l l i s y y d e s t ä + o i k e u s h e n k i l ö l l i s y y s + o i k e u s h e n k i l ö l l i s y y s a s i a s s a + o i k e u s h e n k i l ö l l i s y y t e e n + o i k e u s h e n k i l ö l l i s y y t t ä + o i k e u s h e n k i l ö l l ä + o i k e u s h e n k i l ö n + o i k e u s h e n k i l ö n s ä + o i k e u s h e n k i l ö n ä + o i k e u s h e n k i l ö s t ä + o i k e u s h e n k i l ö t + o i k e u s h e n k i l ö y d e l l ä ä n + o i k e u s h e n k i l ö y d e n + o i k e u s h e n k i l ö y d e s t ä + o i k e u s h e n k i l ö y s + o i k e u s h e n k i l ö y t t ä + o i k e u s h e n k i l ö ö n + o i k e u s h i e r a r k i a + o i k e u s h i s t o r i a + o i k e u s h i s t o r i a a n + o i k e u s h i s t o r i a s s a m m e + o i k e u s h i s t o r i a s t a + o i k e u s i n f o r m a t i i k k a + o i k e u s i n s t i t u u t i o i l l e + o i k e u s i s t u i m e e n + o i k e u s i s t u i m e k s i + o i k e u s i s t u i m e s s a + o i k e u s i s t u i n + o i k e u s i s t u i n t e n + o i k e u s j u t t u + o i k e u s j u t t u a + o i k e u s j u t t u i h i n + o i k e u s j u t t u j a + o i k e u s j u t t u j e n + o i k e u s j u t t u n s a + o i k e u s j u t t u u n + o i k e u s j u t u i s s a + o i k e u s j u t u i s t a + o i k e u s j u t u n + o i k e u s j u t u s s a + o i k e u s j u t u t + o i k e u s j ä r j e s t e l m i e m m e + o i k e u s j ä r j e s t e l m i e n + o i k e u s j ä r j e s t e l m i e n s ä + o i k e u s j ä r j e s t e l m i i m m e + o i k e u s j ä r j e s t e l m i i n + o i k e u s j ä r j e s t e l m i i n s ä + o i k e u s j ä r j e s t e l m i l l e + o i k e u s j ä r j e s t e l m i l l ä + o i k e u s j ä r j e s t e l m i l t ä + o i k e u s j ä r j e s t e l m i n e e n + o i k e u s j ä r j e s t e l m i s s ä + o i k e u s j ä r j e s t e l m i s s ä m m e + o i k e u s j ä r j e s t e l m i s s ä ä n + o i k e u s j ä r j e s t e l m i s t ä + o i k e u s j ä r j e s t e l m i ä + o i k e u s j ä r j e s t e l m i ä ä n + o i k e u s j ä r j e s t e l m ä + o i k e u s j ä r j e s t e l m ä l l e + o i k e u s j ä r j e s t e l m ä l l ä + o i k e u s j ä r j e s t e l m ä l t ä + o i k e u s j ä r j e s t e l m ä m m e + o i k e u s j ä r j e s t e l m ä n + o i k e u s j ä r j e s t e l m ä n s ä + o i k e u s j ä r j e s t e l m ä n ä + o i k e u s j ä r j e s t e l m ä s s ä + o i k e u s j ä r j e s t e l m ä s s ä m m e + o i k e u s j ä r j e s t e l m ä s t ä + o i k e u s j ä r j e s t e l m ä s t ä m m e + o i k e u s j ä r j e s t e l m ä s t ä ä n + o i k e u s j ä r j e s t e l m ä t + o i k e u s j ä r j e s t e l m ä u u d i s t u k s e n + o i k e u s j ä r j e s t e l m ä ä + o i k e u s j ä r j e s t e l m ä ä k ö + o i k e u s j ä r j e s t e l m ä ä m m e + o i k e u s j ä r j e s t e l m ä ä m m e k ä ä n + o i k e u s j ä r j e s t e l m ä ä n + o i k e u s j ä r j e s t e l m ä ä n s ä + o i k e u s j ä r j e s t e l y j ä + o i k e u s j ä r j e s t y k s e e n + o i k e u s j ä r j e s t y k s e e n s ä + o i k e u s j ä r j e s t y k s e k s i + o i k e u s j ä r j e s t y k s e l l e + o i k e u s j ä r j e s t y k s e m m e + o i k e u s j ä r j e s t y k s e n + o i k e u s j ä r j e s t y k s e s s ä + o i k e u s j ä r j e s t y k s e s t ä + o i k e u s j ä r j e s t y k s e t + o i k e u s j ä r j e s t y k s i i n + o i k e u s j ä r j e s t y k s i s s ä m m e + o i k e u s j ä r j e s t y k s i ä + o i k e u s j ä r j e s t y s + o i k e u s j ä r j e s t y s t e n + o i k e u s j ä r j e s t y s t e n s ä + o i k e u s j ä r j e s t y s t ä + o i k e u s j ä r j e s t y s t ä ä n + o i k e u s k a n s l e r i + o i k e u s k a n s l e r i n + o i k e u s k a n t e e n + o i k e u s k a n t e e t + o i k e u s k e h y k s e e n + o i k e u s k e h y k s e k s i + o i k e u s k e h y k s e l l e + o i k e u s k e h y k s e l l ä + o i k e u s k e h y k s e n + o i k e u s k e h y k s e n ä + o i k e u s k e h y k s e s s ä + o i k e u s k e h y k s e s t ä + o i k e u s k e h y k s i ä + o i k e u s k e h y s + o i k e u s k e h y s t ä + o i k e u s k e i n o i h i n + o i k e u s k e i n o i n + o i k e u s k e i n o i s t a + o i k e u s k e i n o j a + o i k e u s k e i n o t + o i k e u s k e l p o i s u u s + o i k e u s k e l p o i s u u t t a a n + o i k e u s k i i s t a + o i k e u s k i i s t a s t a + o i k e u s k i i s t a t + o i k e u s k i i s t o i h i n + o i k e u s k i i s t o j a + o i k e u s k i n + o i k e u s k i r j a n p i t ä j ä n + o i k e u s k o h d e + o i k e u s k o m i t e a a n + o i k e u s k o n e i s t o a + o i k e u s k o n e i s t o n + o i k e u s k r i t e e r e i t ä + o i k e u s k u l t t u u r e i s t a + o i k e u s k u l t t u u r e j a + o i k e u s k u l t t u u r i + o i k e u s k u l t t u u r i a + o i k e u s k u l t t u u r i e n + o i k e u s k u l t t u u r i l l e + o i k e u s k u l t t u u r i m m e + o i k e u s k u l t t u u r i n + o i k e u s k u l t t u u r i n s a + o i k e u s k u l t t u u r i s s a + o i k e u s k u l t t u u r i s t a + o i k e u s k u l t t u u r i s t a m m e + o i k e u s k u l t t u u r i t + o i k e u s k u l u i h i n + o i k e u s k u l u j a + o i k e u s k u l u j e n + o i k e u s k u l u t + o i k e u s k u l u v a k u u t u k s i a + o i k e u s k y s y m y k s e e n + o i k e u s k y s y m y k s i s s ä + o i k e u s k y s y m y s t e n + o i k e u s k ä s i t e + o i k e u s k ä s i t e t t ä + o i k e u s k ä s i t t e e t + o i k e u s k ä s i t t e i d e n + o i k e u s k ä s i t t e i t ä + o i k e u s k ä s i t t e l y + o i k e u s k ä s i t t e l y i d e n + o i k e u s k ä s i t t e l y i h i n + o i k e u s k ä s i t t e l y i s s ä + o i k e u s k ä s i t t e l y i s t ä + o i k e u s k ä s i t t e l y j e n + o i k e u s k ä s i t t e l y j ä + o i k e u s k ä s i t t e l y n + o i k e u s k ä s i t t e l y s s ä + o i k e u s k ä s i t t e l y s t ä + o i k e u s k ä s i t t e l y t + o i k e u s k ä s i t t e l y y n + o i k e u s k ä s i t t e l y ä + o i k e u s k ä s i t y k s e e n + o i k e u s k ä s i t y k s e m m e + o i k e u s k ä s i t y k s e n + o i k e u s k ä s i t y k s e n s ä + o i k e u s k ä s i t y k s i ä + o i k e u s k ä s i t y s + o i k e u s k ä s i t y s t ä + o i k e u s k ä s i t y s t ä m m e + o i k e u s k ä s i t y s t ä n n e + o i k e u s k ä s i t y s t ä ä n + o i k e u s k ä y n t i i n + o i k e u s k ä y t ä n n ö i s s ä + o i k e u s k ä y t ä n n ö i s t ä + o i k e u s k ä y t ä n n ö k s i + o i k e u s k ä y t ä n n ö l l e + o i k e u s k ä y t ä n n ö l l ä + o i k e u s k ä y t ä n n ö n + o i k e u s k ä y t ä n n ö s s ä + o i k e u s k ä y t ä n n ö s t ä + o i k e u s k ä y t ä n n ö t + o i k e u s k ä y t ä n t ö + o i k e u s k ä y t ä n t ö j e n + o i k e u s k ä y t ä n t ö j ä + o i k e u s k ä y t ä n t ö m m e + o i k e u s k ä y t ä n t ö n s ä + o i k e u s k ä y t ä n t ö ä + o i k e u s k ä y t ä n t ö ä k i n + o i k e u s k ä y t ä n t ö ä ä n + o i k e u s k ä y t ä n t ö ö m m e + o i k e u s k ä y t ä n t ö ö n + o i k e u s l a b o r a t o r i o n + o i k e u s l a i t o k s e e n + o i k e u s l a i t o k s e l l a + o i k e u s l a i t o k s e l l e + o i k e u s l a i t o k s e m m e + o i k e u s l a i t o k s e n + o i k e u s l a i t o k s e s s a + o i k e u s l a i t o k s e s t a + o i k e u s l a i t o k s e t + o i k e u s l a i t o k s i a + o i k e u s l a i t o k s i i n + o i k e u s l a i t o k s i l l a + o i k e u s l a i t o k s i l l e + o i k e u s l a i t o k s i l l e m m e + o i k e u s l a i t o k s i s s a + o i k e u s l a i t o s + o i k e u s l a i t o s j ä r j e s t e l m ä n + o i k e u s l a i t o s j ä r j e s t e l m ä ä + o i k e u s l a i t o s t a + o i k e u s l a i t o s t e m m e + o i k e u s l a i t o s t e n + o i k e u s l a i t o s u u d i s t u s + o i k e u s l a u s e k k e e l l e + o i k e u s l u o k k i e n + o i k e u s l ä h d e + o i k e u s l ä h t e e n ä + o i k e u s l ä h t e e s s ä + o i k e u s l ä h t e e s t ä + o i k e u s l ä h t e i d e n + o i k e u s l ä h t ö i s i ä + o i k e u s l ä ä k e t i e d e + o i k e u s l ä ä k e t i e t e e n + o i k e u s l ä ä k e t i e t e e s t ä + o i k e u s l ä ä k ä r i t + o i k e u s m a a i l m a s t a + o i k e u s m e n e t t e l y + o i k e u s m e n e t t e l y i d e n + o i k e u s m e n e t t e l y i h i n + o i k e u s m e n e t t e l y i l t ä + o i k e u s m e n e t t e l y i s s ä + o i k e u s m e n e t t e l y i s t ä + o i k e u s m e n e t t e l y i t ä + o i k e u s m e n e t t e l y j e n + o i k e u s m e n e t t e l y j ä + o i k e u s m e n e t t e l y n + o i k e u s m e n e t t e l y n ä + o i k e u s m e n e t t e l y s s ä + o i k e u s m e n e t t e l y t + o i k e u s m e n e t t e l y ä + o i k e u s m i n i s t e r e i d e n + o i k e u s m i n i s t e r e i h i n + o i k e u s m i n i s t e r e i l l ä + o i k e u s m i n i s t e r i + o i k e u s m i n i s t e r i e n + o i k e u s m i n i s t e r i k ä ä n + o i k e u s m i n i s t e r i l l e + o i k e u s m i n i s t e r i l t ä + o i k e u s m i n i s t e r i n + o i k e u s m i n i s t e r i n ä + o i k e u s m i n i s t e r i s t ä + o i k e u s m i n i s t e r i t + o i k e u s m i n i s t e r i ä + o i k e u s m i n i s t e r i ö + o i k e u s m i n i s t e r i ö i d e n + o i k e u s m i n i s t e r i ö i l l e + o i k e u s m i n i s t e r i ö i l l ä + o i k e u s m i n i s t e r i ö m m e + o i k e u s m i n i s t e r i ö n + o i k e u s m i n i s t e r i ö s t ä + o i k e u s m i n i s t e r i ö t ä + o i k e u s m u o t o + o i k e u s m u o t o j e n + o i k e u s m u r h a + o i k e u s m u r h a a n s a + o i k e u s m ä ä r i t e l m ä + o i k e u s m ä ä r ä y s t e n + o i k e u s n e u v o j i e n + o i k e u s n e u v o n t a a + o i k e u s n e u v o s t o + o i k e u s n e u v o s t o n + o i k e u s n o r m e i s t a + o i k e u s n o r m e j a + o i k e u s n o r m i e n + o i k e u s n o r m i s t o + o i k e u s n o r m i t + o i k e u s n ä k ö k u l m a + o i k e u s o p e r a a t i o + o i k e u s o p p i n e e t + o i k e u s o p p i n e i d e n + o i k e u s o s a s t o l t a + o i k e u s p a i k k a l a u s e k k e i t a + o i k e u s p a l a t s i + o i k e u s p a l v e l u i t a + o i k e u s p a l v e l u j a + o i k e u s p a l v e l u j e n + o i k e u s p a r o d i a n + o i k e u s p e r i a a t e + o i k e u s p e r i a a t t e e n + o i k e u s p e r i a a t t e e s t a + o i k e u s p e r i a a t t e e t + o i k e u s p e r i a a t t e i d e n + o i k e u s p e r i a a t t e i n a + o i k e u s p e r i a a t t e i s i i n + o i k e u s p e r i a a t t e i t a + o i k e u s p e r i n n e + o i k e u s p e r i n n e t t ä + o i k e u s p e r i n t e e n + o i k e u s p e r i n t e e n s ä + o i k e u s p e r i n t e e s e e n + o i k e u s p e r i n t e e s s ä + o i k e u s p e r i n t e e s t ä + o i k e u s p e r i n t e e t + o i k e u s p e r i n t e i d e n + o i k e u s p e r i n t e i s i i n + o i k e u s p e r i n t e i s s ä + o i k e u s p e r i n t e i s t ä + o i k e u s p e r i n t e i t ä + o i k e u s p e r u s t a + o i k e u s p e r u s t a a + o i k e u s p e r u s t a a n + o i k e u s p e r u s t a a n s a + o i k e u s p e r u s t a e h d o t u s t a + o i k e u s p e r u s t a h a n + o i k e u s p e r u s t a i n e n + o i k e u s p e r u s t a i s e l l a + o i k e u s p e r u s t a i s e n + o i k e u s p e r u s t a i s e s t a + o i k e u s p e r u s t a i s e t + o i k e u s p e r u s t a i s t e n + o i k e u s p e r u s t a k s i + o i k e u s p e r u s t a k y s y m y s + o i k e u s p e r u s t a l l a + o i k e u s p e r u s t a l l e + o i k e u s p e r u s t a l t a + o i k e u s p e r u s t a m m e + o i k e u s p e r u s t a m u u t o k s e n + o i k e u s p e r u s t a n + o i k e u s p e r u s t a n a + o i k e u s p e r u s t a n k a a n + o i k e u s p e r u s t a n s a + o i k e u s p e r u s t a n s a k a a n + o i k e u s p e r u s t a s s a + o i k e u s p e r u s t a s t a + o i k e u s p e r u s t a t + o i k e u s p e r u s t a t a p a u k s e s t a + o i k e u s p e r u s t e i s s a + o i k e u s p e r u s t e i s t a + o i k e u s p e r u s t e i t a + o i k e u s p e r u s t e t t a + o i k e u s p e r u s t o i h i n + o i k e u s p e r u s t o i k s i + o i k e u s p e r u s t o i l l a + o i k e u s p e r u s t o i l l e + o i k e u s p e r u s t o i n a + o i k e u s p e r u s t o i n e e n + o i k e u s p e r u s t o i s s a + o i k e u s p e r u s t o i s t a + o i k e u s p e r u s t o j a + o i k e u s p e r u s t o j e n + o i k e u s p e t o k s e n + o i k e u s p o h j a + o i k e u s p o h j a a + o i k e u s p o l i i t t i n e n + o i k e u s p o l i i t t i s e e n + o i k e u s p o l i i t t i s e s t i + o i k e u s p o l i i t t i s e t + o i k e u s p o l i i t t i s i a + o i k e u s p o l i i t t i s t e n + o i k e u s p o l i t i i k a l l a + o i k e u s p o l i t i i k a n + o i k e u s p o l i t i i k a s s a + o i k e u s p o l i t i i k a s t a + o i k e u s p o l i t i i k k a + o i k e u s p o l i t i i k k a a + o i k e u s p o l i t i i k k a a n + o i k e u s p o s i t i v i s m i + o i k e u s p r o s e s s e i h i n + o i k e u s p r o s e s s e i s t a + o i k e u s p r o s e s s e j a + o i k e u s p r o s e s s i + o i k e u s p r o s e s s i a + o i k e u s p r o s e s s i e n + o i k e u s p r o s e s s i i n + o i k e u s p r o s e s s i n + o i k e u s p r o s e s s i n s a + o i k e u s p r o s e s s i s s a + o i k e u s p r o s e s s i t + o i k e u s p u i t t e e t + o i k e u s p u i t t e i d e n + o i k e u s p u i t t e i t a + o i k e u s p u o l u e + o i k e u s p u o l u e e s e e n + o i k e u s p y y n t ö i h i n + o i k e u s p ä ä k a u p u n k i + o i k e u s p ä ä t ö k s e t + o i k e u s p ä ä t ö s t e n + o i k e u s r a k e n n e l m a + o i k e u s r a k e n t e i d e n + o i k e u s r a k e n t e i l l a + o i k e u s r a k e n t e i t a + o i k e u s r a u h a + o i k e u s r e a l i s m i + o i k e u s r e s u r s s e j a + o i k e u s r i i d a k s i + o i k e u s r i i d a n + o i k e u s r i i d a t + o i k e u s r i i t o i h i n + o i k e u s r i i t o j a + o i k e u s r i i t o j e n + o i k e u s r i k k o m u s + o i k e u s r i s t i r i i t o j a + o i k e u s s a l a i s u u t t a + o i k e u s s a l e i s s a + o i k e u s s a l i l e i k k e j ä + o i k e u s s e i k o i s t a + o i k e u s s e k t o r i a + o i k e u s s e u r a a m u k s e t + o i k e u s s e u r a a m u k s i a + o i k e u s s k a n d a a l i + o i k e u s s o s i o l o g i a + o i k e u s s o s i o l o g i a a + o i k e u s s o s i o l o g i a s s a + o i k e u s s t a n d a r d e i s t a + o i k e u s s t a n d a r d i e m m e + o i k e u s s t a n d a r d i t + o i k e u s s t r a t e g i a n + o i k e u s s u b j e k t e i l l e + o i k e u s s u b j e k t e i n a + o i k e u s s u b j e k t e i s t a + o i k e u s s u b j e k t i a + o i k e u s s u b j e k t i e n + o i k e u s s u b j e k t i n + o i k e u s s u b j e k t i n a + o i k e u s s u b j e k t i t + o i k e u s s u h t e e s e e n + o i k e u s s u h t e i d e n s a + o i k e u s s u h t e i s i i n + o i k e u s s u o j a + o i k e u s s u o j a a + o i k e u s s u o j a a n + o i k e u s s u o j a a n s a + o i k e u s s u o j a j ä r j e s t e l m i e n + o i k e u s s u o j a j ä r j e s t e l m ä + o i k e u s s u o j a j ä r j e s t e l m ä n + o i k e u s s u o j a k e h y k s e n + o i k e u s s u o j a k e h y s t ä + o i k e u s s u o j a k e i n o a + o i k e u s s u o j a k e i n o i h i n + o i k e u s s u o j a k e i n o i n + o i k e u s s u o j a k e i n o i s t a + o i k e u s s u o j a k e i n o j a + o i k e u s s u o j a k e i n o j e n + o i k e u s s u o j a k e i n o o n + o i k e u s s u o j a k e i n o t + o i k e u s s u o j a l l a + o i k e u s s u o j a l l e + o i k e u s s u o j a m e k a n i s m e j a + o i k e u s s u o j a m e k a n i s m i t + o i k e u s s u o j a m e n e t e l m i ä + o i k e u s s u o j a m e n e t e l m ä + o i k e u s s u o j a m e n e t t e l y j e n + o i k e u s s u o j a n + o i k e u s s u o j a n s a + o i k e u s s u o j a s t a + o i k e u s s u o j a v ä l i n e e t + o i k e u s s ä ä d ö k s e e n + o i k e u s s ä ä d ö k s e t + o i k e u s s ä ä d ö k s i i n + o i k e u s s ä ä d ö k s i ä + o i k e u s s ä ä d ö s + o i k e u s s ä ä d ö s t e n + o i k e u s s ä ä d ö s t ä + o i k e u s s ä ä n n ö i l l ä + o i k e u s s ä ä n n ö i s s ä + o i k e u s s ä ä n n ö k s e n + o i k e u s s ä ä n n ö k s e t + o i k e u s s ä ä n n ö k s i i n + o i k e u s s ä ä n n ö k s i n + o i k e u s s ä ä n n ö k s i s t ä + o i k e u s s ä ä n n ö k s i ä + o i k e u s s ä ä n n ö l l ä + o i k e u s s ä ä n n ö s t e n + o i k e u s s ä ä n n ö s t ö + o i k e u s s ä ä n n ö t + o i k e u s s ä ä n t ö + o i k e u s s ä ä n t ö j e n + o i k e u s s ä ä n t ö j ä + o i k e u s s ä ä n t ö m m e + o i k e u s t a i s t e l i j o i n a + o i k e u s t a i s t e l u + o i k e u s t a i s t e l u i l t a + o i k e u s t a j u a + o i k e u s t a j u m m e + o i k e u s t a j u s t a a n + o i k e u s t a j u u n + o i k e u s t a j u u n s a + o i k e u s t a k e i t a + o i k e u s t a k u i s t a + o i k e u s t a k u u n + o i k e u s t a k u u t + o i k e u s t a l o + o i k e u s t a l o u s t i e d e + o i k e u s t a p a u k s e e n + o i k e u s t a p a u k s e l l a + o i k e u s t a p a u k s e n + o i k e u s t a p a u k s e s s a + o i k e u s t a p a u k s e s t a + o i k e u s t a p a u k s e t + o i k e u s t a p a u k s i a + o i k e u s t a p a u k s i i n + o i k e u s t a p a u k s i s s a + o i k e u s t a p a u k s i s t a + o i k e u s t a p a u s + o i k e u s t a p a u s k o k o e l m a + o i k e u s t a p a u s t a + o i k e u s t a p a u s t e n + o i k e u s t a p a u s t i e t o k a n n a n + o i k e u s t a s o j e n + o i k e u s t a s o n + o i k e u s t a v o i t t e i t a + o i k e u s t e k n i s e l l ä + o i k e u s t e k n i s t e n + o i k e u s t e o r e e t t i s e s t i + o i k e u s t e o r i a a + o i k e u s t e o r i a l l e + o i k e u s t e r m e j ä + o i k e u s t i e + o i k e u s t i e d e + o i k e u s t i e t e e l l i s e s t ä + o i k e u s t i e t e i l i j ä t + o i k e u s t i e t e i l i j ö i d e n + o i k e u s t i e t e i l i j ö i t ä + o i k e u s t i e t o + o i k e u s t i e t o i s u u t t a + o i k e u s t i e t ä + o i k e u s t i l a + o i k e u s t i l a a + o i k e u s t i l a n n e + o i k e u s t i l a n t e e n + o i k e u s t i l a n t e e s e e n + o i k e u s t i l a s t a + o i k e u s t o i m e a + o i k e u s t o i m e n + o i k e u s t o i m e n p i t e i d e n + o i k e u s t o i m e t + o i k e u s t o i m i + o i k e u s t o i m i a + o i k e u s t o i m i e n + o i k e u s t o i m i i n + o i k e u s t o i m i j o i l l e + o i k e u s t o i m i k e l p o i n e n + o i k e u s t o i m i k e l p o i s i a + o i k e u s t o i m i k e l p o i s u u t t a + o i k e u s t o i m i l l a + o i k e u s t o i m i n + o i k e u s t o i m i n t a a + o i k e u s t o i m i n t o j e n + o i k e u s t o i m i s s a + o i k e u s t o i m i s t a + o i k e u s t o i m i v a l t a + o i k e u s t o i n t a + o i k e u s t u l k k a u k s e n + o i k e u s t u o m i o i s t u i m e e n + o i k e u s t u o m i o i s t u i m e s s a + o i k e u s t u r v a + o i k e u s t u r v a a + o i k e u s t u r v a a n + o i k e u s t u r v a a n s a + o i k e u s t u r v a j ä r j e s t e l m ä n + o i k e u s t u r v a j ä r j e s t e l m ä ä + o i k e u s t u r v a l l e + o i k e u s t u r v a l l i s u u d e s t a + o i k e u s t u r v a n + o i k e u s t u r v a n s a + o i k e u s t u r v a s s a a n + o i k e u s t u r v a s t a + o i k e u s t u r v a s y i s t ä + o i k e u s t u r v a t a k e e t + o i k e u s t u r v a t a k e i t a + o i k e u s t u r v a t a k u i t a + o i k e u s t u r v a t a s o + o i k e u s t u r v a t a s o n + o i k e u s t u r v a t e k i j ä + o i k e u s t u r v a t t o m u u t t a + o i k e u s t u r v a v a a t i m u k s i a + o i k e u s t u r v a v a a t i m u s + o i k e u s t u r v a v a k u u t u k s e e n + o i k e u s t u r v a v a k u u t u k s e n + o i k e u s t u r v a v a k u u t u k s e s t a + o i k e u s t u r v a v a k u u t u s + o i k e u s t u r v a v a k u u t u s t a + o i k e u s t u t k i m u k s i s s a + o i k e u s t u t k i m u s + o i k e u s u u d i s t u k s e e n + o i k e u s u u d i s t u k s e n + o i k e u s v a a t e i t a + o i k e u s v a a t i m u s + o i k e u s v a i k u t u k s e n + o i k e u s v a i k u t u k s e t + o i k e u s v a i k u t u k s i a + o i k e u s v a i k u t u s + o i k e u s v a i k u t u s t a + o i k e u s v a i k u t u s t e n + o i k e u s v a k u u t u k s e n + o i k e u s v a l i o k u n n a l t a + o i k e u s v a l i o k u n n a n + o i k e u s v a l i o k u n n a s s a + o i k e u s v a l i o k u n t a + o i k e u s v a l l a n + o i k e u s v a l t i o + o i k e u s v a l t i o h a n k e t t a + o i k e u s v a l t i o i d e n + o i k e u s v a l t i o i l l e + o i k e u s v a l t i o i s s a + o i k e u s v a l t i o i s s a m m e + o i k e u s v a l t i o i s t a + o i k e u s v a l t i o i t a + o i k e u s v a l t i o j ä r j e s t e l m ä + o i k e u s v a l t i o k e h i t y k s e n + o i k e u s v a l t i o k s i + o i k e u s v a l t i o l l e + o i k e u s v a l t i o l l i s e n + o i k e u s v a l t i o l l i s i a + o i k e u s v a l t i o l l i s i n + o i k e u s v a l t i o n + o i k e u s v a l t i o n a + o i k e u s v a l t i o o n + o i k e u s v a l t i o p e r i a a t e + o i k e u s v a l t i o p e r i a a t e t t a + o i k e u s v a l t i o p e r i a a t t e e l l e + o i k e u s v a l t i o p e r i a a t t e e n + o i k e u s v a l t i o p e r i a a t t e e s e e n + o i k e u s v a l t i o p e r i a a t t e i d e n + o i k e u s v a l t i o p e r i a a t t e i t a + o i k e u s v a l t i o r a k e n t e i d e n + o i k e u s v a l t i o s s a + o i k e u s v a l t i o s s a h a n + o i k e u s v a l t i o s t a + o i k e u s v a l t i o t + o i k e u s v a l t i o t a + o i k e u s v a l t u u d e t + o i k e u s v a l v o n n a n + o i k e u s v a r m a + o i k e u s v a r m a n + o i k e u s v a r m u u d e k s i + o i k e u s v a r m u u d e l l a + o i k e u s v a r m u u d e l l e + o i k e u s v a r m u u d e n + o i k e u s v a r m u u d e n k i n + o i k e u s v a r m u u d e s s a + o i k e u s v a r m u u d e s t a + o i k e u s v a r m u u s + o i k e u s v a r m u u s a s i a + o i k e u s v a r m u u s a u t o m a a t t i + o i k e u s v a r m u u s p e r i a a t t e e n + o i k e u s v a r m u u s v a a t i m u k s e t + o i k e u s v a r m u u t e e n + o i k e u s v a r m u u t e n s a + o i k e u s v a r m u u t t a + o i k e u s v a r m u u t t a a n + o i k e u s v e r k o n + o i k e u s v e r k o s t o a + o i k e u s v e r t a i l u + o i k e u s v e r t a i l u n + o i k e u s v i r a n o m a i n e n + o i k e u s v i r a n o m a i s e e n + o i k e u s v i r a n o m a i s e l l a + o i k e u s v i r a n o m a i s e l t a + o i k e u s v i r a n o m a i s e m m e + o i k e u s v i r a n o m a i s e n + o i k e u s v i r a n o m a i s e n a + o i k e u s v i r a n o m a i s e s t a + o i k e u s v i r a n o m a i s e t + o i k e u s v i r a n o m a i s e t h a n + o i k e u s v i r a n o m a i s i a + o i k e u s v i r a n o m a i s i i n + o i k e u s v i r a n o m a i s i l l a + o i k e u s v i r a n o m a i s i l l e + o i k e u s v i r a n o m a i s i l t a + o i k e u s v i r a n o m a i s i s t a + o i k e u s v i r a n o m a i s m a l l i a + o i k e u s v i r a n o m a i s t a + o i k e u s v i r a n o m a i s t e m m e + o i k e u s v i r a n o m a i s t e n + o i k e u s v i r a n o m a i s t e n k i n + o i k e u s v i r a n o m a i s t e n s a + o i k e u s v o i m a a + o i k e u s v ä l i n e + o i k e u s v ä l i n e e k s i + o i k e u s v ä l i n e e l l ä + o i k e u s v ä l i n e e n + o i k e u s v ä l i n e e n ä + o i k e u s v ä l i n e e s e e n + o i k e u s v ä l i n e e s t ä + o i k e u s v ä l i n e e t + o i k e u s v ä l i n e i d e n + o i k e u s v ä l i n e i n + o i k e u s v ä l i n e i s i i n + o i k e u s v ä l i n e i s s ä + o i k e u s v ä l i n e i t ä + o i k e u s v ä l i n e t t ä + o i k e u s y h t e i s k u n n a s s a + o i k e u s y h t e i s k u n t a + o i k e u s y h t e i s t y ö + o i k e u s y h t e i s t y ö n + o i k e u s y h t e i s t y ö s s ä + o i k e u s y h t e i s t y ö t ä + o i k e u s y h t e i s t y ö v ä l i n e e t + o i k e u s y h t e i s ö + o i k e u s y h t e i s ö l l e + o i k e u s y h t e i s ö m m e + o i k e u s y h t e i s ö n + o i k e u s y h t e i s ö n ä + o i k e u s y h t e i s ö s s ä + o i k e u s y h t e i s ö s s ä m m e + o i k e u s y h t e i s ö ö n + o i k e u s y k s i k ö l l e + o i k e u s y m p ä r i s t ö s s ä + o i k e u s y m p ä r i s t ö ä + o i k e u t e e n + o i k e u t e e n i + o i k e u t e m m e + o i k e u t e n a + o i k e u t e n a a n + o i k e u t e n s a + o i k e u t e t a a n + o i k e u t e t t a i s i i n + o i k e u t e t t u a + o i k e u t e t t u i h i n + o i k e u t e t t u i n a + o i k e u t e t t u j a + o i k e u t e t t u j e n + o i k e u t e t t u n a + o i k e u t e t t u u n + o i k e u t e t u i l l e + o i k e u t e t u i m p i a + o i k e u t e t u i s s a + o i k e u t e t u m p a a + o i k e u t e t u m p i + o i k e u t e t u m p i a + o i k e u t e t u t + o i k e u t t a + o i k e u t t a a + o i k e u t t a a k s e e n + o i k e u t t a a n + o i k e u t t a m a a n + o i k e u t t a m i s e k s i + o i k e u t t a m i s l a u s e k k e e n + o i k e u t t a m m e + o i k e u t t a n i + o i k e u t t a v a t + o i k e u t u k s e k s i + o i k e u t u k s e l l e e n + o i k e u t u k s e n + o i k e u t u k s e n a + o i k e u t u k s e n s a + o i k e u t u s k r i i s i k s i + o i k e u t u s p r o s e s s i + o i k e u t u s t a + o i k e u t u s t e o r i a + o i k o a + o i k o m i s h o i t o a + o i k o m i s h o i t o o n + o i k o s u l k u m o o t t o r i + o i k o t e i h i n + o i k o t e i t ä + o i k o t i e + o i k o t i e n + o i k o t i e t ä + o i k u i s t a + o i r e i d e n + o i r e i l i s i + o i r e i l u a + o i r e i s t a + o i r e i t a + o i r e y h t y m ä + o i r e y h t y m ä k s i + o i r e y h t y m ä s t ä + o i v a l l e t t a v a + o i v a l l i s e n + o i v a l l i s e s t a + o i v a l l u k s e k s i + o i v a l t a a k s e e n + o i v a n + o j a k a a l i + o j a k e l l u k k a + o j a k ä r s ä m ö + o j a l e i n i k k i + o j a s u o k a n a + o j a v e r k o s t o s t a + o j e n t a a + o j e n t a j a l i h a s + o j e n t a k a a m m e + o j e n t a m a a n + o j i t u s j ä r j e s t e l m ä n + o k a h a a r a k e + o k a h a m m a s h a i + o k a h i i r e t + o k a h i i r i + o k a k r u u n u o h d a k e + o k a k u u s i + o k a l e p i n k ä i n e n + o k a l i n n u t + o k a n a g a n j ä r v i + o k a p y r s t ö h a r a k k a + o k a r a h k a s a m m a l + o k a r a u s k u + o k a t y t ö n k o r e n t o + o k r a k i r v i n e n + o k r a l l a + o k r a p i i k k i p y r s t ö + o k r a p y y j u o k s i j a + o k r a y ö k k ö n e n + o k s a a + o k s a a m m e + o k s a l y y l i k l o r i d i + o k s a r a t a s n a h i k a s + o k s a t + o k s e n n u s p u s s i + o k s i d e i s t a + o k s i d i e n + o k s i d i s e k o i t e p o l t t o a i n e + o k t a a n i h a p o n + o k t a a n i h a p p o + o k t a a n i l u k u + o k t a b r o m i d i f e n y y l i e e t t e r i n + o k t a e d r i l u k u + o k t a e d r i l u k u o t a k s u m a + o k t e t t i s ä ä n t ö + o l a n k o h o t u s + o l e a n t e r i k i i t ä j ä + o l e e l l i s e m m a n + o l e e l l i s e m m a t + o l e e l l i s e m p a a + o l e e l l i s e m p i + o l e e l l i s e s s a + o l e e l l i s e s t a + o l e e l l i s e s t i + o l e e l l i s e t + o l e e l l i s i a + o l e e l l i s i l t a + o l e e l l i s i m m a k s i + o l e e l l i s i m m a t + o l e e l l i s i m m i s s a + o l e e l l i s i m m i s t a + o l e e l l i s i m p i a + o l e e l l i s i m p i a k a a n + o l e e l l i s i m p i i n + o l e e l l i s i n + o l e e l l i s i n a + o l e e l l i s i s s a + o l e e l l i s t a + o l e f i i n i k a a s u j e n + o l e f i i n i k a a s u n s i i r t o v e r k o s t o i l l e + o l e f i i n i k a a s u p u t k i s t o t + o l e f i i n i k a a s u v e r k k o j a + o l e f i i n i v e r k k o j e n + o l e i i n i h a p p o + o l e k a a n + o l e k i n + o l e m a s s a k a a n + o l e m a s s a o l e v i e n + o l e m a s s a o l o a + o l e m a s s a o l o a a n + o l e m a s s a o l o a i k a + o l e m a s s a o l o a i k a n a a n + o l e m a s s a o l o a m m e + o l e m a s s a o l o l l e + o l e m a s s a o l o m m e + o l e m a s s a o l o n + o l e m a s s a o l o n s a + o l e m a s s a o l o o n + o l e m a s s a o l o s t a + o l e m a t o n t a + o l e m a t t o m a a n + o l e m a t t o m a k s i + o l e m a t t o m a l l e + o l e m a t t o m a m m a k s i + o l e m a t t o m a n + o l e m a t t o m a n a + o l e m a t t o m a s t a + o l e m a t t o m a t + o l e m a t t o m i a + o l e m a t t o m i e n + o l e m a t t o m i i n + o l e m a t t o m i k s i + o l e m a t t o m i l l a + o l e m a t t o m i l t a + o l e m a t t o m i s t a + o l e m m e + o l e m m e k i n + o l e m m e k o + o l e m u k s e e n + o l e m u k s e n + o l e m u s t a + o l e m u s t a a n + o l e n h a n + o l e n k i n + o l e n k o + o l e n n a i s e e n + o l e n n a i s e k s i + o l e n n a i s e l l a + o l e n n a i s e m m a n + o l e n n a i s e m m i k s i + o l e n n a i s e m p a a + o l e n n a i s e m p i + o l e n n a i s e m p i a + o l e n n a i s e n + o l e n n a i s e n a + o l e n n a i s e s t a + o l e n n a i s e t + o l e n n a i s i a + o l e n n a i s i i n + o l e n n a i s i l t a + o l e n n a i s i m m a k s i + o l e n n a i s i m m a n + o l e n n a i s i m m a t + o l e n n a i s i m m i s t a + o l e n n a i s i m p a a n + o l e n n a i s i m p i a + o l e n n a i s i m p i e n + o l e n n a i s i m p i i n + o l e n n a i s i n + o l e n n a i s i n a + o l e n n a i s i n t a + o l e n n a i s i s s a + o l e n n a i s i s t a + o l e n n a i s t a + o l e n n a i s t e n + o l e n n a i s u u s r a j a + o l e n n a i s u u s r a j a a + o l e n n a i s u u s r a j a n + o l e n n a i s u u s r a j o i s t a + o l e n n o t + o l e s k e l e e + o l e s k e l e v a t + o l e s k e l e v i a + o l e s k e l e v i e n + o l e s k e l e v i i n + o l e s k e l e v i l l e + o l e s k e l l a + o l e s k e l l e e n + o l e s k e l l e e t + o l e s k e l l e i d e n + o l e s k e l l e i l l a + o l e s k e l l e i l l e + o l e s k e l l e i s i i n + o l e s k e l l e i t a + o l e s k e l u a + o l e s k e l u a a n + o l e s k e l u a i k a + o l e s k e l u a i k a n s a + o l e s k e l u a j a s t a + o l e s k e l u a s e m a a + o l e s k e l u a s i a k i r j a t + o l e s k e l u a s i a k i r j o j e n + o l e s k e l u e h t o j a + o l e s k e l u j a k s o j a + o l e s k e l u k o r v a u s t e n + o l e s k e l u k u l u i h i n + o l e s k e l u k u l u j e n + o l e s k e l u k u l u n s a + o l e s k e l u k u l u t + o l e s k e l u l u p a + o l e s k e l u l u p a a + o l e s k e l u l u p a a n + o l e s k e l u l u p a a n s a + o l e s k e l u l u p a n s a + o l e s k e l u l u p a p a k o n + o l e s k e l u l u p i a + o l e s k e l u l u p i e n + o l e s k e l u l u p i i n + o l e s k e l u l u p i n a + o l e s k e l u l u v a l l a + o l e s k e l u l u v a n + o l e s k e l u l u v a s t a + o l e s k e l u l u v a t + o l e s k e l u l u v a t t o m a t + o l e s k e l u l u v i k s i + o l e s k e l u l u v i l l a + o l e s k e l u l u v i l l e + o l e s k e l u l u v i s s a + o l e s k e l u l u v i s t a + o l e s k e l u m a a n + o l e s k e l u m a a s s a a n + o l e s k e l u m a a t a a n + o l e s k e l u m a i d e n + o l e s k e l u n + o l e s k e l u o i k e u d e n + o l e s k e l u o i k e u d e s s a + o l e s k e l u o i k e u d e s t a + o l e s k e l u o i k e u k s i a + o l e s k e l u o i k e u k s i i n + o l e s k e l u o i k e u s + o l e s k e l u o i k e u s a j a n + o l e s k e l u o i k e u s a s i a k i r j o j e n + o l e s k e l u o i k e u t e e n + o l e s k e l u o i k e u t e n s a + o l e s k e l u o i k e u t t a + o l e s k e l u p a i k a s t a + o l e s k e l u p a i k k a a n + o l e s k e l u p a i k k a d i r e k t i i v i ä + o l e s k e l u p e r u s t e e t + o l e s k e l u s ä ä n n ö t + o l e s k e l u u n + o l e s k e l u v a l t i o o n + o l e s k e l u v e l v o l l i s u u s + o l e s k e l u v i i s u m e i s t a + o l e t a m m e + o l e t a n + o l e t e t a a n + o l e t e t t i i n + o l e t e t t u a + o l e t e t t u j a + o l e t e t t u j e n + o l e t e t u i s t a + o l e t e t u s t a + o l e t e t u t + o l e t t a a + o l e t t a e n + o l e t t a i s i + o l e t t a k a a m m e + o l e t t a k o + o l e t t a m a t t a + o l e t t a m u k s e e n + o l e t t a m u k s e s t a + o l e t t a m u k s e t + o l e t t a m u k s i a + o l e t t a m u k s i e n + o l e t t a m u k s i i n + o l e t t a m u k s i s t a + o l e t t e + o l e t t e k o + o l e t t e k o h a n + o l e t t i v a t + o l e t u k s e e n + o l e t u k s e l l a + o l e t u k s e n i + o l e t u k s i s t a + o l e t u s a r v o a + o l e t u s a r v o i h i n + o l e t u s a r v o j a + o l e t u s a r v o n + o l e t u s a r v o o n + o l e t u s a r v o t + o l e t u s a s e m a a n s a + o l e t u s r a j a + o l e t u s t e n s a + o l e t u s t i l a n t e e n + o l e t u s y h d y s k ä y t ä v ä + o l e v a a + o l e v a a n + o l e v a l l a + o l e v a m m e + o l e v a n + o l e v a n i + o l e v a n s a + o l e v a s s a + o l e v a s t a + o l e v a t + o l e v i a + o l e v i e n + o l e v i i n + o l e v i l l a + o l e v i l l e + o l e v i l t a + o l e v i s t a + o l i g o p o l i a + o l i g o p o l i k e s k i t t y m i e n + o l i g o p o l i t i l a n t e e t + o l i i v e i l l e + o l i i v e i s t a + o l i i v e j a + o l i i v i a l a a + o l i i v i a l a l l a + o l i i v i a l a n + o l i i v i b u l b u l i + o l i i v i e n + o l i i v i h a u k i a n k e r i a s + o l i i v i j ä t t e e s t ä + o l i i v i k a r d i n a a l i + o l i i v i k e r t t u + o l i i v i k i p u a j a + o l i i v i k o u k k u n a p s i j a + o l i i v i k u h a n k e i t t ä j ä + o l i i v i k u l m a k e r t t u l i + o l i i v i k u l t a r i n t a + o l i i v i k y y h k y + o l i i v i k ä k i + o l i i v i l e h d o i l l a + o l i i v i l e h d o n + o l i i v i l e h t o i h i n + o l i i v i l e h t o j a + o l i i v i l l e + o l i i v i l o i s t o l e p i n k ä i n e n + o l i i v i m e r i m e t s o + o l i i v i m e s i k k o + o l i i v i n + o l i i v i n t u o t a n n o n + o l i i v i n t u o t a n t o + o l i i v i n t u o t t a j a t + o l i i v i n t u o t t a j i a + o l i i v i n t u o t t a j i e n + o l i i v i n v i l j e l i j ä + o l i i v i n v i l j e l i j ö i d e n + o l i i v i n v i l j e l i j ö i l l e + o l i i v i n v i l j e l i j ö i t ä + o l i i v i n v i l j e l y + o l i i v i n v i l j e l y n + o l i i v i n v i l j e l y s t ä + o l i i v i n v i l j e l y y n + o l i i v i n v i l j e l y ä + o l i i v i p a v i a a n i + o l i i v i p u i d e n + o l i i v i p u i l l e + o l i i v i p u i s t a + o l i i v i p u i t a + o l i i v i p u u + o l i i v i p u u h u n + o l i i v i p u u k a n t a + o l i i v i p u u k o a l i t i o + o l i i v i p u u k o h t a i n e n + o l i i v i p u u n + o l i i v i p u u s t a + o l i i v i p u u t + o l i i v i p u u t a + o l i i v i p u u t u k i + o l i i v i p u u v i l j e l m ä n + o l i i v i p u u v i l j e l m ä t + o l i i v i p ä ä b u l b u l i + o l i i v i r a s t a s + o l i i v i r e k i s t e r i n + o l i i v i r e k i s t e r i ä + o l i i v i r o u h e + o l i i v i r u o s t e g u e r e t s a + o l i i v i s a d o n + o l i i v i s a t o + o l i i v i s e l k ä k u t o j a + o l i i v i s i i p i b u l b u l i + o l i i v i s i l k k i k e r t t u n e n + o l i i v i t a r h a + o l i i v i t a r h a t + o l i i v i t a r h o i l l e + o l i i v i t a r h o j a + o l i i v i t a r h o j e n + o l i i v i t i k k a n e n + o l i i v i t i l o j e m m e + o l i i v i t u l i p e r ä + o l i i v i t u o t a n n o n + o l i i v i t u o t a n n o s t a + o l i i v i t u o t a n t o a l u e e n + o l i i v i t u o t t e i d e n + o l i i v i v a h a n o k k a + o l i i v i v i i r u m e s i k k o + o l i i v i v i l j e l m i s t ä + o l i i v i v i l j e l m i ä + o l i i v i v i l j e l m ä n + o l i i v i v i l j e l y k s e t + o l i i v i v ä l s k ä r i + o l i i v i ö l j y + o l i i v i ö l j y a l a + o l i i v i ö l j y a l a a + o l i i v i ö l j y a l a l l a + o l i i v i ö l j y a l a l l e + o l i i v i ö l j y a l a n + o l i i v i ö l j y a l a s t a + o l i i v i ö l j y a l a t + o l i i v i ö l j y a l o i l l a + o l i i v i ö l j y j e n + o l i i v i ö l j y j ä + o l i i v i ö l j y l l e + o l i i v i ö l j y l l ä + o l i i v i ö l j y m a r k k i n o i d e n + o l i i v i ö l j y m a r k k i n o i l l a + o l i i v i ö l j y m a r k k i n o i s t a + o l i i v i ö l j y n + o l i i v i ö l j y n e u v o s t o + o l i i v i ö l j y n e u v o s t o n + o l i i v i ö l j y n t u o t a n n o l l a + o l i i v i ö l j y n t u o t t a j a m a i t a + o l i i v i ö l j y n ä + o l i i v i ö l j y p u r i s t a m o j e n + o l i i v i ö l j y s e k t o r i + o l i i v i ö l j y s e k t o r i a + o l i i v i ö l j y s e k t o r i n + o l i i v i ö l j y s s ä + o l i i v i ö l j y s t ä + o l i i v i ö l j y t e o l l i s u u s + o l i i v i ö l j y t u o t a n n o n + o l i i v i ö l j y v a r o j e n + o l i i v i ö l j y y n + o l i i v i ö l j y ä + o l i k i n + o l i k o + o l i n p a i k a s t a + o l i n p a i k k a a n s a + o l i o i l l e + o l i o k a a v i o + o l i p a + o l i s i + o l i s i h a n + o l i s i k a a n + o l i s i k i n + o l i s i k o + o l i s i k o h a n + o l i s i m m e + o l i s i m m e k o + o l i s i n + o l i s i p a + o l i s i t t e k o h a n + o l i s i v a t + o l i s i v a t p a + o l i v a t + o l i v a t k i n + o l i v a t k o + o l i v a t p a + o l j e n k o r s i + o l j e n k o r s i i n + o l j i l l a + o l k a a + o l k a a m m e + o l k a i n m a t t i + o l k a i n p a l o k ä r k i + o l k a l i h a s + o l k a n i v e l + o l k a p ä ä o h j u s + o l k i k o i r a t + o l k i n u k k e + o l k i p a a l i r a k e n t a m i n e n + o l k i p u k k i + o l k i p y r s t ö l e s k i + o l k i r i s a k a s + o l k o o n + o l k o o n k i n + o l l a a n + o l l a a n h a n + o l l a a n k i n + o l l a a n k o + o l l a a n p a + o l l a k s e e n + o l l a k s e m m e + o l l a k s e n i + o l l e e n + o l l e e n k a a n + o l l e i d e n + o l l e i l l e + o l l e n + o l l e s s a + o l l e s s a a n + o l l e s s a n i + o l o a m m e + o l o h u o n e + o l o h u o n e e s s a + o l o h u o n e e s s a a n + o l o h u o n e e s s a m m e + o l o h u o n e i s i i m m e + o l o i h i n + o l o i l l e + o l o i s s a + o l o i s t a + o l o j a + o l o j e n + o l o m u o t o + o l o s u h t e e t + o l o s u h t e i d e n + o l o s u h t e i l l a + o l o s u h t e i s i i n + o l o s u h t e i s i i n s a + o l o s u h t e i s s a + o l o s u h t e i s s a a n + o l o s u h t e i s t a + o l o s u h t e i t a + o l o t i l a a + o l o t i l a n + o l t a v a + o l t a v a k i n + o l t i i n + o l t u a n i + o l u e n + o l u e n t u o n t i a + o l u e s t a + o l u t e t i k e t t e i h i n + o l u t k u l t t u u r i n + o l u t l a j i a + o l u t l a s i + o l u t l a s i e n + o l u t m a i n o s + o l u t m a r k k i n o i t a + o l u t p a n i m o i l l e + o l u t p u b i n + o l u t t u o p i n + o l u t t u p a v a l l a n k a a p p a u s + o l u t t y y l e i s t ä + o l u t t ö l k k i e n + o l u t v e r o n + o l y m p i a b o i k o t i n + o l y m p i a e h d o k k u u t t a + o l y m p i a e n n ä t y s + o l y m p i a h e n g e n + o l y m p i a h e n k e e n + o l y m p i a h e n k e ä + o l y m p i a h e n k i + o l y m p i a h y m n i + o l y m p i a i h a n t e e s t a + o l y m p i a i h a n t e i d e n + o l y m p i a i s ä n n y y d e n + o l y m p i a j u h l a a + o l y m p i a k a u p u n g i k s i + o l y m p i a k a u p u n k i + o l y m p i a k i s a i s ä n n y y d e s t ä + o l y m p i a k i s a t + o l y m p i a k i s a v a l m i s t e l u j e n + o l y m p i a k i s o i h i n + o l y m p i a k i s o i l l e + o l y m p i a k i s o i s t a + o l y m p i a k i s o j a + o l y m p i a k i s o j e n + o l y m p i a k o m i t e a + o l y m p i a k o m i t e a a + o l y m p i a k o m i t e a l l e + o l y m p i a k o m i t e a l t a + o l y m p i a k o m i t e a n + o l y m p i a k o m i t e a s s a + o l y m p i a k o m i t e a t + o l y m p i a k o m i t e o i d e n + o l y m p i a k y l ä s s ä + o l y m p i a l a i s a a t e t t a + o l y m p i a l a i s a s e l e p o a + o l y m p i a l a i s e t + o l y m p i a l a i s i a + o l y m p i a l a i s i i n + o l y m p i a l a i s i l l a + o l y m p i a l a i s i l l e + o l y m p i a l a i s i s s a + o l y m p i a l a i s i s t a + o l y m p i a l a i s t e n + o l y m p i a l a j i + o l y m p i a l i e k i n + o l y m p i a l i i k e + o l y m p i a l i i k e t t ä + o l y m p i a l i i k k e e n + o l y m p i a l i i k k e e s t ä + o l y m p i a l i p p u a + o l y m p i a l i p u l l a + o l y m p i a l u p a u s t e n + o l y m p i a o r g a n i s a a t i o n + o l y m p i a p e r i n n e + o l y m p i a p i s t o o l i + o l y m p i a p u i s t o + o l y m p i a r a k e n n u s t e n + o l y m p i a r a u h a + o l y m p i a r a u h a a + o l y m p i a r a u h a n + o l y m p i a r a u h a s t a + o l y m p i a r e n k a a s t a + o l y m p i a r e n k a i d e n + o l y m p i a s o i h d u n + o l y m p i a s o i h t u + o l y m p i a s o i h t u v i e s t i n + o l y m p i a s s a + o l y m p i a s t a d i o n + o l y m p i a s t a d i o n i l l a + o l y m p i a s t a d i o n i n + o l y m p i a t e r m i n a a l i + o l y m p i a t u l e n + o l y m p i a t u l i + o l y m p i a u r h e i l i j a a + o l y m p i a u r h e i l i j a t + o l y m p i a u r h e i l i j o i d e n + o l y m p i a u r h e i l i j o i l l e + o l y m p i a v a l a + o l y m p i a v o i t t a j a + o l y m p i a v o i t t a j i a + o l y m p i a v o i t t a j i e n + o l y m p i a v u o s i + o m a a n + o m a a n i + o m a a n s a + o m a a t u n t o a + o m a a t u n t o a m m e + o m a a t u n t o a n i + o m a a v i e n + o m a e h t o i n e n + o m a e h t o i s e s t i + o m a e h t o i s t a + o m a h y v ä i n e n + o m a h y v ä i s e s s ä + o m a h y v ä i s e s t i + o m a h y v ä i s i ä + o m a h y v ä i s t ä + o m a h y v ä i s y y d e l l ä + o m a h y v ä i s y y t e e n + o m a h y v ä i s y y t t ä + o m a i s e t + o m a i s h o i d o n + o m a i s h o i t a j a k o r v a u k s e s t a + o m a i s h o i t a j a k y s y m y s + o m a i s h o i t a j a n + o m a i s h o i t a j a p o l i t i i k a n + o m a i s h o i t a j a t + o m a i s h o i t a j i a + o m a i s h o i t a j i e n + o m a i s h o i t a j i l l e + o m a i s h o i t a j i s t a + o m a i s h o i t o + o m a i s h o i t o a + o m a i s h o i t o j ä r j e s t e l m ä + o m a i s h o i t o o n + o m a i s h o i t o v a p a a + o m a i s i a a n + o m a i s i l l a + o m a i s i l l e + o m a i s u u d e k s i + o m a i s u u d e n + o m a i s u u d e n h o i d o n + o m a i s u u d e n h o i d o s t a + o m a i s u u d e n h o i t a j a n + o m a i s u u d e n h o i t a j a t + o m a i s u u d e n h o i t a j i a + o m a i s u u d e n h o i t a j i e n + o m a i s u u d e n h o i t o + o m a i s u u d e n h o i t o a + o m a i s u u d e n h o i t o a l a + o m a i s u u d e n h o i t o a l a n + o m a i s u u d e n h o i t o t e h t ä v i i n + o m a i s u u d e n h o i t o y r i t y k s e t + o m a i s u u d e n h o i t o y r i t y k s i l l e + o m a i s u u d e s t a + o m a i s u u d e t + o m a i s u u s a j a t t e l u + o m a i s u u s e r i e n + o m a i s u u s e r ä t + o m a i s u u s i l m o i t u k s e s t a + o m a i s u u s i l m o i t u k s e t + o m a i s u u s k r i i s i + o m a i s u u s k y s y m y k s e n + o m a i s u u s k y s y m y k s e t + o m a i s u u s l a i n s ä ä d ä n n ö n + o m a i s u u s l a j i t + o m a i s u u s l u o k k i i n + o m a i s u u s o i k e u k s i e n + o m a i s u u s o i k e u k s i s t a + o m a i s u u s o i k e u t t a + o m a i s u u s p o l i t i i k a s t a + o m a i s u u s r a h a s t o j a + o m a i s u u s r i i t a n a + o m a i s u u s r i k o k s i s t a + o m a i s u u s v a h i n g o i s s a + o m a i s u u s v a h i n g o s s a + o m a i s u u s v a h i n g o t + o m a i s u u t e e n + o m a i s u u t e m m e + o m a i s u u t e n a + o m a i s u u t e n a a n + o m a i s u u t e n s a + o m a i s u u t t a + o m a i s u u t t a a n + o m a k e h u j a + o m a k i e l i s t ä + o m a k i n + o m a k o h t a i s e m p a n a + o m a k o h t a i s e n + o m a k o h t a i s e t + o m a k s e m m e + o m a k s i + o m a k s u a + o m a k s u a k s e e n + o m a k s u i s i + o m a k s u i t t e + o m a k s u k a a m m e + o m a k s u m a a n + o m a k s u m a s s a + o m a k s u m i a a n + o m a k s u m i s e k s i + o m a k s u m i s e s t a + o m a k s u t a + o m a k s u t a a n + o m a k s u t t a e s s a + o m a k s u t t a v a + o m a k s u t t u a + o m a k s u t t u j e n + o m a k s u u + o m a k s u v a t k o + o m a k u s t a n n e + o m a k u s t a n n u s h i n n a n + o m a k u s t a n n u s h i n n a t + o m a k u s t a n n u s h i n t a a + o m a k u v a a + o m a l e i m a i s t a + o m a l e i m a i s u u t e n s a + o m a l l a + o m a l l a t u n n o l l a + o m a l l e + o m a l t a + o m a n a + o m a n a r v o n t u n n o k s i + o m a n a r v o n t u n n o n + o m a n a r v o n t u n t o a a n + o m a n a t u n t o n a + o m a n k a a n + o m a n k i n + o m a n l a i s e n s a + o m a n l a i s i a a n + o m a n l a i s t a a n + o m a n s a + o m a n t u n n o n + o m a n t u n n o n k y s y m y k s e n + o m a n t u n n o n k y s y m y k s i ä + o m a n t u n n o n t u s k a a + o m a n t u n n o n v a p a u d e n + o m a n t u n n o n v a p a u t e e n + o m a n t u n n o n v a p a u t t a + o m a p e r ä i s e l l ä + o m a p e r ä i s e m m i n + o m a p e r ä i s e m p ä ä + o m a r a h o i t u k s e e n + o m a r a h o i t u s + o m a r a h o i t u s t a + o m a s s a + o m a s s a n i + o m a s s a t u n n o s s a a n + o m a s s a t u n n o s s a m m e + o m a s t a + o m a s t a a n + o m a s t a n n e + o m a t k i n + o m a t o i m i s u u t e n s a + o m a t o i m i s u u t t a a n + o m a t u n n o i n + o m a t u n n o l l a + o m a t u n n o n + o m a t u n n o n s y i s t ä + o m a t u n t o m m e + o m a t u n t o n n e + o m a t u n t o o n + o m a v a l t a i s e s t a + o m a v a r a i s e e n + o m a v a r a i s e m p i + o m a v a r a i s e n + o m a v a r a i s e s s a + o m a v a r a i s e s t a + o m a v a r a i s e s t i + o m a v a r a i s i a + o m a v a r a i s i k s i + o m a v a r a i s m a a t a l o u d e n + o m a v a r a i s m a a t a l o u t e e n + o m a v a r a i s u u d e l l e + o m a v a r a i s u u d e n + o m a v a r a i s u u d e s t a + o m a v a r a i s u u d e s t a m m e + o m a v a r a i s u u s a s t e + o m a v a r a i s u u s a s t e e n + o m a v a r a i s u u s t a v o i t t e e t + o m a v a r a i s u u t e e n + o m a v a r a i s u u t e m m e + o m a v a r a i s u u t t a + o m a v a r a i s u u t t a a n + o m a v a r a i s v i l j e l y l l ä + o m a v a r a i s v i l j e l y s t ä + o m a v a s t u u + o m a v a s t u u n + o m a v a s t u u r a j a n + o m a v a s t u u s t a + o m a v a s t u u s ä ä n t ö + o m a v a s t u u t a + o m e g a p i s t e + o m e g a s u m u + o m e n a b a n a a n i + o m e n a m e h u s t a + o m e n a p i i r a k k a a + o m e n a p u u t + o m e n a p ä ä r y n ä + o m e n a t u o n t i a + o m e n a v e r t a u s t a + o m e n a v i i n i e n + o m e n i a + o m e n o i d e n + o m e n o i t a + o m i a k i n + o m i a m m e + o m i a t u n t o j a m m e + o m i e n + o m i i n + o m i l l a + o m i l l a a n + o m i l l e + o m i l l e e n + o m i l t a + o m i n a i s a b s o r p t i o n o p e u s + o m i n a i s e l l a + o m i n a i s e r o i h i n + o m i n a i s e s t a + o m i n a i s i a + o m i n a i s i m p u l s s i + o m i n a i s k i e r t o k y k y + o m i n a i s l a a t u n s a + o m i n a i s l i i k e + o m i n a i s l u o n t e e n + o m i n a i s l u o n t e e n s a + o m i n a i s m a k u j a + o m i n a i s m a k u n s a + o m i n a i s p i i r t e e m m e + o m i n a i s p i i r t e e n s ä + o m i n a i s p i i r t e e t + o m i n a i s p i i r t e i d e m m e + o m i n a i s p i i r t e i d e n + o m i n a i s p i i r t e i l l e e n + o m i n a i s p i i r t e i s i i n + o m i n a i s p i i r t e i t ä + o m i n a i s p ä ä s t ö i l t ä ä n + o m i n a i s p ä ä s t ö j e n + o m i n a i s p ä ä s t ö j ä r j e s t e l m ä + o m i n a i s p ä ä s t ö j ä r j e s t e l m ä ä + o m i n a i s s e i k k o j a + o m i n a i s t a + o m i n a i s t i l a v u u s + o m i n a i s u u d e s s a n i + o m i n a i s u u d e t + o m i n a i s u u k s i a + o m i n a i s u u k s i e n + o m i n a i s u u k s i e n s a + o m i n a i s u u k s i l t a a n + o m i n a i s u u k s i s t a + o m i n a i s u u k s i s t a a n + o m i n t a k e i s i m m i s t a + o m i s s a + o m i s s a m m e + o m i s t a a + o m i s t a a n + o m i s t a j a a + o m i s t a j a k e s k i t t y m ä + o m i s t a j a k u l j e t t a j a a + o m i s t a j a k u l j e t t a j a t + o m i s t a j a k u l j e t t a j i e n + o m i s t a j a l a i v u r e i s t a + o m i s t a j a n + o m i s t a j a n v a i h d o k s i i n + o m i s t a j a n v a i h d o s p r o s e s s i s s a + o m i s t a j a o h j a u k s e e n + o m i s t a j a o h j a u k s e l l a + o m i s t a j a o h j a u k s e n + o m i s t a j a o h j a u k s e s s a + o m i s t a j a o h j a u k s e s t a + o m i s t a j a o h j a u s k ä y t ä n n ö i s t ä + o m i s t a j a o h j a u s t a + o m i s t a j a r a k e n n e t t a + o m i s t a j a r a k e n t e e s t a + o m i s t a j a r a k e n t e i s t a + o m i s t a j a t + o m i s t a j a y h t i ö t e s t i s s ä + o m i s t a j a y r i t y k s e t + o m i s t a j i e n + o m i s t a j i e n s a + o m i s t a j i l l e + o m i s t a j i l t a + o m i s t a j u u d e s t a + o m i s t a j u u s m a l l i + o m i s t a j u u s o i k e u d e t + o m i s t a j u u s o i k e u k s i e n + o m i s t a j u u s o i k e u t t a + o m i s t a j u u s r a k e n n e + o m i s t a j u u t t a + o m i s t a k i n + o m i s t a m a t t a + o m i s t a m i i n + o m i s t a m i s e s t a + o m i s t a m i s t a + o m i s t a n e e t + o m i s t a u t u m i s e s t a + o m i s t a u t u m i s e s t a a n + o m i s t a u t u m i s e s t a n n e + o m i s t a u t u m i s t a + o m i s t a u t u n e i m m i l l e + o m i s t a u t u n e i m m i s t a + o m i s t a u t u n e i t a + o m i s t a v a n + o m i s t a v a n s a + o m i s t a v a t + o m i s t u k s e e n + o m i s t u k s e n + o m i s t u k s e s s a + o m i s t u k s e s t a + o m i s t u k s i a + o m i s t u s a s u n n o t + o m i s t u s m a l l i e n + o m i s t u s m u o d o i s t a + o m i s t u s m u o d o s t a + o m i s t u s m u o d o t + o m i s t u s m u o t o + o m i s t u s m u o t o i h i n + o m i s t u s m u o t o j a + o m i s t u s o h j a u s + o m i s t u s o i k e u d e l l i s i a + o m i s t u s o i k e u d e n + o m i s t u s o i k e u d e s s a + o m i s t u s o i k e u d e s t a + o m i s t u s o i k e u d e t + o m i s t u s o i k e u k s i a + o m i s t u s o i k e u k s i a a n + o m i s t u s o i k e u k s i e n + o m i s t u s o i k e u k s i i n + o m i s t u s o i k e u k s i k s i + o m i s t u s o i k e u k s i s t a + o m i s t u s o i k e u s k y s y m y s + o m i s t u s o i k e u s k y s y m y s t ä + o m i s t u s o i k e u s p o l i t i i k a s t a + o m i s t u s o i k e u s s ä ä d ö k s i i n + o m i s t u s o i k e u s v a a t e i d e n + o m i s t u s o i k e u t e e n + o m i s t u s o i k e u t e n s a + o m i s t u s o i k e u t t a + o m i s t u s o l o j e n + o m i s t u s o n g e l m a a + o m i s t u s p e r i a a t e t t a + o m i s t u s r a j o i t u k s i a + o m i s t u s r a k e n t e e l t a a n + o m i s t u s r a k e n t e e s t a + o m i s t u s r a k e n t e i d e n + o m i s t u s s u h t e e t + o m i s t u s s u h t e i s t a + o m i s t u s t i l a n n e + o m i s t u s v i l j e l y + o m i t u i s e k s i + o m i t u i s e l t a + o m i t u i s i i n + o m i t u i s i m m a k s i + o m i t u i s i n t a + o m i t u i s t a + o m i t u i s u u k s i i n + o m p e l u n e u l a + o n e i d a t + o n g e l l a + o n g e l m a a + o n g e l m a a m m e + o n g e l m a a n + o n g e l m a h a n + o n g e l m a j ä t e s u u n n i t e l m a n + o n g e l m a j ä t e t t ä + o n g e l m a j ä t t e e n + o n g e l m a k a u p u n g i n o s i s s a + o n g e l m a k e n t t i i n + o n g e l m a k e n t t ä + o n g e l m a k e n t t ä ä + o n g e l m a k e n t t ä ä n + o n g e l m a k e n t ä n + o n g e l m a k e n t ä s t ä + o n g e l m a k i e r r e + o n g e l m a k o h d a t + o n g e l m a k o h d e r y h m i e n + o n g e l m a k o h d i s t a + o n g e l m a k o h t a + o n g e l m a k o h t a a + o n g e l m a k o h t a a n + o n g e l m a k o h t i a + o n g e l m a k o h t i i n + o n g e l m a k o k o n a i s u u d e n + o n g e l m a k o k o n a i s u u s + o n g e l m a k s e e n + o n g e l m a k s i + o n g e l m a k y s y m y k s e t + o n g e l m a l a i v o j a + o n g e l m a l l e + o n g e l m a l l i s e k s i + o n g e l m a l l i s e l t a + o n g e l m a l l i s e m m a k s i + o n g e l m a l l i s e m m a n + o n g e l m a l l i s e m p a a + o n g e l m a l l i s e m p i + o n g e l m a l l i s e m p i a + o n g e l m a l l i s e m p i e n + o n g e l m a l l i s e n a + o n g e l m a l l i s e s s a + o n g e l m a l l i s e s t a + o n g e l m a l l i s e t + o n g e l m a l l i s i a + o n g e l m a l l i s i k s i + o n g e l m a l l i s i l l a + o n g e l m a l l i s i m m a t + o n g e l m a l l i s i m m i s t a + o n g e l m a l l i s i m p a n a + o n g e l m a l l i s i m p i a + o n g e l m a l l i s i m p i i n + o n g e l m a l l i s i n + o n g e l m a l l i s i n a + o n g e l m a l l i s i n t a + o n g e l m a l l i s t a + o n g e l m a l u e t t e l o + o n g e l m a l u e t t e l o a + o n g e l m a l u e t t e l o s t a + o n g e l m a m a a + o n g e l m a m m e + o n g e l m a n + o n g e l m a n a + o n g e l m a n a m m e + o n g e l m a n k i n + o n g e l m a n k ä s i t t e l y m u o t o j a + o n g e l m a n r a t k a i s i j a + o n g e l m a n r a t k a i s u + o n g e l m a n r a t k a i s u a + o n g e l m a n r a t k a i s u k e i n o j a + o n g e l m a n r a t k a i s u k e i n o n a + o n g e l m a n r a t k a i s u k y k y + o n g e l m a n r a t k a i s u m a l l e j a + o n g e l m a n r a t k a i s u p y r k i m y s t e n + o n g e l m a n r a t k a i s u s s a + o n g e l m a n r a t k a i s u v e r k k o + o n g e l m a n r a t k a i s u v e r k o s t o + o n g e l m a n r a t k a i s u v ä l i n e + o n g e l m a n r a t k a i s u v ä l i n e e n ä + o n g e l m a n s a + o n g e l m a n u o r t e n + o n g e l m a p e l a a j a a + o n g e l m a p e l a a m i s e n + o n g e l m a p e l a a m i s t a + o n g e l m a p e s ä k e + o n g e l m a p e s ä k k e i s i i n + o n g e l m a p e s ä k k e i s s ä + o n g e l m a p e s ä k k e i t ä + o n g e l m a r y h m i l l e + o n g e l m a r y h m ä + o n g e l m a r y h m ä k s i + o n g e l m a r y h m ä n + o n g e l m a r y h m ä s t ä + o n g e l m a r y h m ä t + o n g e l m a s s a + o n g e l m a s t a + o n g e l m a t + o n g e l m a t a p a u k s e k s i + o n g e l m a t a p a u k s e n a + o n g e l m a t a p a u k s i a + o n g e l m a t a p a u k s i s s a + o n g e l m a t a p a u k s i s t a + o n g e l m a t e k i j ä k s i + o n g e l m a t i l a n n e t t a + o n g e l m a t i l a n t e e s e e n + o n g e l m a t i l a n t e e s s a + o n g e l m a t i l a n t e e s t a + o n g e l m a t i l a n t e e t + o n g e l m a t i l a n t e i d e n + o n g e l m a t i l a n t e i s i i n + o n g e l m a t i l a n t e i s s a + o n g e l m a t i l a n t e i s t a + o n g e l m a t i l a n t e i t a + o n g e l m a t o n t a + o n g e l m a t t o m a a n + o n g e l m a t t o m a m m a k s i + o n g e l m a t t o m a t + o n g e l m a t t o m i a + o n g e l m a v a l t i o + o n g e l m a v a l t i o i d e n + o n g e l m a v e l o i l l e + o n g e l m a v y y h d i n + o n g e l m a v y y h t i i n + o n g e l m a v y ö r y n + o n g e l m i a + o n g e l m i a k i n + o n g e l m i a m m e + o n g e l m i e n + o n g e l m i e n s a + o n g e l m i i m m e + o n g e l m i i n + o n g e l m i i n s a + o n g e l m i l l a + o n g e l m i l l e + o n g e l m i l t a + o n g e l m i n a + o n g e l m i n e e n + o n g e l m i s s a + o n g e l m i s t a + o n g e l m i s t a a n + o n g e l m i s t a m m e + o n g e l m i t t a + o n h a n + o n k a a n + o n k e e n n e + o n k e e n s a + o n k i j a k a l a + o n k i n + o n k o h a n + o n k o l o g i a o s a s t o n + o n k o l o g i a y k s i k k ö j e n + o n l i n e y h t e y d e n + o n n e a + o n n e a a n + o n n e a m m e + o n n e k k a a l l a + o n n e k k a a m m a l l a + o n n e k k a i l l a + o n n e k k a i m p i e n + o n n e k k a i s i i n + o n n e k k a i s t a + o n n e k k a i t a + o n n e k s e m m e + o n n e l a a + o n n e l a a n + o n n e l a n s a + o n n e l l i s e e n + o n n e l l i s e k s i + o n n e l l i s e m p i + o n n e l l i s e n + o n n e l l i s e s s a + o n n e l l i s e s t a + o n n e l l i s e t + o n n e l l i s i a + o n n e l l i s i k s i + o n n e l l i s u u s i n d e k s i n + o n n e l l i s u u s t u t k i m u s + o n n e n + o n n e n l a n t t i + o n n e n o n k i j a t + o n n e n o n k i j o i d e n + o n n e n o n k i j o i k s i + o n n e n o n k i j o i l l e + o n n e n o n k i j o i t a + o n n e n p e l e j ä + o n n e n p o t k u a + o n n e n p o t k u n + o n n e n t o i v o t u k s e n i + o n n e n t o i v o t u k s e t + o n n e n t o i v o t u k s i a + o n n e n t o i v o t u k s i a n n e + o n n e n t o i v o t u k s i i n + o n n e n t o i v o t u k s i s t a + o n n e n t o i v o t u k s i s t a a n + o n n e t t o m a l l a + o n n e t t o m a m p i + o n n e t t o m a n + o n n e t t o m i m p i a + o n n e t t o m u u d e n + o n n e t t o m u u d e n i l m o i t u s j ä r j e s t e l m ä t + o n n e t t o m u u d e s s a + o n n e t t o m u u d e s t a + o n n e t t o m u u d e t + o n n e t t o m u u k s i a + o n n e t t o m u u k s i e n + o n n e t t o m u u k s i e n e s t o j ä r j e s t e l m i ä + o n n e t t o m u u k s i i n + o n n e t t o m u u k s i k s i + o n n e t t o m u u k s i l l a + o n n e t t o m u u k s i l l e + o n n e t t o m u u k s i s s a + o n n e t t o m u u k s i s t a + o n n e t t o m u u s a l t i s t a + o n n e t t o m u u s a l t t e i n + o n n e t t o m u u s a l t t i i n + o n n e t t o m u u s a l u e e l l e + o n n e t t o m u u s a l u e i d e n + o n n e t t o m u u s a p u a + o n n e t t o m u u s a s t e + o n n e t t o m u u s a v u s t a + o n n e t t o m u u s h e t k e l l ä + o n n e t t o m u u s i l m o i t u k s e t + o n n e t t o m u u s i l m o i t u s j ä r j e s t e l m ä n + o n n e t t o m u u s k u s t a n n u k s e t + o n n e t t o m u u s k u s t a n n u k s i n a + o n n e t t o m u u s k y s y m y s t ä + o n n e t t o m u u s l u k u j e n + o n n e t t o m u u s l u v u t + o n n e t t o m u u s m ä ä r i e n + o n n e t t o m u u s p a i k a l l a + o n n e t t o m u u s p a i k a l l e + o n n e t t o m u u s p a i k a n + o n n e t t o m u u s p a i k a t + o n n e t t o m u u s p a l v e l u + o n n e t t o m u u s p ä i v ä n ä + o n n e t t o m u u s r a h a s t o + o n n e t t o m u u s r a p o r t i s t a + o n n e t t o m u u s r e a k t o r i n + o n n e t t o m u u s r i s k e i l t ä + o n n e t t o m u u s r i s k e j ä + o n n e t t o m u u s r i s k i + o n n e t t o m u u s r i s k i e n + o n n e t t o m u u s r i s k i n + o n n e t t o m u u s r i s k i t + o n n e t t o m u u s r i s k i ä + o n n e t t o m u u s s u u n n i t e l m a n + o n n e t t o m u u s t a p a u k s e s s a + o n n e t t o m u u s t a p a u k s i s s a + o n n e t t o m u u s t i e t o j e n + o n n e t t o m u u s t i e t o k a n t a a n + o n n e t t o m u u s t i h e y d e n + o n n e t t o m u u s t i h e y s + o n n e t t o m u u s t i h e y t t ä + o n n e t t o m u u s t i l a n t e e s s a + o n n e t t o m u u s t i l a n t e i d e n + o n n e t t o m u u s t i l a n t e i s s a + o n n e t t o m u u s t i l a n t e i s s a k i n + o n n e t t o m u u s t i l a s t o i h i n + o n n e t t o m u u s t i l a s t o t + o n n e t t o m u u s t u n n e l i a + o n n e t t o m u u s t u t k i n n a n + o n n e t t o m u u s t u t k i n t a + o n n e t t o m u u s t u t k i n t a a + o n n e t t o m u u s t u t k i n t a k e s k u s + o n n e t t o m u u s t u t k i n t a p ö y t ä k i r j a n + o n n e t t o m u u s u h k i e n + o n n e t t o m u u s v a a r a + o n n e t t o m u u s v a a r a n + o n n e t t o m u u s v a a r a s s a + o n n e t t o m u u s v a a r a s t a + o n n e t t o m u u s v a a r a t + o n n e t t o m u u s v a l m i u d e n + o n n e t t o m u u s v a r o i t u s j ä r j e s t e l m ä s t ä + o n n e t t o m u u t e e n + o n n e t t o m u u t t a + o n n i s t a a + o n n i s t u a + o n n i s t u a k s e e n + o n n i s t u a k s e m m e + o n n i s t u e s s a a n + o n n i s t u e s s a n n e + o n n i s t u i + o n n i s t u i m m e + o n n i s t u i s i + o n n i s t u i s i m m e + o n n i s t u i s i v a t + o n n i s t u i t t e + o n n i s t u i v a t + o n n i s t u m a a n + o n n i s t u m a t t a + o n n i s t u m i s a s t e + o n n i s t u m i s a s t e e n + o n n i s t u m i s a s t e t t a + o n n i s t u m i s e e n + o n n i s t u m i s e k s i + o n n i s t u m i s e l l e + o n n i s t u m i s e m m e + o n n i s t u m i s e n + o n n i s t u m i s e s s a + o n n i s t u m i s e s t a + o n n i s t u m i s e s t a a n + o n n i s t u m i s e t + o n n i s t u m i s i a + o n n i s t u m i s i s t a + o n n i s t u m i s i s t a m m e + o n n i s t u m i s l u v u i s t a + o n n i s t u m i s m a h d o l l i s u u d e t + o n n i s t u m i s m a h d o l l i s u u k s i a + o n n i s t u m i s m a h d o l l i s u u k s i e n + o n n i s t u m i s m a h d o l l i s u u t e n s a + o n n i s t u m i s p e r u s t e e t + o n n i s t u m i s p i s t e i t ä + o n n i s t u m i s t a + o n n i s t u m i s t a h a n + o n n i s t u m i s t a m m e + o n n i s t u m i s t e n + o n n i s t u m m e + o n n i s t u m m e k o + o n n i s t u n e e + o n n i s t u n e e k s i + o n n i s t u n e e l l e + o n n i s t u n e e m m i n + o n n i s t u n e e m p i + o n n i s t u n e e m p i a + o n n i s t u n e e n + o n n i s t u n e e n a + o n n i s t u n e e s e e n + o n n i s t u n e e s t a + o n n i s t u n e e t + o n n i s t u n e i d e n + o n n i s t u n e i k s i + o n n i s t u n e i l l a + o n n i s t u n e i l l e + o n n i s t u n e i m m a n + o n n i s t u n e i m m i s t a + o n n i s t u n e i m p a n a + o n n i s t u n e i m p i i n + o n n i s t u n e i n + o n n i s t u n e i n t a + o n n i s t u n e i s t a + o n n i s t u n e i t a + o n n i s t u n u t t a + o n n i s t u t a + o n n i s t u t a a n + o n n i s t u t a a n k o + o n n i s t u t t a i s i i n + o n n i s t u t t a v a + o n n i s t u t t e + o n n i s t u t t e k o + o n n i s t u t t i i n + o n n i s t u t t u + o n n i s t u t t u a a n + o n n i s t u u + o n n i s t u u k o + o n n i s t u v a n + o n n i s t u v a t + o n n i t e l k a a m m e + o n n i t e l l a + o n n i t e l l a a n + o n n i t e l l a k s e n i + o n n i t e l l e n + o n n i t e l l e s s a n i + o n n i t e l t a v a + o n n i t e l t i i n + o n n i t e l t u a n i + o n n i t t e l e e + o n n i t t e l e m a a n + o n n i t t e l e m a l l a + o n n i t t e l e m a t t a + o n n i t t e l e m m e + o n n i t t e l e n + o n n i t t e l e n k i n + o n n i t t e l i m m e + o n n i t t e l i s i n + o n n i t t e l i s i n k i n + o n n i t t e l i v a t + o n n i t t e l u a + o n n i t t e l u i h i n + o n n i t t e l u i h i n i + o n n i t t e l u i l l a + o n n i t t e l u j a + o n n i t t e l u j e n + o n n i t t e l u k i r j e e n + o n n i t t e l u m m e + o n n i t t e l u n i + o n n i t t e l u s a n a l l a + o n n i t t e l u t + o n n i t t e l u v i e s t e j ä + o n n i t t e l u v i e s t i n + o n o n d a g a t + o n s i l o j ä ä t i k k ö + o n t t o a + o n t t o j a + o n t t o l a s k i m o t + o n t u u + o o p i u m i k a u p a n + o o p i u m i k a u p a s t a + o o p i u m i k a u p p a + o o p i u m i k a u p p a a n + o o p i u m i n + o o p i u m i n t u o t a n n o n + o o p i u m i n t u o t a n t o + o o p i u m i n t u o t a n t o a + o o p i u m i n t u o t a n t o m a i s s a + o o p i u m i n t u o t t a j a + o o p i u m i n v i l j e l y + o o p i u m i n v i l j e l y n + o o p i u m i n v i l j e l y s s ä + o o p i u m i o n g e l m a + o o p i u m i s a d o n + o o p i u m i s a t o + o o p i u m i s a t o j a + o o p i u m i s o d a t + o o p i u m i s o t a + o o p i u m i t a l o u t e e n + o o p i u m i t u o t a n n o s s a + o o p i u m i t u o t a n t o + o o p i u m i t u o t a n t o a + o o p i u m i u n i k k o + o o p i u m i u n i k k o a + o o p i u m i u n i k k o j e n + o o p i u m i u n i k k o v i l j e l m i e n + o o p i u m i u n i k o i d e n + o o p i u m i u n i k o n + o o p i u m i u n i k o t + o o p i u m i v i l j e l m i e n + o o p p e r a f e s t i v a a l i + o o p p e r a j u h l a t + o o p p e r a k u o r o + o o p p e r a n ä y t t ä m ö i l l ä + o o p p e r a t a l o + o o p p e r a t a l o i s t a + o o p p e r a t a l o n + o p a s k o i r a + o p a s k o i r a a + o p a s k o i r a n + o p a s k o i r i a + o p a s t a j i n a + o p a s t a m i s t a + o p a s t e j ä r j e s t e l m ä + o p a s t e t u s t a + o p e r a a t i o a n a l y y s i + o p e r a a t i o e s i k u n t a + o p e r a a t i o h a n + o p e r a a t i o i d e n + o p e r a a t i o i d e n s a + o p e r a a t i o i h i n + o p e r a a t i o i l l e + o p e r a a t i o i s s a + o p e r a a t i o i s s a m m e + o p e r a a t i o i t a + o p e r a a t i o k e s k u k s e n + o p e r a a t i o k e s k u k s e n s a + o p e r a a t i o k e s k u k s e s t a + o p e r a a t i o k e s k u s + o p e r a a t i o k e s k u s t a + o p e r a a t i o k s i + o p e r a a t i o l l a + o p e r a a t i o n + o p e r a a t i o o n + o p e r a a t i o s s a + o p e r a a t i o s u u n n i t e l m a + o p e r a a t i o s u u n n i t e l m a s t a + o p e r a a t i o t a + o p e r a a t i o t e k n i i k o i d e n + o p e r a a t i o v a h v i s t i m e n + o p e r a a t i o v a h v i s t i n + o p e r a a t t o r e i l l e + o p e r a a t t o r e i t a + o p e r a a t t o r i n + o p e r a a t t o r i t + o p e r a t i i v i s e e n + o p e r a t i i v i s e m m i k s i + o p e r a t i i v i s e m p a a + o p e r a t i i v i s e s s a + o p e r a t i i v i s e s t a + o p e r a t i i v i s e t + o p e r a t i i v i s i a + o p e r a t i i v i s t a + o p e r a t i o n a a l i s e s t a + o p e r e t t i m a i n e n + o p e r e t t i m a i s e k s i + o p e t e l l a + o p e t e l t a v a + o p e t e t a a n + o p e t e t t a v a + o p e t e t t a v a n + o p e t e t t a v i a + o p e t e t u t + o p e t i t t e + o p e t t a a + o p e t t a a k s e m m e + o p e t t a i s i m m e + o p e t t a j a a + o p e t t a j a h a r j o i t t e l i j a a + o p e t t a j a i n v a i h t o + o p e t t a j a j ä r j e s t ö j e n + o p e t t a j a k o u l u t u s + o p e t t a j a k u n t a a + o p e t t a j a k u n t a a n + o p e t t a j a l i i k k e e n + o p e t t a j a m a i s e e n + o p e t t a j a m a i s t a + o p e t t a j a n + o p e t t a j a n a + o p e t t a j a n k o u l u t u k s e e n + o p e t t a j a n k o u l u t u k s e m m e + o p e t t a j a n k o u l u t u k s e n + o p e t t a j a n k o u l u t u k s e s s a + o p e t t a j a n k o u l u t u k s e s t a + o p e t t a j a n k o u l u t u s + o p e t t a j a n k o u l u t u s a l a n + o p e t t a j a n k o u l u t u s h a n + o p e t t a j a n k o u l u t u s j ä r j e s t e l m ä n + o p e t t a j a n k o u l u t u s l a i t o k s e e n + o p e t t a j a n k o u l u t u s l a i t o k s i a + o p e t t a j a n k o u l u t u s l a i t o k s i s s a + o p e t t a j a n k o u l u t u s l a i t o s + o p e t t a j a n k o u l u t u s l a i t o s t e n + o p e t t a j a n k o u l u t u s o h j e l m i s s a + o p e t t a j a n k o u l u t u s t a + o p e t t a j a t + o p e t t a j a t k i n + o p e t t a j a v a i h t o + o p e t t a j a v a i h t o o n + o p e t t a j a v a l i n n a n + o p e t t a j i a + o p e t t a j i e n + o p e t t a j i l l e + o p e t t a j i l l e k i n + o p e t t a m a a n + o p e t t a m i s e k s i + o p e t t a m i s e s t a + o p e t t a m i s t a + o p e t t a n u t + o p e t t a v a i s i a + o p e t t a v a i s u u t t a + o p e t t a v a t + o p e t t e l u p r o s e s s i n + o p e t t e l u v a i h e e n + o p e t t e l u v a i h e e s s a + o p e t t e l u v a i h e t t a + o p e t t i + o p e t u k s e e n + o p e t u k s e l l e + o p e t u k s e n + o p e t u k s e n a + o p e t u k s e n l a a d u n + o p e t u k s e s s a + o p e t u k s e s t a + o p e t u k s e t + o p e t u k s i a + o p e t u s a i n e i s t o i h i n + o p e t u s a i n e i s t o n + o p e t u s a i n e i s t o o n + o p e t u s a l a a + o p e t u s a l a a n + o p e t u s a l a l l a + o p e t u s a l a l l e + o p e t u s a l a n + o p e t u s a l u e + o p e t u s a l u e e n + o p e t u s f i l o s o f i o i t a + o p e t u s h a n k k e i t a + o p e t u s h e n k i l ö k u n n a l l e + o p e t u s h e n k i l ö k u n n a n + o p e t u s h e n k i l ö k u n t a + o p e t u s h e n k i l ö s t ö + o p e t u s h e n k i l ö s t ö n + o p e t u s h e n k i l ö s t ö n k i n + o p e t u s h e n k i l ö s t ö n s ä + o p e t u s h e n k i l ö s t ö ä + o p e t u s h e n k i l ö s t ö ö n + o p e t u s j a k s o + o p e t u s j ä r j e s t e l m i e m m e + o p e t u s j ä r j e s t e l m i e n + o p e t u s j ä r j e s t e l m i i m m e + o p e t u s j ä r j e s t e l m i i n + o p e t u s j ä r j e s t e l m i s s ä + o p e t u s j ä r j e s t e l m i s t ä + o p e t u s j ä r j e s t e l m i ä + o p e t u s j ä r j e s t e l m i ä ä n + o p e t u s j ä r j e s t e l m ä + o p e t u s j ä r j e s t e l m ä l l e + o p e t u s j ä r j e s t e l m ä m m e + o p e t u s j ä r j e s t e l m ä n + o p e t u s j ä r j e s t e l m ä n s ä + o p e t u s j ä r j e s t e l m ä s s ä + o p e t u s j ä r j e s t e l m ä s t ä m m e + o p e t u s j ä r j e s t e l m ä t + o p e t u s j ä r j e s t e l m ä ä + o p e t u s j ä r j e s t e l m ä ä n + o p e t u s k a m p a n j o i h i n + o p e t u s k a m p a n j o i t a + o p e t u s k e i n o + o p e t u s k e s k u s + o p e t u s k i e l e n ä + o p e t u s k i e l i + o p e t u s k i e l i e n + o p e t u s k i e l i ä + o p e t u s k o k e m u k s e n s a + o p e t u s k o k e m u s + o p e t u s k o k e m u s t a + o p e t u s k u m p p a n u u d e l l e + o p e t u s k u s t a n n u k s i i n + o p e t u s k y s y m y s t e n + o p e t u s k ä y t ä n t ö i h i n + o p e t u s l a i n + o p e t u s l a i t o k s i a + o p e t u s l a i t o k s i s s a + o p e t u s l a i t o k s i s t a + o p e t u s l a i t o s t e n + o p e t u s l a i t t e e t + o p e t u s l a k i a + o p e t u s l u v a l l a + o p e t u s m a h d o l l i s u u k s i a + o p e t u s m a l l e i l l a + o p e t u s m a l l e i l l e + o p e t u s m a l l i t + o p e t u s m a t e r i a a l e i s s a + o p e t u s m a t e r i a a l e j a + o p e t u s m a t e r i a a l i + o p e t u s m a t e r i a a l i a + o p e t u s m a t e r i a a l i n + o p e t u s m e n e t e l m i e n + o p e t u s m e n e t e l m i i n + o p e t u s m e n e t e l m i l l e + o p e t u s m e n e t e l m i ä + o p e t u s m e n e t e l m ä t + o p e t u s m e n e t e l m ä ä n + o p e t u s m e t o d e i h i n + o p e t u s m e t o d i + o p e t u s m i n i s t e r e i d e n + o p e t u s m i n i s t e r e i l l e + o p e t u s m i n i s t e r e i t ä + o p e t u s m i n i s t e r e j ä + o p e t u s m i n i s t e r i + o p e t u s m i n i s t e r i e n + o p e t u s m i n i s t e r i l l e + o p e t u s m i n i s t e r i n + o p e t u s m i n i s t e r i n n e + o p e t u s m i n i s t e r i t + o p e t u s m i n i s t e r i ö + o p e t u s m i n i s t e r i ö i d e n + o p e t u s m i n i s t e r i ö i l l e + o p e t u s m i n i s t e r i ö n + o p e t u s m o d u u l e i n a + o p e t u s m o d u u l i e n + o p e t u s n ä y t e l m ä + o p e t u s o h j e l m a + o p e t u s o h j e l m a a + o p e t u s o h j e l m a a n + o p e t u s o h j e l m a n + o p e t u s o h j e l m i a + o p e t u s o h j e l m i e m m e + o p e t u s o h j e l m i e n + o p e t u s o h j e l m i e n s a + o p e t u s o h j e l m i i n + o p e t u s o h j e l m i i n s a + o p e t u s o h j e l m i n e e n + o p e t u s o h j e l m i s s a + o p e t u s o h j e l m i s t a + o p e t u s o h j e l m i s t o j a + o p e t u s o i k e u t e e n + o p e t u s p o l i t i i k k o j a m m e + o p e t u s p r o s e s s i i n + o p e t u s p r o s e s s i s s a + o p e t u s s a i r a a l a n + o p e t u s s a i r a a l o i l l e + o p e t u s s e k t o r i a + o p e t u s s e k t o r i l l e + o p e t u s s u u n n i t e l m a a + o p e t u s s u u n n i t e l m a a n + o p e t u s s u u n n i t e l m i a + o p e t u s s u u n n i t e l m i e n + o p e t u s s u u n n i t e l m i i n + o p e t u s s u u n n i t t e l u s s a + o p e t u s s y i s t ä + o p e t u s t a + o p e t u s t a i d o t + o p e t u s t a p a a m i s i s t a + o p e t u s t a p o i h i n + o p e t u s t a r k o i t u k s e s s a + o p e t u s t a r k o i t u k s i a + o p e t u s t a r k o i t u k s i i n + o p e t u s t a r k o i t u k s i s s a + o p e t u s t a r v i k k e i t a + o p e t u s t e h t ä v ä + o p e t u s t e k n i i k a n + o p e t u s t e k n o l o g i a + o p e t u s t e n + o p e t u s t i l o j e n + o p e t u s t o i m e e n + o p e t u s t o i m i e n + o p e t u s t o i m i n t a a + o p e t u s t u n t e j a + o p e t u s t y ö n + o p e t u s t y ö t ä + o p e t u s v a a t i m u k s i a + o p e t u s v a i h e e n + o p e t u s v i r a n o m a i n e n + o p e t u s v i r a n o m a i s e s t a + o p e t u s v i r a n o m a i s e t + o p e t u s v i r a n o m a i s t e n + o p e t u s v ä l i n e + o p e t u s v ä l i n e e n ä + o p e t u s v ä l i n e i d e n + o p e t u s v ä l i n e i n ä + o p e t u s v ä l i n e i s i i n + o p e t u s v ä l i n e i s s ä + o p e t u s y h t e i s ö l t ä + o p e t u s y h t e i s ö n + o p e t u s y m p ä r i s t ö s t ä + o p i k s e e n + o p i k s e m m e + o p i k s e n n e + o p i k s i + o p i m m e + o p i n n o i s s a a n + o p i n n o i s s a n i + o p i n n o i s t a + o p i n n o i s t a a n + o p i n n o t + o p i n t o j e n + o p i n t o j e n s a + o p i n t o j ä r j e s t e l m i l l ä + o p i n t o k e s k u k s i a + o p i n t o k o k o n a i s u u k s i a + o p i n t o k ä y n t e i h i n + o p i n t o l a i n a + o p i n t o l a i n o j a + o p i n t o m a t k a a n + o p i n t o m a t k a l l a + o p i n t o m a t k a n + o p i n t o m a t k o i l l e + o p i n t o m a t k o j a + o p i n t o p i s t e i d e n + o p i n t o p ä i v i l l e + o p i n t o s a a v u t u k s i s t a + o p i n t o s e k k i ä + o p i n t o s u o r i t u k s e t + o p i n t o s u o r i t u s j ä r j e s t e l m ä + o p i n t o s u o r i t u s j ä r j e s t e l m ä ä + o p i n t o s u o r i t u s t e n + o p i n t o s u u n n i t e l m a + o p i n t o s u u n n i t e l m a s t a + o p i n t o s u u n n i t e l m a u u d i s t u k s i a + o p i n t o s u u n n i t e l m i a + o p i n t o t a r j o n n a s t a + o p i n t o t a v o i t t e i s t a + o p i n t o t u k e a + o p i n t o t u k i + o p i n t o t u k i a + o p i n t o u r a n + o p i n t o v a i h t o e h t o j e n + o p i n t o v i e r a i l u j e n + o p i n t o v i i k k o j e n + o p i s k e l e m a a n + o p i s k e l e m a n + o p i s k e l e m a n s a + o p i s k e l e m a s s a + o p i s k e l e m i s e n + o p i s k e l e m i s t a + o p i s k e l e v a t + o p i s k e l e v i a + o p i s k e l e v i e n + o p i s k e l e v i l l e + o p i s k e l i j a d e m o k r a t i a l i i k k e e s t ä + o p i s k e l i j a e l i i t i n + o p i s k e l i j a h a a l a r i + o p i s k e l i j a j o h t a j a + o p i s k e l i j a j o h t a j a n + o p i s k e l i j a j o h t a j i a + o p i s k e l i j a j ä r j e s t ö j e n + o p i s k e l i j a k e s k e i s t ä + o p i s k e l i j a k o r t i n + o p i s k e l i j a k o r t i t + o p i s k e l i j a k o r t t i + o p i s k e l i j a k o r t t i a + o p i s k e l i j a k u l j e t u s + o p i s k e l i j a l i i k e + o p i s k e l i j a l i i k k e e n + o p i s k e l i j a l i i k k e e s t ä + o p i s k e l i j a m e l l a k o i d e n + o p i s k e l i j a m e l l a k o i h i n + o p i s k e l i j a m e l l a k o i s s a + o p i s k e l i j a m e l l a k o i t a + o p i s k e l i j a m i e l e n o s o i t t a j i e n + o p i s k e l i j a m i e l e n o s o i t u k s i a + o p i s k e l i j a m i e l e n o s o i t u k s i s t a + o p i s k e l i j a m i e l e n o s o i t u s + o p i s k e l i j a m i e l e n o s o i t u s t e n + o p i s k e l i j a m ä ä r i e n + o p i s k e l i j a m ä ä r i ä + o p i s k e l i j a n + o p i s k e l i j a r y h m i l l e + o p i s k e l i j a r y h m ä n + o p i s k e l i j a s i i v e n + o p i s k e l i j a t + o p i s k e l i j a t o i m i n t a + o p i s k e l i j a t o i m i n t a a n + o p i s k e l i j a t o v e r e i d e n s a + o p i s k e l i j a u r h e i l u l i i t t o + o p i s k e l i j a v a a l e i s s a + o p i s k e l i j a v a i h d o n + o p i s k e l i j a v a i h d o s s a + o p i s k e l i j a v a i h d o s t a + o p i s k e l i j a v a i h t o + o p i s k e l i j a v a i h t o a + o p i s k e l i j a v a i h t o i h i n + o p i s k e l i j a v a i h t o j a + o p i s k e l i j a v a i h t o j e n + o p i s k e l i j a v a i h t o j ä r j e s t e l m i s t ä ä n + o p i s k e l i j a v a i h t o o n + o p i s k e l i j a v a s t a r i n n a n + o p i s k e l i j a v e r k o s t o j a + o p i s k e l i j a v e r k o s t o j e n + o p i s k e l i j a v i i s u m e j a + o p i s k e l i j a v ä e s t ö n + o p i s k e l i j a v ä e s t ö s t ä m m e + o p i s k e l i j a y h t e i s ö + o p i s k e l i j o i d e n + o p i s k e l i j o i h i n + o p i s k e l i j o i l l e + o p i s k e l i j o i l t a + o p i s k e l i j o i s t a + o p i s k e l i j o i t a + o p i s k e l l a + o p i s k e l l e s s a a n + o p i s k e l l u t + o p i s k e l t a v a + o p i s k e l u a + o p i s k e l u a i k a n a a n + o p i s k e l u a j a s t a + o p i s k e l u a j a t + o p i s k e l u a l a n + o p i s k e l u a l o i l l a + o p i s k e l u a p u r a h o j e n + o p i s k e l u i d e n + o p i s k e l u l l e + o p i s k e l u m a h d o l l i s u u d e n + o p i s k e l u m a h d o l l i s u u d e t + o p i s k e l u m a h d o l l i s u u k s i a + o p i s k e l u m a h d o l l i s u u k s i e n + o p i s k e l u n + o p i s k e l u o h j e l m i i n + o p i s k e l u o i k e u d e s t a + o p i s k e l u o i k e u s + o p i s k e l u o l o j a + o p i s k e l u p a i k a n + o p i s k e l u p a i k k a + o p i s k e l u p a i k k a k u n n a l l a a n + o p i s k e l u p a i k k o j a + o p i s k e l u p a i k k o j e n + o p i s k e l u p a i k o i l l a + o p i s k e l u s u h t e i s i i n + o p i s k e l u t o v e r e i t a n i + o p i s k e l u u n + o p i s k e l u v a p a u t e e n + o p i s k e l u v i i s u m i e n + o p i t a a n + o p i t t a v a + o p i t t a v a a + o p i t t e + o p i t t u j a + o p i t u t + o p p a a l l a + o p p e j a + o p p i a + o p p i a i n e + o p p i a k s e e n + o p p i a k s e m m e + o p p i e n + o p p i i + o p p i j ä r j e s t e l m ä n + o p p i k a a + o p p i k a a m m e + o p p i k i r j a a + o p p i k i r j a a n + o p p i k i r j a e s i m e r k i k s i + o p p i k i r j a e s i m e r k k i + o p p i k i r j a t + o p p i k i r j a t a p a u s + o p p i k i r j a t a p a u s t a + o p p i k i r j o i s s a + o p p i k o u l u i h i n + o p p i l a a t + o p p i l a i d e n + o p p i l a i d e n s a + o p p i l a i l l e + o p p i l a i l l e e n + o p p i l a i l t a + o p p i l a i s t a + o p p i l a i t a + o p p i l a i t o k s e e n + o p p i l a i t o k s e t + o p p i l a i t o k s i a + o p p i l a i t o k s i i n + o p p i l a i t o k s i l l a + o p p i l a i t o k s i l l e + o p p i l a i t o k s i l l e k i n + o p p i l a i t o k s i s s a + o p p i l a i t o k s i s s a a n + o p p i l a i t o k s i s t a + o p p i l a i t o k s i s t a m m e + o p p i l a i t o s t e n + o p p i l a s k o h t a i n e n + o p p i l a s l ä h t ö i n e n + o p p i l a s m ä ä r i e n k i n + o p p i l a s m ä ä r ä + o p p i l a s v a i h d o n + o p p i l a s v a i h t o + o p p i l a s v a i h t o a + o p p i l a s v a l i n n a t + o p p i l a u s e i t a + o p p i m a a n + o p p i m a m m e + o p p i m a s t a m m e + o p p i m a t e r i a a l e j a + o p p i m a t e r i a a l i a + o p p i m a t e r i a a l i e n + o p p i m a t e r i a a l i i n + o p p i m a t e r i a a l i n + o p p i m a t t a + o p p i m i a m m e + o p p i m i s a i h i o + o p p i m i s a l u e e n + o p p i m i s a l u e t t a + o p p i m i s a l u s t a + o p p i m i s e e n + o p p i m i s e l l a + o p p i m i s e l l e + o p p i m i s e l l e e n + o p p i m i s e n + o p p i m i s e s t a + o p p i m i s j a k s o t + o p p i m i s j ä r j e s t e l m i ä + o p p i m i s k e s k u k s i n a + o p p i m i s k o k e m u k s i a + o p p i m i s k o k e m u k s i i n + o p p i m i s k o k e m u s + o p p i m i s k o k e m u s t a + o p p i m i s k o l m i o t a + o p p i m i s k u l t t u u r i a + o p p i m i s k y k y + o p p i m i s k y k y i n e n + o p p i m i s k y k y i s e k s i + o p p i m i s k y k y i s i ä + o p p i m i s k y k y y n + o p p i m i s k y v y n + o p p i m i s k ä s i t y k s e n + o p p i m i s k ä y r ä l l ä + o p p i m i s m a h d o l l i s u u k s i a + o p p i m i s m a h d o l l i s u u k s i e n + o p p i m i s m a h d o l l i s u u k s i s t a + o p p i m i s m a l l e i s t a + o p p i m i s m a t e r i a a l i a + o p p i m i s m e n e t e l m i ä + o p p i m i s m u o t o j e n + o p p i m i s o l o s u h t e i d e n + o p p i m i s o n g e l m i a + o p p i m i s o n g e l m i i n + o p p i m i s p e l i + o p p i m i s p r o s e s s e j a + o p p i m i s p r o s e s s i + o p p i m i s p r o s e s s i a + o p p i m i s p r o s e s s i n + o p p i m i s p r o s e s s i s s a + o p p i m i s r a j o i t t e i n e n + o p p i m i s s e i k k a i l u j e n + o p p i m i s t a + o p p i m i s t a i t o a + o p p i m i s t a i t o j e n + o p p i m i s t a l o u t t a + o p p i m i s t a p o j e n + o p p i m i s t a r k o i t u k s e s s a + o p p i m i s t a r k o i t u k s i s s a + o p p i m i s t a v o i s t a + o p p i m i s t a v o i t t e e t + o p p i m i s t a v o i t t e i d e n + o p p i m i s t e h t a i t a + o p p i m i s t e o r i a + o p p i m i s t i l e j ä + o p p i m i s t o i m e t + o p p i m i s t u l o k s e t + o p p i m i s t u l o k s i a + o p p i m i s t u l o k s i i n + o p p i m i s t u l o s t e n + o p p i m i s t y y l i + o p p i m i s v a a t i m u s t e n + o p p i m i s v a i h e e s s a + o p p i m i s v a i h e t t a + o p p i m i s v a i h t o e h t o j a + o p p i m i s v a i k e u d e t + o p p i m i s v a i k e u k s i a + o p p i m i s v a i k e u k s i e n + o p p i m i s v a i k e u k s i i n + o p p i m i s v a i k e u k s i s t a + o p p i m i s v a i k e u s + o p p i m i s v a i k u t u k s e n + o p p i m i s v a l m i u d e t + o p p i m i s y h t e i s k u n t a a + o p p i m i s y h t e i s ö ö n + o p p i m i s y m p ä r i s t ö + o p p i n e e t + o p p i n e i m p i e n k i n + o p p i r e s u r s s i t + o p p i s o p i m u s + o p p i s o p i m u s j ä r j e s t e l m i e n + o p p i s o p i m u s k o u l u t u k s e n + o p p i s o p i m u s k o u l u t u k s e s s a + o p p i s o p i m u s k o u l u t u k s e s t a + o p p i s o p i m u s k o u l u t u s t a + o p p i s o p i m u s o h j e s ä ä n n ö s t ö + o p p i s o p i m u s o p p i l a a n + o p p i t u n n i n + o p p i t u n n i s t a + o p p i t u n t e j a + o p p i t u n t i + o p p i t u n t i a + o p p i t u n t i e n + o p p i v a t + o p p i v e l v o l l i s u u d e n + o p p i v e l v o l l i s u u d e s t a + o p p i v e l v o l l i s u u s + o p p i v e l v o l l i s u u s i ä n + o p p i v e l v o l l i s u u s i ä s s ä + o p p i v e l v o l l i s u u s j ä r j e s t e l m ä n + o p p i v e l v o l l i s u u s k o u l u n + o p p i v e l v o l l i s u u t e n s a + o p p o r t u n i s m i a + o p p o r t u n i s m i n + o p p o r t u n i s t i e n + o p p o r t u n i s t i r y h m ä l l e + o p p o r t u n i s t i s e s t i + o p p o r t u n i s t i s t a + o p p o r t u n i s t i t + o p p o s i t i o a i n e k s i i n + o p p o s i t i o a k t i i v e j a + o p p o s i t i o a k t i v i s t e i h i n + o p p o s i t i o a k t i v i s t e j a + o p p o s i t i o a k t i v i s t i + o p p o s i t i o a k t i v i s t i a + o p p o s i t i o a k t i v i s t i e n + o p p o s i t i o a k t i v i s t i n + o p p o s i t i o a k t i v i s t i s t a + o p p o s i t i o a k t i v i s t i t + o p p o s i t i o b l o k k i + o p p o s i t i o e d u s t a j a + o p p o s i t i o e d u s t a j i e n + o p p o s i t i o e h d o k k a a n + o p p o s i t i o h a h m o i s t a + o p p o s i t i o h a l l i t u k s e n + o p p o s i t i o i h m i s t e n + o p p o s i t i o j o h t a j a + o p p o s i t i o j o h t a j a a + o p p o s i t i o j o h t a j a l l e + o p p o s i t i o j o h t a j a n + o p p o s i t i o j o h t a j a n a + o p p o s i t i o j o h t a j a s t a + o p p o s i t i o j o h t a j a t + o p p o s i t i o j o h t a j a t k i n + o p p o s i t i o j o h t a j i a + o p p o s i t i o j o h t a j i e n + o p p o s i t i o j o h t a j i l l e + o p p o s i t i o j o h t a j i l t a + o p p o s i t i o j o h t a j i s t a + o p p o s i t i o j ä r j e s t ö + o p p o s i t i o j ä r j e s t ö i s t ä + o p p o s i t i o j ä s e n e l t ä + o p p o s i t i o j ä s e n e n + o p p o s i t i o j ä s e n e t + o p p o s i t i o j ä s e n i ä + o p p o s i t i o j ä s e n t e n + o p p o s i t i o k a u p u n g i s s a + o p p o s i t i o k o k o u k s e s t a + o p p o s i t i o l e h d e t + o p p o s i t i o l e h d i s t ä + o p p o s i t i o l e h d i s t ö l t ä + o p p o s i t i o l e h t i ä + o p p o s i t i o l e i r e i s t ä + o p p o s i t i o l e i r i s t ä + o p p o s i t i o l i i k e + o p p o s i t i o l i i k e t t ä + o p p o s i t i o l i i k k e e n + o p p o s i t i o l i i k k e e t + o p p o s i t i o l i i k k e i d e n + o p p o s i t i o l i i k k e i l t ä + o p p o s i t i o l i i k k e i t ä + o p p o s i t i o l i i t o n + o p p o s i t i o l t a + o p p o s i t i o l ä h t e i d e n + o p p o s i t i o m i e l e n o s o i t u s t e n + o p p o s i t i o m i e t i n n ö n + o p p o s i t i o m i n i s t e r e j ä + o p p o s i t i o n + o p p o s i t i o o n + o p p o s i t i o p o l i i t i k k o + o p p o s i t i o p o l i i t i k k o a + o p p o s i t i o p o l i i t i k k o i h i n + o p p o s i t i o p o l i i t i k k o j a + o p p o s i t i o p o l i i t i k k o j e n + o p p o s i t i o p o l i i t i k o n + o p p o s i t i o p o l i i t i k o t + o p p o s i t i o p o l i t i i k k a a + o p p o s i t i o p o l i t i i k o i l l e + o p p o s i t i o p u h e e n v u o r o + o p p o s i t i o p u o l e e n + o p p o s i t i o p u o l u e + o p p o s i t i o p u o l u e e l l e + o p p o s i t i o p u o l u e e l t a + o p p o s i t i o p u o l u e e n + o p p o s i t i o p u o l u e e n a + o p p o s i t i o p u o l u e e s e e n + o p p o s i t i o p u o l u e e t + o p p o s i t i o p u o l u e e t k i n + o p p o s i t i o p u o l u e i d e n + o p p o s i t i o p u o l u e i d e n k i n + o p p o s i t i o p u o l u e i l l a + o p p o s i t i o p u o l u e i l l e + o p p o s i t i o p u o l u e i l t a + o p p o s i t i o p u o l u e i s i i n + o p p o s i t i o p u o l u e i s s a + o p p o s i t i o p u o l u e i s t a + o p p o s i t i o p u o l u e i t a + o p p o s i t i o p u o l u e i t t e n + o p p o s i t i o p u o l u e t t a + o p p o s i t i o r o o l i a a n + o p p o s i t i o r y h m i e n + o p p o s i t i o r y h m i l l e + o p p o s i t i o r y h m i l l ä + o p p o s i t i o r y h m i t t y m i e n + o p p o s i t i o r y h m i t t y m i i n + o p p o s i t i o r y h m i t t y m i l l e + o p p o s i t i o r y h m i t t y m i ä + o p p o s i t i o r y h m i t t y m ä n + o p p o s i t i o r y h m i ä + o p p o s i t i o r y h m ä n + o p p o s i t i o r y h m ä t + o p p o s i t i o s s a + o p p o s i t i o s t a + o p p o s i t i o t a + o p p o s i t i o t a h o j e n + o p p o s i t i o t o i m i n n a n + o p p o s i t i o t o i m i n n a s t a + o p p o s i t i o v o i m a + o p p o s i t i o v o i m a n + o p p o s i t i o v o i m a t + o p p o s i t i o v o i m i a + o p p o s i t i o v o i m i e n + o p p o s i t i o v o i m i l l e + o p t i m a a l i s e l l e + o p t i m a a l i s e m m a n + o p t i m a a l i s e s t a + o p t i m a a l i s e s t i + o p t i m a a l i s i a + o p t i m a a l i s t a + o p t i m i h i n n o i l l a + o p t i m i k o k o + o p t i m i s m i a + o p t i m i s m i a n n e + o p t i m i s m i i n + o p t i m i s m i i n i + o p t i m i s m i n + o p t i m i s m i n a i h e i t a + o p t i m i s m i s t a + o p t i m i s t e j a + o p t i m i s t i n a + o p t i m i s t i s e e n + o p t i m i s t i s e m m a s s a + o p t i m i s t i s e m p a a + o p t i m i s t i s e m p a n a + o p t i m i s t i s e m p i + o p t i m i s t i s e m p i a + o p t i m i s t i s e m p i i n + o p t i m i s t i s i a + o p t i m i s t i s i m m a s t a + o p t i m i s t i s i m m a t + o p t i m i s t i s i m m a t k a a n + o p t i m i s t i s i m p i e n + o p t i m i s t i s i n a + o p t i m i s t i s t a + o p t i m i s t i t + o p t i m o i d a + o p t i m o i d a k s e e n + o p t i m o i m i s e k s i + o p t i m o i m i s t a + o p t i m o i t a v a + o p t i o i l l a + o p t i o k a u p a l l a + o p t i s e s t a + o p t i s t a + o p u s n u m e r o + o r a a k k e l i k o n e + o r a a k k e l i l u u k i r j o i t u k s e t + o r a a k k e l i n + o r a h y t y k k ä + o r a n i a l a i s v e l j e s k u n t a a + o r a n s s i e n + o r a n s s i i n + o r a n s s i k o r u s i m p p u + o r a n s s i k ä r p ä s s i e n i + o r a n s s i m a l j a k a s + o r a n s s i m a l v i o + o r a n s s i n + o r a n s s i n a p a l a k k i + o r a n s s i n o k k a k a r d i n a a l i + o r a n s s i o t s a m u u r a + o r a n s s i p ä ä t a n g a r a + o r a n s s i r a s t a s + o r a n s s i r i n t a k o t i n g a + o r a n s s i t + o r a n s s i v i i k u n a k a i j a + o r a p a a t s a m a + o r a t u o m i + o r a v a n p y ö r ä ä n + o r d a n + o r e j a + o r g a a n i s i a + o r g a a n i s i i n + o r g a a n i s i s t a + o r g a a n i s t e n + o r g a n i s a a t i o e r o j a + o r g a n i s a a t i o h a n k k e e n + o r g a n i s a a t i o i d e n + o r g a n i s a a t i o i h i n + o r g a n i s a a t i o i l l e + o r g a n i s a a t i o i l t a + o r g a n i s a a t i o i s s a + o r g a n i s a a t i o i s t a + o r g a n i s a a t i o i t a + o r g a n i s a a t i o j ä r j e s t e l m i e n + o r g a n i s a a t i o j ä r j e s t e l m i ä + o r g a n i s a a t i o j ä r j e s t e l m ä + o r g a n i s a a t i o j ä r j e s t e l m ä n + o r g a n i s a a t i o k a a v i o o n + o r g a n i s a a t i o k a t a s t r o f i s t a + o r g a n i s a a t i o k e h y k s e n + o r g a n i s a a t i o k e h y s t ä + o r g a n i s a a t i o k o k o n a i s u u d e s s a + o r g a n i s a a t i o k u l t t u u r i + o r g a n i s a a t i o k u l t t u u r i i n + o r g a n i s a a t i o k y v y n + o r g a n i s a a t i o l t a a n + o r g a n i s a a t i o m a l l e j a + o r g a n i s a a t i o m a l l i + o r g a n i s a a t i o m a l l i a + o r g a n i s a a t i o m a l l i n + o r g a n i s a a t i o m a l l i n a + o r g a n i s a a t i o m u l l i s t u s + o r g a n i s a a t i o m u o d o i l l e + o r g a n i s a a t i o m u o d o s t a + o r g a n i s a a t i o m u o t o j a + o r g a n i s a a t i o m u o t o j e n + o r g a n i s a a t i o m u u t o k s e e n + o r g a n i s a a t i o m u u t o k s i a + o r g a n i s a a t i o m u u t o k s i s t a + o r g a n i s a a t i o m u u t o s t a + o r g a n i s a a t i o n + o r g a n i s a a t i o n a + o r g a n i s a a t i o n s a + o r g a n i s a a t i o p e r i a a t t e i s t a a n + o r g a n i s a a t i o p o l i t i i k a s s a + o r g a n i s a a t i o p u o l e l l a + o r g a n i s a a t i o r a k e n n e + o r g a n i s a a t i o r a k e n n e t t a + o r g a n i s a a t i o r a k e n t e e n + o r g a n i s a a t i o r a k e n t e e n s a + o r g a n i s a a t i o r a k e n t e e s e e n + o r g a n i s a a t i o r a k e n t e i d e n + o r g a n i s a a t i o r a k e n t e i s i i n + o r g a n i s a a t i o r e s u r s s e j a + o r g a n i s a a t i o r e s u r s s i e n + o r g a n i s a a t i o r e s u r s s i t + o r g a n i s a a t i o r y h m i l l e + o r g a n i s a a t i o s s a + o r g a n i s a a t i o t + o r g a n i s a a t i o t a p o j a + o r g a n i s a a t i o t a s o l l a + o r g a n i s a a t i o t a s o n + o r g a n i s a a t i o t u k e a + o r g a n i s a a t i o u u d i s t u k s i s t a + o r g a n i s a a t i o v a a t i m u k s e t + o r g a n i s a a t i o v a a t i m u k s i a + o r g a n i s a a t i o v i r h e e t + o r g a n i s a a t i o v ä l i n e + o r g a n i s a a t i o y k s i k k ö + o r g a n i s a a t i o y k s i k k ö j e n s ä + o r g a n i s a t o r i s e s t i + o r g a n i s a t o r i s i a + o r g a n i s a t o r i s i s t a + o r g a n i s a t o r i s t e n + o r g a n i s m e i h i n + o r g a n i s m e i l l a + o r g a n i s m e i l l e + o r g a n i s m e i s s a + o r g a n i s m e i s t a + o r g a n i s m e j a + o r g a n i s m i e n + o r g a n i s m i t + o r g a n i s o i d a + o r g a n i s o i d a a n + o r g a n i s o i d u m p a a + o r g a n i s o i d u m p i a + o r g a n i s o i m a + o r g a n i s o i m a a n + o r g a n i s o i m i s e n + o r g a n i s o i m i s e s t a + o r g a n i s o i n n i s s a + o r g a n i s o i n n i s t a + o r g a n i s o i n t i a + o r g a n i s o i n t i i n + o r g a n i s o i n t i k y k y ä + o r g a n i s o i n t i m a l l i n + o r g a n i s o i n t i m e n e t e l m ä n + o r g a n i s o i n t i m e n e t t e l y j ä + o r g a n i s o i n t i m u o t o j e n + o r g a n i s o i n t i o n g e l m i a + o r g a n i s o i n t i p e r i a a t t e e n + o r g a n i s o i n t i t a i d o i s t a + o r g a n i s o i n t i t a p a a + o r g a n i s o i n t i t a p o i h i n + o r g a n i s o i n t i t a p o j e n + o r g a n i s o i n t i t u k i + o r g a n i s o i n t i v a s t u u t a + o r g a n i s o i t a i s i i n + o r g a n i s o i t a v a + o r g a n i s o i t u a + o r g a n i s o i t u j a + o r g a n i s o i t u m a a n + o r h o n + o r i e n t e n k e r t t u l i + o r i e n t o i t u m i s k e s k u s t e l u + o r i e n t o i t u m i s k y k y ä + o r i v e s i + o r j a i n t i a a n i t + o r j a j ä r v i + o r j a k a p i n a + o r j a k a p i n a s s a + o r j a k a u p a k s i + o r j a k a u p a l l a + o r j a k a u p a l t a + o r j a k a u p a n + o r j a k a u p a n k i n + o r j a k a u p a s s a + o r j a k a u p a s t a + o r j a k a u p p a a + o r j a k a u p p a a n + o r j a k a u p p i a i d e n + o r j a k a u p p i a i k s i + o r j a k a u p p i a i t a + o r j a k u n i n g a t a r + o r j a l a i v a + o r j a l a i v a s s a + o r j a m a r k k i n o i t a + o r j a n o m i s t a j i l l e + o r j a p a l k a l l a + o r j a p i i s k u r i n + o r j a r a n n i k k o + o r j a r e i t t i + o r j a s a l a m a + o r j a s o t a + o r j a t a p a u k s i s t a + o r j a t t a r e s i + o r j a t y ö + o r j a t y ö h ö n + o r j a t y ö l ä i s t e n + o r j a t y ö n + o r j a t y ö p a i k o i s s a + o r j a t y ö s s ä + o r j a t y ö s t ä + o r j a t y ö t ä + o r j a t y ö v o i m a a + o r j a t y ö v o i m a k s i + o r j a t y ö v o i m a l t a + o r j a t y ö v o i m a n + o r j a t y ö v o i m a n a + o r j a t y ö v o i m a s t a + o r j a y h t e i s k u n n a s s a + o r j i e n + o r j i k s i + o r j u u d e k s i + o r j u u d e l l a + o r j u u d e n + o r j u u d e s t a + o r j u u s o i k e u t e e n + o r j u u s t a p a u k s i a + o r j u u t e e n + o r j u u t t a + o r j u u t u k s e e n + o r k e s t e r i a + o r k e s t e r i k a p p a l e t t a + o r k e s t e r i s a r j a t + o r k i d e a l i l j a + o r k i d e a r u k o i l i j a s i r k k a + o r l o v i n + o r n i t i i n i a m i n o t r a n s f e r a a s i + o r n i t i i n i d e k a r b o k s y l a a s i + o r o m i a + o r o m o t + o r p o a + o r p o j e n + o r p o k o d e i s s a + o r p o k o t e i h i n + o r p o l a p s e t + o r p o l a p s i r a u k k a + o r p o l a s t e n + o r s i k a n a n + o r t e s j o k i + o r t o d o k s e j a + o r t o d o k s i j u u t a l a i s e n + o r t o d o k s i j u u t a l a i s t e n + o r t o d o k s i j u u t a l a i s u u s + o r t o d o k s i k a t o l i s i i n + o r t o d o k s i k i r k k o + o r t o d o k s i k i r k k o a + o r t o d o k s i k i r k k o j a + o r t o d o k s i k i r k k o j e n + o r t o d o k s i k i r k k o o n + o r t o d o k s i k i r k o n + o r t o d o k s i k i r k o s s a + o r t o d o k s i k r i s t i t t y + o r t o d o k s i k r i s t i t t y j e n + o r t o d o k s i k r i s t i t t y j ä + o r t o d o k s i k r i s t i t y l l e + o r t o d o k s i k r i s t i t y n + o r t o d o k s i m a i s s a + o r t o d o k s i m u n k i t + o r t o d o k s i p a t r i a r k k a + o r t o d o k s i r a k e n n u s t e n + o r t o d o k s i r y h m ä s t ä + o r t o d o k s i s e n + o r t o d o k s i s e s s a + o r v o i k s i + o r v o k k i h o p e a t ä p l ä + o r v o k k i k o l i b r i + o r v o k k i k o r p r a a l i k e r t t u + o r v o k k i k o t t a r a i n e n + o r v o k k i p e i p p o + o r v o k k i v a l m u s k a + o r v o n t ä d y k e + o r w e l l i l a i s e e n + o r w e l l i l a i s e n + o s a a m a l l a + o s a a m a t t a + o s a a m i s a l a + o s a a m i s a l o i l l a + o s a a m i s a l o j e n + o s a a m i s a l u e + o s a a m i s a l u e i d e n + o s a a m i s a l u e i t a + o s a a m i s e e n + o s a a m i s e l l a a n + o s a a m i s e m m e + o s a a m i s e n + o s a a m i s e n n e + o s a a m i s e n s a + o s a a m i s e s t a + o s a a m i s i n e e n + o s a a m i s i n t e n s i i v i s e t + o s a a m i s k e s k u k s e e n + o s a a m i s k e s k u k s e n + o s a a m i s k e s k u k s e n a + o s a a m i s k e s k u k s e s s a + o s a a m i s k e s k u k s e t + o s a a m i s k e s k u k s i a + o s a a m i s k e s k u k s i a m m e + o s a a m i s k e s k u k s i e n + o s a a m i s k e s k u k s i i m m e + o s a a m i s k e s k u k s i i n + o s a a m i s k e s k u k s i l l a + o s a a m i s k e s k u k s i s s a + o s a a m i s k e s k u k s i s t a + o s a a m i s k e s k u s + o s a a m i s k e s k u s t e n + o s a a m i s k e s k u s v e r k o s t o j e n + o s a a m i s k o k o n a i s u u t t a + o s a a m i s k o l m i o + o s a a m i s k o l m i o i d e n + o s a a m i s k o l m i o i s s a + o s a a m i s k o l m i o i t a + o s a a m i s k o l m i o n + o s a a m i s k o l m i o o n + o s a a m i s k o l m i o s s a + o s a a m i s k o l m i o s t a + o s a a m i s k o l m i o t a + o s a a m i s k y s y m y k s e e n + o s a a m i s p a n o r a a m a n + o s a a m i s p a s s i + o s a a m i s p a s s i a + o s a a m i s p a s s i l l a + o s a a m i s p a s s i n + o s a a m i s p e r u s t a a + o s a a m i s p o h j a i s e t + o s a a m i s p o t e n t i a a l i a + o s a a m i s p ä ä o m a a + o s a a m i s p ä ä o m a n + o s a a m i s s t a n d a r d e j a + o s a a m i s t a + o s a a m i s t a a n + o s a a m i s t a l o u d e k s i + o s a a m i s t a l o u d e n + o s a a m i s t a l o u d e s s a + o s a a m i s t a l o u k s i e n + o s a a m i s t a l o u s + o s a a m i s t a l o u t e e n + o s a a m i s t a l o u t t a + o s a a m i s t a m m e + o s a a m i s t a r p e i s t a + o s a a m i s t a s o + o s a a m i s t a s o n + o s a a m i s v a a t i m u k s i s t a + o s a a m i s v a j e + o s a a m i s v a j e e n + o s a a m i s v a j e e t + o s a a m i s v a l t a i s i l l a + o s a a m i s v e r k k o j e n + o s a a m i s v e r k o s t o a + o s a a m i s v e r k o s t o i h i n + o s a a m i s v e r k o s t o i l l e + o s a a m i s v e r k o s t o i s s a + o s a a m i s v e r k o s t o j a + o s a a m i s v e r k o s t o j e n + o s a a m i s v e r k o s t o t + o s a a m i s v i r r a s t a + o s a a m i s y h t e e n l i i t t y m i ä + o s a a m i s y h t e i s k u n n a n + o s a a m i s y h t e i s k u n n a s s a + o s a a m i s y h t e i s k u n t a + o s a a m i s y h t e i s k u n t a a + o s a a m i s y h t e i s k u n t a a n + o s a a m i s y h t e i s ö i s t ä + o s a a m i s y h t e i s ö j e n + o s a a m i s y h t e i s ö n + o s a a m m e + o s a a m m e k i n + o s a a m m e k o + o s a a n + o s a a t t e + o s a a t t e k o + o s a a v a m p a a + o s a a v a m p i a + o s a a v a n + o s a a v a n s a + o s a a v a t + o s a d i r e k t i i v e i s s ä + o s a i s i a + o s a i s i m m e + o s a i s i m m i l l e + o s a i s i m m i l t a + o s a i s i m p i a + o s a i s i m p i e n + o s a i s t u n n o s s a + o s a j ä r j e s t e l m i l l e + o s a k a i s t a n + o s a k a s d e m o k r a t i a k s i + o s a k a s d e m o k r a t i a l l a + o s a k a s d e m o k r a t i a s t a + o s a k a s s o p i m u k s e n + o s a k a s s o p i m u k s i l l e + o s a k a s y r i t y k s e t + o s a k a t s a u k s e n + o s a k a u p a n + o s a k e a r v o + o s a k e i n d e k s i ä + o s a k e j ä r j e s t e l m i ä + o s a k e k a u p a s s a m m e + o s a k e k a u p p o j a + o s a k e k e i n o t t e l u + o s a k e k e i n o t t e l u n + o s a k e k r i i s i + o s a k e k u l t t u u r i + o s a k e k u l t t u u r i n + o s a k e k u r s s e j a + o s a k e k u r s s i + o s a k e k u r s s i e n + o s a k e k u r s s i r i s k i + o s a k e l a i n a a j i a + o s a k e l a i n a u s + o s a k e l a i n a u s t a + o s a k e m a r k k i n a + o s a k e m a r k k i n a h i n t o i h i n + o s a k e m a r k k i n a j ä r j e s t e l m ä + o s a k e m a r k k i n a j ä r j e s t e l m ä s t ä + o s a k e m a r k k i n a s i j o i t t a j i e n + o s a k e m a r k k i n a t + o s a k e m a r k k i n a v a i h t o e h t o + o s a k e m a r k k i n o i d e n + o s a k e m a r k k i n o i h i n + o s a k e m a r k k i n o i l l a + o s a k e m a r k k i n o i l l e + o s a k e m a r k k i n o i l t a + o s a k e o m i s t u k s e e n + o s a k e o m i s t u k s e s t a + o s a k e o m i s t u s + o s a k e o m i s t u s j ä r j e s t e l m i e n + o s a k e o p t i o i t a + o s a k e o p t i o t + o s a k e p o h j i a + o s a k e p ä ä o m a a + o s a k e p ä ä o m a a n + o s a k e p ä ä o m a l l e + o s a k e p ä ä o m a n + o s a k e p ä ä o m a s t a + o s a k e p ö r s s i ä + o s a k e s a l k k u j e n + o s a k e s i j o i t u k s i l l a + o s a k e s ä ä n n ö i s t ä + o s a k e t o d i s t u k s e t + o s a k e v o i t o i s t a + o s a k e v o i t t o j e n + o s a k e y h t i ö i d e n + o s a k e y h t i ö i h i n + o s a k e y h t i ö i k s i + o s a k e y h t i ö i l l e + o s a k e y h t i ö i s t ä + o s a k e y h t i ö i t ä + o s a k e y h t i ö l a k i e n + o s a k e y h t i ö m a l l i + o s a k e y h t i ö n + o s a k e y h t i ö s s ä + o s a k e y h t i ö s t ä + o s a k e y h t i ö s ä ä d ö s + o s a k e y h t i ö t + o s a k e y h t i ö t ä + o s a k k a i d e n s a + o s a k k a i k s i + o s a k k a i t a + o s a k k e e n o m i s t a j a p o h j a a + o s a k k e e n o m i s t a j a r y h m ä n + o s a k k e e n o m i s t a j i e n + o s a k k e e n o m i s t a j i e n s a + o s a k k e e n o m i s t a j i l l e + o s a k k e e n o m i s t u k s e n + o s a k k e i d e n + o s a k k e i d e n l u o v u t u s m e n e t t e l y j e n + o s a k k e i l l a + o s a k k e i n a + o s a k k e i s i i n + o s a k k e i s t a + o s a k k e i t a + o s a k k u u s j ä r j e s t e l m i s s ä + o s a k k u u s j ä r j e s t e l m i s t ä + o s a k k u u s j ä r j e s t e l m ä t + o s a k k u u s j ä r j e s t e l y j ä + o s a k k u u s l a i n o i h i n + o s a k k u u s o h j e l m i i n + o s a k k u u s s t r a t e g i o i d e n + o s a k o k o n a i s u u d e n + o s a k y s y m y k s e e n + o s a k y s y m y k s e n + o s a k y s y m y k s e s t ä + o s a l l a + o s a l l e + o s a l l i s e n + o s a l l i s e n a + o s a l l i s i a + o s a l l i s i k s i + o s a l l i s i l l e + o s a l l i s i n a + o s a l l i s t a m i s p o l i t i i k a l l a + o s a l l i s t a m i s p o l i t i i k a n + o s a l l i s t a m i s p o l i t i i k k a a + o s a l l i s t a m i s p r o s e s s i i n + o s a l l i s t a m i s s t r a t e g i a n + o s a l l i s t a m i s t a + o s a l l i s t a v a a + o s a l l i s t a v a m m a l l e + o s a l l i s t a v a m m a n + o s a l l i s t a v a m p a a + o s a l l i s t a v a m p a a n + o s a l l i s t a v a m p i + o s a l l i s t a v a m p i e n + o s a l l i s t a v a n + o s a l l i s t e t t a v a + o s a l l i s t u a + o s a l l i s t u a k s e e n + o s a l l i s t u a k s e m m e + o s a l l i s t u a k s e n i + o s a l l i s t u e s s a a n + o s a l l i s t u e s s a n i + o s a l l i s t u i + o s a l l i s t u i m m e + o s a l l i s t u i n + o s a l l i s t u i s i + o s a l l i s t u i s i v a t + o s a l l i s t u i t + o s a l l i s t u i t t e + o s a l l i s t u i v a t + o s a l l i s t u j a j o u k o l l a + o s a l l i s t u j a l u e t t e l o + o s a l l i s t u j a l u e t t e l o j a + o s a l l i s t u j a m a a + o s a l l i s t u j a m a a n + o s a l l i s t u j a m a a t a + o s a l l i s t u j a m a i d e n + o s a l l i s t u j a m a i l l e + o s a l l i s t u j a m a i s t a + o s a l l i s t u j a m ä ä r ä + o s a l l i s t u j a m ä ä r ä n + o s a l l i s t u j a m ä ä r ä ä + o s a l l i s t u j a n + o s a l l i s t u j a t + o s a l l i s t u j a v a l t i o i d e n + o s a l l i s t u j a v a l t i o i h i n + o s a l l i s t u j a v a l t i o l t a + o s a l l i s t u j a v a l t i o s s a + o s a l l i s t u j a v a l t i o t + o s a l l i s t u j a v a l t i o t a + o s a l l i s t u j i a + o s a l l i s t u j i e n + o s a l l i s t u j i s t a + o s a l l i s t u k a a m m e + o s a l l i s t u m a a n + o s a l l i s t u m a l l a + o s a l l i s t u m a s t a + o s a l l i s t u m a t t a + o s a l l i s t u m i s a s t e + o s a l l i s t u m i s a s t e e n + o s a l l i s t u m i s a s t e t t a + o s a l l i s t u m i s a s t e t t a a n + o s a l l i s t u m i s b u d j e t t i + o s a l l i s t u m i s e h d o i s t a + o s a l l i s t u m i s e l l a + o s a l l i s t u m i s e n + o s a l l i s t u m i s e s t a + o s a l l i s t u m i s e s t a n n e + o s a l l i s t u m i s h a k e m u k s e n + o s a l l i s t u m i s i n n o k k u u d e n + o s a l l i s t u m i s j ä r j e s t e l m i e n + o s a l l i s t u m i s j ä r j e s t e l m ä s s ä + o s a l l i s t u m i s j ä r j e s t e l y j ä + o s a l l i s t u m i s k e l p o i s i a + o s a l l i s t u m i s k y s y m y k s e e n + o s a l l i s t u m i s k y s y m y s + o s a l l i s t u m i s m a h d o l l i s u u d e n + o s a l l i s t u m i s m a h d o l l i s u u d e s t a + o s a l l i s t u m i s m a h d o l l i s u u d e t + o s a l l i s t u m i s m a h d o l l i s u u k s i a + o s a l l i s t u m i s m a h d o l l i s u u k s i e n + o s a l l i s t u m i s m a h d o l l i s u u k s i s t a + o s a l l i s t u m i s m a h d o l l i s u u s + o s a l l i s t u m i s m a l l i l l e + o s a l l i s t u m i s m e k a n i s m e j a + o s a l l i s t u m i s m e n e t t e l y i s t ä + o s a l l i s t u m i s m e n e t t e l y j e n + o s a l l i s t u m i s m e n e t t e l y s t ä + o s a l l i s t u m i s m e n e t t e l y t + o s a l l i s t u m i s m u o d o i s t a + o s a l l i s t u m i s m u o t o i h i n + o s a l l i s t u m i s m u o t o j a + o s a l l i s t u m i s m u o t o j e n + o s a l l i s t u m i s o i k e u d e n + o s a l l i s t u m i s o i k e u d e s t a + o s a l l i s t u m i s o i k e u d e t + o s a l l i s t u m i s o i k e u k s i a + o s a l l i s t u m i s o i k e u k s i a a n + o s a l l i s t u m i s o i k e u k s i a m m e + o s a l l i s t u m i s o i k e u k s i e n + o s a l l i s t u m i s o i k e u k s i i n + o s a l l i s t u m i s o i k e u s + o s a l l i s t u m i s o i k e u t t a + o s a l l i s t u m i s o i k e u t t a a n + o s a l l i s t u m i s p e r i a a t e + o s a l l i s t u m i s p e r i a a t t e e l l a + o s a l l i s t u m i s p e r i a a t t e i s t a + o s a l l i s t u m i s p r o s e n t t i a + o s a l l i s t u m i s p r o s e s s i n + o s a l l i s t u m i s p r o s e s s i s t a + o s a l l i s t u m i s p y y n n ö n + o s a l l i s t u m i s r a j o i t u k s e t + o s a l l i s t u m i s s ä ä n n ö i s t ä + o s a l l i s t u m i s s ä ä n n ö t + o s a l l i s t u m i s s ä ä n t ö i h i n + o s a l l i s t u m i s s ä ä n t ö j e n + o s a l l i s t u m i s s ä ä n t ö j ä + o s a l l i s t u m i s t a + o s a l l i s t u m i s t a m m e + o s a l l i s t u m i s t a p o j a + o s a l l i s t u m i s t a s o + o s a l l i s t u m i s t a v a n + o s a l l i s t u m i s v a j e + o s a l l i s t u m m e + o s a l l i s t u n + o s a l l i s t u n e e n a + o s a l l i s t u n e e t + o s a l l i s t u n e i d e n + o s a l l i s t u n e i s t a + o s a l l i s t u n e i t a + o s a l l i s t u n u t + o s a l l i s t u t t a v a + o s a l l i s t u t t u a a n + o s a l l i s t u t t u a n i + o s a l l i s t u u + o s a l l i s t u u k o + o s a l l i s t u v a l l e + o s a l l i s t u v a m m a n + o s a l l i s t u v a m p a a + o s a l l i s t u v a n + o s a l l i s t u v a n s a + o s a l l i s t u v a t + o s a l l i s t u v a t k o + o s a l l i s t u v i a + o s a l l i s t u v i e n + o s a l l i s t u v i l l e + o s a l l i s t u v i s t a + o s a l l i s u u d e n + o s a l l i s u u s a l o i t e + o s a l l i s u u s a l o i t t e e n + o s a l l i s u u s p e r i a a t t e e l l a + o s a l l i s u u s t a l o u s + o s a l l i s u u t t a + o s a l l i s u u t t a a n + o s a l t a a n + o s a l t a m m e + o s a m a k s u i l l a + o s a m a r k k i n o i l l a + o s a m a r k k i n o i t a + o s a m e n e s t y k s e n + o s a m m e + o s a m u r t o k e h i t e l m ä + o s a m ä ä r ä t e s t i + o s a n a + o s a n i + o s a n n e + o s a n n u t + o s a n o t t a j a l i s t a n + o s a n o t t a j a l i s t o j a + o s a n o t t a j a m a i d e n + o s a n o t t a j a m ä ä r ä n + o s a n o t t a j a m ä ä r ä ä + o s a n o t t a j a v a l t i o t + o s a n o t t a j i s t a + o s a n o t t o m m e + o s a n o t t o n i + o s a n o t t o n n e + o s a n o t t o n s a + o s a n o t t o o n + o s a n o t t o v i e s t i n + o s a n s a + o s a o h j e l m i k s i + o s a o m i s t u k s e e n + o s a o n g e l m a a + o s a p a i n e + o s a p r o j e k t i a + o s a p u o l e e n + o s a p u o l e l l a + o s a p u o l e l l e + o s a p u o l e l t a + o s a p u o l e n + o s a p u o l e n a + o s a p u o l e s t a + o s a p u o l e t + o s a p u o l i a + o s a p u o l i a k i n + o s a p u o l i e n + o s a p u o l i i n + o s a p u o l i k o k o u k s e e n + o s a p u o l i k o k o u k s e s s a + o s a p u o l i k o n f e r e n s s i a + o s a p u o l i k o n f e r e n s s i n + o s a p u o l i k s i + o s a p u o l i l l a + o s a p u o l i l l e + o s a p u o l i l t a + o s a p u o l i n a + o s a p u o l i s t a + o s a p u o l t a + o s a p u o l t e n + o s a p ä i v ä t y ö p a i k k o i h i n + o s a r a h o i t e t t a v i e n + o s a r a h o i t e t t u i h i n + o s a r a h o i t e t t u j a + o s a r a h o i t e t t u j e n + o s a r a h o i t e t u i s t a + o s a r a h o i t t a m i s e s t a + o s a r a h o i t u k s e e n + o s a r a h o i t u k s e l l a + o s a r a h o i t u k s e n + o s a r a h o i t u k s e s t a + o s a r a h o i t u s a s t e e n + o s a r a h o i t u s a s t e i l l a + o s a r a h o i t u s e h d o i n + o s a r a h o i t u s j ä r j e s t e l m i e n + o s a r a h o i t u s j ä r j e s t e l m ä + o s a r a h o i t u s k e l p o i s i a + o s a r a h o i t u s o s u u d e n + o s a r a h o i t u s o s u u d e t + o s a r a h o i t u s o s u u s + o s a r a h o i t u s o s u u t t a + o s a r a h o i t u s p r o s e n t t i + o s a r a h o i t u s s i t o u m u k s e l l a + o s a r a h o i t u s s o p i m u k s i a + o s a r a h o i t u s s ä ä n t ö j e n + o s a r a h o i t u s t a + o s a r a h o i t u s t o i m i a + o s a r a t k a i s u + o s a r a t k a i s u i s t a + o s a r a t k a i s u n + o s a r a t k a i s u t + o s a r e f o r m i + o s a s o p i m u k s e s t a + o s a s s a + o s a s t a + o s a s t o a + o s a s t o i l l a + o s a s t o i s s a + o s a s t o j a + o s a s t o j e n + o s a s t o m m e + o s a s t o n + o s a s t o n s a + o s a s t o t + o s a s t r a t e g i a s t a + o s a s y y l l i s i k s i + o s a s y y l l i s i ä + o s a s y y l l i s y y t e m m e + o s a t a + o s a t a v o i t t e i t a + o s a t e k i j ä n ä + o s a t e k i j ä t + o s a t e k i j ö i d e n + o s a t e k i j ö i h i n + o s a t e k i j ö i s t ä + o s a t e k i j ö i t ä + o s a t o t u u d e n + o s a t t a v a + o s a t u l o k s e t + o s a t u o t a n t o o n + o s a t u o t t e e n + o s a v a l t i o i d e n + o s a v a l t i o i h i n + o s a v a l t i o i k s i + o s a v a l t i o i l l a + o s a v a l t i o i l l e + o s a v a l t i o i l l e e n + o s a v a l t i o i n a + o s a v a l t i o i s s a + o s a v a l t i o i s t a + o s a v a l t i o i t a + o s a v a l t i o m m e + o s a v a l t i o n + o s a v a l t i o s s a + o s a v a l t i o s t a + o s a v a l t i o t + o s a v a l t i o t a + o s a v a l t i o t a s o l l a + o s a v a s t a u s + o s a v a s t u u l l i s i a + o s a v a s t u u m a k s u i l l a + o s a v a s t u u n + o s a v a s t u u s s a + o s a v a s t u u t a + o s a v o i t t o + o s a v o i t t o n a + o s i e n + o s i e n s a + o s i i n + o s i i n s a + o s i l l e + o s i n a + o s i n k o a + o s i n k o i n a + o s i n k o j a + o s i o n + o s i o n a + o s i o o n + o s i o t a + o s i s s a + o s i s t a + o s i t t a i n e n k i n + o s i t t a i n k i n + o s i t t a i s d e r i v a a t t a + o s i t t a i s d i f f e r e n t i a a l i y h t ä l ö + o s i t t a i s e l l a k i n + o s i t t a i s e s t a + o s i t t a i s e t + o s i t t a i s f u n k t i o + o s i t t a i s i s s a + o s i t t a i s r a t k a i s u j a + o s i t t a i s t a + o s i t t a m i s p e r u s t e + o s i t t e l u l a k i + o s m a n + o s m a n i e n + o s m a n i l l e + o s m a n i n t u r k k i + o s m a n k ä ä m i k e r t t u n e n + o s m i u m t e t r o k s i d i + o s m o o s i v o i m a + o s o i t a m m e + o s o i t a n + o s o i t a t t e + o s o i t e l l a + o s o i t e t a + o s o i t e t a a n + o s o i t e t a a n p a + o s o i t e t i e t o j a + o s o i t e t t a e s s a + o s o i t e t t a v a + o s o i t e t t u a + o s o i t e t t u i h i n + o s o i t e t t u j a + o s o i t e t t u j e n + o s o i t e t u i l l a + o s o i t e t u i l l e + o s o i t e t u n + o s o i t e t u t + o s o i t i t t e + o s o i t t a a + o s o i t t a a k i n + o s o i t t a a k s e e n + o s o i t t a a k s e m m e + o s o i t t a a k s e n i + o s o i t t a e s s a a n + o s o i t t a i s i + o s o i t t a k a a + o s o i t t a k a a m m e + o s o i t t a m a + o s o i t t a m a a + o s o i t t a m a a n + o s o i t t a m a l l a + o s o i t t a m a l l e + o s o i t t a m a m m e + o s o i t t a m a n s a + o s o i t t a m a s t a + o s o i t t a m a t t a + o s o i t t a m i n + o s o i t t a m i s e k s i + o s o i t t a m i s e s t a + o s o i t t a m i s t a n n e + o s o i t t a n e e n + o s o i t t a n e e t + o s o i t t a n e v a t + o s o i t t a n u t + o s o i t t a u t u a + o s o i t t a u t u i + o s o i t t a u t u i k i n + o s o i t t a u t u i s i + o s o i t t a u t u m a a n + o s o i t t a u t u n e e t + o s o i t t a u t u n u t + o s o i t t a u t u n u t t a + o s o i t t a u t u u + o s o i t t a u t u v a t + o s o i t t a v a n + o s o i t t a v a t + o s o i t t e e n + o s o i t t e e n m u u n n o s + o s o i t t e e n m u u t o s t a + o s o i t t e i s i i n + o s o i t t e l e m a l l a + o s o i t t e l e m a t t a + o s o i t t e l e m m e + o s o i t t i + o s o i t t i v a t + o s o i t u k s e k s i + o s o i t u k s e l l a + o s o i t u k s e n + o s o i t u k s e n a + o s o i t u k s i s t a + o s o i t u s p e r i a a t e + o s o i t u s t a + o s t a a + o s t a a k o + o s t a a k s e e n + o s t a e s s a + o s t a e s s a a n + o s t a e s s a n i + o s t a i s i t t e k o + o s t a j a l l e + o s t a j a n + o s t a j a t + o s t a j a v a l t i o i d e n + o s t a j i e n + o s t a j i l l e + o s t a m a a n + o s t a m a n s a + o s t a m a t t a + o s t a m i s e e n + o s t a m i s e s s a + o s t a m i s e s t a + o s t a m m e + o s t a n e i d e n + o s t a v a t + o s t e o p o r o o s i s s a + o s t e o p o r o o s i s ä ä t i ö ö n + o s t e r i n k a s v a t t a j i e n + o s t e r i n v i l j e l i j ä t + o s t e r i v i l j e l i j ö i d e n + o s t e t a a n + o s t e t a a n k o + o s t e t t a e s s a + o s t e t t a v a + o s t e t t a v a a + o s t e t u i l l a + o s t o a l u e t t a + o s t o h e t k e l l ä + o s t o h e t k e n + o s t o h e t k e s t ä + o s t o h i n n a n + o s t o h i n n a s t a + o s t o h i n n a t + o s t o h i n t a a + o s t o h i n t a a n + o s t o h i n t o i h i n + o s t o h i n t o j a + o s t o h u u m a s s a + o s t o j a + o s t o j ä r j e s t e l m i e n + o s t o j ä r j e s t e l m ä s t ä + o s t o j ä s e n v a l t i o s s a + o s t o k o r t t e j a + o s t o k s i a + o s t o k s i l l a + o s t o k s i l l e + o s t o k s i s s a + o s t o k u p o n g e i s t a + o s t o k u s t a n n u s t e n + o s t o k ä y t t ä y t y m i s e e n + o s t o k ä y t t ä y t y m i s e n + o s t o k ä y t t ä y t y m i s e s s ä ä n + o s t o k ä y t ä n n ö i s s ä m m e + o s t o l u o t t o a + o s t o m a a s s a + o s t o m a a s t a + o s t o m a h d o l l i s u u d e t + o s t o m a h d o l l i s u u k s i a a n + o s t o m a r k k i n o i d e n + o s t o m a r k k i n o i t a + o s t o n e u v o t t e l u j a + o s t o n e u v o t t e l u j e n + o s t o p o k e r i + o s t o p o l i t i i k k a + o s t o p r o s e s s i + o s t o p u o l e l l a + o s t o p ä ä t ö k s e e n + o s t o p ä ä t ö k s e n + o s t o p ä ä t ö k s i i n + o s t o p ä ä t ö k s i l l ä ä n + o s t o p ä ä t ö k s i s s ä ä n + o s t o p ä ä t ö k s i ä + o s t o p ä ä t ö k s i ä ä n + o s t o r a j o j a + o s t o s k a d u i l l a + o s t o s k a d u l l a + o s t o s k a n a v a n a + o s t o s k e s k u k s i a + o s t o s k e s k u k s i k s i + o s t o s k e s k u k s i s s a + o s t o s k e s k u s a m m u s k e l u + o s t o s k e s k u s t e n + o s t o s k o r i a + o s t o s k o r i e n + o s t o s k o r i n + o s t o s k ä r r y j ä + o s t o s k ä r r y t + o s t o s k ä y t t ä y t y m i n e n + o s t o s k ä y t t ä y t y m i s t ä + o s t o s l i s t a a + o s t o s l i s t a a n + o s t o s l i s t a k s i + o s t o s l i s t a l t a + o s t o s l i s t a m e n t a l i t e e t i s t a + o s t o s l i s t a n + o s t o s l i s t a s s a + o s t o s l i s t a t + o s t o s l i s t o i l l a + o s t o s l i s t o i s t a + o s t o s l i s t o j a + o s t o s o p i m u k s e e n + o s t o s o p i m u k s e t + o s t o s p a l v e l u j a a n + o s t o s r e t k i ä + o s t o s s i v u s t o l l a + o s t o s t a r j o u k s i s t a + o s t o s t e n + o s t o t a r j o u k s e e n + o s t o t a r j o u k s e n + o s t o t a r j o u k s e s t a + o s t o t a r j o u k s i a + o s t o t a r j o u k s i e n + o s t o t a r j o u k s i i n + o s t o t a r j o u k s i l l e + o s t o t a r j o u k s i s t a + o s t o t a r j o u s + o s t o t a r j o u s d i r e k t i i v i s s ä + o s t o t a r j o u s d i r e k t i i v i s t ä + o s t o t a r j o u s d i r e k t i i v i ä + o s t o t a r j o u s p r o s e s s i s s a + o s t o t a r j o u s t a + o s t o t a r j o u s t e n + o s t o t a v a s t a + o s t o t a v a t + o s t o t i l a n t e i s s a + o s t o t o t t u m u k s i i n + o s t o v a i h t o e h t o a + o s t o v a l i n n a t + o s t o v a l t u u t u k s e n + o s t o v e r o t + o s t o v o i m a a + o s t o v o i m a a m m e + o s t o v o i m a a n + o s t o v o i m a a n s a + o s t o v o i m a k o r j a t t u + o s t o v o i m a k r i i s i + o s t o v o i m a k s i + o s t o v o i m a l l a + o s t o v o i m a l l e + o s t o v o i m a m m e + o s t o v o i m a n + o s t o v o i m a n s a + o s t o v o i m a p a r i t e e t i l l a + o s t o v o i m a p a r i t e e t i t + o s t o v o i m a p a r i t e e t t e i h i n + o s t o v o i m a p a r i t e e t t i + o s t o v o i m a p a r i t e e t t i i n + o s t o v o i m a s s a + o s t o v o i m a s t a + o s t o v o i m a s t a a n + o s t o v u o k r a u s s o p i m u k s e s t a + o s u e s s a a n + o s u i v a t + o s u n e e t + o s u n e i t a + o s u n u t + o s u u d e l l a + o s u u d e l l e + o s u u d e n + o s u u d e s t a + o s u u d e s t a m m e + o s u u d e t + o s u u k s i e n + o s u u k s i i n + o s u u k s i l l a + o s u u k s i s s a + o s u u k s i s t a + o s u u s k a l a s t a j a n + o s u u s k a l a s t a j a t + o s u u s k a l a s t a j i a + o s u u s k a l a s t a j i e n + o s u u s k a l a s t a j i s t a + o s u u s k a s s a t + o s u u s k a s s o i h i n + o s u u s k a s s o j a + o s u u s k a s s o j e n + o s u u s k u n n a l l a + o s u u s k u n n a n + o s u u s k u n n a t + o s u u s k u n n i l l e + o s u u s k u n n i s t a + o s u u s k u n t a a + o s u u s k u n t a h e n k i + o s u u s k u n t a j ä r j e s t ö t + o s u u s k u n t a l i i k e + o s u u s k u n t a p e r i a a t e + o s u u s k u n t a s e k t o r i n + o s u u s k u n t a t y ö s t ä + o s u u s k u n t i a + o s u u s k u n t i e n + o s u u s p a n k i t + o s u u s t o i m i n n a l l i s e t + o s u u s t o i m i n n a l l i s i a + o s u u s t o i m i n t a l i i k e t t ä + o s u u s t o i m i n t a l i i k k e e n + o s u u s t o i m i n t a s e k t o r i l t a + o s u u s t o i m i n t a y r i t y k s i i n + o s u u s v i l j e l y + o s u u s v i l j e l y ä + o s u u t e e n + o s u u t e m m e + o s u u t e n i + o s u u t e n n e + o s u u t e n s a + o s u u t t a + o s u u t t a a n + o s u v a a + o s u v a m m i n + o s u v a m p a a + o s u v a m p i + o s u v a m p i a + o s u v i a + o s u v i m m i l l a + o s u v i m m i n + o s u v i s t a + o s v i i t t a a + o t a k s u m m e + o t a k s u n k i n + o t a m m e + o t a m m e k o + o t a n n a l l a + o t a n t a j ä r j e s t e l m i i n + o t a n t a j ä r j e s t e l m ä n + o t a n t a m e n e t e l m i e n + o t a n t a m e n e t e l m i ä + o t a n t a m e n e t e l m ä n + o t a n t a p e r u s t e e l l a + o t a n t a t e k n i i k k a a + o t a s i l m ä r u o h o + o t a t a m m i + o t a t t e + o t a t t e h a n + o t a v a l v a t t i + o t e t a + o t e t a a n + o t e t a a n k i n + o t e t a a n k o + o t e t a a n p a + o t e t t a e s s a + o t e t t a i s i i n + o t e t t a v a + o t e t t a v a n a + o t e t t i i n + o t e t t u a a n + o t i m m e + o t i t t e + o t o k s e t + o t o k s i a + o t o l l i s e m p a a + o t o l l i s e m p a a n + o t o l l i s e m p i + o t o l l i s e n + o t o l l i s e s s a + o t o l l i s e t + o t o l l i s i a + o t o l l i s i m m i s s a + o t o l l i s i n + o t o l l i s t a + o t o s j ä r j e s t e l m ä s t ä + o t o s o h j e l m i a + o t s a a + o t s a k e t t a + o t s a k k e e l l a + o t s a k k e e l l e + o t s a k k e e n + o t s a k k e e s e e n + o t s a k k e e s s a + o t s a k k e e s t a + o t s a k k e e t + o t s a k k e i d e n + o t s a k k e i s i i n + o t s a k k e i s t a + o t s a k k e i t a + o t s a l e p i n k ä i n e n + o t s a l i h a s + o t s a l o h k o d e m e n t i a a + o t s a m e s i k k o + o t s a p ö l l ö n e n + o t s i k k o a + o t s i k k o k i n + o t s i k k o n a + o t s i k k o o n + o t s i k o i h i n + o t s i k o i s s a + o t s i k o i t a + o t s i k o i v a t + o t s i k o l l a + o t s i k o n + o t s i k o s s a + o t s i k o s t a + o t s i k o t + o t s o n i a + o t s o n i a r v o i s t a + o t s o n i a r v o j a + o t s o n i h u i p p u j e n + o t s o n i h u i p u i k s i + o t s o n i h u i p u k s i + o t s o n i i n + o t s o n i k a t o a + o t s o n i k e h ä n + o t s o n i k e r r o k s e l l e + o t s o n i k e r r o k s e n + o t s o n i k e r r o k s e s s a + o t s o n i k e r r o k s e s t a + o t s o n i k e r r o s t a + o t s o n i k e r t y m i l l e + o t s o n i k e s k i t t y m i e n + o t s o n i k e s k i t t y m i ä + o t s o n i k u o r m i e n + o t s o n i k u o r m i t u s + o t s o n i k y s y m y k s e n + o t s o n i l l e + o t s o n i m o l e k y y l e j ä + o t s o n i m o l e k y y l i e n + o t s o n i n + o t s o n i n o r m i n + o t s o n i o n g e l m a a + o t s o n i p i i k i t + o t s o n i p i t o i s u u d e n + o t s o n i p i t o i s u u d e t + o t s o n i p i t o i s u u k s i e n + o t s o n i p i t o i s u u k s i i n + o t s o n i p i t o i s u u k s i l l a + o t s o n i p i t o i s u u s + o t s o n i p o l i t i i k k a a + o t s o n i p o l i t i i k k a a n + o t s o n i p ä ä s t ö j ä + o t s o n i s t a + o t s o n i s t r a t e g i a a + o t s o n i s t r a t e g i a a n + o t s o n i s u m u + o t s o n i s u m u a + o t s o n i t a s o + o t s o n i t a s o a + o t s o n i t a s o i h i n + o t s o n i t a s o i l l e + o t s o n i t a s o i s t a + o t s o n i t a s o j a + o t s o n i t a s o j e n + o t s o n i t a s o t + o t s o n i t e r a p i a + o t t a a + o t t a a k o + o t t a a k s e e n + o t t a a k s e n i + o t t a e n + o t t a e s s a + o t t a e s s a a n + o t t a i s i + o t t a i s i m m e + o t t a i s i n + o t t a j i e n + o t t a j i l l e + o t t a k a a + o t t a k a a m m e + o t t a m a a n + o t t a m a l l a + o t t a m a s s a + o t t a m a t t a + o t t a m i s e e n + o t t a m i s t a + o t t a n e e t + o t t a n u t + o t t a v a n + o t t a v a t + o t t a v a t k o + o t t a v i s t a + o t t a w a n + o t t a w a s s a + o t t e e l l a + o t t e e n + o t t e e n s a + o t t e e s s a a n + o t t e i d e n + o t t e i n + o t t e i t a + o t t e l u i s s a + o t t e l u i t a + o t t e l u n + o t t e l u s s a + o t t i v a t + o t t o m a a n i e n + o t t o m a a n i k a u d e l l e + o t t o m o o t t o r e i d e n + o t t o m o o t t o r i + o t t o m o o t t o r i l l a + o u d o k s u t t a v a m p a a + o u d o l t a + o u d o m p a a + o u d o m p i + o u d o s t a + o u t o a + o u t o j a + o u t o n a + o u t o o n + o v a t k i n + o v a t k o + o v e l a a + o v e l a m p a a n + o v e l l a + o v e l l a a n + o v e l l a m m e + o v e l u u t t a + o v e n a v a u k s e n + o v e n k a r m i t + o v e n s a + o v e n s u u k e r ä i l y ä + o v e n s u u k y s e l y + o v e n s u u k y s e l y i t ä + o v e n s u u k y s e l y j e n + o v e n s u u k y s e l y t + o v e s t a + o v i a a n + o v i e n + o v i k y s e l y t + o v i l l e + o v i s t a + o v u l a a t i o m i t t a r i t + p a a h d e t t u a + p a a k k u u n t u m i s e n e s t o a i n e + p a a l u p a i k k a + p a a l u p a i k k a n s a + p a a r e i l l e + p a a r i a k o i r a + p a a r i a v a l t i o + p a a r i a v a l t i o i d e n + p a a r m a t + p a a s a t a + p a a s i a + p a a s i l i n n a + p a a s i l i n n a a + p a a s i l i n n a a n + p a a s i l i n n a l l e + p a a s i l i n n a n + p a a s i o t a + p a a s t o p ä i v ä n + p a a s t o r u k o u s + p a a t e i l t a + p a a t s a m a s i n i s i i p i + p a a v i a + p a a v i k s i + p a a v i n + p a a v i n i s t u i m e l l e + p a a v i n i s t u i m e n + p a d o n + p a d o n r a k e n n u s h a n k k e i l l e + p a e n n e e t + p a e n n e i l l e + p a e n n e i t a + p a e n n u t + p a e t a + p a e t a k s e e n + p a e t k a a m m e + p a e t t a v a + p a h a a + p a h a a k i n + p a h a e n t e i s e n + p a h a k s i + p a h a l l a + p a h a l t a + p a h a m a i n e i s e s t a + p a h a m a i n e i s i m m i s t a + p a h a m a i n e i s t a + p a h a n + p a h a n a + p a h a n i l k i s e m p ä ä + p a h a n i l k i s y y d e s t ä + p a h a n l a a t u i s e t + p a h a n n ä k ö i s t ä + p a h a n s u o p a a + p a h a n s u o p u u d e l t a + p a h a n s u o p u u d e s t a + p a h a n t a h t o i s e n + p a h a n t a h t o i s i a + p a h a n t a h t o i s i i n + p a h a n t a h t o i s i l l e + p a h a n t a h t o i s i n t a + p a h a n t a h t o i s u u d e s t a + p a h a n t a h t o i s u u s + p a h a n t e k i j ä t + p a h a n t e k i j ö i h i n + p a h a n t e k i j ö i n ä + p a h a n t e k i j ö i t ä + p a h a n t e o s t a a n + p a h a p u t k e t + p a h a s s a + p a h a s t a + p a h a s t u v a n + p a h a t + p a h e k s u a + p a h e k s u i + p a h e k s u i m m e + p a h e k s u n + p a h e k s u n t a m m e + p a h e k s u n t a n i + p a h e k s u t a a n + p a h e k s u t t a v a a + p a h e m m a k s i + p a h e m m a l t a + p a h e m m a s t a + p a h e m p a a + p a h e m p i a + p a h e m p i k i n + p a h e n e e + p a h e n e m a a n + p a h e n e m a s s a + p a h e n e m i s e n + p a h e n e m i s t a + p a h e n e v a a n + p a h e n e v a n + p a h e n e v a s s a + p a h e n e v a s t a + p a h e n e v a t + p a h e n i + p a h e n n a m m e + p a h e n n e t a a n + p a h e n s i + p a h e n t a a + p a h e n t a a k o + p a h e n t a a k s e e n + p a h e n t a m a t t a + p a h e n t a n e e t + p a h e n t a n u t + p a h e n t a v a t + p a h e n t u a + p a h e n t u e s s a + p a h e n t u i + p a h e n t u m a a n + p a h e n t u m a s s a + p a h e n t u m a s t a + p a h e n t u n e e n + p a h e n t u n e e t + p a h e n t u n u t + p a h e n t u v a t + p a h i m m a n + p a h i m m a n k i n + p a h i m m a s s a + p a h i m m a t + p a h i m m i l l a a n + p a h i m m i l l e + p a h i m m i s s a + p a h i m m i s t a + p a h i m p a a n + p a h i m p a n a + p a h i m p i a + p a h i m p i e n + p a h i m p i i n + p a h i n + p a h i n t a + p a h k a k i r j o a h v e n + p a h o i h i n + p a h o i l l a a n + p a h o i l l a m m e + p a h o i l l a n i + p a h o i n p i d e l l ä ä n + p a h o i n p i d e l t i i n + p a h o i n p i t e l e v ä t + p a h o i n p i t e l y + p a h o i n p i t e l y i s t ä + p a h o i n p i t e l y j e n + p a h o i n p i t e l y j ä + p a h o i n p i t e l y l l e + p a h o i n p i t e l y n + p a h o i n p i t e l y n s ä + p a h o i n p i t e l y s t ä + p a h o i n p i t e l y t + p a h o i n p i t e l y t a p a u s t e n + p a h o i n p i t e l y y n + p a h o i n p i t e l y ä + p a h o i n v o i n t i a + p a h o i s t a + p a h o i t e l l a + p a h o i t e l l a a n + p a h o i t e l l e e t + p a h o i t e l l u t + p a h o i t e l t a v a + p a h o i t e l t i i n + p a h o i t t e l e e + p a h o i t t e l e m a a n + p a h o i t t e l e m i s t a + p a h o i t t e l e m m e + p a h o i t t e l e m m e k i n + p a h o i t t e l e n + p a h o i t t e l e n k i n + p a h o i t t e l e v a t + p a h o i t t e l e v i n a a n + p a h o i t t e l i + p a h o i t t e l i n + p a h o i t t e l i t t e + p a h o i t t e l i v a t + p a h o i t t e l u i h i n + p a h o i t t e l u j e n + p a h o i t t e l u m m e + p a h o i t t e l u n + p a h o i t t e l u n i + p a h o i t t e l u n s a + p a h o i t t e l u t + p a h o i t t e l u u n + p a h o j a + p a h o j e n + p a h o l a i s e l l a + p a h o l a i s e n + p a h o l a i s e t + p a h o l a i s r a u s k u + p a h t a m a a t y r a n n i + p a h t a n u r m i k k a + p a h t a o m e n a s a m m a l + p a h t a r i k k o + p a h u u t t a + p a h u u t t a a n + p a h v i l a a t i k k o + p a h v i l a a t i k o i d e n + p a h v i l a a t i k o i s s a + p a h v i l a a t i k o i t a + p a h v i l a a t i k o t + p a h v i s t a + p a i k a k s i + p a i k a l l a a n + p a i k a l l a a n o l o a + p a i k a l l a n i + p a i k a l l a n n e + p a i k a l l e e n + p a i k a l l e n n e + p a i k a l l i s a i k a + p a i k a l l i s a l u e e l l e e n + p a i k a l l i s a l u e e l t a + p a i k a l l i s a l u e e n i + p a i k a l l i s a l u e i d e n + p a i k a l l i s a l u e i l l e + p a i k a l l i s d e m o k r a t i a a n + p a i k a l l i s d e m o k r a t i a n + p a i k a l l i s d i k t a a t t o r i t + p a i k a l l i s e d u s t a j a t + p a i k a l l i s e d u s t a j i a + p a i k a l l i s e d u s t a j i e n + p a i k a l l i s e e n + p a i k a l l i s e h d o k k a i d e n + p a i k a l l i s e l i m i i n + p a i k a l l i s e l i m i ä + p a i k a l l i s e l i n t e n + p a i k a l l i s e l l a + p a i k a l l i s e m p i + p a i k a l l i s e m p i a + p a i k a l l i s e n + p a i k a l l i s e s s a + p a i k a l l i s e s t a + p a i k a l l i s e s t i k i n + p a i k a l l i s e t + p a i k a l l i s h a l l i n n o i l l a + p a i k a l l i s h a l l i n n o i l l e + p a i k a l l i s h a l l i n n o i s s a + p a i k a l l i s h a l l i n n o l l a + p a i k a l l i s h a l l i n n o l l e + p a i k a l l i s h a l l i n n o l l i s i a + p a i k a l l i s h a l l i n n o l l i s i l l a + p a i k a l l i s h a l l i n n o n + p a i k a l l i s h a l l i n n o s s a + p a i k a l l i s h a l l i n n o s t a + p a i k a l l i s h a l l i n n o t + p a i k a l l i s h a l l i n t o + p a i k a l l i s h a l l i n t o a + p a i k a l l i s h a l l i n t o a m m e + p a i k a l l i s h a l l i n t o j a + p a i k a l l i s h a l l i n t o j e n + p a i k a l l i s h a l l i n t o j ä r j e s t e l m ä + p a i k a l l i s h a l l i n t o j ä r j e s t e l m ä n + p a i k a l l i s h a l l i n t o j ä r j e s t e l m ä s s ä m m e + p a i k a l l i s h a l l i n t o j ä r j e s t e l m ä ä n + p a i k a l l i s h a l l i n t o k o n f e r e n s s i i n + p a i k a l l i s h a l l i n t o m m e + p a i k a l l i s h a l l i n t o n s a + p a i k a l l i s h a l l i n t o o n + p a i k a l l i s h a l l i n t o o n s a + p a i k a l l i s h a l l i n t o t a s o n + p a i k a l l i s h a l l i t u s + p a i k a l l i s h a l l i t u s t e n + p a i k a l l i s h a n k k e i t a + p a i k a l l i s h i s t o r i a a + p a i k a l l i s i a + p a i k a l l i s i i n + p a i k a l l i s i l l a + p a i k a l l i s i l l e + p a i k a l l i s i l t a + p a i k a l l i s i n f r a s t r u k t u u r e i h i n + p a i k a l l i s i n f r a s t r u k t u u r i + p a i k a l l i s i n f r a s t r u k t u u r i n + p a i k a l l i s i s s a + p a i k a l l i s i s t a + p a i k a l l i s j o h t a j a n + p a i k a l l i s j o h t a j i e n + p a i k a l l i s j u n a + p a i k a l l i s j u n a n + p a i k a l l i s j u n i e n + p a i k a l l i s j ä r j e s t ö + p a i k a l l i s j ä r j e s t ö j e n + p a i k a l l i s j ä r j e s t ö j ä + p a i k a l l i s j ä r j e s t ö t + p a i k a l l i s k a n a v a t + p a i k a l l i s k e h i t y k s e l l e + p a i k a l l i s k e h i t y k s e n + p a i k a l l i s k e h i t y k s e s t ä + p a i k a l l i s k e h i t y s h a n k k e i t a + p a i k a l l i s k i e l i s t ä + p a i k a l l i s k o k o u s + p a i k a l l i s k u l t t u u r i a + p a i k a l l i s k u l t t u u r i e n + p a i k a l l i s k u l t t u u r i n + p a i k a l l i s k u s t a n n u s t e n + p a i k a l l i s l a i n s ä ä d ä n n ö n + p a i k a l l i s l e h d e s t ä m m e + p a i k a l l i s l e h d e t + p a i k a l l i s l e h d i l l ä + p a i k a l l i s l e h d i s s ä + p a i k a l l i s l e h d i s t ö + p a i k a l l i s l e h d i s t ö ä + p a i k a l l i s l e h t e e n + p a i k a l l i s l i i k e n n e + p a i k a l l i s l i i k e n n e t t ä + p a i k a l l i s l i i k e n t e e l l e + p a i k a l l i s l i i k e n t e e n + p a i k a l l i s l i i k e n t e e s e e n + p a i k a l l i s l i i k e n t e e s s ä m m e + p a i k a l l i s l i i k e n t e e s t ä + p a i k a l l i s l u o n t e i s t a + p a i k a l l i s l ä h t ö i s t ä + p a i k a l l i s m a r k k i n a t + p a i k a l l i s m a r k k i n o i d e n + p a i k a l l i s m a r k k i n o i h i n + p a i k a l l i s m a r k k i n o i l l a + p a i k a l l i s m a r k k i n o i l l e + p a i k a l l i s m a r k k i n o i t a + p a i k a l l i s m e d i a + p a i k a l l i s m e d i a n + p a i k a l l i s m e d i o i d e n + p a i k a l l i s m e d i o i t a + p a i k a l l i s m i n i s t e r i n + p a i k a l l i s n e u v o s t o + p a i k a l l i s n e u v o s t o j e n + p a i k a l l i s n e u v o s t o p a i k k a a + p a i k a l l i s n ä k ö k u l m a s t a + p a i k a l l i s o l o j e n s a + p a i k a l l i s o l o s u h t e e t + p a i k a l l i s o r g a n i s a a t i o i d e n + p a i k a l l i s o r g a n i s a a t i o i h i n + p a i k a l l i s p a n k e i l l e + p a i k a l l i s p a n k i l l e + p a i k a l l i s p o l i i t i k k o + p a i k a l l i s p o l i i t i k k o j e n + p a i k a l l i s p o l i i t i k o i s t a + p a i k a l l i s p o l i i t i k o t + p a i k a l l i s p o l i t i i k a n + p a i k a l l i s p o l i t i i k a s t a + p a i k a l l i s p o l i t i i k k a + p a i k a l l i s p o l i t i i k k a a n + p a i k a l l i s p u b i i n i + p a i k a l l i s p u h e l u i d e n + p a i k a l l i s p u h e l u j e n + p a i k a l l i s r a d i o i d e n + p a i k a l l i s r a d i o s t a + p a i k a l l i s r a v i n t o l a n + p a i k a l l i s r y h m i ä + p a i k a l l i s s a i r a a l a n + p a i k a l l i s t a h o j a + p a i k a l l i s t a l o u d e l l e + p a i k a l l i s t a l o u d e n + p a i k a l l i s t a l o u d e s s a + p a i k a l l i s t a l o u d e t + p a i k a l l i s t a l o u k s i a + p a i k a l l i s t a l o u k s i e n + p a i k a l l i s t a l o u k s i i n + p a i k a l l i s t a l o u k s i l l e + p a i k a l l i s t a l o u s + p a i k a l l i s t a l o u t e e m m e + p a i k a l l i s t a l o u t e e n + p a i k a l l i s t a l o u t t a + p a i k a l l i s t a l o u t t a a n + p a i k a l l i s t a m i s e s t a + p a i k a l l i s t a p o j e n + p a i k a l l i s t a r i f f i r a k e n t e i t a + p a i k a l l i s t a s o a + p a i k a l l i s t a s o j e n + p a i k a l l i s t a s o l l a + p a i k a l l i s t a s o l l e + p a i k a l l i s t a s o l t a + p a i k a l l i s t a s o n + p a i k a l l i s t a s o o n + p a i k a l l i s t e i d e n + p a i k a l l i s t e i l l e + p a i k a l l i s t e l e v i s i o n + p a i k a l l i s t e l e v i s i o s s a + p a i k a l l i s t e n + p a i k a l l i s t e o l l i s u u d e s t a + p a i k a l l i s t i e d o n + p a i k a l l i s t i e t ä m y s t ä + p a i k a l l i s t o i m i j o i d e n + p a i k a l l i s t o i m i s t o j a + p a i k a l l i s t o i m i s t o j e n + p a i k a l l i s t o i m i s t o n s a + p a i k a l l i s t u n t e m u s + p a i k a l l i s t u n t e m u s t a + p a i k a l l i s t u n t e m u s t a a n + p a i k a l l i s t u o t a n n o n + p a i k a l l i s t u o t a n t o a + p a i k a l l i s t u o t a n t o o n + p a i k a l l i s t u o t t a j i i n + p a i k a l l i s u l o t t u v u u d e n + p a i k a l l i s u l o t t u v u u t t a + p a i k a l l i s v a a l e i h i n + p a i k a l l i s v a a l e i l l e + p a i k a l l i s v a a l e i s s a + p a i k a l l i s v a a l e i s t a + p a i k a l l i s v a a l e j a + p a i k a l l i s v a a l i e n + p a i k a l l i s v a a l i k a m p a n j a n + p a i k a l l i s v a a l i t + p a i k a l l i s v a l t u u s t o i l l e + p a i k a l l i s v a l t u u s t o i s s a + p a i k a l l i s v a l t u u s t o j e n + p a i k a l l i s v a l t u u s t o t + p a i k a l l i s v a l t u u t e t u i l t a + p a i k a l l i s v e r k k o j e n + p a i k a l l i s v i r a n o m a i n e n + p a i k a l l i s v i r a n o m a i s a l u e e l l a m m e + p a i k a l l i s v i r a n o m a i s e m m e + p a i k a l l i s v i r a n o m a i s e n + p a i k a l l i s v i r a n o m a i s e n a + p a i k a l l i s v i r a n o m a i s e t + p a i k a l l i s v i r a n o m a i s i a + p a i k a l l i s v i r a n o m a i s i i m m e + p a i k a l l i s v i r a n o m a i s i i n + p a i k a l l i s v i r a n o m a i s i k s i + p a i k a l l i s v i r a n o m a i s i l l a + p a i k a l l i s v i r a n o m a i s i l l e + p a i k a l l i s v i r a n o m a i s i l t a + p a i k a l l i s v i r a n o m a i s i l t a a n + p a i k a l l i s v i r a n o m a i s i n a + p a i k a l l i s v i r a n o m a i s i s s a + p a i k a l l i s v i r a n o m a i s i s t a + p a i k a l l i s v i r a n o m a i s t a + p a i k a l l i s v i r a n o m a i s t e m m e + p a i k a l l i s v i r a n o m a i s t e n + p a i k a l l i s v i r a s t o j e n + p a i k a l l i s v i r k a i l i j a t + p a i k a l l i s v i r k a m i e h e t + p a i k a l l i s v ä e s t ö + p a i k a l l i s v ä e s t ö i h i n + p a i k a l l i s v ä e s t ö i l l e + p a i k a l l i s v ä e s t ö j e n + p a i k a l l i s v ä e s t ö j ä + p a i k a l l i s v ä e s t ö l l e + p a i k a l l i s v ä e s t ö l l ä + p a i k a l l i s v ä e s t ö l t ä + p a i k a l l i s v ä e s t ö n + p a i k a l l i s v ä e s t ö n ä + p a i k a l l i s v ä e s t ö ä + p a i k a l l i s v ä e s t ö ö n + p a i k a l l i s v ä r i n + p a i k a l l i s y h d i s t y s t e n + p a i k a l l i s y h t e i s ö + p a i k a l l i s y h t e i s ö i h i n + p a i k a l l i s y h t e i s ö i h i n s ä + p a i k a l l i s y h t e i s ö i k s i + p a i k a l l i s y h t e i s ö i l l e + p a i k a l l i s y h t e i s ö i l l e m m e + p a i k a l l i s y h t e i s ö i l l ä + p a i k a l l i s y h t e i s ö i l t ä + p a i k a l l i s y h t e i s ö i s s ä + p a i k a l l i s y h t e i s ö i s s ä n n e + p a i k a l l i s y h t e i s ö i s t ä + p a i k a l l i s y h t e i s ö j e n + p a i k a l l i s y h t e i s ö j ä + p a i k a l l i s y h t e i s ö j ä r j e s t ö j e n + p a i k a l l i s y h t e i s ö j ä ä n + p a i k a l l i s y h t e i s ö l l e + p a i k a l l i s y h t e i s ö l ä h t ö i s i ä + p a i k a l l i s y h t e i s ö m m e + p a i k a l l i s y h t e i s ö n + p a i k a l l i s y h t e i s ö n s ä + p a i k a l l i s y h t e i s ö s s ä + p a i k a l l i s y h t e i s ö t + p a i k a l l i s y h t e i s ö t k i n + p a i k a l l i s y h t e i s ö ö n + p a i k a l l i s y m p ä r i s t ö i h i n + p a i k a l l i s y m p ä r i s t ö n + p a i k a l l i s y m p ä r i s t ö s s ä ä n + p a i k a l l i s y r i t y k s e t + p a i k a l t a n i + p a i k a n + p a i k a n n i m i a s i a n t u n t i j o i d e n + p a i k a n n i m i e n + p a i k a n n i m i k y l t t e j ä + p a i k a n n i m i s s ä + p a i k a n n i m i ä + p a i k a n n u s j ä r j e s t e l m ä n + p a i k a n n u s j ä r j e s t e l m ä ä + p a i k a n n u s l a i t e + p a i k a n n u s l a i t t e e n + p a i k a n n u s p a l v e l u j a + p a i k a n n u s s o v e l l u k s i s s a + p a i k a n n u s t e k n i i k a n + p a i k a n t a m i s j ä r j e s t e l m ä + p a i k a n t a m i s j ä r j e s t e l m ä n + p a i k a n v a r a u s j ä r j e s t e l m i e n + p a i k a n v a r a u s j ä r j e s t e l m i i n + p a i k a n v a r a u s j ä r j e s t e l m i s s ä + p a i k a n v a r a u s j ä r j e s t e l m i s t ä + p a i k a n v a r a u s j ä r j e s t e l m i ä + p a i k a n v a r a u s j ä r j e s t e l m ä l l ä + p a i k a n v a r a u s j ä r j e s t e l m ä s s ä + p a i k a n v a r a u s j ä r j e s t e l m ä t + p a i k a s s a + p a i k a s t a + p a i k a t + p a i k a t a + p a i k a t t a v a + p a i k k a a m i s e e n + p a i k k a a n + p a i k k a a n s a + p a i k k a j a k o + p a i k k a j a k o a + p a i k k a j a k o j ä r j e s t e l m ä ä n n e + p a i k k a j a k o o n + p a i k k a j a o n + p a i k k a j a o s t a + p a i k k a k u n n a l l a + p a i k k a k u n n a l l a a n + p a i k k a k u n n a n + p a i k k a k u n n i l l a + p a i k k a k u n n i l l e + p a i k k a k u n t a e d u i s t a + p a i k k a k u n t i a + p a i k k a l u k u a + p a i k k a m e n e t e l m ä + p a i k k a m ä ä r ä + p a i k k a m ä ä r ä n + p a i k k a m ä ä r ä ä + p a i k k a n s a + p a i k k a n s a p i t ä v y y s + p a i k k a n s a p i t ä v ä ä + p a i k k a n u m e r o n + p a i k k a o n g e l m a + p a i k k a s i d o n n a i n e n + p a i k k a t i e d o i s t a + p a i k k a t i e d o t + p a i k k a t i e t o + p a i k k a t i e t o a + p a i k k a t i e t o a i n e i s t o j e n + p a i k k a t i e t o i h i n + p a i k k a t i e t o i n f r a s t r u k t u u r e i h i n + p a i k k a t i e t o i n f r a s t r u k t u u r i + p a i k k a t i e t o i n f r a s t r u k t u u r i e n + p a i k k a t i e t o i n f r a s t r u k t u u r i n + p a i k k a t i e t o i n f r a s t r u k t u u r i t + p a i k k a t i e t o j a + p a i k k a t i e t o j e n + p a i k k a t i e t o j ä r j e s t e l m i e n + p a i k k a t i e t o j ä r j e s t e l m ä + p a i k k a t i e t o j ä r j e s t e l m ä ä n + p a i k k a t i e t o v i i t t e i s t ä + p a i k k a u s i s t u t u s o i k e u d e t + p a i k k a u s i s t u t u s t e n + p a i k k o j a + p a i k o i l l a + p a i k o i l l a a n + p a i k o i l l e e n + p a i k o i l l e m m e + p a i k o i l t a + p a i k o i s s a + p a i m e n k o i r a + p a i m e n m a t a r a + p a i m e n r u o h o k a i j a + p a i m e n t o l a i s e t + p a i m e n t o l a i s i n a + p a i m e n t o l a i s k u l t t u u r e i t a + p a i m e n t o l a i s p e r i n t e i s t ä ä n + p a i m e n t o l a i s t e n + p a i m e n t o l a i s v ä e s t ö ö n + p a i n a a + p a i n a j a i s e e n + p a i n a j a i s e s t a + p a i n a j a i s i k s i + p a i n a j a i s k u j a + p a i n a j a i s ö i t ä + p a i n a l l u k s e l l a + p a i n a m a l l a + p a i n a t t a v a t + p a i n a t u s k u s t a n n u k s i a + p a i n a t u s s o p i m u s t e n + p a i n a v a m m a n + p a i n a v a m p a a n + p a i n a v a m p i + p a i n a v a t + p a i n a v i a + p a i n a v i n + p a i n e a a l t o a h d i n + p a i n e a r v o t + p a i n e a s t i a + p a i n e a s t i a t + p a i n e a s t i o i s t a + p a i n e e l l a + p a i n e e n + p a i n e e n s i e t o k y k y + p a i n e e s e e n + p a i n e e s s a + p a i n e e s t a + p a i n e e t + p a i n e i d e n + p a i n e i l m a + p a i n e i l m a j a r r u + p a i n e i l m a s y l i n t e r i + p a i n e i s i i n + p a i n e i s s a + p a i n e i t a + p a i n e k a m m i o + p a i n e k a t t i l a + p a i n e k e i t i n + p a i n e l a i t t e e t + p a i n e l a i t t e i d e n + p a i n e l a i t t e i s t a + p a i n e l a i t t e i t a + p a i n e m i t t a r i t + p a i n e p e s u r i + p a i n e p u t k e t + p a i n e t a + p a i n e t a a n + p a i n e t t a + p a i n e t t a v a k s i + p a i n e t t a v a n a + p a i n e t t u a + p a i n e t t u j a + p a i n e t t u j e n + p a i n e t u s t a + p a i n e t u t + p a i n e v e s i r e a k t o r e i t a + p a i n e v e s i r e a k t o r i + p a i n e v e s i r e a k t o r i t + p a i n i k e t t a + p a i n i m m e + p a i n i o t t e l u a + p a i n i v a t + p a i n o a + p a i n o a r v o + p a i n o a r v o a + p a i n o a r v o a a n + p a i n o a r v o a m m e + p a i n o a r v o n + p a i n o a r v o n s a + p a i n o a r v o s t a + p a i n o h a r j o i t t e l u + p a i n o i n d e k s i + p a i n o i s i i n + p a i n o k a s t a + p a i n o k i l o a + p a i n o k i r j a i m e t + p a i n o k k a a m m i n + p a i n o k k a a m p i + p a i n o k k a a m p i a + p a i n o k k a i m m i n + p a i n o k o n e + p a i n o k o n e e n + p a i n o k o n e i t a + p a i n o k o n e t t a + p a i n o k y t k i n + p a i n o l a a t t a + p a i n o l a i t o s + p a i n o l a s t i a + p a i n o l a s t i n + p a i n o l a s t i n a + p a i n o l a s t i s t a m m e + p a i n o l a s t i s ä i l i ö i t ä ä n + p a i n o l a s t i s ä i l i ö t ä + p a i n o l a s t i v e s i e n + p a i n o l l a + p a i n o l l a a n + p a i n o l u o k a n + p a i n o l u o k i s t a + p a i n o m e d i a s s a + p a i n o n + p a i n o n h e i t t o + p a i n o n n o s t o + p a i n o n v a r t i j a t + p a i n o p i s t e + p a i n o p i s t e a i h e e k s i + p a i n o p i s t e a i h e e t + p a i n o p i s t e a i h e t t a + p a i n o p i s t e a l a + p a i n o p i s t e a l a a + p a i n o p i s t e a l a a n + p a i n o p i s t e a l a k s e e n + p a i n o p i s t e a l a k s e m m e + p a i n o p i s t e a l a k s i + p a i n o p i s t e a l a l l a + p a i n o p i s t e a l a l l e + p a i n o p i s t e a l a m m e + p a i n o p i s t e a l a n + p a i n o p i s t e a l a n a + p a i n o p i s t e a l a n i + p a i n o p i s t e a l a s t a + p a i n o p i s t e a l a t + p a i n o p i s t e a l o i h i n + p a i n o p i s t e a l o i h i n s a + p a i n o p i s t e a l o i k s i + p a i n o p i s t e a l o i l l a + p a i n o p i s t e a l o i l l e + p a i n o p i s t e a l o i n a + p a i n o p i s t e a l o i s t a + p a i n o p i s t e a l o i s t a a n + p a i n o p i s t e a l o j a + p a i n o p i s t e a l o j a a n + p a i n o p i s t e a l o j a m m e + p a i n o p i s t e a l o j e n + p a i n o p i s t e a l u e + p a i n o p i s t e a l u e e k s e e n + p a i n o p i s t e a l u e e k s i + p a i n o p i s t e a l u e e m m e + p a i n o p i s t e a l u e e n + p a i n o p i s t e a l u e e n a + p a i n o p i s t e a l u e e n a a n + p a i n o p i s t e a l u e e n s a + p a i n o p i s t e a l u e e s e e n + p a i n o p i s t e a l u e e s t a + p a i n o p i s t e a l u e e t + p a i n o p i s t e a l u e i d e n + p a i n o p i s t e a l u e i k s i + p a i n o p i s t e a l u e i l l a + p a i n o p i s t e a l u e i l l e + p a i n o p i s t e a l u e i n a + p a i n o p i s t e a l u e i s i i n + p a i n o p i s t e a l u e i s i i n n e + p a i n o p i s t e a l u e i s t a + p a i n o p i s t e a l u e i s t a a n + p a i n o p i s t e a l u e i s t a m m e + p a i n o p i s t e a l u e i s t a n n e + p a i n o p i s t e a l u e i t a + p a i n o p i s t e a l u e i t a a n + p a i n o p i s t e a l u e t t a + p a i n o p i s t e a s e m a s s a + p a i n o p i s t e a s i a s t a + p a i n o p i s t e e k s i + p a i n o p i s t e e m m e + p a i n o p i s t e e n + p a i n o p i s t e e n s ä + p a i n o p i s t e e n ä + p a i n o p i s t e e n ä m m e + p a i n o p i s t e e n ä ä n + p a i n o p i s t e e s e e n + p a i n o p i s t e e s s ä + p a i n o p i s t e e s t ä + p a i n o p i s t e e t + p a i n o p i s t e h a n k k e e s e e n + p a i n o p i s t e h a n k k e i t a + p a i n o p i s t e i d e m m e + p a i n o p i s t e i d e n + p a i n o p i s t e i l t ä ä n + p a i n o p i s t e i s i i n + p a i n o p i s t e i s i i n s ä + p a i n o p i s t e i s t ä + p a i n o p i s t e i s t ä m m e + p a i n o p i s t e i s t ä ä n + p a i n o p i s t e i t ä + p a i n o p i s t e i t ä ä n + p a i n o p i s t e k y s y m y k s i ä + p a i n o p i s t e l i n j a u k s e t + p a i n o p i s t e l u e t t e l o a + p a i n o p i s t e l u e t t e l o i s s a + p a i n o p i s t e l u e t t e l o s s a + p a i n o p i s t e o h j e l m a a n + p a i n o p i s t e o h j e l m i a + p a i n o p i s t e o h j e l m i s t a + p a i n o p i s t e p o l i t i i k k o j e n + p a i n o p i s t e r y h m ä t + p a i n o p i s t e t e e m o j a + p a i n o p i s t e t t ä + p a i n o p i s t e t t ä ä n + p a i n o p i s t e v a l t i o k s i + p a i n o p r o s e n t t e i n a + p a i n o r a j a + p a i n o r a j a a + p a i n o r a j a k s i + p a i n o r a j a n + p a i n o r a j o i s t a + p a i n o r a j o i t u s + p a i n o r a j o j a + p a i n o r a j o j e n + p a i n o s o r v a u s + p a i n o s t a a + p a i n o s t a a k s e e n + p a i n o s t a a k s e m m e + p a i n o s t a a k s e n n e + p a i n o s t a e s s a + p a i n o s t a e s s a a n + p a i n o s t a i s i + p a i n o s t a i s i v a t + p a i n o s t a j i e n + p a i n o s t a k a a + p a i n o s t a k a a m m e + p a i n o s t a m a a n + p a i n o s t a m a l l a + p a i n o s t a m a n a + p a i n o s t a m a s t a + p a i n o s t a m a t t a + p a i n o s t a m i s e e n + p a i n o s t a m i s e k s i + p a i n o s t a m i s e s t a + p a i n o s t a m i s p r o s e s s i n + p a i n o s t a m i s t a + p a i n o s t a m m e + p a i n o s t a n e e t + p a i n o s t a n u t + p a i n o s t a v a m m a k s i + p a i n o s t a v a n + p a i n o s t a v a t + p a i n o s t a v i m m i s s a + p a i n o s t e t a + p a i n o s t e t a a n + p a i n o s t e t t a i s i i n + p a i n o s t e t t a v a + p a i n o s t e t t i i n + p a i n o s t e t t u + p a i n o s t i + p a i n o s t i m m e + p a i n o s t i m m e k i n + p a i n o s t i v a t + p a i n o s t u k s e e n + p a i n o s t u k s e l l a + p a i n o s t u k s e l l a a n + p a i n o s t u k s e l l a n i + p a i n o s t u k s e l l e + p a i n o s t u k s e l t a + p a i n o s t u k s e m m e + p a i n o s t u k s e n + p a i n o s t u k s e s s a + p a i n o s t u k s e s t a + p a i n o s t u s a a l l o s t a + p a i n o s t u s k a m p a n j a a + p a i n o s t u s k a m p a n j a l l a + p a i n o s t u s k a m p a n j a s s a + p a i n o s t u s k a m p a n j o i d e n + p a i n o s t u s k e i n o + p a i n o s t u s k e i n o a + p a i n o s t u s k e i n o i k s i + p a i n o s t u s k e i n o i l l a + p a i n o s t u s k e i n o i n + p a i n o s t u s k e i n o i n a + p a i n o s t u s k e i n o i s t a + p a i n o s t u s k e i n o j a + p a i n o s t u s k e i n o k s i + p a i n o s t u s k e i n o m m e + p a i n o s t u s k e i n o n a + p a i n o s t u s k e i n o o n + p a i n o s t u s k e i n o s t a + p a i n o s t u s k e i n o t + p a i n o s t u s k y k y m m e + p a i n o s t u s m e k a n i s m i t + p a i n o s t u s p o l i t i i k k a a + p a i n o s t u s p o l i t i i k k a a n + p a i n o s t u s p r o s e s s i + p a i n o s t u s r y h m i e n + p a i n o s t u s r y h m i i n + p a i n o s t u s r y h m i l l e + p a i n o s t u s r y h m i l t ä + p a i n o s t u s r y h m i n ä + p a i n o s t u s r y h m i s t ä + p a i n o s t u s r y h m i ä + p a i n o s t u s r y h m ä + p a i n o s t u s r y h m ä l l e + p a i n o s t u s r y h m ä n + p a i n o s t u s r y h m ä n ä + p a i n o s t u s r y h m ä t + p a i n o s t u s r y h m ä ä + p a i n o s t u s t a + p a i n o s t u s t a k t i i k k a + p a i n o s t u s t a k t i i k k o j a + p a i n o s t u s t e k i j ä + p a i n o s t u s t i l a n n e + p a i n o s t u s t o i m e n p i t e e t + p a i n o s t u s t o i m e n p i t e i s i i n + p a i n o s t u s t o i m e n p i t e i t ä + p a i n o s t u s t o i m e t + p a i n o s t u s t o i m i a + p a i n o s t u s t o i m i e n + p a i n o s t u s t o i m i i n + p a i n o s t u s v ä l i n e e n ä + p a i n o s t u s v ä l i n e e s t ä + p a i n o s t u s v ä l i n e e t + p a i n o s t u s v ä l i n e i d e n + p a i n o s t u s v ä l i n e i t ä + p a i n o s t u s v ä l i n e t t ä + p a i n o s t u s y r i t y k s i s s ä ä n + p a i n o t a l o j e n + p a i n o t a l o t + p a i n o t a m m e + p a i n o t a m m e k i n + p a i n o t a n + p a i n o t a n k i n + p a i n o t e t a a n + p a i n o t e t t a v a + p a i n o t e t t i i n + p a i n o t e t t i i n k i n + p a i n o t e t t u u n + p a i n o t i m m e + p a i n o t i t t e + p a i n o t t a a + p a i n o t t a a k s e m m e + p a i n o t t a a k s e n i + p a i n o t t a e n + p a i n o t t a e s s a a n + p a i n o t t a i s i + p a i n o t t a i s i n + p a i n o t t a i s i t t e + p a i n o t t a k a a m m e + p a i n o t t a m a a n + p a i n o t t a m a l l a + p a i n o t t a m i s j ä r j e s t e l m ä ä n + p a i n o t t a m i s t a + p a i n o t t a n u t + p a i n o t t a v a t + p a i n o t t i + p a i n o t t i v a t + p a i n o t t u i v a t + p a i n o t t u n e i t a + p a i n o t t u u + p a i n o t u k s e l l a + p a i n o t u k s e m m e + p a i n o t u k s e t + p a i n o t u k s i a + p a i n o t u o t t e i d e n + p a i n o t u o t t e i t a + p a i n o t u s e r o j a + p a i n o t u s e r o n + p a i n o t u s j ä r j e s t e l m ä ä + p a i n o t u s p e r u s t e i t a + p a i n o t u t t a v a + p a i n o v a p a u d e l l e + p a i n o v a p a u d e n + p a i n o v a p a u s + p a i n o v a p a u s a s e t u s t a + p a i n o v a p a u s r i k k o m u k s e t + p a i n o v a p a u t e e n + p a i n o v a p a u t t a + p a i n o v i r h e + p a i n o v o i m a l i n k o + p a i n o y l ä r a j o i t u k s i a + p a i s k a t a + p a i s k a t t i i n k i n + p a i s k a t t u + p a i s t a a + p a i s t a v a s t a + p a i s t i a + p a i s t i n p a n n u + p a i s t i n p a n n u l l e + p a i s t i n p a n n u m u r h a a j a t + p a i s t o ö l j y j ä t e t t ä + p a i s t o ö l j y n + p a i s t o ö l j y ä + p a i s u t e l l a + p a i s u u + p a i s u v a i s k u d o s + p a i t a h i h a s i l l a n n e + p a i t a s i l l a n i + p a i t o i h i n + p a i t o j a + p a i t s i o s ä ä n n ö s t ä + p a j u k ä ä r ö m i t t a r i + p a j u l a h o r u s o k a s + p a j u l i n t u + p a j u n i r k k o + p a j u n k i s s a + p a j u n k ö y t t ä + p a j u p i l l i + p a j u s i + p a j u s i r k k u + p a j u s i r p p i m a t k i j a + p a j u t a m m i + p a j u v a l k o m i t t a r i + p a j u v y ö m i t t a r i + p a k a r a l i h a s + p a k a s t a m i s k u s t a n n u k s i a + p a k a s t e a l u k s e e n + p a k a s t e b r o i l e r i t + p a k a s t e k a n a a + p a k a s t e k a n a s t a + p a k a s t e m a n s i k o i d e n + p a k a s t e m a n s i k o i l l e + p a k a s t e m a n s i k o i s t a + p a k a s t e m a n s i k o i t a + p a k a s t e t t u u n + p a k a s t e t u o t t e e t + p a k a s t e v a d e l m i e n + p a k a s t i m i s s a m m e + p a k a s t u s a l u s + p a k a s t u s a l u s t a + p a k a s t u s a l u s t e n + p a k e n e e + p a k e n e m a a n + p a k e n e m a l l a + p a k e n e t t e + p a k e n e v a t + p a k e n e v i e n + p a k e n i + p a k e n i v a t + p a k e t e i s t a + p a k e t i l l a m m e + p a k e t i n + p a k e t i n h a l l i n t a j ä r j e s t e l m ä + p a k e t i s s a + p a k e t i s t a + p a k e t t e i n a + p a k e t t e j a + p a k e t t i a + p a k e t t i a u t o j e n + p a k e t t i a u t o k a n n a n + p a k e t t i a u t o m a r k k i n o i l l e + p a k e t t i h i n t o j a + p a k e t t i i n + p a k e t t i k o k o u k s i s s a + p a k e t t i k y t k e n t ä + p a k e t t i l o m a n + p a k e t t i l o m i e n + p a k e t t i l o m i l l a + p a k e t t i m a t k a + p a k e t t i m a t k a a n + p a k e t t i m a t k a d i r e k t i i v i i n + p a k e t t i m a t k a d i r e k t i i v i n + p a k e t t i m a t k a d i r e k t i i v i s s ä + p a k e t t i m a t k a d i r e k t i i v i ä + p a k e t t i m a t k a s t a + p a k e t t i m a t k o i h i n + p a k e t t i m a t k o i l l e + p a k e t t i m a t k o j a + p a k e t t i m a t k o j e n + p a k e t t i n a + p a k e t t i r a t k a i s u + p a k e t t i r a t k a i s u j a + p a k e t t i r a t k a i s u j e n + p a k e t t i r a t k a i s u l l e + p a k e t t i r a t k a i s u u n + p a k e t t i s o p i m u k s e n + p a k e t t i s o p i m u s + p a k e t t i v a r a s t o + p a k i s t a n i l a i s e t + p a k i s t a n i l a i s i a + p a k i s t a n i l a i s i s t a + p a k i s t a n i l a i s t e n + p a k k a s i l l a + p a k k a s k e s t ä v y y t t ä + p a k k a s m i t t a r i + p a k k a s t a + p a k k a s t e n + p a k k a s u k k o + p a k k a u k s e e n + p a k k a u k s e n + p a k k a u k s e t + p a k k a u k s i a + p a k k a u k s i s s a + p a k k a u k s i s t a + p a k k a u s a l a + p a k k a u s a l a l l a + p a k k a u s a s e m i l l a + p a k k a u s a s e t u k s e n + p a k k a u s a s e t u s + p a k k a u s a s e t u s t a + p a k k a u s d i r e k t i i v i + p a k k a u s d i r e k t i i v i e n + p a k k a u s d i r e k t i i v i i n + p a k k a u s d i r e k t i i v i l l ä + p a k k a u s d i r e k t i i v i n + p a k k a u s d i r e k t i i v i s s ä + p a k k a u s d i r e k t i i v i s t ä + p a k k a u s d i r e k t i i v i ä + p a k k a u s j ä r j e s t e l m i ä + p a k k a u s j ä t e d i r e k t i i v i + p a k k a u s j ä t e d i r e k t i i v i s s ä + p a k k a u s j ä t e t e o l l i s u u d e s t a + p a k k a u s j ä t e t t ä + p a k k a u s j ä t t e e n + p a k k a u s j ä t t e e s e e n + p a k k a u s j ä t t e e s t ä + p a k k a u s j ä t t e e t + p a k k a u s j ä t t e i d e n + p a k k a u s j ä t t e i l l e + p a k k a u s j ä t t e i s t ä + p a k k a u s j ä t t e i t ä + p a k k a u s k a a s u + p a k k a u s k o k o j a + p a k k a u s k o k o j e n + p a k k a u s k o o s t a + p a k k a u s k o o t + p a k k a u s k u l u i s t a + p a k k a u s l a i t o k s e s s a + p a k k a u s m a t e r i a a l e j a + p a k k a u s m a t e r i a a l i + p a k k a u s m a t e r i a a l i e n + p a k k a u s m a t e r i a a l i l u e t t e l o n + p a k k a u s m a t e r i a a l i n + p a k k a u s m a t e r i a a l i s t a + p a k k a u s m a t e r i a a l i s t a a n + p a k k a u s m a t e r i a a l i t + p a k k a u s m e r k i n n ä s s ä + p a k k a u s m e r k i n n ö i s s ä + p a k k a u s m e r k i n n ö i s t ä + p a k k a u s m e r k i n t ä a s e t u k s e l l a + p a k k a u s m e r k i n t ä j ä r j e s t e l m ä + p a k k a u s m e r k i n t ä j ä r j e s t e l m ä ä + p a k k a u s m e r k i n t ä k ä y t ä n t ö ä + p a k k a u s m e r k i n t ä m ä ä r ä y s t ä + p a k k a u s m e r k i n t ä v a a t i m u k s i a + p a k k a u s m e r k i n t ö i h i n + p a k k a u s m e r k i n t ö j e n + p a k k a u s m e r k i n t ö j ä + p a k k a u s m ä ä r i e n + p a k k a u s m ä ä r ä t + p a k k a u s o h j e l m a + p a k k a u s p a k e t t i + p a k k a u s p o l i t i i k a s s a + p a k k a u s p o l i t i i k k a a n + p a k k a u s s e l o s t e + p a k k a u s s e l o s t e e n + p a k k a u s s e l o s t e e s e e n + p a k k a u s s e l o s t e e s s a + p a k k a u s s e l o s t e e s t a + p a k k a u s s e l o s t e i d e n + p a k k a u s s e l o s t e i s i i n + p a k k a u s s e l o s t e i s t a + p a k k a u s s e l o s t e i t a + p a k k a u s s e l o s t e t t a + p a k k a u s t a p a + p a k k a u s t e n + p a k k a u s t e o l l i s u u d e n + p a k k a u s t e o l l i s u u d e s s a + p a k k a u s t e o l l i s u u s + p a k k a u s t e o l l i s u u t t a + p a k k a u s t u o t a n n o s s a + p a k k a u s t y y p i t + p a k k a u s t y y p p i e n + p a k k a u s y k s i k ö i h i n + p a k k o a b o r t e i s t a + p a k k o a b o r t i t + p a k k o a b o r t t e i h i n + p a k k o a b o r t t e j a + p a k k o a b o r t t i + p a k k o a b o r t t i a + p a k k o a b o r t t i e n + p a k k o a b o r t t i i n + p a k k o a b o r t t i n a + p a k k o a s u t t a m i s e n + p a k k o a v i o l i i t o i s s a + p a k k o a v i o l i i t o i s t a + p a k k o a v i o l i i t o n + p a k k o a v i o l i i t o s s a + p a k k o a v i o l i i t o s t a + p a k k o a v i o l i i t o t + p a k k o a v i o l i i t t o + p a k k o a v i o l i i t t o i h i n + p a k k o a v i o l i i t t o j a + p a k k o a v i o l i i t t o j e n + p a k k o a v i o l i i t t o o n + p a k k o h o i t o a + p a k k o h ä ä d ö i l l ä + p a k k o h ä ä d ö i s t ä + p a k k o h ä ä d ö n + p a k k o h ä ä d ö t + p a k k o i r t i s a n o m i s i a + p a k k o j o u s t o i h i n + p a k k o j ä r j e s t e l m ä ä + p a k k o k a n s a l l i s t a m i s e t + p a k k o k a r k o t u k s e t + p a k k o k a t o a m i s e l t a + p a k k o k e i n o i h i n + p a k k o k e i n o i n + p a k k o k e i n o j a + p a k k o k e i n o j e n + p a k k o k e i n o t + p a k k o k e r j ä ä m i n e n + p a k k o k o l l e k t i v i s o i n n i n + p a k k o k o l l e k t i v i s o i n t i + p a k k o k o m m u n i s m i n + p a k k o k o t i u t t a m i n e n + p a k k o k o t i u t t a m i s e e n + p a k k o k u l j e t u s t a + p a k k o k u l t t u u r i + p a k k o k u l t t u u r i a + p a k k o k u l t t u u r i i n + p a k k o k u l t t u u r i s s a + p a k k o k ä y t ö s t ä + p a k k o l a a j e n t u m i s e e n + p a k k o l a i t + p a k k o l a s k u + p a k k o l i b e r a l i s o i n t i a + p a k k o l i s e n s o i n n i n + p a k k o l i s e n s o i n n i s t a + p a k k o l i s e n s o i n t i + p a k k o l i s e n s o i n t i a + p a k k o l i s e n s o i n t i i n + p a k k o l i s e n s o i n t i j ä r j e s t e l m ä + p a k k o l i s e n s o i n t i j ä r j e s t e l m ä ä + p a k k o l i s e n s o i n t i m e n e t t e l y + p a k k o l i s e n s o i n t i m e n e t t e l y j e n + p a k k o l i s e n s o i n t i v a a t i m u s t e n + p a k k o l i s e n s s e i h i n + p a k k o l i s e n s s e i l l ä + p a k k o l i s e n s s e i n + p a k k o l i s e n s s e j ä + p a k k o l i s e n s s i + p a k k o l i s e n s s i e n + p a k k o l i s e n s s i h a k e m u s t e n + p a k k o l i s e n s s i j ä r j e s t e l m ä n + p a k k o l i s e n s s i j ä r j e s t e l m ä ä + p a k k o l i s e n s s i l l ä + p a k k o l i s e n s s i n + p a k k o l i s e n s s i t + p a k k o l i s e n s s i ä + p a k k o l o m a u t u k s e t + p a k k o l o m a u t u s t e n + p a k k o l u n a s t a j a t + p a k k o l u n a s t a m i s t a + p a k k o l u n a s t u k s e e n + p a k k o l u n a s t u k s e t + p a k k o l u n a s t u s + p a k k o l u n a s t u s p o l i t i i k k a a + p a k k o l u n a s t u s p ä ä t ö k s e n + p a k k o l u n a s t u s t e n + p a k k o l u o v u t u s + p a k k o l u p a + p a k k o l u p i a + p a k k o l u v a t + p a k k o l u v i s t a + p a k k o m i e h i t y k s e e n + p a k k o m i e l l e t t ä + p a k k o m i e l t e e k s i + p a k k o m i e l t e e n o m a i s e l l a + p a k k o m i e l t e e n o m a i s e s t i + p a k k o m u u t t o + p a k k o m y y n n i n + p a k k o m y y n t i + p a k k o m y y n t i e n + p a k k o p a i d a s s a + p a k k o p a i t a + p a k k o p a i t a a + p a k k o p a i t a a n + p a k k o p a i t a j ä r j e s t e l m ä s t ä + p a k k o p a i t o i h i n + p a k k o p a l a u t t a m i s e t + p a k k o p a l a u t t a m i s t a + p a k k o p a l a u t t a m i s t e n + p a k k o p a l a u t u k s e t + p a k k o p a l a u t u s t e n + p a k k o p a n t i s t a + p a k k o p e r i n n ä s s ä + p a k k o p o i s t a m i s e t + p a k k o p o l i t i i k k a a + p a k k o p r o s t i t u u t i o + p a k k o p r o s t i t u u t i o a a l t o + p a k k o p r o s t i t u u t i o k s i + p a k k o p r o s t i t u u t i o k y s y m y s t ä + p a k k o p r o s t i t u u t i o l l e + p a k k o p r o s t i t u u t i o n + p a k k o p r o s t i t u u t i o o n + p a k k o p r o s t i t u u t i o s s a + p a k k o p r o s t i t u u t i o s t a + p a k k o p r o s t i t u u t i o t a + p a k k o r a s k a u d e n + p a k k o r a s k a u s + p a k k o r a t k a i s u i s s a + p a k k o r u o k i n t a + p a k k o r u o k i n t a a + p a k k o r u o t s i + p a k k o s a n e l u n a + p a k k o s e n t r a l i s m i + p a k k o s i i r r e t t y + p a k k o s i i r r o i l t a + p a k k o s i i r r o i s s a + p a k k o s i i r r o i s t a + p a k k o s i i r r o t + p a k k o s i i r t o + p a k k o s i i r t o i h i n + p a k k o s i i r t o j a + p a k k o s i i r t o j e n s a + p a k k o s i i r t o l a i s u u d e n + p a k k o s i i r t o l a i s u u t t a + p a k k o s i i r t y m i s e n + p a k k o s i i r t ä m ä l l ä + p a k k o s o t a + p a k k o s t a n d a r d i + p a k k o s t e r i l i s a a t i o + p a k k o s t e r i l i s a a t i o i t a + p a k k o s t e r i l i s a a t i o k ä y t ä n t e i t ä + p a k k o s t e r i l i s a a t i o t + p a k k o s t e r i l i s a a t i o t a + p a k k o s t e r i l i s o i n n i n + p a k k o s t e r i l o i n n i t + p a k k o s t e r i l o i n t e i n a + p a k k o s t e r i l o i n t i + p a k k o s t e r i l o i n t i a + p a k k o s u l a u t t a m i s t a + p a k k o s y ö t e t ä ä n + p a k k o s y ö t t ä m i n e n + p a k k o s y ö t t ö ä + p a k k o s ä ä n n ö t + p a k k o t e u r a s t u s + p a k k o t i e d o t u k s e l l a + p a k k o t i l a n t e e s e e n + p a k k o t i l a n t e e s s a + p a k k o t o i m e n p i d e t t ä + p a k k o t o i m e n p i t e e n + p a k k o t o i m e n p i t e e t + p a k k o t o i m e n p i t e i d e n + p a k k o t o i m e n p i t e i s i i n + p a k k o t o i m e n p i t e i s t ä + p a k k o t o i m e n p i t e i t ä + p a k k o t o i m e t + p a k k o t o i m i a + p a k k o t o i m i e n + p a k k o t o i m i i n + p a k k o t o i m i n t a a + p a k k o t o i m i s s a + p a k k o t o i m i s t a + p a k k o t y ö + p a k k o t y ö h ö n + p a k k o t y ö k i e l t o + p a k k o t y ö k y s y m y k s e s s ä + p a k k o t y ö l e i r e i l l e + p a k k o t y ö l e i r e i l l ä + p a k k o t y ö l e i r e i s t ä + p a k k o t y ö l e i r i e n + p a k k o t y ö l e i r i l l e + p a k k o t y ö l e i r i t + p a k k o t y ö l l i s t ä m i s e e n + p a k k o t y ö l l ä + p a k k o t y ö l t ä + p a k k o t y ö l ä i s i l l e + p a k k o t y ö l ä i s i n ä + p a k k o t y ö l ä i s i ä + p a k k o t y ö l ä i s t e n + p a k k o t y ö m e n e t e l m i ä + p a k k o t y ö n + p a k k o t y ö n ä + p a k k o t y ö s s ä + p a k k o t y ö s t ä + p a k k o t y ö t ä + p a k k o t y ö v a n g e i l l e + p a k k o t y ö v a n k i e n + p a k k o t y ö v o i m a a + p a k k o t y ö v o i m a k s i + p a k k o t y ö v o i m a l l a + p a k k o t y ö v o i m a n + p a k k o t y ö v o i m a s t a + p a k k o u n i o n i l l a + p a k k o v ä r v ä y s + p a k k o v ä r v ä y s t ä + p a k k o y k s i t y i s t ä m i s t ä + p a k k o y r i t t ä j i i n + p a k o j u n a + p a k o j ä r j e s t e l m ä + p a k o j ä r j e s t e l m ä s t ä + p a k o j ä r j e s t e l m ä ä + p a k o k a a s u + p a k o k a a s u a + p a k o k a a s u a n a l y s a a t t o r i t + p a k o k a a s u a r v o j e n + p a k o k a a s u a r v o t + p a k o k a a s u a s e t u k s i s s a + p a k o k a a s u i s t a + p a k o k a a s u j a + p a k o k a a s u j e n + p a k o k a a s u j ä r j e s t e l m ä + p a k o k a a s u k u o r m i t u k s e n + p a k o k a a s u n o r m e j a + p a k o k a a s u n o r m i e n + p a k o k a a s u n p u h d i s t u s t e k n i i k o i t a + p a k o k a a s u p ä ä s t ö i s t ä + p a k o k a a s u p ä ä s t ö j e n + p a k o k a a s u p ä ä s t ö j ä + p a k o k a a s u p ä ä s t ö t + p a k o k a a s u s t a n d a r d i n + p a k o k a a s u t + p a k o k a a s u t e k n i i k a l l a + p a k o k e i n o i n + p a k o l a i s a a l l o i l t a + p a k o l a i s a a l l o n + p a k o l a i s a a l l o t + p a k o l a i s a a l t o + p a k o l a i s a a l t o a + p a k o l a i s a a l t o i h i n + p a k o l a i s a a l t o j a + p a k o l a i s a l u e i l l e + p a k o l a i s a p u + p a k o l a i s a p u a + p a k o l a i s a s e m a + p a k o l a i s a s e m a a + p a k o l a i s a s e m a a n + p a k o l a i s a s e m a n + p a k o l a i s a s e m a n s a + p a k o l a i s a s e m a s s a + p a k o l a i s a s e m a s t a + p a k o l a i s a s e m a s t a a n + p a k o l a i s a s i a a + p a k o l a i s a s i a i n + p a k o l a i s a s i a n + p a k o l a i s a s i o i s s a + p a k o l a i s a s i o i t a + p a k o l a i s a s u t u s t e n + p a k o l a i s a v u l l e + p a k o l a i s a v u n + p a k o l a i s d r a a m a + p a k o l a i s d r a a m a a + p a k o l a i s e k s i + p a k o l a i s e n + p a k o l a i s e t + p a k o l a i s h a l l i n n o n + p a k o l a i s h a l l i t u k s e n + p a k o l a i s h a l l i t u s + p a k o l a i s h a n k k e i d e n + p a k o l a i s i a + p a k o l a i s i i n + p a k o l a i s i k s i + p a k o l a i s i l l e + p a k o l a i s i n a + p a k o l a i s i s t a + p a k o l a i s j o u k k o i n a + p a k o l a i s j o u k o n + p a k o l a i s j ä r j e s t e l m ä n + p a k o l a i s j ä r j e s t ö + p a k o l a i s j ä r j e s t ö i h i n + p a k o l a i s j ä r j e s t ö j e n + p a k o l a i s j ä r j e s t ö n + p a k o l a i s j ä r j e s t ö t + p a k o l a i s k a t a s t r o f i a l u e i s t a + p a k o l a i s k e s k u k s e e n + p a k o l a i s k e s k u k s e n + p a k o l a i s k e s k u k s e s s a + p a k o l a i s k e s k u k s e t + p a k o l a i s k e s k u k s i a + p a k o l a i s k e s k u k s i i n + p a k o l a i s k e s k u k s i s s a + p a k o l a i s k e s k u s + p a k o l a i s k e s k u s t a + p a k o l a i s k e s k u s t e l u + p a k o l a i s k e s k u s t e n + p a k o l a i s k i i n t i ö i d e n + p a k o l a i s k i i n t i ö i s t ä + p a k o l a i s k i i n t i ö i t ä + p a k o l a i s k i i n t i ö n + p a k o l a i s k i i n t i ö t ä + p a k o l a i s k o m i s s a a r i + p a k o l a i s k o m i s s a a r i i n + p a k o l a i s k o m i t e a t + p a k o l a i s k r i i s i + p a k o l a i s k r i i s i i n + p a k o l a i s k r i i s i n + p a k o l a i s k r i i s i s t ä + p a k o l a i s k r i i s i ä + p a k o l a i s k y s y m y k s e e n + p a k o l a i s k y s y m y k s e n + p a k o l a i s k y s y m y k s e s s ä + p a k o l a i s k y s y m y k s e s t ä + p a k o l a i s k y s y m y k s i i n + p a k o l a i s k y s y m y k s i s s ä + p a k o l a i s k y s y m y s + p a k o l a i s k y s y m y s t e n + p a k o l a i s k y s y m y s t ä + p a k o l a i s k ä s i t t e e n + p a k o l a i s l a i n s ä ä d ä n n ö n + p a k o l a i s l a i n s ä ä d ä n n ö s t ä + p a k o l a i s l a i n s ä ä d ä n t ö + p a k o l a i s l a i n s ä ä d ä n t ö ä + p a k o l a i s l a k i e n + p a k o l a i s l a s t a + p a k o l a i s l a s t e n + p a k o l a i s l a u m o i s t a + p a k o l a i s l e i r e i h i m m e + p a k o l a i s l e i r e i h i n + p a k o l a i s l e i r e i l l e + p a k o l a i s l e i r e i l l ä + p a k o l a i s l e i r e i s s ä + p a k o l a i s l e i r e i s t ä + p a k o l a i s l e i r e j ä + p a k o l a i s l e i r i + p a k o l a i s l e i r i e n + p a k o l a i s l e i r i i n + p a k o l a i s l e i r i l l e + p a k o l a i s l e i r i l l ä + p a k o l a i s l e i r i n + p a k o l a i s l e i r i t + p a k o l a i s l e i r i ä + p a k o l a i s l i i k e + p a k o l a i s m a s s o j a + p a k o l a i s m a s s o j e n + p a k o l a i s m e n o t + p a k o l a i s m ä ä r i ä + p a k o l a i s m ä ä r ä l l e + p a k o l a i s m ä ä r ä ä + p a k o l a i s n a i s e t + p a k o l a i s n a i s t e n + p a k o l a i s n e u v o s t o + p a k o l a i s o i k e u d e n + p a k o l a i s o i k e u s + p a k o l a i s o n g e l m a + p a k o l a i s o n g e l m a a + p a k o l a i s o n g e l m a a n + p a k o l a i s o n g e l m a n + p a k o l a i s o n g e l m a s t a + p a k o l a i s o n g e l m a t + p a k o l a i s o n g e l m i a + p a k o l a i s o n g e l m i s t a + p a k o l a i s p a k e t i n + p a k o l a i s p a l a u t u k s i i n + p a k o l a i s p a r l a m e n t i n + p a k o l a i s p e r h e i d e n + p a k o l a i s p o l i t i i k a k s i + p a k o l a i s p o l i t i i k a l l a + p a k o l a i s p o l i t i i k a l l e + p a k o l a i s p o l i t i i k a n + p a k o l a i s p o l i t i i k a s s a + p a k o l a i s p o l i t i i k a s t a + p a k o l a i s p o l i t i i k a t + p a k o l a i s p o l i t i i k k a + p a k o l a i s p o l i t i i k k a a + p a k o l a i s p o l i t i i k k a a m m e + p a k o l a i s p o l i t i i k k a a n + p a k o l a i s p o l i t i i k k a n s a + p a k o l a i s p o l i t i i k k o i h i n + p a k o l a i s p ä i v ä + p a k o l a i s p ä i v ä n + p a k o l a i s r a h a s t o + p a k o l a i s r a h a s t o a + p a k o l a i s r a h a s t o l l e + p a k o l a i s r a h a s t o n + p a k o l a i s r a h a s t o o n + p a k o l a i s r a h a s t o s s a + p a k o l a i s r a h a s t o s t a + p a k o l a i s r a s i t u k s e n + p a k o l a i s r y h m i s t ä + p a k o l a i s r y h m i ä + p a k o l a i s r y h m ä + p a k o l a i s r y h m ä n + p a k o l a i s s o p i m u k s e n + p a k o l a i s s o p i m u s + p a k o l a i s s o p i m u s t a + p a k o l a i s s t a t u k s e l l a + p a k o l a i s s t a t u k s e n + p a k o l a i s s t a t u s + p a k o l a i s s t a t u s t a + p a k o l a i s s u o j a + p a k o l a i s t a + p a k o l a i s t e n + p a k o l a i s t e n t o r j u n t a j ä r j e s t e l m ä n + p a k o l a i s t i l a n n e + p a k o l a i s t i l a n t e e n + p a k o l a i s t i l a n t e e s e e n + p a k o l a i s t i l a n t e e s t a + p a k o l a i s t i l a n t e i d e n + p a k o l a i s t o i m i s t o + p a k o l a i s t r a g e d i a a + p a k o l a i s t u l v a + p a k o l a i s t u l v a a n + p a k o l a i s t u l v a n + p a k o l a i s t u l v a s t a + p a k o l a i s t u l v a t + p a k o l a i s t u r v a n + p a k o l a i s t y ö n t e k i j ä ä + p a k o l a i s t y ö t ä + p a k o l a i s u u d e l l e + p a k o l a i s u u t e e n + p a k o l a i s v a l t u u t e t t u + p a k o l a i s v a l t u u t e t u n + p a k o l a i s v a s t a i s e n + p a k o l a i s v a s t a i s e s t a + p a k o l a i s v e n e i s s ä + p a k o l a i s v i r a s t o + p a k o l a i s v i r a s t o n + p a k o l a i s v i r r a l l e + p a k o l a i s v i r r a n + p a k o l a i s v i r r a t + p a k o l a i s v i r r o i s t a + p a k o l a i s v i r t a + p a k o l a i s v i r t a a + p a k o l a i s v i r t a u k s e t + p a k o l a i s v i r t o i h i n + p a k o l a i s v i r t o j a + p a k o l a i s v i r t o j e n + p a k o l a i s y h t e i s ö j e n + p a k o l a i s y h t e i s ö j ä + p a k o l a i s y l e i s s o p i m u k s e e n + p a k o l a i s y l e i s s o p i m u k s e n + p a k o l a i s y l e i s s o p i m u k s e s t a + p a k o l a i s y l e i s s o p i m u s t a + p a k o l a u s e k k e i t a + p a k o l l a + p a k o l l i s e e n + p a k o l l i s e k s i + p a k o l l i s e l l a + p a k o l l i s e n + p a k o l l i s e n a + p a k o l l i s e s s a + p a k o l l i s e s t a + p a k o l l i s e t + p a k o l l i s i a + p a k o l l i s i i n + p a k o l l i s i k s i + p a k o l l i s i l l a + p a k o l l i s i n a + p a k o l l i s i s s a + p a k o l l i s i s t a + p a k o l l i s t e n + p a k o l l i s u u t t a + p a k o m a t k a l l a a n + p a k o n a l a i s e n a + p a k o n o p e u s + p a k o p a i k k a a + p a k o p u t k i + p a k o p u t k i e n + p a k o p u t k i s t o + p a k o r e i t i t + p a k o r e i t t e j ä + p a k o r e i t t i ä + p a k o r e t k i + p a k o s t a + p a k o t e j ä r j e s t e l m i e n + p a k o t e j ä r j e s t e l m i ä + p a k o t e j ä r j e s t e l m ä + p a k o t e j ä r j e s t e l m ä n + p a k o t e j ä r j e s t e l m ä s t ä + p a k o t e j ä r j e s t e l m ä ä + p a k o t e j ä r j e s t e l m ä ä n + p a k o t e k o m i t e a n + p a k o t e k o m i t e o i t a + p a k o t e k y s y m y s t ä + p a k o t e l i s t a l l e + p a k o t e l i s t a n + p a k o t e l u e t t e l o n + p a k o t e l u e t t e l o o n + p a k o t e m a h d o l l i s u u k s i s t a + p a k o t e m e k a n i s m e j a + p a k o t e m e n e t e l m i s t ä m m e + p a k o t e m u o t o + p a k o t e p e l i ä + p a k o t e p o l i t i i k a l l e + p a k o t e p o l i t i i k a n + p a k o t e p o l i t i i k a s t a + p a k o t e p o l i t i i k k a + p a k o t e p o l i t i i k k a a + p a k o t e p o l i t i i k k a a m m e + p a k o t e p o l i t i i k k a a n + p a k o t e p o l i t i i k k a a n s a + p a k o t e p o l i t i i k k a m m e + p a k o t e t a a n + p a k o t e t a a n k o + p a k o t e t o i m i a m m e + p a k o t e t t a + p a k o t e t t a i s i i n + p a k o t e t t a v a + p a k o t e t t i i n + p a k o t e t t u j e n + p a k o t e t u n + p a k o t e t u s t a + p a k o t e t y ö n + p a k o t e t y ö s t ä + p a k o t e v a i h t o e h t o + p a k o t e v a i h t o e h t o j a + p a k o t e v ä l i n e e s e e n + p a k o t e v ä l i n e i t ä + p a k o t i e + p a k o t i e t + p a k o t i e t ä + p a k o t t a a + p a k o t t a a k s e e n + p a k o t t a m a a n + p a k o t t a m a t t a + p a k o t t a m i s k e i n o t + p a k o t t a m i s t a + p a k o t t a v a m m i s t a + p a k o t t a v a m p a a + p a k o t t a v a m p i + p a k o t t a v a m p i a + p a k o t t a v a n + p a k o t t a v a t + p a k o t t a v i a + p a k o t t a v i e n + p a k o t t a v i m m a t + p a k o t t a v i m m i s t a + p a k o t t a v i m p a a n + p a k o t t a v i m p i a + p a k o t t a v i m p i i n + p a k o t t e e t + p a k o t t e e t k a a n + p a k o t t e i d e n + p a k o t t e i l l a + p a k o t t e i s i i n + p a k o t t e i s s a + p a k o t t e i s t a + p a k o t t e i s t a k i n + p a k o t t e i t a + p a k o t t e i t a m m e + p a k o t t i + p a k o t u k s e l l a + p a k o v ä y l ä n ä + p a k s u a + p a k s u i s e t + p a k s u i s i a + p a k s u i s t e n + p a k s u j a l k a + p a k s u n a h k a i s e k s i + p a k s u n o k k a u i k k u + p a k s u s a r v i l a m m a s + p a k s u s u o l i + p a k s u s u o l i s y ö v ä s t ä + p a k s u t + p a l a a k i n + p a l a a m a a n + p a l a a m a l l a + p a l a a m a s s a + p a l a a m a s t a + p a l a a m a t t a + p a l a a m m e + p a l a a m m e k i n + p a l a a m m e k o + p a l a a n + p a l a a t + p a l a a t t e + p a l a a v a + p a l a a v a n + p a l a a v a n s a + p a l a a v a t + p a l a i s i + p a l a i s i m m e + p a l a i s i n + p a l a i s i v a t + p a l a l t a + p a l a m a a n + p a l a m a t t a + p a l a m i s j ä t t e i t ä + p a l a m i s k a a s u j e n + p a l a m i s p r o s e s s i e n + p a l a m i s p r o s e s s i t + p a l a m i s t a + p a l a m i s t u o t e + p a l a m i s t u o t t e i t a + p a l a n + p a l a n e i d e n + p a l a n n e e t + p a l a n n e i d e n + p a l a n n u t + p a l a p e l i + p a l a p e l i l ä h e s t y m i s t a p a + p a l a p e l i m a t t o j a + p a l a p e l i s s ä + p a l a p e l i s t ä + p a l a p e l i ä + p a l a s e t + p a l a s i + p a l a s i a + p a l a s i l l a + p a l a s i n + p a l a s i v a t + p a l a t a + p a l a t a a n + p a l a t a a n p a + p a l a t a k s e e n + p a l a t a k s e m m e + p a l a t a k s e n i + p a l a t e s s a a n + p a l a t e s s a m m e + p a l a t e s s a n i + p a l a t e s s a n n e + p a l a t k a a + p a l a t k a a m m e + p a l a t k o + p a l a t s e i h i n + p a l a t s e i h i n s a + p a l a t s i a u k i o + p a l a t s i r a n t a k a t u + p a l a t s i v a l l a n k u m o u s + p a l a t t a i s i i n + p a l a t t a v a + p a l a t t i i n + p a l a t t u + p a l a t t u a + p a l a t t u a a n + p a l a t t u a m m e + p a l a t t u a n i + p a l a t t u a n n e + p a l a u n p ö l l ö n e n + p a l a u n s i l k k i k e r t t u n e n + p a l a u t a m m e + p a l a u t a n + p a l a u t e m e k a n i s m i e n + p a l a u t e t a + p a l a u t e t a a n + p a l a u t e t a a n k o + p a l a u t e t a a n p a + p a l a u t e t t a + p a l a u t e t t a i s i + p a l a u t e t t a i s i i n + p a l a u t e t t i i n + p a l a u t e t t u + p a l a u t e t t u j e n + p a l a u t e t u i s t a + p a l a u t e t u t + p a l a u t i m m e + p a l a u t t a a + p a l a u t t a a k s e e n + p a l a u t t a a k s e m m e + p a l a u t t a a k s e n i + p a l a u t t a e s s a m m e + p a l a u t t a i s i + p a l a u t t a k a a m m e + p a l a u t t a k o o n + p a l a u t t a m a a n + p a l a u t t a m a l l a + p a l a u t t a m a s s a + p a l a u t t a m a s t a + p a l a u t t a m a t t a + p a l a u t t a m i s d i r e k t i i v i + p a l a u t t a m i s d i r e k t i i v i n + p a l a u t t a m i s d i r e k t i i v i s t ä + p a l a u t t a m i s d i r e k t i i v i ä + p a l a u t t a m i s e e n + p a l a u t t a m i s e k s i + p a l a u t t a m i s e n + p a l a u t t a m i s e s s a + p a l a u t t a m i s e s t a + p a l a u t t a m i s k i e l l o n + p a l a u t t a m i s k i e l t o a + p a l a u t t a m i s k i e l t o o n + p a l a u t t a m i s k i e l t o p e r i a a t e t t a + p a l a u t t a m i s k i e l t o p e r i a a t t e e n + p a l a u t t a m i s k y s y m y s t ä + p a l a u t t a m i s l a i n s ä ä d ä n n ö n + p a l a u t t a m i s l a i n s ä ä d ä n t ö + p a l a u t t a m i s m a a h a n + p a l a u t t a m i s m e n e t e l m ä ä + p a l a u t t a m i s m e n e t e l m ä ä n + p a l a u t t a m i s m e n e t t e l y i h i n + p a l a u t t a m i s m e n e t t e l y j e n + p a l a u t t a m i s m e n e t t e l y j ä + p a l a u t t a m i s m e n e t t e l y n + p a l a u t t a m i s m ä ä r ä y k s i ä + p a l a u t t a m i s o h j e l m a + p a l a u t t a m i s o h j e l m a n + p a l a u t t a m i s o h j e l m i s t a + p a l a u t t a m i s o p e r a a t i o i d e n + p a l a u t t a m i s o p e r a a t i o i h i n + p a l a u t t a m i s o p e r a a t i o i s s a + p a l a u t t a m i s o p e r a a t i o i t a + p a l a u t t a m i s p e r i a a t e + p a l a u t t a m i s p e r i a a t t e e n + p a l a u t t a m i s p o l i t i i k a n + p a l a u t t a m i s p o l i t i i k a s s a + p a l a u t t a m i s p o l i t i i k a s t a + p a l a u t t a m i s p o l i t i i k k a + p a l a u t t a m i s p o l i t i i k k a a + p a l a u t t a m i s p o l i t i i k k a a n + p a l a u t t a m i s p o l i t i i k o i s s a + p a l a u t t a m i s p r o s e s s i + p a l a u t t a m i s p r o s e s s i n + p a l a u t t a m i s p y y n n ö n + p a l a u t t a m i s p y y n t ö + p a l a u t t a m i s p ä ä t ö k s e n + p a l a u t t a m i s p ä ä t ö s t e n + p a l a u t t a m i s r a h a s t o + p a l a u t t a m i s r a h a s t o a + p a l a u t t a m i s r a h a s t o l l e + p a l a u t t a m i s r a h a s t o n + p a l a u t t a m i s r a h a s t o o n + p a l a u t t a m i s s o p i m u k s e n + p a l a u t t a m i s s o p i m u k s i a + p a l a u t t a m i s s o p i m u k s i i n + p a l a u t t a m i s s t r a t e g i a a + p a l a u t t a m i s s u u n n i t e l m a a + p a l a u t t a m i s t a + p a l a u t t a m i s t o i m e n p i t e e t + p a l a u t t a m i s t o i m e n p i t e i s i i n + p a l a u t t a m i s t o i m i a + p a l a u t t a m i s t o i m i e n + p a l a u t t a m i s t o i m i i n + p a l a u t t a m i s t o i m i l l e + p a l a u t t a n e e t + p a l a u t t a n u t + p a l a u t t a v a t + p a l a u t t e e n + p a l a u t t e e s t a n n e + p a l a u t t i + p a l a u t t i v a t + p a l a u t u i + p a l a u t u k s e l l e + p a l a u t u k s i s t a a n + p a l a u t u m i s a i k a + p a l a u t u m i s a j a n + p a l a u t u s a i k a a + p a l a u t u s d i r e k t i i v i + p a l a u t u s d i r e k t i i v i i n + p a l a u t u s d i r e k t i i v i k s i + p a l a u t u s d i r e k t i i v i l t ä + p a l a u t u s d i r e k t i i v i n + p a l a u t u s d i r e k t i i v i s t ä + p a l a u t u s d i r e k t i i v i ä + p a l a u t u s h a k e m u k s e n s a + p a l a u t u s j ä r j e s t e l m i e n + p a l a u t u s j ä r j e s t e l m i i n + p a l a u t u s j ä r j e s t e l m i ä + p a l a u t u s j ä r j e s t e l m ä + p a l a u t u s j ä r j e s t e l m ä n + p a l a u t u s j ä r j e s t e l m ä ä + p a l a u t u s k i e l l o n + p a l a u t u s k i e l t o a + p a l a u t u s l a u s e k k e e t + p a l a u t u s l e n t o j a + p a l a u t u s l e n t o j e n + p a l a u t u s m a h d o l l i s u u s + p a l a u t u s m a h d o l l i s u u t t a + p a l a u t u s m e k a n i s m i a + p a l a u t u s m e n e t e l m i s t ä + p a l a u t u s m e n e t t e l y + p a l a u t u s m e n e t t e l y i h i n + p a l a u t u s m e n e t t e l y j e n + p a l a u t u s m e n e t t e l y n + p a l a u t u s m e n e t t e l y y n + p a l a u t u s m e n e t t e l y ä + p a l a u t u s n a p p i a + p a l a u t u s n u m e r o + p a l a u t u s o h j e l m a a + p a l a u t u s o h j e l m i a + p a l a u t u s o i k e u d e s t a + p a l a u t u s o i k e u t t a + p a l a u t u s o p e r a a t i o i d e n + p a l a u t u s o p e r a a t i o i t a + p a l a u t u s p o l i t i i k a l l e + p a l a u t u s p o l i t i i k a n + p a l a u t u s p o l i t i i k a s t a + p a l a u t u s p o l i t i i k k a + p a l a u t u s p o l i t i i k k a a + p a l a u t u s p r o s e s s i s s a + p a l a u t u s p ä ä t ö k s e e n + p a l a u t u s p ä ä t ö s t ä + p a l a u t u s r a h a s t o + p a l a u t u s r a h a s t o n + p a l a u t u s r a h o i t u s t a + p a l a u t u s s o p i m u k s i a + p a l a u t u s t a + p a l a u t u s t o i m i a + p a l a u t u s t u k e a + p a l a u t u u + p a l a v a n + p a l a v a r a k k a u s + p a l e l e m a a n + p a l e l l a a n + p a l e s t i i n a l a i s a k t i v i s t i e n + p a l e s t i i n a l a i s a l u e + p a l e s t i i n a l a i s a l u e e l l a + p a l e s t i i n a l a i s a l u e e l l e + p a l e s t i i n a l a i s a l u e e l t a + p a l e s t i i n a l a i s a l u e e n + p a l e s t i i n a l a i s a l u e e s e e n + p a l e s t i i n a l a i s a l u e e t + p a l e s t i i n a l a i s a l u e i d e n + p a l e s t i i n a l a i s a l u e i l l a + p a l e s t i i n a l a i s a l u e i l l e + p a l e s t i i n a l a i s a l u e i l t a + p a l e s t i i n a l a i s a l u e i s t a + p a l e s t i i n a l a i s a l u e i t a + p a l e s t i i n a l a i s a l u e t t a + p a l e s t i i n a l a i s a p u a + p a l e s t i i n a l a i s a s i a a + p a l e s t i i n a l a i s e n + p a l e s t i i n a l a i s e s t a + p a l e s t i i n a l a i s e t + p a l e s t i i n a l a i s h a l l i n n o l l a + p a l e s t i i n a l a i s h a l l i n n o l l e + p a l e s t i i n a l a i s h a l l i n n o l t a + p a l e s t i i n a l a i s h a l l i n n o n + p a l e s t i i n a l a i s h a l l i n n o n k i n + p a l e s t i i n a l a i s h a l l i n n o s s a + p a l e s t i i n a l a i s h a l l i n n o s t a + p a l e s t i i n a l a i s h a l l i n t o + p a l e s t i i n a l a i s h a l l i n t o a + p a l e s t i i n a l a i s h a l l i n t o o n + p a l e s t i i n a l a i s h a l l i t u k s e l l a + p a l e s t i i n a l a i s h a l l i t u k s e l l e + p a l e s t i i n a l a i s h a l l i t u k s e n + p a l e s t i i n a l a i s h a l l i t u s + p a l e s t i i n a l a i s i a + p a l e s t i i n a l a i s i a k a a n + p a l e s t i i n a l a i s i i n + p a l e s t i i n a l a i s i l l a + p a l e s t i i n a l a i s i l l a h a n + p a l e s t i i n a l a i s i l l e + p a l e s t i i n a l a i s i l t a + p a l e s t i i n a l a i s i n s t i t u u t i o i d e n + p a l e s t i i n a l a i s i s s a + p a l e s t i i n a l a i s i s t a + p a l e s t i i n a l a i s j o h d o l l e + p a l e s t i i n a l a i s j o h t a j a a + p a l e s t i i n a l a i s j o h t a j a n + p a l e s t i i n a l a i s j o h t a j a t + p a l e s t i i n a l a i s j o h t a j i a + p a l e s t i i n a l a i s j o h t a j i e n + p a l e s t i i n a l a i s j o h t a j i l l e + p a l e s t i i n a l a i s j o h t o + p a l e s t i i n a l a i s j ä r j e s t ö + p a l e s t i i n a l a i s j ä r j e s t ö j ä + p a l e s t i i n a l a i s j ä r j e s t ö t + p a l e s t i i n a l a i s k a n s a + p a l e s t i i n a l a i s k a n s a a + p a l e s t i i n a l a i s k a u p u n g e i s t a + p a l e s t i i n a l a i s k a u p u n k e j a + p a l e s t i i n a l a i s k a u p u n k i e n + p a l e s t i i n a l a i s k o l l e g o j a m m e + p a l e s t i i n a l a i s k o l l e g o j e m m e + p a l e s t i i n a l a i s k o u l u i s s a + p a l e s t i i n a l a i s k r i s t i t t y + p a l e s t i i n a l a i s k u l t t u u r i n + p a l e s t i i n a l a i s k u m p p a n i a + p a l e s t i i n a l a i s k y l ä ä + p a l e s t i i n a l a i s k y s y m y k s e e n + p a l e s t i i n a l a i s k y s y m y k s e n + p a l e s t i i n a l a i s k y s y m y s + p a l e s t i i n a l a i s k y s y m y s t ä + p a l e s t i i n a l a i s l a p s e t + p a l e s t i i n a l a i s l a p s i a + p a l e s t i i n a l a i s l a p s i l l e + p a l e s t i i n a l a i s l a p s i s t a + p a l e s t i i n a l a i s l a s t a + p a l e s t i i n a l a i s l e i r e i h i n + p a l e s t i i n a l a i s l i i k k e i d e n + p a l e s t i i n a l a i s l ä ä k ä r i + p a l e s t i i n a l a i s l ä ä k ä r i l l e + p a l e s t i i n a l a i s l ä ä k ä r i ä + p a l e s t i i n a l a i s m i e h e s t ä + p a l e s t i i n a l a i s m i e h e t + p a l e s t i i n a l a i s m i l i t a n t t i e n + p a l e s t i i n a l a i s m i n i s t e r i l l ä + p a l e s t i i n a l a i s m i n i s t e r i n + p a l e s t i i n a l a i s m y ö n t e i s e s t ä + p a l e s t i i n a l a i s n a i n e n + p a l e s t i i n a l a i s n a i s e s t a + p a l e s t i i n a l a i s n a i s i l l e + p a l e s t i i n a l a i s n u o r e t + p a l e s t i i n a l a i s n u o r i s o l l e + p a l e s t i i n a l a i s o n g e l m a n + p a l e s t i i n a l a i s o s a p u o l e n + p a l e s t i i n a l a i s p a k o l a i s e l l e + p a l e s t i i n a l a i s p a k o l a i s e n + p a l e s t i i n a l a i s p a k o l a i s e t + p a l e s t i i n a l a i s p a k o l a i s i a + p a l e s t i i n a l a i s p a k o l a i s i i n + p a l e s t i i n a l a i s p a k o l a i s i l l e + p a l e s t i i n a l a i s p a k o l a i s t a + p a l e s t i i n a l a i s p a k o l a i s t e n + p a l e s t i i n a l a i s p e r h e i d e n + p a l e s t i i n a l a i s p e r h e t t ä + p a l e s t i i n a l a i s p i i r e i s s ä + p a l e s t i i n a l a i s p o j a n + p a l e s t i i n a l a i s p o l i i s i a + p a l e s t i i n a l a i s p o l i i s i n + p a l e s t i i n a l a i s p o l i i s i t + p a l e s t i i n a l a i s p o l i i t i k k o j a + p a l e s t i i n a l a i s p o l v e n + p a l e s t i i n a l a i s p u o l e n + p a l e s t i i n a l a i s p u o l t a + p a l e s t i i n a l a i s r y h m i e n + p a l e s t i i n a l a i s r y h m i t t y m i e n + p a l e s t i i n a l a i s r y h m i t t y m i ä + p a l e s t i i n a l a i s r y h m i t t y m ä ä + p a l e s t i i n a l a i s r y h m i ä + p a l e s t i i n a l a i s r y h m ä t + p a l e s t i i n a l a i s s a i r a a l a t + p a l e s t i i n a l a i s s i v i i l e i h i n + p a l e s t i i n a l a i s s i v i i l i e n + p a l e s t i i n a l a i s s i v i i l i t + p a l e s t i i n a l a i s s i v i i l i ä + p a l e s t i i n a l a i s s o t i l a i d e n + p a l e s t i i n a l a i s s o t i l a i t a + p a l e s t i i n a l a i s s u k u p o l v i a + p a l e s t i i n a l a i s t a + p a l e s t i i n a l a i s t a h o t + p a l e s t i i n a l a i s t a i s t e l i j o i d e n + p a l e s t i i n a l a i s t a l o i s s a + p a l e s t i i n a l a i s t e n + p a l e s t i i n a l a i s t e r r o r i s t a + p a l e s t i i n a l a i s t e r r o r i s t e j a + p a l e s t i i n a l a i s t e r r o r i s t i e n + p a l e s t i i n a l a i s t e r r o r i s t i t + p a l e s t i i n a l a i s t y t ö n + p a l e s t i i n a l a i s u h r e i h i n + p a l e s t i i n a l a i s v a l t i o + p a l e s t i i n a l a i s v a l t i o i t a + p a l e s t i i n a l a i s v a l t i o l l e + p a l e s t i i n a l a i s v a l t i o n + p a l e s t i i n a l a i s v a l t i o o n + p a l e s t i i n a l a i s v a l t i o s s a k a a n + p a l e s t i i n a l a i s v a l t i o s t a + p a l e s t i i n a l a i s v a l t i o t a + p a l e s t i i n a l a i s v a l t u u s k u n t a + p a l e s t i i n a l a i s v a n g e i s t a + p a l e s t i i n a l a i s v a n g i n + p a l e s t i i n a l a i s v a n k e j a + p a l e s t i i n a l a i s v a n k i a + p a l e s t i i n a l a i s v a n k i e n + p a l e s t i i n a l a i s v i r a n o m a i s e l l e + p a l e s t i i n a l a i s v i r a n o m a i s e n + p a l e s t i i n a l a i s v i r a n o m a i s e t + p a l e s t i i n a l a i s v i r a n o m a i s i a + p a l e s t i i n a l a i s v i r a n o m a i s i l l e + p a l e s t i i n a l a i s v i r a n o m a i s t e n + p a l e s t i i n a l a i s v ä e s t ö l l e + p a l e s t i i n a l a i s v ä e s t ö n + p a l e s t i i n a l a i s v ä e s t ö ä + p a l e s t i i n a l a i s v ä e s t ö ö n + p a l e s t i i n a l a i s y h t e i s k u n n a n + p a l e s t i i n a l a i s y h t e i s k u n n a s s a + p a l e s t i i n a l a i s y h t e i s k u n t a + p a l e s t i i n a l a i s y h t e i s ö + p a l e s t i i n a l a i s y h t e i s ö j e n + p a l e s t i i n a l a i s y h t e i s ö n + p a l e s t i i n a l a i s y h t e i s ö t + p a l e s t i i n a l a i s y h t e i s ö ö n + p a l e t t i k a l a + p a l e t t i k ä ä p i ö a h v e n + p a l e t t i p e i p p o + p a l e t t i t a n g a r a + p a l e t t i v i i r i ä i s k y y h k y + p a l i k o i t a + p a l i n d r o m i a l k u l u k u + p a l j a i n + p a l j a k k a j u u r i p e r h o n e n + p a l j a s t a a + p a l j a s t a a k s e e n + p a l j a s t a a k s e m m e + p a l j a s t a e n + p a l j a s t a i s i m m e + p a l j a s t a m a a n + p a l j a s t a m a t t a + p a l j a s t a m i s e k s i + p a l j a s t a n e e t + p a l j a s t a n u t + p a l j a s t a t t e + p a l j a s t a v a m p i a + p a l j a s t a v a t + p a l j a s t a v i n t a + p a l j a s t e t a a n + p a l j a s t e t t a v a + p a l j a s t e t u i s s a + p a l j a s t i + p a l j a s t i v a t + p a l j a s t u i + p a l j a s t u k s e t + p a l j a s t u m i s a s t e + p a l j a s t u s m a h d o l l i s u u k s i a + p a l j a s t u s s h a k k i + p a l j a s t u u + p a l j a s t u u k i n + p a l j a s t u v a t + p a l j o a k a a n + p a l j o n k a a n + p a l j o n k i n + p a l j o n k o + p a l j o n p a + p a l j o n p u h u v a + p a l j o n p u h u v a a + p a l j o n p u h u v i a + p a l j o o n + p a l j o s t a + p a l k a l l a + p a l k a l l i s e n + p a l k a l l i s i n a + p a l k a n + p a l k a n a l e n n u k s e n + p a l k a n a l e n n u k s e t + p a l k a n a l e n n u k s i a + p a l k a n a l e n n u k s i i n + p a l k a n a l e n n u k s i l l a + p a l k a n j a t k e e k s i + p a l k a n k o r o t u k s e n + p a l k a n k o r o t u k s e s t a + p a l k a n k o r o t u k s e t + p a l k a n k o r o t u k s i a + p a l k a n k o r o t u k s i i n + p a l k a n k o r o t u k s i l l a + p a l k a n k o r o t u k s i s t a + p a l k a n k o r o t u s + p a l k a n k o r o t u s s ä ä n n ö n + p a l k a n k o r o t u s t a + p a l k a n k o r o t u s t e n + p a l k a n k o r v a u k s i i n + p a l k a n l a s k e n n a s t a + p a l k a n l e i k k a u k s i s t a + p a l k a n l i s ä t + p a l k a n m a k s u + p a l k a n m a k s u i s s a + p a l k a n m a k s u j e n + p a l k a n m a k s u m u o t o j a + p a l k a n m a k s u n + p a l k a n m a k s u s t a + p a l k a n m a k s u u n + p a l k a n m e n e t y k s i s t ä + p a l k a n m e n e t y s t ä + p a l k a n m u k a u t u s l u k u j e n + p a l k a n m u o d o s t u k s e e n + p a l k a n m u o d o s t u k s e n + p a l k a n m u o d o s t u s + p a l k a n m u o d o s t u s j ä r j e s t e l m i ä + p a l k a n m u o d o s t u s t a + p a l k a n n o u s u a + p a l k a n n u t + p a l k a n s a a j a + p a l k a n s a a j a a + p a l k a n s a a j a n + p a l k a n s a a j a t + p a l k a n s a a j i a + p a l k a n s a a j i e n + p a l k a n s a a j i i n + p a l k a n s a a j i l l e + p a l k a n s a a j i l t a + p a l k a n s a a j i s t a + p a l k a n s i i r t o a + p a l k a n v ä h e n n y s t ä + p a l k a s t a a n + p a l k a t + p a l k a t a + p a l k a t o n t a + p a l k a t t a + p a l k a t t a e s s a + p a l k a t t a i s i i n + p a l k a t t a v a + p a l k a t t i i n + p a l k a t t o m i l l e + p a l k a t t o m i s t a + p a l k a t t u a + p a l k a t t u i h i n + p a l k a t t u j a + p a l k a t t u u n + p a l k a t u i s s a + p a l k a t u i s t a + p a l k a t u t + p a l k i n n o n + p a l k i n n o n j a k o t i l a i s u u t t a + p a l k i n n o n s a a j i e n + p a l k i n n o s t a + p a l k i n s a l m i + p a l k i n t o a + p a l k i n t o a a n + p a l k i n t o j a + p a l k i n t o j e n j a k o s e r e m o n i a a n + p a l k i n t o j u h l a + p a l k i n t o j ä r j e s t e l m ä + p a l k i n t o k o m i t e a n + p a l k i n t o n s a + p a l k i n t o s e r e m o n i a a n + p a l k i n t o s e r e m o n i a s s a + p a l k i t a + p a l k i t a a n + p a l k i t s e m i s j ä r j e s t e l m i ä + p a l k i t s e m i s j ä r j e s t e l m ä + p a l k i t s e m i s j ä r j e s t e l m ä t + p a l k i t s e v a m m i k s i + p a l k i t s e v a m p i + p a l k i t s e v a m p i a + p a l k i t s e v i n t a + p a l k i t t a i s i i n + p a l k i t t a v a + p a l k k a a m a l l a + p a l k k a a m a s s a + p a l k k a a m i s e e n + p a l k k a a m i s e k s i + p a l k k a a m i s e s t a + p a l k k a a m i s t a + p a l k k a a n + p a l k k a a v a t + p a l k k a d e f l a a t i o + p a l k k a d e f l a a t i o o n + p a l k k a d e f l a a t i o t a + p a l k k a d y n a m i i k a n + p a l k k a e h d o i s t a + p a l k k a e h d o t + p a l k k a e h t o j e n + p a l k k a e r i a r v o i s u u d e n + p a l k k a e r o a + p a l k k a e r o i h i n + p a l k k a e r o i l l a + p a l k k a e r o i l l e + p a l k k a e r o i n a + p a l k k a e r o i s s a + p a l k k a e r o i s t a + p a l k k a e r o j a + p a l k k a e r o j e n + p a l k k a e r o k u s t a n n u k s i s t a + p a l k k a e r o l l a + p a l k k a e r o n + p a l k k a e r o o n + p a l k k a e r o s s a + p a l k k a e r o s t a + p a l k k a e r o t + p a l k k a h a i t a r i + p a l k k a j o u s t o a + p a l k k a j o u s t o i h i n + p a l k k a j o u s t o i s t a + p a l k k a j o u s t o j a + p a l k k a j o u s t o j e n + p a l k k a j o u s t o t + p a l k k a j ä r j e s t e l m i e n + p a l k k a j ä r j e s t e l m i i n + p a l k k a j ä r j e s t e l m i ä + p a l k k a j ä r j e s t e l m ä + p a l k k a j ä r j e s t e l m ä s s ä + p a l k k a j ä r j e s t e l y j e n + p a l k k a k a t t o + p a l k k a k e h i t y k s e e n + p a l k k a k e h i t y k s e m m e + p a l k k a k e h i t y k s e n + p a l k k a k e h i t y k s e s s ä + p a l k k a k e h i t y k s e s t ä + p a l k k a k e h i t y s + p a l k k a k e h i t y s t ä + p a l k k a k i i s t o i s s a + p a l k k a k i i s t o j a + p a l k k a k i l p a i l u + p a l k k a k i l p a i l u n + p a l k k a k o m i t e a t + p a l k k a k o m p e n s a a t i o i n + p a l k k a k u i l u + p a l k k a k u i l u a + p a l k k a k u i l u n + p a l k k a k u i l u s t a + p a l k k a k u i l u u n + p a l k k a k u i t t i f e d e r a l i s m i i n + p a l k k a k u l u i h i n + p a l k k a k u l u j a + p a l k k a k u l u j e n + p a l k k a k u r i a + p a l k k a k u r i l l a + p a l k k a k u r i s t a + p a l k k a k u s t a n n u k s e t + p a l k k a k u s t a n n u k s i a + p a l k k a k u s t a n n u k s i a n s a + p a l k k a k u s t a n n u k s i e n + p a l k k a k u s t a n n u k s i i n + p a l k k a k u s t a n n u k s i l l a + p a l k k a k u s t a n n u k s i n + p a l k k a k u s t a n n u k s i s t a + p a l k k a k u s t a n n u s t e m m e + p a l k k a k u s t a n n u s t e n + p a l k k a k y s y m y k s e e n + p a l k k a k y s y m y k s e n + p a l k k a k y s y m y k s e s s ä + p a l k k a k y s y m y k s e s t ä + p a l k k a k y s y m y k s i s s ä + p a l k k a k y s y m y s + p a l k k a l e i k k a u k s e t + p a l k k a l e i k k a u k s i a + p a l k k a l e i k k a u k s i i n + p a l k k a l e i k k a u k s i s t a + p a l k k a l e i k k a u s t a + p a l k k a l u o k k i i n + p a l k k a m a l l i + p a l k k a m a l t i l l i s u u t t a + p a l k k a m a l t i n + p a l k k a m a l t i s t a + p a l k k a m a l t t i + p a l k k a m a l t t i a + p a l k k a m e n o j e n + p a l k k a m u k a u t u k s e t + p a l k k a m u k a u t u k s i a + p a l k k a m u k a u t u s + p a l k k a m u r h a + p a l k k a m u r h a a + p a l k k a m u r h a a j i a + p a l k k a m u r h a a j i e n + p a l k k a m u r h i a + p a l k k a n a u h o i n a + p a l k k a n e u v o t t e l u i h i n + p a l k k a n e u v o t t e l u i l l e + p a l k k a n e u v o t t e l u i s s a + p a l k k a n e u v o t t e l u i s t a + p a l k k a n e u v o t t e l u j a + p a l k k a n e u v o t t e l u j e n + p a l k k a n e u v o t t e l u t + p a l k k a n o r m e j a + p a l k k a n o r m i t + p a l k k a n s a + p a l k k a o i k e u d e n m u k a i s u u d e s t a + p a l k k a o i k e u d e t + p a l k k a o i k e u k s i a + p a l k k a o i k e u k s i l l e + p a l k k a o r j a t + p a l k k a o r j u u d e s t a + p a l k k a o r j u u s + p a l k k a p a i n e e t + p a l k k a p a i n e i d e n + p a l k k a p a i n o s t u s t a + p a l k k a p a k e t i t + p a l k k a p a k e t t i + p a l k k a p e r u s t e e n + p a l k k a p o l i t i i k a l l a + p a l k k a p o l i t i i k a n + p a l k k a p o l i t i i k a s t a + p a l k k a p o l i t i i k k a + p a l k k a p o l i t i i k k a a + p a l k k a p o l i t i i k k a a n + p a l k k a p o l i t i i k k o j a + p a l k k a p o l i t i i k o i t a + p a l k k a p u s s e j a + p a l k k a p u s s i a a n + p a l k k a r a j o i t u k s e t + p a l k k a r a j o i t u k s i a + p a l k k a r a j o i t u k s i i n + p a l k k a r a j o i t u s t e n + p a l k k a r a k e n n e + p a l k k a r a k e n n e t t a + p a l k k a r a k e n t e e n + p a l k k a r a k e n t e e s e e n + p a l k k a r a k e n t e e s s a + p a l k k a r a k e n t e e s t a + p a l k k a r a k e n t e i d e n + p a l k k a r a k e n t e i s i i n + p a l k k a r a k e n t e i s t a + p a l k k a r a t k a i s u i h i n + p a l k k a r a t k a i s u j e n + p a l k k a r i i t o i h i n + p a l k k a r ä s t i e n + p a l k k a s a a t a v a t + p a l k k a s a a t a v i e n + p a l k k a s o p i m u k s i a + p a l k k a s o p i m u k s i i n + p a l k k a s o p i m u k s i l l e + p a l k k a s o p i m u k s i s s a + p a l k k a s o p i m u s o s a p u o l t e n + p a l k k a s o p i m u s t e n + p a l k k a s o t u r e i t a + p a l k k a s o t u r i + p a l k k a s o t u r i e n + p a l k k a s o t u r i j o u k o t + p a l k k a s o t u r i t o i m i n n a n + p a l k k a s y r j i n n ä n + p a l k k a s y r j i n n ä s s ä + p a l k k a s y r j i n n ä s t ä + p a l k k a s y r j i n t ä + p a l k k a s y r j i n t ä ä + p a l k k a t a k u u r a h a s t o + p a l k k a t a k u u r a h a s t o o n + p a l k k a t a r k a s t u k s e t + p a l k k a t a r k a s t u k s i l l a + p a l k k a t a s a + p a l k k a t a s o + p a l k k a t a s o a + p a l k k a t a s o a a n + p a l k k a t a s o i s t a + p a l k k a t a s o j a + p a l k k a t a s o j e n + p a l k k a t a s o l l a + p a l k k a t a s o m m e + p a l k k a t a s o n + p a l k k a t a s o n s a + p a l k k a t a s o o n + p a l k k a t a s o s t a + p a l k k a t a s o v e r t a i l u t + p a l k k a t a u l u k k o + p a l k k a t a u l u k k o j e n + p a l k k a t i l a n t e e n + p a l k k a t i l a s t o j e n + p a l k k a t i l a s t o t + p a l k k a t u k e a + p a l k k a t u r v a a + p a l k k a t u r v a j ä r j e s t e l m ä s s ä + p a l k k a t u r v a j ä r j e s t e l m ä ä n + p a l k k a t u r v a n + p a l k k a t y ö + p a l k k a t y ö h ö n + p a l k k a t y ö k s i + p a l k k a t y ö l l e + p a l k k a t y ö m a h d o l l i s u u k s i e n + p a l k k a t y ö n + p a l k k a t y ö n t e k i j ä t + p a l k k a t y ö n t e k i j ö i d e n + p a l k k a t y ö s s ä + p a l k k a t y ö s t ä + p a l k k a t y ö t ä + p a l k k a u k s e n + p a l k k a u s j ä r j e s t e l m ä + p a l k k a u s j ä r j e s t e l m ä ä + p a l k k a u s j ä r j e s t e l m ä ä n + p a l k k a u s m e n e t t e l y i s s ä + p a l k k a u s m e n e t t e l y j e n + p a l k k a u s m ä ä r ä r a h o j a + p a l k k a u s p o l i t i i k a s s a + p a l k k a u s s ä ä n t ö j ä + p a l k k a u s t a p o j e n + p a l k k a u u d i s t u s + p a l k k a v a a t i m u k s i a + p a l k k a v e r o t + p a l k k a v e r o t u s t a + p a l k k i o i d e n + p a l k k i o i h i n + p a l k k i o i s t a + p a l k k i o i t a + p a l k k i o j ä r j e s t e l m i e n + p a l k k i o j ä r j e s t e l m i l l ä + p a l k k i o j ä r j e s t e l m i s t ä + p a l k k i o j ä r j e s t e l m ä l l ä + p a l k k i o j ä r j e s t e l m ä n + p a l k k i o j ä r j e s t e l m ä s s ä + p a l k k i o j ä r j e s t e l m ä ä + p a l k k i o j ä r j e s t e l y j ä + p a l k k i o k a a n + p a l k k i o k a u s i + p a l k k i o k e l p o i s i s t a + p a l k k i o m a k s u n + p a l k k i o m e t s ä s t ä j ä t + p a l k k i o n + p a l k k i o n m e t s ä s t ä j ä + p a l k k i o p a k e t e i s t a + p a l k k i o p a k e t t i i n + p a l k k i o p o l i t i i k a s t a + p a l k k i o p o l i t i i k k a + p a l k k i o p o l i t i i k k a a n s a + p a l k k i o r a k e n t e e t + p a l k k i o t + p a l k k i o t a + p a l k k i o t t a + p a l k k i o u u d i s t u k s e n + p a l k k i o y k s i k k ö j ä + p a l k k i s i l t a + p a l k k o i h i n + p a l k k o i n e e n + p a l k k o j a + p a l k k o j a a n + p a l k k o j a m m e + p a l k k o j e n + p a l k k o j e n k i n + p a l k o i l l a + p a l k o i s s a + p a l k o i s t a + p a l k o k a s v e i l l a + p a l k o k a s v e j a + p a l k o k a s v i e n + p a l k o k a s v i t + p a l k o r e h u k a s v i e n + p a l k o v i l j a t + p a l k o v i l j o i l l a + p a l k o v i l j o j a + p a l k o v i l j o j e n + p a l l a d a + p a l l a s k i i n t i ö i d e n + p a l l a s s o d a n + p a l l e a t y r ä + p a l l e k ö l i + p a l l e r o k i r j o t ä h t i + p a l l e r o p i l v i + p a l l e r o p o r o n j ä k ä l ä + p a l l e r o t e e + p a l l o a b e r r a a t i o + p a l l o a m f o r a k u l t t u u r i + p a l l o h o r t e n s i a + p a l l o h u h t a s i e n i + p a l l o h u o n e e n + p a l l o i s t a + p a l l o k i v i + p a l l o l i i t t o + p a l l o m e r i + p a l l o n i v e l + p a l l o n i v e l n u k k e + p a l l o n p u o l i s k o a + p a l l o n p u o l i s k o n + p a l l o p a l a p e l i + p a l l o p e i l i + p a l l o p e l i + p a l l o p ä ä v a l a a t + p a l l o s a l a m a + p a l l o s a r a + p a l l o t r i g o n o m e t r i a + p a l l o t t e l u a + p a l l o t t e l u p e l i ä + p a l l o t u o l i + p a l l o t ä h t i t i e d e + p a l m u b u l b u l i + p a l m u h a u k k a + p a l m u j a + p a l m u k a i j a + p a l m u k a k a d u + p a l m u k o r p p i k o t k a + p a l m u k y y h k y + p a l m u n y d i n j a u h o a + p a l m u p u i t a + p a l m u r i p s i ä i n e n + p a l m u s a a r e t + p a l m u s u n n u n t a i + p a l m u t a s k u t + p a l m u v a r i s + p a l m u v a r p u n e n + p a l m u v i h e r t i k k a + p a l m u v i l j e l m ä k s i + p a l m u ö l j y + p a l m u ö l j y l l e + p a l m u ö l j y n + p a l m u ö l j y s t ä + p a l m u ö l j y t u o t a n n o n + p a l m u ö l j y v i l j e l m i ä + p a l m u ö l j y y n + p a l m u ö l j y ä + p a l o a l u e + p a l o a l u e i d e n + p a l o a l u e i t a + p a l o a s e m a + p a l o a s e m a n + p a l o a u t o + p a l o h a r j o i t u s + p a l o h ä l y t t i m e t + p a l o h ä l y t t i m i ä + p a l o h ä l y t y k s e n + p a l o i k s i + p a l o j a + p a l o j e n + p a l o k e s t ä v y y d e n + p a l o k u n n a n + p a l o k u n n a t + p a l o k u n n i l l e + p a l o k u n t a + p a l o k u n t a a + p a l o k u n t a m m e + p a l o k u n t a p a l v e l u j a + p a l o k u n t i a + p a l o k u n t i e n + p a l o k u o r m a n + p a l o k ä m m e k k ä + p a l o k ä r k i + p a l o l a i t o k s e n + p a l o l a i t o s + p a l o l e t k u l l a + p a l o m i e h e s t ä + p a l o m i e h e t + p a l o m i e h i ä + p a l o m i e s + p a l o m i e s t e n + p a l o m u u r e i n a + p a l o m ä ä r ä y k s i ä + p a l o n e s t o a i n e + p a l o n e s t o a i n e e n + p a l o n e s t o a i n e e n a + p a l o n e s t o a i n e e s e e n + p a l o n e s t o a i n e e t + p a l o n e s t o a i n e i d e n + p a l o n e s t o a i n e i l l e + p a l o n e s t o a i n e i n a + p a l o n e s t o a i n e i s i i n + p a l o n e s t o a i n e i s t a + p a l o n e s t o a i n e i t a + p a l o n e s t o a i n e t t a + p a l o n e s t o k e m i k a a l e j a + p a l o n e s t o n + p a l o n e s t o t u o t t e i s t a + p a l o n k a t k a i s u l i n j o i h i n + p a l o n k e s t ä v y y t t ä + p a l o n s a m m u t t i m i s s a + p a l o n s a m m u t u s h a r j o i t u k s i k s i + p a l o n s a m m u t u s k o u l u t u k s e e n + p a l o n t o r j u n n a n + p a l o n t o r j u n n a s s a + p a l o n t o r j u n n a s t a + p a l o n t o r j u n t a + p a l o n t o r j u n t a a + p a l o n t o r j u n t a a n + p a l o n t o r j u n t a j o u k k o j a + p a l o n t o r j u n t a j o u k k o j e n + p a l o n t o r j u n t a j o u k o t + p a l o n t o r j u n t a j ä r j e s t e l m i s s ä + p a l o n t o r j u n t a j ä r j e s t e l m ä n + p a l o n t o r j u n t a k a l u s t o n + p a l o n t o r j u n t a k e s k u s + p a l o n t o r j u n t a l a i t t e e t + p a l o n t o r j u n t a l a i t t e i d e n + p a l o n t o r j u n t a l a i t t e i t a + p a l o n t o r j u n t a l e n t o k o n e i s t a + p a l o n t o r j u n t a l e n t o k o n e i t a + p a l o n t o r j u n t a o p e r a a t i o i h i n + p a l o n t o r j u n t a r e s u r s s e j a + p a l o n t o r j u n t a r e s u r s s i t + p a l o n t o r j u n t a s t r a t e g i a n + p a l o n t o r j u n t a t o i m i i n + p a l o n t o r j u n t a v a l m i u k s i a + p a l o n t o r j u n t a v a l m i u k s i e n + p a l o n t o r j u n t a v ä l i n e i k s i + p a l o n t o r j u n t a v ä l i n e i s i i n + p a l o n t o r j u n t a v ä l i n e i t ä + p a l o n t o r j u n t a y h d i s t y k s e n + p a l o p a i k a l l a + p a l o p i s t e + p a l o p o m m e j a + p a l o p o m m i + p a l o p u h e e n s a + p a l o p u h e e s t a + p a l o p u h e e t + p a l o p u h e i d e n + p a l o p u h e i s s a m m e + p a l o p u h e i t a + p a l o r y p ä l e h a p p o + p a l o s a m m u t i n + p a l o s a m m u t t i m e t + p a l o s a m m u t t i m i a + p a l o s i r k k a + p a l o s u o j a + p a l o s u o j e l u a + p a l o s u o j e l u n + p a l o s u o j e l u s t r a t e g i a t + p a l o s u o j e l u s t r a t e g i o i d e n + p a l o t + p a l o t e i t ä + p a l o t e s t a u s + p a l o t o r j u n n a s s a + p a l o t u r v a + p a l o t u r v a l l i s u u d e n + p a l o t u r v a l l i s u u d e s t a + p a l o t u r v a l l i s u u s + p a l o t u r v a l l i s u u s p o l i t i i k k a a + p a l o t u r v a l l i s u u s t o d i s t u s + p a l o t u r v a l l i s u u s v a s t a a v a t + p a l o t u r v a l l i s u u t e e n + p a l o t u r v a l l i s u u t t a + p a l o v a a r a + p a l o v a a r a n + p a l o v a h i n k o j e n + p a l o v a k u u t u k s e n + p a l o v a k u u t u k s e s t a + p a l o v a k u u t u s t u r v a a + p a l o v a m m o j a + p a l o v a m m o j e n + p a l o v a r o i t i n + p a l o v i r a n o m a i s t e n + p a l o ö l j y j ä + p a l s a m i k ö y n n ö s + p a l s a m i p i h t a + p a l s a m i p o p p e l i + p a l s a s i r r i + p a l t u r i t u p a k k a + p a l u u a j a n k o h d a s t a m m e + p a l u u a p u r a h o j a + p a l u u j ä r j e s t e l y i s s ä + p a l u u k a n a v a + p a l u u k i e l t o a + p a l u u k u t s u n + p a l u u l e n n o l l a + p a l u u l e n n o l l e + p a l u u l e n t o a n i + p a l u u l e n t o j a + p a l u u l e n t o n s a + p a l u u l i p p u a a n + p a l u u l i p u n + p a l u u l l a + p a l u u l l e + p a l u u l t a + p a l u u m a a s s a + p a l u u m a h d o l l i s u u d e t + p a l u u m a h d o l l i s u u k s i a + p a l u u m a t k a a n + p a l u u m a t k a a n s a + p a l u u m a t k a l l a + p a l u u m a t k a n + p a l u u m a t k a n s a + p a l u u m a t k a s t a + p a l u u m u u t t a j a t + p a l u u m u u t t a j i e n + p a l u u m u u t t o + p a l u u m u u t t o a + p a l u u m u u t t o o n + p a l u u m u u t t o s o p i m u k s e t + p a l u u m u u t t o s o p i m u k s i s t a + p a l u u n + p a l u u n s a + p a l u u o h j e l m i a + p a l u u o h j e l m i s t a + p a l u u o i k e u d e n + p a l u u o i k e u s + p a l u u o i k e u t t a + p a l u u o i k e u t t a a n + p a l u u o l o s u h t e i t a + p a l u u o p e r a a t i o i d e n + p a l u u p o l i t i i k k a + p a l u u p o l i t i i k k a a n + p a l u u p r o s e s s i a + p a l u u r a h a s t o + p a l u u r a h a s t o a + p a l u u r a h a s t o o n + p a l u u s i l m u k k a + p a l u u s t a + p a l u u t a + p a l u u t i e + p a l u u t u k i a + p a l u u v i e r a i l u + p a l v e l e e + p a l v e l e e k i n + p a l v e l e m a a n + p a l v e l e m i s e k s i + p a l v e l e m m e + p a l v e l e v a s s a + p a l v e l e v a t + p a l v e l i + p a l v e l i m e l l a + p a l v e l i m e n + p a l v e l i v a t + p a l v e l l a + p a l v e l l a k s e e n + p a l v e l l a k s e n i + p a l v e l l e e k s i + p a l v e l l e e t + p a l v e l t a v a + p a l v e l t u a a n + p a l v e l u a + p a l v e l u a l a + p a l v e l u a l a a + p a l v e l u a l a a n + p a l v e l u a l a a n s a + p a l v e l u a l a k s i + p a l v e l u a l a l l a + p a l v e l u a l a l l e + p a l v e l u a l a l t a + p a l v e l u a l a m m e + p a l v e l u a l a n + p a l v e l u a l a n s a + p a l v e l u a l a s t a + p a l v e l u a l a t + p a l v e l u a l o i h i n + p a l v e l u a l o i l l a + p a l v e l u a l o i l l e + p a l v e l u a l o i s t a + p a l v e l u a l o i t e + p a l v e l u a l o j a + p a l v e l u a l o j a a n + p a l v e l u a l o j a m m e + p a l v e l u a l o j e n + p a l v e l u a l t t i u t t a + p a l v e l u a m m a t e i l l e + p a l v e l u a m m a t i t + p a l v e l u a s u m i s e n + p a l v e l u d i r e k t i i v i + p a l v e l u d i r e k t i i v i a s i a n + p a l v e l u d i r e k t i i v i e h d o t u k s e n + p a l v e l u d i r e k t i i v i e h d o t u k s e s s a + p a l v e l u d i r e k t i i v i e h d o t u k s e s t a + p a l v e l u d i r e k t i i v i e h d o t u s + p a l v e l u d i r e k t i i v i e h d o t u s k i n + p a l v e l u d i r e k t i i v i e h d o t u s t a + p a l v e l u d i r e k t i i v i e n + p a l v e l u d i r e k t i i v i i n + p a l v e l u d i r e k t i i v i k s i + p a l v e l u d i r e k t i i v i l l e + p a l v e l u d i r e k t i i v i l l ä + p a l v e l u d i r e k t i i v i l t ä + p a l v e l u d i r e k t i i v i l u o n n o k s e n + p a l v e l u d i r e k t i i v i l u o n n o k s e s t a + p a l v e l u d i r e k t i i v i l u o n n o s + p a l v e l u d i r e k t i i v i l u o n n o s t a + p a l v e l u d i r e k t i i v i n + p a l v e l u d i r e k t i i v i n k i n + p a l v e l u d i r e k t i i v i n k ä ä n + p a l v e l u d i r e k t i i v i n ä + p a l v e l u d i r e k t i i v i p r o s e s s i s t a + p a l v e l u d i r e k t i i v i s s ä + p a l v e l u d i r e k t i i v i s s ä h ä n + p a l v e l u d i r e k t i i v i s t ä + p a l v e l u d i r e k t i i v i ä + p a l v e l u e d u t + p a l v e l u e l e m e n t t i + p a l v e l u e l i n k e i n o + p a l v e l u h a n k i n n a n + p a l v e l u h a n k i n t a s o p i m u k s i a + p a l v e l u h a n k i n t o j a + p a l v e l u h e n k i l ö s t ö n + p a l v e l u h e n k i s e m m ä n + p a l v e l u h e n k i s e n + p a l v e l u h e n k i s e t + p a l v e l u i d e n + p a l v e l u i h i n + p a l v e l u i l l a + p a l v e l u i l l e + p a l v e l u i n + p a l v e l u i n a + p a l v e l u i n f r a s t r u k t u u r i + p a l v e l u i s s a + p a l v e l u i s t a + p a l v e l u i t a + p a l v e l u i t a a n + p a l v e l u j a + p a l v e l u j a a n + p a l v e l u j e n + p a l v e l u j e n k i n + p a l v e l u j e n s a + p a l v e l u j e n t a r j o a j a t + p a l v e l u j e n t a r j o a j i a + p a l v e l u j e n t a r j o a j i e n + p a l v e l u j e n t a r j o a j i l l e + p a l v e l u j ä r j e s t ö t + p a l v e l u k a n a v a n + p a l v e l u k a u p a l l e + p a l v e l u k a u p a n + p a l v e l u k a u p a s s a + p a l v e l u k a u p a s t a + p a l v e l u k a u p p a + p a l v e l u k a u p p a a + p a l v e l u k a u p p a a n + p a l v e l u k a u p p a m a r k k i n o i d e n + p a l v e l u k a u p p a m i e t i n n ö n + p a l v e l u k a u p p a m i e t i n t ö ä + p a l v e l u k e s k e i n e n + p a l v e l u k e s k u s t a + p a l v e l u k e t j u n + p a l v e l u k o k o n a i s u u t t a + p a l v e l u k o n s e p t i t + p a l v e l u k s e e n o t t a m i s m e n e t t e l y ä + p a l v e l u k s e e n o t t o k i l p a i l u i s t a + p a l v e l u k s e e n o t t o k i l p a i l u j e n s a + p a l v e l u k s e e n o t t o m e n e t t e l y i h i n + p a l v e l u k s e e n o t t o m e n e t t e l y i h i n s ä + p a l v e l u k s e e n o t t o m e n e t t e l y i s s ä + p a l v e l u k s e e n o t t o m e n e t t e l y i s t ä + p a l v e l u k s e e n o t t o m e n e t t e l y j e n + p a l v e l u k s e e n o t t o m e n e t t e l y j ä ä n + p a l v e l u k s e e n o t t o m e n e t t e l y t + p a l v e l u k s e e n o t t o m e n e t t e l y y n + p a l v e l u k s e e n s a + p a l v e l u k s e n + p a l v e l u k s e s s a + p a l v e l u k s e s s a a n + p a l v e l u k s i a + p a l v e l u k u l t t u u r i + p a l v e l u k u l t t u u r i a + p a l v e l u k u l t t u u r i n + p a l v e l u k y s y m y k s e e n + p a l v e l u l a a t u v a a t i m u k s e t + p a l v e l u l a i n s ä ä d ä n n ö n + p a l v e l u l a i n s ä ä d ä n t ö + p a l v e l u l a i t o k s i a + p a l v e l u l a i t o s + p a l v e l u l a k i + p a l v e l u l a s k u j a a n + p a l v e l u l l a + p a l v e l u l u o k a s s a + p a l v e l u m a h d o l l i s u u d e t + p a l v e l u m a k s u + p a l v e l u m a k s u j a + p a l v e l u m a l l e i h i n + p a l v e l u m a l l i e n + p a l v e l u m a l l i n + p a l v e l u m a r k k i n a t + p a l v e l u m a r k k i n o i d e n + p a l v e l u m a r k k i n o i h i n + p a l v e l u m a r k k i n o i l l a + p a l v e l u m a r k k i n o i l l e + p a l v e l u m a r k k i n o i s t a + p a l v e l u m a r k k i n o i t a + p a l v e l u m a r k k i n o i t a a n + p a l v e l u m a r k k i n o i t a m m e + p a l v e l u m u o t o + p a l v e l u m u o t o i h i n + p a l v e l u m u o t o i l u + p a l v e l u m ä ä r i t e l m ä n + p a l v e l u n + p a l v e l u n a + p a l v e l u n e u v o t t e l u i s t a + p a l v e l u n h a r j o i t t a j i e n + p a l v e l u n i p p u a + p a l v e l u n k ä y t t ä j i l l e + p a l v e l u n s a a n t i m a h d o l l i s u u k s i a + p a l v e l u n t a r j o a j a + p a l v e l u n t a r j o a j a a + p a l v e l u n t a r j o a j a a n + p a l v e l u n t a r j o a j a l l a + p a l v e l u n t a r j o a j a l l e + p a l v e l u n t a r j o a j a l t a a n + p a l v e l u n t a r j o a j a n + p a l v e l u n t a r j o a j a n a + p a l v e l u n t a r j o a j a n n e + p a l v e l u n t a r j o a j a n s a + p a l v e l u n t a r j o a j a s t a + p a l v e l u n t a r j o a j a t + p a l v e l u n t a r j o a j a y r i t y k s e t + p a l v e l u n t a r j o a j i a + p a l v e l u n t a r j o a j i a a n + p a l v e l u n t a r j o a j i e n + p a l v e l u n t a r j o a j i i n + p a l v e l u n t a r j o a j i l l a + p a l v e l u n t a r j o a j i l l e + p a l v e l u n t a r j o a j i l t a + p a l v e l u n t a r j o a j i n a + p a l v e l u n t a r j o a j i s t a + p a l v e l u n t a r j o n n a l l e + p a l v e l u n t a r j o n n a s t a + p a l v e l u n t a r j o n t a + p a l v e l u n t u o t t a j i a + p a l v e l u n t u o t t a j i e n + p a l v e l u n t u o t t a j i k s i + p a l v e l u n u m e r o j e n + p a l v e l u n u m e r o k o n s e p t i i n + p a l v e l u n u m e r o t + p a l v e l u o l o s u h t e i d e n + p a l v e l u o p e r a a t t o r e i l l a + p a l v e l u o r g a n i s a a t i o + p a l v e l u o r g a n i s a a t i o i l l e + p a l v e l u o r g a n i s a a t i o o n + p a l v e l u o s a + p a l v e l u p a k e t e i s t a + p a l v e l u p a k e t t e j a + p a l v e l u p i s t e + p a l v e l u p i s t e e n + p a l v e l u p i s t e i d e n + p a l v e l u p i s t e i s t ä + p a l v e l u p i s t e i t ä + p a l v e l u p i s t e t t ä + p a l v e l u p o l i t i i k a l l a + p a l v e l u p r o s e s s i e n + p a l v e l u p ä ä o m i e n + p a l v e l u r a k e n n e t t a + p a l v e l u s e k t o r i + p a l v e l u s e k t o r i a + p a l v e l u s e k t o r i e n + p a l v e l u s e k t o r i i n + p a l v e l u s e k t o r i l l a + p a l v e l u s e k t o r i l l e + p a l v e l u s e k t o r i l t a + p a l v e l u s e k t o r i n + p a l v e l u s e k t o r i n s a + p a l v e l u s e k t o r i s t a + p a l v e l u s e t e l i j ä r j e s t e l m ä s t ä + p a l v e l u s e t e l i t + p a l v e l u s i t o u m u s t e n + p a l v e l u s j a k s o n + p a l v e l u s k o i r a a + p a l v e l u s o p i m u k s e n + p a l v e l u s o p i m u k s e t + p a l v e l u s o p i m u k s e t k i n + p a l v e l u s o p i m u k s i a + p a l v e l u s o p i m u k s i s t a + p a l v e l u s o p i m u s + p a l v e l u s o p i m u s t e n + p a l v e l u s r e v o l v e r i + p a l v e l u s s u h t e e n + p a l v e l u s t a + p a l v e l u s t y ö + p a l v e l u s v u o s i k s i + p a l v e l u s v u o s i l l a a n + p a l v e l u s v u o t t a + p a l v e l u s v ä e s t ä + p a l v e l u t + p a l v e l u t a l o s s a + p a l v e l u t a l o u d e l l e + p a l v e l u t a l o u d e n + p a l v e l u t a l o u k s i a + p a l v e l u t a l o u s + p a l v e l u t a l o u t e e n + p a l v e l u t a l o u t e m m e + p a l v e l u t a l o u t t a + p a l v e l u t a r j o n n a n + p a l v e l u t a r j o n t a + p a l v e l u t a r j o n t a a + p a l v e l u t a s o + p a l v e l u t a s o a + p a l v e l u t a s o j a + p a l v e l u t a s o n + p a l v e l u t a s o n s a + p a l v e l u t a s o s o p i m u k s e n + p a l v e l u t a s o s o p i m u k s i i n + p a l v e l u t a s o s o p i m u s + p a l v e l u t a s o s t a + p a l v e l u t e h t ä v ä + p a l v e l u t e h t ä v ä n + p a l v e l u t e h t ä v ä t + p a l v e l u t e o l l i s u u d e l l e + p a l v e l u t e o l l i s u u d e n + p a l v e l u t e o l l i s u u s + p a l v e l u t e o l l i s u u t e m m e + p a l v e l u t o i m i a l o j a + p a l v e l u t o i m i l u p i e n + p a l v e l u t o i m i n n a n + p a l v e l u t o i m i n n a s t a + p a l v e l u t o i m i n t a + p a l v e l u t o i m i n t a a + p a l v e l u t o i m i n t o j e n + p a l v e l u t y y p i n + p a l v e l u t y y p p e j ä + p a l v e l u t y ö n t e k i j ö i l l e + p a l v e l u u n + p a l v e l u v a a t i m u k s i s t a + p a l v e l u v a l i k o i m a + p a l v e l u v a l i k o i m a a + p a l v e l u v a l i k o i m a n + p a l v e l u v a l l a n k u m o u s + p a l v e l u v e l v o i t t e i l l a + p a l v e l u v e l v o l l i s u u s + p a l v e l u v e r k k o n s a + p a l v e l u v e r k o n + p a l v e l u v e r k o s t o a + p a l v e l u v i r r a n + p a l v e l u y h t e i s k u n n a s s a + p a l v e l u y h t e i s k u n t a + p a l v e l u y h t e i s k u n t a a n + p a l v e l u y m p ä r i s t ö i s t ä + p a l v e l u y r i t y k s e t + p a l v e l u y r i t y k s i k s i + p a l v e l u y r i t y k s i l l e + p a l v e l u y r i t y k s i l l ä + p a l v e l u y r i t y k s i s s ä + p a l v e l u y r i t y k s i ä + p a l v e l u y r i t y s t e n + p a l v o n t a p a i k k o j a + p a l v o t a a n + p a m p a k i r v i n e n + p a m p a p ö l l ö n e n + p a m p a s a m m a l t i k k a + p a m p a s i r k k u + p a m p a s u o h a u k k a + p a m p a v a r p u s p ö l l ö + p a n a f r i k k a l a i s e n + p a n a f r i k k a l a i s e t + p a n a m a h a t t u + p a n a m a n a r a + p a n a m a n h o h t o k o l i b r i + p a n a m a n k a n n a s + p a n a m a n l ö r p p ö t a n g a r a + p a n a m a n p ö l l ö n e n + p a n a m a n r a s t u l i + p a n a m a n s m a r a g d i k o l i b r i + p a n a m a n s u o m u k i p u a j a + p a n a m a n t r o g o n i + p a n d a k ä ä p i ö a h v e n + p a n d e e m i s t e n + p a n d e m i a a n + p a n d e m i a h a r j o i t u k s e n + p a n d e m i a h ä l y t y k s e n + p a n d e m i a k r i i s i e n + p a n d e m i a n + p a n d e m i a r i s k i e n + p a n d e m i a r i s k i i n + p a n d e m i a r o k o t e t a r p e e n + p a n d e m i a r o k o t t e i d e n + p a n d e m i a s u u n n i t e l m a + p a n d e m i a t i l a n t e i s s a + p a n d e m i a t y ö r y h m i ä + p a n d e m i a u h k a n + p a n d e m i a u h k i a + p a n d e m i a v a a r a + p a n d e m i a v a i h e t t a + p a n d e m i a v a r o i t u k s e n + p a n d e m i a v a r o i t u s a s t e i k k o a + p a n d e m i a v i r u k s e k s i + p a n d e m i a v i r u k s e l l e + p a n d e m i a v i r u s t a + p a n d e m i o i t a + p a n e e + p a n e e l i a i n e i s t o + p a n e e l i j ä r j e s t e l m ä n + p a n e e l i k e s k u s t e l u + p a n e e l i k e s k u s t e l u i h i n + p a n e e l i k e s k u s t e l u j a + p a n e e l i k e s k u s t e l u n + p a n e e l i k e s k u s t e l u s t a + p a n e e l i k e s k u s t e l u u n + p a n e e l i l a u s u n t o + p a n e e l i l l a + p a n e e l i l t a + p a n e e l i n + p a n e e l i s s a + p a n e m a a n + p a n e m a t t a + p a n e m i s e k s i + p a n e m i s e s t a + p a n e m m e + p a n e n + p a n e u d u t a + p a n e u d u t a a n + p a n e u d u t t a v a + p a n e u r o o p p a l a i s e e n + p a n e u r o o p p a l a i s e n + p a n e u r o o p p a l a i s e n a + p a n e u r o o p p a l a i s t a + p a n e u r o o p p a l a i s t e n + p a n e u t u a + p a n e u t u i + p a n e u t u k a a m m e + p a n e u t u m a a n + p a n e u t u m i s e s t a + p a n e u t u n e e n s a + p a n e u t u n e e t + p a n e u t u u + p a n e u t u v a a + p a n e v a t + p a n i i k i n + p a n i i k i n o m a i s e s t i + p a n i i k i s s a + p a n i i k k i a + p a n i i k k i a a l l o s s a + p a n i i k k i h ä i r i ö + p a n i i k k i i n + p a n i i k k i j a l k a p a l l o s t a + p a n i i k k i k o h t a u s + p a n i i k k i l a i n s ä ä d ä n t ö + p a n i i k k i p ä ä t ö k s e e n + p a n i i k k i r a t k a i s u j a + p a n i i k k i r e a k t i o + p a n i i k k i r e a k t i o l t a + p a n i i k k i r e a k t i o n + p a n i i k k i r e a k t i o n a + p a n i i k k i r e a k t i o s t a + p a n i i k k i t i l a n t e e s s a + p a n i i k k i t o i m i i n + p a n i m o i s t a + p a n i m o s o p i m u k s i a + p a n i m o s o p i m u k s i s t a + p a n i m o t e o l l i s u u d e n + p a n i m o t e o l l i s u u s + p a n i n + p a n k a a + p a n k a a m m e + p a n k e i l l a k i n + p a n k e i l l e + p a n k e i s s a + p a n k e i s t a + p a n k i l t a + p a n k i n + p a n k i n j o h t a j a + p a n k i n j o h t a j a l l e + p a n k i n j o h t a j a n + p a n k i n j o h t a j a n s a + p a n k i n j o h t a j a t + p a n k i n j o h t a j i e n + p a n k i n j o h t a j i l l e + p a n k i s s a + p a n k i s t a + p a n k i t + p a n k k e i h i n + p a n k k e j a + p a n k k i a + p a n k k i a l a + p a n k k i a l a a + p a n k k i a l a a n + p a n k k i a l a l l a + p a n k k i a l a l l e + p a n k k i a l a l t a + p a n k k i a l a n + p a n k k i a l a s t a + p a n k k i a l o i l l a + p a n k k i a l o i l l e + p a n k k i a u t o m a a t e i l l a + p a n k k i a u t o m a a t e i s s a + p a n k k i a u t o m a a t e i s t a + p a n k k i a u t o m a a t i l l e + p a n k k i a u t o m a a t i s t a + p a n k k i a u t o m a a t i t + p a n k k i a u t o m a a t t e i h i n + p a n k k i a u t o m a a t t e j a + p a n k k i a u t o m a a t t i + p a n k k i a u t o m a a t t i e n + p a n k k i a u t o m a a t t i n o s t o i h i n + p a n k k i a u t o m a a t t i n o s t o j e n + p a n k k i b o n u k s i a + p a n k k i d i r e k t i i v i + p a n k k i d i r e k t i i v i e n + p a n k k i d i r e k t i i v i i n + p a n k k i d i r e k t i i v i n + p a n k k i d i r e k t i i v i s s ä + p a n k k i d i r e k t i i v i ä + p a n k k i e n + p a n k k i h o l v e i s s a + p a n k k i h o l v i + p a n k k i i n + p a n k k i i r e i s t a + p a n k k i i r e i t a + p a n k k i i r i a + p a n k k i i r i e n + p a n k k i i r i l i i k k e i t ä m m e + p a n k k i j ä r j e s t e l m i e m m e + p a n k k i j ä r j e s t e l m i e n + p a n k k i j ä r j e s t e l m i i n s ä + p a n k k i j ä r j e s t e l m i l l e + p a n k k i j ä r j e s t e l m i ä + p a n k k i j ä r j e s t e l m ä + p a n k k i j ä r j e s t e l m ä l l e + p a n k k i j ä r j e s t e l m ä l t ä + p a n k k i j ä r j e s t e l m ä m m e + p a n k k i j ä r j e s t e l m ä n + p a n k k i j ä r j e s t e l m ä n s ä + p a n k k i j ä r j e s t e l m ä s s ä + p a n k k i j ä r j e s t e l m ä s t ä + p a n k k i j ä r j e s t e l m ä t + p a n k k i j ä r j e s t e l m ä ä + p a n k k i j ä r j e s t e l m ä ä m m e + p a n k k i j ä r j e s t e l m ä ä n + p a n k k i j ä r j e s t e l m ä ä n s ä + p a n k k i j ä r j e s t ö i l t ä + p a n k k i k i n + p a n k k i k i r j a t + p a n k k i k o m i t e a + p a n k k i k o m i t e a a + p a n k k i k o m i t e a s s a + p a n k k i k o n s e r n e i h i n + p a n k k i k o n s e r n e i s t a + p a n k k i k o r k o i h i n + p a n k k i k o r o i l l a + p a n k k i k o r t i l l a + p a n k k i k o r t i t + p a n k k i k o r t t e j a + p a n k k i k o r t t e j a a n + p a n k k i k o r t t i + p a n k k i k o r t t i a + p a n k k i k o r t t i e n + p a n k k i k o r t t i j ä r j e s t e l m i e n + p a n k k i k o r t t i m a k s u t + p a n k k i k o r t t i m u o d o s s a + p a n k k i k o r t t i v e r k o s t o i s t a + p a n k k i k r i i s i + p a n k k i k r i i s i e n + p a n k k i k r i i s i i n + p a n k k i k r i i s i k s i + p a n k k i k r i i s i n + p a n k k i k r i i s i s s ä + p a n k k i k r i i s i s t ä + p a n k k i k r i i s i t + p a n k k i k r i i s i ä + p a n k k i k u l t t u u r i e n + p a n k k i k u l u i n a + p a n k k i k u l u i s t a + p a n k k i k u l u j a + p a n k k i k u l u j e n + p a n k k i l a i n a + p a n k k i l a i n a a + p a n k k i l a i n a n + p a n k k i l a i n a p ä ä t ö k s e n + p a n k k i l a i n a r a h o i t t e i n e n + p a n k k i l a i n a t + p a n k k i l a i n o i s t a + p a n k k i l a i n o i t u s t a + p a n k k i l a i n o j a + p a n k k i l a i n o j e n + p a n k k i l a i n s ä ä d ä n n ö n + p a n k k i l a i n s ä ä d ä n t ö ä + p a n k k i l a i t o k s e n + p a n k k i l a i t o k s e t + p a n k k i l a i t o k s i i n + p a n k k i l a i t o s + p a n k k i l a i t o s t e n + p a n k k i l a k e i h i n + p a n k k i l i i k e t o i m i n t a a + p a n k k i l i i t o t + p a n k k i l i i t t o u t u m i a + p a n k k i l u o t o t + p a n k k i l u o t t o + p a n k k i l u o t t o a + p a n k k i l u o t t o i h i n + p a n k k i l u o t t o j a + p a n k k i l u o t t o j e n + p a n k k i l u o t t o v ä l i n e i t ä + p a n k k i l u p a a + p a n k k i m a a i l m a + p a n k k i m a a i l m a n + p a n k k i m a a i l m a s s a + p a n k k i m a k s u i h i n + p a n k k i m a k s u i l l a + p a n k k i m a k s u i n a + p a n k k i m a k s u i s t a + p a n k k i m a k s u j a + p a n k k i m a k s u j e n + p a n k k i m a k s u l i i k e n t e e n + p a n k k i m a k s u n s a + p a n k k i m a k s u t + p a n k k i m a k s u u n + p a n k k i m a r k k i n o i l l a + p a n k k i m a r k k i n o i l t a + p a n k k i m a r k k i n o i s t a + p a n k k i n e u v o s t o + p a n k k i p a l v e l u a + p a n k k i p a l v e l u i d e n + p a n k k i p a l v e l u i t a + p a n k k i p a l v e l u j a + p a n k k i p a l v e l u j e n + p a n k k i p a r a t i i s i t + p a n k k i p e t o s t e n + p a n k k i p i i r i n + p a n k k i p o l i t i i k k a a + p a n k k i p ä ä o m a + p a n k k i r a h o i t u k s e n + p a n k k i r a h o i t u s t a + p a n k k i r a k e n t e e n + p a n k k i r a k e n t e e t + p a n k k i r a k e n t e i s t a + p a n k k i r a k e n t e i t a + p a n k k i r i s k i e n + p a n k k i r o s v o + p a n k k i r y h m ä l l e + p a n k k i r y ö s t ä j ä s t ä + p a n k k i r y ö s t ö + p a n k k i r y ö s t ö n + p a n k k i s a l a i s u u d e l l a + p a n k k i s a l a i s u u d e n + p a n k k i s a l a i s u u d e s t a + p a n k k i s a l a i s u u s + p a n k k i s a l a i s u u s k y s y m y s + p a n k k i s a l a i s u u s k ä y t ä n t ö + p a n k k i s a l a i s u u t e e n + p a n k k i s a l a i s u u t t a + p a n k k i s e k t o r i + p a n k k i s e k t o r i a + p a n k k i s e k t o r i i n + p a n k k i s e k t o r i l l a + p a n k k i s e k t o r i l l e + p a n k k i s e k t o r i l t a + p a n k k i s e k t o r i m m e + p a n k k i s e k t o r i n + p a n k k i s e k t o r i s t a + p a n k k i s e t e l e i t ä + p a n k k i s i i r r o i s t a + p a n k k i s i i r t o i h i n + p a n k k i s i i r t o j a + p a n k k i s i i r t o j e n + p a n k k i s i i r t o t i e t o j a + p a n k k i s i l t a + p a n k k i s t a n d a r d e j a + p a n k k i s t a n d a r d i e n + p a n k k i s t r e s s i t e s t e j ä + p a n k k i s u l a u t u m i a + p a n k k i s u o r i t u s t e n + p a n k k i s u v u i s t a + p a n k k i s ä ä n t e l y n + p a n k k i s ä ä n t e l y v i r a n o m a i n e n + p a n k k i s ä ä n t e l y ä + p a n k k i s ä ä n t ö j ä + p a n k k i s ä ä s t ä m i s e n + p a n k k i t a k a u k s e l l a + p a n k k i t a k a u k s e n + p a n k k i t a k a u k s i a + p a n k k i t a k a u k s i n a + p a n k k i t a k a u s + p a n k k i t a k a u s t a + p a n k k i t a k u i d e n + p a n k k i t a k u i n a + p a n k k i t a k u i t a + p a n k k i t a k u u j ä r j e s t e l m ä ä + p a n k k i t a k u u o h j e l m a n + p a n k k i t a k u u t + p a n k k i t a l l e t t a j i e n + p a n k k i t a l l e t u k s e t + p a n k k i t a l l e t u k s i a + p a n k k i t a l l e t u k s i i n + p a n k k i t a l l e t u s + p a n k k i t a l l e t u s s u o j a a + p a n k k i t a l l e t u s t e n + p a n k k i t a l l e t u s t e n s a + p a n k k i t a l o u s + p a n k k i t a p a h t u m a a + p a n k k i t a p a h t u m i e n + p a n k k i t a p a h t u m i i n + p a n k k i t a p a h t u m i s t a + p a n k k i t a r k a s t u s t o i m i n t a a n + p a n k k i t a s e i d e n + p a n k k i t e s t i + p a n k k i t i e t o i h i n + p a n k k i t i e t o j a + p a n k k i t i e t o j a a n + p a n k k i t i e t o j e m m e + p a n k k i t i e t o j e n + p a n k k i t i l e i l l e + p a n k k i t i l e i l l e e n + p a n k k i t i l e i l l ä + p a n k k i t i l e i l t ä + p a n k k i t i l e i s s ä + p a n k k i t i l e j ä + p a n k k i t i l e j ä m m e + p a n k k i t i l i + p a n k k i t i l i e n + p a n k k i t i l i e n s ä + p a n k k i t i l i i n + p a n k k i t i l i l l e + p a n k k i t i l i l l e n i + p a n k k i t i l i l l ä + p a n k k i t i l i l t ä + p a n k k i t i l i l t ä m m e + p a n k k i t i l i n + p a n k k i t i l i n s ä + p a n k k i t i l i n u m e r o + p a n k k i t i l i s a a m i s t e n + p a n k k i t i l i s i + p a n k k i t i l i t + p a n k k i t i l i t i e d o t + p a n k k i t i l i t i e t o i h i n + p a n k k i t i l i t i e t o j a + p a n k k i t i l i ä + p a n k k i t o i m e k s i a n t o a + p a n k k i t o i m i a + p a n k k i t o i m i a l a l l a + p a n k k i t o i m i e n + p a n k k i t o i m i n n a n + p a n k k i t o i m i n n o i s s a + p a n k k i t o i m i n t a + p a n k k i t o i m i n t a a + p a n k k i t o i m i n t a a n + p a n k k i t o i m i n t o j a + p a n k k i t o i m i n t o j e n + p a n k k i t o i m i s t a + p a n k k i t r a n s a k t i o n + p a n k k i t u k i p a k e t e i s s a a n + p a n k k i t u o t t e i t a + p a n k k i u u d i s t u k s e e n + p a n k k i v a l i o k u n n a n + p a n k k i v a l i o k u n t a + p a n k k i v a l i o k u n t a a + p a n k k i v a l l a n + p a n k k i v a l v o j a t + p a n k k i v a l v o n n a n + p a n k k i v a l v o n n a s t a + p a n k k i v a l v o n t a a + p a n k k i v a l v o n t a a n + p a n k k i v a l v o n t a e l i n t e n + p a n k k i v a l v o n t a j ä r j e s t e l m ä ä + p a n k k i v a l v o n t a k o m i t e a + p a n k k i v a l v o n t a k o m i t e a n + p a n k k i v a l v o n t a v i r a n o m a i s e e n + p a n k k i v a l v o n t a v i r a n o m a i s e n + p a n k k i v a l v o n t a v i r a n o m a i s t a + p a n k k i v a l v o n t a v i r a n o m a i s t e n + p a n k k i v a n k e i n a + p a n k k i v a n k i d r a a m a a + p a n k k i v e l k o j a + p a n k k i v e r k o s t a + p a n k k i v e r k o s t o + p a n k k i v e r o + p a n k k i v e r o j e n + p a n k k i v e r o l l a + p a n k k i v e r o s t a + p a n k k i v i r a n o m a i n e n + p a n k k i v i r a n o m a i s e l l a + p a n k k i v i r a n o m a i s e l l e + p a n k k i v i r a n o m a i s e n + p a n k k i v i r a n o m a i s e s t a + p a n k k i v i r a n o m a i s i a + p a n k k i v i r a n o m a i s t e n + p a n k k i v i r k a i l i j a + p a n k k i v i r k a i l i j o i d e n + p a n k k i y h d i s t y k s e t + p a n k k i y h d i s t y k s i ä + p a n k k i y h d i s t y s + p a n k k i y h d i s t y s t e n + p a n k k i y h t e i s ö + p a n k k i y h t e i s ö n + p a n k k i y h t y m i e n + p a n k k i y k s i k ö s s ä + p a n n a a n + p a n n a a n k o + p a n n a k s e e n + p a n n a k s e m m e + p a n n e e n + p a n n e e t + p a n n e s s a + p a n n e s s a a n + p a n n u m y s s y + p a n n u t + p a n o k s e e n s a + p a n o k s e l l a + p a n o k s e l l a a n + p a n o k s e l l e + p a n o k s e n + p a n o k s e n s a + p a n o k s e s t a + p a n o k s e s t a a n + p a n o k s e s t a m m e + p a n o k s e s t a n n e + p a n o k s e t + p a n o r a a m a k u v a + p a n o s i n d i k a a t t o r i + p a n o s k e s k e i s i s t ä + p a n o s r e a k t o r i + p a n o s t a a + p a n o s t a a n + p a n o s t a k a a m m e + p a n o s t a m a a n + p a n o s t a m a s t a + p a n o s t a m i n e n + p a n o s t a m i s e n + p a n o s t a m m e + p a n o s t a m m e k o + p a n o s t a n e e t + p a n o s t a n u t + p a n o s t a v a t + p a n o s t e n + p a n o s t e t t a v a + p a n o s t u k s e e n i + p a n o s t u k s e l l a + p a n o s t u k s e t + p a n o s t u k s i s t a + p a n o s t u s a l u e i d e n + p a n s l a a v i l a i s e t + p a n s s a r i a j o n e u v o + p a n s s a r i a j o n e u v o a + p a n s s a r i a j o n e u v o j a + p a n s s a r i a j o n e u v o j e n + p a n s s a r i a l u k s i a + p a n s s a r i a r m e i j a + p a n s s a r i a r m e i j a k u n t a + p a n s s a r i a u t o + p a n s s a r i a u t o a + p a n s s a r i d i v i s i o o n a + p a n s s a r i e s t e + p a n s s a r i j u n a + p a n s s a r i k a n s i r i s t e i l i j ä + p a n s s a r i k r a n a a t t i + p a n s s a r i k r e n a t ö ö r i d i v i s i o o n a + p a n s s a r i l a i v a + p a n s s a r i l a s i + p a n s s a r i m i i n a t + p a n s s a r i m i i n o i h i n + p a n s s a r i m i i n o i k s i + p a n s s a r i m i i n o j a + p a n s s a r i m i i n o j e n + p a n s s a r i m u s e o + p a n s s a r i n + p a n s s a r i n t o r j u n t a + p a n s s a r i n t o r j u n t a k a n u u n a + p a n s s a r i n t o r j u n t a k i v ä ä r i + p a n s s a r i n t o r j u n t a m i i n a a + p a n s s a r i n t o r j u n t a m i i n o j e n + p a n s s a r i n t o r j u n t a o h j u s + p a n s s a r i n t o r j u n t a v a u n u + p a n s s a r i p r i k a a t i + p a n s s a r i s i m p u t + p a n s s a r i s o d a n k ä y n t i + p a n s s a r i v a u n u j e n + p a n s s a r i v a u n u k a n u u n a + p a n s s a r i v a u n u k o l o n n i l l a + p a n s s a r i v a u n u t + p a n s s a r i v a u n u t e h d a s + p a n s s a r i v a u n u t u l e e n + p a n s s a r i v o i m i e n + p a n t a i s i i n + p a n t a j a r r u + p a n t a u k o n s i e n i + p a n t a v a + p a n t a v a a + p a n t a v i i n + p a n t i i n + p a n t o m i i m i t a i t e i l i j a + p a n t t e j a + p a n t t e r i e t a n a + p a n t t e r i k ä m m e k k ä + p a n t t e r i m u r e e n a + p a n t t e r i p a l l o k a l a + p a n t t e r i s ä p p i k a l a + p a n t t e r i t + p a n t t i j ä r j e s t e l m i e n + p a n t t i j ä r j e s t e l m i ä + p a n t t i j ä r j e s t e l m ä + p a n t t i j ä r j e s t e l m ä n + p a n t t i j ä r j e s t e l m ä s t ä + p a n t t i j ä r j e s t e l m ä ä + p a n t t i k u i t t i j ä r j e s t e l m ä + p a n t t i l a i n a a m o + p a n t t i l u o t t o j e n + p a n t t i v a n g e i k s i + p a n t t i v a n g e i s t a + p a n t t i v a n g i k s i + p a n t t i v a n k e i n a + p a n t t i v a n k e i n a a n + p a n t t i v a n k i e n + p a n t t i v a n k i k a a p p a u k s e e n + p a n t t i v a n k i k a a p p a u k s e s t a + p a n t t i v a n k i k a a p p a u s t a + p a n t t i v a n k i k r i i s e i s s ä + p a n t t i v a n k i k r i i s i + p a n t t i v a n k i k r i i s i n + p a n t t i v a n k i n a + p a n t t i v a n k i n a a n + p a n t t i v a n k i s i e p p a u k s e s t a + p a n t t i v a n k i t a p a u s + p a n t t i v a n k i t i l a n n e + p a n t t i v a n k i t i l a n n e t t a + p a n t t i v a n k i t i l a n t e e n + p a n t u + p a p e r e i h i n n e + p a p e r e i s t a + p a p e r e i s t a n n e + p a p e r e i t a + p a p e r i a + p a p e r i a s i a k i r j o j e n + p a p e r i b a m b u + p a p e r i b y r o k r a t i a n + p a p e r i e n + p a p e r i h a a v a + p a p e r i h a m p a a t + p a p e r i i n + p a p e r i k a l a + p a p e r i k a l a a + p a p e r i k a l a k s i + p a p e r i k a l a n + p a p e r i k a l a t + p a p e r i k a l o j a + p a p e r i k a l o j e n + p a p e r i k a r t t o j a + p a p e r i k a s a + p a p e r i k a s o i s s a + p a p e r i k a s o j a + p a p e r i k i i n t i ö t + p a p e r i k o i v u + p a p e r i k o k o e l m a n a + p a p e r i k o n e + p a p e r i k o p i o + p a p e r i k o p i o i d e n + p a p e r i k o r i a + p a p e r i k o r i i n + p a p e r i k r o m a t o g r a f i a + p a p e r i k u u + p a p e r i l a a t u j a + p a p e r i l a p p u u n + p a p e r i l a s k u i l l e + p a p e r i l a s k u j e n + p a p e r i l e n t o k o n e + p a p e r i l i i t i n + p a p e r i l l a + p a p e r i l l e + p a p e r i l o m a k k e e t + p a p e r i m a i n o s t e n + p a p e r i m a r k k a + p a p e r i m a s s a a + p a p e r i m a s s a t e h t a i d e n + p a p e r i m ä ä r i ä + p a p e r i m ä ä r ä + p a p e r i m ä ä r ä ä + p a p e r i n + p a p e r i n e n ä l i i n o i s t a + p a p e r i n k u l u t u s t a + p a p e r i n m a k u i s i s t a + p a p e r i n o h u t + p a p e r i n p a l a + p a p e r i n p a l a a + p a p e r i n p a l a k s i + p a p e r i n p a l a s i a + p a p e r i n p a l a s t a + p a p e r i n p a l a t + p a p e r i n p y ö r i t y k s i n e e n + p a p e r i n u k k e + p a p e r i n v a l m i s t a j a t + p a p e r i p a k k a u k s e e n + p a p e r i p a l a n e n + p a p e r i p a l o j a + p a p e r i p i n o + p a p e r i p i n o j a + p a p e r i p o l i t i i k k a a + p a p e r i p r o t e s t i l l a + p a p e r i p u l l o + p a p e r i p u s s i + p a p e r i p u s s i t + p a p e r i p y y h e a n n o s t e l i j a + p a p e r i r a p o r t t e j a + p a p e r i r o i n a l l a + p a p e r i s a v i + p a p e r i s e e n + p a p e r i s i l p p u r i + p a p e r i s o d a n + p a p e r i s o d a s t a + p a p e r i s o t a + p a p e r i s o t a a + p a p e r i s o t a a n + p a p e r i s o t a n a + p a p e r i s o t i n e e n + p a p e r i s s a + p a p e r i s t a + p a p e r i s t r a t e g i a n + p a p e r i s ä k k i + p a p e r i t + p a p e r i t e h d a s + p a p e r i t e h t a a s s a + p a p e r i t e h t a i d e n + p a p e r i t e o l l i s u u d e n + p a p e r i t e o l l i s u u d e s t a + p a p e r i t e o l l i s u u s + p a p e r i t i i k e r e i k s i + p a p e r i t i i k e r e i n ä + p a p e r i t i i k e r e i t ä + p a p e r i t i i k e r i + p a p e r i t i i k e r i k s i + p a p e r i t i i k e r i n + p a p e r i t i i k e r i n ä + p a p e r i t i i k e r i s t ä + p a p e r i t i i k e r i ä + p a p e r i t t o m a a n + p a p e r i t u l o s t e i n a + p a p e r i t u o t t e e t + p a p e r i t u o t t e i d e n + p a p e r i t u r s k a n + p a p e r i t y ö l t ä + p a p e r i t y ö n + p a p e r i t y ö s t ä + p a p e r i t y ö t ä + p a p e r i t ö i d e n + p a p e r i t ö i t ä + p a p e r i v e n e + p a p e r i v e r s i o + p a p e r i v e r s i o t + p a p e r i v u o r e n + p a p e r i v u o r i a + p a p e r i v u o r t e n + p a p i l l o o m a v i r u k s e t + p a p i l l o o m a v i r u s + p a p i l l o o m a v i r u s t a + p a p i n r i s t i + p a p i n t a p p a j a + p a p i s t o n + p a p p i s d i k t a t u u r i s t a + p a p p i s k o u l u t u s + p a p p i s k v i n t e t t i + p a p r i k a s u m u t i n + p a p u a + p a p u a k i e l e t + p a p u a n t i m a l i + p a p u a s s a + p a p u a s s a k i n + p a p u j a + p a p u k a i j a p e i p p o + p a p u k a i j a v a h a k a s + p a p y r u s k e r t t u n e n + p a p y r u s l e p i n k ä i n e n + p a r a a b e l i k o o r d i n a a t i s t o + p a r a a t i s s a + p a r a d o k s a a l i s e m p i + p a r a d o k s a a l i s t a + p a r a d o k s e i s t a + p a r a d o k s e j a + p a r a d o k s i a + p a r a f a s i s t i s i a + p a r a f i i n i a s i a s s a + p a r a k a u t s u p u u + p a r a k o m m u n i s t i s i a + p a r a k r a s s i + p a r a l l e e l i a k s i o o m a + p a r a l y m p i a l a i s e t + p a r a l y m p i a l a i s t e n + p a r a m e t r e j a + p a r a m e t r i e n + p a r a n e e + p a r a n e m a a n + p a r a n e m a s s a + p a r a n e m i s e e n + p a r a n e m i s e n + p a r a n e m i s e s t a a n + p a r a n e m i s m a h d o l l i s u u d e t + p a r a n e m i s m a h d o l l i s u u k s i a + p a r a n e m i s m a h d o l l i s u u k s i i n + p a r a n e m i s p r o s e s s i + p a r a n e m i s t a + p a r a n e m i s t o i v e i d e n s a + p a r a n e m i s t o i v o t u k s i s t a + p a r a n e v a n + p a r a n e v a t + p a r a n i s i + p a r a n n a m m e + p a r a n n e l t a v a + p a r a n n e l t u n a + p a r a n n e t a + p a r a n n e t a a n + p a r a n n e t t a e s s a + p a r a n n e t t a i s i i n + p a r a n n e t t a v a a + p a r a n n e t t a v i s s a + p a r a n n e t t u a + p a r a n n e t t u j a + p a r a n n e t t u j e n + p a r a n n e t u s t a + p a r a n n u k s e n + p a r a n n u k s e s t a + p a r a n n u k s e t + p a r a n n u k s i a + p a r a n n u k s i i n + p a r a n n u k s i n + p a r a n n u k s i n a + p a r a n n u k s i s s a + p a r a n n u k s i s t a + p a r a n n u s e h d o t u k s e e n + p a r a n n u s e h d o t u k s e m m e + p a r a n n u s e h d o t u k s e n + p a r a n n u s e h d o t u k s e n s a + p a r a n n u s e h d o t u k s e t + p a r a n n u s e h d o t u k s i a + p a r a n n u s e h d o t u k s i i n + p a r a n n u s e h d o t u k s i n + p a r a n n u s e h d o t u k s i s t a + p a r a n n u s e h d o t u k s i s t a a n + p a r a n n u s e h d o t u s + p a r a n n u s e h d o t u s t e n + p a r a n n u s h a n k k e i s i i n + p a r a n n u s h a n k k e i t a + p a r a n n u s k e i n o + p a r a n n u s k e i n o a + p a r a n n u s k e i n o i s t a + p a r a n n u s k e i n o j a + p a r a n n u s k e i n o j e n + p a r a n n u s k e i n o n a + p a r a n n u s k e i n o s t a + p a r a n n u s m a h d o l l i s u u d e s t a + p a r a n n u s m a h d o l l i s u u d e t + p a r a n n u s m a h d o l l i s u u k s i a + p a r a n n u s m e n e t e l m i e n + p a r a n n u s o h j e l m a + p a r a n n u s p r o s e s s i a + p a r a n n u s p r o s e s s i s s a + p a r a n n u s s u o s i t u k s i a + p a r a n n u s s u u n n i t e l m a t + p a r a n n u s s u u n n i t e l m i a + p a r a n n u s s u u n n i t e l m i e n + p a r a n n u s s u u n n i t e l m i i n + p a r a n n u s t a + p a r a n n u s t a r k i s t u s t a + p a r a n n u s t a r v e + p a r a n n u s t e n + p a r a n n u s t e n t e k o p r o s e s s i + p a r a n n u s t e n t e k o p r o s e s s i s s a + p a r a n n u s t o i m i e n + p a r a n n u s t o i v e i s t a m m e + p a r a n n u s t y ö n + p a r a n n u s v a a t i m u k s e t + p a r a n n u t t a v a + p a r a n t a a + p a r a n t a a k i n + p a r a n t a a k s e e n + p a r a n t a a k s e m m e + p a r a n t a a k s e n i + p a r a n t a e s s a a n + p a r a n t a i s i + p a r a n t a i s i v a t + p a r a n t a k a a m m e + p a r a n t a m a a n + p a r a n t a m a l l a + p a r a n t a m a s s a + p a r a n t a m a t t a + p a r a n t a m i s a l o i t t e e n + p a r a n t a m i s a s t e t t a + p a r a n t a m i s e e n + p a r a n t a m i s e k s i + p a r a n t a m i s e l l e + p a r a n t a m i s e n + p a r a n t a m i s e s s a + p a r a n t a m i s e s t a + p a r a n t a m i s k e i n o j a + p a r a n t a m i s m a h d o l l i s u u k s i a + p a r a n t a m i s o h j e l m a a + p a r a n t a m i s o h j e l m a a n + p a r a n t a m i s p o l i t i i k k a a + p a r a n t a m i s p r o s e s s i a + p a r a n t a m i s p r o s e s s i i n + p a r a n t a m i s p y r k i m y k s i i n + p a r a n t a m i s p y r k i m y s t e n + p a r a n t a m i s s u u n n i t e l m a a + p a r a n t a m i s s u u n n i t e l m i a + p a r a n t a m i s s u u n n i t e l m i e n + p a r a n t a m i s s u u n n i t e l m i i n + p a r a n t a m i s s u u n n i t e l m i l l a + p a r a n t a m i s s u u n n i t e l m i l l e + p a r a n t a m i s t a + p a r a n t a m i s t a r p e e n + p a r a n t a m i s t a r p e e s e e n + p a r a n t a m i s t a r p e i t a + p a r a n t a m i s t a v o i t t e i t a + p a r a n t a m i s t o i m e n p i t e i d e n + p a r a n t a m i s t o i m e n p i t e i t ä + p a r a n t a m i s t o i m e t + p a r a n t a m i s t o i m i a + p a r a n t a m i s t o i m i i n + p a r a n t a m i s t o i m i s t a + p a r a n t a m i s t y ö t ä + p a r a n t a n e e t + p a r a n t a n e i s t a + p a r a n t a n e v a t + p a r a n t a n u t + p a r a n t a v a l l a + p a r a n t a v a n a + p a r a n t a v a t + p a r a n t a v i a + p a r a n t a v i e n + p a r a n t e l u n + p a r a n t u a + p a r a n t u a k s e e n + p a r a n t u e s s a + p a r a n t u m a s s a + p a r a n t u m i s e l l e + p a r a n t u m i s e n + p a r a n t u m i s p r o s e s s i + p a r a n t u m i s t a + p a r a n t u n e e n + p a r a n t u n e e t + p a r a n t u n e i s t a + p a r a n t u u + p a r a n t u v a n + p a r a n v o i + p a r a o l y m p i a l a i s e t + p a r a o l y m p i a l a i s i s t a + p a r a o r a n s s i + p a r a p a r a + p a r a p ä h k i n ä p u u + p a r a s k a a n + p a r a s k i n + p a r a s t a + p a r a s t a a n + p a r a t i i s e j a + p a r a t i i s i e n + p a r a t i i s i k a i j a + p a r a t i i s i k a l a + p a r a t i i s i k o l i b r i + p a r a t i i s i k o t t a r a i n e n + p a r a t i i s i l e s k i + p a r a t i i s i l i n n u t + p a r a t i i s i m a i s e n + p a r a t i i s i m o n a r k i t + p a r a t i i s i m o n a r k k i + p a r a t i i s i p e i p p o + p a r a t i i s i s a a r i + p a r a t i i s i s a a r i l l a + p a r a t i i s i s o r s a + p a r a t i i s i v a r i s + p a r e i l l e + p a r e j a + p a r e m m a k s i + p a r e m m a l l a + p a r e m m a l l e + p a r e m m a l t a + p a r e m m a n + p a r e m m a n k i n + p a r e m m a s s a + p a r e m m a s t a + p a r e m m a s t a a n + p a r e m m a t + p a r e m m i k s i + p a r e m m i l t a + p a r e m m i s t a + p a r e m m u u s v e r t a i l u i h i n + p a r e m p a a + p a r e m p a a n + p a r e m p a a n k i n + p a r e m p a n a + p a r e m p i a + p a r e m p i a k i n + p a r e m p i e n + p a r e m p i i n + p a r e m p i l a a t u i s e n + p a r e m p i l a a t u i s e t + p a r e m p i l a a t u i s i a + p a r e m p i l a a t u i s t a + p a r e m p i l a a t u i s t e n + p a r e m p i p a l k k a i s i a + p a r h a a k s e m m e + p a r h a a k s i + p a r h a a l l a + p a r h a a l l a k a a n + p a r h a a l t a + p a r h a a m m e + p a r h a a n + p a r h a a n a + p a r h a a n i + p a r h a a n n e + p a r h a a n s a + p a r h a a s e e n + p a r h a a s s a + p a r h a a s s a k i n + p a r h a a s t a + p a r h a a t + p a r h a a t k a a n + p a r h a a t k i n + p a r h a i d e n + p a r h a i l l a a n + p a r h a i l l a a n k i n + p a r h a i l l a k a a n + p a r h a i l l a m m e + p a r h a i l l a n i + p a r h a i l l e + p a r h a i m m a n + p a r h a i m m a s s a + p a r h a i m m a t + p a r h a i m m a t k a a n + p a r h a i m m a t k i n + p a r h a i m m i l l a a n + p a r h a i m m i l l a a n k i n + p a r h a i m m i s t a + p a r h a i m p a a n + p a r h a i m p a n a + p a r h a i m p i a + p a r h a i n k i n + p a r h a i n t a + p a r h a i s i i n + p a r h a i s s a + p a r h a i s t a + p a r h a i s t a k a a n + p a r h a i t a + p a r i a + p a r i i s i + p a r i i s i i n + p a r i i s i n + p a r i j u o v a m a k r i l l i + p a r i j ä r j e s t e l m ä n + p a r i k a a p e l i + p a r i k e s k u s t e l u + p a r i k s i + p a r i l l a + p a r i l l e k y m m e n e l l e + p a r i l u i s t e l u + p a r i n + p a r i n a + p a r i n a a r i h a p p o + p a r i n g a j ä r v i + p a r i n k y m m e n e n + p a r i n m u o d o s t u s + p a r i n t u h o + p a r i s a t a a + p a r i s i v u i s i l l a + p a r i s k u n n i l l e + p a r i s k u n t i e n + p a r i s t o a l a l l a + p a r i s t o d i r e k t i i v i i n + p a r i s t o d i r e k t i i v i k s i + p a r i s t o d i r e k t i i v i n + p a r i s t o d i r e k t i i v i s s ä + p a r i s t o d i r e k t i i v i ä + p a r i s t o j e n + p a r i s t o j ä t e t t ä + p a r i s t o m a i n o k s e t + p a r i s t o n v a l m i s t u k s e n + p a r i s t o s a a s t e e l t a + p a r i s t o t + p a r i s t o t e k n i i k k a + p a r i s u h d e t e r a p i a + p a r i s u h d e v ä k i v a l l a n + p a r i s u h d e v ä k i v a l t a + p a r i s u h d e v ä k i v a l t a a n + p a r i s u h t e e n + p a r i s u h t e e n s a + p a r i s u h t e e s s a + p a r i s u h t e e s t a + p a r i s u h t e e t + p a r i s u h t e i d e n + p a r i s u h t e i s s a + p a r i s ä n g y s s ä + p a r i t a n s s i + p a r i t e e t t i d e m o k r a t i a + p a r i t e e t t i d e m o k r a t i a j ä r j e s t e l m ä ä + p a r i t e e t t i d e m o k r a t i a s s a + p a r i t e e t t i d e m o k r a t i a s t a + p a r i t e e t t i m u u t o k s i a + p a r i t e e t t i p e r i a a t t e e n + p a r i t r o o l a u k s e n + p a r i t r o o l a u s + p a r i t u h a t t a + p a r i t ä p l ä h u u l i k a l a + p a r i v u o t i a s + p a r j a a j i l t a + p a r j a u k s i i n + p a r k a a + p a r k i n s o n i n + p a r k i n s o n i n t a u d i n + p a r k k i i n t u n e i m m a t k i n + p a r k k i p a i k a l l a + p a r k k i t a l o o n + p a r l a m e n t a a r i k k o i h i n + p a r l a m e n t a a r i k k o i n a + p a r l a m e n t a a r i k k o j e n + p a r l a m e n t a a r i k k o k o k o u k s e n + p a r l a m e n t a a r i k k o k o k o u s + p a r l a m e n t a a r i k k o k o l l e g a m m e + p a r l a m e n t a a r i k k o k o l l e g o j e m m e + p a r l a m e n t a a r i k k o n a + p a r l a m e n t a a r i k k o r y h m ä m m e + p a r l a m e n t a a r i k o i d e n + p a r l a m e n t a a r i k o i l l a + p a r l a m e n t a a r i k o i l l e + p a r l a m e n t a a r i k o i s t a + p a r l a m e n t a a r i k o i t a + p a r l a m e n t a a r i k o n + p a r l a m e n t a a r i k o t + p a r l a m e n t a a r i s e e n + p a r l a m e n t a a r i s e k s i + p a r l a m e n t a a r i s e l l a + p a r l a m e n t a a r i s e l l e + p a r l a m e n t a a r i s e m p a a + p a r l a m e n t a a r i s e n + p a r l a m e n t a a r i s e n a + p a r l a m e n t a a r i s e s s a + p a r l a m e n t a a r i s e s t a + p a r l a m e n t a a r i s e t + p a r l a m e n t a a r i s i a + p a r l a m e n t a a r i s i l l e + p a r l a m e n t a a r i s i s s a + p a r l a m e n t a a r i s t a + p a r l a m e n t a a r i s t e n + p a r l a m e n t a r i s m i a + p a r l a m e n t a r i s m i i n + p a r l a m e n t a r i s m i n + p a r l a m e n t a r i s m i s t a + p a r l a m e n t e i l l a + p a r l a m e n t e i l l e + p a r l a m e n t e i l l e e n + p a r l a m e n t e i l t a + p a r l a m e n t e i l t a a n + p a r l a m e n t e i s s a + p a r l a m e n t e i s s a a n + p a r l a m e n t e i s t a + p a r l a m e n t i k s i + p a r l a m e n t i l l a + p a r l a m e n t i l l a k i n + p a r l a m e n t i l l a m m e + p a r l a m e n t i l l e + p a r l a m e n t i l l e k a a n + p a r l a m e n t i l l e k i n + p a r l a m e n t i l l e m m e + p a r l a m e n t i l l e n n e + p a r l a m e n t i l t a + p a r l a m e n t i l t a m m e + p a r l a m e n t i n + p a r l a m e n t i n h a n + p a r l a m e n t i n j ä s e n e l l e + p a r l a m e n t i n j ä s e n i e n + p a r l a m e n t i n k a a n + p a r l a m e n t i n k i n + p a r l a m e n t i n v a a l e i h i n + p a r l a m e n t i s s a + p a r l a m e n t i s s a a n + p a r l a m e n t i s s a k i n + p a r l a m e n t i s s a m m e + p a r l a m e n t i s t a + p a r l a m e n t i t + p a r l a m e n t i t h a n + p a r l a m e n t t e i h i n + p a r l a m e n t t e i n a + p a r l a m e n t t e j a + p a r l a m e n t t e j a m m e + p a r l a m e n t t i a + p a r l a m e n t t i a k i n + p a r l a m e n t t i a m m e + p a r l a m e n t t i a v u s t a j i s t a + p a r l a m e n t t i e d u s t a j a l l e + p a r l a m e n t t i e d u s t a j a n s a k a a n + p a r l a m e n t t i e d u s t a j a t + p a r l a m e n t t i e d u s t a j a t o v e r i n i + p a r l a m e n t t i e d u s t u k s e s s a k i n + p a r l a m e n t t i e h d o k a s + p a r l a m e n t t i e h d o k k a a s t a + p a r l a m e n t t i e m m e + p a r l a m e n t t i e n + p a r l a m e n t t i e n k i n + p a r l a m e n t t i e n s a + p a r l a m e n t t i h a n + p a r l a m e n t t i h u o n e + p a r l a m e n t t i i m m e + p a r l a m e n t t i i n + p a r l a m e n t t i i n n e + p a r l a m e n t t i j ä r j e s t e l m ä + p a r l a m e n t t i j ä r j e s t e l m ä s t ä + p a r l a m e n t t i j ä r j e s t y k s e e n + p a r l a m e n t t i k a a n + p a r l a m e n t t i k a u d e l l a + p a r l a m e n t t i k a u d e l t a + p a r l a m e n t t i k a u d e n + p a r l a m e n t t i k a u s i + p a r l a m e n t t i k a u t e m m e + p a r l a m e n t t i k a u t e n n e + p a r l a m e n t t i k a u t t a + p a r l a m e n t t i k e s k u s t e l u a + p a r l a m e n t t i k e s k u s t e l u i s s a + p a r l a m e n t t i k e s k u s t e l u j a + p a r l a m e n t t i k e s k u s t e l u j a m m e + p a r l a m e n t t i k e s k u s t e l u j e n + p a r l a m e n t t i k e s k u s t e l u n + p a r l a m e n t t i k e s k u s t e l u s s a + p a r l a m e n t t i k i n + p a r l a m e n t t i k o k o o n p a n o n + p a r l a m e n t t i k o l l e g o j e m m e + p a r l a m e n t t i k u l t t u u r i t + p a r l a m e n t t i k ä s i t t e l y + p a r l a m e n t t i k ä s i t t e l y n + p a r l a m e n t t i k ä s i t t e l y s s ä + p a r l a m e n t t i k ä s i t t e l y ä + p a r l a m e n t t i k ä y t ä n t ö + p a r l a m e n t t i m a a i l m a n + p a r l a m e n t t i m e n e t t e l y n + p a r l a m e n t t i m e n e t t e l y ä + p a r l a m e n t t i m m e + p a r l a m e n t t i m y ö n t e i n e n + p a r l a m e n t t i n a + p a r l a m e n t t i n n e + p a r l a m e n t t i n s a + p a r l a m e n t t i p a i k a s t a + p a r l a m e n t t i p a i k k o i h i n + p a r l a m e n t t i p a i k o i s t a + p a r l a m e n t t i p u o l u e e n + p a r l a m e n t t i p u o l u e e t + p a r l a m e n t t i p u o l u e i t a + p a r l a m e n t t i r a k e n n u k s e e m m e + p a r l a m e n t t i r a k e n n u k s e e n + p a r l a m e n t t i r a k e n n u k s e m m e + p a r l a m e n t t i r a k e n n u k s e n + p a r l a m e n t t i r a k e n n u k s e s s a + p a r l a m e n t t i r a k e n n u k s e s t a + p a r l a m e n t t i r a k e n n u k s e s t a m m e + p a r l a m e n t t i r a k e n n u k s i i n + p a r l a m e n t t i r a k e n n u k s i s s a + p a r l a m e n t t i r a k e n n u s + p a r l a m e n t t i r a k e n n u s t a + p a r l a m e n t t i r y h m i e n + p a r l a m e n t t i r y h m i i n + p a r l a m e n t t i r y h m i l l e + p a r l a m e n t t i r y h m i l t ä m m e + p a r l a m e n t t i r y h m i s s ä + p a r l a m e n t t i r y h m i s t ä + p a r l a m e n t t i r y h m i ä + p a r l a m e n t t i r y h m ä + p a r l a m e n t t i r y h m ä l l e + p a r l a m e n t t i r y h m ä l l e m m e + p a r l a m e n t t i r y h m ä m m e + p a r l a m e n t t i r y h m ä n + p a r l a m e n t t i r y h m ä n i + p a r l a m e n t t i r y h m ä s s ä ä n + p a r l a m e n t t i r y h m ä t + p a r l a m e n t t i s a l i n + p a r l a m e n t t i t a l o + p a r l a m e n t t i t a l o n + p a r l a m e n t t i t a p a a m i s t e n + p a r l a m e n t t i t a s o l l a + p a r l a m e n t t i t a s o n + p a r l a m e n t t i t y ö + p a r l a m e n t t i t y ö h ö m m e + p a r l a m e n t t i t y ö h ö n + p a r l a m e n t t i t y ö m m e + p a r l a m e n t t i t y ö n + p a r l a m e n t t i t y ö n n e + p a r l a m e n t t i t y ö s k e n t e l y n + p a r l a m e n t t i t y ö s k e n t e l y y n + p a r l a m e n t t i t y ö s k e n t e l y ä + p a r l a m e n t t i t y ö s s ä + p a r l a m e n t t i u r a l l a n i + p a r l a m e n t t i u r a n s a + p a r l a m e n t t i v a a l e i h i n + p a r l a m e n t t i v a a l e i l l e + p a r l a m e n t t i v a a l e i n + p a r l a m e n t t i v a a l e i s s a + p a r l a m e n t t i v a a l e i s t a + p a r l a m e n t t i v a a l e j a + p a r l a m e n t t i v a a l i e h d o k k a a t + p a r l a m e n t t i v a a l i e h d o k k a i s t a m m e + p a r l a m e n t t i v a a l i e h d o k k a i t a + p a r l a m e n t t i v a a l i e n + p a r l a m e n t t i v a a l i k a m p a n j a a + p a r l a m e n t t i v a a l i k a m p a n j a s s a + p a r l a m e n t t i v a a l i s s a + p a r l a m e n t t i v a a l i t + p a r l a m e n t t i v a l t u u s k u n n a n + p a r l a m e n t t i v a l t u u s k u n n a t + p a r l a m e n t t i v a l t u u s k u n t a + p a r l a m e n t t i v a l t u u s k u n t a m m e + p a r l a m e n t t i v u o s i + p a r l a m e n t t i ä ä n e s t y k s e n + p a r m a l a t + p a r m e s a a n i j u u s t o a + p a r m e s a a n i n + p a r o d i a m u s i i k k i + p a r o d i a s h o w + p a r o d i n + p a r r a s v a l o i s s a + p a r s a a + p a r s a f e s t i v a a l e i l l a + p a r s a j u h l i s t a + p a r s a k a u d e l l a + p a r s a n t u o t t a j i a + p a r s a n v i l j e l i j ä s t ä + p a r s a p ä i v ä l l i s e l t ä + p a r s o n i n k a m e l e o n t t i + p a r t a c o l l i e + p a r t a e r a k k o k o l i b r i + p a r t a h a i k a l a t + p a r t a h y l j e + p a r t a h ö y l ä + p a r t a k o n e i s s a + p a r t a k o n e t t a + p a r t a k o r p p i k o t k a + p a r t a m a k a k i + p a r t a m e r i m e t s o + p a r t a n i l k a t + p a r t a p ö l l ö + p a r t a s e p p ä k o t i n g a + p a r t a s i k a + p a r t a s u t i + p a r t a t e r i l l ä + p a r t a t u r s k a + p a r t a v a a h t o + p a r t a v a l m u s k a + p a r t a v e d e l l e + p a r t a v e i t s i + p a r t a v i i k u n a k a i j a + p a r t i o a l u k s e n + p a r t i o a l u k s i l l a + p a r t i o i d a + p a r t i o i v a t + p a r t i o j o u k k u e e n + p a r t i o l a i s l i i k e + p a r t i o l i i k e + p a r t i o l i i k e t t ä + p a r t i o l i i k k e e n + p a r t i o l i p p u k u n t a + p a r t i o p i i r i + p a r t i o p o i k a + p a r t i o p o i k i a + p a r t i o v e n e e t + p a r t i o v e n e i d e n + p a r t i o v e n e i s t ä + p a r t i o v e n e t t ä + p a r t i s a a n i m e n t a l i t e e t t i n s a + p a r t i s a a n i n ä k e m y k s e s t ä + p a r t i s a a n i p o l i t i i k k a + p a r t i s a a n i p u h e e n j o h t a j a + p a r t i s a a n i s u u n n i t e l m i l l e + p a r v e l l a + p a r v i l e p i n k ä i n e n + p a r v i m u s t e s i e n i + p a r v i t u l p p a a n i + p a r v i ä l y + p a s a a t i t u u l i + p a s i f i s t i j o u k o t + p a s i f i s t i r y h m ä t + p a s i f i s t i s t a + p a s k o a + p a s k o n + p a s s e i h i n + p a s s e i s s a + p a s s e j a + p a s s i a + p a s s i e n + p a s s i h a k e m u k s e s s a + p a s s i i v i s e e n + p a s s i i v i s e m p a a + p a s s i i v i s e m p i + p a s s i i v i s e m p i a + p a s s i i v i s e n + p a s s i i v i s i a + p a s s i i v i s i a k a a n + p a s s i i v i s i i n + p a s s i i v i s i n a + p a s s i i v i s t e n + p a s s i i v i s u u t e e n + p a s s i i v i s u u t t a + p a s s i i v i t a l o + p a s s i j ä r j e s t e l m ä ä + p a s s i k u v a n s a + p a s s i k u v a t + p a s s i k u v i a a n + p a s s i l i i t o n + p a s s i l i i t t o + p a s s i l i i t t o o n + p a s s i n + p a s s i n i + p a s s i n s a + p a s s i n t a r k a s t u k s e t + p a s s i n t a r k a s t u k s i a + p a s s i n t a r k a s t u s + p a s s i n v ä ä r e n t ä j i e n + p a s s i o h e d e l m ä + p a s s i s t a a n + p a s s i s u u n n i t e l m a a n + p a s s i t + p a s s i t a r k a s t u k s e t + p a s s i t a r k a s t u k s i a + p a s s i t a r k a s t u k s i l l e + p a s s i t u k s e e n + p a s s i t u k s e s s a + p a s s i t u s j ä r j e s t e l m ä + p a s s i t u s j ä r j e s t e l m ä l l e + p a s s i t u s j ä r j e s t e l m ä n + p a s s i t u s j ä r j e s t e l m ä s s ä + p a s s i t u s j ä r j e s t e l m ä s t ä + p a s s i t u s j ä r j e s t e l m ä u u d i s t u k s e n + p a s s i t u s j ä r j e s t e l m ä ä + p a s s i t u s j ä r j e s t e l m ä ä n + p a s s i t u s l i i k e n n e t t ä + p a s s i t u s m e n e t e l m i e n + p a s s i t u s m e n e t t e l y + p a s s i t u s m e n e t t e l y i h i n + p a s s i t u s m e n e t t e l y i s t ä + p a s s i t u s m e n e t t e l y i t ä + p a s s i t u s m e n e t t e l y j ä + p a s s i t u s m e n e t t e l y l l e + p a s s i t u s m e n e t t e l y n + p a s s i t u s m e n e t t e l y s s ä + p a s s i t u s m e n e t t e l y t + p a s s i t u s m e n e t t e l y y n + p a s s i t u s m e n e t t e l y ä + p a s s i t u s m i e t i n n ö s s ä + p a s s i t u s m i e t i n n ö s t ä + p a s s i t u s o n g e l m a + p a s s i t u s o n g e l m a l l e + p a s s i t u s p e t o s t e n + p a s s i t u s t a p a h t u m a t + p a s s i t u s t i e d u s t e l u u n + p a s s i t u s t i e t o j ä r j e s t e l m ä l l e + p a s s i t u s t o i m i a + p a s s i t u s t u t k i m u s t a + p a s s i t u s v a l v o n t a a + p a s s i u n i o n i + p a s s i u n i o n i a + p a s s i u n i o n i i n + p a s s i u n i o n i n + p a s s i u n i o n i s s a + p a s s i v a p a a n + p a s s i v a p a u d e n + p a s s i v a p a u s + p a s s i v a r a s + p a s s i v ä ä r e n n ö k s i i n + p a s t a j u o t o s + p a s t e l l i k o r u a h v e n + p a s t e l l i v ä l s k ä r i + p a s t o r a a l i k i r j e e t + p a s t o r a a l i s i n f o n i a + p a s t o r a a l i t e o l o g i a + p a s t ö r o i n t i v a i h e e s s a + p a s t ö r o i t u u n + p a t a a n + p a t a a n i h e i m o j e n + p a t a a n i t + p a t a a n i y h t e i s ö j e n + p a t a k y p ä r ä + p a t a r o u v a + p a t a r u o i s s a + p a t e n t e i l l a + p a t e n t e i s t a + p a t e n t i l l a + p a t e n t i n + p a t e n t i n h a k u + p a t e n t i n h a l t i j a + p a t e n t i n h a l t i j a l t a + p a t e n t i n h a l t i j a n + p a t e n t i n h a l t i j a t + p a t e n t i n h a l t i j a y h t i ö i t ä + p a t e n t i n h a l t i j o i d e n + p a t e n t i n h a l t i j o i l l e + p a t e n t i n h a l t i j o i s t a + p a t e n t i n m y ö n t ä m i s k u s t a n n u k s i a + p a t e n t i s t a + p a t e n t i t + p a t e n t o i d a + p a t e n t o i m a t t o m i k s i + p a t e n t o i m i n e n + p a t e n t o i m i s d i r e k t i i v i n + p a t e n t o i m i s e n + p a t e n t o i m i s m a h d o l l i s u u d e t + p a t e n t o i n t i d i r e k t i i v i i n + p a t e n t o i n t i d i r e k t i i v i n + p a t e n t o i n t i e h t o j e n + p a t e n t o i n t i j ä r j e s t e l m ä n + p a t e n t o i n t i k u s t a n n u k s e t + p a t e n t o i n t i k ä y t ä n t ö ä + p a t e n t o i n t i m a h d o l l i s u u d e t + p a t e n t o i n t i o i k e u d e n + p a t e n t o i n t i p r o s e s s i n + p a t e n t o i t a v i a + p a t e n t o i t a v i s s a + p a t e n t t e j a + p a t e n t t e j a a n + p a t e n t t i a + p a t e n t t i a l a l l a + p a t e n t t i a s e t u k s e n + p a t e n t t i a s e t u s + p a t e n t t i a s i a a + p a t e n t t i a s i a m i e h i n e e n + p a t e n t t i a s i a m i e h i ä + p a t e n t t i a s i a m i e s t e n + p a t e n t t i a s i a n a j a j a + p a t e n t t i a s i a n a j a j a t + p a t e n t t i a s i a n a j a j i e n + p a t e n t t i a s i a n t u n t e m u k s e n + p a t e n t t i a s i o i t a + p a t e n t t i b y r o k r a t i a n + p a t e n t t i d i r e k t i i v i + p a t e n t t i d i r e k t i i v i i n + p a t e n t t i d i r e k t i i v i n + p a t e n t t i d i r e k t i i v i s s ä + p a t e n t t i d i r e k t i i v i s t ä + p a t e n t t i d i r e k t i i v i ä + p a t e n t t i e n + p a t e n t t i h a k e m u k s e n + p a t e n t t i h a k e m u k s e s s a + p a t e n t t i h a k e m u k s i a + p a t e n t t i h a k e m u k s i s t a + p a t e n t t i h a k e m u s + p a t e n t t i h a k e m u s t a + p a t e n t t i h a k e m u s t e n + p a t e n t t i h a l l i n n o n + p a t e n t t i i n + p a t e n t t i j ä r j e s t e l m i e n + p a t e n t t i j ä r j e s t e l m i i n + p a t e n t t i j ä r j e s t e l m ä + p a t e n t t i j ä r j e s t e l m ä l l ä + p a t e n t t i j ä r j e s t e l m ä m m e + p a t e n t t i j ä r j e s t e l m ä n + p a t e n t t i j ä r j e s t e l m ä s s ä + p a t e n t t i j ä r j e s t e l m ä s t ä + p a t e n t t i j ä r j e s t e l m ä ä + p a t e n t t i j ä r j e s t e l m ä ä n + p a t e n t t i j ä r j e s t e l y j ä + p a t e n t t i j ä r j e s t e l y l l ä + p a t e n t t i j ä r j e s t ö n + p a t e n t t i j ä r j e s t ö s s ä + p a t e n t t i j ä r j e s t ö ö n + p a t e n t t i k i i s t a t + p a t e n t t i k i i s t o i s s a + p a t e n t t i k u v a u k s i s t a + p a t e n t t i k y s y m y k s e s s ä + p a t e n t t i k y s y m y k s e s t ä + p a t e n t t i k y s y m y k s i i n + p a t e n t t i k y s y m y s + p a t e n t t i k y s y m y s t ä + p a t e n t t i k ä s i t t e l i j ä k s i + p a t e n t t i k ä y t ä n n ö s s ä + p a t e n t t i l a e i s s a + p a t e n t t i l a i n + p a t e n t t i l a i n k ä y t t ö v a l t a + p a t e n t t i l a i n s ä ä d ä n n ö i s s ä + p a t e n t t i l a i n s ä ä d ä n n ö l l e + p a t e n t t i l a i n s ä ä d ä n n ö l l ä + p a t e n t t i l a i n s ä ä d ä n n ö n + p a t e n t t i l a i n s ä ä d ä n n ö s s ä + p a t e n t t i l a i n s ä ä d ä n n ö s t ä + p a t e n t t i l a i n s ä ä d ä n t ö + p a t e n t t i l a i n s ä ä d ä n t ö p e r i n t e e s t ä + p a t e n t t i l a i n s ä ä d ä n t ö t y ö t ä + p a t e n t t i l a i n s ä ä d ä n t ö ä + p a t e n t t i l a i n s ä ä d ä n t ö ö n + p a t e n t t i l a i s s a + p a t e n t t i l a i s t a + p a t e n t t i l a k e j a + p a t e n t t i l a k i + p a t e n t t i l a k i a + p a t e n t t i l a k i e n + p a t e n t t i l a k i i n + p a t e n t t i l o u k k a u k s e e n + p a t e n t t i l o u k k a u k s e n + p a t e n t t i l o u k k a u k s e t + p a t e n t t i l o u k k a u k s i a + p a t e n t t i l ä ä k e + p a t e n t t i l ä ä k e t t ä + p a t e n t t i l ä ä k k e e t + p a t e n t t i l ä ä k k e i s t ä + p a t e n t t i l ä ä k k e i t ä + p a t e n t t i m a k s u i s t a a n + p a t e n t t i m a k s u j a + p a t e n t t i m a l l i i n + p a t e n t t i m a r k k i n o i d e n + p a t e n t t i m e n e t t e l y n + p a t e n t t i m o n o p o l e j a a n + p a t e n t t i m o n o p o l i + p a t e n t t i m u o t o + p a t e n t t i o h j e l m a a + p a t e n t t i o i k e u d e l l e + p a t e n t t i o i k e u d e l l i n e n + p a t e n t t i o i k e u d e l l i s e n + p a t e n t t i o i k e u d e n + p a t e n t t i o i k e u d e n k ä y n t i j ä r j e s t e l m ä + p a t e n t t i o i k e u d e n k ä y n t i j ä r j e s t e l m ä n + p a t e n t t i o i k e u d e s s a + p a t e n t t i o i k e u d e t + p a t e n t t i o i k e u k s i a + p a t e n t t i o i k e u k s i e m m e + p a t e n t t i o i k e u k s i e n + p a t e n t t i o i k e u k s i i n + p a t e n t t i o i k e u k s i n + p a t e n t t i o i k e u k s i s t a + p a t e n t t i o i k e u s + p a t e n t t i o i k e u t e e n + p a t e n t t i o i k e u t e n s a + p a t e n t t i o i k e u t t a + p a t e n t t i o n g e l m a a n + p a t e n t t i p e r h e + p a t e n t t i p e r i n n e + p a t e n t t i p o l i t i i k a n + p a t e n t t i p o l i t i i k a s t a + p a t e n t t i p o l i t i i k k a + p a t e n t t i p o l i t i i k k a a + p a t e n t t i p o o l e j a + p a t e n t t i p ä ä t ö s + p a t e n t t i r a t k a i s u a + p a t e n t t i r e k i s t e r i s s ä + p a t e n t t i r i i t o j a + p a t e n t t i r i i t o j e n + p a t e n t t i s a l k k u j a + p a t e n t t i s i n i n e n + p a t e n t t i s o p i m u k s e e n + p a t e n t t i s o p i m u k s e l l a + p a t e n t t i s o p i m u k s e n + p a t e n t t i s o p i m u k s e s s a + p a t e n t t i s o p i m u s + p a t e n t t i s t r a t e g i a a n + p a t e n t t i s u o j a + p a t e n t t i s u o j a a + p a t e n t t i s u o j a a n + p a t e n t t i s u o j a j ä r j e s t e l m ä + p a t e n t t i s u o j a j ä r j e s t e l m ä n + p a t e n t t i s u o j a k s i + p a t e n t t i s u o j a l l a + p a t e n t t i s u o j a l l e + p a t e n t t i s u o j a n + p a t e n t t i s u o j a n s a + p a t e n t t i s u o j a s t a + p a t e n t t i s u o j a t + p a t e n t t i s ä ä n n ö k s e t + p a t e n t t i s ä ä n n ö k s i ä + p a t e n t t i s ä ä n n ö t + p a t e n t t i s ä ä n t ö j e n + p a t e n t t i t o i m i n n a l l e + p a t e n t t i t o i m i s t o + p a t e n t t i t o i m i s t o n + p a t e n t t i t o i m i s t o o n + p a t e n t t i t r o l l i + p a t e n t t i t u o m i o i s t u i m e s s a + p a t e n t t i t u o m i o i s t u i n + p a t e n t t i t u o m i o i s t u i n j ä r j e s t e l m ä + p a t e n t t i t u o m i o i s t u i n j ä r j e s t e l m ä s t ä + p a t e n t t i t u o m i o i s t u i n t a + p a t e n t t i t u o m i o i s t u i n t e n + p a t e n t t i v i i d a k o s t a + p a t e n t t i v i r a n o m a i s i i n + p a t e n t t i v i r a n o m a i s t e n + p a t e n t t i v i r a s t o + p a t e n t t i v i r a s t o a + p a t e n t t i v i r a s t o i l l e + p a t e n t t i v i r a s t o j a + p a t e n t t i v i r a s t o j e n + p a t e n t t i v i r a s t o k i n + p a t e n t t i v i r a s t o l l a + p a t e n t t i v i r a s t o l l e + p a t e n t t i v i r a s t o n + p a t e n t t i v i r a s t o o n + p a t e n t t i v i r a s t o s s a + p a t e n t t i v i r a s t o s t a + p a t e n t t i v i r a s t o t + p a t e n t t i v i r h e + p a t e n t t i v ä i j y t y k s e n + p a t e n t t i v ä i j y t y k s e t + p a t e n t t i v ä i j y t y s + p a t e n t t i v ä i j y t y s o n g e l m a a + p a t e n t t i v ä i j y t y s t ä + p a t e n t t i y l e i s s o p i m u k s e e n + p a t e n t t i y l e i s s o p i m u k s e n + p a t e n t t i y l e i s s o p i m u k s e s s a + p a t e n t t i y l e i s s o p i m u s + p a t e n t t i y l e i s s o p i m u s t a + p a t e r n o s t e r p a p u + p a t i o n l ä m m i t t i m e t + p a t i o n l ä m m i t t i m i e n + p a t i o n l ä m m i t t i m i ä + p a t i s t e l l a + p a t i s t e t t a v a + p a t o a m i s p o l i t i i k k a + p a t o a m i s p o l i t i i k k a a + p a t o g e e n e i s s ä + p a t o g e e n i e n + p a t o g e e n i s t e n + p a t o h a n k k e e n + p a t o h a n k k e i d e n + p a t o h a n k k e i s i i n + p a t o i n f r a s t r u k t u u r i t + p a t o j a + p a t o k o m i s s i o n + p a t r i a r k a a l i s e n + p a t r i a r k a n + p a t s a i s t a + p a t s a s a i t t a + p a t s a s k i i s t a + p a t t i t i l a n n e + p a t t i t i l a n t e e n + p a t t i t i l a n t e e s e e n + p a t t i t i l a n t e e s t a + p a t t i v ä l s k ä r i + p a u h u i h i n + p a u k k u k a r a m e l l i + p a v u n + p a w n e e t + p a x t o n + p e d i a t r i s e s t i + p e d o f i i l i e n + p e d o f i i l i j ä r j e s t ö t + p e d o f i i l i k e t j u t + p e d o f i i l i o i k e u d e n k ä y n n i t + p e d o f i i l i p a p p e j a + p e d o f i i l i p u o l u e + p e d o f i i l i p u o l u e e n + p e d o f i i l i p u o l u e i t a + p e d o f i i l i r e k i s t e r i t + p e d o f i i l i r e n k a i t a + p e d o f i i l i r i n k i e n + p e d o f i i l i r y h m ä t + p e d o f i i l i s a d i s t i t + p e d o f i i l i s k a n d a a l i s t a + p e d o f i i l i t a p a u s t e n + p e d o f i i l i t e k o j a + p e d o f i i l i v e r k o s t o i s s a + p e d o f i i l i v e r k o s t o j a + p e d o f i i l i v e r k o t + p e d o f i l i a a + p e d o f i l i a n + p e d o f i l i a p u o l u e + p e d o f i l i a r i k o k s i a + p e d o f i l i a r i k o l l i s u u t t a + p e d o f i l i a s i v u s t o t + p e d o f i l i a t a i p u m u s t a a n + p e d o f i l i a v e r k o s t o i l t a + p e d o f i l i a v e r k o s t o j a + p e h m e n n e t y n + p e h m e n n y s a i n e e t + p e h m e n n y s a i n e i l t a + p e h m e n n y s a i n e i s t a + p e h m e n t i m i e n + p e h m e n t ä ä + p e h m e ä m p i ä + p e h m e ä n + p e h m e ä n ä + p e h m e ä s t ä + p e h m e ä t + p e h m e ä ä + p e h m i t t i m i e n + p e h m i t t i m i s s ä + p e h m i t t i m i s t ä + p e h m i t t i m i ä + p e h m o l e l u + p e h m o l e l u i h i n + p e h m o l e l u j a + p e h m o l e l u k s i + p e h m o l e l u t + p e h m o p a p e r i + p e h m o s i m p p u + p e h m y t k u d o k s i l l e + p e h m y t k u d o s s a r k o o m a + p e h m y t m e s i h e i n ä + p e i k k o h a i + p e i k k o k u n i n g a s + p e i k k o t a r i n o i t a + p e i k o n k ä m m e n + p e i l i h e i j a s t u s k a m e r a + p e i l i i n + p e i l i k a a p p i + p e i l i k i r j o i t u s + p e i l i k u v a + p e i l i m a a s s a + p e i l i m e s t a r i + p e i l i s o l u + p e i l i t e s t i + p e i n e + p e i s t ä + p e i t e j ä r j e s t ö i n ä + p e i t e j ä r j e s t ö j ä + p e i t e k u v a u s + p e i t e l a u s e + p e i t e l l y t + p e i t e l l ä + p e i t e l l ä k s e e n + p e i t e l t y j ä + p e i t e l t y ä + p e i t e n i m e l l ä + p e i t e n i m e l t ä ä n + p e i t e n i m e ä + p e i t e n i m i + p e i t e o r g a n i s a a t i o + p e i t e t a r i n o i t a + p e i t e t u t k i n t a + p e i t e t u t k i n t a a + p e i t e t ä ä n + p e i t e y r i t y k s i i n + p e i t e y r i t y k s i ä + p e i t s i k o l i b r i + p e i t s i p y r s t ö k o t t a r a i n e n + p e i t t e l e m i s e k s i + p e i t t e l e m ä t t ä + p e i t t e l e m ä ä n + p e i t t e l e v ä t + p e i t t e l y y n + p e i t t o a l u e e n + p e i t t o i l m i ö + p e i t t o k a p a s i t e e t t i a + p e i t t ä m ä l l ä + p e i t t ä m ä ä n + p e i t t ä n e e t + p e i t t ä ä + p e i t t ä ä k i n + p e i t t ä ä k s e e n + p e k o n i a + p e k o n i n + p e l a a j a j ä r j e s t ö j ä + p e l a a j a s i i r r o t + p e l a a j a s i i r t o j e n + p e l a a j a t + p e l a a j a y h d i s t y k s e t + p e l a a j a y h d i s t y k s i s t ä + p e l a a j i a + p e l a a j i e n + p e l a a j i n a + p e l a a j i s t a + p e l a a m a a n + p e l a a m a s t a + p e l a a m i s k y s y m y s t ä + p e l a a m i s o n g e l m a + p e l a a m m e k o + p e l a g i s e n + p e l a g i s t e n + p e l a i s i m m e + p e l a n n e e t + p e l a r g o n i h a p p o + p e l a s t a a + p e l a s t a a k s e e n + p e l a s t a a k s e m m e + p e l a s t a i s i v a t + p e l a s t a m a a n + p e l a s t a m i s e k s i + p e l a s t a m i s e s t a + p e l a s t a m i s j ä r j e s t e l m i s t ä + p e l a s t a m i s s u u n n i t e l m a n + p e l a s t a m i s s u u n n i t e l m i e n + p e l a s t a m i s t u e n + p e l a s t a m i s t u k i + p e l a s t a u t u m i s p u k u + p e l a s t e t t a e s s a + p e l a s t e t t a v a + p e l a s t e t t u a + p e l a s t e t t u j e n + p e l a s t e t u i k s i + p e l a s t i + p e l a s t u k s e e n + p e l a s t u n e i l l e + p e l a s t u s a l u e i d e n + p e l a s t u s a r m e i j a + p e l a s t u s a r m e i j a n + p e l a s t u s a s i o i s s a + p e l a s t u s e h d o t u s t e n + p e l a s t u s h e l i k o p t e r i + p e l a s t u s h e n k i l ö s t ö l l e + p e l a s t u s h e n k i l ö s t ö n + p e l a s t u s h e n k i l ö s t ö ä + p e l a s t u s i n t e r v e n t i o t a m m e + p e l a s t u s j o u k k o j a + p e l a s t u s j o u k k o j e n + p e l a s t u s j o u k o t + p e l a s t u s j ä r j e s t e l y t + p e l a s t u s k a l u s t o a + p e l a s t u s k e i n o j a + p e l a s t u s k e s k u s + p e l a s t u s k u l j e t u k s e t + p e l a s t u s l a i t t e i d e n + p e l a s t u s l a i t t e i t a + p e l a s t u s l a u s e k k e i t a + p e l a s t u s l a u t t o j a + p e l a s t u s l a u t t o j e n + p e l a s t u s l i i k e + p e l a s t u s l i i v e i n ä ä n + p e l a s t u s l i i v i s s ä + p e l a s t u s l i i v i t + p e l a s t u s m e k a n i s m e i h i n + p e l a s t u s m e k a n i s m i + p e l a s t u s m e k a n i s m i i n + p e l a s t u s m e k a n i s m i t + p e l a s t u s m o d u u l i e n + p e l a s t u s o h j e l m a a + p e l a s t u s o o p p e r a + p e l a s t u s o p e r a a t i o + p e l a s t u s o p e r a a t i o i d e n + p e l a s t u s o p e r a a t i o i h i n + p e l a s t u s o p e r a a t i o i l l e + p e l a s t u s o p e r a a t i o i s s a + p e l a s t u s o p e r a a t i o i s t a + p e l a s t u s o p e r a a t i o i t a + p e l a s t u s o p e r a a t i o n + p e l a s t u s o p e r a a t i o o n + p e l a s t u s o p e r a a t i o s s a + p e l a s t u s o p e r a a t i o t + p e l a s t u s p a k e t e i l l a + p e l a s t u s p a k e t e i n + p e l a s t u s p a k e t e i s t a + p e l a s t u s p a k e t i k s i + p e l a s t u s p a k e t i l l e + p e l a s t u s p a k e t i n + p e l a s t u s p a k e t i s s a + p e l a s t u s p a k e t i s t a + p e l a s t u s p a k e t t e i h i n + p e l a s t u s p a k e t t e j a + p e l a s t u s p a k e t t i + p e l a s t u s p a k e t t i a + p e l a s t u s p a k e t t i e n + p e l a s t u s p a k e t t i i n + p e l a s t u s p a l v e l u a + p e l a s t u s p a l v e l u a l a + p e l a s t u s p a l v e l u a l a a + p e l a s t u s p a l v e l u a l a l l a + p e l a s t u s p a l v e l u a l a n + p e l a s t u s p a l v e l u a m m e + p e l a s t u s p a l v e l u a p u + p e l a s t u s p a l v e l u a p u a + p e l a s t u s p a l v e l u a s i o i d e n + p e l a s t u s p a l v e l u e l i n + p e l a s t u s p a l v e l u i d e n + p e l a s t u s p a l v e l u i h i n + p e l a s t u s p a l v e l u i l l e + p e l a s t u s p a l v e l u i n s t r u m e n t i s t a + p e l a s t u s p a l v e l u i s s a + p e l a s t u s p a l v e l u i t a + p e l a s t u s p a l v e l u j a + p e l a s t u s p a l v e l u j a m m e + p e l a s t u s p a l v e l u j e m m e + p e l a s t u s p a l v e l u j e n + p e l a s t u s p a l v e l u j o u k k o i h i n + p e l a s t u s p a l v e l u j o u k k o j a + p e l a s t u s p a l v e l u j o u k k o j e n + p e l a s t u s p a l v e l u j o u k k o m m e + p e l a s t u s p a l v e l u j o u k o i s t a + p e l a s t u s p a l v e l u j o u k o t + p e l a s t u s p a l v e l u j ä r j e s t e l m i ä + p e l a s t u s p a l v e l u j ä r j e s t e l m ä n + p e l a s t u s p a l v e l u j ä r j e s t e l m ä ä + p e l a s t u s p a l v e l u j ä r j e s t e l m ä ä m m e + p e l a s t u s p a l v e l u j ä r j e s t e l m ä ä n + p e l a s t u s p a l v e l u j ä r j e s t e l y i h i n + p e l a s t u s p a l v e l u k a p a s i t e e t t i a + p e l a s t u s p a l v e l u k e s k u k s e n + p e l a s t u s p a l v e l u l l e + p e l a s t u s p a l v e l u m a h d o l l i s u u d e t + p e l a s t u s p a l v e l u m e k a n i s m e i l l a + p e l a s t u s p a l v e l u m e k a n i s m e j a + p e l a s t u s p a l v e l u m e k a n i s m i + p e l a s t u s p a l v e l u m e k a n i s m i a + p e l a s t u s p a l v e l u m e k a n i s m i e n + p e l a s t u s p a l v e l u m e k a n i s m i l l a + p e l a s t u s p a l v e l u m e k a n i s m i l l e + p e l a s t u s p a l v e l u m e k a n i s m i l t a + p e l a s t u s p a l v e l u m e k a n i s m i m m e + p e l a s t u s p a l v e l u m e k a n i s m i n + p e l a s t u s p a l v e l u m e k a n i s m i n s a + p e l a s t u s p a l v e l u m e k a n i s m i s t a + p e l a s t u s p a l v e l u m o d u u l i e n + p e l a s t u s p a l v e l u n + p e l a s t u s p a l v e l u o h j e l m a n + p e l a s t u s p a l v e l u o r g a n i s a a t i o i l l a + p e l a s t u s p a l v e l u p o l i t i i k k a a + p e l a s t u s p a l v e l u r a h a s t o n + p e l a s t u s p a l v e l u r e s u r s s e j a + p e l a s t u s p a l v e l u r e s u r s s i e n + p e l a s t u s p a l v e l u r e s u r s s i t + p e l a s t u s p a l v e l u r y h m ä + p e l a s t u s p a l v e l u r y h m ä n + p e l a s t u s p a l v e l u r y h m ä t + p e l a s t u s p a l v e l u s s a + p e l a s t u s p a l v e l u s t a + p e l a s t u s p a l v e l u t + p e l a s t u s p a l v e l u t o i m e n p i t e i d e n + p e l a s t u s p a l v e l u t o i m e t + p e l a s t u s p a l v e l u t o i m i a + p e l a s t u s p a l v e l u t o i m i e n + p e l a s t u s p a l v e l u t o i m i l l a + p e l a s t u s p a l v e l u t o i m i n n a n + p e l a s t u s p a l v e l u t o i m i n t a + p e l a s t u s p a l v e l u t o i m i n t a a + p e l a s t u s p a l v e l u t o i m i s t a + p e l a s t u s p a l v e l u t u k e a + p e l a s t u s p a l v e l u u n + p e l a s t u s p a l v e l u v a l i o k u n n a n + p e l a s t u s p a l v e l u v a l m i u k s i a + p e l a s t u s p a l v e l u v a l m i u k s i e n + p e l a s t u s p a l v e l u v a l m i u k s i l l a + p e l a s t u s p a l v e l u v a l m i u k s i s t a + p e l a s t u s p a l v e l u v a r o j e n + p e l a s t u s p a l v e l u v i r a n o m a i s e n + p e l a s t u s p a l v e l u v i r a n o m a i s e t + p e l a s t u s p a l v e l u v i r a n o m a i s i i n + p e l a s t u s p a l v e l u v i r a s t o + p e l a s t u s p a l v e l u v i r a s t o n + p e l a s t u s p a l v e l u v o i m i e n + p e l a s t u s p a l v e l u y k s i k k ö + p e l a s t u s p a l v e l u y k s i k k ö j ä + p e l a s t u s p a l v e l u y k s i k k ö ä + p e l a s t u s p a l v e l u y k s i k k ö ö n + p e l a s t u s p a l v e l u y k s i k ö i d e n + p e l a s t u s p a l v e l u y k s i k ö i t ä + p e l a s t u s p a l v e l u y k s i k ö l t ä m m e + p e l a s t u s p a l v e l u y k s i k ö n + p e l a s t u s r a h a s t o n + p e l a s t u s r a h a s t o o n + p e l a s t u s r i n t a m a + p e l a s t u s r y h m i e n + p e l a s t u s r y h m i l l e + p e l a s t u s r y h m i ä + p e l a s t u s r y h m ä n + p e l a s t u s r y h m ä t + p e l a s t u s r y h m ä ä + p e l a s t u s s a a r e k e + p e l a s t u s s t r a t e g i a + p e l a s t u s s u u n n i t e l m a + p e l a s t u s s u u n n i t e l m a a + p e l a s t u s s u u n n i t e l m a a n + p e l a s t u s s u u n n i t e l m a k s i + p e l a s t u s s u u n n i t e l m a n + p e l a s t u s s u u n n i t e l m a s t a + p e l a s t u s s u u n n i t e l m a t + p e l a s t u s s u u n n i t e l m i e n + p e l a s t u s s u u n n i t e l m i i n + p e l a s t u s s u u n n i t e l m i s t a + p e l a s t u s t e h t ä v i e n + p e l a s t u s t e h t ä v i i n + p e l a s t u s t e h t ä v i s t ä + p e l a s t u s t e h t ä v i ä + p e l a s t u s t e h t ä v ä t + p e l a s t u s t e k n i i k o i d e n + p e l a s t u s t e k n i i k o i h i n + p e l a s t u s t i i m e i l l e + p e l a s t u s t i i m i i n + p e l a s t u s t i i m i n + p e l a s t u s t o i m e n p i d e + p e l a s t u s t o i m e n p i t e e t + p e l a s t u s t o i m e n p i t e i d e n + p e l a s t u s t o i m e n p i t e i s i i n + p e l a s t u s t o i m e n p i t e i t ä + p e l a s t u s t o i m e t + p e l a s t u s t o i m i + p e l a s t u s t o i m i a + p e l a s t u s t o i m i a m m e + p e l a s t u s t o i m i e n + p e l a s t u s t o i m i i n + p e l a s t u s t o i m i n n a n + p e l a s t u s t o i m i n n a s s a + p e l a s t u s t o i m i n n a s t a + p e l a s t u s t o i m i n t a a + p e l a s t u s t o i m i n t a a n + p e l a s t u s t o i m i n t a k y v y n + p e l a s t u s t o i m i s t a + p e l a s t u s t o r n i + p e l a s t u s t y ö n t e k i j ä t + p e l a s t u s t y ö n t e k i j ö i d e n + p e l a s t u s t y ö n t e k i j ö i l l e + p e l a s t u s t y ö n t e k i j ö i s t ä + p e l a s t u s t y ö n t e k i j ö i t ä + p e l a s t u s v a l m i u k s i a + p e l a s t u s v o i m i e n + p e l a s t u s y h t i ö t ä + p e l a s t u s y k s i k k ö + p e l a s t u s y k s i k k ö j e n + p e l a s t u s y k s i k ö i d e n + p e l a s t u s y k s i k ö t + p e l a s t u u + p e l a s t u u k o + p e l a t a + p e l a t a a n + p e l a t e s s a a n + p e l a t t a v a + p e l a t t i i n + p e l e i h i n + p e l e i l l ä ä n + p e l e i s t ä + p e l e j ä + p e l i a u t o m a a t e i s t a + p e l i e n + p e l i h a r r a s t u k s e s t a a n + p e l i h o u s u j a a n + p e l i i n + p e l i k a a n i a n k e r i a s + p e l i k a a n i p i i p p u k ö y n n ö s + p e l i k a s i n o t o i m i n n a s t a + p e l i k e n t t ä + p e l i k e n t t ä n ä + p e l i k e n t t ä ä + p e l i k e n t ä k s i + p e l i k e n t ä l l e + p e l i k e n t ä l l ä + p e l i k e n t ä n + p e l i k o k e m u s t a + p e l i k o n s o l e i l l e + p e l i k o n s o l e i s s a + p e l i k o n s o l i + p e l i k o n s o l i s t a + p e l i k o n s o l i t + p e l i k u l t t u u r i a + p e l i k u l t t u u r i s t a + p e l i l a u d a l t a + p e l i l u o l a + p e l i m a a i l m a n + p e l i m a h d o l l i s u u d e n + p e l i m a r k k i n o i d e n + p e l i m e r k k i ä + p e l i m i e h e n + p e l i m o o t t o r i + p e l i n + p e l i n a i s e t + p e l i n a p p u l a + p e l i n a p p u l a n + p e l i n a p p u l a n a + p e l i n a p p u l o i k s i + p e l i n a p p u l o i n a + p e l i n a p p u l o i t a + p e l i n a p p u l o i t a a n + p e l i n s ä ä n t ö j ä + p e l i n t e k i j ä + p e l i n u m e r o n + p e l i p a i k o i s t a + p e l i p a l v e l i n + p e l i p a l v e l i n e m u l o i n t i + p e l i p a l v e l u j a + p e l i p a l v e l u j e n + p e l i p a l v e l u t + p e l i p o r t t i + p e l i r a h a k k e e n + p e l i r i i p p u v a i s i k s i + p e l i r i i p p u v a i s t a + p e l i r i i p p u v a i s t e n + p e l i r i i p p u v u u d e l t a + p e l i r i i p p u v u u d e n + p e l i r i i p p u v u u s + p e l i r i i p p u v u u t t a + p e l i s i v u s t o i l l e + p e l i s s ä + p e l i s t ä + p e l i s ä ä n n ö i l l e + p e l i s ä ä n n ö i s t ä + p e l i s ä ä n n ö t + p e l i s ä ä n t ö + p e l i s ä ä n t ö i h i n + p e l i s ä ä n t ö i n e e n + p e l i s ä ä n t ö j e m m e + p e l i s ä ä n t ö j e n + p e l i s ä ä n t ö j ä + p e l i s ä ä n t ö j ä ä n + p e l i s ä ä n t ö n ä + p e l i s ä ä n t ö ä + p e l i t a l o + p e l i t e o l l i s u u d e n + p e l i t e o r i a + p e l i t e o r i a n + p e l i t i e t o + p e l i t i l a a + p e l i t o i m i n t a a + p e l i t u t k i m u s + p e l i v a r a + p e l i v a r a a + p e l i v a r a t + p e l i y h t i ö i l l e + p e l i y m p ä r i s t ö n + p e l i ä + p e l i ä ä n + p e l k i k s i + p e l k i l l ä + p e l k i n + p e l k i s s ä + p e l k i s t e t t y j e n + p e l k i s t ä m i s t ä + p e l k i s t ä v i ä + p e l k i s t ä ä + p e l k k i e n + p e l k k i i n + p e l k k i n ä + p e l k k i ä + p e l k k ä n ä + p e l k k ä ä + p e l k k ä ä n + p e l k o a + p e l k o j a + p e l k o j a n i + p e l k o j e n + p e l k o k a m e r a + p e l k o k e r r o i n + p e l k o m m e + p e l k o n a a n + p e l k o t e k i j ä ä + p e l k o t e k i j ö i t ä + p e l k u r e i l t a + p e l k u r i m a i s e m m i n + p e l k u r i m a i s t a + p e l k ä k s i + p e l k ä l l ä + p e l k ä l t ä + p e l k ä n + p e l k ä s i m m e + p e l k ä s i n + p e l k ä s t ä + p e l k ä t + p e l k ä ä k ö + p e l k ä ä m m e + p e l k ä ä m m e k i n + p e l k ä ä m ä t t ä + p e l k ä ä m ä ä n + p e l k ä ä n + p e l k ä ä n k i n + p e l k ä ä n k ö + p e l k ä ä n p ä + p e l k ä ä t t e + p e l k ä ä t t e k ö + p e l k ä ä v ä t + p e l k ä ä v ä t k i n + p e l k ä ä v ä t k ö + p e l l a v a n j a l o s t u s l a i t o k s i s s a + p e l l a v a n v i l j e l y + p e l l a v a n v i l j e l y s t ä + p e l l a v a p e t o k s e s t a + p e l l a v a p e t o k s i a + p e l l a v a s a k k o a + p e l l a v a t a k k e j a + p e l l a v a t a p a u s t a + p e l l a v a ö l j y + p e l l e i l l ä + p e l l e i l y k s i + p e l l e i l y ä + p e l l o i l l e e n + p e l l o l t a + p e l l o n + p e l l o n p o i s t o + p e l l o s t a + p e l o i n + p e l o i s s a a n + p e l o i s t a + p e l o i s t a a n + p e l o k k a a m m i n + p e l o k k a a t + p e l o n + p e l o n a i h e i t a + p e l o n l i e t s o j a t + p e l o p o n n e s o l a i s l i i t t o + p e l o p o n n e s o l a i s s o d a s t a + p e l o p o n n e s o l a i s s o t a + p e l o s t a + p e l o t + p e l o t e l l a + p e l o t e l l a k s e e n + p e l o t e l t a v a k s i + p e l o t e p o l i t i i k a s t a + p e l o t e p o l i t i i k k a m m e + p e l o t e s t r a t e g i a s t a + p e l o t e t o i m i a + p e l o t e t t a + p e l o t e v a i k u t u k s e n + p e l o t e v a i k u t u s + p e l o t t a + p e l o t t a a + p e l o t t a v a a + p e l o t t a v a m m a n + p e l o t t a v a m m i l t a + p e l o t t a v a m p a a + p e l o t t a v a m p i + p e l o t t a v a m p i a + p e l o t t a v i a + p e l o t t a v i m m i s t a + p e l o t t e e n + p e l o t t e e n a + p e l o t t e i t a + p e l o t t e l e m i s e k s i + p e l o t t e l u k a m p a n j a + p e l o t t e l u k a m p a n j a a + p e l o t t e l u k a m p a n j a n + p e l o t t e l u k a m p a n j a t + p e l o t t e l u s t a + p e l o t t e l u t a k t i i k a k s i + p e l o t t e l u t a k t i i k a t + p e l o t t e l u t a k t i i k k a a + p e l o t t e l u t a k t i i k k a n a + p e l o t t e l u t o i m i s t a + p e l o t t o m a t + p e l o t t o m i m p i e n + p e l o t u s k e i n o j a + p e l o t u s m e n e t e l m i s t ä + p e l t i e r i n + p e l t i e r i s t ä + p e l t i h a t t u + p e l t i p u r k k i k a t e d r a a l i + p e l t i r u m p u + p e l t i t ö l k e i s t ä + p e l t i t ö l k k e j ä ä n + p e l t o a l a s t a + p e l t o e m ä k k i + p e l t o h a n h i k k i + p e l t o h a t i k k a + p e l t o h e r k k u s i e n i + p e l t o h e r n e i d e n + p e l t o h i i r i + p e l t o j a + p e l t o j e n + p e l t o k a n a n k a a l i + p e l t o k a p a s i t e e t t i p ä i v i i n + p e l t o k a s v e i h i n + p e l t o k a s v e i l l e + p e l t o k a s v e i l t a + p e l t o k a s v e j a + p e l t o k a s v i a l a l l a + p e l t o k a s v i e n + p e l t o k a s v i t + p e l t o k a s v i t u o t t e i d e n + p e l t o k a s v i v i l j e l m i ä + p e l t o k i e r t o + p e l t o k o r t e + p e l t o k u r j e n n o k k a + p e l t o l a u l u t u r p i a a l i + p e l t o l e i n i k k i + p e l t o l e m m i k k i + p e l t o l e s k i + p e l t o m a a n a + p e l t o m a a s t a + p e l t o m a i t i k k a + p e l t o m a r a t t i + p e l t o m a t a r a + p e l t o m y y r ä + p e l t o n ä t k e l m ä + p e l t o p i l l i k e + p e l t o p o h j a i s e n + p e l t o p o i m u l e h t i + p e l t o p u n k a + p e l t o p y y + p e l t o p ä h k ä m ö + p e l t o r a s t i + p e l t o r e t i k k a + p e l t o r u s o j u u r i + p e l t o s a u n i o + p e l t o s a u r a m o + p e l t o s i r k k u + p e l t o t a s k u r u o h o + p e l t o t u k i i n + p e l t o t u o t t e i s t a + p e l t o t u r p i a a l i + p e l t o t y ö n s ä + p e l t o u k o n n a u r i s + p e l t o v a l v a t t i + p e l t o v i i r i ä i n e n + p e l t o v i l j e l i j ö i d e n + p e l t o v i l j e l y j ä r j e s t e l m ä ä m m e + p e l t o v i l j e l y k a s v e i s t a + p e l t o v i l j e l y k a s v i e n + p e l t o v i l j e l y k a s v i t + p e l t o v i l j e l y m a a n + p e l t o v i l j e l y p o l i t i i k k a a + p e l t o v i l j e l y s s ä + p e l t o v i l j e l y t i l a n + p e l t o v i l l a k k o + p e l t o v i r v i l ä + p e l ä n n y t + p e l ä s t y i v ä t + p e l ä s t y t t ä m ä t t ä + p e l ä t t ä v ä ä + p e l ä t y i m m i s s ä + p e l ä t ä + p e l ä t ä ä n + p e l ä t ä ä n k ö + p e n e j ä + p e n i k k a t a u t i + p e n i k s e n s i i r t o + p e n i n k u l m a + p e n i s k a t e u s + p e n i s m u r t u m a + p e n i s p l e t y s m o g r a f i + p e n i s r e n g a s + p e n i s s y ö p ä + p e n k i l l e + p e n k i l l ä + p e n k k i p u n n e r r u s + p e n k k i p u n n e r r u s p a i t a + p e n k k i r i v i s s ä + p e n k k i u r h e i l u + p e n k k i u r h e i l u a + p e n k k i u r h e i l u l a j i + p e n k o m i s e s t a + p e n n i l l e e n + p e n n i n h e i t o k s i + p e n n i n h e i t t o p e l i l t ä + p e n n i ä k ä ä n + p e n n y j ä ä t i k k ö + p e n s a a n + p e n s a a s e e n + p e n s a a s s a + p e n s a i k k o p y y j u o k s i j a + p e n s a s a m p i a i n e n + p e n s a s b u l b u l i + p e n s a s h a n h i k k i + p e n s a s h e p o k a t t i + p e n s a s h o h t o k o l i b r i + p e n s a s k a n u k k a + p e n s a s k e r t t u + p e n s a s k e r t t u l i + p e n s a s k i r j o r a s t a s + p e n s a s k o i r a + p e n s a s k o l i b r i + p e n s a s k o t i l o + p e n s a s k ä r h ö + p e n s a s k ä ä r m e + p e n s a s k ä ä r m e k u r k i + p e n s a s l e p i n k ä i n e n + p e n s a s m e s i k k o + p e n s a s m u s t i k k a + p e n s a s n a a m i o s i r k k u + p e n s a s p a l o + p e n s a s p a l o a + p e n s a s p a l o n + p e n s a s p a p r i k a + p e n s a s s e m b r a + p e n s a s s i e p p a r i + p e n s a s s i l k k i k e r t t u n e n + p e n s a s s i n i n o k k a + p e n s a s s i r k k a l i n t u + p e n s a s s i r k k u + p e n s a s t i a i s k e r t t u + p e n s a s t i a i s t i m a l i + p e n s a s t i m a l i + p e n s a s t ö p ö s i e p p o + p e n s a s u u n i l i n t u + p e n s a s v a r p u n e n + p e n s a s v ä r i h e r n e + p e n s s e l i s i k a + p e n t a b r o m i d i f e n y y l i e e t t e r i l l e + p e n t a b r o m i d i f e n y y l i e e t t e r i n + p e n t a b r o m i d i f e n y y l i e e t t e r i s t ä + p e n t a g o n i s t a + p e n t o o s i f o s f a a t t i r e i t t i + p e n t u t e h t a i l u + p e p t i d i s i d o s + p e r a t t a v a a + p e r b e n t s o e h a p p o + p e r e h d y t t ä m i s e k s i + p e r e h d y t t ä m i s k o u l u t u k s e s t a + p e r e h d y t ä ä n + p e r e h t y i s i t t e + p e r e h t y m i s j a k s o o n + p e r e h t y m ä t t ä + p e r e h t y m ä t t ö m i s t ä + p e r e h t y n e e t + p e r e h t y n e i l l e + p e r e h t y n e i l l ä + p e r e h t y ä + p e r e t i k k a h a p p o + p e r f l u o r i o k t a a n i h a p p o + p e r h e a l l i a n s s i + p e r h e a l l i a n s s i n + p e r h e a l l i a n s s i s t a + p e r h e a r v o i h i n + p e r h e a r v o j a + p e r h e a r v o j e n + p e r h e a s e m a a n + p e r h e a s e m a s t a + p e r h e a s i a n + p e r h e a s i a s t a + p e r h e a s i o i d e n + p e r h e a s i o i h i n + p e r h e a s i o i s s a + p e r h e a s i o i s t a + p e r h e a s i o i t a + p e r h e a t e r i o i d e n + p e r h e a u t o n + p e r h e a v u s t u k s e t + p e r h e a v u s t u k s i a + p e r h e a v u s t u k s i e n + p e r h e a v u s t u k s i i n + p e r h e a v u s t u s + p e r h e d r a a m o j a + p e r h e e l l e + p e r h e e l l e e n + p e r h e e m m e + p e r h e e n + p e r h e e n i s i s t ä + p e r h e e n i s i ä + p e r h e e n i s ä + p e r h e e n i s ä t + p e r h e e n j ä s e n + p e r h e e n j ä s e n e e n + p e r h e e n j ä s e n e k s i + p e r h e e n j ä s e n e l l ä n i + p e r h e e n j ä s e n e m m e + p e r h e e n j ä s e n e n + p e r h e e n j ä s e n e n s ä + p e r h e e n j ä s e n e n ä + p e r h e e n j ä s e n e t + p e r h e e n j ä s e n i e n + p e r h e e n j ä s e n i i n + p e r h e e n j ä s e n i i n s ä + p e r h e e n j ä s e n i k s i + p e r h e e n j ä s e n i l l e + p e r h e e n j ä s e n i l l e e n + p e r h e e n j ä s e n i l l ä + p e r h e e n j ä s e n i l l ä ä n + p e r h e e n j ä s e n i n ä + p e r h e e n j ä s e n i s t ä + p e r h e e n j ä s e n i s t ä m m e + p e r h e e n j ä s e n i s t ä ä n + p e r h e e n j ä s e n i ä + p e r h e e n j ä s e n i ä ä n + p e r h e e n j ä s e n t e m m e + p e r h e e n j ä s e n t e n + p e r h e e n j ä s e n t e n s ä + p e r h e e n j ä s e n t ä + p e r h e e n p ä i k s i + p e r h e e n p ä i l l ä + p e r h e e n p ä ä + p e r h e e n s u u n n i t t e l u n + p e r h e e n s ä + p e r h e e n y h d i s t ä m i n e n + p e r h e e n y h d i s t ä m i s e e n + p e r h e e n y h d i s t ä m i s e l l ä + p e r h e e n y h d i s t ä m i s e n + p e r h e e n y h d i s t ä m i s e s s ä + p e r h e e n y h d i s t ä m i s e s t ä + p e r h e e n y h d i s t ä m i s m e n e t t e l y i s s ä + p e r h e e n y h d i s t ä m i s p r o s e s s i n + p e r h e e n y h d i s t ä m i s t o i m e t + p e r h e e n y h d i s t ä m i s t ä + p e r h e e n ä i d i l l ä + p e r h e e n ä i d i t + p e r h e e s e e n + p e r h e e s e e n s ä + p e r h e e s s ä + p e r h e e s s ä ä n + p e r h e e s t ä + p e r h e e s t ä n i + p e r h e e s t ä ä n + p e r h e e t + p e r h e h e n k e ä + p e r h e h i s t o r i a a + p e r h e h u o l l o n + p e r h e h ä i d e n + p e r h e i d e n + p e r h e i d e n s ä + p e r h e i l l e + p e r h e i l l e e n + p e r h e i l t ä + p e r h e i n s t i t u u t i o + p e r h e i n s t i t u u t i o t a + p e r h e i s i i n + p e r h e i s s ä + p e r h e i s t ä + p e r h e i s t ä ä n + p e r h e i t t e n s ä + p e r h e i t ä + p e r h e i t ä ä n + p e r h e j o u l u a + p e r h e j u h l a a + p e r h e j ä r j e s t ö i l l e + p e r h e j ä r j e s t ö t + p e r h e k a s v a t u k s e n + p e r h e k e h i t y s h a n k k e i t a + p e r h e k e s k e i s t ä + p e r h e k e s k e i s y y d e n + p e r h e k o n t e k s t i t + p e r h e k u s t a n n u k s i a + p e r h e k u v a + p e r h e k u v a a + p e r h e k u v a a n + p e r h e k y s y m y k s e s s ä + p e r h e k y s y m y k s e s t ä + p e r h e k y s y m y k s i s t ä + p e r h e k ä s i t e + p e r h e k ä s i t e t t ä + p e r h e k ä s i t t e e s s ä + p e r h e k ä s i t y k s e s t ä + p e r h e k ä s i t y s t ä + p e r h e k ä y t ä n t ö j ä + p e r h e l a i n + p e r h e l a i n s ä ä d ä n n ö n + p e r h e l a i n s ä ä d ä n n ö s s ä + p e r h e l a i n s ä ä d ä n n ö s t ä + p e r h e l a i n s ä ä d ä n t ö + p e r h e l a i n s ä ä d ä n t ö ä + p e r h e l a i n s ä ä d ä n t ö ö n + p e r h e l a i n s ä ä d ä n t ö ö n s ä + p e r h e l a k i a + p e r h e l i i t t o + p e r h e l i i t t o j a + p e r h e l o m a + p e r h e l u o n t e i s i s s a + p e r h e l ä ä k ä r e i l l e + p e r h e l ä ä k ä r e i t ä + p e r h e l ä ä k ä r i + p e r h e m a a n v i l j e l y n + p e r h e m a a t a l o u d e n + p e r h e m a a t i l a m a l l i n + p e r h e m a a t i l a p e r i n n e t t ä + p e r h e m a a t i l a t + p e r h e m a a t i l o j a + p e r h e m a a t i l o j e m m e + p e r h e m a a t i l o j e n + p e r h e m a l l e j a + p e r h e m a l l i + p e r h e m a l l i a + p e r h e m a l l i e n + p e r h e m a l l i i n + p e r h e m a l l i k s i + p e r h e m a l l i n + p e r h e m a l l i s t a + p e r h e m a l l i t + p e r h e m i n i s t e r i t + p e r h e m u o t o j e n + p e r h e m y ö n t e i s e e n + p e r h e m y ö n t e i s e k s i + p e r h e m y ö n t e i s t ä + p e r h e n e u v o s t o + p e r h e n ä k ö k o h t i e n + p e r h e o i k e u d e l l e + p e r h e o i k e u d e l l i n e n + p e r h e o i k e u d e n + p e r h e o i k e u d e s s a + p e r h e o i k e u d e s t a + p e r h e o i k e u d e t + p e r h e o i k e u k s i e n + p e r h e o i k e u k s i s s a + p e r h e o i k e u s + p e r h e o i k e u t e e n + p e r h e o i k e u t e m m e + p e r h e o i k e u t t a + p e r h e o l o i s t a + p e r h e o l o j a a n + p e r h e o m a i s u u t e n s a + p e r h e o m i s t e i s t a + p e r h e o m i s t u k s e e n + p e r h e o n g e l m i a + p e r h e o n g e l m i s t a + p e r h e o n n e t t o m u u k s i a + p e r h e p a k e t i n + p e r h e p a l v e l u i h i n + p e r h e p i i r i i n + p e r h e p i i r i s s ä + p e r h e p i i r i s s ä ä n + p e r h e p i i r i s t ä + p e r h e p o l i i t t i s e e n + p e r h e p o l i i t t i s e t + p e r h e p o l i i t t i s t a + p e r h e p o l i i t t i s t e n + p e r h e p o l i t i i k a l l a + p e r h e p o l i t i i k a l l e + p e r h e p o l i t i i k a n + p e r h e p o l i t i i k a s s a + p e r h e p o l i t i i k a s t a + p e r h e p o l i t i i k k a + p e r h e p o l i t i i k k a a + p e r h e p o l i t i i k k a a n + p e r h e p o l i t i i k k a a n s a + p e r h e p o l i t i i k k a m m e + p e r h e p o l i t i i k k o i h i n + p e r h e p o l i t i i k k o i n e e n + p e r h e p o l i t i i k k o j a + p e r h e p o l i t i i k k o j e n + p e r h e p o t r e t t i i n + p e r h e p r o f i i l e i h i n + p e r h e r a h a s t o + p e r h e r a h a s t o n + p e r h e r a k e n t e e n + p e r h e r a k e n t e e s s a + p e r h e r a k e n t e e t + p e r h e r a k e n t e i d e n + p e r h e r a k e n t e i s i i n + p e r h e r a k e n t e i s s a + p e r h e r i i d o i s s a + p e r h e r i i t o i h i n + p e r h e r i i t o j a + p e r h e r i i t o j e n + p e r h e s e i k a t + p e r h e s i i r t o l a i s u u t t a + p e r h e s i t e e n s ä + p e r h e s i t e e t + p e r h e s i t e i d e n + p e r h e s i t e i t ä + p e r h e s i t o u m u k s i l l a + p e r h e s i t o u m u s t e n + p e r h e s i t o u m u s t e n s a + p e r h e s u h d e + p e r h e s u h t e e n s a + p e r h e s u h t e e t + p e r h e s u h t e i d e n + p e r h e s u h t e i s i i n + p e r h e s u h t e i s t a + p e r h e s u h t e i t a + p e r h e s u u n n i t t e l u + p e r h e s u u n n i t t e l u a + p e r h e s u u n n i t t e l u k e i n o n a + p e r h e s u u n n i t t e l u m e n e t e l m i s t ä + p e r h e s u u n n i t t e l u m e n e t e l m i ä + p e r h e s u u n n i t t e l u m e n e t e l m ä n ä + p e r h e s u u n n i t t e l u m e n e t e l m ä ä + p e r h e s u u n n i t t e l u n + p e r h e s u u n n i t t e l u o h j e l m a + p e r h e s u u n n i t t e l u o h j e l m a a + p e r h e s u u n n i t t e l u o h j e l m i e n + p e r h e s u u n n i t t e l u o h j e l m i i n + p e r h e s u u n n i t t e l u p a l v e l u j a + p e r h e s u u n n i t t e l u p a l v e l u t + p e r h e s u u n n i t t e l u p o l i t i i k a n + p e r h e s u u n n i t t e l u p o l i t i i k k a a + p e r h e s u u n n i t t e l u s s a + p e r h e s u u n n i t t e l u s t a + p e r h e s u u n n i t t e l u t a v o i s t a + p e r h e s u u n n i t t e l u t o i m e n p i d e t t ä + p e r h e s u u n n i t t e l u u n + p e r h e s u u n n i t t e l u v ä l i n e e n ä + p e r h e s u u n t a u t u n e i s u u t e e n + p e r h e s y i d e n + p e r h e s y i s t ä + p e r h e s y y s t ä + p e r h e s y y t + p e r h e s ä ä n n ö s t ö n + p e r h e t a p a a m i s e e n + p e r h e t a s o l l a + p e r h e t a u s t a + p e r h e t i e d o t u s p a k e t t i e n + p e r h e t i l a a + p e r h e t i l a l l a + p e r h e t i l a n n e t t a a n + p e r h e t i l a n t e e n s a + p e r h e t i l a n t e e s t a a n + p e r h e t i l a n t e e t + p e r h e t i l a n t e i s i i n + p e r h e t i l a r a k e n n e t t a + p e r h e t i l a t + p e r h e t i l a y k s i k ö t + p e r h e t i l o i h i m m e + p e r h e t i l o i h i n + p e r h e t i l o i l l a + p e r h e t i l o i l l a m m e + p e r h e t i l o i l l e + p e r h e t i l o i l l e k a a n + p e r h e t i l o i s t a + p e r h e t i l o j a + p e r h e t i l o j e n + p e r h e t r a g e d i a + p e r h e t r a g e d i a t + p e r h e t r a g e d i o i h i n + p e r h e t r a g e d i o i s t a + p e r h e t r a g e d i o i t a + p e r h e t t ä + p e r h e t t ä n i + p e r h e t u k e e n + p e r h e t u k i a + p e r h e t u k i a l l i a n s s i s t a + p e r h e t u k i p o l i t i i k a l l a + p e r h e t y ö l l i s y y d e l l e + p e r h e t y ö v o i m a y k s i k k ö ä + p e r h e u l o t t u v u u d e n + p e r h e v a p a a j ä r j e s t e l m ä + p e r h e v a p a a n + p e r h e v a p a a t + p e r h e v a p a i t a + p e r h e v a s t u u s t a a n + p e r h e v e l v o i t t e e n s a + p e r h e v e l v o i t t e i d e n + p e r h e v e l v o i t t e i l l e e n + p e r h e v e l v o i t t e i s t a + p e r h e v e l v o i t t e i t a + p e r h e v e l v o l l i s u u d e t + p e r h e v e l v o l l i s u u k s i a a n + p e r h e v e l v o l l i s u u k s i e n + p e r h e v e l v o l l i s u u k s i e n s a + p e r h e v e r o n + p e r h e v e r o t o i m e t + p e r h e v i e r a i l u j e n + p e r h e v i l j e l i j ö i t ä + p e r h e v i l j e l m i e n + p e r h e v i l j e l m i i n + p e r h e v i l j e l m i l l e + p e r h e v i l j e l m i l l ä + p e r h e v i l j e l m i s t ä + p e r h e v i l j e l m i ä + p e r h e v i l j e l m ä + p e r h e v i l j e l m ä p o h j a i n e n + p e r h e v i l j e l m ä t + p e r h e v i l j e l y + p e r h e v i l j e l y k s i l l e + p e r h e v i l j e l y n + p e r h e v i l j e l y y n + p e r h e v i l j e l y ä + p e r h e v ä k i v a l l a l l e + p e r h e v ä k i v a l l a l t a + p e r h e v ä k i v a l l a n + p e r h e v ä k i v a l l a s s a + p e r h e v ä k i v a l l a s t a + p e r h e v ä k i v a l t a + p e r h e v ä k i v a l t a a + p e r h e v ä k i v a l t a a n + p e r h e v ä k i v a l t a t a p a u k s i a + p e r h e v ä k i v a l t a t a p a u k s i e n + p e r h e v ä k i v a l t a t a p a u s t a + p e r h e v ä k i v a l t a t a p a u s t e n + p e r h e v ä l i t t ä j ä ä + p e r h e y h d i s t y k s e t + p e r h e y h d i s t y k s i ä + p e r h e y h t e i s ö + p e r h e y h t e i s ö s s ä + p e r h e y h t e i s ö t + p e r h e y h t e i s ö ö n + p e r h e y h t e y d e t + p e r h e y h t e y k s i e n + p e r h e y h t e y k s i ä + p e r h e y h t e y s + p e r h e y h t e y t t ä + p e r h e y h t ä l ä i s y y s + p e r h e y k s i k k ö + p e r h e y k s i k k ö ä + p e r h e y k s i k k ö ö n + p e r h e y k s i k k ö ö n s ä + p e r h e y k s i k ö n + p e r h e y k s i k ö s t ä + p e r h e y k s i k ö t + p e r h e y m p ä r i s t ö + p e r h e y m p ä r i s t ö n + p e r h e y m p ä r i s t ö s s ä + p e r h e y m p ä r i s t ö s t ä + p e r h e y m p ä r i s t ö ö n + p e r h e y r i t y k s e n + p e r h e y r i t y k s e s s ä + p e r h e y r i t y k s e s t ä + p e r h e y r i t y k s e t + p e r h e y r i t y k s i i n + p e r h e y r i t y k s i l l e + p e r h e y r i t y k s i n ä + p e r h e y r i t y k s i s s ä + p e r h e y r i t y k s i s t ä + p e r h e y r i t y k s i ä + p e r h e y r i t y s + p e r h e y r i t y s p o h j a i n e n + p e r h e y r i t y s p o h j a i s e s t a + p e r h e y r i t y s p o h j a i s i l l e + p e r h e y r i t y s t e n + p e r h e y r i t y s t ä + p e r h e y s t ä v ä l l i n e n + p e r h e y s t ä v ä l l i s e e n + p e r h e y s t ä v ä l l i s e m m ä n + p e r h e y s t ä v ä l l i s e m p i + p e r h e y s t ä v ä l l i s e m p ä ä + p e r h e y s t ä v ä l l i s e m p ä ä n + p e r h e y s t ä v ä l l i s e n + p e r h e y s t ä v ä l l i s e t + p e r h e y s t ä v ä l l i s i ä + p e r h e y s t ä v ä l l i s t e n + p e r h o s e n t o u k k i e n + p e r h o s j o u k k o + p e r h o s k a l a + p e r h o s k i r j o a h v e n + p e r h o s l a a s t a r i + p e r h o s l a j e i s t a + p e r h o s l a u s e + p e r h o s p u u t a r h a + p e r h o s r a u s k u t + p e r h o s t o k a + p e r h o s t o n n i k a l a + p e r h o s u i n t i + p e r h o s v a i k u t u s + p e r h o s v e i t s i + p e r i a a t e a s i o i s t a + p e r i a a t e f i l o s o f i a n n e + p e r i a a t e j u l i s t u k s e e n + p e r i a a t e j u l i s t u k s e l l a + p e r i a a t e j u l i s t u k s e n + p e r i a a t e j u l i s t u k s e s t a + p e r i a a t e j u l i s t u k s e t + p e r i a a t e j u l i s t u k s i a + p e r i a a t e j u l i s t u k s i i n + p e r i a a t e j u l i s t u k s i s s a + p e r i a a t e j u l i s t u k s i s t a + p e r i a a t e j u l i s t u s + p e r i a a t e j u l i s t u s t a + p e r i a a t e j u l i s t u s t e n + p e r i a a t e k a n t a + p e r i a a t e k a n t a m m e + p e r i a a t e k a n t a n s a + p e r i a a t e k a n t o j a + p e r i a a t e k e s k u s t e l u + p e r i a a t e k e s k u s t e l u a + p e r i a a t e k e s k u s t e l u k s i + p e r i a a t e k e s k u s t e l u n + p e r i a a t e k o h d a s t a + p e r i a a t e k o h t i a + p e r i a a t e k o h t i i n + p e r i a a t e k o k o e l m a a + p e r i a a t e k o k o n a i s u u d e l l a + p e r i a a t e k y s y m y k s e e n + p e r i a a t e k y s y m y k s e k s i + p e r i a a t e k y s y m y k s e n + p e r i a a t e k y s y m y k s e n ä + p e r i a a t e k y s y m y k s e s t ä + p e r i a a t e k y s y m y k s e t + p e r i a a t e k y s y m y k s i i n + p e r i a a t e k y s y m y k s i s s ä + p e r i a a t e k y s y m y k s i s t ä + p e r i a a t e k y s y m y k s i ä + p e r i a a t e k y s y m y s + p e r i a a t e k y s y m y s t e n + p e r i a a t e k y s y m y s t ä + p e r i a a t e l a u s u m a s t a + p e r i a a t e l a u s u m i i n + p e r i a a t e l u o n n o k s i s t a + p e r i a a t e l u v a s t a + p e r i a a t e l ä h t ö i n e n + p e r i a a t e n ä k e m y s + p e r i a a t e o n g e l m a n a + p e r i a a t e p ä ä t ö k s e e n + p e r i a a t e p ä ä t ö k s e l l ä + p e r i a a t e p ä ä t ö k s e n + p e r i a a t e p ä ä t ö k s e s t ä m m e + p e r i a a t e p ä ä t ö k s e t + p e r i a a t e p ä ä t ö k s i i n + p e r i a a t e p ä ä t ö k s i ä + p e r i a a t e p ä ä t ö s + p e r i a a t e p ä ä t ö s t ä + p e r i a a t e s a i v a r t e l u n + p e r i a a t e s a i v a r t e l u u n + p e r i a a t e s i t o u m u k s i a + p e r i a a t e s o p i m u k s e e n + p e r i a a t e s o p i m u k s e n + p e r i a a t e s o p i m u k s e s t a + p e r i a a t e s o p i m u s + p e r i a a t e s y i s t ä + p e r i a a t e s y y + p e r i a a t e t a s o l l a + p e r i a a t e t t a + p e r i a a t e t t a m m e + p e r i a a t e v ä i t t ä m i e n + p e r i a a t e ä ä n e s t y s + p e r i a a t t e e k s i + p e r i a a t t e e l l a + p e r i a a t t e e l l e + p e r i a a t t e e l l e k i n + p e r i a a t t e e l l i s e e n + p e r i a a t t e e l l i s e l t a + p e r i a a t t e e l l i s e m m a n + p e r i a a t t e e l l i s e m p a a + p e r i a a t t e e l l i s e m p i + p e r i a a t t e e l l i s e m p i k i n + p e r i a a t t e e l l i s e n + p e r i a a t t e e l l i s e s t a + p e r i a a t t e e l l i s e s t i + p e r i a a t t e e l l i s e t + p e r i a a t t e e l l i s i a + p e r i a a t t e e l l i s i l l a + p e r i a a t t e e l l i s i s t a + p e r i a a t t e e l l i s t a + p e r i a a t t e e l l i s t e n + p e r i a a t t e e l l i s u u d e s t a m m e + p e r i a a t t e e m m e + p e r i a a t t e e n + p e r i a a t t e e n a + p e r i a a t t e e n a a n + p e r i a a t t e e n a m m e + p e r i a a t t e e n i + p e r i a a t t e e s e e n + p e r i a a t t e e s t a + p e r i a a t t e e t + p e r i a a t t e i d e m m e + p e r i a a t t e i d e n + p e r i a a t t e i k s i + p e r i a a t t e i l l a + p e r i a a t t e i l l e + p e r i a a t t e i l l e e n + p e r i a a t t e i l t a a n + p e r i a a t t e i n a + p e r i a a t t e i n e e n + p e r i a a t t e i s i i n + p e r i a a t t e i s s a + p e r i a a t t e i s t a + p e r i a a t t e i s t a a n + p e r i a a t t e i s t a m m e + p e r i a a t t e i t a + p e r i a a t t e i t a m m e + p e r i h e l i k i e r t y m ä + p e r i k a t o o n + p e r i k s i a n t a j i a + p e r i l l i s e n ä + p e r i m i s e n + p e r i m i s m a h d o l l i s u u k s i a + p e r i m i s m e n e t t e l y s s ä + p e r i m i s t ä + p e r i m m ä i s e n ä + p e r i m m ä i s e s s ä + p e r i m m ä i s e s t ä + p e r i m m ä i s e t + p e r i m m ä i s i i n + p e r i m m ä i s i m m ä t + p e r i m m ä i s i m p i ä + p e r i m m ä i s i s t ä + p e r i m m ä i s i ä + p e r i m m ä i s t e n + p e r i m m ä i s t ä + p e r i m y s m a a + p e r i m y s o i k e u k s i a + p e r i m y s s o t a + p e r i m ä n + p e r i m ä s t ä + p e r i m ä t i e t o + p e r i m ä t t ä + p e r i m ä ä + p e r i m ä ä n + p e r i n a t a a l i k a u d e n + p e r i n a t a a l i k u o l e m a + p e r i n a t a a l i k u o l l e i s u u t t a + p e r i n e e t + p e r i n n e t i e t o + p e r i n n e t i e t o n s a + p e r i n n e t i e t o u d e n + p e r i n n e t u o t a n n o n + p e r i n n e t u o t e + p e r i n n ä n + p e r i n n ä s s ä + p e r i n n ö l l i s e s t ä + p e r i n n ö l l i s y y s l ä ä k e t i e d e + p e r i n n ö n + p e r i n n ö n k i n + p e r i n n ö s t ä + p e r i n p o h j a i s e e n + p e r i n p o h j a i s e m m a n + p e r i n p o h j a i s e m m i n + p e r i n p o h j a i s e m p a a + p e r i n p o h j a i s e m p i a + p e r i n p o h j a i s e n + p e r i n p o h j a i s e s t a + p e r i n p o h j a i s i a + p e r i n p o h j a i s i m p a n a + p e r i n p o h j a i s t a + p e r i n t e e l l e + p e r i n t e e n + p e r i n t e e s e e n + p e r i n t e e s t ä + p e r i n t e e t + p e r i n t e i d e m m e + p e r i n t e i d e n + p e r i n t e i d e n s ä + p e r i n t e i k k ä i m p i ä + p e r i n t e i l l e + p e r i n t e i l l ä + p e r i n t e i s e e n + p e r i n t e i s e k s i + p e r i n t e i s e l l ä + p e r i n t e i s e m m ä n + p e r i n t e i s e m m ä t + p e r i n t e i s e m p i + p e r i n t e i s e m p i e n + p e r i n t e i s e m p i i n + p e r i n t e i s e m p i ä + p e r i n t e i s e n + p e r i n t e i s e n ä + p e r i n t e i s e t + p e r i n t e i s i i n + p e r i n t e i s i m m ä n + p e r i n t e i s i m p i ä + p e r i n t e i s i n ä + p e r i n t e i s i s s ä + p e r i n t e i s i s t ä + p e r i n t e i s i ä + p e r i n t e i s s ä + p e r i n t e i s t e n + p e r i n t e i s t ä + p e r i n t e i s t ä ä n + p e r i n t e i t ä + p e r i n t e i t ä ä n + p e r i n t ä a s t e + p e r i n t ä j ä r j e s t e l m ä n + p e r i n t ä k e i n o j a + p e r i n t ä k u l u j e n + p e r i n t ä k u l u t + p e r i n t ä k u s t a n n u k s i s t a + p e r i n t ä m e n e t t e l y i s t ä + p e r i n t ä m e n e t t e l y j e m m e + p e r i n t ä m e n e t t e l y j e n + p e r i n t ä m e n e t t e l y j ä + p e r i n t ä m e n e t t e l y t + p e r i n t ä m ä ä r ä y s t e n + p e r i n t ä o n g e l m a n + p e r i n t ä p r o s e s s i a + p e r i n t ä p y y n t ö ä + p e r i n t ä t a p a h t u m a + p e r i n t ä t e k n o l o g i a n + p e r i n t ä t i l a n t e i t a + p e r i n t ä t o i m i s t a m m e + p e r i n t ä t o i m i s t o + p e r i n t ä t o i m i s t o i s t a + p e r i n t ä t o i m i s t o j a + p e r i n t ä t o i m i s t o j e n + p e r i n t ä t o i m i s t o l l e + p e r i n t ä t o i m i s t o t + p e r i n t ä t u k i + p e r i n t ä ä n + p e r i n t ö a i n e k s e e n + p e r i n t ö a i n e s + p e r i n t ö a i n e s t a + p e r i n t ö l a i n + p e r i n t ö l a i n s ä ä d ä n n ö s t ä + p e r i n t ö l a i n s ä ä d ä n t ö + p e r i n t ö l a i n s ä ä d ä n t ö ä + p e r i n t ö m m e + p e r i n t ö o i k e u d e n + p e r i n t ö o i k e u d e s s a + p e r i n t ö o i k e u t t a + p e r i n t ö t a p a u s t a + p e r i n t ö t e k i j ä + p e r i n t ö t e k i j ä t + p e r i n t ö t e k i j ö i d e n + p e r i n t ö t o d i s t u k s e n + p e r i n t ö t o d i s t u s + p e r i n t ö t o d i s t u s t a + p e r i n t ö v e r k o s t o t + p e r i n t ö v e r o + p e r i n t ö v e r o a + p e r i n t ö v e r o i s t a + p e r i n t ö v e r o j a + p e r i n t ö v e r o n + p e r i n t ö ä + p e r i s k o o p p i v i r t a h e p o + p e r i s y n t i i n + p e r i t t e + p e r i t t ä v i n ä + p e r i t t ä v ä n + p e r i t t ä v ä s t ä + p e r i t t ä v ä ä + p e r i t t ä v ä ä n + p e r i t y i n + p e r i t y t + p e r i t ä ä n + p e r i v ä t k ö + p e r i ä + p e r j a n t a i a a m u a + p e r j a n t a i a a m u i s i n + p e r j a n t a i a a m u i s t a + p e r j a n t a i a a m u j a + p e r j a n t a i a a m u k s i + p e r j a n t a i a a m u l l e + p e r j a n t a i a a m u n + p e r j a n t a i a a m u n a + p e r j a n t a i a a m u p ä i v i s t ä + p e r j a n t a i a a m u p ä i v ä t + p e r j a n t a i a a m u t + p e r j a n t a i a a m u u n + p e r j a n t a i h i n + p e r j a n t a i k e r h o + p e r j a n t a i k e r h o a + p e r j a n t a i k e r h o k s i + p e r j a n t a i k e r h o m m e + p e r j a n t a i k e r h o n + p e r j a n t a i k e r h o o n + p e r j a n t a i k i n + p e r j a n t a i k l u b i n + p e r j a n t a i k y s y m y k s e s t ä + p e r j a n t a i l t a + p e r j a n t a i n + p e r j a n t a i n a + p e r j a n t a i o n g e l m a s t a + p e r j a n t a i p ä i v ä n + p e r j a n t a i s t a + p e r j a n t a i t a + p e r j a n t a i t y ö p ä i v ä n + p e r j a n t a i t y ö s k e n t e l y n + p e r j a n t a i t y ö s k e n t e l y ä + p e r m i k a u d e n + p e r m u t a a t i o m a t r i i s i + p e r m u t a a t i o r y h m ä + p e r n a r u t o n + p e r n a r u t t o i s k u j e n + p e r n a r u t t o i s k u t + p e r n a r u t t o k i r j e e t + p e r o k s i d i r i k k i h a p p o + p e r o k s i r i k k i h a p p o + p e r s i a l a i s e n e m m i s t ö + p e r s i a l a i s e t + p e r s i a l a i s p o l i i t i k k o + p e r s i a l a i s s o d a t + p e r s i a n a a v i k k o n ä r h i + p e r s i a n a p i l a + p e r s i a n l a h d e l l a + p e r s i a n l a h d e l t a + p e r s i a n l a h d e n + p e r s i a n l a h t i + p e r s i a n p ö l l ö n e n + p e r s i a n s i n i l i l j a + p e r s i a n t a s k u + p e r s i a n t i m a l i + p e r s i a n t ä d y k e + p e r s i k k a h a p e r o + p e r s i k k a h i l l o + p e r s i k k a k i r v a + p e r s i k k a k o r u a h v e n + p e r s o n a a l i u n i o n i + p e r s o o n a a n i + p e r s o o n a a n s a + p e r s o o n a l l e + p e r s o o n a l l i s e n + p e r s o o n a l l i s u u d e n + p e r s o o n a l l i s u u s e n n e a g r a m m i + p e r s o o n a l l i s u u s h ä i r i ö + p e r s o o n a l l i s u u s h ä i r i ö t + p e r s o o n a l l i s u u s p e r i a a t t e e n + p e r s o o n a l l i s u u s p s y k o l o g i a + p e r s o o n a l l i s u u s t e o r i a + p e r s o o n a l l i s u u t t a + p e r s o o n a l l i s u u t t a a n + p e r s o o n a p r o n o m i n i + p e r s o o n a s t a n n e + p e r s p e k t i i v e i s t ä + p e r s p e k t i i v i n m u u t o s + p e r s p e k t i i v i s t ä + p e r s p e k t i i v i v i r h e e n + p e r u a + p e r u i s i m m e + p e r u i s i v a t + p e r u i v a t + p e r u l a i s i s t a + p e r u m a a n + p e r u m i s k a a v a k e + p e r u m i s o i k e u d e n + p e r u m i s o i k e u k s i e n + p e r u n a a + p e r u n a j a u h o + p e r u n a j a u h o l l e + p e r u n a j ä t t i + p e r u n a k y s y m y s t ä + p e r u n a l a s t u j a + p e r u n a l a s t u t + p e r u n a m a r k k i n o i t a + p e r u n a m u u s i a + p e r u n a n n o s t o k o n e + p e r u n a n s y ö j ä t + p e r u n a n t u o t t a j a + p e r u n a n t u o t t a j a m a a + p e r u n a n t u o t t a j i s t a + p e r u n a n v i l j e l y + p e r u n a n v i l j e l y a l a a + p e r u n a r u t o n + p e r u n a r u t t o + p e r u n a s a l a a t t i + p e r u n a s a t o j e n + p e r u n a s o s e + p e r u n a s t a + p e r u n a s ä k k e j ä + p e r u n a t y k k i + p e r u n a t ä r k k e l y k s e e n + p e r u n a t ä r k k e l y k s e n + p e r u n a t ä r k k e l y k s e s t ä + p e r u n a t ä r k k e l y s + p e r u n a t ä r k k e l y s a l a + p e r u n a t ä r k k e l y s a l a n + p e r u n a t ä r k k e l y s a l a s t a + p e r u n a t ä r k k e l y s k i i n t i ö + p e r u n a t ä r k k e l y s k i i n t i ö i d e n + p e r u n a t ä r k k e l y s k i i n t i ö i h i n + p e r u n a t ä r k k e l y s k i i n t i ö i s t ä + p e r u n a t ä r k k e l y s k i i n t i ö i t ä + p e r u n a t ä r k k e l y s k i i n t i ö n + p e r u n a t ä r k k e l y s m a r k k i n o i d e n + p e r u n a t ä r k k e l y s m a r k k i n o i l l a + p e r u n a t ä r k k e l y s t e o l l i s u u s + p e r u n a t ä r k k e l y s t u o t a n n o n + p e r u n a t ä r k k e l y s t u o t a n t o + p e r u n a t ä r k k e l y s t ä + p e r u n e r a k k o k o l i b r i + p e r u n k u l t a p ö l l ö + p e r u n k y y h k y + p e r u n m y r s k y s u k e l t a j a + p e r u n o i t a + p e r u n p a k s u j a l k a + p e r u n p a l l o k a l a + p e r u n p i n g v i i n i + p e r u n p ö l l ö n e n + p e r u n r o s e e p i p p u r i + p e r u n s a k u + p e r u n s a r d e l l i + p e r u n s i l p o j a + p e r u n s u u l a + p e r u n t a p a k u l o + p e r u n t i k k a n e n + p e r u n t i n a m i + p e r u n v a r p u s p ö l l ö + p e r u s a h n e u s + p e r u s a i h e e n a + p e r u s a i h e t t a + p e r u s a i n e i s t o s t a + p e r u s a i n e k s i a + p e r u s a i n e t e o l l i s u u d e l l e + p e r u s a j a t t e l u a + p e r u s a j a t t e l u t a p a a + p e r u s a j a t u k s e e n + p e r u s a j a t u k s e l l e + p e r u s a j a t u k s e m m e + p e r u s a j a t u k s e n + p e r u s a j a t u k s e n a + p e r u s a j a t u k s e n a m m e + p e r u s a j a t u k s e s t a + p e r u s a j a t u k s e t + p e r u s a j a t u k s i a + p e r u s a j a t u k s i i n + p e r u s a j a t u k s i l l e + p e r u s a j a t u k s i n e e n + p e r u s a j a t u k s i s t a + p e r u s a j a t u s + p e r u s a j a t u s h a n + p e r u s a j a t u s t a + p e r u s a j a t u s t e n + p e r u s a j o n e u v o n + p e r u s a l a + p e r u s a l a a + p e r u s a l a l l a + p e r u s a l o i l l a + p e r u s a l o i l l e + p e r u s a l o j a + p e r u s a l u e e t + p e r u s a l u e t t a + p e r u s a m m a t t i k o u l u t u s + p e r u s a n a l y y s i i n + p e r u s a n a l y y s i n i + p e r u s a n t i b i o o t i t + p e r u s a p u + p e r u s a p u a + p e r u s a r g u m e n t t i + p e r u s a r v o + p e r u s a r v o a + p e r u s a r v o i h i m m e + p e r u s a r v o i h i n + p e r u s a r v o i h i n s a + p e r u s a r v o i k s i + p e r u s a r v o i l l e + p e r u s a r v o i l l e e n + p e r u s a r v o i l l e m m e + p e r u s a r v o i n a + p e r u s a r v o i s t a + p e r u s a r v o i s t a a n + p e r u s a r v o i s t a m m e + p e r u s a r v o j a + p e r u s a r v o j a m m e + p e r u s a r v o j e m m e + p e r u s a r v o j e n + p e r u s a r v o j e n s a + p e r u s a r v o k k u u t e e n + p e r u s a r v o k s i + p e r u s a r v o l l e + p e r u s a r v o m m e + p e r u s a r v o n + p e r u s a r v o n a + p e r u s a r v o n s a + p e r u s a r v o o n + p e r u s a r v o s t a + p e r u s a r v o s t u s + p e r u s a r v o t + p e r u s a s e m a + p e r u s a s e n n e + p e r u s a s e n n e t t a + p e r u s a s e n t e e m m e + p e r u s a s e n t e e n a + p e r u s a s e n t e e n i + p e r u s a s e n t e e s e e n + p e r u s a s e n t e e s s a + p e r u s a s e n t e i d e n + p e r u s a s e n t e i t a + p e r u s a s e t e l m a a + p e r u s a s e t u k s e e n + p e r u s a s e t u k s e k s i + p e r u s a s e t u k s e l l a + p e r u s a s e t u k s e n + p e r u s a s e t u k s e s s a + p e r u s a s e t u k s e s t a + p e r u s a s e t u k s i e n + p e r u s a s e t u k s i s s a + p e r u s a s e t u s + p e r u s a s e t u s t a + p e r u s a s e t u s t e n + p e r u s a s i a + p e r u s a s i a a + p e r u s a s i a a n + p e r u s a s i a k i r j a + p e r u s a s i a k i r j a a + p e r u s a s i a k i r j a k s i + p e r u s a s i a k i r j a n + p e r u s a s i a k i r j a s s a + p e r u s a s i a k i r j a t + p e r u s a s i a k i r j o i h i n + p e r u s a s i a k i r j o i s s a + p e r u s a s i a k i r j o i s s a a n + p e r u s a s i a k i r j o j a + p e r u s a s i a k s i + p e r u s a s i a l i s t a + p e r u s a s i a n + p e r u s a s i a s t a + p e r u s a s i a t + p e r u s a s i o i d e n + p e r u s a s i o i h i n + p e r u s a s i o i n a + p e r u s a s i o i s s a + p e r u s a s i o i s t a + p e r u s a s i o i t a + p e r u s a s t e e l l a + p e r u s a s t e e n + p e r u s a s t e i t a + p e r u s b u d j e t t i + p e r u s b u d j e t t i a + p e r u s d e m o k r a t i a n + p e r u s d e m o k r a t i a s t a + p e r u s d i r e k t i i v i + p e r u s d i r e k t i i v i i n + p e r u s d i r e k t i i v i n + p e r u s d i r e k t i i v i s s ä + p e r u s d i r e k t i i v i ä + p e r u s e d e l l y t y k s e k s i + p e r u s e d e l l y t y k s e n ä + p e r u s e d e l l y t y k s e s t ä + p e r u s e d e l l y t y k s e t + p e r u s e d e l l y t y k s i i n + p e r u s e d e l l y t y k s i l l ä + p e r u s e d e l l y t y k s i s t ä + p e r u s e d e l l y t y k s i ä + p e r u s e d e l l y t y k s i ä m m e + p e r u s e d e l l y t y s + p e r u s e d e l l y t y s t e n + p e r u s e d e l l y t y s t ä + p e r u s e d u n + p e r u s e d u t + p e r u s e h d o i s t a + p e r u s e h d o l l a + p e r u s e h d o t + p e r u s e h d o t u k s e e n + p e r u s e h d o t u k s e n s a + p e r u s e h d o t u k s e s s a m m e + p e r u s e h d o t u k s e s t a + p e r u s e h d o t u k s i a + p e r u s e h d o t u k s i s t a + p e r u s e h d o t u s t a + p e r u s e h t o + p e r u s e h t o a + p e r u s e h t o i n a + p e r u s e h t o j a + p e r u s e h t o j e n + p e r u s e h t o n a + p e r u s e l e m e n t e i s t ä + p e r u s e l e m e n t i k s i + p e r u s e l e m e n t i s t ä + p e r u s e l e m e n t i t + p e r u s e l e m e n t t e i h i n + p e r u s e l e m e n t t e i n ä + p e r u s e l e m e n t t i + p e r u s e l e m e n t t i e n + p e r u s e l e m e n t t i n ä + p e r u s e l e m e n t t i ä + p e r u s e l e t t ä + p e r u s e l i n o l o j e n + p e r u s e l i n o l o t + p e r u s e l i n p a l v e l u j a + p e r u s e l i n t a r p e e t + p e r u s e l i n t a r v i k e + p e r u s e l i n t a r v i k e t a r p e i t a a n + p e r u s e l i n t a r v i k e t o n n i n + p e r u s e l i n t a r v i k e t u o t a n n o n + p e r u s e l i n t a r v i k e t u o t t e i d e n + p e r u s e l i n t a r v i k k e e k s i + p e r u s e l i n t a r v i k k e e m m e + p e r u s e l i n t a r v i k k e e t + p e r u s e l i n t a r v i k k e i d e n + p e r u s e l i n t a r v i k k e i s i i m m e + p e r u s e l i n t a r v i k k e i s i i n + p e r u s e l i n t a r v i k k e i s t a + p e r u s e l i n t a r v i k k e i s t a m m e + p e r u s e l i n t a r v i k k e i t a + p e r u s e l i n t a s o + p e r u s e l i n t a s o n + p e r u s e l ä k e + p e r u s e l ä k e j ä r j e s t e l m ä ä + p e r u s e l ä k e j ä r j e s t e l m ä ä n + p e r u s e l ä k e t t ä + p e r u s e l ä k e t u r v a a + p e r u s e l ä k k e e s t ä + p e r u s e n e r g i a n t a r v e + p e r u s e n e r g i a p a l v e l u j a + p e r u s e n e r g i a p a l v e l u j e n + p e r u s e n e r g i a t a r p e i d e n + p e r u s e n n a k k o e h t o + p e r u s e p ä s e l v y y t e e n + p e r u s e p ä t a s a p a i n o n + p e r u s e r o + p e r u s e r o a v a i s u u k s i s t a + p e r u s e r o j a + p e r u s e r o t u s t a + p e r u s e s i m e r k k i + p e r u s e s i t e t t ä + p e r u s e s i t t e e s s ä + p e r u s e s t e i t ä + p e r u s e t u j a + p e r u s e t u j a a n + p e r u s e t u j e m m e + p e r u s e t u j e n + p e r u s f a k t a + p e r u s f i l o s o f i a + p e r u s f i l o s o f i a a + p e r u s f i l o s o f i a m m e + p e r u s f i l o s o f i a n + p e r u s f i l o s o f i a n a + p e r u s f i l o s o f i a s t a + p e r u s f i l o s o f i o i t a + p e r u s f y s i i k a n + p e r u s h a a s t e e m m e + p e r u s h a a s t e e n a + p e r u s h a a s t e e t + p e r u s h a a s t e i s i i n + p e r u s h a a s t e t t a + p e r u s h a h m o + p e r u s h a n k e + p e r u s h a r k i n n a n + p e r u s h a r m o n i a + p e r u s h a v a i n n o t + p e r u s h e n g e n + p e r u s h i n n a n + p e r u s h i n n a s s a + p e r u s h i n n a t + p e r u s h i n t a a + p e r u s h o i d o n + p e r u s h o i t o + p e r u s h o i t o a + p e r u s h o i t o o n + p e r u s h u o l i l l a a n + p e r u s h u o l l o s t a + p e r u s h u o m a a v a i s u u d e n + p e r u s h u o m a u t u k s e n + p e r u s h u o m a u t u k s e n i + p e r u s h u o m a u t u k s i a + p e r u s h u o m a u t u s t a + p e r u s h u o m i o i d e n + p e r u s h u o m i o i s t a + p e r u s h u o m i o i t a + p e r u s h u o m i o n + p e r u s h u o m i o t + p e r u s h u o m i o t a + p e r u s h y g i e n i a a n + p e r u s h y g i e n i a n + p e r u s h y g i e n i a t u o t t e i s t a + p e r u s h y v i n v o i n t i + p e r u s h y v i n v o i n t i n s a + p e r u s h y v ä k s y n n ä n + p e r u s h y ö d y k e + p e r u s h y ö d y k e m a r k k i n o i d e n + p e r u s h y ö d y k e m a r k k i n o i l l a + p e r u s h y ö d y k k e e s t ä + p e r u s h y ö d y k k e e t + p e r u s h y ö d y k k e i d e n + p e r u s h y ö d y k k e i s i i n + p e r u s h y ö d y k k e i s t ä + p e r u s h y ö d y k k e i t ä + p e r u s i d e a + p e r u s i d e a a + p e r u s i d e a n + p e r u s i h a n t e i s t a + p e r u s i h m i s a r v o + p e r u s i h m i s a r v o a + p e r u s i h m i s a r v o j a + p e r u s i h m i s a r v o j e n + p e r u s i h m i s a r v o n s a + p e r u s i h m i s a r v o s t a + p e r u s i h m i s o i k e u d e k s i + p e r u s i h m i s o i k e u d e n + p e r u s i h m i s o i k e u d e t + p e r u s i h m i s o i k e u k s i a + p e r u s i h m i s o i k e u k s i a a n + p e r u s i h m i s o i k e u k s i e n + p e r u s i h m i s o i k e u k s i e n s a + p e r u s i h m i s o i k e u k s i i n + p e r u s i h m i s o i k e u k s i k s i + p e r u s i h m i s o i k e u k s i l l a + p e r u s i h m i s o i k e u k s i s s a + p e r u s i h m i s o i k e u k s i s t a + p e r u s i h m i s o i k e u s + p e r u s i h m i s o i k e u s a s i a a n + p e r u s i h m i s o i k e u s o i k e u s + p e r u s i h m i s o i k e u t e e n + p e r u s i h m i s o i k e u t e n a + p e r u s i h m i s o i k e u t e n s a + p e r u s i h m i s o i k e u t t a + p e r u s i n d i k a a t t o r i n a + p e r u s i n d i k a a t t o r i t + p e r u s i n f r a s t r u k t u u r e i h i n + p e r u s i n f r a s t r u k t u u r e i s t a + p e r u s i n f r a s t r u k t u u r i + p e r u s i n f r a s t r u k t u u r i a + p e r u s i n f r a s t r u k t u u r i e n + p e r u s i n f r a s t r u k t u u r i i n + p e r u s i n f r a s t r u k t u u r i l l e + p e r u s i n f r a s t r u k t u u r i m m e + p e r u s i n f r a s t r u k t u u r i n + p e r u s i n f r a s t r u k t u u r i t + p e r u s i n s t i t u u t i o i t a + p e r u s i n s t i t u u t i o n a + p e r u s i n t e r v e n t i o h i n t a + p e r u s i n t r e s s e j ä + p e r u s i n t r e s s i e n + p e r u s i n t r e s s i t + p e r u s i n v e s t o i n t e j a + p e r u s i n v e s t o i n t i + p e r u s j a k o a + p e r u s j y v ä n + p e r u s j ä r j e s t e l m ä + p e r u s j ä r j e s t e l m ä n + p e r u s j ä r j e s t e l m ä n ä + p e r u s j ä ä m ä n + p e r u s k a m a a + p e r u s k a n a v a t + p e r u s k a n n a n + p e r u s k a n n a s t a + p e r u s k a n s a l a i s e t + p e r u s k a n s a l a i s o i k e u k s i a + p e r u s k a n s a l a i s o i k e u k s i e n + p e r u s k a n s a l a i s v a p a u k s i a + p e r u s k a n s a l a i s v a p a u k s i a a n + p e r u s k a n t a m m e + p e r u s k a s v a t u s + p e r u s k a s v u a + p e r u s k a u p p a k u m p p a n i n a + p e r u s k e h y k s e e n + p e r u s k e h y k s e n ä + p e r u s k e h y s + p e r u s k e i n o + p e r u s k e l p o i s u u d e t + p e r u s k e s k u s t e l u + p e r u s k e s k u s t e l u s t a + p e r u s k i e l e n + p e r u s k i e l i l l ä + p e r u s k i e l t e n + p e r u s k i i n t i ö i d e n + p e r u s k i i n t i ö n + p e r u s k i i n t i ö n ä + p e r u s k i r j a + p e r u s k i r j a a + p e r u s k i r j a a n + p e r u s k i r j a h a n k k e e n + p e r u s k i r j a k o n f e r e n s s e i s s a + p e r u s k i r j a k o n f e r e n s s i t + p e r u s k i r j a k s i + p e r u s k i r j a l u o n n o k s e n + p e r u s k i r j a n + p e r u s k i r j a n p i t o a + p e r u s k i r j a s s a + p e r u s k i r j a s t a + p e r u s k i r j a t + p e r u s k i v e n + p e r u s k i v e n ä + p e r u s k i v e s t ä + p e r u s k i v e ä + p e r u s k i v i + p e r u s k i v i s t ä + p e r u s k i v i ä + p e r u s k o h d a t + p e r u s k o h t i a + p e r u s k o k e m u s t a + p e r u s k o m p o n e n t t e j a + p e r u s k o m p r o m i s s i a + p e r u s k o n e i t a + p e r u s k o r j a u k s i a + p e r u s k o r j a u s o h j e l m i s t a + p e r u s k o r j a u s t y ö t + p e r u s k o r k o + p e r u s k o r k o a + p e r u s k o r o n + p e r u s k o r v a u s t a s o + p e r u s k o u l u + p e r u s k o u l u a + p e r u s k o u l u i h i n + p e r u s k o u l u i s s a + p e r u s k o u l u j e m m e + p e r u s k o u l u j e n + p e r u s k o u l u j ä r j e s t e l m ä + p e r u s k o u l u n + p e r u s k o u l u n o p e t t a j a + p e r u s k o u l u n o p e t t a j a n + p e r u s k o u l u o p e t u k s e e n + p e r u s k o u l u o p e t u k s e n + p e r u s k o u l u o p p i l a a n + p e r u s k o u l u s s a + p e r u s k o u l u s t a + p e r u s k o u l u t u k s e e n + p e r u s k o u l u t u k s e e n s a + p e r u s k o u l u t u k s e l l a + p e r u s k o u l u t u k s e l t a a n + p e r u s k o u l u t u k s e n + p e r u s k o u l u t u k s e n a + p e r u s k o u l u t u k s e n s a + p e r u s k o u l u t u k s e s s a + p e r u s k o u l u t u k s e s t a + p e r u s k o u l u t u s + p e r u s k o u l u t u s k a u s i + p e r u s k o u l u t u s l a i t o s t e n + p e r u s k o u l u t u s m a h d o l l i s u u k s i a + p e r u s k o u l u t u s o h j e l m i a + p e r u s k o u l u t u s t a + p e r u s k o u l u u n + p e r u s k r i t e e r e i h i n + p e r u s k r i t e e r e i s t ä + p e r u s k r i t e e r e j ä + p e r u s k r i t e e r i + p e r u s k r i t e e r i e n + p e r u s k r i t e e r i t + p e r u s k r i t e e r i ä + p e r u s k r i t i i k e i s t ä + p e r u s k r i t i i k i n + p e r u s k r i t i i k k i m m e + p e r u s k u l j e t u s j ä r j e s t e l m ä ä + p e r u s k u l t t u u r i n + p e r u s k u l u t u k s e e n + p e r u s k u l u t u s h y ö d y k k e i d e n + p e r u s k u n n i o i t u s + p e r u s k u n n i o i t u s t a + p e r u s k u o r m i t u s t a + p e r u s k u r s s i s t a + p e r u s k u v a u k s e n a + p e r u s k y s y m y k s e e n + p e r u s k y s y m y k s e n + p e r u s k y s y m y k s e n i + p e r u s k y s y m y k s e n ä + p e r u s k y s y m y k s e s s ä + p e r u s k y s y m y k s e s t ä + p e r u s k y s y m y k s e t + p e r u s k y s y m y k s i i n + p e r u s k y s y m y k s i s s ä + p e r u s k y s y m y k s i s t ä + p e r u s k y s y m y k s i s t ä m m e + p e r u s k y s y m y k s i ä + p e r u s k y s y m y s + p e r u s k y s y m y s t e n + p e r u s k y s y m y s t ä + p e r u s k ä s i t e + p e r u s k ä s i t e t t ä + p e r u s k ä s i t t e e n + p e r u s k ä s i t t e e s e e n + p e r u s k ä s i t t e e t + p e r u s k ä s i t t e i d e n + p e r u s k ä s i t t e i l l e + p e r u s k ä s i t t e i s i i n + p e r u s k ä s i t t e i t ä + p e r u s k ä s i t y k s e n i + p e r u s k ä s i t y k s e s t ä m m e + p e r u s k ä s i t y s + p e r u s k ä s i t y s t ä m m e + p e r u s k ä y t ä n t ö + p e r u s k ä y t ä n t ö n ä + p e r u s k ö y h y y d e n + p e r u s l a a j a k a i s t a a + p e r u s l a a t u v a a t i m u k s e t + p e r u s l a i n + p e r u s l a i n s ä ä d ä n n ö n + p e r u s l a i n s ä ä d ä n n ö s s ä + p e r u s l a i n s ä ä d ä n t ö + p e r u s l a i n s ä ä d ä n t ö k e h y k s e n + p e r u s l a i n s ä ä d ä n t ö k e h y s + p e r u s l a i n s ä ä d ä n t ö n ä + p e r u s l a i n s ä ä d ä n t ö v ä l i n e e n + p e r u s l a i n s ä ä d ä n t ö ä + p e r u s l a i s s a m m e + p e r u s l a i t + p e r u s l a i t t e i s t o i h i n + p e r u s l a i t t e i s t o i l l e + p e r u s l a k i + p e r u s l a k i s o p i m u k s e e n + p e r u s l a s k u t a p o j a + p e r u s l a t t e u t t a + p e r u s l a u s e + p e r u s l a u t t a p a l v e l u t + p e r u s l e i r i i n + p e r u s l i i k u n n a n + p e r u s l i n j a + p e r u s l i n j a a + p e r u s l i n j a n + p e r u s l i n j a s t a n n e + p e r u s l i n j a t + p e r u s l i n j a u k s i a + p e r u s l i n j a u k s i i n + p e r u s l i n j a u k s i s t a + p e r u s l i n j o i s t a + p e r u s l i n j o j a + p e r u s l i n j o j e n + p e r u s l i s ä a i n e e n a + p e r u s l u o n n e + p e r u s l u o n n e t t a + p e r u s l u o n n o n v a r o j e n + p e r u s l u o n t e e l t a a n + p e r u s l u o n t e e n + p e r u s l u o n t e e s t a + p e r u s l u o n t e i n e n + p e r u s l u o n t e i s e e n + p e r u s l u o n t e i s e m p a n a + p e r u s l u o n t e i s e m p i + p e r u s l u o n t e i s e s s a + p e r u s l u o n t e i s e t + p e r u s l u o n t e i s i a + p e r u s l u o n t e i s i m m a t + p e r u s l u o n t e i s i m m i s t a k a a n + p e r u s l u o n t e i s i m p i e n + p e r u s l u o n t e i s i s t a + p e r u s l u o n t e i s t a + p e r u s l u o n t e i s t e n + p e r u s l u o t t a m u k s e e n + p e r u s l u o t t a m u k s e s t a + p e r u s l u o t t a m u s + p e r u s l u o t t a m u s t a + p e r u s l ä h e s t y m i s t a p a + p e r u s l ä h e s t y m i s t a p a a + p e r u s l ä h e s t y m i s t a p a a m m e + p e r u s l ä h t ö k o h d a k s i + p e r u s l ä h t ö k o h d a n + p e r u s l ä h t ö k o h d a s t a + p e r u s l ä h t ö k o h d a t + p e r u s l ä h t ö k o h d i l t a a n + p e r u s l ä h t ö k o h d i s t a + p e r u s l ä h t ö k o h t a + p e r u s l ä h t ö k o h t a a + p e r u s l ä h t ö k o h t a a n + p e r u s l ä h t ö k o h t a n a + p e r u s l ä h t ö k o h t i a + p e r u s l ä h t ö k o h t i e m m e + p e r u s l ä ä k i t y s t ä + p e r u s l ä ä k k e i d e n + p e r u s m a a t a l o u d e s s a + p e r u s m a a t a l o u s t u o t t e e s e e n + p e r u s m a a t a l o u s t u o t t e e t + p e r u s m a i t a + p e r u s m a k s u u n + p e r u s m a l l i + p e r u s m a l l i a + p e r u s m a l l i i n + p e r u s m a l l i n + p e r u s m a l l i n a + p e r u s m a t e r i a a l e j a + p e r u s m e k a n i s m i a + p e r u s m e k a n i s m i k s i + p e r u s m e k a n i s m i n + p e r u s m e k a n i s m i t + p e r u s m e n e t e l m i s t ä + p e r u s m e n e t e l m i ä + p e r u s m e n e t e l m ä n + p e r u s m e n e t t e l y + p e r u s m e n e t t e l y j ä + p e r u s m e n e t t e l y n + p e r u s m e n e t t e l y t a p a s ä ä n t ö j ä + p e r u s m e n e t t e l y ä + p e r u s m e n o i s t a + p e r u s m e n o j e n + p e r u s m e r k i t y k s e s s ä ä n + p e r u s m e t s ä t e o l l i s u u s + p e r u s m i e t i n n ö n + p e r u s m i e t i n n ö s s ä + p e r u s m u o t o + p e r u s m u o t o j e n + p e r u s m u u t o k s i a + p e r u s m u u t o s p r o s e s s i t + p e r u s m u u t t u j a + p e r u s m ä ä r i t e l m i s t ä + p e r u s m ä ä r i t e l m i ä + p e r u s m ä ä r i t e l m ä + p e r u s m ä ä r i t e l m ä n + p e r u s m ä ä r i t e l m ä t + p e r u s m ä ä r i t e l m ä ä + p e r u s m ä ä r i t t e l y + p e r u s m ä ä r ä y k s e n + p e r u s m ä ä r ä y k s e t + p e r u s m ä ä r ä y k s i ä + p e r u s n o r m e j a + p e r u s n o r m i a + p e r u s n o r m i e n + p e r u s n o r m i t + p e r u s n ä k e m y k s e e n + p e r u s n ä k e m y k s e m m e + p e r u s n ä k e m y k s e n + p e r u s n ä k e m y k s e n i + p e r u s n ä k e m y k s e n n e + p e r u s n ä k e m y k s e s t ä + p e r u s n ä k e m y k s i l l e + p e r u s n ä k e m y k s i ä + p e r u s n ä k e m y k s i ä m m e + p e r u s n ä k e m y s + p e r u s n ä k e m y s t ä + p e r u s n ä k e m y s t ä m m e + p e r u s n ä k ö k a n n a l t a + p e r u s n ä k ö k o h d a n + p e r u s n ä k ö k o h d a s t a + p e r u s n ä k ö k o h d a t + p e r u s n ä k ö k o h d i s s a + p e r u s n ä k ö k o h d i s t a + p e r u s n ä k ö k o h t a + p e r u s n ä k ö k o h t a a + p e r u s n ä k ö k o h t a a n + p e r u s n ä k ö k o h t i a + p e r u s n ä k ö k o h t i i n + p e r u s n ä k ö k u l m a + p e r u s o d o t u k s e m m e + p e r u s o d o t u k s e n a + p e r u s o h j e i t a + p e r u s o h j e l m i i n + p e r u s o h j e l m i l l e + p e r u s o h j e n u o r a n + p e r u s o i k e u d e k s i + p e r u s o i k e u d e l l a + p e r u s o i k e u d e l l e + p e r u s o i k e u d e n + p e r u s o i k e u d e s s a + p e r u s o i k e u d e s t a + p e r u s o i k e u d e s t a a n + p e r u s o i k e u d e s t a m m e + p e r u s o i k e u d e t + p e r u s o i k e u k s i a + p e r u s o i k e u k s i a a n + p e r u s o i k e u k s i a m m e + p e r u s o i k e u k s i e m m e + p e r u s o i k e u k s i e n + p e r u s o i k e u k s i e n s a + p e r u s o i k e u k s i i n + p e r u s o i k e u k s i i n s a + p e r u s o i k e u k s i k s i + p e r u s o i k e u k s i l l a + p e r u s o i k e u k s i l l a a n + p e r u s o i k e u k s i l l e + p e r u s o i k e u k s i n a + p e r u s o i k e u k s i s s a + p e r u s o i k e u k s i s t a + p e r u s o i k e u k s i s t a a n + p e r u s o i k e u k s i s t a m m e + p e r u s o i k e u s + p e r u s o i k e u s a s i a k i r j a + p e r u s o i k e u s a s i a k i r j a a n + p e r u s o i k e u s a s i a k i r j a n + p e r u s o i k e u s a s i a k i r j a s t a + p e r u s o i k e u s a s i a n t u n t i j o i d e n + p e r u s o i k e u s a s i o i h i n + p e r u s o i k e u s i e n + p e r u s o i k e u s j u l i s t u k s e n + p e r u s o i k e u s j ä r j e s t e l m i ä + p e r u s o i k e u s j ä r j e s t e l m ä s s ä + p e r u s o i k e u s j ä r j e s t e l m ä t + p e r u s o i k e u s k i r j a + p e r u s o i k e u s k i r j a a + p e r u s o i k e u s k i r j a a n + p e r u s o i k e u s k i r j a a n s a + p e r u s o i k e u s k i r j a k s i + p e r u s o i k e u s k i r j a l l a + p e r u s o i k e u s k i r j a l l e + p e r u s o i k e u s k i r j a l u o n n o k s e e n + p e r u s o i k e u s k i r j a l u o n n o k s e n + p e r u s o i k e u s k i r j a n + p e r u s o i k e u s k i r j a s s a + p e r u s o i k e u s k i r j a s s a m m e + p e r u s o i k e u s k i r j a s t a + p e r u s o i k e u s k i r j a t y ö t ä + p e r u s o i k e u s k i r j o j a + p e r u s o i k e u s k o k o e l m i i n + p e r u s o i k e u s k o m i s s a a r i n + p e r u s o i k e u s k u l t t u u r i + p e r u s o i k e u s k u l t t u u r i a + p e r u s o i k e u s k u l t t u u r i l l e + p e r u s o i k e u s k u l t t u u r i n + p e r u s o i k e u s k y s y m y k s e s s ä + p e r u s o i k e u s k y s y m y k s e s t ä + p e r u s o i k e u s k y s y m y k s i l l e + p e r u s o i k e u s k y s y m y k s i s s ä + p e r u s o i k e u s k ä s i t e t t ä + p e r u s o i k e u s l a u s e k k e e n + p e r u s o i k e u s l o u k k a u k s i a + p e r u s o i k e u s l o u k k a u k s i e n + p e r u s o i k e u s l o u k k a u k s i i n + p e r u s o i k e u s l u e t t e l o o n + p e r u s o i k e u s n ä k ö k o h d a t + p e r u s o i k e u s n ä k ö k o h t a a + p e r u s o i k e u s n ä k ö k o h t i e n + p e r u s o i k e u s n ä k ö k u l m a + p e r u s o i k e u s o i k e u s v i r a s t o s s a + p e r u s o i k e u s p o l i t i i k a n + p e r u s o i k e u s p o l i t i i k k a a + p e r u s o i k e u s r a k e n t e e k s i + p e r u s o i k e u s r a k e n t e e n + p e r u s o i k e u s r i k k o m u k s i s t a + p e r u s o i k e u s r i k k o m u s + p e r u s o i k e u s s o p i m u k s e n + p e r u s o i k e u s s o p i m u s + p e r u s o i k e u s t i l a n n e t t a + p e r u s o i k e u s t i l a n n e t t a m m e + p e r u s o i k e u s t i l a n t e e n + p e r u s o i k e u s t i l a n t e e s t a + p e r u s o i k e u s t u r v a a + p e r u s o i k e u s t u r v a s s a + p e r u s o i k e u s v i r a s t o + p e r u s o i k e u s v i r a s t o a + p e r u s o i k e u s v i r a s t o j e n + p e r u s o i k e u s v i r a s t o k a a n + p e r u s o i k e u s v i r a s t o k s i + p e r u s o i k e u s v i r a s t o l l a + p e r u s o i k e u s v i r a s t o l l e + p e r u s o i k e u s v i r a s t o l t a + p e r u s o i k e u s v i r a s t o m m e + p e r u s o i k e u s v i r a s t o n + p e r u s o i k e u s v i r a s t o o n + p e r u s o i k e u s v i r a s t o s s a + p e r u s o i k e u s v i r a s t o s t a + p e r u s o i k e u s v i r a s t o t + p e r u s o i k e u s y h t e i s ö + p e r u s o i k e u t e e n + p e r u s o i k e u t e m m e + p e r u s o i k e u t e n a + p e r u s o i k e u t e n s a + p e r u s o i k e u t t a + p e r u s o i k e u t t a a n + p e r u s o i k e u t u s + p e r u s o l e m u k s e n + p e r u s o l e m u k s e s t a + p e r u s o l e m u s + p e r u s o l e m u s t a + p e r u s o l e t t a m u k s e n + p e r u s o l e t t a m u k s i a + p e r u s o l e t t a m u s + p e r u s o l e t t a m u s t a + p e r u s o l e t t a m u s t a a n + p e r u s o l e t u k s e m m e + p e r u s o l e t u k s e n a + p e r u s o l e t u k s e s t a + p e r u s o l e t u k s i a + p e r u s o l e t u k s i s t a + p e r u s o l e t u s + p e r u s o l o i h i n + p e r u s o l o j a + p e r u s o l o j e n + p e r u s o l o s u h t e e t + p e r u s o l o s u h t e i d e n + p e r u s o l o s u h t e i t a + p e r u s o l o t + p e r u s o m i n a i s u u d e t + p e r u s o m i n a i s u u k s i a + p e r u s o m i n a i s u u k s i n a + p e r u s o m i n a i s u u k s i s t a + p e r u s o n g e l m a + p e r u s o n g e l m a a + p e r u s o n g e l m a a n + p e r u s o n g e l m a k s i + p e r u s o n g e l m a m m e + p e r u s o n g e l m a n + p e r u s o n g e l m a n a + p e r u s o n g e l m a s t a + p e r u s o n g e l m a t + p e r u s o n g e l m i a + p e r u s o n g e l m i e n + p e r u s o n g e l m i i n + p e r u s o n g e l m i l t a + p e r u s o n g e l m i s t a + p e r u s o p e t u k s e e n + p e r u s o p e t u k s e l l a + p e r u s o p e t u k s e n + p e r u s o p e t u s + p e r u s o p e t u s t a + p e r u s o p i n n o i s s a + p e r u s o p i n t o j e n + p e r u s o p i t + p e r u s o p p i m i s e n + p e r u s o p p o s i t i o t a + p e r u s o r g a n i s a a t i o i d e n + p e r u s o s a + p e r u s o s a a + p e r u s o s a a m i s t a + p e r u s o s a n + p e r u s o s a n a + p e r u s o s a t e k i j ö i s t ä + p e r u s o s i l t a a n + p e r u s o s i s t a + p e r u s o t s a k k e e n + p e r u s p a l k a s t a + p e r u s p a l k k a + p e r u s p a l k k a a n + p e r u s p a l k k a l u o k a n + p e r u s p a l k k a l u o k k a + p e r u s p a l k k a t a s o + p e r u s p a l k k a u s t a + p e r u s p a l k k i o + p e r u s p a l k k i o n + p e r u s p a l k k o j a + p e r u s p a l k k o j e n + p e r u s p a l v e l u + p e r u s p a l v e l u a l o j a + p e r u s p a l v e l u i d e n + p e r u s p a l v e l u i h i n + p e r u s p a l v e l u i s s a + p e r u s p a l v e l u i s t a + p e r u s p a l v e l u i t a + p e r u s p a l v e l u i t a m m e + p e r u s p a l v e l u j a + p e r u s p a l v e l u j a a n + p e r u s p a l v e l u j e n + p e r u s p a l v e l u n + p e r u s p a l v e l u t + p e r u s p a n k k i j ä r j e s t e l m ä n + p e r u s p a n k k i p a l v e l u i s t a + p e r u s p a n k k i p a l v e l u j e n + p e r u s p a n k k i t i l i + p e r u s p a r a n n u k s i s t a + p e r u s p a r a n n u s t a + p e r u s p a r i a a t t e e t + p e r u s p e l i s ä ä n t ö ä + p e r u s p e r i a a t e + p e r u s p e r i a a t e t t a + p e r u s p e r i a a t e t t a a n + p e r u s p e r i a a t t e e k s i + p e r u s p e r i a a t t e e l l a + p e r u s p e r i a a t t e e l l e + p e r u s p e r i a a t t e e m m e + p e r u s p e r i a a t t e e n + p e r u s p e r i a a t t e e n a + p e r u s p e r i a a t t e e n a a n + p e r u s p e r i a a t t e e n a m m e + p e r u s p e r i a a t t e e n i + p e r u s p e r i a a t t e e s e e n + p e r u s p e r i a a t t e e s s a + p e r u s p e r i a a t t e e s t a + p e r u s p e r i a a t t e e s t a a n + p e r u s p e r i a a t t e e t + p e r u s p e r i a a t t e i d e n + p e r u s p e r i a a t t e i d e n s a + p e r u s p e r i a a t t e i k s i + p e r u s p e r i a a t t e i l l e + p e r u s p e r i a a t t e i n a + p e r u s p e r i a a t t e i s i i m m e + p e r u s p e r i a a t t e i s i i n + p e r u s p e r i a a t t e i s s a + p e r u s p e r i a a t t e i s t a + p e r u s p e r i a a t t e i s t a a n + p e r u s p e r i a a t t e i s t a m m e + p e r u s p e r i a a t t e i t a + p e r u s p e r i a a t t e i t a a n + p e r u s p e r i a a t t e i t a m m e + p e r u s p e r i a a t t e i t t e n + p e r u s p e r u s t e + p e r u s p i i r r e + p e r u s p i i r r e t t ä + p e r u s p i i r t e e s t ä + p e r u s p i i r t e e t + p e r u s p i i r t e i s i i n + p e r u s p i i r t e i s t ä + p e r u s p i i r t e i t ä + p e r u s p i l a r e i d e n + p e r u s p i l a r e i h i n + p e r u s p i l a r e i s t a + p e r u s p i l a r e i s t a m m e + p e r u s p i l a r e i t a + p e r u s p i l a r i + p e r u s p i l a r i a + p e r u s p i l a r i i n + p e r u s p i l a r i k s i + p e r u s p i l a r i n + p e r u s p i l a r i n a + p e r u s p i l a r i s t a + p e r u s p i l a r i t + p e r u s p i n t a + p e r u s p i s t e + p e r u s p i s t e e l l ä + p e r u s p i s t e e s e e n + p e r u s p i s t e i l l ä + p e r u s p i s t e t t ä + p e r u s p o h d i n n a t + p e r u s p o l i t i i k a t + p e r u s p o l i t i i k k a + p e r u s p o l i t i i k k a a + p e r u s p o l i t i i k k o j a n s a + p e r u s p o l t t o a i n e i t a + p e r u s p r i o r i t e e t i t + p e r u s p r i o r i t e e t t i + p e r u s p r o s e s s e i s t a + p e r u s p u h e l i n l i i k e n n e p a l v e l u + p e r u s p u i t t e e t + p e r u s p u u t t e i s t a + p e r u s p y r k i m y k s e m m e + p e r u s p y r k i m y k s e n ä + p e r u s p y r k i m y s t e n + p e r u s p ä i v ä m ä ä r ä n + p e r u s p ä ä m ä ä r i n ä + p e r u s p ä ä m ä ä r ä n ä m m e + p e r u s p ä ä m ä ä r ä t + p e r u s p ä ä m ä ä r ä ä + p e r u s p ä ä o m a k s i + p e r u s p ä ä t e l m i s t ä + p e r u s p ä ä t e l m ä n + p e r u s p ä ä t ö k s e n + p e r u s p ä ä t ö k s i i n + p e r u s p ä ä t ö s l a u s e l m a + p e r u s r a a k a + p e r u s r a h o i t u k s e e n + p e r u s r a h o i t u k s e n + p e r u s r a h o i t u s + p e r u s r a h o i t u s o p e r a a t i o i d e n + p e r u s r a h o i t u s o p e r a a t i o i l l e + p e r u s r a h o i t u s o p e r a a t i o i s t a + p e r u s r a h o i t u s t a + p e r u s r a j a u k s e t + p e r u s r a j o i t u k s i e n + p e r u s r a k e n n e + p e r u s r a k e n n e h a n k k e i d e n + p e r u s r a k e n n e i n v e s t o i n n i t + p e r u s r a k e n n e o s i a + p e r u s r a k e n n e t t a + p e r u s r a k e n t e e l l e + p e r u s r a k e n t e e s e e n + p e r u s r a k e n t e e t + p e r u s r a k e n t e i d e n + p e r u s r a k e n t e i s i i n + p e r u s r a k e n t e i s s a + p e r u s r a k e n t e i t a + p e r u s r a p o r t o i n t i + p e r u s r a p o r t t e j a + p e r u s r a v i n t o a + p e r u s r a v i n t o t a r p e i d e n + p e r u s r e a l i s m i n + p e r u s r e a l i t e e t i t + p e r u s r e h e l l i s y y s + p e r u s r e h e l l i s y y t t ä + p e r u s r e h u n + p e r u s r e k i s t e r ö i n t i + p e r u s r e s u r s s i e n + p e r u s r i k o k s e t + p e r u s r i s t i r i i d a n + p e r u s r i s t i r i i t a + p e r u s r o o l i + p e r u s r u o k a v a l i o s t a + p e r u s s a a v u t u k s e m m e + p e r u s s a i r a a n h o i d o n + p e r u s s a i r a a n h o i t o o n + p e r u s s a n i t a a t i o n + p e r u s s a n i t a a t i o t a + p e r u s s a n o m a + p e r u s s a n o m a n + p e r u s s e i k k o i h i n + p e r u s s e i k k o j a + p e r u s s e k t o r i a + p e r u s s e k t o r i t + p e r u s s e l v i y t y m i n e n + p e r u s s i i r r o i s t a + p e r u s s i i r r o n + p e r u s s i s ä l t ö + p e r u s s i s ä l t ö ä + p e r u s s i s ä l t ö ö n + p e r u s s i t o u m u k s e t + p e r u s s o p i m u k s e e m m e + p e r u s s o p i m u k s e e n + p e r u s s o p i m u k s e k s i + p e r u s s o p i m u k s e n + p e r u s s o p i m u k s e s s a + p e r u s s o p i m u k s e s t a + p e r u s s o p i m u k s e t + p e r u s s o p i m u k s i a + p e r u s s o p i m u k s i a a n + p e r u s s o p i m u k s i i n + p e r u s s o p i m u k s i n + p e r u s s o p i m u k s i s s a + p e r u s s o p i m u k s i s t a + p e r u s s o p i m u s + p e r u s s o p i m u s a s i a + p e r u s s o p i m u s a s i o i d e n + p e r u s s o p i m u s a s i o i h i n + p e r u s s o p i m u s a s i o i t a + p e r u s s o p i m u s e h d o t u k s e n + p e r u s s o p i m u s e h d o t u k s e s t a + p e r u s s o p i m u s e h d o t u s + p e r u s s o p i m u s k e h y s t ä + p e r u s s o p i m u s k r i i s i s t ä + p e r u s s o p i m u s k y s y m y k s i i n + p e r u s s o p i m u s l u o n n o k s e e n + p e r u s s o p i m u s l u o n n o k s e n + p e r u s s o p i m u s l u o n n o s + p e r u s s o p i m u s m u u t o k s i a + p e r u s s o p i m u s m u u t o s t a + p e r u s s o p i m u s n e u v o t t e l u t + p e r u s s o p i m u s p o h j a a + p e r u s s o p i m u s r i k k o m u s m e n e t t e l y t + p e r u s s o p i m u s t a + p e r u s s o p i m u s t e n + p e r u s s o p i m u s u u d i s t u k s e e n + p e r u s s o p i m u s u u d i s t u k s e n + p e r u s s o p i m u s u u d i s t u s + p e r u s s o p i m u s u u d i s t u s p r o s e s s i i n + p e r u s s o p i m u s u u d i s t u s t a + p e r u s s o p i m u s v a l i o k u n n a l l a + p e r u s s o p i m u s v a l i o k u n n a l t a + p e r u s s o p i m u s v a l i o k u n n a n + p e r u s s o p i m u s v a l i o k u n n a s s a + p e r u s s o p i m u s v a l i o k u n t a + p e r u s s o p i m u s v a l i o k u n t a a + p e r u s s o s i a a l i m e n o j a a n + p e r u s s o s i a a l i p a l v e l u i h i n + p e r u s s o s i a a l i p a l v e l u j a + p e r u s s o s i a a l i p a l v e l u j e n + p e r u s s o s i a a l i t u r v a + p e r u s s o s i a a l i t u r v a a + p e r u s s o s i a a l i t u r v a a n + p e r u s s o s i a a l i t u r v a n + p e r u s s t a n d a r d e j a + p e r u s s t a n d a r d i e n + p e r u s s t a n d a r d i j ä r j e s t e l m ä ä + p e r u s s t a n d a r d i n + p e r u s s t a n d a r d i t + p e r u s s t r a t e g i a + p e r u s s t r a t e g i a a + p e r u s s t r a t e g i a a n + p e r u s s t r a t e g i a n + p e r u s s u o j a + p e r u s s u o j a a + p e r u s s u o j a m m e + p e r u s s u o j a n + p e r u s s u o j a s t a + p e r u s s u o m a l a i s e t + p e r u s s u o s i t u k s e t + p e r u s s u u n n i t e l m a a + p e r u s s u u n n i t e l m a s t a + p e r u s s u u n t a + p e r u s s u u n t a a + p e r u s s u u n t a a n + p e r u s s u u n t a n a + p e r u s s u u n t a u k s e n + p e r u s s u u n t a u k s i a + p e r u s s u u n t a u s + p e r u s s u u n t a v i i v a + p e r u s s u u n t a v i i v a n + p e r u s s u u n t a v i i v a t + p e r u s s u u n t a v i i v o i s s a + p e r u s s u u n t a v i i v o i s t a + p e r u s s u u n t a v i i v o j e n + p e r u s s y i d e n + p e r u s s y i h i n + p e r u s s y i s t ä + p e r u s s y i t ä + p e r u s s y m b o l i + p e r u s s y n e r g i a + p e r u s s y n n i t + p e r u s s y y + p e r u s s y y n ä + p e r u s s y y s t ä + p e r u s s y y t + p e r u s s y y t ä + p e r u s s ä h k ö n + p e r u s s ä ä d ö k s e e n + p e r u s s ä ä d ö k s e l l ä + p e r u s s ä ä d ö k s e n + p e r u s s ä ä d ö k s e s s ä + p e r u s s ä ä d ö k s e s t ä + p e r u s s ä ä d ö k s e t + p e r u s s ä ä d ö k s i i n + p e r u s s ä ä d ö k s i s t ä + p e r u s s ä ä d ö k s i ä + p e r u s s ä ä d ö s + p e r u s s ä ä d ö s t e n + p e r u s s ä ä d ö s t ä + p e r u s s ä ä n n ö i s t ä + p e r u s s ä ä n n ö k s e t + p e r u s s ä ä n n ö k s i s t ä + p e r u s s ä ä n n ö k s i ä + p e r u s s ä ä n n ö n + p e r u s s ä ä n n ö s s ä + p e r u s s ä ä n n ö s t e n + p e r u s s ä ä n n ö s t ä + p e r u s s ä ä n n ö s t ö + p e r u s s ä ä n n ö s t ö n + p e r u s s ä ä n n ö s t ö ä m m e + p e r u s s ä ä n n ö t + p e r u s s ä ä n t e l y + p e r u s s ä ä n t e l y n + p e r u s s ä ä n t e l y ä + p e r u s s ä ä n t ö + p e r u s s ä ä n t ö i h i n + p e r u s s ä ä n t ö i n ä + p e r u s s ä ä n t ö j e n + p e r u s s ä ä n t ö j ä + p e r u s s ä ä n t ö m m e + p e r u s s ä ä n t ö n ä + p e r u s s ä ä n t ö p r o s e s s i a + p e r u s s ä ä n t ö p r o s e s s i s t a + p e r u s s ä ä n t ö ä + p e r u s s ä ä n t ö ö n + p e r u s t a a + p e r u s t a a k s e e n + p e r u s t a a k s e m m e + p e r u s t a a n + p e r u s t a e + p e r u s t a e s s a m m e + p e r u s t a e s s a n i + p e r u s t a i d o i s t a + p e r u s t a i d o t + p e r u s t a i t o i h i n + p e r u s t a i t o j a + p e r u s t a i t o j e n + p e r u s t a i t o o n + p e r u s t a j a h a h m o j e n + p e r u s t a j a h a h m o m m e + p e r u s t a j a i s i e n + p e r u s t a j a i s i e n s ä + p e r u s t a j a i s i l l e + p e r u s t a j a i s i l l ä m m e + p e r u s t a j a i s i s t ä + p e r u s t a j a i s i ä + p e r u s t a j a i s ä + p e r u s t a j a i s ä m m e + p e r u s t a j a i s ä t + p e r u s t a j a j ä s e n + p e r u s t a j a j ä s e n e l l ä + p e r u s t a j a j ä s e n e n + p e r u s t a j a j ä s e n e n ä + p e r u s t a j a j ä s e n e t + p e r u s t a j a j ä s e n i i n + p e r u s t a j a j ä s e n i l l ä + p e r u s t a j a j ä s e n i s t ä + p e r u s t a j a j ä s e n i ä + p e r u s t a j a j ä s e n t e n + p e r u s t a j a j ä s e n t ä + p e r u s t a j a j ä s e n v a l t i o i s s a + p e r u s t a j a j ä s e n v a l t i o i s t a + p e r u s t a j a j ä s e n v a l t i o i t a + p e r u s t a j a j ä s e n v a l t i o s s a + p e r u s t a j a j ä s e n v a l t i o s t a + p e r u s t a j a j ä s e n v a l t i o t a + p e r u s t a j a k a n s o j a + p e r u s t a j a l l e + p e r u s t a j a m a a + p e r u s t a j a m a i d e n + p e r u s t a j a m a i s t a + p e r u s t a j a m m e + p e r u s t a j a n a + p e r u s t a j a o r g a n i s a a t i o i t a + p e r u s t a j a o s a k k a a t + p e r u s t a j a r y h m ä s s ä + p e r u s t a j a t + p e r u s t a j a v a i k u t u s + p e r u s t a j a v a l t i o + p e r u s t a j a v a l t i o i d e n + p e r u s t a j a v a l t i o i h i n + p e r u s t a j a v a l t i o i s t a + p e r u s t a j a v a l t i o i t a + p e r u s t a j a v a l t i o n + p e r u s t a j a v a l t i o s s a + p e r u s t a j a v a l t i o t + p e r u s t a j a v a l t i o t a + p e r u s t a j i e n + p e r u s t a j i e n k i n + p e r u s t a j i i n + p e r u s t a j i l l a + p e r u s t a j i l l e + p e r u s t a j i s t a + p e r u s t a j i s t a m m e + p e r u s t a k a a m m e + p e r u s t a k e e n a + p e r u s t a k e i s t a + p e r u s t a k e i t a + p e r u s t a k s i + p e r u s t a k u u t a + p e r u s t a l l a + p e r u s t a l l e + p e r u s t a l o u d e s t a + p e r u s t a l o u s + p e r u s t a l o u s a r v i o s t a a n + p e r u s t a l o u s l u k u t a i d o n + p e r u s t a l t a a n + p e r u s t a m a a n + p e r u s t a m a l l a + p e r u s t a m a m m e + p e r u s t a m a s s a + p e r u s t a m a t t a + p e r u s t a m i l l e + p e r u s t a m i s a s e t u k s e n + p e r u s t a m i s a s e t u k s e s s a + p e r u s t a m i s a s e t u k s i s s a + p e r u s t a m i s a s e t u s + p e r u s t a m i s a s e t u s t a + p e r u s t a m i s a s e t u s t e n + p e r u s t a m i s a s i a k i r j a + p e r u s t a m i s a s i a k i r j a s t a + p e r u s t a m i s a s i a k i r j a s t a a n + p e r u s t a m i s a s i a k i r j o j a + p e r u s t a m i s e d e l l y t y k s e t + p e r u s t a m i s e d e l l y t y s t e n + p e r u s t a m i s e e n + p e r u s t a m i s e k s i + p e r u s t a m i s e l l e + p e r u s t a m i s e n + p e r u s t a m i s e n s a + p e r u s t a m i s e s s a + p e r u s t a m i s e s t a + p e r u s t a m i s h a n k e + p e r u s t a m i s h a n k k e e n + p e r u s t a m i s h i s t o r i a s t a + p e r u s t a m i s k u s t a n n u k s i l l e + p e r u s t a m i s l u v a n + p e r u s t a m i s m a h d o l l i s u u k s i s t a + p e r u s t a m i s m a h d o l l i s u u s + p e r u s t a m i s o i k e u d e n + p e r u s t a m i s p a l k k i o t + p e r u s t a m i s p e r i a a t t e i d e n + p e r u s t a m i s p r o s e s s i a + p e r u s t a m i s p r o s e s s i n + p e r u s t a m i s p r o s e s s i s s a + p e r u s t a m i s s o p i m u k s e e m m e + p e r u s t a m i s s o p i m u k s e e n + p e r u s t a m i s s o p i m u k s e l l a + p e r u s t a m i s s o p i m u k s e l l i s e s t a + p e r u s t a m i s s o p i m u k s e m m e k i n + p e r u s t a m i s s o p i m u k s e n + p e r u s t a m i s s o p i m u k s e s s a + p e r u s t a m i s s o p i m u k s e s s a k i n + p e r u s t a m i s s o p i m u k s e s t a + p e r u s t a m i s s o p i m u k s e t + p e r u s t a m i s s o p i m u k s i a + p e r u s t a m i s s o p i m u k s i i n + p e r u s t a m i s s o p i m u k s i l l a + p e r u s t a m i s s o p i m u k s i s s a + p e r u s t a m i s s o p i m u k s i s s a m m e + p e r u s t a m i s s o p i m u k s i s t a + p e r u s t a m i s s o p i m u s + p e r u s t a m i s s o p i m u s h a n k e + p e r u s t a m i s s o p i m u s l u o n n o k s e e n + p e r u s t a m i s s o p i m u s l u o n n o k s e n + p e r u s t a m i s s o p i m u s l u o n n o k s e s s a + p e r u s t a m i s s o p i m u s l u o n n o s + p e r u s t a m i s s o p i m u s l u o n n o s t a + p e r u s t a m i s s o p i m u s m u u t o s t e n + p e r u s t a m i s s o p i m u s o s a a n + p e r u s t a m i s s o p i m u s p e r u s t e i s e t + p e r u s t a m i s s o p i m u s t a + p e r u s t a m i s s o p i m u s t e k s t i + p e r u s t a m i s s o p i m u s t e n + p e r u s t a m i s s o p i m u s u u d i s t u k s e e n + p e r u s t a m i s s s o p i m u k s e n + p e r u s t a m i s s u o s i t u k s e s s a + p e r u s t a m i s s u u n n i t e l m a n + p e r u s t a m i s s ä ä d ö k s e t + p e r u s t a m i s s ä ä n t ö j e n + p e r u s t a m i s t a + p e r u s t a m i s t o i v e i d e n + p e r u s t a m i s t u k e a + p e r u s t a m i s v a i h e e s s a + p e r u s t a m i s v a i h e t t a + p e r u s t a m i s v e l v o i t e + p e r u s t a m m e + p e r u s t a n + p e r u s t a n a + p e r u s t a n e e t + p e r u s t a r i f f i a + p e r u s t a r j o n t a + p e r u s t a r k i s t u k s i a + p e r u s t a r k o i t u k s e n + p e r u s t a r k o i t u k s e n a + p e r u s t a r k o i t u s + p e r u s t a r k o i t u s p e r ä t + p e r u s t a r k o i t u s t a + p e r u s t a r p e e m m e + p e r u s t a r p e e n + p e r u s t a r p e e n s a + p e r u s t a r p e e s e e n + p e r u s t a r p e e s t a + p e r u s t a r p e e t + p e r u s t a r p e i d e n + p e r u s t a r p e i l t a + p e r u s t a r p e i s i i n + p e r u s t a r p e i s i i n s a + p e r u s t a r p e i s t a + p e r u s t a r p e i s t a a n + p e r u s t a r p e i t a + p e r u s t a r p e i t a a n + p e r u s t a r v e + p e r u s t a r v i k e j o u k o n + p e r u s t a r v i k k e i d e n + p e r u s t a r v i k k e i s i i n + p e r u s t a r v i k k e i s t a + p e r u s t a r v i k k e i t a + p e r u s t a s a p a i n o + p e r u s t a s a p a i n o m m e + p e r u s t a s a p a i n o n + p e r u s t a s o + p e r u s t a s o a + p e r u s t a s o l l a + p e r u s t a s o l t a + p e r u s t a s o n + p e r u s t a s o s t a + p e r u s t a s t a + p e r u s t a t + p e r u s t a v a a + p e r u s t a v a l t i o t + p e r u s t a v a m m a n l a a t u i s i a + p e r u s t a v a m m i n + p e r u s t a v a m p a a + p e r u s t a v a m p i + p e r u s t a v a m p i a + p e r u s t a v a m p i a k i n + p e r u s t a v a m p i i n + p e r u s t a v a n + p e r u s t a v a n a + p e r u s t a v a n l a a t u i n e n + p e r u s t a v a n l a a t u i s e e n + p e r u s t a v a n l a a t u i s e k s i + p e r u s t a v a n l a a t u i s e m m a s t a + p e r u s t a v a n l a a t u i s e m p a a n + p e r u s t a v a n l a a t u i s e m p i + p e r u s t a v a n l a a t u i s e m p i a + p e r u s t a v a n l a a t u i s e n + p e r u s t a v a n l a a t u i s e n a + p e r u s t a v a n l a a t u i s e s t a + p e r u s t a v a n l a a t u i s e t + p e r u s t a v a n l a a t u i s i a + p e r u s t a v a n l a a t u i s i i n + p e r u s t a v a n l a a t u i s i m m a l l a + p e r u s t a v a n l a a t u i s i m m a n + p e r u s t a v a n l a a t u i s i m m a s t a + p e r u s t a v a n l a a t u i s i m m a t + p e r u s t a v a n l a a t u i s i m m i s t a + p e r u s t a v a n l a a t u i s i m p i a + p e r u s t a v a n l a a t u i s i m p i e n + p e r u s t a v a n l a a t u i s i n t a + p e r u s t a v a n l a a t u i s i s t a + p e r u s t a v a n l a a t u i s t a + p e r u s t a v a n l a a t u i s t e n + p e r u s t a v a n l u o n t e i s e n + p e r u s t a v a n l u o n t e i s e t + p e r u s t a v a n l u o n t e i s i a + p e r u s t a v a s t a + p e r u s t a v a t + p e r u s t a v i a + p e r u s t a v i e n + p e r u s t a v i m m a n + p e r u s t a v i m m a n l a a t u i n e n + p e r u s t a v i m m a n l a a t u i s i a + p e r u s t a v i m m a n l a a t u i s t e n + p e r u s t a v i m m a t k i n + p e r u s t a v i m m i s s a + p e r u s t a v i m m i s t a + p e r u s t a v i m p i a + p e r u s t a v i m p i e n + p e r u s t a v i n + p e r u s t a v i n t a + p e r u s t a v i n t a k a a n + p e r u s t a v i s t a + p e r u s t a v o i t e + p e r u s t a v o i t e t t a + p e r u s t a v o i t t e e k s i + p e r u s t a v o i t t e e m m e + p e r u s t a v o i t t e e n + p e r u s t a v o i t t e e n a + p e r u s t a v o i t t e e n a m m e + p e r u s t a v o i t t e e s e e n + p e r u s t a v o i t t e e s t a + p e r u s t a v o i t t e e t + p e r u s t a v o i t t e i d e n + p e r u s t a v o i t t e i k s i + p e r u s t a v o i t t e i l l a + p e r u s t a v o i t t e i n a + p e r u s t a v o i t t e i s i i n + p e r u s t a v o i t t e i s i i n s a + p e r u s t a v o i t t e i s t a + p e r u s t a v o i t t e i s t a m m e + p e r u s t a v o i t t e i t a + p e r u s t a v o i t t e i t a m m e + p e r u s t e e k s i + p e r u s t e e l l i s e e n + p e r u s t e e l l i s e l l e + p e r u s t e e l l i s e m m a n + p e r u s t e e l l i s e m m a t + p e r u s t e e l l i s e m m i n + p e r u s t e e l l i s e m p a a + p e r u s t e e l l i s e m p a a n + p e r u s t e e l l i s e m p a n a + p e r u s t e e l l i s e m p i + p e r u s t e e l l i s e m p i a + p e r u s t e e l l i s e m p i i n + p e r u s t e e l l i s e n + p e r u s t e e l l i s e s s a + p e r u s t e e l l i s e s t a + p e r u s t e e l l i s e t + p e r u s t e e l l i s i a + p e r u s t e e l l i s i i n + p e r u s t e e l l i s i l l a + p e r u s t e e l l i s i l l e + p e r u s t e e l l i s i m m a n + p e r u s t e e l l i s i s s a + p e r u s t e e l l i s t a + p e r u s t e e l l i s t e n + p e r u s t e e m a a + p e r u s t e e m o i h i n + p e r u s t e e m o j a + p e r u s t e e n + p e r u s t e e n a + p e r u s t e e s t a + p e r u s t e e t + p e r u s t e e t o n t a + p e r u s t e e t t a + p e r u s t e e t t o m a n a + p e r u s t e e t t o m i a + p e r u s t e e t t o m i e n + p e r u s t e e t t o m i l t a + p e r u s t e e t t o m i n a + p e r u s t e h t ä v i i n + p e r u s t e h t ä v i i n s ä + p e r u s t e h t ä v i s s ä + p e r u s t e h t ä v i s t ä + p e r u s t e h t ä v i s t ä m m e + p e r u s t e h t ä v i ä + p e r u s t e h t ä v i ä m m e + p e r u s t e h t ä v ä + p e r u s t e h t ä v ä k s i + p e r u s t e h t ä v ä m m e + p e r u s t e h t ä v ä n s ä + p e r u s t e h t ä v ä n ä + p e r u s t e h t ä v ä s s ä + p e r u s t e h t ä v ä t + p e r u s t e h t ä v ä ä + p e r u s t e h t ä v ä ä n + p e r u s t e h t ä v ä ä n s ä + p e r u s t e i d e n + p e r u s t e i l l e + p e r u s t e i l t a a n + p e r u s t e i n + p e r u s t e i n a + p e r u s t e i n e e n + p e r u s t e i s i i n + p e r u s t e i s t a + p e r u s t e i t a + p e r u s t e i t a m m e + p e r u s t e i t t a + p e r u s t e k i j ä + p e r u s t e k i j ä n + p e r u s t e k i j ä n ä + p e r u s t e k i j ä s t ä + p e r u s t e k i j ä t + p e r u s t e k i j ä ä + p e r u s t e k i j ä ä n + p e r u s t e k i j ö i d e n + p e r u s t e k i j ö i h i n + p e r u s t e k i j ö i n ä + p e r u s t e k i j ö i s t ä + p e r u s t e k i j ö i t ä + p e r u s t e k n i i k a n + p e r u s t e k n i i k k a a + p e r u s t e k n i i k o i d e n + p e r u s t e k n i i k o i t a + p e r u s t e k n i s e t + p e r u s t e k n o l o g i a a + p e r u s t e k n o l o g i a n + p e r u s t e k s t e i n ä + p e r u s t e k s t e i s s ä + p e r u s t e k s t e i s t ä + p e r u s t e k s t i + p e r u s t e k s t i e n + p e r u s t e k s t i i n + p e r u s t e k s t i n + p e r u s t e k s t i n ä + p e r u s t e k s t i s s ä + p e r u s t e k s t i s t ä + p e r u s t e k s t i t + p e r u s t e k s t i ä + p e r u s t e l e e + p e r u s t e l e m a a n + p e r u s t e l e m a t o n + p e r u s t e l e m a t t a + p e r u s t e l e m i n e n + p e r u s t e l e m i s e k s i + p e r u s t e l e m i s e l l a + p e r u s t e l e m i s e n + p e r u s t e l e v i e s t i n t ä ä + p e r u s t e l e v i i n + p e r u s t e l i + p e r u s t e l i t t e + p e r u s t e l k a a + p e r u s t e l l a + p e r u s t e l l a a n + p e r u s t e l l a k i n + p e r u s t e l l a k s e e n + p e r u s t e l l a k s e n i + p e r u s t e l l e s s a a n + p e r u s t e l l e s s a n i + p e r u s t e l l u i s s a + p e r u s t e l l u i s t a + p e r u s t e l l u l t a + p e r u s t e l l u m m a n + p e r u s t e l l u m m i n + p e r u s t e l l u m p a a + p e r u s t e l l u m p i a + p e r u s t e l l u m p i i n + p e r u s t e l l u n + p e r u s t e l l u t + p e r u s t e l t a v a + p e r u s t e l t a v i s s a + p e r u s t e l t i i n + p e r u s t e l t u a + p e r u s t e l t u i n a + p e r u s t e l t u j a + p e r u s t e l t u j e n + p e r u s t e l t u k a a n + p e r u s t e l t u n a + p e r u s t e l t u u n + p e r u s t e l u a + p e r u s t e l u e t t e l o + p e r u s t e l u i d e n + p e r u s t e l u i h i n + p e r u s t e l u i h i n s a + p e r u s t e l u i l l a + p e r u s t e l u i l l e + p e r u s t e l u i n a + p e r u s t e l u i n e e n + p e r u s t e l u i s s a + p e r u s t e l u i s s a a n + p e r u s t e l u i s s a n i + p e r u s t e l u i s s a n n e + p e r u s t e l u i s t a + p e r u s t e l u i s t a a n + p e r u s t e l u i t a + p e r u s t e l u j a + p e r u s t e l u j a a n + p e r u s t e l u j e n + p e r u s t e l u j e n s a + p e r u s t e l u m e n e t t e l y ä + p e r u s t e l u m m e + p e r u s t e l u n + p e r u s t e l u n a + p e r u s t e l u n i + p e r u s t e l u n n e + p e r u s t e l u n s a + p e r u s t e l u o s a + p e r u s t e l u o s a a + p e r u s t e l u o s a a n + p e r u s t e l u o s a n + p e r u s t e l u o s a n s a + p e r u s t e l u o s a s s a + p e r u s t e l u o s a s s a a n + p e r u s t e l u o s a s t a + p e r u s t e l u o s i o + p e r u s t e l u o s u u s + p e r u s t e l u s s a + p e r u s t e l u s s a a n + p e r u s t e l u s t a + p e r u s t e l u t + p e r u s t e l u u n + p e r u s t e o l l i s u u d e n + p e r u s t e o l l i s u u s + p e r u s t e r v e y d e n + p e r u s t e r v e y d e n h o i d o n + p e r u s t e r v e y d e n h o i t o + p e r u s t e r v e y d e n h o i t o a + p e r u s t e r v e y d e n h o i t o o n + p e r u s t e r v e y d e n h u o l l o n + p e r u s t e r v e y d e n h u o l l o s s a + p e r u s t e r v e y d e n h u o l l o s t a + p e r u s t e r v e y d e n h u o l t o + p e r u s t e r v e y d e n h u o l t o a + p e r u s t e r v e y d e n h u o l t o j ä r j e s t e l m i l l e + p e r u s t e r v e y d e n h u o l t o j ä r j e s t e l m i ä ä n + p e r u s t e r v e y d e n h u o l t o j ä r j e s t e l m ä n + p e r u s t e r v e y d e n h u o l t o o n + p e r u s t e r v e y d e n h u o l t o p a l v e l u i h i n + p e r u s t e r v e y d e n h u o l t o p a l v e l u j a + p e r u s t e r v e y d e n h u o l t o p a l v e l u j e n + p e r u s t e r v e y d e n h u o l t o p i s t e i t ä + p e r u s t e r v e y d e s t ä + p e r u s t e r v e y s p a l v e l u j a + p e r u s t e r v e y s p a l v e l u j e n + p e r u s t e t a a n + p e r u s t e t t a + p e r u s t e t t a e s s a + p e r u s t e t t a i s i i n + p e r u s t e t t a k o o n + p e r u s t e t t a v a + p e r u s t e t t a v a a n + p e r u s t e t t a v a l l e + p e r u s t e t t a v a n + p e r u s t e t t a v a s t a + p e r u s t e t t i i n + p e r u s t e t t u + p e r u s t e t t u a + p e r u s t e t t u j e n + p e r u s t e t u i s t a + p e r u s t e t u s s a + p e r u s t e t u s t a + p e r u s t i e d o i s t a + p e r u s t i e d o n + p e r u s t i e d o n l ä h t e e n ä ä n + p e r u s t i e d o n s a a n t i a + p e r u s t i e d o s t a + p e r u s t i e d o t + p e r u s t i e t e e n + p e r u s t i e t e e s s ä + p e r u s t i e t o + p e r u s t i e t o a + p e r u s t i e t o i n e e n + p e r u s t i e t o j a + p e r u s t i e t o j e n + p e r u s t i e t o o n + p e r u s t i e t ä m y k s e e n + p e r u s t i e t ä m y k s e n s ä + p e r u s t i e t ä m y s + p e r u s t i e t ä m y s t ä + p e r u s t i l a n n e + p e r u s t i l a n n e t t a + p e r u s t i l a s t o j a + p e r u s t i l a s t o j e n + p e r u s t i m m e + p e r u s t o i m e e n t u l o + p e r u s t o i m e e n t u l o a + p e r u s t o i m e e n t u l o m i n i m i + p e r u s t o i m e e n t u l o n + p e r u s t o i m e e n t u l o o n + p e r u s t o i m e e n t u l o o n s a + p e r u s t o i m e n a + p e r u s t o i m e n p i d e + p e r u s t o i m e n p i t e i s s ä + p e r u s t o i m e n p i t e i t ä + p e r u s t o i m i e l i m e t + p e r u s t o i m i e n + p e r u s t o i m i n n a n + p e r u s t o i m i n n o t + p e r u s t o i m i n t a + p e r u s t o i m i n t a a n + p e r u s t o i m i n t a l i n j a + p e r u s t o i m i n t a l i n j o i s t a + p e r u s t o i m i n t o i h i n s a + p e r u s t o i m i n t o j a + p e r u s t o i m i n t o j e n + p e r u s t o i m i s t a + p e r u s t o i m i v a l t a + p e r u s t o i m i v a l t a a + p e r u s t o i m i v a l t u u k s i a + p e r u s t o i s t a + p e r u s t o i v e + p e r u s t o i v e i s t a + p e r u s t o j a + p e r u s t o j e n + p e r u s t o s i s e i k k o j a + p e r u s t o t u u d e n + p e r u s t o t u u d e s s a + p e r u s t o t u u d e t + p e r u s t o t u u k s i s t a + p e r u s t o t u u s + p e r u s t o t u u t e e n + p e r u s t o t u u t t a + p e r u s t u a + p e r u s t u e s t a + p e r u s t u i p a + p e r u s t u i s i + p e r u s t u k i e n + p e r u s t u k s e t + p e r u s t u k s i a + p e r u s t u k s i a m m e + p e r u s t u k s i i n + p e r u s t u l l e i s t a + p e r u s t u l o + p e r u s t u l o j a + p e r u s t u l o n + p e r u s t u l o s t a + p e r u s t u m a t t o m i a + p e r u s t u m a t t o m i e n + p e r u s t u m a t t o m i i n + p e r u s t u o t a n t o + p e r u s t u o t a n t o a l o j e n + p e r u s t u o t a n t o v ä l i n e i d e n + p e r u s t u o t t a j i e n + p e r u s t u o t t a j i l l e + p e r u s t u o t t e e t + p e r u s t u o t t e i d e n + p e r u s t u o t t e i s i i n + p e r u s t u o t t e i s t a + p e r u s t u o t t e i t a + p e r u s t u r v a + p e r u s t u r v a a + p e r u s t u r v a l l i s u u d e s t a + p e r u s t u r v a l l i s u u s + p e r u s t u r v a l l i s u u s j ä r j e s t e l y i s t ä + p e r u s t u r v a l l i s u u s s t a n d a r d e j a + p e r u s t u r v a l l i s u u s s t a n d a r d i t + p e r u s t u r v a l l i s u u s s ä ä n t ö j ä + p e r u s t u r v a l l i s u u s v a a t i m u k s i a + p e r u s t u r v a l l i s u u t e e n + p e r u s t u r v a l l i s u u t t a + p e r u s t u r v a m m e + p e r u s t u r v a n + p e r u s t u r v a s t a + p e r u s t u r v a t o i m e t + p e r u s t u r v a v e r k k o a + p e r u s t u s l a e i l l a + p e r u s t u s l a e i s s a + p e r u s t u s l a e i s t a + p e r u s t u s l a i k s i + p e r u s t u s l a i l l a + p e r u s t u s l a i l l e + p e r u s t u s l a i l l i n e n + p e r u s t u s l a i l l i s e e n + p e r u s t u s l a i l l i s e k s i + p e r u s t u s l a i l l i s e n + p e r u s t u s l a i l l i s e s s a + p e r u s t u s l a i l l i s e s t a + p e r u s t u s l a i l l i s e t + p e r u s t u s l a i l l i s i a + p e r u s t u s l a i l l i s i l l e + p e r u s t u s l a i l l i s i s s a + p e r u s t u s l a i l l i s i s t a + p e r u s t u s l a i l l i s t a + p e r u s t u s l a i l l i s t a m i s e e n + p e r u s t u s l a i l l i s t a m i s k e h i t y s t ä + p e r u s t u s l a i n + p e r u s t u s l a i n m u u t o k s e t + p e r u s t u s l a i n s ä ä d ä n t ö p r o s e s s i n + p e r u s t u s l a i n s ä ä d ä n t ö v a l t a + p e r u s t u s l a i n s ä ä d ä n t ö v a l t a a + p e r u s t u s l a i n s ä ä d ä n t ö v a l t a a m m e + p e r u s t u s l a i n s ä ä d ä n t ö ö n + p e r u s t u s l a i n v a s t a i n e n + p e r u s t u s l a i s s a + p e r u s t u s l a i s s a m m e + p e r u s t u s l a i s t a + p e r u s t u s l a i t + p e r u s t u s l a k e i h i n + p e r u s t u s l a k e j a + p e r u s t u s l a k i + p e r u s t u s l a k i a + p e r u s t u s l a k i a a n + p e r u s t u s l a k i a j a t t e l u n + p e r u s t u s l a k i a j a t u s + p e r u s t u s l a k i a m m e + p e r u s t u s l a k i a s e t u k s e s t a + p e r u s t u s l a k i a s i a + p e r u s t u s l a k i a s i a k i r j a + p e r u s t u s l a k i a s i a k i r j a a n + p e r u s t u s l a k i a s i a k i r j a n + p e r u s t u s l a k i a s i a k i r j a s t a + p e r u s t u s l a k i a s i a n t u n t i j a t + p e r u s t u s l a k i a s i a s s a + p e r u s t u s l a k i a s i o i d e n + p e r u s t u s l a k i a s i o i s s a + p e r u s t u s l a k i e h d o t u k s e e n + p e r u s t u s l a k i e h d o t u k s e l l a + p e r u s t u s l a k i e h d o t u k s e n + p e r u s t u s l a k i e h d o t u k s e s s a + p e r u s t u s l a k i e h d o t u k s e s s a k i n + p e r u s t u s l a k i e h d o t u k s e s t a + p e r u s t u s l a k i e h d o t u k s i a + p e r u s t u s l a k i e h d o t u s + p e r u s t u s l a k i e h d o t u s t a + p e r u s t u s l a k i e n + p e r u s t u s l a k i e n s a + p e r u s t u s l a k i e s i t y k s e n + p e r u s t u s l a k i e s i t y s + p e r u s t u s l a k i e s i t y s t ä + p e r u s t u s l a k i f i a s k o + p e r u s t u s l a k i h a n k e + p e r u s t u s l a k i h a n k e t t a + p e r u s t u s l a k i h a n k k e e n + p e r u s t u s l a k i h a n k k e e s e e n + p e r u s t u s l a k i h a n k k e e s t a + p e r u s t u s l a k i h u l l u u t e e n + p e r u s t u s l a k i i n + p e r u s t u s l a k i j ä r j e s t e l m i e n + p e r u s t u s l a k i j ä r j e s t e l m i s s ä + p e r u s t u s l a k i j ä r j e s t e l m ä + p e r u s t u s l a k i j ä r j e s t e l m ä n + p e r u s t u s l a k i j ä r j e s t e l m ä ä + p e r u s t u s l a k i j ä r j e s t y k s e n + p e r u s t u s l a k i j ä r j e s t y s t ä + p e r u s t u s l a k i k a n s a n ä ä n e s t y s t e n + p e r u s t u s l a k i k e s k u s t e l u + p e r u s t u s l a k i k e s k u s t e l u a + p e r u s t u s l a k i k e s k u s t e l u n + p e r u s t u s l a k i k e s k u s t e l u s s a + p e r u s t u s l a k i k e s k u s t e l u u n + p e r u s t u s l a k i k i n + p e r u s t u s l a k i k o m i t e a a + p e r u s t u s l a k i k o m i t e a n + p e r u s t u s l a k i k r i i s i + p e r u s t u s l a k i k r i i s i i n + p e r u s t u s l a k i k r i i s i k i n + p e r u s t u s l a k i k r i i s i n + p e r u s t u s l a k i k r i i s i s t ä + p e r u s t u s l a k i k y s y m y k s e e n + p e r u s t u s l a k i k y s y m y k s e n + p e r u s t u s l a k i k y s y m y k s e s s ä + p e r u s t u s l a k i k y s y m y k s e s t ä + p e r u s t u s l a k i k y s y m y k s i i n + p e r u s t u s l a k i k y s y m y k s i ä + p e r u s t u s l a k i k y s y m y s + p e r u s t u s l a k i k y s y m y s t e n + p e r u s t u s l a k i k y s y m y s t ä + p e r u s t u s l a k i l a u s e k k e e n + p e r u s t u s l a k i l u o n n o k s e e n + p e r u s t u s l a k i l u o n n o k s e l l a + p e r u s t u s l a k i l u o n n o k s e l l e + p e r u s t u s l a k i l u o n n o k s e n + p e r u s t u s l a k i l u o n n o k s e s s a + p e r u s t u s l a k i l u o n n o k s e s s a a n + p e r u s t u s l a k i l u o n n o k s e s s a k a a n + p e r u s t u s l a k i l u o n n o k s e s s a m m e + p e r u s t u s l a k i l u o n n o k s e s t a + p e r u s t u s l a k i l u o n n o k s e s t a k i n + p e r u s t u s l a k i l u o n n o k s i s s a + p e r u s t u s l a k i l u o n n o s + p e r u s t u s l a k i l u o n n o s k i n + p e r u s t u s l a k i l u o n n o s t a + p e r u s t u s l a k i m a l l i + p e r u s t u s l a k i m a l l i n + p e r u s t u s l a k i m a l l i s t a + p e r u s t u s l a k i m a l l i s t a a n + p e r u s t u s l a k i m e n e t e l m ä + p e r u s t u s l a k i m e n e t t e l y n + p e r u s t u s l a k i m e n e t t e l y ä + p e r u s t u s l a k i m u u t o k s e n + p e r u s t u s l a k i m u u t o k s e s t a + p e r u s t u s l a k i m u u t o k s e t + p e r u s t u s l a k i m u u t o k s i a + p e r u s t u s l a k i m u u t o k s i i n + p e r u s t u s l a k i m u u t o k s i l l a + p e r u s t u s l a k i m u u t o s t e n + p e r u s t u s l a k i n e u v o s t o + p e r u s t u s l a k i n e u v o s t o n + p e r u s t u s l a k i n e u v o s t o o n + p e r u s t u s l a k i n e u v o s t o s s a + p e r u s t u s l a k i n e u v o t t e l u j e n + p e r u s t u s l a k i n e u v o t t e l u t + p e r u s t u s l a k i o i k e u d e l l i s e t + p e r u s t u s l a k i o i k e u d e l l i s t a + p e r u s t u s l a k i o i k e u d e n + p e r u s t u s l a k i o i k e u d e s s a + p e r u s t u s l a k i o i k e u s + p e r u s t u s l a k i o n g e l m a a + p e r u s t u s l a k i o n g e l m a a n + p e r u s t u s l a k i p a k e t i n + p e r u s t u s l a k i p a k e t t i a + p e r u s t u s l a k i p e r i a a t e t t a + p e r u s t u s l a k i p i l v i l i n n o j e n + p e r u s t u s l a k i p r o s e s s i + p e r u s t u s l a k i p r o s e s s i a + p e r u s t u s l a k i p r o s e s s i i n + p e r u s t u s l a k i p r o s e s s i l l e + p e r u s t u s l a k i p r o s e s s i n + p e r u s t u s l a k i p r o s e s s i s s a + p e r u s t u s l a k i p r o s e s s i s t a + p e r u s t u s l a k i r a k e n t e e l l a a n + p e r u s t u s l a k i r a k e n t e i t a + p e r u s t u s l a k i r a t k a i s u j a + p e r u s t u s l a k i s o p i m u k s e e n + p e r u s t u s l a k i s o p i m u k s e k s i + p e r u s t u s l a k i s o p i m u k s e l l a + p e r u s t u s l a k i s o p i m u k s e l l e + p e r u s t u s l a k i s o p i m u k s e m m e + p e r u s t u s l a k i s o p i m u k s e n + p e r u s t u s l a k i s o p i m u k s e n a + p e r u s t u s l a k i s o p i m u k s e s s a + p e r u s t u s l a k i s o p i m u k s e s t a + p e r u s t u s l a k i s o p i m u s + p e r u s t u s l a k i s o p i m u s e h d o t u k s e n + p e r u s t u s l a k i s o p i m u s e h d o t u k s e s s a + p e r u s t u s l a k i s o p i m u s e h d o t u k s e s t a + p e r u s t u s l a k i s o p i m u s e h d o t u s + p e r u s t u s l a k i s o p i m u s e h d o t u s t a + p e r u s t u s l a k i s o p i m u s l u o n n o k s e e n + p e r u s t u s l a k i s o p i m u s l u o n n o k s e l l a + p e r u s t u s l a k i s o p i m u s l u o n n o k s e n + p e r u s t u s l a k i s o p i m u s l u o n n o k s e s s a + p e r u s t u s l a k i s o p i m u s l u o n n o k s e s t a + p e r u s t u s l a k i s o p i m u s l u o n n o s + p e r u s t u s l a k i s o p i m u s l u o n n o s t a + p e r u s t u s l a k i s o p i m u s t a + p e r u s t u s l a k i s o p i m u s t e k s t i n + p e r u s t u s l a k i s o p i m u s t e k s t i s t ä + p e r u s t u s l a k i s o p i m u s t e k s t i ä + p e r u s t u s l a k i s o p i m u s t e n + p e r u s t u s l a k i s o p u a + p e r u s t u s l a k i t e k s t e i s t ä + p e r u s t u s l a k i t e k s t i + p e r u s t u s l a k i t e k s t i i n + p e r u s t u s l a k i t e k s t i n + p e r u s t u s l a k i t e k s t i s s ä + p e r u s t u s l a k i t e k s t i s t ä + p e r u s t u s l a k i t e k s t i ä + p e r u s t u s l a k i t u o m i o i s t u i m e e n + p e r u s t u s l a k i t u o m i o i s t u i m e l l a + p e r u s t u s l a k i t u o m i o i s t u i m e l l e + p e r u s t u s l a k i t u o m i o i s t u i m e l t a + p e r u s t u s l a k i t u o m i o i s t u i m e n + p e r u s t u s l a k i t u o m i o i s t u i m e n a + p e r u s t u s l a k i t u o m i o i s t u i m e s s a + p e r u s t u s l a k i t u o m i o i s t u i m e s t a + p e r u s t u s l a k i t u o m i o i s t u i m e t + p e r u s t u s l a k i t u o m i o i s t u i m i a + p e r u s t u s l a k i t u o m i o i s t u i n + p e r u s t u s l a k i t u o m i o i s t u i n t a + p e r u s t u s l a k i t u o m i o i s t u i n t e n + p e r u s t u s l a k i u u d i s t u k s e e n + p e r u s t u s l a k i u u d i s t u k s e l l a + p e r u s t u s l a k i u u d i s t u k s e n + p e r u s t u s l a k i u u d i s t u k s e n s a + p e r u s t u s l a k i u u d i s t u k s e s s a + p e r u s t u s l a k i u u d i s t u k s e s t a + p e r u s t u s l a k i u u d i s t u k s e t + p e r u s t u s l a k i u u d i s t u k s i a + p e r u s t u s l a k i u u d i s t u k s i s s a + p e r u s t u s l a k i u u d i s t u s + p e r u s t u s l a k i u u d i s t u s p a k e t t i + p e r u s t u s l a k i u u d i s t u s p r o s e s s i n + p e r u s t u s l a k i u u d i s t u s p r o s e s s i s s a + p e r u s t u s l a k i u u d i s t u s t a + p e r u s t u s l a k i u u d i s t u s t e n + p e r u s t u s l a k i v a l i o k u n n a l l a + p e r u s t u s l a k i v a l i o k u n n a l l e + p e r u s t u s l a k i v a l i o k u n n a n + p e r u s t u s l a k i v a l i o k u n t a + p e r u s t u s l a k i v a l i o k u n t a a n + p e r u s t u s l a k i v a l m i s t e l u k u n n a n + p e r u s t u s l a k i v a l t i o n + p e r u s t u s l a k i v e r s i o n + p e r u s t u s l a k i ä ä n e s t y k s e s t ä + p e r u s t u s l a k i ä ä n e s t y s + p e r u s t u s r a k e n n e + p e r u s t u t k i m u k s e e n + p e r u s t u t k i m u k s e k s i + p e r u s t u t k i m u k s e l l a + p e r u s t u t k i m u k s e l l e + p e r u s t u t k i m u k s e n + p e r u s t u t k i m u k s e s s a + p e r u s t u t k i m u k s e s t a + p e r u s t u t k i m u s + p e r u s t u t k i m u s h a n k k e e t + p e r u s t u t k i m u s o h j e l m i e n + p e r u s t u t k i m u s t a + p e r u s t u t k i m u s v a i h e e s s a + p e r u s t u t k i n t o a + p e r u s t u t k i n t o j a + p e r u s t u t t a v a + p e r u s t u u + p e r u s t u v a + p e r u s t u v a a + p e r u s t u v a a n + p e r u s t u v a k s i + p e r u s t u v a l l e + p e r u s t u v a n + p e r u s t u v a s s a + p e r u s t u v a s t a + p e r u s t u v a t + p e r u s t u v i a + p e r u s t u v i e n + p e r u s t u v i k s i + p e r u s t u v i s t a + p e r u s t y ö k a l u + p e r u s t y ö k a l u n a + p e r u s t y ö n o r m e i h i n + p e r u s t y ö n o r m e i l l e + p e r u s t y ö n o r m e i s t a + p e r u s t y ö n o r m e j a + p e r u s t y ö n o r m i e n + p e r u s t y ö n o r m i t + p e r u s t y ö o i k e u k s i a + p e r u s t y ö o l o j e n + p e r u s t y ö t ä + p e r u s t y ö v ä l i n e + p e r u s t y ö v ä l i n e e n ä + p e r u s u r h e i l u a + p e r u s u r h e i l u p a k e t i n + p e r u s u s k o m u k s e s s a a n + p e r u s u s k o m u k s e s t a + p e r u s u s k o m u s + p e r u s u s k o t t a v u u d e s t a + p e r u s u s k o t t a v u u d e s t a m m e + p e r u s u u d i s t u k s e t + p e r u s u u d i s t u k s i a + p e r u s u u d i s t u s t e n + p e r u s v a a t i m u k s e e n + p e r u s v a a t i m u k s e k s i + p e r u s v a a t i m u k s e n + p e r u s v a a t i m u k s e n a + p e r u s v a a t i m u k s e n i + p e r u s v a a t i m u k s e t + p e r u s v a a t i m u k s i a + p e r u s v a a t i m u k s i i n + p e r u s v a a t i m u k s i s t a + p e r u s v a a t i m u s + p e r u s v a a t i m u s t a + p e r u s v a a t i m u s t e n + p e r u s v a h v u u k s i a a n + p e r u s v a i h e e s s a + p e r u s v a i h t o e h d o i s t a + p e r u s v a i h t o e h t o n a + p e r u s v a i h t o j e n + p e r u s v a i k e u k s i a + p e r u s v a i k e u t t a + p e r u s v a i k u t u s t e n + p e r u s v a k a u m u k s e n i + p e r u s v a k a u m u k s e s t a + p e r u s v a k u u t u k s e n + p e r u s v a k u u t u s t u r v a + p e r u s v a l i n n a t + p e r u s v a l i n n o i s t a + p e r u s v a l i n t a n s a + p e r u s v a l i n t o i h i n + p e r u s v a l i n t o j a + p e r u s v a l i n t o j e n + p e r u s v a l l a n + p e r u s v a l m i u d e t + p e r u s v a l m i u k s i a + p e r u s v a l m i u k s i i n + p e r u s v a l t a + p e r u s v a l t t i + p e r u s v a l t u u d e t + p e r u s v a l t u u k s i a + p e r u s v a l t u u t u s + p e r u s v a l t u u t u s t a + p e r u s v a n k i l a o l o i s t a + p e r u s v a p a u d e k s i + p e r u s v a p a u d e n + p e r u s v a p a u d e s t a + p e r u s v a p a u d e t + p e r u s v a p a u k s i a + p e r u s v a p a u k s i a a n + p e r u s v a p a u k s i a m m e + p e r u s v a p a u k s i e m m e + p e r u s v a p a u k s i e n + p e r u s v a p a u k s i e n s a + p e r u s v a p a u k s i i m m e + p e r u s v a p a u k s i i n + p e r u s v a p a u k s i l l a + p e r u s v a p a u k s i l l e + p e r u s v a p a u k s i n + p e r u s v a p a u k s i s s a + p e r u s v a p a u k s i s t a + p e r u s v a p a u k s i s t a m m e + p e r u s v a p a u s + p e r u s v a p a u s t i l a n t e e n + p e r u s v a p a u t e e n + p e r u s v a p a u t e n a + p e r u s v a p a u t e n s a + p e r u s v a p a u t t a + p e r u s v a r a i n h o i t o p r o s e s s i e n + p e r u s v a r o v a i s u u s + p e r u s v a r o v a i s u u t t a + p e r u s v a r u s t e i t a + p e r u s v a s t a l a u s e e m m e + p e r u s v a s t a u s t a + p e r u s v a s t u u + p e r u s v a s t u u a l a a n n e + p e r u s v a s t u u s t a + p e r u s v a s t u u t + p e r u s v e l v o i t e + p e r u s v e l v o i t e t t a + p e r u s v e l v o i t t e i d e n + p e r u s v e l v o i t t e i s t a + p e r u s v e l v o i t t e i t a + p e r u s v e l v o l l i s u u d e t + p e r u s v e l v o l l i s u u k s i i n + p e r u s v e l v o l l i s u u k s i s t a + p e r u s v e l v o l l i s u u s + p e r u s v e l v o l l i s u u t e m m e + p e r u s v e l v o l l i s u u t e n a + p e r u s v e l v o l l i s u u t e n s a + p e r u s v e l v o l l i s u u t t a + p e r u s v e l v o l l i s u u t t a m m e + p e r u s v e r o j a + p e r u s v e r o n + p e r u s v i e s t i + p e r u s v i e s t i n + p e r u s v i e s t i n n e + p e r u s v i e s t i n ä + p e r u s v i e s t i ä + p e r u s v i i s a u s + p e r u s v i i t e a s i a k i r j a n a + p e r u s v i i t e k e h y k s e n ä + p e r u s v i k a + p e r u s v i l j e l y a l a a n + p e r u s v i l j e l y a l a n + p e r u s v i l j e l y k a s v e i h i n + p e r u s v i r e t t ä + p e r u s v i r h e + p e r u s v i r h e e n + p e r u s v i r h e e s e e n + p e r u s v i r h e e s t ä + p e r u s v i r h e i s t ä + p e r u s v o i m a n a + p e r u s v o i m a v a r a + p e r u s v u o d e n + p e r u s v u o d e s t a + p e r u s v u o r o v a i k u t u s + p e r u s v u o s i + p e r u s v ä i t e + p e r u s v ä l i n e + p e r u s v ä l i n e e m m e + p e r u s v ä l i n e e n ä + p e r u s v ä l i n e e s t ä + p e r u s v ä l i n e e t + p e r u s v ä l i n e i d e n + p e r u s v ä l i n e i n ä + p e r u s v ä l i n e i s t ä + p e r u s v ä l i n e i t ä + p e r u s v ä l i n e t t ä + p e r u s y d i n t ä + p e r u s y h t e i s y m m ä r r y s + p e r u s y k s i k k ö + p e r u s y k s i k k ö n ä + p e r u s y k s i k k ö ö n + p e r u s y k s i k ö k s i + p e r u s y k s i k ö n + p e r u s y k s i k ö t + p e r u s y l i j ä ä m ä n + p e r u s y m m ä r r y k s e n s ä + p e r u s y m p ä r i s t ö n o r m e j a a n + p e r u s y t i m e n + p e r u t a + p e r u t a a n + p e r u t t a v a + p e r u t t u a + p e r u u + p e r u u k k i k e r t t u + p e r u u k k i n ä r h i + p e r u u n t u e s s a + p e r u u n t u m i s e n + p e r u u n t u m i s l a u s e k e + p e r u u n t u m i s l a u s e k e t t a + p e r u u n t u m i s l a u s e k k e e l l e + p e r u u n t u m i s l a u s e k k e e n + p e r u u n t u m i s l a u s e k k e e s t a + p e r u u n t u m i s l a u s e k k e e t + p e r u u t a m m e + p e r u u t e t a a n + p e r u u t e t a a n k o + p e r u u t e t t a v a + p e r u u t e t t u a + p e r u u t e t u n + p e r u u t t a a + p e r u u t t a m a a n + p e r u u t t a m a t o n t a + p e r u u t t a m a t t a + p e r u u t t a m a t t o m a k s i + p e r u u t t a m a t t o m a l l a + p e r u u t t a m a t t o m a m p i a + p e r u u t t a m a t t o m a n + p e r u u t t a m a t t o m i a + p e r u u t t a m a t t o m i i n + p e r u u t t a m a t t o m u u d e n + p e r u u t t a m a t t o m u u s p e r i a a t e t t a + p e r u u t t a m a t t o m u u t t a + p e r u u t t a m i s a i k a n a + p e r u u t t a m i s a j a n + p e r u u t t a m i s e k s i + p e r u u t t a m i s e t + p e r u u t t a m i s l a u s e k e + p e r u u t t a m i s l o m a k e t t a + p e r u u t t a m i s m a h d o l l i s u u d e n + p e r u u t t a m i s m e n e t t e l y i s s ä + p e r u u t t a m i s m e n e t t e l y j ä + p e r u u t t a m i s o i k e u d e n + p e r u u t t a m i s o i k e u d e s s a + p e r u u t t a m i s o i k e u d e s t a + p e r u u t t a m i s o i k e u d e s t a a n + p e r u u t t a m i s o i k e u k s i a + p e r u u t t a m i s o i k e u s + p e r u u t t a m i s o i k e u t e e n + p e r u u t t a m i s o i k e u t e n s a + p e r u u t t a m i s o i k e u t t a + p e r u u t t a m i s t a + p e r u u t t a n e e t + p e r u u t u k s e n + p e r u u t u s a i k a + p e r u u t u s a i k a a + p e r u u t u s a j a s t a + p e r u u t u s a j a t + p e r u u t u s i l m o i t u s t a + p e r u u t u s k a u s i + p e r u u t u s l o g i i k a n + p e r u u t u s l o m a k k e e n + p e r u u t u s m a h d o l l i s u u s + p e r u u t u s m e n e t t e l y j e n + p e r u u t u s o i k e u d e s t a + p e r u u t u s o i k e u k s i a + p e r u u t u s o i k e u s + p e r u u t u s o i k e u s k i n + p e r u u t u s o i k e u t e e n + p e r u u t u s o i k e u t t a + p e r u u t u s p e r i a a t t e e s e e n + p e r u u t u s t a p a u k s i a + p e r u u t u s t a p a u k s i s s a + p e r u u t u s t e n + p e r u u t u s t u t k a + p e r ä a u k k o k a n a v a + p e r ä k a m a r i p o l i t i i k a l l a + p e r ä k k ä i s e l l ä + p e r ä k k ä i s e n + p e r ä k k ä i s e t + p e r ä k k ä i s h a k u + p e r ä k k ä i s i l l ä + p e r ä k k ä i s i ä + p e r ä k k ä i s t e n + p e r ä m e r i + p e r ä m i e s + p e r ä m o o t t o r i + p e r ä p y ö r ä + p e r ä p ä ä n k o e + p e r ä r i v i n + p e r ä t i l a + p e r ä t t ä i s e t + p e r ä t t ö m i l t ä + p e r ä t t ö m y y k s i s t ä + p e r ä t t ö m y y k s i ä + p e r ä y d y t ä ä n + p e r ä y t y i s i n + p e r ä y t y n e e t + p e r ä y t y n y t + p e r ä y t y y + p e r ä y t y ä + p e r ä ä n a n t a m a t t o m u u d e s s a a n + p e r ä ä n k u u l u t a n + p e r ä ä n k u u l u t t a e s s a a n + p e r ä ä n n y i m m e + p e r ä ä n n y m m e + p e r ä ä n t y m i s a s e n t e e n a + p e r ä ä n t y m i s e n + p e r ä ä n t y m i s t a i s t e l u a + p e r ä ä n t y m i s t a i s t e l u l t a + p e r ä ä n t y m i s t ä + p e r ä ä n t y m ä ä n + p e r ä ä n t y n e e n + p e r ä ä n t y n e e t + p e r ä ä n t y y + p e r ä ä n t y ä + p e s e m ä t t ö m i n + p e s e t a a + p e s i m i s a s t e + p e s i m i s p a i k k a + p e s i m i s p a i k o i l l e + p e s i m i s p a i k o i l l e e n + p e s i m ä p a i k k o j e n + p e s s i m i s m i i n + p e s s i m i s m i s t ä n i + p e s s i m i s m i ä + p e s s i m i s t e j ä + p e s s i m i s t i s e l t ä + p e s s i m i s t i s e m m ä t + p e s s i m i s t i s e m p i + p e s s i m i s t i s e m p i ä + p e s s i m i s t i s e n + p e s s i m i s t i s e s s ä + p e s s i m i s t i s e t + p e s s i m i s t i s i l t ä + p e s s i m i s t i s i m p i e n + p e s s i m i s t i s i s t ä + p e s s i m i s t i s i ä + p e s s i m i s t i s t ä + p e s t ä + p e s u a + p e s u a i n e + p e s u a i n e e s t a + p e s u a i n e i s s a + p e s u a i n e i s t a + p e s u a i n e i t a + p e s u a i n e t t a + p e s u k a r h u l a k k i + p e s u k o n e + p e s u k o n e e n + p e s u k o n e e s e e n + p e s u k o n e e s s a k i n + p e s u k o n e e t + p e s u k o n e i d e n + p e s u k o n e i s s a + p e s u k o n e i s t a + p e s u k o n e i t a + p e s u k o n e t t a + p e s u m e r k k i + p e s u s i e n i + p e s u t u p a + p e s u v e d e n + p e s u v e s i + p e s u v e t t ä + p e s ä e r o n + p e s ä j u u r i + p e s ä k k e i d e n + p e s ä k o i s a + p e s ä n h o i d o l l a + p e s ä p a i k a n + p e s ä p a i k k a + p e t e t t i i n + p e t e t y i k s i + p e t e t y i s s ä + p e t e t y i s t ä + p e t e t y k s i + p e t k u t e t a a n + p e t k u t t a a + p e t k u t u k s e e n + p e t k u t u s p r o p a g a n d a + p e t o a n k e r i a a t + p e t o e l ä i m i s t ä + p e t o k a l a + p e t o k a l o i s t a + p e t o k a l o j a + p e t o k a p i t a l i s m i n + p e t o k s e n t e k i j ö i t ä + p e t o k s e n t o r j u n t a a n + p e t o k s e n t o r j u n t a v i r a s t o + p e t o k s e n v a s t a i s i a + p e t o k s e s s a + p e t o k s e s t a + p e t o k s e t + p e t o k s i a + p e t o k s i e n + p e t o k s i i n + p e t o k s i k s i + p e t o k s i l l e + p e t o k s i l t a + p e t o k s i n e e n + p e t o k s i s s a + p e t o k s i s t a + p e t o l a j e j a + p e t o l i n n u t + p e t o l l i s e l l e + p e t o l l i s e l t a + p e t o l l i s e m p i a + p e t o l l i s e s t a + p e t o l l i s e t + p e t o l l i s i a + p e t o l l i s i m m i s t a + p e t o l l i s i m p i a + p e t o m i t t a r i + p e t o p o i k a + p e t o s a l t t i i d e n + p e t o s a l t t i i t a + p e t o s a s i a s s a + p e t o s a s i o i s s a + p e t o s e p ä i l y i l l e + p e t o s e p ä i l y i s s ä + p e t o s e p ä i l y i s t ä + p e t o s e p ä i l y j e n + p e t o s e p ä i l y j ä + p e t o s e p ä i l y s t e n + p e t o s e p ä i l y t + p e t o s e p ä i l y t a p a u k s i a + p e t o s i l m i ö n + p e t o s j u t u t + p e t o s l a i n s ä ä d ä n n ö n + p e t o s m a h d o l l i s u u k s i a + p e t o s m e k a n i s m i + p e t o s m e k a n i s m i i n + p e t o s m i e t i n n ö n + p e t o s m u o t o i h i n + p e t o s m u o t o j a + p e t o s m ä ä r i ä + p e t o s o n g e l m a a + p e t o s p o t e n t i a a l i + p e t o s r a p o r t t i + p e t o s r i k o k s e t + p e t o s r i s k e i s t ä + p e t o s r i s k i + p e t o s r i s k i l t ä + p e t o s r i s k i n + p e t o s r i s k i t + p e t o s r i s k i ä + p e t o s s k a n d a a l i h a n + p e t o s s y y t t e e n + p e t o s s y y t t e i d e n + p e t o s s y y t t e i t ä + p e t o s s y y t ö k s e t + p e t o s s y y t ö k s i ä + p e t o s s y y t ö s t e n + p e t o s t a + p e t o s t a p a u k s e s t a + p e t o s t a p a u k s e t + p e t o s t a p a u k s i a + p e t o s t a p a u k s i e n + p e t o s t a p a u k s i s s a + p e t o s t a p a u k s i s t a + p e t o s t a p a u s + p e t o s t a p a u s t a + p e t o s t a p a u s t e n + p e t o s t e k n i i k o i h i n + p e t o s t e n + p e t o s t e n t o r j u n n a l l a + p e t o s t e n t o r j u n n a l l e + p e t o s t e n t o r j u n n a n + p e t o s t e n t o r j u n n a s s a + p e t o s t e n t o r j u n n a s t a + p e t o s t e n t o r j u n t a + p e t o s t e n t o r j u n t a a + p e t o s t e n t o r j u n t a a n + p e t o s t e n t o r j u n t a e l i m e k s i + p e t o s t e n t o r j u n t a e l i m e n + p e t o s t e n t o r j u n t a j ä r j e s t e l m ä + p e t o s t e n t o r j u n t a j ä r j e s t e l m ä n + p e t o s t e n t o r j u n t a k o m i t e a a + p e t o s t e n t o r j u n t a l a i n s ä ä d ä n n ö n + p e t o s t e n t o r j u n t a o h j e l m i i n + p e t o s t e n t o r j u n t a p a l v e l u n + p e t o s t e n t o r j u n t a p o l i t i i k a s t a + p e t o s t e n t o r j u n t a p o l i t i i k k a a n + p e t o s t e n t o r j u n t a p o l i t i i k k a m m e + p e t o s t e n t o r j u n t a p o l i t i i k k o j e n + p e t o s t e n t o r j u n t a t o i m e t + p e t o s t e n t o r j u n t a t o i m i a + p e t o s t e n t o r j u n t a t o i m i e n + p e t o s t e n t o r j u n t a t o i m i n t a a n + p e t o s t e n t o r j u n t a t o i m i s s a + p e t o s t e n t o r j u n t a t o i m i s t o s t a + p e t o s t e n t o r j u n t a t u t k i m u k s i a + p e t o s t e n t o r j u n t a t y ö h ö n + p e t o s t e n t o r j u n t a v a l i o k u n t a + p e t o s t e n t o r j u n t a v i r a n o m a i n e n + p e t o s t e n t o r j u n t a v i r a n o m a i s e n + p e t o s t e n t o r j u n t a v i r a s t o + p e t o s t e n t o r j u n t a v i r a s t o a + p e t o s t e n t o r j u n t a v i r a s t o l l a + p e t o s t e n t o r j u n t a v i r a s t o l l e + p e t o s t e n t o r j u n t a v i r a s t o n + p e t o s t e n t o r j u n t a v i r a s t o o n + p e t o s t e n t o r j u n t a v i r a s t o s t a + p e t o s t e n t o r j u n t a v ä l i n e + p e t o s t e n t o r j u n t a v ä l i n e i t ä + p e t o s t e n t o r j u n t a y h t e i s t y ö s t ä + p e t o s t e n t o r j u n t a y k s i k k ö + p e t o s t e n t o r j u n t a y k s i k k ö m m e + p e t o s t e n t o r j u n t a y k s i k k ö ä + p e t o s t e n t o r j u n t a y k s i k k ö ö n + p e t o s t e n t o r j u n t a y k s i k ö n + p e t o s t e n v a s t a i n e n + p e t o s t e n v a s t a i s e t + p e t o s t e n v a s t a i s i a + p e t o s t e n v a s t u s t a m i s l a i n s ä ä d ä n n ö n + p e t o s t i e t o j a + p e t o s t u t k i m u k s i a + p e t o s t u t k i n n a n + p e t o s t u t k i n t a + p e t o s t y y p p e j ä + p e t o s t y y p p i + p e t o s u n i o n i n + p e t o s v a l k o s i p u l i n + p e t o s v a l v o n n a n + p e t o s v ä i t t e e t + p e t o s v ä i t t e i s i i n + p e t o s y r i t y k s i s t ä + p e t o s y r i t y s t ä + p e t o v e s i k i r p p u + p e t r o k e m i a n t e o l l i s u u d e l l e + p e t t y m i n e n + p e t t y m y k s e e n + p e t t y m y k s e k s e n i + p e t t y m y k s e n + p e t t y m y k s e n i + p e t t y m y k s e n t u n n e + p e t t y m y k s e n ä + p e t t y m y k s e t + p e t t y m y k s i i n + p e t t y m y k s i ä + p e t t y m y s t ä + p e t t y m y s t ä n i + p e t t y n e e m p i + p e t t y n e e n i + p e t t y n e e n s ä + p e t t y n e i m p i ä + p e t t y n e i t ä + p e t t y v ä t + p e t t ä m i s e e n + p e t t ä n e e t + p e t t ä ä + p e t y i m m e + p e u k a l o i s t a p a k u l o + p e u k a l o p a i n i + p e u k a l o t + p e u k k u a + p e u k k u j a + p e u k k u j e n + p e u r a h i i r i + p e u r a j ä r v i + p e u r a n k e l l o + p e u r a v u o n o + p e u r a v ä l i k o h t a u k s e n + p i a n k i n + p i a n o k o n s e r t t o + p i a n o k v a r t e t t o + p i a n o l a n k a + p i a n o m i e s + p i a n o n o p e t t a j a + p i a n o p a r t i t u u r i + p i a n o s o n a a t t i + p i d e m m i l l ä + p i d e m m i n + p i d e m m i t t ä + p i d e m m ä k s i + p i d e m m ä l l e k i n + p i d e m m ä n + p i d e m p i + p i d e m p i a i k a i s e e n + p i d e m p i a i k a i s e s t a + p i d e m p ä ä + p i d e m p ä ä n k i n + p i d e n n e t ä ä n + p i d e n n y s k a u s i a + p i d e n n y s o s a a + p i d e n n y s t ä + p i d e n t y m i s e n + p i d e n t y m i s e s t ä + p i d e n t y n y t t ä + p i d e n t ä m i s e e n + p i d e n t ä m i s e n + p i d e n t ä m i s e s t ä + p i d e n t ä m i s m a h d o l l i s u u s + p i d e n t ä m i s m a h d o l l i s u u t e e n + p i d e n t ä m i s t ä + p i d e n t ä m ä l l ä + p i d e n t ä ä + p i d e n t ä ä k s e e n + p i d e t t i i n + p i d e t t i i n k i n + p i d e t t i i n p ä + p i d e t t y j e n + p i d e t t y ä + p i d e t t ä i s i i n + p i d e t t ä v i e n + p i d e t t ä v i ä + p i d e t t ä v ä k s i + p i d e t t ä v ä n + p i d e t t ä v ä s s ä + p i d e t t ä v ä ä + p i d e t t ä v ä ä n + p i d e t y n + p i d e t y s s ä + p i d e t y s t ä + p i d e t y t + p i d e t ä + p i d e t ä ä n + p i d e t ä ä n k i n + p i d e t ä ä n k ö + p i d e t ä ä n p ä + p i d g i n e n g l a n t i + p i d g i n i i r i ä + p i d i m m e + p i d i m m e p ä + p i d i t t e p ä + p i d ä k i n + p i d ä k k e i t ä + p i d ä m m e + p i d ä m m e k i n + p i d ä m m e k ö + p i d ä n + p i d ä n k i n + p i d ä t e l l e e t + p i d ä t e l l e n + p i d ä t e l l y t + p i d ä t e l t y ä ä n + p i d ä t e t t i i n + p i d ä t e t t y i n ä + p i d ä t e t t y j e n + p i d ä t e t t y j ä + p i d ä t e t t y n ä + p i d ä t e t t y ä + p i d ä t e t t ä e s s ä + p i d ä t e t y t + p i d ä t e t ä ä n + p i d ä t t e + p i d ä t t e k ö + p i d ä t t e l e m ä l l ä + p i d ä t t e l e m ä ä n + p i d ä t t i + p i d ä t t y v y y s s ä ä n n ö n + p i d ä t t y v y y s s ä ä n t ö + p i d ä t t y v y y s s ä ä n t ö ä + p i d ä t t y v y y s v e t o o m u k s i i n + p i d ä t t y v ä i s e m m i n + p i d ä t t y v ä i s e m p i + p i d ä t t y v ä i s i ä + p i d ä t t y v ä i s y y t t ä + p i d ä t t y ä + p i d ä t t ä e n + p i d ä t t ä i s i + p i d ä t t ä m i n e n + p i d ä t t ä m i s a l u e i t a + p i d ä t t ä m i s e e n + p i d ä t t ä m i s e k s i + p i d ä t t ä m i s e n + p i d ä t t ä m i s e s t ä + p i d ä t t ä m i s t ä + p i d ä t t ä m ä l l ä + p i d ä t t ä m ä s t ä + p i d ä t t ä m ä ä n + p i d ä t t ä n y t + p i d ä t t ä y d y i m m e + p i d ä t t ä y d y m m e + p i d ä t t ä y d y n + p i d ä t t ä y d y t t y + p i d ä t t ä y t y m i s t ä + p i d ä t t ä y t y m ä ä n + p i d ä t t ä y t y v ä t + p i d ä t t ä y t y y + p i d ä t t ä y t y ä + p i d ä t t ä ä + p i d ä t y k s e n + p i d ä t y k s e s t ä + p i d ä t y k s e s t ä ä n + p i d ä t y k s e t + p i d ä t y k s i e n + p i d ä t y k s i i n + p i d ä t y k s i l l ä + p i d ä t y k s i s t ä + p i d ä t y k s i ä + p i d ä t y s a a l l o n + p i d ä t y s a a l l o t + p i d ä t y s a a l t o + p i d ä t y s a a l t o a + p i d ä t y s a a l t o j a + p i d ä t y s a j a n + p i d ä t y s a j a t + p i d ä t y s a j o i s t a + p i d ä t y s a l t a i t a + p i d ä t y s a s i o i d e n + p i d ä t y s a s i o i s t a + p i d ä t y s h e t k e s t ä ä n + p i d ä t y s k e s k u k s e n + p i d ä t y s k e s k u k s e s s a + p i d ä t y s k e s k u k s e s t a + p i d ä t y s k e s k u k s e t + p i d ä t y s k e s k u k s i a + p i d ä t y s k e s k u k s i i n + p i d ä t y s k e s k u k s i s s a + p i d ä t y s k e s k u k s i s t a + p i d ä t y s k e s k u s + p i d ä t y s k e s k u s t a + p i d ä t y s k e s k u s t e n + p i d ä t y s k y v y n + p i d ä t y s l e i r i l l ä + p i d ä t y s m ä ä r ä y k s e e n + p i d ä t y s m ä ä r ä y k s e k s i + p i d ä t y s m ä ä r ä y k s e l l e + p i d ä t y s m ä ä r ä y k s e l l ä + p i d ä t y s m ä ä r ä y k s e n + p i d ä t y s m ä ä r ä y k s e s s ä + p i d ä t y s m ä ä r ä y k s e s t ä + p i d ä t y s m ä ä r ä y k s e t + p i d ä t y s m ä ä r ä y k s i l l ä + p i d ä t y s m ä ä r ä y k s i l t ä + p i d ä t y s m ä ä r ä y k s i ä + p i d ä t y s m ä ä r ä y s + p i d ä t y s m ä ä r ä y s j ä r j e s t e l m ä + p i d ä t y s m ä ä r ä y s j ä r j e s t e l m ä n + p i d ä t y s m ä ä r ä y s j ä r j e s t e l m ä s t ä + p i d ä t y s m ä ä r ä y s j ä r j e s t e l m ä ä + p i d ä t y s m ä ä r ä y s p r o s e s s i n + p i d ä t y s m ä ä r ä y s t e n + p i d ä t y s m ä ä r ä y s t ä + p i d ä t y s o i k e u d e n + p i d ä t y s p o l i t i i k a s s a a n + p i d ä t y s p r o s e n t i n + p i d ä t y s t o i m e n p i t e e t + p i e k a n a n p a a s i s a m m a l + p i e l e e n + p i e n a l u s t a + p i e n a s e e t + p i e n a s e i d e n + p i e n a s e i l l a + p i e n a s e i s t a + p i e n a s e i t a + p i e n a s e k y s y m y s t ä + p i e n a s e t t a + p i e n a s i a k k a i l l e + p i e n a u t o j a + p i e n b u d j e t t e j a + p i e n e h k ö j ä + p i e n e h k ö t + p i e n e k s i + p i e n e l i ö i d e n + p i e n e l l e + p i e n e l l ä + p i e n e l l ä k i n + p i e n e l ä i m e s t ä + p i e n e l ä i m i i n + p i e n e l ä i m i s t ä + p i e n e m m i k s i + p i e n e m m i l l e + p i e n e m m i l l ä + p i e n e m m i n + p i e n e m m i s s ä + p i e n e m m i s s ä k i n + p i e n e m m i s t ä + p i e n e m m ä k s i + p i e n e m m ä n + p i e n e m m ä t + p i e n e m m ä t k i n + p i e n e m p i + p i e n e m p i e n + p i e n e m p i ä + p i e n e m p ä ä + p i e n e n + p i e n e n e e + p i e n e n e m i s e e n + p i e n e n e m ä s s ä + p i e n e n e v ä t + p i e n e n k i n + p i e n e n n e t t ä i s i i n + p i e n e n n e t ä ä n + p i e n e n t y n e e t + p i e n e n t ä m i s e e n + p i e n e n t ä m i s e k s i + p i e n e n t ä m i s e s t ä + p i e n e n t ä m i s s u u n n i t e l m i a + p i e n e n t ä m i s t o i m e n p i d e + p i e n e n t ä m i s t ä + p i e n e n t ä m ä t t ä + p i e n e n t ä m ä ä n + p i e n e n t ä v ä t + p i e n e n t ä ä + p i e n e n t ä ä k s e e n + p i e n e n t ä ä k s e m m e + p i e n e n ä + p i e n e s s ä + p i e n e s s ä k i n + p i e n e s t ä + p i e n e t + p i e n e t k i n + p i e n h a n k k e e t + p i e n h a n k k e i d e n + p i e n h a n k k e i t a + p i e n h i u k k a s a i n e i t a + p i e n h i u k k a s i a + p i e n h i u k k a s i i n + p i e n h i u k k a s i l t a + p i e n h i u k k a s i s t a + p i e n h i u k k a s t e n + p i e n i a n n o k s i n e n + p i e n i i n + p i e n i k i n + p i e n i k o k o i s e n + p i e n i k o k o i s e t + p i e n i k o k o i s i a + p i e n i k s i + p i e n i l l e + p i e n i l l e k ä ä n + p i e n i l l ä + p i e n i l l ä k i n + p i e n i l t ä + p i e n i m m i l l e k i n + p i e n i m m ä n + p i e n i m m ä n k i n + p i e n i m m ä s s ä k ä ä n + p i e n i m m ä s t ä k i n + p i e n i m m ä t + p i e n i m m ä t k i n + p i e n i m p i i n k i n + p i e n i m p i ä k ä ä n + p i e n i m u o t o i n e n + p i e n i m u o t o i s e e n + p i e n i m u o t o i s e l l a + p i e n i m u o t o i s e l l e + p i e n i m u o t o i s e m p a a + p i e n i m u o t o i s e m p i a + p i e n i m u o t o i s e n + p i e n i m u o t o i s e s s a + p i e n i m u o t o i s e s t a + p i e n i m u o t o i s e t + p i e n i m u o t o i s i a + p i e n i m u o t o i s i i n + p i e n i m u o t o i s i l l a + p i e n i m u o t o i s i l l e + p i e n i m u o t o i s i n + p i e n i m u o t o i s i s t a + p i e n i m u o t o i s t a + p i e n i m u o t o i s t e n + p i e n i n + p i e n i n k i n + p i e n i n k ä ä n + p i e n i n t ä + p i e n i n t ä k i n + p i e n i n t ä k ä ä n + p i e n i n ä k i n + p i e n i p a l k k a i s e t + p i e n i p a l k k a i s i a + p i e n i p a l k k a i s i l t a + p i e n i p a l k k a i s i m m a n + p i e n i p a l k k a i s i m p i a + p i e n i p a l k k a i s i s s a + p i e n i p a l k k a i s t e n + p i e n i p a l k k a i s u u s + p i e n i s i l m ä i s i ä + p i e n i s s ä + p i e n i s s ä k i n + p i e n i s t ä + p i e n i t e h o i s i a + p i e n i t u l o i s e m p i a + p i e n i t u l o i s e n + p i e n i t u l o i s e t + p i e n i t u l o i s i a + p i e n i t u l o i s i i n + p i e n i t u l o i s i l l e + p i e n i t u l o i s i m m a t + p i e n i t u l o i s i m m i l l e + p i e n i t u l o i s i m p i a + p i e n i t u l o i s i m p i i n + p i e n i t u l o i s i s s a + p i e n i t u l o i s t e n + p i e n i ä + p i e n i ä k i n + p i e n j ä n n i t e d i r e k t i i v i s t ä + p i e n j ä n n i t e j o h t o j a + p i e n j ä n n i t e l a i t t e i s i i n + p i e n j ä n n i t e l a i t t e i s s a + p i e n j ä n n i t e t t ä + p i e n k a l a s t a j a t + p i e n k a l a s t a j i e n + p i e n k a l a s t u k s e n + p i e n k a l a s t u k s e n s a + p i e n k a l a s t u s + p i e n k a l a s t u s t a + p i e n k a p i t a l i s m i a + p i e n k a r j a n k a s v a t t a j i a + p i e n k a u p a t + p i e n k a u p p i a a t + p i e n k a u p p i a i d e n + p i e n k a u p p i a i l l e + p i e n k a u p p i a i t a + p i e n k a u p p o j e n + p i e n k o n e + p i e n k o n e e t + p i e n k o n e i d e n + p i e n k o n e i l l a + p i e n k o n e i t a + p i e n k o n e k e n t t i e n + p i e n k u l u t t a j a t k i n + p i e n k u o r m a i n + p i e n k u s t a n t a m o i l l a + p i e n k u s t a n t a m o i l l e + p i e n k u s t a n t a m o j e n + p i e n k ä y t t ä j i i n + p i e n l a i n a + p i e n l a i n a a + p i e n l a i n a j ä r j e s t e l y j ä + p i e n l a i n o i s t a + p i e n l a i n o j a + p i e n l a i n o j e n + p i e n l a i t t e i d e n + p i e n l i i k k e i d e n + p i e n l i i k k e i l l ä + p i e n l o i s t e l a m p p u j a + p i e n l o i s t e l a m p u i l l e + p i e n l u o t t o j a + p i e n l u o t t o j ä r j e s t e l m i e n + p i e n l u o t t o l a i t o k s i a + p i e n m a a n v i l j e l i j ä ä + p i e n m u o t o i s t a + p i e n n a r p u k i n p a r t a + p i e n o i s j ä n n i t e + p i e n o i s k o o s s a + p i e n o i s m a l l i + p i e n o i s m a l l i j u n i a + p i e n o i s m a l l i m u s e o + p i e n o i s m a l l i r a k e t t i + p i e n o i s p e r u s t u s l a k i + p i e n o i s r a u t a t i e + p i e n o i s r a u t a t i e k e r h o i s t a + p i e n o i s r a u t a t i e n + p i e n o i s s k a n d a a l e i h i n + p i e n o i s s u k e l l u s v e n e + p i e n o i s t a l o u s a r v i o n + p i e n o i s t a l o u s a r v i o t a + p i e n o i s v a k u u t u k s e n + p i e n o i s y d i n a s e i t a + p i e n o s a k a s t a + p i e n o s a k k a i d e n + p i e n o s a k k a i l l e + p i e n p a i n e n a t r i u m l a m p p u + p i e n p a l k k a + p i e n p e r h e i d e n + p i e n r a h o i t u s + p i e n r i k o l l i s t e n + p i e n r i k o l l i s u u s + p i e n r y h m i s s ä + p i e n s a t a m i l l a + p i e n s a t e l l i i t t e i h i n + p i e n s i j o i t t a j a + p i e n s i j o i t t a j a t + p i e n s i j o i t t a j i a + p i e n s i j o i t t a j i e n + p i e n s i j o i t t a j i i n + p i e n s i j o i t t a j i l l a + p i e n s i j o i t t a j i l l e + p i e n s ä ä s t ä j i e n + p i e n s ä ä s t ä j i i n + p i e n s ä ä s t ä j i l l e + p i e n s ä ä s t ä j i ä + p i e n s ä ä s t ä j ä t + p i e n t a a j u u s p u h e l i n v i e s t i t y s t ä + p i e n t a l l e t t a j i a + p i e n t e k n o l o g i a a + p i e n t e n + p i e n t e n k i n + p i e n t e o l l i s u u d e n + p i e n t e u r a s t a m o i t a + p i e n t i l a l l i s i a + p i e n t i l a l l i s t e n + p i e n t i l a m m e + p i e n t i l a t + p i e n t i l a t u o t a n t o a + p i e n t i l o i h i n + p i e n t i l o i l l a + p i e n t i l o i l l e + p i e n t i l o i l t a + p i e n t i l o i s t a + p i e n t i l o j a + p i e n t i l o j e n + p i e n t u o t a n n o s s a + p i e n t u o t a n t o a + p i e n t u o t t a j a j ä r j e s t e l m ä s s ä + p i e n t u o t t a j a s t a + p i e n t u o t t a j a t + p i e n t u o t t a j i a + p i e n t u o t t a j i e n + p i e n t u o t t a j i i n + p i e n t u o t t a j i l l e + p i e n t u o t t a j i s t a + p i e n t u u l i v o i m a l a + p i e n t ä + p i e n u u d e s t a + p i e n v a l m i s t a j i a + p i e n v a r a s t o + p i e n v e n e i t ä + p i e n v i l j e l i j ä + p i e n v i l j e l i j ä m m e + p i e n v i l j e l i j ä n + p i e n v i l j e l i j ä t + p i e n v i l j e l i j ä ä + p i e n v i l j e l i j ä ä n + p i e n v i l j e l i j ö i d e n + p i e n v i l j e l i j ö i h i n + p i e n v i l j e l i j ö i l l e + p i e n v i l j e l i j ö i l t ä + p i e n v i l j e l i j ö i s t ä + p i e n v i l j e l i j ö i s t ä ä n + p i e n v i l j e l i j ö i t ä + p i e n v i l j e l y + p i e n v i l j e l y m m e + p i e n v i l j e l y n + p i e n v i l j e l y y n + p i e n v i l j e l y ä + p i e n y k s i k k ö j e n + p i e n y r i t t ä j i e n + p i e n y r i t t ä j i e n k i n + p i e n y r i t t ä j i i n + p i e n y r i t t ä j i l l e + p i e n y r i t t ä j i l l ä + p i e n y r i t t ä j i s t ä + p i e n y r i t t ä j i ä + p i e n y r i t t ä j y y d e n + p i e n y r i t t ä j ä + p i e n y r i t t ä j ä n + p i e n y r i t t ä j ä t + p i e n y r i t t ä j ä ä + p i e n y r i t t ä j ä ä n + p i e n y r i t t ä m i s e n + p i e n y r i t y k s e e n + p i e n y r i t y k s e k s i + p i e n y r i t y k s e l l ä + p i e n y r i t y k s e m m e + p i e n y r i t y k s e n + p i e n y r i t y k s e n s ä + p i e n y r i t y k s e n ä + p i e n y r i t y k s e s t ä + p i e n y r i t y k s e t + p i e n y r i t y k s i i n + p i e n y r i t y k s i k s i + p i e n y r i t y k s i l l e + p i e n y r i t y k s i l l e k i n + p i e n y r i t y k s i l l ä + p i e n y r i t y k s i l t ä + p i e n y r i t y k s i s s ä + p i e n y r i t y k s i s t ä + p i e n y r i t y k s i ä + p i e n y r i t y k s i ä m m e + p i e n y r i t y k s i ä ä n + p i e n y r i t y s + p i e n y r i t y s a l a a + p i e n y r i t y s k e s k i t t y m i ä + p i e n y r i t y s l a i s t a + p i e n y r i t y s l a k i + p i e n y r i t y s l a k i a + p i e n y r i t y s m u o t o j e n + p i e n y r i t y s p o l i t i i k k a a n + p i e n y r i t y s r a k e n n e + p i e n y r i t y s s e k t o r i l l a + p i e n y r i t y s s e k t o r i l l e + p i e n y r i t y s s e k t o r i m m e + p i e n y r i t y s s e k t o r i n + p i e n y r i t y s t e n + p i e n y r i t y s t e n k i n + p i e n y r i t y s t o i m i n n a n + p i e n y r i t y s t o i m i n t a + p i e n y r i t y s t o i m i n t a a + p i e n y r i t y s t o i m i n t a a n + p i e n y r i t y s t ä + p i e n y r i t y s v a l t a i n e n + p i e r r e + p i e r u t y y n y + p i h a j a s m i k e + p i h a k a t u + p i h a m e s i k k o + p i h a m i t t a r i + p i h a r a t a m o + p i h a s a u n i o + p i h a s y r e e n i + p i h a t a t a r + p i h a t y r a n n i + p i h a t ä h t i m ö + p i h k a k ä ä r i ä i n e n + p i h k a t i k k a + p i h l a j a k e h r ä ä j ä + p i h l a j a n m a r j a k o i + p i h l a j a n o r s u + p i h l a j a p e r h o n e n + p i h t i j o k i k o r e n t o + p i h t i p y r s t ö k e h r ä ä j ä + p i h t i p y r s t ö k o l i b r i + p i h t i v i r t a m i t t a r i + p i h v e i k s i + p i h v i l i h a m a r k k i n a t + p i h v i p a r o n i t + p i h v i s o t a + p i i a n k i e l i + p i i a u r i n k o k e n n o i l l a + p i i d i o k s i d i + p i i d i o k s i d i l l e + p i i h a p p o + p i i k a r b i d i + p i i k e n n o i h i n + p i i k i d e t t ä + p i i k i t y s h u o n e i d e n + p i i k i t y s p a i k k o j a + p i i k i t y s p a i k o i s t a + p i i k k i a r a l i a + p i i k k i h a i l l e + p i i k k i h a i n + p i i k k i h e r n e + p i i k k i h ä r k y l ä + p i i k k i k a m p e l o i d e n + p i i k k i k a u n o k k i + p i i k k i k r u u n u + p i i k k i l a n g a l l a + p i i k k i l a n g a n + p i i k k i l a n g a t + p i i k k i l a n g o i n + p i i k k i l a n k a + p i i k k i l a n k a a + p i i k k i l a n k a e s t e i d e n + p i i k k i l a n k a e s t e i t ä + p i i k k i l a n k o j e n + p i i k k i m a k r i l l i + p i i k k i m a k r i l l i a + p i i k k i m a k r i l l i e n + p i i k k i m a k r i l l i i n + p i i k k i m a k r i l l i k a l a s t u s t a + p i i k k i m a k r i l l i k a n n a n + p i i k k i m a k r i l l i k a n n a s t a + p i i k k i m a k r i l l i k a n t a + p i i k k i m a k r i l l i k a n t a a + p i i k k i m a k r i l l i k a n t o j e n + p i i k k i m a k r i l l i n + p i i k k i m a k r i l l i s t a + p i i k k i m a t t o + p i i k k i m o n n i + p i i k k i o h d a k e + p i i k k i p i r u + p i i k k i p y r s t ö k i i t ä j ä + p i i k k i p y r s t ö t + p i i k k i s a l a a t t i + p i i k k i s a p p i r u o h o + p i i k k i s i a t + p i i k k i s i k a + p i i k k i s i l m ä + p i i k k i s i m p p u + p i i k k i s m a r a g d i k o l i b r i + p i i k k i t u h k e l o + p i i l a a k s o + p i i l a a k s o n + p i i l e e + p i i l e s k e l e e + p i i l e v i e n + p i i l e v i i n + p i i l e v i l t ä + p i i l e v i ä + p i i l e v ä t + p i i l e v ä t k i n + p i i l e v ä ä + p i i l e v ä ä n + p i i l o a s e m a o n g e l m a + p i i l o e t u j a + p i i l o h e i k k e n e m i s t ä + p i i l o h i n n o i t t e l u a + p i i l o h i n n o i t t e l u s t a + p i i l o i n f l a a t i o t a + p i i l o k a m e r a + p i i l o k a m e r a a + p i i l o k a m e r o i l l a + p i i l o k a m e r o i t a + p i i l o k a m p a n j a a + p i i l o k a r t e l l i + p i i l o k e i n o + p i i l o k r i t e e r i + p i i l o k u l u j a + p i i l o k u s t a n n u k s e t + p i i l o k u s t a n n u k s i a + p i i l o k u s t a n n u k s i l l a + p i i l o k y s y m y s t e n + p i i l o k y t t ä + p i i l o k ö y h y y s + p i i l o l a i n s ä ä d ä n n ö l t ä + p i i l o l e i k i n + p i i l o l e i k i s t ä + p i i l o l e i k k i + p i i l o l i n s s e j ä + p i i l o l i n s s i + p i i l o l i n s s i e n + p i i l o l i n s s i n e s t e i d e n + p i i l o l u o t t o a + p i i l o m a i n i n n a n + p i i l o m a i n o n n a k s i + p i i l o m a i n o n n a l l e + p i i l o m a i n o n n a l t a + p i i l o m a i n o n n a n + p i i l o m a i n o n t a + p i i l o m a i n o n t a a + p i i l o m a i n o n t a a n + p i i l o m a i n o s t a + p i i l o m a k s u i s t a + p i i l o m a k s u j e n + p i i l o m e r k i t y s + p i i l o m o n o p o l e j a + p i i l o o n + p i i l o p a i k k a a + p i i l o p a i k k o j a + p i i l o p a k k o l u n a s t u s t a + p i i l o p r o t e k t i o n i s m i a + p i i l o p r o t e k t i o n i s m i n a + p i i l o r a i t a + p i i l o r i k o k s i a + p i i l o s a m m a l + p i i l o s a n a + p i i l o s s a + p i i l o s t a + p i i l o s y r j i n n ä s t ä + p i i l o s y r j i n t ä + p i i l o s y r j i n t ä ä n + p i i l o t a l o u s a r v i o i t a + p i i l o t a v o i t e + p i i l o t a v o i t e t t a + p i i l o t e l l a + p i i l o t e t a + p i i l o t e t a a n + p i i l o t e t t u n a + p i i l o t t a a + p i i l o t t a m a t t a + p i i l o t t a m i s e e n + p i i l o t u e s t a + p i i l o t u i s t a + p i i l o t u k e a + p i i l o t u k i + p i i l o t u k i a + p i i l o t y ö n + p i i l o t y ö t t ö m y y d e s t ä + p i i l o t y ö t t ö m y y t t ä + p i i l o u d u t t a v a + p i i l o u t u a + p i i l o u t u i v a t + p i i l o u t u m a s s a + p i i l o u t u m a t t a + p i i l o u t u n u t + p i i l o u t u u + p i i l o u t u v a t + p i i l o v a r a u s + p i i l o v e l k a a n t u m i s e e n + p i i l o v e l k o j e n + p i i l o v e r o i k s i + p i i l o v e r o j a + p i i l o v e r o t u k s e l t a + p i i l o v e r o t u s t a + p i i l o v i e s t i + p i i l o v i e s t i n + p i i l o v i i s u m i n a + p i i l o v ä l i n e + p i i l u k k o + p i i m a a + p i i n a a v a t + p i i n a l l i s e m p i + p i i n t y n e i m p i i n + p i i p p o l i m a k o t i l o + p i i p p u k i i t ä j ä + p i i p p u k ö y n n ö s + p i i p p u r u o h o + p i i p p u t u p a k k a a + p i i p u n r a s s i + p i i r e i s s ä + p i i r i k a a v i o + p i i r i k u n n a n + p i i r i k u n n a t + p i i r i k u n n i s t a + p i i r i k u n t a n e u v o s t o i s s a + p i i r i k u n t a v a a l i t + p i i r i k u n t a v a l t u u t e t t u a + p i i r i k y t k e n t ä + p i i r i l a i t + p i i r i l e v y + p i i r i l e v y j e n + p i i r i n + p i i r i n e u v o s t o n + p i i r i o i k e u s + p i i r i s a r j o i s t a + p i i r i t e t t y i n ä + p i i r i t e t t y n ä + p i i r i t t i v ä t + p i i r i t t ä ä + p i i r i t u o m i o i s t u i n + p i i r i t y s k o n e + p i i r i t y s m e n t a l i t e e t t i a + p i i r i t y s t i l a n n e + p i i r i t y s t i l a n t e e s e e n + p i i r i t y s t o r n i + p i i r r e a v a r u u s + p i i r r o s a n i m a a t i o + p i i r r o s s a r j a + p i i r t e e n s ä + p i i r t e e t + p i i r t e i l l e + p i i r t e i l t ä ä n + p i i r t e i n + p i i r t e i s i i n + p i i r t e i t ä + p i i r t o h e i t i n + p i i r t o l e v y i s s ä + p i i r t o l e v y t + p i i r t o y ö k k ö n e n + p i i r u s t u s l a u d a l l a + p i i r u s t u s l a u t a + p i i r u s t u s l a u t a n s a + p i i r u s t u s p ö y t ä n n e + p i i s a m e i s t a + p i i s i d o s + p i i s k a h ä n t ä v a l l a b i + p i i s k a k o t i n g a + p i i s k a k ä ä r m e + p i i s k a t i m a l i + p i i s k u l u m i v a r p u n e n + p i i s p a i n k o k o u k s e n + p i i s p a i n k o k o u k s i a + p i i s p a i n k o k o u k s i s s a + p i i s p a i n k o k o u s + p i i s p a k o l i b r i + p i i s p a n h i i p p a + p i i s p a t + p i i s p a t a n g a r a + p i i t a h n a + p i i t a t a + p i i t e k n i i k k a a + p i i t e t r a f l u o r i d i + p i i t e t r a k l o r i d i + p i i t t a a m a t o n t a + p i i t t a a m a t t a + p i i t t a a m a t t o m i a + p i k a h ä l y t y s j ä r j e s t e l m ä + p i k a h ä l y t y s j ä r j e s t e l m ä n + p i k a h ä l y t y s j ä r j e s t e l m ä s s ä + p i k a h ä l y t y s j ä r j e s t e l m ä s t ä + p i k a h ä l y t y s j ä r j e s t e l m ä ä + p i k a h ä l y t y s j ä r j e s t e l m ä ä n + p i k a i s e e n + p i k a i s e l l e + p i k a i s e m m i n + p i k a i s e n + p i k a i s e s t a + p i k a i s i a + p i k a i s i i n + p i k a i s t a + p i k a j u n a + p i k a j u n a l l e + p i k a j u n a n + p i k a j u n a s s a + p i k a j u n i a + p i k a j u n i l l a + p i k a k a h v i a + p i k a k a h v i n + p i k a k a m e r a + p i k a k i v ä ä r i + p i k a k o k o u k s e m m e + p i k a k o r j a u k s e n + p i k a k o r j a u k s e t + p i k a k o r j a u k s i i n + p i k a k o r j a u s k e i n o + p i k a k o r j a u s t e n + p i k a k u l j e t u k s e t + p i k a k u l j e t u s p a l v e l u j a + p i k a k ä s i t t e l y ä + p i k a k ä y n n i s t y s h a n k k e i d e n + p i k a k ä y n n i s t y s l u e t t e l o a + p i k a k ä y n n i s t y s o h j e l m a + p i k a k ä y n n i s t y s o h j e l m a a + p i k a k ä y n n i s t y s o h j e l m a a n + p i k a k ä y n n i s t y s o h j e l m a s t a + p i k a k ä y n n i s t y s o h j e l m i a + p i k a k ä y n n i s t y s o h j e l m i e n + p i k a k ä y n n i s t y s p a k e t t i + p i k a l a i n o j a + p i k a l a i v o i h i n + p i k a l e v y + p i k a l u i s t e l u + p i k a l u i s t e l u h a l l i + p i k a m a r s s i l l e + p i k a m e n e t t e l y s s ä + p i k a m e n e t t e l y ä + p i k a m u o t i + p i k a n ä p p ä i n + p i k a o i k e u d e n k ä y n n e i s s ä + p i k a o i k e u d e n k ä y n n i t + p i k a o i k e u d e n k ä y n t e j ä + p i k a o i k e u d e n k ä y n t i + p i k a o i k e u d e n k ä y n t i e n + p i k a o t s i k k o a + p i k a p o s t i a + p i k a p ä ä t ö k s i ä + p i k a r a d a n + p i k a r a h t i p a l v e l u j e n + p i k a r a i t i o t i e + p i k a r a i t i o v a u n u t + p i k a r a i t i o v e r k o s t o + p i k a r a t k a i s u + p i k a r a t k a i s u a + p i k a r a t k a i s u i h i n + p i k a r a t k a i s u i l l a + p i k a r a t k a i s u j a + p i k a r a t k a i s u j e n + p i k a r i s o l u + p i k a r u o a n + p i k a r u o a t + p i k a r u o k a + p i k a r u o k a a + p i k a r u o k a k a n s a + p i k a r u o k a k e t j u i l l a + p i k a r u o k a k e t j u j a + p i k a r u o k a k e t j u n + p i k a r u o k a k e t j u t + p i k a r u o k a l o i t a + p i k a r u o k a m a i n o k s i l l e + p i k a r u o k a v e r o + p i k a r u o k a y h t i ö n + p i k a s e k s i + p i k a s h a k k i + p i k a s t a r t i n + p i k a s t a r t t i + p i k a s t a r t t i h a n k k e i s i i n + p i k a s t a r t t i i n + p i k a s t a r t t i r a h a a + p i k a s t a r t t i r a h o i t u s + p i k a s t a r t t i r a h o i t u s t a + p i k a s u o s t u m u k s e n + p i k a t e l o i t u k s e t + p i k a t e l o i t u k s i a + p i k a t e l o i t u k s i i n + p i k a t e r ä s + p i k a t e s t e i h i n + p i k a t e s t e i l l ä + p i k a t e s t e j ä + p i k a t e s t i e n + p i k a t e s t i t + p i k a t i e d o n s i i r t o j a + p i k a t o i m e n p i t e i t ä + p i k a t u o m i o i s t u i m e n a + p i k a t u o t t e i d e n + p i k a t u t k i m u k s e t + p i k a t u t k i m u s + p i k a v a l i k k o j e n + p i k a v a l i n t a + p i k a v a r o i t u s j ä r j e s t e l m ä l l ä + p i k a v a r o i t u s j ä r j e s t e l m ä ä + p i k a v i e s t i n t ä + p i k a v i i s u m i e n + p i k a v o i t t o i h i n + p i k a v o i t t o j a + p i k a v o i t t o j e n + p i k a y h t e y s + p i k i k o t t a r a i n e n + p i k i l e p i n k ä i s t y r a n n i + p i k i m ä n t y + p i k i o t s a t i k k a n e n + p i k i t i p p a k o e + p i k k u a a v i k k o j u o k s i j a + p i k k u a a v i k k o k i u r u + p i k k u a a v i k k o n ä r h i + p i k k u a i v o t e l t t a + p i k k u a n t i l o o p p i + p i k k u a p i l a + p i k k u a r a + p i k k u a r o k e r t t u + p i k k u a s i a + p i k k u a s i a a + p i k k u a s i a n + p i k k u a s i a s t a + p i k k u a s i o i h i n k i n + p i k k u a s i o i s s a + p i k k u a s i o i s t a + p i k k u a s i o i t a + p i k k u a u r i n g o n k u k k a + p i k k u b a m b u p y y + p i k k u b a n a a n e i n e e n + p i k k u b a n a a n i e n + p i k k u b u l b u l i + p i k k u b u l b u l i l e p i n k ä i n e n + p i k k u d i k t a a t t o r i t + p i k k u e n k e l e i t ä + p i k k u e n k e l i k o l i b r i + p i k k u e r a k k o k o l i b r i + p i k k u e t e l ä n k e i j u + p i k k u f l a m i n g o + p i k k u f r e g a t t i l i n t u + p i k k u h a a r a p y r s t ö + p i k k u h a i + p i k k u h a i k a r a + p i k k u h a n h i k k i + p i k k u h a r j a k o t k a + p i k k u h a r p y i j a + p i k k u h e l t t a m e s i k k o + p i k k u h u i s k u l e p i n k ä i n e n + p i k k u h ä i v e p e r h o n e n + p i k k u j a l o h a i k a r a + p i k k u j a l o h a u k k a + p i k k u j a m s s i p a p u + p i k k u j o u t s e n + p i k k u j u m a l t e n k u k k a + p i k k u j u o k s u k ä k i + p i k k u j u o k s u t i m a l i + p i k k u j u t t u + p i k k u j u u r i p e r h o n e n + p i k k u j ä r v i s i m p u k k a + p i k k u k a i j a s e t + p i k k u k a i v a j a + p i k k u k a j a v a + p i k k u k a j a v i e n + p i k k u k a n a d a n h a n h i + p i k k u k a p u s t a h a i k a r a + p i k k u k a s k e l o t t i + p i k k u k a s u a a r i + p i k k u k a u p p i a i s t a + p i k k u k a u p p i a s + p i k k u k a u p u n g e i s s a + p i k k u k a u p u n g e i s t a + p i k k u k a u p u n g i n + p i k k u k a u p u n g i s s a + p i k k u k a u p u n k e i h i n + p i k k u k a u p u n k e j a + p i k k u k a u p u n k i + p i k k u k a u p u n k i a + p i k k u k e i j u + p i k k u k e l t a s i i p i + p i k k u k i h o k k i + p i k k u k i i t ä j ä + p i k k u k i i v i + p i k k u k i l j u k o t k a + p i k k u k i p u a j a + p i k k u k i r v i n e n + p i k k u k i u r u + p i k k u k o r p p i + p i k k u k o r p p i k o t k a + p i k k u k o t k a + p i k k u k u h a n k e i t t ä j ä + p i k k u k u l t a r i n t a + p i k k u k u l t a s i i p i + p i k k u k y l i s s ä + p i k k u k ä e n r i e s k a + p i k k u k ä k i k y y h k y + p i k k u k ä p y l i n t u + p i k k u k ä ä p i ö k o i + p i k k u k ä ä r m e e n k i e l i + p i k k u k ä ä r m e k o t k a + p i k k u l a m p i k o r e n t o + p i k k u l a p a s o t k a + p i k k u l a p s e n + p i k k u l a p s e s t a + p i k k u l a p s e t + p i k k u l a p s i + p i k k u l a p s i a + p i k k u l a p s i l l e + p i k k u l a p s i s s a + p i k k u l a s t e n + p i k k u l a u k k u + p i k k u l a v a n t a u t i + p i k k u l a v a s t a j a + p i k k u l e h d o k k i + p i k k u l e h t i k a t s u r a + p i k k u l e h v ä k e r t t u + p i k k u l e i n i k k i + p i k k u l e p a k k o + p i k k u l e p i n k ä i n e n + p i k k u l i e j u k a n a + p i k k u l i i k e t t ä + p i k k u l i m a s k a + p i k k u l i n t u j e n + p i k k u l o k k i + p i k k u l o u h i k a l a + p i k k u l y y r y p y r s t ö + p i k k u m a a m u n a + p i k k u m a a o r a v a + p i k k u m a a y ö k k ö n e n + p i k k u m a i s e t + p i k k u m a i s i a + p i k k u m a i s i s t a + p i k k u m a i s t a + p i k k u m a i s u u t e e n + p i k k u m a r m o r i v e s i l i s k o + p i k k u m a r u n a k a n a + p i k k u m e h i l ä i s s y ö j ä + p i k k u m e r i m e t s o + p i k k u m e s i k k o + p i k k u m e t s ä h i i r i + p i k k u m i e h e n + p i k k u m i e k k a v a l a s + p i k k u m i e s t ä + p i k k u m u n k k i t a n g a r a + p i k k u m u s t a + p i k k u m u s t a k a i j a + p i k k u m u u r a h a i s k a r h u + p i k k u m y r s k y s u k e l t a j a + p i k k u m y y r ä v y ö t i ä i n e n + p i k k u n a h k i a i n e n + p i k k u n e i t i + p i k k u n i s ä k k ä i d e n + p i k k u n o k i k a n a + p i k k u n o k i p ö l l ö + p i k k u n ä p e r t e l y ä + p i k k u n ä y t ö l l ä n n e + p i k k u o l i i v i p e i p p o + p i k k u o n g e l m i a + p i k k u p a j u s i r k k u + p i k k u p a r l a m e n t t i + p i k k u p e n s a s k e r t t u + p i k k u p e n s a s l e p i n k ä i n e n + p i k k u p l a n e e t a n + p i k k u p l a n e e t o i s t a + p i k k u p l a n e e t t a + p i k k u p l a n e e t t o j e n + p i k k u p o i k a + p i k k u p o j a l l e + p i k k u p o j a t + p i k k u p r i o n i + p i k k u p r ä n t i n + p i k k u p u n a m e s i k k o + p i k k u p u n a p e i p p o + p i k k u p u n k a + p i k k u p u s s i k a n i i n i + p i k k u p y r s t ö s i r k k u + p i k k u p y s t y n o k k a + p i k k u p ä ä k a m p e l a + p i k k u p ä ä s k y k a h l a a j a + p i k k u r a h a s t a + p i k k u r a i t a h u u h k a j a + p i k k u r a n t a s a p p i + p i k k u r a s t a s m u u r a + p i k k u r i k k e e n ä + p i k k u r i k k e i n ä + p i k k u r i k k o m u k s i a + p i k k u r i k o k s i a + p i k k u r i k o k s i i n + p i k k u r i k o k s i s t a + p i k k u r i k o l l i s e n + p i k k u r i k o l l i s u u d e l l a + p i k k u r i k o s t e n + p i k k u r i t a r i y ö k k ö n e n + p i k k u r o u s k u + p i k k u r u m p u + p i k k u r u o k k i + p i k k u r u s k o s i i p p a + p i k k u r u s k o t i i r a + p i k k u s a a r i l l e + p i k k u s a h a r a u s k u + p i k k u s a n a n + p i k k u s a n a s t a + p i k k u s e e p i a t + p i k k u s e i k a s t a + p i k k u s e i k k a + p i k k u s e i k k a a n + p i k k u s e i k k o i h i n + p i k k u s e i k k o i n a + p i k k u s e i k k o j a + p i k k u s e i k o i s t a + p i k k u s e u r o j e n + p i k k u s i e l u i s e s t a + p i k k u s i e l u i s e s t i + p i k k u s i e l u i s e t + p i k k u s i e l u i s u u d e l l a + p i k k u s i e l u j e n + p i k k u s i e p p o + p i k k u s i k a r i t e o l l i s u u d e l t a + p i k k u s i n i l i l j a + p i k k u s i n i n a a k k a + p i k k u s i n i s i i p i + p i k k u s i r k k u + p i k k u s i r p p i t i m a l i + p i k k u s i r r i + p i k k u s i s a r + p i k k u s i s k o + p i k k u s i s k o n a + p i k k u s o r m e n + p i k k u s o r m i + p i k k u s u l k a p e n s a s + p i k k u s u m m a + p i k k u s u m m a t + p i k k u s u m m i e n + p i k k u s u m m i i n + p i k k u s u m m i s t a + p i k k u s u n d a n p ö l l ö n e n + p i k k u s u o k a n a + p i k k u s u u k a m p e l a + p i k k u s ä ä n n ö i l l ä + p i k k u t a k k i + p i k k u t a l v i k k i + p i k k u t a l v i o + p i k k u t a r k a s t i + p i k k u t a r k k a + p i k k u t a r k k u u s + p i k k u t e k i j ä + p i k k u t e k i j ö i t ä + p i k k u t e r v a k k o + p i k k u t e t r a + p i k k u t i i r a + p i k k u t i k k a + p i k k u t i l a + p i k k u t i l t a l t t i + p i k k u t r a p p i + p i k k u t r o g o n i + p i k k u t r o p i i k k i l i n t u + p i k k u t u l i k ä r k i + p i k k u t u n n e i l l a + p i k k u t u n n e l i m y y r ä + p i k k u t u r t u r i k y y h k y + p i k k u t u u l e n k a l a + p i k k u t u u l i h a u k k a + p i k k u t y l l i + p i k k u t y r a n n i n a p s i j a + p i k k u t y t t ö j e n + p i k k u t y t t ö n s ä + p i k k u t y t ö i l l e + p i k k u t y t ö i s t ä + p i k k u t y t ö n + p i k k u t y t ö t + p i k k u t ä p l ä t i k k a + p i k k u t ö p ö s i e p p o + p i k k u t ö r m ä p ä ä s k y + p i k k u t ö y h t ö k i u r u + p i k k u t ö y h t ö m o n a r k k i + p i k k u t ö y h t ö t i i r a + p i k k u v a l t i o + p i k k u v a l t i o i h i n + p i k k u v a l t i o t a + p i k k u v a r p a a n n e + p i k k u v a r p u n e n + p i k k u v a r p u s p ö l l ö + p i k k u v e l i + p i k k u v e l j e n i + p i k k u v e l j e n s ä + p i k k u v e l j e n ä + p i k k u v e l j e ä + p i k k u v e l j i e m m e + p i k k u v e l j i l t ä ä n + p i k k u v i h a + p i k k u v i h e r b u l b u l i + p i k k u v i h e r k a i j a + p i k k u v i i d a k k o h a u k k a + p i k k u v i r h e i d e n + p i k k u v i r h e i n ä + p i k k u v o i t o n + p i k k u v u o r i b u l b u l i + p i k k u v y ö m i t t a r i + p i k k u y l ä n k ö j u o k s i j a + p i k k u y r i t y s + p i k s e l i s i v u + p i l a a m a a n + p i l a a m i s r i k o k s i s t a + p i l a a m i s t a + p i l a a m m e + p i l a a n t u i s i v a t + p i l a a n t u m i s a s t e t t a + p i l a a n t u m i s e e n + p i l a a n t u m i s e l t a + p i l a a n t u m i s e n + p i l a a n t u m i s e n t o r j u n t a t o i m e t + p i l a a n t u m i s e s t a + p i l a a n t u m i s k u s t a n n u k s i a + p i l a a n t u m i s o n g e l m a a n + p i l a a n t u m i s o n g e l m i i n + p i l a a n t u m i s t a + p i l a a n t u m i s t i l a n t e e s e e n + p i l a a n t u m i s v a a r a + p i l a a n t u m i s v a h i n g o s t a + p i l a a n t u m i s v a h i n k o j a + p i l a a n t u m i s v a h i n k o j e n + p i l a a n t u m i s v a i k u t u s t e n + p i l a a n t u n e e t + p i l a a n t u n e i d e n + p i l a a n t u n e i l l e + p i l a a n t u n e i s t a + p i l a a n t u n u t t a + p i l a a t t e + p i l a i l u s t a + p i l a k u v a a + p i l a k u v a k r i i s i n + p i l a n + p i l a n n u t + p i l a n t e k o a + p i l a p i i r r o k s e t + p i l a p i i r r o k s i a + p i l a p i i r r o k s i l l a + p i l a p i i r r o k s i s t a + p i l a p i i r r o s j u p a k k a + p i l a p i i r r o s k i i s t a + p i l a p i i r r o s k i i s t a n + p i l a p i i r r o s k i i s t a s t a + p i l a p i i r r o s k i l p a i l u n + p i l a p i i r r o s r i i t a a + p i l a r e i d e n + p i l a r i a + p i l a r i i n + p i l a r i j a k o + p i l a r i j a o n + p i l a r i j ä r j e s t e l m ä + p i l a r i j ä r j e s t e l m ä ä + p i l a r i n + p i l a r i r a k e n n e + p i l a r i r a k e n n e t t a + p i l a r i r a k e n t e e n + p i l a r i r a k e n t e e s s a + p i l a r i r a k e n t e e s t a + p i l a r i s s a + p i l a r i s t a + p i l a r i t e r m i n o l o g i a a + p i l a s o i t t o + p i l a t a + p i l i p a l i t u t k i m u k s i a + p i l k a h d u k s e n + p i l k a n + p i l k a n t e k o a + p i l k k a h i n t a a n + p i l k k a n i s k a + p i l k k a s i i p i + p i l k k a t a n s s i n s a + p i l k k i m i n e n + p i l k k o m i s m a l l i + p i l k k o m i s t a k t i i k a l l a a n + p i l k k o m i s t a k t i i k k a a + p i l k k u a k a a n + p i l k k u a n t e n n i m o n n i + p i l k k u i m u n u o l i a i n e n + p i l k k u k a l a + p i l k k u n a h k a j ä k ä l ä + p i l k k u p a l l o k a l a + p i l k k u p u s s i m i t t a r i + p i l k k u s i i p i + p i l k k u s i l l i + p i l k k u t i m a n t t i a h v e n + p i l k k u v a t s a p e i p p o + p i l k u n t a r k k o j a + p i l l i i n + p i l l i k e m i t t a r i + p i l l i p i i p a r i + p i l l i s i p u l i + p i l o t t i a j a t t e l u k s i + p i l o t t i a l o i t e t t a + p i l o t t i a l o i t t e e n + p i l o t t i a l o i t t e e s e e n + p i l o t t i a l o i t t e e s s a + p i l o t t i a l o i t t e i t a + p i l o t t i a l u e + p i l o t t i a l u e e n + p i l o t t i a l u e e s t a + p i l o t t i a s e m a a + p i l o t t i a s i a + p i l o t t i a s i a k k a a n a + p i l o t t i h a n k e + p i l o t t i h a n k e e n + p i l o t t i h a n k e t t a + p i l o t t i h a n k k e e k s i + p i l o t t i h a n k k e e l l a + p i l o t t i h a n k k e e l l e + p i l o t t i h a n k k e e m m e + p i l o t t i h a n k k e e n + p i l o t t i h a n k k e e n a + p i l o t t i h a n k k e e s e e n + p i l o t t i h a n k k e e s s a + p i l o t t i h a n k k e e s t a + p i l o t t i h a n k k e e t + p i l o t t i h a n k k e i d e n + p i l o t t i h a n k k e i l l a + p i l o t t i h a n k k e i l l e + p i l o t t i h a n k k e i n + p i l o t t i h a n k k e i n a + p i l o t t i h a n k k e i s i i n + p i l o t t i h a n k k e i s s a + p i l o t t i h a n k k e i s t a + p i l o t t i h a n k k e i t a + p i l o t t i j a k s o + p i l o t t i k o k e i l u + p i l o t t i k o k e i l u j e n + p i l o t t i k o k e m u k s i a + p i l o t t i l i n j o j a + p i l o t t i m a a n a + p i l o t t i m e n e t t e l y + p i l o t t i m ä ä r ä r a h a n + p i l o t t i o h j e l m a + p i l o t t i o h j e l m a a + p i l o t t i o h j e l m a a n + p i l o t t i o h j e l m a n + p i l o t t i o h j e l m a s s a + p i l o t t i o h j e l m i a + p i l o t t i o h j e l m i e n + p i l o t t i o h j e l m i l l e + p i l o t t i p r o j e k t e i h i n + p i l o t t i p r o j e k t e i s s a + p i l o t t i p r o j e k t e i s t a + p i l o t t i p r o j e k t e j a + p i l o t t i p r o j e k t i + p i l o t t i p r o j e k t i a + p i l o t t i p r o j e k t i e n + p i l o t t i p r o j e k t i l l e + p i l o t t i p r o j e k t i m m e + p i l o t t i p r o j e k t i n + p i l o t t i p r o j e k t i s s a + p i l o t t i p r o j e k t i t + p i l o t t i p r o s e s s i l l a + p i l o t t i s e l v i t y k s i ä + p i l o t t i s o p i m u k s e s t a + p i l o t t i s u u n n i t e l m a t + p i l o t t i t e h d a s + p i l o t t i t i e t o v e r k o s t o o n + p i l o t t i t o i m e t + p i l o t t i t o i m i a + p i l o t t i t o i m i e n + p i l o t t i t u n n e l i n + p i l o t t i t u t k i m u k s e n + p i l o t t i t u t k i m u k s i a + p i l o t t i t u t k i m u k s i i n + p i l o t t i t u t k i m u s + p i l o t t i t u t k i m u s k i e r r o k s e n + p i l o t t i t u t k i m u s t a + p i l o t t i t u t k i m u s t e n + p i l o t t i v a i h e + p i l o t t i v a i h e e s e e n + p i l o t t i v a i h e e s s a + p i l o t t i v a i h e e s s a a n + p i l o t t i v a l t i o i d e n + p i l s s i v e s i + p i l s s i v e t t ä + p i l v e n p i i r t ä j i s t ä + p i l v e s s ä + p i l v e t + p i l v i e n + p i l v i h i i r i h a u k k a + p i l v i i n + p i l v i k a r t a s t o + p i l v i k i r s i k k a + p i l v i l a s k e n t a + p i l v i l i n n o i s s a + p i l v i l i n n o j a + p i l v i m e t s ä + p i l v i m e t s ä h a u k k a + p i l v i m e t s ä p ö l l ö n e n + p i l v i m e t s ä r a s t a s + p i l v i o l o s u h t e i s s a + p i l v i s s ä + p i l v i s u v u t + p i l v i ä + p i m e i d e n + p i m e i m p i e n + p i m e i m p i n ä + p i m e i m p i n ä k i n + p i m e n n o s s a + p i m e n t o o n + p i m e n t ä m i n e n + p i m e y t e e n + p i m e y t t ä + p i m e ä l l e + p i m e ä l l ä + p i m e ä n + p i m e ä n ä k ö k i i k a r i t + p i m e ä n ä k ö l a i t t e i s t a + p i m e ä s s ä + p i m e ä s t ä + p i m e ä t + p i m e ä ä + p i m e ä ä n + p i m i k k ö k u o r i a i s e t + p i m i t t ä ä + p i n a a t t i e l ä m ä n l a n k a + p i n a a t t i k e i t t o + p i n a a t t i k i i n a n k a a l i + p i n e g a + p i n g i s p a l l o + p i n g i s p a l l o n a + p i n g i s p e l i k s i + p i n g p o n g p e l i + p i n n a a m i s t a + p i n n a l l i s e m p a a + p i n n a l l i s i a + p i n n a n + p i n n a s ä n k y + p i n n o i t t e e l l a + p i n o a m i n e n + p i n o a m i s t a p o j e n + p i n o a u t o m a a t t i + p i n s e t t i k a l a + p i n t a a + p i n t a e n e r g i a + p i n t a g r a v i t a a t i o + p i n t a i n t e g r a a l i + p i n t a j ä n n i t y s + p i n t a k i r k k a u d e n + p i n t a k i r k k a u s + p i n t a k u v i o + p i n t a k y t k i n + p i n t a k ä s i t t e l y + p i n t a k ä s i t t e l y n + p i n t a k ä s i t t e l y s s ä + p i n t a k ä s i t t e l y y n + p i n t a l i i t o s k o m p o n e n t i t + p i n t a l ä m p ö t i l a + p i n t a n s a + p i n t a p u o l i s e e n + p i n t a p u o l i s e s t i + p i n t a r a a p a i s u + p i n t a s i i m a + p i n t a s i i m a k a l a s t u k s e n + p i n t a v e d e n + p i n t a v e d e s s ä + p i n t a v e d e s t ä + p i n t a v e d e t + p i n t a v e s i + p i n t a v e s i e n + p i n t a v e s i i n + p i n t a v e s i l l e + p i n t a v e s i s s ä + p i n t a v e s i s t ä + p i n t a v e s i v a r o j a + p i n t a v e s i ä + p i n t a v e t e e n + p i n t a v e t t ä + p i o n e e r i h e n g e l l e + p i o n e e r i h e n g e s s ä + p i o n e e r i h e n k e ä + p i o n e e r i h e n k i + p i o n e e r i l a j i + p i o n e e r i l i i k e + p i o n e e r i m a i d e n + p i o n e e r i m a i t a + p i o n e e r i m u s e o + p i o n e e r i r y h m i ä + p i o n e e r i r y h m ä s t ä + p i o n e e r i r y h m ä ä + p i o n e e r i s u k u p o l v e l l e + p i o n e e r i t o i m i n t a + p i o n e e r i t y ö h ö n + p i o n e e r i t y ö s t ä + p i o n e e r i t y ö t ä + p i o n e e r i v a l t i o + p i o n e e r i v a l t i o i d e n + p i o n e e r i v a l t i o i k s i + p i p a r k a k k u t a l o + p i p p u r i p a l l o k a l a + p i p p u r i r a n n i k k o + p i p p u r i r o u s k u + p i p p u r i r u u t a p u u + p i p p u r i s u i h k e e l l a + p i r a a t i t + p i r a a t t i a h v e n + p i r a a t t i k a l a s t u s t a + p i r a a t t i k a u p p a a + p i r a a t t i k o p i o i n t i a + p i r a a t t i p o l i t i i k a s t a + p i r a a t t i p u o l u e + p i r a a t t i r a d i o + p i r a a t t i t e o l l i s u u d e n + p i r a a t t i t o i m i n t a + p i r a a t t i t o i m i n t a a + p i r a a t t i t u o t t e e t + p i r a a t t i t u o t t e i d e n + p i r a a t t i t u o t t e i l l a + p i r a a t t i v a l m i s t u s t a + p i r a t i s m i a + p i r a t i s m i n + p i r i s t y i + p i r i s t y s r u i s k e + p i r i s t y s r u i s k e e n + p i r i s t y s r u i s k e i n a + p i r i s t y s r u i s k e i s t a + p i r i s t y s t o i m i a + p i r i s t ä m i s e k s i + p i r i s t ä v ä ä + p i r i s t ä ä + p i r i s t ä ä k s e e n + p i r s t a l e i k s i + p i r s t a l e i n a + p i r s t a l o i t u i s i + p i r s t a l o i t u n e e s e e n + p i r s t o u t u n e e m m a t + p i r u j a + p i r u l l i s e e n + p i r u l l i s e m p i a + p i r u l l i s e t + p i r u n n y r k k i + p i r u n p e l t o + p i r u n p e s ä + p i r u n s a a r i + p i r u n t a t t i + p i s a m a k o l i b r i + p i s a m a o t s a k u t o j a + p i s a m a p a l l o k a l a + p i s a m a p e l i k a a n i + p i s a m a t a v i + p i s a m a t i k k a + p i s a m a v a l m u s k a + p i s a r a a k a a n + p i s a r a k i l p i k o n n a + p i s a r a k i p u a j a + p i s a r a l l a + p i s a r a p e r h o k a l a + p i s a r a p ö l l ö n e n + p i s a r a r a t a + p i s a r a t i k k a n e n + p i s i m m ä l l e + p i s i m m ä l l ä + p i s i m p ä ä n + p i s t e a j o k o r t t i a + p i s t e e s e e n + p i s t e e s s ä + p i s t e e s t ä + p i s t e e t + p i s t e h a a r n i s k a m o n n i + p i s t e i d e n + p i s t e i d e n k e r u u t a + p i s t e i m u n u o l i a i n e n + p i s t e j ä r j e s t e l m ä + p i s t e j ä r j e s t e l m ä k l u b i e n + p i s t e j ä r j e s t e l m ä n + p i s t e j ä r j e s t e l m ä ä + p i s t e k a a v i o + p i s t e k i r j o i t u k s e l l a + p i s t e k i r j o i t u s k o p i o i t a + p i s t e k u o r m i t u s + p i s t e l a u s e k e t t a + p i s t e l i ä i m m i s t ä + p i s t e l i ä i t ä + p i s t e l ä h t e e t + p i s t e m u t a a t i o + p i s t e m ä ä r ä ä + p i s t e n ä y t t ö + p i s t e p r o s e s s i + p i s t e p u n a h a i + p i s t e s i i p i + p i s t e s i i r t o l a i t e + p i s t e t t ä + p i s t e y t y s j ä r j e s t e l m ä ä + p i s t i m i l l ä + p i s t i m i ä + p i s t o k k e i s t a + p i s t o k o e j ä r j e s t e l m ä + p i s t o k o e m e n e t t e l y n + p i s t o k o e t a r k a s t u k s e t + p i s t o k o e t a r k a s t u s t e n + p i s t o k o e t u t k i m u k s i s s a + p i s t o k o e v a l v o n t a a + p i s t o k o k e e n o m a i s i a + p i s t o k o k e e t + p i s t o k o k e i l l a + p i s t o k o k e i n + p i s t o k o k e i s i i n + p i s t o k o k e i s s a + p i s t o k o k e i t a + p i s t o k s i a + p i s t o k s i s s a + p i s t o k ä r p ä n e n + p i s t o o l i k o t e l o + p i s t o o l i t ä h t i + p i s t o r a s i a + p i s t o s a l u e e l l a + p i s t o t a r k a s t u k s e t + p i s t o t a r k a s t u k s i a + p i t a r e t i + p i t e m m i t t ä + p i t e m m ä k s i + p i t e m m ä l l ä k ä ä n + p i t e m m ä n + p i t e m m ä t + p i t e m p i + p i t e m p i a i k a i s i a + p i t e m p i a i k a i s t a + p i t e m p i ä + p i t e m p ä ä + p i t e m p ä ä n k i n + p i t e n e e + p i t e n e m i n e n + p i t e n e m i s e n + p i t e n e m i s t ä ä n + p i t e n e m ä s s ä + p i t i k i n + p i t i p ä + p i t i v ä t + p i t k i e n + p i t k i i n + p i t k i k s i + p i t k i k s i k i n + p i t k i l l e + p i t k i l l ä + p i t k i s t ä + p i t k i t t y m i n e n + p i t k i t t y m i s t ä + p i t k i t t y n e e k s i + p i t k i t t y n e e s e e n + p i t k i t t y n e i d e n + p i t k i t t y n e i s i i n + p i t k i t t y n e i s t ä + p i t k i t t ä i s t u t k i m u s + p i t k i t t ä m i s e n + p i t k i t t ä m ä t t ä + p i t k i t t ä ä + p i t k i ä + p i t k i ä k i n + p i t k ä a i k a i n e n + p i t k ä a i k a i s e e n + p i t k ä a i k a i s e k s i + p i t k ä a i k a i s e l l a + p i t k ä a i k a i s e l l e + p i t k ä a i k a i s e l t a + p i t k ä a i k a i s e m m a s t a + p i t k ä a i k a i s e m p a a + p i t k ä a i k a i s e m p a a n + p i t k ä a i k a i s e m p i + p i t k ä a i k a i s e m p i a + p i t k ä a i k a i s e n + p i t k ä a i k a i s e n a + p i t k ä a i k a i s e n n u s t e i l l e + p i t k ä a i k a i s e s s a + p i t k ä a i k a i s e s t a + p i t k ä a i k a i s e s t i + p i t k ä a i k a i s e t + p i t k ä a i k a i s h o i d o l l e + p i t k ä a i k a i s h o i d o n + p i t k ä a i k a i s h o i d o s t a + p i t k ä a i k a i s h o i t o + p i t k ä a i k a i s h o i t o a + p i t k ä a i k a i s h o i t o o n + p i t k ä a i k a i s i a + p i t k ä a i k a i s i i n + p i t k ä a i k a i s i k s i + p i t k ä a i k a i s i l l a + p i t k ä a i k a i s i l l e + p i t k ä a i k a i s i l t a + p i t k ä a i k a i s i m m a n + p i t k ä a i k a i s i m m i s t a + p i t k ä a i k a i s i m p i e n + p i t k ä a i k a i s i n + p i t k ä a i k a i s i n a + p i t k ä a i k a i s i n t a + p i t k ä a i k a i s i s t a + p i t k ä a i k a i s o n g e l m i a + p i t k ä a i k a i s p e r s p e k t i i v i s s ä + p i t k ä a i k a i s s a i r a a n h o i d o n + p i t k ä a i k a i s s a i r a a t + p i t k ä a i k a i s s a i r a i d e n + p i t k ä a i k a i s s a i r a i s i i n + p i t k ä a i k a i s s a i r a i t a + p i t k ä a i k a i s s i j o i t u k s e s t a + p i t k ä a i k a i s s i j o i t u k s i s t a + p i t k ä a i k a i s s u u n n i t t e l u n + p i t k ä a i k a i s t a + p i t k ä a i k a i s t e n + p i t k ä a i k a i s t u r v a l l i s u u d e n + p i t k ä a i k a i s t y ö l l i s y y t t ä + p i t k ä a i k a i s t y ö t t ö m y y d e n + p i t k ä a i k a i s t y ö t t ö m y y d e s t ä + p i t k ä a i k a i s t y ö t t ö m y y s + p i t k ä a i k a i s t y ö t t ö m y y t e e n + p i t k ä a i k a i s t y ö t t ö m y y t t ä + p i t k ä a i k a i s t y ö t t ö m y y t t ä ä n + p i t k ä a i k a i s u u s + p i t k ä a i k a i s v a i k u t u k s e t + p i t k ä a i k a i s v a i k u t u k s i a + p i t k ä a i k a i s v a i k u t u k s i s t a + p i t k ä a i k a i s v a n g i n + p i t k ä a i k a i s v a n k i + p i t k ä e v ä p a l l o p ä ä + p i t k ä h ä n t ä k ä r p p ä + p i t k ä i k ä i n e n + p i t k ä i k ä i s e n + p i t k ä i k ä i s e t + p i t k ä i k ä i s i m m i s t ä + p i t k ä i k ä i s i m p i e n + p i t k ä i k ä i s i ä + p i t k ä i k ä i s t e n + p i t k ä i k ä i s t ä + p i t k ä i k ä i s y y d e s t ä ä n + p i t k ä i k ä i s y y s r i s k i ä + p i t k ä i k ä i s y y t e e n + p i t k ä i k ä i s y y t e n s ä + p i t k ä j a l k a + p i t k ä j a l k a h a u k k a + p i t k ä j ä n n i t t e i n e n + p i t k ä j ä n n i t t e i s e n ä + p i t k ä j ä n n i t t e i s e s t ä + p i t k ä j ä n n i t t e i s t ä + p i t k ä j ä n n i t t e i s y y d e n + p i t k ä j ä n n i t t e i s y y t e e n + p i t k ä j ä n t e i n e n + p i t k ä j ä n t e i s e e n + p i t k ä j ä n t e i s e l l e + p i t k ä j ä n t e i s e l t ä + p i t k ä j ä n t e i s e m p ä ä + p i t k ä j ä n t e i s e n + p i t k ä j ä n t e i s e s t i + p i t k ä j ä n t e i s e t + p i t k ä j ä n t e i s i ä + p i t k ä j ä n t e i s t e n + p i t k ä j ä n t e i s t ä + p i t k ä j ä n t e i s y y s + p i t k ä j ä n t e i s y y t t ä + p i t k ä k a t s e i s t a + p i t k ä k e s t o i n e n + p i t k ä k e s t o i s e e n + p i t k ä k e s t o i s e l l a + p i t k ä k e s t o i s e l l e + p i t k ä k e s t o i s e m p a a + p i t k ä k e s t o i s e m p i + p i t k ä k e s t o i s e n + p i t k ä k e s t o i s e s s a + p i t k ä k e s t o i s e s t a + p i t k ä k e s t o i s e s t i + p i t k ä k e s t o i s e t + p i t k ä k e s t o i s i a + p i t k ä k e s t o i s i i n + p i t k ä k e s t o i s i l l a + p i t k ä k e s t o i s i l l e + p i t k ä k e s t o i s i m p i i n + p i t k ä k e s t o i s i s s a + p i t k ä k e s t o i s t a + p i t k ä k e s t o i s t e n + p i t k ä k o i p i s i r r i + p i t k ä k s i + p i t k ä k u i t u i s e l l e + p i t k ä k u i t u i s e n + p i t k ä k u i t u i s t e n + p i t k ä l l e k i n + p i t k ä l l i s e e n + p i t k ä l l i s e m m ä n + p i t k ä l l i s e s s ä + p i t k ä l l i s e t + p i t k ä l l i s i s s ä + p i t k ä l l i s i ä + p i t k ä l l i s t e n + p i t k ä n + p i t k ä n p e r j a n t a i n + p i t k ä n ä + p i t k ä n ä k ö i s e m p ä ä n + p i t k ä n ä k ö i s i ä + p i t k ä n ä k ö i s y y t e e n + p i t k ä n ä p e r j a n t a i n a + p i t k ä p e r j a n t a i + p i t k ä p e r j a n t a i n + p i t k ä p e r j a n t a i n a + p i t k ä p i i m ä i s t ä + p i t k ä p i p p u r i + p i t k ä s i i m a + p i t k ä s i i m a k a l a s t u k s e e n + p i t k ä s i i m a k a l a s t u k s e n + p i t k ä s s ä + p i t k ä s t y m ä ä n + p i t k ä s t ä + p i t k ä t + p i t k ä v a i k u t t e i s e l l a + p i t k ä v a i k u t t e i s i a + p i t k ä v e t e i s i ä + p i t k ä ä + p i t k ä ä n k i n + p i t o i s u u d e t + p i t o i s u u k s i a + p i t o i s u u k s i i n + p i t o i s u u k s i n a + p i t o i s u u k s i s t a + p i t o i s u u s k a t t o + p i t o i s u u s k a t t o o n + p i t o i s u u s r a j a + p i t o i s u u s r a j o j a + p i t o i s u u s r a j o j e n + p i t s a l ä h e t e i s t ä + p i t s a t a k s i k s i + p i t s i h i e t a k y y h k y + p i t s i n y s ä m u u r a + p i t s i p y r s t ö t r o g o n i + p i t s i t e o l l i s u u s + p i t u i s e s t a + p i t u i s i a + p i t u u d e n + p i t u u d e s t a + p i t u u s h y p p y + p i t u u s l e i k k a u s + p i t u u s r a j a + p i t ä e s s ä m m e + p i t ä i s i + p i t ä i s i h ä n + p i t ä i s i k i n + p i t ä i s i k ö + p i t ä i s i k ö h ä n + p i t ä i s i n + p i t ä i s i p ä + p i t ä i s i v ä t + p i t ä j ä n m a k a s i i n i + p i t ä k ä ä + p i t ä k ä ä m m e + p i t ä m i e m m e + p i t ä m i i n s ä + p i t ä m i s e k s i + p i t ä m i s e s t ä + p i t ä m i s t ä + p i t ä m i s t ä m m e + p i t ä m i ä + p i t ä m i ä m m e + p i t ä m ä l l ä + p i t ä m ä n n e + p i t ä m ä s s ä n i + p i t ä m ä s t ä + p i t ä m ä s t ä n i + p i t ä m ä t t ä + p i t ä m ä ä n + p i t ä m ä ä n i + p i t ä m ä ä n s ä + p i t ä n e e + p i t ä n e e t + p i t ä n y t + p i t ä v i ä + p i t ä v y y d e s t ä + p i t ä v ä m m e + p i t ä v ä m p i + p i t ä v ä n i + p i t ä v ä n s ä + p i t ä v ä t + p i t ä v ä ä + p i t ä y d y m m e + p i t ä y t y i + p i t ä y t y k ä ä m m e + p i t ä y t y m i s t ä + p i t ä y t y m ä t t ä + p i t ä y t y ä + p i t ä ä + p i t ä ä k i n + p i t ä ä k s e e n + p i t ä ä k s e m m e + p i t ä ä k ö + p i z z a l e i k k u r i + p i z z e r i a i s k u n + p i z z o j e n + p l a g i a a t i n t u n n i s t u s j ä r j e s t e l m ä + p l a n e e t a l l a m m e + p l a n e e t a l t a + p l a n e e t a n + p l a n e e t o i l l e + p l a n e e t t a a + p l a n e e t t a j ä r j e s t e l m ä ä n + p l a n e e t t a k u n t a + p l a n e e t t a m m e + p l a n e e t t a t u t k i m u s + p l a n e e t t a v a i h d e + p l a n t a a s i t y ö n t e k i j ö i d e n + p l a s m a l e i k k a u s + p l a s m a l l a + p l a s m a n l u o v u t u k s i l l a + p l a s m a p a l l o + p l a s m a p a n e e l i n ä y t t ö + p l a s m a p u l a + p l a s m a s o l u + p l a s m a t u o t t e e m m e + p l a s m a t u o t t e e t + p l a s m a t u o t t e i s t a + p l a s t i i k k a k i r u r g e i s t a + p l a s t i i k k a k i r u r g i a a + p l a s t i i k k a k i r u r g i a a n + p l a s t i i k k a k i r u r g i a n + p l a s t i i k k a k i r u r g i l l e + p l a t i n a d i o k s i d i + p l a t i n a f a s a a n i + p l a t i n a k e t t u + p l a t i n a k l o r i d i + p l a t i n a m e t a l l e j a + p l a t i n a p o m m i + p l a t i n a r y h m ä + p l a t o n i l a i s t a + p l u s s a n + p l u t o n i u m d i o k s i d i + p l u t o n i u m i a + p l u t o n i u m i n + p l u t o n i u m i s t a + p l u t o n i u m j ä t t e i d e n + p l u t o n i u m k o k e i t a + p l u t o n i u m m o l e k y y l e j ä + p l u t o n i u m m ä ä r i e n + p l u t o n i u m s a a s t e e n + p l u t o n i u m t a l o u d e k s i + p l u t o n i u m t a l o u d e n + p l u t o n i u m t a l o u d e s t a + p l u t o n i u m t a l o u t e e n + p l u t o n i u m t a l o u t e m m e + p l u t o n i u m t a l o u t t a + p o h a t t o j e n + p o h d i m m e + p o h d i n k i n + p o h d i n n a n + p o h d i n n a n a r v o i s i a + p o h d i n n o i l l a m m e + p o h d i n n o i s s a + p o h d i n n o i s t a + p o h d i n t a a + p o h d i n t a a n + p o h d i n t a h e t k i + p o h d i n t a j a k s o l l a + p o h d i n t a k o h t e i t a + p o h d i n t a l i n j a l l a + p o h d i n t a l i n j o j a + p o h d i n t a m e n e t t e l y y n + p o h d i n t a n i + p o h d i n t a p r o s e s s i + p o h d i n t a p r o s e s s i a + p o h d i n t a p r o s e s s i i n + p o h d i n t a p r o s e s s i n + p o h d i n t a p r o s e s s i s s a + p o h d i n t a r y h m i ä + p o h d i n t a r y h m ä + p o h d i n t a r y h m ä n + p o h d i n t a r y h m ä ä n + p o h d i n t a t a u k o a + p o h d i n t a v a i h e + p o h d i n t o i h i n + p o h d i n t o i h i n n e + p o h d i n t o j a + p o h d i n t o j a a n + p o h d i n t o j e m m e + p o h d i n t o j e n + p o h d i s k e l u a + p o h d i s k e l u i h i n + p o h d i s k e l u j a + p o h d i s k e l u j e n + p o h d i s k e l u u n + p o h d i t a + p o h d i t a a n + p o h d i t a a n p a + p o h d i t t a e s s a + p o h d i t t a i s i i n + p o h d i t t a v a + p o h d i t t a v a a + p o h d i t t a v a n a + p o h d i t t a v i n a + p o h d i t t e + p o h d i t t i i n + p o h d i t t u + p o h j a e h d o t u k s e s t a + p o h j a e l i ö s t ö + p o h j a e s i t y k s e e n + p o h j a e s i t y s + p o h j a h i n n o i n + p o h j a h i n t o j a + p o h j a i k ä ä + p o h j a i n f l a a t i o + p o h j a k a l a l a j e j a + p o h j a k a l a l a j i e n + p o h j a k a l a l a j i t + p o h j a k a l a s t u k s e n + p o h j a k a l a s t u k s e s t a + p o h j a k a l a s t u s + p o h j a k a l a s t u s l a j i e n + p o h j a k a l a s t u s m a h d o l l i s u u k s i a + p o h j a k a l a s t u s t a + p o h j a k a l a s t u s t o i m i n n a s t a + p o h j a k a l a t r o o l a r i e n + p o h j a k a l o i l l e + p o h j a k a l o j a + p o h j a k e r r o k s e s s a + p o h j a k e r r o k s e s t a + p o h j a k o u l u t u s + p o h j a k s i + p o h j a k u l k e u m a + p o h j a l a j i t + p o h j a l e v y + p o h j a l u k e m i i n + p o h j a l u k e m i s s a + p o h j a m u t i i n + p o h j a n + p o h j a n a + p o h j a n e r a k k o k o l i b r i + p o h j a n h a r j u s + p o h j a n h o p e a t ä p l ä + p o h j a n k a r h e p ä ä s k y + p o h j a n k a r v a k u o n o v o m p a t t i + p o h j a n k a t k a r a p u + p o h j a n k i i s l a + p o h j a n l a h t i + p o h j a n l e h t i m i t t a r i + p o h j a n l e p a k k o + p o h j a n l u m m e + p o h j a n m e r e e n + p o h j a n m e r e l l e + p o h j a n m e r e l l ä + p o h j a n m e r e l t ä + p o h j a n m e r e n + p o h j a n m e r e s s ä + p o h j a n m e r e s t ä + p o h j a n m e r i + p o h j a n m e r i n o r s u + p o h j a n m e r t a + p o h j a n m e s i s i e n i + p o h j a n n o i d a n l u k k o + p o h j a n o t e e r a u k s e n + p o h j a n o t e e r a u s + p o h j a n o t e e r a u s t a + p o h j a n p a h k u r a s a m m a l + p o h j a n p a j u + p o h j a n p i i s p a n h i i p p a + p o h j a n s i n i v a l v a t t i + p o h j a n s i r k k u + p o h j a n s u r v i a i s k o i + p o h j a n t i k k a + p o h j a n t ä h t e m m e + p o h j a n t ä h t i m ö + p o h j a n u k o n k o r e n t o + p o h j a p a k a s t u s t r o o l a r e i t a + p o h j a p a l l o k a l a + p o h j a p i i r r o s + p o h j a p i i r r o s t a + p o h j a p y y d y k s e t + p o h j a p y y d y k s i l l ä + p o h j a p y y d y s t e n + p o h j a t a s o s t a + p o h j a t e r v e y s + p o h j a t i e t o j e n + p o h j a t r o o l a r e i l l e + p o h j a t r o o l a r e i t a + p o h j a t r o o l a u k s e l l a + p o h j a t r o o l a u k s e n + p o h j a t r o o l a u s + p o h j a t r o o l a u s s a a l i i s t a + p o h j a t r o o l i e n + p o h j a t r o o l i k a l a s t u k s e l l a + p o h j a t r o o l i k a l a s t u k s e n + p o h j a t t o m a k s i + p o h j a t t o m i i n + p o h j a t u n n e l i + p o h j a t y ö s t ä + p o h j a t y ö t ä + p o h j a u d u t t a v a + p o h j a u t u v a + p o h j a u t u v a a n + p o h j a u t u v a l l e + p o h j a u t u v a n + p o h j a v e d e n + p o h j a v e d e s t ä + p o h j a v e r k k o j a + p o h j a v e r k k o j e n + p o h j a v e r k k o k a l a s t u s + p o h j a v e r k o i s t a + p o h j a v e s i + p o h j a v e s i a l u e i t a + p o h j a v e s i d i r e k t i i v i + p o h j a v e s i d i r e k t i i v i i n + p o h j a v e s i d i r e k t i i v i k s i + p o h j a v e s i d i r e k t i i v i l l ä + p o h j a v e s i d i r e k t i i v i n + p o h j a v e s i d i r e k t i i v i s s ä + p o h j a v e s i d i r e k t i i v i s s ä k i n + p o h j a v e s i d i r e k t i i v i ä + p o h j a v e s i e k o s y s t e e m i ä + p o h j a v e s i e n + p o h j a v e s i e s i i n t y m i i n + p o h j a v e s i i n + p o h j a v e s i k e r r o k s i a + p o h j a v e s i k y s y m y s + p o h j a v e s i l ä h d e t t ä + p o h j a v e s i l ä h t e e t + p o h j a v e s i l ä h t e i d e n + p o h j a v e s i l ä h t e i s t ä + p o h j a v e s i m u o d o s t e l m a t + p o h j a v e s i m u o d o s t u m a t + p o h j a v e s i m u o d o s t u m i e n + p o h j a v e s i m ä ä r ä y k s e t + p o h j a v e s i o n g e l m i s t a + p o h j a v e s i p u i t e d i r e k t i i v i n + p o h j a v e s i s s ä + p o h j a v e s i s t ä + p o h j a v e s i s t ö l l e + p o h j a v e s i t i l a n t e e t + p o h j a v e s i t u t k i m u k s e s s a + p o h j a v e s i v a r a n n o i s t a + p o h j a v e s i v a r a n s a + p o h j a v e s i v a r a s t o o n + p o h j a v e s i v a r o i h i n + p o h j a v e s i v a r o i s t a + p o h j a v e s i ä + p o h j a v e t e e n + p o h j a v e t e n s ä + p o h j a v e t t ä + p o h j a v e t t ä m m e + p o h j e l i h a s + p o h j i m m a i s i a + p o h j i m m i l t a a n + p o h j i m m i l t a n i + p o h j i n + p o h j o i s a f r i k a s s a + p o h j o i s a f r i k k a a n + p o h j o i s a f r i k k a l a i n e n + p o h j o i s a f r i k k a l a i s e n + p o h j o i s a f r i k k a l a i s e t + p o h j o i s a f r i k k a l a i s i a + p o h j o i s a f r i k k a l a i s i l l e + p o h j o i s a f r i k k a l a i s t a + p o h j o i s a f r i k k a l a i s t e n + p o h j o i s a l a n k o m a a l a i s t a + p o h j o i s a l u e i l l a + p o h j o i s a m e r i k k a l a i s e e n + p o h j o i s a m e r i k k a l a i s e n + p o h j o i s a m e r i k k a l a i s e s t a + p o h j o i s a m e r i k k a l a i s e t + p o h j o i s a m e r i k k a l a i s i a + p o h j o i s a m e r i k k a l a i s i l l e + p o h j o i s a m e r i k k a l a i s t a + p o h j o i s a m e r i k k a l a i s t e n + p o h j o i s e e n + p o h j o i s e l l a + p o h j o i s e l l e + p o h j o i s e m m a n + p o h j o i s e m m a t + p o h j o i s e m p i e n + p o h j o i s e n + p o h j o i s e n g l a n t i l a i s e n + p o h j o i s e n k a l l i o t ö y h t ö p i n g v i i n i + p o h j o i s e s s a + p o h j o i s e s s a k i n + p o h j o i s e s t a + p o h j o i s e u r o o p p a l a i n e n + p o h j o i s e u r o o p p a l a i s e n + p o h j o i s e u r o o p p a l a i s e n a + p o h j o i s e u r o o p p a l a i s e t + p o h j o i s e u r o o p p a l a i s i l l a + p o h j o i s e u r o o p p a l a i s i s s a + p o h j o i s e u r o o p p a l a i s i s t a + p o h j o i s e u r o o p p a l a i s t a + p o h j o i s i l l a + p o h j o i s i m m a s s a + p o h j o i s i m m a t + p o h j o i s i m m i l l a + p o h j o i s i m m i l l e + p o h j o i s i m m i s s a + p o h j o i s i m m i s t a + p o h j o i s i m p i a + p o h j o i s i m p i e n + p o h j o i s i r l a n t i l a i n e n + p o h j o i s i r l a n t i l a i s e n + p o h j o i s i r l a n t i l a i s e n a + p o h j o i s i r l a n t i l a i s e s t a + p o h j o i s i r l a n t i l a i s i a + p o h j o i s i r l a n t i l a i s i l l e + p o h j o i s i r l a n t i l a i s i l t a + p o h j o i s i r l a n t i l a i s i s t a + p o h j o i s i r l a n t i l a i s t a + p o h j o i s i r l a n t i l a i s t e n + p o h j o i s k a l o t t i + p o h j o i s k a l o t t i a + p o h j o i s k o r e a l a i s e n + p o h j o i s k o r e a l a i s e t + p o h j o i s k o r e a l a i s i a + p o h j o i s k o r e a l a i s i i n + p o h j o i s k o r e a l a i s i l l a + p o h j o i s k o r e a l a i s i l l e + p o h j o i s k o r e a l a i s i s t a + p o h j o i s k o r e a l a i s t a + p o h j o i s k o r e a l a i s t e n + p o h j o i s k o r e a l l e + p o h j o i s k o r e a n + p o h j o i s k o r e a s s a + p o h j o i s k y p r o s l a i n e n + p o h j o i s m a a + p o h j o i s m a a l a i s i l l a + p o h j o i s m a a n + p o h j o i s m a a s s a + p o h j o i s m a a s t a + p o h j o i s m a a t + p o h j o i s m a a t a + p o h j o i s m a i d e n + p o h j o i s m a i h i n + p o h j o i s m a i l l a + p o h j o i s m a i l l e + p o h j o i s m a i l t a + p o h j o i s m a i s e e n + p o h j o i s m a i s e t + p o h j o i s m a i s s a + p o h j o i s m a i s s a k i n + p o h j o i s m a i s t a + p o h j o i s m a i t a + p o h j o i s n a p a + p o h j o i s n a p a a + p o h j o i s n a v a l l a + p o h j o i s n a v a l l e + p o h j o i s n a v a n + p o h j o i s n a v a s t a + p o h j o i s o s a + p o h j o i s o s a a + p o h j o i s o s a a n + p o h j o i s o s a a n s a + p o h j o i s o s a l l e + p o h j o i s o s a n + p o h j o i s o s a s s a + p o h j o i s o s a s s a a n + p o h j o i s o s a t + p o h j o i s o s i e n + p o h j o i s o s i i n + p o h j o i s o s i s s a + p o h j o i s p u o l e l l a + p o h j o i s p u o l e l t a + p o h j o i s p u o l e n + p o h j o i s r a j a n + p o h j o i s r a j a n s a + p o h j o i s r a j o i l l a a n + p o h j o i s r a j o j e n + p o h j o i s r a n n i k k o + p o h j o i s r a n n i k k o a + p o h j o i s r a n n i k o l l a + p o h j o i s r a n n i k o l l e + p o h j o i s r a n n i k o n + p o h j o i s r a n s k a a + p o h j o i s r u o t s a l a i s e t + p o h j o i s r u o t s i n h e v o n e n + p o h j o i s s a a r e t + p o h j o i s s a a r i + p o h j o i s s o t h o n + p o h j o i s s u o m a l a i s i l l e + p o h j o i s s u o m e n k a r j a + p o h j o i s t e n + p o h j o i s t e r r i t o r i o + p o h j o i s u g a n d a l a i s t a + p o h j o i s v i r o l a i s i a + p o h j o l a s s a + p o h j u k a i s s u o l e n + p o h j u k a s s a + p o h j u s t a a + p o h j u s t a a k s e n i + p o h j u s t e t t a v a + p o h j u s t e t t i i n + p o h j u s t e t t u a + p o h j u s t i v a t + p o h k e e n v ä i s t ö + p o h n p e i n k o t t a r a i n e n + p o h n p e i n l u r i + p o h t i a + p o h t i a k s e e n + p o h t i e s s a a n + p o h t i e s s a m m e + p o h t i e s s a n i + p o h t i i + p o h t i k a a + p o h t i k a a m m e + p o h t i k o o n + p o h t i m a a n + p o h t i m a n + p o h t i m a s s a + p o h t i m a t t a + p o h t i m i s a i k a a + p o h t i n e e t + p o h t i n u t + p o h t i s i + p o h t i v a m p i + p o i k a b ä n d i + p o i k a k u o r o + p o i k a k u o r o n + p o i k a l a p s i + p o i k a m i e s a s u n t o j a + p o i k a m i e s i l t a + p o i k a n i + p o i k a n s a + p o i k a s i a + p o i k a s o p r a a n o + p o i k a s t e n + p o i k a v a u v a n + p o i k e t a + p o i k e t a a n + p o i k e t t a v a + p o i k i a + p o i k i s i + p o i k i t t a i s l i i k e n n e + p o i k i t t a i s o h j e l m a l l a + p o i k i t t a i s t u t k i m u s t a + p o i k i t t a i s v ä y l ä t + p o i k k e a a + p o i k k e a m a a + p o i k k e a m a r a j a a + p o i k k e a m a s t a + p o i k k e a m i a + p o i k k e a m i e n + p o i k k e a m i l l a + p o i k k e a m i s i a + p o i k k e a m i s k a u d e l l a + p o i k k e a m i s m a h d o l l i s u u k s i a + p o i k k e a m i s m a h d o l l i s u u s + p o i k k e a m i s m e n e t t e l y + p o i k k e a v a m p i + p o i k k e a v a t + p o i k k e a v i a + p o i k k e a v i e n + p o i k k e a v u u d e t + p o i k k e a v u u k s i a + p o i k k e a v u u s n e g a t i i v i s u u s + p o i k k e u k s e l l a + p o i k k e u k s e l l i s e m p i + p o i k k e u k s e l l i s e n + p o i k k e u k s e l l i s e s s a + p o i k k e u k s e l l i s e s t a + p o i k k e u k s e l l i s e t + p o i k k e u k s e l l i s i a + p o i k k e u k s e l l i s i i n + p o i k k e u k s e l l i s i s s a + p o i k k e u k s e l l i s i s t a + p o i k k e u k s e l l i s t a + p o i k k e u k s e n + p o i k k e u k s e n a + p o i k k e u k s e s t a + p o i k k e u k s e t + p o i k k e u k s e t t a + p o i k k e u k s i a + p o i k k e u k s i a k i n + p o i k k e u k s i i n + p o i k k e u k s i k s i + p o i k k e u k s i l l a + p o i k k e u k s i n + p o i k k e u k s i n a + p o i k k e u k s i s s a + p o i k k e u k s i s t a + p o i k k e u k s i t t a + p o i k k e u s a i k o j a + p o i k k e u s a j a n + p o i k k e u s a j a n j a k s o a + p o i k k e u s a p u a + p o i k k e u s a s e m a + p o i k k e u s a s e m a a n + p o i k k e u s a s e m a n + p o i k k e u s a s e t u k s e e n + p o i k k e u s a s e t u k s i l l a + p o i k k e u s a s e t u k s i l l e + p o i k k e u s a s e t u s + p o i k k e u s a s e t u s t e n + p o i k k e u s e h d o n + p o i k k e u s e h d o t + p o i k k e u s e h d o t u k s i a + p o i k k e u s e h t o j a + p o i k k e u s e h t o j e n + p o i k k e u s h a k e m u k s e t + p o i k k e u s h a k e m u s t e n + p o i k k e u s i s t u n t o o n + p o i k k e u s j a k e l u j ä r j e s t e l m ä n + p o i k k e u s j a k s o + p o i k k e u s j a k s o a + p o i k k e u s j a k s o n + p o i k k e u s j ä r j e s t e l m i s s ä + p o i k k e u s j ä r j e s t e l m i s t ä + p o i k k e u s j ä r j e s t e l m ä + p o i k k e u s j ä r j e s t e l m ä n + p o i k k e u s j ä r j e s t e l m ä ä + p o i k k e u s j ä r j e s t e l m ä ä n + p o i k k e u s j ä r j e s t e l y + p o i k k e u s j ä r j e s t e l y i s s ä + p o i k k e u s j ä r j e s t e l y j ä + p o i k k e u s j ä r j e s t e l y n + p o i k k e u s j ä r j e s t e l y s t ä + p o i k k e u s j ä r j e s t e l y ä + p o i k k e u s k a u d e n + p o i k k e u s k a u t t a + p o i k k e u s k r i t e e r i t + p o i k k e u s l a e i l t a + p o i k k e u s l a i n + p o i k k e u s l a i n s ä ä d ä n n ö n + p o i k k e u s l a i n s ä ä d ä n t ö + p o i k k e u s l a i n s ä ä d ä n t ö ä + p o i k k e u s l a k e i h i n + p o i k k e u s l a k e j a + p o i k k e u s l a k i a + p o i k k e u s l a k i e n + p o i k k e u s l a u s e k e + p o i k k e u s l a u s e k e m e n e t e l m ä + p o i k k e u s l a u s e k e s o p i m u k s e t + p o i k k e u s l a u s e k e t t a + p o i k k e u s l a u s e k k e e n + p o i k k e u s l a u s e k k e e s e e n + p o i k k e u s l a u s e k k e e t + p o i k k e u s l a u s e k k e i d e n + p o i k k e u s l a u s e k k e i l l a + p o i k k e u s l a u s e k k e i s t a + p o i k k e u s l a u s e k k e i t a + p o i k k e u s l i s t a n + p o i k k e u s l u e t t e l o + p o i k k e u s l u e t t e l o a + p o i k k e u s l u e t t e l o l l a + p o i k k e u s l u e t t e l o n + p o i k k e u s l u e t t e l o o n + p o i k k e u s l u e t t e l o s s a + p o i k k e u s l u o n t e i n e n + p o i k k e u s l u o n t e i s t a + p o i k k e u s l u p a a + p o i k k e u s l u p a m e n e t t e l y s t ä + p o i k k e u s l u p a p y y n n ö n + p o i k k e u s l u p a p y y n n ö s s ä + p o i k k e u s l u p i a + p o i k k e u s l u v a n + p o i k k e u s l u v a t + p o i k k e u s m a h d o l l i s u u d e t + p o i k k e u s m a h d o l l i s u u k s i a + p o i k k e u s m e k a n i s m i + p o i k k e u s m e k a n i s m i l l a + p o i k k e u s m e k a n i s m i n + p o i k k e u s m e n e t t e l y i n + p o i k k e u s m e n e t t e l y j e n + p o i k k e u s m e n e t t e l y n + p o i k k e u s m ä ä r ä a i k a a + p o i k k e u s m ä ä r ä y k s e l l ä + p o i k k e u s m ä ä r ä y k s e t + p o i k k e u s m ä ä r ä y k s i ä + p o i k k e u s o i k e u s + p o i k k e u s o l o i l l a + p o i k k e u s o l o i s s a + p o i k k e u s o l o i s t a + p o i k k e u s o l o j a + p o i k k e u s o l o s u h t e i s i i n + p o i k k e u s o l o s u h t e i s s a + p o i k k e u s o l o s u h t e i t a + p o i k k e u s o l o t + p o i k k e u s p e r i a a t t e e t + p o i k k e u s p y k ä l ä ä n + p o i k k e u s p y y n t ö j e n + p o i k k e u s p ö y t ä k i r j a + p o i k k e u s r a h a s t o n + p o i k k e u s r y h m i i n + p o i k k e u s s o p i m u s + p o i k k e u s s u o j e l u a + p o i k k e u s s y i s t ä + p o i k k e u s s ä ä d ö k s i ä + p o i k k e u s s ä ä d ö s + p o i k k e u s s ä ä n n ö i n + p o i k k e u s s ä ä n n ö i s t ä + p o i k k e u s s ä ä n n ö k s e n + p o i k k e u s s ä ä n n ö k s e t + p o i k k e u s s ä ä n n ö k s i i n + p o i k k e u s s ä ä n n ö k s i l l e + p o i k k e u s s ä ä n n ö k s i l l ä + p o i k k e u s s ä ä n n ö k s i s t ä + p o i k k e u s s ä ä n n ö k s i ä + p o i k k e u s s ä ä n n ö s + p o i k k e u s s ä ä n n ö s t e n + p o i k k e u s s ä ä n n ö s t ä + p o i k k e u s s ä ä n n ö t + p o i k k e u s s ä ä n t ö + p o i k k e u s s ä ä n t ö j e n + p o i k k e u s s ä ä n t ö j ä + p o i k k e u s t a + p o i k k e u s t a p a u k s e e n + p o i k k e u s t a p a u k s e k s i + p o i k k e u s t a p a u k s e n a + p o i k k e u s t a p a u k s e s s a + p o i k k e u s t a p a u k s e s t a + p o i k k e u s t a p a u k s e t + p o i k k e u s t a p a u k s i a + p o i k k e u s t a p a u k s i i n + p o i k k e u s t a p a u k s i s s a + p o i k k e u s t a p a u k s i s t a + p o i k k e u s t a p a u s + p o i k k e u s t a r v e t t a + p o i k k e u s t e n + p o i k k e u s t i l a + p o i k k e u s t i l a a + p o i k k e u s t i l a l a i n + p o i k k e u s t i l a n + p o i k k e u s t i l a n n e + p o i k k e u s t i l a n t e e n + p o i k k e u s t i l a n t e e s s a + p o i k k e u s t i l a n t e i d e n + p o i k k e u s t i l a n t e i s i i n + p o i k k e u s t i l a n t e i s s a + p o i k k e u s t i l a n t e i t a + p o i k k e u s t i l a s s a + p o i k k e u s t i l a s t a + p o i k k e u s t i l a s ä ä n n ö k s i ä + p o i k k e u s t i l a s ä ä n n ö n + p o i k k e u s t i l a s ä ä n t ö j e n + p o i k k e u s t i l a t o i m e t + p o i k k e u s t o i m e n a + p o i k k e u s t o i m e n p i t e e s t ä + p o i k k e u s t o i m e n p i t e e t + p o i k k e u s t o i m e n p i t e i k s i + p o i k k e u s t o i m e n p i t e i s i i n + p o i k k e u s t o i m e n p i t e i s t ä + p o i k k e u s t o i m e n p i t e i t ä + p o i k k e u s t o i m e t + p o i k k e u s t o i m i a + p o i k k e u s t o i m i e n + p o i k k e u s t o i m i i n + p o i k k e u s t u k e a + p o i k k e u s t u k i a + p o i k k e u s t u o m i o i s t u i n t e n + p o i k k e u s t y y p e i s s ä + p o i k k e u s v a l t i o i t a + p o i k k e u s v ä l i n e + p o i k k i l e i k k a u k s e n o m a i s e s t i + p o i k k i l e i k k a u s a i n e i s t o + p o i k k i l e i k k a u s d i r e k t i i v i n + p o i k k i l e i k k a u s p o l i t i i k a t + p o i k k i l e i k k a u s p o l i t i i k k o j a + p o i k k i p i e n a t + p o i m i a + p o i m i m a s t a + p o i m i v a t + p o i m u a j o + p o i m u h i e r a k k a + p o i m u n a p a l a k k i + p o i m u v i t a + p o i s h e i t t o j ä r j e s t e l m ä + p o i s h e i t t o j ä r j e s t e l m ä ä + p o i s h e i t t o k i e l l o l l a + p o i s h e i t t o k i e l l o n + p o i s h e i t t o k i e l t o + p o i s h e i t t o k i e l t o a + p o i s h e i t t o s k a n d a a l i n + p o i s s a o l e v a a + p o i s s a o l e v a n a + p o i s s a o l o a + p o i s s a o l o a j a n + p o i s s a o l o j e n + p o i s s a o l o k o h t a u s + p o i s s a o l o l l a a n + p o i s s u l k e m i s j ä r j e s t e l m ä m m e + p o i s s u l k e m i s m e k a n i s m i + p o i s s u l k e m i s m e k a n i s m i k s i + p o i s s u l k e m i s m e n e t e l m ä + p o i s s u l k e m i s p e r u s t e i d e n + p o i s s u l k e m i s p e r u s t e i t a + p o i s s u l k e m i s t o i m i a + p o i s s u l k e v a a + p o i s t a a + p o i s t a a k s e e n + p o i s t a a k s e m m e + p o i s t a a k s e n i + p o i s t a e s s a m m e + p o i s t a i s i + p o i s t a i s i v a t + p o i s t a k a a + p o i s t a k a a m m e + p o i s t a m a a n + p o i s t a m a l l a + p o i s t a m a t t a + p o i s t a m i s e e n + p o i s t a m i s e k s i + p o i s t a m i s e l l e + p o i s t a m i s e n + p o i s t a m i s e s s a + p o i s t a m i s e s t a + p o i s t a m i s i s t a + p o i s t a m i s o h j e l m a s s a + p o i s t a m i s s t r a t e g i a s t a + p o i s t a m i s s u u n n i t e l m i e n + p o i s t a m i s t a + p o i s t a m m e + p o i s t a n e e t + p o i s t a n u t + p o i s t a t t e + p o i s t a v a n + p o i s t a v a t + p o i s t e t a a n + p o i s t e t a a n k o + p o i s t e t t a i s i i n + p o i s t e t t i i n + p o i s t e t t u + p o i s t e t t u a + p o i s t e t u n + p o i s t e t u t + p o i s t i + p o i s t o a j a k s i + p o i s t o i l m a l ä m p ö p u m p p u + p o i s t o j ä r j e s t e l m i i n + p o i s t o j ä r j e s t e l m ä n + p o i s t o k a u d e t + p o i s t o m e n e t e l m i e n + p o i s t o s u u n n i t e l m a n + p o i s t o t u k i e n + p o i s t u a + p o i s t u i + p o i s t u i m m e + p o i s t u i s i + p o i s t u i v a t + p o i s t u k a a + p o i s t u m a a n + p o i s t u m a l l a + p o i s t u m i s i k ä + p o i s t u m i s m e n e t t e l y + p o i s t u m i s m e n e t t e l y n + p o i s t u m i s s t r a t e g i a + p o i s t u m i s s t r a t e g i a a + p o i s t u m i s s u u n n i t e l m a + p o i s t u n + p o i s t u n e e t + p o i s t u n u t + p o i s t u t t a v a + p o i s t u u + p o i s t u v a n + p o i s t u v a t + p o j a n + p o j a s t a a n + p o j i l l e k i n + p o j i s t a m m e + p o k e r i a + p o k e r i n p e l a a j a + p o k e r i n p e l a a j a n + p o k e r i n p e l a a j i n a + p o k e r i p e l i + p o k e r i p e l i i n + p o k e r i p e l i s s ä + p o k e r i p e l i ä + p o k e r i s s a + p o k e r i s t a + p o k e r i t e r m e i s t ä + p o k k u r o i n n i s t a + p o l a a r i m a t a l a + p o l a a r i v u o d e n + p o l a a r i v u o s i + p o l a a r i v u o t t a + p o l a r i s o i t u m i s k e h i t y k s e n + p o l a r i s o i t u u + p o l d e r i e k o p i s t e j ä r j e s t e l m ä ä + p o l d e r i m a i s e m a + p o l d e r i m a l l i + p o l d e r i t a l o u d e n + p o l d e r i v a l l i t + p o l e m i i k k i a + p o l e m i s o i d a + p o l i i s e i h i n + p o l i i s e i k s i + p o l i i s e i l l a + p o l i i s e i l l a k i n + p o l i i s e i l l e + p o l i i s e i n a + p o l i i s e i n e e n + p o l i i s e i s t a + p o l i i s e j a + p o l i i s i a + p o l i i s i a k a t e m i a + p o l i i s i a k a t e m i a a + p o l i i s i a k a t e m i a a n + p o l i i s i a k a t e m i a l l a + p o l i i s i a k a t e m i a l l e + p o l i i s i a k a t e m i a n + p o l i i s i a k a t e m i a s t a + p o l i i s i a l a l l a + p o l i i s i a l u e e n + p o l i i s i a m m a t t i k o r k e a k o u l u + p o l i i s i a s e m a + p o l i i s i a s e m a a + p o l i i s i a s e m a l l a + p o l i i s i a s e m a l l e + p o l i i s i a s e m a n + p o l i i s i a s e m i a + p o l i i s i a s e m i e n + p o l i i s i a s e m i i n + p o l i i s i a s e m i l l a + p o l i i s i a s e m i l l e + p o l i i s i a s i a + p o l i i s i a s i a i n + p o l i i s i a s i a n a + p o l i i s i a s i a n t u n t i j a r y h m ä n + p o l i i s i a s i o i d e n + p o l i i s i a s i o i h i n + p o l i i s i a s i o i s s a + p o l i i s i a s i o i s t a + p o l i i s i a s i o i t a + p o l i i s i a u t o + p o l i i s i a u t o o n + p o l i i s i e d u s t u s t o m m e + p o l i i s i e l i m i l l e + p o l i i s i e l i m i ä + p o l i i s i e l i n + p o l i i s i e m m e + p o l i i s i e n + p o l i i s i f i a s k o o n + p o l i i s i h a l l i n n o n + p o l i i s i h a l l i n t o + p o l i i s i h e n k i l ö s t ö ä + p o l i i s i i n + p o l i i s i j o h t o + p o l i i s i j o u k k o i h i n + p o l i i s i j o u k k o j a + p o l i i s i j o u k k o j e n + p o l i i s i j o u k o i l l a + p o l i i s i j o u k o i l l e + p o l i i s i j o u k o i s s a + p o l i i s i j o u k o i s t a + p o l i i s i j o u k o t + p o l i i s i j ä r j e s t e l m i e n + p o l i i s i j ä r j e s t e l m i ä m m e + p o l i i s i j ä r j e s t e l m ä n + p o l i i s i j ä r j e s t e l m ä t + p o l i i s i j ä r j e s t e l m ä ä + p o l i i s i j ä r j e s t ö i h i n + p o l i i s i j ä r j e s t ö j e n + p o l i i s i j ä r j e s t ö ä + p o l i i s i k e i n o i n + p o l i i s i k e i n o j a + p o l i i s i k e r t o m u k s i s t a + p o l i i s i k o i r a + p o l i i s i k o m i s a r i o + p o l i i s i k o m i s s a a r i + p o l i i s i k o m p o n e n t t i + p o l i i s i k o n s t a a p e l i a + p o l i i s i k o n s t a a p e l i n + p o l i i s i k o r k e a k o u l u i d e a n + p o l i i s i k o u l u + p o l i i s i k o u l u a + p o l i i s i k o u l u j a + p o l i i s i k o u l u n + p o l i i s i k o u l u o p i s t o n + p o l i i s i k o u l u t t a j i e n + p o l i i s i k o u l u t u k s e n + p o l i i s i k o u l u t u k s e s s a + p o l i i s i k o u l u t u k s e s t a + p o l i i s i k o u l u t u s + p o l i i s i k o u l u t u s o h j e l m a t + p o l i i s i k o u l u t u s o p e r a a t i o + p o l i i s i k o u l u t u s o p e r a a t i o o n + p o l i i s i k u n n a s t a + p o l i i s i k u n t a + p o l i i s i k u n t a a n + p o l i i s i k u s t a n n u k s i s s a + p o l i i s i k u u l u s t e l u i h i n + p o l i i s i k y s y m y k s e n ä + p o l i i s i k y s y m y k s e s t ä + p o l i i s i l a b o r a t o r i o i d e n + p o l i i s i l a i n s ä ä d ä n n ö s t ä + p o l i i s i l a i t o k s e l l e + p o l i i s i l a i t o k s e n + p o l i i s i l a i t o k s e s s a + p o l i i s i l a i t o k s i a + p o l i i s i l a i t o k s i l l a + p o l i i s i l a i t o k s i l l a m m e + p o l i i s i l a i t o s + p o l i i s i l a i t o s t e n + p o l i i s i l i i t t o + p o l i i s i l l a + p o l i i s i l l e + p o l i i s i l l e k i n + p o l i i s i l u p a + p o l i i s i l ä h t ö i s e n + p o l i i s i m a h d i n + p o l i i s i m e n e t t e l y n + p o l i i s i m e s t a r i + p o l i i s i m e s t a r i e n + p o l i i s i m i n i s t e r i + p o l i i s i m m e + p o l i i s i m u u r e i h i n + p o l i i s i m ä ä r ä + p o l i i s i m ä ä r ä ä h ä n + p o l i i s i n + p o l i i s i n a + p o l i i s i o p e r a a t i o + p o l i i s i o p e r a a t i o i d e n + p o l i i s i o p e r a a t i o i h i n + p o l i i s i o p e r a a t i o i s t a + p o l i i s i o p e r a a t i o l l e + p o l i i s i o p e r a a t i o m m e + p o l i i s i o p e r a a t i o n + p o l i i s i o p e r a a t i o o n + p o l i i s i o p e r a a t i o s t a + p o l i i s i o p e r a a t i o t + p o l i i s i o p e r a a t i o t a + p o l i i s i o p i s t o + p o l i i s i o p i s t o j e n + p o l i i s i o p i s t o n + p o l i i s i o p p i l a i t o k s i s s a + p o l i i s i o r g a n i s a a t i o + p o l i i s i o r g a n i s a a t i o k s i + p o l i i s i o s a s t o n + p o l i i s i p a l v e l u + p o l i i s i p a l v e l u j a + p o l i i s i p a l v e l u j e n + p o l i i s i p a l v e l u n + p o l i i s i p a r t i o i t a + p o l i i s i p a r t i o n + p o l i i s i p i i r i s s ä + p o l i i s i p ä ä l l i k k ö + p o l i i s i p ä ä l l i k ö i d e n + p o l i i s i p ä ä l l i k ö l l e + p o l i i s i p ä ä l l i k ö n + p o l i i s i p ä ä l l y s t ö ö n + p o l i i s i r a p o r t e i s s a + p o l i i s i r a p o r t e i s t a + p o l i i s i r a p o r t i s s a + p o l i i s i r a t s i o i t a + p o l i i s i r a u k k a + p o l i i s i r e k i s t e r i o s a s t o n + p o l i i s i r o m a a n i + p o l i i s i r y h m ä n + p o l i i s i s i m p u t u k s e n + p o l i i s i s s a + p o l i i s i s t a + p o l i i s i s u o j e l u a + p o l i i s i s u o j e l u s s a + p o l i i s i t + p o l i i s i t a r k a s t u k s i a + p o l i i s i t a r k a s t u k s i s s a + p o l i i s i t a r k a s t u k s i s t a + p o l i i s i t e h t ä v ä n + p o l i i s i t e h t ä v ä t + p o l i i s i t e r r o r i a + p o l i i s i t e r r o r i i n + p o l i i s i t i e d o t + p o l i i s i t i e d u s t e l u + p o l i i s i t i e t o j a + p o l i i s i t i e t o j e n + p o l i i s i t o i m e a + p o l i i s i t o i m e k s i + p o l i i s i t o i m e n + p o l i i s i t o i m e n p i t e i d e n + p o l i i s i t o i m e n p i t e i s t ä + p o l i i s i t o i m e s s a + p o l i i s i t o i m e t + p o l i i s i t o i m i + p o l i i s i t o i m i a + p o l i i s i t o i m i e n + p o l i i s i t o i m i i n + p o l i i s i t o i m i l l a + p o l i i s i t o i m i l l e + p o l i i s i t o i m i n + p o l i i s i t o i m i n n a n + p o l i i s i t o i m i n n a s s a + p o l i i s i t o i m i n n a s t a + p o l i i s i t o i m i n t a + p o l i i s i t o i m i n t a a + p o l i i s i t o i m i n t a a n + p o l i i s i t o i m i n t a s u u n n i t e l m a a + p o l i i s i t o i m i n t o j e n + p o l i i s i t o i m i s s a + p o l i i s i t o i m i s t a + p o l i i s i t u o m i o i s t u i n + p o l i i s i t u t k i m u k s e n + p o l i i s i t u t k i m u k s e t + p o l i i s i t u t k i m u k s i s t a + p o l i i s i t u t k i m u s + p o l i i s i t u t k i n n a n + p o l i i s i t u t k i n n a s s a + p o l i i s i t u t k i n t a + p o l i i s i t u t k i n t a a + p o l i i s i t y ö + p o l i i s i t y ö h ö n + p o l i i s i t y ö n + p o l i i s i t y ö s s ä + p o l i i s i t y ö t ä + p o l i i s i u p s e e r e i l l e + p o l i i s i u p s e e r i + p o l i i s i u p s e e r i e n + p o l i i s i u u d i s t u k s e n + p o l i i s i u u d i s t u k s e s s a + p o l i i s i u u d i s t u s + p o l i i s i u u d i s t u s t a + p o l i i s i v a l l a l l a + p o l i i s i v a l l a n + p o l i i s i v a l m i u k s i a + p o l i i s i v a l t i o + p o l i i s i v a l t i o f i l o s o f i a a n + p o l i i s i v a l t i o i d e n + p o l i i s i v a l t i o i k s i + p o l i i s i v a l t i o k s i + p o l i i s i v a l t i o l l e + p o l i i s i v a l t i o n + p o l i i s i v a l t i o n a + p o l i i s i v a l t i o o n + p o l i i s i v a l t i o s s a + p o l i i s i v a l t i o s t a + p o l i i s i v a l t i o t a + p o l i i s i v a l t u u k s i n + p o l i i s i v a l v o n n a l l a + p o l i i s i v a l v o n n a l l e + p o l i i s i v a l v o n n a n + p o l i i s i v a l v o n n a s t a + p o l i i s i v a l v o n t a + p o l i i s i v a l v o n t a a + p o l i i s i v a l v o n t a j ä r j e s t e l m ä n + p o l i i s i v a r t i o i n t i a + p o l i i s i v e r k o s t o n + p o l i i s i v i r a n o m a i n e n + p o l i i s i v i r a n o m a i s e k s i + p o l i i s i v i r a n o m a i s e l l a + p o l i i s i v i r a n o m a i s e m m e + p o l i i s i v i r a n o m a i s e n + p o l i i s i v i r a n o m a i s e n a + p o l i i s i v i r a n o m a i s e t + p o l i i s i v i r a n o m a i s i a + p o l i i s i v i r a n o m a i s i a a n + p o l i i s i v i r a n o m a i s i i n + p o l i i s i v i r a n o m a i s i l l a + p o l i i s i v i r a n o m a i s i l l e + p o l i i s i v i r a n o m a i s i l t a + p o l i i s i v i r a n o m a i s i s s a + p o l i i s i v i r a n o m a i s t a + p o l i i s i v i r a n o m a i s t e n + p o l i i s i v i r a s t o + p o l i i s i v i r a s t o a + p o l i i s i v i r a s t o k s i + p o l i i s i v i r a s t o l l a + p o l i i s i v i r a s t o l l e + p o l i i s i v i r a s t o n + p o l i i s i v i r a s t o o n + p o l i i s i v i r a s t o s t a + p o l i i s i v i r k a i l i j o i d e n + p o l i i s i v i r k a m i e s + p o l i i s i v o i m a + p o l i i s i v o i m a a + p o l i i s i v o i m a m m e + p o l i i s i v o i m a n s a + p o l i i s i v o i m a t + p o l i i s i v o i m i a + p o l i i s i v o i m i a a n + p o l i i s i v o i m i a m m e + p o l i i s i v o i m i e n + p o l i i s i v o i m i e n s a + p o l i i s i v o i m i i n + p o l i i s i v o i m i i n s a + p o l i i s i v o i m i l l a + p o l i i s i v o i m i l l a m m e + p o l i i s i v o i m i l l e + p o l i i s i v o i m i l l e k i n + p o l i i s i v o i m i l t a + p o l i i s i v o i m i n a + p o l i i s i v o i m i n e e n + p o l i i s i v o i m i s s a + p o l i i s i v o i m i s t a + p o l i i s i v ä k i v a l l a s t a + p o l i i s i v ä k i v a l t a + p o l i i s i v ä k i v a l t a a + p o l i i s i v ä k i v a l t a a n + p o l i i s i y h t e i s t y ö + p o l i i s i y h t e i s t y ö e l i m e n + p o l i i s i y h t e i s t y ö h ö n + p o l i i s i y h t e i s t y ö j ä r j e s t e l m i ä + p o l i i s i y h t e i s t y ö k s i + p o l i i s i y h t e i s t y ö l l e + p o l i i s i y h t e i s t y ö l l ä + p o l i i s i y h t e i s t y ö n + p o l i i s i y h t e i s t y ö o p e r a a t i o + p o l i i s i y h t e i s t y ö r y h m ä + p o l i i s i y h t e i s t y ö s s ä + p o l i i s i y h t e i s t y ö s t ä + p o l i i s i y h t e i s t y ö s t ä k ä ä n + p o l i i s i y h t e i s t y ö t o i m i n t a + p o l i i s i y h t e i s t y ö t ä + p o l i i s i y h t e i s t y ö t ä ä n + p o l i i s i y k s i k k ö + p o l i i s i y k s i k k ö j e m m e + p o l i i s i y k s i k k ö j e n + p o l i i s i y k s i k k ö ä + p o l i i s i y k s i k k ö ö n + p o l i i s i y k s i k ö i d e n + p o l i i s i y k s i k ö i t ä + p o l i i s i y k s i k ö k s i + p o l i i s i y k s i k ö n + p o l i i s i y k s i k ö t + p o l i i t i k k o a + p o l i i t i k k o i n a + p o l i i t i k k o j a + p o l i i t i k k o j e m m e + p o l i i t i k k o j e n + p o l i i t i k k o k o l l e g a n s a + p o l i i t i k k o n a + p o l i i t i k k o r y h m ä n + p o l i i t i k k o s u k u p o l v e e n + p o l i i t i k k o s u k u p o l v e l l a + p o l i i t i k k o s u k u p o l v e m m e + p o l i i t i k k o y s t ä v i l l e + p o l i i t i k o i l l a + p o l i i t i k o i l l e + p o l i i t i k o i s s a + p o l i i t i k o i s t a + p o l i i t i k o n + p o l i i t i k o t + p o l i i t t i s e e n + p o l i i t t i s e k s i + p o l i i t t i s e l l a + p o l i i t t i s e l l e + p o l i i t t i s e l t a + p o l i i t t i s e m m a k s i + p o l i i t t i s e m m a l l a + p o l i i t t i s e m m a l l e + p o l i i t t i s e m m a n + p o l i i t t i s e m m a s s a + p o l i i t t i s e m m a s t a + p o l i i t t i s e m m a t + p o l i i t t i s e m m i k s i + p o l i i t t i s e m m i n + p o l i i t t i s e m m i s t a + p o l i i t t i s e m p a a + p o l i i t t i s e m p a a n + p o l i i t t i s e m p i + p o l i i t t i s e m p i a + p o l i i t t i s e m p i i n + p o l i i t t i s e n + p o l i i t t i s e n a + p o l i i t t i s e n k i n + p o l i i t t i s e s s a + p o l i i t t i s e s t a + p o l i i t t i s e s t i k i n + p o l i i t t i s e t + p o l i i t t i s i a + p o l i i t t i s i i n + p o l i i t t i s i k s i + p o l i i t t i s i l l a + p o l i i t t i s i l l e + p o l i i t t i s i l t a + p o l i i t t i s i m p a n a + p o l i i t t i s i n + p o l i i t t i s i n a + p o l i i t t i s i s s a + p o l i i t t i s i s t a + p o l i i t t i s i s t a k i n + p o l i i t t i s l u o n t e i n e n + p o l i i t t i s l u o n t e i s e n + p o l i i t t i s l u o n t e i s e t + p o l i i t t i s l u o n t e i s i a + p o l i i t t i s l u o n t e i s t e n + p o l i i t t i s t e n + p o l i k l i n i k k a h o i d o s t a + p o l i o n j ä l k e i n e n + p o l i o r o k o t e + p o l i t i i k a k s i + p o l i t i i k a l l a + p o l i t i i k a l l a a n + p o l i t i i k a l l a m m e + p o l i t i i k a l l e + p o l i t i i k a l t a + p o l i t i i k a n + p o l i t i i k a n a l a + p o l i t i i k a n a l a a + p o l i t i i k a n a l a a n + p o l i t i i k a n a l a l l a + p o l i t i i k a n a l a l l e + p o l i t i i k a n a l a n + p o l i t i i k a n a l a n a + p o l i t i i k a n a l a s t a + p o l i t i i k a n a l a t + p o l i t i i k a n a l o i h i n + p o l i t i i k a n a l o i l l a + p o l i t i i k a n a l o i l l e + p o l i t i i k a n a l o i s t a + p o l i t i i k a n a l o j a + p o l i t i i k a n a l o j e n + p o l i t i i k a n h a r j o i t t a j i a + p o l i t i i k a n h a r j o i t t a j i l l e + p o l i t i i k a n k i n + p o l i t i i k a n l o h k o + p o l i t i i k a n p e s u s t a + p o l i t i i k a n t a j u s t a + p o l i t i i k a n t e k i j ö i d e n + p o l i t i i k a n t e k i j ö i n ä + p o l i t i i k a n t e k i j ö i t ä + p o l i t i i k a n t e k o o n + p o l i t i i k a n t e k o v ä l i n e i t ä + p o l i t i i k a n t u t k i j a + p o l i t i i k a n v a i h d o s + p o l i t i i k a s s a + p o l i t i i k a s s a a n + p o l i t i i k a s s a k a a n + p o l i t i i k a s s a k i n + p o l i t i i k a s s a m m e + p o l i t i i k a s t a + p o l i t i i k a s t a m m e + p o l i t i i k a t + p o l i t i i k k a a + p o l i t i i k k a a k i n + p o l i t i i k k a a m m e + p o l i t i i k k a a n + p o l i t i i k k a a n s a + p o l i t i i k k a k e s k e i s e m p i ä + p o l i t i i k k a k e s k u s t e l u u n + p o l i t i i k k a k i n + p o l i t i i k k a l o h k o j a + p o l i t i i k k a l ä h t ö i s e l l ä + p o l i t i i k k a l ä h t ö i s e n + p o l i t i i k k a m m e + p o l i t i i k k a n a + p o l i t i i k k a n s a + p o l i t i i k k a s u o s i t u k s e t + p o l i t i i k k a t o i m e n p i t e e n + p o l i t i i k k a t o i m i e m m e + p o l i t i i k k a v ä l i n e i d e n + p o l i t i i k k a y h d i s t e l m ä + p o l i t i i k k a y h d i s t e l m ä s s ä + p o l i t i i k k a y h d i s t e l m ä ä + p o l i t i i k k a y h d i s t e l m ä ä n + p o l i t i i k k o i h i n + p o l i t i i k k o i h i n s a + p o l i t i i k k o i n a + p o l i t i i k k o j a + p o l i t i i k k o j a a n + p o l i t i i k k o j a m m e + p o l i t i i k k o j e m m e + p o l i t i i k k o j e n + p o l i t i i k o i l l a + p o l i t i i k o i l l e + p o l i t i i k o i s s a + p o l i t i i k o i s s a m m e + p o l i t i i k o i s t a + p o l i t i i k o i s t a a n + p o l i t i i k o i t a + p o l i t i k o i d a + p o l i t i k o i n n i n + p o l i t i k o i n n i s t a + p o l i t i k o i n t i a + p o l i t i s o i d a + p o l i t i s o i n t i s t r a t e g i a s s a a n + p o l i t i s o i t u i + p o l i t i s o i t u i s i + p o l i t i s o i t u n u t + p o l j e t a a n + p o l j e t t u + p o l k a i s t a v a + p o l k a i s t i i n + p o l k e a + p o l k e e + p o l k e m a a n + p o l k e m a l l a + p o l k e m i s e e n + p o l k e m i s t a + p o l k e v a t + p o l k e v i s t a + p o l k k a t u k k a + p o l k u a + p o l k u h i n n o i l l a + p o l k u h i n t a a n + p o l k u h i n t a l a i n s ä ä d ä n n ö n + p o l k u h i n t o j a + p o l k u j a a n + p o l k u j u o k s u + p o l k u m e n e t t e l y t + p o l k u m y y n n i l l e + p o l k u m y y n n i l l ä + p o l k u m y y n n i l t ä + p o l k u m y y n n i n + p o l k u m y y n n i s t ä + p o l k u m y y n t i + p o l k u m y y n t i a l a l l a + p o l k u m y y n t i a s e t u k s e n + p o l k u m y y n t i a s e t u s t e n + p o l k u m y y n t i h i n n a t + p o l k u m y y n t i h i n n o i l l a + p o l k u m y y n t i h i n n o i n + p o l k u m y y n t i h i n t a a n + p o l k u m y y n t i h i n t o j a + p o l k u m y y n t i h i n t o j e n + p o l k u m y y n t i i n + p o l k u m y y n t i j ä r j e s t e l m ä m m e + p o l k u m y y n t i k e s k u s t e l u s t a + p o l k u m y y n t i k i l p a i l u n + p o l k u m y y n t i k i s a s s a + p o l k u m y y n t i k o m i t e a + p o l k u m y y n t i k o m i t e a n + p o l k u m y y n t i k o o d i a + p o l k u m y y n t i k y s y m y k s e e n + p o l k u m y y n t i k ä y t ä n n ö i l l e + p o l k u m y y n t i k ä y t ä n n ö i s t ä + p o l k u m y y n t i k ä y t ä n n ö t + p o l k u m y y n t i k ä y t ä n t ö j e n + p o l k u m y y n t i l a i n s ä ä d ä n n ö n + p o l k u m y y n t i m a k s u + p o l k u m y y n t i m a r g i n a a l i + p o l k u m y y n t i m e n e t e l m ä t + p o l k u m y y n t i m e n e t t e l y i s t ä + p o l k u m y y n t i m e n e t t e l y j e n + p o l k u m y y n t i m e n e t t e l y j ä + p o l k u m y y n t i m e n e t t e l y n + p o l k u m y y n t i o n g e l m a n + p o l k u m y y n t i p a i k k a n a + p o l k u m y y n t i p a l k k o j a + p o l k u m y y n t i p o l i t i i k k a + p o l k u m y y n t i p o l i t i i k k a a + p o l k u m y y n t i s ä ä n n ö i s t ä + p o l k u m y y n t i s ä ä n n ö t + p o l k u m y y n t i s ä ä n t ö j ä + p o l k u m y y n t i t a p a u k s e s s a + p o l k u m y y n t i t a p a u k s e t + p o l k u m y y n t i t a p a u k s i a + p o l k u m y y n t i t a p a u k s i s s a + p o l k u m y y n t i t a p a u s + p o l k u m y y n t i t a p a u s t a + p o l k u m y y n t i t a p a u s t e n + p o l k u m y y n t i t i l a n t e e s e e n + p o l k u m y y n t i t o i m e n p i t e e t + p o l k u m y y n t i t o i m e n p i t e i d e n + p o l k u m y y n t i t o i m e n p i t e i s i i n + p o l k u m y y n t i t o i m e n p i t e i s t ä + p o l k u m y y n t i t o i m e n p i t e i t ä + p o l k u m y y n t i t o i m e t + p o l k u m y y n t i t o i m i a + p o l k u m y y n t i t o i m i l l a + p o l k u m y y n t i t u l l e i k s i + p o l k u m y y n t i t u l l e i l l a + p o l k u m y y n t i t u l l e i s t a + p o l k u m y y n t i t u l l e j a + p o l k u m y y n t i t u l l i a + p o l k u m y y n t i t u l l i e n + p o l k u m y y n t i t u l l i l l e + p o l k u m y y n t i t u l l i t + p o l k u m y y n t i t u t k i m u k s e t + p o l k u m y y n t i t u t k i m u k s i a + p o l k u m y y n t i t u t k i m u s + p o l k u m y y n t i t u t k i m u s t a + p o l k u m y y n t i v a i k u t u k s e t + p o l k u m y y n t i v a l i t u k s i a + p o l k u m y y n t i v i e n t i + p o l k u m y y n t i ä + p o l k u p y ö r ä i l y ä + p o l k u p y ö r ä k a u p p a a n + p o l k u p y ö r ä l l ä + p o l k u p y ö r ä l u k k o + p o l k u p y ö r ä m a r k k i n o i l l e + p o l k u p y ö r ä n + p o l k u p y ö r ä r e i t e i s t ä + p o l k u p y ö r ä r e i t i n + p o l k u p y ö r ä s y n d r o o m a + p o l k u p y ö r ä t r i a l + p o l k u p y ö r ä v a l t u u t e t t u + p o l k u p y ö r ä v a r a s + p o l k u p y ö r ä v a r k a a t + p o l k u p y ö r ä v a r k a i d e n + p o l k u p y ö r ä v a r k a u s + p o l k u r i i p p u v u u s + p o l k u r i s a k a s + p o l k u s a r a + p o l k u y h t e n ä i s y y s + p o l t a m m e k o + p o l t e t t a e s s a + p o l t e t t a i s i i n + p o l t e t t i i n + p o l t e t u l l a + p o l t e t u n + p o l t o n + p o l t t a a + p o l t t a e s s a m m e + p o l t t a i s i v a t + p o l t t a m a l l a + p o l t t a v a a n + p o l t t a v a m m a k s i + p o l t t a v a m p i + p o l t t a v a m p i a + p o l t t a v a s s a + p o l t t a v a s t a + p o l t t a v i a + p o l t t a v i m m a n + p o l t t a v i m m a t + p o l t t a v i m m i s t a + p o l t t a v i m p i a + p o l t t a v i m p i i n + p o l t t a v i s t a + p o l t t o a + p o l t t o a i n e + p o l t t o a i n e a l a l l a + p o l t t o a i n e a l t a i s i i n + p o l t t o a i n e a n t u r i t + p o l t t o a i n e d i r e k t i i v i + p o l t t o a i n e d i r e k t i i v i n + p o l t t o a i n e d i r e k t i i v i s t ä + p o l t t o a i n e d i r e k t i i v i ä + p o l t t o a i n e e k s i + p o l t t o a i n e e l l a + p o l t t o a i n e e l l e + p o l t t o a i n e e n + p o l t t o a i n e e n a + p o l t t o a i n e e n j a k e l u + p o l t t o a i n e e n k u l u t u k s e n + p o l t t o a i n e e n k u l u t u k s e s t a + p o l t t o a i n e e n k u l u t u s + p o l t t o a i n e e n k u l u t u s t a + p o l t t o a i n e e n k ä y t ö s t ä + p o l t t o a i n e e n t u o t a n t o o n + p o l t t o a i n e e s t a + p o l t t o a i n e e t + p o l t t o a i n e h i n n a s t a + p o l t t o a i n e h i n n a t + p o l t t o a i n e h i n t a + p o l t t o a i n e h i n t o i h i n + p o l t t o a i n e h i n t o j e n + p o l t t o a i n e h u o l t o + p o l t t o a i n e i d e n + p o l t t o a i n e i k s i + p o l t t o a i n e i l l a + p o l t t o a i n e i l l e + p o l t t o a i n e i s i i n + p o l t t o a i n e i s s a + p o l t t o a i n e i s t a + p o l t t o a i n e i t a + p o l t t o a i n e i t t e n + p o l t t o a i n e j ä t t e e n s ä + p o l t t o a i n e k e n n o + p o l t t o a i n e k e n n o i l l a + p o l t t o a i n e k e n n o i s s a + p o l t t o a i n e k e n n o j a + p o l t t o a i n e k e n n o j e n + p o l t t o a i n e k e n n o t + p o l t t o a i n e k e t j u u n + p o l t t o a i n e k i e r r o l l a + p o l t t o a i n e k i e r r o n + p o l t t o a i n e k i e r t o a + p o l t t o a i n e k i e r t o a l u e e n + p o l t t o a i n e k i e r t o o n + p o l t t o a i n e k i e r t o t o i m i n n a s t a + p o l t t o a i n e k r i i s i + p o l t t o a i n e k r i i s i i n + p o l t t o a i n e k r i i s i n + p o l t t o a i n e k r i i s i t + p o l t t o a i n e k u l u i h i n + p o l t t o a i n e k u l u i s s a + p o l t t o a i n e k u l u j a + p o l t t o a i n e k u l u j e n + p o l t t o a i n e k u l u t u k s e e n + p o l t t o a i n e k u l u t u k s e n + p o l t t o a i n e k u l u t u k s e s t a + p o l t t o a i n e k u l u t u s t a + p o l t t o a i n e k u s t a n n u k s e t + p o l t t o a i n e k u s t a n n u k s i a + p o l t t o a i n e k u s t a n n u k s i i n + p o l t t o a i n e k u s t a n n u k s i l l a + p o l t t o a i n e k u s t a n n u k s i s s a + p o l t t o a i n e k u s t a n n u k s i s t a + p o l t t o a i n e k u s t a n n u s t e n + p o l t t o a i n e k ö y h i e n + p o l t t o a i n e k ö y h y y d e n + p o l t t o a i n e k ö y h y y d e s t ä + p o l t t o a i n e k ö y h y y s + p o l t t o a i n e k ö y h y y s p a k e t i s t a + p o l t t o a i n e k ö y h y y t e e n + p o l t t o a i n e k ö y h y y t t ä + p o l t t o a i n e l a a t u d i r e k t i i v i + p o l t t o a i n e l a a t u d i r e k t i i v i i n + p o l t t o a i n e l a a t u d i r e k t i i v i n + p o l t t o a i n e l a a t u d i r e k t i i v i s s ä + p o l t t o a i n e l a a t u d i r e k t i i v i ä + p o l t t o a i n e l i i k e n t e e n + p o l t t o a i n e l i s i ä + p o l t t o a i n e l i t r a l t a + p o l t t o a i n e l i t r a n + p o l t t o a i n e l ä h t e i d e n + p o l t t o a i n e l ä m m i t i n + p o l t t o a i n e m a k s u s t a + p o l t t o a i n e m a k s u t + p o l t t o a i n e m a r k k i n a t + p o l t t o a i n e m a r k k i n o i d e n + p o l t t o a i n e m a r k k i n o i l l a + p o l t t o a i n e m a r k k i n o i l l e + p o l t t o a i n e m a r k k i n o i t a m m e + p o l t t o a i n e m i t t a r i + p o l t t o a i n e m o o t t o r i + p o l t t o a i n e m ä ä r ä n + p o l t t o a i n e n o r m e i s t a + p o l t t o a i n e p a k e t i n + p o l t t o a i n e p a k e t t i a + p o l t t o a i n e p a n k i n + p o l t t o a i n e p o o l i s s a + p o l t t o a i n e p u l a + p o l t t o a i n e p u l a a + p o l t t o a i n e p u l a a n + p o l t t o a i n e p u l a n + p o l t t o a i n e r a h a s t o n + p o l t t o a i n e r i i p p u v u u t t a + p o l t t o a i n e s a u v a t + p o l t t o a i n e s a u v o j a + p o l t t o a i n e s a u v o j e n + p o l t t o a i n e s e k o i t u k s i e n + p o l t t o a i n e s e o k s i s s a + p o l t t o a i n e s e o s t a + p o l t t o a i n e s t a n d a r d i + p o l t t o a i n e s t r a t e g i a a + p o l t t o a i n e s u l k u + p o l t t o a i n e s y k l i + p o l t t o a i n e s ä i l i ö + p o l t t o a i n e s ä i l i ö i d e n + p o l t t o a i n e s ä i l i ö i h i n + p o l t t o a i n e s ä i l i ö i s s ä + p o l t t o a i n e s ä i l i ö i t ä + p o l t t o a i n e s ä i l i ö n + p o l t t o a i n e s ä ä s t ö i l l e + p o l t t o a i n e s ä ä s t ö i s t ä + p o l t t o a i n e s ä ä s t ö j ä + p o l t t o a i n e s ä ä s t ö t + p o l t t o a i n e t a l o u d e n + p o l t t o a i n e t a l o u d e s s a + p o l t t o a i n e t a l o u d e s t a + p o l t t o a i n e t a l o u s + p o l t t o a i n e t a l o u t e e n + p o l t t o a i n e t a l o u t t a + p o l t t o a i n e t a n k i l l i s t a + p o l t t o a i n e t a n k i n + p o l t t o a i n e t a n k k a u k s e n + p o l t t o a i n e t a n k k a u k s i i n + p o l t t o a i n e t a n k k i e n + p o l t t o a i n e t a r j o n n a n + p o l t t o a i n e t e h o k k a a m p i a + p o l t t o a i n e t e h o k k a i d e n + p o l t t o a i n e t e h o k k a i l l e + p o l t t o a i n e t e h o k k a i m p i e n + p o l t t o a i n e t e h o k k a i m p i i n + p o l t t o a i n e t e h o k k a i t a + p o l t t o a i n e t e h o k k u u d e l l a + p o l t t o a i n e t e h o k k u u d e n + p o l t t o a i n e t e h o k k u u d e s s a + p o l t t o a i n e t e h o k k u u d e s t a + p o l t t o a i n e t e h o k k u u s + p o l t t o a i n e t e h o k k u u t e e n + p o l t t o a i n e t e h o k k u u t t a + p o l t t o a i n e t e h o k u u t t a + p o l t t o a i n e t e k n i i k k a + p o l t t o a i n e t e k n o l o g i a + p o l t t o a i n e t e k n o l o g i a a + p o l t t o a i n e t e k n o l o g i o i d e n + p o l t t o a i n e t e o l l i s u u d e n + p o l t t o a i n e t e o l l i s u u d e s s a + p o l t t o a i n e t e o l l i s u u s + p o l t t o a i n e t i l a n n e + p o l t t o a i n e t o i m i t u k s i a + p o l t t o a i n e t o i m i t u s t e n + p o l t t o a i n e t t a + p o l t t o a i n e t t a h a n + p o l t t o a i n e t u k e a + p o l t t o a i n e t u k e n s a + p o l t t o a i n e t u k i e n + p o l t t o a i n e t u o t a n n o n + p o l t t o a i n e t u o t a n t o o n + p o l t t o a i n e t u r i s m i + p o l t t o a i n e t u r i s m i a + p o l t t o a i n e t u r i s m i i n + p o l t t o a i n e t u r i s m i n + p o l t t o a i n e t u r i s m i s t a + p o l t t o a i n e t u r v a a + p o l t t o a i n e t y y p e i l l ä + p o l t t o a i n e t y y p p i e n + p o l t t o a i n e v a a t i m u k s e t + p o l t t o a i n e v a r a n n o t + p o l t t o a i n e v a r a s t o j a m m e + p o l t t o a i n e v a r o i h i n + p o l t t o a i n e v a r o j a + p o l t t o a i n e v e r o + p o l t t o a i n e v e r o a + p o l t t o a i n e v e r o a s t e i t a + p o l t t o a i n e v e r o i s t a + p o l t t o a i n e v e r o j a + p o l t t o a i n e v e r o j e n + p o l t t o a i n e v e r o k s i + p o l t t o a i n e v e r o n + p o l t t o a i n e v e r o o n + p o l t t o a i n e v e r o s t a + p o l t t o a i n e v e r o t + p o l t t o a i n e v e r o t u k s e n + p o l t t o a i n e v e r o t u k s e s t a + p o l t t o a i n e v e r o t u s + p o l t t o a i n e v e r o t u s t a + p o l t t o a i n e y h d i s t e l m ä ä + p o l t t o a i n e y h t i ö i t ä + p o l t t o a i n e ö l j y n + p o l t t o e n e r g i a n + p o l t t o i t s e m u r h a + p o l t t o j ä r j e s t e l y ä + p o l t t o k a t t i l o i d e n + p o l t t o k e n n o + p o l t t o k e n n o a j o n e u v o j e n + p o l t t o k e n n o a u t o + p o l t t o k e n n o i s s a + p o l t t o k e n n o i s t a + p o l t t o k e n n o j a + p o l t t o k e n n o j e n + p o l t t o k e n n o t + p o l t t o k e n n o t e k n o l o g i a + p o l t t o k i i n t i ö i s s ä + p o l t t o k o m p o n e n t t i + p o l t t o k ä y t ä n t ö j e n + p o l t t o l a i t o k s e n + p o l t t o l a i t o k s e t + p o l t t o l a i t o k s i a + p o l t t o l a i t o k s i i n + p o l t t o l a i t o k s i l l e + p o l t t o l a i t o k s i l t a + p o l t t o l a i t o k s i s s a + p o l t t o l a i t o k s i s t a + p o l t t o l a i t o s t e n + p o l t t o l a i t t e i t a + p o l t t o l a i v a + p o l t t o l a s i n + p o l t t o l ä h t e i d e n + p o l t t o l ä m m i t t i m i e n + p o l t t o l ä m m i t t i m i ä + p o l t t o m e n e t e l m i e n + p o l t t o m e n e t t e l y + p o l t t o m o o t t o r e i d e n + p o l t t o m o o t t o r i + p o l t t o m o o t t o r i a j o n e u v o j e n + p o l t t o m o o t t o r i a j o n e u v o n s a + p o l t t o m o o t t o r i a u t o i h i n + p o l t t o m o o t t o r i e n + p o l t t o m o o t t o r i l l e + p o l t t o m o o t t o r i n + p o l t t o m o o t t o r i t + p o l t t o m o o t t o r i v o i m a l a i t o s + p o l t t o n e s t e e n + p o l t t o n e s t e e s e e n + p o l t t o n e s t e i d e n + p o l t t o n e s t e s ä i l i ö i t ä + p o l t t o p i s t e + p o l t t o p i s t e a l u e e n + p o l t t o p i s t e e n + p o l t t o p i s t e e n ä + p o l t t o p i s t e e s e e n + p o l t t o p i s t e e s s ä + p o l t t o p i s t e i s t ä + p o l t t o p u l l o + p o l t t o p u l l o j e n + p o l t t o p u l l o t + p o l t t o p u u + p o l t t o p ä ä s t ö j ä + p o l t t o r o v i o i l l a + p o l t t o r o v i o i t a + p o l t t o r o v i o t + p o l t t o t a i s t e l u a i n e e t + p o l t t o t a p o j e n + p o l t t o t e k n i i k a t + p o l t t o t o i m i i n + p o l t t o v ä l i + p o l t t o y k s i k k ö ö n + p o l t t o ö l j y + p o l t t o ö l j y j e n + p o l t t o ö l j y l a u t t a + p o l t t o ö l j y l l e + p o l t t o ö l j y l l ä + p o l t t o ö l j y n + p o l t t o ö l j y n ä + p o l t t o ö l j y s t ä + p o l t t o ö l j y t + p o l t t o ö l j y t o i m i t u k s e t + p o l t t o ö l j y y n + p o l t t o ö l j y ä + p o l u i l l e + p o l u l l a + p o l u l t a + p o l v e a + p o l v e s t a + p o l v i h o u s u i s t a + p o l v i l l a a n + p o l v i r e f l e k s i r e a k t i o k s i + p o l v i t a i v e l i h a s + p o l v i v a m m a n + p o l y a r o m a a t t i s i l l e + p o l y b r o m i d i f e n y y l i e e t t e r e i h i n + p o l y b r o m i d i f e n y y l i e e t t e r e i t ä + p o l y b u t y l e e n i t e r e f t a l a a t t i + p o l y e t y l e e n i t e r e f t a l a a t t i + p o l y m e e r i k e m i a + p o l y m e r a a s i k e t j u r e a k t i o + p o l y n e u r o p a t i a + p o l y n o m i m a t r i i s i + p o l y n o m i n + p o l y o l e f i i n i k u i t u t u o t a n t o a + p o l y t e e n i k r o m o s o m i + p o l y u r e t a a n i s o l u m u o v i n + p o l y v i n y y l i k l o r i d i a + p o l y v i n y y l i k l o r i d i n + p o m m e i k s i + p o m m e j a + p o m m i a t t e n t a a t t i + p o m m i e n + p o m m i h a n + p o m m i h y ö k k ä y k s e e n + p o m m i h y ö k k ä y s + p o m m i k i i t ä j ä i n e n + p o m m i n + p o m m i n k e s t ä v i i n + p o m m i n r a k e n n u s t e k n i i k k a + p o m m i n t e k i j ä t + p o m m i n v a l m i s t u s o h j e i s t a + p o m m i r ä j ä h d y k s e t + p o m m i s u o j a + p o m m i s u u n n i t e l m a s t a + p o m m i t + p o m m i t a r k a s t u k s e s s a + p o m m i t e t t i i n + p o m m i t e t t u + p o m m i t t a a + p o m m i t t a i s i m m e + p o m m i t t a j a n + p o m m i t t a j i k s i + p o m m i t t a m a l l a + p o m m i t t a n e e t + p o m m i t t a v a n a + p o m m i t t i + p o m m i t t i v a t + p o m m i t u k s e t + p o m m i t u k s i a + p o m m i t u k s i i n + p o m m i t u k s i l l a + p o m m i t u k s i n + p o m m i t u k s i s s a + p o m m i t u k s i s t a + p o m m i t u s k a m p a n j a n + p o m m i t u s k o h t e i t a + p o m m i t u s t e n + p o m m i u h k a a n + p o m m i u h k a u k s i s t a + p o m p o t t e l u a + p o m p p u k e p p i + p o n i a u t o + p o n n a h d u s i k k u n a + p o n n a h d u s k i r j a + p o n n a h d u s l a u d a n + p o n n a h d u s l a u d o i s t a + p o n n a h d u s l a u t a + p o n n a h d u s l a u t a n a + p o n n e k a a s u s u i h k e i s t a + p o n n e k k a a m m i n + p o n n e k k a a m p a a + p o n n e k k a i t a + p o n n e t o n t a + p o n n e t t o m a n + p o n n e t t o m a n a + p o n n e t t o m i a + p o n n i s t a a + p o n n i s t e l e e + p o n n i s t e l e m a a n + p o n n i s t e l e m m e + p o n n i s t e l e m m e k o + p o n n i s t e l e n + p o n n i s t e l e v a t + p o n n i s t e l i + p o n n i s t e l i m m e + p o n n i s t e l i s i + p o n n i s t e l i v a t + p o n n i s t e l k a a m m e + p o n n i s t e l l a + p o n n i s t e l l a a n + p o n n i s t e l l a k s e e n + p o n n i s t e l l e e t + p o n n i s t e l l e s s a a n + p o n n i s t e l l u t + p o n n i s t e l t a e s s a + p o n n i s t e l t a v a + p o n n i s t e l t a v a a + p o n n i s t e l t i i n + p o n n i s t e l t u + p o n n i s t e l u a + p o n n i s t e l u i h i n + p o n n i s t e l u i h i n n e + p o n n i s t e l u i l l e e n + p o n n i s t e l u i l l e m m e + p o n n i s t e l u i n + p o n n i s t e l u i s s a + p o n n i s t e l u i s s a m m e + p o n n i s t e l u i s t a + p o n n i s t e l u i s t a a n + p o n n i s t e l u i s t a m m e + p o n n i s t e l u i t t a + p o n n i s t e l u j a + p o n n i s t e l u j a a n + p o n n i s t e l u j a m m e + p o n n i s t e l u j e m m e + p o n n i s t e l u j e n + p o n n i s t e l u j e n s a + p o n n i s t e l u m m e + p o n n i s t e l u n s a + p o n n i s t e l u t + p o n n i s t u k s e e n + p o n n i s t u k s e l l a + p o n n i s t u k s e n + p o n n i s t u k s e s t a + p o n n i s t u k s e t + p o n n i s t u k s i a + p o n n i s t u k s i a a n + p o n n i s t u k s i a m m e + p o n n i s t u k s i l l a + p o n n i s t u k s i l l e + p o n n i s t u k s i n + p o n n i s t u k s i s s a + p o n n i s t u k s i s t a + p o n n i s t u s t a + p o n n i s t u s t e m m e + p o n n i s t u s t e n + p o n s i l l e + p o n t e v a m m a s s a + p o n t e v a m m a t + p o n t e v a m m i n + p o n t e v a m p a a + p o n t e v a n + p o n t e v u u t t a + p o n t t a + p o n t t o n i s i l t a + p o o l i j ä r j e s t e l m ä l l ä + p o o l i s o p i m u k s i s t a + p o o l o p a i t a + p o p k o n s e r t t i + p o p k u l t t u u r i i n + p o p m u s i i k k i + p o p m u s i i k k i t e o l l i s u u d e n + p o p p a k o n s t e j a + p o p p a m i e h e t + p o p p a m i e s + p o p p a m i e s t e n + p o p p e l i k e l t a y ö k k ö n e n + p o p p e l i k i i t ä j ä + p o p p e l i k o i v u + p o p t ä h d e n + p o p t ä h t i e n + p o p u l a a r i k u l t t u u r i + p o p u l a a r i k u l t t u u r i a + p o p u l a a r i m u s i i k k i + p o p u l a a t i o d y n a m i i k k a + p o p u l a a t i o g e n e t i i k k a + p o p u l a a t i o k o k o + p o p u l a a t i o y k s i k ö i t ä + p o p u l i s m i a + p o p u l i s m i i n + p o p u l i s m i k o r t i n + p o p u l i s m i l l e + p o p u l i s m i n + p o p u l i s m i s t a + p o p u l i s t i d e m a g o g i + p o p u l i s t i e n + p o p u l i s t i l i s t a n + p o p u l i s t i o i k e i s t o + p o p u l i s t i p o l i i t i k k o j a + p o p u l i s t i r y h m i ä + p o p u l i s t i s e k s i + p o p u l i s t i s e l l a + p o p u l i s t i s e s t i + p o p u l i s t i s e t + p o p u l i s t i s i a + p o p u l i s t i s i l l e + p o p u l i s t i s t a + p o p u l i s t i t + p o p v i s a + p o p y h t y e i t ä + p o r a k a i v o j a + p o r a n t e r ä + p o r a s i i r a + p o r a u k s e s s a + p o r a u s h a n k k e i t a + p o r a u s l a i t o k s i e n + p o r a u s l a u t o i l l a + p o r a u s l a u t o i s t a + p o r a u s l a u t t a a + p o r a u s l a u t t o j e n + p o r a u s m a h d o l l i s u u k s i a + p o r a u s p a i k a l l a + p o r a u s t o i m i a + p o r a u s t o i m i e n + p o r a u s t o i m i n n a n + p o r a u s v a a t i m u k s i e n + p o r a u s y h t i ö i d e n + p o r i n + p o r k k a n a a + p o r k k a n a k ä r p ä n e n + p o r k k a n a r a a s t e + p o r k k a n a r a a s t e i s s a + p o r k k a n a s t a + p o r m e s t a r e i l l e + p o r m e s t a r i a + p o r m e s t a r i l l e + p o r m e s t a r i n + p o r m e s t a r i n a + p o r m e s t a r i s t a + p o r n o e l o k u v a + p o r n o g r a f i a a + p o r n o g r a f i a n + p o r n o g r a f i s i i n + p o r n o g r a f i s i l l e + p o r n o g r a f i s t a + p o r n o k a n a v a n + p o r n o k a s e t t i e n + p o r n o k a u p p i a i d e n + p o r n o l e h t i + p o r n o l l e + p o r n o n ä y t t e l i j ä + p o r n o r o m a a n i n + p o r n o s i v u i l l a + p o r n o s i v u i l l e + p o r n o t e o l l i s u u d e n + p o r n o t e o l l i s u u t t a + p o r n o t u o t t a j i e n + p o r o n h o i t o + p o r o n j ä k ä l ä + p o r o s y n d r o o m a + p o r r a s h i s s i n + p o r r a s k ä y t ä v ä ä n + p o r r a s p y r a m i d i + p o r r a s t a m i s t a + p o r r a s t e t t u a + p o r r a s t e t t u i h i n + p o r r a s t u k s i a + p o r s a a n l i h a t e o l l i s u u t t a m m e + p o r s a a n l i h a t u o t t e e t + p o r s a a n l i h a t u o t t e i d e n + p o r s a a n r e i k i e n + p o r s a a n r e i k i ä + p o r s a a n r e i k ä + p o r s a a n r e i k ä n ä + p o r s a a n r e i k ä ä + p o r s a a n r e i ä k s i + p o r s a a n r e i ä n + p o r s a a n r e i ä t + p o r s a s y s k ä + p o r t a a l e i h i n + p o r t a a l i n + p o r t a a t + p o r t a i l l e m m e + p o r t a i t t a i s e n + p o r t e i l l a m m e + p o r t f o l i o p ä ä t ö k s i i n + p o r t f o l i o s i j o i t u k s i s t a + p o r t i t + p o r t t e j a + p o r t t i a + p o r t t i e n + p o r t t i k o n t r o l l i t e o r i a + p o r t t i l a s k i m o j ä r j e s t e l m ä + p o r t t i t e o r i a + p o r t t i t o r n i + p o r t u g a l i a + p o r t u g a l i a l a i s e l l a + p o r t u g a l i i n + p o r t u g a l i l a i s e n a + p o r t u g a l i l a i s e t + p o r t u g a l i l a i s i a + p o r t u g a l i l a i s i l l e + p o r t u g a l i l a i s l a p s i l l e + p o r t u g a l i l a i s l a s t e n + p o r t u g a l i l a i s n a i s i s t a + p o r t u g a l i l a i s n a i s t a + p o r t u g a l i l a i s t a + p o r t u g a l i l a i s t e n + p o r t u g a l i l a i s y h t e i s ö + p o r t u g a l i l a i s y h t e i s ö ä + p o r t u g a l i l l e + p o r t u g a l i l t a + p o r t u g a l i n + p o r t u g a l i n k i e l i s e n + p o r t u g a l i n k i e l i s e s t ä + p o r t u g a l i n k i e l i s i l l ä + p o r t u g a l i n k i e l i s i l t ä + p o r t u g a l i n k i e l i s i ä + p o r t u g a l i n k i e l i s t e n + p o r t u g a l i n s e i s o j a + p o r t u g a l i n s o t a l a i v a + p o r t u g a l i n v e s i k o i r a + p o r t u g a l i s s a + p o r t u g a l i s s a k i n + p o r t u g a l i s t a + p o r t v i i n e i h i n + p o r t v i i n i + p o r t v i i n i k a u p p a a + p o r t v i i n i k s i + p o r t v i i n i n + p o r t v i i n i ä + p o r u k a l l a + p o r v a r i d e m o k r a t i a s t a + p o r v a r i h a l l i t u k s e t + p o r v a r i h a l l i t u k s i a + p o r v a r i h a l l i t u s t e n + p o r v a r i h u m a n i s t e j a + p o r v a r i j o h t a j a t + p o r v a r i l l i s e s t a + p o r v a r i l u o k a n + p o r v a r i l u o k k i e n + p o r v a r i p u o l u e + p o r v a r i p u o l u e e t + p o r v a r i y h t e i s k u n t a a n + p o s i t i i v i l i s t a s t a + p o s i t i i v i l u e t t e l o + p o s i t i i v i l u e t t e l o a + p o s i t i i v i l u e t t e l o n + p o s i t i i v i l u e t t e l o o n + p o s i t i i v i l u e t t e l o s t a + p o s i t i i v i s e k s i + p o s i t i i v i s e l l a + p o s i t i i v i s e m m a l t a + p o s i t i i v i s e m m a n + p o s i t i i v i s e m p a a + p o s i t i i v i s e m p i + p o s i t i i v i s e m p i a + p o s i t i i v i s e n + p o s i t i i v i s e n a + p o s i t i i v i s e s t a + p o s i t i i v i s i a + p o s i t i i v i s i l l a + p o s i t i i v i s i s t a + p o s i t i i v i s t a + p o s i t i i v i s t e n + p o s i t i o a s t r o n o m i a + p o s i t r o n i e m i s s i o + p o s i t r o n i e m i s s i o t o m o g r a f i a + p o s k i l i h a s + p o s k i p ä ä l i h a s + p o s l i i n i k a a p i n + p o s l i i n i k a u p a n + p o s l i i n i k a u p a s s a + p o s l i i n i l l a + p o s l i i n i s i e n i + p o s l i i n i t e h d a s + p o s l i i n i t o r n i + p o s s e s s i i v i p r o n o m i n i + p o s s e s s i i v i s u f f i k s i + p o s t i a + p o s t i a l a + p o s t i a l a a + p o s t i a l a a n + p o s t i a l a l l a + p o s t i a l a l l e + p o s t i a l a n + p o s t i d i r e k t i i v i + p o s t i d i r e k t i i v i i n + p o s t i d i r e k t i i v i l l e + p o s t i d i r e k t i i v i n + p o s t i d i r e k t i i v i s s ä + p o s t i d i r e k t i i v i s t ä + p o s t i d i r e k t i i v i ä + p o s t i e n + p o s t i e n n a k k o + p o s t i h a l l i n n o t + p o s t i i n + p o s t i j a k e l u n + p o s t i j ä r j e s t e l m i e n + p o s t i j ä r j e s t e l m i s s ä + p o s t i j ä r j e s t e l m ä ä n + p o s t i k a a n + p o s t i k o n t t o r e i t a + p o s t i k u l j e t u s t e n + p o s t i l a a t i k k o + p o s t i l a a t i k k o f i r m a t + p o s t i l a a t i k k o i h i n s a + p o s t i l a a t i k k o j a + p o s t i l a a t i k k o n a + p o s t i l a a t i k k o o n s a + p o s t i l a a t i k k o y h t i ö i h i n + p o s t i l a a t i k k o y r i t y s t e n + p o s t i l a a t i k k o y r i t y s t ä + p o s t i l a a t i k o i h i m m e + p o s t i l a a t i k o i s t a + p o s t i l a a t i k o i t a + p o s t i l a a t i k o s t a a n + p o s t i l a i n s ä ä d ä n n ö s s ä + p o s t i l a i t o k s e n + p o s t i l a i t o k s e s s a + p o s t i l a i t o k s e s t a + p o s t i l a i t o k s e t + p o s t i l a i t o k s i a + p o s t i l a i t o k s i l t a + p o s t i l a i t o s + p o s t i l a i t o s t a + p o s t i l a i t o s t e n + p o s t i l i i k e n n e + p o s t i l i i k e n t e e s t ä + p o s t i l i i t o n + p o s t i l l e + p o s t i l o k e r o + p o s t i l o k e r o i h i n + p o s t i l o k e r o y r i t y s t e n + p o s t i l ä h e t y k s e t + p o s t i l ä h e t y k s i i n + p o s t i m a k s u i l l a + p o s t i m a k s u j a + p o s t i m a k s u j e n + p o s t i m a k s u n + p o s t i m a r k k i n a t + p o s t i m a r k k i n o i d e n + p o s t i m a r k k i n o i h i n + p o s t i m a r k k i n o i l l a + p o s t i m a r k k i n o i s t a + p o s t i m a r k k i n o i t a + p o s t i m e n e t t e l y s t ä + p o s t i m e r k e i s t ä + p o s t i m e r k i l l e + p o s t i m e r k k i + p o s t i m e r k k i e n + p o s t i m e r k k i k a s s a s t a + p o s t i m e r k k i s a r j a + p o s t i m o n o p o l e i s s a + p o s t i m o n o p o l i + p o s t i m o n o p o l i a a n + p o s t i m y y n n i s s ä + p o s t i m y y n t i + p o s t i m y y n t i a p t e e k i t + p o s t i m y y n t i a p t e e k k i e n + p o s t i n + p o s t i n j a k e l u a + p o s t i n j a k e l u a l a l l a + p o s t i n j a k e l u n + p o s t i n j a k e l u p a l v e l u n + p o s t i n k a n t a j a + p o s t i n k ä s i t t e l y ä + p o s t i n u m e r o + p o s t i n u m e r o j e n + p o s t i o p e r a a t t o r e i d e n + p o s t i o s o i t e + p o s t i p a l v e l i m i s t a + p o s t i p a l v e l u + p o s t i p a l v e l u a + p o s t i p a l v e l u a l a n + p o s t i p a l v e l u d i r e k t i i v i n + p o s t i p a l v e l u d i r e k t i i v i s t ä + p o s t i p a l v e l u d i r e k t i i v i ä + p o s t i p a l v e l u i d e n + p o s t i p a l v e l u i h i n + p o s t i p a l v e l u i h i n s a + p o s t i p a l v e l u i l l a + p o s t i p a l v e l u i l l e + p o s t i p a l v e l u i s s a + p o s t i p a l v e l u i s t a + p o s t i p a l v e l u i t a + p o s t i p a l v e l u j a + p o s t i p a l v e l u j a m m e + p o s t i p a l v e l u j e n + p o s t i p a l v e l u l l a + p o s t i p a l v e l u m a r k k i n a n s a + p o s t i p a l v e l u m a r k k i n a t + p o s t i p a l v e l u m a r k k i n o i d e n + p o s t i p a l v e l u m a r k k i n o i t a + p o s t i p a l v e l u n + p o s t i p a l v e l u n s a + p o s t i p a l v e l u p o l i t i i k a n + p o s t i p a l v e l u s t a + p o s t i p a l v e l u t + p o s t i p a l v e l u t o i m i n t o j a + p o s t i p a l v e l u t y ö n t e k i j ä t + p o s t i p a l v e l u u n + p o s t i p a l v e l u y r i t y s t e n + p o s t i p e r i n t e i l l ä + p o s t i p o l i t i i k a s t a + p o s t i r y ö s t ö + p o s t i s a a r r o n + p o s t i s a l a i s u u t t a + p o s t i s e k t o r i l l a + p o s t i s e k t o r i n + p o s t i s o p i m u k s e s s a + p o s t i s s a + p o s t i s t a + p o s t i t + p o s t i t a i d e + p o s t i t o i m e l l e + p o s t i t o i m e n + p o s t i t o i m i n n a n + p o s t i t o i m i p a i k a t + p o s t i t o i m i p a i k k a v e r k o s t o + p o s t i t o i m i p a i k k o j e n + p o s t i t o i m i p a i k o i s t a + p o s t i t o i m i s t o + p o s t i t o i m i s t o a + p o s t i t o i m i s t o i h i n + p o s t i t o i m i s t o i l l a + p o s t i t o i m i s t o i l l e + p o s t i t o i m i s t o i s s a + p o s t i t o i m i s t o i s t a + p o s t i t o i m i s t o j a + p o s t i t o i m i s t o j e n + p o s t i t o i m i s t o n + p o s t i t o i m i s t o p a l v e l u i l l e + p o s t i t o i m i s t o p a l v e l u j a + p o s t i t o i m i s t o s t a + p o s t i t o i m i s t o t + p o s t i t o r v i + p o s t i t u s l i s t a + p o s t i t y ö n t e k i j ö i d e n + p o s t i t y ö n t e k i j ö i h i n + p o s t i u u d i s t u k s e e n + p o s t i v a u n u i l l a + p o s t i v a u n u t + p o s t i v e r k k o o n + p o s t i v e r k o s t o j e n + p o s t i v i r a n o m a i n e n + p o s t i v i r a n o m a i s t e n + p o s t i v i r k a i l i j a + p o s t i y h t e y d e t + p o s t i y r i t y k s e t + p o s t i y r i t y k s i l l e + p o s t i y r i t y k s i ä + p o s t i y r i t y s t e n + p o s t i ä ä n e s t y k s e n + p o s t i ä ä n e s t y s t ä + p o s t m o d e r n i l l a + p o s t m o d e r n i l t a + p o s t m o d e r n i s s a + p o s t u u m e i l l a + p o t e n s s i f u n k t i o + p o t e n s s i j o u k k o + p o t e n s s i l a k i + p o t e n s s i s a r j a + p o t e n t i a a l e i h i n + p o t e n t i a a l i a + p o t e n t i a a l i a a n + p o t e n t i a a l i e n e r g i a + p o t e n t i a a l i e r o + p o t e n t i a a l i k u o p p a + p o t e n t i a a l i l ä m p ö t i l a + p o t e n t i a a l i n + p o t e n t i a a l i n s a + p o t e n t i a a l i s e t + p o t e n t i a a l i s i a + p o t e n t i a a l i s s a + p o t e n t i a a l i s t e n + p o t e n t i a a l i t e o r i a + p o t i l a a l t a + p o t i l a a n + p o t i l a a t + p o t i l a i d e n + p o t i l a i l l e + p o t i l a i s s a + p o t i l a i s t a + p o t i l a i t a + p o t i l a s a s i a k i r j o i h i n + p o t i l a s a s i a m i e h e n + p o t i l a s a s i o i d e n + p o t i l a s d i r e k t i i v i + p o t i l a s f o o r u m i + p o t i l a s h o i d o s s a + p o t i l a s h o i t o a + p o t i l a s j ä r j e s t ö j e n + p o t i l a s j ä r j e s t ö j ä + p o t i l a s j ä r j e s t ö t + p o t i l a s j ä r j e s t ö ä + p o t i l a s k y s y m y k s i ä + p o t i l a s l a i n + p o t i l a s l i i k k u v u u t t a + p o t i l a s l ä h t ö i s e m p i + p o t i l a s l ä h t ö i s i ä + p o t i l a s l ä h t ö i s y y s + p o t i l a s m ä ä r ä n + p o t i l a s p a i k k o j a + p o t i l a s r e k i s t e r i + p o t i l a s r y h m i e n + p o t i l a s r y h m i i n + p o t i l a s r y h m i l l e + p o t i l a s r y h m i l t ä + p o t i l a s r y h m i ä + p o t i l a s r y h m ä t + p o t i l a s s u o j a n + p o t i l a s t a + p o t i l a s t i e d o i s t a + p o t i l a s t i e d o t + p o t i l a s t i e d o t u k s e n + p o t i l a s t i e d o t u s + p o t i l a s t i e t o j e n + p o t i l a s t i e t o j ä r j e s t e l m ä + p o t i l a s t i e t o n s a + p o t i l a s t u k i r y h m i e n + p o t i l a s t u k i r y h m ä ä + p o t i l a s t u r v a + p o t i l a s t u r v a a + p o t i l a s t u r v a l l i s u u d e l l e + p o t i l a s t u r v a l l i s u u d e n + p o t i l a s t u r v a l l i s u u d e s s a + p o t i l a s t u r v a l l i s u u d e s t a + p o t i l a s t u r v a l l i s u u s n o r m i t + p o t i l a s t u r v a l l i s u u s s u o s i t u s + p o t i l a s t u r v a l l i s u u t e e n + p o t i l a s t u r v a l l i s u u t t a + p o t i l a s t u r v a n + p o t i l a s t y y t y v ä i s y y d e n + p o t i l a s v ä h e m m i s t ö l l e + p o t i l a s y h d i s t y k s e n + p o t i l a s y h d i s t y k s e t + p o t i l a s y h d i s t y k s i l l ä + p o t i l a s y h d i s t y k s i ä + p o t i l a s y h d i s t y s + p o t i l a s y h d i s t y s t e n + p o t i l a s y h d i s t y s t e n s ä + p o t i n + p o t k a i s k a a m m e + p o t k i s i + p o t k u l a u t a + p o t k u p a l l o n a + p o t k u p y ö r ä + p o t t a h a r j o i t t e l u + p o w h a t a n s o t a + p r a g m a a t t i s e m m a n + p r a g m a a t t i s e m m i k s i + p r a g m a a t t i s e m m i n + p r a g m a a t t i s e m p a a + p r a g m a a t t i s e m p i + p r a l i i n i h u i p p u k o k o u s t a + p r e d i k a a t t i l o g i i k k a + p r e e r i a h a u k k a + p r e e r i a h i i r i h a u k k a + p r e e r i a k a h l a a j a + p r e e r i a k a l k k a r o k ä ä r m e + p r e e r i a k a n a + p r e e r i a k i r v i n e n + p r e e r i a k o i r a t + p r e e r i a l l a + p r e e r i a l o k k i + p r e e r i a n a u r u l o k k i + p r e e r i a p a l o n + p r e e r i a p ö l l ö + p r e e r i a t y l l i + p r e e r i a t y y l i + p r e e s e n s i s s ä + p r e e s e n s m u o t o a + p r e k u r s o r i t + p r e p o s i t i o n a a l i + p r e r a f a e l i i t i t + p r e s b y t e e r i k i r k o l t a + p r e s i d e n t i k s i + p r e s i d e n t i l l e + p r e s i d e n t i l l ä + p r e s i d e n t i n + p r e s i d e n t i n h a l l i n t o + p r e s i d e n t i n l i n n a + p r e s i d e n t i n l i n n a a n + p r e s i d e n t i n p a l a t s i s s a + p r e s i d e n t i n p a l m u + p r e s i d e n t i n v a a l e i h i n + p r e s i d e n t i n v a a l e i l l e + p r e s i d e n t i n v a a l e i n a + p r e s i d e n t i n v a a l e i s s a + p r e s i d e n t i n v a a l e i s t a + p r e s i d e n t i n v a a l e j a + p r e s i d e n t i n v a a l i a + p r e s i d e n t i n v a a l i e h d o k k a a n + p r e s i d e n t i n v a a l i e n + p r e s i d e n t i n v a a l i k a m p a n j a + p r e s i d e n t i n v a a l i k a m p a n j a a + p r e s i d e n t i n v a a l i k a m p a n j a f a r s s i n + p r e s i d e n t i n v a a l i k a m p a n j a n + p r e s i d e n t i n v a a l i k a m p a n j a s s a + p r e s i d e n t i n v a a l i n + p r e s i d e n t i n v a a l i p r o p a g a n d a n s a + p r e s i d e n t i n v a a l i s s a + p r e s i d e n t i n v a a l i s t a + p r e s i d e n t i n v a a l i t + p r e s i d e n t i t + p r e s i d e n t t i e h d o k a s + p r e s i d e n t t i e h d o k a s t a + p r e s i d e n t t i e h d o k k a a k s i + p r e s i d e n t t i e h d o k k a a n + p r e s i d e n t t i e h d o k k a a n a + p r e s i d e n t t i e h d o k k a a s t a + p r e s i d e n t t i e h d o k k a a t + p r e s i d e n t t i e h d o k k a i d e n + p r e s i d e n t t i e h d o k k a i s t a + p r e s i d e n t t i e h d o k k a i t a + p r e s i d e n t t i e n + p r e s i d e n t t i i n + p r e s i d e n t t i j o h t o i n e n + p r e s i d e n t t i j ä r j e s t e l m ä + p r e s i d e n t t i k a m p a n j a a + p r e s i d e n t t i k a m p a n j o i s s a + p r e s i d e n t t i k a u d e l l a + p r e s i d e n t t i k a u t e n n e + p r e s i d e n t t i k i l p a a n + p r e s i d e n t t i k i n + p r e s i d e n t t i k o l l e g i o n + p r e s i d e n t t i k o n e i s t o n s a + p r e s i d e n t t i n e u v o s t o + p r e s i d e n t t i n ä + p r e s i d e n t t i t a s o n + p r e s i d e n t t i v a a l e j a + p r e s i d e n t t i v a a l i e n + p r e s i d e n t t i v a a l i t + p r e s i d e n t t i ä + p r e t o r i a a n i k a a r t i + p r e t o r i a a n i p r e f e k t i + p r e u s s i n + p r e u s s i n s i n i n e n + p r i k a a t e j a + p r i k a a t i a + p r i k a a t i k e n r a a l i + p r i k a a t i n + p r i k a a t i n k e n r a a l i t + p r i m a a r i a l a a + p r i m a a r i e n e r g i a + p r i m a a r i e n e r g i a a + p r i m a a r i e n e r g i a l ä h t e e n ä + p r i m a a r i e n e r g i a l ä h t e e s t ä + p r i m a a r i e n e r g i a l ä h t e e t + p r i m a a r i e n e r g i a l ä h t e i d e n + p r i m a a r i e n e r g i a l ä h t e i s i i n + p r i m a a r i e n e r g i a m u o t o j e n + p r i m a a r i e n e r g i a n + p r i m a a r i e n e r g i a s t a + p r i m a a r i l a i n s ä ä d ä n n ö n + p r i m a a r i l a i n s ä ä d ä n n ö s s ä + p r i m a a r i l a i n s ä ä d ä n t ö + p r i m a a r i l a i n s ä ä d ä n t ö ä + p r i m a a r i l a i n s ä ä d ä n t ö ö m m e + p r i m a a r i l a i n s ä ä d ä n t ö ö n + p r i m a a r i m a r k k i n o i s t a + p r i m a a r i o i k e u d e l l a + p r i m a a r i o i k e u d e l l i s e e n + p r i m a a r i o i k e u d e l l i s e n + p r i m a a r i o i k e u d e n + p r i m a a r i o i k e u d e s s a + p r i m a a r i o i k e u s + p r i m a a r i o i k e u t e e n + p r i m a a r i o i k e u t t a + p r i m a a r i p o l t t o a i n e e l l e + p r i m a a r i p o l t t o a i n e e n + p r i m a a r i p o l t t o a i n e i d e n + p r i m a a r i p r e v e n t i o l l e + p r i m a a r i p r e v e n t i o n + p r i m a a r i s e k t o r i l l a + p r i m a a r i s e s s a + p r i m a a r i t e o l l i s u u s + p r i m a a r i t u o t a n t o + p r i m a k o v i n + p r i m ä ä r i e n e r g i a + p r i m ä ä r i e n e r g i a a + p r i m ä ä r i e n e r g i a l ä h t e e s t ä + p r i m ä ä r i e n e r g i a l ä h t e i l l e + p r i m ä ä r i e n e r g i a m u o t o j e n + p r i m ä ä r i e n e r g i a n + p r i m ä ä r i e n e r g i a s t a + p r i m ä ä r i l a i n s ä ä d ä n n ö n + p r i m ä ä r i l a i n s ä ä d ä n n ö s s ä + p r i m ä ä r i l a i n s ä ä d ä n t ö + p r i m ä ä r i l a i n s ä ä d ä n t ö ä + p r i m ä ä r i l a i n s ä ä d ä n t ö ö n + p r i m ä ä r i l ä h d e + p r i m ä ä r i o i k e u t e e n + p r i m ä ä r i o i k e u t t a + p r i m ä ä r i s e k t o r i a + p r i n s e s s a p ä i v ä k i r j a t + p r i n s s i p u o l i s o + p r i o n e i s t a + p r i o n i a s i a n t u n t i j a a + p r i o n i l i h a l t a + p r i o n i t a u t i e n + p r i o r i s o i n n i s s a + p r i o r i s o i n t i a + p r i o r i s o i n u t + p r i o r i s o i t a v a + p r i o r i t e e t e i s s a + p r i o r i t e e t e i s t a + p r i o r i t e e t i n + p r i o r i t e e t i t + p r i o r i t e e t t e i h i n + p r i o r i t e e t t e j a + p r i o r i t e e t t e j a a n + p r i o r i t e e t t i a + p r i o r i t e e t t i a i k a t a u l u s t a + p r i o r i t e e t t i a i n e e s t a + p r i o r i t e e t t i a i n e e t + p r i o r i t e e t t i a i n e i d e n + p r i o r i t e e t t i a i n e i k s i + p r i o r i t e e t t i a i n e i l l e + p r i o r i t e e t t i a i n e i s i i n + p r i o r i t e e t t i a i n e i s t a + p r i o r i t e e t t i a i n e i t a + p r i o r i t e e t t i a i n e l u e t t e l o n + p r i o r i t e e t t i a l u e + p r i o r i t e e t t i a l u e e t + p r i o r i t e e t t i a l u e i l l e + p r i o r i t e e t t i a l u e i t a + p r i o r i t e e t t i e n + p r i o r i t e e t t i j o n o + p r i o r i t e e t t i j ä r j e s t e l m ä n + p r i o r i t e e t t i j ä r j e s t y k s e n + p r i o r i t e e t t i j ä r j e s t y s t ä + p r i o r i t e e t t i l i s t a + p r i o r i t e e t t i l i s t a a + p r i o r i t e e t t i l i s t a l l a + p r i o r i t e e t t i l i s t a l l a n n e + p r i o r i t e e t t i l i s t a n + p r i o r i t e e t t i l u e t t e l o a + p r i o r i t e e t t i l u e t t e l o i h i n + p r i o r i t e e t t i l u e t t e l o s s a + p r i o r i t e e t t i l ä ä k k e i d e n + p r i o r i t e e t t i n a + p r i o r i t e e t t i n s a + p r i o r i t e e t t i t o i m e a + p r i o r i t e e t t i t o i m e n p i t e e s t ä + p r i o r i t e e t t i t o i m i i n + p r o a k t i i v i s e m m a n + p r o a k t i i v i s e m m i n + p r o a k t i i v i s e m p i + p r o a k t i i v i s i n + p r o b i o o t i t + p r o d u k t i i v i s t a + p r o f e e t a t + p r o f e s s o r i n + p r o f e s s o r i t + p r o f i i l e i s t a + p r o f i i l i a + p r o f i i l i a a n + p r o f i i l i n + p r o f i l o i n n i s t a + p r o f i l o i n t i i n + p r o f i l o i n t i j ä r j e s t e l m ä s t ä + p r o f i l o i n t i j ä r j e s t e l m ä ä + p r o f i l o i n t i k y s y m y s t ä + p r o f i l o i n t i t a r k o i t u k s i i n + p r o f i l o i n t i t e k n i i k o i d e n + p r o f i l o i n t i t e k n i i k o i t a + p r o g r e s s i i v i s e m p i + p r o g r e s s i i v i s e m p i a + p r o j e k t e i h i n + p r o j e k t e i s t a + p r o j e k t e j a + p r o j e k t i a + p r o j e k t i a p u + p r o j e k t i e h d o t u k s i a + p r o j e k t i e h d o t u s t e n + p r o j e k t i e n + p r o j e k t i h a k e m u k s i a + p r o j e k t i h a l l i n n o n + p r o j e k t i h a l l i n t o o n + p r o j e k t i j o h t a j a n + p r o j e k t i j o h t a j i a + p r o j e k t i k o h t a i s e t + p r o j e k t i k o h t a i s t a + p r o j e k t i l ä h t ö i s t e n + p r o j e k t i n + p r o j e k t i n h a l l i n n a s t a + p r o j e k t i n h a l l i n t a + p r o j e k t i n h a l l i n t a a + p r o j e k t i n h a l l i n t a a n + p r o j e k t i n h a l l i n t a n n e + p r o j e k t i n h a l l i n t a r y h m i e n + p r o j e k t i n j o h t a j i l l e + p r o j e k t i p ä ä l l i k k ö + p r o j e k t i p ä ä l l i k k ö i n ä + p r o j e k t i p ä ä l l i k ö i d e n + p r o j e k t i r a h o i t u k s e n + p r o j e k t i t y ö r y h m ä + p r o j i s o i n t i m a t e r i a a l i n + p r o l e t a a r e j a + p r o l e t a a r i k i r j a i l i j a i n + p r o m i l l e a + p r o m i l l e n + p r o m i l l e r a j a a + p r o m i l l e r a j a n + p r o m i l l e r a j a n a + p r o m i l l e r a j a t + p r o m o o t i o k a m p a n j a n + p r o m o o t i o k a m p a n j o i h i n + p r o n s s i k a a r i k o l i b r i + p r o n s s i k a u s i + p r o n s s i m i t a l i s t e j a + p r o n s s i n i s k a k y y h k y + p r o n s s i p a t s a a s t a + p r o n s s i p a t s a i d e n + p r o n s s i p a t s a s k i i s t a + p r o n s s i p y r s t ö k o t t a r a i n e n + p r o n s s i s o t i l a s + p r o n s s i s o t u r i + p r o n s s i s o t u r i a + p r o n s s i t u r p i a a l i + p r o n s s i y ö t ä + p r o o s a l l i s e m p a a + p r o o s a r u n o + p r o o s a t e k s t e i n ä + p r o o s a t e k s t i i n + p r o o s a t e k s t i n + p r o p a g a n d a a + p r o p a g a n d a b u d j e t t i a + p r o p a g a n d a d i k t a t u u r i a + p r o p a g a n d a e l o k u v a + p r o p a g a n d a h a n k e + p r o p a g a n d a h y ö k k ä y k s i s s ä + p r o p a g a n d a h y ö k k ä y s + p r o p a g a n d a h y ö k k ä y s t ä + p r o p a g a n d a j u l i s t e i d e n + p r o p a g a n d a j ä r j e s t ö + p r o p a g a n d a k a m p a n j a + p r o p a g a n d a k a m p a n j a a + p r o p a g a n d a k a m p a n j a a n + p r o p a g a n d a k a m p a n j a s t a + p r o p a g a n d a k a m p a n j a t + p r o p a g a n d a k a m p a n j o i d e n + p r o p a g a n d a k a m p a n j o i h i n + p r o p a g a n d a k a m p a n j o i l l a + p r o p a g a n d a k a m p a n j o i l l e + p r o p a g a n d a k a m p a n j o i t a + p r o p a g a n d a k a n g a s t u s + p r o p a g a n d a k e i n o i h i n + p r o p a g a n d a k i e l e n + p r o p a g a n d a k o k o u k s e k s i + p r o p a g a n d a k o n e i s t o + p r o p a g a n d a k o n e i s t o a + p r o p a g a n d a k o n e i s t o o n + p r o p a g a n d a k o n e i s t o s t a + p r o p a g a n d a k s i + p r o p a g a n d a k ä s i t e + p r o p a g a n d a l e h t i + p r o p a g a n d a l l a + p r o p a g a n d a l ä h e t y k s i ä + p r o p a g a n d a m e k a n i s m e j a + p r o p a g a n d a m i n i s t e r i + p r o p a g a n d a m i n i s t e r i ö l l e + p r o p a g a n d a m u o d o i s t a + p r o p a g a n d a n + p r o p a g a n d a n s a + p r o p a g a n d a o s a s t o + p r o p a g a n d a o s a s t o n + p r o p a g a n d a p e l i ä + p r o p a g a n d a p o l i t i i k k a + p r o p a g a n d a p y r k i m y k s i ä + p r o p a g a n d a r i s t i r e t k e s t ä + p r o p a g a n d a s i r k u k s e e n + p r o p a g a n d a s i v u s t o a + p r o p a g a n d a s o d a s s a + p r o p a g a n d a s t a + p r o p a g a n d a t a r k o i t u k s e s s a + p r o p a g a n d a t a r k o i t u k s i a + p r o p a g a n d a t a r k o i t u k s i i n + p r o p a g a n d a t a u l u j a + p r o p a g a n d a t e m p p u + p r o p a g a n d a t e m p p u n a + p r o p a g a n d a t u l v a s t a + p r o p a g a n d a t u l v i e n + p r o p a g a n d a t y ö k a l u + p r o p a g a n d a v a i k u t u k s e n + p r o p a g a n d a v a l h e e n + p r o p a g a n d a v i r a s t o j a + p r o p a g a n d a v o i t t o + p r o p a g a n d a v ä l i n e + p r o p a g a n d a v ä l i n e e k s i + p r o p a g a n d a v ä l i n e e n ä + p r o p a g a n d i s t i s e l l a + p r o p o s i t i o l o g i i k k a + p r o p o s i t i o n + p r o p y l e e n i g l y k o l i + p r o p y l e e n i g l y k o l i m o n o m e t y y l i e e t t e r i a s e t a a t t i + p r o p y l e e n i k a r b o n a a t t i + p r o p y l e e n i o k s i d i + p r o s e n t e i s t a + p r o s e n t i k s i + p r o s e n t i l l a + p r o s e n t i l l e + p r o s e n t i n + p r o s e n t i s s a + p r o s e n t i s t a + p r o s e n t t e j a + p r o s e n t t i a + p r o s e n t t i i n + p r o s e n t t i l u k u + p r o s e n t t i l u k u a + p r o s e n t t i l u k u i h i n + p r o s e n t t i l u k u j a + p r o s e n t t i l u k u j e n + p r o s e n t t i l u v u i s t a + p r o s e n t t i l u v u l l a + p r o s e n t t i m ä ä r i i n + p r o s e n t t i m ä ä r ä i s i k s i + p r o s e n t t i m ä ä r ä ä + p r o s e n t t i m ä ä r ä ä n + p r o s e n t t i o s u u d e n + p r o s e n t t i o s u u d e s t a + p r o s e n t t i o s u u k s i a + p r o s e n t t i o s u u k s i e n + p r o s e n t t i o s u u k s i s t a + p r o s e n t t i o s u u s + p r o s e n t t i o s u u t t a + p r o s e n t t i p e r i a a t e + p r o s e n t t i r a j a n + p r o s e n t t i r a j o j a + p r o s e n t t i s e n + p r o s e n t t i s o s u u s + p r o s e n t t i s ä ä n t ö ä + p r o s e n t t i t a s o l l a + p r o s e n t t i t a u l u k k o a + p r o s e n t t i y k s i k k ö + p r o s e n t t i y k s i k k ö i h i n + p r o s e n t t i y k s i k k ö ä + p r o s e n t t i y k s i k ö l l ä + p r o s e n t t i y k s i k ö n + p r o s e n t u a a l i s e t + p r o s e s s e i h i n + p r o s e s s e i s s a + p r o s e s s e i s t a + p r o s e s s e j a + p r o s e s s e j a m m e + p r o s e s s i a + p r o s e s s i e n + p r o s e s s i i n + p r o s e s s i j o h t a m i n e n + p r o s e s s i k a r t t a + p r o s e s s i k i r j o i t t a m i n e n + p r o s e s s i l a i n s ä ä d ä n n ö s s ä + p r o s e s s i l l a + p r o s e s s i l l e + p r o s e s s i n + p r o s e s s i n o h j a u s + p r o s e s s i n o m a i n e n + p r o s e s s i o i k e u d e n + p r o s e s s i o i k e u d e s s a + p r o s e s s i o i k e u d e s t a + p r o s e s s i o i k e u s + p r o s e s s i o i k e u t e e n + p r o s e s s i o i k e u t t a + p r o s e s s i p o h j a i n e n + p r o s e s s i s s a + p r o s e s s i s t a + p r o s e s s i s ä ä n n ö t + p r o s e s s i t + p r o s e s s i t a i d e + p r o s e s s i t y ö n t e k i j ä t + p r o s e s s i t y ö n t e k i j ö i t ä + p r o s e s s i v a l v o n t a a + p r o s e s s o i n t i a i n e e k s i + p r o s e s s o i n t i a i n e e n a + p r o s e s s o i n t i a l a l l a + p r o s e s s o i n t i p a l k k i o + p r o s e s s o i n t i t e h o + p r o s e s s u a a l i s i a + p r o s e s s u a a l i s i s t a + p r o s e s s u a a l i s t e n + p r o s p e k t i t e o r i a + p r o s t i t u o i d u i k s i + p r o s t i t u o i d u i s t a + p r o s t i t u u t i o l a i n s ä ä d ä n t ö + p r o s t i t u u t i o m a r k k i n o i l l a + p r o s t i t u u t i o n + p r o s t i t u u t i o o n + p r o s t i t u u t i o p a l v e l u i t a + p r o s t i t u u t i o s s a + p r o s t i t u u t i o s t a + p r o s t i t u u t i o t a + p r o s t i t u u t i o t a r j o u k s i l t a + p r o s t i t u u t i o t e o l l i s u u t t a + p r o s t i t u u t i o v e r k o s t o l l e + p r o s t i t u u t i o v e r k o s t o o n + p r o s t i t u u t i o v e r k o s t o t + p r o t e e s e j a + p r o t e i i n i a n a l y t i i k a s s a + p r o t e i i n i f o s f a t a a s i + p r o t e i i n i j a u h o n a + p r o t e i i n i k a s v e j a + p r o t e i i n i k a s v i e n + p r o t e i i n i k a s v i t + p r o t e i i n i k i n a a s i + p r o t e i i n i l a s k o s + p r o t e i i n i l ä h d e + p r o t e i i n i l ä h t e e n ä + p r o t e i i n i l ä h t e i d e n + p r o t e i i n i n l ä h t e i t ä + p r o t e i i n i o n g e l m a a + p r o t e i i n i p i t o i s e n + p r o t e i i n i p i t o i s i a + p r o t e i i n i p i t o i s t a + p r o t e i i n i p i t o i s t e n + p r o t e i i n i p i t o i s u u d e n + p r o t e i i n i p i t o i s u u s + p r o t e i i n i p i t o i s u u t t a + p r o t e i i n i p u l a a n + p r o t e i i n i s u u n n i t e l m a n + p r o t e i i n i s y n t e e s i + p r o t e i i n i t a r p e e n s a + p r o t e i i n i t a s a p a i n o m m e + p r o t e i i n i t u o t a n t o + p r o t e i i n i v a j a u s + p r o t e i i n i v a j e + p r o t e k t i o n i s m i a + p r o t e k t i o n i s m i a a n + p r o t e k t i o n i s m i h a l u j a + p r o t e k t i o n i s m i i n + p r o t e k t i o n i s m i n + p r o t e k t i o n i s m i s t a + p r o t e k t i o n i s t i p u o l u e e s e e n + p r o t e k t i o n i s t i s e m m a n + p r o t e k t i o n i s t i s e m m a t + p r o t e k t i o n i s t i s e m p i + p r o t e k t i o n i s t i s e s t i + p r o t e k t i o n i s t i s i a + p r o t e k t i o n i s t i s i i n + p r o t e k t i o n i s t i s i k s i + p r o t e k t i o n i s t i s i l l a + p r o t e k t i o n i s t i s i l l e + p r o t e k t i o n i s t i s i m m a t + p r o t e k t i o n i s t i s i n + p r o t e k t i o n i s t i s i s t a + p r o t e k t i o n i s t i s t a + p r o t e k t i o n i s t i s t e n + p r o t e s t a n t i t + p r o t e s t a n t t e j a + p r o t e s t a n t t i a k t i v i s t i t + p r o t e s t a n t t i k i r k k o + p r o t e s t a n t t i k i r k o s s a + p r o t e s t a n t t i s e s t i + p r o t e s t a n t t i y h t e i s ö s t ä + p r o t e s t e i h i n + p r o t e s t e i l l a a n + p r o t e s t e i s s a + p r o t e s t e j a + p r o t e s t i a a l t o + p r o t e s t i a a l t o o n + p r o t e s t i k a m p a n j a a + p r o t e s t i k i r j e i d e n + p r o t e s t i l a u l u + p r o t e s t i l e i r i + p r o t e s t i l i i k e + p r o t e s t i l i i k k e e n + p r o t e s t i l i i k k e e s e e n + p r o t e s t i l i i k k e i t ä + p r o t e s t i l u o n t e i s e s t i + p r o t e s t i m i e l e n o s o i t u k s e t + p r o t e s t i m i e l e n o s o i t u k s i s s a + p r o t e s t i r y h m i ä + p r o t e s t i ä ä n e n + p r o t e s t i ä ä n e n ä + p r o t e s t i ä ä n e s t ä j i ä + p r o t e s t i ä ä n i + p r o t e s t o i d a + p r o t e s t o i d e n + p r o t e s t o i d e s s a a n + p r o t e s t o i m a l l a + p r o t e s t o i n t i a + p r o t e s t o i n t i v a l t a a + p r o t e s t o i t a v a + p r o t e s t o i v a t + p r o t o i n d o e u r o o p p a l a i s e t + p r o t o k o l l a m u o d o l l i s u u k s i s t a + p r o t o k o l l a n + p r o t o k o l l a o s a s t o l l a + p r o t o k o l l a o s a s t o n + p r o t o k o l l a s e i k k a + p r o t o k o l l a s ä ä n t ö j ä + p r o t o k o l l a y k s i k k ö + p r o t o n + p r o t o t y y p p i + p r o t o t y y p p i a s t e e l l a + p r o t o t y y p p i p o h j a i n e n + p r o t o t y y p p i r e a k t o r e i t a + p r o v i i s o r e i d e n + p r o v i n s i a a l i s i s t a + p r o v i n s s i k s i + p r o v i n s s i t + p r o v i n s s i t e m p p e l i + p r o v o k a a t i o n a + p r o v o k a a t i o o n + p r o v o k a a t i o s t a + p r o v o k a a t i o t + p r o v o k a a t i o t a p a u k s i s t a + p r o v o k a a t t o r e i t a + p r o v o k a t i i v i s e n a + p r o v o s o i m a t t o m u u d e n + p r o v o s o i n t i a + p r o v o s o i n t i t o i m i + p r o v o s o i t u a + p r o v o s o i v a n a + p r ä t k ä h i i r e t + p s e u d o d e m o k r a a t t i s t a + p s e u d o d o k u m e n t t i + p s e u d o e l i i t i n + p s e u d o k u l t t u u r i + p s e u d o p e r u s t u s l a k i + p s e u d o r a t k a i s u t + p s e u d o t i e t e e l l i s i ä + p s e u d o v a l t i o l l e + p s e u d o v a l t i o n + p s e u d o v a l t i o t a + p s i l o s y b i i n i s i e n e t + p s y k i a t r i s e l l a + p s y k i a t r i s e t + p s y k i a t r i s i i n + p s y k i a t r i s t e n + p s y k o a k t i i v i s t e n + p s y k o f y y s i n e n + p s y k o f y y s i s t ä + p s y k o l o g i a s s a + p s y k o l o g i a s t a + p s y k o l o g i n a p u + p s y k o l o g i n a p u a + p s y k o l o g i s e t + p s y k o l o g i s i a + p s y k o l o g i s i i n + p s y k o l o g i s i n + p s y k o l o g i s t a + p s y k o m i e s + p s y k o o s i a + p s y k o p a a t e i k s i + p s y k o s o s i a a l i n e n + p s y k o s o s i a a l i s e n + p s y k o s o s i a a l i s e t + p s y k o s o s i a a l i s i s t a + p s y k o s o s i a a l i s t a + p s y k o s y n d r o o m a a n + p s y k o s y n d r o o m a s t a + p s y k o t e r a p e u t i n + p s y k o t e r a p i a + p s y k r o m e t r i v a k i o + p s y y k e n v a m m a i s t e n + p s y y k k i s e l l e + p s y y k k i s e s t ä + p s y y k k i s e t + p s y y k k i s i i n + p s y y k k i s i ä + p s y y k k i s t e n + p u b e j a + p u b i p o m m i t + p u b i v i s a + p u d o t e t t i i n + p u d o t e t t u + p u d o t u s p e l i t + p u d o t u s r i n n e + p u e t a a n + p u h a l l i n k v i n t e t t o + p u h a l l u s k o e + p u h a l l u s k o k e e t + p u h a l l u s l a m p p u + p u h a l l u s m u o v a u s + p u h a l l u s s o i t i n + p u h a l t a k a a m m e + p u h a l t a m a a n + p u h d a s h i i l i s t e n + p u h d a s o p p i s u u s p o l i t i i k k a a + p u h d a s r o t u i s e t + p u h d a s t a + p u h d i n + p u h d i s t a m a t o n t a + p u h d i s t a m i s e e n + p u h d i s t a m o j a + p u h d i s t a m o j e n + p u h d i s t a m o j ä t e t t ä + p u h d i s t a m o k a p a s i t e e t i s t a + p u h d i s t a m o l i e t e + p u h d i s t a m o l i e t e d i r e k t i i v i s t ä + p u h d i s t a m o l i e t e t t ä + p u h d i s t a m o l i e t t e e n + p u h d i s t a m o l i e t t e e s t ä + p u h d i s t a m o l i e t t e i d e n + p u h d i s t u k s e n + p u h d i s t u k s e s t a + p u h d i s t u k s i a + p u h d i s t u k s i i n + p u h d i s t u k s i k s i + p u h d i s t u k s i s t a + p u h d i s t u s a i n e i d e n + p u h d i s t u s a i n e i s s a + p u h d i s t u s a i n e i s t a k i n + p u h d i s t u s a i n e i t a + p u h d i s t u s a s e m i e n + p u h d i s t u s h a n k k e i s i i n + p u h d i s t u s h a r j o i t u k s i l l e + p u h d i s t u s j ä r j e s t e l m i i n + p u h d i s t u s j ä r j e s t e l m ä + p u h d i s t u s j ä r j e s t e l m ä ä n + p u h d i s t u s k a m p a n j a s t a + p u h d i s t u s l a i t o k s i a + p u h d i s t u s l a i t o k s i s t a + p u h d i s t u s l a i t o s t a + p u h d i s t u s l a i t o s t e n + p u h d i s t u s l a i t t e i s t o a + p u h d i s t u s l a k i e n + p u h d i s t u s m a k s u i l l a + p u h d i s t u s o p e r a a t i o + p u h d i s t u s o p e r a a t i o l l e + p u h d i s t u s o p e r a a t i o n + p u h d i s t u s o p e r a a t i o t a + p u h d i s t u s s t r a t e g i a a + p u h d i s t u s s u u n n i t e l m i a + p u h d i s t u s t e h t ä v i e n + p u h d i s t u s t e k n i i k a n + p u h d i s t u s t e k n i i k k o i h i n + p u h d i s t u s t e n + p u h d i s t u s t e o l l i s u u t t a + p u h d i s t u s t o i m e t + p u h d i s t u s t o i m i a + p u h d i s t u s t o i m i i n + p u h e a i k a + p u h e a i k a a + p u h e a i k a a m m e + p u h e a i k a a n + p u h e a i k a a n i + p u h e a i k a a n n e + p u h e a i k a a n s a + p u h e a i k a k o k o e l m a n + p u h e a i k a m m e + p u h e a i k a n a + p u h e a i k a n a a n + p u h e a i k a n i + p u h e a i k a n n e + p u h e a i k a n s a + p u h e a i k o j a + p u h e a i k o j a a n + p u h e a i k o j a n n e + p u h e a i k o j e n + p u h e a j a l l e m m e + p u h e a j a n + p u h e a j a s s a + p u h e a j a s t a + p u h e a j a s t a a n + p u h e a j a s t a n i + p u h e a j a t + p u h e a j o i s s a + p u h e a j o i s t a + p u h e e k s i + p u h e e l l a n n e + p u h e e m m e + p u h e e n + p u h e e n a i h e + p u h e e n a i h e e k s i + p u h e e n a i h e e n a + p u h e e n a i h e e t + p u h e e n a i k a a + p u h e e n i + p u h e e n j o h d o l l a + p u h e e n j o h t a j a + p u h e e n j o h t a j a a + p u h e e n j o h t a j a a m m e + p u h e e n j o h t a j a a n + p u h e e n j o h t a j a a n s a + p u h e e n j o h t a j a e h d o k a s + p u h e e n j o h t a j a e h d o k a s t a + p u h e e n j o h t a j a e h d o k k a a k s i + p u h e e n j o h t a j a e h d o k k a a l l e + p u h e e n j o h t a j a e h d o k k a a l t a + p u h e e n j o h t a j a e h d o k k a a n + p u h e e n j o h t a j a e h d o k k a a n a + p u h e e n j o h t a j a e h d o k k a a s e e n + p u h e e n j o h t a j a e h d o k k a a t + p u h e e n j o h t a j a e h d o k k a i t a + p u h e e n j o h t a j a j ä r j e s t e l m ä k s i + p u h e e n j o h t a j a k a u d e l l a + p u h e e n j o h t a j a k a u d e l l a a n + p u h e e n j o h t a j a k a u d e l l a m m e + p u h e e n j o h t a j a k a u d e l l a n i + p u h e e n j o h t a j a k a u d e l l a n n e + p u h e e n j o h t a j a k a u d e l l e + p u h e e n j o h t a j a k a u d e l l e n n e + p u h e e n j o h t a j a k a u d e l t a + p u h e e n j o h t a j a k a u d e n + p u h e e n j o h t a j a k a u d e s t a + p u h e e n j o h t a j a k a u d e s t a a n + p u h e e n j o h t a j a k a u d e t + p u h e e n j o h t a j a k a u s i + p u h e e n j o h t a j a k a u s i a + p u h e e n j o h t a j a k a u s i e n + p u h e e n j o h t a j a k a u s i l l a + p u h e e n j o h t a j a k a u s i n a + p u h e e n j o h t a j a k a u t e e n + p u h e e n j o h t a j a k a u t e m m e + p u h e e n j o h t a j a k a u t e n a + p u h e e n j o h t a j a k a u t e n a a n + p u h e e n j o h t a j a k a u t e n a n n e + p u h e e n j o h t a j a k a u t e n n e + p u h e e n j o h t a j a k a u t e n s a + p u h e e n j o h t a j a k a u t t a + p u h e e n j o h t a j a k a u t t a n n e + p u h e e n j o h t a j a k e s k u s t e l u n + p u h e e n j o h t a j a k i e r t o + p u h e e n j o h t a j a k i e r t o a + p u h e e n j o h t a j a k i l v a s s a + p u h e e n j o h t a j a k i n + p u h e e n j o h t a j a k o k o u k s e e n + p u h e e n j o h t a j a k o k o u k s e l l a + p u h e e n j o h t a j a k o k o u k s e l l e + p u h e e n j o h t a j a k o k o u k s e l t a + p u h e e n j o h t a j a k o k o u k s e m m e + p u h e e n j o h t a j a k o k o u k s e n + p u h e e n j o h t a j a k o k o u k s e s s a + p u h e e n j o h t a j a k o k o u k s e s t a + p u h e e n j o h t a j a k o k o u k s i s s a + p u h e e n j o h t a j a k o k o u s + p u h e e n j o h t a j a k o k o u s k a a n + p u h e e n j o h t a j a k o k o u s t a + p u h e e n j o h t a j a k o l l e g a n i + p u h e e n j o h t a j a k o l l e g o i d e n n e + p u h e e n j o h t a j a k o l m i k k o o n + p u h e e n j o h t a j a k o l m i k o n + p u h e e n j o h t a j a k o l m i k o s s a + p u h e e n j o h t a j a k o n f e r e n s s i + p u h e e n j o h t a j a k o n f e r e n s s i s s a + p u h e e n j o h t a j a k s i + p u h e e n j o h t a j a k u m p p a n e i d e n + p u h e e n j o h t a j a k y s y m y k s e e n + p u h e e n j o h t a j a l l a + p u h e e n j o h t a j a l l e + p u h e e n j o h t a j a l l e m m e + p u h e e n j o h t a j a l t a + p u h e e n j o h t a j a m a a + p u h e e n j o h t a j a m a a h a n + p u h e e n j o h t a j a m a a l l e + p u h e e n j o h t a j a m a a l t a + p u h e e n j o h t a j a m a a n + p u h e e n j o h t a j a m a a n a + p u h e e n j o h t a j a m a a s s a + p u h e e n j o h t a j a m a a s t a + p u h e e n j o h t a j a m a a t + p u h e e n j o h t a j a m a a t a + p u h e e n j o h t a j a m a l l i i n + p u h e e n j o h t a j a m i e s k o k o u k s e e n + p u h e e n j o h t a j a m m e + p u h e e n j o h t a j a n + p u h e e n j o h t a j a n a + p u h e e n j o h t a j a n t a i t o j a + p u h e e n j o h t a j a o h j e l m a n + p u h e e n j o h t a j a s t a + p u h e e n j o h t a j a t + p u h e e n j o h t a j a t a s o l l a + p u h e e n j o h t a j a t i i m i + p u h e e n j o h t a j a t r i o n + p u h e e n j o h t a j a t r o i k a n + p u h e e n j o h t a j a t r o i k a s s a + p u h e e n j o h t a j a t r o i k k a + p u h e e n j o h t a j a v a l t i o + p u h e e n j o h t a j a v a l t i o h a n + p u h e e n j o h t a j a v a l t i o i d e n + p u h e e n j o h t a j a v a l t i o i l l e + p u h e e n j o h t a j a v a l t i o i n a + p u h e e n j o h t a j a v a l t i o i s t a + p u h e e n j o h t a j a v a l t i o i t a + p u h e e n j o h t a j a v a l t i o k i n + p u h e e n j o h t a j a v a l t i o k o l m i k o l t a + p u h e e n j o h t a j a v a l t i o k o l m i k o n + p u h e e n j o h t a j a v a l t i o l l a + p u h e e n j o h t a j a v a l t i o l l e + p u h e e n j o h t a j a v a l t i o l t a + p u h e e n j o h t a j a v a l t i o n + p u h e e n j o h t a j a v a l t i o n a + p u h e e n j o h t a j a v a l t i o o n + p u h e e n j o h t a j a v a l t i o s t a + p u h e e n j o h t a j a v a l t i o t + p u h e e n j o h t a j a v a l t i o t a + p u h e e n j o h t a j a v a l t i o t r o i k a n + p u h e e n j o h t a j a v e t o i s e l t a + p u h e e n j o h t a j a v u o r o s s a + p u h e e n j o h t a j i a + p u h e e n j o h t a j i e n + p u h e e n j o h t a j i i n + p u h e e n j o h t a j i l l e + p u h e e n j o h t a j i l t a + p u h e e n j o h t a j i n a + p u h e e n j o h t a j i s t a + p u h e e n j o h t a j i s t o + p u h e e n j o h t a j i s t o l l a + p u h e e n j o h t a j i s t o l l e + p u h e e n j o h t a j i s t o n + p u h e e n j o h t a j i s t o s t a + p u h e e n j o h t a j u u d e l l e + p u h e e n j o h t a j u u d e n + p u h e e n j o h t a j u u d e s t a + p u h e e n j o h t a j u u k s i i n + p u h e e n j o h t a j u u k s i s t a + p u h e e n j o h t a j u u s + p u h e e n j o h t a j u u s j ä r j e s t e l m ä ä n + p u h e e n j o h t a j u u s k a u d e l l a + p u h e e n j o h t a j u u s k a u d e l l a a n + p u h e e n j o h t a j u u s k a u d e l l a m m e + p u h e e n j o h t a j u u s k a u d e l l a n n e + p u h e e n j o h t a j u u s k a u d e n + p u h e e n j o h t a j u u s k a u s i + p u h e e n j o h t a j u u s k a u s i a + p u h e e n j o h t a j u u s k a u s i l l a + p u h e e n j o h t a j u u s k a u t e e n + p u h e e n j o h t a j u u s k a u t e n s a + p u h e e n j o h t a j u u s t e e m a s s a + p u h e e n j o h t a j u u s t e h t ä v i ä m m e + p u h e e n j o h t a j u u t e e n + p u h e e n j o h t a j u u t t a + p u h e e n j o h t a j u u t t a n n e + p u h e e n n e + p u h e e n p u h e e n j o h t a j a t + p u h e e n s a + p u h e e n s o r i n a a n + p u h e e n t u n n i s t u s + p u h e e n v u o r o + p u h e e n v u o r o a + p u h e e n v u o r o a a n + p u h e e n v u o r o a n i + p u h e e n v u o r o a n n e + p u h e e n v u o r o i h i n + p u h e e n v u o r o i h i n n e + p u h e e n v u o r o i l l a a n + p u h e e n v u o r o i s s a + p u h e e n v u o r o i s s a a n + p u h e e n v u o r o i s s a n i + p u h e e n v u o r o i s t a + p u h e e n v u o r o i s t a a n + p u h e e n v u o r o i s t a n n e + p u h e e n v u o r o j a + p u h e e n v u o r o j a a n + p u h e e n v u o r o j a n n e + p u h e e n v u o r o j e n + p u h e e n v u o r o j e n n e + p u h e e n v u o r o j ä r j e s t e l y i s t ä + p u h e e n v u o r o j ä r j e s t y s t ä + p u h e e n v u o r o k i e r r o k s i l l a + p u h e e n v u o r o l l a n i + p u h e e n v u o r o l t a + p u h e e n v u o r o l u p a a + p u h e e n v u o r o n + p u h e e n v u o r o n i + p u h e e n v u o r o n n e + p u h e e n v u o r o n s a + p u h e e n v u o r o o n + p u h e e n v u o r o o n i + p u h e e n v u o r o p y y n n ö t + p u h e e n v u o r o p y y n t ö + p u h e e n v u o r o p y y n t ö i h i n + p u h e e n v u o r o p y y n t ö j ä + p u h e e n v u o r o p y y n t ö n i + p u h e e n v u o r o p y y n t ö ä + p u h e e n v u o r o s s a + p u h e e n v u o r o s s a a n + p u h e e n v u o r o s s a m m e + p u h e e n v u o r o s s a n i + p u h e e n v u o r o s s a n n e + p u h e e n v u o r o s t a + p u h e e n v u o r o s t a a n + p u h e e n v u o r o s t a n i + p u h e e n v u o r o s t a n n e + p u h e e n v u o r o t + p u h e e s s a + p u h e e s s a a n + p u h e e s s a n i + p u h e e s s a n n e + p u h e e s t a + p u h e e s t a a n + p u h e e s t a n i + p u h e e s t a n n e + p u h e e t + p u h e i d e n + p u h e i k s i + p u h e i s s a a n + p u h e i s s a m m e + p u h e i s t a + p u h e i t a + p u h e i t a m m e + p u h e i t t e m m e + p u h e j ä r j e s t y k s e e n + p u h e k e l a + p u h e k i e l i + p u h e k i e r r o k s e n + p u h e k i l p a i l u j a + p u h e k o r p u s + p u h e k u p l a + p u h e k u p l i n + p u h e l i a i t a + p u h e l i m e e n + p u h e l i m e n + p u h e l i m e s s a + p u h e l i m e s t a + p u h e l i m i a + p u h e l i n a l a l l a + p u h e l i n a l a n + p u h e l i n d i r e k t i i v i + p u h e l i n h u i j a u k s e t + p u h e l i n h u i j a u s t a + p u h e l i n i n s i n ö ö r i + p u h e l i n j ä r j e s t e l m i s s ä + p u h e l i n j ä r j e s t e l m i s t ä + p u h e l i n j ä r j e s t e l m ä + p u h e l i n k a a n + p u h e l i n k e s k u k s i l l e + p u h e l i n k e s k u s + p u h e l i n k e s k u s t e l u i s t a + p u h e l i n k e s k u s t e l u j a + p u h e l i n k e s k u s t e l u j a a n + p u h e l i n k e s k u s t e l u j e n + p u h e l i n k e s k u s t e l u n + p u h e l i n k e s k u s t e l u t + p u h e l i n k e s k u s t e n + p u h e l i n k i o s k e j a + p u h e l i n k i o s k i + p u h e l i n k i o s k i e n + p u h e l i n k o n f e r e n s s i n + p u h e l i n k o n f e r e n s s i s s a + p u h e l i n k o p p e i h i n + p u h e l i n k o p p e j a + p u h e l i n k o r t e i s t a + p u h e l i n k o r t t e j a + p u h e l i n k u l u i h i n + p u h e l i n k u u n t e l u + p u h e l i n k u u n t e l u a + p u h e l i n l a i t o s + p u h e l i n l a i t o s t e n + p u h e l i n l a s k u + p u h e l i n l a s k u a + p u h e l i n l a s k u j e n + p u h e l i n l a s k u l l a + p u h e l i n l a s k u n + p u h e l i n l a s k u t + p u h e l i n l i i k e n n e + p u h e l i n l i i k e n n e a l a a + p u h e l i n l i i k e n n e a l a l l a + p u h e l i n l i i k e n n e p a l v e l u i h i n + p u h e l i n l i i k e n n e p a l v e l u n + p u h e l i n l i i k e n n e p a l v e l u t + p u h e l i n l i i k e n n e t t ä + p u h e l i n l i i k e n t e e n + p u h e l i n l i i t t y m i i n + p u h e l i n l i i t t y m ä s t ä + p u h e l i n l i n j a + p u h e l i n l i n j a a + p u h e l i n l i n j a n s a + p u h e l i n l i n j a s t a + p u h e l i n l i n j a t + p u h e l i n l i n j o i h i n + p u h e l i n l i n j o i s t a + p u h e l i n l i n j o j a + p u h e l i n l u e t t e l o + p u h e l i n l u e t t e l o a + p u h e l i n l u e t t e l o i d e n + p u h e l i n l u e t t e l o i h i n + p u h e l i n l u e t t e l o j e n + p u h e l i n l u e t t e l o k s i + p u h e l i n l u e t t e l o n + p u h e l i n l u e t t e l o o n + p u h e l i n l u e t t e l o s t a + p u h e l i n l u e t t e l o t + p u h e l i n m a i n o n t a + p u h e l i n m a k s u j e n + p u h e l i n m a k s u j ä r j e s t e l m ä t + p u h e l i n m a k s u t + p u h e l i n m a r k k i n a t + p u h e l i n m a r k k i n o i d e n + p u h e l i n m y y n n i n + p u h e l i n n e u v o n t a + p u h e l i n n e u v o n t a a + p u h e l i n n e u v o n t a p i s t e i t ä + p u h e l i n n u m e r o + p u h e l i n n u m e r o a + p u h e l i n n u m e r o a a n + p u h e l i n n u m e r o i d e n + p u h e l i n n u m e r o i l l a + p u h e l i n n u m e r o i s t a + p u h e l i n n u m e r o i t a + p u h e l i n n u m e r o n + p u h e l i n n u m e r o n n e + p u h e l i n n u m e r o n s a + p u h e l i n n u m e r o s t a + p u h e l i n n u m e r o t + p u h e l i n o i k e u d e n + p u h e l i n o p e r a a t t o r e i d e n + p u h e l i n o p e r a a t t o r i a + p u h e l i n o p e r a a t t o r i e n + p u h e l i n o p e r a a t t o r i t + p u h e l i n p a l a u t t e i d e n + p u h e l i n p a l v e l u i h i n + p u h e l i n p a l v e l u i s s a + p u h e l i n p a l v e l u j a + p u h e l i n p a l v e l u j e n + p u h e l i n p a l v e l u k e s k u k s e n + p u h e l i n p a l v e l u k e s k u k s e s t a + p u h e l i n p a l v e l u k e s k u k s e t + p u h e l i n p a l v e l u k e s k u s + p u h e l i n p a l v e l u l i n j o j e n + p u h e l i n p a l v e l u n + p u h e l i n p a l v e l u n s a + p u h e l i n p a l v e l u t + p u h e l i n p ö y t ä + p u h e l i n s a l a i s u u s + p u h e l i n s a l a i s u u s s u o j a n s a + p u h e l i n s e k s i + p u h e l i n s i g n a a l i e n + p u h e l i n s o i t o i l l a + p u h e l i n s o i t o i l t a + p u h e l i n s o i t o i n + p u h e l i n s o i t o i s t a + p u h e l i n s o i t o n + p u h e l i n s o i t o s t a + p u h e l i n s o i t o t + p u h e l i n s o i t t o + p u h e l i n s o i t t o a + p u h e l i n s o i t t o i h i n + p u h e l i n s o i t t o j a + p u h e l i n s o i t t o j e n + p u h e l i n t a + p u h e l i n t e k n i i k a n + p u h e l i n t e k n i i k k a + p u h e l i n t e n + p u h e l i n t e o l l i s u u s + p u h e l i n t o i m i n t a + p u h e l i n t o i m i n t a a + p u h e l i n t o i m i n t a a n + p u h e l i n t o i m i n t a d i r e k t i i v i n + p u h e l i n t o i m i n t a p a l v e l u j a + p u h e l i n v a s t a a j a + p u h e l i n v e r k k o + p u h e l i n v e r k o n + p u h e l i n v e r k o t + p u h e l i n v i e s t i n n ä n + p u h e l i n v i e s t i n n ä s s ä + p u h e l i n v i e s t i n t ä + p u h e l i n v i e s t i n t ä ä + p u h e l i n y h t e y d e n + p u h e l i n y h t e y d e s s ä + p u h e l i n y h t e y k s i e n + p u h e l i n y h t i ö + p u h e l i n y h t i ö i d e n + p u h e l i n y h t i ö i t ä + p u h e l i n y h t i ö l t ä ä n + p u h e l i n y h t i ö n + p u h e l i n y h t i ö t + p u h e l i n y h t i ö t ä + p u h e l i n y r i t y k s e n + p u h e l u a + p u h e l u i h i n + p u h e l u i s t a + p u h e l u i t a + p u h e l u j a + p u h e l u j a n n e + p u h e l u j e n + p u h e l u j ä r j e s t e l m ä + p u h e l u k o r t t i + p u h e l u m a k s u j a + p u h e l u m a k s u j e n + p u h e l u m a k s u t + p u h e l u n + p u h e l u s t a + p u h e l u t + p u h e m i e h e k s i + p u h e m i e h e l l e + p u h e m i e h e l l ä + p u h e m i e h e l t ä + p u h e m i e h e l t ä m m e + p u h e m i e h e m m e + p u h e m i e h e n + p u h e m i e h e n n e + p u h e m i e h e n ä + p u h e m i e h e s t ä + p u h e m i e h e t + p u h e m i e h i s t ö + p u h e m i e h i s t ö k ä ä n + p u h e m i e h i s t ö l l e + p u h e m i e h i s t ö n + p u h e m i e h i s t ö s s ä + p u h e m i e h i s t ö s s ä k i n + p u h e m i e h i s t ö ä + p u h e m i e h i s t ö ö n + p u h e m i e s + p u h e m i e s k a u d e l l a + p u h e m i e s k a u d e l l a n i + p u h e m i e s k a u d e l l a n n e + p u h e m i e s k a u t e n n e + p u h e m i e s k i n + p u h e m i e s k o k o u k s e n + p u h e m i e s k o l l e g a a n s a + p u h e m i e s k o l l e g o i s t a n i + p u h e m i e s k o n f e r e n s s i + p u h e m i e s k o n f e r e n s s i a + p u h e m i e s k o n f e r e n s s i i n + p u h e m i e s k o n f e r e n s s i l l a + p u h e m i e s k o n f e r e n s s i l l e + p u h e m i e s k o n f e r e n s s i l t a + p u h e m i e s k o n f e r e n s s i n + p u h e m i e s k o n f e r e n s s i s s a + p u h e m i e s k o n f e r e n s s i s t a + p u h e m i e s n e u v o s t o + p u h e m i e s n e u v o s t o l t a + p u h e m i e s p a r a n + p u h e m i e s t ä + p u h e m i e s v a a l i n + p u h e m y l l y i k s i + p u h e n a i s e n + p u h e n o p e u d e s s a + p u h e o i k e u d e n + p u h e o i k e u k s i a + p u h e o i k e u s + p u h e o i k e u t e n i + p u h e o i k e u t t a + p u h e o i k e u t t a a n + p u h e r a d i o + p u h e s y n t e e s i + p u h e t a i t o + p u h e t e k n o l o g i a + p u h e t o i m i t u s + p u h e t t a + p u h e t t a n i + p u h e t t a n n e + p u h e v a p a u d e n + p u h e v a p a u t t a + p u h e v i e s t i n n ä s s ä k i n + p u h e v i k a i s i l l e + p u h j e t a + p u h k a i s t a a n + p u h k e a a + p u h k e a m a t o n + p u h k e a m i s e n + p u h k e a m i s t a + p u h k e a m i s t i l a n n e t t a + p u h t a a k s i + p u h t a a m m a k s i + p u h t a a m m a l l a + p u h t a a m m a n + p u h t a a m m a s t a + p u h t a a m m a t + p u h t a a m m i l l e + p u h t a a m m i s t a + p u h t a a m p a a + p u h t a a m p i + p u h t a a m p i e n + p u h t a a m p i i n + p u h t a a n + p u h t a a n a p i t o p a l v e l u j a + p u h t a a s e e n + p u h t a a s s a + p u h t a a s t a + p u h t a a t + p u h t a i d e n + p u h t a i l l e + p u h t a i m m i l l a a n + p u h t a i m p i a + p u h t a i n + p u h t a i s i i n + p u h t a i s t a + p u h t a i t a + p u h t a u d e s t a + p u h t a u s k r i t e e r e i s t ä + p u h t a u s k r i t e e r i e n + p u h t a u s p a l v e l u j e n + p u h t a u s t a s o + p u h t a u s v a a t i m u k s e t + p u h t a u s v a a t i m u s + p u h t i a + p u h t o i s e k s i + p u h u a + p u h u a k a a n + p u h u a k s e n i + p u h u e n + p u h u e s s a a n + p u h u e s s a m m e + p u h u e s s a n i + p u h u e s s a n n e + p u h u i + p u h u i m m e + p u h u i n + p u h u i s i + p u h u i s i n + p u h u i s i n k o + p u h u i t t e + p u h u i t t e k i n + p u h u i t t e k o + p u h u i v a t + p u h u j a a + p u h u j a a n + p u h u j a j o n o s s a + p u h u j a j ä r j e s t y k s e e n + p u h u j a k o r o k k e e l l e + p u h u j a k o r o k k e e l t a + p u h u j a l i s t a + p u h u j a l i s t a a + p u h u j a l i s t a a n + p u h u j a l i s t a l l a + p u h u j a l i s t a l t a + p u h u j a l i s t a n + p u h u j a l i s t a s s a + p u h u j a l i s t a s t a + p u h u j a l i s t a s t a n i + p u h u j a l i s t a t + p u h u j a l l e + p u h u j a l u e t t e l o + p u h u j a l u e t t e l o a + p u h u j a l u e t t e l o a n n e + p u h u j a l u e t t e l o i d e n + p u h u j a l u e t t e l o n + p u h u j a l u e t t e l o o n + p u h u j a l u e t t e l o s s a + p u h u j a l u e t t e l o s t a + p u h u j a m ä ä r ä + p u h u j a m ä ä r ä n + p u h u j a n + p u h u j a n l a h j o j a n n e + p u h u j a s t a + p u h u j a t + p u h u j a t o v e r e i t a + p u h u j i a + p u h u j i e n + p u h u j i l l e + p u h u j i s t a + p u h u k a a + p u h u k a a m m e + p u h u m a a n + p u h u m a l l a + p u h u m a s s a + p u h u m a s t a + p u h u m a t t a + p u h u m i s e s t a + p u h u m m e + p u h u m m e k i n + p u h u m m e k o + p u h u m m e p a + p u h u n + p u h u n e e l l e + p u h u n e e n + p u h u n e e t + p u h u n k o + p u h u n u t + p u h u n u t t a + p u h u t a a n + p u h u t a a n k o + p u h u t a a n p a + p u h u t e l t a v a + p u h u t t a e s s a + p u h u t t a v a a + p u h u t t a v i a + p u h u t t a v i e n + p u h u t t a v i l l e + p u h u t t e + p u h u t t e k o + p u h u t t e l e m a s t a + p u h u t t e l e v i m p a a n + p u h u t t e l u u n + p u h u t t i i n + p u h u t t u a + p u h u t u i n + p u h u t u s t a + p u h u t u t + p u h u u + p u h u u k o + p u h u v a a + p u h u v a n + p u h u v a n i + p u h u v a t + p u h u v i n a n i + p u h v e l i h e i n ä + p u h v e l i k u t o j a + p u h v e l i s a m m a k k o + p u i d e n + p u i h i n + p u i k k o l a s k e n t a + p u i k k o m o n n i + p u i k o i l l a + p u i k o t + p u i l t a + p u i s i a + p u i s i s s a + p u i s t a t t i + p u i s t o a l u e e n + p u i s t o h a n k e + p u i s t o h e r k k u s i e n i + p u i s t o k ä e n r i e s k a + p u i s t o k ä r p ä s s i e n i + p u i s t o l e m m i k k i + p u i s t o l l a + p u i s t o m a t a r a + p u i s t o n u r m i k k a + p u i s t o p ö k k ö s i e n i + p u i s t o p ö l l ö + p u i s t o t i a i n e n + p u i s t o u k o n s i e n i + p u i s t o y m p ä r i s t ö + p u i t a + p u i t e a r t i k l a + p u i t e a s e t u k s e e n + p u i t e a s e t u k s e l l a + p u i t e a s e t u k s e n + p u i t e a s e t u k s e s s a + p u i t e a s e t u k s e s t a + p u i t e a s e t u k s i a + p u i t e a s e t u k s i s t a + p u i t e a s e t u s + p u i t e a s e t u s e h d o t u k s e e n + p u i t e a s e t u s t a + p u i t e a s e t u s t e n + p u i t e a s i a k i r j a + p u i t e a s i a k i r j a a + p u i t e a s i a k i r j a a n + p u i t e a s i a k i r j a l l a + p u i t e a s i a k i r j a n + p u i t e a s i a k i r j a s s a + p u i t e a s i a k i r j a s t a + p u i t e d i r e k t i i v e i h i n + p u i t e d i r e k t i i v e i n ä + p u i t e d i r e k t i i v e i s s ä + p u i t e d i r e k t i i v e i s t ä + p u i t e d i r e k t i i v e j ä + p u i t e d i r e k t i i v i + p u i t e d i r e k t i i v i e h d o t u k s e e n + p u i t e d i r e k t i i v i e h d o t u k s e n + p u i t e d i r e k t i i v i e h d o t u k s e s t a + p u i t e d i r e k t i i v i e h d o t u s + p u i t e d i r e k t i i v i e n + p u i t e d i r e k t i i v i i n + p u i t e d i r e k t i i v i k s i + p u i t e d i r e k t i i v i l l e + p u i t e d i r e k t i i v i l l ä + p u i t e d i r e k t i i v i l u o n n o k s e l l a + p u i t e d i r e k t i i v i l u o n n o k s e n + p u i t e d i r e k t i i v i l u o n n o s + p u i t e d i r e k t i i v i n + p u i t e d i r e k t i i v i n n e + p u i t e d i r e k t i i v i n s ä + p u i t e d i r e k t i i v i n ä + p u i t e d i r e k t i i v i s s ä + p u i t e d i r e k t i i v i s s ä ä n + p u i t e d i r e k t i i v i s t ä + p u i t e d i r e k t i i v i t + p u i t e d i r e k t i i v i ä + p u i t e j ä r j e s t e l y + p u i t e k e h y s t ä + p u i t e k u m p p a n u u s s o p i m u s + p u i t e k ä s i t e + p u i t e l a i n + p u i t e l a i n s ä ä d ä n n ö k s i + p u i t e l a i n s ä ä d ä n n ö l l i s i n + p u i t e l a i n s ä ä d ä n n ö n + p u i t e l a i n s ä ä d ä n n ö s s ä + p u i t e l a i n s ä ä d ä n n ö s t ä + p u i t e l a i n s ä ä d ä n t ö + p u i t e l a i n s ä ä d ä n t ö e h d o t u k s e e n + p u i t e l a i n s ä ä d ä n t ö p r o s e s s i n + p u i t e l a i n s ä ä d ä n t ö ä + p u i t e l a i n s ä ä d ä n t ö ö n + p u i t e l a i s s a + p u i t e l a i t + p u i t e l a k i + p u i t e l a k i a + p u i t e l a k i i n + p u i t e l u o n n o s + p u i t e l u o t t o j a + p u i t e m u o t o i l u j a + p u i t e m ä ä r ä r a h o i s t a + p u i t e n o r m i n + p u i t e o h j e e t + p u i t e o h j e l m a a + p u i t e o h j e l m a a k i n + p u i t e o h j e l m a a n + p u i t e o h j e l m a a n n e + p u i t e o h j e l m a e h d o t u k s e n s a + p u i t e o h j e l m a e h d o t u s + p u i t e o h j e l m a e h d o t u s t a + p u i t e o h j e l m a h a n k k e i s i i n + p u i t e o h j e l m a k i n + p u i t e o h j e l m a k s i + p u i t e o h j e l m a l l a + p u i t e o h j e l m a l l e + p u i t e o h j e l m a l t a + p u i t e o h j e l m a n + p u i t e o h j e l m a n s a + p u i t e o h j e l m a p a k e t t i + p u i t e o h j e l m a s s a + p u i t e o h j e l m a s s a m m e + p u i t e o h j e l m a s t a + p u i t e o h j e l m a t + p u i t e o h j e l m a v ä l i n e i d e n + p u i t e o h j e l m i a + p u i t e o h j e l m i e n + p u i t e o h j e l m i i n + p u i t e o h j e l m i l l a + p u i t e o h j e l m i l l e + p u i t e o h j e l m i s s a + p u i t e o h j e l m i s t a + p u i t e o l o s u h t e i t a + p u i t e p e r i a a t t e e t + p u i t e p e r i a a t t e i d e n + p u i t e p o l i t i i k k a a + p u i t e p ä ä t ö k s e e n + p u i t e p ä ä t ö k s e k s i + p u i t e p ä ä t ö k s e l l e + p u i t e p ä ä t ö k s e l l ä + p u i t e p ä ä t ö k s e n + p u i t e p ä ä t ö k s e n ä + p u i t e p ä ä t ö k s e s s ä + p u i t e p ä ä t ö k s e s s ä ä n + p u i t e p ä ä t ö k s e s t ä + p u i t e p ä ä t ö k s e t + p u i t e p ä ä t ö k s i e n + p u i t e p ä ä t ö k s i i n + p u i t e p ä ä t ö k s i k s i + p u i t e p ä ä t ö k s i l l e + p u i t e p ä ä t ö k s i l l ä + p u i t e p ä ä t ö k s i s t ä + p u i t e p ä ä t ö k s i ä + p u i t e p ä ä t ö s + p u i t e p ä ä t ö s a l o i t e t t a + p u i t e p ä ä t ö s e h d o t u k s e e n + p u i t e p ä ä t ö s e h d o t u k s e n + p u i t e p ä ä t ö s e h d o t u k s e s t a + p u i t e p ä ä t ö s e h d o t u k s i i n + p u i t e p ä ä t ö s e h d o t u s + p u i t e p ä ä t ö s e h d o t u s t e n + p u i t e p ä ä t ö s l a u s e l m a a n + p u i t e p ä ä t ö s l a u s e l m a n + p u i t e p ä ä t ö s l u o n n o k s e k s i + p u i t e p ä ä t ö s l u o n n o k s e l l e + p u i t e p ä ä t ö s l u o n n o k s e n + p u i t e p ä ä t ö s l u o n n o k s e n s a + p u i t e p ä ä t ö s l u o n n o k s e s t a + p u i t e p ä ä t ö s l u o n n o k s i a + p u i t e p ä ä t ö s l u o n n o s + p u i t e p ä ä t ö s l u o n n o s t a + p u i t e p ä ä t ö s t e n + p u i t e p ä ä t ö s t ä + p u i t e r a k e n t e e n + p u i t e s o p i m u k s e e n + p u i t e s o p i m u k s e k s i + p u i t e s o p i m u k s e l l a + p u i t e s o p i m u k s e l l e + p u i t e s o p i m u k s e m m e + p u i t e s o p i m u k s e n + p u i t e s o p i m u k s e n s a + p u i t e s o p i m u k s e s s a + p u i t e s o p i m u k s e s s a a n + p u i t e s o p i m u k s e s s a m m e + p u i t e s o p i m u k s e s t a + p u i t e s o p i m u k s e t + p u i t e s o p i m u k s i a + p u i t e s o p i m u k s i e n + p u i t e s o p i m u k s i i n + p u i t e s o p i m u k s i s t a + p u i t e s o p i m u s + p u i t e s o p i m u s l u o n n o s + p u i t e s o p i m u s n e u v o t t e l u i s s a + p u i t e s o p i m u s t a + p u i t e s o p i m u s t a m m e + p u i t e s o p i m u s t e n + p u i t e s t r a t e g i a + p u i t e s t r a t e g i a a + p u i t e s t r a t e g i a a n + p u i t e s t r a t e g i a l l a + p u i t e s t r a t e g i a n + p u i t e s t r a t e g i a s s a + p u i t e s t r a t e g i a s s a a n + p u i t e s t r a t e g i a s t a + p u i t e s t r a t e g i a s t a m m e + p u i t e s u h t e e t + p u i t e s u u n n i t e l m a + p u i t e s u u n n i t e l m a n + p u i t e s ä ä d ö k s e n + p u i t e s ä ä n n ö i s t ä + p u i t e s ä ä n n ö s t e n + p u i t e s ä ä n n ö t + p u i t e s ä ä n t e l y s t ä + p u i t e s ä ä n t ö j e n + p u i t e s ä ä n t ö j ä + p u i t e t a l o u s a r v i o s s a + p u i t e t a v o i t t e e t + p u i t e t e k s t e j ä + p u i t e t u t k i m u s o h j e l m a n + p u i t e y l e i s s o p i m u k s e e n + p u i t e y l e i s s o p i m u k s e n + p u i t e y l e i s s o p i m u k s e s s a + p u i t e y l e i s s o p i m u s + p u i t e y l e i s s o p i m u s t a + p u i t t e e n a + p u i t t e e t + p u i t t e i d e n + p u i t t e i k s i + p u i t t e i s i i m m e + p u i t t e i s i i n + p u i t t e i s t a + p u i t t e i t a + p u j o t t e l u l i n j a k s i + p u k e u t u m i s k i e l t o + p u k e u t u m i s o h j e + p u k e u t u m i s s ä ä n n ö t + p u k e u t u m i s s ä ä n t ö j e n + p u k e u t u m i s s ä ä n t ö j ä + p u k e u t u m i s t a v a s t a + p u k i n j u u r i + p u k i n p u n a t ä p l ä + p u k i n s o r k k a a + p u k k i a + p u k u h u o n e e s e e n + p u k u s u u n n i t t e l i j a + p u l a a + p u l a a n + p u l a n + p u l a s s a + p u l i t u u r i + p u l l a s t a + p u l l i s t e l e v a t + p u l l i s t e l e v i l l e + p u l l i s t e l u n + p u l l o i s s a + p u l l o j e n + p u l l o j e n p a l a u t u s j ä r j e s t e l m ä ä n + p u l l o j u k k a + p u l l o k a p o k k i p u u + p u l l o k o k o j e n + p u l l o k u o n o d e l f i i n i + p u l l o n + p u l l o n a v a a j a + p u l l o n k a u l a i l m i ö + p u l l o n k a u l a s t a + p u l l o n k a u l a t + p u l l o n k a u l o i s s a + p u l l o n k a u l o j a + p u l l o n k a u l o j e n + p u l l o n p a l a u t u s + p u l l o n p a l a u t u s j ä r j e s t e l m ä ä n + p u l l o n p y ö r i t y s + p u l l o n v a l m i s t a j a + p u l l o p o s t i + p u l l o r u o k i n t a a + p u l l o s a r a + p u l l o v e s i + p u l l u k k a m e r i h e v o n e n + p u l m a k y s y m y s t ä + p u l m a l l i s i m m a n + p u l m a l l i s t a + p u l m a m m e + p u l m a n + p u l m a n a + p u l m u s k i u r u + p u l m u s k y y h k y + p u l m u s s o r s a + p u l s k a n e i l i k k a + p u l s s i k o o d i m o d u l a a t i o + p u l s s i n l e v e y s m o d u l a a t i o + p u l s s i s u h d e + p u l t t i l u k k o + p u l t t i p i s t o o l i + p u l t t i p i s t o o l i l l a + p u m m i l l a + p u m p p u j a + p u m p p u j ä r j e s t e l m ä ä + p u m p p u v o i m a l a i t o s + p u m p u l i h ä n t ä k a n i i n i + p u n a e v ä t e t r a + p u n a h e l m i p e i p p o + p u n a h e l t t a m e s i k k o + p u n a h i l k k a + p u n a h o h t o k a i j a + p u n a h u i v i k u t o j a + p u n a h u k k a + p u n a h u p p u + p u n a h u p p u k u t o j a + p u n a h u p p u m e s i k k o + p u n a h ä n t ä m a a o r a v a + p u n a i m u b a r b i + p u n a i s e e n + p u n a i s e l l a + p u n a i s e l l e + p u n a i s e l t a + p u n a i s e n + p u n a i s e n a + p u n a i s e n m e r e n + p u n a i s e n m e r e n l a i v u e + p u n a i s e s t a + p u n a i s i a + p u n a i s i i n + p u n a i s t a + p u n a j a l k a h a u k k a + p u n a j a l k a k a j a v a + p u n a j a l k a s u u l a + p u n a j a l k a v i k l o + p u n a j a l o h a u k k a + p u n a j u u r i s t a + p u n a j ä k ä l ä + p u n a j ä t t i k e n g u r u + p u n a k a a l i + p u n a k a a p u k u t o j a + p u n a k a a r t i + p u n a k a a r t i n + p u n a k a l l o + p u n a k a m p e l a + p u n a k a m p e l a k a n t a + p u n a k a m p e l a k a n t o j e n + p u n a k a m p e l a k i i n t i ö s t ä + p u n a k a r d i n a a l i + p u n a k a t a r a + p u n a k a t k o + p u n a k a u l a g a s e l l i + p u n a k a u l a h a n h i + p u n a k a u l a k e n g u r u + p u n a k a u l u s p i i s p a + p u n a k a u l u s t i k k a + p u n a k e h n ä y ö k k ö n e n + p u n a k e l t a v e r k k o p e r h o n e n + p u n a k h m e r + p u n a k h m e r i e n + p u n a k h m e r i t + p u n a k i p u a j a + p u n a k o i p i r ä i k k ä + p u n a k o i r a n k ö y n n ö s + p u n a k o i s o + p u n a k o r a l l i + p u n a k o r a l l i e n + p u n a k o r v a k i l p i k o n n a + p u n a k o s m o s k u k k a + p u n a k o t t a r a i n e n + p u n a k u i r i + p u n a k u l m a k i i p i j ä + p u n a k u l m a m e s i k k o + p u n a k u o n o + p u n a k u p u k o t i n g a + p u n a k u r k k u k o t i n g a + p u n a k u r k k u l o h i + p u n a k u r k k u m e s i k k o + p u n a k u u s i + p u n a k y l k i m e s i k k o + p u n a k y n ä ä n s ä + p u n a k ä m m e k k ä + p u n a k ä r p ä s s i e n i + p u n a k ä ä r m e t ä h t i + p u n a l a h o k k a + p u n a l a k k i k i u r u + p u n a l a k k i k u t o j a + p u n a l a k k i l e p i n k ä i n e n + p u n a l a k k i p i p i l o + p u n a l a t v a + p u n a l a t v a h a a r a k a s + p u n a l e h t i r u u s u + p u n a l e p i n k ä i n e n + p u n a l e p p ä + p u n a l e u k a l u r i k k i + p u n a l e v ä t + p u n a l i e j u + p u n a l i e j u j ä t t e e t + p u n a l i e r o + p u n a l i e t e + p u n a l i e t e t t ä + p u n a l i e t t e e n + p u n a l i i v i k a r d i n a a l i + p u n a l i i v i k u t o j a + p u n a l i p p u + p u n a l o h i + p u n a l u r i + p u n a m a a l i k u l t t u u r i + p u n a m a l j a k a s + p u n a m a r j a k a n u k k a + p u n a m e r i t ä h t i + p u n a m e s i k k o + p u n a m u s t a + p u n a m u s t a n + p u n a m u u r a h a i s p e i p p o + p u n a m u u r a h a i s r a s t a s + p u n a m y s s y k u t o j a + p u n a m y y r ä + p u n a m ö l y a p i n a + p u n a n a a m a k e r t t u + p u n a n a a m a t i m a l i + p u n a n a a m i o k a i j a + p u n a n a a m i o p e i p p o + p u n a n a t a + p u n a n f l a m i n g o + p u n a n i s k a k i u r u + p u n a n i s k a l u r i + p u n a n i s k a t u r a k o + p u n a n k a i v a j a + p u n a n n o k i k a n a + p u n a n o k k a b u l b u l i + p u n a n o k k a k i p u a j a + p u n a n o k k a k i u r u + p u n a n o k k a l e p i n k ä i n e n + p u n a n o k k a s o r s a + p u n a n o k k a t a v i + p u n a n p i i k k i p y r s t ö + p u n a n t a p a k u l o + p u n a n t y l l i + p u n a n u l j a s k a + p u n a o l k a t u r p i a a l i + p u n a o m e g a + p u n a o r a v a + p u n a o t s a l e p i n k ä i n e n + p u n a o t s a r ä ä t ä l i + p u n a p a h k a s i e n i + p u n a p a i d a t + p u n a p a i d o i k s i + p u n a p a i t a l i i k k e e n + p u n a p a i t o j e n + p u n a p a j u + p u n a p a r a t i i s i m o n a r k k i + p u n a p a r t a + p u n a p a s s i o + p u n a p e i p p i + p u n a p e i p p o + p u n a p e r ä b u l b u l i + p u n a p e r ä k a k l a t t a j a + p u n a p e r ä k i u r u + p u n a p e r ä k o t i n g a + p u n a p e r ä p i i s p a + p u n a p e r ä t a s k u + p u n a p e r ä t r o g o n i + p u n a p e r ä t u k a a n i + p u n a p i i s p a + p u n a p i r a i j a + p u n a p i s t e t ä h t ä i n + p u n a p o r u + p u n a p o r u n + p u n a p o s k i b u l b u l i + p u n a p o s k i m o n a r k k i + p u n a p o s k i s a l a m a n t e r i + p u n a p u u + p u n a p y r s t ö b u l b u l i + p u n a p y r s t ö k a i v a j a + p u n a p y r s t ö k a k a d u + p u n a p y r s t ö k o t i n g a + p u n a p y r s t ö l e p i n k ä i n e n + p u n a p y r s t ö p a l l o k a l a + p u n a p ä ä + p u n a p ä ä b a r b i + p u n a p ä ä l e p i n k ä i n e n + p u n a p ä ä n a r s k u + p u n a p ä ä t e t r a + p u n a p ä ä t i k k a + p u n a r a h k a s a m m a l + p u n a r a p u t o k k o + p u n a r e v o n h ä n t ä + p u n a r i n t a + p u n a r i n t a k a i j a + p u n a r i n t a k a r d i n a a l i + p u n a r i n t a k i u r u + p u n a r i n t a k u t o j a + p u n a r i n t a l u r i + p u n a r i n t a m e s i k k o + p u n a r i n t a p y y + p u n a r i n t a r a s t a s + p u n a r i n t a t i k k a + p u n a r o t t a k e n g u r u + p u n a r o u s k u + p u n a r u o h o k a i j a + p u n a r u s k e a + p u n a r u u s u p e i p p o + p u n a s a a r n i + p u n a s a v i k k a + p u n a s e l k ä h a u k k a + p u n a s e l k ä t i k k a + p u n a s i e p p o k e r t t u + p u n a s i i p i k e r t t u + p u n a s i i p i k i u r u + p u n a s i i p i m u u r a + p u n a s i i p i p e i p p o + p u n a s i i p i p i i s p a + p u n a s i i p i t i k k a + p u n a s i l k k i y r t t i + p u n a s i l m ä + p u n a s i l m ä b u l b u l i + p u n a s i l m ä l e h t i s a m m a k k o + p u n a s i l m ä t i m a l i + p u n a s i m p p u + p u n a s i r u e t a n a + p u n a s o l m u k k i + p u n a s o l u + p u n a s o t k a + p u n a s u s i + p u n a s u u t a u t i + p u n a s u u t e t r a + p u n a s y y s k o r e n t o + p u n a s ä i h k y k o l i b r i + p u n a t a k k i + p u n a t a k k i n e n + p u n a t a m m i + p u n a t a s k u t + p u n a t a t t i + p u n a t a u t i i n + p u n a t a v i + p u n a t e t r a + p u n a t i i k e r i p e i p p o + p u n a t i k k a + p u n a t o p a a s i k o l i b r i + p u n a t u k k a + p u n a t u k k a i n e n + p u n a t u l i k ä r k i + p u n a t u l i p e r ä + p u n a t u p s u k o t i n g a + p u n a t y t ö n k o r e n t o + p u n a t ä h k ä + p u n a t ä p l ä h i l s e i l y + p u n a t ä p l ä r o u s k u + p u n a t ä p l ä v e s i l i s k o + p u n a t ö p ö k e r t t u n e n + p u n a t ö p ö p e i p p o + p u n a t ö y h t ö k u t o j a + p u n a t ö y h t ö t r a p p i + p u n a v a a h t e r a + p u n a v a r p u n e n + p u n a v a t s a k e r t t u l i + p u n a v a t s a k i i p i j ä + p u n a v a t s a k u t o j a + p u n a v a t s a l i v e r t ä j ä + p u n a v a t s a r a s t a s + p u n a v e r i p i h k a p u u + p u n a v e s i l i s k o + p u n a v i h e l t ä j ä s o r s a + p u n a v i h r e i d e n + p u n a v i h r e i l l e + p u n a v i h r e y s + p u n a v i h r e ä + p u n a v i h r e ä l t ä + p u n a v i h r e ä n + p u n a v i h r e ä s t ä + p u n a v i i d a k k o k a n a + p u n a v i i k s i m e s i k k o + p u n a v i i n i + p u n a v i i n i l a s i l l i s e n + p u n a v i i n i l l ä + p u n a v i i n i n + p u n a v i i n i ä + p u n a v i i r u m e s i k k o + p u n a v i i t t a m e s i k k o + p u n a v i r t a k e r t t u n e n + p u n a v u o k k o k a l a + p u n a v y ö s e i t i k k i + p u n e r t u m a + p u n i k k i l i l j a + p u n i k k i v a h a k a s + p u n j a b i t + p u n n a n + p u n n a s t a + p u n n a t + p u n n i n n u t + p u n n i t a + p u n n i t a a n + p u n n i t e s s a m m e + p u n n i t e s s a n i + p u n n i t t a e s s a + p u n n i t t a v a + p u n n i t t u j a + p u n n u s j ä r v i + p u n t a a + p u n t a t i l e i h i n + p u n t i a + p u n t i e n + p u o l a l a i s e d u s t u s + p u o l a l a i s e n + p u o l a l a i s e n a + p u o l a l a i s e s t a + p u o l a l a i s e t + p u o l a l a i s i a + p u o l a l a i s i i n + p u o l a l a i s i l l a + p u o l a l a i s i l l e + p u o l a l a i s i s t a + p u o l a l a i s j ä s e n i l l e + p u o l a l a i s k y s y m y s + p u o l a l a i s l a p s e t + p u o l a l a i s o p i s k e l i j o i d e n + p u o l a l a i s p a n k i n + p u o l a l a i s p o l i i t i k k o j e n + p u o l a l a i s r u o t s a l a i n e n + p u o l a l a i s s i i r t o l a i s i a + p u o l a l a i s t e n + p u o l a l a i s t u r i s t i t + p u o l a l a i s v a s t a i s i a + p u o l a l a i s v ä e s t ö ö n + p u o l a l a i s v ä h e m m i s t ö + p u o l a l a i s v ä h e m m i s t ö j e n + p u o l a l a i s v ä h e m m i s t ö l l e + p u o l a l a i s v ä h e m m i s t ö l l e e n + p u o l a l a i s v ä h e m m i s t ö l l ä + p u o l a l a i s v ä h e m m i s t ö n + p u o l a l a i s y h t e i s ö ä + p u o l a l a i s y r i t y s t e n + p u o l a l a i s ä i t i + p u o l a l l a + p u o l a l l e + p u o l a n + p u o l a n a j o k o i r a + p u o l a n k i e l i n e n + p u o l a n k i e l i s e t + p u o l a n k i e l i s t ä + p u o l a n m i n t t u + p u o l a n v i n t t i k o i r a + p u o l a s s a + p u o l a s t a + p u o l e e n k a a n + p u o l e e n s a + p u o l e e n s a v e t ä v ä m p i + p u o l e e n t o i s t a + p u o l e e n v ä l i i n + p u o l e k s i t o i s t a + p u o l e l l a m m e + p u o l e l l a n n e + p u o l e l l e m m e + p u o l e n p ä i v ä n + p u o l e n s a + p u o l e n t o i s t a + p u o l e n t u s i n a a + p u o l e n y ö n + p u o l e s s a t o i s t a + p u o l e s s a v ä l i s s ä + p u o l e s t a n i + p u o l e s t a n n e + p u o l e s t a p u h u j a k s i + p u o l e s t a p u h u j a l t a + p u o l e s t a p u h u j a n a + p u o l e s t a p u h u j a t + p u o l e s t a p u h u j i a + p u o l e s t a p u h u j i k s i + p u o l e s t a t o i s t a + p u o l e t k i n + p u o l i a + p u o l i a a n + p u o l i a a v i k k o + p u o l i a i k o i n e e n + p u o l i a j a l l a + p u o l i a k a a n + p u o l i a l k u l u k u + p u o l i a m m a t t i l a i s i k s i + p u o l i a r v o l e v e y s + p u o l i a u t o m a a t t i k i v ä ä r i t + p u o l i a u t o m a a t t i n e n + p u o l i a u t o m a a t t i s e e n + p u o l i a u t o m a a t t i s e s t i + p u o l i a v o i m e n + p u o l i a v o i m e t + p u o l i a v o i n + p u o l i d e m o k r a a t t i n e n + p u o l i d e m o k r a a t t i s t e n + p u o l i d e m o k r a t i a + p u o l i d i p l o m a a t t i s e n + p u o l i e u r o o p p a l a i s i a + p u o l i f a s i s t i s e n + p u o l i f e d e r a l i s t i s i a + p u o l i i n + p u o l i i n t u m i s a i k a + p u o l i j o h d e + p u o l i j o h d e i l m a i s i n + p u o l i j o h d e t e k n i i k k a + p u o l i j o h d e t e o l l i s u u d e s s a + p u o l i j o h d e t e o l l i s u u s + p u o l i j o h d e t e o l l i s u u s a l a + p u o l i j o h d e t u o t a n n o s t a + p u o l i j o h t e e t + p u o l i j o h t e i t a + p u o l i j u l k i s i s t a + p u o l i j u o p u n e e s s a + p u o l i j ä y k k ä r u n k o i n e n + p u o l i k a n s a l l i s i s t a + p u o l i k a o o t t i s e e n + p u o l i k e r t a i s e e n + p u o l i k e r t a i s e n a + p u o l i k e r t a i s e s t i + p u o l i k i n + p u o l i k k a a t + p u o l i k o u l u t e t t u j a + p u o l i k s i k i n + p u o l i k u i v i a + p u o l i k u i v i e n + p u o l i k u o l l e i n a + p u o l i l a i l l i s e l l e + p u o l i l a i l l i s e t + p u o l i l a i l l i s i a + p u o l i l a i l l i s i s t a + p u o l i l a i t t o m a s s a + p u o l i l l a + p u o l i l t a + p u o l i l u k u + p u o l i l u k u t a i d o t t o m i l l e + p u o l i m a r a t o n + p u o l i m a t k a s s a + p u o l i m a t k a s s a a n + p u o l i m i l j o o n a i s e n + p u o l i m i n u u t t i s e n i + p u o l i m o n o p o l i + p u o l i n + p u o l i n a i s i a + p u o l i n a i s i i n + p u o l i n a i s t a + p u o l i o i k e u d e l l i s i a + p u o l i o i k e u d e l l i s t e n + p u o l i p e l a g i s e t + p u o l i p e r ä v a u n u + p u o l i p e r ä v a u n u j a + p u o l i p e r ä v a u n u j e n + p u o l i p i s t e e s t ä + p u o l i p o l i i t t i s i i n + p u o l i p ä i v ä t y ö t ä + p u o l i r a k e n t e e l l i s e n + p u o l i r e a k t i o + p u o l i r i k o l l i s e t + p u o l i s a l a i n e n + p u o l i s a l a i s e n + p u o l i s a l a i s e t + p u o l i s a l a i s i l l e + p u o l i s k o l l a + p u o l i s k o n + p u o l i s o a + p u o l i s o i d e n + p u o l i s o i h i n + p u o l i s o i l l e + p u o l i s o i l l e e n + p u o l i s o i n a + p u o l i s o i t a + p u o l i s o l l e + p u o l i s o n + p u o l i s o t + p u o l i s o t i l a a l l i s e t + p u o l i s o t i l a a l l i s i a + p u o l i s o t i l a a l l i s i l t a + p u o l i s o t i l a a l l i s t a + p u o l i s o t i l a a l l i s t e n + p u o l i s u l j e t u t + p u o l i s u u n n i k a s s ä ä n t ö + p u o l i t e k o i s i a + p u o l i t e l a v a u n u + p u o l i t e o l l i n e n + p u o l i t e t t u a + p u o l i t i e n + p u o l i t i e t e e l l i s t e n + p u o l i t o i s t a + p u o l i t o i s t a m i n u u t t i s e n + p u o l i t o i s t a t u n t i s e n + p u o l i t o t u u d e l l a + p u o l i t o t u u d e n + p u o l i t o t u u d e t + p u o l i t o t u u k s i a + p u o l i t o t u u k s i e n + p u o l i t o t u u k s i i n + p u o l i t o t u u k s i l t a + p u o l i t o t u u k s i n + p u o l i t o t u u s + p u o l i t t a a + p u o l i t t a i s t a + p u o l i t t a m i s e k s i + p u o l i t t u m i n e n + p u o l i t t u n u t + p u o l i t u n t i n e n + p u o l i t u n t i s e n + p u o l i t u s h a k u + p u o l i t y h j i e n + p u o l i t y h j i ä + p u o l i t y h j ä + p u o l i t y h j ä n ä + p u o l i t y h j ä s s ä + p u o l i t ä y d e k s i + p u o l i t ä y d e s t ä + p u o l i t ä y s i + p u o l i u s k o n n o l l i n e n + p u o l i u s k o n n o l l i s i i n + p u o l i v a l m i i t a + p u o l i v a l m i s + p u o l i v a l m i s t a + p u o l i v a l m i s t e + p u o l i v a l m i s t e i t a + p u o l i v a l t i o l l i s t a + p u o l i v a l t i o l l i s t e n + p u o l i v e r i n e n + p u o l i v i l l a i n e n + p u o l i v i l l a i s e n a + p u o l i v i l l a i s i a + p u o l i v i l p i t t ö m ä l l ä + p u o l i v i r a l l i s e s t i + p u o l i v u o s i k e r t o m u k s e s t a + p u o l i v u o s i s a d a n + p u o l i v u o s i s a t a a + p u o l i v u o s i s a t a i s e n + p u o l i v u o s i t t a i n + p u o l i v u o s i t t a i s e e n + p u o l i v u o s i t t a i s e l l a + p u o l i v u o s i t t a i s e n + p u o l i v u o s i t t a i s e s s a + p u o l i v u o s i t t a i s e t + p u o l i v u o s i t t a i s i s s a + p u o l i v u o s i t t a i s i s t a + p u o l i v u o s i t t a i s t a + p u o l i v u o s i t t a i s t e n + p u o l i v u o t i n e n + p u o l i v u o t i s e e n + p u o l i v u o t i s e l l a + p u o l i v u o t i s e n + p u o l i v u o t i s e n a + p u o l i v u o t i s e s t a + p u o l i v u o t i s j a k s o l l e + p u o l i v u o t i s j a k s o n + p u o l i v u o t i s k a t s a u k s i i n + p u o l i v u o t i s k a u d e k s i + p u o l i v u o t i s k a u d e l l a + p u o l i v u o t i s k a u d e l l e + p u o l i v u o t i s k a u d e n + p u o l i v u o t i s k a u d e s t a + p u o l i v u o t i s k a u s i + p u o l i v u o t i s k a u t e e n + p u o l i v u o t i s k a u t e m m e + p u o l i v u o t i s k a u t e n a + p u o l i v u o t i s k a u t e n s a + p u o l i v u o t i s k a u t t a + p u o l i v u o t i s o h j e l m a + p u o l i v u o t i s t a + p u o l i v u o t i s t a r k i s t u k s e n + p u o l i v u o t i s t a r k i s t u k s e s s a + p u o l i v u o t i s t a r k i s t u s + p u o l i v u o t i s t e n + p u o l i v ä l i a r v i o i n n i l l a + p u o l i v ä l i a r v i o i n n i n + p u o l i v ä l i a r v i o i n n i s t a + p u o l i v ä l i a r v i o i n t i + p u o l i v ä l i a r v i o i n t i a + p u o l i v ä l i a r v i o i n t i i n + p u o l i v ä l i a r v i o n + p u o l i v ä l i a r v i o s s a + p u o l i v ä l i i n + p u o l i v ä l i k a t s a u k s e n + p u o l i v ä l i n + p u o l i v ä l i t a r k a s t e l u n + p u o l i v ä l i t a r k a s t e l u s s a + p u o l i v ä l i t a r k a s t u k s e n + p u o l i v ä l i t a r k a s t u s + p u o l i v ä l i t a r k a s t u s t a + p u o l i v ä l i t a r k i s t u s t a + p u o l i v ä l i t a v o i t t e i d e n + p u o l i v ä l i t u t k i m u s t e n + p u o l i v ä l j ä + p u o l l a m m e + p u o l l e t a a n + p u o l l e t a a n k o + p u o l s i + p u o l s i k i n + p u o l s i n + p u o l s i t t e + p u o l s i v a t + p u o l t a + p u o l t a a + p u o l t a a k i n + p u o l t a e s s a m m e + p u o l t a i s i + p u o l t a j a n a + p u o l t a k a a n + p u o l t a m a a n + p u o l t a m a l l a + p u o l t a m a m m e + p u o l t a m i s e e n + p u o l t a m i s e n + p u o l t a n e e t + p u o l t a n u t + p u o l t a v a + p u o l t a v a a + p u o l t a v a n + p u o l t a v a n i + p u o l t a v a n s a + p u o l t a v a t + p u o l t a v i a + p u o l t o ä ä n e e n + p u o l t o ä ä n e n + p u o l t o ä ä n t ä + p u o l u e a j a t t e l u a + p u o l u e a j a t t e l u u n + p u o l u e a k t i v i s t e j a + p u o l u e a s e t u k s e n + p u o l u e d e m o k r a t i a + p u o l u e d e m o k r a t i a s s a + p u o l u e e l l a + p u o l u e e l l e + p u o l u e e l l e e n + p u o l u e e l l i s e m p i + p u o l u e e l l i s e n + p u o l u e e l l i s i a + p u o l u e e l l i s t a + p u o l u e e l l i s u u d e l l a + p u o l u e e l l i s u u d e s t a + p u o l u e e l l i s u u t t a + p u o l u e e l t a + p u o l u e e m m e + p u o l u e e n + p u o l u e e n i + p u o l u e e n j o h t o + p u o l u e e n s a + p u o l u e e s e e n + p u o l u e e s e e n s a + p u o l u e e s s a + p u o l u e e s s a a n + p u o l u e e s s a n i + p u o l u e e s t a + p u o l u e e s t a n i + p u o l u e e t + p u o l u e e t o n t a + p u o l u e e t t o m a a n + p u o l u e e t t o m a m m a n + p u o l u e e t t o m a m m a s s a + p u o l u e e t t o m a m m a s t a + p u o l u e e t t o m a m m a t + p u o l u e e t t o m a m m i n + p u o l u e e t t o m a m p a a n + p u o l u e e t t o m a m p i + p u o l u e e t t o m a m p i a + p u o l u e e t t o m a n + p u o l u e e t t o m a n a + p u o l u e e t t o m a t + p u o l u e e t t o m i a + p u o l u e e t t o m i e n + p u o l u e e t t o m i l l e + p u o l u e e t t o m i m m i s t a + p u o l u e e t t o m i s s a + p u o l u e e t t o m u u d e n + p u o l u e e t t o m u u d e s t a + p u o l u e e t t o m u u s p e r i n t e e s e e n s ä + p u o l u e e t t o m u u s p o l i t i i k a n + p u o l u e e t t o m u u s p o l i t i i k k a + p u o l u e e t t o m u u s p o l i t i i k k a a n + p u o l u e e t t o m u u s v a a t i m u s t a + p u o l u e e t t o m u u s v e l v o i t t e e n + p u o l u e e t t o m u u s v e l v o i t t e e s t a + p u o l u e e t t o m u u s v e l v o l l i s u u t t a + p u o l u e e t t o m u u t e e n + p u o l u e e t t o m u u t e e n s a + p u o l u e e t t o m u u t e n i + p u o l u e e t t o m u u t t a + p u o l u e h a n k k e e s e e n + p u o l u e i d e n + p u o l u e i d e n v ä l i s e e n + p u o l u e i d e o l o g i a + p u o l u e i h m i n e n + p u o l u e i h m i s i ä + p u o l u e i l l a + p u o l u e i l l e + p u o l u e i l t a + p u o l u e i n s t i t u u t i o t a + p u o l u e i s i i n + p u o l u e i s s a + p u o l u e i s t a + p u o l u e i t a + p u o l u e i t a a n + p u o l u e j a o n + p u o l u e j o h d o n + p u o l u e j o h t a j a + p u o l u e j o h t a j a a + p u o l u e j o h t a j a a m m e + p u o l u e j o h t a j a l l e e n + p u o l u e j o h t a j a m m e + p u o l u e j o h t a j a n + p u o l u e j o h t a j a n a + p u o l u e j o h t a j a n s a + p u o l u e j o h t a j a t + p u o l u e j o h t a j i a + p u o l u e j o h t a j i e n + p u o l u e j o h t o + p u o l u e j o h t o n s a + p u o l u e j ä r j e s t e l m i i n + p u o l u e j ä r j e s t e l m ä + p u o l u e j ä r j e s t e l m ä s t ä + p u o l u e j ä r j e s t e l m ä ä + p u o l u e j ä r j e s t ö j e n + p u o l u e j ä r j e s t ö n + p u o l u e j ä r j e s t ö t + p u o l u e j ä s e n e n i + p u o l u e j ä s e n i s t ä + p u o l u e j ä s e n i ä + p u o l u e j ä s e n y y t e n i + p u o l u e k a n n a n + p u o l u e k a n n a s t a m m e + p u o l u e k a n n o i s t a + p u o l u e k a n t a a + p u o l u e k a n t a a n + p u o l u e k a n t o i h i n + p u o l u e k e n t t ä + p u o l u e k i e l t o + p u o l u e k i i s t a t + p u o l u e k i i s t o j e n + p u o l u e k i n + p u o l u e k i r j a + p u o l u e k i r j o n + p u o l u e k o k o u k s e n s a + p u o l u e k o k o u k s e s s a + p u o l u e k o k o u k s e s s a n n e + p u o l u e k o k o u k s e t + p u o l u e k o k o u k s i e n + p u o l u e k o k o u k s i s t a + p u o l u e k o k o u s + p u o l u e k o l l e g a + p u o l u e k o l l e g a n i + p u o l u e k o l l e g a n n e + p u o l u e k o l l e g o i t a n i + p u o l u e k o n e i s t o + p u o l u e k o n e i s t o n + p u o l u e k o n e i s t o n s a + p u o l u e k u r i + p u o l u e k u r i l l a + p u o l u e k y s y m y s + p u o l u e l a k i a + p u o l u e l i i t t o u t u m i e n + p u o l u e l i s t o j a + p u o l u e m ä ä r ä + p u o l u e n ä k ö k o h t i e n + p u o l u e o h j e l m a + p u o l u e o h j e l m a a + p u o l u e o h j e l m i e n s a + p u o l u e o h j e l m i s t a + p u o l u e o h j e s ä ä n n ö n + p u o l u e o h j e s ä ä n t ö + p u o l u e p e r h e e m m e + p u o l u e p e r h e i t ä + p u o l u e p e r h e t t ä + p u o l u e p o l i i t i k k o j a + p u o l u e p o l i i t t i n e n + p u o l u e p o l i i t t i s e e n + p u o l u e p o l i i t t i s e k s i + p u o l u e p o l i i t t i s e l l e + p u o l u e p o l i i t t i s e n + p u o l u e p o l i i t t i s e s s a + p u o l u e p o l i i t t i s e s t a + p u o l u e p o l i i t t i s e s t i + p u o l u e p o l i i t t i s e t + p u o l u e p o l i i t t i s i a + p u o l u e p o l i i t t i s i i n + p u o l u e p o l i i t t i s i l l a + p u o l u e p o l i i t t i s i l l e + p u o l u e p o l i i t t i s i n + p u o l u e p o l i i t t i s i s s a + p u o l u e p o l i i t t i s i s t a + p u o l u e p o l i i t t i s t a + p u o l u e p o l i i t t i s t e n + p u o l u e p o l i t i i k a n + p u o l u e p o l i t i i k a s s a + p u o l u e p o l i t i i k a s t a + p u o l u e p o l i t i i k a s t a m m e + p u o l u e p o l i t i i k k a + p u o l u e p o l i t i i k k a a + p u o l u e p o l i t i i k k a a n + p u o l u e p o l i t i k o i n t i a + p u o l u e p o m o i h i n + p u o l u e r a h o i t u k s e e n + p u o l u e r a h o i t u k s e n + p u o l u e r a h o i t u k s e s s a + p u o l u e r a h o i t u k s e s t a + p u o l u e r a h o i t u s + p u o l u e r a h o i t u s t a + p u o l u e r a j a t + p u o l u e r a j o i h i n + p u o l u e r a j o i s t a + p u o l u e r a j o j a + p u o l u e r a j o j e n + p u o l u e r a k e n n e + p u o l u e r a k e n t e e s e e n + p u o l u e r a k e n t e e s t a + p u o l u e r a k e n t e e t + p u o l u e r a k e n t e i d e n + p u o l u e r o o l i n + p u o l u e r y h m i e n + p u o l u e r y h m i i m m e + p u o l u e r y h m i i n + p u o l u e r y h m i l l e + p u o l u e r y h m i l t ä + p u o l u e r y h m i s s ä + p u o l u e r y h m i s s ä m m e + p u o l u e r y h m i s t ä + p u o l u e r y h m i t t y m i l l e + p u o l u e r y h m i t t y m ä t + p u o l u e r y h m i t t y m ä ä n + p u o l u e r y h m i ä + p u o l u e r y h m i ä n n e + p u o l u e r y h m ä + p u o l u e r y h m ä k o l l e g a n i + p u o l u e r y h m ä l l e m m e + p u o l u e r y h m ä l l e n i + p u o l u e r y h m ä m m e + p u o l u e r y h m ä n + p u o l u e r y h m ä n i + p u o l u e r y h m ä n n e + p u o l u e r y h m ä r a j o j e n + p u o l u e r y h m ä s s ä n i + p u o l u e r y h m ä s s ä n n e + p u o l u e r y h m ä s t ä + p u o l u e r y h m ä t + p u o l u e r y h m ä ä + p u o l u e r y h m ä ä n i + p u o l u e r y h m ä ä n s ä + p u o l u e s i d o n n a i n e n + p u o l u e s i d o n n a i s u u k s i e n s a + p u o l u e s i h t e e r i + p u o l u e s i h t e e r i e n + p u o l u e s y i h i n + p u o l u e s y i s t ä + p u o l u e s ä ä t i ö t + p u o l u e t a s o l l a + p u o l u e t o i m i k u n n a t + p u o l u e t o i m i n n a n + p u o l u e t o i m i s t o j a + p u o l u e t o i m i s t o n + p u o l u e t o i m i s t o n s a + p u o l u e t o i m i s t o s s a + p u o l u e t o i m i t s i j a a + p u o l u e t o v e r e i h i n i + p u o l u e t o v e r e i l l e e n + p u o l u e t o v e r e i s t a a n + p u o l u e t o v e r e i t a a n + p u o l u e t o v e r e i t a n i + p u o l u e t o v e r e i t t e n i + p u o l u e t o v e r i + p u o l u e t o v e r i a n i + p u o l u e t o v e r i l l e e n + p u o l u e t o v e r i m m e + p u o l u e t o v e r i n i + p u o l u e t o v e r i n n e + p u o l u e t t a + p u o l u e t t a m m e + p u o l u e t u e n + p u o l u e t u k e a + p u o l u e t u k i + p u o l u e v a l l a n + p u o l u e v a l t a + p u o l u e v a l t a i s u u d e s t a n n e + p u o l u e v a l t a i s u u t t a + p u o l u e v a l t i o o n + p u o l u e v ä k e n s ä + p u o l u e v ä r i ä + p u o l u k k a p i i l o y ö k k ö n e n + p u o l u s t a a + p u o l u s t a a k s e e n + p u o l u s t a a k s e m m e + p u o l u s t a a k s e n i + p u o l u s t a e s s a a n + p u o l u s t a e s s a m m e + p u o l u s t a e s s a n n e + p u o l u s t a i s i + p u o l u s t a j a t + p u o l u s t a j i a + p u o l u s t a j i e n + p u o l u s t a j i n a + p u o l u s t a k a a m m e + p u o l u s t a m a a m m e + p u o l u s t a m a a n + p u o l u s t a m a m m e + p u o l u s t a m a s s a + p u o l u s t a m a s t a + p u o l u s t a m i s e e n + p u o l u s t a m i s e k s i + p u o l u s t a m i s e n + p u o l u s t a m i s e s t a + p u o l u s t a m i s t a + p u o l u s t a m m e + p u o l u s t a m m e k o + p u o l u s t a n e e t + p u o l u s t a n k i n + p u o l u s t a n u t + p u o l u s t a t t e + p u o l u s t a u d u t t a v a + p u o l u s t a u t u a + p u o l u s t a u t u a k s e e n + p u o l u s t a u t u a k s e m m e + p u o l u s t a u t u e n + p u o l u s t a u t u m a a n + p u o l u s t a u t u m a t t a + p u o l u s t a u t u m i s e e n + p u o l u s t a u t u m i s k e i n o + p u o l u s t a u t u m i s k e i n o j a + p u o l u s t a u t u m i s o i k e u d e k s i + p u o l u s t a u t u m i s o i k e u d e n + p u o l u s t a u t u m i s o i k e u d e t + p u o l u s t a u t u m i s o i k e u k s i a + p u o l u s t a u t u m i s o i k e u k s i e n + p u o l u s t a u t u m i s o i k e u k s i i n + p u o l u s t a u t u m i s o i k e u k s i s t a + p u o l u s t a u t u m i s o i k e u s + p u o l u s t a u t u m i s o i k e u t e e n + p u o l u s t a u t u m i s o i k e u t t a + p u o l u s t a u t u m i s s o i k e u d e t + p u o l u s t a u t u u + p u o l u s t a v a n + p u o l u s t a v a n s a + p u o l u s t a v a t + p u o l u s t a v i a + p u o l u s t a v i e n + p u o l u s t e l e v i a + p u o l u s t e l l a + p u o l u s t e l l a k s e e n + p u o l u s t e l t i i n + p u o l u s t e t a + p u o l u s t e t a a n + p u o l u s t e t t a e s s a + p u o l u s t e t t a i s i i n + p u o l u s t e t t a v a + p u o l u s t e t t a v a t + p u o l u s t e t t a v i s s a + p u o l u s t i + p u o l u s t i v a t + p u o l u s t u k s e e n + p u o l u s t u k s e l l a + p u o l u s t u k s e l l e + p u o l u s t u k s e l l e m m e + p u o l u s t u k s e l t a a n + p u o l u s t u k s e n + p u o l u s t u k s e n a a n + p u o l u s t u k s e n s a + p u o l u s t u k s e s t a + p u o l u s t u k s e s t a m m e + p u o l u s t u s a l a a n + p u o l u s t u s a l a l l a + p u o l u s t u s a l a l l e + p u o l u s t u s a l a n + p u o l u s t u s a l i v a l i o k u n n a n + p u o l u s t u s a l o i t t e e s e e n + p u o l u s t u s a r m e i j a + p u o l u s t u s a s e i d e n + p u o l u s t u s a s e i t a + p u o l u s t u s a s e m a a n + p u o l u s t u s a s e m i i n + p u o l u s t u s a s e m i s t a m m e + p u o l u s t u s a s e n t e e l l a + p u o l u s t u s a s e n t e e n + p u o l u s t u s a s e n t o o n + p u o l u s t u s a s i a n a j a j a + p u o l u s t u s a s i a n a j a j a a + p u o l u s t u s a s i a n a j a j a a n + p u o l u s t u s a s i a n a j a j a a n s a + p u o l u s t u s a s i a n a j a j a l l e + p u o l u s t u s a s i a n a j a j a m m e + p u o l u s t u s a s i a n a j a j a n + p u o l u s t u s a s i a n a j a j a n s a + p u o l u s t u s a s i a n a j a j a t + p u o l u s t u s a s i a n a j a j i a + p u o l u s t u s a s i a n a j a j i e n + p u o l u s t u s a s i a t + p u o l u s t u s a s i o i d e n + p u o l u s t u s a s i o i h i n + p u o l u s t u s a s i o i s s a + p u o l u s t u s a s i o i s t a + p u o l u s t u s a s i o i t a + p u o l u s t u s b u d j e t e i s s a + p u o l u s t u s b u d j e t i n + p u o l u s t u s b u d j e t i s t a + p u o l u s t u s b u d j e t i t + p u o l u s t u s b u d j e t t e i h i n + p u o l u s t u s b u d j e t t e j a + p u o l u s t u s b u d j e t t e j a a n + p u o l u s t u s b u d j e t t i + p u o l u s t u s b u d j e t t i a + p u o l u s t u s b u d j e t t i e n + p u o l u s t u s b u d j e t t i i n + p u o l u s t u s b u d j e t t i i n s a + p u o l u s t u s b u d j e t t i n s a + p u o l u s t u s d o k t r i i n i + p u o l u s t u s d o k t r i i n i n + p u o l u s t u s e l e k t r o n i i k k a t e o l l i s u u d e n + p u o l u s t u s e l i m e t + p u o l u s t u s e l i n + p u o l u s t u s e s i m e r k k i + p u o l u s t u s e t u j a + p u o l u s t u s h a n k i n n a t + p u o l u s t u s h a n k i n n o i l l a + p u o l u s t u s h a n k i n n o i s s a + p u o l u s t u s h a n k i n n o i s t a + p u o l u s t u s h a n k i n t o i h i n + p u o l u s t u s h a n k i n t o j a + p u o l u s t u s h a n k i n t o j e n + p u o l u s t u s h a n k k e e s e e n + p u o l u s t u s h a n k k e i t a + p u o l u s t u s h a n k k e i t a a n + p u o l u s t u s i d e n t i t e e t i k s i + p u o l u s t u s i d e n t i t e e t i n + p u o l u s t u s i d e n t i t e e t i s s ä + p u o l u s t u s i d e n t i t e e t i s t ä + p u o l u s t u s i d e n t i t e e t t i + p u o l u s t u s i d e n t i t e e t t i i n + p u o l u s t u s i d e n t i t e e t t i ä + p u o l u s t u s i d e n t i t e e t t i ä ä n + p u o l u s t u s i n f r a s t r u k t u u r e i l l a + p u o l u s t u s i n f r a s t r u k t u u r i + p u o l u s t u s i n t e g r a a t i o t a + p u o l u s t u s i n t r e s s i e n + p u o l u s t u s i n v e s t o i n n e i s s a + p u o l u s t u s j o u k k o j a + p u o l u s t u s j ä r j e s t e l m i e m m e + p u o l u s t u s j ä r j e s t e l m i e n + p u o l u s t u s j ä r j e s t e l m i i n + p u o l u s t u s j ä r j e s t e l m ä + p u o l u s t u s j ä r j e s t e l m ä n + p u o l u s t u s j ä r j e s t e l m ä s t ä + p u o l u s t u s j ä r j e s t e l m ä ä + p u o l u s t u s j ä r j e s t e l m ä ä m m e + p u o l u s t u s j ä r j e s t ö + p u o l u s t u s j ä r j e s t ö n ä + p u o l u s t u s k a l u s t o a + p u o l u s t u s k a m p a n j o i h i n + p u o l u s t u s k a p a s i t e e t t i a + p u o l u s t u s k a p a s i t e e t t i v i r a s t o + p u o l u s t u s k a t s a u k s i l l e + p u o l u s t u s k e i n o + p u o l u s t u s k e i n o j e n + p u o l u s t u s k e i n o t + p u o l u s t u s k o n e i s t o n + p u o l u s t u s k o n s e p t i a + p u o l u s t u s k o r k e a k o u l u + p u o l u s t u s k u l u i s t a + p u o l u s t u s k u s t a n n u s t e n + p u o l u s t u s k y k y + p u o l u s t u s k y k y a l o i t e t t a + p u o l u s t u s k y k y a l o i t t e e n s a + p u o l u s t u s k y k y i s t ä + p u o l u s t u s k y k y ä + p u o l u s t u s k y k y ä m m e + p u o l u s t u s k y s y m y k s e e n + p u o l u s t u s k y s y m y k s e s s ä + p u o l u s t u s k y s y m y k s i s s ä + p u o l u s t u s k y s y m y k s i ä + p u o l u s t u s k y s y m y s + p u o l u s t u s k y s y m y s t ä + p u o l u s t u s k y v y n + p u o l u s t u s k y v y t t ö m i m m ä t + p u o l u s t u s k y v y t t ö m i m p i e n + p u o l u s t u s k y v y t t ö m i m p i ä + p u o l u s t u s k y v y t t ö m i n t ä + p u o l u s t u s k y v y t t ö m i ä + p u o l u s t u s k ä y t ä n n ö i s t ä + p u o l u s t u s l a i t o k s e e n + p u o l u s t u s l a i t t e i d e n + p u o l u s t u s l a u s e k k e e s e e n + p u o l u s t u s l i i t o k s i + p u o l u s t u s l i i t o n + p u o l u s t u s l i i t o s s a + p u o l u s t u s l i i t o s t a + p u o l u s t u s l i i t t o + p u o l u s t u s l i i t t o a + p u o l u s t u s l i i t t o o n + p u o l u s t u s l i i t t o t e h t ä v ä t + p u o l u s t u s l i n j a + p u o l u s t u s l ä h t e i d e n + p u o l u s t u s m a h d i n + p u o l u s t u s m a h d o l l i s u u k s i a m m e + p u o l u s t u s m a r k k i n a t + p u o l u s t u s m a r k k i n o i d e n + p u o l u s t u s m a r k k i n o i t a + p u o l u s t u s m a t e r i a a l e j a + p u o l u s t u s m a t e r i a a l i e n + p u o l u s t u s m a t e r i a a l i h a n k i n t o j e n s a + p u o l u s t u s m a t e r i a a l i m a r k k i n a t + p u o l u s t u s m a t e r i a a l i m a r k k i n o i d e n + p u o l u s t u s m a t e r i a a l i m a r k k i n o i s t a + p u o l u s t u s m a t e r i a a l i p a k e t t i a + p u o l u s t u s m a t e r i a a l i p o l i t i i k a n + p u o l u s t u s m a t e r i a a l i p o l i t i i k k a + p u o l u s t u s m a t e r i a a l i p o l i t i i k k a a + p u o l u s t u s m a t e r i a a l i p o l i t i i k k a a n + p u o l u s t u s m a t e r i a a l i p o l i t i i k k a m m e + p u o l u s t u s m a t e r i a a l i s o p i m u s t e n + p u o l u s t u s m a t e r i a a l i s s a + p u o l u s t u s m a t e r i a a l i t e o l l i s u u s + p u o l u s t u s m a t e r i a a l i t e o l l i s u u t e e n + p u o l u s t u s m a t e r i a a l i v i r a s t o + p u o l u s t u s m a t e r i a a l i v i r a s t o a + p u o l u s t u s m a t e r i a a l i v i r a s t o n + p u o l u s t u s m a t e r i a a l i v i r a s t o s t a + p u o l u s t u s m a t e r i a a l i y h t e i s t y ö n + p u o l u s t u s m a t e r i a a l i y h t e i s t y ö t ä + p u o l u s t u s m e k a n i s m e i h i n + p u o l u s t u s m e k a n i s m e j a + p u o l u s t u s m e k a n i s m i + p u o l u s t u s m e k a n i s m i a + p u o l u s t u s m e k a n i s m i e n + p u o l u s t u s m e k a n i s m i t + p u o l u s t u s m e n o i h i n + p u o l u s t u s m e n o i s t a + p u o l u s t u s m e n o j a + p u o l u s t u s m e n o j a a n + p u o l u s t u s m e n o j a m m e + p u o l u s t u s m e n o j e m m e + p u o l u s t u s m e n o j e n + p u o l u s t u s m e n o m m e + p u o l u s t u s m e n o n s a + p u o l u s t u s m e n o t + p u o l u s t u s m i e l e s s ä + p u o l u s t u s m i n i s t e r e i d e n + p u o l u s t u s m i n i s t e r e i l l e + p u o l u s t u s m i n i s t e r i + p u o l u s t u s m i n i s t e r i e n + p u o l u s t u s m i n i s t e r i k i n + p u o l u s t u s m i n i s t e r i k o k o u k s e s s a + p u o l u s t u s m i n i s t e r i k o l l e g o i s t a n i + p u o l u s t u s m i n i s t e r i l l e + p u o l u s t u s m i n i s t e r i l t ä + p u o l u s t u s m i n i s t e r i n + p u o l u s t u s m i n i s t e r i n e u v o s t o n + p u o l u s t u s m i n i s t e r i n s ä + p u o l u s t u s m i n i s t e r i n ä + p u o l u s t u s m i n i s t e r i t + p u o l u s t u s m i n i s t e r i t k i n + p u o l u s t u s m i n i s t e r i ä + p u o l u s t u s m i n i s t e r i ö + p u o l u s t u s m i n i s t e r i ö n + p u o l u s t u s m i n i s t e r i ö s s ä + p u o l u s t u s m i n i s t e r i ö s t ä + p u o l u s t u s m u u r i l l e + p u o l u s t u s m ä ä r ä r a h a t + p u o l u s t u s m ä ä r ä r a h o i h i n + p u o l u s t u s m ä ä r ä r a h o i s t a + p u o l u s t u s m ä ä r ä r a h o j a + p u o l u s t u s m ä ä r ä r a h o j a a n + p u o l u s t u s m ä ä r ä r a h o j e n + p u o l u s t u s n e u v o s t o + p u o l u s t u s n ä k ö k o h d a t + p u o l u s t u s n ä k ö k o h d i s t a + p u o l u s t u s n ä k ö k o h t i a + p u o l u s t u s n ä k ö k o h t i e n + p u o l u s t u s o h j e l m a + p u o l u s t u s o h j e l m i a + p u o l u s t u s o h j e l m i e n + p u o l u s t u s o h j e l m i i n + p u o l u s t u s o i k e u k s i a + p u o l u s t u s o i k e u k s i e n + p u o l u s t u s o i k e u k s i s t a + p u o l u s t u s o i k e u s j ä r j e s t ö t + p u o l u s t u s o i k e u s k y s y m y k s i ä + p u o l u s t u s o r g a n i s a a t i o + p u o l u s t u s o r g a n i s a a t i o i d e n + p u o l u s t u s p a k e t i n + p u o l u s t u s p a k e t t i a + p u o l u s t u s p e l i ä + p u o l u s t u s p i l a r i + p u o l u s t u s p o l i i t t i n e n + p u o l u s t u s p o l i i t t i s e s s a + p u o l u s t u s p o l i i t t i s e s t a + p u o l u s t u s p o l i i t t i s i a + p u o l u s t u s p o l i i t t i s i l l e + p u o l u s t u s p o l i i t t i s i s t a + p u o l u s t u s p o l i i t t i s t a + p u o l u s t u s p o l i i t t i s t e n + p u o l u s t u s p o l i t i i k a l l a + p u o l u s t u s p o l i t i i k a l l e + p u o l u s t u s p o l i t i i k a l t a a n + p u o l u s t u s p o l i t i i k a n + p u o l u s t u s p o l i t i i k a n h a n + p u o l u s t u s p o l i t i i k a s s a + p u o l u s t u s p o l i t i i k a s s a m m e + p u o l u s t u s p o l i t i i k a s t a + p u o l u s t u s p o l i t i i k a s t a a n + p u o l u s t u s p o l i t i i k k a + p u o l u s t u s p o l i t i i k k a a + p u o l u s t u s p o l i t i i k k a a m m e + p u o l u s t u s p o l i t i i k k a a n + p u o l u s t u s p o l i t i i k k a m m e + p u o l u s t u s p o l i t i i k k a n s a + p u o l u s t u s p o l i t i i k k o j e n + p u o l u s t u s p o l i t i i k o i d e n + p u o l u s t u s p o n n i s t e l u i s t a + p u o l u s t u s p o n n i s t u k s i a + p u o l u s t u s p o t e n t i a a l i s t a + p u o l u s t u s p r o f i i l i s t a + p u o l u s t u s p r o s e s s i i n + p u o l u s t u s p u h e + p u o l u s t u s p ä ä m ä ä r ä t + p u o l u s t u s r a h a s t o s t a + p u o l u s t u s r a k e n n e + p u o l u s t u s r a k e n n e t t a + p u o l u s t u s r a k e n t e e m m e + p u o l u s t u s r a k e n t e e n + p u o l u s t u s r a k e n t e e t + p u o l u s t u s r a k e n t e i d e n + p u o l u s t u s r a k e n t e i l l a + p u o l u s t u s r a k e n t e i t a + p u o l u s t u s r e a k t i o + p u o l u s t u s r e a k t i o n + p u o l u s t u s r e a k t i o t + p u o l u s t u s r e s e r v i l a i v a s t o o n + p u o l u s t u s r e s u r s s i e n + p u o l u s t u s r i n t a m a + p u o l u s t u s s e k t o r i + p u o l u s t u s s e l o n t e o s s a + p u o l u s t u s s i t o u m u k s i i n + p u o l u s t u s s o p i m u k s e n + p u o l u s t u s s o p i m u k s e t + p u o l u s t u s s o p i m u s + p u o l u s t u s s o p i m u s t e n + p u o l u s t u s s t a n d a r d e j a + p u o l u s t u s s t a n d a r d i e n + p u o l u s t u s s t r a t e g i a + p u o l u s t u s s t r a t e g i a a + p u o l u s t u s s t r a t e g i a a m m e + p u o l u s t u s s t r a t e g i a n + p u o l u s t u s s t r a t e g i o i s t a k i n + p u o l u s t u s s t r a t e g i o i t a + p u o l u s t u s s u h t e i s s a k i n + p u o l u s t u s s u h t e i s t a + p u o l u s t u s s u u n n i t e l m a a + p u o l u s t u s s u u n n i t t e l u a + p u o l u s t u s t a + p u o l u s t u s t a a n + p u o l u s t u s t a i s t e l u j a + p u o l u s t u s t a k e i d e n + p u o l u s t u s t a k t i i k a s t a + p u o l u s t u s t a k t i i k a s t a a n + p u o l u s t u s t a k t i i k k a + p u o l u s t u s t a l o u d e n + p u o l u s t u s t a m m e + p u o l u s t u s t a r k o i t u k s e n + p u o l u s t u s t a r k o i t u k s e s s a + p u o l u s t u s t a r v i k e + p u o l u s t u s t a r v i k e a l a + p u o l u s t u s t a r v i k e a l a a + p u o l u s t u s t a r v i k e k a u p a s s a + p u o l u s t u s t a r v i k e k a u p p a a + p u o l u s t u s t a r v i k e m a r k k i n a a + p u o l u s t u s t a r v i k e m a r k k i n a t + p u o l u s t u s t a r v i k e m a r k k i n o i d e n + p u o l u s t u s t a r v i k e m a r k k i n o i l l e + p u o l u s t u s t a r v i k e m a r k k i n o i s t a + p u o l u s t u s t a r v i k e m a r k k i n o i t a + p u o l u s t u s t a r v i k e p o l i t i i k a n + p u o l u s t u s t a r v i k e p o l i t i i k k a + p u o l u s t u s t a r v i k e s i i r t o j a + p u o l u s t u s t a r v i k e t e o l l i s u u d e n + p u o l u s t u s t a r v i k e t e o l l i s u u d e s t a + p u o l u s t u s t a r v i k e t e o l l i s u u s + p u o l u s t u s t a r v i k e t e o l l i s u u t e e n + p u o l u s t u s t a r v i k e t e o l l i s u u t t a + p u o l u s t u s t a r v i k e v i r a s t o a + p u o l u s t u s t a r v i k e v i r a s t o n + p u o l u s t u s t a r v i k k e e t + p u o l u s t u s t a r v i k k e i d e n + p u o l u s t u s t a r v i k k e i s i i n + p u o l u s t u s t a r v i k k e i t a + p u o l u s t u s t a v o i t t e e t + p u o l u s t u s t e h t ä v i e n + p u o l u s t u s t e h t ä v i i n + p u o l u s t u s t e h t ä v i s t ä + p u o l u s t u s t e k i j ä n + p u o l u s t u s t e k n i i k a n + p u o l u s t u s t e k n i i k o i t a + p u o l u s t u s t e k n o l o g i a + p u o l u s t u s t e k n o l o g i a a + p u o l u s t u s t e k n o l o g i a n + p u o l u s t u s t e k n o l o g i s e n + p u o l u s t u s t e o l l i s u u d e k s i + p u o l u s t u s t e o l l i s u u d e l l e + p u o l u s t u s t e o l l i s u u d e n + p u o l u s t u s t e o l l i s u u d e s s a + p u o l u s t u s t e o l l i s u u d e s t a + p u o l u s t u s t e o l l i s u u s + p u o l u s t u s t e o l l i s u u s p o l i t i i k a n + p u o l u s t u s t e o l l i s u u s y r i t y k s i ä + p u o l u s t u s t e o l l i s u u s y r i t y s t e n + p u o l u s t u s t e o l l i s u u t e e n + p u o l u s t u s t e o l l i s u u t e m m e + p u o l u s t u s t e o l l i s u u t e n s a + p u o l u s t u s t e o l l i s u u t t a + p u o l u s t u s t e o l l i s u u t t a m m e + p u o l u s t u s t i e d u s t e l u n + p u o l u s t u s t o i m i a + p u o l u s t u s t o i m i e n + p u o l u s t u s t o i m i i n + p u o l u s t u s t o i m i l l a + p u o l u s t u s t o i m i n t a a + p u o l u s t u s t o i m i n t a l i n j o j e n + p u o l u s t u s t o i m i s t a + p u o l u s t u s t u o t t e i d e n + p u o l u s t u s t u o t t e i t a + p u o l u s t u s t u t k i m u s t a + p u o l u s t u s t ä h d i s t ö + p u o l u s t u s u l o t t u v u u d e n + p u o l u s t u s u l o t t u v u u s + p u o l u s t u s u l o t t u v u u t t a + p u o l u s t u s u n i o n i + p u o l u s t u s u n i o n i a + p u o l u s t u s u n i o n i i n + p u o l u s t u s u n i o n i n a + p u o l u s t u s u u d i s t u s t a + p u o l u s t u s v a l i o k u n t i e n + p u o l u s t u s v a l m i u d e n + p u o l u s t u s v a l m i u d e t + p u o l u s t u s v a l m i u k s i a + p u o l u s t u s v a l m i u k s i a a n + p u o l u s t u s v a l m i u k s i a m m e + p u o l u s t u s v a l m i u k s i e n + p u o l u s t u s v a l m i u k s i s s a + p u o l u s t u s v a l m i u t e e n + p u o l u s t u s v a l m i u t e m m e + p u o l u s t u s v a l m i u t t a + p u o l u s t u s v a l m i u t t a a n + p u o l u s t u s v a r o j e n + p u o l u s t u s v a s t u u t a + p u o l u s t u s v a s t u u t a m m e + p u o l u s t u s v i r a s t o + p u o l u s t u s v i r a s t o a + p u o l u s t u s v i r a s t o l l a + p u o l u s t u s v i r a s t o l l e + p u o l u s t u s v i r a s t o l t a + p u o l u s t u s v i r a s t o n + p u o l u s t u s v i r a s t o o n + p u o l u s t u s v o i m a a + p u o l u s t u s v o i m a m m e + p u o l u s t u s v o i m a t + p u o l u s t u s v o i m a v a r a t + p u o l u s t u s v o i m a v a r o j a + p u o l u s t u s v o i m a v a r o j e n + p u o l u s t u s v o i m i a + p u o l u s t u s v o i m i e m m e + p u o l u s t u s v o i m i e n + p u o l u s t u s v o i m i i n + p u o l u s t u s v o i m i l l a + p u o l u s t u s v o i m i l l e + p u o l u s t u s v o i m i s s a + p u o l u s t u s v o i m i s t a + p u o l u s t u s v ä l i n e + p u o l u s t u s v ä l i n e e s t ä + p u o l u s t u s v ä l i n e e t + p u o l u s t u s v ä l i n e i d e n + p u o l u s t u s v ä l i n e i s t ö + p u o l u s t u s v ä l i n e i s t ö n + p u o l u s t u s v ä l i n e i t ä + p u o l u s t u s v ä l i n e m a r k k i n o i s t a + p u o l u s t u s v ä l i n e t e o l l i s u u d e n + p u o l u s t u s v ä l i n e t e o l l i s u u d e s s a + p u o l u s t u s y h t e i s t y ö + p u o l u s t u s y h t e i s t y ö h ö n + p u o l u s t u s y h t e i s t y ö n + p u o l u s t u s y h t e i s t y ö s s ä + p u o l u s t u s y h t e i s t y ö t ä + p u o l u s t u s y h t e i s t y ö t ä ä n + p u o l u s t u s y h t e i s ö + p u o l u s t u s y h t e i s ö n + p u o l u s t u s y h t e i s ö ä + p u o l u s t u s y h t e y k s i ä + p u o l u s t u s y h t ä l ö n + p u o l u s t u s y k s i k ö i d e n + p u o l u s t u s y r i t y s t e n + p u o l u s t u s y t i m e s t ä + p u o m i t r o o l a r i a + p u o m i t r o o l a r i e n + p u o m i t r o o l i a + p u o s k a r e i d e n + p u o s k a r e i t a + p u p i l l i r e a k t i o + p u r e s k e l e m a a n + p u r e t a a n + p u r e t t a e s s a + p u r e t t u + p u r e t t u a + p u r e u d u t t a v a + p u r e u t u a + p u r e u t u m a a n + p u r e u t u u + p u r e v a m p a a + p u r e v i m m i n + p u r i s t a a k i n + p u r i s t e k a k k u + p u r i s t e m e h u a + p u r i s t e m e h u j e n + p u r i s t e m e h u n + p u r i s t e m e h u s t a + p u r i s t e m e h u t u e n + p u r i s t e m e h u u n + p u r i s t i n t y ö k a l u a + p u r i s t u k s i i n + p u r i s t u s l u j u u s + p u r i s t u s s u h d e + p u r j e a l u s + p u r j e e t + p u r j e h d u k s e n + p u r j e h d u s k e l p o i n e n + p u r j e h d u s k e n k ä + p u r j e h d u s t a + p u r j e h d u s t a p a a + p u r j e h t i e s s a a n + p u r j e h t i v a a + p u r j e h t i v a n + p u r j e h t i v a t + p u r j e h t i v i a + p u r j e h t i v i e n + p u r j e h t i v i l l a + p u r j e k a l a + p u r j e m e r i m o n n i + p u r j e m o l l i + p u r j e p e r h o n e n + p u r j e v e n e o n n e t t o m u u s + p u r j e v ä l s k ä r i + p u r k a a + p u r k a m a l l a + p u r k a m a s s a + p u r k a m i s e e n + p u r k a m i s e k s i + p u r k a m i s e l l e + p u r k a m i s e s t a + p u r k a m i s h a n k e + p u r k a m i s i s t a + p u r k a m i s o i k e u d e s t a + p u r k a m i s p a i k a l l a + p u r k a m i s p r o s e s s i n + p u r k a m i s p r o s e s s i s s a + p u r k a m i s p r o s e s s i s t a + p u r k a m i s s t r a t e g i a + p u r k a m i s s u u n t a u s t a + p u r k a m i s t a + p u r k a m i s v e l v o i t t e e n + p u r k a u k s e n + p u r k a u k s e t + p u r k a u s s a t a m i n a + p u r k a u s t a n i + p u r k a u s t i l a n t e e s t a + p u r k a u t u a + p u r k a u t u e s s a + p u r k u a + p u r k u a s e m i s t a + p u r k u j ä r j e s t e l m ä t + p u r k u k e s k u k s i a + p u r k u k i e l t o o n + p u r k u k u s t a n n u k s i s t a + p u r k u l a i t o k s i s s a + p u r k u o h j e l m a a + p u r k u o p e r a a t i o k s i + p u r k u p a i k a l l a + p u r k u r a h a s t o s t a + p u r k u t o i m e n p i t e i s i i n + p u r k u t o i m e n p i t e i t ä + p u r k u t y ö t ä n n e + p u r k u t ö i d e n + p u r k u t ö i h i n + p u r k u t ö i t ä + p u r k u v a l v o n t a a + p u r o h o p e a t ä p l ä + p u r o k e r t t u l i + p u r o k o i s a + p u r o k o r e n t o + p u r o n i e r i ä + p u r o r i k k o + p u r o u u n i l i n t u + p u r o y ö k k ö n e n + p u r p p u r a a + p u r p p u r a b a k t e e r i + p u r p p u r a d y n a m o + p u r p p u r a h e r t t u a k a l a + p u r p p u r a j u o v a h u u l i k a l a + p u r p p u r a k a r d i n a a l i + p u r p p u r a k e i j u a h v e n + p u r p p u r a k o t i n g a + p u r p p u r a k u l t a s i i p i + p u r p p u r a k u n i n g a s + p u r p p u r a k u r k k u k o t i n g a + p u r p p u r a k y y h k y + p u r p p u r a k ö y n n ö s v e h k a + p u r p p u r a l e s k i + p u r p p u r a l o i s t o r a s t a s + p u r p p u r a n a a k k a + p u r p p u r a n o i t a + p u r p p u r a n u p p i s e i t i k k i + p u r p p u r a n ä t k e l m ä + p u r p p u r a p e r ä k o t t a r a i n e n + p u r p p u r a p i h t a + p u r p p u r a p ä ä k o t t a r a i n e n + p u r p p u r a s e l k ä k o l i b r i + p u r p p u r a s i n i k k a + p u r p p u r a t a m m i + p u r p p u r a v a l m u s k a + p u r p p u r a v i r r a t + p u r p p u r a v y ö h y k e + p u r p p u r a v ä l s k ä r i + p u r s i m i e s p i l l i + p u r s i s e u r a + p u r s u h o p e a t ä p l ä + p u r s u p i k k u m i t t a r i + p u r t a v a k s i + p u r t i l o i d e n + p u r u i m u r i + p u r u k u m e i s s a + p u r u k u m i + p u r u k u m i a + p u r u k u m i p o p + p u r u l e l u i s s a + p u r u l e l u j a + p u r u r e n k a i d e n + p u r u t u p a k k a + p u s k u r i a l u e e n + p u s k u r i j o u k k o j e n + p u s k u r i k s i + p u s k u r i l i u o s + p u s k u r i m u i s t i + p u s k u r i n a + p u s k u r i v a l t i o + p u s k u r i v a r a s t o n + p u s k u r i v a r a s t o t + p u s k u r i v y ö h y k e + p u s k u r i v y ö h y k e t t ä + p u s k u r i v y ö h y k k e e l l e + p u s k u r i v y ö h y k k e e l l ä + p u s k u r i v y ö h y k k e e l t ä + p u s k u r i v y ö h y k k e e n + p u s k u r i v y ö h y k k e e s t ä + p u s k u r i v y ö h y k k e e t + p u s k u r i v y ö h y k k e i d e n + p u s k u r i v y ö h y k k e i t ä + p u s s i a h m a + p u s s i e l ä i m i s t ä + p u s s i j u o k s u + p u s s i k i i t ä j ä + p u s s i k o n t i a i s e t + p u s s i m a t t i + p u s s i p ä ä s t ä i s e t + p u s s i s a u k k o + p u s s i s i k a + p u s s i t i a i n e n + p u s s i t i a i s e t + p u s s i u n i k e o t + p u s s i v e r k k o j e n + p u s t a n t u l i k u k k a + p u s u k a l a + p u t i n + p u t i p u h t a i t a + p u t k e n + p u t k e n a v a a j a l l a + p u t k e s t a + p u t k i a s i a s t a + p u t k i e n + p u t k i h a n k e t t a + p u t k i h a n k k e e s t a + p u t k i j ä r j e s t e l m i ä + p u t k i k e l l o t + p u t k i l o k a s v i t + p u t k i l u u + p u t k i m i e h e s t ä + p u t k i m i e s p a l v e l u j e n + p u t k i m i e s t ä + p u t k i n ä k ö + p u t k i p o m m i + p u t k i p o m m i t + p u t k i p o s t i + p u t k i r a i v a i n + p u t k i r e i t t i e n + p u t k i v e r k o s t o + p u t k i v e r k o s t o a + p u t k i v i r t a u s r e a k t o r i + p u t k i y h t e y k s i e n + p u t o a a + p u t o a m a a n + p u t o a m a t t a + p u t o a m i s e t + p u t o a m i s i a + p u t o a m i s k i i h t y v y y d e n + p u t o a m i s k i i h t y v y y s + p u t o a m i s l i i k e + p u t o a m i s o n n e t t o m u u k s i e n + p u t o a m i s t a + p u t o a m i s t e n + p u u a l a + p u u a l a l l a + p u u a l a l l e + p u u a l a n + p u u b i o m a s s a + p u u b i o m a s s a a + p u u b i o m a s s a n + p u u h a n h i + p u u h e v o n e n + p u u h i a a n + p u u h i i l i u u n e j a + p u u h k a t a n s s i j a + p u u h u i l u + p u u i s t u t u k s i a + p u u j a l k a + p u u j a l k a a n + p u u j ä t t e e n + p u u k a a s u + p u u k a l a + p u u k a n e r v a + p u u k a t o n + p u u k a u p a n + p u u k a u p a s t a + p u u k a u p p a + p u u k a u p p a a + p u u k e n g u r u t + p u u k e n k ä p u u + p u u k i i p e i l y + p u u k i i p i j ä + p u u k i r k o t + p u u k o h t a i n e n + p u u k o h t a i s e n + p u u k o h t a i s e s t a + p u u k o m p o s i i t t i + p u u l a j e i l t a + p u u l a j e i n e e n + p u u l a j e i s s a + p u u l a j e j a + p u u l a j i + p u u l a j i e n + p u u l a j i k o o s t u m u k s e n + p u u l a j i t + p u u l a s t u i h i n + p u u l a s t u i l l a + p u u l a s t u j a + p u u l a s t u j e n + p u u l e o p a r d i + p u u l l a + p u u m a j a + p u u m a n a i n e n + p u u m a n g u s t i + p u u m a r k k i n o i d e n + p u u m a r k k i n o i t a + p u u m e r k k i + p u u m ä ä r ä + p u u m ä ä r ä t + p u u n h a k k u u t + p u u n i l a i s s o d a t + p u u n i l a i s s o t a + p u u n i l a i s s o t a a + p u u n i s t u t u k s i s s a + p u u n j a l o s t u k s e s s a + p u u n j a l o s t u s t e o l l i s u u d e n + p u u n j a l o s t u s t e o l l i s u u s + p u u n j a l o s t u s y h t i ö i d e n + p u u n k a p p a l e i t a + p u u n k o r j u u a l a + p u u n k o r j u u a l a a + p u u n k o r j u u n + p u u n k o r j u u t o i m i e n + p u u n k ä y t ö n + p u u n s i i r r o n + p u u n t o i m i t u k s i a + p u u n t u o j a m a i d e n + p u u n t u o n t i a + p u u n t u o t a n n o n + p u u n t u o t a n n o s t a + p u u n t u o t a n t o o n + p u u n t u o t a n t o t a r k o i t u k s e s s a + p u u n t u o t t a j a m a i d e n + p u u n t u o t t a j a m a i l l e + p u u n t y ö s t ö k o n e i d e n + p u u n u i j a + p u u n u k k e + p u u n v i e j i l l e + p u u n v i e n t i ä + p u u p a l o j e n + p u u p e l l e t t i + p u u p e l l e t t i e n + p u u p i i k k i s i a t + p u u p o l t t o a i n e e n + p u u p o l t t o a i n e e t + p u u p o l t t o a i n e i d e n + p u u p o l t t o a i n e i t a + p u u p u h a l l i n + p u u p y t o n + p u u p ö l y + p u u p ö l y j e n + p u u p ö l y l l e + p u u p ö l y n + p u u p ö l y t + p u u r a h a s t o n + p u u r a j a + p u u r a k e n n u s m a t e r i a a l i t + p u u r a u t a t i e t + p u u r o t + p u u r o v a d i l l i s e s t a + p u u s k a r i n t a m a + p u u s t a + p u u t a l o u d e n + p u u t a l o u s + p u u t a l o u t t a + p u u t a m a a n i t + p u u t a r h a + p u u t a r h a h a n o j e n + p u u t a r h a k a u p u n k i + p u u t a r h a k ä y t ö s s ä + p u u t a r h a n h o i d o s t a + p u u t a r h a n h o i t o p a l v e l u t + p u u t a r h a n v i l j e l y s s ä + p u u t a r h a p ö y t ä m m e + p u u t a r h a s i e m e n e t + p u u t a r h a s s a + p u u t a r h a s u u n n i t t e l u + p u u t a r h a t o n t t u + p u u t a r h a t o n t t u j e n + p u u t a r h a t u o t t e i d e n + p u u t a r h a t u o t t e i l l e + p u u t a r h a t u o t t e i s i i n + p u u t a r h a t u o t t e i s t a + p u u t a r h a v i l j e l i j ä t + p u u t a r h a v i l j e l y a l a + p u u t a r h a v i l j e l y a l a l l a + p u u t a r h a v i l j e l y a l a n + p u u t a r h a v i l j e l y n + p u u t a r h a v i l j e l y s t u o t t e i d e n + p u u t a r h u r i + p u u t a u d e i s t a + p u u t a v a r a + p u u t a v a r a a + p u u t a v a r a k a u p a n + p u u t a v a r a k a u p a s s a + p u u t a v a r a k a u p a s t a + p u u t a v a r a k a u p p a a + p u u t a v a r a k a u p p i a a l t a + p u u t a v a r a k y s y m y s + p u u t a v a r a t e o l l i s u u d e s s a + p u u t a v a r a t u o t a n t o a + p u u t a v a r a y h t i ö i d e n + p u u t a v a r a y h t i ö t + p u u t e l i s t a + p u u t e l u e t t e l o n + p u u t e o l l i s u u d e l l e + p u u t e o l l i s u u d e n + p u u t e o l l i s u u d e s s a + p u u t e o l l i s u u s + p u u t e o l l i s u u t e m m e + p u u t e r i a + p u u t e r i h u i s k u + p u u t e t t a + p u u t i a i n e n + p u u t i a i s a i v o t u l e h d u s + p u u t i a i s l ä ä k i t y s t ä + p u u t i a i s t a r k a s t u s t a + p u u t t e e l l a + p u u t t e e l l i s e e n + p u u t t e e l l i s e m m a t + p u u t t e e l l i s e m m i n + p u u t t e e l l i s e m p a a + p u u t t e e l l i s e s t a + p u u t t e e l l i s e t + p u u t t e e l l i s i a + p u u t t e e l l i s i k s i + p u u t t e e l l i s t a + p u u t t e e l l i s t e n + p u u t t e e l l i s u u k s i a + p u u t t e e n + p u u t t e e n a + p u u t t e e n a l a i s i m m a t + p u u t t e e n a l a i s i m m i l l e + p u u t t e e n s a + p u u t t e e s e e n + p u u t t e e s s a + p u u t t e e s t a + p u u t t e e t + p u u t t e i d e n + p u u t t e i k s i + p u u t t e i l t a + p u u t t e i n e e n + p u u t t e i s i i m m e + p u u t t e i s i i n + p u u t t e i s s a + p u u t t e i s t a + p u u t t e i s t a a n + p u u t t e i t a + p u u t t e i t a k i n + p u u t t e i t a m m e + p u u t t u a + p u u t t u a k s e e n + p u u t t u a k s e m m e + p u u t t u e s s a + p u u t t u i s i k a a n + p u u t t u i s i n + p u u t t u i s i v a t + p u u t t u i v a t + p u u t t u k a a + p u u t t u k a a m m e + p u u t t u k o + p u u t t u m a a n + p u u t t u m a s t a + p u u t t u m a t t a + p u u t t u m a t t o m u u d e n + p u u t t u m a t t o m u u d e s t a + p u u t t u m a t t o m u u s p e r i a a t e t t a + p u u t t u m a t t o m u u s p o l i t i i k a n + p u u t t u m a t t o m u u s p o l i t i i k k a + p u u t t u m a t t o m u u t t a + p u u t t u m i s e e n + p u u t t u m i s e k s i + p u u t t u m i s e l t a + p u u t t u m i s e n + p u u t t u m i s e s t a + p u u t t u m i s k e i n o j a + p u u t t u m i s m e n e t e l m i ä + p u u t t u m i s t a + p u u t t u n e e t + p u u t t u n u t + p u u t t u u + p u u t t u v a a + p u u t t u v a n + p u u t t u v a s t a + p u u t t u v a t + p u u t t u v i a + p u u t t u v i e n + p u u t t u v i l l e + p u u t t u v i s t a + p u u t u a + p u u t u l l i e n + p u u t u l v a + p u u t u m m e + p u u t u n + p u u t u o t a n n o s t a + p u u t u o t t e e t + p u u t u o t t e i d e m m e + p u u t u o t t e i d e n + p u u t u o t t e i l l e + p u u t u o t t e i t a + p u u t u t a + p u u t u t a a n + p u u t u t t a i s i i n + p u u t u t t a v a + p u u t y n n y r e i s s ä + p u u t y n n y r i t + p u u v a r a n t o i n e e n + p u u v a r o j a + p u u v a r o j e n + p u u v a r s i + p u u v i i l u + p u u v i l l a + p u u v i l l a k a n k a i t a + p u u v i l l a k a s v i e n + p u u v i l l a k i i s t a n + p u u v i l l a k u i d u n + p u u v i l l a k ä r s ä k ä s + p u u v i l l a m a r k k i n a m m e + p u u v i l l a m a r k k i n o i t a + p u u v i l l a m o n o k u l t t u u r e i h i n + p u u v i l l a n + p u u v i l l a n e u v o t t e l u i l l e + p u u v i l l a n j a l o s t u s t e o l l i s u u t t a + p u u v i l l a n k a s v a t t a j i a + p u u v i l l a n p u h d i s t u s t e o l l i s u u d e s t a + p u u v i l l a n p u h d i s t u s t e o l l i s u u t t a + p u u v i l l a n t u o t a n n o n + p u u v i l l a n t u o t a n n o s t a + p u u v i l l a n t u o t a n t o + p u u v i l l a n t u o t a n t o a + p u u v i l l a n t u o t a n t o a l a n + p u u v i l l a n t u o t a n t o a l u e i d e n + p u u v i l l a n t u o t t a j a + p u u v i l l a n t u o t t a j a m m e + p u u v i l l a n t u o t t a j a v a l t i o t + p u u v i l l a n t u o t t a j i a a n + p u u v i l l a n t u o t t a j i e n + p u u v i l l a n t u o t t a j i l l e + p u u v i l l a n t u o t t a j i s t a + p u u v i l l a n v i e j ä + p u u v i l l a n v i l j e l i j ä + p u u v i l l a n v i l j e l i j ä t + p u u v i l l a n v i l j e l i j ö i d e n + p u u v i l l a n v i l j e l y + p u u v i l l a n v i l j e l y n + p u u v i l l a n v i l j e l y ä + p u u v i l l a p a a l i n + p u u v i l l a p a l k k i o i d e n + p u u v i l l a p e l l o i l l a + p u u v i l l a s a d o n + p u u v i l l a s a t o + p u u v i l l a s a t o o n + p u u v i l l a t e o l l i s u u s + p u u v i l l a t i l a t + p u u v i l l a t u o t a n n o n + p u u v i l l a t u o t a n n o s s a + p u u v i l l a t u o t t e i d e n + p u u v i l l a u u d i s t u k s e n + p u u v i l l a u u d i s t u s t a + p u u v i l l a v e l k o j e n + p u u v i l l a v i l j e l m i ä + p u u y h t i ö i d e n + p u v u t + p y g m i t + p y h e m p i n ä + p y h i e n + p y h i l l ä + p y h i m m ä n + p y h i m p i ä + p y h i m y k s e n ä + p y h i m y s k a l e n t e r i + p y h i n + p y h i n ä + p y h i t t ä i s i + p y h i t t ä ä + p y h i t t ä ä k ö + p y h i ä + p y h y y t e n n e + p y h y y t e n s ä + p y h ä i i b i s + p y h ä i n p ä i v ä + p y h ä j ä r v i + p y h ä k o u l u + p y h ä l l e + p y h ä l l ä + p y h ä m a i n a + p y h ä n + p y h ä n ä + p y h ä p ä i v i n ä + p y h ä s t ä + p y h ä ä + p y h ä ä n + p y j a m a b a n a a n i t + p y j a m a h u u l i k a l a + p y j a m a k a l a + p y j a m a s s a + p y k ä l i s t ä + p y k ä l ä k u l t t u u r i n + p y k ä l ä m e r k k i + p y k ä l ä n + p y k ä l ä n u m e r o t + p y k ä l ä p ö h ö l l ä + p y k ä l ä s t ä + p y l v ä s j ä r j e s t e l m ä t + p y l v ä s k a a v i o + p y l v ä s k r o m a t o g r a f i a + p y l v ä s t y r ä k k i + p y r a m i d i h u i j a u s + p y r a m i d i j ä r j e s t e l m ä ä n + p y r a m i d i k a a v i o o n + p y r a m i d i o n g e l m a n + p y r a m i d i p e l i + p y r a m i d i p e r h o k a l a + p y r a m i d i r a h a s t o i s s a + p y r a m i d i r a h a s t o j a + p y r a m i d i r a h a s t o j e n + p y r a m i d i r a k e n n e + p y r a m i d i r a k e n t e e n + p y r a m i d i r a k e n t e i s t a + p y r a m i d i r a k e n t e i t a + p y r a m i d i r i k o l l i s u u t e e n + p y r a m i d i s i j o i t u s j ä r j e s t e l m ä n + p y r a m i d i s u u n n i t e l m i s t a + p y r a m i d i y h t i ö i s s ä + p y r a m i d i y h t i ö i t ä + p y r a m i d i y h t i ö t ä + p y r i d o k s a a l i f o s f a a t t i + p y r i m m e + p y r i m m e k i n + p y r i m m e k ö + p y r i n + p y r i t t i i n + p y r i t t y + p y r i t t ä e s s ä + p y r i t t ä i s i i n + p y r i t ä + p y r i t ä ä n + p y r i t ä ä n k i n + p y r i t ä ä n k ö + p y r k i + p y r k i e s s ä + p y r k i e s s ä m m e + p y r k i e s s ä n n e + p y r k i e s s ä ä n + p y r k i i + p y r k i i k i n + p y r k i k ä ä + p y r k i k ä ä m m e + p y r k i m i s t ä + p y r k i m y k s e e m m e + p y r k i m y k s e e n + p y r k i m y k s e m m e + p y r k i m y k s e n + p y r k i m y k s e n i + p y r k i m y k s e n s ä + p y r k i m y k s e n ä + p y r k i m y k s e n ä m m e + p y r k i m y k s e n ä ä n + p y r k i m y k s e s s ä m m e + p y r k i m y k s e s t ä + p y r k i m y k s e s t ä ä n + p y r k i m y k s e t + p y r k i m y k s i i m m e + p y r k i m y k s i i n + p y r k i m y k s i l l e + p y r k i m y k s i l l e e n + p y r k i m y k s i l l e m m e + p y r k i m y k s i l l ä m m e + p y r k i m y k s i s s ä + p y r k i m y k s i s t ä + p y r k i m y k s i s t ä m m e + p y r k i m y k s i s t ä n n e + p y r k i m y k s i s t ä ä n + p y r k i m y k s i ä + p y r k i m y k s i ä m m e + p y r k i m y k s i ä ä n + p y r k i m y s t e m m e + p y r k i m y s t e n + p y r k i m y s t ä + p y r k i m y s t ä m m e + p y r k i m y s t ä ä n + p y r k i m ä l l ä + p y r k i m ä s s ä + p y r k i m ä s t ä + p y r k i m ä t t ä + p y r k i m ä ä n + p y r k i n e e t + p y r k i n y t + p y r k i n y t k ä ä n + p y r k i s i + p y r k i v i e n + p y r k i v ä n + p y r k i v ä t + p y r k i ä + p y r k i ä k s e e n + p y r k i ä k s e m m e + p y r k i ä k s e n n e + p y r o c u m u l u s + p y r o r i k k i h a p p o + p y r o t e k n i i k k a a + p y r o t e k n i s i l l e + p y r o t e k n i s t e n + p y r s t ö e r a k k o k o l i b r i + p y r s t ö t i a i n e n + p y r s t ö t ä h t i + p y r s t ö v e i t s i k a l a t + p y r u v a a t t i k i n a a s i + p y s t y e s s ä ä n + p y s t y i + p y s t y i m m e + p y s t y i s i + p y s t y i s i m m e + p y s t y i s i m m e k ö + p y s t y i s i v ä t + p y s t y i v ä t + p y s t y k i u r u n k a n n u s + p y s t y k ä ä n + p y s t y m i s e s t ä + p y s t y m m e + p y s t y m m e k ö + p y s t y m ä t t ä + p y s t y n + p y s t y n e e t + p y s t y n k ö + p y s t y n o k k a k o l i b r i + p y s t y n y t + p y s t y t t e k ö + p y s t y t t i i n + p y s t y t t y + p y s t y t t y ä ä n + p y s t y t t ä i s i i n + p y s t y t t ä ä + p y s t y t ä ä n + p y s t y t ä ä n k ö + p y s t y v i ä + p y s t y v ä i s i ä + p y s t y v ä n s ä + p y s t y v ä t + p y s t y y + p y s t y y k ö + p y s t y ä + p y s t y ä k s e e n + p y s t y ä k s e m m e + p y s t y ä k s e n i + p y s y e n + p y s y i + p y s y i s i + p y s y i s i v ä t + p y s y i v ä t + p y s y k ä ä m m e + p y s y m i n e n + p y s y m i s e k s i + p y s y m i s t ä + p y s y m i s t ä ä n + p y s y m m e + p y s y m m e k ö + p y s y m ä ä n + p y s y n + p y s y n e e t + p y s y n e v ä t + p y s y n y t + p y s y t e l k ä ä + p y s y t e l l e e n + p y s y t t ä i s i i n + p y s y v i e n + p y s y v i i n + p y s y v i k s i + p y s y v i l l e + p y s y v i l l ä + p y s y v i s t ä + p y s y v i ä + p y s y v y y d e n + p y s y v y y t t ä + p y s y v ä i s l u o n t e i s i a + p y s y v ä i s l u o n t e i s u u s + p y s y v ä i s l u o n t o i s e n + p y s y v ä k s i + p y s y v ä l l ä + p y s y v ä m m i n + p y s y v ä m m ä n + p y s y v ä m m ä s t ä + p y s y v ä m p i + p y s y v ä m p i ä + p y s y v ä m p ä ä + p y s y v ä m p ä ä n + p y s y v ä n + p y s y v ä n ä + p y s y v ä s s ä + p y s y v ä s t ä + p y s y v ä t + p y s y v ä t k ö + p y s y v ä ä + p y s y v ä ä n + p y s y y + p y s y y k i n + p y s y ä + p y s y ä k s e e n + p y s y ä k s e m m e + p y s ä h d y k s i i n + p y s ä h d y k s i s s ä + p y s ä h d y m m e k ö + p y s ä h d y s p a i k a t + p y s ä h d y s p a i k k a + p y s ä h d y s p a i k k a n a + p y s ä h d y s p a i k k o i h i n + p y s ä h d y s p a i k k o j a + p y s ä h d y s p a i k k o j e n + p y s ä h d y s p a i k o i l l a + p y s ä h d y s p a i k o i s t a + p y s ä h d y s t i l a a + p y s ä h d y s t i l a a n + p y s ä h t y i + p y s ä h t y i s i + p y s ä h t y k ä ä m m e + p y s ä h t y m i s m e r k k e j ä + p y s ä h t y m i s o n g e l m a + p y s ä h t y m i s p a i k k a a + p y s ä h t y m ä s s ä + p y s ä h t y m ä t t ä + p y s ä h t y n e i l t ä + p y s ä h t y n e i s y y d e n + p y s ä h t y n e i s y y d e s t ä + p y s ä h t y n e i s y y t e e n + p y s ä h t y n e i s y y t t ä + p y s ä h t y v ä t k ö + p y s ä h t y y + p y s ä h t y ä + p y s ä k ö i n t i a l u e + p y s ä k ö i n t i a l u e e t + p y s ä k ö i n t i a l u e i d e n + p y s ä k ö i n t i a l u e i l l a + p y s ä k ö i n t i a l u e i l t a + p y s ä k ö i n t i a l u e i s t a + p y s ä k ö i n t i a l u e i t a + p y s ä k ö i n t i a v u s t a j a + p y s ä k ö i n t i j ä r j e s t e l y j ä + p y s ä k ö i n t i k i e k k o + p y s ä k ö i n t i k o r t i n + p y s ä k ö i n t i l u p a m a l l i a + p y s ä k ö i n t i l u p i e n + p y s ä k ö i n t i l u v a l l a + p y s ä k ö i n t i l u v a n + p y s ä k ö i n t i l u v a s t a + p y s ä k ö i n t i l u v a t + p y s ä k ö i n t i m a k s u i l l a + p y s ä k ö i n t i m a k s u t + p y s ä k ö i n t i o n g e l m a t + p y s ä k ö i n t i p a i k a l l a + p y s ä k ö i n t i p a i k a n + p y s ä k ö i n t i p a i k a t + p y s ä k ö i n t i p a i k k a + p y s ä k ö i n t i p a i k k o j a + p y s ä k ö i n t i p a i k o i l l e + p y s ä k ö i n t i p a i k o i s t a + p y s ä k ö i n t i p a l v e l u i s t a + p y s ä k ö i n t i p a l v e l u j a + p y s ä k ö i n t i r i k k e e n + p y s ä k ö i n t i s a k k o j e n + p y s ä k ö i n t i s ä ä n t ö j e n + p y s ä k ö i n t i t a l o + p y s ä k ö i n t i t i l a + p y s ä y t e t t y ä + p y s ä y t e t ä ä n + p y s ä y t t i + p y s ä y t t ä i s i + p y s ä y t t ä k ä ä + p y s ä y t t ä m i s a s t e e s s a + p y s ä y t t ä m i s e k s e e n + p y s ä y t t ä m i s e k s i + p y s ä y t t ä m i s r e k i s t e r i + p y s ä y t t ä m i s t a k t i i k k a n a + p y s ä y t t ä m i s v ä h e m m i s t ö ä + p y s ä y t t ä m ä ä n + p y s ä y t t ä v i m p ä n ä + p y s ä y t t ä v ä + p y s ä y t t ä ä + p y s ä y t t ä ä k s e m m e + p y s ä y t ä m m e + p y s ä y t ä m m e k ö + p y y d e t t i i n + p y y d e t t ä e s s ä + p y y d e t y t + p y y d e t ä ä n + p y y d e t ä ä n k i n + p y y d y k s e n + p y y d y k s e t + p y y d y k s i i n + p y y d y k s i l l ä + p y y d y k s i s t ä + p y y d y k s i ä + p y y d y s r y h m i i n + p y y d y s t e n + p y y d y s t y s a l u e e s t a + p y y d y s t y y p i t + p y y d y s t y y p p e j ä + p y y d y s t ä m i s m e n e t e l m i s s ä + p y y d ä m m e + p y y d ä m m e k i n + p y y d ä m m e k ö + p y y d ä n + p y y d ä n k i n + p y y d ä t t e + p y y h e p ä i v ä + p y y h k i y t y i v ä t + p y y h k i ä + p y y h k ä i s i + p y y h k ä i s s e e t + p y y h k ä i s t i i n + p y y h k ä i s t ä ä n + p y y h k ä i s y v i i v a r e n d e r o i n t i + p y y k i n k u i v a u s t e l i n e + p y y k i n p e s u a i n e e l l e + p y y k i n p e s u a i n e e n + p y y k i n p e s u a i n e e s s a + p y y k i n p e s u a i n e i s s a + p y y k i n p e s u k o n e + p y y k k i n a r u + p y y n n i n + p y y n n i s t ä + p y y n n ö i k s i + p y y n n ö i l l ä + p y y n n ö i s s ä + p y y n n ö i s t ä + p y y n n ö l l e n i + p y y n n ö n + p y y n n ö s t ä + p y y n n ö t + p y y n t i a l a a + p y y n t i a l a l l a + p y y n t i a l u e + p y y n t i a l u e e k s i + p y y n t i a l u e e t + p y y n t i a l u e i d e n + p y y n t i a l u e i l l a + p y y n t i a l u e i t a + p y y n t i a l u e t t a + p y y n t i a l u k s e t + p y y n t i a l u k s i a + p y y n t i a l u k s i i n + p y y n t i a l u s t e n + p y y n t i a n s o j e n + p y y n t i i n + p y y n t i k a l a s t u k s e n + p y y n t i k a p a s i t e e t i n + p y y n t i k a p a s i t e e t t i + p y y n t i k a p a s i t e e t t i a + p y y n t i k a p a s i t e e t t i a a n + p y y n t i k a p a s i t e e t t i a m m e + p y y n t i k a u d e n + p y y n t i k a u s i + p y y n t i k i e l l o i s t a + p y y n t i k i e l l o n + p y y n t i k i e l l o s s a + p y y n t i k i e l t o + p y y n t i k i e l t o a i k o i n a + p y y n t i k i e l t o a i k o j a + p y y n t i k i e l t o a l u e i d e n + p y y n t i k i e l t o j a k s o i s t a + p y y n t i k i e l t o j a k s o j e n + p y y n t i k i e l t o k a u s i l l a + p y y n t i k i i n t i ö i d e n + p y y n t i k i i n t i ö i s t ä + p y y n t i k i i n t i ö i t ä + p y y n t i k i i n t i ö i t ä ä n + p y y n t i k i i n t i ö n + p y y n t i k i i n t i ö n s ä + p y y n t i k i i n t i ö t + p y y n t i k u s t a n n u k s e t + p y y n t i l u p i e n + p y y n t i m a a l l e + p y y n t i m a h d o l l i s u u d e s t a + p y y n t i m a h d o l l i s u u d e t + p y y n t i m a h d o l l i s u u k s i a + p y y n t i m a h d o l l i s u u k s i e n + p y y n t i m a h d o l l i s u u k s i s t a + p y y n t i m a t k o i l l a + p y y n t i m e n e t e l m i e n + p y y n t i m e n e t e l m i i n + p y y n t i m e n e t e l m i l l e + p y y n t i m e n e t e l m i ä + p y y n t i m e n e t e l m ä l t ä + p y y n t i m e n e t e l m ä n + p y y n t i m e n e t e l m ä t + p y y n t i m e n e t e l m ä ä n + p y y n t i m e t o d i e n + p y y n t i m u o t o j a + p y y n t i m ä ä r i e n + p y y n t i m ä ä r i i n + p y y n t i m ä ä r i s s ä + p y y n t i m ä ä r i ä + p y y n t i n ä k y m i s t ä + p y y n t i o i k e u k s i a + p y y n t i o i k e u k s i s t a + p y y n t i p a i n e e n + p y y n t i p o n n i s t e l u t + p y y n t i p o n n i s t u k s e e n + p y y n t i p o n n i s t u k s e l l e + p y y n t i p o n n i s t u k s e n + p y y n t i p o n n i s t u k s e s s a a n + p y y n t i p o n n i s t u k s e s t a + p y y n t i p o n n i s t u k s e t + p y y n t i p o n n i s t u k s i a + p y y n t i p o n n i s t u k s i i n + p y y n t i p o n n i s t u k s i k s i + p y y n t i p o n n i s t u k s i l l e + p y y n t i p o n n i s t u k s i s t a + p y y n t i p o n n i s t u s + p y y n t i p o n n i s t u s j ä r j e s t e l m ä + p y y n t i p o n n i s t u s j ä r j e s t e l m ä n + p y y n t i p o n n i s t u s j ä r j e s t e l m ä ä n + p y y n t i p o n n i s t u s k y s y m y s t ä + p y y n t i p o n n i s t u s n ä k ö k o h t a a + p y y n t i p o n n i s t u s r a j o i t u s t e n + p y y n t i p o n n i s t u s t a + p y y n t i p o n n i s t u s t a a n + p y y n t i p o n n i s t u s t e n + p y y n t i p o n n i s t u s t e n s a + p y y n t i p ä i v i l l ä + p y y n t i r a j o i t u k s i e n + p y y n t i r a j o i t u k s i k s i + p y y n t i r a j o i t u k s i l l a + p y y n t i r a j o i t u s t e n + p y y n t i s a a l i i t a a n + p y y n t i s e k t o r i l l a + p y y n t i s u u n n i t e l m a + p y y n t i s u u n n i t e l m i a + p y y n t i s u u n n i t e l m i e n + p y y n t i t a p o j a + p y y n t i t e k n i i k o i d e n + p y y n t i t o i m i n n a l l e + p y y n t i t o i m i n n a s t a + p y y n t i t o i m i n t a + p y y n t i t o i m i n t a a + p y y n t i v a j e t t a + p y y n t i v y ö h y k k e i t ä + p y y n t i v ä l i n e i d e n + p y y n t i v ä l i n e i s t ä + p y y n t i v ä l i n e i t ä + p y y n t i ä + p y y n t ö a s i a k i r j o j a + p y y n t ö i h i n + p y y n t ö j e n + p y y n t ö j ä + p y y n t ö l u e t t e l o a + p y y n t ö m m e + p y y n t ö n i + p y y n t ö n n e + p y y n t ö n s ä + p y y n t ö ä + p y y n t ö ä m m e + p y y n t ö ä n n e + p y y n t ö ö n + p y y n t ö ö n i + p y y s i + p y y s i m m e + p y y s i m m e k i n + p y y s i n + p y y s i n k i n + p y y s i v ä t + p y y t e e l l i s e e n + p y y t e e l l i s e l l ä + p y y t e e t t ö m y y t t ä + p y y t e e t ö n t ä + p y y t ä e s s ä + p y y t ä e s s ä m m e + p y y t ä e s s ä n i + p y y t ä e s s ä ä n + p y y t ä i s i m m e + p y y t ä i s i n + p y y t ä i s i n k i n + p y y t ä i s i t t e + p y y t ä i s i t t e k ö + p y y t ä k ä ä + p y y t ä k ä ä m m e + p y y t ä m i e n i + p y y t ä m i i n + p y y t ä m i s k i e l l o s t a + p y y t ä m ä l l ä + p y y t ä m ä s t ä m m e + p y y t ä m ä t t ä + p y y t ä m ä ä n + p y y t ä n e e t + p y y t ä n e i l l e + p y y t ä n y t + p y y t ä v i l l e + p y y t ä v ä t + p y y t ä ä + p y y t ä ä k i n + p y y t ä ä k s e e n + p y y t ä ä k s e m m e + p y y t ä ä k s e n i + p y ö k i n r o u s k u + p y ö k k i h a p e r o + p y ö k k i l e h t o r o u s k u + p y ö k k i o r v o k k i + p y ö r e ä n + p y ö r e ä s s ä + p y ö r i i + p y ö r i m i s a k s e l i + p y ö r i m i s m ä ä r ä + p y ö r i m i s n o p e u s + p y ö r i m ä s s ä + p y ö r i m ä ä n + p y ö r i t t e l e m ä ä n + p y ö r i t t ä ä + p y ö r i ä i s d e l f i i n i + p y ö r r e g a l a k s i + p y ö r r e m y r s k y + p y ö r r e m y r s k y a l u e t t a + p y ö r r e m y r s k y j e n + p y ö r r e m y r s k y k a t a s t r o f i n + p y ö r r e m y r s k y k a u d e n + p y ö r r e m y r s k y n + p y ö r r e m y r s k y ä + p y ö r r e r a t a + p y ö r r e v i r t a + p y ö r r y t t ä v ä t + p y ö r r y t t ä ä + p y ö r ä h d y s k a p p a l e + p y ö r ä i l i j ä t + p y ö r ä i l y k y p ä r ä + p y ö r ä i l y o h j e l m a n + p y ö r ä i l y r e i t t e j ä + p y ö r ä i l y s t ä + p y ö r ä i l y t e i t ä + p y ö r ä i l y u n i o n i + p y ö r ä m a t k a i l u + p y ö r ä n k o r j a a j a n + p y ö r ä s u u n n i s t u k s e n + p y ö r ä s u u n n i s t u s + p y ö r ä t e i d e n + p y ö r ä t e i h i n + p y ö r ä t e i s t ä + p y ö r ä t e i t ä + p y ö r ä t i e t + p y ö r ä t i e v e r k o s t o a + p y ö r ä t u o l i a + p y ö r ä t u o l i c u r l i n g + p y ö r ä t u o l i h i s s i + p y ö r ä t u o l i k e l a u s + p y ö r ä t u o l i k i l p a i l u u n + p y ö r ä t u o l i k o r i p a l l o + p y ö r ä t u o l i l l a + p y ö r ä t u o l i l l e + p y ö r ä t u o l i l u i s k a + p y ö r ä t u o l i m a k s u + p y ö r ä t u o l i m i e k k a i l u + p y ö r ä t u o l i r u g b y + p y ö r ä t u o l i t a n s s i + p y ö r ä t u o l i t e n n i s + p y ö r ä v a r k a u k s i e n + p y ö r ä v ä y l ä + p y ö r ö k i r k k o + p y ö r ö o r a p i h l a j a + p y ö r ö o v i + p y ö r ö o v i m e n e t e l m ä ä n + p y ö r ö s i i p i + p y ö v e l i k u t o j a + p y ö v e l i t k i n + p ä h k i n ä a l a + p ä h k i n ä a l a a n + p ä h k i n ä a l a l l a + p ä h k i n ä a l a l l e + p ä h k i n ä a l a n + p ä h k i n ä a l l e r g i a + p ä h k i n ä h i i r i + p ä h k i n ä n r o u s k u + p ä h k i n ä n t a t t i + p ä h k i n ä p i i k k i p y r s t ö + p ä h k i n ä p r i n s e s s a + p ä h k i n ä p u u n + p ä h k i n ä ä + p ä h k i n ö i d e n + p ä h k i n ö i s t ä + p ä h k i n ö i t ä + p ä h k ä h u l l u a + p ä h k ä m ö k i r j o k ä ä r i ä i n e n + p ä i h d e p o l i t i i k k a + p ä i h d e r i i p p u v u u s + p ä i h d e v a l i s t u s + p ä i n k ä ä n + p ä i n v a s t a i s e e n + p ä i n v a s t a i s e k s i + p ä i n v a s t a i s e l l a + p ä i n v a s t a i s e s s a + p ä i n v a s t a i s e s t i + p ä i n v a s t a i s e t + p ä i n v a s t a i s i a + p ä i n v a s t a i s i i n + p ä i n v a s t a i s t a + p ä i n v a s t a i s t a k i n + p ä i v i e n + p ä i v i i n + p ä i v i k s i + p ä i v i l l e + p ä i v i l l e e n + p ä i v i l t ä + p ä i v i n + p ä i v i n ä + p ä i v i s t ä + p ä i v i t e t t y ä + p ä i v i t e t ä ä n + p ä i v i t t ä i s e e n + p ä i v i t t ä i s e l l ä + p ä i v i t t ä i s e n + p ä i v i t t ä i s e s s ä + p ä i v i t t ä i s e s t ä + p ä i v i t t ä i s e t + p ä i v i t t ä i s i l l ä + p ä i v i t t ä i s i n + p ä i v i t t ä i s i s s ä + p ä i v i t t ä i s i ä + p ä i v i t t ä i s k o s m e t i i k a n + p ä i v i t t ä i s t a v a r a k e t j u t + p ä i v i t t ä i s t a v a r o i s s a + p ä i v i t t ä i s t a v a r o i s t a + p ä i v i t t ä i s t a v a r o i t a + p ä i v i t t ä i s t u o t t e i s s a + p ä i v i t t ä i s t u o t t e i s t a + p ä i v i t t ä i s t ä + p ä i v i t t ä m i s e s s ä + p ä i v i t t ä m i s e s t ä + p ä i v i t t ä ä + p ä i v i t y s e h d o t u s + p ä i v i t y s j ä r j e s t e l m ä n + p ä i v i t y s l o m a k k e i k s i + p ä i v i t y s t ä + p ä i v i ä + p ä i v y s t y s a i k a + p ä i v y s t y s a i k a a + p ä i v y s t y s a i k a a n + p ä i v y s t y s a i k a n a + p ä i v y s t y s a i k o i h i n + p ä i v y s t y s a i k o j a + p ä i v y s t y s a i k o j e n + p ä i v y s t y s a j a k s i + p ä i v y s t y s a j a n + p ä i v y s t y s a j a n j a k s o j a + p ä i v y s t y s a j a s t a + p ä i v y s t y s a j a t + p ä i v y s t y s a j o i s s a + p ä i v y s t y s a j o i s t a + p ä i v y s t y s j a k s o i s t a + p ä i v y s t y s j a k s o j a + p ä i v y s t y s j a k s o j e n + p ä i v y s t y s j a k s o t + p ä i v y s t y s j ä r j e s t e l m ä + p ä i v y s t y s k y s y m y s + p ä i v y s t y s o s a s t o o n + p ä i v y s t y s p a l v e l u j a + p ä i v y s t y s p a l v e l u j e n + p ä i v y s t y s p ä i v i ä + p ä i v y s t y s t y ö a i k a a + p ä i v y s t y s t y ö a i k a a n + p ä i v y s t y s t y ö n t e k i j ö i d e n + p ä i v y s t y s t y ö s t ä + p ä i v y s t y s t y ö t ä + p ä i v y s t y s t ä + p ä i v y s t y s v e l v o l l i s u u s + p ä i v ä a n n o k s e t + p ä i v ä a n n o k s i a + p ä i v ä h o i d o l l a + p ä i v ä h o i d o n + p ä i v ä h o i d o s t a + p ä i v ä h o i t a j i a + p ä i v ä h o i t o + p ä i v ä h o i t o a + p ä i v ä h o i t o j ä r j e s t e l m ä n + p ä i v ä h o i t o m a k s u j e n + p ä i v ä h o i t o o n + p ä i v ä h o i t o p a i k a t + p ä i v ä h o i t o p a i k k a + p ä i v ä h o i t o p a i k k o j a + p ä i v ä h o i t o p a i k k o j e n + p ä i v ä h o i t o p a l v e l u i d e n + p ä i v ä h o i t o p a l v e l u i s s a + p ä i v ä h o i t o p a l v e l u i s t a + p ä i v ä h o i t o p a l v e l u j a + p ä i v ä h o i t o p a l v e l u j e n + p ä i v ä h o i t o p a l v e l u t + p ä i v ä h o i t o t i l a n n e + p ä i v ä i s t u n n o i s t a + p ä i v ä j ä r j e s t y k s e e n + p ä i v ä j ä r j e s t y s + p ä i v ä k a t s a u s + p ä i v ä k a u p p a + p ä i v ä k a u s i a + p ä i v ä k a u s i k s i + p ä i v ä k e s k u k s i a + p ä i v ä k o d e i s t a + p ä i v ä k o d i s s a + p ä i v ä k o d i t + p ä i v ä k o h t a i n e n + p ä i v ä k o h t a i s i l l e + p ä i v ä k o t e i h i n + p ä i v ä k o t e j a + p ä i v ä k o t i e n + p ä i v ä k o t i i n + p ä i v ä k o t i p a i k o i s t a + p ä i v ä k s i + p ä i v ä k ä v i j ö i t ä + p ä i v ä k ä y n n i t + p ä i v ä k ä y n t e i h i n + p ä i v ä k ä y n t e j ä + p ä i v ä l e h d e n + p ä i v ä l e h d e s s ä + p ä i v ä l e h d e s t ä + p ä i v ä l e h d e t + p ä i v ä l e h t i + p ä i v ä l e h t i e n + p ä i v ä l e h t i i n + p ä i v ä l e h t i ä + p ä i v ä l e p o o n + p ä i v ä l l e + p ä i v ä l l i s i l l ä + p ä i v ä l l i s p ö y d ä s s ä + p ä i v ä l l i s p ö y t ä ä n + p ä i v ä l l i s t a u k o a + p ä i v ä l t ä + p ä i v ä m m e + p ä i v ä m ä ä r i e n + p ä i v ä m ä ä r i i n + p ä i v ä m ä ä r i s t ä + p ä i v ä m ä ä r i ä + p ä i v ä m ä ä r ä + p ä i v ä m ä ä r ä h a a s t e e s e e n + p ä i v ä m ä ä r ä n + p ä i v ä m ä ä r ä p e r u s t e i s t a + p ä i v ä m ä ä r ä r a j a + p ä i v ä m ä ä r ä s t ä + p ä i v ä m ä ä r ä t + p ä i v ä m ä ä r ä ä + p ä i v ä m ä ä r ä ä n + p ä i v ä n + p ä i v ä n k a k k a r a + p ä i v ä n n o u t o + p ä i v ä n p o l i i t t i s e l l e + p ä i v ä n p o l i i t t i s i s t a + p ä i v ä n p o l i t i i k a n + p ä i v ä n p o l i t i i k a s s a + p ä i v ä n p o l i t i i k k a a + p ä i v ä n p o l i t i i k k a a n + p ä i v ä n p o l t t a v a + p ä i v ä n p o l t t a v a a + p ä i v ä n p o l t t a v a a n + p ä i v ä n p o l t t a v a t + p ä i v ä n p o l t t a v i e n + p ä i v ä n s e l v i ä + p ä i v ä n s e l v ä + p ä i v ä n s e l v ä k s i + p ä i v ä n s e l v ä n + p ä i v ä n s e l v ä n ä + p ä i v ä n s e l v ä t + p ä i v ä n s e l v ä ä + p ä i v ä n s i l m ä + p ä i v ä n s i n i + p ä i v ä n v a l o + p ä i v ä n v a l o o n + p ä i v ä n v a l o s s a + p ä i v ä n ä + p ä i v ä n ä k i n + p ä i v ä p a l k a s t a + p ä i v ä p a l k k a + p ä i v ä p a l k k a a + p ä i v ä p a l k k a n s a + p ä i v ä p e r h o + p ä i v ä p u l k k a + p ä i v ä p u r s i + p ä i v ä r a h a + p ä i v ä r a h a a + p ä i v ä r a h a a n + p ä i v ä r a h a j ä r j e s t e l m ä ä + p ä i v ä r a h a n + p ä i v ä r a h a n n e + p ä i v ä r a h a s t a + p ä i v ä r a h a s t a n i + p ä i v ä r a h a t + p ä i v ä r a h o i h i n + p ä i v ä r a h o i s s a + p ä i v ä r a h o j a + p ä i v ä r a h o j e n + p ä i v ä r a j o i t u k s i a + p ä i v ä s a a n n i n + p ä i v ä s a a n n i s t a + p ä i v ä s a a n t i + p ä i v ä s a k k o + p ä i v ä s a k k o j e n + p ä i v ä s a k k o j ä r j e s t e l m ä n + p ä i v ä s s ä + p ä i v ä s t ä + p ä i v ä t + p ä i v ä t t y + p ä i v ä t y ö n i + p ä i v ä t y ö s t ä + p ä i v ä u n t a + p ä i v ä v i e r a i l u j a + p ä i v ä v i e r a i l u j e n + p ä i v ä y k s e s t ä + p ä i v ä ä k ä ä n + p ä i v ä ä n + p ä l v i p e r h o k a l a + p ä r e k a t t o + p ä r i n ä k i u r u + p ä r j ä t ä + p ä r j ä t ä k s e e n + p ä r j ä ä m i s e e n + p ä r j ä ä v ä t + p ä t e e + p ä t e m ä t t ö m i k s i + p ä t e m ä t t ö m y y s s a n k t i o t a + p ä t e m ä t t ö m ä k s i + p ä t e v i e n + p ä t e v i k s i + p ä t e v i m m ä l l e + p ä t e v i m m ä t + p ä t e v i m p i e n + p ä t e v i m p i ä + p ä t e v i n + p ä t e v i n t ä + p ä t e v i s t ä + p ä t e v i ä + p ä t e v y y d e l l e + p ä t e v y y d e n + p ä t e v y y d e s t ä + p ä t e v y y d e s t ä ä n + p ä t e v y y k s i ä + p ä t e v y y s a l u e e n + p ä t e v y y s e r o j e n + p ä t e v y y s k i r j a j ä r j e s t e l m i ä + p ä t e v y y s k i r j a n o r m i e n + p ä t e v y y s k i r j a p e t o k s i a + p ä t e v y y s k i r j a p e t o s t e n + p ä t e v y y s k i r j o i l t a + p ä t e v y y s k i r j o j e n + p ä t e v y y s k o e t t a + p ä t e v y y s k o k e e n + p ä t e v y y s k r i t e e r i t + p ä t e v y y s s t a n d a r d e j a + p ä t e v y y s t a s o + p ä t e v y y s t a s o a + p ä t e v y y s t a s o i s s a + p ä t e v y y s t a s o l l a + p ä t e v y y s t a s o m m e + p ä t e v y y s t a s o n + p ä t e v y y s t o d i s t u k s i l l e + p ä t e v y y s t o d i s t u s + p ä t e v y y s t o d i s t u s t e n + p ä t e v y y s v a a t i m u k s e t + p ä t e v y y s v a a t i m u k s i a + p ä t e v y y s v a r a n t o j a + p ä t e v y y t e n s ä + p ä t e v y y t t ä + p ä t e v ä l l e + p ä t e v ä m m i k s i + p ä t e v ä m m i n + p ä t e v ä m m ä l t ä + p ä t e v ä m m ä n + p ä t e v ä m m ä t + p ä t e v ä m p i + p ä t e v ä m p i ä + p ä t e v ä m p ä ä + p ä t e v ä n + p ä t e v ä s s ä + p ä t e v ä s t ä + p ä t e v ä t + p ä t e v ä ä + p ä t e v ö i t t ä m i s p r o s e s s i n + p ä t e v ö i t y m i s e e n + p ä t e v ö i t y m i s e n + p ä t e v ö i t y m i s j ä r j e s t e l m i e n + p ä t e v ö i t y m i s o h j e l m i n + p ä t e v ö i t y m ä ä n + p ä t e v ö i t y n e i d e n + p ä t k ä t y ö j ä r j e s t e l y i s t ä + p ä t k ä t y ö t + p ä ä a g g r e g a a t t i e n + p ä ä a i h e + p ä ä a i h e e k s i + p ä ä a i h e e n + p ä ä a i h e e n a + p ä ä a i h e e s e e m m e + p ä ä a i h e e s e e n + p ä ä a i h e i d e n + p ä ä a i h e i n a + p ä ä a i h e i s i i n + p ä ä a i h e i s t a + p ä ä a i h e i t a + p ä ä a i h e t t a + p ä ä a i h e u t t a j a + p ä ä a i h e u t t a j a a n + p ä ä a i h e u t t a j a n a + p ä ä a i h e u t t a j i a + p ä ä a i h e u t t a j i s t a + p ä ä a i n e k s i s t a + p ä ä a j a t u k s e e n + p ä ä a j a t u k s e m m e + p ä ä a j a t u k s e n + p ä ä a j a t u k s e n a + p ä ä a j a t u k s e s t a + p ä ä a j a t u k s e t + p ä ä a j a t u k s i a + p ä ä a j a t u k s i i n + p ä ä a j a t u k s i s t a + p ä ä a j a t u k s i s t a m m e + p ä ä a j a t u s + p ä ä a j a t u s t a + p ä ä a k s e l i h a j o t e l m a + p ä ä a l a a + p ä ä a l a a n + p ä ä a l a l l e + p ä ä a l k u u n p a n i j a n + p ä ä a l o i t t e e s t a + p ä ä a l o j a + p ä ä a l u e e k s i + p ä ä a l u e e l l a + p ä ä a l u e e l l e + p ä ä a l u e e s e e n + p ä ä a l u e e s s a + p ä ä a l u e e t + p ä ä a l u e i d e n + p ä ä a l u e i l l a + p ä ä a l u e t t a + p ä ä a l u s t u k s e n + p ä ä a m m a t t i j ä r j e s t ö t + p ä ä a r g u m e n t e i s t a + p ä ä a r g u m e n t t i + p ä ä a r g u m e n t t i n a + p ä ä a r g u m e n t t i n i + p ä ä a r k k i t e h t i n a + p ä ä a s e t a r k a s t a j a + p ä ä a s e t u k s e n + p ä ä a s i a + p ä ä a s i a a + p ä ä a s i a a n + p ä ä a s i a k k a i l l e m m e + p ä ä a s i a k k a i t a + p ä ä a s i a l l i n e n + p ä ä a s i a l l i s e e n + p ä ä a s i a l l i s e k s i + p ä ä a s i a l l i s e n a + p ä ä a s i a l l i s e s s a + p ä ä a s i a l l i s e s t a + p ä ä a s i a l l i s e s t i + p ä ä a s i a l l i s e t + p ä ä a s i a l l i s i a + p ä ä a s i a l l i s i i n + p ä ä a s i a l l i s i l l a + p ä ä a s i a l l i s i n a + p ä ä a s i a l l i s t e n + p ä ä a s i a n + p ä ä a s i a n a + p ä ä a s i a n a j a j a n + p ä ä a s i a n i + p ä ä a s i a n o s a i n e n + p ä ä a s i a n t u n t i j a m m e + p ä ä a s i a s t a + p ä ä a s i a t + p ä ä a s i o i d e n + p ä ä a s i o i h i n + p ä ä a s i o i l l e + p ä ä a s i o i s s a + p ä ä a s i o i s t a + p ä ä a s i o i t a + p ä ä a s u t u s k e s k u s t e n + p ä ä a u k i o + p ä ä a v u s t a j a n i + p ä ä b u d j e t t i k o h t i i n + p ä ä d y i m m e + p ä ä d y i n + p ä ä d y m m e k ö + p ä ä d y n + p ä ä d y t t i i n + p ä ä d y t ä ä n + p ä ä e d u n s a a j i e n + p ä ä e d u s t a j a + p ä ä e d u s t a j a n + p ä ä e d u s t a j i e n + p ä ä e h d o k k a i n a + p ä ä e h d o k k a i s t a + p ä ä e h d o t u k s e e n + p ä ä e h d o t u k s e n + p ä ä e h d o t u k s e s t a + p ä ä e h d o t u k s i a + p ä ä e h d o t u s + p ä ä e h d o t u s t a + p ä ä e h t o + p ä ä e k o n o m i s t i + p ä ä e k o n o m i s t i n + p ä ä e l e m e n t i t + p ä ä e l e m e n t t i ä + p ä ä e l i n k e i n o + p ä ä e l i n k e i n o n s a + p ä ä e l i n t a r v i k k e i d e n s a + p ä ä e l ä i n l ä ä k ä r i e n + p ä ä e n e r g i a v e r k k o a + p ä ä e p ä i l t y + p ä ä e p ä i l t y ä + p ä ä e r o + p ä ä e s i t t e l i j ä + p ä ä e s i t t e l i j ä k s i + p ä ä e s i t t e l i j ä l l e + p ä ä e s i t t e l i j ä l t ä + p ä ä e s i t t e l i j ä n + p ä ä e s i t t e l i j ä n ä + p ä ä e s i t t e l i j ä t + p ä ä e s i t t e l i j ä ä + p ä ä e s i t t e l i j ö i t ä + p ä ä f o o r u m i + p ä ä h a a r a a + p ä ä h a a s t e e m m e + p ä ä h a a s t e e s s a + p ä ä h a a s t e i k s i + p ä ä h a a s t e t t a + p ä ä h a l l i n t o j e n + p ä ä h a n k e + p ä ä h a n k k e i s t a + p ä ä h a n k k i j a l l e + p ä ä h a n k k i j a n + p ä ä h a n k k i j a s t a + p ä ä h a r j a n t e e n + p ä ä h e i m o a + p ä ä h e n k i l ö + p ä ä h e n k i l ö n + p ä ä h i s s e i h i n + p ä ä h i s s e j ä + p ä ä h u o l e m m e + p ä ä h u o l e n a i h e + p ä ä h u o l e n a i h e e m m e + p ä ä h u o l e n a i h e e n + p ä ä h u o l e n a i h e e n a + p ä ä h u o l e n a i h e e n n e + p ä ä h u o l e n a i h e e s e e n + p ä ä h u o l e n a i h e e t + p ä ä h u o l e n a i h e i k s e m m e + p ä ä h u o l e n a i h e i n a + p ä ä h u o l e n a i h e i s t a + p ä ä h u o l e n a i h e i t a + p ä ä h u o l e n a i h e i t a m m e + p ä ä h u o l e n a i h e i t a n i + p ä ä h u o l e n a i h e t t a + p ä ä h u o l e n i + p ä ä h u o l i a + p ä ä h u o l t a + p ä ä h u o m a u t u k s e n i + p ä ä h u o m i o + p ä ä h u o m i o n + p ä ä h u o m i o o n + p ä ä h u o m i o t a + p ä ä h y ö t y j ä + p ä ä h ä n p i n t t y m i ä + p ä ä i d e o l o g i a + p ä ä i l m a i s i n t a + p ä ä i n s t r u m e n t t i + p ä ä i n t r e s s i e n + p ä ä i s k u l a u s e e k s i + p ä ä i s t u n t o p a i k k a + p ä ä j a l k a i s i a + p ä ä j a l k a i s i i n + p ä ä j a l k a i s t e n + p ä ä j a o s t o n i + p ä ä j o h t a j a + p ä ä j o h t a j a a + p ä ä j o h t a j a a n + p ä ä j o h t a j a e h d o k k a a t + p ä ä j o h t a j a e h d o k k a i t a + p ä ä j o h t a j a l l a + p ä ä j o h t a j a l l a a n + p ä ä j o h t a j a l l e + p ä ä j o h t a j a l l e n n e + p ä ä j o h t a j a m m e + p ä ä j o h t a j a n + p ä ä j o h t a j a n a + p ä ä j o h t a j a n i + p ä ä j o h t a j a n s a + p ä ä j o h t a j a t + p ä ä j o h t a j i a + p ä ä j o h t a j i e n + p ä ä j o h t a j i l l a + p ä ä j o h t a j i l l e + p ä ä j o h t a j i s t a + p ä ä j o k i + p ä ä j ä r j e s t e l m ä n + p ä ä j ä r v i + p ä ä k a a s u v e r k k o o n + p ä ä k a d u i l l a + p ä ä k a d u l l a + p ä ä k a d u n + p ä ä k a d u t + p ä ä k a l l o k i i t ä j ä + p ä ä k a l l o p r i k a a t i + p ä ä k a n a v i l l a + p ä ä k a n a v i s t a + p ä ä k a n n a t t a j i a + p ä ä k a t e g o r i o i h i n + p ä ä k a u d e n + p ä ä k a u p p a k u m p p a n e i d e n + p ä ä k a u p p a k u m p p a n e i l l a m m e + p ä ä k a u p p a k u m p p a n i m m e + p ä ä k a u p u n g e i s s a + p ä ä k a u p u n g e i s s a m m e + p ä ä k a u p u n g e i s t a + p ä ä k a u p u n g e i s t a m m e + p ä ä k a u p u n g i l l e + p ä ä k a u p u n g i n + p ä ä k a u p u n g i s s a + p ä ä k a u p u n g i s s a m m e + p ä ä k a u p u n g i s t a + p ä ä k a u p u n g i t + p ä ä k a u p u n k e i h i n + p ä ä k a u p u n k e i h i n s a + p ä ä k a u p u n k e j a + p ä ä k a u p u n k i + p ä ä k a u p u n k i a + p ä ä k a u p u n k i a l u e + p ä ä k a u p u n k i a l u e i t a + p ä ä k a u p u n k i e m m e + p ä ä k a u p u n k i e n + p ä ä k a u p u n k i i n + p ä ä k a u p u n k i k i e r r o k s e l l a n i + p ä ä k a u p u n k i k i e r r o k s e n + p ä ä k a u p u n k i m m e + p ä ä k a u p u n k i n n e + p ä ä k a u p u n k i s e u d u l l a + p ä ä k a u p u n k i t e r r i t o r i o + p ä ä k e h y k s e l t ä + p ä ä k e i n o + p ä ä k e s k u k s i s s a + p ä ä k e s k u s t e l u m m e + p ä ä k e s k u s t e l u s s a + p ä ä k i e l e e n + p ä ä k i e l e n + p ä ä k i e l i l l ä + p ä ä k i e l i s t ä + p ä ä k i e l i ä + p ä ä k i e l t e n + p ä ä k i l p a i l i j a a m m e + p ä ä k i l p a i l i j a m m e + p ä ä k i l p a i l i j a n + p ä ä k i l p a i l i j o i d e m m e + p ä ä k i l p a i l i j o i d e n s a + p ä ä k i l p a i l i j o i h i n s a + p ä ä k i r j a n p i t ä j i e n + p ä ä k i r j a n p i t ä j ä + p ä ä k i r j a n p i t ä j ä m m e + p ä ä k i r j a n p i t ä j ä n + p ä ä k i r j a s t o + p ä ä k o h d a l l e + p ä ä k o h d a s s a + p ä ä k o h d a s t a + p ä ä k o h d a t + p ä ä k o h d e + p ä ä k o h d e r y h m ä + p ä ä k o h d i k s i + p ä ä k o h d i l t a a n + p ä ä k o h d i s s a + p ä ä k o h d i s t a + p ä ä k o h t a + p ä ä k o h t a a + p ä ä k o h t a a n + p ä ä k o h t a n a + p ä ä k o h t e e n a + p ä ä k o h t e i t a + p ä ä k o h t i a + p ä ä k o h t i e n + p ä ä k o h t i i n + p ä ä k o h t i n a + p ä ä k o k i s t a + p ä ä k o k o u k s e s s a + p ä ä k o m i s s a a r i n + p ä ä k o m p o n e n t t i a n a l y y s i + p ä ä k o n f e r e n s s i + p ä ä k o n f l i k t i + p ä ä k o n s u l i n + p ä ä k o n t t o r e i d e n + p ä ä k o n t t o r i + p ä ä k o n t t o r i a + p ä ä k o n t t o r i e n + p ä ä k o n t t o r i n + p ä ä k o o r d i n a a t t o r i n a + p ä ä k r i t e e r i + p ä ä k r i t e e r i i n + p ä ä k r i t e e r i n s ä + p ä ä k r i t e e r i n ä + p ä ä k r i t i i k k i n i + p ä ä k u l j e t u s r e i t t i e n + p ä ä k u m p p a n e i s t a + p ä ä k u m p p a n e i t a + p ä ä k u t s u m u k s e n + p ä ä k v a n t t i l u k u + p ä ä k y s y m y k s e e n + p ä ä k y s y m y k s e n + p ä ä k y s y m y k s e n i + p ä ä k y s y m y k s e n ä + p ä ä k y s y m y k s e s s ä + p ä ä k y s y m y k s e s t ä + p ä ä k y s y m y k s e t + p ä ä k y s y m y k s i i n + p ä ä k y s y m y k s i s t ä + p ä ä k y s y m y k s i ä + p ä ä k y s y m y s + p ä ä k y s y m y s t ä + p ä ä k ä s i t t e l y s s ä + p ä ä k ä y t t ä j i e n + p ä ä k ä y t t ä j ä + p ä ä l a a t i j a + p ä ä l a e l l a a n + p ä ä l a e l l e e n + p ä ä l a h j o i t t a j a + p ä ä l a i n a n a n t a j a l l a + p ä ä l a i v a s t o j a + p ä ä l a k i l o h k o + p ä ä l e n t o a s e m a + p ä ä l e n t o k e n t t i e n + p ä ä l i i k e n n e v ä y l i e n + p ä ä l i i t t o l a i n e n + p ä ä l i i t t o l a i s e m m e + p ä ä l i i t t o l a i s e t + p ä ä l i i t t o l a i s i a m m e + p ä ä l i n j a + p ä ä l i n j a a + p ä ä l i n j a t + p ä ä l i n j a u k s e n + p ä ä l i n j a u k s e t + p ä ä l i n j a u k s i a + p ä ä l i n j a u k s i i n + p ä ä l i n j o i h i n + p ä ä l i n j o i l t a a n + p ä ä l i n j o i s s a + p ä ä l i n j o i s t a + p ä ä l i n j o j a + p ä ä l i n j o j e n + p ä ä l l e k k ä i s i i n + p ä ä l l e k k ä i s i ä + p ä ä l l e k k ä i s k ä y t t ö ä + p ä ä l l e k k ä i s r a k e n t e e t + p ä ä l l e k k ä i s r a k e n t e i s t a + p ä ä l l e k k ä i s s ä ä n t e l y ä + p ä ä l l e k k ä i s t e n + p ä ä l l e k k ä i s t y ö t ä + p ä ä l l e k k ä i s t ä + p ä ä l l e k k ä i s v a l o t u s + p ä ä l l e k k ä i s y y d e l t ä + p ä ä l l e k k ä i s y y d e n + p ä ä l l e k k ä i s y y d e t + p ä ä l l e k k ä i s y y k s i e n + p ä ä l l e k k ä i s y y k s i i n + p ä ä l l e k k ä i s y y k s i l t ä + p ä ä l l e k k ä i s y y k s i s t ä + p ä ä l l e k k ä i s y y k s i ä + p ä ä l l e k k ä i s y y s o n g e l m a + p ä ä l l e k k ä i s y y s o n g e l m a n + p ä ä l l e k k ä i s y y t t ä + p ä ä l l e k ä y v i m m i s t ä + p ä ä l l i k k ö t a s o n + p ä ä l l i k ö i d e n + p ä ä l l i k ö n + p ä ä l l y s m e r k i n n ö i s s ä + p ä ä l l y s m e r k i n n ö i s t ä + p ä ä l l y s m e r k i n t ö j ä + p ä ä l l y s t e e n ä + p ä ä l u k u k o h t a i s i l l a + p ä ä l u o k a n + p ä ä l u o k k a + p ä ä l u o k k a a n + p ä ä l u o k k i a + p ä ä l u o k k i e n + p ä ä l u o k k i i n + p ä ä l ä h d e + p ä ä l ä h t e e n ä + p ä ä l ä v i s t ä j ä + p ä ä m a a h a n t u o j a + p ä ä m a a h a n t u o j a n + p ä ä m a j a + p ä ä m a j a a n + p ä ä m a j a n + p ä ä m a j a t a s o l l a + p ä ä m a j o i s t a + p ä ä m a j o i t u s m e s t a r i + p ä ä m a k s a j i a + p ä ä m a r k k i n a + p ä ä m a r k k i n o i h i n + p ä ä m i e h e k s i + p ä ä m i e h e l l e + p ä ä m i e h e n ä + p ä ä m i e h e t + p ä ä m i e h i e n + p ä ä m i e h i l l e + p ä ä m i e h i ä + p ä ä m i e s + p ä ä m i e s t a p a a m i n e n + p ä ä m i e s t a p a a m i s e n + p ä ä m i e s t e n + p ä ä m i e s t ä + p ä ä m i e t i n t ö + p ä ä m i e t i n t ö ö n + p ä ä m i n i s t e r e i d e n + p ä ä m i n i s t e r e i h i n + p ä ä m i n i s t e r e i l l e + p ä ä m i n i s t e r e i l l ä + p ä ä m i n i s t e r e i l t ä + p ä ä m i n i s t e r e i s t ä + p ä ä m i n i s t e r e i t ä + p ä ä m i n i s t e r e j ä + p ä ä m i n i s t e r i + p ä ä m i n i s t e r i e h d o k a s + p ä ä m i n i s t e r i e h d o k k a a n + p ä ä m i n i s t e r i e h d o k k a a n a + p ä ä m i n i s t e r i e n + p ä ä m i n i s t e r i e n s ä + p ä ä m i n i s t e r i i m m e + p ä ä m i n i s t e r i i n + p ä ä m i n i s t e r i k a u d e l l a + p ä ä m i n i s t e r i k a u d e l l a a n + p ä ä m i n i s t e r i k i n + p ä ä m i n i s t e r i k s i + p ä ä m i n i s t e r i l l e + p ä ä m i n i s t e r i l l e e n + p ä ä m i n i s t e r i l l e m m e + p ä ä m i n i s t e r i l l e n n e + p ä ä m i n i s t e r i l l ä + p ä ä m i n i s t e r i l t ä + p ä ä m i n i s t e r i m m e + p ä ä m i n i s t e r i n + p ä ä m i n i s t e r i n i + p ä ä m i n i s t e r i n n e + p ä ä m i n i s t e r i n s ä + p ä ä m i n i s t e r i n ä + p ä ä m i n i s t e r i n ä m m e + p ä ä m i n i s t e r i s t ä + p ä ä m i n i s t e r i t + p ä ä m i n i s t e r i t a s o l l a + p ä ä m i n i s t e r i ä + p ä ä m i n i s t e r i ä m m e + p ä ä m i n i s t e r i ä ä n + p ä ä m i n i s t e r i ö s s ä + p ä ä m m e + p ä ä m o o t t o r i + p ä ä m o t i v a a t i o + p ä ä m u o t o + p ä ä m u u t o s t a + p ä ä m ä ä r i e n + p ä ä m ä ä r i i n + p ä ä m ä ä r i l t ä ä n + p ä ä m ä ä r i s s ä + p ä ä m ä ä r i s t ä m m e + p ä ä m ä ä r i s t ä n i + p ä ä m ä ä r i s t ä ä n + p ä ä m ä ä r i ä + p ä ä m ä ä r i ä m m e + p ä ä m ä ä r ä + p ä ä m ä ä r ä a s e t t e l u n + p ä ä m ä ä r ä h a k u i s e s t i + p ä ä m ä ä r ä k s i + p ä ä m ä ä r ä m a a s s a + p ä ä m ä ä r ä m m e + p ä ä m ä ä r ä n + p ä ä m ä ä r ä n ä + p ä ä m ä ä r ä n ä m m e + p ä ä m ä ä r ä n ä n i + p ä ä m ä ä r ä n ä ä n + p ä ä m ä ä r ä s i d o n n a i s t a + p ä ä m ä ä r ä s t ä + p ä ä m ä ä r ä s t ä ä n + p ä ä m ä ä r ä t + p ä ä m ä ä r ä t i e t o i s e t + p ä ä m ä ä r ä ä + p ä ä m ä ä r ä ä m m e + p ä ä m ä ä r ä ä n + p ä ä n + p ä ä n e u v o n a n t a j a + p ä ä n e u v o t t e l i j a + p ä ä n e u v o t t e l i j a l l e + p ä ä n e u v o t t e l i j a l l e m m e + p ä ä n e u v o t t e l i j a m m e + p ä ä n e u v o t t e l i j a n + p ä ä n e u v o t t e l i j a n a + p ä ä n e u v o t t e l i j a t + p ä ä n e u v o t t e l u a l o i l l a + p ä ä n n y ö k k ä y k s i ä + p ä ä n n y ö k k ä ä j ä l i h a s + p ä ä n s ä + p ä ä n s ä r k y t a b l e t i s t a + p ä ä n v a i v a a + p ä ä n v a l t i m o + p ä ä n ä k e m y k s i ä m m e + p ä ä n ä k ö k o h d i s t a + p ä ä n ä k ö k o h t a a + p ä ä n ä k ö k o h t i e n + p ä ä n ä k ö k u l m a a + p ä ä o h j e l m a a + p ä ä o h j e l m i e n + p ä ä o h j e l m i i n + p ä ä o h j e l m i s s a + p ä ä o i k e u t u s + p ä ä o l e t t a m u k s e e n + p ä ä o m a + p ä ä o m a a + p ä ä o m a a n + p ä ä o m a e d u i s t a + p ä ä o m a e r o t + p ä ä o m a e t u j a + p ä ä o m a e t u j a a n + p ä ä o m a e t u p i i r i e n + p ä ä o m a h y ö d y k k e i l l ä + p ä ä o m a h y ö d y k k e i t ä + p ä ä o m a i n s t r u m e n t i t + p ä ä o m a i n v e s t o i n n e i l l e + p ä ä o m a i n v e s t o i n n i t + p ä ä o m a i n v e s t o i n t e i h i n + p ä ä o m a i n v e s t o i n t e j a + p ä ä o m a i n v e s t o i n t i e n + p ä ä o m a j ä r j e s t e l m ä + p ä ä o m a j ä r j e s t e l m ä ä + p ä ä o m a k a a n + p ä ä o m a k a t o + p ä ä o m a k e h y k s e n + p ä ä o m a k e h y s + p ä ä o m a k e i n o t t e l i j o i d e n + p ä ä o m a k e i n o t t e l u a + p ä ä o m a k e s k i t t y m i e n + p ä ä o m a k e s k i t t y m ä t + p ä ä o m a k r i i s i n + p ä ä o m a k r i i s i s t ä + p ä ä o m a k u s t a n n u k s e n + p ä ä o m a k u s t a n n u k s e t + p ä ä o m a k u s t a n n u k s i a + p ä ä o m a k u s t a n n u k s i i n + p ä ä o m a k u s t a n n u s t e n + p ä ä o m a k y s y n n ä n + p ä ä o m a l a i n a + p ä ä o m a l a i n o j a + p ä ä o m a l a i n o j e n + p ä ä o m a l i i k e n t e e n + p ä ä o m a l i i k e n t e e s e e n + p ä ä o m a l i i k k e e t + p ä ä o m a l i i k k e i d e n + p ä ä o m a l i i k k e i l l e + p ä ä o m a l i i k k e i s i i n + p ä ä o m a l i i k k e i t ä + p ä ä o m a l l e + p ä ä o m a l o g i i k k a a + p ä ä o m a l ä h t e e n ä + p ä ä o m a m a k s u j a + p ä ä o m a m a k s u t + p ä ä o m a m a r k k i n a r i s k i + p ä ä o m a m a r k k i n a t + p ä ä o m a m a r k k i n a u u d i s t u s t a + p ä ä o m a m a r k k i n a v o i m i e n + p ä ä o m a m a r k k i n a v ä l i n e i d e n + p ä ä o m a m a r k k i n o i d e m m e + p ä ä o m a m a r k k i n o i d e n + p ä ä o m a m a r k k i n o i h i n + p ä ä o m a m a r k k i n o i l l a + p ä ä o m a m a r k k i n o i l l e + p ä ä o m a m a r k k i n o i l l e m m e + p ä ä o m a m a r k k i n o i l t a + p ä ä o m a m a r k k i n o i s s a + p ä ä o m a m a r k k i n o i s t a + p ä ä o m a m a r k k i n o i s t a m m e + p ä ä o m a m a r k k i n o i t a + p ä ä o m a m e n o i s t a + p ä ä o m a m e n o t + p ä ä o m a m o n o p o l i t + p ä ä o m a m ä ä r i ä + p ä ä o m a n + p ä ä o m a n h a n k i n t a k u s t a n n u k s i a + p ä ä o m a n k a u p a n + p ä ä o m a n k e r u u s e e n + p ä ä o m a n l i i k k e e t + p ä ä o m a n l i i k k e i d e n + p ä ä o m a n l i i k k e i l l e + p ä ä o m a n l i i k k e i s i i n + p ä ä o m a n l i i k k e i s s ä + p ä ä o m a n l i i k k e i s t ä + p ä ä o m a n l i i k k e i t ä + p ä ä o m a n l i s ä y s t e n + p ä ä o m a n l i s ä y s t ä + p ä ä o m a n m u o d o s t u k s e n + p ä ä o m a n m u o d o s t u s + p ä ä o m a n m u o d o s t u s k y k y ä + p ä ä o m a n o m i s t a j a t + p ä ä o m a n s i i r r o t + p ä ä o m a n s i i r t o v e r o n + p ä ä o m a n s i i r t o v e r o s t a + p ä ä o m a n v a i h t o a + p ä ä o m a o h j e l m a n + p ä ä o m a o s a k k u u k s i i n + p ä ä o m a o s a k k u u s + p ä ä o m a o s a l l i s u u d e s t a + p ä ä o m a o s u u d e t + p ä ä o m a o s u u k s i e n + p ä ä o m a o s u u t t a + p ä ä o m a p a k o + p ä ä o m a p a k o a + p ä ä o m a p a k o o n + p ä ä o m a p a n o k s e l l a + p ä ä o m a p a n o k s i s t a + p ä ä o m a p a o n + p ä ä o m a p a o s t a + p ä ä o m a p o h j a + p ä ä o m a p o h j a a + p ä ä o m a p o h j a a n + p ä ä o m a p o h j a n + p ä ä o m a p o l i t i i k k a a n s a + p ä ä o m a p u l a s t a + p ä ä o m a p u o l u e i d e n + p ä ä o m a p u o l u e i t a + p ä ä o m a p u s k u r e i t a + p ä ä o m a p u s k u r i i n + p ä ä o m a r a h a s t o + p ä ä o m a r a h a s t o a l a l l e + p ä ä o m a r a h a s t o i h i n + p ä ä o m a r a h a s t o i s t a + p ä ä o m a r a h a s t o j a + p ä ä o m a r a h a s t o j e n + p ä ä o m a r a h a s t o t + p ä ä o m a r a h a s t o t o i m i n t a a + p ä ä o m a r a h o i t t e i s i a + p ä ä o m a r a h o i t t e i s i l l a + p ä ä o m a r a h o i t t e i s t e n + p ä ä o m a r a h o i t u k s e e n + p ä ä o m a r a h o i t u k s e n + p ä ä o m a r a h o i t u s + p ä ä o m a r a h o i t u s t a + p ä ä o m a r a j o i t u k s i e n + p ä ä o m a r a k e n n e t t a + p ä ä o m a r a k e n t e i n a + p ä ä o m a r u i s k e e t + p ä ä o m a s a a t a v i s t a + p ä ä o m a s e k t o r e i l l e + p ä ä o m a s e k t o r i l l e + p ä ä o m a s i i r r o i l l e + p ä ä o m a s i i r t o j a + p ä ä o m a s i i r t o j e n + p ä ä o m a s i j o i t t a j i a + p ä ä o m a s i j o i t t a m i s e n + p ä ä o m a s i j o i t t a m i s e s t a + p ä ä o m a s i j o i t t a m i s t a + p ä ä o m a s i j o i t u k s e n + p ä ä o m a s i j o i t u k s e n s a + p ä ä o m a s i j o i t u k s e t + p ä ä o m a s i j o i t u k s i a + p ä ä o m a s i j o i t u k s i l l e + p ä ä o m a s i j o i t u s j ä r j e s t e l m i ä + p ä ä o m a s i j o i t u s m a r k k i n o i l l a + p ä ä o m a s i j o i t u s r a h a s t o i h i n + p ä ä o m a s i j o i t u s r a h a s t o j a + p ä ä o m a s i j o i t u s r a h a s t o j e n + p ä ä o m a s i j o i t u s t e n + p ä ä o m a s i j o i t u s y h t i ö i d e n + p ä ä o m a s i j o i t u s y h t i ö i s t ä + p ä ä o m a s i j o i t u s y h t i ö i t ä + p ä ä o m a s t a + p ä ä o m a s u h t e e s e e n + p ä ä o m a s ä ä n t ö j ä + p ä ä o m a s ä ä s t ö i h i n + p ä ä o m a s ä ä s t ö j ä + p ä ä o m a t + p ä ä o m a t a k u i t a + p ä ä o m a t a l o u s a r v i o o n + p ä ä o m a t a p p i o t a + p ä ä o m a t a r j o n n a n + p ä ä o m a t a r p e i t a + p ä ä o m a t a v a r a + p ä ä o m a t e k i j ö i d e n + p ä ä o m a t o i m e t + p ä ä o m a t r a n s a k t i o i h i n k i n + p ä ä o m a t u e n + p ä ä o m a t u l o + p ä ä o m a t u l o i h i n + p ä ä o m a t u l o i l l e + p ä ä o m a t u l o j a + p ä ä o m a t u l o j e n + p ä ä o m a t u l o n + p ä ä o m a t u l o s t a + p ä ä o m a t u l o t + p ä ä o m a t u l o v e r o j e n + p ä ä o m a t u l o v e r o n + p ä ä o m a t u l o v e r o t u s t a + p ä ä o m a t u o t o t + p ä ä o m a t u o t t e i l l a + p ä ä o m a t u o t t o i s e t + p ä ä o m a t u o t t o j a + p ä ä o m a v a a d e t t a + p ä ä o m a v a a t i m u k s e n + p ä ä o m a v a a t i m u k s e t + p ä ä o m a v a a t i m u k s i a + p ä ä o m a v a a t i m u k s i e n + p ä ä o m a v a a t i m u k s i i n + p ä ä o m a v a a t i m u k s i s s a + p ä ä o m a v a a t i m u k s i s t a + p ä ä o m a v a a t i m u s d i r e k t i i v i i n + p ä ä o m a v a a t i m u s d i r e k t i i v i n + p ä ä o m a v a a t i m u s d i r e k t i i v i ä + p ä ä o m a v a a t i m u s t a + p ä ä o m a v a a t i m u s t e n + p ä ä o m a v a j e e n + p ä ä o m a v a l t a i s i a + p ä ä o m a v a l t a i s i i n + p ä ä o m a v a l t a i s i m m a s t a + p ä ä o m a v a l t a i s t a + p ä ä o m a v a l t a i s t e n + p ä ä o m a v a l v o n t a a + p ä ä o m a v a r a l l i s u u s + p ä ä o m a v a r a t + p ä ä o m a v a r o j a + p ä ä o m a v a r o j e n + p ä ä o m a v e r o a + p ä ä o m a v e r o j e n + p ä ä o m a v e r o n + p ä ä o m a v e r o p a k o n + p ä ä o m a v e r o t + p ä ä o m a v e r o t u k s e e n + p ä ä o m a v e r o t u k s e l l e + p ä ä o m a v e r o t u k s e n + p ä ä o m a v e r o t u k s e n s a + p ä ä o m a v e r o t u l o j a + p ä ä o m a v e r o t u s + p ä ä o m a v e r o t u s j ä r j e s t e l m ä + p ä ä o m a v e r o t u s t a + p ä ä o m a v i r r a t + p ä ä o m a v i r r o i s t a + p ä ä o m a v i r t a u s + p ä ä o m a v i r t o i h i n + p ä ä o m a v i r t o j a + p ä ä o m a v i r t o j e n + p ä ä o m a v o i t t o i h i n + p ä ä o m a v o i t t o j a + p ä ä o m a v o i t t o j e n + p ä ä o m a v u o t o + p ä ä o m a v u o t o a + p ä ä o m a v ä l i n e e n + p ä ä o m a v ä l i n e i t ä + p ä ä o m a y h t i ö i d e n + p ä ä o m a y r i t y k s e n + p ä ä o m i a + p ä ä o m i e n + p ä ä o m i i n + p ä ä o m i l l e + p ä ä o m i s t a j i a + p ä ä o m i s t a j i n a + p ä ä o n g e l m a + p ä ä o n g e l m a a + p ä ä o n g e l m a n + p ä ä o n g e l m a n a + p ä ä o n g e l m a n a a n + p ä ä o n g e l m a s t a + p ä ä o n g e l m a t + p ä ä o n g e l m i a + p ä ä o n g e l m i e n + p ä ä o n g e l m i s t a + p ä ä o n g e l m i s t a m m e + p ä ä o p e t u s k i e l e k s i + p ä ä o p e t u s k i e l e n ä + p ä ä o p e t u s k i e l i + p ä ä o p p o s i t i o + p ä ä o p p o s i t i o n p u o l u e e n + p ä ä o p p o s i t i o p u o l u e + p ä ä o p p o s i t i o p u o l u e e n + p ä ä o p p o s i t i o p u o l u e e s e e n + p ä ä o p p o s i t i o p u o l u e e t + p ä ä o p p o s i t i o p u o l u e i l t a + p ä ä o p p o s i t i o r y h m ä n + p ä ä o p p o s i t i o r y h m ä ä + p ä ä o s a + p ä ä o s a a + p ä ä o s a a n + p ä ä o s a k a s + p ä ä o s a k k a i d e n + p ä ä o s a n + p ä ä o s a n e s i t t ä j i s t ä + p ä ä o s a p u o l e t + p ä ä o s a p u o l i + p ä ä o s a p u o l i a + p ä ä o s a p u o l t a + p ä ä o s a p u o l t e n + p ä ä o s a s s a + p ä ä o s a s t a + p ä ä o s a s t o + p ä ä o s a s t o a + p ä ä o s a s t o h a n + p ä ä o s a s t o i h i n + p ä ä o s a s t o i l l a + p ä ä o s a s t o i l l e + p ä ä o s a s t o i l l e e n + p ä ä o s a s t o i l t a + p ä ä o s a s t o i s s a + p ä ä o s a s t o i s t a + p ä ä o s a s t o i s t a m m e + p ä ä o s a s t o j a + p ä ä o s a s t o j e n + p ä ä o s a s t o j e n s a + p ä ä o s a s t o l l a + p ä ä o s a s t o l l e + p ä ä o s a s t o l t a + p ä ä o s a s t o m m e + p ä ä o s a s t o n + p ä ä o s a s t o n i + p ä ä o s a s t o n k i n + p ä ä o s a s t o n n e + p ä ä o s a s t o n s a + p ä ä o s a s t o o n + p ä ä o s a s t o s s a + p ä ä o s a s t o s s a a n + p ä ä o s a s t o s s a n i + p ä ä o s a s t o s t a + p ä ä o s a s t o t + p ä ä o s i e n + p ä ä o s i s t a + p ä ä o t s a k e + p ä ä o t s i k k o + p ä ä o t s i k k o a + p ä ä o t s i k k o i n a + p ä ä o t s i k k o j e n + p ä ä o t s i k o i s s a + p ä ä o v e s t a + p ä ä p a i k k a + p ä ä p a i n o + p ä ä p a i n o a + p ä ä p a i n o n + p ä ä p a i n o p i s t e a l u e e t + p ä ä p a i n o p i s t e a l u e i t a m m e + p ä ä p a i n o p i s t e e n ä + p ä ä p a i n o p i s t e i s t ä m m e + p ä ä p a i n o p i s t e t t ä + p ä ä p a k e t i n + p ä ä p a l k i n t o + p ä ä p a r a m e t r e i h i n + p ä ä p e r i a a t e + p ä ä p e r i a a t e t t a + p ä ä p e r i a a t t e e m m e + p ä ä p e r i a a t t e e n + p ä ä p e r i a a t t e e n a + p ä ä p e r i a a t t e e n a m m e + p ä ä p e r i a a t t e e s e e n + p ä ä p e r i a a t t e e s t a + p ä ä p e r i a a t t e e t + p ä ä p e r i a a t t e i d e n + p ä ä p e r i a a t t e i k s i + p ä ä p e r i a a t t e i l l e + p ä ä p e r i a a t t e i n a m m e + p ä ä p e r i a a t t e i s i i m m e + p ä ä p e r i a a t t e i s i i n + p ä ä p e r i a a t t e i s s a + p ä ä p e r i a a t t e i s t a + p ä ä p e r i a a t t e i t a + p ä ä p e r u s t a n a + p ä ä p e r u s t e e n + p ä ä p e r u s t e e n a + p ä ä p e r u s t e i n + p ä ä p e r u s t e i s t a + p ä ä p e r u s t e l u + p ä ä p e r u s t e l u j a + p ä ä p i i r r e + p ä ä p i i r r e t t ä + p ä ä p i i r t e e n ä + p ä ä p i i r t e e t + p ä ä p i i r t e i l t ä ä n + p ä ä p i i r t e i n e n + p ä ä p i i r t e i s i i n + p ä ä p i i r t e i s s ä ä n + p ä ä p i i r t e i s t ä + p ä ä p i i r t e i t t ä i n + p ä ä p i i r t e i t ä + p ä ä p i l a r e i h i n + p ä ä p i l a r e i s t a + p ä ä p i l a r i a + p ä ä p i l a r i t + p ä ä p o l i t i i k k o j e n + p ä ä p o s t i i n + p ä ä p o s t i t a l o + p ä ä p r i o r i t e e t t e j a + p ä ä p r i o r i t e e t t i + p ä ä p r o s e s s i a + p ä ä p u h e e s s a a n + p ä ä p u h u j a + p ä ä p u h u j a m m e + p ä ä p u k a r i t + p ä ä p u o l u e + p ä ä p u o l u e e n + p ä ä p u o l u e e t + p ä ä p u o l u e i d e n + p ä ä p u o l u e r y h m i e n + p ä ä p u o l u e r y h m ä m m e + p ä ä p u o l u e r y h m ä t + p ä ä p u o l u e t t a + p ä ä p y r k i m y k s e t + p ä ä r a b b i + p ä ä r a b b i n + p ä ä r a d a n + p ä ä r a h o i t t a j a + p ä ä r a h o i t t a j a n a + p ä ä r a h o i t t a j i a + p ä ä r a h o i t t a j i s t a + p ä ä r a k e n n e r a h a s t o a s e t u k s e n + p ä ä r a k e n n e r a h a s t o a s e t u s t a + p ä ä r a k e n t e i d e n + p ä ä r a t a + p ä ä r a t o i h i n + p ä ä r a u t a t i e a s e m a + p ä ä r a u t a t i e a s e m a a + p ä ä r a u t a t i e l i n j a a + p ä ä r e i t e i l l ä + p ä ä r e i t i l l ä + p ä ä r e i t i t + p ä ä r e i t t e j ä + p ä ä r i s t e y s k o h d a s s a + p ä ä r o o l e i s t a + p ä ä r o o l i + p ä ä r o o l i a + p ä ä r o o l i n + p ä ä r o o l i s s a + p ä ä r u o k a + p ä ä r u o k a a + p ä ä r y h m i t t y m i e n + p ä ä r y h m i t t y m ä + p ä ä r y h m i ä + p ä ä r y h m ä s s ä + p ä ä r y h m ä t + p ä ä r y h m ä ä + p ä ä r y h m ä ä n + p ä ä r y n ä l e v ä + p ä ä r y n ä t o n n i e n + p ä ä s a a l i i n + p ä ä s a a l i s + p ä ä s a a r i l t a + p ä ä s a a v u t u k s e m m e + p ä ä s a n o m a + p ä ä s a n o m a a n + p ä ä s a n o m a n a + p ä ä s a r j a + p ä ä s a r j a n + p ä ä s a t a m a t + p ä ä s a t a m i a + p ä ä s e e + p ä ä s e i k k a + p ä ä s e i k k a a + p ä ä s e m i n e n + p ä ä s e m i s e k s i + p ä ä s e m i s e l l e + p ä ä s e m i s e n + p ä ä s e m i s e s t ä + p ä ä s e m i s t ä + p ä ä s e m m e + p ä ä s e m m e k i n + p ä ä s e m m e k ö + p ä ä s e m ä i s i l l ä m m e + p ä ä s e m ä s s ä + p ä ä s e m ä s t ä + p ä ä s e m ä t t ä + p ä ä s e m ä ä n + p ä ä s e n k i n + p ä ä s e t t e + p ä ä s e u r a u s t a + p ä ä s e v ä m m e + p ä ä s e v ä n + p ä ä s e v ä t + p ä ä s i + p ä ä s i h t e e r e i d e n + p ä ä s i h t e e r e i l l e + p ä ä s i h t e e r e i t ä + p ä ä s i h t e e r e j ä + p ä ä s i h t e e r i + p ä ä s i h t e e r i e n + p ä ä s i h t e e r i h ä n + p ä ä s i h t e e r i i n + p ä ä s i h t e e r i k s i + p ä ä s i h t e e r i l l e + p ä ä s i h t e e r i l l ä + p ä ä s i h t e e r i l t ä + p ä ä s i h t e e r i m m e + p ä ä s i h t e e r i n + p ä ä s i h t e e r i n i + p ä ä s i h t e e r i n n e + p ä ä s i h t e e r i n ä + p ä ä s i h t e e r i s t ä + p ä ä s i h t e e r i s t ö + p ä ä s i h t e e r i s t ö j e n + p ä ä s i h t e e r i s t ö l l e + p ä ä s i h t e e r i s t ö l t ä + p ä ä s i h t e e r i s t ö n + p ä ä s i h t e e r i s t ö n s ä + p ä ä s i h t e e r i s t ö s s ä + p ä ä s i h t e e r i s t ö s t ä + p ä ä s i h t e e r i s t ö ä + p ä ä s i h t e e r i s t ö ö n + p ä ä s i h t e e r i t + p ä ä s i h t e e r i ä + p ä ä s i h t e e r i ä ä n + p ä ä s i j o i t t a j a + p ä ä s i m m e + p ä ä s i n + p ä ä s i s i + p ä ä s i s i m m e + p ä ä s i s i v ä t + p ä ä s i s ä l l ö n + p ä ä s i s ä l l ö s t ä + p ä ä s i s ä l t ö + p ä ä s i s ä l t ö n ä + p ä ä s i s ä l t ö ä + p ä ä s i s ä l t ö ö n + p ä ä s i s ä ä n k ä y n t i + p ä ä s i s ä ä n k ä y n t i ä + p ä ä s i t t e k ö h ä n + p ä ä s i v ä t + p ä ä s i ä i s e n + p ä ä s i ä i s e n ä + p ä ä s i ä i s k a p i n a + p ä ä s i ä i s k o k k o + p ä ä s i ä i s k o r t t i + p ä ä s i ä i s l a u a n t a i n a + p ä ä s i ä i s l e i p ä + p ä ä s i ä i s l o m a a + p ä ä s i ä i s l o m i a + p ä ä s i ä i s m a a n a n t a i n a + p ä ä s i ä i s m u n a + p ä ä s i ä i s m u n i a + p ä ä s i ä i s n ä y t e l m ä + p ä ä s i ä i s p u p u + p ä ä s i ä i s s a a r e n + p ä ä s i ä i s s a a r e t + p ä ä s i ä i s s a a r i + p ä ä s i ä i s s u n n u n t a i n + p ä ä s i ä i s s u n n u n t a i n a + p ä ä s i ä i s s u n n u n t a i t a + p ä ä s i ä i s t e r v e h d y s + p ä ä s i ä i s v i i k o n + p ä ä s i ä i s v i i k o n l o p p u n a + p ä ä s k y k a h l a a j a + p ä ä s k y k o t i n g a + p ä ä s k y l e i j u + p ä ä s k y s m a r a g d i k o l i b r i + p ä ä s o l a s s a + p ä ä s o l u + p ä ä s o p i m u s k u m p p a n i n + p ä ä s p o n s o r i + p ä ä s s e e n + p ä ä s s e e t + p ä ä s s y t + p ä ä s s ä l a s k u t a i t o + p ä ä s t e s s ä ä n + p ä ä s t e t t i i n + p ä ä s t e t t y + p ä ä s t e t t ä i s i i n + p ä ä s t e t ä + p ä ä s t e t ä ä n + p ä ä s t i i n + p ä ä s t y + p ä ä s t y ä m m e + p ä ä s t y ä ä n + p ä ä s t ä i s i i n + p ä ä s t ä k s e e n + p ä ä s t ä k s e m m e + p ä ä s t ä k s e n i + p ä ä s t ä k s e n n e + p ä ä s t ä m ä l l ä + p ä ä s t ä n i + p ä ä s t ä v ä t k ö + p ä ä s t ä ä + p ä ä s t ä ä k s e e n + p ä ä s t ä ä n + p ä ä s t ä ä n k ö + p ä ä s t ö a r v o j a + p ä ä s t ö a r v o j e n + p ä ä s t ö a r v o t + p ä ä s t ö a s e t u s + p ä ä s t ö a s i a a + p ä ä s t ö a s t e e n + p ä ä s t ö h y v i t y s j ä r j e s t e l m ä + p ä ä s t ö h y v i t y s j ä r j e s t e l m ä ä + p ä ä s t ö h y v i t y s t e n + p ä ä s t ö i h i n + p ä ä s t ö i l l ä + p ä ä s t ö i l m o i t u s + p ä ä s t ö i n + p ä ä s t ö i s t ä + p ä ä s t ö j e n + p ä ä s t ö j e n r a j o i t u s s t r a t e g i o i l l a + p ä ä s t ö j e n v a l v o n t a t e k n i i k a n + p ä ä s t ö j e n v ä h e n n y s t o i m e t + p ä ä s t ö j ä + p ä ä s t ö j ä ä n + p ä ä s t ö k a r t o i t u k s e n + p ä ä s t ö k a r t o i t u k s e t + p ä ä s t ö k a t o t + p ä ä s t ö k a t t o + p ä ä s t ö k a t t o d i r e k t i i v i ä + p ä ä s t ö k a t t o i n e e n + p ä ä s t ö k a t t o j a + p ä ä s t ö k a t t o j e n + p ä ä s t ö k a u p a l l a + p ä ä s t ö k a u p a l l a a n + p ä ä s t ö k a u p a l l e + p ä ä s t ö k a u p a n + p ä ä s t ö k a u p a s s a + p ä ä s t ö k a u p a s t a + p ä ä s t ö k a u p o i s t a + p ä ä s t ö k a u p p a + p ä ä s t ö k a u p p a a + p ä ä s t ö k a u p p a a n + p ä ä s t ö k a u p p a d i r e k t i i v i + p ä ä s t ö k a u p p a d i r e k t i i v i i n + p ä ä s t ö k a u p p a d i r e k t i i v i l l ä + p ä ä s t ö k a u p p a d i r e k t i i v i n + p ä ä s t ö k a u p p a d i r e k t i i v i s s ä + p ä ä s t ö k a u p p a d i r e k t i i v i s t ä + p ä ä s t ö k a u p p a d i r e k t i i v i ä + p ä ä s t ö k a u p p a e h d o t u k s e n s a + p ä ä s t ö k a u p p a j a k s o l l a + p ä ä s t ö k a u p p a j a k s o n + p ä ä s t ö k a u p p a j ä r j e s t e l m i e n + p ä ä s t ö k a u p p a j ä r j e s t e l m i i n + p ä ä s t ö k a u p p a j ä r j e s t e l m i ä + p ä ä s t ö k a u p p a j ä r j e s t e l m ä + p ä ä s t ö k a u p p a j ä r j e s t e l m ä l l e + p ä ä s t ö k a u p p a j ä r j e s t e l m ä l l ä + p ä ä s t ö k a u p p a j ä r j e s t e l m ä l t ä + p ä ä s t ö k a u p p a j ä r j e s t e l m ä m m e + p ä ä s t ö k a u p p a j ä r j e s t e l m ä n + p ä ä s t ö k a u p p a j ä r j e s t e l m ä n s ä + p ä ä s t ö k a u p p a j ä r j e s t e l m ä s s ä + p ä ä s t ö k a u p p a j ä r j e s t e l m ä s t ä + p ä ä s t ö k a u p p a j ä r j e s t e l m ä s t ä m m e + p ä ä s t ö k a u p p a j ä r j e s t e l m ä t + p ä ä s t ö k a u p p a j ä r j e s t e l m ä ä + p ä ä s t ö k a u p p a j ä r j e s t e l m ä ä m m e + p ä ä s t ö k a u p p a j ä r j e s t e l m ä ä n + p ä ä s t ö k a u p p a j ä r j e s t e l y i h i n + p ä ä s t ö k a u p p a j ä r j e s t e l y t + p ä ä s t ö k a u p p a k a u d e l l a + p ä ä s t ö k a u p p a k y s y m y k s e s t ä + p ä ä s t ö k a u p p a l a i n s ä ä d ä n n ö s s ä + p ä ä s t ö k a u p p a l u v a t + p ä ä s t ö k a u p p a m a r k k i n a t + p ä ä s t ö k a u p p a m a r k k i n o i d e n + p ä ä s t ö k a u p p a m a r k k i n o i h i n + p ä ä s t ö k a u p p a m e n e t e l m ä + p ä ä s t ö k a u p p a m m e + p ä ä s t ö k a u p p a n e u v o t t e l u t + p ä ä s t ö k a u p p a n n e + p ä ä s t ö k a u p p a s ä ä n n ö k s e t + p ä ä s t ö k a u p p a t u l o i s t a + p ä ä s t ö k a u p p o j a + p ä ä s t ö k a u p p o j e n + p ä ä s t ö k a u s i + p ä ä s t ö k e h i t y k s e s s ä + p ä ä s t ö k e r r o i n + p ä ä s t ö k e r t o i m i a + p ä ä s t ö k i i n t i ö i d e n + p ä ä s t ö k i i n t i ö i h i n + p ä ä s t ö k i i n t i ö i l l ä + p ä ä s t ö k i i n t i ö i s t ä + p ä ä s t ö k i i n t i ö i t ä + p ä ä s t ö k i i n t i ö m m e + p ä ä s t ö k i i n t i ö t + p ä ä s t ö k o m p e n s a a t i o + p ä ä s t ö k r i t e e r e j ä + p ä ä s t ö k u s t a n n u k s e t + p ä ä s t ö k u s t a n n u s t e n + p ä ä s t ö k y s y m y s + p ä ä s t ö l e i k k a u k s e n + p ä ä s t ö l e i k k a u k s e t + p ä ä s t ö l e i k k a u k s i a + p ä ä s t ö l e i k k a u k s i i n + p ä ä s t ö l e i k k a u s t a v o i t t e i t a a n + p ä ä s t ö l u e t t e l o + p ä ä s t ö l u o k i t u k s e n + p ä ä s t ö l u o k i t u k s e t + p ä ä s t ö l u o k k a a + p ä ä s t ö l u o k k i e n + p ä ä s t ö l u o t t o j a + p ä ä s t ö l u p a k a u p p a + p ä ä s t ö l u p a u k s i a + p ä ä s t ö l u p i a + p ä ä s t ö l u p i e n + p ä ä s t ö l u p i n a + p ä ä s t ö l u v i s t a + p ä ä s t ö l u v u i s s a + p ä ä s t ö l ä h d e + p ä ä s t ö l ä h d e t t ä + p ä ä s t ö l ä h t e i d e n + p ä ä s t ö l ä h t e i s i i n + p ä ä s t ö l ä h t e i s t ä + p ä ä s t ö l ä h t e i t ä + p ä ä s t ö m a k s u + p ä ä s t ö m a k s u i l l a + p ä ä s t ö m a k s u j a + p ä ä s t ö m a k s u t + p ä ä s t ö m a r k k i n o i t a + p ä ä s t ö m i t t a u k s e s s a + p ä ä s t ö m i t t a u k s i s t a + p ä ä s t ö m i t t a u s o h j e l m a + p ä ä s t ö m i t t a u s s a r j a a + p ä ä s t ö m i t t a u s t e n + p ä ä s t ö m ä ä r i e n + p ä ä s t ö m ä ä r i i n + p ä ä s t ö m ä ä r i ä + p ä ä s t ö m ä ä r ä t + p ä ä s t ö m ä ä r ä y k s i ä + p ä ä s t ö n e u t r a a l i a + p ä ä s t ö n o r m e i l l a + p ä ä s t ö n o r m e j a + p ä ä s t ö n o r m i + p ä ä s t ö n o r m i a + p ä ä s t ö n o r m i e n + p ä ä s t ö n o r m i i n + p ä ä s t ö n o r m i n + p ä ä s t ö n o r m i t + p ä ä s t ö o i k e u d e n + p ä ä s t ö o i k e u d e t + p ä ä s t ö o i k e u k s i a + p ä ä s t ö o i k e u k s i a a n + p ä ä s t ö o i k e u k s i e n + p ä ä s t ö o i k e u k s i i n + p ä ä s t ö o i k e u k s i k s i + p ä ä s t ö o i k e u k s i l l a + p ä ä s t ö o i k e u k s i l l e + p ä ä s t ö o i k e u k s i s t a + p ä ä s t ö o i k e u k s i s t a a n + p ä ä s t ö o i k e u s + p ä ä s t ö o i k e u s a l l o k a a t i o i s t a + p ä ä s t ö o i k e u s j ä r j e s t e l m ä + p ä ä s t ö o i k e u s k a u p p a + p ä ä s t ö o i k e u s k a u p p a a + p ä ä s t ö o i k e u s k a u p p a a n + p ä ä s t ö o i k e u s p ö r s s i + p ä ä s t ö o i k e u s p ö r s s i e n + p ä ä s t ö o i k e u t e n s a + p ä ä s t ö o i k e u t t a + p ä ä s t ö o n g e l m a + p ä ä s t ö o n g e l m a a n + p ä ä s t ö o n g e l m a t + p ä ä s t ö o n g e l m i i n + p ä ä s t ö o s u u k s i a + p ä ä s t ö p a n k i s t a + p ä ä s t ö p i s t e i s t ä + p ä ä s t ö p i t o i s u u d e t + p ä ä s t ö p o l i t i i k a n + p ä ä s t ö p o l i t i i k k a a + p ä ä s t ö r a j a + p ä ä s t ö r a j a a + p ä ä s t ö r a j a a n + p ä ä s t ö r a j a k s i + p ä ä s t ö r a j a n + p ä ä s t ö r a j a s t a + p ä ä s t ö r a j a t + p ä ä s t ö r a j o i h i n + p ä ä s t ö r a j o i k s i + p ä ä s t ö r a j o i l l a + p ä ä s t ö r a j o i s t a + p ä ä s t ö r a j o i t u k s e t + p ä ä s t ö r a j o i t u k s i a + p ä ä s t ö r a j o i t u k s i i n + p ä ä s t ö r a j o i t u k s i l l e + p ä ä s t ö r a j o i t u s + p ä ä s t ö r a j o i t u s k i i n t i ö i t ä + p ä ä s t ö r a j o j a + p ä ä s t ö r a j o j e n + p ä ä s t ö r i k o k s i i n + p ä ä s t ö r i k o s t e n + p ä ä s t ö s e l v i t y s j ä r j e s t e l m ä t + p ä ä s t ö s e r t i f i k a a t e i l l a + p ä ä s t ö s e r t i f i k a a t t i e n + p ä ä s t ö s t a n d a r d e j a + p ä ä s t ö s t a n d a r d i e n + p ä ä s t ö s t a n d a r d i n + p ä ä s t ö s t a n d a r d i t + p ä ä s t ö s ä ä n n ö t + p ä ä s t ö t + p ä ä s t ö t a a k a s t a + p ä ä s t ö t a a k k a a n + p ä ä s t ö t a s e t t a + p ä ä s t ö t a s o + p ä ä s t ö t a s o a + p ä ä s t ö t a s o i h i n + p ä ä s t ö t a s o i s t a + p ä ä s t ö t a s o j a + p ä ä s t ö t a s o j e n + p ä ä s t ö t a s o n + p ä ä s t ö t a s o o n + p ä ä s t ö t a s o s t a + p ä ä s t ö t a s o t + p ä ä s t ö t a v o i t e + p ä ä s t ö t a v o i t e t t a m m e + p ä ä s t ö t a v o i t t e e m m e + p ä ä s t ö t a v o i t t e e n s a + p ä ä s t ö t a v o i t t e e t + p ä ä s t ö t a v o i t t e i d e n + p ä ä s t ö t a v o i t t e i l l e + p ä ä s t ö t a v o i t t e i s i i n + p ä ä s t ö t a v o i t t e i s t a + p ä ä s t ö t a v o i t t e i t a + p ä ä s t ö t a v o i t t e i t a a n + p ä ä s t ö t a v o i t t e i t a m m e + p ä ä s t ö t i e t o j a + p ä ä s t ö t i e t o j e n + p ä ä s t ö t o d i s t u k s i a + p ä ä s t ö t o d i s t u k s i e n + p ä ä s t ö t o d i s t u s + p ä ä s t ö t o d i s t u s t e n + p ä ä s t ö v a a t i m u k s e t + p ä ä s t ö v a a t i m u k s i a + p ä ä s t ö v a a t i m u k s i e n + p ä ä s t ö v a a t i m u k s i s t a + p ä ä s t ö v a a t i m u s t e n + p ä ä s t ö v a i h e e n + p ä ä s t ö v a l v o n t a j ä r j e s t e l m i i n + p ä ä s t ö v a l v o n t a l a i t t e e t + p ä ä s t ö v a p a a n + p ä ä s t ö v e r o i l l a + p ä ä s t ö v e r o i s t a + p ä ä s t ö v ä h e n e m ä + p ä ä s t ö v ä h e n n y k s e e n + p ä ä s t ö v ä h e n n y k s e m m e + p ä ä s t ö v ä h e n n y k s e n + p ä ä s t ö v ä h e n n y k s e t + p ä ä s t ö v ä h e n n y k s i i n + p ä ä s t ö v ä h e n n y k s i k s i + p ä ä s t ö v ä h e n n y k s i l l ä + p ä ä s t ö v ä h e n n y k s i s s ä + p ä ä s t ö v ä h e n n y k s i s t ä + p ä ä s t ö v ä h e n n y k s i s t ä m m e + p ä ä s t ö v ä h e n n y k s i ä + p ä ä s t ö v ä h e n n y k s i ä m m e + p ä ä s t ö v ä h e n n y s + p ä ä s t ö v ä h e n n y s h y v i t y k s i ä + p ä ä s t ö v ä h e n n y s h y v i t y s t e n + p ä ä s t ö v ä h e n n y s i n v e s t o i n t e j a + p ä ä s t ö v ä h e n n y s k a n n u s t e + p ä ä s t ö v ä h e n n y s p r o s e n t t e i h i n + p ä ä s t ö v ä h e n n y s s i t o u m u k s e t + p ä ä s t ö v ä h e n n y s s i t o u m u k s i a + p ä ä s t ö v ä h e n n y s s i t o u m u k s i s s a + p ä ä s t ö v ä h e n n y s s i t o u m u k s i s t a + p ä ä s t ö v ä h e n n y s s o p i m u k s e s s a + p ä ä s t ö v ä h e n n y s t a v o i t e + p ä ä s t ö v ä h e n n y s t a v o i t e t t a + p ä ä s t ö v ä h e n n y s t a v o i t t e e m m e + p ä ä s t ö v ä h e n n y s t a v o i t t e e n + p ä ä s t ö v ä h e n n y s t a v o i t t e e t + p ä ä s t ö v ä h e n n y s t a v o i t t e i d e n + p ä ä s t ö v ä h e n n y s t a v o i t t e i s i i n + p ä ä s t ö v ä h e n n y s t a v o i t t e i s t a + p ä ä s t ö v ä h e n n y s t a v o i t t e i t a + p ä ä s t ö v ä h e n n y s t e n + p ä ä s t ö v ä h e n n y s t e n s ä + p ä ä s t ö v ä h e n n y s t o i m i a + p ä ä s t ö v ä h e n n y s t ä + p ä ä s t ö v ä h e n n y s v e l v o i t e + p ä ä s t ö y k s i k ö i s t ä + p ä ä s t ö y l ä r a j a t + p ä ä s t ö y l ä r a j o j a + p ä ä s u o s i t u k s i s t a + p ä ä s u u n n i t t e l i j o i t a + p ä ä s u u n t a + p ä ä s u u n t a a + p ä ä s u u n t a a n + p ä ä s u u n t a u k s e n + p ä ä s u u n t a u k s i a + p ä ä s u u n t a u k s i s t a + p ä ä s u u n t a u s t a + p ä ä s u u n t a u s t e n + p ä ä s u u n t a v i i v a a + p ä ä s u u n t a v i i v a t + p ä ä s u u n t a v i i v o i h i n + p ä ä s u u n t a v i i v o i s t a + p ä ä s y e h d o t + p ä ä s y e h t o j a + p ä ä s y i s t ä + p ä ä s y j ä r j e s t e l m i e n + p ä ä s y k i e l l o n + p ä ä s y k o e + p ä ä s y k o k e e t + p ä ä s y k r i t e e r e i s t ä + p ä ä s y l i p p u t r o k a r e i l l e + p ä ä s y l i p p u t r o k a r i t + p ä ä s y l i p u i s t a + p ä ä s y l i p u l l a + p ä ä s y m a k s u a + p ä ä s y m a k s u s t a + p ä ä s y m a k s u t u l o i n + p ä ä s y m b o l e i s t a + p ä ä s y m e n e t t e l y + p ä ä s y n + p ä ä s y n s ä ä n t e l y ä + p ä ä s y o i k e u d e n + p ä ä s y o i k e u k s i a + p ä ä s y o i k e u k s i e n + p ä ä s y o i k e u k s i s t a + p ä ä s y r a j o i t u k s i a + p ä ä s y r a j o i t u k s i s t a + p ä ä s y r e i t t e j ä + p ä ä s y s s ä + p ä ä s y s t ä + p ä ä s y v a a t i m u k s e n a + p ä ä s y v a a t i m u k s e t + p ä ä s y v a a t i m u k s i a + p ä ä s y v a a t i m u s t e n + p ä ä s y y + p ä ä s y y k s i + p ä ä s y y l l i n e n + p ä ä s y y l l i s e t + p ä ä s y y l l i s i ä + p ä ä s y y l l i s t ä + p ä ä s y y n + p ä ä s y y n ä + p ä ä s y y t + p ä ä s y y t e t t y ä + p ä ä s y y t t ä j ä + p ä ä s y y t t ä j ä l t ä + p ä ä s y y t t ä j ä n + p ä ä s y y t t ä j ä ä + p ä ä s y y t ä + p ä ä s y y t ö k s i s t ä n n e + p ä ä s y ä + p ä ä s y ä ä n + p ä ä s ä ä n n ö n + p ä ä s ä ä n n ö t + p ä ä s ä ä n t ö + p ä ä s ä ä n t ö i s e s t i + p ä ä s ä ä n t ö n ä + p ä ä s ä ä n t ö ä + p ä ä t + p ä ä t a l o u s a r v i o m m e + p ä ä t a p a h t u m a + p ä ä t a p a h t u m a t + p ä ä t a r k i s t u k s e s s a + p ä ä t a r k i s t u s t a + p ä ä t a r k k a i l i j a + p ä ä t a r k k a i l i j a l t a + p ä ä t a r k k a i l i j a n a + p ä ä t a r k k a i l i j o i k s i + p ä ä t a r k o i t u k s e m m e + p ä ä t a r k o i t u k s e n a + p ä ä t a r k o i t u k s e s t a + p ä ä t a r k o i t u k s i a + p ä ä t a r k o i t u k s i s t a + p ä ä t a r k o i t u s + p ä ä t a r k o i t u s t a + p ä ä t a v a l l a + p ä ä t a v o i t e + p ä ä t a v o i t e t t a + p ä ä t a v o i t e t t a a n + p ä ä t a v o i t e t t a m m e + p ä ä t a v o i t t e e k s e e n + p ä ä t a v o i t t e e k s e m m e + p ä ä t a v o i t t e e k s i + p ä ä t a v o i t t e e l l e + p ä ä t a v o i t t e e m m e + p ä ä t a v o i t t e e n + p ä ä t a v o i t t e e n a + p ä ä t a v o i t t e e n a a n + p ä ä t a v o i t t e e n a m m e + p ä ä t a v o i t t e e n a n i + p ä ä t a v o i t t e e n i + p ä ä t a v o i t t e e n s a + p ä ä t a v o i t t e e s e e m m e + p ä ä t a v o i t t e e s e e n + p ä ä t a v o i t t e e s s a + p ä ä t a v o i t t e e s t a + p ä ä t a v o i t t e e t + p ä ä t a v o i t t e i d e n + p ä ä t a v o i t t e i k s e e n + p ä ä t a v o i t t e i l l e + p ä ä t a v o i t t e i n a + p ä ä t a v o i t t e i n a m m e + p ä ä t a v o i t t e i s i i m m e + p ä ä t a v o i t t e i s i i n + p ä ä t a v o i t t e i s s a + p ä ä t a v o i t t e i s s a a n + p ä ä t a v o i t t e i s t a + p ä ä t a v o i t t e i s t a a n + p ä ä t a v o i t t e i s t a m m e + p ä ä t a v o i t t e i t a + p ä ä t a v o i t t e i t a m m e + p ä ä t a v o i t t e i t a n n e + p ä ä t e a s e m a + p ä ä t e e m a + p ä ä t e e m a a n + p ä ä t e e m a n a + p ä ä t e e m o i h i n + p ä ä t e e m o i s t a + p ä ä t e h t a a s e e n s a + p ä ä t e h t ä v i i n + p ä ä t e h t ä v i i n s ä + p ä ä t e h t ä v i s t ä + p ä ä t e h t ä v i ä + p ä ä t e h t ä v ä + p ä ä t e h t ä v ä m m e + p ä ä t e h t ä v ä n i + p ä ä t e h t ä v ä n s ä + p ä ä t e h t ä v ä n ä + p ä ä t e h t ä v ä n ä m m e + p ä ä t e h t ä v ä n ä ä n + p ä ä t e h t ä v ä s t ä + p ä ä t e h t ä v ä s t ä ä n + p ä ä t e h t ä v ä ä + p ä ä t e h t ä v ä ä m m e + p ä ä t e h t ä v ä ä n + p ä ä t e h t ä v ä ä n i + p ä ä t e h t ä v ä ä n s ä + p ä ä t e i d e n + p ä ä t e i l l ä + p ä ä t e i t ä + p ä ä t e k i j ä + p ä ä t e k i j ä n + p ä ä t e k i j ä n ä + p ä ä t e k i j ä t + p ä ä t e k i j ä ä + p ä ä t e k i j ä ä n + p ä ä t e k i j ö i d e n + p ä ä t e k i j ö i h i n + p ä ä t e k i j ö i n ä + p ä ä t e k i j ö i s t ä + p ä ä t e k i j ö i t ä + p ä ä t e k o h d a s s a + p ä ä t e k s t i n + p ä ä t e l a i t e + p ä ä t e l a i t t e e n + p ä ä t e l a i t t e e t + p ä ä t e l a i t t e i d e n + p ä ä t e l a i t t e i s t a + p ä ä t e l a i t t e i t a + p ä ä t e l i n k i s s ä + p ä ä t e l l ä + p ä ä t e l m i e n + p ä ä t e l m i i n + p ä ä t e l m i i n s ä + p ä ä t e l m i k s i + p ä ä t e l m i n ä + p ä ä t e l m i s s ä + p ä ä t e l m i s s ä k i n + p ä ä t e l m i s s ä ä n + p ä ä t e l m i s t ä + p ä ä t e l m i ä + p ä ä t e l m i ä m m e + p ä ä t e l m ä e h d o t u s t a + p ä ä t e l m ä l u o n n o k s e e n + p ä ä t e l m ä l u o n n o k s e n + p ä ä t e l m ä l u o n n o k s e s s a + p ä ä t e l m ä l u o n n o k s e s t a + p ä ä t e l m ä l u o n n o k s e t + p ä ä t e l m ä l u o n n o k s i s s a + p ä ä t e l m ä l u o n n o k s i s t a + p ä ä t e l m ä l u o n n o s + p ä ä t e l m ä l u o n n o s t a + p ä ä t e l m ä m m e + p ä ä t e l m ä n + p ä ä t e l m ä n s ä + p ä ä t e l m ä n ä + p ä ä t e l m ä s s ä + p ä ä t e l m ä s t ä + p ä ä t e l m ä t + p ä ä t e l m ä ä + p ä ä t e l t ä v i s s ä + p ä ä t e m a k s u i h i n + p ä ä t e m a k s u i s t a + p ä ä t e m a k s u j a + p ä ä t e m a k s u j e n + p ä ä t e m a k s u k o r v a u k s i i n + p ä ä t e m a k s u k o r v a u k s i s t a + p ä ä t e m a k s u k o r v a u s a s i a a + p ä ä t e m a k s u k y s y m y k s e n + p ä ä t e m a k s u o n g e l m a + p ä ä t e m a k s u t + p ä ä t e p i s t e + p ä ä t e p i s t e e n ä + p ä ä t e p i s t e i s s ä + p ä ä t e p i s t e t t ä + p ä ä t e t t i i n + p ä ä t e t t i i n k i n + p ä ä t e t t y i h i n + p ä ä t e t t y j e n + p ä ä t e t t y ä + p ä ä t e t t y ä m m e + p ä ä t e t t ä e s s ä + p ä ä t e t t ä i s i i n + p ä ä t e t t ä v i k s i + p ä ä t e t t ä v i s s ä + p ä ä t e t t ä v i ä + p ä ä t e t t ä v ä k s i + p ä ä t e t y i s t ä + p ä ä t e t y n + p ä ä t e t y t + p ä ä t e t ä ä n + p ä ä t i e v e r k o s t o n + p ä ä t i l i n t a r k a s t a j a + p ä ä t i l i n t a r k a s t a j a n + p ä ä t i l i n t a r k a s t a j a n a + p ä ä t i m m e + p ä ä t i m m e k i n + p ä ä t i n + p ä ä t i t t e k i n + p ä ä t o d i s t a j a a n i + p ä ä t o d i s t a j a n a + p ä ä t o d i s t a j i s t a + p ä ä t o i m e k s i a n t a j a a + p ä ä t o i m e k s i s a a j a + p ä ä t o i m e k s i s a a j i k s i + p ä ä t o i m e n p i t e e s t ä + p ä ä t o i m e s t a + p ä ä t o i m i a + p ä ä t o i m i a l a + p ä ä t o i m i a l a a n s a + p ä ä t o i m i e l i m i ä ä n + p ä ä t o i m i j a a + p ä ä t o i m i j a l l e + p ä ä t o i m i j a n a + p ä ä t o i m i j a t + p ä ä t o i m i j o i d e n + p ä ä t o i m i j o i h i n + p ä ä t o i m i j o i t a + p ä ä t o i m i n t a + p ä ä t o i m i n t a a n s a + p ä ä t o i m i n t a l i n j a a + p ä ä t o i m i n t a l i n j a t + p ä ä t o i m i n t a l i n j o j a + p ä ä t o i m i n t o i h i n + p ä ä t o i m i p a i k a k s e e n + p ä ä t o i m i p a i k a k s i + p ä ä t o i m i p a i k a n + p ä ä t o i m i p a i k a t + p ä ä t o i m i p a i k k a + p ä ä t o i m i p a i k o i s s a + p ä ä t o i m i p a i k o i s t a + p ä ä t o i m i s e t + p ä ä t o i m i s t a + p ä ä t o i m i s t o + p ä ä t o i m i s t o n + p ä ä t o i m i s t o s t a + p ä ä t o i m i t t a j a + p ä ä t o i m i t t a j a a + p ä ä t o i m i t t a j i a + p ä ä t o i m i t t a j i e n + p ä ä t o i m i t t a j i s t a + p ä ä t o i v e e n s a + p ä ä t t e i d e n + p ä ä t t e l e m m e + p ä ä t t e l e n + p ä ä t t e l i + p ä ä t t e l y k y v y s t ä + p ä ä t t i + p ä ä t t i v ä t + p ä ä t t y e s s ä + p ä ä t t y i + p ä ä t t y i s i + p ä ä t t y i v ä t + p ä ä t t y m i s a j a n k o h d a n + p ä ä t t y m i s a j a n k o h t a a + p ä ä t t y m i s e h d o t + p ä ä t t y m i s e n + p ä ä t t y m i s l a u s e k e + p ä ä t t y m i s l a u s e k e t t a + p ä ä t t y m i s l a u s e k k e e n + p ä ä t t y m i s l a u s e k k e i d e n + p ä ä t t y m i s l a u s e k k e i s i i n + p ä ä t t y m i s l a u s e k k e i s t a + p ä ä t t y m i s l a u s e k k e i t a + p ä ä t t y m i s p ä i v ä + p ä ä t t y m i s p ä i v ä m ä ä r ä n + p ä ä t t y m i s p ä i v ä m ä ä r ä s t ä + p ä ä t t y m i s p ä i v ä ä + p ä ä t t y m i s t ä + p ä ä t t y m ä i s i l l ä ä n + p ä ä t t y m ä s s ä + p ä ä t t y m ä t t ö m ä l l e + p ä ä t t y m ä t t ö m ä n + p ä ä t t y m ä t t ö m ä s s ä + p ä ä t t y m ä t t ö m ä s t ä + p ä ä t t y m ä t t ö m ä ä n + p ä ä t t y m ä ä n + p ä ä t t y n e e k s i + p ä ä t t y n e e n + p ä ä t t y n e e n ä + p ä ä t t y n e e s s ä + p ä ä t t y n e e t + p ä ä t t y n e i k s i + p ä ä t t y v i ä + p ä ä t t y v ä l l ä + p ä ä t t y v ä n + p ä ä t t y v ä t + p ä ä t t y y + p ä ä t t y y k i n + p ä ä t t y ä + p ä ä t t ä e s s ä m m e + p ä ä t t ä e s s ä ä n + p ä ä t t ä i s i + p ä ä t t ä i s i n + p ä ä t t ä j i e n + p ä ä t t ä j i i n + p ä ä t t ä j i l l e + p ä ä t t ä j i l l ä + p ä ä t t ä j i l t ä + p ä ä t t ä j i n ä + p ä ä t t ä j i s t ä + p ä ä t t ä j i ä + p ä ä t t ä j ä i s i s t u n t o a + p ä ä t t ä j ä i s p a i n a j a i n e n + p ä ä t t ä j ä i s p ä i v ä n ä + p ä ä t t ä j ä t + p ä ä t t ä j ä t k i n + p ä ä t t ä j ä ä + p ä ä t t ä k ä ä m m e + p ä ä t t ä m i s e k s i + p ä ä t t ä m i s t ä + p ä ä t t ä m ä i s i l l ä ä n + p ä ä t t ä m ä s s ä + p ä ä t t ä m ä t t ö m y y t t ä + p ä ä t t ä m ä ä m m e + p ä ä t t ä m ä ä n + p ä ä t t ä n e e n s ä + p ä ä t t ä n e e t + p ä ä t t ä n y t + p ä ä t t ä v i e n + p ä ä t t ä v ä i s e e n + p ä ä t t ä v ä i s e m m i k s i + p ä ä t t ä v ä i s e m m i n + p ä ä t t ä v ä i s e m m i s t ä + p ä ä t t ä v ä i s e m m ä n + p ä ä t t ä v ä i s e m m ä t + p ä ä t t ä v ä i s e m p i + p ä ä t t ä v ä i s e m p i ä + p ä ä t t ä v ä i s e m p ä ä + p ä ä t t ä v ä i s e n + p ä ä t t ä v ä i s e n ä + p ä ä t t ä v ä i s e s t ä + p ä ä t t ä v ä i s i i n + p ä ä t t ä v ä i s i m m i n + p ä ä t t ä v ä i s i m m ä t + p ä ä t t ä v ä i s i n + p ä ä t t ä v ä i s i n ä + p ä ä t t ä v ä i s i ä + p ä ä t t ä v ä i s t e n + p ä ä t t ä v ä i s t ä + p ä ä t t ä v ä i s y y d e n + p ä ä t t ä v ä i s y y d e s t ä ä n + p ä ä t t ä v ä i s y y s + p ä ä t t ä v ä i s y y t e m m e + p ä ä t t ä v ä i s y y t e n n e + p ä ä t t ä v ä i s y y t e n s ä + p ä ä t t ä v ä i s y y t t ä + p ä ä t t ä v ä m m i n + p ä ä t t ä v ä t + p ä ä t t ä ä + p ä ä t t ä ä k i n + p ä ä t t ä ä k s e e n + p ä ä t t ä ä k s e m m e + p ä ä t t ä ä k s e n i + p ä ä t t ä ä k s e n n e + p ä ä t u k i j a a n + p ä ä t u k i j o i t a + p ä ä t u n n e l i s s a + p ä ä t u n t o m e r k e i s t ä + p ä ä t u o t t a j a a + p ä ä t u o t t a j a m a i s s a + p ä ä t u o t t e e m m e + p ä ä t u o t t e e n a + p ä ä t u t k i j o i s t a + p ä ä t y e s s ä ä n + p ä ä t y i + p ä ä t y i v ä t + p ä ä t y k o l m i o s s a + p ä ä t y n e e t + p ä ä t y n y t + p ä ä t y t t y ä + p ä ä t y v ä t + p ä ä t y y + p ä ä t y ä + p ä ä t y ö h ö n s ä + p ä ä t y ö n ä + p ä ä t ä i + p ä ä t ä m m e + p ä ä t ä m m e k ö + p ä ä t ä n + p ä ä t ä n k i n + p ä ä t ä n n e + p ä ä t ä n t ä j ä r j e s t e l m i s t ä + p ä ä t ä n t ä k y k y ä + p ä ä t ä n t ä v a l l a s t a m m e + p ä ä t ä n t ä v a l t a + p ä ä t ä n t ä v a l t a a + p ä ä t ä n t ä v a l t a a n + p ä ä t ä ä n + p ä ä t ö k s e e n + p ä ä t ö k s e e n n e + p ä ä t ö k s e k s i + p ä ä t ö k s e l l ä + p ä ä t ö k s e l l ä ä n + p ä ä t ö k s e m m e + p ä ä t ö k s e n + p ä ä t ö k s e n i + p ä ä t ö k s e n n e + p ä ä t ö k s e n s ä + p ä ä t ö k s e n t e k i j ä + p ä ä t ö k s e n t e k i j ä n + p ä ä t ö k s e n t e k i j ä n ä + p ä ä t ö k s e n t e k i j ä t + p ä ä t ö k s e n t e k i j ö i d e n + p ä ä t ö k s e n t e k i j ö i h i n + p ä ä t ö k s e n t e k i j ö i l l e + p ä ä t ö k s e n t e k i j ö i l l ä + p ä ä t ö k s e n t e k i j ö i l t ä + p ä ä t ö k s e n t e k i j ö i n ä + p ä ä t ö k s e n t e k i j ö i s t ä + p ä ä t ö k s e n t e k i j ö i t ä + p ä ä t ö k s e n t e k o + p ä ä t ö k s e n t e k o a + p ä ä t ö k s e n t e k o a a n + p ä ä t ö k s e n t e k o a i k a a + p ä ä t ö k s e n t e k o a j a n + p ä ä t ö k s e n t e k o a l u e i t a + p ä ä t ö k s e n t e k o a m m e + p ä ä t ö k s e n t e k o a s e m a + p ä ä t ö k s e n t e k o a s e m a a n + p ä ä t ö k s e n t e k o a s e m i e n + p ä ä t ö k s e n t e k o a s e m i i n + p ä ä t ö k s e n t e k o a s e m i s s a + p ä ä t ö k s e n t e k o e l i m e k s i + p ä ä t ö k s e n t e k o e l i m e l l e + p ä ä t ö k s e n t e k o e l i m e l t ä + p ä ä t ö k s e n t e k o e l i m e n + p ä ä t ö k s e n t e k o e l i m e n ä + p ä ä t ö k s e n t e k o e l i m e s s ä + p ä ä t ö k s e n t e k o e l i m e t + p ä ä t ö k s e n t e k o e l i m i e n + p ä ä t ö k s e n t e k o e l i m i i n + p ä ä t ö k s e n t e k o e l i m i l l e + p ä ä t ö k s e n t e k o e l i m i n e e n + p ä ä t ö k s e n t e k o e l i m i s s ä + p ä ä t ö k s e n t e k o e l i m i s t ä + p ä ä t ö k s e n t e k o e l i m i ä + p ä ä t ö k s e n t e k o e l i n + p ä ä t ö k s e n t e k o e l i n t e n + p ä ä t ö k s e n t e k o f o o r u m i + p ä ä t ö k s e n t e k o f o o r u m i t + p ä ä t ö k s e n t e k o i n s t a n s s e j a a n + p ä ä t ö k s e n t e k o i n s t i t u u t i o s s a + p ä ä t ö k s e n t e k o j ä r j e s t e l m i e n + p ä ä t ö k s e n t e k o j ä r j e s t e l m i i n + p ä ä t ö k s e n t e k o j ä r j e s t e l m i ä + p ä ä t ö k s e n t e k o j ä r j e s t e l m ä + p ä ä t ö k s e n t e k o j ä r j e s t e l m ä l l ä + p ä ä t ö k s e n t e k o j ä r j e s t e l m ä m m e + p ä ä t ö k s e n t e k o j ä r j e s t e l m ä n + p ä ä t ö k s e n t e k o j ä r j e s t e l m ä s s ä + p ä ä t ö k s e n t e k o j ä r j e s t e l m ä s t ä + p ä ä t ö k s e n t e k o j ä r j e s t e l m ä t + p ä ä t ö k s e n t e k o j ä r j e s t e l m ä ä + p ä ä t ö k s e n t e k o j ä r j e s t e l m ä ä n + p ä ä t ö k s e n t e k o j ä r j e s t e l y j e n + p ä ä t ö k s e n t e k o k a p a s i t e e t i l l a + p ä ä t ö k s e n t e k o k e i n o i s t a + p ä ä t ö k s e n t e k o k e s k u k s e s t a + p ä ä t ö k s e n t e k o k e s k u k s e t + p ä ä t ö k s e n t e k o k e s k u k s i i n + p ä ä t ö k s e n t e k o k e s k u k s i s t a + p ä ä t ö k s e n t e k o k e s k u s + p ä ä t ö k s e n t e k o k e s k u s t e l u i s s a + p ä ä t ö k s e n t e k o k e t j u + p ä ä t ö k s e n t e k o k e t j u j e n + p ä ä t ö k s e n t e k o k e t j u s s a + p ä ä t ö k s e n t e k o k o n e i s t o a + p ä ä t ö k s e n t e k o k o n e i s t o n + p ä ä t ö k s e n t e k o k o n e i s t o o n + p ä ä t ö k s e n t e k o k r i t e e r e j ä + p ä ä t ö k s e n t e k o k u l t t u u r i a + p ä ä t ö k s e n t e k o k u l t t u u r i a a n + p ä ä t ö k s e n t e k o k u l t t u u r i a n n e + p ä ä t ö k s e n t e k o k u m p p a n u u s + p ä ä t ö k s e n t e k o k y k y + p ä ä t ö k s e n t e k o k y k y i s e n ä + p ä ä t ö k s e n t e k o k y k y m m e + p ä ä t ö k s e n t e k o k y k y ä + p ä ä t ö k s e n t e k o k y k y ä ä n + p ä ä t ö k s e n t e k o k y v y l l e + p ä ä t ö k s e n t e k o k y v y n + p ä ä t ö k s e n t e k o m a h d o l l i s u u d e n + p ä ä t ö k s e n t e k o m a h d o l l i s u u d e t + p ä ä t ö k s e n t e k o m a h d o l l i s u u k s i a m m e + p ä ä t ö k s e n t e k o m a h d o l l i s u u s + p ä ä t ö k s e n t e k o m a l l i a + p ä ä t ö k s e n t e k o m a l l i k s i + p ä ä t ö k s e n t e k o m a l l i n + p ä ä t ö k s e n t e k o m a l l i s s a + p ä ä t ö k s e n t e k o m e k a n i s m e i h i n + p ä ä t ö k s e n t e k o m e k a n i s m e j a + p ä ä t ö k s e n t e k o m e k a n i s m e j a a n + p ä ä t ö k s e n t e k o m e k a n i s m i + p ä ä t ö k s e n t e k o m e k a n i s m i a + p ä ä t ö k s e n t e k o m e k a n i s m i e n + p ä ä t ö k s e n t e k o m e k a n i s m i s s a + p ä ä t ö k s e n t e k o m e k a n i s m i t + p ä ä t ö k s e n t e k o m e n e t e l m i e n + p ä ä t ö k s e n t e k o m e n e t e l m i i n + p ä ä t ö k s e n t e k o m e n e t e l m i ä + p ä ä t ö k s e n t e k o m e n e t e l m ä + p ä ä t ö k s e n t e k o m e n e t e l m ä n + p ä ä t ö k s e n t e k o m e n e t t e l y + p ä ä t ö k s e n t e k o m e n e t t e l y i d e n + p ä ä t ö k s e n t e k o m e n e t t e l y i h i n + p ä ä t ö k s e n t e k o m e n e t t e l y i n e e n + p ä ä t ö k s e n t e k o m e n e t t e l y i s s ä + p ä ä t ö k s e n t e k o m e n e t t e l y i s t ä + p ä ä t ö k s e n t e k o m e n e t t e l y i t ä + p ä ä t ö k s e n t e k o m e n e t t e l y j e n + p ä ä t ö k s e n t e k o m e n e t t e l y j ä + p ä ä t ö k s e n t e k o m e n e t t e l y j ä ä n + p ä ä t ö k s e n t e k o m e n e t t e l y l l ä + p ä ä t ö k s e n t e k o m e n e t t e l y m m e + p ä ä t ö k s e n t e k o m e n e t t e l y n + p ä ä t ö k s e n t e k o m e n e t t e l y n s ä + p ä ä t ö k s e n t e k o m e n e t t e l y s s ä + p ä ä t ö k s e n t e k o m e n e t t e l y s t ä + p ä ä t ö k s e n t e k o m e n e t t e l y t + p ä ä t ö k s e n t e k o m e n e t t e l y y n + p ä ä t ö k s e n t e k o m e n e t t e l y ä + p ä ä t ö k s e n t e k o m e n e t t e l y ä ä n + p ä ä t ö k s e n t e k o m u o t o j a + p ä ä t ö k s e n t e k o m u o t o o n + p ä ä t ö k s e n t e k o o n + p ä ä t ö k s e n t e k o p a i k o i l l a + p ä ä t ö k s e n t e k o p a i k o i l l e + p ä ä t ö k s e n t e k o p a i k o i s t a + p ä ä t ö k s e n t e k o p e r u s t a n + p ä ä t ö k s e n t e k o p e r u s t a n a + p ä ä t ö k s e n t e k o p e r u s t e e t + p ä ä t ö k s e n t e k o p e r u s t e i n + p ä ä t ö k s e n t e k o p i s t e e n + p ä ä t ö k s e n t e k o p i s t e e n s ä + p ä ä t ö k s e n t e k o p o r t a i s s a + p ä ä t ö k s e n t e k o p r o s e s s e i h i n + p ä ä t ö k s e n t e k o p r o s e s s e i s s a + p ä ä t ö k s e n t e k o p r o s e s s e i s s a a n + p ä ä t ö k s e n t e k o p r o s e s s e i s t a + p ä ä t ö k s e n t e k o p r o s e s s e j a + p ä ä t ö k s e n t e k o p r o s e s s e j a a n + p ä ä t ö k s e n t e k o p r o s e s s e j a m m e + p ä ä t ö k s e n t e k o p r o s e s s i + p ä ä t ö k s e n t e k o p r o s e s s i a + p ä ä t ö k s e n t e k o p r o s e s s i e n + p ä ä t ö k s e n t e k o p r o s e s s i i m m e + p ä ä t ö k s e n t e k o p r o s e s s i i n + p ä ä t ö k s e n t e k o p r o s e s s i i n s a + p ä ä t ö k s e n t e k o p r o s e s s i l l a + p ä ä t ö k s e n t e k o p r o s e s s i l l e + p ä ä t ö k s e n t e k o p r o s e s s i m m e + p ä ä t ö k s e n t e k o p r o s e s s i n + p ä ä t ö k s e n t e k o p r o s e s s i n n e + p ä ä t ö k s e n t e k o p r o s e s s i n s a + p ä ä t ö k s e n t e k o p r o s e s s i s s a + p ä ä t ö k s e n t e k o p r o s e s s i s s a m m e + p ä ä t ö k s e n t e k o p r o s e s s i s t a + p ä ä t ö k s e n t e k o p r o s e s s i t + p ä ä t ö k s e n t e k o r a k e n n e + p ä ä t ö k s e n t e k o r a k e n n e t t a + p ä ä t ö k s e n t e k o r a k e n t e e n + p ä ä t ö k s e n t e k o r a k e n t e e t + p ä ä t ö k s e n t e k o r a k e n t e i d e n + p ä ä t ö k s e n t e k o r a k e n t e i n + p ä ä t ö k s e n t e k o r a k e n t e i s i i n + p ä ä t ö k s e n t e k o r a k e n t e i t a + p ä ä t ö k s e n t e k o r a k e n t e i t a m m e + p ä ä t ö k s e n t e k o r o o l e i h i n + p ä ä t ö k s e n t e k o s u h t e e t + p ä ä t ö k s e n t e k o s u h t e i t a + p ä ä t ö k s e n t e k o t a h o j a + p ä ä t ö k s e n t e k o t a h t i + p ä ä t ö k s e n t e k o t a p a + p ä ä t ö k s e n t e k o t a p a a n + p ä ä t ö k s e n t e k o t a p a m m e + p ä ä t ö k s e n t e k o t a p a n s a + p ä ä t ö k s e n t e k o t a p o j a + p ä ä t ö k s e n t e k o t a p o j e n + p ä ä t ö k s e n t e k o t a p o j e n s a + p ä ä t ö k s e n t e k o t a s o a + p ä ä t ö k s e n t e k o t a s o i h i n + p ä ä t ö k s e n t e k o t a s o i s t a + p ä ä t ö k s e n t e k o t a s o j a + p ä ä t ö k s e n t e k o t a s o j e n + p ä ä t ö k s e n t e k o t a s o l l a + p ä ä t ö k s e n t e k o t a s o l l e + p ä ä t ö k s e n t e k o t a s o o n + p ä ä t ö k s e n t e k o t a s o t + p ä ä t ö k s e n t e k o t a v a n + p ä ä t ö k s e n t e k o t a v a s t a + p ä ä t ö k s e n t e k o t a v o i s t a + p ä ä t ö k s e n t e k o t e h t ä v i i n + p ä ä t ö k s e n t e k o t e h t ä v i s s ä + p ä ä t ö k s e n t e k o t e h t ä v ä ä + p ä ä t ö k s e n t e k o t e k n i i k k a + p ä ä t ö k s e n t e k o v a i h e e n + p ä ä t ö k s e n t e k o v a i h e e s s a + p ä ä t ö k s e n t e k o v a i h e i s s a + p ä ä t ö k s e n t e k o v a l l a l l a + p ä ä t ö k s e n t e k o v a l l a n + p ä ä t ö k s e n t e k o v a l m i u d e t + p ä ä t ö k s e n t e k o v a l m i u k s i a + p ä ä t ö k s e n t e k o v a l t a + p ä ä t ö k s e n t e k o v a l t a a + p ä ä t ö k s e n t e k o v a l t a a n + p ä ä t ö k s e n t e k o v a l t a a n s a + p ä ä t ö k s e n t e k o v a l t u u d e t + p ä ä t ö k s e n t e k o v a l t u u k s i a + p ä ä t ö k s e n t e k o v a l t u u k s i e n + p ä ä t ö k s e n t e k o v a l t u u t u s t a + p ä ä t ö k s e n t e k o v a p a u d e l l e + p ä ä t ö k s e n t e k o v a s t u u t a + p ä ä t ö k s e n t e k o v i r a n o m a i n e n + p ä ä t ö k s e n t e k o v i r a n o m a i s e t + p ä ä t ö k s e n t e k o v ä l i n e + p ä ä t ö k s e n t e k o v ä l i n e e k s i + p ä ä t ö k s e n t e k o v ä l i n e e l l ä + p ä ä t ö k s e n t e k o v ä l i n e e n + p ä ä t ö k s e n t e k o v ä l i n e e n s ä + p ä ä t ö k s e n t e k o v ä l i n e e t + p ä ä t ö k s e n t e k o v ä l i n e i l l ä + p ä ä t ö k s e n t e k o v ä l i n e i s i i n + p ä ä t ö k s e n t e k o y m p ä r i s t ö ö n + p ä ä t ö k s e n t e o l l e + p ä ä t ö k s e n t e o n + p ä ä t ö k s e n t e o s s a + p ä ä t ö k s e n t e o s s a a n + p ä ä t ö k s e n t e o s t a + p ä ä t ö k s e n t e o t + p ä ä t ö k s e s s ä + p ä ä t ö k s e s s ä n i + p ä ä t ö k s e s s ä ä n + p ä ä t ö k s e s t ä + p ä ä t ö k s e s t ä n i + p ä ä t ö k s e t + p ä ä t ö k s i e n + p ä ä t ö k s i i n + p ä ä t ö k s i l l e + p ä ä t ö k s i l l ä + p ä ä t ö k s i n + p ä ä t ö k s i s s ä + p ä ä t ö k s i s s ä m m e + p ä ä t ö k s i s s ä ä n + p ä ä t ö k s i s t ä + p ä ä t ö k s i ä + p ä ä t ö k s i ä m m e + p ä ä t ö s a i k a t a u l u n + p ä ä t ö s a l o i t e + p ä ä t ö s a s i a k i r j a + p ä ä t ö s a s i a k i r j a a + p ä ä t ö s a s i a k i r j a a n + p ä ä t ö s a s i a k i r j a l u o n n o k s e e n + p ä ä t ö s a s i a k i r j a n + p ä ä t ö s a s i a k i r j a s s a + p ä ä t ö s a s i a k i r j a s t a + p ä ä t ö s e h d o t u k s e e n + p ä ä t ö s e h d o t u k s e l l a + p ä ä t ö s e h d o t u k s e m m e + p ä ä t ö s e h d o t u k s e n + p ä ä t ö s e h d o t u k s e n s a + p ä ä t ö s e h d o t u k s e s s a + p ä ä t ö s e h d o t u k s e s t a + p ä ä t ö s e h d o t u k s e t + p ä ä t ö s e h d o t u k s i a + p ä ä t ö s e h d o t u k s i i n + p ä ä t ö s e h d o t u s + p ä ä t ö s e h d o t u s t a + p ä ä t ö s e h d o t u s t a a n + p ä ä t ö s e s i t y k s e n + p ä ä t ö s e s i t y k s e s t ä + p ä ä t ö s e s i t y k s i ä + p ä ä t ö s i s t u n n o s s a + p ä ä t ö s i s t u n t o + p ä ä t ö s i s t u n t o o n + p ä ä t ö s j u l i s t u k s e n + p ä ä t ö s j u l i s t u k s e s s a n n e + p ä ä t ö s j u l i s t u s k o m p r o m i s s i + p ä ä t ö s j u l k i l a u s u m a s s a + p ä ä t ö s j u l k i l a u s u m a s t a + p ä ä t ö s j ä r j e s t e l m ä ä + p ä ä t ö s k a u p p a j ä r j e s t e l m ä ä + p ä ä t ö s k a u p p a j ä r j e s t e l m ä ä n + p ä ä t ö s k e h y s + p ä ä t ö s k e s k u s t a + p ä ä t ö s k e s k u s t e l u s s a + p ä ä t ö s k o k o u s + p ä ä t ö s k o n f e r e n s s i + p ä ä t ö s k o n f e r e n s s i a + p ä ä t ö s k o n f e r e n s s i i n + p ä ä t ö s k y k y i n e n + p ä ä t ö s k y k y i s e m m ä k s i + p ä ä t ö s l a u s e l m a + p ä ä t ö s l a u s e l m a a + p ä ä t ö s l a u s e l m a a m m e + p ä ä t ö s l a u s e l m a a n + p ä ä t ö s l a u s e l m a e h d o t u k s e e n + p ä ä t ö s l a u s e l m a e h d o t u k s e l l a + p ä ä t ö s l a u s e l m a e h d o t u k s e m m e + p ä ä t ö s l a u s e l m a e h d o t u k s e n + p ä ä t ö s l a u s e l m a e h d o t u k s e n i + p ä ä t ö s l a u s e l m a e h d o t u k s e n n e + p ä ä t ö s l a u s e l m a e h d o t u k s e n s a + p ä ä t ö s l a u s e l m a e h d o t u k s e s s a + p ä ä t ö s l a u s e l m a e h d o t u k s e s s a a n + p ä ä t ö s l a u s e l m a e h d o t u k s e s s a m m e + p ä ä t ö s l a u s e l m a e h d o t u k s e s t a + p ä ä t ö s l a u s e l m a e h d o t u k s e t + p ä ä t ö s l a u s e l m a e h d o t u k s i a + p ä ä t ö s l a u s e l m a e h d o t u k s i s t a + p ä ä t ö s l a u s e l m a e h d o t u s + p ä ä t ö s l a u s e l m a e h d o t u s t a + p ä ä t ö s l a u s e l m a e h d o t u s t e n + p ä ä t ö s l a u s e l m a e s i t y k s e e m m e + p ä ä t ö s l a u s e l m a e s i t y k s e e n + p ä ä t ö s l a u s e l m a e s i t y k s e e n i + p ä ä t ö s l a u s e l m a e s i t y k s e e n n e + p ä ä t ö s l a u s e l m a e s i t y k s e e n s ä + p ä ä t ö s l a u s e l m a e s i t y k s e k s i + p ä ä t ö s l a u s e l m a e s i t y k s e l l e + p ä ä t ö s l a u s e l m a e s i t y k s e l l e m m e + p ä ä t ö s l a u s e l m a e s i t y k s e l l ä + p ä ä t ö s l a u s e l m a e s i t y k s e l l ä m m e + p ä ä t ö s l a u s e l m a e s i t y k s e l l ä ä n + p ä ä t ö s l a u s e l m a e s i t y k s e m m e + p ä ä t ö s l a u s e l m a e s i t y k s e n + p ä ä t ö s l a u s e l m a e s i t y k s e n i + p ä ä t ö s l a u s e l m a e s i t y k s e n n e + p ä ä t ö s l a u s e l m a e s i t y k s e n s ä + p ä ä t ö s l a u s e l m a e s i t y k s e s s ä + p ä ä t ö s l a u s e l m a e s i t y k s e s s ä k i n + p ä ä t ö s l a u s e l m a e s i t y k s e s s ä m m e + p ä ä t ö s l a u s e l m a e s i t y k s e s s ä n n e + p ä ä t ö s l a u s e l m a e s i t y k s e s s ä ä n + p ä ä t ö s l a u s e l m a e s i t y k s e s t ä + p ä ä t ö s l a u s e l m a e s i t y k s e s t ä m m e + p ä ä t ö s l a u s e l m a e s i t y k s e s t ä n n e + p ä ä t ö s l a u s e l m a e s i t y k s e s t ä ä n + p ä ä t ö s l a u s e l m a e s i t y k s e t + p ä ä t ö s l a u s e l m a e s i t y k s i i n + p ä ä t ö s l a u s e l m a e s i t y k s i l l e + p ä ä t ö s l a u s e l m a e s i t y k s i l l ä + p ä ä t ö s l a u s e l m a e s i t y k s i s s ä + p ä ä t ö s l a u s e l m a e s i t y k s i s t ä + p ä ä t ö s l a u s e l m a e s i t y k s i ä + p ä ä t ö s l a u s e l m a e s i t y k s i ä ä n + p ä ä t ö s l a u s e l m a e s i t y s + p ä ä t ö s l a u s e l m a e s i t y s t e n + p ä ä t ö s l a u s e l m a e s i t y s t ä + p ä ä t ö s l a u s e l m a e s i t y s t ä m m e + p ä ä t ö s l a u s e l m a e s i t y s t ä n n e + p ä ä t ö s l a u s e l m a e s i t y s t ä ä n + p ä ä t ö s l a u s e l m a k o h t a a n + p ä ä t ö s l a u s e l m a k o h t i n a + p ä ä t ö s l a u s e l m a k o m p r o m i s s e i h i n + p ä ä t ö s l a u s e l m a k o m p r o m i s s i n + p ä ä t ö s l a u s e l m a k o m p r o m i s s i s s a + p ä ä t ö s l a u s e l m a k s i + p ä ä t ö s l a u s e l m a l l a + p ä ä t ö s l a u s e l m a l l a a n + p ä ä t ö s l a u s e l m a l l a m m e + p ä ä t ö s l a u s e l m a l l e + p ä ä t ö s l a u s e l m a l u o n n o k s e e n + p ä ä t ö s l a u s e l m a l u o n n o k s e l l a + p ä ä t ö s l a u s e l m a l u o n n o k s e l l e + p ä ä t ö s l a u s e l m a l u o n n o k s e m m e + p ä ä t ö s l a u s e l m a l u o n n o k s e n + p ä ä t ö s l a u s e l m a l u o n n o k s e n n e + p ä ä t ö s l a u s e l m a l u o n n o k s e n s a + p ä ä t ö s l a u s e l m a l u o n n o k s e s s a + p ä ä t ö s l a u s e l m a l u o n n o k s e s s a a n + p ä ä t ö s l a u s e l m a l u o n n o k s e s s a n n e + p ä ä t ö s l a u s e l m a l u o n n o k s e s t a + p ä ä t ö s l a u s e l m a l u o n n o k s e t + p ä ä t ö s l a u s e l m a l u o n n o k s i a + p ä ä t ö s l a u s e l m a l u o n n o k s i s s a + p ä ä t ö s l a u s e l m a l u o n n o k s i s t a + p ä ä t ö s l a u s e l m a l u o n n o s + p ä ä t ö s l a u s e l m a l u o n n o s t a + p ä ä t ö s l a u s e l m a l u o n n o s t e n + p ä ä t ö s l a u s e l m a m e n e t t e l y y n + p ä ä t ö s l a u s e l m a m m e + p ä ä t ö s l a u s e l m a n + p ä ä t ö s l a u s e l m a n e u v o t t e l u i h i n + p ä ä t ö s l a u s e l m a n n e + p ä ä t ö s l a u s e l m a p a k e t i n + p ä ä t ö s l a u s e l m a p r o j e k t i l l a + p ä ä t ö s l a u s e l m a p r o j e k t i n + p ä ä t ö s l a u s e l m a s s a + p ä ä t ö s l a u s e l m a s s a a n + p ä ä t ö s l a u s e l m a s s a k i n + p ä ä t ö s l a u s e l m a s s a m m e + p ä ä t ö s l a u s e l m a s t a + p ä ä t ö s l a u s e l m a s t a m m e + p ä ä t ö s l a u s e l m a t + p ä ä t ö s l a u s e l m a t e k s t e i h i m m e + p ä ä t ö s l a u s e l m a t e k s t i + p ä ä t ö s l a u s e l m a t e k s t i i n + p ä ä t ö s l a u s e l m a t e k s t i n + p ä ä t ö s l a u s e l m a t e k s t i s s ä + p ä ä t ö s l a u s e l m a t e k s t i s t ä + p ä ä t ö s l a u s e l m a t e k s t i t + p ä ä t ö s l a u s e l m a t e k s t i ä + p ä ä t ö s l a u s e l m a v e r s i o o n + p ä ä t ö s l a u s e l m a ä ä n e s t y k s e s s ä + p ä ä t ö s l a u s e l m i a + p ä ä t ö s l a u s e l m i e m m e + p ä ä t ö s l a u s e l m i e n + p ä ä t ö s l a u s e l m i i n + p ä ä t ö s l a u s e l m i l l a + p ä ä t ö s l a u s e l m i l l a m m e + p ä ä t ö s l a u s e l m i s s a + p ä ä t ö s l a u s e l m i s s a a n + p ä ä t ö s l a u s e l m i s s a m m e + p ä ä t ö s l a u s e l m i s t a + p ä ä t ö s l a u s e m a s s a + p ä ä t ö s l e h d i s t ö t i e d o t t e e s s a a n + p ä ä t ö s l o u n a a s e e n + p ä ä t ö s l u o n n o k s e e m m e + p ä ä t ö s l u o n n o k s e l l a + p ä ä t ö s l u o n n o k s e n + p ä ä t ö s l u o n n o k s e n s a + p ä ä t ö s l u o n n o k s e s s a + p ä ä t ö s l u o n n o k s e s t a + p ä ä t ö s l u o n n o k s i a + p ä ä t ö s l u o n n o k s i s t a + p ä ä t ö s l u o n n o s + p ä ä t ö s l u o n n o s t a + p ä ä t ö s l u o n n o s t a a n + p ä ä t ö s l u o n n o s t e n + p ä ä t ö s m e k a n i s m e j a + p ä ä t ö s m e n e t t e l y + p ä ä t ö s m e n e t t e l y i h i n + p ä ä t ö s m e n e t t e l y j e n + p ä ä t ö s m e n e t t e l y j ä + p ä ä t ö s m e n e t t e l y n + p ä ä t ö s m e n e t t e l y s t ä + p ä ä t ö s m e n e t t e l y t + p ä ä t ö s m e n e t t e l y y n + p ä ä t ö s m e n e t t e l y ä + p ä ä t ö s n e u v o t t e l u i l l a + p ä ä t ö s o i k e u s + p ä ä t ö s o n g e l m i s t a + p ä ä t ö s p a k e t t i + p ä ä t ö s p e r u s t a + p ä ä t ö s p r o s e s s i + p ä ä t ö s p r o s e s s i a + p ä ä t ö s p r o s e s s i i n + p ä ä t ö s p r o s e s s i n + p ä ä t ö s p u h e e n + p ä ä t ö s p u h e e n v u o r o a n i + p ä ä t ö s p u h e e n v u o r o i s s a a n + p ä ä t ö s p u h e e n v u o r o n i + p ä ä t ö s p u h e e n v u o r o s s a a n + p ä ä t ö s p u h e e n v u o r o s s a n i + p ä ä t ö s p u h e e n v u o r o s s a n n e + p ä ä t ö s p ä i v ä m ä ä r ä ä + p ä ä t ö s r a k e n t e i s i i n + p ä ä t ö s s a n a n i + p ä ä t ö s s a n a n n e + p ä ä t ö s s a n a t + p ä ä t ö s s a n o i s s a n i + p ä ä t ö s t a u l u + p ä ä t ö s t e k s t i i n + p ä ä t ö s t e k s t i n + p ä ä t ö s t e k s t i s s ä + p ä ä t ö s t e m m e + p ä ä t ö s t e n + p ä ä t ö s t e n s ä + p ä ä t ö s t e n t e k i j ö i d e n + p ä ä t ö s t e n t e k o m e n e t t e l y j e n + p ä ä t ö s t e n t e k o p r o s e s s i s s a + p ä ä t ö s t e o r i a + p ä ä t ö s t i l a i s u u d e s s a + p ä ä t ö s t y y p p i e n + p ä ä t ö s t y y p p i ä + p ä ä t ö s t ä + p ä ä t ö s t ä m m e + p ä ä t ö s t ä n n e + p ä ä t ö s t ä ä n + p ä ä t ö s v a i h e + p ä ä t ö s v a i h e e s e e n + p ä ä t ö s v a i h e e s s a + p ä ä t ö s v a i h e e s s a a n + p ä ä t ö s v a i h e t t a + p ä ä t ö s v a l i k o i m a s t a + p ä ä t ö s v a l l a l l a + p ä ä t ö s v a l l a n + p ä ä t ö s v a l l a s s a n i + p ä ä t ö s v a l m i u k s i e n + p ä ä t ö s v a l t a + p ä ä t ö s v a l t a a + p ä ä t ö s v a l t a a n + p ä ä t ö s v a l t a i s u u d e n + p ä ä t ö s v a l t a i s u u s a s i a + p ä ä t ö s v a l t a i s u u s p y y n n ö n + p ä ä t ö s v a l t a i s u u s p y y n t ö + p ä ä t ö s v a l t a i s u u t t a + p ä ä t ö s v a l t u u k s i a + p ä ä t ö s v a p a u t e e n + p ä ä t ö s v a u h t i a + p ä ä u h r e j a + p ä ä u h r i + p ä ä u h r i n a + p ä ä u l o t t u v u u t t a + p ä ä u r a k o i t s i j a + p ä ä u s k o n t o a + p ä ä u s k o n t o i h i n + p ä ä u s k o n t o j a + p ä ä u s k o n t o n a + p ä ä u u d i s t u k s e s s a + p ä ä u u t i n e n + p ä ä v a a l i t a r k k a i l i j a + p ä ä v a a l i t a r k k a i l i j a a + p ä ä v a a l i t a r k k a i l i j a l t a + p ä ä v a a l i t a r k k a i l i j a n a + p ä ä v a a t i m u k s e n i + p ä ä v a a t i m u k s e n s a + p ä ä v a a t i m u k s e t + p ä ä v a a t i m u k s i a n n e + p ä ä v a a t i m u k s i s t a m m e + p ä ä v a a t i m u s t a + p ä ä v a i h e i s s a + p ä ä v a i h t o e h t o + p ä ä v a i h t o e h t o j a + p ä ä v a i h t o e h t o n a + p ä ä v a i k e u t e e n + p ä ä v a i k u t i n + p ä ä v a i k u t u k s e n a + p ä ä v a i k u t u k s i s t a + p ä ä v a l i o k u n n a l l e + p ä ä v a l i o k u n n a n + p ä ä v a l i o k u n n a s s a + p ä ä v a l i o k u n n a s s a n i + p ä ä v a l i o k u n n i s s a + p ä ä v a l i o k u n t a + p ä ä v a l i o k u n t a a n + p ä ä v a l i o k u n t a n i + p ä ä v a l i o k u n t i e n + p ä ä v a l i t t a j a n a + p ä ä v a l m i s t a j i s t a + p ä ä v a l t u u d e t + p ä ä v a l t u u t e t t u + p ä ä v a l t u u t e t t u a + p ä ä v a l t u u t e t t u n a + p ä ä v a l t u u t e t t u u n + p ä ä v a l t u u t e t u l l e + p ä ä v a l t u u t e t u n + p ä ä v a m m a n + p ä ä v a m m o i h i n + p ä ä v a s t u s t a j a + p ä ä v a s t u s t a j a m m e + p ä ä v a s t u s t a j i a + p ä ä v a s t u u + p ä ä v a s t u u a l u e e m m e + p ä ä v a s t u u h a n + p ä ä v a s t u u l l i n e n + p ä ä v a s t u u l l i s i a + p ä ä v a s t u u l l i s t e n + p ä ä v a s t u u n + p ä ä v a s t u u n a + p ä ä v a s t u u s e e n + p ä ä v a s t u u s s a + p ä ä v a s t u u s t a + p ä ä v a s t u u s t a a n + p ä ä v a s t u u t a + p ä ä v e l k o j a t + p ä ä v e l v o i t e t t a + p ä ä v e r k k o m m e + p ä ä v e r k o i s s a + p ä ä v e r k o s t o i l l e + p ä ä v i e n t i t u o t t e i s t a + p ä ä v i e s t i + p ä ä v i e s t i i n i + p ä ä v i e s t i m m e + p ä ä v i e s t i n + p ä ä v i e s t i n i + p ä ä v i h o l l i n e n + p ä ä v i h o l l i s e m m e + p ä ä v i l j e l y k a s v i n a + p ä ä v i r h e + p ä ä v i r t a u s t a + p ä ä v o i t t a j a + p ä ä v y ö h y k k e e n + p ä ä v ä i t t e e s e e n + p ä ä v ä i t t ä m ä n s ä + p ä ä v ä l i n e + p ä ä v ä l i n e e n ä + p ä ä v ä l i n e i t ä + p ä ä v ä l i n e t t ä + p ä ä v ä r i + p ä ä v ä r i t + p ä ä v ä y l i l l ä + p ä ä v ä y l i ä + p ä ä v ä y l ä + p ä ä y h t e i s t y ö a l a t + p ä ä y h t e i s t y ö a l u e t t a + p ä ä y h t e y k s i s t ä + p ä ä y r i t t ä j ä + p ä ä y r i t y k s e l l e + p ä ä y r i t y k s i ä + p ö k k e l ö k ä ä p ä + p ö l l ö j ä + p ö l l ö s e t + p ö l l ö s u m u + p ö l l ö t + p ö l y g r a f f i t i + p ö l y h i u k k a s e t + p ö l y h i u k k a s i l l e + p ö l y h i u k k a s t e n + p ö l y k i e k k o + p ö l y n + p ö l y n i m u r e i l l e + p ö l y n i m u r e i s t a + p ö l y n i m u r i + p ö l y n i m u r i t + p ö l y p i t o i s u u d e l l e + p ö l y p u n k i t + p ö l y p y ö r r e + p ö l y t + p ö l y t t y m ä s s ä + p ö l y t t y m ä ä n + p ö l y t t y n e e n + p ö l y t t y ä + p ö l y t t ä j ä y s t ä v ä l l i s e t + p ö l y t t ä m i s e s s ä + p ö l y t y k s e s s ä + p ö l y t y s e t u j e n + p ö l y t y s m a k s u n + p ö l y t y s m a k s u u n + p ö l y t y s p a l k k i o + p ö l y t y s p a l k k i o n + p ö l y t y s p a l k k i o t + p ö l y t y s p a l k k i o t a + p ö l y t y s t u e s t a + p ö l y t y s t u k e a + p ö l y t y s t u k i + p ö l y t y s t y ö l l e + p ö l y y n t y m ä s s ä + p ö n k i t e t ä + p ö n t t ö k a m e r a + p ö r s s e i h i n + p ö r s s e i k s i + p ö r s s e i l l e + p ö r s s e i l l ä + p ö r s s e i s s ä + p ö r s s e i s t ä + p ö r s s e j ä + p ö r s s i a r v o + p ö r s s i a r v o l t a a n + p ö r s s i e n + p ö r s s i h e i l a h t e l u i l l e + p ö r s s i h u u m a + p ö r s s i i n + p ö r s s i j ä r j e s t e l m ä ä + p ö r s s i j ä r j e s t e l m ä ä n + p ö r s s i k a u p a n + p ö r s s i k a u p p a a n + p ö r s s i k a u p p o j e n + p ö r s s i k e i n o t t e l i j o i d e n + p ö r s s i k e i n o t t e l u + p ö r s s i k e i n o t t e l u a + p ö r s s i k e i n o t t e l u n + p ö r s s i k e s k u k s i s s a + p ö r s s i k o m i s s i o + p ö r s s i k o m i s s i o n + p ö r s s i k o m i t e a + p ö r s s i k o m i t e a n + p ö r s s i k o m i t e a s t a + p ö r s s i k r i i s i + p ö r s s i k u p l a + p ö r s s i k u r s s e i s s a + p ö r s s i k u r s s e i s t a + p ö r s s i k u r s s e j a + p ö r s s i k u r s s i + p ö r s s i k u r s s i e n + p ö r s s i k u r s s i t + p ö r s s i l i s t o i l l a + p ö r s s i l l e + p ö r s s i m a a i l m a l l e + p ö r s s i m a r k k i n a t + p ö r s s i m a r k k i n o i d e n + p ö r s s i m a r k k i n o i l l a + p ö r s s i m a r k k i n o i l l e + p ö r s s i n + p ö r s s i n o t e e r a t t u + p ö r s s i n o t e e r a t t u j a + p ö r s s i n o t e e r a t t u j e n + p ö r s s i n o t e e r a u k s i s s a + p ö r s s i n o t e e r a u s t a + p ö r s s i o s a k k e i d e n + p ö r s s i p e l i ä + p ö r s s i p e l u r i + p ö r s s i p ä ä o m a a + p ö r s s i p ä ä o m a n + p ö r s s i p ä ä o m i a + p ö r s s i r o m a h d u k s i a + p ö r s s i r o m a h d u k s i i n + p ö r s s i r o m a h d u s + p ö r s s i s a l e i s s a + p ö r s s i s p e k u l a n t e i s s a + p ö r s s i s s ä + p ö r s s i s t ä + p ö r s s i s u h d a n t e i d e n + p ö r s s i s ä ä n n ö s t e n + p ö r s s i t + p ö r s s i t i e d o t u s + p ö r s s i t i e t o j e n + p ö r s s i t i l a n n e t t a + p ö r s s i t o i m i a + p ö r s s i t o i m i n t a a + p ö r s s i t u r v a l l i s u u s v i r a n o m a i n e n + p ö r s s i v a i h t o + p ö r s s i v i r a n o m a i s e t + p ö r s s i v o i t t o i h i n + p ö r s s i v o i t t o j a + p ö r s s i v o i t t o j e n + p ö r s s i y h t i ö + p ö r s s i y h t i ö i d e n + p ö r s s i y h t i ö i h i n + p ö r s s i y h t i ö i l l e + p ö r s s i y h t i ö i s s ä + p ö r s s i y h t i ö i t ä + p ö r s s i y h t i ö n + p ö r s s i y h t i ö s s ä + p ö r s s i y h t i ö t + p ö r s s i y r i t y s t e n + p ö r s s i ä + p ö t y p u h e t t a + p ö t y ä + p ö y d ä l l e + p ö y d ä l l ä + p ö y d ä l l ä ä n + p ö y d ä l t ä + p ö y d ä n + p ö y h k e i l e v ä l l ä + p ö y r i s t y t t ä v i s t ä + p ö y r i s t y t t ä v ä m m ä s s ä + p ö y r i s t y t t ä v ä m p i ä + p ö y r i s t y t t ä v ä m p ä ä + p ö y r i s t y t t ä v ä s t ä + p ö y r i s t y t t ä v ä ä + p ö y t i e n + p ö y t i i m m e + p ö y t ä j a l k a p a l l o + p ö y t ä j ä ä k i e k k o + p ö y t ä k i r j a + p ö y t ä k i r j a a n + p ö y t ä k i r j a k o k o n a i s u u s + p ö y t ä k i r j a l l a + p ö y t ä k i r j a l u o n n o k s e s s a + p ö y t ä k i r j a l u o n n o k s e s t a + p ö y t ä k i r j a m u i s t i o n + p ö y t ä k i r j a n + p ö y t ä k i r j a n p i t ä j i l l e + p ö y t ä k i r j a n s a + p ö y t ä k i r j a o s a s s a + p ö y t ä k i r j a s s a + p ö y t ä k i r j a s s a a n + p ö y t ä k i r j a s t a + p ö y t ä k i r j a t + p ö y t ä k i r j o i h i n + p ö y t ä k i r j o i n e e n + p ö y t ä k i r j o i s t a + p ö y t ä k i r j o j a + p ö y t ä k i r j o j e n + p ö y t ä l a a t i k k o a + p ö y t ä l a a t i k k o o n + p ö y t ä l a a t i k k o y h t i ö n + p ö y t ä l a a t i k o i h i n + p ö y t ä l a h t i + p ö y t ä m u n i e n + p ö y t ä s u o l a a + p ö y t ä t e n n i k s e n + p ö y t ä t e n n i s + p ö y t ä t e n n i s p e l i + p ö y t ä t i e t o k o n e + p ö y t ä v i i n e i s s ä + p ö y t ä v i i n e j ä + p ö y t ä v i i n i + p ö y t ä v i i n i e n + p ö y t ä v i i n i k s i + p ö y t ä v i i n i l t ä + p ö y t ä v i i n i t + p ö y t ä v u o r i + p ö y t ä ä n + q i a n g i t + r a a e m p a a + r a a e m p i + r a a e m p i e n + r a a i m m a l l a + r a a i m p i e n + r a a i m p i i n + r a a i s t a v a a + r a a i s t u t t a a + r a a j a n s a + r a a j a v a m m a i s i a + r a a k a k ä ä n n ö k s i ä + r a a k a l a i s m a i s e m p a a + r a a k a l a i s m a i s e m p i a + r a a k a l a i s m a i s i m m i l l a + r a a k a l a i s m a i s i m m i s t a + r a a k a l a i s t e k o i h i n + r a a k a l i h a v a l m i s t e e t + r a a k a l i h a v a l m i s t e i s i i n + r a a k a l i h a v a l m i s t e i t a + r a a k a l u u j a u h o a + r a a k a m a i d o n + r a a k a m a t e r i a a l e j a + r a a k a m a t e r i a a l i a + r a a k a m a t e r i a a l i n s a + r a a k a o o p i u m i n + r a a k a p r o t e i i n i a + r a a k a p r o t e i i n i n + r a a k a p u r j e + r a a k a p u u v i l l a n + r a a k a r u o k a + r a a k a s o k e r i a + r a a k a s o k e r i n + r a a k a s o k e r i s t a + r a a k a t i m a n t t i e n + r a a k a t u p a k a l l e + r a a k a t u p a k a n + r a a k a t u p a k a n v i l j e l y n + r a a k a t u p a k a s t a + r a a k a t u p a k k a + r a a k a t u p a k k a a + r a a k a t u p a k k a m a r k k i n o i l l a + r a a k a u r a a n i a + r a a k a ö l j y + r a a k a ö l j y m a r k k i n o i d e n + r a a k a ö l j y n + r a a k a ö l j y p o h j a i s i s t a + r a a k a ö l j y p o h j a i s t e n + r a a k a ö l j y r i i p p u v a i s u u t e m m e + r a a k a ö l j y r i i p p u v a i s u u t t a m m e + r a a k a ö l j y s t ä + r a a k a ö l j y t a r p e e t + r a a k a ö l j y t u l o i l l e + r a a k a ö l j y t u o t t e i s t a + r a a k a ö l j y t y n n y r i n + r a a k a ö l j y v a r a s t o j a + r a a k a ö l j y v a r a s t o t + r a a k a ö l j y v a r o j a + r a a k a ö l j y v a r o j e n + r a a k a ö l j y v e r o n + r a a k a ö l j y ä + r a a k o j e n + r a a k u u k s i a + r a a k u u t t a + r a a m a t t u k o o d i + r a a m a t t u n a + r a a m a t t u p a p e r i + r a a m a t t u s e u r a l l e + r a a m a t t u t e o l o g i a + r a a m a t t u v y ö h y k e + r a a m a t u l l i s e t + r a a m a t u n + r a a m a t u n k ä ä n n ö k s e t + r a a m a t u n t u t k i j a t + r a a m a t u s t a + r a a o i s t a + r a a p a i s t a a n + r a a p i a + r a a s t e j u u s t o n + r a a t i h u o n e + r a a t i m i e s + r a a t o r e h u n + r a b b i a + r a d a l l a + r a d a n + r a d a s t a + r a d i k a a l e i k s i + r a d i k a a l e i m m a t + r a d i k a a l e i n + r a d i k a a l e j a + r a d i k a a l i a + r a d i k a a l i a l l i a n s s i + r a d i k a a l i a l l i a n s s i n + r a d i k a a l i e n + r a d i k a a l i f e m i n i s m i + r a d i k a a l i f i l o s o f i + r a d i k a a l i j ä s e n e t + r a d i k a a l i j ä s e n i n ä + r a d i k a a l i j ä s e n t e n + r a d i k a a l i j ä s e n t ä + r a d i k a a l i k a n n a t t a j i e n + r a d i k a a l i k o l l e g o i d e n i + r a d i k a a l i k u l t t u u r i + r a d i k a a l i l i i k e + r a d i k a a l i l i i k k e i t ä + r a d i k a a l i l l a + r a d i k a a l i m m a l l a + r a d i k a a l i m m a n + r a d i k a a l i m m a t + r a d i k a a l i m m i k s i + r a d i k a a l i m m i n + r a d i k a a l i m p a a + r a d i k a a l i m p a a n + r a d i k a a l i m p i + r a d i k a a l i m p i a + r a d i k a a l i m p i i n + r a d i k a a l i m u s l i m e j a + r a d i k a a l i m u s l i m i e n + r a d i k a a l i n + r a d i k a a l i p u o l u e + r a d i k a a l i p u o l u e e l l a + r a d i k a a l i p u o l u e e n + r a d i k a a l i p u o l u e e n a + r a d i k a a l i p u o l u e e s e e n + r a d i k a a l i p u o l u e i d e n + r a d i k a a l i p u o l u e t t a + r a d i k a a l i r y h m i e n + r a d i k a a l i r y h m i t t y m i e n + r a d i k a a l i r y h m ä + r a d i k a a l i r y h m ä k s i + r a d i k a a l i r y h m ä n + r a d i k a a l i r y h m ä n i + r a d i k a a l i r y h m ä n ä + r a d i k a a l i r y h m ä t + r a d i k a a l i s o s i a l i s m i a + r a d i k a a l i t + r a d i k a a l i v a l t u u s k u n n a n + r a d i k a a l i v a s e m m i s t o l a i s t e n + r a d i k a l i s m i i n + r a d i k a l i s o i t u m i s e e n + r a d i k a l i s o i t u m i s e n + r a d i k a l i s o i t u m i s t a + r a d i k a l i s o i t u n e i m m a t + r a d i k a l i s o i t u v a t + r a d i o a a k k o s e t + r a d i o a a l l o i l l e + r a d i o a a l l o t + r a d i o a a l t o j e n + r a d i o a k t i i v i s e m p a a + r a d i o a k t i i v i s e m p i e n + r a d i o a k t i i v i s e n + r a d i o a k t i i v i s e s t a + r a d i o a k t i i v i s e s t i + r a d i o a k t i i v i s e t + r a d i o a k t i i v i s i a + r a d i o a k t i i v i s i i n + r a d i o a k t i i v i s t a + r a d i o a k t i i v i s t e n + r a d i o a k t i i v i s u u d e n + r a d i o a k t i i v i s u u d e s t a + r a d i o a k t i i v i s u u s + r a d i o a k t i i v i s u u s t a s o a + r a d i o a k t i i v i s u u s t a s o n + r a d i o a k t i i v i s u u t t a + r a d i o a l a + r a d i o a l a a + r a d i o a l a n + r a d i o a m a t ö ö r e i l l e + r a d i o a m a t ö ö r e i l l ä + r a d i o a m a t ö ö r i + r a d i o a m a t ö ö r i e n + r a d i o a m a t ö ö r i k y s y m y s + r a d i o a s e m a + r a d i o a s e m a a + r a d i o a s e m a a n + r a d i o a s e m a h a n k k e e s e e n + r a d i o a s e m a l t a + r a d i o a s e m a n + r a d i o a s e m a t + r a d i o a s e m i a + r a d i o a s e m i e n + r a d i o a s e m i i n + r a d i o a s e m i l l e + r a d i o a s t r o n o m i a + r a d i o a s t r o n o m i a l l e + r a d i o e k o l o g i a n + r a d i o g a l a k s i + r a d i o h a a s t a t t e l u n + r a d i o h a a s t a t t e l u s s a + r a d i o h a a s t a t t e l u u n + r a d i o h i i l i a j o i t u s + r a d i o h i l j a i s u u s + r a d i o h o r i s o n t t i + r a d i o h ä i r i n n ä n + r a d i o h ä i r i n t ä + r a d i o h ä i r i ö i d e n + r a d i o i s o t o o p p i n e n + r a d i o i t a + r a d i o j u o n t a j a + r a d i o j ä r j e s t e l m ä + r a d i o j ä r j e s t e l m ä ä + r a d i o k a n a v a + r a d i o k a n a v a n + r a d i o k a n a v i a + r a d i o k a n a v i e n + r a d i o k a n a v i l t a + r a d i o k o n f e r e n s s i + r a d i o k o n f e r e n s s i n + r a d i o k o n f e r e n s s i t + r a d i o k o o m i k k o + r a d i o l a i t t e e t + r a d i o l a i t t e i d e n + r a d i o l ä h e t t i m e l l ä + r a d i o l ä h e t y k s e t + r a d i o l ä h e t y k s i s s ä + r a d i o l ä h e t y k s i ä + r a d i o l ä h e t y s a s i o i d e n + r a d i o l ä h e t y s t e n + r a d i o l ä h e t y s t o i m i n n a n + r a d i o l ä h e t y s t o i m i n t a + r a d i o m a i n o n t a + r a d i o m a j a k k a + r a d i o m a s t o + r a d i o m i e t i n t ö j ä + r a d i o m i k r o f o n e i s t a + r a d i o m ä k i + r a d i o n + r a d i o n a v i g o i n n i n + r a d i o n a v i g o i n t i a + r a d i o n a v i g o i n t i j ä r j e s t e l m i e n + r a d i o n a v i g o i n t i j ä r j e s t e l m ä n + r a d i o s a r j o j a + r a d i o s i g n a a l i + r a d i o s p e k t r i + r a d i o s p e k t r i a s i a s t a + r a d i o s p e k t r i n + r a d i o s p e k t r i p o l i t i i k a n + r a d i o s p e k t r i p o l i t i i k k a a + r a d i o s p e k t r i ä + r a d i o s s a + r a d i o s t a + r a d i o s u u n t i m a + r a d i o t a + r a d i o t a a j u u d e l l a + r a d i o t a a j u u d e t + r a d i o t a a j u u k s i a + r a d i o t a a j u u k s i e n + r a d i o t a a j u u k s i i n + r a d i o t a a j u u k s i s t a + r a d i o t a a j u u s + r a d i o t a a j u u s a l u e e t + r a d i o t a a j u u s j ä r j e s t e l m ä n + r a d i o t a a j u u s k a i s t a t + r a d i o t a a j u u s k y s y m y k s e s t ä + r a d i o t a a j u u s k y s y m y k s i s s ä + r a d i o t a a j u u s o h j e l m a a + r a d i o t a a j u u s p o l i i t t i n e n + r a d i o t a a j u u s p o l i i t t i s e n + r a d i o t a a j u u s p o l i i t t i s e s t a + r a d i o t a a j u u s p o l i i t t i s t a + r a d i o t a a j u u s p o l i t i i k a l l e m m e + r a d i o t a a j u u s p o l i t i i k a n + r a d i o t a a j u u s p o l i t i i k a s t a + r a d i o t a a j u u s p o l i t i i k k a + r a d i o t a a j u u s p o l i t i i k k a a + r a d i o t a a j u u s p o l i t i i k k a a n + r a d i o t a a j u u s p ä ä t ö k s e e n + r a d i o t a a j u u s p ä ä t ö k s e n + r a d i o t a a j u u s p ä ä t ö k s e s s ä + r a d i o t a a j u u s p ä ä t ö s + r a d i o t a a j u u s t e h o k k u u d e s t a + r a d i o t a a j u u s t u n n i s t u k s e n + r a d i o t a a j u u s t u n n i s t u k s i l l a + r a d i o t a a j u u s t u n n i s t u s + r a d i o t e l e s k o o p p i + r a d i o t i e d o t u s j ä r j e s t e l m ä ä + r a d i o t i e t e e n + r a d i o t ä h t i t i e d e + r a d i o u u t i s l ä h e t y k s i l l e + r a d i o v i e s t i n n ä s t ä + r a d i o v i e s t i n t ä a l a n + r a d i o v i e s t i n t ä k o n f e r e n s s i s s a + r a d i o v i e s t i n t ä v i r a s t o + r a d i o v i e s t i n t ä ä + r a d i o y h t e y d e s s ä + r a d i o y h t e y k s i ä + r a d i o y h t i ö + r a d i o y h t i ö i d e n + r a d i u m k l o r i d i + r a d o n m i t t a u k s i i n + r a d u r a + r a e s o k e r i + r a h a a + r a h a a m m e + r a h a a n + r a h a a n i + r a h a d i k t a t u u r i a + r a h a h a l l i n n o l l e + r a h a h a n a t + r a h a h a n k k e e n s a + r a h a i n d i k a a t t o r i t + r a h a i n s t i t u u t t i + r a h a j ä r j e s t e l m i e n + r a h a j ä r j e s t e l m ä + r a h a j ä r j e s t e l m ä n + r a h a j ä r j e s t e l m ä s s ä + r a h a j ä r j e s t e l m ä s t ä + r a h a j ä r j e s t e l m ä ä + r a h a j ä r j e s t e l m ä ä n + r a h a j ä r j e s t e l y + r a h a k a n a v a k s i + r a h a k a s o i l l a + r a h a k a s v i + r a h a k e s k u k s i i n + r a h a k e s k u s t e l u a + r a h a k i r s t u i s t a + r a h a k i r s t u n s a + r a h a k i r s t u s t a + r a h a k k e e t + r a h a k o m i t e a + r a h a k o m i t e a a + r a h a k o r t i t + r a h a k r i i s e j ä + r a h a k r i i s i + r a h a k r i i s i n + r a h a k r i i s i s s ä + r a h a k r i i s i t + r a h a k s i + r a h a k u s t a n n u s t e n + r a h a k y s y m y k s e e n + r a h a k y s y m y k s i s t ä + r a h a k y s y m y s + r a h a k y s y m y s t e n + r a h a l a i t o k s e n + r a h a l a i t o k s e t + r a h a l a i t o k s i a + r a h a l a i t o k s i l l a + r a h a l a i t o k s i l l e + r a h a l a i t o k s i s s a + r a h a l a i t o s + r a h a l a i t o s t e m m e + r a h a l a i t o s t e n + r a h a l i i k e n n e t i e t o j a + r a h a l i i k e n n e t i e t o j e n + r a h a l i i k e n n e t t ä + r a h a l i i k e n t e e n + r a h a l i i k e n t e e n s ä + r a h a l i i k e n t e e s s ä + r a h a l i i k e n t e e s t ä + r a h a l i i k k e i s t ä + r a h a l i i t o + r a h a l i i t o i s s a + r a h a l i i t o k s i + r a h a l i i t o l l a + r a h a l i i t o l l e + r a h a l i i t o n + r a h a l i i t o n k i n + r a h a l i i t o s s a + r a h a l i i t o s t a + r a h a l i i t o t + r a h a l i i t t o + r a h a l i i t t o a + r a h a l i i t t o h a n k e + r a h a l i i t t o i h i n + r a h a l i i t t o k i n + r a h a l i i t t o o n + r a h a l i i t t o p r o s e s s i s s a + r a h a l l a + r a h a l l e + r a h a l l i s e l l a + r a h a l l i s e s t a + r a h a l l i s e t + r a h a l l i s i a + r a h a l l i s i n + r a h a l l i s i s t a + r a h a l l i s t a + r a h a l l i s t e n + r a h a l ä h e t y k s i n + r a h a l ä h e t y k s i s s ä + r a h a m a a i l m a + r a h a m a a i l m a n + r a h a m a r k k i n a + r a h a m a r k k i n a k o r k o + r a h a m a r k k i n a k o r k o j e n + r a h a m a r k k i n a p a n k e i s t a + r a h a m a r k k i n a p o l i t i i k a s s a + r a h a m a r k k i n a r a h a s t o i h i n + r a h a m a r k k i n a t + r a h a m a r k k i n a t a p a h t u m a t + r a h a m a r k k i n a v a l v o j i e n + r a h a m a r k k i n a v ä l i n e i s i i n + r a h a m a r k k i n o i d e n + r a h a m a r k k i n o i h i n + r a h a m a r k k i n o i l l a + r a h a m a r k k i n o i l l e + r a h a m a r k k i n o i l t a + r a h a m a r k k i n o i s t a + r a h a m a r k k i n o i t a + r a h a m i e h e t + r a h a m i n i s t e r e i t ä + r a h a m i n i s t e r i + r a h a m i n i s t e r i l l e + r a h a m i n i s t e r i n n e + r a h a m m e + r a h a m u l l i s t u k s e n + r a h a m y r s k y j ä + r a h a m ä ä r i e n + r a h a m ä ä r i i n + r a h a m ä ä r i n ä + r a h a m ä ä r i s t ä + r a h a m ä ä r i ä + r a h a m ä ä r ä + r a h a m ä ä r ä l l ä + r a h a m ä ä r ä l t ä + r a h a m ä ä r ä n + r a h a m ä ä r ä s s ä + r a h a m ä ä r ä s t ä + r a h a m ä ä r ä t + r a h a m ä ä r ä ä + r a h a m ä ä r ä ä n + r a h a n + r a h a n a + r a h a n a h n e u t t a + r a h a n a r v o + r a h a n a r v o i s i a + r a h a n a r v o i s i i n + r a h a n a r v o n + r a h a n a r v o o n + r a h a n a r v o p o l i t i i k k a + r a h a n h a a s k a u s t a + r a h a n h a a s k u u t a + r a h a n h i m o + r a h a n h i m o n + r a h a n h u k a n + r a h a n h u k k a a + r a h a n j a k o a u t o m a a t t i + r a h a n j a o n + r a h a n k e r u u t a + r a h a n k i e r r o n + r a h a n k ä y t t ö + r a h a n k ä y t t ö k u l t t u u r i a + r a h a n k ä y t t ö m m e + r a h a n k ä y t t ö n ä + r a h a n k ä y t t ö o h j e l m a + r a h a n k ä y t t ö o h j e l m i a + r a h a n k ä y t t ö p e r i a a t t e i t a + r a h a n k ä y t t ö t a p o i h i n + r a h a n k ä y t t ö t a p o j a + r a h a n k ä y t t ö t a v o i s t a m m e + r a h a n k ä y t t ö v i r h e i t ä + r a h a n k ä y t t ö ä + r a h a n k ä y t t ö ä ä n + r a h a n k ä y t t ö ö n + r a h a n k ä y t ö l l e + r a h a n k ä y t ö l l ä + r a h a n k ä y t ö n + r a h a n k ä y t ö s t ä + r a h a n k ä y t ö s t ä m m e + r a h a n l a i n a a j i e n + r a h a n l a i n a u k s e e n + r a h a n l a i n a u s k e i n o j e n + r a h a n l i i k k e i d e n + r a h a n m e n e t y s t ä + r a h a n p e s i j ä t + r a h a n p e s u + r a h a n p e s u a + r a h a n p e s u d i r e k t i i v e i s t ä + r a h a n p e s u d i r e k t i i v i + r a h a n p e s u d i r e k t i i v i i n + r a h a n p e s u d i r e k t i i v i l l ä + r a h a n p e s u d i r e k t i i v i n + r a h a n p e s u d i r e k t i i v i s s ä + r a h a n p e s u d i r e k t i i v i s t ä + r a h a n p e s u d i r e k t i i v i ä + r a h a n p e s u e p ä i l y j ä + r a h a n p e s u k s i + r a h a n p e s u k y s y m y k s e n + r a h a n p e s u l a i n s ä ä d ä n n ö s t ä + r a h a n p e s u l l a + r a h a n p e s u l l e + r a h a n p e s u l t a + r a h a n p e s u m a f i a + r a h a n p e s u m a h d o l l i s u u k s i a + r a h a n p e s u m ä ä r ä y s t e n + r a h a n p e s u n + r a h a n p e s u o n g e l m a + r a h a n p e s u o n g e l m a a + r a h a n p e s u o p e r a a t i o i d e n + r a h a n p e s u r i k o k s e n + r a h a n p e s u s s a + r a h a n p e s u s t a + r a h a n p e s u t a p a u k s e n + r a h a n p e s u t a p o j e n + r a h a n p e s u t a r k o i t u k s e s s a + r a h a n p e s u t a r k o i t u k s i i n + r a h a n p e s u t a r k o i t u k s i s s a + r a h a n p e s u t e k n i i k o i t a + r a h a n p e s u t o i m e t + r a h a n p e s u t o i m i e n + r a h a n p e s u t o i m i n t a + r a h a n p e s u t o i m i n t a a + r a h a n p e s u t o i m i n t a a n + r a h a n p e s u t o i m i s t a + r a h a n p e s u t y ö r y h m ä n + r a h a n p e s u u n + r a h a n p r o s e s s i n + r a h a n p u u t e + r a h a n s a + r a h a n s i i r r o i s s a + r a h a n s i i r r o i s t a + r a h a n s i i r r o n + r a h a n s i i r r o t + r a h a n s i i r t e l y ä + r a h a n s i i r t o i h i n + r a h a n s i i r t o j a + r a h a n s i i r t o j e n + r a h a n s i i r t o o n + r a h a n s i i r t o u n i o n i a + r a h a n s i i r t o u n i o n i l l e + r a h a n s ä ä s t ö + r a h a n s ä ä s t ö s t ä + r a h a n s ä ä s t ö ö n + r a h a n t a r j o n n a n + r a h a n t e k i j ä + r a h a n t e k o j ä r j e s t e l m ä l l ä + r a h a n t e k o p r o s e s s i i n + r a h a n t e k o t a p o i h i n + r a h a n t u h l a u k s e l l e + r a h a n t u h l a u s + r a h a n t u h l a u s t a + r a h a n v a i h t o a u t o m a a t t i i n + r a h a n v a i h t o j a k s o + r a h a n v a i h t o o n + r a h a n v a i h t o t a v a l l a a n + r a h a n v a i h t o y h d i s t y s + r a h a n v a l l a n + r a h a n v a r t i j o i l l a + r a h a n v ä ä r e n n y k s e l t ä + r a h a n v ä ä r e n n y k s e n + r a h a n v ä ä r e n n ö s o n g e l m i a + r a h a n v ä ä r e n t ä j i l l e + r a h a n v ä ä r e n t ä j i l t ä + r a h a n v ä ä r e n t ä j i ä + r a h a n v ä ä r e n t ä j ä t + r a h a n v ä ä r e n t ä m i s e l t ä + r a h a n v ä ä r e n t ä m i s e n + r a h a n ä y t t ä m ö l l ä + r a h a o h j e l m a n + r a h a o n g e l m i i n + r a h a o s o i t u s t e n + r a h a p a i n o j e n + r a h a p a j o j e n + r a h a p a l k i n t o j a + r a h a p a l k i n t o j e n + r a h a p a l k k i o i t a + r a h a p a l v e l u j a + r a h a p a l v e l u m a r k k i n o i d e n + r a h a p e l e j ä + r a h a p e l i a l a + r a h a p e l i a l a n + r a h a p e l i a s i o i s s a + r a h a p e l i a u t o m a a t t i + r a h a p e l i e n + r a h a p e l i i n s ä + r a h a p e l i j ä r j e s t e l m ä t + r a h a p e l i l a i n s ä ä d ä n t ö ä ä n + r a h a p e l i l i s e n s s e j ä + r a h a p e l i m a h d o l l i s u u k s i a + r a h a p e l i m a i n o n t a + r a h a p e l i m a r k k i n a t + r a h a p e l i m a r k k i n o i d e n + r a h a p e l i m a r k k i n o i l l a + r a h a p e l i m a r k k i n o i l l e + r a h a p e l i m a r k k i n o i s t a + r a h a p e l i m a r k k i n o i t a + r a h a p e l i m a r k k i n o i t a a n + r a h a p e l i m o n o p o l i + r a h a p e l i m o n o p o l i e n + r a h a p e l i m o n o p o l i n + r a h a p e l i m o n o p o l i s t a a n + r a h a p e l i m u o d o i l t a + r a h a p e l i p a l v e l u i d e n + r a h a p e l i p a l v e l u i h i n + r a h a p e l i p a l v e l u i s s a + r a h a p e l i p a l v e l u i s t a + r a h a p e l i p a l v e l u i t a + r a h a p e l i p a l v e l u j a + r a h a p e l i p a l v e l u j e n + r a h a p e l i p a l v e l u t + r a h a p e l i p o l i t i i k a s t a + r a h a p e l i p o l i t i i k k a a + r a h a p e l i p o l i t i i k k a a n + r a h a p e l i r i i p p u v u u d e s t a + r a h a p e l i s e k t o r i a + r a h a p e l i s e k t o r i i n + r a h a p e l i s i v u s t o j a + r a h a p e l i t + r a h a p e l i t a r j o u k s i a + r a h a p e l i t e o l l i s u u s + r a h a p e l i t o i m i n n a n + r a h a p e l i t o i m i n n a s t a + r a h a p e l i t o i m i n n o t + r a h a p e l i t o i m i n t a + r a h a p e l i t o i m i n t a a + r a h a p e l i t o i m i n t a a n + r a h a p e s u u n + r a h a p i i r i i n + r a h a p o l i i t t i n e n + r a h a p o l i i t t i s e e n + r a h a p o l i i t t i s e l l e + r a h a p o l i i t t i s e n + r a h a p o l i i t t i s e s s a + r a h a p o l i i t t i s e s t a + r a h a p o l i i t t i s e s t i + r a h a p o l i i t t i s e t + r a h a p o l i i t t i s i a + r a h a p o l i i t t i s i i n + r a h a p o l i i t t i s i s s a + r a h a p o l i i t t i s i s t a + r a h a p o l i i t t i s t a + r a h a p o l i i t t i s t e n + r a h a p o l i t i i k a l l a + r a h a p o l i t i i k a l l a a n + r a h a p o l i t i i k a l l a k i n + r a h a p o l i t i i k a l l a m m e + r a h a p o l i t i i k a l l e + r a h a p o l i t i i k a l l e e n + r a h a p o l i t i i k a n + r a h a p o l i t i i k a n k i n + r a h a p o l i t i i k a s s a + r a h a p o l i t i i k a s s a a n + r a h a p o l i t i i k a s s a k a a n + r a h a p o l i t i i k a s s a m m e + r a h a p o l i t i i k a s t a + r a h a p o l i t i i k a s t a a n + r a h a p o l i t i i k a t + r a h a p o l i t i i k k a + r a h a p o l i t i i k k a a + r a h a p o l i t i i k k a a m m e + r a h a p o l i t i i k k a a n + r a h a p o l i t i i k k a a n s a + r a h a p o l i t i i k k a k a a n + r a h a p o l i t i i k k a m m e + r a h a p o l i t i i k k a n s a + r a h a p o l i t i i k k o i h i n + r a h a p o l i t i i k k o j a + r a h a p o l i t i i k k o j e n + r a h a p o l i t i i k o i s t a + r a h a p r o j e k t i n a + r a h a p u l a + r a h a p u l a a + r a h a p u o l e l l a + r a h a p u s s e j a + r a h a p u s s i t + r a h a p u u + r a h a p y y n t ö j e n + r a h a r e i k ä + r a h a r e i ä k s i + r a h a r i i t o j a + r a h a r u i s k e + r a h a r u i s k e i l l a + r a h a s a m p o + r a h a s i i r r o i k s i + r a h a s i i r r o i n + r a h a s i i r t o j a + r a h a s i i r t o j e n + r a h a s s a + r a h a s t a a + r a h a s t o a + r a h a s t o a l a + r a h a s t o a l a l l a + r a h a s t o a l a n + r a h a s t o a l a s t a + r a h a s t o a s e t u k s e n + r a h a s t o a s e t u k s e s s a + r a h a s t o a s e t u k s e s t a + r a h a s t o a s e t u k s i a + r a h a s t o a s e t u s + r a h a s t o a s e t u s t a + r a h a s t o h a n k k e i d e n + r a h a s t o i h i n + r a h a s t o i l l e + r a h a s t o i n t i j ä r j e s t e l m i e n + r a h a s t o i n t i j ä r j e s t e l m i ä + r a h a s t o i n t i j ä r j e s t e l m ä + r a h a s t o i s s a + r a h a s t o i s t a + r a h a s t o j a + r a h a s t o j e n + r a h a s t o j ä r j e s t e l m ä s s ä + r a h a s t o k s i + r a h a s t o k y s y m y k s e t + r a h a s t o l l a + r a h a s t o l l e + r a h a s t o m a l l i n + r a h a s t o m a r k k i n o i l l e + r a h a s t o m e n o j e n + r a h a s t o n + r a h a s t o n h a l l i n n a s s a + r a h a s t o n h o i t a j a + r a h a s t o n h o i t a j i e n + r a h a s t o n h o i t a j i l l e + r a h a s t o o n + r a h a s t o s i i r r o i s t a + r a h a s t o s p o n s o r i e n + r a h a s t o s s a + r a h a s t o s t a + r a h a s t o t + r a h a s t o t a p p i o i t a + r a h a s t o v a r o i s t a + r a h a s t o v a r o j e n + r a h a s t o y h t i ö + r a h a s t o y h t i ö i d e n + r a h a s t o y h t i ö i t ä + r a h a s t o y h t i ö t + r a h a s t u s m e k a n i s m e i h i n + r a h a s t u s t a + r a h a s u h t e i s s a + r a h a s u m m a + r a h a s u m m a a + r a h a s u m m a l l a + r a h a s u m m a l l e + r a h a s u m m a n + r a h a s u m m a s t a + r a h a s u m m a t + r a h a s u m m i a + r a h a s u m m i e n + r a h a s u m m i i n + r a h a s u m m i s t a + r a h a s ä i l i ö n + r a h a s ä k i n + r a h a s ä ä s t ö j ä + r a h a t + r a h a t a l l e t u k s i a + r a h a t a l o u d e l l i n e n + r a h a t a l o u d e l l i s e n + r a h a t a l o u d e l l i s e s t a + r a h a t a l o u d e l l i s e t + r a h a t a l o u d e l l i s i a + r a h a t a l o u d e l l i s i s t a + r a h a t a l o u d e l l i s t e n + r a h a t a l o u d e n + r a h a t a l o u s + r a h a t a l o u s a l u e i t a + r a h a t a l o u s j ä r j e s t e l m ä n + r a h a t a l o u s k r i i s i i n + r a h a t a l o u s m a r k k i n o i d e n + r a h a t a l o u s p o l i t i i k a n + r a h a t a l o u s t o i m i s t a + r a h a t a l o u t e e n + r a h a t a l o u t t a + r a h a t i l a n n e t t a + r a h a t i l a s t o j e n + r a h a t i l a s t o t + r a h a t u e t + r a h a t u k i a + r a h a t u n n u k s e t + r a h a t u o t t e e t + r a h a u n i o n i + r a h a u n i o n i a + r a h a u n i o n i n + r a h a u u d i s t u s + r a h a v a i k e u k s i i n + r a h a v a i k e u k s i s t a + r a h a v a k u u d e n + r a h a v a k u u k s i a + r a h a v a k u u k s i e n + r a h a v a k u u k s i s t a + r a h a v a k u u s j ä r j e s t e l m ä n + r a h a v a k u u s t o d i s t u k s e n + r a h a v a k u u s t o d i s t u s t a + r a h a v a k u u s v ä l i n e i d e n + r a h a v a k u u t t a + r a h a v a l i o k u n n a n + r a h a v a l l a n + r a h a v a l l a n k u m o u s + r a h a v a l t a + r a h a v a r a l l i s u u s + r a h a v a r a n n o n + r a h a v a r a n s a + r a h a v a r a n t o + r a h a v a r a n t o a + r a h a v a r a n t o j e n + r a h a v a r a t + r a h a v a r a u k s e t + r a h a v a r o i h i n + r a h a v a r o i l l a + r a h a v a r o i n + r a h a v a r o i s t a + r a h a v a r o j a + r a h a v a r o j e n + r a h a v i r a n o m a i n e n + r a h a v i r a n o m a i s e t + r a h a v i r a n o m a i s t e n + r a h a v i r r a t + r a h a v i r r o i s t a + r a h a v i r t a + r a h a v i r t a a + r a h a v i r t a a n + r a h a v i r t a o n g e l m i a + r a h a v i r t o i n e e n + r a h a v i r t o j a + r a h a v i r t o j a a n + r a h a v i r t o j e n + r a h a v u o d o t + r a h a v y ö + r a h a v y ö h y k k e e n + r a h a v ä l i n e t t ä + r a h a y h t e i s t y ö + r a h a y h t e i s t y ö s s ä + r a h a y h t e i s ö n + r a h a y k s i k k ö + r a h a y k s i k k ö n ä + r a h a y k s i k ö i h i n + r a h a y k s i k ö n + r a h d i n + r a h d i n a n t a j a t + r a h d i n k u l j e t t a j a t + r a h d i n k u l j e t t a j i a + r a h d i n k u l j e t t a j i e n + r a h d i n k u l j e t t a j i i n + r a h d i n k ä s i t t e l y p a l v e l u j e n + r a h d i n k ä s i t t e l y y n + r a h k a h o p e a t ä p l ä + r a h k a k y n s i k ä s + r a h k a s a r a + r a h o i l l a + r a h o i l l a a n + r a h o i l l e + r a h o i l l e e n + r a h o i s t a + r a h o i t e t a + r a h o i t e t a a n + r a h o i t e t a a n k o + r a h o i t e t t a i s i i n + r a h o i t e t t a v a + r a h o i t e t t a v a a + r a h o i t e t t a v i e n + r a h o i t e t t a v i s s a + r a h o i t e t t a v i s t a + r a h o i t e t t i i n + r a h o i t e t t u a + r a h o i t e t t u i h i n + r a h o i t e t t u j e n + r a h o i t e t t u u n + r a h o i t e t u i l l e + r a h o i t e t u i s t a + r a h o i t e t u s t a + r a h o i t t a a + r a h o i t t a a k s e e n + r a h o i t t a a k s e m m e + r a h o i t t a a k s e n n e + r a h o i t t a e s s a a n + r a h o i t t a j a a + r a h o i t t a j a k o n f e r e n s s i i n + r a h o i t t a j a k o n f e r e n s s i n + r a h o i t t a j a l ä h t ö i s i ä + r a h o i t t a j a m a a + r a h o i t t a j a m a a t + r a h o i t t a j a m a i d e n + r a h o i t t a j a m a i h i n + r a h o i t t a j a m a i l l a + r a h o i t t a j a m a i s s a + r a h o i t t a j a n + r a h o i t t a j a n a + r a h o i t t a j a o r g a n i s a a t i o i d e n + r a h o i t t a j a p o l i t i i k a s t a + r a h o i t t a j a r y h m i l l e + r a h o i t t a j a r y h m ä n + r a h o i t t a j a r y h m ä s t ä + r a h o i t t a j a t + r a h o i t t a j a v a l t i o i d e n + r a h o i t t a j a y h t e i s ö + r a h o i t t a j a y h t e i s ö l t ä + r a h o i t t a j i a + r a h o i t t a j i e n + r a h o i t t a j i l l e + r a h o i t t a m a a n + r a h o i t t a m a l l a + r a h o i t t a m a t t a + r a h o i t t a m i s e e n + r a h o i t t a m i s e k s i + r a h o i t t a m i s e l l e + r a h o i t t a m i s e n + r a h o i t t a m i s e s s a + r a h o i t t a m i s e s t a + r a h o i t t a m i s k e i n o j e n + r a h o i t t a m i s m a h d o l l i s u u d e t + r a h o i t t a m i s o n g e l m i a + r a h o i t t a m i s o n g e l m i i n + r a h o i t t a m i s p r o s e s s i n + r a h o i t t a m i s p ä ä t ö k s e s t ä + r a h o i t t a m i s t a + r a h o i t t a m i s t a v a n + r a h o i t t a n e e t + r a h o i t t a v a t + r a h o i t t a v i a + r a h o i t t i + r a h o i t u k s e e n + r a h o i t u k s e l l a + r a h o i t u k s e l l e + r a h o i t u k s e l l i s e s s a + r a h o i t u k s e l l i s e s t i + r a h o i t u k s e l l i s e t + r a h o i t u k s e l l i s i a + r a h o i t u k s e l l i s i s t a + r a h o i t u k s e l l i s t a + r a h o i t u k s e l l i s t e n + r a h o i t u k s e n + r a h o i t u k s e n h i m o + r a h o i t u k s e n s a + r a h o i t u k s e n s a a j i e n + r a h o i t u k s e n s a a n n i n + r a h o i t u k s e n s a a n t i a + r a h o i t u k s e n v a k a u s m e k a n i s m i a + r a h o i t u k s e n v a k a u s m e k a n i s m i n + r a h o i t u k s e n v a k a u t u k s e n + r a h o i t u k s e n v a k a u t u s m e k a n i s m i + r a h o i t u k s e n v a k a u t u s m e k a n i s m i a + r a h o i t u k s e n v a k a u t u s m e k a n i s m i i n + r a h o i t u k s e n v a k a u t u s m e k a n i s m i n + r a h o i t u k s e n v ä l i t t ä j i e n + r a h o i t u k s e s s a + r a h o i t u k s e s t a + r a h o i t u k s e s t a m m e + r a h o i t u s a i k a t a u l u j e n + r a h o i t u s a j a n j a k s o a + r a h o i t u s a j a n j a k s o l l a + r a h o i t u s a j a n j a k s o o n + r a h o i t u s a l a + r a h o i t u s a l a a + r a h o i t u s a l a a n + r a h o i t u s a l a l l a + r a h o i t u s a l a l l e + r a h o i t u s a l a l t a + r a h o i t u s a l a m m e + r a h o i t u s a l a n + r a h o i t u s a l a n s a + r a h o i t u s a l a s t a + r a h o i t u s a l o i h i n + r a h o i t u s a l o i l l a + r a h o i t u s a l o i l l e + r a h o i t u s a l o i n e e n + r a h o i t u s a l o i t e t t a + r a h o i t u s a l o i t t e e t + r a h o i t u s a l o i t t e i d e n + r a h o i t u s a l o i t t e i t a + r a h o i t u s a l o j a + r a h o i t u s a n a l y y s i e n + r a h o i t u s a n a l y y s i n + r a h o i t u s a n a l y y s i t + r a h o i t u s a n a l y y s i ä + r a h o i t u s a n a l y y t i k k o j a + r a h o i t u s a n a l y y t i k k o j e n + r a h o i t u s a n a l y y t i k o i h i n + r a h o i t u s a n a l y y t i k o t + r a h o i t u s a p u + r a h o i t u s a p u a + r a h o i t u s a p u j a + r a h o i t u s a p u j e n + r a h o i t u s a p u j ä r j e s t e l y j ä + r a h o i t u s a p u l a i n a + r a h o i t u s a p u n a + r a h o i t u s a p u o h j e l m i a + r a h o i t u s a p u p a k e t i s t a + r a h o i t u s a p u p a k e t t i a + r a h o i t u s a p u u n + r a h o i t u s a p u v ä l i n e i d e n + r a h o i t u s a p u v ä l i n e i n + r a h o i t u s a r k k i t e h t u u r i + r a h o i t u s a r k k i t e h t u u r i a + r a h o i t u s a r k k i t e h t u u r i n + r a h o i t u s a r t i k l a a + r a h o i t u s a r v i o i n n i s t a + r a h o i t u s a r v i o i n t i + r a h o i t u s a r v i o i s t a + r a h o i t u s a r v i o l u o n n o k s e n s a + r a h o i t u s a r v i o t a + r a h o i t u s a r v o n + r a h o i t u s a s e m a + r a h o i t u s a s e m a a + r a h o i t u s a s e m a a n + r a h o i t u s a s e m a n + r a h o i t u s a s e m a n s a + r a h o i t u s a s e m a s t a + r a h o i t u s a s e t u k s e e n + r a h o i t u s a s e t u k s e k s i + r a h o i t u s a s e t u k s e n + r a h o i t u s a s e t u k s e s s a + r a h o i t u s a s e t u k s e s t a + r a h o i t u s a s e t u k s e t + r a h o i t u s a s e t u k s i a + r a h o i t u s a s e t u k s i s s a + r a h o i t u s a s e t u s + r a h o i t u s a s e t u s t a + r a h o i t u s a s e t u s t e n + r a h o i t u s a s i a n t u n t i j o i d e n + r a h o i t u s a s i a n t u n t i j o i t a + r a h o i t u s a s i a t + r a h o i t u s a s i o i d e n + r a h o i t u s a s i o i h i n + r a h o i t u s a s i o i s s a + r a h o i t u s a s i o i s t a + r a h o i t u s a s i o i t a + r a h o i t u s a s t e e n + r a h o i t u s a s t e t t a + r a h o i t u s a u k k o i h i n + r a h o i t u s a v u l l a + r a h o i t u s a v u l l a m m e + r a h o i t u s a v u l l e + r a h o i t u s a v u n + r a h o i t u s a v u s s a + r a h o i t u s a v u s t a + r a h o i t u s a v u s t u k s i a + r a h o i t u s d i r e k t i i v e i s t ä + r a h o i t u s e d e l l y t y k s e t + r a h o i t u s e d e l l y t y k s i s s ä + r a h o i t u s e d e l l y t y s t e n + r a h o i t u s e d u n + r a h o i t u s e d u t + r a h o i t u s e h d o i s s a + r a h o i t u s e h d o i s t a + r a h o i t u s e h d o t + r a h o i t u s e h d o t u k s e n + r a h o i t u s e h d o t u k s e n s a + r a h o i t u s e h d o t u k s e t + r a h o i t u s e h d o t u k s i a + r a h o i t u s e h d o t u k s i s t a + r a h o i t u s e h d o t u s + r a h o i t u s e h d o t u s t a + r a h o i t u s e h d o t u s t e n + r a h o i t u s e h t o j a + r a h o i t u s e h t o j e n + r a h o i t u s e l i m e n + r a h o i t u s e l i m e t + r a h o i t u s e l i m i l t ä + r a h o i t u s e l i m i s s ä + r a h o i t u s e l i n t e n + r a h o i t u s e n n u s t e i d e n + r a h o i t u s e n n u s t e i s i i n + r a h o i t u s e n n u s t e i t a + r a h o i t u s e n n u s t e t t a m m e + r a h o i t u s e p ä t a s a p a i n o + r a h o i t u s e p ä t a s a p a i n o o n + r a h o i t u s e r i ä + r a h o i t u s e r ä ä + r a h o i t u s e s i t y k s e t + r a h o i t u s e s i t y s t ä + r a h o i t u s e s t e i t ä + r a h o i t u s e t u j e n + r a h o i t u s f i a s k o o n + r a h o i t u s f o o r u m i + r a h o i t u s f o o r u m i n + r a h o i t u s f u t u u r i s o p i m u k s e t + r a h o i t u s f u t u u r i s o p i m u k s i i n + r a h o i t u s h a i t + r a h o i t u s h a k e m u k s e t + r a h o i t u s h a k e m u k s i i n + r a h o i t u s h a k e m u s k i e r r o s t a + r a h o i t u s h a k e m u s t a + r a h o i t u s h a k e m u s t e n + r a h o i t u s h a l l i n n o l l e + r a h o i t u s h a l l i n n o n + r a h o i t u s h a l l i n n o s s a + r a h o i t u s h a l l i n n o s t a + r a h o i t u s h a l l i n t a j ä r j e s t e l m ä ä + r a h o i t u s h a l l i n t o + r a h o i t u s h a l l i n t o a + r a h o i t u s h a l l i n t o j ä r j e s t e l m i ä + r a h o i t u s h a l l i n t o o n + r a h o i t u s h a n k e t t a + r a h o i t u s h a n k k e i d e n + r a h o i t u s h a n k k e i l l e + r a h o i t u s h a n k k e i s s a + r a h o i t u s h a n k k e i s t a + r a h o i t u s h a n k k e i t a + r a h o i t u s h e r k k u j a + r a h o i t u s h u i j a r e i d e n + r a h o i t u s h u i p p u k o k o u k s e s s a + r a h o i t u s h ä i r i ö t + r a h o i t u s i d e o i d e n + r a h o i t u s i n f r a s t r u k t u u r i l l e + r a h o i t u s i n n o v a a t i o t + r a h o i t u s i n s t i t u u t i o i s s a + r a h o i t u s i n s t i t u u t i o n + r a h o i t u s i n s t i t u u t t i + r a h o i t u s i n s t r u m e n t e i s t a + r a h o i t u s i n s t r u m e n t i l l a + r a h o i t u s i n s t r u m e n t i l l e + r a h o i t u s i n s t r u m e n t i t + r a h o i t u s i n s t r u m e n t t e i h i n + r a h o i t u s i n s t r u m e n t t e j a + r a h o i t u s i n s t r u m e n t t i + r a h o i t u s i n s t r u m e n t t i e n + r a h o i t u s i n t e r v e n t i o i s t a + r a h o i t u s i n t r e s s e i l l e + r a h o i t u s i n t r e s s i e n + r a h o i t u s i n v e s t o i n n e i l l a + r a h o i t u s i n v e s t o i n n i t + r a h o i t u s i n v e s t o i n t e j a + r a h o i t u s j a k s o a + r a h o i t u s j a k s o l l a + r a h o i t u s j o h d a n n a i s e t + r a h o i t u s j o h d a n n a i s i i n + r a h o i t u s j o h d a n n a i s i s t a + r a h o i t u s j o h d a n n a i s t e n + r a h o i t u s j o h t a j i e n + r a h o i t u s j ä n n i t t e i t ä + r a h o i t u s j ä r j e s t e l m i e m m e + r a h o i t u s j ä r j e s t e l m i e n + r a h o i t u s j ä r j e s t e l m i i n + r a h o i t u s j ä r j e s t e l m i k s i + r a h o i t u s j ä r j e s t e l m i l l e + r a h o i t u s j ä r j e s t e l m i s s ä + r a h o i t u s j ä r j e s t e l m i s s ä m m e + r a h o i t u s j ä r j e s t e l m i s t ä + r a h o i t u s j ä r j e s t e l m i ä + r a h o i t u s j ä r j e s t e l m ä + r a h o i t u s j ä r j e s t e l m ä l l e + r a h o i t u s j ä r j e s t e l m ä l l ä + r a h o i t u s j ä r j e s t e l m ä m m e + r a h o i t u s j ä r j e s t e l m ä n + r a h o i t u s j ä r j e s t e l m ä n s ä + r a h o i t u s j ä r j e s t e l m ä s s ä + r a h o i t u s j ä r j e s t e l m ä s s ä k i n + r a h o i t u s j ä r j e s t e l m ä s t ä + r a h o i t u s j ä r j e s t e l m ä s t ä m m e + r a h o i t u s j ä r j e s t e l m ä t + r a h o i t u s j ä r j e s t e l m ä ä + r a h o i t u s j ä r j e s t e l m ä ä m m e + r a h o i t u s j ä r j e s t e l m ä ä n + r a h o i t u s j ä r j e s t e l m ä ä n s ä + r a h o i t u s j ä r j e s t e l y + r a h o i t u s j ä r j e s t e l y i d e n + r a h o i t u s j ä r j e s t e l y i h i n + r a h o i t u s j ä r j e s t e l y i k s i + r a h o i t u s j ä r j e s t e l y i l l ä + r a h o i t u s j ä r j e s t e l y i n + r a h o i t u s j ä r j e s t e l y i s s ä + r a h o i t u s j ä r j e s t e l y i s t ä + r a h o i t u s j ä r j e s t e l y i t ä + r a h o i t u s j ä r j e s t e l y j e n + r a h o i t u s j ä r j e s t e l y j ä + r a h o i t u s j ä r j e s t e l y m m e + r a h o i t u s j ä r j e s t e l y n + r a h o i t u s j ä r j e s t e l y s t ä + r a h o i t u s j ä r j e s t e l y t + r a h o i t u s j ä r j e s t e l y t e k n i i k o i t a + r a h o i t u s j ä r j e s t e l y t o i m i e n + r a h o i t u s j ä r j e s t e l y ä + r a h o i t u s j ä r j e s t ö + r a h o i t u s j ä r j e s t ö i s s ä + r a h o i t u s j ä r j e s t ö j e n + r a h o i t u s j ä r j e s t ö t + r a h o i t u s j ä t t i e n + r a h o i t u s k a n a v a n + r a h o i t u s k a n a v a n s a + r a h o i t u s k a n a v a t + r a h o i t u s k a n a v i a + r a h o i t u s k a n a v i e n + r a h o i t u s k a n n u s t i m i a + r a h o i t u s k a p a s i t e e t t i + r a h o i t u s k a p a s i t e e t t i a + r a h o i t u s k a p a s i t e e t t i m m e + r a h o i t u s k a p i t a l i s m i + r a h o i t u s k a p i t a l i s m i n + r a h o i t u s k a r t e l l i e n + r a h o i t u s k a t a s t r o f i t + r a h o i t u s k a t o n + r a h o i t u s k a t o s t a + r a h o i t u s k a t s a u k s e s s a + r a h o i t u s k a u d e l l a + r a h o i t u s k a u d e l l e + r a h o i t u s k a u d e n + r a h o i t u s k a u d e s t a + r a h o i t u s k a u p a n + r a h o i t u s k a u t e e n + r a h o i t u s k a u t e n a + r a h o i t u s k a u t t a + r a h o i t u s k e h i t y k s e n + r a h o i t u s k e h i t y k s e s t ä + r a h o i t u s k e h y k s e e n + r a h o i t u s k e h y k s e k s i + r a h o i t u s k e h y k s e l l e + r a h o i t u s k e h y k s e l l ä + r a h o i t u s k e h y k s e m m e + r a h o i t u s k e h y k s e n + r a h o i t u s k e h y k s e s s ä + r a h o i t u s k e h y k s e s s ä h ä n + r a h o i t u s k e h y k s e s t ä + r a h o i t u s k e h y k s e t + r a h o i t u s k e h y k s i e n + r a h o i t u s k e h y k s i i n + r a h o i t u s k e h y k s i k s i + r a h o i t u s k e h y k s i l l e + r a h o i t u s k e h y k s i s s ä + r a h o i t u s k e h y k s i s t ä + r a h o i t u s k e h y k s i ä + r a h o i t u s k e h y s + r a h o i t u s k e h y s a s e t u k s e s s a + r a h o i t u s k e h y s j ä r j e s t e l m ä t + r a h o i t u s k e h y s n e u v o t t e l u i s s a + r a h o i t u s k e h y s n e u v o t t e l u j e n + r a h o i t u s k e h y s p a k e t i n + r a h o i t u s k e h y s p a k e t i s t a + r a h o i t u s k e h y s s o p i m u k s e n + r a h o i t u s k e h y s s o p i m u s + r a h o i t u s k e h y s t e n + r a h o i t u s k e h y s t ä + r a h o i t u s k e i n o + r a h o i t u s k e i n o i n e e n + r a h o i t u s k e i n o i s t a + r a h o i t u s k e i n o j a + r a h o i t u s k e i n o j e n + r a h o i t u s k e i n o t + r a h o i t u s k e i n o t t e l i j a t + r a h o i t u s k e i n o t t e l i j o i l l e + r a h o i t u s k e i n o t t e l i j o i l t a + r a h o i t u s k e i n o t t e l i j o i t a + r a h o i t u s k e i n o t t e l u + r a h o i t u s k e i n o t t e l u a + r a h o i t u s k e i n o t t e l u j e n + r a h o i t u s k e i n o t t e l u l l a + r a h o i t u s k e i n o t t e l u l t a + r a h o i t u s k e i n o t t e l u n + r a h o i t u s k e i n o t t e l u s t a + r a h o i t u s k e i n o t t e l u u n + r a h o i t u s k e l p o i s e t + r a h o i t u s k e l p o i s i a + r a h o i t u s k e r t o i m i l l a + r a h o i t u s k e r t o m u k s e s s a + r a h o i t u s k e r t o m u s + r a h o i t u s k e s k u k s e l l e + r a h o i t u s k e s k u k s e n a + r a h o i t u s k e s k u k s e t + r a h o i t u s k e s k u k s i a + r a h o i t u s k e s k u k s i i n + r a h o i t u s k e s k u k s i l l e + r a h o i t u s k e s k u k s i s s a + r a h o i t u s k e s k u s + r a h o i t u s k e s k u s t e l u + r a h o i t u s k e s k u s t e l u a + r a h o i t u s k e s k u s t e n + r a h o i t u s k i e l l o s t a + r a h o i t u s k i e r r o k s i l l a + r a h o i t u s k i i n t i ö i t ä + r a h o i t u s k i i n t i ö t + r a h o i t u s k i i s t a a + r a h o i t u s k i l p a i l u a + r a h o i t u s k o a l i t i o n + r a h o i t u s k o a l i t i o o n + r a h o i t u s k o h d e + r a h o i t u s k o h t e i s i i n + r a h o i t u s k o h t e i s t a + r a h o i t u s k o h t e i t a + r a h o i t u s k o k o n a i s u u d e s t a + r a h o i t u s k o k o n a i s u u s + r a h o i t u s k o k o u k s i s s a + r a h o i t u s k o k o u s + r a h o i t u s k o m i t e a + r a h o i t u s k o m i t e a a + r a h o i t u s k o m i t e a k s i + r a h o i t u s k o m i t e a l l a + r a h o i t u s k o m i t e a n + r a h o i t u s k o m i t e a s s a + r a h o i t u s k o m i t e a s t a + r a h o i t u s k o m p o n e n t t i + r a h o i t u s k o m p r o m i s s e j a + r a h o i t u s k o n e i s t o + r a h o i t u s k o n f e r e n s s i + r a h o i t u s k o n f e r e n s s i s s a + r a h o i t u s k o n f e r e n s s i s t a + r a h o i t u s k o n s e r n e i h i n + r a h o i t u s k o n s e r n e i l l e + r a h o i t u s k o n s e r n i + r a h o i t u s k o n s e r n i e n + r a h o i t u s k o n s e r n i n + r a h o i t u s k o n s e r n i s s a + r a h o i t u s k o n s e r n i t + r a h o i t u s k o o r d i n o i n t i a + r a h o i t u s k o r i n + r a h o i t u s k o r j a i l u a + r a h o i t u s k o r j a u k s e t + r a h o i t u s k o r j a u k s i a + r a h o i t u s k o r j a u k s i i n + r a h o i t u s k o r j a u k s i s t a + r a h o i t u s k o r j a u s + r a h o i t u s k o r j a u s m e n e t t e l y n + r a h o i t u s k o r j a u s m e n e t t e l y ä + r a h o i t u s k o r j a u s t e n + r a h o i t u s k o r v a u k s e n + r a h o i t u s k o r v a u s + r a h o i t u s k r i i s e i h i n + r a h o i t u s k r i i s e i l l e + r a h o i t u s k r i i s e i l t ä + r a h o i t u s k r i i s e i s s ä + r a h o i t u s k r i i s e i s t ä + r a h o i t u s k r i i s e j ä + r a h o i t u s k r i i s i + r a h o i t u s k r i i s i e n + r a h o i t u s k r i i s i i n + r a h o i t u s k r i i s i k s i + r a h o i t u s k r i i s i l l e + r a h o i t u s k r i i s i l l ä + r a h o i t u s k r i i s i l t ä + r a h o i t u s k r i i s i n + r a h o i t u s k r i i s i r y h m ä + r a h o i t u s k r i i s i s s ä + r a h o i t u s k r i i s i s s ä k i n + r a h o i t u s k r i i s i s t ä + r a h o i t u s k r i i s i t + r a h o i t u s k r i i s i t i l a n t e e s s a + r a h o i t u s k r i i s i ä + r a h o i t u s k r i t e e r e i s t ä + r a h o i t u s k u i l u a + r a h o i t u s k u i l u u n + r a h o i t u s k u l t t u u r e j a + r a h o i t u s k u l t t u u r i e n + r a h o i t u s k u l u i s t a + r a h o i t u s k u l u j e n + r a h o i t u s k u m p p a n i e n + r a h o i t u s k u m p p a n u u s + r a h o i t u s k u o r m i t u s + r a h o i t u s k u p l a + r a h o i t u s k u p l a s t a + r a h o i t u s k u r i + r a h o i t u s k u r i a + r a h o i t u s k u r i i n + r a h o i t u s k u r i n + r a h o i t u s k u s t a n n u k s e t + r a h o i t u s k u s t a n n u k s i a + r a h o i t u s k u s t a n n u k s i i n + r a h o i t u s k u s t a n n u k s i l l a + r a h o i t u s k u s t a n n u s t e n + r a h o i t u s k u v i o i h i n + r a h o i t u s k y n n y k s i ä + r a h o i t u s k y s y m y k s e e n + r a h o i t u s k y s y m y k s e n + r a h o i t u s k y s y m y k s e s s ä + r a h o i t u s k y s y m y k s e s t ä + r a h o i t u s k y s y m y k s e t + r a h o i t u s k y s y m y k s i i n + r a h o i t u s k y s y m y k s i s s ä + r a h o i t u s k y s y m y k s i s t ä + r a h o i t u s k y s y m y k s i ä + r a h o i t u s k y s y m y s + r a h o i t u s k y s y m y s t e n + r a h o i t u s k y s y m y s t ä + r a h o i t u s k ä s i k i r j a + r a h o i t u s k ä y t ä n n ö i l l ä + r a h o i t u s k ä y t ä n n ö i s t ä + r a h o i t u s k ä y t ä n n ö t + r a h o i t u s k ä y t ä n t ö j ä + r a h o i t u s l a i n s ä ä d ä n n ö s s ä + r a h o i t u s l a i n s ä ä d ä n n ö s s ä m m e + r a h o i t u s l a i n s ä ä d ä n t ö m m e + r a h o i t u s l a i n s ä ä d ä n t ö ä + r a h o i t u s l a i t o k s e k s i + r a h o i t u s l a i t o k s e l l e + r a h o i t u s l a i t o k s e m m e + r a h o i t u s l a i t o k s e n + r a h o i t u s l a i t o k s e n a + r a h o i t u s l a i t o k s e t + r a h o i t u s l a i t o k s i a + r a h o i t u s l a i t o k s i e m m e + r a h o i t u s l a i t o k s i e n + r a h o i t u s l a i t o k s i i n + r a h o i t u s l a i t o k s i i n s a + r a h o i t u s l a i t o k s i l l a + r a h o i t u s l a i t o k s i l l e + r a h o i t u s l a i t o k s i l t a + r a h o i t u s l a i t o k s i n a + r a h o i t u s l a i t o k s i s s a + r a h o i t u s l a i t o k s i s t a + r a h o i t u s l a i t o s + r a h o i t u s l a i t o s a l a l l a + r a h o i t u s l a i t o s t a + r a h o i t u s l a i t o s t e m m e + r a h o i t u s l a i t o s t e n + r a h o i t u s l a i t o s t y y p p e j ä + r a h o i t u s l a s k e l m a + r a h o i t u s l a s k e l m i e n + r a h o i t u s l a s k e l m i s t a + r a h o i t u s l e a s i n g i e n + r a h o i t u s l e i k k a u k s i a + r a h o i t u s l e i k k a u k s i s t a + r a h o i t u s l e i k k a u s t e n + r a h o i t u s l e v o t t o m u u k s i e n + r a h o i t u s l i i k e t o i m i l l e + r a h o i t u s l i i k e t o i m i s t a + r a h o i t u s l i i t o s t a + r a h o i t u s l i n j a u k s e s t a + r a h o i t u s l i n j a u k s i a + r a h o i t u s l i s ä + r a h o i t u s l i s ä ä n + r a h o i t u s l o g i i k k a + r a h o i t u s l u o k k i a + r a h o i t u s l u o t o n + r a h o i t u s l u o t t o j e n + r a h o i t u s l u p a u k s i s t a + r a h o i t u s l u p a u k s i s t a a n + r a h o i t u s l ä h d e + r a h o i t u s l ä h d e t t ä + r a h o i t u s l ä h t e e n + r a h o i t u s l ä h t e e n s ä + r a h o i t u s l ä h t e e n ä + r a h o i t u s l ä h t e e s e e n + r a h o i t u s l ä h t e e s t ä + r a h o i t u s l ä h t e e t + r a h o i t u s l ä h t e i d e n + r a h o i t u s l ä h t e i l l ä + r a h o i t u s l ä h t e i l t ä + r a h o i t u s l ä h t e i s i i n + r a h o i t u s l ä h t e i s t ä + r a h o i t u s l ä h t e i s t ä ä n + r a h o i t u s l ä h t e i t ä + r a h o i t u s l ä h t e i t ä m m e + r a h o i t u s l ä h t e i t ä ä n + r a h o i t u s m a a i l m a + r a h o i t u s m a a i l m a a + r a h o i t u s m a a i l m a a n + r a h o i t u s m a a i l m a l l e + r a h o i t u s m a a i l m a n + r a h o i t u s m a a i l m a s s a + r a h o i t u s m a a i l m a s t a + r a h o i t u s m a h d o l l i s u u d e t + r a h o i t u s m a h d o l l i s u u k s i a + r a h o i t u s m a h d o l l i s u u k s i e m m e + r a h o i t u s m a h d o l l i s u u k s i e n + r a h o i t u s m a h d o l l i s u u k s i e n s a + r a h o i t u s m a h d o l l i s u u k s i i n + r a h o i t u s m a h d o l l i s u u k s i s t a + r a h o i t u s m a h d o l l i s u u s + r a h o i t u s m a h t i e n + r a h o i t u s m a k s u i l l a + r a h o i t u s m a k s u j e n + r a h o i t u s m a l l e i s t a + r a h o i t u s m a l l e j a + r a h o i t u s m a l l i + r a h o i t u s m a l l i a + r a h o i t u s m a l l i e n + r a h o i t u s m a r g i n a a l i + r a h o i t u s m a r g i n a a l i a + r a h o i t u s m a r g i n a a l i e n + r a h o i t u s m a r g i n a a l i t + r a h o i t u s m a r k k i n a + r a h o i t u s m a r k k i n a d i r e k t i i v i n + r a h o i t u s m a r k k i n a d i r e k t i i v i s t ä + r a h o i t u s m a r k k i n a d i r e k t i i v i ä + r a h o i t u s m a r k k i n a h ä i r i ö i d e n + r a h o i t u s m a r k k i n a j ä r j e s t e l m ä + r a h o i t u s m a r k k i n a j ä r j e s t e l m ä n + r a h o i t u s m a r k k i n a j ä r j e s t e l m ä ä + r a h o i t u s m a r k k i n a k r i i s i + r a h o i t u s m a r k k i n a k r i i s i e n + r a h o i t u s m a r k k i n a k r i i s i n + r a h o i t u s m a r k k i n a l a i n s ä ä d ä n n ö n + r a h o i t u s m a r k k i n a l a i n s ä ä d ä n t ö ö n + r a h o i t u s m a r k k i n a m e k a n i s m i e n + r a h o i t u s m a r k k i n a m m e + r a h o i t u s m a r k k i n a o l o s u h t e i s s a + r a h o i t u s m a r k k i n a p a k e t i n + r a h o i t u s m a r k k i n a p a l v e l u j a + r a h o i t u s m a r k k i n a p e r u s t e i s i a + r a h o i t u s m a r k k i n a p o l i t i i k a l l e + r a h o i t u s m a r k k i n a r a k e n n e + r a h o i t u s m a r k k i n a r a k e n n e t t a + r a h o i t u s m a r k k i n a s e k t o r i l l a + r a h o i t u s m a r k k i n a s ä ä n n ö k s e t + r a h o i t u s m a r k k i n a s ä ä n t e l y n + r a h o i t u s m a r k k i n a s ä ä n t e l y ä + r a h o i t u s m a r k k i n a s ä ä n t ö j e n + r a h o i t u s m a r k k i n a s ä ä t e l y s t ä + r a h o i t u s m a r k k i n a t + r a h o i t u s m a r k k i n a t i l a n n e + r a h o i t u s m a r k k i n a t i l a n n e t t a + r a h o i t u s m a r k k i n a t o i m i a + r a h o i t u s m a r k k i n a t o i m i j a t + r a h o i t u s m a r k k i n a t u o t t e i d e n + r a h o i t u s m a r k k i n a u u d i s t u k s e n + r a h o i t u s m a r k k i n a v a l v o n n a n + r a h o i t u s m a r k k i n a v a l v o n n a s t a + r a h o i t u s m a r k k i n a v a l v o n t a a + r a h o i t u s m a r k k i n a v i r a n o m a i s t a + r a h o i t u s m a r k k i n a v ä l i n e i t ä + r a h o i t u s m a r k k i n o i d e m m e + r a h o i t u s m a r k k i n o i d e n + r a h o i t u s m a r k k i n o i h i m m e + r a h o i t u s m a r k k i n o i h i n + r a h o i t u s m a r k k i n o i l l a + r a h o i t u s m a r k k i n o i l l a k a a n + r a h o i t u s m a r k k i n o i l l e + r a h o i t u s m a r k k i n o i l t a + r a h o i t u s m a r k k i n o i s t a + r a h o i t u s m a r k k i n o i s t a m m e + r a h o i t u s m a r k k i n o i t a + r a h o i t u s m a r k k i n o i t a m m e + r a h o i t u s m a t e m a t i i k k a + r a h o i t u s m e k a n i s m e i h i n + r a h o i t u s m e k a n i s m e i k s i + r a h o i t u s m e k a n i s m e i s t a + r a h o i t u s m e k a n i s m e j a + r a h o i t u s m e k a n i s m i + r a h o i t u s m e k a n i s m i a + r a h o i t u s m e k a n i s m i e n + r a h o i t u s m e k a n i s m i i n + r a h o i t u s m e k a n i s m i n + r a h o i t u s m e k a n i s m i s t a + r a h o i t u s m e k a n i s m i t + r a h o i t u s m e n e t e l m i e n + r a h o i t u s m e n e t e l m i i n + r a h o i t u s m e n e t e l m i l l e + r a h o i t u s m e n e t e l m i s s ä + r a h o i t u s m e n e t e l m i ä + r a h o i t u s m e n e t e l m ä + r a h o i t u s m e n e t e l m ä k s i + r a h o i t u s m e n e t e l m ä n + r a h o i t u s m e n e t e l m ä s t ä + r a h o i t u s m e n e t e l m ä s t ä ä n + r a h o i t u s m e n e t e l m ä t + r a h o i t u s m e n e t e l m ä ä + r a h o i t u s m e n e t t e l y i h i n + r a h o i t u s m e n e t t e l y i s t ä + r a h o i t u s m e n e t t e l y j e n + r a h o i t u s m e n e t t e l y j ä + r a h o i t u s m e n e t t e l y t + r a h o i t u s m e n e t t e l y ä + r a h o i t u s m e n o j e n + r a h o i t u s m e n o t + r a h o i t u s m o r a a l i + r a h o i t u s m u o d o i s t a + r a h o i t u s m u o d o l l e + r a h o i t u s m u o d o s t a + r a h o i t u s m u o d o t + r a h o i t u s m u o t o + r a h o i t u s m u o t o a + r a h o i t u s m u o t o i h i n + r a h o i t u s m u o t o j a + r a h o i t u s m u o t o j e n + r a h o i t u s m y l l e r r y k s e n + r a h o i t u s m y l l e r r y s + r a h o i t u s m y l l e r r y s t ä + r a h o i t u s m y r s k y + r a h o i t u s m y r s k y j e n + r a h o i t u s m ä ä r i s t ä + r a h o i t u s m ä ä r ä + r a h o i t u s m ä ä r ä n + r a h o i t u s m ä ä r ä r a h a + r a h o i t u s m ä ä r ä r a h o j a + r a h o i t u s m ä ä r ä r a h o j e n + r a h o i t u s m ä ä r ä t + r a h o i t u s m ä ä r ä y k s e t + r a h o i t u s m ä ä r ä y k s i i n + r a h o i t u s m ä ä r ä y k s i s s ä + r a h o i t u s m ä ä r ä y k s i ä + r a h o i t u s m ä ä r ä y s t ä + r a h o i t u s n e u v o j a + r a h o i t u s n e u v o j a t + r a h o i t u s n e u v o n t a p a l v e l u i d e n + r a h o i t u s n e u v o s t o n + r a h o i t u s n e u v o t t e l u i h i n + r a h o i t u s n e u v o t t e l u i n a + r a h o i t u s n e u v o t t e l u i s s a + r a h o i t u s n e u v o t t e l u i t a + r a h o i t u s n e u v o t t e l u j a + r a h o i t u s n e u v o t t e l u j e n + r a h o i t u s n e u v o t t e l u t + r a h o i t u s n ä k e m y k s i e n + r a h o i t u s n ä k y m i e m m e + r a h o i t u s n ä k y m i e n + r a h o i t u s n ä k y m i i m m e + r a h o i t u s n ä k y m i i n + r a h o i t u s n ä k y m i i n s ä + r a h o i t u s n ä k y m i k s i + r a h o i t u s n ä k y m i l l e + r a h o i t u s n ä k y m i l l ä + r a h o i t u s n ä k y m i s s ä + r a h o i t u s n ä k y m i s s ä k i n + r a h o i t u s n ä k y m i s t ä + r a h o i t u s n ä k y m i ä + r a h o i t u s n ä k y m i ä ä n + r a h o i t u s n ä k y m ä + r a h o i t u s n ä k y m ä j a k s o n + r a h o i t u s n ä k y m ä j ä r j e s t e l m ä n + r a h o i t u s n ä k y m ä k a u d e n + r a h o i t u s n ä k y m ä m m e + r a h o i t u s n ä k y m ä n + r a h o i t u s n ä k y m ä s s ä + r a h o i t u s n ä k y m ä s t ä + r a h o i t u s n ä k y m ä t + r a h o i t u s n ä k y m ä ä + r a h o i t u s n ä k y m ä ä n + r a h o i t u s n ä k ö k o h d i s s a + r a h o i t u s n ä k ö k o h d i s t a + r a h o i t u s n ä k ö k o h t a + r a h o i t u s n ä k ö k o h t i a + r a h o i t u s n ä k ö k o h t i e n + r a h o i t u s n ä k ö k o h t i i n + r a h o i t u s n ä k ö k u l m a t + r a h o i t u s n ä k ö k u l m i a + r a h o i t u s o h j e + r a h o i t u s o h j e e t + r a h o i t u s o h j e i d e n + r a h o i t u s o h j e i t a + r a h o i t u s o h j e l m a + r a h o i t u s o h j e l m a a + r a h o i t u s o h j e l m a a n + r a h o i t u s o h j e l m a k a u d e l l a + r a h o i t u s o h j e l m a k a u d e l t a + r a h o i t u s o h j e l m a k a u d e n + r a h o i t u s o h j e l m a l l e + r a h o i t u s o h j e l m a n + r a h o i t u s o h j e l m a s s a + r a h o i t u s o h j e l m a s t a + r a h o i t u s o h j e l m a s u u n n i t t e l u u m m e + r a h o i t u s o h j e l m a t + r a h o i t u s o h j e l m i a + r a h o i t u s o h j e l m i e n + r a h o i t u s o h j e l m i e n s a + r a h o i t u s o h j e l m i i m m e + r a h o i t u s o h j e l m i i n + r a h o i t u s o h j e l m i l l a + r a h o i t u s o h j e l m i l l e + r a h o i t u s o h j e l m i s s a + r a h o i t u s o h j e l m i s t a + r a h o i t u s o h j e l m o i n n i n + r a h o i t u s o h j e l m o i n t i + r a h o i t u s o h j e l m o i n t i a + r a h o i t u s o h j e l m o i n t i i n + r a h o i t u s o i k a i s u + r a h o i t u s o i k a i s u i h i n + r a h o i t u s o i k a i s u i s t a + r a h o i t u s o i k a i s u j a + r a h o i t u s o i k a i s u j e n + r a h o i t u s o i k a i s u t + r a h o i t u s o k s a t + r a h o i t u s o l o i s s a + r a h o i t u s o l o j a + r a h o i t u s o l o s u h t e i s s a + r a h o i t u s o l o s u h t e i s t a + r a h o i t u s o l o s u h t e i t a + r a h o i t u s o m a i s u u d e n + r a h o i t u s o n g e l m a + r a h o i t u s o n g e l m a a + r a h o i t u s o n g e l m a a n + r a h o i t u s o n g e l m a l l e + r a h o i t u s o n g e l m a m m e + r a h o i t u s o n g e l m a n + r a h o i t u s o n g e l m a t + r a h o i t u s o n g e l m i a + r a h o i t u s o n g e l m i e n + r a h o i t u s o n g e l m i i n + r a h o i t u s o n g e l m i s s a + r a h o i t u s o n g e l m i s t a + r a h o i t u s o p e r a a t i o i d e n + r a h o i t u s o p e r a a t i o i h i n + r a h o i t u s o p e r a a t i o i t a + r a h o i t u s o p t i o i t a + r a h o i t u s o r g a n i s a a t i o i d e n + r a h o i t u s o r g a n i s a a t i o i s s a + r a h o i t u s o s a k k a i d e n + r a h o i t u s o s a k k a i d e n s a + r a h o i t u s o s a k k u u s j ä r j e s t e l m i e n + r a h o i t u s o s a k k u u s k e s k u s t e l u + r a h o i t u s o s a n + r a h o i t u s o s a n a + r a h o i t u s o s i o o n + r a h o i t u s o s u u d e l l a + r a h o i t u s o s u u d e l l a a n + r a h o i t u s o s u u d e n + r a h o i t u s o s u u d e s t a + r a h o i t u s o s u u d e t + r a h o i t u s o s u u k s i e n + r a h o i t u s o s u u k s i i n + r a h o i t u s o s u u k s i l l a + r a h o i t u s o s u u k s i s t a + r a h o i t u s o s u u s + r a h o i t u s o s u u t e e n + r a h o i t u s o s u u t e m m e + r a h o i t u s o s u u t e n a + r a h o i t u s o s u u t e n n e + r a h o i t u s o s u u t e n s a + r a h o i t u s o s u u t t a + r a h o i t u s o s u u t t a a n + r a h o i t u s p a i k k a a + r a h o i t u s p a i k o i s t a + r a h o i t u s p a i n e i s t a + r a h o i t u s p a i n e i t a + r a h o i t u s p a k e t i l l e + r a h o i t u s p a k e t i n + r a h o i t u s p a k e t i s s a + r a h o i t u s p a k e t i s t a + r a h o i t u s p a k e t i t + r a h o i t u s p a k e t t e j a + r a h o i t u s p a k e t t i + r a h o i t u s p a k e t t i a + r a h o i t u s p a k e t t i e n + r a h o i t u s p a k e t t i i n + r a h o i t u s p a k k a u k s e s t a + r a h o i t u s p a l k k i o + r a h o i t u s p a l v e l u + r a h o i t u s p a l v e l u a + r a h o i t u s p a l v e l u a l a + r a h o i t u s p a l v e l u a l a a + r a h o i t u s p a l v e l u a l a a n + r a h o i t u s p a l v e l u a l a l l a + r a h o i t u s p a l v e l u a l a l l e + r a h o i t u s p a l v e l u a l a n + r a h o i t u s p a l v e l u a l a s t a + r a h o i t u s p a l v e l u a l o i s t a + r a h o i t u s p a l v e l u a l o j e n + r a h o i t u s p a l v e l u d i r e k t i i v e j ä + r a h o i t u s p a l v e l u d i r e k t i i v i n + r a h o i t u s p a l v e l u d i r e k t i i v i s t ä + r a h o i t u s p a l v e l u i d e n + r a h o i t u s p a l v e l u i h i n + r a h o i t u s p a l v e l u i k s i + r a h o i t u s p a l v e l u i l l a + r a h o i t u s p a l v e l u i l l e + r a h o i t u s p a l v e l u i s s a + r a h o i t u s p a l v e l u i s t a + r a h o i t u s p a l v e l u i s t a m m e + r a h o i t u s p a l v e l u i t a + r a h o i t u s p a l v e l u j a + r a h o i t u s p a l v e l u j e m m e + r a h o i t u s p a l v e l u j e n + r a h o i t u s p a l v e l u j e n k i n + r a h o i t u s p a l v e l u l a i n s ä ä d ä n n ö n + r a h o i t u s p a l v e l u l a i n s ä ä d ä n t ö ä + r a h o i t u s p a l v e l u l a i n s ä ä d ä n t ö ö n + r a h o i t u s p a l v e l u l a i t o k s i l l e + r a h o i t u s p a l v e l u m a r k k i n a t + r a h o i t u s p a l v e l u m a r k k i n o i d e n + r a h o i t u s p a l v e l u m a r k k i n o i h i n + r a h o i t u s p a l v e l u m a r k k i n o i l l a + r a h o i t u s p a l v e l u m a r k k i n o i l l e + r a h o i t u s p a l v e l u m a r k k i n o i t a + r a h o i t u s p a l v e l u n + r a h o i t u s p a l v e l u n t a r j o a j i e n + r a h o i t u s p a l v e l u o h j e l m a + r a h o i t u s p a l v e l u o p e r a a t i o i s s a + r a h o i t u s p a l v e l u p a k e t i n + r a h o i t u s p a l v e l u p o l i t i i k a s t a + r a h o i t u s p a l v e l u p o l i t i i k k a a + r a h o i t u s p a l v e l u r y h m i t t y m i e n + r a h o i t u s p a l v e l u s e k t o r i n + r a h o i t u s p a l v e l u t + r a h o i t u s p a l v e l u t e o l l i s u u d e s s a + r a h o i t u s p a l v e l u t u o t t e e n a + r a h o i t u s p a l v e l u t u o t t e e t + r a h o i t u s p a l v e l u t u o t t e i d e n + r a h o i t u s p a l v e l u u n + r a h o i t u s p a l v e l u v i r a n o m a i n e n + r a h o i t u s p a l v e l u v i r a n o m a i s e n + r a h o i t u s p a l v e l u v i r a n o m a i s e t + r a h o i t u s p a l v e l u v i r a n o m a i s t e n + r a h o i t u s p a l v e l u v i r a s t o + r a h o i t u s p a l v e l u v ä l i n e i t ä + r a h o i t u s p a l v e l u y r i t y k s e l t ä + r a h o i t u s p a l v e l u y r i t y k s i ä + r a h o i t u s p a l v e l u y r i t y s + r a h o i t u s p a l v e l u y r i t y s t e n + r a h o i t u s p a l v e l u y r i t y s t ä + r a h o i t u s p a n k i k s i + r a h o i t u s p a n o k s e n s a + r a h o i t u s p a n o k s e s t a + r a h o i t u s p e l e j ä + r a h o i t u s p e r i a a t t e e t + r a h o i t u s p e r u s t a + r a h o i t u s p e r u s t a a + r a h o i t u s p e r u s t a a n + r a h o i t u s p e r u s t a n + r a h o i t u s p e r u s t a s t a + r a h o i t u s p e r u s t e e t + r a h o i t u s p e r u s t e i s i i n + r a h o i t u s p i i r e i l l e + r a h o i t u s p i i r e i s s ä + r a h o i t u s p i i r i t + r a h o i t u s p o h j a + r a h o i t u s p o h j a a + r a h o i t u s p o h j a a n + r a h o i t u s p o h j a l l a + r a h o i t u s p o h j a l l e + r a h o i t u s p o h j a n + r a h o i t u s p o h j a s t a + r a h o i t u s p o l i t i i k a l l a + r a h o i t u s p o l i t i i k a n + r a h o i t u s p o l i t i i k a s s a + r a h o i t u s p o l i t i i k a s t a + r a h o i t u s p o l i t i i k a s t a a n + r a h o i t u s p o l i t i i k a t + r a h o i t u s p o l i t i i k k a + r a h o i t u s p o l i t i i k k a a + r a h o i t u s p o l i t i i k k a a n + r a h o i t u s p o l i t i i k k a a n s a + r a h o i t u s p o l i t i i k k o j a + r a h o i t u s p o l i t i i k o i l l a + r a h o i t u s p o n n i s t e l u i h i n + r a h o i t u s p o n n i s t e l u j a a n + r a h o i t u s p o n n i s t e l u j e n + r a h o i t u s p o n n i s t e l u n s a + r a h o i t u s p o o l i + r a h o i t u s p o t t i + r a h o i t u s p r o s e s s e i s s a + r a h o i t u s p r o s e s s i a + r a h o i t u s p r o s e s s i e n + r a h o i t u s p r o s e s s i n + r a h o i t u s p r o t o k o l l i s t a + r a h o i t u s p u i t e + r a h o i t u s p u i t t e e t + r a h o i t u s p u i t t e i d e n + r a h o i t u s p u i t t e i s i i n + r a h o i t u s p u i t t e i s s a + r a h o i t u s p u i t t e i s t a + r a h o i t u s p u i t t e i t a + r a h o i t u s p u o l i + r a h o i t u s p u u t t e e t + r a h o i t u s p u u t t e i s i i n + r a h o i t u s p y r a m i d i e n + r a h o i t u s p y r k i m y k s i i n + r a h o i t u s p y y n n ö n + r a h o i t u s p y y n t ö + r a h o i t u s p y y n t ö j e n + r a h o i t u s p y y n t ö p r o s e s s i t + r a h o i t u s p ä ä m ä ä r ä n + r a h o i t u s p ä ä o m a + r a h o i t u s p ä ä o m a n + r a h o i t u s p ä ä o m i i n + r a h o i t u s p ä ä t ö k s e l l ä ä n + r a h o i t u s p ä ä t ö k s e n + r a h o i t u s p ä ä t ö k s e s s ä + r a h o i t u s p ä ä t ö k s e t + r a h o i t u s p ä ä t ö k s i i n + r a h o i t u s p ä ä t ö k s i l l e + r a h o i t u s p ä ä t ö k s i s s ä + r a h o i t u s p ä ä t ö k s i s t ä + r a h o i t u s p ä ä t ö k s i ä + r a h o i t u s p ä ä t ö s + r a h o i t u s p ä ä t ö s t ä + r a h o i t u s p ö y t ä k i r j a + r a h o i t u s p ö y t ä k i r j a a + r a h o i t u s p ö y t ä k i r j a a n + r a h o i t u s p ö y t ä k i r j a k s i + r a h o i t u s p ö y t ä k i r j a n + r a h o i t u s p ö y t ä k i r j a s s a + r a h o i t u s p ö y t ä k i r j a s t a + r a h o i t u s p ö y t ä k i r j a t + r a h o i t u s p ö y t ä k i r j o j e n + r a h o i t u s r a h a s t o i s s a + r a h o i t u s r a j a t + r a h o i t u s r a j o i t t e e t + r a h o i t u s r a j o i t t e i t a + r a h o i t u s r a k e n n e + r a h o i t u s r a k e n n e j ä r j e s t e l m ä ä + r a h o i t u s r a k e n n e l m i a + r a h o i t u s r a k e n n e t t a + r a h o i t u s r a k e n n e t y y p p i + r a h o i t u s r a k e n t e e l l e + r a h o i t u s r a k e n t e e n + r a h o i t u s r a k e n t e e s e e n + r a h o i t u s r a k e n t e e s t a + r a h o i t u s r a k e n t e e t + r a h o i t u s r a k e n t e i d e n + r a h o i t u s r a k e n t e i t a + r a h o i t u s r a p o r t o i n n i n + r a h o i t u s r a s i t t e e s t a + r a h o i t u s r a s i t t e e t + r a h o i t u s r a t k a i s u + r a h o i t u s r a t k a i s u a + r a h o i t u s r a t k a i s u j a + r a h o i t u s r e s e r v i ä + r a h o i t u s r e s u r s s e i h i n + r a h o i t u s r e s u r s s e i l l a + r a h o i t u s r e s u r s s e i s t a + r a h o i t u s r e s u r s s e j a + r a h o i t u s r e s u r s s i e n + r a h o i t u s r e s u r s s i t + r a h o i t u s r i s k e i s t ä + r a h o i t u s r i s k e j ä + r a h o i t u s r i s k i + r a h o i t u s r i s k i n s ä + r a h o i t u s r o m a h d u s + r a h o i t u s r u i s k e e l l a + r a h o i t u s r y h m i e n + r a h o i t u s r y h m i l l e + r a h o i t u s r y h m i t t y m i e n + r a h o i t u s r y h m i t t y m i l l e + r a h o i t u s r y h m i t t y m i ä + r a h o i t u s r y h m i t t y m ä t + r a h o i t u s r y h m i ä + r a h o i t u s r y h m i ä ä n + r a h o i t u s r y h m ä t + r a h o i t u s s a a m i s i a + r a h o i t u s s a a r r o n + r a h o i t u s s a a r t o a + r a h o i t u s s a n k t i o i s t a + r a h o i t u s s e k a s o t k u s s a + r a h o i t u s s e k t o r i + r a h o i t u s s e k t o r i a + r a h o i t u s s e k t o r i i n + r a h o i t u s s e k t o r i l l a + r a h o i t u s s e k t o r i l l e + r a h o i t u s s e k t o r i n + r a h o i t u s s e k t o r i n s a + r a h o i t u s s e k t o r i t + r a h o i t u s s e l v i t y k s e n + r a h o i t u s s e l v i t y k s e s s ä + r a h o i t u s s e l v i t y k s e t + r a h o i t u s s e l v i t y k s i ä + r a h o i t u s s e l v i t y s + r a h o i t u s s e l v i t y s t ä + r a h o i t u s s e u r a a m u k s i a + r a h o i t u s s i i r r o i l l a + r a h o i t u s s i i r r o i s t a + r a h o i t u s s i i r r o t + r a h o i t u s s i j o i t t a j a n + r a h o i t u s s i j o i t t a j i n a + r a h o i t u s s i s ä m a r k k i n o i d e n + r a h o i t u s s i t o u m u k s e n + r a h o i t u s s i t o u m u k s e n s a + r a h o i t u s s i t o u m u k s e s t a + r a h o i t u s s i t o u m u k s e t + r a h o i t u s s i t o u m u k s i a + r a h o i t u s s i t o u m u k s i i n s a + r a h o i t u s s i t o u m u k s i k s i + r a h o i t u s s i t o u m u k s i l l e + r a h o i t u s s i t o u m u k s i s t a + r a h o i t u s s i t o u m u s + r a h o i t u s s i t o u m u s k o n f e r e n s s i + r a h o i t u s s i t o u m u s t a + r a h o i t u s s i t o u m u s t a m m e + r a h o i t u s s i t o u m u s t e n + r a h o i t u s s i t o u m u s t e n s a + r a h o i t u s s k a n d a a l e i h i n + r a h o i t u s s k a n d a a l e i s t a + r a h o i t u s s k a n d a a l e j a + r a h o i t u s s k a n d a a l i + r a h o i t u s s k a n d a a l i a + r a h o i t u s s k a n d a a l i e n + r a h o i t u s s o l i d a a r i s u u d e n + r a h o i t u s s o p i m u k s e n + r a h o i t u s s o p i m u k s e s s a + r a h o i t u s s o p i m u k s e s t a + r a h o i t u s s o p i m u k s e t + r a h o i t u s s o p i m u k s i a + r a h o i t u s s o p i m u k s i s s a + r a h o i t u s s o p i m u k s i s t a + r a h o i t u s s o p i m u s + r a h o i t u s s o p i m u s t a + r a h o i t u s s o p i m u s t e n + r a h o i t u s s o t k u n + r a h o i t u s s o v e l l u k s i s s a + r a h o i t u s s t a n d a r d i t + r a h o i t u s s t r a t e g i a + r a h o i t u s s t r a t e g i a a + r a h o i t u s s t r a t e g i a s t a + r a h o i t u s s t r a t e g i o i t a + r a h o i t u s s u h t e e t + r a h o i t u s s u h t e i d e n + r a h o i t u s s u h t e i s s a + r a h o i t u s s u h t e i s t a a n + r a h o i t u s s u h t e i t a + r a h o i t u s s u m m a + r a h o i t u s s u m m a n + r a h o i t u s s u m m a s t a + r a h o i t u s s u m m a t + r a h o i t u s s u m m i a + r a h o i t u s s u u n n i t e l m a + r a h o i t u s s u u n n i t e l m a a + r a h o i t u s s u u n n i t e l m a a n + r a h o i t u s s u u n n i t e l m a k a u d e l l e + r a h o i t u s s u u n n i t e l m a k a u d e n + r a h o i t u s s u u n n i t e l m a k s i + r a h o i t u s s u u n n i t e l m a l l a + r a h o i t u s s u u n n i t e l m a n + r a h o i t u s s u u n n i t e l m a s s a + r a h o i t u s s u u n n i t e l m a s s a m m e + r a h o i t u s s u u n n i t e l m a s t a + r a h o i t u s s u u n n i t e l m a t + r a h o i t u s s u u n n i t e l m i a + r a h o i t u s s u u n n i t e l m i e n + r a h o i t u s s u u n n i t e l m i i n + r a h o i t u s s u u n n i t e l m i l l a + r a h o i t u s s u u n n i t e l m i l l e + r a h o i t u s s u u n n i t e l m i n + r a h o i t u s s u u n n i t e l m i s s a + r a h o i t u s s u u n n i t e l m i s t a + r a h o i t u s s u u n n i t t e l u + r a h o i t u s s u u n n i t t e l u a + r a h o i t u s s u u n n i t t e l u j ä r j e s t e l m ä s s ä m m e + r a h o i t u s s u u n n i t t e l u k a u d e l l e + r a h o i t u s s u u n n i t t e l u l l e + r a h o i t u s s u u n n i t t e l u m m e + r a h o i t u s s u u n n i t t e l u n + r a h o i t u s s u u n n i t t e l u n a + r a h o i t u s s u u n n i t t e l u s s a + r a h o i t u s s u u n n i t t e l u s t a + r a h o i t u s s u u n n i t t e l u u n + r a h o i t u s s u u n n i t t e l u v ä l i n e i d e n + r a h o i t u s s u u n n i t t e l u v ä l i n e i t ä + r a h o i t u s s y k l i i n + r a h o i t u s s y n e r g i a + r a h o i t u s s ä ä d ö k s i l l ä + r a h o i t u s s ä ä d ö k s i ä + r a h o i t u s s ä ä d ö s t e n + r a h o i t u s s ä ä n n ö i s s ä + r a h o i t u s s ä ä n n ö k s e t + r a h o i t u s s ä ä n n ö k s i l l ä + r a h o i t u s s ä ä n n ö k s i ä + r a h o i t u s s ä ä n n ö t + r a h o i t u s s ä ä n t e l y + r a h o i t u s s ä ä n t e l y n + r a h o i t u s s ä ä n t e l y s t ä + r a h o i t u s s ä ä n t e l y y n + r a h o i t u s s ä ä n t e l y ä + r a h o i t u s s ä ä n t ö i h i n + r a h o i t u s s ä ä n t ö j e n + r a h o i t u s s ä ä n t ö j ä + r a h o i t u s s ä ä s t ö j ä + r a h o i t u s t a + r a h o i t u s t a a k a n + r a h o i t u s t a a k a s t a + r a h o i t u s t a a k k a + r a h o i t u s t a a k k a a + r a h o i t u s t a a k k o j a + r a h o i t u s t a a n + r a h o i t u s t a h o j e n + r a h o i t u s t a k i n + r a h o i t u s t a k u i d e n + r a h o i t u s t a k u i s i i n + r a h o i t u s t a k u i s t a + r a h o i t u s t a k u i t a + r a h o i t u s t a k u u + r a h o i t u s t a k u u n + r a h o i t u s t a k u u n s a + r a h o i t u s t a k u u t + r a h o i t u s t a l o u s + r a h o i t u s t a l o u s t o i m i s s a + r a h o i t u s t a l o u s t o i m i s t a a n + r a h o i t u s t a p a + r a h o i t u s t a p a a + r a h o i t u s t a p a h t u m a t + r a h o i t u s t a p a h t u m a t i e t o j e n + r a h o i t u s t a p a h t u m i a + r a h o i t u s t a p a h t u m i e n + r a h o i t u s t a p a h t u m i i n + r a h o i t u s t a p a h t u m i s t a + r a h o i t u s t a p o j a + r a h o i t u s t a p p i o t + r a h o i t u s t a r j o u k s e n + r a h o i t u s t a r j o u k s e t + r a h o i t u s t a r j o u s + r a h o i t u s t a r k a s t a j a + r a h o i t u s t a r k a s t u k s e n + r a h o i t u s t a r k a s t u k s i a + r a h o i t u s t a r k a s t u s + r a h o i t u s t a r k a s t u s l a i t o s t a + r a h o i t u s t a r k a s t u s t a + r a h o i t u s t a r k a s t u s v i r a n o m a i n e n + r a h o i t u s t a r k a s t u s v i r a n o m a i s e n + r a h o i t u s t a r k i s t u k s i i n + r a h o i t u s t a r p e e k s i + r a h o i t u s t a r p e e n + r a h o i t u s t a r p e e n s a + r a h o i t u s t a r p e e s e e n + r a h o i t u s t a r p e e s t a + r a h o i t u s t a r p e e t + r a h o i t u s t a r p e i d e n + r a h o i t u s t a r p e i s i i n + r a h o i t u s t a r p e i s t a + r a h o i t u s t a r p e i t a + r a h o i t u s t a r v e + r a h o i t u s t a r v e t t a + r a h o i t u s t a s a p a i n o a + r a h o i t u s t a s a p a i n o n + r a h o i t u s t a s a p a i n o o n + r a h o i t u s t a s a p a i n o s t a + r a h o i t u s t a s e e s t a + r a h o i t u s t a s o + r a h o i t u s t a s o a + r a h o i t u s t a s o j e n + r a h o i t u s t a s o l l a + r a h o i t u s t a s o n + r a h o i t u s t a s o s t a + r a h o i t u s t a u l u k k o n s a + r a h o i t u s t a v a s t a + r a h o i t u s t a v a t + r a h o i t u s t a v o i s s a + r a h o i t u s t a v o i t t e e n + r a h o i t u s t a v o i t t e e t + r a h o i t u s t a v o i t t e i d e n + r a h o i t u s t e h t ä v i e n + r a h o i t u s t e k n i i k a k s i + r a h o i t u s t e k n i s i ä + r a h o i t u s t e m p p e l i e n + r a h o i t u s t e m p p u j a + r a h o i t u s t e n + r a h o i t u s t e o l l i s u u d e n + r a h o i t u s t i e d o i s t a + r a h o i t u s t i e d o t + r a h o i t u s t i e t o i h i n + r a h o i t u s t i e t o j a + r a h o i t u s t i e t o j e n + r a h o i t u s t i l a n n e + r a h o i t u s t i l a n n e t t a + r a h o i t u s t i l a n n e t t a a n + r a h o i t u s t i l a n t e e n + r a h o i t u s t i l a n t e e n k i n + r a h o i t u s t i l a n t e e n s a + r a h o i t u s t i l a n t e e s e e n + r a h o i t u s t i l a n t e e s s a + r a h o i t u s t i l a n t e e s t a + r a h o i t u s t o i m e n + r a h o i t u s t o i m e n p i d e + r a h o i t u s t o i m e n p i t e e t + r a h o i t u s t o i m e n p i t e i d e n + r a h o i t u s t o i m e n p i t e i d e n s ä + r a h o i t u s t o i m e n p i t e i l l ä + r a h o i t u s t o i m e n p i t e i s i i n + r a h o i t u s t o i m e n p i t e i s t ä + r a h o i t u s t o i m e n p i t e i t ä + r a h o i t u s t o i m e n s a + r a h o i t u s t o i m e t + r a h o i t u s t o i m i a + r a h o i t u s t o i m i a a n + r a h o i t u s t o i m i e n + r a h o i t u s t o i m i i m m e + r a h o i t u s t o i m i i n + r a h o i t u s t o i m i j o i t a + r a h o i t u s t o i m i l l a + r a h o i t u s t o i m i l l e + r a h o i t u s t o i m i n n a n + r a h o i t u s t o i m i n n a s t a + r a h o i t u s t o i m i n t a + r a h o i t u s t o i m i n t a a + r a h o i t u s t o i m i n t a a n + r a h o i t u s t o i m i n t a a n s a + r a h o i t u s t o i m i n t a m m e + r a h o i t u s t o i m i n t a r y h m ä n + r a h o i t u s t o i m i n t a r y h m ä s s ä + r a h o i t u s t o i m i n t o j e n + r a h o i t u s t o i m i s s a + r a h o i t u s t o i m i s t a + r a h o i t u s t o i m i v e r o + r a h o i t u s t o i m i v e r o a + r a h o i t u s t o i m i v e r o i s t a + r a h o i t u s t o i m i v e r o j a + r a h o i t u s t o i m i v e r o n + r a h o i t u s t o i m i v e r o o n + r a h o i t u s t o i m i v e r o s t a + r a h o i t u s t r a n s a k t i o i s s a a n + r a h o i t u s t r a n s a k t i o i t a + r a h o i t u s t u e l l a + r a h o i t u s t u e l l e + r a h o i t u s t u e n + r a h o i t u s t u e s s a + r a h o i t u s t u e s t a + r a h o i t u s t u e s t a m m e + r a h o i t u s t u i n + r a h o i t u s t u k e a + r a h o i t u s t u k e e n + r a h o i t u s t u k e m m e + r a h o i t u s t u k e n a + r a h o i t u s t u k i + r a h o i t u s t u k i a + r a h o i t u s t u k i e n + r a h o i t u s t u k i h a k e m u k s i a + r a h o i t u s t u k i i n + r a h o i t u s t u k i k a u s i e n + r a h o i t u s t u k i m e k a n i s m e j a + r a h o i t u s t u k i m e k a n i s m i n + r a h o i t u s t u k i m e n e t t e l y t + r a h o i t u s t u k i n a + r a h o i t u s t u k i o h j e l m a + r a h o i t u s t u k i o h j e l m a s t a + r a h o i t u s t u k i o s u u t t a + r a h o i t u s t u k i p a k e t i n + r a h o i t u s t u k i p a k e t i s t a + r a h o i t u s t u k i p o l i t i i k a l l a + r a h o i t u s t u k i s o p i m u k s i i n + r a h o i t u s t u k i s o p i m u s t a + r a h o i t u s t u k i s u u n n i t e l m a + r a h o i t u s t u k i t o i m e n p i t e e t + r a h o i t u s t u k i t o i m e n p i t e i l l ä + r a h o i t u s t u k i t o i m e n p i t e i s t ä + r a h o i t u s t u k i t o i m i a + r a h o i t u s t u k i t o i m i i n + r a h o i t u s t u k i v ä l i n e e n + r a h o i t u s t u k i v ä l i n e i d e n + r a h o i t u s t u k i v ä l i n e i t ä + r a h o i t u s t u l o j a + r a h o i t u s t u l o k s i i n + r a h o i t u s t u o t e t t a + r a h o i t u s t u o t t e e l l e + r a h o i t u s t u o t t e e t + r a h o i t u s t u o t t e i d e n + r a h o i t u s t u o t t e i k s i + r a h o i t u s t u o t t e i l l a + r a h o i t u s t u o t t e i l l e + r a h o i t u s t u o t t e i s i i n + r a h o i t u s t u o t t e i s s a + r a h o i t u s t u o t t e i s t a + r a h o i t u s t u o t t e i t a + r a h o i t u s t u o t t o j a + r a h o i t u s t u o t t o j e n + r a h o i t u s t u r v a + r a h o i t u s t u r v a s ä ä n n ö i s t ä + r a h o i t u s t u t k i m u k s i s t a + r a h o i t u s t y y p p i + r a h o i t u s u l o t t u v u u s + r a h o i t u s u u d i s t u k s e n + r a h o i t u s u u d i s t u k s e s t a + r a h o i t u s u u d i s t u k s i a + r a h o i t u s u u d i s t u s + r a h o i t u s u u d i s t u s t a + r a h o i t u s u u d i s t u s t e n + r a h o i t u s v a a d e + r a h o i t u s v a a t i m u k s e n s a + r a h o i t u s v a a t i m u k s e t + r a h o i t u s v a a t i m u k s i a + r a h o i t u s v a a t i m u k s i a a n + r a h o i t u s v a a t i m u k s i i n + r a h o i t u s v a a t i m u k s i s t a + r a h o i t u s v a i h t e l u i t a + r a h o i t u s v a i h t o e h d o i l l a + r a h o i t u s v a i h t o e h d o n + r a h o i t u s v a i h t o e h d o t + r a h o i t u s v a i h t o e h t o a + r a h o i t u s v a i h t o e h t o j a + r a h o i t u s v a i h t o e h t o n a + r a h o i t u s v a i k e u d e t + r a h o i t u s v a i k e u k s i a + r a h o i t u s v a i k e u k s i e n + r a h o i t u s v a i k e u k s i i n + r a h o i t u s v a i k e u k s i s s a + r a h o i t u s v a i k e u k s i s t a + r a h o i t u s v a i k u t u k s e s t a + r a h o i t u s v a i k u t u k s e t + r a h o i t u s v a i k u t u k s i a + r a h o i t u s v a i k u t u k s i i n + r a h o i t u s v a i k u t u k s i l t a a n + r a h o i t u s v a i k u t u s + r a h o i t u s v a i k u t u s t a + r a h o i t u s v a j a u s + r a h o i t u s v a j e + r a h o i t u s v a j e e n + r a h o i t u s v a j e e n s a + r a h o i t u s v a j e e s t a + r a h o i t u s v a j e k y s y m y k s i s s ä + r a h o i t u s v a j e t t a + r a h o i t u s v a k a u d e l l a + r a h o i t u s v a k a u d e n + r a h o i t u s v a k a u s + r a h o i t u s v a k a u s f o o r u m i n + r a h o i t u s v a k a u s k y s y m y k s e s t ä + r a h o i t u s v a k a u s m e k a n i s m i a + r a h o i t u s v a k a u s m e k a n i s m i l l a + r a h o i t u s v a k a u s m e k a n i s m i n + r a h o i t u s v a k a u s m e k a n i s m i s t a + r a h o i t u s v a k a u s r a h a s t o + r a h o i t u s v a k a u s r a h a s t o s t a + r a h o i t u s v a k a u s v ä l i n e + r a h o i t u s v a k a u s v ä l i n e e n + r a h o i t u s v a k a u s v ä l i n e e s e e n + r a h o i t u s v a k a u s v ä l i n e t t ä + r a h o i t u s v a k a u t e e n + r a h o i t u s v a k a u t t a + r a h o i t u s v a k a u t u s v ä l i n e + r a h o i t u s v a k u u d e s t a + r a h o i t u s v a k u u k s i a + r a h o i t u s v a k u u k s i e n + r a h o i t u s v a k u u s e h d o t u k s e e n + r a h o i t u s v a k u u s j ä r j e s t e l m i s t ä + r a h o i t u s v a k u u s j ä r j e s t e l y t + r a h o i t u s v a k u u s m a r k k i n a t + r a h o i t u s v a k u u t e e n + r a h o i t u s v a k u u t u s j ä r j e s t e l y j ä + r a h o i t u s v a l i o k u n t a a n + r a h o i t u s v a l m i u d e t + r a h o i t u s v a l m i u k s i a + r a h o i t u s v a l m i u k s i e n + r a h o i t u s v a l m i u k s i i n + r a h o i t u s v a l v o j a n + r a h o i t u s v a l v o n n a l l a + r a h o i t u s v a l v o n n a l l e + r a h o i t u s v a l v o n n a n + r a h o i t u s v a l v o n n a s s a + r a h o i t u s v a l v o n n a s t a + r a h o i t u s v a l v o n t a + r a h o i t u s v a l v o n t a a + r a h o i t u s v a l v o n t a a n + r a h o i t u s v a l v o n t a e l i m e n + r a h o i t u s v a l v o n t a e l i m e t + r a h o i t u s v a l v o n t a e l i n t ä + r a h o i t u s v a l v o n t a j ä r j e s t e l m i e n + r a h o i t u s v a l v o n t a j ä r j e s t e l m i i n + r a h o i t u s v a l v o n t a j ä r j e s t e l m i ä + r a h o i t u s v a l v o n t a j ä r j e s t e l m ä n + r a h o i t u s v a l v o n t a j ä r j e s t e l m ä s s ä + r a h o i t u s v a l v o n t a j ä r j e s t e l m ä ä + r a h o i t u s v a l v o n t a l a i t o s t e n + r a h o i t u s v a l v o n t a p a k e t i n + r a h o i t u s v a l v o n t a p a k e t i s t a + r a h o i t u s v a l v o n t a p a k e t t i + r a h o i t u s v a l v o n t a r a k e n t e e l l a + r a h o i t u s v a l v o n t a r a k e n t e e n + r a h o i t u s v a l v o n t a v i r a n o m a i n e n + r a h o i t u s v a l v o n t a v i r a n o m a i s e n + r a h o i t u s v a l v o n t a v i r a n o m a i s e t + r a h o i t u s v a l v o n t a v i r a n o m a i s i a + r a h o i t u s v a l v o n t a v i r a n o m a i s t a + r a h o i t u s v a l v o n t a v i r a n o m a i s t e n + r a h o i t u s v a r a a + r a h o i t u s v a r a n n o t + r a h o i t u s v a r a n s a + r a h o i t u s v a r a s t o n a + r a h o i t u s v a r a t + r a h o i t u s v a r a u k s e s t a + r a h o i t u s v a r a u k s i e n + r a h o i t u s v a r a u k s i s t a + r a h o i t u s v a r a u s + r a h o i t u s v a r m u u d e s t a + r a h o i t u s v a r m u u t t a + r a h o i t u s v a r o i h i n + r a h o i t u s v a r o i l l a + r a h o i t u s v a r o i n + r a h o i t u s v a r o i s t a + r a h o i t u s v a r o j a + r a h o i t u s v a r o j e n + r a h o i t u s v a r u s t u s + r a h o i t u s v a s t u i s t a + r a h o i t u s v a s t u u + r a h o i t u s v a s t u u n + r a h o i t u s v a s t u u t a + r a h o i t u s v a s t u u t a a n + r a h o i t u s v e l a t + r a h o i t u s v e l k o j a + r a h o i t u s v e l v o i t t e e t + r a h o i t u s v e l v o i t t e i d e n + r a h o i t u s v e l v o i t t e i s i i n + r a h o i t u s v e l v o i t t e i t a + r a h o i t u s v e l v o l l i s u u s + r a h o i t u s v e r k o s t o t + r a h o i t u s v e r o a + r a h o i t u s v e r o o n + r a h o i t u s v e r o s t a + r a h o i t u s v i e s t i n t ä y h d i s t y s + r a h o i t u s v i e s t i n t ä y h d i s t y s t ä + r a h o i t u s v i i t e k e h y k s e n + r a h o i t u s v i m m a + r a h o i t u s v i r a n o m a i s e t + r a h o i t u s v i r a n o m a i s i l l e + r a h o i t u s v i r a n o m a i s t e n + r a h o i t u s v i r r a t + r a h o i t u s v i r t a + r a h o i t u s v i r t o i h i n + r a h o i t u s v i r t o j a + r a h o i t u s v i r t o j e n + r a h o i t u s v i r u s + r a h o i t u s v o i m a + r a h o i t u s v o i m a a + r a h o i t u s v o i m a v a r o j a + r a h o i t u s v u o t t a + r a h o i t u s v ä l i n e + r a h o i t u s v ä l i n e e k s i + r a h o i t u s v ä l i n e e l l ä + r a h o i t u s v ä l i n e e l l ä m m e + r a h o i t u s v ä l i n e e m m e + r a h o i t u s v ä l i n e e n + r a h o i t u s v ä l i n e e n s ä + r a h o i t u s v ä l i n e e n ä + r a h o i t u s v ä l i n e e s e e n + r a h o i t u s v ä l i n e e s s ä + r a h o i t u s v ä l i n e e s t ä + r a h o i t u s v ä l i n e e t + r a h o i t u s v ä l i n e i d e m m e + r a h o i t u s v ä l i n e i d e n + r a h o i t u s v ä l i n e i d e n s ä + r a h o i t u s v ä l i n e i k s i + r a h o i t u s v ä l i n e i l l e + r a h o i t u s v ä l i n e i l l ä + r a h o i t u s v ä l i n e i l l ä m m e + r a h o i t u s v ä l i n e i n + r a h o i t u s v ä l i n e i n e e n + r a h o i t u s v ä l i n e i s i i n + r a h o i t u s v ä l i n e i s s ä + r a h o i t u s v ä l i n e i s s ä m m e + r a h o i t u s v ä l i n e i s t ä + r a h o i t u s v ä l i n e i t ä + r a h o i t u s v ä l i n e i t ä m m e + r a h o i t u s v ä l i n e l u o k k a + r a h o i t u s v ä l i n e m a r k k i n o i d e n + r a h o i t u s v ä l i n e m a r k k i n o i t a + r a h o i t u s v ä l i n e n + r a h o i t u s v ä l i n e p a k e t t i a + r a h o i t u s v ä l i n e t t ä + r a h o i t u s v ä l i n e t t ä m m e + r a h o i t u s v ä l i t t ä j i e n + r a h o i t u s v ä l i t t ä j i ä + r a h o i t u s v ä l i t t ä j ä t + r a h o i t u s v ä l i t y k s e s s ä + r a h o i t u s v ä l i t y s l a i t o s t e n + r a h o i t u s v ä s y m y s + r a h o i t u s v ä y l ä t + r a h o i t u s v ä ä r i n k ä y t ö k s e t + r a h o i t u s v ä ä r i n k ä y t ö k s i l l ä + r a h o i t u s y h d i s t y s t e n + r a h o i t u s y h t e i s t y ö + r a h o i t u s y h t e i s t y ö h ö n + r a h o i t u s y h t e i s t y ö n + r a h o i t u s y h t e i s t y ö o h j e l m a n + r a h o i t u s y h t e i s t y ö s s ä + r a h o i t u s y h t e i s t y ö s t ä + r a h o i t u s y h t e i s t y ö t ä + r a h o i t u s y h t e i s t y ö t ä k i n + r a h o i t u s y h t e i s ö + r a h o i t u s y h t e i s ö l l e + r a h o i t u s y h t e i s ö n + r a h o i t u s y h t e i s ö s s ä + r a h o i t u s y h t e i s ö ö n + r a h o i t u s y h t i ö + r a h o i t u s y h t i ö i d e n + r a h o i t u s y h t i ö i h i n + r a h o i t u s y h t i ö i l l e + r a h o i t u s y h t i ö i t ä + r a h o i t u s y h t i ö n + r a h o i t u s y h t i ö t + r a h o i t u s y h t y m i e n + r a h o i t u s y h t y m i ä + r a h o i t u s y h t y m ä t + r a h o i t u s y k s i k k ö j e n + r a h o i t u s y k s i k ö i d e n + r a h o i t u s y k s i k ö i h i n + r a h o i t u s y k s i k ö k s i + r a h o i t u s y k s i k ö n + r a h o i t u s y l i j ä ä m ä + r a h o i t u s y m p ä r i s t ö + r a h o i t u s y m p ä r i s t ö n + r a h o i t u s y m p ä r i s t ö ä + r a h o i t u s y m p ä r i s t ö ö n + r a h o i t u s y r i t y k s e n + r a h o i t u s y r i t y k s i ä + r a h o i t u s y r i t y s t e n + r a h o j a + r a h o j a a n + r a h o j a m m e + r a h o j a n n e + r a h o j e n + r a h t a a j a t + r a h t i a + r a h t i a l a a n + r a h t i a l u k s e l l a + r a h t i a l u k s e n + r a h t i a l u k s e t + r a h t i a l u k s i a + r a h t i a l u k s i s s a + r a h t i a l u k s i s t a + r a h t i a l u s + r a h t i a l u s t e n + r a h t i a s i a k i r j a t + r a h t i a s i a k i r j o i h i n + r a h t i j u n a t + r a h t i j u n a t e o l l i s u u d e l l e + r a h t i j u n i l t a + r a h t i j ä r j e s t e l m ä n + r a h t i k a i s t a s t a + r a h t i k e s k u k s e n + r a h t i k o n e i l l a a n + r a h t i k o n e i l l e + r a h t i k o n e i s t a + r a h t i k o n t i t + r a h t i k u l j e t u k s e s t a + r a h t i k u l j e t u k s e t + r a h t i k u l j e t u k s i a + r a h t i k u l j e t u s t e n + r a h t i k u l u i n e e n + r a h t i k u s t a n n u k s e t + r a h t i k u s t a n n u k s i a + r a h t i k ä y t ä v ä ä + r a h t i l a i v a + r a h t i l a i v a t + r a h t i l a i v o i l l a + r a h t i l a i v o j a + r a h t i l e n n o t + r a h t i l e n t o j a + r a h t i l e n t o j e n + r a h t i l e n t o l i i k e n t e e s e e n + r a h t i l e n t o y h t i ö + r a h t i l i i k e n n e + r a h t i l i i k e n n e a l a + r a h t i l i i k e n n e k ä y t ä v i e n + r a h t i l i i k e n n e k ä y t ä v ä t + r a h t i l i i k e n n e p a l v e l u i s s a + r a h t i l i i k e n n e t t ä + r a h t i l i i k e n n e y r i t y k s e n + r a h t i l i i k e n t e e l l e + r a h t i l i i k e n t e e l t ä + r a h t i l i i k e n t e e n + r a h t i l i i k e n t e e n h a r j o i t t a j a t + r a h t i l i i k e n t e e s e e n + r a h t i l i i k e n t e e s s ä + r a h t i l i i k e n t e e s t ä + r a h t i l u k u j a + r a h t i m a k s u i s t a + r a h t i m a k s u j e n + r a h t i m a k s u t + r a h t i m a r k k i n o i l l e + r a h t i m a r k k i n o i s t a + r a h t i p a l v e l u i d e n + r a h t i r a t o j e n + r a h t i s e k t o r i l l a + r a h t i s e k t o r i s t a + r a h t i s ä i l i ö i s s ä + r a h t i s ä i l i ö s s ä + r a h t i s ä i l i ö s t ä + r a h t i t a v a r a k a u p p a a + r a h t i t e r m i n a a l i n + r a h t i t e r m i n a a l i s s a + r a h t i t o n n i a + r a h t i t o n n i i n + r a h t i t o n n i s t a + r a h t i t u r v a l l i s u u t e e n + r a h t i v a l t a v ä y l i s t ä + r a h t i v a l t a v ä y l i ä + r a h t i v a l t a v ä y l ä t + r a h t i v a r u s t a m o i s t a + r a h t i v a u n u j e n + r a h t i y h t e y t t ä + r a h t i y h t i ö i d e n + r a h t u a k a a n + r a i d a n i s o k a r v e + r a i d a n k e u h k o j ä k ä l ä + r a i d e a j o n e u v o j a + r a i d e a j o n e u v o j e n + r a i d e i n f r a s t r u k t u u r i + r a i d e i n f r a s t r u k t u u r i n + r a i d e l e v e y d e n + r a i d e l e v e y d e s t ä + r a i d e l e v e y d e t + r a i d e l e v e y k s i ä + r a i d e l e v e y s + r a i d e l e v e y t t ä + r a i d e l i i k e n n e + r a i d e l i i k e n n e h a n k e + r a i d e l i i k e n n e i n f r a s t r u k t u u r i + r a i d e l i i k e n n e o n n e t t o m u u s + r a i d e l i i k e n n e p a k e t t i a + r a i d e l i i k e n n e p a l v e l u j a + r a i d e l i i k e n n e t t ä + r a i d e l i i k e n t e e l l e + r a i d e l i i k e n t e e l l ä + r a i d e l i i k e n t e e n + r a i d e l i i k e n t e e s e e n + r a i d e l i i k e n t e e s s ä + r a i d e l i i k e n t e e s t ä + r a i d e l i n j o j a + r a i d e o s u u d e n + r a i d e p a l v e l u j e n + r a i d e p a r a n n u k s e t + r a i d e t a k s i + r a i d e t e k n i i k k a + r a i d e t u n n e l i a + r a i d e v e r k k o o n + r a i d e v ä l i i n + r a i d e v ä l i n + r a i h n a i s e k s i + r a i p a n i s k u a + r a i p p a r a n g a i s t u k s e n + r a i p p a r a n g a i s t u k s e s t a + r a i p p a r a n g a i s t u s k y s y m y k s e n + r a i p p a r a n g a i s t u s k ä y t ä n n ö s t ä + r a i p p a r a n g a i s t u s k ä y t ä n t ö + r a i p p a r a n g a i s t u s t a + r a i s k a a v a t + r a i s k a n n e e n + r a i s k a t a + r a i s k a t u k s i + r a i s k a u k s e s t a + r a i s k a u k s e t + r a i s k a u k s i a + r a i s k a u k s i i n + r a i s k a u k s i l t a + r a i s k a u k s i n a + r a i s k a u k s i s s a + r a i s k a u k s i s t a + r a i s k a u s k r i i s i p u h e l i m i l l a + r a i s k a u s s y y t t e i s t ä + r a i s k a u s t a + r a i s k a u s t a p a u k s e n + r a i s k a u s t a p a u k s e t + r a i s k a u s t a p a u k s i a + r a i s k a u s t a p a u s t a + r a i s k a u s t e n + r a i t a d e l f i i n i + r a i t a h a a r a k o l i b r i + r a i t a h a u k k a p ö l l ö + r a i t a h i i r i + r a i t a h u u h k a j a + r a i t a k a i j a t + r a i t a k e r t t u + r a i t a k o i r a h a i + r a i t a k o t i n g a + r a i t a k ä ä r m e e n p ä ä + r a i t a l e h v ä h e v o n e n + r a i t a m e s i k k o + r a i t a m e t s ä p ö l l ö + r a i t a n u o l i a i n e n + r a i t a n y s ä m u u r a + r a i t a p o i m i j a + r a i t a p o s k i b u l b u l i + r a i t a p u u m u u r a + r a i t a p y r s t ö k o t t a r a i n e n + r a i t a p ö l l ö + r a i t a r i n t a t i k k a n e n + r a i t a s u o h a u k k a + r a i t a t u l i p e r ä + r a i t a t u u l i h a u k k a + r a i t a t ä p l ä t i k k a + r a i t a t ö y h t ö t i k k a + r a i t a v a r p u s p ö l l ö + r a i t a v a t s a k i p u a j a + r a i t a v e s i k o b r a + r a i t a v i h e r t i k k a + r a i t a v ä l s k ä r i + r a i t e e l l e + r a i t e e t + r a i t e i l l a + r a i t e i l l a a n + r a i t e i l l e + r a i t e i l l e e n + r a i t e i l t a a n + r a i t i o l i i k e n n e + r a i t i o t i e l i i k e n n e v e r k o n + r a i t i o v a u n u h a n k e + r a i t i o v a u n u h a n k e t t a + r a i t i o v a u n u j ä r j e s t e l m ä ä + r a i t i o v a u n u l i i k e n n e + r a i t i o v a u n u l i i k e n n e j ä r j e s t e l m ä n + r a i t i o v a u n u l i n j o j e n + r a i t i o v a u n u l i p p u j e n + r a i t i o v a u n u p a l v e l u j a + r a i t i o v a u n u t + r a i t i o v a u n u y h t i ö + r a i t t i u s l i i k e + r a i t t i u s l i i t t o + r a i v a a j a t + r a i v a a m a l l a + r a i v a a m i s e k s i + r a i v a a m i s t a + r a i v a a m i s t o i m i s t a + r a i v a t k a a m m e + r a i v a t t a v a + r a i v a u k s e s s a + r a i v a u s j ä r j e s t e l m i ä + r a i v a u s j ä r j e s t e l m ä n + r a i v a u s j ä r j e s t e l m ä ä + r a i v a u s k i i n t i ö t + r a i v a u s o h j e l m i e n + r a i v a u s p a l k k i o + r a i v a u s p a l k k i o i d e n + r a i v a u s p a l k k i o l l a + r a i v a u s p a l k k i o t + r a i v a u s p o l i t i i k a n + r a i v a u s p o l i t i i k k a + r a i v a u s p o l i t i i k k o j e n + r a i v a u s s u u n n i t e l m a + r a i v a u s s u u n n i t e l m a a + r a i v a u s s u u n n i t e l m a s s a + r a i v a u s t a + r a i v a u s t o i m e n p i d e + r a i v a u s t o i m e t + r a i v a u s t o i m i i n + r a i v a u s t u k i + r a i v a u s t y ö + r a i v a u s t ö i s s ä + r a i v a u s v a i h t o e h t o a + r a i v o i s s a a n + r a i v o i s s a m m e + r a i v o i s s a n i + r a i v o k k a a s e e n + r a i v o n h u u d o t + r a i v o p u u s k a s y n d r o o m a + r a i v o s t a + r a i v o s t u t t a v a m p a a + r a i v o s t u t t a v a s t a + r a i v o s t u t t a v a t + r a i v o t a u d i l t a + r a i v o t a u t i a + r a i v o t a u t i o n g e l m a + r a i v o t a u t i r o k o t t e e s t a + r a i v o t a u t i r o k o t u k s e n + r a i v o t a u t i r o k o t u s t a + r a i v o t a u t i s u o j a a + r a i v o t a u t i t a p a u s t e n + r a i v o t a u t i t i l a n n e + r a i v o t a u t i t i l a n t e e n + r a i v o t a u t i v a a r a n + r a i v o t e s s a + r a j a a m a a n + r a j a a m a t o n t a + r a j a a m a t t a + r a j a a m i s e e n + r a j a a m i s t a + r a j a e h d o t + r a j a e r i m i e l i s y y d e t + r a j a e r i m i e l i s y y k s i i n + r a j a e r i m i e l i s y y t e n ä + r a j a e s t e e t + r a j a h a l l i n n o n + r a j a h a l l i n n o s s a + r a j a h a l l i n n o s t a + r a j a h a l l i n n o t + r a j a h a l l i n t o + r a j a h a l l i n t o a + r a j a h i n t a t o i m e k s i a n t o j a + r a j a h y ö t y + r a j a i n f r a s t r u k t u u r i a + r a j a i n t e r v e n t i o r y h m i e n + r a j a i n t e r v e n t i o r y h m i s t ä + r a j a i n t e r v e n t i o r y h m i ä + r a j a i n t e r v e n t i o r y h m ä + r a j a i n t e r v e n t i o r y h m ä n + r a j a i n t e r v e n t i o r y h m ä t + r a j a j o e l l e + r a j a j o k e e n + r a j a j o k i + r a j a j o k i a + r a j a j o k i i m m e + r a j a j o k i k o m i t e a + r a j a j o k i k o m i t e a n + r a j a j o u k o i s t a + r a j a j o u k o t + r a j a j u o n i t t e l u n + r a j a j ä r j e s t e l y i s s ä + r a j a j ä r j e s t e l y j ä + r a j a j ä r j e s t e l y t + r a j a k a h a k a t + r a j a k a i s t a l e + r a j a k a u p a n + r a j a k a u p a s t a + r a j a k a u p u n g i s s a + r a j a k e r r o s + r a j a k i i s t a + r a j a k i i s t a a + r a j a k i i s t a a n + r a j a k i i s t a n + r a j a k i i s t a s s a + r a j a k i i s t a s t a + r a j a k i i s t a t + r a j a k i i s t o i h i n + r a j a k i i s t o i h i n s a + r a j a k i i s t o i s s a + r a j a k i i s t o i s t a + r a j a k i i s t o j a + r a j a k i i s t o j e n + r a j a k i v i + r a j a k o h d a k s i + r a j a k o h d a n + r a j a k o m i s s i o n + r a j a k o m i t e a n + r a j a k o n f l i k t e i h i n + r a j a k o n f l i k t e j a + r a j a k o n f l i k t i + r a j a k o n f l i k t i i n + r a j a k o n f l i k t i n + r a j a k o n f l i k t i s s a + r a j a k o n f l i k t i s t a + r a j a k o n f l i k t i t + r a j a k o n t r o l l e j a + r a j a k o n t r o l l i n + r a j a k r e i v i k u n n a s t a + r a j a k r e i v i k u n n i l l a + r a j a k r e i v i k u n n i s s a + r a j a k r e i v i k u n t a + r a j a k r e i v i k u n t i e n + r a j a k r i i s i + r a j a k u n n a t + r a j a k u n n i l l e + r a j a k u n t i a + r a j a k u n t i e n + r a j a k u s t a n n u k s e t + r a j a k u s t a n n u k s i a + r a j a k u s t a n n u k s i i n + r a j a k u s t a n n u s + r a j a k u s t a n n u s m a k s u j e n + r a j a k u s t a n n u s t e n + r a j a k y l i s s ä + r a j a k y s y m y k s e e n + r a j a k y s y m y k s e n + r a j a k y s y m y k s e t + r a j a k y s y m y k s i i n + r a j a k y s y m y k s i s t ä + r a j a k y s y m y k s i ä + r a j a k y s y m y k s i ä ä n + r a j a k y s y m y s t e n + r a j a l i i k e n n e + r a j a l i i k e n n e j ä r j e s t e l y i s t ä + r a j a l i i k e n n e l u p a + r a j a l i i k e n n e l u v a n + r a j a l i i k e n n e s o p i m u k s i s t a + r a j a l i i k e n n e t t ä + r a j a l i i k e n t e e n + r a j a l i i k e n t e e s e e n + r a j a l i i k e n t e e s t ä + r a j a l i n j a + r a j a l i n j a a + r a j a l i n j a t + r a j a l i n j o i h i n + r a j a l i n j o i k s i + r a j a l i n j o i l l a + r a j a l i n j o i s t a + r a j a l i n j o j a + r a j a l i n j o j e n + r a j a l l a + r a j a l l e + r a j a l l i s e l l a + r a j a l l i s e m m a t + r a j a l l i s e m m i k s i + r a j a l l i s e m m i n + r a j a l l i s e m p a a + r a j a l l i s e m p i + r a j a l l i s e m p i a + r a j a l l i s e n + r a j a l l i s e n a + r a j a l l i s e t + r a j a l l i s i a + r a j a l l i s i k s i + r a j a l l i s i s t a + r a j a l l i s t a + r a j a l o g i s t i i k k a a n + r a j a l o u k k a u k s e t + r a j a l o u k k a u k s i i n + r a j a l o u k k a u s t e n + r a j a m a a k u n n a n + r a j a m a a k u n t a a n + r a j a m a a t + r a j a m a i l l a + r a j a m a i n a + r a j a m e n e t t e l y i s t ä + r a j a m e n e t t e l y i t ä + r a j a m e r k k i + r a j a m m e + r a j a m u k a u t u s v ä l i n e i d e n + r a j a m u o d o l l i s u u d e t + r a j a m u o d o l l i s u u k s i a + r a j a m u o d o l l i s u u k s i e n + r a j a m u u r i n + r a j a m u u r i t + r a j a m u u t o k s e t + r a j a m u u t o k s i a + r a j a m u u t o k s i i n + r a j a m u u t o k s i s t a + r a j a m u u t o s t e n + r a j a n + r a j a n a + r a j a n a a p u r e i d e n + r a j a n a a p u r e i h i n s a + r a j a n a a p u r e i k s e m m e + r a j a n a a p u r e i t a + r a j a n a a p u r i + r a j a n a a p u r i i n + r a j a n a a p u r i m a i d e n + r a j a n a a p u r i m m e + r a j a n a a p u r i n a + r a j a n a a p u r i s s a + r a j a n a a p u r i t + r a j a n a a p u r u u s + r a j a n o p e u s + r a j a n s a + r a j a n v a l v o n t a + r a j a n v a l v o n t a o p e r a a t i o n + r a j a n y l i t t ä j i n ä + r a j a n y l i t y k s e e n + r a j a n y l i t y k s e n + r a j a n y l i t y k s e t + r a j a n y l i t y k s i i n + r a j a n y l i t y k s i s t ä + r a j a n y l i t y k s i ä + r a j a n y l i t y s + r a j a n y l i t y s a s e m a l l a + r a j a n y l i t y s a s e m i l l e + r a j a n y l i t y s k e s k u s t a + r a j a n y l i t y s k o h d a t + r a j a n y l i t y s k o h d i s s a + r a j a n y l i t y s k o h t a a + r a j a n y l i t y s k u l u t + r a j a n y l i t y s m e n e t t e l y t + r a j a n y l i t y s o n g e l m i e n + r a j a n y l i t y s p a i k a l l a + r a j a n y l i t y s p a i k a n + r a j a n y l i t y s p a i k a s s a + r a j a n y l i t y s p a i k a t + r a j a n y l i t y s p a i k k a + r a j a n y l i t y s p a i k k a a + r a j a n y l i t y s p a i k k a n a + r a j a n y l i t y s p a i k k o i h i n + r a j a n y l i t y s p a i k k o j a + r a j a n y l i t y s p a i k k o j e n + r a j a n y l i t y s p a i k o i l l a + r a j a n y l i t y s p a i k o i l l e + r a j a n y l i t y s p a i k o i s s a + r a j a n y l i t y s p a i k o i s t a + r a j a n y l i t y s p i s t e e n + r a j a n y l i t y s p i s t e i d e n + r a j a n y l i t y s t a r k a s t u k s e t + r a j a n y l i t y s t e n + r a j a n y l i t y s t ä + r a j a o l o s u h t e i s s a + r a j a o n g e l m a + r a j a o n g e l m a a n + r a j a o n g e l m a n + r a j a o n g e l m a t + r a j a o n g e l m i a + r a j a o n g e l m i e n + r a j a o p e r a a t i o n + r a j a o s u u d e n + r a j a p a i k k a k u n n a l l a + r a j a p a k e t t i a + r a j a p a l v e l u + r a j a p a l v e l u i d e n + r a j a p a r t i o v e r k o s t o + r a j a p i n t a t e k n i i k a s t a + r a j a p i s t e e t + r a j a p o l i i s e i n a + r a j a p o l i i s e j a + r a j a p o l i i s i + r a j a p o l i i s i a + r a j a p o l i i s i e n + r a j a p o l i i s i i n + r a j a p o l i i s i j o u k o t + r a j a p o l i i s i l a i t o s + r a j a p o l i i s i n + r a j a p o l i i s i s t a + r a j a p o l i i s i t + r a j a p o l i i s i y k s i k ö n + r a j a p o l i t i i k a l l a + r a j a p o l i t i i k a n + r a j a p o l i t i i k a s t a + r a j a p o l i t i i k k a a + r a j a p o l i t i i k k a a n + r a j a p o l i t i i k k a a n s a + r a j a p o l i t i i k k o j e n + r a j a p o r t i n + r a j a p u o m i + r a j a p y y k k i + r a j a r i i d a n + r a j a r i i d a s t a + r a j a r i i d a t + r a j a r i i t a + r a j a r i i t a a + r a j a r i i t a n s a + r a j a r i i t o j e n + r a j a s e l k k a u k s e n + r a j a s e l k k a u k s e s t a + r a j a s e l k k a u k s e t + r a j a s e l k k a u k s i l l a + r a j a s e l k k a u k s i s t a + r a j a s e l k k a u s + r a j a s e u d u i l l a + r a j a s e u d u i l l e + r a j a s e u d u i l t a + r a j a s e u d u l l a + r a j a s e u d u l l e + r a j a s e u d u n + r a j a s e u d u t + r a j a s e u t u + r a j a s e u t u a l u e + r a j a s e u t u a l u e e l l a + r a j a s e u t u a l u e e l t a + r a j a s e u t u a l u e e n + r a j a s e u t u a l u e e t + r a j a s e u t u a l u e i d e n + r a j a s e u t u a l u e i l l a + r a j a s e u t u a l u e i l l e + r a j a s e u t u a l u e i s t a m m e + r a j a s e u t u a l u e i t a + r a j a s e u t u i h i n + r a j a s e u t u j a + r a j a s e u t u j e n + r a j a s e u t u o h j e l m i s s a + r a j a s e u t u s o d a t + r a j a s e u t u t o i m i n n a l l a + r a j a s e u t u t y ö n t e k i j ä t + r a j a s e u t u t y ö n t e k i j ö i t ä + r a j a s e u t u y h t e i s t y ö + r a j a s e u t u y h t e i s t y ö n + r a j a s e u t u y h t e i s t y ö s t ä + r a j a s e u t u y h t e i s t y ö t ä + r a j a s e u t u y h t e i s t y ö y h t y m i e n + r a j a s e u t u y h t e i s t y ö y h t y m i k s i + r a j a s e u t u y h t e i s t y ö y h t y m i ä + r a j a s e u t u y h t e i s t y ö y h t y m ä ä + r a j a s o d a n + r a j a s o d a t + r a j a s o p i m u k s e e n + r a j a s o p i m u k s e n + r a j a s o p i m u k s e s s a + r a j a s o p i m u k s e s t a + r a j a s o p i m u k s e t + r a j a s o p i m u k s i a + r a j a s o p i m u k s i s t a + r a j a s o p i m u s + r a j a s o p i m u s t a + r a j a s o t a a + r a j a s o t a a n + r a j a s o t i a + r a j a s t a + r a j a s t r a t e g i a a + r a j a s u l k u j e n + r a j a s u l u t + r a j a s u o j a a + r a j a s u o j a a n + r a j a s u o j a n + r a j a s u o j e l u a + r a j a s ä ä n n ö s t ö + r a j a s ä ä n n ö s t ö n + r a j a s ä ä n n ö s t ö s t ä + r a j a s ä ä n n ö s t ö ä + r a j a s ä ä n n ö s t ö ö n + r a j a t + r a j a t a a n + r a j a t a p a u k s e t + r a j a t a p a u k s i a + r a j a t a p a u k s i i n + r a j a t a p a u k s i s t a + r a j a t a r k a s t u k s e e n + r a j a t a r k a s t u k s e n + r a j a t a r k a s t u k s e s t a + r a j a t a r k a s t u k s e t + r a j a t a r k a s t u k s i a + r a j a t a r k a s t u k s i e n + r a j a t a r k a s t u k s i i n + r a j a t a r k a s t u k s i l l a + r a j a t a r k a s t u k s i l l e + r a j a t a r k a s t u k s i l t a + r a j a t a r k a s t u k s i s s a + r a j a t a r k a s t u k s i s t a + r a j a t a r k a s t u s + r a j a t a r k a s t u s a s e m a n + r a j a t a r k a s t u s a s e m i e n + r a j a t a r k a s t u s a s e m i l l a + r a j a t a r k a s t u s j ä r j e s t e l m ä ä n + r a j a t a r k a s t u s j ä r j e s t e l y i s t ä + r a j a t a r k a s t u s p i s t e i d e n + r a j a t a r k a s t u s p o l i t i i k k a a n s a + r a j a t a r k a s t u s p o l i t i i k k o j e n + r a j a t a r k a s t u s s ä ä n t ö j ä + r a j a t a r k a s t u s t e n + r a j a t a r k i s t u k s i a + r a j a t a r k i s t u k s i s t a + r a j a t i l a p s y k o o s i + r a j a t o i m e n p i t e e t + r a j a t o i m e n p i t e i t ä + r a j a t o i m e t + r a j a t o i m i e n + r a j a t o i m i n t a a n + r a j a t o n t a + r a j a t t a v a + r a j a t t o m a l l a + r a j a t t o m a n + r a j a t t o m a s s a + r a j a t t o m a s t a + r a j a t t o m i e n + r a j a t t o m u u d e n + r a j a t t u a + r a j a t t u j a + r a j a t u m p a a + r a j a t u m p i + r a j a t u m p i a + r a j a t u o t t e i s s a k i n + r a j a t u o t t e i s t a + r a j a t u o t t e i t a + r a j a t u r v a l l i s u u d e n + r a j a t u r v a l l i s u u s + r a j a t u r v a l l i s u u s a s i a n t u n t i j o i t a + r a j a t u r v a l l i s u u s j ä r j e s t e l m i e n + r a j a t u r v a l l i s u u s v i r a s t o + r a j a t u r v a l l i s u u s v i r a s t o a + r a j a t u r v a l l i s u u s v i r a s t o n + r a j a t u r v a l l i s u u t e e n + r a j a t u r v a l l i s u u t t a + r a j a t u s t a + r a j a t y l i t t ä v i e n + r a j a t y l i t t ä v i i n + r a j a t y l i t t ä v i k s i + r a j a t y l i t t ä v i l l e + r a j a t y l i t t ä v i l l ä + r a j a t y l i t t ä v i l t ä + r a j a t y l i t t ä v i n ä + r a j a t y l i t t ä v i s s ä + r a j a t y l i t t ä v i s t ä + r a j a t y l i t t ä v i ä + r a j a t y l i t t ä v ä l l e + r a j a t y l i t t ä v ä l l ä + r a j a t y l i t t ä v ä l t ä + r a j a t y l i t t ä v ä n + r a j a t y l i t t ä v ä n ä + r a j a t y l i t t ä v ä s s ä + r a j a t y l i t t ä v ä s t ä + r a j a t y l i t t ä v ä t + r a j a t y l i t t ä v ä ä + r a j a t y l i t t ä v ä ä n + r a j a t y y p p i i n + r a j a t y ö + r a j a t y ö a s i a + r a j a t y ö h ö n + r a j a t y ö l ä i s e t + r a j a t y ö n t e k i j ä + r a j a t y ö n t e k i j ä n + r a j a t y ö n t e k i j ä n ä + r a j a t y ö n t e k i j ä t + r a j a t y ö n t e k i j ä ä + r a j a t y ö n t e k i j ö i d e n + r a j a t y ö n t e k i j ö i h i n + r a j a t y ö n t e k i j ö i l l e + r a j a t y ö n t e k i j ö i l l e m m e + r a j a t y ö n t e k i j ö i l l ä + r a j a t y ö n t e k i j ö i n ä + r a j a t y ö n t e k i j ö i t ä + r a j a t y ö n t e k o o n + r a j a t y ö s t ä + r a j a t y ö t e k i j ö i t ä + r a j a t y ö t ä + r a j a u s k e r r o i n + r a j a u s t a + r a j a v a i k u t u k s e n + r a j a v a i k u t u s s e l v i t y k s e s t ä + r a j a v a i k u t u s s e l v i t y s + r a j a v a i k u t u s s e l v i t y s t ä + r a j a v a i k u t u s t a + r a j a v a l t i o + r a j a v a l t i o i d e n + r a j a v a l t i o i h i n + r a j a v a l t i o i l l e + r a j a v a l t i o i s s a + r a j a v a l t i o i t a + r a j a v a l t i o k s i + r a j a v a l t i o l l a + r a j a v a l t i o n + r a j a v a l t i o t + r a j a v a l t i o t a + r a j a v a l t i o v i r a n o m a i s t e n + r a j a v a l v o j a a + r a j a v a l v o j i e n + r a j a v a l v o n n a k s i + r a j a v a l v o n n a l l a + r a j a v a l v o n n a n + r a j a v a l v o n n a s s a + r a j a v a l v o n n a s s a a n + r a j a v a l v o n n a s t a + r a j a v a l v o n t a + r a j a v a l v o n t a a + r a j a v a l v o n t a a m m e + r a j a v a l v o n t a a n + r a j a v a l v o n t a a n s a + r a j a v a l v o n t a e l i n t e n + r a j a v a l v o n t a h a n k k e i t a + r a j a v a l v o n t a h e n k i l ö s t ö + r a j a v a l v o n t a h e n k i l ö s t ö n + r a j a v a l v o n t a j o u k k o j a + r a j a v a l v o n t a j o u k o t + r a j a v a l v o n t a j ä r j e s t e l m i e n + r a j a v a l v o n t a j ä r j e s t e l m i ä + r a j a v a l v o n t a j ä r j e s t e l m ä + r a j a v a l v o n t a j ä r j e s t e l m ä l l ä + r a j a v a l v o n t a j ä r j e s t e l m ä n + r a j a v a l v o n t a j ä r j e s t e l m ä t + r a j a v a l v o n t a j ä r j e s t e l m ä ä + r a j a v a l v o n t a j ä r j e s t e l m ä ä n s ä + r a j a v a l v o n t a k y s y m y k s e n + r a j a v a l v o n t a k y s y m y k s i ä + r a j a v a l v o n t a l a i t o k s e l l a + r a j a v a l v o n t a l a i t o s + r a j a v a l v o n t a m e n e t t e l y t + r a j a v a l v o n t a m m e + r a j a v a l v o n t a o h j e l m a a + r a j a v a l v o n t a o h j e l m a t + r a j a v a l v o n t a o p e r a a t i o i d e n + r a j a v a l v o n t a o p e r a a t i o i s s a + r a j a v a l v o n t a o p e r a a t i o t a + r a j a v a l v o n t a p a i k k a a + r a j a v a l v o n t a p a l v e l u + r a j a v a l v o n t a p a l v e l u u n + r a j a v a l v o n t a p a r t i o i d e n + r a j a v a l v o n t a p a r t i o i t a + r a j a v a l v o n t a p o l i t i i k k a + r a j a v a l v o n t a p o l i t i i k k a a + r a j a v a l v o n t a r e s u r s s e j a + r a j a v a l v o n t a s t r a t e g i a a + r a j a v a l v o n t a t e h t ä v i e n + r a j a v a l v o n t a t e h t ä v i ä + r a j a v a l v o n t a t o i m i a + r a j a v a l v o n t a t o i m i s s a + r a j a v a l v o n t a v a s t u u + r a j a v a l v o n t a v i r a n o m a i s e n + r a j a v a l v o n t a v i r a n o m a i s e t + r a j a v a l v o n t a v i r a n o m a i s i a + r a j a v a l v o n t a v i r a n o m a i s i l l e + r a j a v a l v o n t a v i r a n o m a i s i n e e n + r a j a v a l v o n t a v i r a n o m a i s i s t a + r a j a v a l v o n t a v i r a n o m a i s j o u k o t + r a j a v a l v o n t a v i r a n o m a i s t e n + r a j a v a l v o n t a v i r a s t o + r a j a v a l v o n t a v i r a s t o a + r a j a v a l v o n t a v i r a s t o j e n + r a j a v a l v o n t a v i r a s t o l l e + r a j a v a l v o n t a v i r a s t o n + r a j a v a l v o n t a v i r a s t o o n + r a j a v a l v o n t a v i r a s t o s t a + r a j a v a l v o n t a v o i m i a + r a j a v a l v o n t a y k s i k k ö + r a j a v a r t i j a + r a j a v a r t i j a a + r a j a v a r t i j a k o u l u t u k s e n + r a j a v a r t i j a l l e + r a j a v a r t i j a n + r a j a v a r t i j a t + r a j a v a r t i j o i d e n + r a j a v a r t i j o i l l a + r a j a v a r t i j o i l l e + r a j a v a r t i j o i s t a + r a j a v a r t i j o i t a + r a j a v a r t i o + r a j a v a r t i o i d e n + r a j a v a r t i o i l l a + r a j a v a r t i o i n n i n + r a j a v a r t i o i n n i s t a + r a j a v a r t i o i n t i i n + r a j a v a r t i o i t a + r a j a v a r t i o j o u k k o j e n + r a j a v a r t i o j o u k o t + r a j a v a r t i o j ä r j e s t e l m ä n + r a j a v a r t i o l a i t o k s e e n + r a j a v a r t i o l a i t o k s e l l a + r a j a v a r t i o l a i t o k s e l l e + r a j a v a r t i o l a i t o k s e n + r a j a v a r t i o l a i t o k s e n a + r a j a v a r t i o l a i t o k s e s t a + r a j a v a r t i o l a i t o s + r a j a v a r t i o l a i t o s t a + r a j a v a r t i o l a i t o s t e n + r a j a v a r t i o n + r a j a v a r t i o p ä ä l l i k ö n + r a j a v a r t i o s t o + r a j a v a r t i o s t o a + r a j a v a r t i o s t o i s t a + r a j a v a r t i o s t o j a + r a j a v a r t i o s t o j e n + r a j a v a r t i o s t o n + r a j a v a r t i o s t o s t a + r a j a v a r t i o s t o t + r a j a v a r t i o v i r a n o m a i s t a + r a j a v a r t i o v i r a s t o + r a j a v a s t u u y h t i ö + r a j a v e r o n + r a j a v e s i e n + r a j a v i i v a + r a j a v i i v a a + r a j a v i i v a n + r a j a v i r a n o m a i s e t + r a j a v i r a n o m a i s i a + r a j a v i r a n o m a i s i l l a + r a j a v i r a n o m a i s i l l e + r a j a v i r a n o m a i s t e n + r a j a v i r a s t o a + r a j a v i r k a i l i j a + r a j a v i r k a i l i j a t + r a j a v o i m i s t a + r a j a v y ö h y k k e e l l e + r a j a v y ö h y k k e i l l ä + r a j a v ä l i k o h t a u k s i a + r a j a v ä l i k o h t a u s + r a j a v ä l i t y s s o p i m u k s e n + r a j a y h t e i s t y ö n + r a j a y h t e i s t y ö s s ä + r a j a y h t e i s t y ö t ä + r a j a y h t e i s ö j e n + r a j a y k s i k ö i d e n + r a j a y k s i k ö n + r a j a y l i t y s p a i k a t + r a j o i h i n + r a j o i l l a + r a j o i l l a m m e + r a j o i l l e + r a j o i n + r a j o i s s a + r a j o i s t a + r a j o i t e t a a n + r a j o i t e t a a n k i n + r a j o i t e t t a i s i i n + r a j o i t e t t a v a + r a j o i t e t t a v i a + r a j o i t e t t u a + r a j o i t e t t u j a + r a j o i t e t t u u n + r a j o i t e t u i k s i + r a j o i t e t u i l t a + r a j o i t e t u m m a l l e + r a j o i t e t u m m a l t a + r a j o i t e t u m m a n + r a j o i t e t u m m a s s a + r a j o i t e t u m m a s t a + r a j o i t e t u m m a t + r a j o i t e t u m m i l t a + r a j o i t e t u m m i n + r a j o i t e t u m p a a + r a j o i t e t u m p i + r a j o i t e t u m p i a + r a j o i t e t u n + r a j o i t e t u s t a + r a j o i t t a a + r a j o i t t a a k s e e n + r a j o i t t a a k s e m m e + r a j o i t t a i s i + r a j o i t t a m a a n + r a j o i t t a m a l l a + r a j o i t t a m a s s a + r a j o i t t a m a s t a + r a j o i t t a m a t o n t a + r a j o i t t a m a t t a + r a j o i t t a m a t t o m i a + r a j o i t t a m a t t o m i i n + r a j o i t t a m i s e k s i + r a j o i t t a m i s e s t a + r a j o i t t a m i s j ä r j e s t e l m ä + r a j o i t t a m i s j ä r j e s t e l m ä l l ä + r a j o i t t a m i s k e i n o + r a j o i t t a m i s m e k a n i s m i n + r a j o i t t a m i s n e u v o t t e l u t + r a j o i t t a m i s o h j e l m i i n + r a j o i t t a m i s p o l i t i i k a n + r a j o i t t a m i s p o l i t i i k k a a + r a j o i t t a m i s t a + r a j o i t t a m i s t a v o i t t e i s t a + r a j o i t t a m i s t o i m i a + r a j o i t t a m i s t o i m i e n + r a j o i t t a m i s v e l v o l l i s u u t e e n + r a j o i t t a n e e t + r a j o i t t a v a a + r a j o i t t a v a k a a n + r a j o i t t a v a l l a + r a j o i t t a v a m m a n + r a j o i t t a v a m m a s t a + r a j o i t t a v a m m a t + r a j o i t t a v a m m i n + r a j o i t t a v a m m i s t a + r a j o i t t a v a m p a a + r a j o i t t a v a m p a a n + r a j o i t t a v a m p i + r a j o i t t a v a m p i a + r a j o i t t a v a m p i e n + r a j o i t t a v a n + r a j o i t t a v a s t a + r a j o i t t a v a t + r a j o i t t a v i a + r a j o i t t a v i i n + r a j o i t t a v i l l e + r a j o i t t a v i m p i i n + r a j o i t t e e t + r a j o i t t e i d e n + r a j o i t t e i t a + r a j o i t t i + r a j o i t t i v a t + r a j o i t t u a + r a j o i t t u i + r a j o i t t u n e e m p i + r a j o i t t u n e e m p i a + r a j o i t t u n u t t a + r a j o i t t u u + r a j o i t t u u k i n + r a j o i t t u v a t + r a j o i t t u v a t k i n + r a j o i t u k s e n i + r a j o i t u k s e n s a + r a j o i t u k s e t + r a j o i t u k s e t o n t a + r a j o i t u k s e t t a + r a j o i t u k s i a + r a j o i t u k s i i n + r a j o i t u k s i l l a + r a j o i t u k s i n + r a j o i t u k s i n a + r a j o i t u k s i n e e n + r a j o i t u k s i s t a + r a j o i t u k s i t t a + r a j o i t u n + r a j o i t u s a i k a a + r a j o i t u s e h d o t u k s e t + r a j o i t u s j ä r j e s t e l m ä n + r a j o i t u s j ä r j e s t e l m ä t + r a j o i t u s j ä r j e s t e l y j ä + r a j o i t u s k r i t e e r i n ä + r a j o i t u s m a r k k i n a u u d i s t u k s i a + r a j o i t u s m e k a n i s m i n a + r a j o i t u s p e r i a a t e + r a j o i t u s s u u n n i t e l m i e n + r a j o i t u s t e n + r a j o i t u s t o i m e n p i t e i t ä + r a j o i t u s t o i m e t + r a j o i t u s t o i m i a + r a j o i t u s t o i m i i n + r a j o i t u t t a v a + r a j o j a + r a j o j a a n + r a j o j e m m e + r a j o j e n + r a j o j e n s a + r a j o j e n v a l v o n t a a + r a j u i m m i s t a + r a j u j e n + r a j u m m i k s i + r a j u m m i n + r a j u m p a n a + r a j u m y r s k y + r a j u n + r a j u s s a + r a j u u n + r a k a s m e t a l l e j a + r a k a s t a a + r a k a s t a n + r a k a s t e t t u n i + r a k a s t u i s i + r a k a s t u n e e t + r a k a s t u t a a n + r a k e i d e n + r a k e n n a m m e + r a k e n n a m m e k o + r a k e n n a t t e k o + r a k e n n e a p u a + r a k e n n e a s e t u k s e n + r a k e n n e a s e t u s t e n + r a k e n n e a v u n + r a k e n n e b i o l o g i a + r a k e n n e b u d j e t t i e n + r a k e n n e d i r e k t i i v i i n + r a k e n n e h a n k k e i s i i n + r a k e n n e i l m a i s i n + r a k e n n e i n d i k a a t t o r e i t a + r a k e n n e i n s t r u m e n t t i a + r a k e n n e i n t e r v e n t i o i d e n + r a k e n n e i n v e s t o i n t i e n + r a k e n n e i s o m e r i a + r a k e n n e k a a v a + r a k e n n e k e h i t y s + r a k e n n e k e h i t y s r a h a s t o i s t a + r a k e n n e k e h i t y s r a h a s t o j a + r a k e n n e k e h i t y s r a h a s t o t + r a k e n n e k e s k u s t e l u a + r a k e n n e k o h t a i s e s t i + r a k e n n e k o r j a u s o h j e l m i e n + r a k e n n e k r i i s i + r a k e n n e k r i i s i l l ä + r a k e n n e k r i i s i n + r a k e n n e k r i i s i s t ä + r a k e n n e k r i t e e r e i l l e + r a k e n n e k r i t e e r e j ä + r a k e n n e k u s t a n n u k s i s t a + r a k e n n e k y n n e t + r a k e n n e k y s y m y k s e t + r a k e n n e k y s y m y s + r a k e n n e l m a l t a + r a k e n n e l ä h t ö i s e l l ä + r a k e n n e m e k a n i s m e i s t a + r a k e n n e m e n o j e n + r a k e n n e m u k a u t u k s e e n + r a k e n n e m u k a u t u k s e n + r a k e n n e m u k a u t u k s e s s a + r a k e n n e m u k a u t u k s i i n + r a k e n n e m u k a u t u s m a k s u e r ä n + r a k e n n e m u k a u t u s o h j e l m i a + r a k e n n e m u k a u t u s o h j e l m i i n + r a k e n n e m u k a u t u s p o l i t i i k k a + r a k e n n e m u k a u t u s p o l i t i i k k a a + r a k e n n e m u k a u t u s p o l i t i i k k o i h i n + r a k e n n e m u k a u t u s p o l i t i i k k o j a + r a k e n n e m u k a u t u s s u u n n i t e l m i e n + r a k e n n e m u k a u t u s t e n + r a k e n n e m u k a u t u s v a a t i m u k s e t + r a k e n n e m u r r o k s e n + r a k e n n e m u u t o k s e e n + r a k e n n e m u u t o k s e l l e + r a k e n n e m u u t o k s e n + r a k e n n e m u u t o k s e n s a + r a k e n n e m u u t o k s e s s a + r a k e n n e m u u t o k s e s t a + r a k e n n e m u u t o k s e t + r a k e n n e m u u t o k s i a + r a k e n n e m u u t o k s i i n + r a k e n n e m u u t o k s i l l a + r a k e n n e m u u t o k s i s s a + r a k e n n e m u u t o k s i s t a + r a k e n n e m u u t o s + r a k e n n e m u u t o s a i k a n a + r a k e n n e m u u t o s j ä r j e s t e l y j ä + r a k e n n e m u u t o s j ä r j e s t e l y t + r a k e n n e m u u t o s k e s k u s t e l u s s a + r a k e n n e m u u t o s o h j e l m a + r a k e n n e m u u t o s o h j e l m a t + r a k e n n e m u u t o s o h j e l m i a + r a k e n n e m u u t o s o h j e l m i e n + r a k e n n e m u u t o s o n g e l m i i n + r a k e n n e m u u t o s o n g e l m i s s a + r a k e n n e m u u t o s p o l i t i i k a n + r a k e n n e m u u t o s p o l i t i i k k a a + r a k e n n e m u u t o s p r o s e s s i + r a k e n n e m u u t o s p r o s e s s i i n + r a k e n n e m u u t o s p r o s e s s i n + r a k e n n e m u u t o s p r o s e s s i s s a + r a k e n n e m u u t o s p r o s e s s i t + r a k e n n e m u u t o s r a h a s t o + r a k e n n e m u u t o s s t r a t e g i a t + r a k e n n e m u u t o s s u u n n i t e l m a + r a k e n n e m u u t o s s u u n n i t e l m a l l a + r a k e n n e m u u t o s s u u n n i t e l m i a + r a k e n n e m u u t o s s u u n n i t e l m i e n + r a k e n n e m u u t o s t a + r a k e n n e m u u t o s t e n + r a k e n n e m u u t o s t o i m e n p i t e i t ä + r a k e n n e m u u t o s t o i m i a + r a k e n n e m u u t o s t o i m i e n + r a k e n n e m u u t o s t u e n + r a k e n n e m u u t o s t u k e a + r a k e n n e m u u t o s t u k e e n + r a k e n n e m u u t o s t u k i + r a k e n n e m ä ä r ä r a h a t + r a k e n n e m ä ä r ä r a h o i s t a + r a k e n n e m ä ä r ä r a h o j a + r a k e n n e m ä ä r ä r a h o j e n + r a k e n n e o h j e l m a n + r a k e n n e o h j e l m a s s a + r a k e n n e o h j e l m a s t a + r a k e n n e o h j e l m i a + r a k e n n e o h j e l m i e n + r a k e n n e o h j e l m i i n + r a k e n n e o h j e l m i l l a + r a k e n n e o h j e l m i s s a + r a k e n n e o h j e l m i s s a a n + r a k e n n e o n g e l m a + r a k e n n e o n g e l m a a + r a k e n n e o n g e l m a s t a + r a k e n n e o n g e l m a t + r a k e n n e o n g e l m i a + r a k e n n e o n g e l m i e n + r a k e n n e o n g e l m i i n + r a k e n n e o n g e l m i s t a + r a k e n n e o s a + r a k e n n e o s a a + r a k e n n e o s i e n + r a k e n n e o s i i n s a + r a k e n n e o s i s t a + r a k e n n e p e r i a a t t e i d e n + r a k e n n e p o l i i t t i n e n + r a k e n n e p o l i i t t i s e s t a + r a k e n n e p o l i i t t i s e t + r a k e n n e p o l i i t t i s i a + r a k e n n e p o l i i t t i s i l l a + r a k e n n e p o l i i t t i s i s s a + r a k e n n e p o l i i t t i s t a + r a k e n n e p o l i i t t i s t e n + r a k e n n e p o l i t i i k a k s i + r a k e n n e p o l i t i i k a l l a + r a k e n n e p o l i t i i k a l l e + r a k e n n e p o l i t i i k a n + r a k e n n e p o l i t i i k a s s a + r a k e n n e p o l i t i i k a s t a + r a k e n n e p o l i t i i k a s t a m m e + r a k e n n e p o l i t i i k a t + r a k e n n e p o l i t i i k k a + r a k e n n e p o l i t i i k k a a + r a k e n n e p o l i t i i k k a a m m e + r a k e n n e p o l i t i i k k a a n + r a k e n n e p o l i t i i k k a m m e + r a k e n n e p o l i t i i k k a n a + r a k e n n e p o l i t i i k k o i h i n + r a k e n n e p o l i t i i k k o j a + r a k e n n e p o l i t i i k k o j e n + r a k e n n e p o l i t i i k o i d e n + r a k e n n e p o l i t i i k o i l l a + r a k e n n e p o l i t i i k o i l l e + r a k e n n e p o l i t i i k o i s s a + r a k e n n e p o l i t i i k o i s t a + r a k e n n e p o l i t i i k o i t a + r a k e n n e p r o s e s s e i l l a + r a k e n n e p u o l e l l a + r a k e n n e r a h a n s a + r a k e n n e r a h a s t o + r a k e n n e r a h a s t o a + r a k e n n e r a h a s t o a s e t u k s e e n + r a k e n n e r a h a s t o a s e t u k s e l l a + r a k e n n e r a h a s t o a s e t u k s e n + r a k e n n e r a h a s t o a s e t u k s e s s a + r a k e n n e r a h a s t o a s e t u k s i a + r a k e n n e r a h a s t o a s e t u k s i k s i + r a k e n n e r a h a s t o a s e t u k s i s s a + r a k e n n e r a h a s t o a s e t u s + r a k e n n e r a h a s t o a s e t u s t a + r a k e n n e r a h a s t o a s e t u s t e n + r a k e n n e r a h a s t o h a n k k e i d e n + r a k e n n e r a h a s t o i d e n + r a k e n n e r a h a s t o i h i n + r a k e n n e r a h a s t o i h i n i + r a k e n n e r a h a s t o i h i n n e + r a k e n n e r a h a s t o i l l a + r a k e n n e r a h a s t o i l l e + r a k e n n e r a h a s t o i l t a + r a k e n n e r a h a s t o i n n i n + r a k e n n e r a h a s t o i s s a + r a k e n n e r a h a s t o i s t a + r a k e n n e r a h a s t o j a + r a k e n n e r a h a s t o j a a n + r a k e n n e r a h a s t o j a k s o + r a k e n n e r a h a s t o j a m m e + r a k e n n e r a h a s t o j e m m e + r a k e n n e r a h a s t o j e n + r a k e n n e r a h a s t o j ä r j e s t e l m ä n + r a k e n n e r a h a s t o j ä r j e s t e l m ä ä n + r a k e n n e r a h a s t o j ä r j e s t e l y i h i n + r a k e n n e r a h a s t o k a r t a s s a + r a k e n n e r a h a s t o k a u d e l l a + r a k e n n e r a h a s t o k a u d e n + r a k e n n e r a h a s t o k a u t e e n + r a k e n n e r a h a s t o k e l p o i s u u s + r a k e n n e r a h a s t o k i i s t o j a + r a k e n n e r a h a s t o l l e + r a k e n n e r a h a s t o m e k a n i s m i e n + r a k e n n e r a h a s t o m e n e t t e l y j e n + r a k e n n e r a h a s t o m e n o i h i n + r a k e n n e r a h a s t o m e n o i s t a + r a k e n n e r a h a s t o m e n o j e n + r a k e n n e r a h a s t o m e n o t + r a k e n n e r a h a s t o m ä ä r ä r a h a t + r a k e n n e r a h a s t o m ä ä r ä r a h o i s t a + r a k e n n e r a h a s t o m ä ä r ä r a h o j a + r a k e n n e r a h a s t o m ä ä r ä r a h o j e n + r a k e n n e r a h a s t o m ä ä r ä y k s e t + r a k e n n e r a h a s t o m ä ä r ä y k s i k s i + r a k e n n e r a h a s t o m ä ä r ä y k s i s t ä + r a k e n n e r a h a s t o n + r a k e n n e r a h a s t o n a + r a k e n n e r a h a s t o o n + r a k e n n e r a h a s t o p a k e t i n + r a k e n n e r a h a s t o p a k e t i s t a + r a k e n n e r a h a s t o p o l i t i i k a n + r a k e n n e r a h a s t o p o l i t i i k a s s a + r a k e n n e r a h a s t o p o l i t i i k a s t a m m e + r a k e n n e r a h a s t o p o l i t i i k a t + r a k e n n e r a h a s t o p o l i t i i k k a + r a k e n n e r a h a s t o p o l i t i i k k a a + r a k e n n e r a h a s t o p o l i t i i k k a a n + r a k e n n e r a h a s t o r a h o j a + r a k e n n e r a h a s t o s s a + r a k e n n e r a h a s t o s t a + r a k e n n e r a h a s t o s u u n n i t e l m i s s a + r a k e n n e r a h a s t o s ä ä n t ö j e n + r a k e n n e r a h a s t o s ä ä n t ö j ä + r a k e n n e r a h a s t o t + r a k e n n e r a h a s t o t o i m e n p i t e i d e n + r a k e n n e r a h a s t o t o i m e n p i t e i s t ä + r a k e n n e r a h a s t o t o i m e t + r a k e n n e r a h a s t o t o i m i a + r a k e n n e r a h a s t o t o i m i e n + r a k e n n e r a h a s t o t o i m i i n + r a k e n n e r a h a s t o t o i m i s t a + r a k e n n e r a h a s t o t u e n + r a k e n n e r a h a s t o t u i l l a + r a k e n n e r a h a s t o t u k e a + r a k e n n e r a h a s t o t u k e e n + r a k e n n e r a h a s t o t u k i + r a k e n n e r a h a s t o t u k i a + r a k e n n e r a h a s t o t u k i e n + r a k e n n e r a h a s t o u l o t t u v u u s + r a k e n n e r a h a s t o u u d i s t u k s e e n + r a k e n n e r a h a s t o u u d i s t u k s e n + r a k e n n e r a h a s t o u u d i s t u k s e s s a + r a k e n n e r a h a s t o u u d i s t u k s e s s a k i n + r a k e n n e r a h a s t o u u d i s t u k s i a + r a k e n n e r a h a s t o u u d i s t u s + r a k e n n e r a h a s t o u u d i s t u s t a + r a k e n n e r a h a s t o u u d i s t u s t e n + r a k e n n e r a h a s t o v a k u u d e n + r a k e n n e r a h a s t o v a r a t + r a k e n n e r a h a s t o v a r o i h i n + r a k e n n e r a h a s t o v a r o i l l a + r a k e n n e r a h a s t o v a r o i n + r a k e n n e r a h a s t o v a r o i s t a + r a k e n n e r a h a s t o v a r o j a + r a k e n n e r a h a s t o v a r o j a a n + r a k e n n e r a h a s t o v a r o j e n + r a k e n n e r a h a s t o v ä l i n e + r a k e n n e r a h a t + r a k e n n e r a h o i s t a + r a k e n n e r a h o i t u k s e e n + r a k e n n e r a h o i t u k s e n + r a k e n n e r a h o i t u k s e s s a + r a k e n n e r a h o i t u k s e s t a + r a k e n n e r a h o i t u s + r a k e n n e r a h o i t u s t a + r a k e n n e r a h o i t u s v ä l i n e e s t ä + r a k e n n e r a h o j a + r a k e n n e r a t k a i s u i h i n + r a k e n n e s e k t o r i n + r a k e n n e s i j o i t u s p a l v e l u t + r a k e n n e s o p e u t u k s e e n + r a k e n n e s o p e u t u k s e t + r a k e n n e s o p e u t u s j ä r j e s t e l m ä s t ä + r a k e n n e s o p e u t u s o h j e l m a n + r a k e n n e s o p e u t u s o h j e l m a t + r a k e n n e s o p e u t u s o h j e l m i a + r a k e n n e s o p e u t u s o h j e l m i e n + r a k e n n e s o p e u t u s o h j e l m i l l a + r a k e n n e s o p e u t u s o h j e l m i s t a + r a k e n n e s o p e u t u s p o l i t i i k a t + r a k e n n e s o p e u t u s p o l i t i i k k a + r a k e n n e s o p e u t u s p o l i t i i k k a a + r a k e n n e s o p e u t u s p o l i t i i k k o i h i n + r a k e n n e s o p e u t u s s u u n n i t e l m a t + r a k e n n e s o p e u t u s s u u n n i t e l m i e n + r a k e n n e s o p e u t u s t e n + r a k e n n e s o p e u t u s t o i m i e n + r a k e n n e s o p e u t u s t o i m i i n + r a k e n n e s o p e u t u s t u e n + r a k e n n e s t a n d a r d i e n + r a k e n n e s u u n n i t t e l u + r a k e n n e s u u n n i t t e l u u n + r a k e n n e s y i s t ä + r a k e n n e s ä ä n n ö s t ö ä + r a k e n n e t a + r a k e n n e t a a n + r a k e n n e t a s o l l a + r a k e n n e t e k i j ä + r a k e n n e t e r ä s + r a k e n n e t i l a s t o j a + r a k e n n e t o i m e n + r a k e n n e t o i m e n p i t e e t + r a k e n n e t o i m e n p i t e i d e n + r a k e n n e t o i m e n p i t e i s i i n + r a k e n n e t o i m e n p i t e i t ä + r a k e n n e t o i m e t + r a k e n n e t o i m i a + r a k e n n e t o i m i e n + r a k e n n e t o i m i e n k i n + r a k e n n e t o i m i i n + r a k e n n e t o i m i l l e + r a k e n n e t o i m i s s a + r a k e n n e t o i m i s t a + r a k e n n e t t a + r a k e n n e t t a e s s a + r a k e n n e t t a v a + r a k e n n e t t a v i a + r a k e n n e t t a v i e n + r a k e n n e t t u a + r a k e n n e t u e l l a + r a k e n n e t u e l t a + r a k e n n e t u e n + r a k e n n e t u e s t a + r a k e n n e t u e t + r a k e n n e t u i l l a + r a k e n n e t u i s t a + r a k e n n e t u k e a + r a k e n n e t u k e e n + r a k e n n e t u k e n a + r a k e n n e t u k i + r a k e n n e t u k i a + r a k e n n e t u k i e n + r a k e n n e t u k i i n + r a k e n n e t u k i k e h y s + r a k e n n e t u k i k e h y s t ä + r a k e n n e t u k i p a k e t i s t a + r a k e n n e t u k i p a k e t t i + r a k e n n e t u k i p o l i t i i k k a a + r a k e n n e t u k i p o l i t i i k k o j e n + r a k e n n e t u k i t o i m e n p i t e i t ä + r a k e n n e t u k i t o i m i e n + r a k e n n e t u t k i m u k s e n + r a k e n n e t u t k i m u s t e n + r a k e n n e t y ö t t ö m y y d e n + r a k e n n e t y ö t t ö m y y t e e n + r a k e n n e t y ö t t ö m y y t t ä + r a k e n n e u u d i s t u k s e e n + r a k e n n e u u d i s t u k s e l l e + r a k e n n e u u d i s t u k s e n + r a k e n n e u u d i s t u k s e s s a + r a k e n n e u u d i s t u k s e s t a + r a k e n n e u u d i s t u k s e t + r a k e n n e u u d i s t u k s e t h a n + r a k e n n e u u d i s t u k s i a + r a k e n n e u u d i s t u k s i a a n + r a k e n n e u u d i s t u k s i i n + r a k e n n e u u d i s t u k s i l l a + r a k e n n e u u d i s t u k s i l l e + r a k e n n e u u d i s t u k s i n e e n + r a k e n n e u u d i s t u k s i s s a + r a k e n n e u u d i s t u k s i s t a + r a k e n n e u u d i s t u s + r a k e n n e u u d i s t u s h a n k k e i t a + r a k e n n e u u d i s t u s j ä r j e s t e l m ä n + r a k e n n e u u d i s t u s j ä r j e s t e l m ä s t ä + r a k e n n e u u d i s t u s j ä r j e s t e l m ä ä + r a k e n n e u u d i s t u s j ä r j e s t e l m ä ä n + r a k e n n e u u d i s t u s j ä r j e s t e l y l l ä + r a k e n n e u u d i s t u s k a u d e l l a + r a k e n n e u u d i s t u s k a u d e n + r a k e n n e u u d i s t u s k u s t a n n u k s i a + r a k e n n e u u d i s t u s k y s y m y s t ä + r a k e n n e u u d i s t u s m a k s u a + r a k e n n e u u d i s t u s m a k s u j a + r a k e n n e u u d i s t u s m a k s u s t a + r a k e n n e u u d i s t u s o h j e l m a + r a k e n n e u u d i s t u s o h j e l m a a + r a k e n n e u u d i s t u s o h j e l m a l l e + r a k e n n e u u d i s t u s o h j e l m a n + r a k e n n e u u d i s t u s o h j e l m a s t a + r a k e n n e u u d i s t u s o h j e l m a t + r a k e n n e u u d i s t u s o h j e l m i a + r a k e n n e u u d i s t u s o h j e l m i e n + r a k e n n e u u d i s t u s o h j e l m i i n + r a k e n n e u u d i s t u s p a k e t i n + r a k e n n e u u d i s t u s p a k e t i s t a + r a k e n n e u u d i s t u s p a k e t t e j a + r a k e n n e u u d i s t u s p a k e t t i a + r a k e n n e u u d i s t u s p o l i t i i k a n + r a k e n n e u u d i s t u s p o l i t i i k a s t a + r a k e n n e u u d i s t u s p o l i t i i k k a a + r a k e n n e u u d i s t u s p o l i t i i k k o j e n + r a k e n n e u u d i s t u s p o n n i s t e l u j e n + r a k e n n e u u d i s t u s p r o s e s s e i h i n + r a k e n n e u u d i s t u s p r o s e s s e j a + r a k e n n e u u d i s t u s p r o s e s s i + r a k e n n e u u d i s t u s p r o s e s s i a + r a k e n n e u u d i s t u s p r o s e s s i e n + r a k e n n e u u d i s t u s p r o s e s s i i n + r a k e n n e u u d i s t u s p r o s e s s i n + r a k e n n e u u d i s t u s p r o s e s s i t + r a k e n n e u u d i s t u s p ä ä t ö k s i i n + r a k e n n e u u d i s t u s r a h a s t a + r a k e n n e u u d i s t u s r a h a s t o + r a k e n n e u u d i s t u s r a h a s t o a + r a k e n n e u u d i s t u s r a h a s t o j e n + r a k e n n e u u d i s t u s r a h a s t o m a k s u + r a k e n n e u u d i s t u s r a h a s t o n + r a k e n n e u u d i s t u s r a h a s t o o n + r a k e n n e u u d i s t u s r a h a s t o s t a + r a k e n n e u u d i s t u s r a h o i s t a + r a k e n n e u u d i s t u s s t r a t e g i a a + r a k e n n e u u d i s t u s s u u n n i t e l m a + r a k e n n e u u d i s t u s s u u n n i t e l m a a + r a k e n n e u u d i s t u s s u u n n i t e l m a a n + r a k e n n e u u d i s t u s s u u n n i t e l m a n + r a k e n n e u u d i s t u s s u u n n i t e l m a n s a + r a k e n n e u u d i s t u s s u u n n i t e l m a s s a + r a k e n n e u u d i s t u s s u u n n i t e l m a s t a + r a k e n n e u u d i s t u s s u u n n i t e l m a t + r a k e n n e u u d i s t u s s u u n n i t e l m i a + r a k e n n e u u d i s t u s s u u n n i t e l m i e n + r a k e n n e u u d i s t u s s u u n n i t e l m i i n + r a k e n n e u u d i s t u s s u u n n i t e l m i l l a + r a k e n n e u u d i s t u s s u u n n i t e l m i s s a + r a k e n n e u u d i s t u s s u u n n i t e l m i s t a + r a k e n n e u u d i s t u s t a + r a k e n n e u u d i s t u s t a p a u k s i a + r a k e n n e u u d i s t u s t a p a u k s i s s a + r a k e n n e u u d i s t u s t e n + r a k e n n e u u d i s t u s t e n s a + r a k e n n e u u d i s t u s t o i m e n p i t e e t + r a k e n n e u u d i s t u s t o i m e n p i t e i d e n + r a k e n n e u u d i s t u s t o i m e n p i t e i l l e + r a k e n n e u u d i s t u s t o i m e n p i t e i t ä + r a k e n n e u u d i s t u s t o i m e t + r a k e n n e u u d i s t u s t o i m i a + r a k e n n e u u d i s t u s t o i m i e n + r a k e n n e u u d i s t u s t o i m i i n + r a k e n n e u u d i s t u s t o i m i l l e + r a k e n n e u u d i s t u s t o i m i n a + r a k e n n e u u d i s t u s t o i m i s s a + r a k e n n e u u d i s t u s t o i m i s t a + r a k e n n e u u d i s t u s t u e k s i + r a k e n n e u u d i s t u s t u e n + r a k e n n e u u d i s t u s t u e s t a + r a k e n n e u u d i s t u s t u k e a + r a k e n n e u u d i s t u s t u k i + r a k e n n e u u d i s t u s t u k i a + r a k e n n e u u d i s t u s t u k i o h j e l m a t + r a k e n n e u u d i s t u s t u k i o h j e l m i a + r a k e n n e u u d i s t u s t u k i o h j e l m i i n + r a k e n n e u u d i s t u s t u k i o h j e l m i s t a + r a k e n n e u u d i s t u s t y ö t ä + r a k e n n e u u d i s t u s v a r o j a + r a k e n n e v a i k e u k s i s t a + r a k e n n e v a r o i s t a + r a k e n n e v a r o j a + r a k e n n e v a r o j e n + r a k e n n e v a s t a i n e n + r a k e n n e v i a n + r a k e n n e v i a s t a + r a k e n n e v i k o j a + r a k e n n e v u o r o p u h e l u n + r a k e n n e v ä l i n e + r a k e n n e y h t e i s t y ö + r a k e n n e y h t e i s t y ö h ö n + r a k e n n e y h t e i s t y ö k y s y m y k s e s s ä + r a k e n n e y h t e i s t y ö n + r a k e n n e y h t e i s t y ö s s ä + r a k e n n e y h t e i s t y ö t ä + r a k e n n e y l i j ä ä m i ä + r a k e n n u k s e s s a + r a k e n n u k s e t + r a k e n n u k s i a + r a k e n n u k s i e n + r a k e n n u k s i i n + r a k e n n u k s i s s a + r a k e n n u k s i s t a + r a k e n n u s a i k a + r a k e n n u s a i n e + r a k e n n u s a i n e e n a + r a k e n n u s a i n e e t + r a k e n n u s a i n e i d e n + r a k e n n u s a i n e i k s i + r a k e n n u s a i n e i s t a + r a k e n n u s a i n e i t a + r a k e n n u s a l a + r a k e n n u s a l a a + r a k e n n u s a l a a n + r a k e n n u s a l a l l a + r a k e n n u s a l a l l e + r a k e n n u s a l a n + r a k e n n u s a l a s t a + r a k e n n u s a l a t + r a k e n n u s a l o i l l a + r a k e n n u s a u t o m a a t i o + r a k e n n u s d i r e k t i i v i + r a k e n n u s d i r e k t i i v i n + r a k e n n u s d i r e k t i i v i ä + r a k e n n u s e l e m e n t i t + r a k e n n u s e r i s t e + r a k e n n u s e r i s t e e n + r a k e n n u s f i r m a + r a k e n n u s h a n k e + r a k e n n u s h a n k e t t a + r a k e n n u s h a n k k e e n + r a k e n n u s h a n k k e e n s a + r a k e n n u s h a n k k e e t + r a k e n n u s h a n k k e i d e n + r a k e n n u s h a n k k e i l l e + r a k e n n u s h a n k k e i s i i n + r a k e n n u s h a n k k e i s s a + r a k e n n u s h a n k k e i s t a + r a k e n n u s h a n k k e i t a + r a k e n n u s i n f r a s t r u k t u u r i + r a k e n n u s i n f r a s t r u k t u u r i n + r a k e n n u s i n s i n ö ö r i + r a k e n n u s i n s i n ö ö r i n ä + r a k e n n u s i n s i n ö ö r i t + r a k e n n u s i n v e s t o i n t e j a + r a k e n n u s j ä t e t t ä + r a k e n n u s j ä t t e e n + r a k e n n u s j ä t t e e t + r a k e n n u s j ä t t e i d e n + r a k e n n u s j ä t t e j ä + r a k e n n u s k a n n a n + r a k e n n u s k a n n a s s a + r a k e n n u s k a n n a s t a + r a k e n n u s k a n t a a + r a k e n n u s k a n t a a n + r a k e n n u s k i e l t o j a + r a k e n n u s k i v e ä + r a k e n n u s k i v i + r a k e n n u s k i v i ä + r a k e n n u s k u s t a n n u k s e t + r a k e n n u s k u s t a n n u k s i a + r a k e n n u s k u s t a n n u k s i s t a + r a k e n n u s k u s t a n n u s t e n + r a k e n n u s l a i n s ä ä d ä n n ö n + r a k e n n u s l a i n s ä ä d ä n t ö ä ä n + r a k e n n u s l a i t t e i d e n + r a k e n n u s l a i t t e i s t o i s t a + r a k e n n u s l a i t t e i s t o t + r a k e n n u s l a k e j a + r a k e n n u s l i n j a + r a k e n n u s l i n j a n + r a k e n n u s l o h k o n + r a k e n n u s l u o t t o + r a k e n n u s l u p a + r a k e n n u s l u p a a + r a k e n n u s l u p a h a k e m u k s e n + r a k e n n u s l u p a m e n e t t e l y ä + r a k e n n u s l u p i a + r a k e n n u s l u p i e n + r a k e n n u s l u v a n + r a k e n n u s m a a l e i s s a + r a k e n n u s m a r k k i n o i d e n + r a k e n n u s m a t e r i a a l e i h i n + r a k e n n u s m a t e r i a a l e i s s a + r a k e n n u s m a t e r i a a l e j a + r a k e n n u s m a t e r i a a l i + r a k e n n u s m a t e r i a a l i a + r a k e n n u s m a t e r i a a l i e n + r a k e n n u s m a t e r i a a l i t + r a k e n n u s m e n e t e l m i e n + r a k e n n u s m e n e t e l m i s s ä + r a k e n n u s m i e s + r a k e n n u s m i e t i n t ö j e n s ä + r a k e n n u s m ä ä r ä y s t e n + r a k e n n u s n o s t u r i t + r a k e n n u s o h j e i l l a + r a k e n n u s o h j e l m a a + r a k e n n u s o h j e l m a n + r a k e n n u s o h j e l m a s t a + r a k e n n u s o h j e l m a t + r a k e n n u s o i k e u s + r a k e n n u s o s a + r a k e n n u s o s a t + r a k e n n u s o s i a + r a k e n n u s p a i k a n + r a k e n n u s p a i k a t + r a k e n n u s p a i k k a + r a k e n n u s p a i k o i s t a + r a k e n n u s p a l i k a s t a + r a k e n n u s p a l i k k a + r a k e n n u s p a l i k k a a + r a k e n n u s p a l i k k a a n + r a k e n n u s p a l i k k a n a + r a k e n n u s p a l i k k a n n e + r a k e n n u s p a l i k o i d e n + r a k e n n u s p a l i k o i n a + r a k e n n u s p a l i k o i s t a + r a k e n n u s p a l i k o i t a + r a k e n n u s p a l v e l u i d e n + r a k e n n u s p e r i n n ö n + r a k e n n u s p e r i n t ö p ä i v i s t ä + r a k e n n u s p o l i t i i k a l l a m m e + r a k e n n u s p o l i t i i k a n + r a k e n n u s p o l i t i i k a s s a + r a k e n n u s p o l i t i i k a s t a + r a k e n n u s p o l i t i i k k a + r a k e n n u s p o l i t i i k k a a + r a k e n n u s p o l i t i i k k a a m m e + r a k e n n u s p o l i t i i k k a a n + r a k e n n u s p r o f i i l i t + r a k e n n u s p r o j e k t e j a + r a k e n n u s p r o s e s s i + r a k e n n u s p r o s e s s i a + r a k e n n u s p r o s e s s i i n + r a k e n n u s p r o s e s s i n a + r a k e n n u s p r o s e s s i s s a + r a k e n n u s p u i t a + r a k e n n u s s e k t o r i i n + r a k e n n u s s e k t o r i l l a + r a k e n n u s s e k t o r i n + r a k e n n u s s u o j e l u + r a k e n n u s s u u n n i t e l m a + r a k e n n u s s u u n n i t e l m a a + r a k e n n u s s u u n n i t e l m a t + r a k e n n u s s u u n n i t e l m i a + r a k e n n u s s u u n n i t e l m i s t a + r a k e n n u s s u u n n i t t e l u + r a k e n n u s s u u n n i t t e l u a + r a k e n n u s s u u n n i t t e l u n + r a k e n n u s s u u n n i t t e l u p a l v e l u i t a + r a k e n n u s s ä ä n t ö j e n + r a k e n n u s t a + r a k e n n u s t a p o j a + r a k e n n u s t a r k a s t a j a t + r a k e n n u s t a r v i k e v a l m i s t a j i e n + r a k e n n u s t a r v i k k e i d e n + r a k e n n u s t a r v i k k e i t a + r a k e n n u s t e k n i i k k a + r a k e n n u s t e k n i i k k a a + r a k e n n u s t e k n i i k k a a n + r a k e n n u s t e l i n e d i r e k t i i v i k s i + r a k e n n u s t e l i n e i s i i n + r a k e n n u s t e l i n e i t ä + r a k e n n u s t e n + r a k e n n u s t e o l l i s u u d e l l a + r a k e n n u s t e o l l i s u u d e l l e + r a k e n n u s t e o l l i s u u d e n + r a k e n n u s t e o l l i s u u d e s s a + r a k e n n u s t e o l l i s u u s + r a k e n n u s t e o l l i s u u t e e n + r a k e n n u s t e o l l i s u u t t a + r a k e n n u s t i h e y d e n + r a k e n n u s t i h e y t t ä + r a k e n n u s t i l a n t e e n + r a k e n n u s t o i m e t + r a k e n n u s t o i m i a + r a k e n n u s t o i m i i n + r a k e n n u s t o i m i n t a + r a k e n n u s t u o t e a s e t u s + r a k e n n u s t u o t e d i r e k t i i v i + r a k e n n u s t u o t e d i r e k t i i v i n + r a k e n n u s t u o t e d i r e k t i i v i ä + r a k e n n u s t u o t e m a r k k i n o i d e n + r a k e n n u s t u o t e y h t e y s p i s t e i s t ä + r a k e n n u s t u o t e y h t e y s p i s t e i t ä + r a k e n n u s t u o t t e e n + r a k e n n u s t u o t t e e t + r a k e n n u s t u o t t e i d e n + r a k e n n u s t u o t t e i l l e + r a k e n n u s t u o t t e i s i i n + r a k e n n u s t u o t t e i s s a + r a k e n n u s t u o t t e i s t a + r a k e n n u s t u o t t e i t a + r a k e n n u s t u r v a l l i s u u t t a + r a k e n n u s t y y p p e j ä + r a k e n n u s t y ö + r a k e n n u s t y ö h ö n + r a k e n n u s t y ö l l e + r a k e n n u s t y ö l ä i s e n + r a k e n n u s t y ö l ä i s e t + r a k e n n u s t y ö l ä i s i l l e + r a k e n n u s t y ö l ä i s i s t ä + r a k e n n u s t y ö l ä i s i ä + r a k e n n u s t y ö l ä i s t e n + r a k e n n u s t y ö m a a + r a k e n n u s t y ö m a a l l a + r a k e n n u s t y ö m a a l l e + r a k e n n u s t y ö m a a n + r a k e n n u s t y ö m a a n s a + r a k e n n u s t y ö m a a s t a + r a k e n n u s t y ö m a i d e n + r a k e n n u s t y ö m a i l l a + r a k e n n u s t y ö m a i s t a + r a k e n n u s t y ö m a i t a + r a k e n n u s t y ö m i e h e e n + r a k e n n u s t y ö n t e k i j ä t + r a k e n n u s t y ö n t e k i j ä ä + r a k e n n u s t y ö n t e k i j ö i d e n + r a k e n n u s t y ö n t e k i j ö i l l e + r a k e n n u s t y ö s s ä + r a k e n n u s t y ö s t ä + r a k e n n u s t y ö s u o r i t u k s i a + r a k e n n u s t y ö t + r a k e n n u s t y ö t ä + r a k e n n u s t ö i d e n + r a k e n n u s t ö i h i n + r a k e n n u s t ö i s t ä + r a k e n n u s t ö i t ä + r a k e n n u s u r a k a t + r a k e n n u s u r a k o i d e n + r a k e n n u s u r a k o i s s a + r a k e n n u s u r a k o i t a + r a k e n n u s u r a k o i t s i j a + r a k e n n u s v a i h e + r a k e n n u s v a i h e e n + r a k e n n u s v i r a s t o + r a k e n n u s v i r a s t o n + r a k e n n u s y h t i ö i d e n + r a k e n n u s y h t i ö i l t ä + r a k e n n u s y h t i ö i t ä + r a k e n n u s y h t i ö l t ä + r a k e n n u s y h t i ö n + r a k e n n u s y h t i ö t ä + r a k e n n u s y m p ä r i s t ö n + r a k e n n u s y r i t t ä j i e n + r a k e n n u s y r i t y k s e n + r a k e n n u s y r i t y k s i l l e + r a k e n n u s y r i t y k s i l l e k i n + r a k e n n u s y r i t y k s i ä + r a k e n n u s y r i t y s + r a k e n n u s y r i t y s t e n + r a k e n n u s y r i t y s t ä + r a k e n n u t t a j a n a i s e t + r a k e n n u t t a j i e n + r a k e n n u t t a v a + r a k e n s i v a t + r a k e n t a a + r a k e n t a a k o + r a k e n t a a k s e e n + r a k e n t a a k s e m m e + r a k e n t a a k s e s i + r a k e n t a e s s a + r a k e n t a j i a + r a k e n t a k a a + r a k e n t a k a a m m e + r a k e n t a m a a n + r a k e n t a m a l l a + r a k e n t a m a m m e + r a k e n t a m a s s a + r a k e n t a m a s t a + r a k e n t a m a t t a + r a k e n t a m i s e e n + r a k e n t a m i s e k s i + r a k e n t a m i s e l l a + r a k e n t a m i s e l l e + r a k e n t a m i s e n + r a k e n t a m i s e n a + r a k e n t a m i s e s s a + r a k e n t a m i s e s t a + r a k e n t a m i s h a n k k e e n + r a k e n t a m i s h a n k k e e s e e n + r a k e n t a m i s h a n k k e i t a + r a k e n t a m i s h a r j o i t u s t a + r a k e n t a m i s k u s t a n n u k s e t + r a k e n t a m i s k u s t a n n u k s i i n + r a k e n t a m i s k u s t a n n u s t e n + r a k e n t a m i s l u v a n + r a k e n t a m i s m e n e t e l m ä t + r a k e n t a m i s o h j e l m i l l a + r a k e n t a m i s p o l i t i i k a s t a + r a k e n t a m i s p o n n i s t e l u i s s a + r a k e n t a m i s p r o s e s s i + r a k e n t a m i s p r o s e s s i a + r a k e n t a m i s p r o s e s s i i n + r a k e n t a m i s p r o s e s s i n + r a k e n t a m i s p r o s e s s i s s a + r a k e n t a m i s p r o s e s s i s t a + r a k e n t a m i s t a + r a k e n t a m i s t a v o i t t e e n + r a k e n t a m i s t e h t ä v ä ä n + r a k e n t a m i s t y ö s s ä + r a k e n t a m i s u u d i s t u s t e n + r a k e n t a m i s v a a t i m u k s i l l a + r a k e n t a m i s v a i h e e s s a + r a k e n t a n e e t + r a k e n t a v a a + r a k e n t a v a a n + r a k e n t a v a h e n k i s e s t ä + r a k e n t a v a k s i + r a k e n t a v a l l a + r a k e n t a v a l l e + r a k e n t a v a m m a l l a + r a k e n t a v a m m a n + r a k e n t a v a m m a t + r a k e n t a v a m m i n + r a k e n t a v a m p a a + r a k e n t a v a m p a a n + r a k e n t a v a m p i + r a k e n t a v a m p i a + r a k e n t a v a m p i e n + r a k e n t a v a n + r a k e n t a v a s s a + r a k e n t a v a s t a + r a k e n t a v a t + r a k e n t a v i a + r a k e n t a v i e n + r a k e n t a v i i n + r a k e n t a v i k s i + r a k e n t a v i l l a + r a k e n t a v i m m a t + r a k e n t a v i n + r a k e n t a v i n a + r a k e n t a v i s t a + r a k e n t e e l l e + r a k e n t e e l l i s e m m a l l a + r a k e n t e e l l i s e m m a l l e + r a k e n t e e l l i s e m m i n + r a k e n t e e l l i s e m p a a + r a k e n t e e l l i s e m p i + r a k e n t e e l l i s e m p i a + r a k e n t e e l l i s e n + r a k e n t e e l l i s e s s a + r a k e n t e e l l i s e t + r a k e n t e e l l i s i a + r a k e n t e e l l i s i i n + r a k e n t e e l l i s i k s i + r a k e n t e e l l i s i l l a + r a k e n t e e l l i s i s s a + r a k e n t e e l l i s i s t a + r a k e n t e e l l i s t a + r a k e n t e e l l i s t e n + r a k e n t e e n + r a k e n t e e n u u d i s t u s p r o s e s s i n + r a k e n t e e s e e n + r a k e n t e e s s a + r a k e n t e e s t a + r a k e n t e e s t a k i n + r a k e n t e e t + r a k e n t e i d e n + r a k e n t e i s i i n + r a k e n t e i s s a + r a k e n t e i s s a a n + r a k e n t e i t a + r a k e n t e i t a a n + r a k e n t u m i s t a + r a k e n t u v a + r a k e t e i n + r a k e t i n h e i t i n + r a k e t t e j a + r a k e t t i j e n g i + r a k e t t i k ä y t t ö i s i l t ä + r a k e t t i m o o t t o r i + r a k e t t i m o o t t o r i e n + r a k e t t i o h j e l m i i n + r a k e t t i r e p p u + r a k e t t i s a t e e s e e n + r a k e t t i s o t a + r a k e t t i t e k n o l o g i a a + r a k e t t i t e k n o l o g i a n + r a k e t t i t i e d e t t ä + r a k e t t i t u l i t u k s e n + r a k e t t i v ä l i k o h t a u s + r a k k a a t + r a k k a i d e m m e + r a k k a i d e n + r a k k a i d e n s a + r a k k a i l l e + r a k k a i l l e e n + r a k k a i m m i s t a + r a k k a i m m i s t a a n + r a k k a i m p a n s a + r a k k a i m p i e n n e + r a k k a i m p i e n s a + r a k k a i s i i n s a + r a k k a i s t a + r a k k a i t a a n + r a k k a i t t e n s a + r a k k a p u n a v a r p u n e n + r a k k a u d e l l a + r a k k a u d e n + r a k k a u d e n o s o i t u k s i a + r a k k a u d e n o s o i t u s + r a k k a u d e n y ö + r a k k a u d e s t a + r a k k a u d e s t a h a n + r a k k a u s a v i o l i i t o n + r a k k a u s a v i o l i i t o t + r a k k a u s k i r j e + r a k k a u s k i r j e i t ä n i + r a k k a u s p o m m i t u s + r a k k a u s r o m a a n i + r a k k a u s t a r i n a + r a k k a u s t a r i n a a + r a k k a u t t a + r a k k o a p i l a + r a k k o l e v ä + r a k k u l a r a u h a n e n + r a k o a + r a k o k o r r o o s i o + r a k o n o k a t + r a k o s e i n i i n + r a l l i a u t o i l i j a + r a n g a i s t a + r a n g a i s t a a n + r a n g a i s t a a n k i n + r a n g a i s t a k s e e n + r a n g a i s t a k s e m m e + r a n g a i s t a v a a + r a n g a i s t a v a a n + r a n g a i s t a v a k s i + r a n g a i s t a v a n + r a n g a i s t a v a n a + r a n g a i s t a v a t + r a n g a i s t a v i a + r a n g a i s t a v i e n + r a n g a i s t a v i i n + r a n g a i s t a v i k s i + r a n g a i s t a v i n a + r a n g a i s t e s s a a n + r a n g a i s t i i n + r a n g a i s t u k s e e n + r a n g a i s t u k s e k s i + r a n g a i s t u k s e l l a + r a n g a i s t u k s e n + r a n g a i s t u k s e n s a + r a n g a i s t u k s e s t a + r a n g a i s t u k s e t + r a n g a i s t u k s e t t a + r a n g a i s t u k s i a + r a n g a i s t u k s i e n + r a n g a i s t u k s i i n + r a n g a i s t u k s i l l a + r a n g a i s t u k s i s t a + r a n g a i s t u s a l u e e l l e + r a n g a i s t u s a s t e i k k o a + r a n g a i s t u s a s t e i k k o j a + r a n g a i s t u s a s t e i k k o o n + r a n g a i s t u s j ä r j e s t e l m i e n + r a n g a i s t u s j ä r j e s t e l m i i n + r a n g a i s t u s j ä r j e s t e l m i s s ä + r a n g a i s t u s j ä r j e s t e l m i ä + r a n g a i s t u s j ä r j e s t e l m ä + r a n g a i s t u s j ä r j e s t e l m ä n + r a n g a i s t u s j ä r j e s t e l m ä s t ä + r a n g a i s t u s j ä r j e s t e l m ä t + r a n g a i s t u s j ä r j e s t e l m ä ä + r a n g a i s t u s k e i n o j a + r a n g a i s t u s k e i n o j e n + r a n g a i s t u s k e i n o n a + r a n g a i s t u s k o r k o a + r a n g a i s t u s k o r o t + r a n g a i s t u s k y s y m y k s i e n + r a n g a i s t u s k y s y m y s + r a n g a i s t u s k ä y t ä n t ö + r a n g a i s t u s k ä y t ä n t ö ä + r a n g a i s t u s l a i n s ä ä d ä n n ö n + r a n g a i s t u s l a i n s ä ä d ä n t ö + r a n g a i s t u s l a i n s ä ä d ä n t ö ä + r a n g a i s t u s l a i t o k s i i n + r a n g a i s t u s l a i t o k s i s s a + r a n g a i s t u s l a i t o s t e n + r a n g a i s t u s l a u k a u s + r a n g a i s t u s m a k s u + r a n g a i s t u s m a k s u j a + r a n g a i s t u s m e k a n i s m e i h i n + r a n g a i s t u s m e k a n i s m i + r a n g a i s t u s m e n e t e l m ä + r a n g a i s t u s m e n e t t e l y i h i n + r a n g a i s t u s m e n e t t e l y s s ä + r a n g a i s t u s m e n e t t e l y t + r a n g a i s t u s m i n u u t t i a + r a n g a i s t u s m u o d o n + r a n g a i s t u s m u o d o t + r a n g a i s t u s m u o t o + r a n g a i s t u s m u o t o a + r a n g a i s t u s m u o t o n a + r a n g a i s t u s m ä ä r ä y k s i ä + r a n g a i s t u s m ä ä r ä y s t e n + r a n g a i s t u s o h j e l m a l l a + r a n g a i s t u s o i k e u d e l l i n e n + r a n g a i s t u s o i k e u s + r a n g a i s t u s p a h o i n p i t e l y i d e n + r a n g a i s t u s p a t a l j o o n a s s a + r a n g a i s t u s p i s t e i d e n + r a n g a i s t u s p i s t e i t ä + r a n g a i s t u s p i s t e j ä r j e s t e l m ä n + r a n g a i s t u s p i s t e r e k i s t e r i + r a n g a i s t u s p o l i t i i k a n + r a n g a i s t u s p o l i t i i k a s t a + r a n g a i s t u s p o t k u + r a n g a i s t u s p o t k u k i l p a i l u + r a n g a i s t u s p o t k u k i l p a i l u n + r a n g a i s t u s p o t k u k i l p a i l u s s a + r a n g a i s t u s r a k e n t e e n + r a n g a i s t u s s a n k t i o i h i n + r a n g a i s t u s s e u r a a m u k s e t + r a n g a i s t u s s e u r a a m u k s i a + r a n g a i s t u s s e u r a a m u k s i l l a + r a n g a i s t u s s e u r a a m u k s i l t a + r a n g a i s t u s s e u r a a m u s t e n + r a n g a i s t u s s i i r t o l a t + r a n g a i s t u s s i i r t o l o i h i n + r a n g a i s t u s s ä ä n n ö s t e n + r a n g a i s t u s s ä ä n t e l y j ä + r a n g a i s t u s t a + r a n g a i s t u s t a s o + r a n g a i s t u s t a s o j a + r a n g a i s t u s t a s o o n + r a n g a i s t u s t e n + r a n g a i s t u s t o i m e n p i d e + r a n g a i s t u s t o i m e n p i t e e n s ä + r a n g a i s t u s t o i m e n p i t e e t + r a n g a i s t u s t o i m e n p i t e i d e n + r a n g a i s t u s t o i m e n p i t e i n + r a n g a i s t u s t o i m e n p i t e i n e e n + r a n g a i s t u s t o i m e n p i t e i s i i n + r a n g a i s t u s t o i m e n p i t e i t ä + r a n g a i s t u s t o i m e t + r a n g a i s t u s t o i m i a + r a n g a i s t u s t o i m i e n + r a n g a i s t u s t o i m i i n + r a n g a i s t u s t o i m i l l a + r a n g a i s t u s t o i m i n a + r a n g a i s t u s t o i m i s t a + r a n g a i s t u s t u l l e i s t a + r a n g a i s t u s t u l l e j a + r a n g a i s t u s t u l l i e n + r a n g a i s t u s t u l l i t + r a n g a i s t u s u h k a n + r a n g a i s t u s v a l t i o i t a + r a n g a i s t u s v e r o a + r a n g a i s t u s v e r o j a + r a n g a i s t u s v e r o n + r a n g a i s t u s v i m m a a + r a n g a i s t u s v ä l i n e t t ä + r a n k a i s e m a a n + r a n k a i s e m a l l a + r a n k a i s e m a t t a + r a n k a i s e m a t t o m u u d e n + r a n k a i s e m a t t o m u u d e s t a + r a n k a i s e m a t t o m u u s a s i a a + r a n k a i s e m a t t o m u u t t a + r a n k a i s e m i n e n + r a n k a i s e m i s e k s i + r a n k a i s e m i s e l t a + r a n k a i s e m i s e s s a a n + r a n k a i s e m i s t a + r a n k a i s e m i s t o i m i s s a + r a n k a i s e v a n + r a n k a i s e v i e n + r a n k a i s i s i + r a n k a i s t a + r a n k a i s t a v a + r a n k a i s t u + r a n k a i s u k e i n o j a + r a n k a i s u m e k a n i s m e i s t a + r a n k a i s u m e n e t t e l y ä + r a n k a i s u n ä k ö k o h d i l l e + r a n k a i s u p r o s e s s i + r a n k a i s u r e t k i ä + r a n k a i s u s ä ä n n ö k s i i n + r a n k a i s u t o i m e n p i d e + r a n k a i s u t o i m e n p i t e e t + r a n k a i s u t o i m e n p i t e i d e n + r a n k a i s u t o i m e n p i t e i n + r a n k a i s u t o i m e n p i t e i s i i n + r a n k a i s u t o i m e n p i t e i s t ä + r a n k a i s u t o i m e n p i t e i t ä + r a n k a i s u t o i m i a + r a n k a i s u t o i m i i n + r a n k a i s u t o i m i n + r a n k a i s u t o i m i s s a + r a n k a i s u t o i m i s t a + r a n k a i s u t u l l e i h i n + r a n k a s s a + r a n k e m m i n + r a n k e m p i a + r a n k i j ä r j e s t e l m ä + r a n k k a s a d e + r a n k k a s a d e m y r s k y n + r a n k k a s a t e e n + r a n k k a s a t e e t + r a n k k a s a t e i d e n + r a n k k a s a t e i n e e n + r a n k k a s a t e i s i i n + r a n k k a s a t e i s t a + r a n k k a s a t e i t a + r a n n a l l e + r a n n a n + r a n n e k a n a v a o i r e y h t y m ä + r a n n e k e l l o i s s a + r a n n e v a l t i m o + r a n n i k k o a + r a n n i k k o a l u e + r a n n i k k o a l u e e k s i + r a n n i k k o a l u e e l l a + r a n n i k k o a l u e e l l e + r a n n i k k o a l u e e l t a + r a n n i k k o a l u e e m m e + r a n n i k k o a l u e e n + r a n n i k k o a l u e e n a + r a n n i k k o a l u e e s e e n + r a n n i k k o a l u e e s t a + r a n n i k k o a l u e e t + r a n n i k k o a l u e i d e m m e + r a n n i k k o a l u e i d e n + r a n n i k k o a l u e i l l a + r a n n i k k o a l u e i l l a a n + r a n n i k k o a l u e i l l a m m e + r a n n i k k o a l u e i l l e + r a n n i k k o a l u e i l l e m m e + r a n n i k k o a l u e i l t a + r a n n i k k o a l u e i s i i m m e + r a n n i k k o a l u e i s i i n + r a n n i k k o a l u e i s t a + r a n n i k k o a l u e i t a + r a n n i k k o a l u e i t a m m e + r a n n i k k o a l u e i t t e m m e + r a n n i k k o a l u e k a r t t a + r a n n i k k o a l u e t t a + r a n n i k k o a l u k s i a + r a n n i k k o a s e m i l l e + r a n n i k k o e k o s y s t e e m e j ä + r a n n i k k o e r o o s i o + r a n n i k k o e r o o s i o t a + r a n n i k k o j a m m e + r a n n i k k o j ä r v i s t ä + r a n n i k k o j ä s e n v a l t i o i d e n + r a n n i k k o j ä s e n v a l t i o i l l e + r a n n i k k o j ä s e n v a l t i o i t a + r a n n i k k o j ä ä k ä r i + r a n n i k k o k a i s t a l e e l l a + r a n n i k k o k a i s t a l e e n + r a n n i k k o k a l a s t a j a t + r a n n i k k o k a l a s t a j i a + r a n n i k k o k a l a s t a j i e n + r a n n i k k o k a l a s t a j i i n + r a n n i k k o k a l a s t a j i l l e + r a n n i k k o k a l a s t u k s e e n + r a n n i k k o k a l a s t u k s e l l a + r a n n i k k o k a l a s t u k s e l l e + r a n n i k k o k a l a s t u k s e m m e + r a n n i k k o k a l a s t u k s e n + r a n n i k k o k a l a s t u k s e s s a + r a n n i k k o k a l a s t u k s e s t a + r a n n i k k o k a l a s t u s a l a + r a n n i k k o k a l a s t u s a l a a + r a n n i k k o k a l a s t u s a l a l l a + r a n n i k k o k a l a s t u s a l a l l e + r a n n i k k o k a l a s t u s a l a n + r a n n i k k o k a l a s t u s a l u s t a + r a n n i k k o k a l a s t u s a l u s t e n + r a n n i k k o k a l a s t u s j ä r j e s t ö t + r a n n i k k o k a l a s t u s k y s y m y k s e n + r a n n i k k o k a l a s t u s t a + r a n n i k k o k a l a s t u s t a l o u d e n + r a n n i k k o k a l a s t u s t a l o u t t a + r a n n i k k o k a l a s t u s t o i m i n n a n + r a n n i k k o k a l a s t u s y h t e i s ö + r a n n i k k o k a l a s t u s y h t e i s ö j e n + r a n n i k k o k a l a t a l o u s a l a n + r a n n i k k o k a u p u n g i n + r a n n i k k o k a u p u n k i + r a n n i k k o k a u p u n k i a + r a n n i k k o k u n t i e n + r a n n i k k o k y l i e n + r a n n i k k o l a i n s ä ä d ä n n ö n + r a n n i k k o l a i v a l i i k e n n e t t ä + r a n n i k k o l a i v a l i i k e n t e e n + r a n n i k k o l a i v a l i i k e n t e e s e e n + r a n n i k k o l a i v a s t o a + r a n n i k k o l a i v a s t o l l e + r a n n i k k o l a i v a s t o n + r a n n i k k o l i i k e n n e + r a n n i k k o l i i k e n n e t t ä + r a n n i k k o l i i k e n t e e l l e + r a n n i k k o l i i k e n t e e l l ä + r a n n i k k o l i i k e n t e e n + r a n n i k k o l i i k e n t e e s e e n + r a n n i k k o l ä h t e i s t ä + r a n n i k k o m a a + r a n n i k k o m a a k u n t i i n + r a n n i k k o m a a t + r a n n i k k o m a i d e n + r a n n i k k o m a i h i n + r a n n i k k o m a t k a i l u a + r a n n i k k o m a t k a i l u a l a + r a n n i k k o m a t k a i l u n + r a n n i k k o m a t k a i l u u n + r a n n i k k o m e r e n k u l k u a + r a n n i k k o m o o t t o r i v e n e + r a n n i k k o m ä n t y + r a n n i k k o p a n s s a r i l a i v a + r a n n i k k o p r i k a a t i + r a n n i k k o p u o l u s t u s + r a n n i k k o r a h k a s a m m a l + r a n n i k k o r a j o j e n + r a n n i k k o r y k m e n t t i + r a n n i k k o s a t a m i i n + r a n n i k k o s e u d u i l l a + r a n n i k k o s e u d u l t a + r a n n i k k o s e u d u t + r a n n i k k o s e u t u j a + r a n n i k k o s e u t u j e n + r a n n i k k o s u u n n i t e l m a a + r a n n i k k o s ä r k ä t + r a n n i k k o t e i t ä + r a n n i k k o t e o l l i s u u d e n + r a n n i k k o t o i m i n t a r y h m i i n + r a n n i k k o t u l v a t + r a n n i k k o t u r v a l l i s u u s v i r a n o m a i s e l l e + r a n n i k k o t y k i s t ö + r a n n i k k o u k o n k o r e n t o + r a n n i k k o v a l t i o + r a n n i k k o v a l t i o i d e n + r a n n i k k o v a l t i o i h i n + r a n n i k k o v a l t i o i l l e + r a n n i k k o v a l t i o i s s a + r a n n i k k o v a l t i o i t a + r a n n i k k o v a l t i o n + r a n n i k k o v a l t i o s o p i m u s t a + r a n n i k k o v a l t i o s s a + r a n n i k k o v a l t i o s t a + r a n n i k k o v a l t i o t + r a n n i k k o v a l t i o t a + r a n n i k k o v a l v o n t a a + r a n n i k k o v a l v o n t a v i r a n o m a i s t e n + r a n n i k k o v a l v o n t a v i r a s t o + r a n n i k k o v a r t i o i n t i p a l v e l u + r a n n i k k o v a r t i o i n t i p a l v e l u a + r a n n i k k o v a r t i o i n t i p a l v e l u i d e n + r a n n i k k o v a r t i o i n t i p a l v e l u l l a + r a n n i k k o v a r t i o i n t i p a l v e l u n + r a n n i k k o v a r t i o i s t a + r a n n i k k o v a r t i o i t a + r a n n i k k o v a r t i o n + r a n n i k k o v a r t i o p a l v e l u u n + r a n n i k k o v a r t i o s t o + r a n n i k k o v a r t i o s t o a + r a n n i k k o v a r t i o s t o j a + r a n n i k k o v a r t i o s t o j e n + r a n n i k k o v a r t i o s t o k y s y m y s + r a n n i k k o v a r t i o s t o n + r a n n i k k o v a r t i o s t o o n + r a n n i k k o v a r t i o s t o s t a + r a n n i k k o v a r t i o s t o y k s i k k ö + r a n n i k k o v a r t i o t a + r a n n i k k o v a r t i o t u t k i m u k s e t + r a n n i k k o v a r t i o v e r k o s t o + r a n n i k k o v a r t i o v e r k o s t o a + r a n n i k k o v a r t i o v e r k o s t o n + r a n n i k k o v a r t i o y h t e i s t y ö s t ä + r a n n i k k o v e d e t + r a n n i k k o v e s i e n + r a n n i k k o v e s i i n + r a n n i k k o v e s i l i i k e n t e e n + r a n n i k k o v e s i l l e + r a n n i k k o v e s i l l ä + r a n n i k k o v e s i l l ä m m e + r a n n i k k o v e s i s t ä + r a n n i k k o v e s i ä + r a n n i k k o v e s i ä m m e + r a n n i k k o v i i v a a + r a n n i k k o v i r a n o m a i s e t + r a n n i k k o v i r a n o m a i s t e n + r a n n i k k o v i r a s t o l l e + r a n n i k k o v u o r e t + r a n n i k k o v y ö h y k e + r a n n i k k o v y ö h y k e j ä r j e s t e l m ä n + r a n n i k k o v y ö h y k k e e l l e + r a n n i k k o v y ö h y k k e e t + r a n n i k k o v y ö h y k k e i d e n + r a n n i k k o v y ö h y k k e i t ä + r a n n i k k o v ä e s t ö n + r a n n i k k o v ä e s t ö s t ä + r a n n i k k o v ä e s t ö ä + r a n n i k k o y h t e i s ö i h i n + r a n n i k k o y h t e i s ö i l l e + r a n n i k k o y h t e i s ö i l l e m m e + r a n n i k k o y h t e i s ö i l l ä m m e + r a n n i k k o y h t e i s ö i l t ä + r a n n i k k o y h t e i s ö i s s ä + r a n n i k k o y h t e i s ö j e m m e + r a n n i k k o y h t e i s ö j e n + r a n n i k k o y h t e i s ö j ä + r a n n i k k o y h t e i s ö j ä m m e + r a n n i k k o y h t e i s ö l l e + r a n n i k k o y h t e i s ö l t ä + r a n n i k k o y h t e i s ö t + r a n n i k k o y m p ä r i s t ö l l e + r a n n i k k o y m p ä r i s t ö n + r a n n i k k o y m p ä r i s t ö s s ä + r a n n i k k o y m p ä r i s t ö ä + r a n n i k k o y m p ä r i s t ö ä m m e + r a n n i k o i d e n + r a n n i k o i l l a + r a n n i k o i l l a m m e + r a n n i k o i l l e + r a n n i k o i t a + r a n n i k o l l a + r a n n i k o l t a + r a n n o i l l e + r a n n o i s t a + r a n s k a a + r a n s k a k s i + r a n s k a l a i s b r i t t i l ä i s e s t ä + r a n s k a l a i s d i p l o m a a t i n + r a n s k a l a i s d i p l o m a a t i t + r a n s k a l a i s e n + r a n s k a l a i s e n a + r a n s k a l a i s e t + r a n s k a l a i s f i l o s o f i a + r a n s k a l a i s i a + r a n s k a l a i s i i n + r a n s k a l a i s i l l a + r a n s k a l a i s i l l e + r a n s k a l a i s i l t a + r a n s k a l a i s i n t e l l e k t u e l l i + r a n s k a l a i s i s t a + r a n s k a l a i s j ä s e n e n ä + r a n s k a l a i s j ä s e n e t + r a n s k a l a i s j ä s e n i l l e + r a n s k a l a i s j ä s e n i l l ä + r a n s k a l a i s k o l l e g a n i + r a n s k a l a i s k o l l e g o j a + r a n s k a l a i s l a s t e n + r a n s k a l a i s l e h d i s t ö l l e + r a n s k a l a i s l e h t i e n + r a n s k a l a i s m a l l i s t a + r a n s k a l a i s n a i n e n + r a n s k a l a i s n a i s e n + r a n s k a l a i s n u o r t e n + r a n s k a l a i s p o l i i t i k k o j e n + r a n s k a l a i s p o t i l a i l l a + r a n s k a l a i s s a k s a l a i s e e n + r a n s k a l a i s s a k s a l a i s e s t a + r a n s k a l a i s s o t i l a a l l e + r a n s k a l a i s s o t i l a a s t a + r a n s k a l a i s s o t i l a a t + r a n s k a l a i s s o t i l a i t a + r a n s k a l a i s t e n + r a n s k a l a i s t y t t ö ä + r a n s k a l a i s u r h e i l i j o i d e n + r a n s k a l a i s v a l m i s t a j a + r a n s k a l a i s v a s t a i s i a + r a n s k a l a i s v a s t a i s t a + r a n s k a l a i s v a s t a i s u u t t a + r a n s k a l a i s v i r a n o m a i s t e n + r a n s k a l a i s v ä e s t ö n + r a n s k a l a i s y h t i ö + r a n s k a l a i s y r i t y s + r a n s k a l a i s y r i t y s t e n + r a n s k a l l a + r a n s k a l l e + r a n s k a n + r a n s k a n b u l l d o g g i + r a n s k a n k i e l i n e n + r a n s k a n k i e l i s e e n + r a n s k a n k i e l i s e l l e + r a n s k a n k i e l i s e n + r a n s k a n k i e l i s e s s ä + r a n s k a n k i e l i s i i n + r a n s k a n k i e l i s i s t ä + r a n s k a n k i e l i s i ä + r a n s k a n k i e l i s t e n + r a n s k a n k i e l i s t ä + r a n s k a n k o h o k k i + r a n s k a n o p e t t a j a t + r a n s k a n o p i s k e l u n s a + r a n s k a n r a v u r i + r a n s k a n s p a n i e l i + r a n s k a n t o r a k k a + r a n s k a s s a + r a n s k a s s a k i n + r a n s k a s t a + r a n t a a n + r a n t a h e i n ä s i r k k a + r a n t a h e i n ä y ö k k ö n e n + r a n t a h i r v e n j u u r i + r a n t a h ä m ä h ä k k i + r a n t a j u u r i k a s + r a n t a k a i j a + r a n t a k a i s t a l e i t a + r a n t a k a i s t a l l a + r a n t a k a i s t o j e n + r a n t a k a i v a j a + r a n t a k a l j u m e s i k k o + r a n t a k a n a n k a a l i + r a n t a k a u r a + r a n t a k e r t t u l i + r a n t a k i r p p u + r a n t a k o t i l o + r a n t a k u k k a + r a n t a k u r v i + r a n t a k ä s i p a l l o + r a n t a k ä ä r m e + r a n t a l a k i a + r a n t a l e n t o p a l l o + r a n t a l o m a k o h t e i s i i n + r a n t a l o m a m a t k a i l u + r a n t a m a a + r a n t a m a t a r a + r a n t a m e r i s i i l i + r a n t a m e t s ä + r a n t a m i n t t u + r a n t a m o n n i + r a n t a n a p s i j a t + r a n t a n e n ä t t i + r a n t a n u o l i a i n e n + r a n t a o r v o k k i + r a n t a p a k s u j a l k a + r a n t a p a l p a k k o + r a n t a p i i s p a + r a n t a p ö r r ö s a m m a l + r a n t a r o m u t u s m e n e t e l m ä + r a n t a r o m u t u s m e n e t e l m ä s t ä + r a n t a r u t t o j u u r i + r a n t a t a s k u r a p u + r a n t a t e n n i s + r a n t a t u o l i s t a a n + r a n t a t u u l i + r a n t a t y r ä k k i + r a n t a t ä d y k e + r a n t a v a h d i t + r a n t a v a l t i o + r a n t a v a l t i o i d e n + r a n t a v a l t i o i l l e + r a n t a v a l t i o i s s a + r a n t a v a l t i o i s t a + r a n t a v a l t i o t + r a n t a v a r i s + r a n t a v e h n ä + r a n t a v e s i s s ä + r a n t a v i i v a a n + r a n t a v i i v a p a r a d o k s i + r a n t a y r t t i + r a n t o j a + r a o l l e e n + r a p a k i v i + r a p a n u i n + r a p a n u i t + r a p a r p e r i p i i r a k k a + r a p a u t t a m a t t a + r a p l a m a a + r a p m u s i i k i l l a + r a p o r t e i l l a + r a p o r t e i l l a a n + r a p o r t e i s s a + r a p o r t e i s t a + r a p o r t i n + r a p o r t i s s a + r a p o r t i s t a + r a p o r t i t + r a p o r t o i d a + r a p o r t o i d a a n + r a p o r t o i d e s s a n i + r a p o r t o i d u i s t a + r a p o r t o i j a n + r a p o r t o i m a a n + r a p o r t o i m i s e e n + r a p o r t o i m i s t a + r a p o r t o i m m e + r a p o r t o i n + r a p o r t o i n e e t + r a p o r t o i n n i n + r a p o r t o i n n i s s a + r a p o r t o i n t i a + r a p o r t o i n t i a j a n k o h t i a + r a p o r t o i n t i i n + r a p o r t o i n t i j a k s o n + r a p o r t o i n t i j ä r j e s t e l m i e n + r a p o r t o i n t i j ä r j e s t e l m i l l ä + r a p o r t o i n t i j ä r j e s t e l m i s t ä + r a p o r t o i n t i j ä r j e s t e l m i ä + r a p o r t o i n t i j ä r j e s t e l m ä + r a p o r t o i n t i j ä r j e s t e l m ä l l ä + r a p o r t o i n t i j ä r j e s t e l m ä l t ä + r a p o r t o i n t i j ä r j e s t e l m ä n + r a p o r t o i n t i j ä r j e s t e l m ä ä + r a p o r t o i n t i j ä r j e s t e l m ä ä n + r a p o r t o i n t i k a u d e l l a + r a p o r t o i n t i k a u d e n + r a p o r t o i n t i k a u s i + r a p o r t o i n t i m a h d o l l i s u u k s i a + r a p o r t o i n t i m e k a n i s m i + r a p o r t o i n t i m e n e t e l m ä ä + r a p o r t o i n t i m e n e t t e l y + r a p o r t o i n t i m e n e t t e l y i h i n + r a p o r t o i n t i m e n e t t e l y j ä + r a p o r t o i n t i n i m i + r a p o r t o i n t i n o r m i t + r a p o r t o i n t i o i k e u t t a + r a p o r t o i n t i p a l v e l u a + r a p o r t o i n t i p r o s e s s i + r a p o r t o i n t i p r o s e s s i i n + r a p o r t o i n t i p ä i v ä m ä ä r ä + r a p o r t o i n t i r a k e n t e i t a + r a p o r t o i n t i s t a n d a r d i t + r a p o r t o i n t i s u u n n i t e l m i e n + r a p o r t o i n t i s ä ä n t ö j e n + r a p o r t o i n t i t a a k k a a + r a p o r t o i n t i t a p o j a a n + r a p o r t o i n t i t e h t ä v i ä + r a p o r t o i n t i v a a t i m u k s e t + r a p o r t o i n t i v a a t i m u k s i a + r a p o r t o i n t i v a a t i m u k s i s s a + r a p o r t o i n t i v a a t i m u k s i s t a + r a p o r t o i n t i v a a t i m u s r ö y k k i ö i d e n + r a p o r t o i n t i v a a t i m u s t a + r a p o r t o i n t i v a a t i m u s t e n + r a p o r t o i n t i v e l v o i t e + r a p o r t o i n t i v e l v o i t e t t a + r a p o r t o i n t i v e l v o i t t e e s t a + r a p o r t o i n t i v e l v o i t t e e t + r a p o r t o i n t i v e l v o i t t e i t a + r a p o r t o i n t i v e l v o i t t e i t a a n + r a p o r t o i n t i v e l v o l l i n e n + r a p o r t o i n t i v e l v o l l i s u u d e n + r a p o r t o i n t i v e l v o l l i s u u d e s t a + r a p o r t o i n t i v e l v o l l i s u u k s i a + r a p o r t o i n t i v e l v o l l i s u u k s i a a n + r a p o r t o i n t i v e l v o l l i s u u k s i s t a + r a p o r t o i n t i v e l v o l l i s u u s + r a p o r t o i n t i v e l v o l l i s u u t e e n + r a p o r t o i n t i v e l v o l l i s u u t t a + r a p o r t o i n t i v e l v o l l i s u u t t a a n + r a p o r t o i n t i v e r k o s t o j a + r a p o r t o i n u t + r a p o r t o i s i + r a p o r t o i s i v a t + r a p o r t o i t a e s s a + r a p o r t o i t a i s i i n + r a p o r t o i t a v a + r a p o r t o i t u + r a p o r t o i t u j e n + r a p o r t o i v a n s a + r a p o r t o i v a t + r a p o r t t e j a + r a p o r t t i a + r a p o r t t i e n + r a p o r t t i i n + r a p p a u s p ä r e + r a p p e u m a s a i r a u k s i a + r a p p e u t u a + r a p p e u t u i + r a p p e u t u m i s s a i r a u d e t + r a p p e u t u m i s s a i r a u k s i a + r a p p e u t u m i s s a i r a u k s i e n + r a p p e u t u m i s s a i r a u k s i i n + r a p p e u t u m i s s a i r a u k s i l t a + r a p p e u t u m i s s a i r a u k s i s t a + r a p p e u t u m i s s a i r a u s + r a p p e u t u m i s s a i r a u t t a + r a p p e u t u n e i t a + r a p p i o t a i d e + r a p p i o t i l a s s a + r a p s i a + r a p s i n + r a p s i n s i e m e n ö l j y ä + r a p s i s a t o + r a p s i ö l j y ä + r a p u h a u k k a + r a p u h ä m ä h ä k i t + r a p u k a n t a a + r a p u l o k k i + r a p u r u t t o + r a p u s u m u + r a r o t o n g a n + r a r o t o n g a n k o t t a r a i n e n + r a r o t o n g a n m o n a r k k i + r a s i n a + r a s i s m i a + r a s i s m i f o o r u m i s s a + r a s i s m i i n + r a s i s m i k o k o u k s e s s a + r a s i s m i k o k o u s t a + r a s i s m i k o n f e r e n s s i a + r a s i s m i n + r a s i s m i n t o r j u n n a s s a + r a s i s m i n t o r j u n t a + r a s i s m i n v a s t a i n e n + r a s i s m i n v a s t a i s e k s i + r a s i s m i n v a s t a i s e n + r a s i s m i n v a s t a i s e s s a + r a s i s m i n v a s t a i s e s t a + r a s i s m i n v a s t a i s e t + r a s i s m i n v a s t a i s i l l e + r a s i s m i n v a s t a i s t a + r a s i s m i n v a s t a i s u u d e n + r a s i s m i n v a s t a i s u u s + r a s i s m i n v a s t a i s u u t e m m e + r a s i s m i n v a s t u s t a j i a + r a s i s m i o n g e l m a a n + r a s i s m i o n g e l m i a + r a s i s m i r i k o k s i a + r a s i s m i s t a + r a s i s m i s y y t ö k s i s t ä + r a s i s m i t a p a u k s i a + r a s i s m i t o i m i k u n n a n + r a s i s t e j a + r a s i s t i e n + r a s i s t i k o r t t i + r a s i s t i s e e n + r a s i s t i s e s t a + r a s i s t i s e t + r a s i s t i s i a + r a s i s t i s i i n + r a s i s t i s i s s a + r a s i s t i s i s t a + r a s i s t i s t a + r a s i s t i s t e n + r a s i t e t t a + r a s i t t a a + r a s i t t a m a t t a + r a s i t t a m i s e l l e + r a s i t t a v a m m a k s i + r a s i t t a v a m p i a + r a s i t t a v a t + r a s i t t a v i a + r a s i t t e e t + r a s i t t e i t a + r a s i t u k s e n + r a s i t u k s e n j a k a m i s j ä r j e s t e l m ä s t ä + r a s i t u k s i a + r a s i t u s a s t m a + r a s i t u s m u r t u m a + r a s i t u s t a + r a s i t u s t e n + r a s i t u s v a m m o j a + r a s k a a k s i + r a s k a a l l a + r a s k a a l t a + r a s k a a m m i n + r a s k a a m p a a + r a s k a a m p i + r a s k a a m p i a + r a s k a a n + r a s k a a n a + r a s k a a s e e n + r a s k a a s t a + r a s k a a t + r a s k a i d e n + r a s k a i k s i + r a s k a i l l a + r a s k a i l l e + r a s k a i l t a + r a s k a i m m a n + r a s k a i m m i n + r a s k a i m m i s t a + r a s k a i n + r a s k a i s i i n + r a s k a i s t a + r a s k a i t a + r a s k a s m e t a l l e i h i n + r a s k a s m e t a l l e i l l a + r a s k a s m e t a l l e i l l e + r a s k a s m e t a l l e i s t a + r a s k a s m e t a l l e i t a + r a s k a s m e t a l l e j a + r a s k a s m e t a l l i + r a s k a s m e t a l l i a + r a s k a s m e t a l l i e n + r a s k a s m e t a l l i h i u k k a s i a + r a s k a s m e t a l l i k i e l t o + r a s k a s m e t a l l i n + r a s k a s m e t a l l i o n g e l m a + r a s k a s m e t a l l i p i t o i s u u s + r a s k a s m e t a l l i p ä ä s t ö j ä + r a s k a s m e t a l l i t + r a s k a s m e t a l l i y h d i s t e i d e n + r a s k a s s o u t u i n e n + r a s k a s t a + r a s k a s v e s i o n n e t t o m u u d e s t a + r a s k a u d e n + r a s k a u d e n a i k a i n e n + r a s k a u d e n a i k a i s e n + r a s k a u d e n a i k a i s t a + r a s k a u d e n k e s k e y t t ä m i s e n + r a s k a u d e n k e s k e y t y k s e e n + r a s k a u d e n k e s k e y t y k s e n + r a s k a u d e n k e s k e y t y s + r a s k a u d e n k e s k e y t y s n e u v o n t a a n + r a s k a u d e n k e s k e y t y s p a l v e l u j e n + r a s k a u d e s t a + r a s k a u k s i a + r a s k a u k s i e n + r a s k a u k s i l t a + r a s k a u s a i k a + r a s k a u s a i k a a + r a s k a u s a i k a n a + r a s k a u s a i k a n a a n + r a s k a u s a r v e t + r a s k a u s d i r e k t i i v i n + r a s k a u s k a t e g o r i a + r a s k a u s k u u k a u d e l l a + r a s k a u s k u u k a u d e l l e + r a s k a u s m y r k y t y s + r a s k a u s m y r k y t y s t e n + r a s k a u s t e s t i + r a s k a u s v i i k k o o n + r a s k a u s v i i k o n + r a s k a u t t a v a a + r a s k a u t t a v a k s i + r a s k a u t t a v a m p a a + r a s k a u t t a v a n a + r a s k a u t t a v a t + r a s k a u t t a v i e n + r a s s i r e v o n h ä n t ä + r a s t a a t + r a s t a s k e r t t u n e n + r a s t a s k i r v i n e n + r a s t a s k i u r u + r a s t a s k o t i n g a + r a s t a s m u u r a + r a s t a s p a r a t i i s i l i n t u + r a s t a s t a n s s i j a + r a s t a s v i i d a k k o t i m a l i + r a s t i v i i k k o + r a s v a g r a m m a a + r a s v a h a p o n + r a s v a h a p o t + r a s v a h a p p o + r a s v a h a p p o j a + r a s v a h a p p o j e n + r a s v a h a p p o p i t o i s u u d e n + r a s v a h ä n t ä l a m m a s + r a s v a h ä n t ä p u s s i h i i r i + r a s v a j ä t t e e n + r a s v a k e i t i n + r a s v a k e r r o k s e e n + r a s v a k u d o k s e e n + r a s v a k u d o k s e s t a + r a s v a k u d o k s i i n + r a s v a k u d o s + r a s v a l i u k o i s t e n + r a s v a l u o k i t u k s e s t a + r a s v a m a k s a + r a s v a n + r a s v a p a l l o + r a s v a p i t o i s u u d e n + r a s v a p i t o i s u u d e s t a + r a s v a p i t o i s u u d e t + r a s v a p i t o i s u u s + r a s v a p i t o i s u u t t a + r a s v a p r o s e n t t i + r a s v a s t a + r a s v a t t o m i s s a + r a s v a v e r o + r a s v a v e r o a + r a s v o j a + r a s v o j e n + r a t a a + r a t a a n s a + r a t a h a n k k e i t a + r a t a i n f r a s t r u k t u u r i a + r a t a j ä r j e s t e l m ä ä m m e + r a t a k i l o m e t r i e n + r a t a k i l o m e t r i l t ä + r a t a k i s k o i h i n + r a t a k o m p o n e n t t i + r a t a l a i t o s + r a t a m a k s u j a + r a t a m e l o n n a n + r a t a m e l o n t a + r a t a m o o t t o r i p y ö r ä i l y + r a t a m o o t t o r i p y ö r ä i l y n + r a t a m o s a r p i o + r a t a m o v e r k k o p e r h o n e n + r a t a n o p e u s + r a t a o s u u d e t + r a t a o s u u s + r a t a o s u u t t a + r a t a p i h a + r a t a p y ö r ä i l y + r a t a p y ö r ä i l y n + r a t a s m u s t e s i e n i + r a t a t o s k + r a t a t y ö k o n e + r a t a v e r k k o + r a t a v e r k k o a + r a t a v e r k k o i h i n + r a t a v e r k k o j e n + r a t a v e r k k o o n + r a t a v e r k o s s a + r a t a v e r k o s t a + r a t a v e r k o s t o j a + r a t a v e r k o s t o n + r a t a y h t e y d e t + r a t a y h t e y k s i ä + r a t a y h t e y s + r a t a y h t e y t t ä + r a t i f i o i d a + r a t i f i o i d a a n + r a t i f i o i d e s s a a n + r a t i f i o i k a a m m e + r a t i f i o i m a a n + r a t i f i o i m a l l a + r a t i f i o i m a s s a + r a t i f i o i m a t o n t a + r a t i f i o i m a t t a + r a t i f i o i m i s a s i a k i r j a t + r a t i f i o i m i s e e n + r a t i f i o i m i s e k s i + r a t i f i o i m i s e l l a + r a t i f i o i m i s k i r j a l l a + r a t i f i o i m i s k i r j a n s a + r a t i f i o i m i s m e n e t t e l y i s t ä + r a t i f i o i m i s p r o s e s s i + r a t i f i o i m i s p r o s e s s i a + r a t i f i o i m i s p r o s e s s i l l e + r a t i f i o i m i s p r o s e s s i n + r a t i f i o i m i s p r o s e s s i s s a + r a t i f i o i m i s t a + r a t i f i o i m i s t y ö n + r a t i f i o i m i s v a i h e + r a t i f i o i m m e k o + r a t i f i o i n e e t + r a t i f i o i n n e i s t a + r a t i f i o i n n i l l e + r a t i f i o i n n i n + r a t i f i o i n n i s s a + r a t i f i o i n n i s t a + r a t i f i o i n t e j a + r a t i f i o i n t i a + r a t i f i o i n t i a i k a + r a t i f i o i n t i a s i a k i r j a t + r a t i f i o i n t i a s i a k i r j o j a + r a t i f i o i n t i a s t e t t a + r a t i f i o i n t i h a l u k k u u t t a m m e + r a t i f i o i n t i i n + r a t i f i o i n t i k e h o t u s t a + r a t i f i o i n t i k e r t o m u k s e n + r a t i f i o i n t i k e s k u s t e l u i h i n + r a t i f i o i n t i k e s k u s t e l u j e n + r a t i f i o i n t i k e s k u s t e l u s s a a n + r a t i f i o i n t i k y s y m y s t ä + r a t i f i o i n t i m a h d o l l i s u u d e n + r a t i f i o i n t i m e n e t e l m ä s t ä + r a t i f i o i n t i m e n e t t e l y + r a t i f i o i n t i m e n e t t e l y i d e n + r a t i f i o i n t i m e n e t t e l y i h i n + r a t i f i o i n t i m e n e t t e l y i s s ä + r a t i f i o i n t i m e n e t t e l y j e n + r a t i f i o i n t i m e n e t t e l y j ä + r a t i f i o i n t i m e n e t t e l y n + r a t i f i o i n t i m e n e t t e l y n s ä + r a t i f i o i n t i m e n e t t e l y s s ä + r a t i f i o i n t i m e n e t t e l y s t ä + r a t i f i o i n t i m e n e t t e l y t + r a t i f i o i n t i m e n e t t e l y y n + r a t i f i o i n t i m e n e t t e l y ä + r a t i f i o i n t i o i k e u s + r a t i f i o i n t i o i k e u t t a + r a t i f i o i n t i o n g e l m a + r a t i f i o i n t i o n g e l m a n + r a t i f i o i n t i p r o s e s s e i h i n + r a t i f i o i n t i p r o s e s s e j a + r a t i f i o i n t i p r o s e s s e j a a n + r a t i f i o i n t i p r o s e s s i + r a t i f i o i n t i p r o s e s s i a + r a t i f i o i n t i p r o s e s s i e n + r a t i f i o i n t i p r o s e s s i i n + r a t i f i o i n t i p r o s e s s i l l e + r a t i f i o i n t i p r o s e s s i n + r a t i f i o i n t i p r o s e s s i n s a + r a t i f i o i n t i p r o s e s s i s s a + r a t i f i o i n t i p r o s e s s i s t a + r a t i f i o i n t i p r o s e s s i t + r a t i f i o i n t i p y r k i m y s t ä + r a t i f i o i n t i p ä i v ä + r a t i f i o i n t i p ä ä t ö k s e l l ä + r a t i f i o i n t i p ä ä t ö s t ä + r a t i f i o i n t i s t r a t e g i a + r a t i f i o i n t i t a p a + r a t i f i o i n t i t a r v e t t a + r a t i f i o i n t i t a v a s t a + r a t i f i o i n t i t i l a n n e t t a + r a t i f i o i n t i t i l a n t e e n + r a t i f i o i n t i t i l a n t e e s s a + r a t i f i o i n t i t o i m i s t a + r a t i f i o i n t i v a a t i m u s t a + r a t i f i o i n t i v a i h e + r a t i f i o i n t i v a i h e e s e e n + r a t i f i o i n t i v a i h e e s s a + r a t i f i o i n t i v a l t a a + r a t i f i o i n t i v a l t u u d e t + r a t i f i o i n t i v a l t u u k s i a + r a t i f i o i n t i v ä l i n e t t ä + r a t i f i o i n t i y r i t y k s e n + r a t i f i o i n u t + r a t i f i o i s i + r a t i f i o i s i v a t + r a t i f i o i t a i s i i n + r a t i f i o i t a v a + r a t i f i o i t u a + r a t i f i o i v a t + r a t i o n a a l i j u u r i l a u s e + r a t i o n a a l i l u k u + r a t i o n a a l i s e m m a n + r a t i o n a a l i s e m p a a + r a t i o n a a l i s e m p i + r a t i o n a a l i s e m p i a + r a t i o n a a l i s e m p i i n + r a t i o n a l i s o i n n i n + r a t i o n a l i s o i n t i p r o s e s s i n + r a t i o n a l i s o i n t i p y r k i m y k s i s t ä + r a t i o n a l i s o i n t i p y r k i m y k s i ä + r a t i o n a l i s o i n t i t a h t o + r a t i o n a l i s o i n t i t o i m e t + r a t i o n a l i s o i n t i t o i m i l l a + r a t i o n a l i s o i n t i t u k e a + r a t i o n a l i s o i t a v a + r a t i s s a + r a t k a i s e e + r a t k a i s e m a a n + r a t k a i s e m a l l a + r a t k a i s e m a s s a + r a t k a i s e m a t o n t a + r a t k a i s e m a t t a + r a t k a i s e m a t t o m a n + r a t k a i s e m a t t o m a s s a + r a t k a i s e m a t t o m a t + r a t k a i s e m a t t o m i a + r a t k a i s e m a t t o m i e n + r a t k a i s e m a t t o m i i n + r a t k a i s e m a t t o m i s t a + r a t k a i s e m i s e e n + r a t k a i s e m i s e k s i + r a t k a i s e m i s e l l e + r a t k a i s e m i s e n + r a t k a i s e m i s e s s a + r a t k a i s e m i s e s t a + r a t k a i s e m i s t a + r a t k a i s e m i s t a a n + r a t k a i s e m m e + r a t k a i s e m m e k o + r a t k a i s e v a a + r a t k a i s e v a a n + r a t k a i s e v a k s i + r a t k a i s e v a l l a + r a t k a i s e v a m m a n + r a t k a i s e v a m m i n + r a t k a i s e v a m p a a + r a t k a i s e v a m p i + r a t k a i s e v a n + r a t k a i s e v a n a + r a t k a i s e v a s s a + r a t k a i s e v a s t a + r a t k a i s e v a t + r a t k a i s e v i a + r a t k a i s e v i m m a t + r a t k a i s e v i m m i n + r a t k a i s e v i m m i s t a + r a t k a i s e v i m p i a + r a t k a i s e v i m p i e n + r a t k a i s e v i n + r a t k a i s e v i n a + r a t k a i s e v i n t a + r a t k a i s e v i s s a + r a t k a i s e v i s t a + r a t k a i s i s i + r a t k a i s i v a t + r a t k a i s k a a m m e + r a t k a i s s e e t + r a t k a i s s u t + r a t k a i s t a + r a t k a i s t a a n + r a t k a i s t a e s s a + r a t k a i s t a i s i + r a t k a i s t a i s i i n + r a t k a i s t a k o o n + r a t k a i s t a k s e e n + r a t k a i s t a k s e m m e + r a t k a i s t a k s e n i + r a t k a i s t a k s e n n e + r a t k a i s t a v a k s i + r a t k a i s t a v a n a + r a t k a i s t a v a n a a n + r a t k a i s t a v i s s a + r a t k a i s t e s s a a n + r a t k a i s t i i n + r a t k a i s t u a + r a t k a i s t u a m m e + r a t k a i s t u n + r a t k a i s u a + r a t k a i s u a s t e + r a t k a i s u e h d o t u k s e n s a + r a t k a i s u e h d o t u k s e t + r a t k a i s u e h d o t u k s i a + r a t k a i s u e h d o t u k s i s s a + r a t k a i s u e h d o t u k s i s t a + r a t k a i s u e h d o t u s + r a t k a i s u e h d o t u s t a + r a t k a i s u e h d o t u s t e n + r a t k a i s u e l i m e l l e + r a t k a i s u e s i t y k s i s s ä + r a t k a i s u i h i n + r a t k a i s u i k s i + r a t k a i s u i l l a + r a t k a i s u i l l e + r a t k a i s u i s t a + r a t k a i s u i s t a k i n + r a t k a i s u j a + r a t k a i s u j a m m e + r a t k a i s u j e n + r a t k a i s u j e n k i n + r a t k a i s u j e n s a + r a t k a i s u k e h y s t ä + r a t k a i s u k e i n o n a + r a t k a i s u k e i n o t + r a t k a i s u k e s k e i n e n + r a t k a i s u k e s k e i s e n + r a t k a i s u k s i + r a t k a i s u l l e + r a t k a i s u l u o n n o k s e n + r a t k a i s u l ä h t ö k o h t a + r a t k a i s u l ä h t ö k o h t a n a + r a t k a i s u l ä h t ö k o h t i e n + r a t k a i s u m a h d o l l i s u u d e n + r a t k a i s u m a h d o l l i s u u d e s t a + r a t k a i s u m a h d o l l i s u u k s i a + r a t k a i s u m a h d o l l i s u u s + r a t k a i s u m a h d o l l i s u u t t a + r a t k a i s u m a l l e j a + r a t k a i s u m a l l i i n + r a t k a i s u m a l l i n + r a t k a i s u m e k a n i s m e j a + r a t k a i s u m e k a n i s m i n + r a t k a i s u m e n e t t e l y i h i n + r a t k a i s u m e n e t t e l y t + r a t k a i s u m m e + r a t k a i s u n + r a t k a i s u n a + r a t k a i s u o p e r a a t i o i t a + r a t k a i s u o t t e l u s s a + r a t k a i s u p a k e t t i a + r a t k a i s u p r o s e s s i n + r a t k a i s u p y r k i m y s t e n + r a t k a i s u s s a + r a t k a i s u s t a + r a t k a i s u s t r a t e g i o i t a + r a t k a i s u s u u n n i t e l m a a + r a t k a i s u s u u n n i t e l m a n + r a t k a i s u s u u n n i t e l m a s t a + r a t k a i s u t + r a t k a i s u t a p o j a + r a t k a i s u t a s o + r a t k a i s u t o i m e n p i t e i s i i n + r a t k a i s u t o i m i e n + r a t k a i s u u n + r a t k a i s u v a i h e e s s a + r a t k a i s u v a i h t o e h d o t + r a t k a i s u v a i h t o e h t o + r a t k a i s u v a i h t o e h t o a + r a t k a i s u v a i h t o e h t o j a + r a t k a i s u v a l l a n + r a t k a i s u v a l l a s t a + r a t k a i s u v a l t a + r a t k a i s u v a l t a a + r a t k a i s u v a p a u t t a + r a t k a i s u v ä l i n e + r a t k a i s u v ä l i n e e n ä + r a t k a i s u y r i t y k s e n + r a t k a i s u y r i t y k s i s t ä + r a t k a i s u y r i t y s + r a t k e a a + r a t k e a m a i s i l l a a n + r a t k o a + r a t k o e s s a m m e + r a t k o m a a n + r a t o j e n + r a t s a s i v a t + r a t s a s t a a + r a t s a s t a j a a + r a t s a s t a j a p a t s a s + r a t s a s t a j a t + r a t s a s t u k s e n o h j a a j i a + r a t s a s t u s j ä r j e s t ö s t ä + r a t s a s t u s k e r h o t + r a t s a s t u s k o u l u + r a t s a s t u s k o u l u s s a + r a t s a s t u s k y p ä r i e n + r a t s a s t u s r e t k i e n + r a t s a s t u s s e u r o j e n + r a t s a s t u s t a l l e j a + r a t s i o i t a + r a t s u m i l i i s i e n + r a t s u p o l i i s i + r a t s u p o n i + r a t s u v ä e n k e n r a a l i + r a t s u v ä k i d i v i s i o o n a + r a t s u v ä k i r y k m e n t t i + r a t t a a t + r a t t a i s i i n + r a t t i a + r a t t i i n + r a t t i j u o p o t + r a t t i j u o p p o + r a t t i j u o p p o i h i n + r a t t i j u o p p o j e n + r a t t i j u o p p o u d e s t a + r a t t i j u o p p o u t e e n + r a t t i j u o p p o u t t a + r a t t i j u o p u m u k s e n + r a t t i j u o p u m u k s e s t a + r a t t i j u o p u m u s + r a t t i j u o p u m u s o n g e l m a n + r a t t i j u o p u m u s r a t s i o i t a + r a t t i j u o p u m u s t a + r a t t i o h j a i n + r a t t o i s a m p i a + r a u d a n l u j a + r a u d a n l u j a a n + r a u d a n l u j a s t a + r a u d a n l u j a t + r a u d a n l u j i a + r a u d a n p u u t e + r a u d a n p u u t e a n e m i a + r a u d a n t u o t a n t o + r a u d u s k o i v u + r a u e n n e i n a + r a u e t a + r a u h a a + r a u h a a k a a n + r a u h a a n + r a u h a a n p a k o t t a m i s e e n + r a u h a a n p a k o t t a m i s t o i m i l l e + r a u h a l l e + r a u h a l l i s e m m a k s i + r a u h a l l i s e m m a n + r a u h a l l i s e m m a s s a + r a u h a l l i s e m m i k s i + r a u h a l l i s e m m i n + r a u h a l l i s e m p a a + r a u h a l l i s e m p i + r a u h a l l i s e m p i a + r a u h a l l i s e n + r a u h a l l i s e n a + r a u h a l l i s i a + r a u h a l l i s i m m i s s a + r a u h a l l i s i m m i s t a + r a u h a l l i s i n + r a u h a l l i s i n a + r a u h a l l i s t a + r a u h a n + r a u h a n a j a n + r a u h a n a j a t u k s e n + r a u h a n a j o + r a u h a n a k t i v i s t e i l l e + r a u h a n a k t i v i s t i a + r a u h a n a k t i v i s t i n + r a u h a n a k t i v i s t i n a + r a u h a n a k t i v i s t i t + r a u h a n a l o i t e + r a u h a n a l o i t e t t a + r a u h a n a l o i t t e e l l a + r a u h a n a l o i t t e e l l e + r a u h a n a l o i t t e e n + r a u h a n a l o i t t e e s e e n + r a u h a n a l o i t t e e s s a + r a u h a n a l o i t t e e s t a + r a u h a n a l o i t t e i d e n + r a u h a n a l o i t t e i l l e + r a u h a n a l o i t t e i s i i n + r a u h a n a l o i t t e i t a + r a u h a n a s i a n t u n t i j o i t a + r a u h a n a s i o i t a + r a u h a n a s u m u k s e n + r a u h a n e d i s t y s t y ö l l e + r a u h a n e h d o t + r a u h a n e h d o t u k s e n + r a u h a n e h d o t u k s e n s a + r a u h a n e h d o t u k s e t + r a u h a n e h d o t u k s i a + r a u h a n e h d o t u k s i i n + r a u h a n e h d o t u s + r a u h a n e h t o j e n + r a u h a n e n k e l e i t ä + r a u h a n f o o r u m i n + r a u h a n h a n k e + r a u h a n h a n k e t t a + r a u h a n h a n k k e e l l e + r a u h a n h a n k k e e n a + r a u h a n h a n k k e e s e e n + r a u h a n h a n k k e i d e n + r a u h a n h a n k k e i s i i n + r a u h a n i l m a i s u l l e + r a u h a n i n d e k s i + r a u h a n i n s t i t u u t t i + r a u h a n j a k s o + r a u h a n j o u k k o j a + r a u h a n j o u k o i l l a + r a u h a n j o u k o i s t a + r a u h a n j o u k o t + r a u h a n j ä r j e s t e l m ä + r a u h a n j ä r j e s t e l y + r a u h a n j ä r j e s t e l y i t ä + r a u h a n j ä r j e s t e l y j e n + r a u h a n j ä r j e s t e l y s s ä + r a u h a n j ä r j e s t y k s e n + r a u h a n j ä r j e s t ö + r a u h a n j ä r j e s t ö n ä + r a u h a n j ä r j e s t ö ä + r a u h a n k a i p u u s t a a n + r a u h a n k a s v a t u k s e e n + r a u h a n k a s v a t u s p a l k i n t o + r a u h a n k a s v a t u s t a + r a u h a n k e h i t y k s e e n + r a u h a n k e h i t y k s e l t ä + r a u h a n k e h i t y k s e n + r a u h a n k e h i t y k s e s s ä + r a u h a n k e h i t y k s e s t ä + r a u h a n k e h i t y s t ä + r a u h a n k e h o t u s + r a u h a n k o a l i t i o t a + r a u h a n k o k o u s + r a u h a n k o m i s s i o + r a u h a n k o m i s s i o n + r a u h a n k o m i t e a + r a u h a n k o m p r o m i s s i a + r a u h a n k o n f e r e n s s i + r a u h a n k o n f e r e n s s i a + r a u h a n k o n f e r e n s s i i n + r a u h a n k o n f e r e n s s i l l a + r a u h a n k o n f e r e n s s i l l e + r a u h a n k o n f e r e n s s i n + r a u h a n k o n f e r e n s s i s t a + r a u h a n k u l t t u u r i n + r a u h a n k u m p p a n i + r a u h a n k u m p p a n i l t a + r a u h a n k u m p p a n i n + r a u h a n k u m p p a n u u d e n + r a u h a n k u m p p a n u u d e s s a + r a u h a n k u m p p a n u u k s i a + r a u h a n k u m p p a n u u s + r a u h a n k u m p p a n u u s o h j e l m a + r a u h a n k u m p p a n u u s o h j e l m a l l e + r a u h a n k u m p p a n u u s t o i m i n t a a n + r a u h a n k u m p p a n u u t e e n + r a u h a n k u m p p a n u u t t a + r a u h a n k v a r t e t t i + r a u h a n k y s y m y k s e e n + r a u h a n k y y h k y i k s i + r a u h a n l a b o r a t o r i o i l l e + r a u h a n l a b o r a t o r i o n + r a u h a n l a b o r a t o r i o t + r a u h a n l a u s e k e + r a u h a n l a u s e k k e e n + r a u h a n l a u s e k k e e s e e n + r a u h a n l e i r e i l l e + r a u h a n l e i r i + r a u h a n l i i k e + r a u h a n l i i k e t t ä + r a u h a n l i i k k e e l l e + r a u h a n l i i k k e e n + r a u h a n l i i k k e e s e e n + r a u h a n l i i k k e e t + r a u h a n l i i k k e i l l e + r a u h a n l i i k k e i s s ä + r a u h a n l u o j a n a + r a u h a n l ä h e t t i l ä ä n ä + r a u h a n l ä h e t y s l i i k e + r a u h a n m a h d i k s i + r a u h a n m a h d o l l i s u u d e t + r a u h a n m a h d o l l i s u u k s i i n + r a u h a n m a r s s i l l a + r a u h a n m a t k a l l a + r a u h a n m e k a n i s m i e n + r a u h a n m e n e t e l m ä + r a u h a n m e n e t t e l y j ä + r a u h a n m e r k k i + r a u h a n m i e h e k s i + r a u h a n m i e l e n o s o i t u k s i a + r a u h a n m u i s t o m e r k k i + r a u h a n n e u v o s t o + r a u h a n n e u v o s t o n + r a u h a n n e u v o t t e l i j a + r a u h a n n e u v o t t e l i j o i d e n + r a u h a n n e u v o t t e l u i d e n + r a u h a n n e u v o t t e l u i h i n + r a u h a n n e u v o t t e l u i l l e + r a u h a n n e u v o t t e l u i s s a + r a u h a n n e u v o t t e l u i s t a + r a u h a n n e u v o t t e l u i t a + r a u h a n n e u v o t t e l u j a + r a u h a n n e u v o t t e l u j e n + r a u h a n n e u v o t t e l u p r o s e s s e i h i n + r a u h a n n e u v o t t e l u p r o s e s s i n + r a u h a n n e u v o t t e l u t + r a u h a n n e u v o t t e l u t y ö t ä + r a u h a n n e u v o t t e l u y r i t y k s i ä + r a u h a n n o b e l i s t i t + r a u h a n n ä k y m i e n + r a u h a n n ä k y m i i n + r a u h a n n ä k y m i l l e + r a u h a n n ä k y m i ä + r a u h a n o h j e l m a + r a u h a n o h j e l m a a + r a u h a n o h j e l m a a n + r a u h a n o h j e l m a l l e + r a u h a n o h j e l m a n + r a u h a n o h j e l m a n s a + r a u h a n o m a i n e n + r a u h a n o m a i s e e n + r a u h a n o m a i s e k s i + r a u h a n o m a i s e l l a + r a u h a n o m a i s e l l e + r a u h a n o m a i s e m m a l l e + r a u h a n o m a i s e m m a n + r a u h a n o m a i s e m m i n + r a u h a n o m a i s e m p a a + r a u h a n o m a i s e m p a a n + r a u h a n o m a i s e m p i + r a u h a n o m a i s e m p i a + r a u h a n o m a i s e m p i e n + r a u h a n o m a i s e n + r a u h a n o m a i s e n a + r a u h a n o m a i s e s s a + r a u h a n o m a i s e s t a + r a u h a n o m a i s e s t i + r a u h a n o m a i s i a + r a u h a n o m a i s i k s i + r a u h a n o m a i s i l l e + r a u h a n o m a i s i m m a t + r a u h a n o m a i s i n + r a u h a n o m a i s i n a + r a u h a n o m a i s i s s a + r a u h a n o m a i s t a + r a u h a n o m a i s t e n + r a u h a n o p e r a a t i o i d e n + r a u h a n o p e r a a t i o i h i n + r a u h a n o p e r a a t i o i s s a + r a u h a n o p e r a a t i o i t a + r a u h a n o p e r a a t i o l l a + r a u h a n o p e r a a t i o o n + r a u h a n o p p o s i t i o + r a u h a n o s i n k o + r a u h a n o s u u t e n s a + r a u h a n p a k e t t i a + r a u h a n p a k o t t a m i s e e n + r a u h a n p a l a u t t a m i n e n + r a u h a n p a l a u t t a m i s n e u v o s t o + r a u h a n p a l k i n n o n + r a u h a n p a l k i n t o + r a u h a n p a l k i n t o s e r e m o n i a s t a + r a u h a n p e r u s k i r j a + r a u h a n p e r u s k i r j a n + r a u h a n p o l i i t t i s e s s a + r a u h a n p o l i t i i k a k s i + r a u h a n p o l i t i i k a l l a + r a u h a n p o l i t i i k a l l e + r a u h a n p o l i t i i k a n + r a u h a n p o l i t i i k k a + r a u h a n p o l i t i i k k a a + r a u h a n p o l i t i i k k a a n + r a u h a n p o n n i s t e l u i h i n + r a u h a n p o n n i s t e l u i s t a + r a u h a n p o n n i s t e l u j a + r a u h a n p o n n i s t e l u j e n + r a u h a n p o n n i s t e l u t + r a u h a n p o n n i s t u k s i a + r a u h a n p r o j e k t e i h i n + r a u h a n p r o j e k t i + r a u h a n p r o j e k t i l l e + r a u h a n p r o j e k t i n a + r a u h a n p r o s e s s e i h i n + r a u h a n p r o s e s s e i s s a + r a u h a n p r o s e s s e i s t a + r a u h a n p r o s e s s e j a + r a u h a n p r o s e s s i + r a u h a n p r o s e s s i a + r a u h a n p r o s e s s i e n + r a u h a n p r o s e s s i i n + r a u h a n p r o s e s s i l l a + r a u h a n p r o s e s s i l l e + r a u h a n p r o s e s s i l t a + r a u h a n p r o s e s s i m m e + r a u h a n p r o s e s s i n + r a u h a n p r o s e s s i s s a + r a u h a n p r o s e s s i s t a + r a u h a n p r o s e s s i t + r a u h a n p u i s t o + r a u h a n p u o l u s t a j a n a + r a u h a n p u o l u s t u s y h d i s t y k s e t + r a u h a n p y r k i m y k s e s s ä + r a u h a n p y r k i m y k s e t + r a u h a n p y r k i m y k s i i n + r a u h a n p y r k i m y k s i l l e + r a u h a n p y r k i m y k s i s s ä + r a u h a n p y r k i m y k s i s s ä ä n + r a u h a n p y r k i m y k s i s t ä ä n + r a u h a n p y r k i m y k s i ä + r a u h a n p y r k i m y s t e n + r a u h a n p y r k i m y s t ä + r a u h a n r a h a s t o + r a u h a n r a h a s t o a + r a u h a n r a h a s t o n + r a u h a n r a h a s t o s t a + r a u h a n r a k e n n u k s e n + r a u h a n r a k e n n u s a l o i t t e i s t a + r a u h a n r a k e n n u s k o m i s s i o + r a u h a n r a k e n n u s k o m i s s i o n + r a u h a n r a k e n n u s k o m i t e a n + r a u h a n r a k e n n u s o h j e l m i i n + r a u h a n r a k e n n u s t e h t ä v ä n + r a u h a n r a k e n t a j i a + r a u h a n r a k e n t a j i i n + r a u h a n r a k e n t a m i n e n + r a u h a n r a k e n t a m i s e e n + r a u h a n r a k e n t a m i s e l l e + r a u h a n r a k e n t a m i s e n + r a u h a n r a k e n t a m i s e s s a + r a u h a n r a k e n t a m i s e s t a + r a u h a n r a k e n t a m i s h a n k e + r a u h a n r a k e n t a m i s h a n k k e i s i i n + r a u h a n r a k e n t a m i s k o m i s s i o + r a u h a n r a k e n t a m i s k o m i s s i o l l e + r a u h a n r a k e n t a m i s k o m i s s i o n + r a u h a n r a k e n t a m i s m a t k a n + r a u h a n r a k e n t a m i s o h j e l m i l l e + r a u h a n r a k e n t a m i s p y r k i m y k s e t + r a u h a n r a k e n t a m i s t a + r a u h a n r a k e n t a m i s t y ö + r a u h a n r a k e n t a m i s y k s i k k ö + r a u h a n r a k k a u t t a n s a + r a u h a n r a t k a i s u + r a u h a n r a t k a i s u a + r a u h a n r a t k a i s u n + r a u h a n r i n t a m a l l a + r a u h a n r u h t i n a s + r a u h a n r y h m ä + r a u h a n s a n o m a a + r a u h a n s a t a m a l t a + r a u h a n s i l t o j a + r a u h a n s i t o u m u k s i a + r a u h a n s o p i m u k s e e n + r a u h a n s o p i m u k s e l l a + r a u h a n s o p i m u k s e l l e + r a u h a n s o p i m u k s e n + r a u h a n s o p i m u k s e s s a + r a u h a n s o p i m u k s e s t a + r a u h a n s o p i m u k s e t + r a u h a n s o p i m u k s i a + r a u h a n s o p i m u k s i i n + r a u h a n s o p i m u k s i l l a + r a u h a n s o p i m u k s i n + r a u h a n s o p i m u k s i n e e n + r a u h a n s o p i m u k s i s s a + r a u h a n s o p i m u s + r a u h a n s o p i m u s k a a n + r a u h a n s o p i m u s t a + r a u h a n s o p i m u s t e n + r a u h a n s o v i t t e l i j a n + r a u h a n s t r a t e g i a l l e + r a u h a n s t r a t e g i a n + r a u h a n s t r a t e g i a s t a + r a u h a n s u u n n i t e l m a + r a u h a n s u u n n i t e l m a a + r a u h a n s u u n n i t e l m a a n + r a u h a n s u u n n i t e l m a k s i + r a u h a n s u u n n i t e l m a l l a + r a u h a n s u u n n i t e l m a l l e + r a u h a n s u u n n i t e l m a l u o n n o s t a + r a u h a n s u u n n i t e l m a n + r a u h a n s u u n n i t e l m a s s a + r a u h a n s u u n n i t e l m a s t a + r a u h a n s u u n n i t e l m i e n + r a u h a n s y m b o l e j a + r a u h a n s ä ä n n ö s t ö n + r a u h a n t a h d o s t a a n + r a u h a n t a h t o + r a u h a n t a h t o a + r a u h a n t a h t o i s i a + r a u h a n t a i s t e l i j o i d e n + r a u h a n t a l o u t e e n + r a u h a n t a r j o u s t a + r a u h a n t a r k k a i l i j a r y h m ä l l e + r a u h a n t a r k k a i l i j o i d e n + r a u h a n t a r k k a i l i j o i l l e + r a u h a n t a r k k a i l i j o i n a + r a u h a n t a r k k a i l i j o i t a + r a u h a n t e h t ä v i s s ä + r a u h a n t e h t ä v ä k s i + r a u h a n t e h t ä v ä ä + r a u h a n t e k e m i s d i p l o m a t i a a + r a u h a n t e k i j ä + r a u h a n t e k i j ä n ä + r a u h a n t e k i j ö i n ä + r a u h a n t e k o + r a u h a n t e k o a + r a u h a n t e k o t a p a + r a u h a n t i l a a + r a u h a n t i l a n + r a u h a n t o i m i s t o + r a u h a n t o i v e e t + r a u h a n t o i v e i d e n + r a u h a n t o i v e i t a + r a u h a n t u o j i n a + r a u h a n t u o m a r i + r a u h a n t u o m a r i n a + r a u h a n t u r v a + r a u h a n t u r v a a j a j o u k k o + r a u h a n t u r v a a j a n a + r a u h a n t u r v a a j i a + r a u h a n t u r v a a j i e n + r a u h a n t u r v a a j i i n + r a u h a n t u r v a a j i l l a + r a u h a n t u r v a a j i n + r a u h a n t u r v a a m i s e e n + r a u h a n t u r v a a m i s e n + r a u h a n t u r v a a m i s j o u k k o j e n + r a u h a n t u r v a a m i s k u s t a n n u k s i s t a + r a u h a n t u r v a a m i s k y k y ä + r a u h a n t u r v a a m i s o p e r a a t i o i h i n + r a u h a n t u r v a a m i s o p e r a a t i o i s t a + r a u h a n t u r v a a m i s t a r k o i t u k s i i n + r a u h a n t u r v a a m i s t e h t ä v i e n + r a u h a n t u r v a a m i s t e h t ä v ä n s ä + r a u h a n t u r v a a m i s t e h t ä v ä t + r a u h a n t u r v a a m i s t e h t ä v ä ä n + r a u h a n t u r v a a m i s t o i m i s t a + r a u h a n t u r v a a m i s v a l m i u k s i e n + r a u h a n t u r v a a m i s v a l t u u k s i n + r a u h a n t u r v a h a n k e + r a u h a n t u r v a i n s t i t u u t i o m m e + r a u h a n t u r v a j o u k k o + r a u h a n t u r v a j o u k k o i h i n + r a u h a n t u r v a j o u k k o j a + r a u h a n t u r v a j o u k k o j a a n + r a u h a n t u r v a j o u k k o j a m m e + r a u h a n t u r v a j o u k k o j e n + r a u h a n t u r v a j o u k k o o n + r a u h a n t u r v a j o u k o i l l a + r a u h a n t u r v a j o u k o i l l e + r a u h a n t u r v a j o u k o i n + r a u h a n t u r v a j o u k o i s s a + r a u h a n t u r v a j o u k o i s t a + r a u h a n t u r v a j o u k o l l a + r a u h a n t u r v a j o u k o l l e + r a u h a n t u r v a j o u k o n + r a u h a n t u r v a j o u k o t + r a u h a n t u r v a j o u k o t h a n + r a u h a n t u r v a j ä r j e s t e l m ä t + r a u h a n t u r v a o p e r a a t i o + r a u h a n t u r v a o p e r a a t i o i d e n + r a u h a n t u r v a o p e r a a t i o i h i n + r a u h a n t u r v a o p e r a a t i o i l l a + r a u h a n t u r v a o p e r a a t i o i s s a + r a u h a n t u r v a o p e r a a t i o i s t a + r a u h a n t u r v a o p e r a a t i o i t a + r a u h a n t u r v a o p e r a a t i o l l a + r a u h a n t u r v a o p e r a a t i o n + r a u h a n t u r v a o p e r a a t i o n s a + r a u h a n t u r v a o p e r a a t i o o n + r a u h a n t u r v a o p e r a a t i o s t a + r a u h a n t u r v a o p e r a a t i o t + r a u h a n t u r v a o p e r a a t i o t a + r a u h a n t u r v a t a r k k a i l i j o i d e n + r a u h a n t u r v a t e h t ä v i e n + r a u h a n t u r v a t e h t ä v i i n + r a u h a n t u r v a t e h t ä v i s s ä + r a u h a n t u r v a t e h t ä v i ä + r a u h a n t u r v a t e h t ä v ä t + r a u h a n t u r v a t e h t ä v ä ä + r a u h a n t u r v a t e h t ä v ä ä n + r a u h a n t u r v a t o i m e t + r a u h a n t u r v a t o i m i a + r a u h a n t u r v a t o i m i e n + r a u h a n t u r v a t o i m i i n + r a u h a n t u r v a t o i m i n n a n + r a u h a n t u r v a y k s i k k ö n s ä + r a u h a n t u t k i m u k s e e n + r a u h a n t u t k i m u s i n s t i t u u t t i + r a u h a n t y ö + r a u h a n t y ö n t e k i j ö i t ä + r a u h a n t y ö s s ä + r a u h a n t y ö s t ä + r a u h a n t y ö t ä + r a u h a n t y ö t ä ä n + r a u h a n v a l t u u t e t t u + r a u h a n v a l v o n t a a + r a u h a n v e r k o s t o j a + r a u h a n v i e s t i + r a u h a n v i e s t i ä + r a u h a n v y ö h y k k e e k s i + r a u h a n v ä l i t t ä j i ä + r a u h a n v ä l i t t ä j ä + r a u h a n v ä l i t t ä j ä n ä + r a u h a n v ä l i t y k s e n ä + r a u h a n v ä l i t y s + r a u h a n y h d i s t y s + r a u h a n y h t e i s ö + r a u h a n y h t e i s ö j e n + r a u h a n y l i o p i s t o + r a u h a p r o s e s s i i n + r a u h a p r o s e s s i l l e + r a u h a s s a + r a u h a s t a + r a u h a t e o r i a + r a u h a t t o m u u t t a + r a u h a t u r v a a j i l l a + r a u h a t u r v a o p e r a a t i o i h i n + r a u h o i t e l l a + r a u h o i t e l l e s s a m m e + r a u h o i t e t t a v a + r a u h o i t t a a + r a u h o i t t a a k s e n i + r a u h o i t t a a k s e n n e + r a u h o i t t a i s i n + r a u h o i t t a m a a n + r a u h o i t t a m i s e k s i + r a u h o i t t a m i s t y ö + r a u h o i t t a v i a + r a u h o i t t a v i e n + r a u h o i t t e l e v a m p a a n + r a u h o i t t i v a t + r a u h o i t t u a + r a u h o i t t u m a a n + r a u h o i t t u m i n e n + r a u h o i t t u v a t + r a u h o i t u s a i k o j a + r a u h o i t u s a i k o j e n + r a u h o i t u s a j a n + r a u h o i t u s k a u d e t + r a u h o i t u s k a u s i a + r a u h o i t u s k a u s i e n + r a u h o i t u t t u a + r a u k a t + r a u k e a a + r a u k e a m i s l a u s e k e + r a u k e a m i s l a u s e k e t t a + r a u k e a m i s l a u s e k k e e n + r a u k e a m i s l a u s e k k e e s e e n + r a u k e a m i s l a u s e k k e e s t a + r a u k e a m i s l a u s e k k e e t + r a u k e a m i s l a u s e k k e i d e n + r a u k k a m a i s t a + r a u k k o j e n + r a u n i k k i v y ö k o i + r a u n i o a r v o + r a u n i o e l o k u v a + r a u n i o i n a + r a u n i o i t u a + r a u n i o i t u m a a n + r a u n i o i t u u + r a u n i o s a v i k k a + r a u t a b a k t e e r i t + r a u t a b r o m i d i + r a u t a e s i r i p p u + r a u t a e s i r i p p u a + r a u t a e s i r i p p u j a + r a u t a e s i r i p p u j e n + r a u t a e s i r i p p u n a + r a u t a e s i r i p u k s i + r a u t a e s i r i p u l l a + r a u t a e s i r i p u n + r a u t a e s i r i p u s t a + r a u t a e s i r i p u t + r a u t a h y d r o k s i d i + r a u t a h ä k i s s ä + r a u t a h ä k k i + r a u t a i s e l l a + r a u t a i s i n + r a u t a j ä t t i + r a u t a k a a r t i + r a u t a k a r b o n y y l i + r a u t a k a t a s t r o f i + r a u t a k a u p a n + r a u t a k a u s i + r a u t a k e u h k o + r a u t a k l o r i d i + r a u t a k u l j e t u s t e n + r a u t a k u p o l i + r a u t a l a n g a l l a + r a u t a l a n g o i n + r a u t a l i i k e n n e t t ä + r a u t a l i i k e n t e e s e e n + r a u t a l o h i k ä ä r m e e n + r a u t a m a l m i + r a u t a m a l m i n + r a u t a m e t a l l e i s t a + r a u t a m e t a l l i e n + r a u t a m e t a l l i t + r a u t a m e t e o r i i t t i + r a u t a m i e s + r a u t a m u o d o s t u m a + r a u t a n a a m i o + r a u t a n e i t s y t + r a u t a n i t r a a t t i + r a u t a n o k k o n e n + r a u t a n y r k i l l ä + r a u t a n y r k k i + r a u t a n y r k k i ä + r a u t a o k s i d i + r a u t a p i i k k i + r a u t a p o r t t i + r a u t a p r i k a a t i + r a u t a p u t k i a + r a u t a p y ö r i e n + r a u t a r i s t i + r a u t a r o u v a + r a u t a r o u v a n + r a u t a s u l f a a t t i + r a u t a s u l f i d i + r a u t a t a b l e t t i e n + r a u t a t a m m i + r a u t a t a n g o t + r a u t a t a n k o i h i n + r a u t a t a n k o j a + r a u t a t e h d a s + r a u t a t e i d e m m e + r a u t a t e i d e n + r a u t a t e i h i n + r a u t a t e i l l e + r a u t a t e i l l ä + r a u t a t e i s s ä + r a u t a t e i s t ä + r a u t a t e i t ä + r a u t a t i e + r a u t a t i e a j a l l e + r a u t a t i e a j o n e u v o j e n + r a u t a t i e a k s e l i + r a u t a t i e a l a + r a u t a t i e a l a a + r a u t a t i e a l a a n + r a u t a t i e a l a k s i + r a u t a t i e a l a l l a + r a u t a t i e a l a l l e + r a u t a t i e a l a m m e + r a u t a t i e a l a n + r a u t a t i e a l o j e n + r a u t a t i e a l u e + r a u t a t i e a l u e e n + r a u t a t i e a l u e e s t a + r a u t a t i e a l u e t t a + r a u t a t i e a s e m a + r a u t a t i e a s e m a l l a + r a u t a t i e a s e m a l l e + r a u t a t i e a s e m a n + r a u t a t i e a s e m i a + r a u t a t i e a s e m i e n + r a u t a t i e a s e m i i n + r a u t a t i e a s e m i l l a + r a u t a t i e a s e m i l l e + r a u t a t i e a s e m i s t a + r a u t a t i e a s i a n + r a u t a t i e a s i a s s a + r a u t a t i e d i r e k t i i v e i h i n + r a u t a t i e d i r e k t i i v i + r a u t a t i e d i r e k t i i v i p a k e t i n + r a u t a t i e d i r e k t i i v i t + r a u t a t i e h a l l i n n o n + r a u t a t i e h a l l i n t o + r a u t a t i e h a n k e + r a u t a t i e h a n k e t t a + r a u t a t i e h a n k k e e s e e n + r a u t a t i e h a n k k e e t + r a u t a t i e h a n k k e i d e n + r a u t a t i e h a n k k e i l l e + r a u t a t i e h a n k k e i s i i n + r a u t a t i e h a n k k e i t a + r a u t a t i e h e n k i l ö k u n n a l l e + r a u t a t i e h e n k i l ö s t ö + r a u t a t i e h e n k i l ö s t ö l l e + r a u t a t i e h e n k i l ö s t ö n + r a u t a t i e h e n k i l ö s t ö ö n + r a u t a t i e i n f r a s t r u k t u u r e i d e n + r a u t a t i e i n f r a s t r u k t u u r e i s s a + r a u t a t i e i n f r a s t r u k t u u r i + r a u t a t i e i n f r a s t r u k t u u r i a + r a u t a t i e i n f r a s t r u k t u u r i e n + r a u t a t i e i n f r a s t r u k t u u r i i n + r a u t a t i e i n f r a s t r u k t u u r i n + r a u t a t i e i n f r a s t r u k t u u r i o p e r a a t t o r i n + r a u t a t i e i n f r a s t r u k t u u r i p a k e t i n + r a u t a t i e i n f r a s t r u k t u u r i s s a + r a u t a t i e i n f r a s t r u k t u u r i s t a + r a u t a t i e i n s i n ö ö r e j ä + r a u t a t i e i n s i n ö ö r i + r a u t a t i e j ä r j e s t e l m i e n + r a u t a t i e j ä r j e s t e l m i i n + r a u t a t i e j ä r j e s t e l m i l l e + r a u t a t i e j ä r j e s t e l m i s t ä + r a u t a t i e j ä r j e s t e l m i ä + r a u t a t i e j ä r j e s t e l m ä + r a u t a t i e j ä r j e s t e l m ä n + r a u t a t i e j ä r j e s t e l m ä s t ä + r a u t a t i e j ä r j e s t e l m ä t + r a u t a t i e j ä r j e s t e l m ä ä + r a u t a t i e j ä r j e s t e l m ä ä m m e + r a u t a t i e j ä r j e s t e l m ä ä n + r a u t a t i e k a l u s t o + r a u t a t i e k a l u s t o a + r a u t a t i e k a l u s t o j e n + r a u t a t i e k a l u s t o m a r k k i n a t + r a u t a t i e k a l u s t o n + r a u t a t i e k a l u s t o o n + r a u t a t i e k a l u s t o s t a + r a u t a t i e k a l u s t o t e o l l i s u u d e n + r a u t a t i e k a p a s i t e e t i n + r a u t a t i e k a p a s i t e e t i s t a + r a u t a t i e k a p a s i t e e t t i a + r a u t a t i e k i s k o j a + r a u t a t i e k u l j e t u k s e n + r a u t a t i e k u l j e t u k s e s s a + r a u t a t i e k u l j e t u k s e t + r a u t a t i e k u l j e t u k s i a + r a u t a t i e k u l j e t u k s i e n + r a u t a t i e k u l j e t u k s i i n + r a u t a t i e k u l j e t u k s i l l a + r a u t a t i e k u l j e t u k s i l l e + r a u t a t i e k u l j e t u k s i l t a + r a u t a t i e k u l j e t u k s i s s a + r a u t a t i e k u l j e t u k s i s t a + r a u t a t i e k u l j e t u s a l a n + r a u t a t i e k u l j e t u s j ä r j e s t e l m i e n + r a u t a t i e k u l j e t u s m a r k k i n o i d e n + r a u t a t i e k u l j e t u s p a l v e l u j e n + r a u t a t i e k u l j e t u s p o l i t i i k k a a + r a u t a t i e k u l j e t u s t a + r a u t a t i e k u l j e t u s t e n + r a u t a t i e k u l j e t u s t o i m i n n a l l e + r a u t a t i e k u l j e t u s y r i t y s t e n + r a u t a t i e k u l t t u u r e j a + r a u t a t i e k u l t t u u r i + r a u t a t i e k u l t t u u r i a + r a u t a t i e k u l t t u u r i s t a + r a u t a t i e k u l t t u u r i t + r a u t a t i e k ä y t ä n n ö n + r a u t a t i e k ä y t ä v i ä + r a u t a t i e k ä y t ä v ä n + r a u t a t i e k ä y t ä v ä s t ä + r a u t a t i e k ä y t ä v ä v e r k o s t o a + r a u t a t i e k ä y t ä v ä ä + r a u t a t i e l a i n s ä ä d ä n n ö n + r a u t a t i e l a i n s ä ä d ä n t ö + r a u t a t i e l a i t o k s e n + r a u t a t i e l a i t o s + r a u t a t i e l a i t o s t a + r a u t a t i e l a i t t e i s t o j a + r a u t a t i e l a k o t + r a u t a t i e l i i k e n n e + r a u t a t i e l i i k e n n e a l a + r a u t a t i e l i i k e n n e a l a n + r a u t a t i e l i i k e n n e a l u e e l l a + r a u t a t i e l i i k e n n e a l u e e l l e + r a u t a t i e l i i k e n n e a l u e e n + r a u t a t i e l i i k e n n e a l u e e s e e n + r a u t a t i e l i i k e n n e a l u e t t a + r a u t a t i e l i i k e n n e j ä r j e s t e l m ä ä n + r a u t a t i e l i i k e n n e k ä y t ä v ä ä n + r a u t a t i e l i i k e n n e m a r k k i n a t + r a u t a t i e l i i k e n n e m a r k k i n o i d e n + r a u t a t i e l i i k e n n e m a r k k i n o i s t a + r a u t a t i e l i i k e n n e p a k e t i n + r a u t a t i e l i i k e n n e p a k e t t i + r a u t a t i e l i i k e n n e p a l v e l u + r a u t a t i e l i i k e n n e p a l v e l u i s t a + r a u t a t i e l i i k e n n e p a l v e l u j a + r a u t a t i e l i i k e n n e p a l v e l u j e n + r a u t a t i e l i i k e n n e p a l v e l u s t a + r a u t a t i e l i i k e n n e p a l v e l u t + r a u t a t i e l i i k e n n e s e k t o r i l l a + r a u t a t i e l i i k e n n e t a r j o u k s i a + r a u t a t i e l i i k e n n e t t ä + r a u t a t i e l i i k e n n e t y y p i n + r a u t a t i e l i i k e n n e v a i h t o e h t o + r a u t a t i e l i i k e n n e v e r k o n + r a u t a t i e l i i k e n n e y h t e y k s i e n + r a u t a t i e l i i k e n t e e l l e + r a u t a t i e l i i k e n t e e l l ä + r a u t a t i e l i i k e n t e e l t ä + r a u t a t i e l i i k e n t e e n + r a u t a t i e l i i k e n t e e s e e n + r a u t a t i e l i i k e n t e e s s ä + r a u t a t i e l i i k e n t e e s t ä + r a u t a t i e l i n j a + r a u t a t i e l i n j a a + r a u t a t i e l i n j a n + r a u t a t i e l i n j a t + r a u t a t i e l i n j o i l l a + r a u t a t i e l i n j o i s t a + r a u t a t i e l i n j o j a + r a u t a t i e l i n j o j e n + r a u t a t i e l ä i s e t + r a u t a t i e l ä i s t e n + r a u t a t i e l ä i s t ä + r a u t a t i e m a k s u + r a u t a t i e m a k s u n + r a u t a t i e m a n i a + r a u t a t i e m a r k k i n a t + r a u t a t i e m a r k k i n o i d e n + r a u t a t i e m a r k k i n o i l l a + r a u t a t i e m a r k k i n o i l l e + r a u t a t i e m a r k k i n o i s t a + r a u t a t i e m a r k k i n o i t a + r a u t a t i e m a r k k i n o i t a a n + r a u t a t i e m a t k a i l u a + r a u t a t i e m a t k a i l u u n + r a u t a t i e m a t k a l l a + r a u t a t i e m a t k u s t a j a l i i k e n t e e l l e + r a u t a t i e m a t k u s t a j i e n + r a u t a t i e m a t k u s t a j i i n + r a u t a t i e m a t k u s t a j i l l e + r a u t a t i e m a t k u s t a m i s t a + r a u t a t i e m e l u l t a + r a u t a t i e m u s e o + r a u t a t i e m u s e o i h i n + r a u t a t i e n + r a u t a t i e o l o j a + r a u t a t i e o n n e t t o m u u d e s t a + r a u t a t i e o n n e t t o m u u k s i e n + r a u t a t i e o n n e t t o m u u s + r a u t a t i e o p e r a a t t o r i + r a u t a t i e o p e r a a t t o r i n + r a u t a t i e o p e r a a t t o r i t + r a u t a t i e o s u u d e n + r a u t a t i e o s u u k s i i n + r a u t a t i e o s u u k s i l l a + r a u t a t i e p a k e t e i l l a + r a u t a t i e p a k e t i k s i + r a u t a t i e p a k e t i l l a + r a u t a t i e p a k e t i n + r a u t a t i e p a k e t i s s a + r a u t a t i e p a k e t i s t a + r a u t a t i e p a k e t i t + r a u t a t i e p a k e t t e j a + r a u t a t i e p a k e t t i + r a u t a t i e p a k e t t i a + r a u t a t i e p a k e t t i i n + r a u t a t i e p a k e t t i n a + r a u t a t i e p a l v e l u i d e n + r a u t a t i e p a l v e l u i d e n s a + r a u t a t i e p a l v e l u i h i n + r a u t a t i e p a l v e l u i l l e + r a u t a t i e p a l v e l u j a + r a u t a t i e p a l v e l u j e n + r a u t a t i e p a l v e l u n + r a u t a t i e p a l v e l u n a + r a u t a t i e p a l v e l u t + r a u t a t i e p e r i n t ö ä m m e + r a u t a t i e p o l i t i i k a n + r a u t a t i e p o l i t i i k a s s a + r a u t a t i e p o l i t i i k a s t a + r a u t a t i e p o l i t i i k k a + r a u t a t i e p o l i t i i k k a a + r a u t a t i e p o l i t i i k k a m m e + r a u t a t i e p r o j e k t e i h i n + r a u t a t i e r a h d i n + r a u t a t i e r a h d i t + r a u t a t i e r a h t i a + r a u t a t i e r a h t i a k s e l i s t a + r a u t a t i e r a h t i a l a + r a u t a t i e r a h t i i n + r a u t a t i e r a h t i k u l j e t u k s e t + r a u t a t i e r a h t i k u l j e t u s t e n + r a u t a t i e r a h t i l i i k e n n e t t ä + r a u t a t i e r a h t i p a l v e l u t + r a u t a t i e r a h t i v ä y l i i n + r a u t a t i e r a k e n n e + r a u t a t i e r a k e n t e i t a + r a u t a t i e r a t k a i s u a + r a u t a t i e r e i t i n + r a u t a t i e r e i t t e i h i n + r a u t a t i e r e i t t e j ä + r a u t a t i e r e i t t i + r a u t a t i e r e i t t i i n + r a u t a t i e r e i t t i ä + r a u t a t i e s e i s a k e + r a u t a t i e s e k t o r i + r a u t a t i e s e k t o r i l l a + r a u t a t i e s e k t o r i l l e + r a u t a t i e s e k t o r i l l e k i n + r a u t a t i e s e k t o r i n + r a u t a t i e s i l t a + r a u t a t i e s t ä + r a u t a t i e s u u n n i t e l m a a + r a u t a t i e t + r a u t a t i e t a v a r a l i i k e n n e + r a u t a t i e t a v a r a l i i k e n n e t t ä + r a u t a t i e t a v a r a l i i k e n t e e s t ä + r a u t a t i e t e k n i i k k a a + r a u t a t i e t e o l l i s u u d e l l e + r a u t a t i e t e o l l i s u u d e n + r a u t a t i e t e o l l i s u u s + r a u t a t i e t e o l l i s u u t e m m e + r a u t a t i e t e o l l i s u u t t a + r a u t a t i e t o i m i a l a l l a + r a u t a t i e t o i m i j o i l l e + r a u t a t i e t o i m i n t a n s a + r a u t a t i e t u n n e l e i d e n + r a u t a t i e t u n n e l e i h i n + r a u t a t i e t u n n e l e i s s a + r a u t a t i e t u n n e l e i t a + r a u t a t i e t u n n e l i + r a u t a t i e t u n n e l i a + r a u t a t i e t u n n e l i e n + r a u t a t i e t u n n e l i h a n k e + r a u t a t i e t u n n e l i n + r a u t a t i e t u n n e l i s t a + r a u t a t i e t u r v a l l i s u u d e n + r a u t a t i e t u r v a l l i s u u d e s t a + r a u t a t i e t u r v a l l i s u u s d i r e k t i i v i + r a u t a t i e t u r v a l l i s u u s d i r e k t i i v i n + r a u t a t i e t u r v a l l i s u u t t a + r a u t a t i e t y k i s t ö + r a u t a t i e t y ö l ä i s e t + r a u t a t i e t y ö l ä i s t e n + r a u t a t i e t y ö n t e k i j ö i d e n + r a u t a t i e t y ö n t e k i j ö i l l e + r a u t a t i e t y ö n t e k i j ö i t ä + r a u t a t i e u u d i s t u k s i l l e + r a u t a t i e v a i h d e + r a u t a t i e v a i h t o e h t o + r a u t a t i e v a i h t o e h t o o n + r a u t a t i e v a r i k o t + r a u t a t i e v a u n u i s s a + r a u t a t i e v a u n u i s t a + r a u t a t i e v e r k k o + r a u t a t i e v e r k k o a + r a u t a t i e v e r k k o a m m e + r a u t a t i e v e r k k o i h i n + r a u t a t i e v e r k k o j a + r a u t a t i e v e r k k o j a m m e + r a u t a t i e v e r k k o j e n + r a u t a t i e v e r k k o m m e + r a u t a t i e v e r k k o n s a + r a u t a t i e v e r k k o o n + r a u t a t i e v e r k k o p a l v e l u j a + r a u t a t i e v e r k o i l l e + r a u t a t i e v e r k o i s t a + r a u t a t i e v e r k o i s t a m m e + r a u t a t i e v e r k o k s i + r a u t a t i e v e r k o l l a + r a u t a t i e v e r k o l l e + r a u t a t i e v e r k o n + r a u t a t i e v e r k o s s a + r a u t a t i e v e r k o s t a + r a u t a t i e v e r k o s t o + r a u t a t i e v e r k o s t o a + r a u t a t i e v e r k o s t o i l l e + r a u t a t i e v e r k o s t o j e n + r a u t a t i e v e r k o s t o l l e + r a u t a t i e v e r k o s t o m m e + r a u t a t i e v e r k o s t o n + r a u t a t i e v e r k o s t o n s a + r a u t a t i e v e r k o s t o o n + r a u t a t i e v e r k o s t o s s a + r a u t a t i e v e r k o s t o s t a + r a u t a t i e v e r k o s t o t + r a u t a t i e v e r k o t + r a u t a t i e v i r a s t o + r a u t a t i e v i r a s t o a + r a u t a t i e v i r a s t o i s t a + r a u t a t i e v i r a s t o l l a + r a u t a t i e v i r a s t o l l e + r a u t a t i e v i r a s t o l t a + r a u t a t i e v i r a s t o n + r a u t a t i e v i r a s t o s s a + r a u t a t i e v i r a s t o s t a + r a u t a t i e v ä y l i e n + r a u t a t i e y h d i s t y k s i l t ä + r a u t a t i e y h t e i s ö n + r a u t a t i e y h t e y d e l l ä + r a u t a t i e y h t e y d e n + r a u t a t i e y h t e y d e s s ä + r a u t a t i e y h t e y d e s t ä + r a u t a t i e y h t e y d e t + r a u t a t i e y h t e y k s i e n + r a u t a t i e y h t e y k s i i n + r a u t a t i e y h t e y k s i ä + r a u t a t i e y h t e y s + r a u t a t i e y h t e y s v e r k o n + r a u t a t i e y h t e y t e e n + r a u t a t i e y h t e y t t ä + r a u t a t i e y h t i ö + r a u t a t i e y h t i ö i d e n + r a u t a t i e y h t i ö i l l e + r a u t a t i e y h t i ö i l l ä + r a u t a t i e y h t i ö i s s ä + r a u t a t i e y h t i ö i s t ä + r a u t a t i e y h t i ö i t t e n + r a u t a t i e y h t i ö i t ä + r a u t a t i e y h t i ö l l ä + r a u t a t i e y h t i ö n + r a u t a t i e y h t i ö t + r a u t a t i e y h t i ö t ä + r a u t a t i e y l i o p i s t o a + r a u t a t i e y r i t y k s e n + r a u t a t i e y r i t y k s e s s ä + r a u t a t i e y r i t y k s e s t ä + r a u t a t i e y r i t y k s e t + r a u t a t i e y r i t y k s i i n + r a u t a t i e y r i t y k s i l l e + r a u t a t i e y r i t y k s i l l e e n + r a u t a t i e y r i t y k s i l l ä + r a u t a t i e y r i t y k s i s s ä + r a u t a t i e y r i t y k s i s t ä + r a u t a t i e y r i t y k s i ä + r a u t a t i e y r i t y s + r a u t a t i e y r i t y s t e n + r a u t a t i e y r i t y s t ä + r a u t a v e r h o + r a u t a v e r h o n + r a u t a v u o r e t + r a v a n s a a r i + r a v i n n e p i t o i s u u k s i a + r a v i n n o k s i + r a v i n n o n + r a v i n n o n l ä h d e + r a v i n n o n l ä h d e t t ä + r a v i n n o n l ä h t e e l l e + r a v i n n o n l ä h t e e n ä + r a v i n n o n l ä h t e i t ä + r a v i n n o n m ä ä r ä + r a v i n n o n s a a n t i a + r a v i n n o n t a r p e e m m e + r a v i n n o n t a r p e e n + r a v i n n o n t u o t a n n o n + r a v i n n o n t u o t a n n o s t a + r a v i n n o n t u o t a n t o + r a v i n n o n v i e n t i + r a v i n t o a + r a v i n t o a a n + r a v i n t o a i n e + r a v i n t o a i n e i d e n + r a v i n t o a i n e i s t a + r a v i n t o a i n e i t a + r a v i n t o a i n e m e r k i n n ä t + r a v i n t o a i n e m e r k i n n ö i s s ä + r a v i n t o a i n e m e r k i n t ö j ä + r a v i n t o a i n e p r o f i i l e i l l a + r a v i n t o a i n e p r o f i i l e i s t a + r a v i n t o a i n e p r o f i i l e j a + r a v i n t o a i n e p r o f i i l i e n + r a v i n t o a i n e p r o f i i l i j ä r j e s t e l m ä s s ä + r a v i n t o a i n e p r o f i i l i t + r a v i n t o a r v o + r a v i n t o a r v o a + r a v i n t o a r v o i h i n + r a v i n t o a r v o i s t a + r a v i n t o a r v o j a + r a v i n t o a r v o m e r k i n n ö i s t ä + r a v i n t o a r v o m e r k i n t ö j ä + r a v i n t o a r v o n + r a v i n t o a r v o o n + r a v i n t o a r v o s t a + r a v i n t o a r v o t + r a v i n t o a s i a n t u n t i j o i d e n + r a v i n t o a s i o i s s a + r a v i n t o f y s i o l o g i s e s t i + r a v i n t o h y g i e n i a a n + r a v i n t o j ä r j e s t e l m ä n + r a v i n t o k a s v e i s t a + r a v i n t o k a s v i e n + r a v i n t o k a t s a u k s i a + r a v i n t o k e t j u + r a v i n t o k e t j u a + r a v i n t o k e t j u i h i n + r a v i n t o k e t j u j e n + r a v i n t o k e t j u l l e + r a v i n t o k e t j u l l e m m e + r a v i n t o k e t j u m m e + r a v i n t o k e t j u n + r a v i n t o k e t j u s s a + r a v i n t o k e t j u s t a + r a v i n t o k e t j u s t a m m e + r a v i n t o k e t j u t + r a v i n t o k e t j u u n + r a v i n t o k o o s t u m u k s e s t a + r a v i n t o k o o s t u m u s t y y p i t + r a v i n t o k u i t u + r a v i n t o l a a n + r a v i n t o l a h e n k i l ö k u n n a n + r a v i n t o l a j ä t t e i d e n + r a v i n t o l a k e t j u j e n + r a v i n t o l a k u l t t u u r i s t a + r a v i n t o l a k u s t a n n u s t e n + r a v i n t o l a l a i v a + r a v i n t o l a l a s k u + r a v i n t o l a l i i t t o + r a v i n t o l a l u o k i t u k s i a + r a v i n t o l a m e n o t + r a v i n t o l a m u s e o + r a v i n t o l a n + r a v i n t o l a n o m i s t a j i l l a + r a v i n t o l a n o m i s t a j i l l e + r a v i n t o l a p a l v e l u i h i n + r a v i n t o l a p a l v e l u j e n + r a v i n t o l a p a l v e l u t + r a v i n t o l a t + r a v i n t o l a v a u n u + r a v i n t o l i s i e n + r a v i n t o l i s i i n + r a v i n t o l i s i k s i + r a v i n t o l i s i l l e + r a v i n t o l i s i l l ä + r a v i n t o l i s i n ä + r a v i n t o l i s i s t ä + r a v i n t o l i s i ä + r a v i n t o l i s ä + r a v i n t o l i s ä d i r e k t i i v i + r a v i n t o l i s ä n + r a v i n t o l i s ä n ä + r a v i n t o l i s ä t + r a v i n t o l i s ä v a l m i s t e t e o l l i s u u s + r a v i n t o l i s ä ä + r a v i n t o l o i d e n + r a v i n t o l o i s s a + r a v i n t o l o i s t a + r a v i n t o l ä h t e e t + r a v i n t o n a a n + r a v i n t o n s a + r a v i n t o o n + r a v i n t o p i t o i s i i n + r a v i n t o p i t o i s t a + r a v i n t o p o l i t i i k k a a + r a v i n t o p u l a a n + r a v i n t o p u l a s t a + r a v i n t o p ä i v ä n + r a v i n t o p ä i v ä n ä + r a v i n t o p ä i v ä ä + r a v i n t o s i s ä l l ö n + r a v i n t o s i s ä l l ö t + r a v i n t o s i s ä l t ö + r a v i n t o s i s ä l t ö j e n + r a v i n t o s i s ä l t ö m e r k i n n ö i s t ä + r a v i n t o s i s ä l t ö p r o f i i l e j a + r a v i n t o s i s ä l t ö p r o f i i l i + r a v i n t o s i s ä l t ö p r o f i i l i a + r a v i n t o s i s ä l t ö p r o f i i l i e n + r a v i n t o s i s ä l t ö p r o f i i l i i n + r a v i n t o s i s ä l t ö p r o f i i l i n + r a v i n t o s i s ä l t ö p r o f i i l i s s a + r a v i n t o s i s ä l t ö p r o f i i l i t + r a v i n t o s i s ä l t ö t y y p e i s s ä + r a v i n t o s i s ä l t ö t y y p e i s t ä + r a v i n t o s i s ä l t ö t y y p i t + r a v i n t o s i s ä l t ö t y y p p e j ä + r a v i n t o s i s ä l t ö t y y p p i + r a v i n t o s i s ä l t ö t y y p p i e n + r a v i n t o s i s ä l t ö t y y p p i ä + r a v i n t o s i s ä l t ö ä + r a v i n t o s i s ä l t ö ö n + r a v i n t o s u o s i t u k s i a + r a v i n t o s u o s i t u s t e n + r a v i n t o s u u n n i t e l m i e n + r a v i n t o t a r k o i t u k s i s s a + r a v i n t o t a r p e e t + r a v i n t o t a r p e i d e m m e + r a v i n t o t a r p e i d e n + r a v i n t o t a s a p a i n o + r a v i n t o t a s a p a i n o o n + r a v i n t o t e o l l i s u u s + r a v i n t o t i e t o u d e n + r a v i n t o t i l a n n e + r a v i n t o t i l a n t e e l l a + r a v i n t o t i l a n t e e s t a + r a v i n t o t o t t u m u k s i a + r a v i n t o t o t t u m u k s i l l a + r a v i n t o t o t t u m u k s i s s a + r a v i n t o t o t t u m u k s i s t a + r a v i n t o t o t t u m u s t e n + r a v i n t o t u l e v a i s u u t t a + r a v i n t o t u o t a n n o n + r a v i n t o t u o t a n n o s s a + r a v i n t o t u o t a n t o k ä y t t ö ö n + r a v i n t o t u o t t e e t + r a v i n t o t u r v a l l i s u u d e n + r a v i n t o t u r v a l l i s u u s + r a v i n t o t u r v a l l i s u u s p o l i t i i k k a a + r a v i n t o v a l i n n a t + r a v i n t o v a l i s t u s t o i m e n p i t e i d e n + r a v i n t o v a r a s t o n a + r a v i o l i a + r a v i r a t a + r a v i s t e l l a k s e e n + r a v i s t e l l e e s e e n + r a v i s t e l l e e t + r a v i s t e l l e i s i i n + r a v i s t e t t a v a + r a v i t s e m i s e e n + r a v i t s e m i s e k s i + r a v i t s e m u k s e e n + r a v i t s e m u k s e s t a + r a v i t s e m u s a i n e i t a + r a v i t s e m u s a l a l l a + r a v i t s e m u s a l a l l e + r a v i t s e m u s a l a n + r a v i t s e m u s a r v o + r a v i t s e m u s a r v o a + r a v i t s e m u s a r v o n + r a v i t s e m u s a s i a n t u n t i j a + r a v i t s e m u s h ä i r i ö i h i n + r a v i t s e m u s h ä i r i ö i s t ä + r a v i t s e m u s k a s v a t u k s e s s a a n + r a v i t s e m u s k a s v a t u s + r a v i t s e m u s k a s v a t u s j ä r j e s t e l m ä ä n + r a v i t s e m u s m a l l i s s a + r a v i t s e m u s n e u v o n n a l t a + r a v i t s e m u s o h j e l m a + r a v i t s e m u s o h j e l m i e n + r a v i t s e m u s o n g e l m i i n + r a v i t s e m u s p a l v e l u j a + r a v i t s e m u s p o l i t i i k a n + r a v i t s e m u s s t a n d a r d e j a + r a v i t s e m u s s u o s i t u k s e t + r a v i t s e m u s t a r k o i t u k s e e n + r a v i t s e m u s t a r p e i d e n + r a v i t s e m u s t i e d o t + r a v i t s e m u s t i e d o t u k s e e n + r a v i t s e m u s t i e t e e n + r a v i t s e m u s t i e t o j a + r a v i t s e m u s t i l a + r a v i t s e m u s t o t t u m u k s i s t a + r a v i t s e m u s t o t t u m u s t e n + r a v i t s e m u s v ä i t t e e t + r a v i t s e m u s v ä i t t e i d e n + r a v i t s e m u s v ä i t t e i s i i n + r a v i t s e m u s v ä i t t e i t ä + r a v i t s e m u s v ä i t t ä m i e n + r a v i t s e m u s v ä i t t ä m i ä + r a v i t s e v a m p a a + r a v i t s e v a n + r a v i u r h e i l u + r a v i v e t o + r a v u n s y ö j ä k e t t u + r e a a l i a i k a i n e n + r e a a l i a i k a i s e l l e + r e a a l i a i k a i s e n + r e a a l i a i k a i s e s s a + r e a a l i a i k a i s e s t a + r e a a l i a i k a i s e s t i + r e a a l i a i k a i s e t + r e a a l i a i k a i s i a + r e a a l i a i k a i s t a + r e a a l i a i k a i s t e n + r e a a l i a j a s s a + r e a a l i a n s i o i d e n + r e a a l i a r v o + r e a a l i a r v o a + r e a a l i a r v o i s s a + r e a a l i a r v o n + r e a a l i h i n n a t + r e a a l i h i n t a + r e a a l i h i n t o j e n + r e a a l i h y v i n v o i n n i n + r e a a l i k a p i t a l i s m i + r e a a l i k a s v u + r e a a l i k a s v u a + r e a a l i k a s v u s t a + r e a a l i k o r k o + r e a a l i k o r k o j e n + r e a a l i k o r o t + r e a a l i k o r o t u s t a + r e a a l i k u s t a n n u k s i i n + r e a a l i k u s t a n n u s t e n + r e a a l i l u k u + r e a a l i l u k u j o u k k o + r e a a l i m a a i l m a s s a + r e a a l i m a r k k i n o i d e n + r e a a l i o m a i s u u d e s t a + r e a a l i p a l k a t + r e a a l i p a l k k a + r e a a l i p a l k k o i h i n + r e a a l i p a l k k o j a + r e a a l i p a l k k o j e n + r e a a l i p o l i t i i k a n + r e a a l i p o l i t i i k k a + r e a a l i p o l i t i i k k a a + r e a a l i p o l i t i i k k a m o t i i v i a + r e a a l i r a h o i t u k s e n + r e a a l i s e n + r e a a l i s e s t i + r e a a l i s o s i a l i s m i + r e a a l i s o s i a l i s m i a + r e a a l i s o s i a l i s m i m a i s s a + r e a a l i s o s i a l i s m i n + r e a a l i t a l o u d e k s i + r e a a l i t a l o u d e l l e + r e a a l i t a l o u d e l l i n e n + r e a a l i t a l o u d e l l i s e t + r e a a l i t a l o u d e l t a + r e a a l i t a l o u d e n + r e a a l i t a l o u d e s s a + r e a a l i t a l o u d e s s a k i n + r e a a l i t a l o u d e s s a m m e + r e a a l i t a l o u d e s t a + r e a a l i t a l o u d e t + r e a a l i t a l o u k s i l l e + r e a a l i t a l o u s + r e a a l i t a l o u s a l a n + r e a a l i t a l o u t e e n + r e a a l i t a l o u t e m m e + r e a a l i t a l o u t t a + r e a a l i t o d e l l i s u u d e s s a + r e a a l i t u l o j a + r e a a l i t u l o j e n + r e a a l i t u l o t + r e a a l i t u o t a n n o l l a + r e a a l i t u o t a n n o l l e + r e a a l i t u o t a n n o n + r e a a l i u n i o n i + r e a a l i v a k a u t t a m i s e n + r e a g o i d a + r e a g o i d a a n + r e a g o i d a k s e e n + r e a g o i k a a m m e + r e a g o i k i n + r e a g o i m a a n + r e a g o i m a t t a + r e a g o i n + r e a g o i n e e t + r e a g o i n n i n + r e a g o i n n i s t a + r e a g o i n t i a i k a + r e a g o i n t i a i k a a + r e a g o i n t i h i t a u s + r e a g o i n t i h i t a u t t a + r e a g o i n t i j ä r j e s t e l m ä + r e a g o i n t i j ä r j e s t e l m ä n + r e a g o i n t i j ä r j e s t e l m ä ä + r e a g o i n t i k e h y s t ä + r e a g o i n t i k y k y + r e a g o i n t i k y k y y m m e + r e a g o i n t i k y k y ä + r e a g o i n t i m a h d o l l i s u u d e t + r e a g o i n t i m e k a n i s m e i h i n + r e a g o i n t i m e k a n i s m e j a + r e a g o i n t i m e n e t e l m i ä + r e a g o i n t i n o p e u s + r e a g o i n t i s u u n n i t e l m a t + r e a g o i n t i s u u n n i t e l m i a + r e a g o i n t i t a p o j e n + r e a g o i n t i t a v o i s s a + r e a g o i n t i t a v o i s t a + r e a g o i n t i t o i m i s s a + r e a g o i n t i v a l m i u d e t + r e a g o i n t i v a l m i u k s i a + r e a g o i n t i v a l m i u k s i e n + r e a g o i n t i v a u h t i a a n + r e a g o i n t i v e r k o s t o o n + r e a g o i n t i v i r a n o m a i n e n + r e a g o i n u t + r e a g o i t a v a + r e a g o i t t e + r e a g o i v a t + r e a k t i i v i s e m p a a + r e a k t i i v i s e m p i a + r e a k t i i v i s e s t i + r e a k t i o a i k a + r e a k t i o a j a n + r e a k t i o a j a t + r e a k t i o i d e n + r e a k t i o i s t a + r e a k t i o i t a + r e a k t i o j ä r j e s t e l m i ä + r e a k t i o k e s k u s t a + r e a k t i o k o o r d i n a a t t i + r e a k t i o k y k y + r e a k t i o k y k y n s ä + r e a k t i o k y k y y n + r e a k t i o k y v y n + r e a k t i o l t a + r e a k t i o m e k a n i s m e j a + r e a k t i o m e k a n i s m i + r e a k t i o m o o t t o r i + r e a k t i o n n e + r e a k t i o n o p e u s + r e a k t i o s t a + r e a k t i o t + r e a k t i o y h t ä l ö + r e a k t o r e i d e n + r e a k t o r e i h i n + r e a k t o r e i t a + r e a k t o r i a + r e a k t o r i e n + r e a k t o r i l u o k a n + r e a k t o r i n s a + r e a k t o r i o n g e l m i s t a + r e a k t o r i o n n e t t o m u u k s i s t a + r e a k t o r i o n n e t t o m u u s + r e a k t o r i s u k u p o l v e t + r e a k t o r i s u o j a r a h a s t o + r e a k t o r i s u o j a r a h a s t o a + r e a k t o r i s u o j a r a h a s t o l l e + r e a k t o r i s u o j a r a h a s t o o n + r e a k t o r i s u o j a s u u n n i t e l m a n + r e a k t o r i s y d ä m e n + r e a k t o r i t + r e a k t o r i t e k n i i k o i l l a + r e a k t o r i t y y p p i e n + r e a k t o r i y k s i k k ö j e n + r e a k t o r i y k s i k ö i d e n + r e a k t o r i y k s i k ö t + r e a k t o r i y t i m e n + r e a l i s m i a + r e a l i s m i n + r e a l i s m i s s a + r e a l i s m i s t a + r e a l i s m i s t a n n e + r e a l i s t e j a + r e a l i s t i s e k s i + r e a l i s t i s e l l a + r e a l i s t i s e l t a + r e a l i s t i s e m m a k s i + r e a l i s t i s e m m a l t a + r e a l i s t i s e m m a n + r e a l i s t i s e m m a t + r e a l i s t i s e m m i k s i + r e a l i s t i s e m m i l l e + r e a l i s t i s e m m i n + r e a l i s t i s e m p a a + r e a l i s t i s e m p a a n + r e a l i s t i s e m p i + r e a l i s t i s e m p i a + r e a l i s t i s e m p i i n + r e a l i s t i s e n + r e a l i s t i s e s t a + r e a l i s t i s i a + r e a l i s t i s i i n + r e a l i s t i s i k s i + r e a l i s t i s i m m a l l e + r e a l i s t i s i n + r e a l i s t i s i n t a + r e a l i s t i s t a + r e a l i s t i s u u d e s t a + r e a l i t e e t i n + r e a l i t e e t i s t a + r e a l i t e e t i t + r e a l i t e e t t e i h i n + r e a l i t e e t t i e n + r e a l i t e e t t i p e r i a a t e + r e d a k t i o k r i t i i k k i + r e e s u s m a k a k i + r e f e r e n s s i j ä r j e s t e l m ä n + r e f e r e n s s i k e s k u s + r e f e r e n s s i p i s t e i t ä + r e f l e k s i k o t e l o + r e f l e k s i n o m a i n e n + r e f l e k s i n o m a i s e n a + r e f l e k s i n o m a i s e s t i + r e f l e k s i n o m a i s e t + r e f l e k s i n o m a i s t a + r e f l e k s i r a t a + r e f l u k s i t a u t i + r e f o r m i a j a n + r e f o r m i b a n k e t t i + r e f o r m i j u u t a l a i s u u s + r e f o r m i p o l i t i i k k a a n s a + r e f o r m i p u o l u e + r e f o r m i s t e i s t a + r e f o r m i s t i t + r e g a t t a m a l l i a + r e g a t t a p e r i a a t t e e n + r e g a t t a t e o r i a a n + r e g e n e r o i n t i s u o d a t i n + r e g r e s s i o a n a l y y s i + r e h d e i m m i s t ä + r e h e l l i s e m m i k s i + r e h e l l i s e m m ä t + r e h e l l i s e m p i + r e h e l l i s e m p i ä + r e h e l l i s e m p ä ä + r e h e l l i s e m p ä ä n + r e h e l l i s e n + r e h e l l i s e n ä + r e h e l l i s e s t ä + r e h e l l i s e t + r e h e l l i s i i n + r e h e l l i s i n + r e h e l l i s i n ä + r e h e l l i s i s t ä + r e h e l l i s i ä + r e h e l l i s t e n + r e h e l l i s t ä + r e h e l l i s y y d e l l ä + r e h e l l i s y y d e n + r e h e l l i s y y d e s t ä + r e h e l l i s y y s v e t o o m u k s e e n + r e h e l l i s y y t e e n + r e h e l l i s y y t t ä + r e h e n t e l e e + r e h e v ö i t y m i s e l t ä + r e h e v ö i t y m i s e n + r e h e v ö i t y m i s e s t ä + r e h e v ö i t y m i s o n g e l m a + r e h o t t a a + r e h o t t a m i s e n + r e h o t t a v a t + r e h t o r e i d e n + r e h t o r e i t a + r e h u a + r e h u a i n e e t + r e h u a i n e i d e n + r e h u a i n e i t a + r e h u a i n e s t e n + r e h u a l a + r e h u a l a l l a + r e h u a l a l l e + r e h u a l a n + r e h u a s e t u k s e n + r e h u a s i o i s t a + r e h u d i r e k t i i v i + r e h u h e r n e t t ä + r e h u h y g i e n i a + r e h u h y g i e n i a a + r e h u h y g i e n i a n + r e h u i h i n + r e h u i s s a + r e h u i s t a + r e h u j a + r e h u j a k i n + r e h u j a u h o i s s a + r e h u j e n + r e h u k a l a s t u s t a + r e h u k a s v e j a + r e h u k a s v i e n + r e h u k a t t a r a + r e h u k a u p a n + r e h u k a u p p i a a t + r e h u k e t j u + r e h u k e t j u s s a + r e h u k e t j u s t a + r e h u k e t j u u n + r e h u k o m i t e a + r e h u k s i + r e h u k u s t a n n u s t e n + r e h u k y s y m y s + r e h u k ä y t t ö ö n + r e h u l a i n s ä ä d ä n t ö + r e h u l a i n s ä ä d ä n t ö ä + r e h u l a i n s ä ä d ä n t ö ö n + r e h u l a k i + r e h u l i s ä a i n e i t a + r e h u l l a k i n + r e h u m a r k k i n o i d e n + r e h u m ä ä r i s t ä + r e h u m ä ä r i ä + r e h u m ä ä r ä ä + r e h u n + r e h u n a + r e h u n h i n n a n + r e h u n k ä s i t t e l y + r e h u n k ä y t t ä j i e n + r e h u n k ä y t t ö k i e l l o n + r e h u n k ä y t t ö k i e l t o + r e h u n k ä y t t ö k i e l t o a + r e h u n t u o t a n n o l l a + r e h u n t u o t a n n o n + r e h u n t u o t a n n o s s a + r e h u n t u o t a n n o s t a + r e h u n t u o t a n t o a l a n + r e h u n t u o t a n t o l a i t o k s i a + r e h u n t u o t a n t o l a i t o k s i l t a + r e h u n t u o t a n t o l a i t o k s i n a + r e h u n t u o t a n t o l a i t o s + r e h u n t u o t a n t o o n + r e h u n t u o t t a j a t + r e h u n t u o t t a j i e n + r e h u n t u o t t a j i l l e + r e h u n v a l m i s t a j a t + r e h u n v a l m i s t a j i a + r e h u n v a l m i s t a j i e n + r e h u n v a l m i s t a j i i n + r e h u n v a l m i s t a j i l l e + r e h u o h r a l t a + r e h u o h r a n + r e h u o i k e u k s i e n + r e h u o n g e l m a + r e h u p a l k o k a s v e j a + r e h u p a l k o k a s v i e n + r e h u p a l k o k a s v i t + r e h u p i n t a + r e h u p r o t e i i n i n + r e h u p r o t e i i n i s t a + r e h u p u l a + r e h u p u l a a + r e h u r a s v a a + r e h u r a s v a n + r e h u s e o k s e n + r e h u s e o k s e s s a + r e h u s e o k s e s t a + r e h u s e o k s e t + r e h u s e o k s i a + r e h u s e o k s i i n + r e h u s e o k s i l l a + r e h u s e o k s i l l e + r e h u s e o k s i s s a + r e h u s e o s t a + r e h u s e o s t e n + r e h u s i l p p u r i + r e h u s k a n d a a l i t + r e h u s o i j a n v i l j e l i j ö i d e n + r e h u s s a + r e h u s ä k e i s s ä + r e h u s ä k k i + r e h u s ä ä d ö k s e n + r e h u t + r e h u t e h d a s + r e h u t e h t a a l l e + r e h u t e h t a i d e n + r e h u t e h t a i s i i n + r e h u t e o l l i s u u d e l l e + r e h u t e o l l i s u u d e n + r e h u t e o l l i s u u d e s s a + r e h u t e o l l i s u u s + r e h u t e o l l i s u u t e e n + r e h u t e o l l i s u u t t a + r e h u t o i m i n t o j e n + r e h u t o n n i s t a + r e h u t u o t a n n o n + r e h u t u o t a n n o s s a + r e h u t u o t a n t o a + r e h u t u o t a n t o k e t j u n + r e h u t u o t a n t o k e t j u u n + r e h u t u o t t e e n + r e h u t u o t t e e t + r e h u t u o t t e i t a + r e h u t u r v a l l i s u u s + r e h u t u r v a l l i s u u t t a + r e h u u n + r e h u v a l k u a i s i a + r e h u v a l m i s t a j i e n + r e h u v a l m i s t e i l l e + r e h u v a l m i s t e i s s a + r e h u v a r a s t o j a + r e h u v a r a s t o j e n + r e h u v i l j a m a r k k i n o i t a + r e h u v i l j a n + r e h u v i l j a s s a + r e h u v i r n a + r e h u y h t i ö i s s ä + r e h u y r i t y k s e t + r e h u y r i t y k s i l l e + r e h u y r i t y k s i l l ä + r e h u y r i t y s t e n + r e i k i ä + r e i k ä j u u s t o + r e i k ä j u u s t o a + r e i k ä k o r t t i + r e i k ä k o r t t i k o n e + r e i k ä n a u h a + r e i k ä t a u t i + r e i l u a + r e i l u i n t a + r e i l u j a + r e i l u l l e + r e i l u m m a n + r e i l u m p a a + r e i l u n + r e i l u s t a + r e i l u t + r e i l u u n + r e i s i l a s k i m o + r e i s i l i h a s + r e i s i y h d y n t ä + r e i t e i l l ä + r e i t e i s t ä + r e i t i t y s p r o t o k o l l a + r e i t i t y s t a u l u + r e i t t e j ä + r e i t t i e n + r e i t t i j ä r j e s t e l m ä + r e i t t i k a r t a n + r e i t t i k a r t a t + r e i t t i k a r t t a a + r e i t t i k i l p a i l u n + r e i t t i l e n n o i s t a + r e i t t i l e n n o l l e + r e i t t i l e n n o n + r e i t t i l e n t o j a + r e i t t i l e n t o j e n + r e i t t i l e n t o y h t i ö t + r e i t t i m a k s u t + r e i t t i m u u t o k s e t + r e i t t i o p a s + r e i t t i p a k e t t i a + r e i t t i r a k e n t e e n + r e i t t i s u u n n i t t e l u o h j e l m i e n + r e i t t i t a k s i + r e i t t i v a i h t o e h t o o n + r e i t t i v a l v o n t a h a n k e + r e i t t i ä + r e k a n + r e k a n k u l j e t t a j a t + r e k i k o i r a + r e k i s t e r e i h i n + r e k i s t e r e i s s ä + r e k i s t e r e i t ä + r e k i s t e r i i n + r e k i s t e r i j ä r j e s t e l m ä + r e k i s t e r i j ä r j e s t e l m ä ä + r e k i s t e r i k e s k u s + r e k i s t e r i k i l p i + r e k i s t e r i k i l p i e n + r e k i s t e r i k i l p i i n + r e k i s t e r i k i l p i n u m e r o t a r k k a i l u + r e k i s t e r i k i l v e t + r e k i s t e r i k i l v i l l ä + r e k i s t e r i k i l v i s s ä + r e k i s t e r i m e r k e i s t ä + r e k i s t e r i n + r e k i s t e r i n p i t ä j i n ä + r e k i s t e r i n p i t ä j i ä + r e k i s t e r i n u m e r o + r e k i s t e r i n u m e r o a + r e k i s t e r i n u m e r o i d e n + r e k i s t e r i n v a i h t o a + r e k i s t e r i s e l o s t e + r e k i s t e r i s s ä + r e k i s t e r i t i e t o j e n + r e k i s t e r i t o n n i + r e k i s t e r i t u n n u s t a + r e k i s t e r i v a l v o n n a n + r e k i s t e r ö i d y i l l e + r e k i s t e r ö i d y i s t ä + r e k i s t e r ö i d y n + r e k i s t e r ö i n n i n + r e k i s t e r ö i n n i s t ä + r e k i s t e r ö i n t e j ä + r e k i s t e r ö i n t i a s i a k i r j a a n + r e k i s t e r ö i n t i a s i a k i r j a t + r e k i s t e r ö i n t i a s i a k i r j o i h i n + r e k i s t e r ö i n t i a s i a k i r j o i s t a + r e k i s t e r ö i n t i a s i a k i r j o j a + r e k i s t e r ö i n t i a s i a k i r j o j e n + r e k i s t e r ö i n t i h a k e m u s + r e k i s t e r ö i n t i h a k e m u s t a + r e k i s t e r ö i n t i j ä r j e s t e l m i e n + r e k i s t e r ö i n t i j ä r j e s t e l m i ä + r e k i s t e r ö i n t i j ä r j e s t e l m ä + r e k i s t e r ö i n t i j ä r j e s t e l m ä l l ä + r e k i s t e r ö i n t i j ä r j e s t e l m ä n + r e k i s t e r ö i n t i j ä r j e s t e l m ä t + r e k i s t e r ö i n t i j ä r j e s t e l m ä ä + r e k i s t e r ö i n t i j ä r j e s t e l m ä ä n + r e k i s t e r ö i n t i k a t s a s t u k s e e n + r e k i s t e r ö i n t i k a u d e n + r e k i s t e r ö i n t i k e h o t u k s e l l a + r e k i s t e r ö i n t i k e s k u k s i a + r e k i s t e r ö i n t i k o r t i s t a + r e k i s t e r ö i n t i k o r t t i + r e k i s t e r ö i n t i k u s t a n n u s t e n + r e k i s t e r ö i n t i l a i t t e i l l a + r e k i s t e r ö i n t i l a k i + r e k i s t e r ö i n t i l o m a k e t t a + r e k i s t e r ö i n t i l o m a k k e i s s a + r e k i s t e r ö i n t i l u e t t e l o + r e k i s t e r ö i n t i m a h d o l l i s u u k s i s t a + r e k i s t e r ö i n t i m a k s u + r e k i s t e r ö i n t i m a k s u a + r e k i s t e r ö i n t i m a k s u i s t a + r e k i s t e r ö i n t i m a k s u j a + r e k i s t e r ö i n t i m a k s u n + r e k i s t e r ö i n t i m a k s u t + r e k i s t e r ö i n t i m e n e t e l m i ä + r e k i s t e r ö i n t i m e n e t t e l y + r e k i s t e r ö i n t i m e n e t t e l y i h i n + r e k i s t e r ö i n t i m e n e t t e l y i s s ä + r e k i s t e r ö i n t i m e n e t t e l y j e n + r e k i s t e r ö i n t i m e n e t t e l y j ä + r e k i s t e r ö i n t i m e n e t t e l y k s i + r e k i s t e r ö i n t i m e n e t t e l y l l e + r e k i s t e r ö i n t i m e n e t t e l y n + r e k i s t e r ö i n t i m e n e t t e l y n ä + r e k i s t e r ö i n t i m e n e t t e l y s t ä + r e k i s t e r ö i n t i m e n e t t e l y t + r e k i s t e r ö i n t i m e n e t t e l y y n + r e k i s t e r ö i n t i m e n e t t e l y ä + r e k i s t e r ö i n t i m u o d o l l i s u u k s i e n + r e k i s t e r ö i n t i m u o t o j a + r e k i s t e r ö i n t i n u m e r o i s t a + r e k i s t e r ö i n t i o h j e l m a + r e k i s t e r ö i n t i o n g e l m a + r e k i s t e r ö i n t i p a i k a s t a + r e k i s t e r ö i n t i p a k e t i s t a + r e k i s t e r ö i n t i p e r i a a t t e e n a + r e k i s t e r ö i n t i p e r i a a t t e i d e n + r e k i s t e r ö i n t i p o l i t i i k a n + r e k i s t e r ö i n t i p o l i t i i k k a a + r e k i s t e r ö i n t i p r o s e s s e j a + r e k i s t e r ö i n t i p r o s e s s i + r e k i s t e r ö i n t i p r o s e s s i a + r e k i s t e r ö i n t i p r o s e s s i n + r e k i s t e r ö i n t i p r o s e s s i s t a + r e k i s t e r ö i n t i s a t a m a n + r e k i s t e r ö i n t i s u u n n i t e l m a + r e k i s t e r ö i n t i t i e t o i h i n + r e k i s t e r ö i n t i t i e t o j e n + r e k i s t e r ö i n t i t o d i s t u k s i a + r e k i s t e r ö i n t i t o d i s t u k s i s t a + r e k i s t e r ö i n t i t o d i s t u s t a + r e k i s t e r ö i n t i t o d i s t u s t e n + r e k i s t e r ö i n t i t o i m e t + r e k i s t e r ö i n t i t o i m i s t o n + r e k i s t e r ö i n t i t o i m i s t o o n + r e k i s t e r ö i n t i v a a t i m u k s e t + r e k i s t e r ö i n t i v a a t i m u k s i a + r e k i s t e r ö i n t i v a a t i m u s + r e k i s t e r ö i n t i v a i h e + r e k i s t e r ö i n t i v a i h e e s s a + r e k i s t e r ö i n t i v a l t i o i d e n + r e k i s t e r ö i n t i v a l t i o n + r e k i s t e r ö i n t i v a l t i o t a + r e k i s t e r ö i n t i v e l v o i t e + r e k i s t e r ö i n t i v e l v o i t t e e n + r e k i s t e r ö i n t i v e l v o l l i s u u s + r e k i s t e r ö i n t i v e r k o s t o n + r e k i s t e r ö i n t i v e r o + r e k i s t e r ö i n t i v e r o a + r e k i s t e r ö i n t i v e r o i s t a + r e k i s t e r ö i n t i v e r o j a + r e k i s t e r ö i n t i v e r o j e n + r e k i s t e r ö i n t i v e r o j ä r j e s t e l m ä s s ä + r e k i s t e r ö i n t i v e r o k a n t o j a + r e k i s t e r ö i n t i v e r o l l a + r e k i s t e r ö i n t i v e r o n + r e k i s t e r ö i n t i v e r o o n + r e k i s t e r ö i n t i v e r o s s a + r e k i s t e r ö i n t i v e r o s t a + r e k i s t e r ö i n t i v e r o t + r e k i s t e r ö i n t i v e r o v e r o n + r e k i s t e r ö i n t i v i r a n o m a i n e n + r e k i s t e r ö i n t i v i r a n o m a i s e n + r e k i s t e r ö i n t i v i r a n o m a i s i a + r e k i s t e r ö i n t i v i r a n o m a i s t e n + r e k i s t e r ö i n t i v i r a s t o i l l e + r e k i s t e r ö i n t i v i r a s t o j e n + r e k i s t e r ö i n t i v ä l i n e e n + r e k i s t e r ö i n t i y k s i k ö i d e n + r e k i s t e r ö i n t i ä + r e k i s t e r ö i t i i n + r e k i s t e r ö i t y j e n + r e k i s t e r ö i t y j ä + r e k i s t e r ö i t y m i s j ä r j e s t e l y j ä + r e k i s t e r ö i t y m i s k y n n y s t ä + r e k i s t e r ö i t y m i s l u e t t e l o n + r e k i s t e r ö i t y m i s l u v a n + r e k i s t e r ö i t y m i s m e n e t t e l y j e n + r e k i s t e r ö i t y m i s t ä + r e k i s t e r ö i t y m i s v a a t i m u k s i a + r e k i s t e r ö i t y m i s v e l v o l l i s u u s + r e k i s t e r ö i t ä v ä ä n + r e k k a d i r e k t i i v i e n + r e k k a j o n o i s t a k i n + r e k k a k u l j e t u s t e n + r e k k a k u s k e j a + r e k k a k u s k i + r e k k a k u s k i e m m e + r e k k a k u s k i e n + r e k k a k u s k i l t a + r e k k a k u s k i t + r e k k a l a k k o + r e k k a l i i k e n n e + r e k k a l i i k e n t e e s t ä + r e k k a l u o k i t u k s e n + r e k k a r e i t e i l l ä + r e k k a s a a t t u e i t a + r e k k a s u l u s t a + r e k k o j a + r e k l a m a a t i o a i k a a + r e k o n s t r u o i t a v a + r e k r y t o i d a + r e k r y t o i d a a n + r e k r y t o i n n i n + r e k r y t o i n n i n v a s t a i s t a + r e k r y t o i n n i s s a + r e k r y t o i n t i a s i a s s a + r e k r y t o i n t i a s i o i s t a + r e k r y t o i n t i j ä r j e s t e l m i ä + r e k r y t o i n t i k e r s a n t t i + r e k r y t o i n t i k i l p a i l u n + r e k r y t o i n t i k o k e m u k s e e n + r e k r y t o i n t i k ä y t ä n t ö ä + r e k r y t o i n t i m e n e t e l m i s t ä + r e k r y t o i n t i m e n e t e l m i ä + r e k r y t o i n t i m e n e t e l m i ä ä n + r e k r y t o i n t i m e n e t t e l y i s s ä + r e k r y t o i n t i m e n e t t e l y j e n + r e k r y t o i n t i m e n e t t e l y j ä + r e k r y t o i n t i m e n e t t e l y n + r e k r y t o i n t i m e n e t t e l y s s ä + r e k r y t o i n t i m e n e t t e l y t + r e k r y t o i n t i m e n e t t e l y ä + r e k r y t o i n t i m u o d o i s t a + r e k r y t o i n t i m ä ä r ä y k s i s t ä + r e k r y t o i n t i p o l i t i i k a n + r e k r y t o i n t i p o l i t i i k k a + r e k r y t o i n t i p o l i t i i k k a a + r e k r y t o i n t i p o l i t i i k k a a n s a + r e k r y t o i n t i p r o s e s s i + r e k r y t o i n t i t a p a + r e k r y t o i n t i t a p o j a + r e k r y t o i n t i t o i m i a + r e k r y t o i n t i t o i m i e n + r e k r y t o i n t i t o i m i n t a + r e k r y t o i n t i t o i m i s t o + r e k r y t o i n t i t o i m i s t o a + r e k r y t o i n t i t o i m i s t o j e n + r e k r y t o i n t i t o i m i s t o n + r e k r y t o i n t i v a i k e u k s i i n + r e k r y t o i n t i v i r a s t o s t a + r e k r y t o i t a v a + r e k r y t o i v a t + r e l a a t i o e s t e t i i k k a + r e l a t i i v i l a u s e + r e l e t u l k k a u s t a + r e m a s t e r o i t u i n a + r e m a s t e r o i t u n a + r e m o n t t i h a n k k e i s i i n + r e m o n t t i l a i n a t + r e m o n t t i l a i n o i h i n + r e m o n t t i r y h m ä + r e n d e r o i n t i y r i t y s t e n + r e n e s s a n s s i f i l o s o f i a + r e n e s s a n s s i k u n i n g a s k u n n a t + r e n e s s a n s s i s ä v e l t ä j i s t ä + r e n g a s a l a n + r e n g a s e v ä t o k k o + r e n g a s g a l a k s i + r e n g a s k e t j u t + r e n g a s k o k k i + r e n g a s k r o m o s o m i + r e n g a s l u k k o + r e n g a s m a r k k i n o i d e n + r e n g a s m a r k k i n o i l l a + r e n g a s m e l u a + r e n g a s m e l u n + r e n g a s m e l u s t a + r e n g a s m e r k i n n ä t + r e n g a s m u r e e n a + r e n g a s m ä d ä s t ä + r e n g a s n o k k a l o k k i + r e n g a s n o k k a t i i r a + r e n g a s p a i n e e n + r e n g a s p a i n e i d e n + r e n g a s p a i n e i s t a + r e n g a s p a i n e m i t t a r e i t a + r e n g a s p a i n e m i t t a r i t + r e n g a s p a l l o k a l a + r e n g a s p u s k u r i + r e n g a s r o k o t t a m i s t a + r e n g a s s a l a m a + r e n g a s s i i p i s i m p p u + r e n g a s t e h d a s + r e n g a s t e h t a a s e e n + r e n g a s t e k n o l o g i a n + r e n g a s t e o l l i s u u d e l l e + r e n g a s t e o l l i s u u d e n + r e n g a s t e o l l i s u u s + r e n g a s t e o l l i s u u t t a + r e n g a s t u o t t a j a + r e n g a s t y y p i s t ä + r e n g a s t y y p p i e n + r e n g a s v a l m i s t a j a l l e + r e n g a s v a l m i s t a j i e n + r e n g a s v a l m u s k a + r e n g a s v a r a s t o j e n + r e n i u m t r i o k s i d i + r e n k a a t + r e n k a i d e n + r e n k a i s t a + r e n k a i t a + r e n n o m m i n + r e n n o m p a a n + r e n t o u t u a + r e n t o u t u m i s p a i k k o j a + r e p e ä m i ä + r e p i i + r e p i v ä t + r e p i ä + r e p l i k a a s i + r e p u b l i k a a n i e n e m m i s t ö i n e n + r e p u b l i k a a n i e n e m m i s t ö i s e n + r e p u b l i k a a n i e n e m m i s t ö l l e + r e p u b l i k a a n i e n e m m i s t ö l l ä + r e p u b l i k a a n i e n e m m i s t ö n + r e p u b l i k a a n i h a l l i n n o n + r e p u b l i k a a n i h a l l i n t o + r e p u b l i k a a n i p u o l u e e n + r e p u b l i k a a n i r o i s t o j a + r e p u b l i k a a n i r o i s t o j e n + r e s e p t e j ä ä n + r e s e p t i l l ä + r e s e p t i l t ä + r e s e p t i l ä ä k k e i d e n + r e s e p t i l ä ä k k e i l l e + r e s e p t i l ä ä k k e i s i i n + r e s e p t i l ä ä k k e i s t ä + r e s e p t i l ä ä k k e i t ä + r e s e p t i n ä + r e s e p t i o e s t e t i i k k a + r e s e p t i ä + r e s e r v i l e n t o k o n e i t a + r e s e r v i n u p s e e r i + r e s e r v i r i n t a m a + r e s e r v i u p s e e r i k o u l u + r e s e r v i v a l u u t t a + r e s e r v i v a l u u t t a n a + r e s e r v i y k s i k k ö ä + r e s e r v i ä + r e s i s t a n s s i m a r k k e r i t + r e s i s t e n s s i j a l o s t u k s e s t a + r e s i s t e n s s i m a r k k e r e i t a + r e s i s t e n s s i ä + r e s o n a a t t o r i k i t a r a + r e s t a u r a a t i o a i k a n a + r e s t a u r o i n t i t e k n o l o g i a a + r e s u r s s e i h i n + r e s u r s s e i l l a + r e s u r s s e i s t a + r e s u r s s e j a + r e s u r s s e j a a n + r e s u r s s i e n + r e s u r s s i e n h a l l i n n a n + r e s u r s s i e n h a l l i n t a a + r e s u r s s i e n h a l l i n t a p ä ä t ö k s e t + r e s u r s s i e n h o i t o p o l i t i i k a n + r e s u r s s i e n j a k o + r e s u r s s i e n j a k o a + r e s u r s s i j ä r j e s t e l m ä + r e s u r s s i k e s k u k s e n + r e s u r s s i k e s k u k s e t + r e s u r s s i k e s k u s + r e s u r s s i k e s k u s t e l u i s s a + r e s u r s s i k u s t a n n u k s e t + r e s u r s s i k u s t a n n u k s i a + r e s u r s s i k y s y m y k s e e n + r e s u r s s i k y s y m y s + r e s u r s s i l i s ä y k s e n + r e s u r s s i m m e + r e s u r s s i n h a l l i n t a + r e s u r s s i o n g e l m a n + r e s u r s s i p o h j a i n e n + r e s u r s s i p u l a + r e s u r s s i p u l a a + r e s u r s s i p u l a a n + r e s u r s s i p u l a l t a + r e s u r s s i s u u n n i t t e l u j ä r j e s t e l m ä + r e s u r s s i t + r e s u r s s i t a r p e i t a + r e s u r s s i t e h o k a s + r e s u r s s i t e h o k a s t a + r e s u r s s i t e h o k k a a m m a n + r e s u r s s i t e h o k k a a n + r e s u r s s i t e h o k k a a s e e n + r e s u r s s i t e h o k k a i t a + r e s u r s s i t e h o k k u u d e n + r e s u r s s i t e h o k k u u d e s t a + r e s u r s s i t e h o k k u u s + r e s u r s s i t e h o k k u u s o h j e l m a + r e s u r s s i t e h o k k u u t e e n + r e s u r s s i t e h o k k u u t t a + r e s u r s s i t i e d o i s s a + r e s u r s s i t u o t t a v u u t t a + r e s u r s s i v i r t o j e n + r e t i k k a v a l m u s k a + r e t k e i l y m a j a l i i t t o j e n + r e t k e i l y m a j a s s a + r e t k e i l y t u o t t e e t + r e t k i k u n n a n + r e t o r i i k a n + r e t o r i i k a s t a + r e t o r i i k k a a + r e t o r i s e k s i + r e t o r i s e t + r e t o r i s i a + r e t o r i s i k s i + r e t r i i t t i t y y p p i s i ä + r e t r o v i r u s h o i d o n + r e t r o v i r u s l ä ä k k e i t ä + r e u m a f a k t o r i + r e u m a s a i r a u d e t + r e u m a s a i r a u k s i a + r e u n a a + r e u n a e h d o i s t a + r e u n a e h d o t + r e u n a e h t o i h i n + r e u n a e h t o j a + r e u n a e h t o j e n + r e u n a e l o s t a + r e u n a h u o m a u t u s t a + r e u n a i l m i ö + r e u n a j ä s e n v a l t i o i d e n + r e u n a m a i h i n + r e u n a n t u n n i s t u s + r e u n a r y h m ä k s i + r e u n a v a i k u t u s + r e u n a v a l t i o i d e n + r e u n a v a l t i o t + r e u n u s k i l p i k o n n a + r e u n u s p i e t a r y r t t i + r e u n u s t ä p l ä m i t t a r i + r e v a n s s i p y r k i m y k s i ä ä n + r e v i i r i s o d a t + r e v i s i o n i s t i s i a + r e v i s i o n i s t i s t a + r e v i t ä ä n + r e v o l v e r i i n s a + r e v o n n e n ä + r e v o n s a r a + r i e h u i + r i e h u m i s t a + r i e k a l e i n a + r i e m u i s s a a n + r i e m u k o h t a u k s i a + r i e m u k u p l a + r i e m u l o m a + r i e m u u n + r i e m u v o i t t o n a + r i e m u v u o d e n + r i e n t ä ä + r i e s a n a + r i e s a n a n i + r i h m a b a r b i + r i h m a t u r s k a + r i i d a n + r i i d a n a l a i s i n + r i i d a n k y l v ä j ä + r i i d a n r a t k a i s u + r i i d a n r a t k a i s u a + r i i d a n r a t k a i s u e l i m e n + r i i d a n r a t k a i s u j ä r j e s t e l m ä + r i i d a n r a t k a i s u j ä r j e s t e l m ä n + r i i d a n r a t k a i s u k e i n o + r i i d a n r a t k a i s u m e k a n i s m i a + r i i d a n r a t k a i s u m e k a n i s m i n a + r i i d a n r a t k a i s u m e n e t e l m ä + r i i d a n r a t k a i s u m e n e t e l m ä t + r i i d a n r a t k a i s u m e n e t t e l y + r i i d a n r a t k a i s u m e n e t t e l y i s s ä + r i i d a n r a t k a i s u m e n e t t e l y j e n + r i i d a n r a t k a i s u m e n e t t e l y j ä + r i i d a n r a t k a i s u m e n e t t e l y n + r i i d a n r a t k a i s u m e n e t t e l y y n + r i i d a n r a t k a i s u m e n e t t e l y ä + r i i d a n r a t k a i s u p a n e e l i n + r i i d a n r a t k a i s u s t a + r i i d a n r a t k a i s u v e r k k o a + r i i d a t + r i i d e l l ä + r i i d e l l ä ä n + r i i d o i s t a + r i i g i k o g u n + r i i k i n k u k k o k o l i b r i + r i i k i n k u k k o r a u s k u + r i i m u v e r k k o j a + r i i m u v e r k k o j e n + r i i p a i s e v a t + r i i p a i s e v i a + r i i p i m i s e e n + r i i p p a k e l t a s a l a v a + r i i p p a s a r a + r i i p p u m a t o n t a + r i i p p u m a t t o m a l l a + r i i p p u m a t t o m a m m a n + r i i p p u m a t t o m a m p a a + r i i p p u m a t t o m a m p i + r i i p p u m a t t o m a m p i a + r i i p p u m a t t o m a n + r i i p p u m a t t o m a n a + r i i p p u m a t t o m a s s a + r i i p p u m a t t o m a t + r i i p p u m a t t o m i a + r i i p p u m a t t o m i e n + r i i p p u m a t t o m i k s i + r i i p p u m a t t o m i l l e + r i i p p u m a t t o m i l t a + r i i p p u m a t t o m i m m a l l e k i n + r i i p p u m a t t o m i m m i s t a + r i i p p u m a t t o m i n a + r i i p p u m a t t o m i s s a + r i i p p u m a t t o m i s t a + r i i p p u m a t t o m u u d e n + r i i p p u m a t t o m u u d e s t a + r i i p p u m a t t o m u u d e s t a m m e + r i i p p u m a t t o m u u s a s t e + r i i p p u m a t t o m u u s k y s y m y s + r i i p p u m a t t o m u u s p e r i a a t e + r i i p p u m a t t o m u u s p y r k i m y k s i i n + r i i p p u m a t t o m u u s p y r k i m y k s i s t ä ä n + r i i p p u m a t t o m u u s s t r a t e g i a n + r i i p p u m a t t o m u u s s ä ä n n ö t + r i i p p u m a t t o m u u s v a a t i m u k s e t + r i i p p u m a t t o m u u s v e l v o i t t e i n e e n + r i i p p u m a t t o m u u t e e n + r i i p p u m a t t o m u u t t a + r i i p p u s i l t a a n + r i i p p u u + r i i p p u v a i s e k s i + r i i p p u v a i s e m m i k s i + r i i p p u v a i s e m p i + r i i p p u v a i s e m p i a + r i i p p u v a i s e t + r i i p p u v a i s i a + r i i p p u v a i s i k s i + r i i p p u v a i s i l l e + r i i p p u v a i s i m m i l l a + r i i p p u v a i s i m p i a + r i i p p u v a i s i n a + r i i p p u v a i s k ä y t t ä j i i n + r i i p p u v a i s t a + r i i p p u v a i s t e n + r i i p p u v a i s u u s p o l i t i i k k a a + r i i p p u v u u d e n + r i i p p u v u u s a s e m a a n + r i i p p u v u u s k y s y m y k s e s t ä + r i i p p u v u u s o n g e l m a + r i i p p u v u u s o n g e l m i i n + r i i p p u v u u s r i s k i + r i i p p u v u u s s u h t e e s s a + r i i p p u v u u s s u h t e e t + r i i p p u v u u s s u h t e i s i i n + r i i p p u v u u s s y n d r o o m a a + r i i p p u v u u s t a s o + r i i p p u v u u s t i l a n n e + r i i p p u v u u s t y y p e i s s ä + r i i p p u v u u t e m m e + r i i p p u v u u t t a + r i i p p u v u u t t a a n + r i i p p u v u u t t a m m e + r i i p u t t a v a + r i i s i a l a + r i i s i a l a l l a + r i i s i a l a n + r i i s i a l a s t a + r i i s i k a u p a n + r i i s i k i r v i n e n + r i i s i k o n f l i k t i + r i i s i k u t o j a + r i i s i l a j i k e + r i i s i l a j i k k e i t a + r i i s i m a i n a + r i i s i m a r k k i n o i d e n + r i i s i m a r k k i n o i l l a + r i i s i m e l l a k a t + r i i s i m ä ä r ä + r i i s i n + r i i s i n s i e m e n t e n + r i i s i n t u o t a n n o n + r i i s i n t u o t a n t o a + r i i s i n t u o t a n t o a l u e + r i i s i n t u o t t a j a + r i i s i n t u o t t a j i a + r i i s i n v i e j ä + r i i s i n v i l j e l i j ä m m e + r i i s i n v i l j e l m i ä + r i i s i n v i l j e l y y n + r i i s i p a n k i n + r i i s i p e i p p o + r i i s i s a v a n n i k i u r u + r i i s i s e k t o r i + r i i s i s e k t o r i a + r i i s i s e k t o r i l l a + r i i s i s e k t o r i n + r i i s i s i i r a p i l l a + r i i s i s ä k k e j ä + r i i s i t i l a n n e t t a + r i i s i t o r i + r i i s i t u o t a n n o l l a + r i i s i v a i n i o r o t t a + r i i s i v i l j e l m i l l ä + r i i s i v i l j e l m i ä ä n + r i i s i v i l j e l m ä t + r i i s i v u o r t e n + r i i s i ä + r i i s t a a + r i i s t a e l ä i m i ä + r i i s t a e l ä i n l a j i t + r i i s t a k s i + r i i s t a n h o i d o n + r i i s t a n h o i t o o n + r i i s t e t t ä i s i i n + r i i s t o a + r i i s t o h i n n o i l l a + r i i s t o h i n n o i n + r i i s t o h i n t o i h i n + r i i s t o h i n t o j e n + r i i s t o h y ö d y n t ä m i n e n + r i i s t o j ä r j e s t e l m ä l l e + r i i s t o j ä r j e s t e l m ä l l ä + r i i s t o j ä r j e s t e l m ä n + r i i s t o j ä r j e s t e l m ä s s ä + r i i s t o j ä r j e s t e l m ä ä + r i i s t o k a p i t a l i s m i a + r i i s t o k a p i t a l i s t i s t a + r i i s t o k ä y t ä n t ö + r i i s t o m a h d o l l i s u u k s i a + r i i s t o p o l i t i i k k a a + r i i s t o s o t i a + r i i s t o t o i m i n t a + r i i s t o t y ö t ä + r i i s t ä j i e n + r i i s t ä m ä ä n + r i i s t ä ä k s e e n + r i i s u k a a m m e + r i i s u u + r i i s u u t u m a a n + r i i t a a + r i i t a j u t t u + r i i t a m e n e t t e l y n + r i i t a n s a + r i i t a o i k e u d e n k ä y n t i e n + r i i t a s o i n t u + r i i t a t a p a u k s e e n + r i i t a t a p a u k s e s s a + r i i t a t a p a u k s i a + r i i t a t a p a u k s i s s a + r i i t a t i l a n t e i d e n + r i i t a t i l a n t e i s s a + r i i t a u t t a a + r i i t a u t t a m a t t o m i a + r i i t e l e m ä ä n + r i i t o i h i n + r i i t o j a + r i i t o j e n + r i i t o j e n r a t k a i s u + r i i t o j e n r a t k a i s u a + r i i t o j e n r a t k a i s u e l i m e e n + r i i t o j e n r a t k a i s u e l i m e n + r i i t o j e n r a t k a i s u e l i m e n s ä + r i i t o j e n r a t k a i s u e l i m e s s ä + r i i t o j e n r a t k a i s u e l i m e s t ä + r i i t o j e n r a t k a i s u e l i m i l l e + r i i t o j e n r a t k a i s u e l i m i s t ä + r i i t o j e n r a t k a i s u e l i n + r i i t o j e n r a t k a i s u j ä r j e s t e l m i e n + r i i t o j e n r a t k a i s u j ä r j e s t e l m i i n + r i i t o j e n r a t k a i s u j ä r j e s t e l m ä + r i i t o j e n r a t k a i s u j ä r j e s t e l m ä n + r i i t o j e n r a t k a i s u j ä r j e s t e l m ä s s ä + r i i t o j e n r a t k a i s u j ä r j e s t e l m ä ä n + r i i t o j e n r a t k a i s u k e i n o j e n + r i i t o j e n r a t k a i s u l a u t a k u n t a + r i i t o j e n r a t k a i s u m e k a n i s m e j a + r i i t o j e n r a t k a i s u m e k a n i s m i + r i i t o j e n r a t k a i s u m e k a n i s m i a + r i i t o j e n r a t k a i s u m e k a n i s m i n + r i i t o j e n r a t k a i s u m e k a n i s m i t + r i i t o j e n r a t k a i s u m e n e t e l m i ä + r i i t o j e n r a t k a i s u m e n e t e l m ä + r i i t o j e n r a t k a i s u m e n e t e l m ä n + r i i t o j e n r a t k a i s u m e n e t e l m ä t + r i i t o j e n r a t k a i s u m e n e t t e l y + r i i t o j e n r a t k a i s u m e n e t t e l y i h i n + r i i t o j e n r a t k a i s u m e n e t t e l y i s t ä + r i i t o j e n r a t k a i s u m e n e t t e l y j e n + r i i t o j e n r a t k a i s u m e n e t t e l y j ä + r i i t o j e n r a t k a i s u m e n e t t e l y l l ä + r i i t o j e n r a t k a i s u m e n e t t e l y n + r i i t o j e n r a t k a i s u m e n e t t e l y s s ä + r i i t o j e n r a t k a i s u m e n e t t e l y s t ä + r i i t o j e n r a t k a i s u m e n e t t e l y t + r i i t o j e n r a t k a i s u m e n e t t e l y y n + r i i t o j e n r a t k a i s u m e n e t t e l y ä + r i i t o j e n r a t k a i s u m ä ä r ä y k s i l l ä + r i i t o j e n r a t k a i s u n + r i i t o j e n r a t k a i s u p a n e e l i + r i i t o j e n r a t k a i s u p a n e e l i i n + r i i t o j e n r a t k a i s u p r o s e s s i i n + r i i t o j e n r a t k a i s u s t a + r i i t o j e n r a t k a i s u t o i m e n p i t e e t + r i i t o j e n r a t k a i s u u n + r i i t o j e n r a t k a i s u v ä l i n e + r i i t t i k i i s t a + r i i t t ä i s i + r i i t t ä i s i k ö + r i i t t ä k ö ö n + r i i t t ä m i n e n + r i i t t ä m ä t t ö m i e n + r i i t t ä m ä t t ö m i l t ä + r i i t t ä m ä t t ö m i n ä + r i i t t ä m ä t t ö m i ä + r i i t t ä m ä t t ö m ä k s i + r i i t t ä m ä t t ö m ä l l ä + r i i t t ä m ä t t ö m ä n + r i i t t ä m ä t t ö m ä n ä + r i i t t ä m ä t t ö m ä s t ä + r i i t t ä m ä t t ö m ä t + r i i t t ä m ä t ö n t ä + r i i t t ä m ä ä n + r i i t t ä n e e + r i i t t ä n e e t + r i i t t ä n y t + r i i t t ä v i e n + r i i t t ä v i k s i + r i i t t ä v i l l ä + r i i t t ä v i l t ä + r i i t t ä v i n ä + r i i t t ä v i s t ä + r i i t t ä v i ä + r i i t t ä v y y d e n + r i i t t ä v y y d e s t ä + r i i t t ä v y y s a r v i o i n t i + r i i t t ä v y y s s y i s t ä + r i i t t ä v y y t t ä + r i i t t ä v ä k s i + r i i t t ä v ä l l ä + r i i t t ä v ä n + r i i t t ä v ä n ä + r i i t t ä v ä s s ä + r i i t t ä v ä s t ä + r i i t t ä v ä t + r i i t t ä v ä t k ö + r i i t t ä v ä ä + r i i t t ä v ä ä n + r i i t t ä ä + r i i t t ä ä k ö + r i i t ä k ä ä n + r i i v a a m a + r i k a s t a m i s e n + r i k a s t a m i s e s t a + r i k a s t a m i s l a i t o k s e n + r i k a s t a m i s o h j e l m a + r i k a s t a m i s o h j e l m a a + r i k a s t a m i s o h j e l m a a n s a + r i k a s t a m i s o h j e l m a n + r i k a s t a m i s o h j e l m i n e e n + r i k a s t a m i s t a r k o i t u k s e s s a + r i k a s t a m i s t e k n i i k k a a + r i k a s t a m i s t o i m e n s a + r i k a s t a m i s t o i m e t + r i k a s t a v a a n + r i k a s t e t t a v a + r i k a s t u a + r i k a s t u m a a n + r i k a s t u m i n e n + r i k a s t u m i s e e n + r i k a s t u m i s e n + r i k a s t u m i s e n s a + r i k a s t u m i s e s t a + r i k a s t u m i s o h j e l m i a + r i k a s t u m i s o h j e l m i s s a + r i k a s t u m i s p r o s e s s i + r i k a s t u m i s p r o s e s s i e n + r i k a s t u m i s t a + r i k a s t u m i s t a a n + r i k a s t u n e e t + r i k a s t u n u t + r i k a s t u s j ä t e a l l a s + r i k a s t u s j ä t e a l t a a n + r i k a s t u s j ä t e a l t a i t a + r i k a s t u s l a i t o k s i i n + r i k a s t u s l a i t o k s i s t a + r i k a s t u s l a i t o s + r i k a s t u s m e n e t e l m i ä + r i k a s t u s p r o s e s s i s t a + r i k a s t u t a a n + r i k a s t u t t a a + r i k a s t u t t a a k s e e n + r i k a s t u t t a m i s e s t a + r i k a s t u t t a m i s t o i m i s t a a n + r i k a s t u t t a n e e t + r i k a s t u t t a n u t + r i k a s t u t t a v a a + r i k a s t u u + r i k a s t u v a n + r i k a s t u v a t + r i k e o i k e u d e n k ä y n t e j ä + r i k i n + r i k i n p o i s t o m e n e t t e l y t + r i k i n p o i s t o y k s i k ö i s s ä + r i k k a a m m a t + r i k k a a m m i l l e + r i k k a a m m i l t a + r i k k a a m p i a + r i k k a a m p i e n + r i k k a a m p i i n + r i k k a a m p i n a + r i k k a a s e e n + r i k k a a t + r i k k a i d e n + r i k k a i l l a + r i k k a i l l e k i n + r i k k a i l t a + r i k k a i m m a s t a + r i k k a i m m a t + r i k k a i m m a t k i n + r i k k a i m m i l l e + r i k k a i m m i s s a + r i k k a i m m i s t a + r i k k a i m p i a + r i k k a i m p i e n + r i k k a i m p i i n + r i k k a i n a + r i k k a i s i i n + r i k k a i s s a + r i k k a i s t a + r i k k a i t a + r i k k a k u k o n k a n n u s + r i k k a m a d o n l a k k i + r i k k a n e n ä t t i + r i k k a p a l s a m i + r i k k a p u n t a r p ä ä + r i k k a p ä h k ä m ö + r i k k a r u o h o j a + r i k k a r ö l l i + r i k k a s i n a p p i + r i k k a s i n i j u u r i + r i k k a s o l j o + r i k k a t a t a r + r i k k a u d e n + r i k k a u d e s t a + r i k k a u d e t + r i k k a u k s i a + r i k k a u k s i e n + r i k k e e n + r i k k i b a k t e e r i t + r i k k i d i k l o r i d i + r i k k i d i o k s i d i + r i k k i d i o k s i d i a + r i k k i d i o k s i d i i n + r i k k i d i o k s i d i j ä ä m i s t ä + r i k k i d i o k s i d i j ä ä m ä ä + r i k k i d i o k s i d i l l a + r i k k i d i o k s i d i l l e + r i k k i d i o k s i d i n + r i k k i d i o k s i d i p i t o i s u u d e n + r i k k i d i o k s i d i p i t o i s u u s + r i k k i d i o k s i d i p ä ä s t ö i s t ä + r i k k i d i o k s i d i p ä ä s t ö j e n + r i k k i d i o k s i d i p ä ä s t ö j ä + r i k k i d i o k s i d i p ä ä s t ö t + r i k k i d i o k s i d i s t a + r i k k i d i o k s i d i t + r i k k i d i r e k t i i v i n + r i k k i h a p o k e + r i k k i h a p p o + r i k k i h e k s a f l u o r i d e j a + r i k k i h e k s a f l u o r i d i + r i k k i h e k s a f l u o r i d i a + r i k k i h e k s a f l u o r i d i e n + r i k k i h e k s a f l u o r i d i n + r i k k i i n + r i k k i k ä r p ä s s i e n i + r i k k i k ä ä p ä + r i k k i l a s t i s s a + r i k k i m a a i l m a + r i k k i o k s i d i a + r i k k i o k s i d i e n + r i k k i o k s i d i p ä ä s t ö i s t ä + r i k k i p i t o i s e m p a a + r i k k i p i t o i s u u d e k s i + r i k k i p i t o i s u u d e n + r i k k i p i t o i s u u d e s t a + r i k k i p i t o i s u u d e t + r i k k i p i t o i s u u k s i s t a + r i k k i p i t o i s u u s + r i k k i p i t o i s u u s r a j a + r i k k i p i t o i s u u s r a j o i s t a + r i k k i p i t o i s u u s r a j o j e n + r i k k i p i t o i s u u t e e n + r i k k i p i t o i s u u t t a + r i k k i p l a s m a l a m p p u + r i k k i p ä ä s t ö i s t ä + r i k k i p ä ä s t ö j e n + r i k k i p ä ä s t ö j ä + r i k k i p ä ä s t ö t + r i k k i r a j o i t u s + r i k k i r o u s k u + r i k k i s a a s t e e t + r i k k i t e t r a f l u o r i d i + r i k k i t r i o k s i d i + r i k k i t r i o k s i d i l l a + r i k k i t u k a a n i + r i k k i v a a t i m u s + r i k k i v a l m u s k a + r i k k i v e d y n + r i k k i v e t y + r i k k i ä + r i k k o a + r i k k o e n + r i k k o i + r i k k o i s i + r i k k o i s i m m e + r i k k o m a a n + r i k k o m a t t a + r i k k o m i s e l l e + r i k k o m i s e n + r i k k o m i s e s t a + r i k k o m i s i a + r i k k o m i s k a n t e i t a + r i k k o m i s m e n e t t e l y + r i k k o m i s m e n e t t e l y i d e n + r i k k o m i s m e n e t t e l y i h i n + r i k k o m i s m e n e t t e l y i l l e + r i k k o m i s m e n e t t e l y i s s ä + r i k k o m i s m e n e t t e l y i s t ä + r i k k o m i s m e n e t t e l y j e n + r i k k o m i s m e n e t t e l y j ä + r i k k o m i s m e n e t t e l y n + r i k k o m i s m e n e t t e l y s s ä + r i k k o m i s m e n e t t e l y s t ä + r i k k o m i s m e n e t t e l y t + r i k k o m i s m e n e t t e l y y n + r i k k o m i s m e n e t t e l y ä + r i k k o m i s o n g e l m a a n + r i k k o m i s t a + r i k k o m i s t a p a u k s e s s a + r i k k o m i s t a p a u k s e s t a + r i k k o m i s t a p a u k s e t + r i k k o m i s t a p a u k s i a + r i k k o m i s t a p a u k s i i n + r i k k o m i s t a p a u k s i s s a + r i k k o m i s t a p a u k s i s t a + r i k k o m i s t a p a u s t a + r i k k o m i s t a p a u s t e n + r i k k o m u k s e e n + r i k k o m u k s e n + r i k k o m u k s e s t a + r i k k o m u k s e t + r i k k o m u k s i a + r i k k o m u k s i e n + r i k k o m u k s i i n + r i k k o m u k s i l l e + r i k k o m u k s i n a + r i k k o m u k s i s t a + r i k k o m u s k a n t e i d e n + r i k k o m u s k a n t e l u + r i k k o m u s l u e t t e l o + r i k k o m u s l u e t t e l o a + r i k k o m u s m e n e t t e l y + r i k k o m u s m e n e t t e l y i h i n + r i k k o m u s m e n e t t e l y i l l e + r i k k o m u s m e n e t t e l y i l l ä + r i k k o m u s m e n e t t e l y i s s ä + r i k k o m u s m e n e t t e l y i s t ä + r i k k o m u s m e n e t t e l y i t t e n + r i k k o m u s m e n e t t e l y i t ä + r i k k o m u s m e n e t t e l y j e n + r i k k o m u s m e n e t t e l y j ä + r i k k o m u s m e n e t t e l y l l e + r i k k o m u s m e n e t t e l y n + r i k k o m u s m e n e t t e l y s s ä + r i k k o m u s m e n e t t e l y s t ä + r i k k o m u s m e n e t t e l y t + r i k k o m u s m e n e t t e l y y n + r i k k o m u s m e n e t t e l y ä + r i k k o m u s o i k e u d e n k ä y n t i e n + r i k k o m u s o n g e l m i a + r i k k o m u s s a k k o j a + r i k k o m u s t a p a u k s i i n + r i k k o m u s t a p a u k s i s s a + r i k k o m u s t a p a u s t e n + r i k k o m u s t e n + r i k k o m u s t i l a n t e i t a + r i k k o n u t + r i k k o o + r i k k o v a n + r i k k o v a n s a + r i k k o v a t + r i k k o v a t k o + r i k k o v i a + r i k k o v i e n + r i k k o v i l l a + r i k k o v i l l e + r i k k o v i s t a + r i k o k s e e n + r i k o k s e k s i + r i k o k s e n + r i k o k s e n a + r i k o k s e n s a + r i k o k s e n t e k i j ä l l e + r i k o k s e n t e k i j ä t + r i k o k s e n t e k i j ä ä + r i k o k s e n t e k i j ö i l t ä + r i k o k s e n t e k i j ö i n ä + r i k o k s e n t e k i j ö i t ä + r i k o k s e n t e k o a j a n k o h t a n a + r i k o k s e n t e k o p a i k a n + r i k o k s e n t o r j u n t a a + r i k o k s e n t o r j u n t a a n + r i k o k s e n t o r j u n t a p o l i t i i k k a a + r i k o k s e n t o r j u n t a v e r k o s t o a + r i k o k s e n t o r j u n t a v e r k o s t o l l e + r i k o k s e n t o r j u n t a v e r k o s t o n + r i k o k s e n t o r j u n t a v e r k o s t o s s a + r i k o k s e n t o r j u n t a v e r k o s t o s t a + r i k o k s e n u u s i j a + r i k o k s e n u u s i j a s t a + r i k o k s e n u u s i j o i d e n + r i k o k s e n u u s i j o i t a + r i k o k s e s t a + r i k o k s e t + r i k o k s i a + r i k o k s i a a n + r i k o k s i e n + r i k o k s i i n + r i k o k s i k s i + r i k o k s i l l a + r i k o k s i l l e + r i k o k s i l t a + r i k o k s i n a + r i k o k s i s s a + r i k o k s i s t a + r i k o l l i s e e n + r i k o l l i s e k s i + r i k o l l i s e l l a + r i k o l l i s e l l e + r i k o l l i s e m p i + r i k o l l i s e n + r i k o l l i s e n a + r i k o l l i s e s s a + r i k o l l i s e s t a + r i k o l l i s e t + r i k o l l i s h a l l i t u s + r i k o l l i s i a + r i k o l l i s i i n + r i k o l l i s i k s i + r i k o l l i s i l l a + r i k o l l i s i l l e + r i k o l l i s i l m i ö t + r i k o l l i s i s t a + r i k o l l i s j e n g e j ä + r i k o l l i s j e n g i e n + r i k o l l i s j o u k k i o + r i k o l l i s j o u k k i o i d e n + r i k o l l i s j o u k k i o i t a + r i k o l l i s j o u k k i o t + r i k o l l i s j o u k k o + r i k o l l i s j o u k k o j a + r i k o l l i s j o u k k o j e n + r i k o l l i s j o u k o t + r i k o l l i s j ä r j e s t ö + r i k o l l i s j ä r j e s t ö i h i n + r i k o l l i s j ä r j e s t ö i l l e + r i k o l l i s j ä r j e s t ö i l l ä + r i k o l l i s j ä r j e s t ö i l t ä + r i k o l l i s j ä r j e s t ö i s t ä + r i k o l l i s j ä r j e s t ö j e n + r i k o l l i s j ä r j e s t ö j ä + r i k o l l i s j ä r j e s t ö l l ä + r i k o l l i s j ä r j e s t ö n + r i k o l l i s j ä r j e s t ö n ä + r i k o l l i s j ä r j e s t ö s s ä + r i k o l l i s j ä r j e s t ö t + r i k o l l i s j ä r j e s t ö ä + r i k o l l i s j ä r j e s t ö ö n + r i k o l l i s k a r t e l l e i l l e + r i k o l l i s k a r t e l l i e n + r i k o l l i s k e t j u j a + r i k o l l i s k e t j u j e n + r i k o l l i s k l a a n i t + r i k o l l i s l i i g a + r i k o l l i s l i i g a n + r i k o l l i s l i i g a t + r i k o l l i s l i i g o i l l e + r i k o l l i s l i i g o j a + r i k o l l i s l i i g o j e n + r i k o l l i s l u o n t e i s e t + r i k o l l i s p i i r i e n + r i k o l l i s r e n k a i t a + r i k o l l i s r i n g i t + r i k o l l i s r y h m i e n + r i k o l l i s r y h m i l l e + r i k o l l i s r y h m i s s ä + r i k o l l i s r y h m i t t y m i e n + r i k o l l i s r y h m i ä + r i k o l l i s r y h m ä + r i k o l l i s r y h m ä n + r i k o l l i s r y h m ä t + r i k o l l i s s y n d i k a a t t e j a + r i k o l l i s t a + r i k o l l i s t e n + r i k o l l i s t o i m i s s a + r i k o l l i s u u d e l l e + r i k o l l i s u u d e l t a + r i k o l l i s u u d e n + r i k o l l i s u u d e n a l a t + r i k o l l i s u u d e n t o r j u n t a p o n n i s t u k s i i n + r i k o l l i s u u d e s s a + r i k o l l i s u u d e s t a + r i k o l l i s u u d e s t a a n + r i k o l l i s u u s a s t e + r i k o l l i s u u s a s t e e s e e n + r i k o l l i s u u s k y s y m y s + r i k o l l i s u u s k y s y m y s t ä + r i k o l l i s u u s l u k u j a + r i k o l l i s u u s l u v u t + r i k o l l i s u u s m u o t o j a + r i k o l l i s u u s o h j e l m a a + r i k o l l i s u u s o n g e l m a a n + r i k o l l i s u u s t i l a n n e + r i k o l l i s u u t e e n + r i k o l l i s u u t t a + r i k o l l i s u u t t a k i n + r i k o l l i s v a l t i o + r i k o l l i s v e r k k o j a + r i k o l l i s v e r k k o j e n + r i k o l l i s v e r k o s t o + r i k o l l i s v e r k o s t o a + r i k o l l i s v e r k o s t o i l l e + r i k o l l i s v e r k o s t o i s t a + r i k o l l i s v e r k o s t o j a + r i k o l l i s v e r k o s t o j e n + r i k o l l i s v e r k o s t o n + r i k o l l i s v e r k o s t o o n + r i k o l l i s v e r k o s t o s s a + r i k o l l i s v e r k o s t o t + r i k o l l i s v e r k o t + r i k o s a a l t o + r i k o s a l a l l a + r i k o s a l a l l a k i n + r i k o s a s i a + r i k o s a s i a n a j a j a n a + r i k o s a s i a s s a + r i k o s a s i a s t a + r i k o s a s i a t + r i k o s a s i o i d e n + r i k o s a s i o i h i n + r i k o s a s i o i s s a + r i k o s a s i o i s t a + r i k o s a s i o i t a + r i k o s e l o k u v a + r i k o s e l o k u v a s s a + r i k o s e p ä i l y ä + r i k o s h i s t o r i a n + r i k o s i m p e r i u m i n + r i k o s j a o s t o + r i k o s j ä r j e s t ö j ä + r i k o s j ä r j e s t ö t + r i k o s k a n t e i d e n + r i k o s k a n t e i t a + r i k o s k a t e g o r i a n + r i k o s k a t e g o r i a t + r i k o s k i r j a l l i s u u s + r i k o s k o m i s a r i o + r i k o s k ä y t ä n t ö j ä + r i k o s l a e i s s a + r i k o s l a e i s s a a n + r i k o s l a e i s t a + r i k o s l a i l l a + r i k o s l a i l l e + r i k o s l a i n + r i k o s l a i n s ä ä d ä n n ö i s s ä + r i k o s l a i n s ä ä d ä n n ö l l i s e t + r i k o s l a i n s ä ä d ä n n ö l l i s i n + r i k o s l a i n s ä ä d ä n n ö n + r i k o s l a i n s ä ä d ä n n ö s s ä + r i k o s l a i n s ä ä d ä n n ö s t ä + r i k o s l a i n s ä ä d ä n n ö s t ä ä n + r i k o s l a i n s ä ä d ä n n ö t + r i k o s l a i n s ä ä d ä n t ö + r i k o s l a i n s ä ä d ä n t ö j e n + r i k o s l a i n s ä ä d ä n t ö j ä r j e s t e l m i ä + r i k o s l a i n s ä ä d ä n t ö ä + r i k o s l a i n s ä ä d ä n t ö ä ä n + r i k o s l a i n s ä ä d ä n t ö ö n + r i k o s l a i n s ä ä d ä n t ö ö n s ä + r i k o s l a i s s a + r i k o s l a i s t a + r i k o s l a i t + r i k o s l a j e j a + r i k o s l a j i + r i k o s l a j i n a a n + r i k o s l a k e i h i n + r i k o s l a k e j a + r i k o s l a k e j a a n + r i k o s l a k i + r i k o s l a k i a + r i k o s l a k i e m m e + r i k o s l a k i e n + r i k o s l a k i e s i t y s + r i k o s l a k i i m m e + r i k o s l a k i i n + r i k o s l a k i j ä r j e s t e l m ä t + r i k o s l a k i k o k o e l m a a + r i k o s l a k i n s a + r i k o s l a k i u u d i s t u k s e s t a + r i k o s l a k i v e r k o s t o + r i k o s l i i g o j e n + r i k o s l u e t t e l o + r i k o s l u e t t e l o o n + r i k o s l u k u j a + r i k o s l u o k a t + r i k o s l u v u t + r i k o s m a r k k i n o i d e n + r i k o s m e n e t t e l y i s s ä + r i k o s m e n e t t e l y l a i n + r i k o s m e n e t t e l y l a k e i h i n + r i k o s m e n e t t e l y ä + r i k o s m u o t o j e n + r i k o s m ä ä r i t e l m i e n + r i k o s m ä ä r i t e l m ä + r i k o s n e u v o s t o + r i k o s n i m i k k e i t ä + r i k o s n o r m e i h i n + r i k o s o i k e u d e l l e + r i k o s o i k e u d e l l i n e n + r i k o s o i k e u d e l l i s e e n + r i k o s o i k e u d e l l i s e k s i + r i k o s o i k e u d e l l i s e l l a + r i k o s o i k e u d e l l i s e n + r i k o s o i k e u d e l l i s e n a + r i k o s o i k e u d e l l i s e s s a + r i k o s o i k e u d e l l i s e s t a + r i k o s o i k e u d e l l i s e s t i + r i k o s o i k e u d e l l i s e t + r i k o s o i k e u d e l l i s i a + r i k o s o i k e u d e l l i s i i n + r i k o s o i k e u d e l l i s i l l a + r i k o s o i k e u d e l l i s i n + r i k o s o i k e u d e l l i s i s s a + r i k o s o i k e u d e l l i s i s t a + r i k o s o i k e u d e l l i s t a + r i k o s o i k e u d e l l i s t e n + r i k o s o i k e u d e n + r i k o s o i k e u d e n k ä y n n e i s s ä + r i k o s o i k e u d e n k ä y n n e i s t ä + r i k o s o i k e u d e n k ä y n n i l l ä + r i k o s o i k e u d e n k ä y n n i n + r i k o s o i k e u d e n k ä y n n i s s ä + r i k o s o i k e u d e n k ä y n n i s t ä + r i k o s o i k e u d e n k ä y n n i t + r i k o s o i k e u d e n k ä y n t e j ä + r i k o s o i k e u d e n k ä y n t i + r i k o s o i k e u d e n k ä y n t i e n + r i k o s o i k e u d e n k ä y n t i m e n e t t e l y i s s ä + r i k o s o i k e u d e n k ä y n t i m e n e t t e l y n + r i k o s o i k e u d e n k ä y n t i s ä ä n n ö s t ö ä + r i k o s o i k e u d e n k ä y n t i ä + r i k o s o i k e u d e n k ä y t t ö + r i k o s o i k e u d e n k ä y t ö n + r i k o s o i k e u d e s s a + r i k o s o i k e u d e s t a + r i k o s o i k e u d e t + r i k o s o i k e u k s i a + r i k o s o i k e u k s i e n + r i k o s o i k e u s + r i k o s o i k e u s a l u e + r i k o s o i k e u s a s i o i s s a + r i k o s o i k e u s i s t u i n + r i k o s o i k e u s j ä r j e s t e l m i e n + r i k o s o i k e u s j ä r j e s t e l m i e n s ä + r i k o s o i k e u s j ä r j e s t e l m i ä + r i k o s o i k e u s j ä r j e s t e l m ä + r i k o s o i k e u s j ä r j e s t e l m ä m m e + r i k o s o i k e u s j ä r j e s t e l m ä n + r i k o s o i k e u s j ä r j e s t e l m ä n n e + r i k o s o i k e u s j ä r j e s t e l m ä s s ä + r i k o s o i k e u s j ä r j e s t e l m ä t + r i k o s o i k e u s j ä r j e s t e l m ä ä + r i k o s o i k e u s j ä r j e s t e l m ä ä n s ä + r i k o s o i k e u s k y s y m y k s i s s ä + r i k o s o i k e u s k ä y t ä n t ö + r i k o s o i k e u s l a i n s ä ä d ä n n ö n + r i k o s o i k e u s l a i n s ä ä d ä n t ö ä + r i k o s o i k e u s l a k i + r i k o s o i k e u s p o l i t i i k a n + r i k o s o i k e u s p o l i t i i k k a a + r i k o s o i k e u s p o l i t i i k k a a n + r i k o s o i k e u s p o l i t i i k k a m m e + r i k o s o i k e u s p o l i t i i k k o j e n + r i k o s o i k e u s s ä ä d ö s t e n + r i k o s o i k e u s t u o m i o i s t u i m e n + r i k o s o i k e u s t u o m i o i s t u i n + r i k o s o i k e u s y h t e i s t y ö n + r i k o s o i k e u t e e n + r i k o s o i k e u t e e n k i n + r i k o s o i k e u t e m m e + r i k o s o i k e u t e n s a + r i k o s o i k e u t t a + r i k o s o i k e u t t a a n + r i k o s o i k e u t t a m m e + r i k o s o n g e l m a + r i k o s p a i k a l l a + r i k o s p a i k a l t a + r i k o s p a l s t o i l l a + r i k o s p o l i i s e j a + r i k o s p o l i i s i + r i k o s p o l i i s i n + r i k o s p o l i t i i k k a + r i k o s p r o f i i l i + r i k o s p r o s e s s e i h i n + r i k o s p r o s e s s e i s s a + r i k o s p r o s e s s e j a + r i k o s p r o s e s s i + r i k o s p r o s e s s i a + r i k o s p r o s e s s i e n + r i k o s p r o s e s s i i n + r i k o s p r o s e s s i l a k i a + r i k o s p r o s e s s i n + r i k o s p r o s e s s i o i k e u d e n + r i k o s p r o s e s s i o i k e u s + r i k o s p r o s e s s i o i k e u t t a + r i k o s p r o s e s s i s s a + r i k o s p r o s e s s i s ä ä n n ö s t ö ä + r i k o s p r o s e s s u a a l i s i a + r i k o s r a n g a i s t u k s e t + r i k o s r a n g a i s t u k s i s t a + r i k o s r a p o r t e i s s a + r i k o s r e k i s t e r e i h i n + r i k o s r e k i s t e r e i s s ä + r i k o s r e k i s t e r e i s t ä + r i k o s r e k i s t e r e i t ä + r i k o s r e k i s t e r i + r i k o s r e k i s t e r i e n + r i k o s r e k i s t e r i i n + r i k o s r e k i s t e r i j ä r j e s t e l m ä + r i k o s r e k i s t e r i j ä r j e s t e l m ä n + r i k o s r e k i s t e r i n + r i k o s r e k i s t e r i n s ä + r i k o s r e k i s t e r i o t t e e s s a + r i k o s r e k i s t e r i s t ä + r i k o s r e k i s t e r i s t ä ä n + r i k o s r e k i s t e r i t + r i k o s r e k i s t e r i t i e d o i s t a + r i k o s r e k i s t e r i t i e d o t + r i k o s r e k i s t e r i t i e t o j a + r i k o s r e k i s t e r i t i e t o j a a n + r i k o s r e k i s t e r i t i e t o j e n + r i k o s r e k i s t e r i t i e t o j ä r j e s t e l m ä + r i k o s r e k i s t e r i t i e t o j ä r j e s t e l m ä n + r i k o s r e k i s t e r i t i e t o j ä r j e s t e l m ä ä + r i k o s r e k i s t e r i t i e t o k a n n a s t a + r i k o s r e k i s t e r i t i e t o p y y n t ö i h i n + r i k o s r e k i s t e r i t o i m i s t o j e n + r i k o s r e k i s t e r i ä + r i k o s r o m a a n e j a + r i k o s r o m a a n i s t a + r i k o s r y h m i l l e + r i k o s s a n k t i o t + r i k o s s e u r a a m u k s i a + r i k o s s e u r a a m u k s i l l a + r i k o s s e u r a a m u s t e n + r i k o s s y y t e + r i k o s s y y t e t t ä + r i k o s s y y t t e e n + r i k o s s y y t t e e t + r i k o s s y y t t e i d e n + r i k o s s y y t t e i s i i n + r i k o s s y y t t e i s t ä + r i k o s s y y t t e i t ä + r i k o s t a + r i k o s t a p a u k s e e n + r i k o s t a p a u k s e n + r i k o s t a p a u k s i a + r i k o s t a p a u k s i e n + r i k o s t a p a u k s i s s a + r i k o s t a p a u k s i s t a + r i k o s t a p a u s t a + r i k o s t e n + r i k o s t e n t e k i j ö i d e n + r i k o s t e n t e k i j ö i t ä + r i k o s t e n t o r j u n n a n + r i k o s t e n t o r j u n n a s s a + r i k o s t e n t o r j u n t a + r i k o s t e n t o r j u n t a a + r i k o s t e n t o r j u n t a h a n k k e i t a + r i k o s t e n t o r j u n t a h e n k i l ö s t ö ä + r i k o s t e n t o r j u n t a o h j e l m a n + r i k o s t e n t o r j u n t a t o i m i i n + r i k o s t e n t o r j u n t a t o i m i n n a s s a + r i k o s t e n t o r j u n t a v e r k o s t o + r i k o s t e n t o r j u n t a v ä l i n e + r i k o s t e n t u t k i n n a s s a + r i k o s t e n v a s t a i s i a + r i k o s t i e d u s t e l u a + r i k o s t i e d u s t e l u e l i m e n ä + r i k o s t i l a s t o i s s a + r i k o s t i l a s t o j a + r i k o s t i l a s t o j e n + r i k o s t i l a s t o j ä r j e s t e l m ä s t ä + r i k o s t o r j u n n a s t a + r i k o s t o r j u n t a v i r a s t o i l l a + r i k o s t o r j u n t a y h t e i s t y ö t ä + r i k o s t u n n u s m e r k i s t ö + r i k o s t u n n u s m e r k i s t ö j e n + r i k o s t u n n u s m e r k i s t ö j ä + r i k o s t u o m a r i n a + r i k o s t u o m i o + r i k o s t u o m i o i d e n + r i k o s t u o m i o i s t a + r i k o s t u o m i o i s t u i m e e n + r i k o s t u o m i o i s t u i m e l l a + r i k o s t u o m i o i s t u i m e l l e + r i k o s t u o m i o i s t u i m e l t a + r i k o s t u o m i o i s t u i m e n + r i k o s t u o m i o i s t u i m e n a + r i k o s t u o m i o i s t u i m e s s a + r i k o s t u o m i o i s t u i m e s t a + r i k o s t u o m i o i s t u i m e t + r i k o s t u o m i o i s t u i m i a + r i k o s t u o m i o i s t u i m i e n + r i k o s t u o m i o i s t u i m i i n + r i k o s t u o m i o i s t u i m i l l a + r i k o s t u o m i o i s t u i m i s s a + r i k o s t u o m i o i s t u i m i s t a + r i k o s t u o m i o i s t u i n + r i k o s t u o m i o i s t u i n a s i a + r i k o s t u o m i o i s t u i n j ä r j e s t e l m i ä + r i k o s t u o m i o i s t u i n k i n + r i k o s t u o m i o i s t u i n t a + r i k o s t u o m i o i s t u i n t e n + r i k o s t u o m i o i t a + r i k o s t u o m i o n + r i k o s t u o m i o s t a + r i k o s t u o m i o t + r i k o s t u o m i o t a + r i k o s t u t k i j o i d e n + r i k o s t u t k i m u k s e e n + r i k o s t u t k i m u k s e l t a + r i k o s t u t k i m u k s e n + r i k o s t u t k i m u k s e t + r i k o s t u t k i m u k s i a + r i k o s t u t k i m u k s i i n + r i k o s t u t k i m u k s i s s a + r i k o s t u t k i m u s + r i k o s t u t k i m u s l a b o r a t o r i o i d e n + r i k o s t u t k i m u s l a b o r a t o r i o i s t a + r i k o s t u t k i m u s l a b o r a t o r i o i t a + r i k o s t u t k i m u s l a b o r a t o r i o t + r i k o s t u t k i m u s o s a s t o t + r i k o s t u t k i m u s t a + r i k o s t u t k i m u s t e n + r i k o s t u t k i n n a l l i s i s t a + r i k o s t u t k i n n a n + r i k o s t u t k i n n a s s a + r i k o s t u t k i n n a t + r i k o s t u t k i n n o i s t a + r i k o s t u t k i n t a + r i k o s t u t k i n t a a + r i k o s t u t k i n t a a n + r i k o s t u t k i n t a j ä r j e s t e l m ä + r i k o s t u t k i n t a t a r k o i t u k s i i n + r i k o s t u t k i n t a v i r a n o m a i n e n + r i k o s t u t k i n t a v i r a n o m a i s i l l e + r i k o s t u t k i n t a v i r a s t o j e n + r i k o s t u t k i n t a v i r a s t o n + r i k o s t u t k i n t a y k s i k k ö + r i k o s t u t k i n t o i h i n + r i k o s t y y p e i s s ä + r i k o s t y y p e i s t ä + r i k o s t y y p i n + r i k o s t y y p i s s ä + r i k o s t y y p p e i h i n + r i k o s t y y p p e j ä + r i k o s t y y p p i + r i k o s t y y p p i e n + r i k o s t y y p p i ä + r i k o s u h r i p ä i v y s t y s + r i k o s v a s t u u + r i k o s v a s t u u s e e n + r i k o s v a s t u u s t a + r i k o s v a s t u u t a + r i k o t a a n + r i k o t a a n k o + r i k o t t a v a + r i l l i b u l b u l i + r i l l i m e s i k k o + r i l l i p i i k k i p y r s t ö + r i l l i t + r i l l i t a n s s i j a + r i n n a k k a i n a s e t t e l u j e n + r i n n a k k a i n e l o a + r i n n a k k a i n e l o l l e + r i n n a k k a i n e l o n + r i n n a k k a i s a l o i t t e i t a + r i n n a k k a i s e l o + r i n n a k k a i s e l o a + r i n n a k k a i s e l o h a n k e + r i n n a k k a i s e l o l l e + r i n n a k k a i s e l o m m e + r i n n a k k a i s e l o n + r i n n a k k a i s e l o o n + r i n n a k k a i s e s i i n t y m i s e s t ä + r i n n a k k a i s e s t a + r i n n a k k a i s h y ö t y j ä + r i n n a k k a i s i n + r i n n a k k a i s j a k e l u j ä r j e s t e l m i ä + r i n n a k k a i s j ä r j e s t e l m ä ä n + r i n n a k k a i s j ä r j e s t ö j ä + r i n n a k k a i s k a u p a n + r i n n a k k a i s k a u p a s t a + r i n n a k k a i s k a u p p a a + r i n n a k k a i s k a u p p a a n + r i n n a k k a i s k u l u s t a + r i n n a k k a i s k ä y t t ö + r i n n a k k a i s k ä y t t ö a j a n j a k s o + r i n n a k k a i s k ä y t t ö j a k s o l l a + r i n n a k k a i s k ä y t ö n + r i n n a k k a i s k ä y t ö s t ä + r i n n a k k a i s l a s k e n t a + r i n n a k k a i s l i i t ä n t ä + r i n n a k k a i s l ä ä k e + r i n n a k k a i s l ä ä k k e i d e n + r i n n a k k a i s l ä ä k k e i s t ä + r i n n a k k a i s l ä ä k k e i t ä + r i n n a k k a i s m a a h a n t u o j i e n + r i n n a k k a i s m a r k k i n o i s t a + r i n n a k k a i s m y y j i ä + r i n n a k k a i s n e u v o t t e l u i s t a + r i n n a k k a i s p a l v e l u i d e n + r i n n a k k a i s p o l t e t a a n + r i n n a k k a i s p o l t o n + r i n n a k k a i s p o l t t o a + r i n n a k k a i s p o l t t o l a i t o k s i a + r i n n a k k a i s p o l t t o l a i t o k s i i n + r i n n a k k a i s p o l t t o l a i t o k s i s s a + r i n n a k k a i s p o l t t o l a i t o s t e n + r i n n a k k a i s p o l t t o o n + r i n n a k k a i s p u h e e n j o h t a j a + r i n n a k k a i s p u h e e n j o h t a j u u d e n + r i n n a k k a i s p u h e e n j o h t a j u u s + r i n n a k k a i s s o p i m u k s e e n + r i n n a k k a i s s o p i m u k s e l l a + r i n n a k k a i s s o p i m u k s e n + r i n n a k k a i s s o p i m u k s e s t a + r i n n a k k a i s s t r a t e g i o i h i n + r i n n a k k a i s s t r a t e g i o i t a + r i n n a k k a i s s ä v e l l a j i + r i n n a k k a i s t a p a h t u m i a + r i n n a k k a i s t a p a h t u m i s t a + r i n n a k k a i s t a p a u s + r i n n a k k a i s t a v o i t t e e k s i + r i n n a k k a i s t e n + r i n n a k k a i s t e o l l i s u u s + r i n n a k k a i s t o i m e n p i t e e t + r i n n a k k a i s t o i m i a + r i n n a k k a i s t u n n e l i a + r i n n a k k a i s t u o j a + r i n n a k k a i s t u o j a n + r i n n a k k a i s t u o j i e n + r i n n a k k a i s t u o n n i l l a + r i n n a k k a i s t u o n n i l l e + r i n n a k k a i s t u o n n i n + r i n n a k k a i s t u o n n i s s a + r i n n a k k a i s t u o n n i s t a + r i n n a k k a i s t u o n t i a + r i n n a k k a i s t u o n t i i n + r i n n a k k a i s u u k s i s t a + r i n n a k k a i s v a i h e e n + r i n n a k k a i s v a k u u t u s r y h m i t t y m ä t + r i n n a k k a i s v a l m i s t e i d e n + r i n n a k k a i s v a l m i s t e i l l a + r i n n a k k a i s v a l m i s t e i s t a + r i n n a k k a i s v a l m i s t e i t a + r i n n a k k a i s v a l u u t a k s i + r i n n a k k a i s v a l u u t t a + r i n n a k k a i s v e r k o n + r i n n a k k a i s v e r s i o i d e n + r i n n a k k a i s v i e n n i n + r i n n a k k a i s y h t e i s k u n t a a n + r i n n a k k a i s y h t e i s k u n t i e n + r i n n a l l a a n + r i n n a n k o r k e u s l ä p i m i t t a + r i n n a n k y t k e n t ä + r i n n a s t a a + r i n n a s t e t a a n + r i n n a s t e t t a v a + r i n n e h o p e a t ä p l ä + r i n n e m a r j a s t a j a + r i n n e m e t s ä k e r t t u n e n + r i n n e n y s ä m u u r a + r i n n e v a l k o t a m m i + r i n o t r a k e i i t t i v i r u s + r i n t a i m p l a n t e i l l e + r i n t a i m p l a n t e i s t a + r i n t a i m p l a n t i n + r i n t a i m p l a n t i t + r i n t a i m p l a n t t e i h i n + r i n t a i m p l a n t t e j a + r i n t a i m p l a n t t i + r i n t a i m p l a n t t i e n + r i n t a i m p l a n t t i l e i k k a u k s e n + r i n t a i m p l a n t t i l e i k k a u k s i a + r i n t a i m p l a n t t i l e i k k a u k s i s t a + r i n t a i m p l a n t t i l e i k k a u s + r i n t a i m p l a n t t i p a s s i n + r i n t a i m p l a n t t i r e k i s t e r e i s t ä + r i n t a i m p l a n t t i r e k i s t e r i + r i n t a i m p l a n t t i r e k i s t e r i i n + r i n t a k e s k u k s e n + r i n t a k e s k u k s e t + r i n t a k e s k u k s i a + r i n t a k e s k u s t e n + r i n t a l i h a s + r i n t a l i i v e i h i n + r i n t a l i i v i s o d i s t a + r i n t a m a a + r i n t a m a a n + r i n t a m a h y ö k k ä y k s e s s ä + r i n t a m a h y ö k k ä y s t ä + r i n t a m a i d o s s a + r i n t a m a i d o s t a + r i n t a m a i t o + r i n t a m a k s i + r i n t a m a l i n j a + r i n t a m a l i n j o j e n + r i n t a m a l l a + r i n t a m a l t a + r i n t a m a n + r i n t a m a n a + r i n t a m a s s a + r i n t a m e r k k i + r i n t a m e r k k i ä + r i n t a m i l l a + r i n t a o n t e l o + r i n t a p r o t e e s e i s t a + r i n t a p r o t e e s e j a + r i n t a p r o t e e s i l e i k k a u k s e t + r i n t a s a i r a u k s i i n + r i n t a s e u l o n t a + r i n t a s y ö p ä + r i n t a s y ö p ä a l a l l a + r i n t a s y ö p ä g e e n e j ä + r i n t a s y ö p ä g e e n i + r i n t a s y ö p ä g e e n i e n + r i n t a s y ö p ä g e e n i n + r i n t a s y ö p ä h o i t o + r i n t a s y ö p ä h o i t o j e n + r i n t a s y ö p ä h o i t o p o t i l a i d e n + r i n t a s y ö p ä k u o l l e i s u u d e n + r i n t a s y ö p ä k u o l l e i s u u s + r i n t a s y ö p ä k u o l l e i s u u t t a + r i n t a s y ö p ä l e i k k a u s + r i n t a s y ö p ä l e i k k a u s t a + r i n t a s y ö p ä l u v u t + r i n t a s y ö p ä p o t i l a a t + r i n t a s y ö p ä p o t i l a i d e n + r i n t a s y ö p ä p o t i l a i t a + r i n t a s y ö p ä r i s k i ä + r i n t a s y ö p ä s e u l o n n a n + r i n t a s y ö p ä s e u l o n n a s s a + r i n t a s y ö p ä s e u l o n t a a + r i n t a s y ö p ä s o l u j e n + r i n t a s y ö p ä t a p a u k s i a + r i n t a s y ö p ä t a p a u k s i i n + r i n t a s y ö p ä t a p a u k s i s t a + r i n t a s y ö p ä t a p a u s t e n + r i n t a s y ö p ä t i l a n t e e s t a + r i n t a s y ö p ä t u t k i m u k s e e n + r i n t a s y ö p ä t u t k i m u k s e n + r i n t a s y ö p ä t u t k i m u s + r i n t a s y ö p ä y h d i s t y k s e n + r i n t a s y ö p ä ä + r i n t a s y ö p ä ä n + r i n t a s y ö v i s t ä + r i n t a s y ö v ä l l e + r i n t a s y ö v ä n + r i n t a s y ö v ä s s ä + r i n t a s y ö v ä s t ä + r i n t a s y ö v ä s t ä ä n + r i n t a s y ö v ä t + r i n t a y k s i k k ö j e n + r i n t e e s s ä + r i o n i + r i o n p i i k k i p y r s t ö + r i o n s a m m a l t i k k a + r i o s s a + r i p e i s i i n + r i p e i t ä + r i p e ä l i i k k e i s e m p i ä + r i p e ä l l ä + r i p e ä m m i n + r i p e ä m p i + r i p e ä m p ä ä + r i p e ä s s ä + r i p e ä s t ä + r i p e ä ä + r i p e ä ä n + r i p p e e t + r i p p i r a h a t + r i p p i s a l a i s u u s + r i p p i t u o l i m e n e t t e l y s s ä + r i p s i a l p i + r i p s i e n t a i v u t i n + r i p s i m a a t ä h t i + r i p s i s i i p p a + r i p s i t ä h y s t ä j ä t + r i p s u p a l l o k a l a + r i p u l i e p i d e m i o i s t a + r i p u l i t a u t e i h i n + r i p u l i t a u t i e n + r i p u s t a e s s a a n + r i s i i n i ö l j y + r i s i i n i ö l j y h a p p o + r i s k e i h i n + r i s k e i k s i + r i s k e i l l e + r i s k e i l t ä + r i s k e i n ä + r i s k e i s t ä + r i s k e j ä + r i s k i a i n e i s t a + r i s k i a i n e k s e e n + r i s k i a i n e k s e k s i + r i s k i a i n e k s e n + r i s k i a i n e k s e s t a + r i s k i a i n e k s e t + r i s k i a i n e k s i a + r i s k i a i n e k s i i n + r i s k i a i n e s + r i s k i a i n e s t a + r i s k i a i n e s t e n + r i s k i a l a t + r i s k i a l t i s + r i s k i a l t i s t a + r i s k i a l t t e i m m a l l e + r i s k i a l t t e i m m a t + r i s k i a l t t e i m p i e n + r i s k i a l t t e i m p i i n + r i s k i a l t t e i n + r i s k i a l t t i i d e n + r i s k i a l t t i i k s i + r i s k i a l t t i i m m a k s i + r i s k i a l t t i i m p a a + r i s k i a l t t i i m p i + r i s k i a l t t i i m p i a + r i s k i a l t t i i m p i e n + r i s k i a l t t i i m p i i n + r i s k i a l t t i i m p i n a + r i s k i a l t t i i n + r i s k i a l t t i i s t a + r i s k i a l t t i i t a + r i s k i a l t t i u d e n + r i s k i a l t t i u d e s t a + r i s k i a l t t i u d e s t a a n + r i s k i a l t t i u s k y s y m y k s i ä + r i s k i a l t t i u t t a + r i s k i a l u e e n a + r i s k i a l u e e t + r i s k i a l u e i d e n + r i s k i a l u e i l l a + r i s k i a l u e i l l e + r i s k i a l u e i l t a + r i s k i a l u e i s i i n + r i s k i a l u e i s t a + r i s k i a l u e i t a + r i s k i a l u e k a r t t o j e n + r i s k i a l u k s i l l a + r i s k i a l u s t e n + r i s k i a n a l y y s e i h i n + r i s k i a n a l y y s e j ä + r i s k i a n a l y y s i + r i s k i a n a l y y s i e n + r i s k i a n a l y y s i i n + r i s k i a n a l y y s i m a l l i + r i s k i a n a l y y s i m e n e t e l m i e n + r i s k i a n a l y y s i n + r i s k i a n a l y y s i n s ä + r i s k i a n a l y y s i s s ä + r i s k i a n a l y y s i t + r i s k i a n a l y y s i ä + r i s k i a r v i o i d e n + r i s k i a r v i o i n n i n + r i s k i a r v i o i n n i t + r i s k i a r v i o i n t e j a + r i s k i a r v i o i n t i + r i s k i a r v i o i n t i a + r i s k i a r v i o i n t i e n + r i s k i a r v i o i n t i i n + r i s k i a r v i o i n t i p e r i a a t e + r i s k i a r v i o i t u a + r i s k i a r v i o n + r i s k i a r v i o n s a + r i s k i a r v i o o n + r i s k i b i s n e s + r i s k i e h d o t + r i s k i e l e m e n t t e j ä + r i s k i e l i n t e n + r i s k i e n + r i s k i e n a n a l y s o i n t i p r o s e s s i + r i s k i e n a r v i o i n n i s s a + r i s k i e n a r v i o i n t i + r i s k i e n a r v i o i n t i a + r i s k i e n a r v i o i n t i i n + r i s k i e n a r v i o i n t i j ä r j e s t e l m ä + r i s k i e n a r v i o i n t i m e n e t e l m i ä + r i s k i e n a r v i o i n t i m e n e t t e l y i h i n + r i s k i e n a r v i o i n t i p a r a m e t r i e n + r i s k i e n e h k ä i s y y n + r i s k i e n h a l l i n n a n + r i s k i e n h a l l i n n a s s a + r i s k i e n h a l l i n n a s t a + r i s k i e n h a l l i n t a + r i s k i e n h a l l i n t a a + r i s k i e n h a l l i n t a a n + r i s k i e n h a l l i n t a m a l l i + r i s k i e n h a l l i n t a p o l i t i i k a n + r i s k i e n h a l l i n t a s t r a t e g i a a + r i s k i e n h a l l i n t a t o i m i e n + r i s k i e n k i n + r i s k i e n v ä h e n t ä m i s s t r a t e g i a + r i s k i e n v ä h e n t ä m i s s t r a t e g i a a + r i s k i h a n k e + r i s k i h e n k i l ö i l l e + r i s k i h e r k e m p i + r i s k i h e r k k i ä + r i s k i h e r k k y y d e n + r i s k i h e r k k y y s + r i s k i h e r k k ä + r i s k i h e r k k ä ä + r i s k i h e r k ä s t ä + r i s k i k a a v i o i t a + r i s k i k a n n a t t a j i s t a + r i s k i k a r t o i t u k s i i n + r i s k i k a r t t o j a + r i s k i k a t e g o r i o i h i n + r i s k i k a t e g o r i o i t a + r i s k i k a u p a l t a + r i s k i k e s k i t t y m i ä + r i s k i k o h t e i d e n + r i s k i k o m i t e o i t a + r i s k i k y n n y k s e n + r i s k i k ä y t t ä y t y m i s e n + r i s k i k ä y t t ä y t y m i s e s t ä + r i s k i l a i t o s t e n + r i s k i l i s ä + r i s k i l t ä + r i s k i l u o k a s t a + r i s k i l u o k i t u k s e n + r i s k i l u o k i t u s l a i t o k s e t + r i s k i l u o k i t u s l a i t o k s i a + r i s k i l u o k i t u s l a i t o k s i i n + r i s k i l u o k i t u s l a i t o k s i l l a + r i s k i l u o k i t u s l a i t o s t e n + r i s k i l u o k i t u s t a + r i s k i l u o k k a a + r i s k i l u o k k a a n + r i s k i l u o k k i a + r i s k i l u o k k i i n + r i s k i l ä h t ö i s i ä + r i s k i l ä h t ö i s t ä + r i s k i m a k s u j e n + r i s k i m a l l i a + r i s k i m a l l i e n + r i s k i m a l l i t + r i s k i m a t e r i a a l e i s t a + r i s k i m a t e r i a a l e j a + r i s k i m a t e r i a a l i + r i s k i m a t e r i a a l i e n + r i s k i m a t e r i a a l i n + r i s k i m a t e r i a a l i p ä ä t ö k s e n + r i s k i m a t e r i a a l i s t a + r i s k i m i t t a r i + r i s k i n + r i s k i n a n a l y s o i n t i m e n e t e l m ä + r i s k i n a r v i o i n n e i s s a + r i s k i n a r v i o i n n e i s t a + r i s k i n a r v i o i n n i l l e + r i s k i n a r v i o i n n i n + r i s k i n a r v i o i n n i s s a + r i s k i n a r v i o i n n i s t a + r i s k i n a r v i o i n n i t + r i s k i n a r v i o i n t e j a + r i s k i n a r v i o i n t e j a a n + r i s k i n a r v i o i n t i + r i s k i n a r v i o i n t i a + r i s k i n a r v i o i n t i e n + r i s k i n a r v i o i n t i i n + r i s k i n a r v i o i n t i j ä r j e s t e l m i i n + r i s k i n a r v i o i n t i j ä r j e s t e l m ä + r i s k i n a r v i o i n t i k o m i t e a n + r i s k i n a r v i o i n t i m a l l i i n + r i s k i n a r v i o i n t i m e k a n i s m e j a + r i s k i n a r v i o i n t i m e n e t e l m i ä + r i s k i n a r v i o i n t i m e n e t t e l y + r i s k i n a r v i o i n t i m e n e t t e l y j ä + r i s k i n a r v i o i n t i m e n e t t e l y n + r i s k i n a r v i o i n t i m e n e t t e l y t + r i s k i n a r v i o i n t i o p e r a a t i o n + r i s k i n a r v i o i n t i p e r u s t e i d e n + r i s k i n a r v i o i n t i p r o s e s s i s s a + r i s k i n a r v i o i n t i s e l v i t y s t e n + r i s k i n a r v i o i n t i s t r a t e g i a a n + r i s k i n a r v i o i n t i s u u n n i t e l m i a + r i s k i n a r v i o t a + r i s k i n e h k ä i s y j ä r j e s t e l m ä + r i s k i n e h k ä i s y s t r a t e g i a + r i s k i n h a l l i n n a l l a + r i s k i n h a l l i n n a l l e + r i s k i n h a l l i n n a n + r i s k i n h a l l i n n a s s a + r i s k i n h a l l i n n a s s a m m e + r i s k i n h a l l i n n a s t a + r i s k i n h a l l i n t a + r i s k i n h a l l i n t a a + r i s k i n h a l l i n t a a n + r i s k i n h a l l i n t a j o h t a j a l t a + r i s k i n h a l l i n t a j o h t a j a n + r i s k i n h a l l i n t a j ä r j e s t e l m ä + r i s k i n h a l l i n t a j ä r j e s t e l m ä n + r i s k i n h a l l i n t a j ä r j e s t e l m ä ä + r i s k i n h a l l i n t a k a n n u s t i m e t + r i s k i n h a l l i n t a k ä y t ä n n ö i s t ä ä n + r i s k i n h a l l i n t a k ä y t ä n t ö j ä + r i s k i n h a l l i n t a m e n e t t e l y j ä + r i s k i n h a l l i n t a p e r u s t a a + r i s k i n h a l l i n t a p o l i t i i k k a a + r i s k i n h a l l i n t a p r o s e s s i a + r i s k i n h a l l i n t a p ä ä t ö k s i ä + r i s k i n h a l l i n t a s t r a t e g i a n + r i s k i n h a l l i n t a t e k n i i k k o j e n + r i s k i n h a l l i n t a t o i m e n p i d e + r i s k i n h a l l i n t a t o i m e n p i t e e k s i + r i s k i n h a l l i n t a t o i m e n p i t e e t + r i s k i n h a l l i n t a t o i m i a + r i s k i n h a l l i n t a t o i m i e n + r i s k i n h a l l i n t a t o i m i l l e + r i s k i n h a l l i n t a t o i m i s t a + r i s k i n h a l l i n t a v a a t i m u k s i a + r i s k i n h a l l i n t a v a s t u u n + r i s k i n h a l l i n t a v ä l i n e e n + r i s k i n h a l l i n t a v ä l i n e e n ä + r i s k i n h a l l i n t a v ä l i n e i t ä + r i s k i n h a l l i n t o o n + r i s k i n j a k o + r i s k i n j a k o a + r i s k i n j a k o r a h a s t o n + r i s k i n j a k o r a h o i t u s v ä l i n e e n + r i s k i n j a k o r a h o i t u s v ä l i n e i t ä + r i s k i n j a k o v ä l i n e e n + r i s k i n j a o s t a + r i s k i n o t t a m i s e s s a + r i s k i n o t t o + r i s k i n o t t o a + r i s k i n o t t o k u l t t u u r i + r i s k i n o t t o v a l m i u d e t + r i s k i n o t t o v a l m i u s + r i s k i n s i e t o k y k y + r i s k i n s i e t o k y k y ä + r i s k i n s ä + r i s k i n t a s a u s k e s k u s t e l u u n + r i s k i n t a s a u s t a + r i s k i n v ä h e n n y s + r i s k i n v ä h e n t ä m i s e e n + r i s k i n v ä h e n t ä m i s k e i n o j a + r i s k i o l o s u h t e i t a + r i s k i o p e r a a t i o i h i n + r i s k i p a i n o + r i s k i p a i n o t t e i s i s t a + r i s k i p a i n o t u s + r i s k i p a i n o t u s k ä y r ä s t ä + r i s k i p a l k k i o i d e n + r i s k i p a l k k i o t + r i s k i p a r a m e t r e i h i n + r i s k i p e l i ä + r i s k i p e r u s t e i s i a + r i s k i p e r u s t e i s t a + r i s k i p e r u s t e i t a + r i s k i p i s t e i t ä + r i s k i p i t o i s i m p a a n + r i s k i p o h j a i n e n + r i s k i p o h j a i s i a + r i s k i p o h j a i s t a + r i s k i p o t e n t i a a l i n + r i s k i p r e e m i o i d e n + r i s k i p r e e m i o i h i n + r i s k i p r e e m i o i n e e n + r i s k i p r e e m i o i s t a + r i s k i p r e e m i o i t a + r i s k i p r e e m i o t a + r i s k i p r e e m i o t o i m e t + r i s k i p r o f i i l e i h i n + r i s k i p r o f i i l e i s t a + r i s k i p r o f i i l e j a + r i s k i p r o f i i l i + r i s k i p r o f i i l i a + r i s k i p r o f i i l i n + r i s k i p r o j e k t i + r i s k i p ä ä o m a + r i s k i p ä ä o m a a + r i s k i p ä ä o m a a n + r i s k i p ä ä o m a j ä r j e s t e l m ä n + r i s k i p ä ä o m a j ä r j e s t e l m ä ä n + r i s k i p ä ä o m a k a n a v i e n + r i s k i p ä ä o m a k s i + r i s k i p ä ä o m a k u l t t u u r i + r i s k i p ä ä o m a k y s y m y k s e s s ä + r i s k i p ä ä o m a l l a + r i s k i p ä ä o m a l l e + r i s k i p ä ä o m a m a r k k i n a t + r i s k i p ä ä o m a m a r k k i n o i d e n + r i s k i p ä ä o m a m a r k k i n o i l l a + r i s k i p ä ä o m a m a r k k i n o i l l e + r i s k i p ä ä o m a m a r k k i n o i l t a + r i s k i p ä ä o m a m a r k k i n o i t a + r i s k i p ä ä o m a m a r k k i n o i t a a n + r i s k i p ä ä o m a n + r i s k i p ä ä o m a n a + r i s k i p ä ä o m a o h j e l m a + r i s k i p ä ä o m a o h j e l m a n + r i s k i p ä ä o m a o p e r a a t i o i d e n + r i s k i p ä ä o m a r a h a s t o a + r i s k i p ä ä o m a r a h a s t o i h i n + r i s k i p ä ä o m a r a h a s t o i l l e + r i s k i p ä ä o m a r a h a s t o i s t a + r i s k i p ä ä o m a r a h a s t o j a + r i s k i p ä ä o m a r a h a s t o j e n + r i s k i p ä ä o m a r a h a s t o l l e + r i s k i p ä ä o m a r a h a s t o t + r i s k i p ä ä o m a r a h o i t u k s e n + r i s k i p ä ä o m a r a h o i t u s t a + r i s k i p ä ä o m a r a h o i t u s t a k i n + r i s k i p ä ä o m a s i j o i t t a m i n e n + r i s k i p ä ä o m a s i j o i t u k s e t + r i s k i p ä ä o m a s i j o i t u k s i a + r i s k i p ä ä o m a s i j o i t u s t e n + r i s k i p ä ä o m a s t a + r i s k i p ä ä o m a t + r i s k i p ä ä o m a t e o l l i s u u d e n + r i s k i p ä ä o m a t o i m e t + r i s k i p ä ä o m a t o i m i e n + r i s k i p ä ä o m a t o i m i n t a a + r i s k i p ä ä o m a t o i m i n t a a n + r i s k i p ä ä o m a v a r o j a + r i s k i p ä ä o m a v ä l i n e + r i s k i p ä ä o m a v ä l i n e t t ä + r i s k i p ä ä o m a y r i t y k s e t + r i s k i p ä ä o m i a + r i s k i p ä ä o m i e n + r i s k i r a h a s t o + r i s k i r a h a s t o i h i n + r i s k i r a h a s t o i l l a + r i s k i r a h a s t o i l l e + r i s k i r a h a s t o i s t a + r i s k i r a h a s t o j a + r i s k i r a h a s t o j e n + r i s k i r a h a s t o o n + r i s k i r a h a s t o t + r i s k i r a h o i t u k s e e n + r i s k i r a h o i t u k s e s t a + r i s k i r a h o i t u s + r i s k i r a h o i t u s t a + r i s k i r a h o i t u s t u o t t e e t + r i s k i r a h o i t u s v ä l i n e + r i s k i r a i d e l i i k e n t e e l l e + r i s k i r a j a l l e + r i s k i r a j a n + r i s k i r a j o i l l a + r i s k i r a j o i s t a + r i s k i r a k e n t e e t + r i s k i r e a k t o r i + r i s k i r y h m i e n + r i s k i r y h m i i n + r i s k i r y h m i l l e + r i s k i r y h m i s s ä + r i s k i r y h m i s t ä + r i s k i r y h m i ä + r i s k i r y h m ä + r i s k i r y h m ä t + r i s k i r y h m ä ä + r i s k i r y h m ä ä n + r i s k i s e l v i t y s t ä + r i s k i s i j o i t t a j i e n + r i s k i s i j o i t u k s i a + r i s k i s i j o i t u s p ä ä o m a a + r i s k i s i j o i t u s p ä ä o m i e n + r i s k i s i j o i t u s r a h a s t o j e n + r i s k i s i j o i t u s r a h a s t o t + r i s k i s k e n a a r i o + r i s k i s t r a t e g i a t + r i s k i s t ä + r i s k i s u o j a u s r a h a s t o j a + r i s k i t + r i s k i t a a k k o j e n + r i s k i t a r k a s t u k s i a + r i s k i t a s a p a i n o a + r i s k i t a s o + r i s k i t a s o a + r i s k i t a s o i l l a + r i s k i t a s o j a + r i s k i t a s o n + r i s k i t a s o s t a + r i s k i t a s o t + r i s k i t a u l u k o n + r i s k i t e k i j ä + r i s k i t e k i j ä n + r i s k i t e k i j ä n ä + r i s k i t e k i j ä t + r i s k i t e k i j ä ä + r i s k i t e k i j ä ä n + r i s k i t e k i j ö i d e n + r i s k i t e k i j ö i s t ä + r i s k i t e k i j ö i t ä + r i s k i t e k n o l o g i a a n + r i s k i t i e t o i s u u d e n + r i s k i t i e t o i s u u t t a + r i s k i t i e t o l o m a k e j ä r j e s t e l m ä n + r i s k i t i e t o u d e n + r i s k i t i l a n t e e s s a + r i s k i t i l a n t e e t + r i s k i t i l a n t e i d e n + r i s k i t i l a n t e i t a + r i s k i t o i m i a + r i s k i t o i m i s t a + r i s k i t t ä + r i s k i t t ö m i ä + r i s k i t t ö m ä m p i i n + r i s k i t t ö m ä m p ä ä + r i s k i t u o t t e i d e n + r i s k i t u o t t e i t a + r i s k i t y y p p e i h i n + r i s k i t y y p p i + r i s k i t ö n t ä + r i s k i v a i k u t u k s i a + r i s k i v a k u u t u s + r i s k i v a k u u t u s t a + r i s k i v e r i + r i s k i v e r t a + r i s k i v i e s t i n n ä n + r i s k i v i e s t i n t ä + r i s k i v i e s t i n t ä j ä r j e s t e l m ä n + r i s k i y h t e i s k u n n a s s a m m e + r i s k i y r i t y s + r i s k i ä + r i s t e i l e v i e n + r i s t e i l y a l a l l a + r i s t e i l y a l u k s e l l a + r i s t e i l y a l u k s e n + r i s t e i l y a l u k s i a + r i s t e i l y a l u k s i i n + r i s t e i l y a l u k s i l l e + r i s t e i l y a l u s + r i s t e i l y a l u s t e m m e + r i s t e i l y a l u s t e n + r i s t e i l y m a t k a i l u n + r i s t e i l y m a t k u s t a j i e n + r i s t e i l y o h j u k s e t + r i s t e i l y o h j u s + r i s t e i l y o h j u s t e n + r i s t e i l y t e o l l i s u u s + r i s t e i l y v a u h d i n + r i s t e i l y v a u h t i n s a + r i s t e y k s e s s ä + r i s t e y s a s e m a + r i s t e y t y k s i l l e + r i s t e y t y s e l i n v o i m a + r i s t e y t y s v a a r a + r i s t i a a l l o k o s s a + r i s t i a a l l o k o s t a + r i s t i a m p u t a a t i o o n + r i s t i h ä m ä h ä k i t + r i s t i h ä m ä h ä k k i + r i s t i i n h y v ä k s y m i s t ä + r i s t i i n h y v ä k s y n n ä s t ä + r i s t i i n p ö l y t y s t ä + r i s t i i n r a h o i t u k s e l l e + r i s t i i n r a h o i t u k s e n + r i s t i i n r a h o i t u s + r i s t i i n r a h o i t u s j ä r j e s t e l m ä + r i s t i i n r a h o i t u s t a + r i s t i i n s u b v e n t i o i d e n + r i s t i i n t a r k a s t u k s e s s a + r i s t i i n t a r k a s t u k s i a + r i s t i i n t a r k a s t u s j ä r j e s t e l m ä n + r i s t i i n t a r k a s t u s m e n e t e l m ä ä + r i s t i i n t a r k a s t u s t a + r i s t i i n t a r k i s t e t a a n + r i s t i i n t u k e m i n e n + r i s t i i n t u k e m i s e e n + r i s t i i n t u k e m i s t a + r i s t i k k o m e r k k i + r i s t i k k ä i s i i n + r i s t i k k ä i s i ä + r i s t i k k ä i s r a h o i t u k s e n + r i s t i k k ä i s r a h o i t u s t a + r i s t i k k ä i s t u k e a + r i s t i k k ä i s t ä + r i s t i k o e + r i s t i k o r r e l a a t i o + r i s t i k u k k u l a + r i s t i k u u l u s t e l u a + r i s t i k u u l u s t e l u s s a + r i s t i k u u l u s t e l u u n + r i s t i l i m a s k a + r i s t i l i p p u + r i s t i l l ä + r i s t i n m e r k i n + r i s t i n o l l a + r i s t i n p ä i v ä + r i s t i n s y m b o l i a + r i s t i p i s t o t y ö + r i s t i p ö l y t y k s e n + r i s t i p ö l y t y k s e s t ä + r i s t i p ö l y t y s t ä + r i s t i r e s i s t e n s s i n + r i s t i r e t k e i l i j ö i t ä + r i s t i r e t k e k s i + r i s t i r e t k i v a l t i o + r i s t i r i i d a n + r i s t i r i i d a s s a + r i s t i r i i d a s t a + r i s t i r i i d a t + r i s t i r i i d a t o n + r i s t i r i i d a t t o m i a + r i s t i r i i d o i l l a + r i s t i r i i d o i s s a a n + r i s t i r i i d o i s t a + r i s t i r i i d o i t t a + r i s t i r i i t a + r i s t i r i i t a a + r i s t i r i i t a a n + r i s t i r i i t a i n e n + r i s t i r i i t a i n e n k i n + r i s t i r i i t a i s e e n + r i s t i r i i t a i s e l t a + r i s t i r i i t a i s e m p i + r i s t i r i i t a i s e m p i a + r i s t i r i i t a i s e n + r i s t i r i i t a i s e n a + r i s t i r i i t a i s e s t a + r i s t i r i i t a i s e s t i + r i s t i r i i t a i s e t + r i s t i r i i t a i s i a + r i s t i r i i t a i s i i n + r i s t i r i i t a i s i k s i + r i s t i r i i t a i s i l l e + r i s t i r i i t a i s i l t a + r i s t i r i i t a i s i m m i s t a + r i s t i r i i t a i s i s s a + r i s t i r i i t a i s t a + r i s t i r i i t a i s t e n + r i s t i r i i t a i s u u d e s t a + r i s t i r i i t a i s u u d e s t a a n + r i s t i r i i t a i s u u d e t + r i s t i r i i t a i s u u k s i a + r i s t i r i i t a i s u u k s i e n + r i s t i r i i t a i s u u k s i e n s a + r i s t i r i i t a i s u u k s i i n + r i s t i r i i t a i s u u k s i s t a + r i s t i r i i t a i s u u s + r i s t i r i i t a i s u u t e e n + r i s t i r i i t a i s u u t e e n s a + r i s t i r i i t a t a p a u k s e s s a + r i s t i r i i t a t a p a u k s i s s a + r i s t i r i i t a t i l a n n e + r i s t i r i i t a t i l a n n e t t a m m e + r i s t i r i i t a t i l a n t e e n + r i s t i r i i t a t i l a n t e e s e e n + r i s t i r i i t a t i l a n t e e s s a + r i s t i r i i t a t i l a n t e e t + r i s t i r i i t a t i l a n t e i l t a + r i s t i r i i t a t i l a n t e i s s a + r i s t i r i i t o i h i n + r i s t i r i i t o j a + r i s t i r i i t o j e m m e + r i s t i r i i t o j e n + r i s t i s a a r i + r i s t i s i i t o s + r i s t i s o r s a + r i s t i s u b v e n t i o + r i s t i s u b v e n t i o j ä r j e s t e l y j ä + r i s t i t u l e l l e + r i s t i t u l e s s a + r i s t i v i i t t a u k s e n + r i s t i v i i t t a u k s e t + r i s t i v i i t t a u k s i i n + r i s t i ä i s i s s ä + r i s u v i i l a k a l a + r i t a r i h a u k k a + r i t a r i h u o n e + r i t a r i k u n t a + r i t a r i m i t t a r i + r i t a r i p e r h o n e n + r i t a r i p e r h o s e t + r i t a r i r o m a a n i + r i t a r i t + r i t a r i t o k k o + r i t u a a l i m u r h i e n + r i t u a a l i n + r i t u a a l i n o m a i s e s t i + r i t u a a l i s u o r i t u s + r i t u a a l i t e u r a s t u k s e e n + r i t u a a l i t e u r a s t u k s e t + r i t u a a l i t e u r a s t u s + r i t u a a l i t e u r a s t u s t a + r i u k u a i t a + r i u t t a h a i k a r a + r i u t t a m u o d o s t e l m i l l a + r i u t t a p a k s u j a l k a + r i u t t a t i i r a + r i u t u a + r i v a k a m m i n + r i v e i s s ä + r i v e i s s ä m m e + r i v e j ä + r i v i e d u s t a j a t + r i v i e d u s t a j i n a + r i v i e k v i v a l e n s s i + r i v i j ä s e n e l t ä + r i v i j ä s e n e n ä + r i v i k a n s a n e d u s t a j i e n + r i v i m o o t t o r i + r i v i n l e t t o + r i v i t a l o + r i v i t a l o i s s a + r i v i v i r k a m i e s t ä + r o b o t t e j a + r o b o t t i r a t s a s t a j a + r o c k i e s + r o c k k o n s e r t t i e n + r o d u i s t a + r o d u l l i s e n + r o d u n + r o d u n j a l o s t u k s e n + r o d u n j a l o s t u s p e r i a a t t e i s t a + r o d u s t a + r o h d o s k ä y t t ö ö n + r o h d o s t e n + r o h k a i s e e + r o h k a i s e m a a n + r o h k a i s e m a l l a + r o h k a i s e m i s e k s i + r o h k a i s e m i s e s t a + r o h k a i s e m m e + r o h k a i s e n k i n + r o h k a i s e v a a + r o h k a i s e v a l t a + r o h k a i s e v a m p a a + r o h k a i s e v a m p i + r o h k a i s e v a m p i a + r o h k a i s e v a s s a + r o h k a i s e v a s t a + r o h k a i s e v a t + r o h k a i s e v i a + r o h k a i s e v i m m i s t a + r o h k a i s e v i m p i a + r o h k a i s e v i n t a + r o h k a i s e v i s t a + r o h k a i s i s i + r o h k a i s k a a m m e + r o h k a i s t a + r o h k a i s t a a n + r o h k a i s t a i s i i n + r o h k a i s t a k s e m m e + r o h k a i s t a k s e n i + r o h k a i s t a v a + r o h k a i s t u i m m e + r o h k a i s t u t t a v a + r o h k a i s u a + r o h k a i s u k s i + r o h k e a a + r o h k e a a n + r o h k e a k s i + r o h k e a m m a k s i + r o h k e a m m a n + r o h k e a m m a s t a + r o h k e a m m i k s i + r o h k e a m m i n + r o h k e a m p a a + r o h k e a m p i + r o h k e a m p i a + r o h k e a m p i a k i n + r o h k e a m p i e n + r o h k e a n + r o h k e a s s a + r o h k e a t + r o h k e i d e n + r o h k e i s i i n + r o h k e i t a + r o h k e n e e + r o h k e n e m a t t a + r o h k e n e m m e + r o h k e n e n + r o h k e n i s i k a a n + r o h k e u d e s t a + r o h k e u d e s t a a n + r o h k e u t t a + r o h m u t o k o t + r o h t o i m i k k ä + r o h t o k a l m o j u u r i + r o h t o k a t a j a + r o h t o k u i r i m o + r o h t o k ä ä r ö + r o h t o m e s i k k ä + r o h t o p e r n a r u o h o + r o h t o p ä h k ä m ö + r o h t o r a s t i + r o h t o r a u n i o y r t t i + r o h t o r a u t a y r t t i + r o h t o s a l k o r u u s u + r o h t o s a m m a k o n p u t k i + r o h t o s a p p i + r o h t o s o r m u s t i n k u k k a + r o h t o s u o p a y r t t i + r o h t o t ä d y k e + r o h t o v u o h e n h e r n e + r o i h a h t a n u t t a + r o i h u p u r k a u s + r o i k k u v a n s a + r o i s k i t a + r o i s k u t t a e s s a a n + r o i s t o h a l l i n t o j e n + r o i s t o j a + r o i s t o j e n + r o i s t o v a l i o t + r o i s t o v a l t i o + r o i s t o v a l t i o i d e n + r o i s t o v a l t i o i k s i + r o i s t o v a l t i o i l l e + r o i s t o v a l t i o i n a + r o i s t o v a l t i o i s t a + r o i s t o v a l t i o i t a + r o i s t o v a l t i o l l e + r o i s t o v a l t i o n + r o i s t o v a l t i o o n + r o i s t o v a l t i o t + r o j a l t i m a k s u i h i n + r o j a l t i m a k s u i s t a + r o j a l t i m a k s u j a + r o j a l t i m a k s u t + r o k k a r i l l e + r o k k i k o n s e r t t i + r o k k i k u k k o + r o k k o k o l i b r i + r o k k o r a s t a s + r o k k o r i n t a t i k k a n e n + r o k o t e a l o i t t e e s e e n + r o k o t e h a n k i n t a s o p i m u k s i s s a + r o k o t e h u o l t o a + r o k o t e p o l i t i i k k a + r o k o t e p o l i t i i k k a a n s a + r o k o t e t e o l l i s u u d e l t a + r o k o t e t i h e y s + r o k o t e t t u j e n + r o k o t e t u i s t a + r o k o t e t u o t a n n o n + r o k o t e t u t + r o k o t e t u t k i m u s + r o k o t e v a l m i s t a j a t + r o k o t e v a r a s t o a + r o k o t e v a r a s t o j a + r o k o t e v a r a s t o t + r o k o t e v i r u k s e n + r o k o t t a m a t t a + r o k o t t a m a t t o m i l l e + r o k o t t a m a t t o m u u s p o l i t i i k k a a + r o k o t t a m i s e n + r o k o t t a m i s k u s t a n n u k s i s t a + r o k o t t a m i s k ä y t ä n t ö + r o k o t t a m i s t a + r o k o t t e i d e n + r o k o t t e i s s a + r o k o t t e i t a + r o k o t u k s e s t a + r o k o t u k s e t + r o k o t u k s i a + r o k o t u k s i l l a + r o k o t u k s i s t a + r o k o t u s a s t e e n + r o k o t u s h u i j a u s + r o k o t u s j ä r j e s t e l m ä + r o k o t u s j ä r j e s t e l m ä s s ä + r o k o t u s k a m p a n j a + r o k o t u s k a m p a n j a a + r o k o t u s k a m p a n j a l l a + r o k o t u s k a m p a n j a l l e + r o k o t u s k a m p a n j a n + r o k o t u s k a m p a n j o i d e n + r o k o t u s k a m p a n j o i h i n + r o k o t u s k a m p a n j o i l l e + r o k o t u s k a m p a n j o i t a + r o k o t u s k a t t a v u u t e e n + r o k o t u s k e s k u s t e l u u n + r o k o t u s k i e l l o n + r o k o t u s k i e l l o s t a + r o k o t u s k o r t i n + r o k o t u s k o r t t i + r o k o t u s k u s t a n n u k s e t + r o k o t u s k y s y m y k s e e n + r o k o t u s k y s y m y k s e s t ä + r o k o t u s k ä y t ä n t ö j e n + r o k o t u s k ä y t ä n t ö j ä + r o k o t u s m a h d o l l i s u u s + r o k o t u s m e n e t e l m i ä + r o k o t u s m e n e t e l m ä + r o k o t u s m e n e t t e l y j ä + r o k o t u s o h j e l m a + r o k o t u s o h j e l m a a + r o k o t u s o h j e l m a l l e + r o k o t u s o h j e l m a n + r o k o t u s o h j e l m i a + r o k o t u s o h j e l m i e n + r o k o t u s o h j e l m i i n + r o k o t u s o h j e l m i l l a + r o k o t u s o h j e l m i l l e + r o k o t u s p o l i t i i k a n + r o k o t u s p o l i t i i k k a + r o k o t u s p o l i t i i k k a a + r o k o t u s p o l i t i i k k a a m m e + r o k o t u s p o l i t i i k k a a n + r o k o t u s p r o s e s s i + r o k o t u s p r o s e s s i s s a + r o k o t u s p ä i v i ä + r o k o t u s r e n k a a n + r o k o t u s r u t i i n i a + r o k o t u s s t r a t e g i a a + r o k o t u s s t r a t e g i a a m m e + r o k o t u s s t r a t e g i a n + r o k o t u s s t r a t e g i a s t a + r o k o t u s s t r a t e g i o i d e n + r o k o t u s s t r a t e g i o i t a + r o k o t u s s u o s i t u k s e t + r o k o t u s s u u n n i t e l m a + r o k o t u s s ä ä n n ö t + r o k o t u s s ä ä n t ö j ä + r o k o t u s t a + r o k o t u s t e n + r o k o t u s t o d i s t u k s i a + r o k o t u s t o i m i i n + r o m a a n e i s t a + r o m a a n i v a s t a i s i a + r o m a a n i v ä h e m m i s t ö j e n + r o m a h d u k s e n + r o m a h d u k s e s t a + r o m a h d u k s e t + r o m a h d u s h ä i r i ö n + r o m a h d u s r i s k e i l t ä + r o m a h d u s v a a r a s s a + r o m a h d u t t a a + r o m a h t a a + r o m a h t a e s s a + r o m a h t a m a a n + r o m a h t a m a i s i l l a a n + r o m a h t a m a s s a + r o m a h t a m a t t a + r o m a h t a m i s e k s i + r o m a h t a m i s e s t a + r o m a h t a m i s p i s t e e s s ä + r o m a h t a n e e t + r o m a h t a n e i s i i n + r o m a h t a n u t + r o m a h t i + r o m a h t i v a t + r o m a n e i h i n + r o m a n e i l l a + r o m a n e i l l e + r o m a n e i s t a + r o m a n e j a + r o m a n i a a + r o m a n i a a n + r o m a n i a l a i s e t + r o m a n i a l a i s i a + r o m a n i a l a i s i l l e + r o m a n i a l a i s i s t a + r o m a n i a l a i s j o u k o t + r o m a n i a l a i s j ä s e n t e n + r o m a n i a l a i s k o l l e g o i l l e e n + r o m a n i a l a i s l a p s i a + r o m a n i a l a i s l a s t e n + r o m a n i a l a i s n a i s e t + r o m a n i a l a i s r i k o l l i s i a + r o m a n i a l a i s s y n t y i s e n + r o m a n i a l a i s t e n + r o m a n i a l a i s t y t t ö + r o m a n i a l a i s v ä h e m m i s t ö n + r o m a n i a l a i s y h t e i s ö i l l e + r o m a n i a l a i s y h t e i s ö n + r o m a n i a l k u p e r ä ä + r o m a n i a l l a + r o m a n i a l l e + r o m a n i a l o i t e t t a + r o m a n i a n + r o m a n i a n k i e l i s e n + r o m a n i a n k i n + r o m a n i a n p a i m e n k o i r a + r o m a n i a s i a + r o m a n i a s i a a n + r o m a n i a s i o i d e n + r o m a n i a s i o i s s a + r o m a n i a s s a + r o m a n i a s t a + r o m a n i a s u t u k s e t + r o m a n i a v u s t a j a + r o m a n i e n + r o m a n i e n v a s t a i s i i n + r o m a n i e n v a s t a i s t a + r o m a n i f o b i a + r o m a n i f o o r u m i + r o m a n i f o o r u m i n + r o m a n i g e t t o j e n + r o m a n i h a n k e + r o m a n i h a n k k e i l l e + r o m a n i h a n k k e i t a + r o m a n i h e n k i l ö s t ö ä + r o m a n i h ä t ä t i l a + r o m a n i h ä t ä t i l a k s i + r o m a n i j ä r j e s t ö j e n + r o m a n i j ä s e n + r o m a n i j ä s e n e n + r o m a n i j ä s e n e n ä + r o m a n i j ä s e n i ä + r o m a n i j ä s e n t ä + r o m a n i k a n s a a + r o m a n i k a n s a l a i s e t + r o m a n i k a n s a l a i s i a + r o m a n i k a n s a l a i s t a + r o m a n i k a n s a l a i s t e n + r o m a n i k a n s a n + r o m a n i k e s k u s t e l u a + r o m a n i k i e l e s t ä + r o m a n i k i e l i + r o m a n i k o n f e r e n s s i a + r o m a n i k o u l u j a + r o m a n i k u l t t u u r i a + r o m a n i k y s y m y k s e e n + r o m a n i k y s y m y k s e n + r o m a n i k y s y m y k s e s s ä + r o m a n i k y s y m y k s e s t ä + r o m a n i k y s y m y k s e t + r o m a n i k y s y m y k s i ä + r o m a n i k y s y m y s + r o m a n i k y s y m y s t ä + r o m a n i l a p s e t + r o m a n i l a p s i + r o m a n i l a p s i a + r o m a n i l a p s i i n + r o m a n i l a p s i l l e + r o m a n i l a p s i s t a + r o m a n i l a s t a + r o m a n i l a s t e n + r o m a n i l e i r e i h i n + r o m a n i l e i r e i l l e + r o m a n i l e i r e i l l ä + r o m a n i l e i r e i s s ä + r o m a n i l e i r e j ä + r o m a n i l e i r i + r o m a n i l e i r i e n + r o m a n i l e i r i l l ä + r o m a n i l e i r i n + r o m a n i l e i r i t + r o m a n i l u o k i s s a + r o m a n i m i e h e t + r o m a n i n a i n e n + r o m a n i n a i s e n + r o m a n i n a i s e t + r o m a n i n a i s i a + r o m a n i n a i s i i n + r o m a n i n a i s i l l a + r o m a n i n a i s i l l e + r o m a n i n a i s i s t a + r o m a n i n a i s t e n + r o m a n i n u o r e t + r o m a n i o h j e l m a + r o m a n i o n g e l m a + r o m a n i o n g e l m a a + r o m a n i o n g e l m a a n + r o m a n i o n g e l m a n + r o m a n i o p i s k e l i j o i t a + r o m a n i p e r h e i d e n + r o m a n i p e r h e i t ä + r o m a n i p e r h e t t ä + r o m a n i p o l i t i i k a n + r o m a n i p o l i t i i k k a + r o m a n i p o l i t i i k k a a + r o m a n i p o t i l a i s t a + r o m a n i p ä i v ä + r o m a n i p ä i v ä k s i + r o m a n i p ä i v ä ä + r o m a n i p ä i v ä ä n + r o m a n i r i k o l l i s i i n + r o m a n i r y h m i e n + r o m a n i r y h m i s s ä + r o m a n i s i i r t o l a i s e t + r o m a n i s i v i i l i e n + r o m a n i s t r a t e g i a + r o m a n i s t r a t e g i a a + r o m a n i s t r a t e g i a a n + r o m a n i s t r a t e g i a n + r o m a n i s t r a t e g i a n s a + r o m a n i s t r a t e g i a s s a + r o m a n i s t r a t e g i a s t a + r o m a n i s t r a t e g i o i d e n + r o m a n i s t r a t e g i o i t a + r o m a n i s ä ä t i ö n + r o m a n i t + r o m a n i t a p a a m i s e n + r o m a n i t a u s t a i s i l l e + r o m a n i t y t t ö + r o m a n i t y t t ö j e n + r o m a n i t y t ö t + r o m a n i t y ö n t e k i j ö i t ä + r o m a n i t y ö r y h m ä + r o m a n i t y ö r y h m ä n + r o m a n i v a l t i o n + r o m a n i v a s t a i n e n + r o m a n i v a s t a i s e n + r o m a n i v a s t a i s i a + r o m a n i v a s t a i s t a + r o m a n i v a s t a i s u u d e n + r o m a n i v a s t a i s u u d e s t a + r o m a n i v a s t a i s u u s + r o m a n i v a s t a i s u u t t a + r o m a n i v e l j i e m m e + r o m a n i v u o s i k y m m e n + r o m a n i v ä e s t ö + r o m a n i v ä e s t ö l l e + r o m a n i v ä e s t ö l l ä + r o m a n i v ä e s t ö n + r o m a n i v ä e s t ö s s ä + r o m a n i v ä e s t ö s t ä + r o m a n i v ä e s t ö ä + r o m a n i v ä e s t ö ö n + r o m a n i v ä h e m m i s t ö + r o m a n i v ä h e m m i s t ö i h i n + r o m a n i v ä h e m m i s t ö i l l e + r o m a n i v ä h e m m i s t ö j e n + r o m a n i v ä h e m m i s t ö l l e + r o m a n i v ä h e m m i s t ö n + r o m a n i v ä h e m m i s t ö s t ä + r o m a n i v ä h e m m i s t ö ä + r o m a n i v ä h e m m i s t ö ö n + r o m a n i y h t e i s ö + r o m a n i y h t e i s ö i h i n + r o m a n i y h t e i s ö i l l e + r o m a n i y h t e i s ö i l l ä + r o m a n i y h t e i s ö i s s ä + r o m a n i y h t e i s ö i s t ä + r o m a n i y h t e i s ö j e n + r o m a n i y h t e i s ö j ä + r o m a n i y h t e i s ö l l e + r o m a n i y h t e i s ö l l ä + r o m a n i y h t e i s ö n + r o m a n i y h t e i s ö s s ä + r o m a n i y h t e i s ö s t ä + r o m a n i y h t e i s ö t + r o m a n i y h t e i s ö ä + r o m a n i y h t e i s ö ö n + r o m a n s s i h u i j a u s + r o m a n t i i k k a a + r o m a n t t i s e e n + r o m a n t t i s e m p i + r o m a n t t i s e m p i a + r o m m i a l a + r o m m i a l a n + r o m m i n + r o m m i n t u o t a n n o s t a + r o m m i n t u o t t a j i l l e + r o m m i p u l l o a + r o m m i p ä i v ä k i r j a + r o m m i s t a + r o m m i t e o l l i s u u d e n + r o m m i t o t i + r o m u a + r o m u a j o n e u v o + r o m u a j o n e u v o a s e t u k s e n + r o m u a j o n e u v o d i r e k t i i v i + r o m u a j o n e u v o d i r e k t i i v i i n + r o m u a j o n e u v o d i r e k t i i v i n + r o m u a j o n e u v o d i r e k t i i v i s s ä + r o m u a j o n e u v o i s t a + r o m u a j o n e u v o j a + r o m u a j o n e u v o j e n + r o m u a j o n e u v o t + r o m u a l u k s e t + r o m u a l u k s i a + r o m u a u t o a s e t u s + r o m u a u t o d i r e k t i i v i s s ä + r o m u i h i n + r o m u i n a + r o m u k a u p p i a i k s i + r o m u k o p p a a n + r o m u k s i + r o m u l a i v o i s t a + r o m u l e l u n + r o m u m e t a l l i s t a + r o m u n + r o m u r a l l i + r o m u r e a k t o r e i t a + r o m u r e a k t o r i + r o m u r e a k t o r i a + r o m u s t a + r o m u t e t a a n + r o m u t e t t a i s i i n + r o m u t e t t a v a + r o m u t e t t a v a k s i + r o m u t e t t a v i a + r o m u t e t t a v i e n + r o m u t t a a + r o m u t t a m a l l a + r o m u t t a m a s s a + r o m u t t a m i s e e n + r o m u t t a m i s e k s i + r o m u t t a m i s e n + r o m u t t a m i s e s t a + r o m u t t a m i s j ä r j e s t e l m i i n + r o m u t t a m i s p a l k k i o s t a + r o m u t t a m i s t o i m i e n + r o m u t t a m i s t u k e a + r o m u t t a m o i l l e + r o m u t t a m o t + r o m u t t a v a t + r o m u t t a v i e n + r o m u t t u m a s s a + r o m u t t u v a t + r o m u t u k s e e n + r o m u t u s j ä r j e s t e l m i ä + r o m u t u s j ä r j e s t e l m ä t + r o m u t u s k a n n u s t i m e t + r o m u t u s m a k s u t + r o m u t u s o h j e l m a a + r o m u t u s o h j e l m a n + r o m u t u s o h j e l m a t + r o m u t u s o p e r a a t i o n + r o m u t u s p a l k k i o + r o m u t u s p a l k k i o i d e n + r o m u t u s p a l k k i o i t a + r o m u t u s p a l k k i o n + r o m u t u s p a l k k i o t + r o m u t u s p o l i t i i k a l l e + r o m u t u s r a h a s t o + r o m u t u s r a h a s t o n + r o m u t u s r y h m ä + r o m u t u s t e k n i i k k a + r o m u t u s t y ö t ä + r o m u t u s u u d i s t u s t a + r o m u t u s v a a t i m u k s e n + r o m u v u o r e s t a + r o n c h i n + r o o l e i s t a + r o o l e j a + r o o l e j a m m e + r o o l i a + r o o l i a a n + r o o l i a m m e + r o o l i i m m e + r o o l i i n + r o o l i j a k o a + r o o l i j a o n + r o o l i k y s y m y k s e e n + r o o l i l l e + r o o l i m a l l e i h i n + r o o l i m a l l e i k s i + r o o l i m a l l e i n a + r o o l i m a l l e i n a m m e + r o o l i m a l l e j a + r o o l i m a l l i + r o o l i m a l l i e n + r o o l i m a l l i n + r o o l i m a l l i n a + r o o l i m a l l i t + r o o l i m m e + r o o l i n + r o o l i n n e + r o o l i n s a + r o o l i p e l i + r o o l i p e l i k s i + r o o l i p e l i s u u n n i t t e l i j o i s t a + r o o l i s s a + r o o l i s t a + r o o l i s t a a n + r o o l i s t a m m e + r o o l i t + r o o m a l a i s e n + r o o m a l a i s e t + r o o m a l a i s i a + r o o m a l a i s k a t o l i l a i s e n + r o o m a l a i s k a t o l i l a i s i a + r o o m a l a i s k a t o l i n e n + r o o m a l a i s k a t o l i s e e n + r o o m a l a i s k a t o l i s e l l e + r o o m a l a i s k a t o l i s e n + r o o m a l a i s k a t o l i s e t + r o o m a l a i s k a t o l i s i a + r o o m a l a i s k a t o l i s t a + r o o m a l a i s k a t o l i s t e n + r o o m a l a i s l i n n o i t u s + r o o m a l a i s t a + r o q u e f o r t j u u s t o + r o s k a k o p p a a n + r o s k a k o r e j a + r o s k a k o r i + r o s k a k o r i a + r o s k a k o r i i n + r o s k a k r i i s e i s t ä + r o s k a l a a t i k k o o n + r o s k a l a i n a + r o s k a l e h d i s t ö n + r o s k a l e h t i e n + r o s k a l u o t o t + r o s k a p a n k k i + r o s k a p a n k k i e n + r o s k a p o s t i + r o s k a p o s t i a + r o s k a p o s t i k y s y m y s t ä + r o s k a p o s t i l t a + r o s k a p o s t i o h j e l m a + r o s k a p o s t i o h j e l m i s t a + r o s k a p o s t i s t a + r o s k a p o s t i s u o d a t u s + r o s k a p o s t i t + r o s k a p o s t i v i e s t i e n + r o s k a p o s t i v i e s t i ä + r o s k a p u h e i t a + r o s k a r o m a a n i + r o s k a r u o a l l e + r o s k a r u o a n + r o s k a r u o k a + r o s k a r u o k a a + r o s k a r u u a n + r o s k a s a k k i + r o s k a s ä i l i ö ö n + r o s k a t e l e v i s i o + r o s k a t i e d e + r o s k a t i e t e e n + r o s k a t u n k i o l l e + r o s k a v i e s t i n t ä ä + r o s k i i n + r o s o p y ö r i ä i n e n + r o s s i n m e r i + r o s s i n s a a r i + r o s v o h a u k k a + r o s v o j o u k k o j a + r o s v o k a r d i n a a l i + r o s v o k a u p u n k i + r o s v o k o p l a t + r o s v o k o t i n g a + r o s v o k o t k a + r o s v o m u u r a + r o s v o n n e e t + r o s v o p a r o n i + r o s v o p a r o n i e n + r o s v o r a s t u l i + r o s v o s o t a + r o s v o v a l t i o i t a + r o s v o v a l t i o k s i + r o t a a t i o j ä r j e s t e l m ä + r o t a a t i o j ä r j e s t e l m ä n + r o t a a t i o k ä y r ä + r o t a a t i o m a l l i + r o t a a t i o m e n e t e l m ä ä + r o t a a t i o p a i n o + r o t a a t i o p e r i a a t e t t a + r o t a v i r u s r o k o t e + r o t k o j a l o h a u k k a + r o t k o l a u l u m e s i k k o + r o t k o l e m m i k k i + r o t k o m e t s ä k e r t t u n e n + r o t k o p u n a v a r p u n e n + r o t t a j a h t i + r o t t a k u n i n g a s + r o t t a k ä ä r m e e t + r o t t a r a l l i + r o t t i n k i r a i p a l l a + r o t u a s e t u k s e n + r o t u d i r e k t i i v i + r o t u d i r e k t i i v i n + r o t u d i r e k t i i v i n k i n + r o t u e n n a k k o l u u l o j a + r o t u e n n a k k o l u u l o t + r o t u e r i m i e l i s y y k s i ä + r o t u e r o t t e l u + r o t u e r o t t e l u a + r o t u e r o t t e l u h a l l i n t o + r o t u e r o t t e l u j ä r j e s t e l m ä + r o t u e r o t t e l u j ä r j e s t e l m ä ä + r o t u e r o t t e l u m u u r i + r o t u e r o t t e l u m u u r i n + r o t u e r o t t e l u p o l i t i i k a n + r o t u e r o t t e l u u n + r o t u h y g i e e n i k o t k i n + r o t u h y g i e n i a a + r o t u j a + r o t u j a o s t a + r o t u j e n + r o t u k i i s t o j e n + r o t u l a i n s ä ä d ä n t ö ä + r o t u l a i t + r o t u l a k i e n + r o t u m e l l a k a k s i + r o t u m e l l a k o i k s i + r o t u m u r h a n + r o t u m ä ä r i t e l m ä + r o t u n s a + r o t u s o r r o n + r o t u s o r t o a + r o t u s o r t o h a l l i t u s t a + r o t u s o r t o p o l i t i i k k a + r o t u s y r j i n n ä k s i + r o t u s y r j i n n ä l l e + r o t u s y r j i n n ä n + r o t u s y r j i n n ä s t ä + r o t u s y r j i n t ä + r o t u s y r j i n t ä a j a n + r o t u s y r j i n t ä ä + r o t u s y r j i n t ä ä n + r o t u u n + r o t u v a i n o t + r o t u v i h a + r o t u v i h a a + r o t u v i h a a n + r o t u v i h a n + r o t u v i h a r i k o l l i s u u d e n + r o t u v i h a s t a + r o t u v ä k i v a l l a n + r o t u v ä k i v a l t a + r o t u v ä k i v a l t a a + r o t u v ä k i v a l t a a n + r o u s k u t t a a + r o v i o i t a + r u a n d a a + r u a n d a n + r u b i i n i h i p p i ä i n e n + r u b i i n i h o h t o k o l i b r i + r u b i i n i h u u l i k a l a + r u b i i n i k o l i b r i + r u b i i n i k o r u a h v e n + r u b i i n i k u r k k u k o l i b r i + r u b i i n i k ä ä p i ö a h v e n + r u b i i n i m e s i k k o + r u b i i n i r a p u t o k k o + r u b i i n i s a t a k i e l i + r u b i i n i t e t r a + r u d i m e n t i t + r u g b y a l u e e l l a + r u g b y j o u k k u e e n + r u g b y l i i g a s s a + r u g b y l i i t t o + r u g b y o t t e l u i t a + r u g b y p a l l o n + r u g b y s e u r a n i + r u g b y v o i t o n + r u h o j a + r u h o j a u h e e n + r u h o n l u o k i t t e l u j ä r j e s t e l m ä n + r u h o t y y p p e j ä + r u h t i n a a l l i s i m m a t + r u h t i n a s p i i s p a + r u i s a l a a + r u i s k a u n o k k i + r u i s k e i t a + r u i s k u j e n + r u i s k u t + r u i s k u t u s l a i t t e i d e n + r u i s k u v a l u k o n e + r u i s l e i p ä + r u i s l e i p ä ä + r u i s u n i k k o + r u i s v i r n a + r u k o i l k a a m m e + r u k o i l t i i n + r u k o i l u m a h d o l l i s u u k s i i n + r u k o u s a a m i a i n e n + r u k o u s a a m i a i s e l l a + r u k o u s h u o n e e t + r u k o u s k e s k u k s i s s a + r u k o u s k o k o u k s e e n + r u k o u s n a u h a + r u k o u s p a i k a t + r u k o u s p y ö r ä n + r u k o u s p ä i v ä n + r u l e t t i p ö y t i i n + r u l l a f i l m i + r u l l a h i i h t o + r u l l a k i e k k o + r u l l a l u i s t e l u + r u l l a m u o v a u s + r u l l a t u r v a v y ö t + r u l l a u s a i k a a + r u m a a + r u m a s t a + r u m i k s i + r u m p a l i r ä i k k ä + r u m p a l i t y t t ö + r u m p u j a r r u + r u m p u k a p u l a + r u m p u k o n e + r u m p u m u i s t i + r u m p u s e t t i + r u m p u s o o l o + r u n g o n + r u n k o k u l j e t u k s i a + r u n k o r a k e n t e e n + r u n o i l i j a a + r u n o i l i j a n + r u n o i l u a + r u n o i l u s t a + r u n o j a + r u n o k i r j a + r u n o k i r j a t + r u n o k o l i b r i + r u n o l l i s e k s i + r u n o l l i s i a + r u n o l l i s i l t a + r u n o t y t t ö + r u n o u d e s t a + r u n s a a l l a + r u n s a a m m a n + r u n s a a m p a a + r u n s a a m p i + r u n s a a m p i a + r u n s a a t + r u n s a i d e n + r u n s a i t a + r u n s a s k ä t i s t ä + r u n s a s l u k u i s e m p a n a + r u n s a s l u k u i s e n a + r u n s a s l u k u i s e s t i + r u n s a s l u k u i s e t + r u n s a s l u k u i s i n a + r u n s a s l u k u i s t e n + r u n s a s s a t o i s i a + r u n s a s t a + r u n s a s v ä e s t ö i s t e n + r u n s a s v ä k i s i m m i s t ä + r u n s a s v ä k i s i m m ä s s ä + r u n s a s v ä k i s i m m ä t + r u n s a s v ä k i s i m p ä ä n + r u n s a s v ä k i s i n + r u n t e l e m a k s i + r u n t e l e m a l l a + r u n t e l e m a t + r u o a k s i + r u o a n + r u o a n h i m o + r u o a n j a k e l u + r u o a n j a k e l u a + r u o a n j a k e l u k e s k u k s i i n + r u o a n j a k e l u o h j e l m i a + r u o a n j a l o s t a j i i n + r u o a n j a l o s t u s t e o l l i s u u d e n + r u o a n l ä h t e i t ä + r u o a n p u u t t e e n + r u o a n p u u t t e e s t a + r u o a n s a a n n i n + r u o a n s u l a t u s j ä r j e s t e l m ä ä n + r u o a n s u l a t u s k a n a v a + r u o a n s u l a t u s k a n a v a n + r u o a n s u l a t u s s a i r a u k s i i n + r u o a n t a r p e e s t a a n + r u o a n t u o t a n n o l l e + r u o a n t u o t a n n o n + r u o a n t u o t a n n o s t a + r u o a n t u o t a n t o + r u o a n t u o t a n t o a + r u o a n t u o t a n t o m m e + r u o a n t u o t a n t o o n + r u o a n t u o t a n t o t a p a a + r u o a n t u o t t a j a t + r u o a n t ä h t e i d e n + r u o a n v a l m i s t a j a t + r u o a s s a + r u o a s t a + r u o d i m m e + r u o h i k k o k i r v i n e n + r u o h i k k o k i u r u + r u o h i k k o l i v e r t ä j ä + r u o h i k k o p y y j u o k s i j a + r u o h i k k o r u u s u p e i p p o + r u o h i k o l l a + r u o h o k a n u k k a + r u o h o k a r p p i + r u o h o k a s k a s + r u o h o l e i k k u r i d i r e k t i i v i + r u o h o m e t s ä k e r t t u n e n + r u o h o n a p s i j a + r u o h o n j u u r i t a s o + r u o h o n j u u r i t a s o a + r u o h o n j u u r i t a s o l l a + r u o h o n j u u r i t a s o l l e + r u o h o n j u u r i t a s o l t a + r u o h o n j u u r i t a s o n + r u o h o n j u u r i t a s o n v a s t a i s t a + r u o h o n j u u r i t a s o s t a + r u o h o n j u u r i t a s o t y ö n + r u o h o n k o r r e s t a + r u o h o n l e i k k a a j a + r u o h o n l e i k k u r i + r u o h o n l e i k k u r i p e r i a a t t e e l l a + r u o h o p ö l l ö + r u o h o r a v i n t o a + r u o h o s e l j a + r u o h o v a r s i + r u o k a a + r u o k a a n + r u o k a e p i d e m i o i t a + r u o k a h a l u + r u o k a h u i p p u k o k o u k s e e n + r u o k a h u o l l o n + r u o k a h u o l t o a + r u o k a h u o l t o o n + r u o k a h ä t ä a p u + r u o k a i l u p o l i t i i k a s t a + r u o k a i l u t a p o i h i n + r u o k a i l u t a p o j a + r u o k a i l u t a p o j e n + r u o k a i l u t a v o i s t a + r u o k a i l u t o t t u m u k s e n s a + r u o k a i l u t o t t u m u k s e t + r u o k a i l u t o t t u m u k s i a + r u o k a i l u t o t t u m u k s i a a n + r u o k a i l u t o t t u m u k s i i n + r u o k a i l u t o t t u m u k s i l l a + r u o k a i l u t o t t u m u k s i s s a + r u o k a i l u t o t t u m u k s i s t a + r u o k a i l u t o t t u m u s t e n + r u o k a i l u t o t t u m u s t e n i + r u o k a j ä t e + r u o k a j ä t e o n g e l m a a n + r u o k a j ä t e t t ä + r u o k a j ä t t e e l l ä + r u o k a j ä t t e e n + r u o k a j ä t t e e s e e n + r u o k a j ä t t e e s t ä + r u o k a j ä t t e e t + r u o k a j ä t t e i d e n + r u o k a j ä t t e i t ä + r u o k a k a l a k a n t o j e n + r u o k a k a l a l a j i a + r u o k a k a l a l a j i s t a + r u o k a k a l a l a j i t + r u o k a k a l a s t a + r u o k a k a l a t + r u o k a k a l o j e n + r u o k a k a s v e i s t a + r u o k a k a s v i e n + r u o k a k a s v i t u o t a n n o n + r u o k a k a u p o i s s a + r u o k a k a u p p a l a s k u + r u o k a k a u p p o j a + r u o k a k e t j u a + r u o k a k e t j u j e n + r u o k a k e t j u n + r u o k a k e t j u s s a + r u o k a k e t j u s t a + r u o k a k e t j u u n + r u o k a k o r i s t a + r u o k a k r i i s e i h i n + r u o k a k r i i s e i s s ä + r u o k a k r i i s i + r u o k a k r i i s i i n + r u o k a k r i i s i n + r u o k a k r i i s i s s ä + r u o k a k r i i s i s t ä + r u o k a k r i i s i t + r u o k a k r i i s i ä + r u o k a k u l t t u u r e j a + r u o k a k u l t t u u r i i n + r u o k a k u l u i s s a + r u o k a l a h j o i t u k s i s t a + r u o k a l a i n s ä ä d ä n t ö ä + r u o k a l a j i a + r u o k a l a k o s s a + r u o k a l a k u l u i s t a + r u o k a l a s k u i h i n + r u o k a l i s t o i s t a + r u o k a m a i n o n t a + r u o k a m a r k k i n o i l l a + r u o k a m a r k k i n o i l l e + r u o k a m e l l a k o i s t a + r u o k a m e l l a k o i t a + r u o k a m e n o j e n + r u o k a m e n o t + r u o k a m e r i s i i l i + r u o k a m e r k i n n ö i s t ä + r u o k a m i e l t y m y k s i ä + r u o k a m o n o p o l i n + r u o k a m y r k y t y k s e e n + r u o k a m y r k y t y k s e n + r u o k a m y r k y t y k s i ä + r u o k a m y r k y t y s + r u o k a m y r k y t y s t a p a u k s e s t a + r u o k a m y r k y t y s t e n + r u o k a m y r k y t y s t ä + r u o k a n s a + r u o k a o h j e l m a + r u o k a o h j e l m a n + r u o k a o h j e l m a s t a + r u o k a o h j e l m a t + r u o k a o h j e l m i i n + r u o k a o l i i v e j a + r u o k a o l i i v i e n + r u o k a o l i i v i s e k t o r i + r u o k a o n g e l m a a + r u o k a o n g e l m a n + r u o k a o n g e l m i e n + r u o k a o s t o k s i a + r u o k a o s u u s k u n t i e n + r u o k a p a i k k o j a + r u o k a p a k e t t e j a + r u o k a p a k k a u s t e n + r u o k a p a n k i n + r u o k a p a n k k i + r u o k a p e r i n t e i d e n + r u o k a p e r i n t e i l l e m m e + r u o k a p e r i n t e i s i i n + r u o k a p e r i n t e i s i i n s ä + r u o k a p e r i n t e i t ä ä n + r u o k a p e r u n a a n + r u o k a p e r u n a n + r u o k a p o l i t i i k k a + r u o k a p o l i t i i k k a a + r u o k a p u l a + r u o k a p u l a a + r u o k a p u l a a n + r u o k a p u l a n + r u o k a p u l a s t a + r u o k a p ö y d i s s ä + r u o k a p ö y d ä l l ä m m e + r u o k a p ö y d ä s s ä + r u o k a p ö y t i i m m e + r u o k a p ö y t ä ä n + r u o k a r a h a s t o n + r u o k a r a s v a t + r u o k a r e k k o j e n + r u o k a s a a r e l t a + r u o k a s i e n i + r u o k a s k a n d a a l i e n + r u o k a s k a n d a a l i t + r u o k a s u u n n i t t e l u + r u o k a s u v e r e n i t e e t i n + r u o k a s u v e r e n i t e e t t i + r u o k a t a b u + r u o k a t a r p e i t a + r u o k a t a r v e + r u o k a t a r v i k k e i t a + r u o k a t a u k o j a + r u o k a t a v a r a k e t j u n + r u o k a t i l a n t e e l l e + r u o k a t o i m i t u k s e t + r u o k a t o i m i t u k s i i n + r u o k a t o i m i t u s t e n + r u o k a t u l v a n + r u o k a t u o t a n n o n + r u o k a t u o t a n t o a + r u o k a t u o t t e i t a + r u o k a t u r v a + r u o k a t u r v a a + r u o k a t u r v a a n + r u o k a t u r v a a n s a + r u o k a t u r v a k u m p p a n u u s + r u o k a t u r v a l a a t i k k o + r u o k a t u r v a l l i s u u d e n + r u o k a t u r v a l l i s u u s + r u o k a t u r v a l l i s u u s l a i n s ä ä d ä n t ö + r u o k a t u r v a l l i s u u s v i r a s t o + r u o k a t u r v a l l i s u u t e e n + r u o k a t u r v a l l i s u u t t a + r u o k a t u r v a n + r u o k a t u r v a s t a a n + r u o k a t u t k i m u s + r u o k a v a j e t t a + r u o k a v a l i n t o j a a n + r u o k a v a l i o + r u o k a v a l i o k ä y t t ä y t y m i n e n + r u o k a v a l i o n + r u o k a v a l i o o n + r u o k a v a l i o s t a a n + r u o k a v a l i o t a + r u o k a v a l i o v a a t i m u k s i a + r u o k a v a l l a n k u m o u k s e s t a + r u o k a v a r a n t o j e n + r u o k a v a r a s t o i h i n + r u o k a v a r a s t o j a + r u o k a v a r a s t o j e n + r u o k a v a r o i n + r u o k a v a r o i s t a + r u o k a v i l j o j e n + r u o k a v u o r i a + r u o k a v u o r i i n + r u o k a v u o r i s t a + r u o k a y l i j ä ä m ä ä + r u o k a y m p y r ä + r u o k a ö l j y + r u o k a ö l j y i h i n + r u o k a ö l j y j e n + r u o k a ö l j y n + r u o k a ö l j y ä + r u o k i a + r u o k i e n + r u o k i n n a n + r u o k i n n a s s a + r u o k i n t a a + r u o k i n t a a n + r u o k i n t a j ä r j e s t e l m i s s ä + r u o k i n t a j ä r j e s t e l m i ä + r u o k i n t a j ä r j e s t e l y i s t ä + r u o k i n t a k i e l l o n + r u o k i n t a k i e l t o + r u o k i n t a k i e l t o j a + r u o k i n t a k i e l t o o n + r u o k i n t a k ä y t ä n t ö + r u o k i n t a m e n e t e l m i e n + r u o k i n t a t a p o i h i n + r u o k i t t a v a + r u o k i t t u + r u o k k i a + r u o k k i a k s e e n + r u o k k i i + r u o k k i m a a n + r u o k k i m a l l a + r u o k k i m a t t a + r u o k k i m i s e k s i + r u o k k i m i s e s t a + r u o k k i m i s t a v a s t a + r u o k k i n e e t + r u o k k i n u t + r u o k k i s i + r u o k k i v a t + r u o k o h ä m ä h ä k k i + r u o k o k e r t t u n e n + r u o k o k u t o j a + r u o k o k y n ä + r u o k o m e t s ä k e r t t u n e n + r u o k o n a t a + r u o k o p e r h o + r u o k o r u u s u p e i p p o + r u o k o s i r k k a l i n t u + r u o k o s o k e r i + r u o k o s o k e r i a + r u o k o s o k e r i l l e + r u o k o s o k e r i n + r u o k o t r a a k k i p u u + r u o p p a u s l a i v a s t o l l a + r u o p p a u s l a i v a s t o o n + r u o p p a u s t e o l l i s u u d e n + r u o p p a u s t e o l l i s u u d e s t a + r u o p p a u s t e o l l i s u u t t a + r u o r i a h v e n e t + r u o r i p o t k u r i + r u o s k i m m e + r u o s t e h a p p o m a r j a + r u o s t e h i i r i h a u k k a + r u o s t e h o u s u h a u k k a + r u o s t e i s i l l a + r u o s t e k a n a k y y h k y + r u o s t e k a u l u s r a s t a s + r u o s t e k i u r u + r u o s t e k o t i n g a + r u o s t e k u i r i + r u o s t e k u r k k u s i r k k u + r u o s t e k u r k k u t a n g a r a + r u o s t e k ä r p ä s s i e n i + r u o s t e l a u l u t y r a n n i + r u o s t e l i n t u h a u k k a + r u o s t e l u h t a k a n a + r u o s t e m e t s ä k e r t t u n e n + r u o s t e n i s k a h a u k k a + r u o s t e n i s k a k e h r ä ä j ä + r u o s t e n i s k a t y l l i + r u o s t e p a p u r i k k o + r u o s t e p a r a t i i s i m o n a r k k i + r u o s t e p y r s t ö + r u o s t e p y r s t ö m o n a r k k i + r u o s t e p y r s t ö r ä ä t ä l i + r u o s t e p y r s t ö t + r u o s t e p y y j u o k s i j a + r u o s t e p ä ä s k y + r u o s t e r a s t a s + r u o s t e s e l k ä r a s t a s + r u o s t e s i i p i + r u o s t e s i i p i k y y h k y + r u o s t e s i i p i r a s t a s + r u o s t e s i i p i r a s t u l i + r u o s t e s i r p p i m a t k i j a + r u o s t e s o r s a + r u o s t e s u o j a u s p r o s e s s i s s a + r u o s t e s ä p p i k a l a + r u o s t e t i k k a n e n + r u o s t e t ä p l ä k i s s a + r u o s t e t ö p ö r a s t a s + r u o s t e v a h a n o k k a + r u o s t e v a r p u s p ö l l ö + r u o s t e v a t s a k a r d i n a a l i + r u o s t e v a t s a m o n a r k k i + r u o s t e v a t s a m u u r a + r u o s t e v y ö h y k e + r u o s t e v ä l s k ä r i + r u o s t u a + r u o s t u n e e t + r u o s t u u + r u o t o k a s a n a + r u o t s a l a i s e e n + r u o t s a l a i s e k o n o m i n + r u o t s a l a i s e n a + r u o t s a l a i s e s t a + r u o t s a l a i s e t + r u o t s a l a i s e t k i n + r u o t s a l a i s f i l o s o f e j a + r u o t s a l a i s i a + r u o t s a l a i s i l l e + r u o t s a l a i s i s s a + r u o t s a l a i s i s t a + r u o t s a l a i s j ä s e n t e n + r u o t s a l a i s k a u p u n g i s s a + r u o t s a l a i s k o n s e r v a t i i v i t + r u o t s a l a i s n a i s i l l a + r u o t s a l a i s n a i s i s t a + r u o t s a l a i s n u o r e n a + r u o t s a l a i s n u o r i a + r u o t s a l a i s p e r i n t e i d e n + r u o t s a l a i s p o l i i t i k k o j e n + r u o t s a l a i s t e n + r u o t s a l a i s u u d e n + r u o t s a l a i s v i e s t i + r u o t s i a + r u o t s i d e m o k r a a t i t + r u o t s i i n + r u o t s i l l a + r u o t s i l l e + r u o t s i n + r u o t s i n k i e l i s e n + r u o t s i n k i e l i s e n ä + r u o t s i n k i e l i s e s s ä + r u o t s i n k i e l i s i l l e + r u o t s i n k i e l i s i ä + r u o t s i n k i e l i s t e n + r u o t s i n k i e l i s t ä + r u o t s i n k ö y n n ö s k u u s a m a + r u o t s i n l a p i n k o i r a + r u o t s i n p u o l i v e r i n e n + r u o t s i n s u o m a l a i s e t + r u o t s i s s a + r u o t s i s s a k i n + r u o t s i s t a + r u o t u j a k o l a i t o s + r u o t u u n s a + r u p a t e l l e n + r u p a t t e l e v a t + r u p e a a + r u p i k o n n a + r u p i l i s k o + r u p t u u r i s o t a + r u s a k k o n u l j a s k a + r u s e t t i l u i s t e l u + r u s k a m i t t a r i + r u s k e a a + r u s k e h t a v a a + r u s k e h t a v a s s a + r u s k e t u i n + r u s k e t u s n e u v o t t e l u i k s i + r u s k o e r a k k o k o l i b r i + r u s k o h a i k a r a + r u s k o h a r a k k a l e p i n k ä i n e n + r u s k o h e l m i p ö l l ö + r u s k o h i i l e l l ä + r u s k o h i i l e n + r u s k o h i i l e s t ä + r u s k o h i i l i + r u s k o h i i l i k a i v o k s i a + r u s k o h i i l i l o u h o s t a + r u s k o h i i l i t e o l l i s u u d e l l e + r u s k o h i i l i v o i m a l o i d e n + r u s k o h i i l t ä + r u s k o h u i s k u k e r t t u + r u s k o h u k a n k o r e n t o + r u s k o h y e e n a + r u s k o h ä m ä h ä k k i + r u s k o j a l o h a u k k a + r u s k o j u o k s i a i n e n + r u s k o k a r d i n a a l i + r u s k o k a u l u s k e r t t u + r u s k o k e r t t u + r u s k o k e r t t u s i e p p o + r u s k o k i i v i + r u s k o k i p u a j a + r u s k o k i r j o h e l t t a + r u s k o k i r j o t i k k a + r u s k o k o r v a f a s a a n i + r u s k o k o r v a t i k k a + r u s k o k o r v a t i k k a n e n + r u s k o k o u k k u k o l i b r i + r u s k o k r u u n u k e r t t u l i + r u s k o k u r k k u h a i k a r a + r u s k o k ä r p ä s s i e n i + r u s k o k ä ä r m e k o t k a + r u s k o l a k k i k e r t t u + r u s k o l a k k i k o t i n g a + r u s k o l a k k i k u t o j a + r u s k o l a k k i m e s i k k o + r u s k o l a k k i t i k k a + r u s k o l e i j u + r u s k o l e v ä t + r u s k o l i l j a + r u s k o l o i s t o h a r a k k a + r u s k o l u h t a h a u k k a + r u s k o l u h t a k a n a + r u s k o l u r i + r u s k o m a n g u s t i + r u s k o m e s i k k o + r u s k o m e t s ä k e r t t u n e n + r u s k o m o n a r k k i + r u s k o m y r k k y l u i k e r o + r u s k o m ä n t y p i s t i ä i n e n + r u s k o n a a m a k u t o j a + r u s k o n a a m a t y l l i + r u s k o n a a m i o k e r t t u l i + r u s k o n a r s k u + r u s k o n i i t t y p e r h o n e n + r u s k o n i s k a s i r k k u + r u s k o n u r m i y ö k k ö n e n + r u s k o n ä r h i + r u s k o p a h k a j u u r e k a s + r u s k o p a l l o k a l a + r u s k o p e l i k a a n i + r u s k o p e n s a s t y r a n n i + r u s k o p e r ä l e p i n k ä i n e n + r u s k o p e r ä t a p a k u l o + r u s k o p e r ä t i k k a n e n + r u s k o p i i k k i p y r s t ö + r u s k o p i k k u m o n a r k k i + r u s k o p l a t y + r u s k o p u n i k k i t a t t i + r u s k o p y s t y n o k k a + r u s k o p ä ä b u l b u l i + r u s k o p ä ä k e r t t u + r u s k o p ä ä n a k k e l i + r u s k o p ä ä s i r k k u + r u s k o p ä ä v a r i s + r u s k o p ö l l ö + r u s k o p ö l l ö n e n + r u s k o r a h k a s a m m a l + r u s k o r a i t a k a i j a + r u s k o r a i t a t o k k o + r u s k o r a s t a s k e r t t u n e n + r u s k o r a s t u l i + r u s k o r i n t a h y y p p ä + r u s k o r o t t a + r u s k o r u o s t e p y r s t ö + r u s k o s a h a r a u s k u + r u s k o s a p e l i k o l i b r i + r u s k o s a u v a s i r k k a + r u s k o s e l k ä b u l b u l i + r u s k o s e l k ä t i k k a + r u s k o s e l k ä t y r a n n i + r u s k o s i e p p o + r u s k o s i i p i b u l b u l i + r u s k o s i i p i h a u k k a + r u s k o s i i p i s i r k k u + r u s k o s i i p p a + r u s k o s i n i s i i p i + r u s k o s i r p p i n o k k a + r u s k o s i r p p i s i i p i + r u s k o s o t k a + r u s k o s u o h a u k k a + r u s k o s u o k a n a + r u s k o s u u l a + r u s k o t a t t i + r u s k o t a v i + r u s k o t i a i s k e r t t u + r u s k o t i i r a + r u s k o t i k k a n e n + r u s k o t ä p l ä k o i + r u s k o t ö p ö r a s t a s + r u s k o u k o n k o r e n t o + r u s k o u u n i l i n t u + r u s k o v a t s a l e i j u + r u s k o v a t s a p ä ä s k y + r u s k o v i h e l t ä j ä s o r s a + r u s k o v y ö t y l l i + r u s k o v ä l s k ä r i + r u s k o ä r v i ä + r u s k u a i s p u s s i + r u s o a a v i k k o j u o k s i j a + r u s o b u l b u l i + r u s o d u e t t o l e p i n k ä i n e n + r u s o h a p e r o + r u s o k a n t o k ä ä p ä + r u s o k a u l a s i r r i + r u s o k i i l a k y l k i + r u s o k i r j o a h v e n + r u s o k i r s i k k a + r u s o k o i r a n h a m m a s + r u s o k o r p r a a l i k e r t t u + r u s o k o r u a h v e n + r u s o k u r k k u m e s i k k o + r u s o k u u s a m a + r u s o k y l k i k e r t t u l i + r u s o k y y h k y + r u s o l a k k i r ä ä t ä l i + r u s o l e h t i + r u s o l e h t i m i t t a r i + r u s o m u u r a r i m e h i l ä i n e n + r u s o n i s k a t i k k a n e n + r u s o p e r ä k e r t t u l i + r u s o p e r ä s i r k k u + r u s o p o s k i k e r t t u l i + r u s o p ä ä l u r i + r u s o p ö l l ö n e n + r u s o r i n t a k e r t t u + r u s o r i n t a k e r t t u l i + r u s o r i n t a m a l u r i + r u s o r i n t a m e s i k k o + r u s o r i n t a t y l l i + r u s o s e l k ä k i u r u + r u s o s i l m ä b u l b u l i + r u s o t a s k u + r u s o t y v i v a l m u s k a + r u s o t ä h t i a n i s + r u s o t ä p l ä m u l l o + r u s o t ö p ö k e r t t u n e n + r u s o v a s k i y ö k k ö n e n + r u s o v a t s a k o t t a r a i n e n + r u s o v a t s a l a v a s t a j a + r u s o v a t s a l e p i n k ä i n e n + r u s o v u o h e n k u u s a m a + r u s o v y ö b u l b u l i + r u s t o v a u r i o i t a + r u t e e n i v ä e s t ö n + r u t i i n i a + r u t i i n i a s i a + r u t i i n i a s i a k s i + r u t i i n i a s i a s t a + r u t i i n i a s i o i h i n + r u t i i n i a s i o i s t a + r u t i i n i h a k e m u k s i e n k i n + r u t i i n i k y s y m y s + r u t i i n i l e n t o j a + r u t i i n i m e n e t e l m ä k s i + r u t i i n i m e n e t t e l y i h i n + r u t i i n i m e n e t t e l y n ä + r u t i i n i m i e t i n t ö j ä + r u t i i n i m u u t o s t a + r u t i i n i n + r u t i i n i n o m a i n e n + r u t i i n i n o m a i s e n a + r u t i i n i n o m a i s e s t a + r u t i i n i n o m a i s e s t i + r u t i i n i p a k e t t i a + r u t i i n i p i d ä t y s a i k o j e n + r u t i i n i p ä ä t ö k s i i n + r u t i i n i r a j a t a r k a s t u k s i a + r u t i i n i t a p a h t u m a k s i + r u t i i n i t a r k a s t u k s e t + r u t i i n i t a r k a s t u k s i a + r u t i i n i t a r k a s t u s t e n + r u t i i n i t e h t ä v i e n + r u t i i n i t e h t ä v i i n + r u t i i n i t o i m e n a + r u t i i n i t o i m e n p i t e e l l ä + r u t i i n i t o i m e n p i t e i n + r u t i i n i t o i m i n n o i s t a + r u t i i n i t o i m i n t a a + r u t i i n i t u k e a + r u t i i n i t u t k i m u s t e n + r u t i i n i t y ö l t ä + r u t i i n i v a l i t u s t a + r u t o n + r u t t o b a s i l l i + r u t t o j u u r i y ö k k ö n e n + r u t t o l ä ä k ä r i + r u u a k s i + r u u a n + r u u a n j a l o s t u s t e o l l i s u u s + r u u a n s a a n t i + r u u a n s u l a t u s k a n a v a n + r u u a n t u o t a n n o n + r u u a n t u o t a n t o + r u u a n t u o t a n t o o n + r u u a n t u o t t a j i a + r u u d i n k e k s i j ä ä + r u u d u n l u k u o h j e l m a + r u u d u t + r u u h k a h u i p u i s t a + r u u h k a i s e m p i a + r u u h k a i s i l l a + r u u h k a i s i m p i a + r u u h k a i s i n + r u u h k a k o h d a t + r u u h k a k u s t a n n u k s e t + r u u h k a k u s t a n n u k s i a + r u u h k a k u s t a n n u k s i s t a + r u u h k a k u s t a n n u s t e n + r u u h k a m a k s u + r u u h k a m a k s u i s t a + r u u h k a m a k s u j a + r u u h k a m a k s u j e n + r u u h k a m a k s u j ä r j e s t e l m ä + r u u h k a m a k s u n + r u u h k a o n g e l m a a + r u u h k a o n g e l m a n + r u u h k a o n g e l m i a + r u u h k a o n g e l m i e n + r u u h k a o n g e l m i i n + r u u h k a p ä i v i s t ä + r u u h k a t + r u u h k a t e i l l ä + r u u h k a u t u m i n e n + r u u h k a u t u m i s e n + r u u h k a u t u m i s e s t a + r u u h k a u t u m i s m a k s u + r u u h k a u t u m i s o n g e l m i a + r u u h k a u t u m i s o n g e l m i e n + r u u h k a u t u m i s t a + r u u h k a u t u u + r u u h k a v e r o t + r u u h k i a + r u u h k i e n + r u u h k i e n h a l l i n t a a + r u u h k i s s a + r u u h k i s t a + r u u k k u y r t e i l l e + r u u k u n k o r j a a j a + r u u m i i d e n + r u u m i i l l i s e n + r u u m i i l l i s t u u + r u u m i i n a v a u k s e n + r u u m i i n k i e l t ä + r u u m i i n k u v a + r u u m i i n o s a + r u u m i i n o s a a + r u u m i i n o s a t + r u u m i i n o s i a + r u u m i i n o s i a a n + r u u m i i n o s i e n + r u u m i i n o s i e n s a + r u u m i i n r a k e n n e + r u u m i i n r a k e n t e e n s a + r u u m i i n r a n g a i s t u k s e t + r u u m i i n r a n g a i s t u s + r u u m i i n r y ö s t ä j ä + r u u m i i n r y ö s t ä j ä t + r u u m i i n s i e p p a a j a t + r u u m i i n t a r k a s t u k s e e n + r u u m i i n t a r k a s t u k s e l l e + r u u m i i n t a r k a s t u k s i a + r u u m i i n t a r k a s t u k s i i n + r u u m i i n t a r k a s t u k s i s s a + r u u m i i n t a r k a s t u s + r u u m i i n t a r k a s t u s t a + r u u m i i n t o i m i n n o t + r u u m i i n v a m m a + r u u m i i n v a m m a s t a + r u u m i i n v a m m o i s t a + r u u m i i s e e n + r u u m i i s t a + r u u m i i s t a a n + r u u m i i t + r u u m i i t a + r u u m i s p u s s e i s s a + r u u m i s s a a r n a + r u u m i s s ä k e i s s ä + r u u m i s t a + r u u m i s v a u n u j a + r u u s u h e l m i p e i p p o + r u u s u i k k u n a + r u u s u i s e e n + r u u s u j u u r i + r u u s u k a a l i + r u u s u k a i j a n e n + r u u s u k a p u s t a h a i k a r a + r u u s u k e k a l k k i k ä m m e k k ä + r u u s u k e r t t u l i + r u u s u k u r k k u t y r a n n i + r u u s u l i n j a + r u u s u l o k k i + r u u s u m a l v a + r u u s u n + r u u s u n m a r j a + r u u s u n o r s u k i e r t o + r u u s u n p u n a + r u u s u n p u n a i s e t + r u u s u n p u n a i s t e n + r u u s u p a p u + r u u s u p e i p p o + r u u s u p ä ä s o r s a + r u u s u r i n t a l e p i n k ä i n e n + r u u s u r i t a r i + r u u s u r u o h o + r u u s u r u o h o k i i t ä j ä + r u u s u s i i p i + r u u s u t a r h a a + r u u s u t a t t i + r u u s u t e t r a + r u u s u t i i r a + r u u s u t r o g o n i + r u u s u v a l l a n k u m o u k s e m m e + r u u s u v a l l a n k u m o u k s e n + r u u s u v a l l a n k u m o u k s e s s a + r u u s u v a l l a n k u m o u s + r u u s u v a t s a k a r d i n a a l i + r u u s u v a t s a k e r t t u l i + r u u s u v o i d e t t a + r u u s u v ä s t ä r ä k k i + r u u s u ö l j y + r u u t i s a l a l i i t t o + r u u t i t y n n y r e i t ä + r u u t i t y n n y r i + r u u t i t y n n y r i k s i + r u u t i t y n n y r i l l ä + r u u t i t y n n y r i n + r u u t i t y n n y r i n ä + r u u t i t y n n y r i ä + r u u t i u k o t + r u u t i v a r a s t o k s i + r u u t i v a r a s t o s s a + r u u t u h a p e r o + r u u t u k a a v a + r u u t u k o r u a h v e n + r u u t u m i t t a r i + r u u t u m u s t e s i e n i + r u u t u p e r h o n e n + r u u t u t a t t i + r u u t u u n + r u u v i a + r u u v i k y t k i n + r u v e t t a v a + r y h d i s t ä y d y t ä ä n + r y h d i s t ä y t y i s i + r y h d i s t ä y t y m i s t ä + r y h d i s t ä y t y m ä ä n + r y h d i s t ä y t y n y t + r y h d i s t ä y t y y + r y h d i s t ä y t y ä + r y h d y i m m e + r y h d y m m e + r y h d y t t i i n + r y h d y t t y + r y h d y t t ä i s i i n + r y h d y t ä + r y h d y t ä ä n + r y h d y t ä ä n k ö + r y h m i e m m e + r y h m i e n + r y h m i e n s ä + r y h m i i n + r y h m i l l e + r y h m i l l ä + r y h m i l t ä + r y h m i s s ä + r y h m i s s ä m m e + r y h m i s s ä n n e + r y h m i s t ä + r y h m i t e l l ä + r y h m i t e l t ä v i s s ä + r y h m i t e t t y i n ä + r y h m i t t y m i i n + r y h m i t t y m i l l e + r y h m i t t y m i ä + r y h m i t t y m ä a j a t t e l u + r y h m i t t y m ä d i r e k t i i v i n + r y h m i t t y n y t t ä + r y h m i t t ä m ä l l ä + r y h m i ä + r y h m ä a l o i t e + r y h m ä a l u e l a k i + r y h m ä a v i o l i i t t o + r y h m ä d y n a m i i k a s t a + r y h m ä d y n a m i i k k a + r y h m ä d y n a m i i k k a a n + r y h m ä h e n g e n + r y h m ä h e n k e n ä + r y h m ä h e n k e ä + r y h m ä h e n k i + r y h m ä h o m o m o r f i s m i + r y h m ä h u o n e e s s a + r y h m ä i n t r e s s e j ä + r y h m ä j a o n + r y h m ä j o h t a j a n i + r y h m ä j o h t a j a t + r y h m ä j o h t a j i e n + r y h m ä j o h t a j u u s + r y h m ä j ä r j e s t e l m ä + r y h m ä j ä r j e s t e l m ä n + r y h m ä k a n n e + r y h m ä k a n n e j ä r j e s t e l m ä n + r y h m ä k a n n e j ä r j e s t e l m ä ä + r y h m ä k a n n e m e k a n i s m i n + r y h m ä k a n n e m e n e t t e l y j ä + r y h m ä k a n n e m e n e t t e l y n + r y h m ä k a n n e o i k e u d e n + r y h m ä k a n n e o i k e u s + r y h m ä k a n n e o i k e u t t a + r y h m ä k a n n e t t a + r y h m ä k a n t a a + r y h m ä k a n t e e k s i + r y h m ä k a n t e e n + r y h m ä k a n t e e s e e n + r y h m ä k a n t e e s t a + r y h m ä k a n t e e t + r y h m ä k a n t e i d e n + r y h m ä k a n t e i s i i n + r y h m ä k a n t e i s t a + r y h m ä k a n t e i t a + r y h m ä k a r k o t u k s e t + r y h m ä k a r k o t u s t a + r y h m ä k e s k u s + r y h m ä k e s k u s t e l u j a + r y h m ä k e s k u s t e l u m m e + r y h m ä k o h t a i s e t + r y h m ä k o h t a i s t e n + r y h m ä k o k o u k s e n + r y h m ä k o k o u k s e s s a + r y h m ä k o k o u k s e s s a m m e + r y h m ä k o k o u k s i s s a + r y h m ä k o k o u s + r y h m ä k o k o u s s a l i m m e + r y h m ä k o l l e g a a n i + r y h m ä k o l l e g a n i + r y h m ä k o l l e g o i d e n i + r y h m ä k o o r d i n a a t t o r i m m e + r y h m ä k o o r d i n a a t t o r i n a + r y h m ä k o o r d i n o i j a + r y h m ä k o o t + r y h m ä k o r v a u s k a n t e e t + r y h m ä k u r i + r y h m ä k u r i a + r y h m ä k u r i i n + r y h m ä k u r i n + r y h m ä k u v a s s a + r y h m ä k ä y t t ä y t y m i n e n + r y h m ä l e n n o l l a + r y h m ä l e n t o j a + r y h m ä l l e + r y h m ä l l e m m e + r y h m ä l l e n i + r y h m ä l l ä + r y h m ä l l ä m m e + r y h m ä l l ä n i + r y h m ä l l ä ä n + r y h m ä l t ä + r y h m ä m a t k a i l u a l a l l a + r y h m ä m a t k a p a l v e l u i t a + r y h m ä m m e + r y h m ä m u o t o i s e l l a + r y h m ä n + r y h m ä n i + r y h m ä n i k i n + r y h m ä n i k ä ä n + r y h m ä n j o h t a j a + r y h m ä n j o h t a j a a + r y h m ä n j o h t a j a n a + r y h m ä n j o h t a j a t + r y h m ä n j o h t a j i a + r y h m ä n j o h t a j i e n + r y h m ä n j o h t a j i l l a + r y h m ä n j o h t a j i l l e + r y h m ä n n e + r y h m ä n s i s ä i s e t + r y h m ä n s ä + r y h m ä n ä + r y h m ä p a i n e + r y h m ä p a i n e e n + r y h m ä p a i n e e s e e n + r y h m ä p a i n e j ä r j e s t e l m ä ä + r y h m ä p a i n e t t a + r y h m ä p a i n o s t u s j ä r j e s t e l m ä ä + r y h m ä p a l a u t u k s e t + r y h m ä p o i k k e u k s e k s i + r y h m ä p o i k k e u k s e n + r y h m ä p o i k k e u k s e s s a + r y h m ä p o i k k e u k s e t + r y h m ä p o i k k e u k s i a + r y h m ä p o i k k e u k s i e n + r y h m ä p o i k k e u s + r y h m ä p o i k k e u s a s e t u k s e e n + r y h m ä p o i k k e u s a s e t u k s e k s i + r y h m ä p o i k k e u s a s e t u k s e l l a + r y h m ä p o i k k e u s a s e t u k s e l l e + r y h m ä p o i k k e u s a s e t u k s e m m e + r y h m ä p o i k k e u s a s e t u k s e n + r y h m ä p o i k k e u s a s e t u k s e s t a + r y h m ä p o i k k e u s a s e t u k s e t + r y h m ä p o i k k e u s a s e t u k s i a + r y h m ä p o i k k e u s a s e t u k s i s t a + r y h m ä p o i k k e u s a s e t u s + r y h m ä p o i k k e u s a s e t u s t a + r y h m ä p o i k k e u s a s e t u s t e n + r y h m ä p o i k k e u s j ä r j e s t e l m ä + r y h m ä p o i k k e u s s ä ä n n ö n + r y h m ä p o i k k e u s t a + r y h m ä p o i k k e u s t e n + r y h m ä p u h e a i k a a + r y h m ä p u h e e n j o h t a j a + r y h m ä p u h e e n j o h t a j a j ä r j e s t e l y + r y h m ä p u h e e n j o h t a j a k a u s i a + r y h m ä p u h e e n j o h t a j a t + r y h m ä p u h e e n j o h t a j i e n + r y h m ä p u h e e n j o h t a j u u d e n + r y h m ä p u h e e n j o h t a j u u d e s s a m m e + r y h m ä p u h e e n j o h t a j u u s + r y h m ä p u h e e n j o h t a j u u t t a + r y h m ä p u h e e n v u o r o j e n + r y h m ä r a j a t + r y h m ä r a j o j e n + r y h m ä r a k e n t e i t a + r y h m ä s a m e t t i k u k k a + r y h m ä s e k s i + r y h m ä s i h t e e r i s t ö i l l e + r y h m ä s o p i m u k s i a + r y h m ä s s ä + r y h m ä s s ä m m e + r y h m ä s s ä n i + r y h m ä s s ä n n e + r y h m ä s s ä ä n + r y h m ä s t r e s s i n + r y h m ä s t ä + r y h m ä s t ä n i + r y h m ä t + r y h m ä t a i t o j e n + r y h m ä t a p a a m i s a l a o h j e l m a + r y h m ä t a p a a m i s e s t a + r y h m ä t a r k a s t e l u s s a + r y h m ä t a r k i s t u k s i a + r y h m ä t a r k i s t u s + r y h m ä t a s o l l a + r y h m ä t e o r i a + r y h m ä t o i m i l l a + r y h m ä t o i m i n t a o i k e u s + r y h m ä t o v e r i a n i + r y h m ä t o v e r i n i + r y h m ä t o v e r i n n e + r y h m ä t u e n + r y h m ä t u e s t a + r y h m ä t u h k e l o + r y h m ä t u k e a + r y h m ä t u k i + r y h m ä t u k i j ä r j e s t e l m ä + r y h m ä t u k i j ä r j e s t e l m ä n + r y h m ä t u k i j ä r j e s t e l m ä ä n + r y h m ä t u k i k y s y m y k s e e n + r y h m ä t u k i m e k a n i s m i + r y h m ä t u o t t e e t + r y h m ä t y ö + r y h m ä t y ö k y k y + r y h m ä t y ö n ä + r y h m ä t y ö s k e n t e l y e s i m e r k i s t ä + r y h m ä t y ö s k e n t e l y ä + r y h m ä t y ö s o v e l l u s + r y h m ä t y ö t ä + r y h m ä t ö i t ä + r y h m ä v a k u u t u s s o p i m u s t a + r y h m ä v a l i n t a + r y h m ä v a l o k u v a + r y h m ä v a l o k u v a n + r y h m ä v a l v o j a n a + r y h m ä v a l v o n n a n + r y h m ä v a l v o n n a s s a + r y h m ä v a l v o n n a s t a + r y h m ä v a l v o n t a + r y h m ä v a l v o n t a a + r y h m ä v a l v o n t a a n + r y h m ä v a l v o n t a j ä r j e s t e l m ä + r y h m ä v a l v o n t a p e r i a a t t e e n + r y h m ä v e t o o m u k s i a + r y h m ä v i i k o s t a + r y h m ä v i i k o t + r y h m ä v i i s u m i + r y h m ä v i i s u m i e n + r y h m ä ä + r y h m ä ä m m e + r y h m ä ä n + r y h m ä ä n i + r y h m ä ä n s ä + r y h t y e s s ä m m e + r y h t y e s s ä n i + r y h t y e s s ä n n e + r y h t y i + r y h t y i s i + r y h t y i v ä t + r y h t y k ä ä + r y h t y k ä ä m m e + r y h t y m i s t ä + r y h t y m ä s s ä + r y h t y m ä s t ä + r y h t y m ä ä n + r y h t y n e e t + r y h t y n y t + r y h t y v ä n s ä + r y h t y v ä t + r y h t y y + r y h t y ä + r y h t y ä k s e n i + r y h ä d e l f i i n i t + r y k m e n t i n + r y n n ä k k ö k i v ä ä r i + r y n n ä k k ö p a n s s a r i v a u n u + r y n n ä k k ö t y k k i + r y p p y l i m e t t i + r y p p y v o i d e t t a + r y p p y v o i t e i s t a + r y p s i ä + r y p s i ö l j y n + r y p s i ö l j y ä + r y p ä l e a m m u k s e t + r y p ä l e a m m u k s i a + r y p ä l e a m m u k s i i n + r y p ä l e a m m u k s i s t a + r y p ä l e a m m u s t e n + r y p ä l e a m m u s v a r a s t o j e n + r y p ä l e a s e e n + r y p ä l e a s e e t + r y p ä l e a s e i d e n + r y p ä l e a s e i l l a + r y p ä l e a s e i s i i n + r y p ä l e a s e i s t a + r y p ä l e a s e i t a + r y p ä l e a s e v a r a s t o t + r y p ä l e e n + r y p ä l e k i l o + r y p ä l e l a j i + r y p ä l e l a j i k k e i t a + r y p ä l e m e h u + r y p ä l e m e h u a + r y p ä l e m e h u j a + r y p ä l e m e h u j e n + r y p ä l e m e h u l l a + r y p ä l e m e h u n + r y p ä l e m e h u s t a + r y p ä l e m e h u t i i v i s t e e l l ä + r y p ä l e m e h u t i i v i s t e e s e e n + r y p ä l e m e h u t u i s t a + r y p ä l e p o m m e i h i n + r y p ä l e p o m m e i l l a + r y p ä l e p o m m e i s t a + r y p ä l e p o m m e j a + r y p ä l e p o m m i + r y p ä l e p o m m i a + r y p ä l e p o m m i e n + r y p ä l e p o m m i k i e l t o + r y p ä l e p o m m i k s i + r y p ä l e p o m m i n + r y p ä l e p o m m i n a + r y p ä l e p o m m i t + r y p ä l e s o k e r i + r y p ä l e s o p i m u k s i a + r y p ä l e t u o t a n n o n + r y p ä l e t u o t e + r y p ä l e v i i n e i s t ä + r y p ä l e v i i n i e n + r y s i e n + r y t e i k k ö ö n + r y t i k e r t t u n e n + r y t m i e n + r y t m i h ä i r i ö + r y t m i k i t a r a + r y t m i p e l i + r y t m i ä + r y v ä s s i p u l i + r y y s y k ö y h ä l i s t ö + r y y t i n e i t o + r y y t i s a l v i a + r y ö m i n t ä k a i s t a l l a + r y ö s t e l e v ä t + r y ö s t e l l e n + r y ö s t e l y y n + r y ö s t e t t y j ä + r y ö s t i + r y ö s t ä m ä s s ä + r y ö s t ä v ä t + r y ö s t ö h i n n o i t t e l u k ä y t ä n t ö ä + r y ö s t ö i s t ä + r y ö s t ö j e n + r y ö s t ö k a l a s t u k s e l t a + r y ö s t ö k a l a s t u s t a + r y ö s t ö m e n n e i s y y s + r y ö s t ö p o l i t i i k k a a + r y ö s t ö p y y n t i ä + r y ö s t ö r i t a r i r e t k i n e e n + r y ö s t ö t o i m i n t a a + r y ö s t ö y r i t y k s e n s ä + r y ö v ä r i n t y t ä r + r y ö v ä t ä k s e e n + r ä i k e i d e n + r ä i k e i m m i s t ä + r ä i k e i m m ä t + r ä i k e i m p i e n + r ä i k e i m p i ä + r ä i k e i m p ä n ä + r ä i k e i m p ä ä n + r ä i k e i n + r ä i k e i n t ä + r ä i k e i s i i n + r ä i k e i s t ä + r ä i k e i t ä + r ä i k e i t ä k i n + r ä i k e ä l l e + r ä i k e ä m m i n + r ä i k e ä m p i + r ä i k e ä m p i ä + r ä i k e ä m p ä ä + r ä i k e ä n + r ä i k e ä n ä + r ä i k e ä s s ä + r ä i k e ä s t ä + r ä i k e ä t + r ä i k e ä t ä + r ä i k e ä ä + r ä i k e ä ä n + r ä i k k ä k i u r u + r ä i k k ä l u h t a k a n a + r ä j ä h d e a n s a + r ä j ä h d y s a i n e + r ä j ä h d y s a i n e i d e n + r ä j ä h d y s a l t i s + r ä j ä h d y s a l t t i i m m a k s i + r ä j ä h d y s a l t t i i m p i + r ä j ä h d y s a l t t i i m p i a + r ä j ä h d y s a l t t i i n + r ä j ä h d y s a l t t i i n a + r ä j ä h d y s a l t t i i s s a + r ä j ä h d y s a l t t i i s t a + r ä j ä h d y s a l t t i i t a + r ä j ä h d y s a s t e i k k o + r ä j ä h d y s h e r k e m m ä k s i + r ä j ä h d y s h e r k e m p i + r ä j ä h d y s h e r k k ä + r ä j ä h d y s h e r k k ä ä + r ä j ä h d y s h e r k ä k s i + r ä j ä h d y s h e r k ä n + r ä j ä h d y s k e l p o i s i l l e + r ä j ä h d y s m ä i s e s t ä + r ä j ä h d y s m ä i s t ä + r ä j ä h d y s p a i k a n + r ä j ä h d y s p a i k a s t a + r ä j ä h d y s p i s t e e s s ä + r ä j ä h d y s t i l o i s t a + r ä j ä h d y s v o i m a + r ä j ä h t e e t + r ä j ä h t e i d e n + r ä j ä h t e i s i i n + r ä j ä h t e i s t ä + r ä j ä h t e i t ä + r ä j ä h t ä e s s ä ä n + r ä j ä h t ä m ä i s i l l ä ä n + r ä j ä h t ä m ä t t ö m i e n + r ä j ä h t ä m ä t t ö m i k s i + r ä j ä h t ä m ä t t ö m i l l e + r ä j ä h t ä m ä t t ö m i l l ä + r ä j ä h t ä m ä t t ö m i s t ä + r ä j ä h t ä m ä t t ö m i ä + r ä j ä h t ä m ä t t ö m ä t + r ä j ä h t ä ä + r ä j ä y t t i v ä t + r ä j ä y t y s k u v a + r ä j ä y t y s y r i t y k s e s t ä + r ä k ä t t i b u l b u l i + r ä m e h o p e a t ä p l ä + r ä m e i k k ö l a p i o n o k k a + r ä m e i k k ö m e s i k k o + r ä m e k a r v a j a l k a + r ä m e k e r t t u l i + r ä m e k y l m ä n p e r h o n e n + r ä m e l e h t i m i t t a r i + r ä m e r a h k a s a m m a l + r ä m e t u l i k ä r k i + r ä m e v i h e r s i i p i + r ä n s i s t y v ä t + r ä p s i v ä t + r ä p ä y t t ä m ä t t ä + r ä s y n u k k e + r ä s y p o k k a + r ä y s t ä s k o u r u + r ä y s t ä s p ä ä s k y + r ä ä k k ä h a i k a r a + r ä ä k k ä h a i k a r a t + r ä ä p p i ä i s e t + r ä ä t ä l i n l i h a s + r ä ä t ä l ö i d y t + r ä ä t ä l ö i d ä + r ä ä t ä l ö i t y j e n + r ä ä t ä l ö i t y j ä + r ö n s y a k a n k a a l i + r ö n s y i l l e e s e e n + r ö n s y l e i n i k k i + r ö n s y r ö l l i + r ö n t g e n d i a g n o s t i i k a n + r ö n t g e n k a k s o i s t ä h t i + r ö n t g e n k r i s t a l l o g r a f i a + r ö n t g e n k u v a + r ö n t g e n k u v a t + r ö n t g e n l a b o r a t o r i o i t a + r ö n t g e n l a i t t e i d e n + r ö n t g e n p u t k i + r ö n t g e n s p e k t r o s k o p i a + r ö n t g e n s ä d e t e k n o l o g i a + r ö n t g e n s ä t e e n + r ö n t g e n s ä t e i d e n + r ö n t g e n s ä t e i l y + r ö n t g e n s ä t e i s t ä + r ö n t g e n s ä t e i t ä + r ö n t g e n t ä h t i t i e d e + r ö y h e l ö k o t i n g a + r ö y h e l ö m o n a r k k i + r ö y h e l ö p y y + r ö y h k e i m m ä n + r ö y h k e i n t ä + r ö y h k e ä m m i k s i + r ö y h k e ä m p i + r ö y h y h e l m i k k ä + r ö y h y s a r a + s a a d a + s a a d a a n + s a a d a a n k o + s a a d a k s e e n + s a a d a k s e m m e + s a a d a k s e n i + s a a d a k s e n n e + s a a d e s s a a n + s a a d e s s a n i + s a a d e s s a n n e + s a a d u t + s a a g o r ä i k k ä + s a a j a m a i d e n + s a a j a m a i s s a + s a a j a p a n k e i l l e + s a a j a t + s a a j i e n + s a a k a a m m e + s a a k o + s a a l i i d e n + s a a l i i n + s a a l i i n j a o s t a + s a a l i i n p u r k a m i s v e l v o i t t e e n + s a a l i i n s a + s a a l i i s i i n + s a a l i i s t a + s a a l i i t + s a a l i i t a + s a a l i s i l m o i t u k s i a + s a a l i s i l m o i t u k s i s t a + s a a l i s k a l a l a j i t + s a a l i s k i i n t i ö i d e n + s a a l i s k i i n t i ö i s t ä + s a a l i s k i i n t i ö i t ä + s a a l i s k i i n t i ö t + s a a l i s k i i n t i ö t ä + s a a l i s k i i n t i ö ö n + s a a l i s k o o s t u m u s t a + s a a l i s m ä ä r i e n + s a a l i s m ä ä r ä t + s a a l i s m ä ä r ä ä + s a a l i s o s u u d e s t a + s a a l i s o s u u d e t + s a a l i s o s u u k s i s t a + s a a l i s o s u u t t a a n + s a a l i s r a j o i t u k s e s t a + s a a l i s r a j o i t u k s e t + s a a l i s r a j o i t u k s i a + s a a l i s r a j o i t u s t e n + s a a l i s t a a n + s a a l i s t a j a t + s a a l i s t a s o j e n + s a a l i s t a v a m p i a + s a a l i s t a v o i t t e e t + s a a l i s t i e t o j e n + s a a l i s t o d i s t u k s e n + s a a l i s t o d i s t u k s e s t a + s a a l i s t o d i s t u k s e t + s a a l i s t o d i s t u k s i e n + s a a l i s t o n n i a + s a a l i s t u s h i n n o i t t e l u + s a a l i s t u s h i n n o i t t e l u a + s a a l i s t u s o l o j a + s a a l i s t u s p y r k i m y s t ä + s a a l i s t u s r a h a s t o i l t a + s a a l i s t u s t o i m i n t a n a + s a a l i s t y y p e i s t ä + s a a m a + s a a m a a + s a a m a a n + s a a m a m m e + s a a m a n + s a a m a n i + s a a m a n s a + s a a m a s s a + s a a m a s t a + s a a m a t + s a a m a t t a + s a a m e l a i s e t + s a a m e l a i s i a + s a a m e l a i s k i e l e t + s a a m e l a i s k ä r ä j ä t + s a a m e l a i s n e u v o s t o + s a a m e l a i s r a d i o n + s a a m i a n i + s a a m i e m m e + s a a m i e n i + s a a m i i m m e + s a a m i i n s a + s a a m i s e e n + s a a m i s e k s i + s a a m i s e n + s a a m i s e s s a + s a a m i s e s t a + s a a m i s i a + s a a m i s i s t a + s a a m i s t a + s a a m i s t a a n + s a a m m e + s a a m m e h a n + s a a m m e k o + s a a n e e k i n + s a a n e e n s a + s a a n e e t + s a a n e i d e n + s a a n e i l l e + s a a n e i s t a + s a a n e m m e + s a a n e n + s a a n e n k i n + s a a n n i n + s a a n n i s t a + s a a n t i a + s a a n t i e h t o j a + s a a n t i m e n e t t e l y j e n + s a a n t i v a r m u u d e n + s a a n u t + s a a p a s j a l k a k i s s a + s a a p p a a n h e i t t o + s a a p p a i s i i n s a + s a a p u a + s a a p u a k s e n i + s a a p u e s s a + s a a p u e s s a a n + s a a p u e s s a m m e + s a a p u e s s a n i + s a a p u e s s a n n e + s a a p u i + s a a p u i v a t + s a a p u m i s a i k a n s a + s a a p u m i s a i k o i h i n + s a a p u m i s a i k o j e n + s a a p u m i s a j a n k o h t a a + s a a p u m i s a j a t + s a a p u m i s e s t a + s a a p u m i s i l m o i t u s + s a a p u m i s i l m o i t u s j ä r j e s t e l m i e n + s a a p u m i s i l m o i t u s j ä r j e s t e l m ä + s a a p u m i s i l m o i t u s j ä r j e s t e l m ä ä + s a a p u m i s j ä r j e s t y k s e s s ä + s a a p u m i s p i s t e + s a a p u m i s p ä i v ä + s a a p u m i s p ä i v ä n + s a a p u m i s v a l t i o o n + s a a p u n e e n + s a a p u n e e t + s a a p u n e i n a + s a a p u n e i t a + s a a p u n u t + s a a p u u + s a a p u v a n i + s a a p u v a t + s a a p u v i a + s a a r e k e r a k e n n e t t a + s a a r e k k e e k s i + s a a r e k k e i t a + s a a r e l l a + s a a r e n + s a a r e n m a a + s a a r e t + s a a r i a + s a a r i a l u e e l l a + s a a r i a l u e e l t a + s a a r i a l u e e n + s a a r i a l u e e s t a + s a a r i a l u e e t + s a a r i a l u e i d e m m e + s a a r i a l u e i d e n + s a a r i a l u e i k s i + s a a r i a l u e i l l a + s a a r i a l u e i l l e + s a a r i a l u e i s i i n + s a a r i a l u e i s t a a n + s a a r i a l u e i t a + s a a r i a l u e p o l i t i i k k a a + s a a r i a l u e t t a + s a a r i a s e m a + s a a r i a s e m a a n + s a a r i a s e m a n + s a a r i a s e m a s t a + s a a r i a s u k k a i d e n + s a a r i e n + s a a r i h a r m a a k e t t u + s a a r i j ä s e n v a l t i o + s a a r i k a b o t a a s i n + s a a r i k e h i t y s v a l t i o i d e n + s a a r i k e h i t y s v a l t i o i t a + s a a r i k u l j e t u s t e n + s a a r i l e n t o a s e m i e n + s a a r i l l a + s a a r i l l e + s a a r i l u o n t e e s t a + s a a r i m a t k a i l u n + s a a r i n a a p u r e i h i m m e + s a a r i r a t k a i s u j e n + s a a r i r y h m i e n + s a a r i r y h m ä + s a a r i r y h m ä l l e + s a a r i r y h m ä n + s a a r i s a t a m i e n + s a a r i s t o a l u e e l l a + s a a r i s t o a l u e e t + s a a r i s t o a l u e i d e n + s a a r i s t o a l u e i l l a + s a a r i s t o a l u e i l t a + s a a r i s t o a l u e i s i i n + s a a r i s t o a l u e i s t a + s a a r i s t o a l u e i t a + s a a r i s t o a l u e t t a + s a a r i s t o a s e m a m m e + s a a r i s t o a s e m a n + s a a r i s t o a s u k k a a t + s a a r i s t o k a u p u n g e i l l e + s a a r i s t o k ä s i t t e e l l ä + s a a r i s t o l a i s i l l a + s a a r i s t o l a i s k u l t t u u r i n + s a a r i s t o l a i s n u o r i a + s a a r i s t o l a i v a s t o + s a a r i s t o m a t k a i l u a + s a a r i s t o m e r e n + s a a r i s t o m e r i + s a a r i s t o o n + s a a r i s t o p o l i t i i k a s t a + s a a r i s t o r i s t e i l i j ä + s a a r i s t o s e u d u i l l e + s a a r i s t o y h t e i s ö t + s a a r i t a l o u k s i e n + s a a r i t a l o u s + s a a r i v a l t a k u n n a s s a + s a a r i v a l t a k u n t a + s a a r i v a l t i o + s a a r i v a l t i o i d e n + s a a r i v a l t i o i h i n + s a a r i v a l t i o i l l e + s a a r i v a l t i o i s s a + s a a r i v a l t i o i s t a + s a a r i v a l t i o i t a + s a a r i v a l t i o l l a + s a a r i v a l t i o l l e + s a a r i v a l t i o n + s a a r i v a l t i o n a + s a a r i v a l t i o o n + s a a r i v a l t i o s t a + s a a r i v a l t i o t + s a a r i v a l t i o t a + s a a r i v ä e s t ö l l e + s a a r i v ä e s t ö s t ä + s a a r i y h d y s k u n t i i n + s a a r i y h t e i s ö i h i n + s a a r i y h t e i s ö i l l e + s a a r i y h t e i s ö j e n + s a a r i y h t e i s ö j ä + s a a r i y h t e i s ö t + s a a r n a a m i s e s t a + s a a r n a t a k s e e n + s a a r n e n s u r m a + s a a r n i v a a h t e r a + s a a r r o k s i i n + s a a r r o n + s a a r t a + s a a r t e n + s a a r t o a + s a a r t o k a m p a n j a s t a + s a a r t o k y k y ä + s a a r t o t o i m e n p i t e i l l e + s a a s t a i s i s t a + s a a s t e a r v o t + s a a s t e e n t o r j u n t a t o i m i a + s a a s t e e n t o r j u n t a t o i m i e n + s a a s t e e t + s a a s t e h u i p p u j a + s a a s t e i d e n + s a a s t e i d e n p o i s t o a l u s t e n + s a a s t e i t a + s a a s t e k a u p p a + s a a s t e k i i n t i ö i t ä + s a a s t e k i i n t i ö k a u p p a a + s a a s t e k u o r m i t u s t a + s a a s t e k u s t a n n u k s e t + s a a s t e l ä h d e + s a a s t e l ä h t e e n + s a a s t e l ä h t e e s e e n + s a a s t e l ä h t e i d e n + s a a s t e m u o t o j a + s a a s t e m ä ä r i e n + s a a s t e m ä ä r i i n + s a a s t e m ä ä r i ä + s a a s t e m ä ä r ä n + s a a s t e o i k e u k s i e n + s a a s t e o n g e l m a a + s a a s t e o n g e l m a a n + s a a s t e o n g e l m a n + s a a s t e o n g e l m a s s a + s a a s t e o n g e l m a s t a + s a a s t e o n g e l m a t + s a a s t e o n g e l m i a + s a a s t e o n g e l m i e n + s a a s t e o n g e l m i i n + s a a s t e o n g e l m i s t a + s a a s t e p e r ä i s i i n + s a a s t e p e r ä i s i l l ä + s a a s t e p e r ä i s t e n + s a a s t e p e s ä k k e i t ä + s a a s t e p i t o i s u u k s i a + s a a s t e p i t o i s u u t t a + s a a s t e p ä ä s t ö i l l e + s a a s t e p ä ä s t ö i s t ä + s a a s t e p ä ä s t ö j e n + s a a s t e p ä ä s t ö j e n s ä + s a a s t e p ä ä s t ö j ä + s a a s t e p ä ä s t ö j ä ä n + s a a s t e p ä ä s t ö r a j o i t u k s i a + s a a s t e p ä ä s t ö t + s a a s t e p ö r s s i l l ä + s a a s t e r a j o i t u k s i a + s a a s t e r a j o j e n + s a a s t e s k a n d a a l i t + s a a s t e t a s o i s t a + s a a s t e t a s o j a + s a a s t e t a s o t + s a a s t e t t a + s a a s t e v e r o j e n + s a a s t e v e r o s t a + s a a s t e v u o d o t + s a a s t e v u o t o j e n + s a a s t u m i s a s t e + s a a s t u m i s a s t e t t a + s a a s t u m i s e e n + s a a s t u m i s e l t a + s a a s t u m i s e n + s a a s t u m i s e n t o r j u n t a a + s a a s t u m i s l ä h t e i d e n + s a a s t u m i s l ä h t e i s t ä + s a a s t u m i s m a h d o l l i s u u s + s a a s t u m i s o n g e l m i a + s a a s t u m i s o n n e t t o m u u t t a + s a a s t u m i s r a j a n + s a a s t u m i s r a j a s t a + s a a s t u m i s r i s k e j ä + s a a s t u m i s r i s k i + s a a s t u m i s r i s k i e n + s a a s t u m i s r i s k i l l e + s a a s t u m i s r i s k i n + s a a s t u m i s r i s k i ä + s a a s t u m i s s e u r a a m u k s i s t a + s a a s t u m i s s k a n d a a l i t + s a a s t u m i s t a + s a a s t u m i s t a p a u k s i s s a + s a a s t u m i s t a p a u k s i s t a + s a a s t u m i s t a p a u s + s a a s t u m i s t a s o j a + s a a s t u m i s t a s o n + s a a s t u m i s t a s o t + s a a s t u m i s v a a t i m u k s i a + s a a s t u n e e m p i a + s a a s t u n e e t + s a a s t u n e i d e n + s a a s t u n e i m m a n + s a a s t u n e i m m i s t a + s a a s t u n e i m p i a + s a a s t u n e i m p i e n + s a a s t u n e i n + s a a s t u n e i t a + s a a s t u n u t t a + s a a s t u t t a a + s a a s t u t t a e n + s a a s t u t t a j a n + s a a s t u t t a j i a + s a a s t u t t a j i e n + s a a s t u t t a j i i n + s a a s t u t t a j i l l e + s a a s t u t t a m a t o n t a + s a a s t u t t a m a t t a + s a a s t u t t a m a t t o m i a + s a a s t u t t a m a t t o m i e n + s a a s t u t t a m a t t o m i i n + s a a s t u t t a m a t t o m i l l e + s a a s t u t t a m i s e n + s a a s t u t t a m i s l u o k k a + s a a s t u t t a m i s l u v a k s i + s a a s t u t t a m i s o i k e u k s i a + s a a s t u t t a v a l l e + s a a s t u t t a v a m m i n + s a a s t u t t a v a m p i a + s a a s t u t t a v a m p i e n + s a a s t u t t a v a t + s a a s t u t t a v i a + s a a s t u t t a v i e n + s a a s t u t t a v i m m a t + s a a s t u t t a v i m p i a + s a a s t u t t a v i n + s a a s t u t t a v i s t a + s a a s t u t t i + s a a s t u t u s o i k e u k s i a + s a a s t u t u s o n g e l m i a + s a a s t u u + s a a t a i s i i n + s a a t a m m e + s a a t a n + s a a t a n a n p a l v o n t a + s a a t a n e e n + s a a t a v a a n + s a a t a v a n + s a a t a v a t + s a a t a v a y h d y s v a l l a t + s a a t a v i a + s a a t a v i a a n + s a a t a v i e n + s a a t a v i l l a a n + s a a t a v i s t a + s a a t a v u u d e n + s a a t a v u u d e s s a + s a a t a v u u d e s t a + s a a t a v u u s e h t o j e n + s a a t a v u u s k a p a s i t e e t t i + s a a t a v u u s k r i i s i n + s a a t a v u u s k r i t e e r i ä + s a a t a v u u s l a u s e k e t t a + s a a t a v u u s m a h d o l l i s u u d e t + s a a t a v u u s m u o t o j e n + s a a t a v u u s o i k e u t t a + s a a t a v u u s o n g e l m a a n + s a a t a v u u s o n g e l m a n + s a a t a v u u s p e r i a a t e + s a a t a v u u s p e r i a a t t e e n + s a a t a v u u s p e r i a a t t e e s t a + s a a t a v u u s p i s t e e t + s a a t a v u u s s ä ä n t ö j e n + s a a t a v u u s t a s o n + s a a t a v u u t t a + s a a t e k i r j e e l l ä + s a a t e t a a n + s a a t e t a a n k o + s a a t e t t a i s i i n + s a a t e t t a v a + s a a t e t t u + s a a t e t t u i n a + s a a t e t t u j e n + s a a t i i n + s a a t i i n k o + s a a t o i m m e + s a a t o s s a + s a a t t a a + s a a t t a a k s e e n + s a a t t a a k s e m m e + s a a t t a i s i + s a a t t a i s i m m e + s a a t t a i s i v a t + s a a t t a j a n + s a a t t a j i i n + s a a t t a k a a m m e + s a a t t a m a a n + s a a t t a m a s t a + s a a t t a m a t t a + s a a t t a m i s e e n + s a a t t a m i s e k s i + s a a t t a m i s e n + s a a t t a m i s e s t a + s a a t t a m i s t a + s a a t t a n e e t + s a a t t a n u t + s a a t t a v a t + s a a t t a v a t k i n + s a a t t e + s a a t t e k o + s a a t t o h o i d o s t a + s a a t t o h o i t o a + s a a t t o h ä v i t t ä j ä + s a a t t o i + s a a t t o k e i k k a + s a a t t u e t u k i a l u k s i s t a + s a a t t u e t u k i a l u s + s a a t u + s a a t u a a n + s a a t u a m m e + s a a t u a n i + s a a t u i h i n + s a a t u j a + s a a t u j e n + s a a v a a + s a a v a m m e + s a a v a n + s a a v a n i + s a a v a n s a + s a a v a t + s a a v i l l a + s a a v u i n + s a a v u i t t e + s a a v u t a m m e + s a a v u t a m m e k o + s a a v u t e t a + s a a v u t e t a a n + s a a v u t e t t a i s i i n + s a a v u t e t t a v a + s a a v u t e t t a v a a + s a a v u t e t t a v a l l e + s a a v u t e t t a v a t + s a a v u t e t t a v i a + s a a v u t e t t a v i k s i + s a a v u t e t t a v i s s a + s a a v u t e t t a v i s s a m m e + s a a v u t e t t a v u u t t a + s a a v u t e t t i i n + s a a v u t e t t i i n p a + s a a v u t e t t u a + s a a v u t e t t u i h i n + s a a v u t e t t u j a + s a a v u t e t t u j e n + s a a v u t e t u i s s a + s a a v u t e t u i s t a + s a a v u t e t u n + s a a v u t e t u s t a + s a a v u t e t u t + s a a v u t i m m e + s a a v u t i m m e k o + s a a v u t t a a + s a a v u t t a a k o + s a a v u t t a a k s e e n + s a a v u t t a a k s e m m e + s a a v u t t a a k s e n i + s a a v u t t a e s s a a n + s a a v u t t a i s i m m e + s a a v u t t a k a a m m e + s a a v u t t a m a + s a a v u t t a m a a m m e + s a a v u t t a m a a n + s a a v u t t a m a m m e + s a a v u t t a m a n i + s a a v u t t a m a s s a + s a a v u t t a m a s t a + s a a v u t t a m a t t a + s a a v u t t a m a t t o m i k s i + s a a v u t t a m i a + s a a v u t t a m i s e d e l l y t y s t e n + s a a v u t t a m i s e e n + s a a v u t t a m i s e k s i + s a a v u t t a m i s e l l e + s a a v u t t a m i s e n + s a a v u t t a m i s e s s a + s a a v u t t a m i s e s t a + s a a v u t t a m i s k e i n o + s a a v u t t a m i s k e i n o j a + s a a v u t t a m i s k e i n o n a + s a a v u t t a m i s s t r a t e g i a a + s a a v u t t a m i s t a + s a a v u t t a m i s t a p o j e n + s a a v u t t a n e e n s a + s a a v u t t a n e e t + s a a v u t t a n u t + s a a v u t t a n u t k a a n + s a a v u t t a v a + s a a v u t t a v a m m e + s a a v u t t a v a n s a + s a a v u t t a v a t + s a a v u t t a v a t k o + s a a v u t t i + s a a v u t t i k o + s a a v u t t i v a t + s a a v u t t u a + s a a v u t t u a a n + s a a v u t t u a n i + s a a v u t u k s e m m e + s a a v u t u k s e n + s a a v u t u k s e s t a + s a a v u t u k s e s t a m m e + s a a v u t u k s e t + s a a v u t u k s i a + s a a v u t u k s i a a n + s a a v u t u k s i a m m e + s a a v u t u k s i a n s a + s a a v u t u k s i i m m e + s a a v u t u k s i i n + s a a v u t u k s i l l e + s a a v u t u k s i s t a + s a a v u t u k s i s t a m m e + s a a v u t u s m a h d o l l i s u u k s i a + s a a v u t u s t a + s a a v u t u s t e m m e + s a a v u t u s t e n + s a a v u t u s t e n i + s a a v u t u s t e n n e + s a b o t a a s i m a h d o l l i s u u k s i l l e + s a b o t o i d a + s a b o t o i j i a + s a b o t o i n t i a + s a b o t o i n t i y r i t y k s e t + s a d a l l a + s a d a n + s a d a n t u h a n n e n + s a d a s s a + s a d a s t a t u h a n n e s t a + s a d a t + s a d a t m i l j o o n a t + s a d a t t u h a n n e t + s a d e k a u d e n + s a d e k a u d e t + s a d e k a u s i + s a d e k a u t t a + s a d e k e s ä s t ä + s a d e m e t s i e n + s a d e m e t s i l l e + s a d e m e t s i s s ä + s a d e m e t s i ä + s a d e m e t s ä + s a d e m e t s ä a l u e i t a + s a d e m e t s ä a l u e t t a + s a d e m e t s ä k i i p i j ä + s a d e m e t s ä k y s y m y s + s a d e m e t s ä l i v e r t ä j ä + s a d e m e t s ä ä + s a d e m i e s + s a d e m i t t a r i + s a d e m ä ä r i e n + s a d e m ä ä r i i n + s a d e m ä ä r i s t ä + s a d e m ä ä r ä + s a d e p i l v i l l e + s a d e p ä i v ä n + s a d e p ä i v ä n ä + s a d e t t a + s a d e v e s i + s a d e v e s i v a r a s t o j a + s a d e v e t t ä + s a d o i l l a t u h a n s i l l a + s a d o i l l e + s a d o i l l e t u h a n s i l l e + s a d o i l t a t u h a n s i l t a + s a d o i s t a + s a d o i s t a t u h a n s i s t a + s a d o n + s a d o n k o r j u u a i k a + s a d o n k o r j u u a i k a a n + s a d o n k o r j u u n + s a d o n k o r j u u v ä l i n e i s i i n + s a d o s t a + s a d u i s s a + s a d u s s a + s a d u t + s a f i i r i k a l a + s a f i i r i s e e p r a k a l a + s a f i i r i t e t r a + s a h a a m i n e n + s a h a l a i t a l e v ä + s a h a l a i t o s t a + s a h a l e h t i + s a h a n + s a h a n o k k a k o l i b r i + s a h a r a l a i s i a + s a h a r a l a i s t e n + s a h a r a l a i s v ä e s t ö + s a h a r a n + s a h a r a n k ä ä p i ö k e r t t u + s a h a r a n p u s s i t i a i n e n + s a h a r a n t i m a l i + s a h a r a n t u r t u r i k y y h k y + s a h a r a u s k u + s a h r a m i r i s o t t o a + s a i k i n + s a i m m e + s a i m m e k i n + s a i m m e k o h a n + s a i p p u a k u p l a + s a i p p u a k u p l a k s i + s a i p p u a o o p p e r a + s a i p p u a o o p p e r a a + s a i p p u a o o p p e r a n + s a i p p u a o o p p e r a s t a + s a i p p u a p a l a n + s a i p p u a s a r j a + s a i p p u a t e h t a a t + s a i p p u o i t u m i s l u k u + s a i r a a l a a n + s a i r a a l a b a k t e e r e i s t a + s a i r a a l a b a k t e e r i n + s a i r a a l a h e n k i l ö s t ö n + s a i r a a l a h o i d o n + s a i r a a l a h o i d o s t a + s a i r a a l a h o i t o + s a i r a a l a h o i t o a + s a i r a a l a h o i t o n s a + s a i r a a l a h o i t o o n + s a i r a a l a h o i t o p a l v e l u j a + s a i r a a l a i n f e k t i o i d e n + s a i r a a l a i n f e k t i o i h i n + s a i r a a l a i n f e k t i o i s t a + s a i r a a l a i n f e k t i o i t a + s a i r a a l a i n f e k t i o t + s a i r a a l a i n f r a s t r u k t u u r e j a + s a i r a a l a j ä r j e s t e l m ä + s a i r a a l a j ä t t e e t + s a i r a a l a k e i t t i ö i d e n + s a i r a a l a k e s k u s t e n + s a i r a a l a k o u l u t u k s e e n + s a i r a a l a k y s y m y s t ä + s a i r a a l a k ä y n n e i s s ä + s a i r a a l a k ä y n n e i s t ä + s a i r a a l a k ä y n t i i n + s a i r a a l a l a i v a + s a i r a a l a l ä ä k ä r e i d e n + s a i r a a l a l ä ä k ä r e i t ä + s a i r a a l a l ä ä k ä r i t + s a i r a a l a m a k s u t + s a i r a a l a o p e r a a t i o i h i n + s a i r a a l a o r g a n i s a a t i o l l a + s a i r a a l a p a l v e l u i s t a + s a i r a a l a p o t i l a a s t a + s a i r a a l a p o t i l a i l l a + s a i r a a l a p o t i l a s t a + s a i r a a l a s i i v e n + s a i r a a l a s l a n g i + s a i r a a l a s s a + s a i r a a l a t a r v i k k e i t a + s a i r a a l a t o s s u i s s a + s a i r a a l a t y ö n t e k i j ä ä + s a i r a a l a t y ö n t e k i j ö i s t ä + s a i r a a l a v e r k o s t o j e n + s a i r a a l a v e r k o s t o n + s a i r a a l a v u o t e i s t a + s a i r a a l o i d e n + s a i r a a l o i h i n + s a i r a a l o i l l e + s a i r a a l o i s s a + s a i r a a l o i s t a + s a i r a a l o i t a + s a i r a a l o j e n + s a i r a a m p i + s a i r a a m p i a + s a i r a a n h o i d o n + s a i r a a n h o i d o s t a + s a i r a a n h o i t a j a h a r j o i t t e l i j o i n a + s a i r a a n h o i t a j a k o u l u + s a i r a a n h o i t a j a k o u l u j a + s a i r a a n h o i t a j a l l e + s a i r a a n h o i t a j a p u l a n + s a i r a a n h o i t a j a p ä i v ä + s a i r a a n h o i t a j a t + s a i r a a n h o i t a j i a + s a i r a a n h o i t o + s a i r a a n h o i t o a + s a i r a a n h o i t o h e n k i l ö s t ö n + s a i r a a n h o i t o j ä r j e s t e l m i e n + s a i r a a n h o i t o j ä r j e s t e l m ä + s a i r a a n h o i t o j ä r j e s t e l m ä n + s a i r a a n h o i t o j ä r j e s t e l m ä s t ä + s a i r a a n h o i t o j ä r j e s t ö j e n + s a i r a a n h o i t o k o r t i n + s a i r a a n h o i t o k o r t i s t a + s a i r a a n h o i t o k o r t i t + s a i r a a n h o i t o k o r t t i + s a i r a a n h o i t o k o r t t i a + s a i r a a n h o i t o k u l u j e n + s a i r a a n h o i t o k u s t a n n u k s e t + s a i r a a n h o i t o m a k s u j a + s a i r a a n h o i t o n s a + s a i r a a n h o i t o o n + s a i r a a n h o i t o p a l v e l u i h i n + s a i r a a n h o i t o p a l v e l u j a + s a i r a a n h o i t o p a l v e l u j e n + s a i r a a n h o i t o p a l v e l u t + s a i r a a n h o i t o p a l v e l u u n + s a i r a a n h o i t o t a r v i k k e i s s a + s a i r a a n h o i t o t u r v a a + s a i r a a n h o i t o t u r v a a n + s a i r a a n h o i t o v a k u u t u s t a + s a i r a a n h o i t o v ä l i n e i t ä + s a i r a a n k u l j e t u k s e n + s a i r a a s t a + s a i r a a t + s a i r a i d e n + s a i r a i l l e + s a i r a i s i i n + s a i r a i t a + s a i r a s e t u u k s i e n + s a i r a s k a s s o j e n + s a i r a s k o r v a u k s e t + s a i r a s l o m a a + s a i r a s l o m a a n + s a i r a s l o m a l l a + s a i r a s l o m i e n + s a i r a s l o m i i n + s a i r a s l o m i s t a + s a i r a s p o i s s a o l o t + s a i r a s t a a + s a i r a s t a p a u s t e n + s a i r a s t a v a t + s a i r a s t a v i e n + s a i r a s t a v i l l e + s a i r a s t u a + s a i r a s t u e s s a a n + s a i r a s t u i + s a i r a s t u i s i t t e + s a i r a s t u i v a t + s a i r a s t u m a s t a + s a i r a s t u m a t t a + s a i r a s t u m i s e e n + s a i r a s t u m i s e n + s a i r a s t u m i s r i s k i + s a i r a s t u m i s v a i k u t u k s i a + s a i r a s t u m m e + s a i r a s t u n e i d e n + s a i r a s t u n e i t a + s a i r a s t u n u t t a + s a i r a s t u t t e + s a i r a s t u u + s a i r a s t u v a t + s a i r a s t u v u u s l u k u j a + s a i r a s v a k u u t u k s e l l a + s a i r a s v a k u u t u k s e n + s a i r a s v a k u u t u s + s a i r a s v a k u u t u s a l a + s a i r a s v a k u u t u s k u s t a n n u k s i a m m e + s a i r a s v a k u u t u s m a k s u j a + s a i r a s v a k u u t u s t a + s a i r a s v u o t e e l l a + s a i r a u d e k s i + s a i r a u d e n + s a i r a u d e s t a + s a i r a u d e s t a a n + s a i r a u d e t + s a i r a u k s i a + s a i r a u k s i a m m e + s a i r a u k s i e n + s a i r a u k s i i n + s a i r a u k s i l l e + s a i r a u k s i l t a + s a i r a u k s i s t a + s a i r a u s a j a l t a + s a i r a u s e l ä k e t t ä + s a i r a u s e l ä k k e e n s ä + s a i r a u s k a s s a n n e + s a i r a u s k a s s a r a k e n t e i d e n + s a i r a u s k a s s o j a + s a i r a u s k a s s o j e n + s a i r a u s k a u s i e n + s a i r a u s k o r v a u k s i e n + s a i r a u s k o r v a u s t a + s a i r a u s k o r v a u s t e n + s a i r a u s k u l u k o r v a u k s e t + s a i r a u s k u l u k o r v a u s j ä r j e s t e l m ä ä + s a i r a u s k u l u t + s a i r a u s k u l u v a k u u t u s + s a i r a u s l o m a a + s a i r a u s l o m a a n + s a i r a u s l o m a l l a + s a i r a u s l o m i e n + s a i r a u s l o m i s t a + s a i r a u s l u v u i s t a + s a i r a u s m u o t o j e n + s a i r a u s p o i s s a o l o j a + s a i r a u s p o i s s a o l o o n + s a i r a u s p o i s s a o l o t + s a i r a u s p ä i v ä r a h a a + s a i r a u s r i s k i t + s a i r a u s t a p a u k s e s s a + s a i r a u s t a p a u k s e s t a + s a i r a u s t a p a u k s i a + s a i r a u s t a p a u k s i s s a + s a i r a u s t a p a u s t e n + s a i r a u s t i e t o v e r k o t + s a i r a u s v a k u u t u k s e e n + s a i r a u s v a k u u t u k s e l l a + s a i r a u s v a k u u t u k s e n + s a i r a u s v a k u u t u k s e s s a + s a i r a u s v a k u u t u k s e t + s a i r a u s v a k u u t u k s i a + s a i r a u s v a k u u t u k s i i n + s a i r a u s v a k u u t u k s i l l e + s a i r a u s v a k u u t u s + s a i r a u s v a k u u t u s a l a l l a + s a i r a u s v a k u u t u s a l a s t a + s a i r a u s v a k u u t u s j ä r j e s t e l m i e n + s a i r a u s v a k u u t u s j ä r j e s t e l m i i n + s a i r a u s v a k u u t u s j ä r j e s t e l m i l l e + s a i r a u s v a k u u t u s j ä r j e s t e l m ä + s a i r a u s v a k u u t u s j ä r j e s t e l m ä n + s a i r a u s v a k u u t u s j ä r j e s t e l m ä ä n + s a i r a u s v a k u u t u s k a s s a + s a i r a u s v a k u u t u s k o r t i l l a + s a i r a u s v a k u u t u s k o r t i l l e + s a i r a u s v a k u u t u s k o r t i l t a + s a i r a u s v a k u u t u s k o r t i n + s a i r a u s v a k u u t u s k o r t t i + s a i r a u s v a k u u t u s k o r t t i a + s a i r a u s v a k u u t u s k o r t t i i n + s a i r a u s v a k u u t u s k o r v a u k s i i n + s a i r a u s v a k u u t u s l a i t o k s e l l e + s a i r a u s v a k u u t u s l a i t o k s e n s a + s a i r a u s v a k u u t u s l a i t o k s e t + s a i r a u s v a k u u t u s l a i t o k s i a + s a i r a u s v a k u u t u s l a i t o k s i l l e + s a i r a u s v a k u u t u s l a i t o s t e n + s a i r a u s v a k u u t u s o h j e l m a a n + s a i r a u s v a k u u t u s o i k e u t t a + s a i r a u s v a k u u t u s p o l i t i i k k o j e n + s a i r a u s v a k u u t u s r a h a s t o i h i n + s a i r a u s v a k u u t u s r a h a s t o n + s a i r a u s v a k u u t u s r a h o j a + s a i r a u s v a k u u t u s s u u n n i t e l m a a + s a i r a u s v a k u u t u s t a + s a i r a u s v a k u u t u s t e n + s a i r a u s v a k u u t u s t u r v a + s a i r a u s v a k u u t u s u u d i s t u k s e n + s a i r a u s v a k u u t u s v i r a s t o + s a i r a u s v a k u u t u s y h t i ö i d e n + s a i r a u s v a k u u t u s y h t i ö i l l e + s a i r a u s v a k u u t u s y h t i ö i t ä + s a i r a u s v a k u u t u s y k s i k k ö ä + s a i r a u t e e n + s a i r a u t t a + s a i s i + s a i s i m m e + s a i s i m m e k o + s a i s i n + s a i s i v a t + s a i t t e k o + s a i v a r r e l l a + s a i v a r t e l i j a t + s a i v a r t e l u s t a + s a i v a r t e l u u n + s a i v a t + s a k e u t t a m i s a i n e + s a k k a r o o s i e s t e r e i d e n + s a k k a r o o s i e s t e r i t + s a k k a r o o s i n + s a k k a u s n o p e u s + s a k k i p e l i k s i + s a k k o a s i a + s a k k o i h i n + s a k k o j a + s a k k o j e n + s a k k o j ä r j e s t e l m ä + s a k k o j ä r j e s t e l m ä n + s a k k o j ä r j e s t e l m ä ä + s a k k o k o r o t + s a k k o l a u s e k k e e n + s a k k o m a k s u i h i n + s a k k o m i t t a r i + s a k k o r a n g a i s t u k s e k s i + s a k k o r a n g a i s t u k s i a + s a k k o r a n g a i s t u k s i i n + s a k k o r a n g a i s t u s + s a k k o r a n g a i s t u s t e n + s a k k o t u l l e j a + s a k k o t u l l i e n + s a k k o t u l l i t + s a k k o t u l o i l l a + s a k k o v ä h e n n y s t e n + s a k o i l l a + s a k o i l l e + s a k o i s t a + s a k o k a i v o j a + s a k o k a i v o j e n + s a k o l u k u + s a k o n + s a k o t + s a k o t t a a + s a k r a m e n t t i k a a p p i + s a k s a a k i n + s a k s a a n + s a k s a k i n + s a k s a k s i + s a k s a l a i s e d u s t a j a + s a k s a l a i s e e n + s a k s a l a i s e l l e + s a k s a l a i s e l t a + s a k s a l a i s e n + s a k s a l a i s e n a + s a k s a l a i s e t + s a k s a l a i s e u r o o p p a l a i s e e n + s a k s a l a i s i a + s a k s a l a i s i i n + s a k s a l a i s i l l a + s a k s a l a i s i s s a + s a k s a l a i s i s t a + s a k s a l a i s j ä s e n e n ä + s a k s a l a i s k i r j a i l i j a n + s a k s a l a i s k o l l e g a n i + s a k s a l a i s k o u l u s s a + s a k s a l a i s l a p s i a + s a k s a l a i s m i e h i t t ä j ä n + s a k s a l a i s m i e l i n e n + s a k s a l a i s m i e l i s t e n + s a k s a l a i s m i n i s t e r i n + s a k s a l a i s n a i s e e n + s a k s a l a i s n a t i o n a l i s t i t + s a k s a l a i s n u o r e t + s a k s a l a i s o m i s t e i s e l t a + s a k s a l a i s o m i s t u k s e s s a + s a k s a l a i s o p i s k e l i j a t + s a k s a l a i s p o l i i t i k k o j e n + s a k s a l a i s s o t i l a s + s a k s a l a i s t a + s a k s a l a i s t e n + s a k s a l a i s t e r r o r i s t i e n + s a k s a l a i s t u o m a r i n + s a k s a l a i s v a s t a i n e n + s a k s a l a i s v a s t a i s u u t t a + s a k s a l a i s v i h a n + s a k s a l a i s v ä h e m m i s t ö l l e + s a k s a l a i s v ä h e m m i s t ö n + s a k s a l a i s v ä h e m m i s t ö ö n + s a k s a l a i s y h t i ö + s a k s a l a i s y r i t y k s e t + s a k s a l a i s y r i t y s t ä + s a k s a l l e + s a k s a l t a + s a k s a n + s a k s a n a m p i a i n e n + s a k s a n h i r v i + s a k s a n k a a n + s a k s a n k i e l i n e n + s a k s a n k i e l i s e e n + s a k s a n k i e l i s e n + s a k s a n k i e l i s e s s ä + s a k s a n k i e l i s e t + s a k s a n k i e l i s i s s ä + s a k s a n k i e l i s t e n + s a k s a n k i e l i s t ä + s a k s a n k i e l t ä + s a k s a n k u r j e n m i e k k a + s a k s a n k ä r h ö + s a k s a n m a t a r a + s a k s a n p a i m e n k o i r a + s a k s a n p i h l a j a + s a k s a n p i h t a + s a k s a n p y s t y k o r v a + s a k s a n p ä h k i n ä + s a k s a n t u r k k i l a i s e n + s a k s a s s a + s a k s a s t a + s a k s i i n + s a k s i p o t k u + s a k s i p y r s t ö + s a k s i s s a + s a k s i s t a + s a k s i t y r a n n i + s a k s o f o n i k v a r t e t t i + s a k s o j e n + s a l a a m a a n + s a l a a m a t t a + s a l a a m i s e k s i + s a l a a t t i k i r v a + s a l a a t t i p i i k k i p u t k i + s a l a i l l e n + s a l a i l u a + s a l a i l u h a r j o i t u s + s a l a i l u j a + s a l a i l u k u l t t u u r i + s a l a i l u k u l t t u u r i a + s a l a i l u k u l t t u u r i i n + s a l a i l u p e r i n t e e n s ä + s a l a i l u s t a + s a l a i s e e n + s a l a i s e l l a + s a l a i s e m m i n + s a l a i s e m p i a + s a l a i s e n + s a l a i s e n a + s a l a i s e s s a + s a l a i s e s t a + s a l a i s e t + s a l a i s i a + s a l a i s i k s i + s a l a i s i l l a + s a l a i s i n a + s a l a i s i s t a + s a l a i s t a + s a l a i s t e n + s a l a i s u u d e n + s a l a i s u u d e t + s a l a i s u u k s i a a n + s a l a i s u u k s i s t a + s a l a i s u u s v a i h t o e h d o n + s a l a j u o n i a + s a l a j u o n i t e o r i a + s a l a k a r i e n + s a l a k a u p a l l e + s a l a k a u p a n + s a l a k a u p p a + s a l a k a u p p a a + s a l a k a u p p a r e n k a i d e n + s a l a k a v a l a + s a l a k a v a l a a + s a l a k a v a l a m m a s s a + s a l a k a v a l a m m a t + s a l a k a v a l a m p a a + s a l a k a v a l a m p i a + s a l a k a v a l i a + s a l a k i e l i + s a l a k u l j e t e t t u j a + s a l a k u l j e t t a a + s a l a k u l j e t t a j a l i i g o j a + s a l a k u l j e t t a j a n + s a l a k u l j e t t a j a t + s a l a k u l j e t t a j i a + s a l a k u l j e t t a j i e n + s a l a k u l j e t t a j i i n + s a l a k u l j e t t a j i s t a + s a l a k u l j e t t a v a t + s a l a k u l j e t u k s e e n + s a l a k u l j e t u k s e n + s a l a k u l j e t u s + s a l a k u l j e t u s j ä r j e s t ö i l l e + s a l a k u l j e t u s k e t j u j e n + s a l a k u l j e t u s k e t j u t + s a l a k u l j e t u s k y s y m y k s e e n + s a l a k u l j e t u s l i i g a t + s a l a k u l j e t u s l i i g o i l l e + s a l a k u l j e t u s l i i g o j e n + s a l a k u l j e t u s o n g e l m i i n + s a l a k u l j e t u s o r g a n i s a a t i o t a + s a l a k u l j e t u s r e i t i l l ä + s a l a k u l j e t u s r e i t t e j ä + s a l a k u l j e t u s r e i t t i + s a l a k u l j e t u s r e n k a i s i i n + s a l a k u l j e t u s r i k o l l i s u u d e n + s a l a k u l j e t u s r i k o l l i s u u t t a + s a l a k u l j e t u s r i s k i + s a l a k u l j e t u s t a + s a l a k u l j e t u s t o i m i n t a + s a l a k u l j e t u s t u p a k k a + s a l a k u l j e t u s v e r k o s t o i l l e + s a l a k u l j e t u s v e r k o s t o j e n + s a l a k u o p p i a + s a l a k u u n n e l l a + s a l a k u u n t e l e v i a + s a l a k u u n t e l u + s a l a k u u n t e l u a + s a l a k u u n t e l u j ä r j e s t e l m i ä + s a l a k u u n t e l u j ä r j e s t e l m ä + s a l a k u u n t e l u j ä r j e s t e l m ä s t ä + s a l a k u u n t e l u l a i t t e i d e n + s a l a k u u n t e l u l a i t t e i s i i n + s a l a k u u n t e l u l a i t t e i s t a + s a l a k u u n t e l u l a i t t e i t a + s a l a k u u n t e l u m a h d o l l i s u u k s i a + s a l a k u u n t e l u s k a n d a a l i + s a l a k u u n t e l u s k a n d a a l i k s i + s a l a k u u n t e l u s k a n d a a l i n + s a l a k u u n t e l u s k a n d a a l i s t a + s a l a k u u n t e l u t a p a u s t e n + s a l a k u u n t e l u t e k n i i k k a + s a l a k u u n t e l u u n + s a l a k u u n t e l u v a l t i o n + s a l a k u u n t e l u v i r a s t o a + s a l a l i i t o s t a + s a l a l i i t t o + s a l a l i i t t o a + s a l a l i i t t o r o m a a n i a + s a l a l i i t t o t e o r i a + s a l a l i i t t o t e o r i a a + s a l a l i i t t o t e o r i a s t a + s a l a l i i t t o t e o r i o i h i n + s a l a l i i t t o t e o r i o i s s a a n + s a l a l i i t t o t e o r i o i t a + s a l a m a n i s k u + s a l a m a n n o p e a s t i + s a l a m a n p a i k a n n i n + s a l a m a p o i k a + s a l a m a s e e p r a + s a l a m a t + s a l a m a t k u s t a j a t + s a l a m a t k u s t a j i a + s a l a m a t k u s t a j i l l e + s a l a m a t k u s t a j i s t a + s a l a m a v a r a s + s a l a m e t s ä s t y k s e e n + s a l a m e t s ä s t y k s e l t ä + s a l a m e t s ä s t y k s e s t ä + s a l a m e t s ä s t ä j ä l i i g o i s t a + s a l a m i m a k k a r a t a k t i i k a l t a + s a l a m i p o l i t i i k k a + s a l a m i t a k t i i k k a a + s a l a m i t a k t i i k o i s t a + s a l a m u r h a n + s a l a m u r h a s s a + s a l a m u r h a s y y t ö k s i i n + s a l a m u r h i e n + s a l a m y h k ä i s e m p i + s a l a m y h k ä i s i ä + s a l a m y h k ä i s t e n + s a l a m y h k ä i s t ä + s a l a o h j e l m a + s a l a o j a + s a l a p e r ä i n e n + s a l a p e r ä i s e n + s a l a p e r ä i s e s t i + s a l a p e r ä i s t ä + s a l a s e u r a + s a l a s e u r o i l t a + s a l a s e u r o j a + s a l a s s a p i t o l a u s e k k e e s s a + s a l a s s a p i t o l a u s e k k e i d e n + s a l a s s a p i t o s o p i m u s + s a l a s s a p i t o s y i l l ä + s a l a s s a p i t o s y i s t ä + s a l a s s a p i t o s ä ä n n ö k s i ä + s a l a s s a p i t o s ä ä n t ö + s a l a s s a p i t o s ä ä n t ö j ä + s a l a s s a p i t o v e l v o l l i s u u d e n + s a l a s s a p i t o v e l v o l l i s u u s + s a l a s s a p i t o v e l v o l l i s u u t t a + s a l a s s a p i t o v e l v o l l i s u u t t a a n + s a l a t a + s a l a t a a n + s a l a t a k s e e n + s a l a t i e t e i s s ä + s a l a t t a v a a + s a l a t t i i n + s a l a t t u j a + s a l a u s f a k s e j a + s a l a u s j ä r j e s t e l m i l l ä + s a l a u s l a i t t e i s t o + s a l a u s l a i t t e i s t o a + s a l a u s l u o k i t t e l u j ä r j e s t e l m ä + s a l a u s o h j e l m i s t o n + s a l a u s o h j e l m i s t o t + s a l a u s p a l v e l u j e n + s a l a u s p r o t o k o l l a + s a l a u s t e k n i i k a n + s a l a u s t e k n i i k k a + s a l a u s t e k n i i k k o j a + s a l a u s t e k n i i k o i d e n + s a l a u s t u o t t e i d e n + s a l a u s t u o t t e i t a + s a l a v a n + s a l i a + s a l i b a n d y l i i g a + s a l i b a n d y l i i t t o + s a l i b a n d y m a a j o u k k u e + s a l i i n + s a l i n + s a l i s s a + s a l i s t a + s a l i v a h t i m e s t a r e i l l e + s a l i ä ä n t ä + s a l k k u i n v e s t o i n n i t + s a l k k u j a + s a l k k u j a k o + s a l k k u j a k o o n + s a l k k u j a o n + s a l k k u j a o s t a + s a l k k u j e n + s a l k k u y r i t y s t e n + s a l k o a s e + s a l k u i s t a + s a l k u n + s a l k u n h o i d o n + s a l k u n h o i t o p a l v e l u j a + s a l k u t + s a l l i a + s a l l i a k s e e n + s a l l i e s s a a n + s a l l i i + s a l l i k a a + s a l l i k a a m m e + s a l l i k a a n + s a l l i m a a n + s a l l i m a i s i l l a a n + s a l l i m a l l a + s a l l i m a t t a + s a l l i m i s e k s i + s a l l i m m e + s a l l i n e t t e + s a l l i s i + s a l l i s i m m e + s a l l i t a + s a l l i t a a n + s a l l i t a a n k o + s a l l i t t a i s i i n + s a l l i t t a v a + s a l l i t t e + s a l l i t t e h a n + s a l l i t t e k o + s a l l i t t i i n + s a l l i t t u a + s a l l i t t u i h i n + s a l l i t t u j a + s a l l i t t u j e n + s a l l i t u i s t a + s a l l i t u l l e + s a l l i t u n + s a l l i t u s t a + s a l l i t u t + s a l l i v a m m i n + s a l l i v a m p i a + s a l l i v a n + s a l l i v a t + s a l l i v a t k o + s a l l i v i m p i a + s a l l i v i n + s a l m e s t a + s a l m i a k k i k o s k e n k o r v a + s a l m i s i i r t o k u n n a t + s a l m o n e l l a b a k t e e r e j a + s a l m o n e l l a k a t a s t r o f i + s a l m o n e l l a m u n i e n + s a l m o n e l l a m y r k y t y k s e e n + s a l m o n e l l a n + s a l m o n e l l a o n g e l m a h a n + s a l m o n e l l a s t a + s a l m o n e l l a t a p a u k s e s t a + s a l m o n e l l a t a r t u n n a t + s a l m o n e l l a t a r t u n t a a + s a l m o n e l l a t y y p p i ä + s a l m o n e l l a v a l v o n t a + s a l o m o n i n + s a l o m o n i n h a u k k a + s a l o m o n i n k a k a d u + s a l o m o n i n k o t t a r a i n e n + s a l o m o n i n l i e j u k a n a + s a l o m o n i n l u h t a k a n a + s a l o m o n i n m e s i k k o + s a l o m o n i n m o n a r k k i + s a l o m o n i n p ö l l ö + s a l o m o n i n v a r i s + s a l o m o n m e r i + s a l o m o n s a a r e t + s a l o m o n s a a r i a + s a l o m o n s a a r i i n + s a l o m o n s a a r i l l a + s a l o m o n s a a r i l l e + s a l o m o n s a a r i s t a + s a l o m o n s a a r t e n + s a l o n k i k e l p o i s e k s i + s a l o n k i p i s t o o l i + s a l o n k i p o l i t i i k a n + s a l o n k i p o l i t i i k k a + s a l o n k i p o l i t i i k k a a n + s a l p a l i n j a + s a l p a p e n s a s + s a l p a u s s e l ä n + s a l p i e t a r i t e h t a a t + s a l v i a k i s t u s + s a m a a + s a m a a n + s a m a i s e e n + s a m a i s e l l a + s a m a i s e n + s a m a i s e s s a + s a m a i s i a + s a m a i s t u t t a v a + s a m a k s i + s a m a l l e + s a m a n a + s a m a n a i k a i s e e n + s a m a n a i k a i s e n + s a m a n a i k a i s e s s a + s a m a n a i k a i s e s t a + s a m a n a i k a i s i a + s a m a n a i k a i s i l l a + s a m a n a r v o i s e e n + s a m a n a r v o i s e k s i + s a m a n a r v o i s e s s a + s a m a n a r v o i s e s t a + s a m a n a r v o i s e s t i + s a m a n a r v o i s e t + s a m a n a r v o i s i a + s a m a n a r v o i s i k s i + s a m a n a r v o i s i n a + s a m a n a r v o i s i s t a + s a m a n a r v o i s t a + s a m a n a r v o i s u u d e n + s a m a n a r v o i s u u d e s t a + s a m a n a r v o i s u u s p e r i a a t t e e n + s a m a n a r v o i s u u t e e n + s a m a n a r v o i s u u t t a + s a m a n h e n k i s t e n + s a m a n i k ä i s i ä + s a m a n i k ä i s t ä + s a m a n k a l t a i s e e n + s a m a n k a l t a i s e m p i a + s a m a n k a l t a i s e n + s a m a n k a l t a i s e n a + s a m a n k a l t a i s e t + s a m a n k a l t a i s i a + s a m a n k a l t a i s i l l e + s a m a n k a l t a i s i s s a + s a m a n k a l t a i s i s t a + s a m a n k a l t a i s t e n + s a m a n k a l t a i s u u k s i a + s a m a n k o k o i n e n k i n + s a m a n k o k o i s e e n + s a m a n k o k o i s e t + s a m a n k o k o i s i a + s a m a n l a i s e e n + s a m a n l a i s e l l a + s a m a n l a i s e l l e + s a m a n l a i s e l t a + s a m a n l a i s e n + s a m a n l a i s e n a + s a m a n l a i s e s t a + s a m a n l a i s e t + s a m a n l a i s i a + s a m a n l a i s i n + s a m a n l a i s i n a + s a m a n l a i s i s s a + s a m a n l a i s i s t a + s a m a n l a i s t e n + s a m a n l a i s u u t e e n + s a m a n m i e l i s i l t ä + s a m a n m i e l i s i ä + s a m a n m i e l i s t e n + s a m a n s i s ä l t ö i s e n + s a m a n s i s ä l t ö i s t ä + s a m a n s u u n t a i s e m m i k s i + s a m a n s u u n t a i s e n + s a m a n s u u n t a i s e t + s a m a n s u u n t a i s i a + s a m a n s u u n t a i s i l t a + s a m a n s u u n t a i s i n a + s a m a n s u u n t a i s i s s a + s a m a n s u u n t a i s t e n + s a m a n s u u r u i s e e n + s a m a n s u u r u i s e n + s a m a n s u u r u i s e t + s a m a n s u u r u i s t a + s a m a n t a p a i s i a + s a m a n t a p a i s i s t a + s a m a n t a p a i s t a + s a m a n t a s o i s e n + s a m a n t a s o i s e n a + s a m a n t a s o i s e s t i + s a m a n t a s o i s e t + s a m a n t a s o i s i a + s a m a n t a s o i s t a + s a m a n t e k e v ä ä + s a m a n t y y p p i s e l l ä + s a m a n t y y p p i s i i n + s a m a n t y y p p i s i s t ä + s a m a n t y y p p i s i ä + s a m a n t y y p p i s t ä + s a m a n v ä r i s i ä + s a m a n v ä r i s t ä + s a m a p a l k k a i s u u d e n + s a m a p a l k k a i s u u d e s t a + s a m a p a l k k a i s u u s d i r e k t i i v i + s a m a p a l k k a i s u u s d i r e k t i i v i n + s a m a p a l k k a i s u u s e s i m e r k k i + s a m a p a l k k a i s u u s o n g e l m a a n + s a m a p a l k k a i s u u s p e r i a a t e t t a + s a m a p a l k k a i s u u s p e r i a a t t e e n + s a m a p a l k k a i s u u s p ä i v ä n + s a m a p a l k k a i s u u s s ä ä n t ö j ä + s a m a p a l k k a i s u u s t e e m a a + s a m a p a l k k a i s u u s v a a t i m u k s e e n + s a m a p a l k k a i s u u t e e n + s a m a p a l k k a i s u u t t a + s a m a s t a m i s t a + s a m a s t u m i s p r o s e s s i i n + s a m a t + s a m b a r o c k + s a m e a m m a l t a + s a m e t t i e r o + s a m e t t i e s i r i p p u a + s a m e t t i j a l k a + s a m e t t i k a r d i n a a l i + s a m e t t i k o l i b r i + s a m e t t i k ä s i n e + s a m e t t i m o n a r k k i + s a m e t t i n ä r h i + s a m e t t i p ä ä k e r t t u + s a m e t t i s i i p i k o t t a r a i n e n + s a m e t t i v a l l a n k u m o u k s e e n + s a m e t t i v a l l a n k u m o u k s e n + s a m e t t i v a l l a n k u m o u k s e s t a + s a m e t t i v a l l a n k u m o u k s i l l a + s a m e t t i v i u h k a s i i p i + s a m e t t i v u o k k o k a l a + s a m e t t i v ä l s k ä r i + s a m m a k k o b u l b u l i + s a m m a k k o h a u k k a + s a m m a k o i l t a + s a m m a k o n k o i v e t + s a m m a l k a i j a n e n + s a m m a l k u h a n k e i t t ä j ä + s a m m a l l e i m u + s a m m a l m e s i k k o + s a m m a l t a n s s i j a + s a m m a l t i k k a + s a m m a l v a r p i o + s a m m u m i s j ä r j e s t e l m ä + s a m m u m i s k y s y m y k s e n + s a m m u t t a a + s a m m u t t a k a a m m e + s a m m u t t i m e t + s a m m u t t i m i e n + s a m m u t u s j o u k k o j e n + s a m m u t u s j o u k o i s t a + s a m m u t u s k o n e i t a + s a m m u t u s l a i t t e i s t o a + s a m m u t u s l e n t o k o n e e n + s a m m u t u s l e n t o k o n e i t a + s a m m u t u s l e n t o k o n e t t a + s a m m u t u s m e n e t e l m i ä + s a m m u t u s v a a h d o i s s a + s a m m u t u s v a a h t o j a + s a m m u t u s v ä l i n e + s a m n i l a i s s o d a t + s a m o a n k o t t a r a i n e n + s a m o a n l i e j u k a n a + s a m o a n l i v e r t ä j ä + s a m o a n m o n a r k k i + s a m o i h i n + s a m o i l l a + s a m o i s s a + s a m o i s t a + s a m o j a + s a m o j e d i k i e l e t + s a m o j e d i t + s a m o j e n + s a m p p a n j a l ä h e t y s t ö i s t ä + s a m p p a n j a s o s i a l i s t i + s a m p p a n j a v ä r i + s a n a a + s a n a a k a a n + s a n a a n + s a n a a n s a + s a n a h e l i n ä k s i + s a n a h e l i n ä l l ä + s a n a h e l i n ä n + s a n a h e l i n ä n ä + s a n a h e l i n ä ä + s a n a h e l i n ä ä n + s a n a i k a i s e s t i + s a n a i l u a + s a n a i l u n + s a n a k i k k a i l u a + s a n a k i k k a i l u i h i n + s a n a k ä ä n t e i n + s a n a k ä ä n t e i t ä + s a n a l e i k i s t ä + s a n a l e i k k i ä + s a n a l l a + s a n a l l a k a a n + s a n a l l i s i a + s a n a l l i s i s t a + s a n a m e r k i t y k s i s s ä + s a n a m m e + s a n a m u o d o i s t a + s a n a m u o d o n + s a n a m u o d o s t a + s a n a m u o d o t + s a n a m u o t o a + s a n a m u o t o j a + s a n a n + s a n a n a i k a i s e s t i + s a n a n h e l i n ä n ä + s a n a n i + s a n a n k ä ä n t e i n + s a n a n l a s k u k i n + s a n a n l a s k u n + s a n a n l a s k u s s a + s a n a n n e + s a n a n s a + s a n a n t u n n i s t u s o h j e l m a t + s a n a n v a i h d o n + s a n a n v a i h t o a + s a n a n v a l i n n o i s t a + s a n a n v a l t a a + s a n a n v a p a u d e l l a + s a n a n v a p a u d e l l e + s a n a n v a p a u d e n + s a n a n v a p a u d e s s a + s a n a n v a p a u d e s s a m m e + s a n a n v a p a u d e s t a + s a n a n v a p a u d e s t a a n + s a n a n v a p a u d e s t a m m e + s a n a n v a p a u s f o b i a + s a n a n v a p a u s k i n + s a n a n v a p a u s t a i s t e l u l l e + s a n a n v a p a u t e e n + s a n a n v a p a u t e m m e + s a n a n v a p a u t e n n e + s a n a n v a p a u t e n s a + s a n a n v a p a u t t a + s a n a n v a p a u t t a a n + s a n a n v a p a u t t a n i + s a n a n v a p u t t a + s a n a p u u r o a + s a n a s e n + s a n a s o t a a + s a n a s t o k e s k u s t e l u + s a n a t + s a n a t a r k a s s a + s a n a t a r k a t + s a n a t a r k k a a + s a n a t a r k k a a n + s a n a t a r k k o i h i n + s a n a t a r k k o j a + s a n a t a r k o i s s a + s a n a t e h d a s + s a n a v a l i n t a + s a n a v a l i n t a a + s a n a v a l i n t a a n n e + s a n a v a l i n t a n i + s a n a v a l i n t o j a a n + s a n a v a p a u d e n + s a n a v a p a u s + s a n a v a p a u t t a + s a n a v i r h e + s a n d i n i s t i p u o l u e + s a n d i n i s t i t + s a n d w i c h s a a r t e n + s a n e e r a u k s e e n + s a n e e r a u s o h j e l m i e n + s a n e e r a u s s u u n n i t e l m a n + s a n e e r a u s s u u n n i t e l m i a + s a n e e r a u s t u e n + s a n e e r a u s t u k i + s a n e l e m a a n + s a n e l e m i a + s a n e l l a + s a n e l u d i p l o m a t i a s t a + s a n e l u p o l i t i i k k a a + s a n i a i s p e r h o n e n + s a n i t + s a n i t a a t i o h a n k k e i d e n + s a n i t e e t t i h u o l t o o n + s a n i t e e t t i h u o l t o p a l v e l u t + s a n i t e e t t i o h j e l m i s t a + s a n i t e e t t i o l o s u h t e i s i i n + s a n i t e e t t i o l o t + s a n i t e e t t i p a l v e l u i s t a + s a n i t e e t t i p a l v e l u t + s a n i t e e t t i t i l a t + s a n k a r e i d e n + s a n k a r e i t a + s a n k a r i a i k a + s a n k a r i k a u p u n k i + s a n k a r i l l i s e n + s a n k a r i m m e + s a n k a r i n a i s e t + s a n k o i n + s a n k t i o e h d o t u k s e t + s a n k t i o i d e n + s a n k t i o i h i n + s a n k t i o i l l a + s a n k t i o i s t a + s a n k t i o i t a + s a n k t i o j ä r j e s t e l m ä + s a n k t i o j ä r j e s t e l m ä ä + s a n k t i o j ä r j e s t e l m ä ä n + s a n k t i o k l a u s u u l i n + s a n k t i o m a h d o l l i s u u d e t + s a n k t i o m e k a n i s m e i h i n + s a n k t i o m e k a n i s m i a + s a n k t i o m e k a n i s m i t + s a n k t i o m e n e t t e l y j ä + s a n k t i o n a + s a n k t i o p o l i t i i k a l l a + s a n k t i o t + s a n o a + s a n o a k a a n + s a n o a k s e n i + s a n o e n + s a n o e s s a a n + s a n o e s s a m m e + s a n o e s s a n i + s a n o e s s a n n e + s a n o i + s a n o i h a n + s a n o i h i n + s a n o i h i n i + s a n o i h i n n e + s a n o i h i n s a + s a n o i k s i + s a n o i l l a + s a n o i l l a a n + s a n o i l l a m m e + s a n o i l l a n i + s a n o i l l e + s a n o i m m e + s a n o i n + s a n o i n k i n + s a n o i n k u v a a m a t t o m a s s a + s a n o i s i + s a n o i s i m m e + s a n o i s i n + s a n o i s i n k i n + s a n o i s i n k o + s a n o i s i n p a + s a n o i s i t t e + s a n o i s i v a t + s a n o i s s a + s a n o i s s a a n + s a n o i s s a n i + s a n o i s t a + s a n o i s t a a n + s a n o i s t a n i + s a n o i s t a n n e + s a n o i t t e + s a n o i t t e k o + s a n o i v a t + s a n o j a a n + s a n o j a m m e + s a n o j a n i + s a n o j a n n e + s a n o j e m m e + s a n o j e n + s a n o j e n i + s a n o j e n n e + s a n o j e n s a + s a n o k a a + s a n o k a a h a n + s a n o k a a m m e + s a n o k a a p a + s a n o k o o n + s a n o m a a + s a n o m a a n + s a n o m a a n i + s a n o m a a n n e + s a n o m a l e h d e n + s a n o m a l e h d e n k i e l t ä m i s e s t ä + s a n o m a l e h d e s s ä + s a n o m a l e h d e s t ä + s a n o m a l e h d e t + s a n o m a l e h d i s s ä + s a n o m a l e h d i s t ä + s a n o m a l e h t i a r t i k k e l e i d e n + s a n o m a l e h t i a r t i k k e l e i h i n + s a n o m a l e h t i a r t i k k e l e i s s a + s a n o m a l e h t i a r t i k k e l e i t a + s a n o m a l e h t i a r t i k k e l i + s a n o m a l e h t i a r t i k k e l i a + s a n o m a l e h t i a r t i k k e l i n + s a n o m a l e h t i a r t i k k e l i s t a + s a n o m a l e h t i a r t i k k e l i t + s a n o m a l e h t i e n + s a n o m a l e h t i h a a s t a t t e l u + s a n o m a l e h t i k i r j o i t u k s i s s a + s a n o m a l e h t i k i r j o i t u k s i s t a + s a n o m a l e h t i k o l u m n i + s a n o m a l e h t i k u s t a n t a j a + s a n o m a l e h t i m a i n o k s i i n + s a n o m a l e h t i t e o l l i s u u s + s a n o m a l e h t i t i e t o j e n + s a n o m a l e h t i u u t i s i s s a + s a n o m a l e h t i y h t y m ä n + s a n o m a l e h t i ä + s a n o m a l l a + s a n o m a m m e + s a n o m a n + s a n o m a n i + s a n o m a n l ä h e t y s p a l v e l u i l l e + s a n o m a n n e + s a n o m a n v ä l i t y s t i e t o j e n + s a n o m a s t a n i + s a n o m a s t a n n e + s a n o m a t t a + s a n o m a t t a k i n + s a n o m i a a n + s a n o m i s e n i + s a n o m i s i s s a n i + s a n o m i s i s s a n n e + s a n o m i s i s t a n i + s a n o m i s t a + s a n o m m e + s a n o m m e k o + s a n o n + s a n o n e e n + s a n o n e e t + s a n o n e v a t k o + s a n o n k i n + s a n o n n a n + s a n o n t a a + s a n o n u t + s a n o o + s a n o t a + s a n o t a a n + s a n o t a a n k a a n + s a n o t a a n k i n + s a n o t a a n k o + s a n o t a a n p a + s a n o t a k a a n + s a n o t t a i s i i n + s a n o t t a k o o n + s a n o t t a v a a + s a n o t t a v a m m e + s a n o t t a v a n a a n + s a n o t t a v a n i + s a n o t t a v a n s a + s a n o t t a v a t + s a n o t t e + s a n o t t i i n + s a n o t t u a + s a n o t t u j a + s a n o t t u j e n + s a n o t t u k i n + s a n o t t u n a + s a n o t t u u n + s a n o t u i l l e + s a n o t u i s s a + s a n o t u n + s a n o t u s t a + s a n o t u t + s a n o u t u i v a t + s a n o v a n + s a n o v a t + s a n s k u l o t i t + s a n t a m a r t a n k e r t t u l i + s a n t a m a r t a n t a p a k u l o + s a n t a r m i e n + s a n t a r m i j o u k k o j e n + s a n t a r m i j o u k o t + s a n t e r i n + s a n t o s i n + s a p a t i n r i k o s + s a p a t t i k o u l u + s a p a t t i v a p a i t a + s a p e l i b e i s a + s a p e l i h a m m a s k i s s a t + s a p e l i l e u a t + s a p e l i n k a l i s t e l u l l a + s a p e l i n k a l i s t e l u n + s a p e l i n k a l i s t e l u u n + s a p e l i s u u + s a p e l i t a n s s i + s a p o t i l l a p u u + s a p p i h a p e r o + s a p p i r a k k o s y ö p ä + s a p p i s e i t i k k i + s a p p i t i e + s a p p i v a l m u s k a + s a r a a n + s a r a i k k o n i i t t y p e r h o n e n + s a r a k e r t t u n e n + s a r a k y l m ä n p e r h o n e n + s a r a l l a + s a r a p e u k a l o i n e n + s a r a r a h k a s a m m a l + s a r a s i r k k a l i n t u + s a r a t + s a r d e l l i a l a l l a + s a r d e l l i k a n n a l l e + s a r d e l l i k a n n a n + s a r d e l l i k a n t a + s a r d e l l i k a n t a a + s a r d e l l i k a n t a a n + s a r d e l l i k a n t o i h i n + s a r d e l l i k a n t o j e n + s a r d e l l i k i i n t i ö + s a r d e l l i m ä ä r ä ä + s a r d e l l i n p y y n n i s t ä + s a r d e l l i n p y y n t i ä + s a r d e l l i s u u n n i t e l m a + s a r d i i n i m y s t e e r i o + s a r d i i n i t e o l l i s u u s + s a r d i n i a n + s a r d i n i a n k e r t t u + s a r d i n i a n v i n t t i k o i r a + s a r i i n i k a a s u i s k u + s a r j a k s i + s a r j a k u v a f e s t i v a a l i + s a r j a k u v a h a h m o n + s a r j a k u v a h e m m o + s a r j a k u v a j u p a k k a + s a r j a k u v a k o h u s t a + s a r j a k u v a k r i i s i s s ä + s a r j a k u v a l e h d i s t ä + s a r j a k u v a l l e + s a r j a k u v a r o m a a n i + s a r j a l i i k e n n e + s a r j a m u r h a a j a + s a r j a m u r h a a j a a + s a r j a m u r h a a j a l l e + s a r j a m u r h a a j a t + s a r j a m u r h a a j i a + s a r j a m u r h a a j i s t a + s a r j a m u r h a t + s a r j a n + s a r j a t a l v i k k i + s a r j a t ä h d i k k i + s a r k o f a g i n + s a r k o o m a v i r u s + s a r s i s t a + s a r v e e n + s a r v e i s k a l v o r e n k a a t + s a r v e k k a a t + s a r v e n + s a r v e s s a + s a r v e s t a + s a r v i h a i + s a r v i h a i k a l a t + s a r v i j ä ä r ä t + s a r v i k a l a + s a r v i k i u r u + s a r v i k u o n o l e g u a a n i + s a r v i l o s s e r o k a l a + s a r v i m a t a r a + s a r v i n o k i k a n a + s a r v i o k a s i r k k a + s a r v i o r v o k k i + s a r v i p i i s p a n h a t t u + s a r v i p ö l l ö + s a r v i s a m m a l + s a s s a n i d i t + s a t a a + s a t a a k a a n + s a t a a k a h t a k y m m e n t ä + s a t a a n + s a t a a n s e i t s e m ä ä n k y m m e n e e n t u h a n t e e n + s a t a a t u h a t t a + s a t a k a k s i k y m m e n t ä + s a t a k e r t a i s e s t i + s a t a k e r t a i s i a + s a t a k i e l i + s a t a k i e l i p e u k a l o i n e n + s a t a k u u s i k y m m e n t ä + s a t a k y m m e n e n + s a t a m a a + s a t a m a a n + s a t a m a d i r e k t i i v i + s a t a m a d i r e k t i i v i i n + s a t a m a d i r e k t i i v i k i n + s a t a m a d i r e k t i i v i k s i + s a t a m a d i r e k t i i v i n + s a t a m a d i r e k t i i v i s s ä + s a t a m a d i r e k t i i v i s t ä + s a t a m a d i r e k t i i v i ä + s a t a m a h a n k e + s a t a m a h e n k i l ö s t ö s t ä + s a t a m a i n f r a s t r u k t u u r e i l l e + s a t a m a i n f r a s t r u k t u u r e j a m m e + s a t a m a i n f r a s t r u k t u u r i + s a t a m a i n f r a s t r u k t u u r i a + s a t a m a i n f r a s t r u k t u u r i e n + s a t a m a i n f r a s t r u k t u u r i n + s a t a m a i n f r a s t r u k t u u r i t + s a t a m a j ä r j e s t e l m i e n + s a t a m a j ä r j e s t e l m ä + s a t a m a j ä r j e s t e l m ä n + s a t a m a j ä r j e s t e l m ä s s ä + s a t a m a j ä r j e s t e l m ä ä + s a t a m a j ä r j e s t e l y j ä + s a t a m a j ä r j e s t ö + s a t a m a j ä s e n v a l t i o n + s a t a m a k a p a s i t e e t i n + s a t a m a k a p a s i t e e t t i a + s a t a m a k a t e g o r i o i t a + s a t a m a k a u p u n g e i s s a + s a t a m a k a u p u n g i s t a + s a t a m a k a u p u n k i + s a t a m a k a u p u n k i e n + s a t a m a k o h t a i s t e n + s a t a m a k o m p l e k s e i s t a + s a t a m a k o m p l e k s i + s a t a m a k u s t a n n u s t e n + s a t a m a l a i t o k s e t + s a t a m a l a i t o k s i i n + s a t a m a l a i t o s t e n + s a t a m a l a i t t e i s t o a + s a t a m a l a i t t e i s t o i h i n + s a t a m a l a i t t e i s t o j e n + s a t a m a l a i t u r i n + s a t a m a l a k k o j e n + s a t a m a l i i k e n t e e n + s a t a m a l o m a k k e e s t a + s a t a m a l u o k k a + s a t a m a m a k s u + s a t a m a m a k s u i h i n + s a t a m a m a k s u i k s i + s a t a m a m a k s u i l l a + s a t a m a m a k s u i s s a + s a t a m a m a k s u i s t a + s a t a m a m a k s u j a + s a t a m a m a k s u j e n + s a t a m a m a k s u n + s a t a m a m a k s u t + s a t a m a m a k s u u n + s a t a m a m a r k k i n o i l l a + s a t a m a m e n e t t e l y i h i n + s a t a m a m o n o p o l i l l e + s a t a m a m u o d o l l i s u u k s i e n + s a t a m a n + s a t a m a n a + s a t a m a n o s t u r i + s a t a m a n s a + s a t a m a o p e r a a t t o r e i l l e + s a t a m a o p e r a a t t o r e i t a + s a t a m a o p e r a a t t o r i e n + s a t a m a o p e r a a t t o r i n + s a t a m a p a k e t i l l e + s a t a m a p a k e t i n + s a t a m a p a k e t i s t a + s a t a m a p a k e t t i + s a t a m a p a k e t t i a + s a t a m a p a k e t t i p r o s e s s i a + s a t a m a p a l v e l u + s a t a m a p a l v e l u a + s a t a m a p a l v e l u d i r e k t i i v i + s a t a m a p a l v e l u d i r e k t i i v i i n + s a t a m a p a l v e l u d i r e k t i i v i l l ä + s a t a m a p a l v e l u d i r e k t i i v i n + s a t a m a p a l v e l u d i r e k t i i v i s s ä + s a t a m a p a l v e l u d i r e k t i i v i ä + s a t a m a p a l v e l u i d e n + s a t a m a p a l v e l u i h i n + s a t a m a p a l v e l u i l l a + s a t a m a p a l v e l u i l l e + s a t a m a p a l v e l u i l t a + s a t a m a p a l v e l u i n e e n + s a t a m a p a l v e l u i s t a + s a t a m a p a l v e l u i t a + s a t a m a p a l v e l u j a + s a t a m a p a l v e l u j e n + s a t a m a p a l v e l u m a r k k i n a t + s a t a m a p a l v e l u t + s a t a m a p a l v e l u t y ö n t e k i j ö i d e n + s a t a m a p o l i t i i k a l l a + s a t a m a p o l i t i i k a l l e + s a t a m a p o l i t i i k a n + s a t a m a p o l i t i i k a s t a + s a t a m a p o l i t i i k k a + s a t a m a p o l i t i i k k a a + s a t a m a p o l i t i i k k a a n + s a t a m a p ä ä l l i k ö i l l e + s a t a m a r a k e n n u k s i i n + s a t a m a r a k e n t e e t + s a t a m a r a k e n t e i d e n + s a t a m a r a t a + s a t a m a s s a + s a t a m a s t a + s a t a m a s t r a t e g i a s t a + s a t a m a t + s a t a m a t a r k a s t a j i a + s a t a m a t a r k a s t u k s e t + s a t a m a t a r k a s t u k s i a + s a t a m a t a r k a s t u k s i s s a + s a t a m a t a r k a s t u k s i s t a + s a t a m a t a r k a s t u s t e n + s a t a m a t e o l l i s u u t t a + s a t a m a t o i m e n p i t e i d e n + s a t a m a t o i m i i n + s a t a m a t o i m i j o i d e n + s a t a m a t o i m i n n a n + s a t a m a t o i m i n t a + s a t a m a t o i m i n t o i h i n + s a t a m a t o i m i n t o j e n + s a t a m a t u n n e l i + s a t a m a t u r v a l l i s u u t e e n + s a t a m a t y ö l l ä + s a t a m a t y ö l ä i s e t + s a t a m a t y ö l ä i s i l l e + s a t a m a t y ö l ä i s i ä + s a t a m a t y ö l ä i s t e n + s a t a m a t y ö n + s a t a m a t y ö n t e k i j ä n + s a t a m a t y ö n t e k i j ä t + s a t a m a t y ö n t e k i j ä t k ä ä n + s a t a m a t y ö n t e k i j ö i d e n + s a t a m a t y ö n t e k i j ö i l l e + s a t a m a t y ö n t e k i j ö i l l ä + s a t a m a t y ö n t e k i j ö i l t ä + s a t a m a t y ö n t e k i j ö i s t ä + s a t a m a t y ö n t e k i j ö i t ä + s a t a m a t y ö p a i k k o j e n + s a t a m a t y ö s s ä + s a t a m a t y ö s t ä + s a t a m a t y ö v o i m a a + s a t a m a v a l t i o + s a t a m a v a l t i o d i r e k t i i v i + s a t a m a v a l t i o i d e n + s a t a m a v a l t i o i l l a + s a t a m a v a l t i o i t a + s a t a m a v a l t i o l l a + s a t a m a v a l t i o l l e + s a t a m a v a l t i o n + s a t a m a v a l t i o s t a + s a t a m a v a l t i o t + s a t a m a v a l t i o v a l v o n t a d i r e k t i i v i + s a t a m a v a l v o n n a n + s a t a m a v a l v o n n a s t a + s a t a m a v a l v o n t a + s a t a m a v a l v o n t a a + s a t a m a v a l v o n t a a n + s a t a m a v a l v o n t a d i r e k t i i v i l l ä + s a t a m a v e r k k o j e n + s a t a m a v e r o + s a t a m a v i r a n o m a i n e n + s a t a m a v i r a n o m a i s e l l a + s a t a m a v i r a n o m a i s e n + s a t a m a v i r a n o m a i s e t + s a t a m a v i r a n o m a i s i l l a + s a t a m a v i r a n o m a i s i l l e + s a t a m a v i r a n o m a i s t e n + s a t a m a y m p ä r i s t ö t + s a t a m a y r i t t ä j ä t + s a t a m a y r i t y k s i ä + s a t a m a y r i t y s t e n + s a t a m i a + s a t a m i e n + s a t a m i i n + s a t a m i i n s a + s a t a m i l j o o n a a + s a t a m i l l a + s a t a m i l l e + s a t a m i s s a + s a t a m i s s a m m e + s a t a m i s t a + s a t a p r o s e n t t i n e n + s a t a p r o s e n t t i s e l l a + s a t a p r o s e n t t i s e n + s a t a p r o s e n t t i s e s t i + s a t a p r o s e n t t i s t a + s a t a p ä i v ä i s t ä + s a t a s i v u i n e n + s a t a t u h a t p ä i s e n + s a t a t u h a t t a + s a t a v i i s i k y m m e n t ä t u h a t t a + s a t a v u o t i n e n + s a t a v u o t i s e n + s a t a v u o t i s e s s a + s a t a v u o t i s j u h l a a + s a t a v u o t i s j u h l a a n + s a t a v u o t i s p ä i v ä m m e + s a t a v u o t i s t a + s a t e e l l a + s a t e e l t a + s a t e e n k a a r i a h v e n + s a t e e n k a a r i b o a + s a t e e n k a a r i h a l l i t u k s e s s a + s a t e e n k a a r i k a i j a + s a t e e n k a a r i k a r d i n a a l i + s a t e e n k a a r i l i p p u + s a t e e n k a a r i p a i t a + s a t e e n k a a r i p e i p p o + s a t e e n k a a r i p e r h e + s a t e e n v a r j o j a l a v a + s a t e e n v a r j o j ä r j e s t ö + s a t e e n v a r j o k ä s i t e + s a t e e n v a r j o l a j i + s a t e e n v a r j o r y h m ä + s a t e e n v a r j o s e r t i f i k a a t i l l a + s a t e e n v a r j o s o p i m u s + s a t e e s s a + s a t e e t + s a t e i d e n + s a t e i s t a + s a t e i t a + s a t e l l i i t i t + s a t e l l i i t t e j a a n + s a t e l l i i t t i a l a + s a t e l l i i t t i a l a n + s a t e l l i i t t i a n t e n n i + s a t e l l i i t t i a n t e n n i e n + s a t e l l i i t t i a s e m a t + s a t e l l i i t t i e n + s a t e l l i i t t i g a l a k s i + s a t e l l i i t t i h a n k e + s a t e l l i i t t i h a n k k e e s s a + s a t e l l i i t t i h a n k k e i s i i n + s a t e l l i i t t i j ä r j e s t e l m i e n + s a t e l l i i t t i j ä r j e s t e l m i i n + s a t e l l i i t t i j ä r j e s t e l m i l l ä + s a t e l l i i t t i j ä r j e s t e l m i s t ä + s a t e l l i i t t i j ä r j e s t e l m i ä + s a t e l l i i t t i j ä r j e s t e l m ä + s a t e l l i i t t i j ä r j e s t e l m ä n + s a t e l l i i t t i j ä r j e s t e l m ä n s ä + s a t e l l i i t t i j ä r j e s t e l m ä s t ä + s a t e l l i i t t i j ä r j e s t e l m ä t + s a t e l l i i t t i j ä r j e s t e l m ä ä + s a t e l l i i t t i j ä r j e s t e l m ä ä n + s a t e l l i i t t i j ä r j e s t ö t + s a t e l l i i t t i k a n a v a + s a t e l l i i t t i k a n a v a y h t i ö i t ä + s a t e l l i i t t i k a r t t o j a + s a t e l l i i t t i k a u p u n k e j a + s a t e l l i i t t i k e s k u k s e l l a + s a t e l l i i t t i k e s k u k s e m m e + s a t e l l i i t t i k e s k u k s e n + s a t e l l i i t t i k e s k u k s e s t a + s a t e l l i i t t i k e s k u s + s a t e l l i i t t i k e s k u s t a + s a t e l l i i t t i k o m m u n i k a a t i o + s a t e l l i i t t i k u l t t u u r i k e s k u s t e n + s a t e l l i i t t i k u l u i s t a + s a t e l l i i t t i k u v a + s a t e l l i i t t i k u v a a + s a t e l l i i t t i k u v a p a l v e l u k e s k u s + s a t e l l i i t t i k u v a s t a + s a t e l l i i t t i k u v a u s t a + s a t e l l i i t t i k u v i a + s a t e l l i i t t i k u v i l t a + s a t e l l i i t t i k u v i s t a + s a t e l l i i t t i k y s y m y k s e s t ä + s a t e l l i i t t i l a a j a k a i s t a + s a t e l l i i t t i l a i t t e i s i i n + s a t e l l i i t t i l a i t t e i s t o + s a t e l l i i t t i l a u t a s t a + s a t e l l i i t t i l a u t a s t e n + s a t e l l i i t t i l i n k i n + s a t e l l i i t t i l ä h e t y k s e t + s a t e l l i i t t i l ä h e t y k s i ä + s a t e l l i i t t i l ä h e t y s t o i m i n t a a n + s a t e l l i i t t i m a k s u n + s a t e l l i i t t i m a r k k i n o i l l a + s a t e l l i i t t i m u u t o s e s i t y k s e n ä + s a t e l l i i t t i n a v i g a a t i o j ä r j e s t e l m ä n + s a t e l l i i t t i n a v i g o i n n i l l a + s a t e l l i i t t i n a v i g o i n n i n + s a t e l l i i t t i n a v i g o i n n i s s a + s a t e l l i i t t i n a v i g o i n n i s t a + s a t e l l i i t t i n a v i g o i n t i + s a t e l l i i t t i n a v i g o i n t i a + s a t e l l i i t t i n a v i g o i n t i h a n k e t t a + s a t e l l i i t t i n a v i g o i n t i i n + s a t e l l i i t t i n a v i g o i n t i j ä r j e s t e l m i e n + s a t e l l i i t t i n a v i g o i n t i j ä r j e s t e l m i i n + s a t e l l i i t t i n a v i g o i n t i j ä r j e s t e l m i ä + s a t e l l i i t t i n a v i g o i n t i j ä r j e s t e l m ä + s a t e l l i i t t i n a v i g o i n t i j ä r j e s t e l m ä a l a + s a t e l l i i t t i n a v i g o i n t i j ä r j e s t e l m ä l l e + s a t e l l i i t t i n a v i g o i n t i j ä r j e s t e l m ä n + s a t e l l i i t t i n a v i g o i n t i j ä r j e s t e l m ä s s ä + s a t e l l i i t t i n a v i g o i n t i j ä r j e s t e l m ä s t ä + s a t e l l i i t t i n a v i g o i n t i j ä r j e s t e l m ä t + s a t e l l i i t t i n a v i g o i n t i j ä r j e s t e l m ä ä + s a t e l l i i t t i n a v i g o i n t i j ä r j e s t e l m ä ä n + s a t e l l i i t t i n a v i g o i n t i o h j e l m a + s a t e l l i i t t i n a v i g o i n t i o h j e l m a a + s a t e l l i i t t i n a v i g o i n t i o h j e l m a n + s a t e l l i i t t i n a v i g o i n t i o h j e l m a t + s a t e l l i i t t i n a v i g o i n t i o h j e l m i a + s a t e l l i i t t i n a v i g o i n t i o h j e l m i e n + s a t e l l i i t t i n a v i g o i n t i o h j e l m i l l e + s a t e l l i i t t i n a v i g o i n t i p a l v e l u j a + s a t e l l i i t t i n a v i g o i n t i s o v e l l u k s i a + s a t e l l i i t t i n a v i g o i n t i t e k n i i k k a a + s a t e l l i i t t i n a v i g o i n t i t e k n o l o g i a n + s a t e l l i i t t i n a v i g o i n t i t e k n o l o g i a s s a + s a t e l l i i t t i o h j a t u s t a + s a t e l l i i t t i o p e r a a t t o r e i d e n + s a t e l l i i t t i o p e r a a t t o r i + s a t e l l i i t t i p a i k a n n u k s e e n + s a t e l l i i t t i p a i k a n n u k s e n + s a t e l l i i t t i p a i k a n n u s + s a t e l l i i t t i p a i k a n n u s h a n k e + s a t e l l i i t t i p a i k a n n u s j ä r j e s t e l m i e n + s a t e l l i i t t i p a i k a n n u s j ä r j e s t e l m ä + s a t e l l i i t t i p a i k a n n u s j ä r j e s t e l m ä n + s a t e l l i i t t i p a i k a n n u s o h j e l m a n + s a t e l l i i t t i p a i k a n n u s p a l v e l u j e n + s a t e l l i i t t i p a i k a n n u s s i g n a a l i e n + s a t e l l i i t t i p a i k a n n u s t a + s a t e l l i i t t i p a i k a n n u s t e k n i i k k a a + s a t e l l i i t t i p a i k a n n u s v ä l i n e e t + s a t e l l i i t t i p a i k a n t a m i s j ä r j e s t e l m ä n + s a t e l l i i t t i p a i k a n t a m i s t a + s a t e l l i i t t i p a l v e l u i d e n + s a t e l l i i t t i p a l v e l u i s t a + s a t e l l i i t t i p a l v e l u j a + s a t e l l i i t t i p e r u s t a i s t e n + s a t e l l i i t t i p e r u s t e i s t a + s a t e l l i i t t i p o h j a i s e n + s a t e l l i i t t i p o h j a i s e t + s a t e l l i i t t i p o h j a i s i a + s a t e l l i i t t i p o h j a i s i s s a + s a t e l l i i t t i p o h j a i s t a + s a t e l l i i t t i p u h e l i m i a + s a t e l l i i t t i p u h e l i n + s a t e l l i i t t i p u o l u s t u s j ä r j e s t e l m ä ä + s a t e l l i i t t i r a d i o + s a t e l l i i t t i r a d i o n a v i g o i n t i + s a t e l l i i t t i r a d i o n a v i g o i n t i j ä r j e s t e l m ä n + s a t e l l i i t t i r a d i o n a v i g o i n t i m o n o p o l i s t a + s a t e l l i i t t i r a d i o n a v i g o i n t i o h j e l m a + s a t e l l i i t t i r a d i o n a v i g o i n t i o h j e l m i e n + s a t e l l i i t t i r a d i o n a v i g o i n t i o h j e l m i s t a + s a t e l l i i t t i s e u r a n t a + s a t e l l i i t t i s e u r a n t a a + s a t e l l i i t t i s e u r a n t a j ä r j e s t e l m i e n + s a t e l l i i t t i s e u r a n t a j ä r j e s t e l m i ä + s a t e l l i i t t i s e u r a n t a j ä r j e s t e l m ä + s a t e l l i i t t i s e u r a n t a j ä r j e s t e l m ä l l e + s a t e l l i i t t i s e u r a n t a j ä r j e s t e l m ä l l ä + s a t e l l i i t t i s e u r a n t a j ä r j e s t e l m ä ä + s a t e l l i i t t i s e u r a n t a l a i t t e e s e e n + s a t e l l i i t t i s i g n a a l i e n + s a t e l l i i t t i s i g n a a l i n + s a t e l l i i t t i s o v e l l u k s e t + s a t e l l i i t t i s o v e l l u k s i a + s a t e l l i i t t i s o v e l l u s t e n + s a t e l l i i t t i t a a j u u k s i e n + s a t e l l i i t t i t e k n i i k a l l a + s a t e l l i i t t i t e k n i i k a n + s a t e l l i i t t i t e k n i i k k a + s a t e l l i i t t i t e k n i i k k a a + s a t e l l i i t t i t e k n o l o g i a a + s a t e l l i i t t i t e k n o l o g i a j ä r j e s t e l m i ä + s a t e l l i i t t i t e k n o l o g i a l l e + s a t e l l i i t t i t e k n o l o g i a n + s a t e l l i i t t i t e l e v i s i o + s a t e l l i i t t i t e l e v i s i o d i r e k t i i v i n + s a t e l l i i t t i t e l e v i s i o i t a + s a t e l l i i t t i t e l e v i s i o k a n a v a + s a t e l l i i t t i t e l e v i s i o k a n a v a a + s a t e l l i i t t i t e l e v i s i o n + s a t e l l i i t t i t e l e v i s i o o n + s a t e l l i i t t i t e l e v i s i o s s a + s a t e l l i i t t i t e l e v i s i o v a s t a a n o t t i m i e n + s a t e l l i i t t i t e l e v i s i o y h t i ö i t ä + s a t e l l i i t t i t e o l l i s u u d e n + s a t e l l i i t t i t e o l l i s u u s + s a t e l l i i t t i t e o l l i s u u t e e n + s a t e l l i i t t i t e o l l i s u u t t a + s a t e l l i i t t i t e o l l i s u u t t a m m e + s a t e l l i i t t i t i e d o i l l a + s a t e l l i i t t i t i e d u s t e l u j ä r j e s t e l m ä ä n + s a t e l l i i t t i t i e d u s t e l u u n + s a t e l l i i t t i t i e t o j e n + s a t e l l i i t t i t i e t o l i i k e n n e + s a t e l l i i t t i t i e t o l i i k e n t e e n + s a t e l l i i t t i t i e t o l i i k e n t e e s e e n + s a t e l l i i t t i t i l e j ä + s a t e l l i i t t i t i l i n p i d o k s i + s a t e l l i i t t i t i l i n p i d o n + s a t e l l i i t t i t i l i n p i t o + s a t e l l i i t t i t i l i n p i t o a + s a t e l l i i t t i t o i m i e l i m e n + s a t e l l i i t t i t r a n s p o n d e r e i h i n + s a t e l l i i t t i t u t k i m u k s i i n + s a t e l l i i t t i t u t k i m u s + s a t e l l i i t t i v a i h e e s s a + s a t e l l i i t t i v a l t i o + s a t e l l i i t t i v a l t i o i d e n + s a t e l l i i t t i v a l t i o i l l a + s a t e l l i i t t i v a l t i o i l l e + s a t e l l i i t t i v a l t i o i t a + s a t e l l i i t t i v a l t i o s t a + s a t e l l i i t t i v a l t i o t + s a t e l l i i t t i v a l v o n n a n + s a t e l l i i t t i v a l v o n n a s t a + s a t e l l i i t t i v a l v o n t a + s a t e l l i i t t i v a l v o n t a a + s a t e l l i i t t i v a l v o n t a j ä r j e s t e l m i i n + s a t e l l i i t t i v a l v o n t a j ä r j e s t e l m i s t ä + s a t e l l i i t t i v a l v o n t a j ä r j e s t e l m i ä + s a t e l l i i t t i v a l v o n t a j ä r j e s t e l m ä + s a t e l l i i t t i v a l v o n t a j ä r j e s t e l m ä n + s a t e l l i i t t i v a l v o n t a j ä r j e s t e l m ä n s ä + s a t e l l i i t t i v a l v o n t a o h j e l m a + s a t e l l i i t t i v e r k k o a + s a t e l l i i t t i v e r k o s t o n + s a t e l l i i t t i v i e s t i n n ä l l ä + s a t e l l i i t t i v i e s t i n n ä n + s a t e l l i i t t i v i e s t i n n ä s t ä + s a t e l l i i t t i v i e s t i n t ä + s a t e l l i i t t i v i e s t i n t ä a l a + s a t e l l i i t t i v i e s t i n t ä j ä r j e s t e l m i ä + s a t e l l i i t t i v i e s t i n t ä v e r k o n + s a t e l l i i t t i v i e s t i n t ä ä + s a t e l l i i t t i v i r a s t o i s t a + s a t e l l i i t t i v i r a s t o j a + s a t e l l i i t t i v i r a s t o j e n + s a t e l l i i t t i v ä l i t t e i s e t + s a t e l l i i t t i v ä l i t t e i s i ä + s a t e l l i i t t i v ä l i t t e i s t e n + s a t e l l i i t t i y h t e y d e t + s a t e l l i i t t i y h t e y k s i e n + s a t e l l i i t t i y h t e y k s i ä + s a t e l l i i t t i y h t e y t e m m e + s a t e l l i i t t i y h t i ö n + s a t i i n i l a v a s t a j a + s a t i i r i k o n + s a t o a + s a t o e n n u s t e i t a + s a t o e n n ä t y s + s a t o i h i n + s a t o i h i n t u h a n s i i n + s a t o j a + s a t o j a m i l j o o n i a + s a t o j a t u h a n s i a + s a t o j e n + s a t o j e n m i l j o o n i e n + s a t o j e n t u h a n s i e n + s a t o k a u t t a + s a t o n s a + s a t o r a p o r t i n + s a t o v a i h t e l u t + s a t t u a + s a t t u e s s a + s a t t u i + s a t t u i k o + s a t t u i s i + s a t t u m a a + s a t t u m a n + s a t t u m a n k a u p p a a + s a t t u m a n v a r a i s e l l a + s a t t u m a n v a r a i s e n + s a t t u m a n v a r a i s e s t i + s a t t u m a n v a r a i s e t + s a t t u m a n v a r a i s i i n + s a t t u m a n v a r a i s t a + s a t t u n e e n + s a t t u n e e s s a + s a t t u n e e s t a + s a t t u n e e t + s a t t u n e i s t a + s a t t u n u t + s a t t u n u t t a + s a t t u u + s a t t u v i s t a + s a t u a + s a t u i l u a + s a t u i n e e n + s a t u j a + s a t u j e n + s a t u k i r j o i s t a + s a t u k o k o e l m i i n + s a t u l a h u o p a + s a t u l a p a l l o k a l a + s a t u l a p i s t e + s a t u l a t u o l i + s a t u l a v u o k k o k a l a + s a t u m a a + s a t u m a a i l m a + s a t u n n a i s e n + s a t u n n a i s e s t a + s a t u n n a i s e t + s a t u n n a i s i a + s a t u n n a i s i i n + s a t u n n a i s i l l e + s a t u n n a i s i s t a + s a t u n n a i s k u l k u + s a t u n n a i s l u k u + s a t u n n a i s m i t t a u s t e n + s a t u n n a i s o t a n n a l l a + s a t u n n a i s o t a n t a a n + s a t u n n a i s o t o k s i a + s a t u n n a i s p ä ä s t ö i s t ä + s a t u n n a i s t a r k a s t u k s e t + s a t u n n a i s t a r k a s t u k s i a + s a t u n n a i s t a r k i s t u k s i i n + s a t u n n a i s t e n + s a t u n n a i s t y ö t + s a t u n n a i s v a i h t e l u t + s a t u n n a i s v o i t t o i n a + s a t u n n a i s v o i t t o j a + s a t u n n a i s v o i t t o j a a n + s a t u n n a i s v o i t t o n s a + s a t u n n a i s v o i t t o v e r o n + s a t u r a a t i o p i s t e e s e e n + s a t u r a a t i o s u k e l l u s + s a t y y r i n ä y t e l m ä + s a u d i a r a b i a l a i s i a + s a u d i a r a b i a l a i s t e n + s a u d i a r a b i a n + s a u d i j o u k o t + s a u d i m i l j o n ä ä r i + s a u d i s i j o i t t a j a t + s a u d i s o t i l a s t a + s a u k k o b e l e t t i + s a u m a k i r j o a h v e n + s a u m a m y r k k y l u i k e r o + s a u m a t o n t a + s a u m o i s t a a n + s a u n a k u l t t u u r i a + s a u n i o n o i d a n l u k k o + s a u v a k i r k k o + s a u v a k ä v e l y + s a u v a r i s t i h ä m ä h ä k i t + s a u v a r u l l a l u i s t e l u + s a u v a s e k o i t i n + s a u v a s o l u + s a u v a s p i r a a l i g a l a k s i + s a v a n n i a r a + s a v a n n i b u l b u l i + s a v a n n i h a i k a r a + s a v a n n i h e m p p o + s a v a n n i h i i r i h a u k k a + s a v a n n i h u i l u v a r i s + s a v a n n i h u u h k a j a + s a v a n n i j e n g i + s a v a n n i k a i j a n e n + s a v a n n i k i i p i j ä + s a v a n n i k i r v i n e n + s a v a n n i k i u r u + s a v a n n i k o r p p i k o t k a + s a v a n n i k o t k a + s a v a n n i k u h a n k e i t t ä j ä + s a v a n n i k ä ä r m e k o t k a + s a v a n n i l a u l u m e s i k k o + s a v a n n i l i n t u h a u k k a + s a v a n n i n o r s u + s a v a n n i p a r a t i i s i k a i j a + s a v a n n i p y y j u o k s i j a + s a v a n n i r u u s u p e i p p o + s a v a n n i s i n i n ä r h i + s a v a n n i t a s k u + s a v a n n i t i k k a n e n + s a v a n n i t u r t u r i k y y h k y + s a v a n n i t u u l i h a u k k a + s a v a n n i t y r a n n i + s a v a n n i t ä p l ä t i k k a + s a v a n n i t ö p ö k e r t t u n e n + s a v a n n i v a h a n o k k a + s a v a n n i v a r i s + s a v a n n i v a r p u s p ö l l ö + s a v i j a l a t + s a v i j a l o i l l a + s a v i j ä k k ä r ä + s a v i k i e k k o + s a v i k k o m u s t e s i e n i + s a v i k o i p i r ä i k k ä + s a v i m a a l l a + s a v i m a j a n + s a v i m a j o i s s a + s a v i m i n e r a a l i + s a v i r a s t u l i + s a v o l a i s e t + s a v o l a i s m u r t e e t + s a v u a r o m e j a + s a v u a r o m i e n + s a v u a r o m i t + s a v u e f e k t i + s a v u g e n e r a a t t o r i + s a v u h a p e r o + s a v u h i u k k a s i l l e + s a v u k a a s u + s a v u k a l a a + s a v u k e a l a l l a + s a v u k e a s k e i h i n + s a v u k e a s k e i s s a + s a v u k e a s k i + s a v u k e a s k i e n + s a v u k e a s k i k s i + s a v u k e a s k i t + s a v u k e k a u p a n + s a v u k e k o n t i n + s a v u k e l a s t e j a + s a v u k e m a k e i s i a + s a v u k e o n g e l m a a n + s a v u k e p a k e t t e i h i n + s a v u k e p a k k a u k s i i n + s a v u k e p a k k a u k s i s s a + s a v u k e p a k k a u s + s a v u k e p a k k a u s t e n + s a v u k e p a p e r i + s a v u k e p e t o k s e t + s a v u k e p e t o k s i a + s a v u k e p e t o k s i s t a + s a v u k e r a s i a + s a v u k e r a s i o i d e n + s a v u k e r a s i o i h i n + s a v u k e r a s i o i s s a + s a v u k e s e k o i t u k s i s s a + s a v u k e s u o d a t t i m i s s a + s a v u k e t e o l l i s u u d e n + s a v u k e t e o l l i s u u s + s a v u k e t u o t a n n o s t a + s a v u k e v a l m i s t a j a n + s a v u k e v e r o i s t a + s a v u k e v i e n n i n + s a v u k e y r i t y k s e t + s a v u k k e i d e n + s a v u k k e i d e n m y y n n i s t ä + s a v u k k e i s s a + s a v u k k e i s t a + s a v u k o n e + s a v u k o t i n g a + s a v u k v a r t s i + s a v u l y i j y k e r t t u + s a v u m e r k k e j ä + s a v u m e r k k i + s a v u m u u r a + s a v u n + s a v u n m e r i + s a v u n t ä y t e i s e s s ä + s a v u n t ä y t t e i s e t + s a v u o l u t + s a v u p i i p p u k a p i t a l i s m i a + s a v u p i i p p u t e o l l i s u u d e s s a + s a v u p i i p p u t e o l l i s u u t t a + s a v u p i l v e k s i + s a v u p i s t e + s a v u p o s k i t i k k a + s a v u p ä ä s k y + s a v u r e n k a i t a + s a v u r o u s k u + s a v u s u m u + s a v u s u m u s s a + s a v u s u m u s t a + s a v u s u o j a i m i s t a + s a v u s u o j a i n t e n + s a v u t a p a k u l o + s a v u t i k k a + s a v u t o n t a + s a v u t t o m a a n + s a v u t t o m a k s i + s a v u t t o m a n + s a v u t t o m a s s a + s a v u t t o m a s t a + s a v u t t o m a t + s a v u t t o m i a + s a v u t t o m i e n + s a v u t t o m i k s i + s a v u t t o m i s s a + s a v u t t o m i s t a + s a v u v a h i n k o j a + s a v u v e r h o + s a v u v e r h o a + s a v u v e r h o n + s a v u v e r h o n a + s a v u v e r h o s s a + s e a l y h a m i n t e r r i e r i + s e d i m e n t t i k i v i l a j i + s e e m i l ä i s e t + s e e p r a h a i + s e e p r a h y p p i j ä + s e e p r a k i r j o a h v e n + s e e p r a k o t i l o a h v e n + s e e p r a l u h t a k a n a + s e e p r a m a i j a + s e e p r a m a k r i l l i + s e e p r a m a n g u s t i + s e e p r a m y r k k y l u i k e r o + s e e p r a n u o l i m o n n i + s e e p r a p a l l o k a l a + s e e p r a p e i p p o + s e e p r a p r e u s s i n a h v e n + s e e p r a s a r v i h a i + s e e p r a s i i p i s i m p p u + s e e p r a v u o k k o k a l a + s e e p r a v ä l s k ä r i + s e e s a m i ö l j y + s e e t r i k e r t t u l i + s e f a r d i j u u t a l a i s e t + s e g m e n t t i r a p o r t o i n n i s t a + s e g m e n t t i r a p o r t o i n t i a + s e i k a n + s e i k a s s a + s e i k a s t a + s e i k a t + s e i k k a a + s e i k k a a n + s e i k k a i l e e + s e i k k a i l u a l a n + s e i k k a i l u e l o k u v a + s e i k k a i l u e l o k u v i a + s e i k k a i l u h e n g e s t ä + s e i k k a i l u m e t s ä + s e i k k a i l u p e l i + s e i k k a i l u p o l i t i i k k a a + s e i k k a i l u t + s e i k k a i l u u n + s e i k k a n a + s e i k k a p e r ä i s e m m i n + s e i k k a p e r ä i s e m m ä n + s e i k k a p e r ä i s e m p i ä + s e i k k a p e r ä i s t e n + s e i k k o i h i n + s e i k k o j a + s e i k k o j e n + s e i k o i s t a + s e i l a a v a t + s e i n i l l e + s e i n i ä + s e i n ä k e l l o + s e i n ä k i i p e i l y + s e i n ä k i r j o i t u k s e t + s e i n ä k u k k a s e k s i + s e i n ä l l e + s e i n ä l u k k i + s e i n ä p i l v i + s e i n ä r a u n i o i n e n + s e i n ä r u u s u n a + s e i n ä s a m m a l + s e i n ä ä + s e i n ä ä n + s e i r e e n i n l a u l u j e n + s e i s a a l l a a n + s e i s a a l t a a n + s e i s a h t u u + s e i s a u t e t t u + s e i s m i s i l l ä + s e i s o a + s e i s o i m m e + s e i s o i m m e p a + s e i s o i n + s e i s o i v a t + s e i s o m a t e l i n e + s e i s o m m e + s e i s o n + s e i s o n t a j a r r u + s e i s o n t a p a i k k a t a r k a s t u k s i e n + s e i s o o + s e i s o t t a v a + s e i s o v a t + s e i s o v i a + s e i s t e n + s e i s t e s s ä ä n + s e i s t ä + s e i s t ä k s e e n + s e i t i v a l a s + s e i t s e m ä l l e + s e i t s e m ä l l ä + s e i t s e m ä n k e r t a i n e n + s e i t s e m ä n k e r t a i s t a + s e i t s e m ä n k y m m e n t ä l u v u l l a + s e i t s e m ä n n e k s i + s e i t s e m ä n n e l l ä + s e i t s e m ä n n e n + s e i t s e m ä n n e s s ä + s e i t s e m ä n n e s t ä + s e i t s e m ä n s i v u i n e n + s e i t s e m ä n t e e n + s e i t s e m ä n v u o t i a i t a + s e i t s e m ä n v u o t i a s + s e i t s e m ä n v u o t i s e k s i + s e i t s e m ä n ä + s e i t s e m ä s o s a a n + s e i t s e m ä s s ä + s e i t s e m ä s t ä + s e i t s e m ä ä + s e i t s e m ä ä n + s e i t s e n j ä s e n i s e e n + s e i t s e n k e r t a i n e n + s e i t s e n k e r t a i s e k s i + s e i t s e n k e r t a i s e n + s e i t s e n k e r t a i s e n a + s e i t s e n k e r t a i s e s t i + s e i t s e n k e r t a i s t u n e e t + s e i t s e n k e r t a i s t u n u t + s e i t s e n k o h t a i s e n + s e i t s e n k u l m i o l u k u + s e i t s e n p i s t e p i r k k o + s e i t s e n p ä i v ä i s t ä + s e i t s e n r u o t o t o k k o + s e i t s e n v u o t i a s + s e i t s e n v u o t i n e n + s e i t s e n v u o t i s e e n + s e i t s e n v u o t i s e l l a + s e i t s e n v u o t i s e l l e + s e i t s e n v u o t i s e n + s e i t s e n v u o t i s e s s a + s e i t s e n v u o t i s e s t a + s e i t s e n v u o t i s j a k s o + s e i t s e n v u o t i s j a k s o n + s e i t s e n v u o t i s k a u d e l l a + s e i t s e n v u o t i s t a + s e i t s e n v u o t i s t e n + s e i t s i k k o h i k k o r i + s e i t t i m e h i t ä h t i + s e i t t i t a k i a i n e n + s e i v ä s h y p p y + s e i v ä s h y p p ä ä j i ä + s e k a a n n u k s e n + s e k a a n n u k s e s t a + s e k a a n n u k s e t + s e k a a n n u k s i i n + s e k a a n n u k s i l t a + s e k a a n n u s t a + s e k a a n n u t t a v a + s e k a a n t u a + s e k a a n t u i s i + s e k a a n t u k o + s e k a a n t u m a a n + s e k a a n t u m a s t a + s e k a a n t u m a t t a + s e k a a n t u m i s e n a + s e k a a n t u m i s p o l i t i k k a a + s e k a a n t u m i s t a + s e k a a n t u u + s e k a a n t u v a t + s e k a e n e r g i a n + s e k a e n e r g i a s t a + s e k a h a l l i n t o k o m i t e a + s e k a i s t u n t o o n + s e k a j o u k k u e + s e k a j ä r j e s t e l m i l l ä + s e k a j ä r j e s t e l m i ä + s e k a j ä r j e s t e l m ä + s e k a j ä r j e s t e l m ä n + s e k a j ä r j e s t e l m ä n s ä + s e k a j ä r j e s t e l m ä ä + s e k a j ä r j e s t e l m ä ä n + s e k a j ä t t e e n + s e k a k a l a s t u k s e e n + s e k a k a l a s t u k s e n + s e k a k a l a s t u k s e s s a + s e k a k a l a s t u k s e s t a + s e k a k a l a s t u s a l u e i l l a + s e k a k a l a s t u s t a + s e k a k o k o o n p a n o i s s a + s e k a k o m i s s i o + s e k a k o m i s s i o n + s e k a k o m i t e a + s e k a k o m i t e a a + s e k a k o m i t e a a n + s e k a k o m i t e a l l e + s e k a k o m i t e a n + s e k a k o m i t e a s s a + s e k a k o m i t e a s t a + s e k a k o m i t e a t + s e k a k o m i t e o i d e n + s e k a k o m i t e o i l l a + s e k a k o m i t e o i s s a + s e k a k o m i t e o i s t a + s e k a k ä y t t ö + s e k a k ä y t t ö ä + s e k a k ä y t t ö ö n + s e k a k ä y t ö n + s e k a l i i k e n n e + s e k a l i i k e n n e t t ä + s e k a m e l s k a + s e k a m e n e t t e l y s t ä + s e k a m e t e l i s o p p a + s e k a m e t s i ä + s e k a m u o t o + s e k a m u o t o j a + s e k a n e l i n p e l i + s e k a n e l i n p e l i n + s e k a n t t i m e n e t e l m ä + s e k a o k s i d i p o l t t o a i n e e n + s e k a p e r h e i t ä + s e k a p o l t t o + s e k a p ä ä o m a y r i t y k s i s t ä + s e k a r a h o i t u s + s e k a r y h m ä + s e k a r y h m ä l l ä + s e k a r y h m ä ä + s e k a r y h m ä ä n + s e k a s o p i m u k s e k s i + s e k a s o p i m u k s e n + s e k a s o p i m u k s e t + s e k a s o p i m u k s i i n + s e k a s o p i m u s j ä r j e s t e l m ä ä + s e k a s o r t o + s e k a s o r t o a + s e k a s o r t o o n + s e k a s o t k u i n e n + s e k a s o t k u k s i + s e k a s t r a t e g i a a + s e k a s ä ä n t ö j e n + s e k a t a l o u d e n + s e k a t a l o u d e s s a + s e k a t a l o u s + s e k a t a l o u s j ä r j e s t e l m ä n + s e k a t a l o u s y h t e i s ö j e n + s e k a t a l o u s y h t e i s ö l l ä + s e k a t a l o u t e e n + s e k a t a l o u t t a + s e k a t a v a r a k a u p p i a a n + s e k a t u o m i o i s t u i n + s e k a t u o t a n t o t i l o i l l a + s e k a t u o t a n t o t i l o j a + s e k a t u o t a n t o y k s i k k ö j e n + s e k a t u o t a n t o y k s i k ö t + s e k a u i n n i s s a + s e k a u i n t i + s e k a v a a + s e k a v a k s i + s e k a v a l i o k u n n a n + s e k a v a l i o k u n n a s s a + s e k a v a l i o k u n n a s t a + s e k a v a l i o k u n n a t + s e k a v a l i o k u n n i l l a + s e k a v a l i o k u n n i s s a + s e k a v a l i o k u n t a a + s e k a v a l i o k u n t i e n + s e k a v a l t a + s e k a v a l t u u s k u n t i a + s e k a v a m m i k s i + s e k a v a m m i l l e + s e k a v a m m i l t a + s e k a v a m p a a + s e k a v a m p i + s e k a v a n a + s e k a v a t + s e k a v i a + s e k a v i e n + s e k a v i i n + s e k a v i l j e l y n + s e k a v i n + s e k a v i s s a + s e k a v u u k s i a + s e k a v u u t e n s a + s e k a y r i t y k s e e n + s e k a y r i t y k s i ä + s e k e i s s ä + s e k i n + s e k k e j ä + s e k k i v i h k o d i p l o m a t i a + s e k k i ä + s e k o i t a m m e + s e k o i t e t a a n + s e k o i t e t t a i s i + s e k o i t e t t i i n + s e k o i t t a a + s e k o i t t a i s i v a t + s e k o i t t a k o + s e k o i t t a m a a n + s e k o i t t a m a s t a + s e k o i t t a m a t t a + s e k o i t t a m i s e s t a + s e k o i t t a m i s k i e l t o + s e k o i t t a m i s v y ö h y k k e e s e e n + s e k o i t t a m i s v y ö h y k k e e t + s e k o i t t a m i s v y ö h y k k e i d e n + s e k o i t t u m i s v y ö h y k k e e t + s e k o i t t u m i s v y ö h y k k e i d e n + s e k o i t t u m i s v y ö h y k k e i k s i + s e k o i t t u m i s v y ö h y k k e i l l ä + s e k o i t t u m i s v y ö h y k k e i s t ä + s e k o i t t u m i s v y ö h y k k e i t ä + s e k o i t u k s i i n + s e k o i t u k s i s s a a n + s e k o i t u s k i e l t o + s e k o i t u s k i e l t o a + s e k o i t u s p a k o s t a + s e k o i t u s s u h d e + s e k o i t u s s u h t e e k s i + s e k o i t u s s ä i l i ö r e a k t o r i + s e k o i t u s v y ö h y k k e e t + s e k s i a l a + s e k s i a l a n + s e k s i e l ä m ä l l ä + s e k s i f a n t a s i a + s e k s i f a n t a s i o i t a a n + s e k s i h u r j a s t e l u n s a + s e k s i k a u p a n + s e k s i k a u p a s s a + s e k s i k a u p a s t a + s e k s i k a u p p a + s e k s i k a u p p a a + s e k s i k a u p p a a n + s e k s i k a u p p a r i n k e j ä + s e k s i k a u p p i a i d e n + s e k s i k k ä ä m m ä k s i + s e k s i k o h t a u s + s e k s i k o l l e g a + s e k s i k o n t a k t e j a + s e k s i k ä s t ä + s e k s i m a r k k i n o i l l a + s e k s i m a r k k i n o i l l e + s e k s i m a t k a i l i j a t + s e k s i m a t k a i l i j a v i r r a t + s e k s i m a t k a i l u + s e k s i m a t k a i l u a + s e k s i m a t k a i l u l l a + s e k s i m a t k a i l u l t a + s e k s i m a t k a i l u n + s e k s i m a t k a i l u s t a + s e k s i m a t k a i l u u n + s e k s i n + s e k s i n u k k e + s e k s i o b j e k t e i k s i + s e k s i o b j e k t i + s e k s i o n g e l m a n + s e k s i o r j a k a u p a n + s e k s i o r j a k a u p p a + s e k s i o r j a k a u p p a a + s e k s i o r j a k a u p p a a n + s e k s i o r j a t + s e k s i o r j i a + s e k s i o r j i e n + s e k s i o r j i k s i + s e k s i o r j i n a + s e k s i o r j u u d e n + s e k s i o r j u u d e s t a + s e k s i o r j u u s + s e k s i o r j u u s s k a n d a a l i n + s e k s i o r j u u t e e n + s e k s i o r j u u t e n a + s e k s i o r j u u t t a + s e k s i p a l v e l u i d e n + s e k s i p a l v e l u i s t a + s e k s i p a l v e l u i t a + s e k s i p a l v e l u j a + s e k s i p a l v e l u j e n + s e k s i r i i p p u v u u s + s e k s i s e i k k a i l u j a + s e k s i s e i k k a i l u t + s e k s i s u h d e + s e k s i s u h t e i d e n + s e k s i s u h t e i s i i n + s e k s i s u h t e i s s a + s e k s i s u h t e i t a + s e k s i s y m b o l i + s e k s i t a l o u t t a + s e k s i t e o l l i s u u d e n + s e k s i t e o l l i s u u d e s s a + s e k s i t e o l l i s u u s + s e k s i t e o l l i s u u s h a n + s e k s i t e o l l i s u u t e e n + s e k s i t e o l l i s u u t t a + s e k s i t u r i s m i + s e k s i t u r i s m i a + s e k s i t u r i s m i i n + s e k s i t u r i s m i l l e + s e k s i t u r i s m i n + s e k s i t u r i s m i s t a + s e k s i t u r i s t e i s t a + s e k s i t u r i s t i e n + s e k s i t u r i s t i t + s e k s i t y ö + s e k s i t y ö l ä i n e n + s e k s i t y ö l ä i s e t + s e k s i t y ö l ä i s i n ä + s e k s i t y ö l ä i s t e n + s e k s i t y ö n t e k i j ö i d e n + s e k s i v a l i s t u s + s e k s i v a l i s t u s t a + s e k s i v ä l i n e + s e k s i ä + s e k s u a a l i k a s v a t u k s e n + s e k s u a a l i k a s v a t u k s e s s a + s e k s u a a l i k a s v a t u k s e s t a + s e k s u a a l i k a s v a t u s t a + s e k s u a a l i k ä y t t ä y t y m i s e e n + s e k s u a a l i k ä y t t ä y t y m i s e n + s e k s u a a l i k ä y t t ä y t y m i s e s t ä + s e k s u a a l i r i k o k s e t + s e k s u a a l i r i k o k s i a + s e k s u a a l i r i k o k s i i n + s e k s u a a l i r i k o k s i l t a + s e k s u a a l i r i k o k s i s t a + s e k s u a a l i r i k o l l i s e t + s e k s u a a l i r i k o l l i s i a + s e k s u a a l i r i k o l l i s i l l e + s e k s u a a l i r i k o l l i s i l t a + s e k s u a a l i r i k o l l i s i s t a + s e k s u a a l i r i k o l l i s t e n + s e k s u a a l i r i k o s t e n + s e k s u a a l i s e e n + s e k s u a a l i s e l t a + s e k s u a a l i s e n + s e k s u a a l i s e s s a + s e k s u a a l i s e s t a + s e k s u a a l i s e t + s e k s u a a l i s i i n + s e k s u a a l i s i l l e + s e k s u a a l i s r i k o s t a p a u k s i s s a + s e k s u a a l i s t a + s e k s u a a l i s t e n + s e k s u a a l i s u u d e s t a + s e k s u a a l i s u u t e e n + s e k s u a a l i v a l i s t u s t a + s e k t o r a a l i s e e n + s e k t o r e i l l a + s e k t o r e i s t a + s e k t o r e i t a + s e k t o r e j a + s e k t o r i a + s e k t o r i a j a t t e l u + s e k t o r i d i r e k t i i v i n + s e k t o r i e n + s e k t o r i i n + s e k t o r i k o h t a i n e n + s e k t o r i k o h t a i s e s t i + s e k t o r i k o h t a i s e t + s e k t o r i k o h t a i s i a + s e k t o r i l l a + s e k t o r i n + s e k t o r i o h j e l m a n + s e k t o r i p o l i t i i k k a a + s e k t o r i s o p i m u s + s e k t o r i s t r a t e g i a t + s e k t o r i s t r a t e g i o i t a + s e k t o r i u u d i s t u k s e n + s e k u l a a r i h u m a n i s t i n e n + s e k u l a a r i s e m p i + s e k u l a r i s m i a + s e k u n d a a r i l a i n s ä ä d ä n n ö k s i + s e k u n d a a r i l a i n s ä ä d ä n n ö l l ä + s e k u n d a a r i l a i n s ä ä d ä n n ö n + s e k u n d a a r i l a i n s ä ä d ä n n ö s s ä + s e k u n d a a r i l a i n s ä ä d ä n n ö s t ä + s e k u n d a a r i l a i n s ä ä d ä n t ö + s e k u n d a a r i l a i n s ä ä d ä n t ö ä + s e k u n d a a r i l a i n s ä ä d ä n t ö ö n + s e k u n d a a r i m e t a b o l i a + s e k u n d a a r i o i k e u d e s s a + s e k u n d a a r i s e k t o r i l l a + s e k u n d ä ä r i d i r e k t i i v i s s ä + s e k u n d ä ä r i l a i n s ä ä d ä n n ö n + s e k u n d ä ä r i l a i n s ä ä d ä n n ö s s ä + s e k u n d ä ä r i l a i n s ä ä d ä n t ö + s e k u n d ä ä r i l a i n s ä ä d ä n t ö ä + s e k u n d ä ä r i l a i n s ä ä d ä n t ö ö n + s e k u n d ä ä r i l ä h d e + s e k u n d ä ä r i m a r k k i n o i d e n + s e k u n n i s s a + s e k u n n i s t a + s e k u n n i t + s e k u n t e i n a + s e k u n t e j a + s e k u n t i a + s e k u n t i a k a a n + s e k u n t i e n + s e k u n t i p o h j a i n e n + s e k u n t i p o h j a i s e n + s e k u n t i v e l o i t u k s e e n + s e k v e n s s i k a a v i o + s e k v e n s s i v a r i a a t i o i d e n + s e k ä ä n + s e l a i n j ä r j e s t e l m ä t + s e l a i n m o o t t o r i + s e l a i n s o d a t + s e l a t t a e s s a + s e l e e n i d i o k s i d i + s e l e e n i h a p o k e + s e l e e n i h a p p o + s e l e e n i l i s ä y k s e l l ä + s e l e e n i t r i o k s i d i + s e l e e n i v e t y + s e l e k t i i v i s e m p i ä + s e l i t e l l ä + s e l i t e t t i i n + s e l i t e t t y + s e l i t e t t ä e s s ä + s e l i t e t t ä v i s s ä + s e l i t e t ä ä n + s e l i t i n + s e l i t t e l e v ä t + s e l i t t e l y k a m p a n j a a + s e l i t t i + s e l i t t ä e s s ä m m e + s e l i t t ä e s s ä ä n + s e l i t t ä i s i + s e l i t t ä i s i m m e + s e l i t t ä k ä ä + s e l i t t ä m i s t ä + s e l i t t ä m ä l l ä + s e l i t t ä m ä t t ä + s e l i t t ä m ä ä n + s e l i t t ä n e e + s e l i t t ä n e e t + s e l i t t ä n y t + s e l i t t ä v ä t + s e l i t t ä ä + s e l i t t ä ä k i n + s e l i t t ä ä k s e e n + s e l i t t ä ä k s e m m e + s e l i t t ä ä k s e n i + s e l i t y k s e k s i + s e l i t y k s e n + s e l i t y k s e n a n t a m i s m e n e t t e l y + s e l i t y k s e n ä + s e l i t y k s e s t ä n n e + s e l i t y k s e t + s e l i t y k s i l l ä + s e l i t y k s i s t ä + s e l i t y k s i ä + s e l i t y s p r o s e s s i + s e l i t y s p r o s e s s i n + s e l i t y s p y y n t ö ä + s e l i t y s t a i t o j a m m e + s e l i t y s t ä + s e l i t y s v e l v o l l i s u u s + s e l i t ä m m e + s e l i t ä n + s e l j a k ä m m e k k ä + s e l j e n n y t + s e l k e i d e n + s e l k e i k s i + s e l k e i l l ä + s e l k e i m m i n + s e l k e i m m i s t ä + s e l k e i m p i n ä + s e l k e i m p i ä + s e l k e i n + s e l k e i n t ä + s e l k e i n ä + s e l k e i s i i n + s e l k e i s t ä + s e l k e i t ä + s e l k e y d e n + s e l k e y d e s s ä + s e l k e y d e s t ä + s e l k e y t e e n + s e l k e y t e t t ä i s i i n + s e l k e y t e t ä + s e l k e y t e t ä ä n + s e l k e y t t ä + s e l k e y t t ä k ä ä m m e + s e l k e y t t ä m i s e h d o t u k s e s t a + s e l k e y t t ä m i s e k s i + s e l k e y t t ä m i s l i n j a n + s e l k e y t t ä m i s m e n e t t e l y + s e l k e y t t ä m i s p r o s e s s i i n + s e l k e y t t ä m i s s u u n n i t e l m a s s a + s e l k e y t t ä m i s t ä + s e l k e y t t ä m ä l l ä + s e l k e y t t ä m ä t t ä + s e l k e y t t ä m ä ä n + s e l k e y t t ä n y t + s e l k e y t t ä v ä t + s e l k e y t t ä ä + s e l k e y t t ä ä k s e m m e + s e l k e y t y n y t + s e l k e y t y y + s e l k e ä k s i + s e l k e ä l l ä + s e l k e ä l t ä + s e l k e ä m m i s t ä + s e l k e ä m m ä k s i + s e l k e ä m m ä l l ä + s e l k e ä m m ä l t ä + s e l k e ä m m ä n + s e l k e ä m m ä s s ä + s e l k e ä m m ä s t ä + s e l k e ä m m ä t + s e l k e ä m p i + s e l k e ä m p i ä + s e l k e ä m p ä ä + s e l k e ä m p ä ä n + s e l k e ä n + s e l k e ä n ä + s e l k e ä s s ä + s e l k e ä s t ä + s e l k e ä t + s e l k e ä ä + s e l k e ä ä n + s e l k i i n t y y + s e l k i y t t i + s e l k i y t t ä i s i v ä t + s e l k i y t t ä m i s e e n + s e l k i y t t ä m i s e k s i + s e l k i y t t ä m i s t ä + s e l k i y t t ä m ä ä n + s e l k i y t t ä v ä t + s e l k i y t t ä ä + s e l k i y t y m ä s s ä + s e l k i y t y n y t + s e l k i y t y v ä t + s e l k i y t y y + s e l k k a u k s e k s i + s e l k k a u k s e n + s e l k k a u k s e s s a + s e l k k a u k s e s t a + s e l k k a u k s e t + s e l k k a u k s i a + s e l k k a u k s i t t a + s e l k k a u s a l u e e l t a + s e l k k a u s a l u e i l l a + s e l k k a u s a l u e i l l e + s e l k o a + s e l k o k i e l e l l e + s e l k o k i e l e l l ä + s e l k o k i e l i + s e l k o k i e l i s e m p i + s e l k o k i e l t ä + s e l k o s e l ä l l ä ä n + s e l k o u n i + s e l k u p i t + s e l k ä k i p u + s e l k ä l i h a s + s e l k ä l o k k i + s e l k ä m e r e n + s e l k ä m e r i + s e l k ä m m e + s e l k ä n s ä + s e l k ä r a n g a n + s e l k ä r a n g a s t a + s e l k ä r a n g a t + s e l k ä r a n g a t t o m a n + s e l k ä r a n k a + s e l k ä r a n k a a + s e l k ä r a n k a a n + s e l k ä r a n k a h a l k i o + s e l k ä r a n k a h a l k i o n + s e l k ä r a n k a h a l k i o s t a + s e l k ä r a n k a k u d o s t a + s e l k ä r a n k a r e u m a + s e l k ä r a n k a v a m m a + s e l k ä r a n k a v a m m o i s t a + s e l k ä s a u n a + s e l k ä s u o j a + s e l k ä u i m a r i + s e l k ä y d i n + s e l k ä y d i n h e r m o + s e l k ä y d i n k a n a v a + s e l k ä y d i n k u d o k s e n + s e l k ä y d i n r e a k t i o + s e l k ä y d i n t ä + s e l k ä y d i n v a m m a + s e l k ä y d i n v a m m a n + s e l k ä y d i n v a m m o i h i n + s e l k ä y d i n v a u r i o i t a + s e l k ä y t i m e n + s e l k ä ä m m e + s e l k ä ä n s ä + s e l l a i s e e n + s e l l a i s e k s i + s e l l a i s e l l a + s e l l a i s e l l e + s e l l a i s e n + s e l l a i s e n a + s e l l a i s e n a a n + s e l l a i s e n h a n + s e l l a i s e s t a + s e l l a i s e t + s e l l a i s i a + s e l l a i s i a k i n + s e l l a i s i i n + s e l l a i s i k s i + s e l l a i s i l l e + s e l l a i s i n a + s e l l a i s i n a a n + s e l l a i s i s s a + s e l l a i s i s t a + s e l l a i s t a + s e l l a i s t a h a n + s e l l a i s t e n + s e l l e i h i n + s e l l e i s s ä + s e l l e j ä + s e l l i k u o l e m i a + s e l l i s s ä + s e l l i ä n i + s e l l o f a a n i t e h d a s + s e l l o f a a n i t e h t a a s s a + s e l l o k o n s e r t t o + s e l l o n + s e l l o s a r j a t + s e l l u l o i d i n u k k e + s e l l u l o o s a t e h t a a n + s e l l u l o o s a t e o l l i s u u s + s e l l u t e h d a s + s e l l u t e h d a s t a + s e l o n t e k o + s e l o n t e k o a + s e l o n t e k o j a + s e l o n t e k o j e n + s e l o n t e k o o n + s e l o n t e k o v e l v o l l i s u u s + s e l o n t e o n + s e l o n t e o s s a + s e l o n t e o s t a + s e l o s t a a + s e l o s t a m a l l a + s e l o s t a n u t + s e l o s t u s t a + s e l u s t a n s a + s e l u s t a t + s e l v e m m i k s i + s e l v e m m i n + s e l v e m m i n k i n + s e l v e m m ä k s i + s e l v e m m ä n + s e l v e m m ä t + s e l v e m p i + s e l v e m p i ä + s e l v e m p ä ä + s e l v e m p ä ä n + s e l v e n n e t t i i n + s e l v e n n e t t y ä + s e l v e n n e t t ä i s i i n + s e l v e n n e t t ä k ö ö n + s e l v e n n e t ä ä n + s e l v e n n y k s e k s i + s e l v e n n y k s e n + s e l v e n n y k s e s t ä + s e l v e n n y k s i ä + s e l v e n n y s t e n + s e l v e n n y s t ä + s e l v e n n ä n + s e l v e n s i + s e l v e n s i t t e + s e l v e n t ä i s i + s e l v e n t ä k ä ä + s e l v e n t ä m i n e n + s e l v e n t ä m i s e e n + s e l v e n t ä m i s e k s i + s e l v e n t ä m i s e l l ä + s e l v e n t ä m i s e n + s e l v e n t ä m i s t ä + s e l v e n t ä m ä l l ä + s e l v e n t ä m ä t t ä + s e l v e n t ä m ä ä n + s e l v e n t ä n e e n i + s e l v e n t ä n y t + s e l v e n t ä v ä n + s e l v e n t ä ä + s e l v e n t ä ä k s e e n + s e l v e n t ä ä k s e m m e + s e l v e n t ä ä k s e n i + s e l v i e n + s e l v i k s i + s e l v i l t ä + s e l v i m m i s t ä + s e l v i m m ä n + s e l v i m p i ä + s e l v i m p ä n ä + s e l v i n + s e l v i n n e e t + s e l v i n n e i d e n + s e l v i n t ä + s e l v i s i + s e l v i s i m m e + s e l v i s s ä + s e l v i s t ä + s e l v i t e t t i i n + s e l v i t e t t y ä + s e l v i t e t t y ä ä n + s e l v i t e t t ä v ä n ä m m e + s e l v i t e t ä + s e l v i t e t ä ä n + s e l v i t t e l y m e n e t t e l y t + s e l v i t t e l y n + s e l v i t t e l y p y r k i m y k s i ä + s e l v i t t e l y ä + s e l v i t t i + s e l v i t t y ä + s e l v i t t y ä m m e + s e l v i t t ä i s i n + s e l v i t t ä i s i t t e + s e l v i t t ä k ä ä m m e + s e l v i t t ä m i s e e n + s e l v i t t ä m i s e k s i + s e l v i t t ä m i s e n + s e l v i t t ä m i s e s s ä + s e l v i t t ä m i s k e s k u k s e k s i + s e l v i t t ä m ä l l ä + s e l v i t t ä m ä s s ä + s e l v i t t ä m ä t t ä + s e l v i t t ä m ä ä n + s e l v i t t ä n e e t + s e l v i t t ä n e i d e n + s e l v i t t ä n y t + s e l v i t t ä v ä n + s e l v i t t ä ä + s e l v i t t ä ä k s e e n + s e l v i t t ä ä k s e m m e + s e l v i t t ä ä k s e n i + s e l v i t y k s e e n + s e l v i t y k s e n + s e l v i t y k s e s s ä + s e l v i t y k s e s t ä + s e l v i t y k s e t + s e l v i t y k s i s s ä + s e l v i t y k s i s t ä + s e l v i t y k s i ä + s e l v i t y s a j a n + s e l v i t y s a s t e + s e l v i t y s e l i m e k s i + s e l v i t y s j ä r j e s t e l m i e n + s e l v i t y s j ä r j e s t e l m i i n + s e l v i t y s j ä r j e s t e l m i ä + s e l v i t y s j ä r j e s t e l m ä + s e l v i t y s j ä r j e s t e l m ä t + s e l v i t y s k e s k u k s e n + s e l v i t y s k e s k u s + s e l v i t y s k i r j e t t ä + s e l v i t y s k o m i t e a + s e l v i t y s k o m i t e a a + s e l v i t y s k o m i t e a n + s e l v i t y s k u s t a n n u k s e t + s e l v i t y s l a i t o s t e n + s e l v i t y s m a k s u i s t a + s e l v i t y s m a r k k i n o i l l a + s e l v i t y s m a r k k i n o i t a + s e l v i t y s m a t k a l l a + s e l v i t y s m e k a n i s m i + s e l v i t y s m e k a n i s m i e n + s e l v i t y s m e n e t e l m i ä + s e l v i t y s m e n e t t e l y + s e l v i t y s m e n e t t e l y s s ä + s e l v i t y s o s a a n + s e l v i t y s p a l v e l u u n + s e l v i t y s p a n k k i e n + s e l v i t y s p y y n t ö + s e l v i t y s p y y n t ö ö n + s e l v i t y s p y y n t ö ö n i + s e l v i t y s r y h m i ä + s e l v i t y s r y h m ä + s e l v i t y s r y h m ä n + s e l v i t y s t e h t ä v i i n + s e l v i t y s t e h t ä v ä + s e l v i t y s t e n + s e l v i t y s t o i m i n t a + s e l v i t y s t o i m i n t a p a l v e l u j a + s e l v i t y s t o i m i n t a p a l v e l u j e n + s e l v i t y s t o i m i s t o k s i + s e l v i t y s t y ö + s e l v i t y s t y ö n + s e l v i t y s t y ö s s ä + s e l v i t y s t ä + s e l v i t y s v a i h e e s e e n + s e l v i t y s v a i h e e s s a + s e l v i t y s v a l i o k u n t a + s e l v i t y s v a l t u u s k u n n a n + s e l v i t y s v a l t u u s k u n t a + s e l v i t y s v e l v o l l i s u u k s i a a n + s e l v i t y s y h t i ö i t ä + s e l v i t y s y h t i ö t + s e l v i t y s y k s i k ö l l e + s e l v i t y s y k s i k ö n + s e l v i t ä k s e e n + s e l v i t ä k s e m m e + s e l v i t ä m m e + s e l v i t ä n + s e l v i t ä ä n + s e l v i y t y i + s e l v i y t y j i e n + s e l v i y t y k ö ö t + s e l v i y t y m i s e d e l l y t y k s i s t ä + s e l v i y t y m i s e s t ä + s e l v i y t y m i s i d e o i t a + s e l v i y t y m i s k a m p p a i l u s s a + s e l v i y t y m i s k a u h u p e l i + s e l v i y t y m i s k e i n o + s e l v i y t y m i s k e i n o a + s e l v i y t y m i s k e i n o j e n + s e l v i y t y m i s k e i n o n + s e l v i y t y m i s k e i n o n a + s e l v i y t y m i s k y k y + s e l v i y t y m i s k y k y n s ä + s e l v i y t y m i s k y k y y n + s e l v i y t y m i s m a h d o l l i s u u d e t + s e l v i y t y m i s m a h d o l l i s u u k s i a + s e l v i y t y m i s m a h d o l l i s u u s + s e l v i y t y m i s o n g e l m a t + s e l v i y t y m i s p a k k a u s + s e l v i y t y m i s p o n n i s t e l u t + s e l v i y t y m i s s t r a t e g i o i s s a + s e l v i y t y m i s t a i s t e l u s s a a n + s e l v i y t y m i s t a i s t e l u s t a + s e l v i y t y m i s t a r p e e s t a + s e l v i y t y m i s t a r v e + s e l v i y t y m i s y r i t y s + s e l v i y t y m ä ä n + s e l v i y t y v ä n + s e l v i y t y v ä t + s e l v i y t y v ä t k ö + s e l v i y t y y + s e l v i y t y ä + s e l v i y t y ä k s e e n + s e l v i y t y ä k s e m m e + s e l v i ä i s i + s e l v i ä m i n e n + s e l v i ä m i s e k s i + s e l v i ä m i s m a h d o l l i s u u d e t + s e l v i ä m i s m a h d o l l i s u u k s i a + s e l v i ä m i s t i l o i s t a + s e l v i ä m i s t i l o j e n + s e l v i ä m i s t ä + s e l v i ä m m e + s e l v i ä m m e k ö + s e l v i ä m ä ä n + s e l v i ä v ä t + s e l v i ä ä + s e l v i ö n ä + s e l v y y d e n + s e l v y y t t ä + s e l v ä j ä r k i s t ä + s e l v ä k i e l e l l ä + s e l v ä k s i + s e l v ä l l ä + s e l v ä l t ä + s e l v ä n + s e l v ä n ä + s e l v ä n ä k ö i s e m m i n + s e l v ä n ä k ö i s t ä + s e l v ä n ä k ö i s y y d e s t ä + s e l v ä n ä k ö i s y y d e s t ä ä n + s e l v ä p i i r t e i n e n + s e l v ä p i i r t e i s e m p i + s e l v ä s a n a i n e n + s e l v ä s a n a i s e m m i n + s e l v ä s a n a i s e m p i + s e l v ä s a n a i s e n + s e l v ä s a n a i s e s t i + s e l v ä s a n a i s t a + s e l v ä s t i k i n + s e l v ä s t i k ä ä n + s e l v ä s t ä + s e l v ä t + s e l v ä ä n + s e m b r a m ä n t y + s e m e n t i n t u o t t a j a t + s e m e n t i s t ä + s e m e n t t i a l u s + s e m e n t t i k a r t e l l i n + s e m e n t t i t e h t a i d e n + s e m e n t t i t e h t a i s t a + s e m e n t t i t e h t a i t a + s e m e n t t i t e o l l i s u u d e n + s e m e n t t i t e o l l i s u u d e s s a + s e m e n t t i t e o l l i s u u d e s t a + s e m e n t t i t e o l l i s u u s + s e m e n t t i t e o l l i s u u t t a + s e m e n t t i u u n e i l l e h a n + s e m e n t t i u u n e i s s a + s e m e n t t i u u n e i s t a + s e m e n t t i u u n i e n + s e m e n t t i u u n i l l e + s e m e n t t i u u n i s s a + s e m e n t t i u u n i t + s e m i n a a r e i h i n + s e m i n a a r e i s t a + s e m i n a a r e j a + s e m i n a a r i e n + s e m i n a a r i i n + s e m i n a a r i n + s e m i n o l i s o d a t + s e n a a t i n + s e n a a t i n t o r i + s e n a a t t i k i n + s e n a i k a i s i a + s e n e c a t + s e n i o r i k a n s a l a i s i a + s e n i o r i k a n s a l a i s t e n + s e n m u k a i s e e n + s e n s a a t i o h a k u i s e m p a a + s e n s a a t i o i t a + s e n s a a t i o l e h d e t + s e n s a a t i o l e h d i s s ä + s e n s a a t i o l e h d i s t ö + s e n s a a t i o l e h d i s t ö j e n + s e n s a a t i o l e h d i s t ö s s ä + s e n s a a t i o l e h t i e n + s e n s a a t i o n h a l u u n + s e n s a a t i o n ä l k ä i s t e n + s e n s i t i i v i s e m m i s t ä + s e n s u r o i d a + s e n s u r o i m a t t a + s e n s u r o i n t i t o i m i e n + s e n s u u r i a + s e n s u u r i j ä r j e s t e l m ä ä + s e n s u u r i m e n e t e l m i e n + s e n s u u r i n + s e n s u u r i o i k e u t t a a n + s e n s u u r i t o i m i a + s e n t i l l ä + s e n t i n + s e n t i n t a r k a n + s e n t t i h u u t o k a u p p a + s e n t t i i n + s e n t t i ä + s e n t t i ä k ä ä n + s e o s l a n n o i t t e i d e n + s e o s o k s i d i n + s e o s r e h u j e n + s e p a a n + s e p a n + s e p a r a t i s t e j a + s e p a r a t i s t i a l u e i d e n + s e p a r a t i s t i a l u e i d e n s a + s e p a r a t i s t i a l u e i l l a + s e p a r a t i s t i a l u e i l l e + s e p a r a t i s t i a l u e t t a + s e p a r a t i s t i h a l l i t u s + s e p a r a t i s t i j ä r j e s t ö n + s e p a r a t i s t i l i i k e t t ä + s e p a r a t i s t i l i i k k e e l l e + s e p a r a t i s t i l i i k k e e n + s e p a r a t i s t i l i i k k e e s e e n + s e p a r a t i s t i l i i k k e e t + s e p a r a t i s t i l i i k k e i d e n + s e p a r a t i s t i l i i k k e i l l e + s e p a r a t i s t i l i i k k e i t ä + s e p a r a t i s t i p o l i t i i k k o j a + s e p a r a t i s t i r y h m ä t + s e p a r a t i s t i s e t + s e p a r a t i s t i s i a + s e p a r a t i s t i s u u n t a u k s i a + s e p a r a t i s t i t e r r o r i s m i i n + s e p a r a t i s t i t e r r o r i s m i n + s e p a r a t i s t i v o i m i a + s e p a r a t i s t i y k s i k ö i h i n + s e p a s t a + s e p e l v a l t i m o n + s e p e l v a l t i m o t + s e p e l v a l t i m o t a u t i + s e p e l v a l t i m o t u k o k s e n + s e p e l v a l t i m o t u k o k s e s t a + s e p i t t ä m ä ä n + s e p i v ä p e i p p i + s e p p e l e e n + s e p p ä h y y p p ä + s e p p ä k o t i n g a + s e p p ä k o t i n g a t + s e p ä t + s e r b e i l l e + s e r b e j ä + s e r b i a a + s e r b i a a n + s e r b i a k i n + s e r b i a l a i s e m p i + s e r b i a l a i s e t + s e r b i a l a i s i a + s e r b i a l a i s i l l e + s e r b i a l a i s v ä h e m m i s t ö n + s e r b i a l a i s y h t e i s ö n + s e r b i a l k u p e r ä ä + s e r b i a l l a + s e r b i a l l e + s e r b i a l t a + s e r b i a n + s e r b i a n a j o k o i r a + s e r b i a n k i e l i s i ä + s e r b i a n k u u s i + s e r b i a r m e i j a + s e r b i a r m e i j a n + s e r b i a s s a + s e r b i a s t a + s e r b i a s u k k a i s t a + s e r b i d i k t a a t t o r i + s e r b i e n + s e r b i e n k i n + s e r b i h a l l i t u k s e l l e + s e r b i h a l l i t u k s e n + s e r b i h a l l i t u s + s e r b i j o h t a j a a n + s e r b i j o h t a j a t + s e r b i j o h t a j i e n + s e r b i j o h t a j i i n + s e r b i j o u k k o j a + s e r b i j o u k k o j e n + s e r b i j o u k o t + s e r b i j ä s e n e t + s e r b i j ä s e n t ä + s e r b i k a n s a + s e r b i k a n s a a + s e r b i k a n s a k u n n a n + s e r b i k a n s a l a i s t e n + s e r b i k a n s a l l e + s e r b i k a n s a l l i s u u t t a + s e r b i k a n s a n + s e r b i k i r j a i l i j a n + s e r b i m i l i i s i e n + s e r b i n a i s t e n + s e r b i n a t i o n a l i s m i n + s e r b i n a t i o n a l i s t i e n + s e r b i n u o r t e n + s e r b i o p p o s i t i o + s e r b i o p p o s i t i o s s a + s e r b i o r t o d o k s i e n + s e r b i o s a l t a + s e r b i o s a p u o l e n + s e r b i o s a s s a + s e r b i p a k o l a i s e n + s e r b i p a k o l a i s e t + s e r b i p a k o l a i s t e n + s e r b i p a r l a m e n t t i + s e r b i p e r h e i t ä + s e r b i p o l i i s i + s e r b i p o l i i t i k k o j e n + s e r b i r i k o l l i s e t + s e r b i s i v i i l i n + s e r b i s o t i l a i d e n + s e r b i s o t i l a s + s e r b i t + s e r b i t a s a v a l l a l t a + s e r b i t a s a v a l l a n + s e r b i t a s a v a l l a s s a + s e r b i t a s a v a l l a s t a + s e r b i t a s a v a l t a + s e r b i t a s a v a l t a a + s e r b i t a s a v a l t a a n + s e r b i v a l t i o n + s e r b i v a n k i e n + s e r b i v a n k i l o i s s a + s e r b i v i r a n o m a i s e t + s e r b i v i r a n o m a i s i l l e + s e r b i v i r a n o m a i s t e n + s e r b i v ä e s t ö j e n + s e r b i v ä e s t ö n + s e r b i v ä e s t ö ä + s e r b i v ä e s t ö ö n + s e r b i v ä h e m m i s t ö + s e r b i v ä h e m m i s t ö j e n + s e r b i v ä h e m m i s t ö l l e + s e r b i v ä h e m m i s t ö l t ä + s e r b i v ä h e m m i s t ö n + s e r b i v ä h e m m i s t ö ä + s e r b i v ä h e m m i s t ö ö n + s e r b i y h t e i s ö l l e + s e r b i y h t e i s ö n + s e r b i y h t e i s ö ä + s e r b i y h t e i s ö ö n + s e r e m o n i a a n + s e r e m o n i o i s s a + s e r k k u p o i k a + s e r o t o n i i n i o i r e y h t y m ä + s e r p e n t i i n i a n k e r i a a t + s e r p e n t i i n i m i t t a r i + s e r t i f i o i d u n + s e r t i f i o i m a t t o m i e n + s e r t i f i o i n n i n + s e r t i f i o i n n i s t a + s e r t i f i o i n t i a + s e r t i f i o i n t i e l i m e n + s e r t i f i o i n t i e l i m i ä + s e r t i f i o i n t i e l i n t e n + s e r t i f i o i n t i j ä r j e s t e l m i e n + s e r t i f i o i n t i j ä r j e s t e l m i i n + s e r t i f i o i n t i j ä r j e s t e l m i ä + s e r t i f i o i n t i j ä r j e s t e l m ä + s e r t i f i o i n t i j ä r j e s t e l m ä n + s e r t i f i o i n t i j ä r j e s t e l m ä s t ä + s e r t i f i o i n t i j ä r j e s t e l m ä ä + s e r t i f i o i n t i j ä r j e s t ö i l t ä + s e r t i f i o i n t i k e s k u s + s e r t i f i o i n t i k u s t a n n u k s i a + s e r t i f i o i n t i m e n e t t e l y + s e r t i f i o i n t i m e n e t t e l y j e n + s e r t i f i o i n t i m e n e t t e l y n + s e r t i f i o i n t i m e n e t t e l y n s ä + s e r t i f i o i n t i m e n e t t e l y ä + s e r t i f i o i n t i m e r k e i l l ä + s e r t i f i o i n t i m e r k i s t ä + s e r t i f i o i n t i n o r m i e n + s e r t i f i o i n t i o h j e l m a a n s a + s e r t i f i o i n t i o r g a n i s a a t i o t + s e r t i f i o i n t i p e r u s t e e t + s e r t i f i o i n t i p r o s e s s i + s e r t i f i o i n t i p r o s e s s i a + s e r t i f i o i n t i p r o s e s s i s s a + s e r t i f i o i n t i s ä ä n t ö j e n + s e r t i f i o i n t i t a r k i s t u s t e n + s e r t i f i o i n t i t e h t ä v i s t ä + s e r t i f i o i n t i t o i m i n n a n + s e r t i f i o i n t i v a a t i m u k s e t + s e r t i f i o i n t i v a a t i m u k s i a + s e r t i f i o i n t i v a a t i m u k s i s t a + s e r t i f i o i n t i v a i h e e s s a + s e r t i f i o i t a v a + s e s o n k i a i k a n a + s e s o n k i a i k o i n a + s e s o n k i k a u s i n a + s e s o n k i l i i k e n t e e n + s e s o n k i l u o n t e i s u u d e n + s e s o n k i t y ö n t e k i j ö i d e n + s e s o n k i t y ö v o i m a + s e s o n k i t y ö v o i m a n + s e s s i o m u u s i k k o + s e t e l e i d e n + s e t e l e i h i n + s e t e l e i s s ä n n e + s e t e l e i t ä + s e t e l i a u t o m a a t t i e n + s e t e l i e n + s e t e l i i n + s e t e l i j ä r j e s t e l m ä n + s e t e l i p a n k i t + s e t e l i p a n k k e j a + s e t e l i p a n k k i + s e t e l i p a n k k i e n + s e t e l i r a h o i t u s + s e t e l i s a r j a + s e t e l i t + s e t l e m e n t t i l i i k e + s e t r i p u u n ö l j y + s e u d u i l l e + s e u d u i l t a + s e u l a l u u + s e u l o a + s e u l o j a + s e u l o n n a n + s e u l o n n a s t a + s e u l o n t a a + s e u l o n t a j ä r j e s t e l m ä ä + s e u l o n t a k a m p a n j o i t a + s e u l o n t a k o k e e n + s e u l o n t a k o k e i d e n + s e u l o n t a k o k e i n a + s e u l o n t a k ä y t ä n t ö j ä + s e u l o n t a l a i t t e i s t o a + s e u l o n t a m e n e t e l m i e n + s e u l o n t a m e n e t e l m i ä + s e u l o n t a m e n e t e l m ä + s e u l o n t a m e n e t t e l y y n + s e u l o n t a m e n e t t e l y ä + s e u l o n t a o h j e l m a + s e u l o n t a o h j e l m a a n + s e u l o n t a o h j e l m a n + s e u l o n t a o h j e l m a t + s e u l o n t a o h j e l m i a + s e u l o n t a o h j e l m i e n + s e u l o n t a o h j e l m i i n + s e u l o n t a o h j e l m i l l a + s e u l o n t a p a l v e l u a + s e u l o n t a p r o s e s s i + s e u l o n t a p r o s e s s i s s a + s e u l o n t a r a p o r t i t + s e u l o n t a s t a n d a r d i t + s e u l o n t a s u o s i t u k s i a + s e u l o n t a t e s t e i h i n + s e u l o n t a t e s t e i l t ä + s e u l o n t a t e s t e i s t ä + s e u l o n t a t e s t e j ä + s e u l o n t a t e s t i e n + s e u l o n t a t e s t i n + s e u l o n t a t e s t i t + s e u l o n t a t i e t o j a + s e u l o n t a t o i m i e n + s e u l o n t a t u l o k s i s t a + s e u l o n t a t u t k i m u k s e t + s e u l o n t a t u t k i m u k s i a + s e u l o n t a t u t k i m u k s i i n + s e u l o n t a v a i h e e s s a + s e u l o n t a v e r k o s t o i l l e + s e u l o n t o i h i n + s e u l o t a a n + s e u l o t t a v a + s e u l o t t a v i k s i + s e u r a a j a a + s e u r a a j a j ä r j e s t e l y n + s e u r a a j a j ä r j e s t ö i s t ä + s e u r a a j a k s i + s e u r a a j a l l e n n e + s e u r a a j a n a + s e u r a a j a s t a + s e u r a a j a v a l t i o + s e u r a a j a v a l t i o i d e n + s e u r a a j a v a l t i o i l l a + s e u r a a j a v a l t i o i s s a + s e u r a a j a v a l t i o k s i + s e u r a a j a y h t i ö + s e u r a a j i l l e m m e + s e u r a a m a a n + s e u r a a m a l l a + s e u r a a m a s s a + s e u r a a m a t t a + s e u r a a m i s e k s i + s e u r a a m i s t a + s e u r a a m m e + s e u r a a m m e k o + s e u r a a m u k s e t + s e u r a a m u k s i a + s e u r a a m u k s i e n + s e u r a a m u k s i i n + s e u r a a m u k s i l l a + s e u r a a m u k s i n + s e u r a a m u k s i s s a + s e u r a a m u k s i s t a + s e u r a a m u k s i t t a + s e u r a a m u s a s i a a + s e u r a a m u s j ä r j e s t e l m i l l ä + s e u r a a m u s j ä r j e s t e l m i s t ä + s e u r a a m u s j ä r j e s t e l m i ä + s e u r a a m u s j ä r j e s t e l m i ä ä n + s e u r a a m u s j ä r j e s t e l m ä + s e u r a a m u s j ä r j e s t e l m ä n + s e u r a a m u s j ä r j e s t e l m ä s t ä + s e u r a a m u s j ä r j e s t e l m ä t + s e u r a a m u s j ä r j e s t e l m ä ä + s e u r a a m u s j ä r j e s t e l m ä ä n + s e u r a a m u s k y s y m y s + s e u r a a m u s l i n j a u k s i s t a + s e u r a a m u s l u o k i t u s t a + s e u r a a m u s m a h d o l l i s u u k s i a + s e u r a a m u s m a k s u j a + s e u r a a m u s m a k s u j e n + s e u r a a m u s m e k a n i s m e j a + s e u r a a m u s m e k a n i s m i + s e u r a a m u s m e k a n i s m i a + s e u r a a m u s m e k a n i s m i e n + s e u r a a m u s m e k a n i s m i n + s e u r a a m u s m e k a n i s m i t + s e u r a a m u s m e n e t e l m ä t + s e u r a a m u s m e n e t t e l y + s e u r a a m u s m e n e t t e l y s s ä k i n + s e u r a a m u s m e n e t t e l y s t ä + s e u r a a m u s m u o t o + s e u r a a m u s m ä ä r ä y k s i s t ä + s e u r a a m u s n ä k ö k o h t i i n + s e u r a a m u s p o l i t i i k a n + s e u r a a m u s s ä ä n n ö k s e t + s e u r a a m u s t e k i j ä + s e u r a a m u s t e n + s e u r a a m u s t o i m e n p i t e i l l e + s e u r a a m u s t o i m e n p i t e i t ä + s e u r a a m u s t y y p i t + s e u r a a m u s t y y p p i e n k i n + s e u r a a m u s u h k a + s e u r a a m u s u h k a k i n + s e u r a a m u s v a l t u u k s i e n + s e u r a a n + s e u r a a n i + s e u r a a t t e + s e u r a a t t e k o + s e u r a a v a a + s e u r a a v a a n + s e u r a a v a k i n + s e u r a a v a l l a + s e u r a a v a l l e + s e u r a a v a n + s e u r a a v a n a + s e u r a a v a n l a i n e n + s e u r a a v a n l a i s e n + s e u r a a v a s s a + s e u r a a v a s t a + s e u r a a v a t + s e u r a a v i a + s e u r a a v i e n + s e u r a a v i i n + s e u r a a v i k s i + s e u r a a v i l l a k a a n + s e u r a a v i l l e + s e u r a a v i n a + s e u r a a v i s s a + s e u r a a v i s s a k a a n + s e u r a a v i s t a + s e u r a e l ä i m i ä + s e u r a i s i + s e u r a j o u k k u e i d e n + s e u r a k o i r a + s e u r a k u n t a n e u v o s t o n + s e u r a n a + s e u r a n a t a t o i m e t + s e u r a n n a i s v a i k u t u k s i a + s e u r a n n a i s v a i k u t u k s i l l e + s e u r a n n a i s v a i k u t u s t a + s e u r a n n a n + s e u r a n n a s s a + s e u r a n n a s t a + s e u r a n n e e s t a + s e u r a n n e e t + s e u r a n n e i d e n + s e u r a n n e i s t a + s e u r a n n u t + s e u r a n t a a + s e u r a n t a a n + s e u r a n t a d i r e k t i i v i ä + s e u r a n t a e l i m e n + s e u r a n t a e l i m e t + s e u r a n t a e l i m i s t ä + s e u r a n t a e l i m i ä + s e u r a n t a e l i n + s e u r a n t a e l i n t e n + s e u r a n t a f o o r u m i + s e u r a n t a f o o r u m i n + s e u r a n t a f o o r u m i s t a + s e u r a n t a h a n k e + s e u r a n t a i n d i k a a t t o r i e n + s e u r a n t a j a k s o l l e + s e u r a n t a j ä r j e s t e l m i e n + s e u r a n t a j ä r j e s t e l m i i n + s e u r a n t a j ä r j e s t e l m i l l ä + s e u r a n t a j ä r j e s t e l m i s s ä + s e u r a n t a j ä r j e s t e l m i ä + s e u r a n t a j ä r j e s t e l m ä + s e u r a n t a j ä r j e s t e l m ä l l e + s e u r a n t a j ä r j e s t e l m ä n + s e u r a n t a j ä r j e s t e l m ä s s ä + s e u r a n t a j ä r j e s t e l m ä s t ä + s e u r a n t a j ä r j e s t e l m ä t + s e u r a n t a j ä r j e s t e l m ä ä + s e u r a n t a j ä r j e s t e l m ä ä n + s e u r a n t a j ä r j e s t e l y t + s e u r a n t a j ä r j e s t ö ä + s e u r a n t a k a u t t a + s e u r a n t a k e h y k s e e n + s e u r a n t a k e i n o j a + s e u r a n t a k e r t o m u k s e e n + s e u r a n t a k e r t o m u k s e n + s e u r a n t a k e r t o m u k s e n s a + s e u r a n t a k e r t o m u k s e s s a + s e u r a n t a k e r t o m u k s e s s a a n + s e u r a n t a k e r t o m u k s e s t a + s e u r a n t a k e r t o m u k s e s t a n n e + s e u r a n t a k e r t o m u k s e t + s e u r a n t a k e r t o m u k s i a + s e u r a n t a k e r t o m u k s i s s a + s e u r a n t a k e r t o m u k s i s t a + s e u r a n t a k e r t o m u s + s e u r a n t a k e r t o m u s t a + s e u r a n t a k e r t o m u s t e n + s e u r a n t a k e s k u k s e e n + s e u r a n t a k e s k u k s e l l a + s e u r a n t a k e s k u k s e l l e + s e u r a n t a k e s k u k s e l t a + s e u r a n t a k e s k u k s e m m e + s e u r a n t a k e s k u k s e n + s e u r a n t a k e s k u k s e s s a + s e u r a n t a k e s k u k s e s t a + s e u r a n t a k e s k u k s i a + s e u r a n t a k e s k u k s i i n + s e u r a n t a k e s k u k s i s s a m m e + s e u r a n t a k e s k u s + s e u r a n t a k e s k u s t a + s e u r a n t a k e s k u s t e l u n + s e u r a n t a k e s k u s t e l u t + s e u r a n t a k e s k u s t e n + s e u r a n t a k i r j a s s a + s e u r a n t a k o k e i s i i n + s e u r a n t a k o k o u k s e n + s e u r a n t a k o k o u k s e t + s e u r a n t a k o k o u k s i a + s e u r a n t a k o k o u s + s e u r a n t a k o k o u s t a + s e u r a n t a k o m i t e a + s e u r a n t a k o m i t e a a + s e u r a n t a k o m i t e a a n + s e u r a n t a k o m i t e a l l e + s e u r a n t a k o m i t e a n + s e u r a n t a k o m i t e a s s a + s e u r a n t a k o m i t e a t + s e u r a n t a k o m i t e a t h a n + s e u r a n t a k o m i t e o i d e n + s e u r a n t a k o m i t e o i h i n + s e u r a n t a k o m i t e o i s s a + s e u r a n t a k o m i t e o i t a + s e u r a n t a k o n f e r e n s s i + s e u r a n t a k o n f e r e n s s i a + s e u r a n t a k o n f e r e n s s i i n + s e u r a n t a k o n f e r e n s s i n + s e u r a n t a k o n f e r e n s s i s s a + s e u r a n t a k u s t a n n u k s e t + s e u r a n t a k ä y n n i t + s e u r a n t a k ä y n t e j ä + s e u r a n t a k ä y n t i e n + s e u r a n t a l a u s e k e + s e u r a n t a l i s t a l l a + s e u r a n t a l u e t t e l o i h i n + s e u r a n t a l u e t t e l o o n + s e u r a n t a l u e t t e l o t + s e u r a n t a l u v u t + s e u r a n t a m a h d o l l i s u u k s i a + s e u r a n t a m a h d o l l i s u u k s i e n + s e u r a n t a m e k a n i s m e i h i n + s e u r a n t a m e k a n i s m e i s t a + s e u r a n t a m e k a n i s m e j a + s e u r a n t a m e k a n i s m i + s e u r a n t a m e k a n i s m i a + s e u r a n t a m e k a n i s m i e n + s e u r a n t a m e k a n i s m i i n + s e u r a n t a m e k a n i s m i n + s e u r a n t a m e k a n i s m i s t a + s e u r a n t a m e k a n i s m i t + s e u r a n t a m e n e t e l m i e n + s e u r a n t a m e n e t e l m i l l ä + s e u r a n t a m e n e t e l m i ä + s e u r a n t a m e n e t e l m ä + s e u r a n t a m e n e t e l m ä n + s e u r a n t a m e n e t e l m ä s t ä + s e u r a n t a m e n e t e l m ä t + s e u r a n t a m e n e t t e l y + s e u r a n t a m e n e t t e l y j ä + s e u r a n t a m e n e t t e l y s s ä + s e u r a n t a m e n e t t e l y t + s e u r a n t a m e n e t t e l y y n s ä + s e u r a n t a m e n e t t e l y ä + s e u r a n t a m i e t i n t ö + s e u r a n t a o h j e l m a + s e u r a n t a o h j e l m a a + s e u r a n t a o h j e l m a a n + s e u r a n t a o h j e l m a l l a + s e u r a n t a o h j e l m a n + s e u r a n t a o h j e l m a n s a + s e u r a n t a o h j e l m a s s a + s e u r a n t a o h j e l m i a + s e u r a n t a o h j e l m i e n + s e u r a n t a o h j e l m i l l a + s e u r a n t a o h j e l m i l l e + s e u r a n t a o h j e l m i s s a + s e u r a n t a o h j e l m i s t a + s e u r a n t a o i k e u d e t + s e u r a n t a o n g e l m i a + s e u r a n t a o p e r a a t i o i h i n + s e u r a n t a o p p a a n + s e u r a n t a p a r t i o i t a + s e u r a n t a p e r u s t e i t a + s e u r a n t a p o l i t i i k a l l a + s e u r a n t a p o l i t i i k a n + s e u r a n t a p r o s e s s i + s e u r a n t a p r o s e s s i a + s e u r a n t a p r o s e s s i i n + s e u r a n t a p r o s e s s i n + s e u r a n t a p r o s e s s i s s a + s e u r a n t a r a k e n t e i t a + s e u r a n t a r a p o r t i l l a + s e u r a n t a r a p o r t i n + s e u r a n t a r a p o r t i s s a + s e u r a n t a r a p o r t i s t a + s e u r a n t a r a p o r t t e j a + s e u r a n t a r a p o r t t i + s e u r a n t a r a p o r t t i a + s e u r a n t a r a p o r t t i i n + s e u r a n t a r y h m ä + s e u r a n t a r y h m ä l l e + s e u r a n t a r y h m ä l l ä + s e u r a n t a r y h m ä l t ä + s e u r a n t a r y h m ä n + s e u r a n t a r y h m ä t + s e u r a n t a r y h m ä ä + s e u r a n t a r y h m ä ä n + s e u r a n t a s o v e l l u k s e t + s e u r a n t a s t r a t e g i a + s e u r a n t a s ä ä n n ö k s i ä + s e u r a n t a t a p a a m i s i s s a + s e u r a n t a t a s o s t a + s e u r a n t a t a u l u k k o o n + s e u r a n t a t e h t ä v i s t ä + s e u r a n t a t e h t ä v i ä + s e u r a n t a t e h t ä v ä + s e u r a n t a t e h t ä v ä n + s e u r a n t a t e h t ä v ä s s ä + s e u r a n t a t e h t ä v ä ä + s e u r a n t a t e h t ä v ä ä n + s e u r a n t a t e h t ä v ä ä n s ä + s e u r a n t a t i e d o i s t a + s e u r a n t a t i e d o n a n n o n + s e u r a n t a t i e d o t e + s e u r a n t a t i e d o t t e e s s a + s e u r a n t a t i e d o t t e e s t a + s e u r a n t a t i e t o j e n + s e u r a n t a t i l i n t a r k a s t u k s i a + s e u r a n t a t o i m e n p i t e e t + s e u r a n t a t o i m e n p i t e i s i i n + s e u r a n t a t o i m e n p i t e i t ä + s e u r a n t a t o i m i a + s e u r a n t a t o i m i a a n + s e u r a n t a t o i m i e n + s e u r a n t a t o i m i i n + s e u r a n t a t o i m i s s a a n + s e u r a n t a t o i m i s t a + s e u r a n t a t o i m i s t o + s e u r a n t a t u l o k s i s t a + s e u r a n t a t u t k i m u k s e n + s e u r a n t a t u t k i m u s t a + s e u r a n t a t y ö n + s e u r a n t a t y ö s s ä + s e u r a n t a t y ö s t ä + s e u r a n t a t ö i h i n + s e u r a n t a v a a t i m u k s i e n + s e u r a n t a v a a t i m u k s i i n + s e u r a n t a v a a t i m u s t e n + s e u r a n t a v a i h t o e h t o i h i n + s e u r a n t a v a l i o k u n n a n + s e u r a n t a v a l i o k u n n a s s a + s e u r a n t a v a l i o k u n t a + s e u r a n t a v a l i o k u n t a a + s e u r a n t a v a l i o k u n t a n n e + s e u r a n t a v a l i o k u n t i a + s e u r a n t a v a l l a n + s e u r a n t a v a l t u u s k u n n a n + s e u r a n t a v e l v o i t t e e n s a + s e u r a n t a v e l v o l l i s u u d e s t a + s e u r a n t a v e r k k o + s e u r a n t a v e r k k o a + s e u r a n t a v e r k k o j e n + s e u r a n t a v e r k k o o n + s e u r a n t a v e r k o n + s e u r a n t a v e r k o s t o + s e u r a n t a v e r k o s t o j a + s e u r a n t a v e r k o s t o n + s e u r a n t a v i r a s t o + s e u r a n t a v ä l i n e + s e u r a n t a v ä l i n e e n + s e u r a n t a v ä l i n e i d e n + s e u r a n t a v ä l i n e i t ä + s e u r a n t a v ä l i n e t t ä + s e u r a n t a y k s i k k ö + s e u r a n t a y k s i k ö i s t ä + s e u r a n t a y k s i k ö n + s e u r a p e l e i h i n + s e u r a s a a r e t + s e u r a s i + s e u r a s i n + s e u r a s i v a t + s e u r a t + s e u r a t a + s e u r a t a a n + s e u r a t a k s e e n + s e u r a t a k s e n n e + s e u r a t a n s s i + s e u r a t e s s a a n + s e u r a t e s s a n i + s e u r a t k a a + s e u r a t k a a m m e + s e u r a t t a e s s a + s e u r a t t a v a + s e u r a t t a v a n + s e u r a t t a v i s s a + s e u r a t t u a a n + s e u r a t t u a n i + s e u r a u k s e n s a + s e u r a u k s e s t a + s e u r a u k s e t + s e u r a u k s i a + s e u r a u k s i i n + s e u r a u k s i l l a + s e u r a u k s i l t a + s e u r a u k s i l t a a n + s e u r a u k s i n e + s e u r a u k s i n e e n + s e u r a u k s i s t a + s e u r a u k s i t t a + s e u r a u s a n a l y y s i n + s e u r a u s s u h d e + s e u r a u s t a + s e u r a u s t e n + s e u r a u s t e n a r v i o i n n i n + s e u r a u s t u t k i m u s + s e u r a u s v a s t u u t a + s e u r o i h i n + s e u r o i l l e + s e u r o i s t a + s e u r o j a + s e u r o j e n + s e u r u e e n i + s e u t u a + s e u t u j e n + s e u t u k u n t a + s e u t u l i i k e n t e e s e e n + s f ä ä r e i s s ä + s h a k i n p e l a a j a n + s h a k i n p e l a a j a t + s h a k i n p e l a a j i s t a + s h a k i s s a + s h a k k i a v a u k s i s t a + s h a k k i a v a u s + s h a k k i j ä r j e s t ö + s h a k k i k e l l o + s h a k k i k l u b i + s h a k k i l i i t t o + s h a k k i n y r k k e i l y + s h a k k i o l y m p i a l a i s e t + s h a k k i p e l e i h i n + s h a k k i p e l i s s ä + s h a k k i s o k e u s + s h a k k i t a r i n a + s h a k k i t e r m e i s t ä + s h a k k i v a r i a n t t i + s h a n n o n i n + s h a r i a a + s h a r i a n + s h e t l a n n i n p o n i a + s h i i a f u n d a m e n t a l i s t i e n + s h i i a k a p i n a l l i s i a + s h i i a k a p i n a l l i s t e n + s h i i a m u s l i m e j a + s h i i a v ä h e m m i s t ö n + s h i i o j a + s h o k e i s t a + s h o k k e j a + s h o k k i e n + s h o k k i h o i t o a + s h o r t s i t + s h o w p a i n i + s h o w p a i n i n + s i a m i n k r o k o t i i l i + s i a m i n l a h t i + s i a m i n p i i k k i s i l m ä + s i a n k a s v a t t a j a t + s i a n k a s v a t t a j i a + s i a n k a s v a t t a j i e m m e + s i a n k a s v a t t a j i e n + s i a n k a s v a t t a j i s t a m m e + s i a n k a s v a t u k s e n + s i a n k a s v a t u k s e s s a + s i a n k a s v a t u s a l a + s i a n k a s v a t u s t a + s i a n k ä r s ä m ö + s i a n l i h a a + s i a n l i h a a n + s i a n l i h a j a l o s t e i d e n + s i a n l i h a k i l o s t a + s i a n l i h a k r i i s i n + s i a n l i h a m a r k k i n a t + s i a n l i h a m a r k k i n o i d e n + s i a n l i h a m a r k k i n o i h i n + s i a n l i h a m a r k k i n o i l l a + s i a n l i h a m a r k k i n o i l l e k i n + s i a n l i h a n + s i a n l i h a n m a r k k i n o i d e n + s i a n l i h a n t u o t a n n o n + s i a n l i h a n t u o t a n t o + s i a n l i h a n t u o t a n t o a + s i a n l i h a n t u o t t a j a n s a + s i a n l i h a n t u o t t a j a t + s i a n l i h a n ä y t t e e n + s i a n l i h a s o t a + s i a n l i h a t a r j o n n a n + s i a n l i h a t e o l l i s u u d e n + s i a n l i h a t e o l l i s u u s + s i a n l i h a t u o t a n n o s s a + s i a n l i h a t u o t a n t o a + s i a n l i h a t u o t t a j i e n + s i a n p u o l u k k a + s i a n p ä ä k s i + s i a n r e h u n a + s i a n r e h u u n + s i a n r u o k a a n + s i a n s o r k k a + s i d a m o n k i u r u + s i d e a i n e + s i d e a i n e e n a + s i d e a i n e t t a + s i d e k a l v o t u l e h d u s t a + s i d e k u d o s s a i r a u k s i a + s i d e k u d o s s a i r a u k s i l l e + s i d e k u d o s s a i r a u s + s i d e k u d o s t a + s i d o k s e s t a + s i d o n n a i s u u k s i e n + s i d o s a i n e i n a + s i d o s e n e r g i a + s i d o s o r g a n i s a a t i o i d e n + s i d o s r y h m i e n + s i d o s r y h m i i n + s i d o s r y h m i l l e + s i d o s r y h m i l t ä + s i d o s r y h m i s t ä + s i d o s r y h m i ä + s i d o s r y h m ä + s i d o s r y h m ä f o o r u m i + s i d o s r y h m ä f o o r u m i n + s i d o s r y h m ä k e s k u s t e l u u n + s i d o s r y h m ä k o n f e r e n s s i a + s i d o s r y h m ä n + s i d o s r y h m ä t + s i d o s r y h m ä y r i t y k s i s t ä + s i d o t a a n k o + s i d o t t a v a + s i d o t t i i n + s i d o t t u j a + s i d o t t u j e n + s i d o t t u n a + s i d o t u i l l a + s i d o t u s t a + s i d o t u t + s i e d e t t ä v i ä + s i e d e t t ä v ä m m ä n + s i e d e t t ä v ä m p i + s i e d e t t ä v ä m p i e n + s i e d e t t ä v ä m p i ä + s i e d e t t ä v ä m p ä ä + s i e l l ä k i n + s i e l l ä k ä ä n + s i e l t ä k i n + s i e l u a m m e + s i e l u a n i + s i e l u n + s i e l u n h o i d o s t a + s i e l u n h o i t o + s i e l u n v a e l l u s + s i e l u s i + s i e l u t + s i e m e n a l a + s i e m e n a n n o k s i s s a + s i e m e n a s e t u s t e n + s i e m e n d i r e k t i i v i e n + s i e m e n d i r e k t i i v i n + s i e m e n d i r e k t i i v i s t ä + s i e m e n e n + s i e m e n e t + s i e m e n h o l v i + s i e m e n i ä + s i e m e n j o h d i n + s i e m e n k a u p a n + s i e m e n k a u p a s t a + s i e m e n k a u p p a a + s i e m e n k a u p p a l a k i i n + s i e m e n l a j i e n + s i e m e n l a j i k k e i d e n + s i e m e n m a r k k i n o i s t a + s i e m e n m a r k k i n o i t a + s i e m e n m o n o p o l i t + s i e m e n n y s t a r k o i t u k s i i n + s i e m e n p a k e t t i + s i e m e n p a n k i s t a + s i e m e n p e l l a v a n + s i e m e n p e r u n o i s s a + s i e m e n p e r u n o i t a + s i e m e n r a h o i t u s t a + s i e m e n r a j a + s i e m e n t e n + s i e m e n t e n p o i s t o t e o l l i s u u t t a + s i e m e n t e n t u o t t a j i s t a + s i e m e n t e o l l i s u u d e l l e + s i e m e n t e o l l i s u u d e n + s i e m e n t e o l l i s u u d e s s a + s i e m e n t u h o l a i s t e k n o l o g i a + s i e m e n t u o t a n n o n + s i e m e n t u o t a n n o s t a + s i e m e n t u o t a n t o + s i e m e n t u o t e + s i e m e n t u o t t a j a n a + s i e m e n t y y p p e i h i n + s i e m e n v a r a s t o j a + s i e m e n v a r a s t o j e n + s i e m e n v a r a s t o n s a + s i e m e n v a r a s t o t + s i e m e n v i l j a a + s i e m e n v i l j a l l e + s i e m e n v i l j a s t a + s i e m e n v i r n a n + s i e m e n v u o s i a + s i e m e n y h t i ö i d e n + s i e m e n y r i t y k s e t + s i e m e n y r i t y s + s i e n e n k a l a s t u k s e e n + s i e n e n k a l a s t u k s e s t a + s i e n e n k a l a s t u s m a h d o l l i s u u d e t + s i e n e n k a l a s t u s m a h d o l l i s u u k s i s t a + s i e n i k e h ä + s i e n i l a j i t + s i e n i p i l v i + s i e n i r i s o t t o a + s i e n i s a t o + s i e n i t a u d i t + s i e n i y ö k k ö n e n + s i e n i ä + s i e p a t t u i n a + s i e p a t u i s t a + s i e p o t + s i e p p a u k s e t + s i e p p a u k s i a + s i e p p a u k s i s t a + s i e p p a u s j ä r j e s t e l m ä + s i e p p a u s j ä r j e s t e l m ä h ä n + s i e p p a u s j ä r j e s t e l m ä n + s i e p p a u s j ä r j e s t e l m ä s t ä + s i e p p a u s j ä r j e s t e l m ä ä + s i e p p a u s m a h d o l l i s u u d e t + s i e p p a u s v e r k k o + s i e p p a u s v ä i t t e e t + s i e p p o b u l b u l i + s i e t o k y k y n s ä + s i e t o k y n n y k s e n + s i e t o k y v y n + s i e t o k y v y s t ä + s i e t o m a r g i n a a l e i n e e n + s i e t o r a j a m m e + s i e t o r a j a n + s i e t ä i s i + s i e t ä m ä t t ä + s i e t ä m ä t t ö m i i n + s i e t ä m ä t t ö m i m m i s t ä + s i e t ä m ä t t ö m i ä + s i e t ä m ä t t ö m y y t t ä + s i e t ä m ä t t ö m ä l l ä + s i e t ä m ä t t ö m ä m m i k s i + s i e t ä m ä t t ö m ä m m i l t ä + s i e t ä m ä t t ö m ä m m ä k s i + s i e t ä m ä t t ö m ä m p i ä + s i e t ä m ä t t ö m ä m p ä ä + s i e t ä m ä t t ö m ä n + s i e t ä m ä t t ö m ä n ä + s i e t ä m ä t t ö m ä s t ä + s i e t ä m ä t t ö m ä t + s i e t ä m ä t t ö m ä ä n + s i e t ä m ä t ö n t ä + s i e t ä m ä ä n + s i e t ä v i l l e + s i e t ä v ä t + s i e t ä ä + s i f o n k i k a k k u + s i g m a f a k t o r i + s i g m a f u n k t i o + s i g m a s i d o s + s i g n a a l e j a + s i g n a a l i a + s i g n a a l i g e n e r a a t t o r i + s i g n a a l i k s i + s i g n a a l i n + s i g n a a l i n a + s i g n a a l i n k ä s i t t e l y + s i g n a a l i p r o s e s s o r i + s i g n a a l i s t a + s i g n a a l i t i e d u s t e l u + s i h t e e r i a p u + s i h t e e r i i n + s i h t e e r i k o r v a u s t a + s i h t e e r i k u l u t + s i h t e e r i n + s i h t e e r i s t ö a v u s t u k s e n + s i h t e e r i s t ö a v u s t u k s i i n + s i h t e e r i s t ö h e n k i l ö s t ö + s i h t e e r i s t ö i s s ä + s i h t e e r i s t ö k o r v a u k s e n + s i h t e e r i s t ö k o r v a u k s i a + s i h t e e r i s t ö k o r v a u k s i i n + s i h t e e r i s t ö k o r v a u k s i s s a + s i h t e e r i s t ö k o r v a u k s i s t a + s i h t e e r i s t ö k o r v a u s + s i h t e e r i s t ö k o r v a u s t a + s i h t e e r i s t ö k o r v a u s t e n + s i h t e e r i s t ö k s i + s i h t e e r i s t ö k u l u j e n + s i h t e e r i s t ö l l e + s i h t e e r i s t ö n + s i h t e e r i s t ö p a l v e l u j e n + s i h t e e r i s t ö s s ä + s i h t e e r i s t ö s t ä + s i h t e e r i s t ö y k s i k ö i s t ä + s i h t e e r i s t ö ä + s i h t e e r i y k s i k k ö n n e + s i h t e e r i ä ä n + s i i d e r i i n + s i i h e n k i n + s i i l i p u o l u s t u k s e n + s i i l i r i s a k a s + s i i m a l e i k k u r i + s i i m e k s e n + s i i m e s t ä + s i i n t ä v i s t ä + s i i n t ä v ä + s i i n t ä ä + s i i n ä k i n + s i i n ä k ä ä n + s i i n ä p ä + s i i p a t + s i i p i g a m b i i t t i + s i i p i k a r j a + s i i p i k a r j a a + s i i p i k a r j a e r i s t ä + s i i p i k a r j a k e t j u s t a + s i i p i k a r j a k y s y m y k s e t + s i i p i k a r j a l i h a a n + s i i p i k a r j a l l e + s i i p i k a r j a n + s i i p i k a r j a n j a l o s t u s + s i i p i k a r j a n k a s v a t t a j a m a a + s i i p i k a r j a n k a s v a t t a j a m m e + s i i p i k a r j a n k a s v a t t a j a t + s i i p i k a r j a n k a s v a t t a j i a + s i i p i k a r j a n k a s v a t t a j i e n + s i i p i k a r j a n k a s v a t t a j i i n + s i i p i k a r j a n k a s v a t u k s e s t a + s i i p i k a r j a n k a s v a t u s + s i i p i k a r j a n k a s v a t u s a l a + s i i p i k a r j a n l i h a + s i i p i k a r j a n l i h a a + s i i p i k a r j a n l i h a a n + s i i p i k a r j a n l i h a d i r e k t i i v i + s i i p i k a r j a n l i h a l l e + s i i p i k a r j a n l i h a m a r k k i n a t + s i i p i k a r j a n l i h a n + s i i p i k a r j a n l i h a s t a + s i i p i k a r j a n l i h a t u o t t e i t a + s i i p i k a r j a n l i h a v a l m i s t e i d e n + s i i p i k a r j a n l i h a v a l m i s t e i t a + s i i p i k a r j a n r u h o a s i a s s a + s i i p i k a r j a n r u h o j e n + s i i p i k a r j a n t u o t a n n o n + s i i p i k a r j a n t u o t a n t o a l a + s i i p i k a r j a n t u o t a n t o o n + s i i p i k a r j a n t u o t t a j a a + s i i p i k a r j a n t u o t t a j a t + s i i p i k a r j a n t u o t t a j i a + s i i p i k a r j a n t u o t t a j i e n + s i i p i k a r j a n t u o t t a j i l l e + s i i p i k a r j a p a i k a n + s i i p i k a r j a p o p u l a a t i o s s a + s i i p i k a r j a t a l o u t t a + s i i p i k a r j a t e o l l i s u u d e s s a + s i i p i k a r j a t e o l l i s u u s + s i i p i k a r j a t e o l l i s u u t e e n + s i i p i k a r j a t e o l l i s u u t e m m e + s i i p i k a r j a t e o l l i s u u t t a + s i i p i k a r j a t i l a l l i s t e n + s i i p i k a r j a t i l a t + s i i p i k a r j a t i l o i l l a + s i i p i k a r j a t i l o i l l e + s i i p i k a r j a t i l o j a + s i i p i k a r j a t i l o j e n + s i i p i k a r j a t u o t a n n o s s a + s i i p i k a r j a t u o t a n t o + s i i p i k a r j a t u o t t e i d e n + s i i p i l i h a s + s i i p i o p a s t i n + s i i p i p a p u + s i i p i r a t a s a l u s + s i i p i r i k k o + s i i p i r i k k o n a + s i i p i r i k o k s i + s i i p i r i k o n + s i i p i r i k o t + s i i p i s i m p p u + s i i p i ä ä n + s i i r r e t t i i n + s i i r r e t t y j e n + s i i r r e t t ä e s s ä + s i i r r e t t ä i s i i n + s i i r r e t t ä v i e n + s i i r r e t t ä v ä t + s i i r r e t y l l e + s i i r r e t y n + s i i r r e t y t + s i i r r e t ä ä n + s i i r r e t ä ä n k ö + s i i r r e t ä ä n p ä + s i i r r o i l l e + s i i r r o i s t a + s i i r r o n + s i i r r o s l i n j a + s i i r r o s l i n j a l l a + s i i r r o t h a n + s i i r r y i t t e + s i i r r y m m e + s i i r r y n + s i i r r y t t e + s i i r r y t t i i n + s i i r r y t t y + s i i r r y t t y ä m m e + s i i r r y t t ä e s s ä + s i i r r y t t ä i s i i n + s i i r r y t ä ä n + s i i r r y t ä ä n p ä + s i i r r ä m m e + s i i r r ä n n ä i s k y s y m y k s e n ä + s i i r r ä t t e + s i i r t o a + s i i r t o a j a t + s i i r t o a r m e i j a + s i i r t o a s e m i a + s i i r t o a s i a k i r j a n + s i i r t o d i r e k t i i v i s t ä + s i i r t o e h d o t u k s e n + s i i r t o e l i m e n + s i i r t o e l i m i l l e + s i i r t o e l i m i ä + s i i r t o e l i n t e n + s i i r t o e l i n t ä + s i i r t o f u n k t i o + s i i r t o h i n n o i t t e l u + s i i r t o h i n n o i t t e l u a + s i i r t o h i n n o i t t e l u f o o r u m i n + s i i r t o h i n n o i t t e l u k y s y m y s + s i i r t o h i n n o i t t e l u n + s i i r t o h i n n o i t t e l u u n + s i i r t o h i n t a o n g e l m i e n + s i i r t o h i n t o j a + s i i r t o h i n t o j e n + s i i r t o i h i n + s i i r t o i k k u n a + s i i r t o i n f r a s t r u k t u u r i + s i i r t o i n f r a s t r u k t u u r i a + s i i r t o i n f r a s t r u k t u u r i i n + s i i r t o i s t u t u s + s i i r t o j a + s i i r t o j e n + s i i r t o j ä r j e s t e l m i e n + s i i r t o j ä r j e s t e l m i s t ä + s i i r t o j ä r j e s t e l m i s t ä ä n + s i i r t o j ä r j e s t e l m i ä + s i i r t o j ä r j e s t e l m ä + s i i r t o j ä r j e s t e l m ä n + s i i r t o j ä r j e s t e l m ä ä + s i i r t o j ä r j e s t e l m ä ä n + s i i r t o k a p a s i t e e t i s t a + s i i r t o k a p a s i t e e t t i + s i i r t o k a p a s i t e e t t i a + s i i r t o k a p a s i t e e t t i i n + s i i r t o k e i n o t + s i i r t o k o r v a u k s i a + s i i r t o k o r v a u k s i i n + s i i r t o k o r v a u k s i s t a + s i i r t o k o r v a u s t e n + s i i r t o k u l m a + s i i r t o k u l u t + s i i r t o k u n n a n + s i i r t o k u n n i s s a + s i i r t o k u n t a + s i i r t o k u n t a k y s y m y s t ä + s i i r t o k u n t a p o l i t i i k a n + s i i r t o k u n t a p o l i t i i k a s t a + s i i r t o k u n t a p o l i t i i k k a + s i i r t o k u n t a p o l i t i i k k a a + s i i r t o k u n t a p o l i t i i k k a n s a + s i i r t o k u n t a s o t a + s i i r t o k u n t a t o i m i n n a n + s i i r t o k u n t a t o i m i n n a s t a + s i i r t o k u n t a t o i m i n t a + s i i r t o k u n t a t o i m i n t a a + s i i r t o k u n t a t o i m i n t a n s a + s i i r t o k u n t i e n + s i i r t o k u o r m a u s y r i t y s t e n + s i i r t o k u s t a n n u k s e t + s i i r t o k u s t a n n u k s i s t a + s i i r t o k u s t a n n u s t e n + s i i r t o k ä y t ä v i e n + s i i r t o k ä y t ä v i ä + s i i r t o k ä y t ä v i ä m m e + s i i r t o l a i s a a l l o n + s i i r t o l a i s a a l t o j a + s i i r t o l a i s a s i a t + s i i r t o l a i s a s i o i s s a + s i i r t o l a i s e t + s i i r t o l a i s f o o r u m i n + s i i r t o l a i s i a + s i i r t o l a i s i l m i ö + s i i r t o l a i s j ä r j e s t ö + s i i r t o l a i s j ä r j e s t ö j e n + s i i r t o l a i s j ä r j e s t ö n + s i i r t o l a i s k e s k u k s e n + s i i r t o l a i s k i i n t i ö i s t ä + s i i r t o l a i s k r i i s i i n + s i i r t o l a i s k y s y m y k s e s s ä + s i i r t o l a i s k y s y m y k s i s s ä + s i i r t o l a i s k y s y m y k s i s t ä + s i i r t o l a i s k y s y m y k s i ä + s i i r t o l a i s k y s y m y s + s i i r t o l a i s l a p s i a + s i i r t o l a i s l a p s i s t a + s i i r t o l a i s l a s k e n t a + s i i r t o l a i s l a s t e n + s i i r t o l a i s l i i k k e i s i i n + s i i r t o l a i s l i i k k e i t ä + s i i r t o l a i s m a i d e n + s i i r t o l a i s m a i t a + s i i r t o l a i s m y ö n t e i s i s s ä + s i i r t o l a i s n a i s e t + s i i r t o l a i s n a i s i i n + s i i r t o l a i s n a i s i l l a + s i i r t o l a i s n a i s i s t a + s i i r t o l a i s n a i s t e n + s i i r t o l a i s n e u v o s t o s t a + s i i r t o l a i s n u o r t e n + s i i r t o l a i s n ä k e m y k s e n + s i i r t o l a i s o n g e l m a + s i i r t o l a i s o n g e l m a a + s i i r t o l a i s o n g e l m a a n + s i i r t o l a i s o n g e l m a m m e + s i i r t o l a i s o n g e l m a n + s i i r t o l a i s o n g e l m a t + s i i r t o l a i s o n g e l m i a + s i i r t o l a i s p a i n e + s i i r t o l a i s p a i n e e s e e n + s i i r t o l a i s p a i n e e t + s i i r t o l a i s p a i n e i d e n + s i i r t o l a i s p a i n e i s t a + s i i r t o l a i s p a i n e i t a + s i i r t o l a i s p a i n e t t a + s i i r t o l a i s p e r h e e t + s i i r t o l a i s p e r h e i d e n + s i i r t o l a i s p o l i i t t i s e n + s i i r t o l a i s p o l i t i i k a n + s i i r t o l a i s p o l i t i i k a s s a + s i i r t o l a i s p o l i t i i k a s t a + s i i r t o l a i s p o l i t i i k a s t a m m e + s i i r t o l a i s p o l i t i i k k a + s i i r t o l a i s p o l i t i i k k a a + s i i r t o l a i s p o l i t i i k k a a n + s i i r t o l a i s p o l i t i i k k a a n s a + s i i r t o l a i s p o l i t i i k k o j a + s i i r t o l a i s p o l i t i i k o i s t a + s i i r t o l a i s p r o s t i t u o i d u s t a + s i i r t o l a i s r i k o l l i s u u s + s i i r t o l a i s r y h m i e n + s i i r t o l a i s s t a t u k s e n + s i i r t o l a i s t a + s i i r t o l a i s t a u s t a + s i i r t o l a i s t e n + s i i r t o l a i s t i e t ä + s i i r t o l a i s t i l a n t e e s t a + s i i r t o l a i s t u l v a n + s i i r t o l a i s t u l v a t + s i i r t o l a i s t u l v i e n + s i i r t o l a i s t y ö l ä i s e t + s i i r t o l a i s t y ö l ä i s t e n + s i i r t o l a i s t y ö n t e k i j ä n + s i i r t o l a i s t y ö n t e k i j ä t + s i i r t o l a i s t y ö n t e k i j ö i d e n + s i i r t o l a i s t y ö n t e k i j ö i l l e + s i i r t o l a i s t y ö n t e k i j ö i t ä + s i i r t o l a i s t y ö v o i m a a + s i i r t o l a i s u u d e s t a + s i i r t o l a i s u u s d i r e k t i i v i s t ä + s i i r t o l a i s u u s i l m i ö s t ä + s i i r t o l a i s u u s j ä r j e s t ö + s i i r t o l a i s u u s j ä r j e s t ö l l e + s i i r t o l a i s u u s j ä r j e s t ö n + s i i r t o l a i s u u s k e s k u s t e l u + s i i r t o l a i s u u s k e s k u s t e n + s i i r t o l a i s u u s k y s y m y k s e n + s i i r t o l a i s u u s k y s y m y k s e s t ä + s i i r t o l a i s u u s k y s y m y k s e t + s i i r t o l a i s u u s k y s y m y k s i s t ä + s i i r t o l a i s u u s k y s y m y s t e n + s i i r t o l a i s u u s l a u s e k k e e n + s i i r t o l a i s u u s o h j e l m a + s i i r t o l a i s u u s p a k e t i s t a + s i i r t o l a i s u u s p a k e t t i a + s i i r t o l a i s u u s p o l i t i i k a n + s i i r t o l a i s u u s p o l i t i i k k a + s i i r t o l a i s u u s p o l i t i i k k a a + s i i r t o l a i s u u s s t r a t e g i a n + s i i r t o l a i s u u s s t r a t e g i o i d e n + s i i r t o l a i s u u s v i r t o j a + s i i r t o l a i s u u s v i r t o j e n + s i i r t o l a i s u u t t a + s i i r t o l a i s v a l v o n n a n + s i i r t o l a i s v a n h e m m i l l e e n + s i i r t o l a i s v a s t a i n e n + s i i r t o l a i s v a s t a i s i a + s i i r t o l a i s v i r a s t o + s i i r t o l a i s v i r r a l t a + s i i r t o l a i s v i r r a n + s i i r t o l a i s v i r r a s t a + s i i r t o l a i s v i r r a t + s i i r t o l a i s v i r r o i l l a + s i i r t o l a i s v i r r o i s t a + s i i r t o l a i s v i r t a a + s i i r t o l a i s v i r t o i h i n + s i i r t o l a i s v i r t o j a + s i i r t o l a i s v i r t o j e m m e + s i i r t o l a i s v i r t o j e n + s i i r t o l a i s v ä e s t ö n + s i i r t o l a i s v ä h e m m i s t ö o n g e l m a a + s i i r t o l a i s v ä h e m m i s t ö ö n + s i i r t o l a i s y h t e i s ö + s i i r t o l a i s y h t e i s ö i h i n + s i i r t o l a i s y h t e i s ö i l l ä + s i i r t o l a i s y h t e i s ö j e n + s i i r t o l a i s y h t e i s ö t + s i i r t o l a p u u t a r h a + s i i r t o l i n j a + s i i r t o l i n j a l l a + s i i r t o l i n j o j a + s i i r t o l i n j o j e n + s i i r t o l o h k a r e + s i i r t o l u p a + s i i r t o m a a + s i i r t o m a a e p i s o d i + s i i r t o m a a e t u j e n + s i i r t o m a a h a l l i n n o n + s i i r t o m a a h a l l i n t o + s i i r t o m a a h a l l i n t o a + s i i r t o m a a h a l l i n t o i h i n + s i i r t o m a a h a l l i t s i j a + s i i r t o m a a h a l l i t s i j o i d e n + s i i r t o m a a h a l l i t u k s e n + s i i r t o m a a h e r r o i n a + s i i r t o m a a h e r r o j e n + s i i r t o m a a h e r r u u t t a + s i i r t o m a a h i s t o r i a m m e + s i i r t o m a a h i s t o r i a n + s i i r t o m a a h i s t o r i a s t a a n + s i i r t o m a a i m p e r i u m i + s i i r t o m a a j ä r j e s t e l m ä t + s i i r t o m a a k a u d e l l a + s i i r t o m a a k a u d e l t a + s i i r t o m a a n a + s i i r t o m a a n a a n + s i i r t o m a a o m a i s u u t t a + s i i r t o m a a p o l i t i i k a s t a a n + s i i r t o m a a p o l i t i i k k a + s i i r t o m a a p o l i t i i k k a a + s i i r t o m a a p o l i t i i k k a a n + s i i r t o m a a r a j o j e n + s i i r t o m a a r i i p p u v u u d e s t a + s i i r t o m a a s e i k k a i l u n + s i i r t o m a a s i t e e t + s i i r t o m a a s o d a n + s i i r t o m a a s o d a s s a + s i i r t o m a a s o d a s t a + s i i r t o m a a s o d a t + s i i r t o m a a s o d i s s a + s i i r t o m a a s o d i s t a + s i i r t o m a a s o t a + s i i r t o m a a s o t a a + s i i r t o m a a s o t a a n + s i i r t o m a a s o t i a + s i i r t o m a a s o t i e n + s i i r t o m a a s u h t e i s i i n + s i i r t o m a a s u h t e i s t a m m e + s i i r t o m a a t + s i i r t o m a a t i l a n n e + s i i r t o m a a t y y l i l l ä + s i i r t o m a a v a l l a k s i + s i i r t o m a a v a l l a l t a + s i i r t o m a a v a l l a n + s i i r t o m a a v a l l a s t a + s i i r t o m a a v a l l a t + s i i r t o m a a v a l l o i l l a + s i i r t o m a a v a l l o i s t a + s i i r t o m a a v a l l o i t u k s i l l a + s i i r t o m a a v a l l o i t u s t e n + s i i r t o m a a v a l t a + s i i r t o m a a v a l t a a + s i i r t o m a a v a l t a j ä r j e s t e l m ä t + s i i r t o m a a v a l t a k a u d e n + s i i r t o m a a v a l t a k u n n a s s a + s i i r t o m a a v a l t a m e n n e i s y y t e n s ä + s i i r t o m a a v a l t a n a + s i i r t o m a a v a l t i o i d e n + s i i r t o m a a v a l t i o t + s i i r t o m a a v a l t o i h i n + s i i r t o m a a v a l t o i n a + s i i r t o m a a v a l t o j a + s i i r t o m a a v a l t o j e n + s i i r t o m a a v a s t a i s t a + s i i r t o m a a v e l a n + s i i r t o m a a v e r s i o + s i i r t o m a a y h t e i s k u n t i a + s i i r t o m a h d o l l i s u u s + s i i r t o m a i d e n + s i i r t o m a i d e n s a + s i i r t o m a i s s a + s i i r t o m a i s s a a n + s i i r t o m a i t a + s i i r t o m a k s u i h i n + s i i r t o m a k s u i s t a + s i i r t o m a k s u j a + s i i r t o m a k s u j e n + s i i r t o m a k s u t + s i i r t o m a r k k i n o i l l a + s i i r t o m e k a n i s m i n + s i i r t o m e k a n i s m i t + s i i r t o m e n e t e l m ä + s i i r t o m e n e t t e l y + s i i r t o m e n e t t e l y n + s i i r t o m e n e t t e l y ä + s i i r t o n a + s i i r t o n o p e u d e t + s i i r t o n o p e u s + s i i r t o o n + s i i r t o p r o b l e m a t i i k k a + s i i r t o p r o s e s s e j a + s i i r t o p r o s e s s i a + s i i r t o p y y n n ö n + s i i r t o p y y n t ö j ä + s i i r t o p ä ä t ö k s e n s ä + s i i r t o p ä ä t ö s t ä + s i i r t o r a t a + s i i r t o r e i t e i l l e + s i i r t o r e i t e i s t ä + s i i r t o r e i t t e j ä + s i i r t o r e i t t i e n + s i i r t o r e i t t i ä + s i i r t o s o p i m u k s e t + s i i r t o s u m m a s t a + s i i r t o s u m m i e n + s i i r t o s u m m i s t a + s i i r t o s ä ä n t ö j ä ä n + s i i r t o s ä ä n t ö ä + s i i r t o t a l o u d e n + s i i r t o t a l o u t t a + s i i r t o t a r k o i t u k s i i n + s i i r t o t a v a s t a + s i i r t o t e k n o l o g i a + s i i r t o t i e d o t + s i i r t o t u i s t a + s i i r t o t y ö l ä i s e n + s i i r t o t y ö l ä i s e t + s i i r t o t y ö l ä i s i i n + s i i r t o t y ö l ä i s i l l e + s i i r t o t y ö l ä i s i l l ä + s i i r t o t y ö l ä i s i l t ä + s i i r t o t y ö l ä i s i n ä + s i i r t o t y ö l ä i s i s t ä + s i i r t o t y ö l ä i s i ä + s i i r t o t y ö l ä i s r y h m i e n + s i i r t o t y ö l ä i s t e n + s i i r t o t y ö l ä i s t ä + s i i r t o t y ö l ä i s v i h a m i e l i s t ä + s i i r t o t y ö l ä i s y y t t ä + s i i r t o t y ö n t e k i j ä t + s i i r t o t y ö n t e k i j ö i d e n + s i i r t o t y ö n t e k i j ö i l l e + s i i r t o t y ö n t e k i j ö i t ä + s i i r t o t y ö v o i m a a + s i i r t o t y ö v o i m a l l a + s i i r t o u n i o n i + s i i r t o v a i k u t u s + s i i r t o v e l v o i t e + s i i r t o v e l v o i t e s ä ä n n ö n + s i i r t o v e l v o i t t e i s t a + s i i r t o v e l v o i t t e i t a + s i i r t o v e l v o l l i s u u d e s t a + s i i r t o v e l v o l l i s u u k s i s t a + s i i r t o v e l v o l l i s u u s m ä ä r ä y s t e n + s i i r t o v e l v o l l i s u u s p a l v e l u j a + s i i r t o v e l v o l l i s u u t t a + s i i r t o v e r k k o + s i i r t o v e r k k o a + s i i r t o v e r k k o i h i n + s i i r t o v e r k k o j a + s i i r t o v e r k k o j e n + s i i r t o v e r k k o j ä r j e s t e l m i i n + s i i r t o v e r k k o j ä r j e s t e l m i s t ä + s i i r t o v e r k k o j ä r j e s t e l m ä + s i i r t o v e r k k o j ä r j e s t e l m ä n + s i i r t o v e r k k o j ä r j e s t e l m ä ä n + s i i r t o v e r k k o o n + s i i r t o v e r k o j e n + s i i r t o v e r k o n + s i i r t o v e r k o n h a l t i j a s t a + s i i r t o v e r k o n h a l t i j a t + s i i r t o v e r k o n h a l t i j o i d e n + s i i r t o v e r k o n h a l t i j o i l l a + s i i r t o v e r k o n h a l t i j o i t a + s i i r t o v e r k o n h a l t i o i d e n + s i i r t o v e r k o t + s i i r t o v y ö h y k k e e k s i + s i i r t o v ä e s t ö n + s i i r t o v ä k i + s i i r t o y h t e y k s i n + s i i r t o y h t i ö i s t ä + s i i r t o ä ä n i v a a l i t a p a + s i i r t y e s s ä + s i i r t y e s s ä m m e + s i i r t y e s s ä ä n + s i i r t y i + s i i r t y i s i + s i i r t y i s i m m e + s i i r t y i s i n + s i i r t y i s i v ä t + s i i r t y i v ä t + s i i r t y k ä ä m m e + s i i r t y m i s a j a n + s i i r t y m i s a j a n k o h t a a n + s i i r t y m i s a j a t u k s e n + s i i r t y m i s e e n + s i i r t y m i s e k s i + s i i r t y m i s e n + s i i r t y m i s e s t ä + s i i r t y m i s i l m i ö + s i i r t y m i s j ä r j e s t e l y j e n + s i i r t y m i s k a u t t a + s i i r t y m i s k e h i t y k s e s t ä + s i i r t y m i s k u s t a n n u k s i a + s i i r t y m i s k u s t a n n u s t e n + s i i r t y m i s l a u s e k k e i d e n + s i i r t y m i s m ä ä r ä y k s e t + s i i r t y m i s p o l i t i i k k a a + s i i r t y m i s p r o s e s s i + s i i r t y m i s p r o s e s s i n + s i i r t y m i s t a v a s t a + s i i r t y m i s t ä + s i i r t y m i s v a i h e + s i i r t y m i s v a i h e e n + s i i r t y m i s v a i k u t u s + s i i r t y m ä a i k a + s i i r t y m ä a i k a a + s i i r t y m ä a i k a a n + s i i r t y m ä a i k a j ä r j e s t e l y + s i i r t y m ä a i k a m m e + s i i r t y m ä a i k a n a + s i i r t y m ä a i k a p y y n n ö t + s i i r t y m ä a i k o i h i n + s i i r t y m ä a i k o i n a + s i i r t y m ä a i k o i n e e n + s i i r t y m ä a i k o j a + s i i r t y m ä a i k o j a a n + s i i r t y m ä a i k o j e n + s i i r t y m ä a j a k s i + s i i r t y m ä a j a l l a + s i i r t y m ä a j a l l e + s i i r t y m ä a j a n + s i i r t y m ä a j a n j a k s o + s i i r t y m ä a j a n j a k s o a + s i i r t y m ä a j a n j a k s o j e n + s i i r t y m ä a j a n j a k s o l l e + s i i r t y m ä a j a n j a k s o n + s i i r t y m ä a j a n j a k s o o n + s i i r t y m ä a j a n j a k s o s s a + s i i r t y m ä a j a n j a k s o s t a + s i i r t y m ä a j a n j a k s o t + s i i r t y m ä a j a s t a + s i i r t y m ä a j a t + s i i r t y m ä a j o i l l a + s i i r t y m ä a j o i s t a + s i i r t y m ä a l u e e l l a + s i i r t y m ä a l u e e t + s i i r t y m ä a l u e i d e n + s i i r t y m ä a l u e i t a + s i i r t y m ä a r t i k l a + s i i r t y m ä a s e m a + s i i r t y m ä a s e t u k s e l l a + s i i r t y m ä a s e t u k s e n + s i i r t y m ä a s e t u s t a + s i i r t y m ä d i r e k t i i v i t + s i i r t y m ä h a l l i n t o + s i i r t y m ä h a l l i n t o a + s i i r t y m ä h a l l i t u k s e e n + s i i r t y m ä h a l l i t u k s e l l e + s i i r t y m ä h a l l i t u k s e n + s i i r t y m ä h a l l i t u s + s i i r t y m ä h a l l i t u s t a + s i i r t y m ä h e t k e e n + s i i r t y m ä h e t k e l l ä + s i i r t y m ä j a k s o + s i i r t y m ä j a k s o a + s i i r t y m ä j a k s o j e n + s i i r t y m ä j a k s o l t a + s i i r t y m ä j a k s o n + s i i r t y m ä j a k s o t + s i i r t y m ä j ä r j e s t e l m ä + s i i r t y m ä j ä r j e s t e l m ä l l ä + s i i r t y m ä j ä r j e s t e l m ä n + s i i r t y m ä j ä r j e s t e l m ä s t ä + s i i r t y m ä j ä r j e s t e l m ä ä + s i i r t y m ä j ä r j e s t e l m ä ä n + s i i r t y m ä j ä r j e s t e l y + s i i r t y m ä j ä r j e s t e l y i h i n + s i i r t y m ä j ä r j e s t e l y i n + s i i r t y m ä j ä r j e s t e l y i n ä + s i i r t y m ä j ä r j e s t e l y i s t ä + s i i r t y m ä j ä r j e s t e l y i t ä + s i i r t y m ä j ä r j e s t e l y j e n + s i i r t y m ä j ä r j e s t e l y j ä + s i i r t y m ä j ä r j e s t e l y n + s i i r t y m ä j ä r j e s t e l y s t ä + s i i r t y m ä j ä r j e s t e l y t + s i i r t y m ä j ä r j e s t e l y y n + s i i r t y m ä j ä r j e s t e l y ä + s i i r t y m ä k a u d e k s i + s i i r t y m ä k a u d e l l a + s i i r t y m ä k a u d e l l e + s i i r t y m ä k a u d e n + s i i r t y m ä k a u d e s s a + s i i r t y m ä k a u d e s t a + s i i r t y m ä k a u d e t + s i i r t y m ä k a u s i + s i i r t y m ä k a u s i a + s i i r t y m ä k a u s i e n + s i i r t y m ä k a u s i i n + s i i r t y m ä k a u s i j ä r j e s t e l y j ä + s i i r t y m ä k a u s i j ä r j e s t e l y n + s i i r t y m ä k a u s i j ä r j e s t e l y s t ä + s i i r t y m ä k a u s i j ä r j e s t e l y t + s i i r t y m ä k a u s i l l a + s i i r t y m ä k a u s i n + s i i r t y m ä k a u s i p o l i t i i k a n + s i i r t y m ä k a u s i s s a + s i i r t y m ä k a u s i s t a + s i i r t y m ä k a u s i s t a k a a n + s i i r t y m ä k a u s i s ä ä n n ö k s i ä + s i i r t y m ä k a u t e e n + s i i r t y m ä k a u t e n a + s i i r t y m ä k a u t t a + s i i r t y m ä k e i n o j a + s i i r t y m ä k o r v a u s + s i i r t y m ä k o u l u t u s t a + s i i r t y m ä k u l u i h i n + s i i r t y m ä k u l u j a + s i i r t y m ä k u s t a n n u k s e t + s i i r t y m ä k u s t a n n u k s i a + s i i r t y m ä k u s t a n n u s t e n + s i i r t y m ä k y s y m y k s e t + s i i r t y m ä l a k i + s i i r t y m ä l a u s e k e + s i i r t y m ä l a u s e k e t t a + s i i r t y m ä l a u s e k k e e n + s i i r t y m ä l a u s e k k e e s e e n + s i i r t y m ä l a u s e k k e e s t a + s i i r t y m ä l i i k e + s i i r t y m ä l l ä + s i i r t y m ä m a l l i + s i i r t y m ä m e k a n i s m i + s i i r t y m ä m e n e t t e l y j e n + s i i r t y m ä m e t a l l i + s i i r t y m ä m ä ä r ä y k s e n ä + s i i r t y m ä m ä ä r ä y k s e t + s i i r t y m ä m ä ä r ä y k s i k s i + s i i r t y m ä m ä ä r ä y k s i s s ä + s i i r t y m ä m ä ä r ä y k s i s t ä + s i i r t y m ä m ä ä r ä y k s i ä + s i i r t y m ä m ä ä r ä y s t e n + s i i r t y m ä n + s i i r t y m ä o h j e l m a k s i + s i i r t y m ä o h j e l m a t + s i i r t y m ä o n g e l m i a + s i i r t y m ä p e r i a a t t e e s e e n + s i i r t y m ä p o i k k e u k s i a + s i i r t y m ä p r o s e s s e i h i n + s i i r t y m ä p r o s e s s i + s i i r t y m ä p r o s e s s i a + s i i r t y m ä p r o s e s s i e n + s i i r t y m ä p r o s e s s i i n + s i i r t y m ä p r o s e s s i l l a + s i i r t y m ä p r o s e s s i l l e + s i i r t y m ä p r o s e s s i n + s i i r t y m ä p r o s e s s i s s a + s i i r t y m ä p r o s e s s i t + s i i r t y m ä p u h e e n j o h t a j u u s + s i i r t y m ä p ö y t ä k i r j a + s i i r t y m ä p ö y t ä k i r j a n + s i i r t y m ä r a h o i t u k s e e n + s i i r t y m ä r a h o i t u k s e s t a + s i i r t y m ä r a j o i t u k s e e n + s i i r t y m ä s o p i m u k s e t + s i i r t y m ä s s ä + s i i r t y m ä s t ä + s i i r t y m ä s u u n n i t e l m a t + s i i r t y m ä s ä ä d ö k s e s t ä + s i i r t y m ä s ä ä n n ö i s t ä + s i i r t y m ä s ä ä n n ö k s e t + s i i r t y m ä s ä ä n n ö k s i i n + s i i r t y m ä s ä ä n n ö k s i l l ä + s i i r t y m ä s ä ä n n ö k s i s t ä + s i i r t y m ä s ä ä n n ö k s i ä + s i i r t y m ä s ä ä n n ö k s i ä ä n + s i i r t y m ä s ä ä n n ö s + s i i r t y m ä s ä ä n n ö s t e n + s i i r t y m ä s ä ä n n ö s t ä + s i i r t y m ä s ä ä n n ö s t ö n + s i i r t y m ä s ä ä n n ö s t ö ä + s i i r t y m ä s ä ä n n ö t + s i i r t y m ä s ä ä n t ö + s i i r t y m ä s ä ä n t ö i h i n + s i i r t y m ä s ä ä n t ö j e n + s i i r t y m ä s ä ä n t ö j ä + s i i r t y m ä t a l o u d e n + s i i r t y m ä t a l o u k s i e n + s i i r t y m ä t a l o u k s i s s a + s i i r t y m ä t a l o u s + s i i r t y m ä t a l o u s m a a n + s i i r t y m ä t a l o u s m a i s s a + s i i r t y m ä t e k n i i k k a + s i i r t y m ä t e k n o l o g i a + s i i r t y m ä t i l a + s i i r t y m ä t i l a n n e + s i i r t y m ä t i l a n t e i s t a + s i i r t y m ä t o i m e n p i d e + s i i r t y m ä t o i m e n p i t e e n ä + s i i r t y m ä t o i m e n p i t e e s t ä + s i i r t y m ä t o i m e n p i t e e t + s i i r t y m ä t o i m e n p i t e i d e n + s i i r t y m ä t o i m e n p i t e i n ä + s i i r t y m ä t o i m e n p i t e i s t ä + s i i r t y m ä t o i m e n p i t e i t ä + s i i r t y m ä t o i m i + s i i r t y m ä t o i m i a + s i i r t y m ä t o i m i e n + s i i r t y m ä t t ä + s i i r t y m ä v a i h e + s i i r t y m ä v a i h e e k s i + s i i r t y m ä v a i h e e n + s i i r t y m ä v a i h e e n a + s i i r t y m ä v a i h e e s e e n + s i i r t y m ä v a i h e e s s a + s i i r t y m ä v a i h e e s t a + s i i r t y m ä v a i h e e t + s i i r t y m ä v a i h e i s i i n + s i i r t y m ä v a i h e i s s a + s i i r t y m ä v a i h e i s t a + s i i r t y m ä v a i h e i t a + s i i r t y m ä v a i h e r a t k a i s u + s i i r t y m ä v a i h e r a t k a i s u a + s i i r t y m ä v a i h e t t a + s i i r t y m ä v a l m i s t e l u i s s a + s i i r t y m ä v u o d e n + s i i r t y m ä v u o s i + s i i r t y m ä v ä l i n e e n + s i i r t y m ä v ä l i n e e n ä + s i i r t y m ä v ä l i n e i d e n + s i i r t y m ä v ä y l ä l a u s e k e + s i i r t y m ä v ä y l ä l a u s e k e t t a + s i i r t y m ä v ä y l ä l a u s e k k e e n + s i i r t y m ä v ä y l ä l a u s e k k e e s e e n + s i i r t y m ä v ä y l ä l a u s e k k e e t + s i i r t y m ä v ä y l ä l a u s e k k e i t a + s i i r t y m ä ä n + s i i r t y n e e t + s i i r t y n y t + s i i r t y v ä n + s i i r t y y + s i i r t y ä + s i i r t y ä k s e m m e + s i i r t y ä k s e n n e + s i i r t ä e s s ä m m e + s i i r t ä e s s ä ä n + s i i r t ä i s i + s i i r t ä i s i m m e + s i i r t ä k ä ä m m e + s i i r t ä m i s e e n + s i i r t ä m i s e h d o t + s i i r t ä m i s e k s i + s i i r t ä m i s e s s ä + s i i r t ä m i s e s t ä + s i i r t ä m i s h a n k k e i d e n + s i i r t ä m i s i ä + s i i r t ä m i s p r o s e s s i a + s i i r t ä m i s p r o s e s s i e n + s i i r t ä m ä l l ä + s i i r t ä m ä s s ä + s i i r t ä m ä s t ä + s i i r t ä m ä t t ä + s i i r t ä m ä ä n + s i i r t ä n e e t + s i i r t ä n y t + s i i r t ä v ä t + s i i r t ä ä + s i i r t ä ä k s e e n + s i i r t ä ä k s e m m e + s i i s p ä + s i i s t e i m m ä s s ä k i n + s i i s t i m i s e s t ä + s i i s t i m i s o p e r a a t i o + s i i s t i m i s t o i m e n p i d e + s i i s t i m i s t y ö t ä + s i i s t i y t y m i s t ä + s i i t e p ö l y a l u e i d e n + s i i t e p ö l y l a j i a + s i i t o s e l ä i m i ä + s i i t o s e l ä i n t e n + s i i t o s e m a k o i d e n + s i i t o s k a n a n + s i i t o s k a r j a n + s i i t o s k a r j a s t a + s i i t o s m a k s u i s t a + s i i t t i ö i d e n + s i i t ä k i n + s i i t ä k ä ä n + s i i v e l l ä e l ä j i ä + s i i v e t + s i i v e t ö n r u o k k i + s i i v o a m i s t a + s i i v o t a a n p a + s i i v o t t a v a + s i i v o u k s e n + s i i v o u k s e s t a + s i i v o u s a l a + s i i v o u s h a r j o i t u s + s i i v o u s h e n k i l ö k u n t a a m m e + s i i v o u s h e n k i l ö s t ö n + s i i v o u s h e n k i l ö s t ö ä + s i i v o u s k o m i s s i o n + s i i v o u s k u l u j a + s i i v o u s o p e r a a t i o + s i i v o u s o p e r a a t i o i t a + s i i v o u s p a l v e l u + s i i v o u s p a l v e l u j e n + s i i v o u s p r o s e s s i + s i i v o u s r y h m ä + s i i v o u s t o i m e n p i d e + s i i v o u s t u o t t e e t + s i i v o u s t u o t t e i s t a + s i j a i n n i l t a a n + s i j a i n n i n + s i j a i n n i s t a + s i j a i n n i s t a a n + s i j a i n t i a + s i j a i n t i e t u + s i j a i n t i i n + s i j a i n t i l a u s e k e + s i j a i n t i l a u s e k e t t a + s i j a i n t i l a u s e k k e e n + s i j a i n t i l u p i e n + s i j a i n t i n s a + s i j a i n t i p a i k a l l a + s i j a i n t i p a i k a n + s i j a i n t i p a i k a s t a + s i j a i n t i p a i k k a + s i j a i n t i p a i k k a a n s a + s i j a i n t i p a i k k a k i l p a i l u n + s i j a i n t i p a i k k a k i l p a i l u s t a + s i j a i n t i p a i k k a n a + s i j a i n t i p a i k k a n a t i o n a l i s m i + s i j a i n t i p a i k k a t e k i j ä + s i j a i n t i p a i k k a t i e d o t + s i j a i n t i p a i k k o j e n + s i j a i n t i p a i k o i s t a + s i j a i n t i p e r u s t e i t a + s i j a i n t i t i e t o j a + s i j a i n t i v a l t i o l l e e n + s i j a i s e n a a n + s i j a i s e s i t t e l i j ä + s i j a i s h a l l i t s i j a a + s i j a i s h o i d o n + s i j a i s h o i t o + s i j a i s i n a + s i j a i s i s ä + s i j a i s k ä r s i j ö i k s i + s i j a i s n ä y t t e l i j ä + s i j a i s p e r h e + s i j a i s p e r h e e n + s i j a i s p e r h e e s e e n + s i j a i s p e r h e i d e n s ä + s i j a i s p e r h e i l l e + s i j a i s p e r h e i s s ä + s i j a i s p e r h e i s t ä + s i j a i s p e r h e i t ä + s i j a i s s o t a + s i j a i s t e h t ä v ä n s ä + s i j a i s t o i m i t u k s e t + s i j a i s v a n h e m p i a + s i j a i s ä i t i y d e l t ä + s i j a i s ä i t i y s + s i j a i t s e e + s i j a i t s e e k o + s i j a i t s e v a a + s i j a i t s e v a s t a + s i j a i t s e v a t + s i j a i t s e v i a + s i j a i t s e v i e n + s i j a i t s e v i i n + s i j a i t s e v i l l e + s i j a l l a + s i j a l l e + s i j o i l t a a n + s i j o i t a m m e + s i j o i t e t a a n + s i j o i t e t a a n k o + s i j o i t e t t a i s i i n + s i j o i t e t t u j e n + s i j o i t t a a + s i j o i t t a i s i t t e + s i j o i t t a j a l u o k a s t a + s i j o i t t a j a n + s i j o i t t a j a n s u o j a + s i j o i t t a j a n s u o j a a + s i j o i t t a j a n s u o j a j ä r j e s t e l m ä + s i j o i t t a j a n s u o j a n + s i j o i t t a j a n s u o j a s t a + s i j o i t t a j a o i k e u k s i e n + s i j o i t t a j a r y h m i ä + s i j o i t t a j a r y h m ä n + s i j o i t t a j a r y h m ä t + s i j o i t t a j a r y h m ä ä + s i j o i t t a j a t + s i j o i t t a j a t u r v a j ä r j e s t e l m ä + s i j o i t t a j a t u r v a n o r m i e n + s i j o i t t a j a v a s t u i t a + s i j o i t t a j a y h t e i s ö j e n + s i j o i t t a j i a + s i j o i t t a j i e n + s i j o i t t a j i l l e + s i j o i t t a j i l l e e n + s i j o i t t a k a a + s i j o i t t a k a a m m e + s i j o i t t a m a a n + s i j o i t t a m a t t a + s i j o i t t a m i s e s t a + s i j o i t t a m i s m a h d o l l i s u u k s i a + s i j o i t t a m i s o h j e l m i e n + s i j o i t t a m i s t a + s i j o i t t a m i s v a p a u d e n + s i j o i t t a n e e t + s i j o i t t a u t u m a t t o m i l t a + s i j o i t t a u t u m i s j ä s e n v a l t i o n + s i j o i t t a u t u m i s j ä s e n v a l t i o s s a + s i j o i t t a u t u m i s m a a h a n + s i j o i t t a u t u m i s m a a n + s i j o i t t a u t u m i s o i k e u d e n + s i j o i t t a u t u m i s o i k e u d e s t a + s i j o i t t a u t u m i s o i k e u s + s i j o i t t a u t u m i s o i k e u t e e n + s i j o i t t a u t u m i s o i k e u t t a + s i j o i t t a u t u m i s o i k e u t t a a n + s i j o i t t a u t u m i s p a i k k a a n + s i j o i t t a u t u m i s v a l t i o n + s i j o i t t a u t u m i s v a p a u d e n + s i j o i t t a u t u m i s v a p a u d e s t a + s i j o i t t a u t u m i s v a p a u k s i a + s i j o i t t a u t u m i s v a p a u s + s i j o i t t a u t u m i s v a p a u t e e n + s i j o i t t a u t u m i s v a p a u t t a + s i j o i t t a u t u m i s v a p a u t t a a n + s i j o i t t a u t u n e i d e n + s i j o i t t a v a t + s i j o i t t u m i s j ä s e n v a l t i o n s a + s i j o i t t u m i s o i k e u d e n + s i j o i t t u m i s v a p a u d e n + s i j o i t t u m i s v a p a u d e s t a + s i j o i t t u m i s v a p a u t e e n + s i j o i t t u u + s i j o i t u k s e t + s i j o i t u k s i a + s i j o i t u k s i e n + s i j o i t u k s i i n + s i j o i t u k s i s s a + s i j o i t u k s i s t a + s i j o i t u k s i s t a a n + s i j o i t u s a l a a + s i j o i t u s a l a a n + s i j o i t u s a l a l l e + s i j o i t u s a l u e i l l a a n + s i j o i t u s a n a l y y t i k o n + s i j o i t u s e d e l l y t y s t e n + s i j o i t u s h a n k e + s i j o i t u s h a n k k e i d e n + s i j o i t u s h a n k k e i s i i n + s i j o i t u s h a n k k e i t a + s i j o i t u s h y ö d y k k e i t ä + s i j o i t u s i l m a p i i r i + s i j o i t u s i l m a p i i r i i n + s i j o i t u s i l m a p i i r i n + s i j o i t u s i l m a p i i r i ä + s i j o i t u s i l m a s t o + s i j o i t u s i l m a s t o a + s i j o i t u s j o h t a j a n a + s i j o i t u s j o u k k o i h i n + s i j o i t u s j ä r j e s t e l m i k s i + s i j o i t u s j ä r j e s t e l m ä n + s i j o i t u s j ä r j e s t e l m ä s t ä + s i j o i t u s j ä r j e s t e l m ä ä n + s i j o i t u s k a n n u s t i m i e n + s i j o i t u s k a n n u s t i m i l l e + s i j o i t u s k e h y k s e s t ä + s i j o i t u s k e i n o j e n + s i j o i t u s k i e l l o n + s i j o i t u s k i l p a i l u u n + s i j o i t u s k o h d e + s i j o i t u s k o h t e i t a + s i j o i t u s k o u l u j e n + s i j o i t u s k u m p p a n e i t a + s i j o i t u s k ä y t ä n n ö i l l e + s i j o i t u s l a i t o s + s i j o i t u s l ä h t e i d e n + s i j o i t u s m a h d o l l i s u u d e t + s i j o i t u s m a h d o l l i s u u k s i a + s i j o i t u s m a h d o l l i s u u k s i e n + s i j o i t u s m a h d o l l i s u u k s i s t a + s i j o i t u s m a r k k i n a t + s i j o i t u s m a r k k i n o i d e n + s i j o i t u s m a r k k i n o i l l a + s i j o i t u s m a r k k i n o i l t a + s i j o i t u s m e t s ä ä n + s i j o i t u s m u o d o k s i + s i j o i t u s m u o d o t + s i j o i t u s m u o t o j a + s i j o i t u s m ä ä r ä y k s i l l e + s i j o i t u s m ä ä r ä y k s i ä + s i j o i t u s n e u v o j a n a + s i j o i t u s n e u v o j a t + s i j o i t u s n e u v o n n a n + s i j o i t u s n e u v o t t e l u i s t a + s i j o i t u s n e u v o t t e l u i t a + s i j o i t u s n e u v o t t e l u t + s i j o i t u s o h j e l m i a + s i j o i t u s o h j e l m i s t a + s i j o i t u s o l o s u h t e i t a + s i j o i t u s p a k e t t i a + s i j o i t u s p a l v e l u a l a n + s i j o i t u s p a l v e l u d i r e k t i i v i + s i j o i t u s p a l v e l u d i r e k t i i v i i n + s i j o i t u s p a l v e l u d i r e k t i i v i n + s i j o i t u s p a l v e l u d i r e k t i i v i s s ä + s i j o i t u s p a l v e l u d i r e k t i i v i s t ä + s i j o i t u s p a l v e l u d i r e k t i i v i ä + s i j o i t u s p a l v e l u i l l e + s i j o i t u s p a l v e l u i s t a + s i j o i t u s p a l v e l u i t a + s i j o i t u s p a l v e l u j a + s i j o i t u s p a l v e l u j e n + s i j o i t u s p a l v e l u m a r k k i n o i d e n + s i j o i t u s p a l v e l u t + s i j o i t u s p a l v e l u y r i t y k s e t + s i j o i t u s p a l v e l u y r i t y k s i l l e + s i j o i t u s p a l v e l u y r i t y k s i s s ä + s i j o i t u s p a l v e l u y r i t y k s i s t ä + s i j o i t u s p a l v e l u y r i t y k s i ä + s i j o i t u s p a l v e l u y r i t y s t e n + s i j o i t u s p a n k i n + s i j o i t u s p a n k i t + s i j o i t u s p a n k k i + s i j o i t u s p a n k k i e n + s i j o i t u s p a n k k i i r i n a + s i j o i t u s p o l i t i i k a l l a + s i j o i t u s p o l i t i i k a l l e + s i j o i t u s p o l i t i i k a n + s i j o i t u s p o l i t i i k a s s a + s i j o i t u s p o l i t i i k a s t a + s i j o i t u s p o l i t i i k a t + s i j o i t u s p o l i t i i k k a + s i j o i t u s p o l i t i i k k a a + s i j o i t u s p o l i t i i k k a a n + s i j o i t u s p o l i t i i k k o j e n + s i j o i t u s p o l i t i i k o i s t a + s i j o i t u s p r o f i i l i + s i j o i t u s p ä ä o m a + s i j o i t u s p ä ä o m a a n + s i j o i t u s p ä ä o m a l l e + s i j o i t u s p ä ä o m a m a r k k i n o i d e n + s i j o i t u s p ä ä o m a n + s i j o i t u s p ä ä o m a n s a + s i j o i t u s p ä ä o m a r a h a s t o n + s i j o i t u s p ä ä o m a y r i t y k s i ä + s i j o i t u s p ä ä o m i e n + s i j o i t u s p ä ä t ö k s i l l ä + s i j o i t u s p ä ä t ö k s i s t ä ä n + s i j o i t u s p ä ä t ö s + s i j o i t u s r a h a s t o + s i j o i t u s r a h a s t o a + s i j o i t u s r a h a s t o a l a + s i j o i t u s r a h a s t o a l a a + s i j o i t u s r a h a s t o a l a a n + s i j o i t u s r a h a s t o a l a l l a + s i j o i t u s r a h a s t o i h i n + s i j o i t u s r a h a s t o i k s i + s i j o i t u s r a h a s t o i l l a + s i j o i t u s r a h a s t o i l l e + s i j o i t u s r a h a s t o i s s a + s i j o i t u s r a h a s t o i s t a + s i j o i t u s r a h a s t o j a + s i j o i t u s r a h a s t o j e n + s i j o i t u s r a h a s t o j e n s a + s i j o i t u s r a h a s t o m a r k k i n o i s t a + s i j o i t u s r a h a s t o n + s i j o i t u s r a h a s t o o n + s i j o i t u s r a h a s t o t + s i j o i t u s r a h a s t o t e o l l i s u u d e n + s i j o i t u s r a h o i t t a m i s t a + s i j o i t u s r a j o i t u k s i a + s i j o i t u s r a t k a i s u j a + s i j o i t u s r i s k i + s i j o i t u s r i s k i t + s i j o i t u s s o p i m u k s e l l a + s i j o i t u s s o p i m u k s e n + s i j o i t u s s o p i m u k s e s s a + s i j o i t u s s o p i m u k s e s t a + s i j o i t u s s o p i m u k s e t + s i j o i t u s s o p i m u k s i a + s i j o i t u s s o p i m u k s i e m m e + s i j o i t u s s o p i m u k s i e n + s i j o i t u s s o p i m u k s i s s a + s i j o i t u s s o p i m u k s i s t a + s i j o i t u s s o p i m u s + s i j o i t u s s o p i m u s m a l l i a a n + s i j o i t u s s o p i m u s t a + s i j o i t u s s o p i m u s t e n + s i j o i t u s s t r a t e g i a + s i j o i t u s s t r a t e g i a a n s a + s i j o i t u s s t r a t e g i o i d e n + s i j o i t u s s t r a t e g i o i h i n + s i j o i t u s s t r a t e g i o i l l a + s i j o i t u s s t r a t e g i o i s t a + s i j o i t u s s t r a t e g i o i t a + s i j o i t u s s u h t e i t a + s i j o i t u s s u o j a n + s i j o i t u s s u o j a s o p i m u k s e t + s i j o i t u s s u u n n i t e l m a + s i j o i t u s s u u n n i t e l m a s s a a n + s i j o i t u s s u u n n i t e l m i a + s i j o i t u s s ä ä n n ö i s t ä + s i j o i t u s s ä ä n t ö j ä + s i j o i t u s s ä ä s t ä m i n e n + s i j o i t u s t a r k o i t u k s i s t a + s i j o i t u s t a r p e e t + s i j o i t u s t a v o i t t e i s t a + s i j o i t u s t e n + s i j o i t u s t o d i s t u k s e t + s i j o i t u s t o d i s t u s t e n + s i j o i t u s t o i m i i n + s i j o i t u s t o i m i n n a l t a + s i j o i t u s t o i m i n n a n + s i j o i t u s t o i m i n t a + s i j o i t u s t o i m i n t a a + s i j o i t u s t o i m i n t a a n + s i j o i t u s t u o t e p e r h e i d e n + s i j o i t u s t u o t t e e s t a + s i j o i t u s t u o t t e e t + s i j o i t u s t u o t t e i d e n + s i j o i t u s t u o t t e i s i i n + s i j o i t u s t u o t t e i s t a + s i j o i t u s t u o t t e i t a + s i j o i t u s v a a t i m u k s i s t a + s i j o i t u s v a i h t o e h d o t + s i j o i t u s v a i h t o e h t o i h i n + s i j o i t u s v a i k e u k s i a + s i j o i t u s v a i k e u k s i i n + s i j o i t u s v a k u u t u k s e t + s i j o i t u s v a p a u s + s i j o i t u s v i r t o j e n + s i j o i t u s v ä l i n e e l l ä + s i j o i t u s v ä l i n e i s i i n + s i j o i t u s v ä l i n e i t ä + s i j o i t u s y h t e i s ö n + s i j o i t u s y h t i ö i d e n + s i j o i t u s y h t i ö i h i n + s i j o i t u s y h t i ö i l l e + s i j o i t u s y h t i ö i l t ä + s i j o i t u s y h t i ö i s s ä + s i j o i t u s y h t i ö i s t ä + s i j o i t u s y h t i ö i t ä + s i j o i t u s y h t i ö s s ä + s i j o i t u s y h t i ö t + s i j o i t u s y m p ä r i s t ö ä + s i j o i t u s y m p ä r i s t ö ö n + s i j o i t u s y r i t y k s e n + s i j o i t u s y r i t y k s e t + s i j o i t u s y r i t y k s i i n + s i j o i t u s y r i t y k s i l l e + s i j o i t u s y r i t y k s i ä + s i j o i t u s y r i t y s + s i j o i t u s y r i t y s t e n + s i j o i t u t t a v a + s i k a h i r v i + s i k a i h m i s i s t ä + s i k a i n f l u e n s s a + s i k a i n f l u e n s s a a + s i k a i n f l u e n s s a e p i d e m i a s t a + s i k a i n f l u e n s s a n + s i k a i n f l u e n s s a s t a + s i k a i n f l u e n s s a t a p a u k s i a + s i k a l a t + s i k a l o i d e n + s i k a p a i k k o j e n + s i k a p a r o i l l a + s i k a r i a s k i a + s i k a r i l e i k k u r i + s i k a r u t o n + s i k a r u t o s t a + s i k a r u t t o + s i k a r u t t o a + s i k a r u t t o a s i a n t u n t i j o i t a + s i k a r u t t o e p i d e m i a a + s i k a r u t t o e s i i n t y m ä t + s i k a r u t t o k r i i s i s t ä + s i k a r u t t o o n + s i k a r u t t o t a p a u k s i a + s i k a r u t t o t e u r a s t u s t e n + s i k a s o t a + s i k a t a l o u d e s s a + s i k a t a l o u d e s t a + s i k a t a l o u s + s i k a t e o l l i s u u s + s i k a t e u r a s t a m o s t a + s i k a t i l a l l i s i i n + s i k a t i l a n + s i k a t i l o i s t a + s i k a t i l o j a + s i k h i t + s i k h i v a l t i o + s i k i ö i h i n + s i k i ö i s t ä + s i k i ö i t ä + s i k i ö k a n t a s o l u j e n + s i k i ö n + s i k i ö p i i r r o s k i i s t a + s i k i ö s o l u j e n + s i k i ö t u t k i m u k s e s s a + s i k i ö ö n + s i k o a n g e r v o + s i k o j a + s i k o j e n + s i k o j e n h o i t o j ä r j e s t e l m ä s t ä + s i k o j e n l a h t e e n + s i k o j e n l a h t i + s i k s a k i s t a + s i k s i h ä n + s i k s i k i n + s i k s i k ä ä n + s i k s i p ä + s i k u n a ö l j y + s i k u r i r o u s k u + s i k u r i t u o t t e e t + s i k u r i t u o t t e i d e n + s i k u r i u u t t e i d e n + s i k u r i u u t t e i s t a + s i k u r i u u t t e i t a + s i k ä l ä i s i ä + s i k ä l ä i s t e n + s i l a k a n + s i l a k a n p y y n t i + s i l a k a s t a + s i l a k k a a + s i l a k k a k a n n a t + s i l a k k a k a n t a + s i l a k k a m a r k k i n a t + s i l a k k a s a a l i i s t a + s i l a k o i t a + s i l a u k s e n + s i l h u e t t i a u t o + s i l i k a a t t i m i n e r a a l i + s i l i k a g e e l i + s i l i k o n i p r o t e e s e i s t a + s i l i k o n i p r o t e e s e j a + s i l i k o n i p r o t e e s i e n + s i l i k o n i p r o t e e s i t + s i l i k o n i r i n t a i m p l a n t t e j a + s i l i k o n i r i n t a p r o t e e s e j a + s i l i k o n i r i n t o j e n + s i l i k o n i s o v e l l u k s e t + s i l i n t e r i h a t t u + s i l i t y s r a u t a + s i l k k a a + s i l k k a a n + s i l k k i h a i k a r a + s i l k k i h a n s i k k a a n + s i l k k i h a n s i k k a i n + s i l k k i k a r d i n a a l i + s i l k k i k e h r ä ä m ö + s i l k k i k e r t t u n e n + s i l k k i k o t t a r a i n e n + s i l k k i k ö y n n ö s + s i l k k i l e h t i m i t t a r i + s i l k k i p a i n o + s i l k k i p a p e r i + s i l k k i t a s s u + s i l k k i t e r r i e r i + s i l k k i t i e + s i l k k i t i e h e n + s i l k k i t i e l l e + s i l k k i t i e l l ä + s i l k k i t i e n + s i l k k i t u p p i s i e n i + s i l k k i t u r p i a a l i + s i l k k i u i k k u + s i l k k i u n i k k o + s i l k k i v a l m u s k a + s i l k k i v i n t t i k o i r a + s i l k k i v y ö k ä ä p ä + s i l l a n + s i l l a n p ä ä a s e m a + s i l l a n r a k e n n u k s e n + s i l l a n r a k e n n u s + s i l l a n r a k e n n u s t a + s i l l a n r a k e n t a j a n + s i l l a n r a k e n t a j a n a + s i l l a n r a k e n t a j i a + s i l l a n r a k e n t a j i n a + s i l l a n r a k e n t a m i s e e n + s i l l a s t a + s i l l a t + s i l l e + s i l l i a l a a n + s i l l i h a p e r o + s i l l i k a n n a n + s i l l i k a n t a + s i l l i k u n i n g a s + s i l l i k u o r e e t + s i l l i n p y y n t i + s i l l i s a l a a t t i + s i l l i s a l a a t t i a + s i l l i s a l a a t t i m i e t i n t ö + s i l l i s a l a a t t i t e r m i n + s i l l i v a l a s + s i l l o i n h a n + s i l l o i n k i n + s i l l o i s e n + s i l l o i s t a + s i l l o i t e t t u a + s i l l ä k i n + s i l m i e m m e + s i l m i e n + s i l m i e n i + s i l m i e n n e + s i l m i e n s ä + s i l m i i n + s i l m i i n p i s t ä v i m m i n + s i l m i i n p i s t ä v i n + s i l m i i n p i s t ä v i n t ä + s i l m i i n p i s t ä v ä m p i ä + s i l m i i n p i s t ä v ä m p ä ä + s i l m i i n p i s t ä v ä ä + s i l m i l l e m m e + s i l m i n + s i l m i n n ä k i j ä k e r t o m u s t e n + s i l m i n n ä k i j ä k u v a u k s e t + s i l m i n n ä k i j ä l a u s u n t o j a + s i l m i n n ä k i j ä l a u s u n t o o n + s i l m i n n ä k i j ä t o d i s t u k s e t + s i l m i n n ä k i j ö i d e n + s i l m i s s ä + s i l m i s s ä n i + s i l m i s t ä m m e + s i l m i t t ö m ä n + s i l m i ä + s i l m i ä m m e + s i l m i ä n i + s i l m i ä ä n + s i l m u k k a k o k o + s i l m u k k a k v a n t t i p a i n o v o i m a + s i l m u k k a m e n e t e l m ä + s i l m u k o i n t i k o h t a m u t a a t i o + s i l m ä i l l e s s ä n i + s i l m ä i l t a y ö k k ö n e n + s i l m ä k i i t ä j ä + s i l m ä k o k o + s i l m ä k o k o a + s i l m ä k o k o j a + s i l m ä k o k o j e n + s i l m ä k o k o l u o k k a a n + s i l m ä k o k o o n + s i l m ä k o k o p a n e e l e j a + s i l m ä k o o l l a + s i l m ä k o o n + s i l m ä k o o t + s i l m ä l a s i e n + s i l m ä l a s i h a a h k a + s i l m ä l a s i k a i m a a n i + s i l m ä l a s i k a r h u + s i l m ä l a s i k u r k i + s i l m ä l a s i k ä ä r m e + s i l m ä l a s i l u r i + s i l m ä l a s i p y ö r i ä i n e n + s i l m ä l a s i r e s e p t i + s i l m ä l e i k k a u s t e n + s i l m ä l i h a k s e t + s i l m ä m m e + s i l m ä n i + s i l m ä n k ä ä n t ö t e m p p u + s i l m ä n k ä ä n t ö t e m p p u a + s i l m ä n k ä ä n t ö t e m p p u j a + s i l m ä n k ä ä n t ö t e m p u i n + s i l m ä n k ä ä n t ö t e m p u i s t a + s i l m ä n k ä ä n t ö t e m p u l l a + s i l m ä n l u m e + s i l m ä n l u m e e k s i + s i l m ä n l u m e e n + s i l m ä n l u m e e s t a + s i l m ä n l u m e t t a + s i l m ä n n e + s i l m ä n p a i n e + s i l m ä n r ä p ä y k s e s s ä + s i l m ä n s ä + s i l m ä p r o t e e s i + s i l m ä s a i r a u k s i a + s i l m ä s a i r a u k s i e n + s i l m ä s a i r a u s + s i l m ä s i + s i l m ä s k i n k k i + s i l m ä s y ö p ä + s i l m ä t + s i l m ä t u l e h d u k s e s t a + s i l m ä t u l e h d u s + s i l m ä v a m m o j a + s i l m ä v a u r i o i d e n + s i l m ä v a u r i o i t a + s i l m ä ä n p i s t ä v i m m i n + s i l m ä ä n p i s t ä v i m m ä t + s i l m ä ä n s ä + s i l o t e l t u a + s i l p o m i s e e n + s i l p o m i s e n + s i l p o m i s e s t a + s i l p o m i s e t + s i l p o m i s k ä y t ä n n ö n + s i l p o m i s k ä y t ä n t ö + s i l p o m i s k ä y t ä n t ö i h i n + s i l p o m i s t a + s i l t a a + s i l t a h a n k e + s i l t a h ä m ä h ä k k i + s i l t a l a u s e k e t t a + s i l t a m a k s u t + s i l t a n a + s i l t a n o s t u r i + s i l t a o n n e t t o m u u s + s i l t a p r o j e k t i + s i l t a r u m p u p o l i t i i k k a + s i l t a r u m p u p o l i t i i k k a a + s i l t a t a l o u s a r v i o n + s i l t a t a l o u s a r v i o n a + s i l t o j a + s i l t o j e n + s i l t ä + s i l u e t t i a m m u n t a + s i l v o t a a n + s i l v o t t u + s i m p u k a n k a s v a t t a j a t + s i m p u k a n k a s v a t t a j i l l e + s i m p u k a n k a s v a t u s + s i m p u k a n k e r ä ä j i e n + s i m p u k a n k e r ä ä j i l l e + s i m p u k a n k e r ä ä j i ä + s i m p u k a n k e r ä ä j ä t + s i m p u k a n k u o r e l l a + s i m p u k a n v a r t i j a + s i m p u k a n v i l j e l i j ä t + s i m p u k a n v i l j e l i j ö i l l e + s i m p u k a n v i l j e l y t e o l l i s u u t t a + s i m p u k k a l a j i + s i m p u k k a l a j i e n + s i m p u k k a m y r k y t y s + s i m p u k k a t u o t t e i d e n + s i m p u k k a v e s i ä + s i m p u k o i d e n + s i m p u k o i s t a + s i m p u k o i t a + s i m u l a a t i o h a r j o i t u k s e e n + s i m u l a a t i o h a r j o i t u k s i s s a + s i m u l a a t i o h a r j o i t u s + s i m u l o i n t i h a r j o i t u k s i a + s i m u l o i n t i m a l l i + s i m u l o i n t i t e s t e j ä + s i m u l t a a n i s h a k k i + s i m u l t a a n i t u l k i n + s i m u l t a a n i t u l k k a u k s e e n + s i m u l t a a n i t u l k k a u k s e n + s i m u l t a a n i t u l k k a u s + s i m u l t a a n i t u l k k a u s t a + s i m u l t a a n i t u l k k a u s v ä l i n e i s t ö n + s i n a p i n s i e m e n e s t ä + s i n a p p i h a p e r o + s i n a p p i h a p p o + s i n a p p i k a a l i + s i n a p p i k a a s u + s i n a p p i k a a s u a + s i n a p p i k a a s u k r a n a a t e i l l a + s i n a p p i k a a s u n + s i n a p p i k a a s u p o m m i t + s i n a p p i p e r h o n e n + s i n a p p i t y m p ö n e n + s i n a p p i v a l m i s t e i t a + s i n d h i t + s i n e t ö i d ä + s i n e t ö i n y t + s i n e t ö i t i i n + s i n e t ö i t y i h i n + s i n e t ö i t y j e n + s i n f o n i a o r k e s t e r i + s i n f o n i k o i s t a + s i n g a l e e s i e n e m m i s t ö n + s i n g a l e e s i h a l l i t u k s e l l e + s i n g a l e e s i n k o i r a + s i n g a l e e s i t + s i n g a l e e s i t y ö n t e k i j ö i d e n + s i n g a l e e s i v ä e s t ö n + s i n g l e l i s t a + s i n i a a l t o + s i n i a r a + s i n i b a r e t e i l l e + s i n i b a r e t t i e n + s i n i e v ä t o n n i k a l a a + s i n i e v ä t o n n i k a l a a n + s i n i e v ä t o n n i k a l a n + s i n i h a i l l e + s i n i h a i n + s i n i h a p p o + s i n i h a r a k k a + s i n i h a r j a l e p i n k ä i n e n + s i n i h a r j a r a p u + s i n i h e i n ä + s i n i h u p p u + s i n i h u u l i a h v e n + s i n i j a l k a s u u l a + s i n i j o k i r a s t a s + s i n i j u o v a v ä l s k ä r i + s i n i k a l a t + s i n i k a r d i n a a l i + s i n i k e l l o l e h t o j a + s i n i k e r t t u l i + s i n i k e v ä t y ö k k ö n e n + s i n i k i e k k o k a l a + s i n i k i e l i s k i n k k i + s i n i k i e l i t a u t i + s i n i k i e l i t a u t i r o k o t u s t e n + s i n i k i r j o a h v e n + s i n i k o r v a l u r i + s i n i k o t i l o h a u k k a + s i n i k o t i n g a + s i n i k u l m a m e s i k k o + s i n i k u r k k u a r a + s i n i k u u s a m a + s i n i k y y h k y t + s i n i l a k k i k a i j a n e n + s i n i l a k k i k o l i b r i + s i n i l a k k i m o n a r k k i + s i n i l a k k i n a a k k a + s i n i l a k k i s i e p p o + s i n i l a k k i t a n s s i j a + s i n i l a u k k a + s i n i l e h t i m i t t a r i + s i n i l e h v ä s a m m a l + s i n i l e p p ä r o u s k u + s i n i l e u k a k i r j o a h v e n + s i n i l e u k a k o l i b r i + s i n i l e u k a s ä p p i k a l a + s i n i l e v i l l ä + s i n i l e v ä + s i n i l i e j u k a n a + s i n i l i n t u k a l a + s i n i l o b e l i a + s i n i l u p i i n i + s i n i m a k r i l l i + s i n i m a r a k a t t i + s i n i m a t k i j a + s i n i m o n a r k k i + s i n i n a a m a m e s i k k o + s i n i n a a m a p e i p p o + s i n i n e i t o k a l a + s i n i n e n ä a h v e n + s i n i n e o n t e t r a + s i n i n e o n t o k k o + s i n i n i s k a i i b i s + s i n i n i s k a l u r i + s i n i n i s k a n ä r h i + s i n i n o k i m e s i k k o + s i n i n o k i p ä ä s k y + s i n i n o k k a p r i o n i + s i n i n u o l i m y r k k y s a m m a k k o + s i n i n ä r h i + s i n i p e i p p o + s i n i p e l l a v a + s i n i p e n s a s n ä r h i + s i n i p e r u u k k i k e r t t u + s i n i p i i k k i p u t k i + s i n i p i n g v i i n i + s i n i p o s k i a m a t s o n i + s i n i p u n a h a l l i t u k s e n + s i n i p y r s t ö + s i n i p ä ä a r a + s i n i p ä ä l u i k e r o + s i n i r a p u + s i n i r a s t a s + s i n i r a s t i + s i n i r i h m a k a l a + s i n i r i k k o + s i n i r i n t a b u l b u l i + s i n i r i n t a t r o g o n i + s i n i r i s t i + s i n i r i t a r i y ö k k ö n e n + s i n i r u o h o k a i j a + s i n i s a m p i + s i n i s a r v i a p i l a + s i n i s a t a k i e l i + s i n i s a v i k k a + s i n i s e e n + s i n i s e l k ä m o n a r k k i + s i n i s e l k ä r a s t a s + s i n i s e l k ä s i e p p o + s i n i s e n + s i n i s e s t ä + s i n i s e t + s i n i s i i p i k o l i b r i + s i n i s i i p i t a v i + s i n i s i l l ä + s i n i s i l m ä i n e n + s i n i s i l m ä i s e s t i + s i n i s i l m ä i s i ä + s i n i s i l m ä i s y y t e e n + s i n i s i l m ä k a k a d u + s i n i s i m p u k k a + s i n i s i m p u k o i t a + s i n i s i ä + s i n i s t e n + s i n i s u o h a u k k a + s i n i s ä p p i k a l a + s i n i s ä ä s k i k e r t t u + s i n i t a i v a s + s i n i t a i v a s k e s k u s t e l u s s a + s i n i t a n s s i j a + s i n i t a r r a + s i n i t a s k u r a p u + s i n i t a t t i + s i n i t e t r a + s i n i t i a i n e n + s i n i t o u k o h ä r k ä + s i n i t u r s k a + s i n i t u r s k a n + s i n i t ä h t ö n e n + s i n i t ä p l ä k y y h k y + s i n i t ä p l ä t u r s a s + s i n i t ö p ö r a s t a s + s i n i t ö y h t ö m o n a r k k i + s i n i t ö y h t ö n ä r h i + s i n i u k o n k o r e n t o + s i n i v a a n i j a + s i n i v a l a a n + s i n i v a l a s + s i n i v a l e u n i k k o + s i n i v a l k o i n e n + s i n i v a l k o i s e t + s i n i v a l k o i s i s s a + s i n i v a l m u s k a + s i n i v a t s a t a n g a r a + s i n i v i i d a k k o h a u k k a + s i n i v i r n a y ö k k ö n e n + s i n i v u o k k o + s i n i y ö k ö n l e h t i + s i n k i l ä n a u l a i n + s i n k i n k a t o + s i n k k i a r k k u + s i n k k i a r k u s t a + s i n k k i b r o m i d i + s i n k k i f l u o r i d i + s i n k k i f o s f a a t t i + s i n k k i f o s f i d i + s i n k k i h y d r o k s i d i + s i n k k i k l o r i d i + s i n k k i o k s i d i + s i n k k i s o r m i + s i n k k i s u l f a a t t i + s i n k k i s u l f i d i + s i n n i k k y y t t ä + s i n n i k k ä i d e n + s i n n i k k ä i s t ä + s i n n i k k ä i t ä + s i n n i t t e l i s i m m e + s i n o o p e r i m a l m i a + s i n o o p e r i m a l m i n + s i n u a + s i n u s t a + s i o n i s t i j ä r j e s t ö + s i o n i s t i y h t e i s ö + s i p s u t u s a s k e l e i s i i n + s i p u l i m a l l i a + s i p u l i m a l l i n + s i p u l i n u r m i k k a + s i p u l i r e i t i t y s + s i r e e n i e n + s i r i t t ä j ä t a p a k u l o + s i r i t t ä v ä t + s i r k k a h a u k k a + s i r k k a l i n n u t + s i r k k a ä y r i ä i s e t + s i r k k u v a r p u n e n + s i r k u k s e l l e + s i r k u k s e n + s i r k u k s e n a + s i r k u k s e s s a + s i r k u k s i s s a + s i r k u s a l a n + s i r k u s k a r a v a a n i + s i r k u s k o u l u j e n + s i r k u s k u l t t u u r i + s i r k u s m a a i l m a s t a + s i r k u s p r i n s e s s a + s i r k u s t a + s i r k u s t a i t e i l i j a a + s i r k u s t y ö l ä i s i l l e + s i r k u s t y ö n t e k i j ö i d e n + s i r k u s y h t e i s ö n + s i r k u s y h t e i s ö s s ä + s i r k u s y r i t y s t e n + s i r m a u r i + s i r o n + s i r o t u o m i p i h l a j a + s i r p a l e e t + s i r p a l e i k s i + s i r p a l e k r a n a a t t e j a + s i r p a l e k r a n a a t t i + s i r p a l e l i i v i + s i r p a l e l i i v i t + s i r p a l e p o m m i e n + s i r p a l e p o m m i t + s i r p a l e r a t k a i s u t + s i r p a l o i t u m i s p r o s e s s e i l l e + s i r p p i a h v e n + s i r p p i h u u l i k a l a + s i r p p i k e i s a r i k a l a + s i r p p i k e r t t u l i + s i r p p i k i p u a j a + s i r p p i m a i l a n e n + s i r p p i p a r a t i i s i l e s k i + s i r p p i p ä ä s k y k a h l a a j a + s i r p p i s a p e l i k o l i b r i + s i r p p i s o l u a n e m i a + s i r p p i s o r s a + s i r p p i s u u r i s i l m ä + s i r p p i v a n g a + s i r p p i v i h e l t ä j ä s o r s a + s i r p p i y ö k k ö n e n + s i r u k o r t t i + s i r u t e h d a s + s i s a r a i n e t t a + s i s a r a l u k s e l l e + s i s a r e l l e n i + s i s a r e t + s i s a r j ä r j e s t ö j e n s ä + s i s a r j ä r j e s t ö s s ä + s i s a r k a n s a k u n t a + s i s a r k a u p u n k i s u h t e i s t a + s i s a r k o d i k s i + s i s a r l a i v a n + s i s a r n e u v o s t o n + s i s a r o r g a n i s a a t i o m m e + s i s a r p u o l u e e l l e m m e + s i s a r p u o l u e e m m e + s i s a r p u o l u e e n s a + s i s a r p u o l u e e s e e n s a + s i s a r p u o l u e i d e m m e + s i s a r p u o l u e i s i i m m e + s i s a r p u o l u e i t a + s i s a r p u o l u e t t a a n + s i s a r u k s e t + s i s a r v a l t i o + s i s a r v a l t i o s s a n n e + s i s a r v a l t i o t a m m e + s i s i l i a n + s i s i l i a n s a l m i + s i s i m m ä s s ä n i + s i s i m m ä s s ä ä n + s i s k o j a m m e + s i s s e i l l e + s i s s e j ä + s i s s i j o h t a j a + s i s s i j o h t a j i a + s i s s i j o u k k o j e n + s i s s i j ä r j e s t ö i l l e + s i s s i j ä r j e s t ö j e n + s i s s i j ä r j e s t ö n + s i s s i j ä r j e s t ö ö n + s i s s i k o n f l i k t i + s i s s i l i i k e t t ä + s i s s i l i i k k e e l l e + s i s s i l i i k k e e n + s i s s i l i i k k e e t + s i s s i l i i k k e i t ä + s i s s i m a r k k i n o i n t i + s i s s i p a r t i o + s i s s i p ä ä l l i k ö i l l e + s i s s i r y h m i e n + s i s s i r y h m i t t y m ä t + s i s s i r y h m ä + s i s s i r y h m ä n + s i s s i r y h m ä t + s i s s i s o d a l l a + s i s s i s o d a l l e + s i s s i s o d a l t a + s i s s i s o d a n + s i s s i s o d a n k ä y n n i n + s i s s i s o d a s s a + s i s s i s o d a t + s i s s i s o t a + s i s s i s o t a a + s i s s i s o t a a n + s i s s i s o t a n a + s i s s i t a i s t e l i j o i t a + s i s s i t a i s t e l u j a + s i s s i t o i m i n n a n + s i s s i t o i m i n t a a + s i s s i v i l j e l y + s i s u k k a i n + s i s u k k u u t t a + s i s u s p u n o s + s i s u s t u s m u s i i k k i + s i s u s v a l t i m o r u n k o + s i s ä a l u e + s i s ä a l u e i s i i n + s i s ä a s i a a n + s i s ä a s i a i n + s i s ä a s i a i n m i n i s t e r e i d e n + s i s ä a s i a i n m i n i s t e r e i l l e + s i s ä a s i a i n m i n i s t e r e i t ä + s i s ä a s i a i n m i n i s t e r i + s i s ä a s i a i n m i n i s t e r i e n + s i s ä a s i a i n m i n i s t e r i k s i + s i s ä a s i a i n m i n i s t e r i l l e + s i s ä a s i a i n m i n i s t e r i n + s i s ä a s i a i n m i n i s t e r i n ä + s i s ä a s i a i n m i n i s t e r i t + s i s ä a s i a i n m i n i s t e r i ö + s i s ä a s i a i n m i n i s t e r i ö l l e + s i s ä a s i a i n m i n i s t e r i ö n + s i s ä a s i a i n m i n i s t e r i ö s s ä + s i s ä a s i a i n n e u v o s t o + s i s ä a s i a i n p o l i t i i k a n + s i s ä a s i a i n s e k t o r i e n + s i s ä a s i a n + s i s ä a s i a n m i n i s t e r i + s i s ä a s i a t + s i s ä a s i o i d e n + s i s ä a s i o i h i n + s i s ä a s i o i h i n s a + s i s ä a s i o i s s a + s i s ä a s i o i s s a k a a n + s i s ä a s i o i s t a + s i s ä a s i o i s t a a n + s i s ä a s i o i t a + s i s ä e l i m i s s ä + s i s ä e n e r g i a + s i s ä e r i t t e i t ä + s i s ä e r i t y k s e e n + s i s ä e r i t y s h ä i r i ö t + s i s ä e r i t y s j ä r j e s t e l m ä n + s i s ä e r i t y s j ä r j e s t e l m ä ä + s i s ä f i l e e + s i s ä i l m a + s i s ä i l m a a + s i s ä i l m a n + s i s ä i m p e r i a l i s t i s i s t a + s i s ä i s e e n + s i s ä i s e k s i + s i s ä i s e l l e + s i s ä i s e l l ä + s i s ä i s e n + s i s ä i s e s s ä + s i s ä i s e s t ä + s i s ä i s e t + s i s ä i s i i n + s i s ä i s i l l e + s i s ä i s i n + s i s ä i s i s s ä + s i s ä i s i s t ä + s i s ä i s i ä + s i s ä i s t e n + s i s ä k a u p p a + s i s ä k a u p u n k i a l u e i d e n + s i s ä k a u p u n k i a l u e i t a + s i s ä k o r k e u d e s t a + s i s ä k o r v a + s i s ä k o r v a i s t u t e + s i s ä k o r v i s s a + s i s ä l a c r o s s e + s i s ä l l i s s o d a k s i + s i s ä l l i s s o d a l l a + s i s ä l l i s s o d a n + s i s ä l l i s s o d a s s a + s i s ä l l i s s o d a s t a + s i s ä l l i s s o d a s t a a n + s i s ä l l i s s o d a t + s i s ä l l i s s o d i l t a + s i s ä l l i s s o d i s s a + s i s ä l l i s s o d i s t a + s i s ä l l i s s o t a + s i s ä l l i s s o t a a + s i s ä l l i s s o t a a n + s i s ä l l i s s o t a a n s a + s i s ä l l i s s o t a n a + s i s ä l l i s s o t a t i l a n t e i s s a + s i s ä l l i s s o t a v u o d e n + s i s ä l l i s s o t i a + s i s ä l l i s s o t i e n + s i s ä l l i s s o t i i n + s i s ä l l y s l u e t t e l o n a + s i s ä l l y s s o t a + s i s ä l l y t e t t i i n + s i s ä l l y t e t t ä i s i i n + s i s ä l l y t e t t ä v ä k s i + s i s ä l l y t e t ä ä n + s i s ä l l y t e t ä ä n k ö + s i s ä l l y t t i + s i s ä l l y t t ä e s s ä m m e + s i s ä l l y t t ä i s i m m e + s i s ä l l y t t ä m i s e e n + s i s ä l l y t t ä m i s e k s i + s i s ä l l y t t ä m i s e s t ä + s i s ä l l y t t ä m i s p r o s e s s i + s i s ä l l y t t ä m i s p r o s e s s i a + s i s ä l l y t t ä m i s p r o s e s s i l l e + s i s ä l l y t t ä m i s t o i m e t + s i s ä l l y t t ä m i s t ä + s i s ä l l y t t ä m ä l l ä + s i s ä l l y t t ä m ä t t ä + s i s ä l l y t t ä m ä ä n + s i s ä l l y t t ä n e e t + s i s ä l l y t t ä n y t + s i s ä l l y t t ä ä + s i s ä l l y t t ä ä k s e e n + s i s ä l l y t t ä ä k s e m m e + s i s ä l l ö i s t ä + s i s ä l l ö l l e + s i s ä l l ö l l i s i i n + s i s ä l l ö l l i s i s t ä + s i s ä l l ö l l i s i ä + s i s ä l l ö l l i s t ä + s i s ä l l ö l l ä + s i s ä l l ö l t ä ä n + s i s ä l l ö n + s i s ä l l ö n h a l l i n t a + s i s ä l l ö n h a l l i n t a j ä r j e s t e l m ä + s i s ä l l ö n k i n + s i s ä l l ö n l u o k i t u s e l i m i ä + s i s ä l l ö n l u o n t i i n + s i s ä l l ö n t a r j o a j a a + s i s ä l l ö n t a r j o a j i e n + s i s ä l l ö n t a r j o a j i l l e + s i s ä l l ö n t u o t a n n o n + s i s ä l l ö n t u o t t a j i a + s i s ä l l ö n t u o t t a j i e n + s i s ä l l ö n t u o t t a j i i n + s i s ä l l ö n v a l v o n t a a + s i s ä l l ö s s ä k i n + s i s ä l l ö s t ä + s i s ä l l ö t + s i s ä l l ö t t ö m i l t ä + s i s ä l l ö t t ö m i n + s i s ä l l ö t t ö m i ä + s i s ä l l ö t t ö m ä k s i + s i s ä l s i + s i s ä l s i v ä t + s i s ä l t y i + s i s ä l t y i s i v ä t + s i s ä l t y n e e t + s i s ä l t y n y t + s i s ä l t y v i e n + s i s ä l t y v i s t ä + s i s ä l t y v i ä + s i s ä l t y v ä + s i s ä l t y v ä l l e + s i s ä l t y v ä s s ä + s i s ä l t y v ä t + s i s ä l t y v ä ä + s i s ä l t y y + s i s ä l t y y k i n + s i s ä l t y y k ö + s i s ä l t y ä + s i s ä l t ä m i e n + s i s ä l t ä m i ä + s i s ä l t ä m ä + s i s ä l t ä m ä t + s i s ä l t ä m ä t t ö m ä n + s i s ä l t ä m ä ä + s i s ä l t ä n y t + s i s ä l t ä v i e n + s i s ä l t ä v i i n + s i s ä l t ä v i l l e + s i s ä l t ä v i s s ä + s i s ä l t ä v i s t ä + s i s ä l t ä v i ä + s i s ä l t ä v ä + s i s ä l t ä v ä l l ä + s i s ä l t ä v ä n + s i s ä l t ä v ä t + s i s ä l t ä v ä t k ö + s i s ä l t ä v ä ä + s i s ä l t ä v ä ä n + s i s ä l t ä ä + s i s ä l t ä ä k i n + s i s ä l t ä ä k ö + s i s ä l t ö a l a + s i s ä l t ö a l a n + s i s ä l t ö a s i o i s t a + s i s ä l t ö a s i o i t a + s i s ä l t ö h a k u j a + s i s ä l t ö j e n + s i s ä l t ö j ä + s i s ä l t ö k e h i t y s + s i s ä l t ö k e s k u s t e l u + s i s ä l t ö k y s y m y k s e e n + s i s ä l t ö k y s y m y k s e s s ä + s i s ä l t ö k y s y m y k s i i n + s i s ä l t ö k y s y m y k s i s s ä + s i s ä l t ö k y s y m y k s i s t ä + s i s ä l t ö k y s y m y s + s i s ä l t ö k y s y m y s t ä + s i s ä l t ö m a r k k i n o i n t i + s i s ä l t ö m u u t o k s i a + s i s ä l t ö n s ä + s i s ä l t ö n ä k ö k u l m a a + s i s ä l t ö o n g e l m i s t a + s i s ä l t ö p a i n o t t e i n e n + s i s ä l t ö p a l v e l u i t a + s i s ä l t ö p a l v e l u j e n + s i s ä l t ö p o h j a i n e n + s i s ä l t ö s e i k o i l l a + s i s ä l t ö s e k t o r i + s i s ä l t ö s t r a t e g i a + s i s ä l t ö t a r j o n n a s t a + s i s ä l t ö t a r k i s t u k s i a + s i s ä l t ö t e o l l i s u u d e l l e + s i s ä l t ö t e o l l i s u u d e n + s i s ä l t ö t e o l l i s u u s + s i s ä l t ö t e o l l i s u u t t a + s i s ä l t ö t i e t o i h i n + s i s ä l t ö t i e t o j a + s i s ä l t ö t u o t a n n o n + s i s ä l t ö t u o t a n t o a + s i s ä l t ö v a r a l u e t t e l o n s a + s i s ä l t ö v o i m a v a r a + s i s ä l t ö ä + s i s ä l t ö ö n + s i s ä m a a h a n + s i s ä m a a l i i k e n t e e s t ä + s i s ä m a a n k u l j e t u k s i a + s i s ä m a a n k u l j e t u k s i s t a + s i s ä m a a n k u l j e t u s t e n + s i s ä m a a n p o l i t i i k a s t a a n + s i s ä m a a s s a + s i s ä m a a v a l t i o + s i s ä m a a v a l t i o i s t a + s i s ä m a a v a l t i o n + s i s ä m a a v a l t i o s t a + s i s ä m a a v a l t i o t + s i s ä m a a y h t e y d e t + s i s ä m a a y h t e y k s i e n + s i s ä m a a y h t e y k s i i n + s i s ä m a r k k i n a + s i s ä m a r k k i n a d i r e k t i i v e i l l ä + s i s ä m a r k k i n a d i r e k t i i v e j ä + s i s ä m a r k k i n a d i r e k t i i v i + s i s ä m a r k k i n a d i r e k t i i v i e n + s i s ä m a r k k i n a d i r e k t i i v i k s i + s i s ä m a r k k i n a d i r e k t i i v i n ä + s i s ä m a r k k i n a d i r e k t i i v i s t ä + s i s ä m a r k k i n a d i r e k t i i v i t + s i s ä m a r k k i n a e h d o t + s i s ä m a r k k i n a e h d o t u k s i a + s i s ä m a r k k i n a e s t e i s t ä + s i s ä m a r k k i n a f o o r u m i + s i s ä m a r k k i n a f o o r u m i n + s i s ä m a r k k i n a f o o r u m i s s a + s i s ä m a r k k i n a f o o r u m i s t a + s i s ä m a r k k i n a h a n k k e e n + s i s ä m a r k k i n a h i s t o r i a a + s i s ä m a r k k i n a h y ö t y j ä + s i s ä m a r k k i n a j u o k s u n + s i s ä m a r k k i n a j ä r j e s t e l m ä ä + s i s ä m a r k k i n a k a t s a u k s e e n + s i s ä m a r k k i n a k a t s a u k s e n + s i s ä m a r k k i n a k a t s a u k s e s s a + s i s ä m a r k k i n a k e h i t y k s e n + s i s ä m a r k k i n a k e h y k s e n + s i s ä m a r k k i n a k o n s e p t i n + s i s ä m a r k k i n a k y s y m y k s i s s ä + s i s ä m a r k k i n a k y s y m y k s i s t ä + s i s ä m a r k k i n a k y s y m y k s i ä + s i s ä m a r k k i n a k y s y m y s + s i s ä m a r k k i n a k ä s i t e + s i s ä m a r k k i n a k ä y t ä n n ö i s t ä + s i s ä m a r k k i n a l a i n s ä ä d ä n n ö n + s i s ä m a r k k i n a l a i n s ä ä d ä n n ö s s ä + s i s ä m a r k k i n a l a i n s ä ä d ä n n ö s t ä + s i s ä m a r k k i n a l a i n s ä ä d ä n t ö + s i s ä m a r k k i n a l a i n s ä ä d ä n t ö ä + s i s ä m a r k k i n a l a i n s ä ä d ä n t ö ä m m e + s i s ä m a r k k i n a l a i n s ä ä d ä n t ö ö n + s i s ä m a r k k i n a l a i t + s i s ä m a r k k i n a l a k e j a + s i s ä m a r k k i n a l a k i + s i s ä m a r k k i n a l a u s e k k e e l l e + s i s ä m a r k k i n a l a u s e k k e e s t a + s i s ä m a r k k i n a l ä h t ö i s t ä + s i s ä m a r k k i n a m a l l i + s i s ä m a r k k i n a m e k a n i s m i + s i s ä m a r k k i n a m e k a n i s m i t + s i s ä m a r k k i n a m m e + s i s ä m a r k k i n a m ä ä r ä y k s e t + s i s ä m a r k k i n a m ä ä r ä y k s i i n + s i s ä m a r k k i n a m ä ä r ä y k s i s t ä + s i s ä m a r k k i n a m ä ä r ä y s t ä + s i s ä m a r k k i n a n e u v o s t o + s i s ä m a r k k i n a n e u v o s t o l l e + s i s ä m a r k k i n a n e u v o s t o n + s i s ä m a r k k i n a n e u v o s t o s s a + s i s ä m a r k k i n a n s a + s i s ä m a r k k i n a n ä k ö k o h d a t + s i s ä m a r k k i n a n ä k ö k u l m a n + s i s ä m a r k k i n a o h j e l m a + s i s ä m a r k k i n a o h j e l m a a + s i s ä m a r k k i n a o h j e l m a l l a + s i s ä m a r k k i n a o h j e l m a n + s i s ä m a r k k i n a o i k e u k s i e n + s i s ä m a r k k i n a o i k e u s + s i s ä m a r k k i n a o i k e u s p e r u s t a n + s i s ä m a r k k i n a o l o i h i n + s i s ä m a r k k i n a o n g e l m i e n + s i s ä m a r k k i n a o r g a n i s a a t i o t a + s i s ä m a r k k i n a p a k e t i n + s i s ä m a r k k i n a p a k e t i s s a + s i s ä m a r k k i n a p a k e t i s t a + s i s ä m a r k k i n a p a k e t t i + s i s ä m a r k k i n a p a l v e l u i s t a + s i s ä m a r k k i n a p a l v e l u j a + s i s ä m a r k k i n a p e r i a a t e t t a + s i s ä m a r k k i n a p e r i a a t t e e l l e m m e + s i s ä m a r k k i n a p e r i a a t t e i d e n + s i s ä m a r k k i n a p e r i a a t t e i s i i n + s i s ä m a r k k i n a p e r i a a t t e i s i i n k i n + s i s ä m a r k k i n a p e r u s t a + s i s ä m a r k k i n a p o l i i t t i s e t + s i s ä m a r k k i n a p o l i t i i k a l l e + s i s ä m a r k k i n a p o l i t i i k a n + s i s ä m a r k k i n a p o l i t i i k a s s a + s i s ä m a r k k i n a p o l i t i i k k a + s i s ä m a r k k i n a p o l i t i i k k a a + s i s ä m a r k k i n a p o l i t i i k k a a m m e + s i s ä m a r k k i n a p o l i t i i k k a m m e + s i s ä m a r k k i n a p o l i t i i k k o i h i n + s i s ä m a r k k i n a p o l i t i i k k o j e n + s i s ä m a r k k i n a p o l i t i i k o i l l a + s i s ä m a r k k i n a p u i t t e i d e n + s i s ä m a r k k i n a p y r k i m y s t e n + s i s ä m a r k k i n a r a j o j e n + s i s ä m a r k k i n a r a k e n t e e s t a + s i s ä m a r k k i n a r a t k a i s u u n + s i s ä m a r k k i n a r i k k o m u k s e l l e + s i s ä m a r k k i n a s t r a t e g i a + s i s ä m a r k k i n a s t r a t e g i a a + s i s ä m a r k k i n a s t r a t e g i a l l a + s i s ä m a r k k i n a s t r a t e g i a n + s i s ä m a r k k i n a s t r a t e g i a n k i n + s i s ä m a r k k i n a s t r a t e g i a s s a + s i s ä m a r k k i n a s t r a t e g i a s t a + s i s ä m a r k k i n a s t r a t e g i a t + s i s ä m a r k k i n a s ä ä d ö k s e t + s i s ä m a r k k i n a s ä ä d ö k s i s s ä + s i s ä m a r k k i n a s ä ä d ö s t ä + s i s ä m a r k k i n a s ä ä n n ö i l l e + s i s ä m a r k k i n a s ä ä n n ö i s t ä + s i s ä m a r k k i n a s ä ä n n ö k s i l l ä + s i s ä m a r k k i n a s ä ä n n ö k s i l t ä + s i s ä m a r k k i n a s ä ä n n ö k s i s s ä + s i s ä m a r k k i n a s ä ä n n ö s t e n + s i s ä m a r k k i n a s ä ä n n ö s t ö + s i s ä m a r k k i n a s ä ä n n ö t + s i s ä m a r k k i n a s ä ä n t e l y + s i s ä m a r k k i n a s ä ä n t e l y n + s i s ä m a r k k i n a s ä ä n t ö i h i n + s i s ä m a r k k i n a s ä ä n t ö j e n + s i s ä m a r k k i n a s ä ä n t ö j ä + s i s ä m a r k k i n a t + s i s ä m a r k k i n a t a l o u d e n + s i s ä m a r k k i n a t a l o u s + s i s ä m a r k k i n a t a v o i t e + s i s ä m a r k k i n a t e s t i + s i s ä m a r k k i n a t e s t i i n + s i s ä m a r k k i n a t e s t i n + s i s ä m a r k k i n a t e s t i s t ä + s i s ä m a r k k i n a t e s t i ä + s i s ä m a r k k i n a t k a a n + s i s ä m a r k k i n a t o i m e n p i d e + s i s ä m a r k k i n a t o i m e n p i d e t t ä + s i s ä m a r k k i n a t o i m e n p i t e e s t ä + s i s ä m a r k k i n a t o i m e n p i t e i d e n + s i s ä m a r k k i n a t o i m i e n + s i s ä m a r k k i n a t o i m i s t a + s i s ä m a r k k i n a t o i m i s t o j a + s i s ä m a r k k i n a t u o t e + s i s ä m a r k k i n a u l o t t u v u u s + s i s ä m a r k k i n a u l o t t u v u u t t a + s i s ä m a r k k i n a u u d i s t u s t a + s i s ä m a r k k i n a v a l i o k u n n a n + s i s ä m a r k k i n a v a l i o k u n n a s s a + s i s ä m a r k k i n a v a l i o k u n t a + s i s ä m a r k k i n a v a l i o k u n t a a + s i s ä m a r k k i n a v a l i o k u n t a a n + s i s ä m a r k k i n a v a p a u d e s t a + s i s ä m a r k k i n a v a r o j a + s i s ä m a r k k i n a v e l v o i t t e i d e n + s i s ä m a r k k i n a v e l v o l l i s u u k s i a + s i s ä m a r k k i n a v ä l i n e i d e n + s i s ä m a r k k i n a y s t ä v ä l l i s y y d e n + s i s ä m a r k k i n o i d e m m e + s i s ä m a r k k i n o i d e n + s i s ä m a r k k i n o i d e n s a + s i s ä m a r k k i n o i h i m m e + s i s ä m a r k k i n o i h i n + s i s ä m a r k k i n o i k s i + s i s ä m a r k k i n o i l l a + s i s ä m a r k k i n o i l l a k i n + s i s ä m a r k k i n o i l l a m m e + s i s ä m a r k k i n o i l l e + s i s ä m a r k k i n o i l l e e n + s i s ä m a r k k i n o i l l e k i n + s i s ä m a r k k i n o i l l e m m e + s i s ä m a r k k i n o i l t a + s i s ä m a r k k i n o i l t a m m e + s i s ä m a r k k i n o i n a + s i s ä m a r k k i n o i n e e n + s i s ä m a r k k i n o i s s a + s i s ä m a r k k i n o i s t a + s i s ä m a r k k i n o i s t a m m e + s i s ä m a r k k i n o i t a + s i s ä m a r k k i n o i t a a n + s i s ä m a r k k i n o i t a m m e + s i s ä m a r k k i n o i t t e m m e + s i s ä m e r e k s i + s i s ä m e r e l l ä + s i s ä m e r e m m e + s i s ä m e r e n + s i s ä m e r i + s i s ä m e r i l u o n n e + s i s ä m e r i s t ä + s i s ä m e r i s t ä m m e + s i s ä m e r t a + s i s ä m i n i s t e r e i d e n + s i s ä m i n i s t e r e i l l e + s i s ä m i n i s t e r e i l l ä + s i s ä m i n i s t e r e i l t ä k i n + s i s ä m i n i s t e r i + s i s ä m i n i s t e r i e n + s i s ä m i n i s t e r i i n + s i s ä m i n i s t e r i l l e e n + s i s ä m i n i s t e r i m m e + s i s ä m i n i s t e r i n + s i s ä m i n i s t e r i n e u v o s t o + s i s ä m i n i s t e r i n e u v o s t o s s a + s i s ä m i n i s t e r i n s ä + s i s ä m i n i s t e r i n ä + s i s ä m i n i s t e r i s t ä + s i s ä m i n i s t e r i t + s i s ä m i n i s t e r i t k i n + s i s ä m i n i s t e r i ä + s i s ä m i n i s t e r i ö + s i s ä m i n i s t e r i ö i d e n + s i s ä m i n i s t e r i ö l l e + s i s ä m i n i s t e r i ö l l ä + s i s ä m i n i s t e r i ö n + s i s ä m i n i s t e r i ö n n e + s i s ä m i n i s t e r i ö t + s i s ä m i n i s t e r i ö t ä + s i s ä m i n i s t e r i ö ö n + s i s ä o p p i l a i t o k s i i n + s i s ä o p p i l a i t o k s i s s a + s i s ä o p p i l a i t o s + s i s ä o s i s s a + s i s ä o v i l l e + s i s ä p a l e s t i i n a l a i n e n + s i s ä p i i r i + s i s ä p i i r i e t u j a + s i s ä p i i r i i n + s i s ä p i i r i k a p i t a l i s m i + s i s ä p i i r i k a u p a n + s i s ä p i i r i k a u p o i s t a + s i s ä p i i r i k a u p p a + s i s ä p i i r i k a u p p a a + s i s ä p i i r i k a u p p a s ä ä n n ö k s i ä + s i s ä p i i r i k a u p p o i h i n + s i s ä p i i r i k a u p p o j a + s i s ä p i i r i k a u p p o j e n + s i s ä p i i r i o n g e l m i a + s i s ä p i i r i r i k o k s e s t a + s i s ä p i i r i s s ä + s i s ä p i i r i s t ä + s i s ä p i i r i t i e d o n + s i s ä p i i r i t i e t o a + s i s ä p i i r i t i e t o j e n + s i s ä p i i r i v i t s i + s i s ä p i i r i ä + s i s ä p l a n e e t t a + s i s ä p o l i i t i k k o n a + s i s ä p o l i i t t i n e n + s i s ä p o l i i t t i n e n k i n + s i s ä p o l i i t t i s e e n + s i s ä p o l i i t t i s e n + s i s ä p o l i i t t i s e n a + s i s ä p o l i i t t i s e s s a + s i s ä p o l i i t t i s e s t a + s i s ä p o l i i t t i s e s t i + s i s ä p o l i i t t i s e t + s i s ä p o l i i t t i s i a + s i s ä p o l i i t t i s i i n + s i s ä p o l i i t t i s i l l a + s i s ä p o l i i t t i s i l l e + s i s ä p o l i i t t i s i n + s i s ä p o l i i t t i s i s s a + s i s ä p o l i i t t i s i s t a + s i s ä p o l i i t t i s t a + s i s ä p o l i i t t i s t e n + s i s ä p o l i t i i k a k s i + s i s ä p o l i t i i k a l l a + s i s ä p o l i t i i k a l l a m m e + s i s ä p o l i t i i k a l l e + s i s ä p o l i t i i k a n + s i s ä p o l i t i i k a s s a + s i s ä p o l i t i i k a s s a a n + s i s ä p o l i t i i k a s t a + s i s ä p o l i t i i k a t + s i s ä p o l i t i i k k a + s i s ä p o l i t i i k k a a + s i s ä p o l i t i i k k a a m m e + s i s ä p o l i t i i k k a a n + s i s ä p o l i t i i k k a a n s a + s i s ä p o l i t i i k k a m m e + s i s ä p o l i t i i k k a n a + s i s ä p o l i t i i k k o i h i n + s i s ä p o l i t i i k k o j a + s i s ä p o l i t i i k k o j e n + s i s ä p o l i t i i k o i s t a + s i s ä p y ö r ä i l y + s i s ä r a j a + s i s ä r a j a m m e + s i s ä r a j a o n g e l m a t + s i s ä r a j a t + s i s ä r a j a t a r k a s t u k s e t + s i s ä r a j a t a r k a s t u k s i a + s i s ä r a j a t a r k a s t u k s i s t a + s i s ä r a j a t a r k a s t u s t e n + s i s ä r a j a t o n + s i s ä r a j a t o n t a + s i s ä r a j a t t o m a a n + s i s ä r a j a t t o m a s s a + s i s ä r a j a t t o m a s t a + s i s ä r a j a t t o m a t + s i s ä r a j a v a l v o n n a n + s i s ä r a j a y h t e i s t y ö n + s i s ä r a j a y l i t y s t e n + s i s ä r a j o i h i n + s i s ä r a j o i l l a + s i s ä r a j o i l l a a n + s i s ä r a j o i l l a m m e + s i s ä r a j o i l l e + s i s ä r a j o i l t a + s i s ä r a j o i l t a a n + s i s ä r a j o i s t a + s i s ä r a j o j a + s i s ä r a j o j a a n + s i s ä r a j o j e m m e + s i s ä r a j o j e n + s i s ä r a k e n t e i s s a + s i s ä r e n g a s + s i s ä r i n t a m a l l a + s i s ä s a t a m a n + s i s ä s a t a m i a + s i s ä s a t a m i e n + s i s ä s a t a m i s s a + s i s ä t a u d i t + s i s ä t a u t i k l i n i k o i s s a + s i s ä t i l o i l l e + s i s ä t i l o i s s a + s i s ä t u l l e j a + s i s ä t u l o a v a r u u s + s i s ä u r h e i l u t i l o j a + s i s ä v a l a i s t u s + s i s ä v e d e t + s i s ä v e s i + s i s ä v e s i a l u e i d e n + s i s ä v e s i a l u e i l l e + s i s ä v e s i a l u e i t a + s i s ä v e s i a l u k s e n + s i s ä v e s i a l u k s e t + s i s ä v e s i a l u k s i a + s i s ä v e s i a l u k s i i n + s i s ä v e s i a l u k s i l l e + s i s ä v e s i a l u k s i s s a + s i s ä v e s i a l u s l i i k e n t e e l l e + s i s ä v e s i a l u s t e n + s i s ä v e s i a l u s t o d i s t u s t e n + s i s ä v e s i e n + s i s ä v e s i i n + s i s ä v e s i k a l a k a n t o j a + s i s ä v e s i k a l a s t u s + s i s ä v e s i k a l a s t u s t a + s i s ä v e s i k u l j e t u k s e t + s i s ä v e s i k u l j e t u k s i a + s i s ä v e s i k u l j e t u k s i i n + s i s ä v e s i k u l j e t u k s i s t a + s i s ä v e s i k u l j e t u s m a h d o l l i s u u k s i a + s i s ä v e s i l a i v a s t o + s i s ä v e s i l i i k e n n e + s i s ä v e s i l i i k e n n e a l a + s i s ä v e s i l i i k e n n e a l a l l a + s i s ä v e s i l i i k e n n e a l a n + s i s ä v e s i l i i k e n n e h a n k k e i s i i n + s i s ä v e s i l i i k e n n e j ä r j e s t e l m ä s t ä + s i s ä v e s i l i i k e n n e t t ä + s i s ä v e s i l i i k e n t e e l l e + s i s ä v e s i l i i k e n t e e l l ä + s i s ä v e s i l i i k e n t e e n + s i s ä v e s i l i i k e n t e e n k i n + s i s ä v e s i l i i k e n t e e s e e n + s i s ä v e s i l i i k e n t e e s s ä + s i s ä v e s i l i i k e n t e e s t ä + s i s ä v e s i l l e + s i s ä v e s i l l ä + s i s ä v e s i p o l i t i i k a n + s i s ä v e s i r e i t e i l l e + s i s ä v e s i r e i t e i l l ä + s i s ä v e s i r e i t i l l ä + s i s ä v e s i r e i t t e i h i n + s i s ä v e s i r e i t t e j ä + s i s ä v e s i r e i t t i e n + s i s ä v e s i s a t a m a t + s i s ä v e s i s a t a m i a + s i s ä v e s i s a t a m i e n + s i s ä v e s i s a t a m i l l a + s i s ä v e s i s a t a m i l l e + s i s ä v e s i s a t a m i s s a + s i s ä v e s i s t ä + s i s ä v e s i s t ö i s t ä + s i s ä v e s i s t ö j e n + s i s ä v e s i t e i l l ä + s i s ä v e s i t i e y h t e y d e t + s i s ä v e s i v e r k o s t o + s i s ä v e s i v ä y l i e n + s i s ä v e s i v ä y l i i n + s i s ä v e s i v ä y l i l l e + s i s ä v e s i v ä y l i l l ä + s i s ä v e s i v ä y l i s t ä + s i s ä v e s i v ä y l i ä + s i s ä v e s i v ä y l ä h a n k k e i d e n + s i s ä v e s i v ä y l ä j ä r j e s t e l m i e n + s i s ä v e s i v ä y l ä j ä r j e s t e l m ä + s i s ä v e s i v ä y l ä n ä + s i s ä v e s i v ä y l ä t + s i s ä v e s i v ä y l ä v e r k o s t o a + s i s ä v e s i y h t e y d e t + s i s ä v e s i ä + s i s ä ä n a j o p r o s e s s i n a + s i s ä ä n a j o v a i h e e n + s i s ä ä n k ä y n n i n + s i s ä ä n k ä y n t i a l u e + s i s ä ä n m e n o k o h t a + s i s ä ä n o t t o p o l i t i i k a l l e + s i s ä ä n o t t o p o l i t i i k k a a + s i s ä ä n p ä ä s y e h t o j a + s i s ä ä n p ä ä s y l i p p u j e n + s i s ä ä n p ä ä s y m e n e t t e l y j e n + s i s ä ä n p ä ä s y m e n e t t e l y s t ä + s i s ä ä n p ä ä s y s ä ä n n ö t + s i s ä ä n r a k e n n e t t u a + s i s ä ä n r a k e n n e t u k s i + s i s ä ä n r a k e n n e t u s s a + s i s ä ä n r a k e n n e t u s t a + s i s ä ä n t u l o a u l a n + s i s ä ä n t u l o v ä y l i l t ä + s i s ä ä n t u l o v ä y l ä + s i s ä ä n t u l o v ä y l ä ä + s i t a a t t i o i k e u s + s i t e e r a a m a s s a n i + s i t e e r a a m a t t a + s i t e e r a a n + s i t e e r a t a + s i t e e r a t a k s e n i + s i t e e r a u k s e s t a + s i t e e t + s i t e i s t ä + s i t e i t ä + s i t k e i m m i s t ä + s i t k e y t t ä + s i t k e ä m p i + s i t k e ä ä + s i t o a + s i t o m a l l a + s i t o m a n a + s i t o m a t t a + s i t o m a t t o m a t + s i t o m a t t o m i s s a + s i t o m a t t o m u u d e s t a + s i t o m a t t o m u u t e e n + s i t o m i s a s t e + s i t o m i s e l l a + s i t o m i s k e t j u s s a + s i t o m i s t a + s i t o m i s t e h t ä v ä n s ä + s i t o o + s i t o u d u m m e + s i t o u d u n + s i t o u d u t a + s i t o u d u t a a n + s i t o u d u t t a v a + s i t o u d u t t i i n + s i t o u d u t t u + s i t o u m u k s e e n + s i t o u m u k s e l l a m m e + s i t o u m u k s e m m e + s i t o u m u k s e n + s i t o u m u k s e n a + s i t o u m u k s e n i + s i t o u m u k s e n s a + s i t o u m u k s e s t a + s i t o u m u k s e s t a a n + s i t o u m u k s e s t a m m e + s i t o u m u k s e t + s i t o u m u k s i a + s i t o u m u k s i a a n + s i t o u m u k s i a m m e + s i t o u m u k s i e n + s i t o u m u k s i i n + s i t o u m u k s i s t a + s i t o u m u k s i s t a a n + s i t o u m u k s i s t a m m e + s i t o u m u k s i s t a n n e + s i t o u m u s j ä r j e s t e l m ä n + s i t o u m u s k a u d e l l a + s i t o u m u s k a u d e n + s i t o u m u s k a u s i + s i t o u m u s k a u t e e n + s i t o u m u s k a u t e m m e + s i t o u m u s k a u t t a + s i t o u m u s l u p a u k s i a + s i t o u m u s m ä ä r ä r a h o j e n + s i t o u m u s t a + s i t o u m u s t a a n + s i t o u m u s t a m m e + s i t o u m u s t e m m e + s i t o u m u s t e n + s i t o u m u s t e n s a + s i t o u t t a a + s i t o u t t a m i s p o l i t i i k a n + s i t o u t t a m i s p o l i t i i k k a a + s i t o u t t a m i s p o l i t i i k k a a n + s i t o u t t a m i s p o l i t i i k k a a n s a + s i t o u t u a + s i t o u t u i + s i t o u t u i s i m m e + s i t o u t u i v a t + s i t o u t u m a a n + s i t o u t u m a t o n t a + s i t o u t u m a t t a + s i t o u t u m a t t o m a l l e + s i t o u t u m a t t o m a n + s i t o u t u m a t t o m a n a + s i t o u t u m a t t o m a t + s i t o u t u m a t t o m i a + s i t o u t u m a t t o m i e n + s i t o u t u m a t t o m i i n + s i t o u t u m a t t o m i l l a + s i t o u t u m a t t o m i l l e + s i t o u t u m a t t o m i l t a + s i t o u t u m a t t o m i n a + s i t o u t u m a t t o m i s t a + s i t o u t u m i s a s t e + s i t o u t u m i s e e n + s i t o u t u m i s e e n n e + s i t o u t u m i s e l l a m m e + s i t o u t u m i s e l l e n n e + s i t o u t u m i s e m m e + s i t o u t u m i s e n + s i t o u t u m i s e n a + s i t o u t u m i s e n n e + s i t o u t u m i s e n s a + s i t o u t u m i s e s s a a n + s i t o u t u m i s e s t a + s i t o u t u m i s e s t a m m e + s i t o u t u m i s e s t a n n e + s i t o u t u m i s j a k s o o n + s i t o u t u m i s l i n j a a + s i t o u t u m i s p o l i t i i k a n + s i t o u t u m i s p r o s e s s i + s i t o u t u m i s t a + s i t o u t u m i s t a a n + s i t o u t u m i s t a m m e + s i t o u t u m i s v a l m i u d e s t a + s i t o u t u n e e l t a + s i t o u t u n e e m m a n + s i t o u t u n e e m m e + s i t o u t u n e e m m i n + s i t o u t u n e e m p a a + s i t o u t u n e e m p i + s i t o u t u n e e m p i a + s i t o u t u n e e n a + s i t o u t u n e e n s a + s i t o u t u n e e t + s i t o u t u n e i d e n + s i t o u t u n e i n + s i t o u t u n e i n a + s i t o u t u n e i s u u d e s t a + s i t o u t u n e i s u u t t a + s i t o u t u n e i t a + s i t o u t u u + s i t o u t u v a m m e + s i t o u t u v a n + s i t o u t u v a t + s i t o v a a + s i t o v a a n + s i t o v a k s i + s i t o v a m m a k s i + s i t o v a m m a n + s i t o v a m m i l l a + s i t o v a m p a a + s i t o v a m p a a n + s i t o v a m p a n a + s i t o v a m p i + s i t o v a m p i a + s i t o v a m p i i n + s i t o v a n + s i t o v a n a + s i t o v a s s a + s i t o v a s t a + s i t o v a t + s i t o v i a + s i t o v i e n + s i t o v i i n + s i t o v i k s i + s i t o v i m m a s t a + s i t o v i m m a t + s i t o v i m m i s s a + s i t o v i n + s i t o v i n e + s i t o v i s t a + s i t o v u u d e l l e + s i t o v u u d e n + s i t o v u u d e s t a + s i t o v u u s v a i k u t u k s e n + s i t o v u u t t a + s i t r u s h e d e l m i e n + s i t r u s h e d e l m i l l e + s i t r u s h e d e l m i s t ä + s i t r u s h e d e l m i ä + s i t r u s h e d e l m ä a l a l l e + s i t r u s h e d e l m ä k ä r p ä n e n + s i t r u s h e d e l m ä m a s s a a + s i t r u s h e d e l m ä m a s s a n + s i t r u s h e d e l m ä m a s s a s k a n d a a l i n + s i t r u s h e d e l m ä t + s i t r u s h e d e l m ä v i e n n i n + s i t r u s p u u t a r h a t + s i t r u u n a h a p p o + s i t r u u n a h a p p o a + s i t r u u n a h a p p o k i e r t o + s i t r u u n a h e m p p o + s i t r u u n a h u p p u t u r p i a a l i + s i t r u u n a k a r d i n a a l i + s i t r u u n a k e r t t u l i + s i t r u u n a l u r i + s i t r u u n a m e h u a + s i t r u u n a p e r h o n e n + s i t r u u n a p i p p u r i + s i t r u u n a s a v i k k a + s i t r u u n a t e t r a + s i t r u u n a t o k k o + s i t r u u n a t r o g o n i + s i t r u u n a t ö p ö k e r t t u n e n + s i t r u u n a v i i p a l e + s i t r u u n a v i n o k a s + s i t r u u n a v ä r i m i n t t u + s i t r u u n a v ä s t ä r ä k k i + s i t ä k i n + s i t ä k ä ä n + s i u n a a v a t + s i u n a u s f o r m u l a + s i u n a u s t a + s i v e e l l i s y y s k o m i t e a + s i v e e l l i s y y s r i k o k s i s t a + s i v e e t t ö m y y t t ä + s i v e l t i m e n v e d o t + s i v e y d e n p u u + s i v e y s v y ö + s i v i i l e i h i n + s i v i i l e i l l e + s i v i i l e j ä + s i v i i l i a l a a + s i v i i l i a l a n + s i v i i l i a l o i t t e e t + s i v i i l i a l o i t t e i t a + s i v i i l i a l u e i d e n + s i v i i l i a l u e i l l a + s i v i i l i a l u e i l l e + s i v i i l i a l u e i l t a + s i v i i l i a l u k s i a + s i v i i l i a l u s + s i v i i l i a l u s t e n + s i v i i l i a m m a t t i l a i s i a + s i v i i l i a p u + s i v i i l i a p u a + s i v i i l i a r m e i j a a + s i v i i l i a r m e i j a n + s i v i i l i a s e i s t u k s e s t a + s i v i i l i a s e i s t u s t a + s i v i i l i a s i a t + s i v i i l i a s i o i d e n + s i v i i l i a s i o i s s a + s i v i i l i a s i o i s t a + s i v i i l i a s i o i t a + s i v i i l i a s u t u k s e n + s i v i i l i a v u s t u s o p e r a a t i o i t a + s i v i i l i a v u s t u s t y ö n t e k i j ä t + s i v i i l i e d u s t a j a n a + s i v i i l i e d u s t a j i a + s i v i i l i e l ä m ä + s i v i i l i e l ä m ä m m e + s i v i i l i e l ä m ä n + s i v i i l i e l ä m ä ä + s i v i i l i e l ä m ä ä n + s i v i i l i e n + s i v i i l i h a a r a s t a + s i v i i l i h a l l i n n o l l a + s i v i i l i h a l l i n n o l l e + s i v i i l i h a l l i n n o n + s i v i i l i h a l l i n n o s s a + s i v i i l i h a l l i n t a a + s i v i i l i h a l l i n t o + s i v i i l i h a l l i n t o a + s i v i i l i h a l l i n t o k a u t t a + s i v i i l i h a l l i n t o o n + s i v i i l i h a l l i t u k s e l l e + s i v i i l i h a l l i t u k s e l t a + s i v i i l i h a l l i t u k s e n + s i v i i l i h a l l i t u k s e s t a + s i v i i l i h a l l i t u s + s i v i i l i h a l l i t u s t a + s i v i i l i h a n k e + s i v i i l i h a n k k e e n a + s i v i i l i h a n k k e i s i i n + s i v i i l i h a n k k e i t a + s i v i i l i h e n k i l ö i d e n + s i v i i l i h e n k i l ö i t ä + s i v i i l i h e n k i l ö k u n t a a n s a + s i v i i l i h e n k i l ö s t ö l l ä + s i v i i l i h e n k i l ö s t ö n + s i v i i l i h e n k i l ö s t ö ä + s i v i i l i h e n k i l ö t + s i v i i l i j o u k k o j a + s i v i i l i j o u k k o j e n + s i v i i l i j o u k o t + s i v i i l i j ä r j e s t e l m i l l ä ä n + s i v i i l i j ä r j e s t e l m ä + s i v i i l i j ä r j e s t e l m ä n + s i v i i l i j ä r j e s t y k s e n + s i v i i l i j ä r j e s t y s t ä + s i v i i l i j ä r j e s t ö + s i v i i l i j ä r j e s t ö i s t ä + s i v i i l i k a a r t i + s i v i i l i k a n n e + s i v i i l i k a n n e t t a + s i v i i l i k a n t e e n + s i v i i l i k a n t e i s i i n + s i v i i l i k e i n o j a + s i v i i l i k e i n o j e n + s i v i i l i k e i n o t + s i v i i l i k e s k u k s i i n + s i v i i l i k o d i f i k a a t i o t a + s i v i i l i k o h t e e t + s i v i i l i k o h t e i s i i n + s i v i i l i k o h t e i t a + s i v i i l i k o m p o n e n t t i e n + s i v i i l i k o n e + s i v i i l i k o n f l i k t i a + s i v i i l i k o n f l i k t i e n + s i v i i l i k o n f l i k t i n e s t o a + s i v i i l i k r i i s i e n + s i v i i l i k r i i s i n h a l l i n n a n + s i v i i l i k r i i s i n h a l l i n n a s s a + s i v i i l i k r i i s i n h a l l i n n a s t a + s i v i i l i k r i i s i n h a l l i n t a + s i v i i l i k r i i s i n h a l l i n t a a + s i v i i l i k r i i s i n h a l l i n t a a n + s i v i i l i k r i i s i n h a l l i n t a j o u k o t + s i v i i l i k r i i s i n h a l l i n t a j ä r j e s t e l m ä + s i v i i l i k r i i s i n h a l l i n t a k o m i t e a + s i v i i l i k r i i s i n h a l l i n t a k o m i t e a n + s i v i i l i k r i i s i n h a l l i n t a k y k y ä + s i v i i l i k r i i s i n h a l l i n t a o p e r a a t i o + s i v i i l i k r i i s i n h a l l i n t a o p e r a a t i o i d e n + s i v i i l i k r i i s i n h a l l i n t a o p e r a a t i o i h i n + s i v i i l i k r i i s i n h a l l i n t a o p e r a a t i o o n + s i v i i l i k r i i s i n h a l l i n t a r y h m i l l e + s i v i i l i k r i i s i n h a l l i n t a t e h t ä v ä n + s i v i i l i k r i i s i n h a l l i n t a t o i m e t + s i v i i l i k r i i s i n h a l l i n t a v a l m i u k s i e n + s i v i i l i k r i i s i n h a l l i n t a v ä l i n e i d e n + s i v i i l i k r i i s i t i l a n t e i d e n + s i v i i l i k u o l e m i a + s i v i i l i k ä y t t ä j ä n + s i v i i l i k ä y t t ä j ä t + s i v i i l i k ä y t t ö + s i v i i l i k ä y t t ö ä + s i v i i l i k ä y t t ö ö n + s i v i i l i k ä y t ö n + s i v i i l i k ä y t ö s s ä + s i v i i l i k ä y t ö s t ä + s i v i i l i l a i n + s i v i i l i l a i n s ä ä d ä n n ö n + s i v i i l i l a i n s ä ä d ä n t ö + s i v i i l i l a i n s ä ä d ä n t ö i h i n + s i v i i l i l a i n s ä ä d ä n t ö ä + s i v i i l i l a i n s ä ä d ä n t ö ö n + s i v i i l i l a i t + s i v i i l i l a k i + s i v i i l i l e n t o a s e m i e n + s i v i i l i l e n t o k o n e + s i v i i l i l e n t o k o n e e n + s i v i i l i l e n t o k o n e i d e n + s i v i i l i l e n t o k o n e i l l e + s i v i i l i l e n t o k o n e i t a + s i v i i l i l e n t o k o n e t t a + s i v i i l i l e n t o l i i k e n n e + s i v i i l i l e n t o l i i k e n n e t t ä + s i v i i l i l e n t o l i i k e n t e e n + s i v i i l i l e n t o m a t k u s t a j i e n + s i v i i l i l e n t o y h t i ö i d e n + s i v i i l i l e n t ä j i ä + s i v i i l i l i i k e n t e e n + s i v i i l i l u o n n e t t a + s i v i i l i l u o n t e e n + s i v i i l i l ä s n ä o l o a + s i v i i l i l ä s n ä o l o o n + s i v i i l i m a h t i + s i v i i l i m a h t i n a + s i v i i l i m a r k k i n o i t a + s i v i i l i m e n o j a + s i v i i l i m e r e n k u l u l l e + s i v i i l i m i e l e n o s o i t t a j i a + s i v i i l i m i e l e s s ä + s i v i i l i m i n i s t e r i t + s i v i i l i n ä k ö k o h d a t + s i v i i l i n ä k ö k o h t i a + s i v i i l i n ä k ö k o h t i e n + s i v i i l i n ä k ö k o h t i i n + s i v i i l i o h j e l m a + s i v i i l i o h j e l m a n + s i v i i l i o h j e l m i k s i + s i v i i l i o i k e u d e l l e + s i v i i l i o i k e u d e l l i n e n + s i v i i l i o i k e u d e l l i s e e n + s i v i i l i o i k e u d e l l i s e l l a + s i v i i l i o i k e u d e l l i s e n + s i v i i l i o i k e u d e l l i s e s t i + s i v i i l i o i k e u d e l l i s e t + s i v i i l i o i k e u d e l l i s i a + s i v i i l i o i k e u d e l l i s i i n + s i v i i l i o i k e u d e l l i s i s t a + s i v i i l i o i k e u d e l l i s t a + s i v i i l i o i k e u d e l l i s t e n + s i v i i l i o i k e u d e n + s i v i i l i o i k e u d e n k ä y n n i s t ä + s i v i i l i o i k e u d e n k ä y n t i + s i v i i l i o i k e u d e s s a + s i v i i l i o i k e u d e s t a + s i v i i l i o i k e u d e t + s i v i i l i o i k e u k s i e n + s i v i i l i o i k e u k s i s t a + s i v i i l i o i k e u k s i s t a m m e + s i v i i l i o i k e u s + s i v i i l i o i k e u s a s i o i s s a + s i v i i l i o i k e u s i s t u i n t e n + s i v i i l i o i k e u s j u t t u i h i n + s i v i i l i o i k e u s j u t u s s a + s i v i i l i o i k e u s j ä r j e s t e l m ä + s i v i i l i o i k e u s j ä r j e s t e l m ä n + s i v i i l i o i k e u s v i r a n o m a i s i i n + s i v i i l i o i k e u t e e n + s i v i i l i o i k e u t t a + s i v i i l i o p e r a a t i o + s i v i i l i o p e r a a t i o i d e n + s i v i i l i o p e r a a t i o i h i n + s i v i i l i o p e r a a t i o i l l e + s i v i i l i o p e r a a t i o i s s a + s i v i i l i o p e r a a t i o i s t a + s i v i i l i o p e r a a t i o i t a + s i v i i l i o p e r a a t i o l l a + s i v i i l i o p e r a a t i o o n + s i v i i l i o p e r a a t i o s t a + s i v i i l i o p e r a a t i o t a + s i v i i l i o r g a n i s a a t i o + s i v i i l i o r g a n i s a a t i o n a + s i v i i l i o s a p u o l e n + s i v i i l i o s a t e k i j ö i h i n + s i v i i l i o s a t e k i j ö i t ä + s i v i i l i o s u u d e k s i + s i v i i l i p a i n o t t e i s u u d e s t a a n + s i v i i l i p a k o l a i s i a + s i v i i l i p a l v e l u a + s i v i i l i p a l v e l u j a + s i v i i l i p a l v e l u j e n + s i v i i l i p a l v e l u j ä r j e s t e l m i e n + s i v i i l i p a l v e l u j ä r j e s t e l m i i n + s i v i i l i p a l v e l u j ä r j e s t e l m ä t + s i v i i l i p a l v e l u k s e n + s i v i i l i p a l v e l u k s e s s a + s i v i i l i p a l v e l u m u o t o j e n + s i v i i l i p a l v e l u s a i k a + s i v i i l i p a l v e l u s t a + s i v i i l i p a n t t i v a n g i t + s i v i i l i p a n t t i v a n k e j a + s i v i i l i p e l a s t u s j o u k k o j a + s i v i i l i p e l a s t u s j o u k k o j e n + s i v i i l i p e l a s t u s j o u k o t + s i v i i l i p o h j a l t a + s i v i i l i p o l i i s e i k s i + s i v i i l i p o l i i s i a + s i v i i l i p o l i i s i e n + s i v i i l i p o l i i s i l l e + s i v i i l i p o l i i s i t + s i v i i l i p o l i i s i t y ö n + s i v i i l i p o l i i s i v o i m a n s a + s i v i i l i p o l i i s i v o i m a v a r o j a a n + s i v i i l i p o l i t i i k a n + s i v i i l i p r e s i d e n t i l l e + s i v i i l i p r e s i d e n t i n + s i v i i l i p r o j e k t i a + s i v i i l i p r o s e s s i o i k e u t t a + s i v i i l i p u o l e l l a + s i v i i l i p u o l u s t u k s e n + s i v i i l i p u o l u s t u s m e k a n i s m e j a + s i v i i l i p u o l u s t u s t a + s i v i i l i p u o l u s t u s v o i m a v a r o j e n + s i v i i l i r a k e n n u k s i a + s i v i i l i r a k e n t e e t + s i v i i l i r a k e n t e i d e n + s i v i i l i r a t k a i s u a + s i v i i l i r a u h a n t u r v a a j a t + s i v i i l i r a u h a n t u r v a j o u k k o i h i n + s i v i i l i r a u h a n t u r v a j o u k k o j a + s i v i i l i r a u h a n t u r v a j o u k k o j e n + s i v i i l i r a u h a n t u r v a j o u k o i s t a + s i v i i l i r a u h a n t u r v a j o u k o n + s i v i i l i r a u h a n t u r v a j o u k o t + s i v i i l i r e k i s t e r e i t ä + s i v i i l i r e k i s t e r i ä + s i v i i l i r o h k e u d e s t a + s i v i i l i r o h k e u s + s i v i i l i r o h k e u t t a + s i v i i l i r y h m i i n + s i v i i l i r y h m ä + s i v i i l i s e i k k o j a + s i v i i l i s e k t o r i l l a + s i v i i l i s e k t o r i l l e + s i v i i l i s i i v e n + s i v i i l i s o d a n + s i v i i l i s o p i m u k s i s t a + s i v i i l i s o t a + s i v i i l i s o v e l l u k s i a + s i v i i l i s o v e l l u k s i i n + s i v i i l i s o v e l l u s t e n + s i v i i l i s t r a t e g i a s t a + s i v i i l i s u o j e l u n + s i v i i l i s u o j e l u p a l v e l u s t a + s i v i i l i s u p e r v a l l a n + s i v i i l i s u u n n i t e l m a n + s i v i i l i s ä ä d y l l ä + s i v i i l i s ä ä d y n + s i v i i l i s ä ä t y + s i v i i l i s ä ä t y n s ä + s i v i i l i s ä ä t y y n + s i v i i l i s ä ä t y ä + s i v i i l i t + s i v i i l i t a a j u u k s i e n + s i v i i l i t a i s t e l i j o i n a + s i v i i l i t a p p i o i h i n + s i v i i l i t a p p i o t + s i v i i l i t a r k k a i l i j o i d e m m e + s i v i i l i t a r k k a i l i j o i d e n + s i v i i l i t a r k k a i l u v a l t u u s k u n t a + s i v i i l i t a r k o i t u k s e e n + s i v i i l i t a r k o i t u k s e s s a + s i v i i l i t a r k o i t u k s i i n + s i v i i l i t a r k o i t u k s i s s a + s i v i i l i t a r p e i d e n + s i v i i l i t a r v i k k e i d e n + s i v i i l i t a s o l l a + s i v i i l i t e h t ä v i e n + s i v i i l i t e h t ä v ä n + s i v i i l i t e h t ä v ä s s ä + s i v i i l i t e k s t i s t ä + s i v i i l i t e l a k a t + s i v i i l i t e o l l i s u u d e n + s i v i i l i t i l a n t e i s s a + s i v i i l i t o i m e n p i t e i t ä + s i v i i l i t o i m e t + s i v i i l i t o i m i a + s i v i i l i t o i m i e l i m i ä + s i v i i l i t o i m i e n + s i v i i l i t o i m i i n + s i v i i l i t o i m i j a + s i v i i l i t o i m i n n a l l i s t a + s i v i i l i t o i m i n n a n + s i v i i l i t o i m i n t a + s i v i i l i t o i m i n t a a + s i v i i l i t o i m i s t o a + s i v i i l i t o i m i t t a j a a + s i v i i l i t u o m i o i d e n + s i v i i l i t u o m i o i s t u i m e n + s i v i i l i t u o m i o i s t u i m e s s a + s i v i i l i t u o m i o i s t u i m i i n + s i v i i l i t u o m i o i s t u i m i s s a + s i v i i l i t u o m i o i s t u i n + s i v i i l i t u o m i o i s t u i n j ä r j e s t e l m ä n + s i v i i l i t u o m i o i s t u i n t a + s i v i i l i t u o m i o i s t u i n t e n + s i v i i l i t u o t a n n o n + s i v i i l i t u o t a n t o o n + s i v i i l i t u o t t e i d e n + s i v i i l i t u r v a l l i s u u s j ä r j e s t e l m ä ä n + s i v i i l i t u t k i m u s o h j e l m i e n + s i v i i l i t y ö k a l u i l l a + s i v i i l i u h r e i s t a + s i v i i l i u h r e j a + s i v i i l i u h r i a + s i v i i l i u h r i e n + s i v i i l i u h r i t + s i v i i l i u l k o p o l i t i i k a n + s i v i i l i u l k o p o l i t i i k a s t a + s i v i i l i u l k o p o l i t i i k k a a + s i v i i l i u l o t t u v u u d e l l a + s i v i i l i u l o t t u v u u d e n + s i v i i l i u l o t t u v u u t t a + s i v i i l i v a l l a n + s i v i i l i v a l m i u k s i a + s i v i i l i v a l m i u k s i e n + s i v i i l i v a l m i u k s i i n + s i v i i l i v a l m i u s r y h m i ä + s i v i i l i v a l t a + s i v i i l i v a l t a n a + s i v i i l i v a l t u u s k u n n a t + s i v i i l i v a l v o n n a n + s i v i i l i v a l v o n n a s s a + s i v i i l i v a l v o n t a + s i v i i l i v a l v o n t a a n + s i v i i l i v a n k e j a + s i v i i l i v a n k i e n + s i v i i l i v a p a u k s i e n + s i v i i l i v a p a u s t a k e i t a + s i v i i l i v a s t u u l a i n + s i v i i l i v a s t u u s e e n + s i v i i l i v e l v o l l i s u u s + s i v i i l i v i r a n o m a i n e n + s i v i i l i v i r a n o m a i s e t + s i v i i l i v i r a n o m a i s i a + s i v i i l i v i r a n o m a i s t e n + s i v i i l i v o i m a v a r a t + s i v i i l i v o i m a v a r o i n + s i v i i l i v o i m a v a r o j a + s i v i i l i v o i m a v a r o j e n + s i v i i l i v ä e s t ö + s i v i i l i v ä e s t ö j e n + s i v i i l i v ä e s t ö j ä + s i v i i l i v ä e s t ö l l e + s i v i i l i v ä e s t ö l l ä + s i v i i l i v ä e s t ö l t ä + s i v i i l i v ä e s t ö n + s i v i i l i v ä e s t ö s t ä + s i v i i l i v ä e s t ö t + s i v i i l i v ä e s t ö ä + s i v i i l i v ä e s t ö ö n + s i v i i l i v ä l i n e e t + s i v i i l i v ä l i n e i n + s i v i i l i v ä l i n e i t ä + s i v i i l i y d i n e n e r g i a s e k t o r i n + s i v i i l i y d i n o h j e l m a a + s i v i i l i y d i n v o i m a n + s i v i i l i y h t e i s k u n n a n + s i v i i l i y h t e i s k u n n a s s a + s i v i i l i y h t e i s k u n n a s t a + s i v i i l i y h t e i s k u n t a + s i v i i l i y h t e i s k u n t a a + s i v i i l i y h t e i s t y ö + s i v i i l i y h t e i s t y ö l l e + s i v i i l i y h t e i s t y ö n + s i v i i l i y h t e i s t y ö s s ä + s i v i i l i y h t e i s t y ö t ä + s i v i i l i y h t e i s ö + s i v i i l i y h t e i s ö j e n + s i v i i l i y h t e i s ö j ä + s i v i i l i y h t e i s ö n + s i v i i l i ä + s i v i l i s a a t i o h a n k e + s i v i l i s a a t i o h a n k k e e n + s i v i l i s a a t i o i d e n + s i v i l i s a a t i o l l e + s i v i l i s a a t i o m a l l i a m m e + s i v i l i s a a t i o m a l l i n + s i v i l i s a a t i o m m e + s i v i l i s a a t i o n + s i v i l i s a a t i o t a + s i v i s t y k s e l l i s i ä + s i v i s t y k s e n + s i v i s t y n e e l l e + s i v i s t y n e e m m i s s ä + s i v i s t y n e e m m ä l l ä + s i v i s t y n e e m m ä n + s i v i s t y n e e m p i + s i v i s t y n e e m p i ä + s i v i s t y n e e s s ä + s i v i s t y n e i m m i s t ä + s i v i s t y n e i m p ä n ä + s i v i s t y n e i s s ä + s i v i s t y n e i t ä + s i v i s t y s a s t e e n + s i v i s t y s e l ä m ä ä n + s i v i s t y s h a n k e + s i v i s t y s k y s y m y s + s i v i s t y s m a a n a + s i v i s t y s m a a t + s i v i s t y s m a i s s a + s i v i s t y s m a l l i a + s i v i s t y s n o r m i e n + s i v i s t y s p e r i n n e + s i v i s t y s p e r i n t ö ä + s i v i s t y s t a s o + s i v i s t y s t a s o m m e + s i v i s t y s t a s o n + s i v i s t y s v a l t i o + s i v i s t y s v a l t i o i d e n + s i v i s t y s v a l t i o i n a + s i v i s t y s v a l t i o i s s a + s i v i s t y s v a l t i o i t a + s i v i s t y s v a l t i o n + s i v i s t y s v a l t i o n a + s i v i s t y s y h t e i s k u n n a k s i + s i v i s t y s y h t e i s k u n n a n + s i v i s t y s y h t e i s k u n n a s s a + s i v i s t y s y h t e i s k u n n a s t a + s i v i s t y s y h t e i s k u n t a + s i v i s t y s y h t e i s k u n t a a + s i v i s t y s y h t e i s k u n t a n a + s i v i s t ä ä + s i v u a i n e k s e t + s i v u a s i a s t a + s i v u a u r i n g o t + s i v u e l i n k e i n o t + s i v u h u o m a u t u k s e n + s i v u h u o m a u t u k s e n a + s i v u h u o m a u t u k s i a + s i v u h u o m a u t u s + s i v u h u o m i o + s i v u i k k u n a t + s i v u i l l a + s i v u i l m i ö i t ä + s i v u j a + s i v u j o k i e n + s i v u k o h t a a + s i v u k u l u j a + s i v u k u s t a n n u s t e n + s i v u k v a n t t i l u k u + s i v u l a u s e e s s a + s i v u l a u s e i s s a + s i v u l e i k k u r i t + s i v u l e n t o k e n t i l l ä + s i v u m a u n + s i v u m i n e r a a l i a + s i v u m ä ä r ä n s ä + s i v u m ä ä r ä ä + s i v u n + s i v u n ä y t t ä m ö l l ä + s i v u o s a + s i v u o s a a n + s i v u p e i l e i h i n + s i v u p o l k u j a + s i v u p r o j e k t i e n + s i v u r a i t e e n + s i v u r a i t e i l l e + s i v u r a t o j a + s i v u r o o l i i n + s i v u s a a l i i d e n + s i v u s a a l i i k s i + s i v u s a a l i i n a + s i v u s a a l i i t + s i v u s a a l i i t a + s i v u s a a l i s k i i n t i ö i d e n + s i v u s a a l i s l a j e i h i n + s i v u s a a l i s m ä ä r ä n + s i v u s a a l i s s e u r a u k s i a + s i v u s e i k a k s i + s i v u s e i k k a + s i v u s e i k k o i h i n + s i v u s e i k k o j a + s i v u s e i k k o j e n + s i v u s e i k o i s t a + s i v u s i + s i v u s i t t e + s i v u s t a k a t s o j a k s i + s i v u s t a k a t s o j a n a + s i v u s t a k a t s o j i a + s i v u s t a k a t s o j i e n + s i v u s t a s e u r a a j i n a + s i v u s t o j a + s i v u s t o l l a + s i v u s t o l t a + s i v u s t o m m e + s i v u t + s i v u t e i d e n + s i v u t e i l l ä + s i v u t o i m i p a i k k o j e n + s i v u t o i m i p i s t e + s i v u t o i m i s t o + s i v u t t a i s s u u n t a i s i a + s i v u t t a i s s u u n t a i s i l l a + s i v u t t a i s s u u n t a i s i l l e + s i v u t t a i s s u u n t a i s t e n + s i v u t t i i n k i n + s i v u t u o t e a s e t u s + s i v u t u o t t e i d e n + s i v u t u o t t e i s i i n + s i v u t y ö p a i k k a + s i v u u t e t a + s i v u u t e t a a n + s i v u u t e t t i i n + s i v u u t e t u l l e + s i v u u t t a a + s i v u u t t a e n + s i v u u t t a m a l l a + s i v u u t t a m a t t a + s i v u u t t a m i s e l l a + s i v u u t t a m i s t a + s i v u u t t a n e e t + s i v u u t t a n u t + s i v u u t t a v a t + s i v u v a h i n k o j a + s i v u v a i k u t u k s e n a + s i v u v a i k u t u k s e n s a + s i v u v a i k u t u k s e s t a + s i v u v a i k u t u k s e t + s i v u v a i k u t u k s i a + s i v u v a i k u t u k s i i n + s i v u v a i k u t u k s i l l e + s i v u v a i k u t u k s i s t a + s i v u v a i k u t u s + s i v u v a i k u t u s t e n + s i v u v a i k u t u s t e n s a + s i v u v e n t t i i l i m o o t t o r i + s k a a l a e d u t + s k a a l a k o r k e u s + s k a a l a t e k i j ä + s k a a l a u t u m a t o n + s k a l a a r i k e n t t ä + s k a n d a a l e i h i n + s k a n d a a l e i s t a + s k a n d a a l e j a + s k a n d a a l i a r t i k k e l e i t a + s k a n d a a l i e n + s k a n d a a l i h ä ä t + s k a n d a a l i i n + s k a n d a a l i k o m i s s a a r i n s a + s k a n d a a l i m a i s e m p a a + s k a n d a a l i m a i s i a + s k a n d a a l i m a i s i n + s k a n d a a l i n a + s k a n d a a l i o h j e l m a n + s k a n d a a l i s s a + s k a n d a a l i s t a + s k a n d i n a a v i k o l l e g a m m e + s k a n d i n a v i a s s a + s k a n d i t + s k a n n a u s j ä r j e s t e l m i i n + s k a n n a u s l a i t t e e n + s k a n n a u s l a i t t e i d e n + s k a n n a u s m e n e t t e l y + s k a n n a u s t e k n i i k o i t a + s k a n n e r i k y s y m y k s e e n + s k e e m a t e r a p i a + s k e n a a r i o a n a l y y s i n s ä + s k e n a a r i o i d e n + s k e n a a r i o i t a + s k e n a a r i o m m e + s k e n a a r i o n + s k e n a a r i o o n + s k e n a a r i o s u u n n i t t e l u a m m e + s k e n a a r i o t + s k e n a a r i o t a + s k e p t i k k o j a + s k e p t i k o i l l e + s k e p t i k o t + s k e p t i s e m m i n + s k e p t i s e m p i + s k e p t i s i m m ä t k i n + s k e p t i s i n t ä + s k e p t i s i ä + s k i e n t o l o g e j a + s k i e n t o l o g i a k i r k k o + s k i t s o f r e e n i s t a + s k i t s o t y y p p i n e n + s k o r p i o n i a h v e n + s k o r p i o n i k u n i n g a s + s k o r p i o n i l i s k o + s k o t i t + s k o t l a n t i l a i s e n a + s k o t l a n t i l a i s e t + s k o t l a n t i l a i s i l l e + s k o t l a n t i l a i s i s t a + s k o t l a n t i l a i s y r i t y s t e n + s k o t t i a r m e i j a + s k o t t i h a l l i t u s + s k o t t i k o l l e g o i d e n + s k o t t i k o l l e g o j a n i + s k o t t i l a i s t a + s k o t t i m i l j o n ä ä r i + s k o t t i v i s k i + s k o t t i v i s k i i n + s k o t t i v i s k i n + s k o t t i v i s k i ä + s l a a v i l a i s e l l a + s l a a v i l a i s t e n + s l a a v i n k i e l i s e n + s l a a v i p u o l u e + s l a n g i a + s l o v a k i a a + s l o v a k i a a n + s l o v a k i a l a i s e t + s l o v a k i a l a i s i a + s l o v a k i a l a i s j u o m a a + s l o v a k i a l a i s k o l l e g o i d e n i + s l o v a k i a l a i s t e n + s l o v a k i a l a i s v ä h e m m i s t ö + s l o v a k i a l l a + s l o v a k i a l l e + s l o v a k i a n + s l o v a k i a s s a + s l o v a k i a s s a k i n + s l o v a k i a s t a + s l o v a k k i e n e m m i s t ö n + s l o v a k k i v ä h e m m i s t ö + s l o v a k k i v ä h e m m i s t ö n + s l o v a k k i v ä h e m m i s t ö ä + s l o v e e n i n k i e l i s e n + s l o v e e n i n k i e l i s i ä + s l o v e e n i n k i e l i s t e n + s l o v e e n i n k i e l i s t ä + s l o v e e n i t + s l o v e e n i v a n h e m m a t + s l o v e e n i v ä h e m m i s t ö + s l o v e e n i v ä h e m m i s t ö j ä + s l o v e e n i v ä h e m m i s t ö l l e + s l o v e e n i v ä h e m m i s t ö n + s l o v e e n i v ä h e m m i s t ö ä + s l o v e e n i v ä h e m m i s t ö ö n + s l o v e n i a l a i s v ä h e m m i s t ö + s l o v e n i a l a i s v ä h e m m i s t ö i h i n + s l o v e n i a l a i s v ä h e m m i s t ö l l e + s l o v e n i a l a i s v ä h e m m i s t ö n + s l o v e n i a l a i s v ä h e m m i s t ö t + s l o v e n i a l a i s v ä h e m m i s t ö ä + s l u m m i a l u e e n + s l u m m i a l u e i l l a + s l u m m i a s u t u k s i s t a + s l u m m i k o r t t e l e i t a m m e + s l u m m i u t u m i n e n + s l u m m i u t u u + s m a r a g d i a r a + s m a r a g d i b o a + s m a r a g d i h a r l e k i i n i + s m a r a g d i m e t s ä + s m a r a g d i n a u k u j a + s m a r a g d i p a r a t i i s i h a r a k k a + s m a r a g d i r a n n i k k o + s m a r a g d i t a u l u + s m a r a g d i v y ö n ä + s o d a k s i + s o d a l l a + s o d a l l e + s o d a l t a + s o d a n + s o d a n a i k a i s i a + s o d a n j u l i s t u k s e n a + s o d a n j u l i s t u k s e s t a + s o d a n j u l i s t u k s i l l a + s o d a n j u l i s t u s + s o d a n j u l i s t u s t a + s o d a n j ä l k e i n e n + s o d a n j ä l k e i s e e n + s o d a n j ä l k e i s e l l e + s o d a n j ä l k e i s e n + s o d a n j ä l k e i s e n ä + s o d a n j ä l k e i s e s s ä + s o d a n j ä l k e i s e s t ä + s o d a n j ä l k e i s e t + s o d a n j ä l k e i s i l l ä + s o d a n j ä l k e i s i n ä + s o d a n j ä l k e i s t ä + s o d a n k y l ä n + s o d a n k ä y n n i n + s o d a n k ä y n n i s s ä + s o d a n k ä y n t e j ä + s o d a n k ä y n t i + s o d a n k ä y n t i m u o t o n a + s o d a n k ä y n t i t a i t o + s o d a n k ä y n t i ä + s o d a n p e l k o a + s o d a n v a s t a i n e n + s o d a n v a s t a i s e n + s o d a n v a s t a i s e t + s o d a n v a s t a i s i i n + s o d a n v a s t a i s i s s a + s o d a n v a s t a i s i s t a + s o d a n v a s t a i s t e n + s o d a n v a s t a i s u u d e n + s o d a n v a s t u s t a j i e n + s o d a s s a + s o d a s t a + s o d a t + s o d i m m e + s o d i s s a + s o d i s t a + s o d i t a a n + s o g d i a n u s + s o h v a n v a l t a a j a t + s o h v a p e r u n o i s t a + s o i d a + s o i h t u k u l k u e e s t a + s o i j a a + s o i j a j a u h o + s o i j a j a u h o a + s o i j a j a u h o n + s o i j a j o h d a n n a i s i a + s o i j a k a k k u j a + s o i j a k a s t i k e + s o i j a m a i t o + s o i j a n t u o t a n t o + s o i j a n t u o t t a j i l l e + s o i j a n v i l j e l y s s ä + s o i j a p a p u + s o i j a p a p u a + s o i j a p a p u h e m i s e l l u l o o s a n + s o i j a p a p u i n a + s o i j a p a p u j a + s o i j a p a p u j a u h o a + s o i j a p a p u j e n + s o i j a p a p u k u o r m a s t a + s o i j a p a p u t u o t a n t o + s o i j a p a p u t y y p i n + s o i j a p a v u i s t a + s o i j a p a v u l l e + s o i j a p a v u n + s o i j a p a v u s t a + s o i j a r e h u n + s o i j a r o u h e + s o i j a r o u h e e n + s o i j a r o u h e t t a + s o i j a r u o k a v a s t i k e t t a + s o i j a s t a + s o i j a t o i m i t u k s e t + s o i j a t u o t a n t o + s o i j a t u o t t e i d e n + s o i j a v a r a s t o j a + s o i j a ö l j y + s o i j a ö l j y s t ä + s o i j a ö l j y y n + s o i j a ö l j y ä + s o i k k o k ä m m e k k ä + s o i k k o r a t a m o + s o i k k o v u o r e n k i l p i + s o i n t u k u l k u + s o i s i n + s o i t a k a a n + s o i t e t a a n + s o i t e t t a v i e n + s o i t e t t i i n + s o i t e t t u j e n + s o i t e t u n + s o i t i n l u o k i t u s + s o i t t a a + s o i t t a m a a n + s o i t t a m i s e n + s o i t t a m i s e s t a + s o i t t a n e e t + s o i t t a v a + s o i t t a v a t + s o i t t a v a t k o + s o i t t i + s o i t t i m i s t a + s o i t t o a + s o i t t o j a + s o i t t o n i e k a t + s o i t t o r a s i a + s o i t t o ä ä n e t + s o i t t o ä ä n i ä + s o i t t o ä ä n t e n + s o k a i s t a + s o k e a a + s o k e a a n + s o k e a i n + s o k e a k i n + s o k e a k s i + s o k e a n + s o k e a t + s o k e i d e n + s o k e i l l a + s o k e i l l e + s o k e i n a + s o k e i s t a + s o k e i t a + s o k e r i a + s o k e r i a l a + s o k e r i a l a a + s o k e r i a l a a n + s o k e r i a l a a n s a + s o k e r i a l a l l a + s o k e r i a l a l l e + s o k e r i a l a n + s o k e r i a l a s t a + s o k e r i a l k o h o l i t + s o k e r i a s e t u k s e k s i + s o k e r i a s i a a n + s o k e r i h i n n a t + s o k e r i j a l o s t u s t e o l l i s u u d e l l e + s o k e r i j u u r i k a s + s o k e r i j u u r i k a s a l a l l a + s o k e r i j u u r i k a s a l a n + s o k e r i j u u r i k a s k i i n t i ö i d e n + s o k e r i j u u r i k a s m a r k k i n o i d e n + s o k e r i j u u r i k a s m e l a s s i + s o k e r i j u u r i k a s m e l a s s i s t a + s o k e r i j u u r i k a s p a r o n i a + s o k e r i j u u r i k a s s a d o i s t a a n + s o k e r i j u u r i k a s s a t o + s o k e r i j u u r i k a s t a + s o k e r i j u u r i k a s t e h t a i d e n + s o k e r i j u u r i k a s t e o l l i s u u s + s o k e r i j u u r i k a s t o n n i a + s o k e r i j u u r i k a s t u o t a n n o n + s o k e r i j u u r i k a s t u o t a n t o + s o k e r i j u u r i k a s t u o t e + s o k e r i j u u r i k k a a l l e + s o k e r i j u u r i k k a a n + s o k e r i j u u r i k k a a n t u o t t a j i e n + s o k e r i j u u r i k k a a n v i l j e l y n + s o k e r i j u u r i k k a a s t a + s o k e r i j u u r i k k a i d e n + s o k e r i j u u r i k k a i s t a + s o k e r i j u u r i k k a i t a + s o k e r i j ä r j e s t e l m ä + s o k e r i j ä r j e s t e l m ä n + s o k e r i j ä r j e s t e l m ä s t ä + s o k e r i j ä r j e s t e l m ä ä + s o k e r i j ä r j e s t e l y n + s o k e r i k a u p a l l e + s o k e r i k a u p a n + s o k e r i k i i n t i ö i d e n + s o k e r i k i i n t i ö i s t ä + s o k e r i k i i n t i ö i s t ä ä n + s o k e r i k i i n t i ö i t ä + s o k e r i k i i n t i ö n + s o k e r i k i i n t i ö t + s o k e r i k i i n t i ö t ä + s o k e r i k i i n t i ö t ä ä n + s o k e r i k o i v u + s o k e r i k u l ö ö r i + s o k e r i k y s y m y k s e s t ä + s o k e r i l a k i + s o k e r i m a r k k i n a p o l i t i i k k a + s o k e r i m a r k k i n a t + s o k e r i m a r k k i n a u u d i s t u s + s o k e r i m a r k k i n o i d e n + s o k e r i m a r k k i n o i l l a + s o k e r i m a r k k i n o i l l e + s o k e r i m a r k k i n o i t a + s o k e r i m o n o p o l e i l l e + s o k e r i m o n o p o l i a + s o k e r i m ä n t y + s o k e r i m ä ä r i e n + s o k e r i n + s o k e r i n j a l o s t a m o + s o k e r i n j a l o s t a m o a + s o k e r i n j a l o s t a m o j a + s o k e r i n j a l o s t u k s e n + s o k e r i n j a l o s t u s a l a + s o k e r i n j a l o s t u s a l u e i s i i n + s o k e r i n j a l o s t u s t e o l l i s u u t e e n + s o k e r i n k u l u t u k s e k s i + s o k e r i n k u l u t u k s e n + s o k e r i n k u l u t u s + s o k e r i n k ä y t t ö ä + s o k e r i n k ä y t ö n + s o k e r i n s a a n n i n + s o k e r i n t a r j o n n a s s a + s o k e r i n t u o j i a + s o k e r i n t u o t a n n o l l e + s o k e r i n t u o t a n n o n + s o k e r i n t u o t a n n o s s a + s o k e r i n t u o t a n n o s t a + s o k e r i n t u o t a n t o + s o k e r i n t u o t a n t o a + s o k e r i n t u o t a n t o a a n + s o k e r i n t u o t a n t o a m m e + s o k e r i n t u o t a n t o l a i t o k s e s t a + s o k e r i n t u o t a n t o t a p a + s o k e r i n t u o t a n t o y r i t y s t e n + s o k e r i n t u o t t a j a + s o k e r i n t u o t t a j a l l a + s o k e r i n t u o t t a j a m a i d e n + s o k e r i n t u o t t a j a m a i h i n + s o k e r i n t u o t t a j a m a i l l e + s o k e r i n t u o t t a j a t + s o k e r i n t u o t t a j a v a l t i o i d e n + s o k e r i n t u o t t a j a v a l t i o i h i n + s o k e r i n t u o t t a j i e n + s o k e r i n t u o t t a j i l l e + s o k e r i n v a l m i s t a j i e n + s o k e r i n v i e j ä y h t i ö t + s o k e r i n v i e n n i n + s o k e r i n v i e n t i ä ä n + s o k e r i n v i l j e l y + s o k e r i n v i l j e l y n + s o k e r i o r a v a + s o k e r i p a l a + s o k e r i p a n e e l i n + s o k e r i p a r o n i e n + s o k e r i p i t o i s u u d e n + s o k e r i p i t o i s u u s + s o k e r i p i t o i s u u t e n s a + s o k e r i p i t o i s u u t t a + s o k e r i p o l i t i i k a n + s o k e r i p o l i t i i k a s s a + s o k e r i p o l i t i i k a s t a + s o k e r i p o l i t i i k k a + s o k e r i p o l i t i i k k a a + s o k e r i p o l i t i i k k a a n s a + s o k e r i p u h d i s t a m o a + s o k e r i p ö y t ä k i r j a n + s o k e r i r a s i a n + s o k e r i r u o k o + s o k e r i r u o k o a + s o k e r i r u o k o a l a + s o k e r i r u o k o a l a n + s o k e r i r u o k o m e h u s t a + s o k e r i r u o k o t e o l l i s u u t t a + s o k e r i r u o k o t i l o j a + s o k e r i r u o k o v i l j e l m i l l e + s o k e r i s a k k o + s o k e r i s e k t o r i a + s o k e r i s i i r a p i s s a + s o k e r i s o p i m u s + s o k e r i s t a + s o k e r i t a s e e n + s o k e r i t a s o s t a + s o k e r i t e h d a s + s o k e r i t e h d a s t a + s o k e r i t e h t a a m m e + s o k e r i t e h t a a n s a + s o k e r i t e h t a a s t a + s o k e r i t e h t a a t + s o k e r i t e h t a i d e n + s o k e r i t e h t a i l l a + s o k e r i t e h t a i l l e + s o k e r i t e h t a i s s a + s o k e r i t e h t a i s t a + s o k e r i t e h t a i t a + s o k e r i t e o l l i s u u d e l l e + s o k e r i t e o l l i s u u d e n + s o k e r i t e o l l i s u u s + s o k e r i t e o l l i s u u s k a r t e l l i n + s o k e r i t e o l l i s u u t e e n + s o k e r i t e o l l i s u u t e m m e + s o k e r i t e o l l i s u u t e n s a + s o k e r i t e o l l i s u u t t a + s o k e r i t e o l l i s u u t t a m m e + s o k e r i t o n n i n + s o k e r i t o p p a + s o k e r i t o r a k k a + s o k e r i t u o t a n n o l l a + s o k e r i t u o t a n t o + s o k e r i t u o t t e i d e n + s o k e r i t u o t t e i s i i n + s o k e r i u u d i s t u k s e e n + s o k e r i u u d i s t u k s e l l a m m e + s o k e r i u u d i s t u k s e n + s o k e r i u u d i s t u k s e s t a + s o k e r i u u d i s t u k s e t + s o k e r i u u d i s t u s + s o k e r i u u d i s t u s t a + s o k e r i v a a h t e r a + s o k e r i v a r a s t o k o r v a u s t e n + s o k e r i v a r a s t o m m e + s o k e r i v i e n t i ä + s o k e r i v i l j e l i j ö i l l e + s o k e r i y h t i ö + s o k e r i y h t i ö i t ä + s o k e r i y h t i ö t + s o k e r i y l i j ä ä m ä + s o k i s s a + s o k i t + s o k k i a a l l o t + s o k k i a a l t o j a + s o k k i h o i d o l l a + s o k k i h o i d o s t a + s o k k i h o i t o a + s o k k i t e r a p i a n a + s o k k i u u t i n e n + s o k k i v a i k u t u k s i a + s o k k o h a i + s o k k o k i i t ä j ä + s o k k o l e n t o p e r i a a t e + s o k k o s h a k k i + s o k k o t r e f f e i k s i + s o k k o t r e f f e i l l e + s o k k o t r e f f e i s t ä ä n + s o k k o t r e f f i t + s o l a n a + s o l a n a a n + s o l a n a l l e + s o l a t + s o l i d a a r i s e e n + s o l i d a a r i s e m m a n + s o l i d a a r i s e m m a s t a + s o l i d a a r i s e m p a a + s o l i d a a r i s e m p i + s o l i d a a r i s e m p i i n + s o l i d a a r i s e n + s o l i d a a r i s e s s a + s o l i d a a r i s i a + s o l i d a a r i s t a + s o l i d a a r i s u u d e n + s o l i d a a r i s u u d e n o s o i t u k s e t + s o l i d a a r i s u u d e n o s o i t u s + s o l i d a a r i s u u d e n o s o i t u s t e n + s o l i d a a r i s u u d e n t u n n e t t a m m e + s o l i d a a r i s u u d e n t u n t e e t + s o l i d a a r i s u u d e s t a + s o l i d a a r i s u u d e s t a m m e + s o l i d a a r i s u u s a j a t u k s e l l e + s o l i d a a r i s u u s a j a t u k s e n + s o l i d a a r i s u u s a j a t u k s e s t a + s o l i d a a r i s u u s a j a t u s + s o l i d a a r i s u u s a l o i t t e i d e n + s o l i d a a r i s u u s b a r o m e t r i n + s o l i d a a r i s u u s e l e e s t ä + s o l i d a a r i s u u s h a n k k e e s e e n + s o l i d a a r i s u u s h a n k k e i s i i n + s o l i d a a r i s u u s h e n k e ä + s o l i d a a r i s u u s i h a n n e t t a + s o l i d a a r i s u u s j u l k i l a u s u m a s s a + s o l i d a a r i s u u s j ä r j e s t e l m ä l l e + s o l i d a a r i s u u s j ä r j e s t e l m ä n + s o l i d a a r i s u u s j ä r j e s t e l m ä ä + s o l i d a a r i s u u s j ä s e n e h d o k a s v a l t i o i t a + s o l i d a a r i s u u s k y s y m y k s e s t ä + s o l i d a a r i s u u s k y s y m y k s i ä + s o l i d a a r i s u u s k y s y m y s + s o l i d a a r i s u u s k ä s i t e + s o l i d a a r i s u u s l a u s e k e + s o l i d a a r i s u u s l a u s e k e t t a + s o l i d a a r i s u u s l a u s e k k e e n + s o l i d a a r i s u u s l a u s e k k e e s e e n + s o l i d a a r i s u u s l a u s e k k e i s t a + s o l i d a a r i s u u s l e i r i l l ä + s o l i d a a r i s u u s l i i k e + s o l i d a a r i s u u s l i i k e t t ä + s o l i d a a r i s u u s l i i k k e e n + s o l i d a a r i s u u s l i i k k e e s e e n + s o l i d a a r i s u u s l i i k k e e s s ä + s o l i d a a r i s u u s l i i k k e i d e n + s o l i d a a r i s u u s l i i k k e i l l e + s o l i d a a r i s u u s l i i k k e i l t ä + s o l i d a a r i s u u s m a k s u a + s o l i d a a r i s u u s m a k s u n + s o l i d a a r i s u u s m a l l i a + s o l i d a a r i s u u s m a r s s i + s o l i d a a r i s u u s m e k a n i s m e i h i n + s o l i d a a r i s u u s m e k a n i s m e j a + s o l i d a a r i s u u s m e k a n i s m i + s o l i d a a r i s u u s m e k a n i s m i a + s o l i d a a r i s u u s m e k a n i s m i e n + s o l i d a a r i s u u s m e k a n i s m i n + s o l i d a a r i s u u s m e k a n i s m i t + s o l i d a a r i s u u s m i e l e n o s o i t u k s i s s a + s o l i d a a r i s u u s m i e l e s s ä + s o l i d a a r i s u u s n ä k ö k o h t a + s o l i d a a r i s u u s o h j e l m a a n + s o l i d a a r i s u u s o n g e l m a n + s o l i d a a r i s u u s p e r i a a t e + s o l i d a a r i s u u s p e r i a a t e t t a + s o l i d a a r i s u u s p e r i a a t t e e n + s o l i d a a r i s u u s p e r i a a t t e e s e e n + s o l i d a a r i s u u s p e r i a a t t e e s s a + s o l i d a a r i s u u s p e r i a a t t e e s t a + s o l i d a a r i s u u s p e r i a a t t e i t a m m e + s o l i d a a r i s u u s p e r i n t e e t + s o l i d a a r i s u u s p o l i t i i k a l l e + s o l i d a a r i s u u s p o l i t i i k a n + s o l i d a a r i s u u s p o l i t i i k a s t a + s o l i d a a r i s u u s p o l i t i i k k a + s o l i d a a r i s u u s p o l i t i i k k a a + s o l i d a a r i s u u s p o l i t i i k k a a m m e + s o l i d a a r i s u u s p o l i t i i k k a a n + s o l i d a a r i s u u s p r o j e k t i n + s o l i d a a r i s u u s p r o s e s s i + s o l i d a a r i s u u s p y r k i m y k s i l l e + s o l i d a a r i s u u s p ä ä t ö k s i ä + s o l i d a a r i s u u s r a h a s t o + s o l i d a a r i s u u s r a h a s t o a + s o l i d a a r i s u u s r a h a s t o a s e t u k s e k s i + s o l i d a a r i s u u s r a h a s t o a s e t u k s e n + s o l i d a a r i s u u s r a h a s t o a s e t u k s e s s a + s o l i d a a r i s u u s r a h a s t o j a + s o l i d a a r i s u u s r a h a s t o j e n + s o l i d a a r i s u u s r a h a s t o l l a + s o l i d a a r i s u u s r a h a s t o l l e + s o l i d a a r i s u u s r a h a s t o l t a + s o l i d a a r i s u u s r a h a s t o m m e + s o l i d a a r i s u u s r a h a s t o n + s o l i d a a r i s u u s r a h a s t o o n + s o l i d a a r i s u u s r a h a s t o s s a + s o l i d a a r i s u u s r a h a s t o s t a + s o l i d a a r i s u u s r a h a s t o t + s o l i d a a r i s u u s r i n t a m a l l a + s o l i d a a r i s u u s r i n t a m a n + s o l i d a a r i s u u s s o p i m u k s e n + s o l i d a a r i s u u s s o p i m u k s e s s a + s o l i d a a r i s u u s s o p i m u k s e s t a + s o l i d a a r i s u u s s o p i m u s + s o l i d a a r i s u u s s o p i m u s t a + s o l i d a a r i s u u s s t r a t e g i a l l a + s o l i d a a r i s u u s s u h d e t t a + s o l i d a a r i s u u s s u h t e e l l e + s o l i d a a r i s u u s s y i s t ä + s o l i d a a r i s u u s t a v o i t e t t a + s o l i d a a r i s u u s t a v o i t t e i d e n + s o l i d a a r i s u u s t e k o j a + s o l i d a a r i s u u s t e s t i ä + s o l i d a a r i s u u s t o i m e n p i t e i n + s o l i d a a r i s u u s t o i m e n p i t e i s i i n + s o l i d a a r i s u u s t o i m e n p i t e i t ä + s o l i d a a r i s u u s t o i m e t + s o l i d a a r i s u u s t o i m i a + s o l i d a a r i s u u s t o i m i i n + s o l i d a a r i s u u s t o i m i n + s o l i d a a r i s u u s t y ö t ä + s o l i d a a r i s u u s v a a t i m u k s e n + s o l i d a a r i s u u s v a j e t t a + s o l i d a a r i s u u s v e l v o i t e + s o l i d a a r i s u u s v e l v o i t e t t a + s o l i d a a r i s u u s v e l v o i t t e e n s a + s o l i d a a r i s u u s v e l v o i t t e i t a + s o l i d a a r i s u u s v ä l i n e + s o l i d a a r i s u u s v ä l i n e e n + s o l i d a a r i s u u s v ä l i n e e s t ä + s o l i d a a r i s u u s v ä l i n e i d e n + s o l i d a a r i s u u s v ä l i n e t t ä + s o l i d a a r i s u u t e e n + s o l i d a a r i s u u t e m m e + s o l i d a a r i s u u t e n i + s o l i d a a r i s u u t e n s a + s o l i d a a r i s u u t t a + s o l i d a a r i s u u t t a a n + s o l i d a a r i s u u t t a m m e + s o l k i k e n k ä + s o l m i m a l l e + s o l m i m a t + s o l m i m i e m m e + s o l m i m i s e e n + s o l m i m i s e k s i + s o l m i m i s e s t a + s o l m i m i s t a + s o l m i n u t + s o l m i o e r a k k o k o l i b r i + s o l m i o n + s o l m i o n e u l a + s o l m i t a a n + s o l m i t t a v a + s o l m i t t a v a n + s o l m i t t a v a t + s o l m i t t a v i e n + s o l m i t t i i n + s o l m i t t u j a + s o l m i t t u j e n + s o l m i t t u u n + s o l m i t u s s a + s o l m i t u s t a + s o l m i t u t + s o l m u k o h t a + s o l m u k o h t i a + s o l m u k o h t i e n + s o l m u k o h t i i n + s o l m u k o h t i n a + s o l m u s s a + s o l m u t + s o l m u t e o r i a + s o l u a u t o m a a t t i + s o l u b e t o n i n + s o l u b i o l o g i a + s o l u h e n g i t y s + s o l u h o i t o + s o l u i l l a + s o l u i s t a + s o l u j a + s o l u j e n + s o l u j o u k k o + s o l u k a l v o + s o l u l i i t o s + s o l u l i n j a a + s o l u l i n j o j a + s o l u l y m f o o m a + s o l u m a s s a n + s o l u m u i s t i + s o l u m u o v i n + s o l u n j a k a u t u m i n e n + s o l u n s i i r t o + s o l u p a n k k e j a + s o l u s e i n ä + s o l u s e u r a k u n t a + s o l u s y k l i + s o l u t + s o l u t e h d a s + s o l u t e h t a i t a + s o l u t e k n i i k k a a + s o l u t e k n o l o g i a n + s o l u t e o r i a + s o l u t e r a p i a + s o l u t e r a p i a t e k n i i k k o j a + s o l u t e r a p i a t u o t t e i d e n + s o l u t e r a p i o i d e n + s o l u t e r a p i o i t a + s o l u t t a u t u m i s m e n e t e l m i ä + s o l u t t a u t u m i s p y r k i m y s + s o l u t u t k i m u s t a + s o l u t y y p i k s i + s o l u v a u r i o i t a + s o l u v i e s t i n t ä + s o l u v i l j e l m i ä + s o l u v i l j e l y + s o l u v ä l i a i n e + s o l v a t a a n + s o l v a u k s i a + s o l v a u k s i l t a + s o l v a u k s i s t a + s o l v a u s r i k k o m u k s i i n + s o l v e n s s i m a r g i n a a l e j a + s o l v e n s s i m a r g i n a a l i + s o l v e n s s i m a r g i n a a l i a + s o l v e n s s i m a r g i n a a l i e n + s o l v e n s s i m a r g i n a a l i n + s o l v e n s s i m a r g i n a a l i v a a t i m u k s i a + s o l v e n s s i m a r g i n a a l i v a a t i m u s t e n + s o l v e n s s i s ä ä n t ö j ä + s o m a a t t i s i a + s o m a a t t i s t e n + s o m a l i a n + s o m a l i a n a a v i k k o j u o k s i j a + s o m a l i a n k a i j a + s o m a l i a n k i r j o k i u r u + s o m a l i a n k i u r u + s o m a l i a n k u t o j a + s o m a l i a n k y y h k y + s o m a l i a n l a u l u h a u k k a + s o m a l i a n l e p i n k ä i n e n + s o m a l i a n p i k k u k i u r u + s o m a l i a n r a s t a s + s o m a l i a n r u o h i k k o k i u r u + s o m a l i a n t a s k u + s o m a l i a n t u r t u r i k y y h k y + s o m a l i a n t ö p ö k e r t t u n e n + s o m a l i a n v a r p u n e n + s o m a l i a n v i l l i a a s i + s o m a l i a s t a + s o m a l i k a n s a a + s o m a l i k a n s a n + s o m a l i k a n s o j a + s o m a l i k o n g r e s s i + s o m a l i l a p s i + s o m a l i m a a n + s o m a l i n a i s i i n + s o m a l i p a k o l a i s i l l e + s o m a l i p a k o l a i s i s t a + s o m a l i t + s o m a t o t y y p i t + s o m b r e r o g a l a k s i + s o m m e r i n + s o n a a t t i m u o t o + s o n g h a i k i e l e t + s o n g h a i t + s o n i k i n + s o n i n k e t + s o n n e i s t a + s o n n i p a l k k i o i h i n + s o n t a k a s a s t a + s o o d a k a t t i l a + s o o d a t e o l l i s u u s + s o o l o i l l a + s o o l o i l u a + s o o l o k i t a r i s t i + s o o l o t y ö s k e n t e l y + s o o l o v a l v o n n a s s a + s o o l o v a l v o n t a + s o o p a a + s o p e u d u t t a v a + s o p e u t e t a + s o p e u t e t t a v a + s o p e u t t a a + s o p e u t t a a k s e e n + s o p e u t t a m i s a v u s t u k s e n a + s o p e u t t a m i s k e i n o t + s o p e u t t a m i s l u o t t o j e n + s o p e u t t a m i s m u u t t u j a + s o p e u t t a m i s n o p e u t t a + s o p e u t t a m i s o h j e l m a + s o p e u t t a m i s o h j e l m a a + s o p e u t t a m i s o h j e l m a n + s o p e u t t a m i s o h j e l m a s s a + s o p e u t t a m i s o h j e l m a s t a + s o p e u t t a m i s o h j e l m a t + s o p e u t t a m i s o h j e l m i a a n + s o p e u t t a m i s o h j e l m i e n + s o p e u t t a m i s o h j e l m i i n + s o p e u t t a m i s o h j e l m i l l a + s o p e u t t a m i s o h j e l m i s t a + s o p e u t t a m i s p o l i t i i k k a + s o p e u t t a m i s p r o s e s s i s t a + s o p e u t t a m i s r a h a s t o n + s o p e u t t a m i s r a s i t t e e t + s o p e u t t a m i s s u u n n i t e l m a a + s o p e u t t a m i s t a + s o p e u t t a m i s t o i m e n p i t e i d e n + s o p e u t t a m i s t o i m e n p i t e i s i i n + s o p e u t t a m i s t o i m i a + s o p e u t t a m i s t o i m i e n + s o p e u t t a m i s t o i m i i n + s o p e u t t a m i s u r a s t a + s o p e u t t a m i s v a u h t i a + s o p e u t t a v a t + s o p e u t u a + s o p e u t u a k s e e n + s o p e u t u m i s a i k a + s o p e u t u m i s a i k a a + s o p e u t u m i s a j a n + s o p e u t u m i s a j o i s t a + s o p e u t u m i s e e n + s o p e u t u m i s e l l e + s o p e u t u m i s e s t a + s o p e u t u m i s h a n k k e i d e n + s o p e u t u m i s j a k s o a + s o p e u t u m i s j a k s o n + s o p e u t u m i s k a u d e n + s o p e u t u m i s k a u d e s t a + s o p e u t u m i s k a u s i + s o p e u t u m i s k e h i t y k s e s s ä + s o p e u t u m i s k e h i t y s + s o p e u t u m i s k y k y + s o p e u t u m i s k y k y p i l a r i s s a + s o p e u t u m i s k y k y ä + s o p e u t u m i s l e v i t t ä y t y m i n e n + s o p e u t u m i s m a h d o l l i s u u k s i a + s o p e u t u m i s m e n e t t e l y i t ä + s o p e u t u m i s o h j e l m a a + s o p e u t u m i s o h j e l m i a + s o p e u t u m i s o n g e l m a n + s o p e u t u m i s o n g e l m a t + s o p e u t u m i s p o l i t i i k a l l e m m e + s o p e u t u m i s p o l i t i i k k a + s o p e u t u m i s p o l i t i i k k a a + s o p e u t u m i s p o l i t i i k k a a n + s o p e u t u m i s p r o s e s s i + s o p e u t u m i s p r o s e s s i s t a + s o p e u t u m i s p u i t t e e t + s o p e u t u m i s r a h a s t o + s o p e u t u m i s r a h a s t o a + s o p e u t u m i s r a h a s t o n + s o p e u t u m i s r a h a s t o o n + s o p e u t u m i s s t r a t e g i a t + s o p e u t u m i s s t r a t e g i o i d e n + s o p e u t u m i s s t r a t e g i o i s t a + s o p e u t u m i s t a + s o p e u t u m i s t a m m e + s o p e u t u m i s t o i m e n p i t e i d e n + s o p e u t u m i s t o i m e n p i t e i s i i n + s o p e u t u m i s t o i m e n p i t e i s t ä + s o p e u t u m i s t o i m e t + s o p e u t u m i s t o i m i a + s o p e u t u m i s t o i m i e n + s o p e u t u m i s t o i m i i n + s o p e u t u m i s t o i m i l l a + s o p e u t u m i s t o i m i n a + s o p e u t u m i s t o i m i s t a + s o p e u t u m i s v a i k e u k s i a + s o p e u t u m i s v a i k e u k s i s t a + s o p e u t u s k u s t a n n u k s i a + s o p e u t u s o h j e l m a + s o p e u t u s o h j e l m a a + s o p e u t u s o h j e l m a n + s o p e u t u s o h j e l m a t + s o p e u t u s o h j e l m i a + s o p e u t u s p r o s e s s i t + s o p e u t u s s t r a t e g i o i t a + s o p e u t u s t o i m e n p i t e e t + s o p e u t u s t o i m e n p i t e i d e n + s o p e u t u s t o i m e n p i t e i s i i n + s o p e u t u s t o i m i a + s o p e u t u s t o i m i s t a + s o p e u t u s v a i h e i s s a + s o p e u t u v a s s a + s o p i a + s o p i a k s e e n + s o p i e s s a m m e + s o p i i + s o p i i k i n + s o p i i k o + s o p i j a p u o l e n a + s o p i k a a m m e + s o p i m a a n + s o p i m a s t a + s o p i m a t o n t a + s o p i m a t t a + s o p i m a t t o m a a n + s o p i m a t t o m a l t a + s o p i m a t t o m a m p i + s o p i m a t t o m a s t a + s o p i m a t t o m a t + s o p i m a t t o m i a + s o p i m a t t o m i e n + s o p i m a t t o m i i n + s o p i m a t t o m i k s i + s o p i m a t t o m i l l e + s o p i m a t t o m i l t a + s o p i m a t t o m i s t a + s o p i m i e m m e + s o p i m i s e s s a + s o p i m i s t a + s o p i m u k s e e n + s o p i m u k s e k s i + s o p i m u k s e l l a + s o p i m u k s e l l a m m e + s o p i m u k s e l l e + s o p i m u k s e n + s o p i m u k s e n m u k a i s e e n + s o p i m u k s e n r i k k o m i s m e n e t t e l y s t ä + s o p i m u k s e n r i k k o m i s m e n e t t e l y t + s o p i m u k s e n t a r k i s t u s m e t o d i + s o p i m u k s e n t e k o m e n e t t e l y i d e n + s o p i m u k s e n t e k o p e r u s t e e n a + s o p i m u k s e n t e k o p e r u s t e e s t a + s o p i m u k s e n t e k o p e r u s t e i n a + s o p i m u k s e n t e k o p e r u s t e i t a + s o p i m u k s e n t e k o p ä ä t ö k s e n + s o p i m u k s e n v a s t a i n e n + s o p i m u k s e s s a + s o p i m u k s e s t a + s o p i m u k s e s t a m m e + s o p i m u k s e t + s o p i m u k s e t t o m a a n + s o p i m u k s i a + s o p i m u k s i i n + s o p i m u k s i k s i + s o p i m u k s i l l a + s o p i m u k s i l l e + s o p i m u k s i n + s o p i m u k s i s s a + s o p i m u k s i s t a + s o p i m u s a i k o j a + s o p i m u s a l u e + s o p i m u s a l u e e l l a + s o p i m u s a l u e e n + s o p i m u s a l u e e t + s o p i m u s a l u e t t a + s o p i m u s a r t i k l a n + s o p i m u s a r v o s t a + s o p i m u s a s e m i a + s o p i m u s a s i a k i r j a a + s o p i m u s a s i a k i r j a t + s o p i m u s a s i a t + s o p i m u s a s i o i s s a + s o p i m u s e h d o i l t a + s o p i m u s e h d o i s s a + s o p i m u s e h d o i s t a + s o p i m u s e h d o t + s o p i m u s e h d o t u k s e e n + s o p i m u s e h d o t u k s e l l a + s o p i m u s e h d o t u k s e n + s o p i m u s e h d o t u k s e s t a + s o p i m u s e h d o t u k s e t + s o p i m u s e h d o t u k s i i n + s o p i m u s e h d o t u k s i s t a + s o p i m u s e h d o t u s + s o p i m u s e h d o t u s t a + s o p i m u s e h t o + s o p i m u s e h t o i h i n + s o p i m u s e h t o j a + s o p i m u s e h t o j e n + s o p i m u s e l i n t e n + s o p i m u s e s i t y k s e n + s o p i m u s e s i t y k s e s s ä + s o p i m u s e s i t y s + s o p i m u s e s i t y s t ä + s o p i m u s h a n k e + s o p i m u s h a n k e t t a + s o p i m u s h a n k k e e n + s o p i m u s h e n k i l ö k u n t a a n + s o p i m u s h i n n a s t a + s o p i m u s h i n t o j e n + s o p i m u s j a o s t o l l e + s o p i m u s j ä l j e n n ö k s e n + s o p i m u s j ä l j e n n ö k s i ä + s o p i m u s j ä l j e n n ö s t ä + s o p i m u s j ä r j e s t e l m ä + s o p i m u s j ä r j e s t e l m ä n + s o p i m u s j ä r j e s t e l m ä ä + s o p i m u s j ä r j e s t e l m ä ä n + s o p i m u s j ä r j e s t e l y i h i n + s o p i m u s j ä r j e s t e l y i s t ä + s o p i m u s j ä r j e s t e l y j e n + s o p i m u s j ä r j e s t e l y j e n s ä + s o p i m u s j ä r j e s t e l y j ä + s o p i m u s j ä r j e s t e l y n + s o p i m u s j ä r j e s t e l y t + s o p i m u s k a u d e l l a + s o p i m u s k a u d e n + s o p i m u s k a u s i + s o p i m u s k e h y k s e e n + s o p i m u s k e h y k s e n + s o p i m u s k e h y s + s o p i m u s k e h y s t e n + s o p i m u s k o h d a n + s o p i m u s k o h t a i s e s t i + s o p i m u s k o h t i a + s o p i m u s k o k o n a i s u u d e n + s o p i m u s k o k o n a i s u u s + s o p i m u s k r i i s i n + s o p i m u s k u l t t u u r i a + s o p i m u s k u l u j e n + s o p i m u s k u m p p a n e i d e n + s o p i m u s k u m p p a n e i t a + s o p i m u s k u m p p a n i + s o p i m u s k u m p p a n i k s i + s o p i m u s k u m p p a n i l l e + s o p i m u s k y n n y k s i ä + s o p i m u s k ä y t ä n n ö t + s o p i m u s l a i n + s o p i m u s l a i n s ä ä d ä n n ö n + s o p i m u s l a i n s ä ä d ä n t ö + s o p i m u s l a i n s ä ä d ä n t ö ä + s o p i m u s l a i n s ä ä d ä n t ö ö n + s o p i m u s l a i s t a + s o p i m u s l a k e j a + s o p i m u s l a u s e k k e e t + s o p i m u s l a u s e k k e i d e n + s o p i m u s l a u s e k k e i s s a + s o p i m u s l a u s e k k e i t a + s o p i m u s l i s e n s s e j ä + s o p i m u s l i s e n s s i e n + s o p i m u s l u o k i s s a + s o p i m u s l u o n n o k s e e n + s o p i m u s l u o n n o k s e k s i + s o p i m u s l u o n n o k s e l l a + s o p i m u s l u o n n o k s e l l e + s o p i m u s l u o n n o k s e n + s o p i m u s l u o n n o k s e n a + s o p i m u s l u o n n o k s e n s a + s o p i m u s l u o n n o k s e s s a + s o p i m u s l u o n n o k s e s t a + s o p i m u s l u o n n o k s e t + s o p i m u s l u o n n o k s i a + s o p i m u s l u o n n o s + s o p i m u s l u o n n o s t a + s o p i m u s l u o n n o s t e n + s o p i m u s m a l l e j a + s o p i m u s m a l l i + s o p i m u s m a l l i n + s o p i m u s m e k a n i s m i + s o p i m u s m e n e t t e l y i h i n + s o p i m u s m e n e t t e l y i s t ä + s o p i m u s m e n e t t e l y j e n + s o p i m u s m e n e t t e l y n + s o p i m u s m e n e t t e l y s s ä + s o p i m u s m e n e t t e l y y n + s o p i m u s m e n e t t e l y ä + s o p i m u s m u o d o t + s o p i m u s m u o t o j a + s o p i m u s m u u t o k s e l l a + s o p i m u s m u u t o k s e n + s o p i m u s m u u t o k s e t + s o p i m u s m u u t o k s i a + s o p i m u s m u u t o k s i i n + s o p i m u s m u u t o k s i s s a + s o p i m u s m u u t o s t e n + s o p i m u s m y y n t i + s o p i m u s m ä ä r ä y k s e t + s o p i m u s m ä ä r ä y k s i i n + s o p i m u s m ä ä r ä y k s i ä + s o p i m u s m ä ä r ä y s + s o p i m u s m ä ä r ä y s t e n + s o p i m u s n e u v o t t e l u i d e n + s o p i m u s n e u v o t t e l u i h i n + s o p i m u s n e u v o t t e l u i l l e + s o p i m u s n e u v o t t e l u i s s a + s o p i m u s n e u v o t t e l u i s t a + s o p i m u s n e u v o t t e l u j a + s o p i m u s n e u v o t t e l u j e n + s o p i m u s n e u v o t t e l u t + s o p i m u s n ä k ö k o h t i a + s o p i m u s o h j e l m i e n + s o p i m u s o i k e u d e k s i + s o p i m u s o i k e u d e l l a + s o p i m u s o i k e u d e l l e + s o p i m u s o i k e u d e l l i n e n + s o p i m u s o i k e u d e l l i s e n + s o p i m u s o i k e u d e l l i s e t + s o p i m u s o i k e u d e l l i s i a + s o p i m u s o i k e u d e n + s o p i m u s o i k e u d e s s a + s o p i m u s o i k e u d e s t a + s o p i m u s o i k e u d e t + s o p i m u s o i k e u k s i e n + s o p i m u s o i k e u s + s o p i m u s o i k e u s a s i a t + s o p i m u s o i k e u s h a n k e + s o p i m u s o i k e u s h a n k k e e s e e n + s o p i m u s o i k e u s j ä r j e s t e l m ä s t ä + s o p i m u s o i k e u s k e h y k s e l l ä + s o p i m u s o i k e u s k y s y m y k s i i n + s o p i m u s o i k e u s s ä ä n n ö s t ö ö n + s o p i m u s o i k e u s v ä l i n e t t ä + s o p i m u s o i k e u t e e n + s o p i m u s o i k e u t e n a + s o p i m u s o i k e u t t a + s o p i m u s o l o s u h t e i s i i n + s o p i m u s o s a p u o l e k s i + s o p i m u s o s a p u o l e l l e + s o p i m u s o s a p u o l e n + s o p i m u s o s a p u o l e n a + s o p i m u s o s a p u o l e t + s o p i m u s o s a p u o l i + s o p i m u s o s a p u o l i l l e + s o p i m u s o s a p u o l i n a + s o p i m u s o s a p u o l i s t a + s o p i m u s o s a p u o l t e n + s o p i m u s p a k e t t i a + s o p i m u s p a k e t t i i n + s o p i m u s p a p e r e i t a + s o p i m u s p e r i a a t e t t a + s o p i m u s p e r u s t a + s o p i m u s p e r u s t a n + s o p i m u s p e r u s t a s t a + s o p i m u s p e r u s t e i s i a + s o p i m u s p e r u s t e i s t e n + s o p i m u s p o h j a + s o p i m u s p o h j a a + s o p i m u s p o h j a i s e t + s o p i m u s p o h j a n + s o p i m u s p o l i t i i k a s s a + s o p i m u s p o l i t i i k a s t a + s o p i m u s p o l i t i i k k a a + s o p i m u s p o l i t i i k k a m m e + s o p i m u s p r o s e s s e i h i n + s o p i m u s p r o s e s s i s s a + s o p i m u s p u i t e k e h y k s e s t ä + s o p i m u s p u i t t e e n + s o p i m u s p u i t t e i s i i n + s o p i m u s p u o l e n + s o p i m u s p u o l e n a + s o p i m u s p u o l e t + s o p i m u s p u o l i + s o p i m u s p u o l i a + s o p i m u s p u o l i k s i + s o p i m u s p u o l i l l a + s o p i m u s p u o l i l l e + s o p i m u s p u o l i n a + s o p i m u s p u o l i s t a + s o p i m u s p u o l t a + s o p i m u s p u o l t e n + s o p i m u s p ö y t ä k i r j a + s o p i m u s p ö y t ä k i r j a n + s o p i m u s r a t k a i s u + s o p i m u s r a t k a i s u t + s o p i m u s r i i t o j a + s o p i m u s r i k k o m i s m e n e t t e l y + s o p i m u s r i k k o m i s m e n e t t e l y i s t ä + s o p i m u s r i k k o m i s m e n e t t e l y j e n + s o p i m u s r i k k o m i s m e n e t t e l y n + s o p i m u s r i k k o m i s m e n e t t e l y y n + s o p i m u s r i k k o m i s m e n e t t e l y ä + s o p i m u s r i k k o m u k s e n a + s o p i m u s r i k k o m u k s e s t a + s o p i m u s r i k k o m u k s e t + s o p i m u s r i k k o m u k s i a + s o p i m u s r i k k o m u k s i s t a + s o p i m u s r i k k o m u s + s o p i m u s r i k k o m u s k a n t e i t a + s o p i m u s r i k k o m u s m e n e t t e l y + s o p i m u s r i k k o m u s m e n e t t e l y i s t ä + s o p i m u s r i k k o m u s m e n e t t e l y j ä + s o p i m u s r i k k o m u s m e n e t t e l y n + s o p i m u s r i k k o m u s m e n e t t e l y s t ä + s o p i m u s r i k k o m u s m e n e t t e l y ä + s o p i m u s r i k k o m u s t a + s o p i m u s s a k k o + s o p i m u s s a k o t + s o p i m u s s u h d e + s o p i m u s s u h d e t t a + s o p i m u s s u h t e e n + s o p i m u s s u h t e e s e e n + s o p i m u s s u h t e e s s a + s o p i m u s s u h t e e t + s o p i m u s s u h t e i d e n + s o p i m u s s u h t e i l l e m m e + s o p i m u s s u h t e i s e s t a + s o p i m u s s u h t e i s e t + s o p i m u s s u h t e i s i i n + s o p i m u s s u h t e i s i l l e + s o p i m u s s u h t e i s s a + s o p i m u s s u h t e i s t a + s o p i m u s s u h t e i s t e n + s o p i m u s s u h t e i t a + s o p i m u s s u o j a s t a + s o p i m u s s ä ä n n ö i s t ä + s o p i m u s s ä ä n n ö k s e t + s o p i m u s t a + s o p i m u s t a k i n + s o p i m u s t a r j o u k s i a + s o p i m u s t a r k i s t u k s e t + s o p i m u s t a v o i t t e i d e n + s o p i m u s t e k s t e i s s ä + s o p i m u s t e k s t e i s t ä + s o p i m u s t e k s t e j ä + s o p i m u s t e k s t i + s o p i m u s t e k s t i i n + s o p i m u s t e k s t i k s i + s o p i m u s t e k s t i l l e + s o p i m u s t e k s t i n + s o p i m u s t e k s t i s s ä + s o p i m u s t e k s t i s t ä + s o p i m u s t e k s t i t + s o p i m u s t e k s t i ä + s o p i m u s t e n + s o p i m u s t i e + s o p i m u s t i l a n t e e n + s o p i m u s t i l a n t e e s s a + s o p i m u s t y y p i s t ä + s o p i m u s t y y p p e j ä + s o p i m u s t y y p p i ä + s o p i m u s t y ö n t e k i j ö i t ä + s o p i m u s u u d i s t u k s e e n + s o p i m u s u u d i s t u k s e l l a + s o p i m u s u u d i s t u k s e n + s o p i m u s u u d i s t u k s i a + s o p i m u s u u d i s t u k s i l l e + s o p i m u s u u d i s t u s + s o p i m u s u u d i s t u s t a + s o p i m u s u u d i s t u s t e n + s o p i m u s v a a t i m u k s e t + s o p i m u s v a i h e e n + s o p i m u s v a i h e e s e e n + s o p i m u s v a l i o k u n t a + s o p i m u s v a l t i o + s o p i m u s v a l t i o i d e n + s o p i m u s v a l t i o i l t a + s o p i m u s v a l t i o i t a + s o p i m u s v a l t i o t + s o p i m u s v a l t i o t a + s o p i m u s v a p a u d e n + s o p i m u s v a p a u k s i a + s o p i m u s v a p a u s + s o p i m u s v a p a u t t a + s o p i m u s v e l v o i t t e e n + s o p i m u s v e l v o i t t e e n s a + s o p i m u s v e l v o i t t e e s t a + s o p i m u s v e l v o i t t e e t + s o p i m u s v e l v o i t t e i d e n + s o p i m u s v e l v o i t t e i d e n s a + s o p i m u s v e l v o i t t e i l l e + s o p i m u s v e l v o i t t e i s i i n + s o p i m u s v e l v o i t t e i s t a + s o p i m u s v e l v o i t t e i t a + s o p i m u s v e l v o i t t e i t a a n + s o p i m u s v e r k o s t o + s o p i m u s v e r s i o s s a + s o p i m u s v i r a n o m a i s e t + s o p i m u s v i r a n o m a i s i a k i n + s o p i m u s v y ö h y k k e e l l ä + s o p i m u s y r i t y k s e t + s o p i m u s y r i t y s + s o p i n e e t + s o p i n u t + s o p i s i + s o p i v a a + s o p i v a a n + s o p i v a k s i + s o p i v a l l a + s o p i v a l t a + s o p i v a m m a k s i + s o p i v a m m a l l a + s o p i v a m m a l t a + s o p i v a m m a n + s o p i v a m m a s s a + s o p i v a m m i l t a + s o p i v a m p a a + s o p i v a m p a a n + s o p i v a m p a n a + s o p i v a m p i + s o p i v a m p i a + s o p i v a m p i e n + s o p i v a n + s o p i v a n a + s o p i v a s t a + s o p i v a t + s o p i v i a + s o p i v i e n + s o p i v i k s i + s o p i v i l l a + s o p i v i m m a l l a + s o p i v i m m a l t a + s o p i v i m m a n + s o p i v i m m a s s a + s o p i v i m m a s t a + s o p i v i m m a t + s o p i v i m m i l t a + s o p i v i m m i s s a + s o p i v i m m i s t a + s o p i v i m p a a n + s o p i v i m p a n a + s o p i v i m p i a + s o p i v i m p i n a + s o p i v i n + s o p i v i n t a + s o p i v u u d e s t a + s o p p a j o n o i s s a + s o p u a + s o p u e r o a + s o p u i s a m m i n + s o p u i s a m p a a n + s o p u i s a n a + s o p u p e l i p e t o s t e n + s o p u p e l i s k a n d a a l e i h i n + s o p u p e l i s k a n d a a l i + s o p u r a t k a i s u + s o p u r a t k a i s u a + s o p u r a t k a i s u j a + s o p u r a t k a i s u n + s o p u r a t k a i s u s t a + s o p u r a t k a i s u u n + s o p u s o i n n u s s a + s o p u s o i n t u i s e e n + s o p u s o i n t u i s e m m a n + s o p u s o i n t u i s e m m i n + s o p u s o i n t u i s e m p i + s o p u s o i n t u i s e t + s o p u s u h t a i n e n + s o p u u n + s o r a k u o p p a + s o r a k u o p p a a + s o r a ä ä n e n + s o r a ä ä n e t + s o r a ä ä n i s t ä + s o r a ä ä n i ä k i n + s o r a ä ä n t ä + s o r b i i n i h a p o n + s o r i a + s o r k k a e l ä i m e t + s o r k k a e l ä i m i s t ä + s o r k k a e l ä i n t e n + s o r k k a t a u d i n + s o r k k a t a u d i n k i n + s o r k k a t a u d i s t a + s o r k k a t a u t i + s o r k k a t a u t i a + s o r k k a t a u t i e p i d e m i a + s o r k k a t a u t i e p i d e m i a n + s o r k k a t a u t i e p i d e m i a s s a + s o r k k a t a u t i e p i d e m i a s t a + s o r k k a t a u t i e s i i n t y m ä + s o r k k a t a u t i i n + s o r k k a t a u t i k o l m i o o n + s o r k k a t a u t i k r i i s i + s o r k k a t a u t i k r i i s i n + s o r k k a t a u t i k r i i s i s t ä + s o r k k a t a u t i k r i i s i ä + s o r k k a t a u t i k y s y m y k s e s t ä + s o r k k a t a u t i p ä ä t ö s l a u s e l m a s t a + s o r k k a t a u t i r o k o t t e e s t a + s o r k k a t a u t i r o k o t t e i d e n + s o r k k a t a u t i r o k o t t e i t a + s o r k k a t a u t i r o k o t u k s i s t a + s o r k k a t a u t i t a p a u s + s o r k k a t a u t i t e u r a s t u k s e t + s o r k k a t a u t i t i l a n n e + s o r k k a t a u t i t r a g e d i a n + s o r k k a t a u t i t y y p p i ä + s o r k k a t a u t i v i r u k s e n + s o r k k a t a u t i v i r u k s i s t a + s o r k k a t a u t i v i r u s + s o r k k a t a u t i v i r u s t a + s o r k k a t a u t i y h d i s t y k s e l t ä + s o r m e a + s o r m e a m m e + s o r m e i l e m i s t a + s o r m e l l a + s o r m e l l a n i + s o r m e n i + s o r m e n j ä l j e t + s o r m e n j ä l j i s t ä + s o r m e n j ä l k i a j a t u k s e s t a + s o r m e n j ä l k i a l g o r i t m i t + s o r m e n j ä l k i e n + s o r m e n j ä l k i i n + s o r m e n j ä l k i j ä r j e s t e l m ä + s o r m e n j ä l k i j ä r j e s t e l m ä n + s o r m e n j ä l k i j ä r j e s t e l m ä ä + s o r m e n j ä l k i j ä r j e s t e l m ä ä n + s o r m e n j ä l k i p a l l o k a l a + s o r m e n j ä l k i p r o s e s s i s t a + s o r m e n j ä l k i r e k i s t e r i + s o r m e n j ä l k i r e k i s t e r i i n + s o r m e n j ä l k i t e k n i i k k a + s o r m e n j ä l k i t i e t o j e n + s o r m e n j ä l k i t i e t o k a n n a n + s o r m e n j ä l k i t i e t o k a n n a t + s o r m e n j ä l k i t i e t o k a n t a + s o r m e n j ä l k i t i e t o k a n t a a + s o r m e n j ä l k i t i e t o k a n t o i h i n + s o r m e n j ä l k i t i e t o k a n t o j e n + s o r m e n j ä l k i t i e t o p a n k i n + s o r m e n j ä l k i t u n n i s t u s j ä r j e s t e l m i e n + s o r m e n j ä l k i t u n n i s t u s m e n e t e l m ä n + s o r m e n j ä l k i t u t k i m u k s i a + s o r m i e n + s o r m i e n s a + s o r m i h e i n ä + s o r m i h i r s s i + s o r m i k i h a r a t + s o r m i l u u + s o r m i s s a n i + s o r m u s u k o n k o r e n t o + s o r r e t a a n + s o r r e t t u j a + s o r r e t t u j e n + s o r r e t u t k i n + s o r r o l l a + s o r r o n + s o r r o s t a + s o r s a n p u t k i + s o r t a a + s o r t a m a l l a + s o r t a m i s e l l e + s o r t a m i s k e i n o + s o r t a v a a + s o r t a v a n + s o r t a v i n + s o r t o a + s o r t o a i k o i n a + s o r t o d i k t a t u u r e i h i n + s o r t o e l i n t e n + s o r t o h a l l i n n o i s t a + s o r t o h a l l i n n o l t a a n + s o r t o h a l l i n n o n + s o r t o h a l l i n n o s t a + s o r t o h a l l i n n o t + s o r t o h a l l i n t o + s o r t o h a l l i n t o a + s o r t o h a l l i n t o a a n + s o r t o h a l l i n t o i h i n + s o r t o h a l l i n t o j a + s o r t o h a l l i n t o j e n + s o r t o h a l l i n t o n s a + s o r t o h a l l i n t o o n + s o r t o h a l l i t u k s e l l e + s o r t o h a l l i t u k s e t + s o r t o h a l l i t u k s i a + s o r t o h a l l i t u k s i l l e + s o r t o h a l l i t u k s i s t a + s o r t o h a l l i t u s + s o r t o h a l l i t u s t e n + s o r t o i s k u j a + s o r t o j o u k k o j e n + s o r t o j u n t a s t a + s o r t o j ä r j e s t e l m i ä + s o r t o j ä r j e s t e l m ä n + s o r t o k a m p a n j a a + s o r t o k a m p a n j a n + s o r t o k e i n o j a + s o r t o k e i n o s t a + s o r t o k o n e i s t o + s o r t o k o n e i s t o a + s o r t o k o n e i s t o n + s o r t o k o n e i s t o s s a + s o r t o k o n e i s t o s t a + s o r t o m a i s s a + s o r t o m e k a n i s m e i k s i + s o r t o m e k a n i s m e i s t a + s o r t o m e k a n i s m e j a + s o r t o m e k a n i s m i e n + s o r t o m e k a n i s m i e n s a + s o r t o m e n e t e l m i l l ä + s o r t o m e n e t e l m i n + s o r t o m e n e t e l m i s s ä + s o r t o m e n e t e l m i ä + s o r t o m e n e t e l m ä n ä + s o r t o n ä k ö k o h t i a + s o r t o p o l i t i i k a n + s o r t o p o l i t i i k a s t a + s o r t o p o l i t i i k a s t a a n + s o r t o p o l i t i i k k a a + s o r t o p o l i t i i k k a n a + s o r t o s t r a t e g i a s s a a n + s o r t o t o i m e n p i t e e t + s o r t o t o i m e n p i t e i s t ä + s o r t o t o i m e n p i t e i s t ä ä n + s o r t o t o i m e n p i t e i t ä + s o r t o t o i m e t + s o r t o t o i m i + s o r t o t o i m i a + s o r t o t o i m i e n + s o r t o t o i m i i n + s o r t o t o i m i l l a a n + s o r t o t o i m i l l e + s o r t o t o i m i s t a a n + s o r t o v a l t a + s o r t o v a l t a a + s o r t o v o i m a t + s o r t o v o i m i a + s o r t o v o i m i e n + s o r t o v u o d e t + s o r t o v ä l i n e + s o r t s e i s s a + s o r t u a + s o r t u i + s o r t u i s i + s o r t u m a i s i l l a a n + s o r t u m a t t a + s o r t u m i s t a + s o r t u u + s o r t u v a t + s o s i a a l i a l a + s o s i a a l i a l a a + s o s i a a l i a l a a n + s o s i a a l i a l a l l a + s o s i a a l i a l a l l e + s o s i a a l i a l a l t a + s o s i a a l i a l a n + s o s i a a l i a l a n t y ö n t e k i j ö i h i n + s o s i a a l i a l a s t a + s o s i a a l i a l a t + s o s i a a l i a l o i l l a + s o s i a a l i a l o i l l e + s o s i a a l i a l o j e n + s o s i a a l i a l u e e s e e n + s o s i a a l i a l u e i l l a + s o s i a a l i a l u e t t a + s o s i a a l i a n t r o p o l o g i a + s o s i a a l i a p u + s o s i a a l i a p u a + s o s i a a l i a p u j ä r j e s t e l m ä l l e + s o s i a a l i a p u p o l i t i i k a n + s o s i a a l i a p u u n + s o s i a a l i a s e t u k s e n + s o s i a a l i a s i a i n + s o s i a a l i a s i a k i r j a n + s o s i a a l i a s i a n + s o s i a a l i a s i a s s a + s o s i a a l i a s i a t + s o s i a a l i a s i o i d e n + s o s i a a l i a s i o i h i n + s o s i a a l i a s i o i l l a + s o s i a a l i a s i o i l l e + s o s i a a l i a s i o i s s a + s o s i a a l i a s i o i s t a + s o s i a a l i a s i o i t a + s o s i a a l i a s u n t o j e n + s o s i a a l i a v u n + s o s i a a l i a v u s t a + s o s i a a l i a v u s t a j i a + s o s i a a l i a v u s t u k s e n + s o s i a a l i a v u s t u k s e s s a + s o s i a a l i a v u s t u k s e t + s o s i a a l i a v u s t u k s i a + s o s i a a l i a v u s t u k s i i n + s o s i a a l i a v u s t u k s i k s i + s o s i a a l i a v u s t u k s i s t a + s o s i a a l i a v u s t u s k y s y m y k s i s s ä + s o s i a a l i a v u s t u s t a + s o s i a a l i a v u s t u s t e n + s o s i a a l i b u d j e t t e j a + s o s i a a l i b u d j e t t i e n + s o s i a a l i d a r v i n i s m i + s o s i a a l i d e m o k r a a t e i k s i + s o s i a a l i d e m o k r a a t e i l l a + s o s i a a l i d e m o k r a a t e i l l e + s o s i a a l i d e m o k r a a t e i l t a + s o s i a a l i d e m o k r a a t e i s t a + s o s i a a l i d e m o k r a a t i k s i + s o s i a a l i d e m o k r a a t i l l a + s o s i a a l i d e m o k r a a t i l l e + s o s i a a l i d e m o k r a a t i n + s o s i a a l i d e m o k r a a t i t + s o s i a a l i d e m o k r a a t i t k i n + s o s i a a l i d e m o k r a a t t e i h i n + s o s i a a l i d e m o k r a a t t e i n a + s o s i a a l i d e m o k r a a t t e j a + s o s i a a l i d e m o k r a a t t i + s o s i a a l i d e m o k r a a t t i a + s o s i a a l i d e m o k r a a t t i e n + s o s i a a l i d e m o k r a a t t i j ä s e n i i n + s o s i a a l i d e m o k r a a t t i j ä s e n t e n + s o s i a a l i d e m o k r a a t t i k o l l e g a a n i + s o s i a a l i d e m o k r a a t t i k o l l e g a n i + s o s i a a l i d e m o k r a a t t i k o l l e g o j a n i + s o s i a a l i d e m o k r a a t t i k o m i s s a a r i n + s o s i a a l i d e m o k r a a t t i n a + s o s i a a l i d e m o k r a a t t i n e n + s o s i a a l i d e m o k r a a t t i p a r k o j e n + s o s i a a l i d e m o k r a a t t i p o l i i t i k k o + s o s i a a l i d e m o k r a a t t i r y h m ä n + s o s i a a l i d e m o k r a a t t i s e e n + s o s i a a l i d e m o k r a a t t i s e k s i + s o s i a a l i d e m o k r a a t t i s e n + s o s i a a l i d e m o k r a a t t i s e n a + s o s i a a l i d e m o k r a a t t i s e s s a + s o s i a a l i d e m o k r a a t t i s e s t a + s o s i a a l i d e m o k r a a t t i s e t + s o s i a a l i d e m o k r a a t t i s i a + s o s i a a l i d e m o k r a a t t i s i l l e + s o s i a a l i d e m o k r a a t t i s i s s a + s o s i a a l i d e m o k r a a t t i s t a + s o s i a a l i d e m o k r a a t t i s t e n + s o s i a a l i d e m o k r a a t t i s u u t t a + s o s i a a l i d e m o k r a a t t i y s t ä v ä n i + s o s i a a l i d e m o k r a t i a + s o s i a a l i d e m o k r a t i a a + s o s i a a l i d e m o k r a t i a a n + s o s i a a l i d e m o k r a t i a l l e + s o s i a a l i d e m o k r a t i a n + s o s i a a l i d e m o k r a t i a s s a + s o s i a a l i d e m o k r a t i a s t a + s o s i a a l i d i r e k t i i v e j ä + s o s i a a l i e d u i l l a + s o s i a a l i e d u i s t a + s o s i a a l i e d u t + s o s i a a l i e h d o i s t a + s o s i a a l i e h t o j a + s o s i a a l i e h t o j e n + s o s i a a l i e k o l o g i n e n + s o s i a a l i e k o l o g i s e t + s o s i a a l i e k o n o m i s e t + s o s i a a l i e l ä m ä n + s o s i a a l i e l ä m ä s s ä + s o s i a a l i e r o j e n + s o s i a a l i e t u i h i n + s o s i a a l i e t u j a + s o s i a a l i e t u j e n + s o s i a a l i e t u u d e t + s o s i a a l i e t u u k s i a + s o s i a a l i e t u u k s i a m m e + s o s i a a l i e t u u k s i e n + s o s i a a l i e t u u k s i i n + s o s i a a l i e t u u k s i l l a + s o s i a a l i e t u u k s i s s a + s o s i a a l i e t u u k s i s t a + s o s i a a l i e t u u s + s o s i a a l i e t u u s j ä r j e s t e l m i e n + s o s i a a l i e t u u s j ä r j e s t e l m i ä ä n + s o s i a a l i e t u u s j ä r j e s t e l m ä t + s o s i a a l i e t u u t e n s a + s o s i a a l i f o o r u m i + s o s i a a l i f o o r u m i a + s o s i a a l i f o o r u m i h a n + s o s i a a l i f o o r u m i i n + s o s i a a l i f o o r u m i n + s o s i a a l i f o o r u m i s s a + s o s i a a l i f o o r u m i s t a + s o s i a a l i h a l l i n t o a + s o s i a a l i h i s t o r i a + s o s i a a l i h i s t o r i a a + s o s i a a l i h o i d o n + s o s i a a l i h o i t o k o d i n + s o s i a a l i h u i p p u k o k o u k s e s s a + s o s i a a l i h u i p p u k o k o u s + s o s i a a l i h u i p p u k o k o u s t a + s o s i a a l i h u o l l o n + s o s i a a l i h u o l l o s s a + s o s i a a l i h u o l t o + s o s i a a l i h u o l t o a + s o s i a a l i h u o l t o a l a n + s o s i a a l i h u o l t o j ä r j e s t e l m i e n + s o s i a a l i h u o l t o j ä r j e s t e l m i i n + s o s i a a l i h u o l t o j ä r j e s t e l m ä l l e + s o s i a a l i h u o l t o o n + s o s i a a l i h u o l t o p o l i t i i k k a a n + s o s i a a l i h y g i e n i a n a + s o s i a a l i j ä r j e s t e l m i e m m e + s o s i a a l i j ä r j e s t e l m i e n + s o s i a a l i j ä r j e s t e l m i e n s ä + s o s i a a l i j ä r j e s t e l m i l l e m m e + s o s i a a l i j ä r j e s t e l m i s s ä + s o s i a a l i j ä r j e s t e l m i s t ä m m e + s o s i a a l i j ä r j e s t e l m i ä + s o s i a a l i j ä r j e s t e l m ä + s o s i a a l i j ä r j e s t e l m ä l l e + s o s i a a l i j ä r j e s t e l m ä l l ä + s o s i a a l i j ä r j e s t e l m ä m a l l i a + s o s i a a l i j ä r j e s t e l m ä m m e + s o s i a a l i j ä r j e s t e l m ä n + s o s i a a l i j ä r j e s t e l m ä n s ä + s o s i a a l i j ä r j e s t e l m ä s s ä + s o s i a a l i j ä r j e s t e l m ä s t ä + s o s i a a l i j ä r j e s t e l m ä t + s o s i a a l i j ä r j e s t e l m ä ä + s o s i a a l i j ä r j e s t e l m ä ä m m e + s o s i a a l i j ä r j e s t e l m ä ä n + s o s i a a l i j ä r j e s t e l y + s o s i a a l i j ä r j e s t ö j e n + s o s i a a l i j ä r j e s t ö t + s o s i a a l i k a s v a t t a j a n a + s o s i a a l i k e h i t y k s e n + s o s i a a l i k e h i t y s s t r a t e g i a + s o s i a a l i k e n t ä n + s o s i a a l i k e s k u k s e k s i + s o s i a a l i k e s k u s + s o s i a a l i k e s k u s t e l u + s o s i a a l i k e s k u s t e l u u n + s o s i a a l i k o h e e s i o p o l i t i i k a n + s o s i a a l i k o m i t e a + s o s i a a l i k o m i t e a a + s o s i a a l i k o m i t e a a n + s o s i a a l i k o m i t e a k i n + s o s i a a l i k o m i t e a l l a + s o s i a a l i k o m i t e a l l e + s o s i a a l i k o m i t e a l t a + s o s i a a l i k o m i t e a n + s o s i a a l i k o m i t e a n t a l o u s a r v i o n + s o s i a a l i k o m i t e a s s a + s o s i a a l i k o m i t e a s t a + s o s i a a l i k o n f e r e n s s e j a + s o s i a a l i k r i i s i + s o s i a a l i k r i i s i e n + s o s i a a l i k r i i s i i n + s o s i a a l i k r i i s i k s i + s o s i a a l i k r i i s i n + s o s i a a l i k r i i s i s s ä + s o s i a a l i k r i i s i s t ä + s o s i a a l i k r i i s i t + s o s i a a l i k r i i s i ä + s o s i a a l i k r i t e e r i t + s o s i a a l i k u l u i h i n + s o s i a a l i k u l u i s t a + s o s i a a l i k u l u j a + s o s i a a l i k u l u j e n + s o s i a a l i k u l u t + s o s i a a l i k u m p p a n i e n + s o s i a a l i k u s t a n n u k s e m m e + s o s i a a l i k u s t a n n u k s e t + s o s i a a l i k u s t a n n u k s i a + s o s i a a l i k u s t a n n u k s i a m m e + s o s i a a l i k u s t a n n u k s i i n + s o s i a a l i k u s t a n n u k s i n a + s o s i a a l i k u s t a n n u k s i s t a + s o s i a a l i k u s t a n n u s t e n + s o s i a a l i k y s y m y k s e n + s o s i a a l i k y s y m y k s e t + s o s i a a l i k y s y m y k s i i n + s o s i a a l i k y s y m y k s i l l e + s o s i a a l i k y s y m y k s i s s ä + s o s i a a l i k y s y m y k s i s t ä + s o s i a a l i k y s y m y k s i ä + s o s i a a l i k y s y m y s + s o s i a a l i k y s y m y s t e n + s o s i a a l i k y s y m y s t ä + s o s i a a l i l a i n s ä ä d ä n n ö l l e + s o s i a a l i l a i n s ä ä d ä n n ö l l ä + s o s i a a l i l a i n s ä ä d ä n n ö n + s o s i a a l i l a i n s ä ä d ä n n ö s s ä + s o s i a a l i l a i n s ä ä d ä n n ö s t ä + s o s i a a l i l a i n s ä ä d ä n n ö t + s o s i a a l i l a i n s ä ä d ä n t ö + s o s i a a l i l a i n s ä ä d ä n t ö a s i o i s s a + s o s i a a l i l a i n s ä ä d ä n t ö j e n + s o s i a a l i l a i n s ä ä d ä n t ö ä + s o s i a a l i l a i n s ä ä d ä n t ö ä ä n + s o s i a a l i l a i n s ä ä d ä n t ö ö n + s o s i a a l i l a k i e n + s o s i a a l i l a u s e k e + s o s i a a l i l a u s e k e t t a + s o s i a a l i l a u s e k k e e l l a + s o s i a a l i l a u s e k k e e l l e + s o s i a a l i l a u s e k k e e n + s o s i a a l i l a u s e k k e e s e e n + s o s i a a l i l a u s e k k e e s s a + s o s i a a l i l a u s e k k e e s t a + s o s i a a l i l a u s e k k e e t + s o s i a a l i l a u s e k k e i d e n + s o s i a a l i l a u s e k k e i n a + s o s i a a l i l a u s e k k e i s i i n + s o s i a a l i l a u s e k k e i s t a + s o s i a a l i l a u s e k k e i t a + s o s i a a l i l i b e r a a l i + s o s i a a l i l i b e r a l i s m i + s o s i a a l i l i i t t o a + s o s i a a l i l u k u a + s o s i a a l i l u o k a n + s o s i a a l i l u o k a s t a + s o s i a a l i l u o k a t + s o s i a a l i l u o k i s s a + s o s i a a l i l u o k k a + s o s i a a l i l u o k k a a n + s o s i a a l i l u o k k i a + s o s i a a l i l u o k k i e n + s o s i a a l i l u o k k i i n + s o s i a a l i l u v u n + s o s i a a l i l ä ä k e t i e d e + s o s i a a l i m a k s u i l l a + s o s i a a l i m a k s u i n e e n + s o s i a a l i m a k s u i s t a + s o s i a a l i m a k s u j a + s o s i a a l i m a k s u j e n + s o s i a a l i m a k s u s ä ä n n ö k s i s t ä + s o s i a a l i m a k s u t + s o s i a a l i m a k s u t a a k a n + s o s i a a l i m a l l e i s t a + s o s i a a l i m a l l e j a + s o s i a a l i m a l l i + s o s i a a l i m a l l i a + s o s i a a l i m a l l i a a n + s o s i a a l i m a l l i a m m e + s o s i a a l i m a l l i e n + s o s i a a l i m a l l i i n + s o s i a a l i m a l l i i n s a + s o s i a a l i m a l l i k s i + s o s i a a l i m a l l i l l a + s o s i a a l i m a l l i l l e + s o s i a a l i m a l l i l l e e n + s o s i a a l i m a l l i l t a + s o s i a a l i m a l l i m m e + s o s i a a l i m a l l i n + s o s i a a l i m a l l i n a + s o s i a a l i m a l l i s s a + s o s i a a l i m a l l i s t a + s o s i a a l i m a l l i s t a m m e + s o s i a a l i m a r k k i n a t a l o u d e n + s o s i a a l i m a r k k i n o i d e n + s o s i a a l i m e n o i h i n + s o s i a a l i m e n o i l l a + s o s i a a l i m e n o i l t a + s o s i a a l i m e n o i s s a + s o s i a a l i m e n o i s t a + s o s i a a l i m e n o j a + s o s i a a l i m e n o j e n + s o s i a a l i m e n o m a l l i t + s o s i a a l i m e n o t + s o s i a a l i m i n i s t e r e i d e n + s o s i a a l i m i n i s t e r i e n + s o s i a a l i m i n i s t e r i n + s o s i a a l i m i n i s t e r i t + s o s i a a l i m i n i s t e r i ö i d e n + s o s i a a l i n e u v o j a n a + s o s i a a l i n e u v o s t o + s o s i a a l i n e u v o s t o a + s o s i a a l i n e u v o s t o l l a + s o s i a a l i n e u v o s t o n + s o s i a a l i n e u v o s t o s s a + s o s i a a l i n o r m e i h i m m e + s o s i a a l i n o r m e i h i n + s o s i a a l i n o r m e i l l a + s o s i a a l i n o r m e i l l e + s o s i a a l i n o r m e i s t a + s o s i a a l i n o r m e j a + s o s i a a l i n o r m e j a a n + s o s i a a l i n o r m i e n + s o s i a a l i n o r m i t + s o s i a a l i n ä k ö k o h d a t + s o s i a a l i n ä k ö k o h d i s t a + s o s i a a l i n ä k ö k o h t i a + s o s i a a l i n ä k ö k o h t i e n + s o s i a a l i o h j e l m a + s o s i a a l i o h j e l m a a n + s o s i a a l i o h j e l m a n + s o s i a a l i o h j e l m a n a + s o s i a a l i o h j e l m a s s a + s o s i a a l i o h j e l m a s t a + s o s i a a l i o h j e l m i e n + s o s i a a l i o h j e l m i i n + s o s i a a l i o h j e l m i l l e + s o s i a a l i o h j e l m i s t a + s o s i a a l i o i k e u d e l l i s i a + s o s i a a l i o i k e u d e n + s o s i a a l i o i k e u d e t + s o s i a a l i o i k e u k s i a + s o s i a a l i o i k e u k s i e n + s o s i a a l i o i k e u k s i i n + s o s i a a l i o i k e u k s i s t a + s o s i a a l i o i k e u s + s o s i a a l i o i k e u t e n s a + s o s i a a l i o i k e u t t a + s o s i a a l i o l o j e n + s o s i a a l i o l o t + s o s i a a l i o n g e l m a t + s o s i a a l i o n g e l m i a + s o s i a a l i o n g e l m i e n + s o s i a a l i p a k e t i l l a + s o s i a a l i p a k e t i n + s o s i a a l i p a k e t i s s a + s o s i a a l i p a k e t i s t a + s o s i a a l i p a k e t t i + s o s i a a l i p a k e t t i a + s o s i a a l i p a k e t t i i n + s o s i a a l i p a l v e l u + s o s i a a l i p a l v e l u a l o j a + s o s i a a l i p a l v e l u a l o j e n + s o s i a a l i p a l v e l u d i r e k t i i v i s s ä + s o s i a a l i p a l v e l u i d e n + s o s i a a l i p a l v e l u i h i n + s o s i a a l i p a l v e l u i l l a + s o s i a a l i p a l v e l u i l l e + s o s i a a l i p a l v e l u i n a + s o s i a a l i p a l v e l u i s s a + s o s i a a l i p a l v e l u i s t a + s o s i a a l i p a l v e l u i t a + s o s i a a l i p a l v e l u j a + s o s i a a l i p a l v e l u j e m m e + s o s i a a l i p a l v e l u j e n + s o s i a a l i p a l v e l u j ä r j e s t e l m ä n + s o s i a a l i p a l v e l u l a i t o k s e t + s o s i a a l i p a l v e l u n + s o s i a a l i p a l v e l u n a + s o s i a a l i p a l v e l u t + s o s i a a l i p e d a g o g i i k k a + s o s i a a l i p o l i i t i k o t + s o s i a a l i p o l i i t t i n e n + s o s i a a l i p o l i i t t i s e e n + s o s i a a l i p o l i i t t i s e l l a + s o s i a a l i p o l i i t t i s e l l e + s o s i a a l i p o l i i t t i s e n + s o s i a a l i p o l i i t t i s e n a + s o s i a a l i p o l i i t t i s e s s a + s o s i a a l i p o l i i t t i s e s t a + s o s i a a l i p o l i i t t i s e s t i + s o s i a a l i p o l i i t t i s e t + s o s i a a l i p o l i i t t i s i a + s o s i a a l i p o l i i t t i s i i n + s o s i a a l i p o l i i t t i s i l l a + s o s i a a l i p o l i i t t i s i n + s o s i a a l i p o l i i t t i s i s s a + s o s i a a l i p o l i i t t i s i s t a + s o s i a a l i p o l i i t t i s t a + s o s i a a l i p o l i i t t i s t e n + s o s i a a l i p o l i t i i k a k s i + s o s i a a l i p o l i t i i k a l l a + s o s i a a l i p o l i t i i k a l l e + s o s i a a l i p o l i t i i k a l l e m m e + s o s i a a l i p o l i t i i k a n + s o s i a a l i p o l i t i i k a s s a + s o s i a a l i p o l i t i i k a s t a + s o s i a a l i p o l i t i i k a s t a a n + s o s i a a l i p o l i t i i k a t + s o s i a a l i p o l i t i i k k a + s o s i a a l i p o l i t i i k k a a + s o s i a a l i p o l i t i i k k a a m m e + s o s i a a l i p o l i t i i k k a a n + s o s i a a l i p o l i t i i k k a a n s a + s o s i a a l i p o l i t i i k k a m m e + s o s i a a l i p o l i t i i k k a n a + s o s i a a l i p o l i t i i k k a n e u v o s t o s s a + s o s i a a l i p o l i t i i k k a n s a + s o s i a a l i p o l i t i i k k o i h i n + s o s i a a l i p o l i t i i k k o j a + s o s i a a l i p o l i t i i k k o j a a n + s o s i a a l i p o l i t i i k k o j e m m e + s o s i a a l i p o l i t i i k k o j e n + s o s i a a l i p o l i t i i k o i s s a + s o s i a a l i p o l i t i i k o i s t a + s o s i a a l i p s y k o l o g i a + s o s i a a l i p u o l e l l a + s o s i a a l i p ä ä o m a r a h a s t o a + s o s i a a l i p ö y t ä k i r j a + s o s i a a l i p ö y t ä k i r j a a + s o s i a a l i p ö y t ä k i r j a a n + s o s i a a l i p ö y t ä k i r j a n + s o s i a a l i r a h a s t o + s o s i a a l i r a h a s t o a + s o s i a a l i r a h a s t o a s e t u s t e n + s o s i a a l i r a h a s t o i h i n + s o s i a a l i r a h a s t o i l t a + s o s i a a l i r a h a s t o i s s a + s o s i a a l i r a h a s t o i s t a + s o s i a a l i r a h a s t o j a + s o s i a a l i r a h a s t o j e n + s o s i a a l i r a h a s t o k i n + s o s i a a l i r a h a s t o l l a + s o s i a a l i r a h a s t o l l e + s o s i a a l i r a h a s t o l t a + s o s i a a l i r a h a s t o m m e + s o s i a a l i r a h a s t o n + s o s i a a l i r a h a s t o n k i n + s o s i a a l i r a h a s t o o n + s o s i a a l i r a h a s t o p a k e t i s t a + s o s i a a l i r a h a s t o s s a + s o s i a a l i r a h a s t o s t a + s o s i a a l i r a h a s t o t + s o s i a a l i r a h a s t o v a r o j a + s o s i a a l i r a h a s t o v a r o j e n + s o s i a a l i r a h o i t u s + s o s i a a l i r a k e n t e e n + s o s i a a l i r a k e n t e i s t a + s o s i a a l i r i s k e j ä + s o s i a a l i r y h m i e n + s o s i a a l i r y h m i i n + s o s i a a l i r y h m i l l e + s o s i a a l i r y h m i s s ä + s o s i a a l i r y h m i s t ä + s o s i a a l i r y h m i ä + s o s i a a l i r y h m ä + s o s i a a l i r y h m ä n + s o s i a a l i r y h m ä t + s o s i a a l i s e e n + s o s i a a l i s e k s i + s o s i a a l i s e k t o r e i l l a + s o s i a a l i s e k t o r e i l l e + s o s i a a l i s e k t o r i + s o s i a a l i s e k t o r i a + s o s i a a l i s e k t o r i l l a + s o s i a a l i s e k t o r i l l e + s o s i a a l i s e k t o r i n + s o s i a a l i s e l l a + s o s i a a l i s e l l e + s o s i a a l i s e l t a + s o s i a a l i s e m m a l l a + s o s i a a l i s e m m a n + s o s i a a l i s e m m a s s a + s o s i a a l i s e m m a s t a + s o s i a a l i s e m m i n + s o s i a a l i s e m p a a + s o s i a a l i s e m p a a n + s o s i a a l i s e m p i + s o s i a a l i s e n + s o s i a a l i s e n a + s o s i a a l i s e s s a + s o s i a a l i s e s t a + s o s i a a l i s e t + s o s i a a l i s e t k i n + s o s i a a l i s i a + s o s i a a l i s i i n + s o s i a a l i s i l l e + s o s i a a l i s i n + s o s i a a l i s i n e + s o s i a a l i s i s s a + s o s i a a l i s i s t a + s o s i a a l i s l a u s e k e t t a + s o s i a a l i s o p i m u k s e e n + s o s i a a l i s o p i m u k s e l l a + s o s i a a l i s o p i m u s t a + s o s i a a l i s t a l o u d e l l i s e l l a + s o s i a a l i s t a l o u d e l l i s e n + s o s i a a l i s t a l o u d e l l i s e s t i + s o s i a a l i s t a l o u d e l l i s e t + s o s i a a l i s t a l o u d e l l i s i a + s o s i a a l i s t a l o u d e l l i s t a + s o s i a a l i s t a n d a r d e i s t a + s o s i a a l i s t a n d a r d e j a + s o s i a a l i s t a n d a r d i e n + s o s i a a l i s t a n d a r d i t + s o s i a a l i s t e n + s o s i a a l i s t r a t e g i a a + s o s i a a l i s t r a t e g i a s t a + s o s i a a l i s t u m i s e n + s o s i a a l i s t u m i s p r o s e s s i n + s o s i a a l i s t u m i s p r o s e s s i n s a + s o s i a a l i s u h t e i s i i n + s o s i a a l i s u h t e i s s a + s o s i a a l i s u o j a n + s o s i a a l i s u u n n i t e l m a s t a + s o s i a a l i s u u t t a + s o s i a a l i s ä ä n n ö k s i ä + s o s i a a l i s ä ä n t ö j ä + s o s i a a l i t a l o u d e k s i + s o s i a a l i t a l o u d e n + s o s i a a l i t a l o u d e s s a + s o s i a a l i t a l o u s + s o s i a a l i t a l o u s o h j e l m a + s o s i a a l i t a l o u s t i e t e e n + s o s i a a l i t a l o u t e e n + s o s i a a l i t a l o u t t a + s o s i a a l i t a s o l l a + s o s i a a l i t i e t e e n + s o s i a a l i t i e t e i d e n + s o s i a a l i t i l a n t e e s e e n + s o s i a a l i t o i m e n + s o s i a a l i t o i m i + s o s i a a l i t o i m i a + s o s i a a l i t o i m i e n + s o s i a a l i t o i m i n n a n + s o s i a a l i t o i m i s t o j e n + s o s i a a l i t o i m i s t o n + s o s i a a l i t u e l l a + s o s i a a l i t u e n + s o s i a a l i t u e s t a + s o s i a a l i t u e t + s o s i a a l i t u k e a + s o s i a a l i t u k e e n + s o s i a a l i t u k i + s o s i a a l i t u k i a + s o s i a a l i t u k i e n + s o s i a a l i t u k i i n + s o s i a a l i t u k i j ä r j e s t e l m ä n + s o s i a a l i t u k i j ä r j e s t e l m ä s t ä m m e + s o s i a a l i t u k i p o l i t i i k k a a + s o s i a a l i t u r i s m i s t a + s o s i a a l i t u r v a + s o s i a a l i t u r v a a + s o s i a a l i t u r v a a n + s o s i a a l i t u r v a a n s a + s o s i a a l i t u r v a b u d j e t t e i h i n + s o s i a a l i t u r v a b u d j e t t i a + s o s i a a l i t u r v a d i r e k t i i v e j ä + s o s i a a l i t u r v a e d u i l l a + s o s i a a l i t u r v a e d u i s t a + s o s i a a l i t u r v a e d u t + s o s i a a l i t u r v a e t u i s u u k s i e n + s o s i a a l i t u r v a e t u i s u u k s i i n + s o s i a a l i t u r v a e t u j a + s o s i a a l i t u r v a e t u j e n + s o s i a a l i t u r v a e t u u d e t + s o s i a a l i t u r v a e t u u k s i a + s o s i a a l i t u r v a e t u u k s i a a n + s o s i a a l i t u r v a e t u u k s i a k i n + s o s i a a l i t u r v a e t u u k s i e n + s o s i a a l i t u r v a e t u u k s i l l a + s o s i a a l i t u r v a e t u u k s i s t a + s o s i a a l i t u r v a e t u u s + s o s i a a l i t u r v a e t u u t e n s a + s o s i a a l i t u r v a i n d i k a a t t o r i a + s o s i a a l i t u r v a j ä r j e s t e l m i e m m e + s o s i a a l i t u r v a j ä r j e s t e l m i e n + s o s i a a l i t u r v a j ä r j e s t e l m i e n s ä + s o s i a a l i t u r v a j ä r j e s t e l m i i m m e + s o s i a a l i t u r v a j ä r j e s t e l m i i n + s o s i a a l i t u r v a j ä r j e s t e l m i l l e + s o s i a a l i t u r v a j ä r j e s t e l m i l l e m m e + s o s i a a l i t u r v a j ä r j e s t e l m i l l ä + s o s i a a l i t u r v a j ä r j e s t e l m i s s ä + s o s i a a l i t u r v a j ä r j e s t e l m i s t ä + s o s i a a l i t u r v a j ä r j e s t e l m i s t ä m m e + s o s i a a l i t u r v a j ä r j e s t e l m i s t ä ä n + s o s i a a l i t u r v a j ä r j e s t e l m i ä + s o s i a a l i t u r v a j ä r j e s t e l m i ä m m e + s o s i a a l i t u r v a j ä r j e s t e l m i ä ä n + s o s i a a l i t u r v a j ä r j e s t e l m ä + s o s i a a l i t u r v a j ä r j e s t e l m ä a s e t u k s e n + s o s i a a l i t u r v a j ä r j e s t e l m ä l l e + s o s i a a l i t u r v a j ä r j e s t e l m ä l l ä + s o s i a a l i t u r v a j ä r j e s t e l m ä l t ä + s o s i a a l i t u r v a j ä r j e s t e l m ä m m e + s o s i a a l i t u r v a j ä r j e s t e l m ä m m e k i n + s o s i a a l i t u r v a j ä r j e s t e l m ä n + s o s i a a l i t u r v a j ä r j e s t e l m ä n s ä + s o s i a a l i t u r v a j ä r j e s t e l m ä s s ä + s o s i a a l i t u r v a j ä r j e s t e l m ä s t ä + s o s i a a l i t u r v a j ä r j e s t e l m ä s t ä m m e + s o s i a a l i t u r v a j ä r j e s t e l m ä t + s o s i a a l i t u r v a j ä r j e s t e l m ä ä + s o s i a a l i t u r v a j ä r j e s t e l m ä ä m m e + s o s i a a l i t u r v a j ä r j e s t e l m ä ä n + s o s i a a l i t u r v a j ä r j e s t e l m ä ä n s ä + s o s i a a l i t u r v a j ä r j e s t e l y i h i n + s o s i a a l i t u r v a j ä r j e s t e l y i s t ä + s o s i a a l i t u r v a j ä r j e s t e l y j ä + s o s i a a l i t u r v a j ä r j e s t e l y t + s o s i a a l i t u r v a k o m i t e a + s o s i a a l i t u r v a k o r t t i + s o s i a a l i t u r v a k u l u i s t a + s o s i a a l i t u r v a k u s t a n n u k s i a + s o s i a a l i t u r v a k u s t a n n u k s i s t a + s o s i a a l i t u r v a k y s y m y k s e n + s o s i a a l i t u r v a k y s y m y k s i s s ä + s o s i a a l i t u r v a k y s y m y k s i s t ä + s o s i a a l i t u r v a k y s y m y k s i ä + s o s i a a l i t u r v a k y s y m y s t ä + s o s i a a l i t u r v a l a i n s ä ä d ä n n ö l l e + s o s i a a l i t u r v a l a i n s ä ä d ä n n ö n + s o s i a a l i t u r v a l a i n s ä ä d ä n t ö + s o s i a a l i t u r v a l a i n s ä ä d ä n t ö ä + s o s i a a l i t u r v a l a i n s ä ä d ä n t ö ö n + s o s i a a l i t u r v a l a i t o k s e e n + s o s i a a l i t u r v a l a i t o k s e n + s o s i a a l i t u r v a l a i t o k s e t + s o s i a a l i t u r v a l a i t o k s i a + s o s i a a l i t u r v a l a i t o s t a + s o s i a a l i t u r v a l a i t o s t e n + s o s i a a l i t u r v a l a s k u + s o s i a a l i t u r v a l a u s e k e t t a + s o s i a a l i t u r v a l l a + s o s i a a l i t u r v a l l e + s o s i a a l i t u r v a l t a + s o s i a a l i t u r v a m a k s u i h i n + s o s i a a l i t u r v a m a k s u i n a + s o s i a a l i t u r v a m a k s u i s t a + s o s i a a l i t u r v a m a k s u j a + s o s i a a l i t u r v a m a k s u j a a n + s o s i a a l i t u r v a m a k s u j e n + s o s i a a l i t u r v a m a k s u j ä r j e s t e l m i ä ä n + s o s i a a l i t u r v a m a k s u n s a + s o s i a a l i t u r v a m a k s u t + s o s i a a l i t u r v a m a k s u t a s o + s o s i a a l i t u r v a m a l l e i s t a + s o s i a a l i t u r v a m a l l i + s o s i a a l i t u r v a m a l l i a + s o s i a a l i t u r v a m a l l i e n + s o s i a a l i t u r v a m e n o i h i n + s o s i a a l i t u r v a m e n o i s s a + s o s i a a l i t u r v a m e n o j a + s o s i a a l i t u r v a m e n o j e n + s o s i a a l i t u r v a m e n o t + s o s i a a l i t u r v a m i n i s t e r i + s o s i a a l i t u r v a m m e + s o s i a a l i t u r v a m u o t o o n + s o s i a a l i t u r v a m ä ä r ä r a h a t + s o s i a a l i t u r v a m ä ä r ä r a h o j e n + s o s i a a l i t u r v a m ä ä r ä y k s e t + s o s i a a l i t u r v a m ä ä r ä y k s i ä + s o s i a a l i t u r v a n + s o s i a a l i t u r v a n a + s o s i a a l i t u r v a n k i n + s o s i a a l i t u r v a n o r m e j a + s o s i a a l i t u r v a n s a + s o s i a a l i t u r v a o h j e l m a t + s o s i a a l i t u r v a o h j e l m i a + s o s i a a l i t u r v a o h j e l m i i n + s o s i a a l i t u r v a o i k e u d e l l i s t a + s o s i a a l i t u r v a o i k e u d e t + s o s i a a l i t u r v a o i k e u k s i a + s o s i a a l i t u r v a o i k e u k s i e n + s o s i a a l i t u r v a o i k e u k s i i n + s o s i a a l i t u r v a o i k e u k s i i n s a + s o s i a a l i t u r v a o i k e u k s i s t a + s o s i a a l i t u r v a o i k e u t e n s a + s o s i a a l i t u r v a o n g e l m i i n + s o s i a a l i t u r v a o r g a n i s a a t i o t a + s o s i a a l i t u r v a p a k e t i s s a + s o s i a a l i t u r v a p a l v e l u i h i n + s o s i a a l i t u r v a p a l v e l u i s s a + s o s i a a l i t u r v a p a l v e l u t + s o s i a a l i t u r v a p e r i a a t t e e t + s o s i a a l i t u r v a p e t o k s i a + s o s i a a l i t u r v a p e t o s t e n + s o s i a a l i t u r v a p i i r e i s s ä + s o s i a a l i t u r v a p o l i t i i k a n + s o s i a a l i t u r v a p o l i t i i k a s s a + s o s i a a l i t u r v a p o l i t i i k a s t a + s o s i a a l i t u r v a p o l i t i i k k a + s o s i a a l i t u r v a p o l i t i i k k a a + s o s i a a l i t u r v a p o l i t i i k k a a n + s o s i a a l i t u r v a p o l i t i i k k a m m e + s o s i a a l i t u r v a p o l i t i i k k o j a + s o s i a a l i t u r v a p ö y t ä k i r j a + s o s i a a l i t u r v a r a t k a i s u j e n + s o s i a a l i t u r v a s s a + s o s i a a l i t u r v a s s a a n + s o s i a a l i t u r v a s s a k i n + s o s i a a l i t u r v a s t a + s o s i a a l i t u r v a s t a a n + s o s i a a l i t u r v a s ä ä n n ö k s i ä + s o s i a a l i t u r v a s ä ä n n ö s t e n + s o s i a a l i t u r v a s ä ä n n ö t + s o s i a a l i t u r v a s ä ä n t ö j e n + s o s i a a l i t u r v a s ä ä s t ö j e n + s o s i a a l i t u r v a t a k e e t + s o s i a a l i t u r v a t a k e i t a + s o s i a a l i t u r v a t a s o a + s o s i a a l i t u r v a t a s o j a + s o s i a a l i t u r v a t a s o m m e + s o s i a a l i t u r v a t a s o t + s o s i a a l i t u r v a t i e t o i h i n + s o s i a a l i t u r v a t i e t o j e n + s o s i a a l i t u r v a t i l a n t e e s t a + s o s i a a l i t u r v a t o i m e n p i t e i s t ä + s o s i a a l i t u r v a t o i m e n p i t e i t ä ä n + s o s i a a l i t u r v a t o i m e t + s o s i a a l i t u r v a t o i m i a + s o s i a a l i t u r v a t o i m i i n + s o s i a a l i t u r v a t o i m i s t o n + s o s i a a l i t u r v a t u n n u k s e n + s o s i a a l i t u r v a t u n n u k s e n s a + s o s i a a l i t u r v a t y y p p i s t ä + s o s i a a l i t u r v a v a k u u t u s j ä r j e s t e l m i e n + s o s i a a l i t u r v a v a r o j a + s o s i a a l i t u r v a v a r o j e n + s o s i a a l i t u r v a v e l v o i t t e e t + s o s i a a l i t u r v a v e l v o i t t e i d e n + s o s i a a l i t u r v a v e l v o i t t e i t a a n + s o s i a a l i t u r v a v e l v o l l i s u u d e n + s o s i a a l i t u r v a v e r k k o j a + s o s i a a l i t u r v a v e r k k o j e n + s o s i a a l i t u r v a v e r k o l l e + s o s i a a l i t u r v a v e r k o n + s o s i a a l i t u r v a v e r k o s t a + s o s i a a l i t u r v a v e r k o s t o j a + s o s i a a l i t u r v a v i r a n o m a i s i l t a + s o s i a a l i t u r v a v i r a n o m a i s t e n + s o s i a a l i t u r v a v i r a s t o j e n + s o s i a a l i t u r v i n e e n + s o s i a a l i t u t k i m u k s e e n + s o s i a a l i t y ö + s o s i a a l i t y ö k s i + s o s i a a l i t y ö n a l a + s o s i a a l i t y ö n t e k i j ä n + s o s i a a l i t y ö n t e k i j ä t + s o s i a a l i t y ö n t e k i j ä ä + s o s i a a l i t y ö n t e k i j ö i d e n + s o s i a a l i t y ö n t e k i j ö i l l e + s o s i a a l i t y ö n t e k i j ö i t ä + s o s i a a l i t y ö t ä + s o s i a a l i u n i o n i a + s o s i a a l i u n i o n i l l a + s o s i a a l i u n i o n i n + s o s i a a l i u u d i s t u s t e n + s o s i a a l i v a i k u t u k s i a + s o s i a a l i v a k u u k s i a + s o s i a a l i v a k u u k s i e n + s o s i a a l i v a k u u t u k s e e n + s o s i a a l i v a k u u t u k s e n + s o s i a a l i v a k u u t u k s e s s a + s o s i a a l i v a k u u t u k s e s t a + s o s i a a l i v a k u u t u k s e t + s o s i a a l i v a k u u t u k s i i n + s o s i a a l i v a k u u t u k s i l l a + s o s i a a l i v a k u u t u k s i s s a + s o s i a a l i v a k u u t u s + s o s i a a l i v a k u u t u s a s i a k i r j o j a + s o s i a a l i v a k u u t u s j ä r j e s t e l m i e n + s o s i a a l i v a k u u t u s j ä r j e s t e l m i ä + s o s i a a l i v a k u u t u s j ä r j e s t e l m ä + s o s i a a l i v a k u u t u s j ä r j e s t e l m ä n + s o s i a a l i v a k u u t u s j ä r j e s t e l m ä t + s o s i a a l i v a k u u t u s j ä r j e s t e l m ä ä + s o s i a a l i v a k u u t u s l a i t o k s e t + s o s i a a l i v a k u u t u s l a i t o s t e n + s o s i a a l i v a k u u t u s m a k s u i s s a + s o s i a a l i v a k u u t u s m a k s u j a + s o s i a a l i v a k u u t u s m a k s u n s a + s o s i a a l i v a k u u t u s m a k s u t + s o s i a a l i v a k u u t u s o i k e u d e l l i s e n + s o s i a a l i v a k u u t u s o i k e u k s i i n s a + s o s i a a l i v a k u u t u s t a + s o s i a a l i v a l i o k u n n a l l e + s o s i a a l i v a l i o k u n n a l t a + s o s i a a l i v a l i o k u n n a n + s o s i a a l i v a l i o k u n n a s s a + s o s i a a l i v a l i o k u n t a + s o s i a a l i v a l i o k u n t a a + s o s i a a l i v a l i o k u n t a a n + s o s i a a l i v a l t i o + s o s i a a l i v a l t i o k s i + s o s i a a l i v a l t i o n + s o s i a a l i v a l t i o s t a + s o s i a a l i v a l t i o t a + s o s i a a l i v a r o j a + s o s i a a l i v a s t a a v a t + s o s i a a l i v e r k o s t o j e n + s o s i a a l i v e r o k u s t a n n u k s i a + s o s i a a l i v i r a n o m a i s i i n + s o s i a a l i v i r a n o m a i s i l l e + s o s i a a l i v i r a n o m a i s t e n + s o s i a a l i v i r a s t o s s a + s o s i a a l i y h t e i s t y ö t ä + s o s i a l i d e m o k r a a t e i l l a + s o s i a l i d e m o k r a a t e i l l e + s o s i a l i d e m o k r a a t e i s t a + s o s i a l i d e m o k r a a t i t + s o s i a l i d e m o k r a a t t e i n a + s o s i a l i d e m o k r a a t t e j a + s o s i a l i d e m o k r a a t t i a + s o s i a l i d e m o k r a a t t i e n + s o s i a l i d e m o k r a a t t i j ä s e n t e n + s o s i a l i d e m o k r a a t t i k o l l e g a n i + s o s i a l i d e m o k r a a t t i n a i s e t + s o s i a l i d e m o k r a a t t i s e e n + s o s i a l i d e m o k r a a t t i s e l l a + s o s i a l i d e m o k r a a t t i s e l l e + s o s i a l i d e m o k r a a t t i s e l t a + s o s i a l i d e m o k r a a t t i s e m m a k s i + s o s i a l i d e m o k r a a t t i s e n + s o s i a l i d e m o k r a a t t i s e s s a + s o s i a l i d e m o k r a a t t i s e s t a + s o s i a l i d e m o k r a a t t i s e t + s o s i a l i d e m o k r a a t t i s t e n + s o s i a l i s a a t i o t a p a + s o s i a l i s m i a + s o s i a l i s m i i n + s o s i a l i s m i n + s o s i a l i s m i s t a + s o s i a l i s o i m a l l a + s o s i a l i s o i n t i p o l i t i i k k a + s o s i a l i s t e i h i n + s o s i a l i s t e i h i n k a a n + s o s i a l i s t e i l t a + s o s i a l i s t e i n + s o s i a l i s t e j a + s o s i a l i s t i a a t t e e n + s o s i a l i s t i b l o k i n + s o s i a l i s t i b l o k k i a + s o s i a l i s t i d i k t a a t t o r i a + s o s i a l i s t i d i k t a t u u r i n + s o s i a l i s t i e d u s t a j a + s o s i a l i s t i e d u s t a j a t + s o s i a l i s t i e d u s t a j i e n + s o s i a l i s t i e n + s o s i a l i s t i e n e m m i s t ö + s o s i a l i s t i e n e m m i s t ö n + s o s i a l i s t i h a l l i n n o n + s o s i a l i s t i h a l l i n n o t + s o s i a l i s t i h a l l i n t o + s o s i a l i s t i h a l l i t u k s e l l e + s o s i a l i s t i h a l l i t u k s e l t a + s o s i a l i s t i h a l l i t u k s e n + s o s i a l i s t i h a l l i t u k s e n s a + s o s i a l i s t i h a l l i t u k s e s s a + s o s i a l i s t i h a l l i t u k s e s t a + s o s i a l i s t i h a l l i t u k s e t + s o s i a l i s t i h a l l i t u k s i a + s o s i a l i s t i h a l l i t u k s i s s a + s o s i a l i s t i h a l l i t u k s i s t a + s o s i a l i s t i h a l l i t u s + s o s i a l i s t i h a l l i t u s k i n + s o s i a l i s t i h a l l i t u s t a + s o s i a l i s t i h a l l i t u s t e n + s o s i a l i s t i h e r r o j e n s a + s o s i a l i s t i j o h t a j a + s o s i a l i s t i j o h t a j a t + s o s i a l i s t i j o h t o i s t a + s o s i a l i s t i j ä r j e s t ö + s o s i a l i s t i j ä s e n + s o s i a l i s t i j ä s e n e m m e + s o s i a l i s t i j ä s e n e n + s o s i a l i s t i j ä s e n e t + s o s i a l i s t i j ä s e n i e n + s o s i a l i s t i j ä s e n i l l ä + s o s i a l i s t i j ä s e n t e n + s o s i a l i s t i j ä s e n t ä + s o s i a l i s t i k o l l e g a + s o s i a l i s t i k o l l e g a a + s o s i a l i s t i k o l l e g a a m m e + s o s i a l i s t i k o l l e g a a n i + s o s i a l i s t i k o l l e g a m m e + s o s i a l i s t i k o l l e g a n i + s o s i a l i s t i k o l l e g a n s a + s o s i a l i s t i k o l l e g a t + s o s i a l i s t i k o l l e g o i d e m m e + s o s i a l i s t i k o l l e g o i d e n i + s o s i a l i s t i k o l l e g o i h i m m e + s o s i a l i s t i k o l l e g o j a m m e + s o s i a l i s t i k o l l e g o j a n i + s o s i a l i s t i k o l l e g o j e m m e + s o s i a l i s t i k o l l e g o j e n + s o s i a l i s t i k o l l e g o j e n i + s o s i a l i s t i k o l l e g o j e n s a + s o s i a l i s t i k u m p p a n i m m e + s o s i a l i s t i l a k i + s o s i a l i s t i l i b e r a a l i + s o s i a l i s t i l i i k e + s o s i a l i s t i l i i k k e e s e e n + s o s i a l i s t i l i i t t o + s o s i a l i s t i l i i t t o l a i s t e n s a + s o s i a l i s t i m a i d e n + s o s i a l i s t i m a i l l a + s o s i a l i s t i m a i s s a + s o s i a l i s t i m i n i s t e r i + s o s i a l i s t i m i n i s t e r i n + s o s i a l i s t i n a + s o s i a l i s t i o p p o s i t i o n + s o s i a l i s t i p e r h e e n + s o s i a l i s t i p i i r e i s s ä + s o s i a l i s t i p o l i i t i k k o + s o s i a l i s t i p o l i i t i k k o a + s o s i a l i s t i p o l i t i i k k o j e n + s o s i a l i s t i p u o l u e + s o s i a l i s t i p u o l u e e l l a + s o s i a l i s t i p u o l u e e l l e + s o s i a l i s t i p u o l u e e n + s o s i a l i s t i p u o l u e e n i + s o s i a l i s t i p u o l u e e s e e n + s o s i a l i s t i p u o l u e e s t a + s o s i a l i s t i p u o l u e i s t a + s o s i a l i s t i p u o l u e k a a n + s o s i a l i s t i p u o l u e t t a + s o s i a l i s t i p u o l u e t t a a n + s o s i a l i s t i p ä ä m i e s + s o s i a l i s t i p ä ä m i n i s t e r i n + s o s i a l i s t i r y h m ä + s o s i a l i s t i r y h m ä l l e + s o s i a l i s t i r y h m ä l l ä + s o s i a l i s t i r y h m ä l t ä + s o s i a l i s t i r y h m ä m m e + s o s i a l i s t i r y h m ä n + s o s i a l i s t i r y h m ä n i + s o s i a l i s t i r y h m ä n ä + s o s i a l i s t i r y h m ä s s ä + s o s i a l i s t i r y h m ä s t ä + s o s i a l i s t i r y h m ä t + s o s i a l i s t i r y h m ä ä + s o s i a l i s t i r y h m ä ä n + s o s i a l i s t i s e k s i + s o s i a l i s t i s e m p i a + s o s i a l i s t i s e n + s o s i a l i s t i s e s s a + s o s i a l i s t i s e s t a + s o s i a l i s t i s i a + s o s i a l i s t i s t e n + s o s i a l i s t i t + s o s i a l i s t i t o v e r e i l l e e n + s o s i a l i s t i t o v e r e i l l e n i + s o s i a l i s t i t o v e r e i t a a n + s o s i a l i s t i t o v e r i e n i + s o s i a l i s t i v a l l a n k u m o u k s e l l i n e n + s o s i a l i s t i v a l t i o i d e n + s o s i a l i s t i v a l t i o i s s a + s o s i a l i s t i v a l t i o i s t a + s o s i a l i s t i v a l t i o i t a + s o s i a l i s t i v a l t u u s k u n n a n + s o s i a l i s t i v a l t u u s k u n t a + s o s i a l i s t i v a l t u u s k u n t a a + s o s i a l i s t i v o i t t o i n e n + s o s i a l i s t i y s t ä v i i n i + s o s i a l i s t i y s t ä v i l l e m m e + s o s i a l i s t i y s t ä v i l l e n n e + s o s i a l i s t i y s t ä v i s t ä n i + s o s i a l i s t i y s t ä v ä m m e + s o s i a l i s t i y s t ä v ä n i + s o s i o e k o n o m i s e e n + s o s i o e k o n o m i s e l l a + s o s i o e k o n o m i s e l l e + s o s i o e k o n o m i s e l t a + s o s i o e k o n o m i s e l t a k i n + s o s i o e k o n o m i s e n + s o s i o e k o n o m i s e n a + s o s i o e k o n o m i s e s s a + s o s i o e k o n o m i s e s t a + s o s i o e k o n o m i s e s t i + s o s i o e k o n o m i s e t + s o s i o e k o n o m i s i a + s o s i o e k o n o m i s i i n + s o s i o e k o n o m i s i l l a + s o s i o e k o n o m i s i l l e + s o s i o e k o n o m i s i l t a + s o s i o e k o n o m i s i n + s o s i o e k o n o m i s i n a + s o s i o e k o n o m i s i s s a + s o s i o e k o n o m i s i s t a + s o s i o e k o n o m i s t a + s o s i o e k o n o m i s t e n + s o s i o l o g i e n + s o t a a + s o t a a n + s o t a a n s a + s o t a b u d j e t t i a + s o t a e l o k u v a + s o t a e l ä k k e e t + s o t a h a r j o i t t e l u + s o t a h a r j o i t u k s e e n + s o t a h a r j o i t u k s e s s a + s o t a h a r j o i t u k s e s t a + s o t a h a r j o i t u k s e t + s o t a h a r j o i t u k s i s t a + s o t a h a r j o i t u s + s o t a h a r j o i t u s s u u n n i t e l m a n s a + s o t a h a r j o i t u s t e n + s o t a h e r r o i s t a + s o t a h e r r o j e n + s o t a h e v o n e n + s o t a h i s t o r i a + s o t a h i s t o r i a n + s o t a h u l l u + s o t a h u u d o k s i + s o t a h u u t o + s o t a h u u t o j a + s o t a h u u t o j e n + s o t a j o u k k o i h i n + s o t a j o u k k o j a + s o t a j o u k k o j e n + s o t a j o u k o i l l a + s o t a j o u k o i s t a + s o t a j o u k o n + s o t a j o u k o t + s o t a k a b i n e t i k s i k i n + s o t a k a p a s i t e e t t i a + s o t a k a s s a a n + s o t a k e i n o j a + s o t a k i r j a l l i s u u s + s o t a k i r j e e n v a i h t a j a + s o t a k i r v e e n + s o t a k i r v e e n s ä + s o t a k l a s s i k k o a + s o t a k o a l i t i o l l e e n + s o t a k o i r a + s o t a k o m i s s a a r i + s o t a k o m m u n i s m i + s o t a k o n e + s o t a k o n e i s t o + s o t a k o n e i s t o a + s o t a k o n e i s t o n + s o t a k o n e i s t o n s a + s o t a k o n e i s t o o n + s o t a k o n f l i k t e i s t a + s o t a k o r k e a k o u l u + s o t a k o r v a u k s e t + s o t a k o r v a u s + s o t a k o r v a u s t e n + s o t a l a i n + s o t a l a i v o i l l a + s o t a l a i v o i s t a + s o t a l a i v o j a + s o t a l a k i + s o t a l a k i a + s o t a l a p s e n a + s o t a l a p s e t + s o t a l e l u j a + s o t a l e l u j e n + s o t a l i i t t o o n + s o t a m a f i a t + s o t a m a r s a l k k a + s o t a m e n t a l i t e e t t i + s o t a m i n i s t e r i n e u v o s t o + s o t a m i n i s t e r i ä + s o t a m u i s t e l m i s s a + s o t a m u i s t o m e r k i n + s o t a m u i s t o m e r k k i + s o t a m u s e o + s o t a m u s e o n + s o t a n a + s o t a n e u v o s t o + s o t a n e u v o s t o n + s o t a n o r s u + s o t a n ä y t t ä m ö i l l e + s o t a n ä y t t ä m ö l l ä + s o t a o i k e u d e n + s o t a o i k e u d e n k ä y n n i n + s o t a o i k e u d e s s a + s o t a o i k e u d e t + s o t a o i k e u s + s o t a o i k e u s e h d o t u s + s o t a o i k e u t e e n + s o t a o p e r a a t i o i t a a n + s o t a o p e r a a t i o n + s o t a p a k o l a i n e n + s o t a p a k o l a i s e t + s o t a p a k o l a i s i l l e + s o t a p a k o l a i s i s t a + s o t a p a k o l a i s t a + s o t a p a k o l a i s t e n + s o t a p a l v e l u k s e n + s o t a p e l i + s o t a p o l i i s i + s o t a p o l i t i i k k a a + s o t a p o n n i s t u k s e t + s o t a p o n n i s t u k s i i n + s o t a p r o p a g a n d a a + s o t a p r o p a g a n d a l l a + s o t a p r o p a g a n d a n a + s o t a p s y k o o s i + s o t a p ä ä l l i k ö i d e n + s o t a p ä ä l l i k ö t + s o t a r e t o r i i k a n + s o t a r i k o k s e e n + s o t a r i k o k s e k s i + s o t a r i k o k s e n a + s o t a r i k o k s e s t a + s o t a r i k o k s e t + s o t a r i k o k s i a + s o t a r i k o k s i e n + s o t a r i k o k s i i n + s o t a r i k o k s i k s i + s o t a r i k o k s i l l a + s o t a r i k o k s i l l e + s o t a r i k o k s i l t a + s o t a r i k o k s i n a + s o t a r i k o k s i s s a + s o t a r i k o k s i s t a + s o t a r i k o l l i n e n + s o t a r i k o l l i s e e n + s o t a r i k o l l i s e l l e + s o t a r i k o l l i s e m m e + s o t a r i k o l l i s e n + s o t a r i k o l l i s e n a + s o t a r i k o l l i s e n s a + s o t a r i k o l l i s e s t a + s o t a r i k o l l i s e t + s o t a r i k o l l i s i a + s o t a r i k o l l i s i i n + s o t a r i k o l l i s i k s i + s o t a r i k o l l i s i l l a + s o t a r i k o l l i s i l l e + s o t a r i k o l l i s i l t a + s o t a r i k o l l i s i n a + s o t a r i k o l l i s i s t a + s o t a r i k o l l i s t a + s o t a r i k o l l i s t e n + s o t a r i k o s + s o t a r i k o s l a k i u u d i s t u k s e s t a + s o t a r i k o s o i k e u d e n k ä y n n e i s s ä + s o t a r i k o s o i k e u d e n k ä y n n i t + s o t a r i k o s o i k e u d e n k ä y n t e i h i n + s o t a r i k o s s y y t t e i s t ä + s o t a r i k o s s y y t t ä j i l l e + s o t a r i k o s s y y t t ä j i ä + s o t a r i k o s t a + s o t a r i k o s t e n + s o t a r i k o s t u o m i o i s t u i m e e n + s o t a r i k o s t u o m i o i s t u i m e l l a + s o t a r i k o s t u o m i o i s t u i m e n + s o t a r i k o s t u o m i o i s t u i m e s s a + s o t a r i k o s t u o m i o i s t u i m e s t a + s o t a r i k o s t u o m i o i s t u i m i a + s o t a r i k o s t u o m i o i s t u i m i s s a + s o t a r i k o s t u o m i o i s t u i n + s o t a r i k o s t u o m i o i s t u i n t a + s o t a r i k o s t u o m i o i s t u i n t e n + s o t a r i k o s t u t k i m u k s i s s a + s o t a r i k o s v ä i t t e i d e n + s o t a r i n t a m a l l e + s o t a r i n t a m i e n + s o t a s a a l i i n + s o t a s a a l i s t a + s o t a s a i r a a l a + s o t a s a l a i s u u d e t + s o t a s a l a i s u u k s i a + s o t a s a t a m a n + s o t a s k e n a a r i o + s o t a s k e n a a r i o i d e n + s o t a s k e n a a r i o i t a + s o t a s t r a t e g i a l l e + s o t a s t r a t e g i a n a + s o t a s t r a t e g i a s t a + s o t a s t r a t e g i o i t a + s o t a s u u n n i t e l m a + s o t a s u u n n i t e l m a t + s o t a s u u n n i t e l m i a + s o t a s y y l l i s y y s k y s y m y k s e t + s o t a t a k t i i k k a n a + s o t a t a k t i i k o i s t a + s o t a t a l o u t t a + s o t a t a n t e r e e l l a + s o t a t a n t e r e i l t a + s o t a t a p a h t u m i s t a + s o t a t a r k o i t u k s i i n + s o t a t a r v i k e h a n k i n n o i s t a + s o t a t a r v i k e k a u p p a + s o t a t a r v i k e r a h a a + s o t a t a r v i k e t e o l l i s u u d e l l a + s o t a t a r v i k e t e o l l i s u u d e n + s o t a t a r v i k e t e o l l i s u u d e s s a + s o t a t a r v i k e t e o l l i s u u s + s o t a t a r v i k e t e o l l i s u u t e e n + s o t a t a r v i k e t e o l l i s u u t t a + s o t a t a r v i k e v i e n t i ä + s o t a t a r v i k k e e t + s o t a t a r v i k k e i d e n + s o t a t a r v i k k e i s i i n + s o t a t a r v i k k e i t a + s o t a t e k n i i k k a a + s o t a t e k n i i k o i d e n + s o t a t e k n i i k o i h i n + s o t a t e k n o l o g i a a + s o t a t e k n o l o g i a n + s o t a t e k n o l o g i a s t a + s o t a t e o l l i n e n + s o t a t e o l l i s e t + s o t a t e o l l i s u u d e l l e + s o t a t e o l l i s u u d e n + s o t a t e o l l i s u u d e s t a + s o t a t e o l l i s u u s + s o t a t e o l l i s u u s y h t e i s ö k s i + s o t a t e o l l i s u u s y r i t y s + s o t a t e o l l i s u u t e e n + s o t a t e o l l i s u u t t a + s o t a t i e d e + s o t a t i l a + s o t a t i l a a + s o t a t i l a l a i l l a + s o t a t i l a l a i n + s o t a t i l a l a i s t a + s o t a t i l a l a k e j a + s o t a t i l a l a k i + s o t a t i l a n + s o t a t i l a n n e + s o t a t i l a n n e t t a + s o t a t i l a n t e e n + s o t a t i l a n t e e s s a + s o t a t i l a n t e e s t a + s o t a t i l a n t e i s i i n + s o t a t i l a n t e i s s a + s o t a t i l a n t e i s t a + s o t a t i l a s s a + s o t a t i l a s t a + s o t a t o i m e n a + s o t a t o i m e t + s o t a t o i m i + s o t a t o i m i a + s o t a t o i m i a l u e i d e n + s o t a t o i m i a l u e i l l a + s o t a t o i m i a l u e i l t a + s o t a t o i m i a l u e t t a + s o t a t o i m i e n + s o t a t o i m i i n + s o t a t o i m i k s i + s o t a t o i m i l l a + s o t a t o i m i l l e + s o t a t o i m i n + s o t a t o i m i n t a a + s o t a t o i m i s s a + s o t a t o i m i s t a + s o t a t u o m i o i s t u i m e e n + s o t a t u o m i o i s t u i m e n + s o t a t u o m i o i s t u i m e s s a + s o t a t u o m i o i s t u i m e t + s o t a t u o m i o i s t u i m i a + s o t a t u o m i o i s t u i m i i n + s o t a t u o m i o i s t u i m i l l e + s o t a t u o m i o i s t u i m i s s a + s o t a t u o m i o i s t u i m i s t a + s o t a t u o m i o i s t u i n j ä r j e s t e l m ä n + s o t a t u o m i o i s t u i n t e n + s o t a v a a t i m u k s i a + s o t a v a h i n g o t + s o t a v a l m i s t e l u j a + s o t a v a l m i s t e l u j e n + s o t a v a l m i s t e l u t + s o t a v a n g e i k s i + s o t a v a n g e i l l e + s o t a v a n g i l l a + s o t a v a n g i n + s o t a v a n g i t + s o t a v a n k e i n a + s o t a v a n k e j a + s o t a v a n k i + s o t a v a n k i a + s o t a v a n k i e n + s o t a v a n k i n a + s o t a v a r o j a a n + s o t a v a r u s t e l u e t t e l o + s o t a v a r u s t e l u t + s o t a v a s a r a + s o t a v a u n u t + s o t a v e n t o + s o t a v e r o m e r k k i + s o t a v e t e r a a n e i l l e + s o t a v e t e r a a n e j a + s o t a v e t e r a a n i e n + s o t a v e t e r a a n i n + s o t a v i i k o n + s o t a v o i m a + s o t a v o i m a a + s o t a v o i m a m m e + s o t a v o i m a n s a + s o t a v o i m a t + s o t a v o i m i a + s o t a v o i m i a a n + s o t a v o i m i a h a n + s o t a v o i m i e n + s o t a v o i m i e n s a + s o t a v o i m i i n + s o t a v o i m i l l a + s o t a v o i m i l l e + s o t a v o i m i l l e m m e + s o t a v o i m i s s a + s o t a v o i m i s t a + s o t a v u o d e n + s o t a v y ö h y k e + s o t a v y ö h y k k e e s e e n + s o t a v ä k i + s o t h o t + s o t i a + s o t i e n + s o t i e n j ä l k e i s e n + s o t i i + s o t i i n + s o t i l a a l l i s e e n + s o t i l a a l l i s e l l a + s o t i l a a l l i s e l l e + s o t i l a a l l i s e n + s o t i l a a l l i s e n a + s o t i l a a l l i s e s s a + s o t i l a a l l i s e s t a + s o t i l a a l l i s e t + s o t i l a a l l i s i a + s o t i l a a l l i s i i n + s o t i l a a l l i s i l l a + s o t i l a a l l i s i l l e + s o t i l a a l l i s i n + s o t i l a a l l i s i n a + s o t i l a a l l i s i s s a + s o t i l a a l l i s i s t a + s o t i l a a l l i s t a a + s o t i l a a l l i s t a m i s e l l e + s o t i l a a l l i s t a m i s e s t a + s o t i l a a l l i s t a m i s t a + s o t i l a a l l i s t e n + s o t i l a a n + s o t i l a a n s a + s o t i l a a t + s o t i l a i d e m m e + s o t i l a i d e n + s o t i l a i d e n k i n + s o t i l a i k s i + s o t i l a i l l e + s o t i l a i s i i n + s o t i l a i s t a + s o t i l a i t a + s o t i l a s a j o n e u v o a + s o t i l a s a k a t e m i a + s o t i l a s a l a + s o t i l a s a l a l l a + s o t i l a s a l u e + s o t i l a s a l u e e k s i + s o t i l a s a l u e e l l a + s o t i l a s a l u e e l l e + s o t i l a s a l u e e t + s o t i l a s a l u e i d e n + s o t i l a s a l u e i k s i + s o t i l a s a l u e i t a + s o t i l a s a l u e t t a + s o t i l a s a p u a + s o t i l a s a r t i k l a t + s o t i l a s a r v o + s o t i l a s a s e i t a + s o t i l a s a s e m a l t a + s o t i l a s a s e t u s + s o t i l a s a s i a k i r j o i l l e + s o t i l a s a s i a k i r j o j a + s o t i l a s a s i a n t u n t i j a n a + s o t i l a s a s i a n t u n t i j a t + s o t i l a s a s i a n t u n t i j o i d e n + s o t i l a s a s i a n t u n t i j o i l l e + s o t i l a s a s i a n t u n t i j o i s t a + s o t i l a s a s i a t + s o t i l a s a s i o i h i n + s o t i l a s a s i o i s s a + s o t i l a s a s i o i s t a + s o t i l a s a s i o i t a + s o t i l a s a v u l l e + s o t i l a s a v u n + s o t i l a s a v u s t a a n + s o t i l a s a v u s t u k s e n + s o t i l a s b u d j e t i n + s o t i l a s b u d j e t i s t a + s o t i l a s b u d j e t t i a a n + s o t i l a s d i k t a a t t o r i + s o t i l a s d i k t a a t t o r i n a + s o t i l a s d i k t a a t t o r i t + s o t i l a s d i k t a t u u r e i h i n + s o t i l a s d i k t a t u u r e i k s i + s o t i l a s d i k t a t u u r e i s t a + s o t i l a s d i k t a t u u r e j a + s o t i l a s d i k t a t u u r i + s o t i l a s d i k t a t u u r i a + s o t i l a s d i k t a t u u r i e n + s o t i l a s d i k t a t u u r i h a l l i n t o + s o t i l a s d i k t a t u u r i i n + s o t i l a s d i k t a t u u r i l l e + s o t i l a s d i k t a t u u r i n + s o t i l a s d i k t a t u u r i s t a + s o t i l a s d i k t a t u u r i t + s o t i l a s d o k t r i i n i a + s o t i l a s e d u s t a j a + s o t i l a s e d u s t a j i a + s o t i l a s e d u s t a j i e n s a + s o t i l a s e l ä m ä n + s o t i l a s e s i k u n n a n + s o t i l a s e s i k u n n a s s a + s o t i l a s e s i k u n n a s t a + s o t i l a s e s i k u n t a + s o t i l a s e s i k u n t a a + s o t i l a s h a l l i n n o l l a + s o t i l a s h a l l i n n o l l e + s o t i l a s h a l l i n n o n + s o t i l a s h a l l i n n o s s a + s o t i l a s h a l l i n n o s t a + s o t i l a s h a l l i n t o + s o t i l a s h a l l i n t o a + s o t i l a s h a l l i n t o j e n + s o t i l a s h a l l i n t o o n + s o t i l a s h a l l i t s i j a n + s o t i l a s h a l l i t s i j o i d e n + s o t i l a s h a l l i t u k s e n + s o t i l a s h a l l i t u k s e s t a + s o t i l a s h a l l i t u k s i s t a + s o t i l a s h a l l i t u s + s o t i l a s h a l l i t u s t a + s o t i l a s h a l l i t u s t e n + s o t i l a s h a n k k e e t + s o t i l a s h a n k k e i d e n + s o t i l a s h a r j o i t u k s e s s a + s o t i l a s h a r j o i t u k s i a + s o t i l a s h a r j o i t u s t e n + s o t i l a s h a u t a u s m a a + s o t i l a s h a u t a u s m a a l l e + s o t i l a s h a u t a u s m a a t + s o t i l a s h a u t a u s m a i l l a + s o t i l a s h e l i k o p t e r e i t a + s o t i l a s h e l i k o p t e r e j a + s o t i l a s h e n k i l ö i d e n + s o t i l a s h e n k i l ö i t ä + s o t i l a s h e n k i l ö k u n n a l l e + s o t i l a s h e n k i l ö k u n t a + s o t i l a s h e n k i l ö k u n t a m m e + s o t i l a s h e n k i l ö l l ä + s o t i l a s h e n k i l ö s t ö + s o t i l a s h e n k i l ö s t ö l l e + s o t i l a s h e n k i l ö s t ö l l ä + s o t i l a s h e n k i l ö s t ö l t ä + s o t i l a s h e n k i l ö s t ö n + s o t i l a s h e n k i l ö s t ö ä + s o t i l a s h e n k i l ö s t ö ö n + s o t i l a s h e n k i l ö t + s o t i l a s h e n k i l ö ä + s o t i l a s h i e r a r k i a a n + s o t i l a s h i e r a r k i a s s a + s o t i l a s h y ö k k ä y k s i l t ä + s o t i l a s h y ö k k ä y s t ä + s o t i l a s i l m a i l u a + s o t i l a s i l m a i l u l l e + s o t i l a s i l m a i l u n + s o t i l a s i l m a t i l a n + s o t i l a s i n t e r v e n t i o + s o t i l a s i n t e r v e n t i o i d e n + s o t i l a s i s k u + s o t i l a s i s k u i l l a + s o t i l a s i s k u n + s o t i l a s i s k u t + s o t i l a s j o h d o l l a + s o t i l a s j o h d o n + s o t i l a s j o h t a j a + s o t i l a s j o h t a j a n + s o t i l a s j o h t a j a t + s o t i l a s j o h t a j i a + s o t i l a s j o h t a j i e n + s o t i l a s j o h t a j i l l e + s o t i l a s j o h t o + s o t i l a s j o h t o a + s o t i l a s j o h t o i s e n + s o t i l a s j o h t o o n + s o t i l a s j o h t o r a k e n t e e s t a + s o t i l a s j o u k k i o n + s o t i l a s j o u k k o + s o t i l a s j o u k k o i h i n s a + s o t i l a s j o u k k o j a + s o t i l a s j o u k k o j a a n + s o t i l a s j o u k k o j e n + s o t i l a s j o u k k o j e n s a + s o t i l a s j o u k k o n s a + s o t i l a s j o u k o i l l a + s o t i l a s j o u k o i s t a + s o t i l a s j o u k o l l e + s o t i l a s j o u k o s t a + s o t i l a s j o u k o t + s o t i l a s j u n t a l l a + s o t i l a s j u n t a l l e + s o t i l a s j u n t a l t a + s o t i l a s j u n t a n + s o t i l a s j u n t a s t a + s o t i l a s j u n t a t + s o t i l a s j u n t i s t a + s o t i l a s j u n t t a + s o t i l a s j u n t t a a + s o t i l a s j u n t t a a n + s o t i l a s j u n t t i e n + s o t i l a s j ä r j e s t e l m i e n + s o t i l a s j ä r j e s t e l m ä + s o t i l a s j ä r j e s t e l m ä t + s o t i l a s j ä r j e s t y k s e l l ä + s o t i l a s j ä r j e s t ö i h i n + s o t i l a s j ä r j e s t ö n + s o t i l a s k a a p p a u k s e n + s o t i l a s k a a p p a u s t a + s o t i l a s k a a p p a u s t e n + s o t i l a s k a l u s t o a + s o t i l a s k a l u s t o n + s o t i l a s k a l u s t o o n + s o t i l a s k a p a s i t e e t i n + s o t i l a s k a p a s i t e e t t i + s o t i l a s k a p a s i t e e t t i a + s o t i l a s k a p a s i t e e t t i i n + s o t i l a s k a p i n a a n + s o t i l a s k a p i n a n + s o t i l a s k a r t t o i h i n + s o t i l a s k a s t i n + s o t i l a s k e i n o i n + s o t i l a s k e i n o j e n + s o t i l a s k e n r a a l i e n + s o t i l a s k e n t ä t + s o t i l a s k i v ä ä r i + s o t i l a s k o h t a i s e t + s o t i l a s k o h t e i d e n + s o t i l a s k o h t e i s i i n + s o t i l a s k o m e n t a j a + s o t i l a s k o m e n t a j a a + s o t i l a s k o m e n t a j a n + s o t i l a s k o m e n t a j i e n + s o t i l a s k o m e n t a j i n a + s o t i l a s k o m i s s i o + s o t i l a s k o m i s s i o i d e n + s o t i l a s k o m i s s i o i t a + s o t i l a s k o m i s s i o j ä r j e s t e l m ä n + s o t i l a s k o m i s s i o n + s o t i l a s k o m i s s i o t + s o t i l a s k o m i s s i o t a + s o t i l a s k o m i t e a + s o t i l a s k o m i t e a a + s o t i l a s k o m i t e a a n + s o t i l a s k o m i t e a l l e + s o t i l a s k o m i t e a n + s o t i l a s k o m i t e a s t a + s o t i l a s k o n e + s o t i l a s k o n e e t + s o t i l a s k o n e i d e n + s o t i l a s k o n e i s s a m m e + s o t i l a s k o n e i s t o + s o t i l a s k o n e i s t o n + s o t i l a s k o n f l i k t e j a + s o t i l a s k o n f l i k t i + s o t i l a s k o n f l i k t i n + s o t i l a s k o r k e a k o u l u + s o t i l a s k o u l u t u k s e n + s o t i l a s k o u l u t u k s e s s a + s o t i l a s k o u l u t u s + s o t i l a s k o u l u t u s t a + s o t i l a s k r i i s e j ä + s o t i l a s k r i i s i n h a l l i n n a s s a + s o t i l a s k r i i s i n h a l l i n t a a n + s o t i l a s k u l j e t u s l e n t o k o n e + s o t i l a s k u l u i h i n + s o t i l a s k u l u i s t a + s o t i l a s k u l u t + s o t i l a s k u s t a n n u k s i a + s o t i l a s k ä s k y + s o t i l a s k ä s k y ä + s o t i l a s k ä y t t ä j i e n + s o t i l a s k ä y t t ö + s o t i l a s k ä y t t ö m a h d o l l i s u u d e t + s o t i l a s k ä y t t ö ä + s o t i l a s k ä y t t ö ö n + s o t i l a s k ä y t ö n + s o t i l a s k ä y t ö s t ä + s o t i l a s l a i n s ä ä d ä n n ö n + s o t i l a s l a i n s ä ä d ä n t ö ö n + s o t i l a s l a i t + s o t i l a s l a i t o k s i a + s o t i l a s l a i t o s + s o t i l a s l a i t t e i s t o n + s o t i l a s l e i r e j ä + s o t i l a s l e i r i s s ä + s o t i l a s l e i r i s t ä + s o t i l a s l e i r i t + s o t i l a s l e n n o n j o h t a j i e n + s o t i l a s l e n t o + s o t i l a s l e n t o a s e m a + s o t i l a s l e n t o h a r j o i t u k s i s t a + s o t i l a s l e n t o j e n + s o t i l a s l e n t o k e n t t i e n k i n + s o t i l a s l e n t o k e n t t ä + s o t i l a s l e n t o k e n t ä t + s o t i l a s l e n t o k o n e + s o t i l a s l e n t o k o n e i d e n + s o t i l a s l e n t o k o n e i s s a + s o t i l a s l e n t o k o n e i t a + s o t i l a s l e n t o l i i k e n t e e n + s o t i l a s l e n t o t o i m i n t a + s o t i l a s l e n t ä j i e n + s o t i l a s l i i k e n t e e l t ä + s o t i l a s l i i t o k s i + s o t i l a s l i i t o n + s o t i l a s l i i t t o + s o t i l a s l i i t t o a + s o t i l a s l i i t t o i h i n + s o t i l a s l i i t t o j e n + s o t i l a s l i i t t o o n + s o t i l a s l i i t t o u m a + s o t i l a s l i i t t o u m a a + s o t i l a s l i i t t o u m a n + s o t i l a s l i i t t o u m a s t a + s o t i l a s l i i t t o u m i a + s o t i l a s l i i t t o u t u m a + s o t i l a s l i i t t o u t u m a a n + s o t i l a s l ä ä k e t i e d e + s o t i l a s l ä ä k e t i e t e e l l i s i ä + s o t i l a s l ä ä k ä r i n ä + s o t i l a s m a h d i k s i + s o t i l a s m a h d i n + s o t i l a s m a h t i + s o t i l a s m a h t i a + s o t i l a s m a h t i e n + s o t i l a s m a r k k i n o i l l a + s o t i l a s m e n o i h i n + s o t i l a s m e n o i n e e n + s o t i l a s m e n o i s s a + s o t i l a s m e n o i s t a + s o t i l a s m e n o j a + s o t i l a s m e n o j a a n + s o t i l a s m e n o j e n + s o t i l a s m e n o m m e + s o t i l a s m e n o t + s o t i l a s m e s i k k o + s o t i l a s m e s t a r i + s o t i l a s m i e h i t y k s e e n + s o t i l a s m i e h i t y k s e l l e + s o t i l a s m i e h i t y k s e n + s o t i l a s m i e h i t y k s e s t ä + s o t i l a s m i e h i t y s + s o t i l a s m i e h i t y s t ä + s o t i l a s m u s i i k k i + s o t i l a s m u s i i k k i m u s e o + s o t i l a s m ä ä r ä r a h o j a + s o t i l a s n e u v o n a n t a j a a + s o t i l a s n e u v o n a n t a j a t + s o t i l a s n e u v o s t o + s o t i l a s n e u v o s t o n + s o t i l a s n ä k ö k o h t i e n + s o t i l a s n ä k ö k o h t i i n + s o t i l a s o h j e l m i a + s o t i l a s o i k e u d e n + s o t i l a s o i k e u d e n k ä y n n i t + s o t i l a s o i k e u s + s o t i l a s o n n e t t o m u u k s i i n + s o t i l a s o n n e t t o m u u s + s o t i l a s o p e r a a t i o + s o t i l a s o p e r a a t i o i d e n + s o t i l a s o p e r a a t i o i h i n + s o t i l a s o p e r a a t i o i l l a + s o t i l a s o p e r a a t i o i l l e + s o t i l a s o p e r a a t i o i l l e m m e + s o t i l a s o p e r a a t i o i s s a + s o t i l a s o p e r a a t i o i s t a + s o t i l a s o p e r a a t i o i t a + s o t i l a s o p e r a a t i o k e s k u k s e n + s o t i l a s o p e r a a t i o l l a + s o t i l a s o p e r a a t i o l l e + s o t i l a s o p e r a a t i o n + s o t i l a s o p e r a a t i o n s a + s o t i l a s o p e r a a t i o o n + s o t i l a s o p e r a a t i o s t a + s o t i l a s o p e r a a t i o t + s o t i l a s o p e r a a t i o t a + s o t i l a s o r g a n i s a a t i o i d e n + s o t i l a s o r g a n i s a a t i o t a + s o t i l a s o r j i a + s o t i l a s o s a s t o i l l a + s o t i l a s o s a s t o j a + s o t i l a s o s a s t o j e n + s o t i l a s o s a t e k i j ä t + s o t i l a s p a n o k s i i n + s o t i l a s p a r a a t i a + s o t i l a s p a r a a t i e n + s o t i l a s p a r t i o h i i h t o + s o t i l a s p a r t i o i t a + s o t i l a s p a s t o r i + s o t i l a s p a t s a s + s o t i l a s p i i r i + s o t i l a s p o i k a + s o t i l a s p o l i i s i + s o t i l a s p o l i i s i a + s o t i l a s p o l i i s i e n + s o t i l a s p o l i i s i t + s o t i l a s p o l i i t t i s e n + s o t i l a s p o l i i t t i s e s t i + s o t i l a s p o l i i t t i s e t + s o t i l a s p o l i i t t i s i l l e + s o t i l a s p o l i t i i k a k s i + s o t i l a s p o l i t i i k a l l a + s o t i l a s p o l i t i i k a n + s o t i l a s p o l i t i i k a s t a + s o t i l a s p o l i t i i k k a + s o t i l a s p o l i t i i k k a a + s o t i l a s p r o p a g a n d a + s o t i l a s p u k u j e n + s o t i l a s p u o l e l l a + s o t i l a s p u v u s s a a n + s o t i l a s r a d i o a s e m a + s o t i l a s r a k e n t e e t + s o t i l a s r a k e n t e i d e n + s o t i l a s r a k e n t e i s i i n + s o t i l a s r e s e r v i + s o t i l a s r e s u r s s e j a + s o t i l a s r e s u r s s i e n + s o t i l a s r e s u r s s i t + s o t i l a s r i k o k s i i n + s o t i l a s r i k o l l i s i i n + s o t i l a s r o o l i n + s o t i l a s r y h m ä n + s o t i l a s r y k m e n t t i ä + s o t i l a s s a a t t u e i t a + s o t i l a s s a i r a a l a + s o t i l a s s a i r a a l a n + s o t i l a s s a i r a a l a s s a + s o t i l a s s a l a i s u u k s i e n + s o t i l a s s a t e l l i i t t i o h j e l m a a + s o t i l a s s e k t o r i a + s o t i l a s s e l k k a u k s e n + s o t i l a s s i t e e t + s o t i l a s s l a n g i + s o t i l a s s o i t t o k u n t a + s o t i l a s s o v e l l u k s i a + s o t i l a s s o v e l l u s t a + s o t i l a s s t r a t e g i a + s o t i l a s s t r a t e g i a a + s o t i l a s s t r a t e g i a s t a + s o t i l a s s u h t e i d e n + s o t i l a s s u k l a a + s o t i l a s s u u n n i t t e l u v o i m a v a r o j e n + s o t i l a s s y n e r g i a n + s o t i l a s s y y t t ä j ä + s o t i l a s s y y t t ä j ä n v i r a s t o n + s o t i l a s t a + s o t i l a s t a h o j e n + s o t i l a s t a l o u s a r v i o o n + s o t i l a s t a l o u t e e n + s o t i l a s t a r k k a i l i j o i d e n + s o t i l a s t a r k k a i l i j o i t a + s o t i l a s t a r k o i t u k s e e n + s o t i l a s t a r k o i t u k s e s s a + s o t i l a s t a r k o i t u k s i i n + s o t i l a s t a r k o i t u k s i s s a + s o t i l a s t a r v i k e k u l u j e n + s o t i l a s t a r v i k e t u t k i m u k s e e n + s o t i l a s t a r v i k k e e n s a + s o t i l a s t a r v i k k e i d e n + s o t i l a s t a r v i k k e i l l a + s o t i l a s t a r v i k k e i s t a + s o t i l a s t a r v i k k e i t a + s o t i l a s t e h t ä v i i n + s o t i l a s t e h t ä v i ä + s o t i l a s t e k n i i k k a + s o t i l a s t e k n o l o g i a + s o t i l a s t e k n o l o g i a a + s o t i l a s t e k n o l o g i a a n + s o t i l a s t e k n o l o g i n e n + s o t i l a s t e o l l i s e s t a + s o t i l a s t e o l l i s u u d e n + s o t i l a s t e o l l i s u u t e m m e + s o t i l a s t e r r o r i s m i k s i + s o t i l a s t i e + s o t i l a s t i e d u s t e l u + s o t i l a s t i e t o l i i k e n t e e s e e n + s o t i l a s t o i m e t + s o t i l a s t o i m i + s o t i l a s t o i m i a + s o t i l a s t o i m i e n + s o t i l a s t o i m i i n + s o t i l a s t o i m i j o i d e n + s o t i l a s t o i m i l l a + s o t i l a s t o i m i l l a a n + s o t i l a s t o i m i l l e + s o t i l a s t o i m i n n a n + s o t i l a s t o i m i n t a + s o t i l a s t o i m i n t a a n + s o t i l a s t o i m i s t a + s o t i l a s t o i m i t t a j a + s o t i l a s t o v e r e i d e n s a + s o t i l a s t o v e r e i l l e e n + s o t i l a s t u k i k o h d a k s i + s o t i l a s t u k i k o h d a n + s o t i l a s t u k i k o h d a s s a + s o t i l a s t u k i k o h d a t + s o t i l a s t u k i k o h d i s t a + s o t i l a s t u k i k o h t a a + s o t i l a s t u k i k o h t i a + s o t i l a s t u k i k o h t i e n + s o t i l a s t u k i k o h t i i n + s o t i l a s t u l k k i + s o t i l a s t u o m a r i + s o t i l a s t u o m a r i n + s o t i l a s t u o m i o i s t u i m e e n + s o t i l a s t u o m i o i s t u i m e n + s o t i l a s t u o m i o i s t u i m e s s a + s o t i l a s t u o m i o i s t u i m e t + s o t i l a s t u o m i o i s t u i m i a + s o t i l a s t u o m i o i s t u i m i a a n + s o t i l a s t u o m i o i s t u i m i e n + s o t i l a s t u o m i o i s t u i m i i n + s o t i l a s t u o m i o i s t u i m i l l a + s o t i l a s t u o m i o i s t u i m i s s a + s o t i l a s t u o m i o i s t u i n + s o t i l a s t u o m i o i s t u i n t a + s o t i l a s t u o m i o i s t u i n t e n + s o t i l a s t u r v a l l i s u u s a l u e i k s i + s o t i l a s t u r v a l l i s u u s p a l v e l u n + s o t i l a s t u r v a l l i s u u s t u t k i m u k s e e n + s o t i l a s t u r v a l l i s u u t e e n + s o t i l a s t u r v a t e h t ä v i e n + s o t i l a s t u t k i m u k s e e n + s o t i l a s t u t k i m u k s e n + s o t i l a s t u t k i n t a + s o t i l a s u h r e j a + s o t i l a s u h r i t + s o t i l a s u n i v o r m u s t a a n + s o t i l a s u p s e e r i + s o t i l a s u r a n i + s o t i l a s u u d i s t u s t e n + s o t i l a s v a k o i l u + s o t i l a s v a l l a l l e + s o t i l a s v a l l a n + s o t i l a s v a l l a n k a a p p a u k s e e n + s o t i l a s v a l l a n k a a p p a u k s e n + s o t i l a s v a l l a n k a a p p a u k s e s s a + s o t i l a s v a l l a n k a a p p a u k s e s t a + s o t i l a s v a l l a n k a a p p a u k s e t + s o t i l a s v a l l a n k a a p p a u s + s o t i l a s v a l l a n k a a p p a u s t a + s o t i l a s v a l l a n k a a p p a u s t e n + s o t i l a s v a l l a s t a + s o t i l a s v a l l a t + s o t i l a s v a l m i u d e t + s o t i l a s v a l m i u k s i a + s o t i l a s v a l m i u k s i e n + s o t i l a s v a l t a + s o t i l a s v a l t a a + s o t i l a s v a l t a n a + s o t i l a s v a l t i o + s o t i l a s v a l t i o n + s o t i l a s v a l t i o t a + s o t i l a s v a l t o j a + s o t i l a s v a l t u u k s i a + s o t i l a s v a n k i e n + s o t i l a s v a n k i l a s s a + s o t i l a s v a r u s t e i s t a + s o t i l a s v a r u s t e i t a + s o t i l a s v e l v o i t t e i t a + s o t i l a s v i r a n o m a i n e n + s o t i l a s v i r a n o m a i s e t + s o t i l a s v i r a n o m a i s i a + s o t i l a s v i r a n o m a i s t e n + s o t i l a s v i r k a m i e h e t + s o t i l a s v i r k a m i e h i s t ä + s o t i l a s v i r k a p u v u t + s o t i l a s v o i m a + s o t i l a s v o i m a a n + s o t i l a s v o i m a l l a + s o t i l a s v o i m a n + s o t i l a s v o i m a t + s o t i l a s v o i m a v a r a t + s o t i l a s v o i m a v a r o i h i n + s o t i l a s v o i m a v a r o j a + s o t i l a s v o i m a v a r o j e n + s o t i l a s v o i m i a + s o t i l a s v o i m i e n + s o t i l a s v o i m i n + s o t i l a s v o i m i n a + s o t i l a s v o i m i s t a + s o t i l a s v ä l i n e e t + s o t i l a s v ä l i n e i d e n + s o t i l a s y h t e i s k u n n a n + s o t i l a s y h t e i s t y ö + s o t i l a s y h t e i s t y ö h ö n + s o t i l a s y h t e i s t y ö l l e + s o t i l a s y h t e i s t y ö n + s o t i l a s y h t e i s t y ö s t ä + s o t i l a s y h t e i s t y ö t ä + s o t i l a s y k s i k k ö + s o t i l a s y k s i k k ö j e n + s o t i l a s y k s i k ö i d e n + s o t i l a s y k s i k ö n + s o t i l a s y k s i k ö s t ä + s o t i l a s y k s i k ö t + s o t i m a a n + s o t i m a l l a + s o t i m a t t a + s o t i m i n e n + s o t i m i s e n + s o t i m i s t a + s o t i n e e t + s o t i n e i d e n + s o t i n u t + s o t i v a t + s o t i v i a + s o t i v i k s i + s o t i v i l l e + s o t k e m a t t a + s o t k e t a a n + s o t k e u t u a + s o t k e u t u a k s e e n + s o t k e u t u n e e n + s o t k i + s o t k u n + s o t u r e i t a + s o t u r i n + s o t u r i t + s o u l i n + s o u t a m a t t a + s o u t i + s o u t u k o e + s o u t u l a i t e + s o u t u v e n e e l l ä + s o u t u v e n e t t ä + s o v e l i a a m m i n + s o v e l i a a m p a a + s o v e l i a a m p i + s o v e l i a a m p i a + s o v e l i a i m m a l l a + s o v e l i a i m m a t + s o v e l i a i m m i l t a + s o v e l i a i m p i a + s o v e l i a i n + s o v e l i a i s u u s k y s y m y s + s o v e l i a i t a + s o v e l i a s t a + s o v e l l a m m e + s o v e l l e t a + s o v e l l e t a a n + s o v e l l e t a a n k o + s o v e l l e t t a e s s a + s o v e l l e t t a i s i i n + s o v e l l e t t a v a a + s o v e l l e t t a v a n + s o v e l l e t t a v a s t a + s o v e l l e t t a v a t + s o v e l l e t t a v i a + s o v e l l e t t a v i e n + s o v e l l e t t a v i i n + s o v e l l e t t a v i s s a + s o v e l l e t t i i n + s o v e l l e t t u i n a + s o v e l l e t t u u n + s o v e l l u k s e s t a + s o v e l l u k s i e n s a + s o v e l l u k s i i n + s o v e l l u k s i s t a + s o v e l l u s a l a + s o v e l l u s a l a a + s o v e l l u s a l a a n + s o v e l l u s a l a l l a + s o v e l l u s a l a n + s o v e l l u s a l o i l l a + s o v e l l u s a l o i l l e + s o v e l l u s a l u e + s o v e l l u s a l u e e n + s o v e l l u s a l u e e s e e n + s o v e l l u s a l u e e s t a + s o v e l l u s a l u e i l l a + s o v e l l u s a r k k i t e h t u u r i + s o v e l l u s l a i t t e i d e n + s o v e l l u s m a h d o l l i s u u d e t + s o v e l l u s m a h d o l l i s u u k s i a + s o v e l l u s m a h d o l l i s u u k s i a k i n + s o v e l l u s m a h d o l l i s u u k s i s s a + s o v e l l u s m e k a n i s m i i n + s o v e l l u s o h j e l m a + s o v e l l u s o h j e l m i a + s o v e l l u s p r o t o k o l l a a n + s o v e l l u s p u i t t e i s s a + s o v e l l u s p ä i v ä + s o v e l l u s r a j a p i n t a t e k n o l o g i a n + s o v e l l u s r a j a p i n t a t e k n o l o g i a s t a + s o v e l l u s r a j a p i n t o j e n + s o v e l l u s t e n + s o v e l l u s t e o l l i s u u d e l l e + s o v e l l u s v a i h e e s s a a n + s o v e l l u t t a v a + s o v e l l u t u k s i a + s o v e l l u t u s a l u e + s o v e l l u t u s a l u e e n + s o v e l s i m m e + s o v e l t a a + s o v e l t a e n + s o v e l t a e s s a a n + s o v e l t a e s s a m m e + s o v e l t a k a a m m e + s o v e l t a m a a n + s o v e l t a m a l l a + s o v e l t a m a t t a + s o v e l t a m i s a i k a a + s o v e l t a m i s a i k a t a u l u t + s o v e l t a m i s a j a n + s o v e l t a m i s a j a n k o h d a s t a + s o v e l t a m i s a j a s t a + s o v e l t a m i s a l a + s o v e l t a m i s a l a a + s o v e l t a m i s a l a a n + s o v e l t a m i s a l a l l e + s o v e l t a m i s a l a l t a a n + s o v e l t a m i s a l a n + s o v e l t a m i s a l a s s a + s o v e l t a m i s a l a s t a + s o v e l t a m i s a l o j a + s o v e l t a m i s a l o j e n + s o v e l t a m i s a l u e + s o v e l t a m i s a l u e e n + s o v e l t a m i s a l u e t t a + s o v e l t a m i s a s e t u k s e n + s o v e l t a m i s a s e t u s t a + s o v e l t a m i s a s t e e n + s o v e l t a m i s d i r e k t i i v i i n + s o v e l t a m i s d i r e k t i i v i n + s o v e l t a m i s d i r e k t i i v i s t ä + s o v e l t a m i s d i r e k t i i v i ä + s o v e l t a m i s e d e l l y t y k s e t + s o v e l t a m i s e d e l l y t y k s i ä + s o v e l t a m i s e e n + s o v e l t a m i s e h t o j e n + s o v e l t a m i s e k s i + s o v e l t a m i s e l l a + s o v e l t a m i s e l l e + s o v e l t a m i s e n + s o v e l t a m i s e s s a + s o v e l t a m i s e s t a + s o v e l t a m i s j ä r j e s t e l y t + s o v e l t a m i s k a u d e l l a + s o v e l t a m i s k y k y y n + s o v e l t a m i s k y n n y k s e n + s o v e l t a m i s m a h d o l l i s u u k s i e n + s o v e l t a m i s m e n e t e l m i ä + s o v e l t a m i s m e n e t e l m ä t + s o v e l t a m i s m e n e t t e l y i h i n + s o v e l t a m i s m e n e t t e l y j ä + s o v e l t a m i s m e n e t t e l y s s ä + s o v e l t a m i s m e n e t t e l y s t ä + s o v e l t a m i s m e n e t t e l y y n + s o v e l t a m i s m u o t o + s o v e l t a m i s m ä ä r ä a j a t + s o v e l t a m i s m ä ä r ä y s t e n + s o v e l t a m i s o i k e u t e e n + s o v e l t a m i s o n g e l m i a + s o v e l t a m i s p e r u s t e + s o v e l t a m i s p r o s e s s i + s o v e l t a m i s p r o s e s s i a + s o v e l t a m i s p r o s e s s i s s a + s o v e l t a m i s p u i t t e e t + s o v e l t a m i s p ä i v ä m ä ä r i s t ä + s o v e l t a m i s p ä i v ä m ä ä r ä n + s o v e l t a m i s p ö y t ä k i r j o i h i n + s o v e l t a m i s p ö y t ä k i r j o j e n + s o v e l t a m i s s ä ä n n ö i s s ä + s o v e l t a m i s s ä ä n n ö i s t ä + s o v e l t a m i s s ä ä n n ö k s i i n + s o v e l t a m i s s ä ä n n ö k s i k s i + s o v e l t a m i s s ä ä n n ö k s i s t ä + s o v e l t a m i s s ä ä n n ö t + s o v e l t a m i s s ä ä n t ö i h i n + s o v e l t a m i s s ä ä n t ö j e n + s o v e l t a m i s s ä ä n t ö j e n k i n + s o v e l t a m i s s ä ä n t ö j ä + s o v e l t a m i s t a + s o v e l t a m i s t a p a + s o v e l t a m i s t a p a a + s o v e l t a m i s t a p o j a + s o v e l t a m i s t a v a s t a + s o v e l t a m i s t a v a t + s o v e l t a m i s t a v o i s t a + s o v e l t a m i s t e h t ä v ä + s o v e l t a m i s t o i m e n p i t e e s e e n + s o v e l t a m i s t o i m e n p i t e e t + s o v e l t a m i s t o i m i i n + s o v e l t a m i s t o i m i l l e + s o v e l t a m i s v a i h e e s s a + s o v e l t a m i s v a i k e u k s i a + s o v e l t a m i s v e l v o l l i s u u s + s o v e l t a m i s v u o d e n + s o v e l t a m i s v u o d e s t a + s o v e l t a m i s v u o s i + s o v e l t a m i s v u o t e n a + s o v e l t a m i s v u o t t a + s o v e l t a m i s v ä l i n e e n + s o v e l t a n e e t + s o v e l t a n u t + s o v e l t a v a t + s o v e l t a v a t k o + s o v e l t a v i a + s o v e l t a v i l l e + s o v e l t a v i s t a + s o v e l t u a + s o v e l t u i + s o v e l t u u + s o v e l t u v a a + s o v e l t u v a m p a a n + s o v e l t u v a m p i + s o v e l t u v a m p i a + s o v e l t u v i a + s o v e l t u v i m m a k s i + s o v e l t u v i m m a t + s o v e l t u v i m p i a + s o v e l t u v i n + s o v e l t u v u u s k o k e e n + s o v e l t u v u u s k o k e e s e e n + s o v e l t u v u u s k o k e i d e n + s o v e l t u v u u s k o k e i t a + s o v e l t u v u u s t a r k a s t u k s e n + s o v e l t u v u u s t e s t i e n + s o v e l t u v u u s t u t k i m u k s e n + s o v e l t u v u u s t u t k i m u k s i a + s o v i m m e + s o v i n i s m i a + s o v i n n a i s u u t t a + s o v i n n o l l i s e m m a n + s o v i n n o l l i s e m p i + s o v i n n o n + s o v i n n o n t e k o a + s o v i n n o n t e k o p r o s e s s i e n + s o v i n n o n t e o n + s o v i n n o s t a + s o v i n t o a + s o v i n t o a s i a k i r j a s s a + s o v i n t o e l e i t ä + s o v i n t o h a l l i t u k s e n + s o v i n t o h a n k k e i t a + s o v i n t o k o k o u k s e s s a + s o v i n t o k o m i s s i o + s o v i n t o k o m i s s i o i t a + s o v i n t o k o m i s s i o n + s o v i n t o k o m i t e a n + s o v i n t o k o n f e r e n s s i s s a + s o v i n t o k u l t t u u r i a + s o v i n t o m e n e t t e l y + s o v i n t o m e n e t t e l y j e n + s o v i n t o n e u v o t t e l u i s s a + s o v i n t o n e u v o t t e l u j e n + s o v i n t o n e u v o t t e l u t + s o v i n t o o n + s o v i n t o p o l i t i i k a n + s o v i n t o p r o s e s s i + s o v i n t o p r o s e s s i a + s o v i n t o p r o s e s s i a a n + s o v i n t o p r o s e s s i i n + s o v i n t o p r o s e s s i l l a + s o v i n t o p r o s e s s i l l e + s o v i n t o p r o s e s s i n + s o v i n t o r a t k a i s u + s o v i n t o r a t k a i s u a + s o v i n t o r a t k a i s u e h d o t u k s e n + s o v i n t o r a t k a i s u i h i n + s o v i n t o r a t k a i s u i l l a + s o v i n t o r a t k a i s u j a + s o v i n t o r a t k a i s u j e n + s o v i n t o r a t k a i s u l l a + s o v i n t o r a t k a i s u n + s o v i n t o r a t k a i s u u n + s o v i n t o s u u n n i t e l m a n + s o v i n t o s u u n n i t e l m a s t a + s o v i t a a n + s o v i t e l l a + s o v i t e l l a k s e n i + s o v i t e l l u t + s o v i t e l t a v a a + s o v i t e t a a n + s o v i t e t t a v a + s o v i t t a a + s o v i t t a a k s e e n + s o v i t t a e s s a + s o v i t t a m a a n + s o v i t t a m a l l a + s o v i t t a m a t t a + s o v i t t e l e m a a n + s o v i t t e l e v a m m a l l a + s o v i t t e l e v a m m i n + s o v i t t e l e v a m m i s t a + s o v i t t e l e v a m p a a + s o v i t t e l e v a m p i + s o v i t t e l e v a n a + s o v i t t e l i j a k s i + s o v i t t e l i j a n + s o v i t t e l i j a n a + s o v i t t e l i j a r y h m ä + s o v i t t e l u a + s o v i t t e l u a i k a + s o v i t t e l u a j a t u k s e l l e + s o v i t t e l u a s i a k i r j a a + s o v i t t e l u a s i a k i r j o j e n + s o v i t t e l u a s i o i s s a + s o v i t t e l u e h d o t u k s e l l a a n + s o v i t t e l u e h d o t u k s e n + s o v i t t e l u e h d o t u s + s o v i t t e l u e h d o t u s t a + s o v i t t e l u e h d o t u s t a n n e + s o v i t t e l u e l i m e n + s o v i t t e l u e l i m i ä + s o v i t t e l u e l i n + s o v i t t e l u e l i n t ä + s o v i t t e l u e s i t y s + s o v i t t e l u h a l u k k u u d e s t a + s o v i t t e l u h a n k k e e t + s o v i t t e l u h a n k k e i t a + s o v i t t e l u h e n g e n + s o v i t t e l u i l t a n a + s o v i t t e l u i s s a + s o v i t t e l u j e n + s o v i t t e l u j ä r j e s t e l m i e n + s o v i t t e l u j ä r j e s t e l m ä + s o v i t t e l u j ä r j e s t e l m ä n + s o v i t t e l u k e s k u s t e l u j e n + s o v i t t e l u k o k o u k s e e n + s o v i t t e l u k o k o u k s e l l a + s o v i t t e l u k o k o u k s e n + s o v i t t e l u k o k o u k s e s s a + s o v i t t e l u k o k o u k s i a + s o v i t t e l u k o k o u k s i e n + s o v i t t e l u k o k o u k s i i n + s o v i t t e l u k o k o u k s i s s a + s o v i t t e l u k o k o u s + s o v i t t e l u k o k o u s t a + s o v i t t e l u k o k o u s t e n + s o v i t t e l u k o m i t e a + s o v i t t e l u k o m i t e a a + s o v i t t e l u k o m i t e a a n + s o v i t t e l u k o m i t e a k a a n + s o v i t t e l u k o m i t e a l l e + s o v i t t e l u k o m i t e a m e n e t t e l y n + s o v i t t e l u k o m i t e a m m e + s o v i t t e l u k o m i t e a n + s o v i t t e l u k o m i t e a s s a + s o v i t t e l u k o m i t e a s t a + s o v i t t e l u k o m i t e a t + s o v i t t e l u k o m i t e a v a l i o k u n n a s s a + s o v i t t e l u k o m i t e a v a l t u u s k u n n a l l e + s o v i t t e l u k o m i t e a v a l t u u s k u n n a n + s o v i t t e l u k o m i t e a v a l t u u s k u n n a s s a + s o v i t t e l u k o m i t e a v a l t u u s k u n t a + s o v i t t e l u k o m i t e a v a l t u u s k u n t a a + s o v i t t e l u k o m i t e a v a l t u u s k u n t a m m e + s o v i t t e l u k o m i t e a v a l t u u s k u n t i i n + s o v i t t e l u k o m i t e o i s s a + s o v i t t e l u k o n f e r e n s s i + s o v i t t e l u k o n g r e s s i + s o v i t t e l u k o n g r e s s i n + s o v i t t e l u k y k y ä + s o v i t t e l u k y s y m y k s i ä + s o v i t t e l u l a u t a k u n n a n + s o v i t t e l u l a u t a k u n t a m e n e t t e l y + s o v i t t e l u l a u t a k u n t a m e n e t t e l y n + s o v i t t e l u l l a + s o v i t t e l u l t a + s o v i t t e l u l u o n n o k s e e n + s o v i t t e l u m a h d o l l i s u u d e n + s o v i t t e l u m a h d o l l i s u u s + s o v i t t e l u m a l l i a + s o v i t t e l u m e k a n i s m e j a + s o v i t t e l u m e k a n i s m i n + s o v i t t e l u m e n e t t e l y + s o v i t t e l u m e n e t t e l y i l l ä + s o v i t t e l u m e n e t t e l y i s t ä + s o v i t t e l u m e n e t t e l y j ä + s o v i t t e l u m e n e t t e l y k i n + s o v i t t e l u m e n e t t e l y l l e + s o v i t t e l u m e n e t t e l y l l ä + s o v i t t e l u m e n e t t e l y l t ä + s o v i t t e l u m e n e t t e l y m m e + s o v i t t e l u m e n e t t e l y n + s o v i t t e l u m e n e t t e l y s s ä + s o v i t t e l u m e n e t t e l y s t ä + s o v i t t e l u m e n e t t e l y t + s o v i t t e l u m e n e t t e l y y n + s o v i t t e l u m e n e t t e l y y n h ä n + s o v i t t e l u m e n e t t e l y ä + s o v i t t e l u n + s o v i t t e l u n e u v o t t e l u + s o v i t t e l u n e u v o t t e l u a + s o v i t t e l u n e u v o t t e l u i h i n + s o v i t t e l u n e u v o t t e l u i s s a + s o v i t t e l u n e u v o t t e l u j a + s o v i t t e l u n e u v o t t e l u j e n + s o v i t t e l u n h a l u a + s o v i t t e l u n h a l u a a n + s o v i t t e l u o n g e l m i a + s o v i t t e l u o p e r a a t i o t a + s o v i t t e l u p a k e t i n + s o v i t t e l u p a k e t t i + s o v i t t e l u p a k e t t i a + s o v i t t e l u p o l i t i i k a n + s o v i t t e l u p o l i t i i k k a + s o v i t t e l u p o n n i s t e l u i s t a + s o v i t t e l u p o n n i s t e l u j a a n + s o v i t t e l u p o n n i s t e l u j a m m e + s o v i t t e l u p o n n i s t u k s i a + s o v i t t e l u p r o s e s s e i h i n + s o v i t t e l u p r o s e s s e i s s a + s o v i t t e l u p r o s e s s i + s o v i t t e l u p r o s e s s i a + s o v i t t e l u p r o s e s s i e n + s o v i t t e l u p r o s e s s i i n + s o v i t t e l u p r o s e s s i l l a + s o v i t t e l u p r o s e s s i n + s o v i t t e l u p r o s e s s i n s a + s o v i t t e l u p r o s e s s i s s a + s o v i t t e l u p r o s e s s i s t a + s o v i t t e l u p y r k i m y k s e t + s o v i t t e l u p y r k i m y k s i ä + s o v i t t e l u p ä ä t ö s + s o v i t t e l u p ä ä t ö s l a u s e l m a a + s o v i t t e l u p ä ä t ö s l a u s e l m a s s a + s o v i t t e l u r a h a s t o n + s o v i t t e l u r a t k a i s u + s o v i t t e l u r a t k a i s u a + s o v i t t e l u r a t k a i s u e h d o t u k s e n + s o v i t t e l u r a t k a i s u i h i n + s o v i t t e l u r a t k a i s u j a + s o v i t t e l u r a t k a i s u j e n + s o v i t t e l u r a t k a i s u k a a v i o t a + s o v i t t e l u r a t k a i s u n + s o v i t t e l u r a t k a i s u s s a + s o v i t t e l u r a t k a i s u s t a + s o v i t t e l u r a t k a i s u u n + s o v i t t e l u r y h m ä n + s o v i t t e l u s i h t e e r i s t ö ö n + s o v i t t e l u s o p i m u k s e e n + s o v i t t e l u s o p i m u k s e s t a + s o v i t t e l u s o p i m u s + s o v i t t e l u s o p i m u s t a + s o v i t t e l u s s a + s o v i t t e l u s s a k i n + s o v i t t e l u s t r a t e g i a a n + s o v i t t e l u s u o s i t u s t a + s o v i t t e l u s ä ä n n ö k s i ä + s o v i t t e l u t a r k i s t u k s e n + s o v i t t e l u t a r k i s t u k s i n a + s o v i t t e l u t e h t ä v i i n + s o v i t t e l u t e h t ä v i s s ä + s o v i t t e l u t e h t ä v ä ä n + s o v i t t e l u t e k s t i s s ä + s o v i t t e l u t e k s t i ä + s o v i t t e l u t o i m e n p i d e + s o v i t t e l u t o i m e n p i t e e t + s o v i t t e l u t o i m e t + s o v i t t e l u t o i m i k u n n a n + s o v i t t e l u t u l o k s e e n + s o v i t t e l u t u l o k s e n + s o v i t t e l u t u l o k s e s t a + s o v i t t e l u t u l o s + s o v i t t e l u t u l o s t a + s o v i t t e l u t u o m i o t + s o v i t t e l u t y ö h ö n + s o v i t t e l u t y ö l l e + s o v i t t e l u t y ö s t ä + s o v i t t e l u t y ö s t ä n n e + s o v i t t e l u u n + s o v i t t e l u v a i h e + s o v i t t e l u v a i h e e n + s o v i t t e l u v a i h e e s e e n + s o v i t t e l u v a i h e e s s a + s o v i t t e l u v a i h e t t a + s o v i t t e l u v a l i o k u n n a n + s o v i t t e l u v a l i o k u n t a + s o v i t t e l u v a l m i u s + s o v i t t e l u v a l m i u t e n s a + s o v i t t e l u v a l t u u s k u n n a n + s o v i t t e l u v a l t u u s k u n n a s s a + s o v i t t e l u v a l t u u s k u n t a + s o v i t t e l u v i e r a i l u s t a + s o v i t t e l u v ä l i n e e n ä + s o v i t t e l u y k s i k k ö + s o v i t t e l u y r i t y k s i s s ä + s o v i t t e l u y r i t y k s i ä + s o v i t t e l u y r i t y s t e n + s o v i t t e l u y ö n + s o v i t t i i n + s o v i t t u a + s o v i t t u i h i n + s o v i t t u j a + s o v i t t u j e n + s o v i t t u u n + s o v i t u i s s a + s o v i t u i s t a + s o v i t u n + s o v i t u s s a + s o v i t u s u h r i + s o v i t u s u h r i n + s o v i t u t + s o v u n + s o v u s s a + s o v u s t a + s p a g e t t i h i r v i ö + s p a g e t t i k u r p i t s a + s p a g e t t i p a k k a u s + s p a g e t t i p u u + s p a g e t t i w e s t e r n + s p a r t a k i s t i k a p i n a + s p a r t a k i s t i l i i t t o + s p e k t r i a n a l y s a a t t o r i + s p e k t r i a n a l y y s i + s p e k t r i l i s e n s s i h u u t o k a u p p o j e n + s p e k t r i l u o k k a + s p e k t r i p o l i t i i k k a v a i h t o e h t o j e n + s p e k t r i v i i v a + s p e k u l a a t i o i t a + s p e k u l a a t i o m a f i a + s p e k u l a a t i o t a + s p e k u l a t i i v i s e e n + s p e k u l a t i i v i s e l l a + s p e k u l a t i i v i s e m p i + s p e k u l a t i i v i s i a + s p e k u l a t i i v i s i i n + s p e k u l a t i i v i s i l t a + s p e k u l o i d a a n + s p e k u l o i n n i k s i + s p e k u l o i n n i l l e + s p e k u l o i n n i s t a + s p e k u l o i n t i a + s p e k u l o i n t i h y ö k k ä y k s e t + s p e k u l o i n t i h y ö k k ä y k s i l t ä + s p e k u l o i n t i i n + s p e k u l o i n t i k u p l a a + s p e r m a n ä y t t e i d e n + s p e r m a p a n k k i + s p e r m a s o l u t + s p e s i f i s e m m ä n + s p e s i f i s e m m ä t + s p i n a a k k e r i p u o m i + s p i n e l l i n + s p i n k v a n t t i l u k u + s p o n g i f o r m i s e n + s p o n g i f o r m i s e t + s p o n g i f o r m i s t a + s p o n s o r i r a h a + s p o n s o r i s o p i m u k s i i n + s p o n s o r i s o p i m u s t e n + s p o n s o r o i n t i s o p i m u k s i a a n + s p o n t a a n i m m a t + s p o n t a a n i m p i + s p o n t a a n i m p i a + s p r a y m a a l i + s p r i n k l e r i j ä r j e s t e l m ä + s p r i n t t i m a a i l m a n m e s t a r u u s k i l p a i l u t + s r i l a n k a l a i s i a + s r i l a n k a l a i s t a + s r i l a n k a l a i s t e n + s t a d i o n a s i a n t u n t i j a n + s t a d i o n e i l l a + s t a d i o n i l l a + s t a d i o n i l l e + s t a d i o n v a a t i m u k s e t + s t a f f o r d s h i r e n t e r r i e r i e n + s t a g f l a a t i o k i n + s t a g n a a t i o n + s t a g n a a t i o p i s t e + s t a l i n i s m i s t a + s t a l i n i s t i h a l l i n t o j e n + s t a l i n i s t i k a u d e n + s t a l i n i s t i s e s t a + s t a l i n i s t i s i s s a + s t a n d a r d e i h i n + s t a n d a r d e i l l e + s t a n d a r d e i n e e n + s t a n d a r d e i s t a + s t a n d a r d e j a + s t a n d a r d e j a k i n + s t a n d a r d i a + s t a n d a r d i a r v o t + s t a n d a r d i b r u t t o m a r g i n a a l i + s t a n d a r d i d u m p p a u k s e s t a + s t a n d a r d i d u m p p a u s t a + s t a n d a r d i e n + s t a n d a r d i e n g l a n n i l l a + s t a n d a r d i e n m u k a i s u u d e s t a + s t a n d a r d i f o r m a a t i n + s t a n d a r d i f o r m a a t t i a + s t a n d a r d i h i n n a s t a + s t a n d a r d i h o i t o a + s t a n d a r d i j ä r j e s t e l m ä n + s t a n d a r d i j ä r j e s t e l m ä ä + s t a n d a r d i k i r j a s t o + s t a n d a r d i k o m i t e a t + s t a n d a r d i k o m i t e o i t a + s t a n d a r d i k s i + s t a n d a r d i k u s t a n n u s m a l l i + s t a n d a r d i k ä y t ä n t ö + s t a n d a r d i k ä y t ä n t ö j ä + s t a n d a r d i l a t u r i l l a + s t a n d a r d i l a u s e k k e e n + s t a n d a r d i l a u t a k u n t a + s t a n d a r d i l u e t t e l o + s t a n d a r d i l u e t t e l o o n + s t a n d a r d i l ä h e s t y m i s t a v o i s t a + s t a n d a r d i m a h d o l l i s u u k s i a + s t a n d a r d i m a k s u i h i n + s t a n d a r d i m e n e t t e l y + s t a n d a r d i m e n e t t e l y j ä + s t a n d a r d i m e n e t t e l y n + s t a n d a r d i m e n e t t e l y s t ä + s t a n d a r d i m i t a t + s t a n d a r d i m i t t a i s i a + s t a n d a r d i m i t t a y k s i k ö i d e n + s t a n d a r d i m u o d o s s a + s t a n d a r d i m ä ä r i t e l m ä + s t a n d a r d i n + s t a n d a r d i n l u o j a n a + s t a n d a r d i p a l k a n + s t a n d a r d i p e r u s t a + s t a n d a r d i p o l i t i i k k a a + s t a n d a r d i p y s ä k ö i n t i l u p a a + s t a n d a r d i r a t k a i s u n + s t a n d a r d i s o i m i s j ä r j e s t ö n + s t a n d a r d i s o i n t i e l i m i l l e + s t a n d a r d i s o i n t i k y s y m y s t e n + s t a n d a r d i s o i n t i m e k a n i s m e j a + s t a n d a r d i s o i n t i p r o s e s s i a + s t a n d a r d i s o i n t i t y ö t ä + s t a n d a r d i s o p i m u s t e n + s t a n d a r d i t + s t a n d a r d i t a s o s t a + s t a n d a r d i t e r m i n o l o g i a a + s t a n d a r d i v a s t a u s + s t a n d a r d i v e t y e l e k t r o d i + s t a n d a r d i v i r a s t o n + s t a n d a r d i y h t e y s + s t a n d a r d i y k s i k k ö h i n n a n + s t a n d a r d o i d u m p i a + s t a n d a r d o i d u n + s t a n d a r d o i m i s e n + s t a n d a r d o i n n i l l a + s t a n d a r d o i n n i s t a + s t a n d a r d o i n t i a + s t a n d a r d o i n t i a s i o i d e n + s t a n d a r d o i n t i e l i m e n + s t a n d a r d o i n t i e l i m e t + s t a n d a r d o i n t i e l i m i e n + s t a n d a r d o i n t i e l i m i l l ä + s t a n d a r d o i n t i e l i m i s s ä + s t a n d a r d o i n t i e l i n t e n + s t a n d a r d o i n t i i n + s t a n d a r d o i n t i j ä r j e s t e l m ä + s t a n d a r d o i n t i j ä r j e s t e l m ä l l ä + s t a n d a r d o i n t i j ä r j e s t e l m ä m m e + s t a n d a r d o i n t i j ä r j e s t e l m ä n + s t a n d a r d o i n t i j ä r j e s t e l m ä s s ä + s t a n d a r d o i n t i j ä r j e s t e l m ä t + s t a n d a r d o i n t i j ä r j e s t e l m ä ä + s t a n d a r d o i n t i j ä r j e s t ö + s t a n d a r d o i n t i j ä r j e s t ö i l l e + s t a n d a r d o i n t i j ä r j e s t ö i s s ä + s t a n d a r d o i n t i j ä r j e s t ö j e n + s t a n d a r d o i n t i j ä r j e s t ö j ä + s t a n d a r d o i n t i j ä r j e s t ö m m e + s t a n d a r d o i n t i j ä r j e s t ö s t ä + s t a n d a r d o i n t i k o m i t e a a + s t a n d a r d o i n t i k o m i t e a l l e + s t a n d a r d o i n t i k o m i t e a l t a + s t a n d a r d o i n t i k o m i t e a n + s t a n d a r d o i n t i k o m i t e a s s a + s t a n d a r d o i n t i k o m i t e a t + s t a n d a r d o i n t i k y s y m y k s e n + s t a n d a r d o i n t i l a i t o k s e n + s t a n d a r d o i n t i m e k a n i s m i e n + s t a n d a r d o i n t i p a k e t t i + s t a n d a r d o i n t i p a k e t t i a + s t a n d a r d o i n t i p e r i a a t t e i t a + s t a n d a r d o i n t i p o l i t i i k a n + s t a n d a r d o i n t i p o l i t i i k k a + s t a n d a r d o i n t i p o l i t i i k k a a + s t a n d a r d o i n t i p o l i t i i k k a a n + s t a n d a r d o i n t i p r o s e s s i + s t a n d a r d o i n t i p r o s e s s i a + s t a n d a r d o i n t i p r o s e s s i i n + s t a n d a r d o i n t i p r o s e s s i n + s t a n d a r d o i n t i p r o s e s s i s s a + s t a n d a r d o i n t i p r o s e s s i s t a + s t a n d a r d o i n t i s t r a t e g i a a + s t a n d a r d o i n t i s ä ä n t ö j e n + s t a n d a r d o i n t i t a r k a s t u k s e s t a + s t a n d a r d o i n t i t o i m i a + s t a n d a r d o i n t i t u t k i m u s + s t a n d a r d o i n t i t y ö + s t a n d a r d o i n t i t y ö h ö n + s t a n d a r d o i n t i t y ö l l e + s t a n d a r d o i n t i t y ö s t ä + s t a n d a r d o i n t i t y ö t ä + s t a n d a r d o i n t i v i r a n o m a i n e n + s t a n d a r d o i n t i v i r a n o m a i s t e n + s t a n d a r d o i n t i v i r a s t o + s t a n d a r d o i n t i v ä l i n e + s t a n d a r d o i n t i y k s i k ö i s s ä + s t a n d a r d o i t a v a + s t a n d a r d o i t u a + s t a n d a r d o i t u j e n + s t a r t t i p i s t o o l i + s t a t u k s e n + s t a t u s k y s y m y k s e e n + s t a t u s r a t k a i s u + s t a t u s r a t k a i s u u n + s t a t u s s y m b o l e i h i n + s t a t u s s y m b o l i + s t a t u s s y m b o l i k s i + s t a t u s s y m b o l i n + s t e a r i i n i h a p p o + s t e r e o e t ä i s y y s m i t t a r i + s t e r e o t y p i a t + s t e r e o t y p i o i d e n + s t e r e o t y p i o i h i n + s t e r e o t y p i o i s t a + s t e r e o t y y p p i s i s t ä + s t e r e o t y y p p i s t e n + s t e r e o ä ä n i + s t e r i l i s a a t i o i h i n + s t e r i l i s a a t i o s t a n d a r d i t + s t e r i l o i m i s s t a n d a r d i e n + s t e r i l o i n t i l a i t o s t a + s t e r i l o i n t i t a p a u k s i a + s t i l i s o i n t i a + s t i l i s o i n t i i n + s t i m u l o i m a a n + s t i m u l o i m i s e k s i + s t i p e n d e j ä + s t i p e n d i a a t t i o h j e l m a n + s t i p e n d i o h j e l m a + s t i p e n d i o h j e l m a t + s t i p e n d i o h j e l m i e n + s t r a t e g e j a + s t r a t e g i a a + s t r a t e g i a a m m e + s t r a t e g i a a n + s t r a t e g i a a n s a + s t r a t e g i a e h d o t u k s e n + s t r a t e g i a e h d o t u k s e s s a + s t r a t e g i a e h d o t u s + s t r a t e g i a f o o r u m i + s t r a t e g i a f o o r u m i i n + s t r a t e g i a f o o r u m i n + s t r a t e g i a k e h y k s e n + s t r a t e g i a k e h y k s e s t ä + s t r a t e g i a k e h y s + s t r a t e g i a k e h y s t ä + s t r a t e g i a k e r t o m u k s e k s i + s t r a t e g i a k e r t o m u k s e n + s t r a t e g i a k e s k u s t e l u j a + s t r a t e g i a k i l p a i l u u n + s t r a t e g i a k o n f e r e n s s i + s t r a t e g i a k o n s e p t i + s t r a t e g i a k s e m m e + s t r a t e g i a k s i + s t r a t e g i a l l a + s t r a t e g i a l l e + s t r a t e g i a l u o n n o k s e s s a + s t r a t e g i a l u o n n o s a s i a k i r j o j e m m e + s t r a t e g i a l u o n n o s t a + s t r a t e g i a n + s t r a t e g i a n a n n e + s t r a t e g i a n s a + s t r a t e g i a n v a i h d o k s e e n + s t r a t e g i a o h j e l m a + s t r a t e g i a o h j e l m a a + s t r a t e g i a o h j e l m a s t a + s t r a t e g i a o h j e l m a t + s t r a t e g i a p a k e t i s t a + s t r a t e g i a p a p e r e i d e n + s t r a t e g i a p a p e r i + s t r a t e g i a p a p e r i i n + s t r a t e g i a p a p e r i n + s t r a t e g i a p e l i + s t r a t e g i a p o l i t i i k a n + s t r a t e g i a r a p o r t i s t a + s t r a t e g i a r a p o r t i t + s t r a t e g i a r a p o r t t i + s t r a t e g i a s s a + s t r a t e g i a s s a a n + s t r a t e g i a s t a + s t r a t e g i a s t a m m e + s t r a t e g i a s u u n n i t e l m a + s t r a t e g i a s u u n n i t e l m a a + s t r a t e g i a s u u n n i t e l m a a n + s t r a t e g i a s u u n n i t e l m a n s a + s t r a t e g i a s u u n n i t e l m i a + s t r a t e g i a s u u n n i t e l m i e n + s t r a t e g i a s u u n n i t e l m i i n + s t r a t e g i a s u u n n i t t e l u n + s t r a t e g i a s u u n n i t t e l u y k s i k k ö + s t r a t e g i a t + s t r a t e g i a t a r k i s t u k s i k s i + s t r a t e g i a v a j e + s t r a t e g i a v i r h e + s t r a t e g i a y k s i k ö n + s t r a t e g i o i d e n + s t r a t e g i o i h i n + s t r a t e g i o i s s a + s t r a t e g i o i s t a + s t r a t e g i o i t a + s t r a t e g i o i t a a n + s t r a t e g i s e e n + s t r a t e g i s e l l a + s t r a t e g i s e m m a n + s t r a t e g i s e m m i n + s t r a t e g i s e m p a a + s t r a t e g i s e m p a a n + s t r a t e g i s e m p i + s t r a t e g i s e m p i a + s t r a t e g i s e m p i i n + s t r a t e g i s e n + s t r a t e g i s e s s a + s t r a t e g i s e s t a + s t r a t e g i s e t + s t r a t e g i s i a + s t r a t e g i s i i n + s t r a t e g i s i l l a + s t r a t e g i s i l l e + s t r a t e g i s i m m a k s i + s t r a t e g i s i m m a n + s t r a t e g i s i n + s t r a t e g i s i s t a + s t r a t e g i s t a + s t r a t e g i s t e n + s t r a t o s f ä ä r i i n + s t r e s s a a n t u a + s t r e s s a a n t u v a t + s t r e s s i h ä i r i ö + s t r e s s i n + s t r e s s i n h a l l i n t a a + s t r e s s i n h a l l i n t a a n + s t r e s s i n s i e t o k y k y ä + s t r e s s i t e k i j ö i t ä + s t r e s s i t e s t a u k s e s t a + s t r e s s i t e s t a u s + s t r e s s i t e s t e i h i n + s t r e s s i t e s t e i h i n n e + s t r e s s i t e s t e i l l e + s t r e s s i t e s t e i l l ä + s t r e s s i t e s t e i s s ä + s t r e s s i t e s t e i s t ä + s t r e s s i t e s t e j ä + s t r e s s i t e s t e j ä n n e + s t r e s s i t e s t i + s t r e s s i t e s t i e n + s t r e s s i t e s t i i n + s t r e s s i t e s t i l l ä + s t r e s s i t e s t i l t ä + s t r e s s i t e s t i m e n e t e l m ä ä + s t r e s s i t e s t i m e n e t t e l y n + s t r e s s i t e s t i n + s t r e s s i t e s t i n n e + s t r e s s i t e s t i o h j e l m a a n + s t r e s s i t e s t i s s ä + s t r e s s i t e s t i s t ä + s t r e s s i t e s t i t + s t r e s s i t e s t i v a i h e e s s a + s t r e s s i t e s t i ä + s t r e s s i t e s t i ä ä n + s t r e s s i t i l a n t e i t a + s t r i p p i s a r j a k u v i s t a + s t r o n t i u m k a r b o n a a t t i + s t r o n t i u m k l o r i d i + s t r o n t i u m n i t r a a t t i + s t r o n t i u m t i t a n a a t t i + s t r u k t u r o i d u i l l e + s t r u k t u r o i t u a + s t r u k t u r o i t u j a + s t r u t s i e n e m m i s t ö l t ä + s t r u u d e l i t a i k i n a + s t r y k n i i n i a n n o k s e n + s t r y k n i i n i a n n o s + s t r y k n i i n i p u u + s t u d i o a l b u m i + s t u d i o j ä r j e s t e l m ä + s t y r e e n i b u t a d i e e n i k u m i + s t y r e e n i o k s i d i + s u b j e k t i i v i s e m p a a n + s u b j e k t i i v i s i a + s u b j e k t i i v i s t e n + s u b j e k t i n + s u b s i d i a r i t e e t t i p e r i a a t t e e n + s u b s i d i a r i t e e t t i p e r i a a t t e e s e e n + s u b s i d i a r i t e e t t i t e s t i + s u b s t a n s s i a + s u b s t a n s s i k y s y m y k s i s s ä + s u b s t a n s s i s t a + s u b s t i t u u t i o p e r i a a t e t t a + s u b s t i t u u t i o s u u n n i t e l m a + s u b s t r a a t t i k i e r t o + s u b s t r a a t t i t a s o n + s u b v e n t i o i n + s u b v e n t i o p e t o s t e n + s u b v e n t i o s k a n d a a l e i l l a + s u d a n i l a i s i a + s u d a n i l a i s j o h t a j a n + s u d a n i l a i s p a k o l a i s i i n + s u d a n i l a i s p a k o l a i s t a + s u d a n i l a i s t a + s u d a n i l a i s t e n + s u d e e t t i a l u e e l l a + s u d e e t t i p a k o l a i s t e n + s u d e e t t i s a k s a l a i s e t + s u d e e t t i s a k s a l a i s i a + s u d e e t t i s a k s a l a i s t e n + s u d e n + s u d e n h o i t o s u u n n i t e l m a n + s u d e n k u o p a s t a + s u d e n k u o p p i a + s u d e n m a i t o + s u d e n m a r j a + s u d e n m e t s ä s t y k s e s t ä + s u d e n m e t s ä s t y s + s u d e n p e n n u t + s u d e n p e s ä + s u h d a n n e a r v i o + s u h d a n n e a r v i o n + s u h d a n n e h e i l a h t e l u i s s a + s u h d a n n e h ä i r i ö i d e n + s u h d a n n e j a k s o a + s u h d a n n e j a k s o o n + s u h d a n n e j a k s o s s a + s u h d a n n e k e h i t y k s e n + s u h d a n n e k e h i t y s t ä + s u h d a n n e k i e r r o n + s u h d a n n e k i e r t o + s u h d a n n e k i e r t o a + s u h d a n n e k i e r t o i h i n + s u h d a n n e k o r j a t u n + s u h d a n n e k o r j a u k s i a + s u h d a n n e k r i i s e i h i n + s u h d a n n e k r i i s e j ä + s u h d a n n e k r i i s i + s u h d a n n e k r i i s i i n + s u h d a n n e k r i i s i n + s u h d a n n e m u u t o s t e n + s u h d a n n e n e u t r a a l i e n + s u h d a n n e n o u s u + s u h d a n n e o h j e l m i l l a + s u h d a n n e o n g e l m i a + s u h d a n n e p o l i i t t i s e s s a + s u h d a n n e p o l i t i i k k a + s u h d a n n e p o l i t i i k k a a + s u h d a n n e s y i s t ä + s u h d a n n e s y k l i s s ä + s u h d a n n e t a a n t u m a + s u h d a n n e t a a n t u m i a + s u h d a n n e t a a n t u m i e n + s u h d a n n e t a s o i t e t t u a + s u h d a n n e t a s o i t e t t u u n + s u h d a n n e t e k i j ö i s t ä + s u h d a n n e t i l a n t e e s t a + s u h d a n n e t i l a s t o j a + s u h d a n n e t y ö t t ö m y y t t ä + s u h d a n n e v a i h e e t + s u h d a n n e v a i h t e l u + s u h d a n n e v a i h t e l u i h i n + s u h d a n n e v a i h t e l u i l l e + s u h d a n n e v a i h t e l u i s t a + s u h d a n n e v a i h t e l u i t a + s u h d a n n e v a i h t e l u j a + s u h d a n n e v a i h t e l u j e n + s u h d a n n e v a i h t e l u n + s u h d a n n e v a i h t e l u t + s u h d a n n e v a i h t e l u t i l a n n e + s u h d a n n e v ä l i n e e n ä + s u h d a n t e e n + s u h d a n t e e t + s u h d a n t e i d e n + s u h d a n t e i s i i n + s u h d a n t e i s s a + s u h d a n t e i s t a + s u h d a n t e i t a + s u h d e i l m a s t o + s u h d e k o h t a i s i a + s u h d e l u v u i l l a + s u h d e l u v u s t a + s u h d e p o l i t i i k k a a + s u h d e t o i m i n n a n + s u h d e t o i m i n n a s s a + s u h d e t o i m i n n a s t a + s u h d e t o i m i n t a + s u h d e t o i m i n t a a + s u h d e t o i m i n t a a n + s u h d e t o i m i n t a a n s a + s u h d e t o i m i n t a h y s t e r i a + s u h d e t o i m i n t a k a m p p a i l u a + s u h d e t o i m i n t a k y s y m y s + s u h d e t o i m i n t a o n g e l m a + s u h d e t o i m i n t a s t r a t e g i a n + s u h d e t o i m i n t a t i e t o i s e n a + s u h d e t o i m i n t a t y ö h ö n + s u h d e t o i m i n t a t y ö l l ä ä n + s u h d e t o i m i n t a t y ö t ä + s u h d e t t a + s u h d e t t a a n + s u h d e t t a m m e + s u h d e v e r k k o + s u h d e v e r k o s t o + s u h d e v e r k o s t o o n + s u h i s e e + s u h t a u d u i t t e p a + s u h t a u d u m m e + s u h t a u d u m m e k i n + s u h t a u d u n + s u h t a u d u t a a n + s u h t a u d u t t a i s i i n + s u h t a u d u t t a v a + s u h t a u d u t t i i n + s u h t a u d u t t u + s u h t a u t u a + s u h t a u t u i + s u h t a u t u i s i + s u h t a u t u i v a t + s u h t a u t u k a a + s u h t a u t u k a a m m e + s u h t a u t u m a a n + s u h t a u t u m a t t a + s u h t a u t u m i s e e m m e + s u h t a u t u m i s e e n + s u h t a u t u m i s e s s a + s u h t a u t u m i s e s s a m m e + s u h t a u t u m i s e s t a + s u h t a u t u m i s e s t a a n + s u h t a u t u m i s t a + s u h t a u t u m i s t a a n + s u h t a u t u m i s t a n i + s u h t a u t u m i s t a p a + s u h t a u t u m i s t a p a a + s u h t a u t u m i s t a p a n s a + s u h t a u t u m i s t a p o j a + s u h t a u t u m i s t a v a n + s u h t a u t u m i s t a v a s t a m m e + s u h t a u t u n e e t + s u h t a u t u n u t + s u h t a u t u u + s u h t a u t u u k o + s u h t a u t u v a n s a + s u h t a u t u v a t + s u h t e e l l a + s u h t e e l l i s e e n + s u h t e e l l i s e m p i + s u h t e e l l i s e m p i a + s u h t e e l l i s e n + s u h t e e l l i s e s s a + s u h t e e l l i s e s t a + s u h t e e l l i s e s t i k i n + s u h t e e l l i s i a + s u h t e e l l i s i i n + s u h t e e l l i s i l l a + s u h t e e l l i s t e n + s u h t e e l l i s u u d e n + s u h t e e l l i s u u d e n t a j u + s u h t e e l l i s u u d e n t a j u a + s u h t e e l l i s u u d e n t a j u a a n + s u h t e e l l i s u u d e n t a j u a m m e + s u h t e e l l i s u u d e n t a j u i s e s t i + s u h t e e l l i s u u d e n t a j u m m e + s u h t e e l l i s u u d e n t a j u n + s u h t e e l l i s u u d e n t a j u n s a + s u h t e e l l i s u u d e n t a j u u n + s u h t e e l l i s u u d e s t a + s u h t e e l l i s u u s l a u s e k e + s u h t e e l l i s u u s o n g e l m a t + s u h t e e l l i s u u s p e r i a a t e + s u h t e e l l i s u u s p e r i a a t e t t a + s u h t e e l l i s u u s p e r i a a t t e e l l a + s u h t e e l l i s u u s p e r i a a t t e e n + s u h t e e l l i s u u s p e r i a a t t e e s e e n + s u h t e e l l i s u u s p e r i a a t t e e s t a + s u h t e e l l i s u u s p e r i a a t t e e t + s u h t e e l l i s u u s p e r i a a t t e i d e n + s u h t e e l l i s u u s p e r i a a t t e i t a + s u h t e e l l i s u u s s ä ä n t ö ä + s u h t e e l l i s u u s t a r k i s t u k s e n + s u h t e e l l i s u u s t a r k i s t u s t a + s u h t e e l l i s u u s t e o r i a + s u h t e e l l i s u u s t e s t e j ä + s u h t e e l l i s u u s t e s t i + s u h t e e l l i s u u s t e s t i n + s u h t e e l l i s u u s t e s t i s s ä + s u h t e e l l i s u u s t e s t i s t ä + s u h t e e l l i s u u s t e s t i ä + s u h t e e l l i s u u t e e n + s u h t e e m m e + s u h t e e n s a + s u h t e e s t a + s u h t e e t + s u h t e e t o n t a + s u h t e e t t o m a l t a + s u h t e e t t o m a n + s u h t e e t t o m i a + s u h t e e t t o m i i n + s u h t e e t t o m i n a + s u h t e i d e m m e + s u h t e i d e n + s u h t e i l l a + s u h t e i l l e + s u h t e i l t a + s u h t e i s i i m m e + s u h t e i s i i n + s u h t e i s s a + s u h t e i s s a a n + s u h t e i s s a m m e + s u h t e i s t a + s u h t e i t a a n + s u h t e i t a m m e + s u h t e u t e t t a v a + s u h t e u t e t t u + s u h t e u t e t t u j a + s u h t e u t e t t u n a + s u h t e u t t a m i s j ä r j e s t e l m ä n + s u i h k e p u l l o + s u i h k u g e e l i ä + s u i h k u h u o n e i s t a + s u i h k u h ä v i t t ä j ä ä n + s u i h k u k o n e e l t a + s u i h k u k o n e i d e n + s u i h k u k o n e t t a + s u i h k u l a i t t e i d e n + s u i h k u l a i t t e i t a + s u i h k u l e n t o k o n e + s u i h k u m o o t t o r e i d e n + s u i h k u m o o t t o r i + s u i h k u m o o t t o r i n + s u i h k u m o o t t o r i v a l m i s t a j a a + s u i h k u s e u r a p i i r i + s u i h k u v i r t a u s + s u i k o + s u i p p o h u u l i s a r v i k u o n o + s u i p p o h ä r k y l ä + s u i p p u m a d o n l a k k i + s u i p p u m y r k k y s e i t i k k i + s u i s t a m i s e k s i + s u i s t o a l u e e l l a + s u i s t o k r o k o t i i l i + s u i s t o m a i l l a + s u i t s i e n + s u i t s u k e t i e + s u j a u t t a a + s u j u a + s u j u i + s u j u i s i + s u j u i v a t + s u j u m i s e e n + s u j u n e e n + s u j u n e e t + s u j u n u t + s u j u u + s u j u u k o + s u j u v a a + s u j u v a a n + s u j u v a l l a + s u j u v a l l e + s u j u v a m m a t + s u j u v a m m i n + s u j u v a m p a a + s u j u v a m p i a + s u j u v a n + s u j u v a s t a + s u j u v a t + s u j u v i m m i l l e + s u j u v o i t t a m i s e k s i + s u j u v u u d e n + s u j u v u u d e s t a + s u j u v u u t t a + s u k a s n o k k a + s u k e l l u s k e l l o + s u k e l l u s l i n t u j e n + s u k e l l u s n a a m a r i + s u k e l l u s p u k u + s u k e l l u s t a u l u k o t + s u k e l l u s t i e t o k o n e + s u k e l l u s v e n e + s u k e l l u s v e n e l a i v a s t o o n + s u k e l l u s v e n e l u o k i s t a + s u k e l l u s v e n e o s a s t o + s u k e l l u s v e n e s o d a n k ä y n t i + s u k e l l u s v e n e v e r k k o + s u k e l t a j a n k e l l o + s u k e l t a j a n t a u t i + s u k e l t a m a t t a + s u k k a n a u h a k ä ä r m e e t + s u k k a n a u h a r i t a r i k u n t a + s u k k e l a a + s u k k e l u u t e n s a + s u k k u l a d i p l o m a t i a + s u k k u l a d i p l o m a t i a n + s u k k u l a d i p l o m a t i a s s a a n + s u k k u l a j u n a a + s u k k u l a l e n n o t + s u k k u l a l i i k e n n e p a l v e l u i t a + s u k k u l a m e r i e t a n a + s u k k u l a p a l v e l u n + s u k k u l a r i h m a s t o + s u k l a a d i r e k t i i v i + s u k l a a d i r e k t i i v i i n + s u k l a a d i r e k t i i v i k s i + s u k l a a d i r e k t i i v i n + s u k l a a d i r e k t i i v i s s ä + s u k l a a d i r e k t i i v i ä + s u k l a a k a k k u + s u k l a a k e s k u s t e l u + s u k l a a k e s k u s t e l u m m e + s u k l a a k e s k u s t e l u n + s u k l a a k e s k u s t e l u s s a + s u k l a a k s i + s u k l a a k u k k a + s u k l a a l e v i t t e i d e n + s u k l a a l e v y ä + s u k l a a m a r k k i n o i d e n + s u k l a a m a r k k i n o i s t a + s u k l a a m u n i a + s u k l a a n + s u k l a a n o m a i s e t + s u k l a a n s y ö j ä t + s u k l a a n t u o t a n n o l l e + s u k l a a n t u o t t a j a t + s u k l a a n t u o t t a j i a + s u k l a a n v a l m i s t a j a + s u k l a a n v a l m i s t a j a t + s u k l a a n v a l m i s t a j i a a n + s u k l a a n v a l m i s t a j i e n + s u k l a a n v a l m i s t a j i e n s a + s u k l a a o s a + s u k l a a p e r i n t e e l l e + s u k l a a r u s i n a + s u k l a a s a v u k k e i d e n + s u k l a a s n o b e i l l e + s u k l a a s o t a + s u k l a a s t a + s u k l a a s t a a n + s u k l a a t a + s u k l a a t e h d a s + s u k l a a t e o l l i s u u d e l l e + s u k l a a t e o l l i s u u d e l t a + s u k l a a t e o l l i s u u d e n + s u k l a a t e o l l i s u u d e s s a + s u k l a a t e o l l i s u u d e s t a + s u k l a a t e o l l i s u u s + s u k l a a t e o l l i s u u t t a a n + s u k l a a t u o t t e e k s i + s u k l a a t u o t t e e s e e n + s u k l a a t u o t t e e t + s u k l a a t u o t t e i d e n + s u k l a a t u o t t e i s i i n + s u k l a a t u o t t e i s s a + s u k l a a t u o t t e i s t a + s u k l a a t u o t t e i t a + s u k l a a t u p a k a t + s u k l a a t y y p p i e n + s u k u e l i n h e r p e s + s u k u e l i n t e n + s u k u j u h l a + s u k u k y p s y y s + s u k u l a i s h e i m o i l t a + s u k u l a i s h o i v a a j i l l e + s u k u l a i s i a + s u k u l a i s i a a n + s u k u l a i s i i n s a + s u k u l a i s i l l e + s u k u l a i s i l l e e n + s u k u l a i s i s t a + s u k u l a i s i s t a a n + s u k u l a i s r a k k a u t t a + s u k u l a i s v a l i n t a + s u k u n i m e n i + s u k u n i m e n s ä + s u k u n i m i + s u k u n i m i l a k i + s u k u n s a + s u k u p o l v e a + s u k u p o l v e a n i + s u k u p o l v e e n + s u k u p o l v e e n i + s u k u p o l v e l l a + s u k u p o l v e l l e + s u k u p o l v e n + s u k u p o l v e n v a i h d o k s e n + s u k u p o l v e n v a i h d o k s i a + s u k u p o l v e n v a i h d o s t a + s u k u p o l v e n v a i h d o s t e n + s u k u p o l v e n v u o r o t t e l u + s u k u p o l v e s t a + s u k u p o l v e t + s u k u p o l v i + s u k u p o l v i a + s u k u p o l v i a l u s + s u k u p o l v i a m m e + s u k u p o l v i e m m e + s u k u p o l v i e n + s u k u p o l v i e n v ä l i s e e n + s u k u p o l v i i n + s u k u p o l v i i n s a + s u k u p o l v i k y s y m y s + s u k u p o l v i l l a + s u k u p o l v i l l e + s u k u p o l v i l t a + s u k u p o l v i s t a + s u k u p o l v i t a r k i s t u k s e l l a + s u k u p o l v i t i l i n p i t o a + s u k u p o l v i t i l i n p i t o j ä r j e s t e l m ä + s u k u p u o l e e n + s u k u p u o l e l l e + s u k u p u o l e n + s u k u p u o l e n k o r j a u s p r o s e s s i + s u k u p u o l e n s a + s u k u p u o l e n t u t k i m u s + s u k u p u o l e s t a + s u k u p u o l e t + s u k u p u o l i + s u k u p u o l i a n a l y y s i + s u k u p u o l i a n a l y y s i ä + s u k u p u o l i a s i a t + s u k u p u o l i a s i o i s t a + s u k u p u o l i d i r e k t i i v i + s u k u p u o l i e l i m e t + s u k u p u o l i e l i m i ä + s u k u p u o l i e l i m i ä ä n + s u k u p u o l i e l i n + s u k u p u o l i e l i n t e n + s u k u p u o l i e l ä m ä s t ä + s u k u p u o l i e l ä m ä s t ä ä n + s u k u p u o l i e l ä m ä ä + s u k u p u o l i e n + s u k u p u o l i e r o j a + s u k u p u o l i e r o j e n + s u k u p u o l i e r o t t e l u a + s u k u p u o l i e r o t t e l u n + s u k u p u o l i h a a s t e + s u k u p u o l i h o r m o n e i s t a + s u k u p u o l i h o r m o n i e n + s u k u p u o l i j a k a u m a + s u k u p u o l i j a k a u m a a + s u k u p u o l i j a k a u m a l t a a n + s u k u p u o l i j a k o + s u k u p u o l i j a k o a + s u k u p u o l i j a k o j a + s u k u p u o l i k a s v a t u k s e e n + s u k u p u o l i k a s v a t u k s e n + s u k u p u o l i k a s v a t u k s e s t a + s u k u p u o l i k a s v a t u s + s u k u p u o l i k a s v a t u s m e n e t e l m i e n + s u k u p u o l i k a s v a t u s t a + s u k u p u o l i k i i n t i ö i h i n + s u k u p u o l i k i i n t i ö i t ä + s u k u p u o l i k o h t a i n e n + s u k u p u o l i k o h t a i s e t + s u k u p u o l i k o h t a i s i a + s u k u p u o l i k o h t a i s t e n + s u k u p u o l i k u m p p a n i n s a + s u k u p u o l i k y s y m y k s e n + s u k u p u o l i k y s y m y k s e t + s u k u p u o l i k y s y m y k s i i n + s u k u p u o l i k y s y m y k s i l l e + s u k u p u o l i k y s y m y k s i s s ä + s u k u p u o l i k y s y m y k s i ä + s u k u p u o l i k y s y m y s + s u k u p u o l i k y s y m y s t e n + s u k u p u o l i k y s y m y s t ä + s u k u p u o l i k ä s i t y k s e t + s u k u p u o l i k ä y t t ä y t y m i s e n + s u k u p u o l i k ä y t t ä y t y m i s e s t ä + s u k u p u o l i l ä h e s t y m i s t a p a + s u k u p u o l i n e u t r a a l e j a + s u k u p u o l i n e u t r a a l i + s u k u p u o l i n e u t r a a l i a + s u k u p u o l i n e u t r a a l i l l a + s u k u p u o l i n e u t r a a l i m m a l l e + s u k u p u o l i n e u t r a a l i m p a a + s u k u p u o l i n e u t r a a l i n + s u k u p u o l i n e u t r a a l i s u u s + s u k u p u o l i n e u v o n t a p a l v e l u t + s u k u p u o l i n ä k ö k o h d a n + s u k u p u o l i n ä k ö k o h d a t + s u k u p u o l i n ä k ö k o h d i s t a + s u k u p u o l i n ä k ö k o h t a + s u k u p u o l i n ä k ö k o h t i a + s u k u p u o l i n ä k ö k o h t i e n + s u k u p u o l i n ä k ö k o h t i i n + s u k u p u o l i n ä k ö k u l m a + s u k u p u o l i n ä k ö k u l m a a + s u k u p u o l i n ä k ö k u l m a a n + s u k u p u o l i n ä k ö k u l m a n + s u k u p u o l i n ä k ö k u l m a s t a + s u k u p u o l i n ä k ö k u l m a t + s u k u p u o l i o i k e u k s i e n + s u k u p u o l i o m i n a i s u u s + s u k u p u o l i p e r u s t e i n e n + s u k u p u o l i p e r u s t e i s i a + s u k u p u o l i p o l i t i i k a n + s u k u p u o l i p o l i t i i k a t + s u k u p u o l i p o l i t i i k k a + s u k u p u o l i p o l i t i i k k a a n + s u k u p u o l i r a k e n n e + s u k u p u o l i r o o l e i h i n + s u k u p u o l i r o o l e j a + s u k u p u o l i r o o l i + s u k u p u o l i r o o l i k y s y m y k s i ä + s u k u p u o l i r o o l i k y s y m y s t e n + s u k u p u o l i r o o l i m a l l i n + s u k u p u o l i r o o l i t + s u k u p u o l i s e e n + s u k u p u o l i s e n s i t i i v i s e n + s u k u p u o l i s e n s i t i i v i s i l l ä + s u k u p u o l i s e n s i t i i v i s i s t ä + s u k u p u o l i s e s t a + s u k u p u o l i s i a + s u k u p u o l i s i d o n n a i n e n + s u k u p u o l i s i d o n n a i s e k s i + s u k u p u o l i s i d o n n a i s e n + s u k u p u o l i s i d o n n a i s e n a + s u k u p u o l i s i d o n n a i s e t + s u k u p u o l i s i d o n n a i s t a + s u k u p u o l i s i d o n n a i s u u d e n + s u k u p u o l i s t e r e o t y p i a t + s u k u p u o l i s t e r e o t y p i o i d e n + s u k u p u o l i s t e r e o t y p i o i h i n + s u k u p u o l i s t e r e o t y p i o i l l e + s u k u p u o l i s t e r e o t y p i o i s t a + s u k u p u o l i s t e r e o t y p i o i t a + s u k u p u o l i s u h d e + s u k u p u o l i s u h t e e n + s u k u p u o l i s u h t e e s s a + s u k u p u o l i s u h t e e t + s u k u p u o l i s u h t e i d e n + s u k u p u o l i s u h t e i s t a + s u k u p u o l i s u h t e i t a + s u k u p u o l i s y r j i n n ä l t ä + s u k u p u o l i s y r j i n n ä n + s u k u p u o l i s y r j i n n ä s t ä + s u k u p u o l i s y r j i n t ä + s u k u p u o l i s y r j i n t ä t a p a u k s i s s a + s u k u p u o l i s y r j i n t ä ä + s u k u p u o l i t a s a p a i n o + s u k u p u o l i t a s a p a i n o n + s u k u p u o l i t a u d e i l t a + s u k u p u o l i t a u d e i s t a + s u k u p u o l i t a u d i n + s u k u p u o l i t a u d i t + s u k u p u o l i t a u t e j a + s u k u p u o l i t a u t i + s u k u p u o l i t a u t i e n + s u k u p u o l i t a u t i t a r t u n t o j a + s u k u p u o l i t a u t i t a r t u n t o j e n + s u k u p u o l i t e k i j ä + s u k u p u o l i t u t k i m u s + s u k u p u o l i u l o t t u v u u d e l l a + s u k u p u o l i u l o t t u v u u d e n + s u k u p u o l i u l o t t u v u u d e s s a + s u k u p u o l i u l o t t u v u u d e s t a + s u k u p u o l i u l o t t u v u u s + s u k u p u o l i u l o t t u v u u t e e n + s u k u p u o l i u l o t t u v u u t t a + s u k u p u o l i v a i k u t u k s e t + s u k u p u o l i v a i k u t u s t e n + s u k u p u o l i v a l i k o i n n i n + s u k u p u o l i v a l i s t u s + s u k u p u o l i v a l i s t u s t a + s u k u p u o l i v ä h e m m i s t ö j e n + s u k u p u o l i y h d y n t ä + s u k u p u o l i y h d y n t ä ä + s u k u p u o l i y h d y n t ä ä n + s u k u p u o l i y h t e y d e s s ä + s u k u p u o l i y h t e y d e t + s u k u p u o l i y h t e y k s i ä + s u k u p u o l i y h t e y t e e n + s u k u p u o l t a + s u k u p u o l t e n + s u k u p u u + s u k u p u u t t o o n + s u k u p u u t t o v e l k a + s u k u s a l a i s u u s + s u k u s o l u j a + s u k u s o l u l i n j o j a + s u k u s o l u t + s u k u t i l a l l a + s u k u t i l a n + s u k u t i l o i l l e + s u k u t i l o j e n + s u k u t u t k i m u s o h j e l m a + s u k u v e r i k o s t o + s u k u v i k a + s u l a a + s u l a e s s a + s u l a m i s e n + s u l a m i s e t + s u l a m i s l ä m p ö + s u l a m i s p i s t e + s u l a n h a r a k k a k o t t a r a i n e n + s u l a n i s o j a l k a + s u l a n k u n i n g a s k o t t a r a i n e n + s u l a n r o t t a + s u l a n t o r n i p ö l l ö + s u l a t e l l a + s u l a t t e l u u n + s u l a t u s j ä r j e s t e l m ä m m e + s u l a t u s u u n i + s u l a t u s u u n i a + s u l a t u s u u n i i n + s u l a t u s u u n i n a + s u l a t u s u u n i s s a + s u l a t u s u u n i s t a + s u l a u t t a a + s u l a u t t a m i s k a p a s i t e e t t i + s u l a u t t a m i s p o l i t i i k a n + s u l a u t t a m i s p r o s e s s i a + s u l a u t u m a e h d o t u k s i a + s u l a u t u m a s t a + s u l a u t u m i i n + s u l a u t u m i s a s e t u k s e n + s u l a u t u m i s a s e t u k s e s s a + s u l a u t u m i s a s e t u k s e t + s u l a u t u m i s e t + s u l a u t u m i s h a n k e + s u l a u t u m i s h a n k k e e s e e n + s u l a u t u m i s i s s a + s u l a u t u m i s r a h a s t o t + s u l a u t u m i s s o p i m u k s e n + s u l a u t u m i s s u u n n i t e l m a n + s u l a u t u m i s s u u n n i t e l m a s t a + s u l a u t u m i s t e n + s u l a u t u m i s v a l v o n n a n + s u l a u t u n u t t a + s u l a u t u v a a n + s u l a u t u v a t + s u l a v a a + s u l a v a l l a + s u l a v a m m i n + s u l a v u u t t a + s u l f a a t i n + s u l f a a t i t + s u l f a a t t i b a k t e e r i t + s u l f a a t t i m e n e t e l m ä + s u l f i i t t i j ä t e t t ä + s u l f i i t t i m e n e t e l m ä + s u l j e m m e k o + s u l j e t a + s u l j e t a a n + s u l j e t t a i s i i n + s u l j e t t a v a + s u l j e t t i i n + s u l j e t t u a a n + s u l j e t t u i n a + s u l j e t t u j a + s u l j e t t u u n + s u l j e t u i l l e + s u l j e t u i m m i s t a + s u l j e t u i n + s u l j e t u i s s a + s u l j e t u i s t a + s u l j e t u k s i + s u l j e t u l l a + s u l j e t u m m a n + s u l j e t u m p i + s u l j e t u m p i e n + s u l j e t u m p i i n + s u l j e t u n + s u l j e t u s s a + s u l j e t u t + s u l k a k o i p i k o r e n t o + s u l k a n i r k k o + s u l k a s a m m a l + s u l k e a + s u l k e a k s e e n + s u l k e i s e t + s u l k e i s i i n + s u l k e k a a m m e + s u l k e m a a n + s u l k e m a l l a + s u l k e m a t t a + s u l k e m i s a i k a t a u l u i s t a + s u l k e m i s a j a n k o h d a s t a + s u l k e m i s a j a n k o h t i e n + s u l k e m i s a j a s t a + s u l k e m i s e e n + s u l k e m i s e n + s u l k e m i s e s t a + s u l k e m i s e t + s u l k e m i s h a n k k e e n + s u l k e m i s i a + s u l k e m i s i i n + s u l k e m i s i l m o i t u s + s u l k e m i s i s t a + s u l k e m i s j a k s o n + s u l k e m i s k a u d e n + s u l k e m i s k u s t a n n u k s i s t a + s u l k e m i s m e k a n i s m i t + s u l k e m i s m e n e t t e l y ä + s u l k e m i s o h j e l m a a + s u l k e m i s o h j e l m a a n + s u l k e m i s p r o s e s s i e n + s u l k e m i s p r o s e s s i i n + s u l k e m i s p r o s e s s i n + s u l k e m i s p r o s e s s i s s a + s u l k e m i s p y r k i m y k s i ä + s u l k e m i s p ä i v ä + s u l k e m i s p ä i v ä m ä ä r i ä + s u l k e m i s p ä i v ä m ä ä r ä ä + s u l k e m i s p ä i v ä n + s u l k e m i s p ä ä t ö k s e t + s u l k e m i s p ä ä t ö s + s u l k e m i s p ä ä t ö s t e n + s u l k e m i s s o p i m u s t a + s u l k e m i s s u u n n i t e l m a a + s u l k e m i s s u u n n i t e l m a a n + s u l k e m i s s u u n n i t e l m a n + s u l k e m i s s u u n n i t e l m a s t a + s u l k e m i s s u u n n i t e l m i a + s u l k e m i s s u u n n i t e l m i k s i + s u l k e m i s s u u n n i t e l m i s t a + s u l k e m i s t a + s u l k e m i s t o i m e n p i t e i d e n + s u l k e m i s t u e n + s u l k e m i s t y ö h ö n + s u l k e m i s v a a t i m u k s i s t a + s u l k e m i s v a a t i m u s t a + s u l k e u t u a + s u l k e u t u i + s u l k e u t u m i n e n + s u l k e u t u m i s t a + s u l k e u t u v a t + s u l k e v a n + s u l k e v a t + s u l k u j a + s u l k u j ä r j e s t e l m i ä + s u l k u j ä r j e s t e l y j ä + s u l k u p a l l o + s u l k u p o r t t i e n + s u l k u t i l i + s u l k u t i l i l l e + s u l o s o i n t u j a + s u l t t a a n i k a n a + s u l t t a a n i k u n t a + s u l t t a a n i p e r h o n e n + s u l t t a a n i t i a i n e n + s u l t t a a n i t i k k a + s u l u i s t a + s u l u n m e r i + s u l u n s a r v i n o k k a + s u m a n + s u m i e n + s u m m a a n + s u m m a e p ä y h t ä l ö + s u m m a l l a + s u m m a l t a + s u m m a n + s u m m a n a + s u m m a s t a + s u m m a t + s u m m a t t u n a + s u m m a u s k y t k e n t ä + s u m m e r i n + s u m m i a + s u m m i e n + s u m m i i n + s u m m i s s a a n + s u m m i s t a + s u m m i t t a i s i s t a + s u m u h a i + s u m u i s t a + s u m u k a m m i o + s u m u k u i v a u s + s u m u p i l v i + s u m u s s a + s u m u v e r h o n a + s u m u v i r n a y ö k k ö n e n + s u m u v u o r e t + s u n d a l a i s e t + s u n d a n h u u h k a j a + s u n d a n j o k i r a s t a s + s u n d a n k a l a h u u h k a j a + s u n d a n k i r j o r a s t a s + s u n d a n k u r p p a + s u n d a n l a s i m o n n i + s u n d a n l a t i m e r i a + s u n d a n n a k k e l i + s u n d a n p a r a t i i s i p e i p p o + s u n d a n s i e p p o k e r t t u + s u n d a n s i l k k i k e r t t u n e n + s u n d a n t u u l i h a u k k a + s u n d a n t y l l i + s u n d a n u u n i l i n t u + s u n d a n v i h e r h a r a k k a + s u n d a s a a r e t + s u n d a s a l m i + s u n n i d y n a s t i a a + s u n n i j ä s e n i ä + s u n n i k o l m i o o n + s u n n i m u s l i m e i t a + s u n n i p o l i i t i k o n + s u n n i p u o l u e e l t a + s u n n i t + s u n n i t e r r o r i s t i e n + s u n n i v ä e s t ö n + s u n n i v ä h e m m i s t ö j e n + s u n n i y h t e i s ö + s u n n i y h t e i s ö l l e + s u n n u n t a i a a m u n a + s u n n u n t a i a a m u u n + s u n n u n t a i a l l i a n s s i + s u n n u n t a i k i r j a i n + s u n n u n t a i k ä v e l y + s u n n u n t a i l e h t i + s u n n u n t a i l e p o o n + s u n n u n t a i l i i k e n t e e l l e + s u n n u n t a i m a a l a r e i d e n + s u n n u n t a i n a + s u n n u n t a i p u h e e t + s u n n u n t a i p u h e i d e n + s u n n u n t a i p u h e i t a + s u n n u n t a i t a + s u n n u n t a i t y ö + s u n n u n t a i t y ö s t ä + s u n n u n t a i t y ö t ä + s u n n u n t a i v a p a a s t a + s u n n u n t a i v a p a a t a + s u n n u n t a i y ö n ä + s u o a l u e + s u o a l u e e l l a + s u o a l u e e l l e + s u o a r a b e j a + s u o a r a b i a + s u o a r a b i t + s u o d a t i n j ä r j e s t e l m i l l ä + s u o d a t i n p a p e r i + s u o d a t i n p u s s i + s u o d a t i n t e k n i i k a s t a + s u o d a t i n t e k n o l o g i a a + s u o d a t t a m i s e k s i + s u o d a t t i m i a + s u o d a t t u u + s u o d a t u s j ä r j e s t e l m i e n + s u o d a t u s j ä r j e s t e l m i ä + s u o d a t u s j ä r j e s t e l m ä n + s u o d a t u s j ä r j e s t e l m ä ä + s u o d a t u s l e i r e i l l e + s u o d a t u s m e k a n i s m e j a + s u o d a t u s o h j e l m i a + s u o d a t u s o h j e l m i s t o + s u o d a t u s o h j e l m i s t o n + s u o d a t u s s o v e l l u s t e n + s u o d a t u s t e k n i i k o i d e n + s u o d a t u s v e l v o i t e + s u o h i r v i + s u o h o n + s u o h o p e a t ä p l ä + s u o h o r s m a + s u o h y y p p ä + s u o j a a m a a n + s u o j a a m a s t a + s u o j a a m a t t o m i a + s u o j a a m a t t o m u u d e n + s u o j a a m i s e k s i + s u o j a a m i s e s t a + s u o j a a m i s j ä r j e s t e l m ä + s u o j a a m i s j ä r j e s t e l y i h i n + s u o j a a m i s j ä r j e s t e l y j e n + s u o j a a m i s j ä r j e s t e l y j ä + s u o j a a m i s k e h y s t ä + s u o j a a m i s o h j e l m a a n + s u o j a a m i s t a + s u o j a a m i s t o i m e n p i t e i t ä + s u o j a a m i s t o i m i a + s u o j a a n s a + s u o j a a v a m p i + s u o j a a v a n + s u o j a a v a t + s u o j a a v i a + s u o j a a v i e n + s u o j a a v i l l a + s u o j a a v i n + s u o j a d i r e k t i i v i i n + s u o j a d i r e k t i i v i n + s u o j a e h t o j a + s u o j a e h t o j e n + s u o j a e r o t u s m u u n t a j a + s u o j a h a n k k e e n + s u o j a i k ä r a j a + s u o j a i k ä r a j a a + s u o j a i k ä r a j o j a + s u o j a j a l k i n e i d e n + s u o j a j o u k k o j a + s u o j a j o u k k o j e n + s u o j a j ä r j e s t e l m i e n + s u o j a j ä r j e s t e l m i ä + s u o j a j ä r j e s t e l m ä + s u o j a j ä r j e s t e l m ä l l ä + s u o j a j ä r j e s t e l m ä m m e + s u o j a j ä r j e s t e l m ä n + s u o j a j ä r j e s t e l m ä n ä + s u o j a j ä r j e s t e l m ä s s ä + s u o j a j ä r j e s t e l m ä ä + s u o j a j ä r j e s t e l m ä ä n + s u o j a j ä r j e s t e l y + s u o j a j ä r j e s t e l y i h i n + s u o j a j ä r j e s t e l y j ä + s u o j a j ä r j e s t e l y t + s u o j a k a a s u + s u o j a k a i t e i t a + s u o j a k a u d e n + s u o j a k a u s i + s u o j a k a u s i e n + s u o j a k e i n o + s u o j a k e i n o i h i n + s u o j a k e i n o i l l a + s u o j a k e i n o i s t a + s u o j a k e i n o j a + s u o j a k e i n o j e n + s u o j a k e i n o t + s u o j a k e l l a r e i s s a + s u o j a k e r r o s + s u o j a k i l p e n ä + s u o j a k i l p e ä + s u o j a k i l p i + s u o j a k i l p i n ä + s u o j a k i l v e n + s u o j a k i l v e s t ä + s u o j a k l a u s u u l i a + s u o j a k o t e j a + s u o j a k s i + s u o j a k u o r e l l a + s u o j a k ä s i t t e l y n ä + s u o j a l a i t o k s i s s a + s u o j a l a u s e k e + s u o j a l a u s e k e m e n e t t e l y + s u o j a l a u s e k e m e n e t t e l y n + s u o j a l a u s e k e m e n e t t e l y ä + s u o j a l a u s e k e m ä ä r ä y s t ä + s u o j a l a u s e k e t o i m e n p i t e i t ä + s u o j a l a u s e k e t t a + s u o j a l a u s e k k e e l l a + s u o j a l a u s e k k e e l l e + s u o j a l a u s e k k e e n + s u o j a l a u s e k k e e s e e n + s u o j a l a u s e k k e e s s a + s u o j a l a u s e k k e e s t a + s u o j a l a u s e k k e e t + s u o j a l a u s e k k e i d e n + s u o j a l a u s e k k e i l l a + s u o j a l a u s e k k e i l l e + s u o j a l a u s e k k e i s i i n + s u o j a l a u s e k k e i s t a + s u o j a l a u s e k k e i t a + s u o j a l i i v i + s u o j a m e k a n i s m e i h i n + s u o j a m e k a n i s m e i l l a + s u o j a m e k a n i s m e i s s a + s u o j a m e k a n i s m e i s t a + s u o j a m e k a n i s m e j a + s u o j a m e k a n i s m i + s u o j a m e k a n i s m i a + s u o j a m e k a n i s m i e n + s u o j a m e k a n i s m i n + s u o j a m e k a n i s m i s t a + s u o j a m e k a n i s m i t + s u o j a m e n e t t e l y j ä + s u o j a m e n e t t e l y n + s u o j a m e n e t t e l y ä + s u o j a m u o d o n + s u o j a m u o t o j a + s u o j a m u u r i e n + s u o j a m u u r i n + s u o j a m u u r i v e r k o s t o j e n + s u o j a m ä ä r ä y k s i ä + s u o j a n + s u o j a n a + s u o j a n o r m e j a + s u o j a o i k e u k s i a + s u o j a p a i k k a + s u o j a p a i k k a a + s u o j a p a i k k a a n + s u o j a p a i k k o j a + s u o j a p o l i t i i k k a + s u o j a p u s k u r i n a + s u o j a r a h a s t o i l l a + s u o j a r a k e n n e l m a a + s u o j a r a k e n n e l m i s t a + s u o j a r a k e n n u k s e n + s u o j a r a k e n t e e t + s u o j a r a k e n t e i d e n + s u o j a r a k e n t e i s t a + s u o j a r a k e n t e i t a + s u o j a r o k o t u s t e n + s u o j a s a t a m a + s u o j a s a t a m a s s a + s u o j a s a t a m a t + s u o j a s e i n ä m ä + s u o j a s s a + s u o j a s t a n d a r d e j a + s u o j a s ä ä + s u o j a s ä ä n n ö k s i i n + s u o j a s ä ä n t ö j e n + s u o j a s ä ä n t ö j ä + s u o j a t a + s u o j a t a a n + s u o j a t a a n k o + s u o j a t a k s e e n + s u o j a t a s o + s u o j a t a s o a + s u o j a t a s o i s t a + s u o j a t a s o n + s u o j a t i e + s u o j a t o d i s t u k s e n + s u o j a t o i m e n p i d e l a u s e k e + s u o j a t o i m e n p i d e t t ä + s u o j a t o i m e n p i d e t u t k i m u k s e n + s u o j a t o i m e n p i t e e n + s u o j a t o i m e n p i t e e n ä + s u o j a t o i m e n p i t e e t + s u o j a t o i m e n p i t e i d e n + s u o j a t o i m e n p i t e i l l e + s u o j a t o i m e n p i t e i l l ä + s u o j a t o i m e n p i t e i s i i n + s u o j a t o i m e n p i t e i s s ä + s u o j a t o i m e n p i t e i s t ä + s u o j a t o i m e n p i t e i t ä + s u o j a t o i m e t + s u o j a t o i m i + s u o j a t o i m i a + s u o j a t o i m i a s e t u k s e n + s u o j a t o i m i a s e t u k s e s s a + s u o j a t o i m i a s e t u k s e s t a + s u o j a t o i m i a s e t u s + s u o j a t o i m i e n + s u o j a t o i m i i n + s u o j a t o i m i l l a + s u o j a t o i m i s t a + s u o j a t o n t a + s u o j a t t a v a + s u o j a t t o m a m p a a n + s u o j a t t o m a m p i + s u o j a t t o m a m p i e n + s u o j a t t o m i a + s u o j a t t o m i k s i + s u o j a t t o m i m m a n + s u o j a t t o m i m m a s s a + s u o j a t t o m i m m i l l e + s u o j a t t o m i m m i s t a + s u o j a t t o m i m p i a + s u o j a t t o m i m p i e n + s u o j a t t o m i n + s u o j a t t u a + s u o j a t t u j a + s u o j a t t u j e n + s u o j a t u i l l e + s u o j a t u l l e j a + s u o j a t u l l i a + s u o j a t u l l i e n + s u o j a t u l l i t + s u o j a t u n + s u o j a t u s s a + s u o j a t u t + s u o j a t y ö + s u o j a t y ö p a i k a t + s u o j a t y ö p a i k k a o h j e l m i a + s u o j a t y ö p a i k k a o h j e l m i l l e + s u o j a t y ö p a i k k o i h i n + s u o j a t y ö s s ä + s u o j a u s j ä r j e s t e l m i e n + s u o j a u s j ä r j e s t e l m i ä + s u o j a u s j ä r j e s t e l m ä n + s u o j a u s j ä r j e s t e l m ä t + s u o j a u s k u s t a n n u k s e t + s u o j a u s l u o k i t u s + s u o j a u s m a h d o l l i s u u t t a + s u o j a u s t a s o a + s u o j a u s t a s o n + s u o j a u t u a k s e e n + s u o j a u t u m a a n + s u o j a u t u m i n e n + s u o j a u t u m i s e k s i + s u o j a u t u m i s k e i n o i s t a + s u o j a u t u m i s t a + s u o j a v a a t e t u k s e e n + s u o j a v a a t e t u s + s u o j a v a a t e t u s t a + s u o j a v a a t i m u k s i a + s u o j a v a a t t e i t a + s u o j a v a l l i n + s u o j a v a r u s t e e t + s u o j a v a r u s t e i d e n + s u o j a v a r u s t e i t a + s u o j a v a r u s t u k s e n + s u o j a v e r k k o + s u o j a v e r k k o a + s u o j a v e r k k o j ä r j e s t e l m ä n + s u o j a v e r k k o n a + s u o j a v e r k o s t a + s u o j a v i i t t a m a d o n n a + s u o j a v o i d e t t a + s u o j a v y ö h y k e + s u o j a v y ö h y k k e e n + s u o j a v y ö h y k k e e s t ä + s u o j a v y ö h y k k e e t + s u o j a v y ö h y k k e i d e n + s u o j a v y ö h y k k e i s i i n + s u o j a v y ö h y k k e i s t ä + s u o j a v y ö h y k k e i t ä + s u o j a v ä l i n e e n ä + s u o j a v ä l i n e e t + s u o j a v ä l i n e i d e n + s u o j a v ä l i n e i s t ä + s u o j a v ä l i n e i t ä + s u o j a y k s i k ö n + s u o j e l e e + s u o j e l e m a a n + s u o j e l e m a l l a + s u o j e l e m a t t a + s u o j e l e m i s e e n + s u o j e l e m i s e k s e e n + s u o j e l e m i s e k s i + s u o j e l e m i s e n + s u o j e l e m i s e s s a + s u o j e l e m i s e s t a + s u o j e l e m i s t a + s u o j e l e m m e + s u o j e l e v a a + s u o j e l e v a m m a n + s u o j e l e v a m p i + s u o j e l e v a t + s u o j e l e v i e n + s u o j e l e v i m p i i n + s u o j e l i j a n a + s u o j e l i j o i k s i + s u o j e l k a a + s u o j e l k a a m m e + s u o j e l l a + s u o j e l l a a n + s u o j e l l a a n k o + s u o j e l l a k s e e n + s u o j e l l a k s e m m e + s u o j e l l e n + s u o j e l l u k s i + s u o j e l t a e s s a + s u o j e l t a i s i i n + s u o j e l t a v a + s u o j e l t a v i a + s u o j e l t a v i e n + s u o j e l t a v i i n + s u o j e l t u j a + s u o j e l t u j e n + s u o j e l u a + s u o j e l u a a n + s u o j e l u a l o i t t e i t a + s u o j e l u a l u e + s u o j e l u a l u e a s e m a a + s u o j e l u a l u e e k s i + s u o j e l u a l u e e l l a + s u o j e l u a l u e e n + s u o j e l u a l u e e n a + s u o j e l u a l u e e t + s u o j e l u a l u e i d e n + s u o j e l u a l u e i k s i + s u o j e l u a l u e i l l a + s u o j e l u a l u e i l l e + s u o j e l u a l u e i s i i n + s u o j e l u a l u e i s t a + s u o j e l u a l u e i s t a a n + s u o j e l u a l u e i t a + s u o j e l u a l u e t t a + s u o j e l u a l u e v e r k o s t o n + s u o j e l u a s e m a + s u o j e l u a s e m a a + s u o j e l u a s e m a n + s u o j e l u e h d o t u k s i a + s u o j e l u e l i n t e n + s u o j e l u h a n k k e i s s a + s u o j e l u i n f r a s t r u k t u u r e j a + s u o j e l u j o u k k o j a m m e + s u o j e l u j o u k k o j e n + s u o j e l u j o u k o i k s i + s u o j e l u j o u k o i l l e + s u o j e l u j o u k o t + s u o j e l u j ä r j e s t e l m i e n + s u o j e l u j ä r j e s t e l m i i n + s u o j e l u j ä r j e s t e l m i l l ä + s u o j e l u j ä r j e s t e l m i s s ä + s u o j e l u j ä r j e s t e l m i ä + s u o j e l u j ä r j e s t e l m ä + s u o j e l u j ä r j e s t e l m ä l l e + s u o j e l u j ä r j e s t e l m ä l l ä + s u o j e l u j ä r j e s t e l m ä m m e + s u o j e l u j ä r j e s t e l m ä n + s u o j e l u j ä r j e s t e l m ä s t ä + s u o j e l u j ä r j e s t e l m ä t + s u o j e l u j ä r j e s t e l m ä ä + s u o j e l u j ä r j e s t e l m ä ä n + s u o j e l u j ä r j e s t ö i h i n + s u o j e l u j ä r j e s t ö n + s u o j e l u j ä r j e s t ö t + s u o j e l u k e h y k s e n + s u o j e l u k e h y s t ä + s u o j e l u k e i n o i l l a + s u o j e l u k e i n o j a + s u o j e l u k e i n o j e n + s u o j e l u k e s k u s + s u o j e l u k o h d e l u e t t e l o j e n + s u o j e l u k o h d e t t a + s u o j e l u k o h t e i d e n + s u o j e l u k o h t e i k s i + s u o j e l u k o h t e i t a + s u o j e l u k o i r a + s u o j e l u k o m i s s i o + s u o j e l u k o m i t e a + s u o j e l u k o m i t e a n + s u o j e l u k o n e i s t o a + s u o j e l u k r i t e e r i t + s u o j e l u k s e s s a + s u o j e l u k y s y m y s + s u o j e l u k y s y m y s t e n + s u o j e l u l a i n s ä ä d ä n n ö n + s u o j e l u l a k i i n + s u o j e l u l a u s e k e + s u o j e l u l i i k e + s u o j e l u m e k a n i s m e j a + s u o j e l u m e k a n i s m i + s u o j e l u m e k a n i s m i a + s u o j e l u m e k a n i s m i e n + s u o j e l u m e k a n i s m i n + s u o j e l u m e k a n i s m i t + s u o j e l u m e n e t e l m i e n + s u o j e l u m e n e t e l m i s t ä + s u o j e l u m e n e t e l m i ä + s u o j e l u m u o d o t + s u o j e l u m u o t o + s u o j e l u m u o t o i h i n + s u o j e l u m u o t o j a + s u o j e l u m u o t o j e n + s u o j e l u m ä ä r ä y k s e e n + s u o j e l u m ä ä r ä y k s e l l e + s u o j e l u m ä ä r ä y k s e l l ä + s u o j e l u m ä ä r ä y k s e n + s u o j e l u m ä ä r ä y k s e s s ä + s u o j e l u m ä ä r ä y k s e s t ä + s u o j e l u m ä ä r ä y k s e t + s u o j e l u m ä ä r ä y k s i i n + s u o j e l u m ä ä r ä y k s i s t ä + s u o j e l u m ä ä r ä y s + s u o j e l u m ä ä r ä y s t e n + s u o j e l u m ä ä r ä y s t ä + s u o j e l u n + s u o j e l u n o r m e i h i n + s u o j e l u n o r m e i s t a + s u o j e l u n o r m e j a + s u o j e l u n o r m i e n + s u o j e l u n o r m i t + s u o j e l u n t a r p e e n + s u o j e l u n t a r p e e s t a + s u o j e l u n t a r v e t t a + s u o j e l u n ä k ö k o h t i a + s u o j e l u n ä k ö k o h t i e n + s u o j e l u o h j e l m a + s u o j e l u o h j e l m a a + s u o j e l u o h j e l m a a n + s u o j e l u o h j e l m a n + s u o j e l u o h j e l m a t + s u o j e l u o h j e l m i a + s u o j e l u o h j e l m i e n + s u o j e l u o h j e l m i l l a + s u o j e l u o h j e l m i s s a + s u o j e l u o i k e u s j ä r j e s t e l m ä ä + s u o j e l u p e r i a a t e t t a + s u o j e l u p e r i a a t t e e t + s u o j e l u p e r i a a t t e i t a + s u o j e l u p o l i i s i + s u o j e l u p o l i i s i l l a + s u o j e l u p o l i i s i n + s u o j e l u p o l i i s i t + s u o j e l u p o l i t i i k a n + s u o j e l u p o l i t i i k a s t a + s u o j e l u p o l i t i i k k a + s u o j e l u p o l i t i i k k a a + s u o j e l u p r i k a a t i + s u o j e l u p y h i m y s t e n s ä + s u o j e l u p y y n n ö t + s u o j e l u r a h o j a + s u o j e l u s e n k e l e i t ä + s u o j e l u s e n k e l i + s u o j e l u s k u n t a + s u o j e l u s m a h d i l l e + s u o j e l u s o p i m u k s e s t a + s u o j e l u s o p i m u k s i i n + s u o j e l u s o p i m u s + s u o j e l u s p y h i m y k s e k s i + s u o j e l u s p y h i m y s + s u o j e l u s s a + s u o j e l u s t a + s u o j e l u s t a n d a r d e j a + s u o j e l u s t a n d a r d i e n + s u o j e l u s t r a t e g i a + s u o j e l u s t r a t e g i a s s a + s u o j e l u s u u n n i t e l m a a + s u o j e l u s u u n n i t e l m i a + s u o j e l u s y i s t ä + s u o j e l u s ä ä d ö k s i ä + s u o j e l u s ä ä n n ö i s t ä + s u o j e l u s ä ä n t ö j e n + s u o j e l u t a r i f f i + s u o j e l u t a r k o i t u k s i i n + s u o j e l u t a r p e e s e e n + s u o j e l u t a r p e i t a + s u o j e l u t a r v e t t a a n + s u o j e l u t a s o + s u o j e l u t a s o a + s u o j e l u t a s o n + s u o j e l u t a s o o n + s u o j e l u t a v o i t t e e n + s u o j e l u t a v o i t t e e t + s u o j e l u t a v o i t t e i t a + s u o j e l u t i l a n n e + s u o j e l u t i l a n t e e n + s u o j e l u t o i m e n + s u o j e l u t o i m e n p i d e + s u o j e l u t o i m e n p i t e e n + s u o j e l u t o i m e n p i t e e t + s u o j e l u t o i m e n p i t e i d e n + s u o j e l u t o i m e n p i t e i l l e + s u o j e l u t o i m e n p i t e i l l ä + s u o j e l u t o i m e n p i t e i n + s u o j e l u t o i m e n p i t e i s i i n + s u o j e l u t o i m e n p i t e i s t ä + s u o j e l u t o i m e n p i t e i t ä + s u o j e l u t o i m e t + s u o j e l u t o i m i a + s u o j e l u t o i m i a m m e + s u o j e l u t o i m i e n + s u o j e l u t o i m i i n + s u o j e l u t o i m i l l a + s u o j e l u t o i m i n t a a + s u o j e l u t o i m i n t a o h j e l m a a + s u o j e l u t o i m i s s a + s u o j e l u t o i m i s t a + s u o j e l u t u l l i s ä ä n t ö j e n + s u o j e l u u n + s u o j e l u v a a t i m u k s e t + s u o j e l u v a a t i m u k s i a + s u o j e l u v a a t i m u k s i i n + s u o j e l u v a a t i m u k s i s t a + s u o j e l u v a i s t o j a + s u o j e l u v a l m i u d e t + s u o j e l u v a l m i u k s i a + s u o j e l u v a l m i u k s i i n + s u o j e l u v a l t i o + s u o j e l u v a s t u u + s u o j e l u v a s t u u n + s u o j e l u v a s t u u s t a + s u o j e l u v a s t u u t a + s u o j e l u v e l v o i t t e e n + s u o j e l u v e l v o i t t e e s t a + s u o j e l u v e l v o i t t e i s i i n + s u o j e l u v e l v o l l i s u u d e n + s u o j e l u v e l v o l l i s u u d e s t a + s u o j e l u v e l v o l l i s u u k s i a a n + s u o j e l u v e l v o l l i s u u s + s u o j e l u v e l v o l l i s u u t e e n + s u o j e l u v e l v o l l i s u u t t a + s u o j e l u v e l v o l l i s u u t t a a n + s u o j e l u v e r k o s t o + s u o j e l u v i r a s t o t + s u o j e l u v y ö h y k k e i d e n + s u o j e l u v ä l i n e + s u o j e l u v ä l i n e e k s i + s u o j e l u v ä l i n e e t + s u o j e l u v ä l i n e i d e n + s u o j e l u v ä l i n e i t ä + s u o j e l u v ä l i n e t t ä + s u o j e l u y k s i k ö n + s u o j i i n s a + s u o j i s s a + s u o j o k i + s u o k a i m a a n i + s u o k a i s l a k e r t t u n e n + s u o k a n i i n i + s u o k e l t a k e r t t u + s u o k e l t a p e r h o n e n + s u o k e l t t o + s u o k i r j o s i i p i + s u o k o o n + s u o k o r t e + s u o k r o k o t i i l i + s u o k u k k a + s u o l a h a p p o + s u o l a j ä r v i + s u o l a j ä r v i a l t a a t + s u o l a k a i v o k s e t + s u o l a k a i v o k s i i n + s u o l a k a i v o k s i s s a + s u o l a k a l a + s u o l a k k o k e r t t u l i + s u o l a l e i n i k k i + s u o l a m a r s s i + s u o l a n k u k k a + s u o l a n p o i s t o l a i t o k s i a + s u o l a n p o i s t o l a i t o k s i s t a + s u o l a p a n n u + s u o l a p i t o i s u u s + s u o l a p i t o i s u u t t a + s u o l a p u n k a + s u o l a s a v i k k a + s u o l a s i + s u o l a t a s a n k o + s u o l a t i e + s u o l a v e d e n + s u o l a v e r o + s u o l a v i h v i l ä + s u o l a y r t t i + s u o l i a m e b a + s u o l i h u u h t e l u + s u o l i l i e v e v a l t i m o + s u o l i s t o h ä i r i ö i t ä + s u o l i s t o i n f e k t i o + s u o l i s t o n + s u o l i s t o o n + s u o l i s t o s y ö p ä + s u o l i s t o t u l e h d u k s e n + s u o l i s t o t u l e h d u s + s u o l i s t o t u l e h d u s e p i d e m i a n + s u o l i t a s k u u n + s u o l i t u k o s + s u o l o j e n + s u o l t a a + s u o m a l a i s e n + s u o m a l a i s e n a + s u o m a l a i s i s t a + s u o m a l a i s j o u k k o j e n + s u o m a l a i s j ä s e n e t + s u o m a l a i s k a m p a n j a + s u o m a l a i s l e h d e t + s u o m a l a i s r i n t a m a n + s u o m a l a i s t e n + s u o m a t t a + s u o m e a + s u o m e e n + s u o m e l l a + s u o m e l t a + s u o m e n + s u o m e n a j o k o i r a + s u o m e n h i e r a k k a + s u o m e n k i e l i n e n + s u o m e n k i e l i s e l t ä + s u o m e n k i e l i s e n + s u o m e n k i e l i s e s s ä + s u o m e n l a h d e l l a + s u o m e n l a h d e l l e + s u o m e n l a h d e n + s u o m e n l a h d e s t a + s u o m e n l a h t e a + s u o m e n l a h t e e n + s u o m e n l a h t i + s u o m e n l a p i n k o i r a + s u o m e n p i k k u m i t t a r i + s u o m e n p y s t y k o r v a + s u o m e n r u o t s i + s u o m e n u s k o + s u o m e n v e d e n p o h j a + s u o m e s s a + s u o m e s s a k i n + s u o m e s t a + s u o m e t t u m i s p o l i t i i k a n + s u o m i a + s u o m i r o c k + s u o m i s e n + s u o m u e r a k k o k o l i b r i + s u o m u k i p u a j a + s u o m u k i r j o t i k k a + s u o m u k o l i b r i + s u o m u k o t i n g a + s u o m u k u t o j a + s u o m u k y y h k y + s u o m u k ä ä p ä + s u o m u l u r i + s u o m u m u s t e s i e n i + s u o m u n y s ä m u u r a + s u o m u o t s a k u t o j a + s u o m u p a k s u j a l k a + s u o m u p ä ä b u l b u l i + s u o m u p ä ä k a i j a n e n + s u o m u r a s t a s + s u o m u s e l k ä k u t o j a + s u o m u t a t t i + s u o m u t i k k a n e n + s u o m u t r o p i i k k i l i n t u + s u o m u t ö y h t ö t i k k a + s u o m u v a l m u s k a + s u o m u v a t s a k i p u a j a + s u o m u v a t s a m u u r a + s u o m u v a t s a t i k k a + s u o m u v i h e l t ä j ä s o r s a + s u o m u v i i l t o p e i p p o + s u o m y r t t i + s u o n e i d o n v a i p p a + s u o n e n s i s ä i s i ä + s u o n e n s i s ä i s t e n + s u o n e t t e + s u o n i h u o p a s a m m a l + s u o n o k i p e r h o n e n + s u o p a p u u + s u o p a r u s o k a s + s u o p a v a l m u s k a + s u o p e a m m i n + s u o p e a m p i a + s u o p e u t t a + s u o p o t k u p a l l o + s u o p u r s u + s u o p ö l l ö + s u o r a h a k u + s u o r a h a n k i n t a s o v e l l u t u k s i a + s u o r a k u l m a + s u o r a k y l v ö + s u o r a k ä y t t ö ö n + s u o r a l l a + s u o r a m a i n o n n a l l e + s u o r a m a i n o n t a p o s t i n + s u o r a m a r k k i n o i n n i l l a + s u o r a m a r k k i n o i n n i n + s u o r a m a r k k i n o i n n i s s a + s u o r a m a r k k i n o i n n i s t a + s u o r a m a r k k i n o i n t i + s u o r a m a r k k i n o i n t i i n + s u o r a m a r k k i n o i n t i m e n e t e l m i ä + s u o r a m a r k k i n o i n t i p u h e l u j a + s u o r a m a r k k i n o i n t i s ä h k ö p o s t e j a + s u o r a m y y n n i k s i + s u o r a m y y n t i + s u o r a m y y n t i i n + s u o r a m y y n t i ä + s u o r a n + s u o r a n a + s u o r a n a i n e n + s u o r a n a i s e m m i n + s u o r a n a i s e m p a a + s u o r a n a i s e m p i + s u o r a n a i s e n + s u o r a n a i s e s t i + s u o r a n a i s t a + s u o r a n o k k a k i p u a j a + s u o r a p u h e i n e n + s u o r a p u h e i s e m p i + s u o r a p u h e i s e s t i + s u o r a p u h e i s i m p a n a + s u o r a p u h e i s u u t e n i + s u o r a r u i s k u t u k s e l l a + s u o r a r u i s k u t u s + s u o r a r u i s k u t u s m o o t t o r e i d e n + s u o r a s a n a i s e m m i n + s u o r a s a n a i s e m p i + s u o r a s s a + s u o r a s t a + s u o r a s t a a n + s u o r a s t i + s u o r a s u k a i s e m m i n + s u o r a s u k a i s e s t i + s u o r a s u k a i s i m m i n + s u o r a s u k a i s i m m i s t a + s u o r a s u u s u l k u k o t i l o + s u o r a t + s u o r a t o i s t o + s u o r a t o i s t o v i d e o n a + s u o r a t u o j i n a + s u o r a v e l o i t u k s e l l e + s u o r a v e l o i t u k s e n + s u o r a v e l o i t u k s i a + s u o r a v e l o i t u k s i s s a + s u o r a v e l o i t u s + s u o r a v e l o i t u s j ä r j e s t e l m i s t ä + s u o r a v e l o i t u s j ä r j e s t e l m ä + s u o r a v e l o i t u s j ä r j e s t e l m ä n + s u o r a v e l o i t u s j ä r j e s t e l m ä ä + s u o r a v e l o i t u s j ä r j e s t e l m ä ä n + s u o r a v e l o i t u s m e n e t t e l y + s u o r a v e l o i t u s t a + s u o r a v e l o i t u s t a p a h t u m i i n + s u o r a v e l o i t u s t e n + s u o r a v e l o i t u s t o i m e k s i a n t o j e n + s u o r a v e l o i t u s v a l t a k i r j a t + s u o r a v i i v a i n e n + s u o r a v i i v a i s e m p i a + s u o r a v i i v a i s e s t i + s u o r a v i i v a i s i a + s u o r a v i i v a i s t e n + s u o r e m m a k s i + s u o r e m m a l l a + s u o r e m m a l l e + s u o r e m m a n + s u o r e m m a s s a + s u o r e m m a t + s u o r e m m i l l a + s u o r e m m i n + s u o r e m m i n k i n + s u o r e m p a a + s u o r e m p i + s u o r e m p i a + s u o r i a + s u o r i e n + s u o r i i n + s u o r i k s i + s u o r i l l a + s u o r i l l e + s u o r i m m a n + s u o r i m m i l l a + s u o r i m m i n + s u o r i n + s u o r i n a + s u o r i n t a + s u o r i s s a + s u o r i t a m m e + s u o r i t e p e r u s t e i n e n + s u o r i t e p e r u s t e i s e e n + s u o r i t e p e r u s t e i s e n + s u o r i t e p e r u s t e i s t a + s u o r i t e t a + s u o r i t e t a a n + s u o r i t e t t a e s s a + s u o r i t e t t a v a + s u o r i t e t t i i n + s u o r i t e t t u + s u o r i t e t u t + s u o r i t i n k a n t a + s u o r i t i n v ä y l ä + s u o r i t t a a + s u o r i t t a a k s e e n + s u o r i t t a a k s e m m e + s u o r i t t a m a a + s u o r i t t a m a a n + s u o r i t t a m a n + s u o r i t t a m a t t a + s u o r i t t a m i s e e n + s u o r i t t a m i s e s s a + s u o r i t t a m i s t a + s u o r i t t a n e e t + s u o r i t t a v a n + s u o r i t t a v a t + s u o r i t t e e n + s u o r i t t e i s t a + s u o r i t t i m e n + s u o r i t u k s e t + s u o r i t u k s i i n + s u o r i t u k s i s t a a n + s u o r i t u s a r v o k r i t e e r e i h i n + s u o r i t u s a r v o k r i t e e r e i l l e + s u o r i t u s a r v o k r i t e e r e j ä + s u o r i t u s a r v o s t a n d a r d i e n + s u o r i t u s i n d i k a a t t o r e i k s i + s u o r i t u s i n d i k a a t t o r e i s t a + s u o r i t u s i n d i k a a t t o r i t + s u o r i t u s k e s k e i s y y s + s u o r i t u s k r i t e e r e i h i n + s u o r i t u s k r i t e e r e i s t ä + s u o r i t u s k y k y i n d i k a a t t o r i t + s u o r i t u s k y k y i s e m p i + s u o r i t u s k y k y i s e m p i ä + s u o r i t u s k y k y i s i m m i s t ä + s u o r i t u s k y k y i s t e n + s u o r i t u s k y k y n s ä + s u o r i t u s k y k y t a v o i t t e e t + s u o r i t u s k y k y v a a t i m u k s e t + s u o r i t u s k y k y ä + s u o r i t u s k y k y ä ä n + s u o r i t u s k y v y l l e + s u o r i t u s k y v y s s ä + s u o r i t u s o s o i t t i m i a + s u o r i t u s p a i n e e t + s u o r i t u s p e r u s t e + s u o r i t u s p e r u s t e i s i i n + s u o r i t u s p e r u s t e i s t a + s u o r i t u s t a n n e + s u o r i t u s t a s o + s u o r i t u s t a s o a + s u o r i t u s t a s o i l m o i t u k s e e n + s u o r i t u s t a s o i l m o i t u s + s u o r i t u s t a s o i l m o i t u s t e n + s u o r i t u s t a s o n s a + s u o r i t u s t a u l u k o i t a + s u o r i t u s t a v o i t t e i t a + s u o r i t u s t o d i s t u k s e e n + s u o r i t u s v a a t i m u k s i i n + s u o r i t u s v a l m i u t t a + s u o r i t u s v a r a u k s e n + s u o r i t u s v a r a u k s e s t a + s u o r i t u s v a r a u k s i a + s u o r i t u s v a r a u k s i s t a + s u o r i t u s v a r a u s + s u o r i t u s v a r a u s t a + s u o r i u d u t t a v a + s u o r i u t u a + s u o r i u t u a k s e e n + s u o r i u t u a k s e m m e + s u o r i u t u m a a n + s u o r i u t u m i s e e n + s u o r i u t u m i s t a + s u o r u u m i s + s u o s e k o y ö k k ö n e n + s u o s i a + s u o s i a k s e e n + s u o s i e s s a m m e + s u o s i i + s u o s i k k e i n a + s u o s i k k e j a + s u o s i k k i a i h e + s u o s i k k i a i h e e s e e n i + s u o s i k k i e h d o k k a a k s e e n + s u o s i k k i e h d o k k a a n a a n + s u o s i k k i e h d o k k a a n s a + s u o s i k k i e h d o k k a i t a a n + s u o s i k k i e s i m e r k k i n i + s u o s i k k i f i l o s o f e i h i n i + s u o s i k k i h a r j o i t u s l e i r i + s u o s i k k i j o u k k u e e l l e n i + s u o s i k k i j ä s e n i s t ä n i + s u o s i k k i k i e l e n i + s u o s i k k i k o h d e + s u o s i k k i k o h t e i n a + s u o s i k k i k o h t e i t a + s u o s i k k i l e h d i s t ä + s u o s i k k i m a i l a + s u o s i k k i p u h e m i e h e n i + s u o s i k k i p y h i m y k s e n i + s u o s i k k i r y h m i l l e + s u o s i k k i s a n k a r e i s t a a n + s u o s i k k i s e u r o i h i n s a + s u o s i k k i t a l o u s t i e t e i l i j ä n i + s u o s i k k i t e o r i a t + s u o s i k k i v e r k o s t o + s u o s i k k i v e r k o s t o n + s u o s i k k i y r i t y s t e n + s u o s i m a a n + s u o s i m a l l a + s u o s i m a s t a + s u o s i m a t t a + s u o s i m i s e s t a + s u o s i m i s p e r i a a t e + s u o s i m i s t a + s u o s i m m e + s u o s i m m e k o + s u o s i n + s u o s i n u t + s u o s i o l l i s e l l a + s u o s i o l l i s e m m i k s i + s u o s i o l l i s e m p a a + s u o s i o l l i s e m p i e n + s u o s i o l l i s e s t a + s u o s i o n + s u o s i o n o s o i t u k s e n n e + s u o s i o n o s o i t u k s e t + s u o s i o n o s o i t u k s i a + s u o s i o n o s o i t u k s i s t a + s u o s i o n o s o i t u s + s u o s i o n o s o i t u s t e n + s u o s i o o n + s u o s i o t a + s u o s i o t a a n + s u o s i t a a n + s u o s i t a a n k o + s u o s i t a m m e + s u o s i t a m m e k i n + s u o s i t a n + s u o s i t e l l a + s u o s i t e l l a a n + s u o s i t e l l a a n k i n + s u o s i t e l l e s s a a n + s u o s i t e l l u i s t a + s u o s i t e l l u s t a + s u o s i t e l t a v a a + s u o s i t e l t a v a m p a a + s u o s i t e l t a v a m p i + s u o s i t e l t a v a t + s u o s i t e l t i i n + s u o s i t e l t u j e n + s u o s i t t a a + s u o s i t t a a k o + s u o s i t t a i s i i n + s u o s i t t a m i s e n k i n + s u o s i t t a m i s e s t a + s u o s i t t a v a + s u o s i t t e l e e + s u o s i t t e l e e k i n + s u o s i t t e l e m a a n + s u o s i t t e l e m a m m e + s u o s i t t e l e m m e + s u o s i t t e l e n + s u o s i t t e l e n k i n + s u o s i t t e l e v a n i + s u o s i t t e l e v a t + s u o s i t t e l i + s u o s i t t e l i s i n + s u o s i t t e l i s i n k i n + s u o s i t t e l i v a t + s u o s i t t e l u j ä r j e s t e l m ä + s u o s i t t i i n + s u o s i t t u a + s u o s i t u i m m a k s i + s u o s i t u i m m a n + s u o s i t u i m m a t + s u o s i t u i m m i s t a + s u o s i t u i m m u u s a s e m a + s u o s i t u i m m u u s a s e m a a + s u o s i t u i m m u u s a s e m a n + s u o s i t u i m m u u s a s e m a s t a + s u o s i t u i m m u u s e t u j a + s u o s i t u i m m u u s e t u j e n + s u o s i t u i m m u u s j ä r j e s t e l m i e n + s u o s i t u i m m u u s j ä r j e s t e l m ä + s u o s i t u i m m u u s j ä r j e s t e l m ä n + s u o s i t u i m m u u s j ä r j e s t e l m ä t + s u o s i t u i m m u u s j ä r j e s t e l m ä ä + s u o s i t u i m m u u s j ä r j e s t y k s e s s ä + s u o s i t u i m m u u s k o h t e l u + s u o s i t u i m m u u s k o h t e l u a + s u o s i t u i m m u u s k o h t e l u i d e n + s u o s i t u i m m u u s k o h t e l u l a u s e k e + s u o s i t u i m m u u s k o h t e l u n + s u o s i t u i m m u u s k o h t e l u s t a + s u o s i t u i m m u u s k o h t e l u u n + s u o s i t u i m m u u s k u m p p a n u u t t a + s u o s i t u i m m u u s l a u s e k e t t a + s u o s i t u i m m u u s l a u s e k k e e n + s u o s i t u i m m u u s l a u s e k k e e s e e n + s u o s i t u i m m u u s p e r i a a t e t t a + s u o s i t u i m m u u s s o p i m u k s e n + s u o s i t u i m m u u s s o p i m u k s e s t a + s u o s i t u i m m u u s s o p i m u k s e t + s u o s i t u i m m u u s s o p i m u k s i a + s u o s i t u i m m u u s s o p i m u k s i e n + s u o s i t u i m m u u s s o p i m u s + s u o s i t u i m m u u s s o p i m u s t e n + s u o s i t u i m m u u s s u h d e + s u o s i t u i m m u u s s u h t e e t + s u o s i t u i m m u u s s u h t e i d e n + s u o s i t u i m m u u s s u h t e i s s a m m e + s u o s i t u i m m u u s s ä ä n t ö l a u s e k e t t a + s u o s i t u i m m u u s t u l l i + s u o s i t u i m m u u s t u l l i a + s u o s i t u i m m u u s t u l l i k s i + s u o s i t u i m m u u s t u l l i l l a + s u o s i t u i m m u u s t u l l i t + s u o s i t u i m m u u s ä ä n e s t y k s e l l ä + s u o s i t u i m m u u s ä ä n e s t y k s e n + s u o s i t u i m m u u s ä ä n e s t y k s e s t ä + s u o s i t u i m m u u s ä ä n e s t y s + s u o s i t u i m p a n a + s u o s i t u i m p i a + s u o s i t u i m p i e n + s u o s i t u i m p i i n + s u o s i t u i n + s u o s i t u i n t a + s u o s i t u k s e e n + s u o s i t u k s e l l a + s u o s i t u k s e n + s u o s i t u k s e n s a + s u o s i t u k s e s s a + s u o s i t u k s e s t a + s u o s i t u k s e t + s u o s i t u k s i a + s u o s i t u k s i i n + s u o s i t u k s i l l a a n + s u o s i t u k s i n a + s u o s i t u k s i s s a + s u o s i t u k s i s s a a n + s u o s i t u k s i s t a + s u o s i t u k s i s t a n i + s u o s i t u m m a n + s u o s i t u m m a s t a + s u o s i t u m p a a + s u o s i t u m p a a n + s u o s i t u m p i + s u o s i t u m p i a + s u o s i t u m p i i n + s u o s i t u s a r v o i s t a + s u o s i t u s e h d o t u k s e n + s u o s i t u s e h d o t u k s e s s a + s u o s i t u s e h d o t u k s e s s a m m e + s u o s i t u s e h d o t u k s e s t a + s u o s i t u s e h d o t u k s i a + s u o s i t u s e h d o t u s + s u o s i t u s e h d o t u s t a + s u o s i t u s k i r j e t t ä + s u o s i t u s l u e t t e l o n + s u o s i t u s l u e t t e l o s s a + s u o s i t u s l u o n n o k s e e n + s u o s i t u s l u o n n o k s e e n n e + s u o s i t u s l u o n n o k s e n + s u o s i t u s l u o n n o k s e s s a + s u o s i t u s l u o n n o k s e s s a a n + s u o s i t u s l u o n n o k s e s t a + s u o s i t u s l u o n n o k s e t + s u o s i t u s l u o n n o k s i s t a + s u o s i t u s l u o n n o s + s u o s i t u s l u o n n o s t a + s u o s i t u s m e n e t t e l y + s u o s i t u s m e n e t t e l y t + s u o s i t u s r a j o j a + s u o s i t u s t a + s u o s i t u s t a s o j a + s u o s i t u s t a s o j e n + s u o s i t u s t a s o n + s u o s i t u s t e k s t i n + s u o s i t u s t e k s t i s s ä + s u o s i t u s t e n + s u o s i t u s t o i m e n p i t e i s t ä + s u o s i t u s v a r a u k s e n + s u o s i v a a + s u o s i v a m m a n + s u o s i v a s t a + s u o s i v a t + s u o s i v i i n + s u o s t u a + s u o s t u i + s u o s t u i s i k i n + s u o s t u m a a n + s u o s t u m a t t a + s u o s t u m m e + s u o s t u m u k s e n + s u o s t u m u k s e n s a + s u o s t u m u s j ä r j e s t e l m i ä + s u o s t u m u s m e n e t t e l y + s u o s t u m u s m e n e t t e l y n + s u o s t u m u s p e r i a a t e t t a + s u o s t u m u s t a + s u o s t u m u s t a a n + s u o s t u m u s t a m m e + s u o s t u n e e n s a + s u o s t u n e e t + s u o s t u n u t + s u o s t u t a a n + s u o s t u t e l l a + s u o s t u t e l l a k s e n i + s u o s t u t t a v a + s u o s t u t t e k o + s u o s t u t t e l e m a l l a + s u o s t u t t e l u k a m p a n j a + s u o s t u t t e l u k a m p a n j a s s a a n + s u o s t u t t e l u k e i n o i h i n + s u o s t u t t e l u k e i n o t + s u o s t u t t e l u k y v y n + s u o s t u t t e l u p o l i t i i k k a a + s u o s t u t t e l u t a i d o i l l a n i + s u o s t u t t e l u t a i t o a + s u o s t u t t u + s u o s t u u + s u o s t u v a n s a + s u o s t u v a t + s u o t a i s i i n + s u o t a r h a y ö k k ö n e n + s u o t a v a a + s u o t a v a m p a a + s u o t a v a n a + s u o t a v i a + s u o t o r p a n + s u o t u i s a a + s u o t u i s a m m a n + s u o t u i s a m m a s s a + s u o t u i s a m m a s t a + s u o t u i s a m m a t + s u o t u i s a m m i k s i + s u o t u i s a m m i l l e + s u o t u i s a m m i n + s u o t u i s a m m i s s a + s u o t u i s a m m i s t a + s u o t u i s a m p a a + s u o t u i s a m p a a n + s u o t u i s a m p i + s u o t u i s a m p i a + s u o t u i s a m p i e n + s u o t u i s a t + s u o t u i s i a + s u o t u i s i l t a + s u o t u i s i m m a l l a + s u o t u i s i m m a n + s u o t u i s i m m a t + s u o t u i s i m m i n + s u o t u i s i m m i s t a + s u o t u i s i m p i a + s u o t u i s i m p i e n + s u o t u i s i m p i i n + s u o t u i s i n + s u o t u i s i s t a + s u o t u i s u u d e s t a + s u o v a l l a b i + s u o v e d e n + s u p e r a s e i t a + s u p e r a u t o i h i n + s u p e r b i k e + s u p e r b o n u k s e t + s u p e r b o n u k s i a + s u p e r b o n u s t e n + s u p e r b y r o k r a t i a a + s u p e r c u p + s u p e r d i p l o m a a t t e j a + s u p e r e s s i i v i + s u p e r i m p e r i a l i s t i s e n + s u p e r j o u k k o r y h m ä + s u p e r k a n s a k u n t a + s u p e r k a n s a l a i s j ä r j e s t ö n ä + s u p e r k o m i s s a a r e i h i n + s u p e r k o m i s s a a r e j a + s u p e r k o m i s s a a r i + s u p e r k o m i s s a a r i a + s u p e r k o m i s s a a r i n + s u p e r k o m i s s a a r i s t a + s u p e r k o m i s s a a r i t + s u p e r k o m i t e a n + s u p e r l i i g a + s u p e r l i i g a a n + s u p e r l i i t t o v a l t i o h a n k k e e n + s u p e r l i i t t o v a l t i o t a + s u p e r l i s e n s s i + s u p e r l o h i a + s u p e r m a a p a l l o + s u p e r m a r k e t e i s s a + s u p e r m a r k e t i s s a + s u p e r m a r k e t i s t a + s u p e r m a r k e t i t + s u p e r m a r k e t k e t j u + s u p e r m a r k e t k e t j u i s s a + s u p e r m a r k e t k e t j u j e n + s u p e r m a r k e t l a s k u t + s u p e r m a r k e t t i e n + s u p e r m a r k e t t i k e t j u j e n + s u p e r m a r k e t t i k e t j u t + s u p e r m a r k e t t i m m e + s u p e r m i n i s t e r i ä + s u p e r n o v a j ä ä n n e + s u p e r p a l l o + s u p e r p i l a r i a + s u p e r p o s i t i o p e r i a a t e + s u p e r s t r a a t t i k i e l i + s u p e r s u o j a l a u s e k e t t a + s u p e r s u u r p u j o t t e l u + s u p e r s ä i e t e o r i a + s u p e r t a r k k a i l i j a n + s u p e r t i e d e m i e s t e n + s u p e r t i e t o k o n e + s u p e r t i i m i + s u p e r t i i s t a i + s u p e r t u o m i o i s t u i n + s u p e r v a l l a n + s u p e r v a l l a s t a + s u p e r v a l t a + s u p e r v a l t a a + s u p e r v a l t a a n + s u p e r v a l t a n a + s u p e r v a l t a t i e k s i + s u p e r v a l t i o + s u p e r v a l t i o a l o i t t e e s e e n + s u p e r v a l t i o l l a + s u p e r v a l t i o l t a + s u p e r v a l t i o n + s u p e r v a l t i o n a + s u p e r v a l t i o o n + s u p e r v a l t i o s t a + s u p e r v a l t i o t a + s u p e r v a l t o j e n + s u p e r v e r k k o j a + s u p e r v e r k o i s t a + s u p e r v e r k o n + s u p e r v i r a n o m a i s e s t a + s u p e r v i r a n o m a i s t a + s u p e r y k s i k k ö + s u p e r y k s i k ö n + s u p e r y l i o p i s t o a + s u p e r y s t ä v ä t + s u p i k o i r a + s u p i k o i r i a + s u p i s t a a + s u p i s t a a k s e m m e + s u p i s t a k a a m m e + s u p i s t a m a a n + s u p i s t a m a t t a + s u p i s t a m i s e k s i + s u p i s t a m i s e s t a + s u p i s t a m i s p a i n e i t a + s u p i s t a m i s p e r i a a t t e e n + s u p i s t a m i s t a + s u p i s t a m i s t a a n + s u p i s t a m i s t a r p e e n + s u p i s t a m m e + s u p i s t a m m e k o + s u p i s t a n u t + s u p i s t e t a + s u p i s t e t a a n + s u p i s t e t a a n k o + s u p i s t e t t a v a + s u p i s t e t t u + s u p i s t u i k i n + s u p i s t u k s e t + s u p i s t u k s i a + s u p i s t u m i s e s t a + s u p i s t u s t e n + s u p i s t u u + s u p l e m e n t t i k u l m a t + s u p p e a h k o s t a + s u p p e a m m a k s i + s u p p e a m m a n + s u p p e a m m i n + s u p p e a m p a a + s u p p e a m p a a n + s u p p e a m p i + s u p p e a m p i a + s u p p e a m p i i n + s u p p e a t + s u p p e i m p i a k i n + s u p p e i n a + s u p p e n e m i s t e s t i t + s u p p i l o h a p e r o + s u p p i l o p i k a r i k u l t t u u r i + s u p p i l o p i l v i + s u p p i l o v a h v e r o + s u p p u s u u + s u r e m a t t a + s u r f f a i l l a + s u r i n a h e l t t a s i e p p o + s u r k e a a + s u r k e a a n + s u r k e a n + s u r k e a n a + s u r k e a s s a + s u r k e a s t a + s u r k e i m m a t + s u r k u t e l l a + s u r m a a m i s k e i n o n a + s u r m a a m i s t a + s u r m a k ä ä r m e + s u r m a n a j o + s u r m a n n e e n + s u r m a n s a + s u r m a s i v a t + s u r m a t t i i n + s u r m a t t u j a + s u r m i a + s u r r e a l i s t i s e k s i + s u r r e a l i s t i s e m p i + s u r r e n + s u r u a + s u r u a i k a n a + s u r u a m m e + s u r u k e i j u k a l a + s u r u k e r t t u l i + s u r u k o l i b r i + s u r u k s e m m e + s u r u k s e n i + s u r u l i p u t u s + s u r u l l a + s u r u l l i s e k s i + s u r u l l i s e m m i k s i + s u r u l l i s e m p a a + s u r u l l i s e m p i + s u r u l l i s e n + s u r u l l i s e n k u u l u i s a t + s u r u l l i s e n k u u l u i s i s s a + s u r u l l i s i a + s u r u l l i s i i n + s u r u l l i s i m p i a + s u r u l l i s i m p i i n + s u r u l l i s i n + s u r u l l i s i n a + s u r u l l i s i n t a + s u r u l l i s i s t a + s u r u l l i s t a + s u r u m e s i k k o + s u r u n + s u r u n i + s u r u n v a l i t t e l u i h i n + s u r u n v a l i t t e l u i l l a + s u r u n v a l i t t e l u j e n + s u r u n v a l i t t e l u k i r j a + s u r u n v a l i t t e l u k i r j a n + s u r u n v a l i t t e l u k i r j e e n + s u r u n v a l i t t e l u k i r j e e s s ä + s u r u n v a l i t t e l u m m e + s u r u n v a l i t t e l u n i + s u r u n v a l i t t e l u p ä ä t ö s l a u s e l m a + s u r u n v a l i t t e l u t + s u r u n v a l i t t e l u u n + s u r u n v a l i t t e l u v i e s t i e n + s u r u n v a l i t t e l u v i e s t i n + s u r u n v a l i t t e l u v i e s t i s t ä + s u r u n ä r h i + s u r u p ä i v ä + s u r u p ä i v ä n + s u r u s ä p p i k a l a + s u r u t a n g a r a + s u r u t a s k u + s u r u t t a + s u r u u n + s u r u v a i p p a + s u r u v i e s t i n + s u r u v y ö k e r t t u l i + s u r u y ö k k ö n e n + s u s i l u o l a + s u s i p a l a t s i + s u s i p a n k k e j a + s u s i p a n k k i a + s u s i p r i k a a t i + s u s i r i t a r i + s u s i s i l l i t + s u s i s ä v e l + s u s p e n s i o n + s u s p e n s i o s t a + s u s p e n s i o t a + s u s t a + s u s u t + s u t t a + s u u d e l m a s t a + s u u h y g i e n i a + s u u h y g i e n i s t i + s u u k a p u l a l a k i + s u u l l i s e e n + s u u l l i s e l l a + s u u l l i s e n + s u u l l i s e n a + s u u l l i s e s s a + s u u l l i s e s t a + s u u l l i s e t + s u u l l i s i a + s u u l l i s i l l a + s u u l l i s i n a + s u u l l i s i s s a + s u u l l i s t a + s u u l l i s t e n + s u u n n a l t a + s u u n n a n + s u u n n a n a n t a j a n a + s u u n n a n m u u t o k s e e n + s u u n n a n m u u t o k s e l l e + s u u n n a n m u u t o k s e n + s u u n n a n m u u t o k s e s t a + s u u n n a n m u u t o k s i a + s u u n n a n m u u t o k s i i n + s u u n n a n m u u t o s + s u u n n a n m u u t o s t a + s u u n n a n n ä y t t ä j i k s i + s u u n n a n n ä y t t ä j i n ä + s u u n n a n n ä y t t ä j i ä + s u u n n a n n ä y t t ä j ä + s u u n n a n n ä y t t ä j ä n + s u u n n a n n ä y t t ä j ä n ä + s u u n n a n v a i h d o s + s u u n n a n v a i h t o a + s u u n n a s t a + s u u n n a t a + s u u n n a t a a n + s u u n n a t o n t a + s u u n n a t t o m a n + s u u n n a t t o m a s t a + s u u n n a t t o m a t + s u u n n a t t o m i a + s u u n n a t t u a + s u u n n a t t u j a + s u u n n a t u i l l e + s u u n n a t u m m a t + s u u n n a t u m p i + s u u n n i k a s l i h a s + s u u n n i l l a + s u u n n i l t a + s u u n n i s t u s j ä r j e s t e l m ä ä n + s u u n n i s t u s l i i t t o + s u u n n i t e l k a a m m e + s u u n n i t e l l a + s u u n n i t e l l a a n + s u u n n i t e l l a a n k o + s u u n n i t e l l a k s e e n + s u u n n i t e l l a k s e m m e + s u u n n i t e l l e s s a + s u u n n i t e l l e s s a a n + s u u n n i t e l l e s s a m m e + s u u n n i t e l l e s s a n i + s u u n n i t e l l u i s t a + s u u n n i t e l l u l l a + s u u n n i t e l l u n + s u u n n i t e l l u s s a + s u u n n i t e l l u s t a + s u u n n i t e l l u t + s u u n n i t e l m a a + s u u n n i t e l m a a m m e + s u u n n i t e l m a a n + s u u n n i t e l m a a n s a + s u u n n i t e l m a k a u d e l l e + s u u n n i t e l m a k i e l i + s u u n n i t e l m a l l a + s u u n n i t e l m a l l e + s u u n n i t e l m a l l i s e m m i n + s u u n n i t e l m a l l i s e m p a a n + s u u n n i t e l m a l l i s t a + s u u n n i t e l m a l u o n n o k s e e n + s u u n n i t e l m a l u o n n o s + s u u n n i t e l m a l u o n n o s t a + s u u n n i t e l m a m m e + s u u n n i t e l m a n + s u u n n i t e l m a n a + s u u n n i t e l m a n a m m e + s u u n n i t e l m a n s a + s u u n n i t e l m a s s a + s u u n n i t e l m a s s a a n + s u u n n i t e l m a s t a + s u u n n i t e l m a s t a a n + s u u n n i t e l m a t + s u u n n i t e l m a t a l o u d e k s i + s u u n n i t e l m a t a l o u d e l l a + s u u n n i t e l m a t a l o u d e l l e + s u u n n i t e l m a t a l o u d e l l i s i s t a + s u u n n i t e l m a t a l o u d e n + s u u n n i t e l m a t a l o u d e s t a + s u u n n i t e l m a t a l o u d e t + s u u n n i t e l m a t a l o u k s i e n + s u u n n i t e l m a t a l o u k s i s s a + s u u n n i t e l m a t a l o u s + s u u n n i t e l m a t a l o u t e e n + s u u n n i t e l m a t a l o u t t a + s u u n n i t e l m i a + s u u n n i t e l m i a a n + s u u n n i t e l m i a n n e + s u u n n i t e l m i e n + s u u n n i t e l m i i n + s u u n n i t e l m i l l a + s u u n n i t e l m i n + s u u n n i t e l m i s s a + s u u n n i t e l m i s s a a n + s u u n n i t e l m i s t a + s u u n n i t e l m i s t a a n + s u u n n i t e l m i s t a m m e + s u u n n i t e l m i s t a n n e + s u u n n i t e l t a e s s a + s u u n n i t e l t a v a + s u u n n i t e l t a v a t + s u u n n i t e l t i i n + s u u n n i t e l t u a + s u u n n i t e l t u i h i n + s u u n n i t e l t u j a + s u u n n i t e l t u j e n + s u u n n i t e l t u n a + s u u n n i t e l t u u n + s u u n n i t t e l e e + s u u n n i t t e l e e k o + s u u n n i t t e l e m a a n + s u u n n i t t e l e m a s s a + s u u n n i t t e l e m a s t a n i + s u u n n i t t e l e m i e m m e + s u u n n i t t e l e m i s t a + s u u n n i t t e l e t t e k o + s u u n n i t t e l e v a + s u u n n i t t e l i j o i d e n + s u u n n i t t e l i j o i l l e + s u u n n i t t e l i m m e + s u u n n i t t e l u a + s u u n n i t t e l u a s i a k i r j a a n + s u u n n i t t e l u a s i a k i r j a t + s u u n n i t t e l u a s i a k i r j o i h i n s a + s u u n n i t t e l u a s i a k i r j o i s s a + s u u n n i t t e l u a s i a k i r j o j a + s u u n n i t t e l u a s i a k i r j o j e n + s u u n n i t t e l u a s t e e l l a + s u u n n i t t e l u a s t e e l l e + s u u n n i t t e l u e l i m e s s ä + s u u n n i t t e l u e l i n + s u u n n i t t e l u h a k e m u k s e t + s u u n n i t t e l u h a n k k e i t a + s u u n n i t t e l u h a r j o i t u s + s u u n n i t t e l u i n f r a s t r u k t u u r i a l a n + s u u n n i t t e l u i n v e s t o i n n e i s t a + s u u n n i t t e l u j a k s o a + s u u n n i t t e l u j a k s o l l e + s u u n n i t t e l u j a k s o n + s u u n n i t t e l u j a k s o s t a + s u u n n i t t e l u j ä r j e s t e l m i ä + s u u n n i t t e l u j ä r j e s t e l m ä l l e + s u u n n i t t e l u j ä r j e s t e l m ä s s ä + s u u n n i t t e l u j ä r j e s t e l m ä ä + s u u n n i t t e l u k a m p a n j o i s t a + s u u n n i t t e l u k a p a s i t e e t t i + s u u n n i t t e l u k a u d e l l a + s u u n n i t t e l u k a u d e n + s u u n n i t t e l u k a u d e s t a + s u u n n i t t e l u k a u s i + s u u n n i t t e l u k e s k u k s e m m e + s u u n n i t t e l u k i l p a i l u j a + s u u n n i t t e l u k o k e m u k s e n + s u u n n i t t e l u k r i t e e r e i h i n + s u u n n i t t e l u k u s t a n n u k s e t + s u u n n i t t e l u k u s t a n n u k s i a + s u u n n i t t e l u k y s e l y + s u u n n i t t e l u k y v y t + s u u n n i t t e l u k ä y t ä n t ö ä + s u u n n i t t e l u l a i n s ä ä d ä n t ö + s u u n n i t t e l u l a u t a k u n n a s s a + s u u n n i t t e l u l i n j a + s u u n n i t t e l u l l a + s u u n n i t t e l u l l e + s u u n n i t t e l u l o m a k k e i s i i n + s u u n n i t t e l u l u p a a + s u u n n i t t e l u l u v a n + s u u n n i t t e l u l u v i l l e + s u u n n i t t e l u m a l l i + s u u n n i t t e l u m e k a n i s m i n a + s u u n n i t t e l u m e n e t e l m ä n + s u u n n i t t e l u m e n e t e l m ä ä + s u u n n i t t e l u m e n e t t e l y t + s u u n n i t t e l u m i n i s t e r i + s u u n n i t t e l u m i n i s t e r i n + s u u n n i t t e l u m ä ä r ä y k s i ä + s u u n n i t t e l u n + s u u n n i t t e l u o h j e l m a s t a + s u u n n i t t e l u o h j e l m a s t a a n + s u u n n i t t e l u o n g e l m a s t a + s u u n n i t t e l u o n g e l m i a + s u u n n i t t e l u o n g e l m i e n + s u u n n i t t e l u o s a s t o a + s u u n n i t t e l u p a l v e l u j e n + s u u n n i t t e l u p a t e n t t i + s u u n n i t t e l u p e r i a a t t e e t + s u u n n i t t e l u p e r s p e k t i i v i + s u u n n i t t e l u p o h j a l t a + s u u n n i t t e l u p o k e r i + s u u n n i t t e l u p o l i t i i k a l l e + s u u n n i t t e l u p o l i t i i k a n + s u u n n i t t e l u p o l i t i i k k o j e n + s u u n n i t t e l u p r o s e s s e i h i n + s u u n n i t t e l u p r o s e s s e i s s a + s u u n n i t t e l u p r o s e s s i + s u u n n i t t e l u p r o s e s s i a + s u u n n i t t e l u p r o s e s s i i n + s u u n n i t t e l u p r o s e s s i n + s u u n n i t t e l u p y r k i m y s t ä + s u u n n i t t e l u p ä ä t ö k s e t + s u u n n i t t e l u p ä ä t ö k s i ä + s u u n n i t t e l u p ä ä t ö s t e n + s u u n n i t t e l u p ö y d ä l l e + s u u n n i t t e l u p ö y d ä l t ä + s u u n n i t t e l u r a t k a i s u j a + s u u n n i t t e l u r e s u r s s e j a + s u u n n i t t e l u r e s u r s s i n s a + s u u n n i t t e l u r y h m ä + s u u n n i t t e l u r y h m ä v e r k o s t o n + s u u n n i t t e l u r y h m ä ä + s u u n n i t t e l u s s a + s u u n n i t t e l u s s a a n + s u u n n i t t e l u s t a + s u u n n i t t e l u s t a n d a r d e i s t a + s u u n n i t t e l u s t r a t e g i a a + s u u n n i t t e l u s t r a t e g i a n + s u u n n i t t e l u s t r a t e g i a t + s u u n n i t t e l u s t r a t e g i o i h i n + s u u n n i t t e l u s ä ä n n ö k s i i n + s u u n n i t t e l u s ä ä n t ö j e n + s u u n n i t t e l u t a l o u t t a + s u u n n i t t e l u t a p a m m e + s u u n n i t t e l u t a r k o i t u k s i i n + s u u n n i t t e l u t e h t ä v i s s ä + s u u n n i t t e l u t e o r i a + s u u n n i t t e l u t i i m i n + s u u n n i t t e l u t o i m e n p i d e + s u u n n i t t e l u t o i m e n p i t e i t ä + s u u n n i t t e l u t o i m i a + s u u n n i t t e l u t o i m i n t a + s u u n n i t t e l u t o i m i s t o i s s a + s u u n n i t t e l u t o i m i s t o n s a + s u u n n i t t e l u t u r v a l l i s u u t t a + s u u n n i t t e l u t y ö h ö n + s u u n n i t t e l u t y ö r y h m ä + s u u n n i t t e l u t y ö s s ä + s u u n n i t t e l u t y ö t ä + s u u n n i t t e l u u n + s u u n n i t t e l u v a a t i m u k s i a + s u u n n i t t e l u v a i h e + s u u n n i t t e l u v a i h e e n + s u u n n i t t e l u v a i h e e s e e n + s u u n n i t t e l u v a i h e e s s a + s u u n n i t t e l u v a i h e e s t a + s u u n n i t t e l u v a i h e i s s a + s u u n n i t t e l u v a i h e t t a + s u u n n i t t e l u v a l m i u k s i a + s u u n n i t t e l u v a l m i u t t a + s u u n n i t t e l u v a l t u u k s i e n + s u u n n i t t e l u v a r m u u d e n + s u u n n i t t e l u v a r m u u d e s t a + s u u n n i t t e l u v a r m u u s + s u u n n i t t e l u v a r m u u t t a + s u u n n i t t e l u v i r a n o m a i s e t + s u u n n i t t e l u v i r a n o m a i s t e n + s u u n n i t t e l u v i r h e + s u u n n i t t e l u v i r h e e s e e n + s u u n n i t t e l u v i r h e i d e n + s u u n n i t t e l u v i r h e i s t ä + s u u n n i t t e l u v i r h e i t ä + s u u n n i t t e l u v o i m a v a r o j a + s u u n n i t t e l u v o i m a v a r o j e n + s u u n n i t t e l u v ä l i n e + s u u n n i t t e l u v ä l i n e e n + s u u n n i t t e l u v ä l i n e e n ä + s u u n n i t t e l u v ä l i n e i d e n + s u u n n i t t e l u v ä l i n e i t ä + s u u n n i t t e l u y k s i k k ö + s u u n n i t t e l u y k s i k k ö ä + s u u n n i t t e l u y k s i k ö i l l ä m m e + s u u n n i t t e l u y k s i k ö n + s u u n n i t t e l u y k s i k ö s t ä + s u u n n i t t e l u y k s i k ö t + s u u n s a + s u u n t a a + s u u n t a a n + s u u n t a i s e n + s u u n t a i s e t + s u u n t a i s i a + s u u n t a i s t a + s u u n t a l i n j a + s u u n t a l i n j o j a + s u u n t a m m e + s u u n t a n s a + s u u n t a n u m e r o + s u u n t a n u m e r o i s t a + s u u n t a u k s e l l e + s u u n t a u k s e n + s u u n t a u k s e n a + s u u n t a u k s e s t a + s u u n t a u k s e t + s u u n t a u k s i a + s u u n t a u k s i i n + s u u n t a u k s i s t a + s u u n t a u s t a + s u u n t a u s t e n + s u u n t a u s v a l i n n o i s t a + s u u n t a u t u a + s u u n t a u t u e n + s u u n t a u t u m i s e e n + s u u n t a u t u m i s e n + s u u n t a u t u m i s e n s a + s u u n t a u t u m i s e s t a + s u u n t a u t u m i s e s t a a n + s u u n t a u t u m i s e s t a n n e + s u u n t a u t u m i s k e s k u s t e l u a + s u u n t a u t u n e e k s i + s u u n t a u t u n e e l l a + s u u n t a u t u n e e n + s u u n t a u t u n e e s t a + s u u n t a u t u n e e t + s u u n t a u t u n e i d e n + s u u n t a u t u n e i l l a + s u u n t a u t u n e i s i i n + s u u n t a u t u n e i s u u d e n + s u u n t a u t u n e i s u u d e s t a + s u u n t a u t u n e i s u u d e s t a a n + s u u n t a u t u n e i s u u t e n s a + s u u n t a u t u n e i t a + s u u n t a u t u n u t + s u u n t a u t u n u t t a + s u u n t a u t u v a + s u u n t a u t u v a a + s u u n t a u t u v a a n + s u u n t a u t u v a n + s u u n t a u t u v a n a + s u u n t a u t u v a s t a + s u u n t a u t u v a t + s u u n t a u t u v i a + s u u n t a u t u v i e n + s u u n t a u t u v i s t a + s u u n t a v a i s t o + s u u n t a v a i s t o a + s u u n t a v a i s t o n + s u u n t a v a i s t o n s a + s u u n t a v e n t t i i l i + s u u n t a v i i v a a + s u u n t a v i i v a k a r t t o i h i n + s u u n t a v i i v a k e s k u s t e l u + s u u n t a v i i v a k o k o n a i s u u d e n + s u u n t a v i i v a k o k o n a i s u u d e s s a + s u u n t a v i i v a k o k o n a i s u u k s i e n + s u u n t a v i i v a l u o n n o k s e n + s u u n t a v i i v a l u o n n o k s e t + s u u n t a v i i v a n + s u u n t a v i i v a n a a n + s u u n t a v i i v a p a k e t e i s t a + s u u n t a v i i v a p a k e t i n + s u u n t a v i i v a p a k e t i s t a + s u u n t a v i i v a p a k e t t i + s u u n t a v i i v a p a k e t t i a + s u u n t a v i i v a p e r i a a t t e i t a + s u u n t a v i i v a p ä ä t ö k s e n + s u u n t a v i i v a t + s u u n t a v i i v o i h i n + s u u n t a v i i v o i k s i + s u u n t a v i i v o i l l a + s u u n t a v i i v o i l l e + s u u n t a v i i v o i n a + s u u n t a v i i v o i s s a + s u u n t a v i i v o i s t a + s u u n t a v i i v o j a + s u u n t a v i i v o j e n + s u u n t i i n + s u u o n t e l o + s u u p a t o l o g i a + s u u r a l u e e l l a + s u u r a m i r a a l i + s u u r a r k k i p i i s p a + s u u r a s i a k k a a t + s u u r e e n + s u u r e k s i + s u u r e l e m e n t t i + s u u r e l l a + s u u r e l l e + s u u r e l l i s i i n + s u u r e l t a + s u u r e m m a k s i + s u u r e m m a l l a + s u u r e m m a l l a k i n + s u u r e m m a l l e + s u u r e m m a n + s u u r e m m a s s a + s u u r e m m a s t a + s u u r e m m a t + s u u r e m m i l l a + s u u r e m m i s s a + s u u r e m m i s t a + s u u r e m m i t t a + s u u r e m p a a + s u u r e m p a a n + s u u r e m p a n a + s u u r e m p i + s u u r e m p i a + s u u r e m p i e n + s u u r e m p i i n + s u u r e m p i n a + s u u r e n + s u u r e n a + s u u r e n e e + s u u r e n e v i a + s u u r e n m o i n e n + s u u r e n m o i s e l l a + s u u r e n m o i s e l t a + s u u r e n m o i s e n + s u u r e n m o i s e s t a + s u u r e n m o i s e t + s u u r e n m o i s i a + s u u r e n m o i s t a + s u u r e n n e t t a v a + s u u r e n n u s l a s i + s u u r e n n u s l a s i l l a + s u u r e n n u s l a s i n + s u u r e n t a m i s t a + s u u r e p i d e m i o i d e n + s u u r e s s a + s u u r e s t a + s u u r e s t i k i n + s u u r e t + s u u r e t k a a n + s u u r g a l a g o t + s u u r h a n k e t t a + s u u r h a n k k e e l l e + s u u r h a n k k e e s e e n + s u u r h a n k k e i d e n + s u u r h a n k k e i l l e + s u u r h a n k k e i s i i n + s u u r h a n k k e i s s a + s u u r h a n k k e i t a + s u u r h e r t t u a + s u u r h e r t t u a k u n n a n + s u u r h e r t t u a k u n n a s s a + s u u r h e r t t u a k u n t a + s u u r h e r t t u a k u n t a a + s u u r h e r t t u a t a r + s u u r h e r t t u a t t a r e n + s u u r i a + s u u r i a k i n + s u u r i a r v o i n e n + s u u r i a r v o i s i a + s u u r i e n + s u u r i h o p e a + s u u r i i n + s u u r i k a a n + s u u r i k i i t o s + s u u r i k o k o i s i a + s u u r i k s i + s u u r i l i n j a i s e s t i + s u u r i l i n j a i s i i n + s u u r i l l a + s u u r i l l e + s u u r i l t a + s u u r i l u k u i s e m p a n a + s u u r i l u k u i s e n + s u u r i l u k u i s i m p i a + s u u r i m a l l a + s u u r i m i t t a i n e n + s u u r i m i t t a i s e e n + s u u r i m i t t a i s e k s i + s u u r i m i t t a i s e s t a + s u u r i m i t t a i s i a + s u u r i m i t t a i s i i n + s u u r i m i t t a i s i m m a n + s u u r i m i t t a i s i s t a + s u u r i m i t t a i s t a + s u u r i m i t t a i s t e n + s u u r i m m a k s i + s u u r i m m a l l e + s u u r i m m a l t a + s u u r i m m a n + s u u r i m m a s s a + s u u r i m m a s t a + s u u r i m m a t + s u u r i m m a t k i n + s u u r i m m i l l a + s u u r i m m i s s a + s u u r i m m i s t a + s u u r i m o o t t o r i s i i n + s u u r i m p a a n + s u u r i m p a n a + s u u r i m p i a + s u u r i m p i e n + s u u r i m p i i n + s u u r i m u o t o i n e n + s u u r i m u o t o i s e m m a n + s u u r i m u o t o i s e m m i n + s u u r i m u o t o i s e n + s u u r i m u o t o i s t a + s u u r i n a + s u u r i n f r a s t r u k t u u r i a + s u u r i n k i n + s u u r i n k v i s i i t t o r i + s u u r i n k v i s i i t t o r i n a + s u u r i n o p e u k s i s e e n + s u u r i n t a + s u u r i n v e s t o i j i l l e + s u u r i p a l k k a i s i l l a + s u u r i p a l k k a i s i l t a + s u u r i r i s k i s i l l ä + s u u r i r i s k i s i ä + s u u r i r i s k i s t e n + s u u r i r u h t i n a s + s u u r i r u h t i n a s k u n n a n + s u u r i r u h t i n a s k u n n a s s a + s u u r i r u h t i n a s k u n t a + s u u r i s i l m ä i n e n + s u u r i s s a + s u u r i s t a + s u u r i s u u k a l a + s u u r i s u u n t a i n e n + s u u r i s u u n t a i s e t + s u u r i s u u n t a i s i m p i a + s u u r i t e h o i s e m p i a + s u u r i t u l o i s i a + s u u r i t u l o i s i l l a + s u u r i t u l o i s i l l e + s u u r i t u l o i s i m p i e n + s u u r i t u l o i s t e n + s u u r i t ö i s i ä + s u u r j a k e l u n + s u u r j ä n n i t e j o h d o l l a + s u u r j ä n n i t e j o h t o j e n + s u u r j ä n n i t e k a a p e l i + s u u r j ä n n i t e k a a p e l i t + s u u r j ä n n i t e l i n j a l l a + s u u r j ä n n i t e l i n j a t + s u u r j ä n n i t e t a s a v i r t a + s u u r j ä n n i t e v o i m a j o h d o n + s u u r j ä n n i t e v o i m a j o h d o t + s u u r j ä n n i t e v o i m a j o h t o j a + s u u r j ä n n i t t e i s e e n + s u u r j ä n n i t t e i s t ä + s u u r k a p i t a l i s m i a + s u u r k a p i t a l i s t i t + s u u r k a s i n o s t a + s u u r k a t a s t r o f e i h i n + s u u r k a t a s t r o f e i s s a + s u u r k a t a s t r o f e j a + s u u r k a t a s t r o f i + s u u r k a t a s t r o f i a + s u u r k a t a s t r o f i e n + s u u r k a t a s t r o f i k s i + s u u r k a t a s t r o f i n + s u u r k a u p p o j e n + s u u r k a u p u n g e i s s a + s u u r k a u p u n g e i s s a m m e + s u u r k a u p u n g e i s t a + s u u r k a u p u n g i n + s u u r k a u p u n g i s s a + s u u r k a u p u n g i t + s u u r k a u p u n k e i h i n + s u u r k a u p u n k e j a + s u u r k a u p u n k i + s u u r k a u p u n k i a + s u u r k a u p u n k i a l u e e t + s u u r k a u p u n k i a l u e i d e n + s u u r k a u p u n k i a l u e i l l a + s u u r k a u p u n k i a l u e i l l e + s u u r k a u p u n k i e m m e + s u u r k a u p u n k i e n + s u u r k a u p u n k i k e s k u s t e n + s u u r k a u p u n k i o n g e l m i s s a + s u u r k e i t t i ö i t ä + s u u r k e i t t i ö r a v i n t o l o i d e n + s u u r k e i t t i ö t + s u u r k e i t t i ö t o i m i n t a a + s u u r k i h o j a + s u u r k i i t o k s e t + s u u r k i i t o s + s u u r k i r k o s s a + s u u r k o n s e r n i e n + s u u r k r i i s e i s s ä + s u u r k r i i s i n + s u u r k r i i s i t + s u u r k u l u t t a j a + s u u r k u l u t t a j a n + s u u r k u l u t t a j a t + s u u r k u l u t t a j i e n + s u u r l a b o r a t o r i o i d e n + s u u r l a k k o + s u u r l i i k e + s u u r l i i k e t o i m i n n a n + s u u r l i i k e t o i m i n t a + s u u r l i i k e t o i m i n t a a + s u u r l ä h e t t i l ä s + s u u r l ä h e t t i l ä s n i m i t y k s e t + s u u r l ä h e t t i l ä s t a s o l l a + s u u r l ä h e t t i l ä s t a s o n + s u u r l ä h e t t i l ä s t ä + s u u r l ä h e t t i l ä ä k s i + s u u r l ä h e t t i l ä ä m m e + s u u r l ä h e t t i l ä ä n + s u u r l ä h e t t i l ä ä t + s u u r l ä h e t y s t ö + s u u r l ä h e t y s t ö j e n + s u u r l ä h e t y s t ö t a p a u s + s u u r l ä m p ö v o i m a l o i s s a + s u u r m a a n o m i s t a j a l l e + s u u r m a a n o m i s t a j a t + s u u r m a a n o m i s t a j i a + s u u r m a a n o m i s t a j i l l e + s u u r m a a n v i l j e l i j ö i l l e + s u u r m a a n v i l j e l i j ö i t ä + s u u r m a a t i l o j e n + s u u r m a r k k i n a t + s u u r m a r k k i n o i h i n + s u u r m e n e s t y s + s u u r m e n e s t y s t ä + s u u r m e s t a r i + s u u r m i e h e l l e + s u u r m i e h e s t ä + s u u r m i e h e t + s u u r m i e h i l t ä + s u u r m i e l e n o s o i t u k s e n + s u u r m i e l e n o s o i t u k s i a + s u u r m i e l e n o s o i t u k s i i n + s u u r m i e l e n o s o i t u s + s u u r m i e s + s u u r m u f t i a + s u u r m u f t i n + s u u r n i m i + s u u r n o p e u k s i n e n + s u u r n o p e u k s i s e n + s u u r n o p e u k s i s e s t a + s u u r n o p e u k s i s e t + s u u r n o p e u k s i s i a + s u u r n o p e u s a l u k s e t + s u u r n o p e u s a l u k s i a + s u u r n o p e u s a l u k s i l l a + s u u r n o p e u s j u n a + s u u r n o p e u s j u n a a + s u u r n o p e u s j u n a h a n k k e e n + s u u r n o p e u s j u n a h a n k k e i s i i n + s u u r n o p e u s j u n a l i i k e n t e e s s ä + s u u r n o p e u s j u n a l l a + s u u r n o p e u s j u n a n + s u u r n o p e u s j u n a r a i t e i d e n + s u u r n o p e u s j u n a s t a + s u u r n o p e u s j u n a t + s u u r n o p e u s j u n a v e r k k o + s u u r n o p e u s j u n a v e r k o n + s u u r n o p e u s j u n a y h t e y d e n + s u u r n o p e u s j u n a y h t e y d e t + s u u r n o p e u s j u n a y h t e y k s i e n + s u u r n o p e u s j u n a y h t e y k s i l l ä + s u u r n o p e u s j u n a y h t e y k s i n + s u u r n o p e u s j u n a y h t e y k s i ä + s u u r n o p e u s j u n a y h t e y s + s u u r n o p e u s j u n i a + s u u r n o p e u s j u n i e n + s u u r n o p e u s j u n i i n + s u u r n o p e u s j u n i l l e + s u u r n o p e u s j u n i s s a + s u u r n o p e u s j u n i s t a + s u u r n o p e u s k a m e r a + s u u r n o p e u s m a t k u s t a j a + s u u r n o p e u s m a t k u s t a j a j u n a t + s u u r n o p e u s m a t k u s t a j a j u n i a + s u u r n o p e u s m a t k u s t a j a j u n i i n + s u u r n o p e u s r a d a t + s u u r n o p e u s r a d o i l l a + s u u r n o p e u s r a i t e i d e n + s u u r n o p e u s r a t a + s u u r n o p e u s r a t a y h t e y k s i ä + s u u r n o p e u s r a t o i h i n + s u u r n o p e u s r a t o j a + s u u r n o p e u s r a t o j e n + s u u r n o p e u s r a u t a t e i h i n + s u u r n o p e u s r a u t a t i e l i n j o j a + s u u r n o p e u s r a u t a t i e v e r k k o + s u u r n o p e u s r a u t a t i e v e r k o s t o n + s u u r n o p e u s r e n g a s v a a t i m u k s e s t a + s u u r n o p e u s r e n k a a t + s u u r n o p e u s v e r k k o j a + s u u r n o p e u s v e r k o s t o n + s u u r n o p e u s y h t e y k s i e n + s u u r n o p e u s y h t e y k s i i n + s u u r o m i s t a j a t + s u u r o m i s t a j i e n + s u u r o m i s t a j i l l e + s u u r o n n e t t o m u u d e n + s u u r o n n e t t o m u u d e s t a + s u u r o n n e t t o m u u k s i a + s u u r o n n e t t o m u u k s i e n + s u u r o n n e t t o m u u k s i i n + s u u r o n n e t t o m u u k s i k s i + s u u r o n n e t t o m u u k s i s s a + s u u r o n n e t t o m u u k s i s t a + s u u r o n n e t t o m u u s + s u u r o n n e t t o m u u s h a l l i n n a n + s u u r o n n e t t o m u u s t i l a n t e i t a + s u u r o n n e t t o m u u s v a a r o j e n + s u u r o n n e t t o m u u t t a + s u u r o s a k k a i t a + s u u r p a i n e n a t r i u m l a m p p u + s u u r p a n k e i l l a + s u u r p a n k k e j a + s u u r p a t o + s u u r p e r h e + s u u r p e r h e e m m e + s u u r p e r h e i l l e + s u u r p e r h e i t ä + s u u r p i i r i + s u u r p i i r t e i s e m m i n + s u u r p i i r t e i s e m p i + s u u r p i i r t e i s e m p i ä + s u u r p i i r t e i s e m p ä ä + s u u r p i i r t e i s e m p ä ä n + s u u r p i i r t e i s e s t i + s u u r p i i r t e i s i ä + s u u r p i i r t e i s t e n + s u u r p o m m i t u k s e t + s u u r p r o j e k t e j a + s u u r p u j o t t e l u + s u u r p u o l a n + s u u r p ä ä o m a + s u u r p ä ä o m a a + s u u r p ä ä o m a a n + s u u r p ä ä o m a l l e + s u u r p ä ä o m a n + s u u r p ä ä o m a s t a + s u u r p ä ä o m i l l e + s u u r r a b b i + s u u r r a h o i t t a j a n + s u u r r i k o k s i i n + s u u r r i k o l l i n e n + s u u r r i k o l l i s e l l e + s u u r r i k o l l i s e t + s u u r r i k o l l i s i a + s u u r r i k o l l i s i i n + s u u r r i k o l l i s i l l e + s u u r r i k o l l i s t e n + s u u r r i k o l l i s u u d e n + s u u r r i k o l l i s u u d e s t a + s u u r r i k o l l i s u u s + s u u r r i k o l l i s u u t e e n + s u u r r i k o l l i s u u t t a + s u u r r y h m i e n + s u u r r y h m ä ä + s u u r r ä j ä h d y k s e s t ä + s u u r s a a v u t u s + s u u r s a t a m a + s u u r s e r b i a l a i s e s t a + s u u r s i i v o u s + s u u r s i i v o u s t a + s u u r s i j o i t t a j a t + s u u r s i j o i t t a j i a + s u u r s i j o i t t a j i e n + s u u r s k a n d a a l i t + s u u r s n a u t s e r i + s u u r s o d a n + s u u r s o t a + s u u r s t r a t e g i a + s u u r t a + s u u r t a a j a m i s s a + s u u r t a a j u i s e n + s u u r t a k a a n + s u u r t a l o u d e s t a + s u u r t a p a h t u m a + s u u r t a p a h t u m a t + s u u r t a p a h t u m i e n + s u u r t a p a h t u m i s s a + s u u r t e h o a k u t + s u u r t e h o k a i k u l u o t a i m i l l a + s u u r t e h o k a i k u l u o t a i n t e n + s u u r t e h o l ä h e t y s l u p a a + s u u r t e k i j ä + s u u r t e n + s u u r t e o k s e n + s u u r t e o l l i s u u d e l t a + s u u r t e o l l i s u u d e l t a m m e + s u u r t e o l l i s u u d e n + s u u r t e o l l i s u u s + s u u r t e o l l i s u u t e e m m e + s u u r t e o l l i s u u t e e n + s u u r t e o l l i s u u t t a + s u u r t i e t o k o n e + s u u r t i l a l l i s e t + s u u r t i l a l l i s i a + s u u r t i l a l l i s t e n + s u u r t i l a t + s u u r t i l o i l l a + s u u r t i l o i l l e + s u u r t i l o j e n + s u u r t o i m e k s i a n n o i s t a + s u u r t o i m e k s i a n t o j e n + s u u r t o r i + s u u r t r u s t i t + s u u r t u l i p a l o a + s u u r t u l v a t + s u u r t u l v i s t a + s u u r t u o t a n n o n + s u u r t u o t a n t o o n + s u u r t u o t t a j a + s u u r t u o t t a j a t k i n + s u u r t u o t t a j i a + s u u r t u o t t a j i e n + s u u r t u t k i m u k s e n + s u u r t y ö + s u u r t y ö n a n t a j i e n + s u u r t y ö t t ö m y y d e l l e + s u u r t y ö t t ö m y y d e n + s u u r t y ö t t ö m y y s + s u u r t y ö t t ö m y y t t ä + s u u r u i s e n + s u u r u i s e t + s u u r u i s i a + s u u r u i s i k s i + s u u r u i s i s t a + s u u r u u d e n + s u u r u u d e n h u l l u u d e s t a + s u u r u u d e s t a + s u u r u u d i s t u s + s u u r u u d i s t u s t a + s u u r u u s e r o + s u u r u u s h a r h a + s u u r u u s j ä r j e s t y s e p ä y h t ä l ö + s u u r u u s l u o k a l t a a n + s u u r u u s l u o k a s t a + s u u r u u s l u o k k a + s u u r u u s l u o k k a a + s u u r v a l k k u + s u u r v a l l a k s i + s u u r v a l l a l l a + s u u r v a l l a l l e + s u u r v a l l a n + s u u r v a l l a n k u m o u s + s u u r v a l l a t + s u u r v a l l o i l l a + s u u r v a l l o i l l e + s u u r v a l l o i l t a + s u u r v a l l o i s t a + s u u r v a l t a + s u u r v a l t a a + s u u r v a l t a a n + s u u r v a l t a n a + s u u r v a l t a p o l i t i i k k a + s u u r v a l t a p o l i t i i k k a a + s u u r v a l t a p y r k i m y k s e t + s u u r v a l t i o + s u u r v a l t i o i d e n + s u u r v a l t o i h i n + s u u r v a l t o i n a + s u u r v a l t o j a + s u u r v a l t o j e n + s u u r v e s i v o i m a a + s u u r v i l j e l i j ä t + s u u r v i l j e l i j ä ä + s u u r v i l j e l i j ö i d e n + s u u r v i l j e l i j ö i h i n + s u u r v i l j e l i j ö i l l e + s u u r v i l j e l m i e n + s u u r v i l j e l y k a s v i e n + s u u r v i l j e l y y n + s u u r v i s i i r e i s t ä + s u u r v o i m a l a n + s u u r v o i t o i s t a + s u u r v o i t t o + s u u r v o i t t o j a + s u u r v o i t t o j e n + s u u r v u o r e a k t o r i + s u u r v u o r e a k t o r i a + s u u r v u o r e a k t o r i n + s u u r y h t i ö + s u u r y h t i ö i d e n + s u u r y h t i ö i l l e + s u u r y h t i ö i t ä + s u u r y h t i ö t + s u u r y h t i ö t ä + s u u r y h t y m i i n + s u u r y r i t t ä j ä + s u u r y r i t y k s e e n + s u u r y r i t y k s e l l e + s u u r y r i t y k s e n + s u u r y r i t y k s e s s ä + s u u r y r i t y k s e s t ä + s u u r y r i t y k s e t + s u u r y r i t y k s i e n + s u u r y r i t y k s i i n + s u u r y r i t y k s i k s i + s u u r y r i t y k s i l l e + s u u r y r i t y k s i l l e k i n + s u u r y r i t y k s i l l ä + s u u r y r i t y k s i l t ä + s u u r y r i t y k s i s s ä + s u u r y r i t y k s i s t ä + s u u r y r i t y k s i ä + s u u r y r i t y s + s u u r y r i t y s r y h m i t t y m i e n + s u u r y r i t y s t e m m e + s u u r y r i t y s t e n + s u u r y r i t y s t e n k ä ä n + s u u r y r i t y s t ä + s u u s e k s i + s u u s y ö p ä + s u u t t u a + s u u t t u k o + s u u t t u m u k s e n + s u u t t u m u s t a + s u u t t u v a n + s u u t u t a a n + s u u t u t t a a + s u u t u t t a v a t + s u u t u t t a v i s t a + s u u t u t t i + s u u y r i t y s t e n + s u v a i t a + s u v a i t s e m a t o n t a + s u v a i t s e m a t t o m i a + s u v a i t s e m a t t o m i m m i s t a + s u v a i t s e m a t t o m u u d e n + s u v a i t s e m a t t o m u u d e s t a + s u v a i t s e m a t t o m u u s r i k o k s e t + s u v a i t s e m a t t o m u u s r i k o k s i a + s u v a i t s e m a t t o m u u s r i k o s t e n + s u v a i t s e m a t t o m u u t e e n + s u v a i t s e m a t t o m u u t t a + s u v a i t s e m i n e n + s u v a i t s e m i s t a + s u v a i t s e v a i s e m m i n + s u v a i t s e v a i s e m p a a + s u v a i t s e v a i s e m p i + s u v a i t s e v a i s e m p i a + s u v a i t s e v a i s e n + s u v a i t s e v a i s i a + s u v a i t s e v a i s t a + s u v a i t s e v a i s u u d e n + s u v a i t s e v a i s u u d e s t a + s u v a i t s e v a i s u u s k a s v a t u s + s u v a i t s e v a i s u u s k a s v a t u s t a + s u v a i t s e v a i s u u s l e i r e j ä + s u v a i t s e v a i s u u s o h j e l m a + s u v a i t s e v a i s u u s p o l i t i i k k a + s u v a i t s e v a i s u u s p o l i t i i k k a a + s u v a i t s e v a i s u u t e n a + s u v a i t s e v a i s u u t t a + s u v a i t s e v a m m a n + s u v a i t s e v a m p a a + s u v a i t s e v a m p i + s u v a i t s e v a m p i a + s u v a i t s e v i m m i s t a + s u v a i t s e v u u s o h j e l m a t + s u v a i t s e v u u t t a + s u v a n t o v a i h e e s s a + s u v a n t o v ä s t ä r ä k k i + s u v e r e e n e i k s i + s u v e r e e n e i l l e + s u v e r e e n e i s s a + s u v e r e e n e i s t a + s u v e r e e n e j a + s u v e r e e n i a + s u v e r e e n i e n + s u v e r e e n i i n + s u v e r e e n i k s i + s u v e r e e n i n + s u v e r e e n i n a + s u v e r e e n i s u u d e n + s u v e r e e n i u d e s t a + s u v e r e e n i u t e e n s a + s u v e r e n i t e e t i l l a + s u v e r e n i t e e t i n + s u v e r e n i t e e t i s t a + s u v e r e n i t e e t t i a + s u v e r e n i t e e t t i i n + s u v e r e n i t e e t t i m m e + s u v e r e n i t e e t t i o i k e u k s i a a n + s u v e r e n i t e e t t i o i k e u k s i e n + s u v e r e n i t e e t t i o i k e u s + s u v e r e n i t e e t t i p e r i a a t t e e s t a + s u v e r e n i t e e t t i v a a t e e t + s u v i k e l l o + s u v i s e u r a t + s u v i v i r s i + s u v u l l e e n + s u v u n j a t k a m i s e s t a + s u v u n j a t k a m i s i ä s s ä + s v e i t s i l ä i s e t + s v e i t s i l ä i s i l t ä + s v e i t s i l ä i s i s s ä + s v e i t s i l ä i s k a a r t i + s v e i t s i l ä i s t e n + s w a h i l i t + s w a z i t + s y a n i d i a + s y a n i d i j ä t e t t ä + s y a n i d i j ä ä m i e n + s y a n i d i k a t a s t r o f i + s y a n i d i k a t a s t r o f i i n + s y a n i d i l i u o t t i m i a + s y a n i d i m e n e t e l m ä + s y a n i d i n + s y a n i d i n p o i s t o s s a + s y a n i d i p i t o i s u u k s i l l e + s y a n i d i t e k n i i k a n + s y a n i d i t e k n i i k k a + s y a n i d i t e k n i i k k a a + s y a n i d i t e k n i i k k a a n + s y a n i d i t e k n i i k o i t a + s y a n i d i t e k n o l o g i a + s y a n i d i t s u n a m i + s y a n i d i v u o d o s t a + s y a n i d i y h d i s t e i d e n + s y d ä m e e n + s y d ä m e l l i s e m p i + s y d ä m e l l i s e n + s y d ä m e l l i s e t + s y d ä m e l l i s i m m ä t + s y d ä m e l l i s y y t t ä + s y d ä m e l l ä + s y d ä m e l t ä n i + s y d ä m e m m e + s y d ä m e n + s y d ä m e n a s i a k s e e n + s y d ä m e n i + s y d ä m e n s i i r t o + s y d ä m e n t a h d i s t i n + s y d ä m e n ä + s y d ä m e s s ä + s y d ä m e s s ä n i + s y d ä m e s t ä + s y d ä m e s t ä m m e + s y d ä m e s t ä n i + s y d ä m e s t ä ä n + s y d ä m e t t ö m ä s t ä + s y d ä n h a l v a u k s i s t a + s y d ä n h a l v a u s + s y d ä n h ä i r i ö i t ä + s y d ä n i n f a r k t e j a + s y d ä n i n f a r k t i + s y d ä n i n f a r k t i n + s y d ä n i n f a r k t i r i s k i ä + s y d ä n i n f a r k t i s t a + s y d ä n k i r u r g i a + s y d ä n k o h t a u k s e e n + s y d ä n k o h t a u k s e n + s y d ä n k o h t a u k s e s t a + s y d ä n k o h t a u k s e t + s y d ä n k o h t a u k s i a + s y d ä n k o h t a u k s i i n + s y d ä n k o h t a u k s i l t a + s y d ä n k o h t a u k s i n a + s y d ä n k o h t a u k s i s t a + s y d ä n k o h t a u s + s y d ä n k o h t a u s p o t i l a i t a + s y d ä n k o h t a u s t e n + s y d ä n k o m p l i k a a t i o i h i n s a + s y d ä n l e i k k a u k s e e n + s y d ä n l e i k k a u k s e s t a + s y d ä n l e i k k a u k s i a + s y d ä n l ä p p i e n + s y d ä n l ä p ä n + s y d ä n l ä p ä t + s y d ä n l ä ä k k e i t ä + s y d ä n m a i l l a + s y d ä n m a i l l a a n + s y d ä n o n g e l m i a + s y d ä n p o t i l a a t + s y d ä n p o t i l a i d e n + s y d ä n p o t i l a i t a + s y d ä n p y s ä h d y k s e l t ä + s y d ä n s a i r a a l a s s a + s y d ä n s a i r a u d e s t a + s y d ä n s a i r a u d e t + s y d ä n s a i r a u k s i a + s y d ä n s a i r a u k s i e n + s y d ä n s a i r a u k s i i n + s y d ä n s a i r a u k s i s t a + s y d ä n s a i r a u s + s y d ä n s a i r a u t e e n s a + s y d ä n s a i r a u t t a + s y d ä n s i i r r o i s t a + s y d ä n s i m p u k k a + s y d ä n s i m p u k k a k e r a m i i k k a + s y d ä n s y ö p ä + s y d ä n s ä ä t i ö + s y d ä n t a u d e i l l e + s y d ä n t a u d i n + s y d ä n t a u t e i h i n + s y d ä n t a u t e j a + s y d ä n t a u t i e n + s y d ä n t ä + s y d ä n t ä m m e + s y d ä n t ä n i + s y d ä n t ä n n e + s y d ä n v a i v o j a + s y d ä n v e r i s u o n e t + s y d ä n v i k a + s y d ä n v i k a i s e l l e + s y d ä n y ö + s y i d e n + s y i h i n + s y i s t ä + s y i s t ä ä n + s y i t ä + s y k e m i t t a r i + s y k e r ö h ä r k k i + s y k e r ö t i m j a m i + s y k k i v ä s s ä + s y k l a a m i h a p o n + s y k l a a m i h a p o s t a + s y k l a a m i h a p p o o n + s y k l e i s t ä + s y k l i e n + s y k l i ä + s y k l o n i t u u l i s t a + s y k l o t r o n i t e r a p i a k e s k u k s e n + s y k s y l l ä + s y k s y n + s y k s y y n + s y k s y ä + s y l i k o i r a + s y l i k o i r a k s i + s y l i n t e r i n k a n s i + s y l i n t e r i s i n e t t i + s y l i n t e r i t i l a v u u d e l t a a n + s y l i n t e r i t i l a v u u d e s t a + s y l i n t e r i t i l a v u u t t a + s y l k i k a s k a s + s y l k i k u o r i a i s e t + s y l k i r a u h a n e n + s y l k i r a u h a s s y ö p ä + s y m b o l e i t a + s y m b o l e j a + s y m b o l i a r v o + s y m b o l i a r v o a + s y m b o l i n a + s y m b o l i s e k s i + s y m b o l i s e l l e + s y m b o l i s e m p a a + s y m b o l i s e n + s y m b o l i s e s t a + s y m b o l i s e t + s y m b o l i s i a + s y m b o l i s i k s i + s y m b o l i s o i v a t + s y m b o l i s t a + s y m b o l i t + s y m b o l o i v a t + s y m b o l o i v i a + s y m m e t r i s e m m ä t + s y m m e t r i s e s t ä + s y m p a a t t i s e s t a + s y m p a t i a a + s y m p a t i a m m e + s y m p a t i a n i + s y m p a t i a n s a + s y m p a t i o i t a + s y m p a t i o i t a m m e + s y n d i k a a t t i l a i n a + s y n e r g i a a + s y n e r g i a e t u a + s y n e r g i a e t u j a + s y n e r g i a e t u j e n + s y n e r g i a h a n k k e i l l e + s y n e r g i a k y s y m y s t ä + s y n e r g i a n + s y n e r g i a o h j e l m a n + s y n e r g i a r a t k a i s u i h i n + s y n e r g i a v a i k u t u k s e n + s y n e r g i a v a i k u t u k s e t + s y n e r g i a v a i k u t u k s i a + s y n e r g i a v a i k u t u k s i s t a + s y n e r g i a v a i k u t u s t a + s y n e r g i a v a i k u t u s t e n + s y n e r g i a y h t e i s t y ö + s y n k e m m ä l t ä + s y n k e m p i + s y n k e m p i e n + s y n k i m m i s t ä + s y n k i m m ä t + s y n k i m p i i n + s y n k i m p i ä + s y n k k i e n + s y n k k i ä + s y n k k y y d e n + s y n k k ä n ä + s y n k k ä ä + s y n k r o n o i t a e s s a + s y n k r o t r o n i s ä t e i l y + s y n k ä l l ä + s y n k ä l t ä + s y n k ä n + s y n k ä t + s y n n y i m m e + s y n n y i n k a u p u n g i s s a n i + s y n n y i n m a a l l e n i + s y n n y i n m a a n + s y n n y i n m a a n i + s y n n y i n m a a s s a a n + s y n n y i n m a a s s a n n e + s y n n y i n m a a s t a a n + s y n n y i n m a i d e n + s y n n y i n m a i t a + s y n n y i n p a i k a s t a + s y n n y i n p a i k k a a n + s y n n y i n p a i k k a k u n n a l l a + s y n n y i n s a a r e l t a n i + s y n n y n n ä i s e e n + s y n n y n n ä i s e n + s y n n y n n ä i s i l t ä + s y n n y n n ä i s i ä + s y n n y n n ä i s t e n + s y n n y n n ä i s t ä + s y n n y t i m m e + s y n n y t t i + s y n n y t t i v ä t + s y n n y t t ä i s i + s y n n y t t ä m i s e k s i + s y n n y t t ä m i s e l l e + s y n n y t t ä m i s e n + s y n n y t t ä m i s e n s ä + s y n n y t t ä m i s e s t ä + s y n n y t t ä m ä n s ä + s y n n y t t ä m ä s t ä + s y n n y t t ä m ä t t ä + s y n n y t t ä m ä ä + s y n n y t t ä n e e t + s y n n y t t ä n e i d e n + s y n n y t t ä n e i l l e + s y n n y t t ä v ä t + s y n n y t t ä ä + s y n n y t y k s e e n + s y n n y t y k s e n + s y n n y t y k s e s t ä + s y n n y t y s a v u s t u s + s y n n y t y s l a i t o k s e s s a + s y n n y t y s l a i t o k s i a + s y n n y t y s l a i t o k s i i n + s y n n y t y s l a i t o k s i l l a + s y n n y t y s l a i t o k s i s s a + s y n n y t y s m a s e n n u s + s y n n y t y s o s a s t o i l l a + s y n n y t y s p o l i t i i k k a + s y n n y t y s p o l t o i s t a + s y n n y t y s p r o s e s s i n + s y n n y t y s s a i r a a l a n + s y n n y t y s s a i r a a l o i h i n + s y n n y t y s s a i r a a l o i t a + s y n n y t y s s a l i s t a + s y n n y t y s t e r v e y s p a l v e l u t + s y n n y t y s t u k o k s i i n + s y n n y t y s t u s k i e n + s y n n y t y s t u s k i s s a + s y n n y t y s t ä + s y n o d i i n + s y n o d i n + s y n o n y y m e j ä + s y n t e e t t i s e n + s y n t e e t t i s i s t ä + s y n t e e t t i s i ä + s y n t e e t t i s t e n + s y n t e j ä ä n + s y n t i l i s t a + s y n t i p u k e i k s i + s y n t i p u k k e i n a + s y n t i p u k k e j a + s y n t i p u k k i + s y n t i p u k k i a + s y n t i p u k k i n a + s y n t i p u k k i s t r a t e g i a + s y n t i p u k k i s t r a t e g i a s t a + s y n t i s i ä + s y n t t ä r i t + s y n t y e s s ä + s y n t y e s s ä ä n + s y n t y i + s y n t y i s i + s y n t y i s i k i n + s y n t y i s i v ä t + s y n t y i v ä t + s y n t y m i s e e n + s y n t y m i s e k s i + s y n t y m i s t ä + s y n t y m ä a i k a + s y n t y m ä a i k a n s a + s y n t y m ä a i k o j a + s y n t y m ä k a u p u n k i n i + s y n t y m ä k i r k k o a + s y n t y m ä k i r k o n + s y n t y m ä k u l t t u u r i s t a a n + s y n t y m ä m a a h a n s a + s y n t y m ä m e r k k i + s y n t y m ä p a i k a s t a + s y n t y m ä p a i k k a + s y n t y m ä p a i k k a a n + s y n t y m ä p a i k k a n i + s y n t y m ä p a i n o n s a + s y n t y m ä p ä i v ä + s y n t y m ä p ä i v ä j u l i s t u k s e e n + s y n t y m ä p ä i v ä l a h j a + s y n t y m ä p ä i v ä l a h j a n + s y n t y m ä p ä i v ä l a h j a n a + s y n t y m ä p ä i v ä n + s y n t y m ä p ä i v ä n i + s y n t y m ä p ä i v ä n s ä + s y n t y m ä p ä i v ä n ä ä n + s y n t y m ä p ä i v ä o n g e l m a + s y n t y m ä p ä i v ä t + s y n t y m ä p ä i v ä ä + s y n t y m ä s s ä + s y n t y m ä t o d i s t u k s e n + s y n t y m ä t o d i s t u k s i a + s y n t y m ä t o d i s t u s t a + s y n t y m ä t t ö m i e n + s y n t y m ä t t ö m i i n + s y n t y m ä t t ö m i ä + s y n t y m ä t t ö m ä l l ä + s y n t y m ä t t ö m ä n + s y n t y n e e n + s y n t y n e e t + s y n t y n e i d e n + s y n t y n e i t ä + s y n t y n y t t ä + s y n t y p e r ä i s t e n + s y n t y p e r ä n + s y n t y p e r ä n i + s y n t y p e r ä ä + s y n t y p e r ä ä n s ä + s y n t y t e o r i o i d e n + s y n t y v a i h e e s s a + s y n t y v i e n + s y n t y v i ä + s y n t y v y y d e n + s y n t y v y y d e n s ä ä n n ö s t e l y k e i n o n a + s y n t y v y y d e n s ä ä n n ö s t e l y s t ä + s y n t y v y y d e s t ä + s y n t y v y y s a s t e + s y n t y v y y s a s t e e n + s y n t y v y y s a s t e e s s a + s y n t y v y y s a s t e e s t a + s y n t y v y y s a s t e e t + s y n t y v y y s a s t e t t a + s y n t y v y y s k r i i s i + s y n t y v y y s l u k u i n a + s y n t y v y y s l u k u j a + s y n t y v y y s l u k u j e n + s y n t y v y y s l u v u i s t a + s y n t y v y y s l u v u t + s y n t y v y y s p o l i t i i k a s t a + s y n t y v y y s p o l i t i i k k a + s y n t y v y y s p o l i t i i k k a a + s y n t y v y y s p o l i t i i k k o i h i n + s y n t y v y y s p r o s e n t t i + s y n t y v y y s t a s o a + s y n t y v y y t e e n + s y n t y v y y t e m m e + s y n t y v y y t e n s ä + s y n t y v y y t t ä + s y n t y v y y t t ä ä n + s y n t y v ä t + s y n t y y + s y n t y y k ö + s y n t y ä + s y n t y ä k ä ä n + s y r e e n i k i i t ä j ä + s y r j i i + s y r j i m i s e e n + s y r j i m i s e n + s y r j i m i s t a k t i i k k a + s y r j i m i s t o i m i a + s y r j i m i s t ä + s y r j i m m e k ö + s y r j i m ä t t ä + s y r j i m ä t t ö m i e n + s y r j i m ä t t ö m i i n + s y r j i m ä t t ö m i l l ä + s y r j i m ä t t ö m i n + s y r j i m ä t t ö m i n ä + s y r j i m ä t t ö m i s t ä + s y r j i m ä t t ö m i ä + s y r j i m ä t t ö m y y d e l l e + s y r j i m ä t t ö m y y d e l l ä + s y r j i m ä t t ö m y y d e n + s y r j i m ä t t ö m y y d e s t ä + s y r j i m ä t t ö m y y s a r t i k l a + s y r j i m ä t t ö m y y s d i r e k t i i v e j ä + s y r j i m ä t t ö m y y s d i r e k t i i v i + s y r j i m ä t t ö m y y s d i r e k t i i v i s t ä + s y r j i m ä t t ö m y y s d i r e k t i i v i ä + s y r j i m ä t t ö m y y s k y s y m y s t ä + s y r j i m ä t t ö m y y s l a i n s ä ä d ä n n ö n + s y r j i m ä t t ö m y y s l a i n s ä ä d ä n t ö ä + s y r j i m ä t t ö m y y s l a k i e n + s y r j i m ä t t ö m y y s l a u s e k e + s y r j i m ä t t ö m y y s l a u s e k e t t a + s y r j i m ä t t ö m y y s l a u s e k k e e n + s y r j i m ä t t ö m y y s l a u s e k k e e s t a + s y r j i m ä t t ö m y y s l a u s e k k e i d e n + s y r j i m ä t t ö m y y s p e r i a a t e + s y r j i m ä t t ö m y y s p e r i a a t e t t a + s y r j i m ä t t ö m y y s p e r i a a t t e e n + s y r j i m ä t t ö m y y s p e r i a a t t e e s e e n + s y r j i m ä t t ö m y y s p e r i a a t t e i d e n + s y r j i m ä t t ö m y y s p e r i a a t t e i l l e + s y r j i m ä t t ö m y y s p o l i t i i k a n + s y r j i m ä t t ö m y y s p o l i t i i k k a + s y r j i m ä t t ö m y y s p o l i t i i k k a a + s y r j i m ä t t ö m y y s p y k ä l ä + s y r j i m ä t t ö m y y s s t r a t e g i o i d e n + s y r j i m ä t t ö m y y s s ä ä n n ö n + s y r j i m ä t t ö m y y s s ä ä n t ö + s y r j i m ä t t ö m y y s t o i m i s t a + s y r j i m ä t t ö m y y t e e n + s y r j i m ä t t ö m y y t e n ä + s y r j i m ä t t ö m y y t t ä + s y r j i m ä t t ö m ä l l ä + s y r j i m ä t t ö m ä m m i n + s y r j i m ä t t ö m ä n + s y r j i m ä t t ö m ä s t ä + s y r j i m ä t t ö m ä t + s y r j i m ä t t ö m ä ä n + s y r j i m ä t ö n + s y r j i m ä t ö n t ä + s y r j i n n ä k s i + s y r j i n n ä l l e + s y r j i n n ä l t ä + s y r j i n n ä n + s y r j i n n ä n l ä h t e e t + s y r j i n n ä n v a s t a i n e n + s y r j i n n ä n v a s t a i s e e n + s y r j i n n ä n v a s t a i s e k s i + s y r j i n n ä n v a s t a i s e l l a + s y r j i n n ä n v a s t a i s e n + s y r j i n n ä n v a s t a i s e s t a + s y r j i n n ä n v a s t a i s e t + s y r j i n n ä n v a s t a i s i a + s y r j i n n ä n v a s t a i s i i n + s y r j i n n ä n v a s t a i s i l l a + s y r j i n n ä n v a s t a i s i l l e + s y r j i n n ä n v a s t a i s i s t a + s y r j i n n ä n v a s t a i s t a + s y r j i n n ä n v a s t a i s t e n + s y r j i n n ä n v a s t a i s u u d e n + s y r j i n n ä n v a s t a i s u u s + s y r j i n n ä n v a s t a i s u u s p e r i a a t t e e n + s y r j i n n ä s t ä + s y r j i n t ä a s i a a + s y r j i n t ä h i e r a r k i a + s y r j i n t ä k a m p a n j o i t a + s y r j i n t ä k i e l l o n + s y r j i n t ä k i e l t o + s y r j i n t ä k i e l t o a + s y r j i n t ä k i e l t o l a u s e k e + s y r j i n t ä k i e l t o o n + s y r j i n t ä k i e l t o v a a t i m u s t e n + s y r j i n t ä k y s y m y k s e e n + s y r j i n t ä k y s y m y k s i s s ä + s y r j i n t ä k ä y t ä n n ö i s t ä + s y r j i n t ä l a j i e n + s y r j i n t ä m a h d o l l i s u u d e n + s y r j i n t ä m e k a n i s m e i s t a + s y r j i n t ä m u o t o j a + s y r j i n t ä m u o t o j e n + s y r j i n t ä o n g e l m a a + s y r j i n t ä o n g e l m a n + s y r j i n t ä o n g e l m i a + s y r j i n t ä p a k e t i n + s y r j i n t ä p e l k o + s y r j i n t ä p e r u s t e e t + s y r j i n t ä p e r u s t e i d e n + s y r j i n t ä p e r u s t e i s t a + s y r j i n t ä p e r u s t e i t a + s y r j i n t ä p e r u s t e t t a + s y r j i n t ä p o l i t i i k k a a + s y r j i n t ä r a k e n t e i t a + s y r j i n t ä r i s k e j ä + s y r j i n t ä s u o j a + s y r j i n t ä s u o j a a + s y r j i n t ä t a p a u k s e n a + s y r j i n t ä t a p a u k s e s s a + s y r j i n t ä t a p a u k s e s t a + s y r j i n t ä t a p a u k s e t + s y r j i n t ä t a p a u k s i a + s y r j i n t ä t a p a u k s i i n + s y r j i n t ä t a p a u k s i l l e + s y r j i n t ä t a p a u k s i s s a + s y r j i n t ä t a p a u k s i s t a + s y r j i n t ä t a p a u s t e n + s y r j i n t ä t i l a n t e e n + s y r j i n t ä t i l a n t e e t + s y r j i n t ä t i l a n t e i s i i n + s y r j i n t ä t i l a n t e i t a + s y r j i n t ä t o i m e n p i t e i s i i n + s y r j i n t ä t o i m e n p i t e i t ä + s y r j i n t ä t o i m i e n + s y r j i n t ä t o i m i i n + s y r j i n t ä t u t k i m u k s e s s a + s y r j i n t ä t y y p p e j ä + s y r j i n t ä v a a r a + s y r j i n t ä ä + s y r j i n t ä ä n + s y r j i t t y j ä + s y r j i t y i m p i e n + s y r j i t y i n + s y r j i t y k s i + s y r j i t y t + s y r j i t ä + s y r j i t ä ä n + s y r j i v i e n + s y r j i v i i n + s y r j i v i l l ä + s y r j i v i ä + s y r j i v ä l t ä + s y r j i v ä t + s y r j i v ä ä + s y r j i ä + s y r j ä a l u e e l t a + s y r j ä a l u e i l l a + s y r j ä a l u e i t a + s y r j ä i s e l t ä + s y r j ä i s e m m i k s i + s y r j ä i s e m m i l l e + s y r j ä i s e m m i l l ä + s y r j ä i s e m m i l t ä + s y r j ä i s e m m ä l l ä + s y r j ä i s e m p i i n + s y r j ä i s e n + s y r j ä i s e s t ä + s y r j ä i s e t + s y r j ä i s i e n + s y r j ä i s i i n + s y r j ä i s i l l e + s y r j ä i s i l l ä + s y r j ä i s i m m i l l e + s y r j ä i s i m m i l l ä + s y r j ä i s i m m i l t ä + s y r j ä i s i m m i s s ä + s y r j ä i s i m m i s t ä + s y r j ä i s i m m ä n + s y r j ä i s i m m ä n k i n + s y r j ä i s i m m ä s t ä + s y r j ä i s i m m ä t + s y r j ä i s i m m ä t k i n + s y r j ä i s i m p i e n + s y r j ä i s i m p i i n + s y r j ä i s i m p i i n k i n + s y r j ä i s i m p i ä + s y r j ä i s i m p ä ä + s y r j ä i s i n t ä + s y r j ä i s i s t ä + s y r j ä i s i ä + s y r j ä i s t e n + s y r j ä i s t ä + s y r j ä i s y y d e n + s y r j ä i s y y d e s t ä ä n + s y r j ä k y l ä n + s y r j ä s e u d u i l l a + s y r j ä s e u d u i l l e + s y r j ä s e u d u i l t a + s y r j ä s e u d u i s t a + s y r j ä s e u d u l l a + s y r j ä s e u d u t + s y r j ä s e u t u a l u e e t + s y r j ä s e u t u a l u e i d e n + s y r j ä s e u t u a l u e i k s i + s y r j ä s e u t u a l u e i l l a + s y r j ä s e u t u a l u e i l l e + s y r j ä s e u t u a l u e i n a + s y r j ä s e u t u a l u e i s i i n + s y r j ä s e u t u i h i n + s y r j ä s e u t u j a + s y r j ä s e u t u j e n + s y r j ä s e u t u p o l i t i i k a k s i + s y r j ä t e i l l ä + s y r j ä y t e t y n + s y r j ä y t t ä m ä t t ä + s y r j ä y t t ä m ä ä n + s y r j ä y t t ä n e e t + s y r j ä y t t ä n y t + s y r j ä y t t ä v ä t + s y r j ä y t t ä ä + s y r j ä y t t ä ä k s e e n + s y r j ä y t y e s s ä + s y r j ä y t y m i s e e n + s y r j ä y t y m i s e l t ä + s y r j ä y t y m i s e n + s y r j ä y t y m i s e n t o r j u n t a s t r a t e g i a a + s y r j ä y t y m i s i l m i ö + s y r j ä y t y m i s i l m i ö n + s y r j ä y t y m i s i l m i ö s t ä + s y r j ä y t y m i s k e h i t y s + s y r j ä y t y m i s k i e r r e + s y r j ä y t y m i s k y s y m y k s i s s ä + s y r j ä y t y m i s o n g e l m a s t a + s y r j ä y t y m i s r i s k i + s y r j ä y t y m i s r i s k i n + s y r j ä y t y m i s t ä + s y r j ä y t y m i s v a a r a + s y r j ä y t y m i s v a a r a s s a + s y r j ä y t y m i s v a i k u t u k s e t + s y r j ä y t y n e e m m i k s i + s y r j ä y t y n e e m p i + s y r j ä y t y n e e m p i ä + s y r j ä y t y n e e t + s y r j ä y t y n e i d e n + s y r j ä y t y n e i l l e + s y r j ä y t y n e i m m i l l e + s y r j ä y t y n e i m m i s t ä + s y r j ä y t y n e i m m ä n + s y r j ä y t y n e i m p i e n + s y r j ä y t y n e i m p i ä + s y r j ä y t y n e i n ä + s y r j ä y t y n e i s i i n + s y r j ä y t y n e i s s ä + s y r j ä y t y n e i t ä + s y r j ä y t y ä + s y s i m e r i h a r a k k a + s y s i p e n s a s y ö k k ö n e n + s y s i v i i r i k a l a + s y s t e e m i b i o l o g i a + s y s t e e m i r i s k e j ä + s y s t e e m i r i s k i e n + s y s t e e m i r i s k i n + s y s t e e m i r i s k i ä + s y s t e e m i s e m m ä n + s y s t e e m i t e o r i a + s y s t e m a a t t i s e l l e + s y s t e m a a t t i s e m m a l l e + s y s t e m a a t t i s e m m a n + s y s t e m a a t t i s e m m i n + s y s t e m a a t t i s e m p a a + s y s t e m a a t t i s e m p i a + s y s t e m a a t t i s i l t a + s y s t e m a t i s o i d a + s y s t e m a t i s o i n n i n + s y s ä y k s e e n + s y s ä y k s e n + s y s ä y k s e n v a h v i s t i n + s y s ä y k s e s s ä + s y s ä y k s e s t ä + s y s ä y k s i ä + s y s ä y s t ä + s y s ä ä m ä t t ä + s y t t y i + s y t t y n y t t ä + s y t t y y + s y t t y ä + s y t y t t i + s y t y t t i v ä t + s y t y t t ä ä + s y t y t y s j ä r j e s t e l m ä + s y t y t y s t u l p p a + s y v e m m i n + s y v e m m i n k i n + s y v e m m i s t ä + s y v e m m ä t + s y v e m p i + s y v e m p i e n + s y v e m p i i n + s y v e m p i k i n + s y v e m p ä ä n + s y v e n e e + s y v e n e m i s t ä + s y v e n e v ä t + s y v e n n e t t y + s y v e n n e t t ä i s i i n + s y v e n n e t ä ä n + s y v e n n ä n + s y v e n t y m i s t ä + s y v e n t y ä + s y v e n t ä e s s ä + s y v e n t ä e s s ä m m e + s y v e n t ä m i n e n + s y v e n t ä m i s e e n + s y v e n t ä m i s e k s i + s y v e n t ä m i s e l l e + s y v e n t ä m i s e n + s y v e n t ä m i s e s t ä + s y v e n t ä m i s p r o s e s s i + s y v e n t ä m i s p r o s e s s i a + s y v e n t ä m i s t y ö n s ä + s y v e n t ä m i s t ä + s y v e n t ä m ä l l ä + s y v e n t ä m ä ä n + s y v e n t ä n y t + s y v e n t ä v i e n + s y v e n t ä v ä m m i n + s y v e n t ä ä + s y v e n t ä ä k s e e n + s y v e n t ä ä k s e m m e + s y v i i n + s y v i m m ä n + s y v y y k s i l l e + s y v y y k s i s t ä + s y v y y s k r i t e e r i s t ä + s y v y y s m i t t a r i + s y v y y s n ä k ö + s y v y y s p o m m i + s y v y y s p s y k o l o g i a + s y v y y s r a j a + s y v y y s r a j a n + s y v y y s r a j a s t a + s y v y y s r a j o i t u s + s y v y y s v y ö h y k k e e s t ä + s y v ä l l i s e l l e + s y v ä l l i s e m m i n + s y v ä l l i s e m m i n k i n + s y v ä l l i s e m m ä l l e + s y v ä l l i s e m m ä n + s y v ä l l i s e m m ä t + s y v ä l l i s e m p i + s y v ä l l i s e m p i e n + s y v ä l l i s e m p i i n + s y v ä l l i s e m p i ä + s y v ä l l i s e m p ä ä + s y v ä l l i s e n + s y v ä l l i s e s s ä + s y v ä l l i s e t + s y v ä l l i s i s t ä + s y v ä l l i s i ä + s y v ä l l i s t ä + s y v ä n + s y v ä n m e r e n + s y v ä n m e r e n k a l o j a + s y v ä n n e a h v e n e t + s y v ä n n e k u o r e e t + s y v ä n n e r a u s k u + s y v ä t + s y v ä ä + s y y d e t ä ä n + s y y k s i + s y y l l i s e k s i + s y y l l i s e m p i + s y y l l i s e n ä + s y y l l i s e t + s y y l l i s i i n + s y y l l i s i k s i + s y y l l i s i n ä + s y y l l i s i s t ä + s y y l l i s i ä + s y y l l i s t e n + s y y l l i s t e t y t + s y y l l i s t y i v ä t + s y y l l i s t y m i s e s t ä + s y y l l i s t y m ä s s ä + s y y l l i s t y n e e l l e + s y y l l i s t y n e e n i + s y y l l i s t y n e e t + s y y l l i s t y n e i d e n + s y y l l i s t y n e i s t ä + s y y l l i s t y n e i t ä + s y y l l i s t y n y t + s y y l l i s t y t t y ä ä n + s y y l l i s t y v i e n + s y y l l i s t y v i ä + s y y l l i s t y v ä n + s y y l l i s t y v ä t + s y y l l i s t y y + s y y l l i s t ä m i n e n + s y y l l i s t ä m i s e k s i + s y y l l i s t ä ä + s y y l l i s y y d e n + s y y l l i s y y d e n t u n n e + s y y l l i s y y d e n t u n t e e s t a + s y y l l i s y y d e s t ä + s y y l l i s y y d e s t ä ä n + s y y l l i s y y s a r v i o i n n e i s t a + s y y l l i s y y s a s t e e s t a + s y y l l i s y y s a s t e t t a + s y y l l i s y y s k y s y m y k s i ä + s y y l l i s y y s k y s y m y s + s y y l l i s y y t e n i + s y y l l i s y y t e n s ä + s y y l l i s y y t t ä + s y y l l ä + s y y l ä j u u r i + s y y l ä l i n n u n h e r n e + s y y m m e + s y y n s ä + s y y n t a k e e t t o m u u t t a + s y y n ä + s y y p ä i t ä + s y y p ä ä + s y y p ä ä n ä + s y y p ä ä t + s y y r i a a + s y y r i a a n + s y y r i a l a i s a l u e i d e n + s y y r i a l a i s e t + s y y r i a l a i s i a + s y y r i a l a i s i i n + s y y r i a l a i s m i e l i s t e n + s y y r i a l a i s p a k o l a i s e t + s y y r i a l t a k i n + s y y r i a n + s y y r i a n a + s y y r i a n t i k k a + s y y r i a s s a + s y y r i a s t a + s y y s a s t e r i + s y y s e l i t y k s i l l ä + s y y s i s t u n t o k a u d e l l a a n + s y y s i s t u n t o k a u d e n + s y y s j u u r i p e r h o n e n + s y y s k u u + s y y s k u u h u n + s y y s k u u l l e + s y y s k u u l t a + s y y s k u u n + s y y s k u u s s a + s y y s k u u s t a + s y y s k u u t a + s y y s k y l v ö j ä + s y y s l e h t i ä + s y y s l e i m u + s y y s m a i t i a i n e n + s y y s m y r k k y l i l j a + s y y s p ä i v ä n h a t t u + s y y s s a h r a m i + s y y s s a t o + s y y s s o n a a t t i + s y y s s y r i k k ä + s y y s t a l v e n + s y y s t ä + s y y s t ä k i n + s y y s v a l m u s k a + s y y s v a r p u m i t t a r i + s y y s v i l j e l y ä + s y y t e l l ä + s y y t e m e n e t t e l y j ä r j e s t e l m ä n s ä + s y y t e s u o j a + s y y t e s u o j a n s a + s y y t e s u o j a s t a + s y y t e t o i m e n p i t e e t + s y y t e t o i m i a + s y y t e t o i m i i n + s y y t e t o i m i l l e + s y y t e t o i m i n n a s s a + s y y t e t t y i h i n + s y y t e t t y i n ä + s y y t e t t y j e n + s y y t e t t y n ä + s y y t e t t ä + s y y t e t t ä i s i i n + s y y t e t y i l l e + s y y t e t y l l e + s y y t e t y l l ä + s y y t e t ä + s y y t e t ä ä n + s y y t i t t e + s y y t t e e n + s y y t t e e s e e n + s y y t t e e s e e n p a n o a + s y y t t e e s e e n p a n o a l u e + s y y t t e e s e e n p a n o j a + s y y t t e e s e e n p a n o l t a + s y y t t e e s e e n p a n o m e n e t t e l y + s y y t t e e s e e n p a n o n + s y y t t e e s e e n p a n o p r o s e s s i a + s y y t t e e s e e n p a n o s t a + s y y t t e e s e e n p a n o t o i m e n p i t e i s t ä + s y y t t e e s t ä + s y y t t e e t + s y y t t e e t t ä + s y y t t e i d e n + s y y t t e i s i i n + s y y t t e i s t ä + s y y t t e i t t ä + s y y t t e i t ä + s y y t t e l e m ä s t ä + s y y t t e l e m ä ä n + s y y t t e l e v ä t + s y y t t e l i s i m m e + s y y t t e l y j e n + s y y t t e l y n + s y y t t e l y p e l i + s y y t t e l y p e l i i n + s y y t t e l y s o t a a + s y y t t e l y s t ä + s y y t t e l y y n + s y y t t e l y ä + s y y t t ä + s y y t t ä e s s ä ä n + s y y t t ä j i e n + s y y t t ä j i k s i + s y y t t ä j i l l e + s y y t t ä j i l l ä + s y y t t ä j i ä + s y y t t ä j ä k s i + s y y t t ä j ä l a i t o k s e n + s y y t t ä j ä l a i t o k s e s t a + s y y t t ä j ä l a i t o k s e t + s y y t t ä j ä l a i t o s + s y y t t ä j ä l a i t o s t a + s y y t t ä j ä l a i t o s t e n + s y y t t ä j ä l l e + s y y t t ä j ä l l ä + s y y t t ä j ä l t ä + s y y t t ä j ä n + s y y t t ä j ä n l a i t o k s e n + s y y t t ä j ä n s ä + s y y t t ä j ä n t o i m e a + s y y t t ä j ä n t o i m e n + s y y t t ä j ä n t o i m i + s y y t t ä j ä n t o i n t a + s y y t t ä j ä n v i r a n o m a i n e n + s y y t t ä j ä n v i r a s s a + s y y t t ä j ä n v i r a s t o + s y y t t ä j ä n v i r a s t o a + s y y t t ä j ä n v i r a s t o i l l e + s y y t t ä j ä n v i r a s t o j a + s y y t t ä j ä n v i r a s t o k a a n + s y y t t ä j ä n v i r a s t o l l a + s y y t t ä j ä n v i r a s t o l l e + s y y t t ä j ä n v i r a s t o l t a + s y y t t ä j ä n v i r a s t o n + s y y t t ä j ä n v i r a s t o n n e + s y y t t ä j ä n v i r a s t o s s a + s y y t t ä j ä n v i r a s t o s t a + s y y t t ä j ä n ä + s y y t t ä j ä s t ä + s y y t t ä j ä t + s y y t t ä j ä v i r a n o m a i n e n + s y y t t ä j ä v i r a n o m a i s e l l a + s y y t t ä j ä v i r a n o m a i s e l l e + s y y t t ä j ä v i r a n o m a i s e n + s y y t t ä j ä v i r a n o m a i s e s t a + s y y t t ä j ä v i r a n o m a i s e t + s y y t t ä j ä v i r a n o m a i s e t k i n + s y y t t ä j ä v i r a n o m a i s i a + s y y t t ä j ä v i r a n o m a i s i i n + s y y t t ä j ä v i r a n o m a i s i l l a + s y y t t ä j ä v i r a n o m a i s i l l e + s y y t t ä j ä v i r a n o m a i s i l t a + s y y t t ä j ä v i r a n o m a i s i s t a + s y y t t ä j ä v i r a n o m a i s t a + s y y t t ä j ä v i r a n o m a i s t e n + s y y t t ä j ä v i r a s t o + s y y t t ä j ä v i r a s t o a + s y y t t ä j ä v i r a s t o j a + s y y t t ä j ä v i r a s t o j e n + s y y t t ä j ä v i r a s t o n + s y y t t ä j ä v i r a s t o o n + s y y t t ä j ä v i r a s t o s s a + s y y t t ä j ä ä + s y y t t ä j ä ä n + s y y t t ä k ä ä + s y y t t ä m i s e e n + s y y t t ä m i s p r o s e s s i n + s y y t t ä m i s t o i m i i n + s y y t t ä m ä l l ä + s y y t t ä m ä t t ä + s y y t t ä m ä ä n + s y y t t ä v ä t + s y y t t ä ä + s y y t t ä ä k s e n i + s y y t t ö m i e n + s y y t t ö m i i n + s y y t t ö m i n ä + s y y t t ö m i ä + s y y t t ö m y y s o l e t t a m a a + s y y t t ö m y y s o l e t t a m a a n + s y y t t ö m y y s o l e t t a m a n + s y y t t ö m y y s o l e t t a m a s t a + s y y t t ö m y y s o l e t t a m u k s e n + s y y t t ö m y y t e n s ä + s y y t t ö m ä n + s y y t t ö m ä n ä + s y y t ä k i n + s y y t ö k s e t + s y y t ö k s i l l e + s y y t ö k s i l l ä + s y y t ö k s i s t ä + s y y t ö k s i ä + s y y t ö s t e n + s y ö d e s s ä ä n + s y ö d ä + s y ö k s y i v ä t + s y ö k s y k i e r r e + s y ö k s y k i e r r e t t ä + s y ö k s y k i e r t e e l l e + s y ö k s y k i e r t e e n + s y ö k s y k i e r t e e n ä + s y ö k s y k i e r t e e s e e n + s y ö k s y k i e r t e e s s ä + s y ö k s y l a s k u k i l p a i l u + s y ö k s y m ä l l ä + s y ö k s y p o m m i t t a j a + s y ö m i s h ä i r i ö + s y ö m i s h ä i r i ö i h i n + s y ö m i s h ä i r i ö i s t ä + s y ö m i s h ä i r i ö i t ä + s y ö m i s h ä i r i ö s t ä + s y ö m i s h ä i r i ö t + s y ö m m e + s y ö m ä l a k k o a + s y ö m ä l a k k o j a + s y ö m ä l a k k o j e n + s y ö m ä l a k k o l a i s t a + s y ö m ä l a k o n + s y ö m ä l a k o s s a + s y ö m ä l a k o s t a + s y ö m ä l l ä + s y ö m ä s t ä + s y ö m ä ä n + s y ö n k ö + s y ö n t i k i l p a i l u + s y ö p i i n + s y ö p y v ä t + s y ö p ä a s i a n t u n t i j o i d e n + s y ö p ä a s i a n t u n t i j o i t a + s y ö p ä d i r e k t i i v i l l ä + s y ö p ä d i r e k t i i v i n + s y ö p ä e p i d e m i a + s y ö p ä e p i d e m i a s t a + s y ö p ä h o i d o i s t a + s y ö p ä h o i d o n + s y ö p ä h o i t o a + s y ö p ä h o i t o r y h m ä n + s y ö p ä j ä r j e s t ö j ä + s y ö p ä k a s v a i m e t + s y ö p ä k a s v a i m i a + s y ö p ä k a s v a i n t a + s y ö p ä k u o l e m i s t a + s y ö p ä k u o l l e i s u u s + s y ö p ä k u o l l e i s u u t t a + s y ö p ä l a j e i s s a + s y ö p ä l a j i n + s y ö p ä l a j i s s a + s y ö p ä l u v u t + s y ö p ä l ä ä k k e e t + s y ö p ä l ä ä k k e i d e n + s y ö p ä l ä ä k k e i t ä + s y ö p ä m u o t o a + s y ö p ä m u o t o i h i n + s y ö p ä m u o t o j e n + s y ö p ä o h j e l m a n + s y ö p ä o n g e l m a a + s y ö p ä o s a s t o + s y ö p ä p a l v e l u i s t a + s y ö p ä p o t i l a a n + s y ö p ä p o t i l a i d e n + s y ö p ä p o t i l a i l l a + s y ö p ä p o t i l a i l l e + s y ö p ä p o t i l a i t a + s y ö p ä r e k i s t e r e i h i n + s y ö p ä r e k i s t e r e i t ä + s y ö p ä r e k i s t e r i e n + s y ö p ä r e k i s t e r i t + s y ö p ä r i s k i + s y ö p ä r i s k i n s ä + s y ö p ä r i s k i ä + s y ö p ä r o k o t e + s y ö p ä r o k o t t e i t a + s y ö p ä s a i r a a l a + s y ö p ä s a i r a i d e n + s y ö p ä s a i r a u d e t + s y ö p ä s a i r a u k s i a + s y ö p ä s a i r a u k s i e n + s y ö p ä s a i r a u s + s y ö p ä s e u l o n n a n + s y ö p ä s e u l o n n a s t a + s y ö p ä s e u l o n n a t + s y ö p ä s e u l o n t a + s y ö p ä s e u l o n t a a + s y ö p ä s e u l o n t a o h j e l m i e n + s y ö p ä s e u l o n t a t e s t i t + s y ö p ä s e u l o n t o j a + s y ö p ä s o l u + s y ö p ä s o l u j e n + s y ö p ä s u u n n i t e l m a n s a + s y ö p ä t a a k k a a + s y ö p ä t a p a u k s e s t a + s y ö p ä t a p a u k s e t + s y ö p ä t a p a u k s i a + s y ö p ä t a p a u k s i e n + s y ö p ä t a p a u k s i s t a + s y ö p ä t a p a u s + s y ö p ä t a p a u s t a + s y ö p ä t a p a u s t e n + s y ö p ä t i e t o v e r k o s t o n + s y ö p ä t u t k i j o i t a + s y ö p ä t u t k i m u k s e e n + s y ö p ä t u t k i m u k s e l l e + s y ö p ä t u t k i m u k s e n + s y ö p ä t u t k i m u k s e s s a + s y ö p ä t u t k i m u k s e s t a + s y ö p ä t u t k i m u s + s y ö p ä t u t k i m u s l a i t o k s e l t a + s y ö p ä t u t k i m u s t a + s y ö p ä t y y p e i l l e + s y ö p ä t y y p i t + s y ö p ä t y y p p e j ä + s y ö p ä t y y p p i e n + s y ö p ä t y ö r y h m ä + s y ö p ä t y ö r y h m ä s t ä + s y ö p ä u n i o n i n + s y ö p ä v a a r a l l i s i k s i + s y ö p ä v a a r a l l i s u u d e s t a + s y ö p ä v e r k o s t o i s t a + s y ö p ä v e r k o s t o j a + s y ö p ä v e r k o s t o j e n + s y ö p ä v e r k o s t o l t a + s y ö p ä v e r k o s t o t + s y ö p ä ä + s y ö p ä ä n + s y ö s t ä k s e e n + s y ö t i k s i + s y ö t t i i n + s y ö t t ä ä + s y ö t t ö j ä r j e s t e l m ä n + s y ö t t ö k o h d a t + s y ö t t ö k o k e i s i i n + s y ö t t ö l e n n o i l t a + s y ö t t ö m e n e t e l m i ä + s y ö t t ö m e n e t e l m ä ä + s y ö t t ö p a l v e l u i l l e + s y ö t t ö s h a k k i + s y ö t t ö s o l u + s y ö t t ö t a r i f f e i h i n + s y ö t t ö t a r i f f e i l l a + s y ö t t ö t a r i f f i + s y ö t t ö t a r i f f i e n + s y ö v e r e i s s ä + s y ö v i s t ä + s y ö v i ä + s y ö v ä n + s y ö v ä n t o r j u n n a n + s y ö v ä n t o r j u n n a s s a + s y ö v ä n t o r j u n t a + s y ö v ä n t o r j u n t a a + s y ö v ä n t o r j u n t a a n + s y ö v ä n v a s t a i s e n + s y ö v ä s t ä + s y ö v ä t + s y ö v ä ä + s ä d e h o i d o n + s ä d e h o i t o + s ä d e h o i t o a + s ä d e h o i t o i h i n + s ä d e h o i t o l a i t t e i t a + s ä d e h o i t o y k s i k ö s t ä + s ä d e l i h a s + s ä d e s i i p i s i m p p u + s ä d e v i i r u + s ä e s t ä ä + s ä h k e e t + s ä h k ö a i d a t + s ä h k ö a i k a a n + s ä h k ö a i t a + s ä h k ö a j o n e u v o + s ä h k ö a j o n e u v o i h i n + s ä h k ö a j o n e u v o i l l a + s ä h k ö a j o n e u v o i l l e + s ä h k ö a j o n e u v o i n n o s t u k s e n + s ä h k ö a j o n e u v o i s s a + s ä h k ö a j o n e u v o i s t a + s ä h k ö a j o n e u v o j a + s ä h k ö a j o n e u v o j e n + s ä h k ö a j o n e u v o l u k u j a + s ä h k ö a j o n e u v o n + s ä h k ö a j o n e u v o s t r a t e g i a n + s ä h k ö a j o n e u v o t + s ä h k ö a j o n e u v o t e k n i i k a n + s ä h k ö a j o n e u v o t e k n i i k k a a + s ä h k ö a k u t + s ä h k ö a l a + s ä h k ö a l a a + s ä h k ö a l a a n + s ä h k ö a l a l l a + s ä h k ö a l a l l e + s ä h k ö a l a l t a + s ä h k ö a l a n + s ä h k ö a l o i l l a + s ä h k ö a n k e r i a s + s ä h k ö a s e m i a + s ä h k ö a s e t u k s e n + s ä h k ö a s e t u k s e s s a + s ä h k ö a s i a k k a i t a + s ä h k ö a u t o + s ä h k ö a u t o i l l a + s ä h k ö a u t o i l l e + s ä h k ö a u t o i s s a + s ä h k ö a u t o i s t a + s ä h k ö a u t o j a + s ä h k ö a u t o j e n + s ä h k ö a u t o m a l l e i s t a + s ä h k ö a u t o n + s ä h k ö a u t o s t a + s ä h k ö a u t o t + s ä h k ö d i r e k t i i v i + s ä h k ö d i r e k t i i v i i n + s ä h k ö d i r e k t i i v i n + s ä h k ö e n e r g i a + s ä h k ö e n e r g i a a + s ä h k ö e n e r g i a a n + s ä h k ö e n e r g i a d i r e k t i i v i n + s ä h k ö e n e r g i a l ä h t e i d e n + s ä h k ö e n e r g i a m a r k k i n o i s t a + s ä h k ö e n e r g i a m u o t o j a + s ä h k ö e n e r g i a m u o t o j e n + s ä h k ö e n e r g i a n + s ä h k ö e n e r g i a o n n e t t o m u u d e l t a + s ä h k ö e n e r g i a v a j e + s ä h k ö e n e r g i a v e r k k o j e n + s ä h k ö g e n e r a a t t o r e i d e n + s ä h k ö g e n e r a a t t o r e i l l a + s ä h k ö h a m m a s h a r j a + s ä h k ö h a m m a s h a r j a t + s ä h k ö h a m m a s h a r j o j e n + s ä h k ö h i t s a u s l a i t t e i d e n + s ä h k ö h o i t o + s ä h k ö h u o l t o + s ä h k ö i m p u l s s e j a + s ä h k ö i n f r a s t r u k t u u r i a + s ä h k ö i n f r a s t r u k t u u r i i n + s ä h k ö i n f r a s t r u k t u u r i n + s ä h k ö i n v e s t o i n n i l l a + s ä h k ö i s e e n + s ä h k ö i s e l l e + s ä h k ö i s e l l ä + s ä h k ö i s e n + s ä h k ö i s e s s ä + s ä h k ö i s e s t ä + s ä h k ö i s e t + s ä h k ö i s i i n + s ä h k ö i s i k s i + s ä h k ö i s i l l e + s ä h k ö i s i l l ä + s ä h k ö i s i s s ä + s ä h k ö i s i s t ä + s ä h k ö i s i ä + s ä h k ö i s k u + s ä h k ö i s k u j a + s ä h k ö i s k u j e n + s ä h k ö i s k u n + s ä h k ö i s k u t + s ä h k ö i s t e n + s ä h k ö j a k e l u v e r k k o j a + s ä h k ö j o h d e + s ä h k ö j o h d o n + s ä h k ö j o h t o j a + s ä h k ö j o h t o j e n + s ä h k ö j u n a a + s ä h k ö j u n i s s a + s ä h k ö j ä n n i t t e i t ä + s ä h k ö j ä r j e s t e l m i e m m e + s ä h k ö j ä r j e s t e l m i e n + s ä h k ö j ä r j e s t e l m ä n + s ä h k ö j ä r j e s t e l m ä ä + s ä h k ö j ä t t e e s t ä + s ä h k ö k a a p e l e i h i n + s ä h k ö k a a p e l e i t a + s ä h k ö k a a p e l i + s ä h k ö k a a p e l i e n + s ä h k ö k a a p e l i h a n k e + s ä h k ö k a a p e l i n + s ä h k ö k a a p e l i y h t e y s + s ä h k ö k a t k o + s ä h k ö k a t k o e s i t y k s i ä + s ä h k ö k a t k o i s t a + s ä h k ö k a t k o j e n + s ä h k ö k a t k o k s e t + s ä h k ö k a t k o k s i a + s ä h k ö k a t k o k s i i n + s ä h k ö k a t k o k s i s t a + s ä h k ö k a t k o l t a + s ä h k ö k a t k o n + s ä h k ö k a t k o s + s ä h k ö k a t k o s t e n + s ä h k ö k a t k o t + s ä h k ö k a u p a n + s ä h k ö k a u p a s s a + s ä h k ö k a u p p a a + s ä h k ö k e n t t ä + s ä h k ö k e s k u k s i a + s ä h k ö k i p i n ä + s ä h k ö k i t a r a + s ä h k ö k u s t a n n u s t e n + s ä h k ö k ä y t t ö i s t e n + s ä h k ö l a i t e + s ä h k ö l a i t e m a r k k i n o i l l a + s ä h k ö l a i t e r o m u + s ä h k ö l a i t e r o m u a + s ä h k ö l a i t e r o m u n + s ä h k ö l a i t e r o m u s t a + s ä h k ö l a i t e r o m u s t a m m e + s ä h k ö l a i t e r o m u t + s ä h k ö l a i t e t t a + s ä h k ö l a i t o k s e n + s ä h k ö l a i t o k s e s s a + s ä h k ö l a i t o k s i a + s ä h k ö l a i t o k s i l l e + s ä h k ö l a i t o k s i s s a + s ä h k ö l a i t o s + s ä h k ö l a i t o s t e n + s ä h k ö l a i t t e e n + s ä h k ö l a i t t e e n s a + s ä h k ö l a i t t e e s t a + s ä h k ö l a i t t e e t + s ä h k ö l a i t t e i d e n + s ä h k ö l a i t t e i s i i n + s ä h k ö l a i t t e i s s a + s ä h k ö l a i t t e i s t a + s ä h k ö l a i t t e i t a + s ä h k ö l a k i + s ä h k ö l a m p p u j a + s ä h k ö l a s k u + s ä h k ö l a s k u a n i + s ä h k ö l a s k u j a + s ä h k ö l a s k u j e n + s ä h k ö l a s k u n + s ä h k ö l a s k u n s a + s ä h k ö l a s k u s s a + s ä h k ö l a s k u t + s ä h k ö l a s k u u n + s ä h k ö l i n j a + s ä h k ö l i n j a t + s ä h k ö l i n j o j a + s ä h k ö l i n j o j e n + s ä h k ö l l ä + s ä h k ö l ä m m i t y s + s ä h k ö l ä m p ö v o i m a l a i t o k s i l l a + s ä h k ö m a g n e e t t i a a l t o j a + s ä h k ö m a g n e e t t i k e n t ä t + s ä h k ö m a g n e e t t i s e n + s ä h k ö m a g n e e t t i s e t + s ä h k ö m a g n e e t t i s i a + s ä h k ö m a g n e e t t i s i i n + s ä h k ö m a g n e e t t i s i l l a + s ä h k ö m a g n e e t t i s i l l e + s ä h k ö m a g n e e t t i s i l t a + s ä h k ö m a g n e e t t i s i s t a + s ä h k ö m a g n e e t t i s t a + s ä h k ö m a g n e e t t i s t e n + s ä h k ö m a k s u t + s ä h k ö m a r k k i n a + s ä h k ö m a r k k i n a k y s y m y s t ä + s ä h k ö m a r k k i n a n s a + s ä h k ö m a r k k i n a t + s ä h k ö m a r k k i n o i d e n + s ä h k ö m a r k k i n o i h i n + s ä h k ö m a r k k i n o i l l a + s ä h k ö m a r k k i n o i l l e + s ä h k ö m a r k k i n o i s t a + s ä h k ö m a r k k i n o i t a + s ä h k ö m o n n i t + s ä h k ö m o o t t o r e i d e n + s ä h k ö m o o t t o r e i h i n + s ä h k ö m o o t t o r i + s ä h k ö m o o t t o r i n + s ä h k ö m o o t t o r i t + s ä h k ö n + s ä h k ö n h a n k i n t a k i i n t i ö t ä + s ä h k ö n h i n t a a n + s ä h k ö n h i n t o j a + s ä h k ö n h i n t o j e n + s ä h k ö n j a k e l u + s ä h k ö n j a k e l u a + s ä h k ö n j a k e l u j ä r j e s t e l m ä ä + s ä h k ö n j a k e l u n + s ä h k ö n j a k e l u s e k t o r i a + s ä h k ö n j a k e l u v e r k k o a + s ä h k ö n k u l u t u k s e n + s ä h k ö n k u l u t u k s e s t a + s ä h k ö n k u l u t u k s e s t a a n + s ä h k ö n k u l u t u s + s ä h k ö n k u l u t u s t a + s ä h k ö n k u l u t u s t a a n + s ä h k ö n k ä y t t ä j i e n + s ä h k ö n k ä y t t ä j ä t + s ä h k ö n s a a n t i + s ä h k ö n s a a n t i a + s ä h k ö n s i i r t o l i n j o j a + s ä h k ö n s i i r t o v e r k k o a + s ä h k ö n s i i r t o v e r k k o i h i n + s ä h k ö n s i i r t o v e r k k o j a k i n + s ä h k ö n s i i r t o v e r k o l l a + s ä h k ö n s i i r t o v e r k o t + s ä h k ö n s y ö t ö n + s ä h k ö n s y ö t ö s t ä + s ä h k ö n t a r j o n n a s t a m m e + s ä h k ö n t a r j o n t a i n f r a s t r u k t u u r i + s ä h k ö n t a r p e e n + s ä h k ö n t a r v e + s ä h k ö n t o i m i t t a j a n s a + s ä h k ö n t o i m i t t a j a s s a + s ä h k ö n t o i m i t t a j i l l e + s ä h k ö n t o i m i t u k s e n + s ä h k ö n t o i m i t u k s e t + s ä h k ö n t o i m i t u k s i a + s ä h k ö n t o i m i t u s + s ä h k ö n t u o t a n n o l l e + s ä h k ö n t u o t a n n o n + s ä h k ö n t u o t a n n o s s a + s ä h k ö n t u o t a n n o s t a + s ä h k ö n t u o t a n t o + s ä h k ö n t u o t a n t o a + s ä h k ö n t u o t a n t o j ä r j e s t e l m i s s ä + s ä h k ö n t u o t a n t o j ä r j e s t e l m ä t + s ä h k ö n t u o t a n t o k a p a s i t e e t i n + s ä h k ö n t u o t a n t o k y k y + s ä h k ö n t u o t a n t o l a i t o k s e t + s ä h k ö n t u o t a n t o l a i t o k s i a + s ä h k ö n t u o t a n t o l a i t o k s i s t a + s ä h k ö n t u o t a n t o m e n e t e l m i i n + s ä h k ö n t u o t a n t o m u o d o n + s ä h k ö n t u o t a n t o o n + s ä h k ö n t u o t a n t o t e k n i i k k a a + s ä h k ö n t u o t a n t o t e k n i i k o i d e n + s ä h k ö n t u o t a n t o t e k n i i k o i l l e + s ä h k ö n t u o t a n t o t e o l l i s u u d e n + s ä h k ö n t u o t a n t o v a r m u u s + s ä h k ö n t u o t a n t o v ä l i n e i t ä + s ä h k ö n t u o t a n t o y h t i ö i t ä + s ä h k ö n t u o t t a j a n + s ä h k ö n t u o t t a j a t + s ä h k ö n t u o t t a j i a + s ä h k ö n t u o t t a j i e n + s ä h k ö n t u o t t a j i i n + s ä h k ö n ä + s ä h k ö o p e r a a t t o r i e n + s ä h k ö p a k e t t e j a + s ä h k ö p a m p u i l l a + s ä h k ö p a p e r i + s ä h k ö p i a n o + s ä h k ö p i s t o o l i e n + s ä h k ö p o s t e i h i n i + s ä h k ö p o s t i + s ä h k ö p o s t i a + s ä h k ö p o s t i a a n + s ä h k ö p o s t i e n + s ä h k ö p o s t i i n s a + s ä h k ö p o s t i j ä r j e s t e l m ä n + s ä h k ö p o s t i j ä r j e s t e l m ä ä + s ä h k ö p o s t i k e s k u s t e l u i s s a + s ä h k ö p o s t i l i i k e n t e e s t ä + s ä h k ö p o s t i l l a + s ä h k ö p o s t i n + s ä h k ö p o s t i o s o i t e + s ä h k ö p o s t i o s o i t e l u e t t e l o + s ä h k ö p o s t i o s o i t e l u e t t e l o i t a + s ä h k ö p o s t i o s o i t e t t a + s ä h k ö p o s t i o s o i t e t t a a n + s ä h k ö p o s t i o s o i t t e e n + s ä h k ö p o s t i o s o i t t e e n i + s ä h k ö p o s t i o s o i t t e e n n e + s ä h k ö p o s t i o s o i t t e e s t a + s ä h k ö p o s t i o s o i t t e e t + s ä h k ö p o s t i o s o i t t e i d e n + s ä h k ö p o s t i o s o i t t e i s i i n + s ä h k ö p o s t i o s o i t t e i t a + s ä h k ö p o s t i s s a + s ä h k ö p o s t i t i l i + s ä h k ö p o s t i t i l i l l e + s ä h k ö p o s t i v e r k k o a + s ä h k ö p o s t i v e t o o m u k s e n + s ä h k ö p o s t i v i e s t e i l l ä + s ä h k ö p o s t i v i e s t e j ä + s ä h k ö p o s t i v i e s t i e n + s ä h k ö p o s t i v i e s t i n s ä + s ä h k ö p o s t i v i e s t i n t ä n s ä + s ä h k ö p o s t i v i e s t i n t ä ä + s ä h k ö p o s t i v i e s t i t + s ä h k ö p o s t i v i e s t i ä + s ä h k ö p o s t i y h t e y d e n + s ä h k ö p o s t i y h t e y k s i e n + s ä h k ö p o s t i y h t e y k s i ä + s ä h k ö p u r j e + s ä h k ö p u r k a u s + s ä h k ö p u t k i m i e s + s ä h k ö p y ö r i ä + s ä h k ö p y ö r ä + s ä h k ö p y ö r ä t u o l i j a l k a p a l l o + s ä h k ö p y ö r ä t u o l i s a l i b a n d y + s ä h k ö p y ö r ä ä + s ä h k ö p ä ä k e s k u k s e t + s ä h k ö p ö r s s e i s s ä + s ä h k ö p ö r s s i e n + s ä h k ö p ö r s s i s s ä + s ä h k ö p ö r s s i ä + s ä h k ö r a h a + s ä h k ö r a h a a + s ä h k ö r a h a a n + s ä h k ö r a h a n + s ä h k ö r a h a s t a + s ä h k ö r a h a t u o t t e i d e n + s ä h k ö r a u s k u k a l a t + s ä h k ö r u m m u t + s ä h k ö r y h m i t t y m ä s s ä + s ä h k ö s a n o m a t y y l i i n + s ä h k ö s e k t o r i n + s ä h k ö s h o k i n + s ä h k ö s h o k k i t e k n i i k k a + s ä h k ö s h o k k i t e k n i i k k a a + s ä h k ö s i l t a a + s ä h k ö s o k e i n + s ä h k ö s o k k e j a + s ä h k ö s o k k i + s ä h k ö s o k k i a + s ä h k ö s o k k i a s e i d e n + s ä h k ö s o k k i a s e i t a + s ä h k ö s t ä + s ä h k ö s u o d a t i n + s ä h k ö s y ö p p ö + s ä h k ö t + s ä h k ö t a i n n u t u s t a + s ä h k ö t a r v i k k e i d e n + s ä h k ö t a r v i k k e i t a + s ä h k ö t e h o k k u u d e n + s ä h k ö t e i p p i + s ä h k ö t e k n i i k a n + s ä h k ö t e k n i i k k a + s ä h k ö t e k n i i k k a a + s ä h k ö t e k n o l o g i a n + s ä h k ö t e k n o l o g i o i s t a + s ä h k ö t e o l l i s u u s + s ä h k ö t o i m i t u k s i a + s ä h k ö t o i m i t u s v e r k k o o n + s ä h k ö t o l p p i a + s ä h k ö t u o l i + s ä h k ö t u o l i i n + s ä h k ö t u o l i s s a + s ä h k ö t u o t a n n o s s a + s ä h k ö t u p a k k a + s ä h k ö t u r b i i n i e n + s ä h k ö t y ö k a l u i s s a + s ä h k ö t y ö k a l u t + s ä h k ö t ö i d e n + s ä h k ö u r u t + s ä h k ö v a j e e s t a + s ä h k ö v a l o + s ä h k ö v a l o s t a + s ä h k ö v a r a u s + s ä h k ö v e r k k o + s ä h k ö v e r k k o a + s ä h k ö v e r k k o h a n k e t t a + s ä h k ö v e r k k o i h i n + s ä h k ö v e r k k o j a + s ä h k ö v e r k k o j e n + s ä h k ö v e r k k o m m e + s ä h k ö v e r k k o n s a + s ä h k ö v e r k k o o n + s ä h k ö v e r k k o y h t e y s + s ä h k ö v e r k k o y h t e y t e e n + s ä h k ö v e r k o i s t a + s ä h k ö v e r k o n + s ä h k ö v e r k o s s a + s ä h k ö v e r k o s t o + s ä h k ö v e r k o s t o j e n + s ä h k ö v e r k o s t o n + s ä h k ö v e r k o t + s ä h k ö v e r o + s ä h k ö v e t u r i + s ä h k ö v i r r a k s i + s ä h k ö v i r t a + s ä h k ö v i r t a a + s ä h k ö v i u l u + s ä h k ö v o i m a + s ä h k ö v o i m a a + s ä h k ö v o i m a l a i t o k s i s s a + s ä h k ö v o i m a l a n + s ä h k ö v o i m a l a t + s ä h k ö v o i m a l o i d e n + s ä h k ö v o i m a l o i s s a + s ä h k ö v o i m a l o i s t a + s ä h k ö v o i m a l o i t a + s ä h k ö v o i m a n + s ä h k ö v o i m a s t a + s ä h k ö v o i m a t e k n i i k k a + s ä h k ö v u o + s ä h k ö v u o n + s ä h k ö y h t e y d e t + s ä h k ö y h t e y k s i e n + s ä h k ö y h t e y k s i i n + s ä h k ö y h t i ö + s ä h k ö y h t i ö i d e n + s ä h k ö y h t i ö i l l e + s ä h k ö y h t i ö i l l ä + s ä h k ö y h t i ö i t ä + s ä h k ö y h t i ö l l e + s ä h k ö y h t i ö n + s ä h k ö y h t i ö t + s ä h k ö y l i h e r k k y y s + s ä h k ö y r i t y k s e t + s ä h k ö y r i t y s t e n + s ä h k ö ä + s ä h k ö š o k k i e n + s ä i d e n + s ä i e k e n t t ä t e o r i a + s ä i e t e o r i a + s ä i h k y j ä t + s ä i h k y l u r i + s ä i h k y p y r s t ö k o l i b r i + s ä i h k y u u n i l i n t u + s ä i k k y ä + s ä i k y t t ä m ä s t ä + s ä i k ä h d y t t ä n y t + s ä i k ä h t ä ä + s ä i l i ö a l u k s e n + s ä i l i ö a l u k s e t + s ä i l i ö a l u k s i a + s ä i l i ö a l u k s i l l a + s ä i l i ö a l u k s i l l e + s ä i l i ö a l u k s i s s a + s ä i l i ö a l u k s i s t a + s ä i l i ö a l u s + s ä i l i ö a l u s o n n e t t o m u u d e n + s ä i l i ö a l u s o n n e t t o m u u k s i a + s ä i l i ö a l u s o n n e t t o m u u k s i s t a + s ä i l i ö a l u s t a + s ä i l i ö a l u s t e n + s ä i l i ö a u t o + s ä i l i ö a u t o i s t a + s ä i l i ö i h i n + s ä i l i ö i s s ä + s ä i l i ö i t ä + s ä i l i ö i t ä ä n + s ä i l i ö l a i v a t + s ä i l i ö l a i v o i s t a + s ä i l i ö m u o t o + s ä i l i ö r e h u m a i s s i a + s ä i l i ö t ä + s ä i l i ö y k s i k k ö + s ä i l l e + s ä i l y i s i + s ä i l y k e a l a + s ä i l y k e a l a a + s ä i l y k e p a p u j a + s ä i l y k e p e r u n o i d e n + s ä i l y k e t e h t a a t + s ä i l y k e t e o l l i s u u d e l l e + s ä i l y k e t e o l l i s u u d e l l e m m e + s ä i l y k e t e o l l i s u u d e n + s ä i l y k e t e o l l i s u u d e s t a + s ä i l y k e t e o l l i s u u d e s t a m m e + s ä i l y k e t e o l l i s u u s + s ä i l y k e t e o l l i s u u t e e n + s ä i l y k e t e o l l i s u u t e m m e + s ä i l y k e t e o l l i s u u t t a + s ä i l y k e t o m a a t t e j a + s ä i l y k k e e t + s ä i l y k k e i n ä + s ä i l y m i s e e n + s ä i l y m i s e n + s ä i l y m i s l a k i + s ä i l y m i s t ä + s ä i l y m ä ä n + s ä i l y n e e t + s ä i l y n e i t ä + s ä i l y t e t t y ä + s ä i l y t e t t ä e s s ä + s ä i l y t e t ä ä n + s ä i l y t e t ä ä n k ö + s ä i l y t i m m e + s ä i l y t t i + s ä i l y t t ä e n + s ä i l y t t ä i s i + s ä i l y t t ä i s i t t e + s ä i l y t t ä j ä p a n k k i e n + s ä i l y t t ä k ä ä + s ä i l y t t ä k ä ä m m e + s ä i l y t t ä k ö ö n + s ä i l y t t ä m i s a i k o j e n + s ä i l y t t ä m i s a l u e e t + s ä i l y t t ä m i s e e n + s ä i l y t t ä m i s e k s i + s ä i l y t t ä m i s e n + s ä i l y t t ä m i s e s t ä + s ä i l y t t ä m i s l a i t + s ä i l y t t ä m i s p o l i t i i k a l l e + s ä i l y t t ä m i s p o l i t i i k a n + s ä i l y t t ä m i s p o l i t i i k k a a + s ä i l y t t ä m i s s ä ä n t ö j ä + s ä i l y t t ä m i s t a v o i t t e e s s a a n + s ä i l y t t ä m i s t a v o i t t e i s i i n + s ä i l y t t ä m i s t a v o i t t e i t a + s ä i l y t t ä m i s t o i m e n a + s ä i l y t t ä m i s t o i m e n p i d e + s ä i l y t t ä m i s t o i m e n p i t e e t + s ä i l y t t ä m i s t o i m e n p i t e i d e n + s ä i l y t t ä m i s t o i m e n p i t e i l l ä + s ä i l y t t ä m i s t o i m e n p i t e i s i i n + s ä i l y t t ä m i s t o i m e n p i t e i s t ä + s ä i l y t t ä m i s t o i m e n p i t e i t ä + s ä i l y t t ä m i s t o i m e t + s ä i l y t t ä m i s t o i m i a + s ä i l y t t ä m i s t o i m i e n + s ä i l y t t ä m i s t o i m i s t a + s ä i l y t t ä m i s t ä + s ä i l y t t ä m ä l l ä + s ä i l y t t ä m ä ä n + s ä i l y t t ä n e e t + s ä i l y t t ä n y t + s ä i l y t t ä v ä t + s ä i l y t t ä ä + s ä i l y t t ä ä k s e e n + s ä i l y t t ä ä k s e m m e + s ä i l y t t ä ä k s e n i + s ä i l y t t ä ä k s e n n e + s ä i l y t y s a i k a + s ä i l y t y s a i k a a + s ä i l y t y s a i k o j e n + s ä i l y t y s a j a s t a + s ä i l y t y s a j a t + s ä i l y t y s a j o i l l e + s ä i l y t y s j ä r j e s t e l m ä ä + s ä i l y t y s k e s k u k s i a + s ä i l y t y s k y s y m y k s i ä + s ä i l y t y s o l o s u h t e i s t a + s ä i l y t y s p a i k a t + s ä i l y t y s p a i k o i s s a + s ä i l y t y s t o i m e n p i t e e t + s ä i l y t y s t o i m e n p i t e i s t ä + s ä i l y t y s t o i m e n p i t e i t ä + s ä i l y t y s t o i m e t + s ä i l y t y s t o i m i e n + s ä i l y t ä m m e + s ä i l y t ä n + s ä i l y t ä t t e k ö + s ä i l y v ä n + s ä i l y v ä t + s ä i l y v ä t k i n + s ä i l y y + s ä i l y ä + s ä i l y ä k i n + s ä i l ö i h i n + s ä i l ö m u i s t i + s ä i l ö n t ä a i n e e n a + s ä i l ö n t ä a i n e e t + s ä i l ö n t ä a i n e i d e n + s ä i l ö n t ä a i n e i s t a + s ä i l ö n t ä m e n e t e l m i e n + s ä i l ö n t ä t a p a + s ä i l ö n t ä t a p o i h i n + s ä i l ö n t ä t e k n o l o g i o i t a + s ä i l ö r e h u m a i s s i n + s ä i l ö s s ä + s ä i l ö t y t + s ä i l ö ö n o t e t t u j a + s ä i l ö ö n o t t o a + s ä i l ö ö n o t t o a i k o j e n + s ä i l ö ö n o t t o a j o i l l e + s ä i l ö ö n o t t o a l u e e t + s ä i l ö ö n o t t o k e s k u k s e s s a + s ä i l ö ö n o t t o k e s k u k s e s t a + s ä i l ö ö n o t t o k e s k u k s e t + s ä i l ö ö n o t t o k e s k u k s i a + s ä i l ö ö n o t t o k e s k u k s i i n + s ä i l ö ö n o t t o k e s k u k s i s s a + s ä i l ö ö n o t t o k e s k u k s i s t a + s ä i l ö ö n o t t o k e s k u s t a + s ä i l ö ö n o t t o k e s k u s t e m m e + s ä i l ö ö n o t t o k e s k u s t e n + s ä i l ö ö n o t t o k u s t a n n u k s e t + s ä i l ö ö n o t t o k ä y t ä n t ö + s ä i l ö ö n o t t o l e i r e i s s ä + s ä i l ö ö n o t t o l e i r i t + s ä i l ö ö n o t t o p a i k k o j a + s ä i l ö ö n o t t o t o i m i a + s ä i l ö ö n o t t o v y ö h y k k e i d e n + s ä k k i t u o l i + s ä l e i k k ö v i l l i v i i n i + s ä l e k a i h d i n + s ä l e p y r s t ö k o l i b r i + s ä l e t e k n i i k k a + s ä l y t t ä v ä t + s ä l y t t ä ä + s ä m p y l ä s t ä + s ä n k i k i r v i n e n + s ä n k y i h i n s ä + s ä n k y v e r k k o j a + s ä r k y n e e t + s ä r k y v ä m p i + s ä r m ä k u i s m a + s ä r m ä n e u l a + s ä r m ä p u r j e h a i + s ä r ö j ä + s ä r ö n + s ä r ö ä + s ä t e e n s e u r a n t a + s ä t e i l e v ä ä + s ä t e i l y a l t i s t u k s e n + s ä t e i l y a l t i s t u s + s ä t e i l y a l t i s t u s t a + s ä t e i l y a n n o k s i a + s ä t e i l y a n n o k s i l l a + s ä t e i l y a n n o k s i l l e + s ä t e i l y h a i t a t + s ä t e i l y h ä t ä t i l a n + s ä t e i l y h ä t ä t i l a n t e e n + s ä t e i l y l l e + s ä t e i l y l t ä + s ä t e i l y l ä h t e i s i i n + s ä t e i l y m i t t a u k s i s s a + s ä t e i l y m ä ä r i l l e + s ä t e i l y n + s ä t e i l y n k ä y t ö l l e + s ä t e i l y n o r m i e n + s ä t e i l y n p a i n e + s ä t e i l y o n n e t t o m u u d e n + s ä t e i l y o n n e t t o m u u k s i e n + s ä t e i l y p a k o t e + s ä t e i l y r a j a t + s ä t e i l y r i s k i m a l l i a + s ä t e i l y s a a s t e e n + s ä t e i l y s a a s t e e t + s ä t e i l y s a i r a u s + s ä t e i l y s t ä + s ä t e i l y s u o j a a + s ä t e i l y s u o j a l a u t a k u n t i a + s ä t e i l y s u o j a s t a + s ä t e i l y s u o j a t o i m i k u n t a + s ä t e i l y s u o j a t u t k i m u k s e n + s ä t e i l y s u o j a u k s e n + s ä t e i l y s u o j e l u + s ä t e i l y s u o j e l u a + s ä t e i l y s u o j e l u a s e t u s t a + s ä t e i l y s u o j e l u k o m i s s i o + s ä t e i l y s u o j e l u l a i n s ä ä d ä n n ö n + s ä t e i l y s u o j e l u n + s ä t e i l y s u o j e l u r a p o r t t i a a n + s ä t e i l y s u o j e l u s t a + s ä t e i l y s u o j e l u t o i m i k u n n a n + s ä t e i l y s u o j e l u t y ö r y h m ä + s ä t e i l y s u o j e l u u n + s ä t e i l y t a s a p a i n o + s ä t e i l y t a s o + s ä t e i l y t a s o a + s ä t e i l y t a s o i l l e + s ä t e i l y t a s o i s s a + s ä t e i l y t a s o j a + s ä t e i l y t i l a + s ä t e i l y t i l a n + s ä t e i l y t i l o j e n + s ä t e i l y t u r v a a n + s ä t e i l y t u r v a k e s k u k s e n + s ä t e i l y t u r v a k e s k u s + s ä t e i l y t u r v a l a i t o k s e n + s ä t e i l y t u r v a l l i s u u d e n + s ä t e i l y t u r v a l l i s u u s + s ä t e i l y t u r v a t a r k a s t a j i e n + s ä t e i l y t u r v a v e l v o i t t e i s t a + s ä t e i l y t y s t e o l l i s u u d e n + s ä t e i l y v a a r a a + s ä t e i l y v a a r a t i l a n t e i s s a + s ä t e i l y v a a r o j a + s ä t e i l y v a i k u t u k s i a + s ä t e i l y v a i k u t u k s i s t a + s ä t e i l y v a m m o j a + s ä t e i s n o p e u s m e n e t e l m ä + s ä t k y n u k k e p u o l u e i t a + s ä t k y u k k o j a + s ä t k ä t u p a k a n + s ä t k ä t u p a k k a t e o l l i s u u s + s ä v e l a s k e l + s ä v e l e n + s ä v e l k i m p p u + s ä v e l k o r k e u s p a i n o t u s + s ä v e l l a j i + s ä v e l l y s k i l p a i l u + s ä v e l m ä ä + s ä v e l t a p a i l u + s ä v e l t u o k i o + s ä v e l t ä + s ä v e l t ä j i s t ä + s ä v y e r o i s t a + s ä v y e r o t + s ä v y k k ä ä m m ä n + s ä v y l t ä ä n + s ä v y n + s ä v y n s ä + s ä v y s t ä + s ä v y t t ä m i e n + s ä v y y n + s ä y s e ä ä n + s ä ä a s e m a + s ä ä a s e m a t + s ä ä a s e m a t i e t o j e n + s ä ä a s e m i l l a + s ä ä a s e m i s t a + s ä ä d e l l e s s ä + s ä ä d e l l ä + s ä ä d e l l ä ä n + s ä ä d e t t y j e n + s ä ä d e t t y j ä + s ä ä d e t t y ä + s ä ä d e t t ä e s s ä + s ä ä d e t t ä v ä k s i + s ä ä d e t y k s i + s ä ä d e t ä + s ä ä d e t ä k ä ä n + s ä ä d e t ä ä n + s ä ä d y l l i s e n + s ä ä d y l l i s i ä + s ä ä d y t t ö m ä m p ä ä + s ä ä d ä m m e + s ä ä d ä n t ö t o i m i a + s ä ä d ö k s e e n + s ä ä d ö k s e k s i + s ä ä d ö k s e l l e + s ä ä d ö k s e l l ä + s ä ä d ö k s e n + s ä ä d ö k s e n ä ä n + s ä ä d ö k s e s s ä + s ä ä d ö k s e s t ä + s ä ä d ö k s e t + s ä ä d ö k s i e n + s ä ä d ö k s i i n + s ä ä d ö k s i k s i + s ä ä d ö k s i l l e + s ä ä d ö k s i l l ä + s ä ä d ö k s i n + s ä ä d ö k s i n ä + s ä ä d ö k s i s s ä + s ä ä d ö k s i s s ä m m e + s ä ä d ö k s i s t ä + s ä ä d ö k s i ä + s ä ä d ö s a l o i t e + s ä ä d ö s a l o i t e t t a + s ä ä d ö s a l o i t t e e s e e n + s ä ä d ö s a r s e n a a l i n + s ä ä d ö s e h d o t u k s e e n + s ä ä d ö s e h d o t u k s e k s i + s ä ä d ö s e h d o t u k s e l l a + s ä ä d ö s e h d o t u k s e l l e + s ä ä d ö s e h d o t u k s e n + s ä ä d ö s e h d o t u k s e n s a + s ä ä d ö s e h d o t u k s e s s a + s ä ä d ö s e h d o t u k s e s s a a n + s ä ä d ö s e h d o t u k s e s t a + s ä ä d ö s e h d o t u k s e t + s ä ä d ö s e h d o t u k s i a + s ä ä d ö s e h d o t u k s i e n + s ä ä d ö s e h d o t u k s i i n n e + s ä ä d ö s e h d o t u k s i l l a + s ä ä d ö s e h d o t u k s i n + s ä ä d ö s e h d o t u k s i s s a + s ä ä d ö s e h d o t u k s i s t a + s ä ä d ö s e h d o t u s + s ä ä d ö s e h d o t u s t a + s ä ä d ö s e h d o t u s t e n + s ä ä d ö s e s i t y k s i ä + s ä ä d ö s h a n k k e i t a + s ä ä d ö s h i e r a r k i a + s ä ä d ö s h i e r a r k i a a + s ä ä d ö s h i e r a r k i a s t a + s ä ä d ö s h i r v i ö + s ä ä d ö s j ä r j e s t e l m ä ä + s ä ä d ö s j ä r j e s t e l m ä ä m m e + s ä ä d ö s k e h y k s e e n + s ä ä d ö s k e h y k s e l l ä + s ä ä d ö s k e h y k s e n + s ä ä d ö s k e h y k s e s s ä + s ä ä d ö s k e h y s + s ä ä d ö s k e h y s t e n + s ä ä d ö s k e h y s t ä + s ä ä d ö s k o k o e l m a a + s ä ä d ö s k o k o e l m a a n + s ä ä d ö s k o k o e l m a n + s ä ä d ö s k o k o e l m a s s a + s ä ä d ö s k o k o e l m i i n + s ä ä d ö s k ä y t ä n n ö n + s ä ä d ö s k ä y t ä n t ö ä + s ä ä d ö s k ä y t ä n t ö ä m m e + s ä ä d ö s l u e t t e l o + s ä ä d ö s l u o n n o k s e e n + s ä ä d ö s l u o n n o k s e n + s ä ä d ö s l u o n n o k s i a + s ä ä d ö s l u o n n o k s i l l e + s ä ä d ö s l u o n n o s + s ä ä d ö s l u o n n o s t a + s ä ä d ö s l u o n t e i n e n + s ä ä d ö s m u o d o n + s ä ä d ö s m u o t o i h i n + s ä ä d ö s m u u t o k s i a + s ä ä d ö s m u u t o s t a + s ä ä d ö s o i k e u s + s ä ä d ö s o s a s s a + s ä ä d ö s p a k e t i l l a + s ä ä d ö s p a k e t i n + s ä ä d ö s p a k e t t e j a + s ä ä d ö s p a k e t t i + s ä ä d ö s p a k e t t i a + s ä ä d ö s p e r u s t a + s ä ä d ö s p o h j a n + s ä ä d ö s p u i t t e e t + s ä ä d ö s p u i t t e i t a + s ä ä d ö s r a t k a i s u + s ä ä d ö s t a r k o i t u k s i i n + s ä ä d ö s t a s o + s ä ä d ö s t e k s t e i h i n + s ä ä d ö s t e k s t e i k s i + s ä ä d ö s t e k s t e i s s ä + s ä ä d ö s t e k s t e i s t ä + s ä ä d ö s t e k s t e j ä + s ä ä d ö s t e k s t i + s ä ä d ö s t e k s t i e n + s ä ä d ö s t e k s t i i n + s ä ä d ö s t e k s t i l l ä + s ä ä d ö s t e k s t i n + s ä ä d ö s t e k s t i s s ä + s ä ä d ö s t e k s t i s t ä + s ä ä d ö s t e k s t i t + s ä ä d ö s t e n + s ä ä d ö s t o i m e n p i t e i t ä + s ä ä d ö s t u l v a a + s ä ä d ö s t y y p p i ä + s ä ä d ö s t ä + s ä ä d ö s v a l l a n + s ä ä d ö s v a l t a + s ä ä d ö s v i i t t a u k s e n + s ä ä d ö s v ä l i n e i s t ä + s ä ä d ö s v ä l i n e t t ä + s ä ä d ö s y m p ä r i s t ö n + s ä ä d ö s y m p ä r i s t ö ö n + s ä ä e n n u s t e + s ä ä e n n u s t e e t + s ä ä e n n u s t e i d e n + s ä ä e n n u s t e i s t a + s ä ä e n n u s t e i t a + s ä ä e n n u s t e k e s k u s + s ä ä e n n u s t e o h j a u s + s ä ä e n n ä t y k s i s t ä + s ä ä h a v a i n t o + s ä ä h ä n + s ä ä i l m i ö + s ä ä i l m i ö i d e n + s ä ä i l m i ö i s t ä + s ä ä i l m i ö i t ä + s ä ä i l m i ö t + s ä ä k a r t a l l e + s ä ä k a r t t a + s ä ä k a t a s t r o f e i s t a + s ä ä k a t a s t r o f i e n + s ä ä l i k s i + s ä ä l i m ä t t ö m i m m ä n + s ä ä l i m ä t t ö m ä m p i + s ä ä l i m ä t ö n t ä + s ä ä l i t t ä v i ä + s ä ä m i e s + s ä ä m i s k ä e r a k k o k o l i b r i + s ä ä m i s k ä k u r k k u k i p u a j a + s ä ä m i s k ä p i i k k i p y r s t ö + s ä ä n + s ä ä n e n n u s t a m i n e n + s ä ä n h a v a i n n o i n t i j ä r j e s t e l m ä + s ä ä n m u u t o k s e n + s ä ä n n e l k ä ä m m e + s ä ä n n e l l y i l l e + s ä ä n n e l l y i l l ä + s ä ä n n e l l y i s t ä + s ä ä n n e l l y m p i i n + s ä ä n n e l l y s s ä + s ä ä n n e l l ä + s ä ä n n e l l ä k s e m m e + s ä ä n n e l l ä ä n + s ä ä n n e l t y j e n + s ä ä n n e l t y j ä + s ä ä n n e l t y n ä k i n + s ä ä n n e l t y ä + s ä ä n n ö i k s i + s ä ä n n ö i l l e + s ä ä n n ö i l l ä + s ä ä n n ö i s s ä + s ä ä n n ö i s s ä m m e + s ä ä n n ö i s t ä + s ä ä n n ö i s t ä ä n + s ä ä n n ö k s e e n + s ä ä n n ö k s e l l ä + s ä ä n n ö k s e n + s ä ä n n ö k s e n s ä + s ä ä n n ö k s e s s ä + s ä ä n n ö k s e s t ä + s ä ä n n ö k s e t + s ä ä n n ö k s i + s ä ä n n ö k s i e n + s ä ä n n ö k s i i n + s ä ä n n ö k s i l l e + s ä ä n n ö k s i l l ä + s ä ä n n ö k s i n + s ä ä n n ö k s i s s ä + s ä ä n n ö k s i s s ä m m e + s ä ä n n ö k s i s t ä + s ä ä n n ö k s i ä + s ä ä n n ö k s i ä ä n + s ä ä n n ö l l i s e e n + s ä ä n n ö l l i s e m m i n + s ä ä n n ö l l i s e m m i s t ä + s ä ä n n ö l l i s e m m ä n + s ä ä n n ö l l i s e m p i + s ä ä n n ö l l i s e m p ä ä + s ä ä n n ö l l i s e n + s ä ä n n ö l l i s e n ä + s ä ä n n ö l l i s e s t ä + s ä ä n n ö l l i s e t + s ä ä n n ö l l i s i i n + s ä ä n n ö l l i s i n + s ä ä n n ö l l i s i ä + s ä ä n n ö n + s ä ä n n ö n m u k a i s e m m i n + s ä ä n n ö n m u k a i s e n a + s ä ä n n ö n m u k a i s e s t i + s ä ä n n ö n m u k a i s i s t a + s ä ä n n ö n m u u t o k s e s s a + s ä ä n n ö n m u u t o k s e t + s ä ä n n ö n v a s t a i s e n + s ä ä n n ö n v a s t a i s u u d e k s i + s ä ä n n ö n v a s t a i s u u d e t + s ä ä n n ö n v a s t a i s u u k s i a + s ä ä n n ö n v a s t a i s u u k s i e n + s ä ä n n ö n v a s t a i s u u k s i i n + s ä ä n n ö n v a s t a i s u u k s i s t a + s ä ä n n ö s e h d o t u k s e t + s ä ä n n ö s e h d o t u k s i a + s ä ä n n ö s e h d o t u k s i s s a + s ä ä n n ö s e s t e + s ä ä n n ö s k e h y k s e n + s ä ä n n ö s k e h y s + s ä ä n n ö s k e h y s t ä + s ä ä n n ö s k o k o e l m a a + s ä ä n n ö s k o k o n a i s u u d e n + s ä ä n n ö s k o k o n a i s u u s + s ä ä n n ö s p a k e t t i a + s ä ä n n ö s p e r u s t a + s ä ä n n ö s r a k e n t e e s e e n + s ä ä n n ö s t a s o t + s ä ä n n ö s t e l e m i s e k s i + s ä ä n n ö s t e l y e h d o t u k s e n + s ä ä n n ö s t e l y j ä r j e s t e l m ä ä n + s ä ä n n ö s t e l y m e n e t e l m ä n ä + s ä ä n n ö s t e l y m e n e t t e l y i n ä + s ä ä n n ö s t e l y o h j e l m a a + s ä ä n n ö s t e l y p o l i t i i k k a + s ä ä n n ö s t e l y p o l i t i i k k a a + s ä ä n n ö s t e l y s o p i m u s + s ä ä n n ö s t e n + s ä ä n n ö s t ä + s ä ä n n ö s t ö e h d o t u s + s ä ä n n ö s t ö i l l ä + s ä ä n n ö s t ö j ä + s ä ä n n ö s t ö k o k o n a i s u u d e k s i + s ä ä n n ö s t ö k s i + s ä ä n n ö s t ö l l e + s ä ä n n ö s t ö l l ä + s ä ä n n ö s t ö l u o n n o k s e e n + s ä ä n n ö s t ö m m e + s ä ä n n ö s t ö n + s ä ä n n ö s t ö n k i n + s ä ä n n ö s t ö s s ä + s ä ä n n ö s t ö s t ä + s ä ä n n ö s t ö t + s ä ä n n ö s t ö ä + s ä ä n n ö s t ö ö n + s ä ä n n ö s v i i d a k k o + s ä ä n n ö t + s ä ä n t e l e m i s e k s i + s ä ä n t e l e m i s e s s ä + s ä ä n t e l e m i s t ä + s ä ä n t e l e m m e + s ä ä n t e l e m ä l l ä + s ä ä n t e l e m ä s s ä + s ä ä n t e l e m ä t t ä + s ä ä n t e l e m ä t t ö m i l l e + s ä ä n t e l e m ä t t ö m y y s + s ä ä n t e l e m ä t t ö m ä n + s ä ä n t e l e m ä t t ö m ä s s ä + s ä ä n t e l e m ä t ö n + s ä ä n t e l e m ä t ö n t ä + s ä ä n t e l e m ä ä n + s ä ä n t e l e v i e n + s ä ä n t e l e v i ä + s ä ä n t e l e v ä + s ä ä n t e l e v ä m m ä t + s ä ä n t e l e v ä t + s ä ä n t e l e v ä t k ö + s ä ä n t e l e v ä ä + s ä ä n t e l i j ö i l l ä + s ä ä n t e l y a l a + s ä ä n t e l y a l a a n + s ä ä n t e l y a l o i t e + s ä ä n t e l y a l o i t e t t a + s ä ä n t e l y a l o i t t e e t + s ä ä n t e l y a l o i t t e i d e n + s ä ä n t e l y a l o i t t e i s t a + s ä ä n t e l y a l o i t t e i t a + s ä ä n t e l y a l o j e n + s ä ä n t e l y a l u e + s ä ä n t e l y a l u e e l l a + s ä ä n t e l y a l u e e n + s ä ä n t e l y a s e m a + s ä ä n t e l y a s i a k i r j o i s t a + s ä ä n t e l y a s i a k i r j o j a + s ä ä n t e l y a s i a t + s ä ä n t e l y a s i o i s s a + s ä ä n t e l y a s i o i s t a + s ä ä n t e l y a s i o i t a + s ä ä n t e l y a u k o n + s ä ä n t e l y e d e l l y t y k s i ä + s ä ä n t e l y e h d o t u k s e s t a + s ä ä n t e l y e h d o t u s + s ä ä n t e l y e h d o t u s t a + s ä ä n t e l y e h t o j a + s ä ä n t e l y e h t o j e n + s ä ä n t e l y e l i m e e n + s ä ä n t e l y e l i m e l l e + s ä ä n t e l y e l i m e n + s ä ä n t e l y e l i m e s s ä + s ä ä n t e l y e l i m e s t ä + s ä ä n t e l y e l i m e t + s ä ä n t e l y e l i m i e n + s ä ä n t e l y e l i m i i n + s ä ä n t e l y e l i m i l l e + s ä ä n t e l y e l i m i l l ä + s ä ä n t e l y e l i m i n ä + s ä ä n t e l y e l i m i s s ä + s ä ä n t e l y e l i m i ä + s ä ä n t e l y e l i n + s ä ä n t e l y e l i n t e m m e + s ä ä n t e l y e l i n t e n + s ä ä n t e l y e r o j a + s ä ä n t e l y e r o t + s ä ä n t e l y e s t e e t + s ä ä n t e l y e s t e i d e n + s ä ä n t e l y e s t e i t ä + s ä ä n t e l y f o o r u m i l l a + s ä ä n t e l y f o o r u m i s s a + s ä ä n t e l y h a k u i s e n + s ä ä n t e l y h a l u k k u u t t a + s ä ä n t e l y h o u k u t u k s e n + s ä ä n t e l y h u l l u + s ä ä n t e l y h y s t e r i a n + s ä ä n t e l y h ä i r i ö + s ä ä n t e l y i d e n + s ä ä n t e l y i l m a p i i r i l l ä + s ä ä n t e l y i l m a p i i r i ä + s ä ä n t e l y i n t o + s ä ä n t e l y i t ä + s ä ä n t e l y j o h t o i n e n + s ä ä n t e l y j ä + s ä ä n t e l y j ä r j e s t e l m i e n + s ä ä n t e l y j ä r j e s t e l m i i n + s ä ä n t e l y j ä r j e s t e l m i ä + s ä ä n t e l y j ä r j e s t e l m ä + s ä ä n t e l y j ä r j e s t e l m ä k s i + s ä ä n t e l y j ä r j e s t e l m ä l l e m m e + s ä ä n t e l y j ä r j e s t e l m ä l l ä + s ä ä n t e l y j ä r j e s t e l m ä l l ä m m e + s ä ä n t e l y j ä r j e s t e l m ä m m e + s ä ä n t e l y j ä r j e s t e l m ä n + s ä ä n t e l y j ä r j e s t e l m ä n s ä + s ä ä n t e l y j ä r j e s t e l m ä s s ä + s ä ä n t e l y j ä r j e s t e l m ä s s ä m m e + s ä ä n t e l y j ä r j e s t e l m ä s t ä + s ä ä n t e l y j ä r j e s t e l m ä t + s ä ä n t e l y j ä r j e s t e l m ä t k i n + s ä ä n t e l y j ä r j e s t e l m ä ä + s ä ä n t e l y j ä r j e s t e l m ä ä n + s ä ä n t e l y j ä r j e s t e l y j e n + s ä ä n t e l y j ä r j e s t e l y j ä + s ä ä n t e l y j ä r j e s t e l y t + s ä ä n t e l y k e h y k s e e m m e + s ä ä n t e l y k e h y k s e e n + s ä ä n t e l y k e h y k s e k s i + s ä ä n t e l y k e h y k s e l l ä + s ä ä n t e l y k e h y k s e n + s ä ä n t e l y k e h y k s e n s ä + s ä ä n t e l y k e h y k s e n ä + s ä ä n t e l y k e h y k s e s s ä + s ä ä n t e l y k e h y k s e s t ä + s ä ä n t e l y k e h y k s e t + s ä ä n t e l y k e h y k s i i n + s ä ä n t e l y k e h y k s i s t ä + s ä ä n t e l y k e h y k s i ä + s ä ä n t e l y k e h y s + s ä ä n t e l y k e h y s d i r e k t i i v i n + s ä ä n t e l y k e h y s t e m m e + s ä ä n t e l y k e h y s t e n + s ä ä n t e l y k e h y s t ä + s ä ä n t e l y k e i n o + s ä ä n t e l y k e i n o i n + s ä ä n t e l y k e i n o i s t a + s ä ä n t e l y k e i n o j a + s ä ä n t e l y k e i n o t + s ä ä n t e l y k i i h k o + s ä ä n t e l y k i i n t i ö t + s ä ä n t e l y k i l p a i l u n + s ä ä n t e l y k o m i t e a + s ä ä n t e l y k o m i t e a a + s ä ä n t e l y k o m i t e a k s i + s ä ä n t e l y k o m i t e a l l a + s ä ä n t e l y k o m i t e a l l e + s ä ä n t e l y k o m i t e a m e n e t t e l y + s ä ä n t e l y k o m i t e a m e n e t t e l y l l ä + s ä ä n t e l y k o m i t e a m e n e t t e l y n + s ä ä n t e l y k o m i t e a m e n e t t e l y s s ä + s ä ä n t e l y k o m i t e a m e n e t t e l y s t ä + s ä ä n t e l y k o m i t e a m e n e t t e l y ä + s ä ä n t e l y k o m i t e a n + s ä ä n t e l y k o m i t e a n a + s ä ä n t e l y k o m i t e a s s a + s ä ä n t e l y k o m i t e o i d e n + s ä ä n t e l y k o m i t e o i s s a + s ä ä n t e l y k o m i t e o i s t a + s ä ä n t e l y k r i i s i + s ä ä n t e l y k r i i s i n + s ä ä n t e l y k r i t e e r e j ä + s ä ä n t e l y k u l t t u u r i + s ä ä n t e l y k u l t t u u r i n + s ä ä n t e l y k u s t a n n u k s i a + s ä ä n t e l y k u s t a n n u k s i s t a + s ä ä n t e l y k y s y m y k s e e n + s ä ä n t e l y k y s y m y k s e t + s ä ä n t e l y k y s y m y k s i i n + s ä ä n t e l y k y s y m y k s i s s ä + s ä ä n t e l y k y s y m y k s i ä + s ä ä n t e l y k y s y m y s + s ä ä n t e l y k y s y m y s t e n + s ä ä n t e l y k y v y n + s ä ä n t e l y k ä s i t y k s i ä + s ä ä n t e l y k ä y t ä n n ö i s t ä + s ä ä n t e l y k ä y t ä n n ö l l ä + s ä ä n t e l y k ä y t ä n t ö i h i n + s ä ä n t e l y k ä y t ä n t ö j ä + s ä ä n t e l y k ä y t ä n t ö ä + s ä ä n t e l y l a i t o k s e t + s ä ä n t e l y l a i t o k s i s t a + s ä ä n t e l y l l ä + s ä ä n t e l y l o m a + s ä ä n t e l y l o m a k e + s ä ä n t e l y l ä h e s t y m i s t a p a a + s ä ä n t e l y m a l l e i k s i + s ä ä n t e l y m a l l i + s ä ä n t e l y m a l l i a + s ä ä n t e l y m a l l i e n + s ä ä n t e l y m a l l i i m m e + s ä ä n t e l y m a l l i n + s ä ä n t e l y m e k a n i s m e i h i n + s ä ä n t e l y m e k a n i s m e j a + s ä ä n t e l y m e k a n i s m i + s ä ä n t e l y m e k a n i s m i e n + s ä ä n t e l y m e k a n i s m i i n + s ä ä n t e l y m e k a n i s m i l l a + s ä ä n t e l y m e k a n i s m i n + s ä ä n t e l y m e k a n i s m i n a + s ä ä n t e l y m e k a n i s m i t + s ä ä n t e l y m e n e t e l m i l l ä + s ä ä n t e l y m e n e t e l m i s t ä + s ä ä n t e l y m e n e t e l m i ä + s ä ä n t e l y m e n e t t e l y + s ä ä n t e l y m e n e t t e l y j e n + s ä ä n t e l y m e n e t t e l y j ä + s ä ä n t e l y m e n e t t e l y l l ä + s ä ä n t e l y m e n e t t e l y n + s ä ä n t e l y m e n e t t e l y s s ä + s ä ä n t e l y m e n e t t e l y t + s ä ä n t e l y m e n e t t e l y y n + s ä ä n t e l y m e n e t t e l y ä + s ä ä n t e l y m u o d o i s t a + s ä ä n t e l y m u o d o t + s ä ä n t e l y m u o t o j e n + s ä ä n t e l y m u u t o k s e t + s ä ä n t e l y m u u t o k s i a + s ä ä n t e l y m u u t o s t e n + s ä ä n t e l y n + s ä ä n t e l y n e u v o s t o n + s ä ä n t e l y n e u v o s t o s t a + s ä ä n t e l y n o r m e i s t a + s ä ä n t e l y n o r m e j a + s ä ä n t e l y n o r m i t + s ä ä n t e l y n p u r k a m i s i d e o l o g i a n + s ä ä n t e l y n p u r k a m i s p r o s e s s i t + s ä ä n t e l y n p u r k u p r o s e s s e j a + s ä ä n t e l y n ä k ö k o h d i s t a + s ä ä n t e l y n ä k ö k o h t i a + s ä ä n t e l y n ä k ö k o h t i e n + s ä ä n t e l y n ä k ö k o h t i i n + s ä ä n t e l y n ä k ö k u l m a n + s ä ä n t e l y o h j e i t a + s ä ä n t e l y o h j e l m a + s ä ä n t e l y o i k e u d e t + s ä ä n t e l y o i k e u t t a a n + s ä ä n t e l y o l o i s t a + s ä ä n t e l y o n g e l m a a + s ä ä n t e l y o n g e l m a t + s ä ä n t e l y o n g e l m i a + s ä ä n t e l y o n g e l m i s t a + s ä ä n t e l y p a k e t i l l a + s ä ä n t e l y p a k e t i n + s ä ä n t e l y p a k e t i s s a + s ä ä n t e l y p a k e t t i + s ä ä n t e l y p a k e t t i i n + s ä ä n t e l y p a k k o a + s ä ä n t e l y p a r a t i i s e i h i n + s ä ä n t e l y p e r i a a t t e e l l e + s ä ä n t e l y p e r i a a t t e i t a + s ä ä n t e l y p e r u s t a + s ä ä n t e l y p o l i i t t i s i a + s ä ä n t e l y p o l i t i i k a n + s ä ä n t e l y p o l i t i i k a s s a + s ä ä n t e l y p o l i t i i k k a + s ä ä n t e l y p o l i t i i k k a a + s ä ä n t e l y p o l i t i i k k a a n + s ä ä n t e l y p r o s e s s i + s ä ä n t e l y p r o s e s s i a + s ä ä n t e l y p r o s e s s i i n + s ä ä n t e l y p r o s e s s i n + s ä ä n t e l y p r o s e s s i s s a + s ä ä n t e l y p r o s e s s i s t a + s ä ä n t e l y p u i t t e e t + s ä ä n t e l y p u i t t e i d e n + s ä ä n t e l y p u i t t e i l l a + s ä ä n t e l y p u i t t e i l l e + s ä ä n t e l y p u i t t e i s s a + s ä ä n t e l y p u i t t e i s t a + s ä ä n t e l y p u i t t e i t a + s ä ä n t e l y p y r k i m y k s e t + s ä ä n t e l y p ä ä t ö s + s ä ä n t e l y p ä ä t ö s t e n + s ä ä n t e l y r a j o i t t e i t a + s ä ä n t e l y r a j o i t u k s i a + s ä ä n t e l y r a j o i t u s t e n + s ä ä n t e l y r a k e n n e + s ä ä n t e l y r a k e n n e t t a + s ä ä n t e l y r a k e n t e e l l e + s ä ä n t e l y r a k e n t e e s e e n + s ä ä n t e l y r a k e n t e e t + s ä ä n t e l y r a k e n t e i d e n + s ä ä n t e l y r a k e n t e i s s a + s ä ä n t e l y r a k e n t e i s t a + s ä ä n t e l y r a k e n t e i t a + s ä ä n t e l y r a t k a i s u + s ä ä n t e l y r a t k a i s u j a + s ä ä n t e l y r e f l e k s i t + s ä ä n t e l y r o o l i + s ä ä n t e l y s s ä + s ä ä n t e l y s t a n d a r d e i s t a + s ä ä n t e l y s t ä + s ä ä n t e l y s u o j a s s a + s ä ä n t e l y s y i s t ä + s ä ä n t e l y t a a k a n + s ä ä n t e l y t a a k a s t a + s ä ä n t e l y t a a k a t + s ä ä n t e l y t a a k k a + s ä ä n t e l y t a a k k a a + s ä ä n t e l y t a a k k a a n + s ä ä n t e l y t a a k k o i h i n + s ä ä n t e l y t a p a + s ä ä n t e l y t a r k o i t u k s e e n + s ä ä n t e l y t a r k o i t u k s i i n + s ä ä n t e l y t a r k o i t u k s i s s a + s ä ä n t e l y t a s o a + s ä ä n t e l y t a s o l l a + s ä ä n t e l y t a s o s t a + s ä ä n t e l y t a u k o o n + s ä ä n t e l y t a v o i t t e i s i i n + s ä ä n t e l y t e h t ä v i s t ä n i + s ä ä n t e l y t e h t ä v i ä + s ä ä n t e l y t e h t ä v ä + s ä ä n t e l y t e h t ä v ä k s i + s ä ä n t e l y t e h t ä v ä n + s ä ä n t e l y t e h t ä v ä ä + s ä ä n t e l y t e h t ä v ä ä n + s ä ä n t e l y t e k n i i k a t + s ä ä n t e l y t i l a n n e t t a + s ä ä n t e l y t i l a n t e e s t a + s ä ä n t e l y t o i m e n p i d e + s ä ä n t e l y t o i m e n p i d e t t ä + s ä ä n t e l y t o i m e n p i t e e t + s ä ä n t e l y t o i m e n p i t e i d e n + s ä ä n t e l y t o i m e n p i t e i s i i n + s ä ä n t e l y t o i m e n p i t e i s t ä + s ä ä n t e l y t o i m e n p i t e i t ä + s ä ä n t e l y t o i m e n p i t e i t ä ä n + s ä ä n t e l y t o i m e t + s ä ä n t e l y t o i m i + s ä ä n t e l y t o i m i a + s ä ä n t e l y t o i m i e n + s ä ä n t e l y t o i m i i n + s ä ä n t e l y t o i m i l l a + s ä ä n t e l y t o i m i n t a + s ä ä n t e l y t o i m i s t a + s ä ä n t e l y t o i m i v a l t a + s ä ä n t e l y t o i m i v a l t a a + s ä ä n t e l y t o i m i v a l t a m m e + s ä ä n t e l y t u l v a n + s ä ä n t e l y t y h j i ö + s ä ä n t e l y t y h j i ö n + s ä ä n t e l y t y ö h ö n + s ä ä n t e l y t y ö k a l u + s ä ä n t e l y t y ö l l ä + s ä ä n t e l y t y ö s t ä + s ä ä n t e l y t y ö t ä + s ä ä n t e l y u u d i s t u k s e n + s ä ä n t e l y u u d i s t u k s e s s a + s ä ä n t e l y u u d i s t u k s i a + s ä ä n t e l y u u d i s t u s + s ä ä n t e l y u u d i s t u s t e n + s ä ä n t e l y v a a t i m u k s e t + s ä ä n t e l y v a a t i m u k s i a + s ä ä n t e l y v a a t i m u k s i s s a + s ä ä n t e l y v a a t i m u k s i s t a + s ä ä n t e l y v a i h t o e h t o j a + s ä ä n t e l y v a i k u t u s + s ä ä n t e l y v a i k u t u s t e n + s ä ä n t e l y v a j e e n + s ä ä n t e l y v a j e i d e n + s ä ä n t e l y v a l l a l l e + s ä ä n t e l y v a l l a n + s ä ä n t e l y v a l l a s t a + s ä ä n t e l y v a l m i u k s i a + s ä ä n t e l y v a l m i u k s i e n + s ä ä n t e l y v a l t a a + s ä ä n t e l y v a l t u u d e t + s ä ä n t e l y v a l t u u k s i a + s ä ä n t e l y v a l t u u k s i a a n + s ä ä n t e l y v a l t u u k s i i n + s ä ä n t e l y v e l v o l l i s u u k s i i n + s ä ä n t e l y v i m m a + s ä ä n t e l y v i m m a n + s ä ä n t e l y v i r a n o m a i n e n + s ä ä n t e l y v i r a n o m a i s e e n + s ä ä n t e l y v i r a n o m a i s e l l a + s ä ä n t e l y v i r a n o m a i s e l l e + s ä ä n t e l y v i r a n o m a i s e n + s ä ä n t e l y v i r a n o m a i s e n s a + s ä ä n t e l y v i r a n o m a i s e t + s ä ä n t e l y v i r a n o m a i s i a + s ä ä n t e l y v i r a n o m a i s i i n + s ä ä n t e l y v i r a n o m a i s i l l a + s ä ä n t e l y v i r a n o m a i s i l l e + s ä ä n t e l y v i r a n o m a i s i l t a + s ä ä n t e l y v i r a n o m a i s i s t a + s ä ä n t e l y v i r a n o m a i s t a + s ä ä n t e l y v i r a n o m a i s t e n + s ä ä n t e l y v i r a n o m a i s t e n s a + s ä ä n t e l y v i r a s t o a + s ä ä n t e l y v i r a s t o i h i n + s ä ä n t e l y v i r a s t o i s s a + s ä ä n t e l y v i r a s t o i s t a + s ä ä n t e l y v i r a s t o j a + s ä ä n t e l y v i r a s t o j e n + s ä ä n t e l y v i r a s t o n + s ä ä n t e l y v i r a s t o s s a + s ä ä n t e l y v i r a s t o t + s ä ä n t e l y v ä l i n e + s ä ä n t e l y v ä l i n e e m m e + s ä ä n t e l y v ä l i n e e n ä + s ä ä n t e l y v ä l i n e e s t ä + s ä ä n t e l y v ä l i n e e t + s ä ä n t e l y v ä l i n e i d e n + s ä ä n t e l y v ä l i n e i l l ä + s ä ä n t e l y v ä l i n e i s t ä + s ä ä n t e l y v ä l i n e i t ä + s ä ä n t e l y y n + s ä ä n t e l y ä + s ä ä n t ö a l u e e l l a + s ä ä n t ö a l u e e n a + s ä ä n t ö e h d o t u k s e n + s ä ä n t ö e h d o t u k s e s t a + s ä ä n t ö e h d o t u k s i a + s ä ä n t ö e h d o t u s t a + s ä ä n t ö h i e r a r k i a + s ä ä n t ö i h i m m e + s ä ä n t ö i h i n + s ä ä n t ö i h i n s ä + s ä ä n t ö j e m m e + s ä ä n t ö j e n + s ä ä n t ö j e n l a a t i j o i s t a + s ä ä n t ö j e n m u k a i s i k s i + s ä ä n t ö j e n m u k a i s u u s + s ä ä n t ö j e n m u u t o s + s ä ä n t ö j e n v a s t a i s i a + s ä ä n t ö j e n v a s t a i s i n a + s ä ä n t ö j e n v a s t a i s i s t a + s ä ä n t ö j e n v a s t a i s u u d e s s a + s ä ä n t ö j e n v a s t a i s u u d e s t a + s ä ä n t ö j e n v a s t a i s u u d e t + s ä ä n t ö j e n v a s t a i s u u k s i a + s ä ä n t ö j e n v a s t a i s u u k s i e n + s ä ä n t ö j e n v a s t a i s u u k s i i n + s ä ä n t ö j e n v a s t a i s u u k s i l l e + s ä ä n t ö j e n v a s t a i s u u k s i s t a + s ä ä n t ö j e n v a s t a i s u u s + s ä ä n t ö j ä + s ä ä n t ö j ä r j e s t e l m i ä + s ä ä n t ö j ä r j e s t e l m ä + s ä ä n t ö j ä r j e s t e l m ä n + s ä ä n t ö j ä r j e s t e l m ä ä n s ä + s ä ä n t ö j ä ä n + s ä ä n t ö k e h y k s e n + s ä ä n t ö k e h y s + s ä ä n t ö k e h y s t ä + s ä ä n t ö k i i s t a a + s ä ä n t ö k i r j a + s ä ä n t ö k i r j a a n s a + s ä ä n t ö k i r j a n + s ä ä n t ö k i r j o j e n + s ä ä n t ö k o k o e l m a + s ä ä n t ö k o k o e l m a n + s ä ä n t ö k o k o n a i s u u k s i a + s ä ä n t ö k o k o n a i s u u s + s ä ä n t ö k o k o n a i s u u t t a + s ä ä n t ö l u o n n o k s e l l a + s ä ä n t ö l u o n n o k s e s s a + s ä ä n t ö l u o n n o s t a + s ä ä n t ö m u u t o k s e n + s ä ä n t ö m u u t o k s i a + s ä ä n t ö m u u t o s + s ä ä n t ö m u u t o s t e n + s ä ä n t ö n n e + s ä ä n t ö n s ä + s ä ä n t ö n ä + s ä ä n t ö p a k e t t i a + s ä ä n t ö p o h j a i n e n + s ä ä n t ö p u i t t e i s i i n + s ä ä n t ö p u i t t e i t a + s ä ä n t ö r i k k o m u k s e t + s ä ä n t ö r i k k o m u k s i s t a + s ä ä n t ö s o p i m u k s e e n + s ä ä n t ö v a l i o k u n n a n + s ä ä n t ö v e r k o s t o n + s ä ä n t ö v i i d a k k o a + s ä ä n t ö v ä l i n e e n ä + s ä ä n t ö ä + s ä ä n t ö ö n + s ä ä o l o i h i n + s ä ä o l o i l l e + s ä ä o l o i s s a + s ä ä o l o i s t a + s ä ä o l o j a + s ä ä o l o j e n + s ä ä o l o s u h t e e t + s ä ä o l o s u h t e i d e n + s ä ä o l o s u h t e i l l a + s ä ä o l o s u h t e i l t a + s ä ä o l o s u h t e i s i i n + s ä ä o l o s u h t e i s s a + s ä ä o l o s u h t e i s t a + s ä ä o l o s u h t e i t a + s ä ä o l o t + s ä ä p a l l o + s ä ä p a l l o j e n + s ä ä p a l v e l u t + s ä ä r i h a a v a + s ä ä r i n t a m a + s ä ä s a t e l l i i t t i + s ä ä s k e n v a l k k u + s ä ä s t e l e m ä t t ä + s ä ä s t e l i ä ä m m i n + s ä ä s t e l i ä ä m p i + s ä ä s t e l i ä ä m p i ä + s ä ä s t e l l y t + s ä ä s t e l l ä + s ä ä s t e t t ä i s i i n + s ä ä s t e t y t + s ä ä s t e t ä ä n + s ä ä s t y n e e t + s ä ä s t y n y t + s ä ä s t y v ä t + s ä ä s t ä j i e n + s ä ä s t ä j ä t + s ä ä s t ä k ä ä + s ä ä s t ä k ä ä m m e + s ä ä s t ä m i s a i k a a n + s ä ä s t ä m i s e e n + s ä ä s t ä m i s e k s i + s ä ä s t ä m i s e n + s ä ä s t ä m i s e s t ä + s ä ä s t ä m i s h e n g e s t ä + s ä ä s t ä m i s k e s k u s t e l u + s ä ä s t ä m i s m a h d o l l i s u u k s i a + s ä ä s t ä m i s t u o t t e i d e n + s ä ä s t ä m ä l l ä + s ä ä s t ä m ä t t ä + s ä ä s t ä m ä ä n + s ä ä s t ä n + s ä ä s t ä v i e n + s ä ä s t ä v i i n + s ä ä s t ä v i ä + s ä ä s t ä v ä i s e m m i n + s ä ä s t ä v ä i s e m p i + s ä ä s t ä v ä i s e m p i ä + s ä ä s t ä v ä i s e n + s ä ä s t ä v ä i s y y s p e r i a a t e t t a + s ä ä s t ä v ä i s y y s p o l i t i i k k a + s ä ä s t ä v ä i s y y s p ä i v ä + s ä ä s t ä v ä i s y y s v a a t i m u k s i a + s ä ä s t ä v ä l l e + s ä ä s t ä v ä m p i e n + s ä ä s t ä v ä m p i ä + s ä ä s t ä v ä m p ä ä + s ä ä s t ä v ä m p ä ä n + s ä ä s t ä v ä n + s ä ä s t ä v ä t + s ä ä s t ä v ä ä + s ä ä s t ä v ä ä n + s ä ä s t ä ä + s ä ä s t ä ä k s e e n + s ä ä s t ö a s t e + s ä ä s t ö a s t e t t a + s ä ä s t ö b u d j e t t e j a + s ä ä s t ö b u d j e t t i + s ä ä s t ö b u d j e t t i a + s ä ä s t ö b u d j e t t i e n + s ä ä s t ö e h d o t u k s i a + s ä ä s t ö e s i t y k s e t + s ä ä s t ö i h i n + s ä ä s t ö i l l ä + s ä ä s t ö i s t ä + s ä ä s t ö j e n + s ä ä s t ö j ä + s ä ä s t ö j ä r j e s t e l m i e n + s ä ä s t ö j ä r j e s t e l m i ä + s ä ä s t ö j ä r j e s t e l m ä t + s ä ä s t ö j ä ä n + s ä ä s t ö k a s s a + s ä ä s t ö k a s s a m i n i s t e r i e n + s ä ä s t ö k a s s a n a + s ä ä s t ö k a s s o i s t a + s ä ä s t ö k e i n o i h i n + s ä ä s t ö k e s k u s t e l u + s ä ä s t ö k o r k o d i r e k t i i v e i s t ä + s ä ä s t ö k o r k o d i r e k t i i v i + s ä ä s t ö k o r k o d i r e k t i i v i n + s ä ä s t ö k o r k o j ä r j e s t e l m ä n + s ä ä s t ö k u u r i n + s ä ä s t ö k ä y t t ä y t y m i n e n + s ä ä s t ö l a m p p u j a + s ä ä s t ö l i p a s + s ä ä s t ö l i p p a a n + s ä ä s t ö m a h d o l l i s u u d e t + s ä ä s t ö m a h d o l l i s u u k s i a + s ä ä s t ö m a h d o l l i s u u k s i e n + s ä ä s t ö m a r g i n a a l i + s ä ä s t ö m u o t o j e n + s ä ä s t ö n + s ä ä s t ö n s ä + s ä ä s t ö o h j e l m a + s ä ä s t ö o h j e l m a a + s ä ä s t ö o h j e l m a l l a + s ä ä s t ö o h j e l m a n + s ä ä s t ö o h j e l m a s t a + s ä ä s t ö o h j e l m a t + s ä ä s t ö o h j e l m i a + s ä ä s t ö o h j e l m i e n + s ä ä s t ö o h j e l m i i n + s ä ä s t ö o h j e l m i l l a + s ä ä s t ö o h j e l m i s s a + s ä ä s t ö o h j e l m i s t a + s ä ä s t ö o s a s t o i n a + s ä ä s t ö p a k e t e i l l a + s ä ä s t ö p a k e t i n + s ä ä s t ö p a k e t i s t a + s ä ä s t ö p a k e t i t + s ä ä s t ö p a k e t t e j a + s ä ä s t ö p a k e t t i + s ä ä s t ö p a k e t t i a + s ä ä s t ö p a n k e i l l e + s ä ä s t ö p a n k i s t a + s ä ä s t ö p a n k i t + s ä ä s t ö p a n k k e j a + s ä ä s t ö p a n k k i + s ä ä s t ö p a n k k i e n + s ä ä s t ö p a n k k i k r i i s i s s ä + s ä ä s t ö p o l i t i i k a l l a + s ä ä s t ö p o l i t i i k a n + s ä ä s t ö p o l i t i i k a s t a + s ä ä s t ö p o l i t i i k a t + s ä ä s t ö p o l i t i i k k a + s ä ä s t ö p o l i t i i k k a a + s ä ä s t ö p o l i t i i k k a a n + s ä ä s t ö p o r s a s t a + s ä ä s t ö p o s s u + s ä ä s t ö p o t e n t i a a l i + s ä ä s t ö p o t e n t i a a l i n + s ä ä s t ö p o t e n t i a a l i s t a + s ä ä s t ö p y r k i m y k s e t + s ä ä s t ö p ä i v i ä + s ä ä s t ö p ä ä t ö k s i ä + s ä ä s t ö r a h a s t o i h i n + s ä ä s t ö s o p i m u s t e n + s ä ä s t ö s u u n n i t e l m a + s ä ä s t ö s u u n n i t e l m a a + s ä ä s t ö s u u n n i t e l m a n + s ä ä s t ö s u u n n i t e l m a n s a + s ä ä s t ö s u u n n i t e l m a s s a + s ä ä s t ö s u u n n i t e l m a s t a + s ä ä s t ö s u u n n i t e l m a t + s ä ä s t ö s u u n n i t e l m i a + s ä ä s t ö s u u n n i t e l m i e n + s ä ä s t ö s u u n n i t e l m i i n + s ä ä s t ö s u u n n i t e l m i k s i + s ä ä s t ö s u u n n i t e l m i l l a + s ä ä s t ö s u u n n i t e l m i s t a + s ä ä s t ö s y i s t ä + s ä ä s t ö s ä ä n n ö t + s ä ä s t ö t + s ä ä s t ö t a l o u s a r v i o + s ä ä s t ö t a l o u s a r v i o k s i + s ä ä s t ö t a s o j a + s ä ä s t ö t a v o i t e + s ä ä s t ö t a v o i t e t a s o + s ä ä s t ö t a v o i t t e e s t a + s ä ä s t ö t a v o i t t e e t + s ä ä s t ö t a v o i t t e i t a + s ä ä s t ö t i l e i l l e + s ä ä s t ö t i l i + s ä ä s t ö t i l i e n + s ä ä s t ö t i l i n + s ä ä s t ö t o i m e n p i d e + s ä ä s t ö t o i m e n p i t e e t + s ä ä s t ö t o i m e n p i t e i d e n + s ä ä s t ö t o i m e n p i t e i l l ä + s ä ä s t ö t o i m e n p i t e i s i i n + s ä ä s t ö t o i m e n p i t e i s t ä + s ä ä s t ö t o i m e n p i t e i t ä + s ä ä s t ö t o i m e t + s ä ä s t ö t o i m i a + s ä ä s t ö t o i m i e n + s ä ä s t ö t o i m i i n + s ä ä s t ö t o i m i l l a + s ä ä s t ö t o i m i l l e + s ä ä s t ö t o i m i s t a + s ä ä s t ö t u l o i s t a + s ä ä s t ö t u l o j e n + s ä ä s t ö t u o t t e e s t a + s ä ä s t ö t u o t t e i s t a + s ä ä s t ö t u o t t e i t a + s ä ä s t ö v a a t i m u k s i i n + s ä ä s t ö v e l v o i t t e i t a + s ä ä s t ö v ä l i n e + s ä ä s t ö y l i j ä ä m ä ä + s ä ä s t ö ä + s ä ä t e k i j ä t + s ä ä t e k i j ö i d e n + s ä ä t e l e e + s ä ä t e l e m ä ä n + s ä ä t e l e v ä t + s ä ä t e l e v ä ä + s ä ä t e l e v ä ä n + s ä ä t e l i s i v ä t + s ä ä t e l y i n n o n + s ä ä t e l y j ä r j e s t e l m ä + s ä ä t e l y j ä r j e s t e l m ä ä n + s ä ä t e l y k e h y k s e n + s ä ä t e l y k e h y k s e s s ä + s ä ä t e l y k e h y s + s ä ä t e l y k e h y s t ä + s ä ä t e l y k y s y m y s + s ä ä t e l y m a h d o l l i s u u k s i a + s ä ä t e l y m e k a n i s m e j a + s ä ä t e l y m e k a n i s m i + s ä ä t e l y m e k a n i s m i t + s ä ä t e l y m e n e t t e l y ä + s ä ä t e l y o i k e u s + s ä ä t e l y p a k e t t i + s ä ä t e l y p u i t t e e t + s ä ä t e l y s s ä + s ä ä t e l y t o i m e t + s ä ä t e l y t o i m i n t a a + s ä ä t e l y t o i m i n t a a n + s ä ä t e l y v i r a n o m a i s i l l e + s ä ä t e l y v i r a s t o j e n + s ä ä t e l y v ä l i n e i d e n + s ä ä t e l y v ä l i n e i s i i n + s ä ä t e l y y n + s ä ä t e l y ä + s ä ä t i e d o t u k s e t + s ä ä t i e d o t u k s i s s a + s ä ä t i l a n t e e n + s ä ä t i ö a l o i t e t t a + s ä ä t i ö i t ä + s ä ä t i ö l a i n + s ä ä t i ö l a k i + s ä ä t i ö l a k i i n + s ä ä t i ö l l e + s ä ä t i ö l l ä + s ä ä t i ö l t ä + s ä ä t i ö m a l l i a + s ä ä t i ö m a l l i i n + s ä ä t i ö m a l l i n + s ä ä t i ö n + s ä ä t i ö s s ä + s ä ä t u t k a + s ä ä t y v a l t i o p ä i v i l l ä + s ä ä t ä e s s ä ä n + s ä ä t ä m i s e e n + s ä ä t ä m i s e s s ä + s ä ä t ä m i s m e n e t t e l y s t ä + s ä ä t ä m i s m e n e t t e l y ä + s ä ä t ä m i s p r o s e s s i + s ä ä t ä m i s t ä + s ä ä t ä m ä l l ä + s ä ä t ä m ä ä n + s ä ä t ä n e e t + s ä ä t ä n y t + s ä ä t ä v ä n + s ä ä t ä v ä n ä + s ä ä t ä ä + s ä ä t ä ä k s e e n + s ä ä t ö j ä r j e s t e l m ä + s ä ä t ö k o n d e n s a a t t o r i + s ä ä t ö m e k a n i s m e i n a + s ä ä t ö n u p p i a + s ä ä t ö t e k n i i k k a + s ä ä t ö v o i m a + s ä ä v a r o i t u s t e n + s ö i s i v ä t + t a a j a m a j u n a + t a a j a m a y m p ä r i s t ö ö n + t a a j a m i a + t a a j a m i e n + t a a j a m i i n + t a a j a m i l l a + t a a j a m i s s a + t a a j u u d e t + t a a j u u k s i a + t a a j u u k s i a h a n + t a a j u u k s i e n + t a a j u u k s i s t a + t a a j u u s a l u e + t a a j u u s a l u e e l l a + t a a j u u s a l u e e n + t a a j u u s a l u e e t + t a a j u u s a l u e i d e n + t a a j u u s a l u e i s t a + t a a j u u s a l u e i t a + t a a j u u s h a l l i n n o l l a + t a a j u u s h a l l i n n o n + t a a j u u s h a l l i n n o s t a + t a a j u u s h a l l i n t a a n + t a a j u u s h a l l i n t o a + t a a j u u s h u u t o k a u p p a + t a a j u u s h u u t o k a u p p o j a + t a a j u u s j a k o s u u n n i t e l m a n + t a a j u u s k a i s t o i l l a + t a a j u u s k a i s t o j e n + t a a j u u s k a u p a s t a + t a a j u u s k a u p p a + t a a j u u s l a s k i n + t a a j u u s m o d u l a a t i o + t a a j u u s m u u t t a j a + t a a j u u s m ä ä r ä n + t a a j u u s m ä ä r ä y k s i s s ä + t a a j u u s o i k e u k s i l l a + t a a j u u s p o l i i t t i s e e n + t a a j u u s p o l i i t t i s e s t a + t a a j u u s p o l i t i i k a l l a + t a a j u u s p o l i t i i k a n + t a a j u u s p o l i t i i k k a + t a a j u u s p o l i t i i k k a a + t a a j u u s s e k o i t i n + t a a j u u s t a v o i t t e i d e n + t a a j u u s v a s t e + t a a j u u s y l i j ä ä m i ä + t a a j u u s y l i j ä ä m ä + t a a j u u s y l i j ä ä m ä k s i + t a a j u u s y l i j ä ä m ä l l ä + t a a j u u s y l i j ä ä m ä n + t a a j u u s y l i j ä ä m ä n s ä + t a a j u u s y l i j ä ä m ä s t ä + t a a j u u s y l i j ä ä m ä ä + t a a j u u s y l i j ä ä m ä ä n + t a a k a n + t a a k a n j a k a m i s e n + t a a k a n j a k o + t a a k a n j a k o a + t a a k a n j a k o m e k a n i s m i s t a + t a a k a n j a k o o n + t a a k a n j a k o p e r i a a t t e e s t a + t a a k a n j a k o s o p i m u k s e n + t a a k a n j a k o s o p i m u s + t a a k a n j a k o t a v o i t t e e n s a + t a a k a n j a o l l a + t a a k a n j a o n + t a a k a n j a o s t a + t a a k a s t a + t a a k k a a + t a a k k a n a + t a a k k a p y ö r ä + t a a k k o j e n + t a a k o i l t a + t a a k s e e n + t a a k s e m m e + t a a l a i n m a a n h e v o n e n + t a a n n e h t i v i a + t a a n n e h t i v u u d e l l a + t a a n n e h t i v u u d e n + t a a n n e h t i v u u s k i e l l o s t a + t a a n n e h t i v u u s k i e l t o a + t a a n n e h t i v u u s l a u s e k e t t a + t a a n n e h t i v u u s p e r i a a t e + t a a n n o i s e n + t a a n n o i s t a + t a a n n o i s t e n + t a a n t u a + t a a n t u m a a + t a a n t u m a a n + t a a n t u m a k s i + t a a n t u m a n + t a a n t u m a s s a + t a a n t u m a s t a + t a a n t u m a t t o m u u d e n + t a a n t u m i s e e n + t a a n t u m i s e n + t a a n t u m i s e n a + t a a n t u m i s e s t a + t a a n t u m i s t a + t a a n t u m i s t e n + t a a n t u m u k s e l l i s e m m a k s i + t a a n t u m u k s e l l i s e m m a t + t a a n t u m u k s e l l i s e m p i a + t a a n t u m u k s e l l i s e n + t a a n t u m u k s e l l i s e n a + t a a n t u m u k s e l l i s e s t a + t a a n t u m u k s e l l i s e t + t a a n t u m u k s e l l i s i a + t a a n t u m u k s e l l i s i m p i a + t a a n t u m u k s e l l i s i m p i e n + t a a n t u m u k s e l l i s i n + t a a n t u m u k s e l l i s t a + t a a n t u m u k s e l l i s u u d e n + t a a n t u n e e t + t a a n t u n u t + t a a n t u u + t a a n t u v a a + t a a n t u v i a + t a a n t u v i e n + t a a s k a a n + t a a s k i n + t a a t a a n + t a a t a k s e e n + t a a t a k s e m m e + t a a t a k s e n i + t a a t e l i p a l m u j a + t a a t e n + t a a t t a i s i i n + t a a t t a v a + t a a t t i i n + t a a t t u a + t a a t t u j a + t a a t t u j e n + t a a t t u u n + t a a t u i s t a + t a a t u n + t a a t u s t a + t a a t u t + t a b l e t t i l e v y j ä + t a b l e t t i r a s i a n + t a b u a i h e + t a b u a l u e e l t a + t a b u i s t a + t a b u j a + t a b u j e n + t a b u l u o n t e e n + t a b u n + t a b u n a + t a d ž i k i s t a n i l a i s e t + t a d ž i k i t + t a g u l a n h u i l u v a r i s + t a g u l a n l a u l u m e s i k k o + t a h a l l a a n + t a h a t t o m a n + t a h a t t o m i e n + t a h d i n + t a h d i s s a + t a h d o m m e + t a h d o n + t a h d o n i l m a i s u j a + t a h d o n i l m a i s u s t a + t a h d o n i l m a u s + t a h d o s t a + t a h d o s t a a n + t a h i t i n m o n a r k k i + t a h i t i n s i r r i + t a h i t i n v i h e r k a i j a + t a h k o j u u s t o + t a h m a v i l l a k k o + t a h o a + t a h o i h i n + t a h o i l l a + t a h o i l l e + t a h o i s s a + t a h o j a + t a h o j e n + t a h o l l a a n + t a h o l t a n i + t a h o n + t a h o o n + t a h o t + t a h r a a n t u n u t + t a h r i u t u n u t + t a h t i a + t a h t i i n + t a h t i i n s a + t a h t i l a j i + t a h t o a + t a h t o a a n + t a h t o a n i + t a h t o i s i n + t a h t o m a t t a + t a h t o m m e + t a h t o n s a + t a h t o o + t a h t o o n + t a h t o p o l i t i i k k a a + t a h t o v a t + t a i a n o m a i s t a + t a i a n o m a i s u u t t a + t a i d e a a r t e i d e n + t a i d e a a r t e i t a + t a i d e a i n e e t + t a i d e a i n e i d e n + t a i d e a i n e i t a + t a i d e a k a t e m i a + t a i d e a k a t e m i a n + t a i d e a l a l l a + t a i d e a l a n + t a i d e a m m a t i n + t a i d e a m m a t t e j a + t a i d e g a l l e r i a + t a i d e g a l l e r i a t + t a i d e g a l l e r i o i d e n + t a i d e g a l l e r i o i h i n + t a i d e g a l l e r i o i l l e + t a i d e h a l l i + t a i d e h a n k e + t a i d e h a n k k e i d e n + t a i d e h i s t o r i a + t a i d e h i s t o r i o i t s i j a + t a i d e j ä r j e s t ö j e n + t a i d e k a s v a t u k s e n + t a i d e k a s v a t u s + t a i d e k a s v a t u s t a + t a i d e k a u p a n + t a i d e k a u p a s s a + t a i d e k a u p a s t a + t a i d e k a u p o i l l e + t a i d e k a u p p a + t a i d e k a u p p i a a t + t a i d e k a u p p i a i d e n + t a i d e k a u p p i a i l l e + t a i d e k a u p p i a i t a + t a i d e k e s k u s + t a i d e k i e l i + t a i d e k o r k e a k o u l u n + t a i d e k o u l u i l l e + t a i d e k o u l u j e n + t a i d e k o u l u t u k s e n + t a i d e k r i t i i k k i + t a i d e m a a i l m a + t a i d e m a a i l m a s s a + t a i d e m a r k k i n a t + t a i d e m a r k k i n o i d e n + t a i d e m a r k k i n o i t a + t a i d e m u o t o j a + t a i d e m u s e o + t a i d e m u s i i k k i + t a i d e n ä y t t e l y + t a i d e o p e t u s + t a i d e o p e t u s t a + t a i d e o p i n n o i s s a + t a i d e p e r i n n ö n + t a i d e p e r i n t e i t ä + t a i d e p e r i n t ö + t a i d e p e r i n t ö ö n + t a i d e p o l i t i i k k a + t a i d e p s y k o l o g i a + t a i d e r i k k a u k s i a + t a i d e r o c k + t a i d e s k a n d a a l i a + t a i d e s u u n t a u s + t a i d e t a p a h t u m i a + t a i d e t a p a h t u m i e n + t a i d e t e o k s e e n + t a i d e t e o k s e n + t a i d e t e o k s i a + t a i d e t e o k s i a a n + t a i d e t e o k s i a m m e + t a i d e t e o k s i i n + t a i d e t e o k s i s t a + t a i d e t e o l l i s u u s + t a i d e t e o s + t a i d e t e o s t a + t a i d e t e o s t e n + t a i d e t e r a p i a + t a i d e t o i m i k u n t a + t a i d e t o i m i n t a + t a i d e t o i m i n t o j a + t a i d e t t a + t a i d e v a l i o k u n n a n + t a i d e y l i o p i s t o + t a i d o i l l a + t a i d o i l l a a n + t a i d o i s t a + t a i d o i s t a a n + t a i d o k a s t a + t a i d o l l a a n + t a i d o n n ä y t t e e s t ä + t a i d o n n ä y t t e i t ä + t a i d o s t a + t a i d o t + t a i f u u n i n + t a i g a k i r v i n e n + t a i g a k u o v i + t a i g a p ä ä s t ä i n e n + t a i g a r a u t i a i n e n + t a i g a t y t ö n k o r e n t o + t a i g a u u n i l i n t u + t a i g a v a r p u h ä m ä h ä k k i + t a i g a v i k l o + t a i k a a + t a i k a h u i l u + t a i k a h u i l u a + t a i k a i s k u k s i + t a i k a i s k u l l a + t a i k a i s k u s t a + t a i k a j u o m a + t a i k a j u o m a t + t a i k a k a a v a k s i + t a i k a k e i n o + t a i k a k e i n o n a + t a i k a l u o t i t e o r i a + t a i k a l y h t y + t a i k a m i n i s t e r i ö + t a i k a n e l i ö + t a i k a o l e n n o t + t a i k a r i t u a a l e i s s a + t a i k a r i t u a a l e j a + t a i k a s a a p p a a t + t a i k a s a n a + t a i k a s a n a a + t a i k a s a n a l l a + t a i k a s a n a n + t a i k a s a n a s t a + t a i k a s a n a t + t a i k a s a n o i s t a + t a i k a s a n o j a + t a i k a s a u v a + t a i k a s a u v a a + t a i k a s a u v a a n s a + t a i k a s a u v a l l a + t a i k a s a u v a n + t a i k a s a u v a n a + t a i k a s a u v o j a + t a i k a s o r m u s + t a i k a t a l v i + t a i k a t e m p p u j a + t a i k a t e m p p u j e n + t a i k a t o s s u t + t a i k a t y t t ö g e n r e + t a i k a v a r a s + t a i k a v o i m a a n + t a i k a v o i m i a + t a i k a v o i m i s t a + t a i k a v u o r e l t a + t a i k a v u o r i + t a i k i n a m a r j a + t a i k o a + t a i k u r e i t a + t a i k u r i n + t a i k u r i n k u k k a + t a i m i e t a n a + t a i m i v a k k a + t a i n k u t o j a + t a i n n u t t a m a t t a + t a i n n u t u s a s e e n + t a i n n u t u s a s e i d e n + t a i n n u t u s a s e i t a + t a i n n u t u s p i s t o o l i a + t a i p a l e e l l a + t a i p a l e e n j o k i + t a i p e i n + t a i p u e s s a a n + t a i p u i + t a i p u m a a n + t a i p u m a t t a + t a i p u m a t t o m a m p i a + t a i p u m a t t o m u u d e s t a + t a i p u m a t t o m u u d e s t a a n + t a i p u m u k s e n n e + t a i p u m u k s i a + t a i p u m u s t a + t a i p u n e e t + t a i p u v a i s e m p i + t a i p u v a i s e m p i a + t a i p u v a i s i a + t a i p u v a t + t a i s h a n + t a i s t e l e e + t a i s t e l e m a a n + t a i s t e l e m a l l a + t a i s t e l e m a s s a + t a i s t e l e m m e + t a i s t e l e v a n + t a i s t e l e v a t + t a i s t e l e v i a + t a i s t e l i + t a i s t e l i j a r e s e r v e j ä + t a i s t e l i j a t + t a i s t e l i j o i d e n + t a i s t e l k a a m m e + t a i s t e l l a + t a i s t e l l a a n + t a i s t e l l a k s e e n + t a i s t e l l a k s e m m e + t a i s t e l l e e t + t a i s t e l l e s s a + t a i s t e l l e s s a m m e + t a i s t e l l u t + t a i s t e l t a v a + t a i s t e l t u a a n + t a i s t e l u a + t a i s t e l u a i n e i s t a + t a i s t e l u a l u e e l l a + t a i s t e l u a l u e e l l e + t a i s t e l u a l u e e l t a + t a i s t e l u a l u e i d e n + t a i s t e l u a l u e i l t a + t a i s t e l u a l u e i s t a + t a i s t e l u a m m e + t a i s t e l u a s e i d e n + t a i s t e l u a s e n n e t t a + t a i s t e l u d r o i d i + t a i s t e l u e h d o t u s t a + t a i s t e l u e l o k u v a + t a i s t e l u h a u t a a + t a i s t e l u h e l i k o p t e r e i l l a + t a i s t e l u h e l i k o p t e r e i t a + t a i s t e l u h e l i k o p t e r i + t a i s t e l u h e l i k o p t e r i l l a + t a i s t e l u h e l i k o p t e r i t + t a i s t e l u h e n g e n + t a i s t e l u h e n k e ä + t a i s t e l u h e n k e ä ä n + t a i s t e l u h u u t o + t a i s t e l u i d e n + t a i s t e l u i h i n + t a i s t e l u i l l a + t a i s t e l u i s t a + t a i s t e l u i t a + t a i s t e l u j a + t a i s t e l u j e n + t a i s t e l u j o u k k o + t a i s t e l u j o u k k o j a + t a i s t e l u j o u k k o j e n + t a i s t e l u j o u k o i l l a + t a i s t e l u j o u k o i s s a + t a i s t e l u j o u k o t + t a i s t e l u k a l a + t a i s t e l u k e i n o a + t a i s t e l u k e i n o j a + t a i s t e l u k e n t i k s i + t a i s t e l u k e n t i l l ä + t a i s t e l u k e n t t i ä + t a i s t e l u k e n t t ä + t a i s t e l u k e n t ä l t ä + t a i s t e l u k o i r a + t a i s t e l u k o i r a r o d u i s t a + t a i s t e l u k o k e m u s t a + t a i s t e l u k o n e + t a i s t e l u k o n e i d e n + t a i s t e l u k o n e i t a + t a i s t e l u l a i v a + t a i s t e l u l a i v u e e n + t a i s t e l u l e n n o k k i a + t a i s t e l u l e n t o k o n e e l l a + t a i s t e l u l e n t o k o n e e n + t a i s t e l u l e n t o k o n e i d e n + t a i s t e l u l e n t o k o n e t t a + t a i s t e l u l i i t t o + t a i s t e l u l i n j a m m e + t a i s t e l u l l a a n + t a i s t e l u l l e + t a i s t e l u l t a + t a i s t e l u m u o n a p a k k a u s + t a i s t e l u n + t a i s t e l u n a + t a i s t e l u n h a l u i s e m p i a + t a i s t e l u n i + t a i s t e l u n s a + t a i s t e l u o p e r a a t i o + t a i s t e l u o s a p u o l t e n + t a i s t e l u o s a s t o + t a i s t e l u o s a s t o j a + t a i s t e l u p a n s s a r i v a u n u + t a i s t e l u p a r i + t a i s t e l u p e l i + t a i s t e l u p ä i v ä + t a i s t e l u r y h m i e n + t a i s t e l u r y h m ä + t a i s t e l u r y h m ä n + t a i s t e l u r y h m ä t + t a i s t e l u s s a + t a i s t e l u s t a + t a i s t e l u s t r a t e g i a + t a i s t e l u s u u n n i t e l m a + t a i s t e l u s u u n n i t e l m a t + t a i s t e l u t + t a i s t e l u t e h t ä v i ä + t a i s t e l u t o v e r e i d e n + t a i s t e l u t o v e r e i s t a m m e + t a i s t e l u t o v e r e i t a m m e + t a i s t e l u t o v e r e i t a n i + t a i s t e l u t o v e r i + t a i s t e l u t o v e r i t + t a i s t e l u t t a + t a i s t e l u t u n n i n + t a i s t e l u u n + t a i s t e l u v a l m i i n a + t a i s t e l u v a l m i u t e e n + t a i s t e l u v o i t t o + t a i s t e l u v ä l i n e e n ä + t a i s t e l u y k s i k ö n + t a i s t e l u y k s i k ö t + t a i s t o a + t a i s t o o n + t a i t a a + t a i t a v a a + t a i t a v a m m i n + t a i t a v a m p i + t a i t a v a m p i a + t a i t a v a n + t a i t a v i a + t a i t a v i i n + t a i t a v i m p i e n + t a i t e e l l e + t a i t e e l l i s e n + t a i t e e l l i s t a + t a i t e e n + t a i t e e s t a + t a i t e e t + t a i t e i d e n + t a i t e i l i j a k i r j a + t a i t e i l i j a l i i t t o j e n + t a i t e i l i j a n + t a i t e i l i j a r e s i d e n s s i + t a i t e i l i j a s e u r a + t a i t e i l i j a s i i r t o k u n t a + t a i t e i l i j a t + t a i t e i l i j o i d e n + t a i t e i l i j o i h i n + t a i t e i l i j o i l l e + t a i t e i l i j o i l t a + t a i t e i l i j o i s t a + t a i t e i l i j o i t a + t a i t e i s t a + t a i t e i t a + t a i t e k e r r o i n + t a i t e k o h t a a + t a i t e t t a v a + t a i t e t t a v a n a + t a i t e t t a v a n a m m e + t a i t o a + t a i t o h y ö k k ä y s + t a i t o j a + t a i t o j a a n + t a i t o j a m m e + t a i t o j e n + t a i t o j e n s a + t a i t o k a n t a a + t a i t o l u i s t e l u + t a i t o l u i s t e l u a + t a i t o l u i s t e l u n + t a i t o l u i s t i n + t a i t o p e r u s t a n + t a i t o p o h j a + t a i t o p o t e n t i a a l i n + t a i t o t a r p e i d e n + t a i t o t a r p e i t a + t a i t o t a s o a + t a i t o t a s o n + t a i t o t a s o n s a + t a i t o t a v o i t t e e t + t a i t o t i e d o l l a + t a i t o t i e d o n + t a i t o t i e d o n v ä l i t t ä m i s e l l ä + t a i t o t i e d o s t a + t a i t o t i e d o s t a a n + t a i t o t i e t o + t a i t o t i e t o a + t a i t o t i e t o a a n + t a i t o t i e t o a m m e + t a i t o t i e t o n s a + t a i t o t i e t o o n + t a i t o t y ö r y h m ä n + t a i t o u i n t i + t a i t t o p o l k u p y ö r ä + t a i t t o v i k a + t a i t u r i k u l t a r i n t a + t a i t u r i m a t k i j a + t a i t u r i r a s t a s + t a i v a a l l a + t a i v a a l l a m m e + t a i v a a n e k v a a t t o r i + t a i v a a n k a p p a l e + t a i v a a n m e k a n i i k k a + t a i v a a n n a p a + t a i v a a n p a l l o + t a i v a a n v u o h i + t a i v a a s e e n + t a i v a a s s a + t a i v a a t + t a i v a i s i i n + t a i v a s k ä y t ä v ä + t a i v a s l y h t y + t a i v a s t a + t a i v u t e l l a + t a i v u t e l l a k s e e n + t a i v u t e l t a v a + t a i v u t e l t u a + t a i v u t t a a + t a i v u t t a a k s e m m e + t a i v u t t a v a + t a i v u t t e l i m m e + t a i v u t t e l u a + t a i v u t t e l u y r i t y k s i i m m e + t a i v u t u s m o m e n t t i + t a i v u t u s v a s t u s + t a i w a n i l a i s e t + t a i w a n i l a i s i l t a + t a i w a n i l a i s t e n + t a i y u a n i n + t a j u a m a a n + t a j u a m a t t a + t a j u a t k o + t a j u a t t e k o + t a j u a v a n + t a j u i s s a a n + t a j u n n a n v i r t a + t a j u n t a a n n e + t a j u n t a t e o l l i s u u d e n + t a j u s t a + t a j u s t a a n + t a j u t e s s a a n + t a j u t t o m i k s i + t a j u t t u a a n + t a k a a j a v a l t i o i s t a + t a k a a j a v a l t i o t + t a k a a j i n a + t a k a a j i s s a + t a k a a k o + t a k a a m a a n + t a k a a m a l l a + t a k a a m a s s a + t a k a a m a t t a + t a k a a m i s e e n + t a k a a m i s e k s i + t a k a a m i s e l l e + t a k a a m i s e n + t a k a a m i s e s s a + t a k a a m i s e s t a + t a k a a m i s m ä ä r ä y s t ä + t a k a a m i s t a + t a k a a m m e + t a k a a v a a + t a k a a v a m m e + t a k a a v a t + t a k a a v i a + t a k a a v i n + t a k a h u o n e e n + t a k a h u o n e e s s a + t a k a h u o n e i s s a + t a k a h u o n e i s t a + t a k a h u o n e p o l i t i i k k a a + t a k a h u o n e p o l i t i i k k a a n n e + t a k a i k k u n a + t a k a i s e e n + t a k a i s e n + t a k a i s e s s a + t a k a i s e s t a + t a k a i s e t + t a k a i s i + t a k a i s i m m e + t a k a i s i n k u t s u m e k a n i s m i a + t a k a i s i n k u t s u v a i h t o e h t o + t a k a i s i n m a k s e t t a v a t + t a k a i s i n m a k s u a + t a k a i s i n m a k s u a i k a + t a k a i s i n m a k s u a j a n + t a k a i s i n m a k s u e h t o j e n + t a k a i s i n m a k s u j ä r j e s t e l m ä s t ä + t a k a i s i n m a k s u m e n e t t e l y ä + t a k a i s i n m a k s u m o r a a l i + t a k a i s i n m a k s u o s u u s + t a k a i s i n m a k s u u n + t a k a i s i n m a k s u v a a t i m u k s i a + t a k a i s i n m a k s u v e l v o i t e t t a + t a k a i s i n m a k s u v e l v o l l i s u u s + t a k a i s i n m a l l i n n u s + t a k a i s i n m u u t t o a + t a k a i s i n o s t o + t a k a i s i n o s t o i s t a + t a k a i s i n o s t o j e n + t a k a i s i n o s t o j ä r j e s t e l m ä s t ä + t a k a i s i n o s t o j ä r j e s t e l m ä ä + t a k a i s i n o s t o l l a + t a k a i s i n o s t o m a h d o l l i s u u t e n s a + t a k a i s i n o s t o n + t a k a i s i n o s t o o n + t a k a i s i n o s t o s o p i m u k s i a + t a k a i s i n o s t o s o p i m u k s i i n + t a k a i s i n o t t o + t a k a i s i n o t t o a + t a k a i s i n o t t o j ä r j e s t e l m i ä + t a k a i s i n o t t o k u m p p a n u u k s i a + t a k a i s i n o t t o l a u s e k e + t a k a i s i n o t t o l a u s e k k e e t + t a k a i s i n o t t o l a u s e k k e i d e n + t a k a i s i n o t t o l a u s e k k e i t a + t a k a i s i n o t t o m e n e t t e l y + t a k a i s i n o t t o m e n e t t e l y j e n + t a k a i s i n o t t o m e n e t t e l y n + t a k a i s i n o t t o o n + t a k a i s i n o t t o p e r i a a t t e i s i i n + t a k a i s i n o t t o p o l i t i i k a n + t a k a i s i n o t t o p o l i t i i k k a + t a k a i s i n o t t o p o l i t i i k k a a + t a k a i s i n o t t o p o n n i s t e l u i t a + t a k a i s i n o t t o s i t o u m u s t e n + t a k a i s i n o t t o s o p i m u k s e e n + t a k a i s i n o t t o s o p i m u k s e n + t a k a i s i n o t t o s o p i m u k s e s s a + t a k a i s i n o t t o s o p i m u k s e s t a + t a k a i s i n o t t o s o p i m u k s e t + t a k a i s i n o t t o s o p i m u k s i a + t a k a i s i n o t t o s o p i m u k s i e n + t a k a i s i n o t t o s o p i m u k s i i n + t a k a i s i n o t t o s o p i m u k s i l l a + t a k a i s i n o t t o s o p i m u k s i s s a + t a k a i s i n o t t o s o p i m u k s i s t a + t a k a i s i n o t t o s o p i m u s + t a k a i s i n o t t o s o p i m u s k ä y t ä n t ö ä + t a k a i s i n o t t o s o p i m u s t a + t a k a i s i n o t t o s o p i m u s t e n + t a k a i s i n o t t o v e l v o i t e + t a k a i s i n o t t o v e l v o i t t e e n s a + t a k a i s i n o t t o v e l v o l l i s u u t t a + t a k a i s i n p a l u u o i k e u t t a + t a k a i s i n p e r i m i s e k s i + t a k a i s i n p e r i m i s e n + t a k a i s i n p e r i m i s m e k a n i s m i i n + t a k a i s i n p e r i n n ä n + t a k a i s i n p e r i n t ä + t a k a i s i n p e r i n t ä a s t e + t a k a i s i n p e r i n t ä j ä r j e s t e l m ä + t a k a i s i n p e r i n t ä j ä r j e s t e l m ä ä + t a k a i s i n p e r i n t ä k a u d e n + t a k a i s i n p e r i n t ä m e n e t t e l y j e n + t a k a i s i n p e r i n t ä t a p a u k s e n + t a k a i s i n p e r i n t ä ä n + t a k a i s i n r i s t e y t y s + t a k a i s i n s a a m i s e k s i + t a k a i s i n v i i t t a u s v ä l i n e e n + t a k a i s i v a t + t a k a i s k u + t a k a i s k u a + t a k a i s k u i l l e + t a k a i s k u i s t a + t a k a i s k u j a + t a k a i s k u j e n + t a k a i s k u n a + t a k a i s k u t + t a k a i s t e n + t a k a i s t u i m i l l a + t a k a m a i k s i + t a k a n a a n + t a k a n a m i + t a k a n a m m e + t a k a n u r k a s s a + t a k a o v e a + t a k a o v e e n + t a k a o v e l l a + t a k a o v e n + t a k a o v e n a + t a k a o v e s t a + t a k a o v e t + t a k a o v i + t a k a o v i a + t a k a o v i m e k a n i s m i + t a k a p a i n o t t e i s e s t i + t a k a p a i n o t t e i s t a + t a k a p a i n o t t e i s u u s + t a k a p a j u i s e e n + t a k a p a j u i s e s t a + t a k a p a j u i s i k s i + t a k a p a j u i s i n a + t a k a p a k k i + t a k a p a k k i a + t a k a p a k k i i n + t a k a p e n k i l l ä + t a k a p e n k i l t ä + t a k a p i h a + t a k a p i h a l l a + t a k a p i h a l l a a n + t a k a p i h a l l a m m e + t a k a p i h a l l a n i + t a k a p i h a l t a m m e + t a k a p i h a m m e + t a k a p i h o i l l a a n + t a k a p i h o i l l e e n + t a k a p o r t i n + t a k a p o r t t e j a + t a k a p o r t t i + t a k a p o r t t i a + t a k a p o r t t i n a + t a k a r a i v o l o h k o + t a k a r a i v o l u u + t a k a r a j a a + t a k a r e k i s t e r i k i l v e n + t a k a r i v e j ä + t a k a r i v i s s ä + t a k a s o t i l a s + t a k a t a l v i + t a k a t a s k u s s a a n + t a k a t a s k u s s a n n e + t a k a u k s i a + t a k a u s j ä r j e s t e l m i e n + t a k a u s j ä r j e s t e l m i l l e + t a k a u s j ä r j e s t e l m i s t ä + t a k a u s j ä r j e s t e l m i ä + t a k a u s j ä r j e s t e l m ä + t a k a u s j ä r j e s t e l m ä n + t a k a u s j ä r j e s t e l m ä s t ä + t a k a u s j ä r j e s t e l m ä ä + t a k a u s j ä r j e s t e l y i h i n + t a k a u s o h j e l m a t + t a k a u s o h j e l m i e n + t a k a u s o s a s s a + t a k a u s p r o s e s s i n + t a k a u s r a h a s t o + t a k a u s r a h a s t o a + t a k a u s r a h a s t o s t a + t a k a u s t o i m e t + t a k a u s v ä l i n e e n + t a k a u s v ä l i n e i d e n + t a k a u s y h t i ö i t ä + t a k a u t u m a t t o m u u s l a u s e k k e e s t a + t a k a u t u v a a + t a k a v a r i k k o j e n + t a k a v a r i k k o t i l a s t o i s t a + t a k a v a r i k o i d a a n + t a k a v a r i k o i d u s t a + t a k a v a r i k o i d u t + t a k a v a r i k o i n t i k y s y m y k s e n + t a k a v a r i k o i n t i m ä ä r ä y k s e n + t a k a v a r i k o i n t i m ä ä r ä y s + t a k a v a r i k o i t a v a s t a + t a k a v a r i k o i t i i n + t a k a v a r i k o i t u j e n + t a k a v a r i k o n + t a k a v u o s i n a + t a k e e n a + t a k e e t + t a k e i d e n + t a k e i t a + t a k e r r u m m e + t a k e r t e l e e + t a k e r t u k o + t a k e r t u u + t a k i a i s t a m m i + t a k i a m m e + t a k i n k ä ä n t ö + t a k i n k ä ä n t ö p o l i t i i k k a a + t a k k i r a u t a + t a k k u i l e v a a + t a k k u j ä k ä l ä + t a k k u k o t i l o + t a k l a u k s e n + t a k s a t + t a k s e i h i n + t a k s i a m m a t t i + t a k s i a m m a t t i a + t a k s i a u t o i l i j o i d e n + t a k s i b o i k o t t i + t a k s i j o n o i s s a + t a k s i k i l p i ä + t a k s i k u l j e t u k s i a + t a k s i k u l u j e n + t a k s i k u l u n s a + t a k s i k u s k i + t a k s i l u k u + t a k s i l u p i i n + t a k s i l u v a t + t a k s i m a k s u i s t a + t a k s i m a t k o j e n + t a k s i m i t t a r i t + t a k s i n k u l j e t t a j a + t a k s i n k u l j e t t a j a a + t a k s i n k u l j e t t a j a n + t a k s i n k u l j e t t a j a n a + t a k s i n k u l j e t t a j a t + t a k s i n k u l j e t t a j i a + t a k s i n k u l j e t t a j i e n + t a k s i n k u l j e t t a j i l l e + t a k s i n k ä y t ö n + t a k s i p a l v e l u t + t a k s i p a r l a m e n t i n + t a k t i i k a l l e e n + t a k t i i k a n + t a k t i i k a n v a i h t o a + t a k t i i k a s t a + t a k t i i k k a a + t a k t i i k o i t a + t a k t i k o i n t i a + t a k t i k o i n t i i n + t a k t i s i n + t a k t i s i s t a + t a k t i s t a + t a k u i d e n + t a k u i l l a + t a k u i s i i n + t a k u i s s a + t a k u i s t a + t a k u i t a + t a k u u a i k a + t a k u u a i k a a + t a k u u a i k o j a + t a k u u a i k o j e n + t a k u u a j a n + t a k u u a j a s t a + t a k u u a s i a a n + t a k u u d i r e k t i i v i + t a k u u e h t o i h i n + t a k u u e h t o j e n + t a k u u e l i m e n + t a k u u h i n n a s t a + t a k u u h i n n a t + t a k u u h i n n o i l l a + t a k u u h i n t a + t a k u u h i n t a j ä r j e s t e l m i s t ä + t a k u u h i n t a j ä r j e s t e l m i ä + t a k u u h i n t o i h i n + t a k u u h i n t o j a + t a k u u h i n t o j e n + t a k u u j ä r j e s t e l m i e n + t a k u u j ä r j e s t e l m i l l e + t a k u u j ä r j e s t e l m i l l ä + t a k u u j ä r j e s t e l m i s t ä + t a k u u j ä r j e s t e l m i ä + t a k u u j ä r j e s t e l m ä + t a k u u j ä r j e s t e l m ä l l ä + t a k u u j ä r j e s t e l m ä n + t a k u u j ä r j e s t e l m ä s s ä + t a k u u j ä r j e s t e l m ä ä + t a k u u j ä r j e s t e l m ä ä n + t a k u u j ä r j e s t e l y i h i n + t a k u u j ä r j e s t e l y i s t ä + t a k u u k y n n y k s e t + t a k u u k y n n y k s i l l e + t a k u u k y n n y k s i ä + t a k u u k y n n y s + t a k u u k y n n y s t e n + t a k u u k y s y m y k s e s t ä + t a k u u m e k a n i s m i e n + t a k u u m e k a n i s m i n + t a k u u m e k a n i s m i t + t a k u u m e n e t t e l y t + t a k u u m e n o t + t a k u u m i e h e n ä + t a k u u m u o t o j a + t a k u u m u o t o j e n + t a k u u n + t a k u u o i k e u d e n + t a k u u p a k e t i s t a + t a k u u p a n k k i e n + t a k u u p r o s e n t i n + t a k u u p u i t t e e t + t a k u u p ä ä t ö k s e t + t a k u u r a h a s t o + t a k u u r a h a s t o a + t a k u u r a h a s t o a s e t u k s e s t a + t a k u u r a h a s t o i h i n + t a k u u r a h a s t o i s s a + t a k u u r a h a s t o j a + t a k u u r a h a s t o j e n + t a k u u r a h a s t o j ä r j e s t e l m i l l ä + t a k u u r a h a s t o j ä r j e s t e l m ä + t a k u u r a h a s t o j ä r j e s t e l m ä n + t a k u u r a h a s t o l l a + t a k u u r a h a s t o l l e + t a k u u r a h a s t o l t a + t a k u u r a h a s t o n + t a k u u r a h a s t o o n + t a k u u r a h a s t o s i i r o i l l e + t a k u u r a h a s t o s i i r r o l l a + t a k u u r a h a s t o s s a + t a k u u r a h a s t o s t a + t a k u u r a h a s t o t + t a k u u r a h a t + t a k u u s o p i m u k s e s s a + t a k u u s o p i m u s t e n + t a k u u s t a + t a k u u s u m m a n + t a k u u s ä ä n n ö t + t a k u u s ä ä n t ö j ä + t a k u u t + t a k u u t a + t a k u u t o d i s t u s t e n + t a k u u t o i m e n p i t e i t ä + t a k u u v a a t i m u k s e t + t a k u u v a r a u k s e e n + t a k u u v a r a u k s e n + t a k u u v a r a u k s e s s a + t a k u u v a r m a + t a k u u v ä l i n e i d e n + t a l e b a n e i k s i + t a l e b a n h a l l i n n o n + t a l e b a n i e n + t a l e b a n i n + t a l e b a n i t + t a l i b a n e j a + t a l i b a n i t + t a l i b a n j o u k k o j a + t a l i j o h d a n n a i s t e n + t a l i j ä t e + t a l i j ä t t e e n + t a l i n + t a l i r a u h a n e n + t a l i t i a i n e n + t a l j a a + t a l l a t a a n + t a l l a u t u u + t a l l e l o k e r o i s s a + t a l l e n n e t a a n + t a l l e n n e t t a v a + t a l l e n n e t t u i h i n + t a l l e n n u s f o r m a a t t i + t a l l e n n u s j ä r j e s t e l m i ä + t a l l e n n u s k a p a s i t e e t i n + t a l l e n n u s k a p a s i t e e t t i a + t a l l e n n u s l a i t t e e l l a + t a l l e n n u s v ä l i n e e s e e n + t a l l e n n u s v ä l i n e e t + t a l l e n t a a + t a l l e n t a i s i v a t + t a l l e n t a m i s e n + t a l l e n t a m i s e s t a + t a l l e n t a m i s t a + t a l l e n t a m i s v e l v o i t t e e s t a + t a l l e n t a v a m m e + t a l l e n t e e n + t a l l e n t i m e l l a + t a l l e n t i m e s t a + t a l l e n t i m i i n + t a l l e n t i m i l l a + t a l l e t e t t a v a + t a l l e t t a m i s t a + t a l l e t u k s i s t a + t a l l e t u s j ä r j e s t e l m ä + t a l l e t u s k o r k o j a + t a l l e t u s k o r k o j e n + t a l l e t u s s u o j a + t a l l e t u s s u o j a a + t a l l e t u s s u o j a l a i t o s t e n + t a l l e t u s s u o j a n + t a l l e t u s s u o j a s u u n n i t e l m i a + t a l l e t u s t a k a u s j ä r j e s t e l m i i n + t a l l e t u s t a k u i d e n + t a l l e t u s t a k u i l l e + t a l l e t u s t a k u i s t a + t a l l e t u s t a k u i t a + t a l l e t u s t a k u u + t a l l e t u s t a k u u j ä r j e s t e l m i e n + t a l l e t u s t a k u u j ä r j e s t e l m i s t ä + t a l l e t u s t a k u u j ä r j e s t e l m i ä + t a l l e t u s t a k u u j ä r j e s t e l m ä n + t a l l e t u s t a k u u j ä r j e s t e l m ä ä n + t a l l e t u s t a k u u n + t a l l e t u s t a k u u t a + t a l l e t u s t e n + t a l l e t u s t i l i e n + t a l l e t u s t u l o j a + t a l l e t u s t u o t t o j e n + t a l l e t u s v a k u u k s i e n + t a l l e t u s v a k u u s + t a l l e t u s v a k u u s j ä r j e s t e l m i ä + t a l l e t u s v a k u u s r a h a s t o a + t a l l i j e n g i + t a l l i s t a a n + t a l l o m i k s i + t a l l o t a a n + t a l o a + t a l o a m m e + t a l o i l l a + t a l o i s t a + t a l o j a + t a l o j a a n + t a l o j e n + t a l o k o h t a i s e s t i + t a l o n + t a l o n m i e s + t a l o n o m i s t a j a t + t a l o n p o i k a + t a l o n p o i k a a + t a l o n p o i k a i s j ä r j e n + t a l o n p o i k a i s j ä r j e s t ö k s i + t a l o n p o i k a i s j ä r k e e n + t a l o n p o i k a i s j ä r k e ä + t a l o n p o i k a i s j ä r k i + t a l o n p o i k a i s k a p i n a + t a l o n p o i k a i s p u o l u e + t a l o n p o i k a i s s o t a + t a l o n p o i k a i s y h t e i s k u n n a s t a + t a l o n p o i k i a + t a l o n p o j a t + t a l o n p o j i s t a + t a l o n r a k e n n u s + t a l o n r a k e n n u s a l a l l a + t a l o n r a k e n n u s a l a n + t a l o n r a k e n n u s m a h d o l l i s u u k s i a + t a l o n r a k e n n u s o h j e l m a + t a l o n s a + t a l o o m m e + t a l o r y p p ä i s s ä + t a l o s s a m m e + t a l o s t a a n + t a l o t e k n i i k k a + t a l o t e k n i i k o i s t a + t a l o u d e k s i + t a l o u d e l l a + t a l o u d e l l e + t a l o u d e l l e m m e + t a l o u d e l l i s e e n + t a l o u d e l l i s e k s i + t a l o u d e l l i s e l l a + t a l o u d e l l i s e l l e + t a l o u d e l l i s e l t a + t a l o u d e l l i s e m m a l l e + t a l o u d e l l i s e m m i n + t a l o u d e l l i s e m p a a + t a l o u d e l l i s e m p a a n + t a l o u d e l l i s e m p a n a + t a l o u d e l l i s e m p i + t a l o u d e l l i s e m p i a + t a l o u d e l l i s e m p i i n + t a l o u d e l l i s e n + t a l o u d e l l i s e n a + t a l o u d e l l i s e n k i n + t a l o u d e l l i s e s s a + t a l o u d e l l i s e s t a + t a l o u d e l l i s e s t i k i n + t a l o u d e l l i s e t + t a l o u d e l l i s i a + t a l o u d e l l i s i i n + t a l o u d e l l i s i l l e + t a l o u d e l l i s i l t a + t a l o u d e l l i s i m p i a + t a l o u d e l l i s i n + t a l o u d e l l i s i s s a + t a l o u d e l l i s i s t a + t a l o u d e l l i s t a k a a n + t a l o u d e l l i s t e n + t a l o u d e l l i s u u d e s t a + t a l o u d e l l i s u u t t a + t a l o u d e n + t a l o u d e n a l a + t a l o u d e n a l a a + t a l o u d e n a l a l l a + t a l o u d e n a l a n + t a l o u d e n a l a s t a + t a l o u d e n a l a t + t a l o u d e n a l o i h i n + t a l o u d e n a l o i l l a + t a l o u d e n a l o i l l e + t a l o u d e n a l o i s t a + t a l o u d e n a l o j a + t a l o u d e n a l o j e n + t a l o u d e n h a a r o j a + t a l o u d e n h a l l i n t a m a l l i + t a l o u d e n h o i d o l t a + t a l o u d e n h o i d o n + t a l o u d e n h o i d o s s a + t a l o u d e n h o i d o s t a + t a l o u d e n h o i t o + t a l o u d e n h o i t o a + t a l o u d e n h o i t o n s a + t a l o u d e n h o i t o o n + t a l o u d e n h o i t o p e r i a a t e t t a + t a l o u d e n h o i t o v ä l i n e e t + t a l o u d e n k i n + t a l o u d e n n ä k y m i ä + t a l o u d e n o h j a u s s t r a t e g i a a + t a l o u d e n p i d o l l e + t a l o u d e n p i d o n + t a l o u d e n p i d o s t a + t a l o u d e s s a + t a l o u d e s s a k a a n + t a l o u d e s s a k i n + t a l o u d e s s a m m e + t a l o u d e s t a + t a l o u d e s t a a n + t a l o u d e t + t a l o u k s i a + t a l o u k s i a m m e + t a l o u k s i e m m e + t a l o u k s i e n + t a l o u k s i e n s a + t a l o u k s i i m m e + t a l o u k s i i n + t a l o u k s i l l e + t a l o u k s i l l e m m e + t a l o u k s i n e e n + t a l o u k s i s s a + t a l o u k s i s t a + t a l o u s a i h e i t a + t a l o u s a j a t t e l u u m m e + t a l o u s a l a + t a l o u s a l a a + t a l o u s a l a l l a + t a l o u s a l a l l e + t a l o u s a l a n + t a l o u s a l a n a + t a l o u s a l o i l l a + t a l o u s a l o i t e + t a l o u s a l o j e n + t a l o u s a l u e + t a l o u s a l u e e k s i + t a l o u s a l u e e l l a + t a l o u s a l u e e l l e + t a l o u s a l u e e l t a + t a l o u s a l u e e m m e + t a l o u s a l u e e n + t a l o u s a l u e e n a + t a l o u s a l u e e n s a + t a l o u s a l u e e s e e n + t a l o u s a l u e e s e e n s a + t a l o u s a l u e e s s a + t a l o u s a l u e e s t a + t a l o u s a l u e e t + t a l o u s a l u e i d e n + t a l o u s a l u e i l l a + t a l o u s a l u e i l l e + t a l o u s a l u e i l t a + t a l o u s a l u e i s i i n + t a l o u s a l u e i s s a + t a l o u s a l u e k u m p p a n i m m e + t a l o u s a l u e t t a + t a l o u s a l u e t t a a n + t a l o u s a l u e t t a m m e + t a l o u s a n a l y y s e j ä + t a l o u s a n a l y y s i + t a l o u s a n a l y y s i e n + t a l o u s a n a l y y s i i n + t a l o u s a n a l y y s i m m e + t a l o u s a n a l y y s i n + t a l o u s a n a l y y s i n s ä + t a l o u s a n a l y y s i t + t a l o u s a n a l y y s i ä + t a l o u s a n a l y y t i k o t + t a l o u s a n a r k i a a + t a l o u s a p u + t a l o u s a p u a + t a l o u s a p u n s a + t a l o u s a p u o h j e l m a + t a l o u s a p u p a k e t i n + t a l o u s a p u u n + t a l o u s a r v i o + t a l o u s a r v i o a i h e i s t a + t a l o u s a r v i o a l a n + t a l o u s a r v i o a l i j ä ä m i ä + t a l o u s a r v i o a l i j ä ä m ä + t a l o u s a r v i o a l i j ä ä m ä ä + t a l o u s a r v i o a l o i t t e i d e n + t a l o u s a r v i o a l o i t t e i t a + t a l o u s a r v i o a l u e + t a l o u s a r v i o a l u e i l l a + t a l o u s a r v i o a s e m a n + t a l o u s a r v i o a s e t u k s e n + t a l o u s a r v i o a s e t u k s e s t a + t a l o u s a r v i o a s i a n t u n t i j a m m e + t a l o u s a r v i o a s i a n t u n t i j a t + t a l o u s a r v i o a s i o i d e n + t a l o u s a r v i o a s i o i h i n + t a l o u s a r v i o a s i o i s s a + t a l o u s a r v i o a s i o i s t a + t a l o u s a r v i o a s i o i t a + t a l o u s a r v i o a u k t o r i t e e t t i + t a l o u s a r v i o d i k t a a t t o r i m m e + t a l o u s a r v i o d i r e k t i i v i s t ä + t a l o u s a r v i o e h d o t u k s e e n + t a l o u s a r v i o e h d o t u k s e n + t a l o u s a r v i o e h d o t u k s e n a + t a l o u s a r v i o e h d o t u k s e n n e + t a l o u s a r v i o e h d o t u k s e n s a + t a l o u s a r v i o e h d o t u k s e s s a + t a l o u s a r v i o e h d o t u k s e s s a a n + t a l o u s a r v i o e h d o t u k s e s s a n n e + t a l o u s a r v i o e h d o t u k s e s t a + t a l o u s a r v i o e h d o t u k s e t + t a l o u s a r v i o e h d o t u k s i a + t a l o u s a r v i o e h d o t u k s i a a n + t a l o u s a r v i o e h d o t u k s i i n + t a l o u s a r v i o e h d o t u k s i s s a + t a l o u s a r v i o e h d o t u s + t a l o u s a r v i o e h d o t u s t a + t a l o u s a r v i o e h t o j e n + t a l o u s a r v i o e n n u s t e e s s a + t a l o u s a r v i o e n n u s t e e s t a + t a l o u s a r v i o e n n u s t e e t + t a l o u s a r v i o e n n u s t e i d e n + t a l o u s a r v i o e n n u s t e i t a + t a l o u s a r v i o e n n u s t e v a r o i t u k s i a + t a l o u s a r v i o e s i t t e l i j ä + t a l o u s a r v i o e s i t t e l i j ä l l ä + t a l o u s a r v i o e s i t t e l i j ä m m e + t a l o u s a r v i o e s i t t e l i j ä n ä + t a l o u s a r v i o e s i t t e l i j ö i d e n + t a l o u s a r v i o e s i t y k s e e n + t a l o u s a r v i o e s i t y k s e e n s ä + t a l o u s a r v i o e s i t y k s e k s i + t a l o u s a r v i o e s i t y k s e l l ä + t a l o u s a r v i o e s i t y k s e m m e + t a l o u s a r v i o e s i t y k s e n + t a l o u s a r v i o e s i t y k s e n s ä + t a l o u s a r v i o e s i t y k s e s s ä + t a l o u s a r v i o e s i t y k s e s s ä ä n + t a l o u s a r v i o e s i t y k s e s t ä + t a l o u s a r v i o e s i t y k s e s t ä ä n + t a l o u s a r v i o e s i t y k s i i n + t a l o u s a r v i o e s i t y k s i s s ä + t a l o u s a r v i o e s i t y k s i s s ä ä n + t a l o u s a r v i o e s i t y k s i s t ä + t a l o u s a r v i o e s i t y k s i ä + t a l o u s a r v i o e s i t y k s i ä ä n + t a l o u s a r v i o e s i t y s + t a l o u s a r v i o e s i t y s k i n + t a l o u s a r v i o e s i t y s t e n + t a l o u s a r v i o e s i t y s t ä + t a l o u s a r v i o e s i t y s t ä m m e + t a l o u s a r v i o e s i t y s t ä ä n + t a l o u s a r v i o f i a s k o n + t a l o u s a r v i o f i l o s o f i a a + t a l o u s a r v i o h a a s t e i t a + t a l o u s a r v i o h a l l i n n o n + t a l o u s a r v i o h a l l i n n o s s a + t a l o u s a r v i o h a l l i n t o a + t a l o u s a r v i o h a n k e t t a + t a l o u s a r v i o h i s t o r i a + t a l o u s a r v i o h i s t o r i a s s a + t a l o u s a r v i o h y v i t y k s e n + t a l o u s a r v i o h y v i t y s t ä ä n + t a l o u s a r v i o i d e n + t a l o u s a r v i o i h i n + t a l o u s a r v i o i l l e + t a l o u s a r v i o i s s a + t a l o u s a r v i o i s t a + t a l o u s a r v i o i s t a a n + t a l o u s a r v i o i s t a m m e + t a l o u s a r v i o i t a + t a l o u s a r v i o i t a a n + t a l o u s a r v i o j o u s t o n + t a l o u s a r v i o j o u s t o t + t a l o u s a r v i o j u n a + t a l o u s a r v i o j ä r j e s t e l m ä + t a l o u s a r v i o j ä r j e s t e l m ä n + t a l o u s a r v i o j ä r j e s t e l m ä s s ä + t a l o u s a r v i o j ä r j e s t e l m ä ä + t a l o u s a r v i o j ä r j e s t e l m ä ä n + t a l o u s a r v i o j ä r j e s t e l y n + t a l o u s a r v i o k a l e n t e r i m m e + t a l o u s a r v i o k a n n u s t i n t a + t a l o u s a r v i o k a t a s t r o f i s t a + t a l o u s a r v i o k a u d e l l a + t a l o u s a r v i o k a u d e l l e + t a l o u s a r v i o k a u d e l t a + t a l o u s a r v i o k a u d e n + t a l o u s a r v i o k a u s i + t a l o u s a r v i o k a u t e e n + t a l o u s a r v i o k e h i t y k s e n + t a l o u s a r v i o k e h i t y k s e s t ä + t a l o u s a r v i o k e h i t y s + t a l o u s a r v i o k e h y k s e e n + t a l o u s a r v i o k e h y k s e l l e m m e + t a l o u s a r v i o k e h y k s e n + t a l o u s a r v i o k e h y k s e s s ä + t a l o u s a r v i o k e h y k s e s t ä + t a l o u s a r v i o k e h y k s e t + t a l o u s a r v i o k e h y k s i s s ä + t a l o u s a r v i o k e h y k s i ä + t a l o u s a r v i o k e h y s + t a l o u s a r v i o k e h y s t e n + t a l o u s a r v i o k e h y s t ä + t a l o u s a r v i o k e s k u s t e l u + t a l o u s a r v i o k e s k u s t e l u a + t a l o u s a r v i o k e s k u s t e l u i s s a + t a l o u s a r v i o k e s k u s t e l u j a + t a l o u s a r v i o k e s k u s t e l u j e n + t a l o u s a r v i o k e s k u s t e l u l l e + t a l o u s a r v i o k e s k u s t e l u n + t a l o u s a r v i o k e s k u s t e l u s s a + t a l o u s a r v i o k e s k u s t e l u s s a k i n + t a l o u s a r v i o k e s k u s t e l u s t a + t a l o u s a r v i o k e s k u s t e l u t + t a l o u s a r v i o k e s k u s t e l u u n + t a l o u s a r v i o k e s t ä v y y d e n + t a l o u s a r v i o k i e r r o k s e n + t a l o u s a r v i o k i e r r o s + t a l o u s a r v i o k i e r r o s t a + t a l o u s a r v i o k i r j a n p i d o n + t a l o u s a r v i o k i r j a n p i t o + t a l o u s a r v i o k i r j a n p i t o o n + t a l o u s a r v i o k o h d a l l e + t a l o u s a r v i o k o h d a t + t a l o u s a r v i o k o h d i l l a + t a l o u s a r v i o k o h d i s s a + t a l o u s a r v i o k o h t a + t a l o u s a r v i o k o h t a a + t a l o u s a r v i o k o h t i a + t a l o u s a r v i o k o h t i e n + t a l o u s a r v i o k o k o u k s e e n + t a l o u s a r v i o k o m p e n s a a t i o + t a l o u s a r v i o k o m p r o m i s s i n + t a l o u s a r v i o k o n e i s t o + t a l o u s a r v i o k o n e i s t o o n + t a l o u s a r v i o k o o r d i n a a t t o r e i t a + t a l o u s a r v i o k r i i s i + t a l o u s a r v i o k r i i s i e n + t a l o u s a r v i o k r i i s i i n + t a l o u s a r v i o k r i i s i k s i + t a l o u s a r v i o k r i i s i l t ä + t a l o u s a r v i o k r i i s i n + t a l o u s a r v i o k r i i s i n ä + t a l o u s a r v i o k r i i s i t + t a l o u s a r v i o k r i t e e r e i t ä + t a l o u s a r v i o k r i t e e r e j ä + t a l o u s a r v i o k s i + t a l o u s a r v i o k u r i + t a l o u s a r v i o k u r i a + t a l o u s a r v i o k u r i i n + t a l o u s a r v i o k u r i n + t a l o u s a r v i o k u r i s t a + t a l o u s a r v i o k u s t a n n u k s i a + t a l o u s a r v i o k u s t a n n u k s i s t a + t a l o u s a r v i o k y s y m y k s e e n + t a l o u s a r v i o k y s y m y k s e n + t a l o u s a r v i o k y s y m y k s e s s ä + t a l o u s a r v i o k y s y m y k s e s t ä + t a l o u s a r v i o k y s y m y k s e t + t a l o u s a r v i o k y s y m y k s i i n + t a l o u s a r v i o k y s y m y k s i s s ä + t a l o u s a r v i o k y s y m y k s i s t ä + t a l o u s a r v i o k y s y m y k s i ä + t a l o u s a r v i o k y s y m y s + t a l o u s a r v i o k y s y m y s t e n + t a l o u s a r v i o k ä s i t t e l y + t a l o u s a r v i o k ä s i t t e l y n + t a l o u s a r v i o k ä s i t t e l y s s ä + t a l o u s a r v i o k ä s i t t e l y s t ä + t a l o u s a r v i o k ä s i t t e l y y n + t a l o u s a r v i o k ä s i t t e l y ä + t a l o u s a r v i o k ä y t ä n n ö n + t a l o u s a r v i o k ä y t ä n t ö ä + t a l o u s a r v i o l a i n s ä ä d ä n n ö n + t a l o u s a r v i o l a i n s ä ä d ä n n ö s s ä + t a l o u s a r v i o l a i n s ä ä d ä n t ö m m e + t a l o u s a r v i o l a i n s ä ä d ä n t ö ä + t a l o u s a r v i o l a i n s ä ä d ä n t ö ä m m e + t a l o u s a r v i o l a i n s ä ä d ä n t ö ö n + t a l o u s a r v i o l a s k e l m i a + t a l o u s a r v i o l e i k k a u k s e t + t a l o u s a r v i o l e i k k a u k s i a + t a l o u s a r v i o l e i k k a u k s i s t a + t a l o u s a r v i o l e i k k a u s t e n + t a l o u s a r v i o l i i t t o a + t a l o u s a r v i o l i n j a + t a l o u s a r v i o l i n j a a + t a l o u s a r v i o l i n j a a n + t a l o u s a r v i o l i n j a l l a + t a l o u s a r v i o l i n j a u k s i s s a + t a l o u s a r v i o l i s ä y k s e l l e + t a l o u s a r v i o l i s ä y k s e n + t a l o u s a r v i o l i s ä y s + t a l o u s a r v i o l i s ä y s t ä + t a l o u s a r v i o l l a + t a l o u s a r v i o l l e + t a l o u s a r v i o l t a a n + t a l o u s a r v i o l u k u i h i n + t a l o u s a r v i o l u k u j a + t a l o u s a r v i o l u o k k a a n + t a l o u s a r v i o l u o n n o k s e n + t a l o u s a r v i o l u o n n o k s e s s a + t a l o u s a r v i o l u o n n o k s e s s a a n + t a l o u s a r v i o l u o n n o k s e s t a + t a l o u s a r v i o l u o n n o s + t a l o u s a r v i o l u o n n o s t a + t a l o u s a r v i o l u o n n o s t a a n + t a l o u s a r v i o l u v u i s t a + t a l o u s a r v i o l u v u t + t a l o u s a r v i o l ä h t ö k o h d a n + t a l o u s a r v i o m a k s u j a + t a l o u s a r v i o m a l l i n + t a l o u s a r v i o m a r g i n a a l i + t a l o u s a r v i o m e n e t e l m i ä + t a l o u s a r v i o m e n e t t e l y + t a l o u s a r v i o m e n e t t e l y i d e n + t a l o u s a r v i o m e n e t t e l y i h i n + t a l o u s a r v i o m e n e t t e l y i l l e + t a l o u s a r v i o m e n e t t e l y i l l ä + t a l o u s a r v i o m e n e t t e l y i s s ä + t a l o u s a r v i o m e n e t t e l y j e n + t a l o u s a r v i o m e n e t t e l y j ä + t a l o u s a r v i o m e n e t t e l y l l e + t a l o u s a r v i o m e n e t t e l y l l ä + t a l o u s a r v i o m e n e t t e l y l t ä + t a l o u s a r v i o m e n e t t e l y m m e + t a l o u s a r v i o m e n e t t e l y n + t a l o u s a r v i o m e n e t t e l y n s ä + t a l o u s a r v i o m e n e t t e l y s s ä + t a l o u s a r v i o m e n e t t e l y s s ä m m e + t a l o u s a r v i o m e n e t t e l y s t ä + t a l o u s a r v i o m e n e t t e l y t + t a l o u s a r v i o m e n e t t e l y y n + t a l o u s a r v i o m e n e t t e l y ä + t a l o u s a r v i o m e n e t t e l y ä m m e + t a l o u s a r v i o m e n o i n a + t a l o u s a r v i o m e n o i s t a + t a l o u s a r v i o m e n o j a + t a l o u s a r v i o m e n o j a a n + t a l o u s a r v i o m e n o j e n + t a l o u s a r v i o m e n o k s i + t a l o u s a r v i o m e n o t + t a l o u s a r v i o m i e l e s s ä + t a l o u s a r v i o m i e t i n n ö s s ä + t a l o u s a r v i o m i e t i n n ö s t ä + t a l o u s a r v i o m i e t i n t ö + t a l o u s a r v i o m u l l i s t u s t a + t a l o u s a r v i o m u u t o k s e n + t a l o u s a r v i o m ä ä r ä r a h a + t a l o u s a r v i o m ä ä r ä r a h a a n + t a l o u s a r v i o m ä ä r ä r a h a m m e + t a l o u s a r v i o m ä ä r ä r a h a n + t a l o u s a r v i o m ä ä r ä r a h a t + t a l o u s a r v i o m ä ä r ä r a h o i h i n + t a l o u s a r v i o m ä ä r ä r a h o i k s i + t a l o u s a r v i o m ä ä r ä r a h o i l l e + t a l o u s a r v i o m ä ä r ä r a h o i n + t a l o u s a r v i o m ä ä r ä r a h o i s t a + t a l o u s a r v i o m ä ä r ä r a h o j a + t a l o u s a r v i o m ä ä r ä r a h o j e n + t a l o u s a r v i o m ä ä r ä y k s i ä + t a l o u s a r v i o n + t a l o u s a r v i o n e u v o s t o n + t a l o u s a r v i o n e u v o t t e l u i d e n + t a l o u s a r v i o n e u v o t t e l u i h i n + t a l o u s a r v i o n e u v o t t e l u i s s a + t a l o u s a r v i o n e u v o t t e l u i s t a + t a l o u s a r v i o n e u v o t t e l u i t a + t a l o u s a r v i o n e u v o t t e l u j a + t a l o u s a r v i o n e u v o t t e l u j e n + t a l o u s a r v i o n e u v o t t e l u m m e + t a l o u s a r v i o n e u v o t t e l u t + t a l o u s a r v i o n n e + t a l o u s a r v i o n s a + t a l o u s a r v i o n v a l v o n t a v a l i o k u n t a a + t a l o u s a r v i o n v a l v o n t a v a l i o k u n t a n n e + t a l o u s a r v i o n ä k e m y s + t a l o u s a r v i o n ä k y m i e m m e + t a l o u s a r v i o n ä k y m i e n + t a l o u s a r v i o n ä k y m i s s ä + t a l o u s a r v i o n ä k y m i s t ä + t a l o u s a r v i o n ä k y m i ä + t a l o u s a r v i o n ä k y m ä t + t a l o u s a r v i o n ä k ö k o h d a t + t a l o u s a r v i o n ä k ö k o h t i a + t a l o u s a r v i o n ä k ö k o h t i i n + t a l o u s a r v i o o n + t a l o u s a r v i o o n k i n + t a l o u s a r v i o o n s a + t a l o u s a r v i o p a i n e e t + t a l o u s a r v i o p a i n e i t a + t a l o u s a r v i o p a k e t i n + t a l o u s a r v i o p a k e t t i + t a l o u s a r v i o p a k e t t i i n + t a l o u s a r v i o p e l i n + t a l o u s a r v i o p e r i a a t t e e t + t a l o u s a r v i o p e r i a a t t e i d e n + t a l o u s a r v i o p e r i a a t t e i s t a + t a l o u s a r v i o p e r i a a t t e i t a + t a l o u s a r v i o p e r u s t a + t a l o u s a r v i o p o l i t i i k a l l a + t a l o u s a r v i o p o l i t i i k a l l e + t a l o u s a r v i o p o l i t i i k a n + t a l o u s a r v i o p o l i t i i k a s s a + t a l o u s a r v i o p o l i t i i k a s t a + t a l o u s a r v i o p o l i t i i k k a + t a l o u s a r v i o p o l i t i i k k a a + t a l o u s a r v i o p o l i t i i k k a a m m e + t a l o u s a r v i o p o l i t i i k k a a n + t a l o u s a r v i o p o l i t i i k k a a n s a + t a l o u s a r v i o p o l i t i i k k a m m e + t a l o u s a r v i o p o l i t i i k k o j a + t a l o u s a r v i o p o l i t i i k k o j e n + t a l o u s a r v i o p o n n i s t e l u j a + t a l o u s a r v i o p o n n i s t e l u t + t a l o u s a r v i o p r o s e s s e j a + t a l o u s a r v i o p r o s e s s i + t a l o u s a r v i o p r o s e s s i a + t a l o u s a r v i o p r o s e s s i e n + t a l o u s a r v i o p r o s e s s i i n + t a l o u s a r v i o p r o s e s s i n + t a l o u s a r v i o p r o s e s s i s s a + t a l o u s a r v i o p u i t t e e t + t a l o u s a r v i o p u i t t e i t a + t a l o u s a r v i o p y r k i m y k s e t + t a l o u s a r v i o p ä ä t ö k s e n + t a l o u s a r v i o p ä ä t ö k s e t + t a l o u s a r v i o p ä ä t ö k s i i n + t a l o u s a r v i o p ä ä t ö k s i ä + t a l o u s a r v i o r a h o i t u k s e n + t a l o u s a r v i o r a h o i t u s + t a l o u s a r v i o r a h o i t u s t a + t a l o u s a r v i o r a j o i t t e e t + t a l o u s a r v i o r a j o i t t e i d e n + t a l o u s a r v i o r a j o i t t e i s t a + t a l o u s a r v i o r a j o i t t e i t a + t a l o u s a r v i o r a j o i t u k s e t + t a l o u s a r v i o r a j o i t u k s i a + t a l o u s a r v i o r a j o i t u k s i i n + t a l o u s a r v i o r a j o i t u k s i s t a + t a l o u s a r v i o r a j o i t u s t e n + t a l o u s a r v i o r a j o j a + t a l o u s a r v i o r a k e n n e + t a l o u s a r v i o r a k e n n e t t a + t a l o u s a r v i o r a k e n t e e n + t a l o u s a r v i o r a k e n t e e s e e n + t a l o u s a r v i o r a k e n t e e s s a + t a l o u s a r v i o r a k e n t e e t + t a l o u s a r v i o r a s i t e t t a + t a l o u s a r v i o r a t k a i s u + t a l o u s a r v i o r a t k a i s u a + t a l o u s a r v i o r a t k a i s u j a + t a l o u s a r v i o r e s u r s s i e n + t a l o u s a r v i o r e s u r s s i t + t a l o u s a r v i o r i s k i t + t a l o u s a r v i o r i v e i l l ä + t a l o u s a r v i o r u t i i n i a + t a l o u s a r v i o r y h m ä ä + t a l o u s a r v i o s e l i t y k s e t + t a l o u s a r v i o s i i r r o i s t a + t a l o u s a r v i o s i t o u m u k s e l l e + t a l o u s a r v i o s i t o u m u k s e n + t a l o u s a r v i o s i t o u m u k s e t + t a l o u s a r v i o s i t o u m u k s i a + t a l o u s a r v i o s i t o u m u k s i l l a + t a l o u s a r v i o s i t o u m u k s i s t a + t a l o u s a r v i o s i t o u m u s t e m m e + t a l o u s a r v i o s i t o u m u s t e n + t a l o u s a r v i o s l a n g i + t a l o u s a r v i o s o p i m u k s e l l a + t a l o u s a r v i o s o p i m u k s e n + t a l o u s a r v i o s o p i m u s + t a l o u s a r v i o s o p i m u s t a + t a l o u s a r v i o s o p i m u s t e n + t a l o u s a r v i o s s a + t a l o u s a r v i o s s a m m e + t a l o u s a r v i o s t a + t a l o u s a r v i o s t a a n + t a l o u s a r v i o s t r a t e g i a + t a l o u s a r v i o s t r a t e g i a a + t a l o u s a r v i o s t r a t e g i a n + t a l o u s a r v i o s t r a t e g i o i d e n + t a l o u s a r v i o s u m m a + t a l o u s a r v i o s u u n n i t e l m a + t a l o u s a r v i o s u u n n i t e l m a a + t a l o u s a r v i o s u u n n i t e l m a a n + t a l o u s a r v i o s u u n n i t e l m a n + t a l o u s a r v i o s u u n n i t e l m a s s a + t a l o u s a r v i o s u u n n i t e l m a t + t a l o u s a r v i o s u u n n i t e l m i e n + t a l o u s a r v i o s u u n n i t e l m i s s a + t a l o u s a r v i o s u u n n i t t e l u a + t a l o u s a r v i o s u u n n i t t e l u s s a + t a l o u s a r v i o s u u n n i t t e l u u n + t a l o u s a r v i o s u u n t a v i i v o j e n + t a l o u s a r v i o s ä ä d ö s t e n + t a l o u s a r v i o s ä ä n n ö k s e t + t a l o u s a r v i o s ä ä n n ö k s i ä + t a l o u s a r v i o s ä ä s t ö i h i n + t a l o u s a r v i o s ä ä s t ö j e n + t a l o u s a r v i o s ä ä s t ö j ä + t a l o u s a r v i o s ä ä s t ö ä + t a l o u s a r v i o t + t a l o u s a r v i o t a + t a l o u s a r v i o t a a k k a a + t a l o u s a r v i o t a a n + t a l o u s a r v i o t a k i n + t a l o u s a r v i o t a k u i t a + t a l o u s a r v i o t a k u u + t a l o u s a r v i o t a k u u n + t a l o u s a r v i o t a p a h t u m a + t a l o u s a r v i o t a r k i s t u k s e t + t a l o u s a r v i o t a r k i s t u s + t a l o u s a r v i o t a r k i s t u s t a + t a l o u s a r v i o t a r p e e t + t a l o u s a r v i o t a s a p a i n o a + t a l o u s a r v i o t a s o + t a l o u s a r v i o t a s o l l a + t a l o u s a r v i o t a s o n + t a l o u s a r v i o t a v o i t t e e t + t a l o u s a r v i o t a v o i t t e i d e n + t a l o u s a r v i o t a v o i t t e i s t a + t a l o u s a r v i o t e k i j ä t + t a l o u s a r v i o t e k s t e i s t ä + t a l o u s a r v i o t e m p p u j a + t a l o u s a r v i o t e m p u i l l a + t a l o u s a r v i o t e r m i n o l o g i a a + t a l o u s a r v i o t i e t o j e n + t a l o u s a r v i o t i l a n n e + t a l o u s a r v i o t i l a n n e t t a + t a l o u s a r v i o t i l a n t e e n + t a l o u s a r v i o t i l a n t e e s s a + t a l o u s a r v i o t i l a n t e e s t a + t a l o u s a r v i o t i l e i s s ä + t a l o u s a r v i o t o i m e k s i a n t o + t a l o u s a r v i o t o i m e n p i t e e t + t a l o u s a r v i o t o i m e t + t a l o u s a r v i o t o i m i a + t a l o u s a r v i o t o i m i l l a + t a l o u s a r v i o t o i m i l l e + t a l o u s a r v i o t o i m i s s a m m e + t a l o u s a r v i o t o i m i s t a + t a l o u s a r v i o t u e k s i + t a l o u s a r v i o t u e l l a + t a l o u s a r v i o t u e l l e + t a l o u s a r v i o t u e n + t a l o u s a r v i o t u e s t a + t a l o u s a r v i o t u e t + t a l o u s a r v i o t u k e a + t a l o u s a r v i o t u k e e n + t a l o u s a r v i o t u k e n a + t a l o u s a r v i o t u k e n s a + t a l o u s a r v i o t u k i + t a l o u s a r v i o t u k i a + t a l o u s a r v i o t u k i m e k a n i s m i a + t a l o u s a r v i o t u k i o h j e l m i a + t a l o u s a r v i o t u l o i s t a + t a l o u s a r v i o t u l o j e n + t a l o u s a r v i o t y ö n + t a l o u s a r v i o t y ö s s ä + t a l o u s a r v i o u l o t t u v u u d e n + t a l o u s a r v i o u l o t t u v u u d e s t a + t a l o u s a r v i o u u d i s t u k s e e n + t a l o u s a r v i o u u d i s t u k s e s s a + t a l o u s a r v i o u u d i s t u k s e s t a + t a l o u s a r v i o u u d i s t u s + t a l o u s a r v i o u u d i s t u s o h j e l m i e n + t a l o u s a r v i o u u d i s t u s t a + t a l o u s a r v i o u u d i s t u s t e n + t a l o u s a r v i o v a a t i m u k s e t + t a l o u s a r v i o v a a t i m u k s i a + t a l o u s a r v i o v a a t i m u s t e n + t a l o u s a r v i o v a i k u t u k s e s t a + t a l o u s a r v i o v a i k u t u k s e t + t a l o u s a r v i o v a i k u t u k s i a + t a l o u s a r v i o v a i k u t u k s i s t a + t a l o u s a r v i o v a i k u t u s + t a l o u s a r v i o v a i k u t u s t a + t a l o u s a r v i o v a j e e n + t a l o u s a r v i o v a j e e n s a + t a l o u s a r v i o v a j e e s t a + t a l o u s a r v i o v a j e e t + t a l o u s a r v i o v a j e t t a + t a l o u s a r v i o v a j e t t a a n + t a l o u s a r v i o v a l i o k u n n a l t a + t a l o u s a r v i o v a l i o k u n n a n + t a l o u s a r v i o v a l i o k u n n a s s a + t a l o u s a r v i o v a l i o k u n t a + t a l o u s a r v i o v a l t a a + t a l o u s a r v i o v a l t u u d e t + t a l o u s a r v i o v a l t u u k s i a m m e + t a l o u s a r v i o v a l t u u k s i e n + t a l o u s a r v i o v a l v o n n a n + t a l o u s a r v i o v a l v o n t a + t a l o u s a r v i o v a l v o n t a a + t a l o u s a r v i o v a r a n t o + t a l o u s a r v i o v a r a t + t a l o u s a r v i o v a r a u k s e n + t a l o u s a r v i o v a r a u k s e t + t a l o u s a r v i o v a r a u k s i a + t a l o u s a r v i o v a r a u k s i s t a + t a l o u s a r v i o v a r o i h i n + t a l o u s a r v i o v a r o i l l a + t a l o u s a r v i o v a r o i l l a m m e + t a l o u s a r v i o v a r o i l l e + t a l o u s a r v i o v a r o i l t a + t a l o u s a r v i o v a r o i s t a + t a l o u s a r v i o v a r o j a + t a l o u s a r v i o v a r o j e n + t a l o u s a r v i o v a s t a a v i a + t a l o u s a r v i o v a s t u u + t a l o u s a r v i o v a s t u u n + t a l o u s a r v i o v a s t u u t a + t a l o u s a r v i o v e l v o i t t e i d e n + t a l o u s a r v i o v e l v o i t t e i l l e + t a l o u s a r v i o v e l v o i t t e i t a + t a l o u s a r v i o v e l v o i t t e i t a a n + t a l o u s a r v i o v i r a n o m a i n e n + t a l o u s a r v i o v i r a n o m a i s e l l e + t a l o u s a r v i o v i r a n o m a i s e n + t a l o u s a r v i o v i r a n o m a i s e n a + t a l o u s a r v i o v i r a n o m a i s i a + t a l o u s a r v i o v i r a n o m a i s i l l a + t a l o u s a r v i o v i r a n o m a i s t a + t a l o u s a r v i o v i r a n o m a i s t e n + t a l o u s a r v i o v u o d e n + t a l o u s a r v i o v u o s i + t a l o u s a r v i o v u o t e n a + t a l o u s a r v i o v u o t t a + t a l o u s a r v i o v ä h e n n y k s i n + t a l o u s a r v i o v ä l i n e + t a l o u s a r v i o v ä l i n e e s t ä + t a l o u s a r v i o v ä l i n e e t + t a l o u s a r v i o v ä l i n e i d e n + t a l o u s a r v i o v ä l i n e i s i i n + t a l o u s a r v i o v ä l i n e i t ä + t a l o u s a r v i o y h d i s t e l m i s t ä + t a l o u s a r v i o y l i j ä ä m ä t + t a l o u s a r v i o ä ä n e s t y k s e n + t a l o u s a r v i o ä ä n e s t y k s e s s ä + t a l o u s a r v i o ä ä n e s t y s + t a l o u s a r v o m e n e t t e l y + t a l o u s a s i a n t u n t i j a n a + t a l o u s a s i a n t u n t i j a t + t a l o u s a s i a n t u n t i j o i d e n + t a l o u s a s i a t + t a l o u s a s i o i d e n + t a l o u s a s i o i d e n s a + t a l o u s a s i o i h i n + t a l o u s a s i o i l l e + t a l o u s a s i o i s s a + t a l o u s a s i o i s t a + t a l o u s a s i o i t a + t a l o u s a s k a r e i s t a + t a l o u s a s p e k t i l l e + t a l o u s a v u n + t a l o u s a v u s t a + t a l o u s b o i k o t i l l a + t a l o u s b o i k o t t e j a + t a l o u s d e m o k r a t i a + t a l o u s e d e l l y t y k s i l l e + t a l o u s e l ä m ä + t a l o u s e l ä m ä l l e + t a l o u s e l ä m ä m m e + t a l o u s e l ä m ä n + t a l o u s e l ä m ä s s ä + t a l o u s e l ä m ä ä + t a l o u s e l ä m ä ä m m e + t a l o u s e l ä m ä ä n + t a l o u s e n n u s t e + t a l o u s e n n u s t e e m m e + t a l o u s e n n u s t e e s t a m m e + t a l o u s e n n u s t e e t + t a l o u s e n n u s t e i d e n + t a l o u s e n n u s t e i s i i n + t a l o u s e n n u s t e i s s a + t a l o u s e n n u s t e i s t a + t a l o u s e n n u s t e i t a + t a l o u s e n n u s t e m a l l e j a a n + t a l o u s e s t e i d e n + t a l o u s e t u j e n + t a l o u s f i l o s o f i a + t a l o u s f o o r u m i + t a l o u s f o o r u m i a + t a l o u s f o o r u m i i n + t a l o u s f o o r u m i l l e + t a l o u s f o o r u m i n + t a l o u s f o o r u m i s s a + t a l o u s f o o r u m i s t a + t a l o u s g u r u + t a l o u s g u r u i n a + t a l o u s h a a s t e e t + t a l o u s h a a s t e i d e n + t a l o u s h a a s t e i s i i n + t a l o u s h a i d e n + t a l o u s h a l l i n n o i n n i n + t a l o u s h a l l i n n o k s i + t a l o u s h a l l i n n o l l a + t a l o u s h a l l i n n o l l e + t a l o u s h a l l i n n o l t a + t a l o u s h a l l i n n o n + t a l o u s h a l l i n n o s s a + t a l o u s h a l l i n n o s t a + t a l o u s h a l l i n t a j ä r j e s t e l m ä + t a l o u s h a l l i n t a t o i m i a + t a l o u s h a l l i n t o + t a l o u s h a l l i n t o a + t a l o u s h a l l i n t o a a n + t a l o u s h a l l i n t o a l u e e n + t a l o u s h a l l i n t o k e s k u s t e l u k s i + t a l o u s h a l l i n t o o n + t a l o u s h a l l i n t o p a k e t i n + t a l o u s h a l l i n t o p a k e t t i + t a l o u s h a l l i n t o u u d i s t u k s e n + t a l o u s h a l l i n t o v a l m i u d e t + t a l o u s h a l l i n t o v i r a s t o j e n + t a l o u s h a l l i t u k s e n + t a l o u s h a l l i t u k s e s t a + t a l o u s h a l l i t u s + t a l o u s h a l l i t u s t a + t a l o u s h a n k e + t a l o u s h e n k i l ö s t ö + t a l o u s h i s t o r i a + t a l o u s h i s t o r i a a + t a l o u s h i s t o r i a n + t a l o u s h i s t o r i a s s a + t a l o u s h u n a j a k s i + t a l o u s h u o l e t + t a l o u s h u o l i a + t a l o u s h u o l i i n + t a l o u s h y ö d y k e + t a l o u s h y ö d y k k e i n ä + t a l o u s h y ö d y k k e i t ä + t a l o u s h y ö t y i h i n + t a l o u s h ä i r i ö i d e n + t a l o u s i d e o l o g i a + t a l o u s i d e o l o g i a n + t a l o u s i h a n t e e k s i + t a l o u s i h m e + t a l o u s i h m e e m m e + t a l o u s i h m e e s e e n + t a l o u s i h m e e s t ä + t a l o u s i h m e i s t ä + t a l o u s i h m e t t ä + t a l o u s i l m a p i i r i s s ä + t a l o u s i l m a s t o + t a l o u s i l m a s t o n + t a l o u s i m p e r i a l i s m i s t a + t a l o u s i n d i k a a t t o r i e n + t a l o u s i n f r a s t r u k t u u r i t + t a l o u s i n t e g r a a t i o j ä r j e s t e l m i ä + t a l o u s i n t e g r a a t i o j ä r j e s t ö j e n + t a l o u s i n t e g r a a t i o j ä r j e s t ö ä + t a l o u s i n t r e s s e i s t ä + t a l o u s i n t r e s s i e n + t a l o u s i n t r e s s i t + t a l o u s j o h t a j a + t a l o u s j o h t a j a k s i + t a l o u s j o h t a j a n + t a l o u s j o h t a j i e n + t a l o u s j o h t o + t a l o u s j o u r n a l i s m i + t a l o u s j o u r n a l i s m i n + t a l o u s j u l k a i s u u n + t a l o u s j ä r j e s t e l m i e m m e + t a l o u s j ä r j e s t e l m i e n + t a l o u s j ä r j e s t e l m i i n + t a l o u s j ä r j e s t e l m i l t ä + t a l o u s j ä r j e s t e l m i ä + t a l o u s j ä r j e s t e l m ä + t a l o u s j ä r j e s t e l m ä l l e + t a l o u s j ä r j e s t e l m ä l l ä + t a l o u s j ä r j e s t e l m ä m m e + t a l o u s j ä r j e s t e l m ä n + t a l o u s j ä r j e s t e l m ä n n e + t a l o u s j ä r j e s t e l m ä n s ä + t a l o u s j ä r j e s t e l m ä n ä + t a l o u s j ä r j e s t e l m ä s s ä + t a l o u s j ä r j e s t e l m ä s t ä + t a l o u s j ä r j e s t e l m ä t + t a l o u s j ä r j e s t e l m ä ä + t a l o u s j ä r j e s t e l m ä ä m m e + t a l o u s j ä r j e s t e l m ä ä n + t a l o u s j ä r j e s t e l y i h i n + t a l o u s j ä r j e s t e l y j e n + t a l o u s j ä r j e s t y k s e e n + t a l o u s j ä r j e s t y k s e l l e + t a l o u s j ä r j e s t y k s e n + t a l o u s j ä r j e s t y s + t a l o u s j ä r j e s t y s t ä + t a l o u s j ä r j e s t ö + t a l o u s j ä r j e s t ö j e n + t a l o u s j ä t e t t ä + t a l o u s j ä t i s t ä + t a l o u s j ä t t e e n + t a l o u s j ä t t e e s t ä + t a l o u s j ä t t e i d e n + t a l o u s j ä t t i + t a l o u s j ä t t i l ä i n e n + t a l o u s j ä t t i l ä i s i s t ä + t a l o u s k a a o k s e n + t a l o u s k a n n u s t i m i a + t a l o u s k a n n u s t i m i s t a + t a l o u s k a p i t a l i s t e j a + t a l o u s k a s v u + t a l o u s k a s v u a + t a l o u s k a s v u a a n + t a l o u s k a s v u a l o i t t e i s t a + t a l o u s k a s v u a l u e e k s i + t a l o u s k a s v u a m m e + t a l o u s k a s v u a s t e + t a l o u s k a s v u a s t e e t + t a l o u s k a s v u e n n u s t e i t a + t a l o u s k a s v u l l a + t a l o u s k a s v u l l e + t a l o u s k a s v u l l e k i n + t a l o u s k a s v u l l e m m e + t a l o u s k a s v u l u v u i l l a + t a l o u s k a s v u m a h d o l l i s u u k s i e n + t a l o u s k a s v u m m e + t a l o u s k a s v u n + t a l o u s k a s v u n a + t a l o u s k a s v u n k i n + t a l o u s k a s v u n ä k y m i e n + t a l o u s k a s v u s s a + t a l o u s k a s v u s s a a n + t a l o u s k a s v u s t a + t a l o u s k a s v u s t a a n + t a l o u s k a s v u s t r a t e g i a + t a l o u s k a s v u s t r a t e g i a n + t a l o u s k a s v u t a v o i t t e e t + t a l o u s k a s v u u n + t a l o u s k a t a s t r o f i s t a + t a l o u s k a u p p a a + t a l o u s k e h i t y k s e e n + t a l o u s k e h i t y k s e l l e + t a l o u s k e h i t y k s e l l e m m e + t a l o u s k e h i t y k s e l l ä + t a l o u s k e h i t y k s e l t ä + t a l o u s k e h i t y k s e l t ä ä n + t a l o u s k e h i t y k s e m m e + t a l o u s k e h i t y k s e n + t a l o u s k e h i t y k s e n k i n + t a l o u s k e h i t y k s e n s ä + t a l o u s k e h i t y k s e s s ä + t a l o u s k e h i t y k s e s s ä ä n + t a l o u s k e h i t y k s e s t ä + t a l o u s k e h i t y k s i i n + t a l o u s k e h i t y s + t a l o u s k e h i t y s a l u e e t + t a l o u s k e h i t y s a l u e i s i i n + t a l o u s k e h i t y s m a l l i i n + t a l o u s k e h i t y s m a l l i m m e + t a l o u s k e h i t y s p o l i t i i k a s t a + t a l o u s k e h i t y s p o t e n t i a a l i a a n + t a l o u s k e h i t y s p r o s e s s i i n + t a l o u s k e h i t y s s t r a t e g i a a + t a l o u s k e h i t y s t ä + t a l o u s k e h i t y s t ä m m e + t a l o u s k e h i t y s t ä ä n + t a l o u s k e h y k s e e n + t a l o u s k e h y s + t a l o u s k e i n o i l l a + t a l o u s k e r h o a + t a l o u s k e r t o m u k s e l l e + t a l o u s k e r t o m u k s i i n + t a l o u s k e r t o m u s + t a l o u s k e s k i t t y m i ä + t a l o u s k e s k u k s e s t a + t a l o u s k e s k u k s i a + t a l o u s k e s k u k s i i n + t a l o u s k e s k u k s i l l e + t a l o u s k e s k u k s i s s a + t a l o u s k e s k u k s i s t a + t a l o u s k e s k u s t e l u + t a l o u s k e s k u s t e l u i s s a + t a l o u s k e s k u s t e l u t + t a l o u s k i e r r o n + t a l o u s k i l p a i l u a + t a l o u s k i l p a i l u s t a + t a l o u s k l u b i + t a l o u s k o m i s s i o + t a l o u s k o m i s s i o n + t a l o u s k o m i s s i o o n + t a l o u s k o m i s s i o s s a + t a l o u s k o m i s s i o t a + t a l o u s k o m i t e a + t a l o u s k o m i t e a s s a + t a l o u s k o m m e n t a a t t o r e i l l a + t a l o u s k o n e + t a l o u s k o n e t t a + t a l o u s k o n f e r e n s s i + t a l o u s k o n s e r n i t + t a l o u s k o o r d i n o i n t i a + t a l o u s k r i i s e i h i n + t a l o u s k r i i s e i l t ä + t a l o u s k r i i s e i n ä + t a l o u s k r i i s e i s t ä + t a l o u s k r i i s e j ä + t a l o u s k r i i s i + t a l o u s k r i i s i e n + t a l o u s k r i i s i i n + t a l o u s k r i i s i k i n + t a l o u s k r i i s i k s i + t a l o u s k r i i s i l l e + t a l o u s k r i i s i l l ä + t a l o u s k r i i s i l t ä + t a l o u s k r i i s i m m e + t a l o u s k r i i s i n + t a l o u s k r i i s i n s ä + t a l o u s k r i i s i s s ä + t a l o u s k r i i s i s t ä + t a l o u s k r i i s i s u u n n i t e l m a n + t a l o u s k r i i s i t + t a l o u s k r i i s i ä + t a l o u s k r i t e e r i n s ä + t a l o u s k u l t t u u r i l l e + t a l o u s k u m p p a n e i d e m m e + t a l o u s k u m p p a n e i d e n + t a l o u s k u m p p a n e i l l a m m e + t a l o u s k u m p p a n e i s t a + t a l o u s k u m p p a n e i t a + t a l o u s k u m p p a n e i t a m m e + t a l o u s k u m p p a n i + t a l o u s k u m p p a n i e m m e + t a l o u s k u m p p a n i m a i d e n + t a l o u s k u m p p a n i m m e + t a l o u s k u m p p a n i n + t a l o u s k u m p p a n i n a + t a l o u s k u m p p a n i t + t a l o u s k u m p p a n u s s o p i m u k s i k s i + t a l o u s k u m p p a n u s s o p i m u s t e n + t a l o u s k u m p p a n u u d e l l a + t a l o u s k u m p p a n u u d e n + t a l o u s k u m p p a n u u d e s t a + t a l o u s k u m p p a n u u s + t a l o u s k u m p p a n u u s j ä r j e s t e l y j ä + t a l o u s k u m p p a n u u s n e u v o t t e l u i d e n + t a l o u s k u m p p a n u u s o h j e l m i e n + t a l o u s k u m p p a n u u s s o p i m u k s e e n + t a l o u s k u m p p a n u u s s o p i m u k s e k s i + t a l o u s k u m p p a n u u s s o p i m u k s e l l a + t a l o u s k u m p p a n u u s s o p i m u k s e n + t a l o u s k u m p p a n u u s s o p i m u k s e s t a + t a l o u s k u m p p a n u u s s o p i m u k s e t + t a l o u s k u m p p a n u u s s o p i m u k s i a + t a l o u s k u m p p a n u u s s o p i m u k s i e n + t a l o u s k u m p p a n u u s s o p i m u k s i i n + t a l o u s k u m p p a n u u s s o p i m u k s i l l a + t a l o u s k u m p p a n u u s s o p i m u k s i l l e + t a l o u s k u m p p a n u u s s o p i m u k s i s s a + t a l o u s k u m p p a n u u s s o p i m u k s i s t a + t a l o u s k u m p p a n u u s s o p i m u s + t a l o u s k u m p p a n u u s s o p i m u s n e u v o t t e l u i h i n + t a l o u s k u m p p a n u u s s o p i m u s n e u v o t t e l u i s s a + t a l o u s k u m p p a n u u s s o p i m u s n e u v o t t e l u j a + t a l o u s k u m p p a n u u s s o p i m u s p r o s e s s i n + t a l o u s k u m p p a n u u s s o p i m u s t a + t a l o u s k u m p p a n u u s s o p i m u s t e n + t a l o u s k u m p p a n u u s s o p i m u s v a l t i o i d e n + t a l o u s k u m p p a n u u t e e n + t a l o u s k u m p p a n u u t t a + t a l o u s k u p l a a + t a l o u s k u r i + t a l o u s k u r i a + t a l o u s k u r i m u k s e n + t a l o u s k u r i n + t a l o u s k u s t a n n u k s e t + t a l o u s k u s t a n n u k s i s t a + t a l o u s k u u r i + t a l o u s k u u r i n n e + t a l o u s k y s y m y k s e s s ä + t a l o u s k y s y m y k s e s t ä + t a l o u s k y s y m y k s e t + t a l o u s k y s y m y k s i l l e + t a l o u s k y s y m y k s i s s ä + t a l o u s k y s y m y k s i s t ä + t a l o u s k y s y m y k s i ä + t a l o u s k y s y m y s + t a l o u s k y s y m y s t e n + t a l o u s k ä s i t t e e n + t a l o u s k ä y t t ä y t y m i s t ä + t a l o u s k ä y t t ö ö n + t a l o u s k ä y t ä n n ö t + t a l o u s k ä y t ö l l ä + t a l o u s k ä y t ö n + t a l o u s l a i n + t a l o u s l a i n s ä ä d ä n n ö n + t a l o u s l a i n s ä ä d ä n t ö + t a l o u s l a i n s ä ä d ä n t ö m m e + t a l o u s l a i n s ä ä d ä n t ö ä + t a l o u s l a m a + t a l o u s l a m a a + t a l o u s l a m a a n + t a l o u s l a m a n + t a l o u s l a m a s t a + t a l o u s l a m a t + t a l o u s l a s k e l m a t + t a l o u s l a s k u j a + t a l o u s l a s k u n + t a l o u s l e h d i s s ä + t a l o u s l i b e r a l i s m i + t a l o u s l i b e r a l i s m i a + t a l o u s l i b e r a l i s m i n + t a l o u s l i i t o k s i + t a l o u s l i i t o l l a + t a l o u s l i i t o l l e + t a l o u s l i i t o n + t a l o u s l i i t o s s a + t a l o u s l i i t o s t a + t a l o u s l i i t t o + t a l o u s l i i t t o a + t a l o u s l i i t t o o n + t a l o u s l i n j o j a + t a l o u s l o g i i k k a a + t a l o u s l u k u n s a + t a l o u s l u k u t a i t o a + t a l o u s m a a i l m a + t a l o u s m a a i l m a l l e + t a l o u s m a a i l m a n + t a l o u s m a a i l m a s s a + t a l o u s m a a n t i e d e + t a l o u s m a a n t i e d e t t ä + t a l o u s m a a n t i e t e e n + t a l o u s m a h d e i l l e + t a l o u s m a h d e i s s a + t a l o u s m a h d e i s t a + t a l o u s m a h d i k s i + t a l o u s m a h d i l l e + t a l o u s m a h d i n + t a l o u s m a h d i t + t a l o u s m a h t e i h i n + t a l o u s m a h t e j a + t a l o u s m a h t i + t a l o u s m a h t i a + t a l o u s m a h t i e n + t a l o u s m a h t i m m e + t a l o u s m a h t i n a + t a l o u s m a h t i n s a + t a l o u s m a i s s a + t a l o u s m a i t o s u k l a a n + t a l o u s m a l l e i h i n + t a l o u s m a l l e i s s a + t a l o u s m a l l e i s t a + t a l o u s m a l l e j a + t a l o u s m a l l i + t a l o u s m a l l i a + t a l o u s m a l l i a a n + t a l o u s m a l l i e n + t a l o u s m a l l i i n + t a l o u s m a l l i l l e + t a l o u s m a l l i m m e + t a l o u s m a l l i n + t a l o u s m a l l i n a + t a l o u s m a l l i n n e + t a l o u s m a l l i s s a + t a l o u s m a l l i s s a m m e + t a l o u s m a l l i s t a + t a l o u s m a r k k i n o i d e n + t a l o u s m a r k k i n o i h i n + t a l o u s m a r k k i n o i l l a + t a l o u s m a r k k i n o i t a + t a l o u s m a r k k i n o i t a m m e + t a l o u s m e k a n i s m i + t a l o u s m e n e s t y k s e s t ä + t a l o u s m e n e s t y s + t a l o u s m e n e s t y s t ä + t a l o u s m e n o j a + t a l o u s m e n o t + t a l o u s m i e t i n t ö ä + t a l o u s m i n i s t e r e i d e n + t a l o u s m i n i s t e r e i l l e + t a l o u s m i n i s t e r e i t ä + t a l o u s m i n i s t e r i + t a l o u s m i n i s t e r i e n + t a l o u s m i n i s t e r i m m e + t a l o u s m i n i s t e r i n + t a l o u s m i n i s t e r i s t ä + t a l o u s m i n i s t e r i t + t a l o u s m i n i s t e r i ö i s t ä + t a l o u s m i n i s t e r i ö n + t a l o u s m i n i s t e r i ö s s ä + t a l o u s m i n i s t e r i ö ö n + t a l o u s m u l l i s t u s t a + t a l o u s m u u t o k s e e n + t a l o u s m u u t o k s i a + t a l o u s m y l l e r r y k s e s s ä + t a l o u s m y r s k y l t ä + t a l o u s m y r s k y s s ä + t a l o u s n a t i o n a l i s m i + t a l o u s n e u v o s t o + t a l o u s n e u v o s t o a + t a l o u s n e u v o s t o l l e + t a l o u s n e u v o s t o n + t a l o u s n e u v o s t o s s a + t a l o u s n e u v o s t o s t a + t a l o u s n o r m e j a + t a l o u s n ä k e m y k s e s t ä + t a l o u s n ä k y m i e n + t a l o u s n ä k y m i i n + t a l o u s n ä k y m i s s ä + t a l o u s n ä k y m i s t ä + t a l o u s n ä k y m i ä + t a l o u s n ä k y m i ä m m e + t a l o u s n ä k y m ä n + t a l o u s n ä k y m ä s o p i m u s + t a l o u s n ä k y m ä t + t a l o u s n ä k y m ä ä + t a l o u s n ä k ö k o h d a n + t a l o u s n ä k ö k o h d a t + t a l o u s n ä k ö k o h t i a + t a l o u s n ä k ö k o h t i e n + t a l o u s n ä k ö k o h t i i n + t a l o u s n ä y t t ä m ö l l ä + t a l o u s o h j a u k s e n + t a l o u s o h j a u s j ä r j e s t e l m ä n + t a l o u s o h j e e t + t a l o u s o h j e l m a + t a l o u s o h j e l m a a + t a l o u s o h j e l m a a n + t a l o u s o h j e l m a a n s a + t a l o u s o h j e l m a k o m i t e a l l e + t a l o u s o h j e l m a n + t a l o u s o h j e l m a s s a + t a l o u s o h j e l m a s t a + t a l o u s o h j e l m a t + t a l o u s o h j e l m i a + t a l o u s o h j e l m i i n + t a l o u s o i k e u d e n + t a l o u s o i k e u k s i e n + t a l o u s o i k e u t t a + t a l o u s o l o i l l e + t a l o u s o l o i s s a + t a l o u s o l o j e n + t a l o u s o l o s u h t e i d e n + t a l o u s o l o t + t a l o u s o n g e l m a + t a l o u s o n g e l m a n s a + t a l o u s o n g e l m a t + t a l o u s o n g e l m i a + t a l o u s o n g e l m i e m m e + t a l o u s o n g e l m i e n + t a l o u s o n g e l m i i n + t a l o u s o n g e l m i l l a + t a l o u s o n g e l m i l t a + t a l o u s o n g e l m i n e e n + t a l o u s o n g e l m i s s a + t a l o u s o n g e l m i s t a + t a l o u s o n n e t t o m u u k s i s t a + t a l o u s o p e i l l a + t a l o u s o p p i + t a l o u s o p p i i n + t a l o u s o r g a n i s a a t i o i h i n + t a l o u s o r g a n i s a a t i o i t a + t a l o u s o s a a m i s t a + t a l o u s o s a s t o + t a l o u s p a i n o t t e i s i m m a l t a + t a l o u s p a i n o t u k s e t + t a l o u s p a k e t i l l a + t a l o u s p a k e t i l l e + t a l o u s p a k e t i n + t a l o u s p a k e t i s t a + t a l o u s p a k e t t e j a + t a l o u s p a k e t t i + t a l o u s p a k o l a i s e t + t a l o u s p a k o l a i s i a + t a l o u s p a k o l a i s i l l e + t a l o u s p a k o l a i s i l t a + t a l o u s p a k o l a i s i n a + t a l o u s p a k o l a i s t e n + t a l o u s p a k o l a i s u u t e e n + t a l o u s p a k o t t e e t + t a l o u s p a k o t t e i d e n + t a l o u s p a k o t t e i l l a + t a l o u s p a k o t t e i l l e + t a l o u s p a k o t t e i n + t a l o u s p a k o t t e i s i i n + t a l o u s p a k o t t e i s s a + t a l o u s p a k o t t e i s t a + t a l o u s p a k o t t e i t a + t a l o u s p a l k i n n o n + t a l o u s p a p e r i + t a l o u s p e r i a a t t e i d e n + t a l o u s p e t o k s i a + t a l o u s p e t o s t e n + t a l o u s p i i r e i s s ä + t a l o u s p i i r i e n + t a l o u s p i l a r i e n + t a l o u s p o h j a n + t a l o u s p o h j a s t a + t a l o u s p o l i i t i k k o j e n + t a l o u s p o l i i t i k o t + t a l o u s p o l i i t t i n e n + t a l o u s p o l i i t t i s e e n + t a l o u s p o l i i t t i s e k s i + t a l o u s p o l i i t t i s e n + t a l o u s p o l i i t t i s e n a + t a l o u s p o l i i t t i s e s s a + t a l o u s p o l i i t t i s e s t a + t a l o u s p o l i i t t i s e s t i + t a l o u s p o l i i t t i s e t + t a l o u s p o l i i t t i s i a + t a l o u s p o l i i t t i s i i n + t a l o u s p o l i i t t i s i k s i + t a l o u s p o l i i t t i s i l l a + t a l o u s p o l i i t t i s i l l e + t a l o u s p o l i i t t i s i l t a + t a l o u s p o l i i t t i s i n + t a l o u s p o l i i t t i s i n a + t a l o u s p o l i i t t i s i s s a + t a l o u s p o l i i t t i s i s t a + t a l o u s p o l i i t t i s t a + t a l o u s p o l i i t t i s t e n + t a l o u s p o l i t i i k a k s i + t a l o u s p o l i t i i k a l l a + t a l o u s p o l i t i i k a l l e + t a l o u s p o l i t i i k a l t a + t a l o u s p o l i t i i k a n + t a l o u s p o l i t i i k a s s a + t a l o u s p o l i t i i k a s s a a n + t a l o u s p o l i t i i k a s s a m m e + t a l o u s p o l i t i i k a s s a n n e + t a l o u s p o l i t i i k a s t a + t a l o u s p o l i t i i k a s t a a n + t a l o u s p o l i t i i k a s t a m m e + t a l o u s p o l i t i i k a t + t a l o u s p o l i t i i k k a + t a l o u s p o l i t i i k k a a + t a l o u s p o l i t i i k k a a m m e + t a l o u s p o l i t i i k k a a n + t a l o u s p o l i t i i k k a a n s a + t a l o u s p o l i t i i k k a k i n + t a l o u s p o l i t i i k k a m m e + t a l o u s p o l i t i i k k a n n e + t a l o u s p o l i t i i k k a n s a + t a l o u s p o l i t i i k k o i h i n + t a l o u s p o l i t i i k k o j a + t a l o u s p o l i t i i k k o j a a n + t a l o u s p o l i t i i k k o j e m m e + t a l o u s p o l i t i i k k o j e n + t a l o u s p o l i t i i k k o j e n s a + t a l o u s p o l i t i i k o i d e n + t a l o u s p o l i t i i k o i d e n s a + t a l o u s p o l i t i i k o i l l a + t a l o u s p o l i t i i k o i s s a m m e + t a l o u s p o l i t i i k o i s t a + t a l o u s p o t e n t i a a l i + t a l o u s p o t e n t i a a l i i n + t a l o u s p o t e n t i a a l i n + t a l o u s p r o s e s s e i h i n + t a l o u s p r o s e s s e i s s a m m e + t a l o u s p r o s e s s i a + t a l o u s p r o s e s s i s s a + t a l o u s p u o l e l l a + t a l o u s p u o l i + t a l o u s p u o l t a + t a l o u s p ä ä l l i k k ö + t a l o u s p ä ä t ö s t e n + t a l o u s r a k e n n e + t a l o u s r a k e n n e t t a + t a l o u s r a k e n n e t t a a n + t a l o u s r a k e n t e e m m e + t a l o u s r a k e n t e e n + t a l o u s r a k e n t e e n s a + t a l o u s r a k e n t e e s e e n + t a l o u s r a k e n t e e s t a + t a l o u s r a k e n t e e s t a m m e + t a l o u s r a k e n t e i d e m m e + t a l o u s r a k e n t e i d e n + t a l o u s r a k e n t e i d e n s a + t a l o u s r a k e n t e i s s a m m e + t a l o u s r a k e n t e i s t a + t a l o u s r a k e n t e i t a + t a l o u s r a t k a i s u i s t a + t a l o u s r e a l i t e e t t i a + t a l o u s r e s u r s s e i h i n + t a l o u s r e s u r s s i n a + t a l o u s r i k o k s e n + t a l o u s r i k o k s e s t a + t a l o u s r i k o k s e t + t a l o u s r i k o k s i a + t a l o u s r i k o k s i s s a + t a l o u s r i k o k s i s t a + t a l o u s r i k o l l i n e n + t a l o u s r i k o l l i s t e n + t a l o u s r i k o l l i s u u d e n + t a l o u s r i k o l l i s u u s + t a l o u s r i k o l l i s u u t e e n + t a l o u s r i k o l l i s u u t t a + t a l o u s r i k o s p o l i i s i + t a l o u s r i k o s s y y t e + t a l o u s r i k o s t a + t a l o u s r i k o s t e n + t a l o u s r i k o s t u o m i o i s t u i m e n + t a l o u s r i k o s v i r a n o m a i s t e n + t a l o u s r i n t a m a l l a + t a l o u s r i s k i n + t a l o u s r i s k i t + t a l o u s r o m a h d u k s e e n + t a l o u s r o m a h d u k s e n + t a l o u s r o m a h d u s t e n + t a l o u s r y h m i e n + t a l o u s r y h m i i n + t a l o u s r y h m i t t y m i e n + t a l o u s r y h m i t t y m i i n + t a l o u s r y h m i t t y m i l l e + t a l o u s r y h m i t t y m ä + t a l o u s r y h m i t t y m ä t + t a l o u s r y h m i ä + t a l o u s s a a r r o n + t a l o u s s a a r r o s t a + t a l o u s s a a r r o t + t a l o u s s a a r t o + t a l o u s s a a r t o a + t a l o u s s a a r t o j e n + t a l o u s s a a r t o o n + t a l o u s s a l a i s u u k s i a + t a l o u s s e i k o i n + t a l o u s s e k a s o r t o + t a l o u s s e k t o r e i d e n + t a l o u s s e k t o r e i l l a + t a l o u s s e k t o r e i t a + t a l o u s s e k t o r i + t a l o u s s e k t o r i a + t a l o u s s e k t o r i l l a + t a l o u s s e k t o r i l l e + t a l o u s s e k t o r i n + t a l o u s s e k t o r i t + t a l o u s s i i r t o l a i s e n + t a l o u s s i i r t o l a i s i a + t a l o u s s i i r t o l a i s i s t a + t a l o u s s i i r t o l a i s t e n + t a l o u s s i v u i h i n + t a l o u s s i v u i l l a + t a l o u s s k a n d a a l e i h i n + t a l o u s s k a n d a a l e i s t a + t a l o u s s k a n d a a l i e n + t a l o u s s l a n g i s s a + t a l o u s s o d a n + t a l o u s s o d a s s a + t a l o u s s o d a s t a + t a l o u s s o k i n + t a l o u s s o p i m u k s e l l e + t a l o u s s o p i m u k s e t + t a l o u s s o p i m u k s i a + t a l o u s s o p i m u k s i i n + t a l o u s s o p i m u k s i l l e + t a l o u s s o p i m u k s i s s a + t a l o u s s o p i m u s + t a l o u s s o p i m u s t a + t a l o u s s o p i m u s t e n + t a l o u s s o s i o l o g i a + t a l o u s s o t a a + t a l o u s s o t a a n + t a l o u s s o t k u t + t a l o u s s t r a t e g i a + t a l o u s s t r a t e g i a a + t a l o u s s t r a t e g i a a n + t a l o u s s t r a t e g i a l l a + t a l o u s s t r a t e g i a m m e + t a l o u s s t r a t e g i a n + t a l o u s s t r a t e g i a s s a a n + t a l o u s s t r a t e g i a s t a + t a l o u s s t r a t e g i a t + t a l o u s s t r a t e g i n a + t a l o u s s t r a t e g i o i d e n + t a l o u s s t r a t e g i o i s t a + t a l o u s s t r a t e g i o i t a + t a l o u s s u h d a n t e e n + t a l o u s s u h d a n t e e s e e n + t a l o u s s u h d a n t e e s s a + t a l o u s s u h d a n t e e t + t a l o u s s u h d a n t e i d e n + t a l o u s s u h d a n t e i s i i n + t a l o u s s u h d a n t e i s s a + t a l o u s s u h d e + t a l o u s s u h t e e m m e + t a l o u s s u h t e e s e e n + t a l o u s s u h t e e s t a + t a l o u s s u h t e e t + t a l o u s s u h t e i d e m m e + t a l o u s s u h t e i d e n + t a l o u s s u h t e i l l a a n + t a l o u s s u h t e i l l e + t a l o u s s u h t e i s i i m m e + t a l o u s s u h t e i s i i n + t a l o u s s u h t e i s s a + t a l o u s s u h t e i s s a m m e + t a l o u s s u h t e i s t a + t a l o u s s u h t e i t a + t a l o u s s u h t e i t a a n + t a l o u s s u h t e i t a m m e + t a l o u s s u u n n i t e l m a + t a l o u s s u u n n i t e l m a a + t a l o u s s u u n n i t e l m a l l a + t a l o u s s u u n n i t e l m a n + t a l o u s s u u n n i t e l m a t + t a l o u s s u u n n i t e l m i i n s a + t a l o u s s u u n n i t t e l u + t a l o u s s u u n n i t t e l u a + t a l o u s s u u n n i t t e l u n + t a l o u s s u u n n i t t e l u s s a + t a l o u s s u u n n i t t e l u u n + t a l o u s s u u n t a u k s i s t a + t a l o u s s u u n t a v i i v o i s s a + t a l o u s s u u n t a v i i v o i s t a + t a l o u s s y i s t ä + t a l o u s s y k l i + t a l o u s s y k l i n + t a l o u s s y y t t ä j ä v i r a n o m a i s e s t a + t a l o u s s ä ä d ö k s i ä + t a l o u s s ä ä n n ö k s i ä + t a l o u s s ä ä n t ö j e n + t a l o u s t a a n t u m a + t a l o u s t a a n t u m a n + t a l o u s t a a n t u m a s s a + t a l o u s t a a n t u m a s t a + t a l o u s t a l o u s k u m p p a n u u s s o p i m u k s i l l a + t a l o u s t a r k k a i l i j a t + t a l o u s t a r v i k k e i d e n + t a l o u s t a s a p a i n o s s a + t a l o u s t a v a r o i d e n + t a l o u s t a v o i t t e i d e n + t a l o u s t a v o i t t e i l l e + t a l o u s t e e s i n + t a l o u s t e o r e e t i k k o j e n + t a l o u s t e o r i a + t a l o u s t e o r i a a + t a l o u s t e o r i a n + t a l o u s t e o r i a s s a + t a l o u s t e o r i a s t a + t a l o u s t e o r i a t + t a l o u s t e o r i o i d e n + t a l o u s t e o r i o i s s a + t a l o u s t e o r i o i t a + t a l o u s t e r m e i n + t a l o u s t e r m e j ä + t a l o u s t e r m i n o l o g i a n + t a l o u s t i e d e + t a l o u s t i e d o i s t a + t a l o u s t i e d o n + t a l o u s t i e d o t + t a l o u s t i e d o t u k s e n + t a l o u s t i e t e e n + t a l o u s t i e t e i l i j ä l l e + t a l o u s t i e t e i l i j ä t + t a l o u s t i e t e i l i j ö i d e n + t a l o u s t i e t e i l i j ö i l t ä + t a l o u s t i e t e i l i j ö i t ä + t a l o u s t i e t o a + t a l o u s t i e t o a s i a k i r j a s s a + t a l o u s t i e t o j a + t a l o u s t i e t o j e n + t a l o u s t i e t ä m y s + t a l o u s t i i k e r i + t a l o u s t i i k e r i e n + t a l o u s t i i k e r i k s i + t a l o u s t i i k e r i t + t a l o u s t i l a n n e + t a l o u s t i l a n n e t t a + t a l o u s t i l a n n e t t a m m e + t a l o u s t i l a n t e e l l a + t a l o u s t i l a n t e e l l e + t a l o u s t i l a n t e e m m e + t a l o u s t i l a n t e e n + t a l o u s t i l a n t e e n s a + t a l o u s t i l a n t e e s e e n + t a l o u s t i l a n t e e s s a + t a l o u s t i l a n t e e s s a a n + t a l o u s t i l a n t e e s t a + t a l o u s t i l a n t e e t + t a l o u s t i l a n t e i s s a + t a l o u s t i l a s t o i h i n + t a l o u s t i l a s t o i s s a + t a l o u s t i l a s t o j a + t a l o u s t i l a s t o j e m m e + t a l o u s t i l e i s t ä + t a l o u s t i l e j ä + t a l o u s t i l i e n + t a l o u s t i l i t + t a l o u s t o i m e n p i t e i d e n + t a l o u s t o i m e n p i t e i t ä + t a l o u s t o i m i a + t a l o u s t o i m i e n + t a l o u s t o i m i j o i d e n + t a l o u s t o i m i j o i h i n + t a l o u s t o i m i j o i t a + t a l o u s t o i m i n n a l l e + t a l o u s t o i m i n n a n + t a l o u s t o i m i n n a s s a + t a l o u s t o i m i n t a + t a l o u s t o i m i n t a a + t a l o u s t o i m i n t a a n + t a l o u s t o i m i n t a n a + t a l o u s t o i m i n t o j e n + t a l o u s t o i m i t t a j a t + t a l o u s t o i m i t t a j i a + t a l o u s t o i m i t t a j i e n + t a l o u s t o i m i t t a j i l l a + t a l o u s t u k i s u u n n i t e l m a a + t a l o u s t u o t a n n o n + t a l o u s t u o t a n t o + t a l o u s t u o t a n t o m m e + t a l o u s t u s k i i m m e + t a l o u s t u t k i m u k s e t + t a l o u s t u t k i m u k s i i n + t a l o u s t u t k i m u k s i s s a + t a l o u s t u t k i m u k s i s t a + t a l o u s t u t k i m u s l a i t o k s e n + t a l o u s t u t k i m u s t e n + t a l o u s t y ö r y h m ä n + t a l o u s t ö i s t ä + t a l o u s u l o t t u v u u d e k s i + t a l o u s u l o t t u v u u s + t a l o u s u n i o n i + t a l o u s u n i o n i a + t a l o u s u n i o n i i n + t a l o u s u n i o n i k s i + t a l o u s u n i o n i l l a + t a l o u s u n i o n i n + t a l o u s u u d i s t u k s e e n + t a l o u s u u d i s t u k s e l l a + t a l o u s u u d i s t u k s e l l e + t a l o u s u u d i s t u k s e n + t a l o u s u u d i s t u k s e s s a + t a l o u s u u d i s t u k s e s t a + t a l o u s u u d i s t u k s e t + t a l o u s u u d i s t u k s i a + t a l o u s u u d i s t u k s i i n + t a l o u s u u d i s t u k s i l l e + t a l o u s u u d i s t u k s i l l e e n + t a l o u s u u d i s t u k s i s s a + t a l o u s u u d i s t u k s i s t a + t a l o u s u u d i s t u s + t a l o u s u u d i s t u s a i h e e s t a + t a l o u s u u d i s t u s a s i a i n + t a l o u s u u d i s t u s o h j e l m a + t a l o u s u u d i s t u s o h j e l m a a + t a l o u s u u d i s t u s o h j e l m a s s a + t a l o u s u u d i s t u s o h j e l m i s s a + t a l o u s u u d i s t u s p a k e t t i + t a l o u s u u d i s t u s p r o s e s s i + t a l o u s u u d i s t u s p r o s e s s i a + t a l o u s u u d i s t u s p r o s e s s i i n + t a l o u s u u d i s t u s p r o s e s s i n + t a l o u s u u d i s t u s t a + t a l o u s u u d i s t u s t e n + t a l o u s u u d i s t u s t e n s a + t a l o u s u u d i s t u s t o i m i a + t a l o u s u u d i s t u s t y ö p a j a a + t a l o u s u u t i s i a + t a l o u s v a a t i m u s t e n + t a l o u s v a i k e u d e t + t a l o u s v a i k e u k s i a + t a l o u s v a i k e u k s i e m m e + t a l o u s v a i k e u k s i e n + t a l o u s v a i k e u k s i i n + t a l o u s v a i k e u k s i s s a + t a l o u s v a i k e u k s i s t a + t a l o u s v a i k u t u k s e t + t a l o u s v a i k u t u k s i a + t a l o u s v a i k u t u k s i i n + t a l o u s v a i k u t u k s i s t a + t a l o u s v a i k u t u s t a + t a l o u s v a k o i l u + t a l o u s v a k o i l u a + t a l o u s v a k o i l u s t a + t a l o u s v a k o i l u u n + t a l o u s v a l i o k u n n a l l e + t a l o u s v a l i o k u n n a n + t a l o u s v a l i o k u n n a s s a + t a l o u s v a l i o k u n t a + t a l o u s v a l i o k u n t a m m e + t a l o u s v a l i s t u k s e e n + t a l o u s v a l i s t u k s e l l e + t a l o u s v a l i s t u k s e n + t a l o u s v a l i s t u k s e s t a + t a l o u s v a l i s t u s + t a l o u s v a l i s t u s o h j e l m a t + t a l o u s v a l i s t u s o h j e l m i a + t a l o u s v a l i s t u s o h j e l m i e n + t a l o u s v a l i s t u s o h j e l m i i n + t a l o u s v a l i s t u s t a + t a l o u s v a l l a l l e + t a l o u s v a l l a t + t a l o u s v a l t a + t a l o u s v a l t o i h i n + t a l o u s v a l t o j a + t a l o u s v a l t o j e n + t a l o u s v a l t u u s k u n t a a + t a l o u s v a l v o n n a n + t a l o u s v a l v o n t a + t a l o u s v a l v o n t a a + t a l o u s v a l v o n t a r a k e n t e e n + t a l o u s v a n k i l a s s a + t a l o u s v a s t u u t a + t a l o u s v e t t ä + t a l o u s v i r a n o m a i s e n + t a l o u s v o i m a a n + t a l o u s v o i m a n a + t a l o u s v o i m a t + t a l o u s v u o d e n + t a l o u s v u o r o p u h e l u a + t a l o u s v y ö h y k e + t a l o u s v y ö h y k e t t ä + t a l o u s v y ö h y k k e e k s i + t a l o u s v y ö h y k k e e l l e + t a l o u s v y ö h y k k e e l l ä + t a l o u s v y ö h y k k e e l t ä + t a l o u s v y ö h y k k e e n + t a l o u s v y ö h y k k e e n ä + t a l o u s v y ö h y k k e e s e e n + t a l o u s v y ö h y k k e e s t ä ä n + t a l o u s v y ö h y k k e e t + t a l o u s v y ö h y k k e i d e n + t a l o u s v y ö h y k k e i d e n s ä + t a l o u s v y ö h y k k e i l l ä + t a l o u s v y ö h y k k e i l t ä + t a l o u s v y ö h y k k e i s i i n + t a l o u s v y ö h y k k e i t ä + t a l o u s v y ö h y k k e i t ä ä n + t a l o u s v ä l i n e i t ä + t a l o u s y h t e i s t y ö + t a l o u s y h t e i s t y ö h ö n + t a l o u s y h t e i s t y ö l l ä + t a l o u s y h t e i s t y ö n + t a l o u s y h t e i s t y ö s s ä + t a l o u s y h t e i s t y ö s t ä + t a l o u s y h t e i s t y ö t ä + t a l o u s y h t e i s ö + t a l o u s y h t e i s ö j e n + t a l o u s y h t e i s ö l l e + t a l o u s y h t e i s ö l l e m m e + t a l o u s y h t e i s ö l l ä + t a l o u s y h t e i s ö n + t a l o u s y h t e i s ö s t ä + t a l o u s y h t e i s ö t + t a l o u s y h t e i s ö ä + t a l o u s y h t e i s ö ö n + t a l o u s y h t e y k s i ä + t a l o u s y h t y m i e n + t a l o u s y k s i k k ö i n ä + t a l o u s y k s i k k ö j ä + t a l o u s y k s i k k ö n ä + t a l o u s y k s i k ö i t ä + t a l o u s y m p ä r i s t ö + t a l o u s y m p ä r i s t ö l l e + t a l o u s y m p ä r i s t ö n + t a l o u s y m p ä r i s t ö s s ä + t a l o u s y m p ä r i s t ö ä + t a l o u s y m p ä r i s t ö ö n + t a l o u t e e m m e + t a l o u t e e n + t a l o u t e e n s a + t a l o u t e m m e + t a l o u t e n s a + t a l o u t t a + t a l o u t t a a n + t a l o u t t a m m e + t a l t e e n o t o l l a + t a l t e e n o t o l l e + t a l t e e n o t o n + t a l t e e n o t t o a + t a l t e e n o t t o h a n k k e i s t a + t a l t e e n o t t o j ä r j e s t e l m i i n + t a l t e e n o t t o l a i t o s t e n + t a l t e e n o t t o l a i t t e i s t o + t a l t e e n o t t o o n + t a l t e e n o t t o p o l i t i i k k a + t a l t e e n o t t o t e k n i i k a n + t a l t i o h a l l i n t a + t a l t u t e t t a v a + t a l t u t t a m a a n + t a l t u t t a m i s e k s i + t a l u t u s n u o r a s t a + t a l v e e n + t a l v e l l a + t a l v e n + t a l v e s t a + t a l v i a i k a a n + t a l v i f e s t i v a a l i + t a l v i k a u d e l l a + t a l v i k a u d e n + t a l v i k a u s i + t a l v i k a u s i e n + t a l v i k e l e i l l ä + t a l v i k i s a t + t a l v i k i s o i s s a + t a l v i k o l m i o + t a l v i k u u k a u d e n + t a l v i k u u k a u s i a + t a l v i k u u k a u s i e n + t a l v i k y n t e l i + t a l v i l a a t u a + t a l v i l i i k e n t e e s e e n + t a l v i l ä m m i t y s a v u s t u s t a + t a l v i m y r s k y + t a l v i m y r s k y n + t a l v i o l o s u h t e i s s a + t a l v i o l y m p i a l a i s e t + t a l v i o l y m p i a l a i s i s s a + t a l v i o l y m p i a l a i s i s t a + t a l v i o l y m p i a l a i s t e n + t a l v i p a k k a s i a + t a l v i p a l a t s i + t a l v i p a l a t s i n + t a l v i p a r a l y m p i a l a i s e t + t a l v i p a r a l y m p i a l a i s i s s a + t a l v i p y ö r ä i l y + t a l v i p ä i v i n ä + t a l v i p ä i v ä n s e i s a u s t a + t a l v i r e n k a i d e n + t a l v i s o d a n + t a l v i t a m m i + t a l v i t i e + t a l v i u n e s t a a n + t a l v i u r h e i l u k e s k u s + t a l v i v a a r a + t a l v i v a a t t e i d e n + t a l v i v e h n ä n + t a l v i v i l j a l a j i k k e e t + t a l v i v i n o k a s + t a l v i y ö n ä + t a m a r i s k i t ö p ö s i e p p o + t a m a r i s k i v a r p u n e n + t a m b u r i i n i k y y h k y + t a m i l e i s t a + t a m i l i e n e m m i s t ö i s e t + t a m i l i k a p i n a l l i s e t + t a m i l i k a p i n a l l i s t e n + t a m i l i p e r h e i l t ä + t a m i l i p u o l u e t t a + t a m i l i s e p a r a t i s t i e n + t a m i l i s i i r t o l a i s t e n + t a m i l i s i s s i t + t a m i l i s i s s i t k i n + t a m i l i s i v i i l i e n + t a m i l i t + t a m i l i t i i k e r e i d e n + t a m i l i t i i k e r e i l l e + t a m i l i t i i k e r e i s t ä + t a m i l i t i i k e r e i t ä + t a m i l i t i i k e r i e n + t a m i l i t i i k e r i t + t a m i l i t i i k e r i t k i n + t a m i l i v a n k i a + t a m i l i v ä e s t ö n + t a m i l i v ä e s t ö ö n + t a m i l i v ä h e m m i s t ö + t a m i l i v ä h e m m i s t ö l l e + t a m i l i v ä h e m m i s t ö n + t a m i l i y h t e i s ö + t a m i l i y h t e i s ö n + t a m m e n h e r k k u t a t t i + t a m m e n k a n t o j ä ä r ä + t a m m e n p u n i k k i t a t t i + t a m m e n r o u s k u + t a m m i h a p e r o + t a m m i h a r a k k a + t a m m i h e l m i k u u s s a + t a m m i k e r t t u l i + t a m m i k i i t ä j ä + t a m m i k u l k u r i n i r k k o + t a m m i k u u h u n + t a m m i k u u s s a + t a m m i k u u s t a + t a m m i k u u t a + t a m m i l a s t u i h i n + t a m m i l a s t u j e n + t a m m i l a s t u t + t a m m i m e s i k k o + t a m m i m e t s i k ö t + t a m m i p u n a v a r p u n e n + t a m m i r i t a r i y ö k k ö n e n + t a m m i s a v i k k a + t a m m i s i r p p i s i i p i + t a m m i t i k k a + t a m m i t y n n y r i s s ä + t a m m i v y ö m i t t a r i + t a n d e m s h a k k i + t a n g e n t t i a v a r u u s + t a n g e n t t i l a u s e + t a n k a t t a e s s a + t a n k e i s t a + t a n k k a u s a s e m a i n f r a s t r u k t u u r i + t a n k k a u s a s e m a i n f r a s t r u k t u u r i a + t a n k k a u s a s e m a n + t a n k k a u s a s e m i a + t a n k k a u s k o n e + t a n k k a u s t o i m e t + t a n k k e j a + t a n k k e r e i l l a + t a n k k e r e i t a + t a n k k e r i e n + t a n k k e r i n + t a n k k e r i o n n e t t o m u u k s i a + t a n k k e r i o n n e t t o m u u k s i s t a + t a n k k e r i o n n e t t o m u u s + t a n k k e r i s s a + t a n k k i e n + t a n k k i e n p u h d i s t u s t a p a u s t a + t a n k k i v e t u r i + t a n k o t a n s s i + t a n s k a a + t a n s k a a n + t a n s k a k i n + t a n s k a l a i s k i r v e s + t a n s k a l a i s t e n + t a n s k a l a i s t u t k i m u k s e n + t a n s k a l l a + t a n s k a l l a h a n + t a n s k a l l e + t a n s k a n + t a n s k a n k u i r i m o + t a n s k a n p u o l i v e r i n e n + t a n s k a n s a l m e n + t a n s k a n s a l m i + t a n s k a s s a + t a n s k a s s a k i n + t a n s k a s t a + t a n s s i a + t a n s s i a i s e t + t a n s s i a k a t e m i a + t a n s s i e s i t y k s i ä + t a n s s i j o i n a + t a n s s i k i l p a i l u a + t a n s s i k i l p a i l u s s a + t a n s s i k o u l u u n + t a n s s i m a n i a + t a n s s i n + t a n s s i o h j a i n + t a n s s i r y h m i e n + t a n s s i s e u r u e + t a n s s i t i l a i s u u k s i s s a + t a n s s i t u n n i l l e + t a n t a a l i k a r b i d i + t a n t a a l i p e n t a k l o r i d i + t a n t a a l i p e n t o k s i d i + t a n t e r e e l l a a n + t a o y u a n + t a p a a k o + t a p a a m a a n + t a p a a m a m m e + t a p a a m a n i + t a p a a m a s s a + t a p a a m a t t a + t a p a a m i e m m e + t a p a a m i s e e n + t a p a a m i s e l t a + t a p a a m i s e m m e + t a p a a m i s e n + t a p a a m i s e s s a + t a p a a m i s e s s a a n + t a p a a m i s e s s a n n e + t a p a a m i s e s t a + t a p a a m i s e t + t a p a a m i s i a + t a p a a m i s i s s a + t a p a a m i s i s s a n i + t a p a a m i s i s t a + t a p a a m i s i s t a n n e + t a p a a m i s o i k e u d e n + t a p a a m i s o i k e u d e t + t a p a a m i s p a i k a n + t a p a a m i s p a i k a s t a + t a p a a m i s p a i k k o j a + t a p a a m i s p ä i v i s t ä + t a p a a m i s t a + t a p a a m i s t e n + t a p a a m i s t e n i + t a p a a m m e + t a p a a n i + t a p a a v a n + t a p a a v a t + t a p a h d u t t a v a + t a p a h t u a + t a p a h t u i + t a p a h t u i k i n + t a p a h t u i k o + t a p a h t u i p a + t a p a h t u i s i + t a p a h t u i s i k a a n + t a p a h t u i v a t + t a p a h t u m a a n + t a p a h t u m a h e t k e l l ä + t a p a h t u m a h e t k e n + t a p a h t u m a h o r i s o n t t i + t a p a h t u m a k e t j u n + t a p a h t u m a k e t j u s s a + t a p a h t u m a k i e r t e e n + t a p a h t u m a k u s t a n n u s t e n + t a p a h t u m a l l e + t a p a h t u m a n + t a p a h t u m a n a + t a p a h t u m a s a r j a n + t a p a h t u m a s a r j a s t a + t a p a h t u m a s s a + t a p a h t u m a s t a + t a p a h t u m a t + t a p a h t u m i a + t a p a h t u m i e n + t a p a h t u m i i n + t a p a h t u m i l l a + t a p a h t u m i l l e + t a p a h t u m i l t a + t a p a h t u m i n e n + t a p a h t u m i s s a + t a p a h t u m i s t a + t a p a h t u n e e l t a + t a p a h t u n e e n + t a p a h t u n e e s e e n + t a p a h t u n e e s t a + t a p a h t u n e e t + t a p a h t u n e i d e n + t a p a h t u n e i l l a + t a p a h t u n e i s i i n + t a p a h t u n e i t a + t a p a h t u n u t + t a p a h t u n u t k i n + t a p a h t u n u t t a + t a p a h t u u + t a p a h t u u k i n + t a p a h t u u k o + t a p a h t u v a + t a p a h t u v a a + t a p a h t u v a a n + t a p a h t u v a l l e + t a p a h t u v a n + t a p a h t u v a s t a + t a p a h t u v a t + t a p a h t u v i a + t a p a h t u v i e n + t a p a h t u v i i n + t a p a h t u v i l l e + t a p a h t u v i s t a + t a p a i s t a k a a n + t a p a n a + t a p a n i n p ä i v ä n + t a p a n i n p ä i v ä n ä + t a p a n s a + t a p a o i k e u s j ä r j e s t e l m ä n + t a p a o i k e u s j ä r j e s t e l m ä t + t a p a o i k e u t e e n + t a p a p a i n o i n e n + t a p a s i + t a p a s i m m e + t a p a s i n + t a p a s i v a t + t a p a t u r m a r a p o r t t e j a + t a p a t u r m a t + t a p a t u r m a t i e t o j a + t a p a t u r m a v a a r a + t a p a t u r m a v a h i n k o j a + t a p a t u r m a v a k u u t u k s e s t a a n + t a p a t u r m a v a k u u t u s m a k s u j a + t a p a t u r m a v a k u u t u s t a + t a p a t u r m i e n + t a p a t u r m i s t a + t a p a u k s e e n + t a p a u k s e l t a + t a p a u k s e n + t a p a u k s e n s a + t a p a u k s e s s a k a a n + t a p a u k s e s s a n i + t a p a u k s e s t a + t a p a u k s e t + t a p a u k s i a + t a p a u k s i i n + t a p a u k s i s s a + t a p a u k s i s t a + t a p a u s k o h t a i s e s t i + t a p a u s k o h t a i s e t + t a p a u s k o h t a i s i a + t a p a u s k o h t a i s i s t a + t a p a u s k o h t a i s t a + t a p a u s k o h t a i s t e n + t a p a u s m e n e t e l m ä ä + t a p a u s m ä ä r i t t e l y j e n + t a p a u s m ä ä r i t t e l y j ä + t a p a u s m ä ä r i t t e l y n + t a p a u s o i k e u d e n + t a p a u s o i k e u d e s t a + t a p a u s o i k e u t t a + t a p a u s s k e n a a r i o + t a p a u s s k e n a a r i o i h i n + t a p a u s t a + t a p a u s t a a n + t a p a u s t e n + t a p a u s t u t k i m u k s e n + t a p a u s t u t k i m u k s e n a + t a p a u s t u t k i m u k s e t + t a p a u s t u t k i m u k s i a + t a p a u s t u t k i m u k s i s t a + t a p e t a a n + t a p e t t a i s i + t a p e t t i i n + t a p e t t i k o i + t a p o i h i n + t a p o j a + t a p o j a a n + t a p o j e n + t a p o n l e h t i + t a p p a a + t a p p a a k s e e n + t a p p a j a h u u m e e n a + t a p p a j a t + t a p p a j a t a u d i t + t a p p a j a t a u t e j a + t a p p a j a t o m a a t t i e n + t a p p a j i a + t a p p a j i l l a + t a p p a k a a + t a p p a m a l l a + t a p p a m i s e e n + t a p p a m i s e k s i + t a p p a m i s e s t a + t a p p a m i s t a + t a p p a m i s u r a t + t a p p a m i s v i m m a + t a p p a r a k a l a t + t a p p a v a k s i + t a p p a v a m p a a + t a p p a v a t + t a p p a v i a + t a p p a v i k s i + t a p p a v i m m a n + t a p p a v i n + t a p p e l u i d e n + t a p p e l u k l u b i + t a p p i o i d e n + t a p p i o i h i n + t a p p i o i l l e + t a p p i o i l t a + t a p p i o i n a + t a p p i o i s t a + t a p p i o i t a + t a p p i o k s e m m e + t a p p i o l i s t a + t a p p i o l l e + t a p p i o l l i s e m p i + t a p p i o l u v u t + t a p p i o m i e l i a l a l l a + t a p p i o n + t a p p i o n t a s a u k s e n + t a p p i o n t a s a u k s e s t a + t a p p i o n t a s a u s + t a p p i o n t a s a u s t a + t a p p i o r i s k i ä + t a p p i o t + t a p p i o t a + t a p p i o t a s e + t a p p i o t i l a s t o t + t a p p i o v ä h e n n y k s i s t ä + t a p p i o v ä h e n n y k s i ä + t a p p i o v ä h e n n y s t e n + t a p p o a i k e i s t a a n + t a p p o i + t a p p o i v a t + t a p p o k e i n o s t a + t a p p o k i e l t o + t a p p o k o n e i d e n + t a p p o k o n e i s t o n + t a p p o k o n e i t a + t a p p o k ä s k y n + t a p p o l i s t a t + t a p p o l u p a a + t a p p o m e n e t e l m i ä + t a p p o s y y t t e e n + t a p p o s y y t t e e s t ä + t a p p o u h k a a + t a p p o u h k a u k s e n + t a p p o u h k a u k s e t + t a p p o u h k a u k s i a + t a p p o u h k a u s + t a p p o u h k a u s t e n + t a p p o v ä l i n e i t ä + t a r a h u m a r a t + t a r a k a n + t a r a n t e l l a s u m u + t a r h a j u u r i p e r h o n e n + t a r h a k e h ä k u k k a + t a r h a k o h o k k i + t a r h a k o l i b r i + t a r h a k ä e n k a a l i + t a r h a l a u l u m e s i k k o + t a r h a m a l t s a + t a r h a m e h i l ä i n e n + t a r h a n e i l i k k a + t a r h a n e i t o + t a r h a p a i k k a a n + t a r h a p e u k a l o i n e n + t a r h a p y r s t ö k o l i b r i + t a r h a r a s t a s + t a r h a r e n g a s k e h r ä ä j ä + t a r h a s a l k o r u u s u + t a r h a s i i r a + t a r h a s i n i s a r j a + t a r h a s m a r a g d i k o l i b r i + t a r h a t u p p i s i e n i + t a r h a t y r a n n i + t a r h a t y r ä k k i + t a r h a u k o n s i e n i + t a r h a v a r p u n e n + t a r i f f e i h i n + t a r i f f e i s t a + t a r i f f e j a + t a r i f f i a l e n n u k s i a + t a r i f f i a l e n n u s t e n + t a r i f f i e h d o t u k s i a + t a r i f f i e n + t a r i f f i e s t e i d e n + t a r i f f i e t u i s u u k s i e n + t a r i f f i j ä r j e s t e l m ä + t a r i f f i j ä r j e s t e l m ä n + t a r i f f i j ä r j e s t e l m ä ä + t a r i f f i j ä r j e s t e l m ä ä n + t a r i f f i k i i n t i ö + t a r i f f i k i i n t i ö i d e n + t a r i f f i k i i n t i ö i h i n + t a r i f f i k i i n t i ö i t ä + t a r i f f i k i i n t i ö j ä r j e s t e l m ä l l ä + t a r i f f i k i i n t i ö l l ä + t a r i f f i k i i n t i ö n + t a r i f f i k i i n t i ö s s ä + t a r i f f i k i i n t i ö t + t a r i f f i k i i n t i ö t ä + t a r i f f i k o r o t u s + t a r i f f i l u o k a s s a + t a r i f f i l u o k i t u k s e e n + t a r i f f i m a k s u a + t a r i f f i m a k s u j a + t a r i f f i m u u r i t + t a r i f f i m u u t o k s e t + t a r i f f i m y ö n n y t y k s e t + t a r i f f i m y ö n n y t y k s i i n + t a r i f f i m y ö n n y t y k s i ä + t a r i f f i m ä ä r ä y s t e n + t a r i f f i n a l e n n u k s i a + t a r i f f i n o u s u j e n + t a r i f f i p i i k k i ä + t a r i f f i p o l i t i i k a n + t a r i f f i r a j o i t u k s i a + t a r i f f i r a k e n n e + t a r i f f i r a k e n t e e n + t a r i f f i r a k e n t e i t a + t a r i f f i s o p i m u k s i l l a + t a r i f f i s o p i m u k s i n + t a r i f f i s o p i m u k s i s t a + t a r i f f i t + t a r i f f i t a s o + t a r i f f i t a s o o n + t a r i f f i t a s o s t a + t a r i f f i t o i m e n p i t e i t ä + t a r i f f i t o i m i a + t a r i n a a n s a + t a r i n a n + t a r i n a t e a t t e r i + t a r i n o i l l a + t a r i n o i s t a + t a r i n o i t a + t a r j o a a + t a r j o a a h a n + t a r j o a a k o + t a r j o a i s i + t a r j o a i s i m m e + t a r j o a j a a + t a r j o a j a l l e + t a r j o a j a n + t a r j o a j a t + t a r j o a j i a + t a r j o a j i e n + t a r j o a j i l l a + t a r j o a j i l l e + t a r j o a j i l t a + t a r j o a j i s t a + t a r j o a m a a + t a r j o a m a a n + t a r j o a m a l l a + t a r j o a m a s s a + t a r j o a m a s t a + t a r j o a m a t + t a r j o a m a t t a + t a r j o a m i a + t a r j o a m i e n + t a r j o a m i n e n k a a n + t a r j o a m i s e e n + t a r j o a m i s e k s i + t a r j o a m i s e l l e + t a r j o a m i s e n + t a r j o a m i s e s s a + t a r j o a m i s t a + t a r j o a m i s v e l v o i t t e e n + t a r j o a m m e + t a r j o a v a t + t a r j o a v a t k o + t a r j o a v i a + t a r j o a v i e n + t a r j o a v i l l a + t a r j o i l l a + t a r j o n n a n + t a r j o n n a s s a + t a r j o n n u t + t a r j o n t a a + t a r j o n t a a n + t a r j o n t a a n s a + t a r j o n t a k a p a s i t e e t i s t a + t a r j o n t a k e t j u + t a r j o n t a k e t j u n + t a r j o n t a k e t j u s s a + t a r j o n t a k o m i t e a s s a + t a r j o n t a l ä h t ö i s t ä + t a r j o n t a p a i k a n + t a r j o n t a p a i n o t t e i s t a + t a r j o n t a p o h j a i n e n + t a r j o n t a p o l i t i i k a n + t a r j o n t a p u o l e l l a + t a r j o n t a p u o l e l t a + t a r j o n t a p u o l e n + t a r j o n t a p u o l e s t a + t a r j o n t a p u o l t a + t a r j o n t a s i v u l l a + t a r j o n t a s o k k i a + t a r j o n t a t e k i j ö i d e n + t a r j o n t a t i l a n t e e s e e n + t a r j o n t a t o i m i e n + t a r j o s i + t a r j o s i m m e + t a r j o s i v a t + t a r j o t a + t a r j o t a a n + t a r j o t a k s e e n + t a r j o t a k s e m m e + t a r j o t a k s e n i + t a r j o t e s s a + t a r j o t e s s a a n + t a r j o t e s s a m m e + t a r j o t k a a m m e + t a r j o t t a e s s a + t a r j o t t a v a + t a r j o t t a v a a + t a r j o t t a v a n a a n + t a r j o t t a v a s s a + t a r j o t t u a + t a r j o t t u j e n + t a r j o u d u t t a v a + t a r j o u k s e l l a a n + t a r j o u k s e n + t a r j o u k s e n t e k i j ä t + t a r j o u k s e n t e k o m e n e t e l m i i n + t a r j o u k s e s s a + t a r j o u k s e t + t a r j o u k s i a + t a r j o u k s i s t a m m e + t a r j o u s a i k a n a + t a r j o u s a s i a k i r j a t + t a r j o u s a s i a k i r j o i h i n + t a r j o u s e h d o t u k s e m m e + t a r j o u s e h d o t u k s e n + t a r j o u s e h t o j a + t a r j o u s e r i t e l m i ä ä n + t a r j o u s e s i t e d i r e k t i i v i s s ä + t a r j o u s e s i t e t t ä + t a r j o u s e s i t t e e t + t a r j o u s e s i t t e i d e n + t a r j o u s h e t k e l l ä + t a r j o u s j ä r j e s t e l m ä n + t a r j o u s k i l p a i l u a + t a r j o u s k i l p a i l u a s i o i s s a + t a r j o u s k i l p a i l u i h i n + t a r j o u s k i l p a i l u i l l a + t a r j o u s k i l p a i l u i s s a + t a r j o u s k i l p a i l u i s s a a n + t a r j o u s k i l p a i l u i s t a + t a r j o u s k i l p a i l u j a + t a r j o u s k i l p a i l u j e n + t a r j o u s k i l p a i l u j ä r j e s t e l m i e n + t a r j o u s k i l p a i l u j ä r j e s t e l m ä + t a r j o u s k i l p a i l u j ä r j e s t e l m ä n + t a r j o u s k i l p a i l u l l e + t a r j o u s k i l p a i l u m e n e t t e l y + t a r j o u s k i l p a i l u m e n e t t e l y i d e n + t a r j o u s k i l p a i l u m e n e t t e l y i h i n + t a r j o u s k i l p a i l u m e n e t t e l y j e n + t a r j o u s k i l p a i l u m e n e t t e l y j ä + t a r j o u s k i l p a i l u m e n e t t e l y n + t a r j o u s k i l p a i l u m e n e t t e l y s t ä + t a r j o u s k i l p a i l u m e n e t t e l y t + t a r j o u s k i l p a i l u m e n e t t e l y ä + t a r j o u s k i l p a i l u n + t a r j o u s k i l p a i l u p o l i t i i k a n + t a r j o u s k i l p a i l u p r o s e s s e j a + t a r j o u s k i l p a i l u p r o s e s s i a + t a r j o u s k i l p a i l u p r o s e s s i i n + t a r j o u s k i l p a i l u s s a + t a r j o u s k i l p a i l u s ä ä n t ö j e n + t a r j o u s k i l p a i l u t + t a r j o u s k i l p a i l u t i l a i s u u k s i e n + t a r j o u s k i l p a i l u u n + t a r j o u s k i l p a i l u v a i h e e s s a + t a r j o u s m e n e t t e l y + t a r j o u s m e n e t t e l y i s s ä + t a r j o u s m e n e t t e l y j e n + t a r j o u s m e n e t t e l y j ä + t a r j o u s m e n e t t e l y n + t a r j o u s m e n e t t e l y s s ä + t a r j o u s m e n e t t e l y s t ä + t a r j o u s m e n e t t e l y t + t a r j o u s p a k e t t i + t a r j o u s p r o s e s s i n + t a r j o u s p y y n n ö i s s ä + t a r j o u s p y y n n ö l l ä + t a r j o u s p y y n n ö n + t a r j o u s p y y n n ö t + t a r j o u s p y y n t ö i h i n + t a r j o u s p y y n t ö j ä + t a r j o u s p y y n t ö j ä r j e s t e l y i s t ä + t a r j o u s p y y n t ö m e n e t t e l y + t a r j o u s p y y n t ö m e n e t t e l y j ä + t a r j o u s p y y n t ö m e n e t t e l y l l ä + t a r j o u s p y y n t ö m e n e t t e l y n + t a r j o u s p y y n t ö m e n e t t e l y y n + t a r j o u s p y y n t ö ä + t a r j o u s s o t a + t a r j o u s t e n + t a r j o u s t u k e e n + t a r j o u s v a i h e e s s a + t a r j o u t u m a l l a + t a r j o u t u n e e s e e n + t a r j o u t u u + t a r j o u t u v a s s a + t a r j o u t u v a t + t a r j o u t u v i i n + t a r k a n + t a r k a s s a + t a r k a s t a a + t a r k a s t a e s s a a n + t a r k a s t a j a n + t a r k a s t a j a p u l a n + t a r k a s t a j a r y h m ä + t a r k a s t a j a t + t a r k a s t a j a v e r k o s t o a + t a r k a s t a j i a + t a r k a s t a j i e n + t a r k a s t a j i l l e + t a r k a s t a j i s t a + t a r k a s t a m a a n + t a r k a s t a m i s e e n + t a r k a s t a m i s e k s i + t a r k a s t a m i s e n + t a r k a s t a m i s t i h e y t t ä + t a r k a s t a n e e t + t a r k a s t a v a t + t a r k a s t e l e e + t a r k a s t e l e m a a n + t a r k a s t e l e m a l l a + t a r k a s t e l e m a s s a + t a r k a s t e l e m a s t a + t a r k a s t e l e m a t t a + t a r k a s t e l e m i s e k s i + t a r k a s t e l e m i s e s t a + t a r k a s t e l e m m e + t a r k a s t e l e n + t a r k a s t e l e v a t + t a r k a s t e l i + t a r k a s t e l i m m e + t a r k a s t e l i s i m m e + t a r k a s t e l k a a + t a r k a s t e l k a a m m e + t a r k a s t e l k a a p a + t a r k a s t e l l a + t a r k a s t e l l a a n + t a r k a s t e l l a a n p a + t a r k a s t e l l a k s e e n + t a r k a s t e l l a k s e m m e + t a r k a s t e l l e e t + t a r k a s t e l l e s s a a n + t a r k a s t e l l e s s a m m e + t a r k a s t e l l e s s a n i + t a r k a s t e l l u i l l a + t a r k a s t e l l u t + t a r k a s t e l t a e s s a + t a r k a s t e l t a i s i i n + t a r k a s t e l t a v a + t a r k a s t e l t a v a k s i + t a r k a s t e l t a v a n a + t a r k a s t e l t a v a n a m m e + t a r k a s t e l t a v i k s i + t a r k a s t e l t a v i n a + t a r k a s t e l t i i n + t a r k a s t e l t i i n p a + t a r k a s t e l t u + t a r k a s t e l t u a + t a r k a s t e l t u a a n + t a r k a s t e l t u a n i + t a r k a s t e l t u n a + t a r k a s t e l u a + t a r k a s t e l u a s i a k i r j a t + t a r k a s t e l u j a k s o + t a r k a s t e l u k a u d e n + t a r k a s t e l u k a u t t a + t a r k a s t e l u k o n f e r e n s s i + t a r k a s t e l u k o n f e r e n s s i a + t a r k a s t e l u k o n f e r e n s s i i n + t a r k a s t e l u k o n f e r e n s s i l l e + t a r k a s t e l u k o n f e r e n s s i n + t a r k a s t e l u k o n f e r e n s s i s s a + t a r k a s t e l u l a u s e k e + t a r k a s t e l u l l e + t a r k a s t e l u m e k a n i s m e j a + t a r k a s t e l u m e k a n i s m i a + t a r k a s t e l u m e k a n i s m i n + t a r k a s t e l u m e n e t t e l y + t a r k a s t e l u n + t a r k a s t e l u p i s t e + t a r k a s t e l u p r o s e s s i + t a r k a s t e l u p r o s e s s i n + t a r k a s t e l u p r o s e s s i s s a + t a r k a s t e l u s s a + t a r k a s t e l u s t a + t a r k a s t e l u t a p a + t a r k a s t e l u t a p a a n + t a r k a s t e l u t a v a n + t a r k a s t e l u t y ö n + t a r k a s t e l u u n + t a r k a s t e l u v ä l i n e e n + t a r k a s t e t a a n + t a r k a s t e t t a v a + t a r k a s t e t t a v a n a + t a r k a s t e t t a v i a + t a r k a s t e t t a v i s s a + t a r k a s t e t t i i n + t a r k a s t e t u i l l a + t a r k a s t u k s e e n + t a r k a s t u k s e n + t a r k a s t u k s e s s a + t a r k a s t u k s e s t a + t a r k a s t u k s e t + t a r k a s t u k s i a + t a r k a s t u k s i a a n + t a r k a s t u k s i i n + t a r k a s t u k s i l l a + t a r k a s t u k s i l l e + t a r k a s t u k s i l t a + t a r k a s t u k s i s s a + t a r k a s t u k s i s t a + t a r k a s t u k s i s t a a n + t a r k a s t u s a l u k s e n + t a r k a s t u s a l u s + t a r k a s t u s a s t e + t a r k a s t u s e l i m e n + t a r k a s t u s e l i m e t + t a r k a s t u s e l i m i e n + t a r k a s t u s e l i m i l t ä + t a r k a s t u s e l i n t e n + t a r k a s t u s e l i n t ä + t a r k a s t u s h e n k i l ö k u n n a n + t a r k a s t u s h e n k i l ö s t ö n + t a r k a s t u s h e n k i l ö s t ö ä + t a r k a s t u s j ä r j e s t e l m i e n + t a r k a s t u s j ä r j e s t e l m i s s ä + t a r k a s t u s j ä r j e s t e l m i s t ä + t a r k a s t u s j ä r j e s t e l m i ä + t a r k a s t u s j ä r j e s t e l m ä + t a r k a s t u s j ä r j e s t e l m ä n + t a r k a s t u s j ä r j e s t e l m ä s s ä + t a r k a s t u s j ä r j e s t e l m ä s t ä + t a r k a s t u s j ä r j e s t e l m ä t + t a r k a s t u s j ä r j e s t e l m ä ä + t a r k a s t u s j ä r j e s t e l m ä ä n + t a r k a s t u s j ä r j e s t e l y i h i n + t a r k a s t u s j ä r j e s t e l y i s s ä + t a r k a s t u s k a p a s i t e e t i n + t a r k a s t u s k a u t t a + t a r k a s t u s k e r t o m u k s e n + t a r k a s t u s k e r t o m u k s e s s a + t a r k a s t u s k e r t o m u k s e t + t a r k a s t u s k e r t o m u k s i a + t a r k a s t u s k e r t o m u k s i i n + t a r k a s t u s k e r t o m u k s i s s a + t a r k a s t u s k e r t o m u k s i s s a a n + t a r k a s t u s k e r t o m u k s i s t a + t a r k a s t u s k e r t o m u s t a + t a r k a s t u s k e r t o m u s t e n + t a r k a s t u s k o k e i t a + t a r k a s t u s k o m i t e a + t a r k a s t u s k o m i t e a a n + t a r k a s t u s k o m i t e a a n s a + t a r k a s t u s k o m i t e a l l a + t a r k a s t u s k o m i t e a n + t a r k a s t u s k o m i t e a s s a m m e + t a r k a s t u s k o n e i s t o a + t a r k a s t u s k r i t e e r i e n + t a r k a s t u s k r i t e e r i t + t a r k a s t u s k u s t a n n u k s e t + t a r k a s t u s k u s t a n n u k s i a + t a r k a s t u s k ä s i k i r j a n + t a r k a s t u s k ä y n n i n + t a r k a s t u s k ä y n n i t + t a r k a s t u s k ä y n t e j ä + t a r k a s t u s k ä y n t i + t a r k a s t u s k ä y n t i e m m e + t a r k a s t u s k ä y n t i e n + t a r k a s t u s k ä y t ä n n ö t + t a r k a s t u s k ä y t ä n t ö + t a r k a s t u s k ä y t ä n t ö j ä + t a r k a s t u s l a i t o k s e n a + t a r k a s t u s l a i t o k s e s s a + t a r k a s t u s l a i t o k s e t + t a r k a s t u s l a i t o k s i a + t a r k a s t u s l a i t o k s i i n + t a r k a s t u s l a i t o s t e n + t a r k a s t u s l a u s e k e + t a r k a s t u s l a u s e k k e e n + t a r k a s t u s l a u s u m a + t a r k a s t u s l a u s u m a a + t a r k a s t u s l a u s u m a a n + t a r k a s t u s l a u s u m a j ä r j e s t e l m ä n + t a r k a s t u s l a u s u m a l l a + t a r k a s t u s l a u s u m a l l e + t a r k a s t u s l a u s u m a n + t a r k a s t u s l a u s u m a s s a + t a r k a s t u s l a u s u m a s s a a n + t a r k a s t u s l a u s u m a s t a + t a r k a s t u s l a u s u m a t + t a r k a s t u s l a u s u m i a + t a r k a s t u s l a u s u m i i n + t a r k a s t u s l a u s u m i s t a + t a r k a s t u s l a u s u n t o + t a r k a s t u s l i s t a + t a r k a s t u s l i s t a n + t a r k a s t u s l u e t t e l o + t a r k a s t u s l u e t t e l o m m e + t a r k a s t u s m a l l i + t a r k a s t u s m a l l i n + t a r k a s t u s m a r k k i n o i d e n + t a r k a s t u s m a t k a + t a r k a s t u s m a t k a n + t a r k a s t u s m a t k o j a + t a r k a s t u s m e k a n i s m e j a + t a r k a s t u s m e k a n i s m i e n + t a r k a s t u s m e k a n i s m i l l e + t a r k a s t u s m e k a n i s m i t + t a r k a s t u s m e n e t e l m i e n + t a r k a s t u s m e n e t e l m ä t + t a r k a s t u s m e n e t t e l y + t a r k a s t u s m e n e t t e l y i d e n + t a r k a s t u s m e n e t t e l y i s t ä + t a r k a s t u s m e n e t t e l y i t ä + t a r k a s t u s m e n e t t e l y j e n + t a r k a s t u s m e n e t t e l y j ä + t a r k a s t u s m e n e t t e l y j ä ä n + t a r k a s t u s m e n e t t e l y l l ä + t a r k a s t u s m e n e t t e l y n + t a r k a s t u s m e n e t t e l y t + t a r k a s t u s m e n e t t e l y y n + t a r k a s t u s m e n e t t e l y ä + t a r k a s t u s m e r k i n n ä t + t a r k a s t u s m e r k i n n ö i s t ä + t a r k a s t u s m e r k i n t ä + t a r k a s t u s n o r m e j a + t a r k a s t u s n o r m i e n + t a r k a s t u s o h j e k i r j a n + t a r k a s t u s o h j e l m a + t a r k a s t u s o h j e l m a a + t a r k a s t u s o h j e l m a a n s a + t a r k a s t u s o h j e l m a n + t a r k a s t u s o h j e l m i e n + t a r k a s t u s o i k e u k s i a a n + t a r k a s t u s o i k e u s + t a r k a s t u s o i k e u t e m m e + t a r k a s t u s o i k e u t t a a n + t a r k a s t u s o r g a n i s a a t i o + t a r k a s t u s o r g a n i s a a t i o n + t a r k a s t u s o r g a n i s a a t i o s t a + t a r k a s t u s o s a s t o n + t a r k a s t u s o s u u d e s t a + t a r k a s t u s o t o s t e n + t a r k a s t u s p a l v e l u t + t a r k a s t u s p i s t e i d e n + t a r k a s t u s p i s t e i l l ä + t a r k a s t u s p i s t e i s s ä + t a r k a s t u s p r o s e s s i + t a r k a s t u s p r o s e s s i a + t a r k a s t u s p r o s e s s i n + t a r k a s t u s p r o s e s s i s t a + t a r k a s t u s p y y n t ö ö n + t a r k a s t u s p ä ä l l i k k ö + t a r k a s t u s r a k e n t e e s s a + t a r k a s t u s r a p o r t t e j a + t a r k a s t u s r a p o r t t i + t a r k a s t u s r a p o r t t i e n + t a r k a s t u s r e s u r s s e i h i n + t a r k a s t u s r y h m i e n + t a r k a s t u s r y h m i l l e + t a r k a s t u s r y h m i ä + t a r k a s t u s r y h m ä + t a r k a s t u s r y h m ä n + t a r k a s t u s s e r t i f i k a a t t e j a + t a r k a s t u s s o p i m u k s e t + t a r k a s t u s s t a n d a r d e j a + t a r k a s t u s s t r a t e g i a n + t a r k a s t u s s t r a t e g i o i d e n + t a r k a s t u s s t r a t e g i o i t a + t a r k a s t u s s u u n n i t e l m a + t a r k a s t u s s u u n n i t e l m i a + t a r k a s t u s s ä ä n n ö k s i ä + t a r k a s t u s s ä ä n n ö s t e n + t a r k a s t u s t a + t a r k a s t u s t a h o t + t a r k a s t u s t a i t o j e n + t a r k a s t u s t e h t ä v i e n + t a r k a s t u s t e h t ä v i s t ä + t a r k a s t u s t e h t ä v i ä + t a r k a s t u s t e h t ä v ä + t a r k a s t u s t e h t ä v ä s t ä ä n + t a r k a s t u s t e h t ä v ä ä + t a r k a s t u s t e h t ä v ä ä n s ä + t a r k a s t u s t e k n i i k o i t a + t a r k a s t u s t e n + t a r k a s t u s t o d i s t u k s i a + t a r k a s t u s t o i m e n + t a r k a s t u s t o i m e n p i d e + t a r k a s t u s t o i m e n p i t e e t + t a r k a s t u s t o i m e n p i t e i d e n + t a r k a s t u s t o i m e t + t a r k a s t u s t o i m i a + t a r k a s t u s t o i m i e n + t a r k a s t u s t o i m i l l a + t a r k a s t u s t o i m i l l e + t a r k a s t u s t o i m i n n a n + t a r k a s t u s t o i m i n n a s s a + t a r k a s t u s t o i m i n n a s t a + t a r k a s t u s t o i m i n n o t + t a r k a s t u s t o i m i n t a a + t a r k a s t u s t o i m i s t a + t a r k a s t u s t u l o s t e n + t a r k a s t u s t u t k i m u k s i i n + t a r k a s t u s t y y p p i + t a r k a s t u s t y ö h ö n + t a r k a s t u s t y ö l l e + t a r k a s t u s t y ö n + t a r k a s t u s t y ö t ä + t a r k a s t u s t y ö t ä m m e + t a r k a s t u s v a a t i m u k s e t + t a r k a s t u s v a a t i m u k s i a + t a r k a s t u s v a a t i m u k s i l l a + t a r k a s t u s v a a t i m u s t e n + t a r k a s t u s v a i h e e s e e n + t a r k a s t u s v a i h e e s s a + t a r k a s t u s v a l i o k u n n a n + t a r k a s t u s v a l t u u d e t + t a r k a s t u s v a l t u u k s i a + t a r k a s t u s v a l t u u k s i e n + t a r k a s t u s v a l t u u k s i s t a + t a r k a s t u s v e l v o i t e + t a r k a s t u s v e l v o i t t e e n s a + t a r k a s t u s v e l v o i t t e i s t a + t a r k a s t u s v e l v o l l i s u u k s i s t a + t a r k a s t u s v e r k o s t o j a + t a r k a s t u s v i h k o s e n + t a r k a s t u s v i i v a s t a + t a r k a s t u s v i r a n o m a i s e n + t a r k a s t u s v i r a n o m a i s i a + t a r k a s t u s v i r a n o m a i s i l l e + t a r k a s t u s v i r a n o m a i s t e n + t a r k a s t u s v i r a s t o + t a r k a s t u s v i r a s t o n + t a r k a s t u s y k s i k k ö + t a r k a s t u s y k s i k k ö ö n + t a r k a s t u s y k s i k ö i h i n + t a r k a s t u s y k s i k ö n + t a r k a s t u s y k s i k ö t + t a r k a t + t a r k e m m a k s i + t a r k e m m a l l a + t a r k e m m a n + t a r k e m m a s t a + t a r k e m m a t + t a r k e m m i k s i + t a r k e m m i l l a + t a r k e m m i s t a + t a r k e m p a a + t a r k e m p a a n + t a r k e m p i + t a r k e m p i a + t a r k e m p i e n + t a r k e m p i i n + t a r k e n n a n + t a r k e n n e t t a v a + t a r k e n n e t t i i n + t a r k e n n u k s e n + t a r k e n n u k s i a + t a r k e n n u k s i s t a + t a r k e n n u s t a + t a r k e n t a a + t a r k e n t a a k s e e n + t a r k e n t a a k s e m m e + t a r k e n t a a k s e n i + t a r k e n t a i s i n + t a r k e n t a m a a n + t a r k e n t a m i s e k s i + t a r k e n t a m i s e s t a + t a r k e n t a m i s t a + t a r k e n ä p p ä i n + t a r k i n + t a r k i n t a + t a r k i s t a a + t a r k i s t a a k s e e n + t a r k i s t a e s s a a n + t a r k i s t a e s s a m m e + t a r k i s t a k a a + t a r k i s t a m a a n + t a r k i s t a m a l l a + t a r k i s t a m a s s a + t a r k i s t a m a t t a + t a r k i s t a m a t t o m a n a + t a r k i s t a m a t t o m i a + t a r k i s t a m i s e e n + t a r k i s t a m i s e k s i + t a r k i s t a m i s e n + t a r k i s t a m i s e s s a + t a r k i s t a m i s e s t a + t a r k i s t a m i s k o n f e r e n s s i s s a + t a r k i s t a m i s l a u s e k e + t a r k i s t a m i s m a h d o l l i s u u d e s t a + t a r k i s t a m i s m e n e t t e l y + t a r k i s t a m i s m e n e t t e l y j e n + t a r k i s t a m i s m e n e t t e l y s t ä + t a r k i s t a m i s p r o s e s s i + t a r k i s t a m i s p r o s e s s i n + t a r k i s t a m i s p r o s e s s i s s a + t a r k i s t a m i s t a + t a r k i s t a m i s t o i m e n p i t e e s e e n + t a r k i s t a m m e + t a r k i s t a n + t a r k i s t a n u t + t a r k i s t a v a m m e + t a r k i s t e t a a n + t a r k i s t e t t a e s s a + t a r k i s t e t t a i s i i n + t a r k i s t e t t a v a + t a r k i s t e t t a v a n + t a r k i s t e t t a v a n a + t a r k i s t e t t i i n + t a r k i s t e t t u a + t a r k i s t e t t u a a n + t a r k i s t e t t u j a + t a r k i s t e t t u j e n + t a r k i s t e t t u n a + t a r k i s t e t u n + t a r k i s t e t u s s a + t a r k i s t e t u s t a + t a r k i s t i + t a r k i s t u k s e e m m e + t a r k i s t u k s e e n + t a r k i s t u k s e e n s a + t a r k i s t u k s e k s i + t a r k i s t u k s e l l a + t a r k i s t u k s e l l a m m e + t a r k i s t u k s e l l e + t a r k i s t u k s e l l e m m e + t a r k i s t u k s e l l e n i + t a r k i s t u k s e m m e + t a r k i s t u k s e n + t a r k i s t u k s e n a + t a r k i s t u k s e n i + t a r k i s t u k s e n n e + t a r k i s t u k s e n s a + t a r k i s t u k s e s s a + t a r k i s t u k s e s s a a n + t a r k i s t u k s e s s a m m e + t a r k i s t u k s e s s a n i + t a r k i s t u k s e s t a + t a r k i s t u k s e t + t a r k i s t u k s i a + t a r k i s t u k s i a a n + t a r k i s t u k s i a k a a n + t a r k i s t u k s i a m m e + t a r k i s t u k s i a n i + t a r k i s t u k s i a n n e + t a r k i s t u k s i e n + t a r k i s t u k s i i m m e + t a r k i s t u k s i i n + t a r k i s t u k s i l l a + t a r k i s t u k s i l l a a n + t a r k i s t u k s i l l a m m e + t a r k i s t u k s i l l e + t a r k i s t u k s i l l e e n + t a r k i s t u k s i l l e m m e + t a r k i s t u k s i l t a + t a r k i s t u k s i n + t a r k i s t u k s i n a + t a r k i s t u k s i n e e n + t a r k i s t u k s i s s a + t a r k i s t u k s i s s a k i n + t a r k i s t u k s i s s a m m e + t a r k i s t u k s i s s a n i + t a r k i s t u k s i s s a n n e + t a r k i s t u k s i s t a + t a r k i s t u k s i s t a a n + t a r k i s t u k s i s t a m m e + t a r k i s t u k s i s t a n i + t a r k i s t u k s i t t a + t a r k i s t u s a s i a k i r j a a + t a r k i s t u s a s i a k i r j a a n + t a r k i s t u s a s i a k i r j a n + t a r k i s t u s a s i a k i r j a s t a + t a r k i s t u s e h d o t u k s e e n + t a r k i s t u s e h d o t u k s e l l a + t a r k i s t u s e h d o t u k s e l t a + t a r k i s t u s e h d o t u k s e m m e + t a r k i s t u s e h d o t u k s e n + t a r k i s t u s e h d o t u k s e n a + t a r k i s t u s e h d o t u k s e n i + t a r k i s t u s e h d o t u k s e n n e + t a r k i s t u s e h d o t u k s e n s a + t a r k i s t u s e h d o t u k s e s s a + t a r k i s t u s e h d o t u k s e s s a n i + t a r k i s t u s e h d o t u k s e s t a + t a r k i s t u s e h d o t u k s e s t a a n + t a r k i s t u s e h d o t u k s e t + t a r k i s t u s e h d o t u k s i a + t a r k i s t u s e h d o t u k s i a m m e + t a r k i s t u s e h d o t u k s i a n i + t a r k i s t u s e h d o t u k s i e n + t a r k i s t u s e h d o t u k s i i n + t a r k i s t u s e h d o t u k s i l l a + t a r k i s t u s e h d o t u k s i l l a a n + t a r k i s t u s e h d o t u k s i l l a n n e + t a r k i s t u s e h d o t u k s i l l e + t a r k i s t u s e h d o t u k s i n e e n + t a r k i s t u s e h d o t u k s i s s a + t a r k i s t u s e h d o t u k s i s s a a n + t a r k i s t u s e h d o t u k s i s s a m m e + t a r k i s t u s e h d o t u k s i s s a n i + t a r k i s t u s e h d o t u k s i s t a + t a r k i s t u s e h d o t u k s i s t a m m e + t a r k i s t u s e h d o t u s + t a r k i s t u s e h d o t u s t a + t a r k i s t u s e h d o t u s t a a n + t a r k i s t u s e h d o t u s t a n i + t a r k i s t u s e h d o t u s t e m m e + t a r k i s t u s e h d o t u s t e n + t a r k i s t u s e h d o t u s t e n s a + t a r k i s t u s e l i m i l l e + t a r k i s t u s e s i t y k s e n + t a r k i s t u s e s i t y k s i s s ä + t a r k i s t u s e s i t y k s i ä + t a r k i s t u s e s i t y s + t a r k i s t u s h a n k k e e s t a + t a r k i s t u s j ä r j e s t e l m ä n + t a r k i s t u s j ä r j e s t e l m ä s t ä + t a r k i s t u s j ä r j e s t e l m ä ä + t a r k i s t u s j ä r j e s t y k s e s s ä + t a r k i s t u s k i e r r o k s e l l a + t a r k i s t u s k i e r r o k s e n + t a r k i s t u s k i e r r o s + t a r k i s t u s k i e r r o s t a + t a r k i s t u s k i n + t a r k i s t u s k i r j e + t a r k i s t u s k i r j e l m ä n + t a r k i s t u s k i r j e l m ä ä + t a r k i s t u s k o k o n a i s u u d e s s a + t a r k i s t u s k o k o n a i s u u s + t a r k i s t u s k o k o u k s e n + t a r k i s t u s k o k o u k s e s s a + t a r k i s t u s k o n f e r e n s s i + t a r k i s t u s k o n f e r e n s s i a + t a r k i s t u s k o n f e r e n s s i i n + t a r k i s t u s k o n f e r e n s s i n + t a r k i s t u s k o n f e r e n s s i s s a + t a r k i s t u s k o r t t i a + t a r k i s t u s k ä y n n e i s t ä + t a r k i s t u s l a u s e k e + t a r k i s t u s l a u s e k e h a n + t a r k i s t u s l a u s e k e t t a + t a r k i s t u s l a u s e k k e e l l a + t a r k i s t u s l a u s e k k e e n + t a r k i s t u s l a u s e k k e e n a + t a r k i s t u s l a u s e k k e e s e e n + t a r k i s t u s l a u s e k k e e s s a + t a r k i s t u s l a u s e k k e e s t a + t a r k i s t u s l a u s e k k e e t + t a r k i s t u s l a u s e k k e i t a + t a r k i s t u s l i s t a t e s t i + t a r k i s t u s l u e t t e l o a + t a r k i s t u s l u e t t e l o n + t a r k i s t u s l u o n n o k s e e n + t a r k i s t u s l u o n n o k s e l l a + t a r k i s t u s l u o n n o k s e m m e + t a r k i s t u s l u o n n o k s e n + t a r k i s t u s l u o n n o k s e s t a + t a r k i s t u s l u o n n o k s e t + t a r k i s t u s l u o n n o k s i a + t a r k i s t u s l u o n n o k s i s s a + t a r k i s t u s l u o n n o k s i s s a n i + t a r k i s t u s l u o n n o k s i s t a + t a r k i s t u s l u o n n o s + t a r k i s t u s l u o n n o s t a + t a r k i s t u s l u o n n o s t e n + t a r k i s t u s l u o n n o s t e n s a + t a r k i s t u s m e k a n i s m e j a + t a r k i s t u s m e k a n i s m i + t a r k i s t u s m e k a n i s m i a + t a r k i s t u s m e k a n i s m i n + t a r k i s t u s m e n e t e l m ä n + t a r k i s t u s m e n e t e l m ä ä n + t a r k i s t u s m e n e t t e l y + t a r k i s t u s m e n e t t e l y j e n + t a r k i s t u s m e n e t t e l y j ä + t a r k i s t u s m e n e t t e l y l l e + t a r k i s t u s m e n e t t e l y n + t a r k i s t u s m e n e t t e l y s s ä + t a r k i s t u s m e n e t t e l y t + t a r k i s t u s m e n e t t e l y t a v o i s t a + t a r k i s t u s m e n e t t e l y y n + t a r k i s t u s m e n e t t e l y ä + t a r k i s t u s m e r k k i + t a r k i s t u s m u u t t u j a + t a r k i s t u s m u u t t u j a a + t a r k i s t u s o h j e l m a n + t a r k i s t u s o i k e u s + t a r k i s t u s o n g e l m a a + t a r k i s t u s p a k e t i l l a + t a r k i s t u s p a k e t i l l e + t a r k i s t u s p a k e t i n + t a r k i s t u s p a k e t i s s a + t a r k i s t u s p a k e t i s t a + t a r k i s t u s p a k e t t e i n e e n + t a r k i s t u s p a k e t t i + t a r k i s t u s p a k e t t i a + t a r k i s t u s p a k e t t i m m e + t a r k i s t u s p i s t e e n + t a r k i s t u s p i s t e i s t ä + t a r k i s t u s p o l i t i i k k o j a + t a r k i s t u s p r o s e s s i + t a r k i s t u s p r o s e s s i a + t a r k i s t u s p r o s e s s i i n + t a r k i s t u s p r o s e s s i n + t a r k i s t u s p r o s e s s i s s a + t a r k i s t u s p y y n t ö i h i n + t a r k i s t u s p y y n t ö j ä + t a r k i s t u s p y y n t ö ö n + t a r k i s t u s p ä i v ä m ä ä r ä ä + t a r k i s t u s p ö y t ä k i r j a a n + t a r k i s t u s r a p o r t t e j a + t a r k i s t u s r y h m ä + t a r k i s t u s r y h m ä n + t a r k i s t u s r y h m ä ä + t a r k i s t u s s a r j a a + t a r k i s t u s s a r j a n + t a r k i s t u s s ä ä n n ö s + t a r k i s t u s t a + t a r k i s t u s t a i s t e l u n + t a r k i s t u s t a m m e + t a r k i s t u s t a r p e e n + t a r k i s t u s t e h t ä v ä ä + t a r k i s t u s t e k s t i i n + t a r k i s t u s t e k s t i s t ä + t a r k i s t u s t e m m e + t a r k i s t u s t e n + t a r k i s t u s t e n s a + t a r k i s t u s t y y p p i + t a r k i s t u s t y ö + t a r k i s t u s t y ö h ö n + t a r k i s t u s t y ö m m e + t a r k i s t u s t y ö n + t a r k i s t u s v a a t i m u k s e t + t a r k i s t u s v a a t i m u s + t a r k i s t u s v a i h e e n + t a r k i s t u s v a i h e e s s a + t a r k i s t u s v e l v o l l i s u u s + t a r k k a a v a i s e m m i n + t a r k k a a v a i s e m p i + t a r k k a a v a i s e m p i a + t a r k k a a v a i s e n a + t a r k k a a v a i s i a + t a r k k a a v a i s i m m a t + t a r k k a a v a i s i m m i n + t a r k k a a v a i s i m m i s t a + t a r k k a a v a i s u u d e s t a + t a r k k a a v a i s u u d e s t a n n e + t a r k k a a v a i s u u t t a + t a r k k a i l e e + t a r k k a i l e m m e + t a r k k a i l i + t a r k k a i l i j a a m m e + t a r k k a i l i j a j ä r j e s t e l m ä n + t a r k k a i l i j a j ä s e n i ä + t a r k k a i l i j a k s i + t a r k k a i l i j a l ä h e t y s t ö + t a r k k a i l i j a n + t a r k k a i l i j a n a + t a r k k a i l i j a o h j e l m a + t a r k k a i l i j a o i k e u k s i e n + t a r k k a i l i j a r y h m i e n + t a r k k a i l i j a r y h m i ä + t a r k k a i l i j a r y h m ä + t a r k k a i l i j a r y h m ä n + t a r k k a i l i j a r y h m ä t k i n + t a r k k a i l i j a r y h m ä ä + t a r k k a i l i j a t + t a r k k a i l i j a t e h t ä v i s s ä + t a r k k a i l i j a t e h t ä v ä n + t a r k k a i l i j a v a l t u u s k u n n a l l e + t a r k k a i l i j a v a l t u u s k u n n a n + t a r k k a i l i j a v a l t u u s k u n n a s s a + t a r k k a i l i j a v a l t u u s k u n n a s t a + t a r k k a i l i j a v a l t u u s k u n n a t + t a r k k a i l i j a v a l t u u s k u n n i s t a + t a r k k a i l i j a v a l t u u s k u n t a + t a r k k a i l i j a v a l t u u s k u n t a a + t a r k k a i l i j a v a l t u u s k u n t i e n + t a r k k a i l i j o i d e n + t a r k k a i l i j o i h i n + t a r k k a i l i j o i k s i + t a r k k a i l i j o i n a + t a r k k a i l i j o i n e e n + t a r k k a i l i j o i t a + t a r k k a i l i n + t a r k k a i l l a + t a r k k a i l l a a n + t a r k k a i l t a v a + t a r k k a i l u a l o i t t e i d e n + t a r k k a i l u e l i m e n ä + t a r k k a i l u j a k s o + t a r k k a i l u j o u k k o j a + t a r k k a i l u j o u k k o j e n + t a r k k a i l u j o u k o t + t a r k k a i l u j ä r j e s t e l m i ä + t a r k k a i l u j ä r j e s t e l m ä + t a r k k a i l u j ä r j e s t e l m ä n + t a r k k a i l u k a u d e n + t a r k k a i l u k a u d e s t a + t a r k k a i l u k e s k u k s e n + t a r k k a i l u k e s k u s + t a r k k a i l u k o m i s s i o + t a r k k a i l u k o m i t e a n + t a r k k a i l u k ä y n n e i l l e + t a r k k a i l u l a u t a k u n n a n + t a r k k a i l u l i n j a s s a + t a r k k a i l u m a t k a a + t a r k k a i l u m a t k a n + t a r k k a i l u m e k a n i s m i i n + t a r k k a i l u n a l a i s i a + t a r k k a i l u o h j e l m a + t a r k k a i l u o i k e u s + t a r k k a i l u o i k e u t t a + t a r k k a i l u o p e r a a t i o + t a r k k a i l u o p e r a a t i o i h i n + t a r k k a i l u o p e r a a t i o i t a + t a r k k a i l u o p e r a a t i o n + t a r k k a i l u p a i k k a + t a r k k a i l u p a i k k o j e n + t a r k k a i l u p r o s e s s i + t a r k k a i l u r y h m i e n + t a r k k a i l u r y h m ä n + t a r k k a i l u r y h m ä ä + t a r k k a i l u s a t e l l i i t t e j a + t a r k k a i l u s s a + t a r k k a i l u t e h t ä v i e n + t a r k k a i l u t e h t ä v i i n + t a r k k a i l u t e h t ä v i s s ä + t a r k k a i l u t e h t ä v i s t ä + t a r k k a i l u t e h t ä v ä + t a r k k a i l u t e h t ä v ä l l e + t a r k k a i l u t e h t ä v ä ä n + t a r k k a i l u t i e t o k a n t o j e n + t a r k k a i l u t o i m i a + t a r k k a i l u t o i m i n n a n + t a r k k a i l u t o i m i n t a + t a r k k a i l u u n + t a r k k a i l u v a l t u u s k u n n a l l a + t a r k k a i l u v a l t u u s k u n n a n + t a r k k a i l u v a l t u u s k u n t a + t a r k k a i l u v a l t u u s k u n t a a + t a r k k a i l u v a l t u u s k u n t a a n + t a r k k a i l u v a l t u u s k u n t a m m e + t a r k k a i l u v a l t u u s k u n t a n s a + t a r k k a i l u v a l t u u s k u n t i a + t a r k k a i l u v a l t u u s k u n t i e n + t a r k k a i l u v a l t u u s k u n t i e n s a + t a r k k a i l u v i e r a i l u + t a r k k a n a + t a r k k a n ä k ö i s e m p i + t a r k k a n ä k ö i s e t + t a r k k a s i l m ä i s i m p i e n + t a r k k o i n a + t a r k k o j a + t a r k k o j e n + t a r k k u u s s t a n d a r d i a + t a r k k u u t t a + t a r k o i s t a + t a r k o i t a m m e + t a r k o i t a n + t a r k o i t a n k i n + t a r k o i t a t t e + t a r k o i t a t t e k o + t a r k o i t e t a + t a r k o i t e t a a n + t a r k o i t e t t a v a + t a r k o i t e t t u + t a r k o i t e t t u a + t a r k o i t e t t u i h i n + t a r k o i t e t t u j a + t a r k o i t e t t u j e n + t a r k o i t e t t u u n + t a r k o i t e t u i s t a + t a r k o i t e t u n + t a r k o i t e t u t + t a r k o i t i n + t a r k o i t i t t e k o + t a r k o i t t a a + t a r k o i t t a a k i n + t a r k o i t t a a k o + t a r k o i t t a e s s a m m e + t a r k o i t t a i s i + t a r k o i t t a i s i m m e + t a r k o i t t a n e e + t a r k o i t t a n u t + t a r k o i t t a v a n + t a r k o i t t a v a t + t a r k o i t t a v i a + t a r k o i t t a v i e n + t a r k o i t t i v a t + t a r k o i t u k s e e m m e + t a r k o i t u k s e e n + t a r k o i t u k s e e n s a + t a r k o i t u k s e l l a + t a r k o i t u k s e l l i s e n + t a r k o i t u k s e l l i s e s t a + t a r k o i t u k s e l l i s t a + t a r k o i t u k s e m m e + t a r k o i t u k s e n + t a r k o i t u k s e n a + t a r k o i t u k s e n a a n + t a r k o i t u k s e n a h a n + t a r k o i t u k s e n a k i n + t a r k o i t u k s e n a m m e + t a r k o i t u k s e n a n i + t a r k o i t u k s e n i + t a r k o i t u k s e n m u k a i s e e n + t a r k o i t u k s e n m u k a i s e l l a + t a r k o i t u k s e n m u k a i s e l t a + t a r k o i t u k s e n m u k a i s e m m a l l a + t a r k o i t u k s e n m u k a i s e m m a n + t a r k o i t u k s e n m u k a i s e m m a t + t a r k o i t u k s e n m u k a i s e m m i n + t a r k o i t u k s e n m u k a i s e m p a a + t a r k o i t u k s e n m u k a i s e m p a n a + t a r k o i t u k s e n m u k a i s e m p i + t a r k o i t u k s e n m u k a i s e m p i a + t a r k o i t u k s e n m u k a i s e m p i a k i n + t a r k o i t u k s e n m u k a i s e m p i i n + t a r k o i t u k s e n m u k a i s e n + t a r k o i t u k s e n m u k a i s e n a + t a r k o i t u k s e n m u k a i s e s s a + t a r k o i t u k s e n m u k a i s e t + t a r k o i t u k s e n m u k a i s i a + t a r k o i t u k s e n m u k a i s i l l a + t a r k o i t u k s e n m u k a i s i m m a k s i + t a r k o i t u k s e n m u k a i s i m m a l l a + t a r k o i t u k s e n m u k a i s i m m a l l e + t a r k o i t u k s e n m u k a i s i m m a l t a + t a r k o i t u k s e n m u k a i s i m m a n + t a r k o i t u k s e n m u k a i s i m m a s t a + t a r k o i t u k s e n m u k a i s i m m a t + t a r k o i t u k s e n m u k a i s i m p a n a + t a r k o i t u k s e n m u k a i s i m p i a + t a r k o i t u k s e n m u k a i s i n + t a r k o i t u k s e n m u k a i s i n t a + t a r k o i t u k s e n m u k a i s i s t a + t a r k o i t u k s e n m u k a i s u u s s y i s t ä + t a r k o i t u k s e n m u k a i s u u s t u t k i m u k s e t + t a r k o i t u k s e n m u k a i s u u t t a + t a r k o i t u k s e n s a + t a r k o i t u k s e s s a + t a r k o i t u k s e s t a + t a r k o i t u k s i i n + t a r k o i t u k s i s s a + t a r k o i t u s h a k u i s i a + t a r k o i t u s k a a n + t a r k o i t u s k i n + t a r k o i t u s p e r i i m m e + t a r k o i t u s p e r i s t ä + t a r k o i t u s p e r i s t ä ä n + t a r k o i t u s p e r i ä + t a r k o i t u s t a + t a r k o i t u s t a a n + t a r m o k k a a m m i n + t a r m o k k a a m p a a + t a r m o k k a a m p i + t a r m o k k a a m p i a + t a r m o k k a a s t a + t a r m o k k a i t a + t a r m o l l a a n + t a r m o n n e + t a r p e e k s e m m e + t a r p e e l l i s e e n + t a r p e e l l i s e k s i + t a r p e e l l i s e l l a + t a r p e e l l i s e l t a + t a r p e e l l i s e m m a k s i + t a r p e e l l i s e m m a n + t a r p e e l l i s e m m i k s i + t a r p e e l l i s e m p a a + t a r p e e l l i s e m p a n a + t a r p e e l l i s e m p i + t a r p e e l l i s e m p i a + t a r p e e l l i s e n + t a r p e e l l i s e n a + t a r p e e l l i s e s s a + t a r p e e l l i s e s t a + t a r p e e l l i s e t + t a r p e e l l i s i a + t a r p e e l l i s i i n + t a r p e e l l i s i k s i + t a r p e e l l i s i m m a t + t a r p e e l l i s i m p i n a + t a r p e e l l i s i n a + t a r p e e l l i s i n t a + t a r p e e l l i s i s t a + t a r p e e l l i s t a + t a r p e e l l i s t e n + t a r p e e l l i s u u d e s t a + t a r p e e l l i s u u s k r i t e e r e i t ä + t a r p e e l l i s u u s p e r i a a t e t t a + t a r p e e l l i s u u s p e r i a a t t e i d e n + t a r p e e l l i s u u t t a + t a r p e e n k i n + t a r p e e s e e n + t a r p e e s s a + t a r p e e s t a + t a r p e e s t a m m e + t a r p e e t + t a r p e e t o n t a + t a r p e e t t o m a k s i + t a r p e e t t o m a m m i k s i + t a r p e e t t o m a n + t a r p e e t t o m a n a + t a r p e e t t o m a n k i n + t a r p e e t t o m a s t a + t a r p e e t t o m a t + t a r p e e t t o m i a + t a r p e e t t o m i e n + t a r p e e t t o m i k s i + t a r p e e t t o m i l l a + t a r p e e t t o m i m m a t + t a r p e e t t o m i n a + t a r p e i d e n + t a r p e i d e n a r v i o i n n i l l e + t a r p e i d e n s a + t a r p e i s i i m m e + t a r p e i s i i n + t a r p e i s i i n s a + t a r p e i s t a + t a r p e i t a + t a r p e i t a a n + t a r p e i t a m m e + t a r r a k i r j o i t i n + t a r r a t + t a r r a u t u i + t a r t t u a + t a r t t u i s i m m e + t a r t t u k a a m m e + t a r t t u m a a n + t a r t t u m a t t a + t a r t t u m i s e s t a + t a r t t u m i s r i s k i + t a r t t u m i s t a v a t + t a r t t u m i s v a a r a a + t a r t t u u + t a r t t u v a m p a a + t a r t t u v i e n + t a r t t u v i l t a + t a r t t u v u u s k y s y m y k s e s t ä + t a r t u m m e + t a r t u n n a n + t a r t u n n a n p e l k o + t a r t u n n a s t a + t a r t u n n o i s t a + t a r t u n t a i l m i ö n + t a r t u n t a k e t j u j a + t a r t u n t a l u k u j e n + t a r t u n t a m a h d o l l i s u u d e n + t a r t u n t a m a h d o l l i s u u k s i a + t a r t u n t a m a i d e n + t a r t u n t a m u o d o t + t a r t u n t a p a l k k i o j ä r j e s t e l m ä k s i + t a r t u n t a p e l o s t a + t a r t u n t a r e i t e i s t ä + t a r t u n t a r e i t t i ä + t a r t u n t a r i s k e i s t ä + t a r t u n t a r i s k i e n + t a r t u n t a r i s k i i n + t a r t u n t a r i s k i l l e + t a r t u n t a r i s k i n + t a r t u n t a r i s k i s t ä + t a r t u n t a r i s k i t + t a r t u n t a r i s k i ä + t a r t u n t a t a p a + t a r t u n t a t a p a a + t a r t u n t a t a p a u k s i a + t a r t u n t a t a p a u k s i s s a + t a r t u n t a t a p a u s t a + t a r t u n t a t a p o i h i n + t a r t u n t a t a p o j a + t a r t u n t a t a p o j e n + t a r t u n t a t a u d e i l l e + t a r t u n t a t a u d e i l t a + t a r t u n t a t a u d e i s t a + t a r t u n t a t a u d i s t a + t a r t u n t a t a u d i t + t a r t u n t a t a u t e i h i n + t a r t u n t a t a u t e j a + t a r t u n t a t a u t i a + t a r t u n t a t a u t i a s i o i s s a + t a r t u n t a t a u t i e n + t a r t u n t a t a u t i e p i d e m i a + t a r t u n t a t a u t i i n + t a r t u n t a t a u t i l a i n s ä ä d ä n t ö + t a r t u n t a t a u t i r i s k i ä + t a r t u n t a t a u t i t a p a u s t e n + t a r t u n t a t a u t i v e r k o s t o + t a r t u n t a t a u t i v e r k o s t o a + t a r t u n t a t a u t i v i r a s t o + t a r t u n t a t a u t i v i r a s t o s t a + t a r t u n t a v a a r a a + t a r t u n t a v a a r a n + t a r t u n t a v a i k u t u s + t a r t u n t a v a s t a + t a r t u n t o j a + t a r t u n t o j e n + t a r t u t a a n + t a r t u t t a v a + t a r t u t t i i n k i n + t a r u a + t a r u k e i s a r i k a l a + t a r u o l e n n o i s t a + t a r u o l e n t o + t a r v e a n a l y y s i + t a r v e a n a l y y s i n + t a r v e a r v i o + t a r v e a r v i o i n t e j a + t a r v e a r v i o i n t i + t a r v e a r v i o i n t i a + t a r v e a r v i o i n t i k e r t o m u s + t a r v e a r v i o i n t i t e h t ä v ä + t a r v e a r v i o i t a + t a r v e h a r k i n t a + t a r v e h i e r a r k i a + t a r v e l a s k e l m a t + t a r v e l ä h t ö i n e n + t a r v e l ä h t ö i s t ä + t a r v e p a i n a t u k s e n + t a r v e p a i n a t u s + t a r v e p o h j a i s e n + t a r v e t t a + t a r v i k e k u l j e t u s t e n + t a r v i k k e i s i i n + t a r v i k k e i t a + t a r v i t a + t a r v i t a a n + t a r v i t a a n h a n + t a r v i t a a n k i n + t a r v i t a a n k o + t a r v i t e s s a a n + t a r v i t s e e + t a r v i t s e e k o + t a r v i t s e m a a + t a r v i t s e m a l l e m m e + t a r v i t s e m a m m e + t a r v i t s e m a n s a + t a r v i t s e m a t t a + t a r v i t s e m m e + t a r v i t s e m m e h a n + t a r v i t s e m m e k i n + t a r v i t s e m m e k o + t a r v i t s e n + t a r v i t s e t t e + t a r v i t s e t t e k o + t a r v i t s e v a m m e + t a r v i t s e v a n + t a r v i t s e v a n i + t a r v i t s e v a n s a + t a r v i t s e v a t + t a r v i t s e v a t k i n + t a r v i t s e v a t k o + t a r v i t s e v i a + t a r v i t s e v i e n + t a r v i t s e v i i n + t a r v i t s e v i l l e + t a r v i t s e v i l t a + t a r v i t s i + t a r v i t s i m m e + t a r v i t s i s i + t a r v i t s i s i m m e + t a r v i t s i s i v a t + t a r v i t t a i s i i n + t a r v i t t a i s i i n k o + t a r v i t t a v a + t a r v i t t a v a a + t a r v i t t a v a a n + t a r v i t t a v a l l a + t a r v i t t a v a n + t a r v i t t a v a s s a + t a r v i t t a v a s t a + t a r v i t t a v a t + t a r v i t t a v i a + t a r v i t t a v i e n + t a r v i t t a v i i n + t a r v i t t a v i n + t a r v i t t a v i s t a + t a r v i t t i i n + t a s a a m a a n + t a s a a m i s t a + t a s a a v a + t a s a a v a a + t a s a a v a l l e + t a s a a v i e n + t a s a a v i i n + t a s a a v i l l a + t a s a i s e e n + t a s a i s e m m a n + t a s a i s e m m i n + t a s a i s e m p a a + t a s a i s e m p a a n + t a s a i s e m p i + t a s a i s i n + t a s a j a k a u m a + t a s a j a k o a + t a s a k a t t o + t a s a l ä m p ö i s i s s ä + t a s a l ä m p ö i s y y s + t a s a n g o t + t a s a n k o a l u e i d e n + t a s a n k o a l u e i l l e + t a s a n k o i n t i a a n i t + t a s a n k o m a a g o r i l l a + t a s a p a i n o + t a s a p a i n o a + t a s a p a i n o a i s t i i n + t a s a p a i n o a m m e + t a s a p a i n o e l e m e n t t i + t a s a p a i n o e l i n + t a s a p a i n o e r i k s i + t a s a p a i n o h i n n a n + t a s a p a i n o i l e e + t a s a p a i n o i l l e s s a m m e + t a s a p a i n o i l u a + t a s a p a i n o i l u n + t a s a p a i n o i l u u n + t a s a p a i n o i n e n + t a s a p a i n o i s e e n + t a s a p a i n o i s e k s i + t a s a p a i n o i s e l l a + t a s a p a i n o i s e l t a + t a s a p a i n o i s e m m a k s i + t a s a p a i n o i s e m m a l l a + t a s a p a i n o i s e m m a l l e + t a s a p a i n o i s e m m a l t a + t a s a p a i n o i s e m m a n + t a s a p a i n o i s e m m a s s a + t a s a p a i n o i s e m m a s t a + t a s a p a i n o i s e m m a t + t a s a p a i n o i s e m m i k s i + t a s a p a i n o i s e m m i n + t a s a p a i n o i s e m p a a + t a s a p a i n o i s e m p a a n + t a s a p a i n o i s e m p a n a + t a s a p a i n o i s e m p i + t a s a p a i n o i s e m p i a + t a s a p a i n o i s e m p i e n + t a s a p a i n o i s e m p i i n + t a s a p a i n o i s e n + t a s a p a i n o i s e n a + t a s a p a i n o i s e s s a + t a s a p a i n o i s e s t a + t a s a p a i n o i s e s t i + t a s a p a i n o i s e t + t a s a p a i n o i s i a + t a s a p a i n o i s i l l a + t a s a p a i n o i s i m m i s t a + t a s a p a i n o i s i n a + t a s a p a i n o i s i s s a + t a s a p a i n o i s i s t a + t a s a p a i n o i s t a + t a s a p a i n o i s t e n + t a s a p a i n o i s u u d e n + t a s a p a i n o i s u u d e s t a + t a s a p a i n o i s u u t t a + t a s a p a i n o k o r k e u s + t a s a p a i n o l l a + t a s a p a i n o l l e + t a s a p a i n o m e k a n i s m i a + t a s a p a i n o n + t a s a p a i n o n s a + t a s a p a i n o n t a j u + t a s a p a i n o o n + t a s a p a i n o p a l k k a + t a s a p a i n o p e r i a a t e + t a s a p a i n o p e r i a a t t e e n + t a s a p a i n o p e r i a a t t e e s e e n + t a s a p a i n o p e r i a a t t e i t a + t a s a p a i n o p i s t e e n + t a s a p a i n o p i s t e e s t ä + t a s a p a i n o p y r k i m y k s e n + t a s a p a i n o s s a + t a s a p a i n o s t a + t a s a p a i n o s t a a n + t a s a p a i n o t a i t e i l i j a + t a s a p a i n o t a v o i t t e e t + t a s a p a i n o t e k i j ä + t a s a p a i n o t e t t a v a + t a s a p a i n o t e t t u j a + t a s a p a i n o t e t u m m a l l e + t a s a p a i n o t e t u m m a n + t a s a p a i n o t e t u m m a s s a + t a s a p a i n o t i l a + t a s a p a i n o t i l o j a + t a s a p a i n o t t a a + t a s a p a i n o t t a a k s e m m e + t a s a p a i n o t t a i s i + t a s a p a i n o t t a j a n + t a s a p a i n o t t a m a a n + t a s a p a i n o t t a m i s e k s i + t a s a p a i n o t t a m i s e s s a + t a s a p a i n o t t a m i s t a + t a s a p a i n o t t a n u t + t a s a p a i n o t t a v a a + t a s a p a i n o t t a v a n a + t a s a p a i n o t t e l u + t a s a p a i n o t t e l u a + t a s a p a i n o t t e l u s t a + t a s a p a i n o t t e l u u n + t a s a p a i n o t t o m a l t a + t a s a p a i n o t t o m a m p i a + t a s a p a i n o t t o m a s t i + t a s a p a i n o t t o m a t + t a s a p a i n o t u k i + t a s a p a i n o t u k s e n + t a s a p a i n o t u s l i i v i + t a s a p a i n o t u s l o g i i k k a a + t a s a p a i n o t u s t a + t a s a p a i n o v a k i o + t a s a p a i n o v a l u u t t a k u r s s i n a + t a s a p a n o i s t a + t a s a p u o l i n e n + t a s a p u o l i s e e n + t a s a p u o l i s e l l a + t a s a p u o l i s e l t a + t a s a p u o l i s e m m a n + t a s a p u o l i s e m m a t + t a s a p u o l i s e m m i k s i + t a s a p u o l i s e m m i n + t a s a p u o l i s e m p a a + t a s a p u o l i s e m p a a n + t a s a p u o l i s e m p i + t a s a p u o l i s e m p i a + t a s a p u o l i s e n + t a s a p u o l i s e n a + t a s a p u o l i s e s s a + t a s a p u o l i s e s t a + t a s a p u o l i s e s t i + t a s a p u o l i s e t + t a s a p u o l i s i a + t a s a p u o l i s i i n + t a s a p u o l i s i l l a + t a s a p u o l i s i m m a n + t a s a p u o l i s i n + t a s a p u o l i s t a m i n e n + t a s a p u o l i s t a m i s t a + t a s a p u o l i s t e n + t a s a p u o l i s u u d e s t a + t a s a p u o l i s u u s p e r i a a t t e e n + t a s a p u o l i s u u s p e r i a a t t e i d e n + t a s a p u o l i s u u s t a v o i t t e e t + t a s a p u o l i s u u t e e n + t a s a p u o l i s u u t t a + t a s a t a h t i a + t a s a t a h t i s e n + t a s a t t a v a + t a s a u k s e e n + t a s a u s h i n t o j a + t a s a u s h y v i t y s j ä r j e s t e l m ä n + t a s a u s h y v i t y s t e n + t a s a u s j a k s o + t a s a u s j ä r j e s t e l m i ä + t a s a u s j ä r j e s t e l m ä + t a s a u s j ä r j e s t e l m ä n + t a s a u s j ä r j e s t e l m ä ä n + t a s a u s k a p a s i t e e t i s t a + t a s a u s k a s s a + t a s a u s m a k s u + t a s a u s m a k s u a + t a s a u s m a k s u i n + t a s a u s m a k s u i s t a + t a s a u s m a k s u j a + t a s a u s m a k s u j e n + t a s a u s m a k s u t + t a s a u s m e k a n i s m i n + t a s a u s m e n e t t e l y n + t a s a u s t o i m e n p i t e i t ä + t a s a u s t u e t + t a s a u s t u k e a + t a s a u s t u k i a + t a s a u s t u k i e n + t a s a u s t u k i j ä r j e s t e l m ä + t a s a v a h v o j a + t a s a v a l l a l l e + t a s a v a l l a n + t a s a v a l l a s s a + t a s a v a l l a s t a + t a s a v a l l o i s s a + t a s a v a l t a + t a s a v a l t a a + t a s a v a l t a a n + t a s a v a l t a l a i n e n + t a s a v a l t a l a i s a r m e i j a + t a s a v a l t a l a i s a r m e i j a n + t a s a v a l t a l a i s k a a r t i + t a s a v a l t a l a i s l i i k k e e n + t a s a v a l t a l a i s o h j e l m a s s a a n + t a s a v a l t a l a i s v e l j e s k u n t a + t a s a v a l t a n a a n + t a s a v a l t a p e r i a a t t e e n + t a s a v e r o + t a s a v e r o a + t a s a v e r o i n e n + t a s a v e r o i s e e n + t a s a v e r o i s e m p i a + t a s a v e r o i s e n a + t a s a v e r o i s e s s a + t a s a v e r o i s e s t i + t a s a v e r o i s i a + t a s a v e r o i s i n a + t a s a v e r o i s t e n + t a s a v e r t a i n e n + t a s a v e r t a i s e e n + t a s a v e r t a i s e m m a t + t a s a v e r t a i s e m m i n + t a s a v e r t a i s e m p a a n + t a s a v e r t a i s e m p i a + t a s a v e r t a i s e m p i e n + t a s a v e r t a i s e n + t a s a v e r t a i s e n a + t a s a v e r t a i s e s s a + t a s a v e r t a i s e s t a + t a s a v e r t a i s e s t i + t a s a v e r t a i s e t + t a s a v e r t a i s i a + t a s a v e r t a i s i i n + t a s a v e r t a i s i k s i + t a s a v e r t a i s i n + t a s a v e r t a i s i n a + t a s a v e r t a i s i s s a + t a s a v e r t a i s i s t a + t a s a v e r t a i s t a m i s t a + t a s a v e r t a i s t e n + t a s a v e r t a i s u u d e n + t a s a v e r t a i s u u d e s t a + t a s a v e r t a i s u u s + t a s a v e r t a i s u u s p e r i a a t t e e l t a + t a s a v e r t a i s u u t e e n + t a s a v e r t a i s u u t t a + t a s a v i r i t y s + t a s a v i r r a n + t a s a v i r t a + t a s a v i r t a m o o t t o r i + t a s a v ä k i s e s t i + t a s a v ä k i s i ä + t a s a ä ä n i n + t a s e e n + t a s e e n s a + t a s e e s e e n + t a s e e s s a + t a s e e s t a + t a s e e t + t a s e i d e n + t a s e i s i i n + t a s e i s s a + t a s e i s s a a n + t a s e i s t a + t a s e i t a + t a s e l a s k e l m a k s i + t a s e l a s k e l m a n + t a s e l u k u j a + t a s e t t a + t a s k u i h i n + t a s k u k a i v a j a + t a s k u k e l l o + t a s k u k i r j a + t a s k u k o k o i s e n + t a s k u k u u t i o + t a s k u l a m p u n + t a s k u l a s k i m i a + t a s k u l a s k i m i i n + t a s k u l a s k i m i s t a + t a s k u m a t t i + t a s k u p u h e l u + t a s k u r a h a a + t a s k u r a h o i s t a + t a s k u r a h o j a + t a s k u s s a a n + t a s k u s t a + t a s k u t + t a s k u t a i s t e l u l a i v a + t a s k u t r u m p e t t i + t a s k u v a r k a u k s i a + t a s k u v a r k a u k s i i n + t a s o a + t a s o a a l t o + t a s o e r o j a + t a s o e r o t + t a s o h y p p e l y + t a s o i l l a + t a s o i s e s t a + t a s o i s e t + t a s o i s i l l a + t a s o i s t a + t a s o i s t a a n + t a s o i t e t a a n + t a s o i t e t t a v a + t a s o i t t a a + t a s o i t t a a k s e e n + t a s o i t t a a k s e n n e + t a s o i t t a m i s e k s i + t a s o i t t i v a t + t a s o i t u s j ä r j e s t e l m ä + t a s o i t u s j ä r j e s t e l m ä n + t a s o i t u s j ä r j e s t e l m ä ä + t a s o i t u s m e k a n i s m i + t a s o i t u s p r o s e s s i n + t a s o i t u s r a h a s t o i l l a + t a s o i t u s s ä ä n t e l y + t a s o i t u s t o i m e n p i t e e t + t a s o i t u s t o i m e n p i t e i d e n + t a s o i t u s t o i m e n p i t e i s i i n + t a s o i t u s t o i m e n p i t e i t ä + t a s o i t u s t u l l e j a + t a s o i t u s t u l l i e n + t a s o j a + t a s o j e n + t a s o k a s t a + t a s o k i n + t a s o k k a a s s a + t a s o k s i + t a s o l a s i y l i o p i s t o + t a s o l l a + t a s o l l e + t a s o l t a a n + t a s o l t a k i n + t a s o n + t a s o n s a + t a s o n s ä ä t ö + t a s o o n + t a s o r i s t e y s + t a s o s s a + t a s o s t a + t a s o t + t a t a a r i v a a h t e r a + t a t i n r i e s a + t a t i t + t a t u o i n t i k o n e + t a u d e i l l e + t a u d e i s t a + t a u d i n + t a u d i n a i h e u t t a j a + t a u d i n a i h e u t t a j a a + t a u d i n a i h e u t t a j a n + t a u d i n a i h e u t t a j i a + t a u d i n a i h e u t t a j i e n + t a u d i n a i h e u t t a j i n + t a u d i n h ä v i t t ä m i s o h j e l m a n + t a u d i n k a n t a j a + t a u d i n k u l k u + t a u d i n l ä h t e i d e n + t a u d i n m ä ä r i t y s m e n e t e l m i e n + t a u d i n m ä ä r i t y s m e n e t e l m ä + t a u d i n m ä ä r i t y s t e k n i i k k o i h i n + t a u d i n s i e m e n i e n + t a u d i n t o r j u n t a a n + t a u d i n t o r j u n t a k e i n o a + t a u d i n t o r j u n t a s t r a t e g i a a + t a u d i n t o r j u n t a s u u n n i t e l m a a + t a u d i s t a + t a u d i t + t a u k o j a + t a u k o j e n + t a u l a k ä ä p ä + t a u l u k k o a + t a u l u k k o e d u i s t a + t a u l u k k o n s a + t a u l u m a a l a u s + t a u l u t i e t o k o n e + t a u l u t i e t o k o n e e t + t a u o i s t a + t a u o i t t a + t a u o n + t a u o s t a + t a u o t + t a u o t o n t a + t a u o t t a + t a u r i o n t a t t i + t a u s t a a + t a u s t a a n + t a u s t a j o u k k o j e n + t a u s t a l a u l a j a + t a u s t a l l a + t a u s t a m a t e r i a a l i a + t a u s t a m a t e r i a a l i s t a + t a u s t a m e l u s t a + t a u s t a m u s i i k k i n a + t a u s t a m u u s i k k o a + t a u s t a m u u s i k k o j e n + t a u s t a m u u s i k o i d e n + t a u s t a m u u s i k o i l l e + t a u s t a m u u s i k o i s t a + t a u s t a m u u s i k o i t a + t a u s t a m u u s i k o t + t a u s t a n + t a u s t a o l e t t a m u k s e t + t a u s t a p a l v e l u t + t a u s t a p e i l i s i + t a u s t a p i t o i s u u k s i a + t a u s t a p i t o i s u u s + t a u s t a p i t o i s u u s t a s o t + t a u s t a p i t o i s u u t t a + t a u s t a p ä ä s t ö t + t a u s t a r a k e n t e i t a + t a u s t a r o o l i s s a + t a u s t a s o i t t a j a l l e + t a u s t a s t a + t a u s t a s t a a n + t a u s t a s t a n i + t a u s t a s y i h i n + t a u s t a s y y n ä + t a u s t a s ä t e i l y + t a u s t a s ä t e i l y a r v o j a + t a u s t a s ä t e i l y y n + t a u s t a t + t a u s t a t e k i j ä + t a u s t a t e k i j ä n + t a u s t a t e k i j ö i d e n + t a u s t a t i e d o n + t a u s t a t i e d o t + t a u s t a t i e t o + t a u s t a t i e t o a + t a u s t a t i e t o j a + t a u s t a t i e t o j e n + t a u s t a t u k e a + t a u s t a t u k i k o h t i e n + t a u s t a t y ö l l ä ä n + t a u s t a t y ö n + t a u s t a v o i m a n a + t a u s t o i s t a + t a u s t o j a + t a u t e i h i n + t a u t e j a + t a u t i a + t a u t i a l u e i l l a + t a u t i e n + t a u t i e n t o r j u n n a n + t a u t i e n t o r j u n t a k e i n o n a + t a u t i e n t o r j u n t a k e s k u k s e n + t a u t i e n t o r j u n t a k e s k u s t e n + t a u t i e n v a l v o n t a k e s k u s t e n + t a u t i e n v a l v o n t a v i r a n o m a i n e n + t a u t i e p i d e m i a + t a u t i e p i d e m i a t + t a u t i e p i d e m i o i d e n + t a u t i e p i d e m i o i l t a + t a u t i e p i d e m i o i t a + t a u t i e p ä i l y + t a u t i e p ä i l y t + t a u t i h i e r a r k i a l l a + t a u t i k o h t a i s i a + t a u t i k o h t a i s t e n + t a u t i k r i i s i + t a u t i k u o r m i t u k s e s t a + t a u t i l u e t t e l o a + t a u t i l u o k i t u k s e s t a + t a u t i m u o d o i l l e + t a u t i p e r i n t ö + t a u t i p e s ä k k e e n + t a u t i p o l i t i i k a n + t a u t i r a p o r t o i n n i n + t a u t i r i s k i ä + t a u t i t a a k a s t a + t a u t i t a p a u k s i a + t a u t i t a p a u k s i e n + t a u t i t a p a u k s i s s a + t a u t i t a p a u s t a + t a u t i t i l a n n e + t a u t i t i l a n t e e n + t a u t i t i l a s t o t + t a u t i u h k i e n + t a u t i v a a r a + t a u t i v a a r a a n + t a u t i v a i h e i s s a + t a u t i v a l v o n n a s t a + t a u t o l o g i a a n + t a v a k s i + t a v a l l i s e e n + t a v a l l i s e m p a a + t a v a l l i s e m p a n a + t a v a l l i s e m p i a + t a v a l l i s e n + t a v a l l i s e n a + t a v a l l i s e s s a + t a v a l l i s e s t a + t a v a l l i s e s t i k i n + t a v a l l i s e t + t a v a l l i s i a + t a v a l l i s i l l a + t a v a l l i s i l l e + t a v a l l i s i m m a t + t a v a l l i s i m m i n + t a v a l l i s i m p i a + t a v a l l i s i n + t a v a l l i s i s s a + t a v a l l i s i s t a + t a v a l l i s t a + t a v a l l i s t e n + t a v a l t a + t a v a n n e e t + t a v a n n u t + t a v a n o m a i n e n + t a v a n o m a i s e e n + t a v a n o m a i s e k s i + t a v a n o m a i s e l l e + t a v a n o m a i s e m p a a + t a v a n o m a i s e n + t a v a n o m a i s e n a + t a v a n o m a i s e s s a + t a v a n o m a i s e s t a + t a v a n o m a i s e s t i + t a v a n o m a i s e t + t a v a n o m a i s i a + t a v a n o m a i s i i n + t a v a n o m a i s i l l e + t a v a n o m a i s i m p i a + t a v a n o m a i s i n + t a v a n o m a i s i n a + t a v a n o m a i s i s s a + t a v a n o m a i s i s t a + t a v a n o m a i s t a + t a v a n o m a i s t e n + t a v a r a a + t a v a r a f e t i s i s m i + t a v a r a h a n k i n t o j a + t a v a r a h i s s e j ä + t a v a r a i l m o i t u k s i a + t a v a r a j u n a + t a v a r a j u n a a n + t a v a r a j u n a k s i + t a v a r a j u n a l i i k e n n e + t a v a r a j u n a t + t a v a r a j u n i a + t a v a r a j u n i e n + t a v a r a j u n i l l e + t a v a r a j u n i s t a + t a v a r a k a u p a l l a + t a v a r a k a u p a n + t a v a r a k a u p a s t a + t a v a r a k a u p p a + t a v a r a k a u p p a a + t a v a r a k a u p p a a n + t a v a r a k o n t t i a + t a v a r a k o n t t i l i i k e n n e + t a v a r a k u l j e t u k s e t + t a v a r a k u l j e t u k s i a + t a v a r a k u l j e t u k s i i n + t a v a r a k u l j e t u k s i s t a + t a v a r a k u l j e t u s + t a v a r a k u l j e t u s t a + t a v a r a k u l j e t u s t e n + t a v a r a l a v o j e n + t a v a r a l i i k e n n e + t a v a r a l i i k e n n e a l a + t a v a r a l i i k e n n e a l a n + t a v a r a l i i k e n n e i n f r a s t r u k t u u r i + t a v a r a l i i k e n n e j ä r j e s t e l m ä n + t a v a r a l i i k e n n e j ä r j e s t e l m ä s t ä + t a v a r a l i i k e n n e j ä r j e s t e l m ä ä n + t a v a r a l i i k e n n e k e t j u + t a v a r a l i i k e n n e k i n + t a v a r a l i i k e n n e k ä y t ä v i e n + t a v a r a l i i k e n n e k ä y t ä v i s s ä + t a v a r a l i i k e n n e k ä y t ä v i ä + t a v a r a l i i k e n n e k ä y t ä v ä n + t a v a r a l i i k e n n e m a r k k i n a t + t a v a r a l i i k e n n e m a r k k i n o i d e n + t a v a r a l i i k e n n e m a r k k i n o i l l a + t a v a r a l i i k e n n e m a r k k i n o i t a + t a v a r a l i i k e n n e m ä ä r i e n + t a v a r a l i i k e n n e p a l v e l u i l l e + t a v a r a l i i k e n n e p a l v e l u i s t a + t a v a r a l i i k e n n e p a l v e l u j a + t a v a r a l i i k e n n e p a l v e l u j e n + t a v a r a l i i k e n n e p a l v e l u t + t a v a r a l i i k e n n e p o l i t i i k k a a + t a v a r a l i i k e n n e r a t k a i s u j a + t a v a r a l i i k e n n e r e i t i n + t a v a r a l i i k e n n e s e k t o r i n + t a v a r a l i i k e n n e t t ä + t a v a r a l i i k e n n e v e r k k o a + t a v a r a l i i k e n n e v e r k k o j e n + t a v a r a l i i k e n n e v e r k k o n s a + t a v a r a l i i k e n n e v e r k o i s t a + t a v a r a l i i k e n n e v e r k o n + t a v a r a l i i k e n n e v i r t o j e n + t a v a r a l i i k e n t e e l l e + t a v a r a l i i k e n t e e l t ä + t a v a r a l i i k e n t e e m m e + t a v a r a l i i k e n t e e n + t a v a r a l i i k e n t e e n h a r j o i t t a j a n + t a v a r a l i i k e n t e e n h a r j o i t t a j i e n + t a v a r a l i i k e n t e e s e e n + t a v a r a l i i k e n t e e s s ä + t a v a r a l i i k e n t e e s t ä + t a v a r a l i i k e v a i h d o s t a + t a v a r a l o g i s t i i k k a + t a v a r a l u e t t e l o a + t a v a r a m a r k k i n a n s a + t a v a r a m a r k k i n a t + t a v a r a m a r k k i n o i d e n + t a v a r a m a r k k i n o i s t a + t a v a r a m e r k e i l l e + t a v a r a m e r k i n + t a v a r a m e r k i s t ä + t a v a r a m e r k i t + t a v a r a m e r k k e i h i n + t a v a r a m e r k k e j ä + t a v a r a m e r k k i + t a v a r a m e r k k i a s e t u k s e l l a + t a v a r a m e r k k i a s e t u k s e n + t a v a r a m e r k k i d i r e k t i i v i + t a v a r a m e r k k i d i r e k t i i v i n + t a v a r a m e r k k i e n + t a v a r a m e r k k i i n + t a v a r a m e r k k i j ä r j e s t e l m ä + t a v a r a m e r k k i j ä t t i l ä i s t e n + t a v a r a m e r k k i l a i n s ä ä d ä n n ö n + t a v a r a m e r k k i l a i n s ä ä d ä n t ö + t a v a r a m e r k k i n ä + t a v a r a m e r k k i o i k e u d e l l a + t a v a r a m e r k k i o i k e u d e n + t a v a r a m e r k k i o i k e u d e s t a + t a v a r a m e r k k i o i k e u k s i a + t a v a r a m e r k k i o i k e u k s i e n + t a v a r a m e r k k i o i k e u s + t a v a r a m e r k k i o i k e u t e e n + t a v a r a m e r k k i p ä ä t ö k s i ä + t a v a r a m e r k k i p ä ä t ö s t e n + t a v a r a m e r k k i r e k i s t e r i n + t a v a r a m e r k k i s o p i m u k s i s t a + t a v a r a m e r k k i s u o j a + t a v a r a m e r k k i s u o j a a + t a v a r a m e r k k i s u o j a j ä r j e s t e l m ä n + t a v a r a m e r k k i s u o j a l l a + t a v a r a m e r k k i s u o j a s t a + t a v a r a m e r k k i t o i m i s t o + t a v a r a m e r k k i t u o m a r e i d e n + t a v a r a m e r k k i t u o t t e i d e n + t a v a r a m e r k k i v i r a s t o + t a v a r a m e r k k i v i r a s t o a + t a v a r a m e r k k i v ä ä r e n n ö k s e t + t a v a r a m e r k k i v ä ä r e n n ö k s i ä + t a v a r a m e r k k i v ä ä r e n n ö s t e n + t a v a r a m e r k k i ä + t a v a r a m ä ä r i e n + t a v a r a m ä ä r i ä + t a v a r a m ä ä r ä n + t a v a r a m ä ä r ä t + t a v a r a n a + t a v a r a n k u l j e t u k s e e n + t a v a r a n k u l j e t u k s e l l e + t a v a r a n k u l j e t u k s e n + t a v a r a n k u l j e t u k s e s s a + t a v a r a n k u l j e t u k s e t + t a v a r a n k u l j e t u k s i a + t a v a r a n k u l j e t u k s i s t a + t a v a r a n k u l j e t u s + t a v a r a n k u l j e t u s a j o n e u v o i h i n + t a v a r a n k u l j e t u s a j o n e u v o i l l e + t a v a r a n k u l j e t u s a j o n e u v o i s t a + t a v a r a n k u l j e t u s a j o n e u v o j a + t a v a r a n k u l j e t u s a j o n e u v o j e n + t a v a r a n k u l j e t u s a j o n e u v o t + t a v a r a n k u l j e t u s a l a l l e + t a v a r a n k u l j e t u s a l a n + t a v a r a n k u l j e t u s j ä r j e s t e l m ä n + t a v a r a n k u l j e t u s j ä r j e s t e l m ä s t ä + t a v a r a n k u l j e t u s k a l u s t o a a n + t a v a r a n k u l j e t u s k a l u s t o n + t a v a r a n k u l j e t u s k a p a s i t e e t i n + t a v a r a n k u l j e t u s k e t j u n + t a v a r a n k u l j e t u s m a r k k i n o i l l a + t a v a r a n k u l j e t u s m a t k a + t a v a r a n k u l j e t u s m u o t o i h i n + t a v a r a n k u l j e t u s r a t o j a + t a v a r a n k u l j e t u s r e i t t e j ä + t a v a r a n k u l j e t u s s o p i m u s t e n + t a v a r a n k u l j e t u s t e n + t a v a r a n k u l j e t u s y r i t y k s i l l e + t a v a r a n s a + t a v a r a n t o i m i t t a j a + t a v a r a n t o i m i t t a j a t + t a v a r a n t o i m i t t a j i l t a + t a v a r a n t o i m i t u k s e n + t a v a r a n t u o n n i n + t a v a r a p a k e t i n + t a v a r a p a k e t i s t a + t a v a r a p a k e t t i i n + t a v a r a r e k k a a + t a v a r a r y h m i l l e + t a v a r a t + t a v a r a t a l o + t a v a r a t a l o i s s a + t a v a r a t a l o i s s a m m e + t a v a r a t a l o j a + t a v a r a t a l o s s a + t a v a r a t a l o t + t a v a r a t o d i s t u k s i i n + t a v a r a t o d i s t u s t e n + t a v a r a t o n n e j a + t a v a r a t o n n i s t a + t a v a r a v a h i n k o + t a v a r a v a l v o n t a + t a v a r a v a u n u + t a v a r a v a u n u i s t a + t a v a r a v a u n u j a + t a v a r a v a u n u j e n + t a v a r a v a u n u t + t a v a r a v i e n n i n + t a v a r a v i e n t i ä + t a v a r a v i r r a t + t a v a r a v i r t a + t a v a r a v i r t a a + t a v a r a v i r t o j a + t a v a r a v i r t o j e n + t a v a r a v ä ä r e n n ö s t e n + t a v a r o i d e n + t a v a r o i h i n + t a v a r o i l l e + t a v a r o i s t a + t a v a r o i t a + t a v a s t a + t a v a s t a a n + t a v a s t a m m e + t a v a t + t a v a t a + t a v a t a k s e n i + t a v a t e s s a a n + t a v a t e s s a m m e + t a v a t e s s a n i + t a v a t t a v a + t a v a t t o m a n + t a v a t t o m i n t a + t a v a t t u a a n + t a v a t t u a m m e + t a v a t t u a n i + t a v o i l l a + t a v o i s t a + t a v o i t a m m e + t a v o i t e a i k a a n + t a v o i t e a i k a t a u l u + t a v o i t e a i k a t a u l u n a + t a v o i t e a j a n k o h d a k s i + t a v o i t e a j a n k o h d a n + t a v o i t e a j a n k o h t a + t a v o i t e a l u e e n + t a v o i t e a l u e e s t a + t a v o i t e a l u e i d e n + t a v o i t e a l u e i l l a + t a v o i t e a l u e i s i i n + t a v o i t e a l u e i t a + t a v o i t e a r v o + t a v o i t e a r v o a + t a v o i t e a r v o i h i n + t a v o i t e a r v o i s t a + t a v o i t e a r v o j a + t a v o i t e a r v o j e n + t a v o i t e a r v o n + t a v o i t e a r v o o n + t a v o i t e a r v o s t a + t a v o i t e a r v o t + t a v o i t e h a k u i s e k s i + t a v o i t e h a k u i s e m m a n + t a v o i t e h a k u i s e m p i a + t a v o i t e h i n n a n + t a v o i t e h i n n a s t a + t a v o i t e h i n t a + t a v o i t e h i n t a a + t a v o i t e j o h t a m i s e e n + t a v o i t e j u l i s t u k s e n + t a v o i t e j u l i s t u k s e s s a + t a v o i t e l l a + t a v o i t e l l a a n k o + t a v o i t e l l e s s a m m e + t a v o i t e l l u i m m i s t a + t a v o i t e l l u n + t a v o i t e l t a v a + t a v o i t e l t a v i a + t a v o i t e l t u u n + t a v o i t e l u e t t e l o + t a v o i t e l u e t t e l o a + t a v o i t e l u k u j e n + t a v o i t e l u v u n + t a v o i t e m ä ä r i t e l m ä n + t a v o i t e m ä ä r ä a i k a + t a v o i t e m ä ä r ä ä n + t a v o i t e o h j e l m a + t a v o i t e o h j e l m a a + t a v o i t e o h j e l m a a n + t a v o i t e o h j e l m i e n + t a v o i t e o h j e l m i s s a + t a v o i t e o s u u d e n + t a v o i t e p a k e t t i a + t a v o i t e p o h j a i s e e n + t a v o i t e p ä i v ä m ä ä r i s t ä + t a v o i t e p ä i v ä m ä ä r i ä + t a v o i t e p ä i v ä m ä ä r ä + t a v o i t e p ä i v ä m ä ä r ä k s i + t a v o i t e p ä i v ä m ä ä r ä s t ä + t a v o i t e p ä i v ä m ä ä r ä ä + t a v o i t e r y h m i s s ä + t a v o i t e s u m m a n + t a v o i t e s u m m a n s a + t a v o i t e t a s o + t a v o i t e t a s o a + t a v o i t e t a s o a m m e + t a v o i t e t a s o j a + t a v o i t e t a s o j ä r j e s t e l m ä + t a v o i t e t a s o l l a + t a v o i t e t a s o l l e + t a v o i t e t a s o l t a a n + t a v o i t e t a s o m m e + t a v o i t e t a s o n + t a v o i t e t a s o o n + t a v o i t e t a s o t + t a v o i t e t t a + t a v o i t e t t a a n + t a v o i t e t t a m m e + t a v o i t e v a i h t e l u v ä l i t + t a v o i t e v u o n n a + t a v o i t e v u o t e m m e + t a v o i t e y h t e y t t ä + t a v o i t t a a + t a v o i t t a a k s e e n + t a v o i t t a m a a n + t a v o i t t a m i s e n + t a v o i t t a n e e t + t a v o i t t a v a t + t a v o i t t e e k s e e n + t a v o i t t e e k s e m m e + t a v o i t t e e k s e n i + t a v o i t t e e k s i + t a v o i t t e e l l a + t a v o i t t e e l l e + t a v o i t t e e l l i s e m m a l l a + t a v o i t t e e l l i s e m m i n + t a v o i t t e e l l i s e m p a a + t a v o i t t e e l l i s e m p i + t a v o i t t e e l l i s e s t a + t a v o i t t e e l l i s i a + t a v o i t t e e l l i s i m p i a + t a v o i t t e e l l i s u u d e s t a + t a v o i t t e e m m e + t a v o i t t e e n + t a v o i t t e e n a + t a v o i t t e e n a a n + t a v o i t t e e n a m m e + t a v o i t t e e n a n n e + t a v o i t t e e n a s e t t e l u + t a v o i t t e e n a s e t t e l u n + t a v o i t t e e n i + t a v o i t t e e n s a + t a v o i t t e e s e e m m e + t a v o i t t e e s e e n + t a v o i t t e e s e e n s a + t a v o i t t e e s s a + t a v o i t t e e s t a + t a v o i t t e e s t a a n + t a v o i t t e e s t a m m e + t a v o i t t e e t + t a v o i t t e i d e m m e + t a v o i t t e i d e n + t a v o i t t e i d e n a s e t t e l u u n + t a v o i t t e i d e n s a + t a v o i t t e i k s i + t a v o i t t e i l l a + t a v o i t t e i l l e + t a v o i t t e i l t a a n + t a v o i t t e i n + t a v o i t t e i n e e n + t a v o i t t e i n e m m e + t a v o i t t e i s i i m m e + t a v o i t t e i s i i n + t a v o i t t e i s i i n n e + t a v o i t t e i s i i n s a + t a v o i t t e i s s a + t a v o i t t e i s s a a n + t a v o i t t e i s s a m m e + t a v o i t t e i s t a + t a v o i t t e i s t a a n + t a v o i t t e i s t a k i n + t a v o i t t e i s t a m m e + t a v o i t t e i s t a n i + t a v o i t t e i t a + t a v o i t t e i t a a n + t a v o i t t e i t a m m e + t a v o i t t e i t t e m m e + t a v o i t t e l e e + t a v o i t t e l e m a a n + t a v o i t t e l e m a m m e + t a v o i t t e l e m a t o n + t a v o i t t e l e m a t o n t a + t a v o i t t e l e m a t t a + t a v o i t t e l e m a t t o m a a n + t a v o i t t e l e m a t t o m a n + t a v o i t t e l e m a t t o m a s t a + t a v o i t t e l e m a t t o m a t + t a v o i t t e l e m a t t o m i a + t a v o i t t e l e m a t t o m i e n + t a v o i t t e l e m a t t o m i i n + t a v o i t t e l e m a t t o m i l l a + t a v o i t t e l e m a t t o m i l l e + t a v o i t t e l e m a t t o m i n a + t a v o i t t e l e m i s e n + t a v o i t t e l e m m e + t a v o i t t e l e m m e k i n + t a v o i t t e l e v a + t a v o i t t e l e v a t + t a v o i t t e l e v i a + t a v o i t t e l e v i l l e + t a v o i t t e l e v i l t a + t a v o i t t e l e v i s t a + t a v o i t t e l u a + t a v o i t t e l u l t a + t a v o i t t e l u n + t a v o i t t e l u s t a + t a v o i t t e l u u n + t a y l o r i a + t a y l o r i n + t e a t t e r i a + t e a t t e r i a r v o s t e l u i s t a + t e a t t e r i e l o k u v a t + t e a t t e r i e s i t y s + t e a t t e r i f e s t i v a a l i + t e a t t e r i h a h m o n + t e a t t e r i h i s t o r i a + t e a t t e r i i n + t e a t t e r i k a a p p a u s + t e a t t e r i k e s ä + t e a t t e r i k r i i t i k k o i n a + t e a t t e r i l a i v a + t e a t t e r i l i p p u j e n + t e a t t e r i l i p u i s t a + t e a t t e r i n j o h t a j a + t e a t t e r i o h j a a j a + t e a t t e r i p ä i v ä + t e a t t e r i s e u r u e + t e a t t e r i t i e d e + t e d d y k a r h u + t e d d y k a r h u j e n + t e e h u o n e + t e e k a n n u i h i n + t e e k u l t t u u r i + t e e k u t s u l i i k e + t e e k u t s u t + t e e k ä ä n + t e e l a k i + t e e l l ä + t e e m a k a m p a n j a t + t e e m a k a r t t a + t e e m a k o h t a i s i s t a + t e e m a k o h t a i s t e n + t e e m a n a + t e e m a p u i s t o + t e e m a p ä i v i l l ä + t e e m a p ä i v ä + t e e m a r y h m i e n + t e e m a s i v u j a + t e e m a s t r a t e g i a t + t e e m a t + t e e m a t a p a a m i s i s s a + t e e m a v e r k o s t o j e n + t e e m a v i i k k o j a + t e e m a v u o d e k s i + t e e m a v u o d e l l a + t e e m a v u o d e n + t e e m a v u o d e s t a + t e e m a v u o n n a + t e e m a v u o s i + t e e m a v u o s i e n + t e e m a v u o t e e n + t e e m a v u o t e n a + t e e m a v u o t t a + t e e m m e + t e e m m e k ö + t e e m o i s t a + t e e m o j a + t e e n j u o j i e n + t e e n j u o n t i i n + t e e p e n s a s + t e e p u s s i + t e e p u u ö l j y + t e e p u u ö l j y y n + t e e r e t + t e e r i s t ä + t e e r i ä + t e e s i i v i l ä + t e e s k e n n e l l e n + t e e s k e n n e l l y t + t e e s k e n n e l l ä + t e e s k e n t e l e m ä t t ä + t e e s k e n t e l e v ä t + t e e s k e n t e l y s t ä + t e e s k e n t e l y ä + t e e t a i d e + t e e t a u o t + t e e t i m m e + t e e t t e + t e e t t ä m ä s s ä + t e e t t ä n y t + t e e t t ä ä + t e e t ä t t ä n y t + t e h d a s a l u e e n + t e h d a s a l u k s e l l a + t e h d a s a l u k s e s t a + t e h d a s a l u s t e n + t e h d a s h a l l e i s s a + t e h d a s l a i t o k s i a + t e h d a s l a i t o s t a a n + t e h d a s m e l u a + t e h d a s t a + t e h d a s t a r k a s t a j i a + t e h d a s t e o l l i s u u d e l l a + t e h d a s t e o l l i s u u d e l l e + t e h d a s t e o l l i s u u d e n + t e h d a s t e o l l i s u u d e s s a + t e h d a s t e o l l i s u u k s i s t a + t e h d a s t e o l l i s u u s + t e h d a s t e o l l i s u u t e e n + t e h d a s t e o l l i s u u t t a + t e h d a s t i l a t + t e h d a s t u o t t e i d e n + t e h d a s t y ö l ä i n e n + t e h d a s t y ö l ä i s i ä + t e h d a s t y ö n t e k i j ö i t ä + t e h d a s t y ö s t ä + t e h d e s s ä m m e + t e h d e s s ä ä n + t e h d y i l l ä + t e h d y i s s ä + t e h d y i s t ä + t e h d y l l ä + t e h d y n + t e h d y s s ä + t e h d y s t ä + t e h d y t + t e h d ä + t e h d ä k s e e n + t e h d ä k s e m m e + t e h d ä k s e n i + t e h d ä ä n + t e h d ä ä n k i n + t e h d ä ä n k ö + t e h d ä ä n p ä + t e h k ä ä + t e h k ä ä m m e + t e h n e e + t e h n e e s t ä + t e h n e e t + t e h n e i d e n + t e h n y t + t e h o a a n + t e h o a i n e + t e h o a i n e e n + t e h o a i n e e n a + t e h o a i n e e t + t e h o a i n e i d e n + t e h o a i n e i l l e + t e h o a i n e i s i i n + t e h o a i n e i s t a + t e h o a i n e i t a + t e h o a i n e t t a + t e h o a v a n + t e h o a v a t + t e h o h o i d o n + t e h o h o i d o s s a + t e h o h o i t o + t e h o h o i t o a + t e h o h o i t o o n + t e h o h o i t o y k s i k ö i h i n + t e h o h ä v i ö + t e h o k a l a n k a s v a t u k s e n + t e h o k a l a s t u k s e l l a + t e h o k a r j a t a l o u d e n + t e h o k a s t a + t e h o k a s t a k a a n + t e h o k a s v a t u k s e e n + t e h o k a s v a t u k s e n + t e h o k a s v a t u k s e s s a + t e h o k a s v a t u k s e s t a + t e h o k e r r o i n + t e h o k k a a k s i + t e h o k k a a l l a + t e h o k k a a l l e + t e h o k k a a m m a k s i + t e h o k k a a m m a k s i k i n + t e h o k k a a m m a l l a + t e h o k k a a m m a l l e + t e h o k k a a m m a n + t e h o k k a a m m a s s a + t e h o k k a a m m a s t a + t e h o k k a a m m a t + t e h o k k a a m m i k s i + t e h o k k a a m m i l l a + t e h o k k a a m m i l l e + t e h o k k a a m m i l t a + t e h o k k a a m m i n + t e h o k k a a m m i n k i n + t e h o k k a a m m i s s a + t e h o k k a a m m i s t a + t e h o k k a a m p a a + t e h o k k a a m p a a k i n + t e h o k k a a m p a a n + t e h o k k a a m p a n a + t e h o k k a a m p i + t e h o k k a a m p i a + t e h o k k a a m p i a k i n + t e h o k k a a m p i e n + t e h o k k a a m p i i n + t e h o k k a a m p i n a + t e h o k k a a n + t e h o k k a a n a + t e h o k k a a s e e n + t e h o k k a a s s a + t e h o k k a a s t a + t e h o k k a a t + t e h o k k a i d e n + t e h o k k a i l l a + t e h o k k a i m m a k s i + t e h o k k a i m m a l l a + t e h o k k a i m m a l t a + t e h o k k a i m m a n + t e h o k k a i m m a s t a + t e h o k k a i m m a s t a k i n + t e h o k k a i m m a t + t e h o k k a i m m a t k a a n + t e h o k k a i m m i l l a a n + t e h o k k a i m m i l l e + t e h o k k a i m m i l t a + t e h o k k a i m m i n + t e h o k k a i m m i s t a + t e h o k k a i m p a n a + t e h o k k a i m p i a + t e h o k k a i m p i e n + t e h o k k a i m p i i n + t e h o k k a i n + t e h o k k a i n t a + t e h o k k a i s i i n + t e h o k k a i s t a + t e h o k k a i t a + t e h o k k u u d e l t a a n + t e h o k k u u d e n + t e h o k k u u d e s t a + t e h o k k u u s a n a l y y s i i n + t e h o k k u u s a s t e + t e h o k k u u s e t u j a + t e h o k k u u s h y ö t y i h i n + t e h o k k u u s h y ö t y j ä + t e h o k k u u s k e r r o i n + t e h o k k u u s k r i t e e r e j ä + t e h o k k u u s k r i t e e r i e n + t e h o k k u u s k r i t e e r i t + t e h o k k u u s k y s y m y k s e t + t e h o k k u u s l a u s e k e t t a + t e h o k k u u s l u o k a n + t e h o k k u u s m a l l e j a + t e h o k k u u s m a r g i n a a l i + t e h o k k u u s m e r k i n n ä t + t e h o k k u u s m i t t a r i + t e h o k k u u s m i t t a u k s e t + t e h o k k u u s n o r m i t + t e h o k k u u s n ä k ö k o h d a t + t e h o k k u u s n ä k ö k u l m a s t a + t e h o k k u u s o n g e l m a a + t e h o k k u u s o n g e l m a n + t e h o k k u u s o n g e l m i e n + t e h o k k u u s p e r i a a t e + t e h o k k u u s p e r i a a t t e e l l e + t e h o k k u u s p e r i a a t t e e n + t e h o k k u u s p o t e n t i a a l i + t e h o k k u u s p o t e n t i a a l i a + t e h o k k u u s r e s e r v i n + t e h o k k u u s s t a n d a r d e j a + t e h o k k u u s s t a n d a r d i e n + t e h o k k u u s s t r a t e g i a + t e h o k k u u s s t r a t e g i a m m e + t e h o k k u u s s u h t e e n + t e h o k k u u s s u u n n i t e l m i a + t e h o k k u u s s y i s t ä + t e h o k k u u s s ä ä s t ö i s t ä + t e h o k k u u s s ä ä s t ö j ä + t e h o k k u u s t a r p e i s i i n + t e h o k k u u s t a s o + t e h o k k u u s t a s o i l l a + t e h o k k u u s t a s o j a a n + t e h o k k u u s t a s o j e n + t e h o k k u u s t a s o n + t e h o k k u u s t a v o i t t e e s t a + t e h o k k u u s t a v o i t t e i d e n + t e h o k k u u s t e s t e j ä + t e h o k k u u s t i e t o j a + t e h o k k u u s t o i m e t + t e h o k k u u s t y ö r y h m ä n + t e h o k k u u s v a a t i m u k s e t + t e h o k k u u s v a a t i m u k s i s t a + t e h o k k u u s v a a t i m u s + t e h o k k u u s v a a t i m u s t e n + t e h o k k u u s v a l l a n k u m o u s + t e h o k k u u s v a r a u s + t e h o k k u u s v a r a u s t a + t e h o k k u u t e e n + t e h o k k u u t e m m e + t e h o k k u u t t a + t e h o k k u u t t a a n + t e h o k k u u t t a m m e + t e h o k u r s s i + t e h o k ä s i t t e l y s s ä + t e h o k ä y t ö s t ä + t e h o l l a + t e h o l t a a n + t e h o m a a n k ä y t ö n + t e h o m a a n v i l j e l y k s e s t ä + t e h o m a a n v i l j e l y l l ä + t e h o m a a n v i l j e l y n + t e h o m a a n v i l j e l y t u o t a n n o n + t e h o m a a t a l o u d e n + t e h o m a a t a l o u s + t e h o m a a t a l o u s a l u e e t + t e h o m a a t a l o u t e e n + t e h o m a a t a l o u t t a + t e h o m a a t i l o i l l e + t e h o m e r k i n n ä t + t e h o m e r k i n t ä ä n + t e h o n n u t + t e h o n s a + t e h o p o l i t i i k k a + t e h o p o m m i t u k s i a + t e h o p y h i ä + t e h o s i k a l o i s s a + t e h o s i l l a n + t e h o s t a a + t e h o s t a a k o + t e h o s t a a k s e e n + t e h o s t a a k s e m m e + t e h o s t a i s i + t e h o s t a k a a m m e + t e h o s t a m a a n + t e h o s t a m a l l a + t e h o s t a m a s s a + t e h o s t a m a t t a + t e h o s t a m a t t o m a n + t e h o s t a m i n e n + t e h o s t a m i s a l o i t t e e t + t e h o s t a m i s e e n + t e h o s t a m i s e k s i + t e h o s t a m i s e l l a + t e h o s t a m i s e l l e + t e h o s t a m i s e n + t e h o s t a m i s e s s a + t e h o s t a m i s e s t a + t e h o s t a m i s o p e r a a t i o n + t e h o s t a m i s p y r k i m y s t e n + t e h o s t a m i s t a + t e h o s t a m i s t a r p e e s e e n + t e h o s t a m i s t a r p e e t + t e h o s t a m i s t a r v e t t a + t e h o s t a m i s t o i m e t + t e h o s t a m i s t o i m i e n + t e h o s t a m m e + t e h o s t a n e e n + t e h o s t a n u t + t e h o s t a v a n + t e h o s t a v a t + t e h o s t a v a t k o + t e h o s t e t a a n + t e h o s t e t t a i s i i n + t e h o s t e t t a v a + t e h o s t e t t i i n + t e h o s t e t t u a + t e h o s t e t u m m i n + t e h o s t e t u n + t e h o s t e t u s t a + t e h o s t u a + t e h o s t u i s i + t e h o s t u m i s e e n + t e h o s t u m i s e s t a + t e h o s t u m i s t a + t e h o s t u n u t + t e h o s t u t t a v a + t e h o s t u u + t e h o s t u v a + t e h o s t u v a t + t e h o t o n t a + t e h o t t o m a a n + t e h o t t o m a k s i + t e h o t t o m a m m a k s i + t e h o t t o m a m m a n + t e h o t t o m a m m i k s i + t e h o t t o m a m m i n + t e h o t t o m a m p a a + t e h o t t o m a m p i + t e h o t t o m a m p i a + t e h o t t o m a m p i i n + t e h o t t o m a n + t e h o t t o m a s t a + t e h o t t o m a t + t e h o t t o m i a + t e h o t t o m i i n + t e h o t t o m i k s i + t e h o t t o m i l l e + t e h o t t o m i m m i s t a + t e h o t t o m i m p i e n + t e h o t t o m i n + t e h o t t o m u u d e l l a a n + t e h o t t o m u u d e s t a + t e h o t t o m u u t e e n + t e h o t t o m u u t t a + t e h o t u o t a n n o l l a + t e h o t u o t a n n o n + t e h o t u o t a n n o s t a + t e h o t u o t a n t o + t e h o t u o t a n t o a + t e h o t u o t a n t o a l o i l l a + t e h o t u o t a n t o m a l l e j a + t e h o t u o t a n t o m a l l i e n + t e h o t u o t a n t o m a l l i i n + t e h o t u o t a n t o m e n e t e l m i s t ä + t e h o t u o t a n t o o n + t e h o t u o t a n t o t i l o j a + t e h o t u t k i m u k s e n + t e h o t y t ö t + t e h o t y ö v o i m a n + t e h o v i l j e l m ä ä + t e h o v i l j e l y + t e h o v i l j e l y l l e + t e h o v i l j e l y m e n e t e l m i e n + t e h o v i l j e l y s t ä + t e h o v i l j e l y y n + t e h o v i l j e l y ä + t e h t a a n + t e h t a a n m y y m ä l ä + t e h t a a n s a + t e h t a a s s a + t e h t a a s t a + t e h t a a t + t e h t a i d e n + t e h t a i n a + t e h t a i s s a + t e h t a i s t a + t e h t a i t a + t e h t a i t a a n + t e h t i i n + t e h t i i n k i n + t e h t y + t e h t y i h i n + t e h t y j e n + t e h t y j ä + t e h t y ä + t e h t ä e s s ä + t e h t ä i s i i n + t e h t ä v i e n + t e h t ä v i e n j a k o + t e h t ä v i e n j a o n + t e h t ä v i e n j a o s t a + t e h t ä v i e n s ä + t e h t ä v i i m m e + t e h t ä v i i n + t e h t ä v i i n s ä + t e h t ä v i s s ä + t e h t ä v i s s ä m m e + t e h t ä v i s s ä ä n + t e h t ä v i s t ä + t e h t ä v i s t ä n i + t e h t ä v i s t ä ä n + t e h t ä v i ä + t e h t ä v i ä m m e + t e h t ä v i ä n n e + t e h t ä v i ä ä n + t e h t ä v ä a l a + t e h t ä v ä a l u e + t e h t ä v ä a l u e i s t a + t e h t ä v ä j a k o + t e h t ä v ä j a k o a + t e h t ä v ä j a o l l e + t e h t ä v ä j a o s t a + t e h t ä v ä j u l i s t u k s e n + t e h t ä v ä k e n t t ä + t e h t ä v ä k e n t ä n + t e h t ä v ä k o k o n a i s u u t t a + t e h t ä v ä k s e e n + t e h t ä v ä k s e m m e + t e h t ä v ä k s e n i + t e h t ä v ä k s i + t e h t ä v ä l l e + t e h t ä v ä l t ä + t e h t ä v ä l u e t t e l o + t e h t ä v ä l u e t t e l o a + t e h t ä v ä l u e t t e l o n + t e h t ä v ä l u e t t e l o o m m e + t e h t ä v ä l u o k i l t a + t e h t ä v ä m m e + t e h t ä v ä m ä ä r ä s t ä + t e h t ä v ä n + t e h t ä v ä n a n n o n + t e h t ä v ä n a s e t t e l u n + t e h t ä v ä n i + t e h t ä v ä n j a k o + t e h t ä v ä n j a k o a + t e h t ä v ä n j a o n + t e h t ä v ä n j a o s t a + t e h t ä v ä n n e + t e h t ä v ä n s ä + t e h t ä v ä n ä + t e h t ä v ä n ä m m e + t e h t ä v ä p a k e t t i + t e h t ä v ä r y h m i e n + t e h t ä v ä r y h m i s s ä + t e h t ä v ä s h a k k i + t e h t ä v ä s s ä + t e h t ä v ä s s ä n i + t e h t ä v ä s s ä ä n + t e h t ä v ä s t ä + t e h t ä v ä s t ä n i + t e h t ä v ä s t ä ä n + t e h t ä v ä t + t e h t ä v ä ä + t e h t ä v ä ä k i n + t e h t ä v ä ä m m e + t e h t ä v ä ä n + t e h t ä v ä ä n n e + t e h t ä v ä ä n s ä + t e i d e n + t e i h i n + t e i l l e + t e i l l e e n + t e i l l e k i n + t e i l l ä + t e i l l ä k i n + t e i l t ä + t e i m m e + t e i n i a g e n t t i + t e i n i d r a a m a k u n i n g a t t a r e n + t e i n i e l ä m ä + t e i n i m u t a n t t i n i n j a k i l p i k o n n a t + t e i n i n o i t a + t e i n i p o p + t e i n i r a s k a u k s i e n + t e i n i t i t a a n i t + t e i n i t y t t ö j e n + t e i n i t y t ö i s t ä + t e i n i t y t ö n + t e i n i ä i d i k s i + t e i s t ä + t e i t ä + t e i t ä ä n + t e k a i s t u i l l a + t e k a i s t u i n + t e k a i s t u t + t e k e e + t e k e l e i t ä + t e k e m i e m m e + t e k e m i e n + t e k e m i e n n e + t e k e m i s e e n + t e k e m i s e k s i + t e k e m i s e n + t e k e m i s e s s ä + t e k e m i s e s t ä + t e k e m i s i i n + t e k e m i s i s s ä + t e k e m i s s ä n n e + t e k e m i s t ä + t e k e m i ä + t e k e m ä + t e k e m ä l l ä + t e k e m ä m m e + t e k e m ä n + t e k e m ä s s ä + t e k e m ä s s ä ä n + t e k e m ä s t ä + t e k e m ä s t ä m m e + t e k e m ä s t ä ä n + t e k e m ä t + t e k e m ä t t ä + t e k e m ä t t ä k i n + t e k e m ä ä + t e k e m ä ä m m e + t e k e m ä ä n + t e k e v i e n + t e k e v i l l e + t e k e v i s t ä + t e k e v i ä + t e k e v ä n + t e k e v ä t + t e k e v ä t k ö + t e k i j ä i n o i k e u k s i e n + t e k i j ä i n v a i h d u n t a + t e k i j ä l l e + t e k i j ä n + t e k i j ä n o i k e u d e l l e + t e k i j ä n o i k e u d e n + t e k i j ä n o i k e u d e n o m i s t a j i a + t e k i j ä n o i k e u d e t + t e k i j ä n o i k e u k s i a + t e k i j ä n o i k e u k s i a a n + t e k i j ä n o i k e u k s i e m m e + t e k i j ä n o i k e u k s i e n + t e k i j ä n o i k e u k s i e n s u o j a l l a + t e k i j ä n o i k e u k s i i n + t e k i j ä n o i k e u k s i l l a + t e k i j ä n o i k e u k s i l l e + t e k i j ä n o i k e u k s i n e e n + t e k i j ä n o i k e u k s i s s a + t e k i j ä n o i k e u k s i s t a + t e k i j ä n o i k e u s + t e k i j ä n o i k e u s a l a l l a + t e k i j ä n o i k e u s a l a n + t e k i j ä n o i k e u s a l u e + t e k i j ä n o i k e u s a s i o i s t a + t e k i j ä n o i k e u s d i r e k t i i v i + t e k i j ä n o i k e u s d i r e k t i i v i i n + t e k i j ä n o i k e u s d i r e k t i i v i n + t e k i j ä n o i k e u s d i r e k t i i v i s t ä + t e k i j ä n o i k e u s d i r e k t i i v i ä + t e k i j ä n o i k e u s j u p a k k a + t e k i j ä n o i k e u s j ä r j e s t e l m ä + t e k i j ä n o i k e u s j ä r j e s t e l m ä l l e + t e k i j ä n o i k e u s j ä r j e s t e l m ä n + t e k i j ä n o i k e u s j ä r j e s t e l m ä s t ä + t e k i j ä n o i k e u s j ä r j e s t e l y i h i n + t e k i j ä n o i k e u s j ä r j e s t ö + t e k i j ä n o i k e u s j ä r j e s t ö j e n + t e k i j ä n o i k e u s j ä r j e s t ö t + t e k i j ä n o i k e u s j ä r j e s t ö ä + t e k i j ä n o i k e u s k e s k u s t e l u s s a + t e k i j ä n o i k e u s k i i s t o j a + t e k i j ä n o i k e u s k u l t t u u r i a + t e k i j ä n o i k e u s k y s y m y k s e e n + t e k i j ä n o i k e u s k y s y m y k s e t + t e k i j ä n o i k e u s k y s y m y k s i ä + t e k i j ä n o i k e u s k y s y m y s t ä + t e k i j ä n o i k e u s l a e i l l a + t e k i j ä n o i k e u s l a i l l a + t e k i j ä n o i k e u s l a i n + t e k i j ä n o i k e u s l a i n s ä ä d ä n n ö n + t e k i j ä n o i k e u s l a i n s ä ä d ä n t ö + t e k i j ä n o i k e u s l a i n s ä ä d ä n t ö m m e + t e k i j ä n o i k e u s l a i n s ä ä d ä n t ö ä + t e k i j ä n o i k e u s l a i s s a + t e k i j ä n o i k e u s l a i t + t e k i j ä n o i k e u s l a k i a + t e k i j ä n o i k e u s l a k i i n + t e k i j ä n o i k e u s l o u k k a u k s e t + t e k i j ä n o i k e u s l o u k k a u k s i e n + t e k i j ä n o i k e u s l o u k k a u k s i i n + t e k i j ä n o i k e u s l o u k k a u s t e n + t e k i j ä n o i k e u s l u p i a + t e k i j ä n o i k e u s m a k s u a + t e k i j ä n o i k e u s m a k s u j a + t e k i j ä n o i k e u s m a l l i + t e k i j ä n o i k e u s m a r k k i n o i d e n + t e k i j ä n o i k e u s m e n t a l i t e e t t i + t e k i j ä n o i k e u s m e r k k i + t e k i j ä n o i k e u s p a l k k i o i d e n + t e k i j ä n o i k e u s p e t o s t a p a u s t e n + t e k i j ä n o i k e u s p i r a t i s m i + t e k i j ä n o i k e u s p o l i t i i k a s s a + t e k i j ä n o i k e u s p ä i v ä + t e k i j ä n o i k e u s r i k k o m u k s i a + t e k i j ä n o i k e u s r i k k o m u k s i i n + t e k i j ä n o i k e u s r i k k o m u k s i s s a + t e k i j ä n o i k e u s r i k k o m u k s i s t a + t e k i j ä n o i k e u s r i k k o m u s t e n + t e k i j ä n o i k e u s r i k o k s e t + t e k i j ä n o i k e u s s o p i m u k s i a + t e k i j ä n o i k e u s s o p i m u s + t e k i j ä n o i k e u s s u o j a + t e k i j ä n o i k e u s s u o j a a + t e k i j ä n o i k e u s s u o j a a n + t e k i j ä n o i k e u s s u o j a n + t e k i j ä n o i k e u s s u o j a s t a + t e k i j ä n o i k e u s t y ö k a l u a + t e k i j ä n o i k e u s t y ö r y h m ä + t e k i j ä n o i k e u s v i r a s t o + t e k i j ä n o i k e u s ä ä n n ö k s i l l ä + t e k i j ä n o i k e u t e m m e + t e k i j ä n o i k e u t e n s a + t e k i j ä n o i k e u t t a + t e k i j ä n ä + t e k i j ä o i k e u k s i a + t e k i j ä p u o l e t + t e k i j ä r y h m ä + t e k i j ä s t ä + t e k i j ä t + t e k i j ä ä + t e k i j ö i d e n + t e k i j ö i h i n + t e k i j ö i l l e + t e k i j ö i n ä + t e k i j ö i s t ä + t e k i j ö i t ä + t e k i n + t e k i s i + t e k i s i v ä t + t e k i v ä t + t e k n i i k a l l a + t e k n i i k a l t a a n + t e k n i i k a n + t e k n i i k a n m u u t o k s e n + t e k n i i k a n s i i r r o l l e + t e k n i i k a n s i i r t o a + t e k n i i k a n s i i r t o s o p i m u k s i a + t e k n i i k a s s a + t e k n i i k a s t a + t e k n i i k a t + t e k n i i k k a a + t e k n i i k k a a n + t e k n i i k k a k e s k u k s e n + t e k n i i k k a k y s y m y k s i i n + t e k n i i k k a y h t e i s k u n n a n + t e k n i i k k o j a + t e k n i i k o i d e n + t e k n i i k o i l l a + t e k n i i k o i t a + t e k n i k k o j e n + t e k n i k o i d e n + t e k n i s e e n + t e k n i s e k s i + t e k n i s e l l e + t e k n i s e l l ä + t e k n i s e l t ä + t e k n i s e m m i n + t e k n i s e m m i s t ä + t e k n i s e m m ä k s i + t e k n i s e m m ä l l ä + t e k n i s e m m ä l t ä + t e k n i s e m m ä n + t e k n i s e m m ä s s ä + t e k n i s e m p i + t e k n i s e m p i i n + t e k n i s e m p i ä + t e k n i s e m p ä ä + t e k n i s e n + t e k n i s e s s ä + t e k n i s e s t ä + t e k n i s e t + t e k n i s i i n + t e k n i s i k s i + t e k n i s i l l e + t e k n i s i l l ä + t e k n i s i m p i i n + t e k n i s i m p i ä + t e k n i s i m p ä ä n + t e k n i s i n + t e k n i s i n ä + t e k n i s i s s ä + t e k n i s i s t ä + t e k n i s i ä + t e k n i s l u o n t e i s i a + t e k n i s l u o n t e i s i i n + t e k n i s l u o n t e i s i s t a + t e k n i s l u o n t e i s t a + t e k n i s l u o n t e i s t e n + t e k n i s t a l o u d e l l i s e s t i + t e k n i s t e n + t e k n i s t y m i n e n + t e k n i s y y d e l l ä ä n + t e k n i s y y d e n + t e k n i s y y d e s s ä ä n + t e k n o k r a a t t i s e s t a + t e k n o k r a a t t i s i m m i s t a + t e k n o k r a a t t i s t a + t e k n o k r a t i a a + t e k n o k r a t i a n + t e k n o l o g i a a + t e k n o l o g i a a n + t e k n o l o g i a e r o t + t e k n o l o g i a f o o r u m e i t a + t e k n o l o g i a f o o r u m i e n + t e k n o l o g i a h a n k e + t e k n o l o g i a h a n k k e i d e n + t e k n o l o g i a h a n k k e i l l e + t e k n o l o g i a h a n k k e i s i i n + t e k n o l o g i a h a n k k e i s s a + t e k n o l o g i a h a n k k e i t a + t e k n o l o g i a h y ö t y j ä + t e k n o l o g i a i n n o v a a t i o i d e n + t e k n o l o g i a i n s t i t u u t i l l e + t e k n o l o g i a i n s t i t u u t i n + t e k n o l o g i a i n s t i t u u t i s t a + t e k n o l o g i a i n s t i t u u t t i + t e k n o l o g i a i n s t i t u u t t i a + t e k n o l o g i a i n s t i t u u t t i i n + t e k n o l o g i a i n t e n s i i v i s i i n + t e k n o l o g i a i n t e n s i i v i s t e n + t e k n o l o g i a i n v e s t o i n n i t + t e k n o l o g i a i n v e s t o i n t i e n + t e k n o l o g i a j ä r j e s t ö j ä + t e k n o l o g i a k e h i t y k s e e n + t e k n o l o g i a k e h i t y k s e n + t e k n o l o g i a k e h i t y s + t e k n o l o g i a k e s k u k s i a m m e + t e k n o l o g i a k e s k u s + t e k n o l o g i a k i l p a i l u n + t e k n o l o g i a k i l p a i l u s s a + t e k n o l o g i a k o n s e r n i + t e k n o l o g i a k u i l u + t e k n o l o g i a k u i l u n + t e k n o l o g i a k u m p p a n u u t t a + t e k n o l o g i a k u p l a + t e k n o l o g i a k u p l a n + t e k n o l o g i a k u r s s e j a + t e k n o l o g i a k y s y m y k s i s s ä + t e k n o l o g i a l l a + t e k n o l o g i a m a r k k i n a t + t e k n o l o g i a m a r k k i n o i l l e + t e k n o l o g i a m i n i s t e r i + t e k n o l o g i a m u o d o i s s a + t e k n o l o g i a m u u t o k s i a + t e k n o l o g i a n + t e k n o l o g i a n e u t r a a l e j a + t e k n o l o g i a n e u v o s t o n + t e k n o l o g i a n s i i r r o n + t e k n o l o g i a n s i i r r o s s a + t e k n o l o g i a n s i i r r o t + t e k n o l o g i a n s i i r t o + t e k n o l o g i a n s i i r t o a + t e k n o l o g i a n s i i r t o p r o j e k t i e n + t e k n o l o g i a o h j e l m a + t e k n o l o g i a o h j e l m a n + t e k n o l o g i a o h j e l m a s t a + t e k n o l o g i a o h j e l m i a + t e k n o l o g i a o h j e l m i e n + t e k n o l o g i a o h j e l m i i n + t e k n o l o g i a o s a k k e i d e n + t e k n o l o g i a p a i n o t u s + t e k n o l o g i a p e r u s t a + t e k n o l o g i a p i l a r i + t e k n o l o g i a p o l i t i i k a n + t e k n o l o g i a p o l i t i i k k a + t e k n o l o g i a p o l i t i i k k a a + t e k n o l o g i a p u i s t o j a + t e k n o l o g i a p u i s t o j e n + t e k n o l o g i a r a h a s t o o n + t e k n o l o g i a r i n t a m a l l a + t e k n o l o g i a s i i r r o i n + t e k n o l o g i a s i i r r o n + t e k n o l o g i a s i i r t o a + t e k n o l o g i a s i i r t o j a + t e k n o l o g i a s i i r t o j e n + t e k n o l o g i a s o p i m u k s e n + t e k n o l o g i a s o p i m u k s i s t a + t e k n o l o g i a s t a + t e k n o l o g i a s t r a t e g i a a + t e k n o l o g i a t e o l l i s u u d e l l e + t e k n o l o g i a t u o t t e i d e n + t e k n o l o g i a v a i h d o l l e + t e k n o l o g i a v a i h d o n + t e k n o l o g i a v a i h t o a + t e k n o l o g i a v a i h t o e h d o i s s a + t e k n o l o g i a v a i h t o o n + t e k n o l o g i a v a l m i u k s i a + t e k n o l o g i a v a l m i u k s i e n + t e k n o l o g i a v e r k o s t o i s s a + t e k n o l o g i a v o i t t o i n e n + t e k n o l o g i a y h t e i s t y ö h ö n + t e k n o l o g i a y h t e i s t y ö s t ä + t e k n o l o g i a y h t e i s t y ö t ä + t e k n o l o g i a y h t e i s ö i h i n + t e k n o l o g i a y h t e i s ö i l l e + t e k n o l o g i a y h t e i s ö i l l ä + t e k n o l o g i a y h t e i s ö i l t ä + t e k n o l o g i a y h t e i s ö i s s ä + t e k n o l o g i a y h t e i s ö j e n + t e k n o l o g i a y h t e i s ö j ä + t e k n o l o g i a y h t e i s ö n + t e k n o l o g i a y h t e i s ö t + t e k n o l o g i a y h t i ö i d e n + t e k n o l o g i a y m p ä r i s t ö j e n + t e k n o l o g i a y m p ä r i s t ö j ä + t e k n o l o g i a y m p ä r i s t ö m m e + t e k n o l o g i a y m p ä r i s t ö ö n + t e k n o l o g i a y r i t y k s e t + t e k n o l o g i a y r i t y k s i ä + t e k n o l o g i a y r i t y s t e n + t e k n o l o g i a y r i t y s t ä + t e k n o l o g i o i d e n + t e k n o l o g i o i h i n + t e k n o l o g i o i t a + t e k n o l o g i s e e n + t e k n o l o g i s e n + t e k n o l o g i s e s t a + t e k n o l o g i s e s t i + t e k n o l o g i s e t + t e k n o l o g i s i a + t e k n o l o g i s i l l e + t e k n o l o g i s t a + t e k n o l o g i s t e n + t e k o a + t e k o a l t a i s i i n + t e k o a r g u m e n t t e i n e e n + t e k o e l ä m ä + t e k o h e n g i t y s t ä + t e k o h u m a n i t a a r i s t e n + t e k o i h i n + t e k o i l o + t e k o i n a + t e k o j a + t e k o j e n + t e k o j e n s a + t e k o j ä r v i i n + t e k o k i n k k u a + t e k o k u i t u j e n + t e k o m a i n o s t e n + t e k o m e n e t t e l y + t e k o m e n e t t e l y i h i n + t e k o m e n e t t e l y j ä + t e k o n a h k a + t e k o n u r m i + t e k o o n + t e k o p e r u s t e + t e k o p e r u s t e e t + t e k o p e r u s t e i s i i n + t e k o p o r k k a n a n + t e k o p y h e m p ä ä + t e k o p y h i i n + t e k o p y h i k s i + t e k o p y h i l l ä + t e k o p y h i ä + t e k o p y h y y d e n + t e k o p y h y y d e s t ä + t e k o p y h y y s + t e k o p y h y y t e e n + t e k o p y h y y t t ä + t e k o p y h ä + t e k o p y h ä k s i + t e k o p y h ä s t i + t e k o p y h ä t + t e k o p y h ä ä + t e k o p y h ä ä n + t e k o r i p s e t + t e k o r i u t t o j a + t e k o s i v e i n ä + t e k o s y i h i n + t e k o s y i l l ä + t e k o s y i l t ä + t e k o s y i s t ä + t e k o s y i t ä + t e k o s y y + t e k o s y y n + t e k o s y y n ä + t e k o t u r k i k s e k s i + t e k o t u r k i s + t e k o v a g i n a + t e k o ä l y + t e k o ä l y s t ä + t e k o ä l y ä + t e k s t e i l t ä + t e k s t e i s s ä n n e + t e k s t e i s t ä + t e k s t e i s t ä m m e + t e k s t e j ä + t e k s t i a i n e i s t o n + t e k s t i e d i t o r i + t e k s t i e h d o t u k s e e n + t e k s t i e h d o t u k s e n + t e k s t i e h d o t u k s e s t a + t e k s t i e h d o t u s + t e k s t i e n + t e k s t i i l e i h i n + t e k s t i i l e i l l e + t e k s t i i l e j ä + t e k s t i i l i a l a + t e k s t i i l i a l a a + t e k s t i i l i a l a a n + t e k s t i i l i a l a l l a + t e k s t i i l i a l a l l e + t e k s t i i l i a l a l t a + t e k s t i i l i a l a m m e + t e k s t i i l i a l a n + t e k s t i i l i a l a s t a + t e k s t i i l i a l o i l l a + t e k s t i i l i a l o j e n + t e k s t i i l i a l u e e t + t e k s t i i l i a l u e i d e n + t e k s t i i l i a l u e i l l e m m e + t e k s t i i l i a l u e t t a + t e k s t i i l i a s e t u s + t e k s t i i l i e n + t e k s t i i l i k a s v i e n + t e k s t i i l i k a u p a n + t e k s t i i l i k a u p a s s a + t e k s t i i l i k a u p p a a + t e k s t i i l i k a u p p a p o l i t i i k a n + t e k s t i i l i k i i n t i ö i d e n + t e k s t i i l i k i i n t i ö i s t ä k ä ä n + t e k s t i i l i k i i n t i ö i t ä + t e k s t i i l i k i i n t i ö ö n + t e k s t i i l i k o n e e s t a + t e k s t i i l i k u i t u + t e k s t i i l i k u i t u j a + t e k s t i i l i k u i t u j e n + t e k s t i i l i k y s y m y k s e s s ä + t e k s t i i l i l a i t o k s i a + t e k s t i i l i l u o k k i i n + t e k s t i i l i m a h t i + t e k s t i i l i m a l l i e n + t e k s t i i l i m a r k k i n o i d e n + t e k s t i i l i m a r k k i n o i l l a + t e k s t i i l i m a r k k i n o i l l e + t e k s t i i l i m a r k k i n o i s t a + t e k s t i i l i m e r k i n t ö i h i n + t e k s t i i l i m e r k i n t ö j e n + t e k s t i i l i n t u o t t a j a t + t e k s t i i l i n t u o t t a j i l l a + t e k s t i i l i n v a l m i s t a j i e n + t e k s t i i l i s e k t o r i + t e k s t i i l i s e k t o r i l l a + t e k s t i i l i s o d a t + t e k s t i i l i s o p i m u k s e e n + t e k s t i i l i t + t e k s t i i l i t a i d e + t e k s t i i l i t a v a r a a + t e k s t i i l i t a v a r o i d e n + t e k s t i i l i t e h d a s + t e k s t i i l i t e h t a a l l a + t e k s t i i l i t e h t a a s e e n + t e k s t i i l i t e h t a i t a + t e k s t i i l i t e k n i i k a n + t e k s t i i l i t e o l l i s u u d e l l a + t e k s t i i l i t e o l l i s u u d e l l a m m e + t e k s t i i l i t e o l l i s u u d e l l e + t e k s t i i l i t e o l l i s u u d e l l e e n + t e k s t i i l i t e o l l i s u u d e n + t e k s t i i l i t e o l l i s u u d e s s a + t e k s t i i l i t e o l l i s u u d e s s a k i n + t e k s t i i l i t e o l l i s u u d e s t a + t e k s t i i l i t e o l l i s u u s + t e k s t i i l i t e o l l i s u u s a l u e i l l a + t e k s t i i l i t e o l l i s u u s s u u n n i t e l m a n + t e k s t i i l i t e o l l i s u u t e e n + t e k s t i i l i t e o l l i s u u t e m m e + t e k s t i i l i t e o l l i s u u t e n s a + t e k s t i i l i t e o l l i s u u t t a + t e k s t i i l i t e o l l i s u u t t a a n + t e k s t i i l i t u o n n i l t a + t e k s t i i l i t u o n n i n + t e k s t i i l i t u o n t i i n + t e k s t i i l i t u o t a n n o l l e + t e k s t i i l i t u o t a n n o n + t e k s t i i l i t u o t a n n o s t a + t e k s t i i l i t u o t a n t o + t e k s t i i l i t u o t e + t e k s t i i l i t u o t e l u o k k a a + t e k s t i i l i t u o t e r y h m i s s ä + t e k s t i i l i t u o t e r y h m ä n + t e k s t i i l i t u o t t e e n + t e k s t i i l i t u o t t e e t + t e k s t i i l i t u o t t e i d e n + t e k s t i i l i t u o t t e i l l e + t e k s t i i l i t u o t t e i l t a + t e k s t i i l i t u o t t e i s i i n + t e k s t i i l i t u o t t e i s s a + t e k s t i i l i t u o t t e i s t a + t e k s t i i l i t u o t t e i t a + t e k s t i i l i t u o t t e i t a a n + t e k s t i i l i t y ö n t e k i j ä ä + t e k s t i i l i t y ö r y h m ä n + t e k s t i i l i v a l i k o i m a + t e k s t i i l i v a l m i s t a j a a + t e k s t i i l i v a l m i s t a j a t + t e k s t i i l i v a l m i s t a j i a + t e k s t i i l i v a l t a r y h m i t t y m ä n + t e k s t i i l i v a r o j a + t e k s t i i l i v i e n n i l l e + t e k s t i i l i v i e n n i n + t e k s t i i l i v i e n t i ä + t e k s t i i l i y r i t y k s e n + t e k s t i i l i y r i t y k s e s s ä + t e k s t i i l i y r i t y k s e t + t e k s t i i l i y r i t y k s i l l e + t e k s t i i l i y r i t y k s i ä + t e k s t i i l i y r i t y s + t e k s t i i n + t e k s t i k a p p a l e e t + t e k s t i k a p p a l e t t a + t e k s t i k o h d i s s a + t e k s t i k o h t i a + t e k s t i k o k o n a i s u u d e n + t e k s t i k o k o n a i s u u s + t e k s t i k o k o n a i s u u t e e n + t e k s t i k r i t i i k k i + t e k s t i l a i t o s + t e k s t i l l ä + t e k s t i l u o n n o k s e e n + t e k s t i l u o n n o k s e n + t e k s t i l u o n n o k s e n a + t e k s t i l u o n n o k s e s s a + t e k s t i l u o n n o k s e s t a + t e k s t i l u o n n o k s i a + t e k s t i l u o n n o k s i n + t e k s t i l u o n n o k s i s s a + t e k s t i l u o n n o s + t e k s t i l u o n n o s t a + t e k s t i m u u t o k s i s t a + t e k s t i m u u t o s + t e k s t i m ä ä r ä t + t e k s t i n + t e k s t i n k ä s i t t e l y + t e k s t i n k ä s i t t e l y l a i t t e i s t a + t e k s t i n k ä s i t t e l y n + t e k s t i n o s i e n + t e k s t i n t u n n i s t u s + t e k s t i p e r u s t a a + t e k s t i p o h j a i n e n + t e k s t i p u h e l i m e n + t e k s t i p u h e l i m i a + t e k s t i p u h e l i n j ä r j e s t e l m i e n + t e k s t i p u h e l i n j ä r j e s t e l m ä ä + t e k s t i s s ä + t e k s t i s s ä n n e + t e k s t i s s ä ä n + t e k s t i s t ä + t e k s t i s t ä m m e + t e k s t i s t ä ä n + t e k s t i t + t e k s t i t i e d o s t o + t e k s t i v e r s i o n + t e k s t i v e r s i o t a + t e k s t i v i e s t e i l l ä + t e k s t i v i e s t e j ä + t e k s t i v i e s t i + t e k s t i v i e s t i e n + t e k s t i v i e s t i l l ä + t e k s t i v i e s t i m a i n o s t e n + t e k s t i v i e s t i m a r k k i n o i d e n + t e k s t i v i e s t i n + t e k s t i v i e s t i n ä + t e k s t i v i e s t i t + t e k s t i v i e s t i v e r k k o v i e r a i l u + t e k s t i v i e s t i ä + t e k s t i v i i t t a u s + t e k s t i ä + t e l a h e r m o + t e l a k a t + t e l a k e t j u + t e l a k e t j u j e n + t e l a k k a e l i n k e i n o a + t e l a k k a k a p a s i t e e t t i + t e l a k k a k a u p u n g e i s s a + t e l a k k a k a u p u n g i s t a + t e l a k k a k e s k u k s i s s a + t e l a k k a t e o l l i s u u d e l l a + t e l a k k a t e o l l i s u u d e l l e + t e l a k k a t e o l l i s u u d e n + t e l a k k a t e o l l i s u u d e s s a + t e l a k k a t e o l l i s u u s + t e l a k k a t e o l l i s u u s k a p a s i t e e t t i n s a + t e l a k k a t e o l l i s u u t e e n + t e l a k k a t e o l l i s u u t t a + t e l a k k a t o i m i n t a a + t e l a k k a t u e s t a + t e l a k k a t u e t + t e l a k k a t u k e a + t e l a k k a t u k e n a + t e l a k k a t u k i + t e l a k k a t u k i a + t e l a k k a t u k i e n + t e l a k k a t y ö l ä i s e l t ä + t e l a k k a t y ö l ä i s e t + t e l a k k a t y ö l ä i s i l l e + t e l a k k a t y ö l ä i s i ä + t e l a k k a t y ö l ä i s t e n + t e l a k k a t y ö n t e k i j ä n + t e l a k k a t y ö n t e k i j ä t + t e l a k k a t y ö n t e k i j ö i d e n + t e l a k k a y h t i ö i l l e + t e l a k k a y r i t y k s i l l e + t e l a k o i d e n + t e l a k o i l l e + t e l a k o i s t a + t e l a k o i t a + t e l a l u u + t e l a t y k i s t ö + t e l e a l a l l a + t e l e a l a l l e + t e l e a l a n + t e l e h i n t o j a + t e l e j ä r j e s t e l m i i n + t e l e j ä r j e s t e l m ä n + t e l e k o m m u n i k a a t i o j ä r j e s t e l m i e n + t e l e k o m m u n i k a a t i o j ä r j e s t e l m i i n + t e l e k o m m u n i k a a t i o k e s k u s + t e l e k u u n t e l u + t e l e k u u n t e l u a + t e l e k u u n t e l u k ä y t ä n t ö j ä + t e l e k u u n t e l u n + t e l e k u u n t e l u s s a + t e l e k u u n t e l u s t a + t e l e l a i n s ä ä d ä n n ö n + t e l e l a i n s ä ä d ä n n ö s t ä + t e l e l a i t o s t e n + t e l e l a i t t e i t a + t e l e l i i k e n n e l a i t t e i d e n + t e l e l i i k e n n e l a i t t e i t a + t e l e l i i k e n n e m a r k k i n o i d e n + t e l e l i i k e n n e n e u v o s t o + t e l e l i i k e n n e t e k n i i k k a a n + t e l e l i i k e n n e t i e d o t + t e l e l i i k e n n e t i e t o j e n + t e l e l i i k e n n e v e r k k o j e n + t e l e l i i k e n n e v e r k o n + t e l e l i i k e n n e v i r a n o m a i s e t + t e l e l i i k e n n e y h t e y d e t + t e l e l i i t t o + t e l e m a r k k i n o i d e n + t e l e m a r k k i n o i l l a + t e l e m a r k k i n o i t a + t e l e m a t i i k k a h a n k k e i s t a + t e l e m a t i i k k a p a l v e l u i l l e + t e l e m y y n n i n + t e l e o p e r a a t t o r e i d e n + t e l e o p e r a a t t o r e i t a + t e l e o p e r a a t t o r i + t e l e o p e r a a t t o r i t + t e l e p a k e t t i + t e l e p a l v e l u + t e l e p a l v e l u a l a n + t e l e p a l v e l u i d e n + t e l e p a l v e l u i s s a + t e l e p a l v e l u j a + t e l e p a l v e l u j e n + t e l e p a l v e l u t + t e l e p ä ä t e + t e l e p ä ä t e l a i t e d i r e k t i i v i n + t e l e p ä ä t e l a i t e d i r e k t i i v i s s ä + t e l e p ä ä t e l a i t e d i r e k t i i v i ä + t e l e p ä ä t e l a i t t e i d e n + t e l e p ä ä t e l a i t t e i s t a + t e l e r e k i s t e r e i s t ä + t e l e s e k t o r i + t e l e s e k t o r i a + t e l e s e k t o r i l l a + t e l e t i e t o j e n + t e l e t o i m i n t a m i n i s t e r i t + t e l e t o i m i n t a p a l v e l u t + t e l e t u n n i s t e t i e t o + t e l e v e r k k o + t e l e v e r k k o a + t e l e v e r k k o i h i n + t e l e v e r k k o j a + t e l e v e r k k o j e n + t e l e v e r k k o o n + t e l e v e r k o i s s a + t e l e v e r k o n + t e l e v e r k o s t o j a + t e l e v e r k o t + t e l e v i e s t i n n ä n + t e l e v i e s t i n n ä n k i n + t e l e v i e s t i n n ä s s ä + t e l e v i e s t i n n ä s t ä + t e l e v i e s t i n t ä + t e l e v i e s t i n t ä a l a + t e l e v i e s t i n t ä a l a a + t e l e v i e s t i n t ä a l a a n + t e l e v i e s t i n t ä a l a l l a + t e l e v i e s t i n t ä a l a l l e + t e l e v i e s t i n t ä a l a n + t e l e v i e s t i n t ä a l a s t a + t e l e v i e s t i n t ä a l o i l l a + t e l e v i e s t i n t ä a l u e + t e l e v i e s t i n t ä a s e t u k s e n + t e l e v i e s t i n t ä a s i a n t u n t i j o i d e n + t e l e v i e s t i n t ä a s i o i s t a + t e l e v i e s t i n t ä d i r e k t i i v i i n + t e l e v i e s t i n t ä d i r e k t i i v i n + t e l e v i e s t i n t ä i n f r a s t r u k t u u r e i h i n + t e l e v i e s t i n t ä i n f r a s t r u k t u u r i + t e l e v i e s t i n t ä i n f r a s t r u k t u u r i e n + t e l e v i e s t i n t ä i n f r a s t r u k t u u r i n + t e l e v i e s t i n t ä i n f r a s t r u k t u u r i v e r k k o a + t e l e v i e s t i n t ä j ä r j e s t e l m i e n + t e l e v i e s t i n t ä j ä r j e s t e l m i i n + t e l e v i e s t i n t ä j ä r j e s t e l m i s s ä + t e l e v i e s t i n t ä j ä r j e s t e l m ä t + t e l e v i e s t i n t ä j ä t t i l ä i s t e n + t e l e v i e s t i n t ä k e s k u s t e l u n + t e l e v i e s t i n t ä l a i k s i + t e l e v i e s t i n t ä l a i n s ä ä d ä n n ö l l ä + t e l e v i e s t i n t ä l a i n s ä ä d ä n n ö n + t e l e v i e s t i n t ä l a i n s ä ä d ä n t ö + t e l e v i e s t i n t ä l a i t e t e o l l i s u u s + t e l e v i e s t i n t ä l a i t t e i s i i n + t e l e v i e s t i n t ä l i i k e n n e + t e l e v i e s t i n t ä l i i k e n t e e n + t e l e v i e s t i n t ä l i i t t o + t e l e v i e s t i n t ä m a k s u i h i n + t e l e v i e s t i n t ä m a r k k i n a t + t e l e v i e s t i n t ä m a r k k i n o i d e n + t e l e v i e s t i n t ä m a r k k i n o i h i n + t e l e v i e s t i n t ä m a r k k i n o i l l a + t e l e v i e s t i n t ä m a r k k i n o i l l e + t e l e v i e s t i n t ä m a r k k i n o i s t a + t e l e v i e s t i n t ä m a r k k i n o i t a + t e l e v i e s t i n t ä m o n o p o l i e n + t e l e v i e s t i n t ä n e u v o s t o + t e l e v i e s t i n t ä n e u v o s t o n + t e l e v i e s t i n t ä n e u v o s t o s s a + t e l e v i e s t i n t ä o p e r a a t t o r e i d e n + t e l e v i e s t i n t ä o p e r a a t t o r e i l l e + t e l e v i e s t i n t ä o p e r a a t t o r e i t a + t e l e v i e s t i n t ä o p e r a a t t o r i + t e l e v i e s t i n t ä o p e r a a t t o r i t + t e l e v i e s t i n t ä p a k e t i k s i + t e l e v i e s t i n t ä p a k e t i l l a + t e l e v i e s t i n t ä p a k e t i l l e + t e l e v i e s t i n t ä p a k e t i n + t e l e v i e s t i n t ä p a k e t i s t a + t e l e v i e s t i n t ä p a k e t t i + t e l e v i e s t i n t ä p a k e t t i a + t e l e v i e s t i n t ä p a k e t t i i n + t e l e v i e s t i n t ä p a l v e l u + t e l e v i e s t i n t ä p a l v e l u i d e n + t e l e v i e s t i n t ä p a l v e l u i h i n + t e l e v i e s t i n t ä p a l v e l u i s t a + t e l e v i e s t i n t ä p a l v e l u i t a + t e l e v i e s t i n t ä p a l v e l u j a + t e l e v i e s t i n t ä p a l v e l u j e n + t e l e v i e s t i n t ä p a l v e l u n + t e l e v i e s t i n t ä p a l v e l u t + t e l e v i e s t i n t ä p o l i t i i k a n + t e l e v i e s t i n t ä p o l i t i i k k a a + t e l e v i e s t i n t ä s a l a i s u u d e n + t e l e v i e s t i n t ä s a t e l l i i t i t + t e l e v i e s t i n t ä s a t e l l i i t t i a l a a + t e l e v i e s t i n t ä s e k t o r i + t e l e v i e s t i n t ä s e k t o r i l l a + t e l e v i e s t i n t ä s e k t o r i l t a + t e l e v i e s t i n t ä s k a n d a a l i s t a + t e l e v i e s t i n t ä s o p i m u k s e n + t e l e v i e s t i n t ä s o p i m u k s e s t a + t e l e v i e s t i n t ä s t a n d a r d i t + t e l e v i e s t i n t ä s ä ä n n ö k s i s s ä + t e l e v i e s t i n t ä s ä ä n n ö s t ö ä + t e l e v i e s t i n t ä s ä ä n t e l y p a k e t t i a + t e l e v i e s t i n t ä t a a j u u k s i a + t e l e v i e s t i n t ä t e k n i i k a n + t e l e v i e s t i n t ä t e k n o l o g i a + t e l e v i e s t i n t ä t e o l l i s u u d e n + t e l e v i e s t i n t ä t e o l l i s u u d e s t a + t e l e v i e s t i n t ä t i e t o i h i n + t e l e v i e s t i n t ä t i e t o j a + t e l e v i e s t i n t ä t o i m i a l a l l a + t e l e v i e s t i n t ä v e r k k o j a + t e l e v i e s t i n t ä v e r k k o j e n + t e l e v i e s t i n t ä v e r k o i s s a + t e l e v i e s t i n t ä v e r k o i s t a + t e l e v i e s t i n t ä v e r k o n + t e l e v i e s t i n t ä v e r k o s s a + t e l e v i e s t i n t ä v e r k o s t o i s t a + t e l e v i e s t i n t ä v e r k o t + t e l e v i e s t i n t ä v i r a n o m a i s e l l e + t e l e v i e s t i n t ä v i r a n o m a i s e n + t e l e v i e s t i n t ä v ä l i n e i d e n + t e l e v i e s t i n t ä y h t i ö i d e n + t e l e v i e s t i n t ä y h t i ö i s t ä + t e l e v i e s t i n t ä y h t i ö n + t e l e v i e s t i n t ä y h t i ö t + t e l e v i e s t i n t ä y r i t y k s e t + t e l e v i e s t i n t ä y r i t y k s i l l e + t e l e v i e s t i n t ä y r i t y k s i l l ä + t e l e v i e s t i n t ä y r i t y s + t e l e v i e s t i n t ä y r i t y s t e n + t e l e v i e s t i n t ä ä + t e l e v i s i o + t e l e v i s i o a i k a a + t e l e v i s i o a l a + t e l e v i s i o a l a a n + t e l e v i s i o a l a l l a + t e l e v i s i o a l a n + t e l e v i s i o a n t e n n i t + t e l e v i s i o a r k i s t o i s s a + t e l e v i s i o a s e m a + t e l e v i s i o a s e m a a + t e l e v i s i o a s e m a a n + t e l e v i s i o a s e m a l l e + t e l e v i s i o a s e m a l t a + t e l e v i s i o a s e m a n + t e l e v i s i o a s e m a s t a + t e l e v i s i o a s e m a t + t e l e v i s i o a s e m i a + t e l e v i s i o a s e m i e n + t e l e v i s i o a s e m i i n + t e l e v i s i o a s e m i l l a + t e l e v i s i o a s e m i l l e + t e l e v i s i o d i r e k t i i v i + t e l e v i s i o d i r e k t i i v i l l ä + t e l e v i s i o d i r e k t i i v i n + t e l e v i s i o d i r e k t i i v i ä + t e l e v i s i o d o k u m e n t i s s a + t e l e v i s i o d o k u m e n t t e j a + t e l e v i s i o d o k u m e n t t i e n + t e l e v i s i o e l o k u v a + t e l e v i s i o e s i i n t y m i s e t + t e l e v i s i o h a a s t a t t e l u j a + t e l e v i s i o h a a s t a t t e l u j e n + t e l e v i s i o h a a s t a t t e l u n + t e l e v i s i o h a a s t a t t e l u s s a + t e l e v i s i o h a n k k e e n + t e l e v i s i o i d a + t e l e v i s i o i d e n t i t e e t t i ä + t e l e v i s i o i l l e + t e l e v i s i o i l m i ö n + t e l e v i s i o i n t i a + t e l e v i s i o i n t i l u v a n + t e l e v i s i o i n t i m o n o p o l i + t e l e v i s i o i n t i o i k e u d e t + t e l e v i s i o i n t i o i k e u k s i a + t e l e v i s i o i n t i o i k e u k s i e n + t e l e v i s i o i n t i o i k e u k s i i n + t e l e v i s i o i n t i o i k e u k s i l l a + t e l e v i s i o i n t i o i k e u k s i s t a + t e l e v i s i o i n t i s o p i m u k s e t + t e l e v i s i o i n t i t u l o i s t a + t e l e v i s i o i s s a + t e l e v i s i o i s s a m m e + t e l e v i s i o i s t a + t e l e v i s i o i s t a a n + t e l e v i s i o i s t a m m e + t e l e v i s i o i t a + t e l e v i s i o i t u j a + t e l e v i s i o j u o n t a j a + t e l e v i s i o j ä r j e s t e l m ä + t e l e v i s i o j ä r j e s t e l m ä n + t e l e v i s i o j ä r j e s t e l m ä s s ä + t e l e v i s i o j ä r j e s t e l m ä t + t e l e v i s i o j ä r j e s t e l m ä ä + t e l e v i s i o k a a p e l i v e r k o n + t e l e v i s i o k a m e r a + t e l e v i s i o k a m e r a n + t e l e v i s i o k a m e r a t + t e l e v i s i o k a m e r o i d e n + t e l e v i s i o k a m e r o i n + t e l e v i s i o k a m e r o i s s a + t e l e v i s i o k a m e r o i t a + t e l e v i s i o k a m p a n j a a + t e l e v i s i o k a n a v a + t e l e v i s i o k a n a v a a + t e l e v i s i o k a n a v a a n + t e l e v i s i o k a n a v a l l a + t e l e v i s i o k a n a v a l l a a n + t e l e v i s i o k a n a v a l l e + t e l e v i s i o k a n a v a l t a + t e l e v i s i o k a n a v a n + t e l e v i s i o k a n a v a s t a + t e l e v i s i o k a n a v a t + t e l e v i s i o k a n a v i a + t e l e v i s i o k a n a v i e n + t e l e v i s i o k a n a v i e n n e + t e l e v i s i o k a n a v i i n + t e l e v i s i o k a n a v i l l a + t e l e v i s i o k a n a v i l l a m m e + t e l e v i s i o k a n a v i l l e + t e l e v i s i o k a n a v i s t a + t e l e v i s i o k e s k u s t e l u i h i n + t e l e v i s i o k e s k u s t e l u s s a + t e l e v i s i o k e s k u s t e l u u n + t e l e v i s i o k o k k e j a + t e l e v i s i o k u v a + t e l e v i s i o k u v a a + t e l e v i s i o k u v a r u u t u j e n + t e l e v i s i o k u v a t + t e l e v i s i o k u v i s t a + t e l e v i s i o l a i t t e i s i i n + t e l e v i s i o l l a + t e l e v i s i o l l e + t e l e v i s i o l u p a m a k s u a + t e l e v i s i o l u p a m a k s u i l l a + t e l e v i s i o l u p a m a k s u n + t e l e v i s i o l u p i e n + t e l e v i s i o l ä h e t t i m i ä + t e l e v i s i o l ä h e t y k s e n + t e l e v i s i o l ä h e t y k s e n s ä + t e l e v i s i o l ä h e t y k s e s s ä + t e l e v i s i o l ä h e t y k s e t + t e l e v i s i o l ä h e t y k s i e n + t e l e v i s i o l ä h e t y k s i i n + t e l e v i s i o l ä h e t y k s i s s ä + t e l e v i s i o l ä h e t y k s i s t ä + t e l e v i s i o l ä h e t y k s i ä + t e l e v i s i o l ä h e t y s p a l v e l u j e n + t e l e v i s i o l ä h e t y s t e n + t e l e v i s i o l ä h e t y s t o i m i n n a n + t e l e v i s i o l ä h e t y s t o i m i n n a s t a + t e l e v i s i o l ä h e t y s t ä + t e l e v i s i o l ä h e t y s v e r k k o i h i n + t e l e v i s i o m a a i l m a a n + t e l e v i s i o m a i n o k s e t + t e l e v i s i o m a i n o k s i a + t e l e v i s i o m a i n o k s i i n + t e l e v i s i o m a i n o k s i l t a + t e l e v i s i o m a i n o k s i s s a + t e l e v i s i o m a i n o k s i s t a + t e l e v i s i o m a i n o n n a l t a + t e l e v i s i o m a i n o n n a n + t e l e v i s i o m a i n o n t a + t e l e v i s i o m a i n o n t a a + t e l e v i s i o m a i n o s t e n + t e l e v i s i o m a k s u + t e l e v i s i o m a r k k i n a t + t e l e v i s i o m a r k k i n o i d e n + t e l e v i s i o m a r k k i n o i s t a + t e l e v i s i o m e d i a n + t e l e v i s i o n + t e l e v i s i o n e u v o s t o i h i n + t e l e v i s i o n k a t s e l u n + t e l e v i s i o n k a t s o j a n + t e l e v i s i o n k a t s o j a t + t e l e v i s i o n k a t s o j i i n + t e l e v i s i o n k a t s o j i s t a + t e l e v i s i o n k a t s o m i s k i e l l o n + t e l e v i s i o n ä y t e l m i s s ä + t e l e v i s i o o n + t e l e v i s i o p a l v e l u i s s a + t e l e v i s i o p a l v e l u j a + t e l e v i s i o p a l v e l u j e n + t e l e v i s i o p a l v e l u m m e + t e l e v i s i o p e r s o o n a + t e l e v i s i o p u h e e s s a + t e l e v i s i o r a p o r t e i s s a + t e l e v i s i o r e p o r t a a s e i s t a + t e l e v i s i o r e p o r t t e r i + t e l e v i s i o r u u d u i l l a m m e + t e l e v i s i o r u u d u i l t a m m e + t e l e v i s i o r u u d u i s s a + t e l e v i s i o r u u d u i s s a m m e + t e l e v i s i o r u u d u i s t a + t e l e v i s i o r u u d u i s t a m m e + t e l e v i s i o r u u d u i s t a n n e + t e l e v i s i o r u u d u l t a + t e l e v i s i o r u u d u l t a n i + t e l e v i s i o r u u d u s s a + t e l e v i s i o r u u d u s t a + t e l e v i s i o r u u d u t + t e l e v i s i o r u u t u i h i n + t e l e v i s i o r u u t u j e n + t e l e v i s i o r y h m ä + t e l e v i s i o s a r j a n + t e l e v i s i o s a r j o i s s a + t e l e v i s i o s a r j o i s t a + t e l e v i s i o s a r j o j a + t e l e v i s i o s a r j o j e n + t e l e v i s i o s i g n a a l i e n + t e l e v i s i o s i s ä l l ö n + t e l e v i s i o s p o n s o r o i n t i a + t e l e v i s i o s s a + t e l e v i s i o s t a + t e l e v i s i o s t a n d a r d e j a + t e l e v i s i o s t u d i o + t e l e v i s i o t a + t e l e v i s i o t a a j u u k s i e n + t e l e v i s i o t a p a h t u m i e n + t e l e v i s i o t a r j o n t a + t e l e v i s i o t e k n o l o g i o i d e n + t e l e v i s i o t e o l l i s u u d e s t a + t e l e v i s i o t o i m i n n a n + t e l e v i s i o t o i m i n t a + t e l e v i s i o t o i m i n t a a + t e l e v i s i o t o i m i n t a a n + t e l e v i s i o t o i m i t t a j a + t e l e v i s i o t o i m i t t a j a n + t e l e v i s i o t o i m i t t a j a t + t e l e v i s i o t o r n i + t e l e v i s i o t o r n i a + t e l e v i s i o t u l o t + t e l e v i s i o t u o t a n t o o n + t e l e v i s i o t u o t t a j a + t e l e v i s i o t u t k i m u s + t e l e v i s i o u u t i s e t + t e l e v i s i o u u t i s i s s a + t e l e v i s i o v a s t a a n o t i n t a + t e l e v i s i o v a s t a a n o t t i m i a + t e l e v i s i o v a s t a a n o t t i m i i m m e + t e l e v i s i o v a s t a a n o t t i m i s s a + t e l e v i s i o v e r k k o + t e l e v i s i o v e r k k o j a + t e l e v i s i o v e r k k o j a a n + t e l e v i s i o v e r k k o j e n + t e l e v i s i o v e r k o i s t a + t e l e v i s i o v e r k o t + t e l e v i s i o v e r o l l a + t e l e v i s i o v i m m a + t e l e v i s i o v i r a n o m a i s t a + t e l e v i s i o v ä l ä h d y k s e t + t e l e v i s i o y h t i ö + t e l e v i s i o y h t i ö i d e n + t e l e v i s i o y h t i ö i l l e + t e l e v i s i o y h t i ö i l l ä + t e l e v i s i o y h t i ö i t ä + t e l e v i s i o y h t i ö m m e + t e l e v i s i o y h t i ö n + t e l e v i s i o y h t i ö t + t e l e v i s i o y h t i ö ö n + t e l e v i s i o y r i t y k s e t + t e l e y h t e y k s i ä + t e l e y h t i ö + t e l e y h t i ö i d e m m e + t e l e y h t i ö i d e n + t e l e y h t i ö t + t e l e y l e i s p a l v e l u + t e l e y l e i s p a l v e l u a + t e l e y l e i s p a l v e l u i d e n + t e l e y l e i s p a l v e l u i s t a + t e l e y l e i s p a l v e l u i t a + t e l e y l e i s p a l v e l u j e n + t e l e y l e i s p a l v e l u n + t e l e y l e i s p a l v e l u s t a + t e l e y r i t y k s e t + t e l e y r i t y k s i l l e + t e l e y r i t y k s i ä + t e l i b u s s i + t e l i n e v o i m i s t e l u + t e l l u u r i t e t r a k l o r i d i + t e l o i t e t a a n + t e l o i t e t t a v a + t e l o i t e t t i i n + t e l o i t e t t u j e n + t e l o i t e t u t + t e l o i t t a a + t e l o i t t a j a d i k t a a t t o r i a + t e l o i t t a m i s t a + t e l o i t t i + t e l o i t u k s e n + t e l o i t u k s e t + t e l o i t u k s i a + t e l o i t u k s i i n + t e l o i t u k s i l t a + t e l o i t u k s i s s a + t e l o i t u k s i s t a + t e l o i t u s a a l l o n + t e l o i t u s m u o d o t + t e l o i t u s m u o t o a + t e l o i t u s m ä ä r ä y s t ä + t e l o i t u s p ä i v ä s t ä + t e l o i t u s p ä i v ä ä + t e l o i t u s p ä ä t ö s t ä + t e l o i t u s r a n g a i s t u s + t e l o i t u s t a + t e l o i t u s t e n + t e l o i t u s t i l a s t o t + t e l t o i s s a + t e l t t a a n + t e l t t a l e i r i e n + t e l t t o i h i n + t e l t t o j a + t e l t t o j e n + t e m a a t t i s e e n + t e m a a t t i s i a + t e m a a t t i s i l l a + t e m a a t t i s t a + t e m m a t t u j a + t e m p o r a a l i l o g i i k k a + t e m p p e l i b l o k k i + t e m p p e l i k o k o n a i s u u s + t e m p p e l i k o m p l e k s i n + t e m p p e l i p r o s t i t u u t i o + t e m p p e l i r i t a r i + t e m p p e l i t a n s s i j a t + t e m p p e l i v i i k u n a + t e m p p e l i v u o r e l l e + t e m p p e l i v u o r i + t e m p p u i h i n + t e m p p u j a + t e m p p u p o t k u l a u t a i l u + t e m p u i l l a + t e m p u n + t e n n i s k e n t t ä + t e n n i s k y y n ä r p ä ä + t e n n i s l i i t t o + t e n n i s m e s t a r i + t e n n i s o t t e l u + t e n n i s o t t e l u s t a + t e n n i s p a l l o + t e n n i s t u r n a u s + t e n o r i k i t a r a + t e n t t i a r v o s t e l u s s a + t e o i k s i + t e o i l l a + t e o i l l a m m e + t e o i l l a m m e k a a n + t e o i l l a n n e + t e o i l t a + t e o i n + t e o i s s a + t e o i s s a k i n + t e o i s t a + t e o i s t a a n + t e o i s t a n n e + t e o k r a a t t i s e s t a + t e o k r a a t t i s i l t a + t e o k s e n + t e o k s e n s a + t e o k s e s s a + t e o k s e s s a a n + t e o k s e t + t e o k s i a + t e o k s i i n + t e o k s i l l a + t e o k s i s t a + t e o l l a + t e o l l i s e l l e + t e o l l i s e m p a a + t e o l l i s e n + t e o l l i s e s s a + t e o l l i s e s t a + t e o l l i s e t + t e o l l i s i a + t e o l l i s i s s a + t e o l l i s i s t a + t e o l l i s o i k e u d e n + t e o l l i s o i k e u d e t + t e o l l i s o i k e u k s i a + t e o l l i s o i k e u k s i e n + t e o l l i s o i k e u k s i l l e n s a + t e o l l i s o i k e u k s i s t a + t e o l l i s t a m i s j ä r j e s t ö + t e o l l i s t e n + t e o l l i s t u m a s s a + t e o l l i s t u m a t t o m i a + t e o l l i s t u m i s a s t e t t a + t e o l l i s t u m i s e n + t e o l l i s t u m i s p r o s e s s e j a + t e o l l i s t u m i s p r o s e s s i a + t e o l l i s t u m i s p r o s e s s i a a n + t e o l l i s t u m i s t a + t e o l l i s t u n e e l l a + t e o l l i s t u n e e m p a a + t e o l l i s t u n e e s s a + t e o l l i s t u n e e t + t e o l l i s t u n e i d e n + t e o l l i s t u n e i l l e + t e o l l i s t u n e i m m i s s a + t e o l l i s t u n e i m m i s t a + t e o l l i s t u n e i m p a n a + t e o l l i s t u n e i s i i n + t e o l l i s t u n e i s s a + t e o l l i s t u n e i s t a + t e o l l i s t u n e i t a + t e o l l i s u u d e l l a + t e o l l i s u u d e l l e + t e o l l i s u u d e l l e e n + t e o l l i s u u d e l l e m m e + t e o l l i s u u d e l t a + t e o l l i s u u d e n + t e o l l i s u u d e n a l a + t e o l l i s u u d e n a l a a + t e o l l i s u u d e n a l a a n + t e o l l i s u u d e n a l a l l a + t e o l l i s u u d e n a l a l l e + t e o l l i s u u d e n a l a n + t e o l l i s u u d e n a l a s t a + t e o l l i s u u d e n a l a t + t e o l l i s u u d e n a l o i h i n + t e o l l i s u u d e n a l o i l l a + t e o l l i s u u d e n a l o i l l e + t e o l l i s u u d e n a l o i l t a + t e o l l i s u u d e n a l o i s t a + t e o l l i s u u d e n a l o j a + t e o l l i s u u d e n a l o j e m m e + t e o l l i s u u d e n a l o j e n + t e o l l i s u u d e n h a a r o i l l e + t e o l l i s u u d e n h a r j o i t t a j i l l e + t e o l l i s u u d e s s a + t e o l l i s u u d e s s a k i n + t e o l l i s u u d e s t a + t e o l l i s u u s a l a + t e o l l i s u u s a l a a + t e o l l i s u u s a l a k o h t a i s e s t i + t e o l l i s u u s a l a l l a + t e o l l i s u u s a l a l l e + t e o l l i s u u s a l a l t a + t e o l l i s u u s a l a n + t e o l l i s u u s a l a t + t e o l l i s u u s a l k o h o l i k s i + t e o l l i s u u s a l o i l l a + t e o l l i s u u s a l o i l l e + t e o l l i s u u s a l o i s t a + t e o l l i s u u s a l o i t e + t e o l l i s u u s a l o i t e t t a + t e o l l i s u u s a l o i t t e i d e n + t e o l l i s u u s a l o i t t e i l l e + t e o l l i s u u s a l o i t t e i s i i n + t e o l l i s u u s a l o i t t e i t a + t e o l l i s u u s a l o j a + t e o l l i s u u s a l o j e n + t e o l l i s u u s a l u e + t e o l l i s u u s a l u e e l l a + t e o l l i s u u s a l u e e l l e + t e o l l i s u u s a l u e e n + t e o l l i s u u s a l u e e n a + t e o l l i s u u s a l u e e t + t e o l l i s u u s a l u e i d e n + t e o l l i s u u s a l u e i k s i + t e o l l i s u u s a l u e i l l a + t e o l l i s u u s a l u e i l l e + t e o l l i s u u s a l u e i l t a + t e o l l i s u u s a l u e i s i i n + t e o l l i s u u s a l u e i s t a + t e o l l i s u u s a l u e i t a + t e o l l i s u u s a l u e t t a + t e o l l i s u u s a l u s t e n + t e o l l i s u u s a r m e i j o i s t a + t e o l l i s u u s a s i a k k a i l l e + t e o l l i s u u s a s i a t + t e o l l i s u u s e t i i k a l t a a n + t e o l l i s u u s h a l l i i n + t e o l l i s u u s h a n + t e o l l i s u u s h a n k e + t e o l l i s u u s h a n k i n t o j e n + t e o l l i s u u s h a n k k e e k s i + t e o l l i s u u s h a n k k e e n + t e o l l i s u u s h a n k k e i d e n + t e o l l i s u u s h a n k k e i s i i n + t e o l l i s u u s h a n k k e i s s a + t e o l l i s u u s h a n k k e i t a + t e o l l i s u u s h u i p p u j e n + t e o l l i s u u s h y ö d y k k e e n ä + t e o l l i s u u s h y ö d y k k e i d e n + t e o l l i s u u s i n f r a s t r u k t u u r i e n + t e o l l i s u u s i n n o v a a t i o n + t e o l l i s u u s i n n o v o i n t i a + t e o l l i s u u s i n v e s t o i n t e j a + t e o l l i s u u s i n v e s t o i n t i e n + t e o l l i s u u s j o h t a j a t + t e o l l i s u u s j o h t a j i a + t e o l l i s u u s j o h t a j i e n + t e o l l i s u u s j o h t o i n e n + t e o l l i s u u s j o u t o m a a t a + t e o l l i s u u s j ä r j e s t e l m ä m m e + t e o l l i s u u s j ä r j e s t e l m ä ä + t e o l l i s u u s j ä r j e s t e l m ä ä m m e + t e o l l i s u u s j ä r j e s t ö j e n + t e o l l i s u u s j ä r j e s t ö t + t e o l l i s u u s j ä t e + t e o l l i s u u s j ä t e t t ä + t e o l l i s u u s j ä t e v u o d o n + t e o l l i s u u s j ä t i t + t e o l l i s u u s j ä t t e e l l e + t e o l l i s u u s j ä t t e e n + t e o l l i s u u s j ä t t e e s t ä + t e o l l i s u u s j ä t t e e t + t e o l l i s u u s j ä t t e i d e n + t e o l l i s u u s j ä t t e i s t ä + t e o l l i s u u s j ä t t e i t ä + t e o l l i s u u s k a a s u i l l e + t e o l l i s u u s k a l a s t u k s e e n + t e o l l i s u u s k a l a s t u k s e k s i + t e o l l i s u u s k a l a s t u k s e l l e + t e o l l i s u u s k a l a s t u k s e n + t e o l l i s u u s k a l a s t u k s e s s a + t e o l l i s u u s k a l a s t u s + t e o l l i s u u s k a l a s t u s t a + t e o l l i s u u s k a n n a n + t e o l l i s u u s k a n t a + t e o l l i s u u s k a n t a a + t e o l l i s u u s k a p a s i t e e t i n + t e o l l i s u u s k a p a s i t e e t t i + t e o l l i s u u s k a p a s i t e e t t i a + t e o l l i s u u s k a r t a l t a + t e o l l i s u u s k a s v e i l l e + t e o l l i s u u s k a s v e j a + t e o l l i s u u s k a t a s t r o f e j a + t e o l l i s u u s k a t a s t r o f i e n + t e o l l i s u u s k a t a s t r o f i n + t e o l l i s u u s k a u p u n g i n + t e o l l i s u u s k a u p u n k i + t e o l l i s u u s k e h i t y k s e s t ä + t e o l l i s u u s k e m i k a a l e i s s a + t e o l l i s u u s k e m i k a a l i e n + t e o l l i s u u s k e s k e i s e k s i + t e o l l i s u u s k e s k u k s i a + t e o l l i s u u s k i n + t e o l l i s u u s k l u s t e r e i d e n + t e o l l i s u u s k l u s t e r e i t a + t e o l l i s u u s k o k o u s + t e o l l i s u u s k o l m i o n + t e o l l i s u u s k o m i s s a a r i + t e o l l i s u u s k o m i s s a a r i n + t e o l l i s u u s k o n e i d e n + t e o l l i s u u s k o n s e r n e i l l e + t e o l l i s u u s k o n s e r n e j a + t e o l l i s u u s k o n s e r n i e n + t e o l l i s u u s k r i i s i + t e o l l i s u u s k u l t t u u r i + t e o l l i s u u s k u l t t u u r i a m m e + t e o l l i s u u s k u l u t t a j i e n + t e o l l i s u u s k ä y t t ö ä + t e o l l i s u u s k ä y t t ö ö n + t e o l l i s u u s k ä y t ö s s ä + t e o l l i s u u s l a b o r a t o r i o i s s a + t e o l l i s u u s l a i t o k s e l l e + t e o l l i s u u s l a i t o k s e n + t e o l l i s u u s l a i t o k s e s s a + t e o l l i s u u s l a i t o k s e t + t e o l l i s u u s l a i t o k s i a + t e o l l i s u u s l a i t o k s i e n + t e o l l i s u u s l a i t o k s i i n + t e o l l i s u u s l a i t o k s i l l a + t e o l l i s u u s l a i t o k s i l l e + t e o l l i s u u s l a i t o k s i s s a + t e o l l i s u u s l a i t o k s i s t a + t e o l l i s u u s l a i t o s + t e o l l i s u u s l a i t o s t a + t e o l l i s u u s l a i t o s t e n + t e o l l i s u u s l a i t t e i s t o j e n + t e o l l i s u u s l a s e r e i d e n + t e o l l i s u u s l a s e r e i t a + t e o l l i s u u s l i i t o n + t e o l l i s u u s l i i t o t + t e o l l i s u u s l i i t t o + t e o l l i s u u s l i i t t o j e n + t e o l l i s u u s l o b b a a j a a + t e o l l i s u u s l ä h t ö i s e l l ä + t e o l l i s u u s m a a + t e o l l i s u u s m a a h a n + t e o l l i s u u s m a a n + t e o l l i s u u s m a a n a + t e o l l i s u u s m a a s s a + t e o l l i s u u s m a a t + t e o l l i s u u s m a h d i k s i + t e o l l i s u u s m a h d i n + t e o l l i s u u s m a h d i t + t e o l l i s u u s m a h t i + t e o l l i s u u s m a h t i e n + t e o l l i s u u s m a h t i n a + t e o l l i s u u s m a i d e n + t e o l l i s u u s m a i h i n + t e o l l i s u u s m a i l l a + t e o l l i s u u s m a i l l e + t e o l l i s u u s m a i l t a + t e o l l i s u u s m a i n a + t e o l l i s u u s m a i s s a + t e o l l i s u u s m a i s s a k i n + t e o l l i s u u s m a i s t a + t e o l l i s u u s m a i t a + t e o l l i s u u s m a l l i + t e o l l i s u u s m a r k k i n o i d e n + t e o l l i s u u s m a r k k i n o i l l a + t e o l l i s u u s m a t e r i a a l e j a + t e o l l i s u u s m e l a n i s m i + t e o l l i s u u s m e l u k y s y m y k s e n + t e o l l i s u u s m i n i s t e r e i d e n + t e o l l i s u u s m i n i s t e r i + t e o l l i s u u s m i n i s t e r i e n + t e o l l i s u u s m i n i s t e r i l l e + t e o l l i s u u s m i n i s t e r i m m e + t e o l l i s u u s m i n i s t e r i n + t e o l l i s u u s m i n i s t e r i n s ä + t e o l l i s u u s m i n i s t e r i t + t e o l l i s u u s m i n i s t e r i ö + t e o l l i s u u s m o o t t o r e i d e n + t e o l l i s u u s m o o t t o r e i h i n + t e o l l i s u u s m y r k k y j ä + t e o l l i s u u s n e u v o s t o + t e o l l i s u u s n e u v o s t o n + t e o l l i s u u s n e u v o s t o s s a + t e o l l i s u u s o m a i s u u s + t e o l l i s u u s o n n e t t o m u u d e t + t e o l l i s u u s o n n e t t o m u u k s i a + t e o l l i s u u s o n n e t t o m u u k s i e n + t e o l l i s u u s o n n e t t o m u u k s i e n k i n + t e o l l i s u u s o n n e t t o m u u k s i i n + t e o l l i s u u s o n n e t t o m u u k s i l t a + t e o l l i s u u s o n n e t t o m u u k s i s t a + t e o l l i s u u s o n n e t t o m u u s + t e o l l i s u u s o s a a m i n e n + t e o l l i s u u s p a i k k a k u n n a n + t e o l l i s u u s p a m p p u j e n + t e o l l i s u u s p a r i s t o i h i n + t e o l l i s u u s p a r i s t o j a + t e o l l i s u u s p a r i s t o n s a + t e o l l i s u u s p e r i n n ö n + t e o l l i s u u s p e r i n t e e n + t e o l l i s u u s p e r i n t ö + t e o l l i s u u s p e r i n t ö m m e + t e o l l i s u u s p e r u s t a + t e o l l i s u u s p e r u s t a a + t e o l l i s u u s p e r u s t a a n + t e o l l i s u u s p e r u s t a m m e + t e o l l i s u u s p e r u s t a n + t e o l l i s u u s p i i r e i l l ä + t e o l l i s u u s p i n t a + t e o l l i s u u s p i r a t i s m i a + t e o l l i s u u s p o h j a + t e o l l i s u u s p o h j a a + t e o l l i s u u s p o h j a a m m e + t e o l l i s u u s p o h j a m m e + t e o l l i s u u s p o h j a n + t e o l l i s u u s p o l i i t i k k o + t e o l l i s u u s p o l i i t t i n e n + t e o l l i s u u s p o l i i t t i s e e n + t e o l l i s u u s p o l i i t t i s e n + t e o l l i s u u s p o l i i t t i s e s t a + t e o l l i s u u s p o l i i t t i s e t + t e o l l i s u u s p o l i i t t i s i a + t e o l l i s u u s p o l i i t t i s i s t a + t e o l l i s u u s p o l i i t t i s t e n + t e o l l i s u u s p o l i t i i k a k s i + t e o l l i s u u s p o l i t i i k a l l a + t e o l l i s u u s p o l i t i i k a l l e + t e o l l i s u u s p o l i t i i k a n + t e o l l i s u u s p o l i t i i k a s s a + t e o l l i s u u s p o l i t i i k a s s a a n + t e o l l i s u u s p o l i t i i k a s s a m m e + t e o l l i s u u s p o l i t i i k a s t a + t e o l l i s u u s p o l i t i i k a s t a m m e + t e o l l i s u u s p o l i t i i k a t + t e o l l i s u u s p o l i t i i k k a + t e o l l i s u u s p o l i t i i k k a a + t e o l l i s u u s p o l i t i i k k a a m m e + t e o l l i s u u s p o l i t i i k k a a n + t e o l l i s u u s p o l i t i i k k a a n s a + t e o l l i s u u s p o l i t i i k k a m m e + t e o l l i s u u s p o l i t i i k k a n a + t e o l l i s u u s p o l i t i i k k a n s a + t e o l l i s u u s p o l i t i i k k o j a + t e o l l i s u u s p o l i t i i k k o j e n + t e o l l i s u u s p o l i t i i k o i d e n + t e o l l i s u u s p r o s e s s e i h i n + t e o l l i s u u s p r o s e s s e i s t a + t e o l l i s u u s p u i s t o n + t e o l l i s u u s p u i s t o t + t e o l l i s u u s p u u n + t e o l l i s u u s p ä ä s t ö i s s ä + t e o l l i s u u s p ä ä s t ö j e n + t e o l l i s u u s p ä ä s t ö j ä + t e o l l i s u u s r a k e n n e + t e o l l i s u u s r a k e n n e t t a + t e o l l i s u u s r a k e n n u k s i s s a + t e o l l i s u u s r a k e n t e e l l e + t e o l l i s u u s r a k e n t e e m m e + t e o l l i s u u s r a k e n t e e n + t e o l l i s u u s r a k e n t e i d e n + t e o l l i s u u s r i k o l l i s u u t t a + t e o l l i s u u s r i s k i e n + t e o l l i s u u s r o b o t t i + t e o l l i s u u s r y h m i e n + t e o l l i s u u s r y h m i t t y m i e n + t e o l l i s u u s r y h m i t t y m i l l e + t e o l l i s u u s r y h m i t t y m i ä + t e o l l i s u u s r y h m i t t y m ä + t e o l l i s u u s r y h m i t t y m ä n + t e o l l i s u u s r y h m i t t y m ä s t ä + t e o l l i s u u s r y h m i t t y m ä t + t e o l l i s u u s r y h m i ä + t e o l l i s u u s r y h m ä + t e o l l i s u u s r y h m ä ä n + t e o l l i s u u s s a a s t e e t + t e o l l i s u u s s a a s t e i d e n + t e o l l i s u u s s a l a i s u u d e n + t e o l l i s u u s s e k t o r e i s t a + t e o l l i s u u s s e k t o r i + t e o l l i s u u s s e k t o r i a + t e o l l i s u u s s e k t o r i i n + t e o l l i s u u s s e k t o r i l l a + t e o l l i s u u s s e k t o r i l l e + t e o l l i s u u s s e k t o r i n + t e o l l i s u u s s o k e r i m a r k k i n o i d e n + t e o l l i s u u s s o k e r i n + t e o l l i s u u s s t a n d a r d e i n + t e o l l i s u u s s t a n d a r d i + t e o l l i s u u s s t a n d a r d i a + t e o l l i s u u s s t r a t e g i a + t e o l l i s u u s s t r a t e g i a a + t e o l l i s u u s s t r a t e g i a a n + t e o l l i s u u s s t r a t e g i a n + t e o l l i s u u s s t r a t e g i a s s a + t e o l l i s u u s s t r a t e g i a t + t e o l l i s u u s s t r a t e g i o i s s a m m e + t e o l l i s u u s s u h t e i d e n + t e o l l i s u u s s u h t e i t a + t e o l l i s u u s s u u n n i t t e l u + t e o l l i s u u s s u u n n i t t e l u n + t e o l l i s u u s t a p a t u r m a t + t e o l l i s u u s t a r i f f i t + t e o l l i s u u s t a r k o i t u k s e e n + t e o l l i s u u s t a r k o i t u k s i i n + t e o l l i s u u s t a u s t a n + t e o l l i s u u s t a v a r a a + t e o l l i s u u s t e k n o l o g i a a + t e o l l i s u u s t i l o i s t a + t e o l l i s u u s t o i m i n n a l l a + t e o l l i s u u s t o i m i n n a n + t e o l l i s u u s t o i m i n n a s s a + t e o l l i s u u s t o i m i n t a + t e o l l i s u u s t o i m i n t a a + t e o l l i s u u s t o i m i n t a n a + t e o l l i s u u s t o i m i n t a n s a + t e o l l i s u u s t o i m i t u k s i a + t e o l l i s u u s t u l l e i h i n + t e o l l i s u u s t u l l i e n + t e o l l i s u u s t u l l i t + t e o l l i s u u s t u o t a n n o l l e + t e o l l i s u u s t u o t a n n o n + t e o l l i s u u s t u o t a n n o s s a + t e o l l i s u u s t u o t a n n o s t a + t e o l l i s u u s t u o t a n t o + t e o l l i s u u s t u o t a n t o a + t e o l l i s u u s t u o t a n t o o n + t e o l l i s u u s t u o t e + t e o l l i s u u s t u o t e t t a + t e o l l i s u u s t u o t t a j a + t e o l l i s u u s t u o t t a j a n s a + t e o l l i s u u s t u o t t e e k s i + t e o l l i s u u s t u o t t e e n + t e o l l i s u u s t u o t t e e t + t e o l l i s u u s t u o t t e i d e m m e + t e o l l i s u u s t u o t t e i d e n + t e o l l i s u u s t u o t t e i k s i + t e o l l i s u u s t u o t t e i l l a + t e o l l i s u u s t u o t t e i l l e + t e o l l i s u u s t u o t t e i l t a + t e o l l i s u u s t u o t t e i s i i n + t e o l l i s u u s t u o t t e i s s a + t e o l l i s u u s t u o t t e i s t a + t e o l l i s u u s t u o t t e i t a + t e o l l i s u u s t u t k i m u k s e s s a + t e o l l i s u u s t y y p p i s i i n + t e o l l i s u u s t y ö n a n t a j a t + t e o l l i s u u s t y ö n t e k i j ä + t e o l l i s u u s t y ö n t e k i j ä n + t e o l l i s u u s t y ö n t e k i j ö i d e n + t e o l l i s u u s t y ö p a i k k a + t e o l l i s u u s t y ö p a i k k o j e n + t e o l l i s u u s t y ö v o i m a s t a + t e o l l i s u u s v a k o i l i j o i s t a + t e o l l i s u u s v a k o i l u + t e o l l i s u u s v a k o i l u a + t e o l l i s u u s v a k o i l u n + t e o l l i s u u s v a k o i l u s t a + t e o l l i s u u s v a k o i l u u n + t e o l l i s u u s v a l i o k u n n a l l e + t e o l l i s u u s v a l i o k u n n a l t a + t e o l l i s u u s v a l i o k u n n a n + t e o l l i s u u s v a l i o k u n n a s s a + t e o l l i s u u s v a l i o k u n n a t + t e o l l i s u u s v a l i o k u n t a + t e o l l i s u u s v a l i o k u n t a a + t e o l l i s u u s v a l l a n k u m o u k s e e n + t e o l l i s u u s v a l l a n k u m o u k s e l l a + t e o l l i s u u s v a l l a n k u m o u k s e n + t e o l l i s u u s v a l l a n k u m o u s t a + t e o l l i s u u s v a l l o i l l e + t e o l l i s u u s v a l m i s t u k s e e n + t e o l l i s u u s v a l m i u k s i e n + t e o l l i s u u s v a l t i o + t e o l l i s u u s v a l t i o i d e n + t e o l l i s u u s v a l t i o i s s a + t e o l l i s u u s v a l t i o i s t a + t e o l l i s u u s v a l t i o i t a + t e o l l i s u u s v a l t i o n a + t e o l l i s u u s v a l t i o t + t e o l l i s u u s v e r k o s t o j e n + t e o l l i s u u s v e r k o s t o n + t e o l l i s u u s v e r k o s t o n s a + t e o l l i s u u s v e t o i s e t + t e o l l i s u u s v e t o i s i i n + t e o l l i s u u s v e t o i s i n a + t e o l l i s u u s v ä l i n e i d e n + t e o l l i s u u s y d i n a l u e i l l e + t e o l l i s u u s y h d i s t y k s i ä + t e o l l i s u u s y h d i s t y s + t e o l l i s u u s y h t e i s k u n n a n + t e o l l i s u u s y h t e i s k u n n a s s a + t e o l l i s u u s y h t e i s k u n n i l l a + t e o l l i s u u s y h t e i s k u n n i s s a + t e o l l i s u u s y h t e i s k u n t a + t e o l l i s u u s y h t e i s k u n t a a + t e o l l i s u u s y h t e i s t y ö + t e o l l i s u u s y h t e i s t y ö h ö n + t e o l l i s u u s y h t e i s t y ö l l e + t e o l l i s u u s y h t e i s t y ö n + t e o l l i s u u s y h t e i s t y ö t ä + t e o l l i s u u s y h t e i s ö j e n + t e o l l i s u u s y h t e i s ö l l e + t e o l l i s u u s y h t e i s ö ä + t e o l l i s u u s y h t i ö i d e n + t e o l l i s u u s y h t i ö l l e + t e o l l i s u u s y h t i ö t + t e o l l i s u u s y h t y m ä t + t e o l l i s u u s y k s i k ö i d e n + t e o l l i s u u s y l i o p i s t o n + t e o l l i s u u s y r i t t ä j i s t ä + t e o l l i s u u s y r i t y k s e l l ä + t e o l l i s u u s y r i t y k s e n s ä + t e o l l i s u u s y r i t y k s e t + t e o l l i s u u s y r i t y k s i i n + t e o l l i s u u s y r i t y k s i l l e + t e o l l i s u u s y r i t y k s i s s ä + t e o l l i s u u s y r i t y k s i s t ä + t e o l l i s u u s y r i t y k s i ä + t e o l l i s u u s y r i t y s t e n + t e o l l i s u u s y r i t y s t ä + t e o l l i s u u t e e n + t e o l l i s u u t e m m e + t e o l l i s u u t e n s a + t e o l l i s u u t t a + t e o l o g i s t e n + t e o l o g i t + t e o n f i l o s o f i a + t e o r e e t i k o t + t e o r e e t t i s e l l a + t e o r e e t t i s e l t a + t e o r e e t t i s e n a + t e o r e e t t i s e s t a + t e o r e e t t i s e t + t e o r e e t t i s i a + t e o r e e t t i s i s t a + t e o r e e t t i s t a + t e o r i a a + t e o r i a a n + t e o r i a h a r j o i t u s + t e o r i a k i r j o i s s a a n + t e o r i a k o k e i s i i n + t e o r i a o p e t u s t a + t e o r i a p o h j a + t e o r i a s s a + t e o r i a s t a + t e o r i a t i e d o t + t e o r i o i d e n + t e o r i o i s t a + t e o s k y n n y s + t e o s t a + t e o s t e n + t e q u i l a v a i k u t u k s e s t a + t e r a p e u t t e j a + t e r a p e u t t i s e n + t e r a p e u t t i s e s t i + t e r a p e u t t i s e t + t e r a p e u t t i s i a + t e r a p e u t t i s t a + t e r a p e u t t i s t e n + t e r a p i a m e n e t e l m i ä + t e r a p i a n ä k ö k o h t a + t e r a p i a t u o t t e i d e n + t e r a p i a t y ö + t e r a p i a y h t e i s ö i l l ä + t e r a p i a y h t e i s ö j e n + t e r a p i o i t a + t e r a s s i l ä m m i t i n t e n + t e r a s s i l ä m m i t t i m e t + t e r a s s i l ä m m i t t i m i e n + t e r a s s i l ä m m i t t i m i i n + t e r a s s i l ä m m i t t i m i ä + t e r a s s i v i l j e l y ä + t e r a w a t t i t u n t i a + t e r e f t a a l i h a p p o + t e r m e i n + t e r m e i s t ä + t e r m e j ä + t e r m i e n + t e r m i i t t i s a m m a k k o + t e r m i n + t e r m i n a a l e i s s a + t e r m i n a a l i a l u e e l l e + t e r m i n a a l i n + t e r m i n a a l i t r a k t o r i + t e r m i n a a l i v a i h e + t e r m i n a a l i y r i t y k s e t + t e r m i n a a t t o r i g e e n i + t e r m i n a a t t o r i t e k n o l o g i a a + t e r m i n i + t e r m i n o l o g i a a + t e r m i n o l o g i a k i k k a i l u + t e r m i n o l o g i a o n g e l m i a + t e r m i n o l o g i a s s a + t e r m i n o l o g i a s t a + t e r m i s a n a s t o n + t e r m i t + t e r m i ä + t e r m o d y n a m i i k a n + t e r m o s p u l l o + t e r n i n + t e r o i t e t t a v a + t e r o i t t a a k s e n i + t e r r o r i a + t e r r o r i a a l t o + t e r r o r i a a l t o a + t e r r o r i a a n + t e r r o r i e p ä i l t y j ä + t e r r o r i h a l l i n n o i l l a + t e r r o r i h a l l i n n o l l e + t e r r o r i h a l l i n t o + t e r r o r i h a l l i n t o a + t e r r o r i h y ö k k ä y k s e n + t e r r o r i h y ö k k ä y k s e s t ä + t e r r o r i h y ö k k ä y k s e t + t e r r o r i h y ö k k ä y k s i e n + t e r r o r i h y ö k k ä y k s i i n + t e r r o r i h y ö k k ä y k s i l t ä + t e r r o r i h y ö k k ä y k s i s s ä + t e r r o r i h y ö k k ä y k s i s t ä + t e r r o r i h y ö k k ä y k s i ä + t e r r o r i h y ö k k ä y s + t e r r o r i h y ö k k ä y s t e n + t e r r o r i h y ö k k ä y s t ä + t e r r o r i h y ö k k ä y s y r i t y k s i ä + t e r r o r i j o u k k o j a + t e r r o r i j ä r j e s t e l m ä + t e r r o r i j ä r j e s t e l m ä k s i + t e r r o r i j ä r j e s t e l m ä n + t e r r o r i j ä r j e s t ö + t e r r o r i j ä r j e s t ö i h i n + t e r r o r i j ä r j e s t ö i s t ä + t e r r o r i j ä r j e s t ö j e n + t e r r o r i j ä r j e s t ö k s i + t e r r o r i j ä r j e s t ö t + t e r r o r i k ä y t ä n t ö j e n + t e r r o r i l i i k k e i d e n + t e r r o r i l l a + t e r r o r i m u r h i s t a + t e r r o r i n + t e r r o r i p a k e t t i + t e r r o r i p o m m i t u s + t e r r o r i r i k o k s e n + t e r r o r i r i k o k s i a + t e r r o r i r i k o s t e n + t e r r o r i r y h m i e n + t e r r o r i s m i a + t e r r o r i s m i a j a t u s t a + t e r r o r i s m i e p ä i l y i s t ä + t e r r o r i s m i e p ä i l y n + t e r r o r i s m i h y s t e r i a l l e + t e r r o r i s m i i n + t e r r o r i s m i k a m p a n j a a n + t e r r o r i s m i k a m p a n j a n + t e r r o r i s m i k a n t a a n + t e r r o r i s m i k e s k u s t e l u + t e r r o r i s m i k e s k u s t e l u s s a + t e r r o r i s m i k s i + t e r r o r i s m i k y s y m y s + t e r r o r i s m i k ä s i t y k s e s t ä + t e r r o r i s m i l a i n + t e r r o r i s m i l a i n s ä ä d ä n n ö n + t e r r o r i s m i l a i t + t e r r o r i s m i l a k i e n + t e r r o r i s m i l l a + t e r r o r i s m i l l e + t e r r o r i s m i l t a + t e r r o r i s m i m y ö n t e i n e n + t e r r o r i s m i n + t e r r o r i s m i n t o r j u n n a n + t e r r o r i s m i n t o r j u n n a s s a + t e r r o r i s m i n t o r j u n t a + t e r r o r i s m i n t o r j u n t a a + t e r r o r i s m i n t o r j u n t a a n + t e r r o r i s m i n t o r j u n t a k e s k u k s e n + t e r r o r i s m i n t o r j u n t a k e s k u k s e s t a + t e r r o r i s m i n t o r j u n t a p o l i t i i k k a a + t e r r o r i s m i n t o r j u n t a p y r k i m y k s i s s ä + t e r r o r i s m i n t o r j u n t a s t r a t e g i a + t e r r o r i s m i n t o r j u n t a s t r a t e g i o i d e n + t e r r o r i s m i n u h k a a + t e r r o r i s m i n v a s t a i n e n + t e r r o r i s m i n v a s t a i s e e n + t e r r o r i s m i n v a s t a i s e l l e + t e r r o r i s m i n v a s t a i s e n + t e r r o r i s m i n v a s t a i s e s s a + t e r r o r i s m i n v a s t a i s e s t a + t e r r o r i s m i n v a s t a i s e t + t e r r o r i s m i n v a s t a i s i a + t e r r o r i s m i n v a s t a i s i l l a + t e r r o r i s m i n v a s t a i s i l l e + t e r r o r i s m i n v a s t a i s i s s a + t e r r o r i s m i n v a s t a i s i s t a + t e r r o r i s m i n v a s t a i s t a + t e r r o r i s m i n v a s t a i s t e n + t e r r o r i s m i o n g e l m a + t e r r o r i s m i o n g e l m a n + t e r r o r i s m i o n g e l m a n a + t e r r o r i s m i o n g e l m i a + t e r r o r i s m i p a k e t i s t a + t e r r o r i s m i p e s ä k k e i s s ä + t e r r o r i s m i p o l i t i i k k a a + t e r r o r i s m i p r o p a g a n d a a + t e r r o r i s m i p r o p a g a n d a a n + t e r r o r i s m i r a k e n t e e n s a + t e r r o r i s m i r i k o k s e e n + t e r r o r i s m i r i k o k s e n + t e r r o r i s m i r i k o k s e s t a + t e r r o r i s m i r i k o k s i a + t e r r o r i s m i r i k o k s i i n + t e r r o r i s m i r i k o k s i k s i + t e r r o r i s m i r i k o k s i l l e + t e r r o r i s m i r i k o k s i s t a + t e r r o r i s m i r i k o l l i s u u d e n + t e r r o r i s m i r i k o s + t e r r o r i s m i r i n t a m a l l a + t e r r o r i s m i s a a r e k k e i t a + t e r r o r i s m i s o p i m u k s e s s a + t e r r o r i s m i s o p i m u s t a + t e r r o r i s m i s t a + t e r r o r i s m i s t r a t e g i a a + t e r r o r i s m i s y y t t e e t + t e r r o r i s m i s y y t t e i d e n + t e r r o r i s m i t a p a u k s i s s a + t e r r o r i s m i t a p a u s t e n + t e r r o r i s m i t e k i j ö i t ä + t e r r o r i s m i t i l a n t e e n + t e r r o r i s m i t i l a n t e e s t a + t e r r o r i s m i t i l a n t e i s s a + t e r r o r i s m i u h k a + t e r r o r i s m i u h k a a + t e r r o r i s m i u h k a a n + t e r r o r i s m i u h k a n + t e r r o r i s m i u h k i a + t e r r o r i s m i u h k i e n + t e r r o r i s m i u h k i i n + t e r r o r i s m i v a a r a + t e r r o r i s m i v a a r a n + t e r r o r i s m i y h t e y k s i s t ä + t e r r o r i s o i m i s e k s i + t e r r o r i s o i n t i a + t e r r o r i s o i n t i v ä l i n e + t e r r o r i s t a + t e r r o r i s t e i h i n + t e r r o r i s t e i k s i + t e r r o r i s t e i l l a + t e r r o r i s t e i l l e + t e r r o r i s t e i l t a + t e r r o r i s t e i s t a + t e r r o r i s t e j a + t e r r o r i s t i a a l l o l l a + t e r r o r i s t i a i n e k s i a + t e r r o r i s t i a r m e i j a + t e r r o r i s t i a t t e n t a a t t e i h i n + t e r r o r i s t i d i k t a t u u r i a + t e r r o r i s t i e d u s t a j a a + t e r r o r i s t i e n + t e r r o r i s t i e p ä i l l y n + t e r r o r i s t i e p ä i l t y + t e r r o r i s t i e p ä i l t y j e n + t e r r o r i s t i h a i l l e + t e r r o r i s t i h a l l i n n o n + t e r r o r i s t i h a l l i n n o s t a + t e r r o r i s t i h a l l i n t o a + t e r r o r i s t i h a l l i t u s + t e r r o r i s t i h y ö k k ä y k s e e n + t e r r o r i s t i h y ö k k ä y k s e n + t e r r o r i s t i h y ö k k ä y k s e s s ä + t e r r o r i s t i h y ö k k ä y k s e s t ä + t e r r o r i s t i h y ö k k ä y k s e t + t e r r o r i s t i h y ö k k ä y k s i e n + t e r r o r i s t i h y ö k k ä y k s i i n + t e r r o r i s t i h y ö k k ä y k s i l l e + t e r r o r i s t i h y ö k k ä y k s i l t ä + t e r r o r i s t i h y ö k k ä y k s i s t ä + t e r r o r i s t i h y ö k k ä y k s i ä + t e r r o r i s t i h y ö k k ä y s + t e r r o r i s t i h y ö k k ä y s t e n + t e r r o r i s t i h y ö k k ä y s t ä + t e r r o r i s t i j a h t i + t e r r o r i s t i j o h t a j a + t e r r o r i s t i j o h t a j a a + t e r r o r i s t i j o h t a j a n + t e r r o r i s t i j o h t a j i e n + t e r r o r i s t i j o h t o o n + t e r r o r i s t i j o u k k o + t e r r o r i s t i j o u k k o i h i n + t e r r o r i s t i j o u k k o j a + t e r r o r i s t i j ä r j e s t e l m ä + t e r r o r i s t i j ä r j e s t ö + t e r r o r i s t i j ä r j e s t ö i h i n + t e r r o r i s t i j ä r j e s t ö i k s i + t e r r o r i s t i j ä r j e s t ö i l l e + t e r r o r i s t i j ä r j e s t ö i l l ä + t e r r o r i s t i j ä r j e s t ö i l t ä + t e r r o r i s t i j ä r j e s t ö i n ä + t e r r o r i s t i j ä r j e s t ö i s t ä + t e r r o r i s t i j ä r j e s t ö j e n + t e r r o r i s t i j ä r j e s t ö j ä + t e r r o r i s t i j ä r j e s t ö k s i + t e r r o r i s t i j ä r j e s t ö l l e + t e r r o r i s t i j ä r j e s t ö l u e t t e l o o n + t e r r o r i s t i j ä r j e s t ö n + t e r r o r i s t i j ä r j e s t ö n ä + t e r r o r i s t i j ä r j e s t ö t + t e r r o r i s t i j ä r j e s t ö ä + t e r r o r i s t i j ä r j e s t ö ö n + t e r r o r i s t i k a n s a k s i + t e r r o r i s t i k a n s a n a + t e r r o r i s t i k a p i n a n + t e r r o r i s t i k e i n o i s t a + t e r r o r i s t i k e s k u k s i s t a + t e r r o r i s t i k o h t e e n a + t e r r o r i s t i k o u l u t u s t a + t e r r o r i s t i k s i + t e r r o r i s t i l a i n + t e r r o r i s t i l a i n s ä ä d ä n n ö n + t e r r o r i s t i l i i k e + t e r r o r i s t i l i i k k e e n + t e r r o r i s t i l i i k k e e s t ä + t e r r o r i s t i l i i k k e i d e n + t e r r o r i s t i l i i k k e i t ä + t e r r o r i s t i l i s t a + t e r r o r i s t i l i s t a a + t e r r o r i s t i l i s t a l l a + t e r r o r i s t i l i s t a l l a a n + t e r r o r i s t i l i s t a l l e + t e r r o r i s t i l i s t a l t a + t e r r o r i s t i l u e t t e l o o n + t e r r o r i s t i l u e t t e l o s s a + t e r r o r i s t i l u e t t e l o s t a + t e r r o r i s t i l u e t t e l o s t a m m e + t e r r o r i s t i l u e t t e l o t + t e r r o r i s t i m a g n e e t t e j a + t e r r o r i s t i m u r h a a j i a + t e r r o r i s t i m u r h a a j i e n + t e r r o r i s t i m u r h a t + t e r r o r i s t i m u r h i e n + t e r r o r i s t i m u r h i l l e + t e r r o r i s t i n a + t e r r o r i s t i o n g e l m a a + t e r r o r i s t i o n g e l m i a + t e r r o r i s t i o p e r a a t i o n + t e r r o r i s t i o r g a n i s a a t i o n + t e r r o r i s t i p e s ä k k e i d e n + t e r r o r i s t i p i i r e i s t ä + t e r r o r i s t i p o l i t i i k a n + t e r r o r i s t i p o m m i t + t e r r o r i s t i p o m m i t t a j a + t e r r o r i s t i p r o p a g a n d a a n + t e r r o r i s t i p r o p a g a n d a n + t e r r o r i s t i r i k o k s e e n + t e r r o r i s t i r i k o k s i a + t e r r o r i s t i r i k o l l i s e t + t e r r o r i s t i r i k o s t e n + t e r r o r i s t i r y h m i e n + t e r r o r i s t i r y h m i i n + t e r r o r i s t i r y h m i l l e + t e r r o r i s t i r y h m i t t y m i e n + t e r r o r i s t i r y h m i t t y m i l l e + t e r r o r i s t i r y h m i t t y m i ä + t e r r o r i s t i r y h m i t t y m ä + t e r r o r i s t i r y h m i t t y m ä t + t e r r o r i s t i r y h m i ä + t e r r o r i s t i r y h m ä + t e r r o r i s t i r y h m ä k s i + t e r r o r i s t i r y h m ä n + t e r r o r i s t i r y h m ä t + t e r r o r i s t i r y h m ä ä n + t e r r o r i s t i s i s s e j ä + t e r r o r i s t i s o l u j a + t e r r o r i s t i s o l u j e n + t e r r o r i s t i s o l u t + t e r r o r i s t i s t a + t e r r o r i s t i s t o i m i n t a a n + t e r r o r i s t i s u k u p o l v e n + t e r r o r i s t i s u u n n i t e l m i e n + t e r r o r i s t i t + t e r r o r i s t i t a i s t e l i j o i d e n + t e r r o r i s t i t a k t i i k o i t a + t e r r o r i s t i t e k n i i k o i t a + t e r r o r i s t i t e k o a + t e r r o r i s t i t e k o i h i n + t e r r o r i s t i t e k o i n a + t e r r o r i s t i t e k o j a + t e r r o r i s t i t e k o j e n + t e r r o r i s t i t e o i s t a + t e r r o r i s t i t e o n + t e r r o r i s t i t e o t + t e r r o r i s t i t o i m e t + t e r r o r i s t i t o i m i e n + t e r r o r i s t i t o i m i l t a + t e r r o r i s t i t o i m i n n a n + t e r r o r i s t i t o i m i n n a s s a + t e r r o r i s t i t o i m i n n a s t a + t e r r o r i s t i t o i m i n t a + t e r r o r i s t i t o i m i n t a a + t e r r o r i s t i t o i m i n t a a n + t e r r o r i s t i t o i m i n t a a n s a + t e r r o r i s t i t o i m i n t a n a + t e r r o r i s t i u h k a + t e r r o r i s t i u h k a a + t e r r o r i s t i u h k a a n + t e r r o r i s t i u h k a n + t e r r o r i s t i u h k i e n + t e r r o r i s t i u h k i i n + t e r r o r i s t i v a a r a n + t e r r o r i s t i v a l t i o i t a + t e r r o r i s t i v a n g i t + t e r r o r i s t i v a n k i e n + t e r r o r i s t i v e r k k o j a + t e r r o r i s t i v e r k o s t o + t e r r o r i s t i v e r k o s t o a + t e r r o r i s t i v e r k o s t o i h i n + t e r r o r i s t i v e r k o s t o i l l e + t e r r o r i s t i v e r k o s t o i l t a + t e r r o r i s t i v e r k o s t o j a + t e r r o r i s t i v e r k o s t o j e n + t e r r o r i s t i v e r k o s t o n + t e r r o r i s t i v e r k o s t o t + t e r r o r i s t i v e r k o t + t e r r o r i s t i v o i m i e n + t e r r o r i s t i v ä k i v a l l a l t a + t e r r o r i s t i v ä k i v a l t a + t e r r o r i s t i y h t e i s ö ä + t e r r o r i s t r a t e g i a + t e r r o r i t a k t i i k k a a + t e r r o r i t a r k o i t u k s i i n + t e r r o r i t e k o + t e r r o r i t e k o a + t e r r o r i t e k o i h i n + t e r r o r i t e k o i n a + t e r r o r i t e k o j a + t e r r o r i t e k o j a a n + t e r r o r i t e k o j e n + t e r r o r i t e k o n a + t e r r o r i t e k o n s a + t e r r o r i t e k o o n + t e r r o r i t e o i k s i + t e r r o r i t e o i l l a + t e r r o r i t e o i l l e + t e r r o r i t e o i l t a + t e r r o r i t e o i n + t e r r o r i t e o i s s a + t e r r o r i t e o i s t a + t e r r o r i t e o k s i + t e r r o r i t e o l l a + t e r r o r i t e o n + t e r r o r i t e o s t a + t e r r o r i t e o t + t e r r o r i t o i m e t + t e r r o r i t o i m i a + t e r r o r i t o i m i a a n + t e r r o r i t o i m i e n + t e r r o r i t o i m i n n a k s i + t e r r o r i t o i m i n n a n + t e r r o r i t o i m i n t a + t e r r o r i t o i m i n t a a + t e r r o r i t o i m i n t a a n + t e r r o r i t o i m i s t a + t e r r o r i u h k a + t e r r o r i u h k a a + t e r r o r i u h k a a n + t e r r o r i u h k a n + t e r r o r i u h k a t + t e r r o r i u h k i a + t e r r o r i u h k i e n + t e r r o r i v a l t i o + t e r r o r i v a l t i o n a + t e r r o r i v e r k k o j e n + t e r r o r i v e r k o s t o j e n + t e r r o r i v e r k o s t o t + t e r r o r i y r i t y k s i ä + t e r t i ä ä r i a m y y l i m e t y y l i e e t t e r i + t e r t i ä ä r i l ä h d e + t e r t t u a l p i + t e r t t u s e l j a + t e r v a h a u d a t + t e r v a h i e k a l l e + t e r v a h i e k a n + t e r v a h i e k a s t a + t e r v a h i e k k a + t e r v a h i e k k a a + t e r v a h i e k k a a n + t e r v a h i e k k a n s a + t e r v a h i e k k a t u t k i m u s + t e r v a h i e k k a ö l j y n + t e r v a l e i j u + t e r v a l e p p ä + t e r v a m e s i k k o + t e r v a m u u m i o + t e r v a n + t e r v a p a p e r i + t e r v a p e i p p o + t e r v a p i t o i s u u d e n + t e r v a p i t o i s u u s + t e r v a p i t o i s u u t t a + t e r v a p ä ä s k y + t e r v e e k s i + t e r v e e l l e + t e r v e e l l i s e e n + t e r v e e l l i s e m m i n + t e r v e e l l i s e m m ä s t ä + t e r v e e l l i s e m p i + t e r v e e l l i s e m p i n ä + t e r v e e l l i s e m p i ä + t e r v e e l l i s e m p ä ä + t e r v e e l l i s e m p ä ä n + t e r v e e l l i s e n + t e r v e e l l i s e n ä + t e r v e e l l i s e s t ä + t e r v e e l l i s e t + t e r v e e l l i s i i n + t e r v e e l l i s i k s i + t e r v e e l l i s i l l ä + t e r v e e l l i s i ä + t e r v e e l l i s t e n + t e r v e e l l i s t ä + t e r v e e l l ä + t e r v e e l t ä + t e r v e e m m i n + t e r v e e m m ä l l ä + t e r v e e m p i + t e r v e e m p i e n + t e r v e e m p i n ä + t e r v e e m p i ä + t e r v e e m p ä n ä + t e r v e e n + t e r v e e n ä + t e r v e e s e e n + t e r v e e s s ä + t e r v e e s t ä + t e r v e e t + t e r v e h d i m m e + t e r v e h d i n + t e r v e h d i t t y ä n i + t e r v e h d y k s e n + t e r v e h d y k s e n i + t e r v e h d y k s e s t ä + t e r v e h d y k s e s t ä n n e + t e r v e h d y s t e n + t e r v e h d y s t i l a i s u u d e s s a + t e r v e h d y t t ä m i n e n + t e r v e h d y t t ä m i s e e n + t e r v e h d y t t ä m i s e n + t e r v e h d y t t ä m i s o h j e l m a a + t e r v e h d y t t ä m i s o h j e l m a t + t e r v e h d y t t ä m i s p o l i t i i k k a + t e r v e h d y t t ä m i s p o n n i s t e l u t + t e r v e h d y t t ä m i s p y r k i m y k s i ä + t e r v e h d y t t ä m i s p y r k i m y s t ä + t e r v e h d y t t ä m i s t o i m e n p i t e i t ä + t e r v e h d y t t ä m i s t o i m i a + t e r v e h d y t t ä m i s t ä + t e r v e h d y t t ä m ä ä n + t e r v e h d y t t ä ä + t e r v e h d y t t ä ä k s e e n + t e r v e h t i e s s ä n i + t e r v e h t i ä + t e r v e h t i ä k s e n i + t e r v e h t y m i s e n + t e r v e h t y m i s p r o s e s s i k s i + t e r v e i d e n + t e r v e i l l ä + t e r v e i n ä + t e r v e i s e m m e + t e r v e i s e n i + t e r v e i s e n n e + t e r v e i s e t + t e r v e i s i ä + t e r v e i t ä + t e r v e j ä r k i n e n + t e r v e j ä r k i s e s t ä + t e r v e j ä r k i s e t + t e r v e j ä r k i s i i n + t e r v e j ä r k i s i ä + t e r v e j ä r k i s t ä + t e r v e t t ä + t e r v e t u l l e e k s i + t e r v e t u l l e e m m a t + t e r v e t u l l e e n a + t e r v e t u l l e i k s i + t e r v e t u l l e i n + t e r v e t u l l e i s t a + t e r v e t u l l e i t a + t e r v e t u l l u t + t e r v e t u l l u t t a + t e r v e t u l o a + t e r v e t u l o t o i v o t u k s e n + t e r v e t u l o t o i v o t u k s e s t a a n + t e r v e t u l o t o i v o t u k s i a + t e r v e y d e l l e + t e r v e y d e l l e e n + t e r v e y d e l l e m m e + t e r v e y d e l l i s e t + t e r v e y d e l l i s i s t ä + t e r v e y d e l l i s i ä + t e r v e y d e l l i s t ä + t e r v e y d e n + t e r v e y d e n a l a n + t e r v e y d e n h o i d o l l a + t e r v e y d e n h o i d o l l e + t e r v e y d e n h o i d o l l i n e n + t e r v e y d e n h o i d o l l i s e n + t e r v e y d e n h o i d o n + t e r v e y d e n h o i d o s s a + t e r v e y d e n h o i d o s t a + t e r v e y d e n h o i t a j a + t e r v e y d e n h o i t o + t e r v e y d e n h o i t o a + t e r v e y d e n h o i t o a l a + t e r v e y d e n h o i t o a l a a + t e r v e y d e n h o i t o a l a a n + t e r v e y d e n h o i t o a l a l l a + t e r v e y d e n h o i t o a l a l l e + t e r v e y d e n h o i t o a l a n + t e r v e y d e n h o i t o a l o i t t e i t a + t e r v e y d e n h o i t o a l o j e n + t e r v e y d e n h o i t o a p u u n + t e r v e y d e n h o i t o a s i o i s s a + t e r v e y d e n h o i t o a v u l t a + t e r v e y d e n h o i t o a v u n + t e r v e y d e n h o i t o b u d j e t t e i h i n + t e r v e y d e n h o i t o h e n k i l ö k u n n a l l e + t e r v e y d e n h o i t o h e n k i l ö k u n n a n + t e r v e y d e n h o i t o h e n k i l ö k u n t a a + t e r v e y d e n h o i t o h e n k i l ö s t ö + t e r v e y d e n h o i t o h e n k i l ö s t ö l l e + t e r v e y d e n h o i t o h e n k i l ö s t ö n + t e r v e y d e n h o i t o h e n k i l ö s t ö s t ä + t e r v e y d e n h o i t o h e n k i l ö s t ö ä + t e r v e y d e n h o i t o i n f r a s t r u k t u u r i n + t e r v e y d e n h o i t o i n v e s t o i n t e j a + t e r v e y d e n h o i t o j ä r j e s t e l m i e n + t e r v e y d e n h o i t o j ä r j e s t e l m i e n s ä + t e r v e y d e n h o i t o j ä r j e s t e l m i i n + t e r v e y d e n h o i t o j ä r j e s t e l m i l l ä + t e r v e y d e n h o i t o j ä r j e s t e l m i s s ä + t e r v e y d e n h o i t o j ä r j e s t e l m i s t ä + t e r v e y d e n h o i t o j ä r j e s t e l m i s t ä ä n + t e r v e y d e n h o i t o j ä r j e s t e l m i ä + t e r v e y d e n h o i t o j ä r j e s t e l m i ä m m e + t e r v e y d e n h o i t o j ä r j e s t e l m ä + t e r v e y d e n h o i t o j ä r j e s t e l m ä l l e + t e r v e y d e n h o i t o j ä r j e s t e l m ä n + t e r v e y d e n h o i t o j ä r j e s t e l m ä s s ä + t e r v e y d e n h o i t o j ä r j e s t e l m ä s t ä + t e r v e y d e n h o i t o j ä r j e s t e l m ä t + t e r v e y d e n h o i t o j ä r j e s t e l m ä ä + t e r v e y d e n h o i t o j ä r j e s t e l m ä ä n + t e r v e y d e n h o i t o j ä r j e s t e l m ä ä n s ä + t e r v e y d e n h o i t o k e s k u k s i i n + t e r v e y d e n h o i t o k o r t t i + t e r v e y d e n h o i t o k u l u i h i n + t e r v e y d e n h o i t o k u l u i n a + t e r v e y d e n h o i t o k u l u i s s a + t e r v e y d e n h o i t o k u l u i s t a + t e r v e y d e n h o i t o k u l u j e n + t e r v e y d e n h o i t o k u l u t + t e r v e y d e n h o i t o k u s t a n n u k s e t + t e r v e y d e n h o i t o k u s t a n n u k s i a + t e r v e y d e n h o i t o k u s t a n n u k s i i n + t e r v e y d e n h o i t o k u s t a n n u k s i s t a + t e r v e y d e n h o i t o k u s t a n n u s t e n + t e r v e y d e n h o i t o k y s y m y s t e n + t e r v e y d e n h o i t o l a i s t a + t e r v e y d e n h o i t o l a i t o k s e e n + t e r v e y d e n h o i t o l a i t o k s e t + t e r v e y d e n h o i t o l a i t o k s i a + t e r v e y d e n h o i t o l a i t o k s i i n + t e r v e y d e n h o i t o l a i t o s t e n + t e r v e y d e n h o i t o l a k e j a + t e r v e y d e n h o i t o m a h d o l l i s u u d e t + t e r v e y d e n h o i t o m a h d o l l i s u u k s i a + t e r v e y d e n h o i t o m a h d o l l i s u u k s i e n + t e r v e y d e n h o i t o m a r k k i n a t + t e r v e y d e n h o i t o m a t k a i l u + t e r v e y d e n h o i t o m a t k a i l u k o h t e e k s i + t e r v e y d e n h o i t o m a t k a i l u n + t e r v e y d e n h o i t o m a t k a i l u u n + t e r v e y d e n h o i t o m e n o i s s a + t e r v e y d e n h o i t o m e n o i s t a + t e r v e y d e n h o i t o m e n o j a + t e r v e y d e n h o i t o m e n o j e n + t e r v e y d e n h o i t o m e n o t + t e r v e y d e n h o i t o o n + t e r v e y d e n h o i t o p a k e t t i i n + t e r v e y d e n h o i t o p a l v e l u a + t e r v e y d e n h o i t o p a l v e l u i d e n + t e r v e y d e n h o i t o p a l v e l u i h i n + t e r v e y d e n h o i t o p a l v e l u i s s a + t e r v e y d e n h o i t o p a l v e l u i s t a + t e r v e y d e n h o i t o p a l v e l u i s t a a n + t e r v e y d e n h o i t o p a l v e l u j a + t e r v e y d e n h o i t o p a l v e l u j a a n + t e r v e y d e n h o i t o p a l v e l u j e n + t e r v e y d e n h o i t o p a l v e l u t + t e r v e y d e n h o i t o p a l v e l u u n + t e r v e y d e n h o i t o p o l i t i i k a s s a + t e r v e y d e n h o i t o p o l i t i i k k a + t e r v e y d e n h o i t o p o l i t i i k k a a + t e r v e y d e n h o i t o s t r a t e g i a a + t e r v e y d e n h o i t o s t r a t e g i o i t a + t e r v e y d e n h o i t o t e h t ä v i i n + t e r v e y d e n h o i t o t o i m e n p i t e e t + t e r v e y d e n h o i t o t o i m i i n + t e r v e y d e n h o i t o t o i m i n t a a n + t e r v e y d e n h o i t o t u l o k s i a + t e r v e y d e n h o i t o u u d i s t u s t a + t e r v e y d e n h o i t o v i r a n o m a i s t e n + t e r v e y d e n h o i t o v ä l i n e i d e n + t e r v e y d e n h u o l l o l l a + t e r v e y d e n h u o l l o l l e + t e r v e y d e n h u o l l o n + t e r v e y d e n h u o l l o s s a + t e r v e y d e n h u o l l o s t a + t e r v e y d e n h u o l t o + t e r v e y d e n h u o l t o a + t e r v e y d e n h u o l t o a l a + t e r v e y d e n h u o l t o a l a a + t e r v e y d e n h u o l t o a l a a n + t e r v e y d e n h u o l t o a l a l l a + t e r v e y d e n h u o l t o a l a l l a a n + t e r v e y d e n h u o l t o a l a l l e + t e r v e y d e n h u o l t o a l a n + t e r v e y d e n h u o l t o a l o j e n + t e r v e y d e n h u o l t o a m m a t t i l a i s t e n + t e r v e y d e n h u o l t o a s i o i h i n + t e r v e y d e n h u o l t o a s i o i s s a + t e r v e y d e n h u o l t o a s i o i t a + t e r v e y d e n h u o l t o a v u n + t e r v e y d e n h u o l t o b u d j e t e i s s a + t e r v e y d e n h u o l t o b u d j e t i s s a + t e r v e y d e n h u o l t o b u d j e t t e j a + t e r v e y d e n h u o l t o b y r o k r a t i a t + t e r v e y d e n h u o l t o d i r e k t i i v i i n + t e r v e y d e n h u o l t o e l i n t e n + t e r v e y d e n h u o l t o e t u u k s i a + t e r v e y d e n h u o l t o h a n k k e i s i i n + t e r v e y d e n h u o l t o h a n k k e i t a + t e r v e y d e n h u o l t o h e n k i l ö k u n n a n + t e r v e y d e n h u o l t o h e n k i l ö k u n n a s t a + t e r v e y d e n h u o l t o h e n k i l ö k u n t a + t e r v e y d e n h u o l t o h e n k i l ö k u n t a a + t e r v e y d e n h u o l t o h e n k i l ö s t ö + t e r v e y d e n h u o l t o h e n k i l ö s t ö l l e + t e r v e y d e n h u o l t o h e n k i l ö s t ö n + t e r v e y d e n h u o l t o h e n k i l ö s t ö s t ä + t e r v e y d e n h u o l t o h e n k i l ö s t ö ä + t e r v e y d e n h u o l t o h e n k i l ö s t ö ö n + t e r v e y d e n h u o l t o i n f r a s t r u k t u u r i a + t e r v e y d e n h u o l t o i n f r a s t r u k t u u r i n + t e r v e y d e n h u o l t o j a o t t e l u u n + t e r v e y d e n h u o l t o j u l k a i s u i s s a + t e r v e y d e n h u o l t o j ä r j e s t e l m i e n + t e r v e y d e n h u o l t o j ä r j e s t e l m i e n s ä + t e r v e y d e n h u o l t o j ä r j e s t e l m i i m m e + t e r v e y d e n h u o l t o j ä r j e s t e l m i i n + t e r v e y d e n h u o l t o j ä r j e s t e l m i i n s ä + t e r v e y d e n h u o l t o j ä r j e s t e l m i l l e + t e r v e y d e n h u o l t o j ä r j e s t e l m i l l e m m e + t e r v e y d e n h u o l t o j ä r j e s t e l m i l t ä + t e r v e y d e n h u o l t o j ä r j e s t e l m i s s ä + t e r v e y d e n h u o l t o j ä r j e s t e l m i s s ä m m e + t e r v e y d e n h u o l t o j ä r j e s t e l m i s s ä ä n + t e r v e y d e n h u o l t o j ä r j e s t e l m i s t ä + t e r v e y d e n h u o l t o j ä r j e s t e l m i s t ä ä n + t e r v e y d e n h u o l t o j ä r j e s t e l m i ä + t e r v e y d e n h u o l t o j ä r j e s t e l m i ä m m e + t e r v e y d e n h u o l t o j ä r j e s t e l m i ä ä n + t e r v e y d e n h u o l t o j ä r j e s t e l m ä + t e r v e y d e n h u o l t o j ä r j e s t e l m ä k s i + t e r v e y d e n h u o l t o j ä r j e s t e l m ä l l e + t e r v e y d e n h u o l t o j ä r j e s t e l m ä l l e m m e + t e r v e y d e n h u o l t o j ä r j e s t e l m ä l l ä + t e r v e y d e n h u o l t o j ä r j e s t e l m ä m m e + t e r v e y d e n h u o l t o j ä r j e s t e l m ä n + t e r v e y d e n h u o l t o j ä r j e s t e l m ä n s ä + t e r v e y d e n h u o l t o j ä r j e s t e l m ä n ä + t e r v e y d e n h u o l t o j ä r j e s t e l m ä s s ä + t e r v e y d e n h u o l t o j ä r j e s t e l m ä s s ä ä n + t e r v e y d e n h u o l t o j ä r j e s t e l m ä s t ä + t e r v e y d e n h u o l t o j ä r j e s t e l m ä t + t e r v e y d e n h u o l t o j ä r j e s t e l m ä ä + t e r v e y d e n h u o l t o j ä r j e s t e l m ä ä m m e + t e r v e y d e n h u o l t o j ä r j e s t e l m ä ä n + t e r v e y d e n h u o l t o j ä r j e s t e l m ä ä n s ä + t e r v e y d e n h u o l t o k e s k u s t e l u + t e r v e y d e n h u o l t o k r i i s i i n + t e r v e y d e n h u o l t o k u l u j a + t e r v e y d e n h u o l t o k u l u j e n + t e r v e y d e n h u o l t o k u l u t + t e r v e y d e n h u o l t o k u s t a n n u k s e t + t e r v e y d e n h u o l t o k u s t a n n u k s i a + t e r v e y d e n h u o l t o k u s t a n n u k s i i n + t e r v e y d e n h u o l t o k u s t a n n u k s i s t a + t e r v e y d e n h u o l t o k u s t a n n u s t e n + t e r v e y d e n h u o l t o k y s y m y k s i i n + t e r v e y d e n h u o l t o k y s y m y k s i s t ä + t e r v e y d e n h u o l t o l a i n s ä ä d ä n n ö n + t e r v e y d e n h u o l t o l a i n s ä ä d ä n t ö ä ä n + t e r v e y d e n h u o l t o l a i t o k s e t + t e r v e y d e n h u o l t o l a i t o k s i i n + t e r v e y d e n h u o l t o l a i t o s + t e r v e y d e n h u o l t o l a i t o s t a + t e r v e y d e n h u o l t o m a h d o l l i s u u k s i s t a a n + t e r v e y d e n h u o l t o m a k s u j a + t e r v e y d e n h u o l t o m a r k k i n a t + t e r v e y d e n h u o l t o m a r k k i n o i d e n + t e r v e y d e n h u o l t o m a t k a i l u + t e r v e y d e n h u o l t o m a t k a i l u a + t e r v e y d e n h u o l t o m a t k a i l u l l a + t e r v e y d e n h u o l t o m e n o i h i n + t e r v e y d e n h u o l t o m e n o i s t a + t e r v e y d e n h u o l t o m e n o j a + t e r v e y d e n h u o l t o m e n o j a a n + t e r v e y d e n h u o l t o m e n o j e n + t e r v e y d e n h u o l t o m e n o t + t e r v e y d e n h u o l t o m m e + t e r v e y d e n h u o l t o m ä ä r ä r a h o i h i n + t e r v e y d e n h u o l t o m ä ä r ä r a h o i s t a + t e r v e y d e n h u o l t o n s a + t e r v e y d e n h u o l t o o n + t e r v e y d e n h u o l t o p a k e t i s t a + t e r v e y d e n h u o l t o p a k e t t i a + t e r v e y d e n h u o l t o p a l v e l u + t e r v e y d e n h u o l t o p a l v e l u a + t e r v e y d e n h u o l t o p a l v e l u i d e n + t e r v e y d e n h u o l t o p a l v e l u i h i n + t e r v e y d e n h u o l t o p a l v e l u i l l e + t e r v e y d e n h u o l t o p a l v e l u i s s a + t e r v e y d e n h u o l t o p a l v e l u i s s a m m e + t e r v e y d e n h u o l t o p a l v e l u i s t a + t e r v e y d e n h u o l t o p a l v e l u i t a + t e r v e y d e n h u o l t o p a l v e l u j a + t e r v e y d e n h u o l t o p a l v e l u j a a n + t e r v e y d e n h u o l t o p a l v e l u j e n + t e r v e y d e n h u o l t o p a l v e l u t + t e r v e y d e n h u o l t o p o l i i t t i s t a + t e r v e y d e n h u o l t o p o l i t i i k a n + t e r v e y d e n h u o l t o p o l i t i i k a s s a + t e r v e y d e n h u o l t o p o l i t i i k a s t a + t e r v e y d e n h u o l t o p o l i t i i k k a + t e r v e y d e n h u o l t o p o l i t i i k k a a + t e r v e y d e n h u o l t o p o l i t i i k k a a n + t e r v e y d e n h u o l t o p o l i t i i k k a m m e + t e r v e y d e n h u o l t o p o l i t i i k o i s s a + t e r v e y d e n h u o l t o r a h a s t o n + t e r v e y d e n h u o l t o r y h m i l l e + t e r v e y d e n h u o l t o s e k t o r i + t e r v e y d e n h u o l t o s e k t o r i i n + t e r v e y d e n h u o l t o s e k t o r i n + t e r v e y d e n h u o l t o s e k t o r i s t a + t e r v e y d e n h u o l t o s e t e l i j ä r j e s t e l m ä n + t e r v e y d e n h u o l t o s t a n d a r d e j a + t e r v e y d e n h u o l t o s t r a t e g i a + t e r v e y d e n h u o l t o s t r a t e g i a a + t e r v e y d e n h u o l t o s t r a t e g i a s t a + t e r v e y d e n h u o l t o s u u n n i t e l m i i n + t e r v e y d e n h u o l t o t a k e i d e n + t e r v e y d e n h u o l t o t a r j o n n a s t a + t e r v e y d e n h u o l t o t i e t o k a n n a n + t e r v e y d e n h u o l t o t i l a n n e + t e r v e y d e n h u o l t o t i l a n t e e n + t e r v e y d e n h u o l t o t o i m i e n + t e r v e y d e n h u o l t o t o i m i l l e + t e r v e y d e n h u o l t o t u r i s m i + t e r v e y d e n h u o l t o t u r i s m i i n + t e r v e y d e n h u o l t o t u r i s t e i s t a + t e r v e y d e n h u o l t o t u r i s t e j a + t e r v e y d e n h u o l t o u u d i s t u k s e n + t e r v e y d e n h u o l t o u u d i s t u s + t e r v e y d e n h u o l t o u u d i s t u s t e n + t e r v e y d e n h u o l t o v a a t i m u k s e t + t e r v e y d e n h u o l t o v i r a n o m a i s e t + t e r v e y d e n h u o l t o v i r a n o m a i s i l l e + t e r v e y d e n h u o l t o v i r a n o m a i s t e n + t e r v e y d e n h u o l t o y k s i k ö i d e n + t e r v e y d e n h u o l t o y k s i k ö l l e + t e r v e y d e n h u o l t o y k s i k ö n + t e r v e y d e n h u o l t o y k s i k ö t + t e r v e y d e n h u o l t o y r i t y k s i ä + t e r v e y d e n s e u r a n t a k e s k u s + t e r v e y d e n s u o j a + t e r v e y d e n s u o j a n + t e r v e y d e n s u o j e l u + t e r v e y d e n s u o j e l u a + t e r v e y d e n s u o j e l u j ä r j e s t e l m ä n + t e r v e y d e n s u o j e l u l a i n s ä ä d ä n t ö ä + t e r v e y d e n s u o j e l u n + t e r v e y d e n s u o j e l u o h j e l m a n + t e r v e y d e n s u o j e l u s s a + t e r v e y d e n s u o j e l u s t a + t e r v e y d e n s u o j e l u s ä ä n n ö i l l e + t e r v e y d e n s u o j e l u t o i m e n p i t e i l l ä + t e r v e y d e n s u o j e l u t o i m i a + t e r v e y d e n s u o j e l u u n + t e r v e y d e n s u o j e l u v i r a s t o s t a + t e r v e y d e n t i l a + t e r v e y d e n t i l a a + t e r v e y d e n t i l a a n + t e r v e y d e n t i l a a n s a + t e r v e y d e n t i l a n + t e r v e y d e n t i l a n n e + t e r v e y d e n t i l a n s a + t e r v e y d e n t i l a s s a + t e r v e y d e n t i l a s t a + t e r v e y d e n t i l a s t a a n + t e r v e y d e n t u t k i m u s + t e r v e y d e s t ä + t e r v e y d e s t ä m m e + t e r v e y d e s t ä ä n + t e r v e y s a l a + t e r v e y s a l a a + t e r v e y s a l a a n + t e r v e y s a l a l l a + t e r v e y s a l a l l a h a n + t e r v e y s a l a l t a + t e r v e y s a l a n + t e r v e y s a l o i t t e i d e m m e + t e r v e y s a l u e e n a + t e r v e y s a p o s t o l i a + t e r v e y s a p o s t o l i t + t e r v e y s a p u + t e r v e y s a r v o i s t a + t e r v e y s a r v o t + t e r v e y s a s e m a l l e + t e r v e y s a s e m i a + t e r v e y s a s e t u k s e t + t e r v e y s a s i a + t e r v e y s a s i a n t u n t i j a t + t e r v e y s a s i a n t u n t i j o i d e n + t e r v e y s a s i a s t a + t e r v e y s a s i a t + t e r v e y s a s i o i l l e + t e r v e y s a s i o i s s a + t e r v e y s a s i o i s t a + t e r v e y s a s i o i t a + t e r v e y s a s p e k t i e n + t e r v e y s b u d j e t e i s t a + t e r v e y s b u d j e t i l l e + t e r v e y s d i r e k t i i v i s s ä + t e r v e y s d o k u m e n t i n + t e r v e y s e p i d e m i a t + t e r v e y s e p ä s u h t i a + t e r v e y s e r o i h i n + t e r v e y s e r o j a + t e r v e y s e r o j e n + t e r v e y s e r o t + t e r v e y s e t u j a + t e r v e y s e t u u k s i e n + t e r v e y s f o o r u m i a + t e r v e y s h a a s t e e n + t e r v e y s h a a s t e e s e e n + t e r v e y s h a a s t e i s i i n + t e r v e y s h a a s t e i t a + t e r v e y s h a i t a t + t e r v e y s h a i t o i s s a + t e r v e y s h a i t o i s t a + t e r v e y s h a i t t o i h i n + t e r v e y s h a i t t o i n a + t e r v e y s h a i t t o j a + t e r v e y s h a i t t o j e n + t e r v e y s h a l l i n n o n + t e r v e y s h a l l i n n o s s a + t e r v e y s h u o l l o n + t e r v e y s h y s t e r i a n + t e r v e y s h y ö d y i l l ä + t e r v e y s h y ö d y i s t ä + t e r v e y s h y ö d y t + t e r v e y s h y ö t y j ä + t e r v e y s i d e o l o g i t + t e r v e y s i n d i k a a t t o r e i d e n + t e r v e y s i n d i k a a t t o r e i l l e + t e r v e y s i n d i k a a t t o r i t + t e r v e y s i n f r a s t r u k t u u r i e n + t e r v e y s i n f r a s t r u k t u u r i i n + t e r v e y s i n s t i t u u t i n + t e r v e y s j ä r j e s t e l m i e n + t e r v e y s j ä r j e s t e l m i e n s ä + t e r v e y s j ä r j e s t e l m i i n + t e r v e y s j ä r j e s t e l m i s t ä + t e r v e y s j ä r j e s t e l m ä + t e r v e y s j ä r j e s t e l m ä m m e + t e r v e y s j ä r j e s t e l m ä n + t e r v e y s j ä r j e s t e l m ä t + t e r v e y s j ä r j e s t e l m ä ä + t e r v e y s j ä r j e s t ö + t e r v e y s j ä r j e s t ö i l l e + t e r v e y s j ä r j e s t ö l l e + t e r v e y s j ä r j e s t ö l t ä + t e r v e y s j ä r j e s t ö n + t e r v e y s j ä r j e s t ö n k i n + t e r v e y s j ä r j e s t ö s s ä + t e r v e y s j ä r j e s t ö s t ä + t e r v e y s j ä r j e s t ö t + t e r v e y s j ä r j e s t ö ä + t e r v e y s j ä r j e s t ö ö n + t e r v e y s k a r t t a a + t e r v e y s k a s v a t u k s e n + t e r v e y s k a s v a t u s + t e r v e y s k a s v a t u s k a m p a n j o i t a + t e r v e y s k a s v a t u s o h j e l m i e n + t e r v e y s k a s v a t u s s t r a t e g i a a + t e r v e y s k a s v a t u s t a + t e r v e y s k a t a s t r o f i + t e r v e y s k a t a s t r o f i n + t e r v e y s k a u p p a s e k t o r i l l e + t e r v e y s k e s k u k s e e n + t e r v e y s k e s k u k s e n + t e r v e y s k e s k u k s e t + t e r v e y s k e s k u k s i a + t e r v e y s k e s k u k s i i n + t e r v e y s k e s k u k s i s s a + t e r v e y s k e s k u k s i s t a + t e r v e y s k e s k u s + t e r v e y s k e s k u s t a + t e r v e y s k e s k u s t e l u + t e r v e y s k e s k u s t e l u n + t e r v e y s k e s k u s t e n + t e r v e y s k i o s k i + t e r v e y s k o k o u k s e e n + t e r v e y s k o k o u k s e n + t e r v e y s k o k o u k s e s s a + t e r v e y s k o k o u s + t e r v e y s k o m i t e o i l l e + t e r v e y s k o o d e k s i + t e r v e y s k o r t i l l a + t e r v e y s k o r t i n + t e r v e y s k o r t i s t a + t e r v e y s k o r t t i + t e r v e y s k o r t t i a + t e r v e y s k o r t t i n s a + t e r v e y s k r i i s e i h i n + t e r v e y s k r i i s e i s s ä + t e r v e y s k r i i s e i s t ä + t e r v e y s k r i i s e j ä + t e r v e y s k r i i s i + t e r v e y s k r i i s i e n + t e r v e y s k r i i s i i n + t e r v e y s k r i i s i n + t e r v e y s k r i i s i s t ä + t e r v e y s k r i i s i t + t e r v e y s k r i i s i ä + t e r v e y s k r i t e e r e i d e n + t e r v e y s k r i t e e r i t + t e r v e y s k u i l u + t e r v e y s k u l t t u u r i + t e r v e y s k u l u i h i n + t e r v e y s k u l u i s t a + t e r v e y s k u m p p a n u u s + t e r v e y s k u s t a n n u k s i a + t e r v e y s k y s y m y k s e n ä + t e r v e y s k y s y m y k s e t + t e r v e y s k y s y m y k s i i n + t e r v e y s k y s y m y k s i l l ä + t e r v e y s k y s y m y k s i s s ä + t e r v e y s k y s y m y k s i s t ä + t e r v e y s k y s y m y k s i ä + t e r v e y s k y s y m y s + t e r v e y s k y s y m y s t e n + t e r v e y s k y s y m y s t ä + t e r v e y s k ä s i t y k s e n + t e r v e y s k ä s i t y s + t e r v e y s k ä y t ä n t ö j e n + t e r v e y s l a i n s ä ä d ä n t ö ö n + t e r v e y s l a u t a k u n t i e n + t e r v e y s l i i k u n n a n + t e r v e y s l i i k u n t a + t e r v e y s l i s i ä + t e r v e y s l ä h t ö i s e s t ä + t e r v e y s m a l l i s t a + t e r v e y s m a t k a i l i j o i d e n + t e r v e y s m a t k a i l u + t e r v e y s m a t k a i l u a + t e r v e y s m a t k a i l u k e t j u + t e r v e y s m a t k a i l u n + t e r v e y s m a t k a i l u u n + t e r v e y s m e n o i h i n + t e r v e y s m e n o j a + t e r v e y s m e n o j e n + t e r v e y s m e n o j e n s a + t e r v e y s m e n o n s a + t e r v e y s m e r k i n n ä t + t e r v e y s m e r k i n t ä + t e r v e y s m i e t i n n ö s s ä + t e r v e y s m i n i s t e r e i d e n + t e r v e y s m i n i s t e r e i h i n + t e r v e y s m i n i s t e r e i l l e + t e r v e y s m i n i s t e r e i s t ä + t e r v e y s m i n i s t e r e i t ä + t e r v e y s m i n i s t e r i + t e r v e y s m i n i s t e r i e n + t e r v e y s m i n i s t e r i l l e + t e r v e y s m i n i s t e r i l t ä + t e r v e y s m i n i s t e r i n + t e r v e y s m i n i s t e r i n ä + t e r v e y s m i n i s t e r i t + t e r v e y s m i n i s t e r i ä + t e r v e y s m i n i s t e r i ö + t e r v e y s m i n i s t e r i ö i d e n + t e r v e y s m i n i s t e r i ö n + t e r v e y s m i n i s t e r i ö t + t e r v e y s m i n i s t e r i ö ö n + t e r v e y s m ä ä r ä r a h o i s t a + t e r v e y s m ä ä r ä y k s e t + t e r v e y s m ä ä r ä y k s i ä + t e r v e y s m ä ä r ä y s t e n + t e r v e y s n e u v o s t o + t e r v e y s n e u v o s t o s s a + t e r v e y s n o r m e i l l e + t e r v e y s n o r m e i s s a + t e r v e y s n o r m e j a + t e r v e y s n o r m i e n + t e r v e y s n o r m i t + t e r v e y s n ä k ö k o h d a s t a + t e r v e y s n ä k ö k o h d a t + t e r v e y s n ä k ö k o h d i s t a + t e r v e y s n ä k ö k o h t i a + t e r v e y s n ä k ö k o h t i e n + t e r v e y s n ä k ö k o h t i i n + t e r v e y s n ä k ö k u l m a + t e r v e y s n ä k ö k u l m a s t a + t e r v e y s n ä k ö k u l m a t + t e r v e y s o h j e i s s a + t e r v e y s o h j e l m a + t e r v e y s o h j e l m a a + t e r v e y s o h j e l m a k s i + t e r v e y s o h j e l m a l l e + t e r v e y s o h j e l m a n + t e r v e y s o h j e l m a n s a + t e r v e y s o h j e l m a s s a + t e r v e y s o h j e l m a t + t e r v e y s o h j e l m i a + t e r v e y s o h j e l m i e m m e + t e r v e y s o h j e l m i e n + t e r v e y s o h j e l m i i n + t e r v e y s o h j e l m i l l a + t e r v e y s o h j e l m i l l e + t e r v e y s o h j e l m i s s a + t e r v e y s o i k e u k s i a + t e r v e y s o l o i h i n + t e r v e y s o l o j a + t e r v e y s o l o j e n + t e r v e y s o l o s u h t e i s s a + t e r v e y s o m i n a i s u u k s i a + t e r v e y s o m i n a i s u u k s i e n + t e r v e y s o m i n a i s u u k s i s t a + t e r v e y s o n g e l m a + t e r v e y s o n g e l m a a + t e r v e y s o n g e l m a a n + t e r v e y s o n g e l m a k s i + t e r v e y s o n g e l m a n + t e r v e y s o n g e l m a n a + t e r v e y s o n g e l m a n s a + t e r v e y s o n g e l m a s t a + t e r v e y s o n g e l m a s t a a n + t e r v e y s o n g e l m a t + t e r v e y s o n g e l m i a + t e r v e y s o n g e l m i a m m e + t e r v e y s o n g e l m i e n + t e r v e y s o n g e l m i i n + t e r v e y s o n g e l m i i n s a + t e r v e y s o n g e l m i k s i + t e r v e y s o n g e l m i l l e + t e r v e y s o n g e l m i l t a + t e r v e y s o n g e l m i s t a + t e r v e y s o n g e l m i s t a a n + t e r v e y s o s a a m i s e n + t e r v e y s o s a a m i s t a + t e r v e y s p a k e t t i a + t e r v e y s p a l v e l u + t e r v e y s p a l v e l u d i r e k t i i v i + t e r v e y s p a l v e l u d i r e k t i i v i k s i + t e r v e y s p a l v e l u d i r e k t i i v i n + t e r v e y s p a l v e l u i d e n + t e r v e y s p a l v e l u i h i n + t e r v e y s p a l v e l u i l l a + t e r v e y s p a l v e l u i l l e + t e r v e y s p a l v e l u i l l e m m e + t e r v e y s p a l v e l u i s s a + t e r v e y s p a l v e l u i s t a + t e r v e y s p a l v e l u i t a + t e r v e y s p a l v e l u j a + t e r v e y s p a l v e l u j e n + t e r v e y s p a l v e l u j ä r j e s t e l m ä n + t e r v e y s p a l v e l u j ä r j e s t e l m ä s s ä + t e r v e y s p a l v e l u j ä r j e s t e l m ä ä + t e r v e y s p a l v e l u l a k i + t e r v e y s p a l v e l u m m e + t e r v e y s p a l v e l u n + t e r v e y s p a l v e l u n s a + t e r v e y s p a l v e l u t + t e r v e y s p a l v e l u t a r j o n n a s s a + t e r v e y s p a l v e l u u n + t e r v e y s p a l v e l u v a l i k o i m a + t e r v e y s p a l v e l u v a l i k o i m a a n + t e r v e y s p a s s e i l t a + t e r v e y s p e r i a a t t e i d e n + t e r v e y s p o l i i t t i n e n + t e r v e y s p o l i i t t i s e e n + t e r v e y s p o l i i t t i s e s t i + t e r v e y s p o l i i t t i s i a + t e r v e y s p o l i i t t i s i s s a + t e r v e y s p o l i i t t i s i s t a + t e r v e y s p o l i i t t i s t a + t e r v e y s p o l i i t t i s t e n + t e r v e y s p o l i t i i k a l l a + t e r v e y s p o l i t i i k a l l e + t e r v e y s p o l i t i i k a n + t e r v e y s p o l i t i i k a s s a + t e r v e y s p o l i t i i k a s t a + t e r v e y s p o l i t i i k k a + t e r v e y s p o l i t i i k k a a + t e r v e y s p o l i t i i k k a a n + t e r v e y s p o l i t i i k k a a n s a + t e r v e y s p o l i t i i k k a m m e + t e r v e y s p o l i t i i k k a n s a + t e r v e y s p o l i t i i k k o i h i n + t e r v e y s p o l i t i i k k o j a + t e r v e y s p o l i t i i k k o j a a n + t e r v e y s p o l i t i i k k o j e n + t e r v e y s p o r t a a l i + t e r v e y s p o r t a a l i i n + t e r v e y s p o r t a a l i n + t e r v e y s p o r t a a l i s s a + t e r v e y s p r o j e k t e j a + t e r v e y s p u o l e l l a + t e r v e y s p u o l e s t a + t e r v e y s p ä i v ä + t e r v e y s p ä i v ä n + t e r v e y s p ä i v ä n ä + t e r v e y s p ä i v ä s t ä + t e r v e y s p ä i v ä ä + t e r v e y s r a h a s t o + t e r v e y s r a h a s t o a + t e r v e y s r a h a s t o j a + t e r v e y s r a h a s t o l l e + t e r v e y s r a h a s t o n + t e r v e y s r a h a s t o o n + t e r v e y s r a h a s t o s s a + t e r v e y s r a h a s t o s t a + t e r v e y s r a j a + t e r v e y s r a p o r t i s s a + t e r v e y s r a p o r t i t + t e r v e y s r a p o r t t i e n + t e r v e y s r i s k e i h i n + t e r v e y s r i s k e i l l e + t e r v e y s r i s k e i l t ä + t e r v e y s r i s k e i s t ä + t e r v e y s r i s k e i s t ä m m e + t e r v e y s r i s k e j ä + t e r v e y s r i s k i + t e r v e y s r i s k i e n + t e r v e y s r i s k i l l e + t e r v e y s r i s k i l u o k k a a n + t e r v e y s r i s k i m i e l e s s ä + t e r v e y s r i s k i n + t e r v e y s r i s k i s t ä + t e r v e y s r i s k i t + t e r v e y s r i s k i ä + t e r v e y s r u o k a k a u p p o j e n + t e r v e y s r u o k a t e o l l i s u u d e s s a + t e r v e y s s a l k u n + t e r v e y s s e i k a t + t e r v e y s s e i k k o i h i n + t e r v e y s s e k t o r i a + t e r v e y s s e k t o r i l l a + t e r v e y s s e n a a t t o r i + t e r v e y s s i d e + t e r v e y s s t a n d a r d e i s t a + t e r v e y s s t a n d a r d e j a + t e r v e y s s t a n d a r d i e n + t e r v e y s s t a n d a r d i t + t e r v e y s s t r a t e g i a + t e r v e y s s t r a t e g i a a + t e r v e y s s t r a t e g i a a n + t e r v e y s s t r a t e g i a l l a + t e r v e y s s t r a t e g i a l l e + t e r v e y s s t r a t e g i a n + t e r v e y s s t r a t e g i a s s a + t e r v e y s s t r a t e g i a s t a + t e r v e y s s t r a t e g i o i h i n + t e r v e y s s u o j e l u a + t e r v e y s s u o j e l u t o i m e n p i t e i t ä + t e r v e y s s y i l l ä + t e r v e y s s y i s t ä + t e r v e y s s y y t + t e r v e y s s ä ä n n ö i s t ä + t e r v e y s s ä ä n n ö k s i s t ä + t e r v e y s s ä ä n n ö s t e n + t e r v e y s s ä ä n n ö s t ö + t e r v e y s s ä ä n n ö s t ö n + t e r v e y s s ä ä n n ö s t ö s t ä + t e r v e y s s ä ä n n ö s t ö ä + t e r v e y s s ä ä n n ö t + t e r v e y s s ä ä n t ö i h i n + t e r v e y s s ä ä n t ö j ä + t e r v e y s s ä ä t i ö l l e + t e r v e y s t a k e e t + t e r v e y s t a k e i t a + t e r v e y s t a k u i s s a + t e r v e y s t a k u i t a + t e r v e y s t a k u u t a + t e r v e y s t a r k a s t a j a + t e r v e y s t a r k a s t a j i e n + t e r v e y s t a r k a s t u k s e e n + t e r v e y s t a r k a s t u k s e k s i + t e r v e y s t a r k a s t u k s e l l a + t e r v e y s t a r k a s t u k s e n + t e r v e y s t a r k a s t u k s e s s a + t e r v e y s t a r k a s t u k s e s t a + t e r v e y s t a r k a s t u k s e t + t e r v e y s t a r k a s t u k s i a + t e r v e y s t a r k a s t u k s i i n + t e r v e y s t a r k a s t u k s i s s a + t e r v e y s t a r k a s t u k s i s t a + t e r v e y s t a r k a s t u s + t e r v e y s t a r k a s t u s e h d o t u k s i s t a + t e r v e y s t a r k a s t u s p a k e t i n + t e r v e y s t a r k a s t u s p r o s e s s i n + t e r v e y s t a r k a s t u s t a + t e r v e y s t a r k a s t u s t e n + t e r v e y s t a r k a s t u s u u d i s t u k s e s s a + t e r v e y s t a r k k a i l i j a t + t e r v e y s t a r p e i s t a + t e r v e y s t a s o + t e r v e y s t a v o i t e t t a + t e r v e y s t a v o i t t e i d e n + t e r v e y s t a v o i t t e i s s a + t e r v e y s t a v o i t t e i t a + t e r v e y s t e k i j ä t + t e r v e y s t e k i j ö i t ä + t e r v e y s t e k n o l o g i a + t e r v e y s t e k n o l o g i a a n + t e r v e y s t e k n o l o g i a n + t e r v e y s t e k n o l o g i o i d e n + t e r v e y s t i e t e i d e n + t e r v e y s t i e t o + t e r v e y s t i e t o a + t e r v e y s t i e t o i s u u t t a + t e r v e y s t i e t o j a + t e r v e y s t i e t o j e n + t e r v e y s t i e t o j ä r j e s t e l m i e n + t e r v e y s t i e t o j ä r j e s t e l m ä + t e r v e y s t i e t o u t t a + t e r v e y s t i l a n n e + t e r v e y s t i l a n n e t t a + t e r v e y s t i l a n t e e n + t e r v e y s t i l a n t e e s e e n + t e r v e y s t i l a n t e e s t a + t e r v e y s t i l a s t o j e n + t e r v e y s t o d i s t u k s e n + t e r v e y s t o d i s t u s + t e r v e y s t o d i s t u s t e n + t e r v e y s t o i m e n p i t e e t + t e r v e y s t o i m e n p i t e i d e n + t e r v e y s t o i m e t + t e r v e y s t o i m i a + t e r v e y s t o i m i e l i m i l l ä + t e r v e y s t o i m i e n + t e r v e y s t o i m i i n + t e r v e y s t o i m i n t a s u u n n i t e l m a l l a + t e r v e y s t o i m i n t a s u u n n i t e l m a s s a + t e r v e y s t u o t t e i s s a + t e r v e y s t u r i s m i a + t e r v e y s t u r i s m i i n + t e r v e y s t u r i s m i l t a + t e r v e y s t u r v a a + t e r v e y s t u r v a k o m i t e a l l e + t e r v e y s t u r v a l l e + t e r v e y s t u r v a l l i s u u t t a + t e r v e y s t u r v a n + t e r v e y s t u t k i m u k s e e n + t e r v e y s t u t k i m u k s e n + t e r v e y s t u t k i m u k s e s s a + t e r v e y s t u t k i m u k s e s t a + t e r v e y s t u t k i m u k s e t + t e r v e y s t u t k i m u k s i a + t e r v e y s t u t k i m u s + t e r v e y s t u t k i m u s j ä r j e s t e l m ä ä + t e r v e y s t u t k i m u s t a + t e r v e y s t y y n y + t e r v e y s t y ö r y h m ä n + t e r v e y s u h k a + t e r v e y s u h k a a n + t e r v e y s u h k a n + t e r v e y s u h k a s t a + t e r v e y s u h k i a + t e r v e y s u h k i e n + t e r v e y s u h k i i n + t e r v e y s u h k i l t a + t e r v e y s u h k i s t a + t e r v e y s u l o t t u v u u d e n + t e r v e y s u n i o n i s t a + t e r v e y s u u d i s t u s + t e r v e y s u u d i s t u s t e n + t e r v e y s v a a r a + t e r v e y s v a a r a t + t e r v e y s v a a r o i h i n + t e r v e y s v a a r o i l l e + t e r v e y s v a a r o i l t a + t e r v e y s v a a r o i s t a + t e r v e y s v a a r o j a + t e r v e y s v a a r o j e n + t e r v e y s v a a t i m u k s e t + t e r v e y s v a a t i m u k s i a + t e r v e y s v a a t i m u k s i i n + t e r v e y s v a a t i m u k s i s t a + t e r v e y s v a a t i m u s t e m m e + t e r v e y s v a a t i m u s t e n + t e r v e y s v a i k u t u k s e t + t e r v e y s v a i k u t u k s i a + t e r v e y s v a i k u t u k s i e n + t e r v e y s v a i k u t u k s i i n + t e r v e y s v a i k u t u k s i l l e + t e r v e y s v a i k u t u k s i n e e n + t e r v e y s v a i k u t u k s i s t a + t e r v e y s v a i k u t u s + t e r v e y s v a i k u t u s t a + t e r v e y s v a i k u t u s t e n + t e r v e y s v a k u u t u k s e s t a + t e r v e y s v a k u u t u s t e n + t e r v e y s v a k u u t u s y h t i ö i l l e + t e r v e y s v a l i n t o j e n + t e r v e y s v a l i o k u n n a n + t e r v e y s v a l i o k u n t a + t e r v e y s v a l i s t u k s e e n + t e r v e y s v a l i s t u k s e s s a + t e r v e y s v a l i s t u s + t e r v e y s v a l i s t u s t a + t e r v e y s v a l v o n n a l l e + t e r v e y s v a l v o n t a + t e r v e y s v a l v o n t a a + t e r v e y s v a r o i t u k s e t + t e r v e y s v a r o i t u k s i a + t e r v e y s v a r o i t u k s i e n + t e r v e y s v a r o i t u s + t e r v e y s v a r o i t u s t e n + t e r v e y s v a r o t o i m i a + t e r v e y s v a u r i o i d e n + t e r v e y s v e r k o s t o + t e r v e y s v i e s t i n t ä + t e r v e y s v i r a n o m a i n e n + t e r v e y s v i r a n o m a i s e l l a + t e r v e y s v i r a n o m a i s e n + t e r v e y s v i r a n o m a i s e t + t e r v e y s v i r a n o m a i s e t k i n + t e r v e y s v i r a n o m a i s i a + t e r v e y s v i r a n o m a i s i l l a + t e r v e y s v i r a n o m a i s i l l e + t e r v e y s v i r a n o m a i s t e n + t e r v e y s v ä i t e + t e r v e y s v ä i t e t t ä + t e r v e y s v ä i t t e e t + t e r v e y s v ä i t t e i d e n + t e r v e y s v ä i t t e i s t ä + t e r v e y s v ä i t t e i t ä + t e r v e y s v ä i t t ä m i e n + t e r v e y s v ä i t t ä m i i n + t e r v e y s v ä i t t ä m i l l ä + t e r v e y s v ä i t t ä m i s t ä + t e r v e y s v ä i t t ä m i ä + t e r v e y s v ä i t t ä m ä + t e r v e y s v ä i t t ä m ä n + t e r v e y s v ä i t t ä m ä s t ä + t e r v e y s v ä i t t ä m ä t + t e r v e y s v ä i t t ä m ä ä + t e r v e y t e e m m e + t e r v e y t e e n + t e r v e y t e e n s ä + t e r v e y t e n s ä + t e r v e y t t ä + t e r v e y t t ä ä n + t e r ä k a l a + t e r ä k s e n + t e r ä k s e n t u o n t i t u l l i t + t e r ä k s e n t u o t t a j a + t e r ä s a j o n e u v o i h i n + t e r ä s a l a a + t e r ä s a l a l l a + t e r ä s a l a l l e + t e r ä s a l a n + t e r ä s a s i a s s a + t e r ä s b e t o n i + t e r ä s b e t o n i a + t e r ä s b e t o n i n + t e r ä s k a n n u s + t e r ä s k a t t o + t e r ä s k a u p o i s t a + t e r ä s k e r t o m u k s e n i + t e r ä s k e s k u k s e n + t e r ä s k e s k u k s i a + t e r ä s k i i s t a + t e r ä s k i i s t a a + t e r ä s k i i s t a a n + t e r ä s k i i s t a n + t e r ä s k i l o a + t e r ä s k r i i s i + t e r ä s k r i i s i i n + t e r ä s k r i i s i s t ä + t e r ä s k u k a t + t e r ä s k u s t a n n u k s e t + t e r ä s k y n n e t + t e r ä s k y s y m y k s e s t ä + t e r ä s l e u k a i s e t + t e r ä s l u o l a t + t e r ä s m a r k k i n a t + t e r ä s m a r k k i n o i l l e + t e r ä s m a r k k i n o i t a + t e r ä s m i e h e k s i + t e r ä s m o n a r k k i + t e r ä s m y r s k y s s ä + t e r ä s n a i s e n a + t e r ä s o n g e l m a + t e r ä s p a n s s a r i i n + t e r ä s p a r a t i i s i m o n a r k k i + t e r ä s p i i r r o s + t e r ä s p o l i t i i k a n + t e r ä s p r o t e k t i o n i s m i s t a + t e r ä s r a h a s t o + t e r ä s r o m u a + t e r ä s s o d a s t a + t e r ä s s o p i m u k s e n + t e r ä s s o p i m u s + t e r ä s s o p i m u s t a + t e r ä s s u o j a + t e r ä s s ä ä t i ö t ä + t e r ä s t e h d a s + t e r ä s t e h d a s t a + t e r ä s t e h t a a s s a + t e r ä s t e h t a i d e n + t e r ä s t e h t a i l l a + t e r ä s t e h t a i l l e + t e r ä s t e h t a i s i i n + t e r ä s t e h t a i s s a + t e r ä s t e h t a i t a + t e r ä s t e o l l i s u u d e l l a + t e r ä s t e o l l i s u u d e l l e + t e r ä s t e o l l i s u u d e l t a + t e r ä s t e o l l i s u u d e n + t e r ä s t e o l l i s u u d e s s a + t e r ä s t e o l l i s u u d e s t a + t e r ä s t e o l l i s u u d e t + t e r ä s t e o l l i s u u s + t e r ä s t e o l l i s u u s a l a l l a + t e r ä s t e o l l i s u u s y r i t y s + t e r ä s t e o l l i s u u t e e n + t e r ä s t e o l l i s u u t e m m e + t e r ä s t e o l l i s u u t e n s a + t e r ä s t e o l l i s u u t t a + t e r ä s t e o l l i s u u t t a a n + t e r ä s t e o l l i s u u t t a m m e + t e r ä s t u k i s ä ä n n ö t + t e r ä s t u k i s ä ä n t ö j e n + t e r ä s t u k i s ä ä n t ö j ä + t e r ä s t u l l i t + t e r ä s t u o t a n n o n + t e r ä s t u o t a n n o s t a + t e r ä s t u o t a n t o + t e r ä s t u o t a n t o a + t e r ä s t u o t a n t o n s a + t e r ä s t u o t t a j i e n + t e r ä s t u o t t e e t + t e r ä s t u o t t e i d e n + t e r ä s t u o t t e i l l e + t e r ä s t u o t t e i s i i n + t e r ä s t u o t t e i s t a + t e r ä s t u o t t e i t a + t e r ä s t u t k i m u s + t e r ä s t u t k i m u s r a h a s t o + t e r ä s t u t k i m u s r a h a s t o a + t e r ä s t y ö l ä i s e t + t e r ä s t y ö l ä i s t e n + t e r ä s t y ö n t e k i j ö i t ä + t e r ä s v i e n n i n + t e r ä s v i e n t i ä m m e + t e r ä s v i l l a + t e r ä s y h d i s t e i s t ä + t e r ä s y h t e i s ö + t e r ä s y h t e i s ö i s s ä + t e r ä s y h t e i s ö l l ä + t e r ä s y h t e i s ö n + t e r ä s y h t e i s ö n s ä + t e r ä s y h t e i s ö s t ä + t e r ä s y h t e i s ö ä + t e r ä s y h t e i s ö ö n + t e r ä s y h t i ö + t e r ä s y h t i ö i d e n + t e r ä s y h t i ö i s s ä + t e r ä s y h t i ö i t ä ä n + t e r ä s y h t i ö l l e + t e r ä s y h t i ö n + t e r ä s y h t i ö t + t e r ä s y h t i ö t ä + t e r ä s y r i t y s + t e r ä v ä j ä r k i s t ä + t e r ä v ä m m i n + t e r ä v ä m p i + t e r ä v ä m p i ä + t e r ä v ä n ä k ö i s i k s i + t e r ä v ä n ä k ö i s i ä + t e r ä v ä n ä k ö i s y y d e s t ä + t e r ä v ä n ä k ö i s y y d e s t ä n n e + t e r ä v ä n ä k ö i s y y d e s t ä ä n + t e r ä v ä n ä k ö i s y y t t ä + t e r ä v ä p i i r t o t e l e v i s i o + t e r ä v ä ä + t e r ä v ö i t t ä ä k s e n i + t e s l a k ä ä m i + t e s t a a m i n e n + t e s t a a m i s e k s i + t e s t a a m i s m u o t o j a + t e s t a i s i m m e + t e s t a m e n t i n + t e s t a m e n t i s s a + t e s t a m e n t i s t a + t e s t a n n u t + t e s t a t a + t e s t a t a a n + t e s t a t a a n k i n + t e s t a t t a v a + t e s t a t t a v i k s i + t e s t a t t u j e n + t e s t a u s e d e l l y t y k s e t + t e s t a u s e l i n t e n + t e s t a u s j ä r j e s t e l m ä + t e s t a u s j ä r j e s t e l m ä n + t e s t a u s j ä r j e s t e l m ä ä n + t e s t a u s k e s k u k s i a + t e s t a u s k e s k u s + t e s t a u s k i e l l o s t a + t e s t a u s k i e l t o + t e s t a u s k o h t e i n a + t e s t a u s k r i t e e r e i s t ä + t e s t a u s k r i t e e r e i t ä + t e s t a u s k r i t e e r e j ä + t e s t a u s k u s t a n n u k s e n + t e s t a u s k u s t a n n u s t e n + t e s t a u s m a t e r i a a l i a + t e s t a u s m e n e t e l m i e n + t e s t a u s m e n e t e l m i s s ä + t e s t a u s m e n e t e l m i s t ä + t e s t a u s m e n e t e l m i ä + t e s t a u s m e n e t e l m ä + t e s t a u s m e n e t e l m ä l l e + t e s t a u s m e n e t e l m ä l l ä + t e s t a u s m e n e t e l m ä n + t e s t a u s m e n e t e l m ä s t ä + t e s t a u s m e n e t e l m ä t + t e s t a u s m e n e t e l m ä ä + t e s t a u s m e n e t t e l y n + t e s t a u s m e n e t t e l y ä + t e s t a u s m e r k i n n ä t + t e s t a u s o h j e i t a + t e s t a u s o h j e l m a + t e s t a u s o h j e l m i a + t e s t a u s p a i k k a + t e s t a u s p e r u s t e t t a + t e s t a u s s t r a t e g i o i d e n + t e s t a u s s t r a t e g i o i s t a + t e s t a u s s u u n n i t e l m i i n + t e s t a u s t a + t e s t a u s t a p o j a + t e s t a u s t e k n i i k o i s t a + t e s t a u s t y ö t ä + t e s t a u s v a a t i m u k s e t + t e s t a u s v a a t i m u k s i a + t e s t a u s v a a t i m u k s i i n + t e s t a u s v a a t i m u s t e n + t e s t a u s v a i h e e s e e n + t e s t a u s v a i h e e s s a + t e s t a u s v a l m i u d e t + t e s t a u s v e r k o s t o + t e s t a u s v e r k o s t o a + t e s t e i h i n + t e s t e i l l ä + t e s t e i s s ä + t e s t e i s t ä + t e s t e j ä + t e s t i a i k a + t e s t i a m m u n n a t + t e s t i e n + t e s t i j a k s o a + t e s t i k e s k u s t e n + t e s t i k i e l l o l l a + t e s t i k i e r r o k s e s t a + t e s t i k r i t e e r e i d e n + t e s t i k r i t e e r e i l l e + t e s t i k u l j e t t a j a + t e s t i k u v a + t e s t i k y n n y k s i ä + t e s t i k ä y t ä n n ö i l l e + t e s t i l a b o r a t o r i o i t a + t e s t i l a b o r a t o r i o o n + t e s t i l a b o r a t o r i o s s a + t e s t i l a b o r a t o r i o t a + t e s t i l e n n o i s t a + t e s t i l u o k k i a + t e s t i m a k s u j a + t e s t i m e n e t e l m i e n + t e s t i m e n e t e l m i i n + t e s t i m e n e t e l m i s t ä + t e s t i m e n e t e l m i ä + t e s t i m e n e t e l m ä + t e s t i m e n e t e l m ä n + t e s t i m e n e t e l m ä t + t e s t i m e n e t e l m ä ä + t e s t i m e n e t t e l y n + t e s t i m e n e t t e l y s t ä + t e s t i m e n e t t e l y t + t e s t i m e n e t t e l y y n + t e s t i n + t e s t i n o r m i t + t e s t i n ä + t e s t i o h j e l m i a + t e s t i p a n e e l i + t e s t i p e n k i s s ä + t e s t i p o r a u s r e i k ä h a k e m u k s i i n + t e s t i s s ä + t e s t i s t a n d a r d e i s s a + t e s t i s t a n d a r d i n + t e s t i s t r a t e g i a + t e s t i s t r a t e g i o i s t a + t e s t i s t r a t e g i o i t a + t e s t i s y k l i + t e s t i s y k l i e n + t e s t i s y k l i i n + t e s t i s y k l i n + t e s t i s y k l i s s ä + t e s t i s y k l i ä + t e s t i t + t e s t i t a p a u s + t e s t i t i e t o j a + t e s t i t i e t o j e n + t e s t i t u l o k s e t + t e s t i t u l o k s i a + t e s t i t u l o k s i e n + t e s t i t u l o k s i s t a + t e s t i t u l o s t e n + t e s t i v a i h e + t e s t i v e t o i n e n + t e s t i v ä l i n e i d e n + t e s t i ä + t e t r a e d r i l u k u + t e t r a e d r i l u k u o t a k s u m a + t e t r a e t y y l i o r t o s i l i k a a t t i + t e t r a e t y y l i p y r o f o s f a a t t i + t e t r a m e t y y l i a m m o n i u m h y d r o k s i d i + t e t r a s y k l i i n i t + t e u r a a k s i + t e u r a a l l e + t e u r a s e l ä i m e t + t e u r a s e l ä i m i i n + t e u r a s e l ä i m i l l e + t e u r a s e l ä i m i s s ä + t e u r a s e l ä i m i s t ä + t e u r a s e l ä i m i ä + t e u r a s e l ä i n k u l j e t u k s e t + t e u r a s e l ä i n t e n + t e u r a s h e v o s t e n + t e u r a s j ä t e t t ä + t e u r a s j ä t t e i d e n + t e u r a s j ä t t e i l l ä + t e u r a s j ä t t e i s t ä + t e u r a s j ä t t e i t ä + t e u r a s k a n o j e n + t e u r a s k a r j a n + t e u r a s k u l j e t u k s e t + t e u r a s k u l j e t u k s i a + t e u r a s k u l j e t u s t e n + t e u r a s n a u t o j e n + t e u r a s p a i n o + t e u r a s p a i n o n + t e u r a s p a l k k i o i l l e + t e u r a s s i a l l e + t e u r a s s i k o i h i n + t e u r a s s i k o j a + t e u r a s s i o i l l e + t e u r a s t a m a a n + t e u r a s t a m o d i r e k t i i v i + t e u r a s t a m o i d e n + t e u r a s t a m o i s s a + t e u r a s t a m o i s t a + t e u r a s t a m o i t a + t e u r a s t a m o j e n + t e u r a s t a m o j ä t t e i d e n + t e u r a s t a m o j ä t t e i s t ä + t e u r a s t a m o l i e t t e e s e e n + t e u r a s t a m o l l e + t e u r a s t a m o s s a + t e u r a s t a m o t o i m i n n a n + t e u r a s t a m o v a l m i u k s i e n + t e u r a s t e t a a n + t e u r a s t e t t a v a + t e u r a s t e t t a v a t + t e u r a s t e t t a v i k s i + t e u r a s t e t t u i n a + t e u r a s t e t u t + t e u r a s t u k s e s t a + t e u r a s t u k s e t + t e u r a s t u s h y g i e n i a a + t e u r a s t u s i k ä ä n + t e u r a s t u s i ä n + t e u r a s t u s j ä t t e i t ä + t e u r a s t u s k a m p a n j a a + t e u r a s t u s k a p a s i t e e t i n + t e u r a s t u s k a p a s i t e e t t i + t e u r a s t u s k r i t e e r e i h i n + t e u r a s t u s k u l u i h i n + t e u r a s t u s k ä y t ä n t ö j ä + t e u r a s t u s l i i k k e i d e n + t e u r a s t u s m e n e t e l m i ä + t e u r a s t u s o h j e l m a + t e u r a s t u s o h j e l m a a + t e u r a s t u s o h j e l m a n + t e u r a s t u s o h j e l m a s t a + t e u r a s t u s o l o j a + t e u r a s t u s p a i k a n + t e u r a s t u s p a i n o n + t e u r a s t u s p a l k k i o + t e u r a s t u s p a l k k i o i d e n + t e u r a s t u s p a l k k i o n + t e u r a s t u s p a l k k i o t a + t e u r a s t u s p o l i t i i k a l l a + t e u r a s t u s p o l i t i i k a n + t e u r a s t u s p o l i t i i k k a a + t e u r a s t u s p o l i t i i k k a a n + t e u r a s t u s p r o s e s s i s s a + t e u r a s t u s p ä i v ä m ä ä r ä + t e u r a s t u s p ä i v ä m ä ä r ä ä n + t e u r a s t u s s u u n n i t e l m a n + t e u r a s t u s s ä ä n n ö s t e n + t e u r a s t u s s ä ä n n ö t + t e u r a s t u s t a + t e u r a s t u s t a v a n + t e u r a s t u s t i l a s t o t + t e u r a s t u s t o i m e n p i t e e t + t e u r a s t u s t o i m i n t a t a v a s t a + t e u r a s t u s y l ä r a j a s t a + t e u r a s v a s i k k a + t e u r a s v a s i k o i s t a + t h a i h i e r o n t a + t h a i k e i t t i ö + t h a i m a a h a n + t h a i m a a n + t h a i m a a n p y s t y k o r v a + t h a i m a a s s a + t h a i m a a t a + t h a i n y r k k e i l y + t h a i t + t h o m a s i a + t h o m a s i n + t i a i s k e r t t u l i + t i a i s m a r j a s t a j a + t i a i s t a n g a r a + t i e a j o n e u v o j e n + t i e a l a n + t i e d e a i n e i t a + t i e d e a j a t t e l u s s a + t i e d e a k a t e m i a + t i e d e a k a t e m i a n + t i e d e a k a t e m i o i l t a + t i e d e a l a n + t i e d e a l u e + t i e d e a s i o i s s a + t i e d e d i p l o m a t i a + t i e d e h a n k k e i t a + t i e d e i n s t i t u u t i t + t i e d e i n s t i t u u t t i + t i e d e j u l k a i s u + t i e d e j u l k a i s u s s a + t i e d e j ä r j e s t e l m ä n + t i e d e j ä r j e s t e l m ä n s ä + t i e d e k a r t e l l i e n + t i e d e k e s k u k s e n + t i e d e k e s k u s + t i e d e k e s k u s t e l u i h i n + t i e d e k e s k u s t e n + t i e d e k o m i t e a + t i e d e k o m i t e a a + t i e d e k o m i t e a a n + t i e d e k o m i t e a j ä r j e s t e l m ä ä n + t i e d e k o m i t e a l l e + t i e d e k o m i t e a l t a + t i e d e k o m i t e a n + t i e d e k o m i t e a s s a + t i e d e k o m i t e a s t a + t i e d e k o m i t e a t + t i e d e k o m i t e o i d e n + t i e d e k o m i t e o i l l e + t i e d e k o m i t e o i s s a + t i e d e k o m i t e o i t a + t i e d e k o n g r e s s i n + t i e d e k o u l u t u k s e e n + t i e d e k r i t i i k k i + t i e d e k u n n a n + t i e d e k u n n i s s a + t i e d e k y s y m y k s i i n + t i e d e l a i t o k s i a + t i e d e l a i t o k s i i n + t i e d e l a i t o s + t i e d e l a i t o s t e n + t i e d e m a a + t i e d e m a a i l m a + t i e d e m a a i l m a a + t i e d e m a a i l m a a n + t i e d e m a a i l m a l l e + t i e d e m a a i l m a n + t i e d e m a a i l m a s s a + t i e d e m a a i l m a s t a + t i e d e m i e h e n + t i e d e m i e h e t + t i e d e m i e h i s t ä + t i e d e m i e h i ä + t i e d e m i e s r y h m i e n + t i e d e m i e s r y h m i ä + t i e d e m i e s r y h m ä + t i e d e m i e s t e n + t i e d e m i e s t e n s ä + t i e d e m i e s v a i h t o a + t i e d e m i n i s t e r i ö l l ä + t i e d e m u s e o + t i e d e n a i s t e n + t i e d e n e u v o s t o + t i e d e o h j e l m i e n + t i e d e o h j e l m i s t a + t i e d e o p i n t o i h i n + t i e d e o r g a n i s a a t i o i l l e + t i e d e p a l k i n t o + t i e d e p a l v e l u i t a + t i e d e p e r i n n e + t i e d e p e r i n t ö + t i e d e p i i r e i s s ä + t i e d e p i i r e i s t ä + t i e d e p i i r i t + t i e d e p o l i t i i k a n + t i e d e p o l i t i i k a s t a + t i e d e p o l i t i i k k a + t i e d e p o l i t i i k k a m m e + t i e d e p o l i t i i k k a n s a + t i e d e p u i s t o + t i e d e p u i s t o j e n + t i e d e s e u r a + t i e d e s ä ä t i ö + t i e d e s ä ä t i ö s t ä + t i e d e t a u s t a + t i e d e t e o l l i s u u d e n + t i e d e t t i i n + t i e d e t t y + t i e d e t t y i h i n + t i e d e t t ä + t i e d e t t ä i s i i n + t i e d e t y t + t i e d e t ä + t i e d e t ä ä n + t i e d e u r a a + t i e d e u r a l l e + t i e d e v a l i o k u n t a a + t i e d e v e r k o s t o i h i n + t i e d e v i e s t i n t ä + t i e d e y h t e i s t y ö + t i e d e y h t e i s t y ö n + t i e d e y h t e i s t y ö t ä + t i e d e y h t e i s ö + t i e d e y h t e i s ö i h i n + t i e d e y h t e i s ö j e n + t i e d e y h t e i s ö j ä + t i e d e y h t e i s ö l l e + t i e d e y h t e i s ö l l ä + t i e d e y h t e i s ö m m e + t i e d e y h t e i s ö n + t i e d e y h t e i s ö s s ä + t i e d e y h t e i s ö t + t i e d e y h t e i s ö ä + t i e d e y h t e i s ö ö n + t i e d e y m p ä r i s t ö s s ä k i n + t i e d o i l l a + t i e d o i l l e + t i e d o i n + t i e d o i s s a + t i e d o i s t a + t i e d o i s t a n n e + t i e d o k s e n n e + t i e d o k s i + t i e d o k s i a n t o a + t i e d o l l a + t i e d o l l i s e t + t i e d o n + t i e d o n a n n o i s s a + t i e d o n a n n o i s t a + t i e d o n a n n o l l a + t i e d o n a n n o l l a a n + t i e d o n a n n o l l e + t i e d o n a n n o n + t i e d o n a n n o s s a + t i e d o n a n n o s s a a n + t i e d o n a n n o s t a + t i e d o n a n n o t + t i e d o n a n t a j i e n + t i e d o n a n t a j i l l e + t i e d o n a n t a m i s v e l v o i t t e i d e n + t i e d o n a n t o + t i e d o n a n t o a + t i e d o n a n t o a s i o i s t a + t i e d o n a n t o e h d o t u k s e n + t i e d o n a n t o i h i n + t i e d o n a n t o j a + t i e d o n a n t o j ä r j e s t e l m ä t + t i e d o n a n t o l u o n n o k s e n + t i e d o n a n t o l u o n n o k s e s s a + t i e d o n a n t o l u o n n o k s e s t a + t i e d o n a n t o l u o n n o s t a + t i e d o n a n t o l u o n n o s t e n + t i e d o n a n t o m e n e t t e l y n + t i e d o n a n t o n s a + t i e d o n a n t o o n + t i e d o n a n t o p a k e t i n + t i e d o n a n t o p a k e t t i + t i e d o n a n t o v a a t i m u k s e t + t i e d o n a n t o v a a t i m u k s i a + t i e d o n a n t o v a a t i m u k s i a a n + t i e d o n a n t o v a a t i m u k s i e n + t i e d o n a n t o v a a t i m u k s i i n + t i e d o n a n t o v a a t i m u s t a + t i e d o n a n t o v e l v o i t t e e n + t i e d o n a n t o v e l v o i t t e e t + t i e d o n a n t o v e l v o i t t e i t a + t i e d o n a n t o v e l v o l l i s e t + t i e d o n h a k u + t i e d o n h a k u a + t i e d o n h a k u m a t k a l l a + t i e d o n h a l l i n n a s t a + t i e d o n h a l l i n t a + t i e d o n h a l l i n t a a + t i e d o n h a l l i n t a a n s a + t i e d o n h a l l i n t a j ä r j e s t e l m ä + t i e d o n h a l l i n t a j ä r j e s t e l m ä n + t i e d o n h a l l i n t a j ä r j e s t e l m ä ä + t i e d o n h a n k i n n a n + t i e d o n h a n k i n n a s s a + t i e d o n h a n k i n t a a + t i e d o n h a n k i n t a a n + t i e d o n h a n k i n t a k e i n o j a + t i e d o n h a n k i n t a m a t k a a + t i e d o n h a n k i n t a m a t k a l l a + t i e d o n h a n k i n t a m a t k a n + t i e d o n h a n k i n t a m a t k a s t a + t i e d o n h a n k i n t a m a t k o j e n + t i e d o n h a n k i n t a t e h t ä v ä ä + t i e d o n h a n k i n t a t u t k i m u s + t i e d o n h a n k i n t a v a l t u u s k u n t a + t i e d o n h a u n + t i e d o n i n t r e s s i + t i e d o n j a k a m i s a l u e + t i e d o n j a k a m i s e n + t i e d o n j a k a m i s t a + t i e d o n j a k e l u + t i e d o n j a k e l u k a n a v i a + t i e d o n j a k o a + t i e d o n j a k o j ä r j e s t e l m ä n + t i e d o n j a k o j ä r j e s t e l y j e n + t i e d o n j a k o o n + t i e d o n j a n o s t a a n + t i e d o n j y v i s t ä + t i e d o n k e r u u + t i e d o n k e r u u d e l e g a a t i o n + t i e d o n k e r u u h a n k k e e n + t i e d o n k e r u u j ä r j e s t e l m ä + t i e d o n k e r u u j ä r j e s t e l m ä n + t i e d o n k e r u u j ä r j e s t e l m ä t + t i e d o n k e r u u j ä r j e s t e l m ä ä + t i e d o n k e r u u k o m e n n u s + t i e d o n k e r u u k o m i s s i o n + t i e d o n k e r u u k u s t a n n u k s e t + t i e d o n k e r u u k y s y m y s + t i e d o n k e r u u l l e + t i e d o n k e r u u m a t k a + t i e d o n k e r u u m a t k a a + t i e d o n k e r u u m a t k a l l a + t i e d o n k e r u u m a t k a l l e + t i e d o n k e r u u m a t k a l t a + t i e d o n k e r u u m a t k a n + t i e d o n k e r u u m a t k a s t a + t i e d o n k e r u u m a t k a t + t i e d o n k e r u u m e k a n i s m i + t i e d o n k e r u u m e n e t e l m i e n + t i e d o n k e r u u m e n e t e l m i i n + t i e d o n k e r u u m e n e t e l m i ä + t i e d o n k e r u u m e n e t e l m ä t + t i e d o n k e r u u n + t i e d o n k e r u u n h a n k k e e n + t i e d o n k e r u u n k i n + t i e d o n k e r u u o h j e l m a n + t i e d o n k e r u u o h j e l m i a + t i e d o n k e r u u p o n n i s t e l u i h i n + t i e d o n k e r u u p r o s e s s i a + t i e d o n k e r u u s e e n + t i e d o n k e r u u s t a n d a r d i t + t i e d o n k e r u u t a + t i e d o n k e r u u t a a n + t i e d o n k e r u u t o i m i a + t i e d o n k e r u u v a l m i u k s i a + t i e d o n k e r u u v a l t u u s k u n n a n + t i e d o n k e r u u v a l t u u s k u n n a s t a + t i e d o n k e r u u v a l t u u s k u n t a + t i e d o n k e r u u v i m m a + t i e d o n k e r ä y s m e n e t e l m i ä + t i e d o n k e r ä ä m i s v ä l i n e + t i e d o n k u l k u + t i e d o n k u l k u a + t i e d o n k u l k u u n + t i e d o n k u l u n + t i e d o n k u l u s t a + t i e d o n k ä s i t t e l y k e s k u s + t i e d o n k ä s i t t e l y v a l m i u k s i e n s a + t i e d o n l e v i t y k s e l l e + t i e d o n l e v i t y s k o k e i l u t + t i e d o n l e v i t y s t ä + t i e d o n l e v i t y s v e r k o s t o l l a + t i e d o n l o u h i n n a n + t i e d o n l o u h i n n a s t a + t i e d o n l o u h i n t a + t i e d o n l o u h i n t a a n + t i e d o n l o u h i n t a t e k n i i k k a a n + t i e d o n l ä h d e + t i e d o n l ä h t e e l t ä + t i e d o n l ä h t e e n + t i e d o n l ä h t e e n ä + t i e d o n l ä h t e e s t ä + t i e d o n l ä h t e i d e n + t i e d o n l ä h t e i s i i n + t i e d o n l ä h t e i t ä + t i e d o n m u r u s i a + t i e d o n m u r u s i i n + t i e d o n p i m i t y s k a m p a n j o i t a + t i e d o n p u u t e + t i e d o n p u u t e t t a + t i e d o n p u u t t e e m m e + t i e d o n p u u t t e e n + t i e d o n p u u t t e e s e e n + t i e d o n p u u t t e e s t a + t i e d o n p y y n t ö i h i n + t i e d o n r a k e n t a m i n e n + t i e d o n r i k a s t u k s e s t a + t i e d o n s a a n n i l l e + t i e d o n s a a n n i n + t i e d o n s a a n n i s t a + t i e d o n s a a n t i + t i e d o n s a a n t i a + t i e d o n s a a n t i a j a n k o h t a a n + t i e d o n s a a n t i i n + t i e d o n s a a n t i m a h d o l l i s u u d e t + t i e d o n s a a n t i m a h d o l l i s u u k s i a + t i e d o n s a a n t i m a h d o l l i s u u k s i e n + t i e d o n s a a n t i m a h d o l l i s u u k s i s t a + t i e d o n s a a n t i m a h d o l l i s u u s + t i e d o n s a a n t i m m e + t i e d o n s a a n t i n s a + t i e d o n s a a n t i o i k e u d e l l e + t i e d o n s a a n t i o i k e u d e n + t i e d o n s a a n t i o i k e u d e s t a + t i e d o n s a a n t i o i k e u d e t + t i e d o n s a a n t i o i k e u s + t i e d o n s a a n t i o i k e u t t a + t i e d o n s a a n t i p y y n t ö + t i e d o n s a a n t i p y y n t ö i h i n + t i e d o n s a a n t i p y y n t ö j ä + t i e d o n s a a n t i p y y n t ö ö n + t i e d o n s a a n t i s ä ä n n ö t + t i e d o n s a a n t i v a i k e u d e t + t i e d o n s a a n t i v a p a u s + t i e d o n s a a n t i v e r k k o + t i e d o n s a a n t i y h t e y k s i ä ä n + t i e d o n s i e p p a u k s e t + t i e d o n s i e p p a u s + t i e d o n s i e p p a u s m a h d o l l i s u u k s i a + t i e d o n s i i r r o l l e + t i e d o n s i i r r o n + t i e d o n s i i r r o s t a + t i e d o n s i i r t o + t i e d o n s i i r t o a + t i e d o n s i i r t o j e n + t i e d o n s i i r t o j ä r j e s t e l m i i n + t i e d o n s i i r t o j ä r j e s t e l m ä + t i e d o n s i i r t o j ä r j e s t e l m ä n + t i e d o n s i i r t o j ä r j e s t e l m ä s s ä + t i e d o n s i i r t o k a p a s i t e e t i s t a + t i e d o n s i i r t o k a p a s i t e e t t i + t i e d o n s i i r t o k r i t e e r e i s t ä + t i e d o n s i i r t o m a h d o l l i s u u d e t + t i e d o n s i i r t o m e n e t e l m ä t + t i e d o n s i i r t o m e n e t t e l y i s t ä + t i e d o n s i i r t o n o p e u s + t i e d o n s i i r t o o n + t i e d o n s i i r t o p a l v e l u j e n + t i e d o n s i i r t o p r o t o k o l l a n + t i e d o n s i i r t o p y y n n ö t + t i e d o n s i i r t o t a p o i h i n + t i e d o n s i i r t o t a p o j e n + t i e d o n s i i r t o t e k n i i k k a + t i e d o n s o s i o l o g i a + t i e d o n t a l l e n n u s v a l m i u k s i i n + t i e d o n t a l l e n n u s v ä l i n e + t i e d o n t a r j o n n a s t a + t i e d o n t a r p e e s e e n + t i e d o n t a r p e e s t a + t i e d o n t a r p e i s s a a n + t i e d o n v a i h d o l l a + t i e d o n v a i h d o l l e + t i e d o n v a i h d o n + t i e d o n v a i h d o s s a + t i e d o n v a i h d o s t a + t i e d o n v a i h t o + t i e d o n v a i h t o a + t i e d o n v a i h t o j ä r j e s t e l m i e m m e + t i e d o n v a i h t o j ä r j e s t e l m i e n + t i e d o n v a i h t o j ä r j e s t e l m ä + t i e d o n v a i h t o j ä r j e s t e l m ä n + t i e d o n v a i h t o j ä r j e s t e l m ä n ä + t i e d o n v a i h t o j ä r j e s t e l m ä t + t i e d o n v a i h t o j ä r j e s t e l m ä ä + t i e d o n v a i h t o m e k a n i s m i + t i e d o n v a i h t o m e n e t e l m i e n + t i e d o n v a i h t o m e n e t t e l y j ä + t i e d o n v a i h t o o n + t i e d o n v a i h t o s t a n d a r d i n s a + t i e d o n v a i h t o t o i m i s t o n + t i e d o n v a i h t o v e l v o i t t e e n + t i e d o n v a i h t o v e r k k o j a + t i e d o n v a i h t o v e r k o s t o + t i e d o n v a i h t o v e r k o s t o j a + t i e d o n v a i h t o v e r k o s t o n + t i e d o n v a p a u d e n + t i e d o n v a p a u s + t i e d o n v a p a u s l a i n s ä ä d ä n n ö s t ä ä n + t i e d o n v a p a u t e e n + t i e d o n v a p a u t t a + t i e d o n v ä l i t t ä j i l l e + t i e d o n v ä l i t t ä j i s t ä + t i e d o n v ä l i t t ä j ä n ä + t i e d o n v ä l i t y k s e e n + t i e d o n v ä l i t y k s e n + t i e d o n v ä l i t y k s e s s ä + t i e d o n v ä l i t y k s e s t ä + t i e d o n v ä l i t y s + t i e d o n v ä l i t y s a l a l l a + t i e d o n v ä l i t y s a l a s t a + t i e d o n v ä l i t y s a s e m a + t i e d o n v ä l i t y s j ä r j e s t e l m i e n + t i e d o n v ä l i t y s j ä r j e s t e l m i s s ä + t i e d o n v ä l i t y s j ä r j e s t e l m ä + t i e d o n v ä l i t y s j ä r j e s t e l m ä n + t i e d o n v ä l i t y s j ä r j e s t e l m ä t + t i e d o n v ä l i t y s j ä r j e s t e l m ä ä + t i e d o n v ä l i t y s k a n a v a t + t i e d o n v ä l i t y s k a n a v i a + t i e d o n v ä l i t y s k e i n o + t i e d o n v ä l i t y s k u l t t u u r i n + t i e d o n v ä l i t y s m o n o p o l i + t i e d o n v ä l i t y s o h j e l m a + t i e d o n v ä l i t y s o r g a n i s a a t i o i d e n + t i e d o n v ä l i t y s p a i k k o j a + t i e d o n v ä l i t y s p a l v e l u i d e n + t i e d o n v ä l i t y s p a l v e l u i s s a + t i e d o n v ä l i t y s p a l v e l u j a + t i e d o n v ä l i t y s p a l v e l u t + t i e d o n v ä l i t y s p o l i t i i k k a a + t i e d o n v ä l i t y s p o l i t i i k k a a n + t i e d o n v ä l i t y s p r o j e k t e j a + t i e d o n v ä l i t y s r a k e n t e i t a + t i e d o n v ä l i t y s t a p a a + t i e d o n v ä l i t y s t e k n o l o g i a n + t i e d o n v ä l i t y s t e k n o l o g i a t + t i e d o n v ä l i t y s t e k n o l o g i o i s t a + t i e d o n v ä l i t y s t ä + t i e d o n v ä l i t y s v a l i o k u n n a n + t i e d o n v ä l i t y s v a l l a n + t i e d o n v ä l i t y s v i e r a i l u t + t i e d o s s a + t i e d o s s a a n + t i e d o s s a m m e + t i e d o s s a n i + t i e d o s s a n n e + t i e d o s t a a + t i e d o s t a a k o + t i e d o s t a e n + t i e d o s t a i s i v a t + t i e d o s t a m a a n + t i e d o s t a m a s s a + t i e d o s t a m a t t a + t i e d o s t a m i s e e n + t i e d o s t a m i s e n + t i e d o s t a m i s k a m p a n j a n + t i e d o s t a m i s k a m p a n j o i h i n + t i e d o s t a m i s k a m p a n j o i t a + t i e d o s t a m i s t a + t i e d o s t a m m e + t i e d o s t a n e e n + t i e d o s t a v a m p i + t i e d o s t a v a t + t i e d o s t e t a a n k o + t i e d o s t e t t a v a + t i e d o s t e t t u a a n + t i e d o s t i + t i e d o s t o j a + t i e d o s t o j e n + t i e d o s t o j ä r j e s t e l m ä + t i e d o s t o m u o t o + t i e d o s t o n a + t i e d o s t o n j a k o + t i e d o s t o p ä ä t e + t i e d o s t o p ä ä t t e i s t ä + t i e d o t + t i e d o t a m m e + t i e d o t a t t e + t i e d o t e t a + t i e d o t e t a a n + t i e d o t e t t a + t i e d o t e t t a i s i i n + t i e d o t e t t a v a + t i e d o t e t t u + t i e d o t t a a + t i e d o t t a a k s e e n + t i e d o t t a e s s a a n + t i e d o t t a j a a + t i e d o t t a j a k s i + t i e d o t t a j a n + t i e d o t t a j a n v a p a u d e n + t i e d o t t a k a a m m e + t i e d o t t a m a a n + t i e d o t t a m a t t a + t i e d o t t a m i s e e n + t i e d o t t a m i s e k s i + t i e d o t t a m i s e l l a + t i e d o t t a m i s e n + t i e d o t t a m i s e s s a + t i e d o t t a m i s e s t a + t i e d o t t a m i s j ä r j e s t e l m ä + t i e d o t t a m i s k a m p a n j o i t a + t i e d o t t a m i s k y s y m y s + t i e d o t t a m i s m e n e t t e l y + t i e d o t t a m i s m e n e t t e l y i h i n + t i e d o t t a m i s m e n e t t e l y i s t ä + t i e d o t t a m i s m e n e t t e l y j e n + t i e d o t t a m i s m e n e t t e l y n + t i e d o t t a m i s p o l i t i i k a s s a + t i e d o t t a m i s p o l i t i i k k a + t i e d o t t a m i s r a k e n t e i d e n s a + t i e d o t t a m i s s t r a t e g i a n + t i e d o t t a m i s s t r a t e g i o i t a + t i e d o t t a m i s t a + t i e d o t t a m i s t a a k k o j e n + t i e d o t t a m i s t a v o i s t a + t i e d o t t a m i s v e l v o l l i s u u s + t i e d o t t a n u t + t i e d o t t a v a n + t i e d o t t a v a t + t i e d o t t a v i a + t i e d o t t e e n + t i e d o t t e e s s a + t i e d o t t e e t + t i e d o t t e i d e n + t i e d o t t e i s s a + t i e d o t t e i t a + t i e d o t u k s e e n + t i e d o t u k s e l l a + t i e d o t u k s e n + t i e d o t u k s e s s a + t i e d o t u k s e s t a + t i e d o t u k s i a + t i e d o t u s a i n e i s t o a + t i e d o t u s a i n e i s t o n + t i e d o t u s a l a a n + t i e d o t u s a l a n + t i e d o t u s a l o i t t e e t + t i e d o t u s a l o i t t e i t a + t i e d o t u s a m m a t t i l a i s t e n + t i e d o t u s a s i a k i r j a n + t i e d o t u s a u k k o + t i e d o t u s b u d j e t i s t a + t i e d o t u s b u d j e t t i n s a + t i e d o t u s h a n k k e e s e e n + t i e d o t u s h a n k k e i s i i n + t i e d o t u s h a n k k e i t a + t i e d o t u s i l m a p i i r i s s ä + t i e d o t u s j ä r j e s t e l m i ä + t i e d o t u s j ä r j e s t e l m ä + t i e d o t u s j ä r j e s t e l m ä l l e + t i e d o t u s j ä r j e s t e l m ä l l ä + t i e d o t u s j ä r j e s t e l m ä n + t i e d o t u s j ä r j e s t e l m ä s t ä + t i e d o t u s j ä r j e s t e l m ä ä + t i e d o t u s j ä r j e s t e l m ä ä n + t i e d o t u s k a a o s + t i e d o t u s k a m p a n j a + t i e d o t u s k a m p a n j a a + t i e d o t u s k a m p a n j a a n + t i e d o t u s k a m p a n j a a n s a + t i e d o t u s k a m p a n j a l l a + t i e d o t u s k a m p a n j a l l e + t i e d o t u s k a m p a n j a l l e m m e + t i e d o t u s k a m p a n j a m m e + t i e d o t u s k a m p a n j a n + t i e d o t u s k a m p a n j a n n e + t i e d o t u s k a m p a n j a s s a + t i e d o t u s k a m p a n j a s t a + t i e d o t u s k a m p a n j a t + t i e d o t u s k a m p a n j o i d e n + t i e d o t u s k a m p a n j o i h i n + t i e d o t u s k a m p a n j o i l l a + t i e d o t u s k a m p a n j o i l l e + t i e d o t u s k a m p a n j o i n + t i e d o t u s k a m p a n j o i s s a + t i e d o t u s k a m p a n j o i s s a a n + t i e d o t u s k a m p a n j o i s t a + t i e d o t u s k a m p a n j o i t a + t i e d o t u s k a n a v a + t i e d o t u s k a n a v a n a + t i e d o t u s k a n a v i a + t i e d o t u s k a n a v i e n + t i e d o t u s k e r t o m u k s e n + t i e d o t u s k e s k u k s e e n + t i e d o t u s k e s k u k s e n + t i e d o t u s k e s k u k s e t + t i e d o t u s k e s k u k s i a + t i e d o t u s k e s k u k s i n + t i e d o t u s k e s k u k s i s s a + t i e d o t u s k e s k u s + t i e d o t u s k e s k u s t a + t i e d o t u s k e s k u s t e n + t i e d o t u s k e t j u s s a + t i e d o t u s k i e r t u e e n + t i e d o t u s k o k o u k s e n + t i e d o t u s k o k o u k s i i n + t i e d o t u s k o n f e r e n s s i i n + t i e d o t u s k u l t t u u r i + t i e d o t u s k u l t t u u r i n + t i e d o t u s k y s y m y k s e e n + t i e d o t u s k ä y t ä n n ö s t ä + t i e d o t u s k ä y t ä n t ö + t i e d o t u s l a i n + t i e d o t u s l e h t i n e n + t i e d o t u s l e h t i s e n + t i e d o t u s l e h t i s t e n + t i e d o t u s l ä h t e i t ä + t i e d o t u s m a l l i s t a + t i e d o t u s m a t e r i a a l i a + t i e d o t u s m a t e r i a a l i n + t i e d o t u s m a t e r i a a l i s s a + t i e d o t u s m a t e r i a a l i s t a + t i e d o t u s m e k a n i s m i n + t i e d o t u s m e n e t e l m i ä + t i e d o t u s m e n e t e l m ä n ä + t i e d o t u s m e n e t t e l y + t i e d o t u s m e n e t t e l y j e m m e + t i e d o t u s m e n e t t e l y j ä + t i e d o t u s m e n e t t e l y s t ä + t i e d o t u s m e n o j e n + t i e d o t u s m i n i s t e r i + t i e d o t u s m i n i s t e r i l l e + t i e d o t u s m i n i s t e r i n + t i e d o t u s m i n i s t e r i ö + t i e d o t u s m o n o p o l i + t i e d o t u s m u o t o + t i e d o t u s m u o t o a + t i e d o t u s m ä ä r ä r a h a + t i e d o t u s m ä ä r ä r a h o i s t a + t i e d o t u s n ä k ö k o h t a a + t i e d o t u s o h j e l m a + t i e d o t u s o h j e l m a a + t i e d o t u s o h j e l m a a n + t i e d o t u s o h j e l m a n + t i e d o t u s o h j e l m a s t a + t i e d o t u s o h j e l m i a + t i e d o t u s o h j e l m i e n + t i e d o t u s o h j e l m i l l a + t i e d o t u s o h j e l m i l l e + t i e d o t u s o n g e l m a s t a + t i e d o t u s o n g e l m i a + t i e d o t u s o s a s t o + t i e d o t u s o s a s t o j e n + t i e d o t u s o s a s t o n + t i e d o t u s o s a s t o t + t i e d o t u s p a l v e l u + t i e d o t u s p a l v e l u h a n k k e i d e n + t i e d o t u s p a l v e l u i h i n + t i e d o t u s p a l v e l u i l l e + t i e d o t u s p a l v e l u i s t a + t i e d o t u s p a l v e l u j a + t i e d o t u s p a l v e l u j e m m e + t i e d o t u s p a l v e l u j e n + t i e d o t u s p a l v e l u m m e + t i e d o t u s p a l v e l u n + t i e d o t u s p a l v e l u t + t i e d o t u s p i s t e + t i e d o t u s p i s t e e l l e + t i e d o t u s p i s t e e s t ä ä n + t i e d o t u s p i s t e e t + t i e d o t u s p i s t e i d e n + t i e d o t u s p i s t e i l l ä + t i e d o t u s p i s t e i s i i n + t i e d o t u s p i s t e i t ä + t i e d o t u s p i s t e t t ä + t i e d o t u s p o l i i t t i s e s t i + t i e d o t u s p o l i t i i k a k s e e n + t i e d o t u s p o l i t i i k a l l a + t i e d o t u s p o l i t i i k a l l e + t i e d o t u s p o l i t i i k a l t a + t i e d o t u s p o l i t i i k a n + t i e d o t u s p o l i t i i k a s s a + t i e d o t u s p o l i t i i k a s s a a n + t i e d o t u s p o l i t i i k a s s a m m e + t i e d o t u s p o l i t i i k a s t a + t i e d o t u s p o l i t i i k a s t a m m e + t i e d o t u s p o l i t i i k k a + t i e d o t u s p o l i t i i k k a a + t i e d o t u s p o l i t i i k k a a m m e + t i e d o t u s p o l i t i i k k a a n + t i e d o t u s p o l i t i i k k a a n s a + t i e d o t u s p o l i t i i k k a m m e + t i e d o t u s p o l i t i i k k a n s a + t i e d o t u s p r i o r i t e e t t i a + t i e d o t u s p r o j e k t i + t i e d o t u s p r o s e s s i a + t i e d o t u s p r o s e s s i i n + t i e d o t u s p r o s e s s i n + t i e d o t u s r a h a s t o n + t i e d o t u s r a h a s t o o n + t i e d o t u s r a k e n t e e t + t i e d o t u s r a k e n t e i d e n + t i e d o t u s r a t k a i s u i h i n + t i e d o t u s r i n t a m a l l a + t i e d o t u s r o o l i n + t i e d o t u s s e k t o r i a + t i e d o t u s s i v u s t o l l e + t i e d o t u s s o p i m u s t e n + t i e d o t u s s o t a + t i e d o t u s s t r a t e g i a + t i e d o t u s s t r a t e g i a a + t i e d o t u s s t r a t e g i a a n + t i e d o t u s s t r a t e g i a a n s a + t i e d o t u s s t r a t e g i a l l e + t i e d o t u s s t r a t e g i a m m e + t i e d o t u s s t r a t e g i a n + t i e d o t u s s t r a t e g i a s s a + t i e d o t u s s t r a t e g i a s t a + t i e d o t u s s t r a t e g i o i d e n + t i e d o t u s s t r a t e g i o i t a + t i e d o t u s s t r a t e g i s s a + t i e d o t u s s u u n n i t e l m a + t i e d o t u s s u u n n i t e l m a n + t i e d o t u s s u u n n i t e l m i a + t i e d o t u s t a + t i e d o t u s t a i s t e l u + t i e d o t u s t a p a h t u m i a + t i e d o t u s t a p o j a + t i e d o t u s t a r k o i t u k s e s s a + t i e d o t u s t a r k o i t u k s i i n + t i e d o t u s t a r p e i s t a + t i e d o t u s t a s o l l a + t i e d o t u s t a u l u a + t i e d o t u s t e h t ä v ä n + t i e d o t u s t e h t ä v ä t + t i e d o t u s t e h t ä v ä ä + t i e d o t u s t i l a i s u u d e n + t i e d o t u s t i l a i s u u d e s s a + t i e d o t u s t i l a i s u u d e t + t i e d o t u s t i l a i s u u k s i e n + t i e d o t u s t o i m e n p i t e i s t ä + t i e d o t u s t o i m e n p i t e i t ä + t i e d o t u s t o i m e t + t i e d o t u s t o i m i a + t i e d o t u s t o i m i e n + t i e d o t u s t o i m i i n + t i e d o t u s t o i m i l l a + t i e d o t u s t o i m i l l e + t i e d o t u s t o i m i n n a l l a + t i e d o t u s t o i m i n n a l l e + t i e d o t u s t o i m i n n a n + t i e d o t u s t o i m i n n a t + t i e d o t u s t o i m i n t a + t i e d o t u s t o i m i n t a a + t i e d o t u s t o i m i n t a a m m e + t i e d o t u s t o i m i n t a a n + t i e d o t u s t o i m i n t o j e n s a + t i e d o t u s t o i m i p i s t e e t + t i e d o t u s t o i m i p i s t e i d e n + t i e d o t u s t o i m i p i s t e i s s ä + t i e d o t u s t o i m i p i s t e i s t ä + t i e d o t u s t o i m i p i s t e i t ä + t i e d o t u s t o i m i s t a + t i e d o t u s t o i m i s t o + t i e d o t u s t o i m i s t o i h i n + t i e d o t u s t o i m i s t o i s t a + t i e d o t u s t o i m i s t o j a + t i e d o t u s t o i m i s t o j e n + t i e d o t u s t o i m i s t o n + t i e d o t u s t o i m i s t o o n + t i e d o t u s t o i m i s t o s s a + t i e d o t u s t o i m i s t o t + t i e d o t u s t u o t t e i d e n + t i e d o t u s t y ö h ö m m e + t i e d o t u s t y ö h ö n + t i e d o t u s t y ö k a l u j a + t i e d o t u s t y ö r y h m ä + t i e d o t u s t y ö r y h m ä n + t i e d o t u s t y ö r y h m ä s s ä + t i e d o t u s t y ö t ä + t i e d o t u s t y ö t ä m m e + t i e d o t u s v a a t i m u k s e t + t i e d o t u s v a a t i m u k s i a + t i e d o t u s v a a t i m u s t a + t i e d o t u s v a a t i m u s t e n + t i e d o t u s v a i h e e s s a + t i e d o t u s v a i k e u k s i a + t i e d o t u s v a j e + t i e d o t u s v a j e e s t a + t i e d o t u s v a j e t t a + t i e d o t u s v a l l a n k u m o u k s e n + t i e d o t u s v a l m i u d e t + t i e d o t u s v a l m i u k s i a + t i e d o t u s v a l m i u k s i e n + t i e d o t u s v e l v o i t t e e n + t i e d o t u s v e l v o i t t e i s t a + t i e d o t u s v e l v o i t t e i t a + t i e d o t u s v e l v o l l i s u u d e n + t i e d o t u s v e l v o l l i s u u k s i a + t i e d o t u s v e l v o l l i s u u k s i e n + t i e d o t u s v e l v o l l i s u u s + t i e d o t u s v e l v o l l i s u u t e e n + t i e d o t u s v e l v o l l i s u u t t a + t i e d o t u s v e l v o l l i s u u t t a a n + t i e d o t u s v e r k k o j a + t i e d o t u s v e r k k o j e n + t i e d o t u s v e r k o i l l e + t i e d o t u s v e r k o s t o + t i e d o t u s v e r k o s t o o n + t i e d o t u s v e r k o t + t i e d o t u s v ä l i n e + t i e d o t u s v ä l i n e e n + t i e d o t u s v ä l i n e e s s ä + t i e d o t u s v ä l i n e e t + t i e d o t u s v ä l i n e h a n k e + t i e d o t u s v ä l i n e h a n k k e i d e n + t i e d o t u s v ä l i n e i d e n + t i e d o t u s v ä l i n e i l l e + t i e d o t u s v ä l i n e i l l ä + t i e d o t u s v ä l i n e i s i i n + t i e d o t u s v ä l i n e i s s ä + t i e d o t u s v ä l i n e i s s ä k ä ä n + t i e d o t u s v ä l i n e i s s ä m m e + t i e d o t u s v ä l i n e i s t ä + t i e d o t u s v ä l i n e i t ä + t i e d o t u s v ä l i n e k a m p a n j a + t i e d o t u s v ä l i n e k a m p a n j a n + t i e d o t u s v ä l i n e k ä y t ä n t ö + t i e d o t u s v ä l i n e l a i n s ä ä d ä n n ö n + t i e d o t u s v ä l i n e l a i n s ä ä d ä n t ö + t i e d o t u s v ä l i n e l a i n s ä ä d ä n t ö ä + t i e d o t u s v ä l i n e l a i n s ä ä d ä n t ö ö n + t i e d o t u s v ä l i n e l a i n s ä ä d ä n t ö ö n s ä + t i e d o t u s v ä l i n e l a k i i n + t i e d o t u s v ä l i n e m a r k k i n a t + t i e d o t u s v ä l i n e m o n o p o l i n + t i e d o t u s v ä l i n e n e u v o s t o + t i e d o t u s v ä l i n e n e u v o s t o a + t i e d o t u s v ä l i n e n e u v o s t o n + t i e d o t u s v ä l i n e o r g a n i s a a t i o i h i n + t i e d o t u s v ä l i n e o r g a n i s a a t i o i t a + t i e d o t u s v ä l i n e p o l i t i i k a n + t i e d o t u s v ä l i n e p o l i t i i k a s t a + t i e d o t u s v ä l i n e p o l i t i i k k a + t i e d o t u s v ä l i n e p o l i t i i k k a a + t i e d o t u s v ä l i n e p o l i t i i k k a a n + t i e d o t u s v ä l i n e r y h m i e n + t i e d o t u s v ä l i n e r y h m i t t y m ä n + t i e d o t u s v ä l i n e s o p i m u k s e t + t i e d o t u s v ä l i n e v a p a u d e n + t i e d o t u s v ä l i n e v i r a n o m a i s t a + t i e d o t u s v ä l i n e v i r a s t o s t a + t i e d o t u s y h t e i s t y ö r y h m ä + t i e d o t u s y h t e i s t y ö r y h m ä n + t i e d o t u s y h t e i s t y ö r y h m ä s s ä + t i e d o t u s y k s i k k ö + t i e d o t u s y k s i k k ö ä + t i e d o t u s y k s i k ö i d e n + t i e d o t u s y k s i k ö n + t i e d o t u s y m p ä r i s t ö j e n + t i e d o t u s y r i t y s t e n + t i e d u s t e l e m i n e n + t i e d u s t e l e n + t i e d u s t e l i s i n + t i e d u s t e l l a + t i e d u s t e l l a k s e n i + t i e d u s t e l t a v a + t i e d u s t e l t i i n + t i e d u s t e l u a + t i e d u s t e l u a l a l l a + t i e d u s t e l u a l a n + t i e d u s t e l u a r v i o + t i e d u s t e l u a r v i o n + t i e d u s t e l u a s i o i t a + t i e d u s t e l u e l i n t e n + t i e d u s t e l u i h i n + t i e d u s t e l u j o h t a j a n + t i e d u s t e l u j o h t o i n e n + t i e d u s t e l u j ä r j e s t e l m i ä + t i e d u s t e l u j ä r j e s t e l m ä + t i e d u s t e l u j ä r j e s t e l m ä n + t i e d u s t e l u j ä r j e s t e l m ä s t ä + t i e d u s t e l u j ä r j e s t e l m ä ä + t i e d u s t e l u k a p a s i t e e t i l l a + t i e d u s t e l u k a p a s i t e e t t i + t i e d u s t e l u k a p a s i t e e t t i a + t i e d u s t e l u k o m i s s i o + t i e d u s t e l u k o n e e n + t i e d u s t e l u k o n e e s e e n + t i e d u s t e l u k o n e i t a + t i e d u s t e l u k u u l u s t e l u j a + t i e d u s t e l u l e n n o t + t i e d u s t e l u l e n t o k o n e + t i e d u s t e l u l ä h t e e n ä + t i e d u s t e l u m a t k o j a + t i e d u s t e l u m i n i s t e r i ö n + t i e d u s t e l u n ä k ö k o h t a + t i e d u s t e l u o p e r a a t i o n + t i e d u s t e l u p a l v e l u + t i e d u s t e l u p a l v e l u a + t i e d u s t e l u p a l v e l u i d e n + t i e d u s t e l u p a l v e l u i l l a + t i e d u s t e l u p a l v e l u i l l e + t i e d u s t e l u p a l v e l u i l t a + t i e d u s t e l u p a l v e l u i l t a a n + t i e d u s t e l u p a l v e l u i l t a m m e + t i e d u s t e l u p a l v e l u i s s a + t i e d u s t e l u p a l v e l u i s t a + t i e d u s t e l u p a l v e l u i t a + t i e d u s t e l u p a l v e l u i t a a n + t i e d u s t e l u p a l v e l u j a + t i e d u s t e l u p a l v e l u j e m m e + t i e d u s t e l u p a l v e l u j e n + t i e d u s t e l u p a l v e l u j e n s a + t i e d u s t e l u p a l v e l u l l a + t i e d u s t e l u p a l v e l u l l e + t i e d u s t e l u p a l v e l u l l e e n + t i e d u s t e l u p a l v e l u l t a + t i e d u s t e l u p a l v e l u m m e + t i e d u s t e l u p a l v e l u n + t i e d u s t e l u p a l v e l u n s a + t i e d u s t e l u p a l v e l u s t a + t i e d u s t e l u p a l v e l u t + t i e d u s t e l u p a l v e l u t u k e a + t i e d u s t e l u p a l v e l u u n + t i e d u s t e l u p o l i t i i k a l l e + t i e d u s t e l u p y y n t ö j ä + t i e d u s t e l u r a k e n t e i s i i n + t i e d u s t e l u r a p o r t t i + t i e d u s t e l u r e s u r s s e j a + t i e d u s t e l u s a t e l l i i t e i l l a + t i e d u s t e l u s a t e l l i i t i t + t i e d u s t e l u s a t e l l i i t t i + t i e d u s t e l u t a r k o i t u k s e e n + t i e d u s t e l u t e k n i i k k a a + t i e d u s t e l u t i e t o a + t i e d u s t e l u t i e t o j e n + t i e d u s t e l u t o i m i e n + t i e d u s t e l u t o i m i n n a l t a + t i e d u s t e l u t o i m i n n a n + t i e d u s t e l u t o i m i n n a s t a + t i e d u s t e l u t o i m i n t a + t i e d u s t e l u t o i m i n t a a + t i e d u s t e l u t o i m i n t a a n + t i e d u s t e l u t o i m i s t a + t i e d u s t e l u t o i m i s t o j e n + t i e d u s t e l u t y ö r y h m ä n + t i e d u s t e l u t y ö s k e n t e l y + t i e d u s t e l u v a l m i u d e t + t i e d u s t e l u v a l m i u k s i e n + t i e d u s t e l u v a l t u u s k u n n a n + t i e d u s t e l u v a l t u u s k u n t a a n + t i e d u s t e l u v i r a n o m a i s i a + t i e d u s t e l u v i r a n o m a i s t e n + t i e d u s t e l u v i r a s t o + t i e d u s t e l u y h t e i s t y ö l l ä + t i e d u s t e l u y h t e i s t y ö t ä + t i e d u s t e l u y h t e i s ö n + t i e d u s t e l u y k s i k k ö + t i e d u s t e l u y k s i k k ö j e n + t i e d u s t e l u y k s i k ö n + t i e d u s t e l u y k s i k ö t + t i e d ä k ä ä n + t i e d ä m m e + t i e d ä m m e h ä n + t i e d ä m m e k i n + t i e d ä m m e k ö + t i e d ä n + t i e d ä t k ö + t i e d ä t t e + t i e d ä t t e h ä n + t i e d ä t t e k ö + t i e h a n k e + t i e h a n k e t t a + t i e h a n k k e e n + t i e h a n k k e i d e n + t i e h a n k k e i s i i n + t i e h a n k k e i t a + t i e h i n n o i t t e l u s s a + t i e i n f r a s t r u k t u u r i + t i e i n f r a s t r u k t u u r i a + t i e i n f r a s t r u k t u u r i e n + t i e i n f r a s t r u k t u u r i h a n k k e i d e n + t i e i n f r a s t r u k t u u r i h a n k k e i t a + t i e i n f r a s t r u k t u u r i i n + t i e i n f r a s t r u k t u u r i k u s t a n n u s t e n + t i e i n f r a s t r u k t u u r i m m e + t i e i n f r a s t r u k t u u r i n + t i e i n f r a s t r u k t u u r i t + t i e i n v e s t o i n n i t + t i e i n v e s t o i n t i e n + t i e j y r ä + t i e j ä r j e s t e l m i ä + t i e k a r t a n + t i e k a r t a s s a + t i e k a r t a s t a + t i e k a r t a t + t i e k a r t o i s s a + t i e k a r t t a + t i e k a r t t a a + t i e k a r t t a n a + t i e k i r k k o + t i e k u l j e t u k s e t + t i e k u l j e t u k s i i n + t i e k u l j e t u k s i s t a + t i e k u l j e t u s t e n + t i e k u o l e m a t + t i e k u s t a n n u k s e t + t i e k u s t a n n u k s i i n + t i e k y l t i t + t i e l a i n + t i e l i i k e n n e + t i e l i i k e n n e a l a + t i e l i i k e n n e a l a a + t i e l i i k e n n e a l a l l a + t i e l i i k e n n e a l a n + t i e l i i k e n n e a l a s t a + t i e l i i k e n n e a s e t u k s e k s i + t i e l i i k e n n e i n f r a s t r u k t u u r i a + t i e l i i k e n n e i n f r a s t r u k t u u r i n + t i e l i i k e n n e j ä r j e s t e l m ä + t i e l i i k e n n e j ä r j e s t e l m ä n + t i e l i i k e n n e j ä r j e s t e l m ä s t ä + t i e l i i k e n n e j ä r j e s t e l m ä ä + t i e l i i k e n n e j ä r j e s t e l m ä ä n + t i e l i i k e n n e k u l j e t u s t a + t i e l i i k e n n e k u l j e t u s t e n + t i e l i i k e n n e k u o l e m i a + t i e l i i k e n n e k u o l e m i e n + t i e l i i k e n n e k u o l e m i i n + t i e l i i k e n n e k u o l e m i s t a + t i e l i i k e n n e k u o l l e i s u u d e n + t i e l i i k e n n e k u o l l e i s u u s + t i e l i i k e n n e l a i n + t i e l i i k e n n e l a i s t a + t i e l i i k e n n e l a k e i h i n + t i e l i i k e n n e l a k i a + t i e l i i k e n n e l a k i e n + t i e l i i k e n n e l a k i i n + t i e l i i k e n n e l a k i m m e + t i e l i i k e n n e m a k s u j a + t i e l i i k e n n e m a k s u t + t i e l i i k e n n e m a r k k i n o i l l a + t i e l i i k e n n e m a r k k i n o i l l e + t i e l i i k e n n e m a r k k i n o i t a + t i e l i i k e n n e m e l u n + t i e l i i k e n n e m u o t o j e n + t i e l i i k e n n e m ä ä r ä y s t e n + t i e l i i k e n n e o n n e t t o m u u d e s s a + t i e l i i k e n n e o n n e t t o m u u d e t + t i e l i i k e n n e o n n e t t o m u u k s i a + t i e l i i k e n n e o n n e t t o m u u k s i e n + t i e l i i k e n n e o n n e t t o m u u k s i i n + t i e l i i k e n n e o n n e t t o m u u k s i s s a + t i e l i i k e n n e o n n e t t o m u u k s i s t a + t i e l i i k e n n e o n n e t t o m u u t e e n + t i e l i i k e n n e o n n e t t o m u u t t a + t i e l i i k e n n e p a k e t t i + t i e l i i k e n n e p a l v e l u i s t a + t i e l i i k e n n e p a l v e l u j a + t i e l i i k e n n e r i k k o m u k s i a + t i e l i i k e n n e r i k k o m u s t e n + t i e l i i k e n n e r i s k i e n + t i e l i i k e n n e s e k t o r i l l a + t i e l i i k e n n e s e k t o r i l l e + t i e l i i k e n n e s ä ä n n ö s t e n + t i e l i i k e n n e s ä ä n n ö s t ö s t ä + t i e l i i k e n n e s ä ä n n ö s t ö ä + t i e l i i k e n n e s ä ä n t ö j ä + t i e l i i k e n n e t i h e y s + t i e l i i k e n n e t t ä + t i e l i i k e n n e t u r v a a + t i e l i i k e n n e t u r v a l l i s u u d e l l e + t i e l i i k e n n e t u r v a l l i s u u d e n + t i e l i i k e n n e t u r v a l l i s u u d e s s a + t i e l i i k e n n e t u r v a l l i s u u d e s t a + t i e l i i k e n n e t u r v a l l i s u u s + t i e l i i k e n n e t u r v a l l i s u u s p o l i t i i k a n + t i e l i i k e n n e t u r v a l l i s u u s p ä i v ä k i n + t i e l i i k e n n e t u r v a l l i s u u s v i r a s t o + t i e l i i k e n n e t u r v a l l i s u u t e e n + t i e l i i k e n n e t u r v a l l i s u u t t a + t i e l i i k e n n e v a l v o n t a + t i e l i i k e n n e v e r k k o i h i n + t i e l i i k e n n e v e r k o n + t i e l i i k e n n e y h t e y t t ä + t i e l i i k e n t e e l l e + t i e l i i k e n t e e l t ä + t i e l i i k e n t e e n + t i e l i i k e n t e e n h a r j o i t t a j i e n + t i e l i i k e n t e e s e e n + t i e l i i k e n t e e s s ä + t i e l i i k e n t e e s t ä + t i e l i i k e n t e e s t ä m m e + t i e l l ä m m e + t i e l u o k a n + t i e m a k s u + t i e m a k s u a + t i e m a k s u a s e m i e n + t i e m a k s u d i r e k t i i v i n + t i e m a k s u i h i n + t i e m a k s u i l l a + t i e m a k s u i l l e + t i e m a k s u i s s a + t i e m a k s u i s t a + t i e m a k s u j a + t i e m a k s u j a a n + t i e m a k s u j e n + t i e m a k s u j ä r j e s t e l m i e n + t i e m a k s u j ä r j e s t e l m i s s ä + t i e m a k s u j ä r j e s t e l m i s t ä + t i e m a k s u j ä r j e s t e l m i ä + t i e m a k s u j ä r j e s t e l m i ä ä n + t i e m a k s u j ä r j e s t e l m ä + t i e m a k s u j ä r j e s t e l m ä l l ä + t i e m a k s u j ä r j e s t e l m ä n + t i e m a k s u j ä r j e s t e l m ä ä + t i e m a k s u k o n s e p t i + t i e m a k s u l l a + t i e m a k s u n + t i e m a k s u n k e r ä y s j ä r j e s t e l m i e n + t i e m a k s u s t a + t i e m a k s u t + t i e m a k s u t e k n o l o g i a + t i e m a k s u u n + t i e m e r k i n t ä + t i e m m e + t i e n h a a r a s s a + t i e n h o i t o t o i m e n p i t e i t ä + t i e n k ä y t t ä j i e n + t i e n k ä y t t ä j i e n k i n + t i e n k ä y t t ä j i i n + t i e n k ä y t t ä j i l l e + t i e n k ä y t t ä j i l l ä + t i e n k ä y t t ä j i l t ä + t i e n k ä y t t ä j i n ä + t i e n k ä y t t ä j i ä + t i e n k ä y t t ä j ä + t i e n k ä y t t ä j ä l l e + t i e n k ä y t t ä j ä n + t i e n k ä y t t ä j ä t + t i e n k ä y t t ä j ä ä + t i e n k ä y t t ö m a k s u + t i e n k ä y t t ö m a k s u a + t i e n k ä y t t ö m a k s u i s t a + t i e n k ä y t t ö m a k s u j a + t i e n k ä y t t ö m a k s u j e n + t i e n k ä y t t ö m a k s u t + t i e n k ä y t t ö v e r o i n a + t i e n k ä y t ö s t ä + t i e n n y t k ä ä n + t i e n n ä y t t ä j i n ä + t i e n n ä y t t ä j i ä + t i e n n ä y t t ä j ä + t i e n n ä y t t ä j ä n + t i e n n ä y t t ä j ä n ä + t i e n p i n n a n + t i e n p i n t a + t i e n p i n t a a n + t i e n r a i v a a j a n a + t i e n r a k e n n u k s e n + t i e n r a k e n n u s + t i e n r a k e n n u s h a n k k e e s e e n + t i e n r a k e n n u s h a n k k e i s i i n + t i e n r a k e n n u s h a n k k e i s s a + t i e n r a k e n n u s s u u n n i t e l m a t + t i e n r a k e n n u s u r a k o i t s i j a + t i e n r a k e n t a m i s t a + t i e n r i s t e y k s e s s ä + t i e n s ä + t i e n v a r s i m a i n o k s e t + t i e n v a r s i p o m m i + t i e n v a r s i t a r k a s t u k s e t + t i e n v a r s i t a r k a s t u k s i a + t i e n v a r s i t a r k a s t u k s i s s a + t i e n v a r s i t a r k a s t u k s i s t a + t i e n v a r s i t a r k a s t u s t e n + t i e n v a r s i t a r k i s t u s t e n + t i e n v a r s i t e s t e i h i n + t i e n v i i t t o j a + t i e n ä + t i e o i k e u k s i e n + t i e o n n e t t o m u u d e s t a + t i e o n n e t t o m u u k s i a + t i e o n n e t t o m u u k s i e n + t i e o n n e t t o m u u k s i s s a + t i e o s u u d e l l a + t i e o s u u d e n + t i e o s u u d e t + t i e o s u u k s i a + t i e o s u u s + t i e o s u u t t a + t i e p a k e t t i a + t i e p a l v e l u j e n + t i e p a l v e l u n u m e r o a + t i e p i s t i ä i s e t + t i e r a j a + t i e r a k e n n u s h a n k k e i s i i n + t i e r a k e n t a m i s e e n + t i e r a k e n t e i t a + t i e r n a p o j a t + t i e s i + t i e s i m m e + t i e s i m m e k i n + t i e s i t t e k ö + t i e s i v ä t + t i e s i v ä t k i n + t i e s s ä + t i e s t a n d a r d e j a + t i e s u l k u a s i a n + t i e s u l k u i h i n + t i e s u l k u j a + t i e s u l k u j e n + t i e s u l u i l l a + t i e s u l u t + t i e t e e l l e + t i e t e e l l i s e e n + t i e t e e l l i s e k s i + t i e t e e l l i s e l l e + t i e t e e l l i s e l l ä + t i e t e e l l i s e l t ä + t i e t e e l l i s e m m i n + t i e t e e l l i s e m p i + t i e t e e l l i s e m p ä ä + t i e t e e l l i s e n + t i e t e e l l i s e s s ä + t i e t e e l l i s e s t i k i n + t i e t e e l l i s e s t ä + t i e t e e l l i s e t + t i e t e e l l i s i i n + t i e t e e l l i s i l l ä + t i e t e e l l i s i m p i i n + t i e t e e l l i s i n + t i e t e e l l i s i s s ä + t i e t e e l l i s i s t ä + t i e t e e l l i s i ä + t i e t e e l l i s t e n + t i e t e e l l i s y y t t ä + t i e t e e n + t i e t e e n a l a l t a + t i e t e e n a l a n + t i e t e e n a l a s t a + t i e t e e n a l o i l l a + t i e t e e n a l o i s t a + t i e t e e n a l o j a + t i e t e e n a l o j e n + t i e t e e n f i l o s o f i a + t i e t e e n h a a r a a + t i e t e e n h a r j o i t t a j i e n + t i e t e e n t u t k i m u s + t i e t e e s e e n + t i e t e e s s ä + t i e t e e s t ä + t i e t e e s t ä m m e + t i e t e e t + t i e t e i d e n + t i e t e i l i j ä m m e + t i e t e i s i i n + t i e t e i s k i r j a l l i s u u d e n + t i e t e i s k i r j a l l i s u u d e s t a + t i e t e i s k i r j a l l i s u u t e e n + t i e t e i s k i r j a l l i s u u t t a + t i e t e i s k u l t t u u r i + t i e t e i s k u v i t e l m a s t a + t i e t e i s k u v i t e l m i e n + t i e t e i s m a a i l m a a n + t i e t e i t ä + t i e t o a + t i e t o a i k a k a u d e n + t i e t o a i n e s t a + t i e t o a k a a n + t i e t o a l a a + t i e t o a l a n + t i e t o a l u e e n + t i e t o a l u e t t a + t i e t o a u k k o j e n + t i e t o e r ä ä + t i e t o h a k e m i s t o s s a + t i e t o h a l l i n t o p ä ä l l i k k ö + t i e t o i h i n + t i e t o i n a + t i e t o i n f r a s t r u k t u u r i + t i e t o i n f r a s t r u k t u u r i a + t i e t o i n f r a s t r u k t u u r i e n + t i e t o i n t e n s i i v i s e m p i ä + t i e t o i n t e n s i i v i s e n + t i e t o i n t e n s i i v i s e t + t i e t o i n t e n s i i v i s i i n + t i e t o i s e e n + t i e t o i s e k s i + t i e t o i s e m m a k s i + t i e t o i s e m m a n + t i e t o i s e m m i k s i + t i e t o i s e m p a a n + t i e t o i s e m p i + t i e t o i s e m p i a + t i e t o i s e n + t i e t o i s e n a + t i e t o i s e s t a + t i e t o i s e t + t i e t o i s i a + t i e t o i s i k s i + t i e t o i s i m p i a + t i e t o i s i n a + t i e t o i s k u p ä i v ä + t i e t o i s k u s a r j a + t i e t o i s t a + t i e t o i s u u d e n + t i e t o i s u u d e n l i s ä ä m i s k a m p a n j a + t i e t o i s u u d e n l i s ä ä m i s k a m p a n j a a n + t i e t o i s u u d e s t a + t i e t o i s u u d e s t a m m e + t i e t o i s u u s k a m p a n j o i t a + t i e t o i s u u s n a u h a + t i e t o i s u u t e e m m e + t i e t o i s u u t e e n + t i e t o i s u u t t a + t i e t o i s u u t t a m m e + t i e t o j a + t i e t o j a a n + t i e t o j a m m e + t i e t o j a n i + t i e t o j e m m e + t i e t o j e n + t i e t o j e n a n t a m i s v e l v o i t e t t a + t i e t o j e n a n t o s u o j a n + t i e t o j e n h a k u m a t k a l l a + t i e t o j e n i + t i e t o j e n j a o n + t i e t o j e n k e r u u + t i e t o j e n k e r u u a s e t u k s e n + t i e t o j e n k e r u u j ä r j e s t e l m i ä + t i e t o j e n k e r u u j ä r j e s t e l m ä + t i e t o j e n k e r u u k a u s i e n + t i e t o j e n k e r u u m a t k a + t i e t o j e n k e r u u m a t k a n + t i e t o j e n k e r u u m a t k o j a + t i e t o j e n k e r u u m e k a n i s m i n + t i e t o j e n k e r u u n + t i e t o j e n k e r u u s e e n + t i e t o j e n k e r u u s s a m m e + t i e t o j e n k e r u u s t a + t i e t o j e n k e r u u t a + t i e t o j e n k e r u u t a r k o i t u k s e e n + t i e t o j e n k e r u u t a v o i t t e e n + t i e t o j e n k e r u u v a l t u u s k u n n a l l e + t i e t o j e n k e r u u v a l t u u s k u n t a + t i e t o j e n k e r u u v a l t u u s k u n t a a + t i e t o j e n k e r u u v a l t u u s k u n t a a n + t i e t o j e n k e r u u v e l v o i t e t t a + t i e t o j e n k e r ä y k s e e n + t i e t o j e n k e r ä y s m i e l e s s ä + t i e t o j e n k ä s i t t e l y + t i e t o j e n k ä s i t t e l y a l a l l a + t i e t o j e n k ä s i t t e l y j ä r j e s t e l m i e n + t i e t o j e n k ä s i t t e l y j ä r j e s t e l m ä + t i e t o j e n k ä s i t t e l y j ä r j e s t e l m ä n + t i e t o j e n k ä s i t t e l y j ä r j e s t e l m ä n n e + t i e t o j e n k ä s i t t e l y j ä r j e s t e l m ä ä + t i e t o j e n k ä s i t t e l y k a p a s i t e e t t i a + t i e t o j e n k ä s i t t e l y m a t e r i a a l i a + t i e t o j e n k ä s i t t e l y m e n e t t e l y s s ä + t i e t o j e n k ä s i t t e l y n + t i e t o j e n k ä s i t t e l y o p p i i n + t i e t o j e n k ä s i t t e l y s s ä + t i e t o j e n k ä s i t t e l y t e h o a + t i e t o j e n k ä s i t t e l y t e k n i i k a t + t i e t o j e n k ä s i t t e l y t e k n i i k k a + t i e t o j e n k ä s i t t e l y t e k n i i k o i d e n + t i e t o j e n k ä s i t t e l y t e o r i a + t i e t o j e n k ä s i t t e l y t i e d e + t i e t o j e n k ä s i t t e l y t o i m e n p i t e e n + t i e t o j e n k ä s i t t e l y y n + t i e t o j e n k ä s i t t e l y ä + t i e t o j e n m u u n t e l u k a m p a n j a + t i e t o j e n n e + t i e t o j e n s a a n t i o i k e u k s i l l a + t i e t o j e n s a a n t i p y y n n ö n + t i e t o j e n s i i r r o n + t i e t o j e n s i i r r o s t a + t i e t o j e n s u o j a a + t i e t o j e n s u o j a r a j o i t u s t e n + t i e t o j e n s ä i l y t t ä m i s j ä r j e s t e l m ä + t i e t o j e n v a i h d o l l a + t i e t o j e n v a i h d o l l e + t i e t o j e n v a i h d o n + t i e t o j e n v a i h d o s s a + t i e t o j e n v a i h d o s t a + t i e t o j e n v a i h t a m i n e n + t i e t o j e n v a i h t o + t i e t o j e n v a i h t o a + t i e t o j e n v a i h t o j ä r j e s t e l m i e n + t i e t o j e n v a i h t o j ä r j e s t e l m i i n + t i e t o j e n v a i h t o j ä r j e s t e l m i ä + t i e t o j e n v a i h t o j ä r j e s t e l m ä + t i e t o j e n v a i h t o j ä r j e s t e l m ä n + t i e t o j e n v a i h t o j ä r j e s t e l m ä s s ä + t i e t o j e n v a i h t o j ä r j e s t e l m ä s t ä + t i e t o j e n v a i h t o j ä r j e s t e l m ä ä + t i e t o j e n v a i h t o j ä r j e s t e l m ä ä n + t i e t o j e n v a i h t o k a n a v a + t i e t o j e n v a i h t o k e s k u s + t i e t o j e n v a i h t o m e k a n i s m i t + t i e t o j e n v a i h t o m e n e t e l m ä + t i e t o j e n v a i h t o o n + t i e t o j e n v a i h t o t e k n o l o g i a n + t i e t o j e n v a i h t o t o i m e n p i t e i t ä + t i e t o j e n v a i h t o v e r k k o n a + t i e t o j e n v a i h t o v ä l i n e + t i e t o j e n v a i h t o y m p ä r i s t ö n + t i e t o j e n v ä l i t y k s e s t ä + t i e t o j o h t a m i n e n + t i e t o j o h t a m i s e l l e + t i e t o j o h t a m i s t a + t i e t o j ä r j e s t e l m i e m m e + t i e t o j ä r j e s t e l m i e n + t i e t o j ä r j e s t e l m i e n s ä + t i e t o j ä r j e s t e l m i i m m e + t i e t o j ä r j e s t e l m i i n + t i e t o j ä r j e s t e l m i l l ä + t i e t o j ä r j e s t e l m i s s ä + t i e t o j ä r j e s t e l m i s t ä + t i e t o j ä r j e s t e l m i ä + t i e t o j ä r j e s t e l m ä + t i e t o j ä r j e s t e l m ä a r k k i t e h t u u r i + t i e t o j ä r j e s t e l m ä i n f r a s t r u k t u u r i a + t i e t o j ä r j e s t e l m ä l l e + t i e t o j ä r j e s t e l m ä l l ä + t i e t o j ä r j e s t e l m ä n + t i e t o j ä r j e s t e l m ä n s ä + t i e t o j ä r j e s t e l m ä n ä + t i e t o j ä r j e s t e l m ä s s ä + t i e t o j ä r j e s t e l m ä s s ä m m e + t i e t o j ä r j e s t e l m ä s t ä + t i e t o j ä r j e s t e l m ä t + t i e t o j ä r j e s t e l m ä t i e d e + t i e t o j ä r j e s t e l m ä ä + t i e t o j ä r j e s t e l m ä ä m m e + t i e t o j ä r j e s t e l m ä ä n + t i e t o k a m p a n j a + t i e t o k a m p a n j o i s s a + t i e t o k a m p a n j o i t a + t i e t o k a n a v a + t i e t o k a n a v i i n + t i e t o k a n n a n + t i e t o k a n n a s s a + t i e t o k a n n a t + t i e t o k a n n o i l l a + t i e t o k a n n o i s t a + t i e t o k a n t a + t i e t o k a n t a a + t i e t o k a n t a a n + t i e t o k a n t a j ä r j e s t e l m i ä + t i e t o k a n t a m e k a n i s m i a + t i e t o k a n t a n a + t i e t o k a n t a p a l v e l u j a + t i e t o k a n t a p o h j a i s e t + t i e t o k a n t a v e r k o s t o a + t i e t o k a n t a v e r k o s t o n + t i e t o k a n t o i h i n + t i e t o k a n t o j a + t i e t o k a n t o j e n + t i e t o k e n t t ä ä + t i e t o k e n t ä k s i + t i e t o k e n t ä n + t i e t o k e s k u k s e n + t i e t o k e s k u k s e t + t i e t o k e s k u k s i a + t i e t o k e s k u s + t i e t o k e s k u s t a + t i e t o k i r j a l l i s u u s + t i e t o k i r j o j e n + t i e t o k o k o e l m a n + t i e t o k o k o n a i s u u k s i a + t i e t o k o l m i o n + t i e t o k o l m i o o n + t i e t o k o n e + t i e t o k o n e a i k a a + t i e t o k o n e a l a a n + t i e t o k o n e a l a l l a + t i e t o k o n e a l a n + t i e t o k o n e a n i m a a t i o + t i e t o k o n e a r k k i t e h t u u r i + t i e t o k o n e a v u s t e i n e n + t i e t o k o n e e l l a + t i e t o k o n e e n + t i e t o k o n e e t + t i e t o k o n e f r i i k k i e n + t i e t o k o n e g r a f i i k k a + t i e t o k o n e h a k k e r i e n + t i e t o k o n e h a k k e r i n + t i e t o k o n e h a n k i n t o j a + t i e t o k o n e h u o n e i t a + t i e t o k o n e h y ö k k ä y k s i ä + t i e t o k o n e h y ö k k ä y s t e n + t i e t o k o n e i d e n + t i e t o k o n e i n f r a s t r u k t u u r i a + t i e t o k o n e i s i i n + t i e t o k o n e i s s a + t i e t o k o n e i s t a m i s o h j e l m a n + t i e t o k o n e i s t a m i s t a + t i e t o k o n e i s t e t t u + t i e t o k o n e i s t e t t u a + t i e t o k o n e i s t e t t u j e n + t i e t o k o n e i s t u m i n e n + t i e t o k o n e i t a + t i e t o k o n e j e n g i + t i e t o k o n e j ä r j e s t e l m i e m m e + t i e t o k o n e j ä r j e s t e l m i e n + t i e t o k o n e j ä r j e s t e l m i i n + t i e t o k o n e j ä r j e s t e l m i l l e m m e + t i e t o k o n e j ä r j e s t e l m i s s ä + t i e t o k o n e j ä r j e s t e l m i s t ä + t i e t o k o n e j ä r j e s t e l m i ä + t i e t o k o n e j ä r j e s t e l m ä + t i e t o k o n e j ä r j e s t e l m ä l l ä + t i e t o k o n e j ä r j e s t e l m ä n + t i e t o k o n e j ä r j e s t e l m ä t + t i e t o k o n e j ä r j e s t e l m ä ä + t i e t o k o n e j ä r j e s t e l m ä ä n + t i e t o k o n e k a a p e l e i d e n + t i e t o k o n e k a m p u k s i l l a + t i e t o k o n e k a p a s i t e e t i n + t i e t o k o n e k a u p p i a a l l e + t i e t o k o n e k e r r o s k u v a u s + t i e t o k o n e k e s k u s t e l u + t i e t o k o n e k i e l e n + t i e t o k o n e k o m p o n e n t t e j a + t i e t o k o n e k o u l u t u s h a n k e + t i e t o k o n e k u r s s i l l e + t i e t o k o n e k ä ä n n ö k s i ä + t i e t o k o n e l a i t t e i s t o + t i e t o k o n e l a i t t e i s t o j e n + t i e t o k o n e l a i t t e i s t o t + t i e t o k o n e l e v y k k e e t + t i e t o k o n e l e v y k k e i l l e + t i e t o k o n e l i n g v i s t i i k k a + t i e t o k o n e l u k u t a i d o n + t i e t o k o n e l u k u t a i t o + t i e t o k o n e l u k u t a i t o k a m p a n j a + t i e t o k o n e m a l l e i s s a + t i e t o k o n e m a l l e j a + t i e t o k o n e m a l l i e n + t i e t o k o n e m a l l i n + t i e t o k o n e m a l l i n n u k s i s s a + t i e t o k o n e m a l l i n n u s t a + t i e t o k o n e m a l l i t + t i e t o k o n e m e n e t e l m i e n + t i e t o k o n e m e r k i n t ä ä + t i e t o k o n e m u s e o + t i e t o k o n e n ä k ö + t i e t o k o n e n ä p p ä i m i s t ö n + t i e t o k o n e n ä y t t ö + t i e t o k o n e n ö r t t i + t i e t o k o n e o h j a t t a v a + t i e t o k o n e o h j a t u i l l a + t i e t o k o n e o h j e l m a + t i e t o k o n e o h j e l m a a + t i e t o k o n e o h j e l m a n + t i e t o k o n e o h j e l m a t + t i e t o k o n e o h j e l m i a + t i e t o k o n e o h j e l m i e n + t i e t o k o n e o h j e l m i i n + t i e t o k o n e o h j e l m i l l e + t i e t o k o n e o h j e l m i s t a + t i e t o k o n e o h j e l m i s t o j a + t i e t o k o n e o h j e l m i s t o j e n + t i e t o k o n e o h j e l m o i j a + t i e t o k o n e o h j e l m o i j a t + t i e t o k o n e o n g e l m a + t i e t o k o n e o n g e l m a t + t i e t o k o n e o n g e l m i a + t i e t o k o n e p e l e i h i n + t i e t o k o n e p e l e i s s ä + t i e t o k o n e p e l e j ä + t i e t o k o n e p e l i + t i e t o k o n e p e l i e n + t i e t o k o n e p e l i k o n s o l i e n + t i e t o k o n e p e l i t + t i e t o k o n e p e l i t e o l l i s u u s + t i e t o k o n e p e r u s t e i s e n + t i e t o k o n e p e r u s t e i s e s t i + t i e t o k o n e p i r a t i s m i n + t i e t o k o n e p o h j a i n e n + t i e t o k o n e p o h j a i s e n + t i e t o k o n e p o h j a i s i a + t i e t o k o n e p o h j a i s i i n + t i e t o k o n e r i k o k s e n + t i e t o k o n e r i k o k s e t + t i e t o k o n e r i k o l l i s u u d e n + t i e t o k o n e r i k o l l i s u u d e s t a + t i e t o k o n e r i k o l l i s u u s + t i e t o k o n e r i k o l l i s u u s a i h e e n + t i e t o k o n e r i k o l l i s u u s d i r e k t i i v i ä + t i e t o k o n e r i k o l l i s u u t t a + t i e t o k o n e r o m u a + t i e t o k o n e r o o l i p e l i + t i e t o k o n e s h a k k i + t i e t o k o n e s i g n a a l i n + t i e t o k o n e s i m u l a a t i o i h i n + t i e t o k o n e s i m u l a a t i o i t a + t i e t o k o n e s i m u l a a t i o n + t i e t o k o n e s i m u l o i n t i + t i e t o k o n e s o v e l l u k s i i n + t i e t o k o n e t a i d e + t i e t o k o n e t a i t o j e n + t i e t o k o n e t e k n i i k a l l a + t i e t o k o n e t e k n i i k a n + t i e t o k o n e t e k n i i k k a a + t i e t o k o n e t e k n i k k o + t i e t o k o n e t e k n o l o g i a n + t i e t o k o n e t e o l l i s u u d e n + t i e t o k o n e t e o l l i s u u s + t i e t o k o n e t e r r o r i s m i + t i e t o k o n e t e r r o r i s m i s t a + t i e t o k o n e t t a + t i e t o k o n e t u o t t e i d e n + t i e t o k o n e v a r a u s j ä r j e s t e l m i i n s ä + t i e t o k o n e v a r a u s j ä r j e s t e l m i ä + t i e t o k o n e v a r a u s j ä r j e s t e l m ä s t ä + t i e t o k o n e v a r a u s j ä r j e s t e l m ä t + t i e t o k o n e v a r u s t e i d e n + t i e t o k o n e v e r k k o + t i e t o k o n e v e r k k o a + t i e t o k o n e v e r k k o j a + t i e t o k o n e v e r k k o j e n + t i e t o k o n e v e r k k o j e n s a + t i e t o k o n e v e r k k o j ä r j e s t e l m ä + t i e t o k o n e v e r k o s s a + t i e t o k o n e v e r k o s t o n + t i e t o k o n e v e r k o t + t i e t o k o n e v e r o t u s t a + t i e t o k o n e v i r h e e s t ä + t i e t o k o n e v i r u k s e t + t i e t o k o n e v i r u k s i s t a + t i e t o k o n e v i r u s + t i e t o k o n e v ä l i n e i s t ö l l ä + t i e t o k o n e v ä l i t t e i n e n + t i e t o k o n e y h t e y k s i e n + t i e t o k o n e y r i t y k s e t + t i e t o k o n f e r e n s s i s s a + t i e t o k o o s t e + t i e t o k u i l u + t i e t o k u i l u n + t i e t o k ö y h i e n + t i e t o l e h t i s e n + t i e t o l e h t i s i ä + t i e t o l i i k e n n e + t i e t o l i i k e n n e a l a a n + t i e t o l i i k e n n e a l a l l a + t i e t o l i i k e n n e a l a n + t i e t o l i i k e n n e a n a l y y s i + t i e t o l i i k e n n e i n f r a s t r u k t u u r i n + t i e t o l i i k e n n e k a a p e l i e n + t i e t o l i i k e n n e k o m i s s i o + t i e t o l i i k e n n e l a i n s ä ä d ä n n ö s s ä + t i e t o l i i k e n n e m a r k k i n a t + t i e t o l i i k e n n e m a r k k i n o i d e n + t i e t o l i i k e n n e m a r k k i n o i h i n + t i e t o l i i k e n n e m a r k k i n o i l l a + t i e t o l i i k e n n e o n g e l m i e n + t i e t o l i i k e n n e o p e r a a t t o r e i l l e + t i e t o l i i k e n n e o p e r a a t t o r i l l a + t i e t o l i i k e n n e p a k e t i n + t i e t o l i i k e n n e p a k e t t i + t i e t o l i i k e n n e p a k e t t i a + t i e t o l i i k e n n e p a k e t t i i n + t i e t o l i i k e n n e p a l v e l u j a + t i e t o l i i k e n n e p a l v e l u j e n + t i e t o l i i k e n n e p a l v e l u t + t i e t o l i i k e n n e s a n k t i o i t a + t i e t o l i i k e n n e s a t e l l i i t i t + t i e t o l i i k e n n e s a t e l l i i t t e i h i n + t i e t o l i i k e n n e s a t e l l i i t t e j a + t i e t o l i i k e n n e s a t e l l i i t t i + t i e t o l i i k e n n e s e k t o r i l l a + t i e t o l i i k e n n e t e k n i i k a n + t i e t o l i i k e n n e t e k n i i k a s t a + t i e t o l i i k e n n e t e k n i i k k a + t i e t o l i i k e n n e t e k n i i k k o j e n + t i e t o l i i k e n n e t e k n o l o g i a + t i e t o l i i k e n n e t e k n o l o g i a a + t i e t o l i i k e n n e t e o l l i s u u d e l l e + t i e t o l i i k e n n e t i e t o j e n + t i e t o l i i k e n n e t t ä + t i e t o l i i k e n n e v e r k k o + t i e t o l i i k e n n e v e r k k o j a + t i e t o l i i k e n n e v e r k k o j e n + t i e t o l i i k e n n e v e r k k o o n + t i e t o l i i k e n n e v e r k o n + t i e t o l i i k e n n e v e r k o t + t i e t o l i i k e n n e y h t e y d e t + t i e t o l i i k e n n e y h t e y k s i i n + t i e t o l i i k e n n e y h t i ö i l t ä + t i e t o l i i k e n n e y r i t y k s i i n + t i e t o l i i k e n t e e n + t i e t o l i i k e n t e e s s ä + t i e t o l o m a k e + t i e t o l o m a k k e i d e n + t i e t o l u o k a t + t i e t o l u o k k a a + t i e t o l u o k k i a + t i e t o l u o k k i i n + t i e t o l ä h d e + t i e t o l ä h d e t t ä + t i e t o l ä h t e e n + t i e t o l ä h t e e n i + t i e t o l ä h t e e n ä + t i e t o l ä h t e e s e e n + t i e t o l ä h t e e s t ä + t i e t o l ä h t e e t + t i e t o l ä h t e i d e n + t i e t o l ä h t e i l l e + t i e t o l ä h t e i n ä + t i e t o l ä h t e i s i i n + t i e t o l ä h t e i s s ä + t i e t o l ä h t e i s t ä + t i e t o l ä h t e i t ä + t i e t o m a h d o l l i s u u k s i s s a + t i e t o m a l l i + t i e t o m a l l i n n u s + t i e t o m a s s a k y s y m y k s e n + t i e t o m a s s o i s t a + t i e t o m a s s o j a + t i e t o m m e + t i e t o m ä ä r i e n + t i e t o m ä ä r i i n + t i e t o m ä ä r i ä + t i e t o m ä ä r ä + t i e t o m ä ä r ä l l ä + t i e t o m ä ä r ä n + t i e t o m ä ä r ä t + t i e t o m ä ä r ä ä + t i e t o n i + t i e t o n s a + t i e t o o n + t i e t o o n n e + t i e t o o n s a + t i e t o p a k e t e i s t a + t i e t o p a k e t i s s a + t i e t o p a k e t t i + t i e t o p a k e t t i a + t i e t o p a l v e l u + t i e t o p a l v e l u i h i n + t i e t o p a l v e l u i s s a + t i e t o p a l v e l u i s t a + t i e t o p a l v e l u i t a + t i e t o p a l v e l u j a + t i e t o p a l v e l u j e n + t i e t o p a l v e l u k e s k u k s e n + t i e t o p a l v e l u s i v u s t o + t i e t o p a l v e l u t + t i e t o p a n k i n + t i e t o p a n k i s t a + t i e t o p a n k i t + t i e t o p a n k k e i h i n + t i e t o p a n k k e j a + t i e t o p a n k k i + t i e t o p a n k k i e n + t i e t o p a n k k i i n + t i e t o p a n k k i j ä r j e s t e l m i ä + t i e t o p a n k k i v e r k o s t o + t i e t o p e r u s t a + t i e t o p e r u s t a i n e n + t i e t o p e r u s t a i s e e n + t i e t o p e r u s t a i s e n + t i e t o p e r u s t a i s e s s a + t i e t o p e r u s t a i s t a + t i e t o p e r u s t e i s e e n + t i e t o p e r u s t e i s e n + t i e t o p i s t e e l l ä + t i e t o p i s t e e n + t i e t o p i s t e e t + t i e t o p i s t e i d e n + t i e t o p i s t e i t ä + t i e t o p o h j a + t i e t o p o h j a a + t i e t o p o h j a a n + t i e t o p o h j a i n e n + t i e t o p o h j a i s e e n + t i e t o p o h j a i s e k s i + t i e t o p o h j a i s e l l e + t i e t o p o h j a i s e n + t i e t o p o h j a i s e n a + t i e t o p o h j a i s e s s a + t i e t o p o h j a i s e s t a + t i e t o p o h j a i s e t + t i e t o p o h j a i s i k s i + t i e t o p o h j a i s t a + t i e t o p o h j a l t a + t i e t o p o h j a n + t i e t o p o h j a n a + t i e t o p o h j a s t a + t i e t o p o l i i s i a + t i e t o p o l i t i i k a n + t i e t o p o l i t i i k k a + t i e t o p o l i t i i k k a a n + t i e t o p o r t a a l i + t i e t o p o r t a a l i n + t i e t o p r o s e s s i e n + t i e t o p y y n n ö i l l ä + t i e t o p y y n n ö i s s ä + t i e t o p y y n n ö i s t ä + t i e t o p y y n n ö n + t i e t o p y y n n ö s s ä + t i e t o p y y n n ö t + t i e t o p y y n t ö + t i e t o p y y n t ö i h i n + t i e t o p y y n t ö j e n + t i e t o p y y n t ö j ä + t i e t o p y y n t ö ä + t i e t o p y y n t ö ö n + t i e t o r a k e n n e + t i e t o r e k i s t e r i + t i e t o r e k i s t e r i t + t i e t o r e s u r s s i t + t i e t o r i k k a i d e n + t i e t o r i k k a i s i i n + t i e t o r i k o l l i s u u d e n + t i e t o r y h m i ä + t i e t o r y h m ä ä + t i e t o s e k t o r i n + t i e t o s i v u + t i e t o s i v u s t o a + t i e t o s o d a n k ä y n n i s s ä + t i e t o s t r a t e g i a + t i e t o s u o j a + t i e t o s u o j a a + t i e t o s u o j a a n + t i e t o s u o j a a n s a + t i e t o s u o j a d i r e k t i i v e j ä + t i e t o s u o j a d i r e k t i i v i + t i e t o s u o j a d i r e k t i i v i i n + t i e t o s u o j a d i r e k t i i v i n + t i e t o s u o j a d i r e k t i i v i s s ä + t i e t o s u o j a d i r e k t i i v i s t ä + t i e t o s u o j a d i r e k t i i v i t + t i e t o s u o j a d i r e k t i i v i ä + t i e t o s u o j a e l i m e t + t i e t o s u o j a j ä r j e s t e l m ä + t i e t o s u o j a j ä r j e s t e l m ä n + t i e t o s u o j a j ä r j e s t e l m ä s t ä + t i e t o s u o j a j ä r j e s t e l m ä t + t i e t o s u o j a j ä r j e s t e l m ä ä + t i e t o s u o j a j ä r j e s t e l y i s t ä + t i e t o s u o j a j ä r j e s t e l y j ä + t i e t o s u o j a j ä r j e s t e l y t + t i e t o s u o j a k a u d e n + t i e t o s u o j a k a u s i + t i e t o s u o j a k a u s i e n + t i e t o s u o j a k a u t t a + t i e t o s u o j a k e h y k s e n + t i e t o s u o j a k e h y s + t i e t o s u o j a k i n + t i e t o s u o j a k o m i t e a n + t i e t o s u o j a k o n f e r e n s s i n + t i e t o s u o j a k y s y m y k s e e n + t i e t o s u o j a k y s y m y k s e n + t i e t o s u o j a k y s y m y k s e t + t i e t o s u o j a k y s y m y k s i i n + t i e t o s u o j a k y s y m y k s i s s ä + t i e t o s u o j a k y s y m y k s i s t ä + t i e t o s u o j a k y s y m y k s i ä + t i e t o s u o j a k ä y t ä n n ö t + t i e t o s u o j a l a i n + t i e t o s u o j a l a i n s ä ä d ä n n ö l l ä + t i e t o s u o j a l a i n s ä ä d ä n n ö n + t i e t o s u o j a l a i n s ä ä d ä n n ö s s ä + t i e t o s u o j a l a i n s ä ä d ä n n ö s s ä m m e + t i e t o s u o j a l a i n s ä ä d ä n t ö + t i e t o s u o j a l a i n s ä ä d ä n t ö m m e + t i e t o s u o j a l a i n s ä ä d ä n t ö ä + t i e t o s u o j a l a i t + t i e t o s u o j a l a i t t e i t a + t i e t o s u o j a l a k e j a + t i e t o s u o j a l a k i + t i e t o s u o j a l a k i e n + t i e t o s u o j a l l a + t i e t o s u o j a l l e + t i e t o s u o j a m e k a n i s m e i s t a + t i e t o s u o j a m e k a n i s m e j a m m e + t i e t o s u o j a m e k a n i s m i t + t i e t o s u o j a m ä ä r ä y k s e t + t i e t o s u o j a m ä ä r ä y k s i i n + t i e t o s u o j a m ä ä r ä y k s i s s ä + t i e t o s u o j a m ä ä r ä y k s i ä + t i e t o s u o j a m ä ä r ä y s t e n + t i e t o s u o j a n + t i e t o s u o j a n a + t i e t o s u o j a n k i n + t i e t o s u o j a n o r m e i s t a + t i e t o s u o j a n o r m e j a + t i e t o s u o j a n o r m i e n + t i e t o s u o j a n o r m i t + t i e t o s u o j a n ä k ö k o h d a t + t i e t o s u o j a n ä k ö k o h t a a + t i e t o s u o j a n ä k ö k o h t i a + t i e t o s u o j a o i k e u d e l l i s e n + t i e t o s u o j a o i k e u d e l l i s i a + t i e t o s u o j a o i k e u d e n + t i e t o s u o j a o i k e u d e t + t i e t o s u o j a o i k e u k s i e n + t i e t o s u o j a o n g e l m a + t i e t o s u o j a o n g e l m a n + t i e t o s u o j a o n g e l m i a + t i e t o s u o j a o n g e l m i e n + t i e t o s u o j a o s u u t t a + t i e t o s u o j a p e r i a a t t e e t + t i e t o s u o j a p e r i a a t t e i d e n + t i e t o s u o j a p e r i a a t t e i s t a + t i e t o s u o j a p e r i a a t t e i t a + t i e t o s u o j a p o l i t i i k a s s a + t i e t o s u o j a p o l i t i i k k a + t i e t o s u o j a p u i t e p ä ä t ö s t ä + t i e t o s u o j a p u i t t e i d e n + t i e t o s u o j a p ä i v ä + t i e t o s u o j a p ä ä t ö k s e n + t i e t o s u o j a r e s u r s s e i h i n + t i e t o s u o j a r i s k i t + t i e t o s u o j a r y h m ä + t i e t o s u o j a r y h m ä n + t i e t o s u o j a r y h m ä n ä + t i e t o s u o j a s i h t e e r i e n + t i e t o s u o j a s o p i m u k s e n + t i e t o s u o j a s o p i m u k s e s s a + t i e t o s u o j a s o p i m u k s e s t a + t i e t o s u o j a s o p i m u s + t i e t o s u o j a s o p i m u s t a + t i e t o s u o j a s s a + t i e t o s u o j a s t a + t i e t o s u o j a s t a n d a r d e j a + t i e t o s u o j a s t a n d a r d i e n + t i e t o s u o j a s t a n d a r d i t + t i e t o s u o j a s y i s t ä + t i e t o s u o j a s ä ä d ö k s i s s ä + t i e t o s u o j a s ä ä d ö s t e n + t i e t o s u o j a s ä ä n n ö i s t ä + t i e t o s u o j a s ä ä n n ö k s e t + t i e t o s u o j a s ä ä n n ö k s i l l e + t i e t o s u o j a s ä ä n n ö k s i s t ä + t i e t o s u o j a s ä ä n n ö k s i ä + t i e t o s u o j a s ä ä n n ö s t e n + t i e t o s u o j a s ä ä n n ö s t ö + t i e t o s u o j a s ä ä n n ö t + t i e t o s u o j a s ä ä n t ö i n e e n + t i e t o s u o j a s ä ä n t ö j e n + t i e t o s u o j a s ä ä n t ö j ä + t i e t o s u o j a s ä ä n t ö n s ä + t i e t o s u o j a t a k e i t a + t i e t o s u o j a t a s o + t i e t o s u o j a t a s o a a n + t i e t o s u o j a t a s o n + t i e t o s u o j a t e h t ä v ä t + t i e t o s u o j a t e k n i s i ä + t i e t o s u o j a t o i m e n p i d e t t ä + t i e t o s u o j a t o i m e n p i t e i d e n + t i e t o s u o j a t o i m e n p i t e i t ä + t i e t o s u o j a t o i m e t + t i e t o s u o j a t o i m i e n + t i e t o s u o j a t o i m i s t a + t i e t o s u o j a t y ö r y h m ä + t i e t o s u o j a t y ö r y h m ä n + t i e t o s u o j a t y ö r y h m ä ä + t i e t o s u o j a v a a t i m u k s e t + t i e t o s u o j a v a a t i m u k s i a + t i e t o s u o j a v a a t i m u s t e n + t i e t o s u o j a v a l t u u s k u n t a + t i e t o s u o j a v a l t u u t e t t u + t i e t o s u o j a v a l t u u t e t t u a + t i e t o s u o j a v a l t u u t e t t u j a + t i e t o s u o j a v a l t u u t e t t u j e n + t i e t o s u o j a v a l t u u t e t t u n a + t i e t o s u o j a v a l t u u t e t t u u n + t i e t o s u o j a v a l t u u t e t u i l l e + t i e t o s u o j a v a l t u u t e t u l l a + t i e t o s u o j a v a l t u u t e t u l l e + t i e t o s u o j a v a l t u u t e t u l t a + t i e t o s u o j a v a l t u u t e t u n + t i e t o s u o j a v a l t u u t e t u s t a + t i e t o s u o j a v a l t u u t e t u t + t i e t o s u o j a v e l v o i t t e e t + t i e t o s u o j a v i r a n o m a i n e n + t i e t o s u o j a v i r a n o m a i s e l l a + t i e t o s u o j a v i r a n o m a i s e n + t i e t o s u o j a v i r a n o m a i s e t + t i e t o s u o j a v i r a n o m a i s e t k a a n + t i e t o s u o j a v i r a n o m a i s i a + t i e t o s u o j a v i r a n o m a i s i i n + t i e t o s u o j a v i r a n o m a i s i l l a + t i e t o s u o j a v i r a n o m a i s i l l e + t i e t o s u o j a v i r a n o m a i s i s t a + t i e t o s u o j a v i r a n o m a i s t a + t i e t o s u o j a v i r a n o m a i s t e n + t i e t o s u o j a v ä l i n e + t i e t o s u o j a v ä l i n e e s t ä + t i e t o s u o j a v ä l i n e i d e n + t i e t o s u o j a v ä l i n e t t ä + t i e t o s u o j a y h t e i s t y ö t ä + t i e t o s u o v a a t i m u k s i a m m e + t i e t o t a i d o n + t i e t o t a i t o + t i e t o t a i t o a + t i e t o t a i t o a a n + t i e t o t a i t o m m e + t i e t o t a l o u d e k s i + t i e t o t a l o u d e n + t i e t o t a l o u d e s s a + t i e t o t a l o u s + t i e t o t a l o u t e e n + t i e t o t a l o u t t a + t i e t o t a r p e e s e e n + t i e t o t a s o + t i e t o t a u l u j a + t i e t o t a u l u t + t i e t o t e k i j ä t + t i e t o t e k n i i k a l l a + t i e t o t e k n i i k a n + t i e t o t e k n i i k a s s a + t i e t o t e k n i i k a s t a + t i e t o t e k n i i k a t + t i e t o t e k n i i k k a + t i e t o t e k n i i k k a a + t i e t o t e k n i i k k a a n + t i e t o t e k n i i k k a h a n k e t t a + t i e t o t e k n i i k k a h a n k i n t o j a + t i e t o t e k n i i k k a h a n k k e e n + t i e t o t e k n i i k k a h a n k k e i t a + t i e t o t e k n i i k k a i n f r a s t r u k t u u r i + t i e t o t e k n i i k k a i n f r a s t r u k t u u r i e n + t i e t o t e k n i i k k a i n f r a s t r u k t u u r i n k i n + t i e t o t e k n i i k k a i n f r a s t r u k t u u r i s t a + t i e t o t e k n i i k k a i n s i n ö ö r e j ä + t i e t o t e k n i i k k a j ä r j e s t e l m i e n + t i e t o t e k n i i k k a j ä r j e s t e l m i ä + t i e t o t e k n i i k k a j ä r j e s t e l m ä + t i e t o t e k n i i k k a j ä r j e s t e l m ä m m e + t i e t o t e k n i i k k a j ä r j e s t e l m ä n + t i e t o t e k n i i k k a k e s k u s t e l u j e n + t i e t o t e k n i i k k a k o k o o n p a n o a a n + t i e t o t e k n i i k k a k o u l u t u k s e e n + t i e t o t e k n i i k k a k u s t a n n u k s e t + t i e t o t e k n i i k k a l a i t t e e t + t i e t o t e k n i i k k a l a i t t e i d e n + t i e t o t e k n i i k k a l e h d i s t ä + t i e t o t e k n i i k k a m a a i l m a + t i e t o t e k n i i k k a m a r k k i n o i d e n + t i e t o t e k n i i k k a o h j e l m a + t i e t o t e k n i i k k a o h j e l m a n + t i e t o t e k n i i k k a o h j e l m i i n + t i e t o t e k n i i k k a o p i n t o j e n + t i e t o t e k n i i k k a p a l v e l u j e n + t i e t o t e k n i i k k a p a l v e l u t + t i e t o t e k n i i k k a p o l i t i i k k a a n s a + t i e t o t e k n i i k k a r i k o l l i s u u s + t i e t o t e k n i i k k a s o p i m u k s e n + t i e t o t e k n i i k k a s o p i m u k s e s s a + t i e t o t e k n i i k k a s o p i m u s t a + t i e t o t e k n i i k k a s u u n n i t e l m a n + t i e t o t e k n i i k k a t a i d o t + t i e t o t e k n i i k k a t a i t o j a + t i e t o t e k n i i k k a t a i t o j e n + t i e t o t e k n i i k k a t a i t o k ä s i t t e e n + t i e t o t e k n i i k k a t e o l l i s u u d e n + t i e t o t e k n i i k k a t u o t t e i d e n + t i e t o t e k n i i k k a t u o t t e i t a + t i e t o t e k n i i k k a v i r a s t o + t i e t o t e k n i i k k a y k s i k k ö + t i e t o t e k n i i k k a y r i t y k s i s s ä + t i e t o t e k n i i k k a y r i t y s t e n + t i e t o t e k n i i k k o j a + t i e t o t e k n i i k k o j e n + t i e t o t e k n i i k o i d e n + t i e t o t e k n i i k o i h i n + t i e t o t e k n i i k o i s t a + t i e t o t e k n i i k o i t a + t i e t o t e k n i k o t + t i e t o t e k n i s e n + t i e t o t e k n i s i ä + t i e t o t e k n i s t e n + t i e t o t e k n o l o g i a + t i e t o t e k n o l o g i a a + t i e t o t e k n o l o g i a a n + t i e t o t e k n o l o g i a n + t i e t o t e k n o l o g i a s s a + t i e t o t e k n o l o g i a s t a + t i e t o t e k n o l o g i a t + t i e t o t e k n o l o g i a t e o l l i s u u t t a + t i e t o t e k n o l o g i o i d e n + t i e t o t e k n o l o g i o i s t a + t i e t o t e k n o l o g i o i t a + t i e t o t e k n o l o g i s e t + t i e t o t e o l l i s u u d e n + t i e t o t e o l l i s u u d e s t a + t i e t o t e o l l i s u u t t a + t i e t o t o i m i s t o + t i e t o t o i m i s t o j e n + t i e t o t o i m i s t o n + t i e t o t u k e a + t i e t o t u l v a + t i e t o t u l v a a + t i e t o t u l v a a n + t i e t o t u l v a s t a + t i e t o t u o j a + t i e t o t u o t t e e t + t i e t o t u o t t e i d e n + t i e t o t u o t t e i t a + t i e t o t u r v a + t i e t o t u r v a a + t i e t o t u r v a a n + t i e t o t u r v a h y ö k k ä y k s i ä + t i e t o t u r v a j o h t a j a + t i e t o t u r v a j ä r j e s t e l m i ä + t i e t o t u r v a j ä r j e s t e l m ä m m e + t i e t o t u r v a k u l t t u u r i + t i e t o t u r v a k y s y m y k s e e n + t i e t o t u r v a k y s y m y s + t i e t o t u r v a l l i s u u d e n + t i e t o t u r v a l l i s u u d e s t a + t i e t o t u r v a l l i s u u s + t i e t o t u r v a l l i s u u s v i r a s t o s t a + t i e t o t u r v a l l i s u u t e e n + t i e t o t u r v a l l i s u u t t a + t i e t o t u r v a l o u k k a u k s e s t a + t i e t o t u r v a l o u k k a u k s i a + t i e t o t u r v a l o u k k a u k s i e n + t i e t o t u r v a l o u k k a u k s i s t a + t i e t o t u r v a l o u k k a u s t e n + t i e t o t u r v a n + t i e t o t u r v a o n g e l m a a n + t i e t o t u r v a o n g e l m a t + t i e t o t u r v a o n g e l m i e n + t i e t o t u r v a s s a + t i e t o t u r v a s t a + t i e t o t u r v a t o i m i e n + t i e t o t u r v a v a a t i m u k s i a + t i e t o t u r v a v e r k o s t o a + t i e t o t u r v a v i r a s t o + t i e t o t u r v a v i r a s t o a + t i e t o t u r v a v i r a s t o m m e + t i e t o t u r v a v i r a s t o n + t i e t o t y y p i t + t i e t o t y y p p i + t i e t o t y ö k a l u j a + t i e t o u t t a + t i e t o v a a t i m u k s e t + t i e t o v a a t i m u k s i a + t i e t o v a a t i m u k s i i n + t i e t o v a a t i m u s + t i e t o v a a t i m u s t e n + t i e t o v a i h d o n + t i e t o v a i h t o j ä r j e s t e l m ä + t i e t o v a j a u k s i a + t i e t o v a j e + t i e t o v a j e e s e e n + t i e t o v a j e e s t a + t i e t o v a j e t t a + t i e t o v a l k a m a + t i e t o v a l l a n k u m o u k s e n + t i e t o v a l t a i s e m m a k s i + t i e t o v a l t a i s e n + t i e t o v a l t a i s i a + t i e t o v a r a n t o a + t i e t o v e r k k o + t i e t o v e r k k o a + t i e t o v e r k k o h u i j a r e i d e n + t i e t o v e r k k o h y ö k k ä y k s e n + t i e t o v e r k k o h y ö k k ä y k s e t + t i e t o v e r k k o h y ö k k ä y k s i l t ä + t i e t o v e r k k o h y ö k k ä y k s i ä + t i e t o v e r k k o h y ö k k ä y s t e n + t i e t o v e r k k o i h i n + t i e t o v e r k k o j a + t i e t o v e r k k o j e n + t i e t o v e r k k o j ä r j e s t e l m ä s t ä + t i e t o v e r k k o o n + t i e t o v e r k k o r i k o l l i s u u d e l t a + t i e t o v e r k k o r i k o l l i s u u d e n + t i e t o v e r k k o r i k o l l i s u u d e s t a + t i e t o v e r k k o r i k o l l i s u u s f o o r u m i n + t i e t o v e r k k o r i k o l l i s u u t t a + t i e t o v e r k k o r i k o s t a p a u k s i s t a + t i e t o v e r k k o t e r r o r i s m i + t i e t o v e r k k o t u l e v a i s u u t e e n + t i e t o v e r k k o t u o m i o i s t u i n + t i e t o v e r k k o t u r v a l l i s u u d e n + t i e t o v e r k k o t u r v a l l i s u u d e s t a + t i e t o v e r k k o t u r v a l l i s u u s + t i e t o v e r k k o t u r v a l l i s u u t e e n + t i e t o v e r k k o u h k a t + t i e t o v e r k k o u h k i a + t i e t o v e r k k o v a k o i l u a + t i e t o v e r k o i s s a + t i e t o v e r k o i s t a + t i e t o v e r k o k s i + t i e t o v e r k o n + t i e t o v e r k o s t o i h i n + t i e t o v e r k o s t o n + t i e t o v e r k o t + t i e t o v i r r a l l e + t i e t o v i r r a n + t i e t o v i r r a t + t i e t o v i r t a + t i e t o v i r t a a + t i e t o v i r t o j a + t i e t o v u o d o t + t i e t o v u o r i a + t i e t o v u o t o + t i e t o v u o t o i h i n + t i e t o v u o t o j a + t i e t o v ä l i n e e t + t i e t o v ä l i n e i d e n + t i e t o v ä l i n e i t ä m m e + t i e t o v ä l i n e t t ä + t i e t o y h t e i s k u n n a k s i + t i e t o y h t e i s k u n n a l l a + t i e t o y h t e i s k u n n a l l e + t i e t o y h t e i s k u n n a l t a + t i e t o y h t e i s k u n n a n + t i e t o y h t e i s k u n n a s s a + t i e t o y h t e i s k u n n a s t a + t i e t o y h t e i s k u n t a + t i e t o y h t e i s k u n t a a + t i e t o y h t e i s k u n t a a m m e + t i e t o y h t e i s k u n t a a n + t i e t o y h t e i s k u n t a f o o r u m i + t i e t o y h t e i s k u n t a f o o r u m i a + t i e t o y h t e i s k u n t a h a n k k e i s i i n + t i e t o y h t e i s k u n t a h u i p p u k o k o u k s e n + t i e t o y h t e i s k u n t a h u i p p u k o k o u k s e s s a + t i e t o y h t e i s k u n t a h u i p p u k o k o u k s i i n + t i e t o y h t e i s k u n t a h u i p p u k o k o u k s i s s a + t i e t o y h t e i s k u n t a h u i p p u k o k o u s + t i e t o y h t e i s k u n t a k e s k u s t e l u s s a + t i e t o y h t e i s k u n t a k o m i t e a + t i e t o y h t e i s k u n t a m a i l l e + t i e t o y h t e i s k u n t a m m e + t i e t o y h t e i s k u n t a n a + t i e t o y h t e i s k u n t a p a k e t i s s a + t i e t o y h t e i s k u n t a p a l v e l u i s s a + t i e t o y h t e i s k u n t a p a l v e l u j e n + t i e t o y h t e i s k u n t a p a l v e l u t + t i e t o y h t e i s k u n t a p o l i t i i k k a a + t i e t o y h t e i s k u n t a s u u n n i t e l m a n + t i e t o y h t e i s k u n t a t a l o u s + t i e t o y h t e i s k u n t a t e k n i i k k a a + t i e t o y h t e i s k u n t a t e k n i i k k a o h j e l m a + t i e t o y h t e i s k u n t a t e k n i i k o i t a + t i e t o y h t e i s k u n t a y h t e y k s i s s ä + t i e t o y h t e i s ö j e n + t i e t o y h t e y k s i ä + t i e t o y k s i k ö i d e n + t i e t o y k s i k ö k s i + t i e t t y i h i n + t i e t t y i n ä + t i e t t y j e n + t i e t t y j ä + t i e t t y n ä + t i e t t y y n + t i e t t y ä + t i e t u l l e i s t a + t i e t u l l e j a + t i e t u l l i + t i e t u l l i a s e m a a + t i e t u l l i a s e m i l l a + t i e t u l l i e n + t i e t u l l i j ä r j e s t e l m i e n + t i e t u l l i j ä r j e s t e l m ä t + t i e t u l l i m a k s u + t i e t u l l i n + t i e t u l l i t + t i e t u l l i t u l o i s t a + t i e t u n n e l i + t i e t u r v a l l i s u u d e l l e + t i e t u r v a l l i s u u d e n + t i e t u r v a l l i s u u d e s s a + t i e t u r v a l l i s u u d e s t a + t i e t u r v a l l i s u u s + t i e t u r v a l l i s u u s a l u e + t i e t u r v a l l i s u u s a s i a + t i e t u r v a l l i s u u s a s i a n t u n t i j a t + t i e t u r v a l l i s u u s a s i a s s a + t i e t u r v a l l i s u u s a s i o i d e n + t i e t u r v a l l i s u u s a s i o i s s a + t i e t u r v a l l i s u u s a s i o i t a + t i e t u r v a l l i s u u s h a n k k e i s i i m m e + t i e t u r v a l l i s u u s i n f r a s t r u k t u u r i s t a + t i e t u r v a l l i s u u s k a m p a n j a a n + t i e t u r v a l l i s u u s k a m p a n j o i d e n + t i e t u r v a l l i s u u s k a m p a n j o i t a + t i e t u r v a l l i s u u s k y s y m y k s e s s ä + t i e t u r v a l l i s u u s m ä ä r ä y s t e n + t i e t u r v a l l i s u u s o l o s u h t e i d e n + t i e t u r v a l l i s u u s p o l i t i i k a l l e + t i e t u r v a l l i s u u s p o l i t i i k a n + t i e t u r v a l l i s u u s p ä i v ä n ä + t i e t u r v a l l i s u u s s t a n d a r d i e n + t i e t u r v a l l i s u u s s t a n d a r d i t + t i e t u r v a l l i s u u s s t r a t e g i a s s a + t i e t u r v a l l i s u u s s t r a t e g i a s t a + t i e t u r v a l l i s u u s t i l a n n e t t a + t i e t u r v a l l i s u u s t i l a n t e e s s a + t i e t u r v a l l i s u u s t i l a s t o t + t i e t u r v a l l i s u u s t o i m e n p i d e + t i e t u r v a l l i s u u s t o i m i a + t i e t u r v a l l i s u u s t o i m i n t a s u u n n i t e l m a a + t i e t u r v a l l i s u u s v i i k o n + t i e t u r v a l l i s u u t e e n + t i e t u r v a l l i s u u t t a + t i e t y i l l e + t i e t y i l l ä + t i e t y i l t ä + t i e t y i n + t i e t y i s s ä + t i e t y i s t ä + t i e t y l l e + t i e t y l l ä + t i e t y l t ä + t i e t y m ä t t ö m i l l ä + t i e t y n + t i e t y n a s t e i n e n + t i e t y n a s t e i s e e n + t i e t y n a s t e i s e n + t i e t y n a s t e i s t a + t i e t y n l a i s e l l a + t i e t y n l a i s e l l e + t i e t y n l a i s e n + t i e t y n l a i s e n a + t i e t y n l a i s e s s a + t i e t y n l a i s e s t a + t i e t y n l a i s e t + t i e t y n l a i s i a + t i e t y n l a i s i i n + t i e t y n l a i s i l l a + t i e t y n l a i s i l l e + t i e t y n l a i s i l t a + t i e t y n l a i s i s t a + t i e t y n l a i s t a + t i e t y n l a i s t e n + t i e t y n t y y p p i n e n + t i e t y n t y y p p i s e e n + t i e t y n t y y p p i s e n + t i e t y n t y y p p i s e s t ä + t i e t y n t y y p p i s e t + t i e t y n t y y p p i s i i n + t i e t y n t y y p p i s i l l e + t i e t y n t y y p p i s i l l ä + t i e t y n t y y p p i s i s s ä + t i e t y n t y y p p i s i s t ä + t i e t y n t y y p p i s i ä + t i e t y n t y y p p i s t e n + t i e t y n t y y p p i s t ä + t i e t y s s ä + t i e t y s t i k ä ä n + t i e t y s t ä + t i e t y t + t i e t y ö t + t i e t ä + t i e t ä e n + t i e t ä e s s ä ä n + t i e t ä k ä ä + t i e t ä m y k s e n + t i e t ä m y k s e n h a l l i n t a + t i e t ä m y k s e s s ä + t i e t ä m y s i n t e n s i i v i s i l l ä + t i e t ä m y s p o h j a i s e n + t i e t ä m y s t ä + t i e t ä m y s t ä m m e + t i e t ä m y s t ä ä n + t i e t ä m ä t t ä + t i e t ä m ä t t ä m m e + t i e t ä m ä t t ä n i + t i e t ä m ä t t ä ä n + t i e t ä m ä t t ö m i ä + t i e t ä m ä t t ö m y y d e n + t i e t ä m ä t t ö m y y d e s t ä + t i e t ä m ä t t ö m y y t e e n + t i e t ä m ä t t ö m y y t t ä + t i e t ä m ä ä n + t i e t ä n e e + t i e t ä n e t t e + t i e t ä n e t t e k i n + t i e t ä n i + t i e t ä v ä n + t i e t ä v ä t + t i e t ä v ä t k i n + t i e t ä ä + t i e t ä ä k i n + t i e t ä ä k s e m m e + t i e t ä ä k s e n i + t i e t ä ä k ö + t i e t ä ä n + t i e t ö i l l ä + t i e t ö i t ä + t i e v a l a i s i m i e n + t i e v a r s i t a r k a s t u s t e n + t i e v a s t a i s t a + t i e v e r k k o + t i e v e r k k o a + t i e v e r k k o i h i n + t i e v e r k k o j e n + t i e v e r k k o m m e + t i e v e r k k o o n + t i e v e r k o i s t a + t i e v e r k o l l e + t i e v e r k o n + t i e v e r k o s s a + t i e v e r k o s t o + t i e v e r k o s t o a + t i e v e r k o s t o a m m e + t i e v e r k o s t o j a + t i e v e r k o s t o j e n + t i e v e r k o s t o m m e + t i e v e r k o s t o n + t i e v e r k o s t o o n + t i e v e r k o s t o s s a + t i e v e r k o s t o s t a + t i e v e r k o t + t i e v e r o + t i e v e r o a + t i e v e r o n + t i e v e r o o n + t i e v e r o t + t i e y h t e y d e t + t i e y h t e y k s i e n + t i e y h t e y t t ä + t i h e i k k ö b u l b u l i + t i h e i k k ö k e r t t u + t i h e i k k ö l a u l a j a + t i h e i k k ö l e p i n k ä i n e n + t i h e i k k ö m e t s ä k e r t t u n e n + t i h e i m m i n + t i h e y s f u n k t i o n a a l i t e o r i a + t i h e y s k o r k e u s + t i h e y s l a u s e + t i h e y s m a t r i i s i + t i h e ä m m i n + t i h e ä m m ä t + t i h e ä m p i ä + t i h u t ö i d e n + t i i b e t i i n + t i i b e t i l ä i s e n + t i i b e t i l ä i s e t + t i i b e t i l ä i s i i n + t i i b e t i l ä i s i l l e + t i i b e t i l ä i s i l l ä + t i i b e t i l ä i s i ä + t i i b e t i l ä i s k u l t t u u r i n + t i i b e t i l ä i s m u n k i l l e + t i i b e t i l ä i s m u n k i n + t i i b e t i l ä i s m u n k k i + t i i b e t i l ä i s m u n k k i a + t i i b e t i l ä i s p a k o l a i s e t + t i i b e t i l ä i s p a k o l a i s i a + t i i b e t i l ä i s p a k o l a i s t e n + t i i b e t i l ä i s r y h m i ä + t i i b e t i l ä i s r y h m ä ä + t i i b e t i l ä i s t e n + t i i b e t i l ä i s v ä h e m m i s t ö n + t i i b e t i l ä i s v ä h e m m i s t ö ä + t i i b e t i l ä i s y h t e i s ö l l e + t i i b e t i l ä i s y h t e i s ö n + t i i b e t i l ä i s y h t e i s ö ö n + t i i b e t i n + t i i b e t i n a n t i l o o p p i + t i i b e t i n h a n h i + t i i b e t i n k a i j a + t i i b e t i n k i u r u + t i i b e t i n l e p i n k ä i n e n + t i i b e t i n l o k k i + t i i b e t i n m a s t i f f i + t i i b e t i n s i r k k u + t i i b e t i n s p a n i e l i + t i i b e t i n s u s i + t i i b e t i n t e r r i e r i + t i i b e t i n u u n i l i n t u + t i i b e t i n v u o r i p e i p p o + t i i b e t i s s ä + t i i b e t i s t ä + t i i b e t i ä + t i i k e l i p a i n o k o n e + t i i k e r e i t ä + t i i k e r i a h v e n + t i i k e r i b a r b i + t i i k e r i h a i + t i i k e r i h a i t + t i i k e r i h i l l e r i + t i i k e r i h y t t y n e n + t i i k e r i k o t i l o + t i i k e r i k ä ä r m e + t i i k e r i l a p a m o n n i + t i i k e r i l e p i n k ä i n e n + t i i k e r i l i l j a + t i i k e r i n k i r j a v a + t i i k e r i n m e t s ä s t y k s e e n + t i i k e r i n s i l m ä + t i i k e r i n u o l i a i n e n + t i i k e r i n ä + t i i k e r i p e i p p o l e s k i + t i i k e r i p u s s i k i s s a + t i i k e r i p y t o n + t i i k e r i s a l a m a n t e r i + t i i k e r i t + t i i k e r i v a l m u s k a + t i i k e r i v a l t i o i s t a + t i i k e r i v e l j e k s e t + t i i k e r i ä + t i i l i k a u p u n g i n + t i i l i s e i n ä l l e + t i i l i s e i n ä ä + t i i l i t a l o j a + t i i l i ä + t i i m a l a s i d e l f i i n i + t i i m a l a s i s u m u + t i i m i h e n g e s s ä + t i i m i o p p i m i n e n + t i i m i t y ö n + t i i m i t y ö s k e n t e l y n + t i i m i t y ö s k e n t e l y s t ä + t i i m i t y ö s t ä + t i i m i t y ö t ä + t i i r a l o k k i + t i i s t a i a a m u i s i n + t i i s t a i a a m u k s i + t i i s t a i a a m u n a + t i i s t a i n + t i i s t a i n a + t i i s t a i y ö n ä + t i i v i i d e n + t i i v i i l l ä + t i i v i i m m i n + t i i v i i m m ä k s i + t i i v i i m m ä l l e + t i i v i i m m ä l l ä + t i i v i i m m ä n + t i i v i i m m ä s s ä + t i i v i i m m ä s t ä + t i i v i i m m ä t + t i i v i i m p i + t i i v i i m p i e n + t i i v i i m p i i n + t i i v i i m p i ä + t i i v i i m p ä ä + t i i v i i m p ä ä n + t i i v i i n + t i i v i i s e e n + t i i v i i s s ä + t i i v i i s t ä + t i i v i i t + t i i v i i t ä + t i i v i s t e a i n e + t i i v i s t e a i n e t t a + t i i v i s t e l m i i n + t i i v i s t e l m i ä + t i i v i s t e l m ä a n a l y y s i + t i i v i s t e l m ä k e r t o m u s + t i i v i s t e l m ä n + t i i v i s t e l m ä r a p o r t t i + t i i v i s t e l m ä s s ä + t i i v i s t e l m ä t a u l u k o i t a + t i i v i s t e l m ä ä + t i i v i s t e t t i i n + t i i v i s t e t t y j e n + t i i v i s t e t t y j ä + t i i v i s t e t t y n ä + t i i v i s t e t y m p i + t i i v i s t e t y n + t i i v i s t e t ä + t i i v i s t i + t i i v i s t y m i s y d i n + t i i v i s t y m ä s s ä + t i i v i s t y v ä t + t i i v i s t y y + t i i v i s t y ä + t i i v i s t ä e s s ä ä n + t i i v i s t ä m i s e e n + t i i v i s t ä m i s e k s i + t i i v i s t ä m i s e l l e + t i i v i s t ä m i s e n + t i i v i s t ä m i s e s s ä + t i i v i s t ä m i s e s t ä + t i i v i s t ä m i s t ä + t i i v i s t ä m ä l l ä + t i i v i s t ä m ä ä n + t i i v i s t ä ä + t i i v i s t ä ä k s e e n + t i i v i s t ä ä k s e m m e + t i i v i s t ä ä k s e n i + t i k a p u u h e r m o s t o + t i k a r i a + t i k a s m i e t i n t ö n ä + t i k a s m y l l y t + t i k i t t ä v ä + t i k i t t ä ä + t i k k a b u l b u l i + t i k k a k i p u a j a + t i k k a s i r k k u + t i k k i p e l i + t i l a a j a l i i t t y m i e n + t i l a a j a l u e t t e l o i t a + t i l a a j a v e r k k o j e n + t i l a a j a y h t e y d e t + t i l a a j a y h t e y k s i e n + t i l a a j a y h t e y k s i s s ä + t i l a a j a y h t e y k s i s t ä + t i l a a j a y h t e y k s i ä + t i l a a n + t i l a h i n t o j a + t i l a i s u u d e n + t i l a i s u u d e s s a + t i l a i s u u d e s t a + t i l a i s u u k s i a + t i l a i s u u k s i i n + t i l a i s u u k s i s s a + t i l a i s u u t e e n + t i l a i s u u t e m m e + t i l a i s u u t e n a + t i l a i s u u t e n s a + t i l a i s u u t t a + t i l a k a a v i o + t i l a k i i n t i ö t ä ä n + t i l a k o h t a i n e n + t i l a k o h t a i s e n + t i l a k o h t a i s e s t a + t i l a k o h t a i s i l l e + t i l a k o h t a i s t a + t i l a k o k o + t i l a l ä m m i t t i m i e n + t i l a m u s i i k k i + t i l a n + t i l a n h o i t a j i e n + t i l a n j a k o j ä r j e s t e l m i e n + t i l a n j a t k a j i e n + t i l a n j a t k a m i s k r i i s i + t i l a n k ä y t t ö ä + t i l a n n e a n a l y y s i + t i l a n n e a n a l y y s i n + t i l a n n e a r v i o + t i l a n n e a r v i o i n t i r a p o r t i s s a + t i l a n n e a r v i o l l e + t i l a n n e a r v i o m m e + t i l a n n e a r v i o n + t i l a n n e a r v i o o n s a + t i l a n n e a r v i o r a p o r t i s s a + t i l a n n e a r v i o s t a + t i l a n n e a r v i o t + t i l a n n e a r v i o t a + t i l a n n e h a n + t i l a n n e k a r t o i t u s + t i l a n n e k a r t o i t u s t a + t i l a n n e k a t s a u k s e e n + t i l a n n e k a t s a u k s e n + t i l a n n e k a t s a u k s e s s a + t i l a n n e k a t s a u k s e s s a a n + t i l a n n e k a t s a u k s e s t a + t i l a n n e k a t s a u s + t i l a n n e k a t s a u s t a + t i l a n n e k e r t o m u k s e n + t i l a n n e k e r t o m u k s e s s a + t i l a n n e k e r t o m u k s i a + t i l a n n e k e r t o m u s + t i l a n n e k e r t o m u s t a + t i l a n n e k e s k u k s e n + t i l a n n e k e s k u k s e s t a + t i l a n n e k e s k u k s i a + t i l a n n e k e s k u s + t i l a n n e k e s k u s t a + t i l a n n e k o h t a i s e t + t i l a n n e k o h t a i s i a + t i l a n n e k u v a + t i l a n n e k u v a u k s e n i + t i l a n n e k u v a u k s e s t a a n + t i l a n n e k u v a u s + t i l a n n e r a p o r t i s s a a n + t i l a n n e r a p o r t t e j a + t i l a n n e r a p o r t t i + t i l a n n e r a p o r t t i i n + t i l a n n e s e l v i t y k s e n + t i l a n n e s e l v i t y s + t i l a n n e t t a + t i l a n n e t t a m m e + t i l a n n e v a l v o n t a a n + t i l a n o m i s t a j i e n + t i l a n o m i s t a j i s t a + t i l a n p i t o a + t i l a n p i t ä j i e n + t i l a n p u u t t e e n + t i l a n p u u t t e e s t a + t i l a n t a r k a s t u s t u o m i o i s t u i m e n + t i l a n t e e l l e + t i l a n t e e l t a + t i l a n t e e l t a a n + t i l a n t e e m m e + t i l a n t e e n + t i l a n t e e n k a r t o i t u s v a l t u u s k u n n a n + t i l a n t e e n s a + t i l a n t e e s e e n + t i l a n t e e s e e n s a + t i l a n t e e s s a + t i l a n t e e s s a a n + t i l a n t e e s t a + t i l a n t e e s t a a n + t i l a n t e e s t a m m e + t i l a n t e e t + t i l a n t e i d e n + t i l a n t e i l l a + t i l a n t e i l t a + t i l a n t e i s i i n + t i l a n t e i s s a + t i l a n t e i s t a + t i l a n t e i t a + t i l a n y h t ä l ö + t i l a p ä i n e n + t i l a p ä i s d i r e k t i i v i + t i l a p ä i s e e n + t i l a p ä i s e e n k i n + t i l a p ä i s e l l e + t i l a p ä i s e l t ä + t i l a p ä i s e n + t i l a p ä i s e n ä + t i l a p ä i s e s s ä + t i l a p ä i s e s t i + t i l a p ä i s e s t ä + t i l a p ä i s e t + t i l a p ä i s h a l l i n t o + t i l a p ä i s h ö k k e l i t + t i l a p ä i s i i n + t i l a p ä i s i k s i + t i l a p ä i s i l l ä + t i l a p ä i s i n + t i l a p ä i s i s s ä + t i l a p ä i s i s t ä + t i l a p ä i s i ä + t i l a p ä i s j ä r j e s t e l m ä + t i l a p ä i s j ä r j e s t e l y + t i l a p ä i s j ä r j e s t e l y i h i n + t i l a p ä i s j ä r j e s t e l y i l l ä + t i l a p ä i s j ä r j e s t e l y j ä + t i l a p ä i s j ä r j e s t e l y l l ä + t i l a p ä i s j ä r j e s t e l y y n + t i l a p ä i s k e s k u k s i a + t i l a p ä i s k e s k u s t e n + t i l a p ä i s k o a l i t i o i s t a + t i l a p ä i s k o k e i l u + t i l a p ä i s k o m i t e a n + t i l a p ä i s l u o n t e i s t e n + t i l a p ä i s m a j o i t u k s e s s a + t i l a p ä i s m e n e t t e l y l l ä + t i l a p ä i s m e n e t t e l y n ä + t i l a p ä i s r a h a s t o j a + t i l a p ä i s r a t k a i s u + t i l a p ä i s r a t k a i s u i h i n + t i l a p ä i s r a t k a i s u i l l a + t i l a p ä i s r a t k a i s u j a + t i l a p ä i s r a t k a i s u j e n + t i l a p ä i s r a t k a i s u l l a + t i l a p ä i s r a t k a i s u n + t i l a p ä i s r a t k a i s u t + t i l a p ä i s r e a k t i o i d e n + t i l a p ä i s s a t a m i a + t i l a p ä i s s o p i m u k s i a + t i l a p ä i s s u o j a s t a + t i l a p ä i s s u o j i a + t i l a p ä i s t e n + t i l a p ä i s t o i m e n p i t e i s t ä + t i l a p ä i s t o i m e n p i t e i t ä + t i l a p ä i s t o i m i + t i l a p ä i s t o i m i a + t i l a p ä i s t o i m i e n + t i l a p ä i s t o i m i s t a + t i l a p ä i s t y ö + t i l a p ä i s t y ö h ö n + t i l a p ä i s t y ö n + t i l a p ä i s t y ö n t e k i j ä t + t i l a p ä i s t y ö n t e k i j ö i d e n + t i l a p ä i s t y ö n t e k i j ö i l l ä + t i l a p ä i s t y ö n t e k i j ö i t ä + t i l a p ä i s t y ö r y h m i ä + t i l a p ä i s t y ö s s ä + t i l a p ä i s t y ö s t ä + t i l a p ä i s t y ö t ä + t i l a p ä i s t y ö v o i m a a + t i l a p ä i s t y ö v o i m a n + t i l a p ä i s t ä + t i l a p ä i s t ö i t ä + t i l a p ä i s v a r a s t o i s s a + t i l a p ä i s v e n e i t ä + t i l a r a j o i t u k s e t + t i l a r a k e n t e e m m e + t i l a r a k e n t e i d e n + t i l a s i + t i l a s s a + t i l a s t a + t i l a s t a a n + t i l a s t o a + t i l a s t o a i h e e s e e n + t i l a s t o a l a l l a + t i l a s t o a l o i t t e i s i i n + t i l a s t o a n a l y y s i + t i l a s t o a n a l y y s i e n + t i l a s t o a n a l y y s i n + t i l a s t o a r v i o i d e n + t i l a s t o a s i a n t u n t i j o i d e n + t i l a s t o a s i a n t u n t i j o i s t a + t i l a s t o h a i t o i s t a + t i l a s t o h a l l i n n o i n n i n + t i l a s t o h a l l i n n o i n t i a + t i l a s t o i h i n + t i l a s t o i l l a + t i l a s t o i n d i k a a t t o r e i t a + t i l a s t o i n d i k a a t t o r i t + t i l a s t o i n n i s t a + t i l a s t o i n s t i t u u t i n + t i l a s t o i n t i a + t i l a s t o i n t i i n + t i l a s t o i n t i j ä r j e s t e l m ä + t i l a s t o i n t i j ä r j e s t e l m ä s t ä + t i l a s t o i n t i j ä r j e s t e l m ä ä + t i l a s t o i n t i m e n e t e l m i ä + t i l a s t o i n t i o n g e l m i a + t i l a s t o i n t i p a l v e l u + t i l a s t o i n t i p a l v e l u a + t i l a s t o i n t i p a l v e l u i d e n + t i l a s t o i n t i p a l v e l u t + t i l a s t o i n t i t a r k o i t u k s e e n + t i l a s t o i n t i t a r k o i t u k s e s s a + t i l a s t o i n t i v e l v o i t e t t a a n + t i l a s t o i n t i v e r k o s t o n + t i l a s t o i n t i v ä l i n e + t i l a s t o i s s a + t i l a s t o i s t a + t i l a s t o j a + t i l a s t o j e n + t i l a s t o j ä r j e s t e l m i e n + t i l a s t o j ä r j e s t e l m i i n + t i l a s t o j ä r j e s t e l m i ä + t i l a s t o j ä r j e s t e l m ä + t i l a s t o j ä r j e s t e l m ä m m e + t i l a s t o j ä r j e s t e l m ä n + t i l a s t o j ä r j e s t e l m ä s s ä + t i l a s t o j ä r j e s t e l m ä s s ä m m e + t i l a s t o j ä r j e s t e l m ä s t ä + t i l a s t o j ä r j e s t e l m ä ä + t i l a s t o j ä r j e s t e l m ä ä n + t i l a s t o k e r t o m u s + t i l a s t o k e s k u k s e l l e k i n + t i l a s t o k e s k u k s e n + t i l a s t o k e s k u k s e t + t i l a s t o k e s k u s + t i l a s t o k e s k u s t e n + t i l a s t o k y s y m y k s i s s ä + t i l a s t o k y s y m y s + t i l a s t o k ä y t ä n t ö j ä + t i l a s t o l a i t o k s e t + t i l a s t o l a i t o k s i a + t i l a s t o l a i t o s + t i l a s t o l a i t o s t e n + t i l a s t o l a s k e n t a a n + t i l a s t o l a u t a k u n t a a n + t i l a s t o l i i t t e e s t ä + t i l a s t o l l i s e n + t i l a s t o l l i s e s t a + t i l a s t o l l i s i a + t i l a s t o l l i s t a + t i l a s t o l u o k i t u k s e l l a + t i l a s t o l u o k i t u k s e n + t i l a s t o l u o k k i a + t i l a s t o l ä h t e e n ä + t i l a s t o m a l l i + t i l a s t o m a l l i e n + t i l a s t o m a t e r i a a l i a + t i l a s t o m e n e t e l m i n + t i l a s t o m e n e t e l m i s s ä + t i l a s t o m e n e t e l m ä + t i l a s t o m e n e t e l m ä ä + t i l a s t o m i e t i n t ö + t i l a s t o n i m i k k e i s t ö n + t i l a s t o p a l v e l u + t i l a s t o p a l v e l u a + t i l a s t o p a l v e l u i d e n + t i l a s t o p a l v e l u j a + t i l a s t o p a l v e l u j e n + t i l a s t o p a l v e l u t + t i l a s t o p e r u s t e e n a + t i l a s t o p o h j a a + t i l a s t o p y l v ä ä t + t i l a s t o r a k e n n e + t i l a s t o r a p o r t o i n n i n + t i l a s t o r a p o r t t i + t i l a s t o r i i t a + t i l a s t o s a l a i s u u t t a + t i l a s t o s e i k k o i h i n + t i l a s t o s e l v i t y s + t i l a s t o s e l v i t y s t e n + t i l a s t o s e u r a n t a + t i l a s t o s e u r a n t a a + t i l a s t o t + t i l a s t o t a a k k a a + t i l a s t o t a i s t e l u k s i + t i l a s t o t a r k a s t e l u + t i l a s t o t a r k o i t u k s i i n + t i l a s t o t a r p e e t + t i l a s t o t a r p e i d e n + t i l a s t o t e k i j ö i h i n + t i l a s t o t i e d o i l l e + t i l a s t o t i e d o i s s a + t i l a s t o t i e d o i s t a + t i l a s t o t i e d o l l e + t i l a s t o t i e d o n + t i l a s t o t i e d o s t a + t i l a s t o t i e d o t + t i l a s t o t i e t e e l l i s i i n + t i l a s t o t i e t o a + t i l a s t o t i e t o i h i n + t i l a s t o t i e t o j a + t i l a s t o t i e t o j a m m e + t i l a s t o t i e t o j e m m e + t i l a s t o t i e t o j e n + t i l a s t o t i e t o j ä r j e s t e l m ä + t i l a s t o t i e t o j ä r j e s t e l m ä n + t i l a s t o t i e t o j ä r j e s t e l m ä ä + t i l a s t o t i e t o k a n t a + t i l a s t o t i e t o k a n t o j e n + t i l a s t o t i e t o k o k o e l m a + t i l a s t o t i e t o k o k o e l m a a + t i l a s t o t i e t o k o k o e l m a n + t i l a s t o t i e t o o n + t i l a s t o t i e t o p o l i t i i k k a a + t i l a s t o t i e t o r a k e n t e e n + t i l a s t o t o i m i n t o j e n + t i l a s t o t o i m i s t o + t i l a s t o t o i m i s t o i l l a + t i l a s t o t o i m i s t o j e n + t i l a s t o t o i m i s t o l l e + t i l a s t o t o i m i s t o n + t i l a s t o t u t k i m u k s e s s a + t i l a s t o t u t k i m u k s e s t a + t i l a s t o t u t k i m u k s e t + t i l a s t o t u t k i m u k s i a + t i l a s t o t u t k i m u k s i i n + t i l a s t o t u t k i m u k s i s t a + t i l a s t o t y ö + t i l a s t o u u d i s t u s + t i l a s t o u u d i s t u s t e n + t i l a s t o v a a t i m u k s i a + t i l a s t o v a a t i m u s t e n + t i l a s t o v a i k u t u k s e l l a + t i l a s t o v a i k u t u k s e n + t i l a s t o v a i k u t u k s e s t a + t i l a s t o v a i k u t u k s i s t a + t i l a s t o v a i k u t u s + t i l a s t o v a i k u t u s a l u e e t + t i l a s t o v a i k u t u s t a + t i l a s t o v a l h e i s t a + t i l a s t o v a l v o n t a a + t i l a s t o v e l v o i t t e i d e n + t i l a s t o v e l v o i t t e i t a + t i l a s t o v e r k o s t o n + t i l a s t o v i r a n o m a i s e t + t i l a s t o v i r a n o m a i s i a + t i l a s t o v i r a n o m a i s t e n + t i l a s t o v i r a s t o + t i l a s t o v i r a s t o j e n + t i l a s t o v i r a s t o n + t i l a s t o v ä l i n e e n + t i l a s t o v ä l i n e i s t ä + t i l a s t o v ä l i n e i t ä + t i l a s t o y k s i k k ö j e n + t i l a s t o y k s i k ö i d e n + t i l a s u u n n i t t e l u + t i l a s ä i l i ö + t i l a t a k s e e n + t i l a t a r k a s t u k s i a + t i l a t t a v i s s a + t i l a t u e n + t i l a t u e s t a + t i l a t u i l l a + t i l a t u i s t a + t i l a t u k e a + t i l a t u k e e n + t i l a t u k e n s a + t i l a t u k i + t i l a t u k i a + t i l a t u k i a a n + t i l a t u k i e n + t i l a t u k i j ä r j e s t e l m i e n + t i l a t u k i j ä r j e s t e l m i s t ä + t i l a t u k i j ä r j e s t e l m ä + t i l a t u k i j ä r j e s t e l m ä l l ä + t i l a t u k i j ä r j e s t e l m ä n + t i l a t u k i j ä r j e s t e l m ä s s ä + t i l a t u k i j ä r j e s t e l m ä s t ä + t i l a t u k i j ä r j e s t e l m ä ä + t i l a t u k i j ä r j e s t e l m ä ä n + t i l a t u k i p e r i a a t e + t i l a u k s i a + t i l a u k s i s t a + t i l a u k s i s t a a n + t i l a u s h i n t o j e n + t i l a u s j ä r j e s t e l y i s t ä + t i l a u s k a a p e l e i l l e + t i l a u s k a n t a + t i l a u s k a n t a a + t i l a u s k i r j a + t i l a u s k i r j a t + t i l a u s k i r j o j a + t i l a u s l e n n o i l l a + t i l a u s l e n n o i s t a + t i l a u s l e n n o l l a + t i l a u s l e n n o l l e + t i l a u s l e n n o n + t i l a u s l e n n o t + t i l a u s l e n t o + t i l a u s l e n t o j a + t i l a u s l e n t o j e n + t i l a u s l e n t o k o n e + t i l a u s l e n t o k o n e e s s a + t i l a u s l e n t o l i i k e n t e e n + t i l a u s l e n t o y h t i ö + t i l a u s l e n t o y h t i ö i h i n + t i l a u s l e n t o y h t i ö i s t ä + t i l a u s l e n t o y h t i ö i t ä + t i l a u s l e n t o y h t i ö n + t i l a u s l e n t o y h t i ö t ä + t i l a u s p o l i i s i + t i l a v a m p i a + t i l a v u u s i n t e g r a a l i + t i l a v u u s p a i n o + t i l a v u u s y k s i k k ö i n ä + t i l a ä ä n i + t i l e i h i n + t i l e i l l e + t i l e i l l ä + t i l e i s t ä + t i l e i s t ä ä n + t i l e j ä + t i l e j ä n n e + t i l i e n + t i l i i n + t i l i k a u d e l l a + t i l i k a u d e n + t i l i k a u d e s t a + t i l i k a u s i + t i l i k a u t e e n + t i l i k a u t e n a + t i l i k i r j o i h i n + t i l i k i r j o i s s a + t i l i l l e + t i l i l t ä m m e + t i l i n + t i l i n o m i s t a j i e n + t i l i n p i d o i s t a + t i l i n p i d o l l i s e e n + t i l i n p i d o n + t i l i n p i d o s s a + t i l i n p i d o s s a a n + t i l i n p i d o s t a + t i l i n p i t o + t i l i n p i t o a + t i l i n p i t o j a k s o i l l a + t i l i n p i t o j ä r j e s t e l m i e n + t i l i n p i t o j ä r j e s t e l m ä + t i l i n p i t o j ä r j e s t e l m ä l l e + t i l i n p i t o j ä r j e s t e l m ä m m e + t i l i n p i t o j ä r j e s t e l m ä n + t i l i n p i t o j ä r j e s t e l m ä n s ä + t i l i n p i t o k a u d e n + t i l i n p i t o k ä s i t t e l y ä + t i l i n p i t o k ä y t ä n t ö + t i l i n p i t o k ä y t ä n t ö j e n + t i l i n p i t o m e n e t t e l y j ä + t i l i n p i t o m e n e t t e l y n + t i l i n p i t o m o d u u l e j a + t i l i n p i t o n o r m i e n + t i l i n p i t o o n + t i l i n p i t o s t a n d a r d e j a + t i l i n p i t o s t a n d a r d i + t i l i n p i t o s t a n d a r d i l a u t a k u n n a n + t i l i n p i t o s ä ä n n ö i s s ä + t i l i n p i t o s ä ä n n ö t + t i l i n p i t o s ä ä n t ö j ä + t i l i n p i t o t i e t o j e n + t i l i n p i t o v a a t i m u s t e n + t i l i n p i t o v e l v o l l i s i a + t i l i n p i t o v e l v o l l i s u u t e n s a + t i l i n p i t ä j ä + t i l i n p i t ä j ä l l e + t i l i n p i t ä j ä n + t i l i n p i t ä j ä n ä + t i l i n p i t ä j ä ä + t i l i n p ä ä t ö k s e l l ä + t i l i n p ä ä t ö k s e n + t i l i n p ä ä t ö k s e n s ä + t i l i n p ä ä t ö k s e s s ä + t i l i n p ä ä t ö k s e s t ä + t i l i n p ä ä t ö k s e t + t i l i n p ä ä t ö k s i i n + t i l i n p ä ä t ö k s i s s ä + t i l i n p ä ä t ö k s i s t ä + t i l i n p ä ä t ö k s i ä + t i l i n p ä ä t ö s + t i l i n p ä ä t ö s a n a l y y s i + t i l i n p ä ä t ö s d i r e k t i i v e i s s ä + t i l i n p ä ä t ö s d i r e k t i i v e j ä + t i l i n p ä ä t ö s d i r e k t i i v i e n + t i l i n p ä ä t ö s d i r e k t i i v i n + t i l i n p ä ä t ö s j ä r j e s t e l m i i n + t i l i n p ä ä t ö s j ä r j e s t e l m i ä + t i l i n p ä ä t ö s j ä r j e s t e l m ä n + t i l i n p ä ä t ö s k ä y t ä n t ö i h i n + t i l i n p ä ä t ö s m e n e t t e l y s s ä + t i l i n p ä ä t ö s n o r m i e n + t i l i n p ä ä t ö s n o r m i t + t i l i n p ä ä t ö s p e r i a a t t e e t + t i l i n p ä ä t ö s p e r i a a t t e i s i i n + t i l i n p ä ä t ö s p e r i a a t t e i t a + t i l i n p ä ä t ö s p r o s e s s i a + t i l i n p ä ä t ö s r a p o r t o i n n i n + t i l i n p ä ä t ö s r a p o r t o i n n i s s a + t i l i n p ä ä t ö s r a p o r t o i n n i s t a + t i l i n p ä ä t ö s r a p o r t o i n t i a + t i l i n p ä ä t ö s r a p o r t o i n t i j ä r j e s t e l m i ä + t i l i n p ä ä t ö s s k a n d a a l e i s s a + t i l i n p ä ä t ö s s t a n d a r d e i h i n + t i l i n p ä ä t ö s s t a n d a r d e i s t a + t i l i n p ä ä t ö s s t a n d a r d e j a + t i l i n p ä ä t ö s s t a n d a r d i a + t i l i n p ä ä t ö s s t a n d a r d i e n + t i l i n p ä ä t ö s s t a n d a r d i k o m i t e a n + t i l i n p ä ä t ö s s t a n d a r d i l a u t a k u n n a n + t i l i n p ä ä t ö s s t a n d a r d i l a u t a k u n n a s s a + t i l i n p ä ä t ö s s t a n d a r d i l a u t a k u n t a + t i l i n p ä ä t ö s s t a n d a r d i l a u t a k u n t a a + t i l i n p ä ä t ö s s t a n d a r d i n + t i l i n p ä ä t ö s s t a n d a r d i t + t i l i n p ä ä t ö s s u o s i t u k s e t + t i l i n p ä ä t ö s s u o s i t u k s i i n + t i l i n p ä ä t ö s s u o s i t u k s i s t a + t i l i n p ä ä t ö s s u o s i t u s t e n + t i l i n p ä ä t ö s s ä ä n n ö k s e t + t i l i n p ä ä t ö s s ä ä n n ö t + t i l i n p ä ä t ö s s ä ä n t ö j e n + t i l i n p ä ä t ö s t a a k a n + t i l i n p ä ä t ö s t a a k a s t a + t i l i n p ä ä t ö s t e n + t i l i n p ä ä t ö s t i e t o j a + t i l i n p ä ä t ö s t i e t o j e n + t i l i n p ä ä t ö s t i l a n t e e s e e n + t i l i n p ä ä t ö s t ä + t i l i n p ä ä t ö s v a a t i m u k s e t + t i l i n p ä ä t ö s v a a t i m u k s i s t a + t i l i n p ä ä t ö s v e l v o l l i s u u d e n + t i l i n p ä ä t ö s v e l v o l l i s u u d e s t a + t i l i n p ä ä t ö s v e l v o l l i s u u k s i e n + t i l i n p ä ä t ö s y k s i k k ö + t i l i n t a r k a s t a j a + t i l i n t a r k a s t a j a a + t i l i n t a r k a s t a j a l t a + t i l i n t a r k a s t a j a n + t i l i n t a r k a s t a j a t + t i l i n t a r k a s t a j i a + t i l i n t a r k a s t a j i e n + t i l i n t a r k a s t a j i i n + t i l i n t a r k a s t a j i s t a + t i l i n t a r k a s t u k s e e n + t i l i n t a r k a s t u k s e n + t i l i n t a r k a s t u k s e s t a a n + t i l i n t a r k a s t u k s i a + t i l i n t a r k a s t u k s i s t a + t i l i n t a r k a s t u s + t i l i n t a r k a s t u s a l a n + t i l i n t a r k a s t u s d i r e k t i i v e i s s ä + t i l i n t a r k a s t u s d i r e k t i i v i i n + t i l i n t a r k a s t u s d i r e k t i i v i l l ä + t i l i n t a r k a s t u s e l i m e n + t i l i n t a r k a s t u s e l i m e t + t i l i n t a r k a s t u s e l i m i e n + t i l i n t a r k a s t u s e l i m i i n + t i l i n t a r k a s t u s e l i m i l l e + t i l i n t a r k a s t u s e l i n + t i l i n t a r k a s t u s e l i n t e n + t i l i n t a r k a s t u s i n s t i t u u t i o i h i n + t i l i n t a r k a s t u s i s t u i n t a + t i l i n t a r k a s t u s j ä r j e s t e l m i e n + t i l i n t a r k a s t u s j ä r j e s t e l m i i n + t i l i n t a r k a s t u s j ä r j e s t e l m i ä + t i l i n t a r k a s t u s j ä r j e s t e l m ä + t i l i n t a r k a s t u s j ä r j e s t e l m ä l l ä + t i l i n t a r k a s t u s j ä r j e s t e l m ä n + t i l i n t a r k a s t u s j ä r j e s t e l m ä t + t i l i n t a r k a s t u s j ä r j e s t e l y i s s ä + t i l i n t a r k a s t u s j ä r j e s t e l y ä + t i l i n t a r k a s t u s k e r t o m u k s e e n + t i l i n t a r k a s t u s k e r t o m u k s e n + t i l i n t a r k a s t u s k e r t o m u k s e s t a + t i l i n t a r k a s t u s k e r t o m u k s e t + t i l i n t a r k a s t u s k e r t o m u k s i s t a + t i l i n t a r k a s t u s k e r t o m u s + t i l i n t a r k a s t u s k e r t o m u s t a + t i l i n t a r k a s t u s k e r t o m u s t e n + t i l i n t a r k a s t u s k e t j u s t a + t i l i n t a r k a s t u s k o m i t e a + t i l i n t a r k a s t u s k o m i t e a n + t i l i n t a r k a s t u s k o m i t e a t + t i l i n t a r k a s t u s k o m i t e o i d e n + t i l i n t a r k a s t u s k o m i t e o i t a + t i l i n t a r k a s t u s k o n s e r n i a + t i l i n t a r k a s t u s k u l t t u u r i n + t i l i n t a r k a s t u s k ä y t ä n t ö j ä + t i l i n t a r k a s t u s l a i t o k s i a + t i l i n t a r k a s t u s l a i t o s t e n + t i l i n t a r k a s t u s l a u s u m a n + t i l i n t a r k a s t u s l a u t a k u n t i e n + t i l i n t a r k a s t u s m e n e t e l m i ä + t i l i n t a r k a s t u s m e n e t e l m ä ä + t i l i n t a r k a s t u s m e n e t t e l y + t i l i n t a r k a s t u s n o r m e j a + t i l i n t a r k a s t u s n o r m i e n + t i l i n t a r k a s t u s o p p i l a i t o k s e s s a + t i l i n t a r k a s t u s p a l v e l u i l l a + t i l i n t a r k a s t u s p o l i t i i k k a + t i l i n t a r k a s t u s r a k e n t e i d e n + t i l i n t a r k a s t u s s t a n d a r d e i h i n + t i l i n t a r k a s t u s s t a n d a r d e i s t a + t i l i n t a r k a s t u s s t a n d a r d e j a + t i l i n t a r k a s t u s s t a n d a r d i e n + t i l i n t a r k a s t u s s t a n d a r d i n + t i l i n t a r k a s t u s s t a n d a r d i t + t i l i n t a r k a s t u s s t r a t e g i a a + t i l i n t a r k a s t u s s t r a t e g i a s t a + t i l i n t a r k a s t u s t a + t i l i n t a r k a s t u s t a i t o j e n + t i l i n t a r k a s t u s t a p o j a a n + t i l i n t a r k a s t u s t o i m e e n + t i l i n t a r k a s t u s t o i m i s t a + t i l i n t a r k a s t u s t o i m i s t o i s t a + t i l i n t a r k a s t u s t o i m i s t o j a + t i l i n t a r k a s t u s t o i m i s t o t + t i l i n t a r k a s t u s t u o m i o + t i l i n t a r k a s t u s t u o m i o i s t u i m e e n + t i l i n t a r k a s t u s t u o m i o i s t u i m e l l a + t i l i n t a r k a s t u s t u o m i o i s t u i m e l l e + t i l i n t a r k a s t u s t u o m i o i s t u i m e l t a + t i l i n t a r k a s t u s t u o m i o i s t u i m e m m e + t i l i n t a r k a s t u s t u o m i o i s t u i m e n + t i l i n t a r k a s t u s t u o m i o i s t u i m e n a + t i l i n t a r k a s t u s t u o m i o i s t u i m e s s a + t i l i n t a r k a s t u s t u o m i o i s t u i m e s t a + t i l i n t a r k a s t u s t u o m i o i s t u i m e t + t i l i n t a r k a s t u s t u o m i o i s t u i m i a + t i l i n t a r k a s t u s t u o m i o i s t u i m i i m m e + t i l i n t a r k a s t u s t u o m i o i s t u i m i l l a + t i l i n t a r k a s t u s t u o m i o i s t u i m i l l e + t i l i n t a r k a s t u s t u o m i o i s t u i n + t i l i n t a r k a s t u s t u o m i o i s t u i n k i n + t i l i n t a r k a s t u s t u o m i o i s t u i n t a + t i l i n t a r k a s t u s t u o m i o i s t u i n t e n + t i l i n t a r k a s t u s t u o m i o i t u i n h a n + t i l i n t a r k a s t u s t y ö n + t i l i n t a r k a s t u s v a l t u u d e t + t i l i n t a r k a s t u s v e l v o i t t e e t + t i l i n t a r k a s t u s v i r a n o m a i s e n + t i l i n t a r k a s t u s v i r a n o m a i s e t + t i l i n t a r k a s t u s v i r a n o m a i s t e n + t i l i n t a r k a s t u s v i r a s t o j e n + t i l i n t a r k a s t u s v i r a s t o l l a + t i l i n t a r k a s t u s v i r a s t o n + t i l i n t a r k a s t u s v o i m a v a r o j a + t i l i n t a r k a s t u s y h t e i s ö j e n + t i l i n t a r k a s t u s y h t i ö i s s ä + t i l i n t a r k a s t u s y h t i ö i s t ä + t i l i n t a r k a s t u s y h t i ö t + t i l i n t a r k a s t u s y k s i k k ö + t i l i n t a r k a s t u s y k s i k ö n + t i l i n t a r k a s t u s y r i t y k s e n + t i l i n t a r k a s t u s y r i t y k s i l l e + t i l i n t a r k a s t u s y r i t y s + t i l i n t a r k a s t u s y r i t y s t e n + t i l i n t a r k i s t u s t u o m i o i s t u i n + t i l i n t e k o v e l v o l l i s e s t i + t i l i n t e k o v e l v o l l i s u u t t a + t i l i n u m e r o + t i l i n u m e r o n + t i l i n y l i t y s m a h d o l l i s u u k s i a + t i l i n y l i t y s m a h d o l l i s u u k s i s t a + t i l i o t t e e t + t i l i p u i t t e e t + t i l i p u i t t e i s t a + t i l i s i i r r o i l l e + t i l i s i i r r o i s t a + t i l i s i i r r o l l a + t i l i s i i r r o t + t i l i s i i r t o + t i l i s i i r t o i h i n + t i l i s i i r t o j a + t i l i s i i r t o j e n + t i l i s i i r t o k u s t a n n u k s e t + t i l i s u u n n i t e l m a + t i l i t + t i l i t a p a h t u m a t + t i l i t a p a h t u m i a + t i l i t a r k a s t u s t u o m i o i s t u i m e n + t i l i t a r k a s t u s t u o m i o i s t u i n + t i l i t a r k a s t u s t u o m i o i s t u i n t a + t i l i t i e t o j a + t i l i t i e t o j e n + t i l i t i l a n n e + t i l i t o i m i s t o i s s a + t i l i t y k s e t + t i l i t y k s i ä + t i l i v a l u u t t a n a + t i l i v e l v o l l i n e n + t i l i v e l v o l l i s e n a + t i l i v e l v o l l i s i a + t i l i v e l v o l l i s i k s i + t i l i v e l v o l l i s i n a + t i l i v e l v o l l i s u u d e n + t i l i v e l v o l l i s u u d e s t a + t i l i v e l v o l l i s u u s + t i l i v e l v o l l i s u u s m e k a n i s m i t + t i l i v e l v o l l i s u u t t a + t i l i v u o t e e n + t i l i ä + t i l k k u p e i t o l t a + t i l k k u t y ö t ä + t i l k k u t ä k i n + t i l k k u t ä k k i + t i l k k u t ä k k i l a i n s ä ä d ä n t ö ä + t i l k k u t ä k k i r a t k a i s u + t i l k k u t ä k k i ä + t i l l i c h i n + t i l l i p i o n i + t i l o i h i n + t i l o i l l a + t i l o i l l e + t i l o i l t a a n + t i l o i s s a + t i l o i s t a + t i l o j a + t i l o j e n + t i m a l i t + t i m a n t e i s t a + t i m a n t i k s i + t i m a n t t i a l a l l a + t i m a n t t i e n + t i m a n t t i k a i v o k s i e n + t i m a n t t i k a i v o s t e n + t i m a n t t i k a u p a n + t i m a n t t i k a u p a s t a + t i m a n t t i k a u p p a + t i m a n t t i k a u p p a a + t i m a n t t i k a u p p a a n + t i m a n t t i k e n t i l l ä + t i m a n t t i k e n t t i e n + t i m a n t t i k i i s t a s s a + t i m a n t t i k i r j o a h v e n + t i m a n t t i k o i r a t + t i m a n t t i k y t t ä + t i m a n t t i k y y h k y + t i m a n t t i l e i k k a u s + t i m a n t t i l i i g a + t i m a n t t i m a r k k i n o i t a + t i m a n t t i n e u v o s t o n + t i m a n t t i p ä ä t ö s l a u s e l m a + t i m a n t t i r a h a s t o n + t i m a n t t i r a k e n n e + t i m a n t t i t e o l l i s u u s + t i m a n t t i t u l i p e r ä + t i m a n t t i t u o t a n n o s t a + t i m a n t t i v o i t t o j e n + t i m o r i l a i s t e n + t i n a d i o k s i d i + t i n a k l o r i d i + t i n a m a l m i n + t i n a p i l l i + t i n a s o t i l a a t + t i n k i m ä t t ä + t i n k i m ä t t ö m ä m m i n + t i n k i m ä t t ö m ä m m ä t + t i n k i m ä t t ö m ä m p i + t i n k i m ä t t ö m ä m p ä ä + t i n k i m ä ä n + t i n k i v ä t + t i n k i ä + t i o p e n t a a l i n a t r i u m i a + t i p a h t a a + t i p o t i e s s ä ä n + t i p p a a k a a n + t i p p a l e i p ä + t i p u t a n s s i + t i p u t u k s e s s a + t i s k i k o n e + t i s k i l l e + t i s k i l l ä + t i s k i l t ä + t i s k i v e s i g i n i k s i + t i s l a u k s e n + t i s l a u s k i e l t o + t i s l a u s m e k a n i s m i e n + t i s l a u s m e n e t e l m ä ä n + t i s l a u s p a l k k i o t + t i s l a u s t e o l l i s u u s + t i s l a u s t o i m e n p i d e t t ä + t i s l a u s t o i m e n p i t e e n + t i s l a u s t o i m e t + t i s l a u s v e l v o l l i s u u s + t i s l a u s v e l v o l l i s u u t t a + t i t a a n i d i o k s i d i + t i t a a n i d i o k s i d i t a p a u k s e s t a + t i t a a n i j ä ä r ä + t i t a a n i k a r b i d i + t i t a a n i m i e s + t i t a a n i n i t r i d i + t i t a a n i t e t r a k l o r i d i + t i u k a n + t i u k a s t a + t i u k a t + t i u k e m m a k s i + t i u k e m m a l l e + t i u k e m m a n + t i u k e m m a s s a + t i u k e m m a s t a + t i u k e m m a t + t i u k e m m i k s i + t i u k e m m i l l a + t i u k e m m i l l e + t i u k e m m i n + t i u k e m m i s t a + t i u k e m p a a + t i u k e m p a a n + t i u k e m p i + t i u k e m p i a + t i u k e m p i e n + t i u k e m p i e n k i n + t i u k e m p i i n + t i u k e m p i n e + t i u k e n n e t a a n + t i u k e n n e t t a v a + t i u k e n n e t t u + t i u k e n n e t t u j e n + t i u k e n n e t u n + t i u k e n t a a + t i u k e n t a a k s e m m e + t i u k e n t a m a a n + t i u k e n t a m a l l a + t i u k e n t a m i n e n + t i u k e n t a m i s e e n + t i u k e n t a m i s e k s i + t i u k e n t a m i s e s t a + t i u k e n t a m i s t a + t i u k e n t a m i s v a a t i m u k s i a + t i u k e n t a v a t + t i u k e n t u n e e t + t i u k e n t u v a t + t i u k i m m a t + t i u k i m m a t k i n + t i u k i m m i s t a + t i u k i m p a a n + t i u k i m p i a + t i u k i m p i a k i n + t i u k i n t a + t i u k k a n a + t i u k k a p i p o i s e t + t i u k k a s a n a i n e n + t i u k k a s a n a i s e e n + t i u k k a s a n a i s e l l e + t i u k k a s a n a i s e m m i n + t i u k k o i h i n + t i u k k o j a + t i u k k o j e n + t i u k k u u t t a + t i u k o i n + t i u k o i s s a + t i u k o i s t a + t i v o l i l a i t t e i d e n + t o d e k s i + t o d e l l a k a a n + t o d e l l a k i n + t o d e l l i s e e n + t o d e l l i s e k s i + t o d e l l i s e l l a + t o d e l l i s e l t a + t o d e l l i s e m m a l l e + t o d e l l i s e m m a n + t o d e l l i s e m m a s t a + t o d e l l i s e m p a a + t o d e l l i s e m p i + t o d e l l i s e m p i a + t o d e l l i s e n + t o d e l l i s e n a + t o d e l l i s e s s a + t o d e l l i s e s t a + t o d e l l i s e t + t o d e l l i s i a + t o d e l l i s i i n + t o d e l l i s i k s i + t o d e l l i s i l t a + t o d e l l i s i m m a t + t o d e l l i s i n a + t o d e l l i s i s t a + t o d e l l i s t e n + t o d e l l i s u u d e k s i + t o d e l l i s u u d e l l e + t o d e l l i s u u d e n + t o d e l l i s u u d e n t a j u + t o d e l l i s u u d e n t a j u a + t o d e l l i s u u d e n t a j u i s e m p i + t o d e l l i s u u d e n t a j u n + t o d e l l i s u u d e n t a j u u n n e + t o d e l l i s u u d e s s a + t o d e l l i s u u d e s t a + t o d e l l i s u u k s i s t a + t o d e l l i s u u s p o h j a + t o d e l l i s u u s p o h j a a + t o d e l l i s u u s p o h j a i n e n + t o d e l l i s u u s p o h j a n + t o d e l l i s u u t e e m m e + t o d e l l i s u u t e e n + t o d e l l i s u u t e m m e + t o d e l l i s u u t t a + t o d e l l i s u u t t a a n + t o d e n + t o d e n m u k a i n e n + t o d e n m u k a i s e m m i n + t o d e n m u k a i s e m p a a + t o d e n m u k a i s e m p i + t o d e n m u k a i s e m p i a + t o d e n m u k a i s e s t i + t o d e n m u k a i s e t + t o d e n m u k a i s i a + t o d e n n e e n + t o d e n n e e n i + t o d e n n e e t + t o d e n n e t a a n + t o d e n n e t t a v a + t o d e n n e t t a v a a + t o d e n n e t t a v i s s a + t o d e n n e t t u a + t o d e n n u s j ä r j e s t e l m ä n + t o d e n n u t + t o d e n n u t k i n + t o d e n n ä k ö i n e n + t o d e n n ä k ö i s e l l e + t o d e n n ä k ö i s e l t ä + t o d e n n ä k ö i s e m m ä k s i + t o d e n n ä k ö i s e m m ä l t ä + t o d e n n ä k ö i s e m p i + t o d e n n ä k ö i s e m p i ä + t o d e n n ä k ö i s e m p ä ä + t o d e n n ä k ö i s e s t i + t o d e n n ä k ö i s i m m i n + t o d e n n ä k ö i s i m m ä l t ä + t o d e n n ä k ö i s i m m ä n + t o d e n n ä k ö i s i m p i i n + t o d e n n ä k ö i s i m p i ä + t o d e n n ä k ö i s i m p ä ä n + t o d e n n ä k ö i s i n + t o d e n n ä k ö i s i n t ä + t o d e n n ä k ö i s i n ä + t o d e n n ä k ö i s i ä + t o d e n n ä k ö i s t ä + t o d e n n ä k ö i s y y d e l l ä + t o d e n n ä k ö i s y y s + t o d e n n ä k ö i s y y s a m p l i t u d i + t o d e n n ä k ö i s y y s a s t e i t a + t o d e n n ä k ö i s y y s j a k a u m a + t o d e n n ä k ö i s y y s n ä y t t ö ä + t o d e n n ä k ö i s y y s t e o r i a + t o d e n n ä k ö i s y y t t ä + t o d e n t a a + t o d e n t a m i s j ä r j e s t e l m ä + t o d e n t a m i s j ä r j e s t e l m ä l l ä + t o d e n t a m i s j ä r j e s t e l m ä n + t o d e n t a m i s j ä r j e s t e l m ä ä + t o d e n t a m i s m e k a n i s m i n + t o d e n t a m i s m e n e t e l m ä + t o d e n t a m i s m e n e t t e l y s s ä + t o d e n t a m i s m e n e t t e l y ä + t o d e n t a m i s p a l v e l u j e n + t o d e n t a m i s p r o s e s s i + t o d e n t a m i s p r o s e s s i a + t o d e n t a m i s r a k e n t e i t a a n + t o d e n t a m i s t a a j u u d e s t a + t o d e n t a m i s t a a j u u s + t o d e t a + t o d e t a a n + t o d e t a a n k i n + t o d e t a k s e m m e + t o d e t a k s e n i + t o d e t e n + t o d e t e s s a + t o d e t e s s a a n + t o d e t e s s a m m e + t o d e t e s s a n i + t o d e t e s s a n n e + t o d e t k a a m m e + t o d e t t a k o o n + t o d e t t a v a + t o d e t t a v i s s a + t o d e t t i i n + t o d e t t u a + t o d e t t u k i n + t o d e t u i s t a + t o d i n i + t o d i s t a a + t o d i s t a a k s e e n + t o d i s t a i s i n + t o d i s t a j a n a + t o d i s t a j a n l a u s u n n o i s s a + t o d i s t a j a n l a u s u n n o t + t o d i s t a j a n l a u s u n t o i h i n + t o d i s t a j a n l a u s u n t o j a + t o d i s t a j a n l a u s u n t o j e n + t o d i s t a j a n s u o j a + t o d i s t a j a n s u o j a o h j e l m i a + t o d i s t a j a n s u o j e l u n + t o d i s t a j a n s u o j e l u o h j e l m a n + t o d i s t a j a n s u o j e l u o h j e l m i a + t o d i s t a j a n s u o j e l u u n + t o d i s t a j a t + t o d i s t a j i a + t o d i s t a j i e n + t o d i s t a j i e n s u o j e l u o h j e l m a + t o d i s t a j i k s i + t o d i s t a j i n a + t o d i s t a k a a + t o d i s t a k a a m m e + t o d i s t a m a a n + t o d i s t a m a s s a + t o d i s t a m a s t a + t o d i s t a m a t t a + t o d i s t a m i s e n + t o d i s t a m i s e s t a + t o d i s t a m m e + t o d i s t a n e e s t a + t o d i s t a n e e t + t o d i s t a n u t + t o d i s t a n u t t a + t o d i s t a v a t + t o d i s t e a s i a k i r j o j e n + t o d i s t e e n a + t o d i s t e e t + t o d i s t e i d e n + t o d i s t e i l l a + t o d i s t e i n a + t o d i s t e i s i i n + t o d i s t e i s t a + t o d i s t e i t a + t o d i s t e k y s y m y k s i i n + t o d i s t e l u m e n e t t e l y i s t ä + t o d i s t e l u m e n e t t e l y s t ä + t o d i s t e l u m e n e t t e l y ä + t o d i s t e l u s ä ä n t ö i h i n + t o d i s t e m ä ä r ä + t o d i s t e t a a n + t o d i s t e t a a n k o + t o d i s t e t t a + t o d i s t e t t a v a s t i + t o d i s t e t t u j a + t o d i s t e t t u j e n + t o d i s t i + t o d i s t i v a t + t o d i s t u k s e e n + t o d i s t u k s e n + t o d i s t u k s e n s a + t o d i s t u k s e s s a + t o d i s t u k s e s t a + t o d i s t u k s e t + t o d i s t u k s i a + t o d i s t u k s i s t a + t o d i s t u s a i n e i s t o + t o d i s t u s a i n e i s t o a + t o d i s t u s a i n e i s t o k s i + t o d i s t u s a i n e i s t o l l e + t o d i s t u s a i n e i s t o n + t o d i s t u s a i n e i s t o o n + t o d i s t u s a i n e i s t o s t a + t o d i s t u s a r v o + t o d i s t u s a r v o a + t o d i s t u s a s i a k i r j o i s s a + t o d i s t u s h a k e m u k s e n + t o d i s t u s j ä r j e s t e l m i i n + t o d i s t u s j ä r j e s t e l m ä n + t o d i s t u s k a p p a l e i s t a + t o d i s t u s k e i n o a + t o d i s t u s m a t k a i l u k s i + t o d i s t u s m e n e t e l m i e n + t o d i s t u s m e n e t e l m ä ä + t o d i s t u s m e n e t t e l y s t ä + t o d i s t u s o i k e u t t a + t o d i s t u s o n g e l m a n + t o d i s t u s p o l i t i i k a s t a + t o d i s t u s s ä ä n n ö t + t o d i s t u s t a + t o d i s t u s t a a k a n + t o d i s t u s t a a k a s t a + t o d i s t u s t a a k k a + t o d i s t u s t a a k k a a + t o d i s t u s t a a k k a a n + t o d i s t u s t e n + t o d i s t u s v a a t i m u k s i s t a + t o d i s t u s v a a t i m u s t a + t o d i s t u s v e l v o l l i s u u s + t o d i s t u s v e l v o l l i s u u t t a + t o d i s t u s v o i m a + t o d i s t u s v o i m a a n + t o d i s t u s v o i m a i n e n + t o d i s t u s v o i m a i s t a + t o d i s t u s v o i m a s t a + t o h t o r e i t a + t o h t o r i a p u r a h a t + t o h t o r i k o u l u t u s t a + t o h t o r i k u r s s e i h i n + t o h t o r i k u r s s i e n + t o h t o r i n a r v o n + t o h t o r i n h a t t u + t o h t o r i n k o u l u t u s o h j e l m a + t o h t o r i n k u k k a + t o h t o r i n t u t k i n n o i s t a + t o h t o r i n t u t k i n n o n + t o h t o r i n t u t k i n t o n s a + t o h t o r i o h j e l m i e n + t o h t o r i o h j e l m i i n + t o h t o r i o h j e l m i l l a + t o h t o r i o p i n t o i h i n + t o h t o r i o p i s k e l i j o i d e n + t o h t o r i t a s o l l e + t o h t o r i t a s o n + t o i m e a + t o i m e e n + t o i m e e n p a n e m i s e k s i + t o i m e e n p a n e v a a + t o i m e e n p a n e v a n + t o i m e e n p a n i j a t + t o i m e e n p a n o a + t o i m e e n p a n o a i k a t a u l u a + t o i m e e n p a n o a i k a t a u l u u n + t o i m e e n p a n o a s t e + t o i m e e n p a n o a s t e i s t a + t o i m e e n p a n o e l i m i s s ä + t o i m e e n p a n o e l i n + t o i m e e n p a n o e l i n t e n + t o i m e e n p a n o e l i n t ä + t o i m e e n p a n o k e i n o i s t a + t o i m e e n p a n o k e i n o j a + t o i m e e n p a n o k o m i t e a + t o i m e e n p a n o k o m i t e a a n + t o i m e e n p a n o k o m i t e a n + t o i m e e n p a n o k y s y m y k s e e n + t o i m e e n p a n o k y s y m y k s i i n + t o i m e e n p a n o l a i n s ä ä d ä n t ö ö n + t o i m e e n p a n o l t a a n + t o i m e e n p a n o l u v u t + t o i m e e n p a n o m e k a n i s m i + t o i m e e n p a n o m e n e t t e l y j ä + t o i m e e n p a n o m e n e t t e l y l l e + t o i m e e n p a n o m e t o d e i h i n + t o i m e e n p a n o m u o d o i s t a + t o i m e e n p a n o m ä ä r ä y k s e t + t o i m e e n p a n o m ä ä r ä y k s i s s ä + t o i m e e n p a n o m ä ä r ä y k s i ä + t o i m e e n p a n o m ä ä r ä y s + t o i m e e n p a n o m ä ä r ä y s t e n + t o i m e e n p a n o p o l i t i i k a n + t o i m e e n p a n o p r o s e s s i n + t o i m e e n p a n o p r o s e s s i s s a + t o i m e e n p a n o p ä i v ä m ä ä r ä + t o i m e e n p a n o p ä ä t ö k s e n + t o i m e e n p a n o p ä ä t ö k s i s s ä + t o i m e e n p a n o r a p o r t t i e n + t o i m e e n p a n o r y h m ä + t o i m e e n p a n o s s a + t o i m e e n p a n o s t a + t o i m e e n p a n o s u u n n i t e l m a a + t o i m e e n p a n o s u u n n i t e l m a a n + t o i m e e n p a n o s u u n n i t e l m a s s a + t o i m e e n p a n o s u u n n i t e l m a s t a + t o i m e e n p a n o s ä ä d ö s t e n + t o i m e e n p a n o s ä ä n n ö k s i s t ä + t o i m e e n p a n o s ä ä n n ö t + t o i m e e n p a n o s ä ä n t ö i h i n + t o i m e e n p a n o s ä ä n t ö j e n + t o i m e e n p a n o t e h t ä v i e n + t o i m e e n p a n o t e h t ä v i i n + t o i m e e n p a n o t e h t ä v i ä + t o i m e e n p a n o t e h t ä v ä s t ä ä n + t o i m e e n p a n o t e h t ä v ä ä + t o i m e e n p a n o t e h t ä v ä ä n s ä + t o i m e e n p a n o t e k s t i i n + t o i m e e n p a n o t o i m e t + t o i m e e n p a n o t o i m i a + t o i m e e n p a n o v a i h e e s e e n + t o i m e e n p a n o v a i h e e s s a + t o i m e e n p a n o v a l l a k s i + t o i m e e n p a n o v a l l a n + t o i m e e n p a n o v a l l a s t a + t o i m e e n p a n o v a l m i s t e l u j a + t o i m e e n p a n o v a l m i u k s i i n + t o i m e e n p a n o v a l t a + t o i m e e n p a n o v a l t a a + t o i m e e n p a n o v a l t a a n + t o i m e e n p a n o v a l t a a n s a + t o i m e e n p a n o v a l t a n s a + t o i m e e n p a n o v a l t i o s s a + t o i m e e n p a n o v a l t u u d e t + t o i m e e n p a n o v a l t u u k s i a + t o i m e e n p a n o v a l t u u k s i a a n + t o i m e e n p a n o v a l t u u k s i e n + t o i m e e n p a n o v a l t u u k s i i n + t o i m e e n p a n o v a s t u u + t o i m e e n p a n o v i r a n o m a i s e t + t o i m e e n p a n o v i r a n o m a i s i a + t o i m e e n p a n o v i r a n o m a i s t e n + t o i m e e n p a n o v i r a s t o + t o i m e e n p a n o v i r a s t o a + t o i m e e n p a n o v i r a s t o i l l e + t o i m e e n p a n o v i r a s t o i s s a + t o i m e e n p a n o v i r a s t o i s t a + t o i m e e n p a n o v i r a s t o j a + t o i m e e n p a n o v i r a s t o j e n + t o i m e e n p a n o v i r a s t o n + t o i m e e n p a n o v i r a s t o o n + t o i m e e n p a n o v i r a s t o s s a + t o i m e e n p a n o v i r a s t o s t a + t o i m e e n p a n o v i r a s t o t + t o i m e e n p a n o v u o s i + t o i m e e n p a n o v ä l i n e e t + t o i m e e n p a n o v ä l i n e i t ä + t o i m e e n p a n t a e s s a + t o i m e e n p a n t a v a + t o i m e e n t u l o a + t o i m e e n t u l o a a n + t o i m e e n t u l o k e i n o + t o i m e e n t u l o k e i n o j e n + t o i m e e n t u l o k y s y m y k s e t + t o i m e e n t u l o l ä h t e i d e n + t o i m e e n t u l o m a h d o l l i s u u k s i a + t o i m e e n t u l o m i n i m i n + t o i m e e n t u l o m i n i m i t + t o i m e e n t u l o n + t o i m e e n t u l o r a j a n + t o i m e e n t u l o s t a + t o i m e e n t u l o t a r p e i s t a + t o i m e e n t u l o t a s o n + t o i m e e n t u l o t u k e a + t o i m e e n t u l o t u k e e n + t o i m e e n t u l o t u k i + t o i m e e n t u l o t u k i e n + t o i m e e n t u l o t u k i j ä r j e s t e l m i e n + t o i m e e n t u l o t u k i j ä r j e s t e l m i ä + t o i m e e n t u l o v a i k e u k s i a + t o i m e e n t u l o v a r m u u d e n + t o i m e k s i a n n o n + t o i m e k s i a n n o s s a + t o i m e k s i a n n o s t a + t o i m e k s i a n n o s t a a n + t o i m e k s i a n t a j a y r i t y k s e s t ä + t o i m e k s i a n t a j i a + t o i m e k s i a n t a j i e n + t o i m e k s i a n t o a + t o i m e k s i a n t o a m m e + t o i m e k s i a n t o i h i n + t o i m e k s i a n t o j a + t o i m e k s i s a a j a n + t o i m e k s i s a a j i l l e + t o i m e l l a + t o i m e m m e + t o i m e n a + t o i m e n k u v a a + t o i m e n p a n o v a i h e e s s a + t o i m e n p a n o v a l t a a + t o i m e n p i d e + t o i m e n p i d e a l o i h i n + t o i m e n p i d e a l u e i s t a a n + t o i m e n p i d e a s e t u k s i a + t o i m e n p i d e j ä r j e s t e l m ä n + t o i m e n p i d e j ä r j e s t e l m ä ä + t o i m e n p i d e k e h y s t ä + t o i m e n p i d e k e t j u a + t o i m e n p i d e k o h t a + t o i m e n p i d e k o k o n a i s u u d e n + t o i m e n p i d e k o k o n a i s u u s + t o i m e n p i d e k o k o n a i s u u t e e n + t o i m e n p i d e k o k o n a i s u u t t a + t o i m e n p i d e l i s t a l t a + t o i m e n p i d e l i s t a n + t o i m e n p i d e l u e t t e l o + t o i m e n p i d e l u e t t e l o a + t o i m e n p i d e l u e t t e l o n + t o i m e n p i d e l u o k k a a n + t o i m e n p i d e l u o n n o k s e n + t o i m e n p i d e o h j e l m a + t o i m e n p i d e o h j e l m a a + t o i m e n p i d e o h j e l m a a n + t o i m e n p i d e o h j e l m a k s i + t o i m e n p i d e o h j e l m a l l a + t o i m e n p i d e o h j e l m a l l e + t o i m e n p i d e o h j e l m a n + t o i m e n p i d e o h j e l m a n s a + t o i m e n p i d e o h j e l m a s s a + t o i m e n p i d e o h j e l m a s t a + t o i m e n p i d e o h j e l m a t + t o i m e n p i d e o h j e l m i a + t o i m e n p i d e o h j e l m i a a n + t o i m e n p i d e o h j e l m i e n + t o i m e n p i d e o h j e l m i e n s a + t o i m e n p i d e o h j e l m i i n + t o i m e n p i d e o h j e l m i l l a + t o i m e n p i d e o h j e l m i s s a + t o i m e n p i d e o h j e l m i s s a a n + t o i m e n p i d e p a k e t i l l a + t o i m e n p i d e p a k e t i l l a a n + t o i m e n p i d e p a k e t i l l e + t o i m e n p i d e p a k e t i l t a + t o i m e n p i d e p a k e t i n + t o i m e n p i d e p a k e t i s s a + t o i m e n p i d e p a k e t i s t a + t o i m e n p i d e p a k e t i t + t o i m e n p i d e p a k e t t e j a + t o i m e n p i d e p a k e t t i + t o i m e n p i d e p a k e t t i a + t o i m e n p i d e p a k e t t i a a n + t o i m e n p i d e p a k e t t i i n + t o i m e n p i d e p a k e t t i n a + t o i m e n p i d e r y h m i ä + t o i m e n p i d e s a r j a a + t o i m e n p i d e s t r a t e g i a + t o i m e n p i d e s u o s i t u k s i a + t o i m e n p i d e s u u n n i t e l m a + t o i m e n p i d e s u u n n i t e l m a n + t o i m e n p i d e s u u n n i t e l m a s s a + t o i m e n p i d e s u u n n i t e l m a t + t o i m e n p i d e s u u n n i t e l m i s s a a n + t o i m e n p i d e s ä ä n t e l y y n + t o i m e n p i d e t a s o i l l a + t o i m e n p i d e t a s o l l a + t o i m e n p i d e t t ä + t o i m e n p i d e t y y p p i + t o i m e n p i d e v a i h t o e h d o i s t a + t o i m e n p i d e v a i h t o e h t o j e n + t o i m e n p i d e v ä l i n e i t ä + t o i m e n p i d e y h d i s t e l m ä + t o i m e n p i d e y h d i s t e l m ä l l ä + t o i m e n p i t e e l l ä + t o i m e n p i t e e m m e + t o i m e n p i t e e n + t o i m e n p i t e e n ä + t o i m e n p i t e e s s ä + t o i m e n p i t e e s t ä + t o i m e n p i t e e t + t o i m e n p i t e i d e n + t o i m e n p i t e i k s i + t o i m e n p i t e i l l e + t o i m e n p i t e i l l ä + t o i m e n p i t e i l l ä n n e + t o i m e n p i t e i l t ä + t o i m e n p i t e i n + t o i m e n p i t e i n ä + t o i m e n p i t e i s i i n + t o i m e n p i t e i s s ä + t o i m e n p i t e i s t ä + t o i m e n p i t e i t ä + t o i m e n p i t e i t ä k i n + t o i m e n p i t e i t ä m m e + t o i m e n s a + t o i m e t + t o i m e t t o m a k s i + t o i m e t t o m a n a + t o i m e t t o m i e n + t o i m e t t o m i k s i + t o i m e t t o m i n a + t o i m e t t o m u u d e s t a + t o i m e t t o m u u d e s t a a n + t o i m e t t o m u u t e e n + t o i m e t t o m u u t t a a n + t o i m i a + t o i m i a a n + t o i m i a i k a n a a n + t o i m i a k s e e n + t o i m i a l a + t o i m i a l a a + t o i m i a l a a n + t o i m i a l a a n i + t o i m i a l a j o h t a j i a + t o i m i a l a j ä r j e s t ö + t o i m i a l a j ä r j e s t ö j e n + t o i m i a l a j ä r j e s t ö j ä + t o i m i a l a j ä r j e s t ö t + t o i m i a l a j ä r j e s t ö ä + t o i m i a l a k o h t a i s e n + t o i m i a l a k o h t a i s i a + t o i m i a l a k o h t a i s i s s a + t o i m i a l a k o h t a i s t a + t o i m i a l a l l a + t o i m i a l a l l a a n + t o i m i a l a l t a + t o i m i a l a m u u t o s + t o i m i a l a n + t o i m i a l a n n e + t o i m i a l a n s a + t o i m i a l a s t a a n + t o i m i a l a t + t o i m i a l a y k s i k ö i d e n + t o i m i a l o i h i n + t o i m i a l o i l l a + t o i m i a l o i s t a + t o i m i a l o j a + t o i m i a l o j e n + t o i m i a l u e + t o i m i a l u e e l l a a n + t o i m i a l u e e l l e + t o i m i a l u e i l l a + t o i m i a l u e i l l a a n + t o i m i a l u e t t a + t o i m i a m m e + t o i m i e l i m e l l e + t o i m i e l i m e l l i s i i n + t o i m i e l i m e l l ä m m e + t o i m i e l i m e l t ä + t o i m i e l i m e m m e + t o i m i e l i m e m m e k i n + t o i m i e l i m e n + t o i m i e l i m e n n e + t o i m i e l i m e n s ä + t o i m i e l i m e n ä + t o i m i e l i m e s s ä + t o i m i e l i m e s s ä m m e + t o i m i e l i m e s s ä ä n + t o i m i e l i m e s t ä + t o i m i e l i m e s t ä m m e + t o i m i e l i m e t + t o i m i e l i m i e m m e + t o i m i e l i m i e n + t o i m i e l i m i i m m e + t o i m i e l i m i i n + t o i m i e l i m i l l e + t o i m i e l i m i l l ä + t o i m i e l i m i l t ä + t o i m i e l i m i l t ä m m e + t o i m i e l i m i l t ä ä n + t o i m i e l i m i n ä + t o i m i e l i m i s s ä + t o i m i e l i m i s s ä m m e + t o i m i e l i m i s s ä ä n + t o i m i e l i m i s t ä + t o i m i e l i m i ä + t o i m i e l i m i ä m m e + t o i m i e l i n + t o i m i e l i n a r k k i t e h t u u r i n + t o i m i e l i n a r k k i t e h t u u r i s s a + t o i m i e l i n a s i a k i r j a + t o i m i e l i n a s i a t + t o i m i e l i n a s i o i d e n + t o i m i e l i n a s i o i s s a + t o i m i e l i n a s i o i s t a + t o i m i e l i n a s i o i t a + t o i m i e l i n b y r o k r a t i a a + t o i m i e l i n e p ä i l y s t e n + t o i m i e l i n h i r v i ö n + t o i m i e l i n j ä r j e s t e l m i e n + t o i m i e l i n j ä r j e s t e l m i i n + t o i m i e l i n j ä r j e s t e l m i s t ä + t o i m i e l i n j ä r j e s t e l m ä + t o i m i e l i n j ä r j e s t e l m ä k s i + t o i m i e l i n j ä r j e s t e l m ä m m e + t o i m i e l i n j ä r j e s t e l m ä n + t o i m i e l i n j ä r j e s t e l m ä s s ä + t o i m i e l i n j ä r j e s t e l m ä s s ä m m e + t o i m i e l i n j ä r j e s t e l m ä s t ä + t o i m i e l i n j ä r j e s t e l m ä ä + t o i m i e l i n j ä r j e s t e l m ä ä m m e + t o i m i e l i n j ä r j e s t e l m ä ä n + t o i m i e l i n j ä r j e s t e l m ä ä n s ä + t o i m i e l i n j ä r j e s t e l y + t o i m i e l i n j ä r j e s t e l y i h i n + t o i m i e l i n j ä r j e s t e l y i s s ä + t o i m i e l i n j ä r j e s t e l y i s t ä + t o i m i e l i n j ä r j e s t e l y j e n + t o i m i e l i n j ä r j e s t e l y j ä + t o i m i e l i n j ä r j e s t e l y t + t o i m i e l i n j ä r j e s t y k s e e n + t o i m i e l i n k a a o k s e s s a + t o i m i e l i n k a l e n t e r i + t o i m i e l i n k a p a s i t e e t t i a + t o i m i e l i n k e h i t y k s e n + t o i m i e l i n k e h y k s e e n + t o i m i e l i n k e h y k s e n + t o i m i e l i n k e h y k s e s s ä + t o i m i e l i n k e h y k s e s s ä m m e + t o i m i e l i n k e h y k s e s t ä + t o i m i e l i n k e h y s + t o i m i e l i n k e h y s t ä + t o i m i e l i n k e s k e i s e s t ä + t o i m i e l i n k e s k u s t e l u a + t o i m i e l i n k e s k u s t e l u i h i n + t o i m i e l i n k e s k u s t e l u n + t o i m i e l i n k e s k u s t e l u s s a + t o i m i e l i n k i i s t a + t o i m i e l i n k o l m i k k o a + t o i m i e l i n k o l m i o + t o i m i e l i n k o m p r o m i s s i n + t o i m i e l i n k o n e i s t o s t a + t o i m i e l i n k o n t e k s t i s s a + t o i m i e l i n k r i i s i + t o i m i e l i n k r i i s i n + t o i m i e l i n k r i i s i n s ä + t o i m i e l i n k r i i s i n ä + t o i m i e l i n k r i i s i s s ä + t o i m i e l i n k r i i s i s t ä + t o i m i e l i n k r i i s i ä + t o i m i e l i n k u l t t u u r i n + t o i m i e l i n k u m p p a n e i d e m m e + t o i m i e l i n k y s y m y k s e n + t o i m i e l i n k y s y m y k s e t + t o i m i e l i n k y s y m y k s i i n + t o i m i e l i n k y s y m y k s i s t ä + t o i m i e l i n k y s y m y k s i ä + t o i m i e l i n k y s y m y s + t o i m i e l i n k y s y m y s t e n + t o i m i e l i n k y s y m y s t ä + t o i m i e l i n m a l l i a + t o i m i e l i n m a l l i m m e + t o i m i e l i n m a l l i n + t o i m i e l i n m a l l i s t a + t o i m i e l i n m e k a n i s m i t + t o i m i e l i n m e n e t t e l y + t o i m i e l i n m e n e t t e l y i h i n + t o i m i e l i n m e n e t t e l y i s s ä + t o i m i e l i n m e n e t t e l y j e n + t o i m i e l i n m e n e t t e l y j e n s ä + t o i m i e l i n m e n e t t e l y n + t o i m i e l i n m e n e t t e l y t + t o i m i e l i n m e n o j a + t o i m i e l i n m e n o t + t o i m i e l i n m u u t o k s e l l a + t o i m i e l i n m u u t o k s e t + t o i m i e l i n m u u t o k s i a + t o i m i e l i n m u u t o k s i i n + t o i m i e l i n m u u t o k s i l l a + t o i m i e l i n m ä ä r ä y k s i ä + t o i m i e l i n o h j e l m a + t o i m i e l i n o h j e l m a n + t o i m i e l i n o n g e l m a + t o i m i e l i n o n g e l m a n + t o i m i e l i n o n g e l m i a + t o i m i e l i n o n g e l m i e n + t o i m i e l i n o n g e l m i i n + t o i m i e l i n p a k e t i n + t o i m i e l i n p a k e t i s t a + t o i m i e l i n p a k e t t i + t o i m i e l i n p e r u s t a s t a + t o i m i e l i n p o l i t i i k a n + t o i m i e l i n p o l i t i i k k a a + t o i m i e l i n p r o s e s s i s s a + t o i m i e l i n p u i t t e e t + t o i m i e l i n p u i t t e i s s a + t o i m i e l i n r a k e n n e + t o i m i e l i n r a k e n n e t t a + t o i m i e l i n r a k e n n e t t a a n + t o i m i e l i n r a k e n t e e l l a + t o i m i e l i n r a k e n t e e n + t o i m i e l i n r a k e n t e e n s a + t o i m i e l i n r a k e n t e e s e e m m e + t o i m i e l i n r a k e n t e e s e e n + t o i m i e l i n r a k e n t e e s s a + t o i m i e l i n r a k e n t e e s t a + t o i m i e l i n r a k e n t e e s t a a n + t o i m i e l i n r a k e n t e e t + t o i m i e l i n r a k e n t e i d e n + t o i m i e l i n r a k e n t e i d e n s a k i n + t o i m i e l i n r a k e n t e i s i i n + t o i m i e l i n r a k e n t e i s s a m m e + t o i m i e l i n r a k e n t e i s t a + t o i m i e l i n r a k e n t e i t a + t o i m i e l i n r a t k a i s u a + t o i m i e l i n r a t k a i s u j a + t o i m i e l i n r a t k a i s u n + t o i m i e l i n r o o l i a + t o i m i e l i n s o p i m u k s e n + t o i m i e l i n s o p i m u k s e s t a + t o i m i e l i n s o p i m u s + t o i m i e l i n s o p i m u s t a + t o i m i e l i n s o p i m u s t e n + t o i m i e l i n s u h t e e t + t o i m i e l i n s u h t e i t a + t o i m i e l i n s ä ä n n ö s t e n + t o i m i e l i n s ä ä n t ö j e n + t o i m i e l i n s ä ä n t ö j ä + t o i m i e l i n t a s o + t o i m i e l i n t a s o l l a + t o i m i e l i n t a s o t + t o i m i e l i n t e m m e + t o i m i e l i n t e n + t o i m i e l i n t e n v ä l i n e n + t o i m i e l i n t e n v ä l i s e e n + t o i m i e l i n t e n v ä l i s e n + t o i m i e l i n t e n v ä l i s i ä + t o i m i e l i n t e n v ä l i s t ä + t o i m i e l i n t u k e a + t o i m i e l i n t y h j i ö s t ä + t o i m i e l i n t ä + t o i m i e l i n t ä m m e + t o i m i e l i n u l o t t u v u u s + t o i m i e l i n u u d i s t u k s e e n + t o i m i e l i n u u d i s t u k s e k s i + t o i m i e l i n u u d i s t u k s e l l a + t o i m i e l i n u u d i s t u k s e l l e + t o i m i e l i n u u d i s t u k s e m m e + t o i m i e l i n u u d i s t u k s e n + t o i m i e l i n u u d i s t u k s e s s a + t o i m i e l i n u u d i s t u k s e s t a + t o i m i e l i n u u d i s t u k s e t + t o i m i e l i n u u d i s t u k s i a + t o i m i e l i n u u d i s t u k s i i n + t o i m i e l i n u u d i s t u k s i l l e + t o i m i e l i n u u d i s t u k s i s s a + t o i m i e l i n u u d i s t u k s i s t a + t o i m i e l i n u u d i s t u s + t o i m i e l i n u u d i s t u s a s i a + t o i m i e l i n u u d i s t u s l u o n n o s + t o i m i e l i n u u d i s t u s p r o s e s s i a + t o i m i e l i n u u d i s t u s s u u n n i t e l m a s t a + t o i m i e l i n u u d i s t u s t a + t o i m i e l i n u u d i s t u s t a a n + t o i m i e l i n u u d i s t u s t e n + t o i m i e l i n v a l m i u k s i a + t o i m i e l i n v a l t a a + t o i m i e l i n v ä l i s e s t ä + t o i m i e l i n y m p ä r i s t ö ä + t o i m i e m m e + t o i m i e n + t o i m i e n s a + t o i m i e s s a + t o i m i e s s a a n + t o i m i e s s a m m e + t o i m i e s s a n i + t o i m i e s s a n n e + t o i m i h e n k i l ö + t o i m i h e n k i l ö i t ä + t o i m i h e n k i l ö u n i o n i + t o i m i h e n k i l ö ä + t o i m i i + t o i m i i k i n + t o i m i i k o + t o i m i i m m e + t o i m i i n + t o i m i i n s a + t o i m i j a j ä r j e s t ö j e n + t o i m i j a k a t e g o r i o i d e n + t o i m i j a k s i + t o i m i j a n + t o i m i j a n a + t o i m i j a o r g a n i s a a t i o + t o i m i j a r y h m i ä + t o i m i j a t + t o i m i j a v e r k k o t e o r i a + t o i m i j o i d e n + t o i m i j o i d e n k i n + t o i m i j o i h i n + t o i m i j o i l l a + t o i m i j o i l l e + t o i m i j o i l t a + t o i m i j o i l t a a n + t o i m i j o i s s a + t o i m i j o i s t a + t o i m i j o i t a + t o i m i k a a + t o i m i k a a m m e + t o i m i k a u d e l l a + t o i m i k a u d e l l a a n + t o i m i k a u d e l l a m m e + t o i m i k a u d e l l a n i + t o i m i k a u d e l l a n n e + t o i m i k a u d e l l e + t o i m i k a u d e l l e n n e + t o i m i k a u d e l t a n n e + t o i m i k a u d e n + t o i m i k a u d e s t a + t o i m i k a u d e s t a n n e + t o i m i k a u s i + t o i m i k a u s i a + t o i m i k a u s i e n + t o i m i k a u t e m m e + t o i m i k a u t e n i + t o i m i k a u t e n n e + t o i m i k a u t e n s a + t o i m i k a u t t a + t o i m i k a u t t a n n e + t o i m i k o h t a i s i a + t o i m i k o k o n a i s u u t t a + t o i m i k o r t t e i h i n + t o i m i k s i + t o i m i k u n n a t + t o i m i k u n t i e n + t o i m i l l a + t o i m i l l a a n + t o i m i l l a m m e + t o i m i l l e + t o i m i l l e m m e + t o i m i l t a + t o i m i l u o n n o k s e t + t o i m i l u p a + t o i m i l u p a a + t o i m i l u p a d i r e k t i i v i s s ä + t o i m i l u p a e h t o j a + t o i m i l u p a j ä r j e s t e l m i e n + t o i m i l u p a j ä r j e s t e l m i ä + t o i m i l u p a j ä r j e s t e l m ä + t o i m i l u p a j ä r j e s t e l m ä n + t o i m i l u p a j ä r j e s t e l m ä s t ä + t o i m i l u p a j ä r j e s t e l m ä ä + t o i m i l u p a l a i n s ä ä d ä n t ö ä + t o i m i l u p a m a k s u i s t a + t o i m i l u p a m a k s u j e n + t o i m i l u p a m a k s u t + t o i m i l u p a m a l l e i h i n + t o i m i l u p a m a l l i i n + t o i m i l u p a m e n e t t e l y n + t o i m i l u p a m ä ä r ä y k s i ä + t o i m i l u p a n u m e r o + t o i m i l u p a p o l i t i i k k a + t o i m i l u p a p ä ä t ö s t e n s ä + t o i m i l u p a s o p i m u k s e e n + t o i m i l u p a s o p i m u k s e n + t o i m i l u p a s o p i m u k s e s s a + t o i m i l u p a s o p i m u k s i l l a + t o i m i l u p a s o p i m u s t a + t o i m i l u p a s o p i m u s t e n + t o i m i l u p a v a a t i m u k s i a + t o i m i l u p i a + t o i m i l u p i e n + t o i m i l u v a n + t o i m i l u v a t + t o i m i l u v i l l a + t o i m i l u v i s t a + t o i m i m a a n + t o i m i m a l l a + t o i m i m a s s a + t o i m i m a s t a + t o i m i m a t t a + t o i m i m a t t o m i a + t o i m i m a t t o m u u d e s t a + t o i m i m a t t o m u u t t a a n + t o i m i m i n e n + t o i m i m i s e e n + t o i m i m i s e n + t o i m i m i s e s t a + t o i m i m i s t a + t o i m i m m e + t o i m i m m e k o + t o i m i n + t o i m i n a + t o i m i n e e n s a + t o i m i n e e t + t o i m i n i m e t + t o i m i n i m i + t o i m i n n a k s i + t o i m i n n a l l a + t o i m i n n a l l a a n + t o i m i n n a l l a m m e + t o i m i n n a l l e + t o i m i n n a l l e e n + t o i m i n n a l l i s e k s i + t o i m i n n a l l i s e l t a + t o i m i n n a l l i s e m m a k s i + t o i m i n n a l l i s e m p i + t o i m i n n a l l i s e n + t o i m i n n a l l i s e s t i + t o i m i n n a l l i s e t + t o i m i n n a l l i s i a + t o i m i n n a l l i s i i n + t o i m i n n a l l i s t e n + t o i m i n n a n + t o i m i n n a n a l a s t a + t o i m i n n a n a l a t + t o i m i n n a n a l o i l l a + t o i m i n n a n a l o j a + t o i m i n n a n h a r j o i t t a j a + t o i m i n n a n j o h t a j a a + t o i m i n n a n j o h t a j a l l e + t o i m i n n a n j o h t a j a n + t o i m i n n a n j ä r j e s t ä j i e n + t o i m i n n a n o h j a u s + t o i m i n n a n o h j a u s j ä r j e s t e l m ä + t o i m i n n a n t a r k a s t u s + t o i m i n n a n t a r k a s t u s t a + t o i m i n n a n v a p a u d e n + t o i m i n n a n v a p a u s + t o i m i n n a n v a p a u t e e n + t o i m i n n a n v a p a u t t a + t o i m i n n a s s a + t o i m i n n a s s a a n + t o i m i n n a s s a m m e + t o i m i n n a s t a + t o i m i n n a s t a a n + t o i m i n n a s t a m m e + t o i m i n n a s t a n n e + t o i m i n n a t + t o i m i n n o i l l e + t o i m i n n o i l l e e n + t o i m i n n o i s s a + t o i m i n n o i s t a + t o i m i n n o t + t o i m i n t a a + t o i m i n t a a m m e + t o i m i n t a a n + t o i m i n t a a n i + t o i m i n t a a n n e + t o i m i n t a a n s a + t o i m i n t a b a l e t t i + t o i m i n t a b u d j e t i s t a + t o i m i n t a b u d j e t t i + t o i m i n t a e d e l l y t y k s e t + t o i m i n t a e d e l l y t y k s i i n + t o i m i n t a e d e l l y t y k s i n + t o i m i n t a e d e l l y t y k s i s t ä + t o i m i n t a e d e l l y t y k s i ä + t o i m i n t a e d e l l y t y k s i ä ä n + t o i m i n t a e d e l l y t y s + t o i m i n t a e d e l l y t y s t e n + t o i m i n t a e h d o t u k s e l l a + t o i m i n t a e h d o t u k s e n + t o i m i n t a e h d o t u k s e t + t o i m i n t a e h d o t u k s i a + t o i m i n t a e h d o t u k s i a m m e + t o i m i n t a e h d o t u k s i i n + t o i m i n t a e h d o t u k s i l l a + t o i m i n t a e h d o t u k s i l l e + t o i m i n t a e h d o t u k s i s s a + t o i m i n t a e h d o t u k s i s t a + t o i m i n t a e h d o t u s t a + t o i m i n t a e h t o i h i n + t o i m i n t a e h t o j a + t o i m i n t a e l o k u v a + t o i m i n t a e l o k u v i s t a + t o i m i n t a f o o r u m i + t o i m i n t a f o o r u m i a + t o i m i n t a f o o r u m i l l e + t o i m i n t a f o o r u m i n + t o i m i n t a f o o r u m i s s a + t o i m i n t a h ä i r i ö i d e n + t o i m i n t a h ä i r i ö i s t ä + t o i m i n t a h ä i r i ö i t ä + t o i m i n t a h ä i r i ö t + t o i m i n t a h ä i r i ö t ä + t o i m i n t a j o u k k o i h i n + t o i m i n t a j o u k k o j a + t o i m i n t a j o u k o i l l a + t o i m i n t a j o u k o t + t o i m i n t a j ä r j e s t e l m i i n + t o i m i n t a j ä r j e s t e l m i ä + t o i m i n t a j ä r j e s t e l m ä + t o i m i n t a j ä r j e s t e l m ä n ä + t o i m i n t a j ä r j e s t e l m ä t + t o i m i n t a j ä r j e s t e l m ä ä + t o i m i n t a j ä r j e s t e l m ä ä n s ä + t o i m i n t a j ä r j e s t ö + t o i m i n t a k a n a v i a + t o i m i n t a k a n a v i s t a + t o i m i n t a k a p a s i t e e t i n + t o i m i n t a k a p a s i t e e t t i + t o i m i n t a k a p a s i t e e t t i a + t o i m i n t a k a p a s i t e e t t i a a n + t o i m i n t a k a t k o s + t o i m i n t a k a u d e l l a + t o i m i n t a k a u d e n + t o i m i n t a k a u d e s t a + t o i m i n t a k a u s i + t o i m i n t a k e h i k o n + t o i m i n t a k e h i t y k s e n + t o i m i n t a k e h o t u k s e n + t o i m i n t a k e h o t u k s e s t a m m e + t o i m i n t a k e h o t u k s e t + t o i m i n t a k e h o t u k s i a n n e + t o i m i n t a k e h y k s e e n + t o i m i n t a k e h y k s e l l e + t o i m i n t a k e h y k s e n + t o i m i n t a k e h y k s e s s ä + t o i m i n t a k e h y k s e s t ä + t o i m i n t a k e h y s + t o i m i n t a k e h y s o h j e l m a + t o i m i n t a k e h y s o h j e l m a n + t o i m i n t a k e h y s t ä + t o i m i n t a k e i n o j a + t o i m i n t a k e i n o j e n + t o i m i n t a k e i n o n + t o i m i n t a k e i n o t + t o i m i n t a k e n t i s t ä + t o i m i n t a k e n t t ä + t o i m i n t a k e n t t ä ä + t o i m i n t a k e n t t ä ä n + t o i m i n t a k e n t t ä ä n s ä + t o i m i n t a k e n t ä l l ä + t o i m i n t a k e n t ä n + t o i m i n t a k e r t o m u k s e e n + t o i m i n t a k e r t o m u k s e e n s a + t o i m i n t a k e r t o m u k s e n + t o i m i n t a k e r t o m u k s e n s a + t o i m i n t a k e r t o m u k s e s s a + t o i m i n t a k e r t o m u k s e s s a a n + t o i m i n t a k e r t o m u k s e s t a + t o i m i n t a k e r t o m u k s i a + t o i m i n t a k e r t o m u k s i s s a a n + t o i m i n t a k e r t o m u k s i s t a + t o i m i n t a k e r t o m u s + t o i m i n t a k e r t o m u s l u o n n o k s i a + t o i m i n t a k e r t o m u s t a + t o i m i n t a k e r t o m u s t e n + t o i m i n t a k e s k e i s e e n + t o i m i n t a k e s k u k s e n + t o i m i n t a k e s k u k s e n a + t o i m i n t a k e s k u k s e s t a + t o i m i n t a k e s k u k s i a + t o i m i n t a k e s k u s + t o i m i n t a k e s k u s t e n + t o i m i n t a k e t j u n + t o i m i n t a k e t j u s s a + t o i m i n t a k i e l l o t + t o i m i n t a k i e l t o o n + t o i m i n t a k o h d a t + t o i m i n t a k o h t a a n + t o i m i n t a k o h t a i s i a + t o i m i n t a k o h t i a + t o i m i n t a k o m i t e a + t o i m i n t a k r i t e e r e j ä + t o i m i n t a k r i t e e r i i n + t o i m i n t a k u l t t u u r i l l a + t o i m i n t a k u l u i h i n + t o i m i n t a k u l u i s s a + t o i m i n t a k u l u i s t a + t o i m i n t a k u l u j a + t o i m i n t a k u l u j a a n + t o i m i n t a k u l u j e n + t o i m i n t a k u l u n s a + t o i m i n t a k u l u t + t o i m i n t a k u m p p a n u u d e s t a + t o i m i n t a k u n n o s s a + t o i m i n t a k u n t o i n e n + t o i m i n t a k u n t o o n + t o i m i n t a k u s t a n n u k s e t + t o i m i n t a k u s t a n n u k s i a + t o i m i n t a k u s t a n n u k s i a a n + t o i m i n t a k u s t a n n u k s i i n + t o i m i n t a k u s t a n n u k s i k s i + t o i m i n t a k u s t a n n u k s i l l e + t o i m i n t a k u s t a n n u k s i s t a + t o i m i n t a k u s t a n n u s + t o i m i n t a k u s t a n n u s t e n + t o i m i n t a k u u k a u s i e n + t o i m i n t a k y k y + t o i m i n t a k y k y i n e n + t o i m i n t a k y k y i s e k s i + t o i m i n t a k y k y i s e m m ä n + t o i m i n t a k y k y i s e m p i + t o i m i n t a k y k y i s e m p i ä + t o i m i n t a k y k y i s e m p ä ä n + t o i m i n t a k y k y i s e n + t o i m i n t a k y k y i s e n ä + t o i m i n t a k y k y i s i n ä + t o i m i n t a k y k y i s i ä + t o i m i n t a k y k y i s t e n + t o i m i n t a k y k y i s t ä + t o i m i n t a k y k y m m e + t o i m i n t a k y k y n s ä + t o i m i n t a k y k y y n + t o i m i n t a k y k y ä + t o i m i n t a k y k y ä m m e + t o i m i n t a k y k y ä ä n + t o i m i n t a k y v y l l e + t o i m i n t a k y v y l l ä m m e + t o i m i n t a k y v y n + t o i m i n t a k y v y s t ä + t o i m i n t a k y v y s t ä m m e + t o i m i n t a k y v y t t ö m ä k s i + t o i m i n t a k y v y t ö n + t o i m i n t a k ä y t ä n t ö j e n + t o i m i n t a l a a j u u s + t o i m i n t a l i n j a + t o i m i n t a l i n j a a + t o i m i n t a l i n j a a n + t o i m i n t a l i n j a l l a + t o i m i n t a l i n j a n + t o i m i n t a l i n j a n a + t o i m i n t a l i n j a s s a a n + t o i m i n t a l i n j a s t a + t o i m i n t a l i n j a s t a a n + t o i m i n t a l i n j a t + t o i m i n t a l i n j a u k s e t + t o i m i n t a l i n j a u k s i s s a n n e + t o i m i n t a l i n j a u s t a + t o i m i n t a l i n j a u s t a a n + t o i m i n t a l i n j o i h i n + t o i m i n t a l i n j o i k s i + t o i m i n t a l i n j o i l l a + t o i m i n t a l i n j o i s s a + t o i m i n t a l i n j o i s t a + t o i m i n t a l i n j o j a + t o i m i n t a l i n j o j a m m e + t o i m i n t a l i n j o j e n + t o i m i n t a l i s t a + t o i m i n t a l i s t a n s a + t o i m i n t a l o g i i k k a + t o i m i n t a l o h k o r y h m ä l l e + t o i m i n t a l o h k o s s a + t o i m i n t a l o h k o s t a + t o i m i n t a l o h k o t + t o i m i n t a l u e t t e l o o n + t o i m i n t a l u o k a t + t o i m i n t a l u p a + t o i m i n t a l u p i e n + t o i m i n t a l u v a t + t o i m i n t a l ä h t ö i n e n + t o i m i n t a m a a l a u s + t o i m i n t a m a h d o l l i s u u d e t + t o i m i n t a m a h d o l l i s u u k s i a + t o i m i n t a m a h d o l l i s u u k s i e n + t o i m i n t a m a h d o l l i s u u k s i i n + t o i m i n t a m a h d o l l i s u u k s i l l e + t o i m i n t a m a h d o l l i s u u k s i s t a + t o i m i n t a m a h d o l l i s u u k s i s t a m m e + t o i m i n t a m a h d o l l i s u u s + t o i m i n t a m a h d o l l i s u u t e e n s a + t o i m i n t a m a h d o l l i s u u t e n s a + t o i m i n t a m a h d o l l i s u u t t a + t o i m i n t a m a i s s a + t o i m i n t a m a i s s a m m e + t o i m i n t a m a l l e i h i n + t o i m i n t a m a l l e i n + t o i m i n t a m a l l e i s t a + t o i m i n t a m a l l e i s t a a n + t o i m i n t a m a l l e j a + t o i m i n t a m a l l i + t o i m i n t a m a l l i a + t o i m i n t a m a l l i e h d o t u k s i a + t o i m i n t a m a l l i e n + t o i m i n t a m a l l i i n + t o i m i n t a m a l l i s t a + t o i m i n t a m a l l i t + t o i m i n t a m a r g i n a a l i + t o i m i n t a m a r g i n a a l i m m e + t o i m i n t a m a r g i n a a l i n + t o i m i n t a m e k a n i s m i + t o i m i n t a m e k a n i s m i e n + t o i m i n t a m e k a n i s m i t + t o i m i n t a m e n e t e l m i e n + t o i m i n t a m e n e t e l m i i n + t o i m i n t a m e n e t e l m i s t ä + t o i m i n t a m e n e t e l m i ä + t o i m i n t a m e n e t e l m i ä ä n + t o i m i n t a m e n e t e l m ä + t o i m i n t a m e n e t e l m ä t + t o i m i n t a m e n e t e l m ä ä + t o i m i n t a m e n e t e l m ä ä m m e + t o i m i n t a m e n e t t e l y + t o i m i n t a m e n e t t e l y j e n + t o i m i n t a m e n e t t e l y j ä ä n + t o i m i n t a m e n e t t e l y ä + t o i m i n t a m e n o i h i n + t o i m i n t a m e n o i s t a + t o i m i n t a m e n o j a + t o i m i n t a m e n o j e n + t o i m i n t a m e n o t + t o i m i n t a m e r k i n + t o i m i n t a m m e + t o i m i n t a m u o d o t + t o i m i n t a m u o t o + t o i m i n t a m u o t o a + t o i m i n t a m u o t o j a + t o i m i n t a m u o t o j e n + t o i m i n t a m ä ä r ä r a h a t + t o i m i n t a m ä ä r ä r a h o i h i n + t o i m i n t a m ä ä r ä r a h o i s t a + t o i m i n t a m ä ä r ä r a h o j a + t o i m i n t a m ä ä r ä r a h o j e n + t o i m i n t a n a + t o i m i n t a n o r m e i s t a + t o i m i n t a n o r m e j a + t o i m i n t a n o r m i n + t o i m i n t a n s a + t o i m i n t a n ä k ö k o h t i i n + t o i m i n t a o h j e + t o i m i n t a o h j e e n + t o i m i n t a o h j e e n a a n + t o i m i n t a o h j e e t + t o i m i n t a o h j e i d e n + t o i m i n t a o h j e i s t a + t o i m i n t a o h j e i s t o + t o i m i n t a o h j e i s t o a + t o i m i n t a o h j e i s t o n + t o i m i n t a o h j e i s t o t + t o i m i n t a o h j e i t a + t o i m i n t a o h j e l m a + t o i m i n t a o h j e l m a a + t o i m i n t a o h j e l m a a m m e + t o i m i n t a o h j e l m a a n + t o i m i n t a o h j e l m a a n n e + t o i m i n t a o h j e l m a a n s a + t o i m i n t a o h j e l m a e h d o t u k s e n + t o i m i n t a o h j e l m a k e s k u s t e l u + t o i m i n t a o h j e l m a k s i + t o i m i n t a o h j e l m a l l a + t o i m i n t a o h j e l m a l l a a n + t o i m i n t a o h j e l m a l l e + t o i m i n t a o h j e l m a l u o n n o k s e e n + t o i m i n t a o h j e l m a m m e + t o i m i n t a o h j e l m a n + t o i m i n t a o h j e l m a n s a + t o i m i n t a o h j e l m a s s a + t o i m i n t a o h j e l m a s s a a n + t o i m i n t a o h j e l m a s s a m m e + t o i m i n t a o h j e l m a s s a n n e + t o i m i n t a o h j e l m a s t a + t o i m i n t a o h j e l m a s t a a n + t o i m i n t a o h j e l m a s t a k i n + t o i m i n t a o h j e l m a t + t o i m i n t a o h j e l m i a + t o i m i n t a o h j e l m i a a n + t o i m i n t a o h j e l m i e n + t o i m i n t a o h j e l m i e n h a n + t o i m i n t a o h j e l m i e n s a + t o i m i n t a o h j e l m i i n + t o i m i n t a o h j e l m i i n s a + t o i m i n t a o h j e l m i k s i + t o i m i n t a o h j e l m i l l a + t o i m i n t a o h j e l m i l l e + t o i m i n t a o h j e l m i l t a + t o i m i n t a o h j e l m i s s a + t o i m i n t a o h j e l m i s s a a n + t o i m i n t a o h j e l m i s t a + t o i m i n t a o i k e u d e t + t o i m i n t a o l o i s s a + t o i m i n t a o l o s u h t e e t + t o i m i n t a o l o s u h t e i d e n + t o i m i n t a o l o s u h t e i s s a + t o i m i n t a o l o s u h t e i s t a + t o i m i n t a o l o s u h t e i t a + t o i m i n t a o l o t + t o i m i n t a o n g e l m a + t o i m i n t a o p p a a s s a + t o i m i n t a p a + t o i m i n t a p a i n e i t a + t o i m i n t a p a i n o t t e i s e m p i + t o i m i n t a p a k e t i n + t o i m i n t a p a k e t t e j a + t o i m i n t a p a k e t t i i n + t o i m i n t a p a k o s t a + t o i m i n t a p e l i + t o i m i n t a p e r i a a t e + t o i m i n t a p e r i a a t t e e n a + t o i m i n t a p e r i a a t t e e t + t o i m i n t a p e r i a a t t e i d e n + t o i m i n t a p e r i a a t t e i k s i + t o i m i n t a p e r i a a t t e i s i i n + t o i m i n t a p e r i a a t t e i s s a a n + t o i m i n t a p e r i a a t t e i s t a + t o i m i n t a p e r i a a t t e i s t a m m e + t o i m i n t a p e r i a a t t e i t a + t o i m i n t a p e r u s t a + t o i m i n t a p e r u s t a n + t o i m i n t a p e r u s t a s t a + t o i m i n t a p e r u s t e i n e n + t o i m i n t a p e r u s t e i s e e n + t o i m i n t a p e r u s t e i s e l l e + t o i m i n t a p e r u s t e i s e n + t o i m i n t a p i i r i n + t o i m i n t a p i s t e i s t ä + t o i m i n t a p o l i i t t i s e s s a + t o i m i n t a p o l i i t t i s t e n + t o i m i n t a p o l i t i i k a n + t o i m i n t a p o l i t i i k k a a + t o i m i n t a p o l i t i i k k o j e m m e + t o i m i n t a p o t e n t i a a l i + t o i m i n t a p r i o r i t e e t i t + t o i m i n t a p r o s e s s e i s t a + t o i m i n t a p r o s e s s e j a + t o i m i n t a p u i t t e e t + t o i m i n t a p u i t t e i d e n + t o i m i n t a p u i t t e i s s a + t o i m i n t a p u i t t e i s t a + t o i m i n t a p u i t t e i t a + t o i m i n t a p u o l u e + t o i m i n t a p y y n n ö s t ä m m e + t o i m i n t a p y y n t ö ö n + t o i m i n t a p ä i v ä + t o i m i n t a p ä i v ä n ä + t o i m i n t a p ä i v ä ä + t o i m i n t a p ä ä o m a n + t o i m i n t a p ä ä t ö k s e n s ä + t o i m i n t a p ä ä t ö k s e t + t o i m i n t a p ä ä t ö k s i s s ä + t o i m i n t a r a h a s t o i s s a + t o i m i n t a r a h a s t o j a + t o i m i n t a r a h a s t o j e n + t o i m i n t a r a h a s t o l l a + t o i m i n t a r a h a s t o t + t o i m i n t a r a j o i t t e i s i i n + t o i m i n t a r a j o i t t e i s t e n + t o i m i n t a r a j o i t u k s e n + t o i m i n t a r a j o i t u k s e t + t o i m i n t a r a j o i t u k s i a + t o i m i n t a r a j o i t u k s i s t a a n + t o i m i n t a r a j o i t u s + t o i m i n t a r a j o i t u s t e n + t o i m i n t a r a k e n n e + t o i m i n t a r a k e n t e e s e e n + t o i m i n t a r a k e n t e i s i i n + t o i m i n t a r a k e n t e i t a + t o i m i n t a r a k e n t e i t a a n + t o i m i n t a r a t k a i s u j e n + t o i m i n t a r e s u r s s i a + t o i m i n t a r e s u r s s i e n + t o i m i n t a r i s k i + t o i m i n t a r o o l i p e l i + t o i m i n t a r y h m i e m m e + t o i m i n t a r y h m i e n + t o i m i n t a r y h m i ä + t o i m i n t a r y h m ä + t o i m i n t a r y h m ä n + t o i m i n t a r y h m ä s s ä + t o i m i n t a r y h m ä t + t o i m i n t a r y h m ä ä + t o i m i n t a r y h m ä ä n + t o i m i n t a s a n k a r i + t o i m i n t a s e i k k a i l u p e l i + t o i m i n t a s e k t o r e i l l a + t o i m i n t a s e k t o r i + t o i m i n t a s e k t o r i e n + t o i m i n t a s e k t o r i n s a + t o i m i n t a s o p i m u k s e e n + t o i m i n t a s o p i m u k s i a + t o i m i n t a s t a n d a r d i t + t o i m i n t a s t r a t e g i a + t o i m i n t a s t r a t e g i a a + t o i m i n t a s t r a t e g i a a m m e + t o i m i n t a s t r a t e g i a a n + t o i m i n t a s t r a t e g i a a n n e + t o i m i n t a s t r a t e g i a l l a + t o i m i n t a s t r a t e g i a m m e + t o i m i n t a s t r a t e g i a n + t o i m i n t a s t r a t e g i a n s a + t o i m i n t a s t r a t e g i a s s a + t o i m i n t a s t r a t e g i a s s a a n + t o i m i n t a s t r a t e g i a s s a m m e + t o i m i n t a s t r a t e g i a s t a + t o i m i n t a s t r a t e g i a t + t o i m i n t a s t r a t e g i o i d e n + t o i m i n t a s t r a t e g i o i s t a + t o i m i n t a s u o s i t u k s e s s a + t o i m i n t a s u o s i t u k s i a + t o i m i n t a s u o s i t u k s i n e e n + t o i m i n t a s u o s i t u k s i s s a + t o i m i n t a s u o s i t u s t e n + t o i m i n t a s u u n n a n + t o i m i n t a s u u n n a s s a + t o i m i n t a s u u n n i t e l m a + t o i m i n t a s u u n n i t e l m a a + t o i m i n t a s u u n n i t e l m a a m m e + t o i m i n t a s u u n n i t e l m a a n + t o i m i n t a s u u n n i t e l m a a n n e + t o i m i n t a s u u n n i t e l m a a n s a + t o i m i n t a s u u n n i t e l m a e h d o t u k s e k s i + t o i m i n t a s u u n n i t e l m a e h d o t u k s e s s a + t o i m i n t a s u u n n i t e l m a e h d o t u k s e s t a + t o i m i n t a s u u n n i t e l m a e h d o t u k s e t + t o i m i n t a s u u n n i t e l m a e h d o t u s + t o i m i n t a s u u n n i t e l m a k i n + t o i m i n t a s u u n n i t e l m a k s i + t o i m i n t a s u u n n i t e l m a l l a + t o i m i n t a s u u n n i t e l m a l l a m m e + t o i m i n t a s u u n n i t e l m a l l e + t o i m i n t a s u u n n i t e l m a l l e e n + t o i m i n t a s u u n n i t e l m a l l e m m e + t o i m i n t a s u u n n i t e l m a l t a + t o i m i n t a s u u n n i t e l m a l u o n n o k s e n + t o i m i n t a s u u n n i t e l m a l u o n n o k s e s s a + t o i m i n t a s u u n n i t e l m a l u o n n o k s e s t a + t o i m i n t a s u u n n i t e l m a l u o n n o s + t o i m i n t a s u u n n i t e l m a m m e + t o i m i n t a s u u n n i t e l m a n + t o i m i n t a s u u n n i t e l m a n a + t o i m i n t a s u u n n i t e l m a n h a n + t o i m i n t a s u u n n i t e l m a n i + t o i m i n t a s u u n n i t e l m a n s a + t o i m i n t a s u u n n i t e l m a p a k e t t i a + t o i m i n t a s u u n n i t e l m a s s a + t o i m i n t a s u u n n i t e l m a s s a a n + t o i m i n t a s u u n n i t e l m a s s a m m e + t o i m i n t a s u u n n i t e l m a s s a m m e k i n + t o i m i n t a s u u n n i t e l m a s s a n n e + t o i m i n t a s u u n n i t e l m a s s a n n e k i n + t o i m i n t a s u u n n i t e l m a s t a + t o i m i n t a s u u n n i t e l m a s t a a n + t o i m i n t a s u u n n i t e l m a s t a n n e + t o i m i n t a s u u n n i t e l m a t + t o i m i n t a s u u n n i t e l m i a + t o i m i n t a s u u n n i t e l m i a a n + t o i m i n t a s u u n n i t e l m i a k i n + t o i m i n t a s u u n n i t e l m i e n + t o i m i n t a s u u n n i t e l m i e n s a + t o i m i n t a s u u n n i t e l m i i m m e + t o i m i n t a s u u n n i t e l m i i n + t o i m i n t a s u u n n i t e l m i l l a + t o i m i n t a s u u n n i t e l m i l l a a n + t o i m i n t a s u u n n i t e l m i l l e + t o i m i n t a s u u n n i t e l m i n + t o i m i n t a s u u n n i t e l m i n e e n + t o i m i n t a s u u n n i t e l m i s s a + t o i m i n t a s u u n n i t e l m i s s a a n + t o i m i n t a s u u n n i t e l m i s s a m m e + t o i m i n t a s u u n n i t e l m i s t a + t o i m i n t a s u u n t a + t o i m i n t a s u u n t a a n s a + t o i m i n t a s u u n t i a + t o i m i n t a s ä d e t t ä ä n + t o i m i n t a s ä ä n n ö i s s ä ä n + t o i m i n t a s ä ä n n ö i s t ä + t o i m i n t a s ä ä n n ö i s t ä ä n + t o i m i n t a s ä ä n n ö s t e n + t o i m i n t a s ä ä n n ö s t ö ä + t o i m i n t a s ä ä n n ö t + t o i m i n t a s ä ä n t ö i h i n + t o i m i n t a s ä ä n t ö j e n + t o i m i n t a s ä ä n t ö j ä + t o i m i n t a s ä ä n t ö j ä ä n + t o i m i n t a t a k t i i k a n + t o i m i n t a t a l o u s a r v i o + t o i m i n t a t a l o u s a r v i o k s i + t o i m i n t a t a l o u s a r v i o n + t o i m i n t a t a l o u s a r v i o s s a + t o i m i n t a t a l o u s a r v i o s t a + t o i m i n t a t a l o u s a r v i o t a + t o i m i n t a t a p a + t o i m i n t a t a p a a + t o i m i n t a t a p a a m m e + t o i m i n t a t a p a a n + t o i m i n t a t a p a a n s a + t o i m i n t a t a p a m m e + t o i m i n t a t a p a m u u t o s + t o i m i n t a t a p a n a + t o i m i n t a t a p a n n e + t o i m i n t a t a p a n s a + t o i m i n t a t a p o i h i n + t o i m i n t a t a p o j a + t o i m i n t a t a p o j a a n + t o i m i n t a t a p o j a m m e + t o i m i n t a t a p o j e m m e + t o i m i n t a t a p o j e n + t o i m i n t a t a r k a s t u s + t o i m i n t a t a r m o n + t o i m i n t a t a r p e e s t a + t o i m i n t a t a r v e + t o i m i n t a t a r v e t t a + t o i m i n t a t a s o a + t o i m i n t a t a s o a m m e + t o i m i n t a t a s o l l a + t o i m i n t a t a v a k s i + t o i m i n t a t a v a l l a + t o i m i n t a t a v a l l e m m e + t o i m i n t a t a v a l t a a n + t o i m i n t a t a v a n + t o i m i n t a t a v a s s a + t o i m i n t a t a v a s t a + t o i m i n t a t a v a s t a a n + t o i m i n t a t a v a t + t o i m i n t a t a v o i l l e e n + t o i m i n t a t a v o i s t a + t o i m i n t a t a v o i s t a a n + t o i m i n t a t a v o i s t a m m e + t o i m i n t a t a v o i t e + t o i m i n t a t a v o i t t e e k s e e n + t o i m i n t a t a v o i t t e e n + t o i m i n t a t a v o i t t e e t + t o i m i n t a t a v o i t t e i d e n + t o i m i n t a t a v o i t t e i s i i m m e + t o i m i n t a t a v o i t t e i s t a + t o i m i n t a t a v o i t t e i t a + t o i m i n t a t e h o k k u u t t a + t o i m i n t a t e h t ä v ä + t o i m i n t a t e r a p e u t t i + t o i m i n t a t e r a p i a + t o i m i n t a t u e k s i + t o i m i n t a t u e l l a + t o i m i n t a t u e n + t o i m i n t a t u e t + t o i m i n t a t u k e a + t o i m i n t a t u k i + t o i m i n t a t u k i a + t o i m i n t a t u k i e n + t o i m i n t a t u k i i n + t o i m i n t a t u k i m o n o p o l i n + t o i m i n t a t u r v a l l i s u u d e n + t o i m i n t a t u r v a l l i s u u s + t o i m i n t a t u r v a l l i s u u s s y i s t ä k i n + t o i m i n t a t u r v a l l i s u u t e e n + t o i m i n t a t u t k i m u s + t o i m i n t a t y y p p i + t o i m i n t a t y y p p i e n + t o i m i n t a v a a t i m u k s e e n + t o i m i n t a v a a t i m u k s i i n + t o i m i n t a v a a t i m u k s i s t a + t o i m i n t a v a a t i m u s t e n + t o i m i n t a v a h v u u k s i n e e n + t o i m i n t a v a i h e + t o i m i n t a v a i h e e n + t o i m i n t a v a i h e e s e e n + t o i m i n t a v a i h e e s e e n s a + t o i m i n t a v a i h t o e h d o i s t a + t o i m i n t a v a i h t o e h d o t + t o i m i n t a v a i h t o e h t o + t o i m i n t a v a i h t o e h t o a + t o i m i n t a v a i h t o e h t o j a + t o i m i n t a v a i h t o e h t o j e n + t o i m i n t a v a i h t o e h t o n a + t o i m i n t a v a i k e u k s i a + t o i m i n t a v a l l a n + t o i m i n t a v a l m i i k s i + t o i m i n t a v a l m i i n a + t o i m i n t a v a l m i i t a + t o i m i n t a v a l m i s + t o i m i n t a v a l m i u d e n + t o i m i n t a v a l m i u d e s t a + t o i m i n t a v a l m i u d e t + t o i m i n t a v a l m i u k s i a + t o i m i n t a v a l m i u k s i a a n + t o i m i n t a v a l m i u k s i a m m e + t o i m i n t a v a l m i u k s i e n + t o i m i n t a v a l m i u k s i l l e m m e + t o i m i n t a v a l m i u s + t o i m i n t a v a l m i u t e m m e + t o i m i n t a v a l m i u t e n s a + t o i m i n t a v a l m i u t t a + t o i m i n t a v a l t a a + t o i m i n t a v a l t u u d e t + t o i m i n t a v a l t u u k s i a + t o i m i n t a v a l t u u k s i a a n + t o i m i n t a v a l t u u k s i e n + t o i m i n t a v a p a u d e n + t o i m i n t a v a p a u k s i a + t o i m i n t a v a p a u s + t o i m i n t a v a p a u t e e n + t o i m i n t a v a p a u t e n s a + t o i m i n t a v a p a u t t a + t o i m i n t a v a p a u t t a a n + t o i m i n t a v a r a + t o i m i n t a v a r a a + t o i m i n t a v a r a u s + t o i m i n t a v a r m e m p a a + t o i m i n t a v a r m o j a + t o i m i n t a v a r m u u d e n + t o i m i n t a v a r m u u d e s t a + t o i m i n t a v a r m u u s + t o i m i n t a v a r m u u t e e n + t o i m i n t a v a r m u u t t a + t o i m i n t a v a s t u u + t o i m i n t a v a s t u u t a + t o i m i n t a v e r k k o i h i n + t o i m i n t a v e r k o s t o n + t o i m i n t a v i i k k o + t o i m i n t a v i i k k o j e n + t o i m i n t a v i i k k o o n + t o i m i n t a v i r h e i t ä + t o i m i n t a v u o d e k s i + t o i m i n t a v u o d e n + t o i m i n t a v u o d e s t a + t o i m i n t a v u o d e s t a a n + t o i m i n t a v u o n n a + t o i m i n t a v u o s i + t o i m i n t a v u o s i e n s a + t o i m i n t a v u o t e n s a + t o i m i n t a v u o t t a + t o i m i n t a v ä l i n e + t o i m i n t a v ä l i n e e n + t o i m i n t a v ä l i n e e t + t o i m i n t a v ä l i n e i d e n + t o i m i n t a v ä l i n e i t ä + t o i m i n t a y h t e i s ö + t o i m i n t a y h t e i s ö n + t o i m i n t a y h t e i s ö s s ä + t o i m i n t a y h t e i s ö ä + t o i m i n t a y k s i k k ö + t o i m i n t a y k s i k k ö j e n + t o i m i n t a y k s i k k ö ä + t o i m i n t a y k s i k ö i d e n + t o i m i n t a y k s i k ö i t ä + t o i m i n t a y k s i k ö k s i + t o i m i n t a y k s i k ö t + t o i m i n t a y l i j ä ä m i s t ä + t o i m i n t a y m p ä r i s t ö + t o i m i n t a y m p ä r i s t ö n + t o i m i n t a y m p ä r i s t ö n ä + t o i m i n t a y m p ä r i s t ö s s ä + t o i m i n t a y m p ä r i s t ö ä + t o i m i n t a y m p ä r i s t ö ö n + t o i m i n t o i h i n + t o i m i n t o j a + t o i m i n t o j e n + t o i m i n t o j o h t a m i s e s t a + t o i m i n t o j o h t a m i s j ä r j e s t e l m ä n + t o i m i n t o p e r u s t e i n e n + t o i m i n t o p e r u s t e i s e e n + t o i m i n t o p e r u s t e i s e k s i + t o i m i n t o p e r u s t e i s e l l a + t o i m i n t o p e r u s t e i s e l l e + t o i m i n t o p e r u s t e i s e n + t o i m i n t o p e r u s t e i s e s s a + t o i m i n t o p e r u s t e i s e s t i + t o i m i n t o p e r u s t e i s t a + t o i m i n t o s e l v i t y k s e t + t o i m i n u t + t o i m i p a i k a n + t o i m i p a i k a s s a + t o i m i p a i k a s t a + t o i m i p a i k a t + t o i m i p a i k k a + t o i m i p a i k k a a + t o i m i p a i k k a a n + t o i m i p a i k k a k y s y m y k s i l l ä + t o i m i p a i k k a k y s y m y s + t o i m i p a i k k a m m e + t o i m i p a i k k a n s a + t o i m i p a i k k a t a s o l l a + t o i m i p a i k k o j a + t o i m i p a i k k o j e n + t o i m i p a i k o i l l a m m e + t o i m i p a i k o i s s a + t o i m i p a k e t i n + t o i m i p a k e t i s t a + t o i m i p i s t e e s s ä + t o i m i r a k e n t e i t a + t o i m i s i + t o i m i s i k o + t o i m i s i m m e + t o i m i s i n + t o i m i s i v a t + t o i m i s s a + t o i m i s s a a n + t o i m i s s a m m e + t o i m i s s a n n e + t o i m i s t a + t o i m i s t a a n + t o i m i s t a k a a n + t o i m i s t a m m e + t o i m i s t a n n e + t o i m i s t o a + t o i m i s t o i h i n + t o i m i s t o i l l e + t o i m i s t o i n + t o i m i s t o i s t a + t o i m i s t o j a + t o i m i s t o j e n + t o i m i s t o k i i n t e i s t ö n + t o i m i s t o k o r v a u k s e t + t o i m i s t o k u l u j e n s a + t o i m i s t o l a i t t e e t + t o i m i s t o l a i t t e i d e n + t o i m i s t o l a i t t e i s s a + t o i m i s t o l l a a n + t o i m i s t o l l e + t o i m i s t o m m e + t o i m i s t o n + t o i m i s t o n i + t o i m i s t o p o l i t i i k a s t a + t o i m i s t o r a k e n n u k s e n + t o i m i s t o r a k e n n u s + t o i m i s t o r a k e n n u s t e n + t o i m i s t o s s a a n + t o i m i s t o s s a n i + t o i m i s t o s t a + t o i m i s t o t + t o i m i s t o t a r v i k k e e t + t o i m i s t o t a r v i k k e i s i i n + t o i m i s t o t a r v i k k e i t a + t o i m i s t o t e h t ä v i ä + t o i m i s t o t i l a a + t o i m i s t o t i l a s t a + t o i m i s t o t i l o i s t a + t o i m i s t o t i l o j a + t o i m i s t o t i l o j e n + t o i m i s t o t y ö + t o i m i s t o t ö i t ä + t o i m i t a a n + t o i m i t a m m e + t o i m i t a n + t o i m i t a p a m u u t o s t a + t o i m i t a v a t + t o i m i t e t a a n + t o i m i t e t a a n k o + t o i m i t e t t a i s i + t o i m i t e t t a i s i i n + t o i m i t e t t a v a a n + t o i m i t e t t a v a t + t o i m i t e t t u a + t o i m i t i l a a + t o i m i t i l a j o h t a m i n e n + t o i m i t i l a n + t o i m i t i l a n s a + t o i m i t i l o j a + t o i m i t i t t e + t o i m i t t a a + t o i m i t t a a k o + t o i m i t t a a k s e e n + t o i m i t t a a k s e m m e + t o i m i t t a a k s e n i + t o i m i t t a e s s a + t o i m i t t a i s i n + t o i m i t t a i s i v a t + t o i m i t t a j a a + t o i m i t t a j a a n + t o i m i t t a j a l i i t o n + t o i m i t t a j a l t a + t o i m i t t a j a m a i d e n + t o i m i t t a j a m u r h i e n + t o i m i t t a j a n + t o i m i t t a j a n a + t o i m i t t a j a r y h m ä n + t o i m i t t a j a t + t o i m i t t a j a t a p a u s t a + t o i m i t t a j a v a l t i o + t o i m i t t a j a v a l t i o i d e n + t o i m i t t a j a v a l t i o i h i n + t o i m i t t a j a v a l t i o i t a + t o i m i t t a j a v a l t i o s t a + t o i m i t t a j a y r i t y k s i l l e + t o i m i t t a j a y s t ä v ä n i + t o i m i t t a j i a + t o i m i t t a j i e n + t o i m i t t a j i l t a + t o i m i t t a j i s t a + t o i m i t t a k a a m m e + t o i m i t t a m a a + t o i m i t t a m a a n + t o i m i t t a m a a n i + t o i m i t t a m a l l a + t o i m i t t a m a t + t o i m i t t a m a t t a + t o i m i t t a m i e n + t o i m i t t a m i i m m e + t o i m i t t a m i s e e n + t o i m i t t a m i s e s s a + t o i m i t t a m i s e s t a + t o i m i t t a m i s j ä r j e s t e l y j e n + t o i m i t t a m i s t a + t o i m i t t a m i s v a a t i m u k s i i n + t o i m i t t a n u t + t o i m i t t a v a + t o i m i t t a v a n + t o i m i t t a v a t + t o i m i t t a v i e n + t o i m i t t i + t o i m i t t u + t o i m i t t u k i n + t o i m i t u k s e l l i s t a + t o i m i t u k s e t + t o i m i t u k s i a + t o i m i t u k s i i n + t o i m i t u k s i s s a + t o i m i t u k s i s t a + t o i m i t u s a i k a + t o i m i t u s a i k a t a u l u a + t o i m i t u s a i k o j a + t o i m i t u s a j a t + t o i m i t u s a j o i s t a + t o i m i t u s a l a l l a + t o i m i t u s a l u e i s t a + t o i m i t u s e h d o i s s a + t o i m i t u s e h d o i s t a + t o i m i t u s e h t o j a + t o i m i t u s e h t o j e n + t o i m i t u s h a l l i t u s + t o i m i t u s h ä i r i ö + t o i m i t u s h ä i r i ö i d e n + t o i m i t u s h ä i r i ö i l l e + t o i m i t u s h ä i r i ö t + t o i m i t u s h ä i r i ö ö n + t o i m i t u s i n f r a s t r u k t u u r i a + t o i m i t u s i n f r a s t r u k t u u r i i n + t o i m i t u s j o h t a j a + t o i m i t u s j o h t a j a k s i + t o i m i t u s j o h t a j a l l a + t o i m i t u s j o h t a j a l l e + t o i m i t u s j o h t a j a l t a + t o i m i t u s j o h t a j a n + t o i m i t u s j o h t a j a n a + t o i m i t u s j o h t a j a t + t o i m i t u s j o h t a j i e n + t o i m i t u s j ä r j e s t e l m i e n + t o i m i t u s j ä r j e s t e l m i ä + t o i m i t u s j ä r j e s t e l m ä + t o i m i t u s j ä r j e s t e l m ä m m e + t o i m i t u s j ä r j e s t e l m ä s t ä + t o i m i t u s j ä r j e s t e l m ä t + t o i m i t u s j ä r j e s t e l m ä ä + t o i m i t u s j ä r j e s t e l y + t o i m i t u s j ä r j e s t e l y j ä + t o i m i t u s j ä r j e s t e l y t + t o i m i t u s k a n a v i a + t o i m i t u s k a n a v i e n + t o i m i t u s k a u t t a + t o i m i t u s k e t j u + t o i m i t u s k e t j u a + t o i m i t u s k e t j u i h i n + t o i m i t u s k e t j u i s s a + t o i m i t u s k e t j u j a + t o i m i t u s k e t j u j e n + t o i m i t u s k e t j u l l e + t o i m i t u s k e t j u n + t o i m i t u s k e t j u n s a + t o i m i t u s k e t j u s s a + t o i m i t u s k e t j u s t a + t o i m i t u s k e t j u s t a a n + t o i m i t u s k e t j u t + t o i m i t u s k e t j u u n + t o i m i t u s k e t j u u n s a + t o i m i t u s k i e l l o n + t o i m i t u s k i i n t i ö j ä r j e s t e l m i s t ä + t o i m i t u s k i i n t i ö j ä r j e s t e l m ä t + t o i m i t u s k o m i s s i o + t o i m i t u s k o m i s s i o n a + t o i m i t u s k r i i s e j ä + t o i m i t u s k r i i s i e n + t o i m i t u s k r i i s i i n + t o i m i t u s k r i i s i n + t o i m i t u s k u s t a n n u k s e t + t o i m i t u s k u s t a n n u k s i a + t o i m i t u s l ä h d e + t o i m i t u s l ä h t e e s t ä + t o i m i t u s l ä h t e e t + t o i m i t u s l ä h t e i d e n + t o i m i t u s l ä h t e i s t ä + t o i m i t u s l ä h t e i t ä + t o i m i t u s l ä h t e i t ä ä n + t o i m i t u s m a k s u + t o i m i t u s m a k s u a + t o i m i t u s m a k s u i s t a + t o i m i t u s m a k s u j a + t o i m i t u s m a k s u j e n + t o i m i t u s m a k s u n + t o i m i t u s m a k s u o n g e l m a a n + t o i m i t u s m a k s u t + t o i m i t u s m a r k k i n a t + t o i m i t u s m e k a n i s m e j a + t o i m i t u s m i n i s t e r i s t ö + t o i m i t u s o i k e u d e n + t o i m i t u s o i k e u k s i a + t o i m i t u s o i k e u k s i e n + t o i m i t u s o n g e l m i a + t o i m i t u s o n g e l m i e n + t o i m i t u s o n g e l m i i n + t o i m i t u s o n g e l m i l t a + t o i m i t u s p i s t e i t ä + t o i m i t u s p o h j a a n s a + t o i m i t u s p r o s e s s e i s s a + t o i m i t u s p r o s e s s i a + t o i m i t u s p u o l e l l a + t o i m i t u s p ä i v i e n + t o i m i t u s r a k e n t e i d e n + t o i m i t u s r e i t e i l l e + t o i m i t u s r e i t e i s t ä + t o i m i t u s r e i t i n + t o i m i t u s r e i t i s t ä + t o i m i t u s r e i t i t + t o i m i t u s r e i t t e i h i n + t o i m i t u s r e i t t e j ä + t o i m i t u s r e i t t i e n + t o i m i t u s r e i t t i ä + t o i m i t u s r e s u r s s i e n + t o i m i t u s s o p i m u k s e n + t o i m i t u s s o p i m u k s e t + t o i m i t u s s o p i m u k s i a + t o i m i t u s s o p i m u k s i l l a + t o i m i t u s s o p i m u k s i l l e + t o i m i t u s s o p i m u s + t o i m i t u s s o p i m u s t e n + t o i m i t u s s t r a t e g i o i t a + t o i m i t u s s ä ä n t ö j ä + t o i m i t u s t a + t o i m i t u s t a k e i t a + t o i m i t u s t a r p e e n + t o i m i t u s t a r p e i s t a + t o i m i t u s t a r p e i t a + t o i m i t u s t e n + t o i m i t u s t u r v a l l i s u u t e e n + t o i m i t u s v a h v i s t u s a i k a + t o i m i t u s v a i h t o e h t o j e n + t o i m i t u s v a i k e u k s i a + t o i m i t u s v a r m u u d e l l a + t o i m i t u s v a r m u u d e l l e m m e + t o i m i t u s v a r m u u d e n + t o i m i t u s v a r m u u d e s t a + t o i m i t u s v a r m u u s + t o i m i t u s v a r m u u s h a n + t o i m i t u s v a r m u u s k y s y m y k s i ä + t o i m i t u s v a r m u u s o n g e l m a + t o i m i t u s v a r m u u s p o l i t i i k k a a + t o i m i t u s v a r m u u t e e n + t o i m i t u s v a r m u u t t a + t o i m i t u s v a r m u u t t a k i n + t o i m i t u s v e r k k o j e n + t o i m i t u s v e r k o i s s a + t o i m i t u s v e r k o n + t o i m i t u s v e r k o s t o j a + t o i m i t u s v ä y l ä s t ä + t o i m i v a a + t o i m i v a a n + t o i m i v a k s i + t o i m i v a l l a l l e + t o i m i v a l l a n + t o i m i v a l l a n j a k o + t o i m i v a l l a n j a k o a + t o i m i v a l l a n j a k o o n + t o i m i v a l l a n j a o n + t o i m i v a l l a s s a + t o i m i v a l l a s s a n i + t o i m i v a l l a s t a + t o i m i v a l l a s t a a n + t o i m i v a l l a t + t o i m i v a l t a + t o i m i v a l t a a + t o i m i v a l t a a m m e + t o i m i v a l t a a n + t o i m i v a l t a a n s a + t o i m i v a l t a i n e n + t o i m i v a l t a i s e k s i + t o i m i v a l t a i s e l l e + t o i m i v a l t a i s e n + t o i m i v a l t a i s e s s a + t o i m i v a l t a i s e t + t o i m i v a l t a i s i a + t o i m i v a l t a i s i i n + t o i m i v a l t a i s i l l a + t o i m i v a l t a i s i l l e + t o i m i v a l t a i s i n a + t o i m i v a l t a i s i s s a + t o i m i v a l t a i s i s t a + t o i m i v a l t a i s t e n + t o i m i v a l t a j a k o + t o i m i v a l t a j a k o a + t o i m i v a l t a j a k o o n + t o i m i v a l t a j a o l l e + t o i m i v a l t a j a o n + t o i m i v a l t a j a o s t a + t o i m i v a l t a k e s k u s t e l u u n + t o i m i v a l t a k i i s t a + t o i m i v a l t a k i i s t a s s a + t o i m i v a l t a k i i s t a s t a + t o i m i v a l t a k i i s t a t + t o i m i v a l t a k i i s t o i h i n + t o i m i v a l t a k i i s t o i l t a + t o i m i v a l t a k i i s t o i s t a + t o i m i v a l t a k i i s t o j a + t o i m i v a l t a k i i s t o j e n + t o i m i v a l t a k i l p a i l u n + t o i m i v a l t a k y s y m y k s e e n + t o i m i v a l t a k y s y m y k s e n + t o i m i v a l t a k y s y m y k s e s t ä + t o i m i v a l t a k y s y m y k s e t + t o i m i v a l t a k y s y m y k s i i n + t o i m i v a l t a k y s y m y k s i s s ä + t o i m i v a l t a k y s y m y k s i s t ä + t o i m i v a l t a k y s y m y k s i ä + t o i m i v a l t a k y s y m y s + t o i m i v a l t a l a u s e k k e e n + t o i m i v a l t a l u e t t e l o + t o i m i v a l t a l u e t t e l o a + t o i m i v a l t a l u e t t e l o i d e n + t o i m i v a l t a l u e t t e l o n + t o i m i v a l t a l u e t t e l o s t a + t o i m i v a l t a n s a + t o i m i v a l t a o n g e l m a m m e + t o i m i v a l t a o n g e l m a n + t o i m i v a l t a r a j o i t u k s e t + t o i m i v a l t a r a k e n n e + t o i m i v a l t a r a k e n n e t t a + t o i m i v a l t a r i i d o i s t a + t o i m i v a l t a r i i t o i h i n + t o i m i v a l t a r i i t o j e n + t o i m i v a l t a r i s t i r i i d a t + t o i m i v a l t a r i s t i r i i d o i s t a + t o i m i v a l t a r i s t i r i i t a + t o i m i v a l t a r i s t i r i i t a a + t o i m i v a l t a r i s t i r i i t o i h i n + t o i m i v a l t a r i s t i r i i t o j a + t o i m i v a l t a r i s t i r i i t o j e n + t o i m i v a l t a s u h t e e t + t o i m i v a l t a s ä ä n n ö k s i i n + t o i m i v a l t a s ä ä n n ö t + t o i m i v a l t a s ä ä n t ö j e n + t o i m i v a l t a s ä ä n t ö j ä + t o i m i v a l t a s ä ä n t ö ä + t o i m i v a l t o j e n + t o i m i v a l t u u d e t + t o i m i v a l t u u k s i a + t o i m i v a l t u u k s i a a n + t o i m i v a l t u u k s i e n + t o i m i v a l t u u k s i i m m e + t o i m i v a l t u u k s i l l e + t o i m i v a l t u u k s i s t a + t o i m i v a l t u u s + t o i m i v a l t u u s k y s y m y s t ä + t o i m i v a l t u u t e n s a + t o i m i v a m m a k s i + t o i m i v a m m a l l a + t o i m i v a m m a l t a + t o i m i v a m m a n + t o i m i v a m m a t + t o i m i v a m m e + t o i m i v a m m i k s i + t o i m i v a m p a a + t o i m i v a m p a a n + t o i m i v a m p a n a + t o i m i v a m p i + t o i m i v a m p i a + t o i m i v a m p i e n + t o i m i v a n + t o i m i v a n a + t o i m i v a n s a + t o i m i v a p a u d e n + t o i m i v a s s a + t o i m i v a s t a + t o i m i v a t + t o i m i v a t k i n + t o i m i v a t k o + t o i m i v i a + t o i m i v i e n + t o i m i v i i n + t o i m i v i k s i + t o i m i v i l l e + t o i m i v i m m a t + t o i m i v i n + t o i m i v i s s a + t o i m i v i s t a + t o i m i v u u d e l l e + t o i m i v u u d e n + t o i m i v u u d e s s a + t o i m i v u u d e s t a + t o i m i v u u s s y i s t ä + t o i m i v u u t e e n + t o i m i v u u t e n s a + t o i m i v u u t t a + t o i n e n k i n + t o i p i l a s a j a n + t o i p u a + t o i p u m a s s a + t o i p u m i s a i k a + t o i p u m i s a j a n + t o i p u m i s e e n + t o i p u m i s m a h d o l l i s u u d e t + t o i p u m i s o h j e l m i a + t o i p u m i s o h j e l m i i n + t o i p u m i s p r o s e s s i s s a + t o i s a a l t a h a n + t o i s a r v o i n e n + t o i s a r v o i s e e n + t o i s a r v o i s e k s i + t o i s a r v o i s e n a + t o i s a r v o i s e t + t o i s a r v o i s i a + t o i s a r v o i s i k s i + t o i s a r v o i s i n a + t o i s a r v o i s t a + t o i s e e n + t o i s e e n k i n + t o i s e k s i k i n + t o i s e l l a + t o i s e l l a k i n + t o i s e l l e + t o i s e l t a + t o i s e l t a k i n + t o i s e m m e + t o i s e n + t o i s e n a + t o i s e n k i n + t o i s e n l a i s e e n + t o i s e n l a i s e l l a + t o i s e n l a i s e l t a + t o i s e n l a i s e n + t o i s e n l a i s e s t a + t o i s e n l a i s e t + t o i s e n l a i s i a + t o i s e n l a i s i a k i n + t o i s e n l a i s i i n + t o i s e n l a i s i n + t o i s e n l a i s i s s a + t o i s e n l a i s t a + t o i s e n l u o n t e i s t a + t o i s e n m u o t o i s i i n + t o i s e n s a + t o i s e n s u u n t a i n e n + t o i s e n s u u n t a i s e t + t o i s e n t y y p p i s e e n + t o i s e n t y y p p i s e n + t o i s e n t y y p p i s e s t ä + t o i s e n t y y p p i s i l l e + t o i s e n t y y p p i s i ä + t o i s e n t y y p p i s t ä + t o i s e s s a + t o i s e s s a k i n + t o i s e s t a + t o i s e s t a k i n + t o i s e t + t o i s i a + t o i s i a a n + t o i s i a m m e + t o i s i i n + t o i s i i n s a + t o i s i l l a + t o i s i l l e + t o i s i l l e e n + t o i s i l l e m m e + t o i s i l l e n s a + t o i s i l t a + t o i s i l t a a n + t o i s i n a j a t t e l e v a a + t o i s i n a j a t t e l i j a k o l l e g o i d e n i + t o i s i n a j a t t e l i j o i d e n + t o i s i n a j a t t e l i j o i l l e + t o i s i n a j a t t e l i j o i s t a + t o i s i n a j a t t e l i j o i t a + t o i s i n n o t + t o i s i n t o j a + t o i s i n t o k u u m e + t o i s i o l ä h e t t i + t o i s i o s i v u s t o t + t o i s i o t u t k a + t o i s i s s a + t o i s i s t a + t o i s i s t a a n + t o i s i s t a m m e + t o i s i v a t + t o i s l u o k k a i s e n + t o i s l u o k k a i s t a + t o i s p u o l e i s i a + t o i s s a p ä i v ä i s e s s ä + t o i s s a p ä i v ä i s e s t ä + t o i s s a p ä i v ä i s e t + t o i s s a p ä i v ä i s i s t ä + t o i s s a p ä i v ä i s t ä + t o i s s i j a i n e n + t o i s s i j a i s e n + t o i s s i j a i s e n a + t o i s s i j a i s e s t i + t o i s s i j a i s i a + t o i s s i j a i s i i n + t o i s s i j a i s i k s i + t o i s s i j a i s i n a + t o i s s i j a i s t a + t o i s s i j a i s t e n + t o i s s i j a i s u u d e l l e + t o i s s i j a i s u u d e n + t o i s s i j a i s u u d e s t a + t o i s s i j a i s u u s + t o i s s i j a i s u u s a l a + t o i s s i j a i s u u s a s i a s s a + t o i s s i j a i s u u s j u l i s t u k s e t + t o i s s i j a i s u u s j ä r j e s t e l m ä ä n + t o i s s i j a i s u u s k e i t t o + t o i s s i j a i s u u s k e s k u s t e l u + t o i s s i j a i s u u s k e t j u n + t o i s s i j a i s u u s k o n f e r e n s s i + t o i s s i j a i s u u s k u l t t u u r i + t o i s s i j a i s u u s k u l t t u u r i a + t o i s s i j a i s u u s k y s y m y k s e e n + t o i s s i j a i s u u s k y s y m y k s e n + t o i s s i j a i s u u s k y s y m y k s i s s ä + t o i s s i j a i s u u s k y s y m y k s i ä + t o i s s i j a i s u u s k y s y m y s + t o i s s i j a i s u u s k y s y m y s t ä + t o i s s i j a i s u u s k ä s i t t e e n + t o i s s i j a i s u u s l a u s e k k e i d e n + t o i s s i j a i s u u s m e k a n i s m i n + t o i s s i j a i s u u s m e n e t e l m ä n + t o i s s i j a i s u u s p e r i a a t e + t o i s s i j a i s u u s p e r i a a t e s ä ä n t ö ä + t o i s s i j a i s u u s p e r i a a t e t t a + t o i s s i j a i s u u s p e r i a a t t e e k s i + t o i s s i j a i s u u s p e r i a a t t e e l l a + t o i s s i j a i s u u s p e r i a a t t e e l l e + t o i s s i j a i s u u s p e r i a a t t e e n + t o i s s i j a i s u u s p e r i a a t t e e s e e n + t o i s s i j a i s u u s p e r i a a t t e e s e e n h a n + t o i s s i j a i s u u s p e r i a a t t e e s s a + t o i s s i j a i s u u s p e r i a a t t e e s t a + t o i s s i j a i s u u s p e r i a a t t e e t + t o i s s i j a i s u u s p e r i a a t t e i t a + t o i s s i j a i s u u s p ä ä t ö s + t o i s s i j a i s u u s p ö y t ä k i r j a + t o i s s i j a i s u u s s y i s t ä + t o i s s i j a i s u u s s ä ä n n ö i l l e + t o i s s i j a i s u u s t e s t a u k s e n + t o i s s i j a i s u u s t e s t i + t o i s s i j a i s u u s t e s t i n + t o i s s i j a i s u u s t i e t o i s u u t t a + t o i s s i j a i s u u t e e n + t o i s s i j a i s u u t t a + t o i s s i l m ä i s i ä + t o i s t a a + t o i s t a a k s e e n + t o i s t a a k s e n i + t o i s t a a n + t o i s t a e s s a a n + t o i s t a i s i + t o i s t a i s i n + t o i s t a k a a + t o i s t a k a a m m e + t o i s t a k i n + t o i s t a m a a n + t o i s t a m a l l a + t o i s t a m a s t a + t o i s t a m a t t a + t o i s t a m i s t a + t o i s t a m m e + t o i s t a m m e k i n + t o i s t a n + t o i s t a n e e t + t o i s t a n k i n + t o i s t a n u t + t o i s t e k i n + t o i s t e l e m a s t a + t o i s t e l e m m e + t o i s t e l l a + t o i s t e m m e + t o i s t e n + t o i s t e n k i n + t o i s t e n s a + t o i s t e t a a n + t o i s t e t t a k o o n + t o i s t e t t i i n + t o i s t e t t u + t o i s t i + t o i s t i m m e + t o i s t i n a s e m a t + t o i s t o a + t o i s t o j a + t o i s t o r a k e n n e + t o i s t u a + t o i s t u i + t o i s t u i s i + t o i s t u m a a n + t o i s t u m a s t a + t o i s t u m i s e n + t o i s t u m i s e s t a + t o i s t u m i s t a + t o i s t u m i s t i h e y s + t o i s t u u + t o i s t u u k o + t o i s t u v a i s m u u t t o + t o i s t u v a i s m u u t t o a + t o i s t u v a i s v i i s u m e i s t a + t o i s t u v a i s v i i s u m e i t a + t o i s t u v a i s v i i s u m e j a + t o i s t u v a i s v i i s u m i + t o i s t u v a i s v i i s u m i e n + t o i s t u v a m p i a + t o i s t u v a n + t o i s t u v a s t a + t o i s t u v a s t i + t o i s t u v a t + t o i s t u v i a + t o i s t u v i e n + t o i s t u v i i n + t o i s t u v i n + t o i s t u v i s t a + t o i s u s k o i s i i n + t o i s u s k o i s i k s i + t o i t o t u s t a + t o i v e a j a t t e l u + t o i v e a j a t t e l u a + t o i v e a j a t t e l u k s i + t o i v e a j a t t e l u l l e + t o i v e a j a t t e l u l t a + t o i v e a j a t t e l u n + t o i v e a j a t t e l u n a + t o i v e a j a t t e l u s s a + t o i v e a j a t t e l u s t a + t o i v e a j a t t e l u u n + t o i v e e m m e + t o i v e e n + t o i v e e n i + t o i v e e n s a + t o i v e e s e e n + t o i v e e s t a + t o i v e e t + t o i v e i d e n + t o i v e i k k a a m m a l l e + t o i v e i k k a a m m i k s i + t o i v e i k k a a m m i n + t o i v e i k k a a m p i + t o i v e i k k a a m p i a + t o i v e i k k a a n a + t o i v e i k k a i n a + t o i v e i k k a i s i i n + t o i v e i k k a i t a + t o i v e i k k u u d e s t a + t o i v e i k k u u t e e n + t o i v e i k k u u t t a + t o i v e i k s i + t o i v e i l m a i s u + t o i v e i l m i ö n + t o i v e i n + t o i v e i s i i n + t o i v e i s s a m m e + t o i v e i s t a + t o i v e i s t a m m e + t o i v e i t a + t o i v e i t a m m e + t o i v e k o n s e r t i l l e + t o i v e l i s t a + t o i v e l i s t a a + t o i v e l i s t a k s i + t o i v e l i s t a l l a + t o i v e l i s t a l l a a n + t o i v e l i s t a l t a + t o i v e l i s t a n + t o i v e l i s t a s t a a n + t o i v e l i s t o i s t a + t o i v e l i s t o j a + t o i v e l u e t t e l o + t o i v e l u e t t e l o a + t o i v e l u e t t e l o n + t o i v e l u e t t e l o s s a + t o i v e l u e t t e l o t + t o i v e t t a + t o i v e t t a m m e + t o i v e t t a n i + t o i v e u n e k s i + t o i v e u n e s t a + t o i v e u n i + t o i v e u n i a + t o i v e u n i i n + t o i v e u n i l l a + t o i v e u n i l l e e n + t o i v e u n t a + t o i v o a + t o i v o a a n + t o i v o a k a a n + t o i v o a k s e m m e + t o i v o a k s e n i + t o i v o a n i + t o i v o a n n e + t o i v o e n + t o i v o e s s a + t o i v o i + t o i v o i m m e + t o i v o i n + t o i v o i s i + t o i v o i s i m m e + t o i v o i s i n + t o i v o i s i n k i n + t o i v o i s i v a t + t o i v o i v a t + t o i v o k a a m m e + t o i v o m a + t o i v o m a a m m e + t o i v o m a a n + t o i v o m a l l a + t o i v o m a l l a m m e + t o i v o m a l l a n i + t o i v o m a m m e + t o i v o m a n + t o i v o m a s s a n i + t o i v o m a s t a m m e + t o i v o m i a a n + t o i v o m i a m m e + t o i v o m i n e n k a a n + t o i v o m i s e n + t o i v o m m e + t o i v o m m e k i n + t o i v o m m e k o + t o i v o m u k s e e n + t o i v o m u k s e e n n e + t o i v o m u k s e n + t o i v o m u k s e n i + t o i v o m u k s e n s a + t o i v o m u k s e s t a + t o i v o m u k s i a + t o i v o m u k s i k s i + t o i v o m u k s i s t a m m e + t o i v o m u s k i r j e + t o i v o m u s l i s t a + t o i v o m u s l i s t a a + t o i v o m u s l i s t a k s i + t o i v o m u s l i s t a l l a + t o i v o m u s l i s t a l t a + t o i v o m u s l i s t a n + t o i v o m u s l i s t a n s a + t o i v o m u s l i s t a s t a + t o i v o m u s l i s t o i k s i + t o i v o m u s l i s t o i l l a + t o i v o m u s l i s t o i s t a + t o i v o m u s l i s t o j a + t o i v o m u s l u e t t e l o + t o i v o m u s l u e t t e l o i d e n + t o i v o m u s l u e t t e l o i h i n + t o i v o m u s l u e t t e l o j a + t o i v o m u s p u u + t o i v o m u s t a + t o i v o m u s t a n i + t o i v o m u s t e k s t e i k s i + t o i v o m u s t e n + t o i v o n + t o i v o n a + t o i v o n e e t + t o i v o n h i v e n + t o i v o n i + t o i v o n k i n + t o i v o n k i p i n ä + t o i v o n k i p i n ä ä + t o i v o n k i p i n ö i t ä + t o i v o n l ä h d e + t o i v o n p a + t o i v o n p i l k a h d u k s i a + t o i v o n p i l k a h d u s + t o i v o n s a + t o i v o n s ä t e e n + t o i v o n u t + t o i v o o + t o i v o o k i n + t o i v o s t a + t o i v o s t a h a n + t o i v o t a a n + t o i v o t a m m e + t o i v o t a m m e k i n + t o i v o t a n + t o i v o t i m m e + t o i v o t t a a + t o i v o t t a a k i n + t o i v o t t a e s s a n i + t o i v o t t a m a l l a + t o i v o t t a m a n + t o i v o t t a m a t t a + t o i v o t t a m i n e n + t o i v o t t a v a a + t o i v o t t a v a a k a a n + t o i v o t t a v a m p a a + t o i v o t t a v a m p i + t o i v o t t a v a n + t o i v o t t a v a n a + t o i v o t t a v i a + t o i v o t t a v i n + t o i v o t t a v i n a + t o i v o t t a v i n t a + t o i v o t t e + t o i v o t t o m a m p i + t o i v o t t o m a s s a + t o i v o t t o m i n + t o i v o t t u a + t o i v o t t u i h i n + t o i v o t t u j a + t o i v o t t u u n + t o i v o t u i k s i + t o i v o t u i m m a k s i + t o i v o t u i s t a + t o i v o t u k s e t + t o i v o t u k s i a + t o i v o t u k s i s t a + t o i v o t u k s i s t a n n e + t o i v o t u l l a + t o i v o t u m p i + t o i v o t u n + t o i v o t u s s a + t o i v o t u t + t o i v o v a m m e + t o i v o v a n + t o i v o v a n i + t o i v o v a n s a + t o i v o v a t + t o i v o v a t k i n + t o i v o v i e n + t o k a j i n v i i n i e n + t o k s i i n i a s e e t + t o k s i i n i a s e i d e n + t o k s i i n i a s e i t a + t o k s i i n i t a s o i s t a + t o k s i k o l o g i s e s t i + t o k s i k o l o g i s e t + t o k s i s u u s e k v i v a l e n t t i k e r r o i n + t o l e r a n s s i a r v o s t a + t o l e r a n s s i r a j a + t o l e r a n s s i r a j a n + t o l e r a n s s i r a j o j e n + t o l e r a n s s i t a s o + t o l e r a n s s i t a s o n + t o l u e e n i s u l f o n i h a p p o + t o m a a t e i s t a + t o m a a t i n t u o t a n t o + t o m a a t i n t u o t a n t o a + t o m a a t i n t u o t t a j i l l e + t o m a a t i n v i l j e l i j ä t + t o m a a t i n v i l j e l y n + t o m a a t t i a l a l l a + t o m a a t t i e n + t o m a a t t i j a l o s t e i d e n + t o m a a t t i k i i n t i ö + t o m a a t t i k i i n t i ö i t ä + t o m a a t t i k i i n t i ö n + t o m a a t t i k o r i e n + t o m a a t t i l a a t i k o i d e n + t o m a a t t i l a a t i k o i h i n + t o m a a t t i m e h u n + t o m a a t t i p y r e e + t o m a a t t i s a m m a k k o + t o m a a t t i s a m m a k o t + t o m a a t t i t a h n a a + t o m a a t t i t i i v i s t e + t o m a a t t i t i i v i s t e i l l e + t o m a a t t i t i i v i s t e k i i n t i ö t ä + t o m a a t t i t i i v i s t e t t ä + t o m a a t t i t o n n i + t o m a a t t i t u o t a n n o n + t o m a a t t i t u o t t e i t a + t o m u s o k e r i + t o n k i n e e s i + t o n n e j a + t o n n i a + t o n n i h i n n a n + t o n n i i n + t o n n i k a l a + t o n n i k a l a a + t o n n i k a l a a n + t o n n i k a l a f i l e i d e n + t o n n i k a l a f i l e i t ä + t o n n i k a l a j a l o s t u s t e o l l i s u u t t a + t o n n i k a l a j ä r j e s t ö i s s ä + t o n n i k a l a k a l a s t u k s e e n + t o n n i k a l a k a l a s t u s + t o n n i k a l a k a l a s t u s t a + t o n n i k a l a k a n n a n + t o n n i k a l a k a n n a s t a + t o n n i k a l a k a n n a t + t o n n i k a l a k a n n o i s t a + t o n n i k a l a k a n t a + t o n n i k a l a k a n t a a + t o n n i k a l a k a n t o i h i n + t o n n i k a l a k a n t o j a + t o n n i k a l a k a n t o j a m m e + t o n n i k a l a k a n t o j e n + t o n n i k a l a k o m i s s i o o n + t o n n i k a l a k o m i s s i o s s a + t o n n i k a l a k y s y m y s t ä + t o n n i k a l a l a i v a s t o + t o n n i k a l a l a i v a s t o a a n + t o n n i k a l a l a i v a s t o j e n + t o n n i k a l a l a i v a s t o l l e + t o n n i k a l a l a i v a s t o n + t o n n i k a l a l a i v a s t o t + t o n n i k a l a l a j i e n + t o n n i k a l a l l a + t o n n i k a l a l l e + t o n n i k a l a m a k s u i s t a + t o n n i k a l a m a r k k i n o i s t a + t o n n i k a l a n + t o n n i k a l a n j a l o s t u s l a i t o s t a + t o n n i k a l a n j a l o s t u s t u o t a n n o n + t o n n i k a l a n k a l a s t u k s e n + t o n n i k a l a n p o i k a s e t + t o n n i k a l a n p y y n n i n + t o n n i k a l a n p y y n t i + t o n n i k a l a n p y y n t i a l u k s i l l e + t o n n i k a l a n p y y n t i a l u k s i s t a + t o n n i k a l a n p y y t ä j ä t + t o n n i k a l a p a l a t + t o n n i k a l a p a l o j e n + t o n n i k a l a p a r v i a + t o n n i k a l a s a a l i i d e n + t o n n i k a l a s a a l i i s t a + t o n n i k a l a s a a l i s + t o n n i k a l a s e k t o r i n + t o n n i k a l a s o p i m u k s i a + t o n n i k a l a s o p i m u k s i i n + t o n n i k a l a s o p i m u k s i s s a + t o n n i k a l a s o p i m u s + t o n n i k a l a s o p i m u s t e n + t o n n i k a l a s o t a + t o n n i k a l a s p a g e t t i a + t o n n i k a l a s t a + t o n n i k a l a s ä i l y k e a l a a + t o n n i k a l a s ä i l y k e a l a l l a + t o n n i k a l a s ä i l y k e m a r k k i n o i d e n + t o n n i k a l a s ä i l y k e m a r k k i n o i h i n + t o n n i k a l a s ä i l y k e m a r k k i n o i t a + t o n n i k a l a s ä i l y k e t e h t a i d e n + t o n n i k a l a s ä i l y k e t e h t a i s t a + t o n n i k a l a s ä i l y k e t e o l l i s u u d e n + t o n n i k a l a s ä i l y k e t u o t a n n o s t a + t o n n i k a l a s ä i l y k k e i d e n + t o n n i k a l a s ä i l y k k e i l l e + t o n n i k a l a s ä i l y k k e i s i i n + t o n n i k a l a s ä i l y k k e i t ä + t o n n i k a l a t e o l l i s u u d e n + t o n n i k a l a t e o l l i s u u d e s s a + t o n n i k a l a t e o l l i s u u s a l o j e n + t o n n i k a l a t e o l l i s u u t e e n + t o n n i k a l a t e o l l i s u u t t a + t o n n i k a l a t e o l l i s u u t t a a n + t o n n i k a l a t o n n i a + t o n n i k a l a t o n n i n + t o n n i k a l a t u o n n i n + t o n n i k a l a t u o t a n n o n + t o n n i k a l a v a r a t + t o n n i k a l a v a r o i s t a + t o n n i k a l a v a r o j e n + t o n n i k a l a v e r k k o i h i n + t o n n i k a l a v e r k o s t a + t o n n i k a l a v i e n t i + t o n n i k a l o i l l a + t o n n i k a l o i s t a + t o n n i k a l o j a + t o n n i k a l o j e n + t o n n i k i i n t i ö i t ä + t o n n i k i l o m e t r e i n ä + t o n n i k i l o m e t r e i s t ä + t o n n i k i l o m e t r i i n + t o n n i k i l o m e t r i m ä ä r ä + t o n n i k i l o m e t r i s t ä + t o n n i k i l o m e t r i ä + t o n n i l l a + t o n n i l l e + t o n n i l t a + t o n n i m ä ä r i e n + t o n n i m ä ä r i s t ä + t o n n i n + t o n n i s t o v e r o t u s + t o n t t e j a + t o n t t u k i r j a + t o r a j y v ä + t o r e i l l a + t o r e i l t a + t o r i k a u p p i a i d e n + t o r i k o j u i h i n + t o r i l l a + t o r i l t a + t o r i m y y n t i k o j u i h i n + t o r i n h e v o n e n + t o r i p ä i v ä + t o r i u m d i o k s i d i + t o r i u m r e a k t o r e i s t a + t o r j u a + t o r j u a k s e e n + t o r j u a k s e m m e + t o r j u a k s e n i + t o r j u e s s a + t o r j u e s s a a n + t o r j u e s s a m m e + t o r j u i + t o r j u i v a t + t o r j u k a a m m e + t o r j u m a a n + t o r j u m a l l a + t o r j u m a t t a + t o r j u m i s e e n + t o r j u m i s e k s i + t o r j u m i s e l l e + t o r j u m i s e n + t o r j u m i s e s s a + t o r j u m i s e s s a k i n + t o r j u m i s e s t a + t o r j u m i s h a n k k e e n + t o r j u m i s i l m i ö s t ä + t o r j u m i s k e i n o j e n + t o r j u m i s k e i n o n a + t o r j u m i s p o n n i s t u k s i s s a + t o r j u m i s p r o s e s s i a + t o r j u m i s p y r k i m y k s e t + t o r j u m i s t a + t o r j u m i s t a k t i i k k a a + t o r j u m i s t o i m e t + t o r j u m i s t o i m i e n + t o r j u m i s t y ö s t ä + t o r j u m m e + t o r j u n + t o r j u n e e t + t o r j u n n a n + t o r j u n n a s s a + t o r j u n n a s t a + t o r j u n t a a + t o r j u n t a a n + t o r j u n t a h ä v i t t ä j ä + t o r j u n t a j ä r j e s t e l m ä + t o r j u n t a j ä r j e s t e l m ä s s ä m m e + t o r j u n t a j ä r j e s t e l m ä ä + t o r j u n t a k a m p a n j a a n + t o r j u n t a k a m p a n j a t + t o r j u n t a k e i n o a + t o r j u n t a k e i n o i s t a + t o r j u n t a k e i n o j a + t o r j u n t a k e i n o j e n + t o r j u n t a k e i n o t + t o r j u n t a k e s k u k s e k s i + t o r j u n t a k e s k u k s e n + t o r j u n t a k y s y m y s + t o r j u n t a m a h d o l l i s u u k s i a + t o r j u n t a m e k a n i s m e j a + t o r j u n t a m e k a n i s m i e n + t o r j u n t a m e k a n i s m i l l a + t o r j u n t a m e n e t e l m i s t ä + t o r j u n t a m u o t o j e n + t o r j u n t a o h j e l m a + t o r j u n t a o h j e l m a n + t o r j u n t a o h j e l m a t + t o r j u n t a o h j e l m i a + t o r j u n t a o h j e l m i e n + t o r j u n t a o h j u k s e t + t o r j u n t a o h j u s h a n k e + t o r j u n t a o h j u s p u o l u s t u s j ä r j e s t e l m ä ä + t o r j u n t a o h j u s t e n + t o r j u n t a p a k e t t i i n + t o r j u n t a p o l i t i i k a s t a + t o r j u n t a p o l i t i i k k a + t o r j u n t a p o l i t i i k k a a + t o r j u n t a p o n n i s t u k s i a + t o r j u n t a p y r k i m y k s i i n + t o r j u n t a p y r k i m y k s i s s ä ä n + t o r j u n t a p y r k i m y s t e n + t o r j u n t a s t r a t e g i a + t o r j u n t a s t r a t e g i a a + t o r j u n t a s t r a t e g i a a n + t o r j u n t a s t r a t e g i a n + t o r j u n t a s t r a t e g i a s t a + t o r j u n t a s t r a t e g i o i d e n + t o r j u n t a s t r a t e g i o i s s a + t o r j u n t a s t r a t e g i o i t a + t o r j u n t a s u u n n i t e l m a a + t o r j u n t a t a p o i h i n + t o r j u n t a t a r k o i t u k s i i n + t o r j u n t a t a v o i t t e i d e n + t o r j u n t a t o i m e n a + t o r j u n t a t o i m e n p i d e + t o r j u n t a t o i m e n p i t e e t + t o r j u n t a t o i m e n p i t e i d e n + t o r j u n t a t o i m e n p i t e i n + t o r j u n t a t o i m e n p i t e i t ä + t o r j u n t a t o i m e t + t o r j u n t a t o i m i a + t o r j u n t a t o i m i a a n + t o r j u n t a t o i m i a m m e + t o r j u n t a t o i m i e n + t o r j u n t a t o i m i e n s a + t o r j u n t a t o i m i i n + t o r j u n t a t o i m i k s i + t o r j u n t a t o i m i l l e + t o r j u n t a t o i m i l t a + t o r j u n t a t o i m i s s a + t o r j u n t a t o i m i s t a + t o r j u n t a v a l m i u k s i a m m e + t o r j u n t a v a l m i u k s i e n + t o r j u n t a v i r a s t o + t o r j u n t a v ä l i n e + t o r j u n t a v ä l i n e i d e n + t o r j u n t a v ä l i n e i t ä + t o r j u n u t + t o r j u t a + t o r j u t a a n + t o r j u t t a e s s a + t o r j u t t a i s i + t o r j u t t a i s i i n + t o r j u t t a v a + t o r j u t t a v a t + t o r j u t t a v i s s a + t o r j u t t i i n + t o r j u u + t o r j u v a m m e + t o r j u v i l l a + t o r j u v i s s a + t o r k k u p e i t t o + t o r n e i h i n + t o r n i p u o l u s t u s + t o r n i p ö l l ö + t o r n i p ö l l ö t + t o r n i r a k e n n u k s e n + t o r n i t + t o r n i t a l o + t o r n i t a l o a s u n t o a + t o r n i t a l o i s s a + t o r p e d o i m a a n + t o r p e d o p u t k i + t o r p e d o v e n e + t o r s i o r y h m ä + t o r s o m u r h a a j a + t o r s t a i a a m u i s i n + t o r s t a i a a m u n + t o r s t a i a a m u n a + t o r s t a i a a m u p ä i v ä + t o r s t a i a a m u u n + t o r s t a i k s i + t o r s t a i n + t o r s t a i n a + t o r s t a i n u m e r o s s a + t o r s t a i s e n + t o r s t a i s e s t a + t o r s t a i s t a + t o r s t a i y ö l t ä + t o r t i l l a c h i p s i t + t o r v i k a i u t i n + t o r v i k u k k a + t o r v i s o i t t o k u n n a n + t o r v i s o i t t o k u n t a + t o s i a a n k a a n + t o s i a a n k i n + t o s i a i k a i n e n + t o s i a i k a i s e n + t o s i a i k a i s e s t i + t o s i a i k a i s e t + t o s i a i k a i s i l l e + t o s i a i k a i s i s t a + t o s i a j a s s a + t o s i a s i a + t o s i a s i a a + t o s i a s i a a n + t o s i a s i a l l a + t o s i a s i a l l i n e n + t o s i a s i a l l i s e e n + t o s i a s i a l l i s e k s i + t o s i a s i a l l i s e l l a + t o s i a s i a l l i s e l l e + t o s i a s i a l l i s e n + t o s i a s i a l l i s e n a + t o s i a s i a l l i s e s t a + t o s i a s i a l l i s e s t i + t o s i a s i a l l i s e s t i k i n + t o s i a s i a l l i s e t + t o s i a s i a l l i s i a + t o s i a s i a l l i s i i n + t o s i a s i a l l i s i k s i + t o s i a s i a l l i s i s t a + t o s i a s i a l l i s t a + t o s i a s i a l l i s t e n + t o s i a s i a l t a + t o s i a s i a n + t o s i a s i a n a + t o s i a s i a s s a + t o s i a s i a s t a + t o s i a s i a t + t o s i a s i o i d e n + t o s i a s i o i h i n + t o s i a s i o i l l a + t o s i a s i o i l t a + t o s i a s i o i n a + t o s i a s i o i s s a + t o s i a s i o i s t a + t o s i a s i o i t a + t o s i e l ä m ä + t o s i e l ä m ä l l e + t o s i e l ä m ä n + t o s i e l ä m ä s s ä + t o s i e l ä m ä s t ä + t o s i e l ä m ä ä + t o s i e l ä m ä ä n + t o s i m a a i l m a + t o s i m a a i l m a s t a + t o s i m i e h i ä + t o s i m i e s + t o s i n a + t o s i n i m i + t o s i s e i k a n + t o s i s e i k a t + t o s i s e i k k a + t o s i s e i k k a a + t o s i s e i k k a a n + t o s i s e i k k o i h i n + t o s i s e i k k o j a + t o s i s e i k k o j e n + t o s i s e i k o i s t a + t o s i s s a a n + t o s i s s a m m e + t o s i s s a n i + t o s i t a p a h t u m i i n + t o s i t a p a u k s e n + t o s i t a r i n a + t o s i t e l e v i s i o + t o s i t e l e v i s i o s t a + t o s i t i l a n n e t t a + t o s i t i l a n t e e s e e n + t o s i t i l a n t e e s t a + t o s i t i l a n t e i s s a + t o s i t i l a n t e i s t a + t o s i t o i m e t + t o s i t o i m i a + t o s i t o i m i i n + t o s i t o i m i n + t o s i t t e e t + t o s i t t e i t a + t o s i y s t ä v ä + t o t a a l i k i e l l o n + t o t a a l i k i e l t o + t o t a a l i k i e l t o a + t o t a a l i t a p p i o o n + t o t a l i t a a r i s e e n + t o t a l i t a a r i s e l l a + t o t a l i t a a r i s e l l e + t o t a l i t a a r i s e n + t o t a l i t a a r i s e s s a + t o t a l i t a a r i s e s t a + t o t a l i t a a r i s e t + t o t a l i t a a r i s i a + t o t a l i t a a r i s i i n + t o t a l i t a a r i s i l l a + t o t a l i t a a r i s i l l e + t o t a l i t a a r i s i s s a + t o t a l i t a a r i s i s t a + t o t a l i t a a r i s t a + t o t a l i t a a r i s t e n + t o t a l i t a r i s m i a + t o t a l i t a r i s m i n + t o t a l i t a r i s m i s t a + t o t a l i t a r i s t i s e n + t o t a l i t a r i s t i s i a + t o t a l i t a r i s t i s i l l e + t o t a l i t a r i s t i s t a + t o t a l i t a r i s t i s t e n + t o t e a a + t o t e a i s i n + t o t e a i s i n k i n + t o t e a m a a n + t o t e a m a l l a + t o t e a m a t t a + t o t e a m i s a j a n k o h d a s t a + t o t e a m i s e k s i + t o t e a m i s t a + t o t e a m m e + t o t e a m m e k a a n + t o t e a m u k s e e n + t o t e a m u k s e l l a + t o t e a m u k s e m m e + t o t e a m u k s e n + t o t e a m u k s e n i + t o t e a m u k s e n n e + t o t e a m u k s e s t a + t o t e a m u k s e t + t o t e a m u k s i a + t o t e a m u k s i i n + t o t e a n + t o t e a n k i n + t o t e a t t e + t o t e a v a n + t o t e a v a t + t o t e e m i p a a l u + t o t e e m i p a a l u s s a + t o t e s i + t o t e s i k i n + t o t e s i m m e + t o t e s i n + t o t e s i n k i n + t o t e s i t t e + t o t e s i v a t + t o t e s i v a t k i n + t o t e u d u t t a v a + t o t e u d u t t u a + t o t e u d u t t u a a n + t o t e u t a m m e + t o t e u t a m m e k o + t o t e u t a n + t o t e u t e t a + t o t e u t e t a a n + t o t e u t e t a a n k o + t o t e u t e t t a e s s a + t o t e u t e t t a i s i i n + t o t e u t e t t a v a + t o t e u t e t t a v a a + t o t e u t e t t a v a a n + t o t e u t e t t a v a n + t o t e u t e t t a v a s s a + t o t e u t e t t a v a t + t o t e u t e t t a v i a + t o t e u t e t t a v i e n + t o t e u t e t t a v i i n + t o t e u t e t t a v i k s i + t o t e u t e t t a v i l l a + t o t e u t e t t a v i s s a + t o t e u t e t t a v i s t a + t o t e u t e t t a v u u s a r v i o i n t i + t o t e u t e t t a v u u s k e r t o m u k s e s s a + t o t e u t e t t a v u u s p e r u s t e e n + t o t e u t e t t a v u u s s e l v i t y k s e s s ä + t o t e u t e t t a v u u s s e l v i t y s t ä + t o t e u t e t t a v u u s t u t k i m u k s e n + t o t e u t e t t a v u u s t u t k i m u k s e s s a + t o t e u t e t t a v u u s t u t k i m u k s e s s a a n + t o t e u t e t t a v u u s t u t k i m u k s e s t a + t o t e u t e t t a v u u s t u t k i m u k s e t + t o t e u t e t t a v u u s t u t k i m u k s i a + t o t e u t e t t a v u u s t u t k i m u k s i i n + t o t e u t e t t a v u u s t u t k i m u s + t o t e u t e t t a v u u s t u t k i m u s t a + t o t e u t e t t a v u u s t u t k i m u s t e n + t o t e u t e t t i i n + t o t e u t e t t u a + t o t e u t e t t u i h i n + t o t e u t e t t u i n a + t o t e u t e t t u j a + t o t e u t e t t u j e n + t o t e u t e t t u n a + t o t e u t e t u i s t a + t o t e u t e t u n + t o t e u t e t u s t a + t o t e u t i m m e + t o t e u t t a a + t o t e u t t a a k o + t o t e u t t a a k s e e n + t o t e u t t a e s s a + t o t e u t t a e s s a a n + t o t e u t t a e s s a m m e + t o t e u t t a i s i + t o t e u t t a j a t + t o t e u t t a j i a + t o t e u t t a k a a + t o t e u t t a k a a m m e + t o t e u t t a m a a n + t o t e u t t a m a i s i l l a m m e + t o t e u t t a m a l l a + t o t e u t t a m a n + t o t e u t t a m a s s a + t o t e u t t a m a s s a m m e + t o t e u t t a m a s t a + t o t e u t t a m a t + t o t e u t t a m a t t a + t o t e u t t a m i a + t o t e u t t a m i s a i k a t a u l u + t o t e u t t a m i s a i k a t a u l u a + t o t e u t t a m i s a i k a t a u l u i s t a + t o t e u t t a m i s a i k a t a u l u n + t o t e u t t a m i s a i k a t a u l u u n + t o t e u t t a m i s a s t e + t o t e u t t a m i s a s t e e n + t o t e u t t a m i s a s t e i d e n + t o t e u t t a m i s a s t e t t a + t o t e u t t a m i s e d e l l y t y k s e t + t o t e u t t a m i s e d e l l y t y k s i i n + t o t e u t t a m i s e e n + t o t e u t t a m i s e h d o t + t o t e u t t a m i s e h d o t u s + t o t e u t t a m i s e k s i + t o t e u t t a m i s e l l e + t o t e u t t a m i s e n + t o t e u t t a m i s e s s a + t o t e u t t a m i s e s t a + t o t e u t t a m i s j ä r j e s t y k s e s t ä + t o t e u t t a m i s k e i n o i n a + t o t e u t t a m i s k e l p o i n e n + t o t e u t t a m i s k e l p o i s e e n + t o t e u t t a m i s k e l p o i s e m m a k s i + t o t e u t t a m i s k e l p o i s e m m a n + t o t e u t t a m i s k e l p o i s e m p i + t o t e u t t a m i s k e l p o i s e m p i a + t o t e u t t a m i s k e l p o i s e n + t o t e u t t a m i s k e l p o i s e n a + t o t e u t t a m i s k e l p o i s i a + t o t e u t t a m i s k e l p o i s i m m a t + t o t e u t t a m i s k e l p o i s i n + t o t e u t t a m i s k e l p o i s t a + t o t e u t t a m i s k e l p o i s t e n + t o t e u t t a m i s k e l p o i s u u d e n + t o t e u t t a m i s k e l p o i s u u d e s t a + t o t e u t t a m i s k e l p o i s u u s t u t k i m u k s e t + t o t e u t t a m i s k e l v o t t o m a a n + t o t e u t t a m i s k e l v o t t o m a k s i + t o t e u t t a m i s k u s t a n n u s t e n + t o t e u t t a m i s k y k y + t o t e u t t a m i s l u p a + t o t e u t t a m i s l u v a n + t o t e u t t a m i s l u v a s t a + t o t e u t t a m i s m a h d o l l i s u u d e t + t o t e u t t a m i s m a h d o l l i s u u k s i e n + t o t e u t t a m i s m e k a n i s m e i s t a + t o t e u t t a m i s m e k a n i s m i + t o t e u t t a m i s m e k a n i s m i t + t o t e u t t a m i s m e n e t e l m i e n + t o t e u t t a m i s m e n e t t e l y t + t o t e u t t a m i s m ä ä r ä y s t e n + t o t e u t t a m i s o n g e l m a + t o t e u t t a m i s o n g e l m i a + t o t e u t t a m i s p r o s e s s i i n + t o t e u t t a m i s p ä ä t ö k s i s t ä + t o t e u t t a m i s s t r a t e g i a a + t o t e u t t a m i s s u u n n i t e l m a + t o t e u t t a m i s s u u n n i t e l m a a n + t o t e u t t a m i s s u u n n i t e l m a n + t o t e u t t a m i s s u u n n i t e l m i i n + t o t e u t t a m i s s ä ä n n ö i s t ä + t o t e u t t a m i s t a + t o t e u t t a m i s t a a n + t o t e u t t a m i s t a p a + t o t e u t t a m i s t a p a a n + t o t e u t t a m i s t a p o j a + t o t e u t t a m i s t a p o j e n + t o t e u t t a m i s t a v a n + t o t e u t t a m i s t a v a s t a + t o t e u t t a m i s t o i m i a + t o t e u t t a m i s t o i m i i n + t o t e u t t a m i s v a i h e + t o t e u t t a m i s v a i h e e s s a + t o t e u t t a m i s v a i h e t t a + t o t e u t t a m i s v a i k e u d e t + t o t e u t t a m i s v a l l a n + t o t e u t t a m i s v a l m i u k s i e n + t o t e u t t a m i s v a u h t i + t o t e u t t a m i s v ä l i n e i n ä + t o t e u t t a n e e t + t o t e u t t a n u t + t o t e u t t a v a + t o t e u t t a v a a + t o t e u t t a v a n + t o t e u t t a v a t + t o t e u t t i + t o t e u t u a + t o t e u t u a k s e e n + t o t e u t u e s s a + t o t e u t u e s s a a n + t o t e u t u i + t o t e u t u i s i + t o t e u t u i s i v a t + t o t e u t u k o o n + t o t e u t u k s e e n + t o t e u t u k s e n + t o t e u t u k s e s t a + t o t e u t u k s i n e e n + t o t e u t u m a a n + t o t e u t u m a s s a + t o t e u t u m a s t a + t o t e u t u m a t t a + t o t e u t u m i s a j a n k o h d a k s i + t o t e u t u m i s a s t e + t o t e u t u m i s a s t e e n + t o t e u t u m i s a s t e e s e e n + t o t e u t u m i s a s t e e t + t o t e u t u m i s a s t e i s t a + t o t e u t u m i s e k s i + t o t e u t u m i s e n + t o t e u t u m i s e s t a + t o t e u t u m i s t a + t o t e u t u m i s t a s o a + t o t e u t u m i s t a v o i t t e e t + t o t e u t u m i s v a u h t i + t o t e u t u n e e n + t o t e u t u n e e t + t o t e u t u n e i s t a + t o t e u t u n u t + t o t e u t u s a i k a t a u l u + t o t e u t u s a i k a t a u l u a + t o t e u t u s a i k a t a u l u i s t a + t o t e u t u s a i k a t a u l u u n + t o t e u t u s a j a l l a + t o t e u t u s a s t e + t o t e u t u s a s t e e l l a + t o t e u t u s a s t e e n + t o t e u t u s a s t e e t + t o t e u t u s j ä r j e s t e l m i i n + t o t e u t u s j ä r j e s t e l m ä + t o t e u t u s k a p a s i t e e t t i + t o t e u t u s k e l p o i s i a + t o t e u t u s k e l p o i s u u d e s t a + t o t e u t u s k i e l l o n + t o t e u t u s k y k y + t o t e u t u s m a h d o l l i s u u d e t + t o t e u t u s m a h d o l l i s u u k s i a + t o t e u t u s m a h d o l l i s u u k s i e n + t o t e u t u s m e k a n i s m i + t o t e u t u s m e k a n i s m i a + t o t e u t u s m e k a n i s m i n + t o t e u t u s m e n e t e l m i ä + t o t e u t u s m u o t o j a + t o t e u t u s o h j e l m a n + t o t e u t u s o h j e l m i a + t o t e u t u s o n g e l m i e n + t o t e u t u s p r o s e s s i n + t o t e u t u s s u u n n i t e l m a + t o t e u t u s s u u n n i t e l m a a + t o t e u t u s s u u n n i t e l m a l l a + t o t e u t u s s u u n n i t e l m i e n + t o t e u t u s s u u n n i t e l m i i n + t o t e u t u s t a + t o t e u t u s t a p o j e n + t o t e u t u s t a r p e e n + t o t e u t u s t a v a s t a + t o t e u t u s t a v o i s t a + t o t e u t u s t y ö n + t o t e u t u s v a i h e + t o t e u t u s v a i h e e s e e n + t o t e u t u s v a i h e e s s a + t o t e u t u s v a i h e t t a + t o t e u t u u + t o t e u t u u k i n + t o t e u t u u k o + t o t e u t u v a a n + t o t e u t u v a n + t o t e u t u v a t + t o t t e l e m a t t o m u u d e n + t o t t e l e m a t t o m u u t e e n + t o t t e l e v a i s e k s i + t o t t u a + t o t t u i + t o t t u i s i + t o t t u k a a + t o t t u m i s i l m i ö + t o t t u m u k s e m m e + t o t t u m u k s i s t a + t o t t u n e e m p i a + t o t t u n e e n + t o t t u n e e t + t o t t u n e i d e n + t o t t u n e i t a + t o t t u v a n + t o t t u v a t + t o t u i m m e + t o t u i n + t o t u n n a i s t a + t o t u t e l k a a + t o t u t t a u t u a + t o t u t t a u t u m a a n + t o t u t t a v a + t o t u t t u u n + t o t u t u l l a + t o t u u d e n + t o t u u d e n e t s i n n ä n + t o t u u d e n h e t k i + t o t u u d e n k a n t a j a + t o t u u d e n m u k a i n e n + t o t u u d e n m u k a i s e m m i n + t o t u u d e n m u k a i s e m p i + t o t u u d e n m u k a i s e n + t o t u u d e n m u k a i s e n a + t o t u u d e n m u k a i s e s t i + t o t u u d e n m u k a i s i a + t o t u u d e n m u k a i s i n + t o t u u d e n v a s t a i n e n + t o t u u d e n v a s t a i s t a + t o t u u k s i a + t o t u u s a r v o + t o t u u s e h t o + t o t u u s f u n k t i o + t o t u u s k o m i s s i o + t o t u u s k o m i s s i o n + t o t u u s m i n i s t e r i ö n + t o t u u s p e r i a a t t e e s e e n + t o t u u s p r o s e s s i + t o t u u s p r o s e s s i a + t o t u u s s e e r u m i + t o t u u s t a u l u + t o t u u s t e o r i a + t o t u u s t e s t i + t o t u u t t a + t o u h u k o t i l o + t o u h u n u o l i a i n e n + t o u k i l l e + t o u k k a t e r a p i a + t o u k o h ä r ä t + t o u k o k u u + t o u k o k u u h u n + t o u k o k u u n + t o u k o k u u s s a + t o u k o k u u s t a + t o u k o k u u t a + t o u k o k ä m m e k k ä + t o u k o n i r k k o + t o v e r e i d e n + t o v e r e i l l e m m e + t o v e r i e n i + t o v e r i m m e + t o v e r i n i + t r a a g i s e e n + t r a a g i s e k s i + t r a a g i s e m m a n + t r a a g i s e m p i + t r a a g i s e m p i a + t r a a g i s e n a + t r a a g i s e s t a + t r a a g i s e t + t r a a g i s i a + t r a a g i s i i n + t r a a g i s i m p i a + t r a a g i s i n t a + t r a a g i s i s t a + t r a a g i s t a + t r a a g i s t e n + t r a a g i s u u t t a + t r a g e d i a a + t r a g e d i a k s i + t r a g e d i a n + t r a g e d i a s t a + t r a g e d i a t + t r a g e d i o i d e n + t r a g e d i o i s t a + t r a k t o r e i h i n + t r a k t o r e i t a + t r a k t o r i a l a a n + t r a k t o r i a s i a s s a + t r a k t o r i d i r e k t i i v e i s s ä + t r a k t o r i d i r e k t i i v i + t r a k t o r i d i r e k t i i v i ä + t r a k t o r i n k u l j e t t a j a n + t r a k t o r i n k u l j e t t a j a t + t r a k t o r i n t u o t a n n o n + t r a k t o r i n v a l m i s t a j a t + t r a k t o r i t e h d a s + t r a k t o r i t y y p i l l e + t r a k t o r i t y y p p e i h i n + t r a k t o r i u r h e i l u + t r a n s a k t i o a n a l y y s i + t r a n s a k t i o i d e n + t r a n s a k t i o i h i n + t r a n s a k t i o i s t a + t r a n s a k t i o k u s t a n n u k s e t + t r a n s a k t i o k u s t a n n u k s i a + t r a n s a k t i o k u s t a n n u s t e n + t r a n s a k t i o m a k s u + t r a n s a k t i o m a k s u a + t r a n s a k t i o m a k s u i s t a + t r a n s a k t i o m a k s u j e n + t r a n s a k t i o m a k s u l l a + t r a n s a k t i o m a k s u l l e + t r a n s a k t i o m a k s u n + t r a n s a k t i o m a k s u s s a + t r a n s a k t i o m a k s u s t a + t r a n s a k t i o m a k s u u n + t r a n s a k t i o v a l u u t t a n a + t r a n s a k t i o v e r o + t r a n s a k t i o v e r o a + t r a n s a k t i o v e r o i s t a + t r a n s a k t i o v e r o j e n + t r a n s a k t i o v e r o l l a + t r a n s a k t i o v e r o l l e + t r a n s a k t i o v e r o n + t r a n s a k t i o v e r o s s a + t r a n s a k t i o v e r o s t a + t r a n s a t l a n t t i s e e n + t r a n s a t l a n t t i s e l l a + t r a n s a t l a n t t i s e l l e + t r a n s a t l a n t t i s e n + t r a n s a t l a n t t i s e s s a + t r a n s a t l a n t t i s e s t a + t r a n s a t l a n t t i s e t + t r a n s a t l a n t t i s i a + t r a n s a t l a n t t i s i i n + t r a n s a t l a n t t i s i l l e + t r a n s a t l a n t t i s i s s a + t r a n s a t l a n t t i s i s t a + t r a n s a t l a n t t i s t a + t r a n s a t l a n t t i s t e n + t r a n s i s t o r i r a d i o + t r a n s i s t o r i r a d i o i t t e n s a + t r a n s i t o k u l j e t u k s i s t a + t r a n s k r i p t i o t e k i j ä + t r a n s l a a t i o t u t k i m u k s e l l e + t r a n s l a a t i o t u t k i m u s + t r a n s m u t a a t i o s t a + t r a n s p o n d e r i j ä r j e s t e l m ä l l ä + t r a n s p o s i t i o s a l a u s + t r a n s r a s v a h a p o t + t r a n s r a s v a h a p p o j a + t r a n s r a s v a h a p p o j e n + t r a n s s e k s u a a l i e n + t r a n s s u k u p u o l i s e n + t r a n s s u k u p u o l i s i a + t r a n s s u k u p u o l i s i i n + t r a n s s u k u p u o l i s t e n + t r a n s u r a a n i + t r a p p i s t i m u n k k e j a + t r a p p i s t i m u n k k i + t r a u m a a t t i s e m p i + t r a u m a a t t i s i m m i s t a + t r a u m a s t a + t r e n d i k a s v u + t r i a s k a u d e n + t r i d e k a a n i h a p p o + t r i e s t e + t r i e t y l e e n i g l y k o l i + t r i f e n y y l i f o s f i i n i o k s i d i + t r i f e n y y l i m e t y y l i k l o r i d i + t r i f l u o r i e t i k k a h a p p o a n h y d r i d i + t r i f l u o r i m e t a a n i s u l f o n i h a p p o + t r i h a l o m e t a a n i t + t r i k i i n i l a b o r a t o r i o i d e n + t r i k l o o r i a s e t y y l i k l o r i d i + t r i l l e r i l t ä + t r i l o g i a k ä y t ä n n ö n + t r i m e t y y l i b o r a a t t i + t r i n k a t i n r o t t a + t r i t i u m p i t o i s u u d e t + t r i t i u m p i t o i s u u k s i a + t r i t i u m p i t o i s u u k s i s t a + t r o f i a t a s o + t r o i j a l a i s e t + t r o i j a l a i s i a + t r o i k a n + t r o i k a s s a + t r o i k k a k o k o u k s e n + t r o i k k a k o k o u k s e s s a m m e + t r o i k k a t a s o l l a + t r o i k k a v a l t u u s k u n n a n + t r o i k k a v i e r a i l u l l a + t r o m b i i n i n + t r o o l a r i e n + t r o o l a r i l a i v a s t o t + t r o o l a u s k a l a s t a j i e n + t r o o l i e n + t r o o l i v e r k o t + t r o o p p i s e n + t r o o p p i s i s t a + t r o p i i k k i m a t k i j a + t r o p i i k k i t ö y h t ö k i u r u + t r o p i i k k i v a r p u s p ö l l ö + t r u b a d u u r e i s t a + t r u k i n m o n a r k k i + t r u k i n r i l l i + t r u m p e t t i j o u t s e n + t r u m p e t t i k o n s e r t t o + t r u m p e t t i k u r k i + t r u m p e t t i m a n g r o v e k a n a + t r u m p e t t i p u u h a p p o + t r y f f e l i ö l j y + t s e k i l l e + t s e k i l l ä + t s e k i n + t s e k i n m a a t a + t s e k i n p a i m e n k o i r a + t s e k i s s ä + t s e k i s t ä + t s e k i t + t s e k k i e n + t s e k k i i n + t s e k k i o s a p u o l e l l e + t s e k k i o s a p u o l i + t s e k k i ä + t s e t s e k ä r p ä s e t + t s u n a m i a a l l o t + t s u n a m i a a l t o j a + t s u n a m i k a t a s t r o f i i n + t s u n a m i k a t a s t r o f i n + t s u n a m i k a t a s t r o f i s t a + t s u n a m i n + t s u n a m i r i s k i n + t s u n a m i t u h o n + t s u n a m i v a r o i t u s t e n + t s w a n a t + t u a r e g i k a p i n a + t u a r e g i k i e l e t + t u a r e g i t + t u b e r k u l i i n i k o e + t u b e r k u l i i n i k o e t t a + t u b e r k u l i i n i k o k e e s s a + t u b e r k u l i i n i k o k e e t + t u b e r k u l i i n i k o k e i s i i n + t u b e r k u l o o s i a + t u b e r k u l o o s i h o i d o n + t u b e r k u l o o s i n + t u b e r k u l o o s i o h j e l m i e n s a + t u b e r k u l o o s i o n g e l m a n + t u b e r k u l o o s i p a n d e m i a n + t u b e r k u l o o s i p o t i l a a t + t u b e r k u l o o s i p o t i l a i d e n + t u b e r k u l o o s i p o t i l a i s t a + t u b e r k u l o o s i p o t i l a i t a + t u b e r k u l o o s i p ä i v ä + t u b e r k u l o o s i p ä i v ä n ä + t u b e r k u l o o s i r o k o t e + t u b e r k u l o o s i r o k o t e h a n k e + t u b e r k u l o o s i r o k o t e h a n k e t t a + t u b e r k u l o o s i r o k o t e h a n k k e e l l e + t u b e r k u l o o s i r o k o t e h a n k k e e n + t u b e r k u l o o s i r o k o t e h a n k k e e s e e n + t u b e r k u l o o s i r o k o t e h a n k k e e s t a + t u b e r k u l o o s i r o k o t t e e n + t u b e r k u l o o s i r o k o t t e e t + t u b e r k u l o o s i r o k o t t e i d e n + t u b e r k u l o o s i r o k o t t e i l l e + t u b e r k u l o o s i r o k o t t e i s i i n + t u b e r k u l o o s i r o k o t t e i s t a + t u b e r k u l o o s i r o k o t u s o h j e l m a + t u b e r k u l o o s i s t a + t u b e r k u l o o s i t a p a u k s e t + t u b e r k u l o o s i t a p a u k s i a + t u b e r k u l o o s i t a p a u k s i e n + t u b e r k u l o o s i t a p a u s t a + t u b e r k u l o o s i t a p a u s t e n + t u b e r k u l o o s i t u t k i m u s t a + t u b e r k u l o o s i t u t k i m u s y k s i k ö s s ä + t u e k s i + t u e l l e e n + t u e m m e + t u e m m e k i n + t u e m m e k o + t u e n a n t a j a + t u e n a n t a j a m a a n + t u e n i l m a i s u i s t a + t u e n i l m a i s u j a + t u e n i l m a u k s e t + t u e n i l m a u k s i a + t u e n i l m a u k s i s t a + t u e n i l m a u s t e n + t u e n k i n + t u e n k o + t u e n m y ö n t ä m i s p e r u s t e i t a + t u e n o s o i t u k s e n + t u e n p y y n t ö + t u e n s a a j a + t u e n s a a j a e h d o k k a i t a + t u e n s a a j a j ä r j e s t ö i l l e + t u e n s a a j a l u o k k i i n + t u e n s a a j a m a a + t u e n s a a j a m a a t + t u e n s a a j a m a i d e n + t u e n s a a j a m a i s s a k i n + t u e n s a a j a m a i s t a + t u e n s a a j a m a i t a + t u e n s a a j a r y h m ä ä + t u e n s a a j a v a l t i o i s s a + t u e n s a a j a v a l t i o s s a + t u e n s a a j a y r i t y k s e n + t u e n s a a j a y r i t y s t e n + t u e n s a a j i a + t u e n s a a j i e n + t u e n s a a j i i n + t u e n s a a j i l l e + t u e n s a a n t i e d e l l y t y k s i ä + t u e n s a a n t i i n + t u e s t a + t u e s t a a n + t u e s t a m m e + t u e s t a n n e + t u e t a + t u e t a a n + t u e t a a n k o + t u e t t a e s s a + t u e t t a i s i + t u e t t a i s i i n + t u e t t a v a + t u e t t a v i e n + t u e t t a v i l l e + t u e t t a v i s s a k i n + t u e t t e + t u e t t e k o + t u e t t i i n + t u e t t u a + t u e t t u j a + t u e t t u j e n + t u e t u i m p i a + t u e t u m p a a + t u e t u n + t u e t u t + t u h a n n e l t a + t u h a n n e s o s a a + t u h a n n e t + t u h a n s i a + t u h a n s i e n + t u h a n s i e n m i l j a r d i e n + t u h a n s i i n + t u h a n s i l l a + t u h a n s i l l e + t u h a n s i s s a + t u h a n s i s t a + t u h a t k a h d e k s a n s a t a a + t u h a t k e r t a i n e n + t u h a t k e r t a i s e s t i + t u h a t k e r t a i s i a + t u h a t k e r t a i s i k s i + t u h a t s i v u i s e s s a + t u h a t t a + t u h a t v u o t i n e n + t u h a t v u o t i s e n + t u h a t v u o t i s e t + t u h k a h a n h i + t u h k a h a u t a u s p a l k k i o + t u h k a h i u k k a s p i t o i s u u s + t u h k a h u u h k a j a + t u h k a h y y p p ä + t u h k a k a r v a j a l k a + t u h k a k e l t a s i i p i + t u h k a k e r t t u l i + t u h k a k e s k i v i i k k o + t u h k a k i r v i n e n + t u h k a k o t t a r a i n e n + t u h k a k r i i s i + t u h k a k r i i s i n + t u h k a k r i i s i s t ä + t u h k a k r i i s i ä + t u h k a k s i + t u h k a k y y h k y + t u h k a l a u l u m e s i k k o + t u h k a l a u l u t y r a n n i + t u h k a l e i j u + t u h k a l e p i n k ä i n e n + t u h k a l e p i n k ä i s t y r a n n i + t u h k a m e s i k k o + t u h k a m ä ä r ä + t u h k a n + t u h k a n s a + t u h k a o n g e l m a n + t u h k a p a l j a k k a y ö k k ö n e n + t u h k a p i l v e e n + t u h k a p i l v e n + t u h k a p i l v e s t ä + t u h k a p i l v e t + t u h k a p i l v i + t u h k a p i l v i e n + t u h k a p i l v i k r i i s i + t u h k a p i l v i k r i i s i n + t u h k a p i t o i s u u d e n + t u h k a p i t o i s u u s + t u h k a p ä ä b u l b u l i + t u h k a p ä ä m e s i k k o + t u h k a r a s t a s + t u h k a r ä ä t ä l i + t u h k a s a p e l i k o l i b r i + t u h k a s o r s a + t u h k a t u p a s k y n s i k ä s + t u h k a v a h a n o k k a + t u h k a v a r p u n e n + t u h k i m o t a r i n a + t u h l a a j a p o i k a v e r t a u s + t u h l a a j a p o j i k s i + t u h l a a m a t t a + t u h l a a v a i s e s t i + t u h l a a v a i s i n + t u h l a i l e v i e n + t u h l a t a + t u h l a t k o + t u h l a t t a v a + t u h l a t t a v a n + t u h l a u k s e e n + t u h l a u k s e n + t u h l a u k s e s t a + t u h l a u s t a + t u h o a a + t u h o a a n + t u h o a i n e + t u h o a i s i + t u h o a j a g e e n i s t ä + t u h o a j i a + t u h o a l u e e l l a + t u h o a l u e e l l e + t u h o a l u e e t + t u h o a l u e i d e n + t u h o a l u e i l l a + t u h o a l u e i l l e + t u h o a l u e i t a + t u h o a m a a n + t u h o a m a s s a + t u h o a m a s t a + t u h o a m a t t a + t u h o a m i e n + t u h o a m i s e e n + t u h o a m i s e k s i + t u h o a m i s e s t a + t u h o a m i s h a l u a + t u h o a m i s k a m p a n j a n + t u h o a m i s l e i r e i h i n + t u h o a m i s l e i r e i l l ä + t u h o a m i s l e i r i + t u h o a m i s l e i r i e n + t u h o a m i s l e i r i k s i + t u h o a m i s l e i r i n + t u h o a m i s l e i r i s t ä + t u h o a m i s p a i k a n + t u h o a m i s t a + t u h o a m i s t o i m e n p i t e i s t ä + t u h o a m i s t u k i + t u h o a m i s t y ö + t u h o a m i s v i m m a l t a + t u h o a m m e + t u h o a s e i d e n + t u h o a v a a + t u h o a v a t + t u h o a v i a + t u h o a v i i n + t u h o a v i l l e + t u h o a v i l t a + t u h o h y ö n t e i s t e n + t u h o i h i n + t u h o i s a a + t u h o i s a k s i + t u h o i s a m m a t + t u h o i s a m m i s t a + t u h o i s a m p a a + t u h o i s a m p i + t u h o i s a m p i a + t u h o i s a n + t u h o i s a s s a + t u h o i s a t + t u h o i s i a + t u h o i s i a k i n + t u h o i s i e n + t u h o i s i i n + t u h o i s i k s i + t u h o i s i l l a + t u h o i s i l t a + t u h o i s i m m a n + t u h o i s i m m a s t a + t u h o i s i m m a t + t u h o i s i m m i s t a + t u h o i s i m p a a n + t u h o i s i m p i a + t u h o i s i m p i i n + t u h o i s i n + t u h o i s i n a + t u h o i s i n t a + t u h o i s i s t a + t u h o i s t a + t u h o j a + t u h o j a a n + t u h o j e n + t u h o l a i s m y r k k y j ä + t u h o l a i s m y r k y i s t ä + t u h o l a i s o n g e l m a s t a + t u h o l a i s p a i n e i s t a + t u h o l a i s t o r j u n n a k s i + t u h o l a i s t o r j u n n a n + t u h o l a i s t o r j u n t a + t u h o l a i s t o r j u n t a a + t u h o l a i s t o r j u n t a a n + t u h o l a i s t o u k a s s a + t u h o l a i s v i t s a u k s i a + t u h o n + t u h o n n e e t + t u h o n n u t + t u h o n s a + t u h o o j a g e e n i s t ä + t u h o p o l i t i i k a l l e + t u h o p o l t o i s t a + t u h o p o l t t a j i e n + t u h o p o l t t a j i l l e + t u h o p o l t t o i s k u a + t u h o p o l t t o i s k u j a + t u h o p o l t t o j a + t u h o p o l t t o p o l i t i i k a n + t u h o p o l t t o t e r r o r i s m i s t a + t u h o p o m m i t u k s e t + t u h o r i s k i ä + t u h o s i + t u h o s t a + t u h o t + t u h o t a + t u h o t a a n + t u h o t a k s e e n + t u h o t a k s e m m e + t u h o t a k s e n n e + t u h o t e k n o l o g i a + t u h o t o i m e t + t u h o t t a v a + t u h o t t a v a k s i + t u h o t t a v a t + t u h o t t i i n + t u h o t t u a + t u h o t t u a a n + t u h o t t u a n n e + t u h o t t u j e n + t u h o t u l v a t + t u h o t u l v i a + t u h o t u t + t u h o t y ö t + t u h o t ö i d e n + t u h o u t u a + t u h o u t u i v a t + t u h o u t u m a s s a + t u h o u t u m i s v a u h t i a + t u h o u t u n e e n + t u h o u t u n e e t + t u h o u t u n e i d e n + t u h o u t u n u t + t u h o u t u u + t u h o v o i m a + t u h o v o i m a n + t u h o v o i m a t + t u i j a k e r t t u l i + t u i j o t t a v a t + t u i j o t t e l u + t u i k e i l m a i s i n + t u i l l e + t u i m m e + t u i s t a + t u k a h d u t e t t a v a + t u k a h d u t i t t e + t u k a h d u t t a a + t u k a h d u t t a a k s e e n + t u k a h d u t t a m a t t a + t u k a h d u t t a m i s e k s i + t u k a h d u t t a m i s e l l a + t u k a h d u t t a m i s e s t a + t u k a h d u t t a m i s m e k a n i s m i t + t u k a h d u t t a m i s m e n e t e l m i ä + t u k a h d u t t a m i s p o l i t i i k a n + t u k a h d u t t a m i s p o l i t i i k k a a + t u k a h d u t t a m i s t o i m e n p i t e e s t ä + t u k a h d u t t a m i s t o i m e n p i t e e t + t u k a h d u t t a m i s t o i m e t + t u k a h d u t t a m i s t o i m i a + t u k a h d u t t a m i s t o i m i e n + t u k a h d u t t a m i s t o i m i l l a + t u k a h d u t t a m i s t o i m i l t a + t u k a h d u t t a m i s t o i m i n + t u k a h d u t t a m i s t o i m i s t a + t u k a h d u t t a n u t + t u k a h d u t t a v a a n + t u k a h d u t t a v a m m a k s i + t u k a h d u t t a v a m p i a + t u k a h d u t t a v i a + t u k a l a k s i + t u k a l a m m a t + t u k a l a t + t u k e a + t u k e a a n + t u k e a k o + t u k e a k s e e n + t u k e a k s e m m e + t u k e a k s e n i + t u k e a k s e n n e + t u k e a m m e + t u k e a n i + t u k e a n n e + t u k e e + t u k e e k i n + t u k e e k o + t u k e e m m e + t u k e e n + t u k e e n n e + t u k e h d u t t a a + t u k e h d u t t a m i s p e l i + t u k e h d u t t a v a a n + t u k e h d u t t i v a t + t u k e h t u m i s i l m i ö + t u k e h t u m i s t a p a u k s i a + t u k e h t u m i s v a a r a a + t u k e h t u m i s v a a r o j e n + t u k e h t u u + t u k e k a a + t u k e k a a m m e + t u k e m a + t u k e m a a n + t u k e m a l l a + t u k e m a l l a n i + t u k e m a n a + t u k e m a n s a + t u k e m a s s a + t u k e m a s t a m m e + t u k e m a t + t u k e m a t t a + t u k e m e n e t t e l y j ä + t u k e m i a + t u k e m i e n + t u k e m i s e e n + t u k e m i s e k s i + t u k e m i s e l l e + t u k e m i s e n + t u k e m i s e s s a + t u k e m i s e s s a k i n + t u k e m i s e s t a + t u k e m i s t a + t u k e m i s t a p o j a + t u k e m i s t a r v e + t u k e m m e + t u k e n a + t u k e n e e t + t u k e n e i d e n + t u k e n i + t u k e n n e + t u k e n s a + t u k e n u t + t u k e n u t t a + t u k e u d u t t a v a + t u k e u t u k a a + t u k e u t u u + t u k e v a a + t u k e v a a n + t u k e v a l l a + t u k e v a m m a l l a + t u k e v a m m e + t u k e v a m p i + t u k e v a n + t u k e v a n a + t u k e v a n i + t u k e v a n s a + t u k e v a s s a + t u k e v a s t a + t u k e v a t + t u k e v i a + t u k e v i e n + t u k e v i l l e + t u k i a + t u k i a i k a t a u l u n + t u k i a i k e i s t a a n + t u k i a i s i a + t u k i a i s i s t a + t u k i a i s k i l p a i l u n + t u k i a i s t e n + t u k i a l a n + t u k i a l o i t e + t u k i a l o i t t e e t + t u k i a l o i t t e i d e n + t u k i a l o i t t e i s t a + t u k i a l o i t t e i t a + t u k i a l u e e k s i + t u k i a l u e e l l a + t u k i a l u e e n + t u k i a l u e e n a + t u k i a l u e e t + t u k i a l u e i d e n + t u k i a l u e i l l e + t u k i a l u e i t a + t u k i a l u e k a r t t o j e n + t u k i a l u e k e h y s t e n + t u k i a l u s + t u k i a m m e + t u k i a r t i k l a a + t u k i a s e m a + t u k i a s e m a v e r k k o + t u k i a s e m i a + t u k i a s e m i e n + t u k i a s e t u k s e n + t u k i a s i o i d e n + t u k i a s i o i h i n + t u k i a s t e + t u k i a s t e i k k o a + t u k i b u d j e t t i + t u k i e h d o t u k s i a + t u k i e h d o t u s + t u k i e h t o j a + t u k i e l i n + t u k i e l i n t e n + t u k i e n + t u k i e n s a a j i e n + t u k i e r o j a + t u k i e s s a a n + t u k i e s s a m m e + t u k i e s s a n n e + t u k i h a k e m u k s e n + t u k i h a k e m u k s e t + t u k i h a k e m u k s i a + t u k i h a k e m u k s i i n + t u k i h a k e m u s + t u k i h a k e m u s t a + t u k i h a k e m u s t e n + t u k i h a n k k e e n + t u k i h a n k k e e s e e n + t u k i h a n k k e e t + t u k i h a n k k e i d e n + t u k i h a n k k e i t a + t u k i h e n k i l ö k u n t a a + t u k i h e n k i l ö s t ä + t u k i h i n n a n + t u k i h i n t a + t u k i h i n t o j a + t u k i h i n t o j e n + t u k i i n + t u k i j a k s o a + t u k i j a k s o i l l a + t u k i j a k s o n + t u k i j a l k a + t u k i j a n a + t u k i j o i d e n + t u k i j o i s t a + t u k i j o i t a + t u k i j o u k k o j a + t u k i j o u k o t + t u k i j ä r j e s t e l m i e n + t u k i j ä r j e s t e l m i i n + t u k i j ä r j e s t e l m i i n s ä + t u k i j ä r j e s t e l m i n + t u k i j ä r j e s t e l m i s s ä + t u k i j ä r j e s t e l m i s t ä + t u k i j ä r j e s t e l m i ä + t u k i j ä r j e s t e l m i ä m m e + t u k i j ä r j e s t e l m ä + t u k i j ä r j e s t e l m ä k s i + t u k i j ä r j e s t e l m ä l l e + t u k i j ä r j e s t e l m ä l l ä + t u k i j ä r j e s t e l m ä m m e + t u k i j ä r j e s t e l m ä n + t u k i j ä r j e s t e l m ä n ä + t u k i j ä r j e s t e l m ä s s ä + t u k i j ä r j e s t e l m ä s t ä + t u k i j ä r j e s t e l m ä t + t u k i j ä r j e s t e l m ä v a a t i m u k s i a + t u k i j ä r j e s t e l m ä ä + t u k i j ä r j e s t e l m ä ä n + t u k i j ä r j e s t e l y + t u k i j ä r j e s t e l y i d e n + t u k i j ä r j e s t e l y i h i n + t u k i j ä r j e s t e l y i l l e + t u k i j ä r j e s t e l y i l l ä + t u k i j ä r j e s t e l y j e n + t u k i j ä r j e s t e l y j ä + t u k i j ä r j e s t e l y n + t u k i j ä r j e s t e l y s s ä + t u k i j ä r j e s t e l y t + t u k i j ä r j e s t e l y y n + t u k i j ä r j e s t e l y ä + t u k i j ä r j e s t ö t + t u k i k a m p a n j a n + t u k i k a m p a n j o i t a + t u k i k a t t o a + t u k i k a u d e l l a + t u k i k a u d e l l e + t u k i k a u d e n + t u k i k a u s i + t u k i k a u s i n a + t u k i k a u t e e n + t u k i k a u t t a + t u k i k e h y k s e e n + t u k i k e h y k s e n + t u k i k e h y k s e s s ä + t u k i k e h y k s e s t ä + t u k i k e h y k s e t + t u k i k e h y k s i s s ä + t u k i k e h y k s i ä + t u k i k e h y s + t u k i k e h y s t e n + t u k i k e h y s t ä + t u k i k e i n o a + t u k i k e i n o j a + t u k i k e i n o t + t u k i k e l p o i n e n + t u k i k e l p o i s e e n + t u k i k e l p o i s e k s i + t u k i k e l p o i s e n + t u k i k e l p o i s e n a + t u k i k e l p o i s e t + t u k i k e l p o i s i a + t u k i k e l p o i s i n a + t u k i k e l p o i s i s t a + t u k i k e l p o i s t a + t u k i k e l p o i s t e n + t u k i k e l p o i s u u d e l t a a n + t u k i k e l p o i s u u d e n + t u k i k e l p o i s u u s + t u k i k e l p o i s u u s e d e l l y t y k s e t + t u k i k e l p o i s u u s e d e l l y t y k s i ä + t u k i k e l p o i s u u s e h t o j a + t u k i k e l p o i s u u s h a k e m u s t a + t u k i k e l p o i s u u s k a u d e n + t u k i k e l p o i s u u s k a u s i + t u k i k e l p o i s u u s k r i t e e r e i n ä + t u k i k e l p o i s u u s k r i t e e r e i s t ä + t u k i k e l p o i s u u s k r i t e e r e i t ä + t u k i k e l p o i s u u s k r i t e e r e j ä + t u k i k e l p o i s u u s k r i t e e r i n ä + t u k i k e l p o i s u u s k r i t e e r i t + t u k i k e l p o i s u u s k y n n y k s i ä + t u k i k e l p o i s u u s k y n n y s t e n + t u k i k e l p o i s u u s p e r i a a t t e i d e n + t u k i k e l p o i s u u s p e r i a a t t e i t a + t u k i k e l p o i s u u s p e r u s t e e t + t u k i k e l p o i s u u s p e r u s t e i d e n + t u k i k e l p o i s u u s p e r u s t e i s t a + t u k i k e l p o i s u u s p e r u s t e i t a + t u k i k e l p o i s u u s p ä i v ä ä + t u k i k e l p o i s u u s r a j a n + t u k i k e l p o i s u u s s ä ä n t ö j e n + t u k i k e l p o i s u u s s ä ä n t ö j ä + t u k i k e l p o i s u u s v a a t i m u k s e t + t u k i k e l p o i s u u t e n s a + t u k i k e l p o i s u u t t a + t u k i k e s k e i s i ä + t u k i k e s k u k s e n + t u k i k e s k u k s e t + t u k i k e s k u k s i a + t u k i k e s k u k s i s t a + t u k i k e s k u s + t u k i k e s k u s t e n + t u k i k i e l l o n + t u k i k i i s t o i l t a + t u k i k i l p a i l u + t u k i k i l p a i l u a + t u k i k i l p a i l u s t a + t u k i k i l p a j u o k s u a + t u k i k i l p a j u o k s u n + t u k i k o h d a n + t u k i k o h d a t + t u k i k o h t a a + t u k i k o h t a a n + t u k i k o h t e e s e e n + t u k i k o h t e l u a + t u k i k o h t i e n + t u k i k o n e i s t o n + t u k i k o r o t u k s e n + t u k i k o r v a u k s e t + t u k i k r i t e e r e i t ä + t u k i k r i t e e r e j ä + t u k i k r i t e e r i t + t u k i k u d o s + t u k i k u d o s t a + t u k i k u s t a n n u k s e t + t u k i k u s t a n n u s t e n + t u k i k y n n y k s i ä + t u k i k y n n y s a r v o t + t u k i k y n n y s t e n + t u k i k ä y t ä n t ö + t u k i k ä y t ä n t ö j ä + t u k i l a i n s ä ä d ä n n ö n + t u k i l a i n s ä ä d ä n n ö s s ä + t u k i l a i n s ä ä d ä n t ö + t u k i l a i n s ä ä d ä n t ö ä + t u k i l a s k e l m i e n + t u k i l e i k k a u k s e t + t u k i l u o k a n + t u k i l u o k a t + t u k i l u o k k a + t u k i l u o k k a a n + t u k i l u o k k i e n + t u k i l u o t t o j e n + t u k i l ä h t e i s t ä + t u k i m a h d o l l i s u u d e t + t u k i m a h d o l l i s u u k s i a + t u k i m a h d o l l i s u u k s i e n + t u k i m a h d o l l i s u u k s i i n + t u k i m a k s u i s t a + t u k i m a k s u j a + t u k i m a k s u j e n + t u k i m a l l i + t u k i m a l l i n + t u k i m a r k k o j a + t u k i m a t e r i a a l i a + t u k i m e k a n i s m e i h i n + t u k i m e k a n i s m e j a + t u k i m e k a n i s m i + t u k i m e k a n i s m i a + t u k i m e k a n i s m i e n + t u k i m e k a n i s m i i n + t u k i m e k a n i s m i n + t u k i m e k a n i s m i n s a + t u k i m e k a n i s m i s s a + t u k i m e k a n i s m i s t a + t u k i m e k a n i s m i t + t u k i m e n e t e l m i s t ä + t u k i m e n e t e l m ä ä n + t u k i m e n e t t e l y i s t ä + t u k i m e n e t t e l y ä + t u k i m e n o j a + t u k i m e n o t + t u k i m i e l e n o s o i t u k s i a + t u k i m u o d o i l l a + t u k i m u o d o i s t a + t u k i m u o d o l l a + t u k i m u o d o l l e + t u k i m u o d o n + t u k i m u o d o s t a + t u k i m u o d o t + t u k i m u o t o + t u k i m u o t o a + t u k i m u o t o i h i n + t u k i m u o t o j a + t u k i m u o t o j e n + t u k i m u u r i + t u k i m u u r i s s a + t u k i m u u t o k s e e n + t u k i m y l l y + t u k i m y ö n n y t y k s e n + t u k i m ä ä r i e n + t u k i m ä ä r i l l ä + t u k i m ä ä r i ä + t u k i m ä ä r ä + t u k i m ä ä r ä n + t u k i m ä ä r ä r a h a t + t u k i m ä ä r ä r a h o i s t a + t u k i m ä ä r ä t + t u k i m ä ä r ä ä + t u k i n a + t u k i n e u v o t t e l u i h i n + t u k i n h e i t t o + t u k i o h j e l m a + t u k i o h j e l m a a + t u k i o h j e l m a a m m e + t u k i o h j e l m a a n + t u k i o h j e l m a j a k s o n + t u k i o h j e l m a l l a + t u k i o h j e l m a l l e + t u k i o h j e l m a m m e + t u k i o h j e l m a n + t u k i o h j e l m a s s a + t u k i o h j e l m a s s a m m e + t u k i o h j e l m a s t a + t u k i o h j e l m a t + t u k i o h j e l m i a + t u k i o h j e l m i a m m e + t u k i o h j e l m i e m m e + t u k i o h j e l m i e n + t u k i o h j e l m i i n + t u k i o h j e l m i l l a + t u k i o h j e l m i l l e + t u k i o h j e l m i l t a + t u k i o h j e l m i s s a + t u k i o h j e l m i s s a a n + t u k i o h j e l m i s s a k i n + t u k i o h j e l m i s t a + t u k i o i k e u d e s t a + t u k i o p e r a a t i o i t a + t u k i o p e t u s t a + t u k i o r g a n i s a a t i o i s s a + t u k i o s a s t o a + t u k i o s a s t o n + t u k i o s a s t o s t a + t u k i o s t e l u u n + t u k i o s t o i h i n + t u k i p a k e t e i l l e m m e + t u k i p a k e t e i n + t u k i p a k e t e i s s a + t u k i p a k e t i l l e + t u k i p a k e t i n + t u k i p a k e t i s s a + t u k i p a k e t i s t a + t u k i p a k e t i t + t u k i p a k e t t e i h i n + t u k i p a k e t t e j a + t u k i p a k e t t i + t u k i p a k e t t i a + t u k i p a k e t t i e n + t u k i p a k e t t i i n + t u k i p a k e t t i n s a + t u k i p a l k k i o i d e n + t u k i p a l k k i o i n a + t u k i p a l k k i o l l a + t u k i p a l k k i o t + t u k i p a l v e l u + t u k i p a l v e l u i d e n + t u k i p a l v e l u i h i n + t u k i p a l v e l u i l l e + t u k i p a l v e l u i s s a + t u k i p a l v e l u i s t a + t u k i p a l v e l u i t a + t u k i p a l v e l u j a + t u k i p a l v e l u j e n + t u k i p a l v e l u t + t u k i p e r i a a t e + t u k i p e r i a a t t e e n + t u k i p e r u s t a + t u k i p e r u s t a n + t u k i p e r u s t e i n e n + t u k i p e r u s t e i t a + t u k i p e t o s t e n + t u k i p i l a r e i k s i + t u k i p i l a r e i s t a + t u k i p i l a r e i t a + t u k i p i l a r i + t u k i p i l a r i a + t u k i p i l a r i n + t u k i p i l a r i n a + t u k i p i l a r i t + t u k i p i s t e e n s ä + t u k i p o h j a + t u k i p o l i t i i k a l l a + t u k i p o l i t i i k a l l a a n + t u k i p o l i t i i k a n + t u k i p o l i t i i k a s s a + t u k i p o l i t i i k a s s a a n + t u k i p o l i t i i k a s s a m m e + t u k i p o l i t i i k a s t a + t u k i p o l i t i i k k a + t u k i p o l i t i i k k a a + t u k i p o l i t i i k k a a m m e + t u k i p o l i t i i k k a a n + t u k i p o l i t i i k k a m m e + t u k i p o l i t i i k k a n s a + t u k i p o l i t i i k k o j a + t u k i p o l i t i i k k o j e n + t u k i p o l i t i i k o i s s a + t u k i p o l i t i i k o i s t a + t u k i p o n n i s t e l u j e n + t u k i p r o f i i l i + t u k i p r o j e k t e i s s a + t u k i p r o s e n t t i i n + t u k i p r o s e s s i i n + t u k i p r o s e s s i s s a + t u k i p u i t t e e t + t u k i p u i t t e i t a + t u k i p u o l t a + t u k i p y r k i m y k s i ä m m e + t u k i p y y n t ö ä + t u k i p ä ä t ö k s i ä + t u k i p ä ä t ö s t e n + t u k i r a h a s t o + t u k i r a h a s t o a + t u k i r a h a s t o j a + t u k i r a h a s t o j e n + t u k i r a h a s t o l l a + t u k i r a h a s t o l l e + t u k i r a h a s t o n + t u k i r a h a s t o o n + t u k i r a h a s t o s t a + t u k i r a h a s t o t + t u k i r a h o i l l a + t u k i r a h o i l l a m m e + t u k i r a h o i s t a + t u k i r a h o i t u k s e n + t u k i r a h o i t u s t a + t u k i r a h o i t u s v ä l i n e + t u k i r a h o j a + t u k i r a h o j e n + t u k i r a j o i s t a + t u k i r a j o j e n + t u k i r a k e n n e + t u k i r a k e n t e e s t a + t u k i r a k e n t e e t + t u k i r a k e n t e i d e n + t u k i r a k e n t e i s i i n + t u k i r a k e n t e i s t a + t u k i r a k e n t e i t a + t u k i r a t k a i s u j a + t u k i r i i p p u v a i s e n + t u k i r i i p p u v a i s u u d e s t a + t u k i r i i p p u v u u t e e n + t u k i r i i p p u v u u t t a + t u k i r o o l i s s a + t u k i r y h m i e n + t u k i r y h m i i n + t u k i r y h m i ä + t u k i r y h m ä + t u k i r y h m ä l l e + t u k i r y h m ä n + t u k i r y h m ä ä + t u k i s i + t u k i s i t o u m u k s e t + t u k i s i t o u m u s t e m m e + t u k i s i t o u m u s t e n + t u k i s i t t e + t u k i s k a n d a a l i s t a + t u k i s o p i m u k s e t + t u k i s o p i m u k s i a + t u k i s o p i m u k s i i n + t u k i s t r a t e g i a + t u k i s t r a t e g i a a + t u k i s t r a t e g i a n + t u k i s t r a t e g i a s s a + t u k i s t r a t e g i o i h i n + t u k i s t r a t e g i o i t a + t u k i s u h t e e t + t u k i s u k k a + t u k i s u m m a t + t u k i s u m m i a + t u k i s u m m i e n + t u k i s u u n n i t e l m a + t u k i s u u n n i t e l m a a + t u k i s u u n n i t e l m a n + t u k i s u u n n i t e l m a s t a + t u k i s u u n n i t e l m i a + t u k i s u u n n i t e l m i e n + t u k i s u u n n i t e l m i s t a + t u k i s ä ä n n ö i s t ä + t u k i s ä ä n n ö t + t u k i s ä ä n t ö j e n + t u k i s ä ä n t ö j ä + t u k i t a l o u s + t u k i t a l o u s a r v i o m m e + t u k i t a l o u s a r v i o s s a + t u k i t a p a u s + t u k i t a r j o u k s i a + t u k i t a r p e i s t a + t u k i t a s o + t u k i t a s o i h i n + t u k i t a s o i l l e + t u k i t a s o i s t a + t u k i t a s o j a + t u k i t a s o j e n + t u k i t a s o l l e + t u k i t a s o n + t u k i t a s o o n + t u k i t a s o s t a + t u k i t a s o t + t u k i t a v o i t t e i l l e + t u k i t a v o i t t e i t a + t u k i t e h t ä v ä + t u k i t o i m e n a + t u k i t o i m e n p i d e + t u k i t o i m e n p i d e p a k e t i s t a + t u k i t o i m e n p i t e e n + t u k i t o i m e n p i t e e n ä + t u k i t o i m e n p i t e e s e e n + t u k i t o i m e n p i t e e s t ä + t u k i t o i m e n p i t e e t + t u k i t o i m e n p i t e i d e m m e + t u k i t o i m e n p i t e i d e n + t u k i t o i m e n p i t e i k s i + t u k i t o i m e n p i t e i l l e + t u k i t o i m e n p i t e i l l ä + t u k i t o i m e n p i t e i n + t u k i t o i m e n p i t e i s i i n + t u k i t o i m e n p i t e i s t ä + t u k i t o i m e n p i t e i t ä + t u k i t o i m e n s a + t u k i t o i m e t + t u k i t o i m i + t u k i t o i m i a + t u k i t o i m i e m m e + t u k i t o i m i e n + t u k i t o i m i i n + t u k i t o i m i j ä r j e s t e l m ä n + t u k i t o i m i l l a + t u k i t o i m i l l e + t u k i t o i m i m e n e t t e l y j e n + t u k i t o i m i n + t u k i t o i m i n t a + t u k i t o i m i n t a a n + t u k i t o i m i n t o j a a n + t u k i t o i m i s s a + t u k i t o i m i s t a + t u k i t o i m i s t o + t u k i t o i m i s t o a + t u k i t o i m i s t o i h i n + t u k i t o i m i s t o j a + t u k i t t a v a + t u k i t u r i s m i a + t u k i t y ö + t u k i t y ö n t e k i j ä + t u k i v a i h t o e h t o j a + t u k i v a j e + t u k i v a l i k o i m a s t a + t u k i v a l i o k u n t a n a + t u k i v a r a t + t u k i v a r o i s t a + t u k i v a r o j a + t u k i v a r o j e n + t u k i v a t + t u k i v e k t o r i k o n e + t u k i v e r k k o + t u k i v e r k k o a + t u k i v e r k k o j a + t u k i v e r k k o o n + t u k i v e r k o n + t u k i v e r k o s t o + t u k i v e r k o s t o j e n + t u k i v e r k o s t o n + t u k i v i e s t i + t u k i v i i d a k k o + t u k i v i i d a k o n + t u k i v i r a s t o + t u k i v i r a s t o a + t u k i v i r a s t o j e n + t u k i v i r a s t o l l a + t u k i v i r a s t o n + t u k i v i r a s t o o n + t u k i v i r a s t o s t a + t u k i v i r r a s t a + t u k i v i r t o i h i n + t u k i v i r t o j e n + t u k i v o i m a + t u k i v o i m a v a r o j e n + t u k i v ä l i n e + t u k i v ä l i n e e l l e + t u k i v ä l i n e e n + t u k i v ä l i n e e n ä + t u k i v ä l i n e e s t ä + t u k i v ä l i n e e t + t u k i v ä l i n e i d e n + t u k i v ä l i n e i k s i + t u k i v ä l i n e i s i i m m e + t u k i v ä l i n e i s s ä + t u k i v ä l i n e i s t ä + t u k i v ä l i n e i t ä + t u k i v ä l i n e i t ä ä n + t u k i y h t i ö + t u k i y h t i ö ö n + t u k i y r i t y k s i ä + t u k k a k o s k e l o + t u k k a s o r s a + t u k k a s o t k a + t u k k i j o k i + t u k k i k a a m m e + t u k k i m a a n + t u k k i m i e h e n t ä i + t u k k u h i n n a t + t u k k u h i n t a + t u k k u j a k e l i j a t + t u k k u k a u p p a + t u k k u k a u p p a j ä r j e s t e l m ä n + t u k k u k u s t a n n u k s i a + t u k k u m a r k k i n a t + t u k k u m a r k k i n o i n t i + t u k k u m y y n t i h i n t o j a + t u k k u p a n k k i e n + t u k k u r a h o i t u s m a r k k i n a t + t u k k u s ä h k ö m a r k k i n o i l l a + t u k k u s ä h k ö p ö r s s e i s s ä + t u k k u v ä ä r i s t e l y ä + t u l e e + t u l e e k i n + t u l e e k o + t u l e e p a + t u l e h d u s a l t t i u t t a + t u l e h d u s r e a k t i o i h i n + t u l e h d u s s a i r a u d e s s a + t u l e h d u s s a i r a u k s i a + t u l e h d u s t a u t i + t u l e h d u s v a a r a a + t u l e h t u a + t u l e j ä r v i + t u l e m a a n + t u l e m a t t a + t u l e m m e + t u l e n + t u l e n a r a s t a + t u l e n a r e m p i a + t u l e n a r k a + t u l e n j o h t a j a + t u l e n l i e s k a + t u l e n n i e l i j ä + t u l e n p a l v o n t a + t u l e n p u h a l l u s + t u l e n s a m m u t t a j a + t u l e n s a m m u t t i m i s s a + t u l e s s a + t u l e v a a + t u l e v a a n + t u l e v a i s u u d e l l a + t u l e v a i s u u d e l l e + t u l e v a i s u u d e l l e e n + t u l e v a i s u u d e l t a + t u l e v a i s u u d e l t a a n + t u l e v a i s u u d e n + t u l e v a i s u u d e n a l a + t u l e v a i s u u d e n a r v i o i d e n + t u l e v a i s u u d e n k u v a a + t u l e v a i s u u d e n k u v a a m m e + t u l e v a i s u u d e n k u v a s t a a n + t u l e v a i s u u d e n k u v i s t a + t u l e v a i s u u d e n l u p a u k s i a + t u l e v a i s u u d e n m a h d o l l i s u u k s i a + t u l e v a i s u u d e n m a h d o l l i s u u k s i l l e + t u l e v a i s u u d e n m a h d o l l i s u u t e m m e + t u l e v a i s u u d e n m a r k k i n a t + t u l e v a i s u u d e n n ä k e m y s t ä + t u l e v a i s u u d e n n ä k y m i e n + t u l e v a i s u u d e n n ä k y m i i n + t u l e v a i s u u d e n n ä k y m i l l e + t u l e v a i s u u d e n n ä k y m i s t ä + t u l e v a i s u u d e n n ä k y m i ä + t u l e v a i s u u d e n n ä k y m i ä ä n + t u l e v a i s u u d e n n ä k y m ä + t u l e v a i s u u d e n n ä k y m ä n + t u l e v a i s u u d e n n ä k y m ä n s ä + t u l e v a i s u u d e n n ä k y m ä s t ä + t u l e v a i s u u d e n n ä k y m ä t + t u l e v a i s u u d e n n ä k y m ä ä + t u l e v a i s u u d e n o d o t u k s i i n + t u l e v a i s u u d e n p e l k o + t u l e v a i s u u d e n p e l k o n s a + t u l e v a i s u u d e n p e r s p e k t i i v i n + t u l e v a i s u u d e n r a t k a i s u + t u l e v a i s u u d e n s u u n n i t e l m a + t u l e v a i s u u d e n s u u n n i t e l m a a + t u l e v a i s u u d e n s u u n n i t e l m a n + t u l e v a i s u u d e n s u u n n i t e l m i a + t u l e v a i s u u d e n s u u n n i t e l m i a m m e + t u l e v a i s u u d e n s u u n n i t e l m i s s a n n e + t u l e v a i s u u d e n s u u n n i t e l m i s t a a n + t u l e v a i s u u d e n t a v o i t t e i t a + t u l e v a i s u u d e n t o i v o a + t u l e v a i s u u d e n t u t k i m u k s e n + t u l e v a i s u u d e n t u t k i m u s + t u l e v a i s u u d e n t u t k i m u s y k s i k ö l t ä ä n + t u l e v a i s u u d e n t u t k i m u s y k s i k ö n + t u l e v a i s u u d e n u n e l m a + t u l e v a i s u u d e n u s k o a + t u l e v a i s u u d e n u s k o l l e e n + t u l e v a i s u u d e n u s k o n + t u l e v a i s u u d e n v a i h t o e h t o j a + t u l e v a i s u u d e s s a + t u l e v a i s u u d e s s a k a a n + t u l e v a i s u u d e s s a k i n + t u l e v a i s u u d e s t a + t u l e v a i s u u d e s t a a n + t u l e v a i s u u d e s t a m m e + t u l e v a i s u u s e n n u s t e e n + t u l e v a i s u u s e n n u s t e e t + t u l e v a i s u u s f o o r u m i l l e + t u l e v a i s u u s i n v e s t o i n n i t + t u l e v a i s u u s j u l i s t u k s e s t a + t u l e v a i s u u s k e s k u s t e l u a + t u l e v a i s u u s k e s k u s t e l u n + t u l e v a i s u u s k e s k u s t e l u u n + t u l e v a i s u u s k u v a a + t u l e v a i s u u s k y s y m y k s i i n + t u l e v a i s u u s n ä k y m ä n + t u l e v a i s u u s p a i n o t t e i s e s t a + t u l e v a i s u u s p a i n o t t e i s t a + t u l e v a i s u u s p o l i t i i k k a a n + t u l e v a i s u u s r a h a s t o i h i n + t u l e v a i s u u s r y h m ä t + t u l e v a i s u u s s t r a t e g i a n + t u l e v a i s u u s s u u n n i t e l m a + t u l e v a i s u u t e e n + t u l e v a i s u u t e e n s a + t u l e v a i s u u t e m m e + t u l e v a i s u u t e n s a + t u l e v a i s u u t t a + t u l e v a i s u u t t a a n + t u l e v a i s u u t t a m m e + t u l e v a k s i + t u l e v a l l a + t u l e v a l l e + t u l e v a l t a + t u l e v a n + t u l e v a n a + t u l e v a s s a + t u l e v a s t a + t u l e v a t + t u l e v a t k i n + t u l e v a t k o + t u l e v i a + t u l e v i e n + t u l e v i e n k i n + t u l e v i i n + t u l e v i k s i + t u l e v i l l a + t u l e v i l l e + t u l e v i l t a + t u l e v i n a + t u l e v i s s a + t u l e v i s s a k i n + t u l e v i s t a + t u l i a s e e n k a n t o l u v a n + t u l i a s e i d e n + t u l i e n k e l i + t u l i e v ä + t u l i h a r j a k o l i b r i + t u l i h a u k k a k a l a + t u l i h e r t t u a k a l a + t u l i h u n t u l a v a s t a j a + t u l i h u u l i k a l a + t u l i k a s t e + t u l i k a s t e e n + t u l i k a u l u s p i i s p a + t u l i k e r t t u l i + t u l i k i v e n k a t k u i s i l l a + t u l i k o e + t u l i k o k e e k s i + t u l i k o k e e n a + t u l i k o k e e s e e n + t u l i k o t i n g a + t u l i k r u u n u k e r t t u l i + t u l i k u r k k u k e r t t u l i + t u l i k u r k k u k o t i n g a + t u l i k u r k k u v ä s t ä r ä k k i + t u l i k ä r k i + t u l i k ä ä p i ö a h v e n + t u l i l a t v a + t u l i l e p i n k ä i n e n + t u l i l i n j a l l a + t u l i l i n j a l l a a n + t u l i l i n j a l l e + t u l i l i s k o t + t u l i m a a + t u l i m a a n k a i v a j a + t u l i m a a n k u r p p a + t u l i m e r e s t ä + t u l i m m e + t u l i m u u r a h a i n e n + t u l i n + t u l i n i s k a t i k k a + t u l i n i s k a t i k k a n e n + t u l i n o k k a k y y h k y + t u l i p a + t u l i p a l o a + t u l i p a l o i l t a + t u l i p a l o i s s a + t u l i p a l o i s t a + t u l i p a l o j a + t u l i p a l o j e n + t u l i p a l o k a t a s t r o f i a + t u l i p a l o k ä r k i + t u l i p a l o n + t u l i p a l o p e s ä k e t t ä + t u l i p a l o r i s k i e n + t u l i p a l o s t a + t u l i p a l o t + t u l i p a l o t i l a n t e i s s a + t u l i p a l o v a a r a a + t u l i p e r ä i s e s t ä + t u l i p e r ä k u t o j a + t u l i p e r ä t i k k a + t u l i p o l t e + t u l i p o r a + t u l i p u n a h a p e r o + t u l i p y r s t ö + t u l i p ä ä + t u l i p ä ä b u l b u l i + t u l i p ä ä h i p p i ä i n e n + t u l i r a k k o + t u l i r i n t a l e p i n k ä i n e n + t u l i r i n t a m a + t u l i r o k k o + t u l i r u u s u p e i p p o + t u l i s a l a m a n t e r i + t u l i s a l v i a + t u l i s i + t u l i s i k i n + t u l i s i k o + t u l i s i l m ä t + t u l i s k i n k k i + t u l i s u k a r a p u + t u l i s u o l a h e i n ä + t u l i s u u + t u l i t a i d e + t u l i t a i s t e l u a + t u l i t a u k o + t u l i t a u k o a + t u l i t a u k o a l o i t t e i s s a + t u l i t a u k o a l u e i l l a + t u l i t a u k o j a + t u l i t a u k o o n + t u l i t a u k o p r o s e s s i n + t u l i t a u k o s o p i m u k s e l t a + t u l i t a u k o s o p i m u k s e n + t u l i t a u k o s o p i m u k s e s s a + t u l i t a u k o s o p i m u k s e s t a + t u l i t a u k o s o p i m u k s e t + t u l i t a u k o s o p i m u k s i a + t u l i t a u k o s o p i m u s + t u l i t a u k o s o p i m u s t a + t u l i t a u k o s o p i m u s t e n + t u l i t a u k o s u u n n i t e l m a a + t u l i t a u k o s u u n n i t e l m a n + t u l i t a u o i s t a + t u l i t a u o n + t u l i t a u o s t a + t u l i t a v i o k u u r n a + t u l i t i k k u o n g e l m a + t u l i t i k k u t e h t a a n + t u l i t i k l i + t u l i t o k k o + t u l i t o p a a s i k o l i b r i + t u l i t o r n a d o + t u l i t t e + t u l i t u o k s u i n k i v ä ä r i + t u l i t y ö + t u l i t ä p l ä t o k k o + t u l i t ö y h t ö + t u l i v a l m u s k a + t u l i v a t + t u l i v a t p a + t u l i v a t s a t i k k a n e n + t u l i v a u n u t + t u l i v u o r e n + t u l i v u o r e n p u r k a u k s e e n + t u l i v u o r e n p u r k a u k s e l l a + t u l i v u o r e n p u r k a u k s e n + t u l i v u o r e n p u r k a u k s e s t a + t u l i v u o r e n p u r k a u k s e t + t u l i v u o r e n p u r k a u k s i a + t u l i v u o r e n p u r k a u k s i s t a + t u l i v u o r e n p u r k a u s + t u l i v u o r e n p u r k a u s t a + t u l i v u o r e n p u r k a u s t a p a u k s i s s a + t u l i v u o r e n p u r k a u s t e n + t u l i v u o r i + t u l i v u o r i k a n i i n i + t u l i v u o r i k r i i s i n + t u l i v u o r i k r i i s i ä + t u l i v u o r i o n g e l m a + t u l i v ä l s k ä r i + t u l k a a + t u l k a t e s s a a n + t u l k a t t i i n + t u l k a t t u i n a + t u l k e i l l e + t u l k i n n a l l e + t u l k i n n a n + t u l k i n n a n v a r a + t u l k i n n a n v a r a a + t u l k i n n a n v a r a i n e n + t u l k i n n a n v a r a i s e k s i + t u l k i n n a n v a r a i s i a + t u l k i n n a s s a + t u l k i n n a s t a + t u l k i n n a t + t u l k i n n o i l l a + t u l k i n n o i l l e + t u l k i n n o i s t a + t u l k i n n u t + t u l k i n t a a + t u l k i n t a a n + t u l k i n t a e r i m i e l i s y y d e t + t u l k i n t a e r i m i e l i s y y k s i ä + t u l k i n t a e r o + t u l k i n t a e r o i h i n + t u l k i n t a e r o i l l e + t u l k i n t a e r o i s s a + t u l k i n t a e r o i s t a + t u l k i n t a e r o j a + t u l k i n t a e r o t + t u l k i n t a k y s y m y k s e s t ä + t u l k i n t a k y s y m y k s e t + t u l k i n t a k y s y m y k s i i n + t u l k i n t a k y s y m y s + t u l k i n t a m a h d o l l i s u u d e t + t u l k i n t a o h j e e t + t u l k i n t a o h j e i t a + t u l k i n t a o n g e l m a + t u l k i n t a o n g e l m a n + t u l k i n t a o n g e l m a t + t u l k i n t a o n g e l m i a + t u l k i n t a o n g e l m i e n + t u l k i n t a o n g e l m i i n + t u l k i n t a t a r p e e n + t u l k i n t a t a v a n + t u l k i n t a v a i k e u d e t + t u l k i n t a v a i k e u k s i a + t u l k i n t a v a i k e u k s i e n + t u l k i n t a v a i k e u k s i s t a + t u l k i n t a v a l t a + t u l k i n t a v a r a a + t u l k i n t a v i r h e + t u l k i n t a y r i t y k s i ä + t u l k i n t o i h i n + t u l k i n t o j a + t u l k i n t o j e n + t u l k i t + t u l k i t a + t u l k i t a k s e e n + t u l k i t e s s a a n + t u l k i t k a a m m e + t u l k i t s e e + t u l k i t s e m a l l a + t u l k i t s e m i n e n + t u l k i t s e m i s e e n + t u l k i t s e m i s e k s i + t u l k i t s e m i s e s s a + t u l k i t s e m i s e s t a + t u l k i t s e m i s p e r u s t e i t a + t u l k i t s e m m e + t u l k i t s e v a t + t u l k i t s i k o + t u l k i t s i v a t + t u l k i t t a v a + t u l k k a u k s e e n + t u l k k a u k s e n + t u l k k a u k s e s s a + t u l k k a u s a p u + t u l k k a u s j ä r j e s t e l m ä + t u l k k a u s j ä r j e s t e l m ä ä + t u l k k a u s j ä r j e s t e l y j ä + t u l k k a u s k a n a v a a + t u l k k a u s k o p i s s a + t u l k k a u s k o p i t + t u l k k a u s k o p p e i h i n + t u l k k a u s k u l u t + t u l k k a u s k u s t a n n u k s e t + t u l k k a u s l a i t t e i l l e + t u l k k a u s l a i t t e i n + t u l k k a u s m a h d o l l i s u u k s i a + t u l k k a u s m e n e t t e l y t + t u l k k a u s o n g e l m i a + t u l k k a u s o n g e l m i e n + t u l k k a u s p a l v e l u + t u l k k a u s p a l v e l u a + t u l k k a u s p a l v e l u i s t a + t u l k k a u s p a l v e l u i t a + t u l k k a u s p a l v e l u j a + t u l k k a u s p a l v e l u j e n + t u l k k a u s p a l v e l u n + t u l k k a u s p a l v e l u t + t u l k k a u s t a + t u l k k a u s t a r p e e t + t u l k k a u s t e k n i i k o i h i n + t u l k k a u s t o i m i n t a a n + t u l k k a u s v i r h e + t u l k k a u s v i r h e e s t ä + t u l k k a u s y k s i k ö i t ä + t u l k k e i n a + t u l k k e j a + t u l k k e j a m m e + t u l k k i e n + t u l k k i k o u l u t u s + t u l k k i l u e t t e l o o n + t u l k k i o n g e l m i e n + t u l k k i p u l a s t a + t u l k k i r y h m ä t + t u l k o o n + t u l l a + t u l l a a n + t u l l a a n h a n + t u l l a a n k o + t u l l a k a a n + t u l l a k s e e n + t u l l a k s e m m e + t u l l a u k s e s s a + t u l l a u s a r v o a + t u l l a u s i l m o i t u s t a + t u l l a u s j ä r j e s t e l m ä n + t u l l a u s k e s k u k s e n + t u l l a u s m e n e t t e l y s t ä + t u l l a u s t e k n o l o g i a a + t u l l e e n + t u l l e e n s a + t u l l e e t + t u l l e i d e n + t u l l e i h i n + t u l l e i l l a + t u l l e i n + t u l l e i s s a + t u l l e i s t a + t u l l e i t a + t u l l e i t t a + t u l l e j a + t u l l e j a a n + t u l l e n + t u l l e s s a + t u l l e s s a a n + t u l l e s s a m m e + t u l l e s s a n i + t u l l e v a t + t u l l i a + t u l l i a k a t e m i a + t u l l i a l a a + t u l l i a l a l l a + t u l l i a l a n + t u l l i a l e n n u k s i a + t u l l i a l e n n u k s i l l a + t u l l i a l e n n u k s i n a + t u l l i a l e n n u k s i s t a + t u l l i a l e n n u s a s i a + t u l l i a l e n n u s t e n + t u l l i a l o i l l a + t u l l i a l u e + t u l l i a l u e e l l a + t u l l i a l u e e l l e + t u l l i a l u e e n + t u l l i a l u e e n a + t u l l i a l u e e s e e n + t u l l i a l u e i l l a a n + t u l l i a l u e t t a + t u l l i a r v i o i d e n + t u l l i a s e m a t + t u l l i a s e t u k s e n + t u l l i a s e t u s t a + t u l l i a s i a k i r j a t + t u l l i a s i a k i r j o i s s a + t u l l i a s i a k i r j o j a + t u l l i a s i a k i r j o j e n + t u l l i a s i a m i e s t a p a u s + t u l l i a s i o i d e n + t u l l i a s i o i h i n + t u l l i a s i o i s s a + t u l l i a s i o i t a + t u l l i a s i o i t s i j a n + t u l l i a s i o i t s i j a t + t u l l i a s i o i t s i j o i d e n + t u l l i a s i o i t s i j o i l l a + t u l l i a v u s t u s t e h t ä v i s s ä + t u l l i e d u s t a j a a n + t u l l i e d u s t a j a k s i + t u l l i e d u s t a j a n + t u l l i e d u s t a j a s t a + t u l l i e d u s t a j i a + t u l l i e d u s t a j i e n + t u l l i e d u s t a j i k s i + t u l l i e d u s t u k s e e n + t u l l i e d u t + t u l l i e l i n t e n + t u l l i e n + t u l l i e s t e e t + t u l l i e s t e i d e n + t u l l i e s t e i k s i + t u l l i e s t e i s i i n + t u l l i e s t e i s t ä + t u l l i e s t e i t ä + t u l l i e t u j a + t u l l i e t u u d e l l e + t u l l i e t u u d e s t a + t u l l i e t u u d e t + t u l l i e t u u k s i a + t u l l i e t u u k s i e n + t u l l i e t u u k s i i n + t u l l i e t u u k s i n + t u l l i e t u u k s i s s a + t u l l i e t u u k s i s t a + t u l l i e t u u s a s e t u k s e n + t u l l i e t u u s j ä r j e s t e l m i e n + t u l l i e t u u s j ä r j e s t e l m i i n + t u l l i e t u u s j ä r j e s t e l m i s s ä + t u l l i e t u u s j ä r j e s t e l m i s t ä + t u l l i e t u u s j ä r j e s t e l m i ä + t u l l i e t u u s j ä r j e s t e l m ä + t u l l i e t u u s j ä r j e s t e l m ä k s i + t u l l i e t u u s j ä r j e s t e l m ä l l ä + t u l l i e t u u s j ä r j e s t e l m ä m m e + t u l l i e t u u s j ä r j e s t e l m ä n + t u l l i e t u u s j ä r j e s t e l m ä s s ä + t u l l i e t u u s j ä r j e s t e l m ä s t ä + t u l l i e t u u s j ä r j e s t e l m ä s t ä m m e + t u l l i e t u u s j ä r j e s t e l m ä t + t u l l i e t u u s j ä r j e s t e l m ä ä + t u l l i e t u u s j ä r j e s t e l m ä ä n + t u l l i e t u u s k i i n t i ö i d e n + t u l l i e t u u s k i i n t i ö i t ä + t u l l i e t u u s k o h t e l u + t u l l i e t u u s k o h t e l u a + t u l l i e t u u s k o h t e l u j ä r j e s t e l m ä s s ä + t u l l i e t u u s k o h t e l u n + t u l l i e t u u s k o h t e l u u n + t u l l i e t u u s m a r g i n a a l i + t u l l i e t u u s m a r g i n a a l i t + t u l l i e t u u s m e n e t t e l y j ä + t u l l i e t u u s s o p i m u k s e s s a + t u l l i e t u u t t a + t u l l i h a l l i n n o l l a + t u l l i h a l l i n n o n + t u l l i h a l l i n n o s s a + t u l l i h a l l i n n o t + t u l l i h a l l i n t o + t u l l i h a l l i n t o a + t u l l i h a l l i n t o a a n + t u l l i h a l l i n t o e l i m e t + t u l l i h a l l i n t o h e n k i l ö t + t u l l i h a l l i n t o j a + t u l l i h a l l i n t o j e n + t u l l i h a l l i n t o k u l u j a + t u l l i h a l l i n t o n s a + t u l l i h a l l i n t o o n + t u l l i h e l p o t u k s i a + t u l l i h e n k i l ö k u n n a n + t u l l i h e n k i l ö s t ö s t ä + t u l l i h i n n o i s t a + t u l l i h y v i t y s + t u l l i i n + t u l l i j a l o s t u s m e n e t t e l y j ä + t u l l i j ä r j e s t e l m i e n + t u l l i j ä r j e s t e l m i l l e + t u l l i j ä r j e s t e l m i s s ä + t u l l i j ä r j e s t e l m i ä + t u l l i j ä r j e s t e l m ä + t u l l i j ä r j e s t e l m ä l l ä + t u l l i j ä r j e s t e l m ä m m e + t u l l i j ä r j e s t e l m ä n + t u l l i j ä r j e s t e l m ä n s ä + t u l l i j ä r j e s t e l m ä t + t u l l i j ä r j e s t e l m ä ä + t u l l i j ä r j e s t e l m ä ä n + t u l l i j ä r j e s t e l m ä ä n s ä + t u l l i j ä r j e s t e l y i s t ä + t u l l i j ä r j e s t ö + t u l l i j ä r j e s t ö n + t u l l i j ä r j e s t ö s s ä + t u l l i k e r t y m ä t + t u l l i k e r t y m ä ä + t u l l i k i i n t i ö + t u l l i k i i n t i ö i d e n + t u l l i k i i n t i ö i t ä + t u l l i k i i n t i ö j ä r j e s t e l m ä + t u l l i k i i n t i ö j ä r j e s t e l m ä l l ä + t u l l i k i i n t i ö j ä r j e s t e l m ä n + t u l l i k i i n t i ö j ä r j e s t e l m ä ä + t u l l i k i i n t i ö k o r o t u k s i a + t u l l i k i i n t i ö n + t u l l i k i i n t i ö t ä + t u l l i k o h t e l u v i r h e i d e n + t u l l i k o m i t e a + t u l l i k o o d e k s e j a + t u l l i k o o d e k s i + t u l l i k o o d e k s i a + t u l l i k o o d e k s i i n + t u l l i k o o d e k s i k o m i t e a n + t u l l i k o o d e k s i k o m i t e a s s a + t u l l i k o o d e k s i l l a + t u l l i k o o d e k s i m ä ä r ä y s t e n + t u l l i k o o d e k s i n + t u l l i k o o d e k s i s s a + t u l l i k o o d e k s i s t a + t u l l i k u r s s i + t u l l i k u r s s i a + t u l l i k u r s s i i n + t u l l i k y s y m y k s e s s ä + t u l l i k y s y m y k s i s t ä + t u l l i k ä y t ä n n ö i s s ä + t u l l i k ä y t ä n t ö j e n + t u l l i l a i n s ä ä d ä n n ö n + t u l l i l a i n s ä ä d ä n n ö s s ä + t u l l i l a i n s ä ä d ä n t ö + t u l l i l a i n s ä ä d ä n t ö m m e + t u l l i l a i n s ä ä d ä n t ö ä + t u l l i l a i n s ä ä d ä n t ö ö n + t u l l i l a i t o k s e e n + t u l l i l a i t o k s e l l e + t u l l i l a i t o k s e t + t u l l i l a i t o k s i a a n + t u l l i l a i t o k s i e n + t u l l i l a i t o k s i l l a + t u l l i l a i t o k s i l l e + t u l l i l a i t o s + t u l l i l a i t o s t a + t u l l i l a i t o s t e n + t u l l i l a u s e k k e i d e n + t u l l i l i i k e n t e e n + t u l l i l i i t o a + t u l l i l i i t o i l l a + t u l l i l i i t o i s s a + t u l l i l i i t o i s t a + t u l l i l i i t o k s i + t u l l i l i i t o l l a + t u l l i l i i t o l l e + t u l l i l i i t o n + t u l l i l i i t o s s a + t u l l i l i i t o s t a + t u l l i l i i t o t + t u l l i l i i t t o + t u l l i l i i t t o a + t u l l i l i i t t o j e n + t u l l i l i i t t o k u m p p a n i m m e + t u l l i l i i t t o m m e + t u l l i l i i t t o n s a + t u l l i l i i t t o o n + t u l l i l i i t t o s o p i m u k s e l l a + t u l l i l i i t t o s o p i m u k s e n + t u l l i l i i t t o s o p i m u k s i s t a + t u l l i l i i t t o s o p i m u s + t u l l i l i i t t o s o p i m u s t a + t u l l i l l a + t u l l i l l e + t u l l i l u o t o n + t u l l i l u o t o s t a + t u l l i l u o t o t + t u l l i l u o t t o a + t u l l i l u o t t o j e n + t u l l i l u o t t o n s a + t u l l i l u v u t + t u l l i m a k s u + t u l l i m a k s u i h i m m e + t u l l i m a k s u i h i n + t u l l i m a k s u i l l a + t u l l i m a k s u i l l e + t u l l i m a k s u i n a + t u l l i m a k s u i s s a + t u l l i m a k s u i s t a + t u l l i m a k s u j a + t u l l i m a k s u j e n + t u l l i m a k s u j ä r j e s t e l m ä + t u l l i m a k s u n + t u l l i m a k s u p e r u s t e i s e l l a + t u l l i m a k s u p o l i t i i k k a a + t u l l i m a k s u s ä ä s t ö j e n + t u l l i m a k s u t + t u l l i m a k s u t e k n i i k k a a + t u l l i m a k s u t u l o j a + t u l l i m a k s u t u l o n s a + t u l l i m a k s u t u l o t + t u l l i m a k s u v ä h e n n y k s e t + t u l l i m a k s u v ä h e n n y s + t u l l i m e k a n i s m i e n + t u l l i m e n e t t e l y i d e n + t u l l i m e n e t t e l y i h i n + t u l l i m e n e t t e l y i l l e + t u l l i m e n e t t e l y i s s ä + t u l l i m e n e t t e l y i s t ä + t u l l i m e n e t t e l y i t ä + t u l l i m e n e t t e l y j e n + t u l l i m e n e t t e l y j ä + t u l l i m e n e t t e l y n + t u l l i m e n e t t e l y t + t u l l i m e n e t t e l y ä + t u l l i m i e h i ä + t u l l i m i e s t e n + t u l l i m u o d o l l i s u u d e t + t u l l i m u o d o l l i s u u k s i a + t u l l i m u o d o l l i s u u k s i e n + t u l l i m u o d o l l i s u u k s i i n + t u l l i m u o d o l l i s u u k s i s t a + t u l l i m u o d o n + t u l l i m u u r e i s t a + t u l l i m u u r e j a + t u l l i m u u r i + t u l l i m u u r i t + t u l l i m y ö n n y t y k s i ä + t u l l i m ä ä r ä y k s e t + t u l l i m ä ä r ä y k s i i n + t u l l i n + t u l l i n a l e n n u k s e l l a + t u l l i n a l e n n u k s e n + t u l l i n a l e n n u k s i a + t u l l i n a l e n n u s t e n + t u l l i n e u v o t t e l u t + t u l l i n i m i k e l u o k i t t e l u + t u l l i n i m i k e t t ä + t u l l i n i m i k k e e s t ä + t u l l i n i m i k k e e t + t u l l i n i m i k k e i s t ö ä + t u l l i n p a l a u t u k s e s t a + t u l l i n p a l a u t u k s e t + t u l l i n p a l a u t u k s i a + t u l l i n p a l a u t u k s i i n + t u l l i n p a l a u t u k s i s s a + t u l l i n p a l a u t u s + t u l l i n p a l a u t u s m e k a n i s m i + t u l l i n p a l a u t u s t e n + t u l l i o i k e u k s i i n + t u l l i o i k e u k s i s t a + t u l l i o i k e u t t a + t u l l i o p e r a a t i o i t a + t u l l i p a l v e l u a + t u l l i p a l v e l u i d e n + t u l l i p a l v e l u i l l e + t u l l i p a l v e l u i s s a + t u l l i p a l v e l u i s t a + t u l l i p a l v e l u j e n + t u l l i p a l v e l u n + t u l l i p a l v e l u t + t u l l i p a s s i t u k s e s s a + t u l l i p e t o k s e t + t u l l i p e t o k s i a + t u l l i p e t o k s i i n + t u l l i p e t o k s i s s a + t u l l i p e t o s t e n + t u l l i p i s t e i s s ä + t u l l i p o l i i t t i s e l l e + t u l l i p o l i i t t i s e n + t u l l i p o l i t i i k a n + t u l l i p o l i t i i k a s s a + t u l l i p o l i t i i k k a + t u l l i p o l i t i i k k a a + t u l l i p o l i t i i k k a a n + t u l l i p ä ä l l y s t ö n + t u l l i p ö y t ä k i r j a + t u l l i r a h a t + t u l l i r a j a t + t u l l i r a j o i t t e i t a + t u l l i r a j o i t u k s i a + t u l l i r a j o j e n + t u l l i r a k e n n u k s e t + t u l l i r e k i s t e r ö i n t i m e n e t t e l y j e n + t u l l i r e k i s t e r ö i n t i ä + t u l l i r i k o k s i a + t u l l i s e l v i t y k s e e n + t u l l i s e l v i t y k s e n + t u l l i s e l v i t y k s i s t ä + t u l l i s e l v i t y s + t u l l i s e l v i t y s j ä r j e s t e l m ä + t u l l i s o p i m u k s e e n + t u l l i s o p i m u k s e n + t u l l i s o p i m u k s e s t a + t u l l i s o p i m u k s e t + t u l l i s o p i m u k s i a + t u l l i s o p i m u s + t u l l i s o p i m u s t a + t u l l i s o t i a + t u l l i s s a + t u l l i s u h t e e t + t u l l i s u o j a + t u l l i s u o j a a + t u l l i s u o j a k y s y m y k s e s t ä + t u l l i s u o j a n + t u l l i s u o j a u s + t u l l i s u o j e l u n + t u l l i s ä ä n n ö s t ö j ä + t u l l i s ä ä n n ö t + t u l l i s ä ä n t e l y ä + t u l l i s ä ä n t ö j e n + t u l l i s ä ä n t ö j ä + t u l l i t + t u l l i t a l o + t u l l i t a p o j e n + t u l l i t a r i f f e i h i n + t u l l i t a r i f f e i s t a + t u l l i t a r i f f e j a + t u l l i t a r i f f i + t u l l i t a r i f f i a + t u l l i t a r i f f i e n + t u l l i t a r i f f i j ä r j e s t e l m ä ä n + t u l l i t a r i f f i n + t u l l i t a r i f f i t + t u l l i t a r i f f i t u l o i h i n + t u l l i t a r j o u k s i s s a + t u l l i t a r k a s t u k s e s t a + t u l l i t a r k a s t u k s e t + t u l l i t a r k a s t u k s i a + t u l l i t a r k a s t u k s i l l a + t u l l i t a r k a s t u k s i s t a + t u l l i t a r k a s t u s t e n + t u l l i t e k n i i k a n + t u l l i t e k n i i k k a + t u l l i t e k n i i k k a a + t u l l i t i e t o j ä r j e s t e l m ä + t u l l i t i e t o j ä r j e s t e l m ä n + t u l l i t i e t o j ä r j e s t e l m ä s t ä + t u l l i t i e t o j ä r j e s t e l m ä t + t u l l i t i e t o j ä r j e s t e l m ä y l e i s s o p i m u s + t u l l i t i e t o j ä r j e s t e l m ä ä + t u l l i t i e t o j ä r j e s t e l m ä ä n + t u l l i t o i m e n p i t e e t + t u l l i t o i m e n p i t e i d e n + t u l l i t o i m e n p i t e i l l ä + t u l l i t o i m i e n + t u l l i t o i m i n n a n + t u l l i t o i m i n n o t + t u l l i t o i m i n t a m m e + t u l l i t o i m i n t o j a + t u l l i t o i m i n t o j e n + t u l l i t o i m i p a i k k o j e n + t u l l i t o i m i p a i k o i s t a + t u l l i t o i m i p a i k o i s t a m m e + t u l l i t o i m i s t a + t u l l i t o i m i s t o n + t u l l i t o n t a + t u l l i t t a + t u l l i t t o m a a n + t u l l i t t o m a l l a + t u l l i t t o m a n + t u l l i t t o m a s t a + t u l l i t t o m a t + t u l l i t t o m i e n + t u l l i t u l o i s t a + t u l l i t u l o i s t a a n + t u l l i t u l o j a + t u l l i t u l o j e n + t u l l i t u l o t + t u l l i t u t k i m u s v i r a s t o n + t u l l i t y ö n t e k i j ö i s t ä + t u l l i u n i o n i + t u l l i u n i o n i a + t u l l i u n i o n i i n + t u l l i u n i o n i k s i + t u l l i u n i o n i n + t u l l i u n i o n i n a + t u l l i u n i o n i s t a + t u l l i v a l v o n n a n + t u l l i v a l v o n n a s s a + t u l l i v a l v o n t a + t u l l i v a l v o n t a a + t u l l i v a l v o n t a m e n e t e l m i e n + t u l l i v a l v o n t a o n g e l m a s t a + t u l l i v a p a a + t u l l i v a p a a n + t u l l i v a p a a n a + t u l l i v a p a a t a + t u l l i v a p a i l l e + t u l l i v a p a i s i i n + t u l l i v a p a u d e n + t u l l i v a p a u d e s t a + t u l l i v a p a u s + t u l l i v a p a u t u k s i a + t u l l i v a p a u t u k s i l l e + t u l l i v e l a n + t u l l i v e l k a a n + t u l l i v e r o a l e n n u k s i a + t u l l i v e r o j e n + t u l l i v e r o t + t u l l i v e r o t u k s e n + t u l l i v i r a n o m a i n e n + t u l l i v i r a n o m a i s e m m e + t u l l i v i r a n o m a i s e t + t u l l i v i r a n o m a i s i a + t u l l i v i r a n o m a i s i i n + t u l l i v i r a n o m a i s i l l a + t u l l i v i r a n o m a i s i l l e + t u l l i v i r a n o m a i s i s t a + t u l l i v i r a n o m a i s t a + t u l l i v i r a n o m a i s t e m m e + t u l l i v i r a n o m a i s t e n + t u l l i v i r a s t o + t u l l i v i r a s t o a + t u l l i v i r a s t o j e n + t u l l i v i r a s t o n + t u l l i v i r a s t o o n + t u l l i v i r a s t o t + t u l l i v i r k a i l i j a + t u l l i v i r k a i l i j a a + t u l l i v i r k a i l i j a n + t u l l i v i r k a i l i j a t + t u l l i v i r k a i l i j o i d e n + t u l l i v i r k a i l i j o i h i n + t u l l i v i r k a i l i j o i l l e + t u l l i v i r k a i l i j o i t a + t u l l i v i r k a m i e h i ä + t u l l i v i r k a m i e s t e n + t u l l i v ä h e n n y s + t u l l i y h t e i s t y ö + t u l l i y h t e i s t y ö l l ä + t u l l i y h t e i s t y ö n + t u l l i y h t e i s t y ö s e k a k o m i t e a + t u l l i y h t e i s t y ö s e k a k o m i t e a n + t u l l i y h t e i s t y ö s o p i m u k s e e n + t u l l i y h t e i s t y ö s o p i m u k s e n + t u l l i y h t e i s t y ö s o p i m u k s i a + t u l l i y h t e i s t y ö s t ä + t u l l i y h t e i s t y ö t ä + t u l l i y k s i k ö i d e m m e + t u l l i y k s i k ö i h i n + t u l l i y m p ä r i s t ö n + t u l l i y m p ä r i s t ö s s ä + t u l l u t + t u l o a + t u l o a a n + t u l o a v u s t u k s i s s a a n + t u l o e n n u s t e i s i i n + t u l o e r o + t u l o e r o a + t u l o e r o i h i n + t u l o e r o i s t a + t u l o e r o j a + t u l o e r o j e n + t u l o e r o n + t u l o e r o t + t u l o h i n n a t + t u l o h i n t a j ä r j e s t e l m ä + t u l o h i n t a j ä r j e s t e l m ä n + t u l o h i n t a j ä r j e s t e l m ä ä + t u l o h i n t a j ä r j e s t e l m ä ä n + t u l o h i n t a j ä r j e s t e l y t + t u l o i h i n + t u l o i s t a + t u l o i s t a a n + t u l o i s t a m m e + t u l o j a + t u l o j e n + t u l o j e n h a n k k i m i s p a l v e l u i s t a + t u l o j e n k e r u u n + t u l o j e n m e n e t y s + t u l o j e n s a + t u l o j ä r j e s t e l m i e n s ä + t u l o j ä r j e s t e l m i ä + t u l o j ä r j e s t e l m ä + t u l o j ä r j e s t e l m ä n + t u l o j ä r j e s t e l m ä s t ä + t u l o j ä r j e s t e l m ä ä + t u l o j ä r j e s t e l m ä ä n + t u l o j ä ä m ä s t ä + t u l o k a s k i i n t i ö + t u l o k a s l a j e j a + t u l o k a s l a j i e n + t u l o k a s l a j i n + t u l o k a s l a j i t + t u l o k a u p u n g i s t a + t u l o k e h i t y s + t u l o k k a i l l a + t u l o k k a i t a + t u l o k o h t a + t u l o k o r v a u s + t u l o k r i i s i n + t u l o k r i t e e r i e n + t u l o k s e e n + t u l o k s e k a s t a + t u l o k s e k k a a m m a n + t u l o k s e k k a a m m i n + t u l o k s e k k a a m p a a + t u l o k s e k k a a m p i + t u l o k s e k k a i m p i a + t u l o k s e k k a i t a + t u l o k s e k s i + t u l o k s e l l i s e m p a a + t u l o k s e l l i s e m p i + t u l o k s e l l i s e m p i a + t u l o k s e l l i s e s t a + t u l o k s e l l i s e t + t u l o k s e l l i s i m p i a + t u l o k s e l l i s t a + t u l o k s e l l i s u u d e s t a + t u l o k s e l l i s u u t t a + t u l o k s e l t a + t u l o k s e m m e + t u l o k s e n + t u l o k s e n a + t u l o k s e n a h a n + t u l o k s e n s a + t u l o k s e n t e k o t a v a t + t u l o k s e s t a + t u l o k s e t + t u l o k s e t t a + t u l o k s e t t o m a k s i + t u l o k s e t t o m i a + t u l o k s e t t o m i k s i + t u l o k s e t t o m i n a + t u l o k s i a + t u l o k s i e n + t u l o k s i i n + t u l o k s i i n k a a n + t u l o k s i l l e + t u l o k s i l t a a n + t u l o k s i n + t u l o k s i s s a + t u l o k s i s t a + t u l o k u i l u + t u l o k y n n y k s e t + t u l o k ö y h y y s + t u l o l a j e j a + t u l o l u o k a n + t u l o l u o k k a a n + t u l o l u o k k i i n + t u l o l ä h d e + t u l o l ä h t e e n + t u l o l ä h t e e n ä + t u l o l ä h t e e t + t u l o l ä h t e i d e n + t u l o l ä h t e i s i i n + t u l o l ä h t e i s t ä + t u l o l ä h t e i t ä + t u l o m a h d o l l i s u u d e t + t u l o m e k a n i s m i s t a + t u l o m e n e t y k s i s t ä + t u l o m u o t o a + t u l o m u o t o i h i n + t u l o m ä ä r ä s t ä + t u l o n + t u l o n a l e n n u k s i n e e n + t u l o n h a n k i n t a a + t u l o n j a k o + t u l o n j a k o a + t u l o n j a k o k y s y m y k s e t + t u l o n j a k o o n + t u l o n j a k o p o l i t i i k a n + t u l o n j a k o p o l i t i i k k a + t u l o n j a k o p o l i t i i k k a a + t u l o n j a k o t o i m e n p i t e i t ä + t u l o n j a k o v a i k u t u k s i a + t u l o n j a o n + t u l o n j a o s s a + t u l o n j a o s t a + t u l o n l a s k u a + t u l o n l i s i e n + t u l o n l i s ä t + t u l o n l i s ä y k s i l l ä + t u l o n l i s ä y s t ä + t u l o n l ä h d e + t u l o n l ä h d e t t ä + t u l o n l ä h t e e k s i + t u l o n l ä h t e e n + t u l o n l ä h t e e n s ä + t u l o n l ä h t e e n ä + t u l o n l ä h t e e t + t u l o n l ä h t e i d e n + t u l o n l ä h t e i s i i n + t u l o n l ä h t e i s t ä + t u l o n l ä h t e i t ä + t u l o n m e n e t y k s e e n + t u l o n m e n e t y k s e l t ä + t u l o n m e n e t y k s e n + t u l o n m e n e t y k s e t + t u l o n m e n e t y k s i i n + t u l o n m e n e t y k s i l t ä + t u l o n m e n e t y k s i n ä + t u l o n m e n e t y k s i s t ä + t u l o n m e n e t y k s i ä + t u l o n m e n e t y s + t u l o n m e n e t y s t e n + t u l o n m e n e t y s t ä + t u l o n o i k a i s u n + t u l o n p a r a n n u k s i a + t u l o n s a + t u l o n s a a n t i o i k e u t t a + t u l o n s i i r r o n + t u l o n s i i r r o s t a + t u l o n s i i r r o t + t u l o n s i i r t o + t u l o n s i i r t o j a + t u l o n s i i r t o j e n + t u l o n s i i r t o j ä r j e s t e l m ä + t u l o n s i i r t o j ä r j e s t e l m ä n + t u l o n s i i r t o k u l u i s t a + t u l o n s i i r t o y h t e i s k u n n a k s i + t u l o n s i i r t o y h t e i s k u n t a + t u l o n t a s a u k s e s t a + t u l o n v ä h e n n y k s i i n + t u l o n v ä h e n n y s + t u l o o n + t u l o p i s t e i s s ä + t u l o p o h j a a + t u l o p o h j a a n + t u l o p o h j a n + t u l o p o l i t i i k a n + t u l o p o l i t i i k a s t a + t u l o p o l i t i i k k a + t u l o p o l i t i i k k a a + t u l o p o l i t i i k k a a n + t u l o p o l i t i i k k a m m e + t u l o p o l i t i i k k o j a + t u l o p o t e n t i a a l i n + t u l o p u o l e e n + t u l o p u o l e e n k i n + t u l o p u o l e l l a + t u l o p u o l e l l a k i n + t u l o p u o l e l l e + t u l o p u o l e n + t u l o p u o l e s t a + t u l o p u o l i + t u l o p u o l t a + t u l o r a j a a + t u l o r a j a k s i + t u l o r a j a s t a + t u l o r a j a t + t u l o r a k e n n e t t a + t u l o r a k e n t e e s t a + t u l o r e i t i l l ä + t u l o r y h m i i n + t u l o s a r v i o i n t i j ä r j e s t e l m ä n + t u l o s h a k u i n e n + t u l o s h a k u i s e e n + t u l o s h a k u i s e m m a k s i + t u l o s h a k u i s e m m a n + t u l o s h a k u i s e m p a a + t u l o s h a k u i s e m p a a n + t u l o s h a k u i s e n + t u l o s h a k u i s e n a + t u l o s h a k u i s e s s a + t u l o s h a k u i s e s t a + t u l o s h a k u i s i a + t u l o s h a k u i s i n a + t u l o s h a k u i s t a + t u l o s h a k u i s u u t t a + t u l o s i d o n n a i s e t + t u l o s i n d i k a a t t o r e i t a + t u l o s i n d i k a a t t o r e i t a a n + t u l o s i n d i k a a t t o r i e n + t u l o s i n d i k a a t t o r i t + t u l o s i s t u n n o i s s a + t u l o s k e s k e i s e e n + t u l o s k e s k e i s e m p ä ä + t u l o s k e s k e i s y y t t ä + t u l o s l a s k e l m a + t u l o s l a s k e l m a s s a + t u l o s l a s k e l m i i n + t u l o s l u e t t e l o n + t u l o s l ä h t ö i s e m p i + t u l o s l ä h t ö i s i i n + t u l o s l ä h t ö i s i ä + t u l o s l ä h t ö i s t ä + t u l o s m e n e t t e l y n + t u l o s o p i m u s + t u l o s p a i n o t t e i s e m m a k s i + t u l o s p a l k k a u s + t u l o s p e r u s t e i s e l l a + t u l o s p e r u s t e i s e t + t u l o s s a + t u l o s s o p i m u s + t u l o s t a u l u + t u l o s t a u l u a l o i t e + t u l o s t a u l u k k o + t u l o s t a u l u k o n + t u l o s t a u l u n + t u l o s t a u l u s t a + t u l o s t a u l u u n + t u l o s t a v o i t e + t u l o s t a v o i t t e e l l i s e e n + t u l o s t a v o i t t e i d e n + t u l o s t a v o i t t e i n e n + t u l o s t a v o i t t e i s i i n + t u l o s t a v o i t t e i t a + t u l o s t e i s t a + t u l o s t e n + t u l o s t i l i n + t u l o s t i n v a l m i s t a j a t + t u l o s t i n v a l m i s t a j i e n + t u l o s v a a t i m u k s i a + t u l o s v a a t i m u k s i l l a + t u l o s v a r a u s t a + t u l o s v a r o i t u s + t u l o s v a s t u u l l i s u u d e n + t u l o s v a s t u u t a + t u l o s y k s i k k ö + t u l o s y k s i k ö i k s i + t u l o t + t u l o t a k u i s t a + t u l o t a k u i t a + t u l o t a k u u + t u l o t a k u u t a + t u l o t a s o + t u l o t a s o a + t u l o t a s o i h i n + t u l o t a s o i s s a + t u l o t a s o j a k o a + t u l o t a s o j e n + t u l o t a s o n + t u l o t a s o n s a + t u l o t a s o o n + t u l o t a s o o n s a + t u l o t a s o s s a + t u l o t a s o s t a + t u l o t a s o s t a a n + t u l o t a s o t + t u l o t i l a n t e e s e e n + t u l o t o p o l o g i a + t u l o t u e l l a + t u l o t u e n + t u l o t u e s t a + t u l o t u e t + t u l o t u i l l a + t u l o t u i s t a + t u l o t u k e a + t u l o t u k e e n + t u l o t u k e n a + t u l o t u k i + t u l o t u k i a + t u l o t u k i a a n + t u l o t u k i e n + t u l o t u k i e n k i n + t u l o t u k i e n s a + t u l o t u k i i n + t u l o t u k i j ä r j e s t e l m ä n + t u l o t u k i j ä r j e s t e l m ä ä + t u l o t u k i j ä r j e s t e l m ä ä n + t u l o t u k i t o i m e n p i t e i d e n + t u l o v a k u u t u k s e n + t u l o v a k u u t u s j ä r j e s t e l m ä ä + t u l o v e r o + t u l o v e r o a + t u l o v e r o a s t e + t u l o v e r o i s t a + t u l o v e r o j a + t u l o v e r o j e n + t u l o v e r o k a n n a n + t u l o v e r o k a n t a a + t u l o v e r o l a i n s ä ä d ä n n ö n + t u l o v e r o l l a + t u l o v e r o m m e + t u l o v e r o n + t u l o v e r o s t a + t u l o v e r o t + t u l o v e r o t u k s e n + t u l o v e r o t u k s e s s a + t u l o v e r o t u k s e s t a + t u l o v e r o t u s + t u l o v e r o t u s t a + t u l o v e r o v ä h e n n y k s i ä + t u l o v i i s u m i t + t u l o v i r r a n + t u l o v i r r a t + t u l o v i r t a + t u l o v i r t a a n + t u l p p a a n i m a n i a + t u l p p a a n i v a l l a n k u m o u k s e n + t u l p p a a n i v a l l a n k u m o u k s e s s a + t u l p p a a n i v a l l a n k u m o u s + t u l t a + t u l t a v a + t u l t i i n + t u l t u + t u l t u a + t u l t u a n i + t u l v a a + t u l v a d i r e k t i i v i + t u l v a d i r e k t i i v i n + t u l v a d i r e k t i i v i ä + t u l v a e n n u s t e i t a + t u l v a f o o r u m i i n + t u l v a g e o l o g i a + t u l v a h a l l i n n a s t a + t u l v a k a r t o i t u k s e n + t u l v a k a r t t o j a + t u l v a k a t a s t r o f e i h i n + t u l v a k a t a s t r o f e i l l e + t u l v a k a t a s t r o f i + t u l v a k a t a s t r o f i e n + t u l v a k a t a s t r o f i l l a + t u l v a k a t a s t r o f i n + t u l v a k a t a s t r o f i s s a + t u l v a k a t a s t r o f i s t a + t u l v a k a t a s t r o f i t + t u l v a k y s y m y k s e e n n e + t u l v a l l e + t u l v a m e t s ä t + t u l v a m ä ä r i t e l m ä n + t u l v a n h a l l i n n a n + t u l v a n h a l l i n t a t o i m e n p i t e i s t ä + t u l v a n i i t t y j e n + t u l v a n k e s t ä v y y t t ä + t u l v a n t o r j u n t a + t u l v a n t o r j u n t a a n + t u l v a n t o r j u n t a i n f r a s t r u k t u u r i e n + t u l v a n t o r j u n t a j ä r j e s t e l m ä n + t u l v a n t o r j u n t a m e n e t e l m i i n + t u l v a n t o r j u n t a r a k e n t e i s i i n + t u l v a n t o r j u n t a s u u n n i t e l m i s s a + t u l v a n t o r j u n t a t o i m e n p i t e i t ä + t u l v a o h j e l m a k s i + t u l v a o n g e l m a a n + t u l v a o n g e l m a n + t u l v a o n g e l m i a + t u l v a o n n e t t o m u u k s i a + t u l v a o n n e t t o m u u k s i e n + t u l v a p a t o + t u l v a p e l l o i l l a + t u l v a r i s k e i l t ä + t u l v a r i s k i + t u l v a r i s k i a l u e i d e n + t u l v a r i s k i d i r e k t i i v i + t u l v a r i s k i d i r e k t i i v i n + t u l v a r i s k i e n + t u l v a r i s k i k a r t a t + t u l v a r i s k i k a r t t o j a + t u l v a r i s k i l l e + t u l v a r i s k i n + t u l v a r i s k i n h a l l i n n a n + t u l v a r i s k i n h a l l i n n a s s a + t u l v a r i s k i n h a l l i n t a a + t u l v a r i s k i ä + t u l v a s t a + t u l v a s u o j a + t u l v a s u o j e l u + t u l v a s u o j e l u a + t u l v a s u o j e l u n + t u l v a s u o j e l u s s a + t u l v a s u o j e l u s t r a t e g i a a m m e + t u l v a s u o j e l u t a v o i t t e e t + t u l v a s u o j e l u t o i m e n p i t e i t ä + t u l v a s u o j i a + t u l v a s u o j i e n + t u l v a t + t u l v a t a s a n g o i l l a + t u l v a t a s a n g o n + t u l v a t a s a n k o j a + t u l v a t a s a n k o j e n + t u l v a t a s a n t e i l l a + t u l v a t a s a n t e i l l e + t u l v a t i l a n n e t t a + t u l v a t i l a n t e i s s a + t u l v a t u e n + t u l v a t u h o i s t a + t u l v a t u h o j e n + t u l v a u h k a n + t u l v a u h r i e n + t u l v a v a a r a + t u l v a v a h i n g o i s t a + t u l v a v a h i n g o n + t u l v a v a h i n g o t + t u l v a v a h i n k o j a + t u l v a v a h i n k o j e n + t u l v a v a l l e j a + t u l v a v e d e n + t u l v a v e d e t + t u l v a v e s i v i e m ä r i t + t u l v a v e t t ä + t u l v i a + t u l v i e n + t u l v i i n + t u l v i l l e + t u l v i l t a + t u l v i n a + t u l v i s t a + t u m a h u o k o n e n + t u m a k o t e l o + t u m a l e v y + t u m a n + t u m a n s i i r r o l l a + t u m a n s i i r t o o n + t u m m a i h o i s e t + t u m m a i h o i s i a + t u m m a i h o i s i l t a + t u m m a i h o i s t a + t u m m a n h a r m a i s t a + t u m m a r a i t a k e r t t u + t u m m a r a u n i o i n e n + t u m m a r u s o k k i + t u m m e n n e t u t + t u m m i s t a + t u n d r a h a n h i + t u n d r a h o p e a t ä p l ä + t u n d r a k i i l t o k o r e n t o + t u n d r a k i r v i n e n + t u n d r a k u i k k a + t u n d r a k u r m i t s a + t u n d r a p a j u + t u n d r a p ä ä s t ä i n e n + t u n d r a r a s t a s + t u n d r a s i n i s i i p i + t u n d r a s i r r i + t u n d r a s u s i + t u n d r a u r p i a i n e n + t u n g e t t e l u a + t u n g u u s i k i e l e t + t u n i s i a l a i s e t + t u n i s i a l a i s i a + t u n i s i a l a i s i s t a + t u n i s i a l a i s p a k o l a i s t e n + t u n i s i a l a i s t e n + t u n i s i a l a i s v a l t u u s k u n n a n + t u n k e u d u t t a v a + t u n k e u t u a + t u n k e u t u n u t + t u n k e u t u v a t + t u n k i o l i e r o + t u n k i o l l a + t u n k i o l l e + t u n n e a r v o a + t u n n e h y ö k y + t u n n e i l m a p i i r i n + t u n n e k u o h u a + t u n n e k u o h u j a + t u n n e k u o h u n + t u n n e k y s y m y s + t u n n e l a t a u s t a + t u n n e l a t a u t u n u t t a + t u n n e l e i d e n + t u n n e l e i t a + t u n n e l i a + t u n n e l i e n + t u n n e l i h a n k e + t u n n e l i h a n k k e e n s a + t u n n e l i h a n k k e e s e e n + t u n n e l i h a n k k e e s t a + t u n n e l i j ä r j e s t e l m ä n + t u n n e l i k o m p l e k s i n + t u n n e l i l i i k e n t e e n + t u n n e l i n + t u n n e l i n r a k e n n u s k o n e + t u n n e l i o n n e t t o m u u k s i e n + t u n n e l i p a l o + t u n n e l i p r o j e k t i a + t u n n e l i r o t t a + t u n n e l i s a m m a k k o + t u n n e l i s s a + t u n n e l i s t a + t u n n e l i s t a a n + t u n n e l i t y ö n + t u n n e l i v a i h t o e h t o + t u n n e l i y h t e y s + t u n n e l i y h t e y t t ä + t u n n e l m a a n + t u n n e l m a m u s i i k i s t a + t u n n e l m a n + t u n n e l m i s s a + t u n n e l o i n t i m i k r o s k o o p p i + t u n n e m m e + t u n n e n + t u n n e n k o + t u n n e p i t o i n e n + t u n n e p i t o i s e s t i + t u n n e p i t o i s i a + t u n n e p i t o i s t a + t u n n e p u o l e s t a + t u n n e r e a k t i o + t u n n e r e a k t i o i t a + t u n n e r e a k t i o n + t u n n e r e a k t i o n a + t u n n e r e a k t i o s t a + t u n n e s e i k o i s t a + t u n n e s i t e e n + t u n n e s i t e i d e n + t u n n e s i t e i k s i + t u n n e s i t e i s t ä + t u n n e t a + t u n n e t a a n + t u n n e t a s o l l a + t u n n e t a s o l l e + t u n n e t e k i j ö i d e n + t u n n e t t a + t u n n e t t a m m e + t u n n e t t a v a + t u n n e t t e + t u n n e t t e k o + t u n n e t t i i n + t u n n e t t u a + t u n n e t t u i h i n + t u n n e t t u j a + t u n n e t t u j e n + t u n n e t t u n a + t u n n e t t u u n + t u n n e t u i k s i + t u n n e t u i l l a + t u n n e t u i m m a s s a + t u n n e t u i m m a t + t u n n e t u i m m i s t a + t u n n e t u i m p i a + t u n n e t u i n + t u n n e t u i s s a + t u n n e t u i s t a + t u n n e t u k s i + t u n n e t u m m a k s i + t u n n e t u m m i k s i + t u n n e t u m p a a n + t u n n e t u m p i + t u n n e t u m p i a + t u n n e t u m p i i n + t u n n e t u n + t u n n e t u s s a + t u n n e t u t + t u n n e y m p ä r i s t ö + t u n n e ä l y + t u n n i l l a + t u n n i l t a + t u n n i n + t u n n i s s a + t u n n i s t a a + t u n n i s t a a k o + t u n n i s t a a k s e e n + t u n n i s t a m a a n + t u n n i s t a m a l l a + t u n n i s t a m a t t o m i e n + t u n n i s t a m i s a s e t u k s e t + t u n n i s t a m i s a s i a k i r j a t + t u n n i s t a m i s a s i a k i r j o i h i n + t u n n i s t a m i s e k s i + t u n n i s t a m i s e n + t u n n i s t a m i s j ä r j e s t e l m ä + t u n n i s t a m i s j ä r j e s t e l m ä s t ä + t u n n i s t a m i s m e r k i n n ä t + t u n n i s t a m i s m e r k i n n ö i s t ä + t u n n i s t a m i s p a k o n + t u n n i s t a m i s p r o s e s s i n + t u n n i s t a m i s t a + t u n n i s t a m i s y h t e i s t y ö n + t u n n i s t a n + t u n n i s t a t t e + t u n n i s t e i d e n + t u n n i s t e i s i i n + t u n n i s t e j ä r j e s t e l m i i n + t u n n i s t e j ä r j e s t e l m ä n + t u n n i s t e n u m e r o + t u n n i s t e n u m e r o a + t u n n i s t e n u m e r o n + t u n n i s t e n u m e r o t + t u n n i s t e o m i n a i s u u s + t u n n i s t e t a a n + t u n n i s t e t e k n i i k a s t a + t u n n i s t e t t a v i s s a + t u n n i s t e t t i i n + t u n n i s t e t t u + t u n n i s t u s a s i a k i r j a t + t u n n i s t u s j ä r j e s t e l m i s t ä + t u n n i s t u s j ä r j e s t e l m i ä + t u n n i s t u s j ä r j e s t e l m ä + t u n n i s t u s j ä r j e s t e l m ä n + t u n n i s t u s j ä r j e s t e l m ä s s ä + t u n n i s t u s j ä r j e s t e l m ä s t ä + t u n n i s t u s j ä r j e s t e l m ä t + t u n n i s t u s j ä r j e s t e l m ä ä + t u n n i s t u s j ä r j e s t e l m ä ä n + t u n n i s t u s k e s k u k s i a + t u n n i s t u s k o o d i + t u n n i s t u s k o r t i t + t u n n i s t u s m a t k a a + t u n n i s t u s m e n e t e l m i e n + t u n n i s t u s m e n e t e l m ä + t u n n i s t u s m e n e t e l m ä s t ä + t u n n i s t u s m e n e t t e l y + t u n n i s t u s m e r k i n n ä t + t u n n i s t u s m e r k i n t ä ä + t u n n i s t u s m e r k i n t ä ä n + t u n n i s t u s m e r k i n t ö j ä + t u n n i s t u s m e r k k e j ä + t u n n i s t u s m e r k k i + t u n n i s t u s n u m e r o t + t u n n i s t u s p a l v e l u n + t u n n i s t u s p r o s e s s e j a + t u n n i s t u s p r o s e s s i s s a + t u n n i s t u s r e k i s t e r i ä + t u n n i s t u s t e k n i i k o i d e n + t u n n i s t u s t o i m e n p i t e e t + t u n n o l l i s e m m i n + t u n n o l l i s e m p i a + t u n n o l l i s i m m i n + t u n n o n t a r k a s t i + t u n n o n t u s k i a + t u n n o n t u s k i t t a + t u n n u k s e e n + t u n n u k s e t + t u n n u k s i a + t u n n u m m e + t u n n u s k u v a l l i s e k s i + t u n n u s k u v i e n + t u n n u s l e v y + t u n n u s m e r k e i s t ä + t u n n u s m e r k e i s t ä m m e + t u n n u s m e r k i l l i s e m p ä ä + t u n n u s m e r k i n + t u n n u s m e r k i n n ä l l ä + t u n n u s m e r k i s t ä + t u n n u s m e r k i s t ö i h i n + t u n n u s m e r k i s t ö n + t u n n u s m e r k k e i n ä ä n + t u n n u s m e r k k e j ä + t u n n u s m e r k k i + t u n n u s m e r k k i e n + t u n n u s m e r k k i n ä + t u n n u s m e r k k i ä + t u n n u s n u m e r o + t u n n u s n u m e r o n + t u n n u s o m a i s t a + t u n n u s p i i r r e + t u n n u s p i i r t e e t + t u n n u s p o l i t i i k k a + t u n n u s r a i t a y ö k k ö n e n + t u n n u s s a n o j a + t u n n u s t a a + t u n n u s t a e n + t u n n u s t a e s s a a n + t u n n u s t a i s i + t u n n u s t a k a a + t u n n u s t a k a a m m e + t u n n u s t a m a a n + t u n n u s t a m a s s a + t u n n u s t a m a s t a + t u n n u s t a m a t t a + t u n n u s t a m i e n + t u n n u s t a m i s d i r e k t i i v i + t u n n u s t a m i s d i r e k t i i v i e n + t u n n u s t a m i s d i r e k t i i v i s s ä + t u n n u s t a m i s e e n + t u n n u s t a m i s e k s i + t u n n u s t a m i s e l l e + t u n n u s t a m i s e n + t u n n u s t a m i s e s s a + t u n n u s t a m i s e s t a + t u n n u s t a m i s j ä r j e s t e l m i e n + t u n n u s t a m i s j ä r j e s t e l m ä + t u n n u s t a m i s j ä r j e s t e l m ä l l e + t u n n u s t a m i s j ä r j e s t e l m ä l l ä + t u n n u s t a m i s j ä r j e s t e l m ä n + t u n n u s t a m i s k y s y m y k s e s s ä + t u n n u s t a m i s m e k a n i s m i i n + t u n n u s t a m i s m e n e t t e l y + t u n n u s t a m i s m e n e t t e l y i l l e + t u n n u s t a m i s m e n e t t e l y j e n + t u n n u s t a m i s m e n e t t e l y j ä + t u n n u s t a m i s m e n e t t e l y n + t u n n u s t a m i s m e n e t t e l y s s ä + t u n n u s t a m i s m e n e t t e l y ä + t u n n u s t a m i s m u o d o n + t u n n u s t a m i s p r o s e s s i i n + t u n n u s t a m i s p y r k i m y k s e t + t u n n u s t a m i s p y y n t ö m e n e t t e l y l l ä + t u n n u s t a m i s s o p i m u k s e s t a + t u n n u s t a m i s s o p i m u k s i a + t u n n u s t a m i s t a + t u n n u s t a m m e + t u n n u s t a m m e k i n + t u n n u s t a m m e k o + t u n n u s t a n + t u n n u s t a n e e t + t u n n u s t a n u t + t u n n u s t a t t e + t u n n u s t a v a n s a + t u n n u s t a v a t + t u n n u s t e l e v i a + t u n n u s t e l e v i s t a + t u n n u s t e l k a a m m e + t u n n u s t e t a + t u n n u s t e t a a n + t u n n u s t e t a a n k i n + t u n n u s t e t t a i s i + t u n n u s t e t t a i s i i n + t u n n u s t e t t a k o o n + t u n n u s t e t t a v a + t u n n u s t e t t i i n + t u n n u s t e t t u a + t u n n u s t e t t u j e n + t u n n u s t e t u i k s i + t u n n u s t e t u k s i + t u n n u s t e t u t + t u n n u s t i + t u n n u s t i m m e + t u n n u s t i t t e + t u n n u s t i v a t + t u n n u s t u k s e l l i s t e n + t u n n u s t u k s e m m e + t u n n u s t u k s e n + t u n n u s t u k s e n i + t u n n u s t u k s e s t a + t u n n u s t u k s i a + t u n n u s t u s j ä r j e s t e l m ä + t u n n u s t u s j ä r j e s t e l m ä n + t u n n u s t u s k i r j a t + t u n n u s t u s k i r k k o + t u n n u s t u s l a u s e k e + t u n n u s t u s m e n e t t e l y i s s ä + t u n n u s t u s m e n e t t e l y ä + t u n n u s t u s p a l k i n n o n + t u n n u s t u s p r o s e s s i n + t u n n u s t u s t a + t u n n u s t u s t o i m e n p i t e i t ä + t u n n u t a a n + t u n s i + t u n s i v a t + t u n t e a + t u n t e e + t u n t e e l l a + t u n t e e l l i s i s t a + t u n t e e n + t u n t e e n i + t u n t e e n p u r k a u k s e s t a + t u n t e e s e e n + t u n t e e t + t u n t e e t t o m i a + t u n t e e t t o m i e n + t u n t e i d e n + t u n t e i l e m a t t a + t u n t e i n a + t u n t e i s t a + t u n t e i t a + t u n t e j a + t u n t e m a a n + t u n t e m a l l a n i + t u n t e m a l l a n n e + t u n t e m a m m e + t u n t e m a s s a + t u n t e m a s t a + t u n t e m a t t a + t u n t e m a t t o m a a n + t u n t e m a t t o m a k s i + t u n t e m a t t o m a l l a + t u n t e m a t t o m a t + t u n t e m a t t o m i a + t u n t e m a t t o m i e n + t u n t e m a t t o m i k s i + t u n t e m a t t o m i l l a + t u n t e m i a + t u n t e m i s e k s i + t u n t e m i s e s t a + t u n t e m u k s e t + t u n t e m u k s i a + t u n t e m u s t a + t u n t e v a t + t u n t i a + t u n t i a k a a n + t u n t i e n + t u n t i e n s a + t u n t i h i n n a t + t u n t i i n + t u n t i k a u s i k s i + t u n t i m ä ä r ä + t u n t i m ä ä r ä n + t u n t i p a l k a l l a + t u n t i p a l k a s t a + t u n t i p a l k k o j a + t u n t i r a j a + t u n t i s i + t u n t i s i a + t u n t i s i v a t + t u n t i s t a + t u n t i v a u h d i l l a + t u n t i v o i t t o j a + t u n t o a i s t i + t u n t o e l i n t e n + t u n t o k a s v i + t u n t o m e r k k i + t u n t u a + t u n t u i + t u n t u i k o + t u n t u n e e t + t u n t u n u t t a + t u n t u r i a l u e e t + t u n t u r i h a a r i k k o + t u n t u r i h i i r e n p o r r a s + t u n t u r i h o p e a t ä p l ä + t u n t u r i h ä r k k i + t u n t u r i k a t k e r o + t u n t u r i k e h r ä ä j ä + t u n t u r i k e l t a p e r h o n e n + t u n t u r i k i h u + t u n t u r i k i r j o s i i p i + t u n t u r i k i s s a n k ä p ä l ä + t u n t u r i k i u r u + t u n t u r i k i v i y r t t i + t u n t u r i k o h o k k i + t u n t u r i k u r j e n h e r n e + t u n t u r i k y n s i m ö + t u n t u r i k y y h k y j e n + t u n t u r i k y y h k y n + t u n t u r i k ä r p ä s s i e n i + t u n t u r i l i e k o + t u n t u r i m i t t a r i + t u n t u r i n u r m i k k a + t u n t u r i p a j u + t u n t u r i p i k k u m i t t a r i + t u n t u r i p o i m u l e h t i + t u n t u r i p u n a t ä p l ä + t u n t u r i p ö l l ö + t u n t u r i r i k k o + t u n t u r i s o p u l i + t u n t u r i u n i k k o + t u n t u r i ä n g e l m ä + t u n t u u + t u n t u u k i n + t u n t u v a a + t u n t u v a m p a a + t u n t u v a m p i + t u n t u v a m p i a + t u n t u v a n + t u n t u v a s t a + t u n t u v a s t i k i n + t u n t u v a t + t u n t u v i a + t u n t u v i l l a + t u o d a + t u o d a a n + t u o d a k s e e n + t u o d a k s e m m e + t u o d a k s e n i + t u o d e n + t u o d e s s a m m e + t u o h i k i r j e + t u o h i t u o m i + t u o j a j ä s e n v a l t i o + t u o j a j ä s e n v a l t i o n + t u o j a m a a l l e + t u o j a m a a n + t u o j a m a a s s a + t u o j a m a a t + t u o j a m a i d e n + t u o j a m a i h i n + t u o j a m a i s s a + t u o j a v a l t i o + t u o j a v a l t i o n + t u o k a a + t u o k a a m m e + t u o k i n + t u o k o + t u o k s i n a s t a + t u o k s u a m p i a i s y r t t i + t u o k s u h e r k k y y s + t u o k s u i n k i v ä ä r i + t u o k s u k i d u s r u o h o + t u o k s u k i r k i r u o h o + t u o k s u l u p i i n i l l a + t u o k s u l u p i i n i t + t u o k s u m a t a r a + t u o k s u o r a k a s + t u o k s u o r v o k k i + t u o k s u p a s u u n a + t u o k s u r e s e d a + t u o k s u t r a a k k i p u u + t u o k s u v a h a k a s + t u o k s u v a t u k k a + t u o l i a + t u o l i l e i k k i + t u o l l a i s t a + t u o l l e + t u o l l o i n k i n + t u o m a a n + t u o m a r e i d e n + t u o m a r e i h i n + t u o m a r e i l l a + t u o m a r e i l l e + t u o m a r e i n a + t u o m a r e i t a + t u o m a r i e n + t u o m a r i j o u k k o + t u o m a r i n a + t u o m a r i n e u v o s t o a + t u o m a r i n e u v o s t o n + t u o m a r i n e u v o s t o s t a + t u o m a r i n y m p y r ä + t u o m a r i r y h m ä + t u o m a r i t + t u o m a r i v a l v o n t a a + t u o m a s k r i s t i t y t + t u o m a s s a + t u o m a s t a + t u o m a t + t u o m a t t a + t u o m e n k e h r ä ä j ä k o i + t u o m i a + t u o m i l u d e + t u o m i n n e e t + t u o m i n n u t + t u o m i o e l i m e n + t u o m i o i d e n + t u o m i o i h i n + t u o m i o i l l a + t u o m i o i l t a + t u o m i o i s s a + t u o m i o i s s a a n + t u o m i o i s t a + t u o m i o i s t u i m e e n + t u o m i o i s t u i m e l l a + t u o m i o i s t u i m e l l e + t u o m i o i s t u i m e l t a + t u o m i o i s t u i m e m m e + t u o m i o i s t u i m e n + t u o m i o i s t u i m e n a + t u o m i o i s t u i m e s s a + t u o m i o i s t u i m e s t a + t u o m i o i s t u i m e t + t u o m i o i s t u i m i a + t u o m i o i s t u i m i e n + t u o m i o i s t u i m i i n + t u o m i o i s t u i m i l l a + t u o m i o i s t u i m i l l e + t u o m i o i s t u i m i s s a + t u o m i o i s t u i m i s t a + t u o m i o i s t u i n + t u o m i o i s t u i n a s i a s s a + t u o m i o i s t u i n j ä r j e s t e l m i e n + t u o m i o i s t u i n j ä r j e s t e l m ä + t u o m i o i s t u i n j ä r j e s t e l m ä n + t u o m i o i s t u i n j ä r j e s t e l m ä s s ä + t u o m i o i s t u i n j ä r j e s t e l m ä s t ä + t u o m i o i s t u i n j ä r j e s t e l m ä t + t u o m i o i s t u i n j ä r j e s t e l m ä ä + t u o m i o i s t u i n j ä r j e s t e l m ä ä n + t u o m i o i s t u i n k i n + t u o m i o i s t u i n k y s y m y k s e e n + t u o m i o i s t u i n k ä s i t t e l y + t u o m i o i s t u i n k ä s i t t e l y i h i n + t u o m i o i s t u i n k ä s i t t e l y j e n + t u o m i o i s t u i n k ä s i t t e l y j ä + t u o m i o i s t u i n k ä s i t t e l y n + t u o m i o i s t u i n k ä s i t t e l y s s ä + t u o m i o i s t u i n k ä s i t t e l y t + t u o m i o i s t u i n k ä s i t t e l y y n + t u o m i o i s t u i n k ä s i t t e l y ä + t u o m i o i s t u i n m a k s u t + t u o m i o i s t u i n m e n e t t e l y i h i n + t u o m i o i s t u i n m e n e t t e l y i s s ä + t u o m i o i s t u i n m e n e t t e l y j e n + t u o m i o i s t u i n m e n e t t e l y j ä + t u o m i o i s t u i n m e n e t t e l y n + t u o m i o i s t u i n m e n e t t e l y s s ä + t u o m i o i s t u i n m e n e t t e l y s t ä + t u o m i o i s t u i n m e n e t t e l y t + t u o m i o i s t u i n m e n e t t e l y ä + t u o m i o i s t u i n p o l i t i i k k a + t u o m i o i s t u i n p ä ä l u o k k a + t u o m i o i s t u i n p ä ä t ö k s i ä + t u o m i o i s t u i n p ä ä t ö s t e n + t u o m i o i s t u i n r a k e n t e i d e n + t u o m i o i s t u i n r y h m ä s s ä + t u o m i o i s t u i n t a + t u o m i o i s t u i n t a p a u s + t u o m i o i s t u i n t e n + t u o m i o i s t u i n t y ö s k e n t e l y l l e + t u o m i o i s t u i n v a l t i o n + t u o m i o i s t u i n v a l v o n n a n + t u o m i o i s t u i n v a l v o n n a s t a + t u o m i o i s t u i n v a l v o n t a a + t u o m i o i s t u i n v a l v o n t a a n + t u o m i o i s t u i n v i r a n o m a i s t e n + t u o m i o i t a + t u o m i o j a n + t u o m i o j ä s e n v a l t i o n + t u o m i o k a p i t u l i + t u o m i o l l a + t u o m i o l l e + t u o m i o n + t u o m i o n s a + t u o m i o o n + t u o m i o p ä i v ä + t u o m i o p ä i v ä k s i + t u o m i o r e k i s t e r i n + t u o m i o s s a + t u o m i o s t a + t u o m i o s t a a n + t u o m i o s u n n u n t a i + t u o m i o t + t u o m i o t a + t u o m i o t a a n + t u o m i o v a l l a l l a + t u o m i o v a l l a n + t u o m i o v a l l a s s a a n + t u o m i o v a l l a s t a + t u o m i o v a l l a s t a a n + t u o m i o v a l t a + t u o m i o v a l t a a + t u o m i o v a l t a a n + t u o m i o v a l t a n s a + t u o m i o v i r h e + t u o m i o v i r h e i s t ä + t u o m i o v u o r i + t u o m i s e k s i + t u o m i s t a + t u o m i t a + t u o m i t a a n + t u o m i t a k s e e n + t u o m i t a k s e m m e + t u o m i t a k s e n i + t u o m i t k a a m m e + t u o m i t s e e + t u o m i t s e m a a n + t u o m i t s e m a l l a + t u o m i t s e m a s s a + t u o m i t s e m a s t a + t u o m i t s e m a t t a + t u o m i t s e m i s e e n + t u o m i t s e m i s e n + t u o m i t s e m i s e s t a + t u o m i t s e m i s m e n e t t e l y ä + t u o m i t s e m m e + t u o m i t s e m m e k o + t u o m i t s e n + t u o m i t s e n k i n + t u o m i t s e t t e + t u o m i t s e v a n + t u o m i t s e v a n i + t u o m i t s e v a n s a + t u o m i t s e v a t + t u o m i t s e v i a + t u o m i t s e v i e n + t u o m i t s i + t u o m i t s i s i m m e k i n + t u o m i t s i v a t + t u o m i t t a i s i i n + t u o m i t t a v a a + t u o m i t t a v a a n + t u o m i t t a v a l l a + t u o m i t t a v a l t a + t u o m i t t a v a m p a a + t u o m i t t a v a m p i + t u o m i t t a v a m p i a + t u o m i t t a v a m p i i n + t u o m i t t a v a s t i + t u o m i t t a v i a + t u o m i t t a v i m m i s s a + t u o m i t t i i n + t u o m i t t u j a + t u o m i t t u j e n + t u o m i t t u k i n + t u o m i t u i s t a + t u o m i t u k s i + t u o m i t u l l a + t u o m i t u l t a + t u o m i t u n + t u o m i t u t + t u o m m e + t u o n e e t + t u o n e n k i e l o + t u o n e n s i i p i + t u o n k a l t a i s i a + t u o n n e m p a n a k i n + t u o n n i l l a + t u o n n i l t a + t u o n n i n + t u o n n i s s a + t u o n n i s t a + t u o n n i s t a m m e + t u o n t i a + t u o n t i a j o n e u v o n + t u o n t i a r t i k k e l i s t a + t u o n t i a r v o a + t u o n t i a s i a a + t u o n t i a u t o j e n + t u o n t i e h d o t + t u o n t i e l i n t a r v i k k e e t + t u o n t i e l i n t a r v i k k e i d e n + t u o n t i e l i n t a r v i k k e i s i i n + t u o n t i e l i n t a r v i k k e i s t a + t u o n t i e l i n t a r v i k k e i t a + t u o n t i e l ä i m i l l e + t u o n t i e l ä i m i ä + t u o n t i e l ä i n t e n + t u o n t i e n e r g i a a + t u o n t i e n e r g i a l l a + t u o n t i e n e r g i a n + t u o n t i e n e r g i a r i i p p u v u u s + t u o n t i e n e r g i a s t a + t u o n t i e n e r g i o i s s a + t u o n t i e s t e e t + t u o n t i h i i l e l l ä + t u o n t i h i i l e n + t u o n t i h i i l i + t u o n t i h i i l t ä + t u o n t i h i n n a s t a + t u o n t i h i n n a t + t u o n t i h i n n o i s t a + t u o n t i h i n t a + t u o n t i h i n t o j e n + t u o n t i h u n a j a a + t u o n t i h u n a j a a n + t u o n t i h u n a j a n + t u o n t i h u n a j a s t a + t u o n t i h y ö d y k k e i d e n + t u o n t i h ä r ä n l i h a n + t u o n t i i n + t u o n t i j a l k i n e i d e n + t u o n t i j a l k i n e i t a + t u o n t i j ä r j e s t e l m i e n + t u o n t i j ä r j e s t e l m ä + t u o n t i j ä r j e s t e l m ä n + t u o n t i j ä r j e s t e l m ä n s ä + t u o n t i j ä r j e s t e l m ä s t ä + t u o n t i j ä r j e s t e l m ä ä + t u o n t i j ä r j e s t e l m ä ä n + t u o n t i j ä r j e s t e l m ä ä n s ä + t u o n t i j ä r j e s t e l y + t u o n t i j ä r j e s t e l y j ä + t u o n t i j ä r j e s t e l y n + t u o n t i j ä r j e s t e l y t + t u o n t i j ä r j e s t ö t + t u o n t i k a a s u a + t u o n t i k a a s u n + t u o n t i k a a s u s t a + t u o n t i k a l a + t u o n t i k a l a s t a + t u o n t i k a m p a n j a a + t u o n t i k a m p a n j a a n + t u o n t i k a n a n m u n a t + t u o n t i k a n a s t a + t u o n t i k a n a v i a + t u o n t i k a p a s i t e e t t i a + t u o n t i k i e l l o i l l e + t u o n t i k i e l l o n + t u o n t i k i e l l o s s a + t u o n t i k i e l l o s t a + t u o n t i k i e l l o t + t u o n t i k i e l t o + t u o n t i k i e l t o a + t u o n t i k i e l t o i h i n + t u o n t i k i e l t o j a + t u o n t i k i e l t o n s a + t u o n t i k i e l t o o n + t u o n t i k i i n t i ö + t u o n t i k i i n t i ö i d e n + t u o n t i k i i n t i ö i h i n + t u o n t i k i i n t i ö i s t ä + t u o n t i k i i n t i ö i t ä + t u o n t i k i i n t i ö j ä r j e s t e l m ä n + t u o n t i k i i n t i ö m e n e t t e l y n + t u o n t i k i i n t i ö m e n e t t e l y ä + t u o n t i k i i n t i ö t + t u o n t i k i i n t i ö t o i m e t + t u o n t i k i i n t i ö ö n + t u o n t i k i l p a i l u n + t u o n t i k l e m e n t i i n e i h i n + t u o n t i k u m p p a n i + t u o n t i k y s y m y s t ä + t u o n t i l a a d u i l l a + t u o n t i l a s k u j a + t u o n t i l a u s e k e t t a + t u o n t i l e l u j e n + t u o n t i l e l u t + t u o n t i l i h a + t u o n t i l i h a a + t u o n t i l i h a a n + t u o n t i l i h a l l e + t u o n t i l i h a n + t u o n t i l i h a s t a + t u o n t i l i s e n s s e i h i n + t u o n t i l i s e n s s e i s t ä + t u o n t i l i s e n s s i + t u o n t i l i s e n s s i j ä r j e s t e l m ä + t u o n t i l i s e n s s i j ä r j e s t e l m ä n + t u o n t i l i s e n s s i t + t u o n t i l u p a + t u o n t i l u p a a + t u o n t i l u p a j ä r j e s t e l m ä ä + t u o n t i l u p a j ä r j e s t e l m ä ä n + t u o n t i l u p i a + t u o n t i l u p i e n + t u o n t i l u v a n + t u o n t i l u v a t + t u o n t i l u v i s t a + t u o n t i l ä h d e + t u o n t i l ä h t e i d e n + t u o n t i m a a + t u o n t i m a a n + t u o n t i m a a t + t u o n t i m a a t a + t u o n t i m a h d o l l i s u u k s i a + t u o n t i m a i d e n + t u o n t i m a k s u + t u o n t i m a k s u i h i n + t u o n t i m a k s u i s t a + t u o n t i m a k s u t + t u o n t i m a l l e j a + t u o n t i m a r k k i n a t + t u o n t i m a r k k i n o i h i n + t u o n t i m a r k k i n o i l l e + t u o n t i m a r k k i n o i t a m m e + t u o n t i m e n e t t e l y i h i n + t u o n t i m m e + t u o n t i m u n i l l e + t u o n t i m ä ä r i e n + t u o n t i m ä ä r i i n + t u o n t i m ä ä r i ä + t u o n t i m ä ä r ä t + t u o n t i m ä ä r ä y k s i i m m e + t u o n t i o i k e u k s i e n + t u o n t i o i k e u t t a a n + t u o n t i p a i n e i d e n + t u o n t i p a i n e i t a + t u o n t i p e t o k s i l l e + t u o n t i p e t o s t e n + t u o n t i p i s t e e s e e n + t u o n t i p o l i t i i k a s t a + t u o n t i p o l i t i i k k a + t u o n t i p o l t t o a i n e e s t a + t u o n t i p o l t t o a i n e i s t a + t u o n t i p o l t t o a i n e r i i p p u v u u t t a m m e + t u o n t i p u o l e l l a + t u o n t i p u u v i l l a n + t u o n t i r a j o i t u k s e t + t u o n t i r a j o i t u k s i a + t u o n t i r a j o i t u k s i l l e + t u o n t i r a j o i t u k s i s s a + t u o n t i r a j o i t u k s i s t a + t u o n t i r a j o i t u s t e n + t u o n t i r e h u a + t u o n t i r e h u i h i n + t u o n t i r e h u i s s a + t u o n t i r e h u n + t u o n t i r e h u s s a + t u o n t i r e h u s t a + t u o n t i r e h u u n + t u o n t i r i i p p u m a t t o m u u d e n + t u o n t i r i i p p u v u u d e n + t u o n t i r i i p p u v u u d e s t a + t u o n t i r i i p p u v u u d e s t a m m e + t u o n t i r i i p p u v u u s + t u o n t i r i i p p u v u u t e m m e + t u o n t i r i i p p u v u u t t a + t u o n t i r i i p p u v u u t t a m m e + t u o n t i r i i s i l l e + t u o n t i r u u a s t a + t u o n t i s a a r r o n + t u o n t i s a t a m a s s a + t u o n t i s a v u k k e e t + t u o n t i s o i j a + t u o n t i s o i j a l l a + t u o n t i s o k e r i + t u o n t i s o p i m u k s e n + t u o n t i s o p i m u k s e t + t u o n t i s u l u n + t u o n t i s u o j a + t u o n t i s u o j a a + t u o n t i s ä h k ö l l ä + t u o n t i s ä ä n n ö i s t ä + t u o n t i s ä ä n n ö k s e t + t u o n t i s ä ä n n ö s t e n + t u o n t i s ä ä n n ö t + t u o n t i s ä ä n t e l y n + t u o n t i s ä ä n t ö j e n + t u o n t i t a r i f f e i l l a + t u o n t i t a r i f f e i l l a m m e + t u o n t i t a r i f f i e n + t u o n t i t a r i f f i j ä r j e s t e l m i s t ä + t u o n t i t a r i f f i k i i n t i ö n + t u o n t i t a r i f f i l e i k k a u s t a + t u o n t i t a r k a s t u k s e t + t u o n t i t a r k a s t u k s i a + t u o n t i t a r k a s t u s t e n + t u o n t i t a r p e e m m e + t u o n t i t a r p e e n + t u o n t i t a r v e + t u o n t i t a s o t + t u o n t i t a v a r a a + t u o n t i t a v a r o i d e n + t u o n t i t a v a r o i h i n + t u o n t i t a v a r o i l t a + t u o n t i t a v a r o i s s a + t u o n t i t a v a r o i s t a + t u o n t i t a v a r o i t a + t u o n t i t e k s t i i l i e n + t u o n t i t e k s t i i l i t u o t t e i d e n + t u o n t i t i e t o i h i n + t u o n t i t i e t o j a + t u o n t i t i l a n t e e n + t u o n t i t i l a s t o j e n + t u o n t i t o d i s t u k s i l l a + t u o n t i t o d i s t u s t a + t u o n t i t o d i s t u s t e n + t u o n t i t u e t + t u o n t i t u k i a + t u o n t i t u k i e n + t u o n t i t u l l e i h i n + t u o n t i t u l l e i l l a + t u o n t i t u l l e i s t a + t u o n t i t u l l e j a + t u o n t i t u l l e j a a n + t u o n t i t u l l e j a m m e + t u o n t i t u l l i + t u o n t i t u l l i a + t u o n t i t u l l i e n + t u o n t i t u l l i t + t u o n t i t u l l i t o i m i p a i k k a a n + t u o n t i t u l v a n + t u o n t i t u o t t e e t + t u o n t i t u o t t e i d e n + t u o n t i t u o t t e i l l a + t u o n t i t u o t t e i l l e + t u o n t i t u o t t e i l t a + t u o n t i t u o t t e i s i i n + t u o n t i t u o t t e i s s a + t u o n t i t u o t t e i s t a + t u o n t i t u o t t e i t a + t u o n t i t u p a k a n + t u o n t i t u p a k a s t a + t u o n t i v a a t i m u k s i a + t u o n t i v a a t i m u k s i s t a + t u o n t i v a l k u a i s e s t a + t u o n t i v a l k u a i s t a + t u o n t i v a l t i o n + t u o n t i v a l v o n n a n + t u o n t i v a l v o n n a s t a + t u o n t i v a l v o n t a a + t u o n t i v a l v o n t a j ä r j e s t e l y j ä + t u o n t i v a r m u u d e n + t u o n t i v a r m u u t t a + t u o n t i v a s t u u t a + t u o n t i v e r e n + t u o n t i v e r e s t ä + t u o n t i v e r k o s t o s t a + t u o n t i v e r o + t u o n t i v e r o i h i n + t u o n t i v e r o i s t a + t u o n t i v e r o j a + t u o n t i v e r o m m e + t u o n t i v e r o t + t u o n t i v e t o i s t a + t u o n t i v i r a n o m a i s e n + t u o n t i v i r r a t + t u o n t i v i r t o j a + t u o n t i y h t i ö i d e n + t u o n t i ö l j y n + t u o n t i ö l j y s t ä + t u o n t i ö l j y ä + t u o n u t + t u o r e e l t a a n + t u o r e e m m a n + t u o r e e m m a s t a + t u o r e e m p a a + t u o r e e m p i + t u o r e e m p i a + t u o r e e m p i a k i n + t u o r e e n + t u o r e e s t a + t u o r e e t + t u o r e i d e n + t u o r e i m m a s s a + t u o r e i m m a s t a + t u o r e i m m a t + t u o r e i m m i s s a + t u o r e i m m i s t a + t u o r e i m p a a n + t u o r e i m p a n a + t u o r e i m p i a + t u o r e i m p i e n + t u o r e i n + t u o r e i n t a + t u o r e i s s a + t u o r e i s t a + t u o r e i t a + t u o r e j u u s t o + t u o r e t t a + t u o r e t u o t e + t u o r e t u o t t e e t + t u o r e t u o t t e i d e n + t u o r e u s t i e d o i s t a + t u o t a k o o n + t u o t a m m e k o + t u o t a n n o l l e + t u o t a n n o l l i s e s t i + t u o t a n n o l l i s i s t a + t u o t a n n o l l i s t e n + t u o t a n n o n + t u o t a n n o n a l a + t u o t a n n o n a l a a + t u o t a n n o n a l a a n + t u o t a n n o n a l a l l a + t u o t a n n o n a l a l l e + t u o t a n n o n a l a n + t u o t a n n o n a l a n a + t u o t a n n o n a l a t + t u o t a n n o n a l o i l l a + t u o t a n n o n a l o i l l e + t u o t a n n o n a l o i s t a + t u o t a n n o n a l o j a + t u o t a n n o n a l o j a a n + t u o t a n n o n a l o j e n + t u o t a n n o n h a a r a + t u o t a n n o n l i s ä y k s e n + t u o t a n n o n l i s ä y s + t u o t a n n o n m e n e t y k s i i n + t u o t a n n o n m u u t o k s e e n + t u o t a n n o n o h j a u s + t u o t a n n o n r a j o i t u k s i i n + t u o t a n n o n r a j o i t u s j ä r j e s t e l m ä + t u o t a n n o n s i i r t o i h i n + t u o t a n n o n s i i r t o p r o s e s s i s t a + t u o t a n n o n s i i r t ä m i s p r o s e s s e i s t a + t u o t a n n o n s u p i s t a m i s k e i n o j e n + t u o t a n n o n t e k i j ä + t u o t a n n o n t e k i j ä k s i + t u o t a n n o n t e k i j ä n + t u o t a n n o n t e k i j ä n ä + t u o t a n n o n t e k i j ä t + t u o t a n n o n t e k i j ö i d e n + t u o t a n n o n t e k i j ö i n ä + t u o t a n n o n t e k i j ö i t ä + t u o t a n n o n u u d i s t u k s e n + t u o t a n n o n v a j e + t u o t a n n o n v a l v o n n a n + t u o t a n n o n v a l v o n n a s t a + t u o t a n n o n v a l v o n t a + t u o t a n n o n v a l v o n t a a + t u o t a n n o s s a + t u o t a n n o s s a a n + t u o t a n n o s s a m m e + t u o t a n n o s t a + t u o t a n n o s t a a n + t u o t a n t o a + t u o t a n t o a a n + t u o t a n t o a i k a + t u o t a n t o a j a t + t u o t a n t o a l a + t u o t a n t o a l a a + t u o t a n t o a l a a n + t u o t a n t o a l a l l a + t u o t a n t o a l a l l e + t u o t a n t o a l a n + t u o t a n t o a l a n a + t u o t a n t o a l a s t a + t u o t a n t o a l a t + t u o t a n t o a l o i h i n + t u o t a n t o a l o i l l a + t u o t a n t o a l o i s t a + t u o t a n t o a l o i t t e i s i i n + t u o t a n t o a l o j a + t u o t a n t o a l o j e n + t u o t a n t o a l u e + t u o t a n t o a l u e e l l a + t u o t a n t o a l u e e n + t u o t a n t o a l u e e t + t u o t a n t o a l u e i d e n + t u o t a n t o a l u e i l l a + t u o t a n t o a l u e i l l e + t u o t a n t o a l u e i s t a + t u o t a n t o a l u e i t a + t u o t a n t o a l u e i t a m m e + t u o t a n t o a r v o + t u o t a n t o a r v o n + t u o t a n t o b u d j e t i s t a + t u o t a n t o e d e l l y t y k s e t + t u o t a n t o e d e l l y t y s t e n + t u o t a n t o e d e l l y t y s t e n s ä + t u o t a n t o e h d o i l l a + t u o t a n t o e h d o t + t u o t a n t o e h t o j a + t u o t a n t o e h t o j e n + t u o t a n t o e l ä i m i i n + t u o t a n t o e l ä i m i l l e + t u o t a n t o e l ä i m i ä + t u o t a n t o e l ä i n t a u t i e n + t u o t a n t o e l ä i n t e m m e + t u o t a n t o e l ä i n t e n + t u o t a n t o e n n u s t e e t + t u o t a n t o e n n u s t e i s t a + t u o t a n t o e n n u s t e i t a + t u o t a n t o e r i t e l m ä n + t u o t a n t o e r o i s t a + t u o t a n t o e r o j e n + t u o t a n t o e t i i k k a a n + t u o t a n t o f u n k t i o + t u o t a n t o h a a r a t + t u o t a n t o h e n k i l ö k u n n a s t a + t u o t a n t o h i n n a n + t u o t a n t o h i n n a t + t u o t a n t o h i n n o i s s a + t u o t a n t o h i n t o i h i n + t u o t a n t o h i n t o j a + t u o t a n t o h i n t o j e n + t u o t a n t o h u i p u i s t a + t u o t a n t o h y ö d y k k e i s i i n + t u o t a n t o h y ö d y k k e i s t ä + t u o t a n t o h y ö d y k k e i t ä + t u o t a n t o h ä i r i ö i n ä + t u o t a n t o i h i n + t u o t a n t o i n f r a s t r u k t u u r i n + t u o t a n t o i n v e s t o i n n e i s t a + t u o t a n t o i n v e s t o i n t e j a + t u o t a n t o i n v e s t o i n t i e n + t u o t a n t o j a k s o i h i n + t u o t a n t o j a r r u s t a + t u o t a n t o j e n + t u o t a n t o j ä r j e s t e l m i e m m e + t u o t a n t o j ä r j e s t e l m i e n + t u o t a n t o j ä r j e s t e l m i e n s ä + t u o t a n t o j ä r j e s t e l m i i n + t u o t a n t o j ä r j e s t e l m i l l e + t u o t a n t o j ä r j e s t e l m i s s ä + t u o t a n t o j ä r j e s t e l m i s t ä + t u o t a n t o j ä r j e s t e l m i ä + t u o t a n t o j ä r j e s t e l m i ä ä n + t u o t a n t o j ä r j e s t e l m ä + t u o t a n t o j ä r j e s t e l m ä l l e + t u o t a n t o j ä r j e s t e l m ä l l ä + t u o t a n t o j ä r j e s t e l m ä m m e + t u o t a n t o j ä r j e s t e l m ä n + t u o t a n t o j ä r j e s t e l m ä n ä + t u o t a n t o j ä r j e s t e l m ä s s ä + t u o t a n t o j ä r j e s t e l m ä s s ä m m e + t u o t a n t o j ä r j e s t e l m ä t + t u o t a n t o j ä r j e s t e l m ä ä + t u o t a n t o j ä r j e s t e l m ä ä m m e + t u o t a n t o j ä r j e s t e l m ä ä n + t u o t a n t o j ä r j e s t e l m ä ä n s ä + t u o t a n t o j ä r j e s t e l y n s ä + t u o t a n t o j ä t t e e s t ä + t u o t a n t o j ä t t e i d e n + t u o t a n t o k a a r e n + t u o t a n t o k a n t a + t u o t a n t o k a p a s i t e e t i l l e + t u o t a n t o k a p a s i t e e t i n + t u o t a n t o k a p a s i t e e t i s t a + t u o t a n t o k a p a s i t e e t i s t a a n + t u o t a n t o k a p a s i t e e t i s t a m m e + t u o t a n t o k a p a s i t e e t i t + t u o t a n t o k a p a s i t e e t t i + t u o t a n t o k a p a s i t e e t t i a + t u o t a n t o k a p a s i t e e t t i a a n + t u o t a n t o k a p a s i t e e t t i a m m e + t u o t a n t o k a p a s i t e e t t i i n + t u o t a n t o k a p a s i t e e t t i m m e + t u o t a n t o k a p a s i t e e t t i n s a + t u o t a n t o k a r j a n + t u o t a n t o k a t o t + t u o t a n t o k a u d e n + t u o t a n t o k a u s i n a + t u o t a n t o k e i n o i h i n + t u o t a n t o k e i n o j a + t u o t a n t o k e i n o t + t u o t a n t o k e s k e i s e s t ä + t u o t a n t o k e s k u k s e n a + t u o t a n t o k e s k u k s i a + t u o t a n t o k e s k u k s i s t a + t u o t a n t o k e s k u s t a + t u o t a n t o k e s k u s t e n + t u o t a n t o k e t j u + t u o t a n t o k e t j u a + t u o t a n t o k e t j u j a + t u o t a n t o k e t j u j e n + t u o t a n t o k e t j u m m e + t u o t a n t o k e t j u n + t u o t a n t o k e t j u n s a + t u o t a n t o k e t j u s s a + t u o t a n t o k e t j u u n + t u o t a n t o k i e r r o n + t u o t a n t o k i e r r o t + t u o t a n t o k i i n t i ö + t u o t a n t o k i i n t i ö i d e n + t u o t a n t o k i i n t i ö i h i n + t u o t a n t o k i i n t i ö i l l ä + t u o t a n t o k i i n t i ö i s s ä + t u o t a n t o k i i n t i ö i s t ä + t u o t a n t o k i i n t i ö i t ä + t u o t a n t o k i i n t i ö i t ä ä n + t u o t a n t o k i i n t i ö j ä r j e s t e l m ä n + t u o t a n t o k i i n t i ö j ä r j e s t e l m ä ä n + t u o t a n t o k i i n t i ö n + t u o t a n t o k i i n t i ö n s ä + t u o t a n t o k i i n t i ö t + t u o t a n t o k i i n t i ö t ä + t u o t a n t o k i i n t i ö t ä ä n + t u o t a n t o k o n e i k s i + t u o t a n t o k o n e i s t o + t u o t a n t o k o n e i s t o a m m e + t u o t a n t o k o n e i s t o n + t u o t a n t o k o n e i s t o n s a + t u o t a n t o k o n e i t a + t u o t a n t o k o n s e r n i e n + t u o t a n t o k o n s o r t i o i s s a + t u o t a n t o k r i i s i + t u o t a n t o k r i t e e r e i t ä + t u o t a n t o k u i l u + t u o t a n t o k u i l u a + t u o t a n t o k u l u j a + t u o t a n t o k u l u j e n + t u o t a n t o k u n t o o n + t u o t a n t o k u s t a n n u k s e n s a + t u o t a n t o k u s t a n n u k s e t + t u o t a n t o k u s t a n n u k s i a + t u o t a n t o k u s t a n n u k s i a a n + t u o t a n t o k u s t a n n u k s i e n + t u o t a n t o k u s t a n n u k s i i n + t u o t a n t o k u s t a n n u k s i l l a + t u o t a n t o k u s t a n n u k s i l t a + t u o t a n t o k u s t a n n u k s i s s a + t u o t a n t o k u s t a n n u k s i s t a + t u o t a n t o k u s t a n n u s + t u o t a n t o k u s t a n n u s h i n n a n + t u o t a n t o k u s t a n n u s s u b v e n t i o i t a + t u o t a n t o k u s t a n n u s t e n + t u o t a n t o k u s t a n n u s t e n s a + t u o t a n t o k y k y + t u o t a n t o k y k y ä + t u o t a n t o k y k y ä ä n + t u o t a n t o k y n n y k s e n + t u o t a n t o k y n n y k s i ä + t u o t a n t o k y s y m y k s i i n + t u o t a n t o k y v y l l e + t u o t a n t o k y v y n + t u o t a n t o k y v y s s ä + t u o t a n t o k ä y t ä n t ö + t u o t a n t o k ä y t ä n t ö i h i n + t u o t a n t o k ä y t ä n t ö j e n + t u o t a n t o k ä y t ä n t ö j ä + t u o t a n t o l a i n s ä ä d ä n n ö s t ä + t u o t a n t o l a i t o k s e e n + t u o t a n t o l a i t o k s e n + t u o t a n t o l a i t o k s e n s a + t u o t a n t o l a i t o k s e s t a + t u o t a n t o l a i t o k s e t + t u o t a n t o l a i t o k s i a + t u o t a n t o l a i t o k s i a a n + t u o t a n t o l a i t o k s i i n + t u o t a n t o l a i t o k s i l l a + t u o t a n t o l a i t o k s i s s a + t u o t a n t o l a i t o s + t u o t a n t o l a i t o s t a + t u o t a n t o l a i t o s t e m m e + t u o t a n t o l a i t o s t e n + t u o t a n t o l a i t o s t e n s a + t u o t a n t o l a i t t e i s t o j e n + t u o t a n t o l a j i a + t u o t a n t o l a j i k k e i d e n + t u o t a n t o l a s k e l m i s s a + t u o t a n t o l i n j a + t u o t a n t o l i n j a a n + t u o t a n t o l i n j a a n s a + t u o t a n t o l i n j a l l a + t u o t a n t o l i n j a l t a + t u o t a n t o l i n j a n + t u o t a n t o l i n j a n s a + t u o t a n t o l i n j a t + t u o t a n t o l i n j o i l l a + t u o t a n t o l u k u i h i n + t u o t a n t o l u k u i n e e n + t u o t a n t o l u k u j a + t u o t a n t o l u v u t + t u o t a n t o l ä h d e + t u o t a n t o l ä h t e i d e n + t u o t a n t o l ä h t e i t ä + t u o t a n t o m a a i l m a + t u o t a n t o m a a n + t u o t a n t o m a a s t a + t u o t a n t o m a a t a + t u o t a n t o m a h d o l l i s u u d e t + t u o t a n t o m a h d o l l i s u u k s i a + t u o t a n t o m a h d o l l i s u u k s i e n + t u o t a n t o m a h d o l l i s u u k s i l l e + t u o t a n t o m a h d o l l i s u u k s i s t a + t u o t a n t o m a h d o l l i s u u t e m m e + t u o t a n t o m a i h i n + t u o t a n t o m a i l l a + t u o t a n t o m a i s s a + t u o t a n t o m a i s t a + t u o t a n t o m a k s u + t u o t a n t o m a k s u a + t u o t a n t o m a k s u i s t a + t u o t a n t o m a k s u j a + t u o t a n t o m a l l e i h i n + t u o t a n t o m a l l e j a + t u o t a n t o m a l l i + t u o t a n t o m a l l i a + t u o t a n t o m a l l i e n + t u o t a n t o m a l l i i n + t u o t a n t o m a l l i n + t u o t a n t o m a l l i n a + t u o t a n t o m a l l i t + t u o t a n t o m a r k k i n o i l l a + t u o t a n t o m a r k k i n o i l l e + t u o t a n t o m a r k k i n o i s t a + t u o t a n t o m a t e r i a a l i n + t u o t a n t o m e n e t e l m i e m m e + t u o t a n t o m e n e t e l m i e n + t u o t a n t o m e n e t e l m i e n s ä + t u o t a n t o m e n e t e l m i i n + t u o t a n t o m e n e t e l m i i n s ä + t u o t a n t o m e n e t e l m i k s i + t u o t a n t o m e n e t e l m i l l e + t u o t a n t o m e n e t e l m i l l ä + t u o t a n t o m e n e t e l m i s s ä + t u o t a n t o m e n e t e l m i s t ä + t u o t a n t o m e n e t e l m i ä + t u o t a n t o m e n e t e l m i ä m m e + t u o t a n t o m e n e t e l m i ä ä n + t u o t a n t o m e n e t e l m ä + t u o t a n t o m e n e t e l m ä n + t u o t a n t o m e n e t e l m ä n s ä + t u o t a n t o m e n e t e l m ä s t ä + t u o t a n t o m e n e t e l m ä t + t u o t a n t o m e n e t e l m ä ä + t u o t a n t o m e n e t e l m ä ä n + t u o t a n t o m e n e t t e l y i s t ä + t u o t a n t o m e n e t t e l y n + t u o t a n t o m e t s i ä + t u o t a n t o m e t s ä + t u o t a n t o m o t i v a a t i o t a + t u o t a n t o m u o d o i s t a + t u o t a n t o m u o d o l l e + t u o t a n t o m u o d o s t a + t u o t a n t o m u o d o t + t u o t a n t o m u o t o + t u o t a n t o m u o t o i h i n + t u o t a n t o m u o t o j a + t u o t a n t o m u o t o j e n + t u o t a n t o m u o t o n a + t u o t a n t o m u o t o o n + t u o t a n t o m ä ä r i e n + t u o t a n t o m ä ä r i i n + t u o t a n t o m ä ä r i l l e + t u o t a n t o m ä ä r i s s ä + t u o t a n t o m ä ä r i s t ä + t u o t a n t o m ä ä r i ä + t u o t a n t o m ä ä r ä + t u o t a n t o m ä ä r ä l t ä ä n + t u o t a n t o m ä ä r ä t + t u o t a n t o n o r m e j a + t u o t a n t o n o r m i e n + t u o t a n t o n o r m i t + t u o t a n t o n s a + t u o t a n t o n ä k y m i e n + t u o t a n t o o n + t u o t a n t o p a i k a l l a + t u o t a n t o p a i k a l t a + t u o t a n t o p a i k a n + t u o t a n t o p a i k a t + t u o t a n t o p a i k k a + t u o t a n t o p a i k k a a + t u o t a n t o p a i k k a k u n n a l l a + t u o t a n t o p a i k k a n a + t u o t a n t o p a i k k a n s a + t u o t a n t o p a i k k o i n a + t u o t a n t o p a i k k o j a + t u o t a n t o p a i k k o j e n + t u o t a n t o p a i k o i l l a + t u o t a n t o p a l k k i o + t u o t a n t o p a l k k i o i t a + t u o t a n t o p a l k k i o j ä r j e s t e l m ä n + t u o t a n t o p a l v e l u j e n + t u o t a n t o p a n o k s i i n + t u o t a n t o p a n o s + t u o t a n t o p a n o s k u l u j e n + t u o t a n t o p a n o s k u s t a n n u k s i a + t u o t a n t o p a n o s k u s t a n n u k s i i n + t u o t a n t o p a n o s t e n + t u o t a n t o p e r i n t e e t + t u o t a n t o p e r u s t a a + t u o t a n t o p e r u s t a n + t u o t a n t o p o h j a + t u o t a n t o p o h j a a + t u o t a n t o p o h j a a m m e + t u o t a n t o p o h j a n + t u o t a n t o p o h j a n s a + t u o t a n t o p o l i t i i k a s t a + t u o t a n t o p o l i t i i k k a + t u o t a n t o p o l i t i i k k a a + t u o t a n t o p o r t a a t + t u o t a n t o p o r t a i d e n + t u o t a n t o p o t e n t i a a l e i h i n + t u o t a n t o p o t e n t i a a l i + t u o t a n t o p o t e n t i a a l i a + t u o t a n t o p o t e n t i a a l i a a n + t u o t a n t o p o t e n t i a a l i a m m e + t u o t a n t o p o t e n t i a a l i n + t u o t a n t o p o t e n t i a a l i n s a + t u o t a n t o p o t e n t i a a l i s t a + t u o t a n t o p r o s e s s e i h i n + t u o t a n t o p r o s e s s e i l l e + t u o t a n t o p r o s e s s e i s s a + t u o t a n t o p r o s e s s e i s t a + t u o t a n t o p r o s e s s e i s t a a n + t u o t a n t o p r o s e s s e j a + t u o t a n t o p r o s e s s e j a a n + t u o t a n t o p r o s e s s i + t u o t a n t o p r o s e s s i a + t u o t a n t o p r o s e s s i e n + t u o t a n t o p r o s e s s i i n + t u o t a n t o p r o s e s s i n + t u o t a n t o p r o s e s s i n s a + t u o t a n t o p r o s e s s i s s a + t u o t a n t o p r o s e s s i s s a a n + t u o t a n t o p r o s e s s i s t a + t u o t a n t o p r o s e s s i t + t u o t a n t o p u i t t e e t + t u o t a n t o p u o l e l l a + t u o t a n t o p u o l e n + t u o t a n t o p ä ä o m a a n + t u o t a n t o p ä ä t ö k s i ä + t u o t a n t o r a j a t + t u o t a n t o r a j o i t t e i t a + t u o t a n t o r a j o i t u k s e t + t u o t a n t o r a j o i t u k s i a + t u o t a n t o r a j o i t u k s i i n + t u o t a n t o r a j o i t u k s i l l a + t u o t a n t o r a j o i t u k s i s t a + t u o t a n t o r a j o i t u s t e n + t u o t a n t o r a k e n n e + t u o t a n t o r a k e n n e t t a + t u o t a n t o r a k e n n e t t a n n e + t u o t a n t o r a k e n n u s + t u o t a n t o r a k e n t e e m m e + t u o t a n t o r a k e n t e e n + t u o t a n t o r a k e n t e e n s a + t u o t a n t o r a k e n t e e s e e n + t u o t a n t o r a k e n t e e s t a + t u o t a n t o r a k e n t e e t + t u o t a n t o r a k e n t e i d e n + t u o t a n t o r a k e n t e i l l e + t u o t a n t o r a k e n t e i s i i n + t u o t a n t o r a k e n t e i s s a + t u o t a n t o r a k e n t e i t a + t u o t a n t o r a k e n t e i t a a n + t u o t a n t o r e s u r s s e j a + t u o t a n t o r e s u r s s i e n + t u o t a n t o r i s k i e n + t u o t a n t o s a r j a + t u o t a n t o s a r j a a n + t u o t a n t o s a r j a n + t u o t a n t o s a r j a t + t u o t a n t o s e k t o r e i d e n + t u o t a n t o s e k t o r e i t a + t u o t a n t o s e k t o r e j a a n + t u o t a n t o s e k t o r i + t u o t a n t o s e k t o r i a + t u o t a n t o s e k t o r i e n + t u o t a n t o s e k t o r i i n + t u o t a n t o s e k t o r i l l a + t u o t a n t o s e k t o r i m m e + t u o t a n t o s e k t o r i n + t u o t a n t o s e k t o r i s t a + t u o t a n t o s i a l l a + t u o t a n t o s i d o n n a i n e n + t u o t a n t o s i d o n n a i s i a + t u o t a n t o s i d o n n a i s i s t a + t u o t a n t o s i d o n n a i s u u s + t u o t a n t o s i k o j a + t u o t a n t o s o p i m u k s e t + t u o t a n t o s o p i m u s + t u o t a n t o s o p i m u s t e n + t u o t a n t o s t a n d a r d e i n + t u o t a n t o s t a n d a r d e i s t a + t u o t a n t o s t a n d a r d e j a + t u o t a n t o s t a n d a r d i e n + t u o t a n t o s t a n d a r d i t + t u o t a n t o s t r a t e g i a a m m e + t u o t a n t o s u h t e e t + t u o t a n t o s u h t e i d e n + t u o t a n t o s u h t e i s i i n + t u o t a n t o s u u n n a n + t u o t a n t o s u u n n i t e l m a n s a + t u o t a n t o s u u n n i t e l m a t + t u o t a n t o s u u n t a a + t u o t a n t o s y k l i + t u o t a n t o s y k l i s s ä + t u o t a n t o s y k l i t + t u o t a n t o s y k l i ä + t u o t a n t o s ä ä n n ö k s i i n + t u o t a n t o s ä ä n n ö t + t u o t a n t o s ä ä n t ö j e n + t u o t a n t o s ä ä n t ö j ä + t u o t a n t o t a l o u s + t u o t a n t o t a l o u t e e n + t u o t a n t o t a l o u t t a + t u o t a n t o t a p a + t u o t a n t o t a p a a + t u o t a n t o t a p a a n + t u o t a n t o t a p o i h i n + t u o t a n t o t a p o j a + t u o t a n t o t a p o j e n + t u o t a n t o t a r p e e t + t u o t a n t o t a r p e i d e n s a + t u o t a n t o t a r p e i s i i n + t u o t a n t o t a r p e i t a + t u o t a n t o t a r v i k k e i d e n + t u o t a n t o t a s o + t u o t a n t o t a s o a + t u o t a n t o t a s o j e n + t u o t a n t o t a s o l t a + t u o t a n t o t a s o n + t u o t a n t o t a s o n s a + t u o t a n t o t a v a n + t u o t a n t o t a v a s t a + t u o t a n t o t a v o i l l a + t u o t a n t o t a v o i l l e + t u o t a n t o t a v o i s t a + t u o t a n t o t a v o i t t e e t + t u o t a n t o t e h o o n + t u o t a n t o t e h t ä v ä n + t u o t a n t o t e h t ä v ä n s ä + t u o t a n t o t e k i j ä + t u o t a n t o t e k i j ä n ä + t u o t a n t o t e k i j ä s t ä + t u o t a n t o t e k i j ä ä + t u o t a n t o t e k i j ö i d e n + t u o t a n t o t e k i j ö i h i n + t u o t a n t o t e k i j ö i k s i + t u o t a n t o t e k i j ö i l l ä + t u o t a n t o t e k i j ö i t ä + t u o t a n t o t e k i j ö i t ä ä n + t u o t a n t o t e k n i i k a n + t u o t a n t o t e k n i i k a t + t u o t a n t o t e k n i i k k a a + t u o t a n t o t e k n i i k o i d e n + t u o t a n t o t e k n i i k o i h i n + t u o t a n t o t e k n i i k o i t a + t u o t a n t o t e k n o l o g i a + t u o t a n t o t e k n o l o g i a a + t u o t a n t o t e k n o l o g i a t + t u o t a n t o t e k n o l o g i o i h i n + t u o t a n t o t e k n o l o g i o i t a + t u o t a n t o t e k n o l o g i s t a + t u o t a n t o t e o l l i s u u d e l l e m m e + t u o t a n t o t e o l l i s u u d e n + t u o t a n t o t e o l l i s u u s + t u o t a n t o t e o l l i s u u s a l u e i l l e + t u o t a n t o t e o l l i s u u s y r i t y s + t u o t a n t o t e o l l i s u u t t a + t u o t a n t o t i l a n n e t t a + t u o t a n t o t i l o i l l e + t u o t a n t o t i l o i s t a + t u o t a n t o t o i m e n s a + t u o t a n t o t o i m i a + t u o t a n t o t o i m i e n + t u o t a n t o t o i m i n n a l l e + t u o t a n t o t o i m i n n a n + t u o t a n t o t o i m i n n a s s a a n + t u o t a n t o t o i m i n n a s t a + t u o t a n t o t o i m i n t a + t u o t a n t o t o i m i n t a a + t u o t a n t o t o i m i n t a a n + t u o t a n t o t o i m i n t a a n s a + t u o t a n t o t o i m i n t o j e n + t u o t a n t o t o t t u m u s t e n + t u o t a n t o t u e l l e + t u o t a n t o t u e n + t u o t a n t o t u e s t a + t u o t a n t o t u e t + t u o t a n t o t u k e a + t u o t a n t o t u k e e n + t u o t a n t o t u k e n a + t u o t a n t o t u k i + t u o t a n t o t u k i a + t u o t a n t o t u k i e n + t u o t a n t o t u k i i n + t u o t a n t o t u k i j ä r j e s t e l m ä s s ä + t u o t a n t o t u k i j ä r j e s t e l m ä ä + t u o t a n t o t u k i j ä r j e s t e l y ä + t u o t a n t o t y y p e i s t ä + t u o t a n t o t y y p i l l e + t u o t a n t o t y y p i t + t u o t a n t o t y y p p i e n + t u o t a n t o t y ö p a i k k o j a + t u o t a n t o u u d i s t u s p r o s e s s i e n + t u o t a n t o v a a t i m u k s e t + t u o t a n t o v a a t i m u k s i a + t u o t a n t o v a a t i m u k s i i n + t u o t a n t o v a a t i m u s t e n + t u o t a n t o v a i h e e n + t u o t a n t o v a i h e e s e e n + t u o t a n t o v a i h e e s s a + t u o t a n t o v a i h e e t + t u o t a n t o v a i h e i s s a + t u o t a n t o v a i h e i s t a + t u o t a n t o v a i h t o e h t o j a + t u o t a n t o v a i k e u k s i a + t u o t a n t o v a j e i t a + t u o t a n t o v a k u u d e n + t u o t a n t o v a l m i u d e t + t u o t a n t o v a l m i u k s i a + t u o t a n t o v a l m i u k s i a a n + t u o t a n t o v a l m i u k s i e n + t u o t a n t o v a l m i u k s i i n + t u o t a n t o v a l v o n t a a + t u o t a n t o v a r m u u s r a h a s t o n + t u o t a n t o v a r o j e n + t u o t a n t o v e l v o i t e t t a + t u o t a n t o v e r k o s t o j e n + t u o t a n t o v e r o + t u o t a n t o v i r h e i l l ä + t u o t a n t o v o i m i e n + t u o t a n t o v o i m i s t a + t u o t a n t o v o l y y m i + t u o t a n t o v u o d e s s a + t u o t a n t o v u o d e s t a + t u o t a n t o v u o n n a + t u o t a n t o v u o t e n s a + t u o t a n t o v ä l i n e + t u o t a n t o v ä l i n e e n s ä + t u o t a n t o v ä l i n e e n ä + t u o t a n t o v ä l i n e e t + t u o t a n t o v ä l i n e i d e n + t u o t a n t o v ä l i n e i l l ä + t u o t a n t o v ä l i n e i s i i n + t u o t a n t o v ä l i n e i s t ä + t u o t a n t o v ä l i n e i t ä + t u o t a n t o v ä l i n e i t ä ä n + t u o t a n t o v ä l i n e t t ä + t u o t a n t o y h t e i s t y ö s t ä + t u o t a n t o y h t i ö i d e n + t u o t a n t o y h t i ö i h i n + t u o t a n t o y h t i ö i l l e + t u o t a n t o y h t i ö i t ä + t u o t a n t o y k s i k k ö + t u o t a n t o y k s i k k ö i h i n + t u o t a n t o y k s i k k ö j e n + t u o t a n t o y k s i k k ö j ä + t u o t a n t o y k s i k k ö k o h t a i s e s t i + t u o t a n t o y k s i k k ö n s ä + t u o t a n t o y k s i k k ö ä + t u o t a n t o y k s i k ö i d e n + t u o t a n t o y k s i k ö i s s ä + t u o t a n t o y k s i k ö i s t ä + t u o t a n t o y k s i k ö i t ä + t u o t a n t o y k s i k ö n + t u o t a n t o y k s i k ö s s ä + t u o t a n t o y k s i k ö t + t u o t a n t o y l i j ä ä m ä t + t u o t a n t o y r i t y k s e n ä + t u o t a n t o y r i t y k s i l l e + t u o t a n t o y r i t y k s i l l e e n + t u o t a n t o y r i t y k s i ä + t u o t a n t o y r i t y s t e n + t u o t a v a + t u o t a v a t + t u o t a v i e n + t u o t a v i s t a + t u o t e a k t i v o i n t i + t u o t e a l o i l l a + t u o t e a r v i o i n n i n + t u o t e a r v i o i n t i e n + t u o t e d i r e k t i i v i + t u o t e d i r e k t i i v i n + t u o t e d i r e k t i i v i ä + t u o t e h i n t o j a + t u o t e h y g i e n i a n + t u o t e i n n o v a a t i o i t a + t u o t e j a k e l u + t u o t e k a s v u + t u o t e k a t e g o r i o i s s a + t u o t e k a t e t t a + t u o t e k a u p a n + t u o t e k e h i t t e l y + t u o t e k e h i t t e l y p o l i t i i k a s s a a n + t u o t e k e h i t t e l y r i s k e i s t ä + t u o t e k e h i t t e l y r i s k i + t u o t e k e h i t t e l y r i s k i i n + t u o t e k e h i t t e l y r i s k i n + t u o t e k e h i t t e l y r i s k i s t ä + t u o t e k e h i t t e l y r i s k i ä + t u o t e k e h i t t e l y s s ä + t u o t e k e h i t t e l y y n + t u o t e k e h i t t e l y ä + t u o t e k e h i t y k s e e n + t u o t e k e h i t y k s e n + t u o t e k e h i t y k s e s s ä + t u o t e k e h i t y s + t u o t e k e h i t y s t ä + t u o t e k e t j u a + t u o t e k e t j u s s a + t u o t e k o h t a i n e n + t u o t e k o h t a i s e n + t u o t e k o h t a i s t a + t u o t e k o h t a i s t e n + t u o t e k o n t r o l l i a + t u o t e k o p i o i d e n + t u o t e k u l j e t u k s i s t a + t u o t e k u v a u k s e e n + t u o t e l a i n s ä ä d ä n n ö n + t u o t e l a i n s ä ä d ä n t ö + t u o t e l a i n s ä ä d ä n t ö ö n + t u o t e l a j i t + t u o t e l u e t t e l o + t u o t e l u e t t e l o a + t u o t e l u e t t e l o i n e e n + t u o t e l u e t t e l o o n + t u o t e l u o k a l l e + t u o t e l u o k a n + t u o t e l u o k i s s a + t u o t e l u o k k i a + t u o t e l u o k k i e n + t u o t e l u o k k i i n + t u o t e l u p a p ä ä t ö k s i ä + t u o t e m a a i l m a s t a + t u o t e m a k s u n + t u o t e m a r k k i n a t + t u o t e m a r k k i n a u u d i s t u s t a + t u o t e m a r k k i n o i d e n + t u o t e m a r k k i n o i l l a + t u o t e m a r k k i n o i l l e + t u o t e m a r k k i n o i t a + t u o t e m e r k i l l ä + t u o t e m e r k i n n ä t + t u o t e m e r k i n n ö i l l ä + t u o t e m e r k i n n ö i s s ä ä n + t u o t e m e r k i n n ö i s t ä + t u o t e m e r k i n t ä j ä r j e s t e l m ä + t u o t e m e r k i n t ä m e n e t t e l y j ä + t u o t e m e r k i n t ö i h i n + t u o t e m e r k i n t ö j e n + t u o t e m e r k i n t ö j ä + t u o t e m e r k i t + t u o t e m e r k k e j ä + t u o t e m e r k k i + t u o t e m e r k k i e n + t u o t e m e r k k i i n + t u o t e m e r k k i ä + t u o t e m ä ä r i i n + t u o t e m ä ä r i t e l m ä + t u o t e m ä ä r i t e l m ä t + t u o t e n i m e l l ä + t u o t e n i m e n s ä + t u o t e n i m i + t u o t e n i m i k k e i s t ö n + t u o t e n i m i s t ä + t u o t e n i m i t y k s e n + t u o t e n o r m i t + t u o t e o m i n a i s u u k s i e n s a + t u o t e p a k e t i s t a + t u o t e p a k e t t i + t u o t e p a k e t t i a + t u o t e p a t e n t t i e n + t u o t e p e r h e e n + t u o t e p o h j a i s e l l e + t u o t e p o l i t i i k a l l e + t u o t e p o l i t i i k a n + t u o t e p o l i t i i k a s s a + t u o t e p o l i t i i k a s t a + t u o t e p o l i t i i k k a + t u o t e p o l i t i i k k a a + t u o t e p o l i t i i k k a a n + t u o t e r y h m i e n + t u o t e r y h m i i n + t u o t e r y h m i l l e + t u o t e r y h m i s s ä + t u o t e r y h m i s t ä + t u o t e r y h m i ä + t u o t e r y h m ä + t u o t e r y h m ä l l e + t u o t e r y h m ä n + t u o t e r y h m ä s t ä + t u o t e r y h m ä t + t u o t e r y h m ä ä + t u o t e r y h m ä ä n + t u o t e s a a s t u m i s e s t a + t u o t e s e l o s t e e n + t u o t e s e l o s t e e s s a + t u o t e s e l o s t e e s t a + t u o t e s e l o s t e e t + t u o t e s e l o s t e i s i i n + t u o t e s e l o s t e i s t a + t u o t e s e l o s t e j ä r j e s t e l m ä + t u o t e s e l o s t e v a a t i m u k s e t + t u o t e s e l o s t e v a a t i m u s t e n + t u o t e s e l o s t e v e l v o l l i s u u s + t u o t e s e l o s t u k s i i n + t u o t e s i j o i t t a j i e n + t u o t e s i j o i t t e l u + t u o t e s i j o i t t e l u a + t u o t e s i j o i t t e l u k y s y m y s t ä + t u o t e s i j o i t t e l u l l a + t u o t e s i j o i t t e l u n + t u o t e s i j o i t t e l u s t a + t u o t e s i j o i t t e l u u n + t u o t e s t a n d a r d e j a + t u o t e s t a n d a r d i e n + t u o t e s t a n d a r d i t + t u o t e s u k u p o l v e n + t u o t e s u u n n i t t e l u + t u o t e s u u n n i t t e l u a + t u o t e s u u n n i t t e l u l l a + t u o t e s u u n n i t t e l u n + t u o t e s u u n n i t t e l u p r o s e s s i e n + t u o t e s u u n n i t t e l u u n + t u o t e s ä i l i ö a l u k s e t + t u o t e s ä ä n t e l y ä + t u o t e t a a n + t u o t e t a a n k o + t u o t e t a r j o n t a a + t u o t e t i e d o i n + t u o t e t i e d o l l a + t u o t e t i e d o t + t u o t e t i e d o t u s + t u o t e t i e t o a + t u o t e t i e t o j a + t u o t e t i e t o j e n + t u o t e t t a + t u o t e t t a e s s a + t u o t e t t a i s i i n + t u o t e t t a v a + t u o t e t t a v i a + t u o t e t t i i n + t u o t e t t u + t u o t e t t u i h i n + t u o t e t t u j a + t u o t e t t u j e n + t u o t e t u k e e n + t u o t e t u k s i + t u o t e t u l v a + t u o t e t u l v a s t a + t u o t e t u n + t u o t e t u n n u k s i a + t u o t e t u r v a + t u o t e t u r v a l l i s u u d e l l e + t u o t e t u r v a l l i s u u d e n + t u o t e t u r v a l l i s u u d e s s a + t u o t e t u r v a l l i s u u d e s t a + t u o t e t u r v a l l i s u u s + t u o t e t u r v a l l i s u u s a r v i o n + t u o t e t u r v a l l i s u u s a s i o i s s a + t u o t e t u r v a l l i s u u s d i r e k t i i v i + t u o t e t u r v a l l i s u u s d i r e k t i i v i i n + t u o t e t u r v a l l i s u u s d i r e k t i i v i n + t u o t e t u r v a l l i s u u s j ä r j e s t e l m ä n s ä + t u o t e t u r v a l l i s u u s l a i n s ä ä d ä n t ö ä + t u o t e t u r v a l l i s u u s m e r k i n t ä + t u o t e t u r v a l l i s u u s p a k e t i s s a + t u o t e t u r v a l l i s u u s p e r u s t e i t a + t u o t e t u r v a l l i s u u s s t a n d a r d i t + t u o t e t u r v a l l i s u u s t i l a n t e e s s a + t u o t e t u r v a l l i s u u s v a a t i m u k s i a + t u o t e t u r v a l l i s u u s v e r k k o o n + t u o t e t u r v a l l i s u u t e e n + t u o t e t u r v a l l i s u u t t a + t u o t e t u s t a + t u o t e t u t + t u o t e t u t k i m u k s e e n + t u o t e t u t k i m u s + t u o t e t y y p i n + t u o t e t y y p p e j ä + t u o t e v a a t i m u k s i a + t u o t e v a a t i m u k s i s s a + t u o t e v a l i k o i m a + t u o t e v a l i k o i m a a + t u o t e v a l i k o i m a a n + t u o t e v a l i k o i m a n + t u o t e v a l i k o i m a n s a + t u o t e v a l i k o i m a s t a + t u o t e v a l i k o i m a t + t u o t e v a l i k o i m i a + t u o t e v a l m i s t a j i l l e + t u o t e v a l v o n n a n + t u o t e v a l v o n t a v i r a n o m a i s t e n + t u o t e v a r a s t o + t u o t e v a r m u u s + t u o t e v a r m u u s a s i o i l l a + t u o t e v a s t u u + t u o t e v a s t u u a s i o i s s a + t u o t e v a s t u u d i r e k t i i v i + t u o t e v a s t u u d i r e k t i i v i n + t u o t e v a s t u u j ä r j e s t e l m ä + t u o t e v a s t u u j ä r j e s t e l m ä ä + t u o t e v a s t u u k y s y m y s t ä + t u o t e v a s t u u l a k i + t u o t e v a s t u u n + t u o t e v a s t u u s e e n + t u o t e v a s t u u s t a + t u o t e v a s t u u t a + t u o t e v e r o j a + t u o t e v ä ä r e n n ö k s e t + t u o t e v ä ä r e n n ö k s i l t ä + t u o t e v ä ä r e n n ö k s i s t ä + t u o t e v ä ä r e n n ö k s i ä + t u o t e v ä ä r e n n ö s t e n + t u o t e y h t e y s p i s t e + t u o t e y h t e y s p i s t e i d e n + t u o t i i n + t u o t i m m e + t u o t o i s t a + t u o t o n + t u o t o s k r i t e e r i t + t u o t o s t a + t u o t t a a + t u o t t a a k s e e n + t u o t t a i s i + t u o t t a j a h i n n a t + t u o t t a j a h i n n o i s s a + t u o t t a j a h i n n o i s t a + t u o t t a j a h i n t a + t u o t t a j a h i n t a i n d e k s i + t u o t t a j a h i n t o i h i n + t u o t t a j a h i n t o j a + t u o t t a j a h i n t o j e n + t u o t t a j a j o h t o i n e n + t u o t t a j a j ä r j e s t ö i h i n + t u o t t a j a j ä r j e s t ö i l l e + t u o t t a j a j ä r j e s t ö i s s ä + t u o t t a j a j ä r j e s t ö i s t ä + t u o t t a j a j ä r j e s t ö j e n + t u o t t a j a j ä r j e s t ö j ä + t u o t t a j a j ä r j e s t ö n + t u o t t a j a j ä r j e s t ö t + t u o t t a j a j ä s e n v a l t i o i l l e + t u o t t a j a j ä s e n v a l t i o i s s a + t u o t t a j a k a r t e l l e j a + t u o t t a j a k o h t a i s i n + t u o t t a j a k o h t a i s t e n + t u o t t a j a k u m p p a n e i n a + t u o t t a j a m a a + t u o t t a j a m a a n + t u o t t a j a m a a s s a + t u o t t a j a m a a t + t u o t t a j a m a i d e n + t u o t t a j a m a i d e n k i n + t u o t t a j a m a i h i n + t u o t t a j a m a i l l a + t u o t t a j a m a i l l e + t u o t t a j a m a i s s a + t u o t t a j a m a i s t a + t u o t t a j a m a i t a + t u o t t a j a m m e + t u o t t a j a n + t u o t t a j a o r g a n i s a a t i o + t u o t t a j a o r g a n i s a a t i o i d e n + t u o t t a j a o r g a n i s a a t i o i h i n + t u o t t a j a o r g a n i s a a t i o i k s i + t u o t t a j a o r g a n i s a a t i o i l l a + t u o t t a j a o r g a n i s a a t i o i l l e + t u o t t a j a o r g a n i s a a t i o i s s a + t u o t t a j a o r g a n i s a a t i o i t a + t u o t t a j a o r g a n i s a a t i o n + t u o t t a j a o r g a n i s a a t i o t + t u o t t a j a o s u u s k u n n i k s i + t u o t t a j a o s u u s t o i m i n t a y r i t y k s i ä + t u o t t a j a p e r h e t t ä + t u o t t a j a p u o l t a + t u o t t a j a r y h m i e n + t u o t t a j a r y h m i i n + t u o t t a j a r y h m i l l e + t u o t t a j a r y h m i t t y m i e n + t u o t t a j a r y h m i t t y m i i n + t u o t t a j a r y h m i t t y m i l l e + t u o t t a j a r y h m i t t y m i s t ä + t u o t t a j a r y h m i t t y m ä t + t u o t t a j a r y h m i ä + t u o t t a j a r y h m ä l l e + t u o t t a j a r y h m ä n + t u o t t a j a r y h m ä t + t u o t t a j a r y h m ä ä + t u o t t a j a s e k t o r i l l a + t u o t t a j a s e u d u i l l a + t u o t t a j a s u k u p o l v e t + t u o t t a j a t + t u o t t a j a t u e n + t u o t t a j a t u k i j ä r j e s t e l m ä ä n + t u o t t a j a v a l t i o i d e n + t u o t t a j a v a l t i o i h i n + t u o t t a j a v a l t i o i l l e + t u o t t a j a v a l t i o i s s a + t u o t t a j a v a l t i o i s t a + t u o t t a j a v a l t i o t + t u o t t a j a v a s t u u l l a + t u o t t a j a v a s t u u s t a + t u o t t a j a y h d i s t y k s e n + t u o t t a j a y h d i s t y s t e n + t u o t t a j a y r i t y k s e t + t u o t t a j a y r i t y k s i l t ä + t u o t t a j a y r i t y k s i ä + t u o t t a j i a + t u o t t a j i a m m e + t u o t t a j i e m m e + t u o t t a j i e n + t u o t t a j i e n k i n + t u o t t a j i i n + t u o t t a j i l l a + t u o t t a j i l l e + t u o t t a j i n a + t u o t t a j i s s a + t u o t t a j i s t a + t u o t t a k a a + t u o t t a k a a m m e + t u o t t a k o o n + t u o t t a m a + t u o t t a m a a m m e + t u o t t a m a a n + t u o t t a m a l l a + t u o t t a m a m m e + t u o t t a m a s t a + t u o t t a m a t + t u o t t a m a t o n t a + t u o t t a m a t t a + t u o t t a m a t t o m i a + t u o t t a m a t t o m i e n + t u o t t a m a t t o m i n + t u o t t a m a t t o m i s t a + t u o t t a m i s e e n + t u o t t a m i s e k s i + t u o t t a m i s e n + t u o t t a m i s e s t a + t u o t t a m i s p r o s e s s i a + t u o t t a m u k s e s t a + t u o t t a n e e t + t u o t t a n u t + t u o t t a v a a + t u o t t a v a a n + t u o t t a v a m m a n + t u o t t a v a m m i n + t u o t t a v a m m i n k i n + t u o t t a v a m p a a + t u o t t a v a m p a a n + t u o t t a v a m p i + t u o t t a v a m p i a + t u o t t a v a n + t u o t t a v a n a + t u o t t a v a t + t u o t t a v i a + t u o t t a v i e n + t u o t t a v i i n + t u o t t a v i l l e + t u o t t a v i m m a n + t u o t t a v i m m a s t a k a a n + t u o t t a v i m m a t + t u o t t a v i m m i s t a + t u o t t a v i m p a n a + t u o t t a v i m p i e n + t u o t t a v i m p i i n + t u o t t a v i n + t u o t t a v i s t a + t u o t t a v u u d e l l e + t u o t t a v u u d e l t a a n + t u o t t a v u u d e n + t u o t t a v u u d e s s a + t u o t t a v u u d e s t a + t u o t t a v u u s a s t e + t u o t t a v u u s a s t e e n s a + t u o t t a v u u s e r o j a + t u o t t a v u u s h y ö d y t + t u o t t a v u u s h y ö t y j ä + t u o t t a v u u s i n d e k s i n + t u o t t a v u u s k a p a s i t e e t t i + t u o t t a v u u s k e h i t y k s e n + t u o t t a v u u s k r i i s i + t u o t t a v u u s k r i t e e r e i s t ä + t u o t t a v u u s k r i t e e r i n + t u o t t a v u u s k u i l u u n + t u o t t a v u u s l u v u t + t u o t t a v u u s m a l l i + t u o t t a v u u s o n g e l m a + t u o t t a v u u s o n g e l m a t + t u o t t a v u u s p a l k k i o i t a + t u o t t a v u u s p a r a d o k s i + t u o t t a v u u s p a r a n n u k s e t + t u o t t a v u u s p o t e n t i a a l i a + t u o t t a v u u s s y i s t ä + t u o t t a v u u s t a i s t e l u n + t u o t t a v u u s t a s o + t u o t t a v u u s t a s o n + t u o t t a v u u s t a s o t + t u o t t a v u u s t e k i j ä + t u o t t a v u u s v a h v u u d e n + t u o t t a v u u t e e n + t u o t t a v u u t t a + t u o t t a v u u t t a a n + t u o t t e e k s i + t u o t t e e l l a + t u o t t e e l l e + t u o t t e e l t a + t u o t t e e n + t u o t t e e n s a + t u o t t e e s e e n + t u o t t e e s s a + t u o t t e e s t a + t u o t t e e t + t u o t t e i d e n + t u o t t e i d e n s a + t u o t t e i k s i + t u o t t e i l l a + t u o t t e i l l a a n + t u o t t e i l l e + t u o t t e i l t a + t u o t t e i s i i n + t u o t t e i s i i n s a + t u o t t e i s s a + t u o t t e i s t a a n + t u o t t e i s t u k s i e n + t u o t t e i t a + t u o t t e i t a a n + t u o t t e i t a m m e + t u o t t e l i a a m p a a + t u o t t e l i a a m p i + t u o t t e l i a a m p i a + t u o t t e l i a i m m a s s a + t u o t t e l i a i s u u t e e n + t u o t t i + t u o t t i v a t + t u o t t o a + t u o t t o i h i n + t u o t t o i s a a + t u o t t o i s a m m a t + t u o t t o i s a m m i s t a + t u o t t o i s a m p a a + t u o t t o i s a m p i + t u o t t o i s a m p i a + t u o t t o i s a m p i e n + t u o t t o i s a n + t u o t t o i s a s t a + t u o t t o i s a t + t u o t t o i s i a + t u o t t o i s i m m a n + t u o t t o i s i m m a s t a + t u o t t o i s i m m a t + t u o t t o i s i m m i s t a + t u o t t o i s i m p i a + t u o t t o i s i n + t u o t t o j a + t u o t t o j e n + t u o t t o j o h t a m i n e n + t u o t t o k ä y r ä n + t u o t t o m a h d o l l i s u u d e t + t u o t t o m a r g i n a a l e i s t a + t u o t t o m a r g i n a a l i e n + t u o t t o m a r g i n a a l i i n + t u o t t o p o t e n t i a a l i + t u o t t o p u o l e l l a + t u o t t o t a v o i t e + t u o t t o v a a t i m u k s i i n + t u o t u + t u o t u j a + t u o v a t + t u o v i l l e + t u p a a n t u l i a i s e t + t u p a j u m i + t u p a k a l l e + t u p a k a l t a + t u p a k a n + t u p a k a n a v i l j e l i j ö i l l e + t u p a k a n k a s v a t u k s e s s a + t u p a k a n k a s v a t u s t a + t u p a k a n k u l u t u k s e e n + t u p a k a n k u l u t u k s e n + t u p a k a n k u l u t u k s e s t a + t u p a k a n k u l u t u s + t u p a k a n k ä y t ö n + t u p a k a n l e h t i e n + t u p a k a n l e h t i ä + t u p a k a n m a i n o n n a n + t u p a k a n m a i n o n t a k i e l l o n + t u p a k a n m a i n o n t a k i e l t o a + t u p a k a n m a i n o n t a k i e l t o j a + t u p a k a n p o l t o n + t u p a k a n s a v u + t u p a k a n s a v u a + t u p a k a n s a v u l l e + t u p a k a n s a v u l t a + t u p a k a n s a v u n + t u p a k a n s a v u s t a + t u p a k a n s a v u u n + t u p a k a n s y t y t i n n e s t e + t u p a k a n s y t y t t i m i ä + t u p a k a n t u o j a + t u p a k a n t u o n n i n + t u p a k a n t u o n t i + t u p a k a n t u o t a n n o l l e + t u p a k a n t u o t a n n o n + t u p a k a n t u o t a n n o s s a + t u p a k a n t u o t a n n o s t a + t u p a k a n t u o t a n t o + t u p a k a n t u o t a n t o a + t u p a k a n t u o t a n t o a a n + t u p a k a n t u o t a n t o a l a a + t u p a k a n t u o t a n t o a l u e i l l a + t u p a k a n t u o t a n t o a l u e i l l e + t u p a k a n t u o t a n t o o n + t u p a k a n t u o t t a j a + t u p a k a n t u o t t a j a l l e + t u p a k a n t u o t t a j a t + t u p a k a n t u o t t a j a t k i n + t u p a k a n t u o t t a j i a + t u p a k a n t u o t t a j i e n + t u p a k a n t u o t t a j i i n + t u p a k a n t u o t t a j i l l e + t u p a k a n t u o t t a j i l t a + t u p a k a n v a l m i s t a j i e n + t u p a k a n v a l m i s t a j i i n + t u p a k a n v a l m i s t a j i l l e + t u p a k a n v a l m i s t a j i l t a + t u p a k a n v a l m i s t u k s e l l a + t u p a k a n v a s t a i n e n + t u p a k a n v a s t a i s e n + t u p a k a n v a s t a i s i k s i + t u p a k a n v a s t a i s i s t a + t u p a k a n v a s t a i s t a + t u p a k a n v a s t a i s t e n + t u p a k a n v a s t u s t a j i e n + t u p a k a n v i l j e l i j ä + t u p a k a n v i l j e l i j ä t + t u p a k a n v i l j e l i j ä ä + t u p a k a n v i l j e l i j ö i d e n + t u p a k a n v i l j e l i j ö i l l e + t u p a k a n v i l j e l i j ö i t ä + t u p a k a n v i l j e l y + t u p a k a n v i l j e l y a l a + t u p a k a n v i l j e l y a l u e e l t a + t u p a k a n v i l j e l y a l u e e t + t u p a k a n v i l j e l y a l u e i d e n + t u p a k a n v i l j e l y k i e l t o + t u p a k a n v i l j e l y l l e + t u p a k a n v i l j e l y l l ä + t u p a k a n v i l j e l y m a h d o l l i s u u k s i a + t u p a k a n v i l j e l y n + t u p a k a n v i l j e l y s t ä + t u p a k a n v i l j e l y t u i s t a + t u p a k a n v i l j e l y t u k i e n + t u p a k a n v i l j e l y y n + t u p a k a n v i l j e l y ä + t u p a k a s t a + t u p a k a t o n + t u p a k a t o n t a + t u p a k a t t o m a s t a + t u p a k k a a + t u p a k k a a n + t u p a k k a d i r e k t i i v i + t u p a k k a d i r e k t i i v i i n + t u p a k k a d i r e k t i i v i n + t u p a k k a d i r e k t i i v i s t ä + t u p a k k a j ä r j e s t e l y n + t u p a k k a j ä t i n + t u p a k k a j ä t t e j ä + t u p a k k a j ä t t i + t u p a k k a k a r t o n k i e n + t u p a k k a k a s v e j a + t u p a k k a k a u p a n + t u p a k k a k a u p a s t a + t u p a k k a k a u p p a a + t u p a k k a k e s k u s t e l u + t u p a k k a k e s k u s t e l u n + t u p a k k a k i i n t i ö t + t u p a k k a k o n s e r n i a + t u p a k k a k y s y m y k s e n + t u p a k k a k y s y m y k s e s s ä + t u p a k k a k y s y m y k s e s t ä + t u p a k k a k y s y m y s + t u p a k k a k y s y m y s t ä + t u p a k k a l a a t u j e n + t u p a k k a l a i n s ä ä d ä n n ö n + t u p a k k a l a j e j a + t u p a k k a l a j i k e t t a + t u p a k k a l a j i k k e i d e n + t u p a k k a l o b b a a j i e n + t u p a k k a m a i n o k s e t + t u p a k k a m a i n o n n a l l a + t u p a k k a m a i n o n n a n + t u p a k k a m a i n o n n a s s a + t u p a k k a m a i n o n t a + t u p a k k a m a i n o n t a a + t u p a k k a m a i n o n t a a n + t u p a k k a m a i n o n t a d i r e k t i i v i s t ä + t u p a k k a m a i n o n t a k i e l l o n + t u p a k k a m a i n o n t a k i e l t o + t u p a k k a m a i n o n t a k i e l t o a + t u p a k k a m a r k k i n a t + t u p a k k a m a r k k i n o i d e n + t u p a k k a m a r k k i n o i s t a + t u p a k k a m a r k k i n o i t a + t u p a k k a m i e s + t u p a k k a m o n o p o l e j a + t u p a k k a m o n o p o l i n + t u p a k k a o h j e l m a a n + t u p a k k a p a l k k i o i d e n + t u p a k k a p a l k k i o t a + t u p a k k a p o l i t i i k k a + t u p a k k a p o l i t i i k k a a + t u p a k k a r a h a s t o + t u p a k k a r a h a s t o a + t u p a k k a r a h a s t o n + t u p a k k a r a h a s t o o n + t u p a k k a r a h a s t o s t a + t u p a k k a r a s i a l l e + t u p a k k a r i i p p u v u u d e n + t u p a k k a r i i p p u v u u s + t u p a k k a r i i p p u v u u t e e n + t u p a k k a r i i p p u v u u t t a + t u p a k k a s e k t o r i a + t u p a k k a s e k t o r i l l a + t u p a k k a s e k t o r i n + t u p a k k a s o p i m u k s e n + t u p a k k a s o p i m u s + t u p a k k a s ä i l i ö t ä + t u p a k k a t a k k i + t u p a k k a t a l o u t e e n + t u p a k k a t e h t a i d e n + t u p a k k a t e o l l i s u u d e l l e + t u p a k k a t e o l l i s u u d e n + t u p a k k a t e o l l i s u u d e s s a + t u p a k k a t e o l l i s u u d e s t a + t u p a k k a t e o l l i s u u s + t u p a k k a t e o l l i s u u t e e n + t u p a k k a t e o l l i s u u t t a + t u p a k k a t o n n i n + t u p a k k a t u e s t a + t u p a k k a t u e t + t u p a k k a t u i s t a + t u p a k k a t u k e a + t u p a k k a t u k i + t u p a k k a t u k i a + t u p a k k a t u k i a i s i i n + t u p a k k a t u k i e n + t u p a k k a t u l o t + t u p a k k a t u o t a n n o n + t u p a k k a t u o t a n n o s s a + t u p a k k a t u o t a n n o s t a + t u p a k k a t u o t a n t o + t u p a k k a t u o t a n t o a + t u p a k k a t u o t e + t u p a k k a t u o t e d i r e k t i i v i ä + t u p a k k a t u o t t e e t + t u p a k k a t u o t t e i d e n + t u p a k k a t u o t t e i l l e + t u p a k k a t u o t t e i s i i n + t u p a k k a t u o t t e i s s a + t u p a k k a t u o t t e i s t a + t u p a k k a t u o t t e i t a + t u p a k k a t u t k i m u k s i l l e + t u p a k k a t u t k i m u s + t u p a k k a t y ö n t e k i j ö i d e n + t u p a k k a u u d i s t u k s e n + t u p a k k a u u d i s t u s + t u p a k k a u u d i s t u s t a + t u p a k k a v a j a u s + t u p a k k a v a l v o n t a l a k i + t u p a k k a v e r o + t u p a k k a v e r o a + t u p a k k a v e r o i s t a + t u p a k k a v e r o j e n + t u p a k k a v e r o l l e + t u p a k k a v e r o n + t u p a k k a v e r o t + t u p a k k a v e r o t u l o j a + t u p a k k a v i l j e l m i e n + t u p a k k a v i l j e l m i l l e + t u p a k k a v i l j e l m i ä + t u p a k k a v i l j e l y s t e n + t u p a k k a y h t i ö + t u p a k k a y h t i ö i d e n + t u p a k k a y h t i ö i l l e + t u p a k k a y h t i ö i l t ä + t u p a k k a y h t i ö i t ä + t u p a k k a y h t i ö t + t u p a k k a y l i j ä ä m ä n s ä + t u p a k k a y r i t y k s e l l ä + t u p a k k a y r i t y k s e t + t u p a k k a y r i t y k s i ä + t u p a k k a y r i t y s t e n + t u p a k o i d a a n + t u p a k o i j i e n + t u p a k o i m a a n + t u p a k o i m a t t o m a l l e + t u p a k o i m a t t o m a t + t u p a k o i m a t t o m i a + t u p a k o i m a t t o m i e n + t u p a k o i m a t t o m i l l e + t u p a k o i n e e t + t u p a k o i n n i l l a + t u p a k o i n n i n + t u p a k o i n n i n v a s t a i s e s t a + t u p a k o i n n i n v a s t a i s i i n + t u p a k o i n n i n v a s t a i s t a + t u p a k o i n n i s s a + t u p a k o i n n i s t a + t u p a k o i n t i a + t u p a k o i n t i a l u e + t u p a k o i n t i a l u e e l l a + t u p a k o i n t i a l u e e t + t u p a k o i n t i a l u e i t a + t u p a k o i n t i i n + t u p a k o i n t i k i e l l o i s t a + t u p a k o i n t i k i e l l o l l a + t u p a k o i n t i k i e l l o n + t u p a k o i n t i k i e l l o s t a + t u p a k o i n t i k i e l l o t + t u p a k o i n t i k i e l t o + t u p a k o i n t i k i e l t o a + t u p a k o i n t i k i e l t o j a + t u p a k o i n t i k i e l t o j e n + t u p a k o i n t i k i e l t o k y l t i t + t u p a k o i n t i k y s y m y k s e e n + t u p a k o i n t i k y s y m y s t ä + t u p a k o i n t i o n g e l m a n + t u p a k o i n t i t i l o i s t a + t u p a k o i n u t + t u p a k o i t s i j a a + t u p a k o i t s i j o i d e n + t u p a k o i t s i j o i t a + t u p a k o i v a t + t u p a s v i l l a + t u p l a j ä r k y t y k s e n + t u p l a m o r s i a n + t u p l a t r e f f i t + t u p s u h i r v i + t u p s u p ö l l ö n e n + t u p u t t a m i s p o l i t i i k k a a + t u r b a a n i p ä i n e n + t u r b o e l v y t y k s e n + t u r b o f o l k + t u r b o g e n e r a a t t o r i + t u r h a a + t u r h a k s i + t u r h a l t a + t u r h a l t a k i n + t u r h a n + t u r h a n a i k a i s t a + t u r h a n k i n + t u r h a n p ä i v ä i s t ä + t u r h a t + t u r h a u m i e n + t u r h a u t t a v a a + t u r h a u t t a v a m p a a + t u r h a u t t a v a n a + t u r h a u t t a v a s s a + t u r h a u t t a v i n t a + t u r h a u t u a + t u r h a u t u m a t t a + t u r h a u t u m i s e e n + t u r h a u t u m i s e n + t u r h a u t u m i s e n s a + t u r h a u t u m i s e s t a + t u r h a u t u m i s t a + t u r h a u t u n e e t + t u r h a u t u n e i t a + t u r h a u t u n u t + t u r h a u t u u + t u r h a u t u v a t + t u r h e m p a a + t u r h i a + t u r h i a k i n + t u r h i e n + t u r h i l l a + t u r h i s t a + t u r h u u d e s t a + t u r i s m i a + t u r i s m i s t a + t u r i s t e i n a + t u r i s t e j a + t u r i s t i a i k a n a + t u r i s t i a l u e e l l e + t u r i s t i a l u e i d e n + t u r i s t i a l u e i l l a + t u r i s t i k o h t e i s s a + t u r i s t i l u o k a s s a + t u r i s t i l u o k k a + t u r i s t i l u v u i l l a + t u r i s t i m a t k o j a + t u r i s t i n ä h t ä v y y s + t u r i s t i t + t u r i s t i t k i n + t u r i s t i v i i s u m e i h i n + t u r i s t i v i i s u m e i l l e + t u r i s t i v i i s u m i e n + t u r i s t i v i i s u m i l l a + t u r i s t i v i i s u m i t + t u r k i k s i s t a + t u r k i l l a + t u r k i l l e + t u r k i l l e k i n + t u r k i l t a + t u r k i n + t u r k i n k i e l i n e n + t u r k i n k i e l i s e n + t u r k i n k i e l i s e s t ä + t u r k i n k i e l i s i l l e + t u r k i n k i e l i s i s t ä + t u r k i n k i e l i s t ä + t u r k i n k i n + t u r k i n k r e i k k a l a i s t e n + t u r k i n k y y h k y + t u r k i n m ä n t y + t u r k i n p ä h k i n ä + t u r k i n s u h t e i s s a + t u r k i s e l ä i m i l l e + t u r k i s e l ä i n t e n + t u r k i s e l ä i n t ä + t u r k i s h y ö d y k k e e t + t u r k i s k a u p a l l e + t u r k i s k a u p a n + t u r k i s k a u p a s t a + t u r k i s k a u p p a + t u r k i s k a u p p a a + t u r k i s k a u p p a a n + t u r k i s s a + t u r k i s s a k i n + t u r k i s t a r h a u s + t u r k i s t a r h a u s t a + t u r k i s t e o l l i s u u d e l l e + t u r k i s t e o l l i s u u s + t u r k i s t e o l l i s u u t t a + t u r k i s t u o n n i n + t u r k i s t u o t a n t o o n + t u r k i s t u o t t e e t + t u r k i s t u o t t e i s s a + t u r k i s t u o t t e i t a + t u r k i s y h t i ö i t ä + t u r k k e j a + t u r k k i a + t u r k k i a k i n + t u r k k i e n + t u r k k i i n + t u r k k i k i n + t u r k k i l a i s e n + t u r k k i l a i s e t + t u r k k i l a i s h a l l i n n o n + t u r k k i l a i s i a + t u r k k i l a i s i l l e + t u r k k i l a i s j o u k k o j e n + t u r k k i l a i s j o u k o t + t u r k k i l a i s k i e l t ä + t u r k k i l a i s l a p s e t + t u r k k i l a i s m i e h i t y s t ä + t u r k k i l a i s m i e l i n e n + t u r k k i l a i s n a i n e n + t u r k k i l a i s n a i s t e n + t u r k k i l a i s p o l i i s i e n + t u r k k i l a i s t a + t u r k k i l a i s t e n + t u r k k i l a i s u u d e n + t u r k k i l a i s u u t t a + t u r k k i l a i s v i r a n o m a i s i l l e + t u r k k i l a i s v i r a n o m a i s t e n + t u r k k i l a i s v ä h e m m i s t ö + t u r k k i l a i s v ä h e m m i s t ö n + t u r k k i l a i s y h t e i s ö j e n + t u r k k i l a i s y h t e i s ö n + t u r k k i l a i s y h t e i s ö s t ä + t u r k k i l a i s y h t e i s ö ö n + t u r k k i l a i s ä ä n e s t ä j i e n + t u r k m e e n i h a l l i t u s + t u r k m e e n i t + t u r k m e e n i v i r a n o m a i s i l l e + t u r k m e e n i v i r a n o m a i s t e n + t u r k m e n i s t a n i l a i s t e n + t u r k o o s i k a r d i n a a l i + t u r k o o s i k i r j o a h v e n + t u r k o o s i k o t i n g a + t u r k o o s i k o t t a r a i n e n + t u r k o o s i k u r k k u k o l i b r i + t u r k o o s i n a a k k a + t u r k o o s i s i e p p o + t u r k o o s i s u k k a k o l i b r i + t u r k o o s i v i i r i p y r s t ö + t u r m e l e e + t u r m e l e m i s e k s i + t u r m e l t u n e i m m i s t a + t u r m i o l l i s t a + t u r p e e n k ä y t t ö + t u r p e e n n o s t o + t u r p e e n o t t o + t u r s k a k a l a s t u k s e n + t u r s k a k a n n a n + t u r s k a k a n n a s t a + t u r s k a k a n n a t + t u r s k a k a n n o i s s a + t u r s k a k a n n o i s t a + t u r s k a k a n t a + t u r s k a k a n t a a + t u r s k a k a n t a a n + t u r s k a k a n t o i h i n + t u r s k a k a n t o j a + t u r s k a k a n t o j e n + t u r s k a k a u d e n + t u r s k a k i i n t i ö + t u r s k a k i i n t i ö i d e n + t u r s k a k i i n t i ö i t ä + t u r s k a k i i n t i ö n + t u r s k a k i i n t i ö s t ä + t u r s k a k r i i s i + t u r s k a k r i i s i s t ä + t u r s k a k r i i s i ä + t u r s k a k y s y m y k s e e n + t u r s k a l a i v a s t o m m e + t u r s k a m ä ä r ä ä + t u r s k a n + t u r s k a n k a a n + t u r s k a n k a l a s t a j a m m e + t u r s k a n k a l a s t a j i e n + t u r s k a n k a l a s t u k s e n + t u r s k a n k a l a s t u s + t u r s k a n k a l a s t u s t a + t u r s k a n p y y n n i n + t u r s k a n p y y n n i s t ä + t u r s k a n p y y n n ö n + t u r s k a n p y y n t i + t u r s k a n p y y n t i k i e l l o s t a + t u r s k a n p y y n t i ä + t u r s k a p o p u l a a t i o i t a + t u r s k a s a a l i i t a + t u r s k a s o d a t + t u r s k a s o t a + t u r s k a s o t i a + t u r s k a s t a + t u r s k a s u k u p o l v e t + t u r s k a t + t u r s k a v a r o j e n + t u r s k i s t a + t u r v a a m a a n + t u r v a a m a l l a + t u r v a a m a t t a + t u r v a a m i n e n + t u r v a a m i s e e n + t u r v a a m i s e k s i + t u r v a a m i s e l l a + t u r v a a m i s e n + t u r v a a m i s e s s a + t u r v a a m i s e s t a + t u r v a a m i s h a n k e t t a + t u r v a a m i s j o u k k o j a + t u r v a a m i s k u s t a n n u k s e t + t u r v a a m i s t a + t u r v a a m i s t o i m e n p i t e i d e n + t u r v a a m i s t o i m e n p i t e i s i i n + t u r v a a m i s t o i m e n p i t e i t ä + t u r v a a m i s t o i m i + t u r v a a m i s t o i m i a + t u r v a a m m e + t u r v a a v a t + t u r v a b y r o k r a t i a m m e + t u r v a e s t e i d e n + t u r v a e t ä i s y y d e t + t u r v a e t ä i s y y s s u o s i t u k s e t + t u r v a h e n k i l ö i t ä + t u r v a h e n k i l ö k u n t a + t u r v a i s t u i m i a + t u r v a i s t u i n + t u r v a i s t u i n t e n + t u r v a j a l k i n e + t u r v a j o u k k o j a + t u r v a j o u k k o j a a n + t u r v a j o u k k o j e n + t u r v a j o u k o i l l e + t u r v a j o u k o i s t a + t u r v a j o u k o n + t u r v a j o u k o t + t u r v a j ä r j e s t e l m i e n + t u r v a j ä r j e s t e l m i i n + t u r v a j ä r j e s t e l m i l l ä + t u r v a j ä r j e s t e l m i s t ä + t u r v a j ä r j e s t e l m i ä + t u r v a j ä r j e s t e l m ä + t u r v a j ä r j e s t e l m ä l l e + t u r v a j ä r j e s t e l m ä l l ä + t u r v a j ä r j e s t e l m ä m m e + t u r v a j ä r j e s t e l m ä n + t u r v a j ä r j e s t e l m ä s t ä + t u r v a j ä r j e s t e l m ä s t ä m m e + t u r v a j ä r j e s t e l m ä t + t u r v a j ä r j e s t e l m ä ä + t u r v a j ä r j e s t e l m ä ä m m e + t u r v a j ä r j e s t e l m ä ä n + t u r v a j ä r j e s t e l y i h i n + t u r v a j ä r j e s t e l y i l l ä + t u r v a j ä r j e s t e l y i n + t u r v a j ä r j e s t e l y i s t ä + t u r v a j ä r j e s t e l y j e n + t u r v a j ä r j e s t ö i s s ä + t u r v a k a m e r o i t a + t u r v a k a t t o + t u r v a k e i n o i s t a + t u r v a k e i n o j a + t u r v a k e i n o s t a + t u r v a k e r r o i n + t u r v a k e s k u k s e n + t u r v a k e s k u k s i a + t u r v a k o d e i s t a + t u r v a k o d i t + t u r v a k o t e i h i n + t u r v a k o t e j a + t u r v a k o t i + t u r v a k o t i e n + t u r v a k o t i i n + t u r v a k r i t e e r e i t ä + t u r v a k s i + t u r v a k y l t t e j ä + t u r v a k ä y t ä v i ä + t u r v a k ä y t ä v ä + t u r v a k ö y d e k s i + t u r v a l a i t e + t u r v a l a i t t e e l l a + t u r v a l a i t t e e t + t u r v a l a i t t e i d e n + t u r v a l a i t t e i s t a + t u r v a l a i t t e i t a + t u r v a l a s i + t u r v a l a u s e k e + t u r v a l a u s e k e t t a + t u r v a l a u s e k k e e l l a + t u r v a l a u s e k k e e l l e + t u r v a l a u s e k k e e n + t u r v a l a u s e k k e e s s a + t u r v a l a u s e k k e e s t a + t u r v a l a u s e k k e e t + t u r v a l a u s e k k e i d e n + t u r v a l a u s e k k e i d e n k i n + t u r v a l a u s e k k e i l l e + t u r v a l a u s e k k e i s i i n + t u r v a l a u s e k k e i s s a + t u r v a l a u s e k k e i s t a + t u r v a l a u s e k k e i t a + t u r v a l i i k e + t u r v a l l i s e e n + t u r v a l l i s e k s i + t u r v a l l i s e l l e + t u r v a l l i s e m m a k s i + t u r v a l l i s e m m a l l a + t u r v a l l i s e m m a n + t u r v a l l i s e m m a s s a + t u r v a l l i s e m m a t + t u r v a l l i s e m m i k s i + t u r v a l l i s e m m i l l a + t u r v a l l i s e m m i l l e + t u r v a l l i s e m m i n + t u r v a l l i s e m m i s t a + t u r v a l l i s e m p a a + t u r v a l l i s e m p a a n + t u r v a l l i s e m p i + t u r v a l l i s e m p i a + t u r v a l l i s e m p i e n + t u r v a l l i s e n + t u r v a l l i s e n a + t u r v a l l i s e s s a + t u r v a l l i s e t + t u r v a l l i s i a + t u r v a l l i s i i n + t u r v a l l i s i k s i + t u r v a l l i s i m m a n + t u r v a l l i s i m m a t + t u r v a l l i s i m p i a + t u r v a l l i s i m p i i n + t u r v a l l i s i n + t u r v a l l i s i n a + t u r v a l l i s i n t a k i n + t u r v a l l i s i s s a + t u r v a l l i s i s t a + t u r v a l l i s p o l i t i i k a n + t u r v a l l i s t e n + t u r v a l l i s u u d e l l a + t u r v a l l i s u u d e l l e + t u r v a l l i s u u d e n + t u r v a l l i s u u d e n k i n + t u r v a l l i s u u d e n t a r v e + t u r v a l l i s u u d e n t a r v e t t a + t u r v a l l i s u u d e n t a v o i t t e l u n + t u r v a l l i s u u d e n t u n n e + t u r v a l l i s u u d e n t u n n e t t a + t u r v a l l i s u u d e n t u n t e e m m e + t u r v a l l i s u u d e n t u n t e e s e e n + t u r v a l l i s u u d e s s a + t u r v a l l i s u u d e s s a m m e + t u r v a l l i s u u d e s t a + t u r v a l l i s u u d e s t a a n + t u r v a l l i s u u d e s t a m m e + t u r v a l l i s u u s a g e n t t i + t u r v a l l i s u u s a j a t t e l u a + t u r v a l l i s u u s a j a t t e l u l l e + t u r v a l l i s u u s a j a t t e l u n + t u r v a l l i s u u s a l a + t u r v a l l i s u u s a l a a + t u r v a l l i s u u s a l a l l a + t u r v a l l i s u u s a l a l l e + t u r v a l l i s u u s a l a n + t u r v a l l i s u u s a l o i t t e e t + t u r v a l l i s u u s a l o i t t e i s t a + t u r v a l l i s u u s a l o j a + t u r v a l l i s u u s a l o j e n + t u r v a l l i s u u s a l u e + t u r v a l l i s u u s a l u e e n + t u r v a l l i s u u s a l u e e s t a + t u r v a l l i s u u s a l u e t t a + t u r v a l l i s u u s a n a l y y s i + t u r v a l l i s u u s a r g u m e n t t i a + t u r v a l l i s u u s a r k k i t e h t u u r i a + t u r v a l l i s u u s a r v i o + t u r v a l l i s u u s a r v i o i n n e i l l e + t u r v a l l i s u u s a r v i o i n n e i s t a + t u r v a l l i s u u s a r v i o i n n i n + t u r v a l l i s u u s a r v i o i n n i t + t u r v a l l i s u u s a r v i o i n t e j a + t u r v a l l i s u u s a r v i o i n t i a + t u r v a l l i s u u s a r v i o i n t i i n + t u r v a l l i s u u s a r v i o i n t i j ä r j e s t e l m ä n + t u r v a l l i s u u s a r v i o t a + t u r v a l l i s u u s a s e t u k s e k s i + t u r v a l l i s u u s a s e t u k s e n + t u r v a l l i s u u s a s i a + t u r v a l l i s u u s a s i a a + t u r v a l l i s u u s a s i a l i s t a l l a + t u r v a l l i s u u s a s i a n + t u r v a l l i s u u s a s i a n t u n t i j a t + t u r v a l l i s u u s a s i a n t u n t i j o i d e n + t u r v a l l i s u u s a s i a n t u n t i j o i t a n n e + t u r v a l l i s u u s a s i a s s a + t u r v a l l i s u u s a s i a t + t u r v a l l i s u u s a s i o i d e n + t u r v a l l i s u u s a s i o i h i n + t u r v a l l i s u u s a s i o i s s a + t u r v a l l i s u u s a s i o i s t a + t u r v a l l i s u u s a s i o i t a + t u r v a l l i s u u s a s t e + t u r v a l l i s u u s a s t e e t + t u r v a l l i s u u s a u k k o a + t u r v a l l i s u u s a u k k o j a + t u r v a l l i s u u s d e m o n s t r a a t i o + t u r v a l l i s u u s d i r e k t i i v i + t u r v a l l i s u u s d i r e k t i i v i e n + t u r v a l l i s u u s d i r e k t i i v i n + t u r v a l l i s u u s d o k t r i i n i a + t u r v a l l i s u u s d o k t r i i n i n + t u r v a l l i s u u s e d e l l y t y k s e t + t u r v a l l i s u u s e d e l l y t y k s i e n + t u r v a l l i s u u s e d e l l y t y k s i i n + t u r v a l l i s u u s e d e l l y t y s t e n + t u r v a l l i s u u s e d u i s s a + t u r v a l l i s u u s e d u i s t a + t u r v a l l i s u u s e d u t + t u r v a l l i s u u s e h d o i s t a + t u r v a l l i s u u s e h d o t u k s e t + t u r v a l l i s u u s e h t o j a + t u r v a l l i s u u s e h t o j e n + t u r v a l l i s u u s e l e m e n t t i + t u r v a l l i s u u s e l i m i l l e + t u r v a l l i s u u s e l i n t e n + t u r v a l l i s u u s e p ä i l y j e n + t u r v a l l i s u u s e r i t e l m i ä + t u r v a l l i s u u s e r i t e l m ä t + t u r v a l l i s u u s e t u + t u r v a l l i s u u s e t u i h i n + t u r v a l l i s u u s e t u j a + t u r v a l l i s u u s e t u j a a n + t u r v a l l i s u u s e t u j e n + t u r v a l l i s u u s e t u n s a + t u r v a l l i s u u s f o o r u m i e n + t u r v a l l i s u u s h a a s t e + t u r v a l l i s u u s h a a s t e e n + t u r v a l l i s u u s h a a s t e e t + t u r v a l l i s u u s h a a s t e i d e n + t u r v a l l i s u u s h a a s t e i s i i n + t u r v a l l i s u u s h a a s t e i s t a + t u r v a l l i s u u s h a a s t e i t a + t u r v a l l i s u u s h a l l i n t o a + t u r v a l l i s u u s h a l l i n t o k o o d i + t u r v a l l i s u u s h a n k e + t u r v a l l i s u u s h e n k i l ö k u n n a l l e + t u r v a l l i s u u s h e n k i l ö k u n n a n + t u r v a l l i s u u s h e n k i l ö s t ö m m e + t u r v a l l i s u u s h e n k i l ö s t ö n + t u r v a l l i s u u s h e n k i l ö s t ö t + t u r v a l l i s u u s h e n k i l ö s t ö ä + t u r v a l l i s u u s h i s t o r i a + t u r v a l l i s u u s h u i p p u k o k o u k s e k s i + t u r v a l l i s u u s h u o l e t + t u r v a l l i s u u s h u o l i a + t u r v a l l i s u u s h u o l i i n + t u r v a l l i s u u s h u o l i s t a a n + t u r v a l l i s u u s h y ö t y j ä + t u r v a l l i s u u s h y ö t y y n + t u r v a l l i s u u s i d e n t i t e e t t i + t u r v a l l i s u u s i n d i k a a t t o r e i l l e + t u r v a l l i s u u s i n f r a s t r u k t u u r i a + t u r v a l l i s u u s i n f r a s t r u k t u u r i n + t u r v a l l i s u u s i n n o v a a t i o t + t u r v a l l i s u u s i n t r e s s e i h i n + t u r v a l l i s u u s i n t r e s s i e n + t u r v a l l i s u u s i n t r e s s i m m e + t u r v a l l i s u u s i n t r e s s i n + t u r v a l l i s u u s i n t r e s s i t + t u r v a l l i s u u s j a k s o o n + t u r v a l l i s u u s j o h t a m i n e n + t u r v a l l i s u u s j o h t a m i s e s t a + t u r v a l l i s u u s j o h t a m i s j ä r j e s t e l m i e n + t u r v a l l i s u u s j o h t a m i s j ä r j e s t e l m i ä + t u r v a l l i s u u s j o h t a m i s j ä r j e s t e l m ä n + t u r v a l l i s u u s j o h t a m i s s ä ä n n ö s t ö ä + t u r v a l l i s u u s j o h t a m i s t a + t u r v a l l i s u u s j o h t o m m e + t u r v a l l i s u u s j o u k k o i h i n + t u r v a l l i s u u s j o u k k o j a + t u r v a l l i s u u s j o u k k o j a m m e + t u r v a l l i s u u s j o u k k o j e m m e + t u r v a l l i s u u s j o u k k o j e n + t u r v a l l i s u u s j o u k k o j e n s a + t u r v a l l i s u u s j o u k k o m m e + t u r v a l l i s u u s j o u k k o n s a + t u r v a l l i s u u s j o u k o i l l e + t u r v a l l i s u u s j o u k o i n + t u r v a l l i s u u s j o u k o i s s a + t u r v a l l i s u u s j o u k o t + t u r v a l l i s u u s j ä r j e s t e l m i e n + t u r v a l l i s u u s j ä r j e s t e l m i i n + t u r v a l l i s u u s j ä r j e s t e l m i l l e + t u r v a l l i s u u s j ä r j e s t e l m i l l ä + t u r v a l l i s u u s j ä r j e s t e l m i s s ä m m e + t u r v a l l i s u u s j ä r j e s t e l m i s t ä + t u r v a l l i s u u s j ä r j e s t e l m i ä + t u r v a l l i s u u s j ä r j e s t e l m i ä ä n + t u r v a l l i s u u s j ä r j e s t e l m ä + t u r v a l l i s u u s j ä r j e s t e l m ä l l e + t u r v a l l i s u u s j ä r j e s t e l m ä l l ä + t u r v a l l i s u u s j ä r j e s t e l m ä m m e + t u r v a l l i s u u s j ä r j e s t e l m ä n + t u r v a l l i s u u s j ä r j e s t e l m ä n s ä + t u r v a l l i s u u s j ä r j e s t e l m ä s s ä + t u r v a l l i s u u s j ä r j e s t e l m ä s t ä + t u r v a l l i s u u s j ä r j e s t e l m ä t + t u r v a l l i s u u s j ä r j e s t e l m ä ä + t u r v a l l i s u u s j ä r j e s t e l m ä ä n + t u r v a l l i s u u s j ä r j e s t e l y i h i n + t u r v a l l i s u u s j ä r j e s t e l y i l l e + t u r v a l l i s u u s j ä r j e s t e l y i s s ä + t u r v a l l i s u u s j ä r j e s t e l y i s t ä + t u r v a l l i s u u s j ä r j e s t e l y j e n + t u r v a l l i s u u s j ä r j e s t e l y j ä + t u r v a l l i s u u s j ä r j e s t e l y t + t u r v a l l i s u u s j ä r j e s t e l y ä + t u r v a l l i s u u s j ä r j e s t ö + t u r v a l l i s u u s j ä r j e s t ö i h i n + t u r v a l l i s u u s j ä r j e s t ö j e n + t u r v a l l i s u u s j ä r j e s t ö j ä + t u r v a l l i s u u s j ä r j e s t ö k s i + t u r v a l l i s u u s j ä r j e s t ö l l e + t u r v a l l i s u u s j ä r j e s t ö m m e + t u r v a l l i s u u s j ä r j e s t ö n + t u r v a l l i s u u s k a m p a n j a a n + t u r v a l l i s u u s k a p a s i t e e t t i l a u s e k e + t u r v a l l i s u u s k a t s a u s + t u r v a l l i s u u s k e h i t y k s e s t ä + t u r v a l l i s u u s k e h i t y s t y ö n + t u r v a l l i s u u s k e h y k s e l l e + t u r v a l l i s u u s k e h y k s e s t ä + t u r v a l l i s u u s k e h y s + t u r v a l l i s u u s k e h y s t ä + t u r v a l l i s u u s k e i n o j e n + t u r v a l l i s u u s k e r t o m u k s i a + t u r v a l l i s u u s k e s k u k s e n + t u r v a l l i s u u s k e s k u s + t u r v a l l i s u u s k e s k u s t e l u + t u r v a l l i s u u s k e s k u s t e l u a + t u r v a l l i s u u s k e t j u a + t u r v a l l i s u u s k e t j u n + t u r v a l l i s u u s k e t j u u n + t u r v a l l i s u u s k i r j a + t u r v a l l i s u u s k i r j a n p i t o a + t u r v a l l i s u u s k l a u s u u l i s t a + t u r v a l l i s u u s k o h t e i s i i n + t u r v a l l i s u u s k o k o u k s e s s a + t u r v a l l i s u u s k o m i t e a + t u r v a l l i s u u s k o m i t e a l l e + t u r v a l l i s u u s k o m i t e a n + t u r v a l l i s u u s k o m i t e a s t a + t u r v a l l i s u u s k o m i t e o i t a + t u r v a l l i s u u s k o n e i s t o + t u r v a l l i s u u s k o n e i s t o n + t u r v a l l i s u u s k o n e i s t o s t a + t u r v a l l i s u u s k o n f e r e n s s i + t u r v a l l i s u u s k o n f e r e n s s i a + t u r v a l l i s u u s k o n f e r e n s s i i n + t u r v a l l i s u u s k o n f e r e n s s i s s a + t u r v a l l i s u u s k o n f l i k t i e n + t u r v a l l i s u u s k o n s e p t i + t u r v a l l i s u u s k o n s e p t i a + t u r v a l l i s u u s k o o r d i n a a t t o r i n + t u r v a l l i s u u s k o o r d i n o i j a + t u r v a l l i s u u s k o u l u t u s + t u r v a l l i s u u s k o u l u t u s t a + t u r v a l l i s u u s k o u l u t u s t o i m e t + t u r v a l l i s u u s k r i i s e j ä + t u r v a l l i s u u s k r i i s i + t u r v a l l i s u u s k r i i s i l l ä + t u r v a l l i s u u s k r i i s i s t ä + t u r v a l l i s u u s k r i t e e r e i h i n + t u r v a l l i s u u s k r i t e e r e i t ä + t u r v a l l i s u u s k r i t e e r e j ä + t u r v a l l i s u u s k r i t e e r i e n + t u r v a l l i s u u s k r i t e e r i t + t u r v a l l i s u u s k u l t t u u r i + t u r v a l l i s u u s k u l t t u u r i a + t u r v a l l i s u u s k u l t t u u r i a m m e + t u r v a l l i s u u s k u l t t u u r i i n + t u r v a l l i s u u s k u l t t u u r i l l a + t u r v a l l i s u u s k u l t t u u r i n + t u r v a l l i s u u s k u l t t u u r i s s a + t u r v a l l i s u u s k u l u i s t a + t u r v a l l i s u u s k u l u j e n + t u r v a l l i s u u s k u l u t + t u r v a l l i s u u s k u m p p a n i + t u r v a l l i s u u s k u m p p a n u u d e n + t u r v a l l i s u u s k u m p p a n u u d e t + t u r v a l l i s u u s k u m p p a n u u s + t u r v a l l i s u u s k u m p p a n u u t e e n + t u r v a l l i s u u s k u m p p a n u u t t a + t u r v a l l i s u u s k u s t a n n u k s e t + t u r v a l l i s u u s k u s t a n n u k s i s s a + t u r v a l l i s u u s k u s t a n n u k s i s t a + t u r v a l l i s u u s k u s t a n n u s t e n + t u r v a l l i s u u s k u v a n + t u r v a l l i s u u s k y s y m y k s e e n + t u r v a l l i s u u s k y s y m y k s e k s i + t u r v a l l i s u u s k y s y m y k s e n + t u r v a l l i s u u s k y s y m y k s e n ä + t u r v a l l i s u u s k y s y m y k s e s t ä + t u r v a l l i s u u s k y s y m y k s e t + t u r v a l l i s u u s k y s y m y k s i i n + t u r v a l l i s u u s k y s y m y k s i l l e + t u r v a l l i s u u s k y s y m y k s i l l ä + t u r v a l l i s u u s k y s y m y k s i s s ä + t u r v a l l i s u u s k y s y m y k s i s t ä + t u r v a l l i s u u s k y s y m y k s i ä + t u r v a l l i s u u s k y s y m y k s i ä m m e + t u r v a l l i s u u s k y s y m y s + t u r v a l l i s u u s k y s y m y s t e n + t u r v a l l i s u u s k y s y m y s t ä + t u r v a l l i s u u s k ä s i t e t t ä + t u r v a l l i s u u s k ä s i t t e e n + t u r v a l l i s u u s k ä s i t y k s e e n + t u r v a l l i s u u s k ä s i t y k s e m m e + t u r v a l l i s u u s k ä s i t y k s e n + t u r v a l l i s u u s k ä s i t y k s e n s ä + t u r v a l l i s u u s k ä s i t y s t ä + t u r v a l l i s u u s k ä y t ä n n ö i s t ä + t u r v a l l i s u u s k ä y t ä n t ö i h i n + t u r v a l l i s u u s k ä y t ä n t ö j ä + t u r v a l l i s u u s l a i n + t u r v a l l i s u u s l a i n s ä ä d ä n n ö n + t u r v a l l i s u u s l a i n s ä ä d ä n n ö s s ä + t u r v a l l i s u u s l a i n s ä ä d ä n n ö s t ä + t u r v a l l i s u u s l a i n s ä ä d ä n t ö + t u r v a l l i s u u s l a i n s ä ä d ä n t ö p a k e t t e j a + t u r v a l l i s u u s l a i n s ä ä d ä n t ö ä + t u r v a l l i s u u s l a i t t e i s t a + t u r v a l l i s u u s l a i t t e i t a + t u r v a l l i s u u s l a k i + t u r v a l l i s u u s l a k i a + t u r v a l l i s u u s l a k i e n + t u r v a l l i s u u s l a u s e k e t t a + t u r v a l l i s u u s l a u s e k k e e n + t u r v a l l i s u u s l i i t o n + t u r v a l l i s u u s l u o k i t u k s e n + t u r v a l l i s u u s l u o k k i i n + t u r v a l l i s u u s l ä h t ö i n e n + t u r v a l l i s u u s l ä h t ö i s e m p ä ä + t u r v a l l i s u u s l ä h t ö i s i s t ä + t u r v a l l i s u u s l ä h t ö i s t ä + t u r v a l l i s u u s m a k s u j e n + t u r v a l l i s u u s m a k s u t + t u r v a l l i s u u s m a l l e i h i n + t u r v a l l i s u u s m a l l i + t u r v a l l i s u u s m a l l i n + t u r v a l l i s u u s m a r g i n a a l i + t u r v a l l i s u u s m a r g i n a a l i n + t u r v a l l i s u u s m a r k k i n o i l l a + t u r v a l l i s u u s m a r k k i n o i l l e + t u r v a l l i s u u s m a t e r i a a l i a + t u r v a l l i s u u s m a t e r i a a l i e n + t u r v a l l i s u u s m a t k o j e n + t u r v a l l i s u u s m e k a n i s m i + t u r v a l l i s u u s m e n e t e l m ä t + t u r v a l l i s u u s m e n e t t e l y i h i n + t u r v a l l i s u u s m e n e t t e l y i s t ä + t u r v a l l i s u u s m e n e t t e l y j e n + t u r v a l l i s u u s m e n o j a + t u r v a l l i s u u s m e n o j e n + t u r v a l l i s u u s m e n o t + t u r v a l l i s u u s m e r k i n + t u r v a l l i s u u s m e r k i n n ä n + t u r v a l l i s u u s m e r k i n n ä s t ä + t u r v a l l i s u u s m e r k i n n ä t + t u r v a l l i s u u s m e r k i n t ä + t u r v a l l i s u u s m e r k i n t ä n ä + t u r v a l l i s u u s m e r k i n t ä ä + t u r v a l l i s u u s m i e l e s s ä + t u r v a l l i s u u s m i n i s t e r i ö + t u r v a l l i s u u s m i n i s t e r i ö n + t u r v a l l i s u u s m u u r i a + t u r v a l l i s u u s m u u r i n s a + t u r v a l l i s u u s m ä ä r ä y k s e t + t u r v a l l i s u u s m ä ä r ä y k s i e n + t u r v a l l i s u u s m ä ä r ä y k s i i n + t u r v a l l i s u u s m ä ä r ä y k s i l l ä + t u r v a l l i s u u s m ä ä r ä y k s i s t ä + t u r v a l l i s u u s m ä ä r ä y k s i ä + t u r v a l l i s u u s m ä ä r ä y s + t u r v a l l i s u u s m ä ä r ä y s t e m m e + t u r v a l l i s u u s m ä ä r ä y s t e n + t u r v a l l i s u u s n e u v o a + t u r v a l l i s u u s n e u v o n + t u r v a l l i s u u s n e u v o n a n t a j a + t u r v a l l i s u u s n e u v o n a n t a j a n + t u r v a l l i s u u s n e u v o n a n t a j a n a + t u r v a l l i s u u s n e u v o n a n t a j a n s a + t u r v a l l i s u u s n e u v o n a n t a j a t + t u r v a l l i s u u s n e u v o n a n t a j i a + t u r v a l l i s u u s n e u v o n a n t a j i e n + t u r v a l l i s u u s n e u v o n a n t a j i k s i + t u r v a l l i s u u s n e u v o n a n t a j i l l e + t u r v a l l i s u u s n e u v o s t o + t u r v a l l i s u u s n e u v o s t o a + t u r v a l l i s u u s n e u v o s t o i h i n + t u r v a l l i s u u s n e u v o s t o l l a + t u r v a l l i s u u s n e u v o s t o l l e + t u r v a l l i s u u s n e u v o s t o l t a + t u r v a l l i s u u s n e u v o s t o n + t u r v a l l i s u u s n e u v o s t o n s a + t u r v a l l i s u u s n e u v o s t o o n + t u r v a l l i s u u s n e u v o s t o p a i k k a a + t u r v a l l i s u u s n e u v o s t o s s a + t u r v a l l i s u u s n e u v o s t o s s a k a a n + t u r v a l l i s u u s n e u v o s t o s s a k i n + t u r v a l l i s u u s n e u v o s t o s t a + t u r v a l l i s u u s n e u v o t t e l u i l l e + t u r v a l l i s u u s n e u v o t t e l u n + t u r v a l l i s u u s n o r m e i h i n + t u r v a l l i s u u s n o r m e i l l a + t u r v a l l i s u u s n o r m e i s t a + t u r v a l l i s u u s n o r m e j a + t u r v a l l i s u u s n o r m e j a a n + t u r v a l l i s u u s n o r m i a s i a + t u r v a l l i s u u s n o r m i e m m e + t u r v a l l i s u u s n o r m i e n + t u r v a l l i s u u s n o r m i m m e + t u r v a l l i s u u s n o r m i o h j e l m a + t u r v a l l i s u u s n o r m i t + t u r v a l l i s u u s n ä k e m y k s e s t ä + t u r v a l l i s u u s n ä k e m y k s e t + t u r v a l l i s u u s n ä k e m y s t ä + t u r v a l l i s u u s n ä k ö k a n n a l t a + t u r v a l l i s u u s n ä k ö k o h d a s t a + t u r v a l l i s u u s n ä k ö k o h d a t + t u r v a l l i s u u s n ä k ö k o h d i l l e + t u r v a l l i s u u s n ä k ö k o h d i s t a + t u r v a l l i s u u s n ä k ö k o h t a + t u r v a l l i s u u s n ä k ö k o h t a a + t u r v a l l i s u u s n ä k ö k o h t a a n + t u r v a l l i s u u s n ä k ö k o h t i a + t u r v a l l i s u u s n ä k ö k o h t i e n + t u r v a l l i s u u s n ä k ö k o h t i i n + t u r v a l l i s u u s n ä k ö k u l m a a + t u r v a l l i s u u s n ä k ö k u l m a a n + t u r v a l l i s u u s n ä k ö k u l m a n + t u r v a l l i s u u s n ä k ö k u l m a s t a + t u r v a l l i s u u s n ä k ö k u l m a s t a m m e + t u r v a l l i s u u s n ä k ö k u l m a t + t u r v a l l i s u u s n ä k ö k u l m i e n + t u r v a l l i s u u s o h j e e t + t u r v a l l i s u u s o h j e i t a + t u r v a l l i s u u s o h j e l m a a + t u r v a l l i s u u s o h j e l m a a m m e + t u r v a l l i s u u s o h j e l m a a n + t u r v a l l i s u u s o h j e l m a k s i + t u r v a l l i s u u s o h j e l m a n + t u r v a l l i s u u s o h j e l m a s s a + t u r v a l l i s u u s o h j e l m a s s a m m e + t u r v a l l i s u u s o h j e l m a s t a + t u r v a l l i s u u s o h j e l m i a + t u r v a l l i s u u s o l o i s s a + t u r v a l l i s u u s o l o j a + t u r v a l l i s u u s o l o j e n + t u r v a l l i s u u s o l o s u h t e e t + t u r v a l l i s u u s o l o s u h t e i d e n + t u r v a l l i s u u s o l o s u h t e i t a + t u r v a l l i s u u s o l o s u h t e i t a a n + t u r v a l l i s u u s o l o t + t u r v a l l i s u u s o m i n a i s u u d e t + t u r v a l l i s u u s o m i n a i s u u k s i a + t u r v a l l i s u u s o m i n a i s u u k s i e n s a + t u r v a l l i s u u s o m i n a i s u u k s i n + t u r v a l l i s u u s o m i n a i s u u s + t u r v a l l i s u u s o n g e l m a + t u r v a l l i s u u s o n g e l m a a + t u r v a l l i s u u s o n g e l m a a n + t u r v a l l i s u u s o n g e l m a n + t u r v a l l i s u u s o n g e l m a n a + t u r v a l l i s u u s o n g e l m a n s a + t u r v a l l i s u u s o n g e l m a s t a + t u r v a l l i s u u s o n g e l m a t + t u r v a l l i s u u s o n g e l m i a + t u r v a l l i s u u s o n g e l m i e n + t u r v a l l i s u u s o n g e l m i i m m e + t u r v a l l i s u u s o n g e l m i i n + t u r v a l l i s u u s o n g e l m i l t a + t u r v a l l i s u u s o n g e l m i s t a + t u r v a l l i s u u s o p e r a a t i o i d e n + t u r v a l l i s u u s o p e r a a t i o i h i n + t u r v a l l i s u u s o p e r a a t i o n + t u r v a l l i s u u s o p e r a a t i o s t a + t u r v a l l i s u u s o p e r a a t i o t + t u r v a l l i s u u s o p p a i t a + t u r v a l l i s u u s o p p i n s a + t u r v a l l i s u u s o r g a n i s a a t i o k s i + t u r v a l l i s u u s o r g a n i s a a t i o n + t u r v a l l i s u u s o s a + t u r v a l l i s u u s o s a s t o n + t u r v a l l i s u u s p a i n o t t e i n e n + t u r v a l l i s u u s p a k e t i n + t u r v a l l i s u u s p a k e t i s s a + t u r v a l l i s u u s p a k e t t i + t u r v a l l i s u u s p a k e t t i a + t u r v a l l i s u u s p a k e t t i i n + t u r v a l l i s u u s p a l v e l u + t u r v a l l i s u u s p a l v e l u a + t u r v a l l i s u u s p a l v e l u i d e n + t u r v a l l i s u u s p a l v e l u i h i n + t u r v a l l i s u u s p a l v e l u i l l a + t u r v a l l i s u u s p a l v e l u i l l e + t u r v a l l i s u u s p a l v e l u i s t a + t u r v a l l i s u u s p a l v e l u i t a + t u r v a l l i s u u s p a l v e l u j a + t u r v a l l i s u u s p a l v e l u j a a n + t u r v a l l i s u u s p a l v e l u j e m m e + t u r v a l l i s u u s p a l v e l u j e n + t u r v a l l i s u u s p a l v e l u l l e + t u r v a l l i s u u s p a l v e l u l l e m m e + t u r v a l l i s u u s p a l v e l u l t a + t u r v a l l i s u u s p a l v e l u m m e + t u r v a l l i s u u s p a l v e l u n + t u r v a l l i s u u s p a l v e l u n s a + t u r v a l l i s u u s p a l v e l u s s a + t u r v a l l i s u u s p a l v e l u s t a + t u r v a l l i s u u s p a l v e l u t + t u r v a l l i s u u s p a l v e l u u n + t u r v a l l i s u u s p a l v e l u y k s i k ö i t ä + t u r v a l l i s u u s p a r a n n u k s i a + t u r v a l l i s u u s p e r i a a t e + t u r v a l l i s u u s p e r i a a t t e e n + t u r v a l l i s u u s p e r i a a t t e e n a + t u r v a l l i s u u s p e r i a a t t e e t + t u r v a l l i s u u s p e r i a a t t e i d e n + t u r v a l l i s u u s p e r i a a t t e i t a + t u r v a l l i s u u s p e r u s t a + t u r v a l l i s u u s p e r u s t e e t + t u r v a l l i s u u s p e r u s t e i d e n + t u r v a l l i s u u s p e r u s t e i l l a + t u r v a l l i s u u s p e r u s t e i n + t u r v a l l i s u u s p e r u s t e i t a + t u r v a l l i s u u s p i i r t e i d e n + t u r v a l l i s u u s p i l a r i + t u r v a l l i s u u s p i l a r i i n + t u r v a l l i s u u s p o l i i s i + t u r v a l l i s u u s p o l i i s i n + t u r v a l l i s u u s p o l i i t t i n e n + t u r v a l l i s u u s p o l i i t t i s e e n + t u r v a l l i s u u s p o l i i t t i s e l l e + t u r v a l l i s u u s p o l i i t t i s e n + t u r v a l l i s u u s p o l i i t t i s e n a + t u r v a l l i s u u s p o l i i t t i s e s s a + t u r v a l l i s u u s p o l i i t t i s e s t a + t u r v a l l i s u u s p o l i i t t i s e s t i + t u r v a l l i s u u s p o l i i t t i s e t + t u r v a l l i s u u s p o l i i t t i s i a + t u r v a l l i s u u s p o l i i t t i s i i n + t u r v a l l i s u u s p o l i i t t i s i l l e + t u r v a l l i s u u s p o l i i t t i s i l t a + t u r v a l l i s u u s p o l i i t t i s i s s a + t u r v a l l i s u u s p o l i i t t i s i s t a + t u r v a l l i s u u s p o l i i t t i s t a + t u r v a l l i s u u s p o l i i t t i s t e n + t u r v a l l i s u u s p o l i t i i k a k s i + t u r v a l l i s u u s p o l i t i i k a l l a + t u r v a l l i s u u s p o l i t i i k a l l e + t u r v a l l i s u u s p o l i t i i k a l l e m m e + t u r v a l l i s u u s p o l i t i i k a l t a + t u r v a l l i s u u s p o l i t i i k a n + t u r v a l l i s u u s p o l i t i i k a s s a + t u r v a l l i s u u s p o l i t i i k a s s a a n + t u r v a l l i s u u s p o l i t i i k a s s a m m e + t u r v a l l i s u u s p o l i t i i k a s t a + t u r v a l l i s u u s p o l i t i i k a s t a a n + t u r v a l l i s u u s p o l i t i i k k a + t u r v a l l i s u u s p o l i t i i k k a a + t u r v a l l i s u u s p o l i t i i k k a a m m e + t u r v a l l i s u u s p o l i t i i k k a a n + t u r v a l l i s u u s p o l i t i i k k a a n n e + t u r v a l l i s u u s p o l i t i i k k a a n s a + t u r v a l l i s u u s p o l i t i i k k a m e k a n i s m i n + t u r v a l l i s u u s p o l i t i i k k a m m e + t u r v a l l i s u u s p o l i t i i k k a n s a + t u r v a l l i s u u s p o l i t i i k k o j a + t u r v a l l i s u u s p o l i t i i k k o j e n + t u r v a l l i s u u s p o l i t i i k o i s t a + t u r v a l l i s u u s p o n n i s t e l u i h i n + t u r v a l l i s u u s p r o j e k t e i h i n + t u r v a l l i s u u s p r o j e k t i + t u r v a l l i s u u s p r o s e s s i i n + t u r v a l l i s u u s p r o s e s s i s s a + t u r v a l l i s u u s p u i t t e i s i i n + t u r v a l l i s u u s p u o l i + t u r v a l l i s u u s p u u t t e e t + t u r v a l l i s u u s p u u t t e i d e n + t u r v a l l i s u u s p u u t t e i s i i n + t u r v a l l i s u u s p u u t t e i s t a + t u r v a l l i s u u s p u u t t e i t a + t u r v a l l i s u u s p y r k i m y k s i s t ä + t u r v a l l i s u u s p ä ä l l i k k ö n s ä + t u r v a l l i s u u s p ä ä l l i k k ö n ä + t u r v a l l i s u u s p ä ä t ö k s i ä + t u r v a l l i s u u s p ä ä t ö s l a u s e l m a + t u r v a l l i s u u s p ä ä t ö s l a u s e l m a n + t u r v a l l i s u u s p ö y t ä k i r j a + t u r v a l l i s u u s r a d i o j ä r j e s t e l m ä + t u r v a l l i s u u s r a h a s t o + t u r v a l l i s u u s r a h a s t o o n + t u r v a l l i s u u s r a j a t + t u r v a l l i s u u s r a j o i t u k s i s t a + t u r v a l l i s u u s r a j o i t u s t e n + t u r v a l l i s u u s r a j o j e n + t u r v a l l i s u u s r a k e n n e + t u r v a l l i s u u s r a k e n t e e l l e + t u r v a l l i s u u s r a k e n t e e n + t u r v a l l i s u u s r a k e n t e e s e e n + t u r v a l l i s u u s r a k e n t e e s s a + t u r v a l l i s u u s r a k e n t e e t + t u r v a l l i s u u s r a k e n t e i d e n + t u r v a l l i s u u s r a k e n t e i s i i n + t u r v a l l i s u u s r a k e n t e i s t a + t u r v a l l i s u u s r a k e n t e i s t a a n + t u r v a l l i s u u s r a k e n t e i t a + t u r v a l l i s u u s r a p o r t i t + t u r v a l l i s u u s r a p o r t t e j a + t u r v a l l i s u u s r a p o r t t i a + t u r v a l l i s u u s r e k i s t e r i t + t u r v a l l i s u u s r i k k o m u s + t u r v a l l i s u u s r i k k o m u s t a + t u r v a l l i s u u s r i k k o m u s t e n + t u r v a l l i s u u s r i n t a m a l l a + t u r v a l l i s u u s r i s k e i h i n + t u r v a l l i s u u s r i s k e i l l e + t u r v a l l i s u u s r i s k e i l t ä + t u r v a l l i s u u s r i s k e i n e e n + t u r v a l l i s u u s r i s k e i n ä + t u r v a l l i s u u s r i s k e i s t ä + t u r v a l l i s u u s r i s k e j ä + t u r v a l l i s u u s r i s k i + t u r v a l l i s u u s r i s k i e n + t u r v a l l i s u u s r i s k i k s i + t u r v a l l i s u u s r i s k i l l ä + t u r v a l l i s u u s r i s k i n + t u r v a l l i s u u s r i s k i n ä + t u r v a l l i s u u s r i s k i s t ä + t u r v a l l i s u u s r i s k i t + t u r v a l l i s u u s r i s k i ä + t u r v a l l i s u u s r y h m i e m m e + t u r v a l l i s u u s r y h m ä + t u r v a l l i s u u s r y h m ä m m e + t u r v a l l i s u u s r y h m ä ä n + t u r v a l l i s u u s s e i k a t + t u r v a l l i s u u s s e i k k o j a + t u r v a l l i s u u s s e i k k o j e n + t u r v a l l i s u u s s e i k o i s t a + t u r v a l l i s u u s s e k t o r i n + t u r v a l l i s u u s s e l v i t y s + t u r v a l l i s u u s s e l v i t y s t e n + t u r v a l l i s u u s s e l v i t y s t ä + t u r v a l l i s u u s s e r t i f i k a a t i t + t u r v a l l i s u u s s e r t i f i k a a t t i + t u r v a l l i s u u s s e u r a u k s e t + t u r v a l l i s u u s s i t o u m u k s i a a n + t u r v a l l i s u u s s o p i m u k s e k s i + t u r v a l l i s u u s s o p i m u k s e l l a + t u r v a l l i s u u s s o p i m u k s e n + t u r v a l l i s u u s s o p i m u k s e s s a + t u r v a l l i s u u s s o p i m u k s e t + t u r v a l l i s u u s s o p i m u k s i i n + t u r v a l l i s u u s s o p i m u k s i s t a + t u r v a l l i s u u s s o p i m u s + t u r v a l l i s u u s s o p i m u s t a + t u r v a l l i s u u s s o p i m u s t e n + t u r v a l l i s u u s s o v e l l u k s i s t a + t u r v a l l i s u u s s t a n d a r d e i h i n + t u r v a l l i s u u s s t a n d a r d e i l l a + t u r v a l l i s u u s s t a n d a r d e i s t a + t u r v a l l i s u u s s t a n d a r d e j a + t u r v a l l i s u u s s t a n d a r d e j a m m e + t u r v a l l i s u u s s t a n d a r d i + t u r v a l l i s u u s s t a n d a r d i e n + t u r v a l l i s u u s s t a n d a r d i i n + t u r v a l l i s u u s s t a n d a r d i j ä r j e s t e l m ä + t u r v a l l i s u u s s t a n d a r d i t + t u r v a l l i s u u s s t r a t e g i a + t u r v a l l i s u u s s t r a t e g i a a + t u r v a l l i s u u s s t r a t e g i a a n + t u r v a l l i s u u s s t r a t e g i a a n s a + t u r v a l l i s u u s s t r a t e g i a k s i + t u r v a l l i s u u s s t r a t e g i a l l a + t u r v a l l i s u u s s t r a t e g i a l l e + t u r v a l l i s u u s s t r a t e g i a m m e + t u r v a l l i s u u s s t r a t e g i a n + t u r v a l l i s u u s s t r a t e g i a n a + t u r v a l l i s u u s s t r a t e g i a n s a + t u r v a l l i s u u s s t r a t e g i a s s a + t u r v a l l i s u u s s t r a t e g i a s s a m m e + t u r v a l l i s u u s s t r a t e g i a s t a + t u r v a l l i s u u s s t r a t e g i a s t a m m e + t u r v a l l i s u u s s t r a t e g i o i d e n + t u r v a l l i s u u s s t r a t e g i o i l l e + t u r v a l l i s u u s s t r a t e g i o i t a + t u r v a l l i s u u s s t r a t e g i s i s t a + t u r v a l l i s u u s s u o s i t u k s e t + t u r v a l l i s u u s s u o s i t u k s i a a n + t u r v a l l i s u u s s u o s i t u k s i l l e + t u r v a l l i s u u s s u o s i t u s t a + t u r v a l l i s u u s s u u n n i t e l m a + t u r v a l l i s u u s s u u n n i t e l m a n + t u r v a l l i s u u s s u u n n i t e l m a s t a + t u r v a l l i s u u s s u u n n i t e l m i a + t u r v a l l i s u u s s y i d e n + t u r v a l l i s u u s s y i h i n + t u r v a l l i s u u s s y i s t ä + t u r v a l l i s u u s s y i t ä + t u r v a l l i s u u s s ä ä d ö k s e t + t u r v a l l i s u u s s ä ä d ö k s i s t ä + t u r v a l l i s u u s s ä ä d ö s + t u r v a l l i s u u s s ä ä d ö s t e n + t u r v a l l i s u u s s ä ä n n ö i s s ä + t u r v a l l i s u u s s ä ä n n ö i s t ä + t u r v a l l i s u u s s ä ä n n ö k s e t + t u r v a l l i s u u s s ä ä n n ö k s i e n + t u r v a l l i s u u s s ä ä n n ö k s i i n + t u r v a l l i s u u s s ä ä n n ö k s i s t ä + t u r v a l l i s u u s s ä ä n n ö k s i ä + t u r v a l l i s u u s s ä ä n n ö s + t u r v a l l i s u u s s ä ä n n ö s t e n + t u r v a l l i s u u s s ä ä n n ö s t ö + t u r v a l l i s u u s s ä ä n n ö t + t u r v a l l i s u u s s ä ä n t ö j e n + t u r v a l l i s u u s s ä ä n t ö j ä + t u r v a l l i s u u s s ä ä n t ö m m e + t u r v a l l i s u u s s ä ä n t ö n s ä + t u r v a l l i s u u s t a a k a s t a + t u r v a l l i s u u s t a e + t u r v a l l i s u u s t a k e e n a + t u r v a l l i s u u s t a k e e t + t u r v a l l i s u u s t a k e i s i i n + t u r v a l l i s u u s t a k e i t a + t u r v a l l i s u u s t a k u i d e n + t u r v a l l i s u u s t a k u i s s a + t u r v a l l i s u u s t a k u i s t a + t u r v a l l i s u u s t a k u i t a + t u r v a l l i s u u s t a k u u + t u r v a l l i s u u s t a k u u n + t u r v a l l i s u u s t a k u u t + t u r v a l l i s u u s t a k u u t a + t u r v a l l i s u u s t a r k a s t a j a m m e + t u r v a l l i s u u s t a r k a s t a j i a + t u r v a l l i s u u s t a r k a s t u k s e e n + t u r v a l l i s u u s t a r k a s t u k s e n + t u r v a l l i s u u s t a r k a s t u k s e t + t u r v a l l i s u u s t a r k a s t u k s i a + t u r v a l l i s u u s t a r k a s t u k s i a a n + t u r v a l l i s u u s t a r k a s t u k s i s t a + t u r v a l l i s u u s t a r k a s t u s + t u r v a l l i s u u s t a r k a s t u s t e n + t u r v a l l i s u u s t a r k i s t u s a s e t u k s e l l a + t u r v a l l i s u u s t a r k o i t u k s e s s a + t u r v a l l i s u u s t a r k o i t u k s i i n + t u r v a l l i s u u s t a r k o i t u k s i s s a + t u r v a l l i s u u s t a r p e e n a + t u r v a l l i s u u s t a r p e e t + t u r v a l l i s u u s t a r p e i d e n + t u r v a l l i s u u s t a r p e i s i i n + t u r v a l l i s u u s t a r p e i t a + t u r v a l l i s u u s t a r v e + t u r v a l l i s u u s t a s o + t u r v a l l i s u u s t a s o a + t u r v a l l i s u u s t a s o a a n + t u r v a l l i s u u s t a s o j e n + t u r v a l l i s u u s t a s o l l e + t u r v a l l i s u u s t a s o n + t u r v a l l i s u u s t a s o n a + t u r v a l l i s u u s t a s o o n + t u r v a l l i s u u s t a s o s t a + t u r v a l l i s u u s t a s o t + t u r v a l l i s u u s t a v o i t e + t u r v a l l i s u u s t a v o i t t e e n + t u r v a l l i s u u s t a v o i t t e e t + t u r v a l l i s u u s t a v o i t t e i d e n + t u r v a l l i s u u s t a v o i t t e i s t a + t u r v a l l i s u u s t a v o i t t e i t a + t u r v a l l i s u u s t e h t ä v i s t ä + t u r v a l l i s u u s t e h t ä v i s t ä ä n + t u r v a l l i s u u s t e h t ä v i ä + t u r v a l l i s u u s t e h t ä v ä + t u r v a l l i s u u s t e h t ä v ä t + t u r v a l l i s u u s t e h t ä v ä ä + t u r v a l l i s u u s t e k i j ä + t u r v a l l i s u u s t e k i j ä t + t u r v a l l i s u u s t e k i j ö i d e n + t u r v a l l i s u u s t e k i j ö i h i n + t u r v a l l i s u u s t e k i j ö i t ä + t u r v a l l i s u u s t e k n i i k k a a + t u r v a l l i s u u s t e k n i k o t + t u r v a l l i s u u s t e k n i s i ä + t u r v a l l i s u u s t e k n o l o g i o i d e n + t u r v a l l i s u u s t e o l l i s u u d e n + t u r v a l l i s u u s t e s t e j ä + t u r v a l l i s u u s t e s t i + t u r v a l l i s u u s t e s t i e n + t u r v a l l i s u u s t e s t i t + t u r v a l l i s u u s t i e d o i l l e + t u r v a l l i s u u s t i e d o n + t u r v a l l i s u u s t i e d o t + t u r v a l l i s u u s t i e t o a + t u r v a l l i s u u s t i e t o i n e n + t u r v a l l i s u u s t i e t o i s t a + t u r v a l l i s u u s t i e t o i s u u d e s t a + t u r v a l l i s u u s t i e t o j a + t u r v a l l i s u u s t i e t o j e n + t u r v a l l i s u u s t i l a n n e + t u r v a l l i s u u s t i l a n n e t t a + t u r v a l l i s u u s t i l a n n e t t a m m e + t u r v a l l i s u u s t i l a n t e e m m e + t u r v a l l i s u u s t i l a n t e e n + t u r v a l l i s u u s t i l a n t e e n s a + t u r v a l l i s u u s t i l a n t e e s e e n + t u r v a l l i s u u s t i l a n t e e s s a + t u r v a l l i s u u s t i l a n t e e s t a + t u r v a l l i s u u s t i l a n t e e t + t u r v a l l i s u u s t i l a s t o i s t a + t u r v a l l i s u u s t i l a s t o t + t u r v a l l i s u u s t o d i s t u k s e n + t u r v a l l i s u u s t o d i s t u k s e t + t u r v a l l i s u u s t o d i s t u k s i a + t u r v a l l i s u u s t o d i s t u k s i s s a + t u r v a l l i s u u s t o d i s t u s t e n + t u r v a l l i s u u s t o i m e n p i d e + t u r v a l l i s u u s t o i m e n p i t e e n ä + t u r v a l l i s u u s t o i m e n p i t e e s t ä + t u r v a l l i s u u s t o i m e n p i t e e t + t u r v a l l i s u u s t o i m e n p i t e i d e n + t u r v a l l i s u u s t o i m e n p i t e i l l ä + t u r v a l l i s u u s t o i m e n p i t e i s i i n + t u r v a l l i s u u s t o i m e n p i t e i s t ä + t u r v a l l i s u u s t o i m e n p i t e i t ä + t u r v a l l i s u u s t o i m e t + t u r v a l l i s u u s t o i m i + t u r v a l l i s u u s t o i m i a + t u r v a l l i s u u s t o i m i e n + t u r v a l l i s u u s t o i m i l l e + t u r v a l l i s u u s t o i m i n t a a + t u r v a l l i s u u s t o i m i s s a + t u r v a l l i s u u s t o i m i s t a + t u r v a l l i s u u s t o i m i s t o + t u r v a l l i s u u s t o i m i t t a j a + t u r v a l l i s u u s t u o m i o i s t u i m e n + t u r v a l l i s u u s t u o m i o i s t u i m e t + t u r v a l l i s u u s t u o m i o j ä r j e s t e l m ä n + t u r v a l l i s u u s t u t k i m u k s e l l e + t u r v a l l i s u u s t u t k i m u k s e n + t u r v a l l i s u u s t u t k i m u k s e s t a + t u r v a l l i s u u s t u t k i m u k s i a + t u r v a l l i s u u s t u t k i m u s + t u r v a l l i s u u s t u t k i m u s o h j e l m a + t u r v a l l i s u u s t u t k i m u s o h j e l m a a n + t u r v a l l i s u u s t u t k i m u s o h j e l m a l l e + t u r v a l l i s u u s t u t k i m u s o h j e l m a n + t u r v a l l i s u u s t u t k i m u s t a + t u r v a l l i s u u s t y h j i ö + t u r v a l l i s u u s t y h j i ö n + t u r v a l l i s u u s t y h j i ö ö n + t u r v a l l i s u u s t y ö l l ä + t u r v a l l i s u u s t y ö r y h m ä + t u r v a l l i s u u s t y ö t ä + t u r v a l l i s u u s u h k a + t u r v a l l i s u u s u h k a a + t u r v a l l i s u u s u h k a n + t u r v a l l i s u u s u h k a n a + t u r v a l l i s u u s u h k a t + t u r v a l l i s u u s u h k i a + t u r v a l l i s u u s u h k i e n + t u r v a l l i s u u s u h k i i n + t u r v a l l i s u u s u h k i l t a + t u r v a l l i s u u s u h k i s t a + t u r v a l l i s u u s u l o t t u v u u d e t + t u r v a l l i s u u s u l o t t u v u u s + t u r v a l l i s u u s u n i o n i + t u r v a l l i s u u s u n i o n i a + t u r v a l l i s u u s u n i o n i i n + t u r v a l l i s u u s u n i o n i l l e + t u r v a l l i s u u s u u d i s t u s + t u r v a l l i s u u s v a a t i m u k s e e n + t u r v a l l i s u u s v a a t i m u k s e m m e + t u r v a l l i s u u s v a a t i m u k s e n + t u r v a l l i s u u s v a a t i m u k s e t + t u r v a l l i s u u s v a a t i m u k s i a + t u r v a l l i s u u s v a a t i m u k s i a a n + t u r v a l l i s u u s v a a t i m u k s i e n + t u r v a l l i s u u s v a a t i m u k s i i n + t u r v a l l i s u u s v a a t i m u k s i l l a + t u r v a l l i s u u s v a a t i m u k s i l t a + t u r v a l l i s u u s v a a t i m u k s i s t a + t u r v a l l i s u u s v a a t i m u k s i s t a a n + t u r v a l l i s u u s v a a t i m u s t e n + t u r v a l l i s u u s v a a t i m u s t e n s a + t u r v a l l i s u u s v a i h t o e h t o j a + t u r v a l l i s u u s v a i k u t u k s e t + t u r v a l l i s u u s v a i k u t u k s i a + t u r v a l l i s u u s v a i k u t u k s i s t a + t u r v a l l i s u u s v a i k u t u s + t u r v a l l i s u u s v a i k u t u s k o k e e s e e n + t u r v a l l i s u u s v a j e + t u r v a l l i s u u s v a j e e l l a + t u r v a l l i s u u s v a j e e n + t u r v a l l i s u u s v a j e t t a + t u r v a l l i s u u s v a l i o k u n t i e n + t u r v a l l i s u u s v a l t i o n + t u r v a l l i s u u s v a l v o j i e n + t u r v a l l i s u u s v a l v o n n a n + t u r v a l l i s u u s v a l v o n t a + t u r v a l l i s u u s v a l v o n t a a + t u r v a l l i s u u s v a r o t o i m i s t a + t u r v a l l i s u u s v a r u s t e e t + t u r v a l l i s u u s v a r u s t e i d e n + t u r v a l l i s u u s v a s t a a v a + t u r v a l l i s u u s v a s t a a v a t + t u r v a l l i s u u s v e l v o i t t e e t + t u r v a l l i s u u s v e r k k o a + t u r v a l l i s u u s v e r k k o n a + t u r v a l l i s u u s v e r k k o o n + t u r v a l l i s u u s v e r k o n + t u r v a l l i s u u s v e r k o s t o a + t u r v a l l i s u u s v e r k o s t o s t a + t u r v a l l i s u u s v i r a n o m a i n e n + t u r v a l l i s u u s v i r a n o m a i s e m m e + t u r v a l l i s u u s v i r a n o m a i s e n + t u r v a l l i s u u s v i r a n o m a i s e t + t u r v a l l i s u u s v i r a n o m a i s i a + t u r v a l l i s u u s v i r a n o m a i s i l l e + t u r v a l l i s u u s v i r a n o m a i s i l t a + t u r v a l l i s u u s v i r a n o m a i s t e n + t u r v a l l i s u u s v i r a s t o + t u r v a l l i s u u s v i r a s t o a + t u r v a l l i s u u s v i r a s t o i h i n + t u r v a l l i s u u s v i r a s t o j a + t u r v a l l i s u u s v i r a s t o j e m m e + t u r v a l l i s u u s v i r a s t o j e n + t u r v a l l i s u u s v i r a s t o l l e + t u r v a l l i s u u s v i r a s t o n + t u r v a l l i s u u s v i r h e i d e n + t u r v a l l i s u u s v i r k a i l i j a + t u r v a l l i s u u s v i r k a i l i j o i t a + t u r v a l l i s u u s v i r k a m i e s t e n + t u r v a l l i s u u s v i r k a m i e s t ä + t u r v a l l i s u u s v o i m a v a r o j e n + t u r v a l l i s u u s v o i m i e n + t u r v a l l i s u u s v u o r o p u h e l u n + t u r v a l l i s u u s v y ö h y k e + t u r v a l l i s u u s v y ö h y k e t t ä + t u r v a l l i s u u s v y ö h y k k e e n + t u r v a l l i s u u s v ä l i n e + t u r v a l l i s u u s v ä l i n e e k s i + t u r v a l l i s u u s v ä l i n e e n + t u r v a l l i s u u s v ä l i n e i s t ö ä + t u r v a l l i s u u s v ä l i n e i t ä + t u r v a l l i s u u s v ä ä r i n k ä y t ö k s i ä + t u r v a l l i s u u s y h t e i s t y ö + t u r v a l l i s u u s y h t e i s t y ö n + t u r v a l l i s u u s y h t e i s t y ö s s ä + t u r v a l l i s u u s y h t e i s t y ö t ä + t u r v a l l i s u u s y h t e i s ö + t u r v a l l i s u u s y h t e i s ö k s i + t u r v a l l i s u u s y h t e i s ö n + t u r v a l l i s u u s y k s i k k ö j e n + t u r v a l l i s u u s y k s i k ö i h i n + t u r v a l l i s u u s y k s i k ö i l l e + t u r v a l l i s u u s y k s i k ö l l e + t u r v a l l i s u u s y k s i k ö n + t u r v a l l i s u u s y k s i k ö s s ä + t u r v a l l i s u u s y k s i k ö t + t u r v a l l i s u u s y m p ä r i s t ö + t u r v a l l i s u u s y m p ä r i s t ö n + t u r v a l l i s u u s y m p ä r i s t ö s s ä + t u r v a l l i s u u s y m p ä r i s t ö ä m m e + t u r v a l l i s u u s y m p ä r i s t ö ö n + t u r v a l l i s u u s y r i t y k s e t + t u r v a l l i s u u s y r i t y s t e n + t u r v a l l i s u u t e e m m e + t u r v a l l i s u u t e e n + t u r v a l l i s u u t e m m e + t u r v a l l i s u u t e n s a + t u r v a l l i s u u t t a + t u r v a l l i s u u t t a a n + t u r v a l u k i t u s j ä r j e s t e l m ä + t u r v a m a j o i t u s t a + t u r v a m a k s u + t u r v a m a k s u i h i n + t u r v a m a k s u i k s i + t u r v a m a k s u i s t a + t u r v a m a k s u j a + t u r v a m a k s u j e n + t u r v a m a k s u t + t u r v a m a r g i n a a l e i s t a + t u r v a m a r g i n a a l e j a + t u r v a m a r g i n a a l i + t u r v a m a r g i n a a l i a + t u r v a m a r g i n a a l i e n + t u r v a m a r g i n a a l i s t a + t u r v a m e k a n i s m e j a + t u r v a m e k a n i s m i e n + t u r v a m e n e t t e l y j ä + t u r v a m e n e t t e l y t + t u r v a m e r k i n n ä k s i + t u r v a m e r k i n n ä l l ä + t u r v a m e r k i n n ä t + t u r v a m e r k i n n ö i s t ä + t u r v a m e r k i n t ä + t u r v a m e r k i n t ö j e n + t u r v a m e r k i n t ö j ä + t u r v a m e r k k i + t u r v a m i e h e n + t u r v a m i e h e t + t u r v a m i e h i l l e + t u r v a m i e h i ä + t u r v a m i e s t e n + t u r v a m u u r i + t u r v a m u u r i l l a + t u r v a m u u r i n + t u r v a m u u r i s t a + t u r v a m ä ä r ä y k s e t + t u r v a m ä ä r ä y k s i e n + t u r v a m ä ä r ä y k s i l l e + t u r v a m ä ä r ä y k s i s t ä + t u r v a m ä ä r ä y k s i ä + t u r v a m ä ä r ä y s t e n + t u r v a n + t u r v a n e u v o s t o + t u r v a n e u v o s t o s s a + t u r v a n o r m e i s t a + t u r v a n o r m e j a + t u r v a n o r m i e n + t u r v a n o r m i s t o + t u r v a n o r m i t + t u r v a n p a i k a n h a k i j a t + t u r v a n ä k ö k o h t a + t u r v a o h j e i d e n + t u r v a o h j e i t a + t u r v a o h j e l m i a + t u r v a o m i n a i s u u k s i a + t u r v a o m i n a i s u u k s i n e e n + t u r v a o p p a a n a + t u r v a p a i k a n + t u r v a p a i k a n h a k e m u s t e n + t u r v a p a i k a n h a k i j a + t u r v a p a i k a n h a k i j a a + t u r v a p a i k a n h a k i j a l l a + t u r v a p a i k a n h a k i j a l l e + t u r v a p a i k a n h a k i j a m ä ä r ä t + t u r v a p a i k a n h a k i j a n + t u r v a p a i k a n h a k i j a n a + t u r v a p a i k a n h a k i j a s t a + t u r v a p a i k a n h a k i j a t + t u r v a p a i k a n h a k i j a v i r t o j e n + t u r v a p a i k a n h a k i j o i d e n + t u r v a p a i k a n h a k i j o i h i n + t u r v a p a i k a n h a k i j o i k s i + t u r v a p a i k a n h a k i j o i l l a + t u r v a p a i k a n h a k i j o i l l e + t u r v a p a i k a n h a k i j o i l t a + t u r v a p a i k a n h a k i j o i n a + t u r v a p a i k a n h a k i j o i s s a + t u r v a p a i k a n h a k i j o i s t a + t u r v a p a i k a n h a k i j o i t a + t u r v a p a i k a n h a k u a + t u r v a p a i k a n h a k u m e n e t t e l y + t u r v a p a i k a n h a k u m e n e t t e l y j e n + t u r v a p a i k a n h a k u m e n e t t e l y j ä ä n + t u r v a p a i k a n h a k u m e n e t t e l y n + t u r v a p a i k a n h a k u m e n e t t e l y ä + t u r v a p a i k a n m y ö n t ä m i s p r o s e s s i n + t u r v a p a i k a s t a + t u r v a p a i k k a + t u r v a p a i k k a a + t u r v a p a i k k a a n + t u r v a p a i k k a d i r e k t i i v i + t u r v a p a i k k a d i r e k t i i v i i n + t u r v a p a i k k a d i r e k t i i v i n + t u r v a p a i k k a d i r e k t i i v i ä + t u r v a p a i k k a e h d o t u k s i l l e + t u r v a p a i k k a e h t o j a a n + t u r v a p a i k k a h a k e m u k s e e n + t u r v a p a i k k a h a k e m u k s e l l e + t u r v a p a i k k a h a k e m u k s e n + t u r v a p a i k k a h a k e m u k s e n s a + t u r v a p a i k k a h a k e m u k s e s t a + t u r v a p a i k k a h a k e m u k s e s t a a n + t u r v a p a i k k a h a k e m u k s e t + t u r v a p a i k k a h a k e m u k s i a + t u r v a p a i k k a h a k e m u k s i e n + t u r v a p a i k k a h a k e m u k s i i n + t u r v a p a i k k a h a k e m u k s i s t a + t u r v a p a i k k a h a k e m u s a s i o i s s a + t u r v a p a i k k a h a k e m u s m e n e t t e l y j ä + t u r v a p a i k k a h a k e m u s t a + t u r v a p a i k k a h a k e m u s t e n + t u r v a p a i k k a h a k i j a n + t u r v a p a i k k a h a k i j o i d e n + t u r v a p a i k k a h a r k i n t a + t u r v a p a i k k a h u i j a r i t + t u r v a p a i k k a i n s t i t u u t i o t a + t u r v a p a i k k a j ä r j e s t e l m i e m m e + t u r v a p a i k k a j ä r j e s t e l m i e n + t u r v a p a i k k a j ä r j e s t e l m i i n + t u r v a p a i k k a j ä r j e s t e l m i s s ä + t u r v a p a i k k a j ä r j e s t e l m i ä + t u r v a p a i k k a j ä r j e s t e l m ä + t u r v a p a i k k a j ä r j e s t e l m ä l l e + t u r v a p a i k k a j ä r j e s t e l m ä l t ä + t u r v a p a i k k a j ä r j e s t e l m ä n + t u r v a p a i k k a j ä r j e s t e l m ä n n e + t u r v a p a i k k a j ä r j e s t e l m ä n s ä + t u r v a p a i k k a j ä r j e s t e l m ä s s ä + t u r v a p a i k k a j ä r j e s t e l m ä s s ä n n e + t u r v a p a i k k a j ä r j e s t e l m ä s t ä + t u r v a p a i k k a j ä r j e s t e l m ä s t ä ä n + t u r v a p a i k k a j ä r j e s t e l m ä t + t u r v a p a i k k a j ä r j e s t e l m ä ä + t u r v a p a i k k a j ä r j e s t e l m ä ä n + t u r v a p a i k k a j ä r j e s t e l m ä ä n s ä + t u r v a p a i k k a j ä r j e s t e l y j e n + t u r v a p a i k k a j ä r j e s t ö j ä + t u r v a p a i k k a k e s k u k s i i n + t u r v a p a i k k a k e s k u s t e l u n + t u r v a p a i k k a k i e r t o l a i s u u d e s t a + t u r v a p a i k k a k y s y m y k s e e n + t u r v a p a i k k a k y s y m y k s i i n + t u r v a p a i k k a k y s y m y s + t u r v a p a i k k a k y s y m y s t e n + t u r v a p a i k k a k y s y m y s t ä + t u r v a p a i k k a k ä s i t e + t u r v a p a i k k a k ä s i t t e e n + t u r v a p a i k k a k ä s i t t e l y s t ä + t u r v a p a i k k a k ä y t ä n n ö i s t ä + t u r v a p a i k k a k ä y t ä n t ö j e n + t u r v a p a i k k a k ä y t ä n t ö j ä + t u r v a p a i k k a k ä y t ä n t ö ä + t u r v a p a i k k a l a i n + t u r v a p a i k k a l a i n s ä ä d ä n n ö n + t u r v a p a i k k a l a i n s ä ä d ä n n ö s s ä + t u r v a p a i k k a l a i n s ä ä d ä n t ö + t u r v a p a i k k a l a i n s ä ä d ä n t ö ä + t u r v a p a i k k a l a i n s ä ä d ä n t ö ö n + t u r v a p a i k k a l a i s t a + t u r v a p a i k k a l a k e j a m m e + t u r v a p a i k k a l a k i + t u r v a p a i k k a l a k i a a n + t u r v a p a i k k a l a k i e n + t u r v a p a i k k a m a a n a + t u r v a p a i k k a m a a t + t u r v a p a i k k a m e k a n i s m i e n + t u r v a p a i k k a m e n e t t e l y + t u r v a p a i k k a m e n e t t e l y d i r e k t i i v i + t u r v a p a i k k a m e n e t t e l y d i r e k t i i v i i n + t u r v a p a i k k a m e n e t t e l y d i r e k t i i v i n + t u r v a p a i k k a m e n e t t e l y d i r e k t i i v i s t ä + t u r v a p a i k k a m e n e t t e l y d i r e k t i i v i ä + t u r v a p a i k k a m e n e t t e l y i h i n + t u r v a p a i k k a m e n e t t e l y i l l ä + t u r v a p a i k k a m e n e t t e l y i s s ä + t u r v a p a i k k a m e n e t t e l y i s t ä + t u r v a p a i k k a m e n e t t e l y j e n + t u r v a p a i k k a m e n e t t e l y j ä + t u r v a p a i k k a m e n e t t e l y n + t u r v a p a i k k a m e n e t t e l y n s ä + t u r v a p a i k k a m e n e t t e l y s t ä + t u r v a p a i k k a m e n e t t e l y s ä ä n n ö s t ö l l e + t u r v a p a i k k a m e n e t t e l y t + t u r v a p a i k k a m e n e t t e l y t a k u i d e n + t u r v a p a i k k a m e n e t t e l y t a p a a + t u r v a p a i k k a m e n e t t e l y y n + t u r v a p a i k k a m e n e t t e l y ä + t u r v a p a i k k a o i k e u d e l l a + t u r v a p a i k k a o i k e u d e l l e + t u r v a p a i k k a o i k e u d e l l i s e s t a + t u r v a p a i k k a o i k e u d e n + t u r v a p a i k k a o i k e u d e s t a + t u r v a p a i k k a o i k e u k s i a + t u r v a p a i k k a o i k e u k s i e n + t u r v a p a i k k a o i k e u k s i i n + t u r v a p a i k k a o i k e u s + t u r v a p a i k k a o i k e u s a s i o i s s a + t u r v a p a i k k a o i k e u s j ä r j e s t e l m ä n + t u r v a p a i k k a o i k e u s k y s y m y k s i s s ä + t u r v a p a i k k a o i k e u s m e n e t t e l y j e n + t u r v a p a i k k a o i k e u s p e r i n n e t t ä + t u r v a p a i k k a o i k e u t e e n + t u r v a p a i k k a o i k e u t e m m e + t u r v a p a i k k a o i k e u t t a + t u r v a p a i k k a o l o i s t a + t u r v a p a i k k a o n g e l m a + t u r v a p a i k k a o n g e l m a n + t u r v a p a i k k a o n g e l m i e n + t u r v a p a i k k a p a k e t i n + t u r v a p a i k k a p a k e t i s s a + t u r v a p a i k k a p a k e t i s t a + t u r v a p a i k k a p a k e t t i + t u r v a p a i k k a p a k e t t i a + t u r v a p a i k k a p a k e t t i e m m e + t u r v a p a i k k a p a k e t t i i n + t u r v a p a i k k a p a k e t t i m m e + t u r v a p a i k k a p a p e r i l l e + t u r v a p a i k k a p e r i a a t e t t a + t u r v a p a i k k a p e r i a a t t e e n + t u r v a p a i k k a p e r u s t e e n s a + t u r v a p a i k k a p e t o k s e t + t u r v a p a i k k a p e t t u r i + t u r v a p a i k k a p o l i i t t i s t e n + t u r v a p a i k k a p o l i t i i k a l l a + t u r v a p a i k k a p o l i t i i k a l l e + t u r v a p a i k k a p o l i t i i k a n + t u r v a p a i k k a p o l i t i i k a s s a + t u r v a p a i k k a p o l i t i i k a s t a + t u r v a p a i k k a p o l i t i i k a s t a m m e + t u r v a p a i k k a p o l i t i i k a t + t u r v a p a i k k a p o l i t i i k k a a + t u r v a p a i k k a p o l i t i i k k a a m m e + t u r v a p a i k k a p o l i t i i k k a a n + t u r v a p a i k k a p o l i t i i k k a m m e + t u r v a p a i k k a p o l i t i i k k a n s a + t u r v a p a i k k a p o l i t i i k k o j e n + t u r v a p a i k k a p r o s e s s i + t u r v a p a i k k a p r o s e s s i a + t u r v a p a i k k a p r o s e s s i i n + t u r v a p a i k k a p r o s e s s i n s a + t u r v a p a i k k a p y y n n ö n + t u r v a p a i k k a p y y n t ö + t u r v a p a i k k a p y y n t ö ä + t u r v a p a i k k a p ä ä t ö k s e n + t u r v a p a i k k a p ä ä t ö k s i s t ä + t u r v a p a i k k a p ä ä t ö s + t u r v a p a i k k a p ä ä t ö s t e n + t u r v a p a i k k a p ö y t ä k i r j a + t u r v a p a i k k a p ö y t ä k i r j a s t a + t u r v a p a i k k a r e i t t i ä + t u r v a p a i k k a r y h m ä n + t u r v a p a i k k a s h o p p a i l u + t u r v a p a i k k a s h o p p a i l u u n + t u r v a p a i k k a s o p i m u k s e e n + t u r v a p a i k k a s o p i m u k s e l l a + t u r v a p a i k k a s o p i m u k s e n + t u r v a p a i k k a s o p i m u k s e s s a + t u r v a p a i k k a s o p i m u k s e s t a + t u r v a p a i k k a s o p i m u s t a + t u r v a p a i k k a s t a n d a r d i e n + t u r v a p a i k k a s t r a t e g i a a + t u r v a p a i k k a s t r a t e g i a n + t u r v a p a i k k a s t r a t e g i a s t a + t u r v a p a i k k a s u o j a a + t u r v a p a i k k a s ä ä n n ö i s s ä + t u r v a p a i k k a s ä ä n n ö i s t ä + t u r v a p a i k k a s ä ä n t ö i h i n + t u r v a p a i k k a s ä ä n t ö j e n + t u r v a p a i k k a s ä ä n t ö j ä + t u r v a p a i k k a t a p a u k s i a + t u r v a p a i k k a t a p a u s t e n + t u r v a p a i k k a t e h t ä v ä n + t u r v a p a i k k a t i e t o j e n + t u r v a p a i k k a t i l a s t o j a + t u r v a p a i k k a t o i m i e n + t u r v a p a i k k a t u r i s m i a + t u r v a p a i k k a v a a t i m u s t e n + t u r v a p a i k k a v a l m i u k s i e n + t u r v a p a i k k a v a l t i o t a + t u r v a p a i k k a v e l v o i t t e e t + t u r v a p a i k k a v i r a n o m a i s e t + t u r v a p a i k k a v i r a n o m a i s i l l e + t u r v a p a i k k a v i r a n o m a i s t e n + t u r v a p a i k k a v i r a s t o + t u r v a p a i k k a v i r a s t o n + t u r v a p a i k k a y h t e i s t y ö n + t u r v a p a i k k o i n a + t u r v a p a i k k o j a + t u r v a p a i k k o j e n + t u r v a p a i k o i l l e + t u r v a p a i k o i s t a + t u r v a p a i n o + t u r v a p a l v e l u + t u r v a p o l i t i i k a k s i + t u r v a p o l i t i i k k a a + t u r v a p o l i t i i k o i s t a + t u r v a r a h a s t o + t u r v a r a h a s t o n + t u r v a r a j a s t a + t u r v a r a j a t + t u r v a r a j o j e n + t u r v a r a k e n t e i d e n + t u r v a r a t k a i s u j a + t u r v a r y h m ä n + t u r v a s a a r e k k e i d e n + t u r v a s a t a m a + t u r v a s a t a m a a + t u r v a s a t a m a k s i + t u r v a s a t a m a n + t u r v a s a t a m a n a + t u r v a s a t a m i a + t u r v a s a t a m i e n + t u r v a s a t a m i i n + t u r v a s e k s i + t u r v a s e k s i ä + t u r v a s e u l o n t a a n + t u r v a s k a n n e r e i d e n + t u r v a s s a + t u r v a s t a + t u r v a s t a n d a r d e i h i n + t u r v a s t a n d a r d e i s t a + t u r v a s t a n d a r d e j a + t u r v a s t a n d a r d i e h d o t u k s e n + t u r v a s t a n d a r d i e n + t u r v a s t a n d a r d i m i e t i n n ö n + t u r v a s t a n d a r d i t + t u r v a s u u n n i t e l m a n + t u r v a s ä i l ö ö n + t u r v a s ä ä n n ö s t e n + t u r v a t a + t u r v a t a a n + t u r v a t a k e e t + t u r v a t a k e i d e n + t u r v a t a k e i t a + t u r v a t a k s e e n + t u r v a t a k s e m m e + t u r v a t a k s e n i + t u r v a t a k u i d e n + t u r v a t a k u i k s i + t u r v a t a k u i l l a + t u r v a t a k u i s i i n + t u r v a t a k u i s t a + t u r v a t a k u i t a + t u r v a t a k u u l a u s e k e + t u r v a t a k u u l a u s e k e t t a + t u r v a t a k u u t + t u r v a t a r k a s t u k s e n + t u r v a t a r k a s t u k s e s s a + t u r v a t a r k a s t u k s e t + t u r v a t a r k a s t u k s i a + t u r v a t a r k a s t u k s i e n + t u r v a t a r k a s t u k s i i n + t u r v a t a r k a s t u k s i s s a + t u r v a t a r k a s t u k s i s t a + t u r v a t a r k a s t u s j ä r j e s t e l m ä + t u r v a t a r k a s t u s k ä y t ä n t ö ä + t u r v a t a r k a s t u s l a i t e + t u r v a t a r k a s t u s l a i t t e i d e n + t u r v a t a r k a s t u s l a i t t e i t a + t u r v a t a r k a s t u s m e n e t t e l y t + t u r v a t a r k a s t u s t a + t u r v a t a r k a s t u s t e k n i i k a s t a + t u r v a t a r k a s t u s t e n + t u r v a t a r k i s t u s + t u r v a t a s o + t u r v a t a s o a + t u r v a t a s o n + t u r v a t a s o s t a a n + t u r v a t a s o t + t u r v a t e k i j ä n ä + t u r v a t e k i j ä ä + t u r v a t e k i j ö i d e n + t u r v a t e k i j ö i s t ä + t u r v a t e k i j ö i t ä + t u r v a t e k n i i k a n + t u r v a t e k n i i k k a + t u r v a t e k n i i k k a a + t u r v a t e n + t u r v a t e s t e j ä + t u r v a t i e j ä r j e s t e l m i s t ä + t u r v a t i l a n n e + t u r v a t o i m e n + t u r v a t o i m e n a + t u r v a t o i m e n p i d e p a k e t i t + t u r v a t o i m e n p i t e e t + t u r v a t o i m e n p i t e i d e n + t u r v a t o i m e n p i t e i l l ä + t u r v a t o i m e n p i t e i s i i n + t u r v a t o i m e n p i t e i s t ä + t u r v a t o i m e n p i t e i t ä + t u r v a t o i m e s t a + t u r v a t o i m e t + t u r v a t o i m i + t u r v a t o i m i a + t u r v a t o i m i e n + t u r v a t o i m i i n + t u r v a t o i m i l l a + t u r v a t o i m i l t a + t u r v a t o i m i n + t u r v a t o i m i s e n + t u r v a t o i m i s s a + t u r v a t o i m i s t a + t u r v a t t a i s i i n + t u r v a t t a v a + t u r v a t t i i n + t u r v a t t o m a m m a k s i + t u r v a t t o m a m m a s s a + t u r v a t t o m a m p a a + t u r v a t t o m a m p i + t u r v a t t o m a m p i a + t u r v a t t o m a s s a + t u r v a t t o m i a + t u r v a t t o m i m m i s t a + t u r v a t t o m i n t a + t u r v a t t o m u u d e n + t u r v a t t o m u u d e n t u n t e e n + t u r v a t t o m u u d e s t a + t u r v a t t o m u u t e e n + t u r v a t t o m u u t e n a + t u r v a t t o m u u t t a + t u r v a t t u a + t u r v a t t u j a + t u r v a t t u j e n + t u r v a t t u u n + t u r v a t u k s i + t u r v a t u m m a k s i + t u r v a t u m m a n + t u r v a t u m p a a + t u r v a t u m p i + t u r v a t u n n e l i l l a + t u r v a t u n n u k s i a + t u r v a t y y n y + t u r v a t y y n y j ä + t u r v a t y y n y j ä r j e s t e l m i ä + t u r v a t y y n y t + t u r v a u d u i m m e + t u r v a u d u t a a n k o + t u r v a u d u t t a e s s a + t u r v a u d u t t a v a + t u r v a u t u a + t u r v a u t u i s i t t e + t u r v a u t u i v a t + t u r v a u t u m a a n + t u r v a u t u m a l l a + t u r v a u t u m a s t a + t u r v a u t u m a t t a + t u r v a u t u m i s e n + t u r v a u t u m i s e s s a + t u r v a u t u u + t u r v a u t u v a t + t u r v a v a a t i m u k s e t + t u r v a v a a t i m u k s i a + t u r v a v a a t i m u s t e n + t u r v a v a i h d e + t u r v a v a l v o n n a n + t u r v a v a l v o n t a s o p i m u s + t u r v a v a r o i t u k s i a + t u r v a v a r u s t e i d e n + t u r v a v a r u s t e i s i i n + t u r v a v a r u s t e i s t a + t u r v a v e n t t i i l e i t ä + t u r v a v e n t t i i l e j ä + t u r v a v e n t t i i l i + t u r v a v e n t t i i l i e n + t u r v a v e n t t i i l i t + t u r v a v e r k k o + t u r v a v e r k k o a + t u r v a v e r k k o i h i n + t u r v a v e r k k o i n a + t u r v a v e r k k o j a + t u r v a v e r k k o j e n + t u r v a v e r k k o j ä r j e s t e l m ä n ä + t u r v a v e r k k o m e n e t t e l y j ä + t u r v a v e r k k o m m e + t u r v a v e r k k o m ä ä r ä y k s i ä + t u r v a v e r k k o n a + t u r v a v e r k k o o n + t u r v a v e r k k o p e r i a a t e + t u r v a v e r k k o s ä ä n n ö i k s i + t u r v a v e r k k o t e h t ä v i s t ä + t u r v a v e r k k o t o i m e n p i t e i s i i n + t u r v a v e r k o k s i + t u r v a v e r k o l l a + t u r v a v e r k o n + t u r v a v e r k o s t a + t u r v a v e r k o s t o + t u r v a v e r k o s t o a + t u r v a v e r k o s t o j a + t u r v a v e r k o s t o n + t u r v a v e r k o s t o t + t u r v a v e r k o t + t u r v a v e r o j e n + t u r v a v y ö + t u r v a v y ö h y k e t t ä + t u r v a v y ö h y k k e e l l ä + t u r v a v y ö h y k k e i d e n + t u r v a v y ö h y k k e i t ä + t u r v a v y ö k a m p a n j o i d e n + t u r v a v y ö l a e i s s a + t u r v a v y ö l a i n s ä ä d ä n n ö s s ä + t u r v a v y ö l e n k k e j ä + t u r v a v y ö n + t u r v a v y ö s t ä + t u r v a v y ö t + t u r v a v y ö t ä + t u r v a v y ö t ä ä n + t u r v a v ä l i + t u r v a v ä l i k o h t a u k s e t + t u r v a v ö i d e n + t u r v a v ö i l l ä + t u r v a v ö i s s ä + t u r v a v ö i s t ä + t u r v a v ö i t ä + t u r v a y k s i k k ö m m e + t u r v a y r i t y k s i s t ä + t u r v e s u o t + t u r v e t e o l l i s u u d e n + t u r v e t u o t a n t o o n + t u r v e v o i m a l a t + t u s c a r o r a t + t u s i n a a + t u s i n a j o k i + t u s k a a + t u s k a a n + t u s k a i l e v a t + t u s k a l l a + t u s k a l l i s e m p a a + t u s k a l l i s e m p a a n + t u s k a l l i s e m p i + t u s k a l l i s e m p i a + t u s k a l l i s e n + t u s k a l l i s e s t a + t u s k a l l i s e t + t u s k a l l i s i a + t u s k a l l i s t a + t u s k a n + t u s k a s t u a + t u s s i k y n ä + t u t k a h e i j a s t i n + t u t k a j ä r j e s t e l m ä + t u t k a j ä r j e s t e l m ä n + t u t k a j ä r j e s t e l m ä s t ä + t u t k a j ä r j e s t e l m ä ä + t u t k a k e s k u s t a + t u t k a l a i t t e i d e n + t u t k a l a i t t e i s t o j e n + t u t k a n p a l j a s t i n + t u t k a r u u d u l l a + t u t k a r u u d u l l a m m e + t u t k a s ä t e e n + t u t k a v e r k o s t o + t u t k i a + t u t k i a k s e e n + t u t k i a k s e m m e + t u t k i e s s a + t u t k i e s s a a n + t u t k i e s s a m m e + t u t k i i + t u t k i i k o + t u t k i j a a + t u t k i j a e l i n + t u t k i j a j o u k o l l e + t u t k i j a k o u l u j a + t u t k i j a k o u l u t u s t a + t u t k i j a l a u t a k u n t a + t u t k i j a l a u t a k u n t a k i n + t u t k i j a l ä h t ö i n e n + t u t k i j a m a a i l m a s s a + t u t k i j a n + t u t k i j a n a + t u t k i j a n p a i k a n + t u t k i j a n p a i k k o j a + t u t k i j a n u r a + t u t k i j a n u r a l l e + t u t k i j a n u r a s s a a n + t u t k i j a n u r i a + t u t k i j a n v a i h t o + t u t k i j a n v i r k o j a + t u t k i j a o p i s k e l i j o i d e n + t u t k i j a p e r u s t a + t u t k i j a r y h m i e n + t u t k i j a r y h m ä + t u t k i j a r y h m ä n + t u t k i j a r y h m ä t + t u t k i j a t + t u t k i j a t o h t o r i + t u t k i j a v a i h t o + t u t k i j a v a i h t o j a + t u t k i j a v o i m a v a r o j e n + t u t k i j a y h t e i s ö + t u t k i j a y h t e i s ö k s i + t u t k i j a y h t e i s ö l l e + t u t k i j a y h t e i s ö n + t u t k i j a y h t e i s ö s t ä + t u t k i j a y h t e i s ö ä + t u t k i j o i d e n + t u t k i j o i l l a + t u t k i j o i l l e + t u t k i j o i l l e e n + t u t k i j o i s t a + t u t k i j o i t a + t u t k i k a a + t u t k i k a a m m e + t u t k i l l a + t u t k i m a a n + t u t k i m a l l a + t u t k i m a s s a + t u t k i m a t t a + t u t k i m i s e k s i + t u t k i m i s e n a r v o i n e n + t u t k i m i s e s t a + t u t k i m i s p r o s e s s i s t a + t u t k i m m e + t u t k i m u k s e e n + t u t k i m u k s e l l a + t u t k i m u k s e l l e + t u t k i m u k s e m m e + t u t k i m u k s e n + t u t k i m u k s e n s a + t u t k i m u k s e s s a + t u t k i m u k s e s s a m m e + t u t k i m u k s e s t a + t u t k i m u k s e s t a a n + t u t k i m u k s e s t a h a n + t u t k i m u k s e t + t u t k i m u k s i a + t u t k i m u k s i e n + t u t k i m u k s i i m m e + t u t k i m u k s i i n + t u t k i m u k s i s s a + t u t k i m u k s i s s a a n + t u t k i m u k s i s t a + t u t k i m u s a i h e i d e n + t u t k i m u s a i h e i s i i n + t u t k i m u s a i h e i t a + t u t k i m u s a i n e i s t o + t u t k i m u s a i n e i s t o n a + t u t k i m u s a i n e i s t o s t a + t u t k i m u s a l a + t u t k i m u s a l a a + t u t k i m u s a l a a n + t u t k i m u s a l a a n k i n + t u t k i m u s a l a l l a + t u t k i m u s a l a l l e + t u t k i m u s a l a n + t u t k i m u s a l a s t a + t u t k i m u s a l a t + t u t k i m u s a l o i h i n + t u t k i m u s a l o i l l a + t u t k i m u s a l o i l l e + t u t k i m u s a l o i l t a + t u t k i m u s a l o i s t a + t u t k i m u s a l o i t e t t a m m e + t u t k i m u s a l o i t t e e l l e + t u t k i m u s a l o i t t e e n + t u t k i m u s a l o i t t e e t + t u t k i m u s a l o i t t e i d e n + t u t k i m u s a l o i t t e i s t a + t u t k i m u s a l o j a + t u t k i m u s a l o j e n + t u t k i m u s a l u e + t u t k i m u s a l u e e l l a + t u t k i m u s a l u e e l l e + t u t k i m u s a l u e e n + t u t k i m u s a l u e e s e e n + t u t k i m u s a l u e e s s a + t u t k i m u s a l u e e s t a + t u t k i m u s a l u e h a n k k e i l l e + t u t k i m u s a l u e i d e n + t u t k i m u s a l u e i s i i n + t u t k i m u s a l u e i t a + t u t k i m u s a l u e k y s y m y k s i s s ä + t u t k i m u s a l u e t t a + t u t k i m u s a p u r a h a n + t u t k i m u s a p u r a h a t + t u t k i m u s a p u r a h o j a + t u t k i m u s a p u r a h o j e n + t u t k i m u s a s e m a l l a + t u t k i m u s a s i a k i r j a n + t u t k i m u s a s i o i s t a + t u t k i m u s a s i o i t a + t u t k i m u s a v u s t a j a t + t u t k i m u s a v u s t u k s i i n + t u t k i m u s b u d j e t e i s t a + t u t k i m u s b u d j e t i n + t u t k i m u s b u d j e t i s t a + t u t k i m u s b u d j e t i t + t u t k i m u s b u d j e t t e i h i n + t u t k i m u s b u d j e t t e j a + t u t k i m u s b u d j e t t i + t u t k i m u s b u d j e t t i a + t u t k i m u s b u d j e t t i a m m e + t u t k i m u s b u d j e t t i i n + t u t k i m u s d i a l o g i + t u t k i m u s d o k u m e n t t e j a + t u t k i m u s e d e l l y t y k s i ä + t u t k i m u s e d e l l y t y s t e n + t u t k i m u s e h d o t u k s i a + t u t k i m u s e l i m e t + t u t k i m u s e l i n + t u t k i m u s e l i n t e n + t u t k i m u s e l i n t ä + t u t k i m u s e t i i k k a + t u t k i m u s f o o r u m i i n + t u t k i m u s h a a s t e i s t a + t u t k i m u s h a a s t e i t a + t u t k i m u s h a k e m u k s i a + t u t k i m u s h a l l i n t o + t u t k i m u s h a n k e + t u t k i m u s h a n k e t t a + t u t k i m u s h a n k k e e k s i + t u t k i m u s h a n k k e e l l a + t u t k i m u s h a n k k e e l l e + t u t k i m u s h a n k k e e n + t u t k i m u s h a n k k e e s e e n + t u t k i m u s h a n k k e e s s a + t u t k i m u s h a n k k e e s t a + t u t k i m u s h a n k k e e t + t u t k i m u s h a n k k e i d e n + t u t k i m u s h a n k k e i d e n s a + t u t k i m u s h a n k k e i l l a + t u t k i m u s h a n k k e i l l e + t u t k i m u s h a n k k e i s i i n + t u t k i m u s h a n k k e i s s a + t u t k i m u s h a n k k e i s s a m m e + t u t k i m u s h a n k k e i s t a + t u t k i m u s h a n k k e i s t a m m e + t u t k i m u s h a n k k e i t a + t u t k i m u s h a n k k e i t t e n + t u t k i m u s h a v a i n t o i h i n + t u t k i m u s h e n k i l ö k u n n a n + t u t k i m u s h e n k i l ö s t ö n + t u t k i m u s i d e n t i t e e t t i m m e + t u t k i m u s i n f r a s t r u k t u u r e i h i n + t u t k i m u s i n f r a s t r u k t u u r e i l l a + t u t k i m u s i n f r a s t r u k t u u r e i s t a + t u t k i m u s i n f r a s t r u k t u u r e j a + t u t k i m u s i n f r a s t r u k t u u r e j a m m e + t u t k i m u s i n f r a s t r u k t u u r i + t u t k i m u s i n f r a s t r u k t u u r i a + t u t k i m u s i n f r a s t r u k t u u r i a a n + t u t k i m u s i n f r a s t r u k t u u r i e n + t u t k i m u s i n f r a s t r u k t u u r i h a n k e t t a + t u t k i m u s i n f r a s t r u k t u u r i i n + t u t k i m u s i n f r a s t r u k t u u r i l l e + t u t k i m u s i n f r a s t r u k t u u r i n + t u t k i m u s i n f r a s t r u k t u u r i o s u u t e e n + t u t k i m u s i n f r a s t r u k t u u r i s t a + t u t k i m u s i n f r a s t r u k t u u r i t + t u t k i m u s i n n o v a a t i o i t a + t u t k i m u s i n s t i t u u t e i l t a + t u t k i m u s i n s t i t u u t i n + t u t k i m u s i n s t i t u u t i s s a + t u t k i m u s i n s t i t u u t i t + t u t k i m u s i n s t i t u u t t e j a + t u t k i m u s i n s t i t u u t t i + t u t k i m u s i n s t i t u u t t i e n + t u t k i m u s i n v e s t o i n n e i l l a + t u t k i m u s i n v e s t o i n n e i s t a + t u t k i m u s i n v e s t o i n n i n + t u t k i m u s i n v e s t o i n n i t + t u t k i m u s i n v e s t o i n t e i h i n + t u t k i m u s i n v e s t o i n t e j a + t u t k i m u s i n v e s t o i n t e j a m m e + t u t k i m u s i n v e s t o i n t i e n + t u t k i m u s j a k s o n + t u t k i m u s j u l k a i s u j e n + t u t k i m u s j ä r j e s t e l m i e n + t u t k i m u s j ä r j e s t e l m i ä + t u t k i m u s j ä r j e s t e l m ä + t u t k i m u s j ä r j e s t e l m ä n + t u t k i m u s j ä r j e s t e l m ä s s ä + t u t k i m u s j ä r j e s t ö + t u t k i m u s j ä r j e s t ö i l l e + t u t k i m u s j ä r j e s t ö j e n + t u t k i m u s j ä r j e s t ö j ä + t u t k i m u s j ä r j e s t ö t + t u t k i m u s k a p a s i t e e t i n + t u t k i m u s k a p a s i t e e t t i + t u t k i m u s k a p a s i t e e t t i a + t u t k i m u s k a p a s i t e e t t i a a n + t u t k i m u s k a p a s i t e e t t i a m m e + t u t k i m u s k a r t e l l e i s t a + t u t k i m u s k e h y s t ä + t u t k i m u s k e i n o j a + t u t k i m u s k e m i k a a l e i l l e + t u t k i m u s k e r t o m u k s e t + t u t k i m u s k e r t o m u k s i i n + t u t k i m u s k e s k u k s e e n + t u t k i m u s k e s k u k s e l l a + t u t k i m u s k e s k u k s e l l e + t u t k i m u s k e s k u k s e l t a + t u t k i m u s k e s k u k s e m m e + t u t k i m u s k e s k u k s e n + t u t k i m u s k e s k u k s e s s a + t u t k i m u s k e s k u k s e s t a + t u t k i m u s k e s k u k s e t + t u t k i m u s k e s k u k s i a + t u t k i m u s k e s k u k s i i n + t u t k i m u s k e s k u k s i l l e + t u t k i m u s k e s k u k s i l t a + t u t k i m u s k e s k u k s i s s a + t u t k i m u s k e s k u k s i s s a m m e + t u t k i m u s k e s k u k s i s t a + t u t k i m u s k e s k u s + t u t k i m u s k e s k u s t a + t u t k i m u s k e s k u s t e n + t u t k i m u s k l u s t e r i + t u t k i m u s k o h t e e k s i + t u t k i m u s k o h t e i d e n + t u t k i m u s k o h t e i k s i + t u t k i m u s k o h t e i n a + t u t k i m u s k o h t e i t a + t u t k i m u s k o m e n n u k s e n + t u t k i m u s k o m i s s i o + t u t k i m u s k o m i s s i o n + t u t k i m u s k o m i s s i o s s a + t u t k i m u s k o m i t e a + t u t k i m u s k o m i t e a n + t u t k i m u s k o m p e t e n s s i a + t u t k i m u s k o o r d i n a a t t o r i t + t u t k i m u s k r i t e e r e i h i n + t u t k i m u s k u l t t u u r i + t u t k i m u s k u l u i s t a + t u t k i m u s k u l u j a + t u t k i m u s k u m p p a n i + t u t k i m u s k u m p p a n u u t e e n + t u t k i m u s k u n n a n + t u t k i m u s k u s t a n n u k s e t + t u t k i m u s k u s t a n n u k s i i n + t u t k i m u s k y s y m y k s i ä + t u t k i m u s k ä y t t ö ö n + t u t k i m u s k ä y t ä n n ö i s t ä + t u t k i m u s k ä y t ä n t ö j e n + t u t k i m u s l a b o r a t o r i o i d e n + t u t k i m u s l a b o r a t o r i o i h i n + t u t k i m u s l a b o r a t o r i o i l l e + t u t k i m u s l a b o r a t o r i o i s s a + t u t k i m u s l a b o r a t o r i o i t a + t u t k i m u s l a i n s ä ä d ä n n ö n + t u t k i m u s l a i t o k s e e n + t u t k i m u s l a i t o k s e m m e + t u t k i m u s l a i t o k s e n + t u t k i m u s l a i t o k s e n s a + t u t k i m u s l a i t o k s e s s a + t u t k i m u s l a i t o k s e t + t u t k i m u s l a i t o k s i a + t u t k i m u s l a i t o k s i e n + t u t k i m u s l a i t o k s i i n + t u t k i m u s l a i t o k s i i n s a + t u t k i m u s l a i t o k s i l l e + t u t k i m u s l a i t o k s i l t a + t u t k i m u s l a i t o k s i s s a + t u t k i m u s l a i t o k s i s t a + t u t k i m u s l a i t o s + t u t k i m u s l a i t o s o h j e l m i a + t u t k i m u s l a i t o s t a + t u t k i m u s l a i t o s t e n + t u t k i m u s l a u t a k u n n a n + t u t k i m u s l a u t a k u n t a + t u t k i m u s l i n j a + t u t k i m u s l i n j a u k s i a + t u t k i m u s l u o n n o k s e n + t u t k i m u s l ä h e t y s t ö n + t u t k i m u s l ä h t ö i n e n + t u t k i m u s l ä h t ö i s e l l ä + t u t k i m u s l ä ä k k e i d e n + t u t k i m u s m a a i l m a n + t u t k i m u s m a a i l m a s s a + t u t k i m u s m a a i l m a s t a + t u t k i m u s m a h d o l l i s u u d e t + t u t k i m u s m a h d o l l i s u u k s i a + t u t k i m u s m a h d o l l i s u u k s i e n + t u t k i m u s m a h d o l l i s u u k s i i n + t u t k i m u s m a h d o l l i s u u k s i s t a + t u t k i m u s m a l l i a + t u t k i m u s m a l l i e n + t u t k i m u s m a l l i l l a + t u t k i m u s m a t e r i a a l i n + t u t k i m u s m a t e r i a a l i n a + t u t k i m u s m a t k o j a + t u t k i m u s m e n e t e l m i e n + t u t k i m u s m e n e t e l m i i n + t u t k i m u s m e n e t e l m i s s ä + t u t k i m u s m e n e t e l m i s t ä + t u t k i m u s m e n e t e l m i s t ä m m e + t u t k i m u s m e n e t e l m i ä + t u t k i m u s m e n e t e l m ä k s i + t u t k i m u s m e n e t e l m ä t + t u t k i m u s m e n e t t e l y + t u t k i m u s m e n e t t e l y l l ä + t u t k i m u s m e n e t t e l y n + t u t k i m u s m e n e t t e l y s t ä + t u t k i m u s m e n e t t e l y y n + t u t k i m u s m e n o i h i n + t u t k i m u s m e n o i l l e + t u t k i m u s m e n o i s t a + t u t k i m u s m e n o j a + t u t k i m u s m e n o j a a n + t u t k i m u s m e n o j e n + t u t k i m u s m e n o t + t u t k i m u s m i e t i n n ö s t ä + t u t k i m u s m u o d o i s t a + t u t k i m u s m u o t o i h i n + t u t k i m u s m ä ä r ä r a h a t + t u t k i m u s m ä ä r ä r a h o i l l a + t u t k i m u s m ä ä r ä r a h o i s t a + t u t k i m u s m ä ä r ä r a h o i s t a a n + t u t k i m u s m ä ä r ä r a h o j a + t u t k i m u s m ä ä r ä r a h o j e n + t u t k i m u s m ä ä r ä r a h o j e n s a + t u t k i m u s n e u v o s t o + t u t k i m u s n e u v o s t o a + t u t k i m u s n e u v o s t o l l a + t u t k i m u s n e u v o s t o l l e + t u t k i m u s n e u v o s t o n + t u t k i m u s n e u v o s t o o n + t u t k i m u s n e u v o s t o s s a + t u t k i m u s n e u v o s t o s t a + t u t k i m u s n ä k ö k o h d a s t a + t u t k i m u s o h j e l m a + t u t k i m u s o h j e l m a a + t u t k i m u s o h j e l m a a m m e + t u t k i m u s o h j e l m a a n + t u t k i m u s o h j e l m a a n s a + t u t k i m u s o h j e l m a l l a + t u t k i m u s o h j e l m a l l e + t u t k i m u s o h j e l m a m m e + t u t k i m u s o h j e l m a n + t u t k i m u s o h j e l m a n s a + t u t k i m u s o h j e l m a s s a + t u t k i m u s o h j e l m a s s a a n + t u t k i m u s o h j e l m a s s a m m e + t u t k i m u s o h j e l m a s t a + t u t k i m u s o h j e l m a t + t u t k i m u s o h j e l m i a + t u t k i m u s o h j e l m i a a n + t u t k i m u s o h j e l m i a m m e + t u t k i m u s o h j e l m i e n + t u t k i m u s o h j e l m i e n s a + t u t k i m u s o h j e l m i i n + t u t k i m u s o h j e l m i l l a + t u t k i m u s o h j e l m i l l a a n + t u t k i m u s o h j e l m i l l e + t u t k i m u s o h j e l m i l l e e n + t u t k i m u s o h j e l m i s s a + t u t k i m u s o h j e l m i s t a + t u t k i m u s o l o s u h t e i d e n + t u t k i m u s o l o s u h t e i t a + t u t k i m u s o n g e l m a + t u t k i m u s o n g e l m a a + t u t k i m u s o n g e l m a s t a + t u t k i m u s o n g e l m i n e e n + t u t k i m u s o r g a n i s a a t i o i d e n + t u t k i m u s o r g a n i s a a t i o i l l e + t u t k i m u s o r g a n i s a a t i o i t a + t u t k i m u s o r g a n i s a a t i o l l e + t u t k i m u s o r g a n i s a a t i o t + t u t k i m u s o s a a m i s e e n + t u t k i m u s o s a s t o j e n + t u t k i m u s o s a s t o l l e + t u t k i m u s o s a s t o n + t u t k i m u s p a i k a n + t u t k i m u s p a i n o p i s t e i d e n + t u t k i m u s p a l v e l u + t u t k i m u s p a l v e l u i l l a + t u t k i m u s p a n o k s i e n + t u t k i m u s p a n o s t u k s e m m e + t u t k i m u s p a n o s t u k s e t + t u t k i m u s p a n o s t u k s i i n + t u t k i m u s p a p e r i n + t u t k i m u s p a r t n e r i e n + t u t k i m u s p e r i a a t t e e t + t u t k i m u s p e r u s t a + t u t k i m u s p e r u s t a a + t u t k i m u s p e r u s t a n + t u t k i m u s p o h j a i s t a + t u t k i m u s p o l i i t t i n e n + t u t k i m u s p o l i i t t i s i l l e + t u t k i m u s p o l i i t t i s i s t a + t u t k i m u s p o l i i t t i s t e n + t u t k i m u s p o l i t i i k a l l a + t u t k i m u s p o l i t i i k a l l e + t u t k i m u s p o l i t i i k a n + t u t k i m u s p o l i t i i k a s s a + t u t k i m u s p o l i t i i k a s s a a n + t u t k i m u s p o l i t i i k a s t a + t u t k i m u s p o l i t i i k a t + t u t k i m u s p o l i t i i k k a + t u t k i m u s p o l i t i i k k a a + t u t k i m u s p o l i t i i k k a a k i n + t u t k i m u s p o l i t i i k k a a n + t u t k i m u s p o l i t i i k k a a n s a + t u t k i m u s p o l i t i i k k a m m e + t u t k i m u s p o l i t i i k k a n s a + t u t k i m u s p o l i t i i k k o i h i n + t u t k i m u s p o l i t i i k k o j a + t u t k i m u s p o l i t i i k k o j e n + t u t k i m u s p o n n i s t e l u i h i n + t u t k i m u s p o n n i s t e l u i s t a + t u t k i m u s p o n n i s t e l u j a + t u t k i m u s p o n n i s t e l u j e m m e + t u t k i m u s p o n n i s t e l u j e n + t u t k i m u s p o n n i s t u k s e e n + t u t k i m u s p o n n i s t u k s i a m m e + t u t k i m u s p o n n i s t u s t e n + t u t k i m u s p o t e n t i a a l i + t u t k i m u s p o t e n t i a a l i a + t u t k i m u s p o t e n t i a a l i a a n + t u t k i m u s p o t e n t i a a l i m m e + t u t k i m u s p o t e n t i a a l i n + t u t k i m u s p r i o r i t e e t e i s t a + t u t k i m u s p r i o r i t e e t i t + t u t k i m u s p r o j e k t e i s s a + t u t k i m u s p r o j e k t e j a + t u t k i m u s p r o j e k t i e n + t u t k i m u s p r o j e k t i i n + t u t k i m u s p r o j e k t i n + t u t k i m u s p r o s e s s i a + t u t k i m u s p r o s e s s i i n + t u t k i m u s p r o s e s s i n + t u t k i m u s p r o t o k o l l a a n + t u t k i m u s p u i s t o + t u t k i m u s p u i t e o h j e l m a n + t u t k i m u s p u i t e o h j e l m a s s a + t u t k i m u s p u i t e o h j e l m i e n + t u t k i m u s p u i t e o h j e l m i l l e + t u t k i m u s p u i t e o h j e l m i s t a + t u t k i m u s p u i t t e i d e n + t u t k i m u s p y r k i m y k s i i n + t u t k i m u s p y y n t ö ö m m e + t u t k i m u s p ä ä o m a n + t u t k i m u s p ä ä o s a s t o n + t u t k i m u s p ö y t ä k i r j o i h i n + t u t k i m u s r a h a a + t u t k i m u s r a h a s t o + t u t k i m u s r a h a s t o a + t u t k i m u s r a h a s t o l l a + t u t k i m u s r a h a s t o n + t u t k i m u s r a h a s t o o n + t u t k i m u s r a h a s t o s t a + t u t k i m u s r a h a s t o t o i m i n n a n + t u t k i m u s r a h a t + t u t k i m u s r a h o i l l a + t u t k i m u s r a h o i s t a + t u t k i m u s r a h o i t u k s e e n + t u t k i m u s r a h o i t u k s e l l e + t u t k i m u s r a h o i t u k s e n + t u t k i m u s r a h o i t u k s e s s a + t u t k i m u s r a h o i t u k s e s t a + t u t k i m u s r a h o i t u s + t u t k i m u s r a h o i t u s h a n k k e i s i i n + t u t k i m u s r a h o i t u s l a i t o s + t u t k i m u s r a h o i t u s p o l i t i i k a n + t u t k i m u s r a h o i t u s t a + t u t k i m u s r a h o j a + t u t k i m u s r a h o j e n + t u t k i m u s r a k e n t e e t + t u t k i m u s r a k e n t e i d e n + t u t k i m u s r a k e n t e i t a + t u t k i m u s r a p o r t e i s t a + t u t k i m u s r a p o r t i n + t u t k i m u s r a p o r t i s s a + t u t k i m u s r a p o r t i s t a + t u t k i m u s r a p o r t t i m m e + t u t k i m u s r e a k t o r e i s t a + t u t k i m u s r e a k t o r i + t u t k i m u s r e a k t o r i n + t u t k i m u s r e s u r s s i e n + t u t k i m u s r e s u r s s i t + t u t k i m u s r i n t a m a l l a + t u t k i m u s r y h m i e n + t u t k i m u s r y h m i i n + t u t k i m u s r y h m i l l ä + t u t k i m u s r y h m i s s ä + t u t k i m u s r y h m i s t ä + t u t k i m u s r y h m i t t y m ä n + t u t k i m u s r y h m i ä + t u t k i m u s r y h m ä + t u t k i m u s r y h m ä n + t u t k i m u s r y h m ä t + t u t k i m u s r y h m ä ä + t u t k i m u s r y h m ä ä n + t u t k i m u s s a t e l l i i t t e j a + t u t k i m u s s e k t o r i e n + t u t k i m u s s e k t o r i l l a + t u t k i m u s s e k t o r i m m e + t u t k i m u s s e k t o r i n + t u t k i m u s s e l v i t y s t e n + t u t k i m u s s e t e l i s t ä + t u t k i m u s s i j o i t u k s i s t a + t u t k i m u s s i s ä l l ö n + t u t k i m u s s o p i m u k s e s t a + t u t k i m u s s o p i m u k s e t + t u t k i m u s s o p i m u k s i a + t u t k i m u s s o p i m u k s i s s a + t u t k i m u s s t r a t e g i a + t u t k i m u s s t r a t e g i a n + t u t k i m u s s u u n n i t e l m a + t u t k i m u s s u u n n i t e l m a a + t u t k i m u s s u u n n i t e l m a a n + t u t k i m u s s u u n n i t e l m a t + t u t k i m u s s u u n n i t e l m i a + t u t k i m u s s u u n n i t e l m i e n + t u t k i m u s s u u n n i t t e l u u n + t u t k i m u s s u u n t a u k s i a + t u t k i m u s s y i s t ä + t u t k i m u s s ä ä t i ö + t u t k i m u s s ä ä t i ö k s i + t u t k i m u s s ä ä t i ö s t ä + t u t k i m u s t a + t u t k i m u s t a h o n + t u t k i m u s t a l o u s a r v i o + t u t k i m u s t a l o u s a r v i o n + t u t k i m u s t a l o u s a r v i o o n + t u t k i m u s t a r k i s t u s t a + t u t k i m u s t a r k o i t u k s e e n + t u t k i m u s t a r k o i t u k s e s s a + t u t k i m u s t a r k o i t u k s i i n + t u t k i m u s t a r p e e n + t u t k i m u s t a r p e e s t a + t u t k i m u s t a r p e e t + t u t k i m u s t a r p e i l l a + t u t k i m u s t a r p e i s i i n + t u t k i m u s t a s o l l a + t u t k i m u s t a v o i t e + t u t k i m u s t a v o i t t e e t + t u t k i m u s t a v o i t t e i d e n + t u t k i m u s t e h t ä v i e n + t u t k i m u s t e h t ä v i i n + t u t k i m u s t e h t ä v i ä + t u t k i m u s t e h t ä v ä + t u t k i m u s t e h t ä v ä n + t u t k i m u s t e h t ä v ä n s ä + t u t k i m u s t e k n i i k k a a + t u t k i m u s t e k n i i k k a a n + t u t k i m u s t e k n i i k o i d e n + t u t k i m u s t e k n o l o g i a + t u t k i m u s t e n + t u t k i m u s t e n s a + t u t k i m u s t e o l l i s u u s + t u t k i m u s t i e d e m i e h e t + t u t k i m u s t i e d o n + t u t k i m u s t i e d o s t a + t u t k i m u s t i e d o t + t u t k i m u s t i e t o + t u t k i m u s t i e t o a + t u t k i m u s t i e t o i h i n + t u t k i m u s t i e t o j a + t u t k i m u s t i e t o j e n + t u t k i m u s t i e t o k a n t a + t u t k i m u s t i l o j e n + t u t k i m u s t o i m e n + t u t k i m u s t o i m e n p i t e e t + t u t k i m u s t o i m e n p i t e i d e n + t u t k i m u s t o i m e t + t u t k i m u s t o i m i a + t u t k i m u s t o i m i e n + t u t k i m u s t o i m i i n + t u t k i m u s t o i m i l l e + t u t k i m u s t o i m i n n a l l e + t u t k i m u s t o i m i n n a l l e m m e + t u t k i m u s t o i m i n n a n + t u t k i m u s t o i m i n n a s s a + t u t k i m u s t o i m i n n a s t a + t u t k i m u s t o i m i n n o i s t a + t u t k i m u s t o i m i n t a + t u t k i m u s t o i m i n t a a + t u t k i m u s t o i m i n t a a n + t u t k i m u s t o i m i n t a a n s a + t u t k i m u s t o i m i n t a m m e + t u t k i m u s t o i m i n t a n s a + t u t k i m u s t o i m i n t o j a + t u t k i m u s t o i m i s s a + t u t k i m u s t o i m i s t a + t u t k i m u s t o i m i s t o + t u t k i m u s t u k e a + t u t k i m u s t u k i + t u t k i m u s t u k i a + t u t k i m u s t u k i o h j e l m a s s a + t u t k i m u s t u l o k s e n s a + t u t k i m u s t u l o k s e t + t u t k i m u s t u l o k s i a + t u t k i m u s t u l o k s i i n + t u t k i m u s t u l o k s i l l a + t u t k i m u s t u l o k s i s s a + t u t k i m u s t u l o k s i s t a + t u t k i m u s t u l o s t e n + t u t k i m u s t y y p p i e n + t u t k i m u s t y ö + t u t k i m u s t y ö h ö n + t u t k i m u s t y ö l l e + t u t k i m u s t y ö m m e + t u t k i m u s t y ö n + t u t k i m u s t y ö n t e k i j ö i t ä + t u t k i m u s t y ö s s ä ä n + t u t k i m u s t y ö t ä + t u t k i m u s t y ö t ä ä n + t u t k i m u s t ö i d e n + t u t k i m u s u r a a + t u t k i m u s v a a t i m u k s i a + t u t k i m u s v a a t i m u s t a + t u t k i m u s v a i h e + t u t k i m u s v a i h e e s s a + t u t k i m u s v a i h e e s t a + t u t k i m u s v a i h t o e h t o j a + t u t k i m u s v a l i o k u n n a n + t u t k i m u s v a l i o k u n n a s s a + t u t k i m u s v a l i o k u n n i s s a + t u t k i m u s v a l i o k u n t a + t u t k i m u s v a l i o k u n t a a + t u t k i m u s v a l i o k u n t i a + t u t k i m u s v a l m i u d e t + t u t k i m u s v a l m i u k s i e n + t u t k i m u s v a l m i u k s i i n + t u t k i m u s v a l m i u k s i s s a + t u t k i m u s v a l m i u t e m m e + t u t k i m u s v a l t a i s i a + t u t k i m u s v a l t u u k s i a + t u t k i m u s v a l t u u k s i e n s a + t u t k i m u s v a l t u u s k u n n a n + t u t k i m u s v a p a u t t a + t u t k i m u s v a r a m m e + t u t k i m u s v a r a t + t u t k i m u s v a r o i h i n + t u t k i m u s v a r o i l l a + t u t k i m u s v a r o i s t a + t u t k i m u s v a r o j a + t u t k i m u s v a r o j e n + t u t k i m u s v a s t u u + t u t k i m u s v e r k k o a + t u t k i m u s v e r k k o i h i m m e + t u t k i m u s v e r k k o j e n + t u t k i m u s v e r k o n + t u t k i m u s v e r k o s t o + t u t k i m u s v e r k o s t o a + t u t k i m u s v e r k o s t o i h i n + t u t k i m u s v e r k o s t o j e n + t u t k i m u s v e t o i s e t + t u t k i m u s v i r a n o m a i s i l l e + t u t k i m u s v i r o i s s a + t u t k i m u s v o i m a v a r o j a + t u t k i m u s v y ö r y n + t u t k i m u s v ä l i n e i d e n + t u t k i m u s v ä l i n e i l l ä + t u t k i m u s v ä l i n e i t ä + t u t k i m u s y h t e e n l i i t t y m ä + t u t k i m u s y h t e i s t y ö + t u t k i m u s y h t e i s t y ö h ö n + t u t k i m u s y h t e i s t y ö n + t u t k i m u s y h t e i s t y ö s t ä + t u t k i m u s y h t e i s t y ö t ä + t u t k i m u s y h t e i s ö + t u t k i m u s y h t e i s ö l l e + t u t k i m u s y h t e i s ö l l ä + t u t k i m u s y h t e i s ö l t ä + t u t k i m u s y h t e i s ö n + t u t k i m u s y h t e i s ö s s ä + t u t k i m u s y h t e i s ö t + t u t k i m u s y h t e i s ö ä + t u t k i m u s y h t e i s ö ö n + t u t k i m u s y h t i ö n + t u t k i m u s y k s i k k ö + t u t k i m u s y k s i k k ö j e n + t u t k i m u s y k s i k k ö n ä + t u t k i m u s y k s i k k ö ä m m e + t u t k i m u s y k s i k ö i d e n + t u t k i m u s y k s i k ö i s s ä + t u t k i m u s y k s i k ö n + t u t k i m u s y k s i k ö t + t u t k i m u s y l i o p i s t o j e n + t u t k i m u s y m p ä r i s t ö + t u t k i m u s y m p ä r i s t ö ö n + t u t k i m u s y r i t y k s e t + t u t k i m u s y r i t y k s i ä + t u t k i m u s y r i t y s t e n + t u t k i n e e t + t u t k i n n a l l i s i s t a + t u t k i n n a n + t u t k i n n a s s a + t u t k i n n a t + t u t k i n n o n + t u t k i n n o n s u o r i t u s m a a + t u t k i n p a + t u t k i n t a a + t u t k i n t a a n + t u t k i n t a e l i m e n + t u t k i n t a e l i m i ä + t u t k i n t a e l i n + t u t k i n t a e l i n t e n + t u t k i n t a j ä r j e s t e l m ä n + t u t k i n t a j ä r j e s t e l m ä s t ä + t u t k i n t a k e i n o j a + t u t k i n t a k e r t o m u s + t u t k i n t a k o m i s s i o + t u t k i n t a k o m i s s i o n + t u t k i n t a k o m i s s i o o n + t u t k i n t a k o m i s s i o s t a + t u t k i n t a k o m i s s i o t a + t u t k i n t a k o m i t e a + t u t k i n t a k o m i t e a a + t u t k i n t a k o m i t e a n + t u t k i n t a k o m i t e a s s a m m e + t u t k i n t a k o m i t e o i d e n + t u t k i n t a k y s y m y k s e e n + t u t k i n t a l a u t a k u n n a n + t u t k i n t a l a u t a k u n n i s t a + t u t k i n t a l a u t a k u n t a + t u t k i n t a l a u t a k u n t a a + t u t k i n t a m a h d o l l i s u u k s i e n + t u t k i n t a m a t k o j a + t u t k i n t a m e k a n i s m i n + t u t k i n t a m e n e t e l m i ä + t u t k i n t a m e n e t e l m ä + t u t k i n t a m e n e t t e l y j ä + t u t k i n t a m e n e t t e l y j ä m m e + t u t k i n t a m e n e t t e l y n + t u t k i n t a m e n e t t e l y t + t u t k i n t a m e n e t t e l y y n + t u t k i n t a m ä ä r ä y k s e e n + t u t k i n t a m ä ä r ä y k s e n + t u t k i n t a m ä ä r ä y s + t u t k i n t a o i k e u d e l l a + t u t k i n t a o i k e u d e n + t u t k i n t a o s a s t o s t a + t u t k i n t a p a l v e l u n + t u t k i n t a p a l v e l u u n + t u t k i n t a p a n e e l e i s t a + t u t k i n t a p e r i a a t e t t a + t u t k i n t a r a p o r t t i a + t u t k i n t a r e s u r s s i e n + t u t k i n t a r y h m i e n + t u t k i n t a r y h m i i n + t u t k i n t a r y h m i s t ä + t u t k i n t a r y h m i ä + t u t k i n t a r y h m ä + t u t k i n t a r y h m ä l l e + t u t k i n t a r y h m ä n + t u t k i n t a r y h m ä t + t u t k i n t a t e h t ä v ä + t u t k i n t a t e k n i i k k a a + t u t k i n t a t o i m e n a + t u t k i n t a t o i m e n p i t e i t ä + t u t k i n t a t o i m i e n + t u t k i n t a t o i m i n t a + t u t k i n t a t o i m i n t a a + t u t k i n t a t u l o k s i a + t u t k i n t a t u o m a r e i d e n + t u t k i n t a t u o m a r e i l l e + t u t k i n t a t u o m a r e i t a + t u t k i n t a t u o m a r i + t u t k i n t a t u o m a r i e n + t u t k i n t a t u o m a r i l l e + t u t k i n t a t u o m a r i l t a + t u t k i n t a t u o m a r i n + t u t k i n t a t u o m a r i t + t u t k i n t a v a i h e + t u t k i n t a v a i h e e n + t u t k i n t a v a i h e e s e e n + t u t k i n t a v a l i o k u n n a l l a + t u t k i n t a v a l i o k u n n a l l e + t u t k i n t a v a l i o k u n n a l t a + t u t k i n t a v a l i o k u n n a n + t u t k i n t a v a l i o k u n n a s s a + t u t k i n t a v a l i o k u n n a s t a + t u t k i n t a v a l i o k u n n a t + t u t k i n t a v a l i o k u n n i s t a + t u t k i n t a v a l i o k u n t a + t u t k i n t a v a l i o k u n t a a + t u t k i n t a v a l i o k u n t a a n + t u t k i n t a v a l i o k u n t a m m e + t u t k i n t a v a l i o k u n t a o i k e u d e s t a + t u t k i n t a v a l i o k u n t i a + t u t k i n t a v a l i o k u n t i e n + t u t k i n t a v a l l a s t a a n + t u t k i n t a v a l m i u k s i e n + t u t k i n t a v a l t a a + t u t k i n t a v a l t u u d e t + t u t k i n t a v a l t u u k s i a + t u t k i n t a v a l t u u k s i e n + t u t k i n t a v a l t u u k s i e n s a + t u t k i n t a v a l t u u k s i l l e + t u t k i n t a v a l t u u s k u n n a n + t u t k i n t a v a n g e i l l e + t u t k i n t a v a n k e j a + t u t k i n t a v a n k e u d e n + t u t k i n t a v a n k e u d e s s a + t u t k i n t a v a n k e u s j a k s o i s t a + t u t k i n t a v a n k e u s j ä r j e s t e l m ä ä + t u t k i n t a v a n k e u s m e n e t t e l y t + t u t k i n t a v a n k e u t t a + t u t k i n t a v a s t u u n + t u t k i n t a v i r a n o m a i s e t + t u t k i n t a v i r a n o m a i s i i n + t u t k i n t a v i r a n o m a i s i l l e + t u t k i n t a v i r a n o m a i s t a + t u t k i n t a v i r a n o m a i s t e n + t u t k i n t a v i r a s t o a + t u t k i n t a v ä l i n e i t ä + t u t k i n t a y k s i k k ö j e n s ä + t u t k i n t a y k s i k k ö j ä + t u t k i n t a y k s i k k ö n n e + t u t k i n t o a + t u t k i n t o a s i a k i r j o i h i n + t u t k i n t o i h i n + t u t k i n t o j a + t u t k i n t o j e n + t u t k i n t o j ä r j e s t e l m i e n + t u t k i n t o j ä r j e s t e l m i s t ä + t u t k i n t o j ä r j e s t e l m i ä + t u t k i n t o j ä r j e s t e l m ä + t u t k i n t o j ä r j e s t e l m ä n + t u t k i n t o j ä r j e s t e l m ä ä + t u t k i n t o k e h y k s e l l ä + t u t k i n t o k e h y k s e n + t u t k i n t o k e h y k s e t + t u t k i n t o k e h y s + t u t k i n t o k e h y s t e n + t u t k i n t o k o k o n a i s u u s + t u t k i n t o n i m i k k e i s s ä + t u t k i n t o n s a + t u t k i n t o p o h j a i s e t + t u t k i n t o r y h m i e n + t u t k i n t o t a s o + t u t k i n t o t o d i s t u k s e n + t u t k i n t o t o d i s t u k s e n n e + t u t k i n t o t o d i s t u k s e t + t u t k i n t o t o d i s t u k s i a + t u t k i n t o t o d i s t u k s i i n + t u t k i n t o t o d i s t u s r a k e n n e + t u t k i n t o t o d i s t u s t e n + t u t k i n t o v a a t i m u k s i a + t u t k i n t o v a a t i m u s t e n + t u t k i n t o y s t ä v ä l l i s e m m ä n + t u t k i n u t + t u t k i t a a n + t u t k i t t a e s s a + t u t k i t t a i s i i n + t u t k i t t a v a k s e e n + t u t k i t t a v a k s e m m e + t u t k i t t a v a k s i + t u t k i t t a v a n a + t u t k i t t i i n + t u t k i t t u + t u t k i t t u a + t u t k i t t u a a n + t u t k i t t u a n i + t u t k i v a l l e + t u t k i v a n + t u t k i v a t + t u t s i e n + t u t s i p u o l e l l a + t u t s i s o t i l a i d e n + t u t s i t + t u t s i v ä h e m m i s t ö n + t u t t a v a l l i s e t + t u t t a v a n t o i m i t u k s i a + t u t t a v a p i i r i s s ä n i + t u t t a v i e n + t u t t a v u u s s u h t e e s e e n + t u t t a v u u s v e r k o s t o i h i n + t u t t i p u l l o + t u t t u a + t u t t u a k i n + t u t t u j a + t u t u i m m a s s a + t u t u l l a + t u t u m m a k s i + t u t u m p i + t u t u m p i a + t u t u s t u a + t u t u s t u a k s e e n + t u t u s t u a k s e m m e + t u t u s t u a k s e n i + t u t u s t u e s s a + t u t u s t u i m m e + t u t u s t u i n + t u t u s t u i s i + t u t u s t u i s i v a t + t u t u s t u i v a t + t u t u s t u k a a + t u t u s t u k a a m m e + t u t u s t u m a a n + t u t u s t u m i n e n + t u t u s t u m i s p y y n n ö t + t u t u s t u m i s t a + t u t u s t u m i s v a i h e e n + t u t u s t u m m e + t u t u s t u n e e n + t u t u s t u t t a v a k s i + t u u b a k o n s e r t t o + t u u l e e + t u u l e e n + t u u l e l l a + t u u l e n + t u u l e n k a l a + t u u l e n k a l a a + t u u l e n k a l a a n + t u u l e n k a l a k a n n a n + t u u l e n k a l a k a n n a t + t u u l e n k a l a n + t u u l e n k a l a s t a + t u u l e n k a l a t + t u u l e n k a l a v a r o j e n + t u u l e n k a l o i s t a + t u u l e n k a l o j a + t u u l e n k a l o j e n + t u u l e n p e s ä s i e n e t + t u u l e n p u u s k a + t u u l e n s u u n n a n + t u u l e t + t u u l e t e t t a v a + t u u l e t i n k u o l e m a t + t u u l e t u s a u k o i s t a + t u u l e t u s j ä r j e s t e l m ä + t u u l e t u s k ä y t ä v ä + t u u l e t u s t a + t u u l i e n e r g i a + t u u l i e n e r g i a a + t u u l i e n e r g i a a n + t u u l i e n e r g i a l a i t o k s i i n + t u u l i e n e r g i a l l e + t u u l i e n e r g i a n + t u u l i e n e r g i a n k i n + t u u l i e n e r g i a s t a + t u u l i g e n e r a a t t o r i t + t u u l i h a u k k a + t u u l i k a n n e l + t u u l i k e l l o + t u u l i k i i n t i ö + t u u l i l a s i n p y y h i n + t u u l i l a s i n p y y h k i m e t + t u u l i l a s i n p y y h k i m i i n + t u u l i l a s i n p y y h k i m i ä + t u u l i m y l l y g a l a k s i + t u u l i m y l l y j e n + t u u l i m y l l y k o m p o n e n t t i e n + t u u l i m y l l y ä + t u u l i o l o s u h t e e t + t u u l i p u i s t o + t u u l i p u i s t o h a n k k e i t a + t u u l i p u i s t o i h i n + t u u l i p u i s t o i s s a + t u u l i p u i s t o i s t a + t u u l i p u i s t o j a + t u u l i p u i s t o j e n + t u u l i p u i s t o t + t u u l i p u i s t o v e r k o s t o + t u u l i t u n n e l i + t u u l i t u r b i i n e i s s a + t u u l i t u r b i i n e i t a + t u u l i t u r b i i n e j a + t u u l i t u r b i i n i + t u u l i t u r b i i n i a + t u u l i t u r b i i n i e n + t u u l i t u r b i i n i l a i t t e i d e n + t u u l i v i i r i + t u u l i v o i m a + t u u l i v o i m a a + t u u l i v o i m a a n + t u u l i v o i m a h a n k k e i t a + t u u l i v o i m a i n f r a s t r u k t u u r i i n + t u u l i v o i m a j ä r j e s t e l m ä m m e + t u u l i v o i m a k a p a s i t e e t t i + t u u l i v o i m a l a h a n k e + t u u l i v o i m a l a i t t e i d e n + t u u l i v o i m a l a t + t u u l i v o i m a l l a + t u u l i v o i m a l l e + t u u l i v o i m a l o i d e n + t u u l i v o i m a l o i h i n + t u u l i v o i m a l o i s t a + t u u l i v o i m a l o i t a + t u u l i v o i m a n + t u u l i v o i m a p o l i t i i k k o j e n + t u u l i v o i m a p o t e n t i a a l i a + t u u l i v o i m a p u i s t o j a + t u u l i v o i m a p u i s t o j e n + t u u l i v o i m a s t a + t u u l i v o i m a t e k n o l o g i a s t a + t u u l i v o i m a t e o l l i s u u d e n + t u u l i v ä ä n n e + t u u l t a + t u u l t a n i + t u u m a u s t a u k o + t u u m o r i n e k r o o s i t e k i j ä + t u u p p i m i s e s t a + t v e r i n k a r j a l a i s e t + t y h j e n t y m ä s s ä + t y h j e n t ä m i s e l t ä + t y h j e n t ä m i s e n + t y h j e n t ä m i s e s t ä + t y h j e n t ä v ä m m i n + t y h j e n t ä v ä n + t y h j e n t ä v ä s t ä + t y h j e n t ä v ä t + t y h j e n t ä v ä ä + t y h j e n t ä v ä ä n + t y h j e n t ä ä + t y h j i e n + t y h j i k s i + t y h j i l l e + t y h j i l l ä ä n + t y h j i n + t y h j i n ä + t y h j i s t ä + t y h j i ä + t y h j i ö f l u o r e s e n s s i n ä y t t ö + t y h j i ö i t ä + t y h j i ö k y p s e n n y s + t y h j i ö n + t y h j i ö s s ä + t y h j i ö s u l a t u s y h t i ö s t ä + t y h j i ö t + t y h j i ö t e k n i i k k a + t y h j i ö t ä + t y h j y y t t ä ä n + t y h j ä k s i + t y h j ä k ä y n n i l l ä + t y h j ä l l ä + t y h j ä n + t y h j ä n p ä i v ä i s e n + t y h j ä n p ä i v ä i s i l l e + t y h j ä n p ä i v ä i s i ä + t y h j ä n p ä i v ä i s t ä + t y h j ä n p ä i v ä i s y y k s i i n + t y h j ä n p ä i v ä i s y y k s i ä + t y h j ä n p ä i v ä i s y y s + t y h j ä s s ä + t y h j ä s t ä + t y h j ä t + t y h j ä ä n + t y h m e m p i + t y h m e m p i ä + t y h m i m m ä s t ä + t y h m ä t + t y h m ä ä + t y k i l l ä + t y k i n k u u l a m e d u u s a + t y k i n r u o a k s i + t y k i n r u o a n + t y k i n r u o k a + t y k i n r u o k a a + t y k i n r u o k a n a + t y k i n v e t ä j ä + t y k i s t ö a m m u s t a + t y k i s t ö h y ö k k ä y k s e n + t y k i s t ö m u s e o + t y k i s t ö n k e n r a a l i + t y k i s t ö p r i k a a t i + t y k i s t ö t u l e n + t y k i s t ö t u l e s s a + t y k k i m u s e o + t y k k i t o r n i + t y k k i v e n e + t y k k i v e n e d i p l o m a t i a a + t y k k i v e n e d i p l o m a t i a l l e + t y k k i v e n e d i p l o m a t i a s t a + t y l l i h y y p p ä + t y l p p ä l e h t i h i e r a k k a + t y l p p ä l i u s k a o r a p i h l a j a + t y l s e m p i ä + t y l s i m p i ä + t y l s i s s ä + t y l s i s t y t t ä v ä m m ä n + t y l s ä ä + t y l y m p i + t y m i i n i d i m e e r i + t y m o l i s i n i n e n + t y n k ä i s t u n n o s s a + t y n k ä s m a r a g d i k o l i b r i + t y n n y r i h i n n a s t a + t y n n y r i h i n t a + t y n n y r i h i n t a a n + t y n n y r i l t ä + t y n n y r i n + t y n n y r i ä + t y p e n + t y p e n o k s i d i e n + t y p e n s i d o n t a + t y p e r i l t ä + t y p e r i m m i s t ä + t y p e r i n t ä + t y p e r y k s i ä + t y p e r y y d e s t ä + t y p e r y y k s i s t ä + t y p e r y y k s i ä + t y p e r y y s p a l k i n n o n + t y p e r y y s s o p i m u k s e k s i + t y p e r y y t t ä + t y p e r ä m p i ä + t y p e r ä ä + t y p i s t e t t i i n + t y p i s t e t y n + t y p p i a r g o n + t y p p i d i o k s i d i + t y p p i d i o k s i d i a r v o t + t y p p i d i o k s i d i n + t y p p i d i o k s i d i p i t o i s u u d e l l e + t y p p i d i o k s i d i p i t o i s u u t e e n + t y p p i d i o k s i d i p ä ä s t ö t + t y p p i d i o k s i d i t i l a n t e e n + t y p p i h a p o k e + t y p p i h a p p o + t y p p i l a n n o i t e t t a + t y p p i l a n n o i t t e e n + t y p p i m o n o k s i d i + t y p p i n a r k o o s i + t y p p i o k s i d e i h i n + t y p p i o k s i d e i s t a + t y p p i o k s i d e j a + t y p p i o k s i d i + t y p p i o k s i d i a + t y p p i o k s i d i a r v o i h i n + t y p p i o k s i d i e n + t y p p i o k s i d i i n + t y p p i o k s i d i n + t y p p i o k s i d i p ä ä s t ö i l l e + t y p p i o k s i d i p ä ä s t ö i l l ä ä n + t y p p i o k s i d i p ä ä s t ö i s t ä + t y p p i o k s i d i p ä ä s t ö j e n + t y p p i o k s i d i p ä ä s t ö j ä + t y p p i o k s i d i p ä ä s t ö t + t y p p i o k s i d i s t a + t y p p i p i t o i s i s t a + t y p p i p i t o i s u u t e e n + t y p p i p ä ä s t ö t + t y p p i s a a s t e i l l e + t y p p i t e t r a o k s i d i + t y p p i t r i j o d i d i + t y p p i v e r o j e n + t y p p i v e r o n + t y p ä s k ä ä p ä + t y r a n n i a s t a + t y r a n n i h a l l i n n o n + t y r a n n i h a l l i n t o j a + t y r a n n i h a l l i t u k s e n + t y r a n n i h a l l i t u k s i s t a + t y r a n n i k i p u a j a + t y r a n n i m a i s e m p i + t y r a n n i t + t y r e h d y t t ä m i s e k s i + t y r e h d y t t ä ä k s e e n + t y r e h t y ä + t y r k y t t ä m ä t t ä + t y r k y t t ä m ä ä n + t y r k y t t ä ä + t y r k y t t ä ä k s e e n + t y r m i s t y k s e e m m e + t y r m i s t y k s e m m e + t y r m i s t y n e e m p i + t y r m i s t y n e e m p i e n + t y r m i s t y n e e m p i ä + t y r m i s t y n e e n ä + t y r m i s t y n e i n ä + t y r m i s t y t t ä v ä m p ä ä + t y r m i s t y t t ä v ä ä + t y r m ä y s t i p a t + t y r m ä ä m ä s t ä + t y r n i k i i t ä j ä + t y r o s i i n i k i n a a s i r e s e p t o r i + t y r s k y k e i j u + t y r s k y m e r i m e t s o + t y r ä k k i k i i t ä j ä + t y r ä r u o h o + t y t t ä r e k s i + t y t t ä r e l t ä n i + t y t t ä r e n i + t y t t ä r e n ä + t y t t ä r e t + t y t t ö b ä n d i + t y t t ö i h i n + t y t t ö j e n + t y t t ö j ä + t y t t ö k o u l u j a + t y t t ö k u l l a t + t y t t ö l a s t e n + t y t t ö p a r k o j a + t y t t ö s i k i ö i t ä + t y t t ö v a u v o j a + t y t t ö ä + t y t ä r d i r e k t i i v e i h i n + t y t ä r d i r e k t i i v e i s s ä + t y t ä r d i r e k t i i v e i s t ä + t y t ä r d i r e k t i i v e j ä + t y t ä r d i r e k t i i v i + t y t ä r d i r e k t i i v i e n + t y t ä r d i r e k t i i v i k s i + t y t ä r d i r e k t i i v i l l ä + t y t ä r d i r e k t i i v i n + t y t ä r d i r e k t i i v i s s ä + t y t ä r d i r e k t i i v i s t ä + t y t ä r d i r e k t i i v i t + t y t ä r d i r e k t i i v i ä + t y t ä r j ä r j e s t ö j ä + t y t ä r s a a r i + t y t ä r t ä + t y t ä r v i l j e l m i ä + t y t ä r y h t i ö i d e n + t y t ä r y h t i ö i h i n + t y t ä r y h t i ö i l t ä ä n + t y t ä r y h t i ö i t ä + t y t ö i s t ä + t y t ö l l ä + t y t ö n + t y t ö t + t y v i k a l v o + t y v i t u m a k e + t y y d y i t t e + t y y d y m m e k ö + t y y d y n + t y y d y t e t ä ä n + t y y d y t t e k ö + t y y d y t t ä m i s e k s i + t y y d y t t ä m i s e n + t y y d y t t ä m ä ä n + t y y d y t t ä v i i n + t y y d y t t ä v i l t ä + t y y d y t t ä v i n + t y y d y t t ä v i ä + t y y d y t t ä v ä k s i + t y y d y t t ä v ä l l ä + t y y d y t t ä v ä m m i n + t y y d y t t ä v ä m m ä n + t y y d y t t ä v ä m m ä s t ä + t y y d y t t ä v ä m p i + t y y d y t t ä v ä m p i ä + t y y d y t t ä v ä m p ä ä + t y y d y t t ä v ä m p ä ä n + t y y d y t t ä v ä n + t y y d y t t ä v ä n ä + t y y d y t t ä v ä s s ä + t y y d y t t ä v ä ä + t y y d y t t ä v ä ä n + t y y d y t t ä ä + t y y d y t t ä ä k s e e n + t y y d y t t ä ä k s e m m e + t y y d y t y s t ä + t y y d y t ä ä n + t y y l i h a r j o i t u s t a + t y y l i k k ä ä m m i n + t y y l i k k ä ä s e e n + t y y l i k y s y m y s + t y y l i m u u t o k s i n + t y y l i n + t y y l i n m u u t o s t a + t y y l i ä + t y y n e m m i n + t y y n e n + t y y n e n m e r e n k r i l l i + t y y n e n m e r e n s a l a m a n t e r i + t y y n e n m e r e n s i l l i + t y y n e s t ä + t y y n e y s r u k o u s + t y y n n y t t ä ä + t y y n y k i r j a + t y y n y s o t a + t y y p i l l i s e e n + t y y p i l l i s e m p i ä + t y y p i l l i s e t + t y y p i l l i s i i n + t y y p i l l i s i m m i s t ä + t y y p i l l i s i m p i ä + t y y p i l l i s i n t ä + t y y p i l l i s i ä + t y y p i l l i s t ä + t y y p i n + t y y p i s t ä + t y y p p i h y v ä k s y m i s v a a t i m u k s i s t a + t y y p p i h y v ä k s y n n ä l l e + t y y p p i h y v ä k s y n n ä n + t y y p p i h y v ä k s y n n ä s t ä + t y y p p i h y v ä k s y n t ä d i r e k t i i v i + t y y p p i h y v ä k s y n t ä d i r e k t i i v i n + t y y p p i h y v ä k s y n t ä d i r e k t i i v i s s ä + t y y p p i h y v ä k s y n t ä j ä r j e s t e l m ä + t y y p p i h y v ä k s y n t ä j ä r j e s t e l m ä n + t y y p p i h y v ä k s y n t ä j ä r j e s t e l m ä ä n + t y y p p i h y v ä k s y n t ä l a i n s ä ä d ä n n ö s s ä + t y y p p i h y v ä k s y n t ä m e n e t t e l y + t y y p p i h y v ä k s y n t ä m e n e t t e l y j ä + t y y p p i h y v ä k s y n t ä m e n e t t e l y n + t y y p p i h y v ä k s y n t ä m e n e t t e l y s s ä + t y y p p i h y v ä k s y n t ä m e n e t t e l y y n + t y y p p i h y v ä k s y n t ä p r o s e s s i + t y y p p i h y v ä k s y n t ä t e s t i s y k l i n + t y y p p i h y v ä k s y n t ä v a a t i m u k s e t + t y y p p i h y v ä k s y n t ä v a a t i m u k s i a + t y y p p i h y v ä k s y n t ä v a a t i m u k s i s t a + t y y p p i h y v ä k s y n t ä v i r a n o m a i n e n + t y y p p i h y v ä k s y n t ä v i r a n o m a i s i l t a + t y y p p i h y v ä k s y n t ä v i r a n o m a i s t e n + t y y p p i h y v ä k s y n t ä ä + t y y p p i h y v ä k s y n t ä ä n + t y y p p i h y v ä k s y t y l l ä + t y y p p i h y v ä k s y t y n + t y y p p i l a j i + t y y p p i l o m a k k e e n + t y y p p i m e r k i n t ö j ä + t y y p p i s e e n + t y y p p i s i l l ä + t y y p p i t e s t a u k s i a + t y y s s i j a a + t y y t y m ä l l ä + t y y t y m ä t t ö m i e n + t y y t y m ä t t ö m i ä + t y y t y m ä t t ö m y y d e l l ä + t y y t y m ä t t ö m y y d e n + t y y t y m ä t t ö m y y d e s t ä + t y y t y m ä t t ö m y y t e m m e + t y y t y m ä t t ö m y y t e n i + t y y t y m ä t t ö m y y t e n s ä + t y y t y m ä t t ö m y y t t ä + t y y t y m ä t t ö m ä m p i ä + t y y t y m ä ä n + t y y t y n e e t + t y y t y n y t + t y y t y v ä i s e m m ä k s i + t y y t y v ä i s e m p i + t y y t y v ä i s e m p i ä + t y y t y v ä i s e m p ä n ä + t y y t y v ä i s e n ä + t y y t y v ä i s i m p i ä + t y y t y v ä i s i n ä + t y y t y v ä i s i ä + t y y t y v ä i s y y d e n i l m a u s + t y y t y v ä i s y y d e s t ä + t y y t y v ä i s y y t e e n + t y y t y v ä i s y y t e e n i + t y y t y v ä i s y y t e n i + t y y t y v ä i s y y t e n s ä + t y y t y v ä i s y y t t ä + t y y t y v ä n + t y y t y v ä t + t y y t y y + t y y t y ä + t y ö a a m i a i s e l l e + t y ö a i k a a + t y ö a i k a a n + t y ö a i k a a n s a + t y ö a i k a d i r e k t i i v e j ä + t y ö a i k a d i r e k t i i v i + t y ö a i k a d i r e k t i i v i e h d o t u s + t y ö a i k a d i r e k t i i v i i n + t y ö a i k a d i r e k t i i v i l l ä + t y ö a i k a d i r e k t i i v i n + t y ö a i k a d i r e k t i i v i s s ä + t y ö a i k a d i r e k t i i v i s t ä + t y ö a i k a d i r e k t i i v i ä + t y ö a i k a e h d o t + t y ö a i k a e h d o t u k s e t + t y ö a i k a j ä r j e s t e l y i d e n + t y ö a i k a j ä r j e s t e l y i h i n + t y ö a i k a j ä r j e s t e l y i n + t y ö a i k a j ä r j e s t e l y i s t ä + t y ö a i k a j ä r j e s t e l y j e n + t y ö a i k a j ä r j e s t e l y j ä + t y ö a i k a j ä r j e s t e l y n + t y ö a i k a j ä r j e s t e l y s s ä + t y ö a i k a j ä r j e s t e l y t + t y ö a i k a j ä r j e s t e l y y n + t y ö a i k a j ä r j e s t e l y ä + t y ö a i k a k o k e i l u i n + t y ö a i k a k y s y m y k s e e n + t y ö a i k a k y s y m y k s e t + t y ö a i k a k y s y m y k s i s t ä + t y ö a i k a k y s y m y s t ä + t y ö a i k a l a i n s ä ä d ä n n ö n + t y ö a i k a l a i n s ä ä d ä n n ö s s ä + t y ö a i k a l a i n s ä ä d ä n t ö + t y ö a i k a l a i n s ä ä d ä n t ö ä + t y ö a i k a l a i n s ä ä d ä n t ö ö n + t y ö a i k a l y h e n n y k s i ä + t y ö a i k a m a l l i e n + t y ö a i k a m a l l i t + t y ö a i k a m i e t i n n ö s s ä + t y ö a i k a m ä ä r ä y k s e t + t y ö a i k a m ä ä r ä y k s i ä + t y ö a i k a n a + t y ö a i k a n o r m e j a + t y ö a i k a n o r m i n + t y ö a i k a n s a + t y ö a i k a o n g e l m a a n + t y ö a i k a p a n k e i s s a + t y ö a i k a p o l i i t t i s i a + t y ö a i k a p o l i t i i k k a + t y ö a i k a r a j o i t t e i t a + t y ö a i k a r a j o i t u k s e t + t y ö a i k a r a j o i t u k s i a + t y ö a i k a r a j o i t u k s i s t a + t y ö a i k a r a t k a i s u j e n + t y ö a i k a r a t k a i s u t + t y ö a i k a s t a n d a r d i n + t y ö a i k a s u o j a + t y ö a i k a s u o j e l u n + t y ö a i k a s ä ä d ö s + t y ö a i k a s ä ä d ö s t e n + t y ö a i k a s ä ä n n ö i s t ä m m e + t y ö a i k a s ä ä n n ö k s e t + t y ö a i k a s ä ä n n ö k s i ä + t y ö a i k a s ä ä n n ö s t e n + t y ö a i k a s ä ä n n ö t + t y ö a i k a s ä ä n t e l y n + t y ö a i k a s ä ä n t e l y y n + t y ö a i k a s ä ä n t ö j ä + t y ö a i k a t a r k a s t u k s i a + t y ö a i k a t a u l u + t y ö a i k a t a v o i t t e e t + t y ö a i k a t i l i t + t y ö a i k a t u r v a a + t y ö a i k a v a a t i m u k s e t + t y ö a i k o i h i n + t y ö a i k o i n a + t y ö a i k o j a + t y ö a i k o j a a n + t y ö a i k o j a m m e + t y ö a i k o j e n + t y ö a i k o j e n s a + t y ö a j a k s i + t y ö a j a l l a + t y ö a j a n + t y ö a j a n l y h e n n y k s e s t ä + t y ö a j a n l y h e n n y k s i l l ä + t y ö a j a n l y h e n t ä m i s e n + t y ö a j a n s e u r a n t a + t y ö a j a s t a + t y ö a j a s t a a n + t y ö a j a t + t y ö a j o i l l a + t y ö a j o i l l e + t y ö a j o i l t a + t y ö a j o i s s a + t y ö a j o i s t a + t y ö a j o n e u v o i l l e + t y ö a j o n e u v o j e n + t y ö a l u e e l l a m m e + t y ö a l u e t t a + t y ö a n t a j a j ä r j e s t ö j e n + t y ö a n t a j a m a a + t y ö a n t a j a t + t y ö a s e m a k s e e n + t y ö a s e m a l l a a n + t y ö a s i a k i r j a + t y ö a s i a k i r j a a + t y ö a s i a k i r j a a n + t y ö a s i a k i r j a a n i + t y ö a s i a k i r j a k s i + t y ö a s i a k i r j a l l a + t y ö a s i a k i r j a l l e + t y ö a s i a k i r j a n + t y ö a s i a k i r j a s s a + t y ö a s i a k i r j a s s a a n + t y ö a s i a k i r j a s t a + t y ö a s i a k i r j a s t a m m e + t y ö a s i a k i r j a t + t y ö a s i a k i r j o i h i n + t y ö a s i a k i r j o i k s i + t y ö a s i a k i r j o i n a + t y ö a s i a k i r j o i s s a + t y ö a s i a k i r j o i s s a a n + t y ö a s i a k i r j o i s s a m m e + t y ö a s i a k i r j o i s t a + t y ö a s i a k i r j o j a + t y ö a s i a k i r j o j e n + t y ö d i r e k t i i v i + t y ö e h d o i l l a + t y ö e h d o i l t a + t y ö e h d o i n + t y ö e h d o i s s a + t y ö e h d o i s t a + t y ö e h d o i s t a a n + t y ö e h d o i s t a m m e + t y ö e h d o t + t y ö e h d o t u k s i s s a a n + t y ö e h t o a + t y ö e h t o i h i n + t y ö e h t o j a + t y ö e h t o j a a n + t y ö e h t o j e n + t y ö e h t o j e n s a + t y ö e h t o n e u v o t t e l u i h i n + t y ö e h t o s o p i m u k s e e n + t y ö e h t o s o p i m u k s e k s i + t y ö e h t o s o p i m u k s e l l a + t y ö e h t o s o p i m u k s e n + t y ö e h t o s o p i m u k s e n s a + t y ö e h t o s o p i m u k s e s s a + t y ö e h t o s o p i m u k s e s t a + t y ö e h t o s o p i m u k s e t + t y ö e h t o s o p i m u k s i a + t y ö e h t o s o p i m u k s i e n + t y ö e h t o s o p i m u k s i i n + t y ö e h t o s o p i m u k s i l l a + t y ö e h t o s o p i m u k s i l l e + t y ö e h t o s o p i m u k s i n + t y ö e h t o s o p i m u k s i s s a + t y ö e h t o s o p i m u k s i s t a + t y ö e h t o s o p i m u k s i s t a a n + t y ö e h t o s o p i m u s a u t o n o m i a a + t y ö e h t o s o p i m u s e h t o n e u v o t t e l u j e n + t y ö e h t o s o p i m u s j ä r j e s t e l m i ä + t y ö e h t o s o p i m u s j ä r j e s t e l m ä + t y ö e h t o s o p i m u s j ä r j e s t e l m ä l l ä + t y ö e h t o s o p i m u s j ä r j e s t e l m ä n + t y ö e h t o s o p i m u s j ä r j e s t e l m ä ä + t y ö e h t o s o p i m u s l a i s t a + t y ö e h t o s o p i m u s m a l l i + t y ö e h t o s o p i m u s m a l l i a + t y ö e h t o s o p i m u s m a l l i n + t y ö e h t o s o p i m u s n e u v o t t e l u + t y ö e h t o s o p i m u s n e u v o t t e l u i d e n + t y ö e h t o s o p i m u s n e u v o t t e l u i h i n + t y ö e h t o s o p i m u s n e u v o t t e l u i l l e + t y ö e h t o s o p i m u s n e u v o t t e l u i s s a + t y ö e h t o s o p i m u s n e u v o t t e l u i s t a + t y ö e h t o s o p i m u s n e u v o t t e l u i t a + t y ö e h t o s o p i m u s n e u v o t t e l u j a + t y ö e h t o s o p i m u s n e u v o t t e l u j e n + t y ö e h t o s o p i m u s n e u v o t t e l u j ä r j e s t e l m ä ä + t y ö e h t o s o p i m u s n e u v o t t e l u o i k e u d e n + t y ö e h t o s o p i m u s n e u v o t t e l u o i k e u t t a + t y ö e h t o s o p i m u s n e u v o t t e l u p r o s e s s i a + t y ö e h t o s o p i m u s n e u v o t t e l u t + t y ö e h t o s o p i m u s o i k e u s + t y ö e h t o s o p i m u s o s a p u o l e t + t y ö e h t o s o p i m u s p e r u s t e i s i i n + t y ö e h t o s o p i m u s p o l i t i i k k a + t y ö e h t o s o p i m u s p r o s e s s i + t y ö e h t o s o p i m u s t a + t y ö e h t o s o p i m u s t a k u i d e n + t y ö e h t o s o p i m u s t e n + t y ö e h t o s o p i m u s t i l a n t e e n s a + t y ö e h t o s o p i m u s v a l t a a n + t y ö e h t o s ä ä n n ö t + t y ö e l i m e t + t y ö e l i m i s s ä + t y ö e l ä k e a l a l l e + t y ö e l ä k e j ä r j e s t e l m i e n + t y ö e l ä k e j ä r j e s t e l m i s s ä + t y ö e l ä k e j ä r j e s t e l m i ä + t y ö e l ä k e j ä r j e s t e l m ä n + t y ö e l ä k e j ä r j e s t e l m ä n s ä + t y ö e l ä k e j ä r j e s t e l m ä t + t y ö e l ä k e j ä r j e s t e l y i h i n + t y ö e l ä k e k o m i t e a + t y ö e l ä k e k o m i t e a s s a + t y ö e l ä k e l a i t o k s e t + t y ö e l ä k e l a i t o k s i l l e + t y ö e l ä k e l a i t o s t e n + t y ö e l ä k e r a h a s t o i s t a + t y ö e l ä k e r a h a s t o j a + t y ö e l ä k e r a h a s t o j e n + t y ö e l ä k e s o p i m u s t e n + t y ö e l ä k e s ä ä n n ö k s i l l ä + t y ö e l ä k e t a r j o n n a n + t y ö e l ä k e t a r j o n t a a + t y ö e l ä k e v a l v o n t a v i r a n o m a i s t e n + t y ö e l ä k k e e n + t y ö e l ä k k e e t + t y ö e l ä k k e i d e n + t y ö e l ä k k e i l l ä + t y ö e l ä k k e i s i i n + t y ö e l ä k k e i s t ä + t y ö e l ä k k e i t ä + t y ö e l ä m ä d i r e k t i i v i + t y ö e l ä m ä l l e + t y ö e l ä m ä l l e e n + t y ö e l ä m ä n + t y ö e l ä m ä n i + t y ö e l ä m ä n s ä + t y ö e l ä m ä s s ä + t y ö e l ä m ä s s ä n i + t y ö e l ä m ä s s ä ä n + t y ö e l ä m ä s t ä + t y ö e l ä m ä s t ä ä n + t y ö e l ä m ä ä + t y ö e l ä m ä ä m m e + t y ö e l ä m ä ä n + t y ö e l ä m ä ä n k i n + t y ö e l ä m ä ä n s ä + t y ö e t i i k a n + t y ö e t i i k k a + t y ö f o o r u m i + t y ö h a a s t a t t e l u k o u l u t u s + t y ö h a a s t a t t e l u u n + t y ö h a l u i s i a + t y ö h a n k k e i s i i n + t y ö h a n k k e i t a + t y ö h a r j o i t t e l u a + t y ö h a r j o i t t e l u j a + t y ö h a r j o i t t e l u j a k s o j a + t y ö h a r j o i t t e l u l l e + t y ö h a r j o i t t e l u n + t y ö h a r j o i t t e l u o h j e l m a + t y ö h a r j o i t t e l u o h j e l m a a + t y ö h a r j o i t t e l u s s a + t y ö h a r j o i t t e l u s t a + t y ö h a r j o i t t e l u t + t y ö h a r j o i t t e l u u n + t y ö h e n k e ä + t y ö h u i p p u k o k o u k s e s t a + t y ö h u i p p u k o k o u s + t y ö h u i p p u k o k o u s t a + t y ö h y p o t e e s e j a + t y ö h y p o t e e s i k s i + t y ö h y v i n v o i n t i a + t y ö h ä n + t y ö h ö m m e + t y ö h ö n + t y ö h ö n o t o s s a + t y ö h ö n o t t o e l i m i s s ä + t y ö h ö n o t t o j ä r j e s t e l m ä t + t y ö h ö n o t t o k o m i t e o i d e n + t y ö h ö n o t t o k o m i t e o i s s a + t y ö h ö n o t t o k y s y m y k s i i n + t y ö h ö n o t t o k ä y t ä n n ö i l l ä + t y ö h ö n o t t o m e n e t e l m ä ä + t y ö h ö n o t t o m e n e t t e l y i h i n + t y ö h ö n o t t o m e n e t t e l y i s s ä + t y ö h ö n o t t o m e n e t t e l y i s t ä + t y ö h ö n o t t o m e n e t t e l y j ä + t y ö h ö n o t t o m e n e t t e l y t + t y ö h ö n o t t o p o l i t i i k k o j e n + t y ö h ö n o t t o p o l i t i i k o i s t a + t y ö h ö n o t t o s u u n n i t t e l u + t y ö h ö n o t t o v a a t i m u k s i a + t y ö h ö n s ä + t y ö i k ä i s e e n + t y ö i k ä i s e l l e + t y ö i k ä i s e l l ä + t y ö i k ä i s e n + t y ö i k ä i s e s t ä + t y ö i k ä i s i i n + t y ö i k ä i s i s t ä + t y ö i k ä i s i ä + t y ö i k ä i s t e n + t y ö i k ä i s t ä + t y ö i k ä ä + t y ö i l l a l l i s e l l e + t y ö i l l a l l i s e l t a + t y ö i l l a l l i s i l l a + t y ö i l m a p i i r i + t y ö i l m a p i i r i i n + t y ö i l m a p i i r i n + t y ö i l m a p i i r i ä + t y ö i s t u n n o n + t y ö i s t u n n o s s a + t y ö i s t u n t o + t y ö i s t u n t o o n + t y ö i ä n + t y ö i ä s s ä ä n + t y ö j a k s o j e n + t y ö j o u s t o j a + t y ö j ä r j e s t e l m ä s s ä + t y ö j ä r j e s t e l y i h i n + t y ö j ä r j e s t e l y i l l ä + t y ö j ä r j e s t e l y j e n + t y ö j ä r j e s t e l y j ä + t y ö j ä r j e s t e l y t + t y ö j ä r j e s t y k s e e m m e + t y ö j ä r j e s t y k s e e n + t y ö j ä r j e s t y k s e e n s ä + t y ö j ä r j e s t y k s e m m e + t y ö j ä r j e s t y k s e n + t y ö j ä r j e s t y k s e n m u k a i s t a + t y ö j ä r j e s t y k s e n n e + t y ö j ä r j e s t y k s e n s ä + t y ö j ä r j e s t y k s e s s ä + t y ö j ä r j e s t y k s e s s ä m m e + t y ö j ä r j e s t y k s e s t ä + t y ö j ä r j e s t y k s e s t ä m m e + t y ö j ä r j e s t y s a s i a + t y ö j ä r j e s t y s a s i a n t u n t i j o i d e m m e + t y ö j ä r j e s t y s a s i a n t u n t i j o i t a + t y ö j ä r j e s t y s a s i a s t a + t y ö j ä r j e s t y s a s i o i h i n + t y ö j ä r j e s t y s e s i t y k s e s t ä + t y ö j ä r j e s t y s h u o m a u t u k s e e n + t y ö j ä r j e s t y s h u o m a u t u k s i a + t y ö j ä r j e s t y s k e s k u s t e l u i s s a + t y ö j ä r j e s t y s k e s k u s t e l u s s a + t y ö j ä r j e s t y s k e s k u s t e l u u n + t y ö j ä r j e s t y s k y s y m y s + t y ö j ä r j e s t y s m i e t i n n ö s s ä + t y ö j ä r j e s t y s p r o s e s s i n + t y ö j ä r j e s t y s p u h e e n v u o r o + t y ö j ä r j e s t y s p u h e e n v u o r o a + t y ö j ä r j e s t y s p u h e e n v u o r o a n n e + t y ö j ä r j e s t y s p u h e e n v u o r o i h i n + t y ö j ä r j e s t y s p u h e e n v u o r o i s s a + t y ö j ä r j e s t y s p u h e e n v u o r o i s t a + t y ö j ä r j e s t y s p u h e e n v u o r o j a + t y ö j ä r j e s t y s p u h e e n v u o r o j a n n e + t y ö j ä r j e s t y s p u h e e n v u o r o j e n + t y ö j ä r j e s t y s p u h e e n v u o r o k s i + t y ö j ä r j e s t y s p u h e e n v u o r o l l a + t y ö j ä r j e s t y s p u h e e n v u o r o n + t y ö j ä r j e s t y s p u h e e n v u o r o n a + t y ö j ä r j e s t y s p u h e e n v u o r o n i + t y ö j ä r j e s t y s p u h e e n v u o r o n n e + t y ö j ä r j e s t y s p u h e e n v u o r o n s a + t y ö j ä r j e s t y s p u h e e n v u o r o o n + t y ö j ä r j e s t y s p u h e e n v u o r o o s i + t y ö j ä r j e s t y s p u h e e n v u o r o s s a + t y ö j ä r j e s t y s p u h e e n v u o r o s t a + t y ö j ä r j e s t y s p u h e e n v u o r o t + t y ö j ä r j e s t y s s ä ä n t ö j e n + t y ö j ä r j e s t y s t e n + t y ö j ä r j e s t y s t ä + t y ö j ä r j e s t y s t ä m m e + t y ö j ä r j e s t y s t ä ä n + t y ö j ä r j e s t y s u u d i s t u k s e e n + t y ö j ä r j e s t y s v a l i o k u n n a l l e + t y ö j ä r j e s t y s v a l i o k u n n a n + t y ö j ä r j e s t y s v a l i o k u n n a s s a + t y ö j ä r j e s t y s v a l i o k u n t a + t y ö j ä r j e s t ö j e n + t y ö j ä r j e s t ö j e n s ä + t y ö j ä r j e s t ö l l e + t y ö j ä r j e s t ö n + t y ö j ä r j e s t ö s s ä + t y ö j ä r j e s t ö t + t y ö j ä r j e s t ö ä + t y ö j ä r j e s t ö ö n + t y ö k a l u i h i n + t y ö k a l u j a + t y ö k a l u l a a t i k k o o n + t y ö k a l u l t a + t y ö k a l u p a k e t i n + t y ö k a l u p a k k i a + t y ö k a l u t + t y ö k a l u t e r ä k s e t + t y ö k a n n u s t i m i a + t y ö k a p a s i t e e t t i a + t y ö k e t j u n + t y ö k i e l e k s i + t y ö k i e l e l l e + t y ö k i e l e l l ä + t y ö k i e l e m m e + t y ö k i e l e n + t y ö k i e l e n ä + t y ö k i e l e s t ä + t y ö k i e l e t + t y ö k i e l i e n + t y ö k i e l i i n + t y ö k i e l i k s i + t y ö k i e l i l l ä + t y ö k i e l i l l ä m m e + t y ö k i e l i n ä + t y ö k i e l i s t ä + t y ö k i e l i ä + t y ö k i e l t e n + t y ö k i e l t ä + t y ö k i e r t o j ä r j e s t e l m ä + t y ö k i i s t a n + t y ö k o k e m u k s e e n + t y ö k o k e m u k s e k s i + t y ö k o k e m u k s e n + t y ö k o k e m u k s e s t a a n + t y ö k o k e m u s m a h d o l l i s u u k s i e n + t y ö k o k e m u s t a + t y ö k o k o n a i s u u t e e m m e + t y ö k o k o u k s e n + t y ö k o k o u k s i a + t y ö k o k o u k s i i n + t y ö k o k o u k s i k s i + t y ö k o k o u s t a + t y ö k o k o u s t e n + t y ö k o m e n n u k s e l l a + t y ö k o n e i d e n + t y ö k o n e i s s a + t y ö k o n e i t a + t y ö k o n f e r e n s s i + t y ö k o n f e r e n s s i n + t y ö k s i + t y ö k u l t t u u r i + t y ö k u l t t u u r i n + t y ö k u s t a n n u k s e t + t y ö k u s t a n n u k s i a + t y ö k u s t a n n u k s i l l a + t y ö k u s t a n n u k s i s s a + t y ö k u s t a n n u s t e n + t y ö k u u k a u t t a + t y ö k u v a u s t e n + t y ö k u v i o n s a + t y ö k y k y i s e k s i + t y ö k y k y i s i l l e + t y ö k y k y i s i ä + t y ö k y k y i s t ä + t y ö k y k y ä + t y ö k y s y m y s t e n + t y ö k y v y s t ä + t y ö k y v y t t ö m i k s i + t y ö k y v y t t ö m i l l e + t y ö k y v y t t ö m i ä + t y ö k y v y t t ö m y y s e l ä k e j ä r j e s t e l m ä ä n + t y ö k y v y t t ö m y y s e l ä k e t t ä + t y ö k y v y t t ö m y y s e l ä k k e i s i i n + t y ö k y v y t t ö m y y s e t u u k s i e n + t y ö k y v y t t ö m y y s k o r v a u k s i i n + t y ö k y v y t t ö m y y s t u k i + t y ö k y v y t t ö m y y s v a k u u t u s + t y ö k ä y t ä n t ö i h i n + t y ö k ä y t ä n t ö j e n + t y ö k ä y t ä n t ö j ä + t y ö l a i n + t y ö l a i n s ä ä d ä n n ö i s t ä + t y ö l a i n s ä ä d ä n n ö l l e + t y ö l a i n s ä ä d ä n n ö n + t y ö l a i n s ä ä d ä n n ö s s ä + t y ö l a i n s ä ä d ä n n ö s s ä ä n + t y ö l a i n s ä ä d ä n n ö s t ä + t y ö l a i n s ä ä d ä n n ö s t ä ä n + t y ö l a i n s ä ä d ä n t ö + t y ö l a i n s ä ä d ä n t ö j e n + t y ö l a i n s ä ä d ä n t ö m a l l i n + t y ö l a i n s ä ä d ä n t ö m m e + t y ö l a i n s ä ä d ä n t ö n s ä + t y ö l a i n s ä ä d ä n t ö u u d i s t u k s e n + t y ö l a i n s ä ä d ä n t ö ä + t y ö l a i n s ä ä d ä n t ö ä m m e + t y ö l a i n s ä ä d ä n t ö ö n + t y ö l a i t + t y ö l a k e i h i n + t y ö l a k i + t y ö l a k i e n + t y ö l a k i i n + t y ö l e i r e i l l e + t y ö l e i r e i l l ä + t y ö l e i r e i s t ä + t y ö l e i r e j ä + t y ö l e i r i l l e + t y ö l e i r i l l ä + t y ö l e i r i n + t y ö l e i r i t + t y ö l e v o t t o m u u k s i e n + t y ö l e v o t t o m u u t t a + t y ö l l e + t y ö l l e e n + t y ö l l e n i + t y ö l l i s t e t t ä v y y d e l l e + t y ö l l i s t e t t ä v y y d e s t ä + t y ö l l i s t e t t ä v y y s p o l i t i i k k a + t y ö l l i s t e t t ä v ä m p i + t y ö l l i s t i + t y ö l l i s t y m i s a s t e e n + t y ö l l i s t y m i s a s t e e s t a + t y ö l l i s t y m i s e n + t y ö l l i s t y m i s m a h d o l l i s u u d e t + t y ö l l i s t y m i s m a h d o l l i s u u k s i a + t y ö l l i s t y m i s m a h d o l l i s u u k s i a a n + t y ö l l i s t y m i s m a h d o l l i s u u k s i e n + t y ö l l i s t y m i s m a h d o l l i s u u k s i i n s a + t y ö l l i s t y m i s m a h d o l l i s u u k s i s t a + t y ö l l i s t y m i s m a h d o l l i s u u s + t y ö l l i s t y m i s m a h d o l l i s u u t e n s a + t y ö l l i s t y m i s m u o t o j a + t y ö l l i s t y m i s n ä k y m i ä + t y ö l l i s t y m i s p o l k u j e n + t y ö l l i s t y m i s t ä + t y ö l l i s t y m i s t ä ä n + t y ö l l i s t y m i s v a i h t o e h t o j a + t y ö l l i s t y m i s v a i k u t u k s e n + t y ö l l i s t y v ä t + t y ö l l i s t ä e s s ä ä n + t y ö l l i s t ä m i s a l a + t y ö l l i s t ä m i s a l o i t t e e n + t y ö l l i s t ä m i s a l o i t t e e t + t y ö l l i s t ä m i s a l o i t t e i s i i n + t y ö l l i s t ä m i s e d e l l y t y k s i ä + t y ö l l i s t ä m i s e e n + t y ö l l i s t ä m i s e h d o i s t a + t y ö l l i s t ä m i s e k s i + t y ö l l i s t ä m i s e l e m e n t i t + t y ö l l i s t ä m i s e l l e + t y ö l l i s t ä m i s e s t ä + t y ö l l i s t ä m i s j ä r j e s t e l m i e n + t y ö l l i s t ä m i s k e i n o j a + t y ö l l i s t ä m i s k o k o u k s i s s a a n + t y ö l l i s t ä m i s k u s t a n n u k s i a + t y ö l l i s t ä m i s k ä y t ä n n ö i s t ä m m e + t y ö l l i s t ä m i s k ä y t ä n t ö j ä + t y ö l l i s t ä m i s l ä h t e i t ä + t y ö l l i s t ä m i s m a h d o l l i s u u d e t + t y ö l l i s t ä m i s m a h d o l l i s u u k s i a + t y ö l l i s t ä m i s m a h d o l l i s u u k s i a a n + t y ö l l i s t ä m i s m a h d o l l i s u u k s i e n + t y ö l l i s t ä m i s m u o d o t + t y ö l l i s t ä m i s m u o t o j a + t y ö l l i s t ä m i s m u o t o j e n + t y ö l l i s t ä m i s o h j e l m a + t y ö l l i s t ä m i s o h j e l m a a + t y ö l l i s t ä m i s o h j e l m a n + t y ö l l i s t ä m i s o h j e l m i a + t y ö l l i s t ä m i s o h j e l m i e n + t y ö l l i s t ä m i s o h j e l m i i n + t y ö l l i s t ä m i s o h j e l m i s t a + t y ö l l i s t ä m i s p a k e t t i a + t y ö l l i s t ä m i s p o l i t i i k a n + t y ö l l i s t ä m i s p o l i t i i k a s s a + t y ö l l i s t ä m i s p o l i t i i k k a + t y ö l l i s t ä m i s p o l i t i i k k a a + t y ö l l i s t ä m i s p o l i t i i k k a a n + t y ö l l i s t ä m i s p o l i t i i k k o j a + t y ö l l i s t ä m i s p o t e n t i a a l i + t y ö l l i s t ä m i s p o t e n t i a a l i a + t y ö l l i s t ä m i s p o t e n t i a a l i n + t y ö l l i s t ä m i s p r o j e k t e j a + t y ö l l i s t ä m i s p r o s e s s i i n + t y ö l l i s t ä m i s p u i t t e i t a + t y ö l l i s t ä m i s s o p i m u k s e t + t y ö l l i s t ä m i s s o p i m u s t a + t y ö l l i s t ä m i s s t r a t e g i a + t y ö l l i s t ä m i s s t r a t e g i a n + t y ö l l i s t ä m i s s t r a t e g i o i d e n + t y ö l l i s t ä m i s s u u n n i t e l m a a + t y ö l l i s t ä m i s s u u n n i t e l m a n + t y ö l l i s t ä m i s s u u n n i t e l m a t + t y ö l l i s t ä m i s s u u n n i t e l m i e n + t y ö l l i s t ä m i s s u u n n i t e l m i l l a + t y ö l l i s t ä m i s t a r p e e t + t y ö l l i s t ä m i s t a v o i t e + t y ö l l i s t ä m i s t a v o i t t e i d e n + t y ö l l i s t ä m i s t o i m e n p i t e i d e n + t y ö l l i s t ä m i s t o i m i e n + t y ö l l i s t ä m i s t o i m i s t a + t y ö l l i s t ä m i s t u k e a + t y ö l l i s t ä m i s t ä + t y ö l l i s t ä m ä l l ä + t y ö l l i s t ä m ä t + t y ö l l i s t ä m ä ä n + t y ö l l i s t ä v i e n + t y ö l l i s t ä v i ä + t y ö l l i s t ä v ä + t y ö l l i s t ä v ä n + t y ö l l i s t ä v ä n ä + t y ö l l i s t ä v ä t + t y ö l l i s t ä v ä ä + t y ö l l i s t ä ä + t y ö l l i s y y d e l l e + t y ö l l i s y y d e l l e m m e + t y ö l l i s y y d e n + t y ö l l i s y y d e n e d i s t ä m i s p o l i t i i k a n + t y ö l l i s y y d e n e d i s t ä m i s t o i m i a + t y ö l l i s y y d e s s ä + t y ö l l i s y y d e s t ä + t y ö l l i s y y s a a l t o o n + t y ö l l i s y y s a g e n d a s s a + t y ö l l i s y y s a i h e e s s a + t y ö l l i s y y s a i h e i d e n + t y ö l l i s y y s a l a a + t y ö l l i s y y s a l a a n + t y ö l l i s y y s a l a l l a + t y ö l l i s y y s a l a l t a + t y ö l l i s y y s a l a n + t y ö l l i s y y s a l o i t e + t y ö l l i s y y s a l o i t e t t a + t y ö l l i s y y s a l o i t t e e l l e + t y ö l l i s y y s a l o i t t e e n + t y ö l l i s y y s a l o i t t e e s e e n + t y ö l l i s y y s a l o i t t e e t + t y ö l l i s y y s a l o i t t e i d e n + t y ö l l i s y y s a l o i t t e i l l a a n + t y ö l l i s y y s a l o i t t e i s i i n + t y ö l l i s y y s a l o i t t e i t a + t y ö l l i s y y s a l u e e l l e + t y ö l l i s y y s a l u e i d e n + t y ö l l i s y y s a s i a i n v a l i o k u n n a n + t y ö l l i s y y s a s i a k i r j o j a + t y ö l l i s y y s a s i a n t u n t i j a t + t y ö l l i s y y s a s i a s s a + t y ö l l i s y y s a s i a t + t y ö l l i s y y s a s i o i h i n + t y ö l l i s y y s a s i o i s s a + t y ö l l i s y y s a s i o i t a + t y ö l l i s y y s a s t e e l l a + t y ö l l i s y y s a s t e e l l e + t y ö l l i s y y s a s t e e m m e + t y ö l l i s y y s a s t e e n + t y ö l l i s y y s a s t e e n s a + t y ö l l i s y y s a s t e e s e e n + t y ö l l i s y y s a s t e e s t a + t y ö l l i s y y s a s t e e t + t y ö l l i s y y s a s t e i d e n + t y ö l l i s y y s a s t e i s s a + t y ö l l i s y y s a s t e i s t a + t y ö l l i s y y s a s t e i t a + t y ö l l i s y y s a s t e t t a + t y ö l l i s y y s d i r e k t i i v e i h i n + t y ö l l i s y y s d i r e k t i i v e j ä + t y ö l l i s y y s d i r e k t i i v i + t y ö l l i s y y s d i r e k t i i v i i n + t y ö l l i s y y s d i r e k t i i v i l l ä + t y ö l l i s y y s d i r e k t i i v i l u o n n o s t e n + t y ö l l i s y y s d i r e k t i i v i n + t y ö l l i s y y s d i r e k t i i v i ä + t y ö l l i s y y s e d e l l y t y k s e t + t y ö l l i s y y s e d u i s t a + t y ö l l i s y y s e d u t + t y ö l l i s y y s e h d o t u k s e s t a + t y ö l l i s y y s e r o j a + t y ö l l i s y y s e r o j e n + t y ö l l i s y y s f o o r u m i i n + t y ö l l i s y y s h a n k e + t y ö l l i s y y s h a n k k e i s i i n + t y ö l l i s y y s h i s t o r i a s s a + t y ö l l i s y y s h u i p p u k o k o u k s e e n + t y ö l l i s y y s h u i p p u k o k o u k s e k s i + t y ö l l i s y y s h u i p p u k o k o u k s e l l a + t y ö l l i s y y s h u i p p u k o k o u k s e l l e + t y ö l l i s y y s h u i p p u k o k o u k s e l t a + t y ö l l i s y y s h u i p p u k o k o u k s e n + t y ö l l i s y y s h u i p p u k o k o u k s e s s a + t y ö l l i s y y s h u i p p u k o k o u k s e s t a + t y ö l l i s y y s h u i p p u k o k o u k s i i n + t y ö l l i s y y s h u i p p u k o k o u s + t y ö l l i s y y s h u i p p u k o k o u s t a + t y ö l l i s y y s i n d i k a a t t o r i e n + t y ö l l i s y y s i n d i k a a t t o r i n + t y ö l l i s y y s i n d i k a a t t o r i t + t y ö l l i s y y s j a k s o n + t y ö l l i s y y s j u l k i l a u s u m a + t y ö l l i s y y s j ä r j e s t e l m i e n + t y ö l l i s y y s j ä r j e s t e l m i i n + t y ö l l i s y y s j ä r j e s t e l m i s s ä + t y ö l l i s y y s j ä r j e s t e l m i ä ä n + t y ö l l i s y y s j ä r j e s t e l m ä t + t y ö l l i s y y s j ä r j e s t e l y t + t y ö l l i s y y s k a m p a n j a s s a + t y ö l l i s y y s k a n n u s t i m i a + t y ö l l i s y y s k a s v u + t y ö l l i s y y s k e h i t y k s e n + t y ö l l i s y y s k e h i t y k s e s t ä + t y ö l l i s y y s k e h i t y s + t y ö l l i s y y s k e h i t y s t ä + t y ö l l i s y y s k e h y k s e s t ä + t y ö l l i s y y s k e h y s + t y ö l l i s y y s k e r t o m u k s i n e e n + t y ö l l i s y y s k e r t o m u s + t y ö l l i s y y s k e r t o m u s t a + t y ö l l i s y y s k e s k e i s e e n + t y ö l l i s y y s k e s k e i s e m p i ä + t y ö l l i s y y s k e s k u k s e t + t y ö l l i s y y s k e s k u s t e l u n + t y ö l l i s y y s k e s k u s t e l u s s a + t y ö l l i s y y s k i i n t i ö t ä + t y ö l l i s y y s k o h d a s t a + t y ö l l i s y y s k o k o u k s e e n + t y ö l l i s y y s k o k o u k s e l t a + t y ö l l i s y y s k o k o u k s e n + t y ö l l i s y y s k o k o u k s e s s a + t y ö l l i s y y s k o k o u k s i a + t y ö l l i s y y s k o k o u s + t y ö l l i s y y s k o m i t e a + t y ö l l i s y y s k o m i t e a n + t y ö l l i s y y s k o n f e r e n s s i + t y ö l l i s y y s k o r t i s t a + t y ö l l i s y y s k o r t t i e n + t y ö l l i s y y s k r i i s e i h i n + t y ö l l i s y y s k r i i s i + t y ö l l i s y y s k r i i s i i n + t y ö l l i s y y s k r i i s i k s i + t y ö l l i s y y s k r i i s i n + t y ö l l i s y y s k r i i s i s t ä + t y ö l l i s y y s k r i i s i ä + t y ö l l i s y y s k r i t e e r e j ä + t y ö l l i s y y s k r i t e e r i t + t y ö l l i s y y s k u i l u a + t y ö l l i s y y s k u s t a n n u k s i a + t y ö l l i s y y s k y s y m y k s e e n + t y ö l l i s y y s k y s y m y k s e l l ä + t y ö l l i s y y s k y s y m y k s e n + t y ö l l i s y y s k y s y m y k s e s s ä + t y ö l l i s y y s k y s y m y k s e s t ä + t y ö l l i s y y s k y s y m y k s e t + t y ö l l i s y y s k y s y m y k s i i n + t y ö l l i s y y s k y s y m y k s i s s ä + t y ö l l i s y y s k y s y m y k s i s t ä + t y ö l l i s y y s k y s y m y k s i ä + t y ö l l i s y y s k y s y m y s + t y ö l l i s y y s k y s y m y s t e n + t y ö l l i s y y s k y s y m y s t ä + t y ö l l i s y y s k ä y t ä n n ö i l l e + t y ö l l i s y y s l a i n s ä ä d ä n n ö n + t y ö l l i s y y s l a i n s ä ä d ä n t ö + t y ö l l i s y y s l a i n s ä ä d ä n t ö ä + t y ö l l i s y y s l a k e j a + t y ö l l i s y y s l u k e m a t + t y ö l l i s y y s l u k u + t y ö l l i s y y s l u k u a + t y ö l l i s y y s l u k u i h i n + t y ö l l i s y y s l u k u j a + t y ö l l i s y y s l u k u j e n + t y ö l l i s y y s l u k u n s a + t y ö l l i s y y s l u v u i s s a + t y ö l l i s y y s l u v u i s t a + t y ö l l i s y y s l u v u l l a + t y ö l l i s y y s l u v u n + t y ö l l i s y y s l u v u t + t y ö l l i s y y s l ä h d e + t y ö l l i s y y s l ä h d e t t ä + t y ö l l i s y y s l ä h e s t y m i s t a p a a m m e + t y ö l l i s y y s l ä h t e i l l e + t y ö l l i s y y s l ä h t e i n ä + t y ö l l i s y y s m a h d o l l i s u u k s i a + t y ö l l i s y y s m a h d o l l i s u u k s i a a n + t y ö l l i s y y s m a h d o l l i s u u k s i e n + t y ö l l i s y y s m a h d o l l i s u u k s i i n + t y ö l l i s y y s m a h d o l l i s u u k s i s t a + t y ö l l i s y y s m a l l i + t y ö l l i s y y s m a l l i e n + t y ö l l i s y y s m a l l i t + t y ö l l i s y y s m a r k k i n a t + t y ö l l i s y y s m a r k k i n o i l l a + t y ö l l i s y y s m a r k k i n o i l l e + t y ö l l i s y y s m a r k k i n o i s t a + t y ö l l i s y y s m i e t i n n ö n + t y ö l l i s y y s m i e t i n t ö ö n + t y ö l l i s y y s m i n i s t e r i e n + t y ö l l i s y y s m i n i s t e r i t + t y ö l l i s y y s m i n i s t e r i ä + t y ö l l i s y y s m u o d o i l l a + t y ö l l i s y y s m u o d o t + t y ö l l i s y y s m u o t o i h i n + t y ö l l i s y y s m u o t o j a + t y ö l l i s y y s m u o t o j e n + t y ö l l i s y y s m u u t o k s i a + t y ö l l i s y y s n e u v o s t o + t y ö l l i s y y s n e u v o s t o n + t y ö l l i s y y s n e u v o s t o s s a + t y ö l l i s y y s n o r m e j a + t y ö l l i s y y s n ä k y m i e n + t y ö l l i s y y s n ä k y m i i n + t y ö l l i s y y s n ä k y m i l l e + t y ö l l i s y y s n ä k y m i s t ä + t y ö l l i s y y s n ä k y m i ä + t y ö l l i s y y s n ä k y m ä t + t y ö l l i s y y s n ä k ö k o h d a n + t y ö l l i s y y s n ä k ö k o h d a t + t y ö l l i s y y s n ä k ö k o h d i s t a + t y ö l l i s y y s n ä k ö k o h t a + t y ö l l i s y y s n ä k ö k o h t i a + t y ö l l i s y y s n ä k ö k o h t i e n + t y ö l l i s y y s n ä k ö k o h t i i n + t y ö l l i s y y s o h j e i t a + t y ö l l i s y y s o h j e l m a + t y ö l l i s y y s o h j e l m a a + t y ö l l i s y y s o h j e l m a k s i + t y ö l l i s y y s o h j e l m a n + t y ö l l i s y y s o h j e l m a s s a + t y ö l l i s y y s o h j e l m a s t a + t y ö l l i s y y s o h j e l m a t + t y ö l l i s y y s o h j e l m i a + t y ö l l i s y y s o h j e l m i e n + t y ö l l i s y y s o h j e l m i i n + t y ö l l i s y y s o h j e l m i s s a + t y ö l l i s y y s o i k e u k s i a + t y ö l l i s y y s o l o i h i n + t y ö l l i s y y s o l o i s t a + t y ö l l i s y y s o l o j a + t y ö l l i s y y s o n g e l m a + t y ö l l i s y y s o n g e l m a a + t y ö l l i s y y s o n g e l m a a n + t y ö l l i s y y s o n g e l m a m m e + t y ö l l i s y y s o n g e l m a n + t y ö l l i s y y s o n g e l m a s s a + t y ö l l i s y y s o n g e l m a s t a + t y ö l l i s y y s o n g e l m a t + t y ö l l i s y y s o n g e l m i a + t y ö l l i s y y s o n g e l m i i n + t y ö l l i s y y s o n g e l m i s t a + t y ö l l i s y y s p a i n o t t e i s t a + t y ö l l i s y y s p a k e t i l l a + t y ö l l i s y y s p a k e t i n + t y ö l l i s y y s p a k e t i s t a + t y ö l l i s y y s p a k e t t i + t y ö l l i s y y s p a k e t t i a + t y ö l l i s y y s p a l v e l u i d e n + t y ö l l i s y y s p a l v e l u i h i n + t y ö l l i s y y s p a l v e l u i t a + t y ö l l i s y y s p a l v e l u j e n + t y ö l l i s y y s p e r u s t e i t a + t y ö l l i s y y s p o l i i t t i s e e n + t y ö l l i s y y s p o l i i t t i s e n + t y ö l l i s y y s p o l i i t t i s e n a + t y ö l l i s y y s p o l i i t t i s e s t a + t y ö l l i s y y s p o l i i t t i s e s t i + t y ö l l i s y y s p o l i i t t i s e t + t y ö l l i s y y s p o l i i t t i s i a + t y ö l l i s y y s p o l i i t t i s i i n + t y ö l l i s y y s p o l i i t t i s i k s i + t y ö l l i s y y s p o l i i t t i s i s t a + t y ö l l i s y y s p o l i i t t i s t a + t y ö l l i s y y s p o l i i t t i s t e n + t y ö l l i s y y s p o l i t i i k a l l a + t y ö l l i s y y s p o l i t i i k a l l e + t y ö l l i s y y s p o l i t i i k a n + t y ö l l i s y y s p o l i t i i k a n k i n + t y ö l l i s y y s p o l i t i i k a s s a + t y ö l l i s y y s p o l i t i i k a s s a a n + t y ö l l i s y y s p o l i t i i k a s t a + t y ö l l i s y y s p o l i t i i k a s t a a n + t y ö l l i s y y s p o l i t i i k a s t a m m e + t y ö l l i s y y s p o l i t i i k a t + t y ö l l i s y y s p o l i t i i k k a a + t y ö l l i s y y s p o l i t i i k k a a k a a n + t y ö l l i s y y s p o l i t i i k k a a n + t y ö l l i s y y s p o l i t i i k k a a n s a + t y ö l l i s y y s p o l i t i i k k a k i n + t y ö l l i s y y s p o l i t i i k k a m m e + t y ö l l i s y y s p o l i t i i k k a n s a + t y ö l l i s y y s p o l i t i i k k o i h i m m e + t y ö l l i s y y s p o l i t i i k k o i h i n + t y ö l l i s y y s p o l i t i i k k o j a + t y ö l l i s y y s p o l i t i i k k o j a a n + t y ö l l i s y y s p o l i t i i k k o j e n + t y ö l l i s y y s p o l i t i i k o i d e n + t y ö l l i s y y s p o l i t i i k o i l l a + t y ö l l i s y y s p o l i t i i k o i s s a + t y ö l l i s y y s p o l i t i i k o i s t a + t y ö l l i s y y s p o l i t i i k o i t a + t y ö l l i s y y s p o t e n t i a a l i a + t y ö l l i s y y s p r o s e s s i + t y ö l l i s y y s p r o s e s s i a + t y ö l l i s y y s p r o s e s s i i n + t y ö l l i s y y s p r o s e s s i n + t y ö l l i s y y s p r o s e s s i s s a + t y ö l l i s y y s p u i t e d i r e k t i i v i + t y ö l l i s y y s p u i t e d i r e k t i i v i i n + t y ö l l i s y y s p u i t e d i r e k t i i v i n + t y ö l l i s y y s p u i t e d i r e k t i i v i ä + t y ö l l i s y y s p u i t t e i s s a + t y ö l l i s y y s p ä ä t ö k s i ä + t y ö l l i s y y s r a h a s t o + t y ö l l i s y y s r a h a s t o j e n + t y ö l l i s y y s r a h a s t o n + t y ö l l i s y y s r a k e n n e t t a + t y ö l l i s y y s r a k e n t e e n + t y ö l l i s y y s r a k e n t e e s e e n + t y ö l l i s y y s r a k e n t e i d e n + t y ö l l i s y y s r a k e n t e i l l e + t y ö l l i s y y s r a p o r t i k s i + t y ö l l i s y y s r a p o r t i n + t y ö l l i s y y s r a p o r t i s s a + t y ö l l i s y y s r a p o r t i s t a + t y ö l l i s y y s r a p o r t t i + t y ö l l i s y y s r a p o r t t i a + t y ö l l i s y y s r i s k e j ä + t y ö l l i s y y s s i l m ä l a s i e n + t y ö l l i s y y s s o p i m u k s e e n + t y ö l l i s y y s s o p i m u k s e k s i + t y ö l l i s y y s s o p i m u k s e l l a + t y ö l l i s y y s s o p i m u k s e l l e + t y ö l l i s y y s s o p i m u k s e l t a + t y ö l l i s y y s s o p i m u k s e n + t y ö l l i s y y s s o p i m u k s e s t a + t y ö l l i s y y s s o p i m u k s e t + t y ö l l i s y y s s o p i m u k s i a + t y ö l l i s y y s s o p i m u k s i i n + t y ö l l i s y y s s o p i m u k s i s t a + t y ö l l i s y y s s o p i m u s + t y ö l l i s y y s s o p i m u s p r o s e s s i a + t y ö l l i s y y s s o p i m u s t a + t y ö l l i s y y s s o p i m u s t e n + t y ö l l i s y y s s t a n d a r d e i s s a + t y ö l l i s y y s s t a n d a r d e i s t a + t y ö l l i s y y s s t a n d a r d i e n + t y ö l l i s y y s s t r a t e g i a + t y ö l l i s y y s s t r a t e g i a a + t y ö l l i s y y s s t r a t e g i a a m m e + t y ö l l i s y y s s t r a t e g i a a n + t y ö l l i s y y s s t r a t e g i a k s i + t y ö l l i s y y s s t r a t e g i a l l a + t y ö l l i s y y s s t r a t e g i a l l e + t y ö l l i s y y s s t r a t e g i a m m e + t y ö l l i s y y s s t r a t e g i a n + t y ö l l i s y y s s t r a t e g i a s s a + t y ö l l i s y y s s t r a t e g i a s t a + t y ö l l i s y y s s t r a t e g i a t + t y ö l l i s y y s s t r a t e g i o i d e n + t y ö l l i s y y s s t r a t e g i o i d e n s a + t y ö l l i s y y s s t r a t e g i o i h i n + t y ö l l i s y y s s t r a t e g i o i k s e e n + t y ö l l i s y y s s t r a t e g i o i s s a + t y ö l l i s y y s s t r a t e g i o i s t a + t y ö l l i s y y s s t r a t e g i o i t a + t y ö l l i s y y s s t r a t e g i s i a + t y ö l l i s y y s s t r a t e g i s s a + t y ö l l i s y y s s t r a t e g i s t a + t y ö l l i s y y s s u h t e i s i i n + t y ö l l i s y y s s u o s i t u k s i i n + t y ö l l i s y y s s u u n n i t e l m a + t y ö l l i s y y s s u u n n i t e l m a a + t y ö l l i s y y s s u u n n i t e l m a n + t y ö l l i s y y s s u u n n i t e l m a t + t y ö l l i s y y s s u u n n i t e l m i a + t y ö l l i s y y s s u u n n i t e l m i a a n + t y ö l l i s y y s s u u n n i t e l m i e n + t y ö l l i s y y s s u u n n i t e l m i i n + t y ö l l i s y y s s u u n n i t e l m i s s a + t y ö l l i s y y s s u u n n i t e l m i s t a + t y ö l l i s y y s s u u n t a u k s i a + t y ö l l i s y y s s u u n t a v i i v a t + t y ö l l i s y y s s u u n t a v i i v o i h i n + t y ö l l i s y y s s u u n t a v i i v o i k s i + t y ö l l i s y y s s u u n t a v i i v o i s s a + t y ö l l i s y y s s u u n t a v i i v o i s t a + t y ö l l i s y y s s u u n t a v i i v o j a + t y ö l l i s y y s s u u n t a v i i v o j e n + t y ö l l i s y y s s y i s t ä + t y ö l l i s y y s s ä ä n t ö j e n + t y ö l l i s y y s t a k u i t a + t y ö l l i s y y s t a l o u s a r v i o + t y ö l l i s y y s t a l o u s a r v i o s t a + t y ö l l i s y y s t a r k o i t u k s e s s a + t y ö l l i s y y s t a r p e i s i i n + t y ö l l i s y y s t a s a p a i n o a + t y ö l l i s y y s t a s e e s e e n + t y ö l l i s y y s t a s o + t y ö l l i s y y s t a s o a + t y ö l l i s y y s t a s o i h i n + t y ö l l i s y y s t a s o i s t a + t y ö l l i s y y s t a s o j a + t y ö l l i s y y s t a s o j e n + t y ö l l i s y y s t a s o l l e + t y ö l l i s y y s t a s o n + t y ö l l i s y y s t a s o o n + t y ö l l i s y y s t a s o s t a + t y ö l l i s y y s t a v o i t e + t y ö l l i s y y s t a v o i t e t t a + t y ö l l i s y y s t a v o i t t e e l l a m m e + t y ö l l i s y y s t a v o i t t e e n + t y ö l l i s y y s t a v o i t t e e n s a + t y ö l l i s y y s t a v o i t t e e s e e n + t y ö l l i s y y s t a v o i t t e e t + t y ö l l i s y y s t a v o i t t e i d e n + t y ö l l i s y y s t a v o i t t e i s i i n + t y ö l l i s y y s t a v o i t t e i s t a + t y ö l l i s y y s t a v o i t t e i t a + t y ö l l i s y y s t e e m a + t y ö l l i s y y s t e k i j ä + t y ö l l i s y y s t e k i j ö i t ä + t y ö l l i s y y s t i e t o j e n + t y ö l l i s y y s t i l a n n e t t a + t y ö l l i s y y s t i l a n t e e l l e + t y ö l l i s y y s t i l a n t e e n + t y ö l l i s y y s t i l a n t e e n s a + t y ö l l i s y y s t i l a n t e e s e e n + t y ö l l i s y y s t i l a n t e e s s a + t y ö l l i s y y s t i l a n t e e s t a + t y ö l l i s y y s t i l a s t o j a + t y ö l l i s y y s t i l a s t o j e n + t y ö l l i s y y s t o i m e n p i t e i d e n + t y ö l l i s y y s t o i m e n p i t e i t ä + t y ö l l i s y y s t o i m e t + t y ö l l i s y y s t o i m i a + t y ö l l i s y y s t o i m i e n + t y ö l l i s y y s t o i m i n t a l i n j o j a + t y ö l l i s y y s t o i m i n t a o h j e l m i a a n + t y ö l l i s y y s t o i m i s t a + t y ö l l i s y y s t u e n + t y ö l l i s y y s t u e s t a + t y ö l l i s y y s t u e t + t y ö l l i s y y s t u k e a + t y ö l l i s y y s t u k e e n + t y ö l l i s y y s t u k e n a + t y ö l l i s y y s t u k i + t y ö l l i s y y s t u k i a + t y ö l l i s y y s t u k i e n + t y ö l l i s y y s t u k i j ä r j e s t e l m ä n + t y ö l l i s y y s t u k i p o l i t i i k a n + t y ö l l i s y y s t u k i t o i m e n p i t e e t + t y ö l l i s y y s t u r v a + t y ö l l i s y y s t u r v a a + t y ö l l i s y y s t u r v a a n + t y ö l l i s y y s t u r v a l l a + t y ö l l i s y y s t u r v a n + t y ö l l i s y y s t u r v a s t a + t y ö l l i s y y s t u t k i m u s + t y ö l l i s y y s t y ö r y h m ä + t y ö l l i s y y s t y ö r y h m ä n + t y ö l l i s y y s t y ö r y h m ä s s ä + t y ö l l i s y y s t y ö r y h m ä ä + t y ö l l i s y y s u l o t t u v u u d e t + t y ö l l i s y y s u l o t t u v u u s + t y ö l l i s y y s u l o t t u v u u t t a + t y ö l l i s y y s u n i o n i n + t y ö l l i s y y s u n i o n i s t a + t y ö l l i s y y s v a a t i m u k s e t + t y ö l l i s y y s v a a t i m u k s i l l a + t y ö l l i s y y s v a i h t o e h t o j a + t y ö l l i s y y s v a i k u t u k s e n + t y ö l l i s y y s v a i k u t u k s e s t a + t y ö l l i s y y s v a i k u t u k s e t + t y ö l l i s y y s v a i k u t u k s i a + t y ö l l i s y y s v a i k u t u k s i i n + t y ö l l i s y y s v a i k u t u k s i s t a + t y ö l l i s y y s v a i k u t u s + t y ö l l i s y y s v a i k u t u s t e n + t y ö l l i s y y s v a i k u t u s t e n s a + t y ö l l i s y y s v a l i o k u n n a l l e + t y ö l l i s y y s v a l i o k u n n a n + t y ö l l i s y y s v a l i o k u n n a s s a + t y ö l l i s y y s v a l i o k u n t a + t y ö l l i s y y s v a l i o k u n t a a + t y ö l l i s y y s v a l i o k u n t a a n + t y ö l l i s y y s v e r o s t a + t y ö l l i s y y s y s t ä v ä l l i s e m p i ä + t y ö l l i s y y t e e n + t y ö l l i s y y t e m m e + t y ö l l i s y y t t ä + t y ö l l i s y y t t ä ä n + t y ö l l ä + t y ö l l ä ä n + t y ö l o u n a a l l a + t y ö l o u n a s + t y ö l t ä m m e + t y ö l u o k a s t a + t y ö l u o n n o k s i a + t y ö l u p a a + t y ö l u p a j ä r j e s t e l m ä + t y ö l u p a n s a + t y ö l u p a v a a t i m u k s e n + t y ö l u p i a + t y ö l u p i e n + t y ö l u p i i n + t y ö l u v a l l e + t y ö l u v a n + t y ö l u v a s t a + t y ö l u v a t + t y ö l ä i d e n + t y ö l ä i s a k t i v i s t i e n + t y ö l ä i s a l u e i l l a + t y ö l ä i s e t + t y ö l ä i s i i n + t y ö l ä i s i l l e + t y ö l ä i s i l t ä + t y ö l ä i s i ä + t y ö l ä i s j ä s e n t e n + t y ö l ä i s k a u p u n g i n o s i e n + t y ö l ä i s l ä h i ö i d e n + t y ö l ä i s n a i s i a + t y ö l ä i s n e u v o s t o t + t y ö l ä i s o l y m p i a l a i s e t + t y ö l ä i s p e r h e i d e n + t y ö l ä i s t e n + t y ö l ä i s t e n k i n + t y ö l ä i s u r h e i l u l i i t t o + t y ö l ä i s v a s t a i n e n + t y ö l ä i s v a s t a i s t a + t y ö l ä i s v a s t a i s t e n + t y ö l ä s t ä + t y ö l ä ä k s i + t y ö l ä ä m p i ä + t y ö l ä ä n + t y ö l ä ä t + t y ö m a a i l m a n + t y ö m a a i l m a s s a + t y ö m a a l l a + t y ö m a a l l e + t y ö m a a n + t y ö m a h d o l l i s u u d e t + t y ö m a h d o l l i s u u k s i a + t y ö m a h d o l l i s u u k s i e n + t y ö m a h d o l l i s u u k s i e n s a + t y ö m a h d o l l i s u u k s i i n + t y ö m a h d o l l i s u u k s i s t a + t y ö m a i d e n + t y ö m a i l l a + t y ö m a i t a + t y ö m a l l e i n e e n + t y ö m a l l e j a + t y ö m a l l i a + t y ö m a l l i e n + t y ö m a r k k i n a + t y ö m a r k k i n a e d e l l y t y k s e t + t y ö m a r k k i n a e h d o i l l e + t y ö m a r k k i n a e h d o t + t y ö m a r k k i n a e h t o i h i n + t y ö m a r k k i n a e h t o j a + t y ö m a r k k i n a e h t o j e n + t y ö m a r k k i n a f o o r u m i a + t y ö m a r k k i n a h ä i r i ö i d e n + t y ö m a r k k i n a i l m i ö s t ä + t y ö m a r k k i n a j o u s t o j a + t y ö m a r k k i n a j o u s t o j e n + t y ö m a r k k i n a j ä r j e s t e l m ä l l e + t y ö m a r k k i n a j ä r j e s t e l m ä n + t y ö m a r k k i n a j ä r j e s t e l y + t y ö m a r k k i n a j ä r j e s t e l y i h i n + t y ö m a r k k i n a j ä r j e s t ö i l l ä + t y ö m a r k k i n a j ä r j e s t ö i s s ä + t y ö m a r k k i n a j ä r j e s t ö j e n + t y ö m a r k k i n a j ä r j e s t ö j ä + t y ö m a r k k i n a j ä r j e s t ö t + t y ö m a r k k i n a k e h i t y k s e l l e + t y ö m a r k k i n a k e s k u s t e l u u n + t y ö m a r k k i n a k i i s t a a n + t y ö m a r k k i n a k i i s t a t + t y ö m a r k k i n a k o k o u k s e s s a + t y ö m a r k k i n a k o m i t e a s s a + t y ö m a r k k i n a k o u l u t u s t a + t y ö m a r k k i n a k u l t t u u r i t + t y ö m a r k k i n a k u m p p a n e i l t a + t y ö m a r k k i n a k u m p p a n u u d e s t a + t y ö m a r k k i n a k u m p p a n u u s + t y ö m a r k k i n a k y s y m y k s e t + t y ö m a r k k i n a k y s y m y k s i i n + t y ö m a r k k i n a k y s y m y k s i s s ä + t y ö m a r k k i n a k y s y m y s + t y ö m a r k k i n a l a i n s ä ä d ä n n ö n + t y ö m a r k k i n a l a i n s ä ä d ä n n ö s t ä + t y ö m a r k k i n a l a i n s ä ä d ä n t ö + t y ö m a r k k i n a l a i n s ä ä d ä n t ö m m e + t y ö m a r k k i n a l a i n s ä ä d ä n t ö ä + t y ö m a r k k i n a l a i n s ä ä d ä n t ö ö n + t y ö m a r k k i n a l a i t + t y ö m a r k k i n a l a i t o k s e t + t y ö m a r k k i n a l l e + t y ö m a r k k i n a l o h k o n + t y ö m a r k k i n a m a l l e i h i n + t y ö m a r k k i n a m a l l e i s t a + t y ö m a r k k i n a m a l l i + t y ö m a r k k i n a m a l l i a + t y ö m a r k k i n a m a l l i i n + t y ö m a r k k i n a m a l l i n + t y ö m a r k k i n a m i n i s t e r i e n + t y ö m a r k k i n a m m e + t y ö m a r k k i n a m ä ä r ä y s t e n + t y ö m a r k k i n a n e u v o t t e l u i l l a + t y ö m a r k k i n a n e u v o t t e l u i s t a + t y ö m a r k k i n a n e u v o t t e l u j a + t y ö m a r k k i n a n e u v o t t e l u j e n + t y ö m a r k k i n a n e u v o t t e l u t + t y ö m a r k k i n a n o r m e j a + t y ö m a r k k i n a n o r m i e n + t y ö m a r k k i n a n s a + t y ö m a r k k i n a o i k e u k s i a + t y ö m a r k k i n a o i k e u k s i e n + t y ö m a r k k i n a o l o i h i n + t y ö m a r k k i n a o l o j a + t y ö m a r k k i n a o l o j e n + t y ö m a r k k i n a o l o s u h t e i d e n + t y ö m a r k k i n a o l o s u h t e i s i i n + t y ö m a r k k i n a o s a p u o l e k s i + t y ö m a r k k i n a o s a p u o l e m m e + t y ö m a r k k i n a o s a p u o l e n + t y ö m a r k k i n a o s a p u o l e n s a + t y ö m a r k k i n a o s a p u o l e t + t y ö m a r k k i n a o s a p u o l i a + t y ö m a r k k i n a o s a p u o l i e m m e + t y ö m a r k k i n a o s a p u o l i e n + t y ö m a r k k i n a o s a p u o l i e n k i n + t y ö m a r k k i n a o s a p u o l i i n + t y ö m a r k k i n a o s a p u o l i l l a + t y ö m a r k k i n a o s a p u o l i l l e + t y ö m a r k k i n a o s a p u o l i l t a + t y ö m a r k k i n a o s a p u o l i n a + t y ö m a r k k i n a o s a p u o l i s s a + t y ö m a r k k i n a o s a p u o l i s t a + t y ö m a r k k i n a o s a p u o l t a + t y ö m a r k k i n a o s a p u o l t e n + t y ö m a r k k i n a o s a p u o l t e n k i n + t y ö m a r k k i n a p a i n o t t e i s i a + t y ö m a r k k i n a p a l v e l u j e n + t y ö m a r k k i n a p e r i n t e i d e n + t y ö m a r k k i n a p o l i i t t i n e n + t y ö m a r k k i n a p o l i i t t i s e n + t y ö m a r k k i n a p o l i i t t i s e s t i + t y ö m a r k k i n a p o l i i t t i s e t + t y ö m a r k k i n a p o l i i t t i s i a + t y ö m a r k k i n a p o l i i t t i s i i n + t y ö m a r k k i n a p o l i i t t i s i s t a + t y ö m a r k k i n a p o l i i t t i s t a + t y ö m a r k k i n a p o l i i t t i s t e n + t y ö m a r k k i n a p o l i t i i k a k s i + t y ö m a r k k i n a p o l i t i i k a l l a + t y ö m a r k k i n a p o l i t i i k a l l e + t y ö m a r k k i n a p o l i t i i k a n + t y ö m a r k k i n a p o l i t i i k a s s a + t y ö m a r k k i n a p o l i t i i k a s t a + t y ö m a r k k i n a p o l i t i i k k a a + t y ö m a r k k i n a p o l i t i i k k a a n + t y ö m a r k k i n a p o l i t i i k k a a n s a + t y ö m a r k k i n a p o l i t i i k k a m m e + t y ö m a r k k i n a p o l i t i i k k o j a + t y ö m a r k k i n a p o l i t i i k k o j e n + t y ö m a r k k i n a p u o l i e n + t y ö m a r k k i n a r a j o i t u k s e t + t y ö m a r k k i n a r a k e n n e + t y ö m a r k k i n a r a k e n t e i d e n + t y ö m a r k k i n a r a u h a a n + t y ö m a r k k i n a r i i t o i h i n + t y ö m a r k k i n a s o p i m u k s i a + t y ö m a r k k i n a s o p i m u k s i l l e + t y ö m a r k k i n a s o p i m u k s i s s a + t y ö m a r k k i n a s o p i m u s t e n + t y ö m a r k k i n a s t r a t e g i a + t y ö m a r k k i n a s t r a t e g i a n + t y ö m a r k k i n a s t r a t e g i a s s a + t y ö m a r k k i n a s t r a t e g i a s t a + t y ö m a r k k i n a s u h d e j ä r j e s t e l m i i n + t y ö m a r k k i n a s u h d e j ä r j e s t e l y j ä + t y ö m a r k k i n a s u h t e e t + t y ö m a r k k i n a s u h t e i d e n + t y ö m a r k k i n a s u h t e i k s i + t y ö m a r k k i n a s u h t e i s i i n + t y ö m a r k k i n a s u h t e i s s a + t y ö m a r k k i n a s u h t e i s t a + t y ö m a r k k i n a s u h t e i t a + t y ö m a r k k i n a s u o j a n + t y ö m a r k k i n a s u u n t a u k s i i n + t y ö m a r k k i n a s ä ä n n ö i l l e + t y ö m a r k k i n a s ä ä n n ö k s e t + t y ö m a r k k i n a s ä ä n t e l y n + t y ö m a r k k i n a s ä ä n t e l y ä + t y ö m a r k k i n a s ä ä n t ö j e n + t y ö m a r k k i n a s ä ä n t ö j ä + t y ö m a r k k i n a s ä ä n t ö m m e + t y ö m a r k k i n a t + t y ö m a r k k i n a t a i s t e l u i s s a + t y ö m a r k k i n a t a l o u d e n + t y ö m a r k k i n a t a r p e i d e n + t y ö m a r k k i n a t i l a n n e + t y ö m a r k k i n a t i l a n n e t t a + t y ö m a r k k i n a t i l a n t e e n + t y ö m a r k k i n a t i l a n t e e s e e n + t y ö m a r k k i n a t i l a n t e e s s a m m e + t y ö m a r k k i n a t i l a n t e i d e n + t y ö m a r k k i n a t i l a n t e i s s a + t y ö m a r k k i n a t i l a s t o j a + t y ö m a r k k i n a t o i m e n p i t e e n ä + t y ö m a r k k i n a t o i m e n p i t e i d e n + t y ö m a r k k i n a t o i m e n p i t e i s i i n + t y ö m a r k k i n a t o i m e n p i t e i t ä + t y ö m a r k k i n a t o i m i a + t y ö m a r k k i n a t o i m i e n + t y ö m a r k k i n a t o i m i i n + t y ö m a r k k i n a t u e t + t y ö m a r k k i n a t u k i t o i m i a + t y ö m a r k k i n a t u r v a a + t y ö m a r k k i n a t u t k i m u k s i a + t y ö m a r k k i n a t u t k i m u k s i s t a + t y ö m a r k k i n a u l o t t u v u u t t a + t y ö m a r k k i n a u u d i s t u k s e n + t y ö m a r k k i n a u u d i s t u k s e t + t y ö m a r k k i n a u u d i s t u k s i a + t y ö m a r k k i n a u u d i s t u k s i i n + t y ö m a r k k i n a u u d i s t u k s i l l a + t y ö m a r k k i n a u u d i s t u s + t y ö m a r k k i n a u u d i s t u s t a + t y ö m a r k k i n a u u d i s t u s t e n + t y ö m a r k k i n a v a a t i m u k s e t + t y ö m a r k k i n a v a l t a + t y ö m a r k k i n a v i r a n o m a i s t e n + t y ö m a r k k i n a v o i m a t + t y ö m a r k k i n a v u o r o p u h e l u + t y ö m a r k k i n a v u o r o p u h e l u a + t y ö m a r k k i n a v u o r o p u h e l u n + t y ö m a r k k i n a v ä l i n e e t + t y ö m a r k k i n a y h t e i s t y ö t ä + t y ö m a r k k i n o i d e m m e + t y ö m a r k k i n o i d e n + t y ö m a r k k i n o i d e n s a + t y ö m a r k k i n o i h i m m e + t y ö m a r k k i n o i h i n + t y ö m a r k k i n o i k s i + t y ö m a r k k i n o i l l a + t y ö m a r k k i n o i l l a a n + t y ö m a r k k i n o i l l a k a a n + t y ö m a r k k i n o i l l a m m e + t y ö m a r k k i n o i l l e + t y ö m a r k k i n o i l l e e n + t y ö m a r k k i n o i l l e m m e + t y ö m a r k k i n o i l t a + t y ö m a r k k i n o i l t a a n + t y ö m a r k k i n o i s s a + t y ö m a r k k i n o i s t a + t y ö m a r k k i n o i t a + t y ö m a r k k i n o i t a a n + t y ö m a r k k i n o i t a m m e + t y ö m a r k k i n o i t t e m m e + t y ö m a t e r i a a l i a + t y ö m a t k a k u l u j a + t y ö m a t k a l i i k e n n e + t y ö m a t k a l i i k e n n e t t ä + t y ö m a t k a l i i k e n t e e n ä + t y ö m a t k a l l a + t y ö m a t k a n + t y ö m a t k o i l l a a n + t y ö m a t k o j e n + t y ö m e k a n i s m i t + t y ö m e n e t e l m i e m m e + t y ö m e n e t e l m i e n + t y ö m e n e t e l m i e n s ä + t y ö m e n e t e l m i i m m e + t y ö m e n e t e l m i i n + t y ö m e n e t e l m i l l ä + t y ö m e n e t e l m i s s ä + t y ö m e n e t e l m i s t ä + t y ö m e n e t e l m i s t ä ä n + t y ö m e n e t e l m i ä + t y ö m e n e t e l m i ä m m e + t y ö m e n e t e l m i ä ä n + t y ö m e n e t e l m ä m m e + t y ö m e n e t e l m ä n + t y ö m e n e t e l m ä n ä + t y ö m e n e t e l m ä s t ä m m e + t y ö m e n e t e l m ä t + t y ö m e n e t e l m ä ä + t y ö m e n e t e l m ä ä n + t y ö m e n e t t e l y j ä + t y ö m e n e t t e l y s s ä + t y ö m e t o d i n + t y ö m e t o d i s t a + t y ö m i n i s t e r i e n + t y ö m i n i s t e r i t + t y ö m m e + t y ö m o t i v a a t i o n + t y ö m o t i v a a t i o t a + t y ö m u i s t i + t y ö m u o d o i k s i + t y ö m u o d o i s s a + t y ö m u o d o i s t a + t y ö m u o d o t + t y ö m u o t o + t y ö m u o t o i h i n + t y ö m u o t o j a + t y ö m u o t o j a a n + t y ö m u o t o j e n + t y ö m ä ä r ä n + t y ö m ä ä r ä s s ä + t y ö m ä ä r ä s t ä + t y ö m ä ä r ä ä n + t y ö n + t y ö n a n t a j a e t u j a + t y ö n a n t a j a i n + t y ö n a n t a j a j ä r j e s t ö i l l e + t y ö n a n t a j a j ä r j e s t ö i l t ä + t y ö n a n t a j a j ä r j e s t ö i n ä + t y ö n a n t a j a j ä r j e s t ö i s s ä + t y ö n a n t a j a j ä r j e s t ö i s s ä k i n + t y ö n a n t a j a j ä r j e s t ö i s t ä + t y ö n a n t a j a j ä r j e s t ö j e n + t y ö n a n t a j a j ä r j e s t ö j ä + t y ö n a n t a j a j ä r j e s t ö n + t y ö n a n t a j a j ä r j e s t ö t + t y ö n a n t a j a j ä r j e s t ö ä + t y ö n a n t a j a k e t j u n + t y ö n a n t a j a l i i t o n + t y ö n a n t a j a l i i t o t + t y ö n a n t a j a l i i t t o + t y ö n a n t a j a m a k s u j a + t y ö n a n t a j a m a k s u j e n + t y ö n a n t a j a m a k s u t + t y ö n a n t a j a n + t y ö n a n t a j a n a + t y ö n a n t a j a p u l a + t y ö n a n t a j a p u o l e e n + t y ö n a n t a j a p u o l e l l a + t y ö n a n t a j a r y h m i t t y m i e n + t y ö n a n t a j a s t a + t y ö n a n t a j a t + t y ö n a n t a j a t k a a n + t y ö n a n t a j a v a s t a i n e n + t y ö n a n t a j a v i r a n o m a i s e l l a + t y ö n a n t a j a y h d i s t y k s e n + t y ö n a n t a j a y h d i s t y s + t y ö n a n t a j a y s t ä v ä l l i n e n + t y ö n a n t a j i a + t y ö n a n t a j i e n + t y ö n a n t a j i e n k i n + t y ö n a n t a j i i n + t y ö n a n t a j i l l a + t y ö n a n t a j i l l e + t y ö n a n t a j i l t a + t y ö n a n t a j i s t a + t y ö n a r v i o i n n i n + t y ö n a r v i o i n n i s s a + t y ö n a r v i o i n t i j ä r j e s t e l m i e n + t y ö n a r v i o i n t i j ä r j e s t e l m i s t ä + t y ö n a r v i o i n t i j ä r j e s t e l m ä n + t y ö n a r v i o i n t i j ä r j e s t e l m ä s t ä + t y ö n a r v i o i n t i j ä r j e s t e l m ä ä + t y ö n a r v i o i n t i m e k a n i s m i + t y ö n a r v i o i n t i m e n e t e l m ä t + t y ö n a r v i o i n t i o h j e e t + t y ö n a r v o t e o r i a + t y ö n e u v o s t o j a + t y ö n e u v o t t e l u i h i n + t y ö n h a k i j a a + t y ö n h a k i j a t + t y ö n h a k i j o i d e n + t y ö n h a k i j o i h i n + t y ö n h a k i j o i l l e + t y ö n h a k i j o i s t a + t y ö n h a k i j o i t a + t y ö n h a k u a + t y ö n h a k u n e u v o n t a a + t y ö n h a k u p a l v e l u j e n + t y ö n h a k u u n + t y ö n h a u n + t y ö n h a u s s a + t y ö n i + t y ö n i l o a + t y ö n j a k a m i s j ä r j e s t e l m ä t + t y ö n j a k o a + t y ö n j a o n + t y ö n j a o s s a + t y ö n j a o s t a + t y ö n k u l k u j e n + t y ö n k u v a u k s i a + t y ö n l a a d u n + t y ö n l a i n s ä ä d ä n n ö s s ä + t y ö n l u o k i t t e l u j ä r j e s t e l m i s s ä + t y ö n l u o n t i t o i m e n p i t e i s i i n + t y ö n n e + t y ö n o r m e i h i n + t y ö n o r m e i s t a + t y ö n o r m e i s t a m m e + t y ö n o r m e j a + t y ö n o r m e j a m m e + t y ö n o r m i a + t y ö n o r m i e n + t y ö n o r m i n + t y ö n o r m i t + t y ö n o s i t u s + t y ö n s a a n n i n + t y ö n s a a n t i a + t y ö n s a a n t i a a n + t y ö n s a a n t i e d e l l y t y k s e t + t y ö n s a a n t i m a h d o l l i s u u d e t + t y ö n s a a n t i m a h d o l l i s u u k s i a + t y ö n s a a n t i m a h d o l l i s u u k s i e n + t y ö n s a a n t i m a h d o l l i s u u k s i s s a + t y ö n s a a n t i o n g e l m i e n + t y ö n s a a n t i v a l m i u k s i e n + t y ö n s ä + t y ö n t e k i j ä a s e m a a + t y ö n t e k i j ä a s e m a s s a + t y ö n t e k i j ä e d u s t a j a t + t y ö n t e k i j ä e d u s t a j i l l a + t y ö n t e k i j ä e h t o j e n + t y ö n t e k i j ä j o u k o n + t y ö n t e k i j ä j ä r j e s t ö i h i n + t y ö n t e k i j ä j ä r j e s t ö j e n + t y ö n t e k i j ä j ä r j e s t ö j ä + t y ö n t e k i j ä j ä r j e s t ö t + t y ö n t e k i j ä j ä s e n e t + t y ö n t e k i j ä k o h t a i s e s t i + t y ö n t e k i j ä l i i k k e e n + t y ö n t e k i j ä l i i k k e i d e n + t y ö n t e k i j ä l l e + t y ö n t e k i j ä l u o k i l l e + t y ö n t e k i j ä l u o k k a a + t y ö n t e k i j ä l ä h t ö i s t ä + t y ö n t e k i j ä m a k s u j a + t y ö n t e k i j ä m a k s u j e n + t y ö n t e k i j ä m m e + t y ö n t e k i j ä m y ö n t e i s i ä + t y ö n t e k i j ä m ä ä r i e n + t y ö n t e k i j ä m ä ä r ä + t y ö n t e k i j ä m ä ä r ä n + t y ö n t e k i j ä m ä ä r ä y s t e n + t y ö n t e k i j ä m ä ä r ä ä + t y ö n t e k i j ä m ä ä r ä ä n + t y ö n t e k i j ä n + t y ö n t e k i j ä n e u v o s t o j a + t y ö n t e k i j ä o i k e u t e e n + t y ö n t e k i j ä o s a k k u u d e t + t y ö n t e k i j ä o s a p u o l i + t y ö n t e k i j ä p e r h e e t + t y ö n t e k i j ä p u l a a + t y ö n t e k i j ä p u l a n + t y ö n t e k i j ä p u o l i + t y ö n t e k i j ä r e k i s t e r e i d e n + t y ö n t e k i j ä r y h m i e n + t y ö n t e k i j ä r y h m i i n + t y ö n t e k i j ä r y h m i l l e + t y ö n t e k i j ä r y h m i l t ä + t y ö n t e k i j ä r y h m i s t ä + t y ö n t e k i j ä r y h m i ä + t y ö n t e k i j ä r y h m ä + t y ö n t e k i j ä r y h m ä l l e + t y ö n t e k i j ä r y h m ä n + t y ö n t e k i j ä r y h m ä s t ä + t y ö n t e k i j ä r y h m ä t + t y ö n t e k i j ä r y h m ä ä + t y ö n t e k i j ä s i i p i + t y ö n t e k i j ä s t ä + t y ö n t e k i j ä s u k u p o l v e t + t y ö n t e k i j ä s u k u p o l v i + t y ö n t e k i j ä s u k u p o l v i i n + t y ö n t e k i j ä t + t y ö n t e k i j ä t y y p i n + t y ö n t e k i j ä t y y p p e j ä + t y ö n t e k i j ä v a l t a i s i a + t y ö n t e k i j ä v a r a s t o j a + t y ö n t e k i j ä v a s t a i s e k s i + t y ö n t e k i j ä v i r r a n + t y ö n t e k i j ä v i r t a + t y ö n t e k i j ä v i r t a u s + t y ö n t e k i j ä v ä e s t ö n + t y ö n t e k i j ä v ä e s t ö ö n + t y ö n t e k i j ä ä + t y ö n t e k i j ä ä n + t y ö n t e k i j ö i d e m m e + t y ö n t e k i j ö i d e n + t y ö n t e k i j ö i d e n s ä + t y ö n t e k i j ö i h i n + t y ö n t e k i j ö i l l e + t y ö n t e k i j ö i l l e e n + t y ö n t e k i j ö i l l e n n e + t y ö n t e k i j ö i l l ä + t y ö n t e k i j ö i l l ä m m e + t y ö n t e k i j ö i l t ä + t y ö n t e k i j ö i n ä ä n + t y ö n t e k i j ö i s t ä + t y ö n t e k i j ö i s t ä m m e + t y ö n t e k i j ö i s t ä ä n + t y ö n t e k i j ö i t ä + t y ö n t e k i j ö i t ä ä n + t y ö n t e k o a + t y ö n t e k o a a n + t y ö n t e k o k i e l t o + t y ö n t e k o m a a s s a + t y ö n t e k o m a a t a a n + t y ö n t e k o m a h d o l l i s u u d e t + t y ö n t e k o m a h d o l l i s u u k s i a + t y ö n t e k o o n + t y ö n t e k o t a r k o i t u k s e s s a + t y ö n t e k o v a l t i o n + t y ö n t e o n + t y ö n t e o s t a + t y ö n t u n t i e n + t y ö n t ä m i s e s t ä + t y ö n t ä m ä ä n + t y ö n t ä v i ä + t y ö n t ö j ä r j e s t e l m ä n + t y ö n t ö p e r i a a t t e e n + t y ö n t ö p i i r t o p u i k k o + t y ö n t ö t e k i j ö i n ä + t y ö n t ö v a i k u t u k s e n + t y ö n t ö v o i m a j ä r j e s t e l m ä t + t y ö n t ö v o i m a t e k n o l o g i a + t y ö n v u o k r a u s y r i t y k s e s s ä + t y ö n v ä e n p u o l u e e l t a + t y ö n v ä e n p u o l u e e s e e n + t y ö n v ä l i n e i l l e + t y ö n v ä l i t y s p a l v e l u i h i n + t y ö n v ä l i t y s p a l v e l u i l t a + t y ö n v ä l i t y s p a l v e l u j a + t y ö n v ä l i t y s p a l v e l u j e n + t y ö n v ä l i t y s p a l v e l u k s i + t y ö n v ä l i t y s t o i m i s t o i h i n + t y ö n v ä l i t y s t o i m i s t o j a + t y ö n v ä l i t y s t o i m i s t o j e n + t y ö n v ä l i t y s t o i m i s t o t + t y ö n v ä l i t y s t ä + t y ö n ä k y m i s t ä m m e + t y ö n ä k y m i ä ä n + t y ö n ä k y m ä t + t y ö o h j e l m a a + t y ö o h j e l m a a m m e + t y ö o h j e l m a a n + t y ö o h j e l m a a n n e + t y ö o h j e l m a a n s a + t y ö o h j e l m a e s i t y s + t y ö o h j e l m a k a a n + t y ö o h j e l m a k o m i t e a n + t y ö o h j e l m a k s i + t y ö o h j e l m a l l a + t y ö o h j e l m a l l e + t y ö o h j e l m a l u o n n o k s e e n + t y ö o h j e l m a m m e + t y ö o h j e l m a n + t y ö o h j e l m a n i + t y ö o h j e l m a n n e + t y ö o h j e l m a n s a + t y ö o h j e l m a s s a + t y ö o h j e l m a s s a a n + t y ö o h j e l m a s s a n n e + t y ö o h j e l m a s t a + t y ö o h j e l m a s t a a n + t y ö o h j e l m a s t a m m e + t y ö o h j e l m a s t a n n e + t y ö o h j e l m a t + t y ö o h j e l m i a + t y ö o h j e l m i e n + t y ö o h j e l m i i n + t y ö o h j e l m i k s i + t y ö o h j e l m i l l a a n + t y ö o h j e l m i s s a + t y ö o h j e l m i s t a + t y ö o h j e l m i s t a a n + t y ö o i k e u d e l l a + t y ö o i k e u d e n + t y ö o i k e u d e s s a + t y ö o i k e u d e t + t y ö o i k e u k s i a + t y ö o i k e u k s i e n + t y ö o i k e u s a s i o i s s a + t y ö o i k e u s e h d o t + t y ö o i k e u t e e n + t y ö o i k e u t t a + t y ö o l o + t y ö o l o i h i n + t y ö o l o i h i n s a + t y ö o l o i l l a + t y ö o l o i l l e + t y ö o l o i l t a + t y ö o l o i l t a a n + t y ö o l o i n a + t y ö o l o i s s a + t y ö o l o i s t a + t y ö o l o j a + t y ö o l o j a a n + t y ö o l o j a m m e + t y ö o l o j e m m e + t y ö o l o j e n + t y ö o l o j e n s a + t y ö o l o m m e + t y ö o l o n s a + t y ö o l o s u h t e e t + t y ö o l o s u h t e i d e n + t y ö o l o s u h t e i l l a + t y ö o l o s u h t e i l l e + t y ö o l o s u h t e i s i i n + t y ö o l o s u h t e i s s a + t y ö o l o s u h t e i s t a + t y ö o l o s u h t e i t a + t y ö o l o s u h t e i t a a n + t y ö o l o t + t y ö o r g a n i s a a t i o i d e n + t y ö o r g a n i s a a t i o s s a + t y ö o r g a n i s a a t i o t a + t y ö o r j i a + t y ö o s i o i l l a + t y ö o s o i t t e e t + t y ö p a i k a l l a a n + t y ö p a i k a l l e m m e + t y ö p a i k a n + t y ö p a i k a n m e n e t y k s i ä + t y ö p a i k a n v a i h d o k s e n + t y ö p a i k a n v a i h d o k s e t + t y ö p a i k a s t a + t y ö p a i k a s t a a n + t y ö p a i k a t + t y ö p a i k k a a + t y ö p a i k k a a n + t y ö p a i k k a d i r e k t i i v i + t y ö p a i k k a e d u t + t y ö p a i k k a h a a s t a t t e l u s s a + t y ö p a i k k a h a k e m u k s i s t a + t y ö p a i k k a h a r j o i t t e l u n + t y ö p a i k k a h ä i r i n t ä ä n + t y ö p a i k k a i l m o i t u k s i a + t y ö p a i k k a i l m o i t u k s i s s a a n + t y ö p a i k k a k a a n + t y ö p a i k k a k i i n t i ö t + t y ö p a i k k a k i u s a a m i n e n + t y ö p a i k k a k i u s a a m i s e e n + t y ö p a i k k a k i u s a a m i s e n + t y ö p a i k k a k i u s a a m i s e s t a + t y ö p a i k k a k i u s a a m i s t a + t y ö p a i k k a k u l t t u u r i n + t y ö p a i k k a k y s y m y s + t y ö p a i k k a l ä ä k ä r i n + t y ö p a i k k a m a h d o l l i s u u d e t + t y ö p a i k k a m a h d o l l i s u u k s i s t a + t y ö p a i k k a m a r k k i n a t + t y ö p a i k k a m e l u n + t y ö p a i k k a n e u v o s t o i h i n + t y ö p a i k k a n e u v o s t o j a + t y ö p a i k k a n s a + t y ö p a i k k a n ä k y m i ä + t y ö p a i k k a o n n e t t o m u u k s i a + t y ö p a i k k a p u l a n + t y ö p a i k k a r a k e n t e i s s a + t y ö p a i k k a s t r a t e g i a n + t y ö p a i k k a t a k u i t a + t y ö p a i k k a t a p a t u r m i s t a + t y ö p a i k k a t a r j o n t a a + t y ö p a i k k a t a r j o u s + t y ö p a i k k a t i e t o k a n n a n + t y ö p a i k k a t i l a n n e + t y ö p a i k k a t u r v a a n + t y ö p a i k k a t u r v a l l i s u u t t a + t y ö p a i k k a v a i h d o n + t y ö p a i k k a v ä k i v a l l a n + t y ö p a i k k a v ä k i v a l t a + t y ö p a i k k a v ä k i v a l t a a + t y ö p a i k k o i h i n + t y ö p a i k k o j a + t y ö p a i k k o j a k i n + t y ö p a i k k o j a m m e + t y ö p a i k k o j e m m e + t y ö p a i k k o j e n + t y ö p a i k k o j e n s a + t y ö p a i k o i k s i + t y ö p a i k o i l l a + t y ö p a i k o i l l a a n + t y ö p a i k o i l l e + t y ö p a i k o i l l e e n + t y ö p a i k o i l l e m m e + t y ö p a i k o i s s a + t y ö p a i k o i s t a + t y ö p a i k o i s t a a n + t y ö p a i n e + t y ö p a i n e e l t a + t y ö p a i n e e s e e n + t y ö p a i n e i d e n + t y ö p a i n e i t a + t y ö p a j a k o u l u j a + t y ö p a j o j a + t y ö p a n o k s e n s a + t y ö p a n o k s e s t a + t y ö p a n o k s i s t a a n + t y ö p a n o s t a + t y ö p a n o s y k s i k k ö ä + t y ö p a p e r e i s t a + t y ö p a p e r e i t a + t y ö p e r u s t a + t y ö p e r ä i s i i n + t y ö p e r ä i s i l t ä + t y ö p e r ä i s i ä + t y ö p e r ä i s t ä + t y ö p o l i i t t i s t e n + t y ö p o l i t i i k a n + t y ö p o l i t i i k k a + t y ö p o l i t i i k k a a n + t y ö p r o s e s s e i h i n + t y ö p r o s e s s e j a + t y ö p r o s e s s i + t y ö p r o s e s s i e n + t y ö p r o s e s s i i n + t y ö p r o s e s s i n + t y ö p r o s e s s i s s a + t y ö p s y k o l o g i a + t y ö p ä i v i e n + t y ö p ä i v i i n + t y ö p ä i v i k s i + t y ö p ä i v i l t ä + t y ö p ä i v i n ä + t y ö p ä i v i s t ä + t y ö p ä i v i ä + t y ö p ä i v ä + t y ö p ä i v ä n + t y ö p ä i v ä n ä + t y ö p ä i v ä s t ä + t y ö p ä i v ä t + t y ö p ä i v ä ä + t y ö p ä i v ä ä n + t y ö p ä i v ä ä n s ä + t y ö p ö y d i l l ä m m e + t y ö p ö y d ä l l e + t y ö p ö y d ä n + t y ö p ö y t ä y m p ä r i s t ö + t y ö r a j o i t u k s i s t a a n + t y ö r a j o i t u s t e n + t y ö r a k e n t e i d e n + t y ö r a u h a + t y ö r a u h a n + t y ö r i i d o i s t a + t y ö r i i t o i h i n + t y ö r i i t o j e n + t y ö r i s t i r i i d a t + t y ö r y h m i e n + t y ö r y h m i i n + t y ö r y h m i l l e + t y ö r y h m i l l ä + t y ö r y h m i l t ä + t y ö r y h m i s s ä + t y ö r y h m i s s ä m m e + t y ö r y h m i s t ä + t y ö r y h m i ä + t y ö r y h m ä + t y ö r y h m ä k s i + t y ö r y h m ä l l e + t y ö r y h m ä l l e e n + t y ö r y h m ä l l ä + t y ö r y h m ä l t ä + t y ö r y h m ä m m e + t y ö r y h m ä m u o t o i n e n + t y ö r y h m ä n + t y ö r y h m ä n i + t y ö r y h m ä n n e + t y ö r y h m ä n s ä + t y ö r y h m ä r a p o r t i n + t y ö r y h m ä s s ä + t y ö r y h m ä s t ä + t y ö r y h m ä s t ä m m e + t y ö r y h m ä t + t y ö r y h m ä t a s o l l a + t y ö r y h m ä t a s o n + t y ö r y h m ä v a i h e e s s a + t y ö r y h m ä ä + t y ö r y h m ä ä m m e + t y ö r y h m ä ä n + t y ö r y h m ä ä n s ä + t y ö r y t m i + t y ö r y t m i n + t y ö r y t m i n s ä + t y ö s a r a l l a + t y ö s a r k a + t y ö s a r k a a + t y ö s e l k k a u s + t y ö s i d o n n a i s i a + t y ö s i i r t o l a + t y ö s i i r t o l a i s u u t t a + t y ö s k e n n e l k ä ä m m e + t y ö s k e n n e l l e e n + t y ö s k e n n e l l e e t + t y ö s k e n n e l l e i l l e + t y ö s k e n n e l l e s s ä m m e + t y ö s k e n n e l l e s s ä n i + t y ö s k e n n e l l e s s ä n n e + t y ö s k e n n e l l e s s ä ä n + t y ö s k e n n e l l y t + t y ö s k e n n e l l ä + t y ö s k e n n e l l ä k s e e n + t y ö s k e n n e l l ä k s e m m e + t y ö s k e n n e l t y ä m m e + t y ö s k e n n e l t y ä ä n + t y ö s k e n t e l e e + t y ö s k e n t e l e m m e + t y ö s k e n t e l e m ä t t ä + t y ö s k e n t e l e m ä ä n + t y ö s k e n t e l e n + t y ö s k e n t e l e v i e n + t y ö s k e n t e l e v i i n + t y ö s k e n t e l e v i l l e + t y ö s k e n t e l e v i l l ä + t y ö s k e n t e l e v i l t ä + t y ö s k e n t e l e v i s t ä + t y ö s k e n t e l e v i ä + t y ö s k e n t e l e v ä n + t y ö s k e n t e l e v ä n s ä + t y ö s k e n t e l e v ä t + t y ö s k e n t e l e v ä t k i n + t y ö s k e n t e l e v ä ä + t y ö s k e n t e l e v ä ä n + t y ö s k e n t e l i + t y ö s k e n t e l i m m e + t y ö s k e n t e l i n + t y ö s k e n t e l i s i m m e + t y ö s k e n t e l i v ä t + t y ö s k e n t e l y a i k a + t y ö s k e n t e l y a i k a a + t y ö s k e n t e l y a i k a t a u l u + t y ö s k e n t e l y a i k a t a u l u u m m e + t y ö s k e n t e l y a j a n + t y ö s k e n t e l y a l a n + t y ö s k e n t e l y a s e m a s t a + t y ö s k e n t e l y e d e l l y t y k s e t + t y ö s k e n t e l y e d e l l y t y k s i ä + t y ö s k e n t e l y e h t o j a + t y ö s k e n t e l y e l i m i s s ä + t y ö s k e n t e l y e l i m i s t ä + t y ö s k e n t e l y i l m a p i i r i ä + t y ö s k e n t e l y j ä r j e s t e l m ä + t y ö s k e n t e l y j ä r j e s t e l y j e n + t y ö s k e n t e l y j ä r j e s t e l y t + t y ö s k e n t e l y k a u d e l l a + t y ö s k e n t e l y k i e l i + t y ö s k e n t e l y k i e l i ä + t y ö s k e n t e l y k u l t t u u r i i m m e + t y ö s k e n t e l y k u u k a u s i e m m e + t y ö s k e n t e l y k y v y n + t y ö s k e n t e l y k ä y t ä n n ö i s s ä + t y ö s k e n t e l y k ä y t ä n n ö i s t ä + t y ö s k e n t e l y k ä y t ä n t ö i h i n + t y ö s k e n t e l y k ä y t ä n t ö j e n + t y ö s k e n t e l y k ä y t ä n t ö j ä ä n + t y ö s k e n t e l y l l e + t y ö s k e n t e l y m a a h a n + t y ö s k e n t e l y m a a s s a + t y ö s k e n t e l y m a a s t a a n + t y ö s k e n t e l y m a h d o l l i s u u k s i a a n + t y ö s k e n t e l y m a h d o l l i s u u k s i e n + t y ö s k e n t e l y m a i d e n s a + t y ö s k e n t e l y m a l l e i h i n + t y ö s k e n t e l y m a l l e j a + t y ö s k e n t e l y m a l l i a + t y ö s k e n t e l y m a l l i e n + t y ö s k e n t e l y m a l l i t + t y ö s k e n t e l y m e k a n i s m i t + t y ö s k e n t e l y m e n e t e l m i e m m e + t y ö s k e n t e l y m e n e t e l m i e n + t y ö s k e n t e l y m e n e t e l m i i n + t y ö s k e n t e l y m e n e t e l m i l l e + t y ö s k e n t e l y m e n e t e l m i l l ä + t y ö s k e n t e l y m e n e t e l m i s s ä + t y ö s k e n t e l y m e n e t e l m i s t ä + t y ö s k e n t e l y m e n e t e l m i s t ä m m e + t y ö s k e n t e l y m e n e t e l m i ä + t y ö s k e n t e l y m e n e t e l m i ä m m e + t y ö s k e n t e l y m e n e t e l m i ä ä n + t y ö s k e n t e l y m e n e t e l m ä + t y ö s k e n t e l y m e n e t e l m ä m m e + t y ö s k e n t e l y m e n e t e l m ä n + t y ö s k e n t e l y m e n e t e l m ä n s ä + t y ö s k e n t e l y m e n e t e l m ä s s ä m m e + t y ö s k e n t e l y m e n e t e l m ä t + t y ö s k e n t e l y m e n e t e l m ä ä + t y ö s k e n t e l y m e n e t e l m ä ä n + t y ö s k e n t e l y m e n e t t e l y i h i n + t y ö s k e n t e l y m e n e t t e l y j e n + t y ö s k e n t e l y m e n e t t e l y n + t y ö s k e n t e l y m e n e t t e l y y n + t y ö s k e n t e l y m m e + t y ö s k e n t e l y m u o d o t + t y ö s k e n t e l y m u o t o i h i n + t y ö s k e n t e l y m u o t o j a + t y ö s k e n t e l y n + t y ö s k e n t e l y o h j e l m a n + t y ö s k e n t e l y o l o i h i n + t y ö s k e n t e l y o l o i s s a + t y ö s k e n t e l y o l o i s t a + t y ö s k e n t e l y o l o j a + t y ö s k e n t e l y o l o j a a n + t y ö s k e n t e l y o l o j e n + t y ö s k e n t e l y o l o s u h t e e n s a + t y ö s k e n t e l y o l o s u h t e e t + t y ö s k e n t e l y o l o s u h t e i d e n + t y ö s k e n t e l y o l o s u h t e i s i i n + t y ö s k e n t e l y o l o s u h t e i s s a + t y ö s k e n t e l y o l o s u h t e i s t a + t y ö s k e n t e l y o l o s u h t e i t a + t y ö s k e n t e l y o l o s u h t e i t a a n + t y ö s k e n t e l y o l o t + t y ö s k e n t e l y p a i k a n + t y ö s k e n t e l y p a i k a s t a + t y ö s k e n t e l y p a i k k a a + t y ö s k e n t e l y p a i k k a a n + t y ö s k e n t e l y p a i k k a k u n n a n + t y ö s k e n t e l y p a i k k a k u n t a + t y ö s k e n t e l y p a i k k o j a m m e + t y ö s k e n t e l y p e r u s t a a + t y ö s k e n t e l y p o h j a n + t y ö s k e n t e l y p r o s e s s e i h i n + t y ö s k e n t e l y p r o s e s s e j a m m e + t y ö s k e n t e l y p ä i v i ä + t y ö s k e n t e l y r y h m ä + t y ö s k e n t e l y s s ä m m e + t y ö s k e n t e l y s t ä + t y ö s k e n t e l y s t ä ä n + t y ö s k e n t e l y s u h d e + t y ö s k e n t e l y s u h d e t t a + t y ö s k e n t e l y s u h t e e m m e + t y ö s k e n t e l y s u h t e e n + t y ö s k e n t e l y s u h t e e s e e n + t y ö s k e n t e l y s u h t e e s t a + t y ö s k e n t e l y s u h t e i d e n + t y ö s k e n t e l y s u h t e i s s a + t y ö s k e n t e l y s u u n n i t e l m a n + t y ö s k e n t e l y s ä ä n n ö t + t y ö s k e n t e l y s ä ä n t ö j ä + t y ö s k e n t e l y t a p a + t y ö s k e n t e l y t a p a a + t y ö s k e n t e l y t a p a a m m e + t y ö s k e n t e l y t a p a a n + t y ö s k e n t e l y t a p a a n s a + t y ö s k e n t e l y t a p a m m e + t y ö s k e n t e l y t a p a n s a + t y ö s k e n t e l y t a p o i h i m m e + t y ö s k e n t e l y t a p o i h i n + t y ö s k e n t e l y t a p o j a + t y ö s k e n t e l y t a p o j a a n + t y ö s k e n t e l y t a p o j a m m e + t y ö s k e n t e l y t a p o j e m m e + t y ö s k e n t e l y t a p o j e n + t y ö s k e n t e l y t a r k o i t u k s e s s a + t y ö s k e n t e l y t a r k o i t u k s i i n + t y ö s k e n t e l y t a s o l l a + t y ö s k e n t e l y t a v a n + t y ö s k e n t e l y t a v a s s a + t y ö s k e n t e l y t a v a s s a m m e + t y ö s k e n t e l y t a v a s t a + t y ö s k e n t e l y t a v a s t a a n + t y ö s k e n t e l y t a v a s t a m m e + t y ö s k e n t e l y t a v a s t a n n e + t y ö s k e n t e l y t a v a t + t y ö s k e n t e l y t a v o i l l a m m e + t y ö s k e n t e l y t a v o i l l e + t y ö s k e n t e l y t a v o i s s a + t y ö s k e n t e l y t a v o i s s a a n + t y ö s k e n t e l y t a v o i s s a m m e + t y ö s k e n t e l y t a v o i s t a + t y ö s k e n t e l y t a v o i t t e e t + t y ö s k e n t e l y t e h o k k u u s + t y ö s k e n t e l y t i l a n t e i t a + t y ö s k e n t e l y t i l o i s s a + t y ö s k e n t e l y t o t t u m u k s e m m e + t y ö s k e n t e l y u l o t t u v u u s + t y ö s k e n t e l y v a l m i u k s i s t a a n + t y ö s k e n t e l y v a l m i u t e e n + t y ö s k e n t e l y v a l t i o n + t y ö s k e n t e l y v a l t i o t a + t y ö s k e n t e l y v a u h t i a + t y ö s k e n t e l y v ä l i n e + t y ö s k e n t e l y y n + t y ö s k e n t e l y ä + t y ö s k e n t e l y ä ä n + t y ö s o p i m u k s e e n + t y ö s o p i m u k s e l l a + t y ö s o p i m u k s e n + t y ö s o p i m u k s e n s a + t y ö s o p i m u k s e s t a + t y ö s o p i m u k s e t + t y ö s o p i m u k s i a + t y ö s o p i m u k s i e n + t y ö s o p i m u k s i i n + t y ö s o p i m u k s i l l a + t y ö s o p i m u k s i n + t y ö s o p i m u k s i n a + t y ö s o p i m u k s i s s a + t y ö s o p i m u k s i s t a + t y ö s o p i m u k s i s t a a n + t y ö s o p i m u s + t y ö s o p i m u s k y s y m y k s e n i + t y ö s o p i m u s m u o t o j a + t y ö s o p i m u s n e u v o t t e l u i h i n + t y ö s o p i m u s o i k e u t t a + t y ö s o p i m u s t a + t y ö s o p i m u s t a r j o u s + t y ö s o p i m u s t e n + t y ö s s ä + t y ö s s ä k ä y n t i a i k a n a a n + t y ö s s ä k ä y n t i a j a n + t y ö s s ä k ä y n t i m a a n + t y ö s s ä k ä y n t i n s ä + t y ö s s ä k ä y v i e n + t y ö s s ä k ä y v i s t ä + t y ö s s ä k ä y v ä t + t y ö s s ä m m e + t y ö s s ä n i + t y ö s s ä n n e + t y ö s s ä o l o a i k a a + t y ö s s ä o l o a j a n + t y ö s s ä o l o p ä i v i s t ä + t y ö s s ä ä n + t y ö s t a n d a r d e i h i n + t y ö s t a n d a r d e j a + t y ö s t a n d a r d i e n + t y ö s t ä k ä ä m m e + t y ö s t ä m i s s ä + t y ö s t ä n e e t + t y ö s t ä n i + t y ö s t ä n n e + t y ö s t ä n s ä + t y ö s t ä n y t + t y ö s t ä v ä t + t y ö s t ä ä + t y ö s t ä ä n + t y ö s t ö k o n e + t y ö s t ö k o n e i t a + t y ö s u h d e + t y ö s u h d e a n a r k i a a + t y ö s u h d e a s i o i s t a + t y ö s u h d e j ä r j e s t e l y i s t ä + t y ö s u h d e j ä r j e s t e l y j ä + t y ö s u h d e l a i n s ä ä d ä n n ö n + t y ö s u h d e l a i s s a + t y ö s u h d e l a k i + t y ö s u h d e m u o t o a + t y ö s u h d e o i k e u d e l l i s t a + t y ö s u h d e o i k e u d e t + t y ö s u h d e t t a + t y ö s u h d e t u r v a + t y ö s u h d e t u r v a a + t y ö s u h d e t u r v a a n + t y ö s u h d e t u r v a l l e + t y ö s u h d e t u r v a n + t y ö s u h d e t u r v a s ä ä n t ö j e n + t y ö s u h t e e m m e + t y ö s u h t e e n + t y ö s u h t e e n s a + t y ö s u h t e e s e e n + t y ö s u h t e e s s a + t y ö s u h t e e s s a a n + t y ö s u h t e e s t a + t y ö s u h t e e t + t y ö s u h t e i d e m m e + t y ö s u h t e i d e n + t y ö s u h t e i l l e + t y ö s u h t e i s i i n + t y ö s u h t e i s s a + t y ö s u h t e i s t a + t y ö s u h t e i t a + t y ö s u l k u o i k e u t t a + t y ö s u o j a l a i n s ä ä d ä n t ö ö n + t y ö s u o j e l u + t y ö s u o j e l u a + t y ö s u o j e l u d i r e k t i i v i n + t y ö s u o j e l u e d e l l y t y s t e n + t y ö s u o j e l u h a l l i n t o + t y ö s u o j e l u h a l l i n t o j e n + t y ö s u o j e l u l a i n s ä ä d ä n n ö n + t y ö s u o j e l u l a i n s ä ä d ä n t ö ö n + t y ö s u o j e l u l l e + t y ö s u o j e l u m ä ä r ä y s t e n + t y ö s u o j e l u n + t y ö s u o j e l u p i i r i + t y ö s u o j e l u p o l i t i i k k a a + t y ö s u o j e l u s t a + t y ö s u o j e l u s t r a t e g i a a + t y ö s u o j e l u t a r k a s t a j a + t y ö s u o j e l u t a r k a s t a j a a + t y ö s u o j e l u t a r k a s t a j i a + t y ö s u o j e l u t a r k a s t a j i e n + t y ö s u o j e l u t a r k a s t a j i l l e + t y ö s u o j e l u t a r k a s t u k s i a + t y ö s u o j e l u t a r k a s t u k s i s t a + t y ö s u o j e l u t a r k a s t u s t e n + t y ö s u o j e l u t a r k a s t u s v i r a n o m a i s t e n + t y ö s u o j e l u t o i m i n n a n + t y ö s u o j e l u u n + t y ö s u o j e l u v a l t u u t e t t u + t y ö s u o j e l u v i r a n o m a i s e t + t y ö s u o j e l u v i r a n o m a i s i l l e + t y ö s u o j e l u v i r a n o m a i s t e n + t y ö s u o r i t u k s i i n + t y ö s u o r i t u s + t y ö s u o r i t u s t a + t y ö s u u n n i t e l m a + t y ö s u u n n i t e l m a a + t y ö s u u n n i t e l m a a m m e + t y ö s u u n n i t e l m a a n + t y ö s u u n n i t e l m a l l a + t y ö s u u n n i t e l m a n + t y ö s u u n n i t e l m a s s a + t y ö s u u n n i t e l m a s t a + t y ö s u u n n i t e l m a t + t y ö s u u n n i t e l m i a + t y ö s u u n n i t e l m i i n s a + t y ö s u u n n i t e l m i s s a + t y ö s y r j i n n ä n + t y ö s y r j i n t ä + t y ö s ä ä n n ö k s e t + t y ö s ä ä n t ö j e n + t y ö s ä ä n t ö j ä + t y ö s ä ä t i ö i h i n + t y ö t + t y ö t a a k a n + t y ö t a a k k a + t y ö t a a k k a n i + t y ö t a h d i n + t y ö t a h t i + t y ö t a h t i a a n + t y ö t a h t i i n + t y ö t a h t i n s a + t y ö t a i d o t + t y ö t a i s t e l u + t y ö t a i s t e l u i h i n + t y ö t a i s t e l u i s s a + t y ö t a i s t e l u j e n + t y ö t a i s t e l u o i k e u t t a + t y ö t a i s t e l u t i l a n t e e s s a + t y ö t a i s t e l u t o i m e n p i t e e s e e n + t y ö t a i s t e l u t o i m e n p i t e e s t ä + t y ö t a i s t e l u t o i m e n p i t e i d e n + t y ö t a i s t e l u t o i m e n p i t e i s i i n + t y ö t a i s t e l u t o i m e n p i t e i s t ä + t y ö t a i s t e l u t o i m e n p i t e i t ä + t y ö t a i s t e l u t o i m e t + t y ö t a i s t e l u t o i m i a + t y ö t a i s t e l u t o i m i i n + t y ö t a i s t e l u t o i m i l l a + t y ö t a i s t e l u t o i m i n n a n + t y ö t a i s t e l u t o i m i n t a a + t y ö t a i t o j a + t y ö t a k u i l l e + t y ö t a k u i t a + t y ö t a p a + t y ö t a p a a + t y ö t a p a a m m e + t y ö t a p a a n s a + t y ö t a p a m m e + t y ö t a p a t u r m a + t y ö t a p a t u r m a a + t y ö t a p a t u r m a a n + t y ö t a p a t u r m a n + t y ö t a p a t u r m a s s a + t y ö t a p a t u r m a t + t y ö t a p a t u r m a v a k u u t u k s e n + t y ö t a p a t u r m a v a k u u t u k s e s t a + t y ö t a p a t u r m a v a k u u t u s + t y ö t a p a t u r m i a + t y ö t a p a t u r m i e n + t y ö t a p a t u r m i i n + t y ö t a p a t u r m i l l e + t y ö t a p a t u r m i l t a + t y ö t a p a t u r m i s s a + t y ö t a p a t u r m i s t a + t y ö t a p o i h i m m e + t y ö t a p o i h i n + t y ö t a p o j a + t y ö t a p o j a a n + t y ö t a p o j a m m e + t y ö t a p o j e m m e + t y ö t a p o j e n + t y ö t a p o j e n s a + t y ö t a r j o u k s i a + t y ö t a r j o u k s i e n + t y ö t a r j o u s t e n + t y ö t a r k a s t a j a n a + t y ö t a r k o i t u k s e s s a + t y ö t a u s t a s t a + t y ö t a v a t + t y ö t a v a t k i n + t y ö t a v o i s t a + t y ö t a v o i s t a m m e + t y ö t e h o + t y ö t e h o k k u u d e n + t y ö t e h t ä v i e n + t y ö t e h t ä v i e n s ä + t y ö t e h t ä v i s s ä + t y ö t e h t ä v i ä + t y ö t e h t ä v ä n s ä + t y ö t e h t ä v ä s s ä + t y ö t e k i j ä l t ä + t y ö t e k i j ö i t t e n s ä + t y ö t e k i j ö i t ä + t y ö t e l i ä i t ä + t y ö t e r v e y d e n + t y ö t e r v e y d e n h u o l t o a + t y ö t e r v e y d e s t ä + t y ö t e r v e y s + t y ö t e r v e y s h u o l l o n + t y ö t e r v e y s h u o l t o + t y ö t e r v e y s j ä r j e s t ö n + t y ö t e r v e y s l ä ä k ä r e i d e n + t y ö t e r v e y s o n g e l m i s t a + t y ö t e r v e y s p o l i t i i k a n + t y ö t e r v e y s r i s k e i s t ä + t y ö t e r v e y s s t a n d a r d i t + t y ö t e r v e y s s t r a t e g i a n + t y ö t e r v e y s s t r a t e g i a s s a + t y ö t e r v e y s v i r a s t o + t y ö t e r v e y s v i r a s t o n + t y ö t e r v e y s v i r a s t o s t a + t y ö t e r v e y t e e n + t y ö t e r v e y t t ä + t y ö t i l a i s u u d e t + t y ö t i l a i s u u k s i a + t y ö t i l a i s u u k s i e n + t y ö t i l a i s u u k s i e n s a + t y ö t i l a i s u u k s i i n + t y ö t i l a i s u u k s i l l e + t y ö t i l a i s u u k s i s t a + t y ö t i l a i s u u s + t y ö t i l a i s u u t e e n + t y ö t i l a n n e + t y ö t i l a n n e t t a + t y ö t i l a n n e t t a a n + t y ö t i l a n t e e s e e n + t y ö t i l a n t e e s s a + t y ö t i l a n t e e s t a + t y ö t i l a n t e e t + t y ö t i l a n t e i d e n + t y ö t i l a n t e i s i i n + t y ö t i l a n t e i s s a + t y ö t i l a n t e i t a + t y ö t i l a s t o i h i n + t y ö t i l a t + t y ö t i l o i h i m m e + t y ö t i l o i h i n + t y ö t i l o i l l e + t y ö t o d i s t u s + t y ö t o i m e k s i a n t o j a + t y ö t o i m i s t o n + t y ö t o v e r e i d e n i + t y ö t o v e r e i d e n s a + t y ö t o v e r e i l l e m m e + t y ö t o v e r e i n a n i + t y ö t o v e r e i t a a n + t y ö t o v e r e i t t e n i + t y ö t o v e r i + t y ö t o v e r i t + t y ö t o v e r u u d e s t a + t y ö t t ö m i e n + t y ö t t ö m i k s i + t y ö t t ö m i l l e + t y ö t t ö m i l l e k i n + t y ö t t ö m i l l e m m e + t y ö t t ö m i l l ä k i n + t y ö t t ö m i l t ä + t y ö t t ö m i n ä + t y ö t t ö m i s t ä + t y ö t t ö m i ä + t y ö t t ö m y y d e l l e + t y ö t t ö m y y d e n + t y ö t t ö m y y d e n t o r j u n t a o h j e l m a + t y ö t t ö m y y d e s t ä + t y ö t t ö m y y s a a l l o n + t y ö t t ö m y y s a s t e + t y ö t t ö m y y s a s t e e l l a + t y ö t t ö m y y s a s t e e l l e + t y ö t t ö m y y s a s t e e m m e + t y ö t t ö m y y s a s t e e n + t y ö t t ö m y y s a s t e e n s a + t y ö t t ö m y y s a s t e e s e e n + t y ö t t ö m y y s a s t e e s e e n s a + t y ö t t ö m y y s a s t e e s t a + t y ö t t ö m y y s a s t e i d e n + t y ö t t ö m y y s a s t e i s i i n + t y ö t t ö m y y s a s t e k i n + t y ö t t ö m y y s a s t e t t a + t y ö t t ö m y y s a s t e t t a a n + t y ö t t ö m y y s a v u s t u k s e e n + t y ö t t ö m y y s a v u s t u k s i i n + t y ö t t ö m y y s a v u s t u s t a + t y ö t t ö m y y s a v u s t u s t e n + t y ö t t ö m y y s e t u u d e n + t y ö t t ö m y y s e t u u d e t + t y ö t t ö m y y s e t u u k s i a + t y ö t t ö m y y s e t u u k s i e n + t y ö t t ö m y y s e t u u k s i i n + t y ö t t ö m y y s e t u u t e e n + t y ö t t ö m y y s e t u u t t a + t y ö t t ö m y y s h u i p p u k o k o u s t a + t y ö t t ö m y y s i n d e k s i n + t y ö t t ö m y y s i n d i k a a t t o r e i s s a + t y ö t t ö m y y s j o n o i h i n + t y ö t t ö m y y s j o n o t + t y ö t t ö m y y s k a s s a n + t y ö t t ö m y y s k a u t e e n + t y ö t t ö m y y s k i e r r e + t y ö t t ö m y y s k i e r t e i s i i n + t y ö t t ö m y y s k o r v a u k s e e n + t y ö t t ö m y y s k o r v a u k s e n + t y ö t t ö m y y s k o r v a u k s e n s a + t y ö t t ö m y y s k o r v a u k s e t + t y ö t t ö m y y s k o r v a u k s i a + t y ö t t ö m y y s k o r v a u k s i e n + t y ö t t ö m y y s k o r v a u k s i i n + t y ö t t ö m y y s k o r v a u k s i s t a + t y ö t t ö m y y s k o r v a u s + t y ö t t ö m y y s k o r v a u s m a k s u t + t y ö t t ö m y y s k o r v a u s t a + t y ö t t ö m y y s k o r v a u s t e n + t y ö t t ö m y y s k r i i s i + t y ö t t ö m y y s k r i i s i i n + t y ö t t ö m y y s k r i i s i n + t y ö t t ö m y y s k r i i s i s t ä + t y ö t t ö m y y s k r i t e e r i ä + t y ö t t ö m y y s k u l u t + t y ö t t ö m y y s k u s t a n n u s t e n + t y ö t t ö m y y s k y s y m y k s e e n + t y ö t t ö m y y s k y s y m y k s e s t ä + t y ö t t ö m y y s k y s y m y s + t y ö t t ö m y y s k ä y r ä t + t y ö t t ö m y y s l o u k k u + t y ö t t ö m y y s l u k u + t y ö t t ö m y y s l u k u i h i n + t y ö t t ö m y y s l u k u i n a + t y ö t t ö m y y s l u k u j a + t y ö t t ö m y y s l u k u j a m m e + t y ö t t ö m y y s l u k u j e n + t y ö t t ö m y y s l u k u m m e + t y ö t t ö m y y s l u v u i l l e + t y ö t t ö m y y s l u v u i s s a + t y ö t t ö m y y s l u v u i s t a + t y ö t t ö m y y s l u v u n + t y ö t t ö m y y s l u v u s t a + t y ö t t ö m y y s l u v u t + t y ö t t ö m y y s n e u v o s t o s t a + t y ö t t ö m y y s o h j e l m i a + t y ö t t ö m y y s o n g e l m a + t y ö t t ö m y y s o n g e l m a a + t y ö t t ö m y y s o n g e l m a a n + t y ö t t ö m y y s o n g e l m a a n s a + t y ö t t ö m y y s o n g e l m a m m e + t y ö t t ö m y y s o n g e l m a n + t y ö t t ö m y y s o n g e l m a n s a + t y ö t t ö m y y s o n g e l m a s t a + t y ö t t ö m y y s o n g e l m a t + t y ö t t ö m y y s o n g e l m i a + t y ö t t ö m y y s o n g e l m i a m m e + t y ö t t ö m y y s o n g e l m i i n + t y ö t t ö m y y s p a k e t i n + t y ö t t ö m y y s p a k e t i s t a + t y ö t t ö m y y s p i i k k i + t y ö t t ö m y y s p o l i t i i k a l l a + t y ö t t ö m y y s p o l i t i i k a n + t y ö t t ö m y y s p o l i t i i k a s t a k a a n + t y ö t t ö m y y s p o l i t i i k k a a + t y ö t t ö m y y s p r o s e n t i n + t y ö t t ö m y y s p r o s e n t i t + t y ö t t ö m y y s p r o s e n t t i + t y ö t t ö m y y s p r o s e n t t i i n + t y ö t t ö m y y s r e k i s t e r e i s s ä + t y ö t t ö m y y s r i s k i ä + t y ö t t ö m y y s s e u r a u k s e t + t y ö t t ö m y y s s t r a t e g i a + t y ö t t ö m y y s s u o j a a + t y ö t t ö m y y s t a s o + t y ö t t ö m y y s t a s o a + t y ö t t ö m y y s t a s o m m e + t y ö t t ö m y y s t a s o n + t y ö t t ö m y y s t a s o o n + t y ö t t ö m y y s t a v o i t t e e t + t y ö t t ö m y y s t i l a n n e + t y ö t t ö m y y s t i l a n n e t t a + t y ö t t ö m y y s t i l a n t e e n + t y ö t t ö m y y s t i l a n t e e s e e n + t y ö t t ö m y y s t i l a n t e e s s a + t y ö t t ö m y y s t i l a s t o i s s a + t y ö t t ö m y y s t i l a s t o i s t a + t y ö t t ö m y y s t i l a s t o j a + t y ö t t ö m y y s t i l a s t o j e n + t y ö t t ö m y y s t u k i + t y ö t t ö m y y s t u k i e n + t y ö t t ö m y y s t u r v a + t y ö t t ö m y y s t u r v a a + t y ö t t ö m y y s t u r v a a n + t y ö t t ö m y y s t u r v a j ä r j e s t e l m i ä + t y ö t t ö m y y s t u r v a m a k s u a + t y ö t t ö m y y s t u r v a n + t y ö t t ö m y y s u h k a + t y ö t t ö m y y s u h k a a + t y ö t t ö m y y s v a k u u t u k s e n + t y ö t t ö m y y s v a k u u t u s t a + t y ö t t ö m y y t e e n + t y ö t t ö m y y t e n s ä + t y ö t t ö m y y t t ä + t y ö t t ö m ä k s i + t y ö t t ö m ä l l e + t y ö t t ö m ä n + t y ö t t ö m ä n ä + t y ö t t ö m ä s t ä + t y ö t t ö m ä t + t y ö t t ö m ä ä n + t y ö t u k e a + t y ö t u k i + t y ö t u k i m u o t o j a + t y ö t u l o i h i n + t y ö t u l o i l l a a n + t y ö t u l o i s t a + t y ö t u l o j e n + t y ö t u l o o n + t y ö t u n n e i s t a + t y ö t u n n e i s t a a n + t y ö t u n n i t + t y ö t u n t e i h i n + t y ö t u n t e i n a + t y ö t u n t e j a + t y ö t u n t e j a m m e + t y ö t u n t i a + t y ö t u n t i e n + t y ö t u n t i i n + t y ö t u n t i m ä ä r i e n + t y ö t u n t i m ä ä r i l l ä + t y ö t u n t i m ä ä r ä n + t y ö t u n t i m ä ä r ä t + t y ö t u n t i n s a + t y ö t u n t i t a s o l l a + t y ö t u o l i s s a + t y ö t u o m i o i s t u i m e e n + t y ö t u o m i o i s t u i m e s s a + t y ö t u o m i o i s t u i n + t y ö t u o m i o i s t u i n t a + t y ö t u r v a a + t y ö t u r v a a n + t y ö t u r v a l l i s u u d e n + t y ö t u r v a l l i s u u d e s t a + t y ö t u r v a l l i s u u s + t y ö t u r v a l l i s u u s a l a l l e + t y ö t u r v a l l i s u u s a s i o i s s a + t y ö t u r v a l l i s u u s d i r e k t i i v i + t y ö t u r v a l l i s u u s d i r e k t i i v i ä + t y ö t u r v a l l i s u u s e h d o i n + t y ö t u r v a l l i s u u s e h t o j a + t y ö t u r v a l l i s u u s j ä r j e s t e l y j ä + t y ö t u r v a l l i s u u s k u l t t u u r i a + t y ö t u r v a l l i s u u s k y s y m y k s e t + t y ö t u r v a l l i s u u s k y s y m y k s i i n + t y ö t u r v a l l i s u u s l a i n s ä ä d ä n n ö s t ä + t y ö t u r v a l l i s u u s n o r m i e n + t y ö t u r v a l l i s u u s o h j e l m a s s a + t y ö t u r v a l l i s u u s o n g e l m i a + t y ö t u r v a l l i s u u s o n g e l m i e n + t y ö t u r v a l l i s u u s p o l i t i i k a n + t y ö t u r v a l l i s u u s s t a n d a r d e j a + t y ö t u r v a l l i s u u s s t a n d a r d i e n + t y ö t u r v a l l i s u u s s t r a t e g i a + t y ö t u r v a l l i s u u s s t r a t e g i a a + t y ö t u r v a l l i s u u s s t r a t e g i a s s a + t y ö t u r v a l l i s u u s s ä ä n n ö s t e n + t y ö t u r v a l l i s u u s t o i m e n p i t e e t + t y ö t u r v a l l i s u u s t o i m e n p i t e i d e n + t y ö t u r v a l l i s u u s t o i m e t + t y ö t u r v a l l i s u u s t o i m i s t a + t y ö t u r v a l l i s u u s v a a t i m u s t e n + t y ö t u r v a l l i s u u s v i r a n o m a i s e t + t y ö t u r v a l l i s u u s v i r a s t o + t y ö t u r v a l l i s u u s v i r a s t o n + t y ö t u r v a l l i s u u s v i r a s t o s s a + t y ö t u r v a l l i s u u t e e n + t y ö t u r v a l l i s u u t e n s a + t y ö t u r v a l l i s u u t t a + t y ö t u r v a t t o m u u s + t y ö t y y t y v ä i s y y d e n + t y ö t y y t y v ä i s y y t t ä + t y ö t ä + t y ö t ä m m e + t y ö t ä n i + t y ö t ä n n e + t y ö t ä t e k e v i e n + t y ö t ä t e k e v i ä + t y ö t ä t e k e v ä t + t y ö t ä ä n + t y ö t ö n t ä + t y ö u r a + t y ö u r a a + t y ö u r a l l a + t y ö u r a m m e + t y ö u r a n + t y ö u r a n i + t y ö u r a n s a + t y ö u u p u m u s s e l v i t y k s e n + t y ö u u p u m u s t a p a u k s i a + t y ö v a a t i m u k s e t + t y ö v a a t t e e t + t y ö v a i h d o n + t y ö v a i h e + t y ö v a i h e e m m e + t y ö v a i h e e s s a + t y ö v a l i o k u n t a + t y ö v a l m i u d e t + t y ö v a l t a i s e l t a + t y ö v a l t a i s e n + t y ö v a l t a i s e t + t y ö v a l t a i s i a + t y ö v a l t a i s i i n + t y ö v a l t a i s i l l a + t y ö v a l t a i s i l l e + t y ö v a l t a i s t a + t y ö v a l t a i s t e n + t y ö v e l v o l l i s u u k s i a a n + t y ö v e l v o l l i s u u k s i e n + t y ö v e l v o l l i s u u t e n s a + t y ö v i e r a i l u i l l a n i + t y ö v i e r a i l u j a + t y ö v i e r a i l u l l a + t y ö v i e r a i l u l l e + t y ö v i e r a i l u n + t y ö v i i k k o + t y ö v i i k k o a + t y ö v i i k k o j a + t y ö v i i k k o o n + t y ö v i i k o i l t a + t y ö v i i k o i s t a + t y ö v i i k o l l e + t y ö v i i k o n + t y ö v i i k o s t a + t y ö v i i k o t + t y ö v i i s u m e i h i n + t y ö v i i s u m i e n + t y ö v i i s u m i s t a + t y ö v i r a n o m a i s e n + t y ö v o i m a + t y ö v o i m a a + t y ö v o i m a a n + t y ö v o i m a a n s a + t y ö v o i m a e d u n + t y ö v o i m a e l i n t e n + t y ö v o i m a h a a s t e i s i i n + t y ö v o i m a i n s t i t u u t t i + t y ö v o i m a i n t e n s i i v i s i i n + t y ö v o i m a i n t e n s i i v i s t ä + t y ö v o i m a k a p e i k k o j e n + t y ö v o i m a k o u l u t u k s e e n + t y ö v o i m a k o u l u t u s + t y ö v o i m a k r i i s i s t ä + t y ö v o i m a k r i t e e r e i s t ä + t y ö v o i m a k s i + t y ö v o i m a k u l u i s t a a n + t y ö v o i m a k u l u j a + t y ö v o i m a k u l u j e n + t y ö v o i m a k u l u t + t y ö v o i m a k u s t a n n u k s e t + t y ö v o i m a k u s t a n n u k s i a + t y ö v o i m a k u s t a n n u k s i a a n + t y ö v o i m a k u s t a n n u k s i e n + t y ö v o i m a k u s t a n n u k s i i n + t y ö v o i m a k u s t a n n u k s i l l a + t y ö v o i m a k u s t a n n u k s i l l a a n + t y ö v o i m a k u s t a n n u k s i l t a a n + t y ö v o i m a k u s t a n n u k s i n + t y ö v o i m a k u s t a n n u k s i s t a + t y ö v o i m a k u s t a n n u s i n d e k s i + t y ö v o i m a k u s t a n n u s i n d e k s i e n + t y ö v o i m a k u s t a n n u s i n d e k s i i n + t y ö v o i m a k u s t a n n u s i n d e k s i s t ä + t y ö v o i m a k u s t a n n u s i n d e k s i ä + t y ö v o i m a k u s t a n n u s t e n + t y ö v o i m a k u s t a n n u s t i l a s t o i s t a + t y ö v o i m a k u s t a n n u s t i l a s t o j a + t y ö v o i m a k y s y m y k s e t + t y ö v o i m a l a i n + t y ö v o i m a l a i n s ä ä d ä n t ö ä + t y ö v o i m a l l a + t y ö v o i m a l l e + t y ö v o i m a l l e e n + t y ö v o i m a m a r k k i n a + t y ö v o i m a m a r k k i n a t + t y ö v o i m a m a r k k i n o i d e n + t y ö v o i m a m a r k k i n o i h i n + t y ö v o i m a m a r k k i n o i l l e + t y ö v o i m a m a r k k i n o i s t a + t y ö v o i m a m i n i s t e r e i t ä + t y ö v o i m a m i n i s t e r i e n + t y ö v o i m a m i n i s t e r i m m e + t y ö v o i m a m i n i s t e r i n + t y ö v o i m a m i n i s t e r i t + t y ö v o i m a m i n i s t e r i ö + t y ö v o i m a m m e + t y ö v o i m a m u u t t a j a + t y ö v o i m a m u u t t a j i a + t y ö v o i m a m u u t t a j i e n + t y ö v o i m a m u u t t a j i i n + t y ö v o i m a n + t y ö v o i m a n a + t y ö v o i m a n v u o k r a u k s e s s a + t y ö v o i m a n v u o k r a u s a l a + t y ö v o i m a n v u o k r a u s a l a n + t y ö v o i m a n v u o k r a u s y r i t y k s i ä + t y ö v o i m a n v u o k r a u s y r i t y s t e n + t y ö v o i m a o n g e l m i a + t y ö v o i m a o s u u d e n + t y ö v o i m a o s u u t e e n + t y ö v o i m a o s u u t t a + t y ö v o i m a p a i n o t t e i s e e n + t y ö v o i m a p a i n o t t e i s i a + t y ö v o i m a p a l v e l u j a + t y ö v o i m a p a l v e l u s e k t o r i n + t y ö v o i m a p a l v e l u t + t y ö v o i m a p a l v e l u v e r k k o j a + t y ö v o i m a p a n o s t a + t y ö v o i m a p e r u s t a n + t y ö v o i m a p o h j a n + t y ö v o i m a p o l i i t t i s t e n + t y ö v o i m a p o l i t i i k a n + t y ö v o i m a p o l i t i i k a s s a + t y ö v o i m a p o l i t i i k a s t a + t y ö v o i m a p o l i t i i k k a + t y ö v o i m a p o l i t i i k k a a + t y ö v o i m a p o l i t i i k k o i h i n + t y ö v o i m a p o l i t i i k k o j e n + t y ö v o i m a p u l a + t y ö v o i m a p u l a a + t y ö v o i m a p u l a a n + t y ö v o i m a p u l a n + t y ö v o i m a p u l a s t a + t y ö v o i m a r a j o i t u k s e t + t y ö v o i m a r e s e r v i + t y ö v o i m a r e s u r s s i e n + t y ö v o i m a s s a + t y ö v o i m a s t a + t y ö v o i m a s t a n d a r d i t + t y ö v o i m a s u u n n i t t e l u + t y ö v o i m a t a r k a s t a j i e n + t y ö v o i m a t a r k a s t a j i l l a + t y ö v o i m a t a r k a s t u s t e n + t y ö v o i m a t a r p e e n + t y ö v o i m a t a r p e e s e e n + t y ö v o i m a t a r p e e s t a + t y ö v o i m a t a r p e i s i i n + t y ö v o i m a t a r p e i s i i n s a + t y ö v o i m a t a r p e i t a m m e + t y ö v o i m a t e k i j ä + t y ö v o i m a t o i m i s t o i h i n + t y ö v o i m a t o i m i s t o i s s a + t y ö v o i m a t o i m i s t o j a + t y ö v o i m a t o i m i s t o j e n + t y ö v o i m a t o i m i s t o n + t y ö v o i m a t o i m i s t o t + t y ö v o i m a t u o m i o i s t u i m e n + t y ö v o i m a t u o m i o i s t u i m e s t a + t y ö v o i m a t u o m i o i s t u i n + t y ö v o i m a t u t k i m u k s e n + t y ö v o i m a t u t k i m u k s e s s a + t y ö v o i m a t u t k i m u s + t y ö v o i m a u u d i s t u k s e n n e + t y ö v o i m a u u d i s t u s t a + t y ö v o i m a v a a t i m u k s i a + t y ö v o i m a v a a t i m u k s i e m m e + t y ö v o i m a v a j e e n + t y ö v o i m a v a l t a i n e n + t y ö v o i m a v a l t a i s e e n + t y ö v o i m a v a l t a i s e l l a + t y ö v o i m a v a l t a i s e n + t y ö v o i m a v a l t a i s e n a + t y ö v o i m a v a l t a i s e s t a + t y ö v o i m a v a l t a i s e t + t y ö v o i m a v a l t a i s i a + t y ö v o i m a v a l t a i s i i n + t y ö v o i m a v a l t a i s i l l a + t y ö v o i m a v a l t a i s i l l e + t y ö v o i m a v a l t a i s i l t a + t y ö v o i m a v a l t a i s i m m a n + t y ö v o i m a v a l t a i s i m p i e n + t y ö v o i m a v a l t a i s i s s a + t y ö v o i m a v a l t a i s i s t a + t y ö v o i m a v a l t a i s t a + t y ö v o i m a v a l t a i s t e n + t y ö v o i m a v a l t a i s u u s + t y ö v o i m a v a r o i s t a + t y ö v o i m a v i r a n o m a i s e n + t y ö v o i m a v i r r a n + t y ö v o i m a v i r t a + t y ö v o i m a v u o k r a u s t o i m i s t o n + t y ö v o i m i e n + t y ö v u o d e n + t y ö v u o d e s t a + t y ö v u o d e t + t y ö v u o r e n + t y ö v u o r o a + t y ö v u o r o j ä r j e s t e l m ä ä n + t y ö v u o r o l i s t o i s t a + t y ö v u o r o t + t y ö v u o r t a + t y ö v u o s i a + t y ö v u o s i e n + t y ö v u o s i s t a a n + t y ö v u o t t a + t y ö v ä e n + t y ö v ä e n h a l l i t u k s e n + t y ö v ä e n h a l l i t u s + t y ö v ä e n h a l l i t u s t a + t y ö v ä e n i n t e r n a t i o n a a l i n + t y ö v ä e n k u l t t u u r i + t y ö v ä e n l i i k e + t y ö v ä e n l i i k e t t ä + t y ö v ä e n l i i k k e e k s i + t y ö v ä e n l i i k k e e l l e + t y ö v ä e n l i i k k e e n + t y ö v ä e n l i i k k e e s e e n + t y ö v ä e n l i i k k e e s s ä + t y ö v ä e n l i i k k e i s i i n + t y ö v ä e n l i i t t o + t y ö v ä e n l u o k a l l a + t y ö v ä e n l u o k a l l e + t y ö v ä e n l u o k a l t a + t y ö v ä e n l u o k a n + t y ö v ä e n l u o k a s t a + t y ö v ä e n l u o k a t + t y ö v ä e n l u o k i l l a + t y ö v ä e n l u o k i l l e + t y ö v ä e n l u o k k a + t y ö v ä e n l u o k k a a + t y ö v ä e n l u o k k a a n + t y ö v ä e n l u o k k i a + t y ö v ä e n l u o k k i e n + t y ö v ä e n o p i s t o t + t y ö v ä e n p o l i i t i k k o + t y ö v ä e n p u o l u e + t y ö v ä e n p u o l u e e l l e + t y ö v ä e n p u o l u e e l t a + t y ö v ä e n p u o l u e e m m e + t y ö v ä e n p u o l u e e n + t y ö v ä e n p u o l u e e s e e n + t y ö v ä e n p u o l u e e s s a + t y ö v ä e n p u o l u e e s t a + t y ö v ä e n p u o l u e h a l l i t u k s e n + t y ö v ä e n p u o l u e h a l l i t u k s e n s a + t y ö v ä e n p u o l u e r y h m ä + t y ö v ä e n p u o l u e t t a + t y ö v ä e n t a l o + t y ö v ä e n t a s a v a l t a + t y ö v ä e n y h d i s t y s + t y ö v ä e s t ö + t y ö v ä e s t ö l l e + t y ö v ä e s t ö l l ä + t y ö v ä e s t ö l t ä + t y ö v ä e s t ö n + t y ö v ä e s t ö s s ä + t y ö v ä e s t ö s t ä + t y ö v ä e s t ö ä + t y ö v ä e s t ö ö n + t y ö v ä l i n e + t y ö v ä l i n e e k s i + t y ö v ä l i n e e m m e + t y ö v ä l i n e e n + t y ö v ä l i n e e n i + t y ö v ä l i n e e n s ä + t y ö v ä l i n e e t + t y ö v ä l i n e i d e n s ä + t y ö v ä l i n e i k s e e n + t y ö v ä l i n e i l l e + t y ö v ä l i n e i n ä + t y ö v ä l i n e i s i i n + t y ö v ä l i n e i t ä + t y ö y h t e i s ö + t y ö y h t e i s ö ä + t y ö y h t e y k s i e n + t y ö y k s i k ö n + t y ö y m p ä r i s t ö + t y ö y m p ä r i s t ö a s i o i s s a + t y ö y m p ä r i s t ö a s i o i t a + t y ö y m p ä r i s t ö i s t ä + t y ö y m p ä r i s t ö j e n + t y ö y m p ä r i s t ö l a i n s ä ä d ä n n ö n + t y ö y m p ä r i s t ö l l e + t y ö y m p ä r i s t ö m m e + t y ö y m p ä r i s t ö n + t y ö y m p ä r i s t ö n s ä + t y ö y m p ä r i s t ö s s ä + t y ö y m p ä r i s t ö s t ä + t y ö y m p ä r i s t ö t + t y ö y m p ä r i s t ö ä + t y ö y m p ä r i s t ö ä ä n + t y ö y m p ä r i s t ö ö n + t y ö y m p ä r i s t ö ö n s ä + t ä h d e l l i s e m p ä ä + t ä h d e l l i s i m m ä s t ä + t ä h d e n + t ä h d e n n ä n + t ä h d e n t ä m ä t t ä + t ä h d e n t ä ä + t ä h d i s t ä + t ä h d i s t ö j o u k k u e + t ä h d i s t ö k e n t ä l l i n e n + t ä h d i s t ö k e n t ä l l i s e t + t ä h d i s t ö o t t e l u + t ä h d i s t ö o t t e l u n + t ä h d i s t ö v i i k o n l o p p u + t ä h d ä t ä ä n + t ä h k ä a g a a v e + t ä h k ä h e l m i k k ä + t ä h k ä h i r s s i + t ä h k ä h ä n t ä + t ä h k ä l a v e n t e l i + t ä h k ä t ä d y k e + t ä h k ä v a a h t e r a + t ä h t i a i k a + t ä h t i a s s o s i a a t i o + t ä h t i e n + t ä h t i e s i i n t y j ä n + t ä h t i e s k a d r o o n a + t ä h t i h a t t u + t ä h t i h e t k i + t ä h t i h ä v i t t ä j ä + t ä h t i j o u k k o + t ä h t i j o u k o i s t a + t ä h t i j ä r j e s t e l m ä + t ä h t i k a m p e l a + t ä h t i k a r t t a + t ä h t i k a u p u n k i + t ä h t i k e n t ä l l i n e n + t ä h t i k i s a + t ä h t i k o k k i + t ä h t i k o k o o n t u m i n e n + t ä h t i k o r a l l i a h v e n + t ä h t i k o t k a r a u s k u + t ä h t i k ä m m e k k ä + t ä h t i l i p p u j e n + t ä h t i l i p p u n n e + t ä h t i l u o k i t u k s e t + t ä h t i m i e k k a + t ä h t i m o o t t o r i + t ä h t i m u r e e n a + t ä h t i n e e n + t ä h t i o p p i l a s + t ä h t i p a l l o k a l a + t ä h t i p i i s p a n h a t t u + t ä h t i p o p u l a a t i o + t ä h t i r a v i n t o l a n + t ä h t i r e n k a a s t a + t ä h t i r i k k o + t ä h t i r y ö p p y g a l a k s i + t ä h t i s a h r a m i + t ä h t i t a i v a a l l e + t ä h t i t a i v a s + t ä h t i t a i v a s t a + t ä h t i t a p a u k s i a + t ä h t i t i e d e + t ä h t i t i e t e e l l i s i ä + t ä h t i t u l i p e r ä + t ä h t i t u n n u s t a + t ä h t i t u o t t e e n + t ä h t i t ö p ö r a s t a s + t ä h t i ä + t ä h t ä i m e l l ä + t ä h t ä i m e n + t ä h t ä i m e s s ä + t ä h t ä i m e s s ä m m e + t ä h t ä y k s e l l ä + t ä h t ä ä m i n e n + t ä h t ä ä m m e + t ä h t ä ä v i e n + t ä h t ä ä v i i n + t ä h t ä ä v i l l ä + t ä h t ä ä v i ä + t ä h t ä ä v ä + t ä h t ä ä v ä n + t ä h t ä ä v ä s t ä + t ä h t ä ä v ä t + t ä h t ä ä v ä ä + t ä h y s t ä j ä t + t ä h ä n a s t i s e l l a + t ä h ä n a s t i s e n + t ä h ä n a s t i s e s s a + t ä h ä n a s t i s e s t a + t ä h ä n a s t i s e t + t ä h ä n a s t i s i a + t ä h ä n a s t i s i i n + t ä h ä n a s t i s i l l a + t ä h ä n a s t i s i l l e + t ä h ä n a s t i s i s s a + t ä h ä n a s t i s i s t a + t ä h ä n a s t i s t a + t ä h ä n k i n + t ä k y m a i n o n n a l l a + t ä k y m a i n o n t a + t ä l l a i s e e n + t ä l l a i s e l l a + t ä l l a i s e l l e + t ä l l a i s e l t a + t ä l l a i s e n + t ä l l a i s e n a a n + t ä l l a i s e s s a + t ä l l a i s e s t a + t ä l l a i s e t + t ä l l a i s e t k i n + t ä l l a i s i a + t ä l l a i s i i n + t ä l l a i s i k s i + t ä l l a i s i l l a + t ä l l a i s i l l e + t ä l l a i s i l t a + t ä l l a i s i s s a + t ä l l a i s i s t a + t ä l l a i s t a + t ä l l a i s t a h a n + t ä l l a i s t e n + t ä l l e + t ä l l e k i n + t ä l l ä + t ä l l ä k i n + t ä l l ö i n k i n + t ä l t ä + t ä l t ä k i n + t ä m ä k i n + t ä m ä k ä ä n + t ä m ä n + t ä m ä n a a m u i s e s s a + t ä m ä n a a m u i s i i n + t ä m ä n a a m u i s i s s a + t ä m ä n a a m u i s t a + t ä m ä n h e t k i s e e n + t ä m ä n h e t k i s e l l e + t ä m ä n h e t k i s e n + t ä m ä n h e t k i s e n ä + t ä m ä n h e t k i s e s s ä + t ä m ä n h e t k i s e s t ä + t ä m ä n h e t k i s e t + t ä m ä n h e t k i s e t k i n + t ä m ä n h e t k i s i i n + t ä m ä n h e t k i s i l l e + t ä m ä n h e t k i s i s s ä + t ä m ä n h e t k i s i s t ä + t ä m ä n h e t k i s i ä + t ä m ä n h e t k i s t e n + t ä m ä n h e t k i s t ä + t ä m ä n i l t a i s e e n + t ä m ä n i l t a i s e n + t ä m ä n i l t a i s e s s a + t ä m ä n i l t a i s e s t a + t ä m ä n i l t a i s i a + t ä m ä n i l t a i s t a + t ä m ä n i l t a i s t e n + t ä m ä n k a l t a i s e l l e + t ä m ä n k a l t a i s e n + t ä m ä n k a l t a i s e s s a + t ä m ä n k a l t a i s e t + t ä m ä n k a l t a i s i a + t ä m ä n k a l t a i s i i n + t ä m ä n k a l t a i s i l t a + t ä m ä n k a l t a i s i s s a + t ä m ä n k a l t a i s i s t a + t ä m ä n k a l t a i s t a + t ä m ä n k e s ä i s e t + t ä m ä n k i n + t ä m ä n p ä i v ä i s e e n + t ä m ä n p ä i v ä i s e l l e + t ä m ä n p ä i v ä i s e n + t ä m ä n p ä i v ä i s e s s ä + t ä m ä n p ä i v ä i s e s t ä + t ä m ä n p ä i v ä i s e t + t ä m ä n p ä i v ä i s i i n + t ä m ä n p ä i v ä i s i s s ä + t ä m ä n p ä i v ä i s i s s ä k i n + t ä m ä n p ä i v ä i s i s t ä + t ä m ä n p ä i v ä i s i ä + t ä m ä n p ä i v ä i s t e n + t ä m ä n p ä i v ä i s t ä + t ä m ä n s u u n t a i s e n + t ä m ä n s u u n t a i s e s t i + t ä m ä n s u u n t a i s e t + t ä m ä n s u u n t a i s i a + t ä m ä n s u u n t a i s i i n + t ä m ä n s u u n t a i s t a + t ä m ä n t a p a i s e s t a + t ä m ä n t a p a i s e t + t ä m ä n t y y p p i s e n + t ä m ä n t y y p p i s i i n + t ä m ä n t y y p p i s i ä + t ä m ä n t y y p p i s t e n + t ä m ä n v i i k k o i s e s s a + t ä m ä n v u o t i s e n + t ä m ä n v u o t i s e s t a + t ä m ä n v u o t i s i a + t ä n ä + t ä n ä k i n + t ä n ä k ä ä n + t ä n ä ä n k i n + t ä n ä ä n k ä ä n + t ä p l ä a p i n a n k u k k a + t ä p l ä b u l b u l i + t ä p l ä f a s a a n i t + t ä p l ä h a u k i + t ä p l ä h a u k k a k a l a + t ä p l ä h e l t t a v a l m u s k a + t ä p l ä h i e t a k y y h k y + t ä p l ä h u u h k a j a + t ä p l ä h y e e n a + t ä p l ä h y l j e + t ä p l ä i n t e r f e r o m e t r i a + t ä p l ä j ä t t i l ä i s h y p p y p ä ä s t ä i n e n + t ä p l ä k e h r ä ä j ä + t ä p l ä k e r t t u n e n + t ä p l ä k i i l t o k o r e n t o + t ä p l ä k i p u a j a + t ä p l ä k u r k k u k i p u a j a + t ä p l ä k u s k u s + t ä p l ä l a m p i k o r e n t o + t ä p l ä l a u l u m e s i k k o + t ä p l ä l i a a n i t i k k a n e n + t ä p l ä l i n t u h a u k k a + t ä p l ä l o s s e r o k a l a + t ä p l ä m a r j a s t a j a + t ä p l ä m e r i k i s s a + t ä p l ä m u n k i n h u p p u + t ä p l ä n a p a k o t i l o + t ä p l ä n e n ä m a r a k a t t i + t ä p l ä n o u t o + t ä p l ä o t s a t i k k a n e n + t ä p l ä p a l l o k a l a + t ä p l ä p a l m u t a s k u + t ä p l ä p a p u r i k k o + t ä p l ä p a r t a h a i + t ä p l ä p a r t a m o n n i + t ä p l ä p i i s p a n h a t t u + t ä p l ä p r e u s s i n a h v e n + t ä p l ä p u s s i n ä ä t ä + t ä p l ä p y y j u o k s i j a + t ä p l ä p ö l l ö + t ä p l ä r a p u + t ä p l ä r a s t a s + t ä p l ä r i s a k a s + t ä p l ä s a l a m a n t e r i + t ä p l ä s a m m a l t i k k a + t ä p l ä s e e p r a k a l a + t ä p l ä s i i p i k y y h k y + t ä p l ä s i i p i m o n a r k k i + t ä p l ä s i l l i + t ä p l ä s i r p p i m a t k i j a + t ä p l ä s i r p p i s i i p i + t ä p l ä t i k k a + t ä p l ä t i k k a n e n + t ä p l ä t o k a + t ä p l ä t o r n i p ö l l ö + t ä p l ä v a t s a t i k k a n e n + t ä p l ä v e r k k o p e r h o n e n + t ä p l ä v i h e l t ä j ä s o r s a + t ä p l ä v i i r i p y r s t ö + t ä p l ä v i k l o + t ä p ä r ä ä + t ä r k e i d e n + t ä r k e i k s i + t ä r k e i l l ä + t ä r k e i l t ä + t ä r k e i m m i k s i + t ä r k e i m m i l l e + t ä r k e i m m i l l ä + t ä r k e i m m i l t ä + t ä r k e i m m i s s ä + t ä r k e i m m i s t ä + t ä r k e i m m i s t ä k ä ä n + t ä r k e i m m ä k s i + t ä r k e i m m ä l l e + t ä r k e i m m ä l l ä + t ä r k e i m m ä l t ä + t ä r k e i m m ä n + t ä r k e i m m ä s s ä + t ä r k e i m m ä s t ä + t ä r k e i m m ä t + t ä r k e i m p i e n + t ä r k e i m p i i n + t ä r k e i m p i n ä + t ä r k e i m p i ä + t ä r k e i m p ä n ä + t ä r k e i m p ä ä n + t ä r k e i n + t ä r k e i n t ä + t ä r k e i n ä + t ä r k e i s i i n + t ä r k e i s s ä + t ä r k e i s t ä + t ä r k e i t ä + t ä r k e y d e n + t ä r k e y d e s t ä + t ä r k e y s a s t e + t ä r k e y s j ä r j e s t y k s e e n + t ä r k e y s j ä r j e s t y k s e m m e + t ä r k e y s j ä r j e s t y k s e n + t ä r k e y s j ä r j e s t y k s e s s ä + t ä r k e y s j ä r j e s t y k s e s s ä n i + t ä r k e y s j ä r j e s t y s + t ä r k e y s j ä r j e s t y s k y s y m y s + t ä r k e y s j ä r j e s t y s t ä + t ä r k e y t t ä + t ä r k e ä k s i + t ä r k e ä l l e + t ä r k e ä l l ä + t ä r k e ä l t ä + t ä r k e ä m m i k s i + t ä r k e ä m m i l t ä + t ä r k e ä m m i s s ä + t ä r k e ä m m i s t ä + t ä r k e ä m m ä k s i + t ä r k e ä m m ä l l ä + t ä r k e ä m m ä l t ä + t ä r k e ä m m ä n + t ä r k e ä m m ä s s ä + t ä r k e ä m m ä s t ä + t ä r k e ä m m ä t + t ä r k e ä m p i + t ä r k e ä m p i e n + t ä r k e ä m p i i n + t ä r k e ä m p i k i n + t ä r k e ä m p i n ä + t ä r k e ä m p i ä + t ä r k e ä m p i ä k i n + t ä r k e ä m p ä n ä + t ä r k e ä m p ä n ä k i n + t ä r k e ä m p ä ä + t ä r k e ä m p ä ä k i n + t ä r k e ä m p ä ä n + t ä r k e ä n + t ä r k e ä n ä + t ä r k e ä s s ä + t ä r k e ä s t ä + t ä r k e ä t + t ä r k e ä t ä + t ä r k e ä ä + t ä r k e ä ä k ä ä n + t ä r k e ä ä n + t ä r k k e l y k s e n + t ä r k k e l y s a l a a n + t ä r k k e l y s k i i n t i ö i t ä + t ä r k k e l y s m a r k k i n o i d e n + t ä r k k e l y s m a r k k i n o i h i n + t ä r k k e l y s m a r k k i n o i l l a + t ä r k k e l y s p e r u n a + t ä r k k e l y s p e r u n a a + t ä r k k e l y s p e r u n a l l e + t ä r k k e l y s p e r u n a n + t ä r k k e l y s p e r u n o i d e n + t ä r k k e l y s t e h t a a t + t ä r k k e l y s t e o l l i s u u d e n + t ä r k k e l y s t e o l l i s u u s + t ä r k k e l y s t u o t a n n o n + t ä r k k e l y s t u o t a n t o + t ä r k k e l y s t u o t a n t o a + t ä r k k e l y s t u o t a n t o k a p a s i t e e t i n + t ä r k k e l y s t u o t a n t o k i i n t i ö + t ä r k k e l y s t u o t a n t o k i i n t i ö t + t ä r k k e l y s t u o t t a j i a + t ä r k k e l y s t u o t t e e t + t ä r k k e l y s t u o t t e i n a + t ä r k k e l y s t ä + t ä r p ä t t i p i s t a a s i + t ä r v e l t y ä + t ä s m e n n e t t i i n + t ä s m e n n e t t y + t ä s m e n n e t t ä k ö ö n + t ä s m e n n e t ä + t ä s m e n n e t ä ä n + t ä s m e n n y k s e n + t ä s m e n n y k s i s t ä + t ä s m e n n y k s i ä + t ä s m e n n y s t ä + t ä s m e n n ä n + t ä s m e n s i t t e + t ä s m e n t ä m i s e e n + t ä s m e n t ä m i s e s t ä + t ä s m e n t ä m i s t ä + t ä s m e n t ä m ä l l ä + t ä s m e n t ä m ä t t ä + t ä s m e n t ä m ä ä n + t ä s m e n t ä v ä n + t ä s m e n t ä v ä t + t ä s m e n t ä ä + t ä s m ä a s e i s i i n + t ä s m ä a s e i t a + t ä s m ä i s k u j a + t ä s m ä i s k u j e n + t ä s m ä i s k u s t a + t ä s m ä i s k u t + t ä s m ä l l i s e e n + t ä s m ä l l i s e m m i n + t ä s m ä l l i s e m m i s t ä + t ä s m ä l l i s e m m ä k s i + t ä s m ä l l i s e m m ä l l ä + t ä s m ä l l i s e m m ä n + t ä s m ä l l i s e m m ä t + t ä s m ä l l i s e m p i + t ä s m ä l l i s e m p i e n + t ä s m ä l l i s e m p i i n + t ä s m ä l l i s e m p i ä + t ä s m ä l l i s e m p ä ä + t ä s m ä l l i s e m p ä ä n + t ä s m ä l l i s e n + t ä s m ä l l i s i i n + t ä s m ä l l i s i k s i + t ä s m ä l l i s i m m ä n + t ä s m ä l l i s i n + t ä s m ä l l i s i ä + t ä s m ä l l i s y y d e s t ä + t ä s m ä l l i s y y t e e n + t ä s m ä ä m ä ä n + t ä s s ä k i n + t ä s s ä k ä ä n + t ä s t ä k i n + t ä s t ä k ä ä n + t ä t ä + t ä t ä h ä n + t ä t ä k i n + t ä t ä k ä ä n + t ä t ä k ö + t ä y d e k s i + t ä y d e l l i s e e n + t ä y d e l l i s e k s i + t ä y d e l l i s e m m i n + t ä y d e l l i s e m m ä n + t ä y d e l l i s e m m ä t + t ä y d e l l i s e m p i + t ä y d e l l i s e m p ä ä + t ä y d e l l i s e m p ä ä n + t ä y d e l l i s e n + t ä y d e l l i s e s s ä + t ä y d e l l i s e s t ä + t ä y d e l l i s e t + t ä y d e l l i s i m m i s t ä + t ä y d e l l i s i n + t ä y d e l l i s i n k ä ä n + t ä y d e l l i s i ä + t ä y d e l l i s t e n + t ä y d e l l i s y y s a k s i o o m a + t ä y d e l l i s y y s t a r k a s t u k s e n + t ä y d e l l i s y y s t e s t i ä + t ä y d e l l i s y y t t ä + t ä y d e l l ä + t ä y d e m p i + t ä y d e n + t ä y d e n n e t ä ä n + t ä y d e n n y k s e k s i + t ä y d e n n y k s e n ä + t ä y d e n n y k s i ä + t ä y d e n n y s j a k a u m a + t ä y d e n n y s j o u k k o j a + t ä y d e n n y s k o u l u t u k s e e n + t ä y d e n n y s k o u l u t u k s e l l a + t ä y d e n n y s k o u l u t u k s e n + t ä y d e n n y s k o u l u t u k s e s s a + t ä y d e n n y s k o u l u t u k s e s t a + t ä y d e n n y s k o u l u t u s + t ä y d e n n y s k o u l u t u s k u r s s i e n + t ä y d e n n y s k o u l u t u s m a h d o l l i s u u k s i a + t ä y d e n n y s k o u l u t u s m a h d o l l i s u u k s i e n + t ä y d e n n y s k o u l u t u s o h j e l m a t + t ä y d e n n y s k o u l u t u s o h j e l m i a + t ä y d e n n y s k o u l u t u s t a + t ä y d e n n y s k o u l u t u s t o i m i i n + t ä y d e n n y s m a l l i a + t ä y d e n n y s m ä ä r ä y k s i i n s ä + t ä y d e n n y s o s i a + t ä y d e n n y s r a h a s t o + t ä y d e n n y s v a r a t + t ä y d e n t ä e n + t ä y d e n t ä e s s ä n i + t ä y d e n t ä i s i + t ä y d e n t ä i s i n + t ä y d e n t ä m i s e k s i + t ä y d e n t ä m i s e n + t ä y d e n t ä m ä t t ä + t ä y d e n t ä m ä t ö n t ä + t ä y d e n t ä m ä ä n + t ä y d e n t ä v i e n + t ä y d e n t ä v i i n + t ä y d e n t ä v i k s i + t ä y d e n t ä v i l l ä + t ä y d e n t ä v i n ä + t ä y d e n t ä v i s t ä + t ä y d e n t ä v i ä + t ä y d e n t ä v y y d e n + t ä y d e n t ä v y y d e s s ä + t ä y d e n t ä v y y d e s t ä + t ä y d e n t ä v y y s a s i a + t ä y d e n t ä v y y s k r i t e e r i n + t ä y d e n t ä v y y s l o g i i k a n + t ä y d e n t ä v y y s m e k a n i s m i + t ä y d e n t ä v y y s p e r i a a t e + t ä y d e n t ä v y y s p e r i a a t e t t a + t ä y d e n t ä v y y s p e r i a a t t e e n + t ä y d e n t ä v y y s p e r i a a t t e e s t a + t ä y d e n t ä v y y s p o l i t i i k k a a + t ä y d e n t ä v y y t e e n + t ä y d e n t ä v y y t t ä + t ä y d e n t ä v ä k s i + t ä y d e n t ä v ä l l e + t ä y d e n t ä v ä m p ä ä n + t ä y d e n t ä v ä n + t ä y d e n t ä v ä s t ä + t ä y d e n t ä v ä t + t ä y d e n t ä v ä ä + t ä y d e n t ä ä + t ä y d e n t ä ä k s e e n + t ä y d e s s ä + t ä y d e s t ä + t ä y d e t + t ä y s i a i k a i s e s t i + t ä y s i a i k a i s i n a + t ä y s i a r v o i n e n + t ä y s i e n + t ä y s i k a s v u i n e n + t ä y s i k a s v u i s e s t i + t ä y s i k a s v u i s t a + t ä y s i k a s v u i s t e n + t ä y s i k u u + t ä y s i k u u n + t ä y s i m i t t a i n e n + t ä y s i m i t t a i s e e n + t ä y s i m i t t a i s e n + t ä y s i m i t t a i s e s s a + t ä y s i m i t t a i s e s t a + t ä y s i m i t t a i s e s t i + t ä y s i m i t t a i s i i n + t ä y s i m i t t a i s t a + t ä y s i m i t t a i s t e n + t ä y s i m ä ä r ä i n e n + t ä y s i m ä ä r ä i s e k s i + t ä y s i m ä ä r ä i s e l l e + t ä y s i m ä ä r ä i s e m m i n + t ä y s i m ä ä r ä i s e m m ä k s i + t ä y s i m ä ä r ä i s e n + t ä y s i m ä ä r ä i s e s s ä + t ä y s i m ä ä r ä i s e s t i + t ä y s i m ä ä r ä i s e s t ä + t ä y s i m ä ä r ä i s i k s i + t ä y s i m ä ä r ä i s i n ä + t ä y s i m ä ä r ä i s i ä + t ä y s i m ä ä r ä i s t e n + t ä y s i m ä ä r ä i s t ä + t ä y s i p a i n o i n e n + t ä y s i p a i n o i s e e n + t ä y s i p a i n o i s e m m i n + t ä y s i p a i n o i s e m p i + t ä y s i p a i n o i s e n + t ä y s i p a i n o i s e n a + t ä y s i p a i n o i s e s s a + t ä y s i p a i n o i s e s t i + t ä y s i p a i n o i s i k s i + t ä y s i p a i n o i s t a + t ä y s i p a l k k a i s e n + t ä y s i p a l k k a i s t a + t ä y s i p ä i v ä i n e n + t ä y s i p ä i v ä i s e l l e + t ä y s i p ä i v ä i s i k s i + t ä y s i p ä i v ä i s t ä + t ä y s i s t u n n o i s s a + t ä y s i s t u n n o i s s a m m e + t ä y s i s t u n n o i s t a + t ä y s i s t u n n o l l e + t ä y s i s t u n n o n + t ä y s i s t u n n o s s a + t ä y s i s t u n n o s s a a n + t ä y s i s t u n n o s s a k i n + t ä y s i s t u n n o s s a m m e + t ä y s i s t u n n o s s a n n e + t ä y s i s t u n n o s t a + t ä y s i s t u n n o t + t ä y s i s t u n t o a + t ä y s i s t u n t o a i k a + t ä y s i s t u n t o i h i n + t ä y s i s t u n t o j a + t ä y s i s t u n t o j a k s o + t ä y s i s t u n t o j a k s o j e n + t ä y s i s t u n t o j a k s o l l a + t ä y s i s t u n t o j a k s o l l e + t ä y s i s t u n t o j a k s o n + t ä y s i s t u n t o j a k s o o n + t ä y s i s t u n t o j a k s o s s a + t ä y s i s t u n t o j a m m e + t ä y s i s t u n t o j e m m e + t ä y s i s t u n t o j e n + t ä y s i s t u n t o j e n s a + t ä y s i s t u n t o k a l e n t e r i m m e + t ä y s i s t u n t o k e s k u s t e l u + t ä y s i s t u n t o k e s k u s t e l u a + t ä y s i s t u n t o k e s k u s t e l u i h i n + t ä y s i s t u n t o k e s k u s t e l u i l l e + t ä y s i s t u n t o k e s k u s t e l u i n a + t ä y s i s t u n t o k e s k u s t e l u i s s a + t ä y s i s t u n t o k e s k u s t e l u j e n + t ä y s i s t u n t o k e s k u s t e l u l l e + t ä y s i s t u n t o k e s k u s t e l u n + t ä y s i s t u n t o k e s k u s t e l u n s a + t ä y s i s t u n t o k e s k u s t e l u s s a + t ä y s i s t u n t o k e s k u s t e l u s t a + t ä y s i s t u n t o k e s k u s t e l u u n + t ä y s i s t u n t o k o k o u k s e s s a + t ä y s i s t u n t o k ä s i t t e l y + t ä y s i s t u n t o k ä s i t t e l y n + t ä y s i s t u n t o k ä s i t t e l y s s ä + t ä y s i s t u n t o k ä s i t t e l y y n + t ä y s i s t u n t o k ä s i t t e l y ä + t ä y s i s t u n t o m e n e t t e l y j ä m m e + t ä y s i s t u n t o m e n e t t e l y n + t ä y s i s t u n t o m e n e t t e l y s s ä + t ä y s i s t u n t o m m e + t ä y s i s t u n t o n s a + t ä y s i s t u n t o o n + t ä y s i s t u n t o o n n e + t ä y s i s t u n t o o n s a + t ä y s i s t u n t o p a l v e l u j e n + t ä y s i s t u n t o p ä i v ä + t ä y s i s t u n t o p ä i v ä m m e + t ä y s i s t u n t o p ä i v ä n ä + t ä y s i s t u n t o r a l l i n + t ä y s i s t u n t o s a l i a + t ä y s i s t u n t o s a l i i n + t ä y s i s t u n t o s a l i n + t ä y s i s t u n t o s a l i s s a + t ä y s i s t u n t o t a r k i s t u k s e t + t ä y s i s t u n t o t a r k i s t u k s i a + t ä y s i s t u n t o t a r k i s t u k s i s t a + t ä y s i s t u n t o t a r k i s t u s + t ä y s i s t u n t o t y ö m m e + t ä y s i s t u n t o t y ö s k e n t e l y ä + t ä y s i s t u n t o v a i h e e s s a + t ä y s i s t u n t o v i i k k o + t ä y s i s t u n t o v i i k k o a + t ä y s i s t u n t o v i i k k o j a + t ä y s i s t u n t o v i i k k o o n + t ä y s i s t u n t o v i i k o l l a + t ä y s i s t u n t o v i i k o l l e + t ä y s i s t u n t o v i i k o n + t ä y s i s t u n t o ä ä n e s t y k s e e n + t ä y s i s t u n t o ä ä n e s t y k s e m m e + t ä y s i s t u n t o ä ä n e s t y k s e n + t ä y s i s t u n t o ä ä n e s t y k s e s s ä + t ä y s i s t u n t o ä ä n e s t y k s i ä + t ä y s i s t u n t o ä ä n e s t y s + t ä y s i s t u n t o ä ä n e s t y s t e n + t ä y s i s t u n t o ä ä n e s t y s t ä + t ä y s i s t u n t o ä ä n e s t y s t ä m m e + t ä y s i v a i k u t t e i s i a + t ä y s i v a l t a i n e n + t ä y s i v a l t a i s e e n + t ä y s i v a l t a i s e k s i + t ä y s i v a l t a i s e n a + t ä y s i v a l t a i s e s t i + t ä y s i v a l t a i s i a + t ä y s i v a l t a i s i k s i + t ä y s i v a l t a i s i n a + t ä y s i v a l t a i s t a + t ä y s i v a l t a i s t e n + t ä y s i v a l t a i s u u s l a u s e k e t t a + t ä y s i v a l t a i s u u s p e r i a a t e t t a + t ä y s i v a l t a i s u u t t a + t ä y s i ä + t ä y s j ä s e n e k s i + t ä y s j ä s e n e n ä + t ä y s j ä s e n i k s i + t ä y s j ä s e n i n ä + t ä y s j ä s e n i ä + t ä y s j ä s e n t ä + t ä y s j ä s e n y y d e k s i + t ä y s j ä s e n y y d e l l e + t ä y s j ä s e n y y d e l l ä + t ä y s j ä s e n y y d e n + t ä y s j ä s e n y y d e s t ä + t ä y s j ä s e n y y s n ä k y m ä ä + t ä y s j ä s e n y y t e e n + t ä y s j ä s e n y y t t ä + t ä y s k i e l l o n + t ä y s k i e l l o s t a + t ä y s k i e l t o a + t ä y s k i e l t o o n + t ä y s k ä ä n n ö k s e e n + t ä y s k ä ä n n ö k s e k s i + t ä y s k ä ä n n ö k s e l l e + t ä y s k ä ä n n ö k s e n + t ä y s k ä ä n n ö k s e n ä + t ä y s k ä ä n n ö k s e s t ä + t ä y s k ä ä n n ö k s e t + t ä y s k ä ä n n ö s t ä + t ä y s m a i t o j a u h e e l l e + t ä y s m a i t o t y y p p i n ä + t ä y s p ä i v ä i s i ä + t ä y s t y ö l l i s y y d e l l e + t ä y s t y ö l l i s y y d e n + t ä y s t y ö l l i s y y d e s t ä + t ä y s t y ö l l i s y y s p o l i t i i k a n + t ä y s t y ö l l i s y y s p o l i t i i k k a a + t ä y s t y ö l l i s y y s s u u n n i t e l m a l l a + t ä y s t y ö l l i s y y s t a v o i t e + t ä y s t y ö l l i s y y s t a v o i t t e i s i i n s a + t ä y s t y ö l l i s y y t e e n + t ä y s t y ö l l i s y y t t ä + t ä y s t y ö l l i s y y t t ä k ä ä n + t ä y t e a i n e e t + t ä y t e k y n ä + t ä y t e k y n ä n + t ä y t e s a n a + t ä y t e t t i i n + t ä y t e t t ä + t ä y t e t t ä e s s ä + t ä y t e t ä + t ä y t e t ä ä n + t ä y t e t ä ä n k ö + t ä y t t i v ä t + t ä y t t y i + t ä y t t y i s i v ä t + t ä y t t y i v ä t + t ä y t t y m i s t ä + t ä y t t y n y t + t ä y t t y v ä t + t ä y t t y y + t ä y t t ä + t ä y t t ä e s s ä ä n + t ä y t t ä i s i + t ä y t t ä i s i k ä ä n + t ä y t t ä i s i m m e + t ä y t t ä k ä ä + t ä y t t ä m i s e e n + t ä y t t ä m i s e k s i + t ä y t t ä m i s e l l e + t ä y t t ä m i s e s s ä + t ä y t t ä m i s e s t ä + t ä y t t ä m ä s s ä + t ä y t t ä m ä s t ä + t ä y t t ä m ä t t ä + t ä y t t ä m ä ä n + t ä y t t ä n e e t + t ä y t t ä n y t + t ä y t t ä v i e n + t ä y t t ä v i ä + t ä y t t ä v ä + t ä y t t ä v ä n + t ä y t t ä v ä t + t ä y t t ä v ä t k ö + t ä y t t ä v ä ä + t ä y t t ä ä + t ä y t t ä ä k i n + t ä y t t ä ä k s e e n + t ä y t t ä ä k s e m m e + t ä y t t ä ä k s e n n e + t ä y t t ä ä k ö + t ä y t t ö a i n e i t a + t ä y t y i + t ä y t y i s i + t ä y t y n y t + t ä y t y y + t ä y t y y k i n + t ä y t y y k ö + t ä y t ä m m e k ö + t ä y t ä n t ö ö n p a n e m a t t a + t ä y t ä n t ö ö n p a n e m i s e k s i + t ä y t ä n t ö ö n p a n o + t ä y t ä n t ö ö n p a n o a + t ä y t ä n t ö ö n p a n o a i k a + t ä y t ä n t ö ö n p a n o a i k a a + t ä y t ä n t ö ö n p a n o a i k a t a u l u + t ä y t ä n t ö ö n p a n o a i k a t a u l u a + t ä y t ä n t ö ö n p a n o a i k a t a u l u j a + t ä y t ä n t ö ö n p a n o a i k a t a u l u j e n + t ä y t ä n t ö ö n p a n o a i k a t a u l u n + t ä y t ä n t ö ö n p a n o a i k a t a u l u s t a + t ä y t ä n t ö ö n p a n o a i k o i h i n + t ä y t ä n t ö ö n p a n o a i k o j a + t ä y t ä n t ö ö n p a n o a j a n + t ä y t ä n t ö ö n p a n o a j a n k o h d a s t a + t ä y t ä n t ö ö n p a n o a j a n k o h d i s t a + t ä y t ä n t ö ö n p a n o a j a n k o h t a a + t ä y t ä n t ö ö n p a n o a j a t + t ä y t ä n t ö ö n p a n o a j o i s t a + t ä y t ä n t ö ö n p a n o a k i n + t ä y t ä n t ö ö n p a n o a l o i t t e i d e n + t ä y t ä n t ö ö n p a n o a s e t u k s e e n + t ä y t ä n t ö ö n p a n o a s e t u k s e k s i + t ä y t ä n t ö ö n p a n o a s e t u k s e l l a + t ä y t ä n t ö ö n p a n o a s e t u k s e n + t ä y t ä n t ö ö n p a n o a s e t u k s e s s a + t ä y t ä n t ö ö n p a n o a s e t u k s e s t a + t ä y t ä n t ö ö n p a n o a s e t u k s e t + t ä y t ä n t ö ö n p a n o a s e t u k s i a + t ä y t ä n t ö ö n p a n o a s e t u k s i i n + t ä y t ä n t ö ö n p a n o a s e t u k s i l l a + t ä y t ä n t ö ö n p a n o a s e t u k s i n a + t ä y t ä n t ö ö n p a n o a s e t u k s i s s a + t ä y t ä n t ö ö n p a n o a s e t u k s i s t a + t ä y t ä n t ö ö n p a n o a s e t u s + t ä y t ä n t ö ö n p a n o a s e t u s t a + t ä y t ä n t ö ö n p a n o a s e t u s t e n + t ä y t ä n t ö ö n p a n o a s i a k i r j a a + t ä y t ä n t ö ö n p a n o a s i o i s s a + t ä y t ä n t ö ö n p a n o a s t e + t ä y t ä n t ö ö n p a n o a s t e e n + t ä y t ä n t ö ö n p a n o a s t e e s e e n + t ä y t ä n t ö ö n p a n o a s t e e s t a + t ä y t ä n t ö ö n p a n o a s t e t t a + t ä y t ä n t ö ö n p a n o d i r e k t i i v i k s i + t ä y t ä n t ö ö n p a n o d i r e k t i i v i n + t ä y t ä n t ö ö n p a n o d i r e k t i i v i ä + t ä y t ä n t ö ö n p a n o e d e l l y t y k s i s t ä + t ä y t ä n t ö ö n p a n o e h d o i s t a + t ä y t ä n t ö ö n p a n o e h d o t + t ä y t ä n t ö ö n p a n o e h d o t u k s e s s a + t ä y t ä n t ö ö n p a n o e h d o t u k s e s s a m m e + t ä y t ä n t ö ö n p a n o e h d o t u s + t ä y t ä n t ö ö n p a n o e h d o t u s t a + t ä y t ä n t ö ö n p a n o e h t o i h i n + t ä y t ä n t ö ö n p a n o e l i m e t + t ä y t ä n t ö ö n p a n o e l i m i l l ä + t ä y t ä n t ö ö n p a n o e l i n + t ä y t ä n t ö ö n p a n o e l i n t e n + t ä y t ä n t ö ö n p a n o e l i n t ä + t ä y t ä n t ö ö n p a n o h a n k k e i s t a + t ä y t ä n t ö ö n p a n o h a n k k e i t a + t ä y t ä n t ö ö n p a n o i l m o i t u k s i a + t ä y t ä n t ö ö n p a n o j a k s o a + t ä y t ä n t ö ö n p a n o j a k s o n + t ä y t ä n t ö ö n p a n o j ä r j e s t e l m i e n + t ä y t ä n t ö ö n p a n o j ä r j e s t e l m i s s ä + t ä y t ä n t ö ö n p a n o j ä r j e s t e l m i s t ä + t ä y t ä n t ö ö n p a n o j ä r j e s t e l m i ä + t ä y t ä n t ö ö n p a n o j ä r j e s t e l m ä + t ä y t ä n t ö ö n p a n o j ä r j e s t e l m ä n + t ä y t ä n t ö ö n p a n o j ä r j e s t e l m ä s t ä + t ä y t ä n t ö ö n p a n o j ä r j e s t e l m ä ä + t ä y t ä n t ö ö n p a n o j ä r j e s t e l y j e n + t ä y t ä n t ö ö n p a n o j ä r j e s t e l y j ä + t ä y t ä n t ö ö n p a n o j ä r j e s t e l y t + t ä y t ä n t ö ö n p a n o k a p a s i t e e t t i a + t ä y t ä n t ö ö n p a n o k a p a s i t e e t t i i n + t ä y t ä n t ö ö n p a n o k a u d e l l a + t ä y t ä n t ö ö n p a n o k a u d e n + t ä y t ä n t ö ö n p a n o k a u s i + t ä y t ä n t ö ö n p a n o k a u s i a + t ä y t ä n t ö ö n p a n o k a u s i e n + t ä y t ä n t ö ö n p a n o k e h y s + t ä y t ä n t ö ö n p a n o k e h y s t ä + t ä y t ä n t ö ö n p a n o k e i n o i h i n + t ä y t ä n t ö ö n p a n o k e i n o j a + t ä y t ä n t ö ö n p a n o k e i n o t + t ä y t ä n t ö ö n p a n o k e l p o i s e l l a + t ä y t ä n t ö ö n p a n o k e l p o i s e m p a a + t ä y t ä n t ö ö n p a n o k e l p o i s i a + t ä y t ä n t ö ö n p a n o k e r t o m u k s e n + t ä y t ä n t ö ö n p a n o k e r t o m u k s e n s a + t ä y t ä n t ö ö n p a n o k e r t o m u k s e s s a a n + t ä y t ä n t ö ö n p a n o k e r t o m u k s e s t a + t ä y t ä n t ö ö n p a n o k e r t o m u k s e t + t ä y t ä n t ö ö n p a n o k e r t o m u k s i i n + t ä y t ä n t ö ö n p a n o k e r t o m u s + t ä y t ä n t ö ö n p a n o k e r t o m u s t a + t ä y t ä n t ö ö n p a n o k e r t o m u s t e n + t ä y t ä n t ö ö n p a n o k o m i t e a + t ä y t ä n t ö ö n p a n o k o m i t e o i d e n + t ä y t ä n t ö ö n p a n o k o n e i s t o n + t ä y t ä n t ö ö n p a n o k u m p p a n e i d e n + t ä y t ä n t ö ö n p a n o k u m p p a n e i t a + t ä y t ä n t ö ö n p a n o k u m p p a n i t + t ä y t ä n t ö ö n p a n o k u s t a n n u k s e t + t ä y t ä n t ö ö n p a n o k u s t a n n u k s i a + t ä y t ä n t ö ö n p a n o k u s t a n n u k s i k s i + t ä y t ä n t ö ö n p a n o k u s t a n n u k s i s t a + t ä y t ä n t ö ö n p a n o k y n n y s t ä + t ä y t ä n t ö ö n p a n o k y s y m y k s i s s ä + t ä y t ä n t ö ö n p a n o k y s y m y k s i ä + t ä y t ä n t ö ö n p a n o k y s y m y s + t ä y t ä n t ö ö n p a n o k y v y n + t ä y t ä n t ö ö n p a n o k ä y t ä n t ö j ä + t ä y t ä n t ö ö n p a n o l a i n s ä ä d ä n n ö n + t ä y t ä n t ö ö n p a n o l a i n s ä ä d ä n n ö s s ä + t ä y t ä n t ö ö n p a n o l a i n s ä ä d ä n t ö + t ä y t ä n t ö ö n p a n o l a i n s ä ä d ä n t ö ä + t ä y t ä n t ö ö n p a n o l a k e j a + t ä y t ä n t ö ö n p a n o l l e + t ä y t ä n t ö ö n p a n o m a h d o l l i s u u k s i a + t ä y t ä n t ö ö n p a n o m e k a n i s m e j a + t ä y t ä n t ö ö n p a n o m e k a n i s m i + t ä y t ä n t ö ö n p a n o m e k a n i s m i a + t ä y t ä n t ö ö n p a n o m e k a n i s m i n + t ä y t ä n t ö ö n p a n o m e k a n i s m i s t a + t ä y t ä n t ö ö n p a n o m e k a n i s m i t + t ä y t ä n t ö ö n p a n o m e n e t e l m i e n + t ä y t ä n t ö ö n p a n o m e n e t e l m ä + t ä y t ä n t ö ö n p a n o m e n e t e l m ä t + t ä y t ä n t ö ö n p a n o m e n e t t e l y + t ä y t ä n t ö ö n p a n o m e n e t t e l y i d e n + t ä y t ä n t ö ö n p a n o m e n e t t e l y i l l ä + t ä y t ä n t ö ö n p a n o m e n e t t e l y i s s ä + t ä y t ä n t ö ö n p a n o m e n e t t e l y i s t ä + t ä y t ä n t ö ö n p a n o m e n e t t e l y i t ä + t ä y t ä n t ö ö n p a n o m e n e t t e l y j e n + t ä y t ä n t ö ö n p a n o m e n e t t e l y j ä + t ä y t ä n t ö ö n p a n o m e n e t t e l y j ä ä n + t ä y t ä n t ö ö n p a n o m e n e t t e l y l l ä + t ä y t ä n t ö ö n p a n o m e n e t t e l y n + t ä y t ä n t ö ö n p a n o m e n e t t e l y s s ä + t ä y t ä n t ö ö n p a n o m e n e t t e l y s t ä + t ä y t ä n t ö ö n p a n o m e n e t t e l y t + t ä y t ä n t ö ö n p a n o m e n e t t e l y y n + t ä y t ä n t ö ö n p a n o m e n e t t e l y ä + t ä y t ä n t ö ö n p a n o m i e t i n t ö + t ä y t ä n t ö ö n p a n o m u o d o i s t a + t ä y t ä n t ö ö n p a n o m u o t o j a + t ä y t ä n t ö ö n p a n o m ä ä r ä a i k o j e n + t ä y t ä n t ö ö n p a n o m ä ä r ä r a h o j e n + t ä y t ä n t ö ö n p a n o m ä ä r ä y k s e n + t ä y t ä n t ö ö n p a n o m ä ä r ä y k s e s t ä + t ä y t ä n t ö ö n p a n o m ä ä r ä y k s e t + t ä y t ä n t ö ö n p a n o m ä ä r ä y k s i i n + t ä y t ä n t ö ö n p a n o m ä ä r ä y k s i l l e + t ä y t ä n t ö ö n p a n o m ä ä r ä y k s i n + t ä y t ä n t ö ö n p a n o m ä ä r ä y k s i s s ä + t ä y t ä n t ö ö n p a n o m ä ä r ä y k s i s t ä + t ä y t ä n t ö ö n p a n o m ä ä r ä y k s i ä + t ä y t ä n t ö ö n p a n o m ä ä r ä y s + t ä y t ä n t ö ö n p a n o m ä ä r ä y s t e n + t ä y t ä n t ö ö n p a n o m ä ä r ä y s t ä + t ä y t ä n t ö ö n p a n o n + t ä y t ä n t ö ö n p a n o n e u v o s t o + t ä y t ä n t ö ö n p a n o n e u v o s t o n + t ä y t ä n t ö ö n p a n o o n + t ä y t ä n t ö ö n p a n o p a k e t i n + t ä y t ä n t ö ö n p a n o p a k e t t i a + t ä y t ä n t ö ö n p a n o p e r u s t e i t a + t ä y t ä n t ö ö n p a n o p i s t e + t ä y t ä n t ö ö n p a n o p i s t e e n + t ä y t ä n t ö ö n p a n o p o l i t i i k k a + t ä y t ä n t ö ö n p a n o p o n n i s t u k s i s s a + t ä y t ä n t ö ö n p a n o p r o s e s s e j a + t ä y t ä n t ö ö n p a n o p r o s e s s i + t ä y t ä n t ö ö n p a n o p r o s e s s i a + t ä y t ä n t ö ö n p a n o p r o s e s s i i n + t ä y t ä n t ö ö n p a n o p r o s e s s i n + t ä y t ä n t ö ö n p a n o p r o s e s s i s s a + t ä y t ä n t ö ö n p a n o p r o s e s s i s t a + t ä y t ä n t ö ö n p a n o p r o s e s s i t + t ä y t ä n t ö ö n p a n o p ä i v ä l l e + t ä y t ä n t ö ö n p a n o p ä i v ä n + t ä y t ä n t ö ö n p a n o p ä i v ä s t ä + t ä y t ä n t ö ö n p a n o p ä i v ä ä + t ä y t ä n t ö ö n p a n o p ä ä t ö k s e s s ä + t ä y t ä n t ö ö n p a n o p ä ä t ö k s e t + t ä y t ä n t ö ö n p a n o p ä ä t ö k s i ä + t ä y t ä n t ö ö n p a n o p ä ä t ö s + t ä y t ä n t ö ö n p a n o p ä ä t ö s t e n + t ä y t ä n t ö ö n p a n o p ä ä t ö s t ä + t ä y t ä n t ö ö n p a n o p ö y t ä k i r j o j a + t ä y t ä n t ö ö n p a n o r a k e n n e + t ä y t ä n t ö ö n p a n o r a p o r t e i s s a + t ä y t ä n t ö ö n p a n o r a p o r t i n + t ä y t ä n t ö ö n p a n o r a p o r t i s s a + t ä y t ä n t ö ö n p a n o r a p o r t t e j a + t ä y t ä n t ö ö n p a n o r y h m i e n + t ä y t ä n t ö ö n p a n o r y h m ä l t ä + t ä y t ä n t ö ö n p a n o r y h m ä ä + t ä y t ä n t ö ö n p a n o s e l v i t y k s i i n + t ä y t ä n t ö ö n p a n o s o p i m u k s e n + t ä y t ä n t ö ö n p a n o s o p i m u k s e s s a + t ä y t ä n t ö ö n p a n o s o p i m u k s e t + t ä y t ä n t ö ö n p a n o s o p i m u k s i a + t ä y t ä n t ö ö n p a n o s o p i m u k s i s s a + t ä y t ä n t ö ö n p a n o s o p i m u k s i s t a + t ä y t ä n t ö ö n p a n o s o p i m u s t a + t ä y t ä n t ö ö n p a n o s o p i m u s t e n + t ä y t ä n t ö ö n p a n o s s a + t ä y t ä n t ö ö n p a n o s t a + t ä y t ä n t ö ö n p a n o s t a n d a r d i e n + t ä y t ä n t ö ö n p a n o s t a n d a r d i n + t ä y t ä n t ö ö n p a n o s t a n d a r d i t + t ä y t ä n t ö ö n p a n o s t r a t e g i a a + t ä y t ä n t ö ö n p a n o s t r a t e g i a a n n e + t ä y t ä n t ö ö n p a n o s t r a t e g i a n + t ä y t ä n t ö ö n p a n o s t r a t e g i a s t a + t ä y t ä n t ö ö n p a n o s t r a t e g i o i t a + t ä y t ä n t ö ö n p a n o s u o s i t u k s e t + t ä y t ä n t ö ö n p a n o s u u n n i t e l m a + t ä y t ä n t ö ö n p a n o s u u n n i t e l m a a + t ä y t ä n t ö ö n p a n o s u u n n i t e l m a n + t ä y t ä n t ö ö n p a n o s u u n n i t e l m a s s a + t ä y t ä n t ö ö n p a n o s u u n n i t e l m a t + t ä y t ä n t ö ö n p a n o s ä ä d ö k s e k s i + t ä y t ä n t ö ö n p a n o s ä ä d ö k s e l l ä + t ä y t ä n t ö ö n p a n o s ä ä d ö k s e n + t ä y t ä n t ö ö n p a n o s ä ä d ö k s e n ä + t ä y t ä n t ö ö n p a n o s ä ä d ö k s e s s ä + t ä y t ä n t ö ö n p a n o s ä ä d ö k s e s t ä + t ä y t ä n t ö ö n p a n o s ä ä d ö k s e t + t ä y t ä n t ö ö n p a n o s ä ä d ö k s i e n + t ä y t ä n t ö ö n p a n o s ä ä d ö k s i i n + t ä y t ä n t ö ö n p a n o s ä ä d ö k s i l l ä + t ä y t ä n t ö ö n p a n o s ä ä d ö k s i n + t ä y t ä n t ö ö n p a n o s ä ä d ö k s i n ä + t ä y t ä n t ö ö n p a n o s ä ä d ö k s i s t ä + t ä y t ä n t ö ö n p a n o s ä ä d ö k s i s t ä ä n + t ä y t ä n t ö ö n p a n o s ä ä d ö k s i ä + t ä y t ä n t ö ö n p a n o s ä ä d ö s + t ä y t ä n t ö ö n p a n o s ä ä d ö s e h d o t u s t e n + t ä y t ä n t ö ö n p a n o s ä ä d ö s t e n + t ä y t ä n t ö ö n p a n o s ä ä d ö s t ä + t ä y t ä n t ö ö n p a n o s ä ä n n ö i l l ä + t ä y t ä n t ö ö n p a n o s ä ä n n ö i s s ä + t ä y t ä n t ö ö n p a n o s ä ä n n ö i s t ä + t ä y t ä n t ö ö n p a n o s ä ä n n ö k s e l l ä + t ä y t ä n t ö ö n p a n o s ä ä n n ö k s e t + t ä y t ä n t ö ö n p a n o s ä ä n n ö k s i i n + t ä y t ä n t ö ö n p a n o s ä ä n n ö k s i l l ä + t ä y t ä n t ö ö n p a n o s ä ä n n ö k s i s s ä + t ä y t ä n t ö ö n p a n o s ä ä n n ö k s i s t ä + t ä y t ä n t ö ö n p a n o s ä ä n n ö k s i ä + t ä y t ä n t ö ö n p a n o s ä ä n n ö n + t ä y t ä n t ö ö n p a n o s ä ä n n ö s t e n + t ä y t ä n t ö ö n p a n o s ä ä n n ö t + t ä y t ä n t ö ö n p a n o s ä ä n t ö i h i n + t ä y t ä n t ö ö n p a n o s ä ä n t ö j e n + t ä y t ä n t ö ö n p a n o s ä ä n t ö j ä + t ä y t ä n t ö ö n p a n o t a p a + t ä y t ä n t ö ö n p a n o t a p a a + t ä y t ä n t ö ö n p a n o t a r k a s t u k s i s t a + t ä y t ä n t ö ö n p a n o t a s o n + t ä y t ä n t ö ö n p a n o t a s o o n + t ä y t ä n t ö ö n p a n o t a u l u k k o + t ä y t ä n t ö ö n p a n o t a v a n + t ä y t ä n t ö ö n p a n o t a v o i s t a + t ä y t ä n t ö ö n p a n o t a v o i t t e i d e n + t ä y t ä n t ö ö n p a n o t e h t ä v i i n + t ä y t ä n t ö ö n p a n o t e h t ä v i s t ä + t ä y t ä n t ö ö n p a n o t e h t ä v i ä + t ä y t ä n t ö ö n p a n o t e h t ä v ä n + t ä y t ä n t ö ö n p a n o t e h t ä v ä s s ä + t ä y t ä n t ö ö n p a n o t e h t ä v ä ä + t ä y t ä n t ö ö n p a n o t e k s t i e n + t ä y t ä n t ö ö n p a n o t i l a n n e + t ä y t ä n t ö ö n p a n o t i l a n n e t t a + t ä y t ä n t ö ö n p a n o t o i m e a + t ä y t ä n t ö ö n p a n o t o i m e k s i + t ä y t ä n t ö ö n p a n o t o i m e l l a + t ä y t ä n t ö ö n p a n o t o i m e n + t ä y t ä n t ö ö n p a n o t o i m e n a + t ä y t ä n t ö ö n p a n o t o i m e n p i d e + t ä y t ä n t ö ö n p a n o t o i m e n p i d e t t ä + t ä y t ä n t ö ö n p a n o t o i m e n p i t e e k s i + t ä y t ä n t ö ö n p a n o t o i m e n p i t e e m m e + t ä y t ä n t ö ö n p a n o t o i m e n p i t e e n + t ä y t ä n t ö ö n p a n o t o i m e n p i t e e s t ä + t ä y t ä n t ö ö n p a n o t o i m e n p i t e e t + t ä y t ä n t ö ö n p a n o t o i m e n p i t e i d e n + t ä y t ä n t ö ö n p a n o t o i m e n p i t e i k s i + t ä y t ä n t ö ö n p a n o t o i m e n p i t e i l l e + t ä y t ä n t ö ö n p a n o t o i m e n p i t e i l l ä + t ä y t ä n t ö ö n p a n o t o i m e n p i t e i n ä + t ä y t ä n t ö ö n p a n o t o i m e n p i t e i s i i n + t ä y t ä n t ö ö n p a n o t o i m e n p i t e i s s ä + t ä y t ä n t ö ö n p a n o t o i m e n p i t e i s t ä + t ä y t ä n t ö ö n p a n o t o i m e n p i t e i t ä + t ä y t ä n t ö ö n p a n o t o i m e t + t ä y t ä n t ö ö n p a n o t o i m i + t ä y t ä n t ö ö n p a n o t o i m i a + t ä y t ä n t ö ö n p a n o t o i m i e h d o t u k s e s t a + t ä y t ä n t ö ö n p a n o t o i m i e h d o t u k s i s t a + t ä y t ä n t ö ö n p a n o t o i m i e n + t ä y t ä n t ö ö n p a n o t o i m i i n + t ä y t ä n t ö ö n p a n o t o i m i k s i + t ä y t ä n t ö ö n p a n o t o i m i n + t ä y t ä n t ö ö n p a n o t o i m i n n a n + t ä y t ä n t ö ö n p a n o t o i m i s s a + t ä y t ä n t ö ö n p a n o t o i m i s s a a n + t ä y t ä n t ö ö n p a n o t o i m i s t a + t ä y t ä n t ö ö n p a n o t o i m i s t a a n + t ä y t ä n t ö ö n p a n o t o i m i s t o n + t ä y t ä n t ö ö n p a n o t o i m i v a l t a a n + t ä y t ä n t ö ö n p a n o t y ö + t ä y t ä n t ö ö n p a n o t y ö n + t ä y t ä n t ö ö n p a n o t y ö s s ä ä n + t ä y t ä n t ö ö n p a n o t y ö t ä + t ä y t ä n t ö ö n p a n o v a i h e + t ä y t ä n t ö ö n p a n o v a i h e e n + t ä y t ä n t ö ö n p a n o v a i h e e s e e n + t ä y t ä n t ö ö n p a n o v a i h e e s s a + t ä y t ä n t ö ö n p a n o v a i h e e s s a a n + t ä y t ä n t ö ö n p a n o v a i h e t t a + t ä y t ä n t ö ö n p a n o v a i h t o e h d o t + t ä y t ä n t ö ö n p a n o v a i k e u k s i a + t ä y t ä n t ö ö n p a n o v a j e + t ä y t ä n t ö ö n p a n o v a j e e n + t ä y t ä n t ö ö n p a n o v a j e t t a + t ä y t ä n t ö ö n p a n o v a l l a n + t ä y t ä n t ö ö n p a n o v a l l a s t a + t ä y t ä n t ö ö n p a n o v a l m i s + t ä y t ä n t ö ö n p a n o v a l m i u d e n + t ä y t ä n t ö ö n p a n o v a l m i u d e t + t ä y t ä n t ö ö n p a n o v a l m i u k s i a + t ä y t ä n t ö ö n p a n o v a l m i u s + t ä y t ä n t ö ö n p a n o v a l t a + t ä y t ä n t ö ö n p a n o v a l t a a + t ä y t ä n t ö ö n p a n o v a l t a a n + t ä y t ä n t ö ö n p a n o v a l t a a n s a + t ä y t ä n t ö ö n p a n o v a l t a n s a + t ä y t ä n t ö ö n p a n o v a l t i o + t ä y t ä n t ö ö n p a n o v a l t i o n + t ä y t ä n t ö ö n p a n o v a l t i o s s a + t ä y t ä n t ö ö n p a n o v a l t o j a + t ä y t ä n t ö ö n p a n o v a l t u u d e t + t ä y t ä n t ö ö n p a n o v a l t u u k s i a + t ä y t ä n t ö ö n p a n o v a l t u u k s i a m m e + t ä y t ä n t ö ö n p a n o v a l t u u k s i e n + t ä y t ä n t ö ö n p a n o v a l t u u k s i s t a + t ä y t ä n t ö ö n p a n o v a l t u u t e n s a + t ä y t ä n t ö ö n p a n o v a p a u t u s t a + t ä y t ä n t ö ö n p a n o v a u h t i + t ä y t ä n t ö ö n p a n o v i i p e i t ä + t ä y t ä n t ö ö n p a n o v i r a n o m a i n e n + t ä y t ä n t ö ö n p a n o v i r a n o m a i s e t + t ä y t ä n t ö ö n p a n o v i r a n o m a i s i a + t ä y t ä n t ö ö n p a n o v i r a n o m a i s t a a n + t ä y t ä n t ö ö n p a n o v i r a n o m a i s t e n + t ä y t ä n t ö ö n p a n o v i r a s t o i l l e + t ä y t ä n t ö ö n p a n o v i r a s t o i s t a + t ä y t ä n t ö ö n p a n o v i r a s t o j e n + t ä y t ä n t ö ö n p a n o v i r a s t o n + t ä y t ä n t ö ö n p a n o v i r h e i t ä + t ä y t ä n t ö ö n p a n o v u o t t a + t ä y t ä n t ö ö n p a n o v ä l i n e + t ä y t ä n t ö ö n p a n o v ä l i n e e t + t ä y t ä n t ö ö n p a n o v ä l i n e i d e n + t ä y t ä n t ö ö n p a n o v ä l i n e i l l ä + t ä y t ä n t ö ö n p a n o v ä l i n e i n ä + t ä y t ä n t ö ö n p a n o v ä l i n e i t ä + t ä y t ä n t ö ö n p a n o v ä l i n e t t ä + t ä y t ä n t ö ö n p a n o y h t e i s t y ö + t ä y t ä n t ö ö n p a n o y k s i k ö i s t ä + t ä y t ä n t ö ö n p a n t a v a k s i + t ä y t ä n t ö ö n p a n t a v a s s a + t ä y t ä n t ö ö n p a n t a v i s s a + t ä y t ä n t ö ö n p a n t u n a + t ä y t ö n + t ä ä l l ä k i n + t ö i d e n + t ö i d e n s ä + t ö i h i n + t ö i k s e e n + t ö i l l e + t ö i s s ä + t ö i s t ä + t ö i s t ä ä n + t ö i t ä + t ö l k k i m e h u u n + t ö l k k i p a n t i n + t ö l k k i p a n t i s t a + t ö l k k i p a n t t i j ä r j e s t e l m i ä + t ö l k k i t o n n i k a l a + t ö l k k i t o n n i k a l a n + t ö l k k i t o n n i k a l a s t a + t ö n ä i s e e + t ö p i n ä k s i + t ö p ö h e l t t a o t s a + t ö p ö h ä n t ä + t ö p ö k e r t t u n e n + t ö p ö k u r p a t + t ö p ö k u r p p a + t ö p ö m u u r a + t ö p ö p e i p p o + t ö p ö p e i p p o l e s k i + t ö r k e i m p i i n + t ö r k e i s t ä + t ö r k e ä l l e + t ö r k e ä s t ä + t ö r k e ä ä + t ö r k e ä ä n + t ö r k y d i r e k t i i v i + t ö r m ä i l y a u t o t + t ö r m ä i s i + t ö r m ä p ä ä s k y + t ö r m ä t t y ä ä n + t ö r m ä t ä + t ö r m ä y k s e n e s t o j ä r j e s t e l m i i n + t ö r m ä y k s e n e s t o j ä r j e s t e l m ä + t ö r m ä y s k o k e e n a + t ö r m ä y s k r a a t t e r i + t ö r m ä y s k u r s s i + t ö r m ä y s k u r s s i l l a + t ö r m ä y s k u r s s i l l e + t ö r m ä y s n o p e u k s i a + t ö r m ä y s t e s t e i h i n + t ö r m ä y s t e s t e i l l ä + t ö r m ä y s t e s t i + t ö r m ä y s t e s t i n + t ö r m ä y s t e s t i t + t ö r m ä y s v o i t t o + t ö r m ä ä m m e + t ö r m ä ä m ä t t ä + t ö r m ä ä v ä t + t ö r m ä ä v ä ä + t ö r s ä ä m i n e n + t ö y h t ö h a r a k a t + t ö y h t ö h a r a k k a k y y h k y + t ö y h t ö h e l m i k a n a + t ö y h t ö h u p p u b u l b u l i + t ö y h t ö h y y p p ä + t ö y h t ö i i b i s + t ö y h t ö k a p u s i i n i a p i n a + t ö y h t ö k e t s a a l i + t ö y h t ö k i u r u + t ö y h t ö k o t k a + t ö y h t ö k ä ä p i ö a h v e n + t ö y h t ö l i n t u h a u k k a + t ö y h t ö l o i s t o h i p p i ä i n e n + t ö y h t ö l u n n i + t ö y h t ö m a i n a + t ö y h t ö m e r i m e t s o + t ö y h t ö n a p s i j a t + t ö y h t ö p a r a t i i s i m o n a r k k i + t ö y h t ö p i i k k i p y r s t ö + t ö y h t ö p i n g v i i n i t + t ö y h t ö p ö l l ö + t ö y h t ö s a r v i h a i + t ö y h t ö s i e p p a r i + t ö y h t ö t i a i n e n + t ö y h t ö t i i r a + t ö y h t ö t i k k a + t ö y h t ö t i n a m i + t ö y h t ö v i h e l t ä j ä + t ö y h t ö v i h e r k a i j a + t š a d i l a i s d e m o k r a a t e i l l e + t š a d i l a i s k a p i n a l l i s t e n + t š a d i l a i s p o l i i t i k k o j a + t š a m o r r o t + t š e k i l l e + t š e k i n + t š e k i n k i e l i s e n + t š e k i n m a a + t š e k i s s ä + t š e k i s t ä + t š e k k e i h i n + t š e k k i i n + t š e k k i l ä i s e l t ä + t š e k k i l ä i s e n + t š e k k i l ä i s e t + t š e k k i l ä i s h i s t o r i o i t s i j o i l t a + t š e k k i l ä i s i l l e + t š e k k i l ä i s k a a r t i + t š e k k i l ä i s p u h e e n j o h t a j a n + t š e k k i l ä i s t e n + t š e k k i l ä i s y s t ä v i e m m e + t š e k k i ä + t š e t š e e n e i s t ä + t š e t š e e n i k a n s a n + t š e t š e e n i l a p s e n + t š e t š e e n i l a s t a + t š e t š e e n i p a k o l a i s e t + t š e t š e e n i p a k o l a i s i a + t š e t š e e n i p a k o l a i s l a p s e l l e + t š e t š e e n i p a k o l a i s t e n + t š e t š e e n i p e r h e e n + t š e t š e e n i p o l i i t i k o n + t š e t š e e n i s i s s i e n + t š e t š e e n i t a i s t e l i j a t + t š e t š e e n i t e r r o r i s t e i l l a + t š e t š e e n i t e r r o r i s t e i s t a + t š e t š e e n i v ä e s t ö s t ä + t š e t š e e n i y h t e i s ö ö n + t š u v a s s i t + u d m u r t i t + u f o a a l t o + u f o h u i j a u s + u f o s i e p p a u s + u f o t a p a u s + u f o u s k o n t o + u h a n a l a i s e m p i a + u h a n a l a i s i a + u h a n a l a i s i i n + u h a n a l a i s i l l a + u h a n a l a i s i m m a t + u h a n a l a i s i m m i l l e + u h a n a l a i s i m m i s t a + u h a n a l a i s i m p i a + u h a n a l a i s i s t a + u h a n a l a i s t e n + u h a t a + u h a t a a n + u h a t e s s a + u h a t t a v a + u h a t t i i n + u h a t t u a + u h a t t u i n a + u h a t t u j a + u h a t t u j e n + u h a t t u n a + u h a t u i k s i + u h a t u i m m a s s a + u h a t u i m m i s t a + u h a t u i m p i n a + u h a t u i n + u h a t u i s t a + u h a t u k s i + u h a t u m p i a + u h a t u t + u h k a a k i n + u h k a a k o + u h k a a m a + u h k a a m a t t a + u h k a a m i n e n + u h k a a m i s e s t a + u h k a a m m e + u h k a a m m e k o + u h k a a n + u h k a a t t e + u h k a a v a a + u h k a a v a k s i + u h k a a v a m m i k s i + u h k a a v a m p i + u h k a a v a m p i a + u h k a a v a n + u h k a a v a s s a + u h k a a v a t + u h k a a v i l t a + u h k a a v i m m a n + u h k a a v i m m i s t a + u h k a a v i m p i e n + u h k a a v i m p i i n + u h k a a v i n a + u h k a i l e m a t t a + u h k a i l e m m e + u h k a i l e v a t + u h k a i l l a + u h k a i l l a a n + u h k a i l l a k s e e n + u h k a i l t i i n + u h k a i l u i l l e + u h k a i l u j a + u h k a i l u j e n + u h k a i l u k i r j e e n + u h k a i l u t + u h k a i l u t a k t i i k a l l e + u h k a i l u t a k t i i k k a + u h k a i l u y r i t y k s i ä + u h k a i l u y r i t y s + u h k a i s i + u h k a k i r j e i t ä + u h k a k u v a + u h k a k u v a a + u h k a k u v a n + u h k a k u v a t + u h k a k u v i a + u h k a k u v i e n + u h k a k u v i i n + u h k a k u v i s t a + u h k a l t a + u h k a n + u h k a n a + u h k a n a a n + u h k a p e l i h a l u n + u h k a p e l i h a n k e + u h k a p e l i h u o n e i s t o i l l e + u h k a p e l i m a i n o n n a n + u h k a p e l i m a i n o s t e n + u h k a p e l i m a r k k i n o i t a + u h k a p e l i n + u h k a p e l i r e n k a a t + u h k a p e l i s s ä + u h k a p e l i t + u h k a p e l i t e o l l i s u u t t a + u h k a p e l i ä + u h k a p o t e n t i a a l i n + u h k a r o h k e a m p a a + u h k a s a k k o + u h k a s a k k o i n e e n + u h k a s i + u h k a s t a + u h k a t a s o a + u h k a t a s o n + u h k a t e k i j ä + u h k a t e k i j ä t + u h k a t e k i j ö i h i n + u h k a t e k i j ö i n e e n + u h k a t e k i j ö i t ä + u h k a t i l a n t e i s s a + u h k a u k s e t + u h k a u k s i a + u h k a u k s i k s i + u h k a u k s i l l a + u h k a u k s i l t a + u h k a u k s i s t a + u h k a u s k i r j e i t ä + u h k a u s v i d e o i t a + u h k i a + u h k i e n + u h k i i n + u h k i n e e n + u h k i s t a + u h m a a m i s t a + u h m a a v a t + u h m a i s i v a t + u h m a t e s s a a n + u h r a a m a t t a + u h r a a m i s t a + u h r a i s i t t e + u h r a n n u t + u h r a t a + u h r a t a a n + u h r a t a k s e e n + u h r a t k a a m m e + u h r a u k s i a + u h r a u k s i i n + u h r a u t u e n + u h r a u t u m i n e n + u h r a u t u m i s e s t a a n + u h r a u t u v a n + u h r a u t u v i m p i n a + u h r e i h i n + u h r e i h i n s a + u h r e i k s i + u h r e i l l e + u h r e i l t a a n + u h r e i n a + u h r e i s t a + u h r e j a + u h r i a + u h r i a a n + u h r i a j a t t e l u a + u h r i a j a t t e l u l l a + u h r i e n + u h r i j u h l a + u h r i k e s k e i n e n + u h r i k s i + u h r i l a m p a a t + u h r i l l e + u h r i l u e t t e l o j a + u h r i l ä h t ö i n e n + u h r i m e t a l l i + u h r i n + u h r i n a + u h r i n s a + u h r i p a k e t t i a + u h r i p a r k o j a + u h r i r y h m i s t ä + u h r i s t a + u h r i t + u h r i t a a k a n + u h r i t k a a n + u i g u u r e i l l e + u i g u u r e i s t a + u i g u u r i a l u e e n + u i g u u r i e n + u i g u u r i k a n s a n + u i g u u r i k o n g r e s s i + u i g u u r i s e p a r a t i s t i t + u i g u u r i s e p a r i s t i e n + u i g u u r i t + u i g u u r i v a n g i t + u i g u u r i v ä e s t ö + u i g u u r i v ä e s t ö n + u i g u u r i v ä e s t ö ö n + u i g u u r i v ä h e m m i s t ö n + u i g u u r i y h t e i s ö n + u i m a h a l l e i h i n + u i m a h a l l e j a + u i m a h a l l i + u i m a h o u s u i s s a + u i m a k a u t t a + u i m a k e l p o i s i k s i + u i m a k e l p o i s t a + u i m a k o h t e i s i i n + u i m a p a i k a l l a + u i m a p u k u a + u i m a r a k k o + u i m a r a n n a k s i + u i m a r a n n a n + u i m a r a n n o i l l a + u i m a r a n n o i l l e + u i m a r a n t a + u i m a r a n t a a + u i m a r a n t o j a + u i m a r a n t o j e n + u i m a s t a d i o n + u i m a t a i t o + u i m a v e d e l l e + u i m a v e d e n + u i m a v e d e t + u i m a v e s i + u i m a v e s i a l u e i d e n + u i m a v e s i a l u e i t a + u i m a v e s i a l u e t t a + u i m a v e s i d i r e k t i i v i + u i m a v e s i d i r e k t i i v i k s i + u i m a v e s i d i r e k t i i v i n + u i m a v e s i d i r e k t i i v i s s ä + u i m a v e s i d i r e k t i i v i s t ä + u i m a v e s i d i r e k t i i v i ä + u i m a v e s i e n + u i m a v e s i k s i + u i m a v e s i l l e m m e + u i m a v e s i l u o k i t u s t a + u i m a v e s i m i t t a u k s i i n + u i m a v e s i p r o f i i l i i n + u i m a v e s i s t ä + u i m a v e s i s t ä m m e + u i m a v e s i ä + u i m a v e t e e n + u i m a v e t t ä + u i m i s e e n + u i n t i k a u d e l l a + u i n t i k a u s i + u i n t i k i e l l o n + u i n u v a t + u i s t i n v i t a + u i t t a m i s e e n + u i t t o r ä n n i + u j u t t a a + u j u t t a m i s t a + u k k o e t a n a + u k k o l a u k k a + u k k o m a n s i k k a + u k k o n u i j a p i s t i ä i n e n + u k k o s e n j o h d a t i n + u k k o s p i l v i ä + u k o n h a t t u + u k o n k a u r a + u k o n k e l l o + u k o n k u u k u n e n + u k o n p a l k o + u k o n s i e n i + u k o n t a t a r + u k o n t u l i k u k k a + u k r a i n a a + u k r a i n a a n + u k r a i n a l a i s e n + u k r a i n a l a i s e t + u k r a i n a l a i s i a + u k r a i n a l a i s i l l e + u k r a i n a l a i s y h t e i s ö + u k r a i n a l l a + u k r a i n a l l e + u k r a i n a n + u k r a i n a s s a + u k r a i n a s s a k i n + u k r a i n a s t a + u l a p p a k e i j u + u l a p p a k e i j u t + u l a p p a m e r i m e t s o + u l k o a s i a i n + u l k o a s i a i n h a l l i n n o i s t a + u l k o a s i a i n h a l l i n n o l l a + u l k o a s i a i n h a l l i n n o l l e + u l k o a s i a i n h a l l i n n o n + u l k o a s i a i n h a l l i n n o s t a + u l k o a s i a i n h a l l i n n o s t a m m e + u l k o a s i a i n h a l l i n n o t + u l k o a s i a i n h a l l i n t o + u l k o a s i a i n h a l l i n t o a + u l k o a s i a i n h a l l i n t o j e n + u l k o a s i a i n k o m i t e a n + u l k o a s i a i n m i n i s t e r e i d e n + u l k o a s i a i n m i n i s t e r e i l l e + u l k o a s i a i n m i n i s t e r e i s t ä + u l k o a s i a i n m i n i s t e r e i t ä + u l k o a s i a i n m i n i s t e r i + u l k o a s i a i n m i n i s t e r i e m m e + u l k o a s i a i n m i n i s t e r i e n + u l k o a s i a i n m i n i s t e r i i n + u l k o a s i a i n m i n i s t e r i k o k o u k s i i n + u l k o a s i a i n m i n i s t e r i l l e + u l k o a s i a i n m i n i s t e r i m m e + u l k o a s i a i n m i n i s t e r i n + u l k o a s i a i n m i n i s t e r i n s ä + u l k o a s i a i n m i n i s t e r i n ä + u l k o a s i a i n m i n i s t e r i s t ä + u l k o a s i a i n m i n i s t e r i t + u l k o a s i a i n m i n i s t e r i ä + u l k o a s i a i n m i n i s t e r i ä m m e + u l k o a s i a i n m i n i s t e r i ö + u l k o a s i a i n m i n i s t e r i ö i d e n + u l k o a s i a i n m i n i s t e r i ö i l l e + u l k o a s i a i n m i n i s t e r i ö l l e + u l k o a s i a i n m i n i s t e r i ö n + u l k o a s i a i n m i n i s t e r i ö s s ä + u l k o a s i a i n m i n i s t e r i ö t ä + u l k o a s i a i n n e u v o s t o + u l k o a s i a i n n e u v o s t o a + u l k o a s i a i n n e u v o s t o l l e + u l k o a s i a i n n e u v o s t o l t a + u l k o a s i a i n n e u v o s t o n + u l k o a s i a i n n e u v o s t o s s a + u l k o a s i a i n o s a s t o + u l k o a s i a i n v a l i o k u n n a l l a + u l k o a s i a i n v a l i o k u n n a l l a m m e + u l k o a s i a i n v a l i o k u n n a l l e + u l k o a s i a i n v a l i o k u n n a l t a + u l k o a s i a i n v a l i o k u n n a n + u l k o a s i a i n v a l i o k u n n a s s a + u l k o a s i a i n v a l i o k u n n a s s a n n e + u l k o a s i a i n v a l i o k u n n a s t a + u l k o a s i a i n v a l i o k u n t a + u l k o a s i a i n v a l i o k u n t a a + u l k o a s i a i n v a l i o k u n t a a n + u l k o a s i a i n v a l i o k u n t a m m e + u l k o a s i a i n v a l i o k u n t a n n e + u l k o a s i a i n v a l i o k u n t i e n + u l k o a s i a n h a l l i n t o a + u l k o a s i a n m i n i s t e r e i d e n + u l k o a s i a n m i n i s t e r e i t ä + u l k o a s i a n m i n i s t e r i + u l k o a s i a n m i n i s t e r i n + u l k o a s i a n m i n i s t e r i ä + u l k o a s i a n n e u v o s t o n + u l k o a s i a n v a l i o k u n n a n + u l k o a s i a n v a l i o k u n n a s s a + u l k o a s i a n v a l i o k u n t a + u l k o a s i a n v a l i o k u n t a a n + u l k o a s i a t + u l k o a s i a v a l i o k u n n a l l e + u l k o a s i a v a l i o k u n n a n + u l k o a s i o i d e n + u l k o a s i o i h i n + u l k o a s i o i k s i + u l k o a s i o i s s a + u l k o a s i o i s t a + u l k o a s i o i t a + u l k o a v a r u u d e n + u l k o a v a r u u d e s s a + u l k o a v a r u u t t a + u l k o e u r o o p p a l a i s e n + u l k o e u r o o p p a l a i s i i n + u l k o e u r o o p p a l a i s i n + u l k o i k k u n a t + u l k o i l m a h a u t a u s m a a n + u l k o i l m a h a u t a u s m a i t a + u l k o i l m a m a a l a u s + u l k o i l m a m a r k k i n a + u l k o i l m a m u s e o + u l k o i l m a m u s e o n + u l k o i l m a n + u l k o i l m a s s a + u l k o i l m a t y ö n + u l k o i l m a v a n k i l a + u l k o i l m a v a n k i l o i t a + u l k o i l u h a n k k e i s t a + u l k o i s e e n + u l k o i s e l l a + u l k o i s e n + u l k o i s e s s a + u l k o i s e s t a + u l k o i s e t + u l k o i s i a + u l k o i s i i n + u l k o i s i l l a + u l k o i s i l l e + u l k o i s i l t a + u l k o i s i s s a + u l k o i s i s t a + u l k o i s t a m a a n + u l k o i s t a m a l l a + u l k o i s t a m i n e n + u l k o i s t a m i s e e n + u l k o i s t a m i s e k s i + u l k o i s t a m i s j ä r j e s t e l y i s t ä + u l k o i s t a m i s m a h d o l l i s u u k s i e n + u l k o i s t a m i s p o l i t i i k k a a + u l k o i s t a m i s s o p i m u k s i a + u l k o i s t a m i s s u u n t a u k s i i n + u l k o i s t a m i s s u u n t a u s + u l k o i s t a v a t + u l k o i s t e n + u l k o i s t e t t a v a + u l k o k a n o j e n + u l k o k a u p a s t a + u l k o k a u p p a s u h t e i d e n + u l k o k e h ä + u l k o k o r v a + u l k o k o r v a n + u l k o k u l m a + u l k o k u l t a i s e n a + u l k o k u l t a i s u u t e e n + u l k o k u o r e n + u l k o k u o r e s t a + u l k o m a a i l m a + u l k o m a a i l m a a + u l k o m a a i l m a a n + u l k o m a a i l m a l l e + u l k o m a a i l m a l t a + u l k o m a a i l m a n + u l k o m a a i l m a s s a + u l k o m a a i l m a s t a + u l k o m a a i l m a s t a a n + u l k o m a a k a u p p a + u l k o m a a l a i s e l l e + u l k o m a a l a i s e t + u l k o m a a l a i s i a + u l k o m a a l a i s i i n + u l k o m a a l a i s i l l e + u l k o m a a l a i s i n v a a s i o t a + u l k o m a a l a i s i s t a + u l k o m a a l a i s k e s k u k s e e n + u l k o m a a l a i s l a i n + u l k o m a a l a i s l a i n s ä ä d ä n n ö n + u l k o m a a l a i s l a k i + u l k o m a a l a i s l a k i a + u l k o m a a l a i s l a k i e n + u l k o m a a l a i s p o l i t i i k a s s a + u l k o m a a l a i s p o l i t i i k a s t a + u l k o m a a l a i s p o l i t i i k k a + u l k o m a a l a i s p o l i t i i k k a a n s a + u l k o m a a l a i s s i a k s i + u l k o m a a l a i s t a + u l k o m a a l a i s t e n + u l k o m a a l a i s u u t e n s a + u l k o m a a l a i s v e t o i s i a + u l k o m a a l a i s v i r a n o m a i n e n + u l k o m a a l a i s v i r a s t o n + u l k o m a a l a i s y h t e i s ö t + u l k o m a a n + u l k o m a a n a p u + u l k o m a a n a p u a + u l k o m a a n a p u u n + u l k o m a a n a v u n + u l k o m a a n a v u s t a + u l k o m a a n e d u s t a j i e n + u l k o m a a n e d u s t u k s e m m e + u l k o m a a n e d u s t u k s e n + u l k o m a a n e d u s t u k s e s t a + u l k o m a a n e d u s t u k s e s t a m m e + u l k o m a a n e d u s t u k s i a m m e + u l k o m a a n e d u s t u s + u l k o m a a n e d u s t u s t a + u l k o m a a n e d u s t u s t o j a + u l k o m a a n e d u s t u s t o j e n + u l k o m a a n i n v e s t o i n t i + u l k o m a a n k a u p a l l a + u l k o m a a n k a u p a l l e + u l k o m a a n k a u p a n + u l k o m a a n k a u p a s s a + u l k o m a a n k a u p a s t a + u l k o m a a n k a u p a s t a m m e + u l k o m a a n k a u p p a + u l k o m a a n k a u p p a a + u l k o m a a n k a u p p a a n + u l k o m a a n k a u p p a a n s a + u l k o m a a n k a u p p a m i n i s t e r i e n + u l k o m a a n k a u p p a m i n i s t e r i n + u l k o m a a n k a u p p a m i n i s t e r i t + u l k o m a a n k a u p p a m i n i s t e r i ö i d e n + u l k o m a a n k a u p p a m i n i s t e r i ö n + u l k o m a a n k a u p p a m m e + u l k o m a a n k a u p p a p o l i i t i k k o + u l k o m a a n k a u p p a p o l i t i i k a l l a + u l k o m a a n k a u p p a p o l i t i i k a l l e + u l k o m a a n k a u p p a p o l i t i i k a n + u l k o m a a n k a u p p a p o l i t i i k a s s a + u l k o m a a n k a u p p a p o l i t i i k a s t a + u l k o m a a n k a u p p a p o l i t i i k k a + u l k o m a a n k a u p p a p o l i t i i k k a a + u l k o m a a n k a u p p a p o l i t i i k k a a n + u l k o m a a n k a u p p a p o l i t i i k k a a n s a + u l k o m a a n k a u p p a s o p i m u k s i i n + u l k o m a a n k a u p p a s t r a t e g i a a + u l k o m a a n k a u p p a t a s e e n a + u l k o m a a n k a u p p a t a s e t t a + u l k o m a a n k a u p p a t i l a s t o i s s a + u l k o m a a n k a u p p a v a l i o k u n t a + u l k o m a a n k i r j e e n v a i h t a j a + u l k o m a a n k i r j e e n v a i h t a j a n + u l k o m a a n k o r v a u k s e n + u l k o m a a n k o r v a u s + u l k o m a a n k o r v a u s t a + u l k o m a a n l i s ä ä + u l k o m a a n l o m a i l i j o i k s i + u l k o m a a n l u o t t o + u l k o m a a n l ä h e t y s t ö i h i n + u l k o m a a n l ä h e t y s t ö j e n + u l k o m a a n m a k s u i s t a + u l k o m a a n m a k s u j e n + u l k o m a a n m a r k k i n o i d e n + u l k o m a a n m a r k k i n o i h i n + u l k o m a a n m a r k k i n o i l l a + u l k o m a a n m a r k k i n o i l l e + u l k o m a a n m a r k k i n o i l t a + u l k o m a a n m a r k k i n o i t a + u l k o m a a n m a t k a i l u l l e + u l k o m a a n m a t k a l t a + u l k o m a a n m a t k a n + u l k o m a a n m a t k a n s a + u l k o m a a n m a t k o i h i n + u l k o m a a n m a t k o i l l a + u l k o m a a n m a t k o i s t a + u l k o m a a n m a t k o j a + u l k o m a a n m e n o j a + u l k o m a a n o p e r a a t i o i d e n + u l k o m a a n o p e r a a t i o i s t a + u l k o m a a n o p i n t o n s a + u l k o m a a n p a l v e l u l l a + u l k o m a a n p o l i t i i k a n + u l k o m a a n p o l i t i i k k a a + u l k o m a a n p o l i t i i k k a m m e + u l k o m a a n p o l i t i i k k o j a + u l k o m a a n p o s t i n + u l k o m a a n p o s t i p a l v e l u j a + u l k o m a a n p u h e l u i d e n + u l k o m a a n s e i k k a i l u u n + u l k o m a a n s u h t e i s t a + u l k o m a a n s u h t e i t a + u l k o m a a n v a i h t o + u l k o m a a n v a l u u t a n + u l k o m a a n v a l u u t t a a + u l k o m a a n v a l u u t t a t u l o t + u l k o m a a n v a l u u t t a v a r a n t o i h i n + u l k o m a a n v e l a n + u l k o m a a n v e l a s t a + u l k o m a a n v e l a t + u l k o m a a n v e l k a + u l k o m a a n v e l k a a + u l k o m a a n v e l k a a n + u l k o m a a n v e l k a a n s a + u l k o m a a n v e l k a k y s y m y k s e n + u l k o m a a n v e l k a o n g e l m a a n + u l k o m a a n v e l k a o n g e l m i a + u l k o m a a n v e l k a v a r k a u d e n + u l k o m a a n v e l k o j e n + u l k o m a a n v e l o i s t a + u l k o m a a n v i e r a i l u a + u l k o m a a n v i e r a i l u i s t a + u l k o m a a n v i e r a i l u l l a + u l k o m a a n v i e r a i l u n s a + u l k o m a a n v i e r a i l u t + u l k o m a a t + u l k o m a i d e n + u l k o m a i h i n + u l k o m a i l l a + u l k o m a i l l a k i n + u l k o m a i l l e + u l k o m a i l t a + u l k o m a i n o k s i a + u l k o m a i n o n t a a n + u l k o m a i s e e n + u l k o m a i s e k s i + u l k o m a i s e n + u l k o m a i s e s s a + u l k o m a i s e t + u l k o m a i s i a + u l k o m a i s i i n + u l k o m a i s i l l e + u l k o m a i s i l t a + u l k o m a i s i s s a + u l k o m a i s i s t a + u l k o m a i s t a + u l k o m a i s t e n + u l k o m a r k k i n o i d e n + u l k o m a r k k i n o i l l a + u l k o m a r k k i n o i l l a k i n + u l k o m a r k k i n o i l l e + u l k o m a r k k i n o i t a + u l k o m e l u u n + u l k o m i n i s t e r e i d e n + u l k o m i n i s t e r e i h i n + u l k o m i n i s t e r e i l l e + u l k o m i n i s t e r e i l l ä m m e + u l k o m i n i s t e r e i l t ä + u l k o m i n i s t e r e i l t ä m m e + u l k o m i n i s t e r e i s t ä + u l k o m i n i s t e r e i s t ä m m e + u l k o m i n i s t e r e i t ä + u l k o m i n i s t e r e i t ä ä n + u l k o m i n i s t e r e j ä + u l k o m i n i s t e r i + u l k o m i n i s t e r i e m m e + u l k o m i n i s t e r i e n + u l k o m i n i s t e r i i m m e + u l k o m i n i s t e r i i n + u l k o m i n i s t e r i k o k o u k s e n + u l k o m i n i s t e r i k o k o u k s e s s a + u l k o m i n i s t e r i k o k o u s + u l k o m i n i s t e r i k o k o u s t a + u l k o m i n i s t e r i k o k o u s t e n + u l k o m i n i s t e r i k o l l e g a a + u l k o m i n i s t e r i k o n f e r e n s s i n + u l k o m i n i s t e r i k s i + u l k o m i n i s t e r i k y s y m y k s e s s ä + u l k o m i n i s t e r i k y s y m y s + u l k o m i n i s t e r i l l e + u l k o m i n i s t e r i l l e e n + u l k o m i n i s t e r i l l ä + u l k o m i n i s t e r i l t ä + u l k o m i n i s t e r i l t ä n n e + u l k o m i n i s t e r i m m e + u l k o m i n i s t e r i n + u l k o m i n i s t e r i n e u v o s t o + u l k o m i n i s t e r i n e u v o s t o a + u l k o m i n i s t e r i n e u v o s t o l l e + u l k o m i n i s t e r i n e u v o s t o n + u l k o m i n i s t e r i n n e + u l k o m i n i s t e r i n s ä + u l k o m i n i s t e r i n ä + u l k o m i n i s t e r i p ä i v ä l l i s i i n + u l k o m i n i s t e r i s t ä + u l k o m i n i s t e r i s t ä n n e + u l k o m i n i s t e r i t + u l k o m i n i s t e r i t a p a a m i s e n + u l k o m i n i s t e r i t a p a a m i s e s s a + u l k o m i n i s t e r i t a p a a m i s e t + u l k o m i n i s t e r i t a s o l l a + u l k o m i n i s t e r i t a s o n + u l k o m i n i s t e r i t r o i k a n + u l k o m i n i s t e r i t r o i k k a + u l k o m i n i s t e r i ä + u l k o m i n i s t e r i ö + u l k o m i n i s t e r i ö i d e n + u l k o m i n i s t e r i ö i d e n s ä + u l k o m i n i s t e r i ö i l l e + u l k o m i n i s t e r i ö i s s ä + u l k o m i n i s t e r i ö l l e + u l k o m i n i s t e r i ö l t ä + u l k o m i n i s t e r i ö n + u l k o m i n i s t e r i ö n i + u l k o m i n i s t e r i ö n s ä + u l k o m i n i s t e r i ö s s ä + u l k o m i n i s t e r i ö s t ä + u l k o m i n i s t e r i ö t ä + u l k o m i n i s t e r i ö ö n + u l k o m u s e o + u l k o m u s e o k s i + u l k o m u s e o s s a + u l k o m u s e o t a + u l k o n ä k ö + u l k o n ä k ö ä + u l k o n ä ö l t ä ä n + u l k o n ä ö n + u l k o p a r l a m e n t a a r i s e n + u l k o p a r l a m e n t a a r i s i a + u l k o p a r l a m e n t a r i s m i + u l k o p i n n a n + u l k o p l a n e e t t a + u l k o p o l i i t i k k o n a + u l k o p o l i i t t i n e n + u l k o p o l i i t t i s e e n + u l k o p o l i i t t i s e k s i + u l k o p o l i i t t i s e l l e + u l k o p o l i i t t i s e l t a + u l k o p o l i i t t i s e n + u l k o p o l i i t t i s e n a + u l k o p o l i i t t i s e s s a + u l k o p o l i i t t i s e s t a + u l k o p o l i i t t i s e s t i + u l k o p o l i i t t i s e t + u l k o p o l i i t t i s i a + u l k o p o l i i t t i s i i n + u l k o p o l i i t t i s i l l a + u l k o p o l i i t t i s i n + u l k o p o l i i t t i s i n a + u l k o p o l i i t t i s i s s a + u l k o p o l i i t t i s i s t a + u l k o p o l i i t t i s i s t a k i n + u l k o p o l i i t t i s t a + u l k o p o l i i t t i s t e n + u l k o p o l i t i i k a k s i + u l k o p o l i t i i k a l l a + u l k o p o l i t i i k a l l a m m e + u l k o p o l i t i i k a l l e + u l k o p o l i t i i k a l l e m m e + u l k o p o l i t i i k a n + u l k o p o l i t i i k a n k i n + u l k o p o l i t i i k a s s a + u l k o p o l i t i i k a s s a a n + u l k o p o l i t i i k a s s a k i n + u l k o p o l i t i i k a s s a m m e + u l k o p o l i t i i k a s t a + u l k o p o l i t i i k a s t a a n + u l k o p o l i t i i k a s t a m m e + u l k o p o l i t i i k k a + u l k o p o l i t i i k k a a + u l k o p o l i t i i k k a a m m e + u l k o p o l i t i i k k a a n + u l k o p o l i t i i k k a a n s a + u l k o p o l i t i i k k a k y s y m y k s i i n + u l k o p o l i t i i k k a m m e + u l k o p o l i t i i k k a n a + u l k o p o l i t i i k k a n n e + u l k o p o l i t i i k k a n s a + u l k o p o l i t i i k k o i h i n + u l k o p o l i t i i k k o j a + u l k o p o l i t i i k k o j e n + u l k o p o l i t i i k k o j e n s a + u l k o p o l i t i i k o i s s a + u l k o p u o l e l l e e n + u l k o p u o l i n e n + u l k o p u o l i s e l l a + u l k o p u o l i s e n + u l k o p u o l i s e s s a + u l k o p u o l i s e s t a + u l k o p u o l i s e t + u l k o p u o l i s i a + u l k o p u o l i s i e n + u l k o p u o l i s i i n + u l k o p u o l i s i l l a + u l k o p u o l i s i l l e + u l k o p u o l i s i l t a + u l k o p u o l i s i s s a + u l k o p u o l i s i s s a k i n + u l k o p u o l i s i s t a + u l k o p u o l i s t a + u l k o p u o l i s t e n + u l k o r a j a + u l k o r a j a a + u l k o r a j a a m m e + u l k o r a j a a n + u l k o r a j a k s i + u l k o r a j a l l a + u l k o r a j a l l a m m e + u l k o r a j a l l e + u l k o r a j a m m e + u l k o r a j a n + u l k o r a j a n s a + u l k o r a j a o s u u k s i a + u l k o r a j a r a h a s t o + u l k o r a j a r a h a s t o a + u l k o r a j a r a h a s t o l l e + u l k o r a j a r a h a s t o n + u l k o r a j a r a h a s t o o n + u l k o r a j a r a h a s t o s t a + u l k o r a j a s t a + u l k o r a j a t + u l k o r a j a t a r k a s t u k s i a + u l k o r a j a t u r v a l l i s u u d e n + u l k o r a j a v a l v o n n a n + u l k o r a j a v a l v o n n a s s a + u l k o r a j a v a l v o n n a s t a + u l k o r a j a v a l v o n t a a + u l k o r a j a v a l v o n t a a n + u l k o r a j a v i r a s t o + u l k o r a j a y h t e i s t y ö n + u l k o r a j a y h t e i s t y ö s t ä + u l k o r a j o i h i m m e + u l k o r a j o i h i n + u l k o r a j o i l l a + u l k o r a j o i l l a a n + u l k o r a j o i l l a m m e + u l k o r a j o i l l e + u l k o r a j o i l l e e n + u l k o r a j o i l l e m m e + u l k o r a j o i l t a + u l k o r a j o i l t a m m e + u l k o r a j o i s t a + u l k o r a j o i s t a m m e + u l k o r a j o j a + u l k o r a j o j a a n + u l k o r a j o j a m m e + u l k o r a j o j e m m e + u l k o r a j o j e n + u l k o r a j o j e n s a + u l k o s o r k k a + u l k o s u h d e a l a n + u l k o s u h d e a l o i t t e i t a + u l k o s u h d e a s i a + u l k o s u h d e a s i a t + u l k o s u h d e a s i o i s s a + u l k o s u h d e h a l l i n n o k s i + u l k o s u h d e h a l l i n n o l l a + u l k o s u h d e h a l l i n n o l l e + u l k o s u h d e h a l l i n n o l t a + u l k o s u h d e h a l l i n n o n + u l k o s u h d e h a l l i n n o s s a + u l k o s u h d e h a l l i n n o s t a + u l k o s u h d e h a l l i n t o + u l k o s u h d e h a l l i n t o a + u l k o s u h d e h a l l i n t o a a n + u l k o s u h d e h a l l i n t o a m m e + u l k o s u h d e h a l l i n t o m m e + u l k o s u h d e h a l l i n t o n s a + u l k o s u h d e h a l l i n t o o n + u l k o s u h d e n e u v o s t o n + u l k o s u h d e p a l v e l u + u l k o s u h d e p o l i t i i k a n + u l k o s u h d e p o l i t i i k a s s a + u l k o s u h d e p o l i t i i k k a a + u l k o s u h d e p o l i t i i k k a a n + u l k o s u h d e p ä ä o s a s t o n + u l k o s u h d e s o p i m u k s i a + u l k o s u h d e t o i m i a + u l k o s u h d e t o i m i n n a s s a + u l k o s u h d e t o i m i s s a + u l k o s u h d e v ä l i n e e t + u l k o s u h d e v ä l i n e i d e n + u l k o s u h t e e m m e + u l k o s u h t e e t + u l k o s u h t e i d e m m e + u l k o s u h t e i d e n + u l k o s u h t e i d e n s a + u l k o s u h t e i l l e + u l k o s u h t e i l l e m m e + u l k o s u h t e i s i i m m e + u l k o s u h t e i s i i n + u l k o s u h t e i s i i n s a + u l k o s u h t e i s i s s a + u l k o s u h t e i s s a + u l k o s u h t e i s s a a n + u l k o s u h t e i s s a k i n + u l k o s u h t e i s s a m m e + u l k o s u h t e i s t a + u l k o s u h t e i t a + u l k o s u h t e i t a a n + u l k o s u h t e i t a m m e + u l k o s u h t e i t t e n + u l k o s u o j a a + u l k o s u o j a n + u l k o t a r i f f i + u l k o t o i m e t + u l k o t o i m i a + u l k o t o i m i a m m e + u l k o t o i m i i n + u l k o t o i m i s s a + u l k o t u l l i + u l k o t u l l i e n + u l k o t u o t a n t o a u t o + u l k o v a l a i s t u s t a + u l k o v a l l a n + u l k o v a l l a t + u l k o v a l l o i s s a + u l k o v a l t a + u l k o v a l t i o s s a + u l k o v a l t o j a + u l k o v a l t o j e n + u l o s o t t o m i e h e t + u l o s o t t o m i e s + u l o s o t t o o n + u l o s p ä ä s y k e i n o + u l o s p ä ä s y k ä y t ä v ä ä + u l o s p ä ä s y n + u l o s p ä ä s y t i e n + u l o s p ä ä s y t i e t + u l o s t e e n s i i r t o + u l o s t e i n k o n t i n e n s s i + u l o s t e i t a + u l o s t e t y y p i t + u l o t e t a a n + u l o t e t t a v a + u l o t t a a + u l o t t a m a l l a + u l o t t a m i n e n + u l o t t a m i s e e n + u l o t t a m i s e k s i + u l o t t a m i s e s t a + u l o t t a m i s t a + u l o t t u a + u l o t t u i + u l o t t u i s i + u l o t t u u + u l o t t u v a t + u l o t t u v i e n + u l o t t u v i l l a m m e + u l o t t u v i l l a n n e + u l o t t u v u u d e l l e + u l o t t u v u u d e l t a a n + u l o t t u v u u d e n + u l o t t u v u u d e s t a + u l o t t u v u u d e t + u l o t t u v u u k s i a + u l o t t u v u u k s i s t a + u l o t t u v u u t e e n + u l o t t u v u u t t a + u l o t u t t a v a + u l s t e r i l a i s i a + u l t r a k a n n e t t a v a + u l t r a k e v y t + u l t r a l i b e r a a l e j a + u l t r a l i b e r a a l i + u l t r a l i b e r a a l i l t a + u l t r a l i b e r a l i s m i i n + u l t r a l i b e r a l i s m i s t a + u l t r a l i b e r a l i s t i s e s s a + u l t r a m o d e r n e j a + u l t r a n y k y a i k a i s t e n + u l t r a v a p a a l l e + u l t r a v i o l e t t i k a t a s t r o f i + u l t r a v i o l e t t i s ä t e e t + u l t r a v i o l e t t i s ä t e i l y l t ä + u l t r a v i o l e t t i t ä h t i t i e d e + u l t r a ä ä n i a n t u r i + u l t r a ä ä n i t e s t a u s + u l t r a ä ä n i t u t k i m u s + u m m i s t a a + u m m i s t a m a s t a + u m m i s t a m i s e s t a + u m m i s t a m m e + u m p e u d u t t u a + u m p e u t u v a n + u m p i e r i t y s j ä r j e s t e l m ä + u m p i k u j a + u m p i k u j a a + u m p i k u j a a n + u m p i k u j a k s i + u m p i k u j a n + u m p i k u j a s s a + u m p i k u j a s t a + u m p i k u j a s t a a n + u m p i k u j a s t r a t e g i a a n + u m p i k u j a t + u m p i k u j a t i l a n n e + u m p i k u j a t i l a n t e e n + u m p i k u j i e n + u m p i k u j i i n + u m p i k u j i s t a + u m p i k u u r o + u m p i l i s ä k e + u m p i l i s ä k k e e n p o i s t o l e i k k a u k s e e n + u m p i l ä h t e i d e n + u m p i m ä h k ä i s e e n + u m p i m ä h k ä i s e s s ä + u m p i m ä h k ä i s e t + u m p i m ä h k ä i s i ä + u m p i s o l m u + u n e k s i m a a n + u n e k s i m m e + u n e k s i n + u n e l m a a + u n e l m a k o h t e e s e e n s a + u n e l m a k o h t e i t a + u n e l m a l l e + u n e l m a l t a + u n e l m a n + u n e l m a n i + u n e l m a n n e + u n e l m a t + u n e l m a t a r h a + u n e l m a v a r t a l o a + u n e l m i a + u n e l m i a a n + u n e l m i a m m e + u n e l m i e n + u n e l m i e n s a + u n e l m i i n + u n e l m i s s a + u n e n p u u t e + u n e t t o m i a + u n i a a t t i k i r k o t + u n i a p n e a + u n i a r g u m e n t t i + u n i h a l v a u s + u n i h ä i r i ö + u n i h ä i r i ö i s t ä + u n i h ä i r i ö i t ä + u n i j a k s o + u n i k e k o + u n i k e k o j a + u n i k e o n p ä i v ä + u n i k k o a + u n i k k o p e l l o t + u n i k k o p e l t o j a + u n i k k o s a t o j e n + u n i k k o v i l j e l m i e n + u n i k k o v i l j e l m i ä + u n i k k o v i l j e l m ä t + u n i k k o ö l j y + u n i k o n + u n i k o n v i l j e l y + u n i k o n v i l j e l y a l u e i l l a + u n i k o n v i l j e l y l l e + u n i k o n v i l j e l y n + u n i k o n v i l j e l y s t ä + u n i k o n v i l j e l y ä + u n i l a t e r a l i s m i n + u n i l a t e r a l i s t i s e n a + u n i o n i a + u n i o n i a l u e t t a + u n i o n i a m m e + u n i o n i a s i o i s s a + u n i o n i a s i o i s t a + u n i o n i h a n k e + u n i o n i h a n k k e e k s i + u n i o n i h a n k k e e s e e n + u n i o n i h a n k k e e s t a + u n i o n i i n + u n i o n i j u n a + u n i o n i j u n a s t a + u n i o n i j ä s e n y y t e e n + u n i o n i k a a n + u n i o n i k e s k e i n e n + u n i o n i k i n + u n i o n i k s i + u n i o n i l l a + u n i o n i l l a k i n + u n i o n i l l e + u n i o n i l t a + u n i o n i l t a m m e + u n i o n i m a a n + u n i o n i m a i d e n + u n i o n i m a i h i n + u n i o n i m a i s s a + u n i o n i m m e + u n i o n i m y ö n t e i n e n + u n i o n i n + u n i o n i n a + u n i o n i n j ä s e n y y d e n + u n i o n i n l a a j u i n e n + u n i o n i n l a a j u i s e s t a + u n i o n i n l a a j u i s e s t i + u n i o n i n s i h t e e r i + u n i o n i p r o j e k t i i n + u n i o n i p u o l u e + u n i o n i r a k e n n e l m a l l e + u n i o n i r a k e n n e l m a s s a + u n i o n i r a k e n n e t t a + u n i o n i s i h t e e r i + u n i o n i s i h t e e r i n + u n i o n i s o p i m u k s e n + u n i o n i s o p i m u s + u n i o n i s o p i m u s t a + u n i o n i s s a + u n i o n i s s a k a a n + u n i o n i s s a k i n + u n i o n i s s a m m e + u n i o n i s t a + u n i o n i s t i j o h t a j a + u n i o n i s t i p a r a a t i + u n i o n i s t i p u o l e e n + u n i o n i s t i p u o l e l l a + u n i o n i s t i p u o l u e + u n i o n i s t i p u o l u e e l l a + u n i o n i s t i p u o l u e e l l e + u n i o n i s t i p u o l u e e n + u n i o n i s t i p u o l u e e t + u n i o n i s t i p u o l u e i d e n + u n i o n i s t i p u o l u e t t a + u n i o n i s t i r y h m ä n + u n i o n i t a s o l l a + u n i o n i t a s o n + u n i o n i v a l t i o i h i n + u n i o n i v i r a n o m a i s i l l e + u n i s s a a n + u n i t a a r i u n i v e r s a l i s m i + u n i t a b l e t i n + u n i t a b l e t t i + u n i t a u d i n + u n i t a u t i + u n i t a u t i i n + u n i v e l a s t a + u n i v e l k a + u n i v e r s a a l i k v a n t t o r i + u n i v e r s a a l i m p i + u n i v e r s a a l i p r a g m a t i i k k a + u n i v e r s a a l i p r e s k r i p t i v i s m i + u n i v o r m u + u n k a r i a + u n k a r i a l a i s y h t e i s ö n + u n k a r i i n + u n k a r i l a i s a l u e e k s i + u n k a r i l a i s e n a + u n k a r i l a i s e n e m m i s t ö n + u n k a r i l a i s e s s a + u n k a r i l a i s e t + u n k a r i l a i s i l l e + u n k a r i l a i s i s t a + u n k a r i l a i s j ä r j e s t ö j e n + u n k a r i l a i s j ä s e n e n ä + u n k a r i l a i s j ä s e n i l l e + u n k a r i l a i s j ä s e n t e n + u n k a r i l a i s k a a r t i + u n k a r i l a i s k o l l e g a n i + u n k a r i l a i s n u o r t a + u n k a r i l a i s n u o r t e n + u n k a r i l a i s p e l a a j a + u n k a r i l a i s p u o l u e + u n k a r i l a i s s y n t y i n e n + u n k a r i l a i s t a + u n k a r i l a i s t e n + u n k a r i l a i s v a s t a i n e n + u n k a r i l a i s v a s t a i s i a + u n k a r i l a i s v a s t a i s i l l a + u n k a r i l a i s v a s t a i s i s t a + u n k a r i l a i s v a s t a i s t a + u n k a r i l a i s v a s t a i s t e n + u n k a r i l a i s v e l j e n ä + u n k a r i l a i s v ä e s t ö + u n k a r i l a i s v ä e s t ö n + u n k a r i l a i s v ä h e m m i s t ö + u n k a r i l a i s v ä h e m m i s t ö i l l e + u n k a r i l a i s v ä h e m m i s t ö j e n + u n k a r i l a i s v ä h e m m i s t ö j ä + u n k a r i l a i s v ä h e m m i s t ö l l e + u n k a r i l a i s v ä h e m m i s t ö n + u n k a r i l a i s v ä h e m m i s t ö s t ä + u n k a r i l a i s v ä h e m m i s t ö s t ä ä n + u n k a r i l a i s v ä h e m m i s t ö t + u n k a r i l a i s v ä h e m m i s t ö ä + u n k a r i l a i s v ä h e m m i s t ö ö n + u n k a r i l a i s y h t e e n l i i t t y m ä n + u n k a r i l a i s y h t e i s ö + u n k a r i l a i s y h t e i s ö j e n + u n k a r i l a i s y h t e i s ö l l e + u n k a r i l a i s y h t e i s ö n + u n k a r i l a i s y h t e i s ö t + u n k a r i l a i s y h t e i s ö ö n + u n k a r i l a i s ä ä n e s t ä j i e n + u n k a r i l l e + u n k a r i n + u n k a r i n k i e l i n e n + u n k a r i n k i e l i s e t + u n k a r i n k i e l i s i l l e + u n k a r i n k i e l i s i ä + u n k a r i n k i e l i s t e n + u n k a r i n k i e l i s t ä + u n k a r i n p e r n a r u o h o + u n k a r i n p u o l i v e r i n e n + u n k a r i n s o k k o h i i r i + u n k a r i n s y r e e n i + u n k a r i s s a + u n k a r i s s a k i n + u n k a r i s t a + u n o h d a m m e + u n o h d e t a + u n o h d e t a a n + u n o h d e t t a v a + u n o h d e t t u j e n + u n o h d e t u i m m i s t a + u n o h d e t u i s t a + u n o h d i m m e + u n o h d i n + u n o h d i t t e + u n o h d u k s i i n + u n o h t a a + u n o h t a e n + u n o h t a i s i + u n o h t a k a a + u n o h t a k a a m m e + u n o h t a k o + u n o h t a m a a n + u n o h t a m a s t a + u n o h t a m a t t a + u n o h t a n e e t + u n o h t a n u t + u n o h t a v a n + u n o h t a v a t + u n o h t u a + u n o h t u m a t t o m i a + u n o h t u n e e t + u n o h t u n u t + u n o h t u u + u n o h t u v a t + u n t u v a p i l v i + u n t u v a p i l v i e n + u p e a m p a a + u p e a n + u p e a s t a + u p e i t a + u p o k a s t e r ä s + u p o t t u a + u p o t u s s o t a + u p o u u d e n + u p o u u d e s s a + u p o u u d e s t a + u p o u u s i + u p o u u s i a + u p o u u s i l l e + u p o u u t e e n + u p p i n i s k a i s u u d e n + u p p o a a + u p p o s i + u p s e e r i k o k e l a s + u p s e e r i o p p i l a s + u r a a n + u r a a n i a + u r a a n i a m m u k s i a + u r a a n i a m m u s t a + u r a a n i e h d o t u k s e s s a + u r a a n i h a n k e t t a + u r a a n i h e k s a f l u o r i d i + u r a a n i h i u k k a s e t + u r a a n i k a i v o s + u r a a n i k a i v o s t e n + u r a a n i k a i v o s t o i m i n t a a + u r a a n i m a l m i e s i i n t y m ä t + u r a a n i n + u r a a n i n r i k a s t u s + u r a a n i n r i k a s t u s l a i t o s t e n + u r a a n i n r i k a s t u s o h j e l m a + u r a a n i n r i k a s t u s o h j e l m a a + u r a a n i o k s i d e i k s i + u r a a n i o k s i d e j a + u r a a n i o k s i d i a + u r a a n i o k s i d i n + u r a a n i o k s i d i t + u r a a n i p i t o i s u u d e t + u r a a n i p i t o i s u u k s i a + u r a a n i r i k a s t e t t a + u r a a n i t e o l l i s u u d e n + u r a a n i v a l t i o i h i n + u r a a n i y d i n + u r a a n s a + u r a a t t i o k s i d a a s i + u r a a u u r t a v a a + u r a a u u r t a v a k s i + u r a a u u r t a v a m p i a + u r a a u u r t a v a n + u r a a u u r t a v i a + u r a h i e r a r k i a s s a + u r a j ä r j e s t e l m i i n + u r a j ä r j e s t e l m ä + u r a j ä r j e s t e l m ä n + u r a j ä r j e s t e l m ä s t ä + u r a j ä r j e s t e l m ä ä + u r a j ä r j e s t e l m ä ä n + u r a k a s s a + u r a k a t k o k s e n + u r a k e h i t y k s e e n + u r a k e h i t y k s e l l e + u r a k e h i t y k s e n + u r a k e h i t y k s e s s ä + u r a k e h i t y k s e s t ä + u r a k e h i t y s + u r a k e h i t y s j ä r j e s t e l m ä t + u r a k e h i t y s j ä r j e s t e l m ä ä + u r a k e h i t y s m a h d o l l i s u u d e t + u r a k e h i t y s m a h d o l l i s u u k s i a + u r a k e h i t y s m a h d o l l i s u u k s i s t a + u r a k e h i t y s m a l l i n + u r a k e h i t y s n ä k y m ä t + u r a k e h i t y s p o l i t i i k a n + u r a k e h i t y s p o l i t i i k k a + u r a k e h i t y s p o l u n + u r a k e h i t y s r a k e n t e i t a + u r a k e h i t y s t ä + u r a k e h i t y s t ä ä n + u r a k e h i t y s v ä l i n e e n ä + u r a k k a a + u r a k k a a m m e + u r a k k a t y ö n t e k i j ö i l l ä + u r a k k a t y ö s o p i m u k s i a + u r a k o i n t i p o l i t i i k a n + u r a k o i n t i s e k t o r i i n + u r a k o i s s a + u r a k o i t s i j a a n + u r a k o i t s i j a t + u r a k o i t s i j o i d e n + u r a k u l k u j a + u r a l l a + u r a l l a a n + u r a l l a n i + u r a l l e + u r a l l e e n + u r a m a h d o l l i s u u d e t + u r a m a h d o l l i s u u k s i a + u r a m a h d o l l i s u u k s i a a n + u r a m a h d o l l i s u u k s i e n + u r a m a h d o l l i s u u k s i i n + u r a m a h d o l l i s u u k s i i n s a + u r a m a h d o l l i s u u k s i s s a a n + u r a m a l l i + u r a m e n e s t y k s e s t ä + u r a n a i s i a + u r a n e u v o n t a a + u r a n i + u r a n s a + u r a n u u r t a j a n a + u r a n u u r t a j i n a + u r a n v a i h d o k s e n + u r a n v a i h d o k s i a + u r a n ä k y m i e n + u r a n ä k y m i i n + u r a n ä k y m i i n s ä + u r a n ä k y m i s t ä + u r a n ä k y m i ä + u r a n ä k y m ä t + u r a o d o t u k s i a a n + u r a o h j a u k s e l l a + u r a o h j a u s + u r a o n g e l m a t + u r a o n g e l m i a + u r a o p a s t u s t a + u r a p o l i t i i k k a s y i s t ä + u r a p o l k u j a + u r a p o l k u j a a n + u r a p o l k u n s a + u r a p o l u n + u r a p o r t a i d e n + u r a p r o f i i l i n + u r a p u t k i + u r a p y r k i m y k s i s t ä ä n + u r a r a k e n n e t t a + u r a r a k e n t e e s e e n + u r a r a k e n t e e s t a + u r a r a k e n t e i d e n + u r a s t a a n + u r a s u u n n i t e l m a t + u r a s u u n n i t e l m i e n + u r a s u u n n i t e l m i s t a + u r a s u u n n i t t e l u a + u r a s u u n n i t t e l u s s a a n + u r a v a i h t o e h d o k s i + u r a v a i h t o e h t o n a + u r a v a l i n t a n a + u r e a k i e r t o + u r e a n i t r a a t t i + u r h e i l e m a a n + u r h e i l e m i n e n + u r h e i l e v a + u r h e i l i j a a n + u r h e i l i j a l l e + u r h e i l i j a p a s s i + u r h e i l i j a t + u r h e i l i j a t ä h d e t + u r h e i l i j o i d e n + u r h e i l i j o i h i n + u r h e i l i j o i l l e + u r h e i l i j o i t a + u r h e i l l a + u r h e i l u a + u r h e i l u a g e n t t e i h i n + u r h e i l u a g e n t t i e n + u r h e i l u a l a + u r h e i l u a l a a + u r h e i l u a l a l l a + u r h e i l u a l a l l e + u r h e i l u a l a n + u r h e i l u a r e e n o i l l a + u r h e i l u a s i a n t u n t i j o i l l e + u r h e i l u a s i o i s s a + u r h e i l u a s i o i s t a + u r h e i l u a u t o + u r h e i l u a u t o i l l e + u r h e i l u a u t o j a + u r h e i l u b o i k o t t i a + u r h e i l u b o i k o t t i i n + u r h e i l u d o p i n g i n + u r h e i l u e l i m i l l ä + u r h e i l u e l i m i s s ä + u r h e i l u e l i n t a r v i k k e i t a + u r h e i l u e l i n t e n + u r h e i l u e l ä m ä n + u r h e i l u e t i i k a n + u r h e i l u f a n e i l l a + u r h e i l u f a n e i l l e + u r h e i l u f o o r u m i + u r h e i l u f o o r u m i n + u r h e i l u f o o r u m i s s a + u r h e i l u f o o r u m i s t a + u r h e i l u h a l l e j a + u r h e i l u h a n + u r h e i l u h a n k e t t a + u r h e i l u h a n k k e e t + u r h e i l u h a n k k e i l l e + u r h e i l u h a r r a s t u k s e n + u r h e i l u h a r r a s t u k s e s s a a n + u r h e i l u h a r r a s t u k s i i n + u r h e i l u h a r r a s t u s + u r h e i l u h a r r a s t u s t e n + u r h e i l u h e n g e n + u r h e i l u h e n g e s t ä + u r h e i l u h e n k e n s ä + u r h e i l u h e n k e ä + u r h e i l u h u l l u + u r h e i l u i h a n n e + u r h e i l u i n f r a s t r u k t u u r i n + u r h e i l u i n t e r n a t i o n a a l i + u r h e i l u i n v e s t o i n t e j a + u r h e i l u j a l k i n e e t + u r h e i l u j a l k i n e i d e n + u r h e i l u j a l k i n e i s i i n + u r h e i l u j a l k i n e i s t a + u r h e i l u j a l k i n e i t a + u r h e i l u j o h t a j a n a + u r h e i l u j o h t a j i a + u r h e i l u j o h t a j i l l e + u r h e i l u j o u k k u e + u r h e i l u j o u k k u e e s t a + u r h e i l u j o u k k u e e t + u r h e i l u j o u k k u e i d e n + u r h e i l u j u o m a + u r h e i l u j u o m i a + u r h e i l u j u o m i e n + u r h e i l u j ä r j e s t e l m ä + u r h e i l u j ä r j e s t ö i h i n + u r h e i l u j ä r j e s t ö i l l e + u r h e i l u j ä r j e s t ö i l l ä + u r h e i l u j ä r j e s t ö i l t ä + u r h e i l u j ä r j e s t ö i s s ä + u r h e i l u j ä r j e s t ö j e n + u r h e i l u j ä r j e s t ö j ä + u r h e i l u j ä r j e s t ö l l ä + u r h e i l u j ä r j e s t ö n + u r h e i l u j ä r j e s t ö s s ä + u r h e i l u j ä r j e s t ö t + u r h e i l u k a n a v a + u r h e i l u k a s s i + u r h e i l u k a s s i n + u r h e i l u k e n k i e n + u r h e i l u k e n k i i n + u r h e i l u k e n t i l l e + u r h e i l u k e n t i l l ä + u r h e i l u k e n t t i e n + u r h e i l u k e n t t i ä + u r h e i l u k e n t t ä + u r h e i l u k e s k u k s e n + u r h e i l u k e s k u k s i a + u r h e i l u k e s k u k s i i n + u r h e i l u k e s k u k s i s s a + u r h e i l u k e s k u s + u r h e i l u k e s k u s t e n + u r h e i l u k i l p a i l u + u r h e i l u k i l p a i l u i h i n + u r h e i l u k i l p a i l u i s t a + u r h e i l u k i l p a i l u j a + u r h e i l u k i l p a i l u j e n + u r h e i l u k i s o j a + u r h e i l u k i s o j e n + u r h e i l u k o m i t e a + u r h e i l u k o n f e r e n s s i n + u r h e i l u k o u l u t u k s e n + u r h e i l u k o u l u t u s + u r h e i l u k o u l u t u s t a + u r h e i l u k u v a m a t e r i a a l i a + u r h e i l u k y s y m y k s e e n + u r h e i l u l a i n s ä ä d ä n n ö n + u r h e i l u l a j e i s s a + u r h e i l u l a j e j a + u r h e i l u l a j i l l e + u r h e i l u l a k i + u r h e i l u l i i k e + u r h e i l u l i i k e t t ä + u r h e i l u l i i k k e e l l e + u r h e i l u l i i k k e e l l ä + u r h e i l u l i i k k e e l t ä + u r h e i l u l i i k k e e n + u r h e i l u l i i k k e e s e e n + u r h e i l u l i i t o i l l e + u r h e i l u l i i t o i l t a + u r h e i l u l i i t o l t a + u r h e i l u l i i t o n + u r h e i l u l i i t o t + u r h e i l u l i i t t o + u r h e i l u l i i t t o a + u r h e i l u l i i t t o j a + u r h e i l u l i i t t o j e n + u r h e i l u l l a + u r h e i l u l l e + u r h e i l u l l i s e m p a a + u r h e i l u l l i s e s t i + u r h e i l u l ä h e t y k s i i n + u r h e i l u l ä h e t y k s i s s ä + u r h e i l u l ä h e t y s t e n + u r h e i l u l ä ä k e t i e d e + u r h e i l u l ä ä k e t i e t e e s e e n + u r h e i l u l ä ä k ä r e i l l e + u r h e i l u m a a + u r h e i l u m a a i l m a + u r h e i l u m a a i l m a a + u r h e i l u m a a i l m a l l e + u r h e i l u m a a i l m a n + u r h e i l u m a h d o l l i s u u k s i a + u r h e i l u m a h d o l l i s u u k s i e n + u r h e i l u m a h d o l l i s u u k s i n a + u r h e i l u m a l l i a + u r h e i l u m a l l i l l e + u r h e i l u m a n a g e r e i d e n + u r h e i l u m a t k a i l u + u r h e i l u m a t k a i l u a + u r h e i l u m i n i s t e r e i d e n + u r h e i l u m i n i s t e r i + u r h e i l u m i n i s t e r i e n + u r h e i l u m i n i s t e r i l l e + u r h e i l u m i n i s t e r i n + u r h e i l u m i n i s t e r i t + u r h e i l u m ä ä r ä y s t e n + u r h e i l u n + u r h e i l u n e u v o s t o + u r h e i l u n h a r r a s t a j i l l e + u r h e i l u n ä y t ö k s i s t ä + u r h e i l u o h j e l m a a m m e + u r h e i l u o h j e l m a n + u r h e i l u o h j e l m a s t a + u r h e i l u o h j e l m a v a i h t o e h d o n + u r h e i l u o r g a n i s a a t i o i d e n + u r h e i l u o r g a n i s a a t i o i l l e + u r h e i l u o r g a n i s a a t i o t + u r h e i l u p a i k k o i h i n + u r h e i l u p a i k k o j a + u r h e i l u p a i k o i l t a + u r h e i l u p a i n o t t e i s e m m i l l e + u r h e i l u p a l a t s i + u r h e i l u p a l a t s i p u h e + u r h e i l u p a l v e l u i d e n + u r h e i l u p e l i + u r h e i l u p e r i n n e + u r h e i l u p i i r e i s s ä + u r h e i l u p i i r i e n + u r h e i l u p i s t o o l i + u r h e i l u p o l i i s i n a + u r h e i l u p o l i t i i k a l l e + u r h e i l u p o l i t i i k a n + u r h e i l u p o l i t i i k k a + u r h e i l u p o l i t i i k k a a + u r h e i l u p o l i t i i k k a a n + u r h e i l u p o l i t i i k k a m m e + u r h e i l u p r o j e k t i + u r h e i l u p s y k o l o g i a + u r h e i l u p ä i v i ä + u r h e i l u r a k e n t e i d e n + u r h e i l u r a k e n t e i t a + u r h e i l u r a v i n n e + u r h e i l u s a a v u t u s t e n + u r h e i l u s a n k a r e i t a + u r h e i l u s e u r a + u r h e i l u s e u r a n + u r h e i l u s e u r a n i + u r h e i l u s e u r a t + u r h e i l u s e u r o i h i n + u r h e i l u s e u r o i l l e + u r h e i l u s e u r o i l t a + u r h e i l u s e u r o i s s a + u r h e i l u s e u r o j a + u r h e i l u s e u r o j a a n + u r h e i l u s e u r o j e n + u r h e i l u s o p i m u k s i s s a + u r h e i l u s s a + u r h e i l u s t a + u r h e i l u s t a d i o n i e n + u r h e i l u s t a d i o n i l l e + u r h e i l u s t r a t e g i a n + u r h e i l u s u o r i t u k s e t + u r h e i l u s u o r i t u k s i i n + u r h e i l u s u o r i t u k s i s t a + u r h e i l u s u o r i t u s t a + u r h e i l u s u o r i t u s t e n + u r h e i l u s ä ä d ö s t e n + u r h e i l u s ä ä n t ö + u r h e i l u t a l o u d e s t a + u r h e i l u t a l o u s + u r h e i l u t a p a h t u m a + u r h e i l u t a p a h t u m a a + u r h e i l u t a p a h t u m a k a l e n t e r e i t a + u r h e i l u t a p a h t u m a n + u r h e i l u t a p a h t u m a n a + u r h e i l u t a p a h t u m a s s a + u r h e i l u t a p a h t u m a s t a + u r h e i l u t a p a h t u m a t + u r h e i l u t a p a h t u m i a + u r h e i l u t a p a h t u m i e n + u r h e i l u t a p a h t u m i i n + u r h e i l u t a p a h t u m i s s a + u r h e i l u t a p a h t u m i s t a + u r h e i l u t a p a t u r m a t + u r h e i l u t a r j o n t a a + u r h e i l u t a r v i k e t u o t a n t o + u r h e i l u t a r v i k k e i d e n + u r h e i l u t e k s t i i l i t u o t t a j i l t a + u r h e i l u t e o l l i s u u t t a + u r h e i l u t e r m e i n + u r h e i l u t i l a i s u u k s i e n + u r h e i l u t i l a i s u u k s i s s a + u r h e i l u t i l a t + u r h e i l u t i l o i h i n + u r h e i l u t i l o i l l e + u r h e i l u t i l o i s s a + u r h e i l u t i l o j a + u r h e i l u t i l o j e n + u r h e i l u t o i m i a + u r h e i l u t o i m i n n a l l a + u r h e i l u t o i m i n n a l l e + u r h e i l u t o i m i n n a n + u r h e i l u t o i m i n n a s s a + u r h e i l u t o i m i n t a + u r h e i l u t o i m i n t a a + u r h e i l u t o i m i n t a a n + u r h e i l u t o i m i n t o i h i n + u r h e i l u t u l o i s t a + u r h e i l u t u n n i n + u r h e i l u t ä h d e t + u r h e i l u t ä h t i e n + u r h e i l u u n + u r h e i l u v a a t t e i d e n + u r h e i l u v a l i o k u n n a l l a + u r h e i l u v a l i o k u n t a + u r h e i l u v a l m e n n u s t a + u r h e i l u v a l m e n t a j i a + u r h e i l u v a m m a + u r h e i l u v a r u s t e i t a + u r h e i l u v a r u s t e t e o l l i s u u d e s s a + u r h e i l u v e d o n l y ö n n i n + u r h e i l u v e d o n l y ö n t i + u r h e i l u v e d o n l y ö n t i ä + u r h e i l u v e r t a u s t a + u r h e i l u v i i h t e e n + u r h e i l u v i r a n o m a i s e t + u r h e i l u v i r a n o m a i s i i n + u r h e i l u v i r a n o m a i s t e n + u r h e i l u v i r a s t o + u r h e i l u v i r a s t o a + u r h e i l u v i r a s t o s s a + u r h e i l u v u o s i + u r h e i l u v ä e l l e + u r h e i l u v ä l i n e i d e n + u r h e i l u v ä l i n e i s t ä + u r h e i l u v ä l i n e i t ä + u r h e i l u v ä l i n e k a u p o i s s a + u r h e i l u v ä l i n e y r i t y s t e n + u r h e i l u y h d i s t y s t e n + u r h e i l u y h t e y k s i ä + u r h e i l u y m p ä r i s t ö s s ä + u r h e i l u y r i t y k s i l l e + u r h o o l l i s u u s t e s t i + u r i d i i n i d i f o s f a a t t i + u r i d i i n i d i f o s f a a t t i g a l a k t o o s i + u r i d i i n i d i f o s f a a t t i g l u k o o s i + u r i d i i n i d i f o s f a a t t i g l u k u r o n i h a p p o + u r i d i i n i t r i f o s f a a t t i + u r i i n + u r k i n t a a + u r k u m u s i i k k i + u r k u p i s t e + u r k u s i n f o n i a + u r o n i h a p o t + u r o s p u o l i s i i n + u r o t y ö t + u s e a a n + u s e a l l a + u s e a m m a l l a + u s e a m m a l l a k i n + u s e a m m a l l e + u s e a m m a n + u s e a m m a n k i n + u s e a m m a s s a + u s e a m m a s s a k i n + u s e a m m a t + u s e a m m i l l a + u s e a m m i l l e + u s e a m m i l t a + u s e a m m i n k i n + u s e a m m i s s a + u s e a m m i s t a + u s e a m p i a + u s e a m p i e n + u s e a m p i i n + u s e a n + u s e a n a + u s e a s s a + u s e a s t a + u s e a s t a k i n + u s e a s t i k i n + u s e a t + u s e i d e n + u s e i k s i + u s e i l l a + u s e i l l e + u s e i l t a + u s e i m m a t + u s e i m m i l l a + u s e i m m i l l e + u s e i m m i s s a + u s e i m m i s t a + u s e i m p i a + u s e i m p i e n + u s e i m p i i n + u s e i n h a n + u s e i n k a a n + u s e i s i i n + u s e i s s a + u s e i s t a + u s e i t a + u s k a l i a a m m i n + u s k a l i a a m p i + u s k a l i a a m p i a + u s k a l i a i m p i a + u s k a l i a i m p i i n + u s k a l i a s t a + u s k a l l a m m e + u s k a l l a n + u s k a l l a t + u s k a l l e t a + u s k a l l e t t a v a + u s k a l l u s t a + u s k a l s i + u s k a l t a a k s e e n + u s k a l t a i s i + u s k a l t a i s i n k o + u s k a l t a k a a + u s k a l t a k a a m m e + u s k a l t a m a t t a + u s k a l t a n e e t + u s k a l t a n u t + u s k a l t a u d u i n + u s k a l t a u t u k a a + u s k a l t a u t u n u t + u s k a l t a v a t + u s k o a + u s k o a a n + u s k o a k s e m m e + u s k o a k s e n i + u s k o a m m e + u s k o i s i + u s k o i s i n + u s k o i s i n k i n + u s k o i t t e p a + u s k o i v a t + u s k o k a a + u s k o l l i s e m p i a + u s k o l l i s e n a + u s k o l l i s i a + u s k o l l i s i m m a t + u s k o l l i s i m m i n + u s k o l l i s i m p i a + u s k o l l i s i n a + u s k o l l i s u u d e n v a k u u t u k s i a + u s k o l l i s u u t e e n i + u s k o m a a n + u s k o m a t o n + u s k o m a t o n t a + u s k o m a t t o m a a n + u s k o m a t t o m a l t a + u s k o m a t t o m a m m i s s a + u s k o m a t t o m a m p a a + u s k o m a t t o m a n + u s k o m a t t o m a s s a + u s k o m a t t o m i a + u s k o m i s t a + u s k o m m e + u s k o m m e k o + u s k o m u k s e t + u s k o m u k s i s t a + u s k o m u s j ä r j e s t e l m ä + u s k o m u s j ä r j e s t e l m ä t + u s k o m u s l ä ä k i n t ä + u s k o n + u s k o n a s i a + u s k o n a s i o i s s a + u s k o n a s i o i s t a + u s k o n e e t + u s k o n k a p p a l e e s t a + u s k o n k a p p a l e e t + u s k o n k i n + u s k o n k o + u s k o n l a h k o + u s k o n l a h k o i h i n + u s k o n l a h k o j a + u s k o n m i e s t ä + u s k o n n o i l l a + u s k o n n o i s s a + u s k o n n o i s t a + u s k o n n o l l e + u s k o n n o l l i s e n + u s k o n n o l l i s e s s a + u s k o n n o l l i s e s t a + u s k o n n o l l i s e t + u s k o n n o l l i s i a + u s k o n n o l l i s i i n + u s k o n n o l l i s i l l a + u s k o n n o l l i s i l l e + u s k o n n o l l i s i s t a + u s k o n n o l l i s t a + u s k o n n o l l i s t e n + u s k o n n o l l i s u u t e e n + u s k o n n o n + u s k o n n o n f i l o s o f i a + u s k o n n o n h a r j o i t u s p a i k k a n s a + u s k o n n o n h a r j o i t u s p a i k k o i h i m m e + u s k o n n o n h a r j o i t u s p a i k k o i h i n + u s k o n n o n h a r j o i t u s p a i k k o j e n + u s k o n n o n k a a n + u s k o n n o n o p e t t a j i a + u s k o n n o n o p e t u k s e n + u s k o n n o n o p e t u s + u s k o n n o n o p e t u s t a + u s k o n n o n v a p a u d e k s i + u s k o n n o n v a p a u d e l l a + u s k o n n o n v a p a u d e l l e + u s k o n n o n v a p a u d e l t a + u s k o n n o n v a p a u d e n + u s k o n n o n v a p a u d e s t a + u s k o n n o n v a p a u s + u s k o n n o n v a p a u s a s i a a + u s k o n n o n v a p a u s k y s y m y k s e e n + u s k o n n o n v a p a u s k y s y m y k s i l l ä + u s k o n n o n v a p a u s l a i n + u s k o n n o n v a p a u s l a u s e k e t t a + u s k o n n o n v a p a u s r a p o r t o i j a n + u s k o n n o n v a p a u s t i l a n n e t t a + u s k o n n o n v a p a u t e e n + u s k o n n o n v a p a u t e n s a + u s k o n n o n v a p a u t t a + u s k o n n o n v a s t a i s e s t i + u s k o n n o n v a s t a i s t e n + u s k o n n o s t a + u s k o n n o s t a a n + u s k o n n o t t o m i a + u s k o n n o t t o m i i n + u s k o n o p i n + u s k o n p u h d i s t u s + u s k o n r a u h a n + u s k o n s o d a l t a + u s k o n s o d a n + u s k o n s o d a t + u s k o n s o t a + u s k o n s o t a a + u s k o n s o t a n a + u s k o n s o t i i n + u s k o n t o a + u s k o n t o a a n + u s k o n t o a n t r o p o l o g i a + u s k o n t o d i a l o g i a + u s k o n t o i h i n + u s k o n t o j a + u s k o n t o j e n + u s k o n t o k r i t i i k k i + u s k o n t o k u n n a n + u s k o n t o k u n n a s t a + u s k o n t o k u n n a t + u s k o n t o k u n n i s t a + u s k o n t o k u n t a + u s k o n t o k u n t i a + u s k o n t o k u n t i e n + u s k o n t o l a i n + u s k o n t o l a i t + u s k o n t o l a k i + u s k o n t o m i n i s t e r i ö n + u s k o n t o n s a + u s k o n t o o n + u s k o n t o p o l i t i i k a n + u s k o n t o p s y k o l o g i a + u s k o n t o r a j o j e n + u s k o n t o r y h m i e n + u s k o n t o r y h m i s t ä + u s k o n t o r y h m i ä + u s k o n t o r y h m ä ä n + u s k o n t o s o s i o l o g i a + u s k o n t o t e k i j ä ä + u s k o n t o t e o l o g i a + u s k o n t o t i e d e + u s k o n t u n n u s t u k s e s t a + u s k o n t u n n u s t u k s i s t a + u s k o n v a i n o a + u s k o n v a l i n t a a n + u s k o n v a p a u d e n + u s k o n v a p a u d e s s a + u s k o n v a p a u d e s t a + u s k o n v a p a u s + u s k o n v a p a u t e e n + u s k o n v a p a u t t a + u s k o n y h t e i s ö j e n + u s k o n y h t e i s ö s t ä ä n + u s k o o + u s k o o k o + u s k o s s a + u s k o s t a a n + u s k o s u h d e h a l l i n n o n + u s k o t a a n + u s k o t a a n k o + u s k o t e l l a + u s k o t t a v a a + u s k o t t a v a a n + u s k o t t a v a k s i + u s k o t t a v a l l a + u s k o t t a v a m m a k s i + u s k o t t a v a m m a n + u s k o t t a v a m m a s s a + u s k o t t a v a m m a t + u s k o t t a v a m m i l t a + u s k o t t a v a m m i n + u s k o t t a v a m p a a + u s k o t t a v a m p a a n + u s k o t t a v a m p a n a + u s k o t t a v a m p i + u s k o t t a v a m p i a + u s k o t t a v a n + u s k o t t a v a n a + u s k o t t a v a s t a + u s k o t t a v i a + u s k o t t a v i i n + u s k o t t a v i k s i + u s k o t t a v i m m a t + u s k o t t a v i n + u s k o t t a v i n a + u s k o t t a v u u d e l l e + u s k o t t a v u u d e n + u s k o t t a v u u d e s t a + u s k o t t a v u u d e s t a m m e + u s k o t t a v u u s e r o + u s k o t t a v u u s k r i i s i + u s k o t t a v u u s k r i i s i i n + u s k o t t a v u u s k r i i s i ä + u s k o t t a v u u s k u i l u + u s k o t t a v u u s k y n n y k s e k s i + u s k o t t a v u u s k y s y m y s + u s k o t t a v u u s o l e t t a m a a + u s k o t t a v u u s o n g e l m a + u s k o t t a v u u s o n g e l m a a + u s k o t t a v u u s o n g e l m a n + u s k o t t a v u u s o n g e l m a s t a + u s k o t t a v u u s o n g e l m i a + u s k o t t a v u u s o s a m ä ä r ä + u s k o t t a v u u s p u l a a + u s k o t t a v u u s t a s o + u s k o t t a v u u s t e k i j ä + u s k o t t a v u u s t e s t i + u s k o t t a v u u t e m m e + u s k o t t a v u u t e n s a + u s k o t t a v u u t t a + u s k o t t a v u u t t a a n + u s k o t t a v u u t t a m m e + u s k o t t e k o + u s k o v a i s i a + u s k o v a i s t e n + u s k o v a n i + u s k o v a n s a + u s k o v a t + u s k o v i e n + u s k o v i n a m m e + u t a r e p i l v i + u t a r e t u l e h d u s r i s k i ä + u t e l i a a m p i a + u t e l i a a n a + u t e l i a i m m a t + u t e l i a i s u u d e n + u t e l i a i s u u t t a + u t o p i a a + u t o p i a s t a + u t o p i a t + u t o p i s t i s i a + u t o p i s t i s t a + u u d e k s i + u u d e l l a + u u d e l l e + u u d e l l e e n a j a t t e l u l l a + u u d e l l e e n a j a t t e l u p r o s e s s i + u u d e l l e e n a l k a m i s t a + u u d e l l e e n a r v i o i m i s e k s i + u u d e l l e e n a r v i o i n n i n + u u d e l l e e n a r v i o i n n i s s a + u u d e l l e e n a r v i o i n n i s t a + u u d e l l e e n a r v i o i n t i a + u u d e l l e e n a r v i o i n t i i n + u u d e l l e e n a r v i o i n t i l a u s e k e t t a + u u d e l l e e n a r v i o i n t i l a u s e k k e e s e e n + u u d e l l e e n a r v i o i n t i m e n e t t e l y + u u d e l l e e n a r v i o i n t i m e n e t t e l y n + u u d e l l e e n a r v i o i n t i p r o s e s s i + u u d e l l e e n a r v i o i n t i p r o s e s s i i n + u u d e l l e e n a s e i s t a u t u m i s e n + u u d e l l e e n a s u t t a m i n e n + u u d e l l e e n a s u t t a m i s p o l i t i i k a s t a + u u d e l l e e n a s u t t a m i s t o i m i a + u u d e l l e e n a s u t u s p o l i t i i k k a a + u u d e l l e e n a s u t u s v a i h e e n + u u d e l l e e n a v a a m i s e e n + u u d e l l e e n i n t e g r o i n n i n + u u d e l l e e n i n t e g r o i n n i s s a + u u d e l l e e n i n t e g r o i n t i t o i m i e n + u u d e l l e e n i s t u t u s o i k e u k s i a + u u d e l l e e n i s t u t u s p o l i t i i k k a a n + u u d e l l e e n i s t u t u s t o i m e n p i t e i t ä + u u d e l l e e n i t s e n ä i s t y m i s e e n + u u d e l l e e n i t s e n ä i s t y m i s e n + u u d e l l e e n j a k a m i s j ä r j e s t e l m ä + u u d e l l e e n j a k a u t u m i n e n + u u d e l l e e n j a k o a + u u d e l l e e n j a k o j ä r j e s t e l m i n e e n + u u d e l l e e n j a k o j ä r j e s t e l m i ä + u u d e l l e e n j a k o j ä r j e s t e l m ä n + u u d e l l e e n j a k o j ä r j e s t e l m ä s t ä + u u d e l l e e n j a k o m e k a n i s m i + u u d e l l e e n j a k o m e k a n i s m i a + u u d e l l e e n j a k o p o l i t i i k k a + u u d e l l e e n j a k o p o l i t i i k k a a + u u d e l l e e n j a k o p o l i t i i k k o i h i n s a + u u d e l l e e n j a k o t e h t ä v ä ä + u u d e l l e e n j a k o v a r a t + u u d e l l e e n j a o l t a + u u d e l l e e n j a o n + u u d e l l e e n j a o s t a + u u d e l l e e n j ä r j e s t e l y i h i n + u u d e l l e e n j ä r j e s t e l y i l l e + u u d e l l e e n j ä r j e s t e l y i s t ä + u u d e l l e e n j ä r j e s t e l y j e n + u u d e l l e e n j ä r j e s t e l y j ä + u u d e l l e e n j ä r j e s t e l y m e n e t t e l y j ä + u u d e l l e e n j ä r j e s t e l y n + u u d e l l e e n j ä r j e s t e l y o h j e l m a + u u d e l l e e n j ä r j e s t e l y o h j e l m a l l e + u u d e l l e e n j ä r j e s t e l y o n g e l m i a + u u d e l l e e n j ä r j e s t e l y p r o s e s s e i h i n + u u d e l l e e n j ä r j e s t e l y p r o s e s s i i n + u u d e l l e e n j ä r j e s t e l y s e u r a u k s i a + u u d e l l e e n j ä r j e s t e l y s s ä + u u d e l l e e n j ä r j e s t e l y s t ä + u u d e l l e e n j ä r j e s t e l y s u u n n i t e l m a + u u d e l l e e n j ä r j e s t e l y s u u n n i t e l m i e n + u u d e l l e e n j ä r j e s t e l y s u u n n i t e l m i s t a + u u d e l l e e n j ä r j e s t e l y t + u u d e l l e e n j ä r j e s t e l y t o i m e n p i t e i t ä + u u d e l l e e n j ä r j e s t e l y t o i m e t + u u d e l l e e n j ä r j e s t e l y t o i m i a + u u d e l l e e n j ä r j e s t e l y t o i m i e n + u u d e l l e e n j ä r j e s t e l y t o i m i l l a + u u d e l l e e n j ä r j e s t e l y t u k i + u u d e l l e e n j ä r j e s t e l y v a r a u k s e n + u u d e l l e e n j ä r j e s t e l y y n + u u d e l l e e n j ä r j e s t e l y ä + u u d e l l e e n j ä r j e s t y m i n e n + u u d e l l e e n j ä r j e s t ä m i s e s s ä + u u d e l l e e n j ä r j e s t ä m i s t ä + u u d e l l e e n k a n s a l l i s t a m i n e n + u u d e l l e e n k a n s a l l i s t a m i s e e n + u u d e l l e e n k a n s a l l i s t a m i s e n + u u d e l l e e n k a n s a l l i s t a m i s e s t a + u u d e l l e e n k a n s a l l i s t a m i s r e t o r i i k k a + u u d e l l e e n k a n s a l l i s t a m i s t a + u u d e l l e e n k a n s a l l i s t a m i s t o i m i a + u u d e l l e e n k a n s a l l i s t a m i s y r i t y k s e t + u u d e l l e e n k a n s a l l i s t a m i s y r i t y k s i ä + u u d e l l e e n k i i n n i t t ä m i s j ä r j e s t e l m ä + u u d e l l e e n k i r j o i t u s y r i t y s + u u d e l l e e n k o h d i s t a m i s m e k a n i s m i n + u u d e l l e e n k o h d i s t a m i s m e k a n i s m i s s a + u u d e l l e e n k o u l u t t a a + u u d e l l e e n k o u l u t t a m i s e e n + u u d e l l e e n k o u l u t u k s e e n + u u d e l l e e n k o u l u t u k s e e n s a + u u d e l l e e n k o u l u t u k s e l l a + u u d e l l e e n k o u l u t u k s e n + u u d e l l e e n k o u l u t u k s e s s a + u u d e l l e e n k o u l u t u s a l o i t t e i t a + u u d e l l e e n k o u l u t u s l e i r e i l l e + u u d e l l e e n k o u l u t u s l e i r e i l l ä + u u d e l l e e n k o u l u t u s l e i r e i s t ä + u u d e l l e e n k o u l u t u s l e i r i t + u u d e l l e e n k o u l u t u s m a h d o l l i s u u k s i a + u u d e l l e e n k o u l u t u s m a h d o l l i s u u k s i e n + u u d e l l e e n k o u l u t u s o h j e l m i a + u u d e l l e e n k o u l u t u s o h j e l m i e n + u u d e l l e e n k o u l u t u s o h j e l m i i n + u u d e l l e e n k o u l u t u s t a + u u d e l l e e n k o u l u t u s t a r p e e t + u u d e l l e e n k o u l u t u s t a r p e i d e n + u u d e l l e e n k o u l u t u s t o i m e n p i t e i t ä + u u d e l l e e n k o u l u t u s t o i m i s t a + u u d e l l e e n k o u l u t u s v a i h e e s s a + u u d e l l e e n k o u l u t u s y k s i k k ö j ä + u u d e l l e e n k u t s u + u u d e l l e e n k ä s i t t e l y l a i t o k s i s t a + u u d e l l e e n k ä s i t t e l y l a i t o s t e n + u u d e l l e e n k ä s i t t e l y m e n e t t e l y s t ä + u u d e l l e e n k ä s i t t e l y ä + u u d e l l e e n k ä y n n i s t ä m i n e n + u u d e l l e e n k ä y n n i s t ä m i s e k s i + u u d e l l e e n k ä y n n i s t ä m i s t ä + u u d e l l e e n k ä y n n i s t ä m i s y r i t y k s e n + u u d e l l e e n k ä y t t ö j ä r j e s t e l m i i n + u u d e l l e e n k ä y t t ö j ä r j e s t e l m i s t ä + u u d e l l e e n k ä y t t ö j ä r j e s t e l m i ä + u u d e l l e e n k ä y t t ö m e n e t e l m i e n + u u d e l l e e n k ä y t t ö t a v o i t e + u u d e l l e e n k ä y t t ö t a v o i t t e i d e n + u u d e l l e e n k ä y t t ö v e l v o l l i s u u s + u u d e l l e e n k ä y t t ö ä + u u d e l l e e n k ä y t t ö ö n + u u d e l l e e n k ä y t ö l l e + u u d e l l e e n k ä y t ö l l ä + u u d e l l e e n k ä y t ö n + u u d e l l e e n k ä y t ö s s ä + u u d e l l e e n k ä y t ö s t ä + u u d e l l e e n l a a d i n t a + u u d e l l e e n l a a d i n t a a + u u d e l l e e n l a a d i n t a e h d o t u k s e n + u u d e l l e e n l a a d i n t a j ä r j e s t e l m ä ä n + u u d e l l e e n l a a d i n t a m e n e t e l m ä + u u d e l l e e n l a a d i n t a m e n e t t e l y + u u d e l l e e n l a a d i n t a n a + u u d e l l e e n l a a d i n t a t e k n i i k a l l a + u u d e l l e e n l a a t i m i n e n + u u d e l l e e n l a a t i m i s m e n e t t e l y + u u d e l l e e n l a a t i m i s m e n e t t e l y n + u u d e l l e e n l a a t i m i s m e n e t t e l y s s ä + u u d e l l e e n l a a t i m i s m e n e t t e l y s t ä + u u d e l l e e n l a a t i m i s m e n e t t e l y y n + u u d e l l e e n l a a t i m i s m e n e t t e l y ä + u u d e l l e e n l a s t a u s l a i t t e i l l a + u u d e l l e e n l a s t a u s l a i t t e i n + u u d e l l e e n l a s t a u s l a i t t e i s t o i h i n + u u d e l l e e n l a s t a u s p a i k k a + u u d e l l e e n l i n j a u k s e n + u u d e l l e e n l u o m i s t a + u u d e l l e e n m e t s i t y s a l a + u u d e l l e e n m e t s i t y s t o i m i e n + u u d e l l e e n m e t s i t y s t o i m i i n + u u d e l l e e n m u o k k a u s t a p a + u u d e l l e e n m ä ä r i t t e l y s t ä + u u d e l l e e n m ä ä r i t t e l y v a i h e + u u d e l l e e n m ä ä r i t t e l y ä + u u d e l l e e n n e u v o t t e l u + u u d e l l e e n n e u v o t t e l u a + u u d e l l e e n n e u v o t t e l u n + u u d e l l e e n n i m e t y n + u u d e l l e e n n u m e r o i n t i a + u u d e l l e e n o h j e l m o i n t i + u u d e l l e e n o r g a n i s o i n n i s s a + u u d e l l e e n o r g a n i s o i n t i + u u d e l l e e n o r g a n i s o i n t i a + u u d e l l e e n o r g a n i s o i n t i i n + u u d e l l e e n p a i n o t u s t a + u u d e l l e e n p a k k a u s v a i h e i s s a + u u d e l l e e n r a h o i t u s m a r k k i n o i d e n + u u d e l l e e n r a h o i t u s o p e r a a t i o i d e n + u u d e l l e e n r a h o i t u s t a + u u d e l l e e n r a k e n n u s a v u n + u u d e l l e e n r a k e n n u s o h j e l m a t + u u d e l l e e n r a k e n n u s o h j e l m i a + u u d e l l e e n r a k e n n u s r y h m i e n + u u d e l l e e n r a k e n n u s t o i m e t + u u d e l l e e n r a k e n n u s t y ö h ö n + u u d e l l e e n r a t i f i o i n t i a + u u d e l l e e n r e i t i t y k s e e n + u u d e l l e e n r e i t i t y k s e n + u u d e l l e e n r e i t i t y s + u u d e l l e e n r e k i s t e r ö i n n i n + u u d e l l e e n r e k i s t e r ö i n t i a i k a + u u d e l l e e n r e k i s t e r ö i n t i i n + u u d e l l e e n s i j o i t t a m i s a l o i t t e i d e n + u u d e l l e e n s i j o i t t a m i s e n + u u d e l l e e n s i j o i t t a m i s e s s a + u u d e l l e e n s i j o i t t a m i s h a n k k e i t a + u u d e l l e e n s i j o i t t a m i s j ä r j e s t e l m ä + u u d e l l e e n s i j o i t t a m i s j ä r j e s t e l m ä ä + u u d e l l e e n s i j o i t t a m i s j ä r j e s t e l y n + u u d e l l e e n s i j o i t t a m i s k y s y m y k s e s s ä + u u d e l l e e n s i j o i t t a m i s m a h d o l l i s u u d e n + u u d e l l e e n s i j o i t t a m i s o h j e l m a + u u d e l l e e n s i j o i t t a m i s o h j e l m a a + u u d e l l e e n s i j o i t t a m i s o h j e l m a a n + u u d e l l e e n s i j o i t t a m i s o h j e l m a l l a + u u d e l l e e n s i j o i t t a m i s o h j e l m a n + u u d e l l e e n s i j o i t t a m i s o h j e l m a s t a + u u d e l l e e n s i j o i t t a m i s o h j e l m a t + u u d e l l e e n s i j o i t t a m i s o h j e l m i a + u u d e l l e e n s i j o i t t a m i s o h j e l m i e n + u u d e l l e e n s i j o i t t a m i s o h j e l m i l l a + u u d e l l e e n s i j o i t t a m i s p a k e t t i + u u d e l l e e n s i j o i t t a m i s p o l i t i i k a l l a + u u d e l l e e n s i j o i t t a m i s p o l i t i i k a n + u u d e l l e e n s i j o i t t a m i s p o l i t i i k k a + u u d e l l e e n s i j o i t t a m i s p o l i t i i k k a a + u u d e l l e e n s i j o i t t a m i s p o l i t i i k k a a n + u u d e l l e e n s i j o i t t a m i s p r o s e s s i + u u d e l l e e n s i j o i t t a m i s p r o s e s s i n + u u d e l l e e n s i j o i t t a m i s s u u n n i t e l m i e n + u u d e l l e e n s i j o i t t a m i s t o i m e n p i t e i d e n + u u d e l l e e n s i j o i t t a m i s t o i m i e n + u u d e l l e e n s i j o i t t a m i s t o i m i i n + u u d e l l e e n s i j o i t t a m i s t o i m i n t a a + u u d e l l e e n s i j o i t t a m i s t o i m i n t a a n + u u d e l l e e n s i j o i t t a m i s v a l m i u k s i a + u u d e l l e e n s i j o i t t a m i s v ä l i n e e n + u u d e l l e e n s i j o i t u k s i s t a + u u d e l l e e n s i j o i t u s m e k a n i s m e i h i n + u u d e l l e e n s i j o i t u s m e k a n i s m i n + u u d e l l e e n s i j o i t u s o h j e l m a a + u u d e l l e e n s i j o i t u s s u u n n i t e l m a a n + u u d e l l e e n s i j o i t u s y k s i k ö s t ä + u u d e l l e e n s i s ä l l y t t ä m i s t ä + u u d e l l e e n s u u n n i t t e l u u n + u u d e l l e e n s u u n t a a m i s s u u n n i t e l m a n + u u d e l l e e n s u u n t a a m i s s u u n n i t e l m a s t a + u u d e l l e e n s u u n t a u s + u u d e l l e e n s u u n t a u t u m i s e s t a + u u d e l l e e n s u u n t a u t u m i s o h j e l m a + u u d e l l e e n s u u n t a u t u m i s s u u n n i t e l m a + u u d e l l e e n s u u n t a u t u m i s s u u n n i t e l m a a n + u u d e l l e e n s u u n t a u t u m i s s u u n n i t e l m a l l a + u u d e l l e e n s u u n t a u t u m i s s u u n n i t e l m a n + u u d e l l e e n s u u n t a u t u m i s t a + u u d e l l e e n s u u n t a u t u m i s t o i m e t + u u d e l l e e n s y n t y m i s t ä + u u d e l l e e n s ä ä n t e l y + u u d e l l e e n s ä ä n t e l y s s ä + u u d e l l e e n s ä ä n t e l y y n + u u d e l l e e n s ä ä n t e l y ä + u u d e l l e e n t a r k a s t e l u a + u u d e l l e e n t a r k a s t e l u j a k s o a + u u d e l l e e n t a r k a s t e l u l a u s e k e + u u d e l l e e n t a r k a s t e l u l a u s e k e t t a + u u d e l l e e n t a r k a s t e l u l a u s e k k e e l l a + u u d e l l e e n t a r k a s t e l u l a u s e k k e e n + u u d e l l e e n t a r k a s t e l u l a u s e k k e e s t a + u u d e l l e e n t a r k a s t e l u l a u s e k k e i t a + u u d e l l e e n t a r k a s t e l u m e k a n i s m i + u u d e l l e e n t a r k a s t e l u m e n e t t e l y s s ä + u u d e l l e e n t a r k a s t e l u m e n e t t e l y ä + u u d e l l e e n t a r k a s t e l u m e n e t t e l y ä ä n + u u d e l l e e n t a r k a s t e l u n + u u d e l l e e n t a r k a s t e l u p r o s e s s i + u u d e l l e e n t a r k a s t e l u p r o s e s s i a + u u d e l l e e n t a r k a s t e l u p r o s e s s i i n + u u d e l l e e n t a r k a s t e l u p r o s e s s i n + u u d e l l e e n t a r k a s t e l u p r o s e s s i s s a a n + u u d e l l e e n t a r k a s t e l u s s a + u u d e l l e e n t a r k a s t e l u s t a + u u d e l l e e n t a r k a s t e l u t i l a n t e e s t a + u u d e l l e e n t a r k a s t e l u t o i m e n p i t e i t ä + u u d e l l e e n t a r k a s t e l u u n + u u d e l l e e n t a r k a s t e l u v a l m i u d e t + u u d e l l e e n t a r k a s t e l u v e l v o i t e t t a + u u d e l l e e n t a r k a s t u s l a u s e k e + u u d e l l e e n t a r k i s t u k s e s t a + u u d e l l e e n t e o l l i s t a m i s e s t a + u u d e l l e e n t u l k i n n a s t a + u u d e l l e e n t u l k i n t a a + u u d e l l e e n t u o n t e i h i n + u u d e l l e e n t u o n t i a + u u d e l l e e n t y ö l l i s t y m i s t ä + u u d e l l e e n t y ö l l i s t ä m i s e k s i + u u d e l l e e n v a l i n n a l l e n i + u u d e l l e e n v a l i n n a n + u u d e l l e e n v a l i n n a s t a + u u d e l l e e n v a l i n n a s t a a n + u u d e l l e e n v a l i n n a s t a n n e + u u d e l l e e n v a l i n t a a + u u d e l l e e n v a l i n t a a n + u u d e l l e e n v a l i n t a a n s a + u u d e l l e e n v a l i n t a k a m p a n j a a + u u d e l l e e n v a l i n t a n s a + u u d e l l e e n v a l i n t o j a + u u d e l l e e n v a l i t u i k s i + u u d e l l e e n v a l i t u k s i + u u d e l l e e n v a l i t u n + u u d e l l e e n v a r u s t e l u t o i m i e n + u u d e l l e e n y h d i s t y m i n e n + u u d e l l e e n y h d i s t y m i s e s t ä + u u d e l t a + u u d e m m a n + u u d e m m a t + u u d e m m i l l e + u u d e m p a a + u u d e m p a n a + u u d e m p i + u u d e m p i a + u u d e m p i e n + u u d e m p i i n + u u d e n + u u d e n a i k a i s e m m a l l e + u u d e n a i k a i s e m m a n + u u d e n a i k a i s e m m a s t a + u u d e n a i k a i s e m m i l l e + u u d e n a i k a i s e m p a a + u u d e n a i k a i s e m p a a n + u u d e n a i k a i s e m p i + u u d e n a i k a i s e m p i a + u u d e n a i k a i s e m p i e n + u u d e n a i k a i s e s t a + u u d e n a i k a i s i a + u u d e n a i k a i s i m m a t + u u d e n a i k a i s i m m i s t a + u u d e n a i k a i s i m p i a + u u d e n a i k a i s i m p i e n + u u d e n a i k a i s t a a + u u d e n a i k a i s t a m i s e n + u u d e n a i k a i s t a m i s e s s a + u u d e n a i k a i s t a m i s e s t a + u u d e n a i k a i s t a m i s o h j e l m a a + u u d e n a i k a i s t a m i s o h j e l m a a n + u u d e n a i k a i s t a m i s o h j e l m a s t a + u u d e n a i k a i s t a m i s p o l i t i i k a n + u u d e n a i k a i s t a m i s p r o s e s s i + u u d e n a i k a i s t a m i s p r o s e s s i a + u u d e n a i k a i s t a m i s p r o s e s s i n + u u d e n a i k a i s t a m i s p y r k i m y k s i s t ä + u u d e n a i k a i s t a m i s t a + u u d e n a i k a i s t e n + u u d e n a i k a i s t e t t a v a + u u d e n l a i s e e n + u u d e n l a i s e k s i + u u d e n l a i s e l l e + u u d e n l a i s e l t a + u u d e n l a i s e n + u u d e n l a i s e s s a + u u d e n l a i s e s t a + u u d e n l a i s e t + u u d e n l a i s i a + u u d e n l a i s i i n + u u d e n l a i s i l l e + u u d e n l a i s i n a + u u d e n l a i s i s s a + u u d e n l a i s i s t a + u u d e n l a i s t a + u u d e n l a i s t e n + u u d e n m u o t o i s t a + u u d e n t y y p p i n e n + u u d e n t y y p p i s e e n + u u d e n t y y p p i s e l l e + u u d e n t y y p p i s e n + u u d e n t y y p p i s e s t ä + u u d e n t y y p p i s e t + u u d e n t y y p p i s i i n + u u d e n t y y p p i s i l l e + u u d e n t y y p p i s i s t ä + u u d e n t y y p p i s i ä + u u d e n t y y p p i s t e n + u u d e n t y y p p i s t ä + u u d e n v u o d e n + u u d e n v u o d e n a a t o n + u u d e n v u o d e n a a t t o a + u u d e n v u o d e n l u p a u k s e l l e n i + u u d e n v u o d e n l u p a u k s e m m e + u u d e n v u o d e n p ä i v ä + u u d e n v u o d e n p ä i v ä n + u u d e n v u o d e n p ä i v ä n ä + u u d e n v u o d e n y ö n ä + u u d e s s a + u u d e s s a k i n + u u d e s t a + u u d e t + u u d e t k i n + u u d i s a s u k a s t a + u u d i s a s u k k a i t a + u u d i s a s u t u s h a n k k e e n + u u d i s a s u t u s p o l i t i i k k a a + u u d i s l u u + u u d i s r a i v a a j a h e n k i s t ä + u u d i s r a i v a a j i a + u u d i s r a i v a u k s e e n + u u d i s r a i v a u s + u u d i s r a k e n n u k s e t + u u d i s r a k e n n u s t e n + u u d i s r a k e n t a m i n e n + u u d i s r a k e n t a m i s e n + u u d i s s a n a k s i + u u d i s t a a + u u d i s t a a k s e e n + u u d i s t a a k s e m m e + u u d i s t a e n + u u d i s t a e s s a m m e + u u d i s t a e s s a n n e + u u d i s t a j a k o m i s s i o n + u u d i s t a j i a + u u d i s t a k a a m m e + u u d i s t a m a a n + u u d i s t a m a s s a + u u d i s t a m a t t a + u u d i s t a m i s e e n + u u d i s t a m i s e h d o t u k s i a + u u d i s t a m i s e h d o t u k s i s t a + u u d i s t a m i s e h d o t u s t e n + u u d i s t a m i s e h t o j a + u u d i s t a m i s e k s i + u u d i s t a m i s e l l e + u u d i s t a m i s e n + u u d i s t a m i s e s s a + u u d i s t a m i s e s t a + u u d i s t a m i s h a n k k e e s e e n + u u d i s t a m i s k e h i t y s t ä + u u d i s t a m i s k e i n o i h i n + u u d i s t a m i s k e s k u s t e l u + u u d i s t a m i s k o n f e r e n s s i n + u u d i s t a m i s m e n e t e l m i ä + u u d i s t a m i s o h j e l m a a + u u d i s t a m i s o h j e l m a a n s a + u u d i s t a m i s o h j e l m a n + u u d i s t a m i s p o l i t i i k a n + u u d i s t a m i s p r o s e s s i a + u u d i s t a m i s p r o s e s s i e n + u u d i s t a m i s p r o s e s s i i n + u u d i s t a m i s p r o s e s s i n + u u d i s t a m i s p r o s e s s i s s a + u u d i s t a m i s p r o s e s s i s t a + u u d i s t a m i s s u u n n i t e l m a n + u u d i s t a m i s s u u n n i t e l m i a + u u d i s t a m i s t a + u u d i s t a m i s t a p o j a + u u d i s t a m i s t a r p e e s t a + u u d i s t a m i s t a r p e e t + u u d i s t a m i s t a r p e i t a + u u d i s t a m i s t a r v e + u u d i s t a m i s t a r v e t t a + u u d i s t a m i s t o i m e n p i t e i s s ä + u u d i s t a m i s t o i m i a + u u d i s t a m i s t o i m i l t a + u u d i s t a m i s t ö i t ä + u u d i s t a m i s y r i t y k s i ä + u u d i s t a v i m p i a + u u d i s t e t a + u u d i s t e t a a n + u u d i s t e t a a n k o + u u d i s t e t t a e s s a + u u d i s t e t t a v a + u u d i s t e t t a v a a + u u d i s t e t t i i n + u u d i s t e t t u + u u d i s t e t t u j e n + u u d i s t e t t u u n + u u d i s t e t u i s t a + u u d i s t e t u n + u u d i s t e t u s t a + u u d i s t u a k s e e n + u u d i s t u k s e e n + u u d i s t u k s e l l a + u u d i s t u k s e l l e + u u d i s t u k s e n + u u d i s t u k s e n s a + u u d i s t u k s e s s a + u u d i s t u k s e s t a + u u d i s t u k s e t + u u d i s t u k s i a + u u d i s t u k s i a a n + u u d i s t u k s i i n + u u d i s t u k s i l l a + u u d i s t u k s i l l e + u u d i s t u k s i n + u u d i s t u k s i n e e n + u u d i s t u k s i s s a + u u d i s t u k s i s s a a n + u u d i s t u k s i s t a + u u d i s t u m i s k e l v o t t o m a k s i + u u d i s t u m i s k y k y i s e m m ä k s i + u u d i s t u m i s o n g e l m i a + u u d i s t u m i s p r o s e s s i a + u u d i s t u m i s s u u n n i t e l m a + u u d i s t u m i s t a + u u d i s t u m i s t a h t i + u u d i s t u n u t t a + u u d i s t u o t t e i l l e + u u d i s t u s a i k a t a u l u + u u d i s t u s a i k a t a u l u n s a + u u d i s t u s a i k a t a u l u u n + u u d i s t u s a l a a + u u d i s t u s a l o i t e + u u d i s t u s a r v o n + u u d i s t u s a s i a k i r j a + u u d i s t u s a s i a l i s t a a n + u u d i s t u s a s k e l + u u d i s t u s a s k e l e e s t a + u u d i s t u s a s k e l i a + u u d i s t u s d i r e k t i i v i e n + u u d i s t u s e h d o t u k s e e n n e + u u d i s t u s e h d o t u k s e k s i + u u d i s t u s e h d o t u k s e l l a m m e + u u d i s t u s e h d o t u k s e l l e + u u d i s t u s e h d o t u k s e m m e + u u d i s t u s e h d o t u k s e n + u u d i s t u s e h d o t u k s e n i + u u d i s t u s e h d o t u k s e s s a + u u d i s t u s e h d o t u k s e s s a a n + u u d i s t u s e h d o t u k s e s s a m m e + u u d i s t u s e h d o t u k s e s t a + u u d i s t u s e h d o t u k s e s t a n n e + u u d i s t u s e h d o t u k s e t + u u d i s t u s e h d o t u k s i a + u u d i s t u s e h d o t u k s i a a n + u u d i s t u s e h d o t u k s i i m m e + u u d i s t u s e h d o t u k s i i n + u u d i s t u s e h d o t u k s i l l a a n + u u d i s t u s e h d o t u k s i s s a + u u d i s t u s e h d o t u k s i s s a m m e + u u d i s t u s e h d o t u k s i s t a + u u d i s t u s e h d o t u s + u u d i s t u s e h d o t u s t a + u u d i s t u s e h d o t u s t a n n e + u u d i s t u s e h d o t u s t e n + u u d i s t u s e h d o t u s t e n s a + u u d i s t u s e s i t y k s e t + u u d i s t u s e s i t y k s i l l ä + u u d i s t u s h a k u i n e n + u u d i s t u s h a l u + u u d i s t u s h a l u a + u u d i s t u s h a l u k k u u d e s t a + u u d i s t u s h a l u k k u u t t a + u u d i s t u s h a l u n + u u d i s t u s h a n k e + u u d i s t u s h a n k k e e l l a m m e + u u d i s t u s h a n k k e e l l e + u u d i s t u s h a n k k e e n + u u d i s t u s h a n k k e e s s a + u u d i s t u s h a n k k e e s t a + u u d i s t u s h a n k k e e t + u u d i s t u s h a n k k e i d e n + u u d i s t u s h a n k k e i s i i n + u u d i s t u s h a n k k e i t a + u u d i s t u s i n n o s s a n n e + u u d i s t u s i n t o + u u d i s t u s i n t o a + u u d i s t u s j a k s o s t a + u u d i s t u s j o u k k o j a + u u d i s t u s j ä r j e s t e l y t + u u d i s t u s k a m p a n j a a n + u u d i s t u s k a u d e s s a + u u d i s t u s k e h i t y k s e s s ä + u u d i s t u s k e h i t y s + u u d i s t u s k e h y s + u u d i s t u s k e s k u s t e l u + u u d i s t u s k e s k u s t e l u a + u u d i s t u s k e s k u s t e l u i s s a + u u d i s t u s k e s k u s t e l u n + u u d i s t u s k e s k u s t e l u u n + u u d i s t u s k i e l t e i s y y s + u u d i s t u s k i e r r o k s e n + u u d i s t u s k o n f e r e n s s i + u u d i s t u s k y k y m m e + u u d i s t u s k y k y n s ä + u u d i s t u s k y k y y n + u u d i s t u s k y s y m y k s i i n + u u d i s t u s k y s y m y s t e n + u u d i s t u s l a i n + u u d i s t u s l i i k e + u u d i s t u s l i i k e t t ä + u u d i s t u s l i i k k e e n + u u d i s t u s l i i k k e e s e e n + u u d i s t u s l i i k k e i l l e + u u d i s t u s l i i k k e i s t ä + u u d i s t u s l i i k k e i t ä + u u d i s t u s l i i t t o o n + u u d i s t u s l i n j a n + u u d i s t u s l i n j a u k s i a + u u d i s t u s l u o n n o k s e s s a + u u d i s t u s l u o n n o s t e n + u u d i s t u s l u p a u k s e n + u u d i s t u s l ä h t ö k o h t i a + u u d i s t u s m a h d o l l i s u u k s i a + u u d i s t u s m a h d o l l i s u u k s i s t a + u u d i s t u s m a l l i n + u u d i s t u s m a l l i s s a + u u d i s t u s m e k a n i s m i + u u d i s t u s m e n e t e l m i i n + u u d i s t u s m e n e t t e l y i s s ä + u u d i s t u s m e n e t t e l y j ä + u u d i s t u s m e n e t t e l y s s ä + u u d i s t u s m e n e t t e l y ä + u u d i s t u s m i e l e s s ä + u u d i s t u s m i e l i a l a + u u d i s t u s m i e l i n e n + u u d i s t u s m i e l i s e l l e + u u d i s t u s m i e l i s e n ä + u u d i s t u s m i e l i s e t + u u d i s t u s m i e l i s i l l e + u u d i s t u s m i e l i s i s t ä + u u d i s t u s m i e l i s i ä + u u d i s t u s m i e l i s t e n + u u d i s t u s m i e l i s t ä + u u d i s t u s m i e l t ä + u u d i s t u s n e u v o t t e l u t + u u d i s t u s n ä k ö k o h t i a + u u d i s t u s o h j e l m a + u u d i s t u s o h j e l m a a + u u d i s t u s o h j e l m a a m m e + u u d i s t u s o h j e l m a a n + u u d i s t u s o h j e l m a a n n e + u u d i s t u s o h j e l m a a n s a + u u d i s t u s o h j e l m a l l a + u u d i s t u s o h j e l m a l l e + u u d i s t u s o h j e l m a n + u u d i s t u s o h j e l m a n n e + u u d i s t u s o h j e l m a n s a + u u d i s t u s o h j e l m a s s a + u u d i s t u s o h j e l m a s t a + u u d i s t u s o h j e l m a s t a a n + u u d i s t u s o h j e l m a t + u u d i s t u s o h j e l m i a + u u d i s t u s o h j e l m i e n + u u d i s t u s o h j e l m i i n + u u d i s t u s o h j e l m i i n s a + u u d i s t u s o h j e l m i l l a + u u d i s t u s o h j e l m i l l e + u u d i s t u s o h j e l m i s s a + u u d i s t u s o h j e l m i s t a + u u d i s t u s p a i n e + u u d i s t u s p a i n e e n + u u d i s t u s p a i n e e t + u u d i s t u s p a i n e i t a + u u d i s t u s p a k e t i l l a + u u d i s t u s p a k e t i l l e + u u d i s t u s p a k e t i n + u u d i s t u s p a k e t i s s a + u u d i s t u s p a k e t i s s a a n + u u d i s t u s p a k e t i s t a + u u d i s t u s p a k e t i t + u u d i s t u s p a k e t t i + u u d i s t u s p a k e t t i a + u u d i s t u s p a k e t t i a a n + u u d i s t u s p a k e t t i i n + u u d i s t u s p a k e t t i m m e + u u d i s t u s p a k e t t i n s a + u u d i s t u s p e r i a a t t e i s i i n + u u d i s t u s p e r u s t a n + u u d i s t u s p e r u s t e i t a + u u d i s t u s p o l i i t i k k o j a + u u d i s t u s p o l i t i i k a l l e + u u d i s t u s p o l i t i i k a l l e e n + u u d i s t u s p o l i t i i k a n + u u d i s t u s p o l i t i i k a s t a + u u d i s t u s p o l i t i i k k a + u u d i s t u s p o l i t i i k k a a + u u d i s t u s p o l i t i i k k a a n + u u d i s t u s p o l i t i i k k a a n s a + u u d i s t u s p o l i t i i k k o j e n + u u d i s t u s p o n n i s t e l u i l l e e n + u u d i s t u s p o n n i s t e l u i s s a a n + u u d i s t u s p o n n i s t e l u j a + u u d i s t u s p o n n i s t e l u t + u u d i s t u s p o n n i s t u k s e t + u u d i s t u s p o n n i s t u k s i a a n + u u d i s t u s p r o j e k t i + u u d i s t u s p r o s e s s e i h i n + u u d i s t u s p r o s e s s e i s s a + u u d i s t u s p r o s e s s e j a + u u d i s t u s p r o s e s s e j a a n + u u d i s t u s p r o s e s s i + u u d i s t u s p r o s e s s i a + u u d i s t u s p r o s e s s i a a n + u u d i s t u s p r o s e s s i e n + u u d i s t u s p r o s e s s i i n + u u d i s t u s p r o s e s s i l l e + u u d i s t u s p r o s e s s i l l e n n e + u u d i s t u s p r o s e s s i n + u u d i s t u s p r o s e s s i n s a + u u d i s t u s p r o s e s s i s s a + u u d i s t u s p r o s e s s i s s a a n + u u d i s t u s p r o s e s s i s t a + u u d i s t u s p r o s e s s i t + u u d i s t u s p y l v ä i d e n + u u d i s t u s p y r k i m y k s e n + u u d i s t u s p y r k i m y k s e n n e + u u d i s t u s p y r k i m y k s e s s ä + u u d i s t u s p y r k i m y k s e t + u u d i s t u s p y r k i m y k s i i n + u u d i s t u s p y r k i m y k s i l l e + u u d i s t u s p y r k i m y k s i s s ä n n e + u u d i s t u s p y r k i m y k s i s t ä + u u d i s t u s p y r k i m y k s i ä + u u d i s t u s p y r k i m y k s i ä ä n + u u d i s t u s p y r k i m y s + u u d i s t u s p y r k i m y s t e n + u u d i s t u s p ä ä t ö k s i s t ä + u u d i s t u s r a k e n t e e n + u u d i s t u s r a t k a i s u i h i n + u u d i s t u s r a t k a i s u j a + u u d i s t u s r y h m ä n + u u d i s t u s s i t o u m u k s i s t a + u u d i s t u s s o p i m u k s e e n + u u d i s t u s s o p i m u k s e k s i + u u d i s t u s s o p i m u k s e l l a + u u d i s t u s s o p i m u k s e l l a k i n + u u d i s t u s s o p i m u k s e l l e + u u d i s t u s s o p i m u k s e n + u u d i s t u s s o p i m u k s e s s a + u u d i s t u s s o p i m u k s e s t a + u u d i s t u s s o p i m u s + u u d i s t u s s o p i m u s e h d o t u k s e n + u u d i s t u s s o p i m u s l u o n n o k s e s s a + u u d i s t u s s o p i m u s l u o n n o s + u u d i s t u s s o p i m u s t a + u u d i s t u s s t r a t e g i a + u u d i s t u s s t r a t e g i a a + u u d i s t u s s t r a t e g i a a n + u u d i s t u s s t r a t e g i a l l a + u u d i s t u s s t r a t e g i a m m e + u u d i s t u s s t r a t e g i a n + u u d i s t u s s t r a t e g i a s s a + u u d i s t u s s t r a t e g i a s t a + u u d i s t u s s t r a t e g i o i d e n + u u d i s t u s s u u n n i t e l m a + u u d i s t u s s u u n n i t e l m a a + u u d i s t u s s u u n n i t e l m a a n + u u d i s t u s s u u n n i t e l m a l l e + u u d i s t u s s u u n n i t e l m a n + u u d i s t u s s u u n n i t e l m a s s a + u u d i s t u s s u u n n i t e l m a t + u u d i s t u s s u u n n i t e l m i a + u u d i s t u s s u u n n i t e l m i a a n + u u d i s t u s s u u n n i t e l m i e n + u u d i s t u s s u u n n i t e l m i e n s a + u u d i s t u s s u u n n i t e l m i i n + u u d i s t u s s u u n n i t e l m i s s a + u u d i s t u s s u u n t a u s + u u d i s t u s s u u n t a u s t a + u u d i s t u s t a + u u d i s t u s t a h d i s t a + u u d i s t u s t a h t i + u u d i s t u s t a h t i a + u u d i s t u s t a h t o + u u d i s t u s t a i s t e l u u n + u u d i s t u s t a l o u s a r v i o + u u d i s t u s t a p o j e n + u u d i s t u s t a r m o + u u d i s t u s t a r p e e n + u u d i s t u s t a r p e e s e e n + u u d i s t u s t a r p e e s t a + u u d i s t u s t a r p e e t + u u d i s t u s t a r p e i s i i n + u u d i s t u s t a r p e i s t a + u u d i s t u s t a r p e i t a + u u d i s t u s t a r v e + u u d i s t u s t a r v e t t a + u u d i s t u s t a v o i t t e e t + u u d i s t u s t a v o i t t e i l l e + u u d i s t u s t a v o i t t e i s i i n + u u d i s t u s t a v o i t t e i s t a + u u d i s t u s t a v o i t t e i t a + u u d i s t u s t e h t ä v ä s t ä + u u d i s t u s t e n + u u d i s t u s t o i m e n + u u d i s t u s t o i m e n p i t e i d e n + u u d i s t u s t o i m e n p i t e i l l ä + u u d i s t u s t o i m e n p i t e i s s ä + u u d i s t u s t o i m e n p i t e i s t ä + u u d i s t u s t o i m e n p i t e i t ä + u u d i s t u s t o i m e t + u u d i s t u s t o i m i a + u u d i s t u s t o i m i a a n + u u d i s t u s t o i m i e m m e + u u d i s t u s t o i m i e n + u u d i s t u s t o i m i i n + u u d i s t u s t o i m i l l e + u u d i s t u s t o i m i s s a + u u d i s t u s t o i m i s t a + u u d i s t u s t o i v e i t a + u u d i s t u s t u l o k s i a + u u d i s t u s t y ö + u u d i s t u s t y ö h ö n + u u d i s t u s t y ö l l ä + u u d i s t u s t y ö n + u u d i s t u s t y ö r y h m ä l t ä + u u d i s t u s t y ö r y h m ä n + u u d i s t u s t y ö s s ä ä n + u u d i s t u s t y ö t ä + u u d i s t u s t y ö t ä ä n + u u d i s t u s v a a t i m u k s i a + u u d i s t u s v a a t i m u k s i i n + u u d i s t u s v a i h e + u u d i s t u s v a i h t o e h d o i s t a + u u d i s t u s v a i h t o e h t o a + u u d i s t u s v a i h t o e h t o j a + u u d i s t u s v a l m i u d e s t a a n + u u d i s t u s v a l m i u s + u u d i s t u s v a l m i u t t a + u u d i s t u s v a s t a i n e n + u u d i s t u s v a u h d i n + u u d i s t u s v a u h t i + u u d i s t u s v a u h t i a + u u d i s t u s v a u h t i n s a + u u d i s t u s v i r t a a n + u u d i s t u s v o i m a t + u u d i s t u s v o i m i a + u u d i s t u s v o i m i l l e + u u d i s t u s v ä l i n e + u u d i s t u s v ä s y m y s t ä + u u d i s t u s y r i t y k s e s s ä + u u d i s t u t a a n + u u d i s t u t t a v a + u u d i s t u u + u u h i p a l k k i o i h i n + u u h i p a l k k i o i t a + u u m o i l t i i n + u u n i j ä ä t e l ö + u u n i l i n n u t + u u n i p e r u n a + u u n i s u r m a + u u p u m a a n + u u p u m a t t a + u u r a s t a m i s e e n + u u r a s t a n e e t + u u r a s t a t t e + u u r a s t u k s e n + u u r n a k e n t t ä k u l t t u u r i + u u r n a s t a + u u r n i e n + u u r n i l l e + u u r n i l t a + u u r r e k i e l i + u u r r e m a a t ä h t i + u u r r e p e s ä s i e n i + u u s a s i a l l i s u u s + u u s e k s p r e s s i o n i s m i + u u s e l i n t a r v i k e + u u s e l i n t a r v i k e a s e t u k s e e n + u u s e l i n t a r v i k e a s e t u k s e l l e + u u s e l i n t a r v i k e a s e t u k s e n + u u s e l i n t a r v i k e a s e t u k s e s s a + u u s e l i n t a r v i k e a s e t u k s e s t a + u u s e l i n t a r v i k e a s e t u s + u u s e l i n t a r v i k e d i r e k t i i v i + u u s e l i n t a r v i k e d i r e k t i i v i n + u u s e l i n t a r v i k e d i r e k t i i v i ä + u u s e l i n t a r v i k e t t a + u u s e l i n t a r v i k k e e l l a + u u s e l i n t a r v i k k e e t + u u s e l i n t a r v i k k e i d e n + u u s e l i n t a r v i k k e i l l a + u u s e l i n t a r v i k k e i l l e + u u s e l i n t a r v i k k e i s i i n + u u s e l i n t a r v i k k e i s s a + u u s e l i n t a r v i k k e i s t a + u u s e l i n t a r v i k k e i t a + u u s f a s i s m i + u u s f a s i s m i a + u u s f a s i s m i n + u u s f a s i s t i t + u u s i a + u u s i a k i n + u u s i e n + u u s i i n + u u s i j o i d e n + u u s i k a a m m e + u u s i k a a n + u u s i k u u + u u s i l l a + u u s i l l e + u u s i l t a + u u s i m a a n + u u s i m a t t a + u u s i m i s e s s a + u u s i m i s p r o s e s s i + u u s i m i s t a + u u s i m i s v a a r a n + u u s i m i s v ä l i + u u s i m m a l l e + u u s i m m a n + u u s i m m a s s a + u u s i m m a s t a + u u s i m m a t + u u s i m m i l l a + u u s i m m i s s a + u u s i m m i s t a + u u s i m p a a n + u u s i m p i a + u u s i m p i e n + u u s i m p i i n + u u s i n + u u s i n a + u u s i n e + u u s i n t a i n v e s t o i n t e i h i n + u u s i n t a k ä s i t t e l y j ä + u u s i n t a k ä s i t t e l y t i l a i s u u t t a + u u s i n t a m e n e t t e l y ä + u u s i n t a m i s t y ö n + u u s i n t a o t t e l u i t a + u u s i n t a p r e s i d e n t i n v a a l e i s s a + u u s i n t a v a a l e i s s a + u u s i o k ä y t t ö j ä r j e s t e l m ä + u u s i o k ä y t t ö p a k k a u k s i l l e + u u s i o k ä y t t ö p a k k a u s t e n + u u s i o r a a k a + u u s i s e e l a n t i l a i s e n + u u s i s e e l a n t i l a i s e s t a + u u s i s e e l a n t i l a i s e t + u u s i s e e l a n t i l a i s t e n + u u s i s s a + u u s i s s a k i n + u u s i s t a + u u s i t a + u u s i t t a e s s a + u u s i t t u + u u s i u t u a + u u s i u t u i s i + u u s i u t u m a t t o m a n + u u s i u t u m a t t o m a t + u u s i u t u m a t t o m i a + u u s i u t u m a t t o m i e n + u u s i u t u m a t t o m i s t a + u u s i u t u m i s s y k l i + u u s i u t u v a a + u u s i u t u v a a n + u u s i u t u v a k s i + u u s i u t u v a l l e + u u s i u t u v a n + u u s i u t u v a n a + u u s i u t u v a s t a + u u s i u t u v a t + u u s i u t u v i a + u u s i u t u v i e n + u u s i u t u v i i n + u u s i u t u v i k s i + u u s i u t u v i l l a + u u s i u t u v i l l e + u u s i u t u v i n + u u s i u t u v i s s a + u u s i u t u v i s t a + u u s i v u o s i + u u s j a k o + u u s j a o n + u u s j a o s t a + u u s k l a s s i s e n + u u s k o l o n i a l i s m i + u u s k o l o n i a l i s m i a + u u s k o l o n i a l i s m i i n + u u s k o l o n i a l i s m i k s i + u u s k o l o n i a l i s m i l l e + u u s k o l o n i a l i s m i n + u u s k o l o n i a l i s m i s t a + u u s k o n s e r v a t i i v e j a + u u s k o n s e r v a t i i v i e n + u u s k o n s e r v a t i i v i s e n a + u u s k o n s e r v a t i i v i s t a + u u s k o n s e r v a t i i v i t + u u s k r i t i i k k i + u u s k ä y t ö n + u u s l i b e r a l i s m i + u u s l i b e r a l i s m i a + u u s l i b e r a l i s m i n + u u s l i b e r a l i s m i n s a + u u s l i b e r a l i s m i s t a + u u s l i b e r a l i s t i n + u u s l i b e r a l i s t i n e n + u u s l i b e r a l i s t i n e n k a a n + u u s l i b e r a l i s t i s e e n + u u s l i b e r a l i s t i s e k s i + u u s l i b e r a l i s t i s e l l e + u u s l i b e r a l i s t i s e m p i e n + u u s l i b e r a l i s t i s e n + u u s l i b e r a l i s t i s e s s a + u u s l i b e r a l i s t i s e s t a + u u s l i b e r a l i s t i s e t + u u s l i b e r a l i s t i s i a + u u s l i b e r a l i s t i s i i n + u u s l i b e r a l i s t i s i m m a t + u u s l i b e r a l i s t i s i s t a + u u s l i b e r a l i s t i s t a + u u s l i b e r a l i s t i s t e n + u u s l i b e r a l i s t i s u u t t a + u u s l i b e r a l i s t i t + u u s m e d i a + u u s m e d i a a + u u s m e d i a m a r k k i n o i l l a + u u s n a t s e i l t a + u u s n a t s e j a + u u s n a t s i e n + u u s n a t s i j ä r j e s t ö + u u s n a t s i p u o l u e + u u s n a t s i r y h m i e n + u u s n a t s i s m i + u u s n a t s i s m i a + u u s n a t s i s m i i n + u u s n a t s i s m i l l e + u u s n a t s i s m i n + u u s n a t s i s m i n a + u u s n a t s i t + u u s p a k a n u u s + u u s p e r h e i s s ä + u u s r e n e s s a n s s i + u u s r i k k a i d e n + u u s r o m a n t i i k k a + u u t e e n + u u t e k o h t a i s e t + u u t e n a + u u t e n a v u o t e n a + u u t i s a i h e + u u t i s a i h e i t a + u u t i s a i n e i s t o a + u u t i s a n a l y y s i s s ä + u u t i s a n k k u r e i t a + u u t i s a n k k u r i + u u t i s a r k i s t o + u u t i s a r v o l t a a n + u u t i s a r v o n s a + u u t i s e e n + u u t i s e l l a + u u t i s e l t a + u u t i s e n + u u t i s e n a + u u t i s e s t a + u u t i s e t + u u t i s h a n k i n n a n + u u t i s i a + u u t i s i a m m e + u u t i s i i n + u u t i s i l l a + u u t i s i s s a + u u t i s i s t a + u u t i s k a n a v a + u u t i s k a n a v a l l a + u u t i s k a n a v i a + u u t i s k a n a v i e n + u u t i s k a t s a u s t e n + u u t i s k r i t e e r i t + u u t i s k u v i a + u u t i s l ä h e t y k s e s s ä + u u t i s l ä h e t y k s e t + u u t i s l ä h e t y k s i s s ä + u u t i s l ä h e t y k s i ä + u u t i s l ä h e t y s t e n + u u t i s m a a i l m a + u u t i s m e d i a n + u u t i s m e d i o i s t a + u u t i s n a u h a + u u t i s o h j e l m a n + u u t i s o h j e l m a s s a + u u t i s o h j e l m a s s a m m e + u u t i s o h j e l m a t + u u t i s o h j e l m i a + u u t i s o h j e l m i e n + u u t i s o h j e l m i s s a + u u t i s o h j e l m i s t a + u u t i s o i n n i l l e + u u t i s o i n n i n + u u t i s o i n n i s s a + u u t i s o i n n i s s a a n + u u t i s o i n t i a + u u t i s o i t a i s i + u u t i s o r g a n i s a a t i o i d e n + u u t i s o t s i k o i h i n + u u t i s o t s i k o i s s a + u u t i s o t s i k o i s t a + u u t i s o t s i k o t + u u t i s p a l v e l u l l e + u u t i s p a l v e l u n + u u t i s p i m e n t o + u u t i s p o r t a a l i n + u u t i s p ä t k i e n + u u t i s r a p o r t e i s t a + u u t i s r a p o r t i n + u u t i s r a p o r t t e j a + u u t i s r a p o r t t i + u u t i s r a p o r t t i e n + u u t i s r y h m i s s ä + u u t i s r y h m ä n ä + u u t i s s a a r r o n + u u t i s s a a r t o + u u t i s s e l o s t u k s i a + u u t i s s ä h k e e t + u u t i s t a + u u t i s t a p a h t u m a + u u t i s t e n + u u t i s t o i m i s t o + u u t i s t o i m i s t o j e n + u u t i s t o i m i s t o n + u u t i s t o i m i s t o t + u u t i s v u o d o t + u u t i s v ä l i n e i d e n + u u t t a + u u t t a m i s h a n k k e i t a + u u t t a m i s l i u o t t e i d e n + u u t t a m i s l i u o t t i m e t + u u t t a m i s m e n e t e l m i ä + u u t t a m i s m e n e t e l m ä + u u t t e r i e n + u u t t u k y y h k y + u u t u u d e n + u u t u u d e t + u u t u u k s i a + u u t u u s t u o t t e i t a + u u t u u s t u t k i m u s s e l o n t e o n + u u v u t t a v i e n + v a a ' a n k i e l i a s e m a + v a a d e a i k a + v a a d i m m e + v a a d i m m e k i n + v a a d i m m e k o + v a a d i n k i n + v a a d i t a + v a a d i t a a n + v a a d i t a a n k i n + v a a d i t t a e s s a + v a a d i t t a i s i i n + v a a d i t t e + v a a d i t t i i n + v a a d i t t u + v a a d i t t u a + v a a d i t t u a a n + v a a d i t t u j a + v a a d i t t u j e n + v a a d i t u l l a + v a a d i t u n + v a a d i t u s s a + v a a h t e r a n t e r v a t ä p l ä + v a a h t e r a s i i r a p p i + v a a h t e r a v y ö m i t t a r i + v a a h t o a a + v a a h t o a m i s e s s a + v a a h t o b i l e e t + v a a h t o k a r a m e l l e j a + v a a h t o k a r k k i k o e + v a a h t o m u o v e i h i n + v a a h t o m u o v i + v a a i t u s l a t t a + v a a k a l a u d a l l a + v a a k a l a u d a l l e + v a a k s i a i s e t + v a a k s i a i s h ä m ä h ä k k i + v a a k u n o i s t a + v a a l e a e r a k k o k o l i b r i + v a a l e a j o u l u r u u s u + v a a l e a j ä s e n r u o h o + v a a l e a k e l t a p e r h o n e n + v a a l e a k e l t a y ö k k ö n e n + v a a l e a k i i t ä j ä + v a a l e a k u l t a r i n t a + v a a l e a n p u n a i s t a + v a a l e a n p u n a i s t e n + v a a l e a n s i n i s e m p ä n ä + v a a l e a o l k i y ö k k ö n e n + v a a l e a o r a k a s + v a a l e a s i l m ä k u t o j a + v a a l e a t a p a k u l o + v a a l e a t ä h k ä m u n k k i + v a a l e a v i h e r b u l b u l i + v a a l e a v i h e r m e s i k k o + v a a l e i h i n + v a a l e i k s i + v a a l e i l l a + v a a l e i l l e + v a a l e i s s a + v a a l e i s t a + v a a l e j a + v a a l i a + v a a l i a i k a a n + v a a l i a i k a t a u l u + v a a l i a i k a t a u l u j e n + v a a l i a j a n k o h t a a n + v a a l i a l u e e l l a + v a a l i a l u e e l l a n i + v a a l i a l u e i s t a + v a a l i a p u + v a a l i a p u a + v a a l i a r g u m e n t i t + v a a l i a r v i o i n t i r y h m ä n + v a a l i a s e t e l m i s t a + v a a l i a s e t t a + v a a l i a s e t u k s e e n + v a a l i a s e t u k s e n + v a a l i a s i a n t u n t i j a a + v a a l i a s i a n t u n t i j o i d e n + v a a l i a s i a n t u n t i j o i s t a + v a a l i a v u n + v a a l i a v u s t a + v a a l i b o i k o t t i + v a a l i d e m o k r a t i a + v a a l i e d u s t u k s e s t a + v a a l i e h d o k k a a n a + v a a l i e h d o k k a i d e n + v a a l i e h d o k k a i t a + v a a l i e l i m e n + v a a l i e n + v a a l i e n a l u s a i k a a n + v a a l i e n a l u s a i k o j a + v a a l i e n e d i s t ä m i s m a t e r i a a l i n + v a a l i e n t a r k k a i l u v a l t u u s k u n n a n + v a a l i f a r s s i + v a a l i h a l l i n n o n + v a a l i h a l l i n t o + v a a l i h u o n e i s t o j e n + v a a l i h u o n e i s t o s s a + v a a l i j o h t a j a + v a a l i j u l i s t u k s e l t a + v a a l i j u l i s t u k s e s s a a n + v a a l i j u l i s t u k s i s s a + v a a l i j u l i s t u s + v a a l i j u l i s t u s t e n + v a a l i j ä r j e s t e l m i e n + v a a l i j ä r j e s t e l m i i n + v a a l i j ä r j e s t e l m i l l ä + v a a l i j ä r j e s t e l m i s s ä + v a a l i j ä r j e s t e l m i s t ä + v a a l i j ä r j e s t e l m i ä + v a a l i j ä r j e s t e l m ä + v a a l i j ä r j e s t e l m ä l l e + v a a l i j ä r j e s t e l m ä m m e + v a a l i j ä r j e s t e l m ä n + v a a l i j ä r j e s t e l m ä n ä + v a a l i j ä r j e s t e l m ä s s ä + v a a l i j ä r j e s t e l m ä s t ä + v a a l i j ä r j e s t e l m ä t + v a a l i j ä r j e s t e l m ä ä + v a a l i j ä r j e s t e l m ä ä n + v a a l i j ä r j e s t e l m ä ä n s ä + v a a l i j ä r j e s t e l y j e n + v a a l i j ä r j e s t y s + v a a l i k a l e n t e r i + v a a l i k a m p a n j a + v a a l i k a m p a n j a a + v a a l i k a m p a n j a a n + v a a l i k a m p a n j a a n s a + v a a l i k a m p a n j a h ä l y ä + v a a l i k a m p a n j a k a u s i + v a a l i k a m p a n j a k o n e i s t o s t a + v a a l i k a m p a n j a k s i + v a a l i k a m p a n j a k u s t a n n u k s i l l e + v a a l i k a m p a n j a k u s t a n n u s t e n + v a a l i k a m p a n j a l l a + v a a l i k a m p a n j a l l e + v a a l i k a m p a n j a l t a + v a a l i k a m p a n j a m e n e t t e l y i s t ä + v a a l i k a m p a n j a m m e + v a a l i k a m p a n j a n + v a a l i k a m p a n j a n k i n + v a a l i k a m p a n j a n s a + v a a l i k a m p a n j a s s a + v a a l i k a m p a n j a s s a a n + v a a l i k a m p a n j a s s a m m e + v a a l i k a m p a n j a s t a + v a a l i k a m p a n j a t + v a a l i k a m p a n j a t i l a i s u u s + v a a l i k a m p a n j o i d e n + v a a l i k a m p a n j o i h i n + v a a l i k a m p a n j o i n n i n + v a a l i k a m p a n j o i n n i s t a + v a a l i k a m p a n j o i n t i + v a a l i k a m p a n j o i n t i a + v a a l i k a m p a n j o i n t i i n + v a a l i k a m p a n j o i n t i n s a + v a a l i k a m p a n j o i s s a + v a a l i k a m p a n j o i s s a a n + v a a l i k a m p a n j o i t a + v a a l i k a m p p a i l u + v a a l i k a m p p a i l u u n + v a a l i k a u d e k s i + v a a l i k a u d e l l a + v a a l i k a u d e l l a m m e + v a a l i k a u d e l l e + v a a l i k a u d e l t a + v a a l i k a u d e n + v a a l i k a u d e s t a + v a a l i k a u s i + v a a l i k a u s i l l a + v a a l i k a u t e e n + v a a l i k a u t e m m e + v a a l i k a u t e n a + v a a l i k a u t e n i + v a a l i k a u t t a + v a a l i k e l p o i s u u s + v a a l i k e l p o i s u u s k y n n y s t ä + v a a l i k e s k u s t e l u s s a + v a a l i k e s k u s t e l u u n + v a a l i k i e l l o s t a + v a a l i k i e r r o k s e n + v a a l i k i e r r o s + v a a l i k i e r r o s t a + v a a l i k i e r t o a + v a a l i k i i n t i ö i t ä + v a a l i k i l p a i l u s s a + v a a l i k o k o u k s e s s a + v a a l i k o l l e g i o i t a + v a a l i k o m i s s i o + v a a l i k o m i s s i o n + v a a l i k o m i t e a + v a a l i k o m i t e a n + v a a l i k o n e + v a a l i k o o r d i n o i n t i r y h m ä + v a a l i k o u l u t u k s e e n + v a a l i k r i t e e r i e n + v a a l i k u l t t u u r i + v a a l i k u l t t u u r i l l a + v a a l i k u n i n g a s + v a a l i k u s t a n n u k s i a + v a a l i k u u m e e s t a + v a a l i k u u m e t t a + v a a l i k y n n y s + v a a l i k y n n y s t ä + v a a l i k y s y m y k s e n + v a a l i k y s y m y s t ä + v a a l i k ä y t t ä y t y m i s e e n + v a a l i k ä y t t ä y t y m i s t ä + v a a l i k ä y t ä n n ö t + v a a l i l a e i l l a + v a a l i l a e i s t a a n + v a a l i l a h j o n n a n + v a a l i l a i l l a + v a a l i l a i n + v a a l i l a i n s ä ä d ä n n ö n + v a a l i l a i n s ä ä d ä n n ö s s ä + v a a l i l a i n s ä ä d ä n n ö s t ä + v a a l i l a i n s ä ä d ä n t ö + v a a l i l a i n s ä ä d ä n t ö ä + v a a l i l a i n s ä ä d ä n t ö ä ä n + v a a l i l a i n s ä ä d ä n t ö ö n + v a a l i l a i s s a + v a a l i l a i s t a + v a a l i l a i t + v a a l i l a k e j a + v a a l i l a k i + v a a l i l a k i a + v a a l i l a k i e n + v a a l i l a k i i n + v a a l i l a k i i n s a + v a a l i l a u s e + v a a l i l a u t a k u n n a l l e + v a a l i l a u t a k u n n a n + v a a l i l a u t a k u n n a s t a + v a a l i l a u t a k u n n a t + v a a l i l a u t a k u n n i l l e + v a a l i l a u t a k u n t a + v a a l i l a u t a k u n t a a + v a a l i l a u t a k u n t a a n + v a a l i l a u t a k u n t i i n + v a a l i l i i k e + v a a l i l i i t t o + v a a l i l i p p u j e n + v a a l i l i s t o i l l a + v a a l i l i s t o i l l e + v a a l i l i s t o j e n + v a a l i l l a + v a a l i l o g o + v a a l i l u e t t e l o + v a a l i l u e t t e l o a + v a a l i l u e t t e l o i d e n + v a a l i l u e t t e l o i h i n + v a a l i l u e t t e l o i s s a + v a a l i l u e t t e l o i t a + v a a l i l u e t t e l o j e n + v a a l i l u e t t e l o l l a + v a a l i l u e t t e l o n + v a a l i l u e t t e l o n s a + v a a l i l u e t t e l o o n + v a a l i l u e t t e l o s s a + v a a l i l u e t t e l o s t a + v a a l i l u e t t e l o t + v a a l i l u p a u k s e n + v a a l i l u p a u k s e n a + v a a l i l u p a u k s e n a a n + v a a l i l u p a u k s e n s a + v a a l i l u p a u k s e s t a a n + v a a l i l u p a u k s e t + v a a l i l u p a u k s i a + v a a l i l u p a u k s i i n s a + v a a l i l u p a u k s i s t a + v a a l i l u p a u k s i s t a a n + v a a l i l u p a u s + v a a l i l u p a u s t a a n + v a a l i l u p a u s t e n + v a a l i l ä h e t y k s e n ä + v a a l i l ä h e t y s t ö n + v a a l i m a i n o n n a s t a + v a a l i m a l l a + v a a l i m a n i f e s t i + v a a l i m a r a t o n + v a a l i m a t e r i a a l i t + v a a l i m a t k a i l u s t a + v a a l i m e k a n i s m i a + v a a l i m e k a n i s m i n + v a a l i m e n e s t y k s e e n + v a a l i m e n e s t y k s e k s i + v a a l i m e n e s t y k s e n + v a a l i m e n e s t y k s e s t ä + v a a l i m e n e s t y k s e s t ä ä n + v a a l i m e n e s t y s + v a a l i m e n e s t y s t ä + v a a l i m e n e s t y s t ä ä n + v a a l i m e n e t e l m ä l l e + v a a l i m e n e t t e l y + v a a l i m e n e t t e l y e s i t y s t ä + v a a l i m e n e t t e l y i h i n + v a a l i m e n e t t e l y i s s ä + v a a l i m e n e t t e l y j e n + v a a l i m e n e t t e l y j ä + v a a l i m e n e t t e l y l l ä + v a a l i m e n e t t e l y n + v a a l i m e n e t t e l y s s ä + v a a l i m e n e t t e l y s t ä + v a a l i m e n e t t e l y y n + v a a l i m e n e t t e l y ä + v a a l i n + v a a l i n e u v o s t o l l e + v a a l i o h j e l m a + v a a l i o h j e l m a a + v a a l i o h j e l m a m m e + v a a l i o h j e l m a n + v a a l i o h j e l m a s t a a n + v a a l i o h j e l m i a + v a a l i o h j e l m i e n + v a a l i o h j e l m i l l a + v a a l i o i k e u d e n + v a a l i o i k e u d e s s a + v a a l i o i k e u k s i a + v a a l i o i k e u k s i e n + v a a l i o i k e u s + v a a l i o i k e u t t a + v a a l i o n g e l m a t + v a a l i o r g a n i s a a t i o + v a a l i o r g a n i s a a t i o l l e + v a a l i p a i k k o i h i n + v a a l i p a i n e e t + v a a l i p e r i a a t t e i d e n + v a a l i p e r i a a t t e i t a + v a a l i p e r i n t e i s i i n + v a a l i p e t o k s e n + v a a l i p e t o k s e s t a + v a a l i p e t o k s i a + v a a l i p e t o s + v a a l i p e t o s t a + v a a l i p i i r e i h i m m e + v a a l i p i i r e i h i n + v a a l i p i i r e i h i n s ä + v a a l i p i i r e i s s ä + v a a l i p i i r e i s s ä m m e + v a a l i p i i r e i s s ä n n e + v a a l i p i i r e i s s ä ä n + v a a l i p i i r e i s t ä + v a a l i p i i r e i s t ä m m e + v a a l i p i i r e j ä + v a a l i p i i r i + v a a l i p i i r i e n + v a a l i p i i r i i n + v a a l i p i i r i i n i + v a a l i p i i r i j a k o i n e e n + v a a l i p i i r i j ä r j e s t e l m ä + v a a l i p i i r i j ä r j e s t e l m ä n + v a a l i p i i r i k s i + v a a l i p i i r i m m e + v a a l i p i i r i n + v a a l i p i i r i n i + v a a l i p i i r i n s ä + v a a l i p i i r i s s ä + v a a l i p i i r i s s ä m m e + v a a l i p i i r i s s ä n i + v a a l i p i i r i s t ä + v a a l i p i i r i s t ä n i + v a a l i p i i r i t + v a a l i p i i r i t o i m i s t o o n i + v a a l i p i i r i v i i k k o a + v a a l i p i i r i v i i k k o j e n + v a a l i p i i r i v i i k o i l l a + v a a l i p i i r i ä + v a a l i p i i r i ä n i + v a a l i p i s t e e t + v a a l i p i s t e i t ä + v a a l i p o l i t i i k a s t a + v a a l i p o l i t i i k k a a + v a a l i p r o p a g a n d a + v a a l i p r o p a g a n d a a + v a a l i p r o p a g a n d a a n + v a a l i p r o p a g a n d a k o n e i s t o + v a a l i p r o p a g a n d a n + v a a l i p r o p a g a n d a n a + v a a l i p r o s e s s e i l l e + v a a l i p r o s e s s e j a + v a a l i p r o s e s s i + v a a l i p r o s e s s i a + v a a l i p r o s e s s i e n + v a a l i p r o s e s s i i n + v a a l i p r o s e s s i l l a + v a a l i p r o s e s s i l l e + v a a l i p r o s e s s i l t a + v a a l i p r o s e s s i n + v a a l i p r o s e s s i n s a + v a a l i p r o s e s s i s s a + v a a l i p r o s e s s i s t a + v a a l i p u h e e n v u o r o j a + v a a l i p u h e e s s a + v a a l i p u h e e t + v a a l i p u h e i s s a a n + v a a l i p u h e i s s a m m e + v a a l i p ä i v i k s i + v a a l i p ä i v ä + v a a l i p ä i v ä m ä ä r i ä + v a a l i p ä i v ä n + v a a l i p ä i v ä n ä + v a a l i p ä i v ä s t ä + v a a l i p ä i v ä t + v a a l i p ä i v ä ä + v a a l i p ä i v ä ä n + v a a l i p ä ä l l i k k ö + v a a l i p ä ä t ö k s e k s i + v a a l i r a h a s t o o n s a + v a a l i r a h o i t u k s e s t a + v a a l i r a h o i t u s + v a a l i r a h o i t u s k o h u + v a a l i r e k i s t e r e i h i n + v a a l i r e k i s t e r i n + v a a l i r e k i s t e r ö i n t i + v a a l i r e t o r i i k a n + v a a l i r e t o r i i k a s t a + v a a l i r u h t i n a s + v a a l i r u t i i n i i n + v a a l i r y h m ä + v a a l i s a l a i s u u d e n + v a a l i s a l a i s u u s + v a a l i s a l a i s u u t t a + v a a l i s t r a t e g i a + v a a l i s t r a t e g i o i t a + v a a l i s u u n n i t e l m a t + v a a l i s y i s t ä + v a a l i s ä ä n n ö k s i ä + v a a l i s ä ä n n ö t + v a a l i s ä ä n t ö j e n + v a a l i s ä ä n t ö j ä + v a a l i t + v a a l i t a a n + v a a l i t a i s t e l u + v a a l i t a i s t e l u a + v a a l i t a i s t e l u j a + v a a l i t a i s t e l u n + v a a l i t a i s t e l u n s a + v a a l i t a i s t e l u s s a + v a a l i t a i s t e l u s t a + v a a l i t a i s t e l u u n + v a a l i t a i s t o a + v a a l i t a k t i k o i n n i n + v a a l i t a p a + v a a l i t a p a a n + v a a l i t a p a h t u m i s s a + v a a l i t a p p i o + v a a l i t a p p i o i t a + v a a l i t a p p i o n + v a a l i t a r k k a i l i j a a + v a a l i t a r k k a i l i j a m m e + v a a l i t a r k k a i l i j a n + v a a l i t a r k k a i l i j a n a + v a a l i t a r k k a i l i j a r y h m ä n + v a a l i t a r k k a i l i j a s t a + v a a l i t a r k k a i l i j a t + v a a l i t a r k k a i l i j a v a l t u u s k u n n a n + v a a l i t a r k k a i l i j a v a l t u u s k u n n a s t a + v a a l i t a r k k a i l i j a v a l t u u s k u n t a a + v a a l i t a r k k a i l i j a v a l t u u s k u n t a n a + v a a l i t a r k k a i l i j o i d e n + v a a l i t a r k k a i l i j o i l l e + v a a l i t a r k k a i l i j o i l t a + v a a l i t a r k k a i l i j o i n a + v a a l i t a r k k a i l i j o i s t a + v a a l i t a r k k a i l i j o i t a + v a a l i t a r k k a i l i j o i t a a n + v a a l i t a r k k a i l u + v a a l i t a r k k a i l u a + v a a l i t a r k k a i l u a l o i t t e i d e n + v a a l i t a r k k a i l u e l i n + v a a l i t a r k k a i l u k o k e m u k s e n s a + v a a l i t a r k k a i l u l a u t a k u n n a n + v a a l i t a r k k a i l u l a u t a k u n n a s s a + v a a l i t a r k k a i l u l a u t a k u n t a + v a a l i t a r k k a i l u l a u t a k u n t a a + v a a l i t a r k k a i l u m a t k a + v a a l i t a r k k a i l u m a t k a l t a + v a a l i t a r k k a i l u m a t k a n + v a a l i t a r k k a i l u m e n e t t e l y ä + v a a l i t a r k k a i l u n + v a a l i t a r k k a i l u o p e r a a t i o i d e n + v a a l i t a r k k a i l u o p e r a a t i o i h i n + v a a l i t a r k k a i l u o p e r a a t i o i l l a + v a a l i t a r k k a i l u o p e r a a t i o i s s a + v a a l i t a r k k a i l u o p e r a a t i o n + v a a l i t a r k k a i l u o p e r a a t i o o n + v a a l i t a r k k a i l u p o l i t i i k k a + v a a l i t a r k k a i l u r a p o r t i n + v a a l i t a r k k a i l u r a p o r t t i n i + v a a l i t a r k k a i l u r y h m i e n + v a a l i t a r k k a i l u r y h m ä + v a a l i t a r k k a i l u r y h m ä l l ä + v a a l i t a r k k a i l u r y h m ä m m e + v a a l i t a r k k a i l u r y h m ä n + v a a l i t a r k k a i l u r y h m ä ä + v a a l i t a r k k a i l u r y h m ä ä n + v a a l i t a r k k a i l u s s a + v a a l i t a r k k a i l u s t a + v a a l i t a r k k a i l u t e h t ä v i e n + v a a l i t a r k k a i l u t e h t ä v i i n + v a a l i t a r k k a i l u t e h t ä v i ä + v a a l i t a r k k a i l u t e h t ä v ä n s ä + v a a l i t a r k k a i l u t e h t ä v ä s s ä + v a a l i t a r k k a i l u t e h t ä v ä t + v a a l i t a r k k a i l u t e h t ä v ä ä + v a a l i t a r k k a i l u t e h t ä v ä ä n + v a a l i t a r k k a i l u t e h t ä v ä ä n s ä + v a a l i t a r k k a i l u t o i m i n n a s t a + v a a l i t a r k k a i l u t o i m i n t a a n + v a a l i t a r k k a i l u t o i m i n t a m m e + v a a l i t a r k k a i l u t y ö h ö n + v a a l i t a r k k a i l u t y ö l l ä + v a a l i t a r k k a i l u u n + v a a l i t a r k k a i l u v a l i o k u n n a n + v a a l i t a r k k a i l u v a l m i u k s i e n + v a a l i t a r k k a i l u v a l t u u s k u n n a l l e + v a a l i t a r k k a i l u v a l t u u s k u n n a n + v a a l i t a r k k a i l u v a l t u u s k u n n a t + v a a l i t a r k k a i l u v a l t u u s k u n n i l l a + v a a l i t a r k k a i l u v a l t u u s k u n n i l l e + v a a l i t a r k k a i l u v a l t u u s k u n n i s s a + v a a l i t a r k k a i l u v a l t u u s k u n n i s t a + v a a l i t a r k k a i l u v a l t u u s k u n t a + v a a l i t a r k k a i l u v a l t u u s k u n t a a + v a a l i t a r k k a i l u v a l t u u s k u n t a a n + v a a l i t a r k k a i l u v a l t u u s k u n t a m m e + v a a l i t a r k k a i l u v a l t u u s k u n t a n s a + v a a l i t a r k k a i l u v a l t u u s k u n t i a + v a a l i t a r k k a i l u v a l t u u s k u n t i e m m e + v a a l i t a r k k a i l u v a l t u u s k u n t i e n + v a a l i t a r k k a i l u v a l t u u s k u n t i i n + v a a l i t a r k o i t u k s i i n + v a a l i t a u k o a + v a a l i t a v a n + v a a l i t a v a s t a + v a a l i t e a t t e r i a + v a a l i t e e m a k s i + v a a l i t e m p p u + v a a l i t i e d o t t a m i s t a + v a a l i t i l a i s u u s + v a a l i t i l a n t e e s s a + v a a l i t o i m i k u n n a n + v a a l i t o i m i k u n t a + v a a l i t o i m i s t o + v a a l i t t a v a + v a a l i t t u + v a a l i t u e l l e + v a a l i t u e n + v a a l i t u e s t a + v a a l i t u k e e n + v a a l i t u k i o h j e l m a n + v a a l i t u k i p a k e t i n + v a a l i t u l o k s e e m m e + v a a l i t u l o k s e e n + v a a l i t u l o k s e n + v a a l i t u l o k s e s t a + v a a l i t u l o k s e t + v a a l i t u l o k s i a + v a a l i t u l o k s i i n + v a a l i t u l o k s i s t a + v a a l i t u l o s + v a a l i t u l o s t a + v a a l i t u l o s t e n + v a a l i t u r i s m i a + v a a l i t u r i s m i n a + v a a l i t y ö l l e e n + v a a l i t y ö n t e k i j ö i t ä + v a a l i t y ö t ä ä n + v a a l i u u d i s t u k s e e n + v a a l i u u d i s t u k s e n + v a a l i u u d i s t u k s e s s a + v a a l i u u d i s t u k s e s t a + v a a l i u u d i s t u k s e t + v a a l i u u d i s t u s + v a a l i u u d i s t u s t a + v a a l i u u d i s t u s t e n + v a a l i u u r n a + v a a l i u u r n a a + v a a l i u u r n a n + v a a l i u u r n a t + v a a l i u u r n i a + v a a l i u u r n i e n + v a a l i u u r n i l l a + v a a l i u u r n i l l e + v a a l i u u r n i l t a + v a a l i u u r n i s t a + v a a l i v a l i t u k s e t + v a a l i v a l i t u k s i a + v a a l i v a l m i s t e l u j a + v a a l i v a l m i s t e l u j e n + v a a l i v a l v o n n a s s a + v a a l i v a l v o n t a + v a a l i v a l v o n t a a n + v a a l i v a l v o n t a t e h t ä v i s t ä + v a a l i v a p a u s + v a a l i v a p a u t t a + v a a l i v a t + v a a l i v e t o o m u s t u o m i o i s t u i m e t + v a a l i v i l p i k s i + v a a l i v i l p i n + v a a l i v i l p i s t ä + v a a l i v i l p p i + v a a l i v i l p p i i n + v a a l i v i l p p i ä + v a a l i v i r a n o m a i s i a + v a a l i v i r a n o m a i s t e n + v a a l i v o i t o l t a + v a a l i v o i t o n + v a a l i v o i t o s s a + v a a l i v o i t o s t a + v a a l i v o i t o s t a a n + v a a l i v o i t o t + v a a l i v o i t t a j a n + v a a l i v o i t t o + v a a l i v o i t t o a + v a a l i v o i t t o j a + v a a l i v o i t t o n s a + v a a l i v o i t t o o n + v a a l i v u o d e l l e + v a a l i v u o d e n + v a a l i v u o d e s t a + v a a l i v u o n n a + v a a l i v u o s i + v a a l i v u o s i n a + v a a l i v u o t e n a + v a a l i v u o t t a + v a a l i v ä i t t e l y j e n + v a a l i y k s i k k ö + v a a l i y m p ä r i s t ö + v a a l i y ö n ä + v a a n i i + v a a n i m a s s a + v a a r a a + v a a r a a n + v a a r a k s i + v a a r a l l i s e e n + v a a r a l l i s e k s i + v a a r a l l i s e l l a + v a a r a l l i s e l l e + v a a r a l l i s e l t a + v a a r a l l i s e m m a k s i + v a a r a l l i s e m m a l t a + v a a r a l l i s e m m a n + v a a r a l l i s e m m i k s i + v a a r a l l i s e m m i l l e + v a a r a l l i s e m p a a + v a a r a l l i s e m p a a n + v a a r a l l i s e m p i + v a a r a l l i s e m p i a + v a a r a l l i s e m p i e n + v a a r a l l i s e m p i i n + v a a r a l l i s e m p i n a + v a a r a l l i s e n + v a a r a l l i s e n a + v a a r a l l i s e s s a + v a a r a l l i s e s t a + v a a r a l l i s e t + v a a r a l l i s i a + v a a r a l l i s i a k i n + v a a r a l l i s i i n + v a a r a l l i s i k s i + v a a r a l l i s i l l a + v a a r a l l i s i l t a + v a a r a l l i s i m m a k s i + v a a r a l l i s i m m a n + v a a r a l l i s i m m a t + v a a r a l l i s i m m i l l e + v a a r a l l i s i m m i l t a + v a a r a l l i s i m m i s t a + v a a r a l l i s i m p a a n + v a a r a l l i s i m p i a + v a a r a l l i s i m p i e n + v a a r a l l i s i m p i i n + v a a r a l l i s i m p i n a + v a a r a l l i s i n + v a a r a l l i s i n e + v a a r a l l i s i n t a + v a a r a l l i s i s t a + v a a r a l l i s t a + v a a r a l l i s t e n + v a a r a l l i s u u d e s t a + v a a r a l l i s u u s n ä k ö k o h t a a + v a a r a l l i s u u s t a s o t + v a a r a l u o k a t + v a a r a n + v a a r a n a + v a a r a n l ä h t e e n + v a a r a n l ä h t e i s t ä + v a a r a n m e r k i t + v a a r a n m e r k k e j ä + v a a r a n n a m m e + v a a r a n n e t a + v a a r a n n e t a a n + v a a r a n n e t t a i s i + v a a r a n n e t t a i s i i n + v a a r a n n e t t u + v a a r a n n e t t u j a + v a a r a n p a i k k o j a + v a a r a n s a + v a a r a n s i + v a a r a n t a a + v a a r a n t a i s i + v a a r a n t a i s i m m e + v a a r a n t a i s i v a t + v a a r a n t a m a a n + v a a r a n t a m a t t a + v a a r a n t a m i n e n + v a a r a n t a m i s e s t a + v a a r a n t a m i s t a + v a a r a n t a n e e t + v a a r a n t a n u t + v a a r a n t a v a + v a a r a n t a v a n + v a a r a n t a v a t + v a a r a n t a v a t k o + v a a r a n t a v i a + v a a r a n t a v i s t a + v a a r a n t u a + v a a r a n t u e s s a + v a a r a n t u m a t t a + v a a r a n t u m i s e e n + v a a r a n t u n u t + v a a r a n t u u + v a a r a n t u v a t + v a a r a s s a + v a a r a s t a + v a a r a t + v a a r a t a s o a + v a a r a t e k i j ä + v a a r a t e k i j ä n + v a a r a t e k i j ä t + v a a r a t e k i j ö i d e n + v a a r a t e k i j ö i t ä + v a a r a t i l a n n e + v a a r a t i l a n t e e n + v a a r a t i l a n t e e s s a + v a a r a t i l a n t e e t + v a a r a t i l a n t e i d e n + v a a r a t i l a n t e i s s a + v a a r a t i l a n t e i s t a + v a a r a t i l a n t e i t a + v a a r a t o n t a + v a a r a t t o m a a n + v a a r a t t o m a m p a a + v a a r a t t o m a m p i + v a a r a t t o m a m p i a + v a a r a t t o m a n + v a a r a t t o m a s t a + v a a r a t t o m a t + v a a r a t t o m i a + v a a r a t t o m i e n + v a a r a t t o m i i n + v a a r a t t o m i k s i + v a a r a t t o m i l l e + v a a r a t t o m u u s k y n n y s t ä + v a a r a v a r o i t u k s e t + v a a r a v y ö h y k k e e l l e + v a a r a v y ö h y k k e e l l ä + v a a r a v y ö h y k k e e s e e n + v a a r a v y ö h y k k e e s s ä + v a a r a v y ö h y k k e i l l ä + v a a r a v y ö h y k k e i t ä + v a a r i n k a k t u s + v a a r o i h i n + v a a r o i l t a + v a a r o i n e e n + v a a r o i s t a + v a a r o j a + v a a r o j e n + v a a t e a l a l l a + v a a t e a l a n + v a a t e e n + v a a t e i l l e m m e + v a a t e k a u p p a k e t j u n + v a a t e k o i + v a a t e k o k o j a + v a a t e l a s t i + v a a t e l i i k k e e t + v a a t e m a r k k i n o i d e n + v a a t e m a r k k i n o i s t a + v a a t e m e r k i n + v a a t e m e r k k i e n + v a a t e r i p u s t i n + v a a t e t e h t a i s s a + v a a t e t e o l l i s u u d e l l e + v a a t e t e o l l i s u u d e n + v a a t e t e o l l i s u u d e s s a + v a a t e t e o l l i s u u d e s t a + v a a t e t e o l l i s u u s + v a a t e t e o l l i s u u t t a + v a a t e t u o t t e i t a + v a a t e t u s a l a + v a a t e t u s a l a a + v a a t e t u s a l a a n + v a a t e t u s a l a l l a + v a a t e t u s a l a n + v a a t e t u s a l a s t a + v a a t e t u s t e h d a s + v a a t e t u s t e k s t i i l e i h i n + v a a t e t u s t e k s t i i l i t u o t t e i d e n + v a a t e t u s t e o l l i s u u d e l l e + v a a t e t u s t e o l l i s u u d e n + v a a t e t u s t e o l l i s u u d e s s a + v a a t e t u s t e o l l i s u u d e s t a + v a a t e t u s t e o l l i s u u s + v a a t e t u s t e o l l i s u u t e e n + v a a t e t u s t u o t a n t o + v a a t e t u s t u o t t e i d e n + v a a t e t u s t u o t t e i s t a + v a a t e t u s v a l i o k u n n a n + v a a t e t u s y r i t y s t e n + v a a t e t y ö l ä i s t e n + v a a t e t ä i + v a a t i + v a a t i a + v a a t i a k s e e n + v a a t i a k s e n i + v a a t i a k s e n n e + v a a t i e n + v a a t i e s s a + v a a t i e s s a a n + v a a t i e s s a m m e + v a a t i i + v a a t i i k i n + v a a t i i k o + v a a t i j a t + v a a t i k a a m m e + v a a t i k o + v a a t i m a a + v a a t i m a a m m e + v a a t i m a a n + v a a t i m a l l a + v a a t i m a m m e + v a a t i m a n + v a a t i m a n i + v a a t i m a s s a + v a a t i m a s t a + v a a t i m a t + v a a t i m a t o n t a + v a a t i m a t t a + v a a t i m a t t o m a l l a + v a a t i m a t t o m a m m a k s i + v a a t i m a t t o m a m m a l l a + v a a t i m a t t o m a m m a n + v a a t i m a t t o m a m m a t + v a a t i m a t t o m a m m i n + v a a t i m a t t o m a m p a a + v a a t i m a t t o m a m p a a n + v a a t i m a t t o m a m p i + v a a t i m a t t o m a m p i a + v a a t i m a t t o m a m p i e n + v a a t i m a t t o m a m p i n a + v a a t i m a t t o m a n + v a a t i m a t t o m a t + v a a t i m a t t o m i a + v a a t i m a t t o m i l l e + v a a t i m a t t o m i m m a t k i n + v a a t i m a t t o m i m p i e n k i n + v a a t i m a t t o m i s s a + v a a t i m u k s e e m m e + v a a t i m u k s e e n + v a a t i m u k s e k s i + v a a t i m u k s e m m e + v a a t i m u k s e n + v a a t i m u k s e n a + v a a t i m u k s e n m u k a i s u u s i l m o i t u k s e s t a + v a a t i m u k s e n s a + v a a t i m u k s e s t a + v a a t i m u k s e s t a a n + v a a t i m u k s e t + v a a t i m u k s i a + v a a t i m u k s i a a n + v a a t i m u k s i a m m e + v a a t i m u k s i i n + v a a t i m u k s i k s i + v a a t i m u k s i l l a + v a a t i m u k s i l l e + v a a t i m u k s i s s a + v a a t i m u k s i s t a + v a a t i m u k s i s t a a n + v a a t i m u s j ä r j e s t e l m ä n + v a a t i m u s k o k o n a i s u u t t a + v a a t i m u s l u e t t e l o a + v a a t i m u s l u e t t e l o i t a + v a a t i m u s l u e t t e l o s t a + v a a t i m u s l u e t t e l o t + v a a t i m u s m ä ä r i t t e l y + v a a t i m u s p a k e t t i a + v a a t i m u s t a + v a a t i m u s t a m m e + v a a t i m u s t a s o + v a a t i m u s t a s o a + v a a t i m u s t a s o t + v a a t i m u s t e m m e + v a a t i m u s t e n + v a a t i m u s t e n m u k a i s i a + v a a t i m u s t e n m u k a i s i k s i + v a a t i m u s t e n m u k a i s u u s a i k a t a u l u + v a a t i m u s t e n m u k a i s u u s m e k a n i s m i s t a + v a a t i m u s t e n m u k a i s u u s m e n e t t e l y i s t ä + v a a t i m u s t e n m u k a i s u u s m e n e t t e l y t + v a a t i m u s t e n m u k a i s u u s m e r k i n n ä s t ä + v a a t i m u s t e n m u k a i s u u s m e r k i n t ä + v a a t i m u s t e n m u k a i s u u s m e r k i n t ä ä + v a a t i m u s t e n m u k a i s u u s m e r k k i + v a a t i m u s t e n m u k a i s u u s p a n e e l i + v a a t i m u s t e n m u k a i s u u s s e r t i f i k a a t t e j a + v a a t i m u s t e n m u k a i s u u s s ä ä n t ö j ä + v a a t i m u s t e n m u k a i s u u s v a k u u t u s + v a a t i m u s t e n m u k a i s u u s v a k u u t u s t a + v a a t i m u s t e n m u k a i s u u t e e n + v a a t i m u s t e n m u k a i s u u t t a + v a a t i m u s t e n v a s t a i s u u t t a + v a a t i n e e t + v a a t i n e i s t a + v a a t i n u t + v a a t i n u t k a a n + v a a t i s i m m e + v a a t i s i v a t + v a a t i v a a + v a a t i v a a n + v a a t i v a l l a + v a a t i v a m m a l l e + v a a t i v a m m a s t a + v a a t i v a m m a t + v a a t i v a m m i k s i + v a a t i v a m m i n + v a a t i v a m p a a + v a a t i v a m p i + v a a t i v a m p i a + v a a t i v a m p i e n + v a a t i v a m p i i n + v a a t i v a n + v a a t i v a t + v a a t i v a t k i n + v a a t i v i a + v a a t i v i e n + v a a t i v i i n + v a a t i v i m m a t + v a a t i v i m m i s t a + v a a t i v i m p i e n + v a a t i v i s s a + v a a t i v i s t a + v a a t i v u u d e s t a + v a a t t e e s e e n + v a a t t e e t + v a a t t e i d e n + v a a t t e i t a + v a a t t e i t a a n + v a d e l m a v i l l a s e l k ä + v a d i k o t t a r a i n e n + v a e l l u s k u l t t u u r i y h t e i s ö i s s ä + v a e l l u s k u l t t u u r i y h t e i s ö j e n + v a e l l u s l o h i k a n t a n s a + v a e l l u s n o p e u s + v a e l l u s r e i t e i s t ä + v a e l l u s s i r k u k s e m m e + v a e l t a j a m e s i k k o + v a e l t a j a p u h d i s t a j a + v a e l t a j a s i m p u k k a + v a e l t a v i a + v a e l t a v i s t a + v a g i n a m o n o l o g e j a + v a h a k a b i n e t t i + v a h a k a n g a s t a k k i + v a h a k e l t a s i i p i + v a h a k o p i o k o n e + v a h a k u r p i t s a + v a h a k ä s i t t e l y ä + v a h a m a a l a u s + v a h a n o k k a + v a h a n u k e n + v a h a p e n s a s + v a h a t a u l u + v a h i n g o i k s i + v a h i n g o i s t a + v a h i n g o i t a m m e + v a h i n g o i t a m m e k o + v a h i n g o i t a t t e + v a h i n g o i t e t a a n + v a h i n g o i t e t t a i s i + v a h i n g o i t e t t u + v a h i n g o i t t a a + v a h i n g o i t t a a k s e e n + v a h i n g o i t t a i s i + v a h i n g o i t t a i s i v a t + v a h i n g o i t t a m a t t a + v a h i n g o i t t a m i s e e n + v a h i n g o i t t a m i s e k s i + v a h i n g o i t t a m i s t a r k o i t u s + v a h i n g o i t t a n e e t + v a h i n g o i t t a n u t + v a h i n g o i t t a v a a n + v a h i n g o i t t a v a n + v a h i n g o i t t a v a t + v a h i n g o i t t a v i a + v a h i n g o i t t u e s s a + v a h i n g o i t t u m i n e n + v a h i n g o i t t u n e i m m i l l a + v a h i n g o i t t u n e i t a + v a h i n g o i t t u v a t + v a h i n g o k s i + v a h i n g o l l i s e e n + v a h i n g o l l i s e l t a + v a h i n g o l l i s e m m a t + v a h i n g o l l i s e m p a a + v a h i n g o l l i s e m p i + v a h i n g o l l i s e m p i e n + v a h i n g o l l i s e n + v a h i n g o l l i s e t + v a h i n g o l l i s i a + v a h i n g o l l i s i i n + v a h i n g o l l i s i l l a + v a h i n g o l l i s i m m a n + v a h i n g o l l i s i m m i s t a + v a h i n g o l l i s i n + v a h i n g o l l i s i s t a + v a h i n g o l l i s t a + v a h i n g o l l i s t e n + v a h i n g o l t a + v a h i n g o n + v a h i n g o n a i h e u t t a j a n + v a h i n g o n a i h e u t t a j i a + v a h i n g o n i l o a + v a h i n g o n k o r v a u k s e e n + v a h i n g o n k o r v a u k s e t + v a h i n g o n k o r v a u k s i a + v a h i n g o n k o r v a u k s i i n + v a h i n g o n k o r v a u k s i s t a + v a h i n g o n k o r v a u s j ä r j e s t e l m ä + v a h i n g o n k o r v a u s j ä r j e s t e l y j ä + v a h i n g o n k o r v a u s k a n t e e n + v a h i n g o n k o r v a u s k a n t e e t + v a h i n g o n k o r v a u s k a n t e i d e n + v a h i n g o n k o r v a u s k a n t e i s i i n + v a h i n g o n k o r v a u s k a n t e i s t a + v a h i n g o n k o r v a u s k a n t e i t a + v a h i n g o n k o r v a u s k y s y m y s t ä + v a h i n g o n k o r v a u s m a h d o l l i s u u k s i s t a + v a h i n g o n k o r v a u s o i k e u d e n + v a h i n g o n k o r v a u s o i k e u s + v a h i n g o n k o r v a u s o i k e u s a s i a t + v a h i n g o n k o r v a u s o i k e u t t a + v a h i n g o n k o r v a u s t e n + v a h i n g o n k o r v a u s v a a t e e t + v a h i n g o n k o r v a u s v a a t e i t a + v a h i n g o n k o r v a u s v a a t i m u k s i a + v a h i n g o n k o r v a u s v a a t i m u k s i i n + v a h i n g o n k o r v a u s v a a t i m u k s i l t a + v a h i n g o n k o r v a u s v a a t i m u s t a + v a h i n g o n k o r v a u s v a s t u u s s a + v a h i n g o n k o r v a u s v a s t u u s t a + v a h i n g o n k o r v a u s v a s t u u t a + v a h i n g o n k o r v a u s v e l v o l l i n e n + v a h i n g o n k o r v a u s v e l v o l l i s u u d e n + v a h i n g o n t e k o + v a h i n g o n t e k o a + v a h i n g o s t a + v a h i n g o t + v a h i n k o a + v a h i n k o a l u e e l l a + v a h i n k o a l u e i d e n + v a h i n k o a l u e i l l e + v a h i n k o a r v i o + v a h i n k o a r v i o n + v a h i n k o i h i n + v a h i n k o j a + v a h i n k o j e n + v a h i n k o j e n k a a n + v a h i n k o k a n t e i s t a + v a h i n k o k y n n y k s e n + v a h i n k o k y s y m y k s e s t ä + v a h i n k o l u o k i t u s t e n + v a h i n k o o n + v a h i n k o r i s k i + v a h i n k o t a p a u k s i s s a + v a h i n k o t y y p i t + v a h i n k o v a k u u t u k s i s t a + v a h i n k o v a k u u t u s d i r e k t i i v i i n + v a h i n k o v a k u u t u s d i r e k t i i v i n + v a h i n k o v a k u u t u s d i r e k t i i v i ä + v a h i n k o v a k u u t u s j ä r j e s t e l y j e n + v a h i n k o v a k u u t u s t a + v a h i n k o v a k u u t u s y r i t y k s i ä + v a h i n k o v a s t u u l a i n s ä ä d ä n n ö n + v a h i n k o v a s t u u l l e + v a h i n k o v a s t u u n + v a h i n k o v a s t u u s ä ä n n ö s t e n + v a h i n k o v a s t u u s ä ä n n ö t + v a h t i k o i r a + v a h t i k o i r a k o m i t e o i d e n + v a h t i k o i r a n + v a h t i k o i r a n a + v a h t i k o i r i a + v a h t i m e s t a r e i t a + v a h t i m e s t a r i a + v a h t i n a + v a h t i v u o r o i h i n + v a h t i v u o r o j a + v a h v a a + v a h v a a n + v a h v a k s i + v a h v a l l a + v a h v a l t a k a a n + v a h v a n + v a h v a n a + v a h v a s s a + v a h v a s t a + v a h v a t + v a h v e m m a l l a + v a h v e m m a n + v a h v e m m a s s a + v a h v e m m a s t a + v a h v e m m a t + v a h v e m m i n + v a h v e m p a a + v a h v e m p a a n + v a h v e m p a a n s a + v a h v e m p a n a + v a h v e m p i + v a h v e m p i a + v a h v e m p i e n + v a h v e m p i n a + v a h v e r o v a h a k a s + v a h v i m m a n + v a h v i m m a t + v a h v i m m i l l a a n + v a h v i m m i l t a + v a h v i m m i n + v a h v i m m i s t a + v a h v i m p a a n + v a h v i m p i a + v a h v i m p i e n + v a h v i n + v a h v i s t a a + v a h v i s t a a k s e e n + v a h v i s t a a k s e m m e + v a h v i s t a a k s e n i + v a h v i s t a a k s e n n e + v a h v i s t a e s s a a n + v a h v i s t a e s s a m m e + v a h v i s t a e s s a n i + v a h v i s t a i s i + v a h v i s t a k a a m m e + v a h v i s t a m a + v a h v i s t a m a a n + v a h v i s t a m a l l a + v a h v i s t a m a n a + v a h v i s t a m a s s a + v a h v i s t a m a t t a + v a h v i s t a m i n e n k a a n + v a h v i s t a m i s e e n + v a h v i s t a m i s e k s i + v a h v i s t a m i s e n + v a h v i s t a m i s e s s a + v a h v i s t a m i s e s t a + v a h v i s t a m i s j ä r j e s t e l y i s t ä + v a h v i s t a m i s m e n e t t e l y n + v a h v i s t a m i s p r o s e s s i + v a h v i s t a m i s p r o s e s s i n + v a h v i s t a m i s p ä ä t ö s t ä + v a h v i s t a m i s s t r a t e g i a + v a h v i s t a m i s s t r a t e g i a a + v a h v i s t a m i s s t r a t e g i a n + v a h v i s t a m i s t a + v a h v i s t a m i s t a v o i t e + v a h v i s t a m i s t i h e y t t ä + v a h v i s t a m i s t o i m i e n + v a h v i s t a m m e + v a h v i s t a m m e k o + v a h v i s t a n + v a h v i s t a n e e n i + v a h v i s t a n e e t + v a h v i s t a n u t + v a h v i s t a t t e + v a h v i s t a t t e k o + v a h v i s t a v a a + v a h v i s t a v a n + v a h v i s t a v a n n e + v a h v i s t a v a t + v a h v i s t a v a t k o + v a h v i s t e t a a n + v a h v i s t e t t a e s s a + v a h v i s t e t t a i s i i n + v a h v i s t e t t a v a + v a h v i s t e t t a v a n + v a h v i s t e t t a v i a + v a h v i s t e t t i i n + v a h v i s t e t t u a + v a h v i s t e t t u a a n + v a h v i s t e t t u j a + v a h v i s t e t t u j e n + v a h v i s t e t u i s t a + v a h v i s t e t u k s i + v a h v i s t e t u n + v a h v i s t e t u t + v a h v i s t i + v a h v i s t i m m e + v a h v i s t i v a t + v a h v i s t u a + v a h v i s t u e s s a + v a h v i s t u i + v a h v i s t u i s i + v a h v i s t u k s e n + v a h v i s t u m a a n + v a h v i s t u m a s s a + v a h v i s t u m i s e e n + v a h v i s t u m i s t a + v a h v i s t u m i s t a a n + v a h v i s t u m m e + v a h v i s t u n e e t + v a h v i s t u n u t + v a h v i s t u s k u u l e m i s e e n + v a h v i s t u s l a u s u m a a n s a + v a h v i s t u s m e n e t e l m ä n + v a h v i s t u s m e n e t t e l y k s i + v a h v i s t u s o p p i m i n e n + v a h v i s t u s t a + v a h v i s t u s t o i m i i n + v a h v i s t u s v i n o u m a + v a h v i s t u s ä ä n e s t y s + v a h v i s t u t t a v a + v a h v i s t u u + v a h v i s t u v a n + v a h v i s t u v a t + v a h v o i h i n + v a h v o i l l e + v a h v o i n a + v a h v o i s t a + v a h v o j a + v a h v o j e n + v a h v u i s e t + v a h v u u d e t + v a h v u u k s i a + v a h v u u k s i a a n + v a h v u u k s i i m m e + v a h v u u k s i s t a + v a h v u u t e e n + v a h v u u t e m m e + v a h v u u t e n a + v a h v u u t e n s a + v a h v u u t t a + v a i e n n e e t + v a i e n n u t + v a i e n t a a + v a i e n t a a k s e e n + v a i e n t a a k s e m m e + v a i e t a + v a i e t a a n + v a i e t e n + v a i e t k a a + v a i e t k o + v a i e t t a i s i i n + v a i e t t a v a + v a i e t t a v a n + v a i h d a m m e + v a i h d e l a a t i k o n + v a i h d e l l a + v a i h d e t a a n + v a i h d e t t a + v a i h d e t t a e s s a + v a i h d e t t a v i s s a + v a i h d o i s t a + v a i h d o k k a a t + v a i h d o n + v a i h d o s s a + v a i h d o s t a + v a i h d o t + v a i h e e l t a + v a i h e e n + v a i h e e s e e n + v a i h e e s s a + v a i h e e s t a + v a i h e i s i i n + v a i h e i s s a + v a i h e i t t a i s e e n + v a i h e i t t a i s t a + v a i h e j o h d i n + v a i h e k o h i n a + v a i h e k u l m a + v a i h e m o d u l a a t i o + v a i h e o n g e l m a + v a i h e t t a + v a i h e t t u m i s a l u e i l l a + v a i h t a a + v a i h t a a k s e e n + v a i h t a e s s a a n + v a i h t a m a a n + v a i h t a m a l l a + v a i h t a m a t t a + v a i h t a m i s e e n + v a i h t a m i s e k s i + v a i h t a m i s e n + v a i h t a m i s p e r i a a t e t t a + v a i h t a n u t + v a i h t a v a t + v a i h t e e n + v a i h t e i s t o ö l j y + v a i h t e l e e + v a i h t e l e e k o + v a i h t e l e v a a + v a i h t e l e v a m m a t + v a i h t e l e v a m p i + v a i h t e l e v a n + v a i h t e l e v a s s a + v a i h t e l e v a s t a + v a i h t e l e v a t + v a i h t e l e v i a + v a i h t e l e v i n + v a i h t e l e v i s s a + v a i h t e l i + v a i h t e l i s i + v a i h t e l u a + v a i h t e l u a s t e e n + v a i h t e l u j e n + v a i h t e l u m e k a n i s m i n + v a i h t e l u u n + v a i h t e l u v ä l e j ä + v a i h t e l u v ä l i + v a i h t e l u v ä l i n + v a i h t e l u v ä l i s s ä + v a i h t e l u v ä l i ä + v a i h t o a + v a i h t o a j a t + v a i h t o a r v o + v a i h t o a r v o s t a + v a i h t o a s t e i s t a + v a i h t o e h d o i l l a + v a i h t o e h d o i s t a + v a i h t o e h d o i s t a a n + v a i h t o e h d o k s i + v a i h t o e h d o l t a + v a i h t o e h d o n + v a i h t o e h d o s s a + v a i h t o e h d o s t a + v a i h t o e h d o t + v a i h t o e h t o + v a i h t o e h t o a + v a i h t o e h t o h a n k e t t a + v a i h t o e h t o h o i t o j e n + v a i h t o e h t o i h i n + v a i h t o e h t o i n a + v a i h t o e h t o i n e n + v a i h t o e h t o i s e e n + v a i h t o e h t o i s e k s i + v a i h t o e h t o i s e l l a + v a i h t o e h t o i s e n + v a i h t o e h t o i s e s t a + v a i h t o e h t o i s e s t i + v a i h t o e h t o i s e t + v a i h t o e h t o i s i a + v a i h t o e h t o i s i i n + v a i h t o e h t o i s i l l a + v a i h t o e h t o i s i l l e + v a i h t o e h t o i s i s s a + v a i h t o e h t o i s i s t a + v a i h t o e h t o i s k u s t a n n u s + v a i h t o e h t o i s t a + v a i h t o e h t o i s t e n + v a i h t o e h t o j a + v a i h t o e h t o j a a n + v a i h t o e h t o j a k i n + v a i h t o e h t o j e n + v a i h t o e h t o k o e m e n e t e l m i e n + v a i h t o e h t o l e n n o n + v a i h t o e h t o l i i k k e e n + v a i h t o e h t o l o m a i l u n + v a i h t o e h t o l ä ä k ä r e i t ä + v a i h t o e h t o l ä ä k ä r i t + v a i h t o e h t o m a l l e j a + v a i h t o e h t o m e n e t e l m i e n + v a i h t o e h t o m m e + v a i h t o e h t o n a + v a i h t o e h t o o n + v a i h t o e h t o p a k e t t i + v a i h t o e h t o p o l i t i i k k a + v a i h t o e h t o r a t k a i s u j a + v a i h t o e h t o r a t k a i s u t + v a i h t o e h t o r o c k + v a i h t o e h t o v a l t u u s k u n t a + v a i h t o e h t o v i l j e l y i s t ä + v a i h t o f o o r u m i a + v a i h t o h a n k k e e t + v a i h t o j a k s o + v a i h t o j ä r j e s t e l m i i n + v a i h t o j ä r j e s t e l m ä + v a i h t o j ä r j e s t e l m ä n + v a i h t o j ä r j e s t e l m ä ä + v a i h t o k a u p a t + v a i h t o k a u p o i n + v a i h t o k a u p o i s s a + v a i h t o k a u p p a a + v a i h t o k a u p p o j a + v a i h t o k u l u i s t a + v a i h t o k u l u j a + v a i h t o k u l u t + v a i h t o k u r s s e i h i n + v a i h t o k u r s s e i l l a + v a i h t o k u r s s e i s s a + v a i h t o k u r s s e i s t a + v a i h t o k u r s s e j a + v a i h t o k u r s s i + v a i h t o k u r s s i a + v a i h t o k u r s s i e n + v a i h t o k u r s s i i n + v a i h t o k u r s s i k r i t e e r i n + v a i h t o k u r s s i l l a + v a i h t o k u r s s i l l e + v a i h t o k u r s s i m e k a n i s m i e n + v a i h t o k u r s s i m e k a n i s m i i n + v a i h t o k u r s s i m e k a n i s m i n + v a i h t o k u r s s i n + v a i h t o k u r s s i n s a + v a i h t o k u r s s i p o l i t i i k a n + v a i h t o k u r s s i p o l i t i i k a s t a + v a i h t o k u r s s i p o l i t i i k k a a + v a i h t o k u r s s i p o l i t i i k k a a n + v a i h t o k u r s s i p o l i t i i k k a n s a + v a i h t o k u r s s i r i s k e j ä + v a i h t o k u r s s i r i s k i + v a i h t o k u r s s i r i s k i n + v a i h t o k u r s s i r i s k i t + v a i h t o k u r s s i s s a + v a i h t o k u r s s i s t a + v a i h t o k u r s s i s t r a t e g i a + v a i h t o k u r s s i s u h t e e n + v a i h t o k u r s s i t + v a i h t o k u r s s i t a v o i t e + v a i h t o k u s t a n n u k s e t + v a i h t o k u s t a n n u k s i a + v a i h t o m a h d o l l i s u u k s i a + v a i h t o m a k s u j e n + v a i h t o m e k a n i s m i a + v a i h t o m e n e t t e l y + v a i h t o m o o t t o r e i d e n + v a i h t o m o o t t o r e i h i n + v a i h t o m ä ä r ä + v a i h t o o n + v a i h t o p a l k k i o i s s a + v a i h t o p e n k i l l ä + v a i h t o p e r i a a t e + v a i h t o p o l i t i i k a s t a + v a i h t o p u t k e a + v a i h t o r a h a a + v a i h t o r a h a n + v a i h t o r a h a n a + v a i h t o s o p i m u k s e t + v a i h t o s u h t e e n + v a i h t o s u u n t a a j a + v a i h t o s ä h k ö m o o t t o r i + v a i h t o t a h t i + v a i h t o t a h t i a + v a i h t o t a s e + v a i h t o t a s e e l t a a n + v a i h t o t a s e e n + v a i h t o t a s e e s e e n + v a i h t o t a s e i d e n + v a i h t o t o i m i n t a + v a i h t o t o i m i n t a a n + v a i h t o t y ö + v a i h t o v a l u u t t a n a + v a i h t o v e l k a k i r j a + v a i h t o v e l k a k i r j a l a i n a l l a + v a i h t o v e l k a k i r j a l a i n a t + v a i h t o v e l k a k i r j a l a i n o j a + v a i h t o v i r t a + v a i h t o v ä l i n e e n ä + v a i h t u i s i + v a i h t u m a s s a + v a i h t u m i s e e n + v a i h t u m i s e n + v a i h t u n u t + v a i h t u u + v a i h t u v a s t a + v a i h t u v a t + v a i h t u v i s s a + v a i j e r i n + v a i k e a a + v a i k e a a n + v a i k e a k s i + v a i k e a l l a + v a i k e a l l e + v a i k e a l t a + v a i k e a l u k u i n e n + v a i k e a m m a k s i + v a i k e a m m a l t a + v a i k e a m m a n + v a i k e a m m a s s a + v a i k e a m m a s t a + v a i k e a m m a t + v a i k e a m m i k s i + v a i k e a m m i l l e + v a i k e a m m i n + v a i k e a m m i s s a + v a i k e a m m i s t a + v a i k e a m p a a + v a i k e a m p a a n + v a i k e a m p i + v a i k e a m p i a + v a i k e a m p i a k i n + v a i k e a m p i e n + v a i k e a m p i i n + v a i k e a n + v a i k e a n a + v a i k e a p ä ä s y i n e n + v a i k e a p ä ä s y i s e s s ä + v a i k e a p ä ä s y i s i ä + v a i k e a s e l k o i s e m m a n + v a i k e a s e l k o i s e m p i + v a i k e a s e l k o i s e n + v a i k e a s e l k o i s e t + v a i k e a s e l k o i s i a + v a i k e a s e l k o i s i l t a + v a i k e a s e l k o i s t a + v a i k e a s e l k o i s u u t t a + v a i k e a s s a + v a i k e a s s a k i n + v a i k e a s t a + v a i k e a t + v a i k e a t a + v a i k e a t a j u i s e m p a a + v a i k e a t a j u i s e n a + v a i k e a t a j u i s i a + v a i k e a t u l k i n t a i s i a + v a i k e i d e n + v a i k e i k s i + v a i k e i l t a + v a i k e i m m a k s i + v a i k e i m m a n + v a i k e i m m a s s a + v a i k e i m m a s t a + v a i k e i m m a t + v a i k e i m m a t k i n + v a i k e i m m i k s i + v a i k e i m m i l l a a n + v a i k e i m m i l t a + v a i k e i m m i n + v a i k e i m m i s s a + v a i k e i m m i s s a k i n + v a i k e i m m i s t a + v a i k e i m m i s t a k i n + v a i k e i m p a n a + v a i k e i m p i a + v a i k e i m p i e n + v a i k e i m p i i n + v a i k e i m p i i n k i n + v a i k e i m p i n a + v a i k e i m p i n a k i n + v a i k e i n + v a i k e i n a + v a i k e i n t a + v a i k e i s i i n + v a i k e i s s a + v a i k e i s s a k i n + v a i k e i s t a + v a i k e i t a + v a i k e n e e + v a i k e n e e k o + v a i k e n e m a a n + v a i k e n e m a l l a + v a i k e n e m a t t a + v a i k e n e m i s e l l a a n + v a i k e n e m i s e n + v a i k e n e m i s e s t a + v a i k e n e m i s e s t a n n e + v a i k e n e m i s o i k e u d e n + v a i k e n e m i s o i k e u s + v a i k e n e m i s o i k e u t t a + v a i k e n e m m e + v a i k e n e v a n + v a i k e n e v a t + v a i k e n e v a t k o + v a i k e n i + v a i k e n i v a t + v a i k e r o i v a t + v a i k e r t a j a k y y h k y + v a i k e r t a j a k y y h k y t + v a i k e r t a j a t u r t u r i k y y h k y + v a i k e u d e s t a + v a i k e u d e t + v a i k e u k s i a + v a i k e u k s i e n + v a i k e u k s i e n s a + v a i k e u k s i i n + v a i k e u k s i n + v a i k e u k s i n a + v a i k e u k s i s s a + v a i k e u k s i s s a k i n + v a i k e u k s i s t a + v a i k e u k s i s t a a n + v a i k e u k s i t t a + v a i k e u s a s t e + v a i k e u t a m m e + v a i k e u t e n a + v a i k e u t e t a a n + v a i k e u t t a a + v a i k e u t t a a k i n + v a i k e u t t a a k s e e n + v a i k e u t t a a k s e m m e + v a i k e u t t a e n + v a i k e u t t a i s i + v a i k e u t t a i s i v a t + v a i k e u t t a m a a n + v a i k e u t t a m a t t a + v a i k e u t t a m i s e k s i + v a i k e u t t a m i s e s t a + v a i k e u t t a m i s t a + v a i k e u t t a n e e t + v a i k e u t t a n u t + v a i k e u t t a v a t + v a i k e u t t a v a t k i n + v a i k e u t t i + v a i k e u t u a + v a i k e u t u i + v a i k e u t u i s i + v a i k e u t u m i n e n + v a i k e u t u m i s e e n + v a i k e u t u m i s e s t a + v a i k e u t u m i s t a a n + v a i k e u t u n u t + v a i k e u t u u + v a i k e u t u v a n + v a i k e u t u v a t + v a i k u t e l m a a + v a i k u t e l m a a n + v a i k u t e l m a n + v a i k u t e l m a n i + v a i k u t e l m i a n i + v a i k u t e t a + v a i k u t e t t a v a + v a i k u t t a a + v a i k u t t a a k o + v a i k u t t a a k s e e n + v a i k u t t a a k s e m m e + v a i k u t t a a k s e n i + v a i k u t t a e n + v a i k u t t a i s i + v a i k u t t a j i a + v a i k u t t a j i n a + v a i k u t t a j i s t a + v a i k u t t a m a a n + v a i k u t t a m a s s a + v a i k u t t a m a t t a + v a i k u t t a m i s e e n + v a i k u t t a m i s e n s a + v a i k u t t a m i s m a h d o l l i s u u k s i i n + v a i k u t t a m i s o i k e u d e t + v a i k u t t a n e e + v a i k u t t a n e e t + v a i k u t t a n u t + v a i k u t t a v a a + v a i k u t t a v a l l a + v a i k u t t a v a m m a n + v a i k u t t a v a m m i n + v a i k u t t a v a m p a a + v a i k u t t a v a m p i + v a i k u t t a v a m p i a + v a i k u t t a v a s t a + v a i k u t t a v a t + v a i k u t t a v i a + v a i k u t t a v i e n + v a i k u t t a v i i n + v a i k u t t a v i l l e + v a i k u t t a v i l t a + v a i k u t t a v i m m i s t a + v a i k u t t a v i n + v a i k u t t a v i s t a + v a i k u t t a v u u s k e r r o i n + v a i k u t t a v u u s p e r i a a t t e e m m e + v a i k u t t a v u u t t a + v a i k u t t a v u u t t a a n + v a i k u t t e i l l e + v a i k u t t e i t a + v a i k u t t i + v a i k u t t i m i a + v a i k u t t i m i s t a + v a i k u t t i v a t + v a i k u t u k s e e n + v a i k u t u k s e n + v a i k u t u k s e n a r v i o i n n i t + v a i k u t u k s e n a r v i o t + v a i k u t u k s e n s a + v a i k u t u k s e t + v a i k u t u k s i a + v a i k u t u k s i i n + v a i k u t u k s i l l e + v a i k u t u k s i l t a + v a i k u t u k s i l t a a n + v a i k u t u k s i n + v a i k u t u k s i n e e n + v a i k u t u k s i s t a + v a i k u t u s a i n e i d e n + v a i k u t u s a l a + v a i k u t u s a l u e + v a i k u t u s a l u e e l l a + v a i k u t u s a l u e e l l a a n + v a i k u t u s a l u e e l l e e n + v a i k u t u s a l u e e n + v a i k u t u s a l u e e n a a n + v a i k u t u s a l u e e s t a + v a i k u t u s a l u e i d e n + v a i k u t u s a l u e i l l a + v a i k u t u s a l u e i t a + v a i k u t u s a l u e t t a + v a i k u t u s a n a l y y s i + v a i k u t u s a n a l y y s i i n + v a i k u t u s a n a l y y s i n + v a i k u t u s a n a l y y s i t + v a i k u t u s a n a l y y s i ä + v a i k u t u s a r v i o + v a i k u t u s a r v i o i n n e i s t a + v a i k u t u s a r v i o i n n i n + v a i k u t u s a r v i o i n n i s s a + v a i k u t u s a r v i o i n n i s t a + v a i k u t u s a r v i o i n n i t + v a i k u t u s a r v i o i n t e i h i n + v a i k u t u s a r v i o i n t e j a + v a i k u t u s a r v i o i n t i + v a i k u t u s a r v i o i n t i a + v a i k u t u s a r v i o i n t i a a n + v a i k u t u s a r v i o i n t i e n + v a i k u t u s a r v i o i n t i i n + v a i k u t u s a r v i o i n t i t y ö t ä m m e + v a i k u t u s a r v i o i s t a + v a i k u t u s a r v i o i t a + v a i k u t u s a r v i o n + v a i k u t u s a r v i o o n + v a i k u t u s a r v i o t a + v a i k u t u s k e i n o j a + v a i k u t u s k e i n o k s i + v a i k u t u s k e n t t ä ä + v a i k u t u s k e t j u a + v a i k u t u s k y k y y n s ä + v a i k u t u s k y n n y s + v a i k u t u s m a h d o l l i s u u d e t + v a i k u t u s m a h d o l l i s u u k s i a + v a i k u t u s m a h d o l l i s u u k s i l l e + v a i k u t u s m a h d o l l i s u u s + v a i k u t u s m e k a n i s m e i s t a + v a i k u t u s m e n e t e l m ä + v a i k u t u s p i i r e i h i n + v a i k u t u s p i i r e i s s ä ä n + v a i k u t u s p i i r e i s t ä + v a i k u t u s p i i r e j ä + v a i k u t u s p i i r i + v a i k u t u s p i i r i i n + v a i k u t u s p i i r i i n s ä + v a i k u t u s p i i r i n + v a i k u t u s p i i r i n s ä + v a i k u t u s p i i r i n ä ä n + v a i k u t u s p i i r i s s ä + v a i k u t u s p i i r i s s ä ä n + v a i k u t u s p i i r i s t ä + v a i k u t u s p i i r i t + v a i k u t u s p i i r i ä + v a i k u t u s p i i r i ä m m e + v a i k u t u s p i i r i ä ä n + v a i k u t u s p i i r ä ä n + v a i k u t u s s e l v i t y k s i ä + v a i k u t u s t a + v a i k u t u s t a s o n + v a i k u t u s t e k i j ö i d e n + v a i k u t u s t e n + v a i k u t u s t e n a r v i o i d e n + v a i k u t u s t e n a r v i o i h i n + v a i k u t u s t e n a r v i o i n n e i l l a + v a i k u t u s t e n a r v i o i n n e i l t a + v a i k u t u s t e n a r v i o i n n e i s s a + v a i k u t u s t e n a r v i o i n n e i s t a + v a i k u t u s t e n a r v i o i n n i k s i + v a i k u t u s t e n a r v i o i n n i l l a + v a i k u t u s t e n a r v i o i n n i n + v a i k u t u s t e n a r v i o i n n i s s a + v a i k u t u s t e n a r v i o i n n i s s a a n + v a i k u t u s t e n a r v i o i n n i s t a + v a i k u t u s t e n a r v i o i n n i t + v a i k u t u s t e n a r v i o i n t e i h i n + v a i k u t u s t e n a r v i o i n t e i n e e n + v a i k u t u s t e n a r v i o i n t e j a + v a i k u t u s t e n a r v i o i n t i + v a i k u t u s t e n a r v i o i n t i a + v a i k u t u s t e n a r v i o i n t i a a n + v a i k u t u s t e n a r v i o i n t i e m m e + v a i k u t u s t e n a r v i o i n t i e n + v a i k u t u s t e n a r v i o i n t i e n n e + v a i k u t u s t e n a r v i o i n t i i n + v a i k u t u s t e n a r v i o i n t i j ä r j e s t e l m ä + v a i k u t u s t e n a r v i o i n t i j ä r j e s t e l m ä n + v a i k u t u s t e n a r v i o i n t i l a u t a k u n n a l l a + v a i k u t u s t e n a r v i o i n t i l a u t a k u n n a l l e + v a i k u t u s t e n a r v i o i n t i l a u t a k u n n a n + v a i k u t u s t e n a r v i o i n t i l a u t a k u n n a s s a + v a i k u t u s t e n a r v i o i n t i l a u t a k u n t a + v a i k u t u s t e n a r v i o i n t i l a u t a k u n t a a n + v a i k u t u s t e n a r v i o i n t i m e k a n i s m i + v a i k u t u s t e n a r v i o i n t i m e n e t t e l y i h i n + v a i k u t u s t e n a r v i o i n t i m e n e t t e l y j ä + v a i k u t u s t e n a r v i o i n t i m e n e t t e l y l l ä + v a i k u t u s t e n a r v i o i n t i m e n e t t e l y n + v a i k u t u s t e n a r v i o i n t i m e n e t t e l y y n + v a i k u t u s t e n a r v i o i n t i m m e + v a i k u t u s t e n a r v i o i n t i n s a + v a i k u t u s t e n a r v i o i n t i p r o s e s s i a + v a i k u t u s t e n a r v i o i n t i r a p o r t i n + v a i k u t u s t e n a r v i o i n t i t u t k i m u k s e n + v a i k u t u s t e n a r v i o i n t i t u t k i m u s t a + v a i k u t u s t e n a r v i o i n t i t y ö + v a i k u t u s t e n a r v i o i t a + v a i k u t u s t e n a r v i o n + v a i k u t u s t e n a r v i o t a + v a i k u t u s t u t k i m u k s e e n + v a i k u t u s t u t k i m u k s e n + v a i k u t u s t u t k i m u k s e s s a + v a i k u t u s t u t k i m u k s e s t a + v a i k u t u s t u t k i m u k s e t + v a i k u t u s t u t k i m u k s i a + v a i k u t u s t u t k i m u k s i i n + v a i k u t u s t u t k i m u s + v a i k u t u s t u t k i m u s t a + v a i k u t u s v a l l a n + v a i k u t u s v a l l a s t a a n + v a i k u t u s v a l t a + v a i k u t u s v a l t a a + v a i k u t u s v a l t a a m m e + v a i k u t u s v a l t a a n n e + v a i k u t u s v a l t a a n s a + v a i k u t u s v a l t a i n e n + v a i k u t u s v a l t a i s e m m a n + v a i k u t u s v a l t a i s e m p a a n + v a i k u t u s v a l t a i s e m p i + v a i k u t u s v a l t a i s e m p i a + v a i k u t u s v a l t a i s e m p i e n + v a i k u t u s v a l t a i s i a + v a i k u t u s v a l t a i s i l l e + v a i k u t u s v a l t a i s i m m a k s i + v a i k u t u s v a l t a i s i m m a n + v a i k u t u s v a l t a i s i m m a s t a + v a i k u t u s v a l t a i s i m m a t + v a i k u t u s v a l t a i s i m m i s t a + v a i k u t u s v a l t a i s i m p i a + v a i k u t u s v a l t a i s i m p i e n + v a i k u t u s v a l t a i s i n + v a i k u t u s v a l t a i s i n t a + v a i k u t u s v a l t a m m e + v a i k u t u s v a l t a n n e + v a i k u t u s v a l t a n s a + v a i k u t u s y r i t y k s i ä + v a i m e n n e t u i n + v a i m e n n u s s a r j a d i r e k t i i v i n + v a i m e n n u s t e k n i i k k a a n + v a i m e n t a a + v a i m e n t a m a a n + v a i m e n t a v a l l a + v a i m e n t i m e n a + v a i m e n t i m e t + v a i m e n t i m i s t a + v a i m o i l t a + v a i m o j e m m e + v a i m o m a t s k u a + v a i m o n i + v a i m o n n e + v a i m o n s a + v a i n a j i a + v a i n a j i e n + v a i n o a a + v a i n o a m i s e s t a + v a i n o a m i s h a r h a + v a i n o a m i s m e n e t e l m ä n s ä + v a i n o a m i s u h k a + v a i n o i s t a + v a i n o j a + v a i n o j e n + v a i n o l t a + v a i n o n + v a i n o o j a v i r a n o m a i s i a + v a i n o o n + v a i n o s i + v a i n o s t a + v a i n o t + v a i n o t a a n + v a i n o t t i i n + v a i n o t t u + v a i n o t t u a + v a i n o t t u j a + v a i n o t t u j e n + v a i n o t u i k s i + v a i n o t u i l t a + v a i n o t u i m m i s t a + v a i n o t u i n + v a i n o t u t + v a i n u k o i r i e n + v a i p p a f e t i s i s m i + v a i p p a p a v i a a n i + v a i p p a s a k a a l i + v a i p u i v a t + v a i s t o m a i s e n + v a i s t o n i + v a i s u j a + v a i s u n + v a i t e l i a a m p i + v a i t i o l o v e l v o l l i s u u d e n + v a i t i o l o v e l v o l l i s u u k s i e n + v a i t i o l o v e l v o l l i s u u s + v a i t o n a i s u u d e s t a a n + v a i v a a n t u m a t t a + v a i v a a n t u n e i s u u t t a n i + v a i v a a t + v a i v a a v a t + v a i v a a v i i n + v a i v a i s e n + v a i v a i s e s t a + v a i v a i s e t + v a i v a i s h i i r i + v a i v a i s k o i v u + v a i v a i s l e p a k k o + v a i v a i s p a j u + v a i v a i s p ä ä s t ä i n e n + v a i v a i s u k k o + v a i v a l l a + v a i v a l l o i s e m p a a + v a i v a l l o i s i a + v a i v a l l o i s t a + v a i v a n + v a i v a n n e e t + v a i v a n n ä k ö ä n n e + v a i v a n n ä ö n + v a i v a n n ä ö s t ä + v a i v a n n ä ö s t ä ä n + v a i v a r a + v a i v a s s a + v a i v a t + v a i v a t o n t a + v a i v a t t a + v a i v a t t o m a m m i n + v a i v a u t u m a t t a + v a i v a u t u n e e t + v a i v o j a a n + v a i v u t t u a a n + v a j a a k s i + v a j a a k ä y t t ö + v a j a a k ä y t t ö ä + v a j a a k ä y t t ö ö n + v a j a a k ä y t ö s s ä + v a j a a k ä y t ö s t ä + v a j a a t + v a j a a t a + v a j a a t y ö l l i s y y d e n + v a j a a t y ö l l i s y y s + v a j a a t y ö l l i s y y t e e n + v a j a v a i s u u k s i a + v a j a v a i s u u k s i n e e n k i n + v a j e e n + v a j e e n h a n + v a j e e s e e n + v a j e e s t a + v a j e i d e n + v a j e i t a + v a j e k r i i s i i n + v a j e k r i t e e r e j ä + v a j e l a s k e l m i s t a + v a j e o n g e l m i i n + v a j e t t a + v a j o a a + v a j o a m a t t a + v a j o t e s s a + v a k a a k s i + v a k a a l t a + v a k a a m m a l l a + v a k a a m m a n + v a k a a m m a s s a + v a k a a m m a s t a + v a k a a m m a t + v a k a a m m i k s i + v a k a a m m i l l a + v a k a a m m i l l e + v a k a a m m i n + v a k a a m p a a + v a k a a m p a a n + v a k a a m p i + v a k a a m p i a + v a k a a m p i e n + v a k a a m p i n a + v a k a a n + v a k a a n a + v a k a a s s a + v a k a a s t a + v a k a a t + v a k a a t a + v a k a i d e n + v a k a i m m a k s i + v a k a i m m a l t a + v a k a i m m a n + v a k a i m m i s t a + v a k a i m p i a k i n + v a k a i n a + v a k a i s s a + v a k a i t a + v a k a i t a k a a n + v a k a u d e l l a + v a k a u d e l l e + v a k a u d e n + v a k a u d e s t a + v a k a u m u k s e e n + v a k a u m u k s e e n i + v a k a u m u k s e l l i s e t + v a k a u m u k s e l l i s i a + v a k a u m u k s e l l i s i s t a + v a k a u m u k s e l t a a n + v a k a u m u k s e n + v a k a u m u k s e n i + v a k a u m u k s e n s a + v a k a u m u k s e n v a p a u d e n + v a k a u m u k s e s t a + v a k a u m u k s i a + v a k a u m u k s i s t a + v a k a u m u k s i s t a n i + v a k a u m u s t a a n + v a k a u m u s t a m m e + v a k a u m u s t e m m e + v a k a u s a s t e + v a k a u s f o o r u m i + v a k a u s f o o r u m i i n + v a k a u s f o o r u m i l l a + v a k a u s f o o r u m i n + v a k a u s f o o r u m i s s a + v a k a u s i n d e k s i s s ä + v a k a u s i n s t r u m e n t i n + v a k a u s i n s t r u m e n t t e j a + v a k a u s j ä r j e s t e l m ä t + v a k a u s k e s k u k s e n + v a k a u s k r i i s i ä + v a k a u s k r i t e e r e i k s i + v a k a u s k r i t e e r e j ä + v a k a u s k r i t e e r i + v a k a u s k r i t e e r i e n + v a k a u s k r i t e e r i t + v a k a u s k y s y m y s + v a k a u s m a k s u + v a k a u s m a k s u a + v a k a u s m a k s u i s t a + v a k a u s m a k s u n + v a k a u s m e k a n i s m e i h i n + v a k a u s m e k a n i s m e j a + v a k a u s m e k a n i s m i + v a k a u s m e k a n i s m i a + v a k a u s m e k a n i s m i e n + v a k a u s m e k a n i s m i i n + v a k a u s m e k a n i s m i l l a + v a k a u s m e k a n i s m i l l e + v a k a u s m e k a n i s m i n + v a k a u s m e k a n i s m i n n e + v a k a u s m e k a n i s m i s s a + v a k a u s m e k a n i s m i s t a + v a k a u s m e k a n i s m i t + v a k a u s m e n e t t e l y + v a k a u s n e u v o s t o + v a k a u s n e u v o s t o k s i + v a k a u s n e u v o s t o s t a + v a k a u s o h j e l m a + v a k a u s o h j e l m a a + v a k a u s o h j e l m a a n + v a k a u s o h j e l m a l l a + v a k a u s o h j e l m a n + v a k a u s o h j e l m a n s a + v a k a u s o h j e l m a s s a + v a k a u s o h j e l m a s s a a n + v a k a u s o h j e l m a s t a + v a k a u s o h j e l m a t + v a k a u s o h j e l m i a + v a k a u s o h j e l m i a a n + v a k a u s o h j e l m i e n + v a k a u s o h j e l m i e n s a + v a k a u s o h j e l m i i n + v a k a u s o h j e l m i i n s a + v a k a u s o h j e l m i l l a + v a k a u s o h j e l m i s s a + v a k a u s o h j e l m i s t a + v a k a u s o n g e l m a t + v a k a u s p a k e t i n + v a k a u s p a k e t t i + v a k a u s p a k e t t i a + v a k a u s p o l i i t t i s t a + v a k a u s p o l i t i i k a l l a + v a k a u s p o l i t i i k a n + v a k a u s p o l i t i i k a s s a + v a k a u s p o l i t i i k a s s a k i n + v a k a u s p o l i t i i k a s t a + v a k a u s p o l i t i i k k a + v a k a u s p o l i t i i k k a a + v a k a u s p o l i t i i k k a a n + v a k a u s p o l i t i i k k o j e n + v a k a u s p r o s e s s i + v a k a u s r a h a s t o + v a k a u s r a h a s t o n + v a k a u s r a h a s t o o n + v a k a u s r a h a s t o s t a + v a k a u s s o p i m u k s e e n + v a k a u s s o p i m u k s e k s i + v a k a u s s o p i m u k s e l l a + v a k a u s s o p i m u k s e l l e + v a k a u s s o p i m u k s e n + v a k a u s s o p i m u k s e n a + v a k a u s s o p i m u k s e n n e + v a k a u s s o p i m u k s e s s a + v a k a u s s o p i m u k s e s t a + v a k a u s s o p i m u k s e t + v a k a u s s o p i m u k s i i n + v a k a u s s o p i m u k s i n e e n + v a k a u s s o p i m u k s i s s a + v a k a u s s o p i m u s + v a k a u s s o p i m u s h i r v i ö n + v a k a u s s o p i m u s k u r i a + v a k a u s s o p i m u s l a s k e l m i s t a + v a k a u s s o p i m u s m a i s s a + v a k a u s s o p i m u s p o l i t i i k a n + v a k a u s s o p i m u s t a + v a k a u s s t r a t e g i a s t a + v a k a u s s u u n n i t e l m a + v a k a u s s u u n n i t e l m a n + v a k a u s s u u n n i t e l m a s s a + v a k a u s s u u n n i t e l m a s t a + v a k a u s s u u n n i t e l m a t + v a k a u s s u u n n i t e l m i a + v a k a u s s u u n n i t e l m i i n + v a k a u s s u u n n i t e l m i s t a + v a k a u s s y n t i s i n ä + v a k a u s s ä ä n t ö j e n + v a k a u s s ä ä n t ö j ä + v a k a u s s ä ä n t ö j ä m m e + v a k a u s t a r p e e n + v a k a u s t a s o + v a k a u s t a v o i t e + v a k a u s t a v o i t e t t a + v a k a u s t a v o i t t e e n + v a k a u s t a v o i t t e e t + v a k a u s t e k i j ä n + v a k a u s t i e t o i s i s s a + v a k a u s v a a t i m u s t e n + v a k a u s v a l v o n t a a + v a k a u s v i r a s t o + v a k a u s v ä l i n e e l l e m m e + v a k a u s v ä l i n e e l l ä + v a k a u s v ä l i n e e n + v a k a u s v ä l i n e e s e e n + v a k a u s v ä l i n e e s s ä + v a k a u s v ä l i n e e t + v a k a u t e e n + v a k a u t e t t a v a + v a k a u t e t t i i n + v a k a u t e t t u a + v a k a u t e t u s s a + v a k a u t t a + v a k a u t t a a + v a k a u t t a a k s e m m e + v a k a u t t a i s i + v a k a u t t a m a a n + v a k a u t t a m a t t a + v a k a u t t a m i s e e n + v a k a u t t a m i s e k s i + v a k a u t t a m i s e l l e + v a k a u t t a m i s e n + v a k a u t t a m i s e s s a + v a k a u t t a m i s e s t a + v a k a u t t a m i s h a n k k e e n + v a k a u t t a m i s j a k s o s t a + v a k a u t t a m i s j o u k k o j e n + v a k a u t t a m i s j o u k o t + v a k a u t t a m i s k r i t e e r e j ä + v a k a u t t a m i s k y s y m y k s e s s ä + v a k a u t t a m i s m a l l i + v a k a u t t a m i s m e n e t e l m ä s t ä + v a k a u t t a m i s m e n e t t e l y + v a k a u t t a m i s o h j e l m a + v a k a u t t a m i s o h j e l m a k s i + v a k a u t t a m i s o h j e l m a n + v a k a u t t a m i s o h j e l m a n n e + v a k a u t t a m i s o h j e l m i a + v a k a u t t a m i s o h j e l m i i n + v a k a u t t a m i s o h j e l m i s s a + v a k a u t t a m i s o p e r a a t i o i h i n + v a k a u t t a m i s p o l i t i i k a n + v a k a u t t a m i s p o l i t i i k a s t a + v a k a u t t a m i s p o l i t i i k k a + v a k a u t t a m i s p o l i t i i k k a a + v a k a u t t a m i s p o l i t i i k k o j e n + v a k a u t t a m i s p r o s e s s i + v a k a u t t a m i s p r o s e s s i a + v a k a u t t a m i s p r o s e s s i i n + v a k a u t t a m i s p r o s e s s i n + v a k a u t t a m i s p r o s e s s i s s a + v a k a u t t a m i s p y r k i m y k s e m m e + v a k a u t t a m i s p y r k i m y k s e t + v a k a u t t a m i s p y r k i m y k s i i n + v a k a u t t a m i s p y r k i m y k s i l l e + v a k a u t t a m i s p y r k i m y k s i ä + v a k a u t t a m i s r a h a s t o a + v a k a u t t a m i s r a h a s t o i s t a + v a k a u t t a m i s r a h a s t o t + v a k a u t t a m i s s o p i m u k s e e n + v a k a u t t a m i s s o p i m u k s e n + v a k a u t t a m i s s o p i m u k s e s t a + v a k a u t t a m i s s o p i m u k s i a + v a k a u t t a m i s s o p i m u s + v a k a u t t a m i s s o p i m u s t a + v a k a u t t a m i s s o p i m u s t e n + v a k a u t t a m i s s u u n n i t e l m a + v a k a u t t a m i s s u u n n i t e l m i e n + v a k a u t t a m i s t a + v a k a u t t a m i s t a l o u s a r v i o i t a + v a k a u t t a m i s t a r v e + v a k a u t t a m i s t a s o j a + v a k a u t t a m i s t e h t ä v i ä + v a k a u t t a m i s t o i m e n p i t e e t + v a k a u t t a m i s t o i m e n p i t e i l l e + v a k a u t t a m i s t o i m e n p i t e i s t ä + v a k a u t t a m i s t o i m e t + v a k a u t t a m i s t o i m i a + v a k a u t t a m i s t o i m i i n + v a k a u t t a m i s t o i m i s s a + v a k a u t t a m i s v a i h e e s s a + v a k a u t t a m i s v a i h e t t a + v a k a u t t a m i s v a i k e u k s i s t a + v a k a u t t a m i s v ä l i n e e t + v a k a u t t a m i s v ä l i n e i t ä + v a k a u t t a m i s v ä l i n e t t ä + v a k a u t t a m m e + v a k a u t t a n u t + v a k a u t t a v a + v a k a u t t a v a l l a + v a k a u t u m i s t a + v a k a u t u s a j a n j a k s o a + v a k a u t u s j a k s o + v a k a u t u s j o u k o i l l e + v a k a u t u s j o u k o i s t a + v a k a u t u s j o u k o t + v a k a u t u s j ä r j e s t e l m i ä + v a k a u t u s j ä r j e s t e l m ä n + v a k a u t u s j ä r j e s t e l m ä s t ä + v a k a u t u s j ä r j e s t e l m ä ä + v a k a u t u s j ä r j e s t e l m ä ä n + v a k a u t u s k e h y k s e s s ä + v a k a u t u s m e k a n i s m e i h i n + v a k a u t u s m e k a n i s m e i s t a + v a k a u t u s m e k a n i s m i + v a k a u t u s m e k a n i s m i a + v a k a u t u s m e k a n i s m i n + v a k a u t u s m e k a n i s m i s t a + v a k a u t u s m e n e t t e l y t + v a k a u t u s o h j e l m a a + v a k a u t u s o h j e l m a n + v a k a u t u s o h j e l m i e n + v a k a u t u s o h j e l m i i n + v a k a u t u s o n g e l m i a + v a k a u t u s p a k e t t i a + v a k a u t u s p o l i t i i k a n + v a k a u t u s p o l i t i i k k a + v a k a u t u s p r o s e s s i + v a k a u t u s p r o s e s s i a + v a k a u t u s p r o s e s s i n + v a k a u t u s p r o s e s s i s s a + v a k a u t u s r a h a s t o + v a k a u t u s r a h a s t o j e n + v a k a u t u s r a h a s t o n + v a k a u t u s r a h a s t o o n + v a k a u t u s r a h a s t o s s a + v a k a u t u s r a h a s t o s t a + v a k a u t u s s o p i m u k s e e n + v a k a u t u s s o p i m u k s e l l a + v a k a u t u s s o p i m u k s e l l e + v a k a u t u s s o p i m u k s e n + v a k a u t u s s o p i m u k s e s s a + v a k a u t u s s o p i m u k s e s t a + v a k a u t u s s o p i m u k s e t + v a k a u t u s s o p i m u k s i a + v a k a u t u s s o p i m u s + v a k a u t u s s o p i m u s t a + v a k a u t u s s o p i m u s t e n + v a k a u t u s s t r a t e g i a a + v a k a u t u s s u u n n i t e l m a + v a k a u t u s s u u n n i t e l m a n + v a k a u t u s s u u n n i t e l m a n n e + v a k a u t u s t e h t ä v ä + v a k a u t u s t o i m e n p i t e e t + v a k a u t u s t o i m i a + v a k a u t u s t o i m i e n + v a k a u t u s t o i m i n t a a m m e + v a k a u t u s v a i h e + v a k a u t u s v ä l i n e + v a k a u t u s v ä l i n e e l l ä + v a k a u t u s v ä l i n e e m m e + v a k a u t u s v ä l i n e e n + v a k a u t u s v ä l i n e e s e e n + v a k a u t u s v ä l i n e e s s ä + v a k a u t u s v ä l i n e e s t ä + v a k a u t u s v ä l i n e t t ä + v a k a u t u u + v a k a v a a + v a k a v a a n + v a k a v a h e n k i s e m m ä n + v a k a v a k s i + v a k a v a l l a + v a k a v a l l e + v a k a v a l t a + v a k a v a m i e l i s e n ä + v a k a v a m i e l i s i ä + v a k a v a m i e l i s t ä + v a k a v a m m a k s i + v a k a v a m m a l l a + v a k a v a m m a l l e + v a k a v a m m a l t a + v a k a v a m m a n + v a k a v a m m a n k i n + v a k a v a m m a s s a + v a k a v a m m a s t a + v a k a v a m m a t + v a k a v a m m i k s i + v a k a v a m m i l l a + v a k a v a m m i l t a + v a k a v a m m i n + v a k a v a m m i n k i n + v a k a v a m m i s s a + v a k a v a m m i s t a + v a k a v a m p a a + v a k a v a m p a a n + v a k a v a m p a n a + v a k a v a m p i + v a k a v a m p i a + v a k a v a m p i a k i n + v a k a v a m p i e n + v a k a v a m p i i n + v a k a v a m p i k i n + v a k a v a m p i n a + v a k a v a n + v a k a v a n a + v a k a v a n l a a t u i s t a + v a k a v a r a i s u u d e n + v a k a v a r a i s u u s a s t e t t a + v a k a v a r a i s u u s d i r e k t i i v i + v a k a v a r a i s u u s d i r e k t i i v i e n + v a k a v a r a i s u u s d i r e k t i i v i i n + v a k a v a r a i s u u s d i r e k t i i v i n + v a k a v a r a i s u u s d i r e k t i i v i s s ä + v a k a v a r a i s u u s d i r e k t i i v i ä + v a k a v a r a i s u u s e h d o t + v a k a v a r a i s u u s k e h y k s e m m e + v a k a v a r a i s u u s k e h y k s e n + v a k a v a r a i s u u s k o k e e s e e n + v a k a v a r a i s u u s k r i i s i + v a k a v a r a i s u u s k y s y m y k s e t + v a k a v a r a i s u u s k y s y m y k s i ä + v a k a v a r a i s u u s l a s k e l m a s s a + v a k a v a r a i s u u s l a s k e l m a s s a a n + v a k a v a r a i s u u s m a r g i n a a l i + v a k a v a r a i s u u s m ä ä r ä y s t e n + v a k a v a r a i s u u s o n g e l m a a n + v a k a v a r a i s u u s o n g e l m i l l a + v a k a v a r a i s u u s p e r u s t e e t + v a k a v a r a i s u u s p ä ä o m a n + v a k a v a r a i s u u s s u h t e e s e e n + v a k a v a r a i s u u s s ä ä n n ö i l l ä + v a k a v a r a i s u u s s ä ä n n ö k s i s t ä + v a k a v a r a i s u u s s ä ä n n ö s t e n + v a k a v a r a i s u u s s ä ä n n ö t + v a k a v a r a i s u u s s ä ä n t e l y n + v a k a v a r a i s u u s s ä ä n t ö i h i n + v a k a v a r a i s u u s s ä ä n t ö j e n + v a k a v a r a i s u u s s ä ä n t ö j ä + v a k a v a r a i s u u s t i l a + v a k a v a r a i s u u s t i l a n t e e n + v a k a v a r a i s u u s v a a t i m u k s e t + v a k a v a r a i s u u s v a a t i m u k s i a + v a k a v a r a i s u u s v a a t i m u s t e n + v a k a v a r a i s u u s v a l v o n n a n + v a k a v a r a i s u u s v a l v o n n a s s a + v a k a v a r a i s u u s v a l v o n t a + v a k a v a r a i s u u s v a l v o n t a a + v a k a v a r a i s u u s v a l v o n t a a n + v a k a v a r a i s u u t e e n + v a k a v a r a i s u u t e n s a + v a k a v a r a i s u u t t a + v a k a v a s s a + v a k a v a s t a + v a k a v a t + v a k a v i a + v a k a v i a k a a n + v a k a v i e n + v a k a v i i n + v a k a v i l l a + v a k a v i m m a l l a + v a k a v i m m a n + v a k a v i m m a s s a + v a k a v i m m a s t a + v a k a v i m m a t + v a k a v i m m i n + v a k a v i m m i s s a + v a k a v i m m i s t a + v a k a v i m p a a n + v a k a v i m p a n a + v a k a v i m p i a + v a k a v i m p i e n + v a k a v i m p i i n + v a k a v i n + v a k a v i n a + v a k a v i n e + v a k a v i n t a + v a k a v i s s a + v a k a v i s s a a n + v a k a v i s s a m m e + v a k a v i s s a n i + v a k a v i s t a + v a k a v u u d e l l a + v a k a v u u d e l l a a n + v a k a v u u d e l l e + v a k a v u u d e n + v a k a v u u d e s t a + v a k a v u u s a s t e e l l a + v a k a v u u s a s t e i d e n + v a k a v u u s l u o k i t t e l u n s a + v a k a v u u s l u o k i t u s t a + v a k a v u u s l u o k k i a + v a k a v u u t e n s a + v a k a v u u t t a + v a k i i n n u t e t t a v a + v a k i i n n u t e t t u + v a k i i n n u t t a a + v a k i i n n u t t a k a a m m e + v a k i i n n u t t a m a a n + v a k i i n n u t t a m a s s a + v a k i i n n u t t a m i n e n + v a k i i n n u t t a m i s a j a n j a k s o n + v a k i i n n u t t a m i s e e n + v a k i i n n u t t a m i s e k s i + v a k i i n n u t t a m i s e s s a + v a k i i n n u t t a m i s m ä ä r i i n + v a k i i n n u t t a m i s t a + v a k i i n n u t t a m i s t y ö h ö n + v a k i i n n u t t a n e e t + v a k i i n n u t t a n u t + v a k i i n t u a + v a k i i n t u e s s a + v a k i i n t u m a s s a + v a k i i n t u m i s a s t e + v a k i i n t u n e e m m a n + v a k i i n t u n e e m m a t + v a k i i n t u n e e m p i + v a k i i n t u n e e m p i a + v a k i i n t u n e e m p i i n + v a k i i n t u n e e n + v a k i i n t u n e e s s a + v a k i i n t u n e e s t a + v a k i i n t u n e e t + v a k i i n t u n e i d e n + v a k i i n t u n e i s s a + v a k i i n t u n e i s t a + v a k i i n t u n e i t a + v a k i i n t u n u t t a + v a k i i n t u u + v a k i i n t u v a t + v a k i l i s i n + v a k i n a i s e m p i a + v a k i n a i s e s s a + v a k i n a i s i a + v a k i n a i s i i n + v a k i n a i s i k s i + v a k i n a i s i s t a + v a k i n a i s t a m i s e e n + v a k i n a i s t e n + v a k i o a r v o i s e n a + v a k i o a u t o l u o k a t + v a k i o e d e l l y t y k s i ä + v a k i o e d u s t u s + v a k i o f u n k t i o + v a k i o h ä k k i + v a k i o i d u m p i a + v a k i o i l m a u k s e n + v a k i o i l m o i t u k s i l l a + v a k i o j o u k k o + v a k i o k a a v a k e + v a k i o k a a v a k k e i t a + v a k i o k a n t a j a n + v a k i o k a n t a j ä r j e s t e l m ä + v a k i o k a n t a n s a + v a k i o k e h y s + v a k i o k i r j e e n + v a k i o k ä y t ä n t ö + v a k i o k ä y t ä n t ö n ä + v a k i o l a u s e + v a k i o l a u s e k e + v a k i o l a u s e k k e e t + v a k i o l a u s e k k e i t a + v a k i o l o m a k e + v a k i o l o m a k k e e t + v a k i o l o m a k k e i d e n + v a k i o l ä ä k k e e t + v a k i o m a l l i k s i + v a k i o m a l l i n + v a k i o m a l l i s t a + v a k i o m e k a n i s m i + v a k i o m e k a n i s m i t + v a k i o m e n e t e l m ä n + v a k i o m e n e t e l m ä ä + v a k i o m e n e t t e l y + v a k i o m e n e t t e l y j e n + v a k i o m e n e t t e l y j ä + v a k i o m e n e t t e l y s t ä + v a k i o m e n e t t e l y y n + v a k i o m e r k i n t ä m a l l i s t a + v a k i o m u o d o s s a + v a k i o m u o t o i s t e n + v a k i o m ä ä r i t e l m ä + v a k i o m ä ä r i t e l m ä t + v a k i o m ä ä r ä n + v a k i o n o p e u d e n s ä ä d i n + v a k i o p a i k k a + v a k i o p a l k k a t a s o j e n + v a k i o p a l k k o j a + v a k i o p e r u s t e i d e n + v a k i o p i i r t e i s t ä + v a k i o p o l i t i i k k a a + v a k i o r a t k a i s u j a + v a k i o r e a k t i o + v a k i o r e i t i t + v a k i o s a t a m a + v a k i o s e u r a a m u k s i a + v a k i o s o p i m u k s e t + v a k i o s o p i m u s + v a k i o s ä i l ö ö n o t t o a i k a + v a k i o s ä ä n n ö t + v a k i o s ä ä n t ö j e n + v a k i o s ä ä n t ö j ä + v a k i o t a s o + v a k i o t a s o l l e + v a k i o t a v o i t t e e s e e n i + v a k i o t e k s t i + v a k i o t i e t o a + v a k i o t i e t o i h i n + v a k i o t i e t o j a + v a k i o t i e t o j e n + v a k i o t o i m e n p i t e e n ä + v a k i o t o i m i n n o i s t a + v a k i o t o i m i n t a m e n e t t e l y j ä + v a k i o t u r v a j ä r j e s t e l m ä ä + v a k i o v a a t i m u k s e t + v a k i o v a a t i m u k s i i n + v a k i o v a r u s t e e n a + v a k i o v a s t a u s + v a k i o v e i k k a u s + v a k i o v e r o p o l i t i i k k a + v a k i o v u o r o j a + v a k i o v ä l i n e + v a k i t u i s e s s a + v a k i t u i s e s t a + v a k i t u i s e t + v a k i t u i s i a + v a k i t u i s i l l e + v a k i t u i s i s t a + v a k i t u i s t a + v a k i t u i s t e n + v a k o i l u j u p a k k a + v a k o i l u j ä r j e s t e l m i e n + v a k o i l u j ä r j e s t e l m ä + v a k o i l u j ä r j e s t e l m ä k s i + v a k o i l u j ä r j e s t e l m ä y h t e i s t y ö t ä + v a k o i l u k o n e e t + v a k o i l u l a i t t e e t + v a k o i l u l e n t o j e n + v a k o i l u m u s e o + v a k o i l u n t o r j u n t a j ä r j e s t e l m ä ä + v a k o i l u n t o r j u n t a t o i m i n t a a + v a k o i l u p a l v e l u + v a k o i l u p a l v e l u m m e + v a k o i l u r i k o k s e e n + v a k o i l u s k a n d a a l i + v a k o i l u s y y t t e i d e n + v a k o i l u s y y t t e i s t ä + v a k o i l u t a p a h t u m i i n + v a k o i l u t a p a u k s e t + v a k o i l u t o i m i n n a l t a + v a k o i l u t u k i k o h t a + v a k o i l u v e r k k o + v a k o i l u v e r k o s t a + v a k o i l u v e r k o s t o + v a k o i l u y r i t y k s i ä + v a k o o j a e l o k u v i e n + v a k o o j a v e l i + v a k u u d e n + v a k u u d e t + v a k u u k s i a + v a k u u k s i e n s a + v a k u u k s i s t a + v a k u u s j ä r j e s t e l m i e n + v a k u u s j ä r j e s t e l m i l l ä + v a k u u s j ä r j e s t e l m i s s ä + v a k u u s j ä r j e s t e l m i ä + v a k u u s j ä r j e s t e l m ä + v a k u u s j ä r j e s t e l m ä n + v a k u u s j ä r j e s t e l m ä s s ä + v a k u u s j ä r j e s t e l m ä s t ä + v a k u u s j ä r j e s t e l m ä t + v a k u u s j ä r j e s t e l m ä ä + v a k u u s j ä r j e s t e l y t + v a k u u s k i r j a + v a k u u s m e k a n i s m i + v a k u u s o n g e l m i i n + v a k u u s r a h a s t o + v a k u u s r a h a s t o a + v a k u u s r a h a s t o a s e t u k s e s t a + v a k u u s r a h a s t o j a + v a k u u s r a h a s t o j e n + v a k u u s r a h a s t o n + v a k u u s r a h a s t o o n + v a k u u s s o p i m u k s e e n + v a k u u s s o p i m u k s e n + v a k u u s t a l l e t u k s e e n + v a k u u s t a l l e t u k s e t + v a k u u s t a s o i l l a + v a k u u s t o d i s t u s t e n + v a k u u s t y y p i t + v a k u u s v a l i k o i m a + v a k u u s v ä l i n e + v a k u u s v ä l i n e e n + v a k u u s v ä l i n e e s e e n + v a k u u t a m m e + v a k u u t a m m e k i n + v a k u u t a n + v a k u u t e n a + v a k u u t e t t a v a + v a k u u t e t t u a + v a k u u t e t t u j a + v a k u u t e t t u j e n + v a k u u t e t u l l e + v a k u u t e t u s s a + v a k u u t e t u t + v a k u u t i n + v a k u u t t a a + v a k u u t t a a k s e e n + v a k u u t t a a k s e m m e + v a k u u t t a a k s e n i + v a k u u t t a e s s a a n + v a k u u t t a e s s a n n e + v a k u u t t a i s i + v a k u u t t a i s i n + v a k u u t t a k a a + v a k u u t t a k a a m m e + v a k u u t t a m a a n + v a k u u t t a m a s s a + v a k u u t t a m a t t a + v a k u u t t a m i s e k s i + v a k u u t t a m i s k e i n o n a + v a k u u t t a m i s k y v y l l ä + v a k u u t t a m i s p o n n i s t e l u i s t a + v a k u u t t a n e e t + v a k u u t t a n u t + v a k u u t t a v a a + v a k u u t t a v a l l a + v a k u u t t a v a m m a l t a + v a k u u t t a v a m m a n + v a k u u t t a v a m m i n + v a k u u t t a v a m p a a + v a k u u t t a v a m p i + v a k u u t t a v a m p i a + v a k u u t t a v a m p i i n + v a k u u t t a v a n + v a k u u t t a v i a + v a k u u t t a v i m m a t + v a k u u t t a v i m m i n + v a k u u t t a v i n + v a k u u t t a v u u d e n + v a k u u t t a v u u d e s t a n n e + v a k u u t t e l u a + v a k u u t t i + v a k u u t t u a + v a k u u t t u a k s e e n + v a k u u t t u m a a n + v a k u u t t u n e e k s i + v a k u u t t u n e e m p a n a + v a k u u t t u n e e m p i + v a k u u t t u n e e m p i a + v a k u u t t u n e e t + v a k u u t t u n e i k s i + v a k u u t t u n e i l t a + v a k u u t t u n e i n a + v a k u u t t u n e i t a + v a k u u t u i n + v a k u u t u k s e e n + v a k u u t u k s e e n s a + v a k u u t u k s e l l a + v a k u u t u k s e n + v a k u u t u k s e n a n t a j a n s a + v a k u u t u k s e n a n t a j a t + v a k u u t u k s e n a n t a j i e n + v a k u u t u k s e n a n t a j i l l e + v a k u u t u k s e n o t t a j a a + v a k u u t u k s e n o t t a j a t + v a k u u t u k s e n o t t a j i a + v a k u u t u k s e n o t t a j i l t a + v a k u u t u k s e n o t t a m i s v e l v o l l i s u u d e n + v a k u u t u k s e n v ä l i t t ä j i e n + v a k u u t u k s e s t a + v a k u u t u k s e t + v a k u u t u k s i a + v a k u u t u k s i a a n + v a k u u t u k s i l l a + v a k u u t u k s i l l e + v a k u u t u k s i n a + v a k u u t u k s i s s a + v a k u u t u k s i s t a + v a k u u t u s a l a + v a k u u t u s a l a a + v a k u u t u s a l a a n + v a k u u t u s a l a l l a + v a k u u t u s a l a l l e + v a k u u t u s a l a n + v a k u u t u s a l a s t a + v a k u u t u s a l o i l l a + v a k u u t u s a l o i t e t t a + v a k u u t u s a s i a n t u n t i j o i t a + v a k u u t u s a s i a s t a + v a k u u t u s a s i o i s s a + v a k u u t u s a s i o i s t a + v a k u u t u s d i r e k t i i v e i h i n + v a k u u t u s d i r e k t i i v e i s s ä + v a k u u t u s d i r e k t i i v e j ä + v a k u u t u s d i r e k t i i v i + v a k u u t u s d i r e k t i i v i e n + v a k u u t u s d i r e k t i i v i m m e + v a k u u t u s d i r e k t i i v i n + v a k u u t u s d i r e k t i i v i ä + v a k u u t u s e d u s t a j a + v a k u u t u s e d u s t a j a n + v a k u u t u s e d u s t a j a t + v a k u u t u s e d u s t a j i a + v a k u u t u s e d u s t a j i e n + v a k u u t u s e d u s t a j i l l a + v a k u u t u s e d u s t a j i l l e + v a k u u t u s e d u s t u k s e n + v a k u u t u s e d u s t u k s e s t a + v a k u u t u s e d u s t u s + v a k u u t u s e d u s t u s t a + v a k u u t u s e d u s t u s t o i m i n t a a + v a k u u t u s e h d o i s t a + v a k u u t u s e h d o t + v a k u u t u s e h t o i h i n + v a k u u t u s e h t o j a + v a k u u t u s j ä r j e s t e l m i e n + v a k u u t u s j ä r j e s t e l m i e n k i n + v a k u u t u s j ä r j e s t e l m i i n + v a k u u t u s j ä r j e s t e l m i s s ä + v a k u u t u s j ä r j e s t e l m i s t ä + v a k u u t u s j ä r j e s t e l m i ä + v a k u u t u s j ä r j e s t e l m ä + v a k u u t u s j ä r j e s t e l m ä n + v a k u u t u s j ä r j e s t e l m ä s s ä + v a k u u t u s j ä r j e s t e l m ä t + v a k u u t u s j ä r j e s t e l m ä ä + v a k u u t u s j ä r j e s t e l m ä ä n + v a k u u t u s j ä r j e s t e l y j ä + v a k u u t u s j ä s e n v a l t i o + v a k u u t u s j ä s e n v a l t i o i d e n + v a k u u t u s j ä s e n v a l t i o l t a + v a k u u t u s j ä s e n v a l t i o n + v a k u u t u s j ä s e n v a l t i o n s a + v a k u u t u s k a n t e i d e n + v a k u u t u s k a s s a + v a k u u t u s k a s s a n + v a k u u t u s k a s s a t + v a k u u t u s k a s s o i l l e + v a k u u t u s k a s s o j e n + v a k u u t u s k a u p p a + v a k u u t u s k a u s i e n + v a k u u t u s k i r j a a + v a k u u t u s k i r j o j a + v a k u u t u s k o r t t i i n + v a k u u t u s k o r v a u k s i s t a + v a k u u t u s k u l u i s t a + v a k u u t u s k u l u j e n + v a k u u t u s k u s t a n n u k s e t + v a k u u t u s k u s t a n n u k s i a + v a k u u t u s k u s t a n n u k s i i n + v a k u u t u s k y s y m y k s i s t ä + v a k u u t u s k y s y m y s t ä + v a k u u t u s l a i n s ä ä d ä n n ö n + v a k u u t u s l a i n s ä ä d ä n n ö s t ä + v a k u u t u s l a i n s ä ä d ä n t ö + v a k u u t u s l a i n s ä ä d ä n t ö ä + v a k u u t u s l a i n s ä ä d ä n t ö ö n + v a k u u t u s l a i t o k s e l t a a n + v a k u u t u s l a i t o k s e t + v a k u u t u s l a i t o k s i a + v a k u u t u s l a i t o k s i a m m e + v a k u u t u s l a i t o k s i l t a + v a k u u t u s l a i t o k s i s s a + v a k u u t u s l a i t o s + v a k u u t u s l a i t o s t e n + v a k u u t u s l a j e i s s a + v a k u u t u s l a j i e n + v a k u u t u s l i i k e t o i m e n + v a k u u t u s l i i k k e e t + v a k u u t u s m a h d o l l i s u u k s i i n + v a k u u t u s m a k s u + v a k u u t u s m a k s u i h i n + v a k u u t u s m a k s u i s t a + v a k u u t u s m a k s u j a + v a k u u t u s m a k s u j e n + v a k u u t u s m a k s u j e n s a + v a k u u t u s m a k s u k a u d e n + v a k u u t u s m a k s u n + v a k u u t u s m a k s u s t a + v a k u u t u s m a k s u t + v a k u u t u s m a k s u t u l o i s t a + v a k u u t u s m a l l i a + v a k u u t u s m a r k k i n a t + v a k u u t u s m a r k k i n o i d e n + v a k u u t u s m a r k k i n o i l l a + v a k u u t u s m a r k k i n o i l t a + v a k u u t u s m a r k k i n o i t a + v a k u u t u s m a t e m a a t t i s t e n + v a k u u t u s m a t e m a t i i k k a + v a k u u t u s m e k a n i s m e j a + v a k u u t u s m e k a n i s m i n + v a k u u t u s m e k l a r e i l l e + v a k u u t u s m e k l a r i + v a k u u t u s m e n o j a + v a k u u t u s m u o t o a + v a k u u t u s n u m e r o a + v a k u u t u s n u m e r o n + v a k u u t u s o i k e u d e n + v a k u u t u s o i k e u d e t + v a k u u t u s o i k e u k s i a + v a k u u t u s o i k e u k s i a a n + v a k u u t u s o i k e u k s i e n + v a k u u t u s o i k e u k s i i n + v a k u u t u s o i k e u t e n s a + v a k u u t u s o n g e l m a + v a k u u t u s o n g e l m a t + v a k u u t u s o n g e l m i a + v a k u u t u s o n g e l m i s t a + v a k u u t u s p a k k o + v a k u u t u s p a k k o a + v a k u u t u s p a l k k i o n + v a k u u t u s p a l v e l u a l a n + v a k u u t u s p a l v e l u i s t a + v a k u u t u s p a l v e l u i t a + v a k u u t u s p a l v e l u j a + v a k u u t u s p a l v e l u j e n + v a k u u t u s p a l v e l u t + v a k u u t u s p e t o k s e t + v a k u u t u s p o l i t i i k k a + v a k u u t u s p ä ä o m a l l e + v a k u u t u s p ä ä o m a n + v a k u u t u s p ä ä o m i e n + v a k u u t u s r a h a s t o + v a k u u t u s r a h a s t o j a + v a k u u t u s r a h a s t o j e m m e + v a k u u t u s r a h a s t o j e n + v a k u u t u s r a h a s t o n + v a k u u t u s r a h a t + v a k u u t u s r a h o i t u k s e e n + v a k u u t u s r a t k a i s u i l l a + v a k u u t u s r a t k a i s u j a + v a k u u t u s r i s k e i s t ä + v a k u u t u s r i s k i t a s o n s a + v a k u u t u s r y h m i l l e + v a k u u t u s r y h m i t t y m i e n + v a k u u t u s r y h m i t t y m ä s s ä + v a k u u t u s r y h m i t t y m ä t + v a k u u t u s s e k t o r i l l a + v a k u u t u s s o p i m u k s e t + v a k u u t u s s o p i m u k s i a + v a k u u t u s s o p i m u k s i i n + v a k u u t u s s o p i m u k s i s s a + v a k u u t u s s o p i m u k s i s t a + v a k u u t u s s o p i m u s + v a k u u t u s s o p i m u s t e n + v a k u u t u s s u m m i e n + v a k u u t u s s u o j a + v a k u u t u s s u o j a a + v a k u u t u s t a + v a k u u t u s t a k u u j ä r j e s t e l m ä t + v a k u u t u s t a k u u n + v a k u u t u s t a k u u t + v a k u u t u s t a l o u d e n + v a k u u t u s t a l o u d e s s a + v a k u u t u s t a l o u t e e n + v a k u u t u s t a p a u k s i a + v a k u u t u s t a p p i o t + v a k u u t u s t a r j o a j i e n + v a k u u t u s t a r j o n n a s t a + v a k u u t u s t a r k a s t u k s e t + v a k u u t u s t a s o o n s a + v a k u u t u s t e n + v a k u u t u s t i e t o j e n + v a k u u t u s t i e t o k e s k u k s i a + v a k u u t u s t i e t o k e s k u k s i i n + v a k u u t u s t i l a n n e t t a + v a k u u t u s t o d i s t u k s e n + v a k u u t u s t o d i s t u k s e t + v a k u u t u s t o d i s t u s + v a k u u t u s t o i m i a + v a k u u t u s t o i m i a l a + v a k u u t u s t o i m i a l a a + v a k u u t u s t o i m i a l a l l e + v a k u u t u s t o i m i a l a n + v a k u u t u s t o i m i n n a n + v a k u u t u s t o i m i n t a + v a k u u t u s t o i m i n t a a + v a k u u t u s t o i m i n t o j a + v a k u u t u s t u o t t e e t + v a k u u t u s t u o t t e i d e n + v a k u u t u s t u o t t e i l l e + v a k u u t u s t u o t t e i s t a + v a k u u t u s t u o t t e i t a + v a k u u t u s t u r v a + v a k u u t u s t u r v a a + v a k u u t u s t u r v a a n + v a k u u t u s t u r v a j ä r j e s t e l m ä + v a k u u t u s t u r v a n + v a k u u t u s t u r v a s t a + v a k u u t u s t u r v a t a s o a + v a k u u t u s t u r v a t a s o o n + v a k u u t u s t y y p p i ä + v a k u u t u s v a a t i m u k s e t + v a k u u t u s v a a t i m u k s i a + v a k u u t u s v a a t i m u k s i s t a + v a k u u t u s v a a t i m u s t e n + v a k u u t u s v a i h t o e h d o t + v a k u u t u s v a l v o n n a l l e + v a k u u t u s v a l v o n t a + v a k u u t u s v a l v o n t a j ä r j e s t e l m i e n + v a k u u t u s v a l v o n t a v i r a n o m a i s e e n + v a k u u t u s v a l v o n t a v i r a n o m a i s i a + v a k u u t u s v a l v o n t a v i r a n o m a i s t e n + v a k u u t u s v a s t u i d e n + v a k u u t u s v e l k o j i e n + v a k u u t u s v e l v o i t t e i t a + v a k u u t u s v e l v o l l i s u u d e n + v a k u u t u s v e l v o l l i s u u s + v a k u u t u s v e l v o l l i s u u t t a + v a k u u t u s v e r k o s t o i k s i + v a k u u t u s y h d i s t y k s e t + v a k u u t u s y h t e e n l i i t t y m i ä + v a k u u t u s y h t i ö + v a k u u t u s y h t i ö i d e n + v a k u u t u s y h t i ö i h i n + v a k u u t u s y h t i ö i l l e + v a k u u t u s y h t i ö i l l ä + v a k u u t u s y h t i ö i l t ä + v a k u u t u s y h t i ö i l t ä ä n + v a k u u t u s y h t i ö i s s ä + v a k u u t u s y h t i ö i s t ä + v a k u u t u s y h t i ö i t ä + v a k u u t u s y h t i ö l l e + v a k u u t u s y h t i ö l l ä + v a k u u t u s y h t i ö l t ä + v a k u u t u s y h t i ö l t ä ä n + v a k u u t u s y h t i ö n + v a k u u t u s y h t i ö s s ä + v a k u u t u s y h t i ö s t ä + v a k u u t u s y h t i ö t + v a k u u t u s y h t i ö t k i n + v a k u u t u s y h t i ö t ä + v a k u u t u s y h t i ö t ä ä n + v a k u u t u s y h t i ö ö n + v a k u u t u s y r i t t ä j i e n + v a k u u t u s y r i t y k s e m m e + v a k u u t u s y r i t y k s e n + v a k u u t u s y r i t y k s e n ä + v a k u u t u s y r i t y k s e s s ä + v a k u u t u s y r i t y k s e t + v a k u u t u s y r i t y k s i l l e + v a k u u t u s y r i t y k s i l l ä + v a k u u t u s y r i t y k s i s t ä + v a k u u t u s y r i t y k s i ä + v a k u u t u s y r i t y s + v a k u u t u s y r i t y s r y h m i e n + v a k u u t u s y r i t y s r y h m i ä + v a k u u t u s y r i t y s r y h m ä t + v a k u u t u s y r i t y s t e n + v a k u u t u s y r i t y s t ä + v a l a a n p y y n n i n + v a l a a n p y y n t i k o m i s s i o + v a l a a n p y y n t i k o m i s s i o n + v a l a a n p y y n t i m o r a t o r i o n + v a l a a n p y y n t i t e o l l i s u u d e n + v a l a a n p y y n t i t o i m e t + v a l a a n p y y n t i v e r k k o o n + v a l a a n p y y n t i ä + v a l a a n r a s v a + v a l a i s e e + v a l a i s e m a a n + v a l a i s e m i s e s t a + v a l a i s e n + v a l a i s e v a m p i + v a l a i s e v a s t a + v a l a i s i + v a l a i s i m i s t a + v a l a i s i v a t + v a l a i s s u t + v a l a i s t a + v a l a i s t a a n + v a l a i s t u s d a t a n s i i r t o + v a l a i s t u s j ä r j e s t e l m i e n + v a l a i s t u s t a + v a l a l i i t o n + v a l a m i e h e t + v a l a n k u m o u k s e n + v a l a s k a n n a t + v a l a s k a n t o i h i n + v a l a s k a n t o j e n + v a l a s k u o l e m i a + v a l a s k u o l e m i i n + v a l a s k u o l e m i s t a + v a l a s l a j e i h i n + v a l a s l a j i e n + v a l a s r a t s a s t a j a + v a l a s s a a l i i s t a + v a l a s s a a l i i t a + v a l a s s a a l i t + v a l a s t u o t t e i d e n + v a l a t a v a n + v a l e a k a a s i a + v a l e a r v o n n a s t a + v a l e a r v o n n a t + v a l e a v i o l i i t t o + v a l e a v i o l i i t t o j a + v a l e d e m o k r a a t i t + v a l e d e m o k r a t i a a + v a l e d e m o k r a t i a n + v a l e d e m o k r a t i a s s a + v a l e d e m o k r a t i a s t a + v a l e h a k e m u k s e t + v a l e h d e l l a a n + v a l e h o l v i + v a l e h t e l e e + v a l e h t e l e t t e + v a l e i s i i n + v a l e j o u k k o t u h o a s e i d e n + v a l e k a n s a n ä ä n e s t y k s e e n + v a l e k a n s a n ä ä n e s t y k s e n + v a l e k e h i t y s h a n k k e i l l a + v a l e k o m p r o m i s s i + v a l e k o r v a u s t a + v a l e k u l t t u u r i s t a + v a l e k u o l e m a + v a l e k u v a + v a l e k y s y m y s + v a l e k y t ä t + v a l e l i i k e y r i t y s t e n + v a l e m a a n v i l j e l i j ö i s t ä + v a l e m a l i k k a + v a l e m u i s t i s y n d r o o m a + v a l e m ä ä r i t e l m i ä + v a l e n s s i e l e k t r o n i + v a l e n s s i s i d o s t e o r i a + v a l e n s s i v y ö + v a l e n t i n + v a l e o i k e u d e n k ä y n n i l l e + v a l e o p e r a a t i o i l l a + v a l e p a k o l a i s t e n + v a l e p a r l a m e n t i k s i + v a l e p a r l a m e n t i n + v a l e p a r l a m e n t t i a + v a l e p e l t o e t a n a + v a l e p u h e e n j o h t a j a + v a l e p u v u s s a + v a l e r a s k a u s + v a l e r i a a n a h a p p o + v a l e r u u t u t a t t i + v a l e s i n i s i m p u k k a + v a l e s o t a + v a l e s u k l a a t a + v a l e t a i t e i l i j a + v a l e t e l o i t u k s e t + v a l e t e l o i t u k s i i n + v a l e t e l o i t u s + v a l e t t a + v a l e t u b e r k u l o o s i + v a l e t u r v a p a i k a n h a k i j o i l t a + v a l e t u t k i m u s + v a l e v a a l i t + v a l e v a h v e r o + v a l e v a l t i o n + v a l e y h t i ö i d e n + v a l e y h t i ö i t ä + v a l e y l i o p i s t o j a + v a l e y r i t t ä j y y d e s t ä + v a l e y r i t y k s e s t ä + v a l e y r i t y k s i ä + v a l h e e k s i + v a l h e e l l i s e k s i + v a l h e e l l i s t a + v a l h e e n + v a l h e i d e n + v a l h e i s i i n + v a l h e i s t a + v a l h e i t a + v a l h e t t a + v a l i d o i n t i a i k a n a + v a l i d o i n t i k o k e e t + v a l i d o i n t i m e n e t e l m ä n + v a l i d o i n t i m e n e t t e l y j ä + v a l i d o i n t i m e n e t t e l y n + v a l i d o i n t i o h j e l m i a + v a l i d o i n t i v a i h e + v a l i d o i t a v a + v a l i d o i t u j a + v a l i d o i t u j e n + v a l i k o i d a + v a l i k o i d e n + v a l i k o i d u m m a l t a + v a l i k o i d u s t a + v a l i k o i m a a + v a l i k o i m a k r i t e e r e i h i n + v a l i k o i m a l l e + v a l i k o i m a n + v a l i k o i m a s t a + v a l i k o i m a t t o m a n + v a l i k o i m a t t o m a t + v a l i k o i n t i a + v a l i k o i v a a + v a l i k o i v a k s i + v a l i k o i v a m m a n + v a l i k o i v a m m i l l a + v a l i k o i v a m m i n + v a l i k o i v a m p a a + v a l i k o i v a m p a a n + v a l i k o i v a m p i + v a l i k o i v a m p i a + v a l i k o i v a m p i e n + v a l i k o i v a s t a + v a l i k o i v e m m a t + v a l i k o i v e m m i n + v a l i k o i v e m p i a + v a l i k o i v i a + v a l i k o i v i e n + v a l i k o i v i m m i s t a + v a l i k o i v i m p i i n + v a l i k o i v i s s a + v a l i k o i v u u s a s t e + v a l i k o i v u u t t a + v a l i n n a i s e n + v a l i n n a i s i a + v a l i n n a i s u u s l a u s e k e + v a l i n n a l l a + v a l i n n a l l e + v a l i n n a n + v a l i n n a n m a h d o l l i s u u d e t + v a l i n n a n m a h d o l l i s u u k s i a + v a l i n n a n m a h d o l l i s u u k s i e n + v a l i n n a n m a h d o l l i s u u k s i e n s a + v a l i n n a n m a h d o l l i s u u s + v a l i n n a n m a h d o l l i s u u t e e n + v a l i n n a n m a h d o l l i s u u t t a + v a l i n n a n v a p a u d e l l a + v a l i n n a n v a p a u d e l l e + v a l i n n a n v a p a u d e n + v a l i n n a n v a p a u d e s t a + v a l i n n a n v a p a u s + v a l i n n a n v a p a u t e e n + v a l i n n a n v a p a u t e n a + v a l i n n a n v a p a u t e n s a + v a l i n n a n v a p a u t t a + v a l i n n a n v a p a u t t a a n + v a l i n n a n v a r a a + v a l i n n a n v a r a n + v a l i n n a s s a + v a l i n n a s t a + v a l i n n a t + v a l i n n e e t + v a l i n n e i l l a + v a l i n n o i l l e + v a l i n n o i s s a + v a l i n n o i s t a + v a l i n n u t + v a l i n t a a + v a l i n t a a n + v a l i n t a a n s a + v a l i n t a e d e l l y t y s t e n + v a l i n t a e h d o i l l a + v a l i n t a e h d o i s s a + v a l i n t a e h t o i h i n + v a l i n t a e h t o j e n + v a l i n t a j ä r j e s t e l m i s s ä + v a l i n t a j ä r j e s t e l m ä + v a l i n t a j ä r j e s t e l m ä ä + v a l i n t a k e l p o i s u u s s ä ä n n ö i s t ä + v a l i n t a k e l p o i s u u s s ä ä n t ö j ä + v a l i n t a k o k e i t a + v a l i n t a k o k o u k s e l l e + v a l i n t a k o m i t e a t + v a l i n t a k o m i t e o i s s a + v a l i n t a k r i t e e r e i h i n + v a l i n t a k r i t e e r e i n ä + v a l i n t a k r i t e e r e i s s ä + v a l i n t a k r i t e e r e i s t ä + v a l i n t a k r i t e e r e i t ä + v a l i n t a k r i t e e r e j ä + v a l i n t a k r i t e e r i + v a l i n t a k r i t e e r i e n + v a l i n t a k r i t e e r i n ä + v a l i n t a k r i t e e r i t + v a l i n t a k y s y m y s + v a l i n t a l a j i t t e l u + v a l i n t a l a u t a k u n n a n + v a l i n t a l a u t a k u n n a s s a + v a l i n t a l a u t a k u n n a s t a + v a l i n t a l a u t a k u n t a + v a l i n t a l a u t a k u n t i e n + v a l i n t a m a h d o l l i s u u d e n + v a l i n t a m a h d o l l i s u u k s i e n + v a l i n t a m a h d o l l i s u u k s i i n + v a l i n t a m a h d o l l i s u u s + v a l i n t a m e k a n i s m i s t a + v a l i n t a m e n e t e l m ä + v a l i n t a m e n e t e l m ä n + v a l i n t a m e n e t e l m ä ä + v a l i n t a m e n e t t e l y + v a l i n t a m e n e t t e l y i h i n + v a l i n t a m e n e t t e l y i l l ä + v a l i n t a m e n e t t e l y i s s ä + v a l i n t a m e n e t t e l y i s t ä + v a l i n t a m e n e t t e l y i t ä + v a l i n t a m e n e t t e l y j e n + v a l i n t a m e n e t t e l y j ä + v a l i n t a m e n e t t e l y l l ä + v a l i n t a m e n e t t e l y n + v a l i n t a m e n e t t e l y s s ä + v a l i n t a m e n e t t e l y s t ä + v a l i n t a m e n e t t e l y t + v a l i n t a m e n e t t e l y y n + v a l i n t a m e n e t t e l y ä + v a l i n t a m y y m ä l ä a s i a m i e s + v a l i n t a m y y m ä l ä k e t j u j a + v a l i n t a m y y m ä l ä k e t j u j e n + v a l i n t a m y y m ä l ä k e t j u t + v a l i n t a n a p p i + v a l i n t a n i + v a l i n t a n s a + v a l i n t a o h j e l m a n + v a l i n t a o i k e u k s i a + v a l i n t a o i k e u s + v a l i n t a o i k e u t t a + v a l i n t a p e r u s t e + v a l i n t a p e r u s t e e k s i + v a l i n t a p e r u s t e e n a + v a l i n t a p e r u s t e e t + v a l i n t a p e r u s t e i d e n + v a l i n t a p e r u s t e i k s i + v a l i n t a p e r u s t e i l l a + v a l i n t a p e r u s t e i s s a + v a l i n t a p e r u s t e i s t a + v a l i n t a p e r u s t e i t a + v a l i n t a p e r u s t e i t a a n + v a l i n t a p o l i t i i k k a + v a l i n t a p r o s e s s e i s s a + v a l i n t a p r o s e s s i + v a l i n t a p r o s e s s i a + v a l i n t a p r o s e s s i e n + v a l i n t a p r o s e s s i i n + v a l i n t a p r o s e s s i l l a + v a l i n t a p r o s e s s i n + v a l i n t a p r o s e s s i s s a + v a l i n t a p ä i v ä + v a l i n t a r u u t u j e n + v a l i n t a r y h m i ä + v a l i n t a s ä ä n t ö j ä + v a l i n t a t a p a + v a l i n t a t a p a a + v a l i n t a t i l a n t e e s s a + v a l i n t a t o i m i s t o n + v a l i n t a t u l o k s e t + v a l i n t a t u l o s t e n + v a l i n t a t y ö t ä + v a l i n t a v a i h e e n + v a l i n t o j a + v a l i n t o j a a n + v a l i n t o j e n + v a l i n t o j e n s a + v a l i o j o u k o t + v a l i o k u n n a l l a + v a l i o k u n n a l l e + v a l i o k u n n a l l e m m e + v a l i o k u n n a l t a + v a l i o k u n n a n + v a l i o k u n n a s s a + v a l i o k u n n a s s a k i n + v a l i o k u n n a s s a m m e + v a l i o k u n n a s s a n i + v a l i o k u n n a s t a + v a l i o k u n n a t + v a l i o k u n n i l l e + v a l i o k u n n i l l e m m e + v a l i o k u n n i l t a + v a l i o k u n n i s s a + v a l i o k u n n i s s a k i n + v a l i o k u n n i s s a m m e + v a l i o k u n n i s t a + v a l i o k u n n i s t a a n + v a l i o k u n t a + v a l i o k u n t a a + v a l i o k u n t a a m m e + v a l i o k u n t a a n + v a l i o k u n t a h u o n e i s s a + v a l i o k u n t a i s t u n n o s s a + v a l i o k u n t a j ä r j e s t e l m ä ä + v a l i o k u n t a j ä r j e s t e l m ä ä n + v a l i o k u n t a k a a n + v a l i o k u n t a k e s k u s t e l u a + v a l i o k u n t a k e s k u s t e l u i h i n + v a l i o k u n t a k e s k u s t e l u i s s a + v a l i o k u n t a k e s k u s t e l u i s t a + v a l i o k u n t a k e s k u s t e l u j a + v a l i o k u n t a k e s k u s t e l u j e n + v a l i o k u n t a k e s k u s t e l u n + v a l i o k u n t a k e s k u s t e l u s s a + v a l i o k u n t a k e s k u s t e l u s s a m m e + v a l i o k u n t a k i n + v a l i o k u n t a k o k o u k s e n + v a l i o k u n t a k o k o u k s i a + v a l i o k u n t a k o k o u k s i i n + v a l i o k u n t a k o k o u k s i s s a + v a l i o k u n t a k o k o u s t e n + v a l i o k u n t a k o l l e g a n i + v a l i o k u n t a k o l l e g o i h i n i + v a l i o k u n t a k o l l e g o i t a n i + v a l i o k u n t a k o l l e g o j a n i + v a l i o k u n t a k o l l e g o j e n s a + v a l i o k u n t a k u u l e m i s e s s a + v a l i o k u n t a k ä s i t t e l y + v a l i o k u n t a k ä s i t t e l y n + v a l i o k u n t a k ä s i t t e l y s s ä + v a l i o k u n t a k ä s i t t e l y s t ä + v a l i o k u n t a k ä s i t t e l y y n + v a l i o k u n t a k ä s i t t e l y ä + v a l i o k u n t a l ä h t ö i s e n + v a l i o k u n t a m e n e t t e l y + v a l i o k u n t a m e n e t t e l y j e n + v a l i o k u n t a m e n e t t e l y j ä + v a l i o k u n t a m e n e t t e l y n + v a l i o k u n t a m e n e t t e l y y n + v a l i o k u n t a m e n e t t e l y ä + v a l i o k u n t a m m e + v a l i o k u n t a m m e k i n + v a l i o k u n t a n e u v o t t e l u j e n + v a l i o k u n t a n i + v a l i o k u n t a n s a + v a l i o k u n t a p a i k o i s t a + v a l i o k u n t a p r o s e s s i a + v a l i o k u n t a p ä ä t ö k s i s s ä + v a l i o k u n t a r a k e n n e t t a + v a l i o k u n t a r a k e n t e e s t a + v a l i o k u n t a r a k e n t e i t a + v a l i o k u n t a t a r k i s t u k s e s t a + v a l i o k u n t a t a s o l l a + v a l i o k u n t a t y ö + v a l i o k u n t a t y ö h ö n + v a l i o k u n t a t y ö m m e + v a l i o k u n t a t y ö n + v a l i o k u n t a t y ö n i + v a l i o k u n t a t y ö s k e n t e l y l l e + v a l i o k u n t a t y ö s k e n t e l y n + v a l i o k u n t a t y ö s k e n t e l y s s ä + v a l i o k u n t a t y ö s k e n t e l y s s ä m m e + v a l i o k u n t a t y ö s k e n t e l y s t ä + v a l i o k u n t a t y ö s k e n t e l y y n + v a l i o k u n t a t y ö s k e n t e l y ä + v a l i o k u n t a t y ö s s ä + v a l i o k u n t a t y ö t ä + v a l i o k u n t a v a i h e e n + v a l i o k u n t a v a i h e e s s a + v a l i o k u n t a v a i h e e s s a k i n + v a l i o k u n t a v a i h e i s s a + v a l i o k u n t a v i e r a i l u j e n + v a l i o k u n t a ä ä n e s t y k s e n + v a l i o k u n t a ä ä n e s t y k s e s s ä + v a l i o k u n t a ä ä n e s t y k s i s s ä + v a l i o k u n t a ä ä n e s t y s t e n + v a l i o k u n t a ä ä n e s t y s t ä + v a l i o k u n t i a + v a l i o k u n t i e m m e + v a l i o k u n t i e n + v a l i o k u n t i e n s a + v a l i o k u n t i i n + v a l i s t a a + v a l i s t a m a a n + v a l i s t a m i n e n + v a l i s t a m i s e e n + v a l i s t e t a a n + v a l i s t e t t a e s s a + v a l i s t e t t a v a + v a l i s t u k s e e n + v a l i s t u k s e n + v a l i s t u n e e m m a k s i + v a l i s t u n e e m m a l l e + v a l i s t u n e e m m i n + v a l i s t u n e e s e e n + v a l i s t u n e e t + v a l i s t u n e i m m i s t a + v a l i s t u n e i t a + v a l i s t u n u t t a + v a l i s t u s f i l o s o f i + v a l i s t u s k a m p a n j a + v a l i s t u s k a m p a n j a a + v a l i s t u s k a m p a n j a l l e + v a l i s t u s k a m p a n j a n + v a l i s t u s k a m p a n j a t + v a l i s t u s k a m p a n j o i d e n + v a l i s t u s k a m p a n j o i l l a + v a l i s t u s k a m p a n j o i s s a + v a l i s t u s k a m p a n j o i s t a + v a l i s t u s k a m p a n j o i t a + v a l i s t u s o h j e l m a a + v a l i s t u s o h j e l m a t + v a l i s t u s o h j e l m i a + v a l i s t u s o h j e l m i e n + v a l i s t u s o h j e l m i i n + v a l i s t u s p o l i t i i k a s t a + v a l i s t u s t a + v a l i s t u s t a v o i t e + v a l i s t u s t o i m i a + v a l i s t u s t o i m i l l a + v a l i s t u s t y ö + v a l i s t u s t y ö h ö n + v a l i s t u s t y ö n + v a l i s t u s t y ö t ä + v a l i s t u s v i d e o i t a + v a l i t a a n + v a l i t e l l a + v a l i t e s s a + v a l i t e s s a a n + v a l i t e t a a n + v a l i t e t a a n k i n + v a l i t e t t a v a a + v a l i t e t t a v a a n + v a l i t e t t a v a m m a k s i + v a l i t e t t a v a m p a a + v a l i t e t t a v a m p a n a + v a l i t e t t a v a m p i + v a l i t e t t a v a n + v a l i t e t t a v a n a + v a l i t e t t a v a s t a + v a l i t e t t a v a t + v a l i t e t t a v i a + v a l i t e t t a v i e n + v a l i t e t t a v i m m i s t a + v a l i t e t t a v i m p i a + v a l i t e t t a v i n t a + v a l i t e t t a v i s t a + v a l i t e t t i i n + v a l i t e t t u + v a l i t k a a + v a l i t k a a m m e + v a l i t s e e + v a l i t s e m a + v a l i t s e m a a n + v a l i t s e m a a n s a + v a l i t s e m a l l a + v a l i t s e m a m m e + v a l i t s e m a n + v a l i t s e m a s s a + v a l i t s e m a t + v a l i t s e m a t t a + v a l i t s e m i a + v a l i t s e m i a a n + v a l i t s e m i e n + v a l i t s e m i e n s a + v a l i t s e m i l l a + v a l i t s e m i l t a + v a l i t s e m i n a + v a l i t s e m i s e s t a + v a l i t s e m i s t a + v a l i t s e m i s t a a n + v a l i t s e m i s t a v a n + v a l i t s e m m e k o + v a l i t s e t t e + v a l i t s e v a n + v a l i t s e v a t + v a l i t s e v a t k o + v a l i t s i + v a l i t s i j a j ä r j e s t ö i s s ä + v a l i t s i j a k u n n a l l e m m e + v a l i t s i j a k u n t a + v a l i t s i j a k u n t a a n s a + v a l i t s i j a m m e + v a l i t s i j a n n e + v a l i t s i j a r y h m ä n + v a l i t s i j o i l l e e n + v a l i t s i j o i l l e m m e + v a l i t s i j o i l t a + v a l i t s i j o i s t a a n + v a l i t s i j o i t a + v a l i t s i j o i t a m m e + v a l i t s i m m e + v a l i t s i s i + v a l i t s i s i m m e + v a l i t s i v a t + v a l i t t a a + v a l i t t a e n + v a l i t t a e s s a + v a l i t t a e s s a m m e + v a l i t t a j i a + v a l i t t a j i k s i + v a l i t t a m a s t a n i + v a l i t t a m a t t a + v a l i t t a n e e t + v a l i t t a v a n + v a l i t t a v a s s a + v a l i t t a v a t + v a l i t t e l e m a a n + v a l i t t e l e v a t + v a l i t t e l u n i + v a l i t t i i n + v a l i t t i i n p a + v a l i t t u a + v a l i t t u i n a + v a l i t t u j a + v a l i t t u j e n + v a l i t t u n a + v a l i t u i l l e + v a l i t u i l t a + v a l i t u i s t a + v a l i t u k s e n + v a l i t u k s e n s a + v a l i t u k s e t + v a l i t u k s i + v a l i t u k s i a + v a l i t u k s i i n + v a l i t u k s i s s a + v a l i t u k s i s t a + v a l i t u l l e + v a l i t u l t a + v a l i t u n + v a l i t u s e l i m e l t ä + v a l i t u s e l i n + v a l i t u s j a o s t o o n + v a l i t u s j ä r j e s t e l m i ä + v a l i t u s j ä r j e s t e l m ä + v a l i t u s j ä r j e s t e l m ä s t ä + v a l i t u s k e i n o j a + v a l i t u s k e i n o t + v a l i t u s k i r j e e n + v a l i t u s k i r j e i l l e + v a l i t u s k i r j e i t ä + v a l i t u s k i r j e l m ä n + v a l i t u s k o m i t e a + v a l i t u s k u l t t u u r i + v a l i t u s k u o r o n + v a l i t u s l a u t a k u n t a + v a l i t u s l o m a k e m a l l i n + v a l i t u s l o m a k e m a l l i s t a + v a l i t u s l u e t t e l o a + v a l i t u s l ä h t ö i n e n + v a l i t u s m a h d o l l i s u u d e s t a + v a l i t u s m a h d o l l i s u u d e t + v a l i t u s m a h d o l l i s u u k s i s s a + v a l i t u s m a h d o l l i s u u s + v a l i t u s m a h d o l l i s u u t t a + v a l i t u s m e k a n i s m i + v a l i t u s m e n e t t e l y + v a l i t u s m e n e t t e l y i d e n + v a l i t u s m e n e t t e l y i h i n + v a l i t u s m e n e t t e l y i s s ä + v a l i t u s m e n e t t e l y i t ä + v a l i t u s m e n e t t e l y j e n + v a l i t u s m e n e t t e l y j ä + v a l i t u s m e n e t t e l y n + v a l i t u s m e n e t t e l y s t ä + v a l i t u s m e n e t t e l y t + v a l i t u s m e n e t t e l y ä + v a l i t u s o i k e u d e n + v a l i t u s o i k e u d e s t a + v a l i t u s o i k e u s + v a l i t u s o i k e u t t a + v a l i t u s o i k e u t t a a n + v a l i t u s o s a s t o + v a l i t u s p a l v e l u a + v a l i t u s p a n e e l i i n + v a l i t u s p a n e e l i s s a + v a l i t u s p r o s e s s i + v a l i t u s r e k i s t e r i n + v a l i t u s s a + v a l i t u s t a + v a l i t u s t e n + v a l i t u s t e n k ä s i t t e l y m e k a n i s m i t + v a l i t u s t u o m i o i s t u i m e e n + v a l i t u s t u o m i o i s t u i m e n + v a l i t u s t u o m i o i s t u i n + v a l i t u s v i r r e t + v a l i t u t + v a l j a k k o a j o + v a l j a k k o v e r t a u s + v a l j a s k o r u a h v e n + v a l j a s t a a + v a l j a s t a k a a m m e + v a l j a s t a m i s e k s i + v a l j a s t a m i s e s t a + v a l j a s t e t a a n + v a l j a s t e t t a v a + v a l k e a j ä r v i + v a l k e n e e + v a l k o a i l a k k i + v a l k o a p i l a + v a l k o b e i s a + v a l k o b e i s a n + v a l k o e v ä t ö r ö + v a l k o g a s e l l i + v a l k o h a i + v a l k o h a i n + v a l k o h a i t a + v a l k o h a m m a s + v a l k o h a r j a l e p i n k ä i n e n + v a l k o h a u k k a + v a l k o h e r u k k a + v a l k o h o r s m a + v a l k o h u o n e v e h k a + v a l k o h u u l i l e h t i s a m m a k k o + v a l k o h u u l i t a r h a k o t i l o + v a l k o h ä n t ä g n u u + v a l k o h ä n t ä p e u r a + v a l k o i h o i s e n + v a l k o i h o i s e t + v a l k o i h o i s i a + v a l k o i h o i s i l l a + v a l k o i s e e n + v a l k o i s e k s i + v a l k o i s e l l a + v a l k o i s e l l e + v a l k o i s e l t a + v a l k o i s e n + v a l k o i s e n a + v a l k o i s e s s a + v a l k o i s e s t a + v a l k o i s e t + v a l k o i s i a + v a l k o i s i i n + v a l k o i s i l l a + v a l k o i s i s s a + v a l k o i s i s t a + v a l k o i s t a + v a l k o i s t e n + v a l k o j u m a l t e n k u k k a + v a l k o k a k a d u + v a l k o k a l a + v a l k o k a l a k a n t o j e n + v a l k o k a l a l a i v a s t o + v a l k o k a l a l a i v a s t o n + v a l k o k a l a l a j i t + v a l k o k a l a n + v a l k o k a n g a s + v a l k o k a r v a r o u s k u + v a l k o k a u l a k i p u a j a + v a l k o k a u l a v a r a a n i + v a l k o k a u l u s b u l b u l i + v a l k o k a u l u s k o t t a r a i n e n + v a l k o k a u l u s r a s t a s + v a l k o k a u l u s r i k o k s i a + v a l k o k a u l u s r i k o l l i s e t + v a l k o k a u l u s t y ö l ä i s i ä + v a l k o k a u l u s t y ö n t e k i j ä t + v a l k o k a u l u s t y ö t + v a l k o k o r v a m o n a r k k i + v a l k o k o r v a r ä ä t ä l i + v a l k o k o t i n g a + v a l k o k u l m a b u l b u l i + v a l k o k u l m a k i p u a j a + v a l k o k u l m a m e s i k k o + v a l k o k u l m a m o n a r k k i + v a l k o k u l m a p i n g v i i n i + v a l k o k u l m a t a p a k u l o + v a l k o k u l m a t i k k a n e n + v a l k o k u o n o d e l f i i n i + v a l k o k u r k k u k a r d i n a a l i + v a l k o k u r k k u k i p u a j a + v a l k o k u r k k u k i u r u + v a l k o k u r k k u k y y h k y + v a l k o k u r k k u l e p i n k ä i n e n + v a l k o k u r k k u m o n a r k k i + v a l k o k u r k k u p y y + v a l k o k u r k k u p ö l l ö n e n + v a l k o k u r k k u r a s t a s + v a l k o k u r k k u s i r k k u + v a l k o k u r k k u t y r a n n i + v a l k o k u u s i + v a l k o k u v e d e l f i i n i + v a l k o k ä r p ä s s i e n i + v a l k o l a k k i k o t t a r a i n e n + v a l k o l a k k i k y y h k y + v a l k o l a k k i l e p i n k ä i n e n + v a l k o l a t v a + v a l k o l e h d o k k i + v a l k o l e h t i m i t t a r i + v a l k o l e u k a k i p u a j a + v a l k o l i h a i s t a + v a l k o l u o m i b u l b u l i + v a l k o l u o m i k e r t t u l i + v a l k o l u p i i n i + v a l k o m a k s a r u o h o + v a l k o m a r l i i n i + v a l k o m e r i k o t k a + v a l k o m e s i k k ä + v a l k o m u l p e r i + v a l k o m u s t e s i e n i + v a l k o n a a m a k e r t t u l i + v a l k o n a a m a k y y h k y + v a l k o n a a m a m e s i k k o + v a l k o n a a m a p ö l l ö n e n + v a l k o n a a m a s i r k k u + v a l k o n a a m i o m u u r a + v a l k o n a r s i s s i + v a l k o n i s k a k o r p p i + v a l k o n i s k a k u t o j a + v a l k o n i s k a k y y h k y + v a l k o n i s k a l u r i + v a l k o p a r t a + v a l k o p a r t a b u l b u l i + v a l k o p e i p p i + v a l k o p e r ä r a s t a s + v a l k o p e r ä s i r r i + v a l k o p i i p p o + v a l k o p i i r t o h e i n ä + v a l k o p i l k k a h a i + v a l k o p i l k k u t a u t i + v a l k o p o s k i b u l b u l i + v a l k o p o s k i h a n h i + v a l k o p o s k i h a n h i k a n n a n + v a l k o p o s k i k o t i n g a + v a l k o p o s k i s a u k k o + v a l k o p o s k i t i i r a + v a l k o p y r s t ö k e r t t u + v a l k o p y r s t ö k o t i n g a + v a l k o p y r s t ö l e p i n k ä i n e n + v a l k o p y r s t ö r i e k k o + v a l k o p y y k k i i n + v a l k o p ä r s k ä j u u r i + v a l k o p ä ä b u l b u l i + v a l k o p ä ä m e r i k o t k a + v a l k o p ä ä s o r s a + v a l k o p ä ä t i a i n e n + v a l k o p ä ä t i k k a + v a l k o r a i m i k k i + v a l k o r e v o n h ä n t ä + v a l k o r i l l i k e r t t u l i + v a l k o r i n t a t a p a k u l o + v a l k o r i s a k a s + v a l k o r u n k o s e m b r a + v a l k o s a a r n i + v a l k o s a l a v a + v a l k o s a l v i a + v a l k o s a u m a v ä l s k ä r i + v a l k o s e l k ä t a s k u + v a l k o s e l k ä t i k k a + v a l k o s e p p ä k o t i n g a + v a l k o s i i p i + v a l k o s i i p i k i u r u + v a l k o s i i p i k o t i n g a + v a l k o s i i p i m a t k i j a + v a l k o s i i p i p i i s p a + v a l k o s i i p i t i i r a + v a l k o s i i p i t i k k a + v a l k o s i l m ä b u l b u l i + v a l k o s i l m ä h a u k k a + v a l k o s i l m ä l o k k i + v a l k o s i l m ä m e s i k k o + v a l k o s i l m ä t a n g a r a + v a l k o s i p u l i a + v a l k o s i p u l i a l a n + v a l k o s i p u l i n t u o t a n t o + v a l k o s i p u l i s t a + v a l k o s o i h t u + v a l k o s o l u + v a l k o s u l t t a a n i k a n a + v a l k o t a s a p a i n o + v a l k o t i k k a + v a l k o t o n n i k a l a a + v a l k o t o n n i k a l a l l e + v a l k o t o n n i k a l a s a a l i i d e n + v a l k o t o r n a d o + v a l k o t r o p i i k k i l i n t u + v a l k o t u p a k k a + v a l k o t u p s u p ö l l ö n e n + v a l k o t u p s u s i l k k i a p i n a + v a l k o t u r s k a k a n t o j e n + v a l k o t ä h k ä y ö k k ö n e n + v a l k o t ä p l ä i m i k k ä + v a l k o t ä p l ä n o k k o s p e r h o n e n + v a l k o t ö y h t ö t a m a r i i n i + v a l k o v a t s a k a l a s t a j a + v a l k o v a t s a k e r t t u l i + v a l k o v a t s a m o n a r k k i + v a l k o v a t s a t i k k a n e n + v a l k o v a t s a t y r a n n i + v a l k o v a t u k k a + v a l k o v e n ä j ä n + v a l k o v e n ä j ä n k i e l i s t ä + v a l k o v e n ä l ä i s e t + v a l k o v e n ä l ä i s i l l e + v a l k o v e n ä l ä i s i l l ä k i n + v a l k o v e n ä l ä i s i l t ä + v a l k o v e n ä l ä i s t e n + v a l k o v i i n i + v a l k o v i i n i n + v a l k o v i i n i ä + v a l k o v i i r u j u u r e k a s + v a l k o v i i r u k i p u a j a + v a l k o v i k l o + v a l k o v i l l a k a s + v a l k o v u o k k o + v a l k o v y ö p ä ä s k y + v a l k o y ö k ö n l e h t i + v a l k u a i s a i n e + v a l k u a i s a i n e m e n e t e l m ä n + v a l k u a i s a i n e p i t o i s u u d e n + v a l k u a i s a i n e p i t o i s u u s + v a l k u a i s a i n e t u o n n i s t a + v a l k u a i s a i n e t u o t a n t o a + v a l k u a i s a i n e t u o t t e i s i i n + v a l k u a i s a i n e v a j a u k s e n + v a l k u a i s a i n e v a j e e n + v a l k u a i s a i n e v a j e e s e e n + v a l k u a i s a l a n + v a l k u a i s k a s v e i h i n + v a l k u a i s k a s v e i l l a + v a l k u a i s k a s v e i l l e + v a l k u a i s k a s v e i s s a + v a l k u a i s k a s v e i s t a + v a l k u a i s k a s v e j a + v a l k u a i s k a s v i + v a l k u a i s k a s v i e n + v a l k u a i s k a s v i t + v a l k u a i s k a s v i t a r p e i s t a m m e + v a l k u a i s k a s v i t u o t a n n o n + v a l k u a i s k a s v i t u o t a n n o s t a + v a l k u a i s k a s v i t u o t a n t o + v a l k u a i s k a s v i t u o t a n t o a + v a l k u a i s k a s v i t u o t a n t o o n + v a l k u a i s k a s v i t u o t t e i t a + v a l k u a i s l ä h d e + v a l k u a i s l ä h t e e n + v a l k u a i s l ä h t e i t ä + v a l k u a i s m ä ä r i e n + v a l k u a i s r e h u a + v a l k u a i s r e h u a l a l l a + v a l k u a i s r e h u j a + v a l k u a i s r e h u n + v a l k u a i s t a r p e e n s a + v a l k u a i s t a r v e + v a l k u a i s t u o t a n n o l l e + v a l k u a i s t u o t a n n o n + v a l k u a i s t u o t a n n o s s a + v a l k u a i s t u o t a n n o t + v a l k u a i s t u o t a n t o + v a l k u a i s t u o t a n t o a + v a l k u a i s t u o t a n t o j a + v a l k u a i s v a j a u s t a + v a l k u a i s v a j e + v a l k u a i s v a j e e n + v a l k u a i s v a j e e s e e n + v a l k u a i s v a j e e s t a + v a l k u a i s v a j e t t a + v a l l a n h a l u + v a l l a n h a l u n + v a l l a n h i m o + v a l l a n h i m o i s e k s i + v a l l a n h i m o n + v a l l a n h i m o n s a + v a l l a n j a k o + v a l l a n j a k o a + v a l l a n j a k o i n e e n + v a l l a n j a k o j ä r j e s t e l m ä + v a l l a n j a k o o n + v a l l a n j a k o p e r i a a t e t t a + v a l l a n j a k o p e r i a a t t e i d e n + v a l l a n j a k o s o p i m u s + v a l l a n j a k o s o p i m u s t a + v a l l a n j a n o n + v a l l a n j a o n + v a l l a n j a o s s a + v a l l a n j a o s t a + v a l l a n k a a p p a u k s e n + v a l l a n k a a p p a u k s e n s a + v a l l a n k a a p p a u k s e s t a + v a l l a n k a a p p a u k s e t + v a l l a n k a a p p a u k s i a + v a l l a n k a a p p a u s + v a l l a n k a a p p a u s t a + v a l l a n k a a p p a u s y r i t y k s e e n + v a l l a n k a a p p a u s y r i t y k s e n + v a l l a n k a a p p a u s y r i t y k s e s t ä + v a l l a n k a a p p a u s y r i t y k s i s t ä + v a l l a n k a a p p a u s y r i t y s + v a l l a n k a h v a s s a + v a l l a n k u m o u k s e e n + v a l l a n k u m o u k s e l l e + v a l l a n k u m o u k s e l l i n e n + v a l l a n k u m o u k s e l l i s e e n + v a l l a n k u m o u k s e l l i s e s t a + v a l l a n k u m o u k s e l l i s i a + v a l l a n k u m o u k s e l l i s i m m i s t a + v a l l a n k u m o u k s e l l i s i s t a + v a l l a n k u m o u k s e l l i s t e n + v a l l a n k u m o u k s e l l i s u u d e n + v a l l a n k u m o u k s e n + v a l l a n k u m o u k s e s t a + v a l l a n k u m o u k s i l l e + v a l l a n k u m o u s + v a l l a n k u m o u s a a l t o + v a l l a n k u m o u s a a t t e i d e n + v a l l a n k u m o u s a r m e i j a + v a l l a n k u m o u s h a l l i n t o + v a l l a n k u m o u s j o h t a j a + v a l l a n k u m o u s j o u k k o i h i n + v a l l a n k u m o u s j o u k k o j a + v a l l a n k u m o u s k a a r t i + v a l l a n k u m o u s k a a r t i a + v a l l a n k u m o u s k a a r t i n + v a l l a n k u m o u s k a l e n t e r i + v a l l a n k u m o u s k o m i t e a t + v a l l a n k u m o u s l i i k e + v a l l a n k u m o u s l i i k k e e l l e + v a l l a n k u m o u s l i i k k e e t + v a l l a n k u m o u s l i i k k e i d e n + v a l l a n k u m o u s n e u v o s t o + v a l l a n k u m o u s p e r i n t e i d e n + v a l l a n k u m o u s r i n t a m a + v a l l a n k u m o u s r i n t a m a a n + v a l l a n k u m o u s s o d a t + v a l l a n k u m o u s t a + v a l l a n k u m o u s t a i s t e l u n + v a l l a n k u m o u s t u o m i o i s t u i m e n + v a l l a n k u m o u s t u o m i o i s t u i n + v a l l a n k u m o u s t u o m i o i s t u i n t a + v a l l a n k u m o u s v e r o + v a l l a n k u m o u s v e r o a + v a l l a n k u m o u s y r i t y k s i s t ä + v a l l a n k ä y t t ö + v a l l a n k ä y t t ö a s e m i i n + v a l l a n k ä y t t ö j ä r j e s t e l m ä s t ä + v a l l a n k ä y t t ö k e i n o + v a l l a n k ä y t t ö o i k e u t t a + v a l l a n k ä y t t ö p y r k i m y k s e n ä + v a l l a n k ä y t t ö v ä l i n e i t ä + v a l l a n k ä y t t ö ä + v a l l a n k ä y t ö n + v a l l a n m e n e t y s + v a l l a n p e r i m y s s o d a n + v a l l a n p e r i m y s s o d i s t a + v a l l a n p i t ä j i e n + v a l l a n p i t ä j i l l e + v a l l a n p i t ä j i l l ä + v a l l a n p i t ä j i s t ä + v a l l a n p i t ä j i s t ä m m e + v a l l a n p i t ä j i ä + v a l l a n p i t ä j ä n ä + v a l l a n p i t ä j ä t + v a l l a n s i i r r o s t a + v a l l a n s i i r t o + v a l l a n s i i r t o a + v a l l a n s i i r t o o n + v a l l a n s i i r t o s e r e m o n i a s s a + v a l l a n t a v o i t t e l u + v a l l a n v a i h d o k s e n + v a l l a n v a i h d o k s e s t a + v a l l a n v a i h d o n + v a l l a n v a i h d o s + v a l l a n v a i h d o s s a + v a l l a n v a i h d o s t a + v a l l a n v a i h t o + v a l l a n v a i h t o a + v a l l a s s a a n + v a l l a s s a m m e + v a l l a s s a n n e + v a l l a s t a a n + v a l l a t t a v a + v a l l i n n e e n + v a l l i n n e e s e e n + v a l l i n n e e s t a + v a l l i n n e e t + v a l l i n n e i s i i n + v a l l i n n u t + v a l l i r i u t t a + v a l l i t a r k k a i l u t e h t ä v i e n + v a l l i t e s s a + v a l l i t s e e + v a l l i t s e v a a + v a l l i t s e v a a n + v a l l i t s e v a l l a + v a l l i t s e v a l l e + v a l l i t s e v a n + v a l l i t s e v a s s a + v a l l i t s e v a s t a + v a l l i t s e v a t + v a l l i t s e v i a + v a l l i t s e v i e n + v a l l i t s e v i i n + v a l l i t s e v i s t a + v a l l i t s i v a t + v a l l i t t a v a + v a l l o i l l e e n + v a l l o i t t a a + v a l l o i t t a j a t + v a l l o i t t a m a a n + v a l l o i t t a m i s t a + v a l l o i t u k s e s t a + v a l l o i t u s k a m p a n j a + v a l l o i t u s p o l i t i i k k a a + v a l l o i t u s y r i t y k s i ä + v a l l o n i a l a i s i a + v a l l o n i k o l l e g a n i + v a l m e n n u s t o i m e n p i t e i t ä + v a l m e n t a j a n + v a l m i i k s i + v a l m i i l l a + v a l m i i m m a t + v a l m i i m p i + v a l m i i m p i a + v a l m i i n + v a l m i i n a + v a l m i i s t a + v a l m i i t + v a l m i i t a + v a l m i s a t e r i a + v a l m i s a t e r i o i k s i + v a l m i s m a t k a + v a l m i s m a t k a n + v a l m i s m a t k a p a l v e l u i d e n + v a l m i s r u o a n + v a l m i s t a a + v a l m i s t a a k s e e n + v a l m i s t a j a l l e + v a l m i s t a j a l t a + v a l m i s t a j a n + v a l m i s t a j a p u o l e l l a + v a l m i s t a j a t + v a l m i s t a j a t k a a n + v a l m i s t a j i a + v a l m i s t a j i e n + v a l m i s t a j i l l e + v a l m i s t a k a a m m e + v a l m i s t a m a a n + v a l m i s t a m a s t a + v a l m i s t a m i a a n + v a l m i s t a m i s e k s i + v a l m i s t a m i s k u s t a n n u k s i s t a + v a l m i s t a u d u m m e + v a l m i s t a u d u t a + v a l m i s t a u d u t t a e s s a + v a l m i s t a u d u t t a v a + v a l m i s t a u t u a + v a l m i s t a u t u e s s a + v a l m i s t a u t u e s s a a n + v a l m i s t a u t u e s s a m m e + v a l m i s t a u t u e s s a n i + v a l m i s t a u t u i v a t + v a l m i s t a u t u k a a m m e + v a l m i s t a u t u m a a n + v a l m i s t a u t u m a s s a + v a l m i s t a u t u m i s a i k a a + v a l m i s t a u t u m i s a j a n + v a l m i s t a u t u m i s a s t e e n + v a l m i s t a u t u m i s e s s a + v a l m i s t a u t u m i s m u o t o + v a l m i s t a u t u m i s p r o s e s s i + v a l m i s t a u t u m i s p r o s e s s i a + v a l m i s t a u t u m i s t a + v a l m i s t a u t u m i s v a i h e e s s a + v a l m i s t a u t u m i s v a i h e t t a + v a l m i s t a u t u n e e t + v a l m i s t a u t u n e i t a + v a l m i s t a u t u u + v a l m i s t a u t u v i e n + v a l m i s t a v a a + v a l m i s t a v a t + v a l m i s t a v i e n + v a l m i s t a v i i n + v a l m i s t e e t + v a l m i s t e i d e n + v a l m i s t e i t a + v a l m i s t e l e e + v a l m i s t e l e m a + v a l m i s t e l e m a a n + v a l m i s t e l e m a s s a + v a l m i s t e l e m a t t a + v a l m i s t e l e m i s e k s i + v a l m i s t e l e m m e + v a l m i s t e l e t t e + v a l m i s t e l e v a a + v a l m i s t e l e v a a n + v a l m i s t e l e v a n + v a l m i s t e l e v a t + v a l m i s t e l e v i a + v a l m i s t e l e v i e n + v a l m i s t e l i + v a l m i s t e l i j a a + v a l m i s t e l i j a n a + v a l m i s t e l i j a t + v a l m i s t e l i j o i t a + v a l m i s t e l i s i + v a l m i s t e l k a a m m e + v a l m i s t e l l a + v a l m i s t e l l a a n + v a l m i s t e l l a k s e e n + v a l m i s t e l l a k s e m m e + v a l m i s t e l l e e n + v a l m i s t e l l e e t + v a l m i s t e l l e s s a a n + v a l m i s t e l l e s s a m m e + v a l m i s t e l l e s s a n i + v a l m i s t e l l e s s a n n e + v a l m i s t e l l u i s s a + v a l m i s t e l l u s t a + v a l m i s t e l l u t + v a l m i s t e l t a e s s a + v a l m i s t e l t a v a + v a l m i s t e l t a v a a + v a l m i s t e l t a v a n a + v a l m i s t e l t a v i n a + v a l m i s t e l t i i n + v a l m i s t e l t u + v a l m i s t e l t u a + v a l m i s t e l u a + v a l m i s t e l u a i k a + v a l m i s t e l u a i k a a + v a l m i s t e l u a i k a t a u l u n s a + v a l m i s t e l u a i k a t a u l u t + v a l m i s t e l u a j a n j a k s o n + v a l m i s t e l u a s i a k i r j a + v a l m i s t e l u a s i a k i r j a a + v a l m i s t e l u a s i a k i r j a n + v a l m i s t e l u a s i a k i r j a n a + v a l m i s t e l u a s i a k i r j a n n e k i n + v a l m i s t e l u a s i a k i r j a s a r j a n + v a l m i s t e l u a s i a k i r j a s a r j a s s a + v a l m i s t e l u a s i a k i r j a s s a + v a l m i s t e l u a s i a k i r j a s s a a n + v a l m i s t e l u a s i a k i r j a s t a + v a l m i s t e l u a s i a k i r j a t + v a l m i s t e l u a s i a k i r j o i s s a + v a l m i s t e l u a s i a k i r j o j a + v a l m i s t e l u a s i a k i r j o j e n + v a l m i s t e l u e l i m e n + v a l m i s t e l u e l i m e s s ä + v a l m i s t e l u e l i m e t + v a l m i s t e l u e l i m i l l e + v a l m i s t e l u h a n k k e i d e n + v a l m i s t e l u h u i p p u k o k o u s + v a l m i s t e l u i h i n + v a l m i s t e l u i s s a + v a l m i s t e l u i s t a + v a l m i s t e l u j a + v a l m i s t e l u j e n + v a l m i s t e l u j ä r j e s t e l m ä s t ä + v a l m i s t e l u k a u d e n + v a l m i s t e l u k a u d e t + v a l m i s t e l u k o k o u k s e e n + v a l m i s t e l u k o k o u k s e l l e + v a l m i s t e l u k o k o u k s e m m e + v a l m i s t e l u k o k o u k s e s s a + v a l m i s t e l u k o k o u k s i a + v a l m i s t e l u k o k o u k s i i n + v a l m i s t e l u k o k o u k s i s s a + v a l m i s t e l u k o k o u k s i s s a m m e + v a l m i s t e l u k o k o u s + v a l m i s t e l u k o k o u s m e n e t t e l y n + v a l m i s t e l u k o k o u s t e n + v a l m i s t e l u k o m i t e a + v a l m i s t e l u k o m i t e a a + v a l m i s t e l u k o m i t e a a n + v a l m i s t e l u k o m i t e a n + v a l m i s t e l u k o m i t e a s s a + v a l m i s t e l u k o n f e r e n s s e i s s a + v a l m i s t e l u k o n f e r e n s s i + v a l m i s t e l u k o n f e r e n s s i a + v a l m i s t e l u k o n f e r e n s s i i n + v a l m i s t e l u k o n f e r e n s s i n + v a l m i s t e l u k o n f e r e n s s i s s a + v a l m i s t e l u k o n f e r e n s s i s t a + v a l m i s t e l u k u n n a l l a + v a l m i s t e l u k u n n a l l e + v a l m i s t e l u k u n n a l t a + v a l m i s t e l u k u n n a n + v a l m i s t e l u k u n n a s s a + v a l m i s t e l u k u n n a s s a k i n + v a l m i s t e l u k u n n a s t a + v a l m i s t e l u k u n t a + v a l m i s t e l u k u n t a a + v a l m i s t e l u k u n t a a n + v a l m i s t e l u k u n t a m a l l i a + v a l m i s t e l u k u n t a m a l l i l l a + v a l m i s t e l u k u n t a m a l l i l l a a n + v a l m i s t e l u k u n t a m a l l i n + v a l m i s t e l u k u n t a m e n e t e l m ä + v a l m i s t e l u k u n t a m e n e t e l m ä n + v a l m i s t e l u k u n t a m e n e t e l m ä s t ä + v a l m i s t e l u k u n t a m e n e t e l m ä ä n + v a l m i s t e l u k u n t a m e n e t t e l y + v a l m i s t e l u k u n t a m e n e t t e l y n + v a l m i s t e l u k u n t a m e n e t t e l y s s ä + v a l m i s t e l u k u n t a m e n e t t e l y s t ä + v a l m i s t e l u k u n t a m e n e t t e l y y n + v a l m i s t e l u k u n t a m e n e t t e l y ä + v a l m i s t e l u k u n t a m e t o d i a + v a l m i s t e l u k u n t a t y y p p i n e n + v a l m i s t e l u k u s t a n n u k s e t + v a l m i s t e l u k u s t a n n u k s i a + v a l m i s t e l u m a l l i l l e + v a l m i s t e l u m e n e t t e l y n + v a l m i s t e l u m e n e t t e l y s s ä + v a l m i s t e l u m e n e t t e l y y n + v a l m i s t e l u m i e t i n n ö s s ä + v a l m i s t e l u m i e t i n t ö + v a l m i s t e l u m ä ä r ä a j a n + v a l m i s t e l u n + v a l m i s t e l u p r o s e s s i + v a l m i s t e l u p r o s e s s i a + v a l m i s t e l u p r o s e s s i i n + v a l m i s t e l u p r o s e s s i l l a + v a l m i s t e l u p r o s e s s i l l e + v a l m i s t e l u p r o s e s s i n + v a l m i s t e l u p r o s e s s i s s a + v a l m i s t e l u p r o s e s s i s t a + v a l m i s t e l u r a h a a + v a l m i s t e l u r a p o r t e i s s a + v a l m i s t e l u r y h m i s t ä + v a l m i s t e l u r y h m ä + v a l m i s t e l u r y h m ä n + v a l m i s t e l u r y h m ä s s ä + v a l m i s t e l u s e m i n a a r i i n + v a l m i s t e l u s s a + v a l m i s t e l u s t a + v a l m i s t e l u t + v a l m i s t e l u t a p a a m i s e s s a + v a l m i s t e l u t a s o l l a + v a l m i s t e l u t a v a s t a + v a l m i s t e l u t i e + v a l m i s t e l u t o i m e a + v a l m i s t e l u t o i m e n + v a l m i s t e l u t o i m e n a + v a l m i s t e l u t o i m e n p i d e t t ä + v a l m i s t e l u t o i m e n p i t e e n s ä + v a l m i s t e l u t o i m e n p i t e e t + v a l m i s t e l u t o i m e n p i t e i d e n + v a l m i s t e l u t o i m e n p i t e i t ä + v a l m i s t e l u t o i m e n s a + v a l m i s t e l u t o i m e s s a + v a l m i s t e l u t o i m e t + v a l m i s t e l u t o i m i + v a l m i s t e l u t o i m i a + v a l m i s t e l u t o i m i e n + v a l m i s t e l u t o i m i i n + v a l m i s t e l u t o i m i k s i + v a l m i s t e l u t o i m i k u n t a + v a l m i s t e l u t o i m i l l e + v a l m i s t e l u t o i m i s t a + v a l m i s t e l u t o i n t a + v a l m i s t e l u t y ö + v a l m i s t e l u t y ö h ö n + v a l m i s t e l u t y ö l l ä + v a l m i s t e l u t y ö m m e + v a l m i s t e l u t y ö n + v a l m i s t e l u t y ö n s ä + v a l m i s t e l u t y ö r y h m i s s ä + v a l m i s t e l u t y ö r y h m ä + v a l m i s t e l u t y ö r y h m ä n + v a l m i s t e l u t y ö s s ä + v a l m i s t e l u t y ö s s ä m m e + v a l m i s t e l u t y ö s t ä + v a l m i s t e l u t y ö s t ä ä n + v a l m i s t e l u t y ö t + v a l m i s t e l u t y ö t ä + v a l m i s t e l u t ö i d e n + v a l m i s t e l u t ö i h i n + v a l m i s t e l u t ö i l l e + v a l m i s t e l u t ö i s s ä + v a l m i s t e l u t ö i s t ä + v a l m i s t e l u t ö i s t ä ä n + v a l m i s t e l u t ö i t ä + v a l m i s t e l u u n + v a l m i s t e l u v a i h e + v a l m i s t e l u v a i h e e l l e + v a l m i s t e l u v a i h e e n + v a l m i s t e l u v a i h e e s e e n + v a l m i s t e l u v a i h e e s s a + v a l m i s t e l u v a i h e i s i i n + v a l m i s t e l u v a i h e t t a + v a l m i s t e l u v a l i o k u n t a a + v a l m i s t e l u v u o t t a + v a l m i s t e t a a n + v a l m i s t e t t a v a + v a l m i s t e t t a v i e n + v a l m i s t e t t u i h i n + v a l m i s t e t t u j a + v a l m i s t e t t u j e n + v a l m i s t e t u i l l e + v a l m i s t e t u t + v a l m i s t e v e r o + v a l m i s t e v e r o a + v a l m i s t e v e r o a l a l l a + v a l m i s t e v e r o a s t e + v a l m i s t e v e r o a s t e e t + v a l m i s t e v e r o d i r e k t i i v i s s ä + v a l m i s t e v e r o h e l p o t u k s e n + v a l m i s t e v e r o h e l p o t u s t e n + v a l m i s t e v e r o i h i n + v a l m i s t e v e r o i s s a + v a l m i s t e v e r o i s t a + v a l m i s t e v e r o j a + v a l m i s t e v e r o j e n + v a l m i s t e v e r o j ä r j e s t e l m i e n + v a l m i s t e v e r o j ä r j e s t e l m i s t ä + v a l m i s t e v e r o j ä r j e s t e l m i ä + v a l m i s t e v e r o j ä r j e s t e l m ä n + v a l m i s t e v e r o j ä r j e s t e l m ä t + v a l m i s t e v e r o k a n n a n + v a l m i s t e v e r o k a n n a t + v a l m i s t e v e r o k a n n o i s s a + v a l m i s t e v e r o k a n n o i s t a + v a l m i s t e v e r o k a n t a + v a l m i s t e v e r o k a n t a a + v a l m i s t e v e r o k a n t o i h i n + v a l m i s t e v e r o k a n t o j a + v a l m i s t e v e r o k a n t o j e n + v a l m i s t e v e r o k o m i t e a + v a l m i s t e v e r o k o m i t e a a + v a l m i s t e v e r o k o m i t e a n + v a l m i s t e v e r o l a i n s ä ä d ä n t ö ä + v a l m i s t e v e r o l a k e j a + v a l m i s t e v e r o l l a + v a l m i s t e v e r o m e n e t t e l y j e n + v a l m i s t e v e r o m e n e t t e l y j ä + v a l m i s t e v e r o m ä ä r ä y s t e n + v a l m i s t e v e r o n + v a l m i s t e v e r o n a + v a l m i s t e v e r o o n + v a l m i s t e v e r o p e t o k s i a + v a l m i s t e v e r o p o l i t i i k k a a + v a l m i s t e v e r o s s a + v a l m i s t e v e r o s t a + v a l m i s t e v e r o t + v a l m i s t e v e r o t a s o a + v a l m i s t e v e r o t a s o j e n + v a l m i s t e v e r o t a s o n + v a l m i s t e v e r o t t o m u u d e n + v a l m i s t e v e r o t u k s e l l a + v a l m i s t e v e r o t u k s e n + v a l m i s t e v e r o t u s t a + v a l m i s t e v e r o v a p a u d e s t a + v a l m i s t e v e r o v a p a u t u k s i a + v a l m i s t e v e r o v i r a n o m a i s e t + v a l m i s t e v e r o v i r a n o m a i s t e n + v a l m i s t e v e r o v ä ä r e n n ö s t e n + v a l m i s t e y h t e e n v e t o + v a l m i s t u a + v a l m i s t u k s e e n + v a l m i s t u k s e n + v a l m i s t u k s e s s a + v a l m i s t u m i s a s t e e n + v a l m i s t u m i s t a + v a l m i s t u n e e + v a l m i s t u n e i d e n + v a l m i s t u n u t + v a l m i s t u s a i n e e t + v a l m i s t u s a i n e i n e e n + v a l m i s t u s a i n e i t a + v a l m i s t u s a i n e l u e t t e l o + v a l m i s t u s a i n e l u e t t e l o a + v a l m i s t u s a i n e l u e t t e l o n + v a l m i s t u s a i n e l u e t t e l o s s a + v a l m i s t u s a j a t + v a l m i s t u s a l a + v a l m i s t u s a l a a n + v a l m i s t u s a l a l l a + v a l m i s t u s a l a l l e + v a l m i s t u s a l a n + v a l m i s t u s j ä r j e s t e l m i s t ä m m e + v a l m i s t u s j ä r j e s t e l m ä + v a l m i s t u s k a p a s i t e e t i n + v a l m i s t u s k a p a s i t e e t t i + v a l m i s t u s k a p a s i t e e t t i a + v a l m i s t u s k e i n o j a + v a l m i s t u s k e t j u n + v a l m i s t u s k e t j u u n + v a l m i s t u s k i e r r o s s a a n + v a l m i s t u s k u s t a n n u k s e t + v a l m i s t u s k u s t a n n u k s i a + v a l m i s t u s k u s t a n n u k s i i n + v a l m i s t u s k u s t a n n u k s i i n s a + v a l m i s t u s k ä y t ä n n ö n + v a l m i s t u s k ä y t ä n t ö j e n + v a l m i s t u s l i s e n s s i ä + v a l m i s t u s l u p a + v a l m i s t u s l u p a n s a + v a l m i s t u s l u v a n + v a l m i s t u s m a a l l a + v a l m i s t u s m a a m e r k i n n ä n + v a l m i s t u s m a a n s a + v a l m i s t u s m e n e t e l m i e n + v a l m i s t u s m e n e t e l m i i m m e + v a l m i s t u s m e n e t e l m i i n + v a l m i s t u s m e n e t e l m i n + v a l m i s t u s m e n e t e l m i s s ä + v a l m i s t u s m e n e t e l m i s t ä + v a l m i s t u s m e n e t e l m i ä + v a l m i s t u s m e n e t e l m ä + v a l m i s t u s m e n e t e l m ä n s ä + v a l m i s t u s m e n e t e l m ä s t ä + v a l m i s t u s m e n e t e l m ä t + v a l m i s t u s m e n e t e l m ä ä + v a l m i s t u s m e n e t t e l y i s s ä + v a l m i s t u s m e n e t t e l y t + v a l m i s t u s m e r k i n n ä n + v a l m i s t u s n o r m e j a + v a l m i s t u s o i k e u t t a + v a l m i s t u s o l o s u h t e e t + v a l m i s t u s o l o s u h t e i d e n + v a l m i s t u s o l o s u h t e i s i i n + v a l m i s t u s p a i k a n + v a l m i s t u s p a i k o i l l a + v a l m i s t u s p o t e n t i a a l i a + v a l m i s t u s p r o s e s s e i s s a + v a l m i s t u s p r o s e s s e i s s a a n + v a l m i s t u s p r o s e s s e j a + v a l m i s t u s p r o s e s s i a + v a l m i s t u s p r o s e s s i e n + v a l m i s t u s p r o s e s s i i n + v a l m i s t u s p r o s e s s i n + v a l m i s t u s p r o s e s s i s s a + v a l m i s t u s p ä i v i s t ä + v a l m i s t u s p ä i v ä m ä ä r ä + v a l m i s t u s p ä i v ä m ä ä r ä n + v a l m i s t u s r a k e n t e i t a + v a l m i s t u s s e k t o r i + v a l m i s t u s s e k t o r i l l a + v a l m i s t u s s t a n d a r d e j a + v a l m i s t u s s u u n n i t e l m a n + v a l m i s t u s s y k l e j ä + v a l m i s t u s t a p a a + v a l m i s t u s t a p o j e n + v a l m i s t u s t a r k o i t u k s e s s a + v a l m i s t u s t a v a n + v a l m i s t u s t a v a s t a + v a l m i s t u s t e h t a i s i i n + v a l m i s t u s t e k n i i k a n + v a l m i s t u s t e k n i i k k a + v a l m i s t u s t e o l l i s u u d e l l a + v a l m i s t u s t e o l l i s u u d e l l e + v a l m i s t u s t e o l l i s u u d e n + v a l m i s t u s t e o l l i s u u d e s s a + v a l m i s t u s t e o l l i s u u s + v a l m i s t u s t e o l l i s u u t e e n + v a l m i s t u s t e o l l i s u u t e m m e + v a l m i s t u s t e o l l i s u u t t a + v a l m i s t u s t o i m i n n a n + v a l m i s t u s v a i h e e s s a + v a l m i s t u s v i r h e i s i i n + v a l m i s t u s v i r h e i s t ä + v a l m i s t u s v u o d e s t a + v a l m i s t u s y h t i ö i s t ä + v a l m i s t u s y r i t y k s e n + v a l m i s t u s y r i t y k s e s s ä + v a l m i s t u s y r i t y s t e n + v a l m i s t u u + v a l m i s t u v a n + v a l m i s t u v a t + v a l m i u d e l l e m m e + v a l m i u d e n + v a l m i u d e s s a + v a l m i u d e s t a + v a l m i u d e s t a a n + v a l m i u d e s t a m m e + v a l m i u d e t + v a l m i u k s i a + v a l m i u k s i a a n + v a l m i u k s i a m m e + v a l m i u k s i e m m e + v a l m i u k s i e n + v a l m i u k s i i n + v a l m i u k s i s s a + v a l m i u k s i s t a + v a l m i u s a l u k s e t + v a l m i u s a l u k s i a + v a l m i u s a l u k s i e n + v a l m i u s a l u s t e n + v a l m i u s a s t e e n + v a l m i u s a s t e e s t a + v a l m i u s j o u k k o + v a l m i u s j o u k o i k s i + v a l m i u s j o u k o n + v a l m i u s j o u k o t + v a l m i u s j ä r j e s t e l m ä s t ä + v a l m i u s j ä r j e s t e l y + v a l m i u s k e s k u k s e n + v a l m i u s k e s k u k s e s s a + v a l m i u s k e s k u s + v a l m i u s k y t k i m i ä + v a l m i u s l u o t t o j ä r j e s t e l y n + v a l m i u s m o d u u l e j a + v a l m i u s o h j e l m a a n + v a l m i u s p r o s e s s i + v a l m i u s r a k e n t e e t + v a l m i u s r y h m ä + v a l m i u s s o p i m u k s i a + v a l m i u s s u u n n i t e l m a + v a l m i u s s u u n n i t e l m a a + v a l m i u s s u u n n i t e l m a a n + v a l m i u s s u u n n i t e l m a m m e + v a l m i u s s u u n n i t e l m a n + v a l m i u s s u u n n i t e l m a t + v a l m i u s s u u n n i t e l m i a + v a l m i u s s u u n n i t e l m i e n + v a l m i u s s u u n n i t e l m i i n + v a l m i u s s u u n n i t t e l u + v a l m i u s s u u n n i t t e l u a + v a l m i u s t a s o + v a l m i u s t a s o a + v a l m i u s t a s o a m m e + v a l m i u s t a s o n + v a l m i u s t a s o s t a + v a l m i u s t i l a a + v a l m i u s t i l a s s a + v a l m i u s t i l a t o i m i n n o n + v a l m i u s t o i m i a + v a l m i u s t o i m i a m m e + v a l m i u s v ä l i n e i t ä + v a l m i u s y k s i k ö n + v a l m i u t e e n + v a l m i u t e n s a + v a l m i u t t a + v a l o a + v a l o d i o d i v a l o n l ä h t e e t + v a l o e e t t e r i + v a l o h e r k k y y s + v a l o h o i t o a + v a l o i h i n + v a l o i s a a + v a l o i s a m m a k s i + v a l o i s a m m a t + v a l o i s a m m i l t a + v a l o i s a m p a a + v a l o i s a m p i a + v a l o j a + v a l o j o h d i n + v a l o k a a p e l i e n + v a l o k a a p e l i t u t k a + v a l o k a a r i + v a l o k a a r i u u n i + v a l o k a a s u + v a l o k e i l a s s a + v a l o k o p i o t e k n i i k o i l l a + v a l o k u i t u + v a l o k u i t u v e r k k o i h i n + v a l o k u i t u v e r k k o j a + v a l o k u i t u y h t e y k s i ä + v a l o k u v a + v a l o k u v a a j a t + v a l o k u v a f i l m i n + v a l o k u v a f i l m i r u u t u k o k o + v a l o k u v a j u l i s t e t t a + v a l o k u v a l l i s e t + v a l o k u v a n ä y t t e l y + v a l o k u v a n ä y t t e l y l l ä + v a l o k u v a n ä y t t e l y n + v a l o k u v a n ä y t t e l y y n + v a l o k u v a n ä y t t e l y ä + v a l o k u v a p a p e r i + v a l o k u v a t a i d e + v a l o k u v a u s k i l p a i l u i h i n + v a l o k u v a u s t a + v a l o k u v a u s t e k n i i k a s t a + v a l o k u v a u s t i l a i s u u s + v a l o k u v i a + v a l o k u v i e n + v a l o k u v i s s a + v a l o k y n ä + v a l o k ä y r ä + v a l o m a a l a u s + v a l o m a i n o s + v a l o m a s t o + v a l o m i k r o s k o o p p i + v a l o n + v a l o n a r o i s t a + v a l o n h e i t i n p a t t e r i + v a l o n h e i t t i m e t + v a l o n h ä i v ä + v a l o n h ä i v ä h d y s + v a l o n k i p i n ä n + v a l o n l ä h t e i t ä + v a l o n n o p e u d e l l a + v a l o n n o p e u s + v a l o n p i l k a h d u s + v a l o n p i l k k u + v a l o n s ä d e + v a l o n s ä d e t t ä + v a l o n s ä t e i s i i n + v a l o n v a h v i s t i n + v a l o o n + v a l o p i l k k u + v a l o p i l k k u j a + v a l o p i l k u i s t a + v a l o p i s t e t t ä + v a l o p i s t o o l i + v a l o s a a s t e + v a l o s a r j a + v a l o s u u n n i t t e l u + v a l o t + v a l o t a i d e + v a l o t a u l u l t a + v a l o t e h o f u n k t i o + v a l o t e h o k k u u s + v a l o t i k k u + v a l o t t a a + v a l o t t a a k s e e n + v a l o t t a m a a n + v a l o t t a m i s e k s i + v a l o t t a v a n + v a l o t u s a i k a + v a l o v e r h o + v a l o v i r t a + v a l o v o i m a + v a l o v u o d e n + v a l o v u o s i + v a l o v u o s i a + v a l o v u o s i e n + v a l p p a a m m a n + v a l p p a a m m i n + v a l p p a a m p i + v a l p p a a m p i a + v a l p p a a n a + v a l p p a a s s a + v a l p p a i n a + v a l p p a i t a + v a l p p a u s t a s o a m m e + v a l p p a u t e e n + v a l p p a u t e n s a + v a l p p a u t t a + v a l t a a m a s s a + v a l t a a m m e + v a l t a a n n o u s u a + v a l t a a n s a + v a l t a a p i t ä v i e n + v a l t a a v a + v a l t a a v a t + v a l t a e l i i t i n + v a l t a e l i i t t i + v a l t a e l i n t e n + v a l t a e n e m m i s t ö + v a l t a e n e m m i s t ö l l ä + v a l t a e n e m m i s t ö l t ä + v a l t a e n e m m i s t ö n + v a l t a e n e m m i s t ö s t ä + v a l t a e n e m m i s t ö ä + v a l t a h a n k k e i t a a n + v a l t a i s a a + v a l t a i s a l l a + v a l t a i s t u i m e s t a + v a l t a i s t u i m i l l e + v a l t a i s t u i n p e l i + v a l t a j ä r j e s t e l m i e n + v a l t a j ä r j e s t e l m i s s ä + v a l t a j ä r j e s t e l m ä n + v a l t a j ä r j e s t e l m ä ä + v a l t a j ä r j e s t e l m ä ä n + v a l t a j ä r j e s t y s t ä + v a l t a k a m p p a i l u + v a l t a k a m p p a i l u a + v a l t a k a m p p a i l u n + v a l t a k a m p p a i l u s t a + v a l t a k a m p p a i l u u n + v a l t a k a u d e l l a + v a l t a k e s k i t t y m i e n + v a l t a k e s k i t t y m i ä + v a l t a k e s k i t t y m ä ä + v a l t a k e s k i ö + v a l t a k e s k u k s i i n + v a l t a k e s k u k s i n a + v a l t a k e s k u k s i s t a + v a l t a k e s k u s + v a l t a k e s k u s t e n + v a l t a k i e l i + v a l t a k i i s t o i l t a + v a l t a k i r j a + v a l t a k i r j a a + v a l t a k i r j a a n + v a l t a k i r j a a n s a + v a l t a k i r j a n + v a l t a k i r j a n a + v a l t a k i r j a n s a + v a l t a k i r j a ä ä n e s t y s + v a l t a k i r j o j e n + v a l t a k o l m i o s s a + v a l t a k o n e i s t o n + v a l t a k o n e i s t o s s a + v a l t a k o n e i s t o s t a + v a l t a k o n f l i k t i e n + v a l t a k o n f l i k t i t + v a l t a k u l t t u u r i + v a l t a k u l t t u u r i a + v a l t a k u l t t u u r i i n + v a l t a k u n n a l l i s e n + v a l t a k u n n a n k a n a v a t + v a l t a k u n n a n k a n s l i a + v a l t a k u n n a n k a u p u n k i + v a l t a k u n n a n k r e i v i + v a l t a k u n n a n n e u v o s t o t + v a l t a k u n n a n r a j a n + v a l t a k u n n a n s a l i + v a l t a k u n n a n s y y t t ä j ä + v a l t a k u n n a n s y y t t ä j ä l l e + v a l t a k u n n a n s ä ä t y + v a l t a k u n t a + v a l t a k y s y m y k s e n + v a l t a k y s y m y k s e t + v a l t a k y s y m y s + v a l t a l u o k k a + v a l t a m e k a n i s m i s t a + v a l t a m e r e n + v a l t a m e r e t + v a l t a m e r i a l u e e l l a + v a l t a m e r i a l u k s e t + v a l t a m e r i e n e r g i a a + v a l t a m e r i k a l a s t u s + v a l t a m e r i k o m i s s i o + v a l t a m e r i l a i v a a n + v a l t a m e r i l a i v o j a + v a l t a m e r i l i i k e n n e + v a l t a m e r i l i i k e n t e e s s ä + v a l t a m e r i l l ä + v a l t a m e r i p l a n e e t t a + v a l t a m e r i s s ä + v a l t a m e r i s t ä + v a l t a m e r i t e k n i i k o i s s a + v a l t a m e r i v i r a s t o n + v a l t a m e r t a + v a l t a m o n o p o l i + v a l t a m o n o p o l i n + v a l t a m o n o p o l i n s a + v a l t a m u u t o s t e n + v a l t a n s a + v a l t a o i k e u d e t + v a l t a o i k e u k s i a + v a l t a o i k e u k s i a a n + v a l t a o i k e u k s i e n + v a l t a o s a + v a l t a o s a a + v a l t a o s a a n + v a l t a o s a l l a + v a l t a o s a l l e + v a l t a o s a l t a + v a l t a o s a l t a a n + v a l t a o s a n + v a l t a o s a s s a + v a l t a o s i n + v a l t a p e l e i h i n + v a l t a p e l e i s t ä + v a l t a p e l e j ä + v a l t a p e l i + v a l t a p e l i e n + v a l t a p e l i i n + v a l t a p e l i k s i + v a l t a p e l i n + v a l t a p e l i n ä + v a l t a p e l i s s ä + v a l t a p e l i s t ä + v a l t a p e l i ä + v a l t a p o l i i t t i s e s s a + v a l t a p o l i i t t i s i a + v a l t a p o l i i t t i s i n + v a l t a p o l i i t t i s i s t a + v a l t a p o l i t i i k a n + v a l t a p o l i t i i k k a + v a l t a p o l i t i i k k a a + v a l t a p o l i t i i k k a a n + v a l t a p u o l u e + v a l t a p u o l u e e n + v a l t a p u o l u e e s s a + v a l t a p u o l u e e t + v a l t a p u o l u e i d e n + v a l t a p u o l u e i l l a + v a l t a p u o l u e t t a + v a l t a p y r k i m y k s e t + v a l t a p y r k i m y k s i e n + v a l t a p y r k i m y k s i ä ä n + v a l t a r a k e n n e + v a l t a r a k e n t e e s e e n + v a l t a r a k e n t e e t + v a l t a r a k e n t e i d e n + v a l t a r a k e n t e i s i i n + v a l t a r a k e n t e i s t a + v a l t a r a k e n t e i t a + v a l t a r y h m i l l e + v a l t a r y h m i t t y m ä n s ä + v a l t a r y h m ä t + v a l t a s o r m u s + v a l t a s u h d e + v a l t a s u h t e e s t a + v a l t a s u h t e e t + v a l t a s u h t e i d e n + v a l t a s u h t e i s i i n + v a l t a s u h t e i s s a + v a l t a s u h t e i s t a + v a l t a s u h t e i s t a a n + v a l t a s u h t e i t a + v a l t a s u u n t a u k s e n a + v a l t a t a i s t e l u + v a l t a t a i s t e l u a + v a l t a t a i s t e l u i d e n + v a l t a t a i s t e l u i h i n + v a l t a t a i s t e l u i l l e + v a l t a t a i s t e l u i s s a + v a l t a t a i s t e l u i s t a + v a l t a t a i s t e l u j a + v a l t a t a i s t e l u j e n + v a l t a t a i s t e l u n + v a l t a t a i s t e l u n a + v a l t a t a i s t e l u s s a + v a l t a t a i s t e l u s t a + v a l t a t a i s t e l u t + v a l t a t a i s t e l u u n + v a l t a t a s a p a i n o + v a l t a t a s a p a i n o a + v a l t a t a s a p a i n o n + v a l t a t a s a p a i n o s s a + v a l t a t e i l l ä + v a l t a t e k i j ä + v a l t a t i e + v a l t a t i e h a n k e t t a + v a l t a t i e t + v a l t a t y h j i ö + v a l t a t y h j i ö n + v a l t a t y h j i ö t ä + v a l t a t y h j i ö ö n + v a l t a u n e l m a + v a l t a u s k o n t o + v a l t a u s s o t i a + v a l t a u s t a i s t e l u + v a l t a u s t i l a n t e i s s a + v a l t a u s y r i t y k s e l t ä + v a l t a u s y r i t y k s e n + v a l t a u s y r i t y k s i i n + v a l t a u s y r i t y k s i s t ä + v a l t a v a a + v a l t a v a a n + v a l t a v a a t i m u k s e t + v a l t a v a a t i m u s + v a l t a v a k s i + v a l t a v a l l a + v a l t a v a l l e + v a l t a v a n + v a l t a v a n a + v a l t a v a n k o k o i s i a + v a l t a v a s s a + v a l t a v a s t a + v a l t a v a t + v a l t a v i a + v a l t a v i e n + v a l t a v i l l a + v a l t a v i l l e + v a l t a v i n + v a l t a v i n a + v a l t a v i r r a n + v a l t a v i r t a i s t a m i s a s i o i s s a + v a l t a v i r t a i s t a m i s e e n + v a l t a v i r t a i s t a m i s e k s i + v a l t a v i r t a i s t a m i s e l l e + v a l t a v i r t a i s t a m i s e n + v a l t a v i r t a i s t a m i s e s s a + v a l t a v i r t a i s t a m i s e s t a + v a l t a v i r t a i s t a m i s p e r i a a t e t t a + v a l t a v i r t a i s t a m i s p e r i a a t t e e n + v a l t a v i r t a i s t a m i s p o l i t i i k k a a + v a l t a v i r t a i s t a m i s t a + v a l t a v i r t a i s t a m i s t o i m i e n + v a l t a v i r t a i s t e t t a v a + v a l t a v i r t a k ä s i t t e e s t ä + v a l t a v i r t a m u s i i k i n + v a l t a v i r t a p u o l u e e t + v a l t a v i r t a u s t e n + v a l t a v i r t a y h t e i s k u n t a a n + v a l t a v i s s a + v a l t a v i s t a + v a l t a v ä e s t ö + v a l t a v ä e s t ö l l e + v a l t a v ä e s t ö n + v a l t a v ä e s t ö t + v a l t a v ä e s t ö ä + v a l t a v ä e s t ö ä k i n + v a l t a v ä e s t ö ö n + v a l t a v ä y l i e n + v a l t a v ä y l ä a s i a s s a + v a l t a v ä y l ä l i i k e n t e e n + v a l t a v ä y l ä r e i t t e i h i n + v a l t a y h t e i s k u n t a a n + v a l t i m o a + v a l t i m o t + v a l t i o a t e i s m i + v a l t i o i d e m m e + v a l t i o i d e n + v a l t i o i d e n s a + v a l t i o i d e o l o g i a + v a l t i o i d e o l o g i a n + v a l t i o i h i m m e + v a l t i o i h i n + v a l t i o i k s i + v a l t i o i l l a + v a l t i o i l l e + v a l t i o i l l e m m e + v a l t i o i l t a + v a l t i o i l t a m m e + v a l t i o i n a + v a l t i o i s s a + v a l t i o i s s a a n + v a l t i o i s s a k i n + v a l t i o i s s a m m e + v a l t i o i s s a m m e k i n + v a l t i o i s t a + v a l t i o i s t a a n + v a l t i o i t a + v a l t i o i t a m m e + v a l t i o j a k o + v a l t i o j o h t o + v a l t i o j o h t o i n e n + v a l t i o j o h t o i s e l l a + v a l t i o j o h t o i s e l l e + v a l t i o j o h t o i s e n + v a l t i o j o h t o i s e s t a + v a l t i o j o h t o i s i a + v a l t i o j o h t o i s i i n + v a l t i o j o h t o i s i l l a + v a l t i o j o h t o i s t a + v a l t i o j ä r j e s t e l m ä + v a l t i o j ä r j e s t e l m ä n + v a l t i o j ä r j e s t y k s e n + v a l t i o k a m a r i + v a l t i o k a p i t a l i s m i + v a l t i o k a p i t a l i s m i a + v a l t i o k a p i t a l i s m i i n + v a l t i o k a s s a n + v a l t i o k i i n t i ö + v a l t i o k o h t a i s e t + v a l t i o k o h t a i s i a + v a l t i o k o h t a i s t a + v a l t i o k o h t a i s t e n + v a l t i o k o n e i s t o n + v a l t i o k o n e i s t o n s a + v a l t i o k o n e i s t o o n + v a l t i o k o n e i s t o s s a + v a l t i o k o n e i s t o s t a + v a l t i o k o n t t o r i + v a l t i o k o r r u p t i o + v a l t i o k s i + v a l t i o k y s y m y s + v a l t i o l i i t o i s t a + v a l t i o l i i t o k s i + v a l t i o l i i t o l l a + v a l t i o l i i t o l l e + v a l t i o l i i t o n + v a l t i o l i i t o s s a + v a l t i o l i i t o s t a + v a l t i o l i i t t o + v a l t i o l i i t t o a + v a l t i o l l a + v a l t i o l l e + v a l t i o l l e n i + v a l t i o l l i s e e n + v a l t i o l l i s e l l e + v a l t i o l l i s e t + v a l t i o l l i s i a + v a l t i o l l i s i i n + v a l t i o l l i s i l l e + v a l t i o l l i s t e n + v a l t i o l t a + v a l t i o m a l l i + v a l t i o m a l l i a + v a l t i o m a l l i n + v a l t i o m i e h e t + v a l t i o m i e s t a i t o a + v a l t i o m i n i s t e r i + v a l t i o m o n o p o l i s t i s i a + v a l t i o m u o d o n + v a l t i o m u o d o s t a + v a l t i o m u o d o s t e l m a k s i + v a l t i o m u o t o + v a l t i o m u o t o o n + v a l t i o n + v a l t i o n a + v a l t i o n a a p u r u s t o t + v a l t i o n a p u + v a l t i o n a p u a + v a l t i o n a p u j a + v a l t i o n a p u j e n + v a l t i o n a p u k r i t e e r e j ä + v a l t i o n a p u p o l i t i i k k a + v a l t i o n a p u r a j o i t u s t e n + v a l t i o n a p u s ä ä n t ö j ä + v a l t i o n a p u t u r i s t e i s t a + v a l t i o n a p u u n + v a l t i o n a t i o n a l i s m i a + v a l t i o n a v u i s t a + v a l t i o n a v u k s i + v a l t i o n a v u l l a + v a l t i o n a v u l t a + v a l t i o n a v u n + v a l t i o n a v u s t a + v a l t i o n a v u s t u k s i i n + v a l t i o n a v u t + v a l t i o n b u d j e t i l l a + v a l t i o n b u d j e t i l l e + v a l t i o n b u d j e t i s t a + v a l t i o n e l i m e t + v a l t i o n e l ä k e + v a l t i o n e l ä k e o i k e u k s i e n + v a l t i o n e l ä k e t t ä + v a l t i o n e l ä k k e e n s ä + v a l t i o n e l ä k k e i l l e + v a l t i o n e l ä k k e i t ä + v a l t i o n e t u + v a l t i o n e t u u k s i e n + v a l t i o n e u v o s t o + v a l t i o n e u v o s t o j e n + v a l t i o n e u v o s t o n + v a l t i o n e u v o s t o o n + v a l t i o n h a l l i n n o i s s a + v a l t i o n h a l l i n n o n + v a l t i o n h a l l i n n o s s a + v a l t i o n h a l l i n n o s t a + v a l t i o n h a l l i n t o + v a l t i o n h a l l i n t o a + v a l t i o n j o h t a j a t + v a l t i o n j o h t a j i a + v a l t i o n j o h t o i s e n + v a l t i o n j o h t o i s e s t a + v a l t i o n k a n s l i a n + v a l t i o n k a n s l i o i d e n + v a l t i o n k a s s a a n + v a l t i o n k a s s a n + v a l t i o n k a s s o i h i n + v a l t i o n k i r j a s t o + v a l t i o n k o m i t e a + v a l t i o n k o n e i s t o + v a l t i o n k o n e i s t o a + v a l t i o n k o n t t o r i t + v a l t i o n k o u l u j e n + v a l t i o n l a i n o j e n + v a l t i o n l a i t o k s e n + v a l t i o n l a i t o s t e n + v a l t i o n m e t s i ä + v a l t i o n m o n o p o l e i h i n + v a l t i o n m o n o p o l e j a + v a l t i o n m o n o p o l i a + v a l t i o n m o n o p o l i e n + v a l t i o n m o n o p o l i j ä r j e s t e l m ä + v a l t i o n m o n o p o l i n + v a l t i o n m o n o p o l i t + v a l t i o n o b l i g a a t i o i l l a + v a l t i o n o b l i g a a t i o i l t a m m e + v a l t i o n o b l i g a a t i o i s t a + v a l t i o n o b l i g a a t i o i t a + v a l t i o n o b l i g a a t i o l a i n a + v a l t i o n o b l i g a a t i o n s a + v a l t i o n o b l i g a a t i o t + v a l t i o n o m i s t u s + v a l t i o n o o p p e r a + v a l t i o n o o p p e r a s s a + v a l t i o n o s u u k s i l l a + v a l t i o n p a l k i n n o n + v a l t i o n p a n k i s t a + v a l t i o n p a n k k i + v a l t i o n p a n k k i e n + v a l t i o n p e t o k s e s t a + v a l t i o n p o l i t i i k a k s i + v a l t i o n p o l i t i i k a n + v a l t i o n p o l i t i i k k o j e n + v a l t i o n p ä ä m i e h e k s e e n + v a l t i o n p ä ä m i e h e l t ä + v a l t i o n p ä ä m i e h e n + v a l t i o n p ä ä m i e h e t + v a l t i o n p ä ä m i e h i l l e + v a l t i o n p ä ä m i e h i ä + v a l t i o n p ä ä m i e s + v a l t i o n p ä ä m i e s t a s o i s e n + v a l t i o n p ä ä m i e s t a s o l l a + v a l t i o n p ä ä m i e s t e n + v a l t i o n p ä ä m i e s t o v e r i t + v a l t i o n p ä ä m i e s t ä + v a l t i o n p ä ä n m i e s + v a l t i o n r a h o i t u s t a + v a l t i o n r a j a t + v a l t i o n r a j o j a + v a l t i o n r a j o j e n + v a l t i o n r a k e n t e i d e n + v a l t i o n s a + v a l t i o n s a l a i s u u d e k s i + v a l t i o n s a l a i s u u d e l l a + v a l t i o n s a l a i s u u d e n + v a l t i o n s a l a i s u u k s i a + v a l t i o n s a l a i s u u t t a + v a l t i o n s i s ä i n e n + v a l t i o n s y y t t ä j i e n + v a l t i o n s y y t t ä j ä + v a l t i o n s y y t t ä j ä l l e + v a l t i o n s y y t t ä j ä n v i r a s t o + v a l t i o n t a h o n + v a l t i o n t a k a u k s i a + v a l t i o n t a k a u k s i e n + v a l t i o n t a k a u k s i i n + v a l t i o n t a k u i s t a + v a l t i o n t a k u i t a + v a l t i o n t a k u u + v a l t i o n t a l o u d e l l a + v a l t i o n t a l o u d e l l e + v a l t i o n t a l o u d e l l i s t a + v a l t i o n t a l o u d e n + v a l t i o n t a l o u d e s s a + v a l t i o n t a l o u d e s t a + v a l t i o n t a l o u d e t + v a l t i o n t a l o u k s i a + v a l t i o n t a l o u k s i e n + v a l t i o n t a l o u k s i l t a + v a l t i o n t a l o u s + v a l t i o n t a l o u t e e n + v a l t i o n t a l o u t t a + v a l t i o n t a s o l l a + v a l t i o n t e r r o r i + v a l t i o n t e r r o r i l l a a n + v a l t i o n t e r r o r i s m i + v a l t i o n t e r r o r i s m i a + v a l t i o n t e r r o r i s m i a a n + v a l t i o n t e r r o r i s m i k s i + v a l t i o n t u e k s i + v a l t i o n t u e l l a + v a l t i o n t u e l l e + v a l t i o n t u e n + v a l t i o n t u e s s a + v a l t i o n t u e s t a + v a l t i o n t u e t + v a l t i o n t u i k s i + v a l t i o n t u i l l a + v a l t i o n t u i l l e + v a l t i o n t u i s s a + v a l t i o n t u i s t a + v a l t i o n t u k e + v a l t i o n t u k e a + v a l t i o n t u k e a a n + v a l t i o n t u k e e n + v a l t i o n t u k e n a + v a l t i o n t u k i + v a l t i o n t u k i a + v a l t i o n t u k i a l u e i t a + v a l t i o n t u k i a s i o i s s a + v a l t i o n t u k i a s i o i s t a + v a l t i o n t u k i e n + v a l t i o n t u k i h a k e m u k s i a + v a l t i o n t u k i i n + v a l t i o n t u k i j ä r j e s t e l m i e n + v a l t i o n t u k i j ä r j e s t e l m i s t ä + v a l t i o n t u k i j ä r j e s t e l m ä + v a l t i o n t u k i j ä r j e s t e l m ä l t ä + v a l t i o n t u k i j ä r j e s t e l m ä m m e + v a l t i o n t u k i j ä r j e s t e l m ä n + v a l t i o n t u k i j ä r j e s t e l m ä s s ä + v a l t i o n t u k i j ä r j e s t e l m ä t + v a l t i o n t u k i j ä r j e s t e l m ä ä + v a l t i o n t u k i k a r t t a + v a l t i o n t u k i k e h y k s e n + v a l t i o n t u k i k e h y k s i ä + v a l t i o n t u k i k e h y s + v a l t i o n t u k i k e l p o i s u u d e n + v a l t i o n t u k i k u r i + v a l t i o n t u k i k u r i a + v a l t i o n t u k i k y s y m y k s e s s ä + v a l t i o n t u k i k y s y m y s + v a l t i o n t u k i k ä s i t e t t ä + v a l t i o n t u k i k ä y t ä n t ö + v a l t i o n t u k i l a i n s ä ä d ä n n ö n + v a l t i o n t u k i l a k e j a + v a l t i o n t u k i m a k s u t + v a l t i o n t u k i m e k a n i s m i e n + v a l t i o n t u k i m e n e t t e l y + v a l t i o n t u k i m e n e t t e l y i s t ä + v a l t i o n t u k i m e n e t t e l y j ä + v a l t i o n t u k i m e n e t t e l y t + v a l t i o n t u k i m i e t i n n ö s s ä + v a l t i o n t u k i m u o d o s t a + v a l t i o n t u k i m u o t o j a + v a l t i o n t u k i m ä ä r ä y k s i ä + v a l t i o n t u k i m ä ä r ä y s t e n + v a l t i o n t u k i n a + v a l t i o n t u k i o h j e l m i a + v a l t i o n t u k i o n g e l m a a n + v a l t i o n t u k i p a k e t e i s t a + v a l t i o n t u k i p a k e t t e j a + v a l t i o n t u k i p a k e t t i + v a l t i o n t u k i p o l i t i i k a l l a + v a l t i o n t u k i p o l i t i i k a l l e + v a l t i o n t u k i p o l i t i i k a n + v a l t i o n t u k i p o l i t i i k a s s a + v a l t i o n t u k i p o l i t i i k a s t a + v a l t i o n t u k i p o l i t i i k a t + v a l t i o n t u k i p o l i t i i k k a + v a l t i o n t u k i p o l i t i i k k a a + v a l t i o n t u k i p o l i t i i k k a a m m e + v a l t i o n t u k i p o l i t i i k k a a n + v a l t i o n t u k i p o l i t i i k k o j e n + v a l t i o n t u k i p u i t t e i t a + v a l t i o n t u k i p ä ä t ö k s e e n + v a l t i o n t u k i p ä ä t ö k s e n + v a l t i o n t u k i p ä ä t ö s t e n + v a l t i o n t u k i r e k i s t e r i i n + v a l t i o n t u k i r e k i s t e r i n + v a l t i o n t u k i r e k i s t e r i ä + v a l t i o n t u k i s t r a t e g i o i d e n + v a l t i o n t u k i s u u n n i t e l m a a + v a l t i o n t u k i s ä ä n n ö i s t ä + v a l t i o n t u k i s ä ä n n ö k s i s t ä + v a l t i o n t u k i s ä ä n n ö s t e n + v a l t i o n t u k i s ä ä n n ö t + v a l t i o n t u k i s ä ä n t ö i h i n + v a l t i o n t u k i s ä ä n t ö j e n + v a l t i o n t u k i s ä ä n t ö j ä + v a l t i o n t u k i t a p a u k s i a + v a l t i o n t u k i t a p a u k s i i n + v a l t i o n t u k i t o i m e n p i t e i d e n + v a l t i o n t u k i t o i m e t + v a l t i o n t u k i t o i m i a + v a l t i o n t u k i u u d i s t u k s e l l a + v a l t i o n t u k i u u d i s t u k s e n + v a l t i o n t u k i u u d i s t u k s e s t a + v a l t i o n t u k i u u d i s t u s + v a l t i o n t u k i u u d i s t u s t a + v a l t i o n t u k i v i i d a k o s s a + v a l t i o n t u l o j a + v a l t i o n t u l o j e n + v a l t i o n t u l o t + v a l t i o n t u r v a l l i s u u d e s t a + v a l t i o n t y ö l l ä + v a l t i o n u s k o n n o i s t a + v a l t i o n u s k o n n o t + v a l t i o n u s k o n t o + v a l t i o n v a j e e s t a + v a l t i o n v a r a i n m i n i s t e r e i d e n + v a l t i o n v a r a i n m i n i s t e r e i t ä + v a l t i o n v a r a i n m i n i s t e r i + v a l t i o n v a r a i n m i n i s t e r i e n + v a l t i o n v a r a i n m i n i s t e r i n s ä + v a l t i o n v a r a i n m i n i s t e r i t + v a l t i o n v a r a i n m i n i s t e r i ö l l e + v a l t i o n v a r a i n m i n i s t e r i ö n + v a l t i o n v a r a i n m i n i s t e r i ö n ä + v a l t i o n v a r a i n m i n i s t e r i ö t + v a l t i o n v a r a r i k k o + v a l t i o n v a r o i h i n + v a l t i o n v a r o i s t a + v a l t i o n v a r o j a + v a l t i o n v a r o j e n + v a l t i o n v e l a k s i + v a l t i o n v e l a l l e + v a l t i o n v e l a n + v a l t i o n v e l a s t a + v a l t i o n v e l a s t a m m e + v a l t i o n v e l a t + v a l t i o n v e l k a + v a l t i o n v e l k a a + v a l t i o n v e l k a a n + v a l t i o n v e l k a k r i i s i + v a l t i o n v e l k a k r i i s i i n + v a l t i o n v e l k a k r i i s i k s i + v a l t i o n v e l k a k r i i s i n + v a l t i o n v e l k a k r i i s i s s ä + v a l t i o n v e l k a k r i i s i ä + v a l t i o n v e l k a m a r k k i n o i d e n + v a l t i o n v e l k a m a r k k i n o i l l a + v a l t i o n v e l k a m a r k k i n o i t a + v a l t i o n v e l k a n s a + v a l t i o n v e l k a o n g e l m a k s i + v a l t i o n v e l k a o n g e l m i e n + v a l t i o n v e l k a r i s k e j ä + v a l t i o n v e l k a t i l a n n e t t a + v a l t i o n v e l k o i h i n + v a l t i o n v e l k o j a + v a l t i o n v e l k o j e n + v a l t i o n v e l o i l l e + v a l t i o n v e l o i s t a + v a l t i o n v i r a n o m a i s e t + v a l t i o n v i r a n o m a i s t e n + v a l t i o n v i r a s t o t + v a l t i o n v i r k a m i e s t e n + v a l t i o n y h t i ö + v a l t i o n y h t i ö i d e n + v a l t i o n y h t i ö i l l e + v a l t i o n y h t i ö i s s ä + v a l t i o n y h t i ö i s t ä + v a l t i o n y h t i ö i t ä + v a l t i o n y h t i ö i t ä ä n + v a l t i o n y h t i ö j ä t t i l ä i s e t + v a l t i o n y h t i ö k s i + v a l t i o n y h t i ö l l ä + v a l t i o n y h t i ö t + v a l t i o n y l i o p i s t o + v a l t i o n y l i o p i s t o j e n + v a l t i o n y l i o p i s t o n + v a l t i o n y r i t y k s e n + v a l t i o n y r i t y k s e s s ä + v a l t i o n y r i t y k s e t + v a l t i o n y r i t y k s i s t ä + v a l t i o n y r i t y k s i s t ä ä n + v a l t i o n y r i t y k s i ä + v a l t i o n y r i t y s + v a l t i o n y r i t y s t e n + v a l t i o o n + v a l t i o p e r h e e t + v a l t i o p e r u s t e i s t a + v a l t i o p e t o k s e n + v a l t i o p e t o s + v a l t i o p o l i t i i k k a a + v a l t i o p o l i t i i k k a a n + v a l t i o p o l i t i i k k o j e n + v a l t i o p ä i v ä t a l o + v a l t i o p ä i v ä v a a l e j a + v a l t i o p ä ä m i e s t e n + v a l t i o r a h o i t t e i s e t + v a l t i o r a j a t + v a l t i o r a j o i s t a + v a l t i o r a j o j e n + v a l t i o r a k e n n e + v a l t i o r a k e n n e t t a + v a l t i o r a k e n t e e n + v a l t i o r a k e n t e e s t a a n + v a l t i o r a k e n t e e t + v a l t i o r a k e n t e i d e m m e + v a l t i o r a k e n t e i d e n + v a l t i o r i k o k s e e n + v a l t i o r y h m i e n + v a l t i o r y h m i i n + v a l t i o r y h m i ä + v a l t i o r y h m ä + v a l t i o r y h m ä n + v a l t i o r y h m ä ä + v a l t i o r y h m ä ä n + v a l t i o s a l a i s u u d e n + v a l t i o s a l a i s u u k s i a + v a l t i o s a l a i s u u k s i a k i n + v a l t i o s a l a i s u u k s i i n + v a l t i o s a l a i s u u s + v a l t i o s a l a i s u u t e n a + v a l t i o s e u r a a n t o + v a l t i o s i h t e e r e i t ä + v a l t i o s i h t e e r i + v a l t i o s i h t e e r i e n + v a l t i o s i h t e e r i l l e + v a l t i o s i h t e e r i n + v a l t i o s i h t e e r i n n e + v a l t i o s i h t e e r i n s ä + v a l t i o s i h t e e r i n ä + v a l t i o s i h t e e r i s t ä + v a l t i o s i h t e e r i ä + v a l t i o s o p i m u k s e n + v a l t i o s o p i m u s d e m o k r a t i a n + v a l t i o s o p i m u s o i k e u d e s t a + v a l t i o s o p i m u s t a + v a l t i o s o s i a l i s m i + v a l t i o s o s i a l i s t i s e n + v a l t i o s s a + v a l t i o s s a a n + v a l t i o s t a + v a l t i o s u v e r e n i t e e t i n + v a l t i o s u v e r e n i t e e t t i + v a l t i o s ä ä n n ö i s s ä + v a l t i o s ä ä n n ö n + v a l t i o s ä ä n t ö j e n + v a l t i o s ä ä n t ö m u u t o k s i s t a + v a l t i o s ä ä n t ö o i k e u d e n + v a l t i o s ä ä n t ö o i k e u s + v a l t i o s ä ä n t ö p e r i n n e t t ä + v a l t i o s ä ä n t ö p e r i n t e e s s ä + v a l t i o s ä ä n t ö p e r i n t e i d e n + v a l t i o s ä ä n t ö p e r i n t e i t ä + v a l t i o s ä ä n t ö t u o m i o i s t u i m e n + v a l t i o s ä ä n t ö t u o m i o i s t u i n + v a l t i o s ä ä n t ö u u d i s t u k s i s t a + v a l t i o t + v a l t i o t a + v a l t i o t a s o a + v a l t i o t a s o l l a + v a l t i o t a s o l l e + v a l t i o t e r r o r i s m i + v a l t i o t e r r o r i s m i a + v a l t i o t e r r o r i s m i l l a + v a l t i o t e r r o r i s m i n + v a l t i o t e r r o r i s t a + v a l t i o t e r r o r i t e o t + v a l t i o t i e t e e n + v a l t i o t o i v e i l l e + v a l t i o t t o m a l l a + v a l t i o t t o m a l l e + v a l t i o t t o m a n + v a l t i o t t o m a t + v a l t i o t t o m i a + v a l t i o t t o m i e n + v a l t i o t t o m i i n + v a l t i o t t o m i l l a + v a l t i o t u e k s i + v a l t i o t u e n + v a l t i o t u e s t a + v a l t i o t u e t + v a l t i o t u k e a + v a l t i o t u k i + v a l t i o t u k i a + v a l t i o t u k i k e h y s t ä + v a l t i o t u k i s ä ä n t ö j e n + v a l t i o t u k i s ä ä n t ö j ä + v a l t i o u u d i s t u k s e e n + v a l t i o u u d i s t u k s i a + v a l t i o v a l i t u s a s i a a + v a l t i o v a l l a n + v a l t i o v a l t a + v a l t i o v a l t a a + v a l t i o v a r a i n m i n i s t e r e i d e n + v a l t i o v a r a i n m i n i s t e r e i h i n + v a l t i o v a r a i n m i n i s t e r e i l l e + v a l t i o v a r a i n m i n i s t e r e i l l e e n + v a l t i o v a r a i n m i n i s t e r e i l l ä + v a l t i o v a r a i n m i n i s t e r e i l t ä + v a l t i o v a r a i n m i n i s t e r e i l t ä k i n + v a l t i o v a r a i n m i n i s t e r e i n ä + v a l t i o v a r a i n m i n i s t e r e i s t ä + v a l t i o v a r a i n m i n i s t e r e i t ä + v a l t i o v a r a i n m i n i s t e r i + v a l t i o v a r a i n m i n i s t e r i e m m e + v a l t i o v a r a i n m i n i s t e r i e n + v a l t i o v a r a i n m i n i s t e r i i n + v a l t i o v a r a i n m i n i s t e r i k i n + v a l t i o v a r a i n m i n i s t e r i k s i + v a l t i o v a r a i n m i n i s t e r i k ä ä n + v a l t i o v a r a i n m i n i s t e r i l l e + v a l t i o v a r a i n m i n i s t e r i l l ä + v a l t i o v a r a i n m i n i s t e r i l t ä + v a l t i o v a r a i n m i n i s t e r i m m e + v a l t i o v a r a i n m i n i s t e r i n + v a l t i o v a r a i n m i n i s t e r i n s ä + v a l t i o v a r a i n m i n i s t e r i n ä + v a l t i o v a r a i n m i n i s t e r i n ä k i n + v a l t i o v a r a i n m i n i s t e r i s t ä + v a l t i o v a r a i n m i n i s t e r i t + v a l t i o v a r a i n m i n i s t e r i t k i n + v a l t i o v a r a i n m i n i s t e r i ä + v a l t i o v a r a i n m i n i s t e r i ä m m e + v a l t i o v a r a i n m i n i s t e r i ö + v a l t i o v a r a i n m i n i s t e r i ö i d e n + v a l t i o v a r a i n m i n i s t e r i ö i l l e + v a l t i o v a r a i n m i n i s t e r i ö i l t ä + v a l t i o v a r a i n m i n i s t e r i ö i s t ä + v a l t i o v a r a i n m i n i s t e r i ö l l e + v a l t i o v a r a i n m i n i s t e r i ö l l ä + v a l t i o v a r a i n m i n i s t e r i ö n + v a l t i o v a r a i n m i n i s t e r i ö s s ä + v a l t i o v a r a i n m i n i s t e r i ö t ä + v a l t i o v a r a i n m i n i s t e r i ö ö n + v a l t i o v a r a i n v a l i o k u n n a n + v a l t i o v a r a n m i n i s t e r i e n + v a l t i o v e l k a k r i i s i + v a l t i o v i e r a i l u + v a l t i o v i e r a i l u j a + v a l t i o v i e r a i l u j e n + v a l t i o v i e r a i l u l l a + v a l t i o v i e r a i l u n + v a l t i o v i e r a i l u t + v a l t i o v i e r a i l u u n + v a l t i o v u o d e s t a + v a l t i o y h d i s t e l m ä n ä + v a l t i o y h t e i s ö + v a l t i o y h t e i s ö l l e + v a l t i o y h t e i s ö n + v a l t i t + v a l t o j e n + v a l t t i a + v a l t t i a m m e + v a l t t i k o r t i k s e m m e + v a l t t i k o r t i t + v a l t t i k o r t t e j a + v a l t t i k o r t t e j a m m e + v a l t t i k o r t t i + v a l t t i k o r t t i m m e + v a l t t i k o r t t i n a + v a l t t i k o r t t i n a a n + v a l t t i k o r t t i n s a + v a l t t i n a + v a l t t i n s a + v a l t u u d e n + v a l t u u d e t + v a l t u u k s i a + v a l t u u k s i a a n + v a l t u u k s i e m m e + v a l t u u k s i e n + v a l t u u k s i i n i + v a l t u u k s i l l a + v a l t u u k s i n + v a l t u u k s i s t a + v a l t u u k s i s t a a n + v a l t u u s k u n n a l l e + v a l t u u s k u n n a l l e m m e + v a l t u u s k u n n a n + v a l t u u s k u n n a s s a + v a l t u u s k u n n a s s a a n + v a l t u u s k u n n a s s a m m e + v a l t u u s k u n n a s s a n n e + v a l t u u s k u n n a s t a + v a l t u u s k u n n a t + v a l t u u s k u n n i s s a + v a l t u u s k u n n i s s a k i n + v a l t u u s k u n n i s t a + v a l t u u s k u n t a + v a l t u u s k u n t a a + v a l t u u s k u n t a a n + v a l t u u s k u n t a a n i + v a l t u u s k u n t a a n s a + v a l t u u s k u n t a j ä r j e s t e l m ä + v a l t u u s k u n t a k o k o u k s i s s a + v a l t u u s k u n t a m m e + v a l t u u s k u n t a n n e + v a l t u u s k u n t a n s a + v a l t u u s k u n t a t y ö h ö n + v a l t u u s k u n t a v i e r a i l u j e n + v a l t u u s k u n t a v i e r a i l u l l a + v a l t u u s k u n t i a + v a l t u u s k u n t i e n + v a l t u u s k u n t i n e e n + v a l t u u s l a k i + v a l t u u s l u o n n o s t a + v a l t u u s t o l l e + v a l t u u s t o n + v a l t u u t e e n + v a l t u u t e n s a + v a l t u u t e t a a n + v a l t u u t e t t a v a + v a l t u u t e t u l l e + v a l t u u t e t u n + v a l t u u t e t u s s a + v a l t u u t t a a + v a l t u u t t a m i s p r o s e s s i i n + v a l t u u t t a m i s v a i h e + v a l t u u t u k s e n + v a l t u u t u k s e n s a + v a l t u u t u s a s i a k i r j a a n + v a l t u u t u s d i r e k t i i v i + v a l t u u t u s d i r e k t i i v i i n + v a l t u u t u s d i r e k t i i v i n + v a l t u u t u s d i r e k t i i v i s s ä + v a l t u u t u s d i r e k t i i v i ä + v a l t u u t u s l a u s e k e + v a l t u u t u s l a u s e k e t t a + v a l t u u t u s l a u s e k k e e n + v a l t u u t u s l a u s e k k e e s e e n + v a l t u u t u s l a u s e k k e e s s a + v a l t u u t u s l a u s e k k e e s t a + v a l t u u t u s l u o n n o k s e n + v a l t u u t u s l u o n n o k s e s s a + v a l t u u t u s l u o n n o k s e s t a + v a l t u u t u s l u o n n o s + v a l t u u t u s l u o n n o s t a + v a l t u u t u s m e n e t t e l y j ä + v a l t u u t u s m e n e t t e l y n + v a l t u u t u s p r o s e s s i + v a l t u u t u s t a + v a l u m a e f e k t i + v a l u n e e t + v a l u n u t + v a l u n u t t a + v a l u r a u t a + v a l u r a u t a i s i a + v a l u u t a l l a + v a l u u t a l l e n n e + v a l u u t a n + v a l u u t a n s i i r r o t + v a l u u t a n s i i r t o v e r o + v a l u u t a n s i i r t o v e r o n + v a l u u t a n v a i h d o n + v a l u u t a n v a i h d o s t a + v a l u u t a n v a i h t o a + v a l u u t a n v a i h t o j a + v a l u u t a n v a i h t o k u l u t + v a l u u t a n v a i h t o k u r s s i t + v a l u u t a n v a i h t o k u s t a n n u k s e t + v a l u u t a n v a i h t o k u s t a n n u k s i a + v a l u u t a n v a i h t o m a k s u j a + v a l u u t a n v a i h t o m a r k k i n o i t a + v a l u u t a n v a i h t o o n + v a l u u t a n v a i h t o p a l v e l u i d e n + v a l u u t a n v a i h t o p a l v e l u i t a + v a l u u t a s s a + v a l u u t a s t a + v a l u u t a s t a a n + v a l u u t a t + v a l u u t o i l l a + v a l u u t o i s s a + v a l u u t o i s t a + v a l u u t t a a + v a l u u t t a a n + v a l u u t t a a n s a + v a l u u t t a e r o i h i n + v a l u u t t a h a a s t e e t + v a l u u t t a h a l l i n n a s s a + v a l u u t t a h a n k k e e n + v a l u u t t a h e i l a h d u k s i l t a + v a l u u t t a h e i l a h t e l u j e n + v a l u u t t a i n f l a a t i o k i n + v a l u u t t a i n t e r v e n t i o i t a + v a l u u t t a i n t e r v e n t i o t + v a l u u t t a i n t e r v e n t i o v ä l i n e e n + v a l u u t t a j a r r u a + v a l u u t t a j ä r j e s t e l m i e n + v a l u u t t a j ä r j e s t e l m i l l e + v a l u u t t a j ä r j e s t e l m ä + v a l u u t t a j ä r j e s t e l m ä l l ä + v a l u u t t a j ä r j e s t e l m ä n + v a l u u t t a j ä r j e s t e l m ä s s ä + v a l u u t t a j ä r j e s t e l m ä s t ä + v a l u u t t a j ä r j e s t e l m ä s t ä m m e + v a l u u t t a j ä r j e s t e l m ä ä + v a l u u t t a j ä r j e s t e l m ä ä n + v a l u u t t a j ä r j e s t e l y + v a l u u t t a j ä r j e s t e l y i s t ä + v a l u u t t a j ä r j e s t ö n + v a l u u t t a k a t e j ä r j e s t e l m ä + v a l u u t t a k a t e j ä r j e s t e l m ä s s ä + v a l u u t t a k a u p p a + v a l u u t t a k a u p p a a + v a l u u t t a k a u p p a a n + v a l u u t t a k e h i t y k s e e n + v a l u u t t a k e i n o t t e l i j a t + v a l u u t t a k e i n o t t e l i j o i l l e + v a l u u t t a k e i n o t t e l u + v a l u u t t a k e i n o t t e l u a + v a l u u t t a k e i n o t t e l u i h i n + v a l u u t t a k e i n o t t e l u l l e + v a l u u t t a k e i n o t t e l u l t a + v a l u u t t a k e i n o t t e l u n + v a l u u t t a k e i n o t t e l u u n + v a l u u t t a k i l p a i l u s s a + v a l u u t t a k i l p e n ä + v a l u u t t a k i n + v a l u u t t a k o k e e s s a + v a l u u t t a k o r i + v a l u u t t a k r i i s e j ä + v a l u u t t a k r i i s i + v a l u u t t a k r i i s i e n + v a l u u t t a k r i i s i i n + v a l u u t t a k r i i s i k s i + v a l u u t t a k r i i s i n + v a l u u t t a k r i i s i s t ä + v a l u u t t a k r i i s i ä + v a l u u t t a k r i t e e r i e n + v a l u u t t a k u r s s e i h i n + v a l u u t t a k u r s s e i s t a + v a l u u t t a k u r s s e j a + v a l u u t t a k u r s s e j a a n + v a l u u t t a k u r s s i + v a l u u t t a k u r s s i a + v a l u u t t a k u r s s i e n + v a l u u t t a k u r s s i e r o i s t a + v a l u u t t a k u r s s i h e i l a h t e l u i s t a + v a l u u t t a k u r s s i h e i l a h t e l u j e n + v a l u u t t a k u r s s i h e i l a h t e l u t + v a l u u t t a k u r s s i i n + v a l u u t t a k u r s s i j ä r j e s t e l m i ä + v a l u u t t a k u r s s i j ä r j e s t e l m ä n + v a l u u t t a k u r s s i j ä r j e s t e l m ä s t ä + v a l u u t t a k u r s s i j ä r j e s t e l m ä t + v a l u u t t a k u r s s i j ä r j e s t e l m ä ä + v a l u u t t a k u r s s i j ä r j e s t e l m ä ä n + v a l u u t t a k u r s s i k e h i t y s t ä + v a l u u t t a k u r s s i l l a + v a l u u t t a k u r s s i m a r g i n a a l i t + v a l u u t t a k u r s s i m e k a n i s m e j a + v a l u u t t a k u r s s i m e k a n i s m i a + v a l u u t t a k u r s s i m e k a n i s m i i n + v a l u u t t a k u r s s i m e k a n i s m i n + v a l u u t t a k u r s s i m e k a n i s m i s s a + v a l u u t t a k u r s s i m e k a n i s m i s t a + v a l u u t t a k u r s s i m e k a n i s m i t + v a l u u t t a k u r s s i m u u n n o k s i s t a + v a l u u t t a k u r s s i m u u t o k s i l l a + v a l u u t t a k u r s s i n + v a l u u t t a k u r s s i n s a + v a l u u t t a k u r s s i p a i n e e t + v a l u u t t a k u r s s i p o l i t i i k a n + v a l u u t t a k u r s s i p o l i t i i k a s s a + v a l u u t t a k u r s s i p o l i t i i k a s t a + v a l u u t t a k u r s s i p o l i t i i k k a + v a l u u t t a k u r s s i p o l i t i i k k a a + v a l u u t t a k u r s s i p o l i t i i k k a n s a + v a l u u t t a k u r s s i r i s k e i s t ä + v a l u u t t a k u r s s i r i s k i + v a l u u t t a k u r s s i r i s k i e n + v a l u u t t a k u r s s i r i s k i n + v a l u u t t a k u r s s i r i s k i t + v a l u u t t a k u r s s i r i s k i ä + v a l u u t t a k u r s s i s t a + v a l u u t t a k u r s s i t + v a l u u t t a k u r s s i t a p p i o i d e n + v a l u u t t a k u r s s i t a p p i o i t a + v a l u u t t a k u r s s i t a v o i t e + v a l u u t t a k u r s s i t i l a n n e t t a + v a l u u t t a k u r s s i t i l a n t e e s e e n + v a l u u t t a k u r s s i v a i h t e l u i h i n + v a l u u t t a k u r s s i v a i h t e l u j a + v a l u u t t a k u r s s i v a i h t e l u j e n + v a l u u t t a k u r s s i v a k a u s + v a l u u t t a k u r s s i y h t e i s t y ö n + v a l u u t t a k y s y m y k s e s t ä + v a l u u t t a k y s y m y k s i s s ä + v a l u u t t a k y s y m y k s i s t ä + v a l u u t t a k y s y m y s t e n + v a l u u t t a k ä ä r m e + v a l u u t t a k ä ä r m e e n + v a l u u t t a k ä ä r m e e s t ä + v a l u u t t a l a i n o j a + v a l u u t t a l i i k e h d i n n ä n + v a l u u t t a l i i t o n + v a l u u t t a l i i t o s s a + v a l u u t t a l i i t t o a + v a l u u t t a l i i t t o j a + v a l u u t t a l u o t t o j a + v a l u u t t a l u o t t o j a a n + v a l u u t t a l ä h d e + v a l u u t t a m a k s u t + v a l u u t t a m a l l i + v a l u u t t a m a r k k i n a h u i j a u s + v a l u u t t a m a r k k i n a i n t e r v e n t i o i t a + v a l u u t t a m a r k k i n a t + v a l u u t t a m a r k k i n o i d e n + v a l u u t t a m a r k k i n o i l l a + v a l u u t t a m a r k k i n o i l l e + v a l u u t t a m a r k k i n o i t a + v a l u u t t a m e r k k i + v a l u u t t a m m e + v a l u u t t a m y l l e r r y k s e t + v a l u u t t a m y l l e r r y s + v a l u u t t a m y r s k y n + v a l u u t t a m ä ä r ä i s i ä + v a l u u t t a m ä ä r ä i s t ä + v a l u u t t a n a + v a l u u t t a n s a + v a l u u t t a o n g e l m a a n + v a l u u t t a p a r i t e e t t e j a + v a l u u t t a p e l e j ä + v a l u u t t a p o i k k e a m i s t a + v a l u u t t a p o l i i t t i s e t + v a l u u t t a p o l i t i i k a l l a + v a l u u t t a p o l i t i i k a l l e + v a l u u t t a p o l i t i i k a n + v a l u u t t a p o l i t i i k a s s a + v a l u u t t a p o l i t i i k a s t a + v a l u u t t a p o l i t i i k a s t a a n + v a l u u t t a p o l i t i i k k a + v a l u u t t a p o l i t i i k k a a + v a l u u t t a p o l i t i i k k a a n + v a l u u t t a p o l i t i i k k a a n s a + v a l u u t t a r a h a s t o + v a l u u t t a r a h a s t o a + v a l u u t t a r a h a s t o i h i n + v a l u u t t a r a h a s t o l l a + v a l u u t t a r a h a s t o l l e + v a l u u t t a r a h a s t o l t a + v a l u u t t a r a h a s t o n + v a l u u t t a r a h a s t o o n + v a l u u t t a r a h a s t o s s a + v a l u u t t a r a h a s t o s t a + v a l u u t t a r a k e n t e i d e n + v a l u u t t a r i s k i + v a l u u t t a r i s k i n + v a l u u t t a r i s k i p a i n e i t a + v a l u u t t a r i s k i t + v a l u u t t a r i s k i ä + v a l u u t t a r i s k i ä ä n + v a l u u t t a s a a m i s e t + v a l u u t t a s i i r r o i l l a + v a l u u t t a s i i r r o t + v a l u u t t a s i i r t o i h i n + v a l u u t t a s i i r t o j a + v a l u u t t a s i i r t o j e n + v a l u u t t a s i i r t y m ä n + v a l u u t t a s i i r t y m ä ä + v a l u u t t a s o d a n + v a l u u t t a s o d a s s a + v a l u u t t a s o d a s t a + v a l u u t t a s o p i m u s + v a l u u t t a s o t a + v a l u u t t a s o t a n a + v a l u u t t a s p e k u l a a t i o + v a l u u t t a s p e k u l a a t i o t a + v a l u u t t a s u h t e i d e n + v a l u u t t a s u h t e i d e n s a + v a l u u t t a s u h t e i s s a + v a l u u t t a s u h t e i t a + v a l u u t t a s ä ä n n ö t + v a l u u t t a t a p a h t u m i e n + v a l u u t t a t a s o n + v a l u u t t a t e k i j ö i l l ä + v a l u u t t a t i l a n n e + v a l u u t t a t i l a n t e e s s a + v a l u u t t a t r a n s a k t i o i t a + v a l u u t t a t u k i j ä r j e s t e l m ä n + v a l u u t t a t u l o i s t a + v a l u u t t a t u l o j a + v a l u u t t a t u l o j e n + v a l u u t t a u n i o n e i s s a + v a l u u t t a u n i o n i + v a l u u t t a u n i o n i a + v a l u u t t a u n i o n i i n + v a l u u t t a u n i o n i n + v a l u u t t a u n i o n i p r o s e s s i n + v a l u u t t a u n i o n i s s a + v a l u u t t a u u d i s t u k s e e n + v a l u u t t a u u d i s t u k s e s t a + v a l u u t t a u u d i s t u s o h j e l m a a + v a l u u t t a u u d i s t u s t e n + v a l u u t t a v a i h t e l u j a + v a l u u t t a v a i h t e l u j e n + v a l u u t t a v a i h t e l u t + v a l u u t t a v a k a u d e n + v a l u u t t a v a k a u t e e n + v a l u u t t a v a r a n n o i s t a + v a l u u t t a v a r a n n o k s i + v a l u u t t a v a r a n n o n + v a l u u t t a v a r a n n o s t a + v a l u u t t a v a r a n n o s t a a n + v a l u u t t a v a r a n n o t + v a l u u t t a v a r a n t o + v a l u u t t a v a r a n t o a + v a l u u t t a v a r a n t o i h i n + v a l u u t t a v a r a n t o i h i n s a + v a l u u t t a v a r a n t o i n a + v a l u u t t a v a r a n t o j a + v a l u u t t a v a r a n t o j e n + v a l u u t t a v a r a n t o n s a + v a l u u t t a v a r a n t o o n + v a l u u t t a v a r a n t o s a a m i s e t + v a l u u t t a v a r a n t o s a a m i s i a + v a l u u t t a v a r a n t o s a a m i s i s t a + v a l u u t t a v a r a n t o s a a m i s t e n + v a l u u t t a v e l k a + v a l u u t t a v i r a n o m a i s t e n + v a l u u t t a v i r t o i h i n + v a l u u t t a y h d e n t y m i s e s t ä + v a l u u t t a y h t e i s t y ö + v a l u u t t a y h t e i s t y ö h ö n + v a l u u t t a y h t e i s t y ö n + v a l u u t t a y h t e i s t y ö t ä + v a l u u t t a y h t e i s ö + v a l u u t t a y h t e n ä i s y y t t ä + v a l u u t t a y k s i k k ö + v a l u u t t a y k s i k ö s s ä + v a l u u t t a y l i j ä ä m ä ä + v a l u u t t o j a + v a l u u t t o j e n + v a l u v a n + v a l v e u t u n e i m p i e n + v a l v e u t u n e i s u u t t a + v a l v o a + v a l v o a k s e e n + v a l v o a k s e m m e + v a l v o e s s a a n + v a l v o e s s a m m e + v a l v o i v a t + v a l v o j a a + v a l v o j a k o l l e g i o i d e n + v a l v o j a k o l l e g i o i s s a + v a l v o j a k o l l e g i o i t a + v a l v o j a l l a + v a l v o j a n a + v a l v o j a o p p i l a s + v a l v o j a r y h m ä t + v a l v o j a t a h o + v a l v o k a a m m e + v a l v o m a a n + v a l v o m a l l a + v a l v o m a s s a + v a l v o m a t t a + v a l v o m a t t o m a n + v a l v o m i s e e n + v a l v o m i s e k s i + v a l v o m i s j ä r j e s t e l m ä s t ä + v a l v o m i s j ä r j e s t e l m ä ä + v a l v o m i s s t r a t e g i a a n + v a l v o m i s t e h t ä v ä n + v a l v o m m e + v a l v o n e e t + v a l v o n n a l l a + v a l v o n n a l t a + v a l v o n n a n + v a l v o n n a s s a + v a l v o n n a s s a a n + v a l v o n n a s s a m m e + v a l v o n n a s t a + v a l v o n t a a + v a l v o n t a a m m e + v a l v o n t a a n + v a l v o n t a a n s a + v a l v o n t a d i r e k t i i v i + v a l v o n t a d i r e k t i i v i i n + v a l v o n t a d i r e k t i i v i n + v a l v o n t a d i r e k t i i v i s s ä + v a l v o n t a e d e l l y t y k s e t + v a l v o n t a e d e l l y t y k s i ä + v a l v o n t a e h d o t + v a l v o n t a e h d o t u k s e n + v a l v o n t a e h d o t u k s e s t a + v a l v o n t a e l i m e e n + v a l v o n t a e l i m e k s i + v a l v o n t a e l i m e l l e + v a l v o n t a e l i m e l l ä + v a l v o n t a e l i m e n + v a l v o n t a e l i m e n ä + v a l v o n t a e l i m e s s ä + v a l v o n t a e l i m e t + v a l v o n t a e l i m i e n + v a l v o n t a e l i m i i n + v a l v o n t a e l i m i l l e + v a l v o n t a e l i m i l t ä + v a l v o n t a e l i m i s s ä + v a l v o n t a e l i m i s t ä + v a l v o n t a e l i m i ä + v a l v o n t a e l i n + v a l v o n t a e l i n t e n + v a l v o n t a e l i n t ä + v a l v o n t a f o o r u m i n + v a l v o n t a h a a s t e i d e n + v a l v o n t a h a l u n + v a l v o n t a h a l u n a + v a l v o n t a h a n k k e i d e n + v a l v o n t a h a r j o i t u k s i a + v a l v o n t a h e n k i l ö s t ö ä + v a l v o n t a i l m o i t u k s i a + v a l v o n t a j a k s o + v a l v o n t a j o u k o i s t a a n + v a l v o n t a j ä r j e s t e l m i e m m e + v a l v o n t a j ä r j e s t e l m i e n + v a l v o n t a j ä r j e s t e l m i e n s ä + v a l v o n t a j ä r j e s t e l m i i n + v a l v o n t a j ä r j e s t e l m i l l e + v a l v o n t a j ä r j e s t e l m i l l ä + v a l v o n t a j ä r j e s t e l m i n + v a l v o n t a j ä r j e s t e l m i s s ä + v a l v o n t a j ä r j e s t e l m i s t ä + v a l v o n t a j ä r j e s t e l m i s t ä ä n + v a l v o n t a j ä r j e s t e l m i ä + v a l v o n t a j ä r j e s t e l m i ä m m e + v a l v o n t a j ä r j e s t e l m i ä ä n + v a l v o n t a j ä r j e s t e l m ä + v a l v o n t a j ä r j e s t e l m ä l l e + v a l v o n t a j ä r j e s t e l m ä l l ä + v a l v o n t a j ä r j e s t e l m ä m m e + v a l v o n t a j ä r j e s t e l m ä n + v a l v o n t a j ä r j e s t e l m ä n s ä + v a l v o n t a j ä r j e s t e l m ä n ä + v a l v o n t a j ä r j e s t e l m ä s s ä + v a l v o n t a j ä r j e s t e l m ä s t ä + v a l v o n t a j ä r j e s t e l m ä t + v a l v o n t a j ä r j e s t e l m ä ä + v a l v o n t a j ä r j e s t e l m ä ä n + v a l v o n t a j ä r j e s t e l y + v a l v o n t a j ä r j e s t e l y i h i n + v a l v o n t a j ä r j e s t e l y i l l ä + v a l v o n t a j ä r j e s t e l y i n + v a l v o n t a j ä r j e s t e l y i s t ä + v a l v o n t a j ä r j e s t e l y j e m m e + v a l v o n t a j ä r j e s t e l y j e n + v a l v o n t a j ä r j e s t e l y j ä + v a l v o n t a j ä r j e s t e l y n + v a l v o n t a j ä r j e s t e l y y n + v a l v o n t a j ä r j e s t ö + v a l v o n t a k a m a r i n + v a l v o n t a k a m e r a + v a l v o n t a k a m e r a t + v a l v o n t a k a m e r o i d e n + v a l v o n t a k a m e r o i t a + v a l v o n t a k a p a s i t e e t i n + v a l v o n t a k a p a s i t e e t t i + v a l v o n t a k a p a s i t e e t t i a + v a l v o n t a k e h y k s e e n + v a l v o n t a k e h y k s e l l ä + v a l v o n t a k e h y k s e n + v a l v o n t a k e h y k s e s s ä + v a l v o n t a k e h y s + v a l v o n t a k e h y s t ä + v a l v o n t a k e i n o + v a l v o n t a k e i n o i s t a + v a l v o n t a k e i n o j a + v a l v o n t a k e i n o j e n + v a l v o n t a k e i n o t + v a l v o n t a k e r t o m u k s i a + v a l v o n t a k e s k u k s e n + v a l v o n t a k e s k u k s e t + v a l v o n t a k e s k u k s i a + v a l v o n t a k e s k u k s i l l e + v a l v o n t a k e s k u s + v a l v o n t a k e s k u s t a + v a l v o n t a k e s k u s t e n + v a l v o n t a k e t j u + v a l v o n t a k o l l e g i o i t a + v a l v o n t a k o m i s s i o + v a l v o n t a k o m i s s i o n + v a l v o n t a k o m i s s i o o n + v a l v o n t a k o m i s s i o s t a + v a l v o n t a k o m i t e a + v a l v o n t a k o m i t e a a + v a l v o n t a k o m i t e a a n + v a l v o n t a k o m i t e a a n s a + v a l v o n t a k o m i t e a l l a + v a l v o n t a k o m i t e a l l e + v a l v o n t a k o m i t e a l t a + v a l v o n t a k o m i t e a n + v a l v o n t a k o m i t e a s s a + v a l v o n t a k o m i t e a s t a + v a l v o n t a k o m i t e a t + v a l v o n t a k o m i t e o i d e n + v a l v o n t a k o m i t e o i h i n + v a l v o n t a k o m i t e o i l l e + v a l v o n t a k o m i t e o i s s a + v a l v o n t a k o m i t e o i s t a + v a l v o n t a k o n e i s t o + v a l v o n t a k o n e i s t o a + v a l v o n t a k o n e i s t o i s s a + v a l v o n t a k o n e i s t o n + v a l v o n t a k r i t e e r e i s t ä + v a l v o n t a k r i t e e r e i t ä + v a l v o n t a k u l t t u u r i + v a l v o n t a k u l t t u u r i a + v a l v o n t a k u l t t u u r i n + v a l v o n t a k u l u t + v a l v o n t a k u s t a n n u k s i a + v a l v o n t a k u s t a n n u s t e n + v a l v o n t a k y k y + v a l v o n t a k y k y ä + v a l v o n t a k y s y m y k s e s t ä + v a l v o n t a k y s y m y k s i s t ä + v a l v o n t a k y s y m y k s i ä + v a l v o n t a k y v y n + v a l v o n t a k ä y n n i t + v a l v o n t a k ä y n t e j ä + v a l v o n t a k ä y t ä n n ö i s s ä + v a l v o n t a k ä y t ä n n ö n + v a l v o n t a k ä y t ä n t e i d e n + v a l v o n t a k ä y t ä n t e i t ä + v a l v o n t a k ä y t ä n t ö + v a l v o n t a k ä y t ä n t ö i h i n + v a l v o n t a k ä y t ä n t ö j e n + v a l v o n t a k ä y t ä n t ö m m e + v a l v o n t a k ä y t ä n t ö ä + v a l v o n t a l a b o r a t o r i o i t a + v a l v o n t a l a i n + v a l v o n t a l a i n s ä ä d ä n t ö + v a l v o n t a l a i t e + v a l v o n t a l a i t o k s e t + v a l v o n t a l a i t o k s i s s a + v a l v o n t a l a i t t e e t + v a l v o n t a l a i t t e i d e n + v a l v o n t a l a i t t e i s i i n + v a l v o n t a l a i t t e i s s a + v a l v o n t a l a i t t e i s t a + v a l v o n t a l a i t t e i s t o j a + v a l v o n t a l a i t t e i s t o n + v a l v o n t a l a i t t e i t a + v a l v o n t a l a k i + v a l v o n t a l a u t a k u n n a n + v a l v o n t a l a u t a k u n t a + v a l v o n t a l a u t a k u n t a a + v a l v o n t a l a u t a k u n t a a n + v a l v o n t a l a u t a k u n t i a + v a l v o n t a l e n n o t + v a l v o n t a l e n t o j a + v a l v o n t a l e n t o k o n e e n + v a l v o n t a l i n j a + v a l v o n t a l i n j a a + v a l v o n t a l i n j a a n + v a l v o n t a l i n j a l l a + v a l v o n t a l i n j a n + v a l v o n t a l i n j a s t a + v a l v o n t a l ä h e t y s t ö j e n + v a l v o n t a m a h d o l l i s u u d e t + v a l v o n t a m a h d o l l i s u u k s i a + v a l v o n t a m a h d o l l i s u u k s i a n n e + v a l v o n t a m a h d o l l i s u u k s i e n + v a l v o n t a m a h d o l l i s u u k s i i n + v a l v o n t a m a h d o l l i s u u s + v a l v o n t a m a h d o l l i s u u t t a + v a l v o n t a m a l l e j a + v a l v o n t a m a l l i + v a l v o n t a m a l l i a + v a l v o n t a m a l l i e n + v a l v o n t a m a l l i i n + v a l v o n t a m a l l i n + v a l v o n t a m a l l i t + v a l v o n t a m e k a n i s m e i h i n + v a l v o n t a m e k a n i s m e i h i n s a + v a l v o n t a m e k a n i s m e i l l a + v a l v o n t a m e k a n i s m e j a + v a l v o n t a m e k a n i s m e j a a n + v a l v o n t a m e k a n i s m i + v a l v o n t a m e k a n i s m i a + v a l v o n t a m e k a n i s m i e m m e + v a l v o n t a m e k a n i s m i e n + v a l v o n t a m e k a n i s m i l l a + v a l v o n t a m e k a n i s m i l l e + v a l v o n t a m e k a n i s m i m m e + v a l v o n t a m e k a n i s m i n + v a l v o n t a m e k a n i s m i n a + v a l v o n t a m e k a n i s m i n s a + v a l v o n t a m e k a n i s m i s t a + v a l v o n t a m e k a n i s m i t + v a l v o n t a m e n e t e l m i e n + v a l v o n t a m e n e t e l m i i n + v a l v o n t a m e n e t e l m i l l e + v a l v o n t a m e n e t e l m i l l ä + v a l v o n t a m e n e t e l m i n e e n + v a l v o n t a m e n e t e l m i s s ä + v a l v o n t a m e n e t e l m i s t ä + v a l v o n t a m e n e t e l m i ä + v a l v o n t a m e n e t e l m ä + v a l v o n t a m e n e t e l m ä n + v a l v o n t a m e n e t e l m ä t + v a l v o n t a m e n e t e l m ä ä + v a l v o n t a m e n e t t e l y + v a l v o n t a m e n e t t e l y i d e n + v a l v o n t a m e n e t t e l y i h i n + v a l v o n t a m e n e t t e l y i l l e + v a l v o n t a m e n e t t e l y i l l ä + v a l v o n t a m e n e t t e l y i s s ä + v a l v o n t a m e n e t t e l y i s t ä + v a l v o n t a m e n e t t e l y i t ä + v a l v o n t a m e n e t t e l y j e m m e + v a l v o n t a m e n e t t e l y j e n + v a l v o n t a m e n e t t e l y j ä + v a l v o n t a m e n e t t e l y j ä ä n + v a l v o n t a m e n e t t e l y n + v a l v o n t a m e n e t t e l y s s ä + v a l v o n t a m e n e t t e l y s t ä + v a l v o n t a m e n e t t e l y t + v a l v o n t a m e n e t t e l y t a p o j a + v a l v o n t a m e n e t t e l y y n + v a l v o n t a m e n e t t e l y ä + v a l v o n t a m e n e t t e l y ä m m e + v a l v o n t a m e n o j e n + v a l v o n t a m m e + v a l v o n t a m u o t o + v a l v o n t a m u o t o j a + v a l v o n t a m u o t o o n + v a l v o n t a m ä ä r ä y k s e s t ä + v a l v o n t a m ä ä r ä y k s e t + v a l v o n t a m ä ä r ä y k s i i n + v a l v o n t a m ä ä r ä y k s i ä + v a l v o n t a m ä ä r ä y s + v a l v o n t a m ä ä r ä y s t e n + v a l v o n t a n e u v o s t o + v a l v o n t a n e u v o s t o a + v a l v o n t a n e u v o s t o n + v a l v o n t a n o r m e i h i n + v a l v o n t a n o r m e j a + v a l v o n t a n o r m i e n + v a l v o n t a n o r m i t + v a l v o n t a o h j e e t + v a l v o n t a o h j e l m a + v a l v o n t a o h j e l m a a + v a l v o n t a o h j e l m a a n + v a l v o n t a o h j e l m a n + v a l v o n t a o h j e l m a s s a + v a l v o n t a o h j e l m a s t a + v a l v o n t a o h j e l m a t + v a l v o n t a o h j e l m i a + v a l v o n t a o h j e l m i e n + v a l v o n t a o h j e l m i e n s a + v a l v o n t a o h j e l m i i n + v a l v o n t a o h j e l m i l l e + v a l v o n t a o h j e l m i s s a + v a l v o n t a o i k e u d e l l i s e t + v a l v o n t a o i k e u d e l l i s t a + v a l v o n t a o i k e u d e n + v a l v o n t a o i k e u d e s t a + v a l v o n t a o i k e u d e t + v a l v o n t a o i k e u k s i a + v a l v o n t a o i k e u k s i a a n + v a l v o n t a o i k e u k s i e n + v a l v o n t a o i k e u k s i i n + v a l v o n t a o i k e u s + v a l v o n t a o i k e u t e e n + v a l v o n t a o i k e u t e n s a + v a l v o n t a o i k e u t t a + v a l v o n t a o i k e u t t a a n + v a l v o n t a o i k e u t t a m m e + v a l v o n t a o n g e l m a t + v a l v o n t a o n g e l m i a + v a l v o n t a o n g e l m i e n + v a l v o n t a o n g e l m i s t a + v a l v o n t a o p e r a a t i o i s t a + v a l v o n t a o p e r a a t i o i t a + v a l v o n t a o p e r a a t i o o n + v a l v o n t a o p e r a a t i o s t a + v a l v o n t a o r g a n i s a a t i o o n + v a l v o n t a p a i k o i l l a + v a l v o n t a p a k e t i n + v a l v o n t a p a k e t i s s a + v a l v o n t a p a k e t i s t a + v a l v o n t a p a k e t t i a + v a l v o n t a p a k e t t i i n + v a l v o n t a p a l v e l u j a + v a l v o n t a p a l v e l u t + v a l v o n t a p a n e e l i s s a + v a l v o n t a p a r a m e t r i e n + v a l v o n t a p a r t i o i h i n + v a l v o n t a p e r i a a t t e e t + v a l v o n t a p e r i a a t t e i s i i n + v a l v o n t a p e r u s t e i t a + v a l v o n t a p i s t e i d e n + v a l v o n t a p i s t e i t ä + v a l v o n t a p i s t e t t ä + v a l v o n t a p o l i t i i k a k s i + v a l v o n t a p o l i t i i k a l l a + v a l v o n t a p o l i t i i k a l l e + v a l v o n t a p o l i t i i k a n + v a l v o n t a p o l i t i i k a s t a + v a l v o n t a p o l i t i i k k a + v a l v o n t a p o l i t i i k k a a + v a l v o n t a p o l i t i i k k a a n + v a l v o n t a p o n n i s t e l u j a + v a l v o n t a p o n n i s t e l u j a a n + v a l v o n t a p o n n i s t u k s i n + v a l v o n t a p r o s e s s i + v a l v o n t a p r o s e s s i a + v a l v o n t a p r o s e s s i e n + v a l v o n t a p r o s e s s i i n + v a l v o n t a p r o s e s s i n + v a l v o n t a p r o s e s s i s s a + v a l v o n t a p r o s e s s i t + v a l v o n t a p u i t t e e t + v a l v o n t a p u i t t e i d e n + v a l v o n t a p u i t t e i s i i n + v a l v o n t a p u i t t e i s s a + v a l v o n t a p u i t t e i t a + v a l v o n t a p ö y t ä k i r j a a + v a l v o n t a r a j a n + v a l v o n t a r a k e n n e + v a l v o n t a r a k e n n e t t a + v a l v o n t a r a k e n t e e l l a + v a l v o n t a r a k e n t e e n + v a l v o n t a r a k e n t e e n s a + v a l v o n t a r a k e n t e e s e e n + v a l v o n t a r a k e n t e e s s a + v a l v o n t a r a k e n t e e s t a + v a l v o n t a r a k e n t e e t + v a l v o n t a r a k e n t e i d e n + v a l v o n t a r a k e n t e i s i i n + v a l v o n t a r a k e n t e i s t a + v a l v o n t a r a k e n t e i t a + v a l v o n t a r a p o r t i s s a + v a l v o n t a r a p o r t i t + v a l v o n t a r a p o r t t e i h i n + v a l v o n t a r a p o r t t e j a + v a l v o n t a r a p o r t t i e n + v a l v o n t a r e s u r s s e j a + v a l v o n t a r e s u r s s i n s a + v a l v o n t a r o o l i + v a l v o n t a r o o l i a + v a l v o n t a r o o l i a a n + v a l v o n t a r o o l i n + v a l v o n t a r o o l i n s a + v a l v o n t a r y h m i s s ä + v a l v o n t a r y h m ä + v a l v o n t a r y h m ä l l e + v a l v o n t a r y h m ä n + v a l v o n t a r y h m ä s s ä + v a l v o n t a r y h m ä t + v a l v o n t a r y h m ä ä + v a l v o n t a r y h m ä ä n + v a l v o n t a s a t e l l i i t t i m m e + v a l v o n t a s i h t e e r i s t ö + v a l v o n t a s o p i m u k s e n + v a l v o n t a s o p i m u s t a + v a l v o n t a s o t k u j a + v a l v o n t a s t a n d a r d e i h i n + v a l v o n t a s t a n d a r d e j a + v a l v o n t a s t a n d a r d i + v a l v o n t a s t r a t e g i a + v a l v o n t a s t r a t e g i a a + v a l v o n t a s t r a t e g i a l l a + v a l v o n t a s t r a t e g i a n + v a l v o n t a s t r a t e g i a s t a + v a l v o n t a s t r a t e g i a t + v a l v o n t a s t r a t e g i o i t a + v a l v o n t a s u u n n i t e l m a + v a l v o n t a s u u n n i t e l m a a + v a l v o n t a s u u n n i t e l m a n + v a l v o n t a s u u n n i t e l m a s t a + v a l v o n t a s u u n n i t e l m a t + v a l v o n t a s u u n n i t e l m i i n + v a l v o n t a s u u n n i t e l m i l l e + v a l v o n t a s y i l l ä + v a l v o n t a s y i s t ä + v a l v o n t a s y k l i i n + v a l v o n t a s ä ä d ö k s e l l ä + v a l v o n t a s ä ä d ö k s e t + v a l v o n t a s ä ä n n ö i l t ä + v a l v o n t a s ä ä n n ö k s i s s ä + v a l v o n t a s ä ä n n ö k s i ä + v a l v o n t a s ä ä n n ö s t ö + v a l v o n t a s ä ä n n ö t + v a l v o n t a s ä ä n t ö j e n + v a l v o n t a s ä ä n t ö j ä + v a l v o n t a t a a k a l l a + v a l v o n t a t a h o j e n + v a l v o n t a t a i d o t + v a l v o n t a t a p a + v a l v o n t a t a r k o i t u k s i i n + v a l v o n t a t a r p e e t + v a l v o n t a t a s o a + v a l v o n t a t a s o j e n + v a l v o n t a t a s o n + v a l v o n t a t e h t ä v i e n + v a l v o n t a t e h t ä v i i n + v a l v o n t a t e h t ä v i s s ä + v a l v o n t a t e h t ä v i s t ä + v a l v o n t a t e h t ä v i s t ä ä n + v a l v o n t a t e h t ä v i ä + v a l v o n t a t e h t ä v i ä ä n + v a l v o n t a t e h t ä v ä + v a l v o n t a t e h t ä v ä m m e + v a l v o n t a t e h t ä v ä n + v a l v o n t a t e h t ä v ä n s ä + v a l v o n t a t e h t ä v ä s s ä ä n + v a l v o n t a t e h t ä v ä s t ä + v a l v o n t a t e h t ä v ä s t ä m m e + v a l v o n t a t e h t ä v ä s t ä ä n + v a l v o n t a t e h t ä v ä t + v a l v o n t a t e h t ä v ä ä + v a l v o n t a t e h t ä v ä ä m m e + v a l v o n t a t e h t ä v ä ä n + v a l v o n t a t e h t ä v ä ä n s ä + v a l v o n t a t e k n i i k a n + v a l v o n t a t e k n i i k k a a + v a l v o n t a t e k n i i k o i d e n + v a l v o n t a t e k n i i k o i s t a + v a l v o n t a t e s t i e n + v a l v o n t a t i h e y t t ä + v a l v o n t a t i l a s t o t + v a l v o n t a t o i m e n p i d e a s e t u k s e e n + v a l v o n t a t o i m e n p i d e t t ä + v a l v o n t a t o i m e n p i t e e t + v a l v o n t a t o i m e n p i t e i d e n + v a l v o n t a t o i m e n p i t e i l l ä + v a l v o n t a t o i m e n p i t e i n + v a l v o n t a t o i m e n p i t e i s i i n + v a l v o n t a t o i m e n p i t e i s t ä + v a l v o n t a t o i m e n p i t e i t ä + v a l v o n t a t o i m e t + v a l v o n t a t o i m i + v a l v o n t a t o i m i a + v a l v o n t a t o i m i a a n + v a l v o n t a t o i m i e n + v a l v o n t a t o i m i e n s a + v a l v o n t a t o i m i i n + v a l v o n t a t o i m i l l a + v a l v o n t a t o i m i l l e + v a l v o n t a t o i m i l l e m m e + v a l v o n t a t o i m i n + v a l v o n t a t o i m i n n a n + v a l v o n t a t o i m i n t a + v a l v o n t a t o i m i n t a a + v a l v o n t a t o i m i n t a a n + v a l v o n t a t o i m i n t o + v a l v o n t a t o i m i s s a + v a l v o n t a t o i m i s t a + v a l v o n t a t o i m i s t o + v a l v o n t a t o i m i s t o n + v a l v o n t a t o i m i v a l t a a + v a l v o n t a t o i m i v a l t a a m m e + v a l v o n t a t u e n + v a l v o n t a t u l o k s e t + v a l v o n t a t u t k a t + v a l v o n t a t y y p i s s ä + v a l v o n t a t y ö + v a l v o n t a t y ö h ö n + v a l v o n t a t y ö k a l u + v a l v o n t a t y ö k i n + v a l v o n t a t y ö t ä + v a l v o n t a t y ö t ä m m e + v a l v o n t a u u d i s t u s t a + v a l v o n t a v a a t i m u k s e t + v a l v o n t a v a a t i m u k s i a + v a l v o n t a v a a t i m u k s i i n + v a l v o n t a v a a t i m u k s i s t a + v a l v o n t a v a a t i m u s t e n + v a l v o n t a v a i h e i s s a + v a l v o n t a v a l i o k u n n a l l a + v a l v o n t a v a l i o k u n n a l l e + v a l v o n t a v a l i o k u n n a l l e k i n + v a l v o n t a v a l i o k u n n a l t a + v a l v o n t a v a l i o k u n n a n + v a l v o n t a v a l i o k u n n a s s a + v a l v o n t a v a l i o k u n n a s s a m m e + v a l v o n t a v a l i o k u n n a s t a + v a l v o n t a v a l i o k u n n i l l a + v a l v o n t a v a l i o k u n n i l l e + v a l v o n t a v a l i o k u n t a + v a l v o n t a v a l i o k u n t a a + v a l v o n t a v a l i o k u n t a a n + v a l v o n t a v a l i o k u n t a m m e + v a l v o n t a v a l i o k u n t a n a + v a l v o n t a v a l i o k u n t i a + v a l v o n t a v a l i o k u n t i e n + v a l v o n t a v a l l a n + v a l v o n t a v a l l a s t a + v a l v o n t a v a l l a s t a a n + v a l v o n t a v a l m i u k s i a + v a l v o n t a v a l m i u k s i e n + v a l v o n t a v a l m i u t t a + v a l v o n t a v a l t a + v a l v o n t a v a l t a a + v a l v o n t a v a l t a a m m e + v a l v o n t a v a l t a a n s a + v a l v o n t a v a l t i o + v a l v o n t a v a l t i o l l e + v a l v o n t a v a l t u u d e t + v a l v o n t a v a l t u u k s i a + v a l v o n t a v a l t u u k s i a a n + v a l v o n t a v a l t u u k s i e n + v a l v o n t a v a l t u u s k u n n a n + v a l v o n t a v a l t u u s k u n t a + v a l v o n t a v a r u s t e i d e n + v a l v o n t a v a s t u u + v a l v o n t a v a s t u u n + v a l v o n t a v e l v o i t t e e n s a + v a l v o n t a v e l v o l l i s u u d e n + v a l v o n t a v e l v o l l i s u u k s i a a n + v a l v o n t a v e l v o l l i s u u k s i i n + v a l v o n t a v e l v o l l i s u u t t a n n e + v a l v o n t a v e n e i d e n + v a l v o n t a v e r k k o a m m e + v a l v o n t a v e r k o s t o + v a l v o n t a v e r k o s t o a + v a l v o n t a v e r k o s t o i l l e + v a l v o n t a v e r k o s t o i s t a + v a l v o n t a v e r k o s t o j a + v a l v o n t a v e r k o s t o n + v a l v o n t a v e r k o t + v a l v o n t a v i e r a i l u j e n + v a l v o n t a v i r a n o m a i n e n + v a l v o n t a v i r a n o m a i s e l e + v a l v o n t a v i r a n o m a i s e l l a + v a l v o n t a v i r a n o m a i s e l l e + v a l v o n t a v i r a n o m a i s e m m e + v a l v o n t a v i r a n o m a i s e n + v a l v o n t a v i r a n o m a i s e n a + v a l v o n t a v i r a n o m a i s e n s a + v a l v o n t a v i r a n o m a i s e s s a + v a l v o n t a v i r a n o m a i s e s t a + v a l v o n t a v i r a n o m a i s e t + v a l v o n t a v i r a n o m a i s e t k i n + v a l v o n t a v i r a n o m a i s i a + v a l v o n t a v i r a n o m a i s i i n + v a l v o n t a v i r a n o m a i s i l l a + v a l v o n t a v i r a n o m a i s i l l e + v a l v o n t a v i r a n o m a i s i l t a + v a l v o n t a v i r a n o m a i s i s t a + v a l v o n t a v i r a n o m a i s r a k e n n e + v a l v o n t a v i r a n o m a i s t a + v a l v o n t a v i r a n o m a i s t e n + v a l v o n t a v i r a s t o + v a l v o n t a v i r a s t o a + v a l v o n t a v i r a s t o i l l e + v a l v o n t a v i r a s t o i s t a + v a l v o n t a v i r a s t o j a + v a l v o n t a v i r a s t o j e n + v a l v o n t a v i r a s t o n + v a l v o n t a v i r a s t o t + v a l v o n t a v y ö h y k k e e l l ä + v a l v o n t a v ä l i n e + v a l v o n t a v ä l i n e e k s i + v a l v o n t a v ä l i n e e n ä + v a l v o n t a v ä l i n e e s t ä + v a l v o n t a v ä l i n e e t + v a l v o n t a v ä l i n e i d e n + v a l v o n t a v ä l i n e i l l e + v a l v o n t a v ä l i n e i s t ä + v a l v o n t a v ä l i n e i t ä + v a l v o n t a v ä l i n e i t ä ä n + v a l v o n t a v ä l i n e t t ä + v a l v o n t a y h t e i s k u n n a s t a + v a l v o n t a y h t e i s k u n t a a + v a l v o n t a y h t e i s t y ö + v a l v o n t a y h t e i s t y ö h ö n + v a l v o n t a y h t e i s t y ö j ä r j e s t e l y i h i n + v a l v o n t a y h t e i s t y ö n + v a l v o n t a y h t e i s t y ö t ä + v a l v o n t a y k s i k k ö j e n + v a l v o n t a y k s i k k ö j ä + v a l v o n t a y k s i k k ö n ä + v a l v o n t a y k s i k k ö ä + v a l v o n t a y k s i k ö i d e n + v a l v o n t a y k s i k ö i l l e + v a l v o n t a y k s i k ö n + v a l v o n t a y m p ä r i s t ö + v a l v o n t a y m p ä r i s t ö ä + v a l v o n u t + v a l v o o + v a l v o t a a n + v a l v o t t a e s s a + v a l v o t t a i s i i n + v a l v o t t a m i n e n + v a l v o t t a v a + v a l v o t t a v i k s i + v a l v o t t a v i s s a + v a l v o t t a v i s t a + v a l v o t t u a + v a l v o t t u j a + v a l v o t u n + v a l v o t u t + v a l v o v a a + v a l v o v a a n + v a l v o v a l l e + v a l v o v a n + v a l v o v a n a + v a l v o v a n s a + v a l v o v a t + v a l v o v i e n + v a m m a a + v a m m a i s a s i o i s s a + v a m m a i s d i r e k t i i v i + v a m m a i s d i r e k t i i v i s t ä + v a m m a i s d i r e k t i i v i ä + v a m m a i s e e n + v a m m a i s e l l e + v a m m a i s e n + v a m m a i s e n a + v a m m a i s e s t a + v a m m a i s e t + v a m m a i s e t u u d e t + v a m m a i s f o o r u m i + v a m m a i s f o o r u m i a + v a m m a i s f o o r u m i e n + v a m m a i s f o o r u m i n + v a m m a i s h o i d o n + v a m m a i s h o i d o s s a + v a m m a i s i a + v a m m a i s i i n + v a m m a i s i k s i + v a m m a i s i l l a + v a m m a i s i l l e + v a m m a i s i l t a + v a m m a i s i s t a + v a m m a i s j ä r j e s t ö i h i n + v a m m a i s j ä r j e s t ö i l l ä + v a m m a i s j ä r j e s t ö i l t ä + v a m m a i s j ä r j e s t ö j e n + v a m m a i s j ä r j e s t ö j ä + v a m m a i s j ä r j e s t ö l t ä + v a m m a i s j ä r j e s t ö n + v a m m a i s j ä r j e s t ö t + v a m m a i s j ä r j e s t ö t k i n + v a m m a i s k o m i t e a + v a m m a i s k y s y m y k s e e n + v a m m a i s k y s y m y k s e t + v a m m a i s k ä y t t ä j i e n + v a m m a i s l a i t o s t e n + v a m m a i s l a k i + v a m m a i s l i i k e + v a m m a i s l i i k k e e n + v a m m a i s m a t k u s t a j i i n + v a m m a i s o h j e l m a + v a m m a i s o h j e l m a n + v a m m a i s o h j e l m a n a + v a m m a i s o h j e l m i a + v a m m a i s p a l v e l u t + v a m m a i s p o l i t i i k a n + v a m m a i s p o l i t i i k a s s a + v a m m a i s p o l i t i i k a s t a + v a m m a i s p o l i t i i k a t + v a m m a i s p o l i t i i k k a + v a m m a i s p o l i t i i k k a a + v a m m a i s p o l i t i i k k o j a + v a m m a i s p u h u j a t + v a m m a i s r a t s a s t u s + v a m m a i s r y h m i e n + v a m m a i s r y h m i e n k i n + v a m m a i s r y h m ä t + v a m m a i s r y h m ä ä + v a m m a i s s t r a t e g i a + v a m m a i s s t r a t e g i a a n + v a m m a i s s t r a t e g i a n + v a m m a i s s t r a t e g i a s s a a n + v a m m a i s t a + v a m m a i s t e e m a n + v a m m a i s t e n + v a m m a i s t e n k i n + v a m m a i s t i e t o u t t a + v a m m a i s t i l a s t o i s t a + v a m m a i s t o i m i n t a s u u n n i t e l m a + v a m m a i s t o i m i n t a s u u n n i t e l m a n + v a m m a i s t o i m i n t a s u u n n i t e l m a s s a m m e + v a m m a i s t o i m i n t a s u u n n i t e l m a s t a + v a m m a i s t u k i + v a m m a i s t y ö r y h m ä n + v a m m a i s t y ö r y h m ä ä + v a m m a i s u r h e i l i j a t + v a m m a i s u r h e i l i j o i l l e + v a m m a i s u r h e i l i j o i l t a + v a m m a i s u r h e i l i j o i t a + v a m m a i s u r h e i l u + v a m m a i s u r h e i l u s t a + v a m m a i s u r h e i l u u n + v a m m a i s u u d e n + v a m m a i s u u d e s t a + v a m m a i s u u d e s t a a n + v a m m a i s u u s d i r e k t i i v i ä + v a m m a i s u u s k y s y m y k s e e n + v a m m a i s u u s k y s y m y s t ä + v a m m a i s u u t e e n + v a m m a i s y h d i s t y k s i l l ä + v a m m a n t u o t t a m u s + v a m m a s t a + v a m m a u t u a + v a m m a u t u m i s r i s k i + v a m m a u t u n e i s t a + v a m m a u t u n e i t a + v a m m a u t u n u t t a + v a m m a u t u u + v a m m o i h i n + v a m m o i s t a + v a m m o i t t a + v a m m o j a + v a m m o j e n + v a m p y y r i k r o n i k a t + v a m p y y r i l u k u + v a m p y y r i m a t k i j a + v a m p y y r i n t a p p a j a + v a m p y y r i p r i n s s i + v a m p y y r i p ä i v ä k i r j a t + v a m p y y r i s i s k o k s e t + v a m p y y r i t u r s a s + v a m p y y r i v u o r i + v a n a d i i n i d i o k s i d i + v a n a d i i n i o k s i t r i k l o r i d i + v a n a d i i n i t r i o k s i d i + v a n d a a l i s o t a + v a n d e r + v a n d e r l e i + v a n g e i l l e + v a n g e i l t a + v a n g e i s t a + v a n g i k s i + v a n g i n p u v u i s s a a n + v a n g i n v a i h d o n + v a n g i n v a r t i j a + v a n g i n v a r t i j o i d e n + v a n g i n v a r t i j o i s t a + v a n g i n v a r t i j o i t a + v a n g i t + v a n g i t a a n + v a n g i t s e m i e n + v a n g i t s e m i s e e n + v a n g i t s e m i s e l l e n s a + v a n g i t s e m i s e s t a + v a n g i t s e m i s j a k s o i h i n + v a n g i t s e m i s j ä r j e s t e l m ä n + v a n g i t s e m i s m ä ä r ä y k s e s t ä + v a n g i t s e m i s m ä ä r ä y s + v a n g i t s e m i s p e r u s t e e n a + v a n g i t s e m i s t e n + v a n g i t s e m i s t i l a t + v a n g i t s e m i s u h k a a + v a n g i t s e m i s v a i h e e s s a + v a n g i t s i s i + v a n g i t t i i n + v a n g i t t u a + v a n g i t t u i n a + v a n g i t t u j e n + v a n g i t t u n a + v a n g i t u i l l e + v a n g i t u i s t a + v a n g i t u n + v a n h a a + v a n h a a n + v a n h a e n g l a n n i n l a m m a s k o i r a + v a n h a i n k o d e i l l e + v a n h a i n k o d e i s s a + v a n h a i n k o d i s s a + v a n h a i n k o d i t + v a n h a i n k o t e i h i n + v a n h a i n k o t e j a + v a n h a i n k o t i + v a n h a i n k o t i a + v a n h a i n k o t i n a + v a n h a k a n t a i n e n + v a n h a k a n t a i s e e n + v a n h a k a n t a i s e n + v a n h a k a n t a i s e s t a + v a n h a k a n t a i s i a + v a n h a k a t o l i n e n + v a n h a k a u p u n k i + v a n h a k s i + v a n h a l l a k i n + v a n h a l l e + v a n h a n + v a n h a n a + v a n h a n a i k a i n e n + v a n h a n a i k a i s e e n + v a n h a n a i k a i s e l l a + v a n h a n a i k a i s e l t a + v a n h a n a i k a i s e m p i + v a n h a n a i k a i s e n + v a n h a n a i k a i s e n a + v a n h a n a i k a i s e s t a + v a n h a n a i k a i s e s t i + v a n h a n a i k a i s e t + v a n h a n a i k a i s i a + v a n h a n a i k a i s i i n + v a n h a n a i k a i s i n a + v a n h a n a i k a i s i s s a + v a n h a n a i k a i s t e n + v a n h a n k a u p u n g i n + v a n h a n m a l l i s e n + v a n h a n t y y l i s e e n + v a n h a s s a + v a n h a t + v a n h a t k a a n + v a n h a u s k o i s u u s + v a n h e m m a k s i + v a n h e m m a l l e + v a n h e m m a l t a + v a n h e m m a t + v a n h e m m i l l a + v a n h e m m i l l e + v a n h e m m i s t a + v a n h e m m u u d e n + v a n h e m m u u s k o r v a u k s e t + v a n h e m m u u s l o m a + v a n h e m p a i n e t u u k s i a + v a n h e m p a i n e t u u t t a + v a n h e m p a i n j ä r j e s t ö t + v a n h e m p a i n k e s k u k s i a + v a n h e m p a i n k o u l u j e n + v a n h e m p a i n l o m a + v a n h e m p a i n l o m a a + v a n h e m p a i n l o m a a n + v a n h e m p a i n l o m a e h t o j a + v a n h e m p a i n l o m a j ä r j e s t e l m i e n + v a n h e m p a i n l o m a j ä r j e s t e l m i ä + v a n h e m p a i n l o m a l l a + v a n h e m p a i n l o m a l l e + v a n h e m p a i n l o m a l t a + v a n h e m p a i n l o m a n + v a n h e m p a i n l o m a o i k e u k s i a + v a n h e m p a i n l o m a s t a + v a n h e m p a i n l o m a t + v a n h e m p a i n l o m i a + v a n h e m p a i n l o m i e n + v a n h e m p a i n l o m i s t a + v a n h e m p a i n p a l k a n + v a n h e m p a i n p a l k k a a + v a n h e m p a i n r a h a a + v a n h e m p a i n v a k u u t u k s e n + v a n h e m p a i n v a k u u t u k s e s t a + v a n h e m p a i n v a k u u t u s + v a n h e m p a i n v a k u u t u s j ä r j e s t e l m ä + v a n h e m p a i n v a p a a + v a n h e m p a i n v a p a a j a k s o j e n + v a n h e m p a i n v a p a a j ä r j e s t e l m i e n + v a n h e m p a i n v a p a a l l e + v a n h e m p a i n v a p a a n + v a n h e m p a i n v a p a a s e e n + v a n h e m p a i n v a p a a s s a + v a n h e m p a i n v a p a a s t a + v a n h e m p a i n v a p a a t a + v a n h e m p a i n v a p a i d e n + v a n h e m p a i n v a p a i s i i n + v a n h e m p a i n v a s t u u t a + v a n h e m p a i n y h d i s t y k s e t + v a n h e m p a i n y h d i s t y s t e n + v a n h e m p a m m e + v a n h e m p a n a + v a n h e m p a n s a + v a n h e m p i a + v a n h e m p i a a n + v a n h e m p i a k i n + v a n h e m p i e n + v a n h e m p i i n + v a n h e m p i i n s a + v a n h e m p i k i n + v a n h e n e e + v a n h e n e m a s s a + v a n h e n e m i s a i k a + v a n h e n e m i s a j a n + v a n h e n e m i s a j o i s s a + v a n h e n e m i s e e n + v a n h e n e m i s m ä ä r ä a j a n + v a n h e n e m m e + v a n h e n e v a t + v a n h e n t u a + v a n h e n t u m a s s a + v a n h e n t u m i s a i k a a + v a n h e n t u m i s a i k o j a + v a n h e n t u m i s a i k o j e n + v a n h e n t u m i s a j a n + v a n h e n t u m i s a j a s t a + v a n h e n t u m i s a j a t + v a n h e n t u m i s a j o i l l a + v a n h e n t u m i s a j o i s s a + v a n h e n t u m i s a j o i s t a + v a n h e n t u n e e n + v a n h e n t u n e e n a + v a n h e n t u n e e t + v a n h e n t u n e i d e n + v a n h e n t u n e i m m a s t a + v a n h e n t u n e i n t a + v a n h e n t u n e i t a + v a n h e n t u n u t t a + v a n h e n t u u + v a n h e n t u v a t + v a n h e t e s s a a n + v a n h i m m i l l e + v a n h i m m i s s a + v a n h i m m i s t a + v a n h i m p i a + v a n h o i h i n + v a n h o i k s i + v a n h o i l l a + v a n h o i l l a k a a n + v a n h o i l l e + v a n h o i l l e k i n + v a n h o i l l i s e m m a t + v a n h o i l l i s i m m a l l e + v a n h o i l l i s i s l a m i l a i s u u t e e n + v a n h o i l l i s l e s t a d i o l a i s u u s + v a n h o i l l i s t a + v a n h o i n + v a n h o i n a + v a n h o i s s a + v a n h o i s s a k i n + v a n h o i s t a + v a n h o j a + v a n h o j e n + v a n h o j e n k i n + v a n h o j e n p ä i v ä + v a n h u k s e l l e + v a n h u k s e m m e + v a n h u k s e n + v a n h u k s e n s a + v a n h u k s e s t a + v a n h u k s e t + v a n h u k s i a + v a n h u k s i a a n + v a n h u k s i e n + v a n h u k s i i n + v a n h u k s i l l a + v a n h u k s i l l e + v a n h u k s i l t a + v a n h u k s i s t a + v a n h u k s i s t a m m e + v a n h u r s k a u t t a m i s e s t a + v a n h u s p o l i t i i k k a a n + v a n h u s t a + v a n h u s t e m m e + v a n h u s t e n + v a n h u s t e n h o i d o l l e + v a n h u s t e n h o i d o n + v a n h u s t e n h o i t o + v a n h u s t e n h o i t o a + v a n h u s t e n h o i t o l a i t o k s i s s a + v a n h u s t e n h o i t o p a l v e l u j a + v a n h u s t e n h o i t o t u t k i n t o j a + v a n h u s t e n h u o l l o s s a + v a n h u s t e n h u o l l o s t a + v a n h u s t e n h u o l t o + v a n h u s t e n h u o l t o a + v a n h u s t e n h u o l t o j ä r j e s t e l m i e n + v a n h u s t e n h u o l t o o n + v a n h u s t e n h u o l t o p a l v e l u j e n + v a n h u s t e n k o t e j a + v a n h u u d e n + v a n h u u d e n p ä i v i i n + v a n h u u d e n t u r v a a + v a n h u u d e n t u r v a j ä r j e s t e l m i s s ä + v a n h u u d e n t u r v a j ä r j e s t e l m ä ä + v a n h u u d e n t u r v a n s a + v a n h u u d e n t u r v a s t a + v a n h u u d e s s a + v a n h u u d e s s a a n + v a n h u u d e s t a + v a n h u u s a j a n + v a n h u u s e l ä k e + v a n h u u s e l ä k e j ä r j e s t e l m i e n + v a n h u u s e l ä k e j ä r j e s t e l m ä n + v a n h u u s e l ä k e t t ä + v a n h u u s e l ä k e t u o t t e i d e n + v a n h u u s e l ä k e t u r v a a n + v a n h u u s e l ä k e v a k u u t u s t e n + v a n h u u s e l ä k e v e l v o i t t e i d e n + v a n h u u s e l ä k k e e l l e + v a n h u u s e l ä k k e e l l ä + v a n h u u s e l ä k k e e n + v a n h u u s e l ä k k e e s e e n + v a n h u u s e l ä k k e e s t ä + v a n h u u s e l ä k k e e t + v a n h u u s e l ä k k e i d e n + v a n h u u s e l ä k k e i s i i n + v a n h u u s e l ä k k e i t ä + v a n h u u s i k ä ä + v a n h u u s i ä n + v a n h u u s i ä s s ä + v a n h u u s t u r v a + v a n h u u t e e n + v a n h u u t t a + v a n i l j a j u g u r t t i + v a n i l j a s o k e r i + v a n j ä r v i + v a n k a l l a + v a n k a n + v a n k a s s a + v a n k a t + v a n k e i n a + v a n k e i n h o i t o j ä r j e s t e l m i e n + v a n k e i n h o i t o j ä r j e s t e l m ä s t ä + v a n k e j a + v a n k e j a a n + v a n k e m m a n + v a n k e m m a t + v a n k e m m i n + v a n k e m p a a + v a n k e m p i + v a n k e m p i a + v a n k e m p i e n + v a n k e u d e n + v a n k e u d e s s a + v a n k e u s a i k a n a + v a n k e u s j a k s o j a + v a n k e u s j a k s o t + v a n k e u s j ä r j e s t e l y n + v a n k e u s l a i t o k s i s s a + v a n k e u s o l o i h i n + v a n k e u s o l o j e n + v a n k e u s o l o n s a + v a n k e u s o l o s u h t e e t + v a n k e u s o l o t + v a n k e u s r a n g a i s t u k s e e n + v a n k e u s r a n g a i s t u k s e l l a + v a n k e u s r a n g a i s t u k s e l l e + v a n k e u s r a n g a i s t u k s e n + v a n k e u s r a n g a i s t u k s e n s a + v a n k e u s r a n g a i s t u k s e s t a + v a n k e u s r a n g a i s t u k s e t + v a n k e u s r a n g a i s t u k s i a + v a n k e u s r a n g a i s t u k s i e n + v a n k e u s r a n g a i s t u k s i i n + v a n k e u s r a n g a i s t u k s i k s i + v a n k e u s r a n g a i s t u k s i l l e + v a n k e u s r a n g a i s t u k s i s t a + v a n k e u s r a n g a i s t u s + v a n k e u s r a n g a i s t u s t a + v a n k e u s s t a n d a r d i e n + v a n k e u s t u o m i o + v a n k e u s t u o m i o i h i n + v a n k e u s t u o m i o i l l a + v a n k e u s t u o m i o i s t a a n + v a n k e u s t u o m i o i t a + v a n k e u s t u o m i o l t a + v a n k e u s t u o m i o n + v a n k e u s t u o m i o s t a + v a n k e u s t u o m i o t + v a n k e u s v u o d e n + v a n k e u t e e n + v a n k i a + v a n k i e n + v a n k i e n l u o v u t u s t e n + v a n k i k a r k u r i t + v a n k i k u l j e t u k s i a + v a n k i k u l j e t u k s i l l a + v a n k i k u l j e t u k s i s t a + v a n k i k u l j e t u s t a p a u s t a + v a n k i k u l j e t u s t e n + v a n k i k y s y m y s t ä + v a n k i l a a n + v a n k i l a h e n k i l ö k u n n a n + v a n k i l a h e n k i l ö s t ö + v a n k i l a j ä r j e s t e l m i e n + v a n k i l a j ä r j e s t e l m i ä + v a n k i l a j ä r j e s t e l m ä + v a n k i l a j ä r j e s t e l m ä m m e + v a n k i l a j ä r j e s t e l m ä n + v a n k i l a j ä r j e s t e l m ä ä + v a n k i l a j ä r j e s t e l m ä ä n + v a n k i l a k a l t e r e i t a + v a n k i l a k o e + v a n k i l a k u s t a n n u k s i s s a + v a n k i l a l a i n s ä ä d ä n t ö ä + v a n k i l a l a i t o s j ä r j e s t e l m ä ä n + v a n k i l a n + v a n k i l a n p o r t t e j a + v a n k i l a n v i r a n o m a i s e t + v a n k i l a o l o i h i n + v a n k i l a o l o i s s a + v a n k i l a o l o i s t a + v a n k i l a o l o j a + v a n k i l a o l o j e n + v a n k i l a o l o n s a + v a n k i l a o l o s u h t e e t + v a n k i l a o l o s u h t e i d e n + v a n k i l a o l o s u h t e i t a + v a n k i l a o l o t + v a n k i l a p a p p e j a + v a n k i l a p o l i t i i k a n + v a n k i l a p o l i t i i k k a a n + v a n k i l a r a n g a i s t u k s e t + v a n k i l a r a n g a i s t u k s i e n + v a n k i l a r a n g a i s t u s t a + v a n k i l a s a i r a a l a a n + v a n k i l a s e l l i s s ä ä n + v a n k i l a s s a + v a n k i l a s s a o l o n s a + v a n k i l a s t a + v a n k i l a t + v a n k i l a t a r k a s t a j a t + v a n k i l a t u o m i o + v a n k i l a t u o m i o i d e n + v a n k i l a t u o m i o i h i n + v a n k i l a t u o m i o i t a + v a n k i l a t u o m i o n + v a n k i l a t u o m i o s t a + v a n k i l a t u o m i o t + v a n k i l a t u o m i o t a + v a n k i l a t y ö n t e k i j ö i h i n + v a n k i l a t y ö n t e k i j ö i t ä + v a n k i l a u u d i s t u k s e n + v a n k i l a u u d i s t u s + v a n k i l a v a a t t e i t a + v a n k i l a v a l t i o + v a n k i l a v a l t i o s s a + v a n k i l a v a l t i o t a + v a n k i l a v i e r a i l u j e n + v a n k i l a v i r a n o m a i n e n + v a n k i l a v i r a n o m a i s e t + v a n k i l a v i r a n o m a i s i a + v a n k i l a v i r a n o m a i s t e n + v a n k i l a v u o d e n + v a n k i l a v u o s i e n i + v a n k i l a v u o t e e n + v a n k i l a y m p ä r i s t ö s s ä + v a n k i l e i r e i l l e + v a n k i l e i r e i l l ä + v a n k i l e i r e i l t ä + v a n k i l e i r e j ä + v a n k i l e i r i + v a n k i l e i r i e n + v a n k i l e i r i l l ä + v a n k i l e i r i n + v a n k i l e i r i t + v a n k i l e n n o i s s a + v a n k i l e n n o t + v a n k i l o i d e n + v a n k i l o i h i n + v a n k i l o i l l e + v a n k i l o i s s a + v a n k i l o i s t a + v a n k i l o i t a + v a n k i l u o k k a + v a n k i n a + v a n k i n a a n + v a n k i n s a + v a n k i p a i k o i s t a + v a n k i s e l l e i h i n + v a n k i s e l l i + v a n k i t a p a a m i s i i n + v a n k i t y ö + v a n k k a a + v a n k k a a n + v a n k k o i h i n + v a n k k o j a + v a n k k u m a t o n t a + v a n k k u r i k a r a v a a n i + v a n n e n e i t o k a l a + v a n u k ä r p ä s s i e n i + v a n u n u + v a p a a e h t o i n e n + v a p a a e h t o i s a l a n + v a p a a e h t o i s e e n + v a p a a e h t o i s e k s i + v a p a a e h t o i s e l l a + v a p a a e h t o i s e m p i + v a p a a e h t o i s e n + v a p a a e h t o i s e n a + v a p a a e h t o i s e s t a + v a p a a e h t o i s e s t i + v a p a a e h t o i s e t + v a p a a e h t o i s h e n k i + v a p a a e h t o i s i a + v a p a a e h t o i s i i n + v a p a a e h t o i s i k s i + v a p a a e h t o i s i l l a + v a p a a e h t o i s i l l e + v a p a a e h t o i s i n a + v a p a a e h t o i s i s s a + v a p a a e h t o i s i s t a + v a p a a e h t o i s j a l k a v ä k i r y k m e n t t i + v a p a a e h t o i s j o u k k o j e n + v a p a a e h t o i s j o u k o t + v a p a a e h t o i s j ä r j e s t e l m i i n + v a p a a e h t o i s j ä r j e s t e l m ä ä n + v a p a a e h t o i s j ä r j e s t ö i d e n + v a p a a e h t o i s j ä r j e s t ö i h i n + v a p a a e h t o i s j ä r j e s t ö i k s i + v a p a a e h t o i s j ä r j e s t ö i l l e + v a p a a e h t o i s j ä r j e s t ö i l l ä + v a p a a e h t o i s j ä r j e s t ö i l t ä + v a p a a e h t o i s j ä r j e s t ö i s t ä + v a p a a e h t o i s j ä r j e s t ö j e n + v a p a a e h t o i s j ä r j e s t ö j ä + v a p a a e h t o i s j ä r j e s t ö l l ä + v a p a a e h t o i s j ä r j e s t ö n + v a p a a e h t o i s j ä r j e s t ö s s ä + v a p a a e h t o i s j ä r j e s t ö t + v a p a a e h t o i s j ä s e n t e n + v a p a a e h t o i s l i i k k e e n + v a p a a e h t o i s l u o n n e + v a p a a e h t o i s l u o v u t t a j i a + v a p a a e h t o i s o h j e l m a + v a p a a e h t o i s o h j e l m i e n + v a p a a e h t o i s p a l v e l u + v a p a a e h t o i s p a l v e l u a + v a p a a e h t o i s p a l v e l u i l l e + v a p a a e h t o i s p a l v e l u j e n + v a p a a e h t o i s p a l v e l u l l a + v a p a a e h t o i s p a l v e l u l l e + v a p a a e h t o i s p a l v e l u n + v a p a a e h t o i s p a l v e l u o h j e l m a n + v a p a a e h t o i s p a l v e l u s t a + v a p a a e h t o i s p a l v e l u u n + v a p a a e h t o i s p a n s s a r i k r e n a t ö ö r i d i v i s i o o n a + v a p a a e h t o i s p o h j a l t a + v a p a a e h t o i s r y h m i e n + v a p a a e h t o i s r y h m i l l e + v a p a a e h t o i s r y h m i ä + v a p a a e h t o i s r y h m ä t + v a p a a e h t o i s s e k t o r i + v a p a a e h t o i s s e k t o r i a + v a p a a e h t o i s s e k t o r i l l a + v a p a a e h t o i s s e k t o r i l l e + v a p a a e h t o i s s e k t o r i n + v a p a a e h t o i s s o p i m u k s i i n + v a p a a e h t o i s t a + v a p a a e h t o i s t e n + v a p a a e h t o i s t o i m i a + v a p a a e h t o i s t o i m i n n a l l a + v a p a a e h t o i s t o i m i n n a l l e + v a p a a e h t o i s t o i m i n n a l l i s e n + v a p a a e h t o i s t o i m i n n a n + v a p a a e h t o i s t o i m i n n a s s a + v a p a a e h t o i s t o i m i n n a s t a + v a p a a e h t o i s t o i m i n t a + v a p a a e h t o i s t o i m i n t a a + v a p a a e h t o i s t o i m i n t a a n + v a p a a e h t o i s t y ö + v a p a a e h t o i s t y ö h ö n + v a p a a e h t o i s t y ö j a k s o n + v a p a a e h t o i s t y ö j ä r j e s t ö j ä + v a p a a e h t o i s t y ö k e s k u k s e n + v a p a a e h t o i s t y ö k ä y t ä n t ö j e n + v a p a a e h t o i s t y ö l l e + v a p a a e h t o i s t y ö l l ä + v a p a a e h t o i s t y ö n + v a p a a e h t o i s t y ö n t e k i j ä t + v a p a a e h t o i s t y ö n t e k i j ö i d e n + v a p a a e h t o i s t y ö n t e k i j ö i h i n + v a p a a e h t o i s t y ö n t e k i j ö i t ä + v a p a a e h t o i s t y ö o h j e l m a a + v a p a a e h t o i s t y ö o h j e l m a a n + v a p a a e h t o i s t y ö o h j e l m a n + v a p a a e h t o i s t y ö o h j e l m i e n + v a p a a e h t o i s t y ö o h j e l m i i n + v a p a a e h t o i s t y ö p r o j e k t i + v a p a a e h t o i s t y ö s s ä + v a p a a e h t o i s t y ö s s ä ä n + v a p a a e h t o i s t y ö s t ä + v a p a a e h t o i s t y ö t o i m i n n a n + v a p a a e h t o i s t y ö t ä + v a p a a e h t o i s u u d e l l e + v a p a a e h t o i s u u d e n + v a p a a e h t o i s u u d e s t a + v a p a a e h t o i s u u s + v a p a a e h t o i s u u s p e r i a a t e + v a p a a e h t o i s u u s p e r i a a t t e e s t a + v a p a a e h t o i s u u s p o h j a l t a + v a p a a e h t o i s u u s s o p i m u k s i e n + v a p a a e h t o i s u u t e e n + v a p a a e h t o i s u u t t a + v a p a a e h t o i s v e r k o s t o j e n + v a p a a e h t o i s v o i m i n + v a p a a e h t o i s v u o r i s t o d i v i s i o o n a + v a p a a e h t o i s v u o s i + v a p a a e h t o i s y h d i s t y k s i ä + v a p a a e l e k t r o n i l a s e r + v a p a a h e t k i n ä ä n + v a p a a j a k s o + v a p a a j ä r j e s t e l m i ä + v a p a a j ä r j e s t e l m ä t + v a p a a j ä r j e s t e l y i s s ä + v a p a a j ä r j e s t e l y j e n + v a p a a j ä s e n y y t t ä + v a p a a k a p p a l e k o k o e l m i e n + v a p a a k a p p a l e k u v a + v a p a a k a p p a l e o i k e u s + v a p a a k a u p a k s i + v a p a a k a u p a l l a + v a p a a k a u p a l l e + v a p a a k a u p a n + v a p a a k a u p a s s a + v a p a a k a u p a s t a + v a p a a k a u p p a + v a p a a k a u p p a a + v a p a a k a u p p a a n + v a p a a k a u p p a f o o r u m i a + v a p a a k a u p p a i d e o l o g i a + v a p a a k a u p p a i d e o l o g i a a + v a p a a k a u p p a j ä r j e s t e l m ä + v a p a a k a u p p a j ä r j e s t e l m ä l l ä + v a p a a k a u p p a j ä r j e s t e l m ä n + v a p a a k a u p p a j ä r j e s t e l m ä s s ä + v a p a a k a u p p a j ä r j e s t e l m ä ä + v a p a a k a u p p a j ä r j e s t e l m ä ä n + v a p a a k a u p p a j ä r j e s t e l y i l l e + v a p a a k a u p p a j ä r j e s t e l y i s t ä + v a p a a k a u p p a j ä r j e s t e l y j e n + v a p a a k a u p p a j ä r j e s t e l y n + v a p a a k a u p p a j ä r j e s t ö + v a p a a k a u p p a j ä r j e s t ö ö n + v a p a a k a u p p a k a m p a n j a s s a + v a p a a k a u p p a k i n + v a p a a k a u p p a k r i t e e r i t + v a p a a k a u p p a k y s y m y k s i s s ä + v a p a a k a u p p a l i i t o n + v a p a a k a u p p a l i i t o s t a + v a p a a k a u p p a l i i t t o + v a p a a k a u p p a l i i t t o o n + v a p a a k a u p p a m a a + v a p a a k a u p p a m a l l i + v a p a a k a u p p a m a l l i a + v a p a a k a u p p a m a l l i n + v a p a a k a u p p a m a r k k i n o i l l a + v a p a a k a u p p a m ä ä r ä y k s i i n + v a p a a k a u p p a m ä ä r ä y s t e n + v a p a a k a u p p a n e u v o t t e l u i d e n + v a p a a k a u p p a n e u v o t t e l u i h i n + v a p a a k a u p p a n e u v o t t e l u i s s a + v a p a a k a u p p a n e u v o t t e l u j a + v a p a a k a u p p a n e u v o t t e l u j e n + v a p a a k a u p p a n e u v o t t e l u t + v a p a a k a u p p a n s a + v a p a a k a u p p a o p i n + v a p a a k a u p p a o p i s t a + v a p a a k a u p p a p e r i a a t t e e n + v a p a a k a u p p a p e r i a a t t e e s e e n + v a p a a k a u p p a p o l i t i i k a n + v a p a a k a u p p a p o l i t i i k k a + v a p a a k a u p p a p o l i t i i k k a a + v a p a a k a u p p a p u i t t e e t + v a p a a k a u p p a s o p i m u k s e e n + v a p a a k a u p p a s o p i m u k s e k s i + v a p a a k a u p p a s o p i m u k s e l l a + v a p a a k a u p p a s o p i m u k s e l l e + v a p a a k a u p p a s o p i m u k s e m m e + v a p a a k a u p p a s o p i m u k s e n + v a p a a k a u p p a s o p i m u k s e s s a + v a p a a k a u p p a s o p i m u k s e s t a + v a p a a k a u p p a s o p i m u k s e t + v a p a a k a u p p a s o p i m u k s i a + v a p a a k a u p p a s o p i m u k s i e n + v a p a a k a u p p a s o p i m u k s i i n + v a p a a k a u p p a s o p i m u k s i i n s a + v a p a a k a u p p a s o p i m u k s i k s i + v a p a a k a u p p a s o p i m u k s i l l a + v a p a a k a u p p a s o p i m u k s i l l e + v a p a a k a u p p a s o p i m u k s i n a + v a p a a k a u p p a s o p i m u k s i s s a + v a p a a k a u p p a s o p i m u k s i s s a m m e + v a p a a k a u p p a s o p i m u k s i s t a + v a p a a k a u p p a s o p i m u k s i s t a m m e + v a p a a k a u p p a s o p i m u s + v a p a a k a u p p a s o p i m u s n e u v o t t e l u i d e n + v a p a a k a u p p a s o p i m u s n e u v o t t e l u i h i n + v a p a a k a u p p a s o p i m u s n e u v o t t e l u i s s a + v a p a a k a u p p a s o p i m u s n e u v o t t e l u i s t a + v a p a a k a u p p a s o p i m u s n e u v o t t e l u j a + v a p a a k a u p p a s o p i m u s n e u v o t t e l u j e n + v a p a a k a u p p a s o p i m u s n e u v o t t e l u t + v a p a a k a u p p a s o p i m u s t a + v a p a a k a u p p a s o p i m u s t e m m e + v a p a a k a u p p a s o p i m u s t e n + v a p a a k a u p p a s t r a t e g i a n + v a p a a k a u p p a s u h t e e t + v a p a a k a u p p a t a l o u d e n + v a p a a k a u p p a t a v o i t t e e m m e + v a p a a k a u p p a t a v o i t t e i t a a n + v a p a a k a u p p a t e o r i o i d e n + v a p a a k a u p p a u n i o n i + v a p a a k a u p p a v y ö h y k e + v a p a a k a u p p a v y ö h y k e t t ä + v a p a a k a u p p a v y ö h y k k e e l l e + v a p a a k a u p p a v y ö h y k k e e n + v a p a a k a u p p a v y ö h y k k e e t + v a p a a k a u p p a v y ö h y k k e i d e n + v a p a a k a u p p a v y ö h y k k e i s t ä + v a p a a k a u p p i a a t + v a p a a k a u p p i a s + v a p a a k a u p p i a s t o i m i n t a a n n e + v a p a a k i r j a + v a p a a k i r j a s t a + v a p a a k i r k k o + v a p a a k o r t t i a + v a p a a k s i + v a p a a l e h d y k k ä s o i t i n + v a p a a l i p p u a + v a p a a l i p u n + v a p a a l l a + v a p a a l l e + v a p a a m a r k k i n a j ä r j e s t e l m ä ä n + v a p a a m a r k k i n a t a l o u t e e n + v a p a a m a r k k i n o i d e n + v a p a a m a r k k i n o i h i n + v a p a a m a t k u s t a j a k s i + v a p a a m a t k u s t a j a n + v a p a a m a t k u s t a j a n a + v a p a a m a t k u s t a j a t + v a p a a m a t k u s t a j i a + v a p a a m a t k u s t a j i e n + v a p a a m a t k u s t a j i k s i + v a p a a m a t k u s t a j i l t a + v a p a a m a t k u s t a j i s t a + v a p a a m a t k u s t a m i n e n + v a p a a m a t k u s t u s + v a p a a m i e l i n e n + v a p a a m i e l i s e m m ä l l ä + v a p a a m i e l i s e m p i + v a p a a m i e l i s e m p i ä + v a p a a m i e l i s e m p ä ä + v a p a a m i e l i s i k s i + v a p a a m i e l i s i n t ä + v a p a a m m a n + v a p a a m m a t + v a p a a m m i n + v a p a a m p a a + v a p a a m p a a n + v a p a a m p i + v a p a a m p i a + v a p a a m p i e n + v a p a a m u o t o i s e l l a + v a p a a m u u r a r i j ä r j e s t ö + v a p a a n + v a p a a n a + v a p a a n k a u p a n + v a p a a o t t e l u + v a p a a p a i n i + v a p a a p a l o k u n n a n + v a p a a p a l o k u n n a t + v a p a a p a l o k u n t a + v a p a a p a l o k u n t a j ä r j e s t e l m ä + v a p a a p a l o k u n t i a + v a p a a p i s t o o l i + v a p a a p i s t o o l i n + v a p a a p o t k u + v a p a a p u d o t u k s e e n + v a p a a p u d o t u s t o r n i + v a p a a p ä i v i ä + v a p a a p ä i v ä n + v a p a a p ä i v ä n ä + v a p a a s a t a m a + v a p a a s a t a m a a n + v a p a a s a t a m i a + v a p a a s e e n + v a p a a s o t i l a s + v a p a a s s a + v a p a a s t a + v a p a a t + v a p a a t a + v a p a a u i n t i + v a p a a v a l i n t a i s e k s i + v a p a a v a l i n t a i s e s t i + v a p a a v a l t i o + v a p a a v a r a s t o i h i n + v a p a a v i r k k a u s + v a p a e h t o i s i a + v a p a i d e n + v a p a i k s i + v a p a i l l a + v a p a i l l e + v a p a i m m a t + v a p a i m m i s t a + v a p a i n a + v a p a i s i i n + v a p a i s t a + v a p a i t a + v a p a k a l a s t a j a + v a p a k a l a s t u s + v a p a k a u p p a + v a p a p r e s i d e n t i l l e + v a p a u d e k s i + v a p a u d e l l a + v a p a u d e l l e + v a p a u d e n + v a p a u d e n a r v o j e n + v a p a u d e n j a n o n s a + v a p a u d e n k a i p u u + v a p a u d e n k a i p u u n + v a p a u d e n k a i p u u n s a + v a p a u d e n k a i p u u s s a + v a p a u d e n k a i p u u s t a + v a p a u d e n k a i p u u s t a a n + v a p a u d e n k a i p u u t a + v a p a u d e n p a l k i n n o n + v a p a u d e n p a l k i n t o + v a p a u d e n p a t s a s + v a p a u d e n r i i s t o + v a p a u d e n r i i s t o a + v a p a u d e n r i i s t o o n + v a p a u d e n r i i s t o s t a + v a p a u d e n r i i s t o t + v a p a u d e n r i i s t o t o i m i i n + v a p a u d e n r i s t i + v a p a u d e n s i l t a + v a p a u d e n v a a t i m u k s e t + v a p a u d e s t a + v a p a u d e t + v a p a u k s i a + v a p a u k s i e m m e + v a p a u k s i e n + v a p a u k s i i n + v a p a u k s i s t a + v a p a u k s i s t a m m e + v a p a u s a j a t u k s e n + v a p a u s a r m e i j a n + v a p a u s a s t e + v a p a u s k ä s i t y k s e n + v a p a u s l i i k e + v a p a u s l i i k e t t ä + v a p a u s l i i k k e e l l e + v a p a u s l i i k k e e n + v a p a u s l i i k k e e t + v a p a u s l i i k k e i l l e + v a p a u s l i i t t o + v a p a u s o i k e u d e t + v a p a u s o i k e u k s i e n + v a p a u s o i k e u t t a + v a p a u s p a l k i n t o a a n + v a p a u s p e r i a a t t e e t + v a p a u s p u o l u e + v a p a u s p u o l u e e l l e + v a p a u s p u o l u e e n + v a p a u s p u o l u e l a i s e t + v a p a u s p u o l u e t t a + v a p a u s p y r k i m y k s e t + v a p a u s p y r k i m y k s i s s ä + v a p a u s r a n g a i s t u k s i i n + v a p a u s r a n g a i s t u k s i s t a + v a p a u s r a n g a i s t u s + v a p a u s r a n g a i s t u s t a + v a p a u s r i n t a m a + v a p a u s s o d a l l e + v a p a u s s o d a n + v a p a u s s o p i m u k s e s t a + v a p a u s s o t a + v a p a u s s o t a a + v a p a u s t a i s t e l i j a + v a p a u s t a i s t e l i j a a + v a p a u s t a i s t e l i j a t + v a p a u s t a i s t e l i j o i d e n + v a p a u s t a i s t e l i j o i k s i + v a p a u s t a i s t e l i j o i l l e + v a p a u s t a i s t e l i j o i n a + v a p a u s t a i s t e l i j o i t a + v a p a u s t a i s t e l u + v a p a u s t a i s t e l u a + v a p a u s t a i s t e l u a a n + v a p a u s t a i s t e l u i t a + v a p a u s t a i s t e l u k s i + v a p a u s t a i s t e l u n + v a p a u s t a i s t e l u s s a + v a p a u s t a i s t e l u s s a m m e + v a p a u s t a i s t e l u s t a + v a p a u s t a i s t e l u u n + v a p a u s t a i s t o n + v a p a u s t a k e i s t a + v a p a u s t o i v e i t a + v a p a u s u s k o n + v a p a u t a m m e + v a p a u t e e n + v a p a u t e n s a + v a p a u t e t a a n + v a p a u t e t t a i s i i n + v a p a u t e t t a v a + v a p a u t e t t u i h i n + v a p a u t e t t u j e n + v a p a u t e t u s s a + v a p a u t t a + v a p a u t t a a + v a p a u t t a a k s e e n + v a p a u t t a a n + v a p a u t t a e n + v a p a u t t a e s s a m m e + v a p a u t t a i s i v a t + v a p a u t t a j a n a + v a p a u t t a j i s t a + v a p a u t t a m a a n + v a p a u t t a m a l l a + v a p a u t t a m a s t a + v a p a u t t a m i s a a l l o n + v a p a u t t a m i s a a l t o a + v a p a u t t a m i s a i k a t a u l u j e n + v a p a u t t a m i s a i k a t a u l u s s a a n + v a p a u t t a m i s a j a t u s t a + v a p a u t t a m i s d i r e k t i i v i s t ä + v a p a u t t a m i s e e n + v a p a u t t a m i s e h d o t + v a p a u t t a m i s e h d o t u k s e t + v a p a u t t a m i s e h d o t u k s i a + v a p a u t t a m i s e h d o t u s + v a p a u t t a m i s e h d o t u s t a + v a p a u t t a m i s e k s e e n + v a p a u t t a m i s e k s i + v a p a u t t a m i s e l l a + v a p a u t t a m i s e n + v a p a u t t a m i s e s s a + v a p a u t t a m i s e s t a + v a p a u t t a m i s i n n o l t a + v a p a u t t a m i s i n t o + v a p a u t t a m i s i n t o a + v a p a u t t a m i s i s t a + v a p a u t t a m i s j u n a + v a p a u t t a m i s k e h i t y s + v a p a u t t a m i s k e h i t y s t ä + v a p a u t t a m i s k e i n o j e n + v a p a u t t a m i s k e r t o m u s t a + v a p a u t t a m i s k i e r r o k s e n + v a p a u t t a m i s k i e r r o s t e n + v a p a u t t a m i s k y s y m y s t ä + v a p a u t t a m i s k ä y t ä n t ö i h i n + v a p a u t t a m i s m a h d o l l i s u u k s i a + v a p a u t t a m i s m a l l i n + v a p a u t t a m i s m e n e t t e l y + v a p a u t t a m i s m e n e t t e l y ä + v a p a u t t a m i s n e u v o t t e l u j a + v a p a u t t a m i s o h j e l m a a + v a p a u t t a m i s o h j e l m a s t a a n + v a p a u t t a m i s p a k e t e i s t a + v a p a u t t a m i s p a k e t i n + v a p a u t t a m i s p a k e t t e j a + v a p a u t t a m i s p a k e t t i + v a p a u t t a m i s p a k e t t i a + v a p a u t t a m i s p a k e t t i e n + v a p a u t t a m i s p a k e t t i i n + v a p a u t t a m i s p o l i t i i k a n + v a p a u t t a m i s p o l i t i i k a s t a + v a p a u t t a m i s p o l i t i i k a t + v a p a u t t a m i s p o l i t i i k k a + v a p a u t t a m i s p o l i t i i k k a a + v a p a u t t a m i s p r o s e s s e i l l e + v a p a u t t a m i s p r o s e s s e i s s a + v a p a u t t a m i s p r o s e s s e j a + v a p a u t t a m i s p r o s e s s i + v a p a u t t a m i s p r o s e s s i a + v a p a u t t a m i s p r o s e s s i e n + v a p a u t t a m i s p r o s e s s i i n + v a p a u t t a m i s p r o s e s s i n + v a p a u t t a m i s p r o s e s s i s s a + v a p a u t t a m i s p r o s e s s i s t a + v a p a u t t a m i s p r o s e s s i t + v a p a u t t a m i s p y r k i m y k s e n + v a p a u t t a m i s p y r k i m y k s e t + v a p a u t t a m i s p y r k i m y k s i i n + v a p a u t t a m i s p y r k i m y k s i ä + v a p a u t t a m i s p ä i v ä k s i + v a p a u t t a m i s p ä i v ä ä + v a p a u t t a m i s p ä ä t ö k s e n + v a p a u t t a m i s p ä ä t ö s t e n + v a p a u t t a m i s p ä ä t ö s t ä + v a p a u t t a m i s s i t o u m u k s i a + v a p a u t t a m i s s k e n a a r i o i d e n + v a p a u t t a m i s s t r a t e g i a a + v a p a u t t a m i s s t r a t e g i a l l a + v a p a u t t a m i s s t r a t e g i a n + v a p a u t t a m i s s u u n n i t e l m i e n + v a p a u t t a m i s s u u n n i t e l m i i n + v a p a u t t a m i s s u u n n i t e l m i l l e + v a p a u t t a m i s t a + v a p a u t t a m i s t a a n + v a p a u t t a m i s t a k i n + v a p a u t t a m i s t a r j o u k s i a + v a p a u t t a m i s t a r j o u s t e n + v a p a u t t a m i s t a v o i t e + v a p a u t t a m i s t e o r i a n + v a p a u t t a m i s t e o r i o i h i n + v a p a u t t a m i s t o i m e n + v a p a u t t a m i s t o i m e n p i d e + v a p a u t t a m i s t o i m e n p i t e e s e e n + v a p a u t t a m i s t o i m e n p i t e e t + v a p a u t t a m i s t o i m e n p i t e i d e n + v a p a u t t a m i s t o i m e n p i t e i t ä + v a p a u t t a m i s t o i m e s t a + v a p a u t t a m i s t o i m e t + v a p a u t t a m i s t o i m i a + v a p a u t t a m i s t o i m i e n + v a p a u t t a m i s t o i m i l l a + v a p a u t t a m i s t o i m i s s a a n + v a p a u t t a m i s v a a t i m u k s e t + v a p a u t t a m i s v a a t i m u k s i a + v a p a u t t a m i s v a a t i m u k s i i n + v a p a u t t a m i s v a i h e e s t a + v a p a u t t a m i s v a i h t o e h t o j a + v a p a u t t a m i s v e l v o i t t e i d e n + v a p a u t t a m i s v i m m a n + v a p a u t t a n e e t + v a p a u t t a n u t t a + v a p a u t t a v a m p a a + v a p a u t t a v a t + v a p a u t t a v a t k o + v a p a u t t a v i a + v a p a u t t a v i n e + v a p a u t t a v i s t a + v a p a u t t i + v a p a u t u a k s e e n + v a p a u t u k a a m m e + v a p a u t u k s e e n + v a p a u t u k s e n + v a p a u t u k s i a + v a p a u t u k s i i n + v a p a u t u m a a n + v a p a u t u m a s s a + v a p a u t u m i s e e n + v a p a u t u m i s e e n s a + v a p a u t u m i s e n + v a p a u t u m i s e s t a + v a p a u t u m i s k e h i t y k s e n + v a p a u t u m i s k e h i t y s + v a p a u t u m i s m a h d o l l i s u u t t a + v a p a u t u m i s p r o s e s s i + v a p a u t u m i s p r o s e s s i s s a + v a p a u t u n e e n + v a p a u t u n e e t + v a p a u t u n e i s s a + v a p a u t u s a r m e i j a + v a p a u t u s a r m e i j a a + v a p a u t u s a r m e i j a l l e + v a p a u t u s a r m e i j a n + v a p a u t u s a s e t u k s i s t a + v a p a u t u s j o u k k o j a + v a p a u t u s j ä r j e s t e l m ä + v a p a u t u s j ä r j e s t e l m ä n + v a p a u t u s j ä r j e s t e l y n + v a p a u t u s j ä r j e s t ö + v a p a u t u s j ä r j e s t ö n + v a p a u t u s j ä r j e s t ö s t ä + v a p a u t u s k i r j a + v a p a u t u s l i i k e + v a p a u t u s l i i k e t t ä + v a p a u t u s l i i k k e e l l e + v a p a u t u s l i i k k e e n + v a p a u t u s l i i k k e e s e e n + v a p a u t u s l i i k k e i d e n + v a p a u t u s l i i k k e i l l e + v a p a u t u s l i i k k e i s s ä + v a p a u t u s l i i k k e i t ä + v a p a u t u s m a h d o l l i s u u s + v a p a u t u s m a h d o l l i s u u t t a + v a p a u t u s m e k a n i s m i + v a p a u t u s m e k a n i s m i a + v a p a u t u s m e n e t e l m i ä + v a p a u t u s m e n e t t e l y ä + v a p a u t u s m ä ä r ä y k s e n + v a p a u t u s p a k e t i n + v a p a u t u s p a k e t t i a + v a p a u t u s p e r u s t e i d e n + v a p a u t u s p r o s e s s i a + v a p a u t u s p r o s e s s i i n + v a p a u t u s p y y n t ö j e n + v a p a u t u s p ä i v ä ä + v a p a u t u s r i n t a m a + v a p a u t u s r i n t a m a n + v a p a u t u s s o t a + v a p a u t u s t a + v a p a u t u s t a i s t e l i j o i t a + v a p a u t u s t e n + v a p a u t u s v e l j i n ä ä n + v a p a u t u u + v a p a u t u u k o + v a p a u t u v a s t a + v a p p u n a + v a p u n p ä i v ä n + v a p u n p ä i v ä n ä + v a r a a m a a n + v a r a a m i s e k s i + v a r a a m m e + v a r a a v a t + v a r a e d u s t a j a t + v a r a e l ä k e r a h a s t o n + v a r a e s i t t e l i j ä n ä + v a r a i k k u n a + v a r a i n h a l l i n n a s t a + v a r a i n h a l l i n n o l l e + v a r a i n h a l l i n t a y h t i ö + v a r a i n h a n k i n n a s s a + v a r a i n h a n k i n t a m a h d o l l i s u u k s i a + v a r a i n h a n k i n t a r a h a s t o k s i + v a r a i n h a n k i n t a s ä ä n t ö j ä + v a r a i n h o i d o l l e + v a r a i n h o i d o n + v a r a i n h o i d o n v a l v o j a + v a r a i n h o i d o n v a l v o n n a l l e + v a r a i n h o i d o n v a l v o n n a n + v a r a i n h o i d o n v a l v o n n a s s a + v a r a i n h o i d o n v a l v o n n a s t a + v a r a i n h o i d o n v a l v o n t a + v a r a i n h o i d o n v a l v o n t a a + v a r a i n h o i d o s s a + v a r a i n h o i d o s t a + v a r a i n h o i t a j a t + v a r a i n h o i t o + v a r a i n h o i t o a + v a r a i n h o i t o a a n + v a r a i n h o i t o a s e t u k s e e n + v a r a i n h o i t o a s e t u k s e k s i + v a r a i n h o i t o a s e t u k s e l l a + v a r a i n h o i t o a s e t u k s e l l e + v a r a i n h o i t o a s e t u k s e n + v a r a i n h o i t o a s e t u k s e n s a + v a r a i n h o i t o a s e t u k s e s s a + v a r a i n h o i t o a s e t u k s e s s a k i n + v a r a i n h o i t o a s e t u k s e s t a + v a r a i n h o i t o a s e t u k s e t + v a r a i n h o i t o a s e t u k s i a + v a r a i n h o i t o a s e t u k s i i n + v a r a i n h o i t o a s e t u k s i s s a + v a r a i n h o i t o a s e t u s + v a r a i n h o i t o a s e t u s e s i t y k s e n s ä + v a r a i n h o i t o a s e t u s h a n k k e e s e e n + v a r a i n h o i t o a s e t u s t a + v a r a i n h o i t o a s e t u s t e n + v a r a i n h o i t o i l m o i t u k s e n + v a r a i n h o i t o j ä r j e s t e l m ä n + v a r a i n h o i t o k a u d e l l a + v a r a i n h o i t o k a u d e n + v a r a i n h o i t o k a u t t a + v a r a i n h o i t o k e h y s t ä + v a r a i n h o i t o k o m i t e a s s a + v a r a i n h o i t o k u l t t u u r i a + v a r a i n h o i t o k ä y t ä n t ö j ä + v a r a i n h o i t o l a k e i n e e n + v a r a i n h o i t o m e n e t t e l y j e n + v a r a i n h o i t o m e n e t t e l y y n + v a r a i n h o i t o m m e + v a r a i n h o i t o m ä ä r ä y k s i s t ä + v a r a i n h o i t o m ä ä r ä y k s i ä + v a r a i n h o i t o o n + v a r a i n h o i t o p r o s e s s e j a + v a r a i n h o i t o r a k e n t e e n + v a r a i n h o i t o s ä ä n n ö k s e t + v a r a i n h o i t o s ä ä n n ö k s i ä + v a r a i n h o i t o s ä ä n n ö s t e n + v a r a i n h o i t o s ä ä n n ö t + v a r a i n h o i t o s ä ä n t ö j e n + v a r a i n h o i t o s ä ä n t ö j ä + v a r a i n h o i t o t a r k o i t u k s i i n + v a r a i n h o i t o t e h t ä v ä t + v a r a i n h o i t o t o i m i n n a s t a + v a r a i n h o i t o u u d i s t u k s e e n + v a r a i n h o i t o u u d i s t u k s e n + v a r a i n h o i t o v a i k e u k s i a + v a r a i n h o i t o v e l v o i t t e i d e n + v a r a i n h o i t o v i r k a m i e h e t + v a r a i n h o i t o v u o d e k s i + v a r a i n h o i t o v u o d e l l a + v a r a i n h o i t o v u o d e l l e + v a r a i n h o i t o v u o d e l t a + v a r a i n h o i t o v u o d e n + v a r a i n h o i t o v u o d e s t a + v a r a i n h o i t o v u o d e t + v a r a i n h o i t o v u o n n a + v a r a i n h o i t o v u o s i + v a r a i n h o i t o v u o s i a + v a r a i n h o i t o v u o s i e n + v a r a i n h o i t o v u o s i h a n + v a r a i n h o i t o v u o s i n a + v a r a i n h o i t o v u o s i s t a + v a r a i n h o i t o v u o t e e n + v a r a i n h o i t o v u o t e n a + v a r a i n h o i t o v u o t t a + v a r a i n h o i t o v ä l i n e + v a r a i n h o i t o y r i t y k s e t + v a r a i n h o i t o y r i t y k s i i n + v a r a i n k e r u u k a m p a n j o i l l e + v a r a i n k e r u u t a + v a r a i n k ä y t t ö + v a r a i n k ä y t t ö o h j e l m i s t a + v a r a i n k ä y t ö l l e + v a r a i n k ä y t ö n + v a r a i n k ä y t ö s t ä + v a r a i n m e t s ä s t y k s e e n + v a r a i n s i i r r o i s t a + v a r a i n s i i r r o s s a + v a r a i n s i i r t o a + v a r a i n s i i r t o i h i n + v a r a i n s i i r t o j a + v a r a i n s i i r t o j e n + v a r a i n s i i r t o t i e t o j e n + v a r a i n s i i r t o v e r o + v a r a j o h t a j a + v a r a j o h t a j a n + v a r a j ä r j e s t e l m i n ä + v a r a j ä r j e s t e l m i ä + v a r a j ä r j e s t e l m ä t + v a r a j ä s e n + v a r a j ä s e n e n ä + v a r a j ä s e n i s t ä + v a r a j ä s e n i ä + v a r a j ä s e n t e n + v a r a j ä s e n t ä + v a r a k a n s l e r i + v a r a k a n s l e r i a + v a r a k a n s l e r i l l e + v a r a k a n s l e r i m m e + v a r a k a p a s i t e e t i n + v a r a k a p a s i t e e t t i a + v a r a k a p a s i t e e t t i i n + v a r a k a u p p a m i n i s t e r i n + v a r a k a u p u n g i n j o h t a j i a + v a r a k k a a l t a + v a r a k k a a m m i l t a + v a r a k k a a m m i s s a + v a r a k k a a m p i a + v a r a k k a a m p i i n + v a r a k k a i l l e + v a r a k k a i m m i l l a + v a r a k k a i m m i l l e + v a r a k k a i m m i s t a + v a r a k k a i t a + v a r a k k u u d e n + v a r a k o o r d i n a a t t o r i n a + v a r a k o r t t i a + v a r a k u l j e t t a j a t + v a r a k u v e r n ö ö r i + v a r a l a i n s ä ä d ä n t ö + v a r a l e n t o k o n e t t a + v a r a l i i t t o k a n s l e r i + v a r a l l a o l o a + v a r a l l a o l o a i k o i h i n + v a r a l l a o l o a j a n + v a r a l l a o l o j a k s o j e n + v a r a l l a o l o l i s t a l l e + v a r a l l a o l o l u e t t e l o a + v a r a l l a o l o l u e t t e l o i t a + v a r a l l a o l o l u e t t e l o n + v a r a l l a o l o l u e t t e l o o n + v a r a l l a o l o n + v a r a l l i s u u d e n + v a r a l l i s u u d e s t a a n + v a r a l l i s u u s e r o + v a r a l l i s u u s e r o i s t a + v a r a l l i s u u s e r o j a + v a r a l l i s u u s h i n n a t + v a r a l l i s u u s h i n t o j e n + v a r a l l i s u u s i n f l a a t i o l l a + v a r a l l i s u u s l u o k k i a + v a r a l l i s u u s p o l i t i i k a n + v a r a l l i s u u s r a h a s t o t + v a r a l l i s u u s t a s o + v a r a l l i s u u s t i l a n t e e n + v a r a l l i s u u s v e r o + v a r a l l i s u u s v e r o a + v a r a l l i s u u t e e n + v a r a l l i s u u t t a + v a r a l l i s u u t t a a n + v a r a m a r k k i n o i t a + v a r a m i n i s t e r e i t ä + v a r a m i n i s t e r i + v a r a m i n i s t e r i e n + v a r a m i n i s t e r i n + v a r a n h o i t o a s e t u k s e s s a + v a r a n h o i t o a s e t u s t a + v a r a n h o i t o o n + v a r a n h o i t o v u o d e n + v a r a n h o i t o v u o n n a + v a r a n n o i s t a + v a r a n n o s t a + v a r a n n o t + v a r a n n u t + v a r a n t o a + v a r a n t o j a + v a r a n t o j e n + v a r a n t o m a r k k i n o i l l e + v a r a n t o s a a m i s e t + v a r a n t o s a a m i s t e n + v a r a n t o t a s o + v a r a n t o v a l u u t o i s t a + v a r a n t o v a l u u t t a + v a r a n t o v a l u u t t a a + v a r a n t o v a l u u t t a n a + v a r a n t o y l i j ä ä m ä t + v a r a o i k e u s m i n i s t e r i + v a r a o s a + v a r a o s a k a u p p a a n + v a r a o s a m a l l i e n + v a r a o s a m a r k k i n a t + v a r a o s a m a r k k i n o i d e n + v a r a o s a m a r k k i n o i s t a + v a r a o s a m a r k k i n o i t a + v a r a o s a m y y j ä n s ä + v a r a o s a m y y j ä n ä + v a r a o s a n + v a r a o s a n v a l m i s t a j i l l e + v a r a o s a o n g e l m a a + v a r a o s a s t a + v a r a o s a t + v a r a o s a t e h t a i t a + v a r a o s a t e o l l i s u u t e e n + v a r a o s a t u o t a n n o s t a + v a r a o s a v a l m i s t a j a t + v a r a o s a v a l m i s t a j i e n + v a r a o s a v a r a s t o + v a r a o s a v a r a s t o a + v a r a o s a v a r a s t o n a + v a r a o s i a + v a r a o s i a a n + v a r a o s i e n + v a r a o s i e n s a + v a r a o s i i n + v a r a o s i k s i + v a r a o s i l l e + v a r a o s i n a + v a r a o s i s s a + v a r a o s i s t a + v a r a p l a n e e t t a a + v a r a p o r m e s t a r i n a + v a r a p r e s i d e n t i k s i + v a r a p r e s i d e n t i l l e + v a r a p r e s i d e n t i l t ä + v a r a p r e s i d e n t i n + v a r a p r e s i d e n t t i + v a r a p r e s i d e n t t i n ä + v a r a p r e s i d e n t t i ä + v a r a p u h e e n j o h t a j a + v a r a p u h e e n j o h t a j a a + v a r a p u h e e n j o h t a j a a m m e + v a r a p u h e e n j o h t a j a a n + v a r a p u h e e n j o h t a j a a n i + v a r a p u h e e n j o h t a j a e h d o k a s + v a r a p u h e e n j o h t a j a e h d o k k a a k s i + v a r a p u h e e n j o h t a j a e h d o k k a a l l e + v a r a p u h e e n j o h t a j a k i n + v a r a p u h e e n j o h t a j a k s i + v a r a p u h e e n j o h t a j a l l a + v a r a p u h e e n j o h t a j a l l a n n e + v a r a p u h e e n j o h t a j a l l e + v a r a p u h e e n j o h t a j a l l e n n e + v a r a p u h e e n j o h t a j a l t a + v a r a p u h e e n j o h t a j a n + v a r a p u h e e n j o h t a j a n a + v a r a p u h e e n j o h t a j a n n e + v a r a p u h e e n j o h t a j a n s a + v a r a p u h e e n j o h t a j a s t a + v a r a p u h e e n j o h t a j a t + v a r a p u h e e n j o h t a j i a + v a r a p u h e e n j o h t a j i a a n + v a r a p u h e e n j o h t a j i e n + v a r a p u h e e n j o h t a j i k s i + v a r a p u h e e n j o h t a j i l l e + v a r a p u h e e n j o h t a j i n a + v a r a p u h e e n j o h t a j i n e e n + v a r a p u h e e n j o h t a j i s t a + v a r a p u h e e n j o h t a j i s t a a n + v a r a p u h e e n j o h t a j i s t a n n e + v a r a p u h e e n j o h t a j u u s + v a r a p u h e m i e h e e n + v a r a p u h e m i e h e k s i + v a r a p u h e m i e h e l l e + v a r a p u h e m i e h e l t ä + v a r a p u h e m i e h e m m e + v a r a p u h e m i e h e n + v a r a p u h e m i e h e n ä + v a r a p u h e m i e h e s t ä + v a r a p u h e m i e h e t + v a r a p u h e m i e h i i n + v a r a p u h e m i e h i k s i + v a r a p u h e m i e h i n ä + v a r a p u h e m i e h i s t ä + v a r a p u h e m i e h i s t ä m m e + v a r a p u h e m i e h i ä + v a r a p u h e m i e h i ä ä n + v a r a p u h e m i e s + v a r a p u h e m i e s e h d o k k a i t a + v a r a p u h e m i e s t e n + v a r a p u h e m i e s t ä + v a r a p u h e m i e s t ä m m e + v a r a p u o l u s t u s m i n i s t e r i + v a r a p ä ä j o h t a j a + v a r a p ä ä j o h t a j a a + v a r a p ä ä j o h t a j a e h d o k a s + v a r a p ä ä l l i k k ö + v a r a p ä ä m i n i s t e r i + v a r a p ä ä m i n i s t e r i k s i + v a r a p ä ä m i n i s t e r i l l e + v a r a p ä ä m i n i s t e r i l l e n i + v a r a p ä ä m i n i s t e r i m m e + v a r a p ä ä m i n i s t e r i n + v a r a p ä ä m i n i s t e r i n ä + v a r a p ä ä m i n i s t e r i ä + v a r a p ä ä s i h t e e r i + v a r a p ä ä s i h t e e r i n + v a r a p ä ä s i h t e e r i n ä + v a r a p ä ä t o i m i t t a j a + v a r a r a h a s t o + v a r a r a h a s t o a + v a r a r a h a s t o j a + v a r a r a h a s t o n + v a r a r a h a s t o o n + v a r a r a h a s t o s t a + v a r a r a h a s t o t + v a r a r a h o i t u s j ä r j e s t e l m ä + v a r a r a t k a i s u + v a r a r e h t o r i + v a r a r e n g a s + v a r a r e n k a a n + v a r a r e n k a a n a + v a r a r e n k a i d e n + v a r a r e n k a i s t a + v a r a r i k k o o n + v a r a r i k o s s a + v a r a s i s ä m i n i s t e r i + v a r a s l ä h t ö + v a r a s l ä h t ö i h i n + v a r a s l ä h t ö j e n + v a r a s l ä h t ö ä + v a r a s t a a + v a r a s t e l e m a a n + v a r a s t e t t u j a + v a r a s t e t u i s t a + v a r a s t e t u n + v a r a s t i + v a r a s t o e r i e n + v a r a s t o i d a + v a r a s t o i d a a n + v a r a s t o i h i n + v a r a s t o i l l e + v a r a s t o i m a t t a + v a r a s t o i m i s t a + v a r a s t o i n f r a s t r u k t u u r i t + v a r a s t o i n n i s s a + v a r a s t o i n n i s t a + v a r a s t o i n n i s t a k i n + v a r a s t o i n t i a + v a r a s t o i n t i a i k a + v a r a s t o i n t i a j a t + v a r a s t o i n t i a l u e + v a r a s t o i n t i a l u e e n a + v a r a s t o i n t i e l i m i s t ä + v a r a s t o i n t i h a n k e t t a + v a r a s t o i n t i h a n k k e e t + v a r a s t o i n t i i n + v a r a s t o i n t i j a k s o + v a r a s t o i n t i j ä r j e s t e l m i s s ä + v a r a s t o i n t i j ä r j e s t e l m ä n + v a r a s t o i n t i j ä r j e s t e l m ä ä + v a r a s t o i n t i k a n n u s t i m e k s i + v a r a s t o i n t i k a p a s i t e e t i n + v a r a s t o i n t i k a p a s i t e e t t i + v a r a s t o i n t i k a p a s i t e e t t i a + v a r a s t o i n t i k e s k u k s i s t a + v a r a s t o i n t i k u l u t + v a r a s t o i n t i k u s t a n n u k s e t + v a r a s t o i n t i k u s t a n n u k s i a + v a r a s t o i n t i k u s t a n n u k s i s t a + v a r a s t o i n t i k u s t a n n u s t e n + v a r a s t o i n t i k y k y y n + v a r a s t o i n t i k y k y ä + v a r a s t o i n t i k y s y m y k s e e n + v a r a s t o i n t i l a i t o k s e e n + v a r a s t o i n t i l a i t o k s e n + v a r a s t o i n t i l a i t o k s e t + v a r a s t o i n t i l a i t o k s i i m m e + v a r a s t o i n t i l a i t o k s i i n + v a r a s t o i n t i l a i t o k s i s s a + v a r a s t o i n t i l a i t o s t e n + v a r a s t o i n t i l a i t t e i s i i n + v a r a s t o i n t i l a i t t e i s t o + v a r a s t o i n t i l a i t t e i s t o i s t a + v a r a s t o i n t i l a i t t e i s t o j e n + v a r a s t o i n t i m a h d o l l i s u u d e t + v a r a s t o i n t i m a h d o l l i s u u k s i e n + v a r a s t o i n t i m a k s u + v a r a s t o i n t i m a k s u j ä r j e s t e l m ä n + v a r a s t o i n t i m a k s u n + v a r a s t o i n t i m e n e t e l m ä ä n + v a r a s t o i n t i o n g e l m a + v a r a s t o i n t i p a i k k a + v a r a s t o i n t i p a i k k a a + v a r a s t o i n t i p a i k k a n a + v a r a s t o i n t i p a i k k o j a + v a r a s t o i n t i p o l i t i i k a s t a + v a r a s t o i n t i p o l i t i i k k a a + v a r a s t o i n t i t a p o j a + v a r a s t o i n t i t e k n i i k a n + v a r a s t o i n t i t e k n i i k k a + v a r a s t o i n t i t e k n o l o g i a l l e + v a r a s t o i n t i t e k n o l o g i a n + v a r a s t o i n t i t e k n o l o g i o i t a + v a r a s t o i n t i t i l o i h i n + v a r a s t o i n t i t i l o i s t a + v a r a s t o i n t i t i l o j e n + v a r a s t o i n t i t o i m e n p i t e e t + v a r a s t o i n t i t u e n + v a r a s t o i n t i t u k i a + v a r a s t o i n t i v a i h t o e h d o i s t a + v a r a s t o i n t i v a l m i u d e t + v a r a s t o i n t i v a l m i u k s i e n + v a r a s t o i n t i v a l m i u k s i e n s a + v a r a s t o i n t i v a l m i u k s i i n + v a r a s t o i n t i v e l v o i t e + v a r a s t o i s s a + v a r a s t o i t a v a + v a r a s t o i t a v i k s i + v a r a s t o j a + v a r a s t o j e n + v a r a s t o k a a p i s t a + v a r a s t o k i r j a n p i t o a + v a r a s t o n h a l l i n t a + v a r a s t o r e p e ä m i n e n + v a r a s t o s s a + v a r a s t o s ä i l i ö t + v a r a s t o t + v a r a s t o t a s o s t a + v a r a s t o t i l a t + v a r a s t o t i l e j ä + v a r a s t o t i l o j a + v a r a s t o t y ö n t e k i j ö i s t ä + v a r a s u u n n i t e l m a + v a r a s u u n n i t e l m a a + v a r a s u u n n i t e l m a a n + v a r a s u u n n i t e l m a n + v a r a s u u n n i t e l m a n n e + v a r a s u u n n i t e l m a t + v a r a s u u n n i t e l m i a + v a r a s u u r l ä h e t t i l ä i t ä + v a r a t + v a r a t a + v a r a t a a n + v a r a t a l o u s a r v i o + v a r a t e r v e y s m i n i s t e r i + v a r a t e r v e y s m i n i s t e r i ä + v a r a t h a n + v a r a t k i n + v a r a t o i m e n p i t e i d e n + v a r a t o i m i t u s j o h t a j a + v a r a t o i m i t u s j o h t a j a n a + v a r a t o i m i t u s j o h t a j a s t a + v a r a t t a i s i i n + v a r a t t a v a + v a r a t t i i n + v a r a t t o m i m p i e n + v a r a t t u i h i n + v a r a t t u j a + v a r a t t u j e n + v a r a t t u u n + v a r a t u i s t a + v a r a t u n + v a r a t u t + v a r a u d u t t a i s i i n + v a r a u d u t t a v a + v a r a u k s e e n + v a r a u k s e l l a + v a r a u k s e l l e e n + v a r a u k s e l l i s e m m i n + v a r a u k s e l l i s e m p i + v a r a u k s e l l i s i a + v a r a u k s e m m e + v a r a u k s e n + v a r a u k s e s s a + v a r a u k s e s t a + v a r a u k s e t + v a r a u k s e t o n t a + v a r a u k s e t t a + v a r a u k s i a + v a r a u k s i e n + v a r a u k s i i n + v a r a u k s i n + v a r a u k s i s t a + v a r a u k s i s t a n i + v a r a u k s i t t a + v a r a u l k o a s i a i n m i n i s t e r i n + v a r a u l k o m i n i s t e r i + v a r a u l k o m i n i s t e r i m m e + v a r a u l k o m i n i s t e r i n + v a r a u l k o m i n i s t e r i n n e + v a r a u l k o m i n i s t e r i n ä + v a r a u l k o m i n i s t e r i ä + v a r a u l o s k ä y n n i t + v a r a u l o s k ä y n t i e n + v a r a u l o s k ä y n t i k y l t t e j ä + v a r a u l o s k ä y t ä v i ä + v a r a u m a l a u s e k e + v a r a u m a l a u s e k k e e n + v a r a u m a n + v a r a u m i a + v a r a u s e h d o t u s + v a r a u s j ä r j e s t e l m i e n + v a r a u s j ä r j e s t e l m i i n + v a r a u s j ä r j e s t e l m i l l e + v a r a u s j ä r j e s t e l m i s t ä + v a r a u s j ä r j e s t e l m i ä + v a r a u s j ä r j e s t e l m i ä ä n + v a r a u s j ä r j e s t e l m ä n + v a r a u s j ä r j e s t e l m ä s s ä + v a r a u s j ä r j e s t e l m ä s t ä + v a r a u s j ä r j e s t e l m ä t + v a r a u s j ä r j e s t e l m ä ä + v a r a u s j ä r j e s t e l m ä ä n + v a r a u s k e s k u k s i s s a + v a r a u s m a k s u t + v a r a u s r a h a s t o n + v a r a u s s i v u t + v a r a u s s o p i m u s t e n + v a r a u s t a + v a r a u s t e n + v a r a u s t i e t o j a + v a r a u s t i e t o k a n n o i s s a + v a r a u s t i h e y s + v a r a u s t i l a i s u u s + v a r a u s v a i h t o e h t o + v a r a u t u a + v a r a u t u a k s e m m e + v a r a u t u m i s e n + v a r a u t u m i s p e r i a a t e t t a + v a r a u t u m i s s u u n n i t e l m a + v a r a u t u m i s s u u n n i t e l m a n + v a r a u t u m i s s u u n n i t e l m a s s a + v a r a u t u m i s s u u n n i t e l m i a + v a r a u t u m i s s u u n n i t e l m i e n + v a r a u t u m i s s u u n n i t e l m i s t a + v a r a u t u m i s t a + v a r a u t u m i s t o i m e n p i t e e n ä + v a r a u t u m i s v ä l i n e e n ä + v a r a u t u n e e m m i n + v a r a u t u n e e m p i + v a r a u t u n e e m p i a + v a r a u t u n e e t + v a r a u t u n e i s u u d e s t a a n + v a r a u t u n e i t a + v a r a v a l t i o v a r a i n m i n i s t e r e j ä + v a r a v a r a s t o s t a + v a r a v e n t t i i l i + v a r a v e n t t i i l i m m e + v a r a v e n t t i i l i n + v a r a v e n t t i i l i n ä + v a r a v i r r a n + v a r a v i r t a a + v a r a v i r t a l ä h d e + v a r a v i r t a l ä h t e e t + v a r a v i r t a y k s i k ö i l l ä + v a r a v o i m a + v a r a v o i m a l a i t t e i s t o s t a + v a r a y m p ä r i s t ö m i n i s t e r i + v a r h a i s d i a g n o o s e j a + v a r h a i s e e n + v a r h a i s e l l a + v a r h a i s e l ä k e + v a r h a i s e l ä k e i ä n + v a r h a i s e l ä k e j ä r j e s t e l m i e n + v a r h a i s e l ä k e j ä r j e s t e l m i ä + v a r h a i s e l ä k e j ä r j e s t e l m ä + v a r h a i s e l ä k e j ä r j e s t e l m ä k s i + v a r h a i s e l ä k e j ä r j e s t e l m ä n + v a r h a i s e l ä k e j ä r j e s t e l m ä s t ä + v a r h a i s e l ä k e j ä r j e s t e l m ä s u u n n i t e l m a n + v a r h a i s e l ä k e j ä r j e s t e l m ä t + v a r h a i s e l ä k e j ä r j e s t e l m ä ä + v a r h a i s e l ä k e j ä r j e s t e l m ä ä n + v a r h a i s e l ä k e j ä r j e s t e l y + v a r h a i s e l ä k e j ä r j e s t e l y i h i n + v a r h a i s e l ä k e j ä r j e s t e l y j e n + v a r h a i s e l ä k e o h j e l m a n + v a r h a i s e l ä k e p a k e t i s t a + v a r h a i s e l ä k e p o l i t i i k k a a n s a + v a r h a i s e l ä k e s u u n n i t e l m a s t a + v a r h a i s e l ä k e t t ä + v a r h a i s e l ä k e t u k e a + v a r h a i s e l ä k k e e l l e + v a r h a i s e l ä k k e e l l ä + v a r h a i s e l ä k k e e n + v a r h a i s e l ä k k e e n ä + v a r h a i s e l ä k k e e s e e n + v a r h a i s e l ä k k e e s t ä + v a r h a i s e l ä k k e e t + v a r h a i s e l ä k k e i d e n + v a r h a i s e l ä k k e i s i i n + v a r h a i s e l ä k k e i s t ä + v a r h a i s e l ä k k e i t ä + v a r h a i s e m p a a n + v a r h a i s e n + v a r h a i s e s s a + v a r h a i s e s t a + v a r h a i s h i s t o r i a + v a r h a i s i n a + v a r h a i s j u r a k a u s i + v a r h a i s k a s v a t u k s e e n + v a r h a i s k a s v a t u k s e l l a + v a r h a i s k a s v a t u k s e n + v a r h a i s k a s v a t u k s e s s a + v a r h a i s k a s v a t u k s e s t a + v a r h a i s k a s v a t u s + v a r h a i s k a s v a t u s k e s k u k s e t + v a r h a i s k a s v a t u s o h j e l m i a + v a r h a i s k a s v a t u s o h j e l m i i n + v a r h a i s k a s v a t u s p a l v e l u i h i n + v a r h a i s k a s v a t u s p a l v e l u j a + v a r h a i s k a s v a t u s p a l v e l u j e n + v a r h a i s k a s v a t u s p r o s e s s i + v a r h a i s k a s v a t u s t a + v a r h a i s k a u d e l l a + v a r h a i s k o u l u t u s + v a r h a i s k o u l u t u s t a + v a r h a i s k r i s t i l l i n e n + v a r h a i s l a p s u u d e n + v a r h a i s l a p s u u d e s s a + v a r h a i s l a p s u u d e s t a + v a r h a i s l a p s u u s + v a r h a i s l a p s u u t e e n + v a r h a i s l a p s u u t t a + v a r h a i s l a t i n a + v a r h a i s l i i t u k a u s i + v a r h a i s n u o r u u d e s s a + v a r h a i s o p e t u k s e s t a + v a r h a i s o p p i m i n e n + v a r h a i s o p p i m i s e e n + v a r h a i s o p p i m i s e n + v a r h a i s o p p i m i s e s s a + v a r h a i s o p p i m i s e s t a + v a r h a i s o p p i m i s t a + v a r h a i s t a + v a r h a i s t o t e a m i n e n + v a r h a i s t o t e a m i s e n + v a r h a i s t o t e a m i s t a + v a r h a i s t r i a s k a u s i + v a r h a i s v a i h e e n + v a r h a i s v a i h e e s s a + v a r h a i s v a i h e i s s a + v a r h a i s v a i h e i t a + v a r h a i s v a r o i t u k s e e n + v a r h a i s v a r o i t u k s e n + v a r h a i s v a r o i t u k s e n a + v a r h a i s v a r o i t u s d i p l o m a t i a k s i + v a r h a i s v a r o i t u s j ä r j e s t e l m i e n + v a r h a i s v a r o i t u s j ä r j e s t e l m i s t ä + v a r h a i s v a r o i t u s j ä r j e s t e l m i ä + v a r h a i s v a r o i t u s j ä r j e s t e l m ä + v a r h a i s v a r o i t u s j ä r j e s t e l m ä l l ä + v a r h a i s v a r o i t u s j ä r j e s t e l m ä n + v a r h a i s v a r o i t u s j ä r j e s t e l m ä n ä + v a r h a i s v a r o i t u s j ä r j e s t e l m ä s s ä + v a r h a i s v a r o i t u s j ä r j e s t e l m ä s t ä + v a r h a i s v a r o i t u s j ä r j e s t e l m ä t + v a r h a i s v a r o i t u s j ä r j e s t e l m ä ä + v a r h a i s v a r o i t u s m e k a n i s m i + v a r h a i s v a r o i t u s m e k a n i s m i n + v a r h a i s v a r o i t u s m e k a n i s m i t + v a r h a i s v a r o i t u s t a + v a r h a i s v a r o i t u s v ä l i n e e n + v a r h a i s v a r o i t u s y k s i k k ö + v a r h a i s v a r o i t u s y k s i k k ö ö n + v a r h a i s v a r o i t u s y k s i k ö n + v a r h a i s v a r o i t u s y k s i k ö s s ä + v a r h a i s v u o d e t + v a r h a i s v u o s i n a + v a r h e n n e t t u u n + v a r h e n n e t u l l e + v a r i a a t i o k e r r o i n + v a r i a a t i o l a s k e n t a + v a r i a a t i o p e r i a a t e + v a r i a n t t i a + v a r i k s e n m a r j a + v a r i s k o t i n g a + v a r i s p a r v e s t a + v a r j a g i k a a r t i + v a r j e l e m i s e k s i + v a r j e l e m i s e s t a + v a r j e l k o o n + v a r j e l l a + v a r j e l l a a n + v a r j e l l a k s e m m e + v a r j e l l u i s t a + v a r j e l t a v a + v a r j o a i n e + v a r j o a l u e i t a + v a r j o a n k k a + v a r j o a s e t u s + v a r j o b u d j e t e i s t a + v a r j o b u d j e t t e j a + v a r j o b y r o k r a t i a a + v a r j o e s i t t e l i j ä + v a r j o e s i t t e l i j ä h ä n + v a r j o e s i t t e l i j ä k o l l e g o j a n i + v a r j o e s i t t e l i j ä k s i + v a r j o e s i t t e l i j ä l l e + v a r j o e s i t t e l i j ä l l e e n + v a r j o e s i t t e l i j ä l l e m m e + v a r j o e s i t t e l i j ä l l e n i + v a r j o e s i t t e l i j ä m m e + v a r j o e s i t t e l i j ä n + v a r j o e s i t t e l i j ä n i + v a r j o e s i t t e l i j ä n s ä + v a r j o e s i t t e l i j ä n ä + v a r j o e s i t t e l i j ä t + v a r j o e s i t t e l i j ä t k i n + v a r j o e s i t t e l i j ä ä + v a r j o e s i t t e l i j ä ä m m e + v a r j o e s i t t e l i j ä ä n i + v a r j o e s i t t e l i j ä ä n s ä + v a r j o e s i t t e l i j ö i d e m m e + v a r j o e s i t t e l i j ö i d e n + v a r j o e s i t t e l i j ö i d e n i + v a r j o e s i t t e l i j ö i d e n s ä + v a r j o e s i t t e l i j ö i h i n + v a r j o e s i t t e l i j ö i l l e + v a r j o e s i t t e l i j ö i l l e e n + v a r j o e s i t t e l i j ö i l t ä + v a r j o e s i t t e l i j ö i n ä + v a r j o e s i t t e l i j ö i n ä n i + v a r j o e s i t t e l i j ö i s t ä + v a r j o e s i t t e l i j ö i t t e n i + v a r j o e s i t t e l i j ö i t ä + v a r j o e s i t t e l i j ö i t ä n i + v a r j o e s i t t e l i j ö i t ä ä n + v a r j o h a l l i t u s + v a r j o i h m i s e t + v a r j o i s s a + v a r j o j e n + v a r j o j u l i s t u s + v a r j o k a b i n e t i n + v a r j o k i s s a + v a r j o k o m i s s i o + v a r j o l e h t o l u s t e + v a r j o l i l j a + v a r j o m i e t i n t ö + v a r j o m i n i s t e r i + v a r j o m i n i s t e r i n + v a r j o m u r a t t i + v a r j o m u s t e s i e n i + v a r j o n + v a r j o n s a + v a r j o n u k k e t e a t t e r i n + v a r j o n y r k k e i l y + v a r j o n y r k k e i l y l l e + v a r j o n y r k k e i l y y n + v a r j o n y r k k e i l y ä + v a r j o o n s a + v a r j o p a n k k e j a + v a r j o p a n k k i a s i a s s a + v a r j o p a n k k i t o i m i n t a + v a r j o p a r l a m e n t i k s i + v a r j o p u o l e n s a + v a r j o p u o l e s t a + v a r j o p u o l i a + v a r j o r a p o r t o i j i a + v a r j o s o p i m u k s i l l a + v a r j o s t a a + v a r j o s t a n e e t + v a r j o t a l o u d e n + v a r j o t a l o u s + v a r j o t a l o u s a r v i o t + v a r j o t a l o u t e e n + v a r j o t a p a k u l o + v a r j o t e a t t e r i a + v a r j o t i e m a k s u j a + v a r j o t ä p l ä k o i + v a r j o u l k o m i n i s t e r i + v a r j o v a l m i s t e l i j a n a + v a r j o v a l m i s t e l i j a t + v a r j o v a l t i o + v a r j o v a l t i o t a + v a r j o v i i k u n a + v a r j o y r t t i + v a r k a i d e n + v a r k a i l t a + v a r k a u k s i a + v a r k a u t t a + v a r m a a + v a r m a n a + v a r m a o t t e i s e s t i + v a r m a s t i k a a n + v a r m a s t i k i n + v a r m e m m a k s i + v a r m e m m a l l a + v a r m e m m a l l e + v a r m e m m a n + v a r m e m m a t + v a r m e m m i k s i + v a r m e m m i n + v a r m e m p a a + v a r m e m p a a n + v a r m e m p i + v a r m e m p i a + v a r m e m p i e n + v a r m e m p i i n + v a r m e n n e p a l v e l u i d e n + v a r m e n n e p a l v e l u j a + v a r m e n n e p a l v e l u j e n + v a r m e n n e p a l v e l u t + v a r m e n n u s j ä r j e s t e l m ä + v a r m e n n u s j ä r j e s t e l m ä ä n + v a r m e n n u s k i r j e i s i i n + v a r m e n n u s m e n e t t e l y + v a r m e n n u s m e n e t t e l y t + v a r m e n n u s m e n e t t e l y ä + v a r m e n n u s p r o s e s s i + v a r m e n t a m a t t a + v a r m e n t a m i s e l i m i ä + v a r m e n t a m i s j ä r j e s t e l m ä + v a r m e n t a m i s j ä r j e s t e l m ä l l ä + v a r m e n t a m i s j ä r j e s t e l m ä n + v a r m e n t a m i s j ä r j e s t e l m ä ä + v a r m e n t a m i s j ä r j e s t e l m ä ä n + v a r m e n t a m i s m e n e t t e l y i l l e + v a r m e n t e i d e n + v a r m e n t e i s i i n + v a r m i n + v a r m i s t a a + v a r m i s t a a k s e e n + v a r m i s t a a k s e m m e + v a r m i s t a a k s e n i + v a r m i s t a a k s e n n e + v a r m i s t a e n + v a r m i s t a e s s a a n + v a r m i s t a e s s a m m e + v a r m i s t a i s i + v a r m i s t a i s i m m e + v a r m i s t a i s i t t e + v a r m i s t a k a a + v a r m i s t a k a a m m e + v a r m i s t a k a a p a + v a r m i s t a m a a n + v a r m i s t a m a l l a + v a r m i s t a m a s s a + v a r m i s t a m a t t a + v a r m i s t a m i n e n + v a r m i s t a m i s e e n + v a r m i s t a m i s e k s i + v a r m i s t a m i s e k s i h a n + v a r m i s t a m i s e n + v a r m i s t a m i s e s s a + v a r m i s t a m i s e s t a + v a r m i s t a m i s j ä r j e s t e l m ä + v a r m i s t a m i s m e n e t t e l y + v a r m i s t a m i s m e n e t t e l y t + v a r m i s t a m i s t a + v a r m i s t a m i s t o i m e n p i t e e t + v a r m i s t a m i s v e l v o l l i s u u t e n i + v a r m i s t a m m e + v a r m i s t a n e e t + v a r m i s t a n u t + v a r m i s t a t t e h a n + v a r m i s t a v a a + v a r m i s t a v a s t a + v a r m i s t a v a t + v a r m i s t a v i a + v a r m i s t e l l a k s e e n + v a r m i s t e t a a n + v a r m i s t e t a a n k o + v a r m i s t e t t a e s s a + v a r m i s t e t t a i s i i n + v a r m i s t e t t a v a + v a r m i s t e t t a v i s s a + v a r m i s t e t t u + v a r m i s t e t t u a a n + v a r m i s t e t t u j e n + v a r m i s t e t u k s i + v a r m i s t u a + v a r m i s t u a k s e e n + v a r m i s t u a k s e m m e + v a r m i s t u a k s e n i + v a r m i s t u i + v a r m i s t u k s e n + v a r m i s t u n u t + v a r m i s t u s j ä r j e s t e l m ä + v a r m i s t u s j ä r j e s t e l m ä ä + v a r m i s t u s k e i n o i h i n + v a r m i s t u s m e n e t e l m i e n + v a r m i s t u s t a + v a r m i s t u s v e l v o i t e + v a r m i s t u t a a n + v a r m i s t u t t a v a + v a r m o i h i n + v a r m o i n a + v a r m o j a + v a r m u u d e l l a + v a r m u u d e n + v a r m u u d e s t a + v a r m u u s k e r r o i n + v a r m u u s n ä k ö k o h t i e n + v a r m u u s r a h a s t o o n + v a r m u u s s u u n n i t e l m a a + v a r m u u s t a s o + v a r m u u s t e k i j ö i d e n + v a r m u u s v a r a s t o i s t a + v a r m u u s v a r a s t o j a + v a r m u u s v a r a s t o j a a n + v a r m u u s v a r a s t o j e n + v a r m u u s v a r a s t o t + v a r m u u t t a + v a r o a + v a r o a i k a a + v a r o e n + v a r o i h i n + v a r o i l l a + v a r o i l l a m m e + v a r o i l l e + v a r o i n + v a r o i n a + v a r o i n e e n + v a r o i s s a + v a r o i s t a + v a r o i s t a a n + v a r o i t a n + v a r o i t e t a a n + v a r o i t e t t a v a + v a r o i t e t t u + v a r o i t i m m e + v a r o i t t a a + v a r o i t t a e s s a a n + v a r o i t t a i s i n + v a r o i t t a m a a n + v a r o i t t a m a t t a + v a r o i t t a n u t + v a r o i t t a v a n + v a r o i t t a v a t + v a r o i t t a v i a + v a r o i t t i + v a r o i t u k s e n + v a r o i t u k s e n a + v a r o i t u k s e t t a + v a r o i t u k s i a + v a r o i t u k s i i n + v a r o i t u k s i l l a + v a r o i t u k s i s s a + v a r o i t u k s i s t a + v a r o i t u s a i k a a + v a r o i t u s a j a n + v a r o i t u s a j a t + v a r o i t u s e t i k e t e i l l ä + v a r o i t u s e t i k e t i t + v a r o i t u s e t i k e t t e j ä + v a r o i t u s e t i k e t t i e n + v a r o i t u s j ä r j e s t e l m i e n + v a r o i t u s j ä r j e s t e l m i i n + v a r o i t u s j ä r j e s t e l m i l l ä + v a r o i t u s j ä r j e s t e l m i s s ä + v a r o i t u s j ä r j e s t e l m i ä + v a r o i t u s j ä r j e s t e l m ä + v a r o i t u s j ä r j e s t e l m ä n + v a r o i t u s j ä r j e s t e l m ä n ä + v a r o i t u s j ä r j e s t e l m ä s t ä + v a r o i t u s j ä r j e s t e l m ä t + v a r o i t u s j ä r j e s t e l m ä ä + v a r o i t u s j ä r j e s t e l m ä ä n + v a r o i t u s j ä r j e s t e l m ä ä n s ä + v a r o i t u s k e l l o j a + v a r o i t u s k e s k u s t a + v a r o i t u s k i r j e e n + v a r o i t u s k i r j e e t + v a r o i t u s k i r j e i t ä + v a r o i t u s k o r t i t + v a r o i t u s k y l t t e j ä + v a r o i t u s k y n n y k s e t + v a r o i t u s k y n n y k s i s t ä + v a r o i t u s k y n n y k s i ä + v a r o i t u s k y n n y s + v a r o i t u s k y n n y s t e n + v a r o i t u s k y n n y s t ä + v a r o i t u s l a u k a u k s e n + v a r o i t u s l a u k a u k s e n a + v a r o i t u s l a u k a u s + v a r o i t u s l e h t i s t e n + v a r o i t u s l i p p u + v a r o i t u s m e k a n i s m e j a + v a r o i t u s m e k a n i s m i + v a r o i t u s m e k a n i s m i i n + v a r o i t u s m e k a n i s m i k s i + v a r o i t u s m e k a n i s m i n + v a r o i t u s m e n e t t e l y ä + v a r o i t u s m e r k e i l t ä + v a r o i t u s m e r k e i s t ä + v a r o i t u s m e r k i n n ä t + v a r o i t u s m e r k i n t ä + v a r o i t u s m e r k i n t ä ä + v a r o i t u s m e r k i n t ö j e n + v a r o i t u s m e r k i n t ö j ä + v a r o i t u s m e r k i t + v a r o i t u s m e r k k e i h i n + v a r o i t u s m e r k k e j ä + v a r o i t u s m e r k k i + v a r o i t u s m e r k k i n ä + v a r o i t u s n a u h a + v a r o i t u s o h j e i d e n + v a r o i t u s s a k k o + v a r o i t u s s i g n a a l e i s t a + v a r o i t u s s i g n a a l i + v a r o i t u s t a a n + v a r o i t u s t e k s t e j ä + v a r o i t u s t e k s t i + v a r o i t u s t e k s t i n + v a r o i t u s t e k s t i s t ä + v a r o i t u s t e k s t i t + v a r o i t u s t e k s t i ä + v a r o i t u s t e n + v a r o i t u s v a l o i s t a + v a r o i t u s v a l o n + v a r o i t u s v a l o t + v a r o i t u s v i e s t e i l l ä + v a r o i t u s v i e s t e i s t ä + v a r o i t u s y k s i k k ö + v a r o j a + v a r o j a a n + v a r o j a k i n + v a r o j a m m e + v a r o j e m m e + v a r o j e n + v a r o j e n h a l l i n n o i n t i t e h t ä v i e n + v a r o j e n h o i t o a + v a r o j e n h o i t o p o l i t i i k k a a n + v a r o j e n k ä y t t ö m e n e t t e l y j e n + v a r o j e n k ä y t t ö o h j e l m i e n + v a r o j e n k ä y t t ö ö n + v a r o j e n k ä y t ö l l e + v a r o j e n k ä y t ö l l ä + v a r o j e n k ä y t ö n + v a r o j e n k ä y t ö s t ä + v a r o j e n p u u t t e e s t a + v a r o j e n s a + v a r o j e n s i i r r o t + v a r o j e n s i i r t o i h i n + v a r o j e n s i i r t o p o l i t i i k a l l a + v a r o j e n s i i r t o p o l i t i i k k a a + v a r o k a a + v a r o k a a m m e + v a r o k e i n o i n + v a r o k e i n o j a + v a r o k e i n o p e r i a a t t e e n a + v a r o m a t t o m u u d e l t a + v a r o t o i m e n a + v a r o t o i m e n p i d e + v a r o t o i m e n p i d e t u l v a l l a + v a r o t o i m e n p i t e e n + v a r o t o i m e n p i t e e n s ä + v a r o t o i m e n p i t e e n ä + v a r o t o i m e n p i t e e s t ä + v a r o t o i m e n p i t e e t + v a r o t o i m e n p i t e i d e n + v a r o t o i m e n p i t e i s i i n + v a r o t o i m e n p i t e i s s ä + v a r o t o i m e n p i t e i s t ä + v a r o t o i m e n p i t e i t ä + v a r o t o i m e n p i t e i t ä ä n + v a r o t o i m e t + v a r o t o i m i a + v a r o t o i m i e n + v a r o t o i m i i n + v a r o t o i m i l l a + v a r o t o i m i s t a + v a r o t o i n t a + v a r o v a i s e e n + v a r o v a i s e m m a l l e + v a r o v a i s e m m a n + v a r o v a i s e m m a s t a + v a r o v a i s e m m i k s i + v a r o v a i s e m p a a + v a r o v a i s e m p a a n + v a r o v a i s e m p i + v a r o v a i s e m p i a + v a r o v a i s e n + v a r o v a i s e t + v a r o v a i s i a + v a r o v a i s i i n + v a r o v a i s i m p i e n + v a r o v a i s i m p i e n k i n + v a r o v a i s i n t a + v a r o v a i s t a + v a r o v a i s u u d e l l a + v a r o v a i s u u d e n + v a r o v a i s u u s l ä h e s t y m i s t a v a s t a + v a r o v a i s u u s p e r i a a t e + v a r o v a i s u u s p e r i a a t e t t a + v a r o v a i s u u s p e r i a a t t e e k s i + v a r o v a i s u u s p e r i a a t t e e l l a + v a r o v a i s u u s p e r i a a t t e e l l e + v a r o v a i s u u s p e r i a a t t e e n + v a r o v a i s u u s p e r i a a t t e e n s a + v a r o v a i s u u s p e r i a a t t e e s e e n + v a r o v a i s u u s p e r i a a t t e e s t a + v a r o v a i s u u s p e r i a a t t e e t + v a r o v a i s u u s s y i s t ä + v a r o v a i s u u s s ä ä n t ö j e n + v a r o v a i s u u s s ä ä n t ö j ä + v a r o v a i s u u s s ä ä n t ö ä + v a r o v a i s u u s t o i m e n p i t e i t ä + v a r o v a i s u u s v a a t i m u k s e t + v a r o v a i s u u t e e n + v a r o v a i s u u t t a + v a r p u s h a u k k a + v a r p u s k i u r u + v a r p u s k u t o j a t + v a r p u s p ö l l ö + v a r p u s p ö l l ö t + v a r s a n k e l l o + v a r s i k e n k ä + v a r s i l l a + v a r s i n a i s e e n + v a r s i n a i s e l l a + v a r s i n a i s e n + v a r s i n a i s e n a + v a r s i n a i s e s s a + v a r s i n a i s e s t a + v a r s i n a i s e s t i + v a r s i n a i s e t + v a r s i n a i s i a + v a r s i n a i s i i n + v a r s i n a i s i k s i + v a r s i n a i s i l l e + v a r s i n a i s i s t a + v a r s i n a i s t a + v a r s i n a i s t e n + v a r s i y ö k k ö n e n + v a r s o v a n + v a r s o v a s s a + v a r t a l o m a a l a u s + v a r t a l o n i + v a r t a l o s k a n n e r e i s t a + v a r t a l o s k a n n e r e i t a + v a r t a l o s k a n n e r i + v a r t a l o s k a n n e r i t + v a r t e e n o t e t t a v a k s i + v a r t e e n o t e t t a v a m p a a + v a r t e e n o t e t t a v a m p i + v a r t e e n o t e t t a v i a + v a r t i j a k s i + v a r t i j a n a + v a r t i j a p a l v e l u i l l e + v a r t i j a t + v a r t i j o i n a + v a r t i j o i t a + v a r t i n + v a r t i o a l u s t a + v a r t i o i d a + v a r t i o i d a k s e e n + v a r t i o i m a a n + v a r t i o i n t i t e h t ä v i s s ä + v a r t i o i v a t + v a r t i o l a i v a + v a r t i o m o o t t o r i v e n e + v a r t i o v e n e + v a r t t i a + v a r t t i t u n n i n + v a r t t i t u n t i + v a r t t u n e e m m i l l e + v a r t t u n e e m p i e n + v a r u i l l a a n + v a r u i l l a m m e + v a r u s m i e s p a l v e l u k s e e n + v a r u s t a a k s e e n + v a r u s t a j a t + v a r u s t a k a a m m e + v a r u s t a m i s e k s i + v a r u s t a m i s e s t a + v a r u s t a m o e l i n k e i n o a + v a r u s t a m o i d e n + v a r u s t a m o i h i n + v a r u s t a m o i l l a + v a r u s t a m o i l l e + v a r u s t a m o i s t a + v a r u s t a m o i t a + v a r u s t a m o j e n + v a r u s t a m o p ä ä o m a + v a r u s t a m o p ä ä o m a n + v a r u s t a m o s t a + v a r u s t a m o t + v a r u s t a m o y h d i s t y s t e n + v a r u s t a u t u a k s e e n + v a r u s t a u t u m i s v e l v o l l i s u u s + v a r u s t a u t u n e i t a + v a r u s t e i d e n + v a r u s t e l u a l a n + v a r u s t e l u j ä r j e s t ö n + v a r u s t e l u k i l p a + v a r u s t e l u k i l p a a + v a r u s t e l u k i l p a a n + v a r u s t e l u k i l p a i l u u n + v a r u s t e l u k i l v a n + v a r u s t e l u m e n o j e n + v a r u s t e l u o h j e l m i e n + v a r u s t e l u p o l i t i i k a l l e + v a r u s t e l u p o l i t i i k a n + v a r u s t e l u p o l i t i i k a s t a + v a r u s t e l u p o l i t i i k k a + v a r u s t e l u p r o s e s s i s s a + v a r u s t e l u s o p i m u k s i i n + v a r u s t e l u s s a + v a r u s t e l u t e o l l i s u u d e n + v a r u s t e l u t e o l l i s u u s + v a r u s t e l u t e o l l i s u u s j ä t i n + v a r u s t e l u t o i m i s t o + v a r u s t e l u t o i m i s t o a + v a r u s t e l u t o i m i s t o n + v a r u s t e l u y h t e i s t y ö + v a r u s t e o h j e l m a l l a + v a r u s t e o h j e l m a t + v a r u s t e t a s o l l a + v a r u s t e t t a v a + v a r u s t e t u t k i n + v a r u s t u k s e l l a + v a r v a s m y l l y + v a r v a s s a n d a a l i + v a r v i k k o r a h k a s a m m a l + v a s a l l i v a l t i o + v a s a l l i v a l t i o i l l a + v a s a l l i v a l t i o i t a + v a s a l l i v a l t i o n + v a s a l l i v a l t i o n a + v a s a l l i v a l t i o t + v a s a m a m i t t a r i + v a s a r a h a i t + v a s a r a l a u k a u s + v a s e m m a n p u o l e i s e n + v a s e m m a n p u o l e i s t a + v a s e m m i s t o a + v a s e m m i s t o a n a r k i s m i + v a s e m m i s t o b l o k k i + v a s e m m i s t o d e m o k r a a t i t + v a s e m m i s t o d e m o k r a a t t i e n + v a s e m m i s t o e l i i t i n + v a s e m m i s t o e l i i t t i + v a s e m m i s t o e n e m m i s t ö + v a s e m m i s t o e n e m m i s t ö s t ä + v a s e m m i s t o f a n a a t i k k o n a + v a s e m m i s t o h a l l i n n o t + v a s e m m i s t o h a l l i n t o n s a + v a s e m m i s t o h a l l i t u k s e l l e + v a s e m m i s t o h a l l i t u k s e n + v a s e m m i s t o h a l l i t u k s e t + v a s e m m i s t o h a l l i t u k s i a + v a s e m m i s t o h a l l i t u s + v a s e m m i s t o h a l l i t u s t a + v a s e m m i s t o h a l l i t u s t e n + v a s e m m i s t o i d e o l o g i a a + v a s e m m i s t o j o u k k o i h i n + v a s e m m i s t o j ä s e n e t + v a s e m m i s t o j ä s e n i l l e + v a s e m m i s t o j ä s e n t e n + v a s e m m i s t o k o a l i t i o + v a s e m m i s t o k o k o o n p a n o + v a s e m m i s t o k o l l e g o i h i n + v a s e m m i s t o k o m m u n i s m i + v a s e m m i s t o l a i s e k s i + v a s e m m i s t o l a i s e l l a + v a s e m m i s t o l a i s e l l e + v a s e m m i s t o l a i s e l t a + v a s e m m i s t o l a i s e n + v a s e m m i s t o l a i s e n a + v a s e m m i s t o l a i s e s t a + v a s e m m i s t o l a i s e t + v a s e m m i s t o l a i s h a a v e i l i j a t + v a s e m m i s t o l a i s h a l l i t u s + v a s e m m i s t o l a i s h a l l i t u s t e n + v a s e m m i s t o l a i s i a + v a s e m m i s t o l a i s i i n + v a s e m m i s t o l a i s i k s i + v a s e m m i s t o l a i s i n a + v a s e m m i s t o l a i s n a i s e n + v a s e m m i s t o l a i s p i i r i t + v a s e m m i s t o l a i s p o l i i t i k k o n a + v a s e m m i s t o l a i s p u h e e t + v a s e m m i s t o l a i s t a + v a s e m m i s t o l a i s t e n + v a s e m m i s t o l a i s t o v e r i s t a a n + v a s e m m i s t o l a i s u u t t a + v a s e m m i s t o l i b e r a a l i e n + v a s e m m i s t o l i b e r a a l i t + v a s e m m i s t o l i i t o n + v a s e m m i s t o l i i t t o + v a s e m m i s t o l i i t t o a + v a s e m m i s t o l i i t t o l a i s e t + v a s e m m i s t o l i i t t o u t u m i a + v a s e m m i s t o l l a + v a s e m m i s t o l l e k a a n + v a s e m m i s t o l t a + v a s e m m i s t o m e d i a + v a s e m m i s t o n + v a s e m m i s t o n a t i o n a l i s t i s i a + v a s e m m i s t o n u o r e t + v a s e m m i s t o o n + v a s e m m i s t o p e r h e e n + v a s e m m i s t o p i i r i e n + v a s e m m i s t o p o l i i t i k k o + v a s e m m i s t o p o l i i t i k k o j e n + v a s e m m i s t o p o l i i t i k o t + v a s e m m i s t o p o l i t i i k a s s a + v a s e m m i s t o p o p u l i s m i + v a s e m m i s t o p u o l u e + v a s e m m i s t o p u o l u e e n + v a s e m m i s t o p u o l u e e s e e n + v a s e m m i s t o p u o l u e e t + v a s e m m i s t o p u o l u e i d e n + v a s e m m i s t o p u o l u e i l l e + v a s e m m i s t o p u o l u e i t a + v a s e m m i s t o p u o l u e t t a + v a s e m m i s t o r a d i k a a l e j a + v a s e m m i s t o r a d i k a a l i e n + v a s e m m i s t o r a d i k a a l i p u o l u e e n + v a s e m m i s t o r i n t a m a + v a s e m m i s t o r y h m i e n + v a s e m m i s t o r y h m i ä + v a s e m m i s t o r y h m ä + v a s e m m i s t o r y h m ä n + v a s e m m i s t o r y h m ä t + v a s e m m i s t o s i i p e ä + v a s e m m i s t o s i i p i + v a s e m m i s t o s i i v e n + v a s e m m i s t o s o s i a a l i d e m o k r a a t t i e n + v a s e m m i s t o s o s i a l i s t e i h i n + v a s e m m i s t o s o s i a l i s t e i s t a + v a s e m m i s t o s o s i a l i s t e j a + v a s e m m i s t o s o s i a l i s t i e n + v a s e m m i s t o s s a + v a s e m m i s t o s t a + v a s e m m i s t o s u u n t a u s + v a s e m m i s t o t a h o + v a s e m m i s t o t e r r o r i s m i a + v a s e m m i s t o v a i h t o e h t o + v a s e m m i s t o v a l l a n k u m o u k s e l l i s e n a + v a s e m m i s t o v e t o i s e l l e + v a s e m m i s t o v o i m i e n + v a s i k a n l i h a + v a s i k a n l i h a n + v a s i k a s t a + v a s i k k a k u l j e t u s + v a s i k o i d e n + v a s i k o i l l e + v a s i k o i n a + v a s i k o i t a + v a s k i k o r e n t o + v a s k i p u h a l l i n + v a s k i r a t s a s t a j a + v a s t a a j a l l e + v a s t a a j i e n + v a s t a a j i l l e + v a s t a a j i s t a + v a s t a a k a a n + v a s t a a k o + v a s t a a m a a n + v a s t a a m a l l a + v a s t a a m a s s a + v a s t a a m a s t a + v a s t a a m a t t a + v a s t a a m i s e e n + v a s t a a m i s e k s i + v a s t a a m i s e s t a + v a s t a a m i s o i k e u t t a + v a s t a a m i s o i k e u t t a a n + v a s t a a m i s t a + v a s t a a m m e + v a s t a a m m e k o + v a s t a a n o t e t t a i s i i n + v a s t a a n o t e t t a v a + v a s t a a n o t e t t u j a + v a s t a a n o t e t t u j e n + v a s t a a n o t o n + v a s t a a n o t o s t a + v a s t a a n o t t a a + v a s t a a n o t t a e s s a a n + v a s t a a n o t t a j a a + v a s t a a n o t t a j a h a l l i t u s t e n + v a s t a a n o t t a j a m a a + v a s t a a n o t t a j a m a a h a n + v a s t a a n o t t a j a m a a h a n s a + v a s t a a n o t t a j a m a a l l e + v a s t a a n o t t a j a m a a n + v a s t a a n o t t a j a m a a p e r i a a t e t t a + v a s t a a n o t t a j a m a a p e r i a a t t e e l l a + v a s t a a n o t t a j a m a a s s a + v a s t a a n o t t a j a m a a t + v a s t a a n o t t a j a m a a t a + v a s t a a n o t t a j a m a i d e n + v a s t a a n o t t a j a m a i d e n s a + v a s t a a n o t t a j a m a i h i n + v a s t a a n o t t a j a m a i l l a + v a s t a a n o t t a j a m a i l l e + v a s t a a n o t t a j a m a i n a + v a s t a a n o t t a j a m a i s s a + v a s t a a n o t t a j a m a i s s a o n + v a s t a a n o t t a j a m a i s t a + v a s t a a n o t t a j a m a i t a + v a s t a a n o t t a j a m a i t a k i n + v a s t a a n o t t a j a n + v a s t a a n o t t a j a n a + v a s t a a n o t t a j a p u o l i + v a s t a a n o t t a j a v a l t i o + v a s t a a n o t t a j a v a l t i o i d e n + v a s t a a n o t t a j a v a l t i o i t a + v a s t a a n o t t a j a v a l t i o l l e + v a s t a a n o t t a j a v a l t i o l t a + v a s t a a n o t t a j a v a l t i o n + v a s t a a n o t t a j a v a l t i o o n + v a s t a a n o t t a j a v a l t i o s s a + v a s t a a n o t t a j i a + v a s t a a n o t t a j i e n + v a s t a a n o t t a j i l l e + v a s t a a n o t t a j i l l e e n + v a s t a a n o t t a j i n a + v a s t a a n o t t a m a a n + v a s t a a n o t t a m i e n + v a s t a a n o t t a m i s e e n + v a s t a a n o t t a m i s e n + v a s t a a n o t t a n e e n i + v a s t a a n o t t a n u t + v a s t a a n o t t a v a a + v a s t a a n o t t a v a i s e m m a n + v a s t a a n o t t a v a i s e m m i k s i + v a s t a a n o t t a v a i s e m m i n + v a s t a a n o t t a v a i s e m p i + v a s t a a n o t t a v a i s e m p i a + v a s t a a n o t t a v a i s i n + v a s t a a n o t t a v a l l e + v a s t a a n o t t a v a n + v a s t a a n o t t a v a s s a + v a s t a a n o t t a v i a + v a s t a a n o t t a v i e n + v a s t a a n o t t a v i l l e + v a s t a a n o t t a v i l l e k i n + v a s t a a n o t t a v i l t a + v a s t a a n o t t a v i s s a + v a s t a a n o t t a v u u d e n + v a s t a a n o t t o a + v a s t a a n o t t o a l u e i t a + v a s t a a n o t t o a s e m i e n + v a s t a a n o t t o a v u s t a + v a s t a a n o t t o d i r e k t i i v i + v a s t a a n o t t o d i r e k t i i v i i n + v a s t a a n o t t o d i r e k t i i v i s s ä + v a s t a a n o t t o d i r e k t i i v i s t ä + v a s t a a n o t t o d i r e k t i i v i ä + v a s t a a n o t t o e d e l l y t y k s e t + v a s t a a n o t t o e d e l l y t y k s i i n + v a s t a a n o t t o e d e l l y t y k s i s t ä + v a s t a a n o t t o e d e l l y t y k s i ä + v a s t a a n o t t o e d e l l y t y s t e n + v a s t a a n o t t o e h t o j a + v a s t a a n o t t o e h t o j e n + v a s t a a n o t t o j ä r j e s t e l m i ä + v a s t a a n o t t o j ä r j e s t e l m ä + v a s t a a n o t t o j ä r j e s t e l m ä n + v a s t a a n o t t o j ä r j e s t e l m ä s t ä + v a s t a a n o t t o j ä r j e s t e l m ä ä + v a s t a a n o t t o k a p a s i t e e t i n + v a s t a a n o t t o k a p a s i t e e t i s t a + v a s t a a n o t t o k a p a s i t e e t t i + v a s t a a n o t t o k a p a s i t e e t t i a + v a s t a a n o t t o k a p a s i t e e t t i i n + v a s t a a n o t t o k a p a s i t e e t t i i n s a + v a s t a a n o t t o k e s k u k s e e n + v a s t a a n o t t o k e s k u k s e n + v a s t a a n o t t o k e s k u k s e s s a + v a s t a a n o t t o k e s k u k s e s t a + v a s t a a n o t t o k e s k u k s e t + v a s t a a n o t t o k e s k u k s i a + v a s t a a n o t t o k e s k u k s i e n + v a s t a a n o t t o k e s k u k s i i n + v a s t a a n o t t o k e s k u k s i l l e + v a s t a a n o t t o k e s k u k s i s s a + v a s t a a n o t t o k e s k u k s i s t a + v a s t a a n o t t o k e s k u s + v a s t a a n o t t o k e s k u s t a + v a s t a a n o t t o k e s k u s t e n + v a s t a a n o t t o k o r v a u k s i a + v a s t a a n o t t o k o t i n a + v a s t a a n o t t o k r i t e e r i ä + v a s t a a n o t t o k y k y + v a s t a a n o t t o k y k y y n + v a s t a a n o t t o k y k y ä + v a s t a a n o t t o k y v y n + v a s t a a n o t t o k y v y s s ä + v a s t a a n o t t o k y v y s t ä + v a s t a a n o t t o l a i t t e e t + v a s t a a n o t t o l a i t t e i s i i n + v a s t a a n o t t o l a i t t e i s t a + v a s t a a n o t t o l a i t t e i s t o a + v a s t a a n o t t o l a i t t e i s t o t + v a s t a a n o t t o l a i t t e i t a + v a s t a a n o t t o l e i r e i l l e + v a s t a a n o t t o l e i r e i l l ä + v a s t a a n o t t o l e i r e i l t ä ä n + v a s t a a n o t t o l e i r e j ä + v a s t a a n o t t o l e i r i e n + v a s t a a n o t t o m a a h a n + v a s t a a n o t t o m a a n + v a s t a a n o t t o m a a s s a + v a s t a a n o t t o m a h d o l l i s u u d e t + v a s t a a n o t t o m e n e t t e l y + v a s t a a n o t t o m e n e t t e l y i h i n + v a s t a a n o t t o m e n e t t e l y j e n + v a s t a a n o t t o m e n e t t e l y j ä + v a s t a a n o t t o m e n e t t e l y n + v a s t a a n o t t o m e n e t t e l y t + v a s t a a n o t t o m e n e t t e l y ä + v a s t a a n o t t o p a i k o i s s a + v a s t a a n o t t o p a l v e l u i s t a + v a s t a a n o t t o p a l v e l u j a + v a s t a a n o t t o p a l v e l u j e n + v a s t a a n o t t o p a l v e l u t + v a s t a a n o t t o p i s t e e t + v a s t a a n o t t o p o l i t i i k a n + v a s t a a n o t t o p o l i t i i k k a + v a s t a a n o t t o p o l i t i i k k a a + v a s t a a n o t t o p o l i t i i k k o j a + v a s t a a n o t t o p r o s e s s i + v a s t a a n o t t o p r o s e s s i i m m e + v a s t a a n o t t o p y y n t ö j e n + v a s t a a n o t t o p ä ä s s ä + v a s t a a n o t t o r a k e n t e i s i i n + v a s t a a n o t t o r a k e n t e i t a + v a s t a a n o t t o r a t k a i s u j a + v a s t a a n o t t o r e s u r s s e j a + v a s t a a n o t t o s u u n n i t e l m a + v a s t a a n o t t o s u u n n i t e l m a t + v a s t a a n o t t o s u u n n i t e l m i e n + v a s t a a n o t t o s ä ä n n ö s t ö + v a s t a a n o t t o t i s k i n ä + v a s t a a n o t t o t u t k i m u s + v a s t a a n o t t o v a a t i m u k s i a + v a s t a a n o t t o v a l m i u d e s t a + v a s t a a n o t t o v a l m i u d e s t a m m e + v a s t a a n o t t o v a l m i u d e t + v a s t a a n o t t o v a l m i u k s i e n + v a s t a a n o t t o v a l m i u s + v a s t a a n o t t o v a l m i u t e e n + v a s t a a n o t t o v a l m i u t t a + v a s t a a n o t t o v a l t i o n + v a s t a a n o t t o y r i t y k s i s t ä + v a s t a a n s a + v a s t a a v a a + v a s t a a v a a n + v a s t a a v a k s i + v a s t a a v a l l a + v a s t a a v a l l e + v a s t a a v a n + v a s t a a v a n a + v a s t a a v a n k o k o i s i i n + v a s t a a v a n l a a j u i n e n + v a s t a a v a n l a i s e n + v a s t a a v a n l a i s e s s a + v a s t a a v a n l a i s e s t a + v a s t a a v a n l a i s e t + v a s t a a v a n l a i s i a + v a s t a a v a n l a i s i i n + v a s t a a v a n l a i s i s t a + v a s t a a v a n l a i s t a + v a s t a a v a n l a i s t e n + v a s t a a v a n s i s ä l t ö i s i ä + v a s t a a v a n t y y p p i s i ä + v a s t a a v a n t y y p p i s t ä + v a s t a a v a s s a + v a s t a a v a s t a + v a s t a a v a t + v a s t a a v a t k o + v a s t a a v i a + v a s t a a v i e n + v a s t a a v i i n + v a s t a a v i l l e + v a s t a a v i l t a + v a s t a a v i n e + v a s t a a v i s s a + v a s t a a v i s t a + v a s t a a v u u d e s t a + v a s t a a v u u s k y s y m y k s e e n + v a s t a a v u u s l a u s e k k e e s t a + v a s t a a v u u s m e n e t t e l y n + v a s t a a v u u s m e n e t t e l y ä + v a s t a a v u u s p e r i a a t e + v a s t a a v u u s p ä ä t ö k s e n + v a s t a a v u u s t a s o n + v a s t a a v u u s t a u l u k k o j a + v a s t a a v u u s t a u l u k k o j e n + v a s t a a v u u s t a u l u k o i d e n + v a s t a a v u u s t a u l u k o i h i n + v a s t a a v u u s t a u l u k o i s s a h a n + v a s t a a v u u s t a u l u k o i s t a + v a s t a a v u u s t a u l u k o i t a + v a s t a a v u u s t a u l u k o s t a + v a s t a a v u u s t a u l u k o t + v a s t a a v u u s t o d i s t u s + v a s t a e h d o k a s + v a s t a e h d o k k a i l l e + v a s t a e h d o t u k s e n + v a s t a e h d o t u k s e n a + v a s t a e h d o t u k s i a + v a s t a e h d o t u s + v a s t a e h d o t u s t a + v a s t a e h d o t u s t e n + v a s t a h a k o i s e s t i + v a s t a h a k o i s e t + v a s t a h a k o i s i a + v a s t a h a k o i s i m m a t + v a s t a h a k o i s i m p i a + v a s t a h a k o i s t a + v a s t a h a n k k e e n + v a s t a h y ö k k ä y k s e e n + v a s t a h y ö k k ä y k s e k s i + v a s t a h y ö k k ä y k s e n s ä + v a s t a h y ö k k ä y k s i i n + v a s t a h y ö k k ä y s + v a s t a i s e e n + v a s t a i s e k s i + v a s t a i s e l l e + v a s t a i s e l t a + v a s t a i s e n + v a s t a i s e s s a + v a s t a i s e s t a + v a s t a i s e t + v a s t a i s i + v a s t a i s i a + v a s t a i s i i n + v a s t a i s i k s i + v a s t a i s i l l e + v a s t a i s i l t a + v a s t a i s i n a + v a s t a i s i s t a + v a s t a i s i t t e + v a s t a i s i v a t + v a s t a i s k u + v a s t a i s k u j o u k k o j a + v a s t a i s k u k y k y + v a s t a i s k u n + v a s t a i s k u u n + v a s t a i s t a + v a s t a i s t e n + v a s t a i s u u d e s s a + v a s t a i s u u d e s s a k i n + v a s t a i s u u t t a + v a s t a j a e t t u j e n + v a s t a j o u k k u e t t a + v a s t a k a a r i j o u s i + v a s t a k a i k u a + v a s t a k a n t e e n + v a s t a k a u p p a + v a s t a k a u p p a a + v a s t a k i n + v a s t a k k a i n a s e t t e l u a + v a s t a k k a i n a s e t t e l u i d e n + v a s t a k k a i n a s e t t e l u i h i n + v a s t a k k a i n a s e t t e l u j a + v a s t a k k a i n a s e t t e l u m a l l i n + v a s t a k k a i n a s e t t e l u n + v a s t a k k a i n a s e t t e l u n a + v a s t a k k a i n a s e t t e l u s t a + v a s t a k k a i n a s e t t e l u t + v a s t a k k a i n a s e t t e l u t i l a n n e + v a s t a k k a i s e n + v a s t a k k a i s e s t a + v a s t a k k a i s e t + v a s t a k k a i s i a + v a s t a k k a i s i l l a + v a s t a k k a i s i s t a + v a s t a k k a i s t a + v a s t a k k a i s t e n + v a s t a k o h d a l l e + v a s t a k o h t a + v a s t a k o h t a i s u u k s i a + v a s t a k o h t a k y s y m y k s i ä + v a s t a k o h t i a + v a s t a k o m p e n s a a t i o s t a + v a s t a k u m p p a n i + v a s t a k u v a + v a s t a k y s y m y k s e e n + v a s t a k y s y m y s + v a s t a l a u s e + v a s t a l a u s e e m m e + v a s t a l a u s e e n + v a s t a l a u s e e n i + v a s t a l a u s e e s e e n + v a s t a l a u s e e s t a + v a s t a l a u s e e t + v a s t a l a u s e i d e n + v a s t a l a u s e i s i i n + v a s t a l a u s e i s i i n i + v a s t a l a u s e i s t a + v a s t a l a u s e i t a + v a s t a l a u s e i t a a n + v a s t a l a u s e i t t a + v a s t a l a u s e j ä r j e s t e l m ä + v a s t a l a u s e k i r j e e n + v a s t a l a u s e l i i k e + v a s t a l i i k k e i t ä + v a s t a l u k u + v a s t a l ä ä k k e i t ä + v a s t a m e l u + v a s t a m e l u k u u l o k e + v a s t a m i e t i n t ö + v a s t a m y ö n n y t y k s i ä + v a s t a m y ö n n y t y s t e n + v a s t a m ä e s s ä + v a s t a n i m i t e t t y + v a s t a n n u t + v a s t a p a i n e + v a s t a p a i n e t t a + v a s t a p a i n e v o i m a l a i t o s + v a s t a p a i n e v o i m a n + v a s t a p a i n o + v a s t a p a i n o a + v a s t a p a i n o j ä r j e s t e l m ä n + v a s t a p a i n o k s i + v a s t a p a i n o n a + v a s t a p a l v e l u k s e n a + v a s t a p a l v e l u k s i a + v a s t a p e r u s t e i d e n + v a s t a p e r u s t e l u i h i n + v a s t a p u h d i s t u k s e t + v a s t a p u o l e e n + v a s t a p u o l e k s i + v a s t a p u o l e l l a + v a s t a p u o l e l l e + v a s t a p u o l e l t a + v a s t a p u o l e n + v a s t a p u o l e t + v a s t a p u o l i + v a s t a p u o l i e n + v a s t a p u o l i l u o t t o r i s k i + v a s t a p u o l i r i s k i e n + v a s t a p u o l i r i s k i ä + v a s t a p u o l t a + v a s t a r a h o i t u s t a + v a s t a r a k e n n e t t u j e n + v a s t a r a k e n n e t u l l a + v a s t a r a n n a l l e + v a s t a r a n n a n + v a s t a r a p o r t i s s a m m e + v a s t a r a p o r t i s s a n i + v a s t a r e a k t i o i t a + v a s t a r e a k t i o n + v a s t a r i n n a n + v a s t a r i n t a + v a s t a r i n t a a + v a s t a r i n t a a n + v a s t a r i n t a j ä r j e s t ö + v a s t a r i n t a l i i k e + v a s t a r i n t a l i i k e t t ä + v a s t a r i n t a l i i k k e e n + v a s t a r i n t a l i i k k e e n s ä + v a s t a r i n t a l i i k k e e s t ä + v a s t a r i n t a l i i k k e e t + v a s t a r i n t a l i i k k e i d e n + v a s t a r i n t a l i i k k e i s t ä + v a s t a r i n t a n e u v o s t o n + v a s t a r i n t a s t r a t e g i o i t a + v a s t a r i n t a t a i s t e l i j a t + v a s t a r i n t a t a i s t e l i j o i k s i + v a s t a r i n t a t a i s t e l i j o i n e e n + v a s t a r i n t a t a i s t e l i j o i t a + v a s t a r i n t a t a i s t e l u u n + v a s t a r i n t a t o i m i i n + v a s t a r u s k o + v a s t a s i + v a s t a s i i r r o n + v a s t a s i n + v a s t a s i t t e + v a s t a s i v a t + v a s t a s s a a n + v a s t a s s a m m e + v a s t a s t r a t e g i a + v a s t a s t r a t e g i a a + v a s t a s t r a t e g i o i t a + v a s t a s u o r i t u k s e s t a + v a s t a s u o r i t u k s i a + v a s t a s u o r i t u s + v a s t a s y k l i n e n + v a s t a s y k l i s e t + v a s t a s y n n y t t ä n e e t + v a s t a s y n t y n e i d e n + v a s t a s y n t y n e i l l e + v a s t a s y n t y n e i s t ä + v a s t a s y n t y n e i t ä + v a s t a s y n t y n y t + v a s t a s y n t y n y t t ä + v a s t a t a + v a s t a t a a n + v a s t a t a a n k o + v a s t a t a k s e e n + v a s t a t a k s e m m e + v a s t a t a k s e n i + v a s t a t a k s e n n e + v a s t a t a r j o u k s e n + v a s t a t a r j o u k s i a + v a s t a t e r r o r i + v a s t a t e s s a a n + v a s t a t e s s a m m e + v a s t a t e s s a n i + v a s t a t e s s a n n e + v a s t a t k a a + v a s t a t k a a m m e + v a s t a t k a a p a + v a s t a t o i m e n a + v a s t a t o i m e n p i d e + v a s t a t o i m e n p i t e e t + v a s t a t o i m e n p i t e i d e n + v a s t a t o i m e n p i t e i l l ä + v a s t a t o i m e n p i t e i n + v a s t a t o i m e n p i t e i s i i n + v a s t a t o i m e n p i t e i s s ä + v a s t a t o i m e n p i t e i s t ä + v a s t a t o i m e n p i t e i t ä + v a s t a t o i m e t + v a s t a t o i m i + v a s t a t o i m i a + v a s t a t o i m i e n + v a s t a t o i m i i n + v a s t a t o i m i l l a + v a s t a t o i m i l l e + v a s t a t o i m i n + v a s t a t o i m i s s a a n + v a s t a t o i m i s t a + v a s t a t t a i s i i n + v a s t a t t a v a a + v a s t a t t a v a k s e n i + v a s t a t t a v a s s a + v a s t a t t i i n + v a s t a t t u + v a s t a t u u l e e n + v a s t a t u u l e s s a + v a s t a t u u l t a + v a s t a u h k a u k s i i n + v a s t a u k s e e n + v a s t a u k s e e n s a + v a s t a u k s e k s i + v a s t a u k s e l l a a n + v a s t a u k s e m m e + v a s t a u k s e n + v a s t a u k s e n a + v a s t a u k s e n i + v a s t a u k s e n n e + v a s t a u k s e n s a + v a s t a u k s e s s a + v a s t a u k s e s s a a n + v a s t a u k s e s s a n i + v a s t a u k s e s s a n n e + v a s t a u k s e s t a + v a s t a u k s e s t a a n + v a s t a u k s e s t a n n e + v a s t a u k s e t + v a s t a u k s i a + v a s t a u k s i a n n e + v a s t a u k s i e n + v a s t a u k s i l l a + v a s t a u k s i n e e n + v a s t a u k s i s s a + v a s t a u k s i s s a a n + v a s t a u k s i s s a m m e + v a s t a u k s i s s a n n e + v a s t a u k s i s t a + v a s t a u k s i s t a a n + v a s t a u k s i s t a n n e + v a s t a u s a i k a + v a s t a u s a i k a a + v a s t a u s a i k a n i + v a s t a u s a i k a n s a + v a s t a u s a i k o j a + v a s t a u s a i k o j e n + v a s t a u s a j a n + v a s t a u s e r ä ä + v a s t a u s i s t u n t o o n + v a s t a u s j ä r j e s t e l m ä + v a s t a u s j ä r j e s t e l m ä ä + v a s t a u s k i r j e + v a s t a u s k i r j e e s t ä + v a s t a u s k i r j e t t ä + v a s t a u s k o k o n a i s u u s + v a s t a u s k o n p u h d i s t u s + v a s t a u s k u p o n k i + v a s t a u s l e i k k i ä + v a s t a u s l u e t t e l o a + v a s t a u s l u o n n o s + v a s t a u s l u o n n o s t e n + v a s t a u s m a h d o l l i s u u d e n + v a s t a u s m a h d o l l i s u u d e s t a + v a s t a u s m e k a n i s m i + v a s t a u s m e n e t t e l y n + v a s t a u s o i k e u t t a + v a s t a u s p a l v e l u n + v a s t a u s p u h e e n v u o r o s s a n n e + v a s t a u s p ö y t ä k i r j a n + v a s t a u s s u o s i t u k s i a + v a s t a u s t a + v a s t a u s t a n i + v a s t a u s t a n n e + v a s t a u s t e n + v a s t a u s y r i t y s + v a s t a u u d i s t u s t e n + v a s t a v a a t i m u k s i i n + v a s t a v a i k u t u s t a + v a s t a v a k o i l u o p e r a a t i o t a + v a s t a v a k o i l u t e h t ä v i i n + v a s t a v a l i s t u s + v a s t a v a l i t t u + v a s t a v a l i t t u a + v a s t a v a l i t t u j e n + v a s t a v a l i t t u n a + v a s t a v a l i t t u u n + v a s t a v a l i t u l l e + v a s t a v a l i t u l t a + v a s t a v a l i t u n + v a s t a v a l i t u s s a + v a s t a v a l i t u t + v a s t a v a l l a n k u m o u k s e l l i s e n + v a s t a v a l l a n k u m o u k s e l l i s i a + v a s t a v a l l a n k u m o u k s e l l i s i l l e + v a s t a v a l l a n k u m o u s + v a s t a v a l o s u o j a + v a s t a v a p a u t u n u t t a + v a s t a v i e r a i l u + v a s t a v i e r a i l u n + v a s t a v i r t a a n + v a s t a v o i m a + v a s t a v o i m a a + v a s t a v o i m a k s i + v a s t a v o i m a n + v a s t a v o i m i a + v a s t a v u o r o i n e n + v a s t a v u o r o i s e e n + v a s t a v u o r o i s e l l a + v a s t a v u o r o i s e n + v a s t a v u o r o i s e s t a + v a s t a v u o r o i s e s t i + v a s t a v u o r o i s i a + v a s t a v u o r o i s t a + v a s t a v u o r o i s t e n + v a s t a v u o r o i s u u d e n + v a s t a v u o r o i s u u d e s t a + v a s t a v u o r o i s u u s k y s y m y k s e n + v a s t a v u o r o i s u u s k y s y m y k s e s t ä + v a s t a v u o r o i s u u s l a u s e k e t t a + v a s t a v u o r o i s u u s l a u s e k k e e n + v a s t a v u o r o i s u u s l a u s e k k e e s e e n + v a s t a v u o r o i s u u s l a u s e k k e i t a + v a s t a v u o r o i s u u s m e k a n i s m i + v a s t a v u o r o i s u u s m e k a n i s m i a + v a s t a v u o r o i s u u s m e k a n i s m i i n + v a s t a v u o r o i s u u s m e k a n i s m i n + v a s t a v u o r o i s u u s m e k a n i s m i s t a + v a s t a v u o r o i s u u s o n g e l m a + v a s t a v u o r o i s u u s p e r i a a t e + v a s t a v u o r o i s u u s p e r i a a t e t t a + v a s t a v u o r o i s u u s p e r i a a t t e e l l a + v a s t a v u o r o i s u u s p e r i a a t t e e n + v a s t a v u o r o i s u u s p e r i a a t t e e s e e n + v a s t a v u o r o i s u u s p e r i a a t t e e s t a + v a s t a v u o r o i s u u s p o h j a l t a + v a s t a v u o r o i s u u s s o p i m u k s i s s a + v a s t a v u o r o i s u u s s o p i m u s + v a s t a v u o r o i s u u s s o p i m u s t e n + v a s t a v u o r o i s u u s s ä ä n t ö + v a s t a v u o r o i s u u s s ä ä n t ö j e n + v a s t a v u o r o i s u u s v a a t i m u k s e t + v a s t a v u o r o i s u u s v a a t i m u s t e n + v a s t a v u o r o i s u u s v e l v o i t t e i s t a + v a s t a v u o r o i s u u s v ä l i n e + v a s t a v u o r o i s u u t e e n + v a s t a v u o r o i s u u t t a + v a s t a v ä i t e y k s i k ö n + v a s t a v ä i t t e e l l e + v a s t a v ä i t t e e n + v a s t a v ä i t t e e n i + v a s t a v ä i t t e e n ä + v a s t a v ä i t t e e t + v a s t a v ä i t t e i s i i n + v a s t a v ä i t t e i t t ä + v a s t a v ä i t t e i t ä + v a s t a v ä i t t ä j i i n + v a s t a v ä k i v a l t a a n + v a s t a v ä r i + v a s t a y h d i s t y n y t + v a s t a ä ä n i ä + v a s t e a i k a + v a s t e d e s k i n + v a s t e n m i e l i s e m p i + v a s t e n m i e l i s e m p i ä + v a s t e n m i e l i s e m p ä ä + v a s t e n m i e l i s e n + v a s t e n m i e l i s e s t ä + v a s t e n m i e l i s i l l e + v a s t e n m i e l i s i m m i s t ä + v a s t e n m i e l i s i m p i ä + v a s t e n m i e l i s i n + v a s t e n m i e l i s i n t ä + v a s t e n m i e l i s i ä + v a s t e n m i e l i s t ä + v a s t e n m i e l i s y y t t ä + v a s t e n t a h t o i s i i n + v a s t i k e v a r a t + v a s t i k e v a r o j a + v a s t i k k e i s i i n + v a s t i k k e i s s a + v a s t i n e e k s i + v a s t i n e e n a + v a s t i n e o i k e u d e n + v a s t i n e o i k e u d e s t a + v a s t i n e o i k e u s + v a s t i n e o i k e u t e e n + v a s t i n e o i k e u t t a + v a s t i n e t t a + v a s t o i n k ä y m i s e t + v a s t o i n k ä y m i s i s s ä + v a s t o i n k ä y m i s i s s ä k i n + v a s t o i n k ä y m i s i s t ä + v a s t o i n k ä y m i s i s t ä ä n + v a s t o i n k ä y m i s i ä + v a s t o i n k ä y m i s t e n + v a s t o i n k ä y m i s t ä + v a s t u i d e n + v a s t u i d e n j a k o + v a s t u i t a + v a s t u k s e s t a + v a s t u s h i t s a u s + v a s t u s t a a + v a s t u s t a a k s e e n + v a s t u s t a a k s e m m e + v a s t u s t a a k s e n i + v a s t u s t a e s s a a n + v a s t u s t a e s s a m m e + v a s t u s t a e s s a n i + v a s t u s t a i s i + v a s t u s t a i s i m m e + v a s t u s t a i s i v a t + v a s t u s t a j a n + v a s t u s t a j a n s a + v a s t u s t a j a t + v a s t u s t a j i a + v a s t u s t a j i a a n + v a s t u s t a j i e n + v a s t u s t a j i e n s a + v a s t u s t a j i i n + v a s t u s t a j i l t a a n + v a s t u s t a k a a m m e + v a s t u s t a m a a n + v a s t u s t a m a l l a + v a s t u s t a m a m m e + v a s t u s t a m a n i + v a s t u s t a m a t t a + v a s t u s t a m i s e k s i + v a s t u s t a m i s e s t a + v a s t u s t a m i s t a + v a s t u s t a m m e + v a s t u s t a m m e k i n + v a s t u s t a m m e k o + v a s t u s t a n + v a s t u s t a n e e t + v a s t u s t a n u t + v a s t u s t a v a l l a + v a s t u s t a v a m m e + v a s t u s t a v a n + v a s t u s t a v a n i + v a s t u s t a v a n s a + v a s t u s t a v a t + v a s t u s t a v a t k o + v a s t u s t a v i a + v a s t u s t e l e m a t t a + v a s t u s t e t a + v a s t u s t e t a a n + v a s t u s t e t a a n k o + v a s t u s t e t t a i s i i n + v a s t u s t e t t i i n + v a s t u s t e t t i i n k o + v a s t u s t e t t u + v a s t u s t e t t u a a n + v a s t u s t i + v a s t u s t i m m e + v a s t u s t i n + v a s t u s t i v a t + v a s t u s t u k s e e n + v a s t u s t u k s e n + v a s t u s t u k s e n i l m a u s + v a s t u s t u k s e n s a + v a s t u s t u k s e s t a + v a s t u s t u k s e s t a a n + v a s t u s t u k s e t t a + v a s t u s t u s k e i n o n s a + v a s t u s t u s k y k y + v a s t u s t u s k y k y g e e n i + v a s t u s t u s k y k y i s e m m i k s i + v a s t u s t u s k y k y i s e m m ä n + v a s t u s t u s k y k y i s e m p i + v a s t u s t u s k y k y i s i k s i + v a s t u s t u s k y k y i s t e n + v a s t u s t u s k y k y m m e + v a s t u s t u s k y k y o n g e l m a n + v a s t u s t u s k y k y ä + v a s t u s t u s k y v y n + v a s t u s t u s k y v y s t ä + v a s t u s t u s m e n e t t e l y s s ä + v a s t u s t u s o i k e u d e n + v a s t u s t u s t a + v a s t u s t u s t a k i n + v a s t u s t u s v ä l i n e i t ä + v a s t u u a i k a n a n i + v a s t u u a i k o j a + v a s t u u a j a n + v a s t u u a l a + v a s t u u a l a a n + v a s t u u a l a a n n e + v a s t u u a l a i n e n + v a s t u u a l a l l a n n e h a n + v a s t u u a l a n + v a s t u u a l a n i + v a s t u u a l a t + v a s t u u a l o i l l a m m e + v a s t u u a l o i l l a n n e + v a s t u u a l o i l l e + v a s t u u a l o i s t a + v a s t u u a l o j a + v a s t u u a l o j e m m e + v a s t u u a l o j e n + v a s t u u a l u e + v a s t u u a l u e e l l a a n + v a s t u u a l u e e l l a n i + v a s t u u a l u e e l l a n n e + v a s t u u a l u e e l t a + v a s t u u a l u e e l t a m m e + v a s t u u a l u e e m m e + v a s t u u a l u e e n + v a s t u u a l u e e n s a + v a s t u u a l u e e s e e n + v a s t u u a l u e e s e e n i + v a s t u u a l u e e s e e n n e + v a s t u u a l u e e t + v a s t u u a l u e i l l a a n + v a s t u u a l u e i s i i n + v a s t u u a l u e i s i i n i + v a s t u u a l u e i s t a + v a s t u u a l u e i s t a n i + v a s t u u a l u e i t a + v a s t u u a l u e j a k o o n + v a s t u u a l u e t t a + v a s t u u a l u e t t a a n + v a s t u u a s e m a + v a s t u u a s e m a a n + v a s t u u a s e m a s s a + v a s t u u a s e m i i n + v a s t u u a s i o i t a + v a s t u u d i r e k t i i v i + v a s t u u e l i m i ä + v a s t u u h e n k i l ö + v a s t u u h e n k i l ö i d e n + v a s t u u h e n k i l ö i h i n + v a s t u u h e n k i l ö i l l e + v a s t u u h e n k i l ö i t ä + v a s t u u h e n k i l ö n + v a s t u u h e n k i l ö t + v a s t u u h e n k i l ö ä + v a s t u u j a k o + v a s t u u j a k o a + v a s t u u j a o l l a + v a s t u u j ä r j e s t e l m i e n + v a s t u u j ä r j e s t e l m ä + v a s t u u j ä r j e s t e l m ä n + v a s t u u j ä r j e s t e l m ä s s ä + v a s t u u j ä r j e s t e l m ä s t ä + v a s t u u j ä r j e s t e l m ä ä + v a s t u u j ä r j e s t e l m ä ä n + v a s t u u j ä r j e s t e l y + v a s t u u k e t j u + v a s t u u k e t j u a + v a s t u u k e t j u n + v a s t u u k e t j u s t a + v a s t u u k i n + v a s t u u k r i i s i + v a s t u u k u l t t u u r i a + v a s t u u k u l t t u u r i n + v a s t u u k y s y m y k s e n + v a s t u u k y s y m y k s e s t ä + v a s t u u k y s y m y k s e t + v a s t u u k y s y m y k s i i n + v a s t u u k y s y m y k s i s s ä + v a s t u u k y s y m y k s i s t ä + v a s t u u k y s y m y k s i ä + v a s t u u k y s y m y s + v a s t u u k y s y m y s t e n + v a s t u u k y s y m y s t ä + v a s t u u l a i n + v a s t u u l a i n s ä ä d ä n n ö s t ä + v a s t u u l a k e j a + v a s t u u l a k i + v a s t u u l a u s e k e + v a s t u u l a u s e k e t t a + v a s t u u l l a + v a s t u u l l a a n + v a s t u u l l a m m e + v a s t u u l l a n i + v a s t u u l l a n n e + v a s t u u l l e + v a s t u u l l e e n + v a s t u u l l e n i + v a s t u u l l e n n e + v a s t u u l l i s e e n + v a s t u u l l i s e k s i + v a s t u u l l i s e l l a + v a s t u u l l i s e m m a l l a + v a s t u u l l i s e m m a l l e + v a s t u u l l i s e m m a n + v a s t u u l l i s e m m i k s i + v a s t u u l l i s e m m i n + v a s t u u l l i s e m p a a + v a s t u u l l i s e m p a a n + v a s t u u l l i s e m p i + v a s t u u l l i s e m p i a + v a s t u u l l i s e n + v a s t u u l l i s e n a + v a s t u u l l i s e s t a + v a s t u u l l i s e t + v a s t u u l l i s i a + v a s t u u l l i s i i n + v a s t u u l l i s i k s i + v a s t u u l l i s i m m a k s i + v a s t u u l l i s i n a + v a s t u u l l i s i s s a + v a s t u u l l i s t a k a a n + v a s t u u l l i s t e n + v a s t u u l l i s u u d e n + v a s t u u l l i s u u d e s s a + v a s t u u l l i s u u d e s t a + v a s t u u l l i s u u s p e r i a a t e t t a + v a s t u u l l i s u u t e e n + v a s t u u l l i s u u t t a + v a s t u u l t a m m e + v a s t u u m a k s u + v a s t u u m e k a n i s m e i s t a + v a s t u u m e k a n i s m e j a + v a s t u u m e k a n i s m i e n + v a s t u u m e k a n i s m i t + v a s t u u m e n e t t e l y n + v a s t u u m m e + v a s t u u n + v a s t u u n a l a i s e m p i a + v a s t u u n a l a i s u u d e s t a + v a s t u u n a l a i s u u t e e n + v a s t u u n i + v a s t u u n j a k a m i s e n + v a s t u u n j a k o + v a s t u u n j a k o a + v a s t u u n j a k o e h d o t u k s e n + v a s t u u n j a k o j a + v a s t u u n j a k o j ä r j e s t e l m ä ä n + v a s t u u n j a k o o n + v a s t u u n j a k o p e r i a a t t e e n + v a s t u u n j a k o s i t o u m u k s e n s a + v a s t u u n j a k o v a l m i u t e m m e + v a s t u u n j a o n + v a s t u u n j a o s t a + v a s t u u n k a n n o s t a + v a s t u u n k a n t a j a t + v a s t u u n k a n t a j i n a + v a s t u u n k a n t o a + v a s t u u n k a n t o p r o s e s s i i n + v a s t u u n n e + v a s t u u n o t o s t a + v a s t u u n o t t o + v a s t u u n o t t o a + v a s t u u n p a k o i l u + v a s t u u n p a k o i l u a + v a s t u u n p a k o i l u s t a + v a s t u u n p a k o i l u u n + v a s t u u n p u u t e + v a s t u u n s a + v a s t u u n s i i r r o s t a + v a s t u u n s i i r t o + v a s t u u n t u n n e + v a s t u u n t u n n e t t a + v a s t u u n t u n n o k s i + v a s t u u n t u n n o l l a + v a s t u u n t u n n o l l e + v a s t u u n t u n n o n + v a s t u u n t u n n o s t a + v a s t u u n t u n n o s t a a n + v a s t u u n t u n n o t t o m i e n + v a s t u u n t u n n o t t o m u u s + v a s t u u n t u n t o + v a s t u u n t u n t o a + v a s t u u n t u n t o a a n + v a s t u u n t u n t o a m m e + v a s t u u n t u n t o i n e n + v a s t u u n t u n t o i s e m m a l l a + v a s t u u n t u n t o i s e m p a a + v a s t u u n t u n t o i s e m p i + v a s t u u n t u n t o i s e m p i a + v a s t u u n t u n t o i s e n a + v a s t u u n t u n t o i s e s t a + v a s t u u n t u n t o i s e s t i + v a s t u u n t u n t o i s i k s i + v a s t u u n t u n t o i s i n a + v a s t u u n t u n t o i s t a + v a s t u u n t u n t o i s t e n + v a s t u u n t u n t o i s u u s + v a s t u u n t u n t o i s u u t e n s a + v a s t u u n t u n t o m m e + v a s t u u n t u n t o n s a + v a s t u u n t u n t o o m m e + v a s t u u n t u n t o o n + v a s t u u n t u n t o o n n e + v a s t u u n t u n t u a + v a s t u u n t ä y t e i s e n + v a s t u u n ä k ö k o h d a n + v a s t u u o n g e l m a t + v a s t u u p e r i a a t e + v a s t u u p e r i a a t e t t a + v a s t u u p e r i a a t t e e l l a + v a s t u u p e r i a a t t e e n + v a s t u u p o l i t i i k k a a + v a s t u u p o l i t i i k k a a n + v a s t u u r a h a s t o + v a s t u u r a k e n t e i d e n + v a s t u u r a p o r t t i + v a s t u u r i s k e j ä + v a s t u u r i s k i t + v a s t u u s e e n + v a s t u u s s a + v a s t u u s t a + v a s t u u s t a a n + v a s t u u s t a m m e + v a s t u u s u h t e e t + v a s t u u s ä ä d ö k s i l l ä + v a s t u u s ä ä n n ö i s t ä + v a s t u u s ä ä n n ö k s i e n + v a s t u u s ä ä n n ö k s i ä + v a s t u u s ä ä n n ö s t e n + v a s t u u s ä ä n n ö s t ö n + v a s t u u s ä ä n t ö j e n + v a s t u u s ä ä n t ö j ä + v a s t u u t + v a s t u u t a + v a s t u u t a a k a n + v a s t u u t a a k k a + v a s t u u t a a k k a a + v a s t u u t a a n + v a s t u u t a m m e + v a s t u u t a n n e + v a s t u u t a s o + v a s t u u t a s o i l l a + v a s t u u t a s o j a + v a s t u u t a s o l l a + v a s t u u t a s o l l e + v a s t u u t a s o n + v a s t u u t e h t ä v i e n + v a s t u u t e h t ä v i i n + v a s t u u t e h t ä v i s s ä + v a s t u u t e h t ä v i ä + v a s t u u t e h t ä v ä + v a s t u u t e h t ä v ä s t ä n i + v a s t u u t e h t ä v ä ä m m e + v a s t u u t e o r i a a n + v a s t u u t o i m e n p i t e e k s i + v a s t u u t o n t a + v a s t u u t t o m a a n + v a s t u u t t o m a l t a + v a s t u u t t o m a m m i n + v a s t u u t t o m a m p a a + v a s t u u t t o m a m p i a + v a s t u u t t o m a n + v a s t u u t t o m a s t a + v a s t u u t t o m a t + v a s t u u t t o m i a + v a s t u u t t o m i e n + v a s t u u t t o m i i n + v a s t u u t t o m i n t a + v a s t u u t t o m i s t a + v a s t u u t t o m u u d e n + v a s t u u t t o m u u d e s t a + v a s t u u t t o m u u t e e n + v a s t u u t t o m u u t t a + v a s t u u v a a t i m u k s e t + v a s t u u v a k u u t u k s e n + v a s t u u v a k u u t u k s e s s a + v a s t u u v a k u u t u k s e s t a + v a s t u u v a k u u t u k s e t + v a s t u u v a k u u t u k s i a + v a s t u u v a k u u t u s + v a s t u u v a k u u t u s t a + v a s t u u v a l i o k u n n a n + v a s t u u v a l i o k u n t a + v a s t u u v a p a u d e n + v a s t u u v a p a u d e s t a + v a s t u u v a p a u s + v a s t u u v a p a u s e s i t t e l i j ä n + v a s t u u v a p a u s k e r t o m u k s e s s a + v a s t u u v a p a u s k e s k u s t e l u a + v a s t u u v a p a u s k e s k u s t e l u s s a + v a s t u u v a p a u s k e s k u s t e l u s t a + v a s t u u v a p a u s k o n e i s t o o n + v a s t u u v a p a u s k y s y m y k s e e n + v a s t u u v a p a u s k y s y m y k s e s s ä + v a s t u u v a p a u s l a u s u n n o n + v a s t u u v a p a u s m e n e t t e l y + v a s t u u v a p a u s m e n e t t e l y i d e n + v a s t u u v a p a u s m e n e t t e l y i h i n + v a s t u u v a p a u s m e n e t t e l y i s s ä k i n + v a s t u u v a p a u s m e n e t t e l y j e n + v a s t u u v a p a u s m e n e t t e l y j ä + v a s t u u v a p a u s m e n e t t e l y l l e + v a s t u u v a p a u s m e n e t t e l y l l ä + v a s t u u v a p a u s m e n e t t e l y n + v a s t u u v a p a u s m e n e t t e l y s s ä + v a s t u u v a p a u s m e n e t t e l y s s ä m m e + v a s t u u v a p a u s m e n e t t e l y s t ä + v a s t u u v a p a u s m e n e t t e l y y n + v a s t u u v a p a u s m e n e t t e l y ä + v a s t u u v a p a u s m i e t i n n ö i s s ä + v a s t u u v a p a u s m i e t i n n ö n + v a s t u u v a p a u s m i e t i n n ö s s ä + v a s t u u v a p a u s m i e t i n n ö t + v a s t u u v a p a u s m i e t i n t ö + v a s t u u v a p a u s m i e t i n t ö j ä m m e + v a s t u u v a p a u s m i e t i n t ö ä + v a s t u u v a p a u s m i e t i n t ö ö n + v a s t u u v a p a u s p r o s e s s i + v a s t u u v a p a u s p r o s e s s i i n + v a s t u u v a p a u s p r o s e s s i n + v a s t u u v a p a u s p r o s e s s i s s a + v a s t u u v a p a u s p ä ä t ö k s e n + v a s t u u v a p a u s p ä ä t ö k s e s s ä + v a s t u u v a p a u s p ä ä t ö k s e t + v a s t u u v a p a u s p ä ä t ö s + v a s t u u v a p a u s p ä ä t ö s t e n + v a s t u u v a p a u s s u o s i t u s t a + v a s t u u v a p a u s v ä l i n e e s e e n + v a s t u u v a p a u s v ä l i n e t t ä + v a s t u u v a p a u s ä ä n e s t y k s i s t ä + v a s t u u v a p a u s ä ä n e s t y s + v a s t u u v a p a u s ä ä n e s t y s t ä + v a s t u u v a p a u t t a + v a s t u u v a p a u t u s m e n e t t e l y + v a s t u u v a p a u t u s t a + v a s t u u v e l v o l l i s e m m a n + v a s t u u v e l v o l l i s e m p i + v a s t u u v e l v o l l i s e t + v a s t u u v e l v o l l i s i a + v a s t u u v e l v o l l i s u u d e n + v a s t u u v e l v o l l i s u u d e s t a + v a s t u u v e l v o l l i s u u s + v a s t u u v e l v o l l i s u u s j ä r j e s t e l m ä s t ä + v a s t u u v e l v o l l i s u u s k o m i s s i o + v a s t u u v e l v o l l i s u u s k y s y m y k s e l l e + v a s t u u v e l v o l l i s u u s m e k a n i s m i a + v a s t u u v e l v o l l i s u u t e n s a + v a s t u u v e l v o l l i s u u t t a + v a s t u u v i r a n o m a i n e n + v a t i k a a n i + v a t i k a a n i i n + v a t i k a a n i k a a n + v a t i k a a n i n + v a t i k a a n i s t a + v a t i k a a n i v a l t i o + v a t i k a a n i v a l t i o n + v a t i k a a n i v a l t i o o n + v a t i k a a n i v a l t i o s s a + v a t i k a a n i v a l t i o t a + v a t s a h a a v a n + v a t s a h u u h t e l u + v a t s a k i p u + v a t s a k i p u j a + v a t s a l a u k u n k i e r t y m ä + v a t s a l i h a k s e t + v a t s a l i h a s l i i k e + v a t s a o n t e l o + v a t s a s y ö p ä + v a t s a s y ö p ä ä + v a t s a t u l e h d u k s i s t a + v a t s a v a i v o i s t a + v a t s a v a i v o j a + v a t s o i n + v a t t i m e r i + v a t t u k u o r i a i n e n + v a t t u l a s i s i i p i + v a t v o a + v a u h d i k k a i t a + v a u h d i n + v a u h d i s s a + v a u h d i s t a + v a u h d i t e t a a n + v a u h d i t e t t a v a + v a u h d i t e t t a v a t + v a u h d i t e t t i i n + v a u h d i t t a a + v a u h d i t t a a k s e e n + v a u h d i t t a a k s e m m e + v a u h d i t t a i s i + v a u h d i t t a j a n a + v a u h d i t t a m a a n + v a u h d i t t a m i n e n + v a u h d i t t a m i s e k s i + v a u h d i t t a m i s e s s a + v a u h d i t t a m i s e s t a + v a u h d i t t a m i s k a m p a n j a a n + v a u h d i t t a m i s t a + v a u h d i t t a n e e t + v a u h d i t t a n u t + v a u h d i t t a v a t + v a u h d i t t i + v a u h d i t t u n u t + v a u h d i t t u u + v a u h d i t u s k o n f e r e n s s i n + v a u h t i a + v a u h t i i n + v a u h t i p i r u + v a u n u i s s a + v a u n u j a m m e + v a u n u k u o r m a n + v a u n u m a t e r i a a l i e n + v a u r a a m m a k s i + v a u r a a m m a n + v a u r a a m m a s t a + v a u r a a m m a t + v a u r a a m m i k s i + v a u r a a m m i l l e + v a u r a a m m i l t a + v a u r a a m p a a + v a u r a a m p a a n + v a u r a a m p i + v a u r a a m p i a + v a u r a a m p i e n + v a u r a a m p i i n + v a u r a i d e n + v a u r a i m m a t + v a u r a i m m i l l e + v a u r a i m m i s t a + v a u r a i m p i a + v a u r a i m p i i n + v a u r a i s s a + v a u r a i s t a + v a u r a s t u a + v a u r a s t u e s s a + v a u r a s t u i + v a u r a s t u m i s t a + v a u r a s t u u + v a u r a s t u v a s t a + v a u r a s t u v a t + v a u r a u d e n + v a u r a u d e s s a + v a u r a u d e s t a + v a u r a u s e r o t + v a u r a u s k u i l u a + v a u r a u s t a s o + v a u r a u s t a s o m m e + v a u r a u t e e n + v a u r a u t t a + v a u r i o i s t a + v a u r i o i t t a v i e n + v a u r i o i t t a v i s t a + v a u r i o i t t i + v a u v a l u u k k u + v a u v a n + v a u v a n a s k e l e e n + v a u v a n r u o a n + v a u v a n r u o k a a + v a u v a n r u o k a a n + v a u v a r o k k o + v a u v a t + v a u v a u i n t i + v a u v a v a p a a + v a u v o j e n + v e d e l l ä + v e d e n + v e d e n a l a i s i a + v e d e n a l a i s t a + v e d e n h a n k i n n a n + v e d e n h i n n o i t t e l u n + v e d e n h u o l l o n + v e d e n j a k a j a + v e d e n j a k a j i i n + v e d e n j a k e l u + v e d e n j a k e l u a + v e d e n j a k e l u j ä r j e s t e l m i e n + v e d e n j a k e l u j ä r j e s t e l m i i n + v e d e n j a k e l u j ä r j e s t e l m i ä + v e d e n j a k e l u j ä r j e s t e l m ä m m e + v e d e n j a k e l u j ä r j e s t e l m ä n + v e d e n j a k e l u j ä r j e s t e l m ä ä n + v e d e n j a k e l u l a i t o k s i l t a + v e d e n j a k e l u n + v e d e n j a k e l u p a l v e l u j e n + v e d e n j a k e l u s s a + v e d e n j a k e l u s t a + v e d e n j a k e l u u n + v e d e n j a k e l u v e r k k o + v e d e n j a l o s t u s t e o l l i s u u d e s s a + v e d e n k a n t a j i a + v e d e n k e i t t i m e n + v e d e n k e r ä y s l a i t o k s i a + v e d e n k e s t ä v ä m p i ä + v e d e n k i e r t o a + v e d e n k o r k e u s + v e d e n k u l u t t a j a n + v e d e n k u l u t u k s e e n + v e d e n k u l u t u k s e n + v e d e n k u l u t u k s e s t a + v e d e n k u l u t u s + v e d e n k u l u t u s t a + v e d e n k ä s i t t e l i j ö i d e n + v e d e n k ä s i t t e l y + v e d e n k ä s i t t e l y l a i t o k s i a + v e d e n k ä s i t t e l y l a i t o s t e n + v e d e n k ä s i t t e l y n + v e d e n k ä s i t t e l y t u t k i m u k s e n + v e d e n k ä y t t ö + v e d e n k ä y t t ö m m e + v e d e n k ä y t t ö s u u n n i t e l m a + v e d e n k ä y t t ö s u u n n i t e l m a a + v e d e n k ä y t t ö t a v a t + v e d e n k ä y t t ö ä + v e d e n k ä y t t ö ö n + v e d e n k ä y t ö n + v e d e n k ä y t ö s t ä + v e d e n k ä y t ö s t ä ä n + v e d e n l a a d u n + v e d e n l a a d u s t a + v e d e n l a a t u + v e d e n l a a t u a + v e d e n l a a t u u n + v e d e n l ä m m i t t i m i s t ä + v e d e n n o u s u j a + v e d e n o t o n + v e d e n o t t o p a i k k o i h i n + v e d e n o t t o p i s t e i d e n + v e d e n p a i n e t t a + v e d e n p a i s u m u s + v e d e n p i n n a n + v e d e n p i n n a n k o r k e u d e n + v e d e n p i n n a t + v e d e n p i n t a + v e d e n p i t ä v i ä + v e d e n p i t ä v ä + v e d e n p o i s t o n + v e d e n p u h d i s t a m o j a + v e d e n p u h d i s t u k s e n + v e d e n p u h d i s t u s + v e d e n p u h d i s t u s j ä r j e s t e l m ä t + v e d e n p u h d i s t u s k u s t a n n u k s i a + v e d e n p u h d i s t u s l a i t o k s e t + v e d e n p u h d i s t u s l a i t o k s i a + v e d e n p u h d i s t u s l a i t t e i d e n + v e d e n p u h d i s t u s l a i t t e i s t o a + v e d e n p u h d i s t u s l a i t t e i t a + v e d e n p u h d i s t u s t a b l e t t e j a + v e d e n p u h d i s t u s t a b l e t t i e n + v e d e n p u h d i s t u s y k s i k k ö j ä + v e d e n p u h d i s t u s y k s i k k ö ä + v e d e n p u u t e + v e d e n p u u t e k y s y m y s t ä + v e d e n p u u t e o n g e l m i s t a + v e d e n p u u t e t t a + v e d e n p u u t t e e n + v e d e n p u u t t e e s e e n + v e d e n p u u t t e e s t a + v e d e n s a a n n i l l a + v e d e n s a a n n i n + v e d e n s a a n n i s s a + v e d e n s a a n n i s t a + v e d e n s a a n t i + v e d e n s a a n t i a + v e d e n s a a n t i i n + v e d e n s a a n t i o i k e u k s i a + v e d e n s a a n t i o i k e u t t a + v e d e n s a a n t i o n g e l m a t + v e d e n s i i r t o a + v e d e n s i i r t o j a + v e d e n s i i r t o j e n + v e d e n s i i r t o o n + v e d e n s i t o m i s k y k y y n + v e d e n s u o d a t t i m i e n + v e d e n s y v y y t t ä + v e d e n s ä ä s t ö + v e d e n t a r p e e n + v e d e n t a r v e + v e d e n t a s o a + v e d e n t u o t a n t o k a p a s i t e e t t i a + v e d e n v a r a s t o i n t i + v e d e n v a r a s t o i n t i k y k y ä + v e d e s s ä + v e d e s t ä + v e d e t t y + v e d i m m e + v e d o n l y ö n n i n + v e d o n l y ö n n i s t ä + v e d o n l y ö n n i t + v e d o n l y ö n t i a l a a + v e d o n l y ö n t i i n + v e d o n l y ö n t i k a r t e l l e i h i n + v e d o n l y ö n t i m a r k k i n o i d e n + v e d o n l y ö n t i p a l v e l u i d e n + v e d o n l y ö n t i p a l v e l u j a + v e d o n l y ö n t i p a l v e l u j e n + v e d o n l y ö n t i t o i m i s t o a + v e d o n l y ö n t i t o i m i s t o j a + v e d o n n u t + v e d o t a + v e d o t a a n + v e d o t a k s e n i + v e d o t e n + v e d o t k a a m m e + v e d o t k o + v e d o t t a i s i i n + v e d o t t a v a + v e d o t t u + v e h k e e t + v e h k e i l y y n + v e h n ä a l a l l a + v e h n ä j a u h o + v e h n ä j a u h o j e n + v e h n ä k i u r u + v e h n ä n + v e h n ä o l u t + v e h n ä p e l t o j a + v e h n ä p e r ä i s i ä + v e h n ä p u l a + v e h n ä s a d o n + v e h n ä t e r r i e r i + v e h n ä t o n n i + v e h n ä t o n n i l t a + v e i j a r i r o m a a n i + v e i k k a u s m o n o p o l e j a + v e i s i v ä t + v e i s t o k s i a + v e i s t o t a i t e e s e e n + v e i s u j a + v e i t s e n + v e i t s e n h e i t t o + v e i t s e n t e r ä l l ä + v e i t s e n t e r ä v ä + v e i t s i k a l a + v e i v ä t + v e k s e l i n + v e k s e l i s t ä + v e k t o r i a n a l y y s i + v e k t o r i a v a r u u s + v e k t o r i g r a f i i k k a + v e k t o r i k e n t t ä + v e k t o r i k i m p p u + v e k t o r i p i i r i a n a l y s a a t t o r i + v e l a a r i k l u s i i l i + v e l a l l e + v e l a l l i s t a + v e l a n + v e l a n a l e n n u k s i s t a + v e l a n h a l l i n t a a + v e l a n h a l l i n t a p o l i t i i k k a a + v e l a n h a l l i n t a s t r a t e g i a a n + v e l a n h o i d o n + v e l a n h o i d o s t a a n + v e l a n h o i t o a + v e l a n h o i t o k u s t a n n u s t e n + v e l a n h o i t o k y k y ä + v e l a n h o i t o o n + v e l a n h u o j e n n u k s e s s a + v e l a n h u o j e n n u k s i n a + v e l a n h u o j e n n u s + v e l a n h u o j e n n u s j ä r j e s t e l y t + v e l a n h u o j e n n u s t e n + v e l a n k e s t ä v y y s + v e l a n l y h e n n y k s e e n + v e l a n l y h e n n y s t ä + v e l a n m a k s u a + v e l a n m a k s u l l e + v e l a n m a k s u u n + v e l a n o t t o a + v e l a n o t t o k y k y + v e l a n p e r i n t ä + v e l a n p e r i n t ä ä + v e l a n s i e t o k y v y n + v e l a s t a + v e l a s t a a n + v e l a t + v e l h o k a l a + v e l h o n u o r e t + v e l i p u o l t a + v e l j e k s e t + v e l j e l l i s e m m ä n + v e l j e l l i s e m p ä ä + v e l j e n + v e l j e s j o u k o n + v e l j e s j ä r j e s t ö j e n + v e l j e s k a n s a m m e + v e l j e s k a n s o j e n + v e l j e s m a a + v e l j e s m a a n o s a l l e m m e + v e l j e s m a i d e n + v e l j e s p u o l u e + v e l j e s s o d a n + v e l j e s s o t i e m m e + v e l j e s s o t i e n + v e l j e s s o t i i n + v e l j e s t e n + v e l j e s v a l t i o t a + v e l j e t + v e l j e y d e n + v e l k a a + v e l k a a m m e + v e l k a a n s a + v e l k a a n t u a + v e l k a a n t u m a t t a + v e l k a a n t u m i s a s t e + v e l k a a n t u m i s a s t e e n + v e l k a a n t u m i s a s t e e s e e n + v e l k a a n t u m i s e e n + v e l k a a n t u m i s e n + v e l k a a n t u m i s e s s a + v e l k a a n t u m i s e s t a + v e l k a a n t u m i s k i e r r e + v e l k a a n t u m i s m u o d o t + v e l k a a n t u m i s o n g e l m i i n + v e l k a a n t u m i s r a j a n + v e l k a a n t u n e e t + v e l k a a n t u n e i d e n + v e l k a a n t u n e i l l e + v e l k a a n t u n e i m m i l l e + v e l k a a n t u n e i m m i s t a + v e l k a a n t u n e i s u u s a s t e + v e l k a a n t u n e i t a + v e l k a a n t u u + v e l k a a n t u v a t + v e l k a d y n a m i i k a n + v e l k a e l v y t y k s e s t ä + v e l k a h e l p o t u k s e l l a + v e l k a h e l p o t u k s e n + v e l k a h e l p o t u k s e s t a + v e l k a h e l p o t u k s e t + v e l k a h e l p o t u k s i a + v e l k a h e l p o t u k s i i n + v e l k a h e l p o t u k s i l l a + v e l k a h e l p o t u k s i s t a + v e l k a h e l p o t u s + v e l k a h e l p o t u s a l o i t e + v e l k a h e l p o t u s a l o i t t e e l l a + v e l k a h e l p o t u s e h d o t u k s i a + v e l k a h e l p o t u s k y s y m y k s i s t ä + v e l k a h e l p o t u s m e k a n i s m i e n + v e l k a h e l p o t u s o h j e l m a n + v e l k a h e l p o t u s s t r a t e g i a a n + v e l k a h e l p o t u s t a + v e l k a h e l p o t u s t e n + v e l k a h e l p o t u s t i l i + v e l k a h u o j e n n u k s e e n + v e l k a h u o j e n n u k s e l l a + v e l k a h u o j e n n u k s e n + v e l k a h u o j e n n u k s e t + v e l k a h u o j e n n u k s i a + v e l k a h u o j e n n u k s i l l e + v e l k a h u o j e n n u s + v e l k a h u o j e n n u s a l o i t e + v e l k a h u o j e n n u s h a n k k e e k s i + v e l k a h u o j e n n u s k y s y m y s + v e l k a h u o j e n n u s t a + v e l k a h u o j e n n u s t o i m i e n + v e l k a i n s t r u m e n t t e j a + v e l k a j a r r u + v e l k a j ä r j e s t e l y j ä + v e l k a k a p a s i t e e t t i i n + v e l k a k e l l o + v e l k a k e s t ä v y y t t ä + v e l k a k e v e n n y s + v e l k a k i e r t e e n + v e l k a k i e r t e e s e e n + v e l k a k i r j a a + v e l k a k i r j a j ä r j e s t e l y j e n + v e l k a k i r j a j ä r j e s t e l y n + v e l k a k i r j a m a r k k i n a a + v e l k a k i r j a m a r k k i n o i d e n + v e l k a k i r j a m a r k k i n o i l l a + v e l k a k i r j a m a r k k i n o i l l e + v e l k a k i r j o i h i n + v e l k a k i r j o i l l a + v e l k a k i r j o j a + v e l k a k i r j o j e n + v e l k a k o r k o + v e l k a k r i i s e i h i n + v e l k a k r i i s e i s t ä + v e l k a k r i i s e j ä + v e l k a k r i i s i + v e l k a k r i i s i i n + v e l k a k r i i s i i n s ä + v e l k a k r i i s i n + v e l k a k r i i s i n h a l l i n t a m e k a n i s m i s t a + v e l k a k r i i s i s s ä + v e l k a k r i i s i s t ä + v e l k a k r i i s i s t ä ä n + v e l k a k r i i s i ä + v e l k a k r i t e e r i e n + v e l k a k r i t e e r i i n + v e l k a k r i t e e r i ä + v e l k a k y s y m y k s e e n + v e l k a k y s y m y k s e s t ä + v e l k a k y s y m y k s e t + v e l k a k y s y m y k s i s t ä + v e l k a k y s y m y s + v e l k a k y s y m y s t e n + v e l k a k y s y m y s t ä + v e l k a l e i k k a u k s i a + v e l k a l o u k k u + v e l k a l o u k k u u n + v e l k a l o u k u s t a + v e l k a l u k u j a + v e l k a l u o k i t u k s i s s a + v e l k a l u o k i t u k s i s t a + v e l k a l u v u t + v e l k a m a r k k i n o i d e n + v e l k a m a r k k i n o i l l a + v e l k a m a r k k i n o i l t a + v e l k a m e n e t t e l y j ä + v e l k a m m e + v e l k a m ä ä r i e n + v e l k a m ä ä r ä + v e l k a n e u v o t t e l u i n + v e l k a n s a + v e l k a o n g e l m a + v e l k a o n g e l m a a + v e l k a o n g e l m a a n + v e l k a o n g e l m a n + v e l k a o n g e l m a n s a + v e l k a o n g e l m a s t a + v e l k a o n g e l m a t + v e l k a o n g e l m i a + v e l k a o n g e l m i e n + v e l k a o n g e l m i i n + v e l k a o r j u u t e e n + v e l k a o s a s t o + v e l k a o s u u k s i a + v e l k a p a k e t t i a + v e l k a p a p e r i m a r k k i n o i h i n + v e l k a p e r u s t e + v e l k a p e r u s t e i s i i n + v e l k a p o l i t i i k k a a + v e l k a p o s i t i o t + v e l k a p o t e n t i a a l i n + v e l k a p r o f i i l i + v e l k a r a h o i t t e i s i a + v e l k a r a h o i t u k s e e n + v e l k a r a h o i t u k s e s t a + v e l k a r a k e n t e e n + v e l k a r a s i t t e e s t a + v e l k a r ä s t i e n + v e l k a s a n e e r a u k s e n + v e l k a s a n e e r a u s r a h a s t o l t a + v e l k a s a n e e r a u s t a + v e l k a s e u r a n n a s t a + v e l k a s e u r a n t a a + v e l k a s i t o u m u k s i a + v e l k a s i t o u m u k s i s t a a n + v e l k a s o p i m u k s e t + v e l k a s u h d e + v e l k a s u h d e t t a + v e l k a s u h t e e l l e + v e l k a s u h t e e n + v e l k a s u h t e e s e e n + v e l k a s u m m a + v e l k a s ä ä n n ö i s s ä + v e l k a t a a k a l l e + v e l k a t a a k a n + v e l k a t a a k a s t a + v e l k a t a a k a t + v e l k a t a a k k a + v e l k a t a a k k a a + v e l k a t a a k k a a n + v e l k a t a a k k a a n s a + v e l k a t a a k k a k y s y m y s + v e l k a t a a k k a n s a + v e l k a t a a k k o j a + v e l k a t a a k o i s t a a n + v e l k a t a l o u t e e n + v e l k a t a p a u k s i a + v e l k a t a s o + v e l k a t a s o a + v e l k a t a s o i l l e + v e l k a t a s o j a a n + v e l k a t a s o j e n + v e l k a t a s o n + v e l k a t a s o t + v e l k a t i l a n t e e n + v e l k a t i l a n t e e s e e n + v e l k a t o d e l l i s u u s + v e l k a t o i m i l l e + v e l k a u n i o n i k s i + v e l k a v a a t e i t a + v e l k a v a l v o n t a j ä r j e s t e l m ä ä + v e l k a v i p u t e k i j ä ä n + v e l k a v i r a s t o + v e l k a v i r a s t o a + v e l k a v i r a s t o l l e + v e l k a v i r a s t o s t a + v e l k a v u o r i + v e l k o j a a n + v e l k o j a i n s u o j a a + v e l k o j a m a a + v e l k o j a m a a t + v e l k o j a m a i d e n + v e l k o j a m a i t a + v e l k o j a n + v e l k o j a y r i t y k s i l l e + v e l k o j e m m e + v e l k o j e n + v e l k o j e n k e v e n n y k s e t + v e l k o j e n k e v e n n y k s i n ä + v e l k o j e n s a + v e l k o j i a + v e l k o j i e n + v e l k o j i i n + v e l k o j i l l e + v e l l i t + v e l l o n e e t + v e l o i l l a + v e l o i s t a + v e l o i s t a a n + v e l o i t t a a + v e l o i t t a n e e t + v e l o i t t a v a t + v e l o i t u k s e t t a + v e l o i t u s j ä r j e s t e l m i e n + v e l o i t u s j ä r j e s t e l m ä t + v e l o i t u s k ä y t ä n n ö t + v e l v o i t e k a u d e l l a + v e l v o i t e k a u d e l l e + v e l v o i t e k a u d e n + v e l v o i t e k a u s i + v e l v o i t e k a u t t a + v e l v o i t e o i k e u d e n + v e l v o i t e o i k e u t t a + v e l v o i t e t a a n + v e l v o i t e t a a n h a n + v e l v o i t e t a a n k o + v e l v o i t e t t a + v e l v o i t e t t a m m e + v e l v o i t e t t a v a + v e l v o i t e t t u + v e l v o i t e t t u j a + v e l v o i t t a a + v e l v o i t t a a k s e e n + v e l v o i t t a a k s e m m e + v e l v o i t t a i s i v a t + v e l v o i t t a m a l l a + v e l v o i t t a m a t o n t a + v e l v o i t t a m i n e n + v e l v o i t t a v a a + v e l v o i t t a v a k s i + v e l v o i t t a v a m m a k s i + v e l v o i t t a v a m p i + v e l v o i t t a v a m p i a + v e l v o i t t a v a n + v e l v o i t t a v a t + v e l v o i t t a v i a + v e l v o i t t a v i s t a + v e l v o i t t e e m m e + v e l v o i t t e e n + v e l v o i t t e e n a + v e l v o i t t e e n a m m e + v e l v o i t t e e n s a + v e l v o i t t e e s e e n + v e l v o i t t e e t + v e l v o i t t e i d e n + v e l v o i t t e i d e n s a + v e l v o i t t e i l l a + v e l v o i t t e i s i i n + v e l v o i t t e i s t a + v e l v o i t t e i s t a a n + v e l v o i t t e i t a + v e l v o i t t e i t a a n + v e l v o l l i s i a + v e l v o l l i s u u d e k s e e n + v e l v o l l i s u u d e n t u n n o s t a + v e l v o l l i s u u d e n t u n t o + v e l v o l l i s u u d e n t u n t o a + v e l v o l l i s u u d e n t u n t o a a n + v e l v o l l i s u u d e n t u n t o i s e s t a + v e l v o l l i s u u d e n t u n t o i s e s t i + v e l v o l l i s u u d e n t u n t o i s i m m i s t a + v e l v o l l i s u u d e n t u n t o o m m e + v e l v o l l i s u u d e n t u n t o o n + v e l v o l l i s u u d e s t a + v e l v o l l i s u u d e s t a a n + v e l v o l l i s u u d e s t a m m e + v e l v o l l i s u u d e t + v e l v o l l i s u u k s i a + v e l v o l l i s u u k s i a a n + v e l v o l l i s u u k s i e m m e + v e l v o l l i s u u k s i e n + v e l v o l l i s u u k s i e n i + v e l v o l l i s u u k s i e n s a + v e l v o l l i s u u k s i i n + v e l v o l l i s u u k s i n e e n + v e l v o l l i s u u k s i s t a + v e l v o l l i s u u k s i s t a a n + v e l v o l l i s u u s e t i i k k a + v e l v o l l i s u u s l u o k k a a n + v e l v o l l i s u u s p o h j a l t a + v e l v o l l i s u u t e e n + v e l v o l l i s u u t e m m e + v e l v o l l i s u u t e n a + v e l v o l l i s u u t e n a a n + v e l v o l l i s u u t e n a m m e + v e l v o l l i s u u t e n a n i + v e l v o l l i s u u t e n i + v e l v o l l i s u u t e n n e + v e l v o l l i s u u t e n s a + v e l v o l l i s u u t t a + v e l v o l l i s u u t t a a n + v e n d a t + v e n e a l a a n + v e n e e l l ä + v e n e e n k ä y t t ä j i e n + v e n e e n s ä + v e n e e n ä + v e n e e s s ä + v e n e e s t ä + v e n e e t + v e n e h a u t a u s + v e n e i d e n + v e n e i l l ä + v e n e i t ä + v e n e l a i t u r e i l l e + v e n e l a s t i l l i s i s t a + v e n e p a k o l a i n e n + v e n e p a k o l a i s e t + v e n e p a k o l a i s i a + v e n e p a k o l a i s i l l e + v e n e p a k o l a i s t e n + v e n e r e t k e n ä + v e n e s u k s i + v e n e s u k u p o l v e e n + v e n e t e o l l i s u u d e n + v e n e t r a i l e r i e n + v e n e t s i a l a i s e t + v e n e t t ä + v e n e z u e l a l a i s e t + v e n e z u e l a l a i s i l l a + v e n e z u e l a l a i s t e n + v e n t t i i l e i s t ä + v e n t t i i l i n + v e n y n e e t + v e n y t t ä i s i + v e n y t t ä m ä ä n + v e n ä j ä h ä n + v e n ä j ä k e s k e i n e n + v e n ä j ä k i n + v e n ä j ä l l e + v e n ä j ä l l ä + v e n ä j ä l l ä k i n + v e n ä j ä l t ä + v e n ä j ä n + v e n ä j ä n k i e l i n e n + v e n ä j ä n k i e l i s e e n + v e n ä j ä n k i e l i s e l l e + v e n ä j ä n k i e l i s e n + v e n ä j ä n k i e l i s e s t ä + v e n ä j ä n k i e l i s e t + v e n ä j ä n k i e l i s i i n + v e n ä j ä n k i e l i s i l l e + v e n ä j ä n k i e l i s i ä + v e n ä j ä n k i e l i s t e n + v e n ä j ä n k i e l i s t ä + v e n ä j ä n k i n + v e n ä j ä n k ä ä p i ö h a m s t e r i + v e n ä j ä n m u s t a t e r r i e r i + v e n ä j ä n r a v u r i + v e n ä j ä n s i n i n e n + v e n ä j ä n s p a n i e l i + v e n ä j ä n s u h t e i d e m m e + v e n ä j ä n v a s t a i n e n + v e n ä j ä s t ä + v e n ä j ä ä + v e n ä j ä ä n + v e n ä l ä i s a s u k k a i d e n + v e n ä l ä i s d i p l o m a a t t i a + v e n ä l ä i s e s s ä + v e n ä l ä i s e t + v e n ä l ä i s e t k i n + v e n ä l ä i s e t k ä ä n + v e n ä l ä i s i l l e + v e n ä l ä i s i s s ä + v e n ä l ä i s i s t ä + v e n ä l ä i s i ä + v e n ä l ä i s j o u k k o j e n + v e n ä l ä i s j o u k o i l l a + v e n ä l ä i s j o u k o i l l e + v e n ä l ä i s j o u k o t + v e n ä l ä i s j ä s e n e t + v e n ä l ä i s k u m p p a n e i t a m m e + v e n ä l ä i s m a f i a n + v e n ä l ä i s m i e l i n e n + v e n ä l ä i s m i e l i s e t + v e n ä l ä i s n a i s e n + v e n ä l ä i s r y h m i s t ä + v e n ä l ä i s s a n k a r i + v e n ä l ä i s s o t i l a a t + v e n ä l ä i s s o t i l a i d e n + v e n ä l ä i s s y n t y i s t e n + v e n ä l ä i s t a n k k i a + v e n ä l ä i s t e n + v e n ä l ä i s t ä m i s p o l i t i i k a n + v e n ä l ä i s t ä m i s p o l i t i i k k a a + v e n ä l ä i s t ä m i s p r o s e s s i s t a + v e n ä l ä i s v a l t u u s k u n n a n + v e n ä l ä i s v a s t a i n e n + v e n ä l ä i s v a s t a i s i a + v e n ä l ä i s v a s t a i s i k s i + v e n ä l ä i s v a s t a i s u u d e k s i + v e n ä l ä i s v a s t a i s u u s + v e n ä l ä i s v i r k a m i e h e l l e + v e n ä l ä i s v i r k a m i e h i l l e + v e n ä l ä i s v ä e s t ö n + v e n ä l ä i s v ä e s t ö ä + v e n ä l ä i s v ä h e m m i s t ö + v e n ä l ä i s v ä h e m m i s t ö i l l e + v e n ä l ä i s v ä h e m m i s t ö j e n + v e n ä l ä i s v ä h e m m i s t ö l l e + v e n ä l ä i s v ä h e m m i s t ö n + v e n ä l ä i s v ä h e m m i s t ö t + v e n ä l ä i s v ä h e m m i s t ö ä + v e n ä l ä i s v ä h e m m i s t ö ö n + v e r e e m m e + v e r e e n + v e r e l l ä + v e r e n + v e r e n h i m o a + v e r e n h i m o s t a a n + v e r e n h y y t y m i s t e k i j ä n + v e r e n j a n o l t a + v e r e n k i e r t o + v e r e n k i e r t o e l i m i s t ö n + v e r e n k i e r t o h ä i r i ö t + v e r e n k i e r t o j ä r j e s t e l m ä n + v e r e n k i e r t o j ä r j e s t e l m ä s s ä + v e r e n l u o v u t t a j a + v e r e n l u o v u t t a j a t + v e r e n l u o v u t t a j i a + v e r e n l u o v u t t a j i e n + v e r e n l u o v u t t a j i k s i + v e r e n l u o v u t u k s e e n + v e r e n l u o v u t u k s e n + v e r e n l u o v u t u k s e s s a + v e r e n l u o v u t u k s e s t a + v e r e n l u o v u t u s + v e r e n l u o v u t u s j ä r j e s t e l m ä s t ä + v e r e n l u o v u t u s p a l v e l u s t a + v e r e n l u o v u t u s p i s t e i l l e + v e r e n l u o v u t u s t a + v e r e n l u o v u t u s t e n + v e r e n m y r k y t y k s i i n + v e r e n p a i n e + v e r e n p a i n e e n + v e r e n p a i n e e s e e n + v e r e n p a i n e e s e e n s a + v e r e n p a i n e e s t a + v e r e n p a i n e e s t a a n + v e r e n p a i n e l ä ä k e + v e r e n p a i n e m i t t a r e i h i n + v e r e n p a i n e m i t t a r i t + v e r e n p a i n e t a u d i n + v e r e n p a i n e t t a + v e r e n p a i n e t t a a n + v e r e n p a i n e t t a n n e + v e r e n p u n a i s e s t a + v e r e n s i i r r o i s s a + v e r e n s i i r r o n + v e r e n s i i r t o + v e r e n s i i r t o a + v e r e n s i i r t o j a + v e r e n s i i r t o j e n + v e r e n s i i r t o k e s k u k s e t + v e r e n s i i r t o k e t j u + v e r e n s i i r t o k e t j u a + v e r e n s i i r t o k e t j u n + v e r e n s i i r t o k e t j u s s a + v e r e n s i i r t o o n + v e r e n s i i r t o p a l v e l u i h i n + v e r e n s i i r t o p a l v e l u j a + v e r e n s o k e r i + v e r e n s o k e r i m i t t a r i + v e r e n v u o d a t u k s e e n + v e r e n v u o d a t u k s e l t a + v e r e n v u o d a t u k s e n + v e r e n v u o d a t u k s e s t a + v e r e n v u o d a t u s + v e r e n v u o d a t u s t a + v e r e n v u o t o k u u m e + v e r e n v u o t o t a u t i a + v e r e s s ä + v e r e s s ä ä n + v e r e t t ö m ä s t ä + v e r h o a a + v e r h o a m a + v e r h o p i l v i + v e r i a p i l a + v e r i a p p e l s i i n e j a + v e r i a p p e l s i i n i + v e r i d i r e k t i i v i n + v e r i h a p e r o + v e r i h e l t t a s e i t i k k i + v e r i h e r k k u s i e n i + v e r i j o h d a n n a i s t e n + v e r i j u o t i k a s + v e r i k o e + v e r i k o k e e n + v e r i k o k e e s e e n + v e r i k o k e e s t a + v e r i k o k e e t + v e r i k o k e i d e n + v e r i k o k e i l l a + v e r i k o k e i t a + v e r i k o r e n t o + v e r i k o s t o + v e r i k o s t o o n + v e r i k o s t o s s a + v e r i k u r j e n p o l v i + v e r i k ä n n y k ä t + v e r i l u d e + v e r i l ö y l y + v e r i l ö y l y i h i n + v e r i l ö y l y i k s i + v e r i l ö y l y j a k s o n + v e r i l ö y l y j ä + v e r i l ö y l y k s i + v e r i l ö y l y l l e + v e r i l ö y l y n + v e r i l ö y l y s t ä + v e r i l ö y l y t + v e r i l ö y l y y n + v e r i m a k k a r a + v e r i m a r k k i n o i d e n + v e r i n ä y t t e i d e n + v e r i o m a v a r a i s u u t t a + v e r i o p p i + v e r i p a l v e l u j ä r j e s t e l m ä ä n + v e r i p a l v e l u l a i t o k s i l l e + v e r i p a n k e i s s a + v e r i p a n k i n + v e r i p a n k k e j a + v e r i p a n k k i a + v e r i p e i p p i + v e r i p i s a r a a + v e r i p l a s m a + v e r i p l a s m a a + v e r i p l a s m a n + v e r i p l a s m a s t a + v e r i p l a s m a t u o t t e i t a + v e r i p o l i t i i k a s t a a n + v e r i p r o t e i i n e j a + v e r i p u n a k ä m m e k k ä + v e r i p u s s i e n + v e r i p u s s i t + v e r i r a h a a + v e r i r a h a t + v e r i r y h m i e n + v e r i r y h m ä + v e r i r y h m ä j ä r j e s t e l m ä + v e r i s e l l ä + v e r i s e m p i ä + v e r i s e n + v e r i s e s t ä + v e r i s e t + v e r i s i i n + v e r i s i m m i s t ä + v e r i s i m m ä s t ä + v e r i s i n + v e r i s i s t ä + v e r i s i t e i s i i n + v e r i s i ä + v e r i s o l u + v e r i s o l u j a + v e r i s o l u j e n + v e r i s o v i t u s + v e r i s t e n + v e r i s t r a t e g i a a n + v e r i s u n n u n t a i + v e r i s u n n u n t a i n a + v e r i s u o n i + v e r i s u o n i h ä i r i ö i t ä + v e r i s u o n i s a i r a u d e t + v e r i s u o n i s a i r a u k s i a + v e r i s u o n i s a i r a u k s i e n + v e r i s u o n i s a i r a u k s i i n + v e r i s u o n i s a i r a u k s i l t a + v e r i s u o n i s a i r a u k s i s t a + v e r i s u o n i s a i r a u s k u o l l e i s u u s + v e r i s u o n i t a u d e i s t a + v e r i s u o n i t a u d i n + v e r i s u o n i t a u d i t + v e r i s u o n i t a u t e i h i n + v e r i s u o n i t a u t e j a + v e r i s u o n i t a u t i e n + v e r i s u o n i t a u t i i n + v e r i s u o n i t a u t i p o t i l a a t + v e r i s u o n i t u k o k s e e n + v e r i s u o n i t u k o k s e s t a + v e r i s u o n i t u k o k s i i n + v e r i s u o n i t u k o k s i s t a + v e r i s u o n i t u k o s r i s k e i s t ä + v e r i s u o n i t u k o s t e n + v e r i s u o n t e n + v e r i s y ö v ä n + v e r i t a n k k a u s + v e r i t a t t i + v e r i t a u t e j a + v e r i t i k k a + v e r i t i m a n t e i l l a + v e r i t i m a n t i t + v e r i t i m a n t t i + v e r i t i m a n t t i e n + v e r i t u o t t e i d e n + v e r i t u o t t e i l l e + v e r i t u o t t e i s i i n + v e r i t ö y h t ö k a r d i n a a l i + v e r i u l o s t e + v e r i v a l a + v e r i v a l m i s t e i d e n + v e r i v a l m i s t e i l l e + v e r i v a l m i s t e i t a + v e r i v a l m i s t e p a l v e l u u n + v e r i v a m p y y r i t + v e r i v a r a s t o j e m m e + v e r i v e l j e t + v e r i v e l k a + v e r i v i h o l l i s i a a n + v e r i v i l j e l y + v e r k k a i s e m m a s s a + v e r k k a i s e m p a a n + v e r k k o a + v e r k k o a h d i s t e l u n + v e r k k o a i n e i s t o o n + v e r k k o a l u e t u n n u k s i s t a + v e r k k o a l u k s e t + v e r k k o a l u s t a l l a + v e r k k o a p t e e k e i s t a + v e r k k o a p t e e k k i e n + v e r k k o a v a r u u d e n + v e r k k o b a r b i + v e r k k o b l o g i e n + v e r k k o d e m o k r a t i a a + v e r k k o e s t o t t o m u u s + v e r k k o f o o r u m e i l l a + v e r k k o f o o r u m e i s s a + v e r k k o g a l l e r i a + v e r k k o h a l l i n t o a + v e r k k o h a n k k e i l t a + v e r k k o h a n k k e i s i i n + v e r k k o h u u t o k a u p p a + v e r k k o h u u t o k a u p p o i h i n + v e r k k o h u u t o k a u p p o j a + v e r k k o h y v ä k s i k ä y t t ö ä + v e r k k o h y ö k k ä y k s e n + v e r k k o h y ö k k ä y k s e t + v e r k k o h y ö k k ä y k s i i n + v e r k k o h y ö k k ä y k s i l l e + v e r k k o h y ö k k ä y k s i s t ä + v e r k k o h y ö k k ä y k s i ä + v e r k k o h y ö k k ä y s + v e r k k o h y ö k k ä y s t e n + v e r k k o i h i m m e + v e r k k o i h i n + v e r k k o i n f r a s t r u k t u u r e i h i n + v e r k k o i n f r a s t r u k t u u r i e n + v e r k k o i n f r a s t r u k t u u r i i n + v e r k k o i n f r a s t r u k t u u r i n + v e r k k o i s k u i l t a + v e r k k o i s k u j a + v e r k k o j a + v e r k k o j a k e l u n + v e r k k o j e n + v e r k k o j ä n n i t e + v e r k k o j ä n n i t t e e t + v e r k k o j ä r j e s t e l m i e n + v e r k k o j ä r j e s t e l m ä + v e r k k o k a l v o r a p p e u m a + v e r k k o k a p a s i t e e t i l l e + v e r k k o k a p a s i t e e t t e j a + v e r k k o k a p a s i t e e t t i a + v e r k k o k a u p a n + v e r k k o k a u p a n k ä y n n i s s ä + v e r k k o k a u p a n k ä y n n i s t ä + v e r k k o k a u p a n k ä y n t i + v e r k k o k a u p a n k ä y n t i i n + v e r k k o k a u p a n k ä y n t i ä + v e r k k o k a u p a s t a + v e r k k o k a u p o i s s a + v e r k k o k a u p o i s t a + v e r k k o k a u p p a + v e r k k o k a u p p a a + v e r k k o k a u p p a a n + v e r k k o k a u p p a m a r k k i n o i l l e + v e r k k o k a u p p a m a r k k i n o i s t a + v e r k k o k a u p p a p a l v e l u j e n + v e r k k o k a u p p a s o v e l l u k s i a + v e r k k o k a u p p a t i l a u k s i s t a + v e r k k o k a u p p i a i d e n + v e r k k o k i r j a s t o + v e r k k o k i r j a s t o j e n + v e r k k o k i u s a a m i n e n + v e r k k o k i u s a a m i s e l t a + v e r k k o k i u s a a m i s e s t a + v e r k k o k o u l u t u s t a + v e r k k o k u l t t u u r i i n + v e r k k o k u r s s i + v e r k k o k u u l e m i s t a + v e r k k o k y s e l y y n + v e r k k o k y s y m y k s i ä + v e r k k o k ä y t t ä y t y m i s e n + v e r k k o k ä y t t ä y t y m i s t ä + v e r k k o k ä y t t ö ä + v e r k k o l a i t t e i t a + v e r k k o l a s k u + v e r k k o l e h t i + v e r k k o l e h t i e n + v e r k k o l e h t i p a j u + v e r k k o l i i k e t o i m i n n a l l e + v e r k k o l i i k e t o i m i n n a n + v e r k k o l i i t t y m i l l ä + v e r k k o l i i t t y m ä s t ä + v e r k k o l i s e n s o i n n i s t a + v e r k k o l i s e n s o i n t i k ä y t ä n t ö j e n + v e r k k o l i s e n s o i n t i m a l l i a + v e r k k o l i s e n s o i n t i m a r k k i n o i d e n + v e r k k o l ä h e t y s p a l v e l u i l l e + v e r k k o l ä h e t y s p a l v e l u i s s a + v e r k k o l ä h t e i d e n + v e r k k o m a a i l m a a n + v e r k k o m a i n o n n a s t a + v e r k k o m a i n o n t a + v e r k k o m a i n o n t a a + v e r k k o m a k s u j ä r j e s t e l m i e n + v e r k k o m a k s u t + v e r k k o m a r k k i n a t + v e r k k o m a r k k i n o i d e n + v e r k k o m a r k k i n o i n n i n + v e r k k o m a r k k i n o i n t i a + v e r k k o m u s i i k i n + v e r k k o m u s i i k i s t a + v e r k k o m u s i i k k i m a r k k i n o i d e n + v e r k k o m u s i i k k i m y y n t i ä + v e r k k o m u s i i k k i p a l v e l u i h i n + v e r k k o m u s i i k k i p a l v e l u j a + v e r k k o m u s i i k k i p a l v e l u j e n + v e r k k o m u s i i k k i p a l v e l u m a r k k i n a t + v e r k k o m y y n n i n + v e r k k o m y y n t i + v e r k k o m y y n t i o i k e u k s i s t a + v e r k k o m y y n t i ä + v e r k k o n e u v o t t e l u + v e r k k o n i m i + v e r k k o n i m i s s ä + v e r k k o n s a + v e r k k o n u o l i a i n e n + v e r k k o o n + v e r k k o p a l v e l u + v e r k k o p a l v e l u a + v e r k k o p a l v e l u i d e n + v e r k k o p a l v e l u i h i n + v e r k k o p a l v e l u i s t a + v e r k k o p a l v e l u i t a + v e r k k o p a l v e l u j a + v e r k k o p a l v e l u j e n + v e r k k o p a l v e l u n t u o t t a j i e n + v e r k k o p a l v e l u o p e r a a t t o r i t + v e r k k o p a l v e l u t + v e r k k o p a n k k i + v e r k k o p a n k k i e n + v e r k k o p a n k k i i n + v e r k k o p a n k k i t o i m i n n a l l e + v e r k k o p e l i + v e r k k o p e l i y m p ä r i s t ö n + v e r k k o p o h j a i n e n + v e r k k o p o h j a i s e s t a + v e r k k o p o h j a i s i a + v e r k k o p o h j a i s t a + v e r k k o p o l i t i i k a s t a + v e r k k o p o r t a a l i + v e r k k o p o r t a a l i k s i + v e r k k o p o r t a a l i n + v e r k k o p r e u s s i n a h v e n + v e r k k o p y t o n + v e r k k o p y y n t i + v e r k k o p ä ä t e + v e r k k o r a h o i t u s p a l v e l u j e n + v e r k k o r a k e n t e e t + v e r k k o r a k e n t e i s s a + v e r k k o r e k i s t e r i n + v e r k k o r e s u r s s i e n s a + v e r k k o r i i p p u m a t t o m u u d e n + v e r k k o r i k o k s i s t a + v e r k k o r i k o l l i s u u d e n + v e r k k o r i k o l l i s u u s + v e r k k o r i k o l l i s u u t t a + v e r k k o s a n o m a l e h d i l l e + v e r k k o s e l a i n + v e r k k o s i i r t o p a l v e l u i l l e + v e r k k o s i s ä l l ö l t ä + v e r k k o s i s ä l l ö n + v e r k k o s i s ä l l ö s t ä + v e r k k o s i s ä l t ö + v e r k k o s i s ä l t ö i h i n + v e r k k o s i s ä l t ö j e n + v e r k k o s i s ä l t ö ä + v e r k k o s i s ä l t ö ö n + v e r k k o s i v u + v e r k k o s i v u i h i n + v e r k k o s i v u i l l a + v e r k k o s i v u i l l e + v e r k k o s i v u i l t a + v e r k k o s i v u i s s a + v e r k k o s i v u i s t a + v e r k k o s i v u j a + v e r k k o s i v u j e n + v e r k k o s i v u l l a + v e r k k o s i v u s t o a + v e r k k o s i v u s t o e h d o t u s t a + v e r k k o s i v u s t o i l l e + v e r k k o s i v u s t o j a + v e r k k o s i v u s t o j e n + v e r k k o s i v u s t o l l a + v e r k k o s i v u s t o l l a m m e + v e r k k o s i v u s t o l l a n i + v e r k k o s i v u s t o n + v e r k k o s i v u s t o s s a + v e r k k o s i v u s t o s t a + v e r k k o s i v u s t o t + v e r k k o s i v u t + v e r k k o s o p i m u k s e e n + v e r k k o s o t a + v e r k k o s o t a a + v e r k k o s o v i t i n + v e r k k o s u o j a n + v e r k k o s u u n n i t e l m a n + v e r k k o s y s t e e m i n + v e r k k o s y ö t e + v e r k k o s ä n k y j ä + v e r k k o s ä ä n n ö t + v e r k k o s ä ä n t ö j ä + v e r k k o t a l l e n n u s t i l a + v e r k k o t a r j o a j i e n + v e r k k o t a r j o u k s i a + v e r k k o t a r k a s t u s t a + v e r k k o t e k n i i k k a a + v e r k k o t e k n i i k o i d e n + v e r k k o t e k n o l o g i a + v e r k k o t e k n o l o g i a a + v e r k k o t e k n o l o g i a n + v e r k k o t e l e v i s i o + v e r k k o t e l e v i s i o l ä h e t y k s i s s ä + v e r k k o t e l e v i s i o n + v e r k k o t e o l l i s u u d e k s i + v e r k k o t e o r i a + v e r k k o t i e d o n + v e r k k o t i e d u s t e l u + v e r k k o t i e t o k a n n a n + v e r k k o t i e t o k a n t a + v e r k k o t i e t o k a n t o j e n + v e r k k o t o d e l l i s u u s + v e r k k o t o i m i a l a t + v e r k k o t o i m i a l o j e n + v e r k k o t o i m i j o i h i n + v e r k k o t o i m i n n a n + v e r k k o t o i m i n n a s t a + v e r k k o t o i m i n t o j e n + v e r k k o t o p o l o g i a + v e r k k o t u n n u k s e n + v e r k k o t u n n u k s e t + v e r k k o t u n n u k s i a + v e r k k o t u n n u s + v e r k k o t u n n u s n i m i e n + v e r k k o t u r v a + v e r k k o t u r v a a + v e r k k o t u r v a a n + v e r k k o t u r v a l l i s u u d e n + v e r k k o t u r v a l l i s u u d e s t a + v e r k k o t u r v a l l i s u u s + v e r k k o t u r v a l l i s u u s s t r a t e g i a + v e r k k o t u r v a l l i s u u s v i r a s t o n + v e r k k o t u r v a l l i s u u s y k s i k ö n + v e r k k o t u r v a l l i s u u t e e n + v e r k k o t u r v a l l i s u u t t a + v e r k k o t u r v a n + v e r k k o t u r v a t t o m u u s + v e r k k o t u r v a v i r a s t o + v e r k k o t u t k i m u s o h j e l m a n + v e r k k o t y y p p i ä + v e r k k o t y ö k a l u a + v e r k k o t y ö k a l u n + v e r k k o u h k i e n + v e r k k o v a a l i t + v e r k k o v a l v o n t a a + v e r k k o v a p a u d e n + v e r k k o v a p a u k s i e n + v e r k k o v e t o o m u k s e n + v e r k k o v e t o o m u k s e s s a + v e r k k o v i a s t a + v e r k k o v i e r a i l u a l a l l a + v e r k k o v i e r a i l u a s e t u k s e n + v e r k k o v i e r a i l u a s e t u s + v e r k k o v i e r a i l u a s i a n + v e r k k o v i e r a i l u d a t a p a l v e l u i d e n + v e r k k o v i e r a i l u d i r e k t i i v i + v e r k k o v i e r a i l u d i r e k t i i v i l l ä + v e r k k o v i e r a i l u h i n n a t + v e r k k o v i e r a i l u h i n n o i l l e + v e r k k o v i e r a i l u h i n n o i s s a + v e r k k o v i e r a i l u h i n n o i s t a + v e r k k o v i e r a i l u h i n t a a + v e r k k o v i e r a i l u h i n t o j a + v e r k k o v i e r a i l u h i n t o j e n + v e r k k o v i e r a i l u j e n + v e r k k o v i e r a i l u j ä r j e s t e l m ä + v e r k k o v i e r a i l u k u s t a n n u s t e n + v e r k k o v i e r a i l u l a s k u j a + v e r k k o v i e r a i l u m a k s u i h i n + v e r k k o v i e r a i l u m a k s u i l l a + v e r k k o v i e r a i l u m a k s u i s s a + v e r k k o v i e r a i l u m a k s u i s t a + v e r k k o v i e r a i l u m a k s u j a + v e r k k o v i e r a i l u m a k s u j a a n + v e r k k o v i e r a i l u m a k s u j e n + v e r k k o v i e r a i l u m a k s u t + v e r k k o v i e r a i l u m a r k k i n o i l l a + v e r k k o v i e r a i l u n a + v e r k k o v i e r a i l u p a k e t i n + v e r k k o v i e r a i l u p a k e t i s t a + v e r k k o v i e r a i l u p a k e t t i + v e r k k o v i e r a i l u p a k e t t i a + v e r k k o v i e r a i l u p a l v e l u + v e r k k o v i e r a i l u p a l v e l u j a + v e r k k o v i e r a i l u p a l v e l u j e n + v e r k k o v i e r a i l u p o l i t i i k a n + v e r k k o v i e r a i l u p u h e l u i d e n + v e r k k o v i e r a i l u p u h e l u i l l e + v e r k k o v i e r a i l u p u h e l u i s s a + v e r k k o v i e r a i l u p u h e l u i t a + v e r k k o v i e r a i l u p u h e l u j a + v e r k k o v i e r a i l u p u h e l u j e n + v e r k k o v i e r a i l u p u h e l u t + v e r k k o v i r t a + v e r k k o y h t e i s k u n n a s s a + v e r k k o y h t e i s k u n t a a n + v e r k k o y h t e i s t y ö n + v e r k k o y h t e i s ö s i v u s t o + v e r k k o y h t e y d e t + v e r k k o y h t e y k s i l l ä + v e r k k o y h t e y k s i ä + v e r k k o y h t e y t t ä + v e r k k o y h t i ö n + v e r k k o y h t i ö t + v e r k k o y k s i t y i s y y t t ä + v e r k k o y m p ä r i s t ö + v e r k k o y m p ä r i s t ö n + v e r k k o y m p ä r i s t ö s s ä + v e r k k o y m p ä r i s t ö s t ä + v e r k k o y m p ä r i s t ö ö n + v e r k k o y r i t y k s i l l e + v e r k k o y r i t y k s i ä + v e r k k o y r i t y s t e n + v e r k k o y s t ä v y y s + v e r k k o ä ä n e s t y s a l o i t e + v e r k o i l l a + v e r k o i s s a + v e r k o i s t a + v e r k o k s i + v e r k o l l a + v e r k o n + v e r k o n h a l l i n n a n + v e r k o n h a l t i j o i d e n + v e r k o n h a l t i j o i t a + v e r k o n k u t o j a t + v e r k o n k u t o j i l l e + v e r k o n k ä y t t ä j ä t + v e r k o n k ä y t t ö k u s t a n n u k s i a + v e r k o n s i l m u k a n + v e r k o s s a + v e r k o s t a + v e r k o s t o a + v e r k o s t o a n a l y y s i + v e r k o s t o h a n k k e i s i i n + v e r k o s t o i l l a + v e r k o s t o i n f r a s t r u k t u u r e i h i n + v e r k o s t o i n f r a s t r u k t u u r i + v e r k o s t o i s t a + v e r k o s t o i t u n e e n a + v e r k o s t o j a + v e r k o s t o j e n + v e r k o s t o j ä r j e s t e l m ä ä + v e r k o s t o l i i t t o i h i n + v e r k o s t o l ä h e s t y m i s t a p a + v e r k o s t o m a l l i + v e r k o s t o m a r k k i n o i n t i + v e r k o s t o m u o t o i s t a + v e r k o s t o n + v e r k o s t o o n + v e r k o s t o p o h j a i s e n + v e r k o s t o p o h j a i s i s t a + v e r k o s t o r a k e n n e + v e r k o s t o r a k e n t e e n + v e r k o s t o s s a + v e r k o s t o s t a + v e r k o s t o s t r a t e g i o i d e n + v e r k o s t o t + v e r k o s t o t o i m i n t a a n n e + v e r k o s t o t o i m i n t o j a + v e r k o s t o t y ö s k e n t e l y ä + v e r k o s t o v a i k u t u s + v e r k o s t o y h t e i s t y ö t ä + v e r k o t + v e r k o t t u m i n e n + v e r k o t t u m i s e s t a + v e r k o t t u m i s k o k e m u s + v e r k o t t u m i s m a h d o l l i s u u k s i a + v e r k o t t u m i s t a + v e r k o t t u m i s v a i k u t u s t e n + v e r o a + v e r o a l a a + v e r o a l a l l a + v e r o a l a l l e + v e r o a l a n + v e r o a l e n n u k s i a + v e r o a l e n n u s t e n + v e r o a l o i t t e i d e n + v e r o a l u e e l l a + v e r o a l u e i t a + v e r o a s i a n t u n t i j a + v e r o a s i a n t u n t i j a t + v e r o a s i a n t u n t i j o i d e n + v e r o a s i a t + v e r o a s i o i d e n + v e r o a s i o i h i n + v e r o a s i o i s s a + v e r o a s i o i s t a + v e r o a s i o i t a + v e r o a s t e + v e r o a s t e e n + v e r o a s t e e s t a + v e r o a s t e e t + v e r o a s t e i d e n + v e r o a s t e i k o i s t a a n + v e r o a s t e i l l a + v e r o a s t e i s i i n + v e r o a s t e i s t a + v e r o a s t e i t a + v e r o a s t e t t a + v e r o a u k k o j a + v e r o d i r e k t i i v i e n + v e r o d i r e k t i i v i n + v e r o d u m p i n g + v e r o d u m p p a u k s e l l e + v e r o d u m p p a u k s e n + v e r o d u m p p a u k s e s t a + v e r o d u m p p a u s t a + v e r o e d u n + v e r o e d u s t a j a n + v e r o e d u s t u k s e n + v e r o e d u t + v e r o e h d o t u k s i a + v e r o e h d o t u k s i s s a + v e r o e h d o t u s + v e r o e n n u s t e e t + v e r o e r i ä + v e r o e r o n + v e r o e r o t + v e r o e s t e e t + v e r o e s t e i d e n + v e r o e s t e i t ä + v e r o e t u a + v e r o e t u j a + v e r o e t u j e n + v e r o e t u u d e n + v e r o e t u u d e t + v e r o e t u u k s i a + v e r o e t u u k s i a a n + v e r o e t u u k s i e n + v e r o e t u u k s i i n + v e r o e t u u k s i l l a + v e r o e t u u k s i s t a + v e r o e t u u s j ä r j e s t e l m i e n + v e r o e t u u s j ä r j e s t e l m i ä + v e r o e t u u s j ä r j e s t e l m ä t + v e r o e t u u s k o h t e l u a + v e r o h a l l i n n o i l l a + v e r o h a l l i n n o i l t a + v e r o h a l l i n n o i s s a + v e r o h a l l i n n o l l a + v e r o h a l l i n n o l l e + v e r o h a l l i n n o n + v e r o h a l l i n n o s s a + v e r o h a l l i n n o s t a + v e r o h a l l i n n o t + v e r o h a l l i n t o + v e r o h a l l i n t o a + v e r o h a l l i n t o j e n + v e r o h a l l i n t o j ä r j e s t e l m ä ä + v e r o h a l l i n t o o n + v e r o h a r m o n i s o i n t i + v e r o h e l p o t u k s e n + v e r o h e l p o t u k s e s t a + v e r o h e l p o t u k s e t + v e r o h e l p o t u k s i a + v e r o h e l p o t u k s i i n + v e r o h e l p o t u k s i l l a + v e r o h e l p o t u k s i l l a a n + v e r o h e l p o t u k s i n + v e r o h e l p o t u k s i n a + v e r o h e l p o t u k s i s s a + v e r o h e l p o t u k s i s t a + v e r o h e l p o t u s + v e r o h e l p o t u s t a + v e r o h e l p o t u s t a p a u k s e s t a + v e r o h e l p o t u s t e n + v e r o h e v o s v o i m a + v e r o h o u k u t u k s i l l a + v e r o h u i j a r i t + v e r o h u l l u u d e s t a + v e r o h u o j e n n u k s e t + v e r o h u o j e n n u k s i a + v e r o h u o j e n n u k s i i n + v e r o h u o j e n n u k s i n a + v e r o h u o j e n n u k s i s t a + v e r o h y v i t y k s i n ä + v e r o h y v i t y s t e n + v e r o i h i n + v e r o i l l a + v e r o i l m o i t u k s e n + v e r o i l m o i t u k s e s s a a n + v e r o i l m o i t u k s e t + v e r o i l m o i t u s + v e r o i l m o i t u s j ä r j e s t e l m ä n + v e r o i l t a + v e r o i n + v e r o i n a + v e r o i n s t r u m e n t t i a + v e r o i s t a + v e r o j a + v e r o j a a n + v e r o j a o n + v e r o j e n + v e r o j e n a l e n n u k s i a + v e r o j e n a l e n n u s + v e r o j ä r j e s t e l m i e n + v e r o j ä r j e s t e l m i e n s ä + v e r o j ä r j e s t e l m i i n + v e r o j ä r j e s t e l m i l l e + v e r o j ä r j e s t e l m i l l ä + v e r o j ä r j e s t e l m i s s ä + v e r o j ä r j e s t e l m i s s ä ä n + v e r o j ä r j e s t e l m i s t ä + v e r o j ä r j e s t e l m i s t ä ä n + v e r o j ä r j e s t e l m i ä + v e r o j ä r j e s t e l m i ä ä n + v e r o j ä r j e s t e l m ä + v e r o j ä r j e s t e l m ä l l ä + v e r o j ä r j e s t e l m ä m m e + v e r o j ä r j e s t e l m ä n + v e r o j ä r j e s t e l m ä n s ä + v e r o j ä r j e s t e l m ä s t ä + v e r o j ä r j e s t e l m ä t + v e r o j ä r j e s t e l m ä t k i n + v e r o j ä r j e s t e l m ä ä + v e r o j ä r j e s t e l m ä ä m m e + v e r o j ä r j e s t e l m ä ä n + v e r o j ä r j e s t e l y + v e r o j ä r j e s t e l y i h i n + v e r o j ä r j e s t e l y i s t ä + v e r o j ä r j e s t e l y j e n + v e r o j ä r j e s t e l y j ä + v e r o j ä r j e s t e l y s s ä + v e r o j ä r j e s t e l y t + v e r o j ä r j e s t y s + v e r o k a l e n t e r e i d e n + v e r o k a l e n t e r i n s a + v e r o k a n n a n + v e r o k a n n a t + v e r o k a n n o i s t a + v e r o k a n n o i s t a a n + v e r o k a n n u s t e j ä r j e s t e l m ä + v e r o k a n n u s t i m e t + v e r o k a n n u s t i m i a + v e r o k a n n u s t i m i e n + v e r o k a n n u s t i m i i n + v e r o k a n n u s t i m i l l a + v e r o k a n n u s t i m i n + v e r o k a n n u s t i m i s t a + v e r o k a n n u s t i n j ä r j e s t e l m i e n + v e r o k a n n u s t i n j ä r j e s t e l m ä s t ä + v e r o k a n n u s t i n p a k e t t e j a + v e r o k a n n u s t i n p o l i t i i k k o j e n + v e r o k a n n u s t i n t e n + v e r o k a n n u s t i n t o i m e n p i t e e t + v e r o k a n t a + v e r o k a n t a a + v e r o k a n t a a n + v e r o k a n t a l u o k k i a + v e r o k a n t o i h i n + v e r o k a n t o j a + v e r o k a n t o j e n + v e r o k a v a l l u k s i i n + v e r o k a v a l l u s t e n + v e r o k e h y k s e l l e + v e r o k e i d a s + v e r o k e i n o t t e l u n + v e r o k e i n o t t e l u p a i k k o j a + v e r o k e i t a a k s i + v e r o k e i t a a n + v e r o k e i t a a t + v e r o k e i t a i d e n + v e r o k e i t a i k s i + v e r o k e i t a i s i i n + v e r o k e i t a i s t a + v e r o k e i t a i t a + v e r o k e s k u s t e l u + v e r o k e s k u s t e l u a + v e r o k e v e n n y k s i ä + v e r o k i i l a + v e r o k i i s t a s t a + v e r o k i l p a i l u + v e r o k i l p a i l u a + v e r o k i l p a i l u l l a + v e r o k i l p a i l u l l e + v e r o k i l p a i l u n + v e r o k i l p a i l u s s a + v e r o k i l p a i l u s t a + v e r o k i l p a i l u u n + v e r o k i l p a i l u v o i t t o o n + v e r o k i r s t u s t a + v e r o k o h t e l u + v e r o k o h t e l u a + v e r o k o h t e l u n + v e r o k o h t e l u s t a + v e r o k o h t e l u u n + v e r o k o m p r o m i s s i + v e r o k o m p r o m i s s i s t a + v e r o k o o r d i n o i n n i n + v e r o k o r o t u k s i a + v e r o k o r o t u s t e n + v e r o k o r t i n + v e r o k o u l u t u s t a + v e r o k r i i s i t + v e r o k r u u n u j a + v e r o k u l u j a + v e r o k u o r m i t u s t e n + v e r o k u r i a + v e r o k y l k i ä i s i i n + v e r o k y l ä s t ä + v e r o k y s y m y k s e n + v e r o k y s y m y k s e t + v e r o k y s y m y k s i i n + v e r o k y s y m y k s i s s ä + v e r o k y s y m y k s i s t ä + v e r o k y s y m y k s i ä + v e r o k y s y m y s + v e r o k y s y m y s t e n + v e r o k y s y m y s t ä + v e r o k ä y t ä n t ö j e n + v e r o k ä y t ä n t ö j ä + v e r o l a e i s t a + v e r o l a h j o i h i n + v e r o l a h j o j a + v e r o l a i n + v e r o l a i n s ä ä d ä n n ö i s t ä + v e r o l a i n s ä ä d ä n n ö l l ä + v e r o l a i n s ä ä d ä n n ö l l ä ä n + v e r o l a i n s ä ä d ä n n ö n + v e r o l a i n s ä ä d ä n n ö s s ä + v e r o l a i n s ä ä d ä n n ö s t ä + v e r o l a i n s ä ä d ä n t ö + v e r o l a i n s ä ä d ä n t ö j ä + v e r o l a i n s ä ä d ä n t ö k i r j o + v e r o l a i n s ä ä d ä n t ö n s ä + v e r o l a i n s ä ä d ä n t ö ä + v e r o l a i n s ä ä d ä n t ö ä ä n + v e r o l a i n s ä ä d ä n t ö ö n + v e r o l a i t + v e r o l a k e j a + v e r o l a k i e n + v e r o l e i k k a u k s i a + v e r o l e i k k a u k s i i n + v e r o l e i k k a u k s i i n k i n + v e r o l e i k k a u k s i l l a + v e r o l e i k k a u s p o l i t i i k k a a + v e r o l e i k k a u s t e n + v e r o l i i t o s t a + v e r o l i i t t o + v e r o l i i t t o o n + v e r o l l e + v e r o l l i s t a + v e r o l u o k k a a n + v e r o l ä h t e i s t ä + v e r o m a k s u t + v e r o m a r k k o j a + v e r o m a r k o i s t a + v e r o m e k a n i s m i n + v e r o m e n e t t e l y n + v e r o m e n o i h i n + v e r o m i n i s t e r i ö + v e r o m i n i s t e r i ö n + v e r o m u o d o l l i s u u t t a + v e r o m u u r e i s t a + v e r o m u u t o k s e t + v e r o m u u t o s t e n + v e r o m y ö n n y t y k s e t + v e r o m ä ä r ä + v e r o m ä ä r ä y k s e m m e + v e r o m ä ä r ä y k s e t + v e r o m ä ä r ä y k s i s t ä + v e r o m ä ä r ä y k s i ä + v e r o m ä ä r ä y s t e n + v e r o n + v e r o n a l e n n u k s e n + v e r o n a l e n n u k s e s t a + v e r o n a l e n n u k s e t + v e r o n a l e n n u k s i a + v e r o n a l e n n u k s i e n + v e r o n a l e n n u k s i i n + v e r o n a l e n n u k s i l l a + v e r o n a l e n n u k s i n + v e r o n a l e n n u k s i s s a + v e r o n a l e n n u k s i s t a + v e r o n a l e n n u s + v e r o n a l e n n u s k i l p a i l u l t a + v e r o n a l e n n u s t a + v e r o n a l e n n u s t e n + v e r o n e u v o j a a + v e r o n e u v o j a l t a + v e r o n e u v o j a n i + v e r o n e u v o j a t + v e r o n e u v o j i a + v e r o n e u v o j i e n + v e r o n e u v o j i i n + v e r o n e u v o n n a s t a + v e r o n e u v o n t a + v e r o n e u v o n t a a + v e r o n k a l t a i s i a + v e r o n k a n n o n + v e r o n k a n t o + v e r o n k a n t o a + v e r o n k a n t o j ä r j e s t e l m i e n + v e r o n k a n t o j ä r j e s t e l m ä + v e r o n k a n t o p r o s e s s i s s a + v e r o n k e r ä ä j ä + v e r o n k e r ä ä m i s e e n + v e r o n k e v e n n y k s e e n + v e r o n k e v e n n y k s e l l ä + v e r o n k e v e n n y k s e t + v e r o n k e v e n n y k s i ä + v e r o n k e v e n n y s o h j e l m a n s a + v e r o n k e v e n n y s t e n + v e r o n k i e r r o l l a + v e r o n k i e r r o l l e + v e r o n k i e r r o l t a + v e r o n k i e r r o n + v e r o n k i e r r o s t a + v e r o n k i e r t o + v e r o n k i e r t o a + v e r o n k i e r t o i h i n + v e r o n k i e r t o n a + v e r o n k i e r t o o n + v e r o n k i e r t o r i k o s t a + v e r o n k i e r t o t a p a u k s e s s a + v e r o n k i e r t o t a p a u s t e n + v e r o n k i e r t o t a r k o i t u k s e s s a + v e r o n k i e r t o t a r k o i t u k s i s s a + v e r o n k i e r t o v i t s a u k s e n + v e r o n k i e r t ä j i e n + v e r o n k i e r t ä j i i n + v e r o n k i e r t ä j i l l e + v e r o n k i e r t ä j i l t ä + v e r o n k i e r t ä j ä s t ä + v e r o n k i e r t ä j ä t + v e r o n k o r o t u k s e e n + v e r o n k o r o t u k s e n a + v e r o n k o r o t u k s e t + v e r o n k o r o t u k s i a + v e r o n k o r o t u k s i i n + v e r o n k o r o t u k s i l l a + v e r o n k o r o t u k s i n e e n + v e r o n k o r o t u k s i s t a + v e r o n k o r o t u s + v e r o n k o r o t u s s u u n n i t e l m a t + v e r o n k o r o t u s t a + v e r o n k o r o t u s t e n + v e r o n l a s k e n t a m e n e t e l m ä n + v e r o n m a k s a j a + v e r o n m a k s a j a a + v e r o n m a k s a j a l t a + v e r o n m a k s a j a n + v e r o n m a k s a j a r a u k a t + v e r o n m a k s a j a t + v e r o n m a k s a j a v a l t i o + v e r o n m a k s a j i a + v e r o n m a k s a j i a m m e + v e r o n m a k s a j i e m m e + v e r o n m a k s a j i e n + v e r o n m a k s a j i e n s a + v e r o n m a k s a j i i n + v e r o n m a k s a j i k s i + v e r o n m a k s a j i l l e + v e r o n m a k s a j i l l e e n + v e r o n m a k s a j i l l e m m e + v e r o n m a k s a j i l t a + v e r o n m a k s a j i n a + v e r o n m a k s a j i s t a + v e r o n m a k s u + v e r o n m a k s u l t a + v e r o n m a k s u s s a + v e r o n m e n e t y k s e t + v e r o n n o s t o i n e e n + v e r o n p a l a u t u k s e t + v e r o n s a + v e r o n s i i r r o i s t a + v e r o o n + v e r o p a i n e + v e r o p a i n e i d e n + v e r o p a i n e i t a + v e r o p a k e t i l l a + v e r o p a k e t i l l e + v e r o p a k e t i n + v e r o p a k e t i s s a + v e r o p a k e t i s t a + v e r o p a k e t t i + v e r o p a k e t t i a + v e r o p a k e t t i i n + v e r o p a k o a + v e r o p a k o l a i s i k s i + v e r o p a k o l a i s i l l e + v e r o p a k o l a i s t a + v e r o p a k o l a i s u u d e n + v e r o p a r a t i i s e i h i n + v e r o p a r a t i i s e i k s i + v e r o p a r a t i i s e i l l e + v e r o p a r a t i i s e i s s a + v e r o p a r a t i i s e i s t a + v e r o p a r a t i i s e j a + v e r o p a r a t i i s i + v e r o p a r a t i i s i a + v e r o p a r a t i i s i e m m e + v e r o p a r a t i i s i e n + v e r o p a r a t i i s i i n + v e r o p a r a t i i s i l i s t o i h i n + v e r o p a r a t i i s i n + v e r o p a r a t i i s i n a + v e r o p a r a t i i s i s s a + v e r o p a r a t i i s i s t a + v e r o p a r a t i i s i t + v e r o p e r i a a t t e e n a + v e r o p e r u s t a + v e r o p e r u s t a a n + v e r o p e r u s t a n + v e r o p e r u s t a s t a + v e r o p e r u s t e i s t a + v e r o p e t o k s e e n + v e r o p e t o k s e n + v e r o p e t o k s e s t a + v e r o p e t o k s e t + v e r o p e t o k s i a + v e r o p e t o k s i i n + v e r o p e t o k s i l l a + v e r o p e t o k s i l l e + v e r o p e t o k s i n + v e r o p e t o k s i s t a + v e r o p e t o s + v e r o p e t o s s o p i m u s t e n + v e r o p e t o s t a + v e r o p e t o s t e n + v e r o p i l a r i a + v e r o p o h j a + v e r o p o h j a a + v e r o p o h j a a n + v e r o p o h j a k s i + v e r o p o h j a k y s y m y k s e s s ä + v e r o p o h j a l l a + v e r o p o h j a n + v e r o p o h j a n s a + v e r o p o h j a s t a + v e r o p o h j a t + v e r o p o h j i a + v e r o p o h j i e n + v e r o p o i k k e u k s i a + v e r o p o i k k e u s t e n + v e r o p o l i i t t i n e n + v e r o p o l i i t t i s e e n + v e r o p o l i i t t i s e n + v e r o p o l i i t t i s e s s a + v e r o p o l i i t t i s i a + v e r o p o l i i t t i s i s s a + v e r o p o l i i t t i s i s t a + v e r o p o l i i t t i s t a + v e r o p o l i t i i k a l l a + v e r o p o l i t i i k a l l e + v e r o p o l i t i i k a l t a + v e r o p o l i t i i k a n + v e r o p o l i t i i k a s s a + v e r o p o l i t i i k a s s a a n + v e r o p o l i t i i k a s s a m m e + v e r o p o l i t i i k a s t a + v e r o p o l i t i i k a s t a a n + v e r o p o l i t i i k a t + v e r o p o l i t i i k k a + v e r o p o l i t i i k k a a + v e r o p o l i t i i k k a a n + v e r o p o l i t i i k k a a n s a + v e r o p o l i t i i k k a k i n + v e r o p o l i t i i k k a n s a + v e r o p o l i t i i k k o i h i n + v e r o p o l i t i i k k o j a + v e r o p o l i t i i k k o j e m m e + v e r o p o l i t i i k k o j e n + v e r o p o l i t i i k o i s s a + v e r o p r o s e n t e i s t a a n + v e r o p r o s e n t i l l a + v e r o p r o s e n t i n + v e r o p r o s e n t t e j a + v e r o p r o s e n t t i + v e r o p u i t t e e t + v e r o p ä ä t ö k s e t + v e r o r a h a a + v e r o r a h a m m e + v e r o r a h a t + v e r o r a h o i h i n + v e r o r a h o i l l a + v e r o r a h o i s t a + v e r o r a h o i t t e i s e t + v e r o r a h o j a + v e r o r a h o j a a n + v e r o r a h o j a m m e + v e r o r a h o j e m m e + v e r o r a h o j e n + v e r o r a j o j e n + v e r o r a k e n n e + v e r o r a k e n t e e n + v e r o r a k e n t e e s e e n + v e r o r a k e n t e e t + v e r o r a k e n t e i t a + v e r o r a n g a i s t u k s i l l a + v e r o r a n g a i s t u s + v e r o r a s i t e + v e r o r a s i t e t t a + v e r o r a s i t t e e n + v e r o r a s i t t e e s e e n + v e r o r a s i t t e e s t a + v e r o r a s i t u k s e e n + v e r o r a s i t u k s e n + v e r o r a s i t u k s e n s a + v e r o r a s i t u k s e s t a + v e r o r a s i t u k s e t + v e r o r a s i t u k s i a + v e r o r a s i t u s + v e r o r a s i t u s t a + v e r o r a t k a i s u i l l a + v e r o r a t k a i s u j a + v e r o r a t k a i s u l l a + v e r o r a t k a i s u t + v e r o r i k o k s e t + v e r o r i k o k s i s t a + v e r o s a a t a v i a + v e r o s a a t a v i e n + v e r o s a a t a v i i n + v e r o s a k k o + v e r o s a t a m a t + v e r o s e u r a a m u k s e t + v e r o s i i r t o j a + v e r o s o p i m u k s e n + v e r o s o p i m u k s e t + v e r o s o p i m u k s i a + v e r o s o p i m u k s i i n + v e r o s o p i m u s t e n + v e r o s o v e l l u t u k s i s s a + v e r o s t a + v e r o s u h t e i d e n + v e r o s u o j a n + v e r o s u u n n i t t e l u + v e r o s u u n n i t t e l u m a h d o l l i s u u k s i a + v e r o s y r j i n n ä n + v e r o s y r j i n t ä ä + v e r o s ä ä d ö k s e t + v e r o s ä ä d ö k s i ä + v e r o s ä ä n n ö k s e t + v e r o s ä ä n n ö k s i s t ä + v e r o s ä ä n n ö k s i ä + v e r o s ä ä n n ö n + v e r o s ä ä n n ö s t e n + v e r o s ä ä n n ö t + v e r o s ä ä n t e l y + v e r o s ä ä n t e l y ä + v e r o s ä ä n t ö j e n + v e r o s ä ä n t ö j ä + v e r o s ä ä s t ö j ä + v e r o t + v e r o t a a k a n + v e r o t a a k a s s a + v e r o t a a k a s t a + v e r o t a a k k a + v e r o t a a k k a a + v e r o t a a k k a a n + v e r o t a a k k a a n s a + v e r o t a a k k o j a + v e r o t a a k k o j e n + v e r o t a a k o i s t a + v e r o t a p p i o t + v e r o t a r k a s t a j a a + v e r o t a r k a s t a j i e n + v e r o t a r k a s t u k s i a + v e r o t a r k a s t u k s i s s a + v e r o t a s o + v e r o t a s o a + v e r o t a s o j a + v e r o t a s o j e n + v e r o t a s o n + v e r o t a s o s t a + v e r o t e t a + v e r o t e t a a n + v e r o t e t t a v a a + v e r o t e t u i s t a + v e r o t e t u t + v e r o t h a n + v e r o t i e d o i l l e + v e r o t i e d o t + v e r o t i e t o i h i n s a + v e r o t i e t o j a + v e r o t i e t o j e n + v e r o t i e t o n s a + v e r o t i l a n n e + v e r o t i l a s t o i h i n + v e r o t i l a s t o j e n + v e r o t o i m e n p i t e e t + v e r o t o i m e n p i t e i d e n + v e r o t o i m e n p i t e i l l ä + v e r o t o i m e n p i t e i s i i m m e + v e r o t o i m e n p i t e i s i i n + v e r o t o i m e n p i t e i t ä + v e r o t o i m i a + v e r o t o i m i a a n + v e r o t o i m i e n + v e r o t o i m i l l a + v e r o t o i m i s t a + v e r o t o n t a + v e r o t o t t u m u k s i a + v e r o t t a a + v e r o t t a m i s e l l a + v e r o t t a m i s e l l e + v e r o t t a m i s e n + v e r o t t o m a n + v e r o t t o m a s t a + v e r o t t o m a t + v e r o t t o m i a + v e r o t t o m i i n + v e r o t t o m i l l a + v e r o t t o m i n e + v e r o t u e t + v e r o t u i l l a + v e r o t u i s t a + v e r o t u k e e n + v e r o t u k i + v e r o t u k i a + v e r o t u k s e e n + v e r o t u k s e k s i + v e r o t u k s e l l a + v e r o t u k s e l l e + v e r o t u k s e l l i s e e n + v e r o t u k s e l l i s e n + v e r o t u k s e l l i s e t + v e r o t u k s e l l i s i a + v e r o t u k s e l l i s i l l a + v e r o t u k s e l l i s i n + v e r o t u k s e l l i s i s t a + v e r o t u k s e l l i s t a + v e r o t u k s e l l i s t e n + v e r o t u k s e l t a + v e r o t u k s e n + v e r o t u k s e n s a + v e r o t u k s e s s a + v e r o t u k s e s t a + v e r o t u k s e s t a m m e + v e r o t u k s i s s a m m e + v e r o t u l o + v e r o t u l o a + v e r o t u l o i h i n + v e r o t u l o i l l a + v e r o t u l o i l l e + v e r o t u l o i n a + v e r o t u l o i s t a + v e r o t u l o i s t a a n + v e r o t u l o j a + v e r o t u l o j a a n + v e r o t u l o j a m m e + v e r o t u l o j e n + v e r o t u l o n s a + v e r o t u l o t + v e r o t u o m i o i s t u i n + v e r o t u o t t o j a + v e r o t u o t t o j e n + v e r o t u r i s m i a + v e r o t u r i s t e i s t a + v e r o t u s a l a a + v e r o t u s a l a l l a + v e r o t u s a l a n + v e r o t u s a l o i l l a + v e r o t u s a l u e e l l a + v e r o t u s a l u e e l l e + v e r o t u s a l u e e s e e n + v e r o t u s a r v o + v e r o t u s a s e m a + v e r o t u s a s i a + v e r o t u s a s i a s i o i s s a + v e r o t u s a s i a t + v e r o t u s a s i o i d e n + v e r o t u s a s i o i h i n + v e r o t u s a s i o i s s a + v e r o t u s a s i o i s t a + v e r o t u s a s i o i t a + v e r o t u s a s t e + v e r o t u s a s t e i d e n + v e r o t u s a s t e t t a + v e r o t u s a u t o n o m i a a + v e r o t u s d i r e k t i i v i s t ä + v e r o t u s e h t o n s a + v e r o t u s e l i n t e n + v e r o t u s e s t e i d e n + v e r o t u s h a l l i n t o + v e r o t u s j ä r j e s t e l m i e n + v e r o t u s j ä r j e s t e l m i e n s ä + v e r o t u s j ä r j e s t e l m i i n + v e r o t u s j ä r j e s t e l m i l l ä + v e r o t u s j ä r j e s t e l m i n e e n + v e r o t u s j ä r j e s t e l m i s s ä + v e r o t u s j ä r j e s t e l m i s t ä + v e r o t u s j ä r j e s t e l m i ä + v e r o t u s j ä r j e s t e l m i ä k ä ä n + v e r o t u s j ä r j e s t e l m i ä m m e + v e r o t u s j ä r j e s t e l m i ä ä n + v e r o t u s j ä r j e s t e l m ä + v e r o t u s j ä r j e s t e l m ä l l ä + v e r o t u s j ä r j e s t e l m ä m m e + v e r o t u s j ä r j e s t e l m ä n + v e r o t u s j ä r j e s t e l m ä s s ä + v e r o t u s j ä r j e s t e l m ä s s ä ä n + v e r o t u s j ä r j e s t e l m ä s t ä + v e r o t u s j ä r j e s t e l m ä t + v e r o t u s j ä r j e s t e l m ä ä + v e r o t u s j ä r j e s t e l m ä ä m m e + v e r o t u s j ä r j e s t e l m ä ä n + v e r o t u s j ä r j e s t e l m ä ä n s ä + v e r o t u s j ä r j e s t e l y + v e r o t u s j ä r j e s t e l y i t ä + v e r o t u s j ä r j e s t e l y j ä + v e r o t u s j ä r j e s t e l y t + v e r o t u s j ä r j e s t e l y ä + v e r o t u s k a t e g o r i o i s s a + v e r o t u s k e h y s + v e r o t u s k e i n o i n + v e r o t u s k i e l l o n + v e r o t u s k i l p a i l u + v e r o t u s k i l p a i l u a + v e r o t u s k i l p a i l u n + v e r o t u s k o h t e l u + v e r o t u s k o h t e l u a + v e r o t u s k o h t e l u n + v e r o t u s k o h t e l u s s a + v e r o t u s k u s t a n n u s t e n + v e r o t u s k y k y ä + v e r o t u s k y s y m y k s e e n + v e r o t u s k y s y m y k s e n + v e r o t u s k y s y m y k s e t + v e r o t u s k y s y m y k s i i n + v e r o t u s k y s y m y k s i s s ä + v e r o t u s k y s y m y k s i s t ä + v e r o t u s k y s y m y k s i ä + v e r o t u s k y s y m y s + v e r o t u s k y s y m y s t e n + v e r o t u s k y s y m y s t ä + v e r o t u s k ä s i t t e l y ä + v e r o t u s k ä y t ä n n ö i s s ä + v e r o t u s k ä y t ä n n ö i s s ä ä n + v e r o t u s k ä y t ä n n ö i s t ä + v e r o t u s k ä y t ä n n ö t + v e r o t u s k ä y t ä n t ö + v e r o t u s k ä y t ä n t ö i h i n + v e r o t u s l a i n s ä ä d ä n n ö i s s ä + v e r o t u s l a i n s ä ä d ä n n ö n + v e r o t u s l a i n s ä ä d ä n n ö s s ä + v e r o t u s l a i n s ä ä d ä n t ö j ä + v e r o t u s l a i n s ä ä d ä n t ö ä + v e r o t u s l a i n s ä ä d ä n t ö ä ä n + v e r o t u s m a h d o l l i s u u d e n + v e r o t u s m a h d o l l i s u u d e t + v e r o t u s m a k s u i s t a + v e r o t u s m a l l i n + v e r o t u s m e k a n i s m i n + v e r o t u s m e n e t t e l y i h i n + v e r o t u s m e n e t t e l y j ä + v e r o t u s m i e t i n t ö j e n + v e r o t u s m u o t o j e n + v e r o t u s m ä ä r ä y k s i i n + v e r o t u s n ä k ö k o h d a t + v e r o t u s n ä k ö k o h t i a + v e r o t u s n ä k ö k o h t i i n + v e r o t u s o i k e u d e l l i s i a + v e r o t u s o i k e u d e n + v e r o t u s o i k e u s + v e r o t u s o i k e u t t a + v e r o t u s o l o s u h t e i d e n + v e r o t u s o l o s u h t e i l l a + v e r o t u s o n g e l m a t + v e r o t u s o n g e l m i a + v e r o t u s o n g e l m i s t a + v e r o t u s p a i k a n + v e r o t u s p a i k a s s a + v e r o t u s p a i k k a + v e r o t u s p a i k k a a + v e r o t u s p a i n e e t + v e r o t u s p a i n e i d e n + v e r o t u s p a i n e i s i i n + v e r o t u s p a i n e i t a + v e r o t u s p a i n e t t a + v e r o t u s p e r i a a t t e i s i i n + v e r o t u s p e r i a a t t e i s t a + v e r o t u s p e r u s t a + v e r o t u s p e r u s t a a + v e r o t u s p e r u s t a n + v e r o t u s p e r u s t e i t a + v e r o t u s p o h j a + v e r o t u s p o h j a n + v e r o t u s p o h j i e n + v e r o t u s p o l i i t t i s i a + v e r o t u s p o l i t i i k a n + v e r o t u s p o l i t i i k a s s a + v e r o t u s p o l i t i i k a s t a + v e r o t u s p o l i t i i k k a + v e r o t u s p o l i t i i k k a a + v e r o t u s p o l i t i i k k a a n + v e r o t u s p o l i t i i k k a n s a + v e r o t u s p o l i t i i k k o j a + v e r o t u s p o l i t i i k k o j e n + v e r o t u s p o t e n t i a a l i a + v e r o t u s p u i t t e i l l a + v e r o t u s p u o l e l l a + v e r o t u s p ä ä t ö k s i ä + v e r o t u s r a j a a + v e r o t u s r a j a n + v e r o t u s r a k e n n e t t a + v e r o t u s r a t k a i s u t + v e r o t u s r y h m ä n + v e r o t u s s o p i m u k s i a + v e r o t u s s t r a t e g i s i s t a + v e r o t u s s u h t e i s i i n + v e r o t u s s y i s t ä + v e r o t u s s ä ä n n ö s t e n + v e r o t u s s ä ä n n ö t + v e r o t u s s ä ä n t ö j e n + v e r o t u s s ä ä n t ö j ä + v e r o t u s t a + v e r o t u s t a a k a n + v e r o t u s t a a k k a a + v e r o t u s t a m m e + v e r o t u s t a r k o i t u k s i s s a + v e r o t u s t a s o + v e r o t u s t a s o a + v e r o t u s t a s o n + v e r o t u s t a s o n s a + v e r o t u s t a s o s t a + v e r o t u s t a s o t + v e r o t u s t e h t ä v ä + v e r o t u s t i e d o t + v e r o t u s t i e t o i h i n + v e r o t u s t i l a n n e t t a + v e r o t u s t i l a n t e e s e e n + v e r o t u s t o i m e n + v e r o t u s t o i m e n p i d e t t ä + v e r o t u s t o i m e n p i t e e t + v e r o t u s t o i m e n p i t e i d e n + v e r o t u s t o i m e n p i t e i s i i n + v e r o t u s t o i m e n p i t e i s t ä + v e r o t u s t o i m e n p i t e i t ä + v e r o t u s t o i m e t + v e r o t u s t o i m i a + v e r o t u s t o i m i e n + v e r o t u s t o i m i i n + v e r o t u s t o i m i s s a + v e r o t u s t o i m i s t a + v e r o t u s t o i m i v a l l a n + v e r o t u s t u k i a + v e r o t u s t y y p p i s e t + v e r o t u s u u d i s t u k s e l l e + v e r o t u s v a l t a + v e r o t u s v a l t a a n + v e r o t u s v a l t u u k s i e n + v e r o t u s v ä l i n e e l l ä + v e r o t u s v ä l i n e e t + v e r o t u s v ä l i n e i n ä + v e r o t u s v ä l i n e i t ä + v e r o t u s y h t e i s t y ö h ö n + v e r o t u s y m p ä r i s t ö + v e r o t u s y m p ä r i s t ö n + v e r o t u s y m p ä r i s t ö ä + v e r o t y y p i n + v e r o u n i o n i a + v e r o u u d i s t u k s e e n + v e r o u u d i s t u k s e n + v e r o u u d i s t u k s e s s a + v e r o u u d i s t u k s e s t a + v e r o u u d i s t u k s e t + v e r o u u d i s t u k s i a + v e r o u u d i s t u k s i l l a + v e r o u u d i s t u s + v e r o u u d i s t u s p o l i t i i k k o j a a n + v e r o u u d i s t u s t a + v e r o u u d i s t u s t e n + v e r o v a a t i m u k s i a + v e r o v a i h t o e h d o i s t a + v e r o v a i h t o e h t o a + v e r o v a l l a n + v e r o v a l v o n n a n + v e r o v a l v o n t a + v e r o v a l v o n t a a + v e r o v a l v o n t a a n + v e r o v a p a a + v e r o v a p a a l l a + v e r o v a p a a n + v e r o v a p a a s e e n + v e r o v a p a a s s a + v e r o v a p a a s t a + v e r o v a p a a t + v e r o v a p a a t a + v e r o v a p a i d e n + v e r o v a p a i k s i + v e r o v a p a i l l a + v e r o v a p a i s i i n + v e r o v a p a i s t a + v e r o v a p a i t a + v e r o v a p a u d e n + v e r o v a p a u d e s t a + v e r o v a p a u k s i a + v e r o v a p a u s + v e r o v a p a u s j ä r j e s t e l m ä + v e r o v a p a u s j ä r j e s t e l m ä n + v e r o v a p a u s j ä r j e s t e l m ä ä + v e r o v a p a u t t a + v e r o v a p a u t u k s e n + v e r o v a p a u t u k s e t + v e r o v a p a u t u k s i a + v e r o v a p a u t u k s i s t a + v e r o v a p a u t u s + v e r o v a p a u t u s p a k e t t e j a + v e r o v a p a u t u s p o l i t i i k k a a n s a + v e r o v a p a u t u s t a + v e r o v a p a u t u s t e n + v e r o v a r a t + v e r o v a r k a u s t a p a u s + v e r o v a r o i l l a + v e r o v a r o i n + v e r o v a r o i s t a + v e r o v a r o j a + v e r o v a r o j e n + v e r o v a s t u u + v e r o v a s t u u s t a + v e r o v e l a n + v e r o v e l a t + v e r o v e l k o j a + v e r o v e l k o j e n + v e r o v e l v o i t t e e t + v e r o v e l v o i t t e i d e n + v e r o v e l v o i t t e i s t a + v e r o v e l v o i t t e i t a + v e r o v e l v o l l i n e n + v e r o v e l v o l l i s e l l a + v e r o v e l v o l l i s i a + v e r o v e l v o l l i s i l l e + v e r o v e l v o l l i s t e n + v e r o v e l v o l l i s u u d e n + v e r o v e l v o l l i s u u d e s t a + v e r o v e l v o l l i s u u d e t + v e r o v e l v o l l i s u u k s i a + v e r o v e l v o l l i s u u k s i a a n + v e r o v e l v o l l i s u u k s i e n + v e r o v e l v o l l i s u u t e e n + v e r o v e l v o l l i s u u t t a a n + v e r o v e r o t u s j ä r j e s t e l m i e n + v e r o v e t o i s i s t a + v e r o v i r a n o m a i n e n + v e r o v i r a n o m a i s e n + v e r o v i r a n o m a i s e t + v e r o v i r a n o m a i s i i n + v e r o v i r a n o m a i s i l l a + v e r o v i r a n o m a i s i l l e + v e r o v i r a n o m a i s i l t a + v e r o v i r a n o m a i s t e n + v e r o v i r a s t o + v e r o v i r a s t o a + v e r o v i r a s t o l l e + v e r o v i r a s t o n + v e r o v i r k a m i e h e t + v e r o v o i t o i l l a + v e r o v u o n n a + v e r o v ä h e n n y k s e t + v e r o v ä h e n n y k s i i n + v e r o v ä h e n n y k s i l l ä + v e r o v ä h e n n y k s i n + v e r o v ä h e n n y k s i s s ä + v e r o v ä h e n n y k s i s t ä + v e r o v ä h e n n y k s i ä + v e r o v ä h e n n y s + v e r o v ä h e n n y s a s i o i s s a + v e r o v ä h e n n y s j ä r j e s t e l m ä + v e r o v ä h e n n y s j ä r j e s t e l m ä n + v e r o v ä h e n n y s k e l p o i s i a + v e r o v ä h e n n y s k e l p o i s u u d e n + v e r o v ä h e n n y s k e l p o i s u u s + v e r o v ä h e n n y s t e n + v e r o v ä h e n n y s t ä + v e r o v ä l i n e e l l ä + v e r o v ä l i n e e n + v e r o v ä l i n e i s t ä + v e r o y h t e i s t y ö + v e r o y h t e i s t y ö l l ä + v e r o y h t e i s t y ö n + v e r o y h t e i s t y ö t ä + v e r o y k s i k ö i d e n + v e r o y m p ä r i s t ö n + v e r o y m p ä r i s t ö ä + v e r r a n n o l l i s e l l e + v e r r a n n o l l i s i s t a + v e r r a n n o l l i s u u s l a s k u r i + v e r r a t a + v e r r a t a a n + v e r r a t a a n p a + v e r r a t e s s a a n + v e r r a t e s s a m m e + v e r r a t e s s a n i + v e r r a t k a a m m e + v e r r a t t a e s s a + v e r r a t t a v a + v e r r a t t a v i s t a + v e r r o k k i t u t k i m u s + v e r s i o h a l l i n t a + v e r s i o i h i n + v e r s i o i s s a + v e r s i o i t a + v e r s i o n s a + v e r s i o o n + v e r s i o s s a + v e r s i o s t a + v e r s i o t + v e r s i o t a + v e r s o j a + v e r s o p o l t e + v e r t a a m a l l a + v e r t a a m a t t a + v e r t a a n s a + v e r t a a v a t + v e r t a i l e m a a n + v e r t a i l e v a a + v e r t a i l e v a l l a + v e r t a i l e v a n + v e r t a i l l a + v e r t a i l l a a n + v e r t a i l t a e s s a + v e r t a i l t a v a m m i k s i + v e r t a i l t a v i s s a + v e r t a i l u a i n e i s t o a + v e r t a i l u a i n e k s e e n + v e r t a i l u a j a n j a k s o l l a + v e r t a i l u a j o n e u v o + v e r t a i l u a j o n e u v o n + v e r t a i l u a n a l y y s i + v e r t a i l u a n a l y y s i i n + v e r t a i l u a n a l y y s i n + v e r t a i l u a r v i o k e r t o m u k s e n + v e r t a i l u a r v o a + v e r t a i l u a r v o j e n + v e r t a i l u a r v o j ä r j e s t e l m ä + v e r t a i l u a r v o j ä r j e s t e l m ä n + v e r t a i l u a s e m a n a + v e r t a i l u a s i a k i r j a n + v e r t a i l u e d u t + v e r t a i l u e h t o j a + v e r t a i l u e t u + v e r t a i l u e t u j a + v e r t a i l u e t u j a a n + v e r t a i l u h i n n a t + v e r t a i l u i h i n + v e r t a i l u i n d i k a a t t o r e i s t a + v e r t a i l u i n d i k a a t t o r i t + v e r t a i l u j a + v e r t a i l u j a k s o + v e r t a i l u j a k s o a + v e r t a i l u j a k s o j a + v e r t a i l u j a k s o j e n + v e r t a i l u j a k s o k s i + v e r t a i l u j a k s o l l a + v e r t a i l u j a k s o n + v e r t a i l u j a k s o o n + v e r t a i l u j a k s o s t a + v e r t a i l u j a k s o t + v e r t a i l u j e n + v e r t a i l u j ä r j e s t e l m i s s ä + v e r t a i l u j ä r j e s t e l m ä + v e r t a i l u j ä r j e s t e l m ä n + v e r t a i l u k e h y s + v e r t a i l u k e l p o i n e n + v e r t a i l u k e l p o i s e m p a a + v e r t a i l u k e l p o i s e m p i a + v e r t a i l u k e l p o i s i a + v e r t a i l u k e l p o i s i i n + v e r t a i l u k e l p o i s i k s i + v e r t a i l u k e l p o i s t e n + v e r t a i l u k e l p o i s u u d e s s a + v e r t a i l u k e s k u k s i a + v e r t a i l u k e s k u s t a + v e r t a i l u k e s k u s t e n + v e r t a i l u k o h d a k s i + v e r t a i l u k o h d a n + v e r t a i l u k o h d a t + v e r t a i l u k o h d e + v e r t a i l u k o h t a + v e r t a i l u k o h t a n a + v e r t a i l u k o h t a n s a + v e r t a i l u k o h t i a + v e r t a i l u k o h t i i n + v e r t a i l u k o k e e t + v e r t a i l u k o k e i d e n + v e r t a i l u k o k e i s t a + v e r t a i l u k o k e i t a + v e r t a i l u k o r k o t a s o s t a + v e r t a i l u l a b o r a t o r i o + v e r t a i l u l a b o r a t o r i o i d e n + v e r t a i l u l a b o r a t o r i o i h i n + v e r t a i l u l a b o r a t o r i o n + v e r t a i l u l u v u t + v e r t a i l u l ä ä k e + v e r t a i l u l ä ä k e t t ä + v e r t a i l u l ä ä k k e i t ä + v e r t a i l u m a h d o l l i s u u k s i a + v e r t a i l u m a h d o l l i s u u k s i e n + v e r t a i l u m a t e r i a a l i t + v e r t a i l u m e n e t e l m i ä + v e r t a i l u m e n e t e l m ä + v e r t a i l u m e n e t e l m ä k e h y k s e n + v e r t a i l u m e n e t e l m ä n ä + v e r t a i l u m e n e t e l m ä ä + v e r t a i l u n + v e r t a i l u o p e r a a t t o r i + v e r t a i l u p a r a m e t r e j a + v e r t a i l u p e r i a a t e + v e r t a i l u p e r u s t a + v e r t a i l u p e r u s t e e t + v e r t a i l u p e r u s t e i s i i n + v e r t a i l u p e r u s t e i s t a + v e r t a i l u p i s t e + v e r t a i l u p i s t e i t ä + v e r t a i l u p ä i v ä m ä ä r ä k s i + v e r t a i l u r y h m i s s ä + v e r t a i l u r y h m ä s s ä + v e r t a i l u r y h m ä ä n + v e r t a i l u t a r k o i t u k s i s s a + v e r t a i l u t a u l u k k o + v e r t a i l u t a u l u k k o j a + v e r t a i l u t i e t o j a + v e r t a i l u t u l o k s e t + v e r t a i l u t u o t t e i s i i n + v e r t a i l u t u t k i m u k s e n + v e r t a i l u t u t k i m u s + v e r t a i l u t u t k i m u s t a + v e r t a i l u v a l u u t t a n a + v e r t a i l u v i i t e k e h y s + v e r t a i l u v u o n n a + v e r t a i l u v u o s i + v e r t a i l u v u o t e n a + v e r t a i l u v ä l i n e + v e r t a i l u v ä l i n e e k s i + v e r t a i l u v ä l i n e i s t ö + v e r t a i l u y k s i k k ö n ä + v e r t a i s a n a l y y s i + v e r t a i s a r v i o i d e n + v e r t a i s a r v i o i n n i l l a + v e r t a i s a r v i o i n n i l l e + v e r t a i s a r v i o i n n i n + v e r t a i s a r v i o i n n i s s a + v e r t a i s a r v i o i n n i s t a + v e r t a i s a r v i o i n n i t + v e r t a i s a r v i o i n t e i h i n + v e r t a i s a r v i o i n t e j a + v e r t a i s a r v i o i n t i a + v e r t a i s a r v i o i n t i e n + v e r t a i s a r v i o i n t i i n + v e r t a i s a r v i o i n t i j ä r j e s t e l m ä + v e r t a i s a r v i o i n t i j ä r j e s t e l m ä n + v e r t a i s a r v i o i n t i j ä r j e s t e l m ä s t ä + v e r t a i s a r v i o i n t i m e k a n i s m i i n + v e r t a i s a r v i o i n t i m e k a n i s m i l l a + v e r t a i s a r v i o i n t i m e n e t t e l y i h i n + v e r t a i s a r v i o i n t i m e n e t t e l y k s i + v e r t a i s a r v i o i n t i m e n e t t e l y n + v e r t a i s a r v i o i n t i p o l i t i i k k a a + v e r t a i s a r v i o i n t i p r o s e s s i + v e r t a i s a r v i o i n t i p r o s e s s i e n + v e r t a i s a r v i o i n t i p r o s e s s i n + v e r t a i s a r v i o i t a + v e r t a i s a r v i o m e n e t e l m ä + v e r t a i s a r v i o r y h m ä ä n + v e r t a i s a r v i o t + v e r t a i s a r v i o t a + v e r t a i s i a a n + v e r t a i s i n + v e r t a i s p a i n e + v e r t a i s p a i n o s t u k s e e n + v e r t a i s p a i n o s t u k s e l l e + v e r t a i s p a i n o s t u k s e n a + v e r t a i s p a i n o s t u s + v e r t a i s p a i n o s t u s t a + v e r t a i s p a l v e l u n + v e r t a i s r y h m i s s ä + v e r t a i s r y h m ä + v e r t a i s r y h m ä a r v i o i n n i n + v e r t a i s r y h m ä n + v e r t a i s r y h m ä o p e t u s t o i m i s s a + v e r t a i s r y h m ä t + v e r t a i s t a r k a s t e l u n a + v e r t a i s t e n + v e r t a i s t u k e a + v e r t a i s t u o t a n t o + v e r t a i s t u t k i m u k s e t + v e r t a i s t u t k i m u s t a + v e r t a i s v e r k o i s t a + v e r t a s i + v e r t a u k s i a + v e r t a u k s i s t a + v e r t a u s e l l i p s o i d i + v e r t a u s k o h d a n + v e r t a u s k o h t a + v e r t a u s k o h t a a + v e r t a u s k u v a a n + v e r t a u s k u v a l l i s e n + v e r t a u s k u v a l l i s e s t i + v e r t a u s k u v a l l i s i i n + v e r t a u s k u v a l l i s i m m i s t a + v e r t a u s t a + v e r t i k a a l i s e e n + v e r t i k a a l i s e s t i + v e r t i k a a l i s i a + v e r t i k a a l i s i l l e + v e r t i k a a l i s i s t a + v e r t i k a a l i s t a + v e r t i k a a l i s t e n + v e r u k k e e k s i + v e r u k k e e l l a + v e r u k k e e n a + v e r u k k e e n a a n + v e r u k k e e n s a + v e r u k k e i l l a + v e r u k k e i s i i n + v e r u k k e i t a + v e r u k k e i t t a + v e s i a l a + v e s i a l a a + v e s i a l a l l a + v e s i a l a n + v e s i a l l e r g i a + v e s i a l o i t e + v e s i a l o i t e t t a + v e s i a l o i t t e e n + v e s i a l o i t t e e s e e n + v e s i a l o i t t e e s t a + v e s i a l o j e n + v e s i a l t a a t + v e s i a l t a i s i i n + v e s i a l t a i s s a + v e s i a l u e e n + v e s i a l u e e t + v e s i a l u e i d e n + v e s i a l u e i l l a + v e s i a l u e i l l a m m e + v e s i a l u e i l l e + v e s i a l u e i s i i n + v e s i a l u e i t a + v e s i a l u e t t a + v e s i a p i n a h y p o t e e s i + v e s i a s i a n t u n t i j o i d e n + v e s i a s i a t + v e s i a s i o i h i n + v e s i d i r e k t i i v e j ä + v e s i d i r e k t i i v i + v e s i d i r e k t i i v i n + v e s i d i r e k t i i v i s t ä + v e s i d i r e k t i i v i ä + v e s i e k o s y s t e e m e j ä + v e s i e k o s y s t e e m i e n + v e s i e k o s y s t e e m i s s ä + v e s i e k o s y s t e e m i ä + v e s i e l i n y m p ä r i s t ö + v e s i e l i ö i h i n + v e s i e l ä i n t e n + v e s i e l ä m ä + v e s i e n + v e s i e n e r g i a + v e s i e n e r g i a a n + v e s i e n h o i t o h a n k k e i s i i n + v e s i e n h o i t o o n + v e s i e n h o i t o p o l i t i i k k a a + v e s i e n s u o j e l u + v e s i e n s u o j e l u a + v e s i e n s u o j e l u a l u e i d e n + v e s i e n s u o j e l u l a i n s ä ä d ä n n ö n + v e s i e n s u o j e l u m ä ä r ä y k s i ä + v e s i e n s u o j e l u n + v e s i e n s u o j e l u p o l i t i i k k a + v e s i e n s u o j e l u s t a + v e s i e n s u o j e l u u n + v e s i f o o r u m i + v e s i f o o r u m i a + v e s i f o o r u m i l t a + v e s i f o o r u m i n + v e s i f o o r u m i s s a + v e s i f o o r u m i s t a + v e s i g e n e t t i + v e s i h a l l i n n o n + v e s i h a l l i n n o s s a + v e s i h a l l i n t o a + v e s i h a n k k e e n + v e s i h a n k k e i d e n + v e s i h a n k k e i t a + v e s i h i i h t o + v e s i h i i h t ä j i e n + v e s i h i i s i + v e s i h u o l l o l l e + v e s i h u o l l o n + v e s i h u o l l o s s a + v e s i h u o l l o s t a + v e s i h u o l l o s t a m m e + v e s i h u o l t o + v e s i h u o l t o a + v e s i h u o l t o a l a a + v e s i h u o l t o a l a l l a + v e s i h u o l t o i n f r a s t r u k t u u r e j a + v e s i h u o l t o i n f r a s t r u k t u u r i a + v e s i h u o l t o i n f r a s t r u k t u u r i i n + v e s i h u o l t o j ä r j e s t e l m i ä + v e s i h u o l t o j ä r j e s t e l m ä n + v e s i h u o l t o j ä r j e s t e l m ä ä n s ä + v e s i h u o l t o k y s y m y k s i i n + v e s i h u o l t o m a r k k i n o i d e n + v e s i h u o l t o n e u v o s t o n + v e s i h u o l t o n s a + v e s i h u o l t o o n + v e s i h u o l t o p a l v e l u j a + v e s i h u o l t o p a l v e l u j e n + v e s i h u o l t o p a l v e l u t + v e s i h u o l t o p o l i t i i k a n + v e s i h u o l t o p o l i t i i k k a a + v e s i h u o l t o r a k e n t e i d e n + v e s i h u o l t o s u u n n i t e l m a + v e s i h u o l t o s u u n n i t e l m a a + v e s i h u o l t o s u u n n i t e l m a a n + v e s i h u o l t o s u u n n i t e l m a n + v e s i h u o l t o s u u n n i t e l m a s t a + v e s i h u o l t o v e r k k o + v e s i h u o l t o v e r k k o j a + v e s i h u o l t o v e r k k o j e n + v e s i h u o l t o v e r k o i l l e + v e s i h u o l t o v e r k o l l e + v e s i h u o l t o v e r k o s s a + v e s i h u o l t o v e r k o t + v e s i h ä m ä h ä k k i + v e s i h ö y r y + v e s i h ö y r y p i t o i s u u s + v e s i i m m e + v e s i i n + v e s i j a l a n j ä l k i + v e s i j o h d o i l l e + v e s i j o h d o t + v e s i j o h t o + v e s i j o h t o j a + v e s i j o h t o j e n + v e s i j o h t o j ä r j e s t e l m i ä + v e s i j o h t o p u t k i a + v e s i j o h t o v e d e n + v e s i j o h t o v e r k k o j a + v e s i j o h t o v e r k o i s t a + v e s i j o h t o v e r k o s t o j a + v e s i j o h t o v e s i + v e s i j o h t o v e t t ä + v e s i j ä r j e s t e l m i e n + v e s i j ä r j e s t e l m i i n + v e s i j ä r j e s t e l m i l l e + v e s i j ä r j e s t e l m i ä + v e s i j ä r j e s t e l m ä + v e s i j ä r j e s t e l m ä n + v e s i j ä r j e s t e l m ä s s ä + v e s i j ä r j e s t e l m ä ä + v e s i j ä r j e s t e l m ä ä m m e + v e s i j ä r j e s t e l m ä ä n + v e s i k a a s u + v e s i k a a v a a + v e s i k a a v a n + v e s i k a i v o a + v e s i k a n n u n + v e s i k a s t a n j a + v e s i k a t t i l a a + v e s i k a u h u k s i + v e s i k a u p p a a + v e s i k a u r i s + v e s i k e l l o + v e s i k e s k u s t e l u + v e s i k e s k u s t e l u n + v e s i k i d u t u s + v e s i k i e r r o n + v e s i k i n + v e s i k o i r a + v e s i k o m i s s i o + v e s i k o m i s s i o o n + v e s i k r i i s i + v e s i k r i i s i ä + v e s i k u l j e t u k s e n + v e s i k u l j e t u k s e t + v e s i k u l j e t u k s i a + v e s i k u l j e t u k s i i n + v e s i k u l j e t u k s i l l e + v e s i k u u s i + v e s i k y s y m y k s e n + v e s i k y s y m y k s e s s ä + v e s i k y s y m y k s e s t ä + v e s i k y s y m y k s e t + v e s i k y s y m y k s i s s ä + v e s i k y s y m y s + v e s i k y s y m y s t e n + v e s i k y s y m y s t ä + v e s i l a i n + v e s i l a i n s ä ä d ä n n ö l l e + v e s i l a i n s ä ä d ä n n ö n + v e s i l a i n s ä ä d ä n t ö ä + v e s i l a i t o k s i s t a + v e s i l a i t o s + v e s i l a i t o s t e n + v e s i l a s i + v e s i l a s i l l i s e n + v e s i l a s i s t a + v e s i l i i k e n n e + v e s i l i i k e n n e k ä y t ä v ä ä n + v e s i l i i k e n n e r e i t t i + v e s i l i i k e n n e t t ä + v e s i l i i k e n n e v ä y l ä ä + v e s i l i i k e n n e y h t e y k s i ä + v e s i l i i k e n t e e l l ä + v e s i l i i k e n t e e n + v e s i l i i k e n t e e s e e n + v e s i l i n n u t + v e s i l i n s s i + v e s i l i n t u j a + v e s i l i n t u j e n + v e s i l i s k o + v e s i l i t r a + v e s i l i u k o i s i a + v e s i l i u k u m ä k i + v e s i l l e + v e s i l l e e n + v e s i l l ä + v e s i l l ä ä n + v e s i l u o n n o n v a r o i h i n + v e s i l u o n n o n v a r o j a + v e s i l u o n n o n v a r o j e n + v e s i l u o n t o t y y p p e j ä + v e s i l ä h t e e n + v e s i l ä h t e e s t ä + v e s i l ä h t e i d e n + v e s i l ä h t e i t ä + v e s i m a k s u i s s a + v e s i m a k s u j a + v e s i m a k s u j e n + v e s i m a k s u p o l i t i i k k a + v e s i m a k s u t + v e s i m a k s u u n + v e s i m a r k k i n o i d e n + v e s i m a r k k i n o i t a + v e s i m a s s o j a + v e s i m a s s o j e n + v e s i m i e l i s i ä + v e s i m i n t t u + v e s i m i t t a r e i d e n + v e s i m i t t a r i + v e s i m i t t a r i t + v e s i m o k k a s i i n i k ä ä r m e + v e s i m u o d o s t u m a + v e s i m y r k y t y s + v e s i m y y r i ä + v e s i m y y r ä + v e s i m ä ä r i e n + v e s i m ä ä r i ä + v e s i m ä ä r ä + v e s i m ä ä r ä l l ä + v e s i n e n ä t t i + v e s i n e u v o s t o + v e s i n ä y t t e e t + v e s i n ä y t t e i t ä + v e s i o h j e l m a + v e s i o i k e u k s i a + v e s i o i k e u k s i e n + v e s i o i k e u s + v e s i o i n a s + v e s i o n g e l m a + v e s i o n g e l m a a n + v e s i o n g e l m a l l e + v e s i o n g e l m a n + v e s i o n g e l m a s t a + v e s i o n g e l m a t + v e s i o n g e l m i a + v e s i o n g e l m i i n + v e s i o n g e l m i i n s a + v e s i p a l l o + v e s i p a l l o m a a j o u k k u e + v e s i p a l v e l u i d e n + v e s i p a l v e l u i s t a + v e s i p a l v e l u i t a + v e s i p a l v e l u j e n + v e s i p a u n i k k o + v e s i p e r u s t a a + v e s i p i i r e j ä + v e s i p i i r i + v e s i p i i r i j o h t o i s e n + v e s i p i i r i n + v e s i p i i r i s t ä + v e s i p i s a r a + v e s i p i s a r o i t a + v e s i p i s t e e t + v e s i p i s t e i t ä + v e s i p o h j a i n e n + v e s i p o h j a i s e n + v e s i p o h j a i s i l l e + v e s i p o h j a i s t e n + v e s i p o l i i t t i s t a + v e s i p o l i t i i k a l l a + v e s i p o l i t i i k a l l e + v e s i p o l i t i i k a n + v e s i p o l i t i i k a s s a + v e s i p o l i t i i k a s t a + v e s i p o l i t i i k k a + v e s i p o l i t i i k k a a + v e s i p o l i t i i k k a a n + v e s i p u h v e l i + v e s i p u i s t o + v e s i p u i s t o s t a + v e s i p u i t e d i r e k t i i v i + v e s i p u i t e d i r e k t i i v i i n + v e s i p u i t e d i r e k t i i v i l l ä + v e s i p u i t e d i r e k t i i v i n + v e s i p u i t e d i r e k t i i v i s s ä + v e s i p u i t e d i r e k t i i v i s t ä + v e s i p u i t e d i r e k t i i v i ä + v e s i p u l a + v e s i p u l a a + v e s i p u l a a n + v e s i p u l a n + v e s i p u l a o n g e l m a + v e s i p u l a s s a + v e s i p u l a s t a + v e s i p u l l o a + v e s i p u l l o i s t a + v e s i p u m p p u j a + v e s i p u m p p u j e n + v e s i p u t k i k a t t i l a + v e s i p u t k i s s a + v e s i p u t o u s m a l l i + v e s i p y s s y + v e s i p ä h k i n ä + v e s i p ä i v ä n ä + v e s i p ä ä s k y + v e s i p ä ä s t ä i n e n + v e s i p ö y t ä k i r j a + v e s i p ö y t ä k i r j a a n + v e s i r a h a s t o + v e s i r a h a s t o a + v e s i r a h a s t o n + v e s i r a h a s t o o n + v e s i r a j o i h i n + v e s i r a j o j a + v e s i r a k e n n e l m i s t a + v e s i r a t a s + v e s i r e i t e i l l e + v e s i r e i t t e j ä + v e s i r e i t t i + v e s i r e s u r s s e i s t a + v e s i r e s u r s s i e m m e + v e s i r o k k o r o k o t e + v e s i r o t t a + v e s i r u t t o + v e s i s a r a + v e s i s e k t o r i l l a + v e s i s i i p p a + v e s i s i i r t o i h i n + v e s i s k o o t t e r e i t a + v e s i s k o o t t e r i + v e s i s k o o t t e r i t + v e s i s k o r p i o n i + v e s i s o d i s t a + v e s i s o p i m u k s e t + v e s i s o t a + v e s i s o t i e n + v e s i s s ä + v e s i s t a n d a r d i e n + v e s i s t r a t e g i a + v e s i s t ö a l u e + v e s i s t ö a l u e e l l a + v e s i s t ö a l u e e l l e + v e s i s t ö a l u e e n + v e s i s t ö a l u e e t + v e s i s t ö a l u e i d e n + v e s i s t ö a l u e i l l a + v e s i s t ö a l u e i l l e + v e s i s t ö a l u e i s t a + v e s i s t ö a l u e s u u n n i t e l m i a + v e s i s t ö a l u e t t a + v e s i s t ö d i r e k t i i v i + v e s i s t ö i h i m m e + v e s i s t ö i h i n + v e s i s t ö i s s ä + v e s i s t ö j e n + v e s i s t ö j ä + v e s i s t ö j ä r j e s t e l m i ä + v e s i s t ö n s u u n n i t t e l u d i r e k t i i v i n + v e s i s t ö s u u n n i t e l m a + v e s i s t ö s u u n n i t e l m a a + v e s i s t ö s u u n n i t e l m a s t a + v e s i s t ö s u u n n i t e l m i a + v e s i s t ö t + v e s i s t ö ä + v e s i s t ö ö n + v e s i s u i h k u l e i k k a u s + v e s i s u i h k u p r o p u l s i o + v e s i s u l k a + v e s i s u o n i + v e s i s u u n n i t e l m a + v e s i s u u n n i t e l m a a + v e s i s u u n n i t e l m a s s a + v e s i s u u n n i t e l m a s s a a n + v e s i s u u n n i t e l m a s s a m m e + v e s i s u u n n i t e l m a s t a + v e s i s u u n n i t e l m i e n + v e s i s ä h k ö v i r a s t o l l a + v e s i s ä h k ö v o i m a l a n + v e s i s ä i l i ö i h i n + v e s i s ä i l i ö i s s ä + v e s i s ä i l i ö i t ä + v e s i s ä i l i ö n + v e s i s ä t k i n + v e s i t a l o u d e l l e + v e s i t a l o u d e n + v e s i t a l o u d e s t a + v e s i t a l o u s + v e s i t a s a p a i n o a + v e s i t a s a p a i n o o n + v e s i t a t a r + v e s i t a v o i t t e e t + v e s i t e k n o l o g i o i d e n + v e s i t e t t y + v e s i t i e h a n k k e i d e n + v e s i t i e t o k a n t o j e n + v e s i t i l a n n e + v e s i t i l a n t e e n + v e s i t i l a n t e e s e e n + v e s i t i l a n t e e s t a + v e s i t o i m i t u k s e t + v e s i t o i m i t u k s i i n + v e s i t o i m i t u s v e r k o i l l e + v e s i t o r n i + v e s i t r i b u u n i s s a + v e s i t t y n y t + v e s i t t ä m ä t t ä + v e s i t t ä m ä ä n + v e s i t t ä ä + v e s i t u k i e n + v e s i t u o m i o i s t u i n t a + v e s i t u r b i i n i + v e s i t y k e i l l ä + v e s i t y k k e i h i n + v e s i t y k k e j ä + v e s i t y k k i + v e s i t y k k i e n + v e s i t y s t a u t i + v e s i u r h e i l u + v e s i u r h e i l u a + v e s i u r h e i l u k e s k u s + v e s i u r h e i l u l a j i e n + v e s i u r h e i l u n + v e s i u r u t + v e s i v a a k a + v e s i v a h i n k o + v e s i v a r a + v e s i v a r a k u s t a n n u k s i i n + v e s i v a r a m m e + v e s i v a r a n n o t + v e s i v a r a n s a + v e s i v a r a n t o + v e s i v a r a n t o a + v e s i v a r a n t o i h i n + v e s i v a r a n t o j a + v e s i v a r a s t o j a + v e s i v a r a s t o t + v e s i v a r a t + v e s i v a r o i h i m m e + v e s i v a r o i h i n + v e s i v a r o i l l a + v e s i v a r o i l l e + v e s i v a r o i l l e m m e + v e s i v a r o i s t a + v e s i v a r o j a + v e s i v a r o j a a n + v e s i v a r o j a m m e + v e s i v a r o j e m m e + v e s i v a r o j e n + v e s i v a u v a + v e s i v e r k k o + v e s i v e r k o s t o j e n + v e s i v e r s o + v e s i v i l j e l y a l a + v e s i v i l j e l y a l a a + v e s i v i l j e l y a l a a n + v e s i v i l j e l y a l a l l a + v e s i v i l j e l y a l a l l e + v e s i v i l j e l y a l a n + v e s i v i l j e l y a l a s t a + v e s i v i l j e l y a l o i h i n + v e s i v i l j e l y a l o i l l a + v e s i v i l j e l y a l o i l l e + v e s i v i l j e l y j ä r j e s t e l m i s s ä + v e s i v i l j e l y k ä ä n + v e s i v i l j e l y l a i t o k s e n + v e s i v i l j e l y l a i t o k s e s s a + v e s i v i l j e l y l a i t o k s i i n + v e s i v i l j e l y l a i t o s t e n + v e s i v i l j e l y l a j i e n + v e s i v i l j e l y l l e + v e s i v i l j e l y n + v e s i v i l j e l y p o l i t i i k a n + v e s i v i l j e l y s e k t o r i l l a + v e s i v i l j e l y s s ä + v e s i v i l j e l y s t r a t e g i a l l a + v e s i v i l j e l y t e o l l i s u u s + v e s i v i l j e l y t o i m i n t a a + v e s i v i l j e l y t u o t a n t o + v e s i v i l j e l y t u o t e a l a n + v e s i v i l j e l y t u o t e m a r k k i n o i d e n + v e s i v i l j e l y t u o t t e e t + v e s i v i l j e l y t u o t t e i d e n + v e s i v i l j e l y t u o t t e i s i i n + v e s i v i l j e l y t u o t t e i t a + v e s i v i l j e l y y n + v e s i v i l j e l y ä + v e s i v i r a n o m a i n e n + v e s i v i r a s t o + v e s i v i r a s t o s t a + v e s i v i s k u r i + v e s i v o i m a + v e s i v o i m a a + v e s i v o i m a a n + v e s i v o i m a e n e r g i a s t a + v e s i v o i m a h a n k e + v e s i v o i m a h a n k k e i s i i n + v e s i v o i m a h a n k k e i t a + v e s i v o i m a l a h a n k k e e s s a + v e s i v o i m a l a i t o k s i a + v e s i v o i m a l a i t o k s i s t a + v e s i v o i m a l a i t o s + v e s i v o i m a l a i t o s h a n k k e i t a + v e s i v o i m a l a i t o s s u u n n i t e l m i e n + v e s i v o i m a l a i t o s t a + v e s i v o i m a l a i t o s t e n + v e s i v o i m a l a n + v e s i v o i m a l a t + v e s i v o i m a l l a + v e s i v o i m a l o i d e n + v e s i v o i m a l o i t a + v e s i v o i m a n + v e s i v o i m a r e s u r s s i t + v e s i v o i m a s u u n n i t e l m i e n + v e s i v o i m a v a r a n t o j a + v e s i v o i m a v a r o j a + v e s i v ä y l i e n + v e s i v ä y l i l l e + v e s i v ä y l i l l ä + v e s i v ä y l i s t ä + v e s i v ä y l i ä + v e s i v ä y l ä + v e s i v ä y l ä h a n k k e i s i i n + v e s i y h t i ö i l l e + v e s i y h t i ö i l l ä + v e s i y l i j ä ä m ä n + v e s i y m p ä r i s t ö i n e e n + v e s i y m p ä r i s t ö l l e + v e s i y m p ä r i s t ö n + v e s i y m p ä r i s t ö s s ä + v e s i y m p ä r i s t ö s t ä + v e s i y m p ä r i s t ö ä + v e s i y m p ä r i s t ö ö n + v e s s a h u u m o r i + v e s s a p a p e r i r u l l a n + v e s s a p a p e r i t e l i n e + v e s t a a l i m i t t a r i + v e t e m m e + v e t e r a a n e i h i n + v e t e r a a n i j ä r j e s t ö + v e t e r a a n i j ä s e n e n ä + v e t e r a a n i p a r l a m e n t a a r i k k o n a + v e t e r a a n i p a s i f i s t i e n + v e t e r a a n i p ä i v ä + v e t e r a a n i t + v e t k u t e l l a + v e t k u t t e l e e + v e t o a a + v e t o a i s i n + v e t o a j o n e u v o n + v e t o a m a l l a + v e t o a m i n e n + v e t o a m i s j ä r j e s t e l m ä + v e t o a m i s m a h d o l l i s u u k s i s t a + v e t o a m i s o i k e u d e s t a + v e t o a m i s o i k e u s + v e t o a m i s t a + v e t o a m m e + v e t o a m m e k i n + v e t o a m m e k o + v e t o a n + v e t o a n k i n + v e t o i s u u d e s t a + v e t o k e t j u j ä r j e s t e l m ä n + v e t o n + v e t o o m u k s e e n + v e t o o m u k s e n + v e t o o m u k s e n s a + v e t o o m u k s e s s a + v e t o o m u k s e s t a + v e t o o m u k s e t + v e t o o m u k s i a + v e t o o m u k s i s t a + v e t o o m u k s i s t a a n + v e t o o m u s e l i m e n + v e t o o m u s e l i m i s s ä + v e t o o m u s e l i n t e n + v e t o o m u s i n s t r u m e n t t i a + v e t o o m u s j ä r j e s t e l m ä + v e t o o m u s j ä r j e s t e l m ä m m e + v e t o o m u s k a m p a n j a n + v e t o o m u s k o m i t e a l l a + v e t o o m u s m e n e t t e l y + v e t o o m u s m e n e t t e l y i s s ä + v e t o o m u s m e n e t t e l y j e n + v e t o o m u s m e n e t t e l y l l ä + v e t o o m u s m e n e t t e l y n + v e t o o m u s m e n e t t e l y s s ä + v e t o o m u s m e n e t t e l y s t ä + v e t o o m u s m e n e t t e l y y n + v e t o o m u s m e n e t t e l y ä + v e t o o m u s o i k e u d e n + v e t o o m u s o i k e u d e s t a + v e t o o m u s o i k e u s + v e t o o m u s o i k e u t e e n + v e t o o m u s o i k e u t t a + v e t o o m u s o i k e u t t a a n + v e t o o m u s p r o s e s s i + v e t o o m u s p r o s e s s i a + v e t o o m u s p ä ä t ö s l a u s e l m a + v e t o o m u s t a + v e t o o m u s t e n + v e t o o m u s t e n k ä s i t t e l y ä ä n + v e t o o m u s t u o m i o i s t u i m e n + v e t o o m u s t u o m i o i s t u i m e s s a + v e t o o m u s t u o m i o i s t u i n + v e t o o m u s t u o m i o i s t u i n t a + v e t o o m u s v a i h e e s s a + v e t o o m u s v a l i o k u n n a l l a + v e t o o m u s v a l i o k u n n a l l e + v e t o o m u s v a l i o k u n n a n + v e t o o m u s v a l i o k u n n a n k a a n + v e t o o m u s v a l i o k u n n a s s a + v e t o o m u s v a l i o k u n n a s t a + v e t o o m u s v a l i o k u n n i l l e + v e t o o m u s v a l i o k u n t a + v e t o o m u s v a l i o k u n t a a + v e t o o m u s v a l i o k u n t a a m m e + v e t o o m u s v a l i o k u n t a a n + v e t o o m u s v a l i o k u n t a a n k a a n + v e t o o m u s v a l i o k u n t a a n k i n + v e t o o m u s v a l i o k u n t a m m e + v e t o o m u s v a l i o k u n t a n a + v e t o o m u s v a l i o k u n t i a + v e t o o m u s v a l i o k u n t i e n + v e t o o m u s v a l i o k u n t i i n + v e t o o m u s v a l t i o k u n n a n + v e t o o m u s v a l t u u s k u n t a + v e t o o m u s v i r a n o m a i s t a + v e t o p e r i a a t e t t a + v e t o p e r i a a t t e e n + v e t o p o l i t i i k k a a + v e t o p ö y t ä + v e t o s i t t e + v e t o s i v a t + v e t o t e k i j ä k s i + v e t o t e k i j ä t + v e t o v o i m a a + v e t o v o i m a i s e m m a n + v e t o v o i m a i s e m p i + v e t o v o i m a k s i + v e t o v o i m a n a + v e t o v o i m a t e k i j ä + v e t t ä + v e t u r e i t a + v e t u r i n + v e t u r i n a + v e t u r i n k u l j e t t a j a n + v e t u r i n k u l j e t t a j a n a + v e t u r i n k u l j e t t a j a t + v e t u r i n k u l j e t t a j i a + v e t u r i n k u l j e t t a j i e n + v e t u r i n k u l j e t t a j i i n + v e t u r i n k u l j e t t a j i l l a + v e t u r i n k u l j e t t a j i l l e + v e t u r i n k u l j e t t a j i n a + v e t u r i t i l a u k s e t + v e t y a i k a a n + v e t y a j o n e u v o i h i n + v e t y a j o n e u v o j e n + v e t y a j o n e u v o t + v e t y b r o m i d i + v e t y b u s s e i s t a + v e t y e n e r g i a + v e t y e n e r g i a n + v e t y f l u o r i d i + v e t y j o d i d i + v e t y k e n n o j a + v e t y k e n n o j e n + v e t y k l o r i d i + v e t y k u l k u n e u v o i l l a + v e t y k ä y t t ö i s e t + v e t y k ä y t t ö i s i i n + v e t y k ä y t t ö i s i l l e + v e t y k ä y t t ö i s i ä + v e t y k ä y t t ö i s t e n + v e t y m o o t t o r i e n + v e t y p o l t t o a i n e + v e t y p o l t t o a i n e e n + v e t y p o l t t o a i n e t t a + v e t y p o l t t o k e n n o i h i n + v e t y p o l t t o k e n n o i s t a + v e t y p o l t t o k e n n o k ä y t t ö i s t e n + v e t y p o l t t o k e n n o t + v e t y p u m p u i l l a + v e t y r ä j ä h d y s + v e t y t a l o u d e n + v e t y t a l o u s + v e t y t a l o u t e e n + v e t y t e k n i i k k a a n + v e t y t e k n o l o g i a + v e t y t e k n o l o g i a a + v e t y t e k n o l o g i a a n + v e t y t e k n o l o g i a l l a + v e t y t e k n o l o g i a n + v e t y t u t k i m u s t a + v e t y v o i m a + v e t y v o i m a l l a + v e t y ä + v e t ä i s i v ä t + v e t ä m i s e l l ä + v e t ä m i s m e k a n i s m i n + v e t ä v ä t + v e t ä y d y t t y ä + v e t ä y t y e s s ä m m e + v e t ä y t y i + v e t ä y t y m i s a l u e i t a + v e t ä y t y m i s e n + v e t ä y t y m i s e s t ä + v e t ä y t y m i s h i n t o j a + v e t ä y t y m i s l a u s e k k e e n + v e t ä y t y m i s p r o s e s s i + v e t ä y t y m i s p r o s e s s i n + v e t ä y t y m i s s t r a t e g i a + v e t ä y t y m i s s t r a t e g i a a + v e t ä y t y m i s s t r a t e g i a n + v e t ä y t y m i s s t r a t e g i a s t a + v e t ä y t y m i s s t r a t e g i o i s t a + v e t ä y t y m i s s t r a t e g i o i t a + v e t ä y t y m i s s u u n n i t e l m a + v e t ä y t y m i s s u u n n i t e l m a a n + v e t ä y t y m i s s u u n n i t e l m a n + v e t ä y t y m i s t ä + v e t ä y t y m i s v a u h t i a + v e t ä y t y m ä ä n + v e t ä y t y n e e n + v e t ä y t y y + v e t ä y t y ä + v e t ä ä + v i a l l a + v i a s t a + v i a t o n t a + v i a t t o m a m m a s t a + v i a t t o m a n + v i a t t o m a t + v i a t t o m i a + v i a t t o m i e n + v i a t t o m i i n + v i a t t o m i l l e + v i a t t o m i l t a + v i a t t o m i m m i l l e + v i a t t o m i n a + v i a t t o m u u d e n + v i a t t o m u u s o l e t t a m a n + v i d e o a i n e i s t o a + v i d e o b l o g i + v i d e o e d i t o i n t i + v i d e o e s i t y k s e s t ä + v i d e o i t a + v i d e o k a a p p a u s + v i d e o k a m e r a t + v i d e o k a u p p a + v i d e o k o k o u k s e n + v i d e o k o k o u k s e s s a + v i d e o k o k o u k s e t + v i d e o k o k o u k s i a + v i d e o k o k o u s t e n + v i d e o k o n f e r e n s s i + v i d e o k o n f e r e n s s i i n + v i d e o k o n f e r e n s s i j ä r j e s t e l m i e n + v i d e o k o n f e r e n s s i j ä r j e s t e l m ä + v i d e o k o n f e r e n s s i n + v i d e o k o n f e r e n s s i s s a + v i d e o k o n f e r e n s s i s s a m m e + v i d e o k o n f e r e n s s i s t a + v i d e o k o o d e k k i + v i d e o k u v a s s a + v i d e o l ä h e t y k s i ä + v i d e o m a t e r i a a l i + v i d e o n + v i d e o n a u h o i s t a + v i d e o n a u h o i t u k s e s s a + v i d e o n a u h o i t u k s e t + v i d e o n e u v o t t e l u i s t a + v i d e o n m u o k k a u s o h j e l m a + v i d e o n p a k k a u k s e n + v i d e o p e l e i h i n + v i d e o p e l e i s s ä + v i d e o p e l e i s t ä + v i d e o p e l e j ä + v i d e o p e l i a l a s t a + v i d e o p e l i e n + v i d e o p e l i h a u t a j a i s e t + v i d e o p e l i k l o o n i + v i d e o p e l i k u l t t u u r i + v i d e o p e l i l a j i t y y p i t + v i d e o p e l i l a m a + v i d e o p e l i l l ä + v i d e o p e l i m u s i i k k i + v i d e o p e l i n + v i d e o p e l i o h j a i n + v i d e o p e l i r i i p p u v u u s + v i d e o p e l i s o t a a + v i d e o p e l i t + v i d e o p e l i t e o l l i s u u s + v i d e o p e l i v u o s i + v i d e o p r o j e k t o r i + v i d e o t + v i d e o t a l l e n t e e l t a + v i d e o t a l l e n t e i d e n + v i d e o v a l v o n t a j ä r j e s t e l m i ä + v i d e o v i e s t i s t ä + v i e d e s s ä m m e + v i e d ä + v i e d ä k s e e n + v i e d ä k s e m m e + v i e d ä k s e n i + v i e d ä ä n + v i e h ä t t ä v i m m i s t ä + v i e h ä t t ä ä + v i e h ä t y s v o i m a a + v i e h ä t y s v o i m a s t a a n + v i e j i e n + v i e j ä l l e + v i e j ä m a a l l e + v i e j ä m a a n + v i e j ä m a a t + v i e j ä m a i d e n + v i e j ä m a i l l a + v i e j ä m a i l l e + v i e j ä m a i s s a + v i e j ä m a i s t a + v i e j ä m a i t a + v i e j ä n ä + v i e j ä t + v i e j ä v a l t i o l l e + v i e k k a a m m i n + v i e l ä k ä ä n + v i e l ä k ö h ä n + v i e m i s e e n + v i e m i s e k s i + v i e m i s e s s ä + v i e m i s t ä + v i e m m e + v i e m ä l l ä + v i e m ä r i h y t t y n e n + v i e m ä r i j ä r j e s t e l m i e n + v i e m ä r i j ä r j e s t e l m i ä + v i e m ä r i j ä r j e s t e l m ä + v i e m ä r i j ä r j e s t e l m ä t + v i e m ä r i l i e t t e e n + v i e m ä r i l i e t t e e s t ä + v i e m ä r i t + v i e m ä r i v e r k k o a + v i e m ä r i v e r k o n + v i e m ä r i v e r k o s t o a + v i e m ä r i v e r k o s t o j e n + v i e m ä r i v e r k o t + v i e m ä r i v e t t ä + v i e m ä r ö i n t i i n + v i e m ä r ö i n t i j ä r j e s t e l m ä n + v i e m ä r ö i n t i p a l v e l u j a + v i e m ä r ö i n t i p a l v e l u j e n + v i e m ä s s ä + v i e m ä s t ä + v i e m ä t t ä + v i e m ä ä + v i e m ä ä n + v i e n e e t + v i e n n i l l e + v i e n n i l t ä m m e + v i e n n i n + v i e n n i n e d i s t ä m i s o h j e l m a t + v i e n n i n e d i s t ä m i s v ä l i n e + v i e n n i n v a l v o n t a p o l i t i i k k a a + v i e n n i s s ä + v i e n n i s t ä + v i e n t i a l a + v i e n t i a l a a + v i e n t i a l a l l a + v i e n t i a l o j a + v i e n t i a l u e i l l a + v i e n t i a l u e i l l e m m e + v i e n t i a r v o + v i e n t i a s e m a m m e + v i e n t i a s i a k i r j o j a + v i e n t i a s t e + v i e n t i a v u s t u k s e t + v i e n t i a v u s t u s t e n + v i e n t i b i s n e k s e s t ä + v i e n t i e s t e i t ä + v i e n t i e t u + v i e n t i e t u j a + v i e n t i e t u j e n + v i e n t i h y v i t y s + v i e n t i i m m e + v i e n t i i n + v i e n t i j o h t o i n e n + v i e n t i j ä r j e s t e l m ä + v i e n t i j ä r j e s t e l m ä n + v i e n t i j ä r j e s t e l m ä s t ä + v i e n t i j ä r j e s t e l m ä ä + v i e n t i j ä r j e s t e l m ä ä n + v i e n t i j ä r j e s t e l y j ä + v i e n t i k a n a v i a + v i e n t i k a n n a n + v i e n t i k a p a s i t e e t i n + v i e n t i k a p a s i t e e t t i + v i e n t i k a p a s i t e e t t i a + v i e n t i k a p a s i t e e t t i a a n + v i e n t i k a s v i i n + v i e n t i k a t t o a + v i e n t i k a u p a n + v i e n t i k a u p a s s a + v i e n t i k a u p a s t a + v i e n t i k a u p a s t a a n + v i e n t i k a u p p a a + v i e n t i k i e l l o i n + v i e n t i k i e l l o n + v i e n t i k i e l l o s t a + v i e n t i k i e l l o t + v i e n t i k i e l t o a + v i e n t i k i e l t o j a + v i e n t i k i e l t o j e n + v i e n t i k i e l t o k y s y m y k s e n + v i e n t i k i e l t o o n + v i e n t i k i i n t i ö i d e n + v i e n t i k i i n t i ö i s t ä + v i e n t i k i i n t i ö t + v i e n t i k i l p a i l u + v i e n t i k i l p a i l u k y k y ä + v i e n t i k i l p a i l u n + v i e n t i k i l p a i l u u n + v i e n t i k o r v a u k s e t + v i e n t i k o r v a u k s i l l e + v i e n t i k o r v a u s + v i e n t i k o r v a u s m e n o j e n + v i e n t i k o r v a u s o h j e l m a n + v i e n t i k o r v a u s t e n + v i e n t i k u l u j a + v i e n t i k u m p p a n e i s t a + v i e n t i k u s t a n n u k s e t + v i e n t i k y k y + v i e n t i k y k y ä + v i e n t i k y k y ä m m e + v i e n t i k y v y n + v i e n t i l a i t o k s i s s a + v i e n t i l a u s e k e + v i e n t i l i s e n s s i e n + v i e n t i l i s e n s s i n + v i e n t i l u o t o i s t a + v i e n t i l u o t o n + v i e n t i l u o t o t + v i e n t i l u o t t o a + v i e n t i l u o t t o i h i n + v i e n t i l u o t t o j a + v i e n t i l u o t t o j e n + v i e n t i l u o t t o j ä r j e s t e l m ä + v i e n t i l u o t t o l a i t o k s e t + v i e n t i l u o t t o l a i t o s + v i e n t i l u o t t o l a i t o s t e n + v i e n t i l u o t t o l u v a n + v i e n t i l u o t t o m ä ä r i s t ä + v i e n t i l u o t t o t a k u i d e n + v i e n t i l u o t t o t a k u u j ä r j e s t e l m ä n + v i e n t i l u o t t o v a k u u t u k s e n + v i e n t i l u o t t o v a k u u t u k s i e n + v i e n t i l u o t t o v a k u u t u s k a p a s i t e e t i n + v i e n t i l u o t t o v i r a s t o i l l e + v i e n t i l u p a a + v i e n t i l u p a h a k e m u k s i a + v i e n t i l u p a j ä r j e s t e l m ä + v i e n t i l u p a v a a t i m u s t e n + v i e n t i l u p i a + v i e n t i l u p i e n + v i e n t i l u v a n + v i e n t i l u v a t + v i e n t i l u v u t + v i e n t i l ä h t e e s t ä + v i e n t i l ä h t ö i s t ä + v i e n t i l ä ä k k e i t ä + v i e n t i m a a t + v i e n t i m a a t a l o u s + v i e n t i m a h d o l l i s u u d e s t a + v i e n t i m a h d o l l i s u u d e t + v i e n t i m a h d o l l i s u u k s i a + v i e n t i m a h d o l l i s u u k s i e n + v i e n t i m a h d o l l i s u u k s i i n + v i e n t i m a h d o l l i s u u k s i s t a + v i e n t i m a h t e j a + v i e n t i m a i d e n + v i e n t i m a i l l e + v i e n t i m a i s s a + v i e n t i m a k s u j a + v i e n t i m a r k k i n a + v i e n t i m a r k k i n a m m e + v i e n t i m a r k k i n a n s a + v i e n t i m a r k k i n a t + v i e n t i m a r k k i n o i d e n + v i e n t i m a r k k i n o i l l a + v i e n t i m a r k k i n o i l l a a n + v i e n t i m a r k k i n o i l l e + v i e n t i m a r k k i n o i l t a + v i e n t i m a r k k i n o i s t a + v i e n t i m a r k k i n o i t a + v i e n t i m a r k k i n o i t a m m e + v i e n t i m e k a n i s m i + v i e n t i m e k a n i s m i a + v i e n t i m e n e t t e l y j e n + v i e n t i m e n e t t e l y ä + v i e n t i m o n o p o l e i l l e + v i e n t i m o n o p o l e j a + v i e n t i m o n o p o l i n + v i e n t i m o o t t o r i + v i e n t i m ä ä r ä y k s i s s ä ä n + v i e n t i m ä ä r ä y k s i s t ä + v i e n t i n e u v o s t o n + v i e n t i n ä k y m i e n + v i e n t i n ä k y m ä t + v i e n t i o l o s u h t e i t a + v i e n t i o n g e l m a t + v i e n t i o s a a m i s e n + v i e n t i o s a a m i s t a + v i e n t i o s u u s + v i e n t i p a k o n + v i e n t i p a l a u t u k s i a + v i e n t i p a l a u t u s t e n + v i e n t i p a l v e l u i n a + v i e n t i p e r u s t a a n s a + v i e n t i p o h j a a + v i e n t i p o l i t i i k a n + v i e n t i p o l i t i i k a s s a + v i e n t i p o l i t i i k a s s a m m e + v i e n t i p o l i t i i k a s t a + v i e n t i p o l i t i i k k a a + v i e n t i p o l i t i i k k a a n + v i e n t i p o l i t i i k k a a n s a + v i e n t i p o l i t i i k o i t a + v i e n t i p o t e n t i a a l i + v i e n t i p o t e n t i a a l i a m m e + v i e n t i p u o l e l l a + v i e n t i r a h a s t o a l a a + v i e n t i r a j o i t u k s e t + v i e n t i r a j o i t u k s i a + v i e n t i r a j o i t u k s i a m m e + v i e n t i r a j o i t u k s i s t a + v i e n t i r a j o i t u s t e n + v i e n t i r a k e n t e i l l e + v i e n t i s e k t o r i + v i e n t i s e k t o r i l l e m m e + v i e n t i s e r t i f i k a a t t e j a + v i e n t i s i t o u m u s t e n + v i e n t i s t a t u s + v i e n t i s t r a t e g i a + v i e n t i s t r a t e g i a s t a + v i e n t i s u u n t a u t u n e i s u u d e s t a + v i e n t i s ä ä d ö k s i s t ä + v i e n t i s ä ä n n ö i s t ä + v i e n t i s ä ä n t ö j e n + v i e n t i s ä ä n t ö j ä + v i e n t i t a k u u t + v i e n t i t a l o u d e n + v i e n t i t a l o u s + v i e n t i t a l o u t e e n + v i e n t i t a p a h t u m a a + v i e n t i t a r i f f i t + v i e n t i t a r k a s t u k s e t + v i e n t i t a r k a s t u k s i i n + v i e n t i t a r k a s t u k s i s t a + v i e n t i t a r p e i t a + v i e n t i t a v a r a m m e + v i e n t i t e o l l i s u u d e n + v i e n t i t i e d o t + v i e n t i t i l a s t o j a + v i e n t i t i l a u k s e n + v i e n t i t i l a u k s e t + v i e n t i t i l a u k s i a + v i e n t i t o d i s t u k s i a + v i e n t i t o d i s t u s s ä ä n t ö j ä + v i e n t i t o d i s t u s t e n + v i e n t i t o i m i i n s a + v i e n t i t o i m i n n a n + v i e n t i t o i m i n t a + v i e n t i t u e l l e + v i e n t i t u e n + v i e n t i t u e s s a + v i e n t i t u e s t a + v i e n t i t u e t + v i e n t i t u i l l a + v i e n t i t u i l l e + v i e n t i t u i n + v i e n t i t u i s s a + v i e n t i t u i s t a + v i e n t i t u k e a + v i e n t i t u k e e n + v i e n t i t u k e m m e + v i e n t i t u k e n a + v i e n t i t u k e n s a + v i e n t i t u k i a + v i e n t i t u k i a a n + v i e n t i t u k i a m m e + v i e n t i t u k i a s i a n + v i e n t i t u k i b u d j e t t i i n + v i e n t i t u k i e m m e + v i e n t i t u k i e n + v i e n t i t u k i e n s a + v i e n t i t u k i i n + v i e n t i t u k i j ä r j e s t e l m ä + v i e n t i t u k i j ä r j e s t e l m ä n + v i e n t i t u k i j ä r j e s t e l m ä s s ä + v i e n t i t u k i j ä r j e s t e l m ä s t ä + v i e n t i t u k i j ä r j e s t e l m ä t + v i e n t i t u k i j ä r j e s t e l m ä ä + v i e n t i t u k i j ä r j e s t e l y t + v i e n t i t u k i k y s y m y s t ä + v i e n t i t u k i l e i k k a u k s i a + v i e n t i t u k i m a k s u t + v i e n t i t u k i m e n o t + v i e n t i t u k i m u o t o j e n + v i e n t i t u k i o h j e l m a n s a + v i e n t i t u k i p o l i t i i k a l l a m m e + v i e n t i t u k i p o l i t i i k a n + v i e n t i t u k i p o l i t i i k k a a + v i e n t i t u k i s ä ä n t ö j ä + v i e n t i t u k i t o d i s t u s t e n + v i e n t i t u l l e i n + v i e n t i t u l l i e n + v i e n t i t u l l i h e l p o t u k s i a + v i e n t i t u l l i t + v i e n t i t u l o a a n + v i e n t i t u l o i s t a + v i e n t i t u l o i s t a m m e + v i e n t i t u l o j a + v i e n t i t u l o j e n + v i e n t i t u l o n s a + v i e n t i t u l o s + v i e n t i t u l o s t a + v i e n t i t u l o t + v i e n t i t u o t a n t o o n + v i e n t i t u o t t e e n + v i e n t i t u o t t e e t + v i e n t i t u o t t e i d e n + v i e n t i t u o t t e i l l e + v i e n t i t u o t t e i s i i n + v i e n t i t u o t t e i s t a + v i e n t i t u o t t e i t a + v i e n t i v a a t i m u k s i i n + v i e n t i v a l m i u d e t + v i e n t i v a l m i u k s i a + v i e n t i v a l v o n n a n + v i e n t i v a l v o n n a s s a + v i e n t i v a l v o n n a s t a + v i e n t i v a l v o n t a + v i e n t i v a l v o n t a a + v i e n t i v a l v o n t a j ä r j e s t e l m i e n + v i e n t i v a l v o n t a j ä r j e s t e l m i s s ä + v i e n t i v a l v o n t a j ä r j e s t e l m ä + v i e n t i v a l v o n t a j ä r j e s t e l m ä n + v i e n t i v a l v o n t a j ä r j e s t e l m ä s s ä + v i e n t i v a l v o n t a t o i m e t + v i e n t i v a l v o n t a v ä l i n e + v i e n t i v e r o + v i e n t i v e r o a + v i e n t i v e r o a a n + v i e n t i v e r o j a + v i e n t i v e r o n + v i e n t i v e r o n a + v i e n t i v e r o s t a + v i e n t i v e t o i s e l l e + v i e n t i v e t o i s e n + v i e n t i v e t o i s i i n + v i e n t i v e t o i s i l l e + v i e n t i v i r t a m m e + v i e n t i v i r t o j a + v i e n t i v o i m a a + v i e n t i v o i t o i s t a + v i e n t i v o i t t o j a + v i e n t i v o l y y m i k a t t o + v i e n t i v ä y l ä n s ä + v i e n t i y h t i ö + v i e n t i y h t i ö i l l e k ä ä n + v i e n t i y k s i k ö i d e n + v i e n t i y l i j ä ä m i s t ä + v i e n t i y r i t y k s e n + v i e n t i y r i t y k s e t + v i e n t i y r i t y k s i l l e + v i e n t i y r i t y k s i s s ä + v i e n t i y r i t y k s i ä + v i e n t i y r i t y k s i ä m m e + v i e n t i y r i t y s t e n + v i e n t i ä + v i e n t i ä m m e + v i e n y t + v i e r a a m m e + v i e r a a n + v i e r a a n a + v i e r a a n a m m e + v i e r a a n n u t t a m a t t a + v i e r a a n n u t t a v a t + v i e r a a n t u m i s t a + v i e r a a n t u n e e t + v i e r a a n v a r a i s i m p i a + v i e r a a n v a r a i s u u s j ä r j e s t ö + v i e r a a n v a r a i s u u s s ä ä n n ö t + v i e r a a n v a r a i s u u t t a + v i e r a a t + v i e r a i d e n + v i e r a i l e e + v i e r a i l e m a a n + v i e r a i l e m a l l a + v i e r a i l e v a t + v i e r a i l e v i e n + v i e r a i l i + v i e r a i l i j a k e s k u k s e n + v i e r a i l i j a k e s k u k s e s t a + v i e r a i l i j a k e s k u s + v i e r a i l i j a l e h t e r e i l l ä + v i e r a i l i j a l e h t e r i l l ä + v i e r a i l i j a m ä ä r ä ä + v i e r a i l i j a n + v i e r a i l i j a o h j e l m a l l e + v i e r a i l i j a p a r v e l l a + v i e r a i l i j a r y h m i e n + v i e r a i l i j a r y h m i i n + v i e r a i l i j a r y h m i s t ä n i + v i e r a i l i j a r y h m i ä + v i e r a i l i j a r y h m ä + v i e r a i l i j a r y h m ä l l e n i + v i e r a i l i j a r y h m ä l l e n n e + v i e r a i l i j a r y h m ä l t ä n i + v i e r a i l i j a r y h m ä n + v i e r a i l i j a r y h m ä n i + v i e r a i l i j a r y h m ä s s ä + v i e r a i l i j a r y h m ä t + v i e r a i l i j a r y h m ä ä + v i e r a i l i j a v i i s u m i + v i e r a i l i j o i d e n + v i e r a i l i j o i n a + v i e r a i l i j o i s t a + v i e r a i l i j o i s t a n i + v i e r a i l i j o i t a + v i e r a i l i m m e + v i e r a i l i n + v i e r a i l i v a t + v i e r a i l k a a + v i e r a i l l a + v i e r a i l l e e t + v i e r a i l l e s s a + v i e r a i l l e s s a a n + v i e r a i l l e s s a m m e + v i e r a i l l e s s a n i + v i e r a i l l e s s a n n e + v i e r a i l l u t + v i e r a i l t a v a + v i e r a i l t u a a n + v i e r a i l t u a m m e + v i e r a i l t u a n i + v i e r a i l u a + v i e r a i l u i h i n + v i e r a i l u i l l a + v i e r a i l u i l l a a n + v i e r a i l u i l l a m m e + v i e r a i l u i l l a n i + v i e r a i l u k e s k u k s e e n + v i e r a i l u k e s k u k s e n + v i e r a i l u k e s k u s + v i e r a i l u k e s k u s t a + v i e r a i l u l l a + v i e r a i l u l l a a n + v i e r a i l u l l a n i + v i e r a i l u l u v a n + v i e r a i l u n + v i e r a i l u n n e + v i e r a i l u o h j e l m a a + v i e r a i l u o h j e l m a n + v i e r a i l u o i k e u k s i l t a + v i e r a i l u o i k e u k s i s t a + v i e r a i l u p a l v e l u + v i e r a i l u p a l v e l u u n + v i e r a i l u p e r i n n e t t ä + v i e r a i l u p ä i v ä n ä + v i e r a i l u r y h m ä + v i e r a i l u r y h m ä n i + v i e r a i l u r y h m ä t + v i e r a i l u s t a + v i e r a i l u s t a n n e + v i e r a i l u s ä ä n t ö j ä + v i e r a i l u t + v i e r a i l u v e r k o n + v i e r a i l u y k s i k ö n + v i e r a i n a + v i e r a i t a + v i e r a i t t e m m e + v i e r a i t t e n + v i e r a s a i n e e t + v i e r a s k i e l i s i l l ä + v i e r a s k i e l i s i s t ä + v i e r a s l a j e j a + v i e r a s l a j i + v i e r a s l a j i s t a + v i e r a s l i s t a + v i e r a s m a a l i s ä ä n t ö + v i e r a s p e r ä i s t e n + v i e r a s t y ö l ä i s e t + v i e r a s t y ö l ä i s i i n + v i e r a s t y ö l ä i s i l l e + v i e r a s t y ö l ä i s i ä + v i e r a s t y ö l ä i s t e n + v i e r a s t y ö v o i m a n + v i e r a s t y ö v o i m a n a + v i e r a s t y ö v o i m a s t a + v i e r a s v a l v o j a t + v i e r e k k ä i s e l l ä + v i e r i n t ä m e l u n + v i e r i n t ä m e l u s t a + v i e r i n t ä v a s t u k s e l l e + v i e r i n t ä v a s t u k s e n + v i e r i n t ä v a s t u s t a + v i e r i t t ä ä k s e e n + v i e r o i t u s k e s k u k s i i n + v i e r o i t u s o i r e i t a + v i e r o k s u n t a a + v i e r u s t o v e r i n i + v i e s t e i s s ä + v i e s t e i s t ä + v i e s t e j ä + v i e s t i a s e l a j i + v i e s t i e n + v i e s t i i + v i e s t i i n + v i e s t i j o u k o t + v i e s t i j u o k s u k i l p a i l u + v i e s t i k a p u l a n + v i e s t i k o e l a i t o s + v i e s t i k o n f e r e n s s i s s a + v i e s t i l i p u t + v i e s t i m m e + v i e s t i n i + v i e s t i n n ä n + v i e s t i n n ä n k u u n t e l u n + v i e s t i n n ä n s u o j e l u n + v i e s t i n n ä s s ä + v i e s t i n n ä s t ä + v i e s t i n s ä + v i e s t i n t e n + v i e s t i n t ä a l a + v i e s t i n t ä a l a l l a + v i e s t i n t ä a l a n + v i e s t i n t ä a l o i t e t t a + v i e s t i n t ä a l o i t t e e n + v i e s t i n t ä a l o i t t e i s i i n + v i e s t i n t ä a l o j e n + v i e s t i n t ä a l u e e l l a + v i e s t i n t ä b u d j e t t i a + v i e s t i n t ä e d u s t a j a + v i e s t i n t ä e d u s t a j a s t a + v i e s t i n t ä f a n i t + v i e s t i n t ä f o o r u m i + v i e s t i n t ä f o o r u m i n + v i e s t i n t ä h a n k e + v i e s t i n t ä h i n t o j e n + v i e s t i n t ä h i s t o r i a a + v i e s t i n t ä h ä i r i ö i d e n + v i e s t i n t ä h ä i r i ö t + v i e s t i n t ä i n f r a s t r u k t u u r i + v i e s t i n t ä i n f r a s t r u k t u u r i a + v i e s t i n t ä i n f r a s t r u k t u u r i e n + v i e s t i n t ä i n f r a s t r u k t u u r i i n + v i e s t i n t ä i n f r a s t r u k t u u r i n + v i e s t i n t ä j ä r j e s t e l m i e n + v i e s t i n t ä j ä r j e s t e l m i i n + v i e s t i n t ä j ä r j e s t e l m i s s ä + v i e s t i n t ä j ä r j e s t e l m i ä + v i e s t i n t ä j ä r j e s t e l m i ä ä n + v i e s t i n t ä j ä r j e s t e l m ä n + v i e s t i n t ä j ä r j e s t e l m ä s s ä + v i e s t i n t ä j ä r j e s t e l m ä ä + v i e s t i n t ä j ä r j e s t e l m ä ä n + v i e s t i n t ä k a m p a n j a + v i e s t i n t ä k a m p a n j a a + v i e s t i n t ä k a m p a n j a l l a + v i e s t i n t ä k a m p a n j a n + v i e s t i n t ä k a m p a n j o i d e n + v i e s t i n t ä k a m p a n j o i t a + v i e s t i n t ä k a n a v a n + v i e s t i n t ä k a n a v a n a + v i e s t i n t ä k a n a v a t + v i e s t i n t ä k a n a v i a + v i e s t i n t ä k a n a v i e n + v i e s t i n t ä k a n a v i s s a + v i e s t i n t ä k a s v a t u k s e e n + v i e s t i n t ä k a s v a t u k s e l l e + v i e s t i n t ä k e i n o i n + v i e s t i n t ä k e i n o j a + v i e s t i n t ä k e i n o j e n + v i e s t i n t ä k i e l e e n + v i e s t i n t ä k i e l e n + v i e s t i n t ä k i e l e n ä ä n + v i e s t i n t ä k i e l i + v i e s t i n t ä k o m i t e a n + v i e s t i n t ä k o n e i s t o + v i e s t i n t ä k r i i s i + v i e s t i n t ä k u i l u s t a + v i e s t i n t ä k u l t t u u r i n + v i e s t i n t ä k u l t t u u r i s s a + v i e s t i n t ä k u l t t u u r i s t a + v i e s t i n t ä k u s t a n n u k s e t + v i e s t i n t ä k y k y + v i e s t i n t ä k y s y m y k s i i n + v i e s t i n t ä k y s y m y s + v i e s t i n t ä k y v y s t ä + v i e s t i n t ä k ä y t ä v ä n ä + v i e s t i n t ä l a i t o s t e n + v i e s t i n t ä l a k i a + v i e s t i n t ä l a k i a l o i t t e e s e e n + v i e s t i n t ä l a k i i n + v i e s t i n t ä l i i k e n n e t i e d o t + v i e s t i n t ä l i i k e n n e t i e t o j a + v i e s t i n t ä l i i k e n n e t i e t o j e n + v i e s t i n t ä l i n j a t + v i e s t i n t ä m a h d o l l i s u u d e t + v i e s t i n t ä m a h d o l l i s u u k s i e n + v i e s t i n t ä m a h d o l l i s u u k s i l l e + v i e s t i n t ä m a h d o l l i s u u k s i s t a + v i e s t i n t ä m a l l i a + v i e s t i n t ä m a r k k i n a l a i n + v i e s t i n t ä m a r k k i n o i l l a + v i e s t i n t ä m e k a n i s m i + v i e s t i n t ä m e k a n i s m i i n + v i e s t i n t ä m e n e t e l m i e n + v i e s t i n t ä m e n e t e l m i i n + v i e s t i n t ä m e n e t e l m i ä + v i e s t i n t ä m e n e t e l m i ä ä n + v i e s t i n t ä m e n e t e l m ä + v i e s t i n t ä m e n e t e l m ä t + v i e s t i n t ä m e n e t e l m ä ä + v i e s t i n t ä m e n e t t e l y j ä + v i e s t i n t ä m i n i s t e r i n e u v o s t o n + v i e s t i n t ä m i n i s t e r i ö s s ä + v i e s t i n t ä m u o d o i l l e + v i e s t i n t ä m u o d o t + v i e s t i n t ä m u o t o j e n + v i e s t i n t ä o n g e l m a + v i e s t i n t ä o n g e l m a s t a + v i e s t i n t ä o n g e l m a t + v i e s t i n t ä o n g e l m i a + v i e s t i n t ä o n g e l m i s t a + v i e s t i n t ä o p e r a a t t o r i e n + v i e s t i n t ä o r g a n i s a a t i o n + v i e s t i n t ä o s a s t o j a + v i e s t i n t ä p a i n o p i s t e e t + v i e s t i n t ä p a l l o t o i m i n t a + v i e s t i n t ä p a l v e l u i d e n + v i e s t i n t ä p a l v e l u i l l e + v i e s t i n t ä p a l v e l u i s s a + v i e s t i n t ä p a l v e l u i s t a + v i e s t i n t ä p a l v e l u j a + v i e s t i n t ä p a l v e l u j a a n + v i e s t i n t ä p a l v e l u j e n + v i e s t i n t ä p a l v e l u n + v i e s t i n t ä p a l v e l u t + v i e s t i n t ä p a l v e l u u n + v i e s t i n t ä p o l i i t t i s e s s a + v i e s t i n t ä p o l i t i i k a l l a + v i e s t i n t ä p o l i t i i k a l l e + v i e s t i n t ä p o l i t i i k a l t a + v i e s t i n t ä p o l i t i i k a n + v i e s t i n t ä p o l i t i i k a s s a + v i e s t i n t ä p o l i t i i k a s t a + v i e s t i n t ä p o l i t i i k a s t a n n e + v i e s t i n t ä p o l i t i i k a t + v i e s t i n t ä p o l i t i i k k a + v i e s t i n t ä p o l i t i i k k a a + v i e s t i n t ä p o l i t i i k k a a m m e + v i e s t i n t ä p o l i t i i k k a a n + v i e s t i n t ä p o l i t i i k k a a n s a + v i e s t i n t ä p o l i t i i k k a m m e + v i e s t i n t ä p o l i t i i k o i s s a + v i e s t i n t ä p o n n i s t e l u i t a m m e + v i e s t i n t ä p o n n i s t e l u j a m m e + v i e s t i n t ä p r o s e s s i a + v i e s t i n t ä p r o s e s s i i n + v i e s t i n t ä p r o s e s s i s s a + v i e s t i n t ä p y r k i m y k s i s t ä m m e + v i e s t i n t ä p ä ä l l i k k ö + v i e s t i n t ä r a k e n t e i d e n s a + v i e s t i n t ä r a k e n t e i t a + v i e s t i n t ä r e i t t e j ä + v i e s t i n t ä r e s u r s s i e n + v i e s t i n t ä s a l a i s u u d e n + v i e s t i n t ä s a t e l l i i t t e j a m m e + v i e s t i n t ä s t r a t e g i a + v i e s t i n t ä s t r a t e g i a a + v i e s t i n t ä s t r a t e g i a a m m e + v i e s t i n t ä s t r a t e g i a a n + v i e s t i n t ä s t r a t e g i a k e h y k s e e n + v i e s t i n t ä s t r a t e g i a k s i + v i e s t i n t ä s t r a t e g i a l l a + v i e s t i n t ä s t r a t e g i a m m e + v i e s t i n t ä s t r a t e g i a n + v i e s t i n t ä s t r a t e g i a s s a + v i e s t i n t ä s t r a t e g i a s s a a n + v i e s t i n t ä s t r a t e g i a s t a + v i e s t i n t ä s t r a t e g i a t + v i e s t i n t ä s t r a t e g i o i d e n + v i e s t i n t ä s t r a t e g i o i h i n + v i e s t i n t ä s t r a t e g i o i l l a + v i e s t i n t ä s t r a t e g i o i t a + v i e s t i n t ä s t r a t e g i o i t a m m e + v i e s t i n t ä s u h t e i t a + v i e s t i n t ä s u u n n i t e l m a a + v i e s t i n t ä s u u n n i t e l m a s t a + v i e s t i n t ä s u u n n i t e l m i a + v i e s t i n t ä t a i d o i s t a n n e + v i e s t i n t ä t a i d o t + v i e s t i n t ä t a i t o j a + v i e s t i n t ä t a i t o j e n + v i e s t i n t ä t a i t o n n e + v i e s t i n t ä t a p a h t u m a + v i e s t i n t ä t a p o i h i n + v i e s t i n t ä t a r k o i t u k s i s s a + v i e s t i n t ä t a v a t + v i e s t i n t ä t e h t ä v ä ä n s ä + v i e s t i n t ä t e k n i i k a l l a + v i e s t i n t ä t e k n i i k a l l e + v i e s t i n t ä t e k n i i k a n + v i e s t i n t ä t e k n i i k a s s a + v i e s t i n t ä t e k n i i k a s t a + v i e s t i n t ä t e k n i i k a t + v i e s t i n t ä t e k n i i k k a a + v i e s t i n t ä t e k n i i k k a a n + v i e s t i n t ä t e k n i i k k a i n f r a s t r u k t u u r i a + v i e s t i n t ä t e k n i i k k a m m e + v i e s t i n t ä t e k n i i k k a p o l i t i i k a n + v i e s t i n t ä t e k n i i k k a t a i d o t + v i e s t i n t ä t e k n i i k k a t a i t o j e n + v i e s t i n t ä t e k n i i k k a t u o t t e i d e n + v i e s t i n t ä t e k n i i k k o j a + v i e s t i n t ä t e k n i i k k o j e n + v i e s t i n t ä t e k n i i k o i d e n + v i e s t i n t ä t e k n i i k o i h i n + v i e s t i n t ä t e k n i i k o i l l a + v i e s t i n t ä t e k n i i k o i t a + v i e s t i n t ä t e k n o l o g i a + v i e s t i n t ä t e k n o l o g i a a + v i e s t i n t ä t e k n o l o g i a a n + v i e s t i n t ä t e k n o l o g i a l l a + v i e s t i n t ä t e k n o l o g i a l t a + v i e s t i n t ä t e k n o l o g i a n + v i e s t i n t ä t e k n o l o g i a p a l v e l u j a + v i e s t i n t ä t e k n o l o g i a p o l i t i i k k a a n + v i e s t i n t ä t e k n o l o g i a s s a + v i e s t i n t ä t e k n o l o g i a s t a + v i e s t i n t ä t e k n o l o g i a t + v i e s t i n t ä t e k n o l o g i o i d e n + v i e s t i n t ä t e k n o l o g i o i h i n + v i e s t i n t ä t e k n o l o g i o i s s a + v i e s t i n t ä t e k n o l o g i o i t a + v i e s t i n t ä t e k n o l o g i s t e n + v i e s t i n t ä t e o l l i s u u d e l t a + v i e s t i n t ä t e o l l i s u u d e n + v i e s t i n t ä t e o l l i s u u s + v i e s t i n t ä t e o l l i s u u t t a + v i e s t i n t ä t i e t e e t + v i e s t i n t ä t o i m e n p i t e e n ä + v i e s t i n t ä t o i m e t + v i e s t i n t ä t o i m i a + v i e s t i n t ä t o i m i a m m e + v i e s t i n t ä t o i m i e n + v i e s t i n t ä t o i m i l l e m m e + v i e s t i n t ä t o i m i n n a n + v i e s t i n t ä t o i m i s s a + v i e s t i n t ä t o i m i s t o l l a + v i e s t i n t ä t y ö n + v i e s t i n t ä t y ö t ä + v i e s t i n t ä u u d i s t u s t a + v i e s t i n t ä v a i h e e n + v i e s t i n t ä v a i k e u d e t + v i e s t i n t ä v a i k u t u s + v i e s t i n t ä v a j e + v i e s t i n t ä v a j e e s t a + v i e s t i n t ä v a l l a n k u m o u s + v i e s t i n t ä v a l m i u k s i e n + v i e s t i n t ä v a l m i u t e e n + v i e s t i n t ä v a p a u t t a + v i e s t i n t ä v e r k k o + v i e s t i n t ä v e r k k o a + v i e s t i n t ä v e r k k o i h i n + v i e s t i n t ä v e r k k o j a + v i e s t i n t ä v e r k k o j e n + v i e s t i n t ä v e r k k o j e n s a + v i e s t i n t ä v e r k o i l l a + v i e s t i n t ä v e r k o i s s a + v i e s t i n t ä v e r k o i s t a + v i e s t i n t ä v e r k o n + v i e s t i n t ä v e r k o s t o j a + v i e s t i n t ä v e r k o s t o j e n + v i e s t i n t ä v e r k o s t o o n + v i e s t i n t ä v e r k o s t o t + v i e s t i n t ä v e r k o t + v i e s t i n t ä v i r a n o m a i s i a + v i e s t i n t ä v ä l i n e e n + v i e s t i n t ä v ä l i n e e n ä + v i e s t i n t ä v ä l i n e e t + v i e s t i n t ä v ä l i n e i d e n + v i e s t i n t ä v ä l i n e i l l e + v i e s t i n t ä v ä l i n e i s i i n + v i e s t i n t ä v ä l i n e i s t ä + v i e s t i n t ä v ä l i n e i t ä + v i e s t i n t ä v ä l i n e i t ä ä n + v i e s t i n t ä y h t e i s k u n n a n + v i e s t i n t ä y h t e y d e t + v i e s t i n t ä y h t e y k s i e n + v i e s t i n t ä y m p ä r i s t ö + v i e s t i n t ä y m p ä r i s t ö n + v i e s t i n t ä y m p ä r i s t ö ä + v i e s t i n t ä y r i t y k s e n + v i e s t i n t ä y r i t y k s i l t ä + v i e s t i n t ä y r i t y s t e n + v i e s t i n t ä ä + v i e s t i n y t + v i e s t i s s ä + v i e s t i s t ä + v i e s t i t + v i e s t i t e t t i i n + v i e s t i t e t ä ä n + v i e s t i t t i + v i e s t i t t ä i s i + v i e s t i t t ä ä + v i e s t i t t ä ä k s e e n + v i e s t i t t ä ä k s e n n e + v i e s t i t ä m m e + v i e s t i t ä ä n + v i e s t i ä + v i e t e l l ä + v i e t e t t y + v i e t e t t y ä n i + v i e t e t t y ä ä n + v i e t e t ä ä n + v i e t i i n + v i e t i n + v i e t n a m i a + v i e t n a m i l a i s e t + v i e t n a m i l a i s h a l l i n t o o n + v i e t n a m i l a i s m y ö n t e i s e n + v i e t n a m i l a i s s i s s i t + v i e t n a m i l a i s t e n + v i e t n a m i l a i s t o r i t + v i e t n a m i n + v i e t n a m i n n a k k e l i + v i e t n a m i s s a + v i e t n a m i s t a + v i e t t e l y k s e n + v i e t t e l y s t e n + v i e t t ä k ä ä m m e + v i e t t ä m ä ä n + v i e t t ä ä + v i e t ä v i k s i + v i e v i e n + v i e v i i n + v i e v i ä + v i e v ä t + v i h a a n + v i h a a n s a + v i h a a v a t + v i h a i s e m p i + v i h a i s e m p i a + v i h a i s i a + v i h a k a m p a n j a + v i h a k a m p a n j a a + v i h a k a m p a n j a n + v i h a k a m p a n j a s s a + v i h a k a m p a n j o i s t a + v i h a l l a + v i h a m i e h i ä + v i h a m i e l i s e e n + v i h a m i e l i s e k s i + v i h a m i e l i s e m m i n + v i h a m i e l i s e m m ä k s i + v i h a m i e l i s e m p i + v i h a m i e l i s e n ä + v i h a m i e l i s e s t ä + v i h a m i e l i s e t + v i h a m i e l i s i l l e + v i h a m i e l i s i ä + v i h a m i e l i s t e n + v i h a m i e l i s t ä + v i h a m i e l i s y y d e t + v i h a m i e l i s y y k s i e n + v i h a m i e l i s y y k s i i n + v i h a m i e l i s y y k s i ä + v i h a m i e l i s y y t e n s ä + v i h a m u r h a a + v i h a n + v i h a n h u u d o t + v i h a n k a s v a t u s + v i h a n l i e t s o j a + v i h a n l i e t s o j a t + v i h a n l i e t s o n n a n + v i h a n l i e t s o n t a n a + v i h a n n e k s e n + v i h a n n e k s i a + v i h a n n e s a l a + v i h a n n e s a l a a + v i h a n n e s a l a a n + v i h a n n e s a l a l l a + v i h a n n e s a l a n + v i h a n n e s a l o i h i n + v i h a n n e s j ä r j e s t e l y ä + v i h a n n e s k a u p p o i h i n + v i h a n n e s k y s y m y k s e n + v i h a n n e s m a r k k i n a t + v i h a n n e s m a r k k i n o i d e n + v i h a n n e s m a r k k i n o i l l a + v i h a n n e s m a r k k i n o i l l e + v i h a n n e s m a r k k i n o i t a + v i h a n n e s o s a s t o l l a + v i h a n n e s t e n + v i h a n n e s t u o t t a j a t + v i h a n n e s t u o t t a j i e n + v i h a n n e s t u o t t a j i i n + v i h a n n e s t u o t t a j i l l e + v i h a n n e s v i l j e l i j ä t + v i h a n n e s v i l j e l i j ö i l l e + v i h a n s a + v i h a p u h e + v i h a p u h e e n + v i h a p u h e e s e e n + v i h a p u h e e s t a + v i h a p u h e e t + v i h a p u h e i l l a + v i h a p u h e t t a + v i h a r i k o k s e t + v i h a r i k o k s i a + v i h a r i k o s + v i h a r i k o s t a + v i h a r y h m ä + v i h a s a a r n a a j a + v i h a s a a r n a a j a t e r r o r i s t e j a + v i h a s a n o m a n s a + v i h a s t u a + v i h a s t u m i n e n + v i h a t u i n + v i h a v i e s t i t + v i h d o i n k i n + v i h e l l y s k i e l i + v i h e l t ä j ä h i i r i h a u k k a + v i h e l t ä j ä k e r t t u l i + v i h e l t ä j ä k i u r u + v i h e l t ä j ä m e s i k k o + v i h e l t ä j ä s o r s a t + v i h e l t ä j ä t a n g a r a + v i h e l t ä j ä t r o g o n i + v i h e r a l u e i d e n + v i h e r a l u e i l l a + v i h e r a l u e i l l e + v i h e r a l u e i t a m m e + v i h e r a n a k o n d a + v i h e r a r o k e r t t u + v i h e r b a r e t t e j a + v i h e r e r a k k o k o l i b r i + v i h e r f a s a a n i + v i h e r h a a r a k a s + v i h e r h a i v e n k o l i b r i + v i h e r h a p s u k o l i b r i + v i h e r h a r a k k a + v i h e r h a r l e k i i n i + v i h e r h o h t o k o l i b r i + v i h e r h u i s k u k e r t t u + v i h e r h u p p u k o l i b r i + v i h e r h ä m ä h ä k k i + v i h e r j ä k ä l ä y ö k k ö n e n + v i h e r j ä s e n r u o h o + v i h e r k a i j a n e n + v i h e r k a r d i n a a l i + v i h e r k a t t o + v i h e r k a u l u s s i e n i + v i h e r k a u l u s t y ö p a i k k o j a + v i h e r k e r t t u l i + v i h e r k o b r a + v i h e r k o n n a + v i h e r k o t t a r a i n e n + v i h e r k o u k k u k o l i b r i + v i h e r k u h a n k e i t t ä j ä + v i h e r k u l t a k o l i b r i + v i h e r k u u l t o m o n n i + v i h e r k y y h k y t + v i h e r l a k k i k e r t t u l i + v i h e r l a t t a n o k k a + v i h e r l e h t i s a m m a k k o + v i h e r l e p i n k ä i s t y r a n n i + v i h e r l e u k a k o l i b r i + v i h e r l e v ä n + v i h e r l e v ä t + v i h e r l e v ä ä + v i h e r l o i s t o r a s t a s + v i h e r l u i k e r o + v i h e r l u r i + v i h e r l y i j y k e r t t u + v i h e r m a m b a + v i h e r m a r j a k o t i n g a + v i h e r m i t t a r i + v i h e r n e i t o k a l a + v i h e r n o k k a k a i j a + v i h e r o r v o k k i k o l i b r i + v i h e r p a l l o k a l a + v i h e r p i k k u m o n a r k k i + v i h e r r a i t a k a i j a + v i h e r r a u n i o i n e n + v i h e r r e v o n h ä n t ä + v i h e r r i i k i n k u k k o + v i h e r r i n t a l e p i n k ä i n e n + v i h e r r i t a r i + v i h e r s i i p i k a r d i n a a l i + v i h e r s i m p u k k a + v i h e r t a l i t i a i n e n + v i h e r t a n s s i j a + v i h e r t a s k u k o l i b r i + v i h e r t i i k e r i p e i p p o + v i h e r t i k k a + v i h e r t i k k a n e n + v i h e r t u o k s u m a l i k k a + v i h e r t y t ö n k o r e n t o + v i h e r t y y + v i h e r t ä p l ä p e i p p o + v i h e r t ö p ö k e r t t u n e n + v i h e r u k o n k o r e n t o + v i h e r v a h a n o k k a + v i h e r v a r p u m i t t a r i + v i h e r v i i d a k k o k a n a + v i h e r v i i r i k a i j a + v i h e r v u o r i k e r t t u + v i h e r v y ö h y k k e e t + v i h j a i l u i h i n + v i h j a i l u i s t a + v i h j a i l u j a + v i h j a u k s e t + v i h j e l i n j a p a l v e l u n + v i h j e l i n j a v e r k o s t o n + v i h j e l i n j a v e r k o s t o o n + v i h j e l i n j o j a + v i h j e p u h e l i n + v i h k i p i i s p a + v i h k i r i s t i + v i h n e m ä n t y + v i h n e s a r a + v i h o l l i s a l a n s a + v i h o l l i s a l u e e k s i + v i h o l l i s a s e t e l m a a + v i h o l l i s e n + v i h o l l i s e t + v i h o l l i s i s t a + v i h o l l i s j e n g e i l l e + v i h o l l i s k o h t e i s i i n + v i h o l l i s k u v a n + v i h o l l i s m a i d e n + v i h o l l i s t a + v i h o l l i s t a i s t e l i j o i d e n + v i h o l l i s t a i s t e l i j o i k s i + v i h o l l i s t a m m e + v i h o l l i s t a s i + v i h o l l i s u u d e t + v i h o l l i s u u k s i e n + v i h o n v i i m e i s e n ä + v i h r e i d e n + v i h r e i l l e + v i h r e i l l ä + v i h r e i m p i ä + v i h r e i n ä + v i h r e i s i i n + v i h r e i s t ä + v i h r e i t ä + v i h r e ä k o r t t i j ä r j e s t e l m ä + v i h r e ä k o r t t i t o i m i s t o n + v i h r e ä k o r t t i t o i m i s t o t + v i h r e ä k s i + v i h r e ä l l e + v i h r e ä l l ä + v i h r e ä l t ä + v i h r e ä m m ä t + v i h r e ä m p i ä + v i h r e ä n + v i h r e ä n ä + v i h r e ä s s ä + v i h r e ä s t ä + v i h r e ä t + v i h r e ä t ä + v i h r e ä ä + v i h r e ä ä n + v i i d a k k o a + v i i d a k k o b u l b u l i + v i i d a k k o h a r l e k i i n i + v i i d a k k o k i r j a + v i i d a k k o k i r j o r a s t a s + v i i d a k k o k i s s a + v i i d a k k o k u u m e + v i i d a k k o l e p p ä l i n t u + v i i d a k k o l i n t u h a u k k a + v i i d a k k o m a i n a + v i i d a k k o p e r h e + v i i d a k k o p y y j u o k s i j a + v i i d a k k o r a i t a t i k k a n e n + v i i d a k k o s e i k k a i l u + v i i d a k k o t ö y h t ö n ä r h i + v i i d a k k o v i i k a r i t + v i i d a k k o v i l l i t y s + v i i d a k o n + v i i d a k o n l a e i l l e + v i i d e k s i + v i i d e l l e + v i i d e l t ä + v i i d e n + v i i d e n l a i s i a + v i i d e n n e k s e e n + v i i d e n n e k s e l l ä + v i i d e n n e k s e n + v i i d e n n e k s e s t ä + v i i d e n n e k s i + v i i d e n n e n + v i i d e n n e s s ä + v i i d e n n e s t ä + v i i d e n n e s t ä k ä ä n + v i i d e n t e e n + v i i d e s o s a a + v i i d e s o s a l t a + v i i d e s o s a n + v i i d e s s ä + v i i d e s t ä + v i i h d e a l a + v i i h d e a l a a + v i i h d e a l a a n + v i i h d e a l a l l a + v i i h d e a l a n + v i i h d e k e s k u k s e t + v i i h d e t u o t t e e t + v i i h d y t t e + v i i h d y t t ä m i s e k s e e n + v i i h d y t t ä ä k s e n i + v i i h t y v ä n + v i i h t y y + v i i h t y ä + v i i k a t e k i p u a j a + v i i k a t e v a u n u + v i i k i n k i m e t a l l i + v i i k k o a + v i i k k o a n s i o s t a + v i i k k o i n a + v i i k k o j a + v i i k k o j e n + v i i k k o j e n k i n + v i i k k o k a u s i a + v i i k k o l e h d e n + v i i k k o l e h d e s s ä + v i i k k o l e h t e ä + v i i k k o l e h t i + v i i k k o l e p o a + v i i k k o l e p o a i k o j e n + v i i k k o m ä ä r ä n + v i i k k o n a + v i i k k o o n + v i i k k o r a h a a + v i i k k o t a s o l l a + v i i k k o t i e d o t t e e s s a + v i i k k o t u n n i n + v i i k k o t u n t i a + v i i k k o t y ö a i k a + v i i k k o t y ö a i k a a + v i i k k o t y ö t u n t i a + v i i k o i s s a + v i i k o i s t a + v i i k o i t t a i s e e n + v i i k o i t t a i s i a + v i i k o i t t a i s i s t a + v i i k o i t t a i s t a + v i i k o l l a + v i i k o n + v i i k o n l o p p u a j o i s t a + v i i k o n l o p p u a j o k i e l l o t + v i i k o n l o p p u a j o k i e l t o j a + v i i k o n l o p p u a j o k i e l t o j e n + v i i k o n l o p p u j a + v i i k o n l o p p u k o k o u k s e n + v i i k o n l o p p u n a + v i i k o n l o p p u t y ö s t ä + v i i k o n l o p u l l e + v i i k o n l o p u n + v i i k o n p ä i v i e n + v i i k o n p ä i v i n ä + v i i k o n p ä i v ä n + v i i k o n p ä i v ä n ä + v i i k o n p ä i v ä t + v i i k o n v a i h t e e s s a + v i i k o s s a + v i i k o t + v i i k s e t + v i i k s i e r a k k o k o l i b r i + v i i k s i h e m p p o + v i i k s i h y y p p ä + v i i k s i k e r t t u l i + v i i k s i k i p u a j a + v i i k s i l a u l u m e s i k k o + v i i k s i l u h t a k a n a + v i i k s i m a r a k a t t i + v i i k s i r a s t a s + v i i k s i s i i p p a + v i i k s i s i m p p u + v i i k s i s i r p p i k i p u a j a + v i i k s i t i m a l i + v i i k s i t ä p l ä t i k k a + v i i k s i v a h a + v i i k u n a k a i j a + v i i k u n a k o t t a r a i n e n + v i i k u n a n l e h t e n s ä + v i i k u n a n l e h t e n ä + v i i k u n a n l e h t e ä + v i i k u n a n l e h t i + v i i k u n a o p u n t i a + v i i l e n e e + v i i l e n e m i s e n + v i i l e ä n + v i i l t o p e i p p o + v i i l t o s a r a + v i i l u p u u + v i i m e a i k a i s e e n + v i i m e a i k a i s e l l e + v i i m e a i k a i s e m m i s t a + v i i m e a i k a i s e m p i a + v i i m e a i k a i s e m p i e n + v i i m e a i k a i s e n + v i i m e a i k a i s e s s a + v i i m e a i k a i s e s t a + v i i m e a i k a i s e t + v i i m e a i k a i s i a + v i i m e a i k a i s i i n + v i i m e a i k a i s i l l a + v i i m e a i k a i s i l l e + v i i m e a i k a i s i m m a t + v i i m e a i k a i s i m p i a + v i i m e a i k a i s i s s a + v i i m e a i k a i s i s t a + v i i m e a i k a i s t a + v i i m e a i k a i s t e n + v i i m e i n e n k i n + v i i m e i n k i n + v i i m e i s e e n + v i i m e i s e l l e + v i i m e i s e n + v i i m e i s e n ä + v i i m e i s e s s ä + v i i m e i s e s t ä + v i i m e i s e t + v i i m e i s e t k i n + v i i m e i s i i n + v i i m e i s i l l e + v i i m e i s i m m i s s ä + v i i m e i s i m m i s t ä + v i i m e i s i m m ä k s i + v i i m e i s i m m ä l l ä + v i i m e i s i m m ä n + v i i m e i s i m m ä s s ä + v i i m e i s i m m ä s t ä + v i i m e i s i m m ä t + v i i m e i s i m p i e n + v i i m e i s i m p i i n + v i i m e i s i m p i n ä + v i i m e i s i m p i ä + v i i m e i s i m p ä n ä + v i i m e i s i m p ä ä n + v i i m e i s i n + v i i m e i s i n k i n + v i i m e i s i n t ä + v i i m e i s i n ä + v i i m e i s i s s ä + v i i m e i s i s t ä + v i i m e i s i ä + v i i m e i s i ä ä n + v i i m e i s t e l e e + v i i m e i s t e l e m ä s s ä + v i i m e i s t e l e m ä ä n + v i i m e i s t e l i + v i i m e i s t e l l e s s ä ä n + v i i m e i s t e l l y m p i + v i i m e i s t e l l y m p ä ä + v i i m e i s t e l l y t k i n + v i i m e i s t e l l ä + v i i m e i s t e l l ä ä n + v i i m e i s t e l y a l a s t a + v i i m e i s t e l y n + v i i m e i s t e l y s s ä + v i i m e i s t e l y t e o l l i s u u s + v i i m e i s t e l y t o i m e n p i t e i t ä + v i i m e i s t e l y t y ö + v i i m e i s t e l y v a i h e e s s a + v i i m e i s t e l y ä + v i i m e i s t e n + v i i m e i s t e n k i n + v i i m e k e r t a i s e l l a + v i i m e k e r t a i s e s s a + v i i m e k e s ä i s e n + v i i m e k e s ä i s e s s ä + v i i m e k e s ä i s e t + v i i m e k e s ä i s t e n + v i i m e k s i k i n + v i i m e s y k s y i s e n + v i i m e v i i k k o i s e e n + v i i m e v i i k k o i s e l l a + v i i m e v i i k k o i s e n + v i i m e v i i k k o i s e s s a + v i i m e v i i k k o i s e s t a + v i i m e v i i k k o i s e t + v i i m e v i i k k o i s i a + v i i m e v i i k k o i s i i n + v i i m e v i i k k o i s i l l a + v i i m e v i i k k o i s i s s a + v i i m e v i i k k o i s i s t a + v i i m e v i i k k o i s t a + v i i m e v i i k k o i s t e n + v i i m e v u o t i s e e n + v i i m e v u o t i s e l l a + v i i m e v u o t i s e l l e + v i i m e v u o t i s e n + v i i m e v u o t i s e s s a + v i i m e v u o t i s e s t a + v i i m e v u o t i s e t + v i i m e v u o t i s e t k i n + v i i m e v u o t i s i a + v i i m e v u o t i s i i n + v i i m e v u o t i s i s s a + v i i m e v u o t i s t a + v i i m e v u o t i s t e n + v i i m e ö i s i s t ä + v i i n e i h i n + v i i n e i l l e + v i i n e i l l ä ä n + v i i n e i s t ä + v i i n e j ä + v i i n i a l a + v i i n i a l a a + v i i n i a l a a m m e + v i i n i a l a a n + v i i n i a l a a n s a + v i i n i a l a l l a + v i i n i a l a l l e + v i i n i a l a m m e + v i i n i a l a n + v i i n i a l a s t a + v i i n i a l u e + v i i n i a l u e e l t a + v i i n i a l u e e n + v i i n i a m a t s o n i + v i i n i a s e t u s + v i i n i a s i a a + v i i n i e n + v i i n i e t i k e t e i s s ä + v i i n i h a p o n + v i i n i h a p p o + v i i n i j ä r j e s t ö n + v i i n i j ä r j e s t ö s t ä + v i i n i j ä r v e t + v i i n i j ä r v i ä + v i i n i k a m p a n j o i s s a + v i i n i k a u p a s s a + v i i n i k a u p p a a + v i i n i k a u p p a a n + v i i n i k a u p p i a a t + v i i n i k e l l a r e i l l a + v i i n i k e l l a r i + v i i n i k i i n t i ö n + v i i n i k i v i + v i i n i k s i + v i i n i k u l t t u u r i s t a + v i i n i k u m i + v i i n i k y y h k y + v i i n i k ä r h ö + v i i n i k ö y n n ö s + v i i n i l a i n s ä ä d ä n t ö + v i i n i l a s i + v i i n i l i k ö ö r i l l e + v i i n i l i t r o i n e e n + v i i n i m a a + v i i n i m a r k k i n a m m e + v i i n i m a r k k i n a t + v i i n i m a r k k i n o i d e n + v i i n i m a r k k i n o i h i n + v i i n i m a r k k i n o i l l a + v i i n i m a r k k i n o i t a + v i i n i m e r k k e j ä + v i i n i m ä k i k o t i l o + v i i n i n + v i i n i n j a l o s t a j i l l e + v i i n i n j a l o s t u k s e n + v i i n i n k a s v a t u s a l u e + v i i n i n k u l u t t a j a m a a + v i i n i n k u l u t u k s e n + v i i n i n k u l u t u k s e s s a + v i i n i n k u l u t u s t a a n + v i i n i n k y s y m y s + v i i n i n k ä y t t ö ö n + v i i n i n k ä y t ö n + v i i n i n m a i s t e l u + v i i n i n m y y j i ä + v i i n i n t u o n n i n + v i i n i n t u o t a n n o l l a + v i i n i n t u o t a n n o l l e + v i i n i n t u o t a n n o n + v i i n i n t u o t a n n o s s a + v i i n i n t u o t a n n o s t a + v i i n i n t u o t a n t o + v i i n i n t u o t a n t o a + v i i n i n t u o t a n t o a l a + v i i n i n t u o t a n t o a l a l l a + v i i n i n t u o t a n t o a l a n + v i i n i n t u o t a n t o a l u e i d e n + v i i n i n t u o t a n t o a l u e i n a + v i i n i n t u o t a n t o k a p a s i t e e t t i a + v i i n i n t u o t a n t o k ä y t ä n t ö j ä + v i i n i n t u o t a n t o m e n e t e l m i ä + v i i n i n t u o t a n t o n s a + v i i n i n t u o t a n t o o n + v i i n i n t u o t a n t o t e k n i i k o i d e n + v i i n i n t u o t t a j a + v i i n i n t u o t t a j a a + v i i n i n t u o t t a j a m a a t + v i i n i n t u o t t a j a m a i d e n + v i i n i n t u o t t a j a m a i l l e + v i i n i n t u o t t a j a m a i s s a + v i i n i n t u o t t a j a m a i s t a + v i i n i n t u o t t a j a m a i t a + v i i n i n t u o t t a j a n + v i i n i n t u o t t a j a t + v i i n i n t u o t t a j a y r i t y s + v i i n i n t u o t t a j i a + v i i n i n t u o t t a j i e n + v i i n i n t u o t t a j i i n + v i i n i n t u o t t a j i l l a + v i i n i n t u o t t a j i l l e + v i i n i n t u o t t a j i l t a + v i i n i n t u o t t a j i n a + v i i n i n v a l m i s t a j i e m m e + v i i n i n v a l m i s t u k s e e n + v i i n i n v a l m i s t u s a l a a + v i i n i n v a l m i s t u s k u l t t u u r i + v i i n i n v a l m i s t u s k u l t t u u r i m m e + v i i n i n v a l m i s t u s k u l t t u u r i n + v i i n i n v a l m i s t u s k u l t t u u r i s s a m m e + v i i n i n v a l m i s t u s k u l t t u u r i s t a + v i i n i n v a l m i s t u s k ä y t ä n n ö t + v i i n i n v a l m i s t u s k ä y t ä n t ö j e n + v i i n i n v a l m i s t u s k ä y t ä n t ö j ä + v i i n i n v a l m i s t u s m e n e t e l m i e m m e + v i i n i n v a l m i s t u s m e n e t e l m i e n + v i i n i n v a l m i s t u s m e n e t e l m i i n + v i i n i n v a l m i s t u s m e n e t e l m i n + v i i n i n v a l m i s t u s m e n e t e l m i s t ä + v i i n i n v a l m i s t u s m e n e t e l m i ä + v i i n i n v a l m i s t u s m e n e t e l m i ä ä n + v i i n i n v a l m i s t u s m e n e t e l m ä + v i i n i n v a l m i s t u s m e n e t e l m ä m m e + v i i n i n v a l m i s t u s m e n e t e l m ä t + v i i n i n v a l m i s t u s p e r i n t e e t + v i i n i n v a l m i s t u s p e r i n t e i t ä + v i i n i n v a l m i s t u s p r o s e s s e j a m m e + v i i n i n v a l m i s t u s t a p a n s a + v i i n i n v a l m i s t u s t a v o i s t a + v i i n i n v a l m i s t u s y k s i k ö i s s ä + v i i n i n v i e j ä + v i i n i n v i e n n i l l e + v i i n i n v i e n n i n + v i i n i n v i l j e l i j ä + v i i n i n v i l j e l i j ä l l e + v i i n i n v i l j e l i j ä n + v i i n i n v i l j e l i j ä t + v i i n i n v i l j e l i j ö i d e m m e + v i i n i n v i l j e l i j ö i d e n + v i i n i n v i l j e l i j ö i l l e + v i i n i n v i l j e l i j ö i l l e m m e + v i i n i n v i l j e l i j ö i s t ä + v i i n i n v i l j e l i j ö i t ä + v i i n i n v i l j e l m i e n + v i i n i n v i l j e l y + v i i n i n v i l j e l y a l a + v i i n i n v i l j e l y a l a a n + v i i n i n v i l j e l y a l a l l a + v i i n i n v i l j e l y a l a n + v i i n i n v i l j e l y a l o i s t a + v i i n i n v i l j e l y a l u e e n + v i i n i n v i l j e l y a l u e e t + v i i n i n v i l j e l y a l u e i d e n + v i i n i n v i l j e l y a l u e i l l a + v i i n i n v i l j e l y a l u e i l l a m m e + v i i n i n v i l j e l y a l u e i l l e + v i i n i n v i l j e l y a l u e i t a + v i i n i n v i l j e l y k ä y t ä n n ö t + v i i n i n v i l j e l y k ä y t ä n t ö j e n + v i i n i n v i l j e l y l l e + v i i n i n v i l j e l y m a a t + v i i n i n v i l j e l y m e n e t e l m i i n + v i i n i n v i l j e l y n + v i i n i n v i l j e l y p e r i n t e i s t ä + v i i n i n v i l j e l y p e r i n t ö + v i i n i n v i l j e l y p e r i n t ö ä + v i i n i n v i l j e l y p o l i t i i k a n + v i i n i n v i l j e l y p o t e n t i a a l i + v i i n i n v i l j e l y p o t e n t i a a l i s t a + v i i n i n v i l j e l y s a l a + v i i n i n v i l j e l y s s ä + v i i n i n v i l j e l y s t u o t e + v i i n i n v i l j e l y s t ä + v i i n i n v i l j e l y s u v u i l l e + v i i n i n v i l j e l y v y ö h y k k e e s e e n + v i i n i n v i l j e l y v y ö h y k k e i t ä + v i i n i n v i l j e l y y n + v i i n i n v i l j e l y ä + v i i n i o s u u s k u n n a t + v i i n i p o h j a i s e t + v i i n i p o h j a i s i i n + v i i n i p o h j a i s t e n + v i i n i p o l i t i i k a s t a + v i i n i p o l i t i i k k a + v i i n i p u l l o + v i i n i p u l l o i h i n + v i i n i p u l l o j a + v i i n i p u l l o j e n + v i i n i p u l l o n + v i i n i p u l l o s t a + v i i n i p u l l o t + v i i n i r y p ä l e i d e n + v i i n i r y p ä l e l a j i k k e i d e n + v i i n i r y p ä l e v i l j e l m i ä + v i i n i r y p ä l e v o d k a t e o l l i s u u d e n + v i i n i s a t o + v i i n i s e k o i t u s + v i i n i s e k t o r i a + v i i n i s e k t o r i i n + v i i n i s e k t o r i l l e + v i i n i s e k t o r i s t a + v i i n i s k a n d a a l i n + v i i n i s o p i m u k s e s t a + v i i n i s o p i m u s + v i i n i s o p p a + v i i n i s t ä + v i i n i t + v i i n i t a r h a a + v i i n i t a r h a n + v i i n i t a r h a t + v i i n i t a r h o i l l e + v i i n i t a r h o j e n + v i i n i t e o l l i s u u d e l l a + v i i n i t e o l l i s u u d e l l e + v i i n i t e o l l i s u u d e n + v i i n i t e o l l i s u u d e s s a + v i i n i t e o l l i s u u s + v i i n i t e o l l i s u u t e e n + v i i n i t e o l l i s u u t t a + v i i n i t i e d o n + v i i n i t i e t o j a + v i i n i t i e t o k a n n a n + v i i n i t u o t t e e s t a + v i i n i t u o t t e e t + v i i n i t u o t t e i d e n + v i i n i t u o t t e i t a + v i i n i t y ö r y h m ä s s ä + v i i n i u u d i s t u k s e s t a + v i i n i u u d i s t u s + v i i n i v a a h t e r a + v i i n i v i l j e l m ä t + v i i n i v i l j e l y a l a + v i i n i v i l j e l y a l u e i l l e + v i i n i v u o d e l l e + v i i n i v u o t t a + v i i n i y r i t y k s e l l e + v i i n i ä + v i i p e e t t ä + v i i p y ä + v i i r i k a i j a t + v i i r i k a l a + v i i r i k e h r ä ä j ä + v i i r i k o r u a h v e n + v i i r i n u m e r o + v i i r i p y r s t ö k o l i b r i + v i i r i p y r s t ö l e s k i + v i i r i r a p u t o k k o + v i i r i ä i s k o i r a + v i i r i ä i s k y y h k y t + v i i r i ä i s p y y j u o k s i j a + v i i r i ä i s t i m a l i t + v i i r u b u l b u l i + v i i r u h e l m i k a n a + v i i r u h e m p p o + v i i r u h u p p u k i p u a j a + v i i r u k a l a p ö l l ö + v i i r u k a l j u m e s i k k o + v i i r u k a r d i n a a l i + v i i r u k e r t t u l i + v i i r u k i i t ä j ä + v i i r u k i p u a j a + v i i r u k o r v a b u l b u l i + v i i r u k u r k k u k o t i n g a + v i i r u k u r k k u t y r a n n i + v i i r u k u t o j a + v i i r u l a u l u m e s i k k o + v i i r u l e h t i m i t t a r i + v i i r u m a r j a s t a j a + v i i r u m e t s ä p ö l l ö + v i i r u n i s k a m e s i k k o + v i i r u p a l l o k a l a + v i i r u p o s k i k a r d i n a a l i a h v e n + v i i r u p y r s t ö k o l i b r i + v i i r u p y r s t ö t r o g o n i + v i i r u p y s t y n o k k a + v i i r u p ä ä k e r t t u l i + v i i r u p ä ä k i p u a j a + v i i r u p ä ä k o t t a r a i n e n + v i i r u p ä ä m e s i k k o + v i i r u p ä ä s i r k k u + v i i r u p ö l l ö + v i i r u r i n t a k e r t t u l i + v i i r u r i n t a m e s i k k o + v i i r u s i r k k a l i n t u + v i i r u t y r a n n i + v i i r u t ä p l ä t i k k a + v i i r u v a l m u s k a + v i i r u v a t s a k i p u a j a + v i i s a a k s i + v i i s a a l l a + v i i s a a m m a k s i + v i i s a a m m a n + v i i s a a m m i k s i + v i i s a a m m i n + v i i s a a m p a a + v i i s a a m p a n a + v i i s a a m p i a + v i i s a a n + v i i s a a t + v i i s a i d e n + v i i s a i l l e + v i i s a i m m a k s i + v i i s a i n t a + v i i s a i s i i n + v i i s a i s t a + v i i s a i t a + v i i s a s t e l u n + v i i s a s t e n + v i i s a s t u a + v i i s a s t u k a a m m e + v i i s a s t u n u t k a a n + v i i s a u d e n h a m m a s + v i i s a u d e s s a + v i i s a u d e s s a a n + v i i s a u d e s s a n n e + v i i s a u t e e n + v i i s a u t t a + v i i s i j ä s e n i n e n + v i i s i k a u t i s t a + v i i s i k o h t a i s e n + v i i s i k u l m i o l u k u + v i i s i k y m m e n t ä n e l j ä + v i i s i k y m m e n t ä s e i t s e m ä n + v i i s i k y m m e n t ä t u h a t t a + v i i s i k y m m e n t ä v u o t i s j u h l a k o k o u k s e n + v i i s i k y m m e n v u o t i n e n + v i i s i k y m m e n v u o t i s p ä i v ä ä + v i i s i m i n u u t t i s e n + v i i s i m i n u u t t i s e n i + v i i s i n k e r t a i s e k s i + v i i s i n k e r t a i s e n + v i i s i n k e r t a i s e n a k i n + v i i s i n k e r t a i s e s t i + v i i s i n k e r t a i s t a m a a n + v i i s i n k e r t a i s t u n e e t + v i i s i n k e r t a i s t u n u t + v i i s i p ä i v ä i s e e n + v i i s i p ä i v ä i s e k s i + v i i s i p ä i v ä i s e n + v i i s i p ä i v ä i s e s t ä + v i i s i p ä i v ä i s i ä + v i i s i p ä i v ä i s t ä + v i i s i s a t a a t u h a t t a + v i i s i s i v u i n e n + v i i s i t o i s t a k e r t a i n e n + v i i s i t o i s t a k e r t a i s e s t i + v i i s i t o i s t a t u h a t t a + v i i s i v a i h e i n e n + v i i s i v a i h e i s e n + v i i s i v u o t i a a n + v i i s i v u o t i a i n a + v i i s i v u o t i a i t a + v i i s i v u o t i a s t a + v i i s i v u o t i s e e n + v i i s i v u o t i s e k s i + v i i s i v u o t i s e l l a + v i i s i v u o t i s e l l e + v i i s i v u o t i s e n + v i i s i v u o t i s e s s a + v i i s i v u o t i s e s t a + v i i s i v u o t i s e t + v i i s i v u o t i s i a + v i i s i v u o t i s i i n + v i i s i v u o t i s i k s i + v i i s i v u o t i s j a k s o a + v i i s i v u o t i s j a k s o l l a + v i i s i v u o t i s j a k s o l l e + v i i s i v u o t i s j a k s o n + v i i s i v u o t i s j u h l a a + v i i s i v u o t i s k a u d e k s i + v i i s i v u o t i s k a u d e l l a + v i i s i v u o t i s k a u d e l l e + v i i s i v u o t i s k a u d e l t a + v i i s i v u o t i s k a u d e n + v i i s i v u o t i s k a u d e s t a + v i i s i v u o t i s k a u s i + v i i s i v u o t i s k a u s i k s i + v i i s i v u o t i s k a u t e n a + v i i s i v u o t i s k a u t e n s a + v i i s i v u o t i s k a u t t a + v i i s i v u o t i s k i e r r o k s i i n + v i i s i v u o t i s o h j e l m a a + v i i s i v u o t i s o h j e l m a a n + v i i s i v u o t i s o h j e l m a l l a + v i i s i v u o t i s o h j e l m a n + v i i s i v u o t i s o h j e l m a s s a + v i i s i v u o t i s s t r a t e g i a a + v i i s i v u o t i s s u u n n i t e l m a + v i i s i v u o t i s s u u n n i t e l m a a + v i i s i v u o t i s s u u n n i t e l m a a n + v i i s i v u o t i s s u u n n i t e l m a l l a + v i i s i v u o t i s s u u n n i t e l m a n + v i i s i v u o t i s s u u n n i t e l m a s s a + v i i s i v u o t i s s u u n n i t e l m a s t a + v i i s i v u o t i s s u u n n i t e l m a t + v i i s i v u o t i s s u u n n i t e l m i a + v i i s i v u o t i s s u u n n i t e l m i e n + v i i s i v u o t i s s u u n n i t e l m i i n + v i i s i v u o t i s s u u n n i t e l m i n + v i i s i v u o t i s s u u n n i t e l m i s s a + v i i s i v u o t i s s u u n n i t e l m i s t a + v i i s i v u o t i s s ä ä n t ö + v i i s i v u o t i s t a + v i i s i v u o t i s t a r k i s t u k s e n + v i i s u m e i d e n + v i i s u m e i h i n + v i i s u m e i l l e + v i i s u m e i l l e k a a n + v i i s u m e i s t a + v i i s u m e i t a + v i i s u m e j a + v i i s u m i a + v i i s u m i a l a l l a + v i i s u m i a n o m u k s e n + v i i s u m i a n o m u s t e n + v i i s u m i a n s a a n + v i i s u m i a s e t u k s e n + v i i s u m i a s e t u s + v i i s u m i a s e t u s t a + v i i s u m i a s e t u s t e n + v i i s u m i a s i a + v i i s u m i a s i a a + v i i s u m i a s i a s s a + v i i s u m i a s i a s t a + v i i s u m i a s i o i s s a + v i i s u m i a s i o i t a + v i i s u m i d i r e k t i i v i ä + v i i s u m i e d e l l y t y k s i s s ä + v i i s u m i e h d o t u k s e n + v i i s u m i e n + v i i s u m i e s t e i n + v i i s u m i h a k e m u k s e n + v i i s u m i h a k e m u k s e n s a + v i i s u m i h a k e m u k s e t + v i i s u m i h a k e m u k s i a + v i i s u m i h a k e m u k s i s t a + v i i s u m i h a k e m u s k e s k u k s i a + v i i s u m i h a k e m u s m e n e t t e l y ä + v i i s u m i h a k e m u s p r o s e s s i n + v i i s u m i h a k e m u s t a + v i i s u m i h a k e m u s t e n + v i i s u m i h e l p o t u k s e s s a + v i i s u m i h e l p o t u k s e t + v i i s u m i h e l p o t u k s i a + v i i s u m i h e l p o t u k s i e n + v i i s u m i h e l p o t u k s i s t a + v i i s u m i h e l p o t u s t e n + v i i s u m i j o n o i n e e n + v i i s u m i j o u s t o + v i i s u m i j o u s t o i h i n + v i i s u m i j o u s t o j e n + v i i s u m i j o u s t o j ä r j e s t e l m ä s t ä + v i i s u m i j o u s t o n e u v o t t e l u t + v i i s u m i j o u s t o s o p i m u k s e n + v i i s u m i j o u s t o s o p i m u k s e t + v i i s u m i j o u s t o s o p i m u k s i s t a + v i i s u m i j o u s t o s o p i m u s t e n + v i i s u m i j ä r j e s t e l m ä + v i i s u m i j ä r j e s t e l m ä l l ä + v i i s u m i j ä r j e s t e l m ä n + v i i s u m i j ä r j e s t e l m ä s s ä + v i i s u m i j ä r j e s t e l m ä s t ä + v i i s u m i j ä r j e s t e l m ä ä + v i i s u m i j ä r j e s t e l m ä ä n + v i i s u m i j ä r j e s t e l y + v i i s u m i j ä r j e s t e l y i h i n + v i i s u m i j ä r j e s t e l y j e n + v i i s u m i j ä r j e s t e l y j ä + v i i s u m i j ä r j e s t e l y s t ä + v i i s u m i j ä r j e s t e l y t + v i i s u m i j ä r j e s t e l y ä + v i i s u m i k a a v a a + v i i s u m i k a u p a n + v i i s u m i k e s k u k s e n + v i i s u m i k e s k u s t e l u t + v i i s u m i k e s k u s t e l u u n + v i i s u m i k i e l l o n + v i i s u m i k i e l l o s t a + v i i s u m i k i e l l o t + v i i s u m i k i e l t o + v i i s u m i k i e l t o a + v i i s u m i k i e l t o j a + v i i s u m i k i e l t o j e n + v i i s u m i k i e l t o l u e t t e l o a + v i i s u m i k i e l t o l u e t t e l o o n + v i i s u m i k i e l t o l u e t t e l o s s a + v i i s u m i k i e l t o o n + v i i s u m i k o h t e l u n + v i i s u m i k u l u t + v i i s u m i k u s t a n n u k s e t + v i i s u m i k y s y m y k s e e n + v i i s u m i k y s y m y k s e n + v i i s u m i k y s y m y k s e s s ä + v i i s u m i k y s y m y k s e t + v i i s u m i k y s y m y k s i s t ä + v i i s u m i k y s y m y s + v i i s u m i k y s y m y s t e n + v i i s u m i k y s y m y s t ä + v i i s u m i k ä y t ä n n ö s t ä + v i i s u m i k ä y t ä n t ö j ä + v i i s u m i l a i n s ä ä d ä n t ö ä + v i i s u m i l a i n s ä ä d ä n t ö ö n + v i i s u m i l i s t a a + v i i s u m i l o m a k e t t a + v i i s u m i l o m a k k e e n + v i i s u m i l u e t t e l o + v i i s u m i l u e t t e l o a + v i i s u m i l u e t t e l o e h d o t u k s e n + v i i s u m i l u e t t e l o n + v i i s u m i l u e t t e l o s t a + v i i s u m i l u o k i s t a + v i i s u m i m a k s u + v i i s u m i m a k s u a + v i i s u m i m a k s u i n a + v i i s u m i m a k s u i s t a + v i i s u m i m a k s u j a + v i i s u m i m a k s u j e n + v i i s u m i m a k s u n + v i i s u m i m a k s u s t a + v i i s u m i m a k s u t + v i i s u m i m e n e t t e l y + v i i s u m i m e n e t t e l y i h i n + v i i s u m i m e n e t t e l y i t ä + v i i s u m i m e n e t t e l y j e n + v i i s u m i m e n e t t e l y j ä + v i i s u m i m e n e t t e l y n + v i i s u m i m e n e t t e l y s t ä + v i i s u m i m e n e t t e l y t + v i i s u m i m e n e t t e l y y n + v i i s u m i m e n e t t e l y ä + v i i s u m i m u u r i + v i i s u m i m u u r i a + v i i s u m i m u u r i n + v i i s u m i m ä ä r ä y k s i ä + v i i s u m i n + v i i s u m i n e u v o t t e l u j a + v i i s u m i n e u v o t t e l u t + v i i s u m i n h a k i j a n + v i i s u m i n h a k i j a t + v i i s u m i n h a k i j o i d e n + v i i s u m i n h a k i j o i h i n + v i i s u m i n h a k u k e s k u k s e n + v i i s u m i n h a l t i j a n + v i i s u m i n h a l t i j o i d e n + v i i s u m i n h a n k i n t a a + v i i s u m i n s a a n n i n + v i i s u m i n s a a n t i a + v i i s u m i n t u n n i s t u s j ä r j e s t e l m ä n + v i i s u m i o i k e u d e n + v i i s u m i o i k e u k s i e n + v i i s u m i o n g e l m a n + v i i s u m i o n g e l m a t + v i i s u m i o s a s t o a + v i i s u m i p a k k o + v i i s u m i p a k k o a + v i i s u m i p a k k o l u e t t e l o s t a + v i i s u m i p a k k o o n + v i i s u m i p a k o l l e + v i i s u m i p a k o n + v i i s u m i p a k o s t a + v i i s u m i p a k o t + v i i s u m i p a k o t t e e t + v i i s u m i p a k o t t e i d e n + v i i s u m i p e r u s t e i n e n + v i i s u m i p e t o k s i a + v i i s u m i p o l i t i i k a l l a + v i i s u m i p o l i t i i k a n + v i i s u m i p o l i t i i k a s s a + v i i s u m i p o l i t i i k a s t a + v i i s u m i p o l i t i i k a s t a m m e + v i i s u m i p o l i t i i k k a + v i i s u m i p o l i t i i k k a a + v i i s u m i p o l i t i i k k a a n + v i i s u m i p o l i t i i k k a a n s a + v i i s u m i p o l i t i i k k a m m e + v i i s u m i p o l i t i i k k a n s a + v i i s u m i p o l i t i i k k o i h i n + v i i s u m i p o l i t i i k k o j a + v i i s u m i p o l i t i i k k o j e n + v i i s u m i p r o s e s s i n + v i i s u m i p y y n n ö i s t ä + v i i s u m i p ö y t ä k i r j o j a + v i i s u m i r a j a n + v i i s u m i r a j o i t t e i d e n + v i i s u m i r a j o i t u k s e t + v i i s u m i r a j o i t u k s i a + v i i s u m i r a j o i t u s + v i i s u m i r a j o i t u s t e n + v i i s u m i s a n k t i o t + v i i s u m i s k a n d a a l e i l l e + v i i s u m i s k a n d a a l e i s t a + v i i s u m i s o p i m u k s e n + v i i s u m i s o p i m u k s e s t a + v i i s u m i s o p i m u k s e t + v i i s u m i s o p i m u k s i a + v i i s u m i s o p i m u k s i s t a + v i i s u m i s o p i m u s + v i i s u m i s o p i m u s t a + v i i s u m i s o p i m u s t e n + v i i s u m i s t a + v i i s u m i s u h t e i d e n + v i i s u m i s u h t e i s t a + v i i s u m i s u u n n i t e l m a a n + v i i s u m i s ä ä n n ö i s t ä + v i i s u m i s ä ä n n ö k s e t + v i i s u m i s ä ä n n ö k s i ä + v i i s u m i s ä ä n n ö s t e n + v i i s u m i s ä ä n n ö s t ö + v i i s u m i s ä ä n n ö s t ö l l ä + v i i s u m i s ä ä n n ö s t ö n + v i i s u m i s ä ä n n ö s t ö s t ä + v i i s u m i s ä ä n n ö s t ö ä + v i i s u m i s ä ä n n ö s t ö ö n + v i i s u m i s ä ä n n ö t + v i i s u m i s ä ä n t ö i h i n + v i i s u m i s ä ä n t ö j e n + v i i s u m i s ä ä n t ö j ä + v i i s u m i t + v i i s u m i t a p a u s + v i i s u m i t a r r a + v i i s u m i t a r r a a n + v i i s u m i t a r r a n + v i i s u m i t a r r a n u m e r o a + v i i s u m i t a r r o j a + v i i s u m i t a r r o j e n + v i i s u m i t i e t o j e n + v i i s u m i t i e t o j ä r j e s t e l m ä + v i i s u m i t i e t o j ä r j e s t e l m ä n + v i i s u m i t i e t o j ä r j e s t e l m ä s s ä + v i i s u m i t i e t o j ä r j e s t e l m ä s t ä + v i i s u m i t i e t o j ä r j e s t e l m ä ä + v i i s u m i t i e t o j ä r j e s t e l m ä ä n + v i i s u m i t i e t o k a n n a n + v i i s u m i t o i m i s t o + v i i s u m i t o i m i s t o s s a + v i i s u m i t t a + v i i s u m i t u r i s t e j a + v i i s u m i t y ö r y h m ä + v i i s u m i u u d i s t u k s e n + v i i s u m i v a a t i m u k s e n + v i i s u m i v a a t i m u k s e s t a + v i i s u m i v a a t i m u k s e t + v i i s u m i v a a t i m u k s i a + v i i s u m i v a a t i m u k s i e n + v i i s u m i v a a t i m u k s i i n + v i i s u m i v a a t i m u k s i l l a + v i i s u m i v a a t i m u k s i n + v i i s u m i v a a t i m u k s i s s a + v i i s u m i v a a t i m u k s i s t a + v i i s u m i v a a t i m u s + v i i s u m i v a a t i m u s t a + v i i s u m i v a a t i m u s t e n + v i i s u m i v a a t i m u s t e n s a + v i i s u m i v a l v o n t a + v i i s u m i v a l v o n t a a + v i i s u m i v a p a a + v i i s u m i v a p a a l l e + v i i s u m i v a p a a n + v i i s u m i v a p a a s e e n + v i i s u m i v a p a a s t a + v i i s u m i v a p a a t + v i i s u m i v a p a a t a + v i i s u m i v a p a i d e n + v i i s u m i v a p a i s i i n + v i i s u m i v a p a u d e l l a + v i i s u m i v a p a u d e l l e + v i i s u m i v a p a u d e n + v i i s u m i v a p a u d e s s a + v i i s u m i v a p a u d e s t a + v i i s u m i v a p a u d e t + v i i s u m i v a p a u k s i a + v i i s u m i v a p a u k s i i n + v i i s u m i v a p a u k s i s t a + v i i s u m i v a p a u s + v i i s u m i v a p a u s a l o i t e t t a + v i i s u m i v a p a u s a s i a a n + v i i s u m i v a p a u s j ä r j e s t e l m ä + v i i s u m i v a p a u s j ä r j e s t e l m ä l l ä + v i i s u m i v a p a u s j ä r j e s t e l m ä n + v i i s u m i v a p a u s j ä r j e s t e l m ä ä + v i i s u m i v a p a u s j ä r j e s t e l m ä ä n + v i i s u m i v a p a u s k i n + v i i s u m i v a p a u s k r i t e e r i t + v i i s u m i v a p a u s l a i n s ä ä d ä n n ö n + v i i s u m i v a p a u s l u e t t e l o o n + v i i s u m i v a p a u s m a i s t a + v i i s u m i v a p a u s m e n e t t e l y n + v i i s u m i v a p a u s n e u v o t t e l u j e n + v i i s u m i v a p a u s o h j e l m a + v i i s u m i v a p a u s o h j e l m a a + v i i s u m i v a p a u s o h j e l m a a n + v i i s u m i v a p a u s o h j e l m a a n s a + v i i s u m i v a p a u s o h j e l m a n + v i i s u m i v a p a u s o h j e l m a n s a + v i i s u m i v a p a u s o h j e l m a s s a + v i i s u m i v a p a u s o h j e l m a s t a + v i i s u m i v a p a u s p e r i a a t t e e n + v i i s u m i v a p a u s p o l i t i i k a n + v i i s u m i v a p a u s p r o s e s s i + v i i s u m i v a p a u s p r o s e s s i a + v i i s u m i v a p a u s p r o s e s s i i n + v i i s u m i v a p a u s p r o s e s s i n + v i i s u m i v a p a u s p r o s e s s i s s a + v i i s u m i v a p a u s s o p i m u k s e e n + v i i s u m i v a p a u s s o p i m u k s e n + v i i s u m i v a p a u s s o p i m u k s e s s a + v i i s u m i v a p a u s s o p i m u k s i a + v i i s u m i v a p a u s s o p i m u s + v i i s u m i v a p a u s s o p i m u s t a + v i i s u m i v a p a u s s o p i m u s t e n + v i i s u m i v a p a u s v a a t i m u k s e t + v i i s u m i v a p a u s v u o r o p u h e l u + v i i s u m i v a p a u t e e n + v i i s u m i v a p a u t e n n e + v i i s u m i v a p a u t t a + v i i s u m i v a p a u t t a a n + v i i s u m i v a p a u t u k s e n + v i i s u m i v a p a u t u k s e s t a + v i i s u m i v a p a u t u k s i s t a + v i i s u m i v a p a u t u s + v i i s u m i v a p a u t u s j ä r j e s t e l m ä n + v i i s u m i v a p a u t u s j ä r j e s t e l y y n + v i i s u m i v a p a u t u s o h j e l m a s s a + v i i s u m i v a p a u t u s o h j e l m i a + v i i s u m i v a p a u t u s p r o s e s s i a + v i i s u m i v a p a u t u s t a + v i i s u m i v a p a u t u s t e n + v i i s u m i v e l v o i t e + v i i s u m i v e l v o i t t e i d e n + v i i s u m i v e l v o i t t e i t a + v i i s u m i v e l v o l l i s u u d e n + v i i s u m i v e l v o l l i s u u d e s t a + v i i s u m i v e l v o l l i s u u k s i s t a + v i i s u m i v e l v o l l i s u u s + v i i s u m i v i r a n o m a i s i l l e + v i i s u m i v i r h e + v i i s u m i v u o r o p u h e l u + v i i s u m i v u o r o p u h e l u n + v i i s u m i y h t e i s t y ö n + v i i t a h a p e r o + v i i t a k a s t i k k a + v i i t a k e r t t u n e n + v i i t a k u t o j a + v i i t a n n e e t + v i i t a n n u t + v i i t a p a l s a m i r o u s k u + v i i t a p ö l l ö + v i i t a p ö l l ö t + v i i t a s a m m a k k o + v i i t a s a m m a k o n p u t k i + v i i t a s i e p o t + v i i t a s i e p p o + v i i t a s i r k k a l i n t u + v i i t a t a + v i i t a t a a n + v i i t a t a a n k o + v i i t a t e n + v i i t a t e s s a a n + v i i t a t e s s a n i + v i i t a t e s s a n n e + v i i t a t i a i n e n + v i i t a t k a a m m e + v i i t a t t a e s s a + v i i t a t t a i s i i n + v i i t a t t a v a + v i i t a t t i i n + v i i t a t t u + v i i t a t u i l l e + v i i t a t y m p ö n e n + v i i t a y ö k k ö n e n + v i i t e a j a n j a k s o + v i i t e a j a n j a k s o k s i + v i i t e a j a n j a k s o l l a + v i i t e a j a n j a k s o n + v i i t e a j a n j a k s o o n + v i i t e a j a n j a k s o t + v i i t e a j a n k o h t a n a + v i i t e a l o i s t a + v i i t e a l u e e n a + v i i t e a l u e i d e n + v i i t e a r v o + v i i t e a r v o a + v i i t e a r v o i h i n + v i i t e a r v o i l l e + v i i t e a r v o i s t a + v i i t e a r v o j a + v i i t e a r v o j e n + v i i t e a r v o k s i + v i i t e a r v o l l a + v i i t e a r v o m e n e t e l m ä ä + v i i t e a r v o n + v i i t e a r v o n a + v i i t e a r v o s t a + v i i t e a r v o t + v i i t e a s i a k i r j a + v i i t e a s i a k i r j a n + v i i t e a s i a k i r j a n a + v i i t e a s i a k i r j a s s a + v i i t e a s i a k i r j a t + v i i t e e n + v i i t e h i n n a l l a + v i i t e h i n n a n + v i i t e h i n n a s t a + v i i t e h i n n a t + v i i t e h i n t a + v i i t e h i n t a a + v i i t e h i n t a a n + v i i t e h i n t a j ä r j e s t e l m ä + v i i t e h i n t a j ä r j e s t e l m ä n + v i i t e h i n t o i n a + v i i t e h i n t o j a + v i i t e i n d e k s i e n + v i i t e i n d i k a a t t o r e i d e n + v i i t e i n d i k a a t t o r i n + v i i t e i n d i k a a t t o r i n a + v i i t e i n d i k a a t t o r i t + v i i t e j a k s o + v i i t e j a k s o a + v i i t e j a k s o j a + v i i t e j a k s o l l a + v i i t e j a k s o n + v i i t e j a k s o o n + v i i t e j ä r j e s t e l m ä ä + v i i t e k a u d e l l a + v i i t e k a u d e n + v i i t e k a u s i + v i i t e k a u s i a + v i i t e k a u s i e n + v i i t e k a u t e e n + v i i t e k a u t e n a + v i i t e k a u t t a + v i i t e k e h y k s e e n + v i i t e k e h y k s e k s e e n + v i i t e k e h y k s e k s i + v i i t e k e h y k s e l l ä + v i i t e k e h y k s e n + v i i t e k e h y k s e n ä + v i i t e k e h y k s e s s ä + v i i t e k e h y k s e s t ä + v i i t e k e h y k s e t + v i i t e k e h y k s i i n + v i i t e k e h y k s i s s ä + v i i t e k e h y k s i s s ä ä n + v i i t e k e h y k s i s t ä + v i i t e k e h y k s i ä + v i i t e k e h y k s i ä ä n + v i i t e k e h y s + v i i t e k e h y s d i r e k t i i v i n + v i i t e k e h y s j ä r j e s t e l m ä n s ä + v i i t e k e h y s t e n + v i i t e k e h y s t ä + v i i t e k e s k u s t e n + v i i t e k o h d a n + v i i t e k o h d i s t a + v i i t e k o h t a + v i i t e k o h t a m m e + v i i t e k o h t a n a + v i i t e k o h t i a + v i i t e k o r k o + v i i t e k o r k o a + v i i t e k o r k o j e n + v i i t e k o r k o o n + v i i t e k o r k o p r o s e n t t e j a + v i i t e k r i t e e r e i h i n + v i i t e k r i t e e r i n ä + v i i t e k u r s s e j a + v i i t e k u r s s i e n + v i i t e l a i n o j e n + v i i t e l a i n s ä ä d ä n t ö + v i i t e l u k u a + v i i t e m a l l i + v i i t e m a r k k i n a t + v i i t e m a t e r i a a l i a + v i i t e m a t e r i a a l i n + v i i t e m ä ä r i l l e + v i i t e m ä ä r i s t ä + v i i t e m ä ä r i ä + v i i t e m ä ä r ä + v i i t e m ä ä r ä n + v i i t e m ä ä r ä r a h a s s a + v i i t e m ä ä r ä t + v i i t e m ä ä r ä y k s i ä + v i i t e m ä ä r ä y s t e n + v i i t e m ä ä r ä ä + v i i t e m ä ä r ä ä n + v i i t e n u m e r o a + v i i t e n u m e r o t + v i i t e n ä + v i i t e o h j e l m a s t a + v i i t e o h j e l m i s t a + v i i t e p e r u s t a n a + v i i t e p i s t e e n + v i i t e p o h j a + v i i t e r a h a y k s i k k ö + v i i t e r y h m ä n ä + v i i t e s a a l i s m ä ä r ä t + v i i t e s a d o n + v i i t e s a d o t + v i i t e s a t o + v i i t e s u m m a l l a + v i i t e s u m m a n + v i i t e t a l o u s a r v i o n + v i i t e t a s o l l e + v i i t e t a s o s t a + v i i t e t a s o t + v i i t e t e k s t i + v i i t e t i e d o t + v i i t e t o n n i m ä ä r ä ä + v i i t e t o n n i s t o a + v i i t e t u l o + v i i t e t u l o a + v i i t e t u l o o n + v i i t e v a l t i o + v i i t e v a l u u t t a + v i i t e v a l u u t t a n a + v i i t e v i l j e l y a l o j a + v i i t e v u o d e n + v i i t e v u o d e s t a + v i i t e v u o n n a + v i i t e v u o s i + v i i t e v u o s i a + v i i t e v u o t e e n + v i i t e v ä l i n e + v i i t o i t e t t a v a + v i i t o i t e t t u a + v i i t o i t t a a + v i i t o i t t a m a a + v i i t o i t t a m a l l a + v i i t o i t t a v a t + v i i t t a a m a a n + v i i t t a a m a l l a + v i i t t a a m a t t a + v i i t t a a m m e + v i i t t a a n + v i i t t a a t t e + v i i t t a a v a t + v i i t t a a v i s t a + v i i t t a i s i n + v i i t t a s i + v i i t t a s i k i n + v i i t t a s i n + v i i t t a s i n k o + v i i t t a s i t t e + v i i t t a s i t t e k i n + v i i t t a s i v a t + v i i t t a u k s e e n + v i i t t a u k s e n + v i i t t a u k s e s t a + v i i t t a u k s e t + v i i t t a u k s i a + v i i t t a u k s i l l a + v i i t t a u k s i s t a + v i i t t a u s i n d e k s i + v i i t t a u s t a + v i i t t a u s t e n + v i i t t e i s i i n + v i i t t e i t ä + v i i t t i l ö i n t i ä + v i i t t o m a k i e l e l l e + v i i t t o m a k i e l e l l ä + v i i t t o m a k i e l e n + v i i t t o m a k i e l e s t ä + v i i t t o m a k i e l e t + v i i t t o m a k i e l i + v i i t t o m a k i e l i n e n + v i i t t o m a k i e l i s i ä + v i i t t o m a k i e l i s t ä + v i i t t o m a k i e l t e n + v i i t t o m a k i e l t ä + v i i t t o m a n i m i + v i i t t ä + v i i v a e l e m e n t t i + v i i v a i n t e g r a a l i + v i i v a k a a v a + v i i v a k a a v i o + v i i v a k o o d e j a + v i i v a k o o d i + v i i v a k o o d i e n + v i i v a k o o d i i n + v i i v a k o o d i l l a + v i i v a k o o d i n + v i i v a k o o d i n l u k i j a + v i i v a l l e + v i i v a t + v i i v e e l l ä + v i i v e e t + v i i v e e t t ä + v i i v e i d e n + v i i v e i n + v i i v e i s t ä + v i i v o j a + v i i v y t e l t y + v i i v y t e t ä ä n + v i i v y t t e l e e + v i i v y t t e l e m ä t t ä + v i i v y t t e l e m ä t t ö m ä n + v i i v y t t e l y k a m p a n j o i h i n + v i i v y t t e l y p r o s e s s i + v i i v y t t e l y s t r a t e g i a a n + v i i v y t t e l y s t r a t e g i a s t a + v i i v y t t e l y s t ä + v i i v y t t e l y t a k t i i k k a a + v i i v y t t e l y t a k t i i k k a a n + v i i v y t t e l y t a k t i i k k a n n e + v i i v y t t e l y t a k t i i k k a n s a + v i i v y t t e l y t a k t i i k o i s t a + v i i v y t t e l y t u u l e l l a + v i i v y t t e l y ä + v i i v y t t ä i s i v ä t + v i i v y t t ä m ä t t ä + v i i v y t t ä ä + v i i v y t y k s e n + v i i v y t y k s e s t ä + v i i v y t y k s e t + v i i v y t y k s e t t ä + v i i v y t y k s i i n + v i i v y t y k s i s t ä + v i i v y t y k s i t t ä + v i i v y t y k s i ä + v i i v y t y s m e n e t e l m i ä + v i i v y t y s o n g e l m i e n + v i i v y t y s p o l i t i i k k a + v i i v y t y s t a k t i i k a n + v i i v y t y s t a k t i i k a s s a + v i i v y t y s t a k t i i k a s t a + v i i v y t y s t a k t i i k k a + v i i v y t y s t a k t i i k k a a + v i i v y t y s t a k t i i k k a a n + v i i v y t y s t a k t i i k o i d e n + v i i v y t y s t a k t i i k o i l l a + v i i v y t y s t a k t i i k o i t a + v i i v ä s t e l y y n + v i i v ä s t y i + v i i v ä s t y i m m e + v i i v ä s t y k s e s t ä + v i i v ä s t y k s e t + v i i v ä s t y k s e t t ä + v i i v ä s t y k s i i n + v i i v ä s t y k s i l l e + v i i v ä s t y k s i l l ä + v i i v ä s t y k s i l t ä + v i i v ä s t y k s i s t ä + v i i v ä s t y k s i ä + v i i v ä s t y m i s e l l ä + v i i v ä s t y m i s e n + v i i v ä s t y m i s e s t ä + v i i v ä s t y m i s i i n + v i i v ä s t y m i s i s t ä + v i i v ä s t y m i s t a p a u k s i e n + v i i v ä s t y m i s t ä + v i i v ä s t y n e e t + v i i v ä s t y n e i s t ä + v i i v ä s t y s k o r k o + v i i v ä s t y s k o r k o a + v i i v ä s t y s k o r k o i h i n + v i i v ä s t y s k o r k o j a + v i i v ä s t y s k o r o n + v i i v ä s t y s k o r o t + v i i v ä s t y s k u l t t u u r i a + v i i v ä s t y s k u l u n + v i i v ä s t y s k u u k a u d e n + v i i v ä s t y s r e k i s t e r i n + v i i v ä s t y s t a k t i i k o i t a + v i i v ä s t y s t a p a u k s i s s a + v i i v ä s t y s t e n + v i i v ä s t y s t ä + v i i v ä s t y t t i + v i i v ä s t y t t ä i s i + v i i v ä s t y t t ä i s i v ä t + v i i v ä s t y t t ä m i n e n + v i i v ä s t y t t ä m i s t ä + v i i v ä s t y t t ä m ä t t ä + v i i v ä s t y t t ä m ä ä n + v i i v ä s t y t t ä ä + v i i v ä s t y t t ä ä k s e e n + v i i v ä s t y v ä t + v i i v ä s t y y + v i k a a + v i k a m m e + v i k a s i j o i t u s + v i k a t i k k i + v i k a t u r v a l l i n e n + v i k a v i r t a s u o j a k y t k i n + v i k o j a + v i l a u s t a k a a n + v i l i s t ä j ä t + v i l j a a + v i l j a h i r s s i + v i l j a h y v i t y k s e t + v i l j a j o h d a n n a i s t e n + v i l j a k a s v i + v i l j a k a s v i e n + v i l j a k a u p a s s a + v i l j a k a u p a s t a + v i l j a k a u p p a + v i l j a k a u p p a a + v i l j a k a u p p a a n + v i l j a k a u p p a s e k t o r i m m e + v i l j a k i n + v i l j a k u k k o + v i l j a k ä ä r m e + v i l j a l a i t + v i l j a l a j i k k e i d e n + v i l j a l a j i k k e i t a + v i l j a l l a + v i l j a m a r k k i n a t + v i l j a m a r k k i n o i d e m m e + v i l j a m a r k k i n o i d e n + v i l j a m a r k k i n o i l l a + v i l j a n + v i l j a n d i m a a + v i l j a n e u v o s t o + v i l j a n h i n t o j e n + v i l j a n k a s v a t u k s e e n + v i l j a n k u i v a u s p a l k k i o + v i l j a n k u l u t u s + v i l j a n m y y n t i + v i l j a n t o i m i t u k s e t + v i l j a n t u o n n i s t a + v i l j a n t u o t a n n o l l a + v i l j a n t u o t a n n o l l e + v i l j a n t u o t a n n o n + v i l j a n t u o t a n n o s s a + v i l j a n t u o t a n t o + v i l j a n t u o t a n t o a l u e + v i l j a n t u o t a n t o a l u e i l l e + v i l j a n t u o t a n t o p o t e n t i a a l i a a n + v i l j a n t u o t t a j i e n + v i l j a n t u o t t a j i i n + v i l j a n t u o t t a j i l l e + v i l j a n v i e n t i i n + v i l j a n v i e n t i v a l t i o i s s a + v i l j a n v i l j e l i j ä + v i l j a n v i l j e l i j ä t + v i l j a n v i l j e l i j ö i d e n + v i l j a n v i l j e l i j ö i l l e + v i l j a n v i l j e l y s t ä + v i l j a n v i l j e l y ä + v i l j a p e l l o i l l e + v i l j a p e l l o t + v i l j a p e l t o j a + v i l j a p e t o s t e n + v i l j a p o h j a i s e l l a + v i l j a p o h j a i s e t + v i l j a p u l a a n + v i l j a p u l a s t a + v i l j a p ö r s s i s t ä + v i l j a r e h u n + v i l j a s a d o n + v i l j a s a t o + v i l j a s a t o i h i n + v i l j a s a t o j a + v i l j a s a t o j e n + v i l j a s a t o o n + v i l j a s e k t o r i l l e + v i l j a s e k t o r i l t a + v i l j a s e k t o r i n + v i l j a t + v i l j a t o i m i t u k s i a + v i l j a t o i m i t u k s i i n + v i l j a t o n n i a + v i l j a t u k e e n + v i l j a t u o t a n t o + v i l j a t u o t a n t o a a n + v i l j a t u o t a n t o m m e + v i l j a t u o t a n t o o m m e + v i l j a t u o t t e i d e n + v i l j a t u o t t e i l l e + v i l j a t u o t t e i t a + v i l j a t ä r k k e l y k s e e n + v i l j a t ä r k k e l y k s e l l ä + v i l j a u u d i s t u s + v i l j a v a l m i s t e i t a + v i l j a v a r a n t o + v i l j a v a r a s t o + v i l j a v a r a s t o a + v i l j a v a r a s t o i s s a + v i l j a v a r a s t o j a + v i l j a v a r a s t o j e n + v i l j a v a r a s t o m m e + v i l j a v a r a s t o t + v i l j a v u o r i a + v i l j a v u o r i s t a + v i l j a y m p y r ä + v i l j e l e m i n e n + v i l j e l e m i s e n + v i l j e l e m ä t t ä + v i l j e l e m ä t t ö m ä n + v i l j e l e m ä t ö n t ä + v i l j e l e v ä t + v i l j e l i j ä j ä r j e s t ö i h i n + v i l j e l i j ä j ä r j e s t ö i l l e + v i l j e l i j ä j ä r j e s t ö j e n + v i l j e l i j ä j ä r j e s t ö j ä + v i l j e l i j ä j ä r j e s t ö t + v i l j e l i j ä k a n s o j e n + v i l j e l i j ä l l ä + v i l j e l i j ä m a a + v i l j e l i j ä m i l j o n ä ä r i + v i l j e l i j ä m m e + v i l j e l i j ä p e r h e e s e e n + v i l j e l i j ä p e r h e i d e n + v i l j e l i j ä p e r h e i l l e + v i l j e l i j ä p e r h e i t ä + v i l j e l i j ä p o l i t i i k k a + v i l j e l i j ä r y h m i e n + v i l j e l i j ä r y h m i t t y m ä t + v i l j e l i j ä r y h m ä l l e + v i l j e l i j ä s u k u p o l v i + v i l j e l i j ä s u k u p o l v i e n + v i l j e l i j ä t + v i l j e l i j ä t a u s t a l l a n i + v i l j e l i j ä t u l o j e n + v i l j e l i j ä v ä e s t ö + v i l j e l i j ä v ä e s t ö l l e + v i l j e l i j ä v ä e s t ö l t ä + v i l j e l i j ä v ä e s t ö n + v i l j e l i j ä v ä e s t ö ä + v i l j e l i j ä y h d i s t y s t ä + v i l j e l i j ä y h t e i s ö + v i l j e l i j ä y h t e i s ö j e n + v i l j e l i j ä y h t e i s ö l l e + v i l j e l i j ä y h t e i s ö l l e m m e + v i l j e l i j ä y h t e i s ö n + v i l j e l i j ä y h t e i s ö t + v i l j e l i j ä y r i t t ä j ä + v i l j e l i j ä y s t ä v ä l l i s e m p i ä + v i l j e l i j ä y s t ä v ä n i + v i l j e l i j ö i d e m m e + v i l j e l i j ö i d e n + v i l j e l i j ö i h i n + v i l j e l i j ö i l l e + v i l j e l i j ö i l l e m m e + v i l j e l i j ö i l l e n i + v i l j e l i j ö i l l ä + v i l j e l i j ö i l t ä + v i l j e l i j ö i s t ä + v i l j e l i j ö i t ä + v i l j e l l ä + v i l j e l l ä ä n + v i l j e l m i i n + v i l j e l m i s t ä + v i l j e l t y i h i n + v i l j e l t y j e n + v i l j e l t ä i s i i n k i n + v i l j e l y a j a t t e l u n + v i l j e l y a l a + v i l j e l y a l a a + v i l j e l y a l a a n + v i l j e l y a l a n + v i l j e l y a l a t + v i l j e l y a l o i l t a a n + v i l j e l y a l o i s t a + v i l j e l y a l o j a + v i l j e l y a l u e + v i l j e l y a l u e e n + v i l j e l y a l u e e t + v i l j e l y a l u e i d e n + v i l j e l y a l u e i l l a + v i l j e l y a l u e i l l e + v i l j e l y a l u e i t a + v i l j e l y i l m o i t u s + v i l j e l y j ä r j e s t e l m i e n + v i l j e l y j ä r j e s t e l m i ä + v i l j e l y j ä r j e s t e l m ä t + v i l j e l y k a l a n ä y t t e i s t ä + v i l j e l y k a l o j e n + v i l j e l y k a s v e i h i n + v i l j e l y k a s v e i l l e + v i l j e l y k a s v e i s t a + v i l j e l y k a s v e j a + v i l j e l y k a s v i a + v i l j e l y k a s v i a l a l l a + v i l j e l y k a s v i a l o j e n + v i l j e l y k a s v i e n + v i l j e l y k a s v i l a j i e n + v i l j e l y k a s v i n + v i l j e l y k a s v i o h j e l m a + v i l j e l y k a s v i v a i h t o e h d o n + v i l j e l y k e l p o i n e n + v i l j e l y k e l p o i s e s t a + v i l j e l y k e l p o i s i a + v i l j e l y k i e l l o n + v i l j e l y k i e r r o n + v i l j e l y k i e r r o s s a + v i l j e l y k i e r t o + v i l j e l y k i e r t o a + v i l j e l y k i e r t o j ä r j e s t e l m i ä + v i l j e l y k i e r t o o n + v i l j e l y k ä y t ä n n ö i l l ä ä n + v i l j e l y k ä y t ä n n ö i s s ä + v i l j e l y k ä y t ä n n ö t + v i l j e l y k ä y t ä n t e i d e n + v i l j e l y k ä y t ä n t ö + v i l j e l y k ä y t ä n t ö i h i n + v i l j e l y k ä y t ä n t ö j e n + v i l j e l y k ä y t ä n t ö j ä + v i l j e l y k ä y t ä n t ö n s ä + v i l j e l y k ä y t ö s t ä + v i l j e l y l a j i + v i l j e l y l a j i e n + v i l j e l y l l e + v i l j e l y m a a + v i l j e l y m a a n + v i l j e l y m a a s t a + v i l j e l y m a a t a + v i l j e l y m a i d e n + v i l j e l y m a i h i n + v i l j e l y m a i l l a + v i l j e l y m a l l i + v i l j e l y m e n e t e l m i e n + v i l j e l y m e n e t e l m i i n + v i l j e l y m e n e t e l m i l l ä + v i l j e l y m e n e t e l m i s t ä + v i l j e l y m e n e t e l m i ä + v i l j e l y m e n e t e l m ä n s ä + v i l j e l y m e n e t e l m ä s t ä + v i l j e l y m e n e t e l m ä t + v i l j e l y m m e + v i l j e l y m u o t o + v i l j e l y m u o t o j e n + v i l j e l y n + v i l j e l y o h j e l m a a + v i l j e l y p a l k k i o i s t a + v i l j e l y p o l i t i i k a s t a + v i l j e l y s a l a a + v i l j e l y s a l o i h i n + v i l j e l y s a l u e e s t a + v i l j e l y s a l u e e t + v i l j e l y s e k t o r i + v i l j e l y s e k t o r i a + v i l j e l y s e k t o r i l t a + v i l j e l y s e k t o r i n + v i l j e l y s k e l p o i s e n + v i l j e l y s k e l p o i s t a + v i l j e l y s k ä y t ä n t ö j ä + v i l j e l y s m a a l l e + v i l j e l y s m a a n + v i l j e l y s m a a s t a + v i l j e l y s m a a t + v i l j e l y s m a a t a + v i l j e l y s m a i s t a + v i l j e l y s o p i m u k s e n + v i l j e l y s o p i m u k s e t + v i l j e l y s o p i m u s t e n + v i l j e l y s s ä + v i l j e l y s s ä h ä n + v i l j e l y s t a r k a s t u k s i i n + v i l j e l y s t e n + v i l j e l y s t ä + v i l j e l y s u u n n a n + v i l j e l y s u u n n i t e l m a a n s a + v i l j e l y s u u n n i t e l m a n s a + v i l j e l y t a i t o j a + v i l j e l y t a p o i h i n + v i l j e l y t a p o j a + v i l j e l y t a p o j e n + v i l j e l y t a r v e + v i l j e l y t a v a t + v i l j e l y t e k n i i k o i d e n + v i l j e l y t e k n i i k o i h i n + v i l j e l y t e k n i i k o i t a + v i l j e l y t e o l l i s u u d e l l e + v i l j e l y t i l o j a + v i l j e l y t o i m i n n a n + v i l j e l y t u k e a + v i l j e l y t u k i + v i l j e l y t u k i e n + v i l j e l y t u o t a n n o n + v i l j e l y t u o t t e e t + v i l j e l y t u o t t e i d e n + v i l j e l y t y ö h ö n + v i l j e l y u r a n + v i l j e l y v a a t i m u k s i a + v i l j e l y v a i h e e s s a + v i l j e l y v u o n n a + v i l j e l y v u o t t a + v i l j e l y y n + v i l j e l y ä + v i l k a i s k a a m m e + v i l k a s t u m a s s a + v i l k a s t u t t a m i s e k s i + v i l k k a a m m i k s i + v i l k k a a n + v i l k k a a n a + v i l k k a a s e e n + v i l k k a i m m i n + v i l k k a i m m i s t a + v i l k k a i m p i a + v i l k k a i s t a + v i l k k a i t a + v i l k k u l u o m i + v i l k k u p y r s t ö k o l i b r i + v i l k u i l l a + v i l l a h e i s i + v i l l a i s e l l a + v i l l a k a r v a j a l k a + v i l l a k a r v a r o u s k u + v i l l a m a m m u t t i + v i l l a n t u o t t a j i e n + v i l l a p a i t a a + v i l l a p a j u + v i l l a p ä ä l u i k k a + v i l l a s a k s i r a p u + v i l l a s a k s i r a v u n + v i l l a s a r v i k u o n o + v i l l a s o r m u s t i n k u k k a + v i l l a t e o l l i s u u d e n + v i l l i e l ä i m e n + v i l l i e l ä i m e t + v i l l i e l ä i m i l l e + v i l l i e l ä i m i l l ä + v i l l i e l ä i m i s t ä + v i l l i e l ä i m i ä + v i l l i e l ä i n + v i l l i e l ä i n e s i t y k s i ä + v i l l i e l ä i n k a u p p a + v i l l i e l ä i n k i e l t o a + v i l l i e l ä i n p u i s t o t + v i l l i e l ä i n t e n + v i l l i e n + v i l l i h a n h e t + v i l l i h e v o n e n + v i l l i h e v o s l a u m a n + v i l l i k i s s a + v i l l i l a p s i + v i l l i m e h i l ä i s p o p u l a a t i o i s s a + v i l l i m e h i l ä i s p o p u l a a t i o i t a + v i l l i n ä + v i l l i p e t o j a + v i l l i p e t o j e n + v i l l i s i a n + v i l l i s i a t k i n + v i l l i s i k a + v i l l i s i k o j a + v i l l i t + v i l l i ä + v i l p i l l i s e n + v i l p i l l i s e s s ä + v i l p i l l i s e t + v i l p i l l i s i i n + v i l p i l l i s i l t ä + v i l p i l l i s i n + v i l p i l l i s i n ä + v i l p i l l i s i ä + v i l p i l l i s t ä + v i l p i l l i s y y d e n + v i l p i l l i s y y d e s t ä + v i l p i t t ö m i k s i + v i l p i t t ö m i m m i n + v i l p i t t ö m i m m ä t + v i l p i t t ö m i n + v i l p i t t ö m i ä + v i l p i t t ö m y y d e n + v i l p i t t ö m y y d e s t ä + v i l p i t t ö m y y d e s t ä n n e + v i l p i t t ö m y y s t e s t i + v i l p i t t ö m y y t e n s ä + v i l p i t t ö m ä l l ä + v i l p i t t ö m ä m p i ä + v i l p i t t ö m ä m p ä ä + v i l p i t t ö m ä n + v i l p i t t ö m ä s s ä + v i l p i t t ö m ä s t ä + v i l p i t t ö m ä t + v i l p i t t ö m ä ä n + v i l p i t ö n t ä + v i l s k e e s s ä + v i l u s t u n u t t a + v i l u s t u u + v i n o k a s p u l k k o s i e n i + v i n o k ö y s i s i l t a + v i n o u t t a a + v i n o u t t a v i s t a + v i n t t i k o i r a k i l p a i l u t + v i n t t i k o i r i e n + v i n y y l i a s e t a a t t i + v i n y y l i k l o r i d i + v i n y y l i k l o r i d i m o n o m e e r i n + v i n y y l i l e v y + v i o i l l e + v i o l a a + v i o l a l l a + v i o l a l l e + v i o l a n + v i o l e t t i k o t i n g a + v i o l e t t i m e t a l l i p y r s t ö + v i o l e t t i s a p e l i k o l i b r i + v i o l e t t i s e i t i k k i + v i p p i ä + v i p u k e i h ä s + v i p u m e k a n i s m i t + v i p u r a h a s t o i h i n + v i p u r a h a s t o i l l e + v i p u r a h a s t o i s t a + v i p u r a h a s t o j a + v i p u r a h a s t o j e n + v i p u r a h a s t o t + v i p u r a h a s t o t o i m i n n a s t a + v i p u v a i k u t u k s e l l a + v i p u v a i k u t u k s e n + v i p u v a i k u t u k s e s t a + v i p u v a i k u t u k s e t + v i p u v a i k u t u k s i a + v i p u v a i k u t u s + v i p u v a i k u t u s t a + v i p u v a i k u t u s t o i m i n t o n s a + v i p u v o i m a a + v i p u v o i m i n a + v i p u v ä l i n e + v i r a l l i s e e n + v i r a l l i s e k s i + v i r a l l i s e l l a + v i r a l l i s e l l e + v i r a l l i s e m m a l l a + v i r a l l i s e m m a n + v i r a l l i s e m m a t + v i r a l l i s e m m i l l a + v i r a l l i s e m m i n + v i r a l l i s e m p i a + v i r a l l i s e n + v i r a l l i s e s s a + v i r a l l i s e s t a + v i r a l l i s e t + v i r a l l i s i a + v i r a l l i s i i n + v i r a l l i s i k s i + v i r a l l i s i l l a + v i r a l l i s i m m i s s a + v i r a l l i s i s s a + v i r a l l i s j u l k a i s u j e n + v i r a l l i s t a m a l l a + v i r a l l i s t a m i s p ä ä t ö k s e n + v i r a l l i s t e n + v i r a l l i s t e t u m p a a + v i r a n + v i r a n h a l t i j a a n + v i r a n h a l t i j a t + v i r a n h a l t i j o i d e n + v i r a n h a l t i j o i h i n + v i r a n h a l t i j o i l l a + v i r a n h a l t i j o i l l e + v i r a n h o i d o n + v i r a n h o i t o a n n e + v i r a n o m a i n e n + v i r a n o m a i s a l o i t t e e s t a + v i r a n o m a i s e e n + v i r a n o m a i s e l i m e t + v i r a n o m a i s e l i m i s s ä + v i r a n o m a i s e l i n + v i r a n o m a i s e l l a + v i r a n o m a i s e l l e + v i r a n o m a i s e l t a + v i r a n o m a i s e n + v i r a n o m a i s e n a + v i r a n o m a i s e n s a + v i r a n o m a i s e s s a + v i r a n o m a i s e t + v i r a n o m a i s i a + v i r a n o m a i s i i n + v i r a n o m a i s i l l a + v i r a n o m a i s i l l e + v i r a n o m a i s i l l e k i n + v i r a n o m a i s i l t a + v i r a n o m a i s i s s a + v i r a n o m a i s i s t a + v i r a n o m a i s j ä r j e s t e l m ä + v i r a n o m a i s k o n e i s t o n + v i r a n o m a i s k ä y t t ä j i e n + v i r a n o m a i s k ä y t ä n t ö j e n + v i r a n o m a i s o r g a n i s a a t i o n + v i r a n o m a i s p a l v e l u i d e n + v i r a n o m a i s p a l v e l u i s t a + v i r a n o m a i s p a l v e l u i t a + v i r a n o m a i s p a l v e l u j a + v i r a n o m a i s p a l v e l u t + v i r a n o m a i s s i h t e e r i s t ö n + v i r a n o m a i s s ä ä n t e l y + v i r a n o m a i s t a + v i r a n o m a i s t a h o + v i r a n o m a i s t a h o i h i n + v i r a n o m a i s t a h o t + v i r a n o m a i s t a r k a s t u s t e n + v i r a n o m a i s t a s o i l l a + v i r a n o m a i s t a s o j e n + v i r a n o m a i s t a s o l l a + v i r a n o m a i s t e h t ä v ä + v i r a n o m a i s t e n + v i r a n o m a i s t e n k i n + v i r a n o m a i s t i e t o j a + v i r a n o m a i s t o i m i n n a n + v i r a n o m a i s t o i m i n t a a + v i r a n o m a i s v a l v o n n a n + v i r a n o m a i s v a l v o n t a a + v i r a n o m a i s v e r k o s t o + v i r a n o m a i s v e r k o s t o n + v i r a n o m a i s y h t e i s t y ö + v i r a n o m a i s y h t e i s t y ö h ö n + v i r a n o m a i s y h t e i s t y ö n + v i r a n t o i m i t u k s e s t a + v i r a s s a + v i r a s s a a n + v i r a s t o a + v i r a s t o a s e t u s + v i r a s t o i l l a + v i r a s t o i l l e + v i r a s t o i s s a + v i r a s t o i s t a + v i r a s t o i s t a a n + v i r a s t o j a + v i r a s t o j e n + v i r a s t o j ä r j e s t e l m ä n + v i r a s t o j ä r j e s t e l m ä ä + v i r a s t o j ä r j e s t e l m ä ä n + v i r a s t o l l a + v i r a s t o l l e + v i r a s t o m a l l i + v i r a s t o n + v i r a s t o p a k e t i n + v i r a s t o p e l l e i l y y n + v i r a s t o s s a + v i r a s t o s t a + v i r a s t o t + v i r a s t o t k i n + v i r a s t o v a i h t o e h t o + v i r a t + v i r e i l l e p a n o o n + v i r e i l l e p a n o v o i m a + v i r e i l l ä o l o s t a + v i r e y t t ä m i s e k s i + v i r e y t t ä ä k s e e n + v i r e ä m p ä ä + v i r e ä ä + v i r h e a r v i o i n n e i s t a + v i r h e a r v i o i n n i n + v i r h e a r v i o i n t e i h i n + v i r h e a r v i o i n t e j a + v i r h e a r v i o o n + v i r h e a s t e + v i r h e a s t e e n + v i r h e a s t e i k o l l a + v i r h e a s t e t t a + v i r h e e l l i s i i n + v i r h e e l l i s i k s i + v i r h e e l l i s i l l ä + v i r h e e l l i s i n + v i r h e e l l i s i s t ä + v i r h e e l l i s i ä + v i r h e e l l i s t e n + v i r h e e l l i s t ä + v i r h e e m m e + v i r h e e n + v i r h e e n i + v i r h e e n k o r j a u s k o o d i + v i r h e e n s ä + v i r h e e n ä + v i r h e e s t ä + v i r h e e t + v i r h e e t t ö m i ä + v i r h e e t t ö m ä m p i + v i r h e e t t ö m ä ä n + v i r h e f u n k t i o + v i r h e i d e n + v i r h e i l l e + v i r h e i l l ä + v i r h e i l m o i t u k s i i n + v i r h e i n e e n + v i r h e i n v e s t o i n n i t + v i r h e i s i i n + v i r h e i s t ä + v i r h e i s t ä m m e + v i r h e i s t ä ä n + v i r h e i t ä + v i r h e i t ä k ä ä n + v i r h e k a t a s t r o f i + v i r h e l i i k e t t ä + v i r h e l ä h d e + v i r h e l ä h t e i d e n + v i r h e l ä h t e i t ä + v i r h e m a h d o l l i s u u d e n + v i r h e m a r g i n a a l i + v i r h e m a r g i n a a l i a + v i r h e m a r g i n a a l i e n + v i r h e m a r g i n a a l i l l a + v i r h e m a r g i n a a l i m m e + v i r h e m a r g i n a a l i n + v i r h e m ä ä r i e n + v i r h e m ä ä r i i n + v i r h e m ä ä r i ä + v i r h e m ä ä r ä ä + v i r h e o s u u s + v i r h e p i s t e i s i i n + v i r h e p i s t e j ä r j e s t e l m ä + v i r h e p i s t e j ä r j e s t e l m ä n + v i r h e p r o s e n t i n + v i r h e p r o s e n t i s t a + v i r h e p r o s e n t i t + v i r h e p r o s e n t t i + v i r h e p r o s e n t t i a + v i r h e p r o s e n t t i i n + v i r h e p ä ä t e l m ä + v i r h e p ä ä t ö k s i i n + v i r h e r a t k a i s u i h i n + v i r h e r i s k e j ä + v i r h e r i s k i + v i r h e r i s k i i n + v i r h e r i s k i n + v i r h e r i s k i s t ä + v i r h e r i s k i ä + v i r h e s u h d e + v i r h e t a s o + v i r h e t a s o a + v i r h e t a s o i s t a + v i r h e t a s o j a + v i r h e t a s o n + v i r h e t a s o o n + v i r h e t a s o s s a + v i r h e t a s o s t a + v i r h e t a s o t + v i r h e t t ä + v i r h e t t ä n i + v i r h e t u l k i n t o j e n + v i r h e t y y p p e j ä + v i r i i l i m p i i n + v i r i k k e e n + v i r i k k e i t ä + v i r i n n y t + v i r i t t ä m i s e s t ä + v i r i t y s t i l a + v i r i ä ä + v i r k a a + v i r k a a n + v i r k a a n a s e t t a m i s k e s k u s t e l u s s a a n + v i r k a a n a s e t t a m i s s e r e m o n i a + v i r k a a n a s t u j a i s i s t u n t o + v i r k a a n a s t u j a i s p u h e + v i r k a a n a s t u j a i s p u h e e l t a + v i r k a a n a s t u j a i s p u h e e s s a + v i r k a a n a s t u j a i s p u h e e s s a a n + v i r k a a n a s t u j a i s p u h e e s s a n n e + v i r k a a n a s t u j a i s p ä i v ä n ä n n e + v i r k a a n a s t u m i s a i k a t a u l u + v i r k a a n a s t u m i s e n s a + v i r k a a n a s t u m i s k e s k u s t e l u i n e e n + v i r k a a n a s t u m i s m e n e t t e l y n + v i r k a a n a s t u m i s p ä i v ä n ä ä n + v i r k a a n n e + v i r k a e h d o i s s a + v i r k a e l ä i n l ä ä k ä r e i d e n + v i r k a e l ä i n l ä ä k ä r i + v i r k a e l ä i n l ä ä k ä r i e n + v i r k a e l ä i n l ä ä k ä r i l l e + v i r k a e l ä i n l ä ä k ä r i n + v i r k a e l ä i n l ä ä k ä r i t + v i r k a e l ä i n l ä ä k ä r i ä + v i r k a h a a r a t + v i r k a h i e r a r k i a n + v i r k a i l i j a n + v i r k a i l i j a n a + v i r k a i l i j a s t a + v i r k a i l i j o i d e n + v i r k a i l i j o i t a + v i r k a i n t o a a n + v i r k a i n t o i s e s t a + v i r k a i ä l t ä ä n + v i r k a j ä r j e s t e l y i s t ä + v i r k a k a u d e l l a + v i r k a k a u d e l l a n i + v i r k a k a u d e l l a n n e + v i r k a k a u d e l l e n n e + v i r k a k a u d e n + v i r k a k a u d e s t a a n + v i r k a k a u d e s t a n i + v i r k a k a u d e s t a n n e + v i r k a k a u s i e n + v i r k a k a u t e n a + v i r k a k a u t e n i + v i r k a k a u t e n n e + v i r k a k a u t e n s a + v i r k a k a u t t a + v i r k a k i e l e n + v i r k a k i e l i k s i + v i r k a k i e r t o j ä r j e s t e l m ä ä n + v i r k a k o k e m u k s e l l a + v i r k a k o n e i s t o + v i r k a k o n e i s t o a + v i r k a k o n e i s t o n + v i r k a k o n e i s t o n s a + v i r k a k o n e i s t o o n + v i r k a k o n e i s t o s s a + v i r k a k o n e i s t o t + v i r k a m a t k a k u l u t + v i r k a m a t k a l l a + v i r k a m a t k a n + v i r k a m a t k a p a s s e j a + v i r k a m a t k a p a s s i e n + v i r k a m i e h e k s i + v i r k a m i e h e l l e + v i r k a m i e h e l t ä + v i r k a m i e h e m m e + v i r k a m i e h e n + v i r k a m i e h e n n e + v i r k a m i e h e n s ä + v i r k a m i e h e n ä + v i r k a m i e h e t + v i r k a m i e h i e n + v i r k a m i e h i i n + v i r k a m i e h i k s i + v i r k a m i e h i l l e + v i r k a m i e h i l l e e n + v i r k a m i e h i l l ä + v i r k a m i e h i l t ä + v i r k a m i e h i n ä + v i r k a m i e h i s t ä + v i r k a m i e h i s t ö + v i r k a m i e h i s t ö n + v i r k a m i e h i s t ö ä + v i r k a m i e h i s t ö ö n + v i r k a m i e h i ä + v i r k a m i e h i ä n n e + v i r k a m i e h i ä ä n + v i r k a m i e s + v i r k a m i e s a r m e i j a + v i r k a m i e s e d u s t a j a t + v i r k a m i e s e l i m e s s ä + v i r k a m i e s j o u k k o + v i r k a m i e s k i l p a i l u u n + v i r k a m i e s k o l l e g i o + v i r k a m i e s k o n e i s t o n + v i r k a m i e s k o n e i s t o s t a + v i r k a m i e s k u l t t u u r i a + v i r k a m i e s k u n n a n + v i r k a m i e s k u n n a s s a + v i r k a m i e s k u n n a s t a + v i r k a m i e s k u n n a s t a a n + v i r k a m i e s k u n t a + v i r k a m i e s k u n t a a + v i r k a m i e s k u n t a a n + v i r k a m i e s l a i n s ä ä d ä n t ö ä + v i r k a m i e s l a k i i n + v i r k a m i e s l e h t e r i l l e m m e + v i r k a m i e s l u o k k i i n + v i r k a m i e s m ä i n e n + v i r k a m i e s n i m i k k e i d e n + v i r k a m i e s r y h m ä + v i r k a m i e s r y h m ä n + v i r k a m i e s r y h m ä s t ä + v i r k a m i e s s ä ä n t ö j ä + v i r k a m i e s t a s o + v i r k a m i e s t a s o a + v i r k a m i e s t a s o l l a + v i r k a m i e s t a s o l l e + v i r k a m i e s t e m m e + v i r k a m i e s t e n + v i r k a m i e s t o i m e n a + v i r k a m i e s t u o m i o i s t u i m e n + v i r k a m i e s t u o m i o i s t u i m e s s a + v i r k a m i e s t u o m i o i s t u i n + v i r k a m i e s t y y p p i s i ä + v i r k a m i e s t ä + v i r k a m i e s u r a s t a + v i r k a m i e s u u d i s t u s + v i r k a m i e s v a l t u u s k u n n a n + v i r k a m i e s ä l y m y s t ö + v i r k a n i m i t y k s i i n + v i r k a n i m i t y k s i ä + v i r k a n i m i t y s p r o s e s s i e n + v i r k a n s a + v i r k a p u k u i s e t + v i r k a p u k u n s a + v i r k a r a k e n t e e n + v i r k a s ä ä n t ö ä + v i r k a t e h t ä v ä t + v i r k a t o i n t a + v i r k a t o v e r e i l l e n i + v i r k a u r a a + v i r k a v a l a + v i r k a v a l a n s a + v i r k a v e l j e n i + v i r k a v e l j i i n s ä + v i r k a v e l v o l l i s u u t e n n e + v i r k a y l e n n y k s i s t ä + v i r k a y l e n n y k s i ä + v i r k e t t ä + v i r k i s t y s a l u e e t + v i r k i s t y s a l u e i n a + v i r k i s t y s a l u e i s i i n + v i r k i s t y s a l u e i t a + v i r k i s t y s a l u e i t a a n + v i r k i s t y s a l u e t t a + v i r k i s t y s k a l a s t a j a t + v i r k i s t y s k a l a s t a j i a + v i r k i s t y s k a l a s t a j i e n + v i r k i s t y s k a l a s t u k s e e n + v i r k i s t y s k a l a s t u k s e n + v i r k i s t y s k a l a s t u s a l a + v i r k i s t y s k a l a s t u s a l a l l e + v i r k i s t y s k a l a s t u s t a + v i r k i s t y s k a l a s t u s t e o l l i s u u s + v i r k i s t y s k ä y t t ö m u o d o t + v i r k i s t y s k ä y t t ö ä + v i r k i s t y s k ä y t t ö ö n + v i r k i s t y s k ä y t ö n + v i r k i s t y s k ä y t ö s t ä + v i r k i s t y s m a h d o l l i s u u k s i e n + v i r k i s t y s m a t k a i l u n + v i r k i s t y s m a t k a l l a + v i r k i s t y s t a r k o i t u k s i i n + v i r k i s t y s t o i m i n n a n + v i r k i s t y s t o i m i n n o t + v i r k i s t y s t o i m i n t a + v i r k i s t y s t o i m i n t a a + v i r k i s t y s t o i m i n t a a n + v i r k i s t y s t o i m i n t o j a + v i r k i s t ä m ä ä n + v i r k k e e n + v i r k k e e s s ä + v i r k k e e s t ä + v i r k k u u k o u k k u + v i r k o i h i n + v i r k o j a + v i r k o j e n + v i r n a p e r h o n e n + v i r n a p u n a t ä p l ä + v i r n a s i n i s i i p i + v i r o a + v i r o i s t a + v i r o l a i s e n a + v i r o l a i s k o l l e g o j a + v i r o l a i s p u u t a r h a n + v i r o l l e + v i r o l o g i s i a + v i r o n + v i r o n k i e l i s e n + v i r o n r u o t s a l a i s e t + v i r o n v e n ä l ä i s e t + v i r o s s a + v i r o s t a + v i r r a n j a k e l u s s a + v i r r a n k o s k e a + v i r r a n k o s k e l l e + v i r r a n k o s k e n + v i r r a n k o s k i + v i r s t a n p y l v ä s + v i r s t a n p y l v ä s t ä + v i r s t a n p y l v ä ä n + v i r s t a n p y l v ä ä n ä + v i r s u t + v i r t a a k i n + v i r t a a n + v i r t a h e p o a + v i r t a h e p o p u o l u s t u s + v i r t a k a t k o k s e s t a + v i r t a k a t k o k s i a + v i r t a k e r t t u l i + v i r t a k e r t t u n e n + v i r t a k i s k o + v i r t a l ä h t e e s e e n + v i r t a l ä h t e i d e n + v i r t a p i i k k i + v i r t a p i i r i + v i r t a t i l e j ä + v i r t a u k s e t + v i r t a u s d y n a m i i k k a + v i r t a u s j ä r j e s t e l m i e n + v i r t a u s m a l l i + v i r t a u s m e k a n i i k k a + v i r t a u s n o p e u s + v i r t a u s t a + v i r t a u s v i d e o i d e n + v i r t a v e n t t i i l i + v i r t a v i i v a i s e m m i l l a + v i r t a v i i v a i s e m p a a + v i r t a v i i v a i s e s t i + v i r t a v i i v a i s t a a k s e e n + v i r t a v i i v a i s t a m i s e k s i + v i r t a v i i v a i s t e t t a v a + v i r t a v ä s t ä r ä k k i + v i r t o j a + v i r t o j e n + v i r t s a h a p p o + v i r t s a k i v i t a u t i + v i r t s a n e r i t y s e l i m i s t ö + v i r t s a n j o h d i n s y ö p ä + v i r t s a p u r o + v i r t s a r a k k o + v i r t s a t e r a p i a + v i r t s a t i e h y i d e n + v i r t s a t i e i n f e k t i o + v i r t u a a l i k i r j a s t o j e n + v i r t u a a l i s e k s i + v i r t u a a l i s e m p a a + v i r t u a a l i t o d e l l i s u u d e n + v i r t u a a l i t o d e l l i s u u d e s s a + v i r t u a a l i t o d e l l i s u u t t a + v i r u k s e n + v i r u k s e s t a + v i r u k s e t + v i r u k s i a + v i r u m a a + v i r u s e p i d e m i a n + v i r u s e p i d e m i o i d e n + v i r u s e p i d e m i o i h i n + v i r u s i n f e k t i o + v i r u s i n f e k t i o t + v i r u s k a n t a a + v i r u s k a n t o j a + v i r u s l ä ä k e + v i r u s l ä ä k e t e o l l i s u u d e n + v i r u s l ä ä k e v a r a s t o i h i n + v i r u s l ä ä k e v a r a s t o j e n + v i r u s l ä ä k k e e n + v i r u s l ä ä k k e i d e n + v i r u s l ä ä k k e i s i i n + v i r u s l ä ä k k e i s t ä + v i r u s l ä ä k k e i t ä + v i r u s m u t a a t i o i s t a + v i r u s m u t a a t i o n + v i r u s r o k o t t e i d e n + v i r u s t a + v i r u s t a p a u k s i a + v i r u s t a r t u n n a n + v i r u s t a r t u n n o i l t a + v i r u s t a r t u n n o i s t a + v i r u s t a r t u n t a + v i r u s t a r t u n t a a + v i r u s t a u d i n + v i r u s t a u d i t + v i r u s t a u t e j a + v i r u s t a u t i + v i r u s t a u t i a + v i r u s t a u t i e n + v i r u s t e n + v i r u s t o r j u n t a + v i r u s t y y p i t + v i r u s t y y p p i ä + v i r v a t u l i + v i r v o i t u s j u o m a + v i r v o i t u s j u o m a a + v i r v o i t u s j u o m a t + v i r v o i t u s j u o m i a + v i r v o i t u s j u o m i e n + v i r v o i t u s j u o m i i n + v i r v o i t u s j u o m i s s a + v i r v o k k e e t + v i s a i s i a + v i s a y a n p a r t a s i k a + v i s i o i s t a + v i s i o i t a + v i s i o n + v i s i o n ä ä r e i s t ä + v i s i o n ä ä r i s t ä + v i s i o o n i + v i s i o r y h m ä + v i s i o r y h m ä n + v i s i o t + v i s i o t a + v i s k i i n + v i s k i k a p i n a + v i s k i n j u o j i a + v i s k i n t u o t a n t o o n + v i s k i n t u o t t a j a m a i d e n + v i s k i n t u o t t a j i l l e + v i s k i s t ä + v i s k i t e o l l i s u u d e l l e + v i s k i t e o l l i s u u d e n + v i s k i t e o l l i s u u s + v i s k i t e o l l i s u u t t a + v i s k i t y y p i t + v i s m u t t i k o h t e e s e e n + v i s u a a l i s t e n + v i t a m i i n e i l l a + v i t a m i i n e j a + v i t a m i i n i d i r e k t i i v i n + v i t a m i i n i e n + v i t a m i i n i h o i d o i n + v i t a m i i n i h o i t o j a + v i t a m i i n i l i s i e n + v i t a m i i n i p i t o i s u u d e n + v i t a m i i n i p i t o i s u u d e s t a + v i t a m i i n i p i t o i s u u s + v i t a m i i n i t a b l e t i t + v i t a m i i n i t u o t t e i d e n + v i t a m i i n i v a l m i s t e i s t a + v i t k a s t e l e e + v i t k a s t e l e v a t + v i t k a s t e l l a + v i t k a s t e l u a + v i t k a s t e l u j e n + v i t k a s t e l u l l a k i n + v i t k a s t e l u n + v i t k u t t e l e v a n + v i t k u t t e l e v a t + v i t s a u k s e n + v i t s a u k s i i n + v i t s a u k s i s t a + v i t s a u s t a + v i t s e i l l e + v i u h k a h a u k k a + v i u h k a k e r t t u n e n + v i u h k a l i s ä k e + v i u h k a p a r a t i i s i h a r a k k a + v i u h k a p e r h o s e t + v i u h k a p y r s t ö k e r t t u l i + v i u h k a p y r s t ö t y r a n n i + v i u l u j a a n + v i u l u k i l p a i l u + v i u l u k o n s e r t t o + v i v a h t e e n + v i v a h t e i k k a a m p a a + v i v a h t e i k k a a m p i + v i v a h t e i s i i n + v i v a h t e i s t a a n + v o d k a a + v o d k a k e s k u s t e l u n + v o d k a k y s y m y k s e e n + v o d k a k y s y m y s t ä + v o d k a l u o k k a + v o d k a m a r t i n i + v o d k a n t u o t t a j a m a a + v o d k a n t u o t t a j a m a a t + v o d k a n t u o t t a j i e n + v o d k a n v a l m i s t a j i e n + v o d k a s o d a n + v o d k a s t a + v o d k a t a r k i s t u s t a + v o d k a t e o l l i s u u d e n + v o h v e l i r a u t a + v o i a l a l l a + v o i d a + v o i d a a n + v o i d a a n h a n + v o i d a a n k i n + v o i d a a n k o + v o i d a k s e e n + v o i d a k s e m m e + v o i d a k s e n i + v o i d e k a l v o n + v o i d e s s a n i + v o i h a p p o + v o i k a a n + v o i k a s t i k e + v o i k i n + v o i k k o v ä r i + v o i k o + v o i k u k k a + v o i l e i p ä + v o i m a a + v o i m a a n a s t u m i s e n + v o i m a a n a s t u m i s e s t a + v o i m a a n a s t u m i s t a + v o i m a a n s a a t t a m i n e n + v o i m a a n s a a t t a m i s e k s i + v o i m a a n s a a t t a m i s e l l e + v o i m a a n t u l e m i s e n + v o i m a a n t u l l e e s s a + v o i m a a n t u l l e e t + v o i m a a n t u l o + v o i m a a n t u l o a + v o i m a a n t u l o a a n + v o i m a a n t u l o e h d o i s t a + v o i m a a n t u l o l l a + v o i m a a n t u l o l l e + v o i m a a n t u l o m e n e t t e l y + v o i m a a n t u l o n + v o i m a a n t u l o n s a + v o i m a a n t u l o o n + v o i m a a n t u l o p ä i v ä + v o i m a a n t u l o p ä i v ä m ä ä r ä l l ä + v o i m a a n t u l o p ä i v ä m ä ä r ä n ä + v o i m a a n t u l o p ä i v ä n + v o i m a a n t u l o p ä i v ä s t ä + v o i m a a n t u l o p ä i v ä ä n + v o i m a a n t u l o s t a + v o i m a a t u l o l t a + v o i m a h y ö k k ä ä j ä + v o i m a i n k o e t u k s e n a + v o i m a i n k o e t u s + v o i m a i n k o i t o s + v o i m a j o h t o j e n + v o i m a k a s t a + v o i m a k e i n o i n + v o i m a k e i n o i s t a + v o i m a k e i n o j a + v o i m a k e i n o n s a + v o i m a k e i n o t + v o i m a k e n t t ä + v o i m a k e s k i t t y m i l l e + v o i m a k e s k i t t y m i s t ä + v o i m a k e s k u k s i a + v o i m a k e s k u k s i k s i + v o i m a k e s k u s t e n + v o i m a k i e l t ä + v o i m a k k a a k s i + v o i m a k k a a m m a l l a + v o i m a k k a a m m a n + v o i m a k k a a m m a s t a + v o i m a k k a a m m a t + v o i m a k k a a m m i k s i + v o i m a k k a a m m i l t a + v o i m a k k a a m m i n + v o i m a k k a a m m i s t a + v o i m a k k a a m p a a + v o i m a k k a a m p a a n + v o i m a k k a a m p a n a + v o i m a k k a a m p i + v o i m a k k a a m p i a + v o i m a k k a a m p i e n + v o i m a k k a a m p i i n + v o i m a k k a a n + v o i m a k k a a n a + v o i m a k k a a s e e n + v o i m a k k a a s t a + v o i m a k k a a t + v o i m a k k a i d e n + v o i m a k k a i m m a k s i + v o i m a k k a i m m a l l a + v o i m a k k a i m m a t + v o i m a k k a i m m i n + v o i m a k k a i m m i s t a + v o i m a k k a i m p a n a + v o i m a k k a i m p i a + v o i m a k k a i m p i e n + v o i m a k k a i m p i i n + v o i m a k k a i n + v o i m a k k a i n t a + v o i m a k k a i s i i n + v o i m a k k a i s t a + v o i m a k k a i t a + v o i m a k o l m i k o n + v o i m a k s i + v o i m a k ä y t t ö + v o i m a l a a + v o i m a l a a n + v o i m a l a i t o k s e e n + v o i m a l a i t o k s e n + v o i m a l a i t o k s e s s a + v o i m a l a i t o k s e s t a + v o i m a l a i t o k s e t + v o i m a l a i t o k s i a + v o i m a l a i t o k s i i n + v o i m a l a i t o k s i l l a + v o i m a l a i t o k s i s s a + v o i m a l a i t o k s i s s a a n + v o i m a l a i t o k s i s t a + v o i m a l a i t o s + v o i m a l a i t o s t a + v o i m a l a i t o s t e k n i i k k a a + v o i m a l a i t o s t e n + v o i m a l a i t o s t u t k i m u k s e t + v o i m a l a l l e + v o i m a l a n + v o i m a l a n a + v o i m a l a p a d o t + v o i m a l a s s a + v o i m a l a t + v o i m a l a v a i h e e s s a + v o i m a l a y k s i k ö i s t ä + v o i m a l e i k k u r i + v o i m a l i n j a t + v o i m a l i n j o j a + v o i m a l i n j o j e n + v o i m a l l i s e m m i n + v o i m a l l i s e m p a a + v o i m a l l i s e m p i a + v o i m a l o i d e n + v o i m a l o i h i n + v o i m a l o i l l e + v o i m a l o i l l e m m e + v o i m a l o i s s a + v o i m a l o i s s a a n + v o i m a l o i s t a + v o i m a l o i t a + v o i m a l o i t a a n + v o i m a m i e s k i l p a i l u t + v o i m a m m e + v o i m a n + v o i m a n a + v o i m a n k ä y t t ö + v o i m a n k ä y t t ö n s ä + v o i m a n k ä y t t ö o i k e u t t a + v o i m a n k ä y t t ö s ä ä n n ö k s i ä + v o i m a n k ä y t t ö s ä ä n n ö s t ö ä + v o i m a n k ä y t t ö s ä ä n n ö t + v o i m a n k ä y t t ö v a l t u u d e t + v o i m a n k ä y t t ö ä + v o i m a n k ä y t t ö ö n + v o i m a n k ä y t ö l l e + v o i m a n k ä y t ö l l ä + v o i m a n k ä y t ö n + v o i m a n k ä y t ö s t ä + v o i m a n l ä h d e + v o i m a n l ä h t e i t ä + v o i m a n n e + v o i m a n n ä y t e + v o i m a n n ä y t t e e l l ä + v o i m a n n ä y t t ö + v o i m a n n ä y t t ö ö n + v o i m a n n ä y t ö t + v o i m a n o s o i t u k s e e n + v o i m a n p u u t t e e n + v o i m a n s a + v o i m a p a p e r i + v o i m a p e l i s s ä + v o i m a p e r u s t e i t a + v o i m a p e r ä i s e m p ä ä + v o i m a p e r ä i s e t + v o i m a p o l i i t t i s i l l e + v o i m a p o l i t i i k a l l a + v o i m a p o l i t i i k a s t a + v o i m a p o l i t i i k k a + v o i m a p o l i t i i k k a a + v o i m a p o l i t i i k k a a n s a + v o i m a p o p + v o i m a s i l t a + v o i m a s o i n t u + v o i m a s s a o l e v a k s i + v o i m a s s a o l o + v o i m a s s a o l o a + v o i m a s s a o l o a i k a + v o i m a s s a o l o a i k a a + v o i m a s s a o l o a i k a a n + v o i m a s s a o l o a i k a k a a n + v o i m a s s a o l o a i k a n a + v o i m a s s a o l o a i k o j a + v o i m a s s a o l o a j a n + v o i m a s s a o l o a j a t + v o i m a s s a o l o a j o i s t a + v o i m a s s a o l o n + v o i m a s s a o l o p ä i v i ä + v o i m a s s a o l o s t a + v o i m a s s a o l o v u o s i + v o i m a s u h t e e t + v o i m a s u h t e i d e n + v o i m a s u h t e i l l a + v o i m a s u h t e i s i i n + v o i m a s u h t e i s t a + v o i m a s u h t e i t a + v o i m a t + v o i m a t a s a p a i n o + v o i m a t a s a p a i n o a + v o i m a t a s a p a i n o n + v o i m a t a s a p a i n o o n + v o i m a t a s a p a i n o s t a + v o i m a t e k i j ä + v o i m a t e k i j ä l l ä + v o i m a t e k i j ä t + v o i m a t o i m e t + v o i m a t o i m i i n + v o i m a t o i m i n + v o i m a t o n t a + v o i m a t t a + v o i m a t t o m a k s i + v o i m a t t o m a n a + v o i m a t t o m i a + v o i m a t t o m i e n + v o i m a t t o m i k s i + v o i m a t t o m i m p i a + v o i m a t t o m u u d e s t a + v o i m a t t o m u u t e e n + v o i m a t t o m u u t e n s a + v o i m a v a r a + v o i m a v a r a k s i + v o i m a v a r a n + v o i m a v a r a n a + v o i m a v a r a n s a + v o i m a v a r a o n g e l m a n + v o i m a v a r a r e s e r v i + v o i m a v a r a r e s u r s s e i s t a + v o i m a v a r a t + v o i m a v a r o i h i n + v o i m a v a r o i h i n s a + v o i m a v a r o i l t a a n + v o i m a v a r o i n + v o i m a v a r o i s t a + v o i m a v a r o j a + v o i m a v a r o j a a n + v o i m a v a r o j a m m e + v o i m a v a r o j e m m e + v o i m a v a r o j e n + v o i m a v e r k o t + v o i m a y h t i ö + v o i m a y h t i ö i d e n + v o i m a y h t i ö i l l e + v o i m i a + v o i m i a a n + v o i m i a m m e + v o i m i e n + v o i m i e n k o e t u s + v o i m i l l a + v o i m i l l e + v o i m i s s a a n + v o i m i s t a a + v o i m i s t a m i s o p e r a a t i o t a + v o i m i s t a n e e t + v o i m i s t e t t a v a + v o i m i s t u a + v o i m i s t u e s s a + v o i m i s t u m a s s a + v o i m i s t u n e e n + v o i m i s t u n e e t + v o i m i s t u n u t + v o i m i s t u u + v o i m i s t u v a n + v o i m i s t u v a t + v o i m m e + v o i m m e k i n + v o i m m e k o + v o i m ä ä r i e n + v o i n e + v o i n e e n s a + v o i n e e t + v o i n k i n + v o i n k o + v o i n u t + v o i p u u ö l j y + v o i p u u ö l j y s t ä + v o i p u u ö l j y y n + v o i p u u ö l j y ä + v o i r a s v a n + v o i s i + v o i s i k o + v o i s i k o h a n + v o i s i m m e + v o i s i m m e k o + v o i s i n + v o i s i n k o h a n + v o i s i t t e k o + v o i s i t t e k o h a n + v o i s i v a t + v o i s i v a t k o + v o i t a i k i n a + v o i t a i s i + v o i t a i s i i n + v o i t a i s i i n k o + v o i t a i s i i n k o h a n + v o i t a m m e + v o i t a m m e k i n + v o i t a n e e n + v o i t a p a u k s e s t a + v o i t a t t i + v o i t a v a m m e + v o i t a v a n s a + v o i t e l u k o j e + v o i t e l u ö l j y + v o i t e l u ö l j y i n ä + v o i t e l u ö l j y n ä + v o i t e l u ö l j y ä + v o i t e t a + v o i t e t t a v a + v o i t e t t a v a k s i + v o i t e t t a v a t + v o i t e t t a v i s s a + v o i t i i n + v o i t o i s t a + v o i t o l l a + v o i t o l l e + v o i t o n + v o i t o n h a l u + v o i t o n h i m o s s a a n + v o i t o n h u u m a s s a + v o i t o n j a k o + v o i t o n j a k o a + v o i t o n j a k o m a l l i + v o i t o n j a n o + v o i t o n j a o l l a + v o i t o n j a o n + v o i t o n j a o s t a + v o i t o n l ä h d e + v o i t o n m a h d o l l i s u u k s i a + v o i t o n n ä l k ä ä + v o i t o n p e l k o a + v o i t o n p y l v ä s + v o i t o n p ä i v ä + v o i t o n t a v o i t t e l i j o i d e n + v o i t o n t a v o i t t e l u + v o i t o n t a v o i t t e l u a + v o i t o n t a v o i t t e l u l l e + v o i t o n t a v o i t t e l u m a h d o l l i s u u k s i a + v o i t o n t a v o i t t e l u n + v o i t o n t a v o i t t e l u s t a + v o i t o n t a v o i t t e l u t a r k o i t u k s e s s a + v o i t o n t a v o i t t e l u u n + v o i t o n t a v o i t t e l u v a a t i m u k s i i n + v o i t o n t u o t o n + v o i t o s t a + v o i t o t + v o i t t a a + v o i t t a a k s e e n + v o i t t a a k s e m m e + v o i t t a a k s e n n e + v o i t t a j a l l a + v o i t t a j a n a + v o i t t a j a n k o r o k k e e l l e + v o i t t a j a t i l a n t e e s s a + v o i t t a j a v a l t o j e n + v o i t t a j i a + v o i t t a j i e n + v o i t t a j i k s i + v o i t t a j i n a + v o i t t a j i s t a + v o i t t a m a a n + v o i t t a m a i s i l l a m m e + v o i t t a m a s s a + v o i t t a m a t t o m a n a + v o i t t a m i s e k s i + v o i t t a m i s e s s a + v o i t t a m i s e s t a + v o i t t a n e e t + v o i t t a n u t t a + v o i t t a v a n + v o i t t a v a t + v o i t t e + v o i t t e k i n + v o i t t e k o + v o i t t i + v o i t t i v a t + v o i t t o a + v o i t t o a a n + v o i t t o a u t o m a a t t i + v o i t t o i h i n + v o i t t o j a + v o i t t o j a a n + v o i t t o j e n + v o i t t o j e n s a + v o i t t o k i e r t e e s e e n + v o i t t o k u l k u a a n + v o i t t o m a h d o l l i s u u d e t + v o i t t o m a r g i n a a l e i h i n + v o i t t o m a r g i n a a l e i s t a a n + v o i t t o m a r g i n a a l e j a + v o i t t o m a r g i n a a l e j a a n + v o i t t o m a r g i n a a l i + v o i t t o m a r g i n a a l i a + v o i t t o m a r g i n a a l i a a n + v o i t t o m a r g i n a a l i e n + v o i t t o m a r g i n a a l i e n s a + v o i t t o m a r g i n a a l i l l a + v o i t t o m a r g i n a a l i n + v o i t t o m a r g i n a a l i n s a + v o i t t o m a r g i n a a l i t + v o i t t o n a + v o i t t o n a k a a n + v o i t t o n s a + v o i t t o n ä k y m i ä + v o i t t o o n + v o i t t o p a l k k i o j ä r j e s t e l m i e n + v o i t t o p a l k k i o j ä r j e s t e l m ä + v o i t t o p a l k k i o j ä r j e s t e l m ä ä + v o i t t o p r o s e n t i t + v o i t t o s a a l i i s t a + v o i t t o t a s o i h i n + v o i t t o v e r o s t a + v o i t u + v o i v a m m e + v o i v a n s a + v o i v a t + v o i v o d i n a s s a + v o i v u o r e n + v o i v u o r e t + v o i v u o r i + v o i v u o r i a + v o i v u o r i s t a + v o k a a l i s o i n t u + v o k a a l i t r a n c e + v o l f r a m i h e k s a k l o r i d i + v o l f r a m i k a r b i d i + v o l f r a m i t r i o k s i d i + v o l t t i a m p e e r i + v o l y y m i r i k o l l i s u u t t a + v o l y y m i s o t a + v o t i i v i l a h j a + v o t k a p u l l o l l a + v u o d a t e t t i i n + v u o d a t e t t u + v u o d a t t a m a t t a + v u o d e k s i + v u o d e l i i n a v a a t t e i d e n + v u o d e l l a + v u o d e l l e + v u o d e l t a + v u o d e n + v u o d e n a i k a a + v u o d e n a i k a a n + v u o d e n a i k o i h i n + v u o d e n a i k o i n a + v u o d e n a i k o j e n + v u o d e n a j a n + v u o d e n a j a s t a + v u o d e n a j a t + v u o d e n t a k a i s e s t a + v u o d e n t a k a i s t e n + v u o d e n v a i h d e t t a + v u o d e n v a i h t e e n + v u o d e n v a i h t e e s s a + v u o d e s s a + v u o d e s t a + v u o d e t + v u o d e t t u + v u o d o t + v u o h e n k e l l o + v u o h e n l i h a + v u o h e n m a i t o t a l o u t e e n + v u o h e n p u t k i + v u o h e t + v u o h i a l a l l e + v u o h i a l a n + v u o h i e l ä i n t e n + v u o h i e n + v u o k k o k a l a + v u o k r a a m i s e s t a + v u o k r a i s ä n t i e n + v u o k r a i s ä n t ä m a l l i + v u o k r a i s ä n t ä m a l l i n + v u o k r a j ä r j e s t e l y t + v u o k r a k u l u t + v u o k r a l i n j o j a + v u o k r a l l e + v u o k r a m a j o i t u s t a + v u o k r a m a k s u i s s a + v u o k r a m a k s u j a + v u o k r a m a k s u j e n + v u o k r a m a r k k i n o i t a + v u o k r a n a n t a j i e n + v u o k r a n ä k y m ä t + v u o k r a o i k e u d e t + v u o k r a p o l i t i i k a n + v u o k r a s o p i m u k s e n + v u o k r a s o p i m u k s e t + v u o k r a s o p i m u k s i a + v u o k r a s o p i m u s + v u o k r a s o p i m u s k ä y t ä n t ö j ä + v u o k r a s o p i m u s t a + v u o k r a t a l o i s s a + v u o k r a t i l o i s t a + v u o k r a t i l o j a + v u o k r a t u k i a + v u o k r a t u l o i s t a + v u o k r a t u l o j a + v u o k r a t y ö + v u o k r a t y ö a l a a + v u o k r a t y ö d i r e k t i i v i + v u o k r a t y ö d i r e k t i i v i i n + v u o k r a t y ö d i r e k t i i v i ä + v u o k r a t y ö h ö n + v u o k r a t y ö l l ä + v u o k r a t y ö n + v u o k r a t y ö n t e k i j ä + v u o k r a t y ö n t e k i j ä d i r e k t i i v i + v u o k r a t y ö n t e k i j ä n + v u o k r a t y ö n t e k i j ä s t ä + v u o k r a t y ö n t e k i j ä t + v u o k r a t y ö n t e k i j ä ä + v u o k r a t y ö n t e k i j ä ä n + v u o k r a t y ö n t e k i j ö i d e n + v u o k r a t y ö n t e k i j ö i d e n s ä + v u o k r a t y ö n t e k i j ö i k s i + v u o k r a t y ö n t e k i j ö i l l e + v u o k r a t y ö n t e k i j ö i l l ä + v u o k r a t y ö n t e k i j ö i l t ä + v u o k r a t y ö n t e k i j ö i s t ä + v u o k r a t y ö n t e k i j ö i t ä + v u o k r a t y ö n t e o n + v u o k r a t y ö s t ä + v u o k r a t y ö s u h t e i s i i n + v u o k r a t y ö t e k i j ö i l l e + v u o k r a t y ö t o i m i s t o n + v u o k r a t y ö t ä + v u o k r a t y ö v o i m a + v u o k r a t y ö v o i m a a + v u o k r a t y ö v o i m a a n + v u o k r a t y ö v o i m a l l a + v u o k r a t y ö v o i m a n + v u o k r a u s j ä r j e s t e l y i d e n + v u o k r a u s y h t i ö n + v u o k r a u s y r i t y k s i l l e + v u o k r a u s y r i t y k s i ä + v u o k r a u s y r i t y s t e n + v u o k r a v i l j e l i j ö i d e n + v u o k r a v i l j e l i j ö i n ä + v u o k r a v ä l i t y s f i r m a t + v u o k r i a + v u o k s i k s i + v u o l l e j o k i s i m p u k k a + v u o n a n k a a l i + v u o n n a k i n + v u o n o h e v o n e n + v u o n o p i n g v i i n i + v u o p a l a n + v u o r e n h u i p p u + v u o r e n h u i p u n + v u o r e n v a r m a + v u o r e n v a r m a n a + v u o r i a l u e e t + v u o r i a l u e i l l a + v u o r i b u l b u l i + v u o r i g o r i l l a + v u o r i g o r i l l o j a + v u o r i h i i r i h a u k k a + v u o r i j a l a v a + v u o r i j o n o i s t a + v u o r i j u m a l t e n k u k k a + v u o r i k a i j a n e n + v u o r i k a l a h u u h k a j a + v u o r i k a s k a s + v u o r i k a u n o k k i + v u o r i k a u r i s + v u o r i k e l t a k e r t t u + v u o r i k e l t a k i r v i n e n + v u o r i k e n g u r u + v u o r i k e r t t u l i + v u o r i k e t s a a l i + v u o r i k i i p e i l y s t ä + v u o r i k i i p e i l y s t ä ä n + v u o r i k i i p e i l y t a i d o i s t a n i + v u o r i k i p u a j a + v u o r i k i r j o m o n a r k k i + v u o r i k i r j o t i k k a + v u o r i k i r v i n e n + v u o r i k i s s a + v u o r i k o l l e g i o + v u o r i k o t k a + v u o r i k u i s m a + v u o r i k u r p p a + v u o r i k y y + v u o r i k y y h k y t + v u o r i k ä r p p ä + v u o r i l a u l u m e s i k k o + v u o r i l e p i n k ä i s t y r a n n i + v u o r i l l a + v u o r i l l e + v u o r i l o i k k o + v u o r i l o i s t o t i m a l i + v u o r i m a a t i m a l i + v u o r i m a j a v a + v u o r i m a r j a s t a j a + v u o r i m a t k i j a + v u o r i m e t s ä k e r t t u n e n + v u o r i m e t s ä p ö l l ö n e n + v u o r i m u n k k i + v u o r i m ä n t y + v u o r i p a r a t i i s i l i n t u + v u o r i p e i p o t + v u o r i p i s t i n k o l i b r i + v u o r i p ö l l ö n e n + v u o r i r a i t a k a i j a + v u o r i r e v o n p a p u + v u o r i s a p e l i k o l i b r i + v u o r i s e e p r a + v u o r i s i e p p o k e r t t u + v u o r i s i l k k i k e r t t u n e n + v u o r i s i n i k k a + v u o r i s i r k k u + v u o r i s i r r i + v u o r i s m a r a g d i k o l i b r i + v u o r i s o l a n + v u o r i s o r s a + v u o r i s t a + v u o r i s t o a l u e + v u o r i s t o a l u e e l l a + v u o r i s t o a l u e e l l e + v u o r i s t o a l u e e l t a + v u o r i s t o a l u e e m m e + v u o r i s t o a l u e e t + v u o r i s t o a l u e i d e n + v u o r i s t o a l u e i l l a + v u o r i s t o a l u e i l l e + v u o r i s t o a l u e i l t a + v u o r i s t o a l u e i s i i n + v u o r i s t o a l u e i s t a + v u o r i s t o a l u e i t a + v u o r i s t o a l u e i t a m m e + v u o r i s t o a l u e p o l i t i i k a s t a + v u o r i s t o a l u e p o l i t i i k k a a + v u o r i s t o a l u e p o l i t i i k k a k i n + v u o r i s t o a l u e t t a + v u o r i s t o a l u i l l a + v u o r i s t o a r m e i j a k u n t a + v u o r i s t o d i v i s i o o n a + v u o r i s t o e k o s y s t e e m i n + v u o r i s t o e t a p i l l a + v u o r i s t o h e i m o + v u o r i s t o h e i m o o n + v u o r i s t o i s e s t a + v u o r i s t o i s i a + v u o r i s t o i s s a + v u o r i s t o i s t e n + v u o r i s t o j a + v u o r i s t o j e n + v u o r i s t o j o n o n + v u o r i s t o j u u t a l a i s e t + v u o r i s t o k a n s a + v u o r i s t o k a n s a a + v u o r i s t o k u l t t u u r i n + v u o r i s t o k u n n i s s a + v u o r i s t o k y l i s s ä ä n + v u o r i s t o k y l ä m m e + v u o r i s t o k y s y m y k s i ä + v u o r i s t o l a a k s o i s s a + v u o r i s t o l a i s k a n s a n + v u o r i s t o l i i k e n n e t t ä + v u o r i s t o l ä ä k ä r i + v u o r i s t o m a a i l m a n + v u o r i s t o m a a n v i l j e l i j ö i l l e + v u o r i s t o m a a n v i l j e l i j ö i t ä m m e + v u o r i s t o m a a t a l o u d e s s a + v u o r i s t o m a a t a l o u s + v u o r i s t o n + v u o r i s t o p e l a s t u s p a l v e l u + v u o r i s t o p o l i t i i k a n + v u o r i s t o p o l k u j a + v u o r i s t o r a d a l l a + v u o r i s t o r a t a + v u o r i s t o s a i r a a l a + v u o r i s t o s e u d u i l l a + v u o r i s t o s e u d u i l l e + v u o r i s t o s e u d u i s t a + v u o r i s t o s e u d u l l a + v u o r i s t o s e u d u n + v u o r i s t o s e u d u t + v u o r i s t o s e u t u i h i n + v u o r i s t o s e u t u j a + v u o r i s t o s e u t u j e n + v u o r i s t o s s a + v u o r i s t o t a s a v a l l a n + v u o r i s t o t a s a v a l t a + v u o r i s t o t a u t i + v u o r i s t o v e t u r i t + v u o r i s t o v i l j e l i j ä t + v u o r i s t o v ä e s t ö ö n + v u o r i s t o y h t e i s ö t + v u o r i t a l e k a n a + v u o r i t a m m i + v u o r i t a p i i r i + v u o r i t a s k u + v u o r i t i l t a l t t i + v u o r i t r o g o n i + v u o r i t y y p e i s t ä + v u o r i t ö p ö k e r t t u n e n + v u o r i u u n i l i n t u + v u o r i v a a h t e r a + v u o r i v e r t a u s t a + v u o r i v i i d a k k o h a u k k a + v u o r i v i i r i k a i j a + v u o r i v i i r u b u l b u l i + v u o r i v i i r u m e s i k k o + v u o r i v i l l a a + v u o r o a + v u o r o a a n + v u o r o i n + v u o r o j a + v u o r o k a u d e k s i + v u o r o k a u d e n + v u o r o k a u d e n a i k a a n + v u o r o k a u d e n a j a n + v u o r o k a u s i + v u o r o k a u s i r y t m i e n + v u o r o k a u t t a + v u o r o k a u t t a k a a n + v u o r o k ä y t t ö ö n + v u o r o l i i k e n n e p a l v e l u a + v u o r o l l a a n + v u o r o m m e + v u o r o p u h e l u + v u o r o p u h e l u a + v u o r o p u h e l u a a n + v u o r o p u h e l u a j a t u k s e s t a + v u o r o p u h e l u a m m e + v u o r o p u h e l u a r e e n a a n + v u o r o p u h e l u f o o r u m e j a + v u o r o p u h e l u f o o r u m i e m m e + v u o r o p u h e l u f o o r u m i s t a + v u o r o p u h e l u h a l u k k u u s + v u o r o p u h e l u i d e n + v u o r o p u h e l u i h i n + v u o r o p u h e l u i s t a + v u o r o p u h e l u j a + v u o r o p u h e l u j e n + v u o r o p u h e l u k a n a v a n + v u o r o p u h e l u k a n a v i a + v u o r o p u h e l u k a n a v i e n + v u o r o p u h e l u k i e r r o s + v u o r o p u h e l u k o k o u k s i s s a + v u o r o p u h e l u k s i + v u o r o p u h e l u k u l t t u u r i + v u o r o p u h e l u k u m p p a n e i d e m m e + v u o r o p u h e l u k u m p p a n e i t a + v u o r o p u h e l u k u m p p a n i + v u o r o p u h e l u k u m p p a n i m m e + v u o r o p u h e l u k u m p p a n i n s a + v u o r o p u h e l u l l a + v u o r o p u h e l u l l e + v u o r o p u h e l u m a h d o l l i s u u t t a + v u o r o p u h e l u m a l l i + v u o r o p u h e l u m e k a n i s m e j a + v u o r o p u h e l u m e k a n i s m i n + v u o r o p u h e l u m e n e t e l m ä n + v u o r o p u h e l u m e n e t e l m ä ä + v u o r o p u h e l u m e n e t t e l y + v u o r o p u h e l u m e n e t t e l y n + v u o r o p u h e l u m e n e t t e l y ä + v u o r o p u h e l u m m e + v u o r o p u h e l u m u o t o j e n + v u o r o p u h e l u n + v u o r o p u h e l u p a l k i n t o a + v u o r o p u h e l u p o l i t i i k k a + v u o r o p u h e l u p r o s e s s i + v u o r o p u h e l u p r o s e s s i a + v u o r o p u h e l u p r o s e s s i i n + v u o r o p u h e l u p r o s e s s i n + v u o r o p u h e l u p r o s e s s i s s a + v u o r o p u h e l u s s a + v u o r o p u h e l u s s a m m e + v u o r o p u h e l u s t a + v u o r o p u h e l u s t a n n e + v u o r o p u h e l u t + v u o r o p u h e l u t a i t o j a a n + v u o r o p u h e l u t a r j o u s + v u o r o p u h e l u t a v a l l a + v u o r o p u h e l u u n + v u o r o p u h e l u v a l m i u d e t + v u o r o p u h e l u v ä l i n e e t + v u o r o p u h e l u y r i t y k s e t + v u o r o s s a + v u o r o s t a a n + v u o r o t e l l e n + v u o r o t t e l u j ä r j e s t e l m ä + v u o r o t t e l u j ä r j e s t e l m ä n + v u o r o t t e l u j ä r j e s t e l m ä s t ä + v u o r o t t e l u j ä r j e s t e l m ä ä + v u o r o t t e l u j ä r j e s t e l m ä ä n + v u o r o t t e l u k o u l u t u k s e e n + v u o r o t t e l u k o u l u t u k s e n + v u o r o t t e l u k o u l u t u k s e s s a + v u o r o t t e l u k o u l u t u s + v u o r o t t e l u k o u l u t u s j a k s o j a + v u o r o t t e l u k o u l u t u s t a + v u o r o t t e l u k o u l u t u s t o i m i a + v u o r o t t e l u p e r i a a t e + v u o r o t t e l u p e r i a a t t e e s e e n + v u o r o t t e l u s t a + v u o r o t t e l u v a p a a + v u o r o t y ö + v u o r o t y ö k o r v a u k s i l l e + v u o r o t y ö l l ä + v u o r o t y ö n + v u o r o t y ö t + v u o r o t y ö t ä + v u o r o v a i k u t t e i s e m p a a + v u o r o v a i k u t t e i s e m p i + v u o r o v a i k u t t e i s t a + v u o r o v a i k u t u k s e e n + v u o r o v a i k u t u k s e l l a + v u o r o v a i k u t u k s e s s a + v u o r o v a i k u t u s m a h d o l l i s u u k s i e n + v u o r o v a i k u t u s m e n e t t e l y i h i n + v u o r o v a i k u t u s s u h d e + v u o r o v a i k u t u s s u h t e e n + v u o r o v a i k u t u s t a + v u o r o v a i k u t u s v a l m i u t t a a n + v u o r o v e d e n + v u o r o v e d e t + v u o r o v e s i e n e r g i a + v u o r o v e s i e n e r g i a v a r o i s t a + v u o r o v e s i m y l l y + v u o r o v e s i p a t o + v u o r o v e s i p a t o i h i n + v u o r o v e s i p o r r a s + v u o r o v e s i t e k n o l o g i a n + v u o r o v e s i v a r a n n o t + v u o r o v e s i v o i m a l o i d e n + v u o r o v e s i v ä y l i l l ä + v u o r o v i l j e l y + v u o r o v i l j e l y n + v u o r o v i l j e l y s s ä + v u o r o v i l j e l y s t ä + v u o r o v i l j e l y t u k e a + v u o r o v i l j e l y y n + v u o r o v i l j e l y ä + v u o s a a r i + v u o s i a + v u o s i a r v i o i n t i k e r t o m u k s i a + v u o s i b u d j e t e i s t a a n + v u o s i b u d j e t i l l a + v u o s i b u d j e t i n + v u o s i b u d j e t i s t a + v u o s i b u d j e t i t + v u o s i b u d j e t t i + v u o s i b u d j e t t i a + v u o s i b u d j e t t i i n + v u o s i e n + v u o s i e n k a a n + v u o s i e n k i n + v u o s i e n s a + v u o s i e r ä t + v u o s i f o o r u m i + v u o s i f o o r u m i i n + v u o s i h i n t a + v u o s i j a k s o l l a + v u o s i k a s v u + v u o s i k a s v u s t a + v u o s i k a s v u u n + v u o s i k a t s a s t u k s i l l a + v u o s i k a t s a u k s e n + v u o s i k a t s a u k s e s t a + v u o s i k a t s a u k s i a + v u o s i k a t s a u k s i s t a + v u o s i k a t s a u s + v u o s i k a t s a u s t a + v u o s i k a u d e t + v u o s i k a u s i a + v u o s i k a u s i e n + v u o s i k a u s i i n + v u o s i k a u s i k s i + v u o s i k e r t a v i i n i n + v u o s i k e r t o m u k s e e m m e + v u o s i k e r t o m u k s e e n + v u o s i k e r t o m u k s e e n s a + v u o s i k e r t o m u k s e l l a + v u o s i k e r t o m u k s e l l e + v u o s i k e r t o m u k s e m m e + v u o s i k e r t o m u k s e n + v u o s i k e r t o m u k s e n a + v u o s i k e r t o m u k s e n i + v u o s i k e r t o m u k s e n n e + v u o s i k e r t o m u k s e n s a + v u o s i k e r t o m u k s e s s a + v u o s i k e r t o m u k s e s s a a n + v u o s i k e r t o m u k s e s s a n i + v u o s i k e r t o m u k s e s t a + v u o s i k e r t o m u k s e s t a a n + v u o s i k e r t o m u k s e s t a m m e + v u o s i k e r t o m u k s e s t a n i + v u o s i k e r t o m u k s e t + v u o s i k e r t o m u k s i a + v u o s i k e r t o m u k s i a a n + v u o s i k e r t o m u k s i i n + v u o s i k e r t o m u k s i l l a + v u o s i k e r t o m u k s i s s a + v u o s i k e r t o m u k s i s s a a n + v u o s i k e r t o m u k s i s t a + v u o s i k e r t o m u s + v u o s i k e r t o m u s t a + v u o s i k e r t o m u s t a a n + v u o s i k e r t o m u s t a m m e + v u o s i k e r t o m u s t e m m e + v u o s i k e r t o m u s t e n + v u o s i k e r t o m u s t e n s a + v u o s i k e s k i a r v o a + v u o s i k e s k i a r v o n a + v u o s i k e s k i m ä ä r ä n + v u o s i k e s k u s t e l u + v u o s i k e s k u s t e l u a + v u o s i k e s k u s t e l u a m m e + v u o s i k i i n t i ö k s i + v u o s i k i i n t i ö ö n + v u o s i k i r j a a + v u o s i k o k o u k s e e n + v u o s i k o k o u k s e n + v u o s i k o k o u k s e n s a + v u o s i k o k o u k s e s s a + v u o s i k o k o u k s e s s a a n + v u o s i k o k o u k s i a + v u o s i k o k o u k s i s s a + v u o s i k o k o u s + v u o s i k o k o u s t a + v u o s i k o k o u s t a a n + v u o s i k o k o u s t e n + v u o s i k o l m a n n e k s e n + v u o s i k o r k o + v u o s i k o r k o a + v u o s i k o r o n + v u o s i k o r o t u k s e n + v u o s i k s i + v u o s i k u l u t u s + v u o s i k u s t a n n u k s e t + v u o s i k u s t a n n u k s i l l a + v u o s i k y m m e n e e n + v u o s i k y m m e n e k s i + v u o s i k y m m e n e l l ä + v u o s i k y m m e n e n + v u o s i k y m m e n e n ä + v u o s i k y m m e n i e n + v u o s i k y m m e n i i n + v u o s i k y m m e n i k s i + v u o s i k y m m e n i n ä + v u o s i k y m m e n i n ä k i n + v u o s i k y m m e n i ä + v u o s i k y m m e n o h j e l m a a n + v u o s i k y m m e n t e n + v u o s i l l e + v u o s i l o m a + v u o s i l o m a a + v u o s i l o m a n + v u o s i l o m a t + v u o s i l o m i e n + v u o s i l o m i s t a + v u o s i l t a + v u o s i l u o k a n + v u o s i l u v u i s t a + v u o s i l ä m p ö t i l a l l a + v u o s i m a k s u + v u o s i m a k s u i h i n + v u o s i m a k s u n + v u o s i m a r g i n a a l i n + v u o s i m e n o t + v u o s i m u u t t o o n + v u o s i m ä ä r ä + v u o s i n a + v u o s i n e l j ä n n e k s e l l ä + v u o s i n e l j ä n n e k s e l t ä + v u o s i n e l j ä n n e k s e n + v u o s i n e l j ä n n e k s i t t ä i n + v u o s i o h j e l m a + v u o s i o h j e l m a a + v u o s i o h j e l m a n + v u o s i o h j e l m a s s a + v u o s i o h j e l m a s t a + v u o s i o h j e l m i a + v u o s i o h j e l m i e n + v u o s i o h j e l m i i n + v u o s i o h j e l m i s s a + v u o s i p a l k a n + v u o s i p u o l i s k o + v u o s i p u o l i s k o a + v u o s i p u o l i s k o l l a + v u o s i p u o l i s k o n + v u o s i p ä i v i s t ä + v u o s i p ä i v i ä + v u o s i p ä i v ä + v u o s i p ä i v ä j u h l a l l i s u u k s i a + v u o s i p ä i v ä j u h l i s s a + v u o s i p ä i v ä n + v u o s i p ä i v ä n ä + v u o s i p ä i v ä ä + v u o s i r a p o r t e i s s a a n + v u o s i r a p o r t i n + v u o s i r a p o r t i s s a + v u o s i r a p o r t i s s a a n + v u o s i r a p o r t i t + v u o s i r a p o r t t e i h i n + v u o s i r a p o r t t e j a + v u o s i r a p o r t t i + v u o s i r a p o r t t i a + v u o s i r a p o r t t i e n + v u o s i r a p o r t t i n s a + v u o s i s a d a l l a + v u o s i s a d a l l a k i n + v u o s i s a d a l l a m m e + v u o s i s a d a l l e + v u o s i s a d a n + v u o s i s a t a + v u o s i s a t a a + v u o s i s a t a a n + v u o s i s a t a i s e l l a + v u o s i s a t a i s e t + v u o s i s a t a i s t a + v u o s i s a t a m m e + v u o s i s a t o j a + v u o s i s a t o j e n + v u o s i s s a + v u o s i s t a + v u o s i s u u n n i t e l m a a n + v u o s i s u u n n i t e l m a s s a + v u o s i s u u n n i t e l m a s t a + v u o s i s u u n n i t e l m i s t a + v u o s i t a p p i o + v u o s i t a r k a s t u k s e n + v u o s i t a r k a s t u s + v u o s i t a s e + v u o s i t a s o j e n + v u o s i t a s o l l a + v u o s i t a v o i t t e e n s a + v u o s i t i e d o t + v u o s i t i l i n p ä ä t ö k s e s s ä + v u o s i t i l i n p ä ä t ö s t e n + v u o s i t t a i s e e n + v u o s i t t a i s e k s i + v u o s i t t a i s e l l a + v u o s i t t a i s e n + v u o s i t t a i s e s s a + v u o s i t t a i s e s t a + v u o s i t t a i s e t + v u o s i t t a i s i a + v u o s i t t a i s i k s i + v u o s i t t a i s i s s a + v u o s i t t a i s i s t a + v u o s i t t a i s t a + v u o s i t t a i s t e n + v u o s i t u h a n n e l l a + v u o s i t u h a n n e l l e + v u o s i t u h a n n e n + v u o s i t u h a n n e s t a + v u o s i t u h a n s i a + v u o s i t u h a n s i e n + v u o s i t u h a t j u l i s t u k s e e n + v u o s i t u h a t j u l i s t u k s e n + v u o s i t u h a t j u l i s t u k s e s s a + v u o s i t u h a t j u l i s t u s + v u o s i t u h a t t a + v u o s i t u h a t t a v o i t e + v u o s i t u h a t t a v o i t e s o p i m u k s e k s i + v u o s i t u h a t t a v o i t e s o p i m u k s e l l a + v u o s i t u h a t t a v o i t e s o p i m u k s i a + v u o s i t u h a t t a v o i t e s o p i m u k s i s s a + v u o s i t u h a t t a v o i t e s o p i m u k s i s t a + v u o s i t u h a t t a v o i t e s o p i m u s + v u o s i t u h a t t a v o i t e s o p i m u s t e n + v u o s i t u h a t t a v o i t e t t a + v u o s i t u h a t t a v o i t t e e n + v u o s i t u h a t t a v o i t t e e n a + v u o s i t u h a t t a v o i t t e e t + v u o s i t u h a t t a v o i t t e i d e n + v u o s i t u h a t t a v o i t t e i k s i + v u o s i t u h a t t a v o i t t e i l l e + v u o s i t u h a t t a v o i t t e i s i i n + v u o s i t u h a t t a v o i t t e i s s a + v u o s i t u h a t t a v o i t t e i s t a + v u o s i t u h a t t a v o i t t e i s t a m m e + v u o s i t u h a t t a v o i t t e i t a + v u o s i t u l o + v u o s i t u l o i s t a + v u o s i t u l o i s t a a n + v u o s i t u l o j a + v u o s i t u l o j e n + v u o s i t u l o o n + v u o s i t u l o t + v u o s i t u o t a n t o + v u o s i t u o t t o + v u o s i v a u h t i a + v u o s i v u o k r a s t a + v u o t a m i t t a r i + v u o t a n e e t + v u o t a n u t + v u o t a v a a + v u o t e e n + v u o t e m m e + v u o t e n a + v u o t i a a l l a + v u o t i a a l l e + v u o t i a a l t a + v u o t i a a n + v u o t i a a n a + v u o t i a a s t a + v u o t i a a t + v u o t i a i d e n + v u o t i a i k s i + v u o t i a i l l a + v u o t i a i l l e + v u o t i a i s t a + v u o t i a i t a + v u o t i a s t a + v u o t o j a + v u o t o k o h t i a + v u o t t a + v u o t u i s e e n + v u o t u i s e l l a + v u o t u i s e l l e + v u o t u i s e n + v u o t u i s e s s a + v u o t u i s e s t a + v u o t u i s e t + v u o t u i s i s t a + v u o t u i s k i e r t o + v y ö e r a k k o k o l i b r i + v y ö h y k e j a k o a + v y ö h y k e j ä r j e s t e l m ä + v y ö h y k e j ä r j e s t e l m ä ä + v y ö h y k e m a l l i a + v y ö h y k k e e l l e + v y ö h y k k e e l l ä + v y ö h y k k e e n + v y ö h y k k e e t + v y ö h y k k e i d e n + v y ö j u n k k e r i + v y ö k e l t a y ö k k ö n e n + v y ö k i i l t o y ö k k ö n e n + v y ö k i r j o a h v e n + v y ö k o l i b r i + v y ö k o t i n g a + v y ö l a u k k u + v y ö l i i t o s + v y ö m e s i k k o + v y ö m e s s i n k i y ö k k ö n e n + v y ö o n g e l m a + v y ö p i t k ä j a l k a + v y ö r u u s u + v y ö r y i v ä t + v y ö r y n + v y ö r y p i l v i + v y ö r y v ä ä + v y ö r ö y h e l ö m o n a r k k i + v y ö s i r k k u + v y ö t i a i s k e r t t u + v y ö t ä m m e + v y ö t ä r ö l i h a v u u d e n + v y ö t ä r ö n y m p ä r y k s e s t ä + v y ö t ä r ö n y m p ä r y s + v ä e k k ä i m m i l l e + v ä e s t ö e n n u s t e e t + v ä e s t ö e r o j a + v ä e s t ö f o o r u m i + v ä e s t ö f o o r u m i t + v ä e s t ö h a a s t e e s e e n + v ä e s t ö h a a s t e e s t a + v ä e s t ö h a a s t e i s t a + v ä e s t ö i l l e + v ä e s t ö j e m m e + v ä e s t ö j e n + v ä e s t ö j ä n n i t t e e n + v ä e s t ö k a d o s t a + v ä e s t ö k a r t t a a + v ä e s t ö k a r t t a a m m e + v ä e s t ö k a s v u + v ä e s t ö k a s v u n + v ä e s t ö k a t a s t r o f i + v ä e s t ö k a t a s t r o f i i n + v ä e s t ö k a t a s t r o f i n + v ä e s t ö k a t o + v ä e s t ö k a t o a l u e i d e n + v ä e s t ö k a t o o n + v ä e s t ö k e h i t y k s e e n + v ä e s t ö k e h i t y k s e m m e + v ä e s t ö k e h i t y k s e n + v ä e s t ö k e h i t y k s e s t ä + v ä e s t ö k e h i t y s + v ä e s t ö k e h i t y s f o o r u m e i d e n + v ä e s t ö k e h i t y s f o o r u m i + v ä e s t ö k e h i t y s f o o r u m i a + v ä e s t ö k e h i t y s f o o r u m i s s a + v ä e s t ö k e h i t y s f o o r u m i t + v ä e s t ö k e h i t y s h a a s t e i s t a + v ä e s t ö k e h i t y s t i l a n t e e s t a + v ä e s t ö k e h i t y s t ä + v ä e s t ö k e r t o m u k s i a + v ä e s t ö k e s k i t t y m i i n + v ä e s t ö k e s k i t t y m ä + v ä e s t ö k e s k u k s i i n + v ä e s t ö k e s k u k s i s s a + v ä e s t ö k e s k u k s i s t a + v ä e s t ö k e s k u s t e n + v ä e s t ö k i r j a n p i t o a + v ä e s t ö k o k o o n p a n o a + v ä e s t ö k r i i s i + v ä e s t ö k r i i s i i n + v ä e s t ö k r i i s i n + v ä e s t ö k r i i s i s t ä + v ä e s t ö k r i i s i ä + v ä e s t ö k r i t e e r i ä + v ä e s t ö k y s y m y k s e n + v ä e s t ö k y s y m y k s e t + v ä e s t ö k y s y m y k s i s t ä + v ä e s t ö k y s y m y k s i ä + v ä e s t ö k y s y m y s + v ä e s t ö l a s k e l m a t + v ä e s t ö l a s k e l m i a + v ä e s t ö l a s k e n n a n + v ä e s t ö l a s k e n n a s s a + v ä e s t ö l a s k e n n o i s t a + v ä e s t ö l a s k e n t a a + v ä e s t ö l a s k e n t a t a v a t + v ä e s t ö l a s k e n t o j e n + v ä e s t ö l i i k k e e n + v ä e s t ö l i i k k e e t + v ä e s t ö l i i k k e i d e n + v ä e s t ö l l e + v ä e s t ö l l ä + v ä e s t ö l t ä + v ä e s t ö l t ä ä n + v ä e s t ö l u k u j e n + v ä e s t ö l u k u j e n s a + v ä e s t ö m a a n t i e d e + v ä e s t ö m a s s a + v ä e s t ö m i n i s t e r i + v ä e s t ö m u u t o k s e e n + v ä e s t ö m u u t o k s e n + v ä e s t ö m u u t o k s e t + v ä e s t ö m u u t o k s i a + v ä e s t ö m u u t o k s i s t a + v ä e s t ö m u u t o s + v ä e s t ö m u u t o s t e n + v ä e s t ö m ä ä r i e n + v ä e s t ö m ä ä r i ä + v ä e s t ö m ä ä r ä + v ä e s t ö m ä ä r ä l t ä ä n + v ä e s t ö m ä ä r ä n + v ä e s t ö m ä ä r ä n s ä + v ä e s t ö m ä ä r ä s t ä + v ä e s t ö m ä ä r ä t + v ä e s t ö m ä ä r ä ä + v ä e s t ö m ä ä r ä ä n + v ä e s t ö n + v ä e s t ö n k a s v u + v ä e s t ö n k a s v u a + v ä e s t ö n k a s v u a s t e e n + v ä e s t ö n k a s v u l l a + v ä e s t ö n k a s v u n + v ä e s t ö n k a s v u s t a + v ä e s t ö n k a s v u u n + v ä e s t ö n k e h i t y k s e e n + v ä e s t ö n k e h i t y k s e m m e + v ä e s t ö n k e h i t y k s e n + v ä e s t ö n k e h i t y k s e s s ä + v ä e s t ö n k e h i t y k s e s t ä + v ä e s t ö n k e h i t y s + v ä e s t ö n k e h i t y s e n n u s t e i d e n + v ä e s t ö n k e h i t y s h a a s t e e n + v ä e s t ö n k e h i t y s h a a s t e e s e e n + v ä e s t ö n k e h i t y s h a a s t e i d e n + v ä e s t ö n k e h i t y s k e s k u s t e l u n + v ä e s t ö n k e h i t y s k r i i s i n + v ä e s t ö n k e h i t y s k r i i s i s s ä + v ä e s t ö n k e h i t y s k r i i s i ä + v ä e s t ö n k e h i t y s k y s y m y k s i ä + v ä e s t ö n k e h i t y s k y s y m y s + v ä e s t ö n k e h i t y s m u u t o k s e e n + v ä e s t ö n k e h i t y s m u u t o k s e t + v ä e s t ö n k e h i t y s m u u t o k s i a + v ä e s t ö n k e h i t y s m u u t o k s i i n + v ä e s t ö n k e h i t y s m u u t o s + v ä e s t ö n k e h i t y s m u u t o s t e n + v ä e s t ö n k e h i t y s o n g e l m a a + v ä e s t ö n k e h i t y s o n g e l m a t + v ä e s t ö n k e h i t y s o n g e l m i e n + v ä e s t ö n k e h i t y s o n g e l m i i n + v ä e s t ö n k e h i t y s o n g e l m i s t a + v ä e s t ö n k e h i t y s p o l i t i i k a s s a + v ä e s t ö n k e h i t y s p o l i t i i k k a a + v ä e s t ö n k e h i t y s p o l i t i i k k a a n + v ä e s t ö n k e h i t y s s u u n t a u k s e t + v ä e s t ö n k e h i t y s s u u n t a u s t e n + v ä e s t ö n k e h i t y s s u u n t i a + v ä e s t ö n k e h i t y s t i l a n n e + v ä e s t ö n k e h i t y s t i l a n n e t t a + v ä e s t ö n k e h i t y s t i l a n t e e m m e + v ä e s t ö n k e h i t y s t i l a n t e e s t a + v ä e s t ö n k e h i t y s t u t k i m u k s e n + v ä e s t ö n k e h i t y s t ä + v ä e s t ö n k e h i t y s u h k a a n + v ä e s t ö n l a s k e n n a n + v ä e s t ö n l a s k e n t a j ä r j e s t e l m ä + v ä e s t ö n l a s k e n t a l u e t t e l o n + v ä e s t ö n l i i k k e e t + v ä e s t ö n l i i k k e i n ä + v ä e s t ö n l i i k k e i s t ä + v ä e s t ö n m u u t o k s e e n + v ä e s t ö n m u u t o k s e n + v ä e s t ö n m u u t o s + v ä e s t ö n o s a + v ä e s t ö n o s a a + v ä e s t ö n o s a a n + v ä e s t ö n o s a l l e + v ä e s t ö n o s a n + v ä e s t ö n o s a t + v ä e s t ö n o s i a + v ä e s t ö n o s i e n + v ä e s t ö n o s i i n + v ä e s t ö n o s i l l e + v ä e s t ö n o s i l t a + v ä e s t ö n o s i s t a + v ä e s t ö n o s u u d e n + v ä e s t ö n r y h m i i n + v ä e s t ö n r y h m i ä + v ä e s t ö n r y h m ä n + v ä e s t ö n s i i r r o t + v ä e s t ö n s u o j a + v ä e s t ö n s u o j e l u + v ä e s t ö n s u o j e l u a + v ä e s t ö n s u o j e l u a l a l l a + v ä e s t ö n s u o j e l u a s i a n t u n t i j o i d e n + v ä e s t ö n s u o j e l u e l i n + v ä e s t ö n s u o j e l u h a r j o i t u k s e n + v ä e s t ö n s u o j e l u h a r j o i t u k s e s s a + v ä e s t ö n s u o j e l u h a r j o i t u k s i e n + v ä e s t ö n s u o j e l u j o u k k o j a + v ä e s t ö n s u o j e l u j o u k k o j e n + v ä e s t ö n s u o j e l u j o u k o i l l e + v ä e s t ö n s u o j e l u j o u k o t + v ä e s t ö n s u o j e l u j ä r j e s t e l m i s s ä + v ä e s t ö n s u o j e l u j ä r j e s t e l m ä n s ä + v ä e s t ö n s u o j e l u j ä r j e s t e l y j e n + v ä e s t ö n s u o j e l u k a p a s i t e e t t i a + v ä e s t ö n s u o j e l u k r i i s e i h i n + v ä e s t ö n s u o j e l u m e k a n i s m i + v ä e s t ö n s u o j e l u m e k a n i s m i t + v ä e s t ö n s u o j e l u n + v ä e s t ö n s u o j e l u o h j e l m a + v ä e s t ö n s u o j e l u p a l v e l u i s t a + v ä e s t ö n s u o j e l u p a l v e l u t + v ä e s t ö n s u o j e l u r y h m i e n + v ä e s t ö n s u o j e l u r y h m i l l e + v ä e s t ö n s u o j e l u s s a + v ä e s t ö n s u o j e l u s t a + v ä e s t ö n s u o j e l u t e h t ä v i i n + v ä e s t ö n s u o j e l u t o i m e t + v ä e s t ö n s u o j e l u t o i m i a + v ä e s t ö n s u o j e l u t o i m i e n + v ä e s t ö n s u o j e l u u n + v ä e s t ö n s u o j e l u v a l m i u k s i e m m e + v ä e s t ö n s u o j e l u v i r a n o m a i s t e n + v ä e s t ö n s u o j e l u v i r a s t o n + v ä e s t ö n s u o j e l u v o i m a v a r o j e n + v ä e s t ö n s u o j e l u v ä l i n e i s i i n + v ä e s t ö n s u o j e l u y h t e i s t y ö + v ä e s t ö n s u o j e l u y h t e i s ö ä + v ä e s t ö n s u o j e l u y k s i k k ö + v ä e s t ö n s ä + v ä e s t ö n t i h e y d e l t ä ä n + v ä e s t ö n t i h e y d e n + v ä e s t ö n t i h e y s + v ä e s t ö n t i h e y t e e n + v ä e s t ö n t i h e y t t ä + v ä e s t ö n v a i h d o n + v ä e s t ö o h j e l m a + v ä e s t ö o h j e l m a r a h a s t o + v ä e s t ö o h j e l m a t + v ä e s t ö o h j e l m i a + v ä e s t ö o h j e l m i i n + v ä e s t ö o l o j e n + v ä e s t ö o n g e l m a + v ä e s t ö o n g e l m a a + v ä e s t ö o n g e l m a l l a + v ä e s t ö o n g e l m a n + v ä e s t ö o n g e l m a t + v ä e s t ö o n g e l m i a + v ä e s t ö o s u u s + v ä e s t ö o t a n n a n + v ä e s t ö p a i n e e n + v ä e s t ö p a i n e e s e e n + v ä e s t ö p a i n e e s t a + v ä e s t ö p a i n e e t + v ä e s t ö p a i n e t t a + v ä e s t ö p o h j a + v ä e s t ö p o h j a i s i l l e + v ä e s t ö p o h j a n + v ä e s t ö p o l i i t t i s e s s a + v ä e s t ö p o l i i t t i s i a + v ä e s t ö p o l i t i i k a n + v ä e s t ö p o l i t i i k a s s a + v ä e s t ö p o l i t i i k a s t a + v ä e s t ö p o l i t i i k k a + v ä e s t ö p o l i t i i k k a a + v ä e s t ö p o l i t i i k k a a n + v ä e s t ö p o l i t i i k o i l l e + v ä e s t ö p o t e n t i a a l i a m m e + v ä e s t ö p o t e n t i a a l i i n + v ä e s t ö p r o f i i l i n s a + v ä e s t ö p y r a m i d i + v ä e s t ö p y r a m i d i a + v ä e s t ö p y r a m i d i n + v ä e s t ö p y r a m i d i s s a + v ä e s t ö p y r a m i d i t + v ä e s t ö p ä i v ä + v ä e s t ö r a h a s t o + v ä e s t ö r a h a s t o n + v ä e s t ö r a j a + v ä e s t ö r a k e n n e + v ä e s t ö r a k e n n e k e s k u s t e l u s s a + v ä e s t ö r a k e n n e k r i i s i m m e + v ä e s t ö r a k e n n e k r i i s i n + v ä e s t ö r a k e n n e o n g e l m a + v ä e s t ö r a k e n n e o n g e l m a t + v ä e s t ö r a k e n n e p o l i t i i k k a + v ä e s t ö r a k e n n e t t a + v ä e s t ö r a k e n t e e l l i s e s t i + v ä e s t ö r a k e n t e e m m e + v ä e s t ö r a k e n t e e n + v ä e s t ö r a k e n t e e s e e n + v ä e s t ö r a k e n t e e t + v ä e s t ö r a k e n t e i s i i n + v ä e s t ö r a p o r t e i s s a + v ä e s t ö r a p o r t i s t a + v ä e s t ö r a p o r t t i + v ä e s t ö r a p o r t t i a + v ä e s t ö r e k i s t e r i + v ä e s t ö r e k i s t e r i a s i a k i r j o j e n + v ä e s t ö r e k i s t e r i i n + v ä e s t ö r e k i s t e r i k e s k u s + v ä e s t ö r e k i s t e r i s s ä + v ä e s t ö r e k i s t e r i s t ä + v ä e s t ö r e k i s t e r i v i r a n o m a i s e l l e + v ä e s t ö r i k k a i m p i e n + v ä e s t ö r o m a h d u s + v ä e s t ö r y h m i e n + v ä e s t ö r y h m i i n + v ä e s t ö r y h m i l l e + v ä e s t ö r y h m i s s ä + v ä e s t ö r y h m i s t ä + v ä e s t ö r y h m i ä + v ä e s t ö r y h m ä + v ä e s t ö r y h m ä l l e + v ä e s t ö r y h m ä n + v ä e s t ö r y h m ä s t ä + v ä e s t ö r y h m ä t + v ä e s t ö r y h m ä ä n + v ä e s t ö r ä j ä h d y s + v ä e s t ö s s ä + v ä e s t ö s t ä + v ä e s t ö s u u n n i t t e l u n + v ä e s t ö s u u n t a u s + v ä e s t ö s y i s t ä + v ä e s t ö t + v ä e s t ö t a l o u d e k s i + v ä e s t ö t a l o u t t a + v ä e s t ö t a s a p a i n o a + v ä e s t ö t a s a p a i n o n + v ä e s t ö t e k i j ä t + v ä e s t ö t e k i j ö i d e n + v ä e s t ö t i e d o t + v ä e s t ö t i e t e e l l i n e n + v ä e s t ö t i e t e e l l i s i ä + v ä e s t ö t i e t e e l l i s t ä + v ä e s t ö t i e t e i l i j ä t + v ä e s t ö t i e t o j a m m e + v ä e s t ö t i e t o j e n + v ä e s t ö t i h e y d e l t ä ä n + v ä e s t ö t i h e y d e n + v ä e s t ö t i h e y s + v ä e s t ö t i l a n n e + v ä e s t ö t i l a n n e o n g e l m a + v ä e s t ö t i l a n n e t t a + v ä e s t ö t i l a n t e e m m e + v ä e s t ö t i l a n t e e n + v ä e s t ö t i l a n t e e n s a + v ä e s t ö t i l a n t e e s e e n + v ä e s t ö t i l a n t e e s t a + v ä e s t ö t i l a n t e i t a + v ä e s t ö t i l a s t o i h i n + v ä e s t ö t i l a s t o j e n + v ä e s t ö t u t k i m u k s e s t a + v ä e s t ö t u t k i m u s t a + v ä e s t ö t y y p p i s e t + v ä e s t ö v a i k u t u k s i s t a + v ä e s t ö v a j e t t a + v ä e s t ö ä + v ä e s t ö ä ä n + v ä e s t ö ö n + v ä h e k s y i s i m m e + v ä h e k s y i t t e + v ä h e k s y m ä t t ä + v ä h e k s y t ä ä n + v ä h e k s y ä + v ä h e m m i l l ä + v ä h e m m i s t ö a l u e i t a + v ä h e m m i s t ö a s e m a a + v ä h e m m i s t ö a s e m a s s a + v ä h e m m i s t ö a s i a t + v ä h e m m i s t ö a s i o i s t a + v ä h e m m i s t ö a s i o i t a + v ä h e m m i s t ö d i k t a t u u r e j a + v ä h e m m i s t ö d i k t a t u u r i a + v ä h e m m i s t ö h a l l i n n o k s i + v ä h e m m i s t ö h a l l i n t o a + v ä h e m m i s t ö h a l l i t u s + v ä h e m m i s t ö h a l l i t u s t a + v ä h e m m i s t ö h e i m o + v ä h e m m i s t ö i d e n t i t e e t t i e n + v ä h e m m i s t ö i h i n + v ä h e m m i s t ö i l l e + v ä h e m m i s t ö i l l ä + v ä h e m m i s t ö i s t ä + v ä h e m m i s t ö j e n + v ä h e m m i s t ö j e n s u o j e l u a s i o i s s a + v ä h e m m i s t ö j e n s ä + v ä h e m m i s t ö j ä + v ä h e m m i s t ö j ä r j e s t ö j ä + v ä h e m m i s t ö j ä ä n + v ä h e m m i s t ö k a n n a s s a a n + v ä h e m m i s t ö k a n s a a n + v ä h e m m i s t ö k a n s a l l i s u u d e t + v ä h e m m i s t ö k a n s a l l i s u u k s i i n + v ä h e m m i s t ö k a n s a s t a + v ä h e m m i s t ö k a n s a t + v ä h e m m i s t ö k a n s o i l l e + v ä h e m m i s t ö k a n s o j a + v ä h e m m i s t ö k a n s o j a a n + v ä h e m m i s t ö k a n s o j e n + v ä h e m m i s t ö k a n t a + v ä h e m m i s t ö k a n t a a n + v ä h e m m i s t ö k a n t o j e n + v ä h e m m i s t ö k i e l e k s i + v ä h e m m i s t ö k i e l e l l ä + v ä h e m m i s t ö k i e l e m m e + v ä h e m m i s t ö k i e l e n + v ä h e m m i s t ö k i e l e n ä + v ä h e m m i s t ö k i e l e s t ä + v ä h e m m i s t ö k i e l e t + v ä h e m m i s t ö k i e l i + v ä h e m m i s t ö k i e l i e n + v ä h e m m i s t ö k i e l i i n + v ä h e m m i s t ö k i e l i l l e + v ä h e m m i s t ö k i e l i l l ä + v ä h e m m i s t ö k i e l i s e n + v ä h e m m i s t ö k i e l i s e t + v ä h e m m i s t ö k i e l i s i l l e + v ä h e m m i s t ö k i e l i s i ä + v ä h e m m i s t ö k i e l i s t ä + v ä h e m m i s t ö k i e l i y h t e i s ö j ä + v ä h e m m i s t ö k i e l i ä + v ä h e m m i s t ö k i e l t e m m e + v ä h e m m i s t ö k i e l t e n + v ä h e m m i s t ö k i e l t ä + v ä h e m m i s t ö k i r k k o j e n + v ä h e m m i s t ö k i r k o t + v ä h e m m i s t ö k o a l i t i o i h i n + v ä h e m m i s t ö k o h t a i s i i n + v ä h e m m i s t ö k o m i t e a + v ä h e m m i s t ö k s i + v ä h e m m i s t ö k u l t t u u r e i h i n + v ä h e m m i s t ö k u l t t u u r e i n e e n + v ä h e m m i s t ö k u l t t u u r e j a + v ä h e m m i s t ö k u l t t u u r e j a a n + v ä h e m m i s t ö k u l t t u u r i e n + v ä h e m m i s t ö k y s y m y k s e n + v ä h e m m i s t ö k y s y m y k s e s s ä + v ä h e m m i s t ö k y s y m y k s e s t ä + v ä h e m m i s t ö k y s y m y k s e t + v ä h e m m i s t ö k y s y m y k s i i n + v ä h e m m i s t ö k y s y m y k s i s t ä + v ä h e m m i s t ö k y s y m y k s i ä + v ä h e m m i s t ö k y s y m y s + v ä h e m m i s t ö k y s y m y s t e n + v ä h e m m i s t ö k y s y m y s t ä + v ä h e m m i s t ö l a i n + v ä h e m m i s t ö l a i n s ä ä d ä n t ö + v ä h e m m i s t ö l a k i + v ä h e m m i s t ö l a k i a + v ä h e m m i s t ö l a k i i n + v ä h e m m i s t ö m i e l i p i d e t t ä + v ä h e m m i s t ö m i e l i p i t e e n + v ä h e m m i s t ö m i n i s t e r i + v ä h e m m i s t ö m i n i s t e r i k s i + v ä h e m m i s t ö m i n i s t e r i n + v ä h e m m i s t ö m i n i s t e r i n ä + v ä h e m m i s t ö n + v ä h e m m i s t ö n e u v o s t o + v ä h e m m i s t ö n o r m e j a + v ä h e m m i s t ö n ä + v ä h e m m i s t ö n ä k e m y k s i ä + v ä h e m m i s t ö o i k e u d e t + v ä h e m m i s t ö o i k e u k s i a + v ä h e m m i s t ö o i k e u k s i a a n + v ä h e m m i s t ö o i k e u k s i e n + v ä h e m m i s t ö o i k e u k s i i n + v ä h e m m i s t ö o i k e u k s i s t a + v ä h e m m i s t ö o n g e l m a a + v ä h e m m i s t ö o n g e l m a a n + v ä h e m m i s t ö o n g e l m a m m e + v ä h e m m i s t ö o n g e l m a n + v ä h e m m i s t ö o n g e l m a t + v ä h e m m i s t ö o n g e l m i a + v ä h e m m i s t ö o n g e l m i a a n + v ä h e m m i s t ö o n g e l m i e n + v ä h e m m i s t ö o s a k k a i d e n + v ä h e m m i s t ö o s a k k a i l l e + v ä h e m m i s t ö o s a k k a i t a + v ä h e m m i s t ö o s u u d e n + v ä h e m m i s t ö p o l i t i i k a l l e + v ä h e m m i s t ö p o l i t i i k a n + v ä h e m m i s t ö p o l i t i i k a s s a + v ä h e m m i s t ö p o l i t i i k k a + v ä h e m m i s t ö p o l i t i i k k a a + v ä h e m m i s t ö p o l i t i i k k a a n + v ä h e m m i s t ö p o l i t i i k k a a n s a + v ä h e m m i s t ö p u i t e l a i n + v ä h e m m i s t ö p u i t e l a k i + v ä h e m m i s t ö p u o l u e + v ä h e m m i s t ö p u o l u e e t + v ä h e m m i s t ö p u o l u e i l l e + v ä h e m m i s t ö p u o l u e i t a + v ä h e m m i s t ö r a d i o l ä h e t y k s i ä + v ä h e m m i s t ö r i i d o i s t a + v ä h e m m i s t ö r y h m i e n + v ä h e m m i s t ö r y h m i i n + v ä h e m m i s t ö r y h m i l l e + v ä h e m m i s t ö r y h m i s s ä + v ä h e m m i s t ö r y h m i s t ä + v ä h e m m i s t ö r y h m i ä + v ä h e m m i s t ö r y h m ä + v ä h e m m i s t ö r y h m ä l l e + v ä h e m m i s t ö r y h m ä n + v ä h e m m i s t ö r y h m ä t + v ä h e m m i s t ö r y h m ä ä + v ä h e m m i s t ö r y h m ä ä n + v ä h e m m i s t ö s e p a r a t i s t i t + v ä h e m m i s t ö s o p i m u s t a + v ä h e m m i s t ö s u o j a + v ä h e m m i s t ö s ä ä n n ö k s e t + v ä h e m m i s t ö s ä ä n n ö s t ö + v ä h e m m i s t ö t + v ä h e m m i s t ö t i l a n n e t t a + v ä h e m m i s t ö u r h e i l u l a j i + v ä h e m m i s t ö u s k o n n o i l l e + v ä h e m m i s t ö u s k o n n o n + v ä h e m m i s t ö u s k o n t o j a + v ä h e m m i s t ö u s k o n t o j e n + v ä h e m m i s t ö v a i h t o e h d o t + v ä h e m m i s t ö v a l t u u t e t t u + v ä h e m m i s t ö v a l t u u t e t u n + v ä h e m m i s t ö v a s t a i s t a + v ä h e m m i s t ö v ä e s t ö n + v ä h e m m i s t ö v ä e s t ö ä + v ä h e m m i s t ö y h t e i s ö + v ä h e m m i s t ö y h t e i s ö i h i n + v ä h e m m i s t ö y h t e i s ö i l l e + v ä h e m m i s t ö y h t e i s ö i s s ä + v ä h e m m i s t ö y h t e i s ö j e n + v ä h e m m i s t ö y h t e i s ö j ä + v ä h e m m i s t ö y h t e i s ö l t ä + v ä h e m m i s t ö y h t e i s ö n + v ä h e m m i s t ö y h t e i s ö t + v ä h e m m i s t ö y s t ä v ä l l i n e n + v ä h e m m i s t ö y s t ä v ä l l i s i l l ä + v ä h e m m i s t ö ä + v ä h e m m i s t ö ö n + v ä h e m m ä l l ä + v ä h e m m ä s s ä + v ä h e m p i a r v o i s i a + v ä h e m p i a r v o i s t a + v ä h e m p i o s a i s i a + v ä h e m p i t u l o i s e t + v ä h e m p ä ä n + v ä h e n e e + v ä h e n e k ä ä n + v ä h e n e m i s e e n + v ä h e n e m i s e n + v ä h e n e m i s t ä + v ä h e n e m i s v a u h t i a + v ä h e n e m ä ä n + v ä h e n e v ä t + v ä h e n i + v ä h e n i s i + v ä h e n i s i v ä t + v ä h e n i v ä t + v ä h e n n e t t i i n + v ä h e n n e t t ä e s s ä + v ä h e n n e t t ä i s i i n + v ä h e n n e t ä ä n + v ä h e n n y k s e l l ä + v ä h e n n y k s i i n + v ä h e n n y k s i s t ä + v ä h e n n y k s i ä + v ä h e n n y s e h d o t u k s e n + v ä h e n n y s e h d o t u k s e t + v ä h e n n y s j ä r j e s t e l m ä + v ä h e n n y s j ä r j e s t e l m ä n + v ä h e n n y s k e r r o i n + v ä h e n n y s k e r r o i n t a + v ä h e n n y s k u s t a n n u s t e n + v ä h e n n y s l a s k u p e l i + v ä h e n n y s l u k u j a + v ä h e n n y s m a h d o l l i s u u d e t + v ä h e n n y s m a h d o l l i s u u t e e n + v ä h e n n y s m e k a n i s m i n + v ä h e n n y s o i k e u d e n + v ä h e n n y s o i k e u s + v ä h e n n y s o i k e u t t a + v ä h e n n y s p o l i t i i k a n + v ä h e n n y s p r o s e n t e i s t a + v ä h e n n y s s i t o u m u k s e t + v ä h e n n y s s i t o u m u k s i e m m e + v ä h e n n y s s i t o u m u k s i l l e + v ä h e n n y s s i t o u m u s t a a n + v ä h e n n y s s i t o u m u s t e n + v ä h e n n y s s t a n d a r d i t + v ä h e n n y s s u u n n i t e l m a n s a + v ä h e n n y s s ä ä n t ö j e n + v ä h e n n y s s ä ä n t ö j ä + v ä h e n n y s t a s o + v ä h e n n y s t a s o a + v ä h e n n y s t a v o i t e + v ä h e n n y s t a v o i t e t t a + v ä h e n n y s t a v o i t e t t a a n + v ä h e n n y s t a v o i t t e e k s i + v ä h e n n y s t a v o i t t e e n + v ä h e n n y s t a v o i t t e e s e e n + v ä h e n n y s t a v o i t t e e t + v ä h e n n y s t a v o i t t e i d e n + v ä h e n n y s t a v o i t t e i l l e + v ä h e n n y s t a v o i t t e i n + v ä h e n n y s t a v o i t t e i s i i n + v ä h e n n y s t a v o i t t e i s s a + v ä h e n n y s t a v o i t t e i s t a + v ä h e n n y s t a v o i t t e i t a + v ä h e n n y s t e k n i i k k a a + v ä h e n n y s t o i m e t + v ä h e n n y s t o i m i s t a + v ä h e n n y s v a i h e + v ä h e n n y s v e l v o i t t e i s t a + v ä h e n t y m i s e n + v ä h e n t y m ä s s ä + v ä h e n t y n e e t + v ä h e n t y v ä t + v ä h e n t ä e n + v ä h e n t ä e s s ä ä n + v ä h e n t ä i s i + v ä h e n t ä i s i n + v ä h e n t ä i s i v ä t + v ä h e n t ä k ä ä m m e + v ä h e n t ä m i s a i k a t a u l u a + v ä h e n t ä m i s e e n + v ä h e n t ä m i s e h d o t u s t a + v ä h e n t ä m i s e k s i + v ä h e n t ä m i s e l l e + v ä h e n t ä m i s e n + v ä h e n t ä m i s e s t ä + v ä h e n t ä m i s h a n k k e i s i i n + v ä h e n t ä m i s j ä r j e s t e l m ä + v ä h e n t ä m i s k e i n o j a + v ä h e n t ä m i s l u v u t + v ä h e n t ä m i s m a h d o l l i s u u k s i a + v ä h e n t ä m i s m e n e t e l m i e n + v ä h e n t ä m i s m e n e t e l m i i n + v ä h e n t ä m i s m e n e t e l m ä n + v ä h e n t ä m i s n o p e u s + v ä h e n t ä m i s o h j e l m a a n + v ä h e n t ä m i s o h j e l m a t + v ä h e n t ä m i s o h j e l m i e n + v ä h e n t ä m i s p a i n e i t a + v ä h e n t ä m i s p a n o s + v ä h e n t ä m i s p o t e n t i a a l i + v ä h e n t ä m i s p r o s e n t i t + v ä h e n t ä m i s p r o s e n t t i a + v ä h e n t ä m i s p r o s e s s i i n + v ä h e n t ä m i s p r o s e s s i s s a + v ä h e n t ä m i s p r o s e s s i s t a + v ä h e n t ä m i s p ä ä t ö s t ä ä n + v ä h e n t ä m i s s i t o u m u s t e n + v ä h e n t ä m i s s o p i m u s t a + v ä h e n t ä m i s s t r a t e g i a + v ä h e n t ä m i s s t r a t e g i a n + v ä h e n t ä m i s s t r a t e g i o i d e n + v ä h e n t ä m i s s t r a t e g i o i h i n + v ä h e n t ä m i s s t r a t e g i o i t a + v ä h e n t ä m i s s u u n n i t e l m a n + v ä h e n t ä m i s s u u n n i t e l m a t + v ä h e n t ä m i s s u u n n i t e l m i a + v ä h e n t ä m i s s u u n n i t e l m i e n + v ä h e n t ä m i s t a v o i t e + v ä h e n t ä m i s t a v o i t e t t a + v ä h e n t ä m i s t a v o i t t e e n s a + v ä h e n t ä m i s t a v o i t t e e t + v ä h e n t ä m i s t a v o i t t e i d e n + v ä h e n t ä m i s t a v o i t t e i n + v ä h e n t ä m i s t a v o i t t e i s i i n + v ä h e n t ä m i s t a v o i t t e i s t a + v ä h e n t ä m i s t a v o i t t e i t a + v ä h e n t ä m i s t e k n i i k a n + v ä h e n t ä m i s t o i m e n p i t e i s i i n + v ä h e n t ä m i s t o i m e n p i t e i t ä + v ä h e n t ä m i s t o i m i a + v ä h e n t ä m i s t o i m i e n + v ä h e n t ä m i s t o i m i s s a + v ä h e n t ä m i s t ä + v ä h e n t ä m i s v a a t i m u k s i s t a + v ä h e n t ä m ä l l ä + v ä h e n t ä m ä s s ä + v ä h e n t ä m ä t t ä + v ä h e n t ä m ä ä n + v ä h e n t ä n e e t + v ä h e n t ä v i i n + v ä h e n t ä v ä t + v ä h e n t ä ä + v ä h e n t ä ä k i n + v ä h e n t ä ä k s e e n + v ä h e n t ä ä k s e m m e + v ä h e n t ä ä k s e n n e + v ä h i m m i l l ä ä n k i n + v ä h i m m ä i s a i k a + v ä h i m m ä i s a i k a a + v ä h i m m ä i s a i k a t a u l u a + v ä h i m m ä i s a j a k s i + v ä h i m m ä i s a j a n + v ä h i m m ä i s a j a n j a k s o + v ä h i m m ä i s a j a s t a + v ä h i m m ä i s a l a + v ä h i m m ä i s a n s i o t + v ä h i m m ä i s a r v o n l i s ä v e r o o n + v ä h i m m ä i s a r v o t + v ä h i m m ä i s a s t e + v ä h i m m ä i s a s t e i d e n + v ä h i m m ä i s d i r e k t i i v e j ä + v ä h i m m ä i s d i r e k t i i v i + v ä h i m m ä i s d i r e k t i i v i i n + v ä h i m m ä i s d i r e k t i i v i k s i + v ä h i m m ä i s d i r e k t i i v i n + v ä h i m m ä i s d i r e k t i i v i s t ä + v ä h i m m ä i s d i r e k t i i v i ä + v ä h i m m ä i s e d e l l y t y k s e n + v ä h i m m ä i s e d e l l y t y k s e n ä + v ä h i m m ä i s e d e l l y t y k s e t + v ä h i m m ä i s e d e l l y t y k s i n ä + v ä h i m m ä i s e d e l l y t y k s i s t ä + v ä h i m m ä i s e d e l l y t y k s i ä + v ä h i m m ä i s e d e l l y t y s + v ä h i m m ä i s e d e l l y t y s t e n + v ä h i m m ä i s e h d o i n + v ä h i m m ä i s e h d o i s t a + v ä h i m m ä i s e h d o t + v ä h i m m ä i s e h d o t u k s e t + v ä h i m m ä i s e h d o t u s + v ä h i m m ä i s e h t o + v ä h i m m ä i s e h t o a + v ä h i m m ä i s e h t o j a + v ä h i m m ä i s e h t o j e n + v ä h i m m ä i s e h t o n a + v ä h i m m ä i s e l i n t a s o + v ä h i m m ä i s e l i n t a s o n + v ä h i m m ä i s e l i n v o i m a n + v ä h i m m ä i s e l ä k e + v ä h i m m ä i s e l ä k e i ä n + v ä h i m m ä i s e l ä k e t t ä + v ä h i m m ä i s e l ä k k e e n + v ä h i m m ä i s e l ä k k e e s t ä + v ä h i m m ä i s e l ä k k e i t ä + v ä h i m m ä i s e n e r g i a a + v ä h i m m ä i s e t u u k s i a + v ä h i m m ä i s e t u u k s i s t a + v ä h i m m ä i s e t ä i s y y d e k s i + v ä h i m m ä i s e t ä i s y y d e n + v ä h i m m ä i s e t ä i s y y d e s t ä + v ä h i m m ä i s e t ä i s y y d e t + v ä h i m m ä i s e t ä i s y y k s i e n + v ä h i m m ä i s e t ä i s y y k s i i n + v ä h i m m ä i s e t ä i s y y k s i s t ä + v ä h i m m ä i s e t ä i s y y s + v ä h i m m ä i s e t ä i s y y t t ä + v ä h i m m ä i s h a r m o n i s o i n n i s t a + v ä h i m m ä i s h a r m o n i s o i n t i + v ä h i m m ä i s h e n k i l ö s t ö + v ä h i m m ä i s h i n n a n + v ä h i m m ä i s h i n n a s t a + v ä h i m m ä i s h i n n a t + v ä h i m m ä i s h i n n o i l l a + v ä h i m m ä i s h i n n o i s t a + v ä h i m m ä i s h i n t a + v ä h i m m ä i s h i n t a a + v ä h i m m ä i s h i n t a a n + v ä h i m m ä i s h i n t a n a + v ä h i m m ä i s h i n t a t a k u u n + v ä h i m m ä i s h i n t o j a + v ä h i m m ä i s h i n t o j e n + v ä h i m m ä i s h y v i t y k s e n + v ä h i m m ä i s i h m i s o i k e u k s i a + v ä h i m m ä i s i k ä + v ä h i m m ä i s i k ä r a j a + v ä h i m m ä i s i k ä r a j a a + v ä h i m m ä i s i k ä r a j a k s i + v ä h i m m ä i s i k ä r a j a s t a + v ä h i m m ä i s i k ä ä + v ä h i m m ä i s i k ä ä n + v ä h i m m ä i s i ä k s i + v ä h i m m ä i s i ä n + v ä h i m m ä i s i ä s t ä + v ä h i m m ä i s j o u s t o + v ä h i m m ä i s j o u s t o e h d o t + v ä h i m m ä i s j u l k i l a u s u m a + v ä h i m m ä i s j ä r j e s t e l y n + v ä h i m m ä i s j ä r j e s t e l y ä + v ä h i m m ä i s j ä s e n m ä ä r ä ä n + v ä h i m m ä i s k a n n a t + v ä h i m m ä i s k a n t a + v ä h i m m ä i s k a n t o j e n + v ä h i m m ä i s k a p a s i t e e t t i + v ä h i m m ä i s k e h y k s e n + v ä h i m m ä i s k e h y s + v ä h i m m ä i s k e h y s n o r m i t + v ä h i m m ä i s k e s t o + v ä h i m m ä i s k e s t o a + v ä h i m m ä i s k e s t o a i k a + v ä h i m m ä i s k e s t o o n + v ä h i m m ä i s k i i n t i ö + v ä h i m m ä i s k i i n t i ö n + v ä h i m m ä i s k i i n t i ö t + v ä h i m m ä i s k o h t e l u n + v ä h i m m ä i s k o k o + v ä h i m m ä i s k o k o a + v ä h i m m ä i s k o k o j a + v ä h i m m ä i s k o k o j e n + v ä h i m m ä i s k o k o v a a t i m u k s i a + v ä h i m m ä i s k o m p r o m i s s i + v ä h i m m ä i s k o o k s i + v ä h i m m ä i s k o o n + v ä h i m m ä i s k o o s s a + v ä h i m m ä i s k o o s t a + v ä h i m m ä i s k o r v a u k s i i n + v ä h i m m ä i s k o r v a u k s i s t a + v ä h i m m ä i s k o r v a u s + v ä h i m m ä i s k o r v a u s s u m m a t + v ä h i m m ä i s k o r v a u s t a + v ä h i m m ä i s k o u l u t u k s e s t a + v ä h i m m ä i s k o u l u t u s t a s o s t a + v ä h i m m ä i s k r i t e e r e i t ä + v ä h i m m ä i s k r i t e e r i n + v ä h i m m ä i s k r i t e e r i t + v ä h i m m ä i s k u l u t u k s e e n + v ä h i m m ä i s k u s t a n n u k s i n + v ä h i m m ä i s k u s t a n n u k s i s t a + v ä h i m m ä i s k u s t a n n u s t e k i j ö i h i n + v ä h i m m ä i s k u s t a n n u s t u t k i m u s + v ä h i m m ä i s k u s t a n n u s v a i h e e n + v ä h i m m ä i s k u u k a u s i p a l k a n + v ä h i m m ä i s k y n n y k s e s t ä + v ä h i m m ä i s k y n n y k s e t + v ä h i m m ä i s k y n n y k s i s t ä + v ä h i m m ä i s k y n n y s + v ä h i m m ä i s k ä y t t ö a i k a a + v ä h i m m ä i s k ä y t t ö a j a n + v ä h i m m ä i s k ä y t ö n + v ä h i m m ä i s l a a t u n o r m i t + v ä h i m m ä i s l a a t u v a a t i m u k s e n a + v ä h i m m ä i s l a a t u v a a t i m u k s i a + v ä h i m m ä i s l a a t u v a a t i m u k s i i n + v ä h i m m ä i s l a i n s ä ä d ä n t ö ä + v ä h i m m ä i s l a u s e k e + v ä h i m m ä i s l e p o a i k a + v ä h i m m ä i s l e p o a i k a a + v ä h i m m ä i s l e p o a j a t + v ä h i m m ä i s l e v e y d e n + v ä h i m m ä i s l i t r a h i n t a + v ä h i m m ä i s l u e t t e l o + v ä h i m m ä i s l u e t t e l o n + v ä h i m m ä i s l u v u s t a + v ä h i m m ä i s l ä h t ö k o h t a + v ä h i m m ä i s l ä m p ö t i l a n + v ä h i m m ä i s m a k s u i s t a + v ä h i m m ä i s m a k s u j e n + v ä h i m m ä i s m a r g i n a a l i t + v ä h i m m ä i s m e n e k k i + v ä h i m m ä i s m e n e t t e l y i s t ä + v ä h i m m ä i s m e n e t t e l y j e n + v ä h i m m ä i s m e n e t t e l y s ä ä n n ö t + v ä h i m m ä i s m e n e t t e l y t + v ä h i m m ä i s m i t a t + v ä h i m m ä i s m i t t a + v ä h i m m ä i s m u k a v u u d e t + v ä h i m m ä i s m y y n t i h i n t a + v ä h i m m ä i s m ä ä r i e n + v ä h i m m ä i s m ä ä r i s t ä + v ä h i m m ä i s m ä ä r i t e l m ä ä + v ä h i m m ä i s m ä ä r i ä + v ä h i m m ä i s m ä ä r ä + v ä h i m m ä i s m ä ä r ä i s e s t ä + v ä h i m m ä i s m ä ä r ä l l e + v ä h i m m ä i s m ä ä r ä n + v ä h i m m ä i s m ä ä r ä n ä + v ä h i m m ä i s m ä ä r ä r a h a t + v ä h i m m ä i s m ä ä r ä r a h a t a v o i t t e e n + v ä h i m m ä i s m ä ä r ä r a h o j a + v ä h i m m ä i s m ä ä r ä r a h o j e n + v ä h i m m ä i s m ä ä r ä s t ä + v ä h i m m ä i s m ä ä r ä t + v ä h i m m ä i s m ä ä r ä y k s e t + v ä h i m m ä i s m ä ä r ä y k s i e n + v ä h i m m ä i s m ä ä r ä y k s i i n + v ä h i m m ä i s m ä ä r ä y k s i l l e + v ä h i m m ä i s m ä ä r ä y k s i s t ä + v ä h i m m ä i s m ä ä r ä y k s i ä + v ä h i m m ä i s m ä ä r ä y s t e n + v ä h i m m ä i s m ä ä r ä y s t ä + v ä h i m m ä i s m ä ä r ä ä + v ä h i m m ä i s m ä ä r ä ä n + v ä h i m m ä i s n i m e l l i s a r v o + v ä h i m m ä i s n i m i t t ä j ä + v ä h i m m ä i s n o r m e i h i n + v ä h i m m ä i s n o r m e i k s i + v ä h i m m ä i s n o r m e i l l a + v ä h i m m ä i s n o r m e i n + v ä h i m m ä i s n o r m e i s t a + v ä h i m m ä i s n o r m e j a + v ä h i m m ä i s n o r m i + v ä h i m m ä i s n o r m i a + v ä h i m m ä i s n o r m i e n + v ä h i m m ä i s n o r m i k s i + v ä h i m m ä i s n o r m i n + v ä h i m m ä i s n o r m i n a + v ä h i m m ä i s n o r m i n s a + v ä h i m m ä i s n o r m i s t o + v ä h i m m ä i s n o r m i t + v ä h i m m ä i s o d o t u k s i a m m e + v ä h i m m ä i s o h j e e t + v ä h i m m ä i s o h j e l m a s t a + v ä h i m m ä i s o h j e l m i e n + v ä h i m m ä i s o h j e s ä ä n n ö t + v ä h i m m ä i s o i k e u d e s t a + v ä h i m m ä i s o i k e u d e t + v ä h i m m ä i s o i k e u k s i a + v ä h i m m ä i s o i k e u k s i e n + v ä h i m m ä i s o i k e u k s i s t a + v ä h i m m ä i s o i k e u s + v ä h i m m ä i s o m a v a r a i s u u s a s t e + v ä h i m m ä i s o m a v a r a i s u u s a s t e e n + v ä h i m m ä i s o m a v a r a i s u u s a s t e e s e e n + v ä h i m m ä i s o m a v a r a i s u u s a s t e t t a + v ä h i m m ä i s o m i s t u s k y n n y s t ä + v ä h i m m ä i s o p e t u k s e e n + v ä h i m m ä i s o s a l l i s t u m i s o i k e u d e t + v ä h i m m ä i s o s u u d e n + v ä h i m m ä i s o s u u s + v ä h i m m ä i s o s u u t t a + v ä h i m m ä i s p a i n o + v ä h i m m ä i s p a i n o a + v ä h i m m ä i s p a l k a k s i + v ä h i m m ä i s p a l k a l l a + v ä h i m m ä i s p a l k a n + v ä h i m m ä i s p a l k a s t a + v ä h i m m ä i s p a l k a t + v ä h i m m ä i s p a l k k a + v ä h i m m ä i s p a l k k a a + v ä h i m m ä i s p a l k k a k y n n y s t ä + v ä h i m m ä i s p a l k k a k y s y m y s + v ä h i m m ä i s p a l k k a m m e + v ä h i m m ä i s p a l k k a p o l i t i i k a n + v ä h i m m ä i s p a l k k a s ä ä n n ö t + v ä h i m m ä i s p a l k k a t a k u u t a + v ä h i m m ä i s p a l k k a t a s o k s i + v ä h i m m ä i s p a l k k a u k s e e n + v ä h i m m ä i s p a l k k a u s + v ä h i m m ä i s p a l k k a u s t a + v ä h i m m ä i s p a l k k i o t + v ä h i m m ä i s p a l k k o j a + v ä h i m m ä i s p a l k k o j e n + v ä h i m m ä i s p a l k o i l l e + v ä h i m m ä i s p a l k o i s t a + v ä h i m m ä i s p a l v e l u + v ä h i m m ä i s p a l v e l u j e n + v ä h i m m ä i s p a l v e l u t + v ä h i m m ä i s p a n o k s e n + v ä h i m m ä i s p e r i a a t e t t a + v ä h i m m ä i s p e r u s k o u l u t u k s e n + v ä h i m m ä i s p e r u s o i k e u k s i e n + v ä h i m m ä i s p e r u s t a + v ä h i m m ä i s p e r u s t e e t + v ä h i m m ä i s p e r u s t e i s i i n + v ä h i m m ä i s p e r u s t u l o + v ä h i m m ä i s p i n t a + v ä h i m m ä i s p i t u u t t a + v ä h i m m ä i s p o h j a + v ä h i m m ä i s p o l i t i i k a n + v ä h i m m ä i s p r o s e n t t i + v ä h i m m ä i s p r o s e n t t i m ä ä r i i n + v ä h i m m ä i s p r o s e n t t i o s u u k s i a + v ä h i m m ä i s p r o s e n t t i o s u u t t a + v ä h i m m ä i s p u i t e d i r e k t i i v i n + v ä h i m m ä i s p u i t t e i s t a + v ä h i m m ä i s p u i t t e i t a + v ä h i m m ä i s p ä t e v y y s v a a t i m u k s e t + v ä h i m m ä i s p ä ä o m a + v ä h i m m ä i s p ä ä o m a a + v ä h i m m ä i s p ä ä o m a a n + v ä h i m m ä i s p ä ä o m a k i i n t i ö + v ä h i m m ä i s p ä ä o m a k s i + v ä h i m m ä i s p ä ä o m a s t a + v ä h i m m ä i s p ä ä o m a v a a t i m u k s e e n + v ä h i m m ä i s p ä ä o m a v a a t i m u k s i a + v ä h i m m ä i s p ä ä o m a v a a t i m u s t a + v ä h i m m ä i s r a h o i t u k s e s t a + v ä h i m m ä i s r a h o i t u s o s u u d e k s i + v ä h i m m ä i s r a h o i t u s o s u u k s i a + v ä h i m m ä i s r a h o i t u s o s u u k s i e n + v ä h i m m ä i s r a h o i t u s t a + v ä h i m m ä i s r a j a + v ä h i m m ä i s r a j a a + v ä h i m m ä i s r a j a n + v ä h i m m ä i s r a j a t + v ä h i m m ä i s r a j o i t u k s i a + v ä h i m m ä i s r a j o i t u k s i l l e + v ä h i m m ä i s r a j o j a + v ä h i m m ä i s r a j o j e n + v ä h i m m ä i s r a n g a i s t u k s e n + v ä h i m m ä i s r a n g a i s t u k s e s t a + v ä h i m m ä i s r a n g a i s t u k s e t + v ä h i m m ä i s r a n g a i s t u k s i a + v ä h i m m ä i s r a n g a i s t u s + v ä h i m m ä i s r a n g a i s t u s t a + v ä h i m m ä i s r a n g a i s t u s t e n + v ä h i m m ä i s r a t k a i s u + v ä h i m m ä i s r a t k a i s u a + v ä h i m m ä i s r e s u r s s i t + v ä h i m m ä i s r i k k o m u s t e n + v ä h i m m ä i s s a a t a v u u d e s t a + v ä h i m m ä i s s a k k o + v ä h i m m ä i s s a k k o j e n + v ä h i m m ä i s s e u r a a m u k s e t + v ä h i m m ä i s s e u r a a m u k s i a + v ä h i m m ä i s s i l m ä k o k o + v ä h i m m ä i s s i l m ä k o o k s i + v ä h i m m ä i s s i l m ä k o o t + v ä h i m m ä i s s i s ä l l ö n + v ä h i m m ä i s s i s ä l t ö + v ä h i m m ä i s s o p i m u k s e n + v ä h i m m ä i s s o p i m u k s e s t a + v ä h i m m ä i s s o p i m u s + v ä h i m m ä i s s o p i m u s t a + v ä h i m m ä i s s o s i a a l i s t a n d a r d i l l a + v ä h i m m ä i s s o s i a a l i t u e n + v ä h i m m ä i s s o s i a a l i t u r v a a + v ä h i m m ä i s s t a n d a r d e i h i n + v ä h i m m ä i s s t a n d a r d e i k s i + v ä h i m m ä i s s t a n d a r d e i s t a + v ä h i m m ä i s s t a n d a r d e j a + v ä h i m m ä i s s t a n d a r d i + v ä h i m m ä i s s t a n d a r d i a + v ä h i m m ä i s s t a n d a r d i e n + v ä h i m m ä i s s t a n d a r d i t + v ä h i m m ä i s s u m m a + v ä h i m m ä i s s u m m a a + v ä h i m m ä i s s u m m i a + v ä h i m m ä i s s u m m i e n + v ä h i m m ä i s s u o j a + v ä h i m m ä i s s u o j a a + v ä h i m m ä i s s u o j a k e i n o j a + v ä h i m m ä i s s u o j a n + v ä h i m m ä i s s u o j a s t a n d a r d i + v ä h i m m ä i s s u o j a t a s o n + v ä h i m m ä i s s u o j e l u + v ä h i m m ä i s s u o j e l u a + v ä h i m m ä i s s u o j e l u n + v ä h i m m ä i s s u o j e l u t a s o n + v ä h i m m ä i s s u o s i t u k s e n + v ä h i m m ä i s s y v y y t t ä + v ä h i m m ä i s s ä i l y v y y s a j a n + v ä h i m m ä i s s ä i l y v y y s a j a n v a l m i s t e i d e n + v ä h i m m ä i s s ä i l y v y y s a j a s t a + v ä h i m m ä i s s ä ä d ö s t ä + v ä h i m m ä i s s ä ä n n ö i k s i + v ä h i m m ä i s s ä ä n n ö i l l e + v ä h i m m ä i s s ä ä n n ö i s t ä + v ä h i m m ä i s s ä ä n n ö k s e t + v ä h i m m ä i s s ä ä n n ö k s i + v ä h i m m ä i s s ä ä n n ö k s i s t ä + v ä h i m m ä i s s ä ä n n ö k s i ä + v ä h i m m ä i s s ä ä n n ö n + v ä h i m m ä i s s ä ä n n ö s t e n + v ä h i m m ä i s s ä ä n n ö t + v ä h i m m ä i s s ä ä n t e l y + v ä h i m m ä i s s ä ä n t e l y ä + v ä h i m m ä i s s ä ä n t ö + v ä h i m m ä i s s ä ä n t ö e h d o t u s + v ä h i m m ä i s s ä ä n t ö i h i n + v ä h i m m ä i s s ä ä n t ö j e n + v ä h i m m ä i s s ä ä n t ö j ä + v ä h i m m ä i s s ä ä n t ö ä + v ä h i m m ä i s t a i t o j a + v ä h i m m ä i s t a k e e t + v ä h i m m ä i s t a k e i n + v ä h i m m ä i s t a k e i s t a + v ä h i m m ä i s t a k e i t a + v ä h i m m ä i s t a k u i d e n + v ä h i m m ä i s t a k u i s t a + v ä h i m m ä i s t a k u i t a + v ä h i m m ä i s t a k u u m a k s u + v ä h i m m ä i s t a k u u n + v ä h i m m ä i s t a k u u t + v ä h i m m ä i s t a r i f f i + v ä h i m m ä i s t a r j o n n a n + v ä h i m m ä i s t a r k a s t u s t e n + v ä h i m m ä i s t a r k i s t u k s e n + v ä h i m m ä i s t a r k k u u d e n + v ä h i m m ä i s t a r p e e s t a + v ä h i m m ä i s t a r p e i t a + v ä h i m m ä i s t a s a p a i n o + v ä h i m m ä i s t a s o + v ä h i m m ä i s t a s o a + v ä h i m m ä i s t a s o i h i n + v ä h i m m ä i s t a s o i n e n + v ä h i m m ä i s t a s o i s t a + v ä h i m m ä i s t a s o j a + v ä h i m m ä i s t a s o j e n + v ä h i m m ä i s t a s o l l a + v ä h i m m ä i s t a s o l l e + v ä h i m m ä i s t a s o n + v ä h i m m ä i s t a s o o n + v ä h i m m ä i s t a s o s t a + v ä h i m m ä i s t a s o t + v ä h i m m ä i s t a u o i s t a a n + v ä h i m m ä i s t a v o i t e + v ä h i m m ä i s t a v o i t e t t a + v ä h i m m ä i s t a v o i t t e e k s i + v ä h i m m ä i s t a v o i t t e e n + v ä h i m m ä i s t a v o i t t e e n a + v ä h i m m ä i s t a v o i t t e e s e e n + v ä h i m m ä i s t a v o i t t e e s t a + v ä h i m m ä i s t a v o i t t e e t + v ä h i m m ä i s t a v o i t t e i d e n + v ä h i m m ä i s t a v o i t t e i s i i n + v ä h i m m ä i s t a v o i t t e i t a + v ä h i m m ä i s t e h t ä v ä t + v ä h i m m ä i s t e t ä ä n + v ä h i m m ä i s t i e d o t + v ä h i m m ä i s t o i m e e n t u l o + v ä h i m m ä i s t o i m e e n t u l o a + v ä h i m m ä i s t o i m e e n t u l o l l a + v ä h i m m ä i s t o i m e e n t u l o n + v ä h i m m ä i s t o i m e e n t u l o n s a + v ä h i m m ä i s t o i m e e n t u l o o n + v ä h i m m ä i s t o i m e e n t u l o r a j a n + v ä h i m m ä i s t o i m e e n t u l o s t a + v ä h i m m ä i s t o i m e e n t u l o t u e n + v ä h i m m ä i s t o i m e e n t u l o t u k i + v ä h i m m ä i s t o i m e e n t u l o t u k i e n + v ä h i m m ä i s t o i m e n a + v ä h i m m ä i s t o i m e n p i d e + v ä h i m m ä i s t o i m e n p i t e e t + v ä h i m m ä i s t o i m e n p i t e i d e n + v ä h i m m ä i s t o i m e n p i t e i t ä + v ä h i m m ä i s t o i m e n t u l o o n + v ä h i m m ä i s t o i m e t + v ä h i m m ä i s t o i m i a + v ä h i m m ä i s t o i m i i n + v ä h i m m ä i s t o i m i n t a o h j e i t a + v ä h i m m ä i s t o i m i v a l t a + v ä h i m m ä i s t u e n + v ä h i m m ä i s t u k e a + v ä h i m m ä i s t u k i e n + v ä h i m m ä i s t u k i k y n n y k s e t + v ä h i m m ä i s t u k i k y n n y k s i ä + v ä h i m m ä i s t u l l e i s t a + v ä h i m m ä i s t u l o + v ä h i m m ä i s t u l o a + v ä h i m m ä i s t u l o j a + v ä h i m m ä i s t u l o j e n + v ä h i m m ä i s t u l o j ä r j e s t e l m i e n + v ä h i m m ä i s t u l o j ä r j e s t e l m i l l ä + v ä h i m m ä i s t u l o j ä r j e s t e l m i s s ä + v ä h i m m ä i s t u l o j ä r j e s t e l m i s t ä + v ä h i m m ä i s t u l o j ä r j e s t e l m i ä + v ä h i m m ä i s t u l o j ä r j e s t e l m ä + v ä h i m m ä i s t u l o j ä r j e s t e l m ä s t ä + v ä h i m m ä i s t u l o j ä r j e s t e l m ä t + v ä h i m m ä i s t u l o l l a + v ä h i m m ä i s t u l o n + v ä h i m m ä i s t u l o o n + v ä h i m m ä i s t u l o r a j a + v ä h i m m ä i s t u l o r a j a t + v ä h i m m ä i s t u l o s t a + v ä h i m m ä i s t u l o t + v ä h i m m ä i s t u l o t a k u u + v ä h i m m ä i s t u l o t a s o + v ä h i m m ä i s t u l o t a s o a + v ä h i m m ä i s t u l o t a s o n + v ä h i m m ä i s t u l o t a s o t + v ä h i m m ä i s t u o n t i h i n n a n + v ä h i m m ä i s t u o n t i h i n t a a + v ä h i m m ä i s t u o t a n n o n + v ä h i m m ä i s t u o t a n t o k a p a s i t e e t i n + v ä h i m m ä i s t u r v a + v ä h i m m ä i s t u r v a l l i s u u s + v ä h i m m ä i s t u r v a l l i s u u s m ä ä r ä y k s i e n + v ä h i m m ä i s t u r v a l l i s u u s n o r m i e n + v ä h i m m ä i s t u r v a l l i s u u s t a s o a + v ä h i m m ä i s t u r v a l l i s u u s t a s o n + v ä h i m m ä i s t u r v a l l i s u u s v a a t i m u k s i a + v ä h i m m ä i s t u r v a n + v ä h i m m ä i s t u r v a n o r m i t + v ä h i m m ä i s t u r v a s t a + v ä h i m m ä i s t u r v a t a s o + v ä h i m m ä i s t y ö a i k a a + v ä h i m m ä i s t y ö a j o i s t a + v ä h i m m ä i s t y ö k u s t a n n u k s i n + v ä h i m m ä i s t ä ä + v ä h i m m ä i s v a a t i m u k s e e n + v ä h i m m ä i s v a a t i m u k s e m m e + v ä h i m m ä i s v a a t i m u k s e n a + v ä h i m m ä i s v a a t i m u k s e s t a + v ä h i m m ä i s v a a t i m u k s e t + v ä h i m m ä i s v a a t i m u k s i a + v ä h i m m ä i s v a a t i m u k s i a a n + v ä h i m m ä i s v a a t i m u k s i a k i n + v ä h i m m ä i s v a a t i m u k s i e n + v ä h i m m ä i s v a a t i m u k s i i n + v ä h i m m ä i s v a a t i m u k s i k s i + v ä h i m m ä i s v a a t i m u k s i l l a + v ä h i m m ä i s v a a t i m u k s i n a + v ä h i m m ä i s v a a t i m u k s i s t a + v ä h i m m ä i s v a a t i m u k s i s t a a n + v ä h i m m ä i s v a a t i m u s + v ä h i m m ä i s v a a t i m u s t a + v ä h i m m ä i s v a a t i m u s t a s o n + v ä h i m m ä i s v a a t i m u s t e n + v ä h i m m ä i s v a k a u t t a + v ä h i m m ä i s v a k a v a r a i s u u t t a + v ä h i m m ä i s v a k u u s t a s o + v ä h i m m ä i s v a k u u t u s + v ä h i m m ä i s v a k u u t u s s u m m i e n + v ä h i m m ä i s v a k u u t u s t u r v a n + v ä h i m m ä i s v a k u u t u s v a a t i m u k s i a + v ä h i m m ä i s v a k u u t u s v a a t i m u s t e n + v ä h i m m ä i s v a l i k o i m a s t a + v ä h i m m ä i s v a l m i s t e v e r o + v ä h i m m ä i s v a l m i s t e v e r o a + v ä h i m m ä i s v a l m i s t e v e r o a s t e i t a + v ä h i m m ä i s v a l m i s t e v e r o k a n n o i s t a + v ä h i m m ä i s v a l v o n n a s t a + v ä h i m m ä i s v a l v o n t a a + v ä h i m m ä i s v a n h e n e m i s a i k a + v ä h i m m ä i s v a p a a + v ä h i m m ä i s v a r a n n o i l l e + v ä h i m m ä i s v a r a n n o i s t a + v ä h i m m ä i s v a r a n n o s t a + v ä h i m m ä i s v a r a n n o t + v ä h i m m ä i s v a r a n t o i n a + v ä h i m m ä i s v a r a n t o j a + v ä h i m m ä i s v a r a n t o j e n + v ä h i m m ä i s v a r a n t o j ä r j e s t e l m ä + v ä h i m m ä i s v a r a n t o j ä r j e s t e l m ä n + v ä h i m m ä i s v a r a n t o p o l i t i i k a l l a + v ä h i m m ä i s v a r a n t o p o l i t i i k a s s a + v ä h i m m ä i s v a r a n t o p o l i t i i k k a + v ä h i m m ä i s v a r a n t o s ä ä n n ö t + v ä h i m m ä i s v a r a n t o t a l l e t u k s i l l e + v ä h i m m ä i s v a r a n t o v e l v o i t e + v ä h i m m ä i s v a r a n t o v e l v o i t e p r o s e n t i t + v ä h i m m ä i s v a r a n t o v e l v o i t e t t a + v ä h i m m ä i s v a r a n t o v e l v o i t t e e l l e + v ä h i m m ä i s v a r a n t o v e l v o l l i s u u t t a + v ä h i m m ä i s v a r a s t o + v ä h i m m ä i s v a r a s t o j e n + v ä h i m m ä i s v a r a s t o n + v ä h i m m ä i s v a s t u u m ä ä r ä t + v ä h i m m ä i s v a s t u u r a j a t + v ä h i m m ä i s v a s t u u t a + v ä h i m m ä i s v e l v o i t e + v ä h i m m ä i s v e l v o i t t e e t + v ä h i m m ä i s v e l v o i t t e i l l a + v ä h i m m ä i s v e l v o i t t e i t a a n + v ä h i m m ä i s v e r o + v ä h i m m ä i s v e r o a + v ä h i m m ä i s v e r o a s t e e k s i + v ä h i m m ä i s v e r o a s t e e n + v ä h i m m ä i s v e r o a s t e e t + v ä h i m m ä i s v e r o a s t e i d e n + v ä h i m m ä i s v e r o a s t e i t a + v ä h i m m ä i s v e r o a s t e t t a + v ä h i m m ä i s v e r o i s t a + v ä h i m m ä i s v e r o j a + v ä h i m m ä i s v e r o j e n + v ä h i m m ä i s v e r o j ä r j e s t e l m ä ä + v ä h i m m ä i s v e r o k a n n a n + v ä h i m m ä i s v e r o k a n n a s t a + v ä h i m m ä i s v e r o k a n t a + v ä h i m m ä i s v e r o k a n t a a + v ä h i m m ä i s v e r o k a n t a a n + v ä h i m m ä i s v e r o k a n t o j a + v ä h i m m ä i s v e r o k a n t o j e n + v ä h i m m ä i s v e r o m ä ä r ä n + v ä h i m m ä i s v e r o n + v ä h i m m ä i s v e r o p r o s e n t t i i n + v ä h i m m ä i s v e r o t + v ä h i m m ä i s v e r o t a s o a + v ä h i m m ä i s v e r o t a s o j e n + v ä h i m m ä i s v e r o t a s o n + v ä h i m m ä i s v e r o t u k s e n + v ä h i m m ä i s v e r o t u k s e s t a + v ä h i m m ä i s v e r o t u s t a + v ä h i m m ä i s v e r t a i l u p e r u s t e e t + v ä h i m m ä i s v o i m a v a r a t + v ä h i m m ä i s v ä k i l u v u n + v ä h i m m ä i s v ä l i m a t k a + v ä h i m m ä i s y k s i k k ö + v ä h i m m ä i s y k s i m i e l i s y y s + v ä h i m m ä i s y k s i m i e l i s y y t t ä + v ä h i m m ä l l e + v ä h i m m ä s s ä k ä ä n + v ä h i m p i i n + v ä h i m p i ä + v ä h i n t ä + v ä h i n t ä ä n k i n + v ä h i t t ä i s a l a l l a + v ä h i t t ä i s a s i a k k a i l l e + v ä h i t t ä i s h i n n a n + v ä h i t t ä i s h i n n a t + v ä h i t t ä i s h i n t a + v ä h i t t ä i s h i n t o j a + v ä h i t t ä i s h i n t o j e n + v ä h i t t ä i s j a k e l u a + v ä h i t t ä i s k a u p a l l a + v ä h i t t ä i s k a u p a l l e + v ä h i t t ä i s k a u p a n + v ä h i t t ä i s k a u p a n h a r j o i t t a j i a + v ä h i t t ä i s k a u p a s s a + v ä h i t t ä i s k a u p a s t a + v ä h i t t ä i s k a u p a t + v ä h i t t ä i s k a u p o i s t a + v ä h i t t ä i s k a u p p a + v ä h i t t ä i s k a u p p a a + v ä h i t t ä i s k a u p p a a n + v ä h i t t ä i s k a u p p a h i n n a s t a + v ä h i t t ä i s k a u p p a j ä r j e s t e l m ä + v ä h i t t ä i s k a u p p a k e t j u i s t a + v ä h i t t ä i s k a u p p a k e t j u j a + v ä h i t t ä i s k a u p p a k e t j u j e n + v ä h i t t ä i s k a u p p a k e t j u t + v ä h i t t ä i s k a u p p a m a r k k i n o i t a + v ä h i t t ä i s k a u p p a p a l v e l u t + v ä h i t t ä i s k a u p p a s e k t o r i + v ä h i t t ä i s k a u p p a s e k t o r i a + v ä h i t t ä i s k a u p p i a i d e n + v ä h i t t ä i s k a u p p i a i s t a + v ä h i t t ä i s k a u p p i a s + v ä h i t t ä i s l i i k k e e t + v ä h i t t ä i s l u o t t o j e n + v ä h i t t ä i s m a k s u j a + v ä h i t t ä i s m a k s u j e n + v ä h i t t ä i s m a k s u o p e r a a t i o i s s a + v ä h i t t ä i s m a k s u s u o r i t u k s i i n + v ä h i t t ä i s m a r k k i n a t + v ä h i t t ä i s m a r k k i n o i d e n + v ä h i t t ä i s m a r k k i n o i h i n + v ä h i t t ä i s m a r k k i n o i k s i + v ä h i t t ä i s m a r k k i n o i l l a + v ä h i t t ä i s m a r k k i n o i l l e + v ä h i t t ä i s m a r k k i n o i t a + v ä h i t t ä i s m y y j ä + v ä h i t t ä i s m y y j ä n + v ä h i t t ä i s m y y j ä ä + v ä h i t t ä i s m y y m ä l ä ä n + v ä h i t t ä i s m y y m ä l ö i h i n + v ä h i t t ä i s m y y n n i l l ä + v ä h i t t ä i s m y y n t i a l a a + v ä h i t t ä i s m y y n t i a l a a n + v ä h i t t ä i s m y y n t i a l a l l a + v ä h i t t ä i s m y y n t i a l a n + v ä h i t t ä i s m y y n t i a l o i l l e + v ä h i t t ä i s m y y n t i h i n n a k s i + v ä h i t t ä i s m y y n t i h i n n a s t a + v ä h i t t ä i s m y y n t i h i n n a t + v ä h i t t ä i s m y y n t i h i n t a + v ä h i t t ä i s m y y n t i h i n t o i h i n + v ä h i t t ä i s m y y n t i h i n t o j a + v ä h i t t ä i s m y y n t i h i n t o j e n + v ä h i t t ä i s m y y n t i i n + v ä h i t t ä i s m y y n t i k e t j u j e n + v ä h i t t ä i s m y y n t i k e t j u t + v ä h i t t ä i s m y y n t i m a r k k i n o i d e n + v ä h i t t ä i s m y y n t i m a r k k i n o i l l a + v ä h i t t ä i s m y y n t i m o n o p o l i a + v ä h i t t ä i s m y y n t i o r g a n i s a a t i o i d e n + v ä h i t t ä i s m y y n t i p a l v e l u i d e n + v ä h i t t ä i s m y y n t i p i s t e i t ä + v ä h i t t ä i s m y y n t i p o t e n t i a a l i a + v ä h i t t ä i s m y y n t i r y h m i e n + v ä h i t t ä i s m y y n t i s e k t o r e i l l a + v ä h i t t ä i s m y y n t i y r i t y k s i l l ä + v ä h i t t ä i s p a n k i t + v ä h i t t ä i s p a n k k i t o i m i n n a n + v ä h i t t ä i s p u o l e n + v ä h i t t ä i s r a h a s t o i s t a + v ä h i t t ä i s r a h a s t o j a + v ä h i t t ä i s r a h a s t o k e h y k s e n + v ä h i t t ä i s r a h a s t o k e h y s t ä + v ä h i t t ä i s r a h o i t u k s e n + v ä h i t t ä i s r a h o i t u s m a r k k i n o i l l a + v ä h i t t ä i s r a h o i t u s m a r k k i n o i t a + v ä h i t t ä i s r a h o i t u s p a l v e l u a l a l l a + v ä h i t t ä i s r a h o i t u s p a l v e l u i d e n + v ä h i t t ä i s r a h o i t u s p a l v e l u i s t a + v ä h i t t ä i s r a h o i t u s p a l v e l u j a + v ä h i t t ä i s r a h o i t u s p a l v e l u j e n + v ä h i t t ä i s r a h o i t u s p a l v e l u m a r k k i n o i d e n + v ä h i t t ä i s s e k t o r i l l a + v ä h i t t ä i s s i j o i t t a j a l l e + v ä h i t t ä i s s i j o i t t a j i e n + v ä h i t t ä i s s i j o i t t a j i l l e + v ä h i t t ä i s s i j o i t u s h a n k k e i s t a + v ä h i t t ä i s s i j o i t u s t u o t t e i d e n + v ä h i t t ä i s s i j o i t u s t u o t t e i s t a + v ä h i t t ä i s s i j o i t u s t u o t t e i t a + v ä h i t t ä i s t a s o l l a + v ä h i t t ä i s t u o t t e e t + v ä h i t t ä i s t u o t t e i d e n + v ä h i t t ä i s t u o t t e i s t a + v ä h i t t ä i s v a r a n t o p o h j a a n + v ä h ä a r v o i s e l l e + v ä h ä a r v o i s e m p i + v ä h ä a r v o i s e m p i a + v ä h ä a r v o i s i a + v ä h ä a r v o i s t a + v ä h ä a r v o i s t e n + v ä h ä h i i l i n e n + v ä h ä h i i l i s e e n + v ä h ä h i i l i s e k s i + v ä h ä h i i l i s e l l e + v ä h ä h i i l i s e m p ä ä + v ä h ä h i i l i s e n + v ä h ä h i i l i s e s s ä + v ä h ä h i i l i s e s t ä + v ä h ä h i i l i s e t + v ä h ä h i i l i s i i n + v ä h ä h i i l i s i l l ä + v ä h ä h i i l i s i s t ä + v ä h ä h i i l i s i ä + v ä h ä h i i l i s t e n + v ä h ä h i i l i s t ä + v ä h ä h i i l i s y y t t ä + v ä h ä i n e n k i n + v ä h ä i s e e n + v ä h ä i s e k s i + v ä h ä i s e l l ä + v ä h ä i s e l t ä + v ä h ä i s e m m i k s i + v ä h ä i s e m m i l l ä + v ä h ä i s e m m i s s ä + v ä h ä i s e m m ä t + v ä h ä i s e m p i + v ä h ä i s e m p i ä + v ä h ä i s e m p ä n ä + v ä h ä i s e m p ä ä + v ä h ä i s e n k i n + v ä h ä i s e s s ä + v ä h ä i s e s t ä + v ä h ä i s e t + v ä h ä i s e t k i n + v ä h ä i s i i n + v ä h ä i s i k s i + v ä h ä i s i l t ä + v ä h ä i s i m m i s s ä + v ä h ä i s i m m ä k s i + v ä h ä i s i m m ä s s ä k ä ä n + v ä h ä i s i m m ä t + v ä h ä i s i m m ä t k i n + v ä h ä i s i m p i ä + v ä h ä i s i m p ä n ä + v ä h ä i s i m p ä ä n + v ä h ä i s i n + v ä h ä i s i n k i n + v ä h ä i s i n t ä + v ä h ä i s i n t ä k ä ä n + v ä h ä i s i n ä + v ä h ä i s i s t ä + v ä h ä i s i s t ä k i n + v ä h ä i s i ä + v ä h ä i s t e n + v ä h ä i s t e n k ä ä n + v ä h ä i s t ä + v ä h ä i s t ä k i n + v ä h ä i s t ä k ä ä n + v ä h ä k a l o r i s u u t t a + v ä h ä l a p s i s u u t t a + v ä h ä l l e + v ä h ä l u k u i s e m m a t + v ä h ä l u k u i s i a + v ä h ä l u k u i s i i n + v ä h ä m e r k i t y k s i n e n + v ä h ä m e r k i t y k s i s e n + v ä h ä m e r k i t y k s i s e t + v ä h ä m e r k i t y k s i s i n ä + v ä h ä m e r k i t y k s i s i ä + v ä h ä m e r k i t y k s i s t e n + v ä h ä m e r k i t y k s i s t ä + v ä h ä n k i n + v ä h ä n k ä ä n + v ä h ä o s a i s e m m a t + v ä h ä o s a i s e m m i l l e + v ä h ä o s a i s e m p i i n + v ä h ä o s a i s e t + v ä h ä o s a i s i a + v ä h ä o s a i s i i n + v ä h ä o s a i s i l l e + v ä h ä o s a i s i m m a t + v ä h ä o s a i s i m m i l l e + v ä h ä o s a i s i m m i l t a + v ä h ä o s a i s i m m i s s a + v ä h ä o s a i s i m m i s t a + v ä h ä o s a i s i m p i a + v ä h ä o s a i s i m p i e n + v ä h ä o s a i s i n t a + v ä h ä o s a i s i s s a + v ä h ä o s a i s t a + v ä h ä o s a i s t e n + v ä h ä o s a i s u u d e s t a m m e + v ä h ä p a l k k a i s e t + v ä h ä p ä t ö i s e m m ä k s i + v ä h ä p ä t ö i s e m p i + v ä h ä p ä t ö i s e m p i ä + v ä h ä p ä t ö i s e m p ä ä + v ä h ä p ä t ö i s i l l ä + v ä h ä p ä t ö i s i l t ä + v ä h ä p ä t ö i s i m m i s t ä k i n + v ä h ä p ä t ö i s i m p ä n ä + v ä h ä p ä t ö i s i s t ä + v ä h ä p ä t ö i s i ä + v ä h ä p ä t ö i s t e n + v ä h ä p ä ä s t ö i s i i n + v ä h ä p ä ä s t ö i s i s t ä + v ä h ä p ä ä s t ö i s i ä + v ä h ä p ä ä s t ö i s t ä + v ä h ä p ä ä s t ö i s y y s + v ä h ä r a s v a i n e n + v ä h ä r a s v a i s i a + v ä h ä r a s v a i s i i n + v ä h ä r a s v a i s i l l e + v ä h ä r a s v a i s t a + v ä h ä r i s k i s e t + v ä h ä r i s k i s i i n + v ä h ä r i s k i s i n ä + v ä h ä r i s k i s i s t ä + v ä h ä r i s k i s t ä + v ä h ä s i n i s i i p i + v ä h ä t e l l ä + v ä h ä t t e l e m ä t t ä + v ä h ä t t e l e v ä t + v ä h ä t t e l y ä + v ä h ä t u l o i s i i n + v ä h ä t u l o i s i l l a + v ä h ä t u l o i s i l l e + v ä h ä t u l o i s t e n + v ä h ä t u o t t o i s e m p a a n + v ä h ä t u o t t o i s i a + v ä h ä v a r a i s e m p i a + v ä h ä v a r a i s e t + v ä h ä v a r a i s i a + v ä h ä v a r a i s i l l e + v ä h ä v a r a i s i m m a l l e + v ä h ä v a r a i s i m m i l l e + v ä h ä v a r a i s i m p i a + v ä h ä v a r a i s i m p i e n + v ä h ä v a r a i s t e n + v ä i j y t y s m a r k k i n o i n n i n + v ä i k k y y + v ä i s t e l l ä + v ä i s t e l l ä k s e e n + v ä i s t y m i s e s t ä ä n + v ä i s t y m ä s s ä + v ä i s t y m ä ä n + v ä i s t y y + v ä i s t y ä + v ä i s t ä m i s v e l v o l l i s u u s + v ä i s t ä m ä t t ö m i s t ä + v ä i s t ä m ä t t ö m i ä + v ä i s t ä m ä t t ö m y y t e n ä + v ä i s t ä m ä t t ö m ä k s i + v ä i s t ä m ä t t ö m ä l t ä + v ä i s t ä m ä t t ö m ä m p ä ä + v ä i s t ä m ä t t ö m ä n ä + v ä i s t ä m ä t t ö m ä t + v ä i s t ä m ä t ö n t ä + v ä i s t ä ä + v ä i t e m e k a n i s m i + v ä i t e m e n e t t e l y e l i m e n + v ä i t e t i e d o k s i a n n o n + v ä i t e t t i i n + v ä i t e t t y i h i n + v ä i t e t t y j e n + v ä i t e t t y ä + v ä i t e t t ä + v ä i t e t t ä n i + v ä i t e t t ä ä n + v ä i t e t y i s t ä + v ä i t e t y n + v ä i t e t y s t ä + v ä i t e t y t + v ä i t e t ä ä n + v ä i t t e e l l e + v ä i t t e e n + v ä i t t e e n i + v ä i t t e e s e e n + v ä i t t e e s t ä + v ä i t t e e t + v ä i t t e i d e n + v ä i t t e i d e n s ä + v ä i t t e i l l e + v ä i t t e i l l ä + v ä i t t e i s i i n + v ä i t t e i s t ä + v ä i t t e i t ä + v ä i t t e l e m ä ä n + v ä i t t e l y i s s ä + v ä i t t e l y i t ä + v ä i t t e l y j ä + v ä i t t e l y k e r h o k s i + v ä i t t e l y t e k n i i k k a a + v ä i t t e l y y n + v ä i t t e l y ä + v ä i t t i + v ä i t t i v ä t + v ä i t t ä e n + v ä i t t ä e s s ä n i + v ä i t t ä e s s ä ä n + v ä i t t ä i s i n + v ä i t t ä i s i n k i n + v ä i t t ä m i n e n + v ä i t t ä m i ä + v ä i t t ä m ä l l ä + v ä i t t ä m ä t + v ä i t t ä n e e t + v ä i t t ä n y t + v ä i t t ä v ä t + v ä i t t ä ä + v ä i t t ä ä k s e e n + v ä i t ä k ä ä n + v ä i t ä m m e + v ä i t ä n + v ä i t ö s k i r j a a n s a + v ä i t ö s k i r j o i s t a + v ä k e v i l l e + v ä k e v i s s ä + v ä k e v i ä + v ä k e v y y k s i ä + v ä k e v ö i m i s e s s ä + v ä k e v ö i m i s m e n e t e l m i ä + v ä k e ä + v ä k i j o u k k o i h i n + v ä k i j o u k o t + v ä k i j u o m a k y s y m y k s e s s ä + v ä k i j u o m a s o p i m u k s e n + v ä k i j u o m a s o p i m u s t a + v ä k i l u k u + v ä k i l u k u u n s a + v ä k i l u v u l t a a n + v ä k i l u v u s t a + v ä k i m ä ä r ä + v ä k i m ä ä r ä n + v ä k i r e h u + v ä k i r i k k a a m p i e n + v ä k i r i k k a i m m a l l a + v ä k i r i k k a i m m i s t a + v ä k i r i k k a i m p i e n + v ä k i r i k k a i n + v ä k i r i k k a i n t a + v ä k i s i n k i n + v ä k i s i n m a k a a m i n e n + v ä k i v a l l a k s i + v ä k i v a l l a l l a + v ä k i v a l l a l l e + v ä k i v a l l a l t a + v ä k i v a l l a n + v ä k i v a l l a n k ä y t ö s t ä + v ä k i v a l l a n t e k i j ä t + v ä k i v a l l a n t e k i j ö i d e n + v ä k i v a l l a n t e k i j ö i h i n + v ä k i v a l l a n t e k i j ö i l l e + v ä k i v a l l a n t e k i j ö i l t ä + v ä k i v a l l a n t e k i j ö i t ä + v ä k i v a l l a n t e k o + v ä k i v a l l a n t e k o a + v ä k i v a l l a n t e k o i h i n + v ä k i v a l l a n t e k o j a + v ä k i v a l l a n t e k o j e n + v ä k i v a l l a n t e o i l l a a n + v ä k i v a l l a n t e o i l l e + v ä k i v a l l a n t e o i l t a + v ä k i v a l l a n t e o i s t a + v ä k i v a l l a n t e o n + v ä k i v a l l a n t e o t + v ä k i v a l l a n t y ö t + v ä k i v a l l a n v a s t a i n e n + v ä k i v a l l a s s a + v ä k i v a l l a s t a + v ä k i v a l l a t o n + v ä k i v a l l a t o n t a + v ä k i v a l l a t t a + v ä k i v a l l a t t o m a a n + v ä k i v a l l a t t o m a l l a + v ä k i v a l l a t t o m a l l e + v ä k i v a l l a t t o m a n + v ä k i v a l l a t t o m a s s a + v ä k i v a l l a t t o m a s t a + v ä k i v a l l a t t o m a s t i + v ä k i v a l l a t t o m i a + v ä k i v a l l a t t o m i e n + v ä k i v a l l a t t o m i i n + v ä k i v a l l a t t o m i l l e + v ä k i v a l l a t t o m i n + v ä k i v a l l a t t o m i s t a + v ä k i v a l l a t t o m u u d e l l e + v ä k i v a l l a t t o m u u d e n + v ä k i v a l l a t t o m u u d e s t a + v ä k i v a l l a t t o m u u s + v ä k i v a l l a t t o m u u t e e n + v ä k i v a l l a t t o m u u t e n n e + v ä k i v a l l a t t o m u u t t a + v ä k i v a l t a + v ä k i v a l t a a + v ä k i v a l t a a n + v ä k i v a l t a e l o k u v i a + v ä k i v a l t a e l o k u v i e n + v ä k i v a l t a e s i t y s t e n + v ä k i v a l t a i n e n + v ä k i v a l t a i s e e n + v ä k i v a l t a i s e k s i + v ä k i v a l t a i s e l l a + v ä k i v a l t a i s e m p a a + v ä k i v a l t a i s e m p i a + v ä k i v a l t a i s e n + v ä k i v a l t a i s e s t a + v ä k i v a l t a i s e s t i + v ä k i v a l t a i s e t + v ä k i v a l t a i s i a + v ä k i v a l t a i s i i n + v ä k i v a l t a i s i m m i s t a + v ä k i v a l t a i s i n + v ä k i v a l t a i s i s t a + v ä k i v a l t a i s t a + v ä k i v a l t a i s t e n + v ä k i v a l t a i s u u d e s t a + v ä k i v a l t a i s u u d e t + v ä k i v a l t a i s u u k s i a + v ä k i v a l t a i s u u k s i e n + v ä k i v a l t a i s u u k s i e n k i n + v ä k i v a l t a i s u u k s i i n + v ä k i v a l t a i s u u k s i k s i + v ä k i v a l t a i s u u k s i l l e + v ä k i v a l t a i s u u k s i l t a + v ä k i v a l t a i s u u k s i s s a + v ä k i v a l t a i s u u k s i s t a + v ä k i v a l t a i s u u s a a l t o j a a n + v ä k i v a l t a i s u u t t a + v ä k i v a l t a k e h i t y s + v ä k i v a l t a k i e r r e + v ä k i v a l t a k i e r r e t t ä + v ä k i v a l t a k i e r t e e l l ä + v ä k i v a l t a k o h t a u k s i l t a + v ä k i v a l t a k o n e i s t o l t a a n + v ä k i v a l t a k y s y m y s t ä + v ä k i v a l t a n a + v ä k i v a l t a o n g e l m a + v ä k i v a l t a p e s ä k k e i n e e n + v ä k i v a l t a r i k o k s e n + v ä k i v a l t a r i k o k s e t + v ä k i v a l t a r i k o k s i a + v ä k i v a l t a r i k o k s i i n + v ä k i v a l t a r i k o k s i s t a + v ä k i v a l t a r i k o l l i s u u s + v ä k i v a l t a r i k o l l i s u u t t a + v ä k i v a l t a r i k o s + v ä k i v a l t a r i k o s t e n + v ä k i v a l t a s i s ä l l ö t + v ä k i v a l t a t a p a u k s i a + v ä k i v a l t a t a p a u k s i i n + v ä k i v a l t a t a p a u k s i s s a + v ä k i v a l t a t a s e + v ä k i v a l t a t a s o o n + v ä k i v a l t a t e k o j e n + v ä k i v a l t a t e o t + v ä k i v a l t a t i l a n t e i s i i n + v ä k i v a l t a v i d e o t + v ä l e i n + v ä l e i s s ä + v ä l e j ä + v ä l i a i k a a + v ä l i a i k a i n e n + v ä l i a i k a i n e n k i n + v ä l i a i k a i s e e n + v ä l i a i k a i s e l l a + v ä l i a i k a i s e l l e + v ä l i a i k a i s e l t a + v ä l i a i k a i s e n + v ä l i a i k a i s e n a + v ä l i a i k a i s e s s a + v ä l i a i k a i s e s t a + v ä l i a i k a i s e s t i + v ä l i a i k a i s e t + v ä l i a i k a i s h a l l i n n o l l e + v ä l i a i k a i s h a l l i n n o n + v ä l i a i k a i s h a l l i n n o s s a + v ä l i a i k a i s h a l l i n t o + v ä l i a i k a i s h a l l i n t o a + v ä l i a i k a i s h a l l i t u k s e e n + v ä l i a i k a i s h a l l i t u k s e l l a + v ä l i a i k a i s h a l l i t u k s e l l e + v ä l i a i k a i s h a l l i t u k s e n + v ä l i a i k a i s h a l l i t u k s i k s i + v ä l i a i k a i s h a l l i t u s + v ä l i a i k a i s h a l l i t u s t a + v ä l i a i k a i s i a + v ä l i a i k a i s i i n + v ä l i a i k a i s i k s i + v ä l i a i k a i s i l l e + v ä l i a i k a i s i n a + v ä l i a i k a i s i s t a + v ä l i a i k a i s j ä r j e s t e l y j e n + v ä l i a i k a i s j ä r j e s t e l y n + v ä l i a i k a i s j ä r j e s t e l y y n + v ä l i a i k a i s k e r t o m u k s e s s a + v ä l i a i k a i s k o m i t e a n + v ä l i a i k a i s k o m i t e a s s a + v ä l i a i k a i s m a j o i t u k s e s s a + v ä l i a i k a i s r a t k a i s u + v ä l i a i k a i s r a t k a i s u a + v ä l i a i k a i s r a t k a i s u n + v ä l i a i k a i s r a t k a i s u t + v ä l i a i k a i s s o p i m u k s e e n + v ä l i a i k a i s s o p i m u s + v ä l i a i k a i s s t a n d a r d i s s a + v ä l i a i k a i s s u u n n i t e l m a a + v ä l i a i k a i s s u u n n i t e l m a n + v ä l i a i k a i s s ä ä n n ö s t ä + v ä l i a i k a i s t a + v ä l i a i k a i s t a k i n + v ä l i a i k a i s t e n + v ä l i a i k a i s t i l e i l l e + v ä l i a i k a i s t i l e i l t ä + v ä l i a i k a i s t i l i t + v ä l i a i k a i s t o i m e n p i t e i t ä + v ä l i a i k a i s u u t e e n + v ä l i a i k a i s v a i h t o e h t o + v ä l i a i k a k e r t o m u k s e n + v ä l i a i k a k e r t o m u s + v ä l i a i k a m i e t i n n ö k s i + v ä l i a i k a m i e t i n n ö n + v ä l i a i k a m i e t i n n ö s s ä + v ä l i a i k a m i e t i n t ö + v ä l i a i k a m i e t i n t ö ö n + v ä l i a i k a n a + v ä l i a i k a r a p o r t i s t a + v ä l i a i k a r a p o r t t i + v ä l i a i k a t a r k i s t u k s e n + v ä l i a i k a t a r k i s t u k s e s s a + v ä l i a i k a t a r k i s t u s t a + v ä l i a i k a t a v o i t t e i t a + v ä l i a i k a t i l a n t e e s s a + v ä l i a i k a t u l o k s i a + v ä l i a j a n + v ä l i a j a s t a + v ä l i a j o i n + v ä l i a l u e i d e n + v ä l i a l u e i k s i + v ä l i a l u e i s t a + v ä l i a l u e i t a + v ä l i a l u e t t a + v ä l i a m e r i k k a l a i s t e n + v ä l i a r v i o + v ä l i a r v i o i n e e n + v ä l i a r v i o i n n e i l l a + v ä l i a r v i o i n n e i s s a + v ä l i a r v i o i n n e i s t a + v ä l i a r v i o i n n i l l a + v ä l i a r v i o i n n i l l e + v ä l i a r v i o i n n i n + v ä l i a r v i o i n n i s s a + v ä l i a r v i o i n n i s s a a n + v ä l i a r v i o i n n i s t a + v ä l i a r v i o i n n i t + v ä l i a r v i o i n t e j a + v ä l i a r v i o i n t i + v ä l i a r v i o i n t i a + v ä l i a r v i o i n t i e n + v ä l i a r v i o i n t i i n + v ä l i a r v i o i n t i k e r t o m u k s e n + v ä l i a r v i o i n t i k e r t o m u s + v ä l i a r v i o i n t i l a u s e k e + v ä l i a r v i o i n t i m e k a n i s m i s t a + v ä l i a r v i o i n t i m e n e t t e l y ä + v ä l i a r v i o i n t i v a i h e e s s a + v ä l i a r v i o n + v ä l i a r v i o o n + v ä l i a r v i o s s a + v ä l i a r v i o s t a + v ä l i a r v i o t a + v ä l i a r v i o v u o t e e n + v ä l i a s e m a + v ä l i a s k e l + v ä l i a s k e l t a + v ä l i e n s e l v i t t e l y s s ä + v ä l i e t a p i n + v ä l i e t a p p i + v ä l i e t a p p i n a + v ä l i h u o m a u t u k s e n + v ä l i h u o m a u t u k s i s t a + v ä l i h u o m a u t u s + v ä l i i n p u t o a j a m a i d e n + v ä l i i n t u l o a + v ä l i i n t u l o h a k e m u k s e n + v ä l i i n t u l o h i n n a t + v ä l i i n t u l o j a + v ä l i i n t u l o j o u k k o j a + v ä l i i n t u l o j o u k k o j e n + v ä l i i n t u l o j o u k o i l l a + v ä l i i n t u l o j o u k o i s t a + v ä l i i n t u l o j o u k o t + v ä l i i n t u l o j ä r j e s t e l m i ä + v ä l i i n t u l o j ä r j e s t e l m ä ä + v ä l i i n t u l o k e i n o j a + v ä l i i n t u l o m a h d o l l i s u u d e t + v ä l i i n t u l o m a h d o l l i s u u s + v ä l i i n t u l o m a h d o l l i s u u t t a + v ä l i i n t u l o m e k a n i s m e j a + v ä l i i n t u l o m e k a n i s m i + v ä l i i n t u l o m e k a n i s m i e n + v ä l i i n t u l o m e k a n i s m i s s a + v ä l i i n t u l o m e n e t e l m i l l ä + v ä l i i n t u l o m e n e t t e l y j e n + v ä l i i n t u l o n + v ä l i i n t u l o o n + v ä l i i n t u l o s t r a t e g i a a + v ä l i i n t u l o t o i m i a + v ä l i i n t u l o t o i m i i n + v ä l i i n t u l o v a l m i u k s i a + v ä l i i n t u l o v a l m i u k s i a m m e + v ä l i i n t u l o v a l t u u d e t + v ä l i i n t u l o v o i m i a + v ä l i j ä ä k a u s i + v ä l i k a a s u + v ä l i k a p p a l e i n a + v ä l i k a t s a u k s e n + v ä l i k a u d e l l a + v ä l i k a u d e n + v ä l i k a u t e e n + v ä l i k a u t e n a + v ä l i k e r t o m u k s e e n + v ä l i k e r t o m u k s e n + v ä l i k e r t o m u k s e s s a + v ä l i k e r t o m u k s e s t a + v ä l i k e r t o m u k s e t + v ä l i k e r t o m u k s i a + v ä l i k e r t o m u k s i a m m e + v ä l i k e r t o m u s + v ä l i k e r t o m u s t a + v ä l i k e s k u s t e l u i s s a + v ä l i k i e l i + v ä l i k o h t a u k s e n + v ä l i k o h t a u k s e s t a + v ä l i k o h t a u k s i a + v ä l i k o h t a u k s i s t a + v ä l i k o h t a u k s i t t a + v ä l i k o h t a u s t a + v ä l i k o h t a u s t e n + v ä l i k o k o u s + v ä l i k o r v a + v ä l i k o r v a o n t e l o + v ä l i k ä d e n + v ä l i k ä d e t + v ä l i k ä s i e n + v ä l i k ä s i i n + v ä l i k ä s i n ä + v ä l i k ä s i o n g e l m a n + v ä l i k ä s i ä + v ä l i l a s k u j e n + v ä l i l a s k u p a i k k o i n a + v ä l i l e v y p u l l i s t u m a + v ä l i l l e e n + v ä l i l l i s e e n + v ä l i l l i s e s s ä + v ä l i l l i s e s t i k ä ä n + v ä l i l l i s e s t ä + v ä l i l l i s i ä + v ä l i l l i s t e n + v ä l i l l i s t ä + v ä l i l u o k a n + v ä l i l u o k a s t a + v ä l i l u o k k a + v ä l i l u o k k a a + v ä l i l u o k k a a n + v ä l i l u o k k i e n + v ä l i l y ö n t i + v ä l i m a a s t o + v ä l i m a a s t o a + v ä l i m a a s t o s t a + v ä l i m a k s u j a + v ä l i m a k s u j e n + v ä l i m a k s u t + v ä l i m a t k a + v ä l i m a t k a a + v ä l i m a t k a k o r v a u s + v ä l i m a t k a n + v ä l i m a t k a t + v ä l i m e n o k a u d e l l a + v ä l i m e n o k a u s i + v ä l i m e r e e n + v ä l i m e r e l l e + v ä l i m e r e l l i n e n + v ä l i m e r e l l i s e n + v ä l i m e r e l l ä + v ä l i m e r e l t ä + v ä l i m e r e n + v ä l i m e r e n h a u k k a + v ä l i m e r e n i l m a s t o + v ä l i m e r e n k u m p p a n u u s p o l i t i i k a n + v ä l i m e r e n l o k k i + v ä l i m e r e n m a i d e n + v ä l i m e r e n p i h l a j a + v ä l i m e r e n r i t a r i + v ä l i m e r e n s i i l i + v ä l i m e r e n s y p r e s s i + v ä l i m e r e n t a a t e l i + v ä l i m e r e n t y r ä k k i + v ä l i m e r e s t ä + v ä l i m e r i + v ä l i m e r i k o k o u s + v ä l i m e r i s o p i m u s + v ä l i m e r i s t r a t e g i a n + v ä l i m e r t a + v ä l i m i e s k e s k u k s i l l e + v ä l i m i e s m e n e t t e l y + v ä l i m i e s m e n e t t e l y i s s ä + v ä l i m i e s m e n e t t e l y j ä r j e s t e l m ä ä + v ä l i m i e s m e n e t t e l y p a l v e l u j a + v ä l i m i e s m e n e t t e l y s s ä + v ä l i m i e s p a l v e l u + v ä l i m i e s p a n e e l i e n + v ä l i m i e s t u o m i o o n + v ä l i m i e s t u o m i o s t a + v ä l i m i e t i n n ö l l e + v ä l i m i e t i n n ö n + v ä l i m i e t i n n ö s s ä + v ä l i m i e t i n t ö + v ä l i m u o t o a l u e i d e n + v ä l i m u o t o a l u e i t a + v ä l i m u o t o j a + v ä l i m u o t o r a t k a i s u + v ä l i n e a r s e n a a l i + v ä l i n e e k s i + v ä l i n e e l l e + v ä l i n e e l l i s e n ä + v ä l i n e e l l i s t ä m i s e k s i + v ä l i n e e l l i s t ä m i s t ä + v ä l i n e e l l ä + v ä l i n e e m m e + v ä l i n e e n + v ä l i n e e n ä + v ä l i n e e s e e n + v ä l i n e e s t ä + v ä l i n e e t + v ä l i n e i d e n + v ä l i n e i l l e + v ä l i n e i l l ä + v ä l i n e i l l ä ä n + v ä l i n e i n + v ä l i n e i n ä + v ä l i n e i s i i n + v ä l i n e i s s ä + v ä l i n e i s s ä k ä ä n + v ä l i n e i s t e t t i i n + v ä l i n e i s t ö ä + v ä l i n e i t t e n + v ä l i n e i t ä + v ä l i n e i t ä m m e + v ä l i n e j ä r j e s t e l m ä s t ä + v ä l i n e t t ä + v ä l i n e v a i h t o e h d o i s t a + v ä l i n e v a l i k o i m i n e e n + v ä l i n p i t ä m ä t t ö m i n ä + v ä l i n p i t ä m ä t t ö m i ä + v ä l i n p i t ä m ä t t ö m y y d e n + v ä l i n p i t ä m ä t t ö m y y d e s t ä + v ä l i n p i t ä m ä t t ö m y y d e s t ä m m e + v ä l i n p i t ä m ä t t ö m y y t e e m m e + v ä l i n p i t ä m ä t t ö m y y t e e n + v ä l i n p i t ä m ä t t ö m y y t t ä + v ä l i n p i t ä m ä t t ö m ä k s i + v ä l i n p i t ä m ä t t ö m ä s t i + v ä l i n p i t ä m ä t ö n + v ä l i n p i t ä m ä t ö n t ä + v ä l i p a l a + v ä l i p a l a t + v ä l i p o r t a a n + v ä l i r a h o i t u k s e e n + v ä l i r a h o i t u k s e l l e + v ä l i r a h o i t u s i n s t r u m e n t t e i h i n + v ä l i r a h o i t u s t a + v ä l i r a k e n t e i d e n + v ä l i r a p o r t i n + v ä l i r a p o r t i s s a + v ä l i r a p o r t i s s a a n + v ä l i r a p o r t i t + v ä l i r a p o r t t i + v ä l i r a p o r t t i a + v ä l i r a p o r t t i a a n + v ä l i r a p o r t t i i n + v ä l i r a p o r t t i n s a + v ä l i r a t k a i s u a + v ä l i r a t k a i s u n + v ä l i r a u h a + v ä l i r y h m i e n + v ä l i r y h m i ä + v ä l i r y h m ä + v ä l i r y h m ä n + v ä l i r y h m ä s s ä + v ä l i r y h m ä s t ä + v ä l i r y h m ä t + v ä l i s a t a m a + v ä l i s a t a m i n a + v ä l i s e e n + v ä l i s e k s i + v ä l i s e l o n t e o n + v ä l i s e n + v ä l i s e s s ä + v ä l i s e s t ä + v ä l i s e t + v ä l i s i i n + v ä l i s i j a y h d i s t e + v ä l i s i s t ä + v ä l i s i ä + v ä l i s k e n a a r i o k s i + v ä l i s o p i m u k s e n + v ä l i s t e n + v ä l i s t r a t e g i a + v ä l i s t r a t e g i a n + v ä l i s u k u p o l v e n + v ä l i s u u n n i t e l m a n + v ä l i t + v ä l i t a r k a s t u k s e s s a + v ä l i t a r k a s t u k s e s t a + v ä l i t a r k a s t u s + v ä l i t a r k i s t u k s e e n + v ä l i t a r k i s t u k s e n + v ä l i t a r k i s t u k s e s s a + v ä l i t a r k i s t u k s e s t a + v ä l i t a r k i s t u k s i a + v ä l i t a r k i s t u k s i i n + v ä l i t a r k i s t u s + v ä l i t a r k i s t u s t a + v ä l i t a s e + v ä l i t a s o a + v ä l i t a v o i t e t e s t i ä + v ä l i t a v o i t e t t a + v ä l i t a v o i t t e e n + v ä l i t a v o i t t e e n a + v ä l i t a v o i t t e e s t a + v ä l i t a v o i t t e e t + v ä l i t a v o i t t e i d e n + v ä l i t a v o i t t e i s s a + v ä l i t a v o i t t e i s t a + v ä l i t a v o i t t e i t a + v ä l i t e t t i i n + v ä l i t e t t y ä + v ä l i t e t ä + v ä l i t e t ä ä n + v ä l i t i l i n p ä ä t ö k s e n + v ä l i t i l i n p ä ä t ö s + v ä l i t i l i n p ä ä t ö s t ä + v ä l i t i n + v ä l i t i t t e + v ä l i t o i m e n p i t e e t + v ä l i t o i m e n p i t e i s t ä + v ä l i t o i m i i n + v ä l i t o i m i s t a + v ä l i t t i + v ä l i t t y y + v ä l i t t ä i s i t t e + v ä l i t t ä j i e n + v ä l i t t ä j i l l e + v ä l i t t ä j i ä + v ä l i t t ä j ä e l i n t e n + v ä l i t t ä j ä j ä r j e s t ö i l l e + v ä l i t t ä j ä k s i + v ä l i t t ä j ä n + v ä l i t t ä j ä n ä + v ä l i t t ä j ä o r g a n i s a a t i o i s t a + v ä l i t t ä j ä o s a p u o l i + v ä l i t t ä j ä p a n k e i l l e + v ä l i t t ä j ä p a n k k e j a + v ä l i t t ä j ä p a n k k i e n + v ä l i t t ä j ä y r i t y k s e l l e + v ä l i t t ä k ä ä + v ä l i t t ä m i s e e n + v ä l i t t ä m i s e k s i + v ä l i t t ä m i s e n + v ä l i t t ä m i s j ä r j e s t e l m ä n + v ä l i t t ä m i s t ä + v ä l i t t ä m ä t t ä + v ä l i t t ä m ä ä n + v ä l i t t ä n y t + v ä l i t t ä v i e n + v ä l i t t ä v i l l e + v ä l i t t ä v ä t + v ä l i t t ä ä + v ä l i t t ä ä k s e e n + v ä l i t t ä ä k s e m m e + v ä l i t t ä ä k s e n i + v ä l i t t ä ä k s e n n e + v ä l i t t ö m i e n + v ä l i t t ö m i i n + v ä l i t t ö m i l l e + v ä l i t t ö m i l l ä + v ä l i t t ö m i m m i n + v ä l i t t ö m i m m i s t ä + v ä l i t t ö m i m m ä n + v ä l i t t ö m i m m ä t + v ä l i t t ö m i m p i ä + v ä l i t t ö m i m p ä ä n + v ä l i t t ö m i n + v ä l i t t ö m i n t ä + v ä l i t t ö m i n ä + v ä l i t t ö m i s s ä + v ä l i t t ö m i s t ä + v ä l i t t ö m i ä + v ä l i t t ö m ä m m i n + v ä l i t t ö m ä m m i s t ä + v ä l i t t ö m ä m p i + v ä l i t t ö m ä m p i ä + v ä l i t t ö m ä m p ä ä + v ä l i t t ö m ä m p ä ä n + v ä l i t t ö m ä n + v ä l i t t ö m ä s s ä + v ä l i t t ö m ä t + v ä l i t t ö m ä ä n + v ä l i t u l o k s e n + v ä l i t u l o k s i a + v ä l i t u l o s + v ä l i t u l o s t a + v ä l i t u n n e i l l a + v ä l i t u o t t e e t + v ä l i t u o t t e i d e n + v ä l i t u o t t e i n a + v ä l i t u o t t e i s t a + v ä l i t u o t t e i t a + v ä l i t y s e h d o t u k s i s s a + v ä l i t y s j o u k k o j e n + v ä l i t y s j ä r j e s t e l m ä + v ä l i t y s j ä r j e s t e l m ä s s ä + v ä l i t y s k a p a s i t e e t t i + v ä l i t y s k o m i t e a n + v ä l i t y s k u s t a n n u k s e t + v ä l i t y s l a u s e k k e e s t a + v ä l i t y s l i i k k e e n + v ä l i t y s m a h d o l l i s u u t t a + v ä l i t y s m e n e t t e l y + v ä l i t y s m e n e t t e l y j ä + v ä l i t y s m e n e t t e l y ä + v ä l i t y s p a l k k i o i s t a + v ä l i t y s p a l k k i o i t a + v ä l i t y s p a l v e l i n + v ä l i t y s p o n n i s t e l u j a + v ä l i t y s p r o s e s s i a + v ä l i t y s p y r k i m y k s i s s ä + v ä l i t y s p y r k i m y k s i s t ä + v ä l i t y s p y r k i m y k s i ä + v ä l i t y s p y r k i m y s t e n + v ä l i t y s r a t k a i s u + v ä l i t y s r a t k a i s u n + v ä l i t y s r o o l i s s a a n + v ä l i t y s s o p i m u k s e n + v ä l i t y s s o p i m u s + v ä l i t y s s u h d e + v ä l i t y s t e h t ä v i ä + v ä l i t y s t e h t ä v ä + v ä l i t y s t i e t o j e n + v ä l i t y s t o i m e t + v ä l i t y s t o i m i e n + v ä l i t y s t o i m i n n a s s a + v ä l i t y s t o i m i n t a a n + v ä l i t y s t o i m i s t o i s t a + v ä l i t y s t u o m i o i s t u i m e n + v ä l i t y s t u o m i o i s t u i m e s s a + v ä l i t y s t u o m i o i s t u i n + v ä l i t y s t u o m i o i s t u i n j ä r j e s t e l m ä n + v ä l i t y s t u o m i o t + v ä l i t y s t y ö t ä + v ä l i t y s y r i t y k s e t + v ä l i t y s y r i t y k s i ä + v ä l i t y s y r i t y s t e n + v ä l i t y s y r i t y s t ä + v ä l i t ä m m e + v ä l i t ä n + v ä l i t ä t t e + v ä l i t ö n t ä + v ä l i u u d i s t u s + v ä l i u u d i s t u s t a + v ä l i v a a l e j a + v ä l i v a a l i e n + v ä l i v a i h e + v ä l i v a i h e e k s i + v ä l i v a i h e e n + v ä l i v a i h e e n a + v ä l i v a i h e e s e e n + v ä l i v a i h e e s s a + v ä l i v a i h e e s t a + v ä l i v a i h e e t + v ä l i v a i h e i d e n + v ä l i v a i h e i s t a + v ä l i v a i h e i t a + v ä l i v a i h e t t a + v ä l i v a l t a i s i s t a + v ä l i v a r a s t o i n t i + v ä l i v a r a s t o i n t i i n + v ä l i v a r a s t o i n t i r a t k a i s u + v ä l i v a r a s t o i n t i r a t k a i s u i h i n + v ä l i v a r a s t o j a + v ä l i v a r a s t o o n + v ä l i v u o d e n a i k o j a + v ä l i v u o s i + v ä l i v y ö h y k e + v ä l j e m m i s s ä + v ä l j e m m ä t + v ä l j e m p i + v ä l j e m p i e n + v ä l j e m p i ä + v ä l j e n t y n e e n + v ä l j i ä + v ä l j y y d e n + v ä l k e k o r e n t o + v ä l k k y v ä t + v ä l t e l l y t + v ä l t e l l ä + v ä l t e l l ä k s e e n + v ä l t e t t i i n + v ä l t e t t y + v ä l t e t t ä i s i i n + v ä l t e t t ä v i s s ä + v ä l t e t y t + v ä l t e t ä ä n + v ä l t i m m e + v ä l t t e l e e + v ä l t t e l e m i s t ä + v ä l t t e l e m m e + v ä l t t e l e m ä ä n + v ä l t t e l e v ä t + v ä l t t e l e v ä ä + v ä l t t e l i + v ä l t t e l i v ä t + v ä l t t e l y n + v ä l t t e l y p o l i t i i k k a a + v ä l t t e l y t a k t i i k k a a + v ä l t t y i s i m m e + v ä l t t y m i s t ä + v ä l t t y n e e t + v ä l t t y ä + v ä l t t y ä k s e e n + v ä l t t y ä k s e m m e + v ä l t t ä e n + v ä l t t ä e s s ä m m e + v ä l t t ä i s i m m e + v ä l t t ä k ä ä m m e + v ä l t t ä m i s e e n + v ä l t t ä m i s e k s i + v ä l t t ä m i s e s t ä + v ä l t t ä m i s t ä + v ä l t t ä m ä l l ä + v ä l t t ä m ä t t ö m i e n + v ä l t t ä m ä t t ö m i i n + v ä l t t ä m ä t t ö m i k s i + v ä l t t ä m ä t t ö m i l l e + v ä l t t ä m ä t t ö m i m m ä n + v ä l t t ä m ä t t ö m i m m ä s t ä + v ä l t t ä m ä t t ö m i m m ä t + v ä l t t ä m ä t t ö m i m p i i n + v ä l t t ä m ä t t ö m i m p i ä + v ä l t t ä m ä t t ö m i m p ä ä n + v ä l t t ä m ä t t ö m i n + v ä l t t ä m ä t t ö m i n ä + v ä l t t ä m ä t t ö m i s s ä + v ä l t t ä m ä t t ö m i s t ä + v ä l t t ä m ä t t ö m i ä + v ä l t t ä m ä t t ö m y y d e s t ä + v ä l t t ä m ä t t ö m y y d e t + v ä l t t ä m ä t t ö m y y k s i n ä + v ä l t t ä m ä t t ö m y y k s i ä + v ä l t t ä m ä t t ö m y y s e l i n t a r v i k k e i d e n + v ä l t t ä m ä t t ö m y y s h y ö d y k k e e m m e + v ä l t t ä m ä t t ö m y y s h y ö d y k k e i d e n + v ä l t t ä m ä t t ö m y y s h y ö d y k k e i s i i n + v ä l t t ä m ä t t ö m y y s s y i s t ä + v ä l t t ä m ä t t ö m y y s t a r v i k k e i s i i n + v ä l t t ä m ä t t ö m y y s t a v a r o i d e n + v ä l t t ä m ä t t ö m y y t t ä + v ä l t t ä m ä t t ö m ä k s i + v ä l t t ä m ä t t ö m ä l l e + v ä l t t ä m ä t t ö m ä l t ä + v ä l t t ä m ä t t ö m ä m m ä k s i + v ä l t t ä m ä t t ö m ä m m ä l t ä + v ä l t t ä m ä t t ö m ä m m ä n + v ä l t t ä m ä t t ö m ä m p i + v ä l t t ä m ä t t ö m ä m p i ä + v ä l t t ä m ä t t ö m ä m p ä ä + v ä l t t ä m ä t t ö m ä n + v ä l t t ä m ä t t ö m ä n ä + v ä l t t ä m ä t t ö m ä s s ä + v ä l t t ä m ä t t ö m ä s t ä + v ä l t t ä m ä t t ö m ä t + v ä l t t ä m ä t t ö m ä ä n + v ä l t t ä m ä t ö n t ä + v ä l t t ä m ä ä n + v ä l t t ä n e e t + v ä l t t ä n y t + v ä l t t ä ä + v ä l t t ä ä k s e e n + v ä l t t ä ä k s e m m e + v ä l t t ä ä k s e n i + v ä l t t ä ä k s e n n e + v ä l t y m m e k ö + v ä l t y t t ä i s i i n + v ä l t y t ä ä n + v ä l t ä m m e + v ä l t ä t t e + v ä r e j ä + v ä r i a b e r r a a t i o + v ä r i a i n e + v ä r i a i n e e t + v ä r i a i n e i d e n + v ä r i a i n e i n + v ä r i a i n e i t a + v ä r i a i s t i + v ä r i a n a l y y s i + v ä r i a v a r u u s + v ä r i e l o k u v a + v ä r i e r o + v ä r i e r o j a + v ä r i k a l l i o + v ä r i k k ä i m m i s t ä + v ä r i k k ä ä m m i n + v ä r i k k ä ä m m ä n + v ä r i k k ä ä m p i + v ä r i k o o d e i n + v ä r i k o o d e i s t a + v ä r i k o o d e j a + v ä r i k o o d i + v ä r i k o o d i a + v ä r i k o o d i i n + v ä r i k o o d i j ä r j e s t e l m ä + v ä r i k o o d i j ä r j e s t e l m ä n + v ä r i k o o d i j ä r j e s t e l m ä s t ä + v ä r i k o o d i j ä r j e s t e l m ä ä + v ä r i k o o d i j ä r j e s t e l m ä ä n + v ä r i k o o d i m e r k i n n ä t + v ä r i k o o d i m e r k i n t ö j ä + v ä r i k o o d i t + v ä r i k o p i o k o n e e l l a + v ä r i k u v i a + v ä r i l a n k a + v ä r i l ä i s k i ä + v ä r i l ä m p ö t i l a + v ä r i m a t a r a + v ä r i m e r k i n n ä l l ä + v ä r i m e r k i n t ö j ä + v ä r i m i t t a r i + v ä r i m o r s i n k o + v ä r i n t o i s t o i n d e k s i + v ä r i n v a l i n t a + v ä r i o p p i + v ä r i p i g m e n t t i + v ä r i r e k i s t e r ö i n t i + v ä r i r e s e d a + v ä r i r o t u + v ä r i s e m ä t t ä + v ä r i s i ä + v ä r i s o k e u s + v ä r i s y t t i + v ä r i s y v y y s + v ä r i t + v ä r i t i l a + v ä r i t t ä v ä t + v ä r i t y s k i r j a + v ä r i v a l o k u v i e n + v ä r i v a l o k u v i i n + v ä r i v a r a u s + v ä r i y m p y r ä + v ä r i ä + v ä r j ä r i n u o l i m y r k k y s a m m a k k o + v ä r j ä t t y j ä + v ä r j ä t ä ä n + v ä r t t i n ä h e r m o + v ä r v ä y t y m ä ä n + v ä r ä h t e l y p i i r i + v ä r ä h t e l y t a s o j a + v ä s y m y k s e s t ä + v ä s y m y s o i r e y h t y m ä + v ä s y m y s s y n d r o o m a + v ä s y m y s s y n d r o o m a a n + v ä s y m y s s y n d r o o m a n + v ä s y m y s t i l a s s a + v ä s y m y s t ä + v ä s y m ä t t ä + v ä s y m ä t t ö m i s t ä + v ä s y m ä t t ö m ä l l e + v ä s y m ä ä n + v ä s y n + v ä s y n e e n ä + v ä s y n e i t ä + v ä s y t t e + v ä s y t t ä v i ä + v ä v y p o i k a + v ä v y t + v ä y l i s t ä + v ä y l i ä + v ä y l ä a l u s + v ä y l ä h a n k k e e n + v ä y l ä i n v e s t o i n n e i s s a + v ä y l ä o l o s u h t e i s i i n + v ä y l ä t + v ä y l ä t i e d o t u s + v ä y l ä v a h i n g o t + v ä ä j ä ä m ä t t ö m i ä + v ä ä n n ö n + v ä ä n t ö j o u s i + v ä ä r e n n e t t y j e n + v ä ä r e n n e t t y j ä + v ä ä r e n n e t t y y n + v ä ä r e n n e t t y ä + v ä ä r e n n e t y i n + v ä ä r e n n e t y n + v ä ä r e n n e t y t + v ä ä r e n n e t ä ä n + v ä ä r e n n y k s i e n + v ä ä r e n n y k s i i n + v ä ä r e n n y k s i s t ä + v ä ä r e n n y s k o h d e + v ä ä r e n n y s m a h d o l l i s u u k s i i n + v ä ä r e n n y s m e n e t e l m i ä + v ä ä r e n n y s r i k o s t e n + v ä ä r e n n y s r i s k i i n + v ä ä r e n n y s t a p a u k s i a + v ä ä r e n n ö k s e t + v ä ä r e n n ö k s i e n + v ä ä r e n n ö k s i i n + v ä ä r e n n ö k s i l l e + v ä ä r e n n ö k s i l t ä + v ä ä r e n n ö k s i ä + v ä ä r e n n ö s a s i a n + v ä ä r e n n ö s k a u p p a a + v ä ä r e n n ö s m a r k k i n o i t a + v ä ä r e n n ö s s u o j a a n + v ä ä r e n n ö s t a p a u k s i e n + v ä ä r e n n ö s t e n + v ä ä r e n n ö s t e n v a s t a i s e n + v ä ä r e n t ä j i s t ä + v ä ä r e n t ä m i s e e n + v ä ä r e n t ä m i s e l t ä + v ä ä r e n t ä m i s e n + v ä ä r e n t ä m i s e n v a s t a i n e n + v ä ä r e n t ä m i s e n v a s t a i s e e n + v ä ä r e n t ä m i s e n v a s t a i s e n + v ä ä r e n t ä m i s e n v a s t a i s e s t a + v ä ä r e n t ä m i s e n v a s t a i s t a + v ä ä r e n t ä m i s e s t ä + v ä ä r e n t ä m i s i l m i ö + v ä ä r e n t ä m i s m a h d o l l i s u u k s i e n + v ä ä r e n t ä m i s o n g e l m a a + v ä ä r e n t ä m i s r i s k e j ä + v ä ä r e n t ä m i s r i s k i ä + v ä ä r e n t ä m i s t ä + v ä ä r e n t ä n y t + v ä ä r e n t ä ä + v ä ä r i e n + v ä ä r i i n + v ä ä r i l l e + v ä ä r i l l ä + v ä ä r i l t ä + v ä ä r i n k ä s i t y k s e e n + v ä ä r i n k ä s i t y k s e n + v ä ä r i n k ä s i t y k s e t + v ä ä r i n k ä s i t y k s i l t ä + v ä ä r i n k ä s i t y k s i s t ä + v ä ä r i n k ä s i t y k s i ä + v ä ä r i n k ä s i t y s + v ä ä r i n k ä s i t y s t e n + v ä ä r i n k ä s i t y s t ä + v ä ä r i n k ä y t e t ä ä n + v ä ä r i n k ä y t t i + v ä ä r i n k ä y t t ä j i e n + v ä ä r i n k ä y t t ä j i k s i + v ä ä r i n k ä y t t ä j i l l e + v ä ä r i n k ä y t t ä m ä ä n + v ä ä r i n k ä y t t ä ä + v ä ä r i n k ä y t t ö + v ä ä r i n k ä y t t ö j ä + v ä ä r i n k ä y t t ö m a h d o l l i s u u d e t + v ä ä r i n k ä y t t ö m a h d o l l i s u u k s i a + v ä ä r i n k ä y t t ö m a h d o l l i s u u s + v ä ä r i n k ä y t t ö n ä + v ä ä r i n k ä y t t ö t a p a u k s e t + v ä ä r i n k ä y t t ö t a p a u k s i a + v ä ä r i n k ä y t t ö t a p a u k s i s s a + v ä ä r i n k ä y t t ö ä + v ä ä r i n k ä y t t ö ö n + v ä ä r i n k ä y t ö i s t ä + v ä ä r i n k ä y t ö k s e l l ä + v ä ä r i n k ä y t ö k s e t + v ä ä r i n k ä y t ö k s i e n + v ä ä r i n k ä y t ö k s i i n + v ä ä r i n k ä y t ö k s i l l e + v ä ä r i n k ä y t ö k s i l t ä + v ä ä r i n k ä y t ö k s i s t ä + v ä ä r i n k ä y t ö k s i ä + v ä ä r i n k ä y t ö k s i ä ä n + v ä ä r i n k ä y t ö l l e + v ä ä r i n k ä y t ö l t ä + v ä ä r i n k ä y t ö n + v ä ä r i n k ä y t ö s + v ä ä r i n k ä y t ö s e p ä i l y i s t ä + v ä ä r i n k ä y t ö s o s a s t o j a + v ä ä r i n k ä y t ö s t a p a u k s i a + v ä ä r i n k ä y t ö s t a p a u k s i i n + v ä ä r i n k ä y t ö s t a p a u k s i s s a + v ä ä r i n k ä y t ö s t a p a u k s i s t a + v ä ä r i n k ä y t ö s t e n + v ä ä r i n k ä y t ö s t u t k i n n o i s t a + v ä ä r i n k ä y t ö s t ä + v ä ä r i n k ä y t ö t + v ä ä r i n t u l k i n t a + v ä ä r i n t u l k i n t o j a + v ä ä r i n y m m ä r r y k s e n + v ä ä r i n y m m ä r r y k s e t + v ä ä r i n y m m ä r r y k s i i n + v ä ä r i n y m m ä r r y k s i ä + v ä ä r i n y m m ä r r y s + v ä ä r i s s ä + v ä ä r i s t e l t y j e n + v ä ä r i s t e l y i h i n + v ä ä r i s t i v ä t + v ä ä r i s t y i s i + v ä ä r i s t y m i e n + v ä ä r i s t y m i s e e n + v ä ä r i s t y m i s e n + v ä ä r i s t y m i s e s t ä + v ä ä r i s t y m i s i ä + v ä ä r i s t y m i s t ä + v ä ä r i s t y m i ä + v ä ä r i s t y m ä t + v ä ä r i s t y m ä t t ö m ä n + v ä ä r i s t y m ä t t ö m ä s s ä + v ä ä r i s t y m ä ä + v ä ä r i s t y n e e s t ä + v ä ä r i s t y n e i t ä + v ä ä r i s t y n y t t ä + v ä ä r i s t ä i s i + v ä ä r i s t ä m i s e l l e + v ä ä r i s t ä m i s t ä + v ä ä r i s t ä m ä l l ä + v ä ä r i s t ä m ä t t ä + v ä ä r i s t ä m ä ä n + v ä ä r i s t ä v i s t ä + v ä ä r i s t ä v i ä + v ä ä r i s t ä v ä l l e + v ä ä r i s t ä v ä n + v ä ä r i s t ä v ä n ä + v ä ä r i s t ä v ä s t ä + v ä ä r i s t ä v ä t + v ä ä r i s t ä v ä ä + v ä ä r i s t ä ä + v ä ä r i ä + v ä ä r y y d e l l ä + v ä ä r y y d e n + v ä ä r y y d e s t ä + v ä ä r y y d e t + v ä ä r y y k s i e n + v ä ä r y y k s i i n + v ä ä r y y k s i ä + v ä ä r y y t t ä + v ä ä r ä k s i + v ä ä r ä l l e + v ä ä r ä l l ä + v ä ä r ä l t ä + v ä ä r ä n + v ä ä r ä n l a i s e n + v ä ä r ä n l a i s e n a + v ä ä r ä n l a i s e t + v ä ä r ä n l a i s i a + v ä ä r ä n l a i s i i n + v ä ä r ä n l a i s t a + v ä ä r ä n ä + v ä ä r ä s t ä + v ä ä r ä t + v ä ä r ä u s k o i s u u s k e s k u s t e l u u n + v ä ä r ä ä + v ä ä r ä ä n + v ö i t ä + w a l e s i l a i s e t + w a l e s i n + w a l e s i n k e t t u k o i r a + w a l e s i n p a i m e n k o i r a + w a l e s i n t e r r i e r i + w a l e s i s s a + w a m p a n o a g i t + w a s h i n g t o n i l a i s i a + w e b e r i i n + w e b e r i l l e + w e b e r i l l ä + w e b e r i n + w e b e r i ä + w e b h o t e l l i + w h i s k y n + w i c h i t a t + w i k i m e d i a + w i n n e b a g o t + w o l o f i t + x h o s a t + y d i n a i h e e s e e n + y d i n a i h e i s t a + y d i n a i k a k a u s i + y d i n a i n e + y d i n a i n e e n + y d i n a i n e e t + y d i n a i n e i d e n + y d i n a i n e i l t a + y d i n a i n e i t a + y d i n a i n e k s e n + y d i n a i n e s o p i m u k s i i n + y d i n a i n e v a l v o n t a + y d i n a j a t o l l a h i k s i + y d i n a j a t u k s e m m e + y d i n a j a t u k s e n i + y d i n a j a t u k s e s t a + y d i n a j a t u s + y d i n a l a + y d i n a l a a + y d i n a l a a n + y d i n a l a l l a + y d i n a l a l l a k i n + y d i n a l a l l e + y d i n a l a n + y d i n a l o i h i n + y d i n a l o i l l a + y d i n a l o i s t a + y d i n a l u e + y d i n a l u e e l l a + y d i n a l u e e s t a + y d i n a l u e e t + y d i n a l u e i d e n + y d i n a l u e i l l a + y d i n a l u e i l l e + y d i n a l u e i s i i n + y d i n a l u e i s i i n s a + y d i n a l u e i t a + y d i n a l u e t t a + y d i n a r s e n a a l i + y d i n a r s e n a a l i a a n + y d i n a r v o + y d i n a r v o i h i n + y d i n a r v o i s t a + y d i n a r v o j a + y d i n a r v o j a a n + y d i n a r v o j e n + y d i n a r v o n a + y d i n a r v o t + y d i n a s e + y d i n a s e a j a n + y d i n a s e a r s e n a a l i + y d i n a s e a r s e n a a l i a a n + y d i n a s e a r s e n a a l i e n + y d i n a s e a r s e n a a l i n + y d i n a s e a r s e n a a l i n s a + y d i n a s e a r s e n a a l i s t a a n + y d i n a s e e k s i + y d i n a s e e n + y d i n a s e e n s a + y d i n a s e e s t a + y d i n a s e e t + y d i n a s e e t o n + y d i n a s e e t o n t a + y d i n a s e e t t o m a k s i + y d i n a s e e t t o m a n + y d i n a s e e t t o m a s s a + y d i n a s e e t t o m a s t a + y d i n a s e e t t o m a t + y d i n a s e e t t o m i i n + y d i n a s e e t t o m i n a + y d i n a s e e t t o m i s t a + y d i n a s e h a a s t e e n + y d i n a s e h a n k i n n a t + y d i n a s e h a n k k e e s t a a n + y d i n a s e i d e n + y d i n a s e i d e n r i i s u n n a s t a + y d i n a s e i d e n r i i s u n t a a + y d i n a s e i d e n r i i s u n t a a n + y d i n a s e i d e n s a + y d i n a s e i l l a + y d i n a s e i l l e + y d i n a s e i l t a + y d i n a s e i n + y d i n a s e i n e e n + y d i n a s e i s i i n + y d i n a s e i s k u j a + y d i n a s e i s k u l l a + y d i n a s e i s s a + y d i n a s e i s t a a n + y d i n a s e i s t a r i i s u n n a n + y d i n a s e i s t a r i i s u n t a a + y d i n a s e i s t a u t u m i s e n + y d i n a s e i s t e t t u + y d i n a s e i s t u k s e n + y d i n a s e i s t u s + y d i n a s e i s t u s t a + y d i n a s e i t a + y d i n a s e i t a a n + y d i n a s e i t a m m e + y d i n a s e j ä r j e s t e l m i s s ä + y d i n a s e j ä r j e s t e l m ä + y d i n a s e j ä s e n v a l t i o t a + y d i n a s e k a p a s i t e e t i n + y d i n a s e k a p a s i t e e t i s t a + y d i n a s e k a p a s i t e e t t i + y d i n a s e k e h i t y s + y d i n a s e k e i n o k s i + y d i n a s e k e r h o n + y d i n a s e k e r h o o n + y d i n a s e k e s k u s t e l u j e n + y d i n a s e k i e l l o n + y d i n a s e k i e l t o a + y d i n a s e k i l p a i l u + y d i n a s e k i l p a v a r u s t e l u n + y d i n a s e k i l p a v a r u s t e l u u n + y d i n a s e k i l v a n + y d i n a s e k i l v a s t a + y d i n a s e k i r i s t y s t ä + y d i n a s e k o e k i e l l o n + y d i n a s e k o e k i e l t o + y d i n a s e k o k e e t + y d i n a s e k o k e i d e n + y d i n a s e k o k e i l u a + y d i n a s e k o k e i t a + y d i n a s e k o n f l i k t i a + y d i n a s e k o n f l i k t i n + y d i n a s e k y s y m y k s e e n + y d i n a s e k y s y m y k s e n + y d i n a s e k y s y m y s + y d i n a s e k y s y m y s t ä + y d i n a s e k ä y t t ö ö n + y d i n a s e m a h t e j a + y d i n a s e m a h t i a + y d i n a s e m a i d e n + y d i n a s e m a t e r i a a l i a + y d i n a s e m o n o p o l i + y d i n a s e o h j e l m a + y d i n a s e o h j e l m a a + y d i n a s e o h j e l m a a n + y d i n a s e o h j e l m a a n s a + y d i n a s e o h j e l m a l l a a n + y d i n a s e o h j e l m a n + y d i n a s e o h j e l m a n s a + y d i n a s e o h j e l m a s t a + y d i n a s e o h j e l m a s t a a n + y d i n a s e o h j e l m a t + y d i n a s e o h j e l m i a + y d i n a s e o h j e l m i a a n + y d i n a s e o h j e l m i s s a + y d i n a s e o h j e l m i s t a + y d i n a s e o h j e l m i s t a a n + y d i n a s e o n g e l m a a + y d i n a s e o n n e t t o m u u d e n + y d i n a s e o n n e t t o m u u s + y d i n a s e o s a a m i n e n + y d i n a s e p a k e t t i a + y d i n a s e p e l i l l ä + y d i n a s e p e l o t e + y d i n a s e p o l i t i i k k a a n s a + y d i n a s e r i i s u n n a n + y d i n a s e r i i s u n n a s s a + y d i n a s e r i i s u n n a s t a + y d i n a s e r i i s u n t a + y d i n a s e r i i s u n t a a + y d i n a s e r i i s u n t a a n + y d i n a s e r i i s u n t a k y s y m y k s e e n + y d i n a s e r i i s u n t a n e u v o t t e l u t + y d i n a s e r i i s u n t a o h j e l m a a + y d i n a s e s a t e e n v a r j o i l l a + y d i n a s e s e l k k a u k s e k s i + y d i n a s e s e l k k a u s t a + y d i n a s e s o t a + y d i n a s e s t r a t e g i a + y d i n a s e s u l k u + y d i n a s e t a r k a s t u k s e t + y d i n a s e t a r k o i t u k s i i n + y d i n a s e t a v o i t t e i s t a a n + y d i n a s e t a v o i t t e i t a + y d i n a s e t e k n o l o g i a a + y d i n a s e t e k n o l o g i a n + y d i n a s e t e o l l i s u u d e n + y d i n a s e t e r r o r i s m i n + y d i n a s e t i e t o j e n + y d i n a s e t i l a n n e + y d i n a s e t t a + y d i n a s e t u k i k o h d a n + y d i n a s e t u t k i j o i l t a + y d i n a s e t u t k i j o i s t a + y d i n a s e t y y p p i e n + y d i n a s e u h k a n a + y d i n a s e v a i h t o e h d o i s t a + y d i n a s e v a i h t o e h d o n + y d i n a s e v a i h t o e h d o t + y d i n a s e v a i h t o e h t o + y d i n a s e v a k o i l u + y d i n a s e v a l l a k s i + y d i n a s e v a l l a n + y d i n a s e v a l l a t + y d i n a s e v a l l o i l l e + y d i n a s e v a l m i u k s i a a n + y d i n a s e v a l m i u s + y d i n a s e v a l m i u t e m m e + y d i n a s e v a l t a + y d i n a s e v a l t a a + y d i n a s e v a l t a n a + y d i n a s e v a l t i o + y d i n a s e v a l t i o i d e n + y d i n a s e v a l t i o i h i n + y d i n a s e v a l t i o i l l a + y d i n a s e v a l t i o i l l e + y d i n a s e v a l t i o i s s a + y d i n a s e v a l t i o i s t a + y d i n a s e v a l t i o i t a + y d i n a s e v a l t i o k s i + y d i n a s e v a l t i o n + y d i n a s e v a l t i o n a + y d i n a s e v a l t i o s s a + y d i n a s e v a l t i o t + y d i n a s e v a l t o i h i n + y d i n a s e v a l t o j a + y d i n a s e v a l t o j e n + y d i n a s e v a p a a t a + y d i n a s e v a r a s t o + y d i n a s e v a r a s t o j a + y d i n a s e v a r a s t o j e n + y d i n a s e v a r a s t o n s a + y d i n a s e v a r a s t o t + y d i n a s e v a r u s t e l u + y d i n a s e v a r u s t e l u a + y d i n a s e v a r u s t e l u a a n + y d i n a s e v a r u s t e l u k i l p a + y d i n a s e v a r u s t e l u k i l v a n + y d i n a s e v o i m a t + y d i n a s e v o i m i s t a + y d i n a s i a + y d i n a s i a a + y d i n a s i a a n + y d i n a s i a n + y d i n a s i a n a + y d i n a s i a n t u n t i j a + y d i n a s i a n t u n t i j o i d e n + y d i n a s i a s s a + y d i n a s i a s t a + y d i n a s i o i h i n + y d i n a s i o i s s a + y d i n a s i o i s t a + y d i n a s i o i t a + y d i n e n e r g i a + y d i n e n e r g i a a + y d i n e n e r g i a a n + y d i n e n e r g i a f o o r u m i + y d i n e n e r g i a f o o r u m i n + y d i n e n e r g i a h a n k k e i l l e + y d i n e n e r g i a h u o l t o a + y d i n e n e r g i a i n f r a s t r u k t u u r i n + y d i n e n e r g i a j ä r j e s t ö n + y d i n e n e r g i a k a p a s i t e e t i n + y d i n e n e r g i a k e s k u s t e l u s s a + y d i n e n e r g i a k e t j u + y d i n e n e r g i a k y s y m y k s e t + y d i n e n e r g i a k y s y m y k s i i n + y d i n e n e r g i a l a i n o j a + y d i n e n e r g i a l a i n s ä ä d ä n t ö ä + y d i n e n e r g i a l l a + y d i n e n e r g i a l l e + y d i n e n e r g i a l t a + y d i n e n e r g i a l ä h t e e t + y d i n e n e r g i a l ä h t e i d e n + y d i n e n e r g i a l ä h t e i s t ä + y d i n e n e r g i a m a a + y d i n e n e r g i a m a r k k i n o i d e n + y d i n e n e r g i a m a t e r i a a l i e n + y d i n e n e r g i a m y ö n t e i n e n + y d i n e n e r g i a n + y d i n e n e r g i a n t u o t a n n o s t a + y d i n e n e r g i a n t u o t a n t o a + y d i n e n e r g i a o h j e l m a a + y d i n e n e r g i a o h j e l m a a n + y d i n e n e r g i a o h j e l m a n + y d i n e n e r g i a o h j e l m a s s a a n + y d i n e n e r g i a o h j e l m i e n + y d i n e n e r g i a o n g e l m a a + y d i n e n e r g i a p a k e t i n + y d i n e n e r g i a p a k e t t i a + y d i n e n e r g i a p o l i t i i k a n + y d i n e n e r g i a p o l i t i i k a s t a a n + y d i n e n e r g i a p o l i t i i k k a + y d i n e n e r g i a p o l i t i i k k a a + y d i n e n e r g i a p r o j e k t i e n + y d i n e n e r g i a s o p i m u k s i a + y d i n e n e r g i a s o p i m u s + y d i n e n e r g i a s s a + y d i n e n e r g i a s t a + y d i n e n e r g i a s t r a t e g i a + y d i n e n e r g i a s t r a t e g i a a n s a + y d i n e n e r g i a s t r a t e g i a n + y d i n e n e r g i a s t r a t e g i o i t a a n + y d i n e n e r g i a t e k n o l o g i a n + y d i n e n e r g i a t e o l l i s u u d e l l a + y d i n e n e r g i a t e o l l i s u u d e l l e + y d i n e n e r g i a t e o l l i s u u d e n + y d i n e n e r g i a t e o l l i s u u s + y d i n e n e r g i a t e o l l i s u u t t a + y d i n e n e r g i a t o i m i n n a n + y d i n e n e r g i a t u o t a n n o s s a + y d i n e n e r g i a t u o t a n t o + y d i n e n e r g i a t u o t a n t o o n + y d i n e n e r g i a t u t k i m u k s e e n + y d i n e n e r g i a t u t k i m u k s e l l e + y d i n e n e r g i a t u t k i m u k s e s s a + y d i n e n e r g i a v a l t i o + y d i n e n e r g i a v e r o a + y d i n e n e r g i a v i r a n o m a i s t e n + y d i n e s t i m o i n t i + y d i n f i s s i o + y d i n f i s s i o e n e r g i a + y d i n f i s s i o e n e r g i a a + y d i n f i s s i o e n e r g i a n + y d i n f i s s i o n + y d i n f i s s i o p o l i t i i k a n + y d i n f i s s i o r e a k t o r i e n + y d i n f i s s i o t a + y d i n f u u s i o + y d i n f u u s i o h a n k k e e s e e n + y d i n f u u s i o l l a + y d i n f u u s i o n + y d i n f u u s i o o n + y d i n f u u s i o r e a k t o r e i d e n + y d i n f u u s i o r e a k t o r i a + y d i n f u u s i o r e a k t o r i i n + y d i n f u u s i o r e a k t o r i n + y d i n f u u s i o r e a k t o r i s t a + y d i n f u u s i o s t a + y d i n f u u s i o t a + y d i n f u u s i o t e k n o l o g i o i t a + y d i n f u u s i o t u t k i m u k s e e n + y d i n f u u s i o t u t k i m u s + y d i n f u u s i o t u t k i m u s k e s k u k s e n + y d i n f u u s i o t u t k i m u s t a + y d i n f y s i i k k a + y d i n f y y s i k o i t a a n + y d i n h a a s t e + y d i n h a n k e + y d i n h a n k e t t a + y d i n h e n k i l ö s t ö n + y d i n h e n k i l ö s t ö s t ä ä n + y d i n h i r v i ö i d e n + y d i n h y ö k k ä y k s i l t ä + y d i n i n f l a a t i o + y d i n i n f l a a t i o o n + y d i n i s k u v o i m a a n + y d i n j a t k e + y d i n j o u k k o + y d i n j o u k k o o n + y d i n j o u k o k s i + y d i n j ä t e + y d i n j ä t e d i r e k t i i v i s t ä + y d i n j ä t e h u o l l o n + y d i n j ä t e h u o l l o s s a + y d i n j ä t e h u o l l o s t a + y d i n j ä t e h u o l t o + y d i n j ä t e h u o l t o a + y d i n j ä t e h u o l t o o n + y d i n j ä t e k u l j e t u s t e n + y d i n j ä t e l a s t i + y d i n j ä t e o n g e l m a a n + y d i n j ä t e o n g e l m a n + y d i n j ä t e p o l t t o a i n e k u l j e t u s t a + y d i n j ä t e p o l t t o a i n e t t a + y d i n j ä t e t t ä + y d i n j ä t e t t ä ä n + y d i n j ä t e v a r a s t o j a + y d i n j ä t e v a r a s t o j e n + y d i n j ä t e v a u n u j a + y d i n j ä t e v u o r i a + y d i n j ä t t e e l l e + y d i n j ä t t e e n + y d i n j ä t t e e s e e n + y d i n j ä t t e e s t ä + y d i n j ä t t e e s t ä ä n + y d i n j ä t t e e t + y d i n j ä t t e i d e n + y d i n j ä t t e i l l e + y d i n j ä t t e i l l ä + y d i n j ä t t e i l t ä + y d i n j ä t t e i s i i n + y d i n j ä t t e i s t ä + y d i n j ä t t e i t ä + y d i n k a p a s i t e e t i n + y d i n k a p a s i t e e t t i a + y d i n k a p a s i t e e t t i i n + y d i n k a t a s t r o f e j a + y d i n k a t a s t r o f i + y d i n k a t a s t r o f i a + y d i n k a t a s t r o f i l l e + y d i n k a t a s t r o f i n + y d i n k a t a s t r o f i s s a + y d i n k a t a s t r o f i s t a + y d i n k a u p u n g i t + y d i n k i e l t o s o p i m u k s e n + y d i n k i e l t o s o p i m u s + y d i n k i i s t a + y d i n k i i s t a a n + y d i n k o e + y d i n k o e a l u e + y d i n k o e k i e l l o n + y d i n k o e k i e l t o + y d i n k o e k i e l t o a + y d i n k o e k i e l t o s o p i m u k s e e n + y d i n k o e k i e l t o s o p i m u k s e l l e + y d i n k o e k i e l t o s o p i m u k s e n + y d i n k o e k i e l t o s o p i m u s + y d i n k o e k i e l t o s o p i m u s t a + y d i n k o e r ä j ä y t y k s e t + y d i n k o e r ä j ä y t y k s i i n + y d i n k o e r ä j ä y t y k s i s t ä + y d i n k o e t t a + y d i n k o h d a t + y d i n k o h d i s s a + y d i n k o h d i s t a + y d i n k o h t a + y d i n k o h t i a + y d i n k o k e e n + y d i n k o k e e n s a + y d i n k o k e e s t a + y d i n k o k e e t + y d i n k o k e i d e n + y d i n k o k e i s i i n + y d i n k o k e i s s a + y d i n k o k e i s t a + y d i n k o k e i t a + y d i n k o k e i t a a n + y d i n k r i i s i + y d i n k r i i s i i n + y d i n k r i i s i n + y d i n k r i i s i s s ä + y d i n k r i i s i ä + y d i n k u l j e t u k s e t + y d i n k u l j e t u k s i s t a + y d i n k y s y m y k s e n + y d i n k y s y m y k s e n ä + y d i n k y s y m y k s e s s ä + y d i n k y s y m y k s e s t ä + y d i n k y s y m y k s e t + y d i n k y s y m y k s i i n + y d i n k y s y m y k s i s s ä + y d i n k y s y m y k s i s t ä + y d i n k y s y m y k s i ä + y d i n k y s y m y s + y d i n k y s y m y s t e n + y d i n k y s y m y s t ä + y d i n k ä r j i l l ä + y d i n k ä r k e n s ä + y d i n k ä r k e ä + y d i n k ä r k i + y d i n k ä r k i e n + y d i n k ä r k i ä + y d i n k ä s i t t e e s e e n + y d i n k ä y t t ö i n e n + y d i n k ä y t t ö i s e n + y d i n l a i n s ä ä d ä n t ö + y d i n l a i t o k s e n + y d i n l a i t o k s e t + y d i n l a i t o k s i a + y d i n l a i t o k s i i n + y d i n l a i t o k s i i n s a + y d i n l a i t o k s i l l e + y d i n l a i t o k s i s s a + y d i n l a i t o k s i s t a + y d i n l a i t o s + y d i n l a i t o s t a + y d i n l a i t o s t e m m e + y d i n l a i t o s t e n + y d i n l a i t o s t e n s a + y d i n l a i t o s t u r v a l l i s u u d e n + y d i n l a i t o s t u r v a l l i s u u d e s t a + y d i n l a i t t e e n + y d i n l a i t t e i d e n + y d i n l a i t t e i l l a + y d i n l a i t t e i s t o j a + y d i n l a i t t e i t a a n + y d i n l a s k e u m a + y d i n l i i k e t o i m i n n o i s t a + y d i n l i i k e t o i m i n t a a n + y d i n m a a t + y d i n m a g n e e t t i n e n + y d i n m a i d e n + y d i n m a i t a + y d i n m a t e r i a a l e i h i n + y d i n m a t e r i a a l i + y d i n m a t e r i a a l i a + y d i n m a t e r i a a l i a s i a s t a + y d i n m a t e r i a a l i e n + y d i n m a t e r i a a l i i n + y d i n m a t e r i a a l i k u l j e t u k s e t + y d i n m a t e r i a a l i k u l j e t u s t e n + y d i n m a t e r i a a l i l l a + y d i n m a t e r i a a l i l l e + y d i n m a t e r i a a l i n + y d i n m a t e r i a a l i s t a + y d i n m a t e r i a a l i t + y d i n m a t e r i a a l i t a p a u k s i s t a + y d i n m a t e r i a a l i t a p a u s + y d i n m a t e r i a a l i v a l v o n n a n + y d i n m a t e r i a a l i v a l v o n t a + y d i n m a t e r i a a l i v a l v o n t a a + y d i n m a t e r i a a l i v a l v o n t a s o p i m u k s e n + y d i n o h j e l m a + y d i n o h j e l m a a + y d i n o h j e l m a a n + y d i n o h j e l m a a n s a + y d i n o h j e l m a k y s y m y k s e e n + y d i n o h j e l m a k y s y m y k s e n + y d i n o h j e l m a k y s y m y k s e s t ä + y d i n o h j e l m a k y s y m y s t ä + y d i n o h j e l m a l l a + y d i n o h j e l m a l l a a n + y d i n o h j e l m a l l e + y d i n o h j e l m a n + y d i n o h j e l m a n s a + y d i n o h j e l m a s s a + y d i n o h j e l m a s t a + y d i n o h j e l m a s t a a n + y d i n o h j e l m a t + y d i n o h j e l m a t o i m i n n a n + y d i n o h j e l m i a + y d i n o h j e l m i e n + y d i n o h j e l m i i n + y d i n o h j e l m i s t a + y d i n o h j u s i s k u v e r k o s t o + y d i n o n g e l m a + y d i n o n g e l m a a + y d i n o n g e l m a a n + y d i n o n g e l m a n + y d i n o n g e l m a n a + y d i n o n g e l m i a + y d i n o n g e l m i i n + y d i n o n n e t t o m u u d e l l a + y d i n o n n e t t o m u u d e l t a + y d i n o n n e t t o m u u d e n + y d i n o n n e t t o m u u d e s t a + y d i n o n n e t t o m u u d e t + y d i n o n n e t t o m u u k s i a + y d i n o n n e t t o m u u k s i e n + y d i n o n n e t t o m u u k s i s t a + y d i n o n n e t t o m u u s + y d i n o n n e t t o m u u t e e n + y d i n o n n e t t o m u u t t a + y d i n o r g a s m i a + y d i n o s a + y d i n o s a a j a t + y d i n o s a a m i n e n + y d i n o s a a m i s t a + y d i n o s i a + y d i n o s i s s a + y d i n p a k e t i n + y d i n p a k e t i s t a + y d i n p a k e t t i + y d i n p a k e t t i a + y d i n p a l v e l u i h i n + y d i n p a r i s t o + y d i n p e l o t e s t r a t e g i a a n + y d i n p e l o t e v o i m a + y d i n p e l o t t e e s e e n s a + y d i n p e l o t t e e s t a + y d i n p e r h e + y d i n p e r h e e n + y d i n p e r h e e s e e n + y d i n p e r h e e s s ä + y d i n p e r h e e s t ä + y d i n p e r h e e t + y d i n p e r h e t t ä + y d i n p e r i a a t e + y d i n p e r i a a t e t t a + y d i n p e r i a a t t e e t + y d i n p e r i a a t t e i l l a + y d i n p e r i a a t t e i s t a + y d i n p e r i a a t t e i t a + y d i n p o l i t i i k a n + y d i n p o l i t i i k k a + y d i n p o l i t i i k k a a + y d i n p o l t t o a i n e + y d i n p o l t t o a i n e e l l e + y d i n p o l t t o a i n e e n + y d i n p o l t t o a i n e e s e e n + y d i n p o l t t o a i n e e s t a + y d i n p o l t t o a i n e e t + y d i n p o l t t o a i n e i d e n + y d i n p o l t t o a i n e i s i i n + y d i n p o l t t o a i n e i s t a + y d i n p o l t t o a i n e i s t a m m e + y d i n p o l t t o a i n e k e t j u n + y d i n p o l t t o a i n e k i e r r o n + y d i n p o l t t o a i n e k i e r r o s t a + y d i n p o l t t o a i n e k i e r t o + y d i n p o l t t o a i n e k i e r t o a + y d i n p o l t t o a i n e k i e r t o o n + y d i n p o l t t o a i n e p a n k k i + y d i n p o l t t o a i n e p e l l e t t e j ä + y d i n p o l t t o a i n e r e a k t o r i + y d i n p o l t t o a i n e s a u v o j a + y d i n p o l t t o a i n e s o p i m u s t e n + y d i n p o l t t o a i n e s ä i l i ö i d e n + y d i n p o l t t o a i n e t e k n o l o g i a a + y d i n p o l t t o a i n e t t a + y d i n p o m m e i l l a + y d i n p o m m e j a + y d i n p o m m i + y d i n p o m m i a + y d i n p o m m i a k i n + y d i n p o m m i e n + y d i n p o m m i l l a + y d i n p o m m i l l e + y d i n p o m m i n + y d i n p o m m i s s a + y d i n p o m m i s s a a n + y d i n p o m m i t + y d i n p o t e n t i a a l i + y d i n p r o b l e m a t i i k k a a + y d i n p u i s t o + y d i n p ä ä t e l m ä ä n + y d i n r a k e n t e e n + y d i n r e a k t i o + y d i n r e a k t o r e i d e n + y d i n r e a k t o r e i h i n + y d i n r e a k t o r e i l l a + y d i n r e a k t o r e i l l e + y d i n r e a k t o r e i s s a + y d i n r e a k t o r e i s t a + y d i n r e a k t o r e i t a + y d i n r e a k t o r e i t a a n + y d i n r e a k t o r e j a + y d i n r e a k t o r i + y d i n r e a k t o r i a + y d i n r e a k t o r i e n + y d i n r e a k t o r i h a n k k e e n + y d i n r e a k t o r i i n + y d i n r e a k t o r i l t a + y d i n r e a k t o r i m a l l i a + y d i n r e a k t o r i n + y d i n r e a k t o r i o n n e t t o m u u d e s t a + y d i n r e a k t o r i s t a + y d i n r e a k t o r i s u o j a + y d i n r e a k t o r i t + y d i n r e a k t o r i y k s i k k ö j e n + y d i n r i s k e i h i n + y d i n r i s k i e n + y d i n r i s k i n + y d i n r i s k i t + y d i n r y h m i ä + y d i n r y h m ä + y d i n r y h m ä l l ä + y d i n r y h m ä n + y d i n r y h m ä n i + y d i n r y h m ä ä n + y d i n r ä j ä h d y k s e l l ä + y d i n r ä j ä h d y k s e n + y d i n r ä j ä h d y k s e t + y d i n r ä j ä h d y s p i l v e ä + y d i n r ä j ä h t e i d e n + y d i n r ä j ä y t y k s e t + y d i n s a a s t e i d e n + y d i n s a a s t e i t a + y d i n s a a s t e o n g e l m a n + y d i n s a n o m a + y d i n s e i k k a + y d i n s e i k k o j a + y d i n s e k t o r i a + y d i n s e k t o r i l l e + y d i n s i s ä l t ö + y d i n s i s ä l t ö ö n + y d i n s k a n d a a l i + y d i n s o d a k s i + y d i n s o d a n + y d i n s o d a s t a + y d i n s o p i m u k s e e n + y d i n s o p i m u k s e n + y d i n s o p i m u k s e t + y d i n s o p i m u s l u o n n o k s e n + y d i n s o p i m u s t e n + y d i n s o t a + y d i n s o t a a + y d i n s o t a a n + y d i n s o v e l l u k s i s t a + y d i n s o v e l l u s t e n + y d i n s t r a t e g i a + y d i n s t r a t e g i a a + y d i n s u k e l l u s v e n e + y d i n s u k e l l u s v e n e e l l ä + y d i n s u k e l l u s v e n e e n + y d i n s u k e l l u s v e n e e s t ä + y d i n s u k e l l u s v e n e e t + y d i n s u k e l l u s v e n e i d e n + y d i n s u k e l l u s v e n e i s i i n + y d i n s u k e l l u s v e n e i s t ä + y d i n s u k e l l u s v e n e i s t ä ä n + y d i n s u k e l l u s v e n e o n n e t t o m u u d e t + y d i n s u k e l l u s v e n e o n n e t t o m u u k s i s t a + y d i n s u k e l l u s v e n e t t ä + y d i n s u k e l l u s v e n e t u k i k o h t a a + y d i n s u l k u + y d i n s u l k u a + y d i n s u l k u j ä r j e s t e l m ä + y d i n s u l k u j ä r j e s t e l m ä l l e + y d i n s u l k u j ä r j e s t e l m ä n + y d i n s u l k u j ä r j e s t e l m ä ä + y d i n s u l k u j ä r j e s t e l m ä ä n + y d i n s u l k u k o n f e r e n s s i s s a + y d i n s u l k u k y s y m y k s e t + y d i n s u l k u p e r i a a t e t t a + y d i n s u l k u s o p i m u k s e e n + y d i n s u l k u s o p i m u k s e l l e + y d i n s u l k u s o p i m u k s e n + y d i n s u l k u s o p i m u k s e s s a + y d i n s u l k u s o p i m u k s e s t a + y d i n s u l k u s o p i m u k s e t + y d i n s u l k u s o p i m u s + y d i n s u l k u s o p i m u s t a + y d i n s u l k u s o p i m u s t a a n + y d i n s u l k u s o p i m u s t e n + y d i n s u l k u t o i m i a + y d i n s u l k u u n + y d i n s u l k u v a l t u u k s i a + y d i n s u l u l l e + y d i n s u l u n + y d i n s u l u s t a + y d i n s u u r v a l t a + y d i n s ä h k ö s t ä + y d i n s ä h k ö ä + y d i n s ä t e i l y l t ä + y d i n s ä t e i l y n + y d i n s ä ä n t ö j ä + y d i n t a l v i + y d i n t a p a t u r m a t i l a n t e i s s a + y d i n t a r k a s t u s l a i t o k s e n + y d i n t a v o i t e + y d i n t a v o i t t e e n a + y d i n t a v o i t t e i s i i n + y d i n t a v o i t t e i s t a m m e + y d i n t e h t ä v i i n + y d i n t e h t ä v i i n s ä + y d i n t e h t ä v i s t ä + y d i n t e h t ä v i ä + y d i n t e h t ä v i ä ä n + y d i n t e h t ä v ä n s ä + y d i n t e h t ä v ä n ä + y d i n t e h t ä v ä ä n + y d i n t e k n i i k a l l a + y d i n t e k n i i k a n + y d i n t e k n i i k a s s a + y d i n t e k n i i k a s t a + y d i n t e k n i i k k a + y d i n t e k n i i k k a a + y d i n t e k n i i k o i d e n + y d i n t e k n i n e n + y d i n t e k n o l o g i a + y d i n t e k n o l o g i a a + y d i n t e k n o l o g i a a n + y d i n t e k n o l o g i a l l a + y d i n t e k n o l o g i a n + y d i n t e k n o l o g i a s s a + y d i n t e k n o l o g i a s t a + y d i n t e k n o l o g i a y h t e i s t y ö t ä + y d i n t e k n o l o g i s e l l a + y d i n t e o l l i s u u d e l l a + y d i n t e o l l i s u u d e l l e + y d i n t e o l l i s u u d e n + y d i n t e o l l i s u u d e s s a + y d i n t e o l l i s u u d e s t a + y d i n t e o l l i s u u s + y d i n t e o l l i s u u s a l a l l a + y d i n t e o l l i s u u t e e n + y d i n t e o l l i s u u t e n s a + y d i n t e o l l i s u u t t a + y d i n t e r r o r i s m i + y d i n t e r r o r i s m i a + y d i n t o i m i n n o i s s a + y d i n t o i m i n t a a + y d i n t o i m i n t a a m m e + y d i n t o i m i n t a a n + y d i n t o i m i n t o i h i n + y d i n t o i m i n t o i h i n s a + y d i n t o i m i n t o j a + y d i n t o i m i n t o j e n s a + y d i n t o t u u s + y d i n t u h o l a i t t e e n + y d i n t u h o l l a + y d i n t u h o n + y d i n t u h o s t a + y d i n t u k i k o h t i a + y d i n t u l o k s e t + y d i n t u o t a n n o n + y d i n t u o t a n t o k a p a s i t e e t t i a + y d i n t u o t t e i d e n + y d i n t u r v a + y d i n t u r v a l l i s u u d e l l e + y d i n t u r v a l l i s u u d e n + y d i n t u r v a l l i s u u d e s s a + y d i n t u r v a l l i s u u d e s t a + y d i n t u r v a l l i s u u s + y d i n t u r v a l l i s u u s a l a + y d i n t u r v a l l i s u u s a l a n + y d i n t u r v a l l i s u u s a s i a s s a + y d i n t u r v a l l i s u u s a s i a s t a + y d i n t u r v a l l i s u u s d i r e k t i i v i + y d i n t u r v a l l i s u u s d i r e k t i i v i i n + y d i n t u r v a l l i s u u s d i r e k t i i v i n + y d i n t u r v a l l i s u u s d i r e k t i i v i s t ä + y d i n t u r v a l l i s u u s d i r e k t i i v i ä + y d i n t u r v a l l i s u u s h a n k k e e n + y d i n t u r v a l l i s u u s h a n k k e i l l e + y d i n t u r v a l l i s u u s h a n k k e i s i i n + y d i n t u r v a l l i s u u s h a n k k e i t a + y d i n t u r v a l l i s u u s h u i p p u k o k o u s + y d i n t u r v a l l i s u u s k i r j a n p i t o o n + y d i n t u r v a l l i s u u s k o o d e k s i + y d i n t u r v a l l i s u u s k o o d e k s i a + y d i n t u r v a l l i s u u s k u l t t u u r i a + y d i n t u r v a l l i s u u s k y s y m y k s e l l ä + y d i n t u r v a l l i s u u s k y s y m y k s e s t ä + y d i n t u r v a l l i s u u s k y s y m y k s e t + y d i n t u r v a l l i s u u s k y s y m y k s i i n + y d i n t u r v a l l i s u u s k y s y m y k s i s s ä + y d i n t u r v a l l i s u u s k y s y m y k s i s t ä + y d i n t u r v a l l i s u u s k y s y m y s + y d i n t u r v a l l i s u u s k y s y m y s t e n + y d i n t u r v a l l i s u u s k y s y m y s t ä + y d i n t u r v a l l i s u u s n o r m e i s t a + y d i n t u r v a l l i s u u s n o r m e j a + y d i n t u r v a l l i s u u s n o r m i e n + y d i n t u r v a l l i s u u s n o r m i t + y d i n t u r v a l l i s u u s o h j e l m a n + y d i n t u r v a l l i s u u s o n g e l m a s t a + y d i n t u r v a l l i s u u s o n g e l m a t + y d i n t u r v a l l i s u u s p a k e t t i + y d i n t u r v a l l i s u u s p o l i t i i k a n + y d i n t u r v a l l i s u u s p o l i t i i k k a + y d i n t u r v a l l i s u u s p o l i t i i k k a a + y d i n t u r v a l l i s u u s p r o j e k t e i l l a + y d i n t u r v a l l i s u u s p r o j e k t e j a + y d i n t u r v a l l i s u u s r a h a s t o a + y d i n t u r v a l l i s u u s r a h a s t o o n + y d i n t u r v a l l i s u u s r a h a t + y d i n t u r v a l l i s u u s s o p i m u s t e n + y d i n t u r v a l l i s u u s s t a n d a r d e i h i n + y d i n t u r v a l l i s u u s s t a n d a r d e j a + y d i n t u r v a l l i s u u s s t a n d a r d i t + y d i n t u r v a l l i s u u s s y i s t ä + y d i n t u r v a l l i s u u s s ä ä n n ö k s i l l ä + y d i n t u r v a l l i s u u s t a s o + y d i n t u r v a l l i s u u s t a s o j a + y d i n t u r v a l l i s u u s t e s t e j ä + y d i n t u r v a l l i s u u s t i l a n n e + y d i n t u r v a l l i s u u s v a a t i m u s t e n + y d i n t u r v a l l i s u u s v i r a n o m a i n e n + y d i n t u r v a l l i s u u s v i r a n o m a i s e t + y d i n t u r v a l l i s u u s v i r a n o m a i s i a + y d i n t u r v a l l i s u u s v i r a n o m a i s t e n + y d i n t u r v a l l i s u u s v ä l i n e e n + y d i n t u r v a l l i s u u s v ä l i n e i d e n + y d i n t u r v a l l i s u u s y h t e i s t y ö t ä + y d i n t u r v a l l i s u u s y h t e i s t y ö v ä l i n e e n + y d i n t u r v a l l i s u u t e e n + y d i n t u r v a l l i s u u t e m m e + y d i n t u r v a l l i s u u t t a + y d i n t u r v a r a h a s t o a + y d i n t u r v a r a h a s t o o n + y d i n t u r v a t t o m u u d e s t a + y d i n t u r v a v i r a n o m a i s i a + y d i n t u r v a v i r a n o m a i s t e n + y d i n t u r v a y h t e i s t y ö + y d i n t u r v a y h t e i s t y ö s s ä + y d i n t u t k i m u k s e e n + y d i n t u t k i m u k s e l l e + y d i n t u t k i m u k s e n + y d i n t u t k i m u k s e s t a + y d i n t u t k i m u s + y d i n t u t k i m u s b u d j e t t i + y d i n t u t k i m u s h a n k e t t a + y d i n t u t k i m u s h a n k k e i s i i n + y d i n t u t k i m u s o h j e l m a + y d i n t u t k i m u s o h j e l m a a n + y d i n t u t k i m u s o h j e l m a n + y d i n t u t k i m u s o h j e l m i i n + y d i n t u t k i m u s s o p i m u k s e n + y d i n t u t k i m u s t a + y d i n t y ö r y h m ä + y d i n t ä + y d i n u h k a + y d i n u h k a a + y d i n u h k a n + y d i n v a a t i m u k s e m m e + y d i n v a a t i m u k s e s s a + y d i n v a h i n g o i s t a + y d i n v a h i n g o t + y d i n v a i h t o e h t o + y d i n v a l l a k s i + y d i n v a l m i u d e l l a + y d i n v a l t a + y d i n v a l t i o i l t a + y d i n v a l t i o l l e + y d i n v a l t i o s s a + y d i n v a l t o i n a + y d i n v a l t o j a + y d i n v a l t u u k s i i n s a + y d i n v a l v o n n a s t a + y d i n v a l v o n t a + y d i n v a l v o n t a a + y d i n v a l v o n t a v i r a n o m a i s e n + y d i n v a l v o n t a v i r a n o m a i s t e n + y d i n v a r u s t e l u + y d i n v a r u s t e l u a + y d i n v a r u s t e l u k i l v a n + y d i n v a r u s t e l u l l e + y d i n v a s t u u n + y d i n v a s t u u s t a + y d i n v e l a s t a + y d i n v e r k k o + y d i n v e r k o s s a + y d i n v i e s t i + y d i n v i e s t i n + y d i n v o i m a + y d i n v o i m a a + y d i n v o i m a a n + y d i n v o i m a h a n + y d i n v o i m a h a n k e t t a + y d i n v o i m a h a n k k e e n + y d i n v o i m a h a n k k e e t + y d i n v o i m a h a n k k e i d e n + y d i n v o i m a h a n k k e i s i i n + y d i n v o i m a h a n k k e i t a + y d i n v o i m a i n f r a s t r u k t u u r i s t a + y d i n v o i m a k a p a s i t e e t i n + y d i n v o i m a k a p a s i t e e t i s t a + y d i n v o i m a k a t a s t r o f i + y d i n v o i m a k e l l o + y d i n v o i m a k e s k u s t e l u n + y d i n v o i m a k e s k u s t e l u s t a + y d i n v o i m a k i e l l o n + y d i n v o i m a k i i s t a s s a + y d i n v o i m a k y s y m y k s e e n + y d i n v o i m a k y s y m y k s e n + y d i n v o i m a k y s y m y k s e s s ä + y d i n v o i m a k y s y m y k s e s t ä + y d i n v o i m a k y s y m y k s i s t ä + y d i n v o i m a k y s y m y k s i ä + y d i n v o i m a k y s y m y s + y d i n v o i m a k y s y m y s t e n + y d i n v o i m a k y s y m y s t ä + y d i n v o i m a l a + y d i n v o i m a l a a + y d i n v o i m a l a a n + y d i n v o i m a l a h a n + y d i n v o i m a l a h a n k e t t a + y d i n v o i m a l a h a n k k e i d e n + y d i n v o i m a l a h a n k k e i s i i n + y d i n v o i m a l a i t o k s e e n + y d i n v o i m a l a i t o k s e l l a + y d i n v o i m a l a i t o k s e n + y d i n v o i m a l a i t o k s e s s a + y d i n v o i m a l a i t o k s e s t a + y d i n v o i m a l a i t o k s e t + y d i n v o i m a l a i t o k s i a + y d i n v o i m a l a i t o k s i a a n + y d i n v o i m a l a i t o k s i e n + y d i n v o i m a l a i t o k s i i n + y d i n v o i m a l a i t o k s i l l e + y d i n v o i m a l a i t o k s i s s a + y d i n v o i m a l a i t o k s i s t a + y d i n v o i m a l a i t o s + y d i n v o i m a l a i t o s h a n k k e i d e n + y d i n v o i m a l a i t o s k o m p l e k s i i n + y d i n v o i m a l a i t o s k o m p l e k s i n + y d i n v o i m a l a i t o s t a + y d i n v o i m a l a i t o s t e n + y d i n v o i m a l a i t o s t e n s a + y d i n v o i m a l a i t o s y h t i ö i d e n + y d i n v o i m a l a i t o s y k s i k k ö ä + y d i n v o i m a l a k a p a s i t e e t t i a a n + y d i n v o i m a l a k r i i s i + y d i n v o i m a l a k s i + y d i n v o i m a l a l a i t o s t a + y d i n v o i m a l a l l a + y d i n v o i m a l a l l e + y d i n v o i m a l a m m e + y d i n v o i m a l a n + y d i n v o i m a l a n k i n + y d i n v o i m a l a n s a + y d i n v o i m a l a o h j e l m a a n + y d i n v o i m a l a o n n e t t o m u u d e n + y d i n v o i m a l a o n n e t t o m u u d e s t a + y d i n v o i m a l a o n n e t t o m u u d e t + y d i n v o i m a l a o n n e t t o m u u k s i a + y d i n v o i m a l a o n n e t t o m u u k s i e n + y d i n v o i m a l a o n n e t t o m u u k s i s t a + y d i n v o i m a l a o n n e t t o m u u s + y d i n v o i m a l a o n n e t t o m u u t t a + y d i n v o i m a l a p r o j e k t i a + y d i n v o i m a l a s s a + y d i n v o i m a l a s t a + y d i n v o i m a l a s t a a n + y d i n v o i m a l a t + y d i n v o i m a l a t e o l l i s u u s + y d i n v o i m a l a t o i m i n t a + y d i n v o i m a l a t o i m i n t a a + y d i n v o i m a l a v i r a n o m a i s i l l e + y d i n v o i m a l l a + y d i n v o i m a l l a k i n + y d i n v o i m a l l e + y d i n v o i m a l o b b a a j a t + y d i n v o i m a l o b b a r i e n + y d i n v o i m a l o b b a r i t + y d i n v o i m a l o b b y + y d i n v o i m a l o i d e m m e + y d i n v o i m a l o i d e n + y d i n v o i m a l o i d e n s a + y d i n v o i m a l o i h i n + y d i n v o i m a l o i l l a + y d i n v o i m a l o i l l e + y d i n v o i m a l o i l l e k i n + y d i n v o i m a l o i s s a + y d i n v o i m a l o i s s a a n + y d i n v o i m a l o i s t a + y d i n v o i m a l o i s t a m m e + y d i n v o i m a l o i t a + y d i n v o i m a l o i t a a n + y d i n v o i m a m a h d o l l i s u u t t a k a a n + y d i n v o i m a m a i l l a + y d i n v o i m a m y ö n t e i s e n ä + y d i n v o i m a m ä ä r ä y k s i s t ä + y d i n v o i m a n + y d i n v o i m a n v a s t a i n e n + y d i n v o i m a n ä k ö k o h t i i n + y d i n v o i m a o h j e l m a + y d i n v o i m a o h j e l m a a + y d i n v o i m a o h j e l m a a n + y d i n v o i m a o h j e l m a a n s a + y d i n v o i m a o h j e l m a n + y d i n v o i m a o h j e l m a s t a + y d i n v o i m a o h j e l m i i n + y d i n v o i m a o n g e l m a n + y d i n v o i m a o n n e t t o m u u d e n + y d i n v o i m a o n n e t t o m u u d e t + y d i n v o i m a o n n e t t o m u u t t a + y d i n v o i m a p a k e t t i i n + y d i n v o i m a p a k k o m i e l l e + y d i n v o i m a p e l o s t a + y d i n v o i m a p e r i n t ö ö n + y d i n v o i m a p o l i t i i k a l l e + y d i n v o i m a p o l i t i i k a n + y d i n v o i m a p o l i t i i k k a + y d i n v o i m a p o l i t i i k k a a + y d i n v o i m a p o l i t i i k k a a n + y d i n v o i m a p y r k i m y k s i ä + y d i n v o i m a r a t k a i s u i h i n + y d i n v o i m a r e a k t o r e i t a + y d i n v o i m a r e a k t o r i a + y d i n v o i m a r e s u r s s i e m m e + y d i n v o i m a s e k t o r i l l a + y d i n v o i m a s e k t o r i n + y d i n v o i m a s i t o u m u k s e n + y d i n v o i m a s o p i m u k s i a + y d i n v o i m a s o p i m u k s i s t a + y d i n v o i m a s s a + y d i n v o i m a s t a + y d i n v o i m a s u u n n i t e l m i a + y d i n v o i m a s u u r v a l l a k s i + y d i n v o i m a t e k n i i k a n + y d i n v o i m a t e k n i i k k a a + y d i n v o i m a t e k n o l o g i a n + y d i n v o i m a t e k n o l o g i o i d e n + y d i n v o i m a t e o l l i s u u d e l l e + y d i n v o i m a t e o l l i s u u d e n + y d i n v o i m a t e o l l i s u u d e s s a + y d i n v o i m a t e o l l i s u u d e s t a + y d i n v o i m a t e o l l i s u u s + y d i n v o i m a t e o l l i s u u t t a + y d i n v o i m a t e o l l i s u u t t a a n + y d i n v o i m a t i l a n n e + y d i n v o i m a t o i m i n t o j e n + y d i n v o i m a t u o t a n n o n + y d i n v o i m a t u o t a n n o s t a + y d i n v o i m a t u r v a l l i s u u d e l l e + y d i n v o i m a t u r v a l l i s u u t e e n + y d i n v o i m a t u t k i m u k s e e n + y d i n v o i m a t u t k i m u k s e n + y d i n v o i m a t u t k i m u k s i a + y d i n v o i m a t u t k i m u s t a + y d i n v o i m a t y ö n t e k i j ö i l l ä + y d i n v o i m a u h k a a + y d i n v o i m a u n e l m i i n s a + y d i n v o i m a v a i h t o e h d o n + y d i n v o i m a v a i h t o e h t o + y d i n v o i m a v a i h t o e h t o a + y d i n v o i m a v a l t i o + y d i n v o i m a v a l t i o s s a + y d i n v o i m a v a l t i o t + y d i n v o i m a v a r a s t o j e n + y d i n v o i m a y h t e i s k u n n a n + y d i n v o i m a y h t e i s t y ö t ä + y d i n v o i m a y h t i ö i d e n + y d i n v o i m a y h t i ö n + y d i n v o i m a y k s i k ö i t ä + y d i n y h t e i s t y ö + y h d e k s i + y h d e k s ä k s i + y h d e k s ä l t ä + y h d e k s ä n h ä n t ä i n e n + y h d e k s ä n j ä s e n i s e n + y h d e k s ä n k u l m i o l u k u + y h d e k s ä n k y m m e n k e r t a i s t u m i s t a + y h d e k s ä n k y m m e n t ä y h d e k s ä n + y h d e k s ä n n e n + y h d e k s ä n n e s t ä + y h d e k s ä s s ä + y h d e k s ä s t ä + y h d e k s ä ä + y h d e l l e + y h d e l l ä + y h d e l l ä k ä ä n + y h d e l t ä + y h d e l t ä k ä ä n + y h d e n + y h d e n k ä ä n + y h d e n l a i s e s t a + y h d e n l a i s i a + y h d e n l a i s t a + y h d e n m u k a i s e k s i + y h d e n m u k a i s e l l a + y h d e n m u k a i s e m m a n + y h d e n m u k a i s e m m a s t a + y h d e n m u k a i s e m m a t + y h d e n m u k a i s e m m i k s i + y h d e n m u k a i s e m m i l l a + y h d e n m u k a i s e m m i n + y h d e n m u k a i s e m m i s t a + y h d e n m u k a i s e m p a a + y h d e n m u k a i s e m p a a n + y h d e n m u k a i s e m p i + y h d e n m u k a i s e m p i a + y h d e n m u k a i s e n + y h d e n m u k a i s e s t a + y h d e n m u k a i s e t + y h d e n m u k a i s i a + y h d e n m u k a i s i i n + y h d e n m u k a i s i l l a + y h d e n m u k a i s i n + y h d e n m u k a i s t a a + y h d e n m u k a i s t a a k s e e n + y h d e n m u k a i s t a a k s e m m e + y h d e n m u k a i s t a e s s a m m e + y h d e n m u k a i s t a k a a m m e + y h d e n m u k a i s t a m a a n + y h d e n m u k a i s t a m a l l a + y h d e n m u k a i s t a m a s s a + y h d e n m u k a i s t a m a t t o m a n + y h d e n m u k a i s t a m a t t o m i e n + y h d e n m u k a i s t a m a t t o m i s t a + y h d e n m u k a i s t a m i n e n + y h d e n m u k a i s t a m i s a a l t o a + y h d e n m u k a i s t a m i s a r t i k l a + y h d e n m u k a i s t a m i s a s i a s s a + y h d e n m u k a i s t a m i s d i r e k t i i v i + y h d e n m u k a i s t a m i s d i r e k t i i v i e n + y h d e n m u k a i s t a m i s d i r e k t i i v i n + y h d e n m u k a i s t a m i s d i r e k t i i v i t + y h d e n m u k a i s t a m i s e e n + y h d e n m u k a i s t a m i s e h d o t u k s e m m e + y h d e n m u k a i s t a m i s e h d o t u k s e n + y h d e n m u k a i s t a m i s e h d o t u k s i a + y h d e n m u k a i s t a m i s e h d o t u s + y h d e n m u k a i s t a m i s e h d o t u s t a + y h d e n m u k a i s t a m i s e k s i + y h d e n m u k a i s t a m i s e l l a + y h d e n m u k a i s t a m i s e l l e + y h d e n m u k a i s t a m i s e n + y h d e n m u k a i s t a m i s e s s a + y h d e n m u k a i s t a m i s e s t a + y h d e n m u k a i s t a m i s h a l u s t a + y h d e n m u k a i s t a m i s h a n k k e i l l e + y h d e n m u k a i s t a m i s i a + y h d e n m u k a i s t a m i s k o n f e r e n s s i n + y h d e n m u k a i s t a m i s k r i t e e r e j ä + y h d e n m u k a i s t a m i s l a i n s ä ä d ä n n ö n + y h d e n m u k a i s t a m i s m a h d o l l i s u u t t a + y h d e n m u k a i s t a m i s m e n e t e l m ä + y h d e n m u k a i s t a m i s m e n e t t e l y i h i n + y h d e n m u k a i s t a m i s o h j e l m a a + y h d e n m u k a i s t a m i s o n g e l m a + y h d e n m u k a i s t a m i s p a i n e i l t a + y h d e n m u k a i s t a m i s p a k e t t i e n + y h d e n m u k a i s t a m i s p a k k o + y h d e n m u k a i s t a m i s p e r u s t e i t a + y h d e n m u k a i s t a m i s p o l i t i i k a s t a + y h d e n m u k a i s t a m i s p o l i t i i k k a a + y h d e n m u k a i s t a m i s p r o s e s s i + y h d e n m u k a i s t a m i s p r o s e s s i a + y h d e n m u k a i s t a m i s p r o s e s s i i n + y h d e n m u k a i s t a m i s p r o s e s s i n + y h d e n m u k a i s t a m i s p r o s e s s i s s a + y h d e n m u k a i s t a m i s p r o s e s s i s t a + y h d e n m u k a i s t a m i s p y r k i m y k s e s t ä + y h d e n m u k a i s t a m i s p y r k i m y k s e t + y h d e n m u k a i s t a m i s p y r k i m y k s i l l ä m m e + y h d e n m u k a i s t a m i s p y r k i m y k s i s s ä + y h d e n m u k a i s t a m i s p y r k i m y k s i ä + y h d e n m u k a i s t a m i s p y r k i m y s + y h d e n m u k a i s t a m i s p y r k i m y s t e n + y h d e n m u k a i s t a m i s s ä ä n n ö k s e n + y h d e n m u k a i s t a m i s s ä ä n n ö s t ä + y h d e n m u k a i s t a m i s s ä ä n n ö t + y h d e n m u k a i s t a m i s s ä ä n t ö i h i n + y h d e n m u k a i s t a m i s t a + y h d e n m u k a i s t a m i s t a r v e t t a + y h d e n m u k a i s t a m i s t a s o o n + y h d e n m u k a i s t a m i s t a v a s t a + y h d e n m u k a i s t a m i s t a v o i t e + y h d e n m u k a i s t a m i s t e o r i o i d e n + y h d e n m u k a i s t a m i s t o i m e n p i d e + y h d e n m u k a i s t a m i s t o i m e n p i t e i s i i n + y h d e n m u k a i s t a m i s t o i m e n p i t e i s t ä + y h d e n m u k a i s t a m i s t o i m e n p i t e i t ä + y h d e n m u k a i s t a m i s t o i m e t + y h d e n m u k a i s t a m i s t o i m i + y h d e n m u k a i s t a m i s t o i m i a + y h d e n m u k a i s t a m i s t o i m i e n + y h d e n m u k a i s t a m i s t o i m i n + y h d e n m u k a i s t a m i s t y ö n + y h d e n m u k a i s t a m i s t y ö s s ä + y h d e n m u k a i s t a m i s t y ö t ä + y h d e n m u k a i s t a m i s u u d i s t u s t e n + y h d e n m u k a i s t a m i s v a a t i m u k s e n + y h d e n m u k a i s t a m i s v a a t i m u k s i a + y h d e n m u k a i s t a m i s v a a t i m u s + y h d e n m u k a i s t a m i s v i m m a + y h d e n m u k a i s t a m i s v i r a s t o n + y h d e n m u k a i s t a m i s v ä l i n e e t + y h d e n m u k a i s t a m i s v ä l i n e i l l ä + y h d e n m u k a i s t a n u t + y h d e n m u k a i s t a v a + y h d e n m u k a i s t e n + y h d e n m u k a i s t e t a + y h d e n m u k a i s t e t a a n + y h d e n m u k a i s t e t t a e s s a + y h d e n m u k a i s t e t t a v a + y h d e n m u k a i s t e t t u + y h d e n m u k a i s t e t t u a + y h d e n m u k a i s t e t t u j a + y h d e n m u k a i s t e t t u j e n + y h d e n m u k a i s t e t u i s t a + y h d e n m u k a i s t e t u m p a a + y h d e n m u k a i s t e t u n + y h d e n m u k a i s t e t u s t a + y h d e n m u k a i s t e t u t + y h d e n m u k a i s t u m i n e n + y h d e n m u k a i s t u m i s e e n + y h d e n m u k a i s t u m i s t a + y h d e n m u k a i s t u m i s t a v o i t t e e n + y h d e n m u k a i s u u d e n + y h d e n m u k a i s u u d e s t a + y h d e n m u k a i s u u s a s t e + y h d e n m u k a i s u u s t a s o + y h d e n m u k a i s u u s v a a t i m u k s i a + y h d e n m u k a i s u u t t a + y h d e n n e t t y j e n + y h d e n n e t t y j ä + y h d e n n e t t y y n + y h d e n n e t t y ä + y h d e n n e t y i m p i ä + y h d e n n e t y i m p ä ä + y h d e n n e t y l t ä + y h d e n n e t y m m ä n + y h d e n n e t y m p i + y h d e n n e t y m p ä ä n + y h d e n n e t y n + y h d e n n e t y s s ä + y h d e n n e t y s t ä + y h d e n s u u n t a i s e s t i + y h d e n s u u n t a i s e t + y h d e n s u u n t a i s i a + y h d e n s u u n t a i s p r o j e k t i o + y h d e n t y m i s a j a t u k s e n + y h d e n t y m i s a l o i l l a + y h d e n t y m i s a l u e + y h d e n t y m i s a l u e e n + y h d e n t y m i s a s k e l e i d e n + y h d e n t y m i s a s k e l t a + y h d e n t y m i s a s t e + y h d e n t y m i s a s t e e n + y h d e n t y m i s a s t e e s e e n + y h d e n t y m i s e e n + y h d e n t y m i s e l l e + y h d e n t y m i s e n + y h d e n t y m i s e s s ä + y h d e n t y m i s e s s ä ä n + y h d e n t y m i s e s t ä + y h d e n t y m i s f o o r u m e i d e n + y h d e n t y m i s h a l u + y h d e n t y m i s h a n k e + y h d e n t y m i s h a n k e t t a + y h d e n t y m i s h a n k e t t a m m e + y h d e n t y m i s h a n k k e e l l e + y h d e n t y m i s h a n k k e e m m e + y h d e n t y m i s h a n k k e e n + y h d e n t y m i s h a n k k e e s e e n + y h d e n t y m i s h a n k k e e s s a + y h d e n t y m i s h a n k k e e s t a + y h d e n t y m i s h a n k k e e t + y h d e n t y m i s h a n k k e i l l e + y h d e n t y m i s h i s t o r i a s s a + y h d e n t y m i s i n d i k a a t t o r e i t a + y h d e n t y m i s j u n a + y h d e n t y m i s k e h i t y k s e e n + y h d e n t y m i s k e h i t y k s e l l e + y h d e n t y m i s k e h i t y k s e n + y h d e n t y m i s k e h i t y k s e s s ä + y h d e n t y m i s k e h i t y k s e s t ä + y h d e n t y m i s k e h i t y s + y h d e n t y m i s k e h i t y s t ä + y h d e n t y m i s k e h y k s e e n + y h d e n t y m i s k e s k u k s e l l e + y h d e n t y m i s k e s k u s t e l u t + y h d e n t y m i s k r i t e e r i e n + y h d e n t y m i s l i i t t o + y h d e n t y m i s m a h d o l l i s u u s + y h d e n t y m i s m a l l i + y h d e n t y m i s m a l l i a + y h d e n t y m i s m a l l i n + y h d e n t y m i s m a l l i s t a + y h d e n t y m i s m e n e t e l m ä m m e + y h d e n t y m i s m e n e t e l m ä n + y h d e n t y m i s m e n e t t e l y n + y h d e n t y m i s m e n e t t e l y ä + y h d e n t y m i s o d o t u s t e n + y h d e n t y m i s o h j e l m a t + y h d e n t y m i s p e r i a a t e t t a + y h d e n t y m i s p o l i i t t i n e n + y h d e n t y m i s p o l i t i i k a l l e + y h d e n t y m i s p o l i t i i k a n + y h d e n t y m i s p o l i t i i k a s s a + y h d e n t y m i s p o l i t i i k a s t a + y h d e n t y m i s p o l i t i i k k a + y h d e n t y m i s p o l i t i i k k a a + y h d e n t y m i s p o l i t i i k k a a n + y h d e n t y m i s p o l i t i i k k a m m e + y h d e n t y m i s p o l i t i i k k o j a + y h d e n t y m i s p r o j e k t e j a + y h d e n t y m i s p r o j e k t i + y h d e n t y m i s p r o s e s s e i h i n + y h d e n t y m i s p r o s e s s e i s s a + y h d e n t y m i s p r o s e s s e j a + y h d e n t y m i s p r o s e s s i a + y h d e n t y m i s p r o s e s s i a m m e + y h d e n t y m i s p r o s e s s i i n + y h d e n t y m i s p r o s e s s i l l e + y h d e n t y m i s p r o s e s s i m m e + y h d e n t y m i s p r o s e s s i n + y h d e n t y m i s p r o s e s s i s s a + y h d e n t y m i s p r o s e s s i s t a + y h d e n t y m i s p y r k i m y k s e t + y h d e n t y m i s p y r k i m y k s i i m m e + y h d e n t y m i s p y r k i m y k s i l l e + y h d e n t y m i s p y r k i m y k s i s s ä + y h d e n t y m i s p y r k i m y k s i s s ä ä n + y h d e n t y m i s p y r k i m y k s i ä + y h d e n t y m i s p y r k i m y s t e m m e + y h d e n t y m i s r a k e n n e l m a + y h d e n t y m i s r a k e n n e l m a a + y h d e n t y m i s r y t m e i s t ä + y h d e n t y m i s s t r a t e g i a + y h d e n t y m i s s t r a t e g i a a + y h d e n t y m i s s t r a t e g i a s s a a n + y h d e n t y m i s s u u n n i t e l m i e n + y h d e n t y m i s t a h d o s s a a n + y h d e n t y m i s t a r p e e s e e n + y h d e n t y m i s t a s o + y h d e n t y m i s t a v o i t e + y h d e n t y m i s t a v o i t e t t a + y h d e n t y m i s t a v o i t t e i s t a a n + y h d e n t y m i s t e k i j ä + y h d e n t y m i s t e k n i i k k a + y h d e n t y m i s t o i m e t + y h d e n t y m i s t o i m i a + y h d e n t y m i s t o i v e e n + y h d e n t y m i s t o i v e i t a + y h d e n t y m i s t y ö + y h d e n t y m i s t y ö n + y h d e n t y m i s t ä + y h d e n t y m i s v a i h e i s s a + y h d e n t y m i s v a l m i u k s i a + y h d e n t y m i s v a l m i u k s i e n + y h d e n t y m i s v a l m i u s + y h d e n t y m i s v a u h d i l l a + y h d e n t y m i s y r i t y k s i l l e + y h d e n t y m ä t ö n + y h d e n t y m ä ä n + y h d e n t y n e e m m ä s s ä + y h d e n t y n e e m m ä s t ä + y h d e n t y n e e m p i + y h d e n t y n e e m p ä ä + y h d e n t y n e e n + y h d e n t y n e e s s ä + y h d e n t y n e i d e n + y h d e n t y n e i m m ä t + y h d e n t y n y t + y h d e n t y v ä ä + y h d e n t y y + y h d e n t ä m i s e s s ä + y h d e n t ä m i s e s t ä + y h d e n t ä m i s o h j e l m a n + y h d e n t ä m i s p e r i a a t e t t a + y h d e n t ä m i s p o l i t i i k a n + y h d e n t ä m i s p o l i t i i k k a + y h d e n t ä m i s p o l i t i i k k o j a + y h d e n t ä m i s p r o s e s s i a + y h d e n t ä m i s s t r a t e g i a n + y h d e n t ä m i s t ä + y h d e n t ä m i s v a l m i u k s i i n + y h d e n t ä m ä ä n + y h d e n t ä ä + y h d e n v e r o i s e s t i + y h d e n v e r t a i s e e n + y h d e n v e r t a i s e l l e + y h d e n v e r t a i s e m m a s s a + y h d e n v e r t a i s e m m a t + y h d e n v e r t a i s e m p a a + y h d e n v e r t a i s e m p a a n + y h d e n v e r t a i s e m p i a + y h d e n v e r t a i s e n + y h d e n v e r t a i s e s s a + y h d e n v e r t a i s e s t a + y h d e n v e r t a i s e s t i + y h d e n v e r t a i s e t + y h d e n v e r t a i s i a + y h d e n v e r t a i s i i n + y h d e n v e r t a i s i k s i + y h d e n v e r t a i s i l l e + y h d e n v e r t a i s i n a + y h d e n v e r t a i s i s t a + y h d e n v e r t a i s t a + y h d e n v e r t a i s t e n + y h d e n v e r t a i s u u d e n + y h d e n v e r t a i s u u s d i r e k t i i v i + y h d e n v e r t a i s u u s d i r e k t i i v i ä + y h d e n v e r t a i s u u s j ä r j e s t e l m ä + y h d e n v e r t a i s u u s l a i n + y h d e n v e r t a i s u u s l a k e j a + y h d e n v e r t a i s u u s l a k i + y h d e n v e r t a i s u u s o n g e l m i a + y h d e n v e r t a i s u u s p e r i a a t e + y h d e n v e r t a i s u u t t a + y h d e s s ä k ä ä n + y h d e s t ä + y h d e s t ä k ä ä n + y h d e t + y h d i s t e i d e n + y h d i s t e i t ä + y h d i s t e l m ä a j o n e u v o j a + y h d i s t e l m ä h o i t o + y h d i s t e l m ä h o i t o a + y h d i s t e l m ä h o i t o j e n + y h d i s t e l m ä j ä t t e e n + y h d i s t e l m ä k s i + y h d i s t e l m ä l i i k e n n e + y h d i s t e l m ä l i i k e n t e e l l e + y h d i s t e l m ä l i i k e n t e e n + y h d i s t e l m ä l l e + y h d i s t e l m ä l u p a + y h d i s t e l m ä l u p a a + y h d i s t e l m ä l u p a a n + y h d i s t e l m ä l u p a h a n k k e e n + y h d i s t e l m ä l u p a h a n k k e e s s a + y h d i s t e l m ä l u p a m e n e t t e l y + y h d i s t e l m ä l u v a n + y h d i s t e l m ä l u v a s t a + y h d i s t e l m ä l ä h e s t y m i s t a p a + y h d i s t e l m ä l ä h e s t y m i s t a p a a + y h d i s t e l m ä l ä h e s t y m i s t a v a k s i + y h d i s t e l m ä l ä h e s t y m i s t a v a n + y h d i s t e l m ä l ä ä k e + y h d i s t e l m ä n + y h d i s t e l m ä o h j e l m a s t a + y h d i s t e l m ä s t ä + y h d i s t e l m ä t o i m e n p i d e + y h d i s t e l m ä t u o t a n t o a + y h d i s t e l m ä t u o t t e i t a + y h d i s t e l m ä ä + y h d i s t e l m ä ä n + y h d i s t e t t i i n + y h d i s t e t t y j e n + y h d i s t e t t y j ä + y h d i s t e t t ä i s i i n + y h d i s t e t y i l l e + y h d i s t e t y s s ä + y h d i s t e t y s t ä + y h d i s t e t ä ä n + y h d i s t e v a l m i s t e i s s a + y h d i s t i + y h d i s t i m m e + y h d i s t y i s i + y h d i s t y i s i v ä t + y h d i s t y i v ä t + y h d i s t y k s e n + y h d i s t y k s e t + y h d i s t y k s e t k i n + y h d i s t y k s i ä + y h d i s t y k ä ä + y h d i s t y k ä ä m m e + y h d i s t y m i s e l l e + y h d i s t y m i s e n + y h d i s t y m i s e n v a p a u t t a + y h d i s t y m i s k i r k k o + y h d i s t y m i s k y s y m y k s e s s ä + y h d i s t y m i s k ä y t ä n t ö j ä + y h d i s t y m i s l i i k e v o i m a s t a + y h d i s t y m i s o i k e u d e n + y h d i s t y m i s o i k e u t t a + y h d i s t y m i s p r o s e s s e i s s a + y h d i s t y m i s p r o s e s s i + y h d i s t y m i s p r o s e s s i a + y h d i s t y m i s p r o s e s s i n + y h d i s t y m i s p r o s e s s i s s a + y h d i s t y m i s p y r k i m y k s i l l e + y h d i s t y m i s s o p i m u k s e n + y h d i s t y m i s s o p i m u s + y h d i s t y m i s v a p a u d e l l e + y h d i s t y m i s v a p a u d e n + y h d i s t y m i s v a p a u d e s t a + y h d i s t y m i s v a p a u s + y h d i s t y m i s v a p a u t e e n + y h d i s t y m i s v a p a u t t a + y h d i s t y m ä ä n + y h d i s t y n e e l l ä + y h d i s t y n e e m m ä n + y h d i s t y n e e n + y h d i s t y n e e s s ä + y h d i s t y n e e s t ä + y h d i s t y n e e t + y h d i s t y n e i d e n + y h d i s t y n e i l l e + y h d i s t y n e i l l ä + y h d i s t y n e i l t ä + y h d i s t y n e i s i i n + y h d i s t y n e i s s ä + y h d i s t y n e i s t ä + y h d i s t y n e i t t e n + y h d i s t y n e i t ä + y h d i s t y n y t t ä + y h d i s t y s a k t i v i s t i e n + y h d i s t y s l a k e j a + y h d i s t y s l a k i a + y h d i s t y s r a k e n t e i n e e n + y h d i s t y s t e n + y h d i s t y s t o i m i n n a l l e + y h d i s t y s t o i m i n t a a n + y h d i s t y v ä t + y h d i s t y y + y h d i s t y ä + y h d i s t ä e s s ä m m e + y h d i s t ä e s s ä ä n + y h d i s t ä i s i + y h d i s t ä i s i m m e + y h d i s t ä k ä ä m m e + y h d i s t ä k ö + y h d i s t ä m i s e e n + y h d i s t ä m i s e k s i + y h d i s t ä m i s e l l e + y h d i s t ä m i s e n + y h d i s t ä m i s e s s ä + y h d i s t ä m i s e s t ä + y h d i s t ä m i s k y s y m y k s e n ä + y h d i s t ä m i s m a h d o l l i s u u k s i a + y h d i s t ä m i s m a h d o l l i s u u t t a + y h d i s t ä m i s m e n e t e l m ä k s i + y h d i s t ä m i s o i k e u d e n + y h d i s t ä m i s o i k e u t t a + y h d i s t ä m i s p o l i t i i k k a + y h d i s t ä m i s p r o s e s s i s s a + y h d i s t ä m i s s u u n n i t e l m a n + y h d i s t ä m i s t o i m i i n + y h d i s t ä m i s t o i m i l l a + y h d i s t ä m i s t ä + y h d i s t ä m m e + y h d i s t ä m ä l l ä + y h d i s t ä m ä t t ä + y h d i s t ä m ä ä n + y h d i s t ä n + y h d i s t ä n e e t + y h d i s t ä n y t + y h d i s t ä v i e n + y h d i s t ä v i ä + y h d i s t ä v ä n + y h d i s t ä v ä n ä + y h d i s t ä v ä s t ä + y h d i s t ä v ä t + y h d i s t ä v ä ä + y h d i s t ä ä + y h d i s t ä ä k s e e n + y h d i s t ä ä k s e m m e + y h d i s t ä ä k s e n n e + y h d y m m e + y h d y n + y h d y n k i n + y h d y n n ä n + y h d y s j o h d o i s t a a n + y h d y s k o m i t e a n + y h d y s k u n n a t + y h d y s k u n t a j ä t e + y h d y s k u n t a j ä t e k r i i s i n + y h d y s k u n t a j ä t e t t ä + y h d y s k u n t a j ä t e v e d e n + y h d y s k u n t a j ä t e v e d e t + y h d y s k u n t a j ä t e v e s i d i r e k t i i v i + y h d y s k u n t a j ä t e v e s i d i r e k t i i v i i n + y h d y s k u n t a j ä t e v e s i e n + y h d y s k u n t a j ä t e v e s i ä + y h d y s k u n t a j ä t e v e t e n s ä + y h d y s k u n t a j ä t e v i r r o i s t a + y h d y s k u n t a j ä t t e e l l e + y h d y s k u n t a j ä t t e e n + y h d y s k u n t a j ä t t e e s e e n + y h d y s k u n t a j ä t t e e s s ä + y h d y s k u n t a j ä t t e e s t ä + y h d y s k u n t a j ä t t e e t + y h d y s k u n t a j ä t t e i d e n + y h d y s k u n t a j ä t t e i l l e + y h d y s k u n t a j ä t t e i s i i n + y h d y s k u n t a j ä t t e i s t ä + y h d y s k u n t a j ä t t e i t ä + y h d y s k u n t a l i e t e t t ä + y h d y s k u n t a l i e t t e e n + y h d y s k u n t a l i e t t e e s s ä + y h d y s k u n t a l i e t t e e s t ä + y h d y s k u n t a o i k e u d e t + y h d y s k u n t a p a l v e l u + y h d y s k u n t a p a l v e l u a + y h d y s k u n t a p a l v e l u i h i n + y h d y s k u n t a p a l v e l u k s e k s i + y h d y s k u n t a p a l v e l u n + y h d y s k u n t a p a l v e l u u n + y h d y s k u n t a r a k e n n e + y h d y s k u n t a r a k e n t e e n + y h d y s k u n t a s u u n n i t t e l u + y h d y s k u n t a s u u n n i t t e l u n + y h d y s k u n t a t e k n i i k k a + y h d y s k u n t a v e s i e n + y h d y s k u n t i a + y h d y s k ä y t ä v ä l a u s e k e + y h d y s k ä y t ä v ä l a u s e k k e e l l a + y h d y s k ä y t ä v ä l a u s e k k e e n + y h d y s l i i k e n n e t t ä + y h d y s v a l l a t + y h d y s v a l l a t h a n + y h d y s v a l l a t k a a n + y h d y s v a l l a t k i n + y h d y s v a l l o i k s i + y h d y s v a l l o i l l a + y h d y s v a l l o i l l a k a a n + y h d y s v a l l o i l l e + y h d y s v a l l o i l l e k i n + y h d y s v a l l o i l t a + y h d y s v a l l o i s s a + y h d y s v a l l o i s s a k i n + y h d y s v a l l o i s t a + y h d y s v a l t a i n + y h d y s v a l t a l a i s e e n + y h d y s v a l t a l a i s e n + y h d y s v a l t a l a i s e s t a + y h d y s v a l t a l a i s e t + y h d y s v a l t a l a i s i a + y h d y s v a l t a l a i s i i n + y h d y s v a l t a l a i s i l l a + y h d y s v a l t a l a i s i l l a k i n + y h d y s v a l t a l a i s i l l e + y h d y s v a l t a l a i s i l t a + y h d y s v a l t a l a i s i s s a + y h d y s v a l t a l a i s i s t a + y h d y s v a l t a l a i s j o u k k o j e n + y h d y s v a l t a l a i s k i r j a s t o j e n + y h d y s v a l t a l a i s k o n e e n + y h d y s v a l t a l a i s l ä h t e i s t ä + y h d y s v a l t a l a i s m a t k u s t a j i l t a + y h d y s v a l t a l a i s r a p o r t t i + y h d y s v a l t a l a i s t a + y h d y s v a l t a l a i s t a h o i l t a + y h d y s v a l t a l a i s t e n + y h d y s v a l t a l a i s t u t k i j a t + y h d y s v a l t a l a i s y h t i ö n + y h d y s v a l t o i h i n + y h d y s v a l t o i h i n k i n + y h d y s v a l t o j a + y h d y s v a l t o j a k i n + y h d y s v a l t o j e n + y h d y s v a l t o j e n k a a n + y h d y s v a l t o j e n k i n + y h d y s v a l t o j e n v a s t a i s u u s + y h d y s v ä y l ä n ä + y h t e e n k a s v a m i n e n + y h t e e n k a s v a m i s e n + y h t e e n k a s v u n + y h t e e n k i e t o u t u n e i t a + y h t e e n k u u l u v u u d e n + y h t e e n k u u l u v u u d e s t a + y h t e e n k u u l u v u u s + y h t e e n k u u l u v u u s p e r i a a t e + y h t e e n k u u l u v u u s p e r i a a t t e e n + y h t e e n k u u l u v u u s p o l i t i i k a l l a + y h t e e n k u u l u v u u s p o l i t i i k a l l e + y h t e e n k u u l u v u u s p o l i t i i k a n + y h t e e n k u u l u v u u s p o l i t i i k a s s a + y h t e e n k u u l u v u u s p o l i t i i k a s t a + y h t e e n k u u l u v u u s p o l i t i i k k a + y h t e e n k u u l u v u u s p o l i t i i k k a a + y h t e e n k u u l u v u u s p o l i t i i k k a a n + y h t e e n k u u l u v u u s p o l i t i i k k a m m e + y h t e e n k u u l u v u u s p o l i t i i k k o j e n + y h t e e n k u u l u v u u s p o n n i s t e l u n + y h t e e n k u u l u v u u s p u i t t e i s i i n + y h t e e n k u u l u v u u s p y r k i m y k s e n + y h t e e n k u u l u v u u s r a h a s t o s t a + y h t e e n k u u l u v u u s r a h o i t u k s e n + y h t e e n k u u l u v u u s s t r a t e g i a n + y h t e e n k u u l u v u u s t a v o i t t e i d e n + y h t e e n k u u l u v u u s t a v o i t t e i s i i n + y h t e e n k u u l u v u u s v ä l i n e e s t ä + y h t e e n k u u l u v u u t e e n + y h t e e n k u u l u v u u t e m m e + y h t e e n k u u l u v u u t t a + y h t e e n k y t k e m i s p y r k i m y s t ä + y h t e e n k y t k e n t ä k a p a s i t e e t i n + y h t e e n k y t k e n t ä k a p a s i t e e t t i a + y h t e e n k y t k e n t ä k y k y + y h t e e n k ä ä n + y h t e e n l a s k e t t u + y h t e e n l a s k e t t u a + y h t e e n l i i t e t t y j ä + y h t e e n l i i t t y m i i n + y h t e e n l i i t t y m i ä + y h t e e n l i i t t y m ä d i r e k t i i v i + y h t e e n l i i t t y m ä d i r e k t i i v i ä + y h t e e n l i i t t y m ä n + y h t e e n l i i t t y m ä s t ä + y h t e e n l i i t t y m ä t + y h t e e n l i i t t ä m i s a s t e + y h t e e n l i i t t ä m i s d i r e k t i i v i + y h t e e n l i i t t ä m i s d i r e k t i i v i n + y h t e e n l i i t t ä m i s d i r e k t i i v i s t ä + y h t e e n l i i t t ä m i s d i r e k t i i v i ä + y h t e e n l i i t t ä m i s e n + y h t e e n l i i t t ä m i s h i n n o i t t e l u s t a + y h t e e n l i i t t ä m i s k a p a s i t e e t i n + y h t e e n l i i t t ä m i s k a p a s i t e e t t i a + y h t e e n l i i t t ä m i s m a k s u j e n + y h t e e n l i i t t ä m i s s u u n n i t e l m a n + y h t e e n l i i t ä n t ä h a n k k e i s i i n + y h t e e n l i i t ä n t ä j ä r j e s t e l m ä n + y h t e e n l i i t ä n t ä s u u n n i t e l m a a + y h t e e n l i i t ä n t ä s u u n n i t e l m a n + y h t e e n l i i t ä n t ö j e n + y h t e e n o t o i l t a + y h t e e n o t o k s i + y h t e e n o t o n + y h t e e n o t o t + y h t e e n o t t o a + y h t e e n o t t o j a + y h t e e n o t t o j e n + y h t e e n o t t o l i n j a a n + y h t e e n s a a t t a m i s e l l e + y h t e e n s a a t t a m i s t a + y h t e e n s a t t u m a + y h t e e n s a t t u m a a + y h t e e n s i j o i t t a m i s e s s a + y h t e e n s o p i m a t t o m i a + y h t e e n s o p i m a t t o m u u t e e n + y h t e e n s o p i v a + y h t e e n s o p i v a a + y h t e e n s o p i v a m m a n + y h t e e n s o p i v a m p i + y h t e e n s o p i v a m p i a + y h t e e n s o p i v a t + y h t e e n s o p i v i a + y h t e e n s o p i v u u d e s t a + y h t e e n s o p i v u u s + y h t e e n s o p i v u u s k r i t e e r i ä + y h t e e n s o p i v u u s k y s y m y k s e t + y h t e e n s o p i v u u s o n g e l m a t + y h t e e n s o p i v u u s o n g e l m i a + y h t e e n s o p i v u u s t e s t i + y h t e e n s o p i v u u s t o d i s t u s t e n + y h t e e n s o p i v u u s v a a t i m u k s e n + y h t e e n s o p i v u u t t a + y h t e e n s o v e l t u v u u s p e r i a a t e + y h t e e n s o v i t e t t a v a + y h t e e n s o v i t e t t u + y h t e e n s o v i t e t t u a + y h t e e n s o v i t e t u s t a + y h t e e n s o v i t t a a + y h t e e n s o v i t t a a k s e e n + y h t e e n s o v i t t a m a a n + y h t e e n s o v i t t a m a l l a + y h t e e n s o v i t t a m i s a j a t u s + y h t e e n s o v i t t a m i s a s e t u k s e n + y h t e e n s o v i t t a m i s a s e t u k s e s s a + y h t e e n s o v i t t a m i s a s e t u s t a + y h t e e n s o v i t t a m i s e e n + y h t e e n s o v i t t a m i s e k s i + y h t e e n s o v i t t a m i s e l l e + y h t e e n s o v i t t a m i s e n + y h t e e n s o v i t t a m i s e s s a + y h t e e n s o v i t t a m i s e s t a + y h t e e n s o v i t t a m i s e t + y h t e e n s o v i t t a m i s j ä r j e s t e l m ä + y h t e e n s o v i t t a m i s j ä r j e s t e l m ä n + y h t e e n s o v i t t a m i s j ä r j e s t e l m ä s s ä + y h t e e n s o v i t t a m i s j ä r j e s t e l m ä ä + y h t e e n s o v i t t a m i s k e s k u k s e n + y h t e e n s o v i t t a m i s k o k o u k s i i n + y h t e e n s o v i t t a m i s k o m i t e a n + y h t e e n s o v i t t a m i s m e k a n i s m i e n + y h t e e n s o v i t t a m i s m e n e t e l m ä l l ä + y h t e e n s o v i t t a m i s m e n e t t e l y + y h t e e n s o v i t t a m i s m e n e t t e l y j e n + y h t e e n s o v i t t a m i s m e n e t t e l y ä + y h t e e n s o v i t t a m i s p e r i a a t e + y h t e e n s o v i t t a m i s p i s t e + y h t e e n s o v i t t a m i s p r o s e s s i s t a + y h t e e n s o v i t t a m i s p y r k i m y k s i s t ä + y h t e e n s o v i t t a m i s s ä ä n n ö i l l ä + y h t e e n s o v i t t a m i s s ä ä n n ö i s t ä + y h t e e n s o v i t t a m i s s ä ä n n ö t + y h t e e n s o v i t t a m i s s ä ä n t ö j ä + y h t e e n s o v i t t a m i s t a + y h t e e n s o v i t t a m i s t e h t ä v ä + y h t e e n s o v i t t a m i s t o i m i a + y h t e e n s o v i t t a m i s t o i m i i n + y h t e e n s o v i t t a m i s t o i m i s s a + y h t e e n s o v i t t a m i s v a i h e e s t a + y h t e e n s o v i t t a m i s v a l t a a + y h t e e n s o v i t t a m i s v ä l i n e + y h t e e n s o v i t t a m i s v ä l i n e i d e n + y h t e e n s o v i t u s p r o s e s s i i n + y h t e e n s u l a u t u m a + y h t e e n t o i m i v a k s i + y h t e e n t o i m i v a l l a + y h t e e n t o i m i v u u d e k s i + y h t e e n t o i m i v u u d e n + y h t e e n t o i m i v u u s + y h t e e n t o i m i v u u s a s e t u s + y h t e e n t o i m i v u u s h a n k e + y h t e e n t o i m i v u u s j u n a + y h t e e n t o i m i v u u s l a u s e k e t t a + y h t e e n t o i m i v u u s n o r m i e n + y h t e e n t o i m i v u u s n ä k ö k o h d a t + y h t e e n t o i m i v u u s o n g e l m a a + y h t e e n t o i m i v u u s r a t k a i s u j a + y h t e e n t o i m i v u u s r a t k a i s u j e n + y h t e e n t o i m i v u u s t o i m e n + y h t e e n t o i m i v u u t t a + y h t e e n t ö r m ä y k s e e n + y h t e e n t ö r m ä y k s e n + y h t e e n t ö r m ä y k s e s t ä + y h t e e n t ö r m ä y k s i ä + y h t e e n t ö r m ä y s t ä + y h t e e n v e d o n + y h t e e n v e d o s s a + y h t e e n v e d o s t a + y h t e e n v e t o + y h t e e n v e t o a + y h t e e n v e t o a n a l y y s i + y h t e e n v e t o a s i a k i r j a a + y h t e e n v e t o a s i a k i r j a n + y h t e e n v e t o a s i a k i r j a s s a + y h t e e n v e t o a s i a k i r j o i s s a + y h t e e n v e t o j a + y h t e e n v e t o k e r t o m u k s e n + y h t e e n v e t o k e r t o m u k s e s s a + y h t e e n v e t o k e r t o m u k s e s s a a n + y h t e e n v e t o k e r t o m u k s e s s a m m e + y h t e e n v e t o k e r t o m u k s e s t a + y h t e e n v e t o k e r t o m u k s i a + y h t e e n v e t o k e r t o m u k s i i n + y h t e e n v e t o k e r t o m u s + y h t e e n v e t o k ä ä n n ö k s e l l ä + y h t e e n v e t o m i e t i n n ö n + y h t e e n v e t o m u i s t i o + y h t e e n v e t o n a + y h t e e n v e t o n i + y h t e e n v e t o o m m e + y h t e e n v e t o o n + y h t e e n v e t o p r o s e s s i + y h t e e n v e t o p u h e e n v u o r o s s a n i + y h t e e n v e t o p ö y t ä k i r j a k i n + y h t e e n v e t o p ö y t ä k i r j o i s s a a n + y h t e e n v e t o p ö y t ä k i r j o j a + y h t e e n v e t o r a p o r t e i s s a a n + y h t e e n v e t o r a p o r t i n + y h t e e n v e t o r a p o r t i s s a + y h t e e n v e t o r a p o r t i s s a a n + y h t e e n v e t o r a p o r t i s t a + y h t e e n v e t o r a p o r t t i + y h t e e n v e t o r a p o r t t i e h d o t u k s e n + y h t e e n v e t o r a p o r t t i m m e + y h t e e n v e t o t a u l u k k o a + y h t e e n v e t o t e k s t i ä + y h t e e n v e t o t i e d o t + y h t e i s a l o i t t e e n + y h t e i s a l o i t t e e n a + y h t e i s a l o i t t e e s t a + y h t e i s a l u e t t a + y h t e i s a r v i o i n t i a + y h t e i s a r v o + y h t e i s a r v o l t a a n + y h t e i s a s u m i s e e n + y h t e i s d y n a m i i k a l l e + y h t e i s e d u t + y h t e i s e e n + y h t e i s e h d o t u s + y h t e i s e k s i + y h t e i s e l i n + y h t e i s e l l e + y h t e i s e l l ä + y h t e i s e l o + y h t e i s e l o a + y h t e i s e l o l l e + y h t e i s e l o n + y h t e i s e l o o m m e + y h t e i s e l o o n + y h t e i s e l o s s a + y h t e i s e l o s t a + y h t e i s e l t ä + y h t e i s e l ä m ä + y h t e i s e l ä m ä l l e + y h t e i s e l ä m ä m m e + y h t e i s e l ä m ä n + y h t e i s e l ä m ä ä + y h t e i s e l ä m ä ä n + y h t e i s e l ä m ä ä n s ä + y h t e i s e m m ä n + y h t e i s e m p i + y h t e i s e m p ä ä + y h t e i s e m p ä ä n + y h t e i s e n + y h t e i s e n ä + y h t e i s e s i i n t y m i s e n + y h t e i s e s i t t e l i j ä + y h t e i s e s i t t e l i j ä m m e + y h t e i s e s i t t e l i j ä n + y h t e i s e s i t t e l i j ä n i + y h t e i s e s i t t e l i j ä n ä + y h t e i s e s i t t e l i j ä t + y h t e i s e s i t t e l i j ä ä + y h t e i s e s i t t e l i j ä ä m m e + y h t e i s e s i t t e l i j ä ä n i + y h t e i s e s i t t e l i j ö i d e n + y h t e i s e s i t t e l i j ö i k s i + y h t e i s e s i t t e l i j ö i l l e + y h t e i s e s i t t e l i j ö i l l e n i + y h t e i s e s i t t e l i j ö i n ä + y h t e i s e s i t t e l i j ö i t ä + y h t e i s e s i t t e l i j ö i t ä m m e + y h t e i s e s i t t e l i j ö i t ä n i + y h t e i s e s i t t e l i j ö i t ä ä n + y h t e i s e s s ä + y h t e i s e s t ä + y h t e i s e t + y h t e i s e u r o o p p a l a i n e n + y h t e i s e u r o o p p a l a i s e l l e + y h t e i s e u r o o p p a l a i s e n + y h t e i s e u r o o p p a l a i s e n a + y h t e i s e u r o o p p a l a i s e t + y h t e i s e u r o o p p a l a i s i a + y h t e i s e u r o o p p a l a i s t a + y h t e i s h a l l i n n a n + y h t e i s h a l l i n n o i n n i n + y h t e i s h a l l i n n o i n n i s s a + y h t e i s h a l l i n n o i n n i s t a + y h t e i s h a l l i n n o i n t i + y h t e i s h a l l i n n o i n t i a + y h t e i s h a l l i n n o i n t i j ä r j e s t e l m ä n + y h t e i s h a l l i n n o i n t i s o p i m u s t e n + y h t e i s h a l l i n n o s t a + y h t e i s h a l l i n t a + y h t e i s h a l l i n t a a + y h t e i s h a l l i n t a a n + y h t e i s h a l l i n t o + y h t e i s h a l l i t u k s e e n + y h t e i s h a l l i t u k s e n + y h t e i s h a l l i t u s + y h t e i s h a l l i t u s t a + y h t e i s h a n k e + y h t e i s h a n k i n t a y k s i k ö i d e n + y h t e i s h a n k k e e n + y h t e i s h a n k k e e n a + y h t e i s h a n k k e e s s a + y h t e i s h a n k k e e t + y h t e i s h a n k k e i d e n + y h t e i s h a n k k e i l l e + y h t e i s h a n k k e i s s a + y h t e i s h a n k k e i t a + y h t e i s h a r j o i t u k s i l l a + y h t e i s h a u d a t + y h t e i s h a u t a + y h t e i s h a u t a a n + y h t e i s h e n g e n + y h t e i s h e n k e ä + y h t e i s h e n k i + y h t e i s h y v ä s t ä + y h t e i s i i n + y h t e i s i k s i + y h t e i s i l l e + y h t e i s i l l ä + y h t e i s i n + y h t e i s i s s ä + y h t e i s i s t u n n o n + y h t e i s i s t u n t o + y h t e i s i s t ä + y h t e i s i ä + y h t e i s j o h t a j u u d e k s i + y h t e i s j o u k k u e e n a + y h t e i s j u l i s t u k s e e n + y h t e i s j u l i s t u k s e l l a + y h t e i s j u l i s t u k s e l l e + y h t e i s j u l i s t u k s e n + y h t e i s j u l i s t u k s e s s a + y h t e i s j u l i s t u s + y h t e i s j u l k a i s u i s s a + y h t e i s j u l k a i s u t + y h t e i s j ä r j e s t e l m ä a j a m i s t a + y h t e i s j ä r j e s t e l y i h i n + y h t e i s j ä r j e s t e l y n + y h t e i s j ä r j e s t e l y ä + y h t e i s j ä r j e s t ö n + y h t e i s k a n t e e t + y h t e i s k a n t e i t a + y h t e i s k e h i t t e l y + y h t e i s k e h i t y s t ä + y h t e i s k e r t o m u k s e n + y h t e i s k e r t o m u k s e s s a + y h t e i s k e r t o m u s + y h t e i s k e r t o m u s t a + y h t e i s k e s k u s t e l u + y h t e i s k e s k u s t e l u a + y h t e i s k e s k u s t e l u k i n + y h t e i s k e s k u s t e l u l l a + y h t e i s k e s k u s t e l u l l e + y h t e i s k e s k u s t e l u m m e + y h t e i s k e s k u s t e l u n + y h t e i s k e s k u s t e l u s s a + y h t e i s k e s k u s t e l u s t a + y h t e i s k e s k u s t e l u t + y h t e i s k e s k u s t e l u u n + y h t e i s k o k o u k s e e n + y h t e i s k o k o u k s e l l e + y h t e i s k o k o u k s e n + y h t e i s k o k o u k s e s s a + y h t e i s k o k o u k s i a + y h t e i s k o k o u k s i i n + y h t e i s k o k o u s + y h t e i s k o k o u s m e n e t t e l y ä + y h t e i s k o k o u s t a + y h t e i s k o m i t e a + y h t e i s k o m i t e a a + y h t e i s k o m i t e a n + y h t e i s k o m i t e a s s a + y h t e i s k o m i t e a t + y h t e i s k o m i t e o i s s a + y h t e i s k o n f e r e n s s i n + y h t e i s k o u l u t u s + y h t e i s k u n n a k s i + y h t e i s k u n n a l l e + y h t e i s k u n n a l l e m m e + y h t e i s k u n n a l l i n e n + y h t e i s k u n n a l l i s e e n + y h t e i s k u n n a l l i s e k s i + y h t e i s k u n n a l l i s e l l a + y h t e i s k u n n a l l i s e l l e + y h t e i s k u n n a l l i s e l t a + y h t e i s k u n n a l l i s e m p i + y h t e i s k u n n a l l i s e n + y h t e i s k u n n a l l i s e s s a + y h t e i s k u n n a l l i s e s t a + y h t e i s k u n n a l l i s e s t i + y h t e i s k u n n a l l i s e s t i k a a n + y h t e i s k u n n a l l i s e t + y h t e i s k u n n a l l i s i a + y h t e i s k u n n a l l i s i i n + y h t e i s k u n n a l l i s i n a + y h t e i s k u n n a l l i s i s s a + y h t e i s k u n n a l l i s i s t a + y h t e i s k u n n a l l i s t e n + y h t e i s k u n n a l t a + y h t e i s k u n n a n + y h t e i s k u n n a n k i n + y h t e i s k u n n a n v a s t a i s i a + y h t e i s k u n n a n v a s t a i s i s t a + y h t e i s k u n n a n v a s t a i s t a + y h t e i s k u n n a n v a s t a i s t e n + y h t e i s k u n n a s s a + y h t e i s k u n n a s s a m m e + y h t e i s k u n n a s s a n n e + y h t e i s k u n n a s t a + y h t e i s k u n n a s t a m m e + y h t e i s k u n n i l l e + y h t e i s k u n n i s s a + y h t e i s k u n n i s s a m m e + y h t e i s k u n t a + y h t e i s k u n t a a + y h t e i s k u n t a a m m e + y h t e i s k u n t a a n + y h t e i s k u n t a e l i m i l l e + y h t e i s k u n t a e l ä m ä + y h t e i s k u n t a e l ä m ä l l e + y h t e i s k u n t a e l ä m ä n + y h t e i s k u n t a e l ä m ä s s ä + y h t e i s k u n t a e l ä m ä s t ä + y h t e i s k u n t a e l ä m ä ä + y h t e i s k u n t a e l ä m ä ä m m e + y h t e i s k u n t a e l ä m ä ä n + y h t e i s k u n t a e r o i s t a + y h t e i s k u n t a e r o j a + y h t e i s k u n t a f i l o s o f i a + y h t e i s k u n t a j ä r j e s t e l m i e m m e + y h t e i s k u n t a j ä r j e s t e l m i e n + y h t e i s k u n t a j ä r j e s t e l m i l l e + y h t e i s k u n t a j ä r j e s t e l m i s s ä m m e + y h t e i s k u n t a j ä r j e s t e l m i s t ä + y h t e i s k u n t a j ä r j e s t e l m i ä m m e + y h t e i s k u n t a j ä r j e s t e l m ä + y h t e i s k u n t a j ä r j e s t e l m ä m m e + y h t e i s k u n t a j ä r j e s t e l m ä n + y h t e i s k u n t a j ä r j e s t e l m ä ä + y h t e i s k u n t a j ä r j e s t e l m ä ä m m e + y h t e i s k u n t a j ä r j e s t e l m ä ä n + y h t e i s k u n t a j ä r j e s t y k s e n + y h t e i s k u n t a j ä r j e s t y k s e s t ä ä n + y h t e i s k u n t a j ä r j e s t y s + y h t e i s k u n t a j ä r j e s t y s t ä + y h t e i s k u n t a j ä r j e s t ö j e n + y h t e i s k u n t a j ä r j e s t ö t + y h t e i s k u n t a k e h i t y k s e e n + y h t e i s k u n t a k e h i t y k s e l l e + y h t e i s k u n t a k e h i t y k s e n + y h t e i s k u n t a k e h i t y k s e s t ä + y h t e i s k u n t a k e h i t y s + y h t e i s k u n t a k e h i t y s t ä + y h t e i s k u n t a k e r r o k s e t + y h t e i s k u n t a k e r r o k s i i n + y h t e i s k u n t a k e r r o k s i s s a + y h t e i s k u n t a k e r r o s t e n + y h t e i s k u n t a k r i i s e j ä + y h t e i s k u n t a k r i i s i + y h t e i s k u n t a k r i i s i i n + y h t e i s k u n t a k r i i s i k s i + y h t e i s k u n t a k r i i s i l l e + y h t e i s k u n t a k r i i s i n + y h t e i s k u n t a k r i i s i ä + y h t e i s k u n t a k r i t i i k k i + y h t e i s k u n t a k r i t i i k k i ä + y h t e i s k u n t a k ä s i t y k s e e n + y h t e i s k u n t a k ä s i t y k s e s t ä ä n + y h t e i s k u n t a k ä s i t y s t ä + y h t e i s k u n t a l i i t o s t a + y h t e i s k u n t a l u o k a s t a + y h t e i s k u n t a l u o k a t + y h t e i s k u n t a l u o k i s s a + y h t e i s k u n t a l u o k i s t a + y h t e i s k u n t a l u o k k a + y h t e i s k u n t a l u o k k a a + y h t e i s k u n t a l u o k k a a n + y h t e i s k u n t a l u o k k i a + y h t e i s k u n t a l u o k k i e n + y h t e i s k u n t a l u o k k i i n + y h t e i s k u n t a l ä h t ö i s e s s ä + y h t e i s k u n t a m a h d o l l i s u u k s i n e e n + y h t e i s k u n t a m a l l i + y h t e i s k u n t a m a l l i a + y h t e i s k u n t a m a l l i a a n + y h t e i s k u n t a m a l l i a m m e + y h t e i s k u n t a m a l l i e n + y h t e i s k u n t a m a l l i i m m e + y h t e i s k u n t a m a l l i i n + y h t e i s k u n t a m a l l i i n n e + y h t e i s k u n t a m a l l i k s i + y h t e i s k u n t a m a l l i l l e + y h t e i s k u n t a m a l l i l l e e n + y h t e i s k u n t a m a l l i m m e + y h t e i s k u n t a m a l l i n + y h t e i s k u n t a m a l l i n a + y h t e i s k u n t a m a l l i n s a + y h t e i s k u n t a m a l l i s s a + y h t e i s k u n t a m a l l i s t a + y h t e i s k u n t a m a l l i s t a m m e + y h t e i s k u n t a m a l l i t + y h t e i s k u n t a m m e + y h t e i s k u n t a m m e k i n + y h t e i s k u n t a m u o d o t + y h t e i s k u n t a m u o t o a + y h t e i s k u n t a m u u t o k s i a + y h t e i s k u n t a m u u t o s t a + y h t e i s k u n t a m ä ä r i t e l m i e n + y h t e i s k u n t a n a + y h t e i s k u n t a n s a + y h t e i s k u n t a n ä k e m y k s e s t ä + y h t e i s k u n t a o l o t + y h t e i s k u n t a o n g e l m i s t a + y h t e i s k u n t a o p i n + y h t e i s k u n t a o p p i + y h t e i s k u n t a p a l v e l u j e n + y h t e i s k u n t a p a l v e l u t + y h t e i s k u n t a p o l i i t t i n e n + y h t e i s k u n t a p o l i i t t i s e e n + y h t e i s k u n t a p o l i i t t i s e s t a + y h t e i s k u n t a p o l i i t t i s e t + y h t e i s k u n t a p o l i i t t i s i a + y h t e i s k u n t a p o l i i t t i s i i n + y h t e i s k u n t a p o l i i t t i s t a + y h t e i s k u n t a p o l i t i i k a n + y h t e i s k u n t a p o l i t i i k a t + y h t e i s k u n t a p o l i t i i k k a + y h t e i s k u n t a p u o l u e + y h t e i s k u n t a p u o l u e e k s i + y h t e i s k u n t a p u o l u e e n + y h t e i s k u n t a r a k e n n e + y h t e i s k u n t a r a k e n n e t t a + y h t e i s k u n t a r a k e n t e e l l e + y h t e i s k u n t a r a k e n t e e l t a a n + y h t e i s k u n t a r a k e n t e e m m e + y h t e i s k u n t a r a k e n t e e n + y h t e i s k u n t a r a k e n t e e s e e n + y h t e i s k u n t a r a k e n t e e s s a + y h t e i s k u n t a r a k e n t e e s t a + y h t e i s k u n t a r a k e n t e e t + y h t e i s k u n t a r a k e n t e i d e n + y h t e i s k u n t a r a k e n t e i s i i m m e + y h t e i s k u n t a r a k e n t e i t a + y h t e i s k u n t a r a u h a + y h t e i s k u n t a r a u h a a + y h t e i s k u n t a r a u h a a m m e + y h t e i s k u n t a r a u h a a n + y h t e i s k u n t a r a u h a l l e + y h t e i s k u n t a r a u h a m m e + y h t e i s k u n t a r a u h a n + y h t e i s k u n t a r a u h a s t a + y h t e i s k u n t a r e a k t i o t + y h t e i s k u n t a r y h m i e n + y h t e i s k u n t a r y h m i i n + y h t e i s k u n t a r y h m i l l e + y h t e i s k u n t a r y h m i l l ä + y h t e i s k u n t a r y h m i l t ä + y h t e i s k u n t a r y h m i s t ä + y h t e i s k u n t a r y h m i t t y m i e n + y h t e i s k u n t a r y h m i ä + y h t e i s k u n t a r y h m ä + y h t e i s k u n t a r y h m ä l l e + y h t e i s k u n t a r y h m ä m m e + y h t e i s k u n t a r y h m ä n + y h t e i s k u n t a r y h m ä n ä + y h t e i s k u n t a r y h m ä t + y h t e i s k u n t a r y h m ä ä + y h t e i s k u n t a r y h m ä ä n + y h t e i s k u n t a s e k t o r e i l l a + y h t e i s k u n t a s e k t o r e i t a + y h t e i s k u n t a s e k t o r i t + y h t e i s k u n t a s i d o n n a i s e t + y h t e i s k u n t a s o p i m u k s e e n + y h t e i s k u n t a s o p i m u k s e n + y h t e i s k u n t a s o p i m u k s e s s a + y h t e i s k u n t a s o p i m u k s e s t a + y h t e i s k u n t a s o p i m u s + y h t e i s k u n t a s o p i m u s t a + y h t e i s k u n t a s o p i m u s t e n + y h t e i s k u n t a s u h t e i s i i n + y h t e i s k u n t a s u h t e i t a + y h t e i s k u n t a s u u n n i t t e l u a + y h t e i s k u n t a s u u n n i t t e l u s s a + y h t e i s k u n t a s u u n n i t t e l u u n + y h t e i s k u n t a s u u n t a u s t a + y h t e i s k u n t a t a h o j e n + y h t e i s k u n t a t a l o u d e l l i s e s t a + y h t e i s k u n t a t a l o u d e l l i s e s t i + y h t e i s k u n t a t a l o u d e l l i s e t + y h t e i s k u n t a t a l o u d e l l i s i a + y h t e i s k u n t a t a l o u d e l l i s i s t a + y h t e i s k u n t a t a l o u s + y h t e i s k u n t a t e o r i a + y h t e i s k u n t a t i e d e + y h t e i s k u n t a t i e t e e l l e + y h t e i s k u n t a t i e t e e l l i s e n + y h t e i s k u n t a t i e t e e l l i s e t + y h t e i s k u n t a t i e t e e t + y h t e i s k u n t a t i e t e i d e n + y h t e i s k u n t a t i e t e i l l e + y h t e i s k u n t a t i e t e i s t ä + y h t e i s k u n t a t i e t e i t ä + y h t e i s k u n t a t i e t o i s t a + y h t e i s k u n t a t i l a n t e e s t a + y h t e i s k u n t a t o d e l l i s u u s + y h t e i s k u n t a t u t k i m u k s e n + y h t e i s k u n t a t y y p p i + y h t e i s k u n t a t y y p p i ä + y h t e i s k u n t a t y ö h ö n + y h t e i s k u n t a u u d i s t u k s e e n + y h t e i s k u n t a u u d i s t u k s i a + y h t e i s k u n t a u u d i s t u s t a + y h t e i s k u n t a v a i k u t u k s e t + y h t e i s k u n t a v a i k u t u k s i a + y h t e i s k u n t a v a s t a i n e n + y h t e i s k u n t a v a s t a i s e t + y h t e i s k u n t a v a s t a i s i a + y h t e i s k u n t a v a s t u u + y h t e i s k u n t a v a s t u u k s i + y h t e i s k u n t a v a s t u u l l e + y h t e i s k u n t a v a s t u u n + y h t e i s k u n t a v a s t u u n s a + y h t e i s k u n t a v a s t u u s e e n + y h t e i s k u n t a v a s t u u s t a + y h t e i s k u n t a v a s t u u t a + y h t e i s k u n t a v a s t u u t a a n + y h t e i s k u n t a v a s t u u v e l v o i t t e i d e n + y h t e i s k u n t i a + y h t e i s k u n t i a m m e + y h t e i s k u n t i e m m e + y h t e i s k u n t i e n + y h t e i s k u n t i i m m e + y h t e i s k u v i a + y h t e i s k y s y m y k s e n ä + y h t e i s k ä s i t t e l y s s ä + y h t e i s k ä s i t t e l y ä + y h t e i s k ä y t t ö + y h t e i s k ä y t t ö s o p i m u k s i a + y h t e i s k ä y t t ö s u u n n i t e l m i a + y h t e i s k ä y t t ö s u u n n i t e l m i e n + y h t e i s k ä y t t ö s u u n n i t e l m i i n + y h t e i s k ä y t t ö ä + y h t e i s k ä y t t ö ö n + y h t e i s k ä y t ö n + y h t e i s k ä y t ö s s ä + y h t e i s l a a t i j a n a + y h t e i s l a h j o i t t a j a t + y h t e i s l a i n s ä ä d ä n n ö l l i n e n + y h t e i s l a i n s ä ä d ä n n ö l l i s e e n + y h t e i s l a i n s ä ä d ä n n ö l l i s t ä + y h t e i s l a i n s ä ä d ä n n ö s t ä + y h t e i s l a i n s ä ä d ä n t ö + y h t e i s l a i n s ä ä t ä j i n ä + y h t e i s l a i n s ä ä t ä j ä n + y h t e i s l a i n s ä ä t ä j ä n ä + y h t e i s l a i n s ä ä t ä j ä t + y h t e i s l e n n o i l l a + y h t e i s l e n n o l l a + y h t e i s l e n t o + y h t e i s l e n t o a + y h t e i s l e n t o j a + y h t e i s l e n t o j e n + y h t e i s l i i k e n n e j ä r j e s t e l m ä + y h t e i s l i s e n s s i + y h t e i s m a a + y h t e i s m a a n + y h t e i s m a i l t a + y h t e i s m a l l i + y h t e i s m a r k k i n a + y h t e i s m a r k k i n a j ä r j e s t e l y i s s ä + y h t e i s m a r k k i n a j ä r j e s t e l y n + y h t e i s m a r k k i n a k a t s a u s t a + y h t e i s m a r k k i n a k s i + y h t e i s m a r k k i n a k y s y m y k s i ä + y h t e i s m a r k k i n a l ä h e s t y m i s t a v a l l e + y h t e i s m a r k k i n a m e n e t e l m ä + y h t e i s m a r k k i n a m m e + y h t e i s m a r k k i n a p e r i a a t t e e n + y h t e i s m a r k k i n a p o l i t i i k a s t a + y h t e i s m a r k k i n a s ä ä d ö k s e n + y h t e i s m a r k k i n a s ä ä d ö k s e s t ä + y h t e i s m a r k k i n a s ä ä d ö s + y h t e i s m a r k k i n a s ä ä n t ö j ä + y h t e i s m a r k k i n a t + y h t e i s m a r k k i n a t a r j o u s e s i t t e e n + y h t e i s m a r k k i n a t o i m i n t a a n + y h t e i s m a r k k i n o i d e m m e + y h t e i s m a r k k i n o i d e n + y h t e i s m a r k k i n o i h i n + y h t e i s m a r k k i n o i l l a + y h t e i s m a r k k i n o i l l a m m e + y h t e i s m a r k k i n o i l l e + y h t e i s m a r k k i n o i s t a + y h t e i s m a r k k i n o i t a + y h t e i s m a r k k i n o i t a m m e + y h t e i s m a r k k i n o i t t e m m e + y h t e i s m e n e t t e l y ä + y h t e i s m e t s i ä + y h t e i s m i e t i n n ö n + y h t e i s m i e t i n n ö s s ä + y h t e i s m i e t i n n ö s t ä ä n + y h t e i s m i e t i n t ä p r o s e s s i i n + y h t e i s m i t a l l i s e s t i + y h t e i s n e u v o s t o + y h t e i s n e u v o s t o n + y h t e i s n e u v o t t e l u i d e n + y h t e i s n e u v o t t e l u i s s a + y h t e i s n e u v o t t e l u j e n + y h t e i s n e u v o t t e l u j e n n e + y h t e i s n i m i t y s t ä + y h t e i s o h j e l m a + y h t e i s o h j e l m a t + y h t e i s o m a i s u u t e n a + y h t e i s o m i s t a j i k s i + y h t e i s o m i s t a j u u d e n + y h t e i s o m i s t a j u u s + y h t e i s o m i s t u s + y h t e i s o m i s t u s t a k i n + y h t e i s o p e r a a t i o + y h t e i s o p e r a a t i o i h i n + y h t e i s o p e r a a t i o i s s a + y h t e i s o p e r a a t i o i t a + y h t e i s o s t o j a + y h t e i s o s u u s + y h t e i s p a i n e r u i s k u t u s + y h t e i s p a i n o s t u s t a + y h t e i s p a r l a m e n t a a r i n e n + y h t e i s p e l i l l ä + y h t e i s p e l i ä + y h t e i s p o l t t o + y h t e i s p o n n i s t u k s e t + y h t e i s p o n n i s t u s t a + y h t e i s p u h e e n j o h t a j a + y h t e i s p u h e e n j o h t a j a a + y h t e i s p u h e e n j o h t a j a l l e + y h t e i s p u h e e n j o h t a j a m a a + y h t e i s p u h e e n j o h t a j a m m e + y h t e i s p u h e e n j o h t a j a n + y h t e i s p u h e e n j o h t a j a n a + y h t e i s p u h e e n j o h t a j a n n e + y h t e i s p u h e e n j o h t a j a t + y h t e i s p u h e e n j o h t a j i e n + y h t e i s p u h e e n j o h t a j i l l e + y h t e i s p u h e e n j o h t a j i n a + y h t e i s p u h e e n j o h t a j i s t a + y h t e i s p u h e e n j o h t a j u u d e n + y h t e i s p u h e e n j o h t a j u u s + y h t e i s p u h e e n j o h t a j u u t t a + y h t e i s p u o l u s t u s t a + y h t e i s p y y n t ö + y h t e i s p ä ä t t ä m ä t t ö m y y s m e n e t t e l y + y h t e i s p ä ä t t ä m ä t t ö m y y s m e n e t t e l y k s i + y h t e i s p ä ä t t ä m ä t t ö m y y s m e n e t t e l y s t ä + y h t e i s p ä ä t t ä m ä t t ö m y y s p r o s e s s i + y h t e i s p ä ä t ä n t ä m e n e t t e l y n + y h t e i s p ä ä t ä n t ä v a l t a + y h t e i s p ä ä t ä n t ä v a l t a a + y h t e i s p ä ä t ä n t ä v a l t u u k s i e n + y h t e i s p ä ä t ä n t ä ä + y h t e i s p ä ä t ö k s e e n + y h t e i s p ä ä t ö k s e k s i + y h t e i s p ä ä t ö k s e l l e + y h t e i s p ä ä t ö k s e l l ä + y h t e i s p ä ä t ö k s e n + y h t e i s p ä ä t ö k s e s s ä + y h t e i s p ä ä t ö k s e s t ä + y h t e i s p ä ä t ö k s i i n + y h t e i s p ä ä t ö k s i ä + y h t e i s p ä ä t ö s + y h t e i s p ä ä t ö s a r t i k l a + y h t e i s p ä ä t ö s a s i a k i r j a a + y h t e i s p ä ä t ö s a s i o i d e n + y h t e i s p ä ä t ö s a s i o i s s a + y h t e i s p ä ä t ö s a s i o i t a + y h t e i s p ä ä t ö s a s p e k t i t + y h t e i s p ä ä t ö s e h d o t u s + y h t e i s p ä ä t ö s h e n g e s s ä + y h t e i s p ä ä t ö s k o k o u k s e e n + y h t e i s p ä ä t ö s k o k o u k s i i n + y h t e i s p ä ä t ö s k y s y m y k s e s s ä + y h t e i s p ä ä t ö s l a u s e l m a + y h t e i s p ä ä t ö s l a u s e l m a s s a + y h t e i s p ä ä t ö s l a u s e l m i a + y h t e i s p ä ä t ö s l i s t a l t a + y h t e i s p ä ä t ö s m a l l i + y h t e i s p ä ä t ö s m e n e t t e l y + y h t e i s p ä ä t ö s m e n e t t e l y i h i n + y h t e i s p ä ä t ö s m e n e t t e l y i l l e + y h t e i s p ä ä t ö s m e n e t t e l y i s s ä + y h t e i s p ä ä t ö s m e n e t t e l y i s t ä + y h t e i s p ä ä t ö s m e n e t t e l y j e n + y h t e i s p ä ä t ö s m e n e t t e l y j ä + y h t e i s p ä ä t ö s m e n e t t e l y k o k o u k s i s t a + y h t e i s p ä ä t ö s m e n e t t e l y l l e + y h t e i s p ä ä t ö s m e n e t t e l y l l ä + y h t e i s p ä ä t ö s m e n e t t e l y n + y h t e i s p ä ä t ö s m e n e t t e l y p r o s e s s i i n + y h t e i s p ä ä t ö s m e n e t t e l y s s ä + y h t e i s p ä ä t ö s m e n e t t e l y s t ä + y h t e i s p ä ä t ö s m e n e t t e l y t + y h t e i s p ä ä t ö s m e n e t t e l y y n + y h t e i s p ä ä t ö s m e n e t t e l y ä + y h t e i s p ä ä t ö s m e n e t t e l y ä k i n + y h t e i s p ä ä t ö s m i e t i n n ö s t ä + y h t e i s p ä ä t ö s m u o t o j a + y h t e i s p ä ä t ö s o h j e l m i a + y h t e i s p ä ä t ö s o h j e l m i i n + y h t e i s p ä ä t ö s o i k e u d e l l e + y h t e i s p ä ä t ö s o i k e u d e n + y h t e i s p ä ä t ö s o i k e u d e t + y h t e i s p ä ä t ö s o i k e u k s i a + y h t e i s p ä ä t ö s o i k e u k s i e n + y h t e i s p ä ä t ö s o i k e u s + y h t e i s p ä ä t ö s o i k e u t e e n + y h t e i s p ä ä t ö s o i k e u t t a + y h t e i s p ä ä t ö s o i k e u t t a a n + y h t e i s p ä ä t ö s o i k e u t t a m m e + y h t e i s p ä ä t ö s p e r i a a t e + y h t e i s p ä ä t ö s p r o s e s s i a + y h t e i s p ä ä t ö s p r o s e s s i i n + y h t e i s p ä ä t ö s p r o s e s s i n + y h t e i s p ä ä t ö s p r o s e s s i s s a + y h t e i s p ä ä t ö s p r o s e s s i s t a + y h t e i s p ä ä t ö s s ä ä d ö k s e s s ä + y h t e i s p ä ä t ö s s ä ä n t ö j e n + y h t e i s p ä ä t ö s t a p a u s t a + y h t e i s p ä ä t ö s t e n + y h t e i s p ä ä t ö s t o i m e n p i t e i d e n + y h t e i s p ä ä t ö s t o i m i v a l l a l l a + y h t e i s p ä ä t ö s t o i m i v a l t a + y h t e i s p ä ä t ö s t o i m i v a l t a a + y h t e i s p ä ä t ö s t o i m i v a l t a a n + y h t e i s p ä ä t ö s t ä + y h t e i s p ä ä t ö s v a i h e + y h t e i s p ä ä t ö s v a i h e e s e e n + y h t e i s p ä ä t ö s v a i h e e s s a + y h t e i s p ä ä t ö s v a l i o k u n n a t + y h t e i s p ä ä t ö s v a l l a l l a + y h t e i s p ä ä t ö s v a l l a n + y h t e i s p ä ä t ö s v a l t a + y h t e i s p ä ä t ö s v a l t a a + y h t e i s p ä ä t ö s v a l t a a m m e + y h t e i s p ä ä t ö s v a l t a i s e t + y h t e i s p ä ä t ö s v a l t a n s a + y h t e i s p ä ä t ö s v a l t u u d e t + y h t e i s p ä ä t ö s v a l t u u k s i a + y h t e i s p ä ä t ö s v a l t u u k s i a a n + y h t e i s p ä ä t ö s v a l t u u k s i e n + y h t e i s p ä ä t ö s v a l t u u k s i e n s a + y h t e i s p ä ä t ö s v a l t u u t e m m e + y h t e i s p ä ä t ö s ä ä n e s t y s + y h t e i s r a h o i t e t t a v a a n + y h t e i s r a h o i t e t t a v a k s i + y h t e i s r a h o i t e t t a v a n + y h t e i s r a h o i t e t t i i n + y h t e i s r a h o i t e t t u i h i n + y h t e i s r a h o i t e t t u j a + y h t e i s r a h o i t e t t u j e n + y h t e i s r a h o i t e t u n + y h t e i s r a h o i t t a a + y h t e i s r a h o i t t a m a t + y h t e i s r a h o i t t a m i a + y h t e i s r a h o i t t a m i s e n + y h t e i s r a h o i t t a m i s e s t a + y h t e i s r a h o i t u k s e e n + y h t e i s r a h o i t u k s e k s i + y h t e i s r a h o i t u k s e l l a + y h t e i s r a h o i t u k s e n + y h t e i s r a h o i t u k s e n a + y h t e i s r a h o i t u k s e s s a + y h t e i s r a h o i t u k s e s t a + y h t e i s r a h o i t u s + y h t e i s r a h o i t u s a s t e e n + y h t e i s r a h o i t u s a s t e t t a + y h t e i s r a h o i t u s b u d j e t t i k o h d a n + y h t e i s r a h o i t u s h a n k k e i s i i n + y h t e i s r a h o i t u s j ä r j e s t e l m i e n + y h t e i s r a h o i t u s j ä r j e s t e l m i l l ä + y h t e i s r a h o i t u s j ä r j e s t e l m ä + y h t e i s r a h o i t u s j ä r j e s t e l m ä ä + y h t e i s r a h o i t u s j ä r j e s t e l y + y h t e i s r a h o i t u s j ä r j e s t e l y i n + y h t e i s r a h o i t u s j ä r j e s t e l y y n + y h t e i s r a h o i t u s k a n n u s t i m e n a + y h t e i s r a h o i t u s k y s y m y s + y h t e i s r a h o i t u s l a s k e l m i i n + y h t e i s r a h o i t u s l i n j a n + y h t e i s r a h o i t u s m a h d o l l i s u u k s i a + y h t e i s r a h o i t u s m a h d o l l i s u u k s i e n + y h t e i s r a h o i t u s m e n e t t e l y + y h t e i s r a h o i t u s m ä ä r ä t + y h t e i s r a h o i t u s o h j e l m i i n + y h t e i s r a h o i t u s o h j e l m i s s a + y h t e i s r a h o i t u s o n g e l m a a + y h t e i s r a h o i t u s o n g e l m i a + y h t e i s r a h o i t u s o s u u d e n + y h t e i s r a h o i t u s o s u u d e s t a + y h t e i s r a h o i t u s o s u u k s i a + y h t e i s r a h o i t u s o s u u k s i s t a + y h t e i s r a h o i t u s o s u u s + y h t e i s r a h o i t u s o s u u t t a + y h t e i s r a h o i t u s p e r i a a t e + y h t e i s r a h o i t u s p e r i a a t t e e n + y h t e i s r a h o i t u s p r o j e k t e i h i n + y h t e i s r a h o i t u s s o p i m u k s e s s a + y h t e i s r a h o i t u s s u h d e + y h t e i s r a h o i t u s s ä ä n n ö k s e t + y h t e i s r a h o i t u s s ä ä n n ö s t ä + y h t e i s r a h o i t u s s ä ä n n ö t + y h t e i s r a h o i t u s t a + y h t e i s r a h o i t u s t i l i l l e + y h t e i s r a h o i t u s t o i m i i n + y h t e i s r a h o i t u s t u k i o h j e l m a n + y h t e i s r a h o i t u s t u k i o h j e l m i e n + y h t e i s r a h o i t u s v a a t i m u k s i a + y h t e i s r a h o i t u s v a a t i m u s + y h t e i s r a h o i t u s v a a t i m u s t a + y h t e i s r a h o i t u s v a r o i l l a + y h t e i s r a h o i t u s v a r o i s t a + y h t e i s r a h o i t u s v e l v o i t t e e s t a + y h t e i s r a h o i t u s v ä l i n e + y h t e i s r a h o i t u s v ä l i n e i d e n + y h t e i s r a j o i t u s s ä ä n t ö + y h t e i s r e k i s t e r ö i n t i i n + y h t e i s r e s u r s s i + y h t e i s r i n t a m a a + y h t e i s r i n t a m a a n + y h t e i s r i n t a m a n + y h t e i s r i n t a m a s s a + y h t e i s r y h m i ä + y h t e i s r y h m ä n + y h t e i s r y h m ä s s ä + y h t e i s s i j o i t u s h a n k k e i t a + y h t e i s s i j o i t u s y r i t y k s e n + y h t e i s s i j o i t u s y r i t y k s e t + y h t e i s s i j o i t u s y r i t y k s i i n + y h t e i s s i j o i t u s y r i t y k s i ä + y h t e i s s i j o i t u s y r i t y s + y h t e i s s i j o i t u s y r i t y s r a h a s t o j e n + y h t e i s s i j o i t u s y r i t y s t e n + y h t e i s s i t o u m u k s i a + y h t e i s s o p i m u k s i a + y h t e i s s o p i m u k s i i n + y h t e i s s o p i m u k s i s t a + y h t e i s s o p i m u s + y h t e i s s t r a t e g i a + y h t e i s s u m m a + y h t e i s s ä ä n t e l y + y h t e i s s ä ä n t e l y l l e + y h t e i s s ä ä n t e l y l l ä + y h t e i s s ä ä n t e l y m e n e t t e l y ä + y h t e i s s ä ä n t e l y n + y h t e i s s ä ä n t e l y n ä + y h t e i s s ä ä n t e l y s s ä + y h t e i s s ä ä n t e l y s t ä + y h t e i s s ä ä n t e l y y n + y h t e i s s ä ä n t e l y ä + y h t e i s s ä ä t e l y + y h t e i s s ä ä t e l y ä + y h t e i s t a l o u s + y h t e i s t a p a a m i s t e n + y h t e i s t a r k i s t u k s e e n + y h t e i s t a r k i s t u s t a + y h t e i s t a v o i t t e e n a + y h t e i s t e n + y h t e i s t e r m i n a a l e j a + y h t e i s t i l a s t o j e n + y h t e i s t i l e i h i n + y h t e i s t i l o i l l a + y h t e i s t o i m e m m e + y h t e i s t o i m e t + y h t e i s t o i m i a + y h t e i s t o i m i i n + y h t e i s t o i m i l l a + y h t e i s t o i m i n + y h t e i s t o i m i n n a l l a + y h t e i s t o i m i n n a l l i s i a + y h t e i s t o i m i n n a n + y h t e i s t o i m i n n a s s a + y h t e i s t o i m i n n a s t a + y h t e i s t o i m i n t a + y h t e i s t o i m i n t a a + y h t e i s t o i m i n t a a n + y h t e i s t o i m i n t a a n s a + y h t e i s t o i m i n t a k o k o u k s e n + y h t e i s t o i m i n t a k o n e i s t o + y h t e i s t o i m i n t a m a h d o l l i s u u k s i a + y h t e i s t o i m i n t a m a h d o l l i s u u k s i e n + y h t e i s t o i m i n t a m a l l e j a + y h t e i s t o i m i n t a m e k a n i s m i t + y h t e i s t o i m i n t a m e n e t e l m ä t + y h t e i s t o i m i n t a m e n e t t e l y + y h t e i s t o i m i n t a m e n e t t e l y j e n + y h t e i s t o i m i n t a m e n e t t e l y l l ä + y h t e i s t o i m i n t a m e n e t t e l y n + y h t e i s t o i m i n t a m e n e t t e l y s t ä + y h t e i s t o i m i n t a m e n e t t e l y y n + y h t e i s t o i m i n t a m e n e t t e l y ä + y h t e i s t o i m i n t a m u i s t i o + y h t e i s t o i m i n t a m u i s t i o n + y h t e i s t o i m i n t a o h j e l m a a + y h t e i s t o i m i n t a o r g a n i s a a t i o t + y h t e i s t o i m i n t a s o p i m u k s e n + y h t e i s t o i m i n t a s o p i m u k s i s t a + y h t e i s t o i m i n t a s u u n n i t e l m a s t a + y h t e i s t o i m i n t a s u u n n i t e l m i a + y h t e i s t o i m i n t a t a p a + y h t e i s t o i m i n t a t a p a a + y h t e i s t o i m i n t a t a p a a n + y h t e i s t o i m i n t a t a v a n + y h t e i s t o i m i s t a + y h t e i s t o t e u t u k s e n + y h t e i s t o t e u t u s + y h t e i s t o t e u t u s h a n k k e e t + y h t e i s t o t e u t u s h a n k k e i d e n + y h t e i s t o t e u t u s t e h t ä v i e n + y h t e i s t u n n u k s e t + y h t e i s t u n n u s l e n t o j e n + y h t e i s t u n n u s s o p i m u s t e n + y h t e i s t u n n u s t e n + y h t e i s t u o t a n n o i l l e + y h t e i s t u o t a n n o k s i + y h t e i s t u o t a n n o l l a + y h t e i s t u o t a n n o n + y h t e i s t u o t a n n o s s a + y h t e i s t u o t a n n o s t a + y h t e i s t u o t a n t o + y h t e i s t u o t a n t o a + y h t e i s t u o t a n t o h a n k k e e n + y h t e i s t u o t a n t o h a n k k e i t a + y h t e i s t u o t a n t o j a + y h t e i s t u o t a n t o k o k e i l u j a + y h t e i s t u o t a n t o l a i t o k s i a + y h t e i s t u o t a n t o l a i t o s t e n + y h t e i s t u o t a n t o n a + y h t e i s t u o t a n t o o n + y h t e i s t u o t a n t o p o l i t i i k k a + y h t e i s t u o t a n t o p r o s e s s e i l l a + y h t e i s t u o t a n t o p r o s e s s e i s s a + y h t e i s t u o t a n t o s ä h k ö s t ä + y h t e i s t u o t a n t o v o i m a l a n a + y h t e i s t u o t a n t o v o i m a l a t + y h t e i s t u o t a n t o v o i m a l o i d e n + y h t e i s t u o t a n t o v o i m a l o i s s a + y h t e i s t u o t a n t o v o i m a l o i t a + y h t e i s t u o t a n t o v ä l i n e + y h t e i s t u o t t a j a n a + y h t e i s t u o t t a j a t + y h t e i s t y ö + y h t e i s t y ö a i h e i s t a + y h t e i s t y ö a l a a + y h t e i s t y ö a l a n a + y h t e i s t y ö a l a t + y h t e i s t y ö a l o i h i n + y h t e i s t y ö a l o i l l a + y h t e i s t y ö a l o i s t a + y h t e i s t y ö a l o i t e + y h t e i s t y ö a l o i t t e e n + y h t e i s t y ö a l o i t t e e t + y h t e i s t y ö a l o i t t e i d e n + y h t e i s t y ö a l o i t t e i s i i n + y h t e i s t y ö a l o i t t e i s t a + y h t e i s t y ö a l o i t t e i t a + y h t e i s t y ö a l o j a + y h t e i s t y ö a l o j e n + y h t e i s t y ö a l u e e l l e + y h t e i s t y ö a l u e e n + y h t e i s t y ö a l u e e t + y h t e i s t y ö a l u e i d e n + y h t e i s t y ö a l u e i l l e + y h t e i s t y ö a l u e i s t a + y h t e i s t y ö a l u e i t a + y h t e i s t y ö a l u e t t a + y h t e i s t y ö a s e n t e e n + y h t e i s t y ö d y n a m i i k k a + y h t e i s t y ö e h d o t u k s i s t a + y h t e i s t y ö e l i m e l l e + y h t e i s t y ö e l i m e n + y h t e i s t y ö e l i n + y h t e i s t y ö e l i n t e n + y h t e i s t y ö f o o r u m e i t a + y h t e i s t y ö f o o r u m i + y h t e i s t y ö f o o r u m i a + y h t e i s t y ö f o o r u m i n + y h t e i s t y ö f o o r u m i t + y h t e i s t y ö h a l u + y h t e i s t y ö h a l u a + y h t e i s t y ö h a l u a a n + y h t e i s t y ö h a l u i s e e n + y h t e i s t y ö h a l u i s e k s i + y h t e i s t y ö h a l u i s e m m i k s i + y h t e i s t y ö h a l u i s e m p a a + y h t e i s t y ö h a l u i s e m p i + y h t e i s t y ö h a l u i s e m p i a + y h t e i s t y ö h a l u i s e s t a + y h t e i s t y ö h a l u i s e s t i + y h t e i s t y ö h a l u i s i a + y h t e i s t y ö h a l u k a s + y h t e i s t y ö h a l u k k a i t a + y h t e i s t y ö h a l u k k u u d e l l a + y h t e i s t y ö h a l u k k u u d e s t a + y h t e i s t y ö h a l u k k u u d e s t a a n + y h t e i s t y ö h a l u k k u u s + y h t e i s t y ö h a l u k k u u t t a + y h t e i s t y ö h a l u m m e + y h t e i s t y ö h a l u s t a + y h t e i s t y ö h a l u s t a a n + y h t e i s t y ö h a l u t t o m i a + y h t e i s t y ö h a l u t t o m u u d e s t a + y h t e i s t y ö h a l u t t o m u u s + y h t e i s t y ö h a l u t t o m u u t t a + y h t e i s t y ö h a n k e + y h t e i s t y ö h a n k e t t a + y h t e i s t y ö h a n k k e e l l a + y h t e i s t y ö h a n k k e e l l e + y h t e i s t y ö h a n k k e e n + y h t e i s t y ö h a n k k e e t + y h t e i s t y ö h a n k k e i d e n + y h t e i s t y ö h a n k k e i l l a + y h t e i s t y ö h a n k k e i l l e + y h t e i s t y ö h a n k k e i s i i n + y h t e i s t y ö h a n k k e i s s a + y h t e i s t y ö h a n k k e i s t a + y h t e i s t y ö h a n k k e i t a + y h t e i s t y ö h e n g e l l e + y h t e i s t y ö h e n g e l l ä + y h t e i s t y ö h e n g e n + y h t e i s t y ö h e n g e s s ä + y h t e i s t y ö h e n g e s t ä + y h t e i s t y ö h e n k e e n + y h t e i s t y ö h e n k e e n n e + y h t e i s t y ö h e n k e ä + y h t e i s t y ö h e n k e ä n n e + y h t e i s t y ö h e n k i + y h t e i s t y ö h e n k i n e n + y h t e i s t y ö h e n k i s e m p ä ä n + y h t e i s t y ö h ö m m e + y h t e i s t y ö h ö n + y h t e i s t y ö i l m a p i i r i + y h t e i s t y ö i l m a p i i r i n + y h t e i s t y ö j a k s o + y h t e i s t y ö j a k s o j a + y h t e i s t y ö j ä r j e s t e l m i ä + y h t e i s t y ö j ä r j e s t e l m ä + y h t e i s t y ö j ä r j e s t e l m ä l l e + y h t e i s t y ö j ä r j e s t e l m ä l l ä + y h t e i s t y ö j ä r j e s t e l m ä n + y h t e i s t y ö j ä r j e s t e l m ä s s ä + y h t e i s t y ö j ä r j e s t e l m ä s t ä + y h t e i s t y ö j ä r j e s t e l m ä t + y h t e i s t y ö j ä r j e s t e l m ä ä + y h t e i s t y ö j ä r j e s t e l y + y h t e i s t y ö j ä r j e s t e l y i h i n + y h t e i s t y ö j ä r j e s t e l y i n + y h t e i s t y ö j ä r j e s t e l y i s t ä + y h t e i s t y ö j ä r j e s t e l y j e n + y h t e i s t y ö j ä r j e s t e l y j ä + y h t e i s t y ö j ä r j e s t e l y j ä ä n + y h t e i s t y ö j ä r j e s t e l y n + y h t e i s t y ö j ä r j e s t e l y t + y h t e i s t y ö j ä r j e s t ö + y h t e i s t y ö j ä r j e s t ö i l l ä + y h t e i s t y ö j ä r j e s t ö k s i + y h t e i s t y ö j ä r j e s t ö n + y h t e i s t y ö j ä r j e s t ö s s ä + y h t e i s t y ö k a n a v i a + y h t e i s t y ö k e h y k s e n + y h t e i s t y ö k e h y k s e s s ä + y h t e i s t y ö k e h y k s e s t ä + y h t e i s t y ö k e h y k s e t + y h t e i s t y ö k e h y s + y h t e i s t y ö k e h y s t ä + y h t e i s t y ö k e i n o j a + y h t e i s t y ö k e s k e i s e m p i + y h t e i s t y ö k e s k u s t e n + y h t e i s t y ö k i i s t a n + y h t e i s t y ö k i n + y h t e i s t y ö k o k e m u s t a + y h t e i s t y ö k o k o u k s e s s a + y h t e i s t y ö k o k o u k s i a + y h t e i s t y ö k o k o u s + y h t e i s t y ö k o m i t e a + y h t e i s t y ö k o m i t e a a + y h t e i s t y ö k o m i t e a m m e + y h t e i s t y ö k o m i t e a n + y h t e i s t y ö k o m i t e a s s a + y h t e i s t y ö k o n f e r e n s s i a + y h t e i s t y ö k o n t a k t e j a + y h t e i s t y ö k s i + y h t e i s t y ö k u l t t u u r i + y h t e i s t y ö k u l t t u u r i s t a + y h t e i s t y ö k u l u j a + y h t e i s t y ö k u m p p a n e i d e n + y h t e i s t y ö k u m p p a n e i d e n s a + y h t e i s t y ö k u m p p a n e i h i n + y h t e i s t y ö k u m p p a n e i k s i + y h t e i s t y ö k u m p p a n e i l l e + y h t e i s t y ö k u m p p a n e i l l e e n + y h t e i s t y ö k u m p p a n e i n a + y h t e i s t y ö k u m p p a n e i n a m m e + y h t e i s t y ö k u m p p a n e i s t a + y h t e i s t y ö k u m p p a n e i s t a m m e + y h t e i s t y ö k u m p p a n e i t a + y h t e i s t y ö k u m p p a n i + y h t e i s t y ö k u m p p a n i a + y h t e i s t y ö k u m p p a n i e n + y h t e i s t y ö k u m p p a n i m m e + y h t e i s t y ö k u m p p a n i n a + y h t e i s t y ö k u m p p a n i t + y h t e i s t y ö k u m p p a n i v a l t i o i d e m m e + y h t e i s t y ö k u m p p a n i v a l t i o i d e n + y h t e i s t y ö k u m p p a n u u d e n + y h t e i s t y ö k u m p p a n u u d e s t a + y h t e i s t y ö k u m p p a n u u k s i a + y h t e i s t y ö k u m p p a n u u s + y h t e i s t y ö k u m p p a n u u t e e n + y h t e i s t y ö k y k y i s e m m ä l l e + y h t e i s t y ö k y k y i s e m m ä n + y h t e i s t y ö k y k y i s e m p i + y h t e i s t y ö k y k y i s i k s i + y h t e i s t y ö k y k y i s i m p i ä + y h t e i s t y ö k y k y n s ä + y h t e i s t y ö k y k y y n + y h t e i s t y ö k y k y y n n e + y h t e i s t y ö k y k y ä + y h t e i s t y ö k y s y m y k s i s t ä + y h t e i s t y ö k y s y m y k s i ä + y h t e i s t y ö k y v y n + y h t e i s t y ö k y v y s t ä + y h t e i s t y ö k y v y s t ä ä n + y h t e i s t y ö k ä y t ä n t ö j e n + y h t e i s t y ö k ä y t ä n t ö ä + y h t e i s t y ö l a u s e k k e e n + y h t e i s t y ö l i i t t o n a + y h t e i s t y ö l i n j a u k s e t + y h t e i s t y ö l i n k k e j ä + y h t e i s t y ö l l e + y h t e i s t y ö l l e m m e + y h t e i s t y ö l l ä + y h t e i s t y ö l l ä m m e + y h t e i s t y ö l l ä ä n + y h t e i s t y ö l t ä + y h t e i s t y ö m a h d o l l i s u u d e n + y h t e i s t y ö m a h d o l l i s u u d e t + y h t e i s t y ö m a h d o l l i s u u k s i a + y h t e i s t y ö m a h d o l l i s u u k s i a m m e + y h t e i s t y ö m a h d o l l i s u u k s i e n + y h t e i s t y ö m a h d o l l i s u u k s i l l e + y h t e i s t y ö m a l l e j a + y h t e i s t y ö m a l l i + y h t e i s t y ö m a l l i a + y h t e i s t y ö m a l l i e n + y h t e i s t y ö m a l l i n + y h t e i s t y ö m a l l i s s a + y h t e i s t y ö m a l l i t + y h t e i s t y ö m e k a n i s m e i l l a + y h t e i s t y ö m e k a n i s m e j a + y h t e i s t y ö m e k a n i s m i + y h t e i s t y ö m e k a n i s m i a + y h t e i s t y ö m e k a n i s m i e n + y h t e i s t y ö m e k a n i s m i n + y h t e i s t y ö m e k a n i s m i s t a + y h t e i s t y ö m e k a n i s m i t + y h t e i s t y ö m e n e t e l m i s t ä + y h t e i s t y ö m e n e t e l m i ä + y h t e i s t y ö m e n e t e l m ä k s i + y h t e i s t y ö m e n e t e l m ä n + y h t e i s t y ö m e n e t e l m ä n s ä + y h t e i s t y ö m e n e t e l m ä t + y h t e i s t y ö m e n e t e l m ä ä + y h t e i s t y ö m e n e t t e l y + y h t e i s t y ö m e n e t t e l y j e n + y h t e i s t y ö m e n e t t e l y j ä + y h t e i s t y ö m e n e t t e l y n + y h t e i s t y ö m e n e t t e l y s t ä + y h t e i s t y ö m e n e t t e l y ä + y h t e i s t y ö m i n i s t e r i n ä + y h t e i s t y ö m m e + y h t e i s t y ö m u o d o i l l e + y h t e i s t y ö m u o d o i s s a + y h t e i s t y ö m u o d o i s t a + y h t e i s t y ö m u o d o k s i + y h t e i s t y ö m u o d o n + y h t e i s t y ö m u o d o s t a + y h t e i s t y ö m u o d o t + y h t e i s t y ö m u o t o + y h t e i s t y ö m u o t o a + y h t e i s t y ö m u o t o i h i n + y h t e i s t y ö m u o t o j a + y h t e i s t y ö m u o t o j e n + y h t e i s t y ö m u o t o o n + y h t e i s t y ö n + y h t e i s t y ö n e u v o s t o + y h t e i s t y ö n e u v o s t o a + y h t e i s t y ö n e u v o s t o l l a + y h t e i s t y ö n e u v o s t o l l e + y h t e i s t y ö n e u v o s t o m m e + y h t e i s t y ö n e u v o s t o n + y h t e i s t y ö n e u v o s t o o n + y h t e i s t y ö n e u v o s t o s s a + y h t e i s t y ö n e u v o t t e l i j o i n a + y h t e i s t y ö n e u v o t t e l u i h i n + y h t e i s t y ö n e u v o t t e l u j e n + y h t e i s t y ö n e u v o t t e l u t + y h t e i s t y ö n s ä + y h t e i s t y ö n ä + y h t e i s t y ö n ä k y m ä t + y h t e i s t y ö n ä k ö k u l m a s t a + y h t e i s t y ö o h j e l m a + y h t e i s t y ö o h j e l m a a + y h t e i s t y ö o h j e l m a a n + y h t e i s t y ö o h j e l m a a n s a + y h t e i s t y ö o h j e l m a m m e + y h t e i s t y ö o h j e l m a n + y h t e i s t y ö o h j e l m a s s a + y h t e i s t y ö o h j e l m a s s a a n + y h t e i s t y ö o h j e l m a s t a + y h t e i s t y ö o h j e l m a t + y h t e i s t y ö o h j e l m i a + y h t e i s t y ö o h j e l m i a m m e + y h t e i s t y ö o h j e l m i e m m e + y h t e i s t y ö o h j e l m i e n + y h t e i s t y ö o h j e l m i e n s a + y h t e i s t y ö o h j e l m i i m m e + y h t e i s t y ö o h j e l m i i n + y h t e i s t y ö o h j e l m i l l a + y h t e i s t y ö o h j e l m i l l e + y h t e i s t y ö o h j e l m i s s a + y h t e i s t y ö o h j e l m i s s a a n + y h t e i s t y ö o h j e l m i s s a m m e + y h t e i s t y ö o h j e l m i s t a + y h t e i s t y ö o n g e l m i i n + y h t e i s t y ö o r g a n i s a a t i o n a + y h t e i s t y ö p a k e t i n + y h t e i s t y ö p a k k o + y h t e i s t y ö p a l k i n n o n + y h t e i s t y ö p e l i + y h t e i s t y ö p e r i a a t t e e n + y h t e i s t y ö p e r i a a t t e i d e n + y h t e i s t y ö p e r i a a t t e i s i i n + y h t e i s t y ö p e r i a a t t e i s t a + y h t e i s t y ö p e r i a a t t e i t a + y h t e i s t y ö p e r u s t a n + y h t e i s t y ö p i i r i + y h t e i s t y ö p i i r i i n + y h t e i s t y ö p i l a r i i n + y h t e i s t y ö p o h j a a + y h t e i s t y ö p o l i t i i k a l l a + y h t e i s t y ö p o l i t i i k a l l e + y h t e i s t y ö p o l i t i i k a n + y h t e i s t y ö p o l i t i i k a s s a + y h t e i s t y ö p o l i t i i k a s s a a n + y h t e i s t y ö p o l i t i i k a s s a m m e + y h t e i s t y ö p o l i t i i k a s t a + y h t e i s t y ö p o l i t i i k a t + y h t e i s t y ö p o l i t i i k k a + y h t e i s t y ö p o l i t i i k k a a + y h t e i s t y ö p o l i t i i k k a a m m e + y h t e i s t y ö p o l i t i i k k a a n + y h t e i s t y ö p o l i t i i k k a m m e + y h t e i s t y ö p o l i t i i k k a n s a + y h t e i s t y ö p o l i t i i k k o i h i n + y h t e i s t y ö p o l i t i i k k o j a + y h t e i s t y ö p o l i t i i k k o j e n + y h t e i s t y ö p o l i t i i k o i s s a + y h t e i s t y ö p o l i t i i k o i s s a a n + y h t e i s t y ö p o n n i s t e l u j a + y h t e i s t y ö p o n n i s t e l u j a a n + y h t e i s t y ö p o n n i s t e l u j e n + y h t e i s t y ö p o n n i s t u k s i s s a m m e + y h t e i s t y ö p o n n i s t u k s i s t a + y h t e i s t y ö p o t e n t i a a l i a + y h t e i s t y ö p o t e n t i a a l i n + y h t e i s t y ö p r o j e k t e j a + y h t e i s t y ö p r o j e k t i + y h t e i s t y ö p r o j e k t i a + y h t e i s t y ö p r o j e k t i e n + y h t e i s t y ö p r o j e k t i i n + y h t e i s t y ö p r o j e k t i s t a + y h t e i s t y ö p r o j e k t i t + y h t e i s t y ö p r o s e s s e j a + y h t e i s t y ö p r o s e s s i + y h t e i s t y ö p r o s e s s i a + y h t e i s t y ö p r o s e s s i i n + y h t e i s t y ö p r o s e s s i k s i + y h t e i s t y ö p r o s e s s i n + y h t e i s t y ö p r o s e s s i s s a + y h t e i s t y ö p r o s e s s i t + y h t e i s t y ö p u i t e s o p i m u k s e n + y h t e i s t y ö p u i t e s o p i m u k s e s t a + y h t e i s t y ö p u i t e s o p i m u s t a + y h t e i s t y ö p u i t t e e t + y h t e i s t y ö p u i t t e i d e n + y h t e i s t y ö p u i t t e i s i i n + y h t e i s t y ö p y r k i m y k s e m m e + y h t e i s t y ö p y r k i m y k s i i n + y h t e i s t y ö p y r k i m y k s i l l ä + y h t e i s t y ö p y r k i m y k s i ä + y h t e i s t y ö p y y n n ö n + y h t e i s t y ö p ä ä o s a s t o + y h t e i s t y ö p ö y t ä k i r j a + y h t e i s t y ö p ö y t ä k i r j a k s i + y h t e i s t y ö p ö y t ä k i r j a n + y h t e i s t y ö r a h a s t o n + y h t e i s t y ö r a k e n n e + y h t e i s t y ö r a k e n t e e n + y h t e i s t y ö r a k e n t e e t + y h t e i s t y ö r a k e n t e i d e n + y h t e i s t y ö r a k e n t e i t a + y h t e i s t y ö r a k e n t e i t a m m e + y h t e i s t y ö r a t k a i s u j a + y h t e i s t y ö r a t k a i s u j e n + y h t e i s t y ö r e s e p t i + y h t e i s t y ö r y h m i e n + y h t e i s t y ö r y h m i ä + y h t e i s t y ö r y h m ä + y h t e i s t y ö r y h m ä n + y h t e i s t y ö r y h m ä s s ä + y h t e i s t y ö s e k t o r e i l l a + y h t e i s t y ö s i d e + y h t e i s t y ö s i t e i t ä + y h t e i s t y ö s i t o u m u s + y h t e i s t y ö s o p i m u k s e e n + y h t e i s t y ö s o p i m u k s e k s i + y h t e i s t y ö s o p i m u k s e l l a + y h t e i s t y ö s o p i m u k s e l l e + y h t e i s t y ö s o p i m u k s e m m e + y h t e i s t y ö s o p i m u k s e n + y h t e i s t y ö s o p i m u k s e n s a + y h t e i s t y ö s o p i m u k s e s s a + y h t e i s t y ö s o p i m u k s e s s a a n + y h t e i s t y ö s o p i m u k s e s t a + y h t e i s t y ö s o p i m u k s e t + y h t e i s t y ö s o p i m u k s i a + y h t e i s t y ö s o p i m u k s i e n + y h t e i s t y ö s o p i m u k s i i m m e + y h t e i s t y ö s o p i m u k s i i n + y h t e i s t y ö s o p i m u k s i k s i + y h t e i s t y ö s o p i m u k s i l l a + y h t e i s t y ö s o p i m u k s i l l e + y h t e i s t y ö s o p i m u k s i s s a + y h t e i s t y ö s o p i m u k s i s t a + y h t e i s t y ö s o p i m u s + y h t e i s t y ö s o p i m u s n e u v o t t e l u j a + y h t e i s t y ö s o p i m u s t a + y h t e i s t y ö s o p i m u s t a a n + y h t e i s t y ö s o p i m u s t e n + y h t e i s t y ö s s ä + y h t e i s t y ö s s ä m m e + y h t e i s t y ö s s ä ä n + y h t e i s t y ö s t r a t e g i a + y h t e i s t y ö s t r a t e g i a a + y h t e i s t y ö s t r a t e g i a a m m e + y h t e i s t y ö s t r a t e g i a l l e + y h t e i s t y ö s t r a t e g i a n + y h t e i s t y ö s t r a t e g i a s s a + y h t e i s t y ö s t r a t e g i a s t a + y h t e i s t y ö s t r a t e g i o i d e m m e + y h t e i s t y ö s t r a t e g i o i l l a + y h t e i s t y ö s t r a t e g i o i s s a m m e + y h t e i s t y ö s t r a t e g i o i s t a + y h t e i s t y ö s t r a t e g i o i t a + y h t e i s t y ö s t ä + y h t e i s t y ö s t ä m m e + y h t e i s t y ö s t ä ä n + y h t e i s t y ö s u h d e + y h t e i s t y ö s u h d e t t a + y h t e i s t y ö s u h t e e l l e + y h t e i s t y ö s u h t e e m m e + y h t e i s t y ö s u h t e e n + y h t e i s t y ö s u h t e e s e e n + y h t e i s t y ö s u h t e e t + y h t e i s t y ö s u h t e i d e n + y h t e i s t y ö s u h t e i d e n s a + y h t e i s t y ö s u h t e i l l e + y h t e i s t y ö s u h t e i s i i n + y h t e i s t y ö s u h t e i s s a + y h t e i s t y ö s u h t e i s t a + y h t e i s t y ö s u h t e i t a + y h t e i s t y ö s u h t e i t a a n + y h t e i s t y ö s u u n n i t e l m a + y h t e i s t y ö s u u n n i t e l m a a + y h t e i s t y ö s u u n n i t e l m a a n + y h t e i s t y ö s u u n n i t e l m a n + y h t e i s t y ö s u u n n i t e l m i a + y h t e i s t y ö s u u n n i t e l m i e n + y h t e i s t y ö s ä ä n n ö t + y h t e i s t y ö s ä ä n t ö i h i n + y h t e i s t y ö t a h o j e n + y h t e i s t y ö t a h t o a + y h t e i s t y ö t a p a + y h t e i s t y ö t a p o i h i n + y h t e i s t y ö t a p o j a + y h t e i s t y ö t a p o j a a n + y h t e i s t y ö t a r j o u k s e n + y h t e i s t y ö t a r j o u k s e n n e + y h t e i s t y ö t a r j o u k s i a + y h t e i s t y ö t a r j o u s + y h t e i s t y ö t a r j o u s t a + y h t e i s t y ö t a r j o u s t a n n e + y h t e i s t y ö t a r p e e s e e n + y h t e i s t y ö t a r p e i t a + y h t e i s t y ö t a r v e t t a + y h t e i s t y ö t a s o l l e + y h t e i s t y ö t a s o n + y h t e i s t y ö t a v a s t a + y h t e i s t y ö t a v a t + y h t e i s t y ö t a v o i t t e e n + y h t e i s t y ö t a v o i t t e i d e n + y h t e i s t y ö t e h t ä v i i n + y h t e i s t y ö t e h t ä v i s s ä + y h t e i s t y ö t e h t ä v ä ä + y h t e i s t y ö t o i m e n p i t e e t + y h t e i s t y ö t o i m e n p i t e i l l e + y h t e i s t y ö t o i m e n p i t e i s t ä + y h t e i s t y ö t o i m e n p i t e i t ä + y h t e i s t y ö t o i m e t + y h t e i s t y ö t o i m i a + y h t e i s t y ö t o i m i a m m e + y h t e i s t y ö t o i m i e n + y h t e i s t y ö t o i m i e n s a + y h t e i s t y ö t o i m i i n + y h t e i s t y ö t o i m i s s a + y h t e i s t y ö t o i m i s t a + y h t e i s t y ö t u e n + y h t e i s t y ö t ä + y h t e i s t y ö t ä m m e + y h t e i s t y ö t ä ä n + y h t e i s t y ö u l o t t u v u u t t a + y h t e i s t y ö v a a t i m u k s e t + y h t e i s t y ö v a i h e e n + y h t e i s t y ö v a i h t o e h d o i s t a + y h t e i s t y ö v a l i o k u n n a n + y h t e i s t y ö v a l i o k u n n a s s a + y h t e i s t y ö v a l i o k u n n i s s a + y h t e i s t y ö v a l i o k u n t a + y h t e i s t y ö v a l i o k u n t a m m e + y h t e i s t y ö v a l i o k u n t i e n + y h t e i s t y ö v a l m i u d e s t a + y h t e i s t y ö v a l m i u d e t + y h t e i s t y ö v a l m i u k s i e n + y h t e i s t y ö v a l m i u s + y h t e i s t y ö v a l m i u t t a + y h t e i s t y ö v a l m i u t t a m m e + y h t e i s t y ö v a l t i o i d e n + y h t e i s t y ö v a l t u u s k u n t a + y h t e i s t y ö v a r o j e n + y h t e i s t y ö v e l v o i t t e e t + y h t e i s t y ö v e r k k o + y h t e i s t y ö v e r k k o a + y h t e i s t y ö v e r k o n + y h t e i s t y ö v e r k o s t o + y h t e i s t y ö v e r k o s t o i h i n + y h t e i s t y ö v e r k o s t o i l l a + y h t e i s t y ö v e r k o s t o j a + y h t e i s t y ö v e r k o s t o j e n + y h t e i s t y ö v e r k o s t o n + y h t e i s t y ö v e r k o s t o o n + y h t e i s t y ö v i r a n o m a i n e n + y h t e i s t y ö v i r a s t o + y h t e i s t y ö v i r a s t o a + y h t e i s t y ö v i r a s t o i l l e + y h t e i s t y ö v i r a s t o n + y h t e i s t y ö v i r a s t o s t a + y h t e i s t y ö v u o r o p u h e l u a + y h t e i s t y ö v u o s i a + y h t e i s t y ö v u o t t a + y h t e i s t y ö v ä l i n e + y h t e i s t y ö v ä l i n e e k s i + y h t e i s t y ö v ä l i n e e n + y h t e i s t y ö v ä l i n e e n s ä + y h t e i s t y ö v ä l i n e e n ä + y h t e i s t y ö v ä l i n e e t + y h t e i s t y ö v ä l i n e i d e n + y h t e i s t y ö v ä l i n e i l l ä + y h t e i s t y ö v ä l i n e i t ä + y h t e i s t y ö v ä l i n e i t ä m m e + y h t e i s t y ö v ä l i n e t t ä + y h t e i s t y ö y h t e i s ö + y h t e i s t y ö y k s i k k ö + y h t e i s t y ö y k s i k k ö j e n + y h t e i s t y ö y k s i k ö n + y h t e i s t y ö y r i t y s t e n + y h t e i s t ä + y h t e i s v a i k u t u k s e l l a + y h t e i s v a i k u t u k s e n + y h t e i s v a i k u t u k s e s s a + y h t e i s v a i k u t u k s e s t a + y h t e i s v a i k u t u k s e t + y h t e i s v a i k u t u k s i a + y h t e i s v a i k u t u s + y h t e i s v a i k u t u s t a + y h t e i s v a k u u t t a m i s e e n + y h t e i s v a l i o k u n n i s s a + y h t e i s v a l i o k u n t a + y h t e i s v a l t u u s k u n t a + y h t e i s v a l t u u s k u n t a a n + y h t e i s v a l u u t a k s i + y h t e i s v a l u u t a l l a + y h t e i s v a l u u t a l l e + y h t e i s v a l u u t a l l e m m e + y h t e i s v a l u u t a n + y h t e i s v a l u u t a s t a + y h t e i s v a l u u t t a + y h t e i s v a l u u t t a a + y h t e i s v a l u u t t a a k a a n + y h t e i s v a l u u t t a a m m e + y h t e i s v a l u u t t a a n + y h t e i s v a l u u t t a j ä r j e s t e l m ä n + y h t e i s v a l u u t t a m m e + y h t e i s v a l u u t t a n s a + y h t e i s v a l u u t t o j a + y h t e i s v a l v o n t a + y h t e i s v a l v o n t a j ä r j e s t e l m i e n + y h t e i s v a l v o n t a j ä r j e s t ö + y h t e i s v a l v o n t a j ä r j e s t ö i l l e + y h t e i s v a l v o n t a j ä r j e s t ö i l l ä + y h t e i s v a l v o n t a j ä r j e s t ö i l t ä + y h t e i s v a l v o n t a j ä r j e s t ö j e n + y h t e i s v a l v o n t a j ä r j e s t ö j ä + y h t e i s v a l v o n t a j ä r j e s t ö l t ä + y h t e i s v a l v o n t a j ä r j e s t ö t + y h t e i s v a l v o n t a j ä r j e s t ö ä + y h t e i s v a l v o n t a m e k a n i s m e j a + y h t e i s v a s t a u s + y h t e i s v a s t u u + y h t e i s v a s t u u a l a a n + y h t e i s v a s t u u e h d o n + y h t e i s v a s t u u h a n + y h t e i s v a s t u u h e n k e e n + y h t e i s v a s t u u h e n k e ä + y h t e i s v a s t u u j ä r j e s t e l m i e n + y h t e i s v a s t u u j ä r j e s t e l m i ä + y h t e i s v a s t u u j ä r j e s t e l m ä + y h t e i s v a s t u u j ä r j e s t e l m ä n + y h t e i s v a s t u u k y s y m y s t ä + y h t e i s v a s t u u k ä y t ä n t ö j ä + y h t e i s v a s t u u l a u s e k e + y h t e i s v a s t u u l a u s e k e t t a + y h t e i s v a s t u u l a u s e k k e e s t a + y h t e i s v a s t u u l l a + y h t e i s v a s t u u l l i s e e n + y h t e i s v a s t u u l l i s e m m a l l a + y h t e i s v a s t u u l l i s e m m i n + y h t e i s v a s t u u l l i s e m p a a + y h t e i s v a s t u u l l i s e m p i + y h t e i s v a s t u u l l i s e n + y h t e i s v a s t u u l l i s e n a + y h t e i s v a s t u u l l i s e s t i + y h t e i s v a s t u u l l i s i a + y h t e i s v a s t u u l l i s t a + y h t e i s v a s t u u l l i s u u d e n + y h t e i s v a s t u u l l i s u u d e s t a + y h t e i s v a s t u u l l i s u u s p e r i a a t e + y h t e i s v a s t u u l l i s u u s p e r i a a t t e e s t a + y h t e i s v a s t u u l l i s u u s t e h t ä v i e n + y h t e i s v a s t u u l l i s u u t e e n + y h t e i s v a s t u u l l i s u u t t a + y h t e i s v a s t u u m a k s u a + y h t e i s v a s t u u m a k s u i n a + y h t e i s v a s t u u m a k s u j a + y h t e i s v a s t u u m a k s u j e n + y h t e i s v a s t u u m a k s u t + y h t e i s v a s t u u m e k a n i s m e j a + y h t e i s v a s t u u m e k a n i s m i + y h t e i s v a s t u u m e k a n i s m i e n + y h t e i s v a s t u u m e k a n i s m i l l e + y h t e i s v a s t u u m e k a n i s m i n + y h t e i s v a s t u u m e n e t e l m ä + y h t e i s v a s t u u m e n e t e l m ä n + y h t e i s v a s t u u n + y h t e i s v a s t u u n ä k ö k o h d a t + y h t e i s v a s t u u o h j e l m a + y h t e i s v a s t u u o h j e l m a n + y h t e i s v a s t u u o h j e l m a s s a + y h t e i s v a s t u u p e r i a a t e + y h t e i s v a s t u u p e r i a a t e t t a + y h t e i s v a s t u u p e r i a a t t e e n + y h t e i s v a s t u u p e r i a a t t e e s e e n + y h t e i s v a s t u u p e r i a a t t e e s t a + y h t e i s v a s t u u p o l i t i i k a n + y h t e i s v a s t u u p o l i t i i k a s t a + y h t e i s v a s t u u p o l i t i i k k a + y h t e i s v a s t u u p o l i t i i k k a a + y h t e i s v a s t u u p o l i t i i k k a a n + y h t e i s v a s t u u p o l i t i i k k a a n s a + y h t e i s v a s t u u p o l i t i i k o i s t a + y h t e i s v a s t u u p r o s e s s i n + y h t e i s v a s t u u r a h a s t o + y h t e i s v a s t u u s a k k o + y h t e i s v a s t u u s e e n + y h t e i s v a s t u u s o p i m u s + y h t e i s v a s t u u s s a + y h t e i s v a s t u u s t a + y h t e i s v a s t u u s t a m m e + y h t e i s v a s t u u t a + y h t e i s v a s t u u t a h d o n + y h t e i s v a s t u u t o i m i a + y h t e i s v a s t u u t t o m i e n + y h t e i s v a s t u u t u k e a + y h t e i s v a s t u u t u l o + y h t e i s v a s t u u t u l o n + y h t e i s v e r o t u s + y h t e i s v e t o o m u k s e s s a + y h t e i s v e t o o m u s t e n + y h t e i s v i i s u m i a + y h t e i s y h t i ö i s t ä + y h t e i s y m m ä r r y k s e e n + y h t e i s y m m ä r r y k s e l l ä + y h t e i s y m m ä r r y k s e m m e + y h t e i s y m m ä r r y k s e n + y h t e i s y m m ä r r y k s e s s ä + y h t e i s y m m ä r r y k s e s t ä + y h t e i s y m m ä r r y s + y h t e i s y m m ä r r y s a s i a k i r j o i s s a + y h t e i s y m m ä r r y s a s i o i s s a + y h t e i s y m m ä r r y s k e h y k s e l l ä + y h t e i s y m m ä r r y s m u i s t i o n + y h t e i s y m m ä r r y s m u i s t i o s s a + y h t e i s y m m ä r r y s m u i s t i o t a + y h t e i s y m m ä r r y s p ö y t ä k i r j a + y h t e i s y m m ä r r y s p ö y t ä k i r j a a + y h t e i s y m m ä r r y s p ö y t ä k i r j a a n + y h t e i s y m m ä r r y s p ö y t ä k i r j a n + y h t e i s y m m ä r r y s p ö y t ä k i r j a s s a + y h t e i s y m m ä r r y s p ö y t ä k i r j e + y h t e i s y m m ä r r y s t ä + y h t e i s y m m ä r r y s t ä m m e + y h t e i s y r i t y k s e e n + y h t e i s y r i t y k s e l l e + y h t e i s y r i t y k s e l t ä + y h t e i s y r i t y k s e n + y h t e i s y r i t y k s e n ä + y h t e i s y r i t y k s e s s ä + y h t e i s y r i t y k s e s t ä + y h t e i s y r i t y k s e t + y h t e i s y r i t y k s i i n + y h t e i s y r i t y k s i l l e + y h t e i s y r i t y k s i l l ä + y h t e i s y r i t y k s i l t ä + y h t e i s y r i t y k s i s s ä + y h t e i s y r i t y k s i s t ä + y h t e i s y r i t y k s i ä + y h t e i s y r i t y s + y h t e i s y r i t y s h a n k e + y h t e i s y r i t y s h a n k k e i d e n + y h t e i s y r i t y s o h j e l m a s t a + y h t e i s y r i t y s s o p i m u k s i i n + y h t e i s y r i t y s s o p i m u s t e n + y h t e i s y r i t y s t e n + y h t e i s y r i t y s t ä + y h t e i s y y d e l l e + y h t e i s ä ä n e s t y k s e l l ä + y h t e i s ä ä n e s t y k s e n + y h t e i s ä ä n e s t y s t ä + y h t e i s ö a j a t t e l u n + y h t e i s ö a l k u p e r ä k s i + y h t e i s ö a l o i t e + y h t e i s ö a l o i t e o h j e l m a + y h t e i s ö a l o i t e t t a + y h t e i s ö a l o i t t e e l l a + y h t e i s ö a l o i t t e e l l e + y h t e i s ö a l o i t t e e n + y h t e i s ö a l o i t t e e n a + y h t e i s ö a l o i t t e e s e e n + y h t e i s ö a l o i t t e e s s a + y h t e i s ö a l o i t t e e s t a + y h t e i s ö a l o i t t e e t + y h t e i s ö a l o i t t e i d e n + y h t e i s ö a l o i t t e i l l e + y h t e i s ö a l o i t t e i s i i n + y h t e i s ö a l o i t t e i s s a + y h t e i s ö a l o i t t e i s s a a n + y h t e i s ö a l o i t t e i s t a + y h t e i s ö a l o i t t e i t a + y h t e i s ö a l u e e l l a + y h t e i s ö a l u e e n + y h t e i s ö a l u e i l l a + y h t e i s ö a s i a + y h t e i s ö a s i a k i r j o i s s a + y h t e i s ö a s i a k s i + y h t e i s ö a s i o i d e n + y h t e i s ö a s i o i h i n + y h t e i s ö a s i o i t a + y h t e i s ö a s u m i s e n + y h t e i s ö e l ä m ä m m e + y h t e i s ö e l ä m ä s s ä + y h t e i s ö f e d e r a l i s m i n + y h t e i s ö h a n k k e e m m e + y h t e i s ö h a n k k e e n + y h t e i s ö h a n k k e e s e e n + y h t e i s ö h a n k k e i s i i n + y h t e i s ö h a n k k e i t a + y h t e i s ö h e n g e n + y h t e i s ö h e n k e ä + y h t e i s ö h e n k i + y h t e i s ö h i n n a t + y h t e i s ö i h i n + y h t e i s ö i h i n s ä + y h t e i s ö i l l e + y h t e i s ö i s s ä + y h t e i s ö i s s ä m m e + y h t e i s ö i s t ä + y h t e i s ö j e m m e + y h t e i s ö j e n + y h t e i s ö j e n k i n + y h t e i s ö j o h t a j a + y h t e i s ö j ä + y h t e i s ö j ä r j e s t e l m ä m m e + y h t e i s ö j ä r j e s t e l m ä n + y h t e i s ö j ä r j e s t e l m ä s s ä + y h t e i s ö j ä r j e s t e l m ä ä n + y h t e i s ö k e h i t y s a v u n + y h t e i s ö k e h y k s e e n + y h t e i s ö k e h y s + y h t e i s ö k e s k i t t y m i e n + y h t e i s ö k i e l e s s ä + y h t e i s ö k i e l e s t ä + y h t e i s ö k i e l i l l e + y h t e i s ö k o h t a i s e n + y h t e i s ö k o h t a i s i l l a + y h t e i s ö k o n e i s t o a + y h t e i s ö k o u l u i k s i + y h t e i s ö k s i + y h t e i s ö k u l t t u u r i + y h t e i s ö k u m p p a n e i t a + y h t e i s ö l a i n + y h t e i s ö l a i n a + y h t e i s ö l a i n s ä ä d ä n n ö n + y h t e i s ö l a i n s ä ä d ä n n ö s t ä + y h t e i s ö l a i n s ä ä d ä n t ö + y h t e i s ö l a i n s ä ä d ä n t ö ä + y h t e i s ö l a i n s ä ä d ä n t ö ö n + y h t e i s ö l a k i e n + y h t e i s ö l a k i m e n e t e l m ä n + y h t e i s ö l i i k e t o i m i a + y h t e i s ö l i i k e t o i m i l l a + y h t e i s ö l i s e n s s i + y h t e i s ö l i s e n s s i ä + y h t e i s ö l l e + y h t e i s ö l l e e n + y h t e i s ö l l i s e m m ä n + y h t e i s ö l l i s e m p i + y h t e i s ö l l i s e m p ä ä + y h t e i s ö l l i s e t + y h t e i s ö l l i s i i n + y h t e i s ö l l i s i s t ä + y h t e i s ö l l i s i ä + y h t e i s ö l l i s t e n + y h t e i s ö l l i s t ä + y h t e i s ö l l ä + y h t e i s ö l u o n n e t t a + y h t e i s ö m a i d e n + y h t e i s ö m a i h i n + y h t e i s ö m a i t a + y h t e i s ö m a l l i + y h t e i s ö m a l l i a + y h t e i s ö m a l l i n + y h t e i s ö m a l l i s s a + y h t e i s ö m a l l i s t a + y h t e i s ö m a r k k i n o i d e n + y h t e i s ö m a r k k i n o i l l a + y h t e i s ö m e k a n i s m i + y h t e i s ö m e k a n i s m i a + y h t e i s ö m e k a n i s m i e n + y h t e i s ö m e n e t e l m ä + y h t e i s ö m e n e t e l m ä k s i + y h t e i s ö m e n e t e l m ä l l ä + y h t e i s ö m e n e t e l m ä n + y h t e i s ö m e n e t e l m ä s s ä + y h t e i s ö m e n e t e l m ä s t ä + y h t e i s ö m e n e t e l m ä ä + y h t e i s ö m e n e t e l m ä ä n + y h t e i s ö m e n e t t e l y + y h t e i s ö m e n e t t e l y i h i n + y h t e i s ö m e n e t t e l y l l e + y h t e i s ö m e n e t t e l y l l ä + y h t e i s ö m e n e t t e l y n + y h t e i s ö m e n e t t e l y s t ä + y h t e i s ö m e n e t t e l y y n + y h t e i s ö m e n e t t e l y ä + y h t e i s ö m e n o j e n + y h t e i s ö m e n o t + y h t e i s ö m e r k i n t ä ä + y h t e i s ö m e t o d i + y h t e i s ö m e t o d i a + y h t e i s ö m e t o d i i n + y h t e i s ö m e t o d i l l a + y h t e i s ö m e t o d i n + y h t e i s ö m e t o d i s t a + y h t e i s ö m m e + y h t e i s ö m ä ä r ä r a h a t + y h t e i s ö m ä ä r ä r a h o j e n + y h t e i s ö n + y h t e i s ö n l a a j u i n e n + y h t e i s ö n l a a j u i s e e n + y h t e i s ö n l a a j u i s e l t a + y h t e i s ö n l a a j u i s e s t a + y h t e i s ö n l a a j u i s e s t i + y h t e i s ö n l a a j u i s e t + y h t e i s ö n l a a j u i s i a + y h t e i s ö n l a a j u i s i s s a + y h t e i s ö n l a a j u i s t a + y h t e i s ö n l a a j u i s t e n + y h t e i s ö n m e n e t t e l y n + y h t e i s ö n t u k i + y h t e i s ö n ä + y h t e i s ö o h j e l m a + y h t e i s ö o h j e l m a n + y h t e i s ö o h j e l m a t + y h t e i s ö o h j e l m i a + y h t e i s ö o h j e l m i e n + y h t e i s ö o h j e l m i i n + y h t e i s ö o h j e l m i s s a + y h t e i s ö o h j e l m i s t a + y h t e i s ö o i k e u d e l l i n e n + y h t e i s ö o i k e u d e l l i s t e n + y h t e i s ö o i k e u d e n + y h t e i s ö o i k e u d e s s a + y h t e i s ö o i k e u s + y h t e i s ö o i k e u t e e n + y h t e i s ö o i k e u t t a + y h t e i s ö p a i n o t t e i n e n + y h t e i s ö p a l v e l u + y h t e i s ö p a l v e l u j e n + y h t e i s ö p a l v e l u s s a + y h t e i s ö p a l v e l u t + y h t e i s ö p a s s i + y h t e i s ö p a s s i t u k s e n + y h t e i s ö p a s s i t u s t a + y h t e i s ö p a t e n t e i l l e + y h t e i s ö p a t e n t e i s s a + y h t e i s ö p a t e n t i k s i + y h t e i s ö p a t e n t i l l e + y h t e i s ö p a t e n t i n + y h t e i s ö p a t e n t i s s a + y h t e i s ö p a t e n t i s t a + y h t e i s ö p a t e n t t e i h i n + y h t e i s ö p a t e n t t e j a + y h t e i s ö p a t e n t t i + y h t e i s ö p a t e n t t i a + y h t e i s ö p a t e n t t i a s e t u k s e k s i + y h t e i s ö p a t e n t t i a s e t u k s e n + y h t e i s ö p a t e n t t i a s i o i s s a + y h t e i s ö p a t e n t t i e h d o t u s + y h t e i s ö p a t e n t t i h a k e m u s t e n + y h t e i s ö p a t e n t t i i n + y h t e i s ö p a t e n t t i j ä r j e s t e l m ä + y h t e i s ö p a t e n t t i j ä r j e s t e l m ä n + y h t e i s ö p a t e n t t i j ä r j e s t e l m ä s s ä + y h t e i s ö p a t e n t t i j ä r j e s t e l m ä ä + y h t e i s ö p a t e n t t i k y s y m y s + y h t e i s ö p a t e n t t i l e h d e s s ä + y h t e i s ö p a t e n t t i t u o m i o i s t u i m e n + y h t e i s ö p a t e n t t i t u o m i o i s t u i m i l l a + y h t e i s ö p a t e n t t i t u o m i o i s t u i n + y h t e i s ö p a t e n t t i t u o m i o i s t u i n t a + y h t e i s ö p e r i a a t t e e s e e n + y h t e i s ö p e r i n t ö + y h t e i s ö p e r u s t a i s e n + y h t e i s ö p e r u s t a i s i a + y h t e i s ö p e r u s t a i s t e n + y h t e i s ö p e r u s t e i s e n + y h t e i s ö p e r u s t e i s e n a + y h t e i s ö p e r u s t e i s e s t i + y h t e i s ö p e t o s + y h t e i s ö p i l a r i i n + y h t e i s ö p o h j a i n e n + y h t e i s ö p o h j a i s i a + y h t e i s ö p o h j a i s t a + y h t e i s ö p o l i t i i k a l l a + y h t e i s ö p o l i t i i k a n + y h t e i s ö p o l i t i i k a s s a + y h t e i s ö p o l i t i i k a s t a + y h t e i s ö p o l i t i i k a t + y h t e i s ö p o l i t i i k k a + y h t e i s ö p o l i t i i k k a a + y h t e i s ö p o l i t i i k k a a n + y h t e i s ö p o l i t i i k k o i h i n + y h t e i s ö p o l i t i i k k o j a + y h t e i s ö p o l i t i i k k o j e n + y h t e i s ö p o l i t i i k o i l l a + y h t e i s ö p o l i t i i k o i s s a + y h t e i s ö p r o j e k t i n + y h t e i s ö p u i t t e i s i i n + y h t e i s ö p u i t t e i t a + y h t e i s ö p ä ä m ä ä r i i n + y h t e i s ö p ä ä t ö k s e n + y h t e i s ö p ä ä t ö k s e n t e k o a + y h t e i s ö p ä ä t ö s m e n e t t e l y n + y h t e i s ö r a h o i t u k s e n + y h t e i s ö r a h o i t u k s e s s a + y h t e i s ö r a h o i t u k s e s t a + y h t e i s ö r a h o i t u s + y h t e i s ö r a h o i t u s t a + y h t e i s ö r a k e n n e t t a + y h t e i s ö r a k e n t e e k s i + y h t e i s ö r a k e n t e i l l e + y h t e i s ö r a k e n t e i t a + y h t e i s ö r a t k a i s u + y h t e i s ö r y h m i e n + y h t e i s ö r y h m i l l e + y h t e i s ö r y h m i ä + y h t e i s ö s i j o i t t a j i a + y h t e i s ö s i j o i t t a j i e n + y h t e i s ö s i j o i t t a j i i n + y h t e i s ö s i j o i t t a j i l l e + y h t e i s ö s l a n g i s s a + y h t e i s ö s o p i m u k s i l l a + y h t e i s ö s s ä + y h t e i s ö s s ä k i n + y h t e i s ö s s ä m m e + y h t e i s ö s s ä ä n + y h t e i s ö s t r a t e g i a + y h t e i s ö s t r a t e g i a a + y h t e i s ö s t r a t e g i a n + y h t e i s ö s t r a t e g i o i t a + y h t e i s ö s t ä + y h t e i s ö s u o j a a + y h t e i s ö s ä ä n n ö k s i e n + y h t e i s ö s ä ä n n ö s + y h t e i s ö s ä ä n n ö t + y h t e i s ö s ä ä n t ö j e n + y h t e i s ö t + y h t e i s ö t a i d e + y h t e i s ö t a l o u d e l l i s t e n + y h t e i s ö t a l o u d e n + y h t e i s ö t a l o u d e s s a + y h t e i s ö t a l o u d e s t a + y h t e i s ö t a l o u s + y h t e i s ö t a l o u s a r v i o s t a + y h t e i s ö t a l o u t e e n + y h t e i s ö t a l o u t t a + y h t e i s ö t a s o i n e n + y h t e i s ö t a s o l l a + y h t e i s ö t a s o l l e + y h t e i s ö t a s o n + y h t e i s ö t a v a r o i h i n + y h t e i s ö t a v o i t e + y h t e i s ö t a v o i t t e e l l e + y h t e i s ö t a v o i t t e e s e e n + y h t e i s ö t a v o i t t e i d e n + y h t e i s ö t o i m e n + y h t e i s ö t o i m e t + y h t e i s ö t o i m i e m m e + y h t e i s ö t o i m i e n + y h t e i s ö t o i m i n n a n + y h t e i s ö t o i m i n t a a + y h t e i s ö t o i m i s s a + y h t e i s ö t o i m i t u k s i a + y h t e i s ö t o i m i t u k s i i n + y h t e i s ö t o i m i t u k s i s t a + y h t e i s ö t u e t + y h t e i s ö t u k e a + y h t e i s ö t u n t e e n + y h t e i s ö t u o t a n n o n + y h t e i s ö t u o t t a j i l l e + y h t e i s ö u l o t t u v u u d e s t a + y h t e i s ö u l o t t u v u u k s i i n + y h t e i s ö u l o t t u v u u s + y h t e i s ö v a l t a a + y h t e i s ö v a r o i s t a + y h t e i s ö v a r o j a + y h t e i s ö v a r o j e n + y h t e i s ö v e r k o s t o a + y h t e i s ö v e r k o t + y h t e i s ö v e r o + y h t e i s ö v e r o a + y h t e i s ö v e r o k a n t a + y h t e i s ö v e r o k a n t a a n + y h t e i s ö v e r o n + y h t e i s ö v e r o p o h j a a + y h t e i s ö v e r o t u k s e e n + y h t e i s ö v e r o t u s + y h t e i s ö v e s i e n + y h t e i s ö v e t o i s i a + y h t e i s ö v ä l i n e + y h t e i s ö v ä l i n e e n + y h t e i s ö v ä l i n e e n ä + y h t e i s ö v ä l i n e t t ä + y h t e i s ö y h d i s t e l m ä ä + y h t e i s ö ä + y h t e i s ö ö n + y h t e n e v i ä + y h t e n e v y y s k u v a u s + y h t e n e v ä i s e t + y h t e n ä + y h t e n ä i s a s i a k i r j a a + y h t e n ä i s a s i a k i r j a a n + y h t e n ä i s a s i a k i r j a k s i + y h t e n ä i s a s i a k i r j a l l a + y h t e n ä i s a s i a k i r j a l l e + y h t e n ä i s a s i a k i r j a n + y h t e n ä i s a s i a k i r j a s s a + y h t e n ä i s e e n + y h t e n ä i s e k s i + y h t e n ä i s e l l e + y h t e n ä i s e l l ä + y h t e n ä i s e m m i k s i + y h t e n ä i s e m m i n + y h t e n ä i s e m m i s t ä + y h t e n ä i s e m m ä k s i + y h t e n ä i s e m m ä l l e + y h t e n ä i s e m m ä l l ä + y h t e n ä i s e m m ä n + y h t e n ä i s e m m ä s s ä + y h t e n ä i s e m m ä s t ä + y h t e n ä i s e m m ä t + y h t e n ä i s e m p i + y h t e n ä i s e m p i e n + y h t e n ä i s e m p i i n + y h t e n ä i s e m p i ä + y h t e n ä i s e m p ä n ä + y h t e n ä i s e m p ä ä + y h t e n ä i s e m p ä ä n + y h t e n ä i s e n + y h t e n ä i s e n ä + y h t e n ä i s e s s ä + y h t e n ä i s e s t ä + y h t e n ä i s e t + y h t e n ä i s h a l l i t u k s e n + y h t e n ä i s h a l l i t u s + y h t e n ä i s h a l l i t u s t a + y h t e n ä i s i i n + y h t e n ä i s i l l ä + y h t e n ä i s i m m ä n + y h t e n ä i s i m m ä t + y h t e n ä i s i n + y h t e n ä i s i n ä + y h t e n ä i s i s t ä + y h t e n ä i s i ä + y h t e n ä i s k o u l u + y h t e n ä i s m a r k k i n a h a n k e t t a + y h t e n ä i s m a r k k i n a j ä r j e s t e l y i h i n + y h t e n ä i s m a r k k i n a l a i n + y h t e n ä i s m a r k k i n a l a i n s ä ä d ä n n ö l l ä + y h t e n ä i s m a r k k i n a l a i n s ä ä d ä n n ö n + y h t e n ä i s m a r k k i n a n s a + y h t e n ä i s m a r k k i n a o h j e l m a a + y h t e n ä i s m a r k k i n a o h j e l m a n + y h t e n ä i s m a r k k i n a p a k e t i n + y h t e n ä i s m a r k k i n a s t r a t e g i a a + y h t e n ä i s m a r k k i n a s t r a t e g i a n + y h t e n ä i s m a r k k i n a s ä ä d ö k s e e n + y h t e n ä i s m a r k k i n a s ä ä d ö k s e l l ä + y h t e n ä i s m a r k k i n a s ä ä d ö k s e n + y h t e n ä i s m a r k k i n a s ä ä d ö k s e s s ä + y h t e n ä i s m a r k k i n a s ä ä d ö k s e s t ä + y h t e n ä i s m a r k k i n a s ä ä d ö s + y h t e n ä i s m a r k k i n a s ä ä d ö s t ä + y h t e n ä i s m a r k k i n a s ä ä n n ö t + y h t e n ä i s m a r k k i n a s ä ä n t ö j e n + y h t e n ä i s m a r k k i n a s ä ä n t ö j ä + y h t e n ä i s m a r k k i n a t + y h t e n ä i s m a r k k i n a t e k n i i k k a + y h t e n ä i s m a r k k i n a t o i m i a + y h t e n ä i s m a r k k i n a v ä l i n e e n + y h t e n ä i s m a r k k i n a v ä s y m y s t ä + y h t e n ä i s m a r k k i n o i d e m m e + y h t e n ä i s m a r k k i n o i d e n + y h t e n ä i s m a r k k i n o i h i m m e + y h t e n ä i s m a r k k i n o i h i n + y h t e n ä i s m a r k k i n o i l l a + y h t e n ä i s m a r k k i n o i l l a m m e + y h t e n ä i s m a r k k i n o i l l e + y h t e n ä i s m a r k k i n o i l t a + y h t e n ä i s m a r k k i n o i n a + y h t e n ä i s m a r k k i n o i n e e n + y h t e n ä i s m a r k k i n o i s s a + y h t e n ä i s m a r k k i n o i s t a + y h t e n ä i s m a r k k i n o i t a + y h t e n ä i s m a r k k i n o i t a a n + y h t e n ä i s m a r k k i n o i t t e n + y h t e n ä i s p o l i t i i k k a + y h t e n ä i s r a h a a n + y h t e n ä i s r a h a s t o a + y h t e n ä i s s i t o u m u k s e n + y h t e n ä i s s i t o u m u k s e s s a + y h t e n ä i s s i t o u m u s + y h t e n ä i s t a l o u t t a + y h t e n ä i s t a r i f f i j ä r j e s t e l m ä + y h t e n ä i s t a r i f f i n + y h t e n ä i s t e n + y h t e n ä i s t e o r i a + y h t e n ä i s t e t t y + y h t e n ä i s t e t t y ä + y h t e n ä i s t e t y n + y h t e n ä i s t e t y s t ä + y h t e n ä i s t e t ä ä n + y h t e n ä i s t y m i s e e n + y h t e n ä i s t y m i s p r o j e k t i i n + y h t e n ä i s t y m i s p r o s e s s i i n + y h t e n ä i s t ä m i n e n + y h t e n ä i s t ä m i s e k s i + y h t e n ä i s t ä m i s e n + y h t e n ä i s t ä m i s e s t ä + y h t e n ä i s t ä m i s h a n k e + y h t e n ä i s t ä m i s j ä r j e s t e l m i e n + y h t e n ä i s t ä m i s j ä r j e s t e l m ä ä + y h t e n ä i s t ä m i s k e h i t y s t ä + y h t e n ä i s t ä m i s o h j e l m a n + y h t e n ä i s t ä m i s o h j e l m a t + y h t e n ä i s t ä m i s p o l i t i i k a n + y h t e n ä i s t ä m i s p o l i t i i k k a a + y h t e n ä i s t ä m i s p r o s e s s i n + y h t e n ä i s t ä m i s p y r k i m y k s e t + y h t e n ä i s t ä m i s p y r k i m y k s i i n + y h t e n ä i s t ä m i s s u u n n i t e l m a a n + y h t e n ä i s t ä m i s t a r p e e s t a + y h t e n ä i s t ä m i s t e r m i n o l o g i a s s a + y h t e n ä i s t ä m i s t o i m e n p i d e t t ä + y h t e n ä i s t ä m i s t o i m e n p i t e i t ä + y h t e n ä i s t ä m i s t o i m i i n + y h t e n ä i s t ä m i s t ä + y h t e n ä i s t ä m ä ä n + y h t e n ä i s t ä v ä n + y h t e n ä i s t ä v ä ä + y h t e n ä i s t ä ä + y h t e n ä i s v a l t i o + y h t e n ä i s v a l t i o n + y h t e n ä i s v a l t i o t a + y h t e n ä i s v a l u u t a k s i + y h t e n ä i s v a l u u t a l l a + y h t e n ä i s v a l u u t a l l e + y h t e n ä i s v a l u u t a l t a + y h t e n ä i s v a l u u t a n + y h t e n ä i s v a l u u t a s s a + y h t e n ä i s v a l u u t a s t a + y h t e n ä i s v a l u u t t a a + y h t e n ä i s v a l u u t t a a m m e + y h t e n ä i s v a l u u t t a a n + y h t e n ä i s v a l u u t t a h a n k e + y h t e n ä i s v a l u u t t a h a n k e t t a + y h t e n ä i s v a l u u t t a h a n k k e e l l a + y h t e n ä i s v a l u u t t a h a n k k e e n + y h t e n ä i s v a l u u t t a h a n k k e e s e e n + y h t e n ä i s v a l u u t t a j ä r j e s t e l m ä + y h t e n ä i s v a l u u t t a j ä r j e s t e l m ä n + y h t e n ä i s v a l u u t t a j ä r j e s t e l m ä s s ä + y h t e n ä i s v a l u u t t a j ä r j e s t e l m ä ä n + y h t e n ä i s v a l u u t t a j ä r j e s t e l y i l l ä + y h t e n ä i s v a l u u t t a k y s y m y k s e s s ä + y h t e n ä i s v a l u u t t a m m e + y h t e n ä i s v a l u u t t a n a + y h t e n ä i s v a l u u t t a p i l a r i n + y h t e n ä i s v a l u u t t a p o l i t i i k a n + y h t e n ä i s v a l u u t t a p r o s e s s i + y h t e n ä i s v a l u u t t a s e i k k a i l u a + y h t e n ä i s v a l u u t t a v y ö h y k e + y h t e n ä i s v e r o + y h t e n ä i s v e r o a + y h t e n ä i s y y d e l l e + y h t e n ä i s y y d e n + y h t e n ä i s y y d e s s ä + y h t e n ä i s y y d e s t ä + y h t e n ä i s y y s h a l l i t u k s e l l e + y h t e n ä i s y y s l i s t a + y h t e n ä i s y y s p u o l u e + y h t e n ä i s y y s p y r k i m y k s i ä + y h t e n ä i s y y s v a a t i m u s + y h t e n ä i s y y t e e n + y h t e n ä i s y y t t ä + y h t e y d e n + y h t e y d e n o t o t + y h t e y d e n o t t o j a + y h t e y d e n o t t o m e n e t t e l y i s t ä + y h t e y d e n p i d o n + y h t e y d e n p i d o s t a + y h t e y d e n p i t o + y h t e y d e n p i t o a + y h t e y d e n p i t o f o o r u m i + y h t e y d e n p i t o k a n a v a + y h t e y d e n p i t o k a n a v a t + y h t e y d e n p i t o k a n a v i a + y h t e y d e n p i t o k a n a v i e n + y h t e y d e n p i t o k e s k u k s e n a + y h t e y d e n p i t o k i e l t o a + y h t e y d e n p i t o m e n e t e l m ä ä + y h t e y d e n p i t o r y h m ä ä n + y h t e y d e n t a r j o a j i l l e + y h t e y d e s s ä k i n + y h t e y d e s t ä + y h t e y d e t + y h t e y k s i e n + y h t e y k s i i n + y h t e y k s i l l ä + y h t e y k s i n + y h t e y k s i s s ä + y h t e y k s i s t ä + y h t e y k s i ä + y h t e y k s i ä m m e + y h t e y s a i k o j a + y h t e y s a l u s + y h t e y s a s i a n t u n t i j a r y h m ä s s ä + y h t e y s e l i n + y h t e y s e l i n t e n + y h t e y s h a n k k e i d e n + y h t e y s h a n k k e i s t a + y h t e y s h e n k i l ö + y h t e y s h e n k i l ö i d e n + y h t e y s h e n k i l ö i l t ä + y h t e y s h e n k i l ö i s t ä + y h t e y s h e n k i l ö i t ä + y h t e y s h e n k i l ö j ä r j e s t e l m ä n + y h t e y s h e n k i l ö l l e e n + y h t e y s h e n k i l ö n + y h t e y s h e n k i l ö n ä + y h t e y s h e n k i l ö t + y h t e y s h e n k i l ö v e r k o s t o + y h t e y s h e n k i l ö v e r k o s t o a + y h t e y s h e n k i l ö v e r k o s t o j e n + y h t e y s h e n k i l ö v e r k o s t o n + y h t e y s k a p a s i t e e t t i + y h t e y s k a p a s i t e e t t i a + y h t e y s k e s k u k s i s t a + y h t e y s k o h t i i n + y h t e y s k o m i t e a + y h t e y s k o m i t e a a + y h t e y s k o m i t e a n + y h t e y s k o m i t e a s s a + y h t e y s k o m i t e a s t a + y h t e y s l a b o r a t o r i o i d e n + y h t e y s l e n t o a + y h t e y s l e n t o k o n e + y h t e y s l i n k i t + y h t e y s l i s t a l l a + y h t e y s o h j e l m a a + y h t e y s o n g e l m i s t a + y h t e y s p a i k k o j a + y h t e y s p i s t e + y h t e y s p i s t e e k s i + y h t e y s p i s t e e n + y h t e y s p i s t e e n ä + y h t e y s p i s t e e t + y h t e y s p i s t e i d e n + y h t e y s p i s t e i s i i n + y h t e y s p i s t e i s s ä + y h t e y s p i s t e i s t ä + y h t e y s p i s t e i t ä + y h t e y s p i s t e j ä r j e s t e l m ä + y h t e y s p i s t e v e r k o n + y h t e y s p i s t e v e r k o s t o + y h t e y s p i s t e v e r k o s t o n + y h t e y s r a k e n t e i s t a + y h t e y s r y h m i e n + y h t e y s r y h m ä + y h t e y s r y h m ä n + y h t e y s r y h m ä n n e + y h t e y s r y h m ä s s ä + y h t e y s r y h m ä s t ä + y h t e y s r y h m ä ä + y h t e y s r y h m ä ä n + y h t e y s s i l l a t + y h t e y s t a h o n a + y h t e y s t i e d o t + y h t e y s t i e t o i h i n + y h t e y s t i e t o i n e e n + y h t e y s t o i m i s t o + y h t e y s t o i m i s t o j e n + y h t e y s t o i m i s t o n + y h t e y s t o i m i s t o o n + y h t e y s t o i m i s t o t + y h t e y s t u o m a r e i s t a + y h t e y s t u o m a r e i t a + y h t e y s v e r k o s t o + y h t e y s v e r k o s t o i l l e + y h t e y s v e r k o s t o i s t a + y h t e y s v e r k o s t o j a + y h t e y s v e r k o s t o j e n + y h t e y s v e r k o s t o n + y h t e y s v e r k o s t o n s a + y h t e y s v i r a n o m a i s i a + y h t e y s v i r a n o m a i s i i n + y h t e y s v i r a n o m a i s i l l a + y h t e y s v i r a n o m a i s i n a + y h t e y s v i r a n o m a i s i s t a + y h t e y s v i r a n o m a i s t e n + y h t e y s v i r k a m i e h e n + y h t e y s v i r k a m i e s t e n + y h t e y s y k s i k k ö j ä + y h t e y s y k s i k ö l l ä + y h t e y t e e n + y h t e y t t ä + y h t e y t t ä m i n e n + y h t i ö a l a + y h t i ö a s t e + y h t i ö d i r e k t i i v i n + y h t i ö i d e m m e + y h t i ö i d e n + y h t i ö i h i n + y h t i ö i l l e + y h t i ö i l l ä + y h t i ö i s s ä + y h t i ö i s t ä + y h t i ö i t ä ä n + y h t i ö j ä r j e s t y k s e e n + y h t i ö j ä r j e s t y k s e n + y h t i ö j ä r j e s t y k s e s s ä + y h t i ö j ä r j e s t y s + y h t i ö j ä r j e s t y s t ä + y h t i ö k o k o u k s e e n + y h t i ö k o k o u k s e n + y h t i ö k o k o u k s e s s a + y h t i ö k o k o u k s i i n + y h t i ö k o k o u k s i s t a + y h t i ö k o k o u s + y h t i ö k o k o u s t e n + y h t i ö k u m p p a n i n s a + y h t i ö l a i n + y h t i ö l a i n s ä ä d ä n n ö n + y h t i ö l a i n s ä ä d ä n n ö s t ä + y h t i ö l a i n s ä ä d ä n t ö d i r e k t i i v i n + y h t i ö l a i n s ä ä d ä n t ö j e n + y h t i ö l a i n s ä ä d ä n t ö ä + y h t i ö l a i n s ä ä d ä n t ö ö n + y h t i ö l a k i a + y h t i ö m u o d o n + y h t i ö m u o d o s t a + y h t i ö m u o t o + y h t i ö m u o t o a + y h t i ö m u o t o i h i n + y h t i ö m u o t o j a + y h t i ö m u o t o n s a + y h t i ö n + y h t i ö n s ä + y h t i ö o i k e u d e l l a + y h t i ö o i k e u d e l l e + y h t i ö o i k e u d e l l i n e n + y h t i ö o i k e u d e l l i s e e n + y h t i ö o i k e u d e l l i s e k s i + y h t i ö o i k e u d e n + y h t i ö o i k e u d e s s a + y h t i ö o i k e u d e s t a + y h t i ö o i k e u s + y h t i ö o i k e u s d i r e k t i i v i + y h t i ö o i k e u s d i r e k t i i v i e n + y h t i ö o i k e u s d i r e k t i i v i i n + y h t i ö o i k e u s d i r e k t i i v i k s i + y h t i ö o i k e u s d i r e k t i i v i n + y h t i ö o i k e u s d i r e k t i i v i ä + y h t i ö o i k e u s j ä r j e s t e l m ä ä + y h t i ö o i k e u s k o n f e r e n s s i s s a + y h t i ö o i k e u s l a i n s ä ä d ä n t ö ä + y h t i ö o i k e u t e e n + y h t i ö o i k e u t t a + y h t i ö o i k e u t t a a n + y h t i ö r a k e n n e t t a + y h t i ö r a k e n t e i t a + y h t i ö s k a n d a a l i s t a + y h t i ö s s ä + y h t i ö s t ä + y h t i ö s ä ä n n ö s t ö n + y h t i ö s ä ä n n ö t + y h t i ö s ä ä n t ö j e n + y h t i ö t + y h t i ö t a p a h t u m i s s a + y h t i ö t a s o l l a + y h t i ö t ä + y h t i ö v e r o + y h t i ö v e r o a + y h t i ö v e r o a a n + y h t i ö v e r o a s t e e n + y h t i ö v e r o a s t e e t + y h t i ö v e r o a s t e i d e n + y h t i ö v e r o i s t a + y h t i ö v e r o j a + y h t i ö v e r o j e n + y h t i ö v e r o j ä r j e s t e l m ä n + y h t i ö v e r o j ä r j e s t e l m ä t + y h t i ö v e r o k a n n a n + y h t i ö v e r o k a n n a s t a + y h t i ö v e r o k a n n o i s t a a n + y h t i ö v e r o k a n t a + y h t i ö v e r o k a n t a a + y h t i ö v e r o k a n t o i h i n + y h t i ö v e r o k a n t o j a + y h t i ö v e r o n + y h t i ö v e r o n a + y h t i ö v e r o o n + y h t i ö v e r o p o h j a + y h t i ö v e r o p o h j a a + y h t i ö v e r o p o h j a a n + y h t i ö v e r o p o h j a l l a + y h t i ö v e r o p o h j a n + y h t i ö v e r o p o h j a s t a + y h t i ö v e r o p r o s e n t i s t a a n + y h t i ö v e r o p r o s e n t t i a + y h t i ö v e r o s t a + y h t i ö v e r o s t a m m e + y h t i ö v e r o t u k s e e n + y h t i ö v e r o t u k s e n + y h t i ö v e r o t u l o j a + y h t i ö v e r o t u o t o n + y h t i ö v e r o t u s + y h t i ö v e r o t u s j ä r j e s t e l m ä n + y h t i ö v e r o t u s l a s k e l m i e n + y h t i ö v e r o t u s t a + y h t i ö ä ä n i ä + y h t y e i s t ä + y h t y i v ä t + y h t y k ä ä + y h t y m i e n + y h t y m i l l e + y h t y m i s t e n + y h t y m ä k o h d i s t a + y h t y m ä k o h t a + y h t y m ä k o h t i a + y h t y m ä ä n + y h t y n e e n + y h t y v ä t + y h t y y + y h t y y k ö + y h t y ä + y h t ä j a k s o i s e m p i + y h t ä j a k s o i s e n + y h t ä k k i s t ä + y h t ä k ä ä n + y h t ä l ä i s e e n + y h t ä l ä i s e l l ä + y h t ä l ä i s e m m i s s ä + y h t ä l ä i s e m m ä t + y h t ä l ä i s e m p i ä + y h t ä l ä i s e n + y h t ä l ä i s e s t ä + y h t ä l ä i s e t + y h t ä l ä i s i i n + y h t ä l ä i s i n + y h t ä l ä i s i s s ä + y h t ä l ä i s i s t ä + y h t ä l ä i s i ä + y h t ä l ä i s t e n + y h t ä l ä i s t ä m i s e n + y h t ä l ä i s y y k s i ä + y h t ä l ä i s y y s m e r k k i + y h t ä l ä i s y y s m e r k k i ä + y h t ä l ä i s y y s p e r i a a t t e e n + y h t ä l ö r y h m ä + y h t ä p i t ä v y y s t a u l u k o t + y k k ö s a s i a + y k k ö s a s i a k s i + y k k ö s h u o l i + y k k ö s k a n s a l a i n e n + y k k ö s k o h d e + y k k ö s l u o k a n + y k k ö s l u o k k a + y k k ö s m a t r i i s i + y k k ö s p a i k a l l e + y k k ö s u u t i s e n a + y k s e y t e e n + y k s i h ä n + y k s i k i e l i s y y d e n + y k s i k i e l i s y y s p e r i n t e e s t ä + y k s i k i n + y k s i k k ö a r v o n + y k s i k k ö a r v o t + y k s i k k ö h i n n a n + y k s i k k ö h i n n o i s t a + y k s i k k ö h i n n o i t t e l u + y k s i k k ö h i n n o i t t e l u a + y k s i k k ö h i n n o i t t e l u n + y k s i k k ö h i n n o i t t e l u u n + y k s i k k ö h i n t a + y k s i k k ö h i n t a a + y k s i k k ö h i n t a a n + y k s i k k ö h i n t o j a + y k s i k k ö h i n t o j e n + y k s i k k ö i n ä + y k s i k k ö j e n + y k s i k k ö j u u r i + y k s i k k ö j ä + y k s i k k ö j ä r j e s t e l m ä + y k s i k k ö k u s t a n n u k s i a + y k s i k k ö k u s t a n n u k s i i n + y k s i k k ö k u s t a n n u s t e n + y k s i k k ö m a t r i i s i + y k s i k k ö m m e + y k s i k k ö m ä ä r i ä + y k s i k k ö n i + y k s i k k ö n s ä + y k s i k k ö o p e r a a t i o + y k s i k k ö p a l l o + y k s i k k ö s a a l i s + y k s i k k ö t a s o l l a + y k s i k k ö t y ö k u s t a n n u k s e t + y k s i k k ö t y ö k u s t a n n u k s i s s a + y k s i k k ö t y ö k u s t a n n u k s i s t a + y k s i k k ö t y ö k u s t a n n u s t e n + y k s i k k ö t y ö k u s t a n n u s t e n s a + y k s i k k ö v e k t o r i + y k s i k k ö v ä l i + y k s i k k ö y m p y r ä + y k s i k k ö ä + y k s i k k ö ö n + y k s i k ö i d e m m e + y k s i k ö i d e n + y k s i k ö i d e n v ä l i s e n + y k s i k ö i d e n v ä l i s e s t ä + y k s i k ö i h i n + y k s i k ö i l l e + y k s i k ö i l l e n i + y k s i k ö i s s ä + y k s i k ö i s s ä m m e + y k s i k ö i s t ä + y k s i k ö i s t ä m m e + y k s i k ö i t t e n s ä + y k s i k ö i t ä n n e + y k s i k ö k s i + y k s i k ö l l ä + y k s i k ö l t ä + y k s i k ö n + y k s i k ö n p ä ä l l i k k ö ä + y k s i k ö n p ä ä l l i k ö n + y k s i k ö s s ä n n e + y k s i k ö s t ä + y k s i k ö t + y k s i l ö i d e n + y k s i l ö i d y m p i ä + y k s i l ö i d ä + y k s i l ö i h i n + y k s i l ö i l l e + y k s i l ö i l t ä + y k s i l ö i m m e + y k s i l ö i n ä + y k s i l ö i s t ä + y k s i l ö i t ä + y k s i l ö i t ä e s s ä + y k s i l ö j e n + y k s i l ö k e h i t y k s e n + y k s i l ö k e s k e i s y y t e e n + y k s i l ö k o h t a i s e s t i + y k s i l ö k o h t a i s i a + y k s i l ö k o h t a i s i i n + y k s i l ö k o h t a i s i n + y k s i l ö k o h t a i s t a + y k s i l ö l i i k e n t e e n + y k s i l ö l l e + y k s i l ö l l i s e e n + y k s i l ö l l i s e m m i k s i + y k s i l ö l l i s e m m ä n + y k s i l ö l l i s e m p i e n + y k s i l ö l l i s e m p i i n + y k s i l ö l l i s e m p ä ä + y k s i l ö l l i s e n + y k s i l ö l l i s e s s ä + y k s i l ö l l i s e s t ä + y k s i l ö l l i s e t + y k s i l ö l l i s i i n + y k s i l ö l l i s i l l ä + y k s i l ö l l i s i s t ä + y k s i l ö l l i s i ä + y k s i l ö l l i s t e n + y k s i l ö l l i s t ä m i s s u u n t a u s + y k s i l ö l l i s y y t t ä m m e + y k s i l ö n + y k s i l ö n o i k e u d e t + y k s i l ö n o i k e u k s i a + y k s i l ö n o i k e u k s i a m m e + y k s i l ö n o i k e u k s i e n + y k s i l ö n o i k e u k s i e n s a + y k s i l ö n o i k e u k s i i n + y k s i l ö n s u o j a a + y k s i l ö n v a p a u d e n + y k s i l ö n v a p a u d e t + y k s i l ö n v a p a u k s i a + y k s i l ö n v a p a u k s i e n + y k s i l ö n v a p a u k s i i n + y k s i l ö n v a p a u k s i n a + y k s i l ö n v a p a u s + y k s i l ö n v a p a u t e e n + y k s i l ö n v a p a u t t a + y k s i l ö n ä k ö k u l m a + y k s i l ö o i k e u k s i e n + y k s i l ö o i k e u s + y k s i l ö s t ä + y k s i l ö s u o r i t u k s e e n + y k s i l ö t + y k s i l ö t a s o l l a + y k s i l ö u r h e i l u l a j e j a + y k s i l ö ä + y k s i m a h a i s e s t a + y k s i m i e l i n e n + y k s i m i e l i s e e n + y k s i m i e l i s e l l ä + y k s i m i e l i s e m m i n + y k s i m i e l i s e m m ä l l e + y k s i m i e l i s e m p i + y k s i m i e l i s e m p i i n + y k s i m i e l i s e m p i ä + y k s i m i e l i s e m p ä ä + y k s i m i e l i s e n + y k s i m i e l i s e n ä + y k s i m i e l i s e s t ä + y k s i m i e l i s i i n + y k s i m i e l i s i k s i + y k s i m i e l i s i n ä + y k s i m i e l i s i ä + y k s i m i e l i s t ä + y k s i m i e l i s y y d e l l ä + y k s i m i e l i s y y d e n + y k s i m i e l i s y y d e s t ä + y k s i m i e l i s y y s e d e l l y t y s t ä + y k s i m i e l i s y y s j ä r j e s t e l m ä + y k s i m i e l i s y y s j ä r j e s t e l m ä n + y k s i m i e l i s y y s m e n e t t e l y + y k s i m i e l i s y y s m e n e t t e l y s t ä + y k s i m i e l i s y y s m e n e t t e l y ä + y k s i m i e l i s y y s o n g e l m a + y k s i m i e l i s y y s p e r i a a t e + y k s i m i e l i s y y s p e r i a a t e t t a + y k s i m i e l i s y y s p e r i a a t t e e n + y k s i m i e l i s y y s p e r i a a t t e e s t a + y k s i m i e l i s y y s p e r i n n e + y k s i m i e l i s y y s p ä ä t ö k s e t + y k s i m i e l i s y y s p ä ä t ö k s i ä + y k s i m i e l i s y y s p ä ä t ö s t e n + y k s i m i e l i s y y s s ä ä n n ö l l e + y k s i m i e l i s y y s s ä ä n n ö l l ä + y k s i m i e l i s y y s s ä ä n n ö n + y k s i m i e l i s y y s s ä ä n n ö s t ä + y k s i m i e l i s y y s s ä ä n t ö + y k s i m i e l i s y y s s ä ä n t ö j e n + y k s i m i e l i s y y s s ä ä n t ö ä + y k s i m i e l i s y y s s ä ä n t ö ö n + y k s i m i e l i s y y s v a a t i m u k s e n + y k s i m i e l i s y y s v a a t i m u k s e s t a + y k s i m i e l i s y y s v a a t i m u k s i s t a + y k s i m i e l i s y y s v a a t i m u s + y k s i m i e l i s y y s v a a t i m u s t a + y k s i m i e l i s y y s ä ä n e s t y k s i ä + y k s i m i e l i s y y s ä ä n e s t y s t e n + y k s i m i e l i s y y s ä ä n e s t y s t ä + y k s i m i e l i s y y t e e n + y k s i m i e l i s y y t e m m e + y k s i m i e l i s y y t t ä + y k s i n e d u s t u s o i k e u d e l l a + y k s i n h u o l t a j a + y k s i n h u o l t a j a k s i + y k s i n h u o l t a j a m i e h i l l ä + y k s i n h u o l t a j a n a + y k s i n h u o l t a j a n a i s t e n + y k s i n h u o l t a j a p e r h e + y k s i n h u o l t a j a p e r h e e t + y k s i n h u o l t a j a p e r h e i d e n + y k s i n h u o l t a j a p e r h e i l l ä + y k s i n h u o l t a j a p e r h e i s i i n + y k s i n h u o l t a j a p e r h e i s s ä + y k s i n h u o l t a j a p e r h e i s t ä + y k s i n h u o l t a j a p e r h e i t ä + y k s i n h u o l t a j a p e r h e m a l l i n + y k s i n h u o l t a j a p e r h e t t ä + y k s i n h u o l t a j a t + y k s i n h u o l t a j a v a n h e m m i l l e + y k s i n h u o l t a j a ä i d e i l l e + y k s i n h u o l t a j a ä i d e i s t ä + y k s i n h u o l t a j a ä i d i t + y k s i n h u o l t a j a ä i t e i h i n + y k s i n h u o l t a j a ä i t e j ä + y k s i n h u o l t a j a ä i t i e n + y k s i n h u o l t a j a ä i t i ä + y k s i n h u o l t a j i a + y k s i n h u o l t a j i e n + y k s i n h u o l t a j i i n + y k s i n h u o l t a j i l l e + y k s i n h u o l t a j i n a + y k s i n h u o l t a j i s s a + y k s i n h u o l t a j i s t a + y k s i n k e r t a i s e e n + y k s i n k e r t a i s e l l a + y k s i n k e r t a i s e l t a + y k s i n k e r t a i s e m m a k s i + y k s i n k e r t a i s e m m a l l a + y k s i n k e r t a i s e m m a n + y k s i n k e r t a i s e m m a t + y k s i n k e r t a i s e m m i k s i + y k s i n k e r t a i s e m m i n + y k s i n k e r t a i s e m m i s t a + y k s i n k e r t a i s e m p a a + y k s i n k e r t a i s e m p i + y k s i n k e r t a i s e m p i a + y k s i n k e r t a i s e m p i a k i n + y k s i n k e r t a i s e m p i i n + y k s i n k e r t a i s e n + y k s i n k e r t a i s e n a + y k s i n k e r t a i s e s s a + y k s i n k e r t a i s e s t a + y k s i n k e r t a i s e t + y k s i n k e r t a i s i a + y k s i n k e r t a i s i i n + y k s i n k e r t a i s i l l a + y k s i n k e r t a i s i l l e + y k s i n k e r t a i s i l t a + y k s i n k e r t a i s i m m a l l a + y k s i n k e r t a i s i m m a l t a + y k s i n k e r t a i s i n + y k s i n k e r t a i s i n t a + y k s i n k e r t a i s t a a + y k s i n k e r t a i s t a a k s e e n + y k s i n k e r t a i s t a a k s e m m e + y k s i n k e r t a i s t a e n + y k s i n k e r t a i s t a k a a m m e + y k s i n k e r t a i s t a m a a n + y k s i n k e r t a i s t a m a l l a + y k s i n k e r t a i s t a m a s s a + y k s i n k e r t a i s t a m a t t a + y k s i n k e r t a i s t a m i s a j a t u s + y k s i n k e r t a i s t a m i s a l o i t e t t a + y k s i n k e r t a i s t a m i s a l o i t t e e t + y k s i n k e r t a i s t a m i s a s i a s t a + y k s i n k e r t a i s t a m i s e h d o t u k s e e n + y k s i n k e r t a i s t a m i s e h d o t u k s e s t a + y k s i n k e r t a i s t a m i s e h d o t u k s e t + y k s i n k e r t a i s t a m i s e h d o t u s + y k s i n k e r t a i s t a m i s e h d o t u s t a + y k s i n k e r t a i s t a m i s e h d o t u s t e n + y k s i n k e r t a i s t a m i s e k s i + y k s i n k e r t a i s t a m i s e l l e + y k s i n k e r t a i s t a m i s e n + y k s i n k e r t a i s t a m i s e s s a + y k s i n k e r t a i s t a m i s e s t a + y k s i n k e r t a i s t a m i s h a n k e + y k s i n k e r t a i s t a m i s h a n k k e e n + y k s i n k e r t a i s t a m i s k y s y m y k s e e n + y k s i n k e r t a i s t a m i s k y s y m y k s e n + y k s i n k e r t a i s t a m i s m a h d o l l i s u u d e t + y k s i n k e r t a i s t a m i s m a h d o l l i s u u k s i a + y k s i n k e r t a i s t a m i s m a l l i a + y k s i n k e r t a i s t a m i s m e n e t t e l y + y k s i n k e r t a i s t a m i s m e n e t t e l y t + y k s i n k e r t a i s t a m i s o h j e l m a + y k s i n k e r t a i s t a m i s o h j e l m a a + y k s i n k e r t a i s t a m i s o h j e l m a a n + y k s i n k e r t a i s t a m i s o h j e l m a n s a + y k s i n k e r t a i s t a m i s o h j e l m a s t a a n + y k s i n k e r t a i s t a m i s p a k e t t i a + y k s i n k e r t a i s t a m i s p a k e t t i i n + y k s i n k e r t a i s t a m i s p r o s e s s e i s t a + y k s i n k e r t a i s t a m i s p r o s e s s i + y k s i n k e r t a i s t a m i s p r o s e s s i a + y k s i n k e r t a i s t a m i s p r o s e s s i n + y k s i n k e r t a i s t a m i s p r o s e s s i s s a + y k s i n k e r t a i s t a m i s p y r k i m y k s e m m e + y k s i n k e r t a i s t a m i s p y r k i m y s t e n + y k s i n k e r t a i s t a m i s s e m i n a a r i n + y k s i n k e r t a i s t a m i s s t r a t e g i a + y k s i n k e r t a i s t a m i s s t r a t e g i a n + y k s i n k e r t a i s t a m i s s t r a t e g i a s s a + y k s i n k e r t a i s t a m i s s u u n n i t e l m a + y k s i n k e r t a i s t a m i s s u u n n i t e l m a n s a + y k s i n k e r t a i s t a m i s t a + y k s i n k e r t a i s t a m i s t a p a + y k s i n k e r t a i s t a m i s t a r p e e s t a + y k s i n k e r t a i s t a m i s t a r v e + y k s i n k e r t a i s t a m i s t a v o i t e t t a + y k s i n k e r t a i s t a m i s t a v o i t t e e n + y k s i n k e r t a i s t a m i s t a v o i t t e e n n e + y k s i n k e r t a i s t a m i s t o i m e n p i t e i d e n + y k s i n k e r t a i s t a m i s t o i m e n p i t e i s i i n + y k s i n k e r t a i s t a m i s t o i m e n p i t e i t ä + y k s i n k e r t a i s t a m i s t o i m e t + y k s i n k e r t a i s t a m i s t o i m i a + y k s i n k e r t a i s t a m i s t o i m i e n + y k s i n k e r t a i s t a m i s t o i m i i n + y k s i n k e r t a i s t a m i s v a a t i m u s t a + y k s i n k e r t a i s t a m i s v a i h t o e h d o i s t a + y k s i n k e r t a i s t a m i s v ä l i n e i t ä + y k s i n k e r t a i s t a m i s v ä l i n e t t ä + y k s i n k e r t a i s t a m i s y r i t y k s e k s i + y k s i n k e r t a i s t a v a a + y k s i n k e r t a i s t a v a t + y k s i n k e r t a i s t a v i a + y k s i n k e r t a i s t a v i l l a + y k s i n k e r t a i s t e n + y k s i n k e r t a i s t e t a + y k s i n k e r t a i s t e t a a n + y k s i n k e r t a i s t e t t a i s i i n + y k s i n k e r t a i s t e t t a v a + y k s i n k e r t a i s t e t t u a + y k s i n k e r t a i s t e t t u j a + y k s i n k e r t a i s t e t t u u n + y k s i n k e r t a i s t e t u i l l a + y k s i n k e r t a i s t e t u l l a + y k s i n k e r t a i s t e t u m p i + y k s i n k e r t a i s t e t u n + y k s i n k e r t a i s t e t u s s a + y k s i n k e r t a i s t e t u t + y k s i n k e r t a i s t u k s i a + y k s i n k e r t a i s u u d e n + y k s i n k e r t a i s u u d e s s a + y k s i n k e r t a i s u u d e s s a a n + y k s i n k e r t a i s u u s k y s y m y k s e l l e + y k s i n k e r t a i s u u t e e n + y k s i n k i n + y k s i n m i e l i s e s t ä + y k s i n m y y j ä + y k s i n m y y n t i i n + y k s i n o i k e u d e n + y k s i n o i k e u d e s t a + y k s i n o i k e u d e t + y k s i n o i k e u k s i a + y k s i n o i k e u s j ä r j e s t e l m i e n + y k s i n o i k e u s l a u s e k e + y k s i n o i k e u s l a u s e k k e e n + y k s i n o i k e u s l a u s e k k e i t a + y k s i n o i k e u s s o p i m u k s e t + y k s i n o i k e u s s o p i m u s t e n + y k s i n o i k e u t t a + y k s i n o l o s t a + y k s i n o m a a n + y k s i n o m a i s e e n + y k s i n o m a i s e k s i + y k s i n o m a i s e n + y k s i n o m a i s e s s a + y k s i n o m a i s e s t a + y k s i n o m a i s t a + y k s i n o s t o s o p i m u k s e t + y k s i n p u h e l u t + y k s i n p u r j e h t i j a l l e + y k s i n v a l t i a a k s i + y k s i n v a l t i a i t a + y k s i n v a l t i a s a s e m a a + y k s i n v a l t i a s p r e s i d e n t t i + y k s i n ä i s e k s i + y k s i n ä i s e m m i k s i + y k s i n ä i s e m p i + y k s i n ä i s i k s i + y k s i n ä i s y y t e e n + y k s i p u o l i s e e n + y k s i p u o l i s e k s i + y k s i p u o l i s e l l e + y k s i p u o l i s e l t a + y k s i p u o l i s e m p a a + y k s i p u o l i s e m p i + y k s i p u o l i s e n + y k s i p u o l i s e n a + y k s i p u o l i s e s s a + y k s i p u o l i s e s t a + y k s i p u o l i s e t + y k s i p u o l i s i a + y k s i p u o l i s i i n + y k s i p u o l i s i k s i + y k s i p u o l i s i l l a + y k s i p u o l i s i l t a + y k s i p u o l i s i s s a + y k s i p u o l i s i s t a + y k s i p u o l i s t e n + y k s i p u o l i s u u t t a + y k s i p u o l u e j ä r j e s t e l m ä n + y k s i p u o l u e j ä r j e s t e l m ä ä + y k s i p u o l u e j ä r j e s t e l m ä ä n + y k s i p ä i v ä i s e e n + y k s i p ä i v ä i s e n + y k s i p ä i v ä i s i ä + y k s i r u n k o i s e t + y k s i r u n k o i s i a + y k s i r u n k o i s i l l a + y k s i r u n k o i s i l l e + y k s i r u n k o i s i s s a + y k s i r u n k o i s i s t a + y k s i r u n k o i s t a + y k s i r u n k o i s t e n + y k s i s e l i t t e i s e m m i n + y k s i s e l i t t e i s e m m ä n + y k s i s e l i t t e i s e m p i + y k s i s e l i t t e i s e m p i ä + y k s i s e l i t t e i s e m p ä ä + y k s i s e l i t t e i s e n + y k s i s e l i t t e i s e t + y k s i s e l i t t e i s i m m ä n + y k s i s e l i t t e i s i ä + y k s i s e l i t t e i s t ä + y k s i s e l i t t e i s y y t t ä + y k s i s i l m ä i s t ä + y k s i s i l m ä i s y y d e n + y k s i s i l m ä i s y y d e s t ä + y k s i s o l u i s e t + y k s i s t ä ä n + y k s i s u u n t a i s e e n + y k s i s u u n t a i s e k s i + y k s i s u u n t a i s e l l e + y k s i s u u n t a i s e l t a + y k s i s u u n t a i s e n + y k s i s u u n t a i s e s t a + y k s i s u u n t a i s e s t i + y k s i s u u n t a i s e t + y k s i t o i k k o i s i a + y k s i t o i s t a v u o t i a s + y k s i t t ä i s d i r e k t i i v e i s s ä + y k s i t t ä i s e l l e + y k s i t t ä i s e m p ä ä + y k s i t t ä i s e n + y k s i t t ä i s e s i m e r k k e j ä + y k s i t t ä i s e s s ä + y k s i t t ä i s e s t ä + y k s i t t ä i s e t + y k s i t t ä i s i i n + y k s i t t ä i s i k s i + y k s i t t ä i s i l l e + y k s i t t ä i s i l l ä + y k s i t t ä i s i l t ä + y k s i t t ä i s i n ä + y k s i t t ä i s i s s ä + y k s i t t ä i s i s t ä + y k s i t t ä i s i ä + y k s i t t ä i s k a p p a l e i t a + y k s i t t ä i s m ä ä r ä y k s e t + y k s i t t ä i s p o i k k e u s t a + y k s i t t ä i s p ä ä t ö s t e n + y k s i t t ä i s s ä ä n n ö k s e t + y k s i t t ä i s t a p a u k s e e n + y k s i t t ä i s t a p a u k s e n + y k s i t t ä i s t a p a u k s e n a + y k s i t t ä i s t a p a u k s e s s a + y k s i t t ä i s t a p a u k s e s s a k a a n + y k s i t t ä i s t a p a u k s e s t a + y k s i t t ä i s t a p a u k s e t + y k s i t t ä i s t a p a u k s i a + y k s i t t ä i s t a p a u k s i i n + y k s i t t ä i s t a p a u k s i n a + y k s i t t ä i s t a p a u k s i s s a + y k s i t t ä i s t a p a u k s i s t a + y k s i t t ä i s t a p a u s + y k s i t t ä i s t a p a u s t a + y k s i t t ä i s t a p a u s t a p a u s + y k s i t t ä i s t a p a u s t e n + y k s i t t ä i s t e n + y k s i t t ä i s t ä + y k s i t u u m a i s e n + y k s i t u u m a i s t a + y k s i t y i s a j o n e u v o j a + y k s i t y i s a l a a + y k s i t y i s a l a l l a + y k s i t y i s a l u e e n a a n + y k s i t y i s a l u e e s e e n s a + y k s i t y i s a l u e i l l a + y k s i t y i s a r m e i j a a + y k s i t y i s a r m e i j o i t a + y k s i t y i s a s i a + y k s i t y i s a s i a k k a i l l e + y k s i t y i s a s i a k k a i s i i n + y k s i t y i s a s i a k k a i t a + y k s i t y i s a s i a n a + y k s i t y i s a s i a n s a + y k s i t y i s a s i a s t a + y k s i t y i s a s i o i d e n + y k s i t y i s a s i o i h i n + y k s i t y i s a s i o i s t a + y k s i t y i s a s u n n o n + y k s i t y i s a s u n n o s s a + y k s i t y i s a s u n n o s s a a n + y k s i t y i s a s u n t o i h i n + y k s i t y i s a s u n t o j a + y k s i t y i s a s u n t o j e n + y k s i t y i s a s u n t o o n + y k s i t y i s a u t o i h i n + y k s i t y i s a u t o i l i j a + y k s i t y i s a u t o i l i j o i d e n k a a n + y k s i t y i s a u t o i l l a + y k s i t y i s a u t o i l u + y k s i t y i s a u t o i l u a + y k s i t y i s a u t o i l u l l e + y k s i t y i s a u t o i l u n + y k s i t y i s a u t o i s s a + y k s i t y i s a u t o i s t a + y k s i t y i s a u t o j a + y k s i t y i s a u t o j e n + y k s i t y i s a u t o l i i k e n n e t t ä + y k s i t y i s a u t o n o m i a n + y k s i t y i s a u t o t + y k s i t y i s e e n + y k s i t y i s e k s i + y k s i t y i s e l l e + y k s i t y i s e l l ä + y k s i t y i s e l t ä + y k s i t y i s e l ä k k e i d e n + y k s i t y i s e l ä m ä + y k s i t y i s e l ä m ä l l e + y k s i t y i s e l ä m ä l l e e n + y k s i t y i s e l ä m ä m m e + y k s i t y i s e l ä m ä n + y k s i t y i s e l ä m ä n i + y k s i t y i s e l ä m ä n n e + y k s i t y i s e l ä m ä n s ä + y k s i t y i s e l ä m ä s s ä + y k s i t y i s e l ä m ä s s ä m m e + y k s i t y i s e l ä m ä s s ä n n e + y k s i t y i s e l ä m ä s s ä ä n + y k s i t y i s e l ä m ä s t ä m m e + y k s i t y i s e l ä m ä s t ä ä n + y k s i t y i s e l ä m ä ä + y k s i t y i s e l ä m ä ä n + y k s i t y i s e l ä m ä ä n s ä + y k s i t y i s e n + y k s i t y i s e n ä + y k s i t y i s e s s ä + y k s i t y i s e s t ä + y k s i t y i s e t + y k s i t y i s e t s i v ä + y k s i t y i s h e n k i l ö + y k s i t y i s h e n k i l ö i d e n + y k s i t y i s h e n k i l ö i h i n + y k s i t y i s h e n k i l ö i l l e + y k s i t y i s h e n k i l ö i l t ä + y k s i t y i s h e n k i l ö i n ä + y k s i t y i s h e n k i l ö i t ä + y k s i t y i s h e n k i l ö i t ä k i n + y k s i t y i s h e n k i l ö l l e + y k s i t y i s h e n k i l ö n + y k s i t y i s h e n k i l ö n ä + y k s i t y i s h e n k i l ö n ä k ä ä n + y k s i t y i s h e n k i l ö t + y k s i t y i s h e n k i l ö t k i n + y k s i t y i s i i n + y k s i t y i s i l l e + y k s i t y i s i l l ä + y k s i t y i s i l t ä + y k s i t y i s i n + y k s i t y i s i s s ä + y k s i t y i s i s t ä + y k s i t y i s i ä + y k s i t y i s k e s k u s t e l u j a + y k s i t y i s k e s k u s t e l u s s a + y k s i t y i s k i i n t e i s t ö i l l e + y k s i t y i s k i i n t e i s t ö j e n + y k s i t y i s k i r j a s t o i s s a m m e + y k s i t y i s k l i n i k o i l l a + y k s i t y i s k o d e i s s a + y k s i t y i s k o h d a n + y k s i t y i s k o h d a s s a + y k s i t y i s k o h d a s t a + y k s i t y i s k o h d a t + y k s i t y i s k o h d i l l a + y k s i t y i s k o h d i l l a k i n + y k s i t y i s k o h d i l t a + y k s i t y i s k o h d i l t a a n + y k s i t y i s k o h d i s s a + y k s i t y i s k o h d i s s a a n + y k s i t y i s k o h d i s t a + y k s i t y i s k o h t a + y k s i t y i s k o h t a a + y k s i t y i s k o h t a a n + y k s i t y i s k o h t a i n e n + y k s i t y i s k o h t a i s e e n + y k s i t y i s k o h t a i s e l l a + y k s i t y i s k o h t a i s e m m a k s i + y k s i t y i s k o h t a i s e m m a l l a + y k s i t y i s k o h t a i s e m m a l l e + y k s i t y i s k o h t a i s e m m a n + y k s i t y i s k o h t a i s e m m a s s a + y k s i t y i s k o h t a i s e m m a s t a + y k s i t y i s k o h t a i s e m m a t + y k s i t y i s k o h t a i s e m m i k s i + y k s i t y i s k o h t a i s e m m i l l a + y k s i t y i s k o h t a i s e m m i n + y k s i t y i s k o h t a i s e m m i n k i n + y k s i t y i s k o h t a i s e m m i s t a + y k s i t y i s k o h t a i s e m p a a + y k s i t y i s k o h t a i s e m p a a n + y k s i t y i s k o h t a i s e m p i + y k s i t y i s k o h t a i s e m p i a + y k s i t y i s k o h t a i s e m p i e n + y k s i t y i s k o h t a i s e m p i i n + y k s i t y i s k o h t a i s e n + y k s i t y i s k o h t a i s e s t a + y k s i t y i s k o h t a i s e s t i + y k s i t y i s k o h t a i s e s t i k i n + y k s i t y i s k o h t a i s e t + y k s i t y i s k o h t a i s i a + y k s i t y i s k o h t a i s i i n + y k s i t y i s k o h t a i s i m m i s t a + y k s i t y i s k o h t a i s i n a + y k s i t y i s k o h t a i s i s t a + y k s i t y i s k o h t a i s u u d e n + y k s i t y i s k o h t i a + y k s i t y i s k o h t i e n + y k s i t y i s k o h t i e n s a + y k s i t y i s k o h t i i n + y k s i t y i s k o k o e l m i s s a + y k s i t y i s k o n e e n + y k s i t y i s k o n e i k s i + y k s i t y i s k o n e i l l e + y k s i t y i s k o n e i s i i n + y k s i t y i s k o n e i s t a + y k s i t y i s k o n e i t a + y k s i t y i s k o u l u + y k s i t y i s k o u l u i l l e + y k s i t y i s k o u l u j a + y k s i t y i s k ä y t t ä j i i n + y k s i t y i s k ä y t t ä j i l l e + y k s i t y i s k ä y t t ä j i ä + y k s i t y i s k ä y t t ö + y k s i t y i s k ä y t t ö ä + y k s i t y i s k ä y t t ö ö n + y k s i t y i s k ä y t ö s s ä + y k s i t y i s l a i n a t + y k s i t y i s l e n t o k o n e i d e n + y k s i t y i s l e n t ä j ä + y k s i t y i s l e n t ä j ä n + y k s i t y i s l e n t ä j ä n ä + y k s i t y i s l i i k e n t e e n + y k s i t y i s m e t s ä t a l o u d e n + y k s i t y i s m o n o p o l i a + y k s i t y i s o i k e u d e k s i + y k s i t y i s o i k e u d e l l i n e n + y k s i t y i s o i k e u d e l l i s e e n + y k s i t y i s o i k e u d e l l i s e l l a + y k s i t y i s o i k e u d e l l i s e n + y k s i t y i s o i k e u d e l l i s i n + y k s i t y i s o i k e u d e l l i s i s s a + y k s i t y i s o i k e u d e l l i s t a + y k s i t y i s o i k e u d e n + y k s i t y i s o i k e u d e s s a + y k s i t y i s o i k e u d e s t a + y k s i t y i s o i k e u s + y k s i t y i s o i k e u s a l a l l a + y k s i t y i s o i k e u s a l u e e s t a + y k s i t y i s o i k e u s a s i a a n + y k s i t y i s o i k e u s a s i o i s s a + y k s i t y i s o i k e u s j ä r j e s t e l m ä n + y k s i t y i s o i k e u s k o m i t e a n + y k s i t y i s o i k e u t e e n + y k s i t y i s o i k e u t t a + y k s i t y i s o m a i s u u d e k s e e n + y k s i t y i s o m a i s u u d e l l e + y k s i t y i s o m a i s u u d e n + y k s i t y i s o m a i s u u d e s t a + y k s i t y i s o m a i s u u s + y k s i t y i s o m a i s u u t e e n + y k s i t y i s o m a i s u u t e n a a n + y k s i t y i s o m a i s u u t t a + y k s i t y i s o m i s t u k s e e n + y k s i t y i s o m i s t u k s e n + y k s i t y i s o m i s t u k s e s s a + y k s i t y i s o m i s t u s + y k s i t y i s p a n k e i l l e + y k s i t y i s p a n k k i e n + y k s i t y i s p o t i l a i d e n + y k s i t y i s p o t i l a i s t a + y k s i t y i s p u h e l u i h i n + y k s i t y i s p u h e l u i s t a + y k s i t y i s p u o l e l l e + y k s i t y i s r a h o i t u s a l o i t t e i s t a + y k s i t y i s r a i t e i d e n + y k s i t y i s s e k t o r e i l t a + y k s i t y i s s e k t o r i + y k s i t y i s s e k t o r i a + y k s i t y i s s e k t o r i i n + y k s i t y i s s e k t o r i l l a + y k s i t y i s s e k t o r i l l e + y k s i t y i s s e k t o r i l t a + y k s i t y i s s e k t o r i n + y k s i t y i s s e k t o r i t + y k s i t y i s t a l o j e n + y k s i t y i s t a l o u d e l l e + y k s i t y i s t a l o u d e l l i s i n + y k s i t y i s t a l o u d e n + y k s i t y i s t a l o u d e s t a + y k s i t y i s t a l o u d e t + y k s i t y i s t a l o u k s i e n + y k s i t y i s t a l o u k s i s s a + y k s i t y i s t a l o u t e e n + y k s i t y i s t a l o u t t a + y k s i t y i s t a p a u k s i s s a + y k s i t y i s t a r k o i t u k s i i n + y k s i t y i s t e n + y k s i t y i s t i e + y k s i t y i s t ä m i s a a l t o o n + y k s i t y i s t ä m i s a l o i t t e e t + y k s i t y i s t ä m i s d i r e k t i i v i s s ä + y k s i t y i s t ä m i s e e n + y k s i t y i s t ä m i s e n + y k s i t y i s t ä m i s e s s ä + y k s i t y i s t ä m i s e s t ä + y k s i t y i s t ä m i s e t + y k s i t y i s t ä m i s i n n o n + y k s i t y i s t ä m i s i s t ä + y k s i t y i s t ä m i s i ä + y k s i t y i s t ä m i s k e h i t y k s e n + y k s i t y i s t ä m i s k i i h k o + y k s i t y i s t ä m i s l a i n + y k s i t y i s t ä m i s l a k e i h i n + y k s i t y i s t ä m i s m e n e t e l m i e n + y k s i t y i s t ä m i s o h j e l m a + y k s i t y i s t ä m i s o h j e l m a a + y k s i t y i s t ä m i s o h j e l m a a n + y k s i t y i s t ä m i s o h j e l m a a n s a + y k s i t y i s t ä m i s o h j e l m a n + y k s i t y i s t ä m i s o h j e l m a s t a + y k s i t y i s t ä m i s o h j e l m a t + y k s i t y i s t ä m i s o h j e l m i a + y k s i t y i s t ä m i s o i k e u t t a + y k s i t y i s t ä m i s o p e r a a t i o + y k s i t y i s t ä m i s p a i n e e t + y k s i t y i s t ä m i s p a i n e i s i i n + y k s i t y i s t ä m i s p a i n e i s t a + y k s i t y i s t ä m i s p a o n + y k s i t y i s t ä m i s p e l i ä ä n + y k s i t y i s t ä m i s p e r i a a t e t t a + y k s i t y i s t ä m i s p o l i t i i k a n + y k s i t y i s t ä m i s p o l i t i i k k a + y k s i t y i s t ä m i s p o l i t i i k k a a + y k s i t y i s t ä m i s p r o s e s s i + y k s i t y i s t ä m i s p r o s e s s i a + y k s i t y i s t ä m i s p r o s e s s i i n + y k s i t y i s t ä m i s p r o s e s s i n + y k s i t y i s t ä m i s p r o s e s s i s s a + y k s i t y i s t ä m i s p r o s e s s i s t a + y k s i t y i s t ä m i s s o p i m u k s e n + y k s i t y i s t ä m i s s o p i m u k s e t + y k s i t y i s t ä m i s s u u n n i t e l m i a + y k s i t y i s t ä m i s s u u n n i t e l m i s t a + y k s i t y i s t ä m i s s u u n t a u k s e t + y k s i t y i s t ä m i s s ä ä n n ö t + y k s i t y i s t ä m i s t a h d i n + y k s i t y i s t ä m i s t a v o i t t e e t + y k s i t y i s t ä m i s t e n + y k s i t y i s t ä m i s t o i m e t + y k s i t y i s t ä m i s t o i m i e n + y k s i t y i s t ä m i s t o i m i i n + y k s i t y i s t ä m i s t u l o j e n + y k s i t y i s t ä m i s t ä + y k s i t y i s t ä m i s v i m m a a n + y k s i t y i s t ä m i s v i r a s t o n + y k s i t y i s t ä m ä ä n + y k s i t y i s t ä ä + y k s i t y i s v a k u u t u k s e e n + y k s i t y i s v a r a s t o i n n i n + y k s i t y i s v a r a s t o i n t i t u k e a + y k s i t y i s v i e s t i n t ä ä + y k s i t y i s v o i t t o j e n + y k s i t y i s y r i t t e l i ä i s y y d e l l e + y k s i t y i s y r i t t e l i ä i s y y d e n + y k s i t y i s y r i t t ä j i e n + y k s i t y i s y r i t t ä j i i n + y k s i t y i s y r i t t ä j i k s i + y k s i t y i s y r i t t ä j i l l e + y k s i t y i s y r i t t ä j i l t ä + y k s i t y i s y r i t t ä j i ä + y k s i t y i s y r i t t ä j y y t e e n + y k s i t y i s y r i t t ä j y y t t ä + y k s i t y i s y r i t t ä j ä l l ä + y k s i t y i s y r i t t ä j ä t + y k s i t y i s y r i t t ä m i s e n + y k s i t y i s y r i t y k s e e n + y k s i t y i s y r i t y k s e n + y k s i t y i s y r i t y k s e s s ä + y k s i t y i s y r i t y k s e t + y k s i t y i s y r i t y k s i i n + y k s i t y i s y r i t y k s i k s i + y k s i t y i s y r i t y k s i l l e + y k s i t y i s y r i t y k s i l l ä + y k s i t y i s y r i t y k s i l t ä + y k s i t y i s y r i t y k s i s s ä + y k s i t y i s y r i t y k s i s t ä + y k s i t y i s y r i t y k s i ä + y k s i t y i s y r i t y s + y k s i t y i s y r i t y s t e n + y k s i t y i s y y d e l l e + y k s i t y i s y y d e n + y k s i t y i s y y d e n l o u k k a u s + y k s i t y i s y y d e n s u o j a + y k s i t y i s y y d e n s u o j a a + y k s i t y i s y y d e n s u o j a n + y k s i t y i s y y d e n s u o j a s t a + y k s i t y i s y y d e s t ä + y k s i t y i s y y s j ä r j e s t e l m ä ä + y k s i t y i s y y s o i k e u d e n + y k s i t y i s y y s t a k e e t + y k s i t y i s y y s v a a t i m u k s i a + y k s i t y i s y y t e e n + y k s i t y i s y y t t ä + y k s i u l o t t e i s e e n + y k s i u l o t t e i s e k s i + y k s i u l o t t e i s e l l a + y k s i u l o t t e i s e n + y k s i u l o t t e i s e s t a + y k s i u l o t t e i s e s t i + y k s i v u o t i a i d e n + y k s i ä + y k s i ä ä n i s e s t i + y k s i ä ä n i s e s t ä + y l e e n s ä h ä n + y l e e n s ä k i n + y l e e n s ä k ä ä n + y l e i s a a t t e e n + y l e i s a f r i k k a l a i n e n + y l e i s a f r i k k a l a i s e e n + y l e i s a f r i k k a l a i s e l l a + y l e i s a f r i k k a l a i s e n + y l e i s a f r i k k a l a i s e s s a + y l e i s a i k a t a u l u u n + y l e i s a i n e i s s a + y l e i s a j a t u s + y l e i s a l o i t e t t a + y l e i s a l o i t t e e n + y l e i s a n e s t e s i a + y l e i s a r v i o + y l e i s a r v i o i n n i n + y l e i s a r v i o i n n i s s a + y l e i s a r v i o i n t i + y l e i s a r v i o i n t i i n + y l e i s a r v i o n + y l e i s a r v i o o n + y l e i s a r v o s a n a s t a + y l e i s a s e t u k s e e n + y l e i s a s e t u k s e k s i + y l e i s a s e t u k s e n + y l e i s a s e t u k s e s s a + y l e i s a s e t u k s e s s a k i n + y l e i s a s e t u k s i i n + y l e i s a s e t u s l u o n n o k s e n + y l e i s a s e t u s t a + y l e i s a u k t o r i t e e t i t + y l e i s a v a i m e n a + y l e i s a v a i n + y l e i s b a l k a n i l a i s t a + y l e i s d i r e k t i i v i + y l e i s d i r e k t i i v i l l ä + y l e i s d i r e k t i i v i n + y l e i s d i r e k t i i v i ä + y l e i s e d e l l y t y k s i e n + y l e i s e e n + y l e i s e h d o t u k s e n + y l e i s e h d o t u s t a + y l e i s e k s i + y l e i s e l l e + y l e i s e l l ä + y l e i s e l t ä + y l e i s e m m i k s i + y l e i s e m m i l l e + y l e i s e m m i l l ä + y l e i s e m m i n k i n + y l e i s e m m i s s ä + y l e i s e m m i s t ä + y l e i s e m m ä k s i + y l e i s e m m ä l l e + y l e i s e m m ä l l ä + y l e i s e m m ä l t ä + y l e i s e m m ä n + y l e i s e m m ä s s ä + y l e i s e m m ä s t ä + y l e i s e m m ä t + y l e i s e m m ä t k i n + y l e i s e m p i + y l e i s e m p i e n + y l e i s e m p i i n + y l e i s e m p i k i n + y l e i s e m p i ä + y l e i s e m p ä n ä + y l e i s e m p ä ä + y l e i s e m p ä ä k i n + y l e i s e m p ä ä n + y l e i s e m p ä ä n k i n + y l e i s e n + y l e i s e n n u s t e e t + y l e i s e n ä + y l e i s e s i t t e l i j ä + y l e i s e s i t t e l i j ä l l e + y l e i s e s i t t e l i j ä l l e m m e + y l e i s e s i t t e l i j ä m m e + y l e i s e s i t t e l i j ä n + y l e i s e s i t t e l i j ä n n e + y l e i s e s i t t e l i j ä n ä + y l e i s e s i t t e l i j ä ä + y l e i s e s i t t e l i j ä ä m m e + y l e i s e s i t t e l i j ö i t ä + y l e i s e s s ä + y l e i s e s t i k i n + y l e i s e s t ä + y l e i s e t + y l e i s e u r o o p p a l a i n e n + y l e i s e u r o o p p a l a i s e e n + y l e i s e u r o o p p a l a i s e k s i + y l e i s e u r o o p p a l a i s e l l a + y l e i s e u r o o p p a l a i s e m p i + y l e i s e u r o o p p a l a i s e n + y l e i s e u r o o p p a l a i s e s t a + y l e i s e u r o o p p a l a i s e s t i + y l e i s e u r o o p p a l a i s e t + y l e i s e u r o o p p a l a i s i a + y l e i s e u r o o p p a l a i s i i n + y l e i s e u r o o p p a l a i s i l l a + y l e i s e u r o o p p a l a i s i l l e + y l e i s e u r o o p p a l a i s t a + y l e i s e u r o o p p a l a i s t e n + y l e i s e u r o o p p a l a i s t u e s s a + y l e i s f i l o s o f i a n + y l e i s h a l l i n t o o n + y l e i s h u o m a u t u k s e n + y l e i s h u o m a u t u k s i a + y l e i s h u o m i o + y l e i s h u o m i o i t a + y l e i s h u o m i o n a + y l e i s h u o m i o t + y l e i s h u o m i o t a + y l e i s h y ö d y k e + y l e i s h y ö d y k k e e n ä + y l e i s h y ö d y k k e e s e e n + y l e i s h y ö d y k k e i s t ä + y l e i s h y ö d y k k e i t ä + y l e i s h y ö d y l l i n e n + y l e i s h y ö d y l l i s e n + y l e i s h y ö d y l l i s e n ä + y l e i s h y ö d y l l i s e s t ä + y l e i s h y ö d y l l i s e t + y l e i s h y ö d y l l i s i i n + y l e i s h y ö d y l l i s i k s i + y l e i s h y ö d y l l i s i l l e + y l e i s h y ö d y l l i s i l l ä + y l e i s h y ö d y l l i s i n + y l e i s h y ö d y l l i s i n ä + y l e i s h y ö d y l l i s i s s ä + y l e i s h y ö d y l l i s i s t ä + y l e i s h y ö d y l l i s i ä + y l e i s h y ö d y l l i s t e n + y l e i s h y ö d y l l i s t ä + y l e i s h y ö d y l l i s y y d e n + y l e i s h y ö d y l l i s y y d e s t ä + y l e i s i e n + y l e i s i i n + y l e i s i k s i + y l e i s i l l e + y l e i s i l l ä + y l e i s i l m a i l u + y l e i s i l m a i l u a + y l e i s i l m a i l u a k i n + y l e i s i l m a i l u l e n t o k o n e + y l e i s i l m a i l u n + y l e i s i m m i s t ä + y l e i s i m m ä l t ä + y l e i s i m m ä n + y l e i s i m m ä s t ä + y l e i s i m m ä t + y l e i s i m p i e n + y l e i s i m p i i n + y l e i s i m p i ä + y l e i s i m p ä ä n + y l e i s i n + y l e i s i n d e k s i + y l e i s i n h i m i l l i s e k s i + y l e i s i n h i m i l l i s y y s + y l e i s i n t ä + y l e i s i s l a m i l a i s e n + y l e i s i s l a m i l a i s t a + y l e i s i s s ä + y l e i s i s t u n n o s s a + y l e i s i s t u n t o + y l e i s i s t ä + y l e i s i ä + y l e i s j ä r j e s t e l m i e n + y l e i s j ä r j e s t e l m ä n + y l e i s j ä r j e s t e l m ä ä + y l e i s k a a v a + y l e i s k a p a s i t e e t t i a + y l e i s k a t s a u k s e n + y l e i s k a t s a u k s e s s a + y l e i s k a t s a u k s e s t a a n + y l e i s k a t s a u s + y l e i s k a t s a u s t a + y l e i s k a t t a v u u s + y l e i s k e h i t y s + y l e i s k e h o t u s t a + y l e i s k e h y k s e e n + y l e i s k e h y k s e n + y l e i s k e h y k s e s s ä + y l e i s k e h y k s e s t ä + y l e i s k e h y s + y l e i s k e r t o m u k s e n + y l e i s k e r t o m u k s e s s a + y l e i s k e r t o m u s + y l e i s k e r t o m u s t e n + y l e i s k e s k u s t e l u + y l e i s k e s k u s t e l u a + y l e i s k e s k u s t e l u n + y l e i s k e s k u s t e l u s s a + y l e i s k e s k u s t e l u u n + y l e i s k i e l e n ä + y l e i s k i e l i + y l e i s k i e l t o + y l e i s k l a u s u u l i + y l e i s k o k o u k s e e n + y l e i s k o k o u k s e k s i + y l e i s k o k o u k s e l l e + y l e i s k o k o u k s e l t a + y l e i s k o k o u k s e n + y l e i s k o k o u k s e s s a + y l e i s k o k o u k s e s s a a n + y l e i s k o k o u k s e s t a + y l e i s k o k o u k s i a + y l e i s k o k o u s + y l e i s k o k o u s t a + y l e i s k o k o u s t a a n + y l e i s k o k o u s v i i k o l l a + y l e i s k o m i t e a + y l e i s k o m m e n t i n + y l e i s k o r v a u k s e t + y l e i s k o r v a u s j ä r j e s t e l m ä t + y l e i s k r i i s i s t ä + y l e i s k u n t o o n + y l e i s k u s t a n n u k s i a + y l e i s k u s t a n n u s t e n + y l e i s k u v a + y l e i s k u v a a + y l e i s k u v a n + y l e i s k u v a u s + y l e i s k ä s i t t e e n + y l e i s k ä s i t t e e t + y l e i s k ä s i t y k s e n i + y l e i s k ä s i t y s + y l e i s l a a t u i s e m m a n + y l e i s l a i n s ä ä d ä n n ö n + y l e i s l a k k o + y l e i s l a k k o a + y l e i s l a k k o j e n + y l e i s l a k k o o n + y l e i s l a k o l l a + y l e i s l a k o n + y l e i s l a k o s s a + y l e i s l a k o s t a + y l e i s l a u s e k e + y l e i s l a u s e k k e i d e n + y l e i s l a u s e k k e i s i i n + y l e i s l a u s u n n o s s a + y l e i s l e i k k a u k s i a + y l e i s l e i k k a u s + y l e i s l e i k k a u s t a + y l e i s l e n t o k o n e i t a + y l e i s l i n j a + y l e i s l i n j a a + y l e i s l i n j a a n + y l e i s l i n j a s t a + y l e i s l i n j a t + y l e i s l i n j a u k s e e n + y l e i s l i n j a u k s e n + y l e i s l i n j a u k s e t + y l e i s l i n j a u k s i a + y l e i s l i n j a u k s i i n + y l e i s l i n j a u k s i s s a + y l e i s l i n j a u s + y l e i s l i n j o j e n + y l e i s l o i t s u a + y l e i s l u i s t e l u n + y l e i s l u o k i t u s t a + y l e i s l u o n t e i n e n + y l e i s l u o n t e i s e e n + y l e i s l u o n t e i s e k s i + y l e i s l u o n t e i s e m m a l l e + y l e i s l u o n t e i s e m p a a + y l e i s l u o n t e i s e m p a a n + y l e i s l u o n t e i s e m p i + y l e i s l u o n t e i s e m p i a + y l e i s l u o n t e i s e m p i e n + y l e i s l u o n t e i s e n + y l e i s l u o n t e i s e s t a + y l e i s l u o n t e i s e s t i + y l e i s l u o n t e i s e t + y l e i s l u o n t e i s i a + y l e i s l u o n t e i s i i n + y l e i s l u o n t e i s i l l e + y l e i s l u o n t e i s i l t a + y l e i s l u o n t e i s t a + y l e i s l u o n t e i s t e n + y l e i s l u o n t e i s u u s + y l e i s l u o n t o i n e n + y l e i s l u o n t o i s e m m a l l a + y l e i s l u o n t o i s e m m a n + y l e i s l u o n t o i s e m m i n + y l e i s l u o n t o i s e m p a a + y l e i s l u o n t o i s e m p i + y l e i s l u o n t o i s e m p i i n + y l e i s l u o n t o i s e n + y l e i s l u o n t o i s e s t i + y l e i s l u o n t o i s e t + y l e i s l u o n t o i s i a + y l e i s l u o n t o i s i i n + y l e i s l u o n t o i s i m m i s t a + y l e i s l u o n t o i s i s t a + y l e i s l u o n t o i s t a + y l e i s l u o n t o i s u u s + y l e i s l u p a + y l e i s l u p a a + y l e i s l u v a t + y l e i s l ä h e s t y m i s t a p a + y l e i s l ä h e s t y m i s t a p a a + y l e i s l ä ä k e + y l e i s l ä ä k e t i e d e + y l e i s l ä ä k e t i e t e e l l i s e t + y l e i s l ä ä k k e i t ä + y l e i s l ä ä k ä r e i d e n + y l e i s l ä ä k ä r e i l l e + y l e i s l ä ä k ä r i e n + y l e i s l ä ä k ä r i t + y l e i s m a a i l m a l l i n e n + y l e i s m a a i l m a l l i s e m m a l t a + y l e i s m a a i l m a l l i s e n + y l e i s m a a i l m a l l i s e n a + y l e i s m a a i l m a l l i s e s t a + y l e i s m a a i l m a l l i s e s t i + y l e i s m a a i l m a l l i s i a + y l e i s m a a i l m a l l i s i n a + y l e i s m a a i l m a l l i s i s s a + y l e i s m a a i l m a l l i s t a + y l e i s m a a i l m a l l i s t e n + y l e i s m a a i l m a l l i s t u v a s s a + y l e i s m a a i l m a l l i s u u d e n + y l e i s m a a i l m a l l i s u u t t a + y l e i s m a i n i n t a + y l e i s m a k s u j ä r j e s t e l m ä + y l e i s m a k s u j ä r j e s t e l m ä ä m m e + y l e i s m e k a n i s m i n + y l e i s m e n e t e l m ä + y l e i s m i e t i n t ö + y l e i s m i e t i n t ö j e n + y l e i s m ä ä r i t e l m ä + y l e i s m ä ä r i t e l m ä n + y l e i s m ä ä r i t e l m ä ä n + y l e i s m ä ä r ä y k s e n + y l e i s m ä ä r ä y s + y l e i s n e u v o s t o + y l e i s n e u v o s t o n + y l e i s n e u v o s t o o n + y l e i s n e u v o s t o s s a + y l e i s n e u v o t t e l u i s s a + y l e i s n i m e t + y l e i s n i m i + y l e i s n i m i t y k s e k s i + y l e i s n i m i t y k s e s t ä + y l e i s n i m i t y k s i ä + y l e i s n i m i t y s t e n + y l e i s n i m i t y s t ä + y l e i s n ä k e m y k s e e n + y l e i s n ä k e m y k s e n + y l e i s n ä k e m y k s e n s ä + y l e i s n ä k e m y k s e s t ä + y l e i s n ä k e m y k s e t + y l e i s n ä k e m y s + y l e i s n ä k e m y s t ä + y l e i s o h j e e n a + y l e i s o h j e l m a + y l e i s o h j e l m a a + y l e i s o h j e l m a n + y l e i s o h j e l m i e n + y l e i s o n g e l m a + y l e i s o s a s t o i l l e + y l e i s o s a s t o l l e n n e + y l e i s o s a s t o n s a + y l e i s o t s a k k e e n + y l e i s o t s i k o n + y l e i s p a k e t t i a + y l e i s p a k e t t i i n + y l e i s p a l v e l u + y l e i s p a l v e l u a + y l e i s p a l v e l u a l a a + y l e i s p a l v e l u d i r e k t i i v i + y l e i s p a l v e l u d i r e k t i i v i i n + y l e i s p a l v e l u d i r e k t i i v i n + y l e i s p a l v e l u d i r e k t i i v i s s ä + y l e i s p a l v e l u d i r e k t i i v i ä + y l e i s p a l v e l u i d e n + y l e i s p a l v e l u i h i n + y l e i s p a l v e l u i l l a + y l e i s p a l v e l u i l l e + y l e i s p a l v e l u i s t a + y l e i s p a l v e l u i t a + y l e i s p a l v e l u j a + y l e i s p a l v e l u j e m m e + y l e i s p a l v e l u j e n + y l e i s p a l v e l u j ä r j e s t e l y j e n + y l e i s p a l v e l u l l e + y l e i s p a l v e l u n + y l e i s p a l v e l u n a + y l e i s p a l v e l u s s a + y l e i s p a l v e l u s t a + y l e i s p a l v e l u t + y l e i s p a l v e l u u n + y l e i s p a l v e l u v e l v o i t e + y l e i s p a l v e l u v e l v o i t e t t a + y l e i s p a l v e l u v e l v o i t t e e n + y l e i s p a l v e l u v e l v o i t t e e s e e n + y l e i s p a l v e l u v e l v o i t t e e s t a + y l e i s p a l v e l u v e l v o i t t e i d e n + y l e i s p a l v e l u v e l v o i t t e i t a + y l e i s p a r l a m e n t i k s i + y l e i s p e r i a a t e + y l e i s p e r i a a t e t t a + y l e i s p e r i a a t e t t a n i + y l e i s p e r i a a t t e e k s i + y l e i s p e r i a a t t e e n + y l e i s p e r i a a t t e e n a + y l e i s p e r i a a t t e e n n e + y l e i s p e r i a a t t e e s e e n + y l e i s p e r i a a t t e e s t a + y l e i s p e r i a a t t e e t + y l e i s p e r i a a t t e i d e n + y l e i s p e r i a a t t e i n a + y l e i s p e r i a a t t e i s i i n + y l e i s p e r i a a t t e i s s a + y l e i s p e r i a a t t e i s t a + y l e i s p e r i a a t t e i t a + y l e i s p i i r t e e t + y l e i s p i i r t e i d e n + y l e i s p i i r t e i s s ä ä n + y l e i s p o h j o i s e u r o o p p a l a i s e n + y l e i s p o l i i t t i n e n + y l e i s p o l i i t t i s e s t i + y l e i s p o l i i t t i s i i n + y l e i s p o l i i t t i s t a + y l e i s p o l i i t t i s t e n + y l e i s p o l i t i i k a n + y l e i s p o l i t i i k a t + y l e i s p o s t i p a l v e l u i h i n + y l e i s p o s t i p a l v e l u j a + y l e i s p u h e e n v u o r o o n + y l e i s p ä t e v i ä + y l e i s p ä t e v y y t t ä + y l e i s p ä t e v ä m m i n + y l e i s p ä t e v ä n + y l e i s p ä t e v ä s t ä + y l e i s p ä t e v ä ä + y l e i s p ä ä t e l m ä + y l e i s p ä ä t e l m ä ä + y l e i s r a d i o + y l e i s r a d i o i l l e + y l e i s r a d i o j ä r j e s t e l m i s s ä + y l e i s r a d i o j ä r j e s t e l m ä + y l e i s r a d i o k o m i t e a + y l e i s r a d i o l a i n s ä ä d ä n n ö n + y l e i s r a d i o l ä h e t y k s i ä + y l e i s r a d i o n + y l e i s r a d i o p a l v e l u + y l e i s r a d i o p a l v e l u j e n + y l e i s r a d i o p a l v e l u n + y l e i s r a d i o p a l v e l u t + y l e i s r a d i o p o l i t i i k k a + y l e i s r a d i o t a + y l e i s r a d i o t a a j u u k s i e n + y l e i s r a d i o t o i m i n n a l l e + y l e i s r a d i o t o i m i n n a n + y l e i s r a d i o t o i m i n n a s s a + y l e i s r a d i o t o i m i n n a s t a + y l e i s r a d i o t o i m i n t a + y l e i s r a d i o t o i m i n t a a + y l e i s r a d i o t o i m i n t a a n + y l e i s r a d i o u n i o n i + y l e i s r a d i o v e r k o n + y l e i s r a d i o v e r k o s t o i l l e + y l e i s r a d i o y h t i ö + y l e i s r a d i o y h t i ö i d e n + y l e i s r a d i o y h t i ö i h i n + y l e i s r a d i o y h t i ö i l l e + y l e i s r a d i o y h t i ö i t ä + y l e i s r a d i o y h t i ö n + y l e i s r a d i o y h t i ö s t ä + y l e i s r a d i o y h t i ö t + y l e i s r a d i o y h t i ö t ä + y l e i s r a h a s t o o n + y l e i s r a h o i t u k s e n + y l e i s r a j o j a + y l e i s r a k e n n e + y l e i s r a k e n n e t t a + y l e i s r a n g a i s t u k s e t + y l e i s r a n g a i s t u k s i a + y l e i s r a p o r t t i + y l e i s r a t k a i s u a + y l e i s r a t k a i s u u n + y l e i s s a i r a a n h o i t a j i e n + y l e i s s i s ä l l ö n + y l e i s s i s ä l t ö + y l e i s s i s ä l t ö ä + y l e i s s i t o v a + y l e i s s i t o v a n + y l e i s s i t o v a n a + y l e i s s i t o v i a + y l e i s s i t o v i e n + y l e i s s i t o v i i n + y l e i s s i v i s t y k s e e n + y l e i s s i v i s t y k s e n + y l e i s s i v i s t y s + y l e i s s i v i s t y s t ä + y l e i s s i v i s t ä v ä n + y l e i s s l a a v i l a i n e n + y l e i s s o p i m u k s e e n + y l e i s s o p i m u k s e k s i + y l e i s s o p i m u k s e n + y l e i s s o p i m u k s e s s a + y l e i s s o p i m u k s e s t a + y l e i s s o p i m u k s e t + y l e i s s o p i m u k s i a + y l e i s s o p i m u k s i i n + y l e i s s o p i m u k s i s s a + y l e i s s o p i m u k s i s t a + y l e i s s o p i m u s + y l e i s s o p i m u s a l u e e n + y l e i s s o p i m u s e h d o t u k s e n + y l e i s s o p i m u s e h d o t u k s e s t a + y l e i s s o p i m u s e h d o t u s + y l e i s s o p i m u s e s i t y s + y l e i s s o p i m u s j ä r j e s t e l m ä n + y l e i s s o p i m u s l u o n n o k s e e n + y l e i s s o p i m u s l u o n n o k s e n + y l e i s s o p i m u s l u o n n o k s e s s a + y l e i s s o p i m u s l u o n n o k s i i n + y l e i s s o p i m u s l u o n n o k s i s t a + y l e i s s o p i m u s l u o n n o s + y l e i s s o p i m u s l u o n n o s t a + y l e i s s o p i m u s t a + y l e i s s o p i m u s t e n + y l e i s s t a n d a r d i t + y l e i s s t r a t e g i a + y l e i s s t r a t e g i a a + y l e i s s t r a t e g i a a m m e + y l e i s s t r a t e g i a n + y l e i s s u o s i t u k s i a + y l e i s s u u n n a s t a + y l e i s s u u n n i t e l m a + y l e i s s u u n n i t e l m a a + y l e i s s u u n n i t e l m a k s i + y l e i s s u u n n i t e l m a n + y l e i s s u u n n i t e l m a s s a + y l e i s s u u n t a u k s e n + y l e i s s u u n t a u k s e n s a + y l e i s s u u n t a u s + y l e i s s u u n t a u s t a + y l e i s s ä v y + y l e i s s ä v y l t ä ä n + y l e i s s ä v y y n + y l e i s s ä v y ä + y l e i s s ä ä d ö s + y l e i s s ä ä n n ö k s e n + y l e i s s ä ä n n ö k s i + y l e i s s ä ä n n ö n + y l e i s s ä ä n n ö s t ä + y l e i s s ä ä n t ö + y l e i s s ä ä n t ö i h i n + y l e i s s ä ä n t ö j ä + y l e i s s ä ä n t ö n ä + y l e i s s ä ä n t ö ä + y l e i s s ä ä n t ö ö n + y l e i s t a j u i s u u t e e n + y l e i s t a r k i s t u s + y l e i s t a r k i s t u s t a + y l e i s t a r k o i t u k s e n a + y l e i s t a s o a + y l e i s t a s o n + y l e i s t a v o i t e + y l e i s t a v o i t e t t a + y l e i s t a v o i t t e e k s i + y l e i s t a v o i t t e e m m e + y l e i s t a v o i t t e e n + y l e i s t a v o i t t e e n a + y l e i s t a v o i t t e e n a m m e + y l e i s t a v o i t t e e s e e n + y l e i s t a v o i t t e e s s a + y l e i s t a v o i t t e e s t a + y l e i s t a v o i t t e e t + y l e i s t a v o i t t e i d e n + y l e i s t a v o i t t e i s t a + y l e i s t a v o i t t e i t a + y l e i s t e e m a + y l e i s t e k n o l o g i a t + y l e i s t e n + y l e i s t e r m i + y l e i s t i e d o s t a + y l e i s t i e t o j a + y l e i s t i e t o j a m m e + y l e i s t i l a + y l e i s t i l a n n e + y l e i s t i l a n n e t t a + y l e i s t i l a n t e e s t a + y l e i s t o i m e n p i d e t t ä + y l e i s t o i m e n p i t e i t ä + y l e i s t o i m i v a l t a + y l e i s t u l o k s e n a + y l e i s t u l o s + y l e i s t u n t e m u k s e n + y l e i s t u r k k i l a i s e e n + y l e i s t u r k k i l a i s t a + y l e i s t u t k i m u k s e s s a + y l e i s t u t k i m u s t a + y l e i s t y e n + y l e i s t y e s s ä + y l e i s t y e s s ä ä n + y l e i s t y i s i + y l e i s t y i s i v ä t + y l e i s t y k s i i n + y l e i s t y k s i l l ä + y l e i s t y k s i ä + y l e i s t y m i n e n + y l e i s t y m i s e e n + y l e i s t y m i s e n + y l e i s t y m i s e s t ä + y l e i s t y m ä s s ä + y l e i s t y n e e t + y l e i s t y n y t + y l e i s t y s t e n + y l e i s t y v ä n + y l e i s t y v ä t + y l e i s t y y + y l e i s t y ä + y l e i s t ä m ä ä n + y l e i s t ä ä + y l e i s u n i o n i + y l e i s u r h e i l u f i n a a l i + y l e i s u r h e i l u l i i t t o + y l e i s u r h e i l u n + y l e i s v a a l e i s s a + y l e i s v a a l e i s t a + y l e i s v a a l i e n + y l e i s v a a l i t + y l e i s v a a t i m u s t a + y l e i s v a i k u t e l m a + y l e i s v a i k u t e l m a n + y l e i s v a i k u t u s t a + y l e i s v a l i o k u n n a s s a + y l e i s v a l t a k i r j a + y l e i s v a l t u u d e t + y l e i s v a l t u u t u k s e n + y l e i s v a l t u u t u k s e s s a + y l e i s v a r a u m a + y l e i s v a s t u u s t a + y l e i s v e l v o i t e + y l e i s v e n ä l ä i n e n + y l e i s v e r o + y l e i s v i k a a r i + y l e i s y h t e e n v e t o + y l e i s ä l y k k y y s + y l e i s ä ä n e s t y k s e n + y l e i s ö a i t i o s s a + y l e i s ö a k v a a r i o + y l e i s ö j o u k o n + y l e i s ö k a d o s t a + y l e i s ö k y s e l y + y l e i s ö k ä ä n + y l e i s ö l e h t e r e i l l ä + y l e i s ö l e h t e r e i l t ä + y l e i s ö l e h t e r i + y l e i s ö l e h t e r i l l e + y l e i s ö l e h t e r i l l ä + y l e i s ö l e h t e r i l t ä + y l e i s ö l e h t e r i t + y l e i s ö l l e + y l e i s ö l l e k i n + y l e i s ö l l ä + y l e i s ö l t ä + y l e i s ö n + y l e i s ö p a l v e l u + y l e i s ö p u h e l i m i a + y l e i s ö p u h e l i m i e n + y l e i s ö s s ä + y l e i s ö s t ä + y l e i s ö y s t ä v ä l l i s i ä + y l e i s ö ä + y l e i s ö ö n + y l e l l i s e t + y l e l l i s i m p i i n + y l e l l i s y y s e s i n e e n ä + y l e l l i s y y s h a n k k e e n + y l e l l i s y y s h y ö d y k k e i s i i n + y l e l l i s y y s m e r k k e j ä + y l e l l i s y y s t a r v i k k e i t a + y l e l l i s y y s t a v a r a a + y l e l l i s y y s t a v a r o i d e n + y l e l l i s y y s t a v a r o i t a + y l e l l i s y y s t u o t e + y l e l l i s y y s t u o t e t e o l l i s u u t t a + y l e l l i s y y s t u o t t e e n + y l e l l i s y y s t u o t t e e t + y l e l l i s y y s t u o t t e i d e n + y l e l l i s y y s t u o t t e i s i i n + y l e l l i s y y s t u o t t e i s t a + y l e l l i s y y s t u o t t e i t a + y l e m m y y d e n t u n n e + y l e m m y y d e n t u n t o + y l e m m y y d e n t u n t o a + y l e m p i ä + y l e n e m i s m a h d o l l i s u u d e t + y l e n e m i s m a h d o l l i s u u k s i i n s a + y l e n e v ä s s ä + y l e n e v ä ä + y l e n k a t s o e n + y l e n k a t s o n e e t + y l e n k a t s o t a a n + y l e n k a t s o t t u + y l e n m ä ä r ä i s e t + y l e n n e t ä ä n + y l e n n y k s e t + y l e n n y k s i ä + y l e n n y s a a l t o + y l e n n y s j ä r j e s t e l m ä + y l e n n y s m e n e t t e l y i s t ä + y l e n n y s v a a t i m u k s i s t a + y l e n p a l t t i s e n + y l e n t ä m i s m e n e t t e l y s t ä + y l e n t ä m i s t ä + y l e n t ä v i n ä + y l e v i e n + y l e v i n + y l e v i ä + y l e v ä l t ä + y l e v ä m p ä ä + y l e v ä t + y l h ä i s e s s ä + y l i a n n o s t u s + y l i a n n o s t u s t a p a u k s i s s a + y l i a r v i o i d a + y l i a r v i o i m a t t a + y l i a r v i o i n t i + y l i a r v o s t e t t u + y l i a r v o s t e t u l l a + y l i a r v o s t e t u n + y l i a r v o s t u s t a + y l i b u d j e t o i n n i n + y l i b u d j e t o i n t i + y l i b u d j e t o i n t i a + y l i b u d j e t o i t u j a + y l i b y r o k r a a t t i s e s t a + y l i d r a m a t i s o i d a + y l i d r a m a t i s o i n t i a + y l i d r a m a t i s o i n t i i n + y l i e d u s t e t t u i n a + y l i e d u s t e t t u j a + y l i e d u s t e t t u n a + y l i e d u s t u k s e e n + y l i e d u s t u s + y l i e u r o o p p a l a i s e n a + y l i h e r k k y y s r e a k t i o i t a + y l i h e r k k ä + y l i h e r k ä t + y l i h i n n a n + y l i h i n n a s t a + y l i h i n n o i s t a + y l i h i n n o i t e l t u j a + y l i h i n n o i t t e l u a + y l i h i n t a a + y l i h i n t a a n + y l i h u o m e n n a k i n + y l i h u o m i s e e n + y l i h u o m i s e k s i + y l i h u o m i s e n + y l i h u o m i s t a + y l i h y ö d y n n e t y k s i + y l i j u m a l a + y l i j ä n n i t e s u o j a + y l i j ä ä m i e n + y l i j ä ä m i ä + y l i j ä ä m ä + y l i j ä ä m ä a m m u s t e n + y l i j ä ä m ä a s e e t + y l i j ä ä m ä e l i n t a r v i k k e i s t a + y l i j ä ä m ä e l o h o p e a + y l i j ä ä m ä e l o h o p e a a + y l i j ä ä m ä e n e r g i a a + y l i j ä ä m ä e n e r g i a m m e + y l i j ä ä m ä i n e n + y l i j ä ä m ä i s e l l ä + y l i j ä ä m ä i s e t + y l i j ä ä m ä i s i ä + y l i j ä ä m ä j u u r i k a s t a + y l i j ä ä m ä j ä t t e e n + y l i j ä ä m ä k s i + y l i j ä ä m ä l i h a + y l i j ä ä m ä l l ä + y l i j ä ä m ä m a i s s i n + y l i j ä ä m ä m a r k k i n o i t a + y l i j ä ä m ä n + y l i j ä ä m ä n s ä + y l i j ä ä m ä o n g e l m a n + y l i j ä ä m ä p e r i a a t t e e s e e n + y l i j ä ä m ä r u o k a a + y l i j ä ä m ä s o k e r i s t a + y l i j ä ä m ä s t ä + y l i j ä ä m ä t + y l i j ä ä m ä t a v a r o i l l a m m e + y l i j ä ä m ä t i l a n n e + y l i j ä ä m ä t o m a a t t i + y l i j ä ä m ä v a l t i o i d e n + y l i j ä ä m ä v a r a s t o a + y l i j ä ä m ä v a r a s t o i h i n + y l i j ä ä m ä v a r a s t o i s s a + y l i j ä ä m ä v a r a s t o i s t a + y l i j ä ä m ä v a r a s t o j a + y l i j ä ä m ä v a r a s t o t + y l i j ä ä m ä v a r o j a + y l i j ä ä m ä v a r o j e n + y l i j ä ä m ä v e d e n + y l i j ä ä m ä v i l j a a + y l i j ä ä m ä v o i t a + y l i j ä ä m ä v ä e s t ö ä + y l i j ä ä m ä ä + y l i j ä ä m ä ä n + y l i k a l a s t u k s e e n + y l i k a l a s t u s + y l i k a l a s t u s t a + y l i k a n s a l l i n e n + y l i k a n s a l l i s e e n + y l i k a n s a l l i s e k s i + y l i k a n s a l l i s e l l a + y l i k a n s a l l i s e l l e + y l i k a n s a l l i s e m p i + y l i k a n s a l l i s e n + y l i k a n s a l l i s e n a + y l i k a n s a l l i s e s s a + y l i k a n s a l l i s e s t a + y l i k a n s a l l i s e s t i + y l i k a n s a l l i s e t + y l i k a n s a l l i s i a + y l i k a n s a l l i s i i n + y l i k a n s a l l i s i l l a + y l i k a n s a l l i s i l l e + y l i k a n s a l l i s i n + y l i k a n s a l l i s i s s a + y l i k a n s a l l i s i s t a + y l i k a n s a l l i s t a + y l i k a n s a l l i s t a m i s t a + y l i k a n s a l l i s t e n + y l i k a n s a l l i s u u d e n + y l i k a n s a l l i s u u t e e n + y l i k a n s a l l i s u u t t a + y l i k a p a s i t e e t i n + y l i k a p a s i t e e t i s t a + y l i k a p a s i t e e t t i + y l i k a p a s i t e e t t i a + y l i k a p a s i t e e t t i a a n + y l i k a p a s i t e e t t i i n + y l i k a p a s i t e e t t i o n g e l m a + y l i k a p a s i t e e t t i o n g e l m i e n + y l i k e h i t t y n e e n + y l i k e r s a n t t i + y l i k e r s a n t t i k a l a + y l i k e s k i t e t t y + y l i k e s k i t e t y n + y l i k e s k i t t y m i s e e n + y l i k o m i s s a a r i n v i r a n + y l i k o r k e i t a + y l i k o r o s t a m i n e n + y l i k o r o s t a m i s t a + y l i k o r r e k t i a + y l i k o u l u t e t t u j a + y l i k o u l u t e t t u j e n + y l i k r i i t t i s y y t e e n + y l i k r i m i n a l i s o i n n i n + y l i k u l k u + y l i k u l u t u s t a + y l i k u n i n k a a s e e n + y l i k u o r m i t e t t u j a + y l i k u o r m i t e t u i m p i a + y l i k u o r m i t t a a + y l i k u o r m i t t a m a t t a + y l i k u u m e n e m i s t a + y l i k u u m e n t u n e e k s i + y l i k u u m e n t u n u t t a + y l i k y y n i s i ä + y l i k ä y t ö s s ä + y l i l a s k u t u k s e e n + y l i l e n n o i s t a + y l i l e n t o m a k s u + y l i l e n t o m a k s u j e n + y l i l e n t o m a k s u t + y l i l i b e r a a l i n + y l i l u o n n o l l i s i a + y l i l u u t n a n t t i + y l i l y ö n n e i s t ä + y l i l y ö n t e j ä + y l i l ä ä k ä r i + y l i m a l k a i s e m m a n + y l i m a l k a i s e s t i + y l i m a l k a i s e t + y l i m a l k a i s i a + y l i m e n o k a u d e k s i + y l i m e n o k a u d e l l a + y l i m e n o k a u d e l l e + y l i m e n o k a u d e n + y l i m e n o k a u d e s t a + y l i m e n o k a u s i + y l i m e n o k a u s i a + y l i m e n o k a u s i e n + y l i m e n o k a u s i s t a + y l i m e n o k a u t t a + y l i m e n o p u h e e n j o h t a j a k a u d e s t a + y l i m e n o v a i h e e n + y l i m e n o v a i h e e s s a + y l i m i e h i t e t y s t ä + y l i m i e l i s e s t i + y l i m i e l i s e t + y l i m i e l i s i ä + y l i m i e l i s t ä + y l i m i e l i s y y d e s t ä + y l i m i e l i s y y t t ä + y l i m i e s + y l i m i t o i t e t t u + y l i m i t o i t e t t u j a + y l i m m i l t ä + y l i m m ä n + y l i m y y n n i n + y l i m y y n n i s t ä + y l i m y y n n i t + y l i m y y n t i k ä y t ä n t ö j e n + y l i m y y n t i ä + y l i m ä ä r ä a s e i d e n + y l i m ä ä r ä i n e n + y l i m ä ä r ä i s e e n + y l i m ä ä r ä i s e k s i + y l i m ä ä r ä i s e l l ä + y l i m ä ä r ä i s e n + y l i m ä ä r ä i s e s s ä + y l i m ä ä r ä i s e s t ä + y l i m ä ä r ä i s e t + y l i m ä ä r ä i s i i n + y l i m ä ä r ä i s i l l ä + y l i m ä ä r ä i s i ä + y l i m ä ä r ä i s t e n + y l i m ä ä r ä i s t ä + y l i n o p e u d e s t a + y l i n o p e u s + y l i n o p e u t t a + y l i o i k e u s + y l i o l k a i s e s t i + y l i o p i s t o + y l i o p i s t o a l a + y l i o p i s t o a r v o s a n a t + y l i o p i s t o a s i a n t u n t i j a + y l i o p i s t o a s u n t o l o i d e n + y l i o p i s t o e l ä m ä ä + y l i o p i s t o h a a s t a t t e l u s s a + y l i o p i s t o h a n k k e e s e e n + y l i o p i s t o i h i n + y l i o p i s t o i l l a + y l i o p i s t o i l t a + y l i o p i s t o i n s t i t u u t i n + y l i o p i s t o i n s t i t u u t t i + y l i o p i s t o i s s a + y l i o p i s t o i s t a + y l i o p i s t o j a + y l i o p i s t o j a l k a p a l l o + y l i o p i s t o j e m m e + y l i o p i s t o j e n + y l i o p i s t o j ä r j e s t e l m i ä + y l i o p i s t o j ä r j e s t e l m ä + y l i o p i s t o j ä r j e s t e l m ä m m e + y l i o p i s t o j ä r j e s t e l m ä n + y l i o p i s t o j ä r j e s t e l m ä ä + y l i o p i s t o k a u p u n g e i s s a + y l i o p i s t o k a u p u n k i e n + y l i o p i s t o k e s k u k s e s s a + y l i o p i s t o k e s k u k s i a + y l i o p i s t o k e s k u s t e l u l l e + y l i o p i s t o k e s k u s t e n + y l i o p i s t o k o l l e g o i l l e e n + y l i o p i s t o k o n s o r t i o t + y l i o p i s t o k o r t t e l e i t a + y l i o p i s t o k o u l u t u k s e e n + y l i o p i s t o k o u l u t u k s e n + y l i o p i s t o k o u l u t u k s e s t a + y l i o p i s t o k o u l u t u s + y l i o p i s t o k o u l u t u s t a + y l i o p i s t o k u r s s e i h i n + y l i o p i s t o k u r s s e j a + y l i o p i s t o k u r s s i e n + y l i o p i s t o k y s y m y k s i i n + y l i o p i s t o k y s y m y s + y l i o p i s t o l a i t o k s i l l e + y l i o p i s t o l a k i + y l i o p i s t o l i i t t o + y l i o p i s t o l l i s e t + y l i o p i s t o l l i s t a + y l i o p i s t o m a a i l m a a n + y l i o p i s t o m a a i l m a n + y l i o p i s t o m m e + y l i o p i s t o m u s e o + y l i o p i s t o n + y l i o p i s t o p e r h e i t ä + y l i o p i s t o p e r i n n e t t ä + y l i o p i s t o p o h j a i s i a + y l i o p i s t o p r o f e s s u u r i n + y l i o p i s t o r a n k i n g + y l i o p i s t o r o m a a n i + y l i o p i s t o s a i r a a l a + y l i o p i s t o s a i r a a l a t + y l i o p i s t o s e k t o r i n + y l i o p i s t o s t a + y l i o p i s t o t + y l i o p i s t o t a s o a + y l i o p i s t o t a s o i s e n + y l i o p i s t o t a s o i s i a + y l i o p i s t o t a s o i s t a + y l i o p i s t o t a s o l l a + y l i o p i s t o t a s o l l e + y l i o p i s t o t a s o n + y l i o p i s t o t u t k i j a a + y l i o p i s t o t u t k i j o i h i n + y l i o p i s t o t u t k i j o i l l e + y l i o p i s t o t u t k i m u s t a + y l i o p i s t o t u t k i m u s t e n + y l i o p i s t o t u t k i n n o n + y l i o p i s t o t u t k i n t o + y l i o p i s t o t u t k i n t o a + y l i o p i s t o t u t k i n t o i h i n + y l i o p i s t o t u t k i n t o j e n + y l i o p i s t o t u t k i n t o t o d i s t u s t e n + y l i o p i s t o u r a n + y l i o p i s t o u r a n s a + y l i o p i s t o v a i h t o + y l i o p i s t o v a i h t o j e n + y l i o p i s t o v a s t i n e + y l i o p i s t o v e r k k o + y l i o p i s t o v i r a n o m a i s e n + y l i o p i s t o v i r a n o m a i s t e n + y l i o p i s t o v i r o i s t a + y l i o p i s t o v u o d e n + y l i o p i s t o y m p ä r i s t ö j e n + y l i o p p i l a i d e n p ä i v ä + y l i o p p i l a s k u n n a l t a + y l i o p p i l a s k u n n a n + y l i o p p i l a s k u n t a + y l i o p p i l a s k y l ä + y l i o p p i l a s l a k k i + y l i o p t i m i s m i s t a + y l i o p t i m i s t i n e n + y l i o p t i m i s t i s e e n + y l i o p t i m i s t i s i a + y l i o p t i m i s t i s t a + y l i o p t i m i s t i s t e n + y l i o p t i m i s t i s u u s + y l i o t e + y l i o t e t t a + y l i o t t e e n + y l i p a i n e h a p p i h o i t o + y l i p a i n o + y l i p a i n o a + y l i p a i n o i s i i n + y l i p a i n o i s i l l a + y l i p a i n o i s t e n + y l i p a i n o s t a + y l i p a p e i l l e + y l i p a p p i + y l i p a p p i n a + y l i p i t k i e n + y l i p i t k i i n + y l i p i t k ä + y l i p i t k ä t + y l i p o r m e s t a r i + y l i p o r m e s t a r i n + y l i p ä ä l l i k k ö + y l i p ä ä n s ä + y l i p ä ä s e m ä t t ö m i l t ä + y l i p ä ä s e m ä t t ö m ä t + y l i p ä ä t ä n s ä + y l i p ä ä t ä n s ä k ä ä n + y l i p ä ä t ä ä n + y l i r a s i t t u n e e t + y l i r e a g o i d a + y l i r e a g o i n n i n + y l i r e a g o i n t i + y l i r e a g o i n t i a + y l i s a n a i s u u s + y l i s t e t y n + y l i s t e t y s t ä + y l i s t e t ä ä n + y l i s t i + y l i s t i m m e + y l i s t i v ä t + y l i s t y k s i i n + y l i s t y s k u o r o o n + y l i s t y s s a n a + y l i s t y s s a n a t + y l i s t ä m m e + y l i s t ä m ä l l ä + y l i s t ä m ä s s ä + y l i s t ä m ä t t ä + y l i s t ä n + y l i s t ä n y t + y l i s t ä v i m m ä t + y l i s t ä v ä t + y l i s t ä ä + y l i s u o j e l l u i s t a + y l i s u o j e l t u j a + y l i s u o j e l u l l a + y l i s u o r i t t a m i s t a + y l i s u u r e n a + y l i s u u r e t + y l i s u u r i a + y l i s u u r i s t a + y l i s u u r t e n + y l i s ä ä d e l t y + y l i s ä ä n t e l y + y l i s ä ä n t e l y n + y l i s ä ä n t e l y n ä + y l i s ä ä n t e l y s t ä + y l i s ä ä n t e l y y n + y l i s ä ä n t e l y ä + y l i s ä ä t e l y s t ä + y l i t a r j o n n a n + y l i t a r j o n n a s t a + y l i t a r j o n t a + y l i t a r j o n t a a + y l i t a r k a s t a j a + y l i t a r k a s t a j i a + y l i t e h o k a s + y l i t e t t y + y l i t e t t y ä ä n + y l i t e t t ä e s s ä + y l i t e t t ä i s i i n + y l i t e t ä ä n + y l i t i l i n p i t ä j ä l t ä m m e + y l i t i m m e + y l i t i n + y l i t i t t e + y l i t s e p u r s u a v i l l a + y l i t s e p ä ä s e m ä t t ö m i s t ä + y l i t s e p ä ä s e m ä t t ö m ä l t ä + y l i t s e p ä ä s e m ä t t ö m ä n + y l i t t i + y l i t t y y + y l i t t ä e s s ä m m e + y l i t t ä e s s ä ä n + y l i t t ä i s i + y l i t t ä m i s e e n + y l i t t ä m i s e s t ä + y l i t t ä m ä l l ä + y l i t t ä m ä s s ä + y l i t t ä m ä t t ä + y l i t t ä m ä ä n + y l i t t ä n y t + y l i t t ä v i e n + y l i t t ä v i i n + y l i t t ä v i l t ä + y l i t t ä v i s s ä + y l i t t ä v i s t ä + y l i t t ä v i ä + y l i t t ä v ä + y l i t t ä v ä l l e + y l i t t ä v ä l l ä + y l i t t ä v ä n + y l i t t ä v ä n ä + y l i t t ä v ä s s ä + y l i t t ä v ä s t ä + y l i t t ä v ä t + y l i t t ä v ä ä + y l i t t ä v ä ä n + y l i t t ä ä + y l i t t ä ä k ö + y l i t u n t e e l l i s e k s i + y l i t u o t a n n o l l a + y l i t u o t a n n o l l e + y l i t u o t a n n o n + y l i t u o t a n n o s t a + y l i t u o t a n t o + y l i t u o t a n t o a + y l i t u o t a n t o k r i i s i + y l i t u o t a n t o k r i i s i i n + y l i t u o t a n t o m a k s u a + y l i t u o t a n t o o n + y l i t u o t a n t o t i l a n t e e n + y l i t u o t a n t o t i l a n t e e s e e n + y l i t u o t a n t o v a i h e + y l i t y k s i s t ä + y l i t y s m a h d o l l i s u u d e t + y l i t y s m a r g i n a a l e j a + y l i t y s p a i k k a + y l i t y s p a i k o i l l a + y l i t y ö k i e l t o + y l i t y ö k o r v a u k s e n a + y l i t y ö k o r v a u k s i a + y l i t y ö k o r v a u k s i s t a + y l i t y ö l l i s y y s + y l i t y ö n + y l i t y ö s t ä + y l i t y ö t + y l i t y ö t u n n i n + y l i t y ö t u n t e i h i n + y l i t y ö t u n t e j a + y l i t ö i s t ä + y l i t ö i t ä + y l i v a l l a l t a + y l i v a l l a s s a + y l i v a l l a s t a + y l i v a l t a + y l i v a l t a a + y l i v a l t a a n s a + y l i v a l t a t e o r i a n + y l i v a l t i o l l i s i a + y l i v a l t i o t a + y l i v a r a a m i s k ä y t ä n t ö + y l i v a r a a m i s t a p a u k s i s s a + y l i v a r a u k s i a + y l i v a r a u k s i i n + y l i v a r a u k s i s t a + y l i v a r a u s k ä y t ä n n ö i s t ä + y l i v a r a u s k ä y t ä n n ö n + y l i v a r a u s k ä y t ä n t ö + y l i v a r a u s o n g e l m i a + y l i v a r a u s t a p a u k s i s s a + y l i v a r a u s t e n + y l i v a r o v a i n e n + y l i v a r o v a i s e l t a + y l i v a r o v a i s e s t i + y l i v a r o v a i s i s t a + y l i v a r o v a i s u u s + y l i v a r o v a i s u u t t a + y l i v e l k a a n t u m i n e n + y l i v e l k a a n t u m i s e e n + y l i v e l k a a n t u m i s e l l e + y l i v e l k a a n t u m i s e l t a + y l i v e l k a a n t u m i s e n + y l i v e l k a a n t u m i s e s t a + y l i v e l k a a n t u m i s t a + y l i v e l k a a n t u n e e t + y l i v e l k a a n t u n e i s u u d e n + y l i v e l k a a n t u n e i s u u s + y l i v e l k a a n t u n e i t a + y l i v i l k k a u s h ä i r i ö + y l i v i l k k a u s h ä i r i ö i h i n + y l i v o i m a a n + y l i v o i m a i s e l l a + y l i v o i m a i s e n + y l i v o i m a i s e s t a + y l i v o i m a i s e s t i + y l i v o i m a i s t a + y l i v u o t o k o h t i e n + y l i v ä s y m y s + y l i ä ä n i k o n e + y l i ä ä n i l e n t o k o n e i t a + y l i ä ä n i p a m a u s + y l i ä ä n i p o m m i k o n e i d e n + y l l y k k e e n ä + y l l y t e t ä ä n + y l l y t t i v ä t + y l l y t t ä k ä ä m m e + y l l y t t ä m i s e s t ä + y l l y t t ä m i s k ä s i t t e e s t ä + y l l y t t ä v i ä + y l l y t t ä v ä t + y l l y t t ä ä + y l l y t t ä ä k s e e n + y l l y t y s h u l l u t + y l l y t y s t a r k o i t u k s e s s a + y l l y t y s v a i h t o e h d o k s i + y l l ä m m e + y l l ä p i d e t t ä e s s ä + y l l ä p i d e t ä ä n + y l l ä p i d e t ä ä n k ö + y l l ä p i d ä m m e + y l l ä p i t i + y l l ä p i t o a p u r a h a s t a n s a + y l l ä p i t o h a n k k e e t + y l l ä p i t o k u l u i s t a + y l l ä p i t o k u s t a n n u k s e t + y l l ä p i t o k u s t a n n u k s i a + y l l ä p i t o k u s t a n n u k s i s s a a n + y l l ä p i t o k u s t a n n u k s i s t a + y l l ä p i t o k u s t a n n u s t e n + y l l ä p i t o m a k s u i s t a + y l l ä p i t o o n + y l l ä p i t o t o i m i l l a + y l l ä p i t o t o i m i n n a n + y l l ä p i t o v a i k e u d e t + y l l ä p i t ä i s i + y l l ä p i t ä m i n e n + y l l ä p i t ä m i s e e n + y l l ä p i t ä m i s e k s i + y l l ä p i t ä m i s e l l e + y l l ä p i t ä m i s e n + y l l ä p i t ä m i s t ä + y l l ä p i t ä m ä l l ä + y l l ä p i t ä m ä ä n + y l l ä p i t ä n y t + y l l ä p i t ä v i e n + y l l ä p i t ä v i i n + y l l ä p i t ä v i l l e + y l l ä p i t ä v ä t + y l l ä p i t ä ä + y l l ä p i t ä ä k s e e n + y l l ä p i t ä ä k s e m m e + y l l ä t e t t i i n + y l l ä t t i + y l l ä t t y k ö + y l l ä t t y n e e m p i + y l l ä t t y n e e n i + y l l ä t t y n e i d e n + y l l ä t t y n e i t ä + y l l ä t t y v ä t k i n + y l l ä t t y ä + y l l ä t t ä e n + y l l ä t t ä i s i t t e + y l l ä t t ä n y t + y l l ä t t ä v i i n + y l l ä t t ä v i m m i s t ä + y l l ä t t ä v i n + y l l ä t t ä v i n t ä + y l l ä t t ä v i s t ä + y l l ä t t ä v i ä + y l l ä t t ä v ä l t ä + y l l ä t t ä v ä m m i n + y l l ä t t ä v ä m p i + y l l ä t t ä v ä m p ä ä + y l l ä t t ä v ä n + y l l ä t t ä v ä ä + y l l ä t t ä v ä ä n + y l l ä t t ä ä + y l l ä t y i n + y l l ä t y k s e k s e m m e + y l l ä t y k s e k s e n i + y l l ä t y k s e k s i + y l l ä t y k s e l l i s t ä + y l l ä t y k s e n + y l l ä t y k s e n ä + y l l ä t y k s i i n + y l l ä t y k s i ä + y l l ä t y s h y ö k k ä y s + y l l ä t y s k ä y n t e j ä + y l l ä t y s r a t s i o i s s a + y l l ä t y s t a r k a s t u k s i a + y l l ä t y s t a r k a s t u k s i l l a + y l l ä t y s t u l o s + y l l ä t y s v a i k u t u k s e s t a + y l l ä t y s v o i t o i s t a + y l l ä ä n + y l p e i d e n + y l p e i l e e + y l p e i l l ä + y l p e i n ä + y l p e i t ä + y l p e i t ä k i n + y l p e y d e n a i h e + y l p e y d e n a i h e e n i + y l p e y t t ä + y l p e ä m p i ä + y l p e ä n ä + y l p e ä s t ä + y l t i ö e u r o o p p a l a i s e t + y l t i ö e u r o o p p a l a i s i l l a + y l t i ö f e d e r a l i s t i s e n + y l t i ö f e d e r a l i s t i s i a + y l t i ö k a p i t a l i s t i n e n + y l t i ö k o n s e r v a t i i v i s i a + y l t i ö l i b e r a a l i + y l t i ö l i b e r a a l i s t a + y l t i ö l i b e r a l i s m i a + y l t i ö l i b e r a l i s m i n + y l t i ö l i b e r a l i s t i e n + y l t i ö l i b e r a l i s t i n e n + y l t i ö l i b e r a l i s t i s t a + y l t i ö n a t i o n a l i s m i a + y l t i ö n a t i o n a l i s t i s t a + y l t i ö o p t i m i s m i i n + y l t i ö p ä i s y y k s i i n + y l t y m i s e e n + y l t y m ä s s ä + y l t y n e e t + y l t ä v ä n + y l t ä ä + y l v ä i n + y l ä a s t e e l l a + y l ä a s t e e l l e + y l ä a s t e e n + y l ä a s t e e s e e n + y l ä a s t e i l l a + y l ä h e n g i t y s t i e t + y l ä h u o n e + y l ä h u o n e e n + y l ä h u o n e e s e e n + y l ä h u o n e e s s a + y l ä h u u l e n + y l ä h y l l y n + y l ä i k ä r a j a + y l ä i k ä r a j a a + y l ä i l m a t i l a n + y l ä i l m o i s s a + y l ä j u o k s u l l a + y l ä j ä r v i + y l ä k a a r i k ä y t ä v ä n + y l ä k u l m i s s a + y l ä l u o k k a + y l ä m a a n k a r j a + y l ä m a a n p o n i + y l ä m a a t + y l ä m ä k e e n + y l ä n k ö a l u e e t + y l ä n k ö k a i s l a k e r t t u n e n + y l ä n k ö k i r v i n e n + y l ä n k ö k i u r u + y l ä n k ö k u r p p a + y l ä n k ö k u t o j a + y l ä n k ö t y l l i + y l ä n k ö u u n i l i n t u + y l ä o n t t o l a s k i m o + y l ä p a i n o t t e i s e k s i + y l ä r a a j a + y l ä r a j a + y l ä r a j a a + y l ä r a j a k s i + y l ä r a j a n + y l ä r a j a n a + y l ä r a j a s t a + y l ä r a j a s ä ä n n ö s t ä + y l ä r a j a t + y l ä r a j o i l l a + y l ä r a j o i s t a + y l ä r a j o j a + y l ä r a j o j e n + y l ä s ä v e l s a r j a + y l ä t a l j a + y l ä t a s a n g o n + y l ä t a s o i l l a + y l ä t a s o l l a + y l ä t a v o i t e + y l ä v i r t a a n + y m m ä l l e n i + y m m ä l l ä ä n + y m m ä r r e t t i i n + y m m ä r r e t t ä i s i i n + y m m ä r r e t t ä k ö ö n + y m m ä r r e t t ä v i i n + y m m ä r r e t t ä v i s s ä + y m m ä r r e t t ä v i ä + y m m ä r r e t t ä v y y t t ä + y m m ä r r e t t ä v ä k s i + y m m ä r r e t t ä v ä l l ä + y m m ä r r e t t ä v ä l t ä + y m m ä r r e t t ä v ä m m i k s i + y m m ä r r e t t ä v ä m m ä k s i + y m m ä r r e t t ä v ä m m ä n + y m m ä r r e t t ä v ä m m ä s t ä + y m m ä r r e t t ä v ä m p i + y m m ä r r e t t ä v ä m p i ä + y m m ä r r e t t ä v ä m p ä ä + y m m ä r r e t t ä v ä n + y m m ä r r e t t ä v ä s t ä + y m m ä r r e t t ä v ä t + y m m ä r r e t t ä v ä ä + y m m ä r r e t y m m ä k s i + y m m ä r r e t y s s ä + y m m ä r r e t ä ä n + y m m ä r r y k s e l t ä ä n + y m m ä r r y k s e n + y m m ä r r y k s e n i + y m m ä r r y k s e s t ä ä n + y m m ä r r y s k y k y + y m m ä r r y s t ä + y m m ä r r y s t ä m m e + y m m ä r r y s t ä ä n + y m m ä r r ä m m e + y m m ä r r ä m m e k i n + y m m ä r r ä m m e k ö + y m m ä r r ä n + y m m ä r r ä n k i n + y m m ä r r ä t t e + y m m ä r r ä t t e h ä n + y m m ä r s i + y m m ä r s i m m e k ö + y m m ä r s i n + y m m ä r s i n k ö + y m m ä r s i v ä t + y m m ä r s i v ä t k ö + y m m ä r s i v ä t k ö h ä n + y m m ä r t ä e s s ä n n e + y m m ä r t ä i s i + y m m ä r t ä i s i m m e + y m m ä r t ä i s i t t e + y m m ä r t ä i s i v ä t + y m m ä r t ä k ä ä + y m m ä r t ä k ö ö t + y m m ä r t ä m i s e k s i + y m m ä r t ä m i s e s t ä + y m m ä r t ä m i s t ä + y m m ä r t ä m i s v a i k e u k s i a + y m m ä r t ä m y k s e s t ä + y m m ä r t ä m y s t ä + y m m ä r t ä m ä s t ä + y m m ä r t ä m ä t t ä + y m m ä r t ä m ä t t ä m m e + y m m ä r t ä m ä t t ö m y y t t ä + y m m ä r t ä m ä ä n + y m m ä r t ä n e e + y m m ä r t ä n e e n + y m m ä r t ä n e e t + y m m ä r t ä n e t t e + y m m ä r t ä n e v ä t + y m m ä r t ä n y t + y m m ä r t ä v ä i s e m m i k s i + y m m ä r t ä v ä i s e m p i + y m m ä r t ä v ä i s e m p i ä + y m m ä r t ä v ä i s y y t t ä + y m m ä r t ä v ä n + y m m ä r t ä v ä t + y m m ä r t ä v ä t k ö + y m m ä r t ä ä + y m m ä r t ä ä k i n + y m m ä r t ä ä k s e e n + y m m ä r t ä ä k s e m m e + y m m ä r t ä ä k s e n i + y m m ä r t ä ä k ö + y m p y r ä d i a g r a m m i + y m p y r ä k a i v a n t o + y m p y r ä l a u s e + y m p y r ä l i i k e + y m p y r ä l i n j a + y m p y r ä ä + y m p ä r i a j o a + y m p ä r i a j o n + y m p ä r i a j o o n + y m p ä r i a j o s s a + y m p ä r i l e i k k a u s k ä y t ä n t ö + y m p ä r i l e i k k a u s t a + y m p ä r i p y ö r e ä t + y m p ä r i s t ö a h n e u d e l l a + y m p ä r i s t ö a i h e e s t a + y m p ä r i s t ö a i h e i d e n + y m p ä r i s t ö a i h e i s s a + y m p ä r i s t ö a i h e i t a + y m p ä r i s t ö a i h e t t a + y m p ä r i s t ö a j a t t e l u l l e + y m p ä r i s t ö a j a t t e l u u n + y m p ä r i s t ö a k t i v i s t i + y m p ä r i s t ö a k t i v i s t i a + y m p ä r i s t ö a k t i v i s t i e n + y m p ä r i s t ö a k t i v i s t i n a + y m p ä r i s t ö a k t i v i s t i t + y m p ä r i s t ö a l a + y m p ä r i s t ö a l a a + y m p ä r i s t ö a l a a n + y m p ä r i s t ö a l a l l a + y m p ä r i s t ö a l a l l e + y m p ä r i s t ö a l a n + y m p ä r i s t ö a l a s t a + y m p ä r i s t ö a l o i l l a + y m p ä r i s t ö a l o i t e + y m p ä r i s t ö a l o i t t e i d e n + y m p ä r i s t ö a l o i t t e i l l a + y m p ä r i s t ö a l o i t t e i t a + y m p ä r i s t ö a l u e i s i i n + y m p ä r i s t ö a l u e t t a + y m p ä r i s t ö a m b u l a n s s e j a + y m p ä r i s t ö a n a l y y s e j ä + y m p ä r i s t ö a n a l y y s i i n + y m p ä r i s t ö a p u u n + y m p ä r i s t ö a r v i o + y m p ä r i s t ö a r v i o i d e n + y m p ä r i s t ö a r v i o i n n i k s i + y m p ä r i s t ö a r v i o i n n i n + y m p ä r i s t ö a r v i o i n n i t + y m p ä r i s t ö a r v i o i n t e i h i n + y m p ä r i s t ö a r v i o i n t e j a + y m p ä r i s t ö a r v i o i n t i + y m p ä r i s t ö a r v i o i n t i a + y m p ä r i s t ö a r v i o i n t i d i r e k t i i v i ä + y m p ä r i s t ö a r v i o i n t i e n + y m p ä r i s t ö a r v i o i n t i i n + y m p ä r i s t ö a r v i o i t a + y m p ä r i s t ö a r v i o n + y m p ä r i s t ö a r v o + y m p ä r i s t ö a r v o a + y m p ä r i s t ö a r v o i s t a + y m p ä r i s t ö a r v o j a + y m p ä r i s t ö a r v o j e n + y m p ä r i s t ö a r v o n s a + y m p ä r i s t ö a r v o s t a + y m p ä r i s t ö a r v o t + y m p ä r i s t ö a s e t u k s e n + y m p ä r i s t ö a s e t u k s e s t a + y m p ä r i s t ö a s e t u s + y m p ä r i s t ö a s i a + y m p ä r i s t ö a s i a a n + y m p ä r i s t ö a s i a l l e + y m p ä r i s t ö a s i a n t u n t i j a + y m p ä r i s t ö a s i a n t u n t i j a t + y m p ä r i s t ö a s i a n t u n t i j o i d e n + y m p ä r i s t ö a s i a s s a + y m p ä r i s t ö a s i a t + y m p ä r i s t ö a s i o i d e n + y m p ä r i s t ö a s i o i d e n v a l i o k u n t a + y m p ä r i s t ö a s i o i h i n + y m p ä r i s t ö a s i o i l l e + y m p ä r i s t ö a s i o i s s a + y m p ä r i s t ö a s i o i s t a + y m p ä r i s t ö a s i o i t a + y m p ä r i s t ö a s i o i t a k i n + y m p ä r i s t ö a s p e k t i e n + y m p ä r i s t ö a u d i t o i n n i s t a + y m p ä r i s t ö a u d i t o i n n i t + y m p ä r i s t ö a u d i t o i n t e j a + y m p ä r i s t ö b o n u k s i a + y m p ä r i s t ö b u d j e t i n + y m p ä r i s t ö b u d j e t i s t a + y m p ä r i s t ö b u d j e t t i + y m p ä r i s t ö b y r o k r a t i o i t a + y m p ä r i s t ö d i p l o m a t i a s t a m m e + y m p ä r i s t ö d i r e k t i i v e i l l ä ä n + y m p ä r i s t ö d i r e k t i i v e j ä + y m p ä r i s t ö d i r e k t i i v i + y m p ä r i s t ö d i r e k t i i v i e n + y m p ä r i s t ö d i r e k t i i v i t + y m p ä r i s t ö d i r e k t i i v i ä + y m p ä r i s t ö d u m p p a u k s e e n + y m p ä r i s t ö d u m p p a u s + y m p ä r i s t ö e d e l l y t y k s i ä + y m p ä r i s t ö e d u i s t a + y m p ä r i s t ö e d u n + y m p ä r i s t ö e d u t + y m p ä r i s t ö e h d o i l l e + y m p ä r i s t ö e h d o i s t a + y m p ä r i s t ö e h d o l l i s u u t e e n + y m p ä r i s t ö e h d o t + y m p ä r i s t ö e h d o t u k s e e n + y m p ä r i s t ö e h d o t u k s i a + y m p ä r i s t ö e h t o j a + y m p ä r i s t ö e h t o j e n + y m p ä r i s t ö e k o l o g i a + y m p ä r i s t ö e t i i k a s t a + y m p ä r i s t ö e t i i k k a + y m p ä r i s t ö e t u a + y m p ä r i s t ö e t u j a + y m p ä r i s t ö e t u j e n + y m p ä r i s t ö e t u n s a + y m p ä r i s t ö f i l o s o f i a + y m p ä r i s t ö f o o r u m i + y m p ä r i s t ö h a a s t e + y m p ä r i s t ö h a a s t e e n + y m p ä r i s t ö h a a s t e e s e e n + y m p ä r i s t ö h a a s t e e t + y m p ä r i s t ö h a a s t e i d e n + y m p ä r i s t ö h a a s t e i s i i n + y m p ä r i s t ö h a a s t e i s t a + y m p ä r i s t ö h a a s t e i t a + y m p ä r i s t ö h a i t a k s i + y m p ä r i s t ö h a i t a l l i s i s t a + y m p ä r i s t ö h a i t a s t a + y m p ä r i s t ö h a i t a t + y m p ä r i s t ö h a i t o i s t a + y m p ä r i s t ö h a i t t a + y m p ä r i s t ö h a i t t a a + y m p ä r i s t ö h a i t t o i h i n + y m p ä r i s t ö h a i t t o i n a + y m p ä r i s t ö h a i t t o j a + y m p ä r i s t ö h a i t t o j a k a a n + y m p ä r i s t ö h a i t t o j e n + y m p ä r i s t ö h a l l i n n a n + y m p ä r i s t ö h a l l i n n o n + y m p ä r i s t ö h a l l i n t o + y m p ä r i s t ö h a l l i n t o a + y m p ä r i s t ö h a l l i n t o m e n e t e l m ä + y m p ä r i s t ö h a n k e + y m p ä r i s t ö h a n k e t t a + y m p ä r i s t ö h a n k k e e n + y m p ä r i s t ö h a n k k e e n a + y m p ä r i s t ö h a n k k e e t + y m p ä r i s t ö h a n k k e i d e n + y m p ä r i s t ö h a n k k e i l l e + y m p ä r i s t ö h a n k k e i s i i n + y m p ä r i s t ö h a n k k e i s t a + y m p ä r i s t ö h a n k k e i t a + y m p ä r i s t ö h e r k k y y s + y m p ä r i s t ö h i n n a n + y m p ä r i s t ö h i s t o r i a + y m p ä r i s t ö h u i p p u k o k o u k s e s s a + y m p ä r i s t ö h u i p p u k o k o u s t a + y m p ä r i s t ö h u o l e n a i h e e t + y m p ä r i s t ö h u o l i a + y m p ä r i s t ö h u o l i e n + y m p ä r i s t ö h u o l i i n + y m p ä r i s t ö h u o l i s t a + y m p ä r i s t ö h y ö d y k k e e t + y m p ä r i s t ö h y ö d y k k e i d e n + y m p ä r i s t ö h y ö d y t + y m p ä r i s t ö h y ö t y + y m p ä r i s t ö h y ö t y i h i n + y m p ä r i s t ö h y ö t y j e n + y m p ä r i s t ö h y ö t y j ä + y m p ä r i s t ö h y ö t y ä + y m p ä r i s t ö i m p e r i a l i s m i a + y m p ä r i s t ö i n d i k a a t t o r e i d e n + y m p ä r i s t ö i n d i k a a t t o r e i h i n + y m p ä r i s t ö i n d i k a a t t o r e i t a + y m p ä r i s t ö i n d i k a a t t o r i + y m p ä r i s t ö i n d i k a a t t o r i a + y m p ä r i s t ö i n d i k a a t t o r i e n + y m p ä r i s t ö i n d i k a a t t o r i s t a + y m p ä r i s t ö i n d i k a a t t o r i t + y m p ä r i s t ö i n f r a s t r u k t u u r i a + y m p ä r i s t ö i n f r a s t r u k t u u r i i n + y m p ä r i s t ö i n n o v a a t i o i l l a + y m p ä r i s t ö i n n o v a a t i o i s t a + y m p ä r i s t ö i n n o v o i n n i n + y m p ä r i s t ö i n n o v o i n t i a + y m p ä r i s t ö i n n o v o i n t i i n + y m p ä r i s t ö i n s t i t u u t t i + y m p ä r i s t ö i n t r e s s e j ä + y m p ä r i s t ö i n t r e s s i t + y m p ä r i s t ö i n v e s t o i n n e i s s a + y m p ä r i s t ö i n v e s t o i n n e i s t a + y m p ä r i s t ö i n v e s t o i n n i t + y m p ä r i s t ö i n v e s t o i n t e i h i n + y m p ä r i s t ö i n v e s t o i n t e j a + y m p ä r i s t ö i n v e s t o i n t i e n + y m p ä r i s t ö j a l a n j ä l j e n + y m p ä r i s t ö j a l a n j ä l k e m m e + y m p ä r i s t ö j a l a n j ä l k e ä m m e + y m p ä r i s t ö j a l a n j ä l k i + y m p ä r i s t ö j e n + y m p ä r i s t ö j o h t a m i n e n + y m p ä r i s t ö j o h t a m i s e e n + y m p ä r i s t ö j u l i s t u k s e s t a + y m p ä r i s t ö j ä r j e s t e l m i e n + y m p ä r i s t ö j ä r j e s t e l m i i n + y m p ä r i s t ö j ä r j e s t e l m ä + y m p ä r i s t ö j ä r j e s t e l m ä ä n + y m p ä r i s t ö j ä r j e s t ö + y m p ä r i s t ö j ä r j e s t ö i h i n + y m p ä r i s t ö j ä r j e s t ö i l l e + y m p ä r i s t ö j ä r j e s t ö i l l ä + y m p ä r i s t ö j ä r j e s t ö i l t ä + y m p ä r i s t ö j ä r j e s t ö i l t ä k i n + y m p ä r i s t ö j ä r j e s t ö i s s ä + y m p ä r i s t ö j ä r j e s t ö i s t ä + y m p ä r i s t ö j ä r j e s t ö j e n + y m p ä r i s t ö j ä r j e s t ö j ä + y m p ä r i s t ö j ä r j e s t ö k s i + y m p ä r i s t ö j ä r j e s t ö m m e + y m p ä r i s t ö j ä r j e s t ö n + y m p ä r i s t ö j ä r j e s t ö n ä + y m p ä r i s t ö j ä r j e s t ö s t ä + y m p ä r i s t ö j ä r j e s t ö t + y m p ä r i s t ö j ä r j e s t ö t k i n + y m p ä r i s t ö j ä r j e s t ö ä + y m p ä r i s t ö j ä r j e s t ö ö n + y m p ä r i s t ö j ä t e t t ä + y m p ä r i s t ö k a m p a n j o i l l a + y m p ä r i s t ö k a n n e t t a + y m p ä r i s t ö k a n n u s t i m i i n + y m p ä r i s t ö k a n s a l a i s u u t t a + y m p ä r i s t ö k a s v a t u k s e n + y m p ä r i s t ö k a s v a t u s + y m p ä r i s t ö k a t a s t r o f e i h i n + y m p ä r i s t ö k a t a s t r o f e i l t a + y m p ä r i s t ö k a t a s t r o f e i n a + y m p ä r i s t ö k a t a s t r o f e i s s a + y m p ä r i s t ö k a t a s t r o f e i s t a + y m p ä r i s t ö k a t a s t r o f e j a + y m p ä r i s t ö k a t a s t r o f i + y m p ä r i s t ö k a t a s t r o f i a + y m p ä r i s t ö k a t a s t r o f i e n + y m p ä r i s t ö k a t a s t r o f i i n + y m p ä r i s t ö k a t a s t r o f i k s i + y m p ä r i s t ö k a t a s t r o f i l t a + y m p ä r i s t ö k a t a s t r o f i n + y m p ä r i s t ö k a t a s t r o f i n a + y m p ä r i s t ö k a t a s t r o f i n n e + y m p ä r i s t ö k a t a s t r o f i r i s k i e n + y m p ä r i s t ö k a t a s t r o f i s s a + y m p ä r i s t ö k a t a s t r o f i s t a + y m p ä r i s t ö k a t a s t r o f i t + y m p ä r i s t ö k a t a s t r o f i t i l a n t e i s s a + y m p ä r i s t ö k a t s a s t u s v i r a s t o s t a + y m p ä r i s t ö k a t s a u k s e n + y m p ä r i s t ö k e h i t t ä m i s t ä + y m p ä r i s t ö k e h i t y k s e n + y m p ä r i s t ö k e h i t y s + y m p ä r i s t ö k e h i t y s t ä + y m p ä r i s t ö k e i n o i n + y m p ä r i s t ö k e m i a + y m p ä r i s t ö k e m i k a a l e i s t a + y m p ä r i s t ö k e r t o m u s + y m p ä r i s t ö k e s k u k s e e n + y m p ä r i s t ö k e s k u k s e l l e + y m p ä r i s t ö k e s k u k s e l t a + y m p ä r i s t ö k e s k u k s e n + y m p ä r i s t ö k e s k u k s e s s a + y m p ä r i s t ö k e s k u k s e s t a + y m p ä r i s t ö k e s k u s + y m p ä r i s t ö k e s k u s h a n + y m p ä r i s t ö k e s k u s t a + y m p ä r i s t ö k e s k u s t e l u a + y m p ä r i s t ö k e s k u s t e l u s s a + y m p ä r i s t ö k e s t ä v y y t t ä + y m p ä r i s t ö k i l p a i l u k y k y + y m p ä r i s t ö k o h t e i d e n + y m p ä r i s t ö k o k o u k s e s t a + y m p ä r i s t ö k o k o u k s i s s a + y m p ä r i s t ö k o m i s s a a r i + y m p ä r i s t ö k o m i s s a a r i n + y m p ä r i s t ö k o m i t e a + y m p ä r i s t ö k o m i t e o i s s a + y m p ä r i s t ö k o m p o n e n t t i + y m p ä r i s t ö k o n f e r e n s s e i s s a + y m p ä r i s t ö k o n f e r e n s s i a + y m p ä r i s t ö k o n f e r e n s s i n + y m p ä r i s t ö k o n f e r e n s s i s t a + y m p ä r i s t ö k o n f l i k t i n + y m p ä r i s t ö k o u l u t u k s e e n + y m p ä r i s t ö k o u l u t u k s e n + y m p ä r i s t ö k o u l u t u s t a + y m p ä r i s t ö k r i i s e i l t ä + y m p ä r i s t ö k r i i s e j ä + y m p ä r i s t ö k r i i s i + y m p ä r i s t ö k r i i s i i n + y m p ä r i s t ö k r i i s i n + y m p ä r i s t ö k r i i s i s s ä + y m p ä r i s t ö k r i i s i s t ä + y m p ä r i s t ö k r i i s i t + y m p ä r i s t ö k r i i s i ä + y m p ä r i s t ö k r i t e e r e i l l ä + y m p ä r i s t ö k r i t e e r e i t ä + y m p ä r i s t ö k r i t e e r i e n + y m p ä r i s t ö k r i t e e r i n + y m p ä r i s t ö k r i t e e r i t + y m p ä r i s t ö k s i + y m p ä r i s t ö k u k a l l a + y m p ä r i s t ö k u k a n + y m p ä r i s t ö k u l u t + y m p ä r i s t ö k u m p p a n u u d e n + y m p ä r i s t ö k u m p p a n u u s + y m p ä r i s t ö k u m p p a n u u t t a + y m p ä r i s t ö k u o r m i t u k s e n + y m p ä r i s t ö k u o r m i t u k s e t + y m p ä r i s t ö k u o r m i t u s + y m p ä r i s t ö k u o r m i t u s t a + y m p ä r i s t ö k u o r m i t u s t e n + y m p ä r i s t ö k u s t a n n u k s e n s a + y m p ä r i s t ö k u s t a n n u k s e t + y m p ä r i s t ö k u s t a n n u k s i a + y m p ä r i s t ö k u s t a n n u k s i i n + y m p ä r i s t ö k u s t a n n u k s i s t a + y m p ä r i s t ö k u s t a n n u k s i s t a a n + y m p ä r i s t ö k u s t a n n u s t e n + y m p ä r i s t ö k u v a u s t e n + y m p ä r i s t ö k y l i i n + y m p ä r i s t ö k y s y m y k s e e n + y m p ä r i s t ö k y s y m y k s e k s i + y m p ä r i s t ö k y s y m y k s e n + y m p ä r i s t ö k y s y m y k s e n ä + y m p ä r i s t ö k y s y m y k s e s s ä + y m p ä r i s t ö k y s y m y k s e s t ä + y m p ä r i s t ö k y s y m y k s e t + y m p ä r i s t ö k y s y m y k s i e n + y m p ä r i s t ö k y s y m y k s i i n + y m p ä r i s t ö k y s y m y k s i l l e + y m p ä r i s t ö k y s y m y k s i l l ä + y m p ä r i s t ö k y s y m y k s i s s ä + y m p ä r i s t ö k y s y m y k s i s t ä + y m p ä r i s t ö k y s y m y k s i ä + y m p ä r i s t ö k y s y m y k s i ä k ä ä n + y m p ä r i s t ö k y s y m y s + y m p ä r i s t ö k y s y m y s t e n + y m p ä r i s t ö k y s y m y s t ä + y m p ä r i s t ö k ä y t ä n n ö i s t ä + y m p ä r i s t ö k ä y t ä n n ö t + y m p ä r i s t ö k ä y t ä n t e i t ä + y m p ä r i s t ö k ä y t ä n t ö + y m p ä r i s t ö k ä y t ä n t ö i h i n + y m p ä r i s t ö k ä y t ä n t ö j e n + y m p ä r i s t ö l a a t u a + y m p ä r i s t ö l a a t u n o r m e i s s a + y m p ä r i s t ö l a a t u n o r m e j a + y m p ä r i s t ö l a e i s t a + y m p ä r i s t ö l a i n + y m p ä r i s t ö l a i n s ä ä d ä n n ö i s t ä + y m p ä r i s t ö l a i n s ä ä d ä n n ö l l e + y m p ä r i s t ö l a i n s ä ä d ä n n ö l l ä + y m p ä r i s t ö l a i n s ä ä d ä n n ö n + y m p ä r i s t ö l a i n s ä ä d ä n n ö s s ä + y m p ä r i s t ö l a i n s ä ä d ä n n ö s t ä + y m p ä r i s t ö l a i n s ä ä d ä n t ö + y m p ä r i s t ö l a i n s ä ä d ä n t ö j e n + y m p ä r i s t ö l a i n s ä ä d ä n t ö k e h y s t ä + y m p ä r i s t ö l a i n s ä ä d ä n t ö m m e + y m p ä r i s t ö l a i n s ä ä d ä n t ö n s ä + y m p ä r i s t ö l a i n s ä ä d ä n t ö t y ö s s ä + y m p ä r i s t ö l a i n s ä ä d ä n t ö ä + y m p ä r i s t ö l a i n s ä ä d ä n t ö ä m m e + y m p ä r i s t ö l a i n s ä ä d ä n t ö ä ä n + y m p ä r i s t ö l a i n s ä ä d ä n t ö ö n + y m p ä r i s t ö l a i n s ä ä n t ö ä + y m p ä r i s t ö l a i t + y m p ä r i s t ö l a k e j a + y m p ä r i s t ö l a k i + y m p ä r i s t ö l a k i a + y m p ä r i s t ö l a k i e n + y m p ä r i s t ö l a k i i n + y m p ä r i s t ö l a u s e k e + y m p ä r i s t ö l a u s e k e t t a + y m p ä r i s t ö l a u s e k k e e n + y m p ä r i s t ö l a u s e k k e e t + y m p ä r i s t ö l a u s e k k e i d e n + y m p ä r i s t ö l a u s e k k e i s i i n + y m p ä r i s t ö l a u s e k k e i t a + y m p ä r i s t ö l a u s u n n o n + y m p ä r i s t ö l a u t a k u n n a s s a + y m p ä r i s t ö l i i k e + y m p ä r i s t ö l i i k e t t ä + y m p ä r i s t ö l i i k k e e l l e + y m p ä r i s t ö l i i k k e e n + y m p ä r i s t ö l i i k k e e s e e n + y m p ä r i s t ö l i i k k e i d e n + y m p ä r i s t ö l i i k k e i l l ä + y m p ä r i s t ö l i i k k e i s t ä + y m p ä r i s t ö l i i t t o + y m p ä r i s t ö l i i t t o j a + y m p ä r i s t ö l l e + y m p ä r i s t ö l l e e n + y m p ä r i s t ö l u p a + y m p ä r i s t ö l u p a u k s i s t a + y m p ä r i s t ö l u v a t + y m p ä r i s t ö l u v u t + y m p ä r i s t ö l ä h e n t y m i s e n + y m p ä r i s t ö l ä h t ö i n e n + y m p ä r i s t ö l ä h t ö k o h d i s t a + y m p ä r i s t ö l ä ä k e t i e d e + y m p ä r i s t ö l ä ä k e t i e d e t t ä + y m p ä r i s t ö m a a h a n m u u t t a j i e n + y m p ä r i s t ö m a k s u + y m p ä r i s t ö m a k s u a + y m p ä r i s t ö m a k s u i h i n + y m p ä r i s t ö m a k s u i l l a + y m p ä r i s t ö m a k s u i l l e + y m p ä r i s t ö m a k s u i s t a + y m p ä r i s t ö m a k s u j a + y m p ä r i s t ö m a k s u j e n + y m p ä r i s t ö m a k s u t + y m p ä r i s t ö m a l l e j a + y m p ä r i s t ö m a l l i + y m p ä r i s t ö m a l l i a a n + y m p ä r i s t ö m a r k k i n o i d e n + y m p ä r i s t ö m a r k k i n o i l l a + y m p ä r i s t ö m a t k a i l u s t a + y m p ä r i s t ö m e l u + y m p ä r i s t ö m e l u a + y m p ä r i s t ö m e l u d i r e k t i i v i + y m p ä r i s t ö m e l u n + y m p ä r i s t ö m e l u s t a + y m p ä r i s t ö m e l u u n + y m p ä r i s t ö m e n e t t e l y i s t ä ä n + y m p ä r i s t ö m e n e t y s t e n + y m p ä r i s t ö m e r k i l l e + y m p ä r i s t ö m e r k i l l ä + y m p ä r i s t ö m e r k i n + y m p ä r i s t ö m e r k i n n ä l l e + y m p ä r i s t ö m e r k i n n ä n + y m p ä r i s t ö m e r k i n n ä s t ä + y m p ä r i s t ö m e r k i n n ä t + y m p ä r i s t ö m e r k i n n ö i s s ä + y m p ä r i s t ö m e r k i n t ä + y m p ä r i s t ö m e r k i n t ä d i r e k t i i v i s t ä + y m p ä r i s t ö m e r k i n t ä j ä r j e s t e l m i l l e + y m p ä r i s t ö m e r k i n t ä j ä r j e s t e l m ä + y m p ä r i s t ö m e r k i n t ä k r i t e e r i e n + y m p ä r i s t ö m e r k i n t ä p r o s e s s i a + y m p ä r i s t ö m e r k i n t ä ä + y m p ä r i s t ö m e r k i n t ö i h i n + y m p ä r i s t ö m e r k i n t ö j e n + y m p ä r i s t ö m e r k i n t ö j ä + y m p ä r i s t ö m e r k i s t ä + y m p ä r i s t ö m e r k i t + y m p ä r i s t ö m e r k i t t y j ä + y m p ä r i s t ö m e r k i t y s + y m p ä r i s t ö m e r k k e j ä + y m p ä r i s t ö m e r k k i + y m p ä r i s t ö m e r k k i a s e t u k s e n + y m p ä r i s t ö m e r k k i e n + y m p ä r i s t ö m e r k k i i n + y m p ä r i s t ö m e r k k i j ä r j e s t e l m i e n + y m p ä r i s t ö m e r k k i j ä r j e s t e l m i l l e + y m p ä r i s t ö m e r k k i j ä r j e s t e l m i ä + y m p ä r i s t ö m e r k k i j ä r j e s t e l m ä + y m p ä r i s t ö m e r k k i j ä r j e s t e l m ä n + y m p ä r i s t ö m e r k k i j ä r j e s t e l m ä s t ä + y m p ä r i s t ö m e r k k i j ä r j e s t e l m ä t + y m p ä r i s t ö m e r k k i j ä r j e s t e l m ä ä + y m p ä r i s t ö m e r k k i j ä r j e s t e l m ä ä n + y m p ä r i s t ö m e r k k i j ä r j e s t ö + y m p ä r i s t ö m e r k k i j ä r j e s t ö n + y m p ä r i s t ö m e r k k i k o m i t e a l l a + y m p ä r i s t ö m e r k k i k o m i t e a n + y m p ä r i s t ö m e r k k i k r i t e e r e j ä + y m p ä r i s t ö m e r k k i o h j e l m i l l e + y m p ä r i s t ö m e r k k i p o l i t i i k a n + y m p ä r i s t ö m e r k k i ä + y m p ä r i s t ö m i n i s t e r e i d e m m e + y m p ä r i s t ö m i n i s t e r e i d e n + y m p ä r i s t ö m i n i s t e r e i h i n + y m p ä r i s t ö m i n i s t e r e i l l e + y m p ä r i s t ö m i n i s t e r e i n e e n + y m p ä r i s t ö m i n i s t e r e i s t ä + y m p ä r i s t ö m i n i s t e r e i t ä + y m p ä r i s t ö m i n i s t e r i + y m p ä r i s t ö m i n i s t e r i e n + y m p ä r i s t ö m i n i s t e r i k o k o u k s e s s a + y m p ä r i s t ö m i n i s t e r i l l e + y m p ä r i s t ö m i n i s t e r i m m e + y m p ä r i s t ö m i n i s t e r i n + y m p ä r i s t ö m i n i s t e r i n e u v o s t o + y m p ä r i s t ö m i n i s t e r i n e u v o s t o l l e + y m p ä r i s t ö m i n i s t e r i n e u v o s t o s s a + y m p ä r i s t ö m i n i s t e r i n n e + y m p ä r i s t ö m i n i s t e r i n ä + y m p ä r i s t ö m i n i s t e r i s t ä + y m p ä r i s t ö m i n i s t e r i t + y m p ä r i s t ö m i n i s t e r i ä + y m p ä r i s t ö m i n i s t e r i ö + y m p ä r i s t ö m i n i s t e r i ö l t ä + y m p ä r i s t ö m i n i s t e r i ö n + y m p ä r i s t ö m i n i s t e r i ö s s ä + y m p ä r i s t ö m i t t a r e i t a + y m p ä r i s t ö m m e + y m p ä r i s t ö m u l l i s t u s t e n + y m p ä r i s t ö m u u t o k s e e n + y m p ä r i s t ö m u u t o k s e n + y m p ä r i s t ö m u u t o k s e s s a + y m p ä r i s t ö m u u t o k s i a + y m p ä r i s t ö m u u t t u j a + y m p ä r i s t ö m u u t t u j i a + y m p ä r i s t ö m y r k k y + y m p ä r i s t ö m y r k k y j ä + y m p ä r i s t ö m y r k y i l l e + y m p ä r i s t ö m y r k y i s t ä + y m p ä r i s t ö m ä ä r ä r a h o i s t a + y m p ä r i s t ö m ä ä r ä y k s e t + y m p ä r i s t ö m ä ä r ä y k s i s t ä + y m p ä r i s t ö m ä ä r ä y k s i ä + y m p ä r i s t ö m ä ä r ä y s t e n + y m p ä r i s t ö n + y m p ä r i s t ö n e u v o s t o + y m p ä r i s t ö n e u v o s t o l l a + y m p ä r i s t ö n e u v o s t o l l e + y m p ä r i s t ö n e u v o s t o n + y m p ä r i s t ö n e u v o s t o s s a + y m p ä r i s t ö n e u v o s t o s s a k i n + y m p ä r i s t ö n e u v o t t e l u i s s a + y m p ä r i s t ö n h a l l i n t a a + y m p ä r i s t ö n h a l l i n t a o h j e l m i a + y m p ä r i s t ö n h a l l i n t a s u u n n i t e l m a t + y m p ä r i s t ö n h o i t a j i n a + y m p ä r i s t ö n h o i t o m i e l e s s ä + y m p ä r i s t ö n h o i t o o n + y m p ä r i s t ö n h o i t o s u u n n i t e l m a t + y m p ä r i s t ö n k u l u t t a j a s u o j a n + y m p ä r i s t ö n l a a t u a + y m p ä r i s t ö n l a a t u n o r m e i h i n + y m p ä r i s t ö n l a a t u n o r m e i s t a + y m p ä r i s t ö n l a a t u n o r m e j a + y m p ä r i s t ö n l a a t u n o r m i e n + y m p ä r i s t ö n l a a t u n o r m i t + y m p ä r i s t ö n l a a t u u n + y m p ä r i s t ö n m u u t o k s e e n + y m p ä r i s t ö n m u u t o k s e n + y m p ä r i s t ö n n o r m i t + y m p ä r i s t ö n o h j a u s v ä l i n e i t ä + y m p ä r i s t ö n o r m e i h i n + y m p ä r i s t ö n o r m e i s t a + y m p ä r i s t ö n o r m e j a + y m p ä r i s t ö n o r m e j a a n + y m p ä r i s t ö n o r m e j a k a a n + y m p ä r i s t ö n o r m e j a m m e + y m p ä r i s t ö n o r m i e n + y m p ä r i s t ö n o r m i n s a + y m p ä r i s t ö n o r m i t + y m p ä r i s t ö n r a h o i t u s v ä l i n e + y m p ä r i s t ö n s a a s t e e t + y m p ä r i s t ö n s a a s t e i d e n + y m p ä r i s t ö n s a a s t u m i s e n + y m p ä r i s t ö n s e u r a n t a + y m p ä r i s t ö n s u o j e l i j a n a + y m p ä r i s t ö n s u o j e l i j a t + y m p ä r i s t ö n s u o j e l i j o i n a + y m p ä r i s t ö n s u o j e l i j o i t a + y m p ä r i s t ö n s u o j e l u + y m p ä r i s t ö n s u o j e l u a + y m p ä r i s t ö n s u o j e l u a l a + y m p ä r i s t ö n s u o j e l u a l a n + y m p ä r i s t ö n s u o j e l u a l o i t t e i t a + y m p ä r i s t ö n s u o j e l u a s i o i s s a + y m p ä r i s t ö n s u o j e l u d i r e k t i i v i e n + y m p ä r i s t ö n s u o j e l u d i r e k t i i v i ä + y m p ä r i s t ö n s u o j e l u e h d o t u k s i a + y m p ä r i s t ö n s u o j e l u e l i m e n + y m p ä r i s t ö n s u o j e l u h a n k k e e t + y m p ä r i s t ö n s u o j e l u h a n k k e i d e n + y m p ä r i s t ö n s u o j e l u h a n k k e i s i i n + y m p ä r i s t ö n s u o j e l u i n v e s t o i n t e j a + y m p ä r i s t ö n s u o j e l u i n v e s t o i n t i e n + y m p ä r i s t ö n s u o j e l u j ä r j e s t e l m ä + y m p ä r i s t ö n s u o j e l u j ä r j e s t e l m ä s t ä + y m p ä r i s t ö n s u o j e l u j ä r j e s t e l m ä t + y m p ä r i s t ö n s u o j e l u j ä r j e s t ö + y m p ä r i s t ö n s u o j e l u j ä r j e s t ö j e n + y m p ä r i s t ö n s u o j e l u j ä r j e s t ö t + y m p ä r i s t ö n s u o j e l u k a n n u s t i m i i n + y m p ä r i s t ö n s u o j e l u k o m i t e a + y m p ä r i s t ö n s u o j e l u k u s t a n n u k s i s t a + y m p ä r i s t ö n s u o j e l u k y s y m y k s e t + y m p ä r i s t ö n s u o j e l u k y s y m y k s i ä + y m p ä r i s t ö n s u o j e l u l a i n s ä ä d ä n n ö n + y m p ä r i s t ö n s u o j e l u l l a + y m p ä r i s t ö n s u o j e l u l l e + y m p ä r i s t ö n s u o j e l u l o m i a + y m p ä r i s t ö n s u o j e l u m e n o i s t a + y m p ä r i s t ö n s u o j e l u m m e + y m p ä r i s t ö n s u o j e l u m ä ä r ä y k s e t + y m p ä r i s t ö n s u o j e l u m ä ä r ä y k s i ä + y m p ä r i s t ö n s u o j e l u m ä ä r ä y s t e n + y m p ä r i s t ö n s u o j e l u n + y m p ä r i s t ö n s u o j e l u n o r m e i h i n + y m p ä r i s t ö n s u o j e l u n o r m e j a + y m p ä r i s t ö n s u o j e l u n o r m i e n + y m p ä r i s t ö n s u o j e l u n o r m i t + y m p ä r i s t ö n s u o j e l u n ä k ö k o h t i e n + y m p ä r i s t ö n s u o j e l u o h j e l m a + y m p ä r i s t ö n s u o j e l u o h j e l m a s t a + y m p ä r i s t ö n s u o j e l u o h j e l m i a + y m p ä r i s t ö n s u o j e l u o h j e l m i i n + y m p ä r i s t ö n s u o j e l u o n g e l m a s t a + y m p ä r i s t ö n s u o j e l u o s a s t o a + y m p ä r i s t ö n s u o j e l u p a k e t t i i n + y m p ä r i s t ö n s u o j e l u p a l v e l u i d e n + y m p ä r i s t ö n s u o j e l u p e r i a a t t e i d e n + y m p ä r i s t ö n s u o j e l u p o l i t i i k a l l e + y m p ä r i s t ö n s u o j e l u p o l i t i i k a n + y m p ä r i s t ö n s u o j e l u p o l i t i i k k a + y m p ä r i s t ö n s u o j e l u p o l i t i i k k a a + y m p ä r i s t ö n s u o j e l u p o n n i s t e l u j a + y m p ä r i s t ö n s u o j e l u r y h m i e n + y m p ä r i s t ö n s u o j e l u r y h m i ä + y m p ä r i s t ö n s u o j e l u s s a + y m p ä r i s t ö n s u o j e l u s s a k i n + y m p ä r i s t ö n s u o j e l u s t a + y m p ä r i s t ö n s u o j e l u s t a n d a r d e i s t a + y m p ä r i s t ö n s u o j e l u s t a n d a r d e j a + y m p ä r i s t ö n s u o j e l u s t r a t e g i a a n + y m p ä r i s t ö n s u o j e l u s t r a t e g i a l l a + y m p ä r i s t ö n s u o j e l u s t r a t e g i a n + y m p ä r i s t ö n s u o j e l u s y i s t ä + y m p ä r i s t ö n s u o j e l u s ä ä d ö s t e n + y m p ä r i s t ö n s u o j e l u s ä ä n n ö k s i ä + y m p ä r i s t ö n s u o j e l u s ä ä n n ö s t e n + y m p ä r i s t ö n s u o j e l u s ä ä n n ö t + y m p ä r i s t ö n s u o j e l u s ä ä n t ö j ä + y m p ä r i s t ö n s u o j e l u t a r k o i t u k s e s s a + y m p ä r i s t ö n s u o j e l u t a r k o i t u k s i i n + y m p ä r i s t ö n s u o j e l u t a v o i t t e e t + y m p ä r i s t ö n s u o j e l u t a v o i t t e i d e n + y m p ä r i s t ö n s u o j e l u t e h t ä v ä n + y m p ä r i s t ö n s u o j e l u t e k n i s e l l e + y m p ä r i s t ö n s u o j e l u t o i m e n p i d e + y m p ä r i s t ö n s u o j e l u t o i m e n p i t e i s i i n + y m p ä r i s t ö n s u o j e l u t o i m e n p i t e i t ä + y m p ä r i s t ö n s u o j e l u t o i m e t + y m p ä r i s t ö n s u o j e l u t o i m i a + y m p ä r i s t ö n s u o j e l u t o i m i e n + y m p ä r i s t ö n s u o j e l u t o i m i i n + y m p ä r i s t ö n s u o j e l u t o i m i l l a + y m p ä r i s t ö n s u o j e l u t o i m i s t a + y m p ä r i s t ö n s u o j e l u t u k e e n + y m p ä r i s t ö n s u o j e l u t u k i a + y m p ä r i s t ö n s u o j e l u u n + y m p ä r i s t ö n s u o j e l u v a a t i m u k s e t + y m p ä r i s t ö n s u o j e l u v a a t i m u k s i a + y m p ä r i s t ö n s u o j e l u v a a t i m u k s i i n + y m p ä r i s t ö n s u o j e l u v a a t i m u k s i l l a + y m p ä r i s t ö n s u o j e l u v a a t i m u k s i s t a + y m p ä r i s t ö n s u o j e l u v a a t i m u s t e n + y m p ä r i s t ö n s u o j e l u v a l i o k u n n a n + y m p ä r i s t ö n s u o j e l u v i r a s t o + y m p ä r i s t ö n s u o j e l u v i r a s t o j e n + y m p ä r i s t ö n s u o j e l u v i r a s t o n + y m p ä r i s t ö n s u o j e l u v i r a s t o s t a m m e + y m p ä r i s t ö n s u o j e l u v ä l i n e e t + y m p ä r i s t ö n s u o j e l u v ä l i n e i t ä + y m p ä r i s t ö n s u o j e l u y h d i s t y k s i l l e + y m p ä r i s t ö n s u o j e l u y h d i s t y k s i ä + y m p ä r i s t ö n s u u n n i t t e l u a + y m p ä r i s t ö n s ä + y m p ä r i s t ö n v a i k u t u s a r v i o i n n i n + y m p ä r i s t ö n v a i k u t u s a r v i o i n t e j a + y m p ä r i s t ö n v a i k u t u s t u t k i m u k s e n + y m p ä r i s t ö n ä + y m p ä r i s t ö n ä k e m y k s e t + y m p ä r i s t ö n ä k e m y s t e n i + y m p ä r i s t ö n ä k ö k o h d a n + y m p ä r i s t ö n ä k ö k o h d a t + y m p ä r i s t ö n ä k ö k o h d i l l e + y m p ä r i s t ö n ä k ö k o h d i s t a + y m p ä r i s t ö n ä k ö k o h t a + y m p ä r i s t ö n ä k ö k o h t i a + y m p ä r i s t ö n ä k ö k o h t i e n + y m p ä r i s t ö n ä k ö k o h t i i n + y m p ä r i s t ö n ä k ö k u l m a + y m p ä r i s t ö n ä k ö k u l m a a + y m p ä r i s t ö n ä k ö k u l m a a n + y m p ä r i s t ö n ä k ö k u l m a n + y m p ä r i s t ö n ä k ö k u l m a s t a + y m p ä r i s t ö n ä k ö k u l m a t + y m p ä r i s t ö n ä k ö k u l m a t a r k i s t u k s i a + y m p ä r i s t ö n ä k ö k u l m i a + y m p ä r i s t ö n ä k ö k u l m i e n + y m p ä r i s t ö n ä k ö k u l m i i n + y m p ä r i s t ö o h j e l m a + y m p ä r i s t ö o h j e l m a a + y m p ä r i s t ö o h j e l m a a n + y m p ä r i s t ö o h j e l m a l l a + y m p ä r i s t ö o h j e l m a n + y m p ä r i s t ö o h j e l m a n a + y m p ä r i s t ö o h j e l m a s s a + y m p ä r i s t ö o h j e l m a s t a + y m p ä r i s t ö o h j e l m a t + y m p ä r i s t ö o h j e l m i a + y m p ä r i s t ö o h j e l m i a n n e + y m p ä r i s t ö o h j e l m i e n + y m p ä r i s t ö o h j e l m i i n + y m p ä r i s t ö o h j e l m i l l a + y m p ä r i s t ö o h j e l m i s s a + y m p ä r i s t ö o h j e l m i s t a + y m p ä r i s t ö o i k e u d e n + y m p ä r i s t ö o i k e u k s i a + y m p ä r i s t ö o i k e u k s i e n + y m p ä r i s t ö o i k e u k s i l l a + y m p ä r i s t ö o i k e u k s i s t a + y m p ä r i s t ö o i k e u s + y m p ä r i s t ö o i k e u t e e n + y m p ä r i s t ö o i k e u t t a + y m p ä r i s t ö o l o i h i n + y m p ä r i s t ö o l o i l l e + y m p ä r i s t ö o l o i l t a a n + y m p ä r i s t ö o l o i s s a + y m p ä r i s t ö o l o i s t a + y m p ä r i s t ö o l o j a + y m p ä r i s t ö o l o j e n + y m p ä r i s t ö o l o s u h t e e t + y m p ä r i s t ö o l o s u h t e i l l e + y m p ä r i s t ö o l o s u h t e i s i i n + y m p ä r i s t ö o l o s u h t e i t a + y m p ä r i s t ö o l o t + y m p ä r i s t ö o m a t u n t o + y m p ä r i s t ö o m i n a i s u u d e t + y m p ä r i s t ö o m i n a i s u u k s i a + y m p ä r i s t ö o m i n a i s u u k s i e n + y m p ä r i s t ö o m i n a i s u u k s i i n + y m p ä r i s t ö o n g e l m a + y m p ä r i s t ö o n g e l m a a + y m p ä r i s t ö o n g e l m a l l e + y m p ä r i s t ö o n g e l m a m m e + y m p ä r i s t ö o n g e l m a n + y m p ä r i s t ö o n g e l m a n a + y m p ä r i s t ö o n g e l m a n s a + y m p ä r i s t ö o n g e l m a s s a + y m p ä r i s t ö o n g e l m a s t a + y m p ä r i s t ö o n g e l m a t + y m p ä r i s t ö o n g e l m i a + y m p ä r i s t ö o n g e l m i e n + y m p ä r i s t ö o n g e l m i i n + y m p ä r i s t ö o n g e l m i l l e + y m p ä r i s t ö o n g e l m i n e e n + y m p ä r i s t ö o n g e l m i s s a + y m p ä r i s t ö o n g e l m i s t a + y m p ä r i s t ö o n g e l m i s t a a n + y m p ä r i s t ö o n g e l m i s t a m m e + y m p ä r i s t ö o n n e t t o m u u d e n + y m p ä r i s t ö o n n e t t o m u u d e t + y m p ä r i s t ö o n n e t t o m u u k s i e n + y m p ä r i s t ö o n n e t t o m u u s + y m p ä r i s t ö o r g a n i s a a t i o n + y m p ä r i s t ö o s a a + y m p ä r i s t ö o s a a m i s e l l a + y m p ä r i s t ö o s a a m i s e n + y m p ä r i s t ö o s a a m i s t a + y m p ä r i s t ö o s a a m i s t a a n + y m p ä r i s t ö o s a n + y m p ä r i s t ö o s a s t o n + y m p ä r i s t ö p a i n a j a i n e n + y m p ä r i s t ö p a i n e e t + y m p ä r i s t ö p a i n e i t a + y m p ä r i s t ö p a i n o t u s t a + y m p ä r i s t ö p a k e t i n + y m p ä r i s t ö p a k e t t i a + y m p ä r i s t ö p a k o l a i s e t + y m p ä r i s t ö p a k o l a i s i a + y m p ä r i s t ö p a k o l a i s t a + y m p ä r i s t ö p a k o l a i s t e n + y m p ä r i s t ö p a k o t t e i d e n + y m p ä r i s t ö p a l v e l u i s t a + y m p ä r i s t ö p a l v e l u i s t a a n + y m p ä r i s t ö p a l v e l u j a + y m p ä r i s t ö p a l v e l u j e n + y m p ä r i s t ö p a l v e l u t + y m p ä r i s t ö p a r a n n u k s e t + y m p ä r i s t ö p a r a n n u k s i a + y m p ä r i s t ö p a r a n n u k s i i n + y m p ä r i s t ö p a r a n n u s t e n + y m p ä r i s t ö p e r f o r m a n s s i t i e t o o n + y m p ä r i s t ö p e r i a a t e + y m p ä r i s t ö p e r i a a t t e e s e e n + y m p ä r i s t ö p e r i a a t t e i d e n + y m p ä r i s t ö p e r i n n ö n + y m p ä r i s t ö p e r i n t e e n + y m p ä r i s t ö p e r i n t ö a l u e i t a + y m p ä r i s t ö p e r i n t ö m m e + y m p ä r i s t ö p e r i n t ö ä m m e + y m p ä r i s t ö p e r u s t a + y m p ä r i s t ö p e r u s t e + y m p ä r i s t ö p e r u s t e e t + y m p ä r i s t ö p e r u s t e i d e n + y m p ä r i s t ö p e r u s t e i l l a + y m p ä r i s t ö p e r u s t e i n e n + y m p ä r i s t ö p e r u s t e i s i i n + y m p ä r i s t ö p e r u s t e i s i l l a + y m p ä r i s t ö p e r u s t e i s t a + y m p ä r i s t ö p e r u s t e i s t a k i n + y m p ä r i s t ö p e r u s t e i t a + y m p ä r i s t ö p e r ä i n e n + y m p ä r i s t ö p i l a r i + y m p ä r i s t ö p i l a r i a + y m p ä r i s t ö p i l a r i n a + y m p ä r i s t ö p o l i i t i k o t + y m p ä r i s t ö p o l i i t t i n e n + y m p ä r i s t ö p o l i i t t i s e n + y m p ä r i s t ö p o l i i t t i s e s s a + y m p ä r i s t ö p o l i i t t i s e s t i + y m p ä r i s t ö p o l i i t t i s e t + y m p ä r i s t ö p o l i i t t i s i a + y m p ä r i s t ö p o l i i t t i s i l l a + y m p ä r i s t ö p o l i i t t i s i s s a + y m p ä r i s t ö p o l i i t t i s i s t a + y m p ä r i s t ö p o l i i t t i s t a + y m p ä r i s t ö p o l i i t t i s t e n + y m p ä r i s t ö p o l i t i i k a k s i + y m p ä r i s t ö p o l i t i i k a l l a + y m p ä r i s t ö p o l i t i i k a l l e + y m p ä r i s t ö p o l i t i i k a l t a m m e + y m p ä r i s t ö p o l i t i i k a n + y m p ä r i s t ö p o l i t i i k a n k a a n + y m p ä r i s t ö p o l i t i i k a s s a + y m p ä r i s t ö p o l i t i i k a s s a a n + y m p ä r i s t ö p o l i t i i k a s s a m m e + y m p ä r i s t ö p o l i t i i k a s t a + y m p ä r i s t ö p o l i t i i k a t + y m p ä r i s t ö p o l i t i i k k a + y m p ä r i s t ö p o l i t i i k k a a + y m p ä r i s t ö p o l i t i i k k a a m m e + y m p ä r i s t ö p o l i t i i k k a a n + y m p ä r i s t ö p o l i t i i k k a a n s a + y m p ä r i s t ö p o l i t i i k k a m m e + y m p ä r i s t ö p o l i t i i k k a n s a + y m p ä r i s t ö p o l i t i i k k o i h i n + y m p ä r i s t ö p o l i t i i k k o j a + y m p ä r i s t ö p o l i t i i k k o j e n + y m p ä r i s t ö p o l i t i i k o i l l a + y m p ä r i s t ö p o l i t i i k o i s t a + y m p ä r i s t ö p o m m i n + y m p ä r i s t ö p o p u l i s m i a + y m p ä r i s t ö p r o f i i l i s s a + y m p ä r i s t ö p r o j e k t e i h i n + y m p ä r i s t ö p r o j e k t i + y m p ä r i s t ö p r o j e k t i e n + y m p ä r i s t ö p r o j e k t i n + y m p ä r i s t ö p r o p a g a n d a a + y m p ä r i s t ö p r o p a g a n d a l l a + y m p ä r i s t ö p r o s e s s i i n + y m p ä r i s t ö p r o t e k t i o n i s m i n + y m p ä r i s t ö p s y k o l o g i a + y m p ä r i s t ö p u o l u e + y m p ä r i s t ö p u o l u e e t + y m p ä r i s t ö p u u t t e i d e n + y m p ä r i s t ö p ä i v ä + y m p ä r i s t ö p ä i v ä n ä + y m p ä r i s t ö p ä ä m ä ä r i e n + y m p ä r i s t ö p ä ä m ä ä r i ä + y m p ä r i s t ö p ä ä s t ö i l l e + y m p ä r i s t ö p ä ä s t ö j e n + y m p ä r i s t ö p ä ä s t ö j ä + y m p ä r i s t ö p ä ä t e l m ä t + y m p ä r i s t ö p ä ä t ö k s i ä + y m p ä r i s t ö p ä ä t ö s + y m p ä r i s t ö p ä ä t ö s t e n + y m p ä r i s t ö p ö y t ä k i r j a n + y m p ä r i s t ö r a h a s t o a + y m p ä r i s t ö r a h a s t o j a + y m p ä r i s t ö r a h a s t o l l e + y m p ä r i s t ö r a h a s t o n + y m p ä r i s t ö r a h a s t o o n + y m p ä r i s t ö r a h a s t o s t a + y m p ä r i s t ö r a j o i t t e e t + y m p ä r i s t ö r a j o i t u k s e t + y m p ä r i s t ö r a j o i t u k s i a + y m p ä r i s t ö r a j o i t u k s i l l a + y m p ä r i s t ö r a j o i t u s t e n + y m p ä r i s t ö r a k e n n e t t a + y m p ä r i s t ö r a p o r t o i n n i s t a + y m p ä r i s t ö r a p o r t t e j a + y m p ä r i s t ö r a s i t t e e n + y m p ä r i s t ö r a s i t t e i t a + y m p ä r i s t ö r a s i t u k s e n + y m p ä r i s t ö r a t k a i s u l l a + y m p ä r i s t ö r e s u r s s i e n + y m p ä r i s t ö r i k k e e n + y m p ä r i s t ö r i k k o m u k s e t + y m p ä r i s t ö r i k k o m u k s i s t a + y m p ä r i s t ö r i k k o m u s t e n + y m p ä r i s t ö r i k o k s e e n + y m p ä r i s t ö r i k o k s e n + y m p ä r i s t ö r i k o k s e s t a + y m p ä r i s t ö r i k o k s e t + y m p ä r i s t ö r i k o k s i a + y m p ä r i s t ö r i k o k s i i n + y m p ä r i s t ö r i k o k s i l l a + y m p ä r i s t ö r i k o k s i s s a + y m p ä r i s t ö r i k o k s i s t a + y m p ä r i s t ö r i k o l l i s e t + y m p ä r i s t ö r i k o l l i s i a + y m p ä r i s t ö r i k o l l i s i l l e + y m p ä r i s t ö r i k o l l i s i s t a + y m p ä r i s t ö r i k o l l i s t e n + y m p ä r i s t ö r i k o l l i s u u d e l t a + y m p ä r i s t ö r i k o l l i s u u d e n + y m p ä r i s t ö r i k o l l i s u u d e s t a + y m p ä r i s t ö r i k o l l i s u u s + y m p ä r i s t ö r i k o l l i s u u t e e n + y m p ä r i s t ö r i k o l l i s u u t t a + y m p ä r i s t ö r i k o s + y m p ä r i s t ö r i k o s a l o i t e + y m p ä r i s t ö r i k o s d i r e k t i i v i l l ä + y m p ä r i s t ö r i k o s l a i n s ä ä d ä n t ö ä + y m p ä r i s t ö r i k o s t e n + y m p ä r i s t ö r i k o s t u o m i o i s t u i n + y m p ä r i s t ö r i k o s y k s i k ö n + y m p ä r i s t ö r i n t a m a l l a + y m p ä r i s t ö r i s k e i h i n + y m p ä r i s t ö r i s k e i l l e + y m p ä r i s t ö r i s k e i s t ä + y m p ä r i s t ö r i s k e j ä + y m p ä r i s t ö r i s k i + y m p ä r i s t ö r i s k i e n + y m p ä r i s t ö r i s k i n + y m p ä r i s t ö r i s k i t + y m p ä r i s t ö r i s k i t a r k a s t u s + y m p ä r i s t ö r i s k i ä + y m p ä r i s t ö r o m a n t i i k a s t a + y m p ä r i s t ö r o o l i a + y m p ä r i s t ö r y h m i e n + y m p ä r i s t ö r y h m ä n + y m p ä r i s t ö r y h m ä t + y m p ä r i s t ö s a a s t e + y m p ä r i s t ö s a a s t e e n + y m p ä r i s t ö s a a s t e e t + y m p ä r i s t ö s a a s t e e t k i n + y m p ä r i s t ö s a a s t e i d e n + y m p ä r i s t ö s a a s t e i l l e + y m p ä r i s t ö s a a s t e i n a + y m p ä r i s t ö s a a s t e i s i i n + y m p ä r i s t ö s a a s t e i s t a + y m p ä r i s t ö s a a s t e i t a + y m p ä r i s t ö s a a v u t u k s e t + y m p ä r i s t ö s a i r a u d e t + y m p ä r i s t ö s a k o i s s a k i n + y m p ä r i s t ö s a l k k u + y m p ä r i s t ö s a n a h e l i n ä + y m p ä r i s t ö s a r a l l a + y m p ä r i s t ö s e i k a t + y m p ä r i s t ö s e i k k o i h i n + y m p ä r i s t ö s e i k k o j a + y m p ä r i s t ö s e i k k o j e n + y m p ä r i s t ö s e i k o i l l e + y m p ä r i s t ö s e i k o i s t a + y m p ä r i s t ö s e k t o r i + y m p ä r i s t ö s e k t o r i l l a + y m p ä r i s t ö s e k t o r i n + y m p ä r i s t ö s e l o n t e k o + y m p ä r i s t ö s e l o n t e o n + y m p ä r i s t ö s e l v i t y k s e t + y m p ä r i s t ö s e l v i t y s t e n + y m p ä r i s t ö s e l v i t y s t ä + y m p ä r i s t ö s e r t i f i o i n t i + y m p ä r i s t ö s e r t i f i o i n t i i n + y m p ä r i s t ö s e r t i f i o i n t i j ä r j e s t e l m i e n + y m p ä r i s t ö s e r t i f i o i n t i o h j e l m i e n + y m p ä r i s t ö s e u r a a m u s k u v a u k s i s t a + y m p ä r i s t ö s e u r a u k s e t + y m p ä r i s t ö s e u r a u k s i a + y m p ä r i s t ö s e u r a u k s i n e e n + y m p ä r i s t ö s e u r a u k s i s t a + y m p ä r i s t ö s e u r a u s k u v a u k s e n + y m p ä r i s t ö s e u r a u s k u v a u k s i a + y m p ä r i s t ö s i j o i t u s t e n + y m p ä r i s t ö s i t o u m u k s e t + y m p ä r i s t ö s i t o u m u k s i a m m e + y m p ä r i s t ö s i t o u m u k s i i n + y m p ä r i s t ö s i t o u m u s t e n + y m p ä r i s t ö s k a n d a a l i + y m p ä r i s t ö s k a n d a a l i e n + y m p ä r i s t ö s o p i m u k s e e n + y m p ä r i s t ö s o p i m u k s e k s i + y m p ä r i s t ö s o p i m u k s e l l e + y m p ä r i s t ö s o p i m u k s e t + y m p ä r i s t ö s o p i m u k s i a + y m p ä r i s t ö s o p i m u k s i e n + y m p ä r i s t ö s o p i m u k s i i n + y m p ä r i s t ö s o p i m u k s i s t a + y m p ä r i s t ö s o p i m u s + y m p ä r i s t ö s o p i m u s m a l l i a + y m p ä r i s t ö s o p i m u s t e n + y m p ä r i s t ö s s ä + y m p ä r i s t ö s s ä m m e + y m p ä r i s t ö s t a n d a r d e i h i n + y m p ä r i s t ö s t a n d a r d e i l l a + y m p ä r i s t ö s t a n d a r d e i s s a + y m p ä r i s t ö s t a n d a r d e i s t a + y m p ä r i s t ö s t a n d a r d e j a + y m p ä r i s t ö s t a n d a r d e j a a n + y m p ä r i s t ö s t a n d a r d i + y m p ä r i s t ö s t a n d a r d i a + y m p ä r i s t ö s t a n d a r d i e n + y m p ä r i s t ö s t a n d a r d i t + y m p ä r i s t ö s t r a t e g i a + y m p ä r i s t ö s t r a t e g i a a + y m p ä r i s t ö s t r a t e g i a a n + y m p ä r i s t ö s t r a t e g i a n + y m p ä r i s t ö s t r a t e g i o i d e n + y m p ä r i s t ö s t r a t e g i o i t a + y m p ä r i s t ö s t ä + y m p ä r i s t ö s u o j a a + y m p ä r i s t ö s u o j e l u + y m p ä r i s t ö s u o j e l u a + y m p ä r i s t ö s u o j e l u i n v e s t o i n t i e n + y m p ä r i s t ö s u o j e l u n + y m p ä r i s t ö s u o j e l u o h j e l m i a + y m p ä r i s t ö s u o j e l u s s a + y m p ä r i s t ö s u o j e l u t o i m i n + y m p ä r i s t ö s u o j e l u u n + y m p ä r i s t ö s u o j e l u v a a t i m u s t e n + y m p ä r i s t ö s u o j e l u v i r a s t o + y m p ä r i s t ö s u u n n i t e l m a t + y m p ä r i s t ö s u u n n i t e l m i a + y m p ä r i s t ö s u u n n i t e l m i e n + y m p ä r i s t ö s u u n n i t t e l u + y m p ä r i s t ö s u u n n i t t e l u a + y m p ä r i s t ö s u u n n i t t e l u n + y m p ä r i s t ö s u u n t a u k s i a + y m p ä r i s t ö s u u n t a v i i v o j a + y m p ä r i s t ö s u u n t a v i i v o j e n + y m p ä r i s t ö s y i d e n + y m p ä r i s t ö s y i s t ä + y m p ä r i s t ö s y i t ä + y m p ä r i s t ö s y y + y m p ä r i s t ö s y y t + y m p ä r i s t ö s ä t e i l y ä + y m p ä r i s t ö s ä ä d ö k s i s t ä + y m p ä r i s t ö s ä ä d ö k s i ä + y m p ä r i s t ö s ä ä d ö s + y m p ä r i s t ö s ä ä d ö s t e n + y m p ä r i s t ö s ä ä n n ö i l l e + y m p ä r i s t ö s ä ä n n ö i n + y m p ä r i s t ö s ä ä n n ö i s t ä + y m p ä r i s t ö s ä ä n n ö i s t ä m m e + y m p ä r i s t ö s ä ä n n ö k s e t + y m p ä r i s t ö s ä ä n n ö k s i i n + y m p ä r i s t ö s ä ä n n ö k s i l t ä + y m p ä r i s t ö s ä ä n n ö k s i ä + y m p ä r i s t ö s ä ä n n ö s t e n + y m p ä r i s t ö s ä ä n n ö s t ö + y m p ä r i s t ö s ä ä n n ö s t ö n + y m p ä r i s t ö s ä ä n n ö s t ö s s ä + y m p ä r i s t ö s ä ä n n ö t + y m p ä r i s t ö s ä ä n t ö i h i n + y m p ä r i s t ö s ä ä n t ö j e n + y m p ä r i s t ö s ä ä n t ö j ä + y m p ä r i s t ö s ä ä n t ö j ä ä n + y m p ä r i s t ö t a a k a s t a + y m p ä r i s t ö t a a k k a + y m p ä r i s t ö t a e + y m p ä r i s t ö t a i d e + y m p ä r i s t ö t a k e i d e n + y m p ä r i s t ö t a k u i t a + y m p ä r i s t ö t a k u u + y m p ä r i s t ö t a k u u s e e n + y m p ä r i s t ö t a k u u t a + y m p ä r i s t ö t a l o u s + y m p ä r i s t ö t a l o u s a r v i o + y m p ä r i s t ö t a l o u s a r v i o n + y m p ä r i s t ö t a l o u s t i e d e + y m p ä r i s t ö t a p a h t u m i a + y m p ä r i s t ö t a p a u s t a + y m p ä r i s t ö t a r k a s t a j i e n + y m p ä r i s t ö t a r k a s t u k s e t + y m p ä r i s t ö t a r k a s t u k s i a + y m p ä r i s t ö t a r k a s t u k s i i n + y m p ä r i s t ö t a r k a s t u k s i l l e + y m p ä r i s t ö t a r k a s t u k s i s s a + y m p ä r i s t ö t a r k a s t u k s i s t a + y m p ä r i s t ö t a r k a s t u s + y m p ä r i s t ö t a r k a s t u s j ä r j e s t e l m ä t + y m p ä r i s t ö t a r k a s t u s l a i t o k s e n + y m p ä r i s t ö t a r k a s t u s l a i t o s + y m p ä r i s t ö t a r k a s t u s l a i t o s t a + y m p ä r i s t ö t a r k a s t u s l a i t t e i s t o t + y m p ä r i s t ö t a r k a s t u s p o l i t i i k k a + y m p ä r i s t ö t a r k a s t u s t e n + y m p ä r i s t ö t a r k a s t u s v a a t i m u s t e n + y m p ä r i s t ö t a r k a s t u s v i r a n o m a i n e n + y m p ä r i s t ö t a r k a s t u s v i r a n o m a i s e k s i + y m p ä r i s t ö t a r k a s t u s v i r a n o m a i s e s t a + y m p ä r i s t ö t a r k a s t u s v i r a s t o n + y m p ä r i s t ö t a r k a s t u s v i r a s t o s t a + y m p ä r i s t ö t a r k i s t u k s e n + y m p ä r i s t ö t a r k i s t u s + y m p ä r i s t ö t a r k o i t u k s i i n + y m p ä r i s t ö t a r p e e t + y m p ä r i s t ö t a r p e i d e n + y m p ä r i s t ö t a r p e i s i i n + y m p ä r i s t ö t a r p e i t a + y m p ä r i s t ö t a s a p a i n o n + y m p ä r i s t ö t a s e e s t a + y m p ä r i s t ö t a s e t t a + y m p ä r i s t ö t a s o j e n + y m p ä r i s t ö t a v o i t e + y m p ä r i s t ö t a v o i t e t t a + y m p ä r i s t ö t a v o i t t e e m m e + y m p ä r i s t ö t a v o i t t e e n + y m p ä r i s t ö t a v o i t t e e n k i n + y m p ä r i s t ö t a v o i t t e e n s a + y m p ä r i s t ö t a v o i t t e e s e e n + y m p ä r i s t ö t a v o i t t e e t + y m p ä r i s t ö t a v o i t t e i d e m m e + y m p ä r i s t ö t a v o i t t e i d e n + y m p ä r i s t ö t a v o i t t e i l l a + y m p ä r i s t ö t a v o i t t e i l l e + y m p ä r i s t ö t a v o i t t e i l l e m m e + y m p ä r i s t ö t a v o i t t e i s i i n + y m p ä r i s t ö t a v o i t t e i s i i n s a + y m p ä r i s t ö t a v o i t t e i s s a + y m p ä r i s t ö t a v o i t t e i s t a + y m p ä r i s t ö t a v o i t t e i s t a m m e + y m p ä r i s t ö t a v o i t t e i t a + y m p ä r i s t ö t a v o i t t e i t a a n + y m p ä r i s t ö t a v o i t t e i t a m m e + y m p ä r i s t ö t e e m a a + y m p ä r i s t ö t e e m o j a + y m p ä r i s t ö t e h o k a s + y m p ä r i s t ö t e h o k a s t a + y m p ä r i s t ö t e h o k k a a l l a + y m p ä r i s t ö t e h o k k a a n + y m p ä r i s t ö t e h o k k a a s t a + y m p ä r i s t ö t e h o k k u u d e n + y m p ä r i s t ö t e h o k k u u t t a + y m p ä r i s t ö t e h t ä v i s s ä + y m p ä r i s t ö t e h t ä v ä + y m p ä r i s t ö t e k i j ä + y m p ä r i s t ö t e k i j ä t + y m p ä r i s t ö t e k i j ö i d e n + y m p ä r i s t ö t e k i j ö i h i n + y m p ä r i s t ö t e k i j ö i l l e + y m p ä r i s t ö t e k i j ö i l l ä + y m p ä r i s t ö t e k i j ö i s t ä + y m p ä r i s t ö t e k i j ö i t ä + y m p ä r i s t ö t e k n i i k a n + y m p ä r i s t ö t e k n i i k a s t a + y m p ä r i s t ö t e k n i i k k a + y m p ä r i s t ö t e k n i i k k a a + y m p ä r i s t ö t e k n i i k k a a n + y m p ä r i s t ö t e k n i i k k a n a + y m p ä r i s t ö t e k n i i k o i h i n + y m p ä r i s t ö t e k n i i k o i l l a + y m p ä r i s t ö t e k n i i k o i t a + y m p ä r i s t ö t e k n o l o g i a + y m p ä r i s t ö t e k n o l o g i a a + y m p ä r i s t ö t e k n o l o g i a a n + y m p ä r i s t ö t e k n o l o g i a l l a + y m p ä r i s t ö t e k n o l o g i a l l e + y m p ä r i s t ö t e k n o l o g i a m a r k k i n o i d e n + y m p ä r i s t ö t e k n o l o g i a n + y m p ä r i s t ö t e k n o l o g i a s s a + y m p ä r i s t ö t e k n o l o g i a s t a + y m p ä r i s t ö t e k n o l o g i a t + y m p ä r i s t ö t e k n o l o g i a t u o t t e i d e n + y m p ä r i s t ö t e k n o l o g i o i d e n + y m p ä r i s t ö t e k n o l o g i o i h i n + y m p ä r i s t ö t e k n o l o g i o i l l a + y m p ä r i s t ö t e k n o l o g i o i t a + y m p ä r i s t ö t e o l l i s u u d e n + y m p ä r i s t ö t e o l l i s u u d e s s a + y m p ä r i s t ö t e o l l i s u u t t a + y m p ä r i s t ö t e r r o r i s m i + y m p ä r i s t ö t e r r o r i s m i a + y m p ä r i s t ö t e r v e y d e n + y m p ä r i s t ö t e r v e y s + y m p ä r i s t ö t e r v e y s k y s y m y k s i ä + y m p ä r i s t ö t e r v e y s o h j e l m a n + y m p ä r i s t ö t e r v e y s s t r a t e g i a a + y m p ä r i s t ö t e r v e y s s t r a t e g i a s s a + y m p ä r i s t ö t e r v e y s s t r a t e g i a s t a + y m p ä r i s t ö t e r v e y s s u u n n i t e l m a + y m p ä r i s t ö t e r v e y s s u u n n i t e l m a n + y m p ä r i s t ö t e r v e y s s u u n n i t e l m i a + y m p ä r i s t ö t e r v e y s t o i m i n t a o h j e l m a a + y m p ä r i s t ö t e r v e y s t o i m i n t a s u u n n i t e l m a + y m p ä r i s t ö t e r v e y s t o i m i n t a s u u n n i t e l m a a + y m p ä r i s t ö t e r v e y s t o i m i n t a s u u n n i t e l m a n + y m p ä r i s t ö t e r v e y s t o i m i n t a s u u n n i t e l m a s s a + y m p ä r i s t ö t e r v e y s t o i m i n t a s u u n n i t e l m a s t a + y m p ä r i s t ö t e r v e y s t o i m i n t a s u u n n i t e l m i a + y m p ä r i s t ö t e r v e y t t ä + y m p ä r i s t ö t i e d e + y m p ä r i s t ö t i e d o n + y m p ä r i s t ö t i e d o s t a + y m p ä r i s t ö t i e d o t t a m i s t a + y m p ä r i s t ö t i e d o t u k s e l l a + y m p ä r i s t ö t i e t e i d e n + y m p ä r i s t ö t i e t e i l i j ö i t ä + y m p ä r i s t ö t i e t o + y m p ä r i s t ö t i e t o a + y m p ä r i s t ö t i e t o d i r e k t i i v i + y m p ä r i s t ö t i e t o i n e n + y m p ä r i s t ö t i e t o i s e l t a + y m p ä r i s t ö t i e t o i s e m m a l l e + y m p ä r i s t ö t i e t o i s e m m a n + y m p ä r i s t ö t i e t o i s e m p i + y m p ä r i s t ö t i e t o i s e m p i i n + y m p ä r i s t ö t i e t o i s e n + y m p ä r i s t ö t i e t o i s e s s a + y m p ä r i s t ö t i e t o i s e t + y m p ä r i s t ö t i e t o i s i a + y m p ä r i s t ö t i e t o i s i k s i + y m p ä r i s t ö t i e t o i s i l l e + y m p ä r i s t ö t i e t o i s t a + y m p ä r i s t ö t i e t o i s t e n + y m p ä r i s t ö t i e t o i s u u d e l l a + y m p ä r i s t ö t i e t o i s u u d e l l e + y m p ä r i s t ö t i e t o i s u u d e n + y m p ä r i s t ö t i e t o i s u u d e s t a + y m p ä r i s t ö t i e t o i s u u s + y m p ä r i s t ö t i e t o i s u u t t a + y m p ä r i s t ö t i e t o i s u u t t a m m e + y m p ä r i s t ö t i e t o j a + y m p ä r i s t ö t i e t o j e n + y m p ä r i s t ö t i e t o j ä r j e s t e l m i e n + y m p ä r i s t ö t i e t o o n + y m p ä r i s t ö t i e t o u d e s t a + y m p ä r i s t ö t i e t o u t t a + y m p ä r i s t ö t i l a a + y m p ä r i s t ö t i l a n n e + y m p ä r i s t ö t i l a n n e t t a + y m p ä r i s t ö t i l a n t e e n + y m p ä r i s t ö t i l a n t e e s e e n + y m p ä r i s t ö t i l a n t e e s t a + y m p ä r i s t ö t i l a s t o i l l e + y m p ä r i s t ö t i l a s t o j e n + y m p ä r i s t ö t i l i n p i d o n + y m p ä r i s t ö t i l i n p i d o s s a + y m p ä r i s t ö t i l i n p i d o s t a + y m p ä r i s t ö t i l i n p i t o + y m p ä r i s t ö t i l i n p i t o a + y m p ä r i s t ö t i l i n p i t o a s e t u s + y m p ä r i s t ö t i l i n p i t o o n + y m p ä r i s t ö t i l i n p i t o s t r a t e g i a n + y m p ä r i s t ö t i l i t + y m p ä r i s t ö t o i m e n p i d e o h j e l m a m m e + y m p ä r i s t ö t o i m e n p i d e t t ä + y m p ä r i s t ö t o i m e n p i t e e n + y m p ä r i s t ö t o i m e n p i t e e t + y m p ä r i s t ö t o i m e n p i t e i d e n + y m p ä r i s t ö t o i m e n p i t e i l l e + y m p ä r i s t ö t o i m e n p i t e i s i i n + y m p ä r i s t ö t o i m e n p i t e i s t ä + y m p ä r i s t ö t o i m e n p i t e i t ä + y m p ä r i s t ö t o i m e t + y m p ä r i s t ö t o i m i a + y m p ä r i s t ö t o i m i e n + y m p ä r i s t ö t o i m i i n + y m p ä r i s t ö t o i m i n n a n + y m p ä r i s t ö t o i m i n t a l i n j o i l l e + y m p ä r i s t ö t o i m i n t a o h j e l m a + y m p ä r i s t ö t o i m i n t a o h j e l m a a + y m p ä r i s t ö t o i m i n t a o h j e l m a a n + y m p ä r i s t ö t o i m i n t a o h j e l m a l l e + y m p ä r i s t ö t o i m i n t a o h j e l m a n + y m p ä r i s t ö t o i m i n t a o h j e l m a s s a + y m p ä r i s t ö t o i m i n t a s u u n n i t e l m a s s a + y m p ä r i s t ö t o i m i s t a + y m p ä r i s t ö t o i m i s t o + y m p ä r i s t ö t o i m i s t o l l a + y m p ä r i s t ö t o i m i s t o n + y m p ä r i s t ö t r a g e d i a + y m p ä r i s t ö t u e n + y m p ä r i s t ö t u e s t a + y m p ä r i s t ö t u e t + y m p ä r i s t ö t u h o + y m p ä r i s t ö t u h o a + y m p ä r i s t ö t u h o i h i n + y m p ä r i s t ö t u h o i s t a + y m p ä r i s t ö t u h o j a + y m p ä r i s t ö t u h o j e n + y m p ä r i s t ö t u h o n + y m p ä r i s t ö t u h o s t a + y m p ä r i s t ö t u h o t + y m p ä r i s t ö t u i l l e + y m p ä r i s t ö t u i s t a + y m p ä r i s t ö t u k e a + y m p ä r i s t ö t u k e e n + y m p ä r i s t ö t u k i + y m p ä r i s t ö t u k i a + y m p ä r i s t ö t u k i e n + y m p ä r i s t ö t u k i j ä r j e s t e l m i ä + y m p ä r i s t ö t u l o k s e t + y m p ä r i s t ö t u l o s t e n + y m p ä r i s t ö t u o m i o i s t u i m e s s a + y m p ä r i s t ö t u o m i o i s t u m i s t a + y m p ä r i s t ö t u o t e m e r k k i e n + y m p ä r i s t ö t u o t t e e t + y m p ä r i s t ö t u o t t e i d e n + y m p ä r i s t ö t u o t t e i t a + y m p ä r i s t ö t u r v a l l i s u u d e n + y m p ä r i s t ö t u r v a l l i s u u d e s t a + y m p ä r i s t ö t u r v a l l i s u u s + y m p ä r i s t ö t u r v a l l i s u u s a s i a n + y m p ä r i s t ö t u r v a l l i s u u t e e n + y m p ä r i s t ö t u t k i j o i d e n + y m p ä r i s t ö t u t k i m u k s e e n + y m p ä r i s t ö t u t k i m u k s e n + y m p ä r i s t ö t u t k i m u s + y m p ä r i s t ö t u t k i m u s o h j e l m i s t a + y m p ä r i s t ö t u t k i m u s t a + y m p ä r i s t ö t y ö + y m p ä r i s t ö t y ö m m e + y m p ä r i s t ö t y ö n + y m p ä r i s t ö t y ö r y h m ä + y m p ä r i s t ö t y ö s s ä + y m p ä r i s t ö t y ö t ä + y m p ä r i s t ö u h k a + y m p ä r i s t ö u h k a a + y m p ä r i s t ö u h k i a + y m p ä r i s t ö u h k i e n + y m p ä r i s t ö u h k i i n + y m p ä r i s t ö u h k i l l e + y m p ä r i s t ö u h k i s t a + y m p ä r i s t ö u l k o p o l i t i i k k a + y m p ä r i s t ö u l o t t u v u u d e l l a + y m p ä r i s t ö u l o t t u v u u d e n + y m p ä r i s t ö u l o t t u v u u d e s t a + y m p ä r i s t ö u l o t t u v u u d e t + y m p ä r i s t ö u l o t t u v u u k s i a + y m p ä r i s t ö u l o t t u v u u k s i i n + y m p ä r i s t ö u l o t t u v u u s + y m p ä r i s t ö u l o t t u v u u t e e n + y m p ä r i s t ö u l o t t u v u u t t a + y m p ä r i s t ö u n i o n i + y m p ä r i s t ö u u d i s t u k s e e n + y m p ä r i s t ö u u d i s t u k s e t + y m p ä r i s t ö u u d i s t u s + y m p ä r i s t ö v a a r a l l i s t e n + y m p ä r i s t ö v a a r a n + y m p ä r i s t ö v a a r o i h i n + y m p ä r i s t ö v a a r o i s t a + y m p ä r i s t ö v a a r o j a + y m p ä r i s t ö v a a r o j e n + y m p ä r i s t ö v a a t i m u k s e n s a + y m p ä r i s t ö v a a t i m u k s e t + y m p ä r i s t ö v a a t i m u k s i a + y m p ä r i s t ö v a a t i m u k s i a m m e + y m p ä r i s t ö v a a t i m u k s i i n + y m p ä r i s t ö v a a t i m u k s i s t a + y m p ä r i s t ö v a a t i m u s + y m p ä r i s t ö v a a t i m u s t a + y m p ä r i s t ö v a a t i m u s t e n + y m p ä r i s t ö v a h i n g o i s s a + y m p ä r i s t ö v a h i n g o i s t a + y m p ä r i s t ö v a h i n g o n + y m p ä r i s t ö v a h i n g o s t a + y m p ä r i s t ö v a h i n g o t + y m p ä r i s t ö v a h i n k o + y m p ä r i s t ö v a h i n k o a + y m p ä r i s t ö v a h i n k o i h i n + y m p ä r i s t ö v a h i n k o j a + y m p ä r i s t ö v a h i n k o j e n + y m p ä r i s t ö v a h i n k o v a k u u t u s t a + y m p ä r i s t ö v a h i n k o v a s t u u + y m p ä r i s t ö v a h i n k o v a s t u u s t a + y m p ä r i s t ö v a h i n k o v a s t u u t a + y m p ä r i s t ö v a i k u t u k s e e n + y m p ä r i s t ö v a i k u t u k s e n + y m p ä r i s t ö v a i k u t u k s e n s a + y m p ä r i s t ö v a i k u t u k s e s t a + y m p ä r i s t ö v a i k u t u k s e t + y m p ä r i s t ö v a i k u t u k s e t k i n + y m p ä r i s t ö v a i k u t u k s i a + y m p ä r i s t ö v a i k u t u k s i a a n + y m p ä r i s t ö v a i k u t u k s i e n + y m p ä r i s t ö v a i k u t u k s i i n + y m p ä r i s t ö v a i k u t u k s i l l a + y m p ä r i s t ö v a i k u t u k s i l l e + y m p ä r i s t ö v a i k u t u k s i l t a a n + y m p ä r i s t ö v a i k u t u k s i n + y m p ä r i s t ö v a i k u t u k s i n a + y m p ä r i s t ö v a i k u t u k s i s t a + y m p ä r i s t ö v a i k u t u s + y m p ä r i s t ö v a i k u t u s a n a l y y s i n + y m p ä r i s t ö v a i k u t u s a r v i o i d e n + y m p ä r i s t ö v a i k u t u s a r v i o i n n i n + y m p ä r i s t ö v a i k u t u s a r v i o i n n i t + y m p ä r i s t ö v a i k u t u s a r v i o i n t e j a + y m p ä r i s t ö v a i k u t u s a r v i o i n t i + y m p ä r i s t ö v a i k u t u s a r v i o i n t i a + y m p ä r i s t ö v a i k u t u s a r v i o i t a + y m p ä r i s t ö v a i k u t u s a r v i o t a + y m p ä r i s t ö v a i k u t u s k r i t e e r i s t ä + y m p ä r i s t ö v a i k u t u s m e r k i n n ä l l ä + y m p ä r i s t ö v a i k u t u s m e r k i n n ä t + y m p ä r i s t ö v a i k u t u s o h j e i t a + y m p ä r i s t ö v a i k u t u s r a p o r t i n + y m p ä r i s t ö v a i k u t u s s e l o s t u s + y m p ä r i s t ö v a i k u t u s t a + y m p ä r i s t ö v a i k u t u s t e n + y m p ä r i s t ö v a i k u t u s t e n a r v i o i n n i n + y m p ä r i s t ö v a i k u t u s t e n a r v i o i n n i s t a + y m p ä r i s t ö v a i k u t u s t e n a r v i o i n t e j a + y m p ä r i s t ö v a i k u t u s t e n s a + y m p ä r i s t ö v a i k u t u s t u t k i m u k s e e n + y m p ä r i s t ö v a i k u t u s t u t k i m u s t e n + y m p ä r i s t ö v a l i n t o j a + y m p ä r i s t ö v a l i n t o j e n + y m p ä r i s t ö v a l i o k u n n a l l a + y m p ä r i s t ö v a l i o k u n n a l l e + y m p ä r i s t ö v a l i o k u n n a l t a + y m p ä r i s t ö v a l i o k u n n a n + y m p ä r i s t ö v a l i o k u n n a n k a a n + y m p ä r i s t ö v a l i o k u n n a n k i n + y m p ä r i s t ö v a l i o k u n n a s s a + y m p ä r i s t ö v a l i o k u n n a s t a + y m p ä r i s t ö v a l i o k u n t a + y m p ä r i s t ö v a l i o k u n t a a + y m p ä r i s t ö v a l i o k u n t a a n + y m p ä r i s t ö v a l i o k u n t a h a n + y m p ä r i s t ö v a l i o k u n t a m m e + y m p ä r i s t ö v a l i o k u n t a n s a + y m p ä r i s t ö v a l i o k u n t i e n + y m p ä r i s t ö v a l t u u t e t u n + y m p ä r i s t ö v a l v o n n a n + y m p ä r i s t ö v a l v o n t a + y m p ä r i s t ö v a l v o n t a a + y m p ä r i s t ö v a l v o n t a a n + y m p ä r i s t ö v a l v o n t a m e n e t t e l y j e n + y m p ä r i s t ö v a n d a l i s m i a + y m p ä r i s t ö v a n d a l i s m i s t a + y m p ä r i s t ö v a r a + y m p ä r i s t ö v a r a u k s e t + y m p ä r i s t ö v a r o j a + y m p ä r i s t ö v a s t u i t a + y m p ä r i s t ö v a s t u u + y m p ä r i s t ö v a s t u u a s e t u k s e s t a + y m p ä r i s t ö v a s t u u a s i o i d e n + y m p ä r i s t ö v a s t u u d i r e k t i i v i + y m p ä r i s t ö v a s t u u d i r e k t i i v i k s i + y m p ä r i s t ö v a s t u u d i r e k t i i v i n + y m p ä r i s t ö v a s t u u d i r e k t i i v i s t ä + y m p ä r i s t ö v a s t u u d i r e k t i i v i ä + y m p ä r i s t ö v a s t u u j ä r j e s t e l m ä n + y m p ä r i s t ö v a s t u u j ä r j e s t e l m ä ä + y m p ä r i s t ö v a s t u u k i r j a + y m p ä r i s t ö v a s t u u k y s y m y k s i s s ä + y m p ä r i s t ö v a s t u u l a i n s ä ä d ä n n ö l t ä + y m p ä r i s t ö v a s t u u l a i n s ä ä d ä n n ö n + y m p ä r i s t ö v a s t u u l a i n s ä ä d ä n n ö s s ä + y m p ä r i s t ö v a s t u u l a i n s ä ä d ä n t ö + y m p ä r i s t ö v a s t u u l a i n s ä ä d ä n t ö ä + y m p ä r i s t ö v a s t u u l l a + y m p ä r i s t ö v a s t u u l l i s e s s a + y m p ä r i s t ö v a s t u u n + y m p ä r i s t ö v a s t u u n s a + y m p ä r i s t ö v a s t u u p e r i a a t e t t a + y m p ä r i s t ö v a s t u u s e e n + y m p ä r i s t ö v a s t u u s t a + y m p ä r i s t ö v a s t u u t a + y m p ä r i s t ö v a s t u u v a k u u t u k s e s t a + y m p ä r i s t ö v a u r i o i t a + y m p ä r i s t ö v e l k a a + y m p ä r i s t ö v e l v o i t t e e n s a + y m p ä r i s t ö v e l v o i t t e e t + y m p ä r i s t ö v e l v o i t t e i d e n + y m p ä r i s t ö v e l v o i t t e i s i i n + y m p ä r i s t ö v e l v o i t t e i t a + y m p ä r i s t ö v e r k k o j e n + y m p ä r i s t ö v e r o + y m p ä r i s t ö v e r o a + y m p ä r i s t ö v e r o i h i n + y m p ä r i s t ö v e r o i l l a + y m p ä r i s t ö v e r o i l l e + y m p ä r i s t ö v e r o i s s a + y m p ä r i s t ö v e r o i s t a + y m p ä r i s t ö v e r o j a + y m p ä r i s t ö v e r o j e n + y m p ä r i s t ö v e r o j ä r j e s t e l m i e n + y m p ä r i s t ö v e r o j ä r j e s t e l m ä + y m p ä r i s t ö v e r o j ä r j e s t e l m ä n + y m p ä r i s t ö v e r o l l a + y m p ä r i s t ö v e r o l l e + y m p ä r i s t ö v e r o n + y m p ä r i s t ö v e r o p a k e t i n + y m p ä r i s t ö v e r o s t a + y m p ä r i s t ö v e r o t + y m p ä r i s t ö v e r o t u k s e n + y m p ä r i s t ö v e r o t u k s e s t a + y m p ä r i s t ö v e r o t u s + y m p ä r i s t ö v e r o t u s t a + y m p ä r i s t ö v i r a n o m a i s e t + y m p ä r i s t ö v i r a n o m a i s i a + y m p ä r i s t ö v i r a n o m a i s i l l a + y m p ä r i s t ö v i r a n o m a i s i l l e + y m p ä r i s t ö v i r a n o m a i s t e n + y m p ä r i s t ö v i r a s t o + y m p ä r i s t ö v i r a s t o n + y m p ä r i s t ö v i r a s t o s t a + y m p ä r i s t ö v i r a s t o t + y m p ä r i s t ö v o i m a v a r o j e n + y m p ä r i s t ö v o i t t o + y m p ä r i s t ö v o i t t o j a + y m p ä r i s t ö v o i t t o n a + y m p ä r i s t ö v u o r o v a i k u t u s t e n + y m p ä r i s t ö v u o s i s a d a n + y m p ä r i s t ö v y ö h y k e + y m p ä r i s t ö v y ö h y k k e i d e n + y m p ä r i s t ö v y ö h y k k e i s i i n + y m p ä r i s t ö v y ö h y k k e i t ä + y m p ä r i s t ö v ä l i n e e n ä + y m p ä r i s t ö v ä l i n e i s t ä + y m p ä r i s t ö v ä l i n e t t ä + y m p ä r i s t ö y h d i s t y s t e n + y m p ä r i s t ö y h t e e n s o p i v u u s s t r a t e g i a + y m p ä r i s t ö y h t e i s t y ö + y m p ä r i s t ö y h t e i s t y ö h ö n + y m p ä r i s t ö y h t e i s t y ö n + y m p ä r i s t ö y h t e i s t y ö t ä + y m p ä r i s t ö y s t ä v ä l l i n e n + y m p ä r i s t ö y s t ä v ä l l i s e e n + y m p ä r i s t ö y s t ä v ä l l i s e k s i + y m p ä r i s t ö y s t ä v ä l l i s e l l e + y m p ä r i s t ö y s t ä v ä l l i s e l l ä + y m p ä r i s t ö y s t ä v ä l l i s e l t ä + y m p ä r i s t ö y s t ä v ä l l i s e m m i k s i + y m p ä r i s t ö y s t ä v ä l l i s e m m i l l e + y m p ä r i s t ö y s t ä v ä l l i s e m m i l l ä + y m p ä r i s t ö y s t ä v ä l l i s e m m i l t ä + y m p ä r i s t ö y s t ä v ä l l i s e m m i n + y m p ä r i s t ö y s t ä v ä l l i s e m m i s t ä + y m p ä r i s t ö y s t ä v ä l l i s e m m ä k s i + y m p ä r i s t ö y s t ä v ä l l i s e m m ä l l e + y m p ä r i s t ö y s t ä v ä l l i s e m m ä l l ä + y m p ä r i s t ö y s t ä v ä l l i s e m m ä n + y m p ä r i s t ö y s t ä v ä l l i s e m m ä t + y m p ä r i s t ö y s t ä v ä l l i s e m p i + y m p ä r i s t ö y s t ä v ä l l i s e m p i e n + y m p ä r i s t ö y s t ä v ä l l i s e m p i i n + y m p ä r i s t ö y s t ä v ä l l i s e m p i n ä + y m p ä r i s t ö y s t ä v ä l l i s e m p i ä + y m p ä r i s t ö y s t ä v ä l l i s e m p ä n ä + y m p ä r i s t ö y s t ä v ä l l i s e m p ä ä + y m p ä r i s t ö y s t ä v ä l l i s e m p ä ä n + y m p ä r i s t ö y s t ä v ä l l i s e n + y m p ä r i s t ö y s t ä v ä l l i s e n ä + y m p ä r i s t ö y s t ä v ä l l i s e s s ä + y m p ä r i s t ö y s t ä v ä l l i s e s t o + y m p ä r i s t ö y s t ä v ä l l i s e s t ä + y m p ä r i s t ö y s t ä v ä l l i s e t + y m p ä r i s t ö y s t ä v ä l l i s i i n + y m p ä r i s t ö y s t ä v ä l l i s i l l e + y m p ä r i s t ö y s t ä v ä l l i s i l l ä + y m p ä r i s t ö y s t ä v ä l l i s i l t ä + y m p ä r i s t ö y s t ä v ä l l i s i m m i l l e + y m p ä r i s t ö y s t ä v ä l l i s i m m i s t ä + y m p ä r i s t ö y s t ä v ä l l i s i m m ä n + y m p ä r i s t ö y s t ä v ä l l i s i m m ä t + y m p ä r i s t ö y s t ä v ä l l i s i m p i ä + y m p ä r i s t ö y s t ä v ä l l i s i n + y m p ä r i s t ö y s t ä v ä l l i s i n ä + y m p ä r i s t ö y s t ä v ä l l i s i s t ä + y m p ä r i s t ö y s t ä v ä l l i s i ä + y m p ä r i s t ö y s t ä v ä l l i s t e n + y m p ä r i s t ö y s t ä v ä l l i s t ä + y m p ä r i s t ö y s t ä v ä l l i s y y d e l l e + y m p ä r i s t ö y s t ä v ä l l i s y y d e n + y m p ä r i s t ö y s t ä v ä l l i s y y s + y m p ä r i s t ö y s t ä v ä l l i s y y t e e n + y m p ä r i s t ö y s t ä v ä l l i s y y t e n s ä + y m p ä r i s t ö y s t ä v ä l l i s y y t t ä + y m p ä r i s t ö ä + y m p ä r i s t ö ä k i n + y m p ä r i s t ö ä ä n + y m p ä r i s t ö ö n + y m p ä r i s t ö ö n s ä + y m p ä r i v u o t i s e n + y m p ä r i v u o t i s e s t i + y m p ä r y s a l u e t t a + y m p ä r y s k a u p u n k e i h i n + y m p ä r y s v a l l a t + y m p ä r ö i m i e n + y m p ä r ö i v i e n + y m p ä r ö i v i i n + y m p ä r ö i v i l l e + y m p ä r ö i v i l l ä + y m p ä r ö i v i s s ä + y m p ä r ö i v i s t ä + y r i t e t t i i n + y r i t e t t y + y r i t e t t ä e s s ä + y r i t e t t ä i s i i n + y r i t e t ä ä n + y r i t i m m e + y r i t i n + y r i t t e l i ä i s y y d e n + y r i t t e l i ä i s y y t t ä + y r i t t e l i ä ä m p i + y r i t t i + y r i t t i v ä t + y r i t t ä e s s ä + y r i t t ä e s s ä m m e + y r i t t ä e s s ä ä n + y r i t t ä i s i + y r i t t ä i s i m m e + y r i t t ä i s i n + y r i t t ä i s i v ä t + y r i t t ä j i e n + y r i t t ä j i k s i + y r i t t ä j i l l e + y r i t t ä j i n ä + y r i t t ä j i s t ä + y r i t t ä j i ä + y r i t t ä j i ä m m e + y r i t t ä j y y d e l l e + y r i t t ä j y y d e n + y r i t t ä j y y d e s t ä + y r i t t ä j y y s a l o i t t e e t + y r i t t ä j y y s a l o i t t e i t a + y r i t t ä j y y s h a n k k e i d e n + y r i t t ä j y y s h e n g e n + y r i t t ä j y y s h e n k e ä + y r i t t ä j y y s k a s v a t u k s e e n + y r i t t ä j y y s k a s v a t u s t a + y r i t t ä j y y s k o u l u t u k s e n + y r i t t ä j y y s k o u l u t u s t a + y r i t t ä j y y s k u l t t u u r i a + y r i t t ä j y y s k u l t t u u r i n + y r i t t ä j y y s k u r s s i e n + y r i t t ä j y y s n ä k ö k o h t a + y r i t t ä j y y s n ä k ö k o h t a a + y r i t t ä j y y s o h j e l m i a + y r i t t ä j y y s p o t e n t i a a l i a + y r i t t ä j y y s r i s k i n + y r i t t ä j y y s t a i d o t + y r i t t ä j y y s t a i t o j e n + y r i t t ä j y y s t o i m i n t a a + y r i t t ä j y y s v a s t a i n e n + y r i t t ä j y y s y m p ä r i s t ö ä + y r i t t ä j y y t e e n + y r i t t ä j y y t t ä + y r i t t ä j ä h e n g e l l e + y r i t t ä j ä h e n g e n + y r i t t ä j ä h e n g e s t ä + y r i t t ä j ä h e n k e e n + y r i t t ä j ä h e n k e n s ä + y r i t t ä j ä h e n k e ä + y r i t t ä j ä h e n k i + y r i t t ä j ä h e n k i s e m m ä n + y r i t t ä j ä h e n k i s y y d e n + y r i t t ä j ä h e n k i s y y s + y r i t t ä j ä h e n k i s y y t t ä + y r i t t ä j ä i n n o v a a t i o n + y r i t t ä j ä j ä r j e s t e l m ä l l e + y r i t t ä j ä j ä r j e s t ö + y r i t t ä j ä j ä r j e s t ö j e n + y r i t t ä j ä j ä r j e s t ö s s ä + y r i t t ä j ä j ä r j e s t ö t + y r i t t ä j ä k a l a s t a j a t + y r i t t ä j ä k a p a s i t e e t t i + y r i t t ä j ä k s i + y r i t t ä j ä k u l j e t t a j i l l e + y r i t t ä j ä k u l t t u u r i + y r i t t ä j ä k u l t t u u r i n + y r i t t ä j ä l l e + y r i t t ä j ä n a i s t e n + y r i t t ä j ä o h j e l m i i n + y r i t t ä j ä o p i n t o j a + y r i t t ä j ä p o t e n t i a a l i a + y r i t t ä j ä p o t e n t i a a l i n + y r i t t ä j ä r a k e n t e e n s a + y r i t t ä j ä r y h m i e n + y r i t t ä j ä s e k t o r i + y r i t t ä j ä t + y r i t t ä j ä t a i t o j a + y r i t t ä j ä t o i m i n n a s t a + y r i t t ä j ä t o i m i n t a + y r i t t ä j ä t o i m i n t a a + y r i t t ä j ä y m p ä r i s t ö + y r i t t ä j ä y s t ä v ä l l i s e l l ä + y r i t t ä j ä y s t ä v ä l l i s i ä + y r i t t ä k ä ä + y r i t t ä k ä ä m m e + y r i t t ä m i s e n + y r i t t ä m i s e s t ä + y r i t t ä m i s h a l u n s a + y r i t t ä m i s k y k y ä + y r i t t ä m i s k y v y n + y r i t t ä m i s p o l i t i i k a l l e + y r i t t ä m i s v a p a u t e e n + y r i t t ä m i ä + y r i t t ä m ä s t ä + y r i t t ä m ä t t ä + y r i t t ä m ä t t ä k ä ä n + y r i t t ä m ä ä n + y r i t t ä n e e n + y r i t t ä n e e t + y r i t t ä n y t + y r i t t ä v ä t + y r i t t ä v ä t k i n + y r i t t ä ä + y r i t t ä ä k i n + y r i t t ä ä k s e e n + y r i t t ä ä k s e m m e + y r i t t ä ä k s e n i + y r i t y k s e e n + y r i t y k s e l l e + y r i t y k s e l l ä + y r i t y k s e l t ä + y r i t y k s e n + y r i t y k s e s s ä + y r i t y k s e s t ä + y r i t y k s e t + y r i t y k s i e n + y r i t y k s i i n + y r i t y k s i l l e + y r i t y k s i l l e k i n + y r i t y k s i l l e m m e + y r i t y k s i l l ä + y r i t y k s i l l ä k i n + y r i t y k s i l t ä + y r i t y k s i l t ä m m e + y r i t y k s i s s ä + y r i t y k s i s t ä + y r i t y k s i s t ä m m e + y r i t y k s i s t ä ä n + y r i t y k s i ä + y r i t y k s i ä k i n + y r i t y k s i ä m m e + y r i t y k s i ä ä n + y r i t y s a l a l l a + y r i t y s a l a s t a + y r i t y s a l o i h i n + y r i t y s a l o i t t e i d e n + y r i t y s a l o i t t e i t a + y r i t y s a l u e i t a + y r i t y s a r k k i t e h t u u r i + y r i t y s a s i a k k a a t + y r i t y s a s i a k k a i t a + y r i t y s a s i a n t u n t i j a t + y r i t y s a s i o i d e n + y r i t y s d e m o k r a t i a n + y r i t y s e l i i t i n + y r i t y s e l ä m ä n + y r i t y s e l ä m ä ä n + y r i t y s e t i i k k a a n + y r i t y s f i l o s o f i o i d e n + y r i t y s f o o r u m e i l l a + y r i t y s f o o r u m i a + y r i t y s f o o r u m i l l e + y r i t y s f o o r u m i m m e + y r i t y s f o o r u m i n + y r i t y s f u u s i o i d e n + y r i t y s f u u s i o i t a + y r i t y s f u u s i o k s i + y r i t y s h a k e m i s t o i h i n + y r i t y s h a k e m i s t o i s s a + y r i t y s h a k e m i s t o i s t a + y r i t y s h a k e m i s t o j a + y r i t y s h a k e m i s t o j e n + y r i t y s h a k e m i s t o o n + y r i t y s h a k e m i s t o t + y r i t y s h a k e m i s t o y h t i ö i d e n + y r i t y s h a k e m i s t o y h t i ö i l t ä + y r i t y s h a k e m i s t o y h t i ö i s t ä + y r i t y s h a k e m i s t o y h t i ö i t ä + y r i t y s h a k e m i s t o y h t i ö n + y r i t y s h a k e m i s t o y h t i ö t + y r i t y s h a k e m i s t o y r i t y k s i l l e + y r i t y s h a l l i n n o n + y r i t y s h a l l i n t o + y r i t y s h a l l i n t o a + y r i t y s h a n k k e i d e n + y r i t y s h a n k k e i l l e + y r i t y s h a n k k e i t a + y r i t y s h a u t o m o j a + y r i t y s h e n k e ä + y r i t y s h e n k i s y y t e e n + y r i t y s h o i d o n + y r i t y s i h m i s t e n + y r i t y s i l m a p i i r i + y r i t y s i l m a p i i r i n + y r i t y s i l m a p i i r i s t ä + y r i t y s i l m a p i i r i ä + y r i t y s i l m a s t o + y r i t y s i l m a s t o n + y r i t y s i n n o v a a t i o i d e n + y r i t y s i n n o v a a t i o i t a + y r i t y s i n v e s t o i n t i e n + y r i t y s j o h d o n + y r i t y s j o h d o s s a + y r i t y s j o h t a j a + y r i t y s j o h t a j a n + y r i t y s j o h t a j a t + y r i t y s j o h t a j i a + y r i t y s j o h t a j i e n + y r i t y s j o h t a j i i n + y r i t y s j o h t a j i l l a + y r i t y s j o h t a j i l t a + y r i t y s j o h t a j u u s + y r i t y s j o h t o + y r i t y s j o h t o a + y r i t y s j o h t o i n e n + y r i t y s j o h t o i s e n + y r i t y s j u r i d i i k k a + y r i t y s j ä r j e s t e l m ä m m e + y r i t y s j ä r j e s t e l y d i r e k t i i v i s s ä + y r i t y s j ä r j e s t e l y d i r e k t i i v i ä + y r i t y s j ä r j e s t ö j e n + y r i t y s j ä r j e s t ö t + y r i t y s k a m p a n j a a + y r i t y s k a n s a l a i s e n a + y r i t y s k a r t e l l e i l l e + y r i t y s k a u p o i s t a + y r i t y s k a u p p a + y r i t y s k e h i t y k s e n + y r i t y s k e s k e i s t ä + y r i t y s k e s k i t t y m i e n + y r i t y s k e s k i t t y m i n ä + y r i t y s k e s k i t t y m i ä + y r i t y s k e s k i t t y m ä a s e t u s + y r i t y s k e s k i t t y m ä s t ä + y r i t y s k e s k u k s i e n + y r i t y s k e t j u j a + y r i t y s k e t j u n + y r i t y s k i e l e l l ä + y r i t y s k i l p a i l u n + y r i t y s k i r j a n p i d o s s a + y r i t y s k l u s t e r i + y r i t y s k o h t a i s i a + y r i t y s k o k e i l u n + y r i t y s k o k e m u s t a + y r i t y s k o k o + y r i t y s k o k o j a + y r i t y s k o m i t e a n + y r i t y s k o m i t e a t + y r i t y s k o m i t e o i h i n + y r i t y s k o m i t e o i t a + y r i t y s k o n t a k t i t + y r i t y s k o r t i n + y r i t y s k o r t t i + y r i t y s k o u l u t u k s e n + y r i t y s k o u l u t u s k e s k u k s e n + y r i t y s k u d o k s e n + y r i t y s k u d o s t a + y r i t y s k u l t t u u r i + y r i t y s k u l t t u u r i a + y r i t y s k u l t t u u r i e n + y r i t y s k u l t t u u r i l l e + y r i t y s k u l t t u u r i n + y r i t y s k u l t t u u r i s s a + y r i t y s k u l t t u u r i s t a + y r i t y s k u m p p a n i e n + y r i t y s k u m p p a n u u d e n + y r i t y s k u m p p a n u u k s i l l a + y r i t y s k u m p p a n u u s + y r i t y s k ä s i t t e e n + y r i t y s k ä s i t t e i t ä + y r i t y s k ä y t t ä j i ä + y r i t y s k ä y t t ä y t y m i s t ä + y r i t y s k ä y t t ö ö n + y r i t y s k ä y t ä n n ö t + y r i t y s k ä y t ä n t ö + y r i t y s l a i n s ä ä d ä n n ö l l i s i ä + y r i t y s l a i n s ä ä d ä n n ö n + y r i t y s l a i n s ä ä d ä n t ö ä + y r i t y s l a i n s ä ä d ä n t ö ö n + y r i t y s l a u t a k u n t a a + y r i t y s l e n t o k o n e i t a + y r i t y s l u e t t e l o + y r i t y s l u e t t e l o i s s a + y r i t y s l u o k k a + y r i t y s l u o k k a a + y r i t y s l u o t t o k a n n a s t a + y r i t y s l ä h e i s e n + y r i t y s m a a i l m a + y r i t y s m a a i l m a a + y r i t y s m a a i l m a a n + y r i t y s m a a i l m a l l e + y r i t y s m a a i l m a n + y r i t y s m a a i l m a s s a + y r i t y s m a a i l m a s t a + y r i t y s m a a i l m a t + y r i t y s m a h d o l l i s u u k s i e n + y r i t y s m a l l e j a + y r i t y s m a l l i + y r i t y s m a l l i a + y r i t y s m a l l i s t a + y r i t y s m a l l i t + y r i t y s m a r k k i n o i l l a + y r i t y s m a r k k i n o i t a + y r i t y s m o n o p o l i + y r i t y s m u o d o i s t a + y r i t y s m u o t o a + y r i t y s m u o t o i h i n + y r i t y s m u o t o j a + y r i t y s m u o t o j e n + y r i t y s m y ö n t e i s e m p i + y r i t y s m y ö n t e i s y y d e n + y r i t y s n e u v o n t a a n + y r i t y s n e u v o s t o + y r i t y s n e u v o s t o a + y r i t y s n e u v o s t o d i r e k t i i v i + y r i t y s n e u v o s t o d i r e k t i i v i i n + y r i t y s n e u v o s t o d i r e k t i i v i n + y r i t y s n e u v o s t o d i r e k t i i v i s s ä + y r i t y s n e u v o s t o d i r e k t i i v i ä + y r i t y s n e u v o s t o i h i n + y r i t y s n e u v o s t o i l l a + y r i t y s n e u v o s t o i l l e + y r i t y s n e u v o s t o i s s a + y r i t y s n e u v o s t o i s t a + y r i t y s n e u v o s t o j a + y r i t y s n e u v o s t o j e n + y r i t y s n e u v o s t o k y s y m y k s e n + y r i t y s n e u v o s t o l l e + y r i t y s n e u v o s t o l l e k a a n + y r i t y s n e u v o s t o n + y r i t y s n e u v o s t o n s a + y r i t y s n e u v o s t o o n + y r i t y s n e u v o s t o s s a + y r i t y s n e u v o s t o s t a + y r i t y s n e u v o s t o t + y r i t y s o h j e l m a a n + y r i t y s o h j e l m i e n + y r i t y s o i k e u d e n + y r i t y s o i k e u d e s t a + y r i t y s o i k e u s + y r i t y s o i k e u t t a + y r i t y s o r g a n i s a a t i o m a l l e j a + y r i t y s o s a k k e i t a + y r i t y s o s o i t t e i s i i n + y r i t y s o s t o d i r e k t i i v i i n + y r i t y s o s t o d i r e k t i i v i ä + y r i t y s o s t o i l l e + y r i t y s o s t o i s t a + y r i t y s o s t o j a + y r i t y s o s t o j e n + y r i t y s o s t o m e n e t t e l y j e n + y r i t y s o s t o p a n e e l i + y r i t y s o s t o p r o s e s s i i n + y r i t y s o s t o s a s i a s s a + y r i t y s o s t o s t a + y r i t y s o s t o t a r j o u k s e e n + y r i t y s o s t o t a r j o u k s e n + y r i t y s o s t o t a r j o u k s e t + y r i t y s o s t o t a r j o u k s i a + y r i t y s o s t o t a r j o u k s i i n + y r i t y s o s t o t a r j o u k s i s s a + y r i t y s o s t o t a r j o u k s i s t a + y r i t y s o s t o t a r j o u s + y r i t y s o s t o t i l a n t e e s s a + y r i t y s p a k e t t i t o i m i n n a n + y r i t y s p a l k i n t o s e r e m o n i a + y r i t y s p a l v e l u t + y r i t y s p a m p u t + y r i t y s p a n k k e j a + y r i t y s p a o l l e + y r i t y s p a o n + y r i t y s p i i r e i s s ä + y r i t y s p i l a r i i n + y r i t y s p o l i i t t i s i l l a + y r i t y s p o l i i t t i s t a + y r i t y s p o l i t i i k a l l e + y r i t y s p o l i t i i k a n + y r i t y s p o l i t i i k a s t a + y r i t y s p o l i t i i k k a + y r i t y s p o l i t i i k k a a + y r i t y s p o l i t i i k k a a n + y r i t y s p o l i t i i k k a m m e + y r i t y s p o t e n t i a a l i a + y r i t y s p o t e n t i a a l i n + y r i t y s p u i s t o + y r i t y s p u i s t o i s s a + y r i t y s p u i s t o j a + y r i t y s p u i s t o s s a + y r i t y s p u o l e n + y r i t y s p ä ä o m a m a r k k i n a t + y r i t y s p ä ä o m a m a r k k i n o i d e n + y r i t y s p ä ä o s a s t o + y r i t y s r a h o i t u s + y r i t y s r a k e n n e + y r i t y s r a k e n n e t t a + y r i t y s r a k e n n e t t a a n + y r i t y s r a k e n t e e n + y r i t y s r a k e n t e e n s a + y r i t y s r a k e n t e i d e n + y r i t y s r a k e n t e i t a + y r i t y s r e k i s t e r e i t ä + y r i t y s r e k i s t e r i + y r i t y s r e k i s t e r i a s e t u s + y r i t y s r e k i s t e r i e n + y r i t y s r e k i s t e r i t + y r i t y s r e k i s t e r i ä + y r i t y s r e k i s t e r ö i n n i s s ä + y r i t y s r y h m i e n + y r i t y s r y h m i l l e + y r i t y s r y h m i s s ä + y r i t y s r y h m i t t y m i e n + y r i t y s r y h m i t t y m i i n + y r i t y s r y h m i t t y m i l l e + y r i t y s r y h m i t t y m i ä + y r i t y s r y h m i t t y m ä + y r i t y s r y h m i t t y m ä t + y r i t y s r y h m ä n + y r i t y s r y h m ä t + y r i t y s r y p p ä i d e n + y r i t y s s a l a i s u u k s i a + y r i t y s s a l a i s u u k s i e n + y r i t y s s a n e e r a u s + y r i t y s s e k t o r i + y r i t y s s e k t o r i a + y r i t y s s e k t o r i l l a + y r i t y s s e k t o r i l l e + y r i t y s s e k t o r i l t a + y r i t y s s e k t o r i n + y r i t y s s e k t o r i s t a + y r i t y s s i i r r o i l l a + y r i t y s s i i r r o i s t a + y r i t y s s i i r r o t + y r i t y s s i i r t o j a + y r i t y s s i i r t o j e n + y r i t y s s i i r t y m ä p ä ä t ö k s e n + y r i t y s s o p i m u k s i a + y r i t y s s p o n s o r o i n n i l l a + y r i t y s s t r a t e g i a + y r i t y s s t r a t e g i a n + y r i t y s s t r a t e g i a n s a + y r i t y s s t r a t e g i a s t a + y r i t y s s t r a t e g i o i h i n + y r i t y s s t r a t e g i o i s s a + y r i t y s s u l a u t u m i a + y r i t y s s u u n n i t e l m i a + y r i t y s s u u n n i t e l m i e n + y r i t y s t a h o j e n + y r i t y s t a h o t + y r i t y s t a l o u d e l l i s e s t i + y r i t y s t a l o u d e l l i s i i n + y r i t y s t a l o u d e l l i s t e n + y r i t y s t a l o u d e n + y r i t y s t a l o u t t a + y r i t y s t a s o l l a + y r i t y s t a s o s t a + y r i t y s t a v o i t e t t a + y r i t y s t e n + y r i t y s t e n k i n + y r i t y s t e n k ä ä n + y r i t y s t i e t o a + y r i t y s t i e t o j a + y r i t y s t i e t o j e n + y r i t y s t i e t ä m y s t ä + y r i t y s t i l a s t o j a + y r i t y s t o i m i l u p a + y r i t y s t o i m i n n a k s i + y r i t y s t o i m i n n a l l e + y r i t y s t o i m i n n a l t a + y r i t y s t o i m i n n a n + y r i t y s t o i m i n n a s s a + y r i t y s t o i m i n n a s t a + y r i t y s t o i m i n t a + y r i t y s t o i m i n t a a + y r i t y s t o i m i n t a a n + y r i t y s t o i m i n t a a n s a + y r i t y s t o i m i n t a m m e + y r i t y s t o i m i n t a p o l i t i i k k a + y r i t y s t o i m i n t a s t r a t e g i a a n + y r i t y s t o i m i n t a y m p ä r i s t ö t + y r i t y s t o i m i n t o j a + y r i t y s t o i m i n t o j e m m e + y r i t y s t u k e a + y r i t y s t u k i + y r i t y s t u k i a + y r i t y s t u l o k s e e n + y r i t y s t u l o n + y r i t y s t u l o v e r o n + y r i t y s t u o t o s t a + y r i t y s t u t k i m u k s e s s a + y r i t y s t y y p i t + y r i t y s t ä + y r i t y s v a i k u t u s a r v i o i n t e j a + y r i t y s v a k o i l u s t a + y r i t y s v a k o i l u u n + y r i t y s v a l t a u k s i a + y r i t y s v a l t a u s d i r e k t i i v i + y r i t y s v a l t a u s d i r e k t i i v i n + y r i t y s v a l t a u s k y s y m y s t ä + y r i t y s v a p a u t t a + y r i t y s v a s t a i s t a + y r i t y s v a s t u u n + y r i t y s v a s t u u t a + y r i t y s v e r k o s t o + y r i t y s v e r k o s t o i h i n + y r i t y s v e r k o s t o j e n + y r i t y s v e r k o s t o n + y r i t y s v e r k o s t o s s a + y r i t y s v e r k o s t o t + y r i t y s v e r o + y r i t y s v e r o a + y r i t y s v e r o a s t e + y r i t y s v e r o a s t e e n + y r i t y s v e r o a s t e i s t a + y r i t y s v e r o i s t a + y r i t y s v e r o j e n + y r i t y s v e r o j ä r j e s t e l m ä + y r i t y s v e r o j ä r j e s t e l m ä m m e + y r i t y s v e r o j ä r j e s t e l m ä n + y r i t y s v e r o j ä r j e s t e l m ä t + y r i t y s v e r o k a n n a n + y r i t y s v e r o k a n n a t + y r i t y s v e r o k a n t a a + y r i t y s v e r o m m e + y r i t y s v e r o n + y r i t y s v e r o o n + y r i t y s v e r o p e r u s t a n + y r i t y s v e r o p o h j a + y r i t y s v e r o p o h j a s t a + y r i t y s v e r o p r o s e n t t i + y r i t y s v e r o t a s o l l a + y r i t y s v e r o t u k s e e n + y r i t y s v e r o t u k s e n + y r i t y s v e r o t u k s e s s a + y r i t y s v e r o t u k s e s t a + y r i t y s v e r o t u s + y r i t y s v e r o t u s m a l l i e n + y r i t y s v e r o t u s t a + y r i t y s v e t o i s e n + y r i t y s v e t o i s e t + y r i t y s v i e r a i l u i l l a + y r i t y s v o i t o t + y r i t y s v o i t t o i h i n + y r i t y s v o i t t o j e n + y r i t y s v y ö h y k k e i s t ä + y r i t y s y h t e i s ö + y r i t y s y h t e i s ö j e n + y r i t y s y h t e i s ö l l e + y r i t y s y h t e i s ö n + y r i t y s y h t e i s ö t + y r i t y s y h t e y k s i e n + y r i t y s y m p ä r i s t ö + y r i t y s y m p ä r i s t ö n + y r i t y s y m p ä r i s t ö ä + y r i t y s y m p ä r i s t ö ö n + y r i t y s y s t ä v ä l l i n e n + y r i t y s y s t ä v ä l l i s e n + y r i t ä m m e + y r i t ä m m e k i n + y r i t ä m m e k ö + y r i t ä n + y r i t ä t t e + y r t e i s t ä + y r t t i t e e n s ä + y s k i ä + y s k ä n l ä ä k e + y s k ä n p a s t i l l e j a + y s k ä n p a s t i l l i t + y s t ä v i e m m e + y s t ä v i e n + y s t ä v i e n i + y s t ä v i e n s ä + y s t ä v i i n i + y s t ä v i l l e + y s t ä v i l l e m m e + y s t ä v i s t ä ä n + y s t ä v i ä + y s t ä v i ä k i n + y s t ä v i ä m m e + y s t ä v i ä n i + y s t ä v i ä ä n + y s t ä v y y d e s t ä + y s t ä v y y s a l u e e n + y s t ä v y y s h a n k k e i t a + y s t ä v y y s k a u p u n g i t + y s t ä v y y s k a u p u n k i + y s t ä v y y s k a u p u n k i e n + y s t ä v y y s k a u p u n k i h a n k k e i d e n + y s t ä v y y s k a u p u n k i j ä r j e s t e l y + y s t ä v y y s k a u p u n k i o h j e l m i a + y s t ä v y y s k a u p u n k i t o i m i n n a n + y s t ä v y y s k a u p u n k i t o i m i n t a + y s t ä v y y s k a u p u n k i t o i m i n t a a + y s t ä v y y s k o u l u j e n + y s t ä v y y s k o u l u t o i m i n t a a + y s t ä v y y s k u m p p a n u u d e t + y s t ä v y y s k u n n i l l e + y s t ä v y y s k u n t a h a n k k e e s e e n + y s t ä v y y s k u n t a o h j e l m a + y s t ä v y y s k u n t a t o i m i n n a n + y s t ä v y y s k u n t a t o i m i n t a + y s t ä v y y s k u n t a t o i m i n t a a + y s t ä v y y s k u n t a t o i m i n t a a n + y s t ä v y y s k u n t a y h d i s t y k s i ä + y s t ä v y y s m a i d e n + y s t ä v y y s o t t e l u + y s t ä v y y s r y h m ä l l e + y s t ä v y y s r y h m ä n + y s t ä v y y s r y h m ä ä n + y s t ä v y y s s e u r a + y s t ä v y y s s e u r a n + y s t ä v y y s s o p i m u k s e l l a + y s t ä v y y s s o p i m u s + y s t ä v y y s s u h d e + y s t ä v y y s s u h t e e t + y s t ä v y y s s u h t e i t a + y s t ä v y y s v i e r a i l u n + y s t ä v y y t e n i + y s t ä v ä k a n s a + y s t ä v ä k a n s a a m m e + y s t ä v ä k a n s o j e n + y s t ä v ä l l e + y s t ä v ä l l e n i + y s t ä v ä l l i s e m m i n + y s t ä v ä l l i s e m m ä t + y s t ä v ä l l i s e m p i ä + y s t ä v ä l l i s i s t ä + y s t ä v ä l l i s i ä + y s t ä v ä l l i s m i e l i s e n + y s t ä v ä l l i s t e n + y s t ä v ä l l i s t ä + y s t ä v ä l l i s y y t t ä ä n + y s t ä v ä l t ä n i + y s t ä v ä m a a + y s t ä v ä m a a m m e + y s t ä v ä m a a n + y s t ä v ä m a a t + y s t ä v ä m a i d e n + y s t ä v ä m a i t a + y s t ä v ä m m e + y s t ä v ä n + y s t ä v ä n i + y s t ä v ä n p ä i v ä + y s t ä v ä n p ä i v ä l a h j a a + y s t ä v ä n p ä i v ä m i e l t ä + y s t ä v ä n p ä i v ä n ä + y s t ä v ä n p ä i v ä ä + y s t ä v ä n s ä + y s t ä v ä n ä + y s t ä v ä n ä ä n + y s t ä v ä p i i r i + y s t ä v ä p i i r i i m m e + y s t ä v ä p i i r i i n + y s t ä v ä p i i r i n + y s t ä v ä p i i r i n s ä + y s t ä v ä p i i r i p o l i t i i k k a + y s t ä v ä p i i r i p o l i t i i k k a a + y s t ä v ä p i i r i s t ä + y s t ä v ä s t ä ä n + y s t ä v ä t + y s t ä v ä v a l t i o i d e n + y s t ä v ä y r i t y k s e n + y s t ä v ä ä + y s t ä v ä ä m m e + y s t ä v ä ä n i + y t i m e e n + y t i m e k k ä ä m m i n + y t i m e k k ä ä m p i + y t i m e k k ä ä m p i ä + y t i m e k k ä ä m p ä n ä + y t i m e k s i + y t i m e n + y t i m e n ä + y t i m e s s ä + y t i m i ä + y t t r i u m o k s i d i + y ö a i k a + y ö a i k a a n + y ö a i k a i n e n + y ö a i l a k k i + y ö a j a n + y ö a j o k i e l t o j a + y ö a j o k i e l t o o n + y ö a p i n a + y ö a p i n a t + y ö a s u + y ö e l ä i n + y ö h a i k a r a + y ö h ä v i t t ä j ä + y ö i s t u n n o i s s a + y ö i s t u n n o i s t a + y ö i s t u n n o n + y ö i s t u n n o s s a + y ö i s t u n t o + y ö i s t u n t o a + y ö i s t u n t o i h i n + y ö i s t u n t o j a + y ö i s t u n t o j e n + y ö i s t u n t o o n + y ö j u n a a + y ö j u t t u + y ö k a i j a + y ö k a k t u k s e t + y ö k a s t e l u + y ö k e r h o + y ö k e r h o j a + y ö k e r h o n + y ö k e r h o p a l o + y ö k u l j e t u s t e n + y ö l a u t a t + y ö l e n n o i l l e + y ö l e n n o i s t a + y ö l e n n o t + y ö l e n t o + y ö l e n t o i h i n + y ö l e n t o j a + y ö l e n t o j e n + y ö l e n t o k i e l l o n + y ö l e n t o k i e l l o s t a + y ö l e n t o k i e l t o + y ö l e n t o r a j o i t u s t e n + y ö l i i t o h a u k k a + y ö l i s k o t + y ö l l ä + y ö l o k k i + y ö m e l u + y ö n k u n i n g a t a r + y ö n ä + y ö n ä k ö l a s e j a + y ö p a r t i o + y ö p e r h o n e n + y ö p i k a j u n a + y ö p y i + y ö p y m i s i ä + y ö p y m i s t ä + y ö r a u h a + y ö s s ä + y ö s y ö m i s h ä i r i ö + y ö t y ö + y ö t y ö a i k a a + y ö t y ö h ö n + y ö t y ö k i e l l o n + y ö t y ö l l e + y ö t y ö n + y ö t y ö n t e k i j ö i d e n + y ö t y ö s t ä + y ö t y ö t ä + y ö t ä + y ö t ö i t ä + y ö u n e n + y ö u n i + y ö u n i a + y ö u n i a m m e + y ö v a h d i t + y ö v a r t i j a v a l t i o + y ö v a r t i o + y ö v a r t i o s t o + y ö v u o r o i s t a + y ö v u o r o n + y ö v u o r o o n + y ö v u o r o s s a + y ö v u o r o t y ö s t ä + z e n i i t t i k a u k o p u t k i + z h u a n g i t + z i m b a b w e l a i s e t + z i m b a b w e l a i s i a + z i m b a b w e l a i s i l l e + z i m b a b w e l a i s t e n + z i r k o n i u m d i o k s i d i + z i r k o n i u m k a r b i d i + z i r k o n i u m k l o r i d i + z o m b i e l o k u v i s t a + z o m b i e t + z o o n o o s i d i r e k t i i v i i n + z o o n o o s i d i r e k t i i v i n + z o o n o o s i e n + z o o n o o s i r i s k i n + z o o n o o s i t i l a n t e e s t a + z u l u m a a + z u l u t + z u l u t ö p ö s i e p p o + ä i d e i s t ä + ä i d i k s i + ä i d i l l e + ä i d i l t ä ä n + ä i d i n + ä i d i n k i e l e e n + ä i d i n k i e l e e n s ä + ä i d i n k i e l e k s e e n + ä i d i n k i e l e l l e + ä i d i n k i e l e l l e m m e + ä i d i n k i e l e l l ä + ä i d i n k i e l e l l ä m m e + ä i d i n k i e l e l l ä n i + ä i d i n k i e l e l l ä n n e + ä i d i n k i e l e l l ä ä n + ä i d i n k i e l e m m e + ä i d i n k i e l e n + ä i d i n k i e l e n i + ä i d i n k i e l e n n e + ä i d i n k i e l e n o p e t u k s e n + ä i d i n k i e l e n s ä + ä i d i n k i e l e n ä + ä i d i n k i e l e n ä m m e + ä i d i n k i e l e n ä ä n + ä i d i n k i e l e s s ä n i + ä i d i n k i e l e s t ä + ä i d i n k i e l e s t ä ä n + ä i d i n k i e l e t + ä i d i n k i e l i + ä i d i n k i e l i i n + ä i d i n k i e l i l l e e n + ä i d i n k i e l i l l ä + ä i d i n k i e l i l l ä ä n + ä i d i n k i e l i n e n + ä i d i n k i e l i s e l l ä + ä i d i n k i e l i s e n + ä i d i n k i e l i s i i n + ä i d i n k i e l i s i s s ä + ä i d i n k i e l i s t ä + ä i d i n k i e l i ä ä n + ä i d i n k i e l t e n + ä i d i n k i e l t ä + ä i d i n k i e l t ä m m e + ä i d i n k i e l t ä n i + ä i d i n k i e l t ä ä n + ä i d i n m a i d o n + ä i d i n m a i d o n k o r v i k e + ä i d i n m a i d o n k o r v i k e t t a + ä i d i n m a i d o n k o r v i k k e e l l e + ä i d i n m a i d o n k o r v i k k e e n + ä i d i n m a i d o n k o r v i k k e i d e n + ä i d i n m a i d o n k o r v i k k e i s i i n + ä i d i n m a i d o n k o r v i k k e i t a + ä i d i n m a i d o n v a s t i k e + ä i d i n m a i d o s s a + ä i d i n m a i d o t + ä i d i n m a i t o + ä i d i n m a i t o o n + ä i d i n m a i t o t u o t e t t a + ä i d i n v a i s t o a + ä i d i n ä i d i n + ä i d i s t ä n i + ä i d i t + ä i m ä r u o h o + ä i t e j ä + ä i t i e n + ä i t i e n p ä i v ä + ä i t i j u m a l a t a r + ä i t i k u o l l e i s u u d e n + ä i t i k u o l l e i s u u d e s t a + ä i t i k u o l l e i s u u s + ä i t i m a a l l e + ä i t i n i + ä i t i n ä + ä i t i y d e l l e + ä i t i y d e n + ä i t i y s a j a l t a + ä i t i y s a v u s t u s t a + ä i t i y s d i r e k t i i v i n + ä i t i y s e d u t + ä i t i y s e l ä k e + ä i t i y s e t u u d e n + ä i t i y s e t u u k s i i n + ä i t i y s e t u u t t a + ä i t i y s h u o l t o + ä i t i y s k o r v a u k s e e n + ä i t i y s k o r v a u k s e n + ä i t i y s k o r v a u s t e n + ä i t i y s k u o l e m a t + ä i t i y s k u o l e m i s t a + ä i t i y s k u o l l e i s u u d e n + ä i t i y s k u o l l e i s u u d e s t a + ä i t i y s k u o l l e i s u u s + ä i t i y s k u o l l e i s u u s a s t e + ä i t i y s k u o l l e i s u u s l u k u j a + ä i t i y s k u o l l e i s u u s t a p a u k s e s t a + ä i t i y s k u o l l e i s u u t t a + ä i t i y s l a k e j a + ä i t i y s l o m a + ä i t i y s l o m a a + ä i t i y s l o m a a n + ä i t i y s l o m a d i r e k t i i v i + ä i t i y s l o m a d i r e k t i i v i n + ä i t i y s l o m a d i r e k t i i v i ä + ä i t i y s l o m a e h d o i n + ä i t i y s l o m a k o r v a u s t e n + ä i t i y s l o m a k u s t a n n u k s e t + ä i t i y s l o m a l l a + ä i t i y s l o m a l t a + ä i t i y s l o m a n + ä i t i y s l o m a o i k e u d e n + ä i t i y s l o m a s t a + ä i t i y s l o m a t + ä i t i y s l o m a v a p a a t a + ä i t i y s l o m i a + ä i t i y s l o m i l l a + ä i t i y s n e u v o l a a + ä i t i y s o i k e u k s i s t a + ä i t i y s p a k k a u s + ä i t i y s p o l i t i i k k o j e n + ä i t i y s p ä i v ä r a h a a + ä i t i y s r a h a + ä i t i y s r a h a a + ä i t i y s r a h a a n + ä i t i y s r a h a n + ä i t i y s s u o j e l u + ä i t i y s s u o j e l u a + ä i t i y s s u o j e l u s t a + ä i t i y s s ä ä n n ö k s e s s ä + ä i t i y s s ä ä n n ö k s e s t ä + ä i t i y s s ä ä n n ö s t ä + ä i t i y s t u e n + ä i t i y s t u k i + ä i t i y s t u r v a + ä i t i y s t u r v a a + ä i t i y s t u r v a a n + ä i t i y s t u r v a n + ä i t i y s t u r v a s s a + ä i t i y s t u r v a s t a + ä i t i y s v a k u u t u s t a + ä i t i y s v a p a a + ä i t i y s v a p a a d i r e k t i i v i i n + ä i t i y s v a p a a d i r e k t i i v i n + ä i t i y s v a p a a d i r e k t i i v i s t ä + ä i t i y s v a p a a j ä r j e s t e l m i ä + ä i t i y s v a p a a j ä r j e s t e l m ä + ä i t i y s v a p a a k s i + ä i t i y s v a p a a l l a + ä i t i y s v a p a a l l e + ä i t i y s v a p a a l t a + ä i t i y s v a p a a n + ä i t i y s v a p a a n s a + ä i t i y s v a p a a s e e n + ä i t i y s v a p a a s t a + ä i t i y s v a p a a t a + ä i t i y s v a p a a t a a n + ä i t i y s v a p a i d e n + ä i t i y s v a p a u t t a + ä i t i y t e e n + ä i t i y t t ä + ä k i l l i s e m m i n + ä k i l l i s e m m ä l l e + ä k i l l i s i s t ä + ä k i l l i s t e n + ä k k i k u o l e m a + ä k k i k u o l e m a s t a + ä k k i k u o l e m i i n + ä k k i p ä ä t ö k s i ä + ä k k i t u l v a + ä l l i s t y t t ä v i ä + ä l l i s t y t t ä v ä m p ä ä + ä l l i s t y t t ä v ä ä + ä l y a j o n e u v o + ä l y a j o n e u v o j e n + ä l y a j o n e u v o j ä r j e s t e l m i s t ä + ä l y a u t o + ä l y a u t o a + ä l y a u t o a l o i t e + ä l y a u t o a l o i t e t t a + ä l y a u t o a l o i t t e e s e e n + ä l y a u t o a l o i t t e e s s a + ä l y a u t o a l o i t t e e s t a + ä l y a u t o i s t a + ä l y a u t o j a + ä l y a u t o j e n + ä l y a u t o j ä r j e s t e l m i e n + ä l y a u t o j ä r j e s t e l m i l l ä + ä l y a u t o j ä r j e s t e l m ä l l ä + ä l y a u t o l l a + ä l y a u t o m i e t i n t ö + ä l y a u t o n + ä l y a u t o s t a + ä l y a u t o t e k n i i k a l l a + ä l y a u t o y m p ä r i s t ö n + ä l y k k y y d e s t ä + ä l y k k y y s o s a m ä ä r ä + ä l y k k y y t e e n + ä l y k k y y t t ä m m e + ä l y k k y y t t ä n i + ä l y k k ä i d e n + ä l y k k ä i l l ä + ä l y k k ä i s s ä + ä l y k k ä i s t ä + ä l y k k ä i t ä + ä l y k k ä ä l l e + ä l y k k ä ä l l ä + ä l y k k ä ä m m i k s i + ä l y k k ä ä m m i n + ä l y k k ä ä m m ä l l ä + ä l y k k ä ä m m ä t + ä l y k k ä ä m p i ä + ä l y k k ä ä m p ä ä + ä l y k k ä ä n + ä l y k k ä ä s s ä + ä l y k k ä ä s t ä + ä l y k k ä ä t + ä l y k o r t i l l a + ä l y k o r t i n + ä l y k o r t i t + ä l y k o r t t e i h i n + ä l y k o r t t e j a + ä l y k o r t t i + ä l y k o r t t i e n + ä l y k o r t t i t e k n i i k a s s a + ä l y k o r t t i t e k n o l o g i a n + ä l y k o r t t i t o i m e s t a + ä l y k ä s t ä + ä l y l l i s e e n + ä l y m i t t a r e i d e n + ä l y m i t t a r e i t a + ä l y m i t t a r i h a n k e t t a + ä l y m o n o p o l i s t a + ä l y m y s t ö ä + ä l y p u h e l i m i a + ä l y p u h e l i m i e n + ä l y p u h e l i n t e n + ä l y p u s k u r e i t a + ä l y p ä ä t + ä l y t e k n i i k k a + ä l y t e k n i i k k a a + ä l y t e k n o l o g i a a n + ä l y t e k n o l o g i a n + ä l y t i e t o + ä l y t t ö m y y k s i ä + ä l y v a a t t e e s s a + ä l y v e r k k o + ä l y v e r k k o j e n + ä l y v e r k o t + ä m m ä n l ä n g e t + ä m m ä n s o l m u + ä r s y t t ä v i n t ä + ä r s y t t ä v i ä + ä r s y t t ä v ä m p ä ä + ä r s y t t ä v ä t + ä r s y t t ä v ä ä + ä r s y t t ä ä + ä r s y y n t y ä k s e n i + ä r t y m y s t ä + ä s k e i s e e n + ä s k e i s e s s ä + ä s k e i s i s t ä + ä s k e i s t ä + ä s k e t t ä i s e l l ä + ä s k e t t ä i s e n + ä s k e t t ä i s e s s ä + ä s k e t t ä i s e s t ä + ä s k e t t ä i s e t + ä s k e t t ä i s i m p ä n ä + ä s k e t t ä i s i s s ä + ä s k e t t ä i s i s t ä + ä s k e t t ä i s t e n + ä s s i s t ä + ä y r i ä i s h u u h k a j a + ä y r i ä i s i l l ä + ä y r i ä i s i s t ä + ä y r i ä i s i ä + ä y r i ä i s k a n t o j a + ä y r i ä i s t e n p y y n t i a l u k s i l l e + ä y r ä i d e n + ä y s k ä r ö i d ä + ä ä n e k k ä i m m i n + ä ä n e k k ä i m m ä t + ä ä n e k k ä i m p i e n + ä ä n e k k ä i s i i n + ä ä n e k k ä ä m m i n + ä ä n e k k ä ä m p i ä + ä ä n e l l ä + ä ä n e l l ä n i + ä ä n e m m e + ä ä n e n + ä ä n e n i + ä ä n e n m u r r o s + ä ä n e n n e + ä ä n e n p a i n e + ä ä n e n s ä + ä ä n e n s ä v y + ä ä n e n s ä v y l l ä + ä ä n e n s ä v y ä + ä ä n e n t o i s t o + ä ä n e n t o i s t o j ä r j e s t e l m ä s t ä + ä ä n e n t u n n i s t u s o h j e l m i a + ä ä n e n v a i m e n n i n a s e t u s t a + ä ä n e n v o i m a k k u u s + ä ä n e s t e t t i i n + ä ä n e s t e t t y + ä ä n e s t e t t y ä + ä ä n e s t e t t y ä n i + ä ä n e s t e t t y ä ä n + ä ä n e s t e t t ä e s s ä + ä ä n e s t e t t ä i s i i n + ä ä n e s t e t t ä v ä k s e n n e + ä ä n e s t e t t ä v ä k s i + ä ä n e s t e t t ä v ä n + ä ä n e s t e t t ä v ä n ä n n e + ä ä n e s t e t t ä v ä ä + ä ä n e s t e t ä + ä ä n e s t e t ä ä n + ä ä n e s t e t ä ä n k ö + ä ä n e s t i + ä ä n e s t i k i n + ä ä n e s t i m m e + ä ä n e s t i m m e k i n + ä ä n e s t i n + ä ä n e s t i n k i n + ä ä n e s t i t t e + ä ä n e s t i v ä t + ä ä n e s t y k s e e n + ä ä n e s t y k s e l l ä + ä ä n e s t y k s e l l ä n i + ä ä n e s t y k s e l t ä + ä ä n e s t y k s e m m e + ä ä n e s t y k s e n + ä ä n e s t y k s e n n e + ä ä n e s t y k s e n s ä + ä ä n e s t y k s e s s ä + ä ä n e s t y k s e s s ä m m e + ä ä n e s t y k s e s s ä ä n + ä ä n e s t y k s e s t ä + ä ä n e s t y k s e s t ä k i n + ä ä n e s t y k s e t + ä ä n e s t y k s i e m m e + ä ä n e s t y k s i e n + ä ä n e s t y k s i i n + ä ä n e s t y k s i l l ä + ä ä n e s t y k s i l t ä + ä ä n e s t y k s i s s ä + ä ä n e s t y k s i s t ä + ä ä n e s t y k s i ä + ä ä n e s t y s a i k a + ä ä n e s t y s a i k a a + ä ä n e s t y s a i k a a n + ä ä n e s t y s a i k a n a + ä ä n e s t y s a i k e i t a + ä ä n e s t y s a i k o j a + ä ä n e s t y s a i k o j e n + ä ä n e s t y s a i k o m u k s i a n i + ä ä n e s t y s a j a n + ä ä n e s t y s a j a n k o h t a + ä ä n e s t y s a j a n k o h t a a + ä ä n e s t y s a j a n k o h t a n a + ä ä n e s t y s a j a t + ä ä n e s t y s a j o i s t a + ä ä n e s t y s a k t i i v i s u u d e n + ä ä n e s t y s a k t i i v i s u u d e s t a + ä ä n e s t y s a k t i i v i s u u s + ä ä n e s t y s a k t i i v i s u u t e e n + ä ä n e s t y s a s e n t o o n + ä ä n e s t y s a s i a + ä ä n e s t y s a s i a k i r j o i s s a + ä ä n e s t y s a s i a k i r j o j e n + ä ä n e s t y s a s i a s t a + ä ä n e s t y s a s i o i s s a + ä ä n e s t y s e h d o t u k s i a + ä ä n e s t y s e h d o t u s t a n i + ä ä n e s t y s f i l o s o f i a m m e + ä ä n e s t y s h e t k e e n + ä ä n e s t y s h e t k e l l ä + ä ä n e s t y s h ä n + ä ä n e s t y s i k ä i s i ä + ä ä n e s t y s i k ä r a j a a + ä ä n e s t y s i k ä ä + ä ä n e s t y s i l m o i t u k s e n + ä ä n e s t y s i s t u n n o n + ä ä n e s t y s i s t u n n o s s a + ä ä n e s t y s i s t u n t o + ä ä n e s t y s i ä s t ä + ä ä n e s t y s j a k s o n + ä ä n e s t y s j ä r j e s t e l m i s s ä + ä ä n e s t y s j ä r j e s t e l m i s t ä + ä ä n e s t y s j ä r j e s t e l m i ä + ä ä n e s t y s j ä r j e s t e l m ä + ä ä n e s t y s j ä r j e s t e l m ä l l ä + ä ä n e s t y s j ä r j e s t e l m ä n + ä ä n e s t y s j ä r j e s t e l m ä s s ä + ä ä n e s t y s j ä r j e s t e l m ä s s ä m m e + ä ä n e s t y s j ä r j e s t e l m ä s t ä + ä ä n e s t y s j ä r j e s t e l m ä ä + ä ä n e s t y s j ä r j e s t e l m ä ä n + ä ä n e s t y s j ä r j e s t e l y i s t ä + ä ä n e s t y s j ä r j e s t e l y t + ä ä n e s t y s j ä r j e s t e l y ä + ä ä n e s t y s j ä r j e s t y k s e e n + ä ä n e s t y s j ä r j e s t y k s e m m e + ä ä n e s t y s j ä r j e s t y k s e n + ä ä n e s t y s j ä r j e s t y k s e s s ä + ä ä n e s t y s j ä r j e s t y k s e s t ä + ä ä n e s t y s j ä r j e s t y s + ä ä n e s t y s j ä r j e s t y s t ä + ä ä n e s t y s k e s k u s t e l u + ä ä n e s t y s k i e l l o n + ä ä n e s t y s k i e r r o k s e l l a + ä ä n e s t y s k i e r r o k s e l l e + ä ä n e s t y s k i e r r o k s e n + ä ä n e s t y s k i e r r o k s i s t a + ä ä n e s t y s k i e r r o s + ä ä n e s t y s k o n e + ä ä n e s t y s k o n e e n i + ä ä n e s t y s k o n e e s s a + ä ä n e s t y s k o n e e t + ä ä n e s t y s k o p e i l l a + ä ä n e s t y s k o p e i s t a + ä ä n e s t y s k o p i s s a + ä ä n e s t y s k o p p e i h i n + ä ä n e s t y s k o p p i i n + ä ä n e s t y s k o r t i n + ä ä n e s t y s k o r t i t + ä ä n e s t y s k o r t t e j a + ä ä n e s t y s k o r t t i + ä ä n e s t y s k o r t t i a n i + ä ä n e s t y s k o r t t i e n + ä ä n e s t y s k o r t t i n i + ä ä n e s t y s k o r t t i n n e + ä ä n e s t y s k o r t t i n s a + ä ä n e s t y s k o u l u t u s t a + ä ä n e s t y s k u l t t u u r i t + ä ä n e s t y s k u u m e + ä ä n e s t y s k y n n y s + ä ä n e s t y s k ä y t t ä y t y m i n e n + ä ä n e s t y s k ä y t t ä y t y m i s e e n + ä ä n e s t y s k ä y t t ä y t y m i s e l l e n i + ä ä n e s t y s k ä y t t ä y t y m i s e l l ä m m e + ä ä n e s t y s k ä y t t ä y t y m i s e l l ä n i + ä ä n e s t y s k ä y t t ä y t y m i s e m m e + ä ä n e s t y s k ä y t t ä y t y m i s e n + ä ä n e s t y s k ä y t t ä y t y m i s e n i + ä ä n e s t y s k ä y t t ä y t y m i s e n s ä + ä ä n e s t y s k ä y t t ä y t y m i s e s s ä m m e + ä ä n e s t y s k ä y t t ä y t y m i s e s s ä n i + ä ä n e s t y s k ä y t t ä y t y m i s e s t ä + ä ä n e s t y s k ä y t t ä y t y m i s e s t ä m m e + ä ä n e s t y s k ä y t t ä y t y m i s e s t ä n i + ä ä n e s t y s k ä y t t ä y t y m i s e s t ä ä n + ä ä n e s t y s k ä y t t ä y t y m i s t ä + ä ä n e s t y s k ä y t t ä y t y m i s t ä ä n + ä ä n e s t y s k ä y t ä n t ö ä + ä ä n e s t y s k ä y t ä n t ö ö n + ä ä n e s t y s l a a t i k o t + ä ä n e s t y s l a i t t e e n i + ä ä n e s t y s l a i t t e e s e e n + ä ä n e s t y s l a i t t e e s t a n i + ä ä n e s t y s l a i t t e i s t o + ä ä n e s t y s l a i t t e i s t o m m e + ä ä n e s t y s l a i t t e i t a + ä ä n e s t y s l i p p u + ä ä n e s t y s l i p p u i h i n + ä ä n e s t y s l i p p u j a + ä ä n e s t y s l i p p u j a a n + ä ä n e s t y s l i p p u j e n + ä ä n e s t y s l i p u i s s a + ä ä n e s t y s l i p u i s t a + ä ä n e s t y s l i p u k k e e l l a a n + ä ä n e s t y s l i p u k k e e s s a + ä ä n e s t y s l i p u k k e i d e n + ä ä n e s t y s l i p u k k e i s s a + ä ä n e s t y s l i p u l l a a n + ä ä n e s t y s l i p u n + ä ä n e s t y s l i p u t + ä ä n e s t y s l i s t a + ä ä n e s t y s l i s t a a + ä ä n e s t y s l i s t a a n + ä ä n e s t y s l i s t a a n i + ä ä n e s t y s l i s t a a n n e + ä ä n e s t y s l i s t a k i n + ä ä n e s t y s l i s t a l l a + ä ä n e s t y s l i s t a l l a n n e + ä ä n e s t y s l i s t a l l e + ä ä n e s t y s l i s t a m m e + ä ä n e s t y s l i s t a n + ä ä n e s t y s l i s t a n i + ä ä n e s t y s l i s t a s s a + ä ä n e s t y s l i s t a s s a m m e + ä ä n e s t y s l i s t a s s a n n e + ä ä n e s t y s l i s t a s t a + ä ä n e s t y s l i s t a t + ä ä n e s t y s l i s t o i l l a a n + ä ä n e s t y s l i s t o i s s a + ä ä n e s t y s l i s t o j a + ä ä n e s t y s l o m a k k e i t a + ä ä n e s t y s l u e t t e l o + ä ä n e s t y s l u e t t e l o a + ä ä n e s t y s l u e t t e l o a m m e + ä ä n e s t y s l u e t t e l o i d e n + ä ä n e s t y s l u e t t e l o i h i n + ä ä n e s t y s l u e t t e l o i s s a + ä ä n e s t y s l u e t t e l o i s s a m m e + ä ä n e s t y s l u e t t e l o i s s a n n e + ä ä n e s t y s l u e t t e l o i t a + ä ä n e s t y s l u e t t e l o i t a a n + ä ä n e s t y s l u e t t e l o i t a n n e + ä ä n e s t y s l u e t t e l o j a + ä ä n e s t y s l u e t t e l o j e m m e + ä ä n e s t y s l u e t t e l o j e n + ä ä n e s t y s l u e t t e l o m m e + ä ä n e s t y s l u e t t e l o n + ä ä n e s t y s l u e t t e l o n n e + ä ä n e s t y s l u e t t e l o o m m e + ä ä n e s t y s l u e t t e l o o n + ä ä n e s t y s l u e t t e l o o n i + ä ä n e s t y s l u e t t e l o s s a + ä ä n e s t y s l u e t t e l o s s a m m e + ä ä n e s t y s l u e t t e l o s s a n i + ä ä n e s t y s l u e t t e l o s t a + ä ä n e s t y s l u e t t e l o s t a k i n + ä ä n e s t y s l u e t t e l o s t a n n e + ä ä n e s t y s l u e t t e l o t + ä ä n e s t y s l u k u j e n + ä ä n e s t y s l u v u t + ä ä n e s t y s m a h d o l l i s u u d e s t a + ä ä n e s t y s m a h d o l l i s u u k s i a + ä ä n e s t y s m e k a n i s m i n + ä ä n e s t y s m e n e t e l m i e n + ä ä n e s t y s m e n e t e l m ä + ä ä n e s t y s m e n e t t e l y + ä ä n e s t y s m e n e t t e l y i h i m m e + ä ä n e s t y s m e n e t t e l y i l l ä ä n + ä ä n e s t y s m e n e t t e l y i s s ä + ä ä n e s t y s m e n e t t e l y i s t ä + ä ä n e s t y s m e n e t t e l y j e n + ä ä n e s t y s m e n e t t e l y j ä + ä ä n e s t y s m e n e t t e l y l t ä + ä ä n e s t y s m e n e t t e l y n + ä ä n e s t y s m e n e t t e l y s s ä + ä ä n e s t y s m e n e t t e l y s s ä m m e + ä ä n e s t y s m e n e t t e l y s t ä + ä ä n e s t y s m e n e t t e l y t + ä ä n e s t y s m e n e t t e l y y n + ä ä n e s t y s m e n e t t e l y ä + ä ä n e s t y s n a p p i a + ä ä n e s t y s n a p p u l a n i + ä ä n e s t y s o h j e + ä ä n e s t y s o h j e i t a + ä ä n e s t y s o h j e l m a + ä ä n e s t y s o h j e l m a n + ä ä n e s t y s o i k e u d e n + ä ä n e s t y s o i k e u d e s t a + ä ä n e s t y s o i k e u d e s t a k i n + ä ä n e s t y s o i k e u d e t + ä ä n e s t y s o i k e u k s i a + ä ä n e s t y s o i k e u k s i e n + ä ä n e s t y s o i k e u k s i s t a + ä ä n e s t y s o i k e u s + ä ä n e s t y s o i k e u t e e n + ä ä n e s t y s o i k e u t t a + ä ä n e s t y s o i k e u t t a a n + ä ä n e s t y s o r g i a a n + ä ä n e s t y s o s u u k s i e n + ä ä n e s t y s p a i k a l l e + ä ä n e s t y s p a i k a t + ä ä n e s t y s p a i k k a a + ä ä n e s t y s p a i k k a k o h t a i s e s t i + ä ä n e s t y s p a i k k o j a + ä ä n e s t y s p a i k k o j e n + ä ä n e s t y s p a i k o i l l a + ä ä n e s t y s p a i k o i l l e + ä ä n e s t y s p a i k o i l t a + ä ä n e s t y s p a i k o i s s a + ä ä n e s t y s p a k o n + ä ä n e s t y s p a k o s t a + ä ä n e s t y s p a l v e l u j a + ä ä n e s t y s p a p e r e i s s a m m e + ä ä n e s t y s p a p e r e i t a + ä ä n e s t y s p e r i a a t t e i s i i n + ä ä n e s t y s p e r u s t e e n i + ä ä n e s t y s p e r u s t e l u n i + ä ä n e s t y s p i s t e e k s i + ä ä n e s t y s p o h j a n + ä ä n e s t y s p o l i t i i k k a + ä ä n e s t y s p r o s e n t i n + ä ä n e s t y s p r o s e n t i s t a + ä ä n e s t y s p r o s e n t t i + ä ä n e s t y s p r o s e n t t i i n + ä ä n e s t y s p r o s e s s i + ä ä n e s t y s p r o s e s s i a + ä ä n e s t y s p r o s e s s i n + ä ä n e s t y s p r o s e s s i s s a + ä ä n e s t y s p ä i v ä + ä ä n e s t y s p ä i v ä m ä ä r ä ä + ä ä n e s t y s p ä i v ä n + ä ä n e s t y s p ä i v ä n ä + ä ä n e s t y s p ä i v ä n ä m m e + ä ä n e s t y s p ä i v ä ä + ä ä n e s t y s p ä ä t ö k s e m m e + ä ä n e s t y s p ä ä t ö k s e n i + ä ä n e s t y s p ä ä t ö k s e s s ä + ä ä n e s t y s p ä ä t ö s + ä ä n e s t y s p ä ä t ö s t ä + ä ä n e s t y s p ä ä t ö s t ä n i + ä ä n e s t y s p ö y t ä k i r j a t + ä ä n e s t y s r a j o i t u k s i n + ä ä n e s t y s r e k i s t e r e i s t ä + ä ä n e s t y s r e k i s t e r ö i n t i ä + ä ä n e s t y s r o b o t t e j a + ä ä n e s t y s r y h m ä s s ä + ä ä n e s t y s s a l a i s u u d e s t a + ä ä n e s t y s s e k a a n n u k s e n + ä ä n e s t y s s e l i t y k s e e n + ä ä n e s t y s s e l i t y k s e e n i + ä ä n e s t y s s e l i t y k s e e n n e + ä ä n e s t y s s e l i t y k s e k s i + ä ä n e s t y s s e l i t y k s e l l e + ä ä n e s t y s s e l i t y k s e l l ä + ä ä n e s t y s s e l i t y k s e m m e + ä ä n e s t y s s e l i t y k s e n + ä ä n e s t y s s e l i t y k s e n i + ä ä n e s t y s s e l i t y k s e n n e + ä ä n e s t y s s e l i t y k s e n s ä + ä ä n e s t y s s e l i t y k s e n ä + ä ä n e s t y s s e l i t y k s e s s ä + ä ä n e s t y s s e l i t y k s e s s ä n i + ä ä n e s t y s s e l i t y k s e s s ä n n e + ä ä n e s t y s s e l i t y k s e s s ä s i + ä ä n e s t y s s e l i t y k s e s t ä + ä ä n e s t y s s e l i t y k s e t + ä ä n e s t y s s e l i t y k s i i n + ä ä n e s t y s s e l i t y k s i n ä + ä ä n e s t y s s e l i t y k s i s s ä + ä ä n e s t y s s e l i t y k s i s s ä ä n + ä ä n e s t y s s e l i t y k s i s t ä + ä ä n e s t y s s e l i t y k s i ä + ä ä n e s t y s s e l i t y k s i ä n i + ä ä n e s t y s s e l i t y s + ä ä n e s t y s s e l i t y s m e n e t t e l y s t ä + ä ä n e s t y s s e l i t y s p u h e e n v u o r o j e n + ä ä n e s t y s s e l i t y s p y y n t ö ä + ä ä n e s t y s s e l i t y s s ä ä n t ö j ä + ä ä n e s t y s s e l i t y s t e n + ä ä n e s t y s s e l i t y s t e n i + ä ä n e s t y s s e l i t y s t ä + ä ä n e s t y s s e l i t y s t ä n i + ä ä n e s t y s s e l i t y s t ä ä n + ä ä n e s t y s s e l o s t u k s e n + ä ä n e s t y s s e l o s t u k s e s s a + ä ä n e s t y s s t r a t e g i a m m e + ä ä n e s t y s s u o s i t u k s e t + ä ä n e s t y s s u o s i t u k s i a + ä ä n e s t y s s u o s i t u s t a + ä ä n e s t y s s ä ä n n ö i s t ä + ä ä n e s t y s s ä ä n n ö n + ä ä n e s t y s s ä ä n n ö t + ä ä n e s t y s s ä ä n t ö j e n + ä ä n e s t y s s ä ä n t ö j ä + ä ä n e s t y s t a p a + ä ä n e s t y s t a p a a + ä ä n e s t y s t a p a a m m e + ä ä n e s t y s t a p o j e n + ä ä n e s t y s t a v a s t a + ä ä n e s t y s t e n + ä ä n e s t y s t e n n e + ä ä n e s t y s t i e t o j e n + ä ä n e s t y s t i l a n t e e s s a + ä ä n e s t y s t u l o k s e e n + ä ä n e s t y s t u l o k s e n + ä ä n e s t y s t u l o k s e s t a + ä ä n e s t y s t u l o k s e t + ä ä n e s t y s t u l o k s i a + ä ä n e s t y s t u l o k s i i n + ä ä n e s t y s t u l o k s i s t a + ä ä n e s t y s t u l o s + ä ä n e s t y s t u l o s l i s t o i s s a + ä ä n e s t y s t u l o s t a + ä ä n e s t y s t u l o s t e n + ä ä n e s t y s t u n n i l l a + ä ä n e s t y s t u n t i + ä ä n e s t y s t ä + ä ä n e s t y s t ä n i + ä ä n e s t y s u u r n i e n + ä ä n e s t y s v a a t i m u k s i i n + ä ä n e s t y s v a i h e e s s a + ä ä n e s t y s v a l t a + ä ä n e s t y s v a l t a a n + ä ä n e s t y s v a p a u s + ä ä n e s t y s v a p a u t t a n n e + ä ä n e s t y s v e l v o l l i s u u s + ä ä n e s t y s v e l v o l l i s u u t t a + ä ä n e s t y s v i l k k a u d e l l a + ä ä n e s t y s v i l k k a u d e n + ä ä n e s t y s v i l k k a u s + ä ä n e s t y s v i l k k a u t t a + ä ä n e s t y s v i l p p i + ä ä n e s t y t t ä ä + ä ä n e s t ä e s s ä + ä ä n e s t ä e s s ä m m e + ä ä n e s t ä e s s ä n i + ä ä n e s t ä e s s ä n n e + ä ä n e s t ä e s s ä ä n + ä ä n e s t ä i s i + ä ä n e s t ä i s i m m e + ä ä n e s t ä i s i n + ä ä n e s t ä i s i n k ö + ä ä n e s t ä i s i t t e + ä ä n e s t ä i s i v ä t + ä ä n e s t ä j i e m m e + ä ä n e s t ä j i e n + ä ä n e s t ä j i e n i + ä ä n e s t ä j i e n s ä + ä ä n e s t ä j i e n s ä k i n + ä ä n e s t ä j i i n + ä ä n e s t ä j i l l e + ä ä n e s t ä j i l l e e n + ä ä n e s t ä j i l l e m m e + ä ä n e s t ä j i l l e n i + ä ä n e s t ä j i l t ä + ä ä n e s t ä j i s t ä + ä ä n e s t ä j i s t ä m m e + ä ä n e s t ä j i s t ä ä n + ä ä n e s t ä j i ä + ä ä n e s t ä j i ä m m e + ä ä n e s t ä j ä k s i + ä ä n e s t ä j ä l l e n i + ä ä n e s t ä j ä l u e t t e l o + ä ä n e s t ä j ä l u e t t e l o i d e n + ä ä n e s t ä j ä m m e + ä ä n e s t ä j ä m ä ä r ä + ä ä n e s t ä j ä m ä ä r ä ä + ä ä n e s t ä j ä n s ä + ä ä n e s t ä j ä r e k i s t e r i n + ä ä n e s t ä j ä r y h m ä + ä ä n e s t ä j ä t + ä ä n e s t ä j ä ä + ä ä n e s t ä k ä ä + ä ä n e s t ä k ä ä m m e + ä ä n e s t ä m i e n + ä ä n e s t ä m i n e n + ä ä n e s t ä m i s e n + ä ä n e s t ä m i s e s t ä + ä ä n e s t ä m i s t ä + ä ä n e s t ä m m e + ä ä n e s t ä m m e k i n + ä ä n e s t ä m m e k ö + ä ä n e s t ä m ä l l ä + ä ä n e s t ä m ä n + ä ä n e s t ä m ä s s ä + ä ä n e s t ä m ä s s ä m m e + ä ä n e s t ä m ä s t ä + ä ä n e s t ä m ä t t ä + ä ä n e s t ä m ä ä n + ä ä n e s t ä n + ä ä n e s t ä n e e n i + ä ä n e s t ä n e e n s ä + ä ä n e s t ä n e e t + ä ä n e s t ä n e i d e n + ä ä n e s t ä n e i l l ä + ä ä n e s t ä n e i s t ä + ä ä n e s t ä n k i n + ä ä n e s t ä n y t + ä ä n e s t ä n y t k ä ä n + ä ä n e s t ä t t e + ä ä n e s t ä t t e k ö + ä ä n e s t ä v ä n + ä ä n e s t ä v ä t + ä ä n e s t ä ä + ä ä n e s t ä ä k ö + ä ä n e t + ä ä n e t t ä + ä ä n e t t ö m ä t + ä ä n i a a l l o t + ä ä n i a r k i s t o j a + ä ä n i e n + ä ä n i e n e m m i s t ö l l ä + ä ä n i e n e m m i s t ö ä + ä ä n i e r o a + ä ä n i h u u l e n n e + ä ä n i h u u l e t + ä ä n i h u u l i h a l v a u s + ä ä n i i n + ä ä n i j a k a u m a n + ä ä n i k e r t a + ä ä n i k i i n t i ö i s t ä + ä ä n i k i r j o i h i n + ä ä n i k o r t t i + ä ä n i k y n n y k s e n ä + ä ä n i k y n n y k s i ä + ä ä n i k y n n y s + ä ä n i k y n n y s t ä + ä ä n i l a j i s s a + ä ä n i l l e + ä ä n i l ä h d e + ä ä n i m a t e r i a a l i a + ä ä n i m e i s s e l i + ä ä n i m e r k k e j ä + ä ä n i m e r k k i + ä ä n i m ä ä r i ä + ä ä n i m ä ä r ä + ä ä n i m ä ä r ä l l ä + ä ä n i m ä ä r ä n + ä ä n i m ä ä r ä t + ä ä n i m ä ä r ä ä + ä ä n i n + ä ä n i n o r m i e n + ä ä n i o i k e u d e l l a + ä ä n i o i k e u d e l l e + ä ä n i o i k e u d e n + ä ä n i o i k e u d e s t a + ä ä n i o i k e u d e t + ä ä n i o i k e u d e t t o m i a + ä ä n i o i k e u k s i a + ä ä n i o i k e u k s i a a n + ä ä n i o i k e u k s i e n + ä ä n i o i k e u s + ä ä n i o i k e u s l i i k e + ä ä n i o i k e u s o s a k k e i s t a + ä ä n i o i k e u s r e k i s t e r e i t ä + ä ä n i o i k e u t e e n + ä ä n i o i k e u t e n s a + ä ä n i o i k e u t e t t u + ä ä n i o i k e u t e t t u j a + ä ä n i o i k e u t e t u i s t a + ä ä n i o i k e u t e t u n + ä ä n i o i k e u t t a + ä ä n i o i k e u t t a a n + ä ä n i o i k e u t t a m m e + ä ä n i o s u u k s i s t a + ä ä n i o s u u s + ä ä n i p e l i + ä ä n i p u h e l u i s t a + ä ä n i p ä ä s t ö j e n + ä ä n i r a s i a + ä ä n i r a u t a + ä ä n i r a u t a p i a n o + ä ä n i s a a s t e e l l e + ä ä n i s j o k i + ä ä n i s l a h t i + ä ä n i s t u d i o + ä ä n i s t ä + ä ä n i t a i d e + ä ä n i t a l l e n t e i d e n + ä ä n i t e t e o l l i s u u d e l l e + ä ä n i t e t e o l l i s u u s + ä ä n i t e t u o t t a j a + ä ä n i t e t u o t t a j a t + ä ä n i t e t u o t t a j i e n + ä ä n i t i l a a n + ä ä n i t i l a n + ä ä n i t o r v e a + ä ä n i t o r v e n a + ä ä n i t y s s t u d i o + ä ä n i v a a t i m u s t e n + ä ä n i v a l l a n + ä ä n i v a l l a s t a a n + ä ä n i v a l l a t o n t a + ä ä n i v a l l a t t o m i a + ä ä n i v a l l i + ä ä n i v a l t a + ä ä n i v a l t a a + ä ä n i v a l t a a n + ä ä n i v a l t a i n e n + ä ä n i v a l t a i s e k s i + ä ä n i v a l t a i s i a + ä ä n i v a l t a s u h t e i d e n + ä ä n i v a l t a s u h t e i s i i n + ä ä n i v a l t a s u h t e i s t a + ä ä n i v a l t a s u h t e i t a + ä ä n i v i e s t i n t ä p a l v e l u i h i n + ä ä n i ä + ä ä n n ä t t e + ä ä n t e e n m u u t o s + ä ä n t e e n s i i r r o s + ä ä n t e n + ä ä n t e n e n e m m i s t ö l l ä + ä ä n t e n e n e m m i s t ö n + ä ä n t e n e n e m m i s t ö s t ä + ä ä n t e n k a l a s t u s k ä r p ä n e n + ä ä n t e n k a l a s t u s t o i m i a + ä ä n t e n l a s k e n t a + ä ä n t e n l a s k e n t a a + ä ä n t e n l a s k i j a t + ä ä n t e n l a s k i j o i t a + ä ä n t e n l a s k u j ä r j e s t e l y j ä + ä ä n t e n l a s k u n + ä ä n t e n l a s k u s s a + ä ä n t e n l a s k u v a i h e e s s a + ä ä n t ä + ä ä n t ä m m e + ä ä n t ä m y s t ä n i + ä ä n t ä ä n + ä ä n t ö p a i k k a + ä ä n t ö t a p a + ä ä n t ö v ä y l ä + ä ä r e i s h e r m o s t o + ä ä r e t t ö m ä n + ä ä r i a i n e k s e s t a + ä ä r i a i n e k s e t + ä ä r i a i n e k s i a + ä ä r i a i n e k s i l l e + ä ä r i a i n e s t e n + ä ä r i a j a t t e l u + ä ä r i a j a t t e l u a + ä ä r i a j a t t e l u a a n + ä ä r i a j a t u k s e t + ä ä r i a l u e e l l a + ä ä r i a l u e e l t a + ä ä r i a l u e i d e n + ä ä r i a l u e i l l a + ä ä r i a l u e i s t a + ä ä r i a l u e i t a + ä ä r i a l u e t t a + ä ä r i a s e n t e e t + ä ä r i a s e t e l m a a + ä ä r i b y r o k r a a t t i s i a + ä ä r i e l e m e n t i t + ä ä r i e s i m e r k i n + ä ä r i e s i m e r k k e j ä + ä ä r i e s i m e r k k i + ä ä r i f e d e r a l i s t i s t e n + ä ä r i f u n d a m e n t a l i s m i n + ä ä r i f u n d a m e n t a l i s t i s i i n + ä ä r i h a l l i n t o a + ä ä r i j o u k o t + ä ä r i j u u t a l a i n e n + ä ä r i j ä r j e s t ö + ä ä r i j ä r j e s t ö j e n + ä ä r i j ä r j e s t ö t + ä ä r i k a n n a n o t o t + ä ä r i k a n n a n o t t o i h i n + ä ä r i k a n n a n o t t o j e n + ä ä r i k a n n a t t a j a t + ä ä r i k a n n o i s t a + ä ä r i k a n s a l l i n e n + ä ä r i k a n s a l l i s e n + ä ä r i k a n s a l l i s e t + ä ä r i k a n s a l l i s i a + ä ä r i k a n s a l l i s i l l e + ä ä r i k a n s a l l i s m i e l i n e n + ä ä r i k a n s a l l i s m i e l i s e t + ä ä r i k a n s a l l i s m i e l i s t ä + ä ä r i k a n s a l l i s t e n + ä ä r i k a n t o i h i n + ä ä r i k a n t o j e n + ä ä r i k o n s e r v a t i i v i n e n + ä ä r i k o n s e r v a t i i v i s i a + ä ä r i k o n s e r v a t i i v i s t a + ä ä r i k o n s e r v a t i s m i a + ä ä r i k o n s e r v a t i s m i n + ä ä r i k r o a a t t e j a + ä ä r i k ä y t t ä y t y m i n e n + ä ä r i l a i d o i l l a + ä ä r i l a i t a a + ä ä r i l i b e r a a l e i h i n + ä ä r i l i b e r a a l e i s s a + ä ä r i l i b e r a a l i + ä ä r i l i b e r a a l i e n + ä ä r i l i b e r a a l i i n + ä ä r i l i b e r a a l i l l a + ä ä r i l i b e r a a l i n + ä ä r i l i b e r a a l i n e n + ä ä r i l i b e r a a l i s e s t a + ä ä r i l i b e r a a l i s s a + ä ä r i l i b e r a a l i t + ä ä r i l i b e r a l i s m i + ä ä r i l i b e r a l i s m i a + ä ä r i l i b e r a l i s m i i n + ä ä r i l i b e r a l i s m i n + ä ä r i l i b e r a l i s m i s t a + ä ä r i l i b e r a l i s t i n e n + ä ä r i l i b e r a l i s t i s e n + ä ä r i l i b e r a l i s t i s e t + ä ä r i l i b e r a l i s t i s i a + ä ä r i l i b e r a l i s t i s i s t a + ä ä r i l i b e r a l i s t i s t e n + ä ä r i l i i k e + ä ä r i l i i k e h d i n n ä n + ä ä r i l i i k e h d i n t ä + ä ä r i l i i k k e e t + ä ä r i l i i k k e i d e n + ä ä r i l i i k k e i s i i n + ä ä r i l i i k k e i s t ä + ä ä r i l i i k k e i t ä + ä ä r i m a r x i l a i s e t + ä ä r i m m i l l ä ä n + ä ä r i m m ä i s e e n + ä ä r i m m ä i s e k s i + ä ä r i m m ä i s e m p i ä + ä ä r i m m ä i s e n + ä ä r i m m ä i s e n ä + ä ä r i m m ä i s e s s ä + ä ä r i m m ä i s e s t ä + ä ä r i m m ä i s i i n + ä ä r i m m ä i s i l l ä + ä ä r i m m ä i s i m m i s s ä + ä ä r i m m ä i s i m m ä t k i n + ä ä r i m m ä i s i m p i ä + ä ä r i m m ä i s i s s ä + ä ä r i m m ä i s i ä + ä ä r i m m ä i s t e n + ä ä r i m m ä i s y y d e s s ä ä n + ä ä r i m m ä i s y y k s i e n + ä ä r i m m ä i s y y k s i i n + ä ä r i m m ä i s y y s a j a t t e l i j o i d e n + ä ä r i m m ä i s y y s a j a t t e l u u n + ä ä r i m m ä i s y y s i l m i ö i l l e + ä ä r i m m ä i s y y s l i i k k e e t + ä ä r i m m ä i s y y s r y h m i l l e + ä ä r i m m ä i s y y s t a p a u s t e n + ä ä r i m m ä i s y y t e e n + ä ä r i m u o d o i s s a a n + ä ä r i m u o t o j a + ä ä r i m u s l i m e i s t a + ä ä r i m u s l i m e j a + ä ä r i m u s l i m i + ä ä r i m u s l i m i j ä r j e s t ö + ä ä r i m u s l i m i j ä r j e s t ö j ä + ä ä r i m u s l i m i t + ä ä r i m u u k a l a i s v i h a m i e l i s e t + ä ä r i n a t i o n a l i s m i + ä ä r i n a t i o n a l i s m i a + ä ä r i n a t i o n a l i s m i n + ä ä r i n a t i o n a l i s t e i l l e + ä ä r i n a t i o n a l i s t i e n + ä ä r i n a t i o n a l i s t i n e n + ä ä r i n a t i o n a l i s t i s t e n + ä ä r i n a t i o n a l i s t i t + ä ä r i n ä k e m y k s i ä + ä ä r i n ä k e m y s t e n + ä ä r i o i k e a + ä ä r i o i k e a l l a + ä ä r i o i k e i s t o + ä ä r i o i k e i s t o a + ä ä r i o i k e i s t o e n e m m i s t ö l l e + ä ä r i o i k e i s t o j ä r j e s t ö j e n + ä ä r i o i k e i s t o k s i + ä ä r i o i k e i s t o l a i n e n + ä ä r i o i k e i s t o l a i s e e n + ä ä r i o i k e i s t o l a i s e l t a + ä ä r i o i k e i s t o l a i s e n + ä ä r i o i k e i s t o l a i s e s s a + ä ä r i o i k e i s t o l a i s e s t a + ä ä r i o i k e i s t o l a i s e t + ä ä r i o i k e i s t o l a i s i a + ä ä r i o i k e i s t o l a i s i i n + ä ä r i o i k e i s t o l a i s i l l e + ä ä r i o i k e i s t o l a i s i s t a + ä ä r i o i k e i s t o l a i s p u o l u e i t a + ä ä r i o i k e i s t o l a i s s i i p i + ä ä r i o i k e i s t o l a i s t a + ä ä r i o i k e i s t o l a i s t e n + ä ä r i o i k e i s t o l a i s u u d e n + ä ä r i o i k e i s t o l a i s u u s + ä ä r i o i k e i s t o l a i s u u t t a + ä ä r i o i k e i s t o l i i k k e i d e n + ä ä r i o i k e i s t o l l e + ä ä r i o i k e i s t o l t a + ä ä r i o i k e i s t o n + ä ä r i o i k e i s t o o n + ä ä r i o i k e i s t o p o p u l i s m i l l e + ä ä r i o i k e i s t o p u o l u e e n + ä ä r i o i k e i s t o p u o l u e e s e e n + ä ä r i o i k e i s t o p u o l u e e t + ä ä r i o i k e i s t o p u o l u e i d e n + ä ä r i o i k e i s t o p u o l u e t t a + ä ä r i o i k e i s t o r a d i k a a l i e n + ä ä r i o i k e i s t o s s a + ä ä r i o i k e i s t o s t a + ä ä r i o i k e i s t o v o i m i e n + ä ä r i o l o i s s a + ä ä r i o l o s u h t e i s s a + ä ä r i o p p o s i t i o + ä ä r i o s a t + ä ä r i p o l i t i i k a t + ä ä r i p o p u l i s m i a + ä ä r i p o p u l i s t i n e n + ä ä r i p u o l u e + ä ä r i p u o l u e e k s i + ä ä r i p u o l u e e t + ä ä r i p u o l u e i d e n + ä ä r i p u o l u e i t a + ä ä r i p u o l u e t t a + ä ä r i p y r k i m y s t e n + ä ä r i p ä ä s s ä + ä ä r i r a d i k a a l i + ä ä r i r a j o i l l a + ä ä r i r a j o i l l e + ä ä r i r a t k a i s u + ä ä r i r a t k a i s u a + ä ä r i r a t k a i s u j a + ä ä r i r y h m i e n + ä ä r i r y h m i i n + ä ä r i r y h m i l l e + ä ä r i r y h m i s t ä + ä ä r i r y h m i t t y m i e n + ä ä r i r y h m i t t y m i l l e + ä ä r i r y h m i ä + ä ä r i r y h m ä + ä ä r i r y h m ä n + ä ä r i r y h m ä t + ä ä r i s e r b i t + ä ä r i t a a n t u m u k s e l l i s t e n + ä ä r i t a p a u k s e n a + ä ä r i t a p a u k s e s s a + ä ä r i t a p a u k s i s s a + ä ä r i t a p a u k s i s t a + ä ä r i t a p a u s + ä ä r i t e k i j ö i t ä + ä ä r i t e k o j a + ä ä r i t e k o j e n + ä ä r i t e r r o r i s t i r y h m i e n + ä ä r i t i l a n n e + ä ä r i t i l a n t e e s s a + ä ä r i t i l a n t e i s i i n + ä ä r i t i l a n t e i s s a + ä ä r i t o i m e t + ä ä r i t o i m i a + ä ä r i t o i m i n t a a + ä ä r i t u l k i n t o j a + ä ä r i t š e t š e e n i t + ä ä r i u s k o n n o l l i s i a + ä ä r i u s k o n n o l l i s u u d e s t a + ä ä r i v a i h t o e h d o i s t a + ä ä r i v a s e m m a l l a + ä ä r i v a s e m m a l l e + ä ä r i v a s e m m i s t o + ä ä r i v a s e m m i s t o a + ä ä r i v a s e m m i s t o j o h t a j a t + ä ä r i v a s e m m i s t o l a i n e n + ä ä r i v a s e m m i s t o l a i s e n + ä ä r i v a s e m m i s t o l a i s e t + ä ä r i v a s e m m i s t o l a i s i a + ä ä r i v a s e m m i s t o l a i s i s t a + ä ä r i v a s e m m i s t o l a i s t e n + ä ä r i v a s e m m i s t o l a i s u u t t a + ä ä r i v a s e m m i s t o l t a + ä ä r i v a s e m m i s t o n + ä ä r i v a s e m m i s t o o n + ä ä r i v a s e m m i s t o r y h m ä n k i n + ä ä r i v a s e m m i s t o s s a + ä ä r i v a s e m m i s t o s t a + ä ä r i v i i v a t + ä ä r i v o i m i a + ä ä r i v o i m i e n + ä ä r i v o i m i i n + å r h u s i n + ö i s e e n + ö i s e s s ä + ö i s i s s ä + ö l j y a i k a + ö l j y a l a + ö l j y a l a a + ö l j y a l a a n + ö l j y a l a l l a + ö l j y a l a n + ö l j y a l u e i l l a + ö l j y a l u k s i a + ö l j y a l u k s i s t a + ö l j y a l u s + ö l j y b a r r e l i + ö l j y b a r r e l i a + ö l j y b a r r e l i e n + ö l j y b a r r e l i n + ö l j y b o i k o t i n + ö l j y b o i k o t t i + ö l j y b o i k o t t i a + ö l j y d i k t a a t t o r i + ö l j y d o l l a r e i t a + ö l j y e k v i v a l e n t t i t o n n i + ö l j y e k v i v a l e n t t i t o n n i a + ö l j y e s i i n t y m i e n + ö l j y e s i i n t y m i e n s ä + ö l j y e s i i n t y m i i n + ö l j y e s i i n t y m ä + ö l j y e s i i n t y m ä t + ö l j y e t u j e n + ö l j y f u t u u r i m a r k k i n o i t a + ö l j y g e o l o g i t + ö l j y h a n k k e i d e n + ö l j y h a n k k e i l l e + ö l j y h a n k k e i t a + ö l j y h a p p o j e n + ö l j y h a p p o p i t o i s u u k s i a + ö l j y h i e k a l l e + ö l j y h i e k a n + ö l j y h i e k a s t a + ö l j y h i e k k a + ö l j y h i e k k a a + ö l j y h i e k k a k y s y m y k s e n + ö l j y h i e k k a k y s y m y s t e n + ö l j y h i e k k a n s a + ö l j y h i e k k a t e o l l i s u u s + ö l j y h i e k o i l l a + ö l j y h i n n a t + ö l j y h i n t o j a + ö l j y h i n t o j e n + ö l j y h u i p p u + ö l j y h u i p p u k r i i s i ä + ö l j y h u i p p u u n + ö l j y h u i p u n + ö l j y h u i p u s t a + ö l j y i n f r a s t r u k t u u r i i n + ö l j y i n s t i t u u t i n + ö l j y i n t r e s s i e n s ä + ö l j y i n t r e s s i t + ö l j y i n v e s t o i n t i e n + ö l j y j a l o s t e i t a + ö l j y j e n + ö l j y j o h d a n n a i s i a + ö l j y j o h t o j a + ö l j y j ä + ö l j y j ä t t e i d e n + ö l j y k a k k u a + ö l j y k a r t e l l i + ö l j y k a r t e l l i e n + ö l j y k a r t e l l i n + ö l j y k a r t e l l i t + ö l j y k a s v e i l l e + ö l j y k a s v e i s t a + ö l j y k a s v e i s t a a n + ö l j y k a s v e j a + ö l j y k a s v i e n + ö l j y k a s v i k a k k u j a + ö l j y k a s v i l o h k o + ö l j y k a s v i n t u o t a n n o s t a + ö l j y k a s v i r o u h e e n + ö l j y k a t a s t r o f e i h i n + ö l j y k a t a s t r o f e i s t a + ö l j y k a t a s t r o f e j a + ö l j y k a t a s t r o f i + ö l j y k a t a s t r o f i e n + ö l j y k a t a s t r o f i i n + ö l j y k a t a s t r o f i n + ö l j y k a t a s t r o f i s t a + ö l j y k a u p a t + ö l j y k a u p p a + ö l j y k a u p p i a a t + ö l j y k a u p p i a i d e n + ö l j y k a u p p o i h i n + ö l j y k a u s i + ö l j y k e n t i l l ä + ö l j y k e n t i l t ä + ö l j y k e n t i s t ä + ö l j y k e n t t i e m m e + ö l j y k e n t t i e n + ö l j y k e n t t i ä + ö l j y k e n t t ä + ö l j y k e n t ä t + ö l j y k e r r o s t u m i e n + ö l j y k i i s t a s s a + ö l j y k i l o e k v i v a l e n t t i a + ö l j y k i n + ö l j y k o n s e r n i e n + ö l j y k o n s e r n i n + ö l j y k o n s e r n i t + ö l j y k o n s o r t i o l l e + ö l j y k r i i s e i h i n + ö l j y k r i i s e j ä + ö l j y k r i i s i + ö l j y k r i i s i i n + ö l j y k r i i s i n + ö l j y k r i i s i s t ä + ö l j y k r i i s i t + ö l j y k r i i s i ä + ö l j y k s i + ö l j y k u l j e t u k s e t + ö l j y k u l j e t u k s i a + ö l j y k u l j e t u k s i i n s a + ö l j y k u l j e t u k s i s s a + ö l j y k u l j e t u s t e n + ö l j y k u s t a n n u s t e n + ö l j y k u u t i o m e t r i e n + ö l j y l a i t o s t e n + ö l j y l a i t t e i s t o j a + ö l j y l a i v o j e n + ö l j y l a m p p u + ö l j y l a s t i + ö l j y l a u t a n + ö l j y l a u t a s t a + ö l j y l a u t a t + ö l j y l a u t o i s t a + ö l j y l a u t t a + ö l j y l a u t t a a + ö l j y l a u t t a k a t a s t r o f e j a + ö l j y l a u t t o i n e e n + ö l j y l a u t t o j a + ö l j y l a u t t o j e n + ö l j y l i e t t e e n ä + ö l j y l i u s k e + ö l j y l i u s k e e l l e + ö l j y l i u s k e e n + ö l j y l i u s k e e s e e n + ö l j y l i u s k e t t a + ö l j y l i u s k e t u t k i m u k s e e n + ö l j y l l e + ö l j y l l ä + ö l j y l t ä + ö l j y l ä h t e e t + ö l j y l ä h t e i d e n + ö l j y l ä h t e i s t ä + ö l j y l ä h t e i t ä + ö l j y l ä m m i t y s + ö l j y m a a l a u s + ö l j y m a k s u j e n + ö l j y m a r k k i n a t + ö l j y m a r k k i n o i d e n + ö l j y m a r k k i n o i l l a + ö l j y m a r k k i n o i l l e + ö l j y m a r k k i n o i s t a + ö l j y m a r k k i n o i t a + ö l j y m e n o i n a + ö l j y m e r e n + ö l j y m i n i s t e r i + ö l j y m i n i s t e r i ö n + ö l j y m o n a r k i o i d e n + ö l j y m ä e s t ä + ö l j y m ä ä r i e n + ö l j y m ä ä r i ä + ö l j y n + ö l j y n e t s i n n ä l l e + ö l j y n e t s i n n ä n + ö l j y n e t s i n n ä s s ä + ö l j y n e t s i n t ä + ö l j y n e t s i n t ä ä n + ö l j y n h a n k i n n a n + ö l j y n h a n k i n n a s s a + ö l j y n h a n k i n t a r y h m ä n + ö l j y n h i n n a n + ö l j y n h i n n a n n o u s u + ö l j y n h i n n a s t a + ö l j y n h i n n a t + ö l j y n h i n t a + ö l j y n h i n t a a + ö l j y n h i n t a k r i i s i + ö l j y n h i n t o i h i n + ö l j y n h i n t o j a + ö l j y n h i n t o j e n + ö l j y n j a l o s t a j i e n + ö l j y n j a l o s t a m o + ö l j y n j a l o s t a m o i d e n + ö l j y n j a l o s t a m o i l l e + ö l j y n j a l o s t a m o i s s a + ö l j y n j a l o s t a m o j a + ö l j y n j a l o s t a m o t + ö l j y n j a l o s t u k s e n + ö l j y n j a l o s t u s + ö l j y n j a l o s t u s t e o l l i s u u d e l t a + ö l j y n j a l o s t u s t u o t e + ö l j y n j a l o s t u s y h t i ö i s s ä + ö l j y n j a n o m m e + ö l j y n k e r ä y k s e e n + ö l j y n k u l j e t u k s e t + ö l j y n k u l j e t u s a l u s t e n + ö l j y n k u l u t t a j a m a i d e n + ö l j y n k u l u t u k s e n + ö l j y n k u l u t u k s e s t a + ö l j y n k u l u t u s + ö l j y n k u l u t u s t a + ö l j y n k ä y t ö n + ö l j y n p o r a a m i n e n + ö l j y n p o r a u k s e e n + ö l j y n p o r a u k s e n + ö l j y n p o r a u k s e s t a + ö l j y n p o r a u k s e t + ö l j y n p o r a u k s i a + ö l j y n p o r a u s + ö l j y n p o r a u s a l a l l a + ö l j y n p o r a u s a l a l l e + ö l j y n p o r a u s a l u e e l l e + ö l j y n p o r a u s h a n k k e e t + ö l j y n p o r a u s l a u t a l l a + ö l j y n p o r a u s l a u t a s t a + ö l j y n p o r a u s l a u t a t + ö l j y n p o r a u s l a u t o i l l a + ö l j y n p o r a u s l a u t o i l l e + ö l j y n p o r a u s l a u t t a + ö l j y n p o r a u s l a u t t a a + ö l j y n p o r a u s l a u t t o i h i n + ö l j y n p o r a u s l a u t t o j a + ö l j y n p o r a u s l a u t t o j a m m e + ö l j y n p o r a u s l a u t t o j e n + ö l j y n p o r a u s o p e r a a t i o i d e n + ö l j y n p o r a u s o p e r a a t i o i l l e + ö l j y n p o r a u s o p e r a a t i o i s s a + ö l j y n p o r a u s r e i ä t + ö l j y n p o r a u s t a + ö l j y n p o r a u s t e o l l i s u u d e n + ö l j y n p o r a u s t o i m i n n a n + ö l j y n p o r a u s t o i m i n n a s s a + ö l j y n p o r a u s t o i m i n t a + ö l j y n p o r a u s t o i m i n t a a + ö l j y n p o r a u s y h t i ö i d e n + ö l j y n p o r a u s y h t i ö i h i n + ö l j y n s a a n n i s s a + ö l j y n s a a n n i s t a + ö l j y n s a a n t i + ö l j y n s a a n t i a + ö l j y n s a a n t i i n + ö l j y n s a a n t i o n g e l m a t + ö l j y n s i e m e n i l l e + ö l j y n s i i r r o t + ö l j y n s i i r t o + ö l j y n s i i r t o o n + ö l j y n s i i r t o v e r k o t + ö l j y n s u o d a t i n + ö l j y n t a r v e + ö l j y n t o i m i t t a j a + ö l j y n t o i m i t t a j a l t a + ö l j y n t o i m i t u k s i a + ö l j y n t o r j u n t a + ö l j y n t o r j u n t a k a p a s i t e e t t i i n + ö l j y n t o r j u n t a l a i v a s t o + ö l j y n t o r j u n t a t a r k o i t u k s i i n + ö l j y n t o r j u n t a v a l m i u k s i e n + ö l j y n t u o j a + ö l j y n t u o n n i n + ö l j y n t u o n n i s t a + ö l j y n t u o t a n n o l l a a n + ö l j y n t u o t a n n o n + ö l j y n t u o t a n n o s t a + ö l j y n t u o t a n t o + ö l j y n t u o t a n t o a + ö l j y n t u o t a n t o l a i t o s t e n + ö l j y n t u o t a n t o o n + ö l j y n t u o t a n t o t o i m i n n o t + ö l j y n t u o t t a j a + ö l j y n t u o t t a j a m a a + ö l j y n t u o t t a j a m a a t + ö l j y n t u o t t a j a m a i d e n + ö l j y n t u o t t a j a m a i l l e + ö l j y n t u o t t a j a m a i s s a + ö l j y n t u o t t a j a m a i s t a + ö l j y n t u o t t a j a t + ö l j y n t u o t t a j a v a l t i o + ö l j y n t u o t t a j a v a l t i o i s s a + ö l j y n t u o t t a j a v a l t i o i s t a + ö l j y n t u o t t a j i e n + ö l j y n t u o t t a j i s t a + ö l j y n v i e j ä + ö l j y n v i e j ä m a a + ö l j y n v i e j ä m a i l l e + ö l j y n v i e j ä m a i s s a + ö l j y n v i e j ä m a i s t a + ö l j y n v i e j ä m a i t a + ö l j y n v i e n t i + ö l j y n v i e n t i k i e l l o n + ö l j y n v i e n t i k i e l t o + ö l j y n v i e n t i k i e l t o a + ö l j y o h j e l m a s s a + ö l j y o n g e l m a a + ö l j y o n g e l m a n + ö l j y o n g e l m a s t a + ö l j y o n n e t t o m u u d e n + ö l j y o n n e t t o m u u d e s t a + ö l j y o n n e t t o m u u d e t + ö l j y o n n e t t o m u u k s i e n + ö l j y o n n e t t o m u u k s i i n + ö l j y o n n e t t o m u u k s i s t a + ö l j y o n n e t t o m u u s + ö l j y p a i n o t t e i s i l l e + ö l j y p a l m u + ö l j y p a l m u v i l j e l m i e n + ö l j y p a l m u v i l j e l y k s i e n + ö l j y p a l o + ö l j y p e r u s t e i s e s s a + ö l j y p i t o i s u u t e e n + ö l j y p o h j a i s i l l a + ö l j y p o l i t i i k a s t a + ö l j y p o l t i n + ö l j y p o l t t o a i n e i l l e + ö l j y p o r a u s l a u t t o j a + ö l j y p u i d e n + ö l j y p u l a + ö l j y p u l a n + ö l j y p u t k e a + ö l j y p u t k e e n + ö l j y p u t k e l l e + ö l j y p u t k e n + ö l j y p u t k e s t a + ö l j y p u t k e t + ö l j y p u t k i + ö l j y p u t k i a + ö l j y p u t k i e n + ö l j y p u t k i h a n k e + ö l j y p u t k i h a n k e t t a + ö l j y p u t k i h a n k k e e s e e n + ö l j y p u t k i h a n k k e e s t a + ö l j y p u t k i r e i t t i e n + ö l j y p u t k i s t o + ö l j y p u t k i s t o j e n + ö l j y p u t k i s t o n + ö l j y p u t k i v e r k o s t o + ö l j y p ä ä s t ö + ö l j y p ä ä s t ö i h i n + ö l j y p ä ä s t ö i l l ä + ö l j y p ä ä s t ö i s t ä + ö l j y p ä ä s t ö j e n + ö l j y p ä ä s t ö j ä + ö l j y p ä ä s t ö t + ö l j y p ö r s s i + ö l j y p ö r s s i s t ä + ö l j y r a h a a + ö l j y r a h a n s a + ö l j y r a h a s t o + ö l j y r a h d i n + ö l j y r a h o i t u k s e s t a + ö l j y r a h o j e n + ö l j y r e i t i t + ö l j y r e i t t i ä + ö l j y r e s u r s s i e n + ö l j y r i i p p u m a t t o m u u s t a v o i t e + ö l j y r i i p p u v u u d e n + ö l j y r i i p p u v u u d e s t a + ö l j y r i i p p u v u u d e s t a m m e + ö l j y r i i p p u v u u t e m m e + ö l j y r i i p p u v u u t t a + ö l j y r i i p p u v u u t t a m m e + ö l j y r i k k a a l l a + ö l j y r i k k a a n + ö l j y r i k k a a s s a + ö l j y r i k k a u k s i l l a a n + ö l j y r i k k a u k s i s t a + ö l j y r i s k i e n + ö l j y r y h m i t t y m ä t + ö l j y s a a r r o n + ö l j y s a a r t o + ö l j y s a a s t e + ö l j y s a a s t e e n + ö l j y s a a s t e e s t a + ö l j y s a a s t e i s t a + ö l j y s a a s t e i t a + ö l j y s a a s t e l a u t o i s t a + ö l j y s a a s t e l a u t t o j e n + ö l j y s a a s t e o n g e l m a + ö l j y s a t a m a + ö l j y s a t a m a a + ö l j y s a t a m a a n + ö l j y s a t a m a h a n k k e e t + ö l j y s a t a m a s t a + ö l j y s e o k s e t + ö l j y s i e m e n a l a n + ö l j y s i e m e n a v u s t u k s i a + ö l j y s i e m e n i i n + ö l j y s i e m e n i ä + ö l j y s i e m e n j ä t e t t ä + ö l j y s i e m e n k a s v i e n + ö l j y s i e m e n k o r v a u k s e t + ö l j y s i e m e n m a r k k i n o i h i n + ö l j y s i e m e n t e n + ö l j y s o p i m u k s i a + ö l j y s o t a a n + ö l j y s o t i a + ö l j y s t ä + ö l j y s u l t t a a n i k u n n a n + ö l j y s ä i l i ö + ö l j y s ä i l i ö a l u k s e l l a + ö l j y s ä i l i ö a l u k s e n + ö l j y s ä i l i ö a l u k s e s t a + ö l j y s ä i l i ö a l u k s e t + ö l j y s ä i l i ö a l u k s i a + ö l j y s ä i l i ö a l u k s i i n + ö l j y s ä i l i ö a l u k s i l l a + ö l j y s ä i l i ö a l u k s i s s a + ö l j y s ä i l i ö a l u k s i s t a + ö l j y s ä i l i ö a l u s + ö l j y s ä i l i ö a l u s l i i k e n n e t t ä + ö l j y s ä i l i ö a l u s t e n + ö l j y t a n k k e r e i d e n + ö l j y t a n k k e r e i l l e + ö l j y t a n k k e r e i s t a + ö l j y t a n k k e r e i t a + ö l j y t a n k k e r i + ö l j y t a n k k e r i e n + ö l j y t a n k k e r i l l e + ö l j y t a n k k e r i n + ö l j y t a n k k e r i o n n e t t o m u u d e t + ö l j y t a n k k e r i o n n e t t o m u u s + ö l j y t a n k k e r i r i s k i t + ö l j y t a n k k e r i t + ö l j y t a n k k i + ö l j y t a r j o n n a s t a + ö l j y t e o l l i s u u d e l l a + ö l j y t e o l l i s u u d e l l e + ö l j y t e o l l i s u u d e l t a + ö l j y t e o l l i s u u d e n + ö l j y t e o l l i s u u d e s s a + ö l j y t e o l l i s u u d e s t a + ö l j y t e o l l i s u u s + ö l j y t e o l l i s u u t e e n + ö l j y t e o l l i s u u t e m m e + ö l j y t e o l l i s u u t t a + ö l j y t e r m i n a a l i + ö l j y t e r m i n a a l i n + ö l j y t i l a n t e e s t a + ö l j y t i l a s t o i s t a + ö l j y t o i m i n n a n + ö l j y t o i m i n n o t + ö l j y t o i m i t u k s e t + ö l j y t o i m i t u k s i a + ö l j y t o i m i t u k s i a m m e + ö l j y t o i m i t u k s i i n + ö l j y t o i m i t u k s i l l e + ö l j y t o i m i t u k s i s t a + ö l j y t o i m i t u s t e n + ö l j y t r u s t e j a + ö l j y t r u s t i e n + ö l j y t u h o j a + ö l j y t u h o j e n + ö l j y t u h o s t a + ö l j y t u i k k u + ö l j y t u l o i l l a + ö l j y t u l o i s t a + ö l j y t u l o i s t a a n + ö l j y t u l o j a + ö l j y t u l o j a a n + ö l j y t u l o j e n + ö l j y t u l o j e n s a + ö l j y t u l o t + ö l j y t u o t a n t o + ö l j y t u o t e k a a s u a + ö l j y t u o t t e e t + ö l j y t u o t t e i d e n + ö l j y t u o t t e i s i i n + ö l j y t u o t t e i s t a + ö l j y t u o t t e i t a + ö l j y t u t k i m u k s i i n + ö l j y t y n n y r i n + ö l j y t y n n y r i s t ä + ö l j y t y ö l ä i s t e n + ö l j y v a h i n g o i l l e + ö l j y v a h i n g o i s t a + ö l j y v a h i n g o n + ö l j y v a h i n g o s t a + ö l j y v a h i n g o t + ö l j y v a h i n k o + ö l j y v a h i n k o j a + ö l j y v a h i n k o j e n + ö l j y v a h i n k o l a i l l a + ö l j y v a l t i o + ö l j y v a l t i o i s t a + ö l j y v a r a n n o i s t a + ö l j y v a r a n n o t + ö l j y v a r a n t o a + ö l j y v a r a n t o i h i n + ö l j y v a r a n t o j a + ö l j y v a r a n t o j e n + ö l j y v a r a n t o n s a + ö l j y v a r a s t o j a + ö l j y v a r a s t o j e n + ö l j y v a r a s t o j e n s a + ö l j y v a r a s t o s s a + ö l j y v a r a s t o t + ö l j y v a r a t + ö l j y v a r o i h i n + ö l j y v a r o i l l a + ö l j y v a r o i s t a + ö l j y v a r o j a + ö l j y v a r o j e m m e + ö l j y v a r o j e n + ö l j y v a r o j e n s a + ö l j y v e r o n + ö l j y v e r o t u k s e n + ö l j y v o i t t o j a + ö l j y v u o d o i l l a + ö l j y v u o d o i l l e + ö l j y v u o d o i s t a + ö l j y v u o d o l t a + ö l j y v u o d o n + ö l j y v u o d o s t a + ö l j y v u o d o t + ö l j y v u o t o + ö l j y v u o t o a + ö l j y v u o t o i h i n + ö l j y v u o t o j a + ö l j y v u o t o j e n + ö l j y v u o t o k a t a s t r o f i + ö l j y v ä r i + š a k k i l a u d a l l a + š a k k i l a u t a + š a k k i m e s t a r i + š a k k i p e l i + š a k k i p e l i s s ä + š i i a e n e m m i s t ö s t ä + š i i a l a i s e n e m m i s t ö + š i i a l a i s o p p o s i t i o t a + š i i a m u s l i m e j a + š i i a m u s l i m i t + š i i a o p p o s i t i o + š i i a y h t e i s ö n + š i i a y h t e i s ö s s ä + š i k a a n i k i e l t o + š o k k i s i v u s t o + š o n a t From b38b7283d1c1c244a29a14892a68845526f819da Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 18 Apr 2015 22:49:34 -0400 Subject: [PATCH 002/965] multibackend support, eigen cleanup and optimizations --- CMakeLists.txt | 44 ++- cmake/FindTHC.cmake | 15 + cnn/CMakeLists.txt | 25 +- cnn/{ => backends/eigen}/edges.cc | 0 cnn/backends/eigen/eigen-backend.cc | 125 ++++---- cnn/{ => backends/eigen}/model.cc | 18 -- cnn/backends/eigen/tensor-eigen.h | 6 + cnn/backends/thpp/backend.cc | 18 ++ cnn/backends/thpp/dim.cc | 13 + cnn/backends/thpp/dim.h | 38 +++ cnn/backends/thpp/edges.cc | 469 ++++++++++++++++++++++++++++ cnn/backends/thpp/model.cc | 81 +++++ cnn/backends/thpp/random.h | 12 + cnn/backends/thpp/tensor.h | 162 ++++++++++ cnn/cnn.cc | 8 +- cnn/model.h | 5 +- cnn/param-edges.cc | 2 +- cnn/saxe_init.cc | 9 +- cnn/tensor.h | 14 +- cnn/tests/test_edges.cc | 233 +++++++++----- cnn/tests/test_init.cc | 16 +- cnn/tests/test_utils.h | 10 +- cnn/training.cc | 11 + config.h.cmake | 4 +- examples/CMakeLists.txt | 8 +- examples/example-data/fin-dev.txt | 3 - examples/rnnlm.cc | 2 +- examples/xor.cc | 2 +- 28 files changed, 1158 insertions(+), 195 deletions(-) create mode 100644 cmake/FindTHC.cmake rename cnn/{ => backends/eigen}/edges.cc (100%) rename cnn/{ => backends/eigen}/model.cc (82%) create mode 100644 cnn/backends/thpp/backend.cc create mode 100644 cnn/backends/thpp/dim.cc create mode 100644 cnn/backends/thpp/dim.h create mode 100644 cnn/backends/thpp/edges.cc create mode 100644 cnn/backends/thpp/model.cc create mode 100644 cnn/backends/thpp/random.h create mode 100644 cnn/backends/thpp/tensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f4ded5b31..038cde9b5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cnn) cmake_minimum_required(VERSION 2.8 FATAL_ERROR) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) -set(CMAKE_CXX_FLAGS "-Wall -std=c++11 -O3 -g") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -O3 -g") enable_testing() @@ -31,12 +31,22 @@ endfunction() # look for Boost find_package(Boost COMPONENTS program_options serialization unit_test_framework REQUIRED) include_directories(${Boost_INCLUDE_DIR}) +set(LIBS ${LIBS} ${Boost_LIBRARIES}) + +if(BACKEND MATCHES "^thpp$") + set(WITH_THPP_BACKEND 1) +elseif(BACKEND MATCHES "^eigen$") + set(WITH_EIGEN_BACKEND 1) +elseif(BACKEND MATCHES "^minerva$") + set(WITH_MINVERA_BACKEND 1) +else() + message(SEND_ERROR "BACKEND must be one of thpp, eigen, or minerva.") +endif() # look for Minerva -find_package(Minerva) -if(MINERVA_FOUND) +if(WITH_MINERVA_BACKEND) + find_package(Minerva REQUIRED) include_directories(${MINERVA_INCLUDE_DIR}) - set(HAVE_MINERVA_H 1) if (ENABLE_CUDA) set(CUDA_TOOLKIT_ROOT_DIR ${CUDA_ROOT}) find_package(CUDA REQUIRED) @@ -47,7 +57,31 @@ if(MINERVA_FOUND) else () message(STATUS "CUDA not enabled (use -DENABLE_CUDA=1)") endif() -endif(MINERVA_FOUND) +endif(WITH_MINERVA_BACKEND) + +# look for thpp +if(WITH_THPP_BACKEND) + find_package(TH++ REQUIRED) + find_package(TH REQUIRED) + include_directories(${THPP_INCLUDE_DIR}) + include_directories(${TH_INCLUDE_DIR}) + set(LIBS ${LIBS} ${TH_LIBRARIES} ${THPP_LIBRARIES}) + if (ENABLE_CUDA) + find_package(CUDA REQUIRED) + include_directories(SYSTEM ${CUDA_INCLUDE_DIRS}) + find_package(THC REQUIRED) + include_directories(${THC_INCLUDE_DIR}) + else() + message(STATUS "CUDA not enabled (use -DENABLE_CUDA=1)") + endif() + FIND_PACKAGE(OpenMP) + IF(OPENMP_FOUND) + MESSAGE(STATUS "Compiling with OpenMP support") + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") + ENDIF(OPENMP_FOUND) +endif(WITH_THPP_BACKEND) # look for Eigen find_package(Eigen3 REQUIRED) diff --git a/cmake/FindTHC.cmake b/cmake/FindTHC.cmake new file mode 100644 index 000000000..216148a8f --- /dev/null +++ b/cmake/FindTHC.cmake @@ -0,0 +1,15 @@ + +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7 FATAL_ERROR) + +INCLUDE(FindPackageHandleStandardArgs) + +FIND_LIBRARY(THC_LIBRARY THC) +FIND_PATH(THC_INCLUDE_DIR "THC.h" PATHS "${CMAKE_PREFIX_PATH}/include/THC") + +SET(THC_LIBRARIES ${THC_LIBRARY}) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS( + THC + REQUIRED_ARGS + THC_INCLUDE_DIR + THC_LIBRARY) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 55b066948..4b2b6be30 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -6,22 +6,13 @@ PROJECT(cnn CXX) set(cnn_library_SRCS cnn.cc dict.cc - edges.cc lstm-fast.cc - model.cc param-edges.cc rnn.cc saxe_init.cc training.cc ) -if(MINERVA_FOUND) - # for now - list(APPEND cnn_library_SRCS backends/eigen/eigen-backend.cc) -else(MINERVA_FOUND) - list(APPEND cnn_library_SRCS backends/eigen/eigen-backend.cc) -endif(MINERVA_FOUND) - # Headers: set(cnn_library_HDRS cnn.h @@ -36,6 +27,18 @@ set(cnn_library_HDRS training.h ) +if(WITH_THPP_BACKEND) + list(APPEND cnn_library_SRCS backends/thpp/backend.cc backends/thpp/dim.cc backends/thpp/edges.cc backends/thpp/model.cc) +endif(WITH_THPP_BACKEND) + +if(WITH_MINERVA_BACKEND) +# list(APPEND cnn_library_SRCS backends/minerva/eigen-backend.cc) +endif(WITH_MINERVA_BACKEND) + +if(WITH_EIGEN_BACKEND) + list(APPEND cnn_library_SRCS backends/eigen/eigen-backend.cc backends/eigen/edges.cc backends/eigen/model.cc) +endif(WITH_EIGEN_BACKEND) + file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) foreach(test_src ${TEST_SRCS}) @@ -46,7 +49,7 @@ foreach(test_src ${TEST_SRCS}) add_executable(${testName} ${test_src}) #link to Boost libraries AND your targets and dependencies - target_link_libraries(${testName} ${Boost_LIBRARIES} cnn) + target_link_libraries(${testName} cnn ${LIBS}) set_target_properties(${testName} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests.bin) @@ -59,6 +62,6 @@ foreach(test_src ${TEST_SRCS}) endforeach(test_src) # actual target: -add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS}) +add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) # target_compile_features(cnn PRIVATE cxx_range_for) diff --git a/cnn/edges.cc b/cnn/backends/eigen/edges.cc similarity index 100% rename from cnn/edges.cc rename to cnn/backends/eigen/edges.cc diff --git a/cnn/backends/eigen/eigen-backend.cc b/cnn/backends/eigen/eigen-backend.cc index 757037f97..b9ae4a803 100644 --- a/cnn/backends/eigen/eigen-backend.cc +++ b/cnn/backends/eigen/eigen-backend.cc @@ -1,5 +1,6 @@ #include "cnn/backends/eigen/eigen-backend.h" +#include #include #include @@ -21,95 +22,103 @@ Eigen::MatrixXf Elewise::Exp(const Eigen::MatrixXf& x) { return x.array().exp(); } +struct FSigmoid { + inline float operator()(float x) const { + return 1.f / (1.f + expf(-x)); + } +}; + Eigen::MatrixXf Elewise::SigmoidForward(const Eigen::MatrixXf& x) { - Eigen::MatrixXf fx = x; - for (unsigned i = 0; i < fx.rows(); ++i) - for (unsigned j = 0; j < fx.cols(); ++j) - fx(i,j) = 1.f / (1.f + expf(-x(i,j))); - return fx; + return x.unaryExpr(FSigmoid()); } +struct FSigmoidBackward { + inline float operator()(float t, float d) const { + return (1.f - t) * t * d; + } +}; + Eigen::MatrixXf Elewise::SigmoidBackward(const Eigen::MatrixXf& diff, const Eigen::MatrixXf& top, const Eigen::MatrixXf& bottom) { - const unsigned rows = top.rows(); - const unsigned cols = top.cols(); - Eigen::MatrixXf dfdx(rows, cols); - for (unsigned i = 0; i < rows; ++i) - for (unsigned j = 0; j < cols; ++j) - dfdx(i,j) = (1.f - top(i,j)) * top(i,j); - return dfdx.cwiseProduct(diff); + return top.binaryExpr(diff, FSigmoidBackward()); } +struct FRectify { + inline float operator()(float x) const { + return (x > 0) ? x : 0; + } +}; + Eigen::MatrixXf Elewise::ReluForward(const Eigen::MatrixXf& x) { - Eigen::MatrixXf fx = x; - for (unsigned i = 0; i < fx.rows(); ++i) - for (unsigned j = 0; j < fx.cols(); ++j) - if (fx(i,j) < 0) fx(i,j) = 0; - return fx; + return x.unaryExpr(FRectify()); } +struct FRectifyBackward { + inline float operator()(float t, float d) const { + return (t) ? d : 0.f; + } +}; + Eigen::MatrixXf Elewise::ReluBackward(const Eigen::MatrixXf& diff, const Eigen::MatrixXf& top, const Eigen::MatrixXf& bottom) { - Eigen::MatrixXf dfdx = diff; - const unsigned rows = diff.rows(); - const unsigned cols = diff.cols(); - for (unsigned i = 0; i < rows; ++i) - for (unsigned j = 0; j < cols; ++j) - if (!top(i,j)) dfdx(i,j) = 0; - return dfdx; + return top.binaryExpr(diff, FRectifyBackward()); } Eigen::MatrixXf Elewise::TanhForward(const Eigen::MatrixXf& x) { - Eigen::MatrixXf fx = x; - for (unsigned i = 0; i < fx.rows(); ++i) - for (unsigned j = 0; j < fx.cols(); ++j) - fx(i,j) = tanhf(fx(i,j)); - return fx; + return x.unaryExpr(ptr_fun(tanhf)); } +struct FTanhBackward { + inline float operator()(float t, float d) const { + return (1.f - t * t) * d; + } +}; + Eigen::MatrixXf Elewise::TanhBackward(const Eigen::MatrixXf& diff, const Eigen::MatrixXf& top, const Eigen::MatrixXf& bottom) { - const unsigned rows = top.rows(); - const unsigned cols = top.cols(); - Eigen::MatrixXf dfdx(rows, cols); - for (unsigned i = 0; i < rows; ++i) - for (unsigned j = 0; j < cols; ++j) - dfdx(i,j) = 1.f - top(i,j) * top(i,j); - return dfdx.cwiseProduct(diff); + return top.binaryExpr(diff, FTanhBackward()); } inline float logsumexp(const Eigen::MatrixXf& x) { - float m = x(0,0); - for (unsigned i = 1; i < x.rows(); ++i) { - float r = x(i,0); - if (r > m) m = r; - } + const float m = x.maxCoeff(); float z = 0; for (unsigned i = 0; i < x.rows(); ++i) z += expf(x(i,0) - m); return m + logf(z); } +struct FSoftmaxNormalize { + explicit FSoftmaxNormalize(float logz) : logz(logz) {} + inline float operator()(float x) const { + return expf(x - logz); + } + float logz; +}; + Eigen::MatrixXf Convolution::SoftmaxForward(const Eigen::MatrixXf& src, SoftmaxAlgorithm algorithm) { - const unsigned rows = src.rows(); - assert(src.cols() == 1); - const float logz = logsumexp(src); - Eigen::MatrixXf fx(rows, 1); - for (unsigned i = 0; i < rows; ++i) - fx(i,0) = expf(src(i,0) - logz); - return fx; + if (src.cols() == 1) { + return src.unaryExpr(FSoftmaxNormalize(logsumexp(src))); + } else { + cerr << "SoftmaxForward not implemented for multiple columns\n"; + abort(); + } } +struct FSoftmaxBackward { + explicit FSoftmaxBackward(float off_diag_sum) : off_diag_sum(off_diag_sum) {} + inline float operator()(float t, float d) const { + return (off_diag_sum + d) * t; + } + float off_diag_sum; +}; + Eigen::MatrixXf Convolution::SoftmaxBackward(const Eigen::MatrixXf& diff, const Eigen::MatrixXf& top, SoftmaxAlgorithm algorithm) { // d softmax(x)_i / d x_j = softmax(x)_i * (1 - softmax(x)_i) if i == j // d softmax(x)_i / d x_j = -softmax(x)_i * softmax(x)_j if i != j - const unsigned rows = top.rows(); - - float off_diag_sum = 0; - for (unsigned i = 0; i < rows; ++i) - off_diag_sum -= top(i, 0) * diff(i, 0); - - Eigen::MatrixXf dEdx = Eigen::MatrixXf::Zero(rows, 1); - for (unsigned i = 0; i < rows; ++i) - dEdx(i, 0) = (off_diag_sum + diff(i, 0)) * top(i, 0); - return dEdx; + if (top.cols() == 1) { + float off_diag_sum = -top.cwiseProduct(diff).sum(); + return top.binaryExpr(diff, FSoftmaxBackward(off_diag_sum)); + } else { + cerr << "SoftmaxBackward not implemented for multiple columns\n"; + abort(); + } } } // namespace cnn diff --git a/cnn/model.cc b/cnn/backends/eigen/model.cc similarity index 82% rename from cnn/model.cc rename to cnn/backends/eigen/model.cc index cef223e70..53035d7cc 100644 --- a/cnn/model.cc +++ b/cnn/backends/eigen/model.cc @@ -14,23 +14,13 @@ size_t Parameters::size() const { return cnn::size(values).Prod(); } void Parameters::rescale_gradient(real scale) { g *= scale; } real Parameters::g_squared_l2norm() const { -#if MINERVA_BACKEND - Tensor r = g.Reshape({g.Size().Prod()}); - Tensor sq = Elewise::Mult(r, r); - return sq.Sum(0).Get().get()[0]; -#else return g.squaredNorm(); -#endif } void Parameters::accumulate_grad(const Tensor& d) { g += d; } void Parameters::clear() { -#if MINERVA_BACKEND - g = NArray::Zeros(g.Size()); -#else g.setZero(); -#endif } size_t LookupParameters::size() const { @@ -39,26 +29,18 @@ size_t LookupParameters::size() const { real LookupParameters::g_squared_l2norm() const { real a = 0; -#if MINERVA_BACKEND - cerr << "No impl yet\n"; abort(); -#else for (auto& it : this->g) a += it.second.squaredNorm(); -#endif return a; } void LookupParameters::accumulate_grad(unsigned index, const Tensor& d) { -#if MINERVA_BACKEND - cerr << "No impl yet\n"; abort(); -#else auto it = this->g.find(index); if (it == this->g.end()) { g[index] = d; } else { it->second += d; } -#endif } void LookupParameters::rescale_gradient(real scale) { diff --git a/cnn/backends/eigen/tensor-eigen.h b/cnn/backends/eigen/tensor-eigen.h index e38b09118..e04b933f0 100644 --- a/cnn/backends/eigen/tensor-eigen.h +++ b/cnn/backends/eigen/tensor-eigen.h @@ -132,6 +132,12 @@ inline Tensor Ccm(const Dim&d, const std::initializer_list& v) { return m; } +inline std::string str(const Tensor& T) { + std::ostringstream os; + os << T << std::endl; + return os.str(); +} + } // namespace cnn #include "cnn/backends/eigen/eigen-backend.h" diff --git a/cnn/backends/thpp/backend.cc b/cnn/backends/thpp/backend.cc new file mode 100644 index 000000000..a92db69e4 --- /dev/null +++ b/cnn/backends/thpp/backend.cc @@ -0,0 +1,18 @@ +#include "cnn/backends/thpp/tensor.h" + +#include + +using namespace std; + +namespace cnn { + +std::mt19937* rndeng = nullptr; + +void Initialize(int& argc, char**& argv) { + std::random_device rd; + rndeng = new mt19937(rd()); + cerr << "Created random generator: " << rndeng << endl; +} + +} + diff --git a/cnn/backends/thpp/dim.cc b/cnn/backends/thpp/dim.cc new file mode 100644 index 000000000..79debed34 --- /dev/null +++ b/cnn/backends/thpp/dim.cc @@ -0,0 +1,13 @@ +#include "cnn/backends/thpp/tensor.h" + +#include + +using namespace std; + +ostream& operator<<(ostream& os, const Dim& d) { + os << '{'; + for (unsigned i = 0; i < d.v.size(); ++i) + os << (i ? ", " : "") << d.v[i]; + return os << '}'; +} + diff --git a/cnn/backends/thpp/dim.h b/cnn/backends/thpp/dim.h new file mode 100644 index 000000000..3a996a3f7 --- /dev/null +++ b/cnn/backends/thpp/dim.h @@ -0,0 +1,38 @@ +#ifndef _CNN_THPP_DIM_H_ +#define _CNN_THPP_DIM_H_ + +#include +#include +#include "thpp/Range.h" + +struct Dim { + Dim() : v() {} + Dim(Dim&& o) = default; + Dim(const Dim& o) = default; + Dim(std::initializer_list x) : v(x) {} + Dim(const thpp::LongRange& r) : v(r.begin(), r.end()) {} + long size() const { + long p = 1; + for (auto x : v) p *= x; + return p; + } + long size(size_t i) const { + return (*this)[i]; + } + long& operator[](long i) { return v[i]; } + long operator[](long i) const { return v[i]; } + long ndims() const { return v.size(); } + long rows() const { return v[0]; }; + long cols() const { return v[1]; }; + operator const std::vector& () const { + return v; + } + std::vector v; +}; + +inline bool operator==(const Dim& a, const Dim& b) { return a.v == b.v; } +inline bool operator!=(const Dim& a, const Dim& b) { return a.v != b.v; } + +std::ostream& operator<<(std::ostream& os, const Dim& d); + +#endif diff --git a/cnn/backends/thpp/edges.cc b/cnn/backends/thpp/edges.cc new file mode 100644 index 000000000..e8953c40b --- /dev/null +++ b/cnn/backends/thpp/edges.cc @@ -0,0 +1,469 @@ +#include "cnn/edges.h" + +#include +#include +#include + +using namespace std; + +namespace cnn { + +string CwiseMultiply::as_string(const vector& arg_names) const { + ostringstream s; + s << arg_names[0] << " \\cdot " << arg_names[1]; + return s.str(); +} + +Tensor CwiseMultiply::forward(const vector& xs) const { + assert(xs.size() == 2); + Tensor fx; + fx.cmul(*xs[0], *xs[1]); + return fx; +} + +Tensor CwiseMultiply::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + assert(i < 2); + Tensor dEdx; + if (i == 0) { + dEdx.cmul(dEdf, *xs[1]); + } else { + dEdx.cmul(dEdf, *xs[0]); + } + return dEdx; +} + +string Negate::as_string(const vector& arg_names) const { + ostringstream s; + s << '-' << arg_names[0]; + return s.str(); +} + +Tensor Negate::forward(const vector& xs) const { + assert(xs.size() == 1); + return -(*xs[0]); +} + +Tensor Negate::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + assert(i == 0); + return -dEdf; +} + +string LogSoftmax::as_string(const vector& arg_names) const { + ostringstream s; + s << "log_softmax(" << arg_names[0] << ')'; + return s.str(); +} + +Tensor LogSoftmax::forward(const vector& xs) const { + assert(xs.size() == 1); + const Tensor& x = *xs.front(); + Tensor fx; + fx.softmax(x); + fx.log(); + return fx; +} + +Tensor LogSoftmax::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + assert(i == 0); + + Tensor u; + u.exp(fx); + Tensor dEdu; + dEdu.cdiv(dEdf, u); + Tensor dEdx; + dEdx.softmax_backward(dEdu, u); + return dEdx; +} + +string Softmax::as_string(const vector& arg_names) const { + ostringstream s; + s << "softmax(" << arg_names[0] << ')'; + return s.str(); +} + +Tensor Softmax::forward(const vector& xs) const { + assert(xs.size() == 1); + const Tensor& x = *xs.front(); + Tensor fx; + fx.softmax(x); + return fx; +} + +Tensor Softmax::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + assert(i == 0); + Tensor dEdx; + dEdx.softmax_backward(dEdf, fx); + return dEdx; +} + +string OneMinusX::as_string(const vector& arg_names) const { + ostringstream s; + s << "1 - " << arg_names[0]; + return s.str(); +} + +Tensor OneMinusX::forward(const vector& xs) const { + assert(xs.size() == 1); + const Tensor& x = *xs[0]; + Tensor fx; + fx.one_minus(x); + return fx; +} + +Tensor OneMinusX::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + return -dEdf; +}; + +string Concatenate::as_string(const vector& arg_names) const { + ostringstream os; + os << "concat(" << arg_names[0]; + for (unsigned i = 1; i < arg_names.size(); ++i) { + os << ',' << arg_names[i]; + } + os << ')'; + return os.str(); +} + +Tensor Concatenate::forward(const vector& xs) const { + assert(xs.size() > 0); + assert(xs.front()->ndims() == 1); + Tensor prev = *xs[0]; + src_row_indices.resize(xs.size()); + src_row_indices[0] = 0; + for (unsigned i = 1; i < xs.size(); ++i) { + src_row_indices[i] = prev.size(0); + Tensor t; + t.cat(prev, *xs[i], 0); + prev = t; + } + return prev; +} + +Tensor Concatenate::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + Tensor dEdx; + unsigned rows = xs[i]->size(0); + dEdx.narrow(dEdf,0,src_row_indices[i], rows); + return dEdx; +} + +string ConcatenateColumns::as_string(const vector& arg_names) const { + ostringstream os; + os << "concat_cols(" << arg_names[0]; + for (unsigned i = 1; i < arg_names.size(); ++i) { + os << ',' << arg_names[i]; + } + os << ')'; + return os.str(); +} + +Tensor ConcatenateColumns::forward(const vector& xs) const { + assert(xs.size() > 0); + assert(xs.front()->ndims() == 1); + + Tensor prev = *xs[0]; + for (unsigned i = 1; i < xs.size(); ++i) { + Tensor t; + t.cat(prev, *xs[i], 1); + prev = t; + } + return prev; +} + +Tensor ConcatenateColumns::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + Tensor dEdx; + dEdx.narrow(dEdf,1,i,1); + return dEdx; +} + +string SquaredEuclideanDistance::as_string(const vector& arg_names) const { + ostringstream s; + s << "|| " << arg_names[0] << " - " << arg_names[1] << " ||^2"; + return s.str(); +} + +Tensor SquaredEuclideanDistance::forward(const vector& xs) const { + assert(xs.size() == 2); + Tensor res({1}); + Tensor diff = *xs[0] - *xs[1]; + diff.cmul(diff); + res.at(0) = diff.sumall(); + return res; +} + +Tensor SquaredEuclideanDistance::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + assert(i < 2); + real scale = dEdf.at(0) * 2; + if (i == 1) scale = -scale; + Tensor dEdx = *xs[0] - *xs[1]; + dEdx *= scale; + return dEdx; +} + +string Sum::as_string(const vector& arg_names) const { + ostringstream s; + s << arg_names[0]; + for (unsigned i = 1; i < arg_names.size(); ++i) + s << " + " << arg_names[i]; + return s.str(); +} + +Tensor Sum::forward(const vector& xs) const { + assert(xs.size() > 0); + Tensor fx = *xs[0]; + fx.force(Tensor::UNIQUE); + for (unsigned i = 1; i < xs.size(); ++i) + fx += *xs[i]; + return fx; +} + +Tensor Sum::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + return dEdf; +}; + +string Multilinear::as_string(const vector& arg_names) const { + ostringstream s; + s << arg_names[0]; + for (unsigned i = 1; i < arg_names.size(); i += 2) + s << " + " << arg_names[i] << " * " << arg_names[i+1]; + return s.str(); +} + +Tensor Multilinear::forward(const vector& xs) const { + assert(xs.size() % 2 == 1); + Tensor fx = *xs[0]; + fx.force(Tensor::UNIQUE); + for (unsigned i = 1; i < xs.size(); i += 2) + fx.addmv(1, 1, *xs[i], *xs[i+1]); + return fx; +} + +Tensor Multilinear::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + assert(i < xs.size()); + if (i == 0) return dEdf; + Tensor dEdx; + dEdx.resizeAs(*xs[i]); + dEdx.zero(); + // (TODO currently only vector supported, should probably support matrix with addmm) + if (i % 2 == 1) { // dif wrt matrix + dEdx.addr(0, 1, dEdf, *xs[i+1]); + } else { + // dif wrt to right arg of multiplication + Tensor xt = *xs[i-1]; + xt.transpose(); + dEdx.addmv(0, 1, xt, dEdf); + } + return dEdx; +} + +string MatrixMultiply::as_string(const vector& arg_names) const { + ostringstream s; + s << arg_names[0] << " * " << arg_names[1]; + return s.str(); +} + +Tensor MatrixMultiply::forward(const vector& xs) const { + assert(xs.size() == 2); + Tensor fx; + if (xs[1]->ndims() == 1) { + fx.resize({xs[0]->size(0)}); + fx.zero(); + fx.addmv(0, 1, *xs[0], *xs[1]); + } else { + fx.resize({xs[0]->size(0), xs[1]->size(1)}); + fx.zero(); + fx.addmm(0, 1, *xs[0], *xs[1]); + } + return fx; +} + +Tensor MatrixMultiply::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + assert(i < 2); + Tensor dEdx; + dEdx.resizeAs(*xs[i]); + dEdx.zero(); + if (i == 0) { // diff wrt a matrix + Tensor xt = *xs[1]; + if (xt.ndims() == 1) { // coeff is vector + dEdx.addr(0, 1, dEdf, xt); + } else { // coeff is matrix + xt.transpose(); + dEdx.addmm(0, 1, dEdf, xt); + } + } else { // diff wrt to second argument + Tensor xt = *xs[0]; // x[0] is a matrix, transpose it + xt.transpose(); + if (dEdf.ndims() > 1) { // matrix + dEdx.addmm(0, 1, xt, dEdf); + } else { // vector + dEdx.addmv(0, 1, xt, dEdf); + } + } + return dEdx; +} + +std::string Tanh::as_string(const vector& arg_names) const { + ostringstream s; + s << "tanh(" << arg_names[0] << ')'; + return s.str(); +} + +Tensor Tanh::forward(const vector& xs) const { + assert(xs.size() == 1); + const Tensor& x = *xs.front(); + Tensor fx; + fx.tanh(x); + return fx; +} + +Tensor Tanh::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + assert(i == 0); + Tensor dEdx; + dEdx.tanh_backward(dEdf, fx); + return dEdx; +#if 0 + assert(i == 0); + Tensor o; o.resizeAs(fx); + o.fill(1); + Tensor y = fx; + y.force(Tensor::UNIQUE); + y.cmul(y); + Tensor dEdx; + dEdx.cmul(dEdf, o - y); + return dEdx; +#endif +} + +std::string LogisticSigmoid::as_string(const vector& arg_names) const { + ostringstream s; + s << "\\sigma(" << arg_names[0] << ')'; + return s.str(); +} + +Tensor LogisticSigmoid::forward(const vector& xs) const { + assert(xs.size() == 1); + const Tensor& x = *xs.front(); + Tensor fx; + fx.logistic_sigmoid(x); + return fx; +} + +Tensor LogisticSigmoid::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + assert(i == 0); + Tensor dEdx; + dEdx.logistic_sigmoid_backward(dEdf, fx); + return dEdx; +} + +// x_1 is a vector +// y = (x_1)_{*pval} +string PickElement::as_string(const vector& arg_names) const { + ostringstream s; + s << "pick(" << arg_names[0] << ',' << *pval << ')'; + return s.str(); +} + +Tensor PickElement::forward(const vector& xs) const { + assert(xs.size() == 1); + const Tensor& x = *xs.front(); + assert(x.ndims() == 1); + Tensor fx; + fx.narrow(x, 0, *pval, 1); + return fx; +} + +// derivative is 0 in all dimensions except 1 for the selected element +Tensor PickElement::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + assert(i == 0); + assert(dEdf.isScalar()); + const Tensor& x = *xs.front(); + + // TODO should be sparse + Tensor dEdx = Zero(Dim({x.size(0)})); + dEdx.at({*pval}) = dEdf.front(); + return dEdx; +} + +// you could do this with LogisticSigmoid, Softmax or a variety of other +// functions, but this is often useful. +// x_1 must be a scalar that is a value between 0 and 1 +// target_y is a value between 0 and 1 +// y = ty * log(x_1) + (1 - ty) * log(x_1) +string BinaryLogLoss::as_string(const vector& arg_names) const { + ostringstream os; + os << "binary_log_loss(" << arg_names[0] << ", " << *ptarget_y << ')'; + return os.str(); +} + +Tensor BinaryLogLoss::forward(const vector& xs) const { + assert(xs.size() == 1); + assert(xs.front()->isScalar()); + const real y_pred = (*xs.front()).front(); + assert(y_pred >= real(0)); + assert(y_pred <= real(1)); + const real ty = *ptarget_y; + assert(ty >= real(0)); + assert(ty <= real(1)); + real res = 0; + if (ty > 0.) res -= ty * log(y_pred); + if ((1 - ty) > 0.) res -= (1 - ty) * log1p(-y_pred); + Tensor fx; + fx.resizeAs(*xs.front()); + fx.fill(res); + return fx; +} + +Tensor BinaryLogLoss::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + const real y_pred = xs.front()->front(); + const real ty = *ptarget_y; + real scale = 0; + if (ty > 0.) scale -= ty / y_pred; + if ((1 - ty) >= 0.) scale += (1 - ty) / (1 - y_pred); + return dEdf * scale; +} + +} // namespace cnn diff --git a/cnn/backends/thpp/model.cc b/cnn/backends/thpp/model.cc new file mode 100644 index 000000000..5f9bb434a --- /dev/null +++ b/cnn/backends/thpp/model.cc @@ -0,0 +1,81 @@ +#include "cnn/model.h" +#include "cnn/tensor.h" + +#include + +using namespace std; + +namespace cnn { + +ParametersBase::~ParametersBase() {} + +size_t Parameters::size() const { return num_params(values); } + +void Parameters::rescale_gradient(real scale) { g *= scale; } + +real Parameters::g_squared_l2norm() const { + float n = g.normall(2); + return n * n; +} + +void Parameters::accumulate_grad(const Tensor& d) { g += d; } + +void Parameters::clear() { + g.zero(); +} + +size_t LookupParameters::size() const { + return values.size() * num_params(values[0]); +} + +real LookupParameters::g_squared_l2norm() const { + real a = 0; + for (auto& it : this->g) { + real n = it.second.normall(2); + a += n*n; + } + return a; +} + +void LookupParameters::accumulate_grad(unsigned index, const Tensor& d) { + auto it = this->g.find(index); + if (it == this->g.end()) { + g[index] = d; + } else { + it->second += d; + } +} + +void LookupParameters::rescale_gradient(real scale) { + for (auto& it : this->g) + it.second *= scale; +} + +void LookupParameters::clear() { g.clear(); } + +Model::~Model() { + for (auto p : all_params) delete p; +} + +Parameters* Model::add_parameters(const Dim& d) { + Parameters* p = new Parameters(d); + all_params.push_back(p); + params.push_back(p); + return p; +} + +Parameters* Model::add_parameters(const Tensor& m) { // initial value is m + Parameters* p = new Parameters(m); + all_params.push_back(p); + params.push_back(p); + return p; +} + +LookupParameters* Model::add_lookup_parameters(unsigned n, const Dim& d) { + LookupParameters* p = new LookupParameters(n,d); + all_params.push_back(p); + lookup_params.push_back(p); + return p; +} + +} // namespace cnn diff --git a/cnn/backends/thpp/random.h b/cnn/backends/thpp/random.h new file mode 100644 index 000000000..3f37ad2d6 --- /dev/null +++ b/cnn/backends/thpp/random.h @@ -0,0 +1,12 @@ +#ifndef CNN_EIGEN_RANDOM_H +#define CNN_EIGEN_RANDOM_H + +#include + +namespace cnn { + +extern std::mt19937* rndeng; + +} // namespace cnn + +#endif diff --git a/cnn/backends/thpp/tensor.h b/cnn/backends/thpp/tensor.h new file mode 100644 index 000000000..c4f81d055 --- /dev/null +++ b/cnn/backends/thpp/tensor.h @@ -0,0 +1,162 @@ +#ifndef CNN_THPP_TENSOR_H_ +#define CNN_THPP_TENSOR_H_ + +#include + +#include +#include "thpp/Tensor.h" +#include "cnn/backends/thpp/random.h" +#include "cnn/backends/thpp/dim.h" + +#define THPP_BACKEND 1 + +namespace cnn { + +void Initialize(int& argc, char**& argv); + +typedef thpp::Tensor Tensor; +typedef float real; + +inline real as_scalar(const Tensor& t) { + assert(t.isScalar()); + return t.front(); +} + +inline std::vector as_vector(const Tensor& t) { + std::vector res(t.size()); + std::memcpy(&res[0], t.data(), sizeof(real) * t.size()); + return res; +} + +inline Tensor Constant(const Dim& d, real c) { + Tensor t(d); + t.fill(c); + return t; +} +inline Tensor Zero(const Dim& d) { + Tensor z(d); + z.zero(); + return z; +} + +inline Dim size(const Tensor& m) { return m.sizes(); } + +inline size_t num_params(const Tensor& m) { return m.size(); } + +inline real rand01() { + std::uniform_real_distribution distribution(0, 1); + return distribution(*rndeng); +} + +// avoid using this, because it's slow +inline Tensor FromEigenMatrix(const Eigen::MatrixXf& src) { + if (src.cols() == 1) { + Tensor t({src.rows()}); + auto p = t.storage(); + int i = 0; + for (int r = 0; r < src.rows(); ++r) + p[i++] = src(r, 0); + return t; + } else { + Tensor t({src.rows(), src.cols()}); + auto p = t.storage(); + int i = 0; + for (int r = 0; r < src.rows(); ++r) + for (int c = 0; c < src.cols(); ++c) + p[i++] = src(r,c); + return t; + } +} + +inline Tensor FromRawData(const Dim& dim, const float* data) { + Tensor t(dim); + std::memcpy(t.data(), data, sizeof(float) * dim.size()); + return t; +} + +inline Tensor Random(const Dim& d, real scale) { + // TODO replace with TH-appropriate thing + std::uniform_real_distribution distribution(-scale,scale); + auto b = [&] (real) {return distribution(*rndeng);}; + int cols = 1; + if (d.ndims() > 1) cols = d.size(1); + if (d.ndims() > 2) { assert(!"not implemented"); } + return FromEigenMatrix(Eigen::MatrixXf::NullaryExpr(d.size(0), cols, b)); +} + +inline Tensor Random(const Dim& d) { + return Random(d, sqrt(6) / sqrt(d.size())); +} + +inline Tensor RandomBernoulli(const Dim& d, real p) { + // TODO replace with TH-appropriate thing + std::bernoulli_distribution distribution(p); + auto b = [&] (real) {return distribution(*rndeng);}; + int cols = 1; + if (d.ndims() > 1) cols = d.size(1); + if (d.ndims() > 2) { assert(!"not implemented"); } + return FromEigenMatrix(Eigen::MatrixXf::NullaryExpr(d.size(0), cols, b)); +} + +inline Tensor RandomNormal(const Dim& d, real mean, real stddev) { + // TODO replace with TH-appropriate thing + std::normal_distribution distribution(mean, stddev); + auto b = [&] (real) {return distribution(*rndeng);}; + int cols = 1; + if (d.ndims() > 1) cols = d.size(1); + if (d.ndims() > 2) { assert(!"not implemented"); } + return FromEigenMatrix(Eigen::MatrixXf::NullaryExpr(d.size(0), cols, b)); +} + +inline Tensor Crm(std::initializer_list dim, const std::initializer_list& v) { + Tensor t(dim); + auto p = t.storage(); + int i = 0; + for (const auto& x : v) { + p[i++] = x; + } + return t; +} + +// in column-major order, consecutive elements of the columns are contiguous. +// in TH, matrices are stored in row-major (i.e., C) order +inline Tensor Ccm(std::initializer_list dim, const std::initializer_list& v) { + if (dim.size() == 1) return Crm(dim, v); + assert(dim.size() == 2); + Tensor t(dim); + t.zero(); + int cc = 0; + int cr = 0; + for (const auto& x : v) { + t.at({cr, cc}) = x; + ++cr; + if (cr == t.size(0)) { cr = 0; ++cc; } + } + return t; +} + +inline std::string str(const Tensor& T) { + std::ostringstream os; + if (T.ndims() == 2) { + int m = T.size(0); + int n = T.size(1); + for (int i = 0; i < m; ++i) { + for (int j = 0; j < n; ++j) { + os << '\t' << T.at({i,j}); + } + os << std::endl; + } + } else if (T.ndims() == 1) { + os << T << std::endl; + for (int i = 0; i < T.size(); ++i) { os << '\t' << T.at(i) << std::endl; } + } else { + os << T; + for (int i = 0; i < T.size(); ++i) { os << ' ' << T.at(i); } + os << std::endl; + } + return os.str(); +} + +} // namespace cnn + +#endif diff --git a/cnn/cnn.cc b/cnn/cnn.cc index b15277721..d30529dd9 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -94,10 +94,11 @@ VariableIndex Hypergraph::add_const_lookup(LookupParameters* p, unsigned index) } const Tensor& Hypergraph::incremental_forward() { + vector xs; while (last_node_evaluated < nodes.size()) { Node* node = nodes[last_node_evaluated]; const Edge& in_edge = *edges[node->in_edge]; - vector xs(in_edge.arity()); + xs.resize(in_edge.arity()); unsigned ti = 0; for (VariableIndex tail_node_index : in_edge.tail) { xs[ti] = &nodes[tail_node_index]->f; @@ -128,14 +129,15 @@ void Hypergraph::backward() { } // initialize dE/dE = 1 - nodes.back()->dEdf = cnn::Constant({1,1}, 1); + nodes.back()->dEdf = cnn::Constant({1}, 1); // loop in reverse topological order + vector xs; for (int i = nodes.size() - 1; i >= 0; --i) { const Node& node = *nodes[i]; const Edge& in_edge = *edges[node.in_edge]; - vector xs(in_edge.arity()); unsigned ti = 0; + xs.resize(in_edge.arity()); for (unsigned tail_node_index : in_edge.tail) { xs[ti] = &nodes[tail_node_index]->f; ++ti; diff --git a/cnn/model.h b/cnn/model.h index 5120078d4..bf1aeb80b 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -32,9 +32,6 @@ struct Parameters : public ParametersBase { real g_squared_l2norm() const override; size_t size() const override; - real& operator()(int i, int j) { return values(i,j); } - const real& operator()(int i, int j) const { return values(i,j); } - void accumulate_grad(const Tensor& g); void clear(); @@ -44,7 +41,7 @@ struct Parameters : public ParametersBase { private: Parameters() {} explicit Parameters(const Dim& d) : dim(d), values(Random(d)), g(Zero(d)) {} - explicit Parameters(const Tensor& v) : dim(v.rows(), v.cols()), values(v), g(Zero(dim)) {} + explicit Parameters(const Tensor& v) : dim(cnn::size(v)), values(v), g(Zero(dim)) {} friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { ar & dim; diff --git a/cnn/param-edges.cc b/cnn/param-edges.cc index a604ebebe..643fa7f7c 100644 --- a/cnn/param-edges.cc +++ b/cnn/param-edges.cc @@ -40,7 +40,7 @@ string InputEdge::as_string(const vector& arg_names) const { Tensor InputEdge::forward(const vector& xs) const { assert(xs.size() == 0); - assert(dim.size() == pdata->size()); + assert((int)dim.size() == (int)pdata->size()); return FromRawData(dim, &pdata->front()); } diff --git a/cnn/saxe_init.cc b/cnn/saxe_init.cc index deeb34f6e..5eb5e73ef 100644 --- a/cnn/saxe_init.cc +++ b/cnn/saxe_init.cc @@ -9,8 +9,15 @@ using namespace std; namespace cnn { +inline Eigen::MatrixXf EigenRandomNormal(int dim, real mean, real stddev) { + normal_distribution distribution(mean, stddev); + auto b = [&] (real) {return distribution(*rndeng);}; + Eigen::MatrixXf r = Eigen::MatrixXf::NullaryExpr(dim, dim, b); + return r; +} + Tensor OrthonormalRandom(int dim, real g) { - Eigen::MatrixXf m = RandomNormal(Dim({dim, dim}), 0.0, 0.01); + Eigen::MatrixXf m = EigenRandomNormal(dim, 0.0, 0.01); Eigen::JacobiSVD svd(m, Eigen::ComputeFullU); return FromEigenMatrix(svd.matrixU()); } diff --git a/cnn/tensor.h b/cnn/tensor.h index f6a9c56d3..0c2fb0fc7 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -2,10 +2,16 @@ #define CNN_TENSOR_H_ #include "config.h" -#ifdef HAVE_MINERVA_H -//# include "backends/minerva/tensor-minerva.h" -# include "backends/eigen/tensor-eigen.h" -#else + +#ifdef WITH_MINERVA_BACKEND +# include "backends/minerva/tensor-minerva.h" +#endif + +#ifdef WITH_THPP_BACKEND +# include "backends/thpp/tensor.h" +#endif + +#ifdef WITH_EIGEN_BACKEND # include "backends/eigen/tensor-eigen.h" #endif diff --git a/cnn/tests/test_edges.cc b/cnn/tests/test_edges.cc index de9754466..387cdaa9c 100644 --- a/cnn/tests/test_edges.cc +++ b/cnn/tests/test_edges.cc @@ -13,26 +13,27 @@ using namespace cnn; BOOST_GLOBAL_FIXTURE(TestTensorSetup) + BOOST_AUTO_TEST_CASE(ESqrL2) { - Tensor U = Ccm({2,1}, {4,5}); - Tensor V = Ccm({2,1}, {1,1}); - cerr << U << endl; + auto U = Ccm({2}, {4,5}); + auto V = Ccm({2}, {1,1}); + cerr << str(U) << endl; SquaredEuclideanDistance e; vector xs = {&U, &V}; Tensor W = e.forward(xs); - cerr << "Norm^2:" << W << endl; + cerr << "Norm^2:" << str(W) << endl; double eps = 1e-5; - BOOST_CHECK_CLOSE(t(W,0,0),25., eps); - Tensor dEdf = Ccm({1,1}, {1}); + BOOST_CHECK_CLOSE(t(W,0),25., eps); + Tensor dEdf = Ccm({1}, {1}); Tensor d1 = e.backward(xs, W, dEdf, 0); Tensor d2 = e.backward(xs, W, dEdf, 1); cerr << d1 << endl; cerr << d2 << endl; - BOOST_CHECK_CLOSE(t(d1,0,0), 6., eps); - BOOST_CHECK_CLOSE(t(d1,1,0), 8., eps); - BOOST_CHECK_CLOSE(t(d2,0,0), -6., eps); - BOOST_CHECK_CLOSE(t(d2,1,0), -8., eps); + BOOST_CHECK_CLOSE(t(d1,0), 6., eps); + BOOST_CHECK_CLOSE(t(d1,1), 8., eps); + BOOST_CHECK_CLOSE(t(d2,0), -6., eps); + BOOST_CHECK_CLOSE(t(d2,1), -8., eps); } BOOST_AUTO_TEST_CASE(EMatrixMultiply) { @@ -47,16 +48,30 @@ BOOST_AUTO_TEST_CASE(EMatrixMultiply) { BOOST_CHECK_CLOSE(t(W,1,0), 100., eps); BOOST_CHECK_CLOSE(t(W,0,1), 103., eps); BOOST_CHECK_CLOSE(t(W,1,1), 136., eps); - cerr << U << endl; - cerr << V << endl; - cerr << W << endl; + Tensor dEdf = Ccm({2,2}, {-1,0.5,1,2}); + Tensor dEdx0 = mm.backward(xs, W, dEdf, 0); + cerr << str(dEdx0) << endl; + BOOST_CHECK_CLOSE(t(dEdx0,0,0),3.,eps); + BOOST_CHECK_CLOSE(t(dEdx0,0,1),3.,eps); + BOOST_CHECK_CLOSE(t(dEdx0,0,2),3.,eps); + BOOST_CHECK_CLOSE(t(dEdx0,1,0),23.5,eps); + BOOST_CHECK_CLOSE(t(dEdx0,1,1),26.,eps); + BOOST_CHECK_CLOSE(t(dEdx0,1,2),28.5,eps); + Tensor dEdx1 = mm.backward(xs, W, dEdf, 1); + cerr << str(dEdx1) << endl; + BOOST_CHECK_CLOSE(t(dEdx1,0,0),0.,eps); + BOOST_CHECK_CLOSE(t(dEdx1,1,0),-1.,eps); + BOOST_CHECK_CLOSE(t(dEdx1,2,0),-2.,eps); + BOOST_CHECK_CLOSE(t(dEdx1,0,1),5.,eps); + BOOST_CHECK_CLOSE(t(dEdx1,1,1),11.,eps); + BOOST_CHECK_CLOSE(t(dEdx1,2,1),17.,eps); } BOOST_AUTO_TEST_CASE(EColumnConcat) { - Tensor u1 = Ccm({2,1}, {1, 2}); - Tensor u2 = Ccm({2,1}, {3, 4}); - Tensor u3 = Ccm({2,1}, {5, 6}); + Tensor u1 = Ccm({2}, {1, 2}); + Tensor u2 = Ccm({2}, {3, 4}); + Tensor u3 = Ccm({2}, {5, 6}); cerr << u1 << endl; cerr << u2 << endl; cerr << u3 << endl; @@ -69,6 +84,7 @@ BOOST_AUTO_TEST_CASE(EColumnConcat) vector xs2 = {&U, &V}; Tensor W = mm.forward(xs2); cerr << W << endl; + cerr << str(W) << endl; BOOST_REQUIRE_EQUAL(Dim({2,2}),size(W)); double eps = 1e-5; BOOST_CHECK_CLOSE(t(W,0,0), 76., eps); @@ -78,53 +94,57 @@ BOOST_AUTO_TEST_CASE(EColumnConcat) Tensor b1 = cc.backward(xs, U, U, 0); Tensor b2 = cc.backward(xs, U, U, 1); Tensor b3 = cc.backward(xs, U, U, 2); - cerr << b1 << endl; - cerr << b2 << endl; - cerr << b3 << endl; - BOOST_CHECK_EQUAL(t(u1,0,0), t(b1,0,0)); - BOOST_CHECK_EQUAL(t(u1,1,0), t(b1,1,0)); - BOOST_CHECK_EQUAL(t(u2,0,0), t(b2,0,0)); - BOOST_CHECK_EQUAL(t(u2,1,0), t(b2,1,0)); - BOOST_CHECK_EQUAL(t(u3,0,0), t(b3,0,0)); - BOOST_CHECK_EQUAL(t(u3,1,0), t(b3,1,0)); + cerr << str(b1) << endl; + cerr << str(b2) << endl; + cerr << str(b3) << endl; + BOOST_CHECK_EQUAL(t(u1,0), t(b1,0)); + BOOST_CHECK_EQUAL(t(u1,1), t(b1,1)); + BOOST_CHECK_EQUAL(t(u2,0), t(b2,0)); + BOOST_CHECK_EQUAL(t(u2,1), t(b2,1)); + BOOST_CHECK_EQUAL(t(u3,0), t(b3,0)); + BOOST_CHECK_EQUAL(t(u3,1), t(b3,1)); } BOOST_AUTO_TEST_CASE(ERowConcat) { - Tensor u1 = Ccm({2,1}, {1, 4}); - Tensor u2 = Ccm({2,1}, {2, 5}); - Tensor u3 = Ccm({2,1}, {3, 6}); + Tensor u1 = Ccm({2}, {1, 4}); + Tensor u2 = Ccm({2}, {2, 5}); + Tensor u3 = Ccm({3}, {3, 6, 7}); + cerr << str(u1) << endl; + cerr << str(u2) << endl; + cerr << str(u3) << endl; vector xs = {&u1, &u2, &u3}; Concatenate cr; Tensor U = cr.forward(xs); - cerr << U << endl; - BOOST_REQUIRE_EQUAL(Dim({6,1}),size(U)); + cerr << str(U) << endl; + //BOOST_REQUIRE_EQUAL(Dim({7}),size(U)); double eps = 1e-5; - BOOST_CHECK_CLOSE(t(U,0,0), 1., eps); - BOOST_CHECK_CLOSE(t(U,1,0), 4., eps); - BOOST_CHECK_CLOSE(t(U,2,0), 2., eps); - BOOST_CHECK_CLOSE(t(U,3,0), 5., eps); - BOOST_CHECK_CLOSE(t(U,4,0), 3., eps); - BOOST_CHECK_CLOSE(t(U,5,0), 6., eps); + BOOST_CHECK_CLOSE(t(U,0), 1., eps); + BOOST_CHECK_CLOSE(t(U,1), 4., eps); + BOOST_CHECK_CLOSE(t(U,2), 2., eps); + BOOST_CHECK_CLOSE(t(U,3), 5., eps); + BOOST_CHECK_CLOSE(t(U,4), 3., eps); + BOOST_CHECK_CLOSE(t(U,5), 6., eps); Tensor b1 = cr.backward(xs, U, U, 0); Tensor b2 = cr.backward(xs, U, U, 1); Tensor b3 = cr.backward(xs, U, U, 2); - cerr << b1 << endl; - cerr << b2 << endl; - cerr << b3 << endl; - BOOST_CHECK_EQUAL(t(u1,0,0), t(b1,0,0)); - BOOST_CHECK_EQUAL(t(u1,1,0), t(b1,1,0)); - BOOST_CHECK_EQUAL(t(u2,0,0), t(b2,0,0)); - BOOST_CHECK_EQUAL(t(u2,1,0), t(b2,1,0)); - BOOST_CHECK_EQUAL(t(u3,0,0), t(b3,0,0)); - BOOST_CHECK_EQUAL(t(u3,1,0), t(b3,1,0)); + cerr << str(b1) << endl; + cerr << str(b2) << endl; + cerr << str(b3) << endl; + BOOST_CHECK_EQUAL(t(u1,0), t(b1,0)); + BOOST_CHECK_EQUAL(t(u1,1), t(b1,1)); + BOOST_CHECK_EQUAL(t(u2,0), t(b2,0)); + BOOST_CHECK_EQUAL(t(u2,1), t(b2,1)); + BOOST_CHECK_EQUAL(t(u3,0), t(b3,0)); + BOOST_CHECK_EQUAL(t(u3,1), t(b3,1)); + BOOST_CHECK_EQUAL(t(u3,2), t(b3,2)); } BOOST_AUTO_TEST_CASE(EMultilinear) { - Tensor b = Ccm({3,1},{1,2,3}); + Tensor b = Ccm({3},{1,2,3}); Tensor W = Ccm({3,2},{2,4,6,3,5,7}); - Tensor x = Ccm({2,1},{-1,1}); + Tensor x = Ccm({2},{-1,1}); Multilinear ml; vector mlxs = {&b, &W, &x}; Tensor r1 = ml.forward(mlxs); @@ -132,26 +152,41 @@ BOOST_AUTO_TEST_CASE(EMultilinear) { MatrixMultiply mm; Tensor p = mm.forward(vector({&W, &x})); Tensor r2 = se.forward(vector({&p, &b})); - BOOST_REQUIRE_EQUAL(size(r1), size(r2)); + BOOST_REQUIRE(size(r1) == size(r2)); double eps = 1e-5; cerr << r1 << endl; cerr << r2 << endl; - BOOST_CHECK_CLOSE(t(r1,0,0), 2., eps); - BOOST_CHECK_CLOSE(t(r1,1,0), 3., eps); - BOOST_CHECK_CLOSE(t(r1,2,0), 4., eps); - BOOST_CHECK_CLOSE(t(r2,0,0), 2., eps); - BOOST_CHECK_CLOSE(t(r2,1,0), 3., eps); - BOOST_CHECK_CLOSE(t(r2,2,0), 4., eps); - Tensor dEdf = Ccm({3,1}, {1., 0.5, 0.25}); + BOOST_CHECK_CLOSE(t(r1,0), 2., eps); + BOOST_CHECK_CLOSE(t(r1,1), 3., eps); + BOOST_CHECK_CLOSE(t(r1,2), 4., eps); + BOOST_CHECK_CLOSE(t(r2,0), 2., eps); + BOOST_CHECK_CLOSE(t(r2,1), 3., eps); + BOOST_CHECK_CLOSE(t(r2,2), 4., eps); + cerr << "Multilinear forward complete\n"; + Tensor dEdf = Ccm({3}, {1., 0.5, 0.25}); Tensor dEdx = ml.backward(mlxs, r1, dEdf, 0); - BOOST_CHECK_EQUAL(size(dEdx), size(b)); + cerr << "BACK 0:\n"; + BOOST_CHECK(size(dEdx) == size(b)); + cerr << str(dEdx) << endl; + BOOST_CHECK_CLOSE(t(dEdx,0), 1., eps); + BOOST_CHECK_CLOSE(t(dEdx,1), 0.5, eps); + BOOST_CHECK_CLOSE(t(dEdx,2), 0.25, eps); dEdx = ml.backward(mlxs, r1, dEdf, 1); - BOOST_CHECK_EQUAL(size(dEdx), size(W)); - cerr << dEdx << endl; + cerr << "BACK 1:\n"; + BOOST_CHECK(size(dEdx) == size(W)); + cerr << str(dEdx) << endl; + BOOST_CHECK_CLOSE(t(dEdx,0,0), -1., eps); + BOOST_CHECK_CLOSE(t(dEdx,1,0), -0.5, eps); + BOOST_CHECK_CLOSE(t(dEdx,2,0), -0.25, eps); + BOOST_CHECK_CLOSE(t(dEdx,0,1), 1., eps); + BOOST_CHECK_CLOSE(t(dEdx,1,1), 0.5, eps); + BOOST_CHECK_CLOSE(t(dEdx,2,1), 0.25, eps); dEdx = ml.backward(mlxs, r1, dEdf, 2); - BOOST_CHECK_EQUAL(size(dEdx), size(x)); - cerr << r2 << endl; - cerr << r1 << endl; + cerr << "BACK 2:\n"; + BOOST_CHECK(size(dEdx) == size(x)); + cerr << str(dEdx) << endl; + BOOST_CHECK_CLOSE(t(dEdx,0), 5.5, eps); + BOOST_CHECK_CLOSE(t(dEdx,1), 7.25, eps); } BOOST_AUTO_TEST_CASE(ELogisticSigmoid) { @@ -166,6 +201,8 @@ BOOST_AUTO_TEST_CASE(ELogisticSigmoid) { BOOST_CHECK_CLOSE(t(r,2,0), 0.5, eps); BOOST_CHECK_CLOSE(t(r,3,0), 0.75, eps); BOOST_CHECK_CLOSE(t(r,4,0), 1. - t(r,0,0), eps); + cerr << "HERE\n"; + cerr << str(r) << endl; Tensor dEdf = Ccm({5,1},{1.,1.,1.,1.,1.}); Tensor dEdx = ls.backward(xs, r, dEdf, 0); BOOST_CHECK_CLOSE(t(dEdx,1,0), 0.1875, eps); @@ -179,13 +216,14 @@ BOOST_AUTO_TEST_CASE(ETanh) { Tanh th; vector xs = {&x}; Tensor r = th.forward(xs); - BOOST_REQUIRE_EQUAL(size(r), size(x)); + BOOST_REQUIRE(size(r) == size(x)); double eps = 1e-2; BOOST_CHECK_CLOSE(t(r,1,0), -0.8, eps); BOOST_CHECK_CLOSE(t(r,2,0), 0, eps); BOOST_CHECK_CLOSE(t(r,3,0), 0.8, eps); BOOST_CHECK_CLOSE(t(r,4,0), -t(r,0,0), eps); Tensor dEdf = Ccm({5,1},{1.,1.,1.,1.,1.}); + cerr << "Tanh complete forward\n"; Tensor dEdx = th.backward(xs, r, dEdf, 0); BOOST_CHECK_CLOSE(t(dEdx,1,0), 0.36, eps); BOOST_CHECK_CLOSE(t(dEdx,2,0), 1.0, eps); @@ -193,34 +231,77 @@ BOOST_AUTO_TEST_CASE(ETanh) { BOOST_CHECK_CLOSE(t(dEdx,4,0), t(dEdx,0,0), eps); } +BOOST_AUTO_TEST_CASE(MatrixVector) { + cerr << "Matrix-Vector\n"; + Tensor W = Ccm({3,2},{2,4,6,3,5,7}); + Tensor x = Ccm({2},{-1,1}); + MatrixMultiply mm; + vector xs = {&W, &x}; + Tensor fx = mm.forward(xs); + cerr << str(fx) << endl; + Tensor dEdf = Ccm({3},{-.5,0.25,5}); + Tensor M = mm.backward(xs, fx, dEdf, 0); + cerr << "Diff with respect to W:\n"; + cerr << str(M) << endl; + double eps = 1e-5; + BOOST_CHECK_CLOSE(t(M,0,0), 0.5, eps); + BOOST_CHECK_CLOSE(t(M,1,0), -0.25, eps); + BOOST_CHECK_CLOSE(t(M,2,0), -5, eps); + BOOST_CHECK_CLOSE(t(M,0,1), -0.5, eps); + BOOST_CHECK_CLOSE(t(M,1,1), 0.25, eps); + BOOST_CHECK_CLOSE(t(M,2,1), 5, eps); + Tensor vv = mm.backward(xs, fx, dEdf, 1); + cerr << "Diff with respect to x:\n"; + cerr << str(vv) << endl; + BOOST_CHECK_CLOSE(t(vv,0), 30., eps); + BOOST_CHECK_CLOSE(t(vv,1), 34.75, eps); +} + +BOOST_AUTO_TEST_CASE(EOneMinus) { + Tensor W = Ccm({2,2},{1,2,3,-4}); + OneMinusX om; + vector xs(1, &W); + Tensor O = om.forward(xs); + cerr << str(W) << endl; + cerr << str(O) << endl; + double eps = 1e-6; + BOOST_CHECK_CLOSE(10 + 1 - t(W,0,0), 10 + t(O,0,0), eps); + BOOST_CHECK_CLOSE(10 + 1 - t(W,0,1), 10 + t(O,0,1), eps); + BOOST_CHECK_CLOSE(10 + 1 - t(W,1,0), 10 + t(O,1,0), eps); + BOOST_CHECK_CLOSE(10 + 1 - t(W,1,1), 10 + t(O,1,1), eps); + Tensor V = -W; + cerr << str(W) << endl; + cerr << str(V) << endl; +} + BOOST_AUTO_TEST_CASE(ESoftmaxUnif) { for (float v = -12.; v < 12.; v += 1.) { - Tensor u = Ccm({4,1}, {v, v, v, v}); + Tensor u = Ccm({4}, {v, v, v, v}); Softmax sm; vector xs = {&u}; Tensor m = sm.forward(xs); - BOOST_REQUIRE_EQUAL(Dim({4,1}),size(m)); + BOOST_REQUIRE_EQUAL(Dim({4}),size(m)); double eps = 1e-5; for (unsigned i = 0; i < 4; ++i) - BOOST_CHECK_CLOSE(t(m, i, 0), 0.25, eps); - Tensor dEdf = Ccm({4,1}, {1., 0., 0., 0.}); + BOOST_CHECK_CLOSE(t(m, i), 0.25, eps); + Tensor dEdf = Ccm({4}, {1., 0., 0., 0.}); Tensor d = sm.backward(xs, m, dEdf, 0); - BOOST_CHECK_CLOSE(t(d,0,0), 0.1875, eps); - BOOST_CHECK_CLOSE(t(d,1,0), -0.0625, eps); - BOOST_CHECK_CLOSE(t(d,2,0), -0.0625, eps); - BOOST_CHECK_CLOSE(t(d,3,0), -0.0625, eps); + BOOST_CHECK_CLOSE(t(d,0), 0.1875, eps); + BOOST_CHECK_CLOSE(t(d,1), -0.0625, eps); + BOOST_CHECK_CLOSE(t(d,2), -0.0625, eps); + BOOST_CHECK_CLOSE(t(d,3), -0.0625, eps); // cerr << d << endl; LogSoftmax lsm; Tensor lm = lsm.forward(xs); - BOOST_REQUIRE_EQUAL(Dim({4,1}),size(lm)); + BOOST_REQUIRE_EQUAL(Dim({4}),size(lm)); for (unsigned i = 0; i < 4; ++i) - BOOST_CHECK_CLOSE(log(t(m, i, 0)), t(lm, i, 0), eps); + BOOST_CHECK_CLOSE(log(t(m, i)), t(lm, i), eps); Tensor b = lsm.backward(xs, lm, dEdf, 0); - BOOST_CHECK_CLOSE(t(b, 0, 0), 0.75, eps); - BOOST_CHECK_CLOSE(t(b, 1, 0), -0.25, eps); - BOOST_CHECK_CLOSE(t(b, 2, 0), -0.25, eps); - BOOST_CHECK_CLOSE(t(b, 3, 0), -0.25, eps); + BOOST_CHECK_CLOSE(t(b, 0), 0.75, eps); + BOOST_CHECK_CLOSE(t(b, 1), -0.25, eps); + BOOST_CHECK_CLOSE(t(b, 2), -0.25, eps); + BOOST_CHECK_CLOSE(t(b, 3), -0.25, eps); } } diff --git a/cnn/tests/test_init.cc b/cnn/tests/test_init.cc index 15ebb4d67..2449260cb 100644 --- a/cnn/tests/test_init.cc +++ b/cnn/tests/test_init.cc @@ -15,14 +15,23 @@ BOOST_GLOBAL_FIXTURE(TestTensorSetup) BOOST_AUTO_TEST_CASE(EOrthonormalRandom) { - for (int d = 4; d < 128; d += 1) { + for (int d = 4; d < 128; d += 2) { Tensor Q = OrthonormalRandom(d, 1.0); - BOOST_REQUIRE_EQUAL(size(Q), Dim({d,d})); +// BOOST_REQUIRE_EQUAL(size(Q), Dim({d,d})); // check that this is actually returning orthogonal matrices #if MINERVA_BACKEND Tensor I = Q.Trans() * Q; -#else +#endif +#if THPP_BACKEND + Tensor QT = Q; + QT.transpose(); + //cerr << str(Q) << endl << str(QT) << endl; + Tensor I = Zero({d,d}); + I.addmm(0, 1, Q, QT); + //cerr << str(I) << endl; +#endif +#if EIGEN_BACKEND Tensor I = Q.transpose() * Q; #endif double eps = 1e-1; @@ -30,6 +39,7 @@ BOOST_AUTO_TEST_CASE(EOrthonormalRandom) for (int j = 0; j < d; ++j) BOOST_CHECK_CLOSE(t(I,i,j) + 1., (i == j ? 2. : 1.), eps); } + cerr << "Finished\n"; } BOOST_AUTO_TEST_CASE(BernoulliInit) { diff --git a/cnn/tests/test_utils.h b/cnn/tests/test_utils.h index 42a45d601..2fdbce9d7 100644 --- a/cnn/tests/test_utils.h +++ b/cnn/tests/test_utils.h @@ -5,7 +5,7 @@ namespace cnn { -#if MINERVA_BACKEND +#if WITH_MINERVA_BACKEND struct TestTensorSetup { TestTensorSetup() { @@ -57,11 +57,19 @@ struct TestTensorSetup { }; double t(const Tensor& T, unsigned i, unsigned j) { +#if WITH_THPP_BACKEND + return T.at({i,j}); +#else return T(i, j); +#endif } double t(const Tensor& T, unsigned i) { +#if WITH_THPP_BACKEND + return T.at({i}); +#else return T(i, 0); +#endif } #endif diff --git a/cnn/training.cc b/cnn/training.cc index d93864ff5..cbebc91ad 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -40,11 +40,22 @@ void SimpleSGDTrainer::update(real scale) { } static inline Tensor& get_or_init(Tensor& x, const Tensor& t) { +#if WITH_THPP_BACKEND + if (x.ndims() == 0) { + x = Tensor(t.sizes()); + x.zero(); + } + return x; +#endif +#ifdef WITH_EIGEN_BACKEND if (x.rows() == 0) { x = t; x.setZero(); } return x; +#endif +#if WITH_MINERVA_BACKEND +#endif } void MomentumSGDTrainer::update(real scale) { diff --git a/config.h.cmake b/config.h.cmake index c319372b1..2fa96e11d 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -1,6 +1,8 @@ #ifndef CNN_CONFIG_H_ #define CNN_CONFIG_H_ -#cmakedefine HAVE_MINERVA_H @HAVE_MINERVA_H@ +#cmakedefine WITH_MINERVA_BACKEND @WITH_MINERVA_BACKEND@ +#cmakedefine WITH_THPP_BACKEND @WITH_THPP_BACKEND@ +#cmakedefine WITH_EIGEN_BACKEND @WITH_EIGEN_BACKEND@ #endif diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index c29ecb734..addd3193d 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -2,15 +2,15 @@ PROJECT(cnn:examples) CMAKE_MINIMUM_REQUIRED(VERSION 2.8) ADD_EXECUTABLE(xor xor.cc) -target_link_libraries(xor cnn ${Boost_LIBRARIES}) +target_link_libraries(xor cnn ${LIBS}) ADD_EXECUTABLE(xor-xent xor-xent.cc) -target_link_libraries(xor-xent cnn ${Boost_LIBRARIES}) +target_link_libraries(xor-xent cnn ${LIBS}) ADD_EXECUTABLE(rnnlm rnnlm.cc) -target_link_libraries(rnnlm cnn ${Boost_LIBRARIES}) +target_link_libraries(rnnlm cnn ${LIBS}) ADD_EXECUTABLE(nlm nlm.cc) -target_link_libraries(nlm cnn ${Boost_LIBRARIES}) +target_link_libraries(nlm cnn ${LIBS}) diff --git a/examples/example-data/fin-dev.txt b/examples/example-data/fin-dev.txt index 99f9d0920..43b1b525a 100644 --- a/examples/example-data/fin-dev.txt +++ b/examples/example-data/fin-dev.txt @@ -339,7 +339,6 @@ j o s k l i i n i n e n t u t k i m u s o n m e n e s t y k s e k ä s , C y t R x s u u n n i t t e l e e h a k e v a n s a l ä ä k k e e l l e l u p a a Y h d y s v a l t o j e n e l i n t a r v i k k e i d e n j a l ä ä k k e i d e n h a l l i n t o t a h o l t a j o v u o n n a 2 0 1 6 , K r i e g s m a n s a n o o . l ä ä k e v o i t a i s i i n s i l l o i n h y v ä k s y ä k ä y t t ö ö n v u o n n a 2 0 1 7 . a n a l y y t i k o t s a n o v a t , e t t ä C y t R x : n a i e m m a s t a k l i i n i s e s t ä t u t k i m u k s e s t a j o u l u k u u s s a j u l k a i s e m a t t i e d o t o s o i t t i v a t a l d o k s o r u b i s i i n i n o l e v a n l u p a a v a h o i t o p e h m y t k u d o s s a r k o o m a a n . - " p i t k ä n a i k a a k y s y m y k s e n ä o l i " e m m e o l e n ä h n e e t k l i i n i s t ä t i e t o a , k u i n k a p a l j o n s e e r o a a l ä ä k k e e s t ä i t s e s t ä ä n " , s a n o o H . C . W a i n w r i g h t & C o . - s i j o i t u s y r i t y k s e n a n a l y y t i k k o A n d r e w F e i n . t u l o s t e n j u l k a i s u v a h v i s t i m o n i e n m i e l i p i t e e n s i i t ä , e t t ä t ä m ä h o i t o o n e r i l a i n e n . F e i n k u i t e n k i n s a n o o , e t t ä o n h a n k a l a e n n u s t a a n y k y i s e n k l i i n i s e n t u t k i m u k s e n t u l o k s i a j a a i k a t a u l u a , k o s k a s e e r o a a m e r k i t t ä v ä s t i a i e m m a s t a t u t k i m u k s e s t a , j o s t a s a a t i i n h y v i ä t u l o k s i a . " m o n e n a s i a n p i t ä ä m e n n ä o i k e i n " , h ä n s a n o o . @@ -382,10 +381,8 @@ m a a i l m a n l a a j u i s e n v e d e n k u l u t u k s e n o d o t e t a a n l i s ä ä n t y v ä n 5 5 p r o s e n t i l l a v u o s i n a 2 0 0 0 - - 2 0 5 0 , j a e n e r g i a n k u l u t u k s e n o d o t e t a a n k a s v a v a n 5 0 p r o s e n t i l l a s e u r a a v a n k a h d e n v u o s i k y m m e n e n a i k a n a , j a s i k s i t a r v i t a a n k i i r e e l l i s e s t i l ä h e i s e m p ä ä y h t e i s t y ö t ä e n e r g i a - j a v e s i a l a n t o i m i j o i d e n v ä l i l l ä , j o t t a v o i d a a n l ö y t ä ä r a t k a i s u j a , j o i d e n a v u l l a k a i k k i m a a i l m a n k a n s a t v o i v a t k u k o i s t a a . t ä m ä n v u o d e n v e s i v i i k o n v e s i p a l k i n n o n s a a j a p r o f e s s o r i J o h n B r i s c o e k u v a i l i v e t t ä k a s v u n m a h d o l l i s t a v a k s i p o h j a k s i , j o t a t a r v i t s e v a t s e k ä y h t e i s k u n t a k o k o n a i s u u t e n a e t t ä m u u t s e k t o r i t . B r i s c o e s a n o i , e t t ä " k e h i t y s m a i l l a o n e d e s s ä ä n s u u r i a h a a s t e i t a . n i i d e n t ä y t y y m o b i l i s o i d a n ä m ä v a r a t . - B r i s c o e l i s ä s i , e t t ä " [ v e s i k r i i s i i n ] e i o l e o l e m a s s a p y s y v ä ä r a t k a i s u a m i s s ä ä n " . s e n s i j a a n o n h a a s t e i t a j a r a t k a i s u j a , j o t k a m u o d o s t a v a t k e h ä n . e d u s t a j a t k e s k u s t e l e v a t v i i k o n a i k a n a e n e r g i a - j a v e s i a l a n t o i m i j o i d e n k ä y n n i s s ä o l e v a s t a j a t u l e v a s t a t y ö s t ä j a y h t e i s t y ö s t ä y l i s a d a n s e m i n a a r i n , t y ö p a j a n j a t a p a h t u m a n a i k a n a . - a l u n p e r i n E t e l ä - A f r i k a s t a k o t o i s i n o l e v a p r o f e s s o r i J o h n B r i s c o e v a s t a a n o t t a a T u k h o l m a n v e s i p a l k i n n o n H ä n e n M a j e s t e e t i l t a a n R u o t s i n k u n i n g a s K a a r l e X V I K u s t a a l t a T u k h o l m a n k a u p u n g i n t a l o s s a j ä r j e s t e t t ä v ä s s ä s e r e m o n i a s s a t o r s t a i n a 4 . s y y s k u u t a . T u k h o l m a n k a n s a i n v ä l i n e n v e s i - i n s t i t u u t t i ( S I W I ) o n t u t k i m u s k e s k u s , j o k a t u o t t a a t u t k i m u s t i e t o a j a t a r j o a a p ä ä t ö k s e n t e k i j ö i l l e t i e t o a , j o t t a h e v o i v a t t e h d ä v e d e n j a k e s t ä v ä n k e h i t y k s e n k a n n a l t a j ä r k e v i ä p ä ä t ö k s i ä . k a n n a t t a a k o r e t o r i s i a k y s y m y k s i ä e d e s k y s y ä ? j o k a i n e n t i e t ä ä r e t o r i s e t k y s y m y k s e t , v a i m i t ä ? diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 9814cae7b..bb636dd60 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -81,7 +81,7 @@ struct RNNLanguageModel { // ydist = softmax(r_t) hg.add_function({i_r_t}); unsigned w = 0; - while (w == 0 || w == kSOS) { + while (w == 0 || (int)w == kSOS) { auto dist = as_vector(hg.incremental_forward()); double p = (double)rand() / (RAND_MAX + 1.0); for (; w < dist.size(); ++w) { diff --git a/examples/xor.cc b/examples/xor.cc index 141e46ae0..d5654adc6 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -47,7 +47,7 @@ int main(int argc, char** argv) { #else VariableIndex i_g = hg.add_function({i_b, i_W, i_x}); #endif - VariableIndex i_h = hg.add_function({i_g}); + VariableIndex i_h = hg.add_function({i_g}); #if 0 VariableIndex i_p = hg.add_function({i_V, i_h}); From 7ad82e3a7c7adc044bbe20a62f65103e163f2b7e Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 18 Apr 2015 23:10:43 -0400 Subject: [PATCH 003/965] default to eigen --- CMakeLists.txt | 7 +++++++ README.md | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 038cde9b5..745f807a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,13 @@ find_package(Boost COMPONENTS program_options serialization unit_test_framework include_directories(${Boost_INCLUDE_DIR}) set(LIBS ${LIBS} ${Boost_LIBRARIES}) +if(BACKEND) + message("BACKEND: ${BACKEND}") +else() + message("BACKEND not specified, defaulting to eigen.") + set(BACKEND "eigen") +endif() + if(BACKEND MATCHES "^thpp$") set(WITH_THPP_BACKEND 1) elseif(BACKEND MATCHES "^eigen$") diff --git a/README.md b/README.md index b14187eb8..be308d2b9 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ C++ neural network library In `src`, you need to first use [`cmake`](http://www.cmake.org/) to generate the makefiles - cmake -DEIGEN3_INCLUDE_DIR=/Users/cdyer/software/eigen-eigen-36fd1ba04c12 -G 'Unix Makefiles' + cmake . -DEIGEN3_INCLUDE_DIR=/Users/cdyer/software/eigen-eigen-36fd1ba04c12 Then to compile, run From cba2e1da0bd8b06043835a07d94f71ecd75963be Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 18 Apr 2015 23:16:01 -0400 Subject: [PATCH 004/965] optional load --- examples/rnnlm.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 9814cae7b..78c9332db 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -99,8 +99,8 @@ struct RNNLanguageModel { int main(int argc, char** argv) { cnn::Initialize(argc, argv); - if (argc != 3) { - cerr << "Usage: " << argv[0] << " corpus.txt dev.txt\n"; + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; } kSOS = d.Convert(""); @@ -164,9 +164,15 @@ int main(int argc, char** argv) { //RNNBuilder rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, &model); RNNLanguageModel lm(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } unsigned report_every_i = 50; - unsigned dev_every_i_reports = 25; + unsigned dev_every_i_reports = 500; unsigned si = training.size(); vector order(training.size()); for (unsigned i = 0; i < order.size(); ++i) order[i] = i; From 05390f219707c4f0b0eca5741fa6110b39733b8a Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 19 Apr 2015 13:34:58 -0400 Subject: [PATCH 005/965] remove unused interface --- cnn/backends/eigen/model.cc | 7 ------- cnn/model.h | 1 - 2 files changed, 8 deletions(-) diff --git a/cnn/backends/eigen/model.cc b/cnn/backends/eigen/model.cc index 53035d7cc..2da111572 100644 --- a/cnn/backends/eigen/model.cc +++ b/cnn/backends/eigen/model.cc @@ -61,13 +61,6 @@ Parameters* Model::add_parameters(const Dim& d) { return p; } -Parameters* Model::add_parameters(const Tensor& m) { // initial value is m - Parameters* p = new Parameters(m); - all_params.push_back(p); - params.push_back(p); - return p; -} - LookupParameters* Model::add_lookup_parameters(unsigned n, const Dim& d) { LookupParameters* p = new LookupParameters(n,d); all_params.push_back(p); diff --git a/cnn/model.h b/cnn/model.h index bf1aeb80b..11a5c6524 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -85,7 +85,6 @@ class Model { public: ~Model(); Parameters* add_parameters(const Dim& d); // initialized randomly - Parameters* add_parameters(const Tensor& m); // initial value is m LookupParameters* add_lookup_parameters(unsigned n, const Dim& d); const std::vector& all_parameters_list() const { return all_params; } From 003ea7164cb150fbde23844049e2d3346231ee5a Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 19 Apr 2015 13:45:10 -0400 Subject: [PATCH 006/965] use better interface --- examples/nlm.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/nlm.cc b/examples/nlm.cc index 782a95613..c5edac727 100644 --- a/examples/nlm.cc +++ b/examples/nlm.cc @@ -20,13 +20,13 @@ int main(int argc, char** argv) { // parameters Model model; SimpleSGDTrainer sgd(&model); - LookupParameters* p_c = model.add_lookup_parameters(VOCAB_SIZE, Dim(DIM, 1)); - Parameters* p_C1 = model.add_parameters(Dim(DIM, DIM)); - Parameters* p_C2 = model.add_parameters(Dim(DIM, DIM)); - Parameters* p_C3 = model.add_parameters(Dim(DIM, DIM)); - Parameters* p_R = model.add_parameters(Dim(VOCAB_SIZE, DIM)); - Parameters* p_bias = model.add_parameters(Dim(VOCAB_SIZE, 1)); - Parameters* p_hb = model.add_parameters(Dim(DIM, 1)); + LookupParameters* p_c = model.add_lookup_parameters(VOCAB_SIZE, {DIM}); + Parameters* p_C1 = model.add_parameters({DIM, DIM}); + Parameters* p_C2 = model.add_parameters({DIM, DIM}); + Parameters* p_C3 = model.add_parameters({DIM, DIM}); + Parameters* p_R = model.add_parameters({VOCAB_SIZE, DIM}); + Parameters* p_bias = model.add_parameters({VOCAB_SIZE}); + Parameters* p_hb = model.add_parameters({DIM}); // build the graph Hypergraph hg; @@ -90,7 +90,7 @@ int main(int argc, char** argv) { in_c2 = ci[1]; in_c3 = ci[2]; ytrue = ci[3]; - loss += hg.forward()(0,0); + loss += as_scalar(hg.forward()); hg.backward(); ++n; sgd.update(1.0); From 1faec9bde3ed196387056cdb6e8a123a81955253 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 19 Apr 2015 13:47:08 -0400 Subject: [PATCH 007/965] use better interface --- examples/xor.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/xor.cc b/examples/xor.cc index d5654adc6..e79e27773 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -20,10 +20,10 @@ int main(int argc, char** argv) { SimpleSGDTrainer sgd(&m); //MomentumSGDTrainer sgd(&m); - Parameters& p_a = *m.add_parameters(Dim({1})); - Parameters& p_b = *m.add_parameters(Dim({HIDDEN_SIZE})); - Parameters& p_W = *m.add_parameters(Dim({HIDDEN_SIZE, 2})); - Parameters& p_V = *m.add_parameters(Dim({1, HIDDEN_SIZE})); + Parameters& p_a = *m.add_parameters({1}); + Parameters& p_b = *m.add_parameters({HIDDEN_SIZE}); + Parameters& p_W = *m.add_parameters({HIDDEN_SIZE, 2}); + Parameters& p_V = *m.add_parameters({1, HIDDEN_SIZE}); // build the graph Hypergraph hg; @@ -35,7 +35,7 @@ int main(int argc, char** argv) { VariableIndex i_V = hg.add_parameter(&p_V); vector x_values(2); // set x_values to change the inputs to the network - VariableIndex i_x = hg.add_input(Dim({2}), &x_values); + VariableIndex i_x = hg.add_input({2}, &x_values); cnn::real y_value; // set y_value to change the target output VariableIndex i_y = hg.add_input(&y_value); From da87ff8701f4fc04c164a269574de263c69a425f Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 19 Apr 2015 13:47:57 -0400 Subject: [PATCH 008/965] cleaner interface --- examples/xor-xent.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index 4b013bd1a..f1d87c40e 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -19,10 +19,10 @@ int main(int argc, char** argv) { //SimpleSGDTrainer sgd(&m); MomentumSGDTrainer sgd(&m); - Parameters& p_a = *m.add_parameters(Dim({1})); - Parameters& p_b = *m.add_parameters(Dim({HIDDEN_SIZE})); - Parameters& p_W = *m.add_parameters(Dim({HIDDEN_SIZE, 2})); - Parameters& p_V = *m.add_parameters(Dim({1, HIDDEN_SIZE})); + Parameters& p_a = *m.add_parameters({1}); + Parameters& p_b = *m.add_parameters({HIDDEN_SIZE}); + Parameters& p_W = *m.add_parameters({HIDDEN_SIZE, 2}); + Parameters& p_V = *m.add_parameters({1, HIDDEN_SIZE}); // build the graph Hypergraph hg; @@ -34,7 +34,7 @@ int main(int argc, char** argv) { VariableIndex i_V = hg.add_parameter(&p_V); vector x_values(2); // set x_values to change the inputs to the network - VariableIndex i_x = hg.add_input(Dim({2}), &x_values); + VariableIndex i_x = hg.add_input({2}, &x_values); cnn::real y_value; // set y_value to change the target output // two options: MatrixMultiply and Sum, or Multilinear From 8529dd9a384c9647d5a841a7e8c153e71a441e6e Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 19 Apr 2015 13:53:55 -0400 Subject: [PATCH 009/965] use cleaner interface --- examples/rnnlm.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 6adc5ab7d..3a6bfb7e6 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -29,9 +29,9 @@ struct RNNLanguageModel { Parameters* p_bias; Builder builder; explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { - p_c = model.add_lookup_parameters(VOCAB_SIZE, Dim({INPUT_DIM})); - p_R = model.add_parameters(Dim({VOCAB_SIZE, HIDDEN_DIM})); - p_bias = model.add_parameters(Dim({VOCAB_SIZE})); + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({VOCAB_SIZE}); } // return VariableIndex of total loss From e1e8c43920da0270b8a05b69a1301cc064131cc4 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 19 Apr 2015 19:40:02 -0400 Subject: [PATCH 010/965] tensor inner product --- cnn/edges.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cnn/edges.h b/cnn/edges.h index ec478cf74..9e63b8b66 100644 --- a/cnn/edges.h +++ b/cnn/edges.h @@ -5,6 +5,22 @@ namespace cnn { +// Forward: +// Y_ij = A_ijk * B_k + C_ij +// +// Backward: +// (dE/dA)_ijk = (dE/dY)_ij * L_k +// (dE/dB)_k = (dE/dY)_ij * A_ijk +// (dE/dC)_ij = (dE/dY)_ij +struct InnerProduct3D_1D : public Edge { + std::string as_string(const std::vector& arg_names) const override; + Tensor forward(const std::vector& xs) const override; + Tensor backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const override; +}; + // n_{i,j} ~ N(0,stddev) // y = x + n struct GaussianNoise : public Edge { From aba339b07c99769f4db6a95d93e3991cb0412bf4 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 19 Apr 2015 20:33:19 -0400 Subject: [PATCH 011/965] tensor product --- cnn/backends/thpp/backend.cc | 6 ++++- cnn/backends/thpp/edges.cc | 51 ++++++++++++++++++++++++++++++++++++ cnn/backends/thpp/model.cc | 7 ----- cnn/tests/test_edges.cc | 28 ++++++++++++++++++++ 4 files changed, 84 insertions(+), 8 deletions(-) diff --git a/cnn/backends/thpp/backend.cc b/cnn/backends/thpp/backend.cc index a92db69e4..61c46a907 100644 --- a/cnn/backends/thpp/backend.cc +++ b/cnn/backends/thpp/backend.cc @@ -1,5 +1,6 @@ #include "cnn/backends/thpp/tensor.h" +#include #include using namespace std; @@ -9,9 +10,12 @@ namespace cnn { std::mt19937* rndeng = nullptr; void Initialize(int& argc, char**& argv) { + cerr << "COMMAND:"; + for (int i = 0; i < argc; ++i) + cerr << ' ' << argv[i]; + cerr << endl; std::random_device rd; rndeng = new mt19937(rd()); - cerr << "Created random generator: " << rndeng << endl; } } diff --git a/cnn/backends/thpp/edges.cc b/cnn/backends/thpp/edges.cc index e8953c40b..3e003d004 100644 --- a/cnn/backends/thpp/edges.cc +++ b/cnn/backends/thpp/edges.cc @@ -8,6 +8,57 @@ using namespace std; namespace cnn { +string InnerProduct3D_1D::as_string(const vector& arg_names) const { + ostringstream s; + s << "inner(" << arg_names[0] << "," << arg_names[1] << ") + " << arg_names[2]; + return s.str(); +} + +Tensor InnerProduct3D_1D::forward(const vector& xs) const { + assert(xs.size() == 3); + Tensor fx; + fx.inner(*xs[0], *xs[1]); + fx += *xs[2]; + return fx; +} + +Tensor InnerProduct3D_1D::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + assert(i < 3); + if (i == 2) return dEdf; + const int ii = dEdf.size(0); + const int jj = dEdf.size(1); + const int kk = xs[1]->size(0); + Tensor dEdx; + if (i == 0) { +// (dE/dA)_ijk = (dE/dY)_ij * L_k + dEdx.resize({ii, jj, kk}); + const real* x1 = xs[1]->data(); + for (int i = 0; i < ii; ++i) { + for (int j = 0; j < jj; ++j) { + const real d = dEdf.at({i,j}); + for (int k = 0; k < kk; ++k) + dEdx.at({i,j,k}) = d * x1[k]; + } + } + return dEdx; + } +// (dE/dB)_k = (dE/dY)_ij * A_ijk + dEdx.resize({kk}); + dEdx.zero(); + const Tensor& x0 = *xs[0]; + for (int i = 0; i < ii; ++i) { + for (int j = 0; j < jj; ++j) { + const real d = dEdf.at({i,j}); + for (int k = 0; k < kk; ++k) + dEdx.at({k}) += d * x0.at({i,j,k}); + } + } + return dEdx; +} + string CwiseMultiply::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0] << " \\cdot " << arg_names[1]; diff --git a/cnn/backends/thpp/model.cc b/cnn/backends/thpp/model.cc index 5f9bb434a..21261f272 100644 --- a/cnn/backends/thpp/model.cc +++ b/cnn/backends/thpp/model.cc @@ -64,13 +64,6 @@ Parameters* Model::add_parameters(const Dim& d) { return p; } -Parameters* Model::add_parameters(const Tensor& m) { // initial value is m - Parameters* p = new Parameters(m); - all_params.push_back(p); - params.push_back(p); - return p; -} - LookupParameters* Model::add_lookup_parameters(unsigned n, const Dim& d) { LookupParameters* p = new LookupParameters(n,d); all_params.push_back(p); diff --git a/cnn/tests/test_edges.cc b/cnn/tests/test_edges.cc index 387cdaa9c..6a541f55a 100644 --- a/cnn/tests/test_edges.cc +++ b/cnn/tests/test_edges.cc @@ -305,4 +305,32 @@ BOOST_AUTO_TEST_CASE(ESoftmaxUnif) { } } +#ifdef WITH_THPP_BACKEND +BOOST_AUTO_TEST_CASE(TensorInner3D_1D) { + Tensor A = Ccm({24}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}); + A.reshape(A, {2,3,4}); + Tensor v = Ccm({4}, {-0.5, 1, 1.5, 2}); + Tensor B = Ccm({2,3}, {1, 2, 3, 4, 5, 6}); + vector xs = {&A, &v, &B}; + InnerProduct3D_1D e; + Tensor Y = e.forward(xs); + cerr << str(Y) << endl; + double eps = 1e-5; + BOOST_CHECK_CLOSE(t(Y, 0, 0), 11, eps); + BOOST_CHECK_CLOSE(t(Y, 1, 0), 60, eps); + BOOST_CHECK_CLOSE(t(Y, 0, 1), 29, eps); + BOOST_CHECK_CLOSE(t(Y, 1, 1), 78, eps); + BOOST_CHECK_CLOSE(t(Y, 0, 2), 47, eps); + BOOST_CHECK_CLOSE(t(Y, 1, 2), 96, eps); + Tensor dEdY = Ccm({2,3}, {1, 0.1, -1, 1.2, 2, -0.25}); + Tensor dEdx3 = e.backward(xs, Y, dEdY, 2); + cerr << str(dEdY) << endl; + cerr << str(dEdx3) << endl; + Tensor dEdx1 = e.backward(xs, Y, dEdY, 0); + cerr << dEdx1 << endl; + //cerr << str(dEdx1) << endl; + Tensor dEdx2 = e.backward(xs, Y, dEdY, 1); + cerr << str(dEdx2) << endl; +} +#endif From 9b533f570f261d454fd1cc02f1a68b1a08a37df2 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 24 Apr 2015 18:16:03 +0000 Subject: [PATCH 012/965] add include --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 745f807a9..792d6736e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,6 +95,7 @@ find_package(Eigen3 REQUIRED) include_directories(${EIGEN3_INCLUDE_DIR}) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) +include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory(cnn) add_subdirectory(examples) From 9df2069e16e8c7b7e42490b689616a7eb29bf111 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 26 Apr 2015 23:11:05 -0400 Subject: [PATCH 013/965] factor out common code from edges --- cnn/CMakeLists.txt | 1 + cnn/backends/eigen/edges.cc | 166 -------------------------------- cnn/backends/thpp/edges.cc | 116 ---------------------- cnn/edges-common.cc | 185 ++++++++++++++++++++++++++++++++++++ 4 files changed, 186 insertions(+), 282 deletions(-) create mode 100644 cnn/edges-common.cc diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 4b2b6be30..8d2c54cf8 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -6,6 +6,7 @@ PROJECT(cnn CXX) set(cnn_library_SRCS cnn.cc dict.cc + edges-common.cc lstm-fast.cc param-edges.cc rnn.cc diff --git a/cnn/backends/eigen/edges.cc b/cnn/backends/eigen/edges.cc index 90489795f..4f0c9dd1e 100644 --- a/cnn/backends/eigen/edges.cc +++ b/cnn/backends/eigen/edges.cc @@ -8,12 +8,6 @@ using namespace std; namespace cnn { -string GaussianNoise::as_string(const vector& arg_names) const { - ostringstream s; - s << arg_names[0] << " + N(0," << stddev << ')'; - return s.str(); -} - Tensor GaussianNoise::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs[0]; @@ -28,12 +22,6 @@ Tensor GaussianNoise::backward(const vector& xs, return dEdf; }; -string Dropout::as_string(const vector& arg_names) const { - ostringstream s; - s << "dropout(" << arg_names[0] << ",p=" << p << ')'; - return s.str(); -} - Tensor Dropout::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs[0]; @@ -49,12 +37,6 @@ Tensor Dropout::backward(const vector& xs, return dEdf.cwiseProduct(noise_mask); }; -string OneMinusX::as_string(const vector& arg_names) const { - ostringstream s; - s << "1 - " << arg_names[0]; - return s.str(); -} - Tensor OneMinusX::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs[0]; @@ -68,14 +50,6 @@ Tensor OneMinusX::backward(const vector& xs, return -dEdf; }; -string Sum::as_string(const vector& arg_names) const { - ostringstream s; - s << arg_names[0]; - for (unsigned i = 1; i < tail.size(); ++i) - s << " + " << arg_names[i]; - return s.str(); -} - Tensor Sum::forward(const vector& xs) const { assert(xs.size() > 0); Tensor res = *xs[0]; @@ -91,12 +65,6 @@ Tensor Sum::backward(const vector& xs, return dEdf; }; -string Tanh::as_string(const vector& arg_names) const { - ostringstream s; - s << "tanh(" << arg_names[0] << ')'; - return s.str(); -} - Tensor Tanh::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs.front(); @@ -112,12 +80,6 @@ Tensor Tanh::backward(const vector& xs, return Elewise::TanhBackward(dEdf, fx, x); } -string Square::as_string(const vector& arg_names) const { - ostringstream s; - s << "square(" << arg_names[0] << ')'; - return s.str(); -} - Tensor Square::forward(const vector& xs) const { assert(xs.size() == 1); // just a single input const Tensor& x = *xs.front(); @@ -132,12 +94,6 @@ Tensor Square::backward(const vector& xs, return dEdf.cwiseProduct(*xs.front()) * 2; }; -string Exp::as_string(const vector& arg_names) const { - ostringstream os; - os << "exp(" << arg_names[0] << ')'; - return os.str(); -} - Tensor Exp::forward(const vector& xs) const { assert(xs.size() == 1); return Elewise::Exp(*xs.front()); @@ -150,12 +106,6 @@ Tensor Exp::backward(const vector& xs, return dEdf.array() * fx.array(); } -string Log::as_string(const vector& arg_names) const { - ostringstream os; - os << "log(" << arg_names[0] << ')'; - return os.str(); -} - Tensor Log::forward(const vector& xs) const { assert(xs.size() == 1); return Elewise::Ln(*xs.front()); @@ -168,16 +118,6 @@ Tensor Log::backward(const vector& xs, return dEdf.array() / xs[0]->array(); } -string Concatenate::as_string(const vector& arg_names) const { - ostringstream os; - os << "concat(" << arg_names[0]; - for (unsigned i = 1; i < arg_names.size(); ++i) { - os << ',' << arg_names[i]; - } - os << ')'; - return os.str(); -} - Tensor Concatenate::forward(const vector& xs) const { assert(xs.size() > 0); unsigned rows = 0; @@ -214,16 +154,6 @@ Tensor Concatenate::backward(const vector& xs, return dEdx; } -string ConcatenateColumns::as_string(const vector& arg_names) const { - ostringstream os; - os << "concat_cols(" << arg_names[0]; - for (unsigned i = 1; i < arg_names.size(); ++i) { - os << ',' << arg_names[i]; - } - os << ')'; - return os.str(); -} - Tensor ConcatenateColumns::forward(const vector& xs) const { assert(xs.size() > 0); const unsigned rows = xs.front()->rows(); @@ -246,12 +176,6 @@ Tensor ConcatenateColumns::backward(const vector& xs, return dEdf.col(i); } -string Hinge::as_string(const vector& arg_names) const { - ostringstream os; - os << "hinge(" << arg_names[0] << ",m=" << margin << ")"; - return os.str(); -} - Tensor Hinge::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs.front(); @@ -285,10 +209,6 @@ Tensor Hinge::backward(const vector& xs, return dEdx; } -string Identity::as_string(const vector& arg_names) const { - return arg_names[0]; -} - Tensor Identity::forward(const vector& xs) const { assert(xs.size() == 1); return *xs.front(); @@ -302,12 +222,6 @@ Tensor Identity::backward(const vector& xs, return dEdf; } -string MaxPooling1D::as_string(const vector& arg_names) const { - ostringstream os; - os << "maxpool1d(" << arg_names.front() << ",w=" << width << ")"; - return os.str(); -} - Tensor MaxPooling1D::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs.front(); @@ -349,12 +263,6 @@ Tensor MaxPooling1D::backward(const vector& xs, return dEdx; } -string Softmax::as_string(const vector& arg_names) const { - ostringstream s; - s << "softmax(" << arg_names[0] << ')'; - return s.str(); -} - Tensor Softmax::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs.front(); @@ -369,12 +277,6 @@ Tensor Softmax::backward(const vector& xs, return Convolution::SoftmaxBackward(dEdf, fx, 1); } -string LogSoftmax::as_string(const vector& arg_names) const { - ostringstream s; - s << "log_softmax(" << arg_names[0] << ')'; - return s.str(); -} - Tensor LogSoftmax::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs.front(); @@ -390,12 +292,6 @@ Tensor LogSoftmax::backward(const vector& xs, return Convolution::SoftmaxBackward(dEdf.cwiseQuotient(u), u, 1); } -string RestrictedLogSoftmax::as_string(const vector& arg_names) const { - ostringstream s; - s << "r_log_softmax(" << arg_names[0] << ')'; - return s.str(); -} - inline real logsumexp(const Tensor& x, const vector& denom) { real m = x(denom[0],0); for (auto i : denom) { @@ -442,12 +338,6 @@ Tensor RestrictedLogSoftmax::backward(const vector& xs, // x_1 is a vector // y = (x_1)_{*pval} -string PickElement::as_string(const vector& arg_names) const { - ostringstream s; - s << "pick(" << arg_names[0] << ',' << *pval << ')'; - return s.str(); -} - Tensor PickElement::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs.front(); @@ -476,12 +366,6 @@ Tensor PickElement::backward(const vector& xs, // x_1 is a vector // y = (x_1)[start:end] -string PickRange::as_string(const vector& arg_names) const { - ostringstream s; - s << "slice(" << arg_names[0] << ',' << start << ':' << end << ')'; - return s.str(); -} - // slice of vector from index start (inclusive) to index end (exclusive) Tensor PickRange::forward(const vector& xs) const { assert(xs.size() == 1); @@ -511,12 +395,6 @@ Tensor PickRange::backward(const vector& xs, return dEdx; } -string MatrixMultiply::as_string(const vector& arg_names) const { - ostringstream s; - s << arg_names[0] << " * " << arg_names[1]; - return s.str(); -} - Tensor MatrixMultiply::forward(const vector& xs) const { assert(xs.size() == 2); return (*xs[0]) * (*xs[1]); @@ -534,12 +412,6 @@ Tensor MatrixMultiply::backward(const vector& xs, } } -string CwiseMultiply::as_string(const vector& arg_names) const { - ostringstream s; - s << arg_names[0] << " \\cdot " << arg_names[1]; - return s.str(); -} - Tensor CwiseMultiply::forward(const vector& xs) const { assert(xs.size() == 2); return xs[0]->cwiseProduct(*xs[1]); @@ -557,14 +429,6 @@ Tensor CwiseMultiply::backward(const vector& xs, } } -string Multilinear::as_string(const vector& arg_names) const { - ostringstream s; - s << arg_names[0]; - for (unsigned i = 1; i < arg_names.size(); i += 2) - s << " + " << arg_names[i] << " * " << arg_names[i+1]; - return s.str(); -} - Tensor Multilinear::forward(const vector& xs) const { assert(xs.size() % 2 == 1); Tensor fx = *xs.front(); @@ -598,12 +462,6 @@ Tensor Multilinear::backward(const vector& xs, return xs[i-1]->transpose() * dEdf; } -string Negate::as_string(const vector& arg_names) const { - ostringstream s; - s << '-' << arg_names[0]; - return s.str(); -} - Tensor Negate::forward(const vector& xs) const { assert(xs.size() == 1); return -(*xs[0]); @@ -617,12 +475,6 @@ Tensor Negate::backward(const vector& xs, return -dEdf; } -string Rectify::as_string(const vector& arg_names) const { - ostringstream s; - s << "ReLU(" << arg_names[0] << ')'; - return s.str(); -} - Tensor Rectify::forward(const vector& xs) const { assert(xs.size() == 1); return Elewise::ReluForward(*xs.front()); @@ -635,12 +487,6 @@ Tensor Rectify::backward(const vector& xs, return Elewise::ReluBackward(dEdf, fx, *xs.front()); } -string SquaredEuclideanDistance::as_string(const vector& arg_names) const { - ostringstream s; - s << "|| " << arg_names[0] << " - " << arg_names[1] << " ||^2"; - return s.str(); -} - Tensor SquaredEuclideanDistance::forward(const vector& xs) const { assert(xs.size() == 2); Tensor res(1,1); @@ -658,12 +504,6 @@ Tensor SquaredEuclideanDistance::backward(const vector& xs, return scale * (*xs[0] - *xs[1]); } -string LogisticSigmoid::as_string(const vector& arg_names) const { - ostringstream s; - s << "\\sigma(" << arg_names[0] << ')'; - return s.str(); -} - Tensor LogisticSigmoid::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs.front(); @@ -684,12 +524,6 @@ Tensor LogisticSigmoid::backward(const vector& xs, // x_1 must be a scalar that is a value between 0 and 1 // target_y is a value between 0 and 1 // y = ty * log(x_1) + (1 - ty) * log(x_1) -string BinaryLogLoss::as_string(const vector& arg_names) const { - ostringstream os; - os << "binary_log_loss(" << arg_names[0] << ", " << *ptarget_y << ')'; - return os.str(); -} - Tensor BinaryLogLoss::forward(const vector& xs) const { assert(xs.size() == 1); assert(xs.front()->cols() == 1); diff --git a/cnn/backends/thpp/edges.cc b/cnn/backends/thpp/edges.cc index 3e003d004..937206dd5 100644 --- a/cnn/backends/thpp/edges.cc +++ b/cnn/backends/thpp/edges.cc @@ -8,20 +8,6 @@ using namespace std; namespace cnn { -string InnerProduct3D_1D::as_string(const vector& arg_names) const { - ostringstream s; - s << "inner(" << arg_names[0] << "," << arg_names[1] << ") + " << arg_names[2]; - return s.str(); -} - -Tensor InnerProduct3D_1D::forward(const vector& xs) const { - assert(xs.size() == 3); - Tensor fx; - fx.inner(*xs[0], *xs[1]); - fx += *xs[2]; - return fx; -} - Tensor InnerProduct3D_1D::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, @@ -59,12 +45,6 @@ Tensor InnerProduct3D_1D::backward(const vector& xs, return dEdx; } -string CwiseMultiply::as_string(const vector& arg_names) const { - ostringstream s; - s << arg_names[0] << " \\cdot " << arg_names[1]; - return s.str(); -} - Tensor CwiseMultiply::forward(const vector& xs) const { assert(xs.size() == 2); Tensor fx; @@ -86,12 +66,6 @@ Tensor CwiseMultiply::backward(const vector& xs, return dEdx; } -string Negate::as_string(const vector& arg_names) const { - ostringstream s; - s << '-' << arg_names[0]; - return s.str(); -} - Tensor Negate::forward(const vector& xs) const { assert(xs.size() == 1); return -(*xs[0]); @@ -105,12 +79,6 @@ Tensor Negate::backward(const vector& xs, return -dEdf; } -string LogSoftmax::as_string(const vector& arg_names) const { - ostringstream s; - s << "log_softmax(" << arg_names[0] << ')'; - return s.str(); -} - Tensor LogSoftmax::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs.front(); @@ -135,12 +103,6 @@ Tensor LogSoftmax::backward(const vector& xs, return dEdx; } -string Softmax::as_string(const vector& arg_names) const { - ostringstream s; - s << "softmax(" << arg_names[0] << ')'; - return s.str(); -} - Tensor Softmax::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs.front(); @@ -159,12 +121,6 @@ Tensor Softmax::backward(const vector& xs, return dEdx; } -string OneMinusX::as_string(const vector& arg_names) const { - ostringstream s; - s << "1 - " << arg_names[0]; - return s.str(); -} - Tensor OneMinusX::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs[0]; @@ -180,16 +136,6 @@ Tensor OneMinusX::backward(const vector& xs, return -dEdf; }; -string Concatenate::as_string(const vector& arg_names) const { - ostringstream os; - os << "concat(" << arg_names[0]; - for (unsigned i = 1; i < arg_names.size(); ++i) { - os << ',' << arg_names[i]; - } - os << ')'; - return os.str(); -} - Tensor Concatenate::forward(const vector& xs) const { assert(xs.size() > 0); assert(xs.front()->ndims() == 1); @@ -215,16 +161,6 @@ Tensor Concatenate::backward(const vector& xs, return dEdx; } -string ConcatenateColumns::as_string(const vector& arg_names) const { - ostringstream os; - os << "concat_cols(" << arg_names[0]; - for (unsigned i = 1; i < arg_names.size(); ++i) { - os << ',' << arg_names[i]; - } - os << ')'; - return os.str(); -} - Tensor ConcatenateColumns::forward(const vector& xs) const { assert(xs.size() > 0); assert(xs.front()->ndims() == 1); @@ -247,12 +183,6 @@ Tensor ConcatenateColumns::backward(const vector& xs, return dEdx; } -string SquaredEuclideanDistance::as_string(const vector& arg_names) const { - ostringstream s; - s << "|| " << arg_names[0] << " - " << arg_names[1] << " ||^2"; - return s.str(); -} - Tensor SquaredEuclideanDistance::forward(const vector& xs) const { assert(xs.size() == 2); Tensor res({1}); @@ -274,14 +204,6 @@ Tensor SquaredEuclideanDistance::backward(const vector& xs, return dEdx; } -string Sum::as_string(const vector& arg_names) const { - ostringstream s; - s << arg_names[0]; - for (unsigned i = 1; i < arg_names.size(); ++i) - s << " + " << arg_names[i]; - return s.str(); -} - Tensor Sum::forward(const vector& xs) const { assert(xs.size() > 0); Tensor fx = *xs[0]; @@ -298,14 +220,6 @@ Tensor Sum::backward(const vector& xs, return dEdf; }; -string Multilinear::as_string(const vector& arg_names) const { - ostringstream s; - s << arg_names[0]; - for (unsigned i = 1; i < arg_names.size(); i += 2) - s << " + " << arg_names[i] << " * " << arg_names[i+1]; - return s.str(); -} - Tensor Multilinear::forward(const vector& xs) const { assert(xs.size() % 2 == 1); Tensor fx = *xs[0]; @@ -336,12 +250,6 @@ Tensor Multilinear::backward(const vector& xs, return dEdx; } -string MatrixMultiply::as_string(const vector& arg_names) const { - ostringstream s; - s << arg_names[0] << " * " << arg_names[1]; - return s.str(); -} - Tensor MatrixMultiply::forward(const vector& xs) const { assert(xs.size() == 2); Tensor fx; @@ -385,12 +293,6 @@ Tensor MatrixMultiply::backward(const vector& xs, return dEdx; } -std::string Tanh::as_string(const vector& arg_names) const { - ostringstream s; - s << "tanh(" << arg_names[0] << ')'; - return s.str(); -} - Tensor Tanh::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs.front(); @@ -420,12 +322,6 @@ Tensor Tanh::backward(const vector& xs, #endif } -std::string LogisticSigmoid::as_string(const vector& arg_names) const { - ostringstream s; - s << "\\sigma(" << arg_names[0] << ')'; - return s.str(); -} - Tensor LogisticSigmoid::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs.front(); @@ -446,12 +342,6 @@ Tensor LogisticSigmoid::backward(const vector& xs, // x_1 is a vector // y = (x_1)_{*pval} -string PickElement::as_string(const vector& arg_names) const { - ostringstream s; - s << "pick(" << arg_names[0] << ',' << *pval << ')'; - return s.str(); -} - Tensor PickElement::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs.front(); @@ -481,12 +371,6 @@ Tensor PickElement::backward(const vector& xs, // x_1 must be a scalar that is a value between 0 and 1 // target_y is a value between 0 and 1 // y = ty * log(x_1) + (1 - ty) * log(x_1) -string BinaryLogLoss::as_string(const vector& arg_names) const { - ostringstream os; - os << "binary_log_loss(" << arg_names[0] << ", " << *ptarget_y << ')'; - return os.str(); -} - Tensor BinaryLogLoss::forward(const vector& xs) const { assert(xs.size() == 1); assert(xs.front()->isScalar()); diff --git a/cnn/edges-common.cc b/cnn/edges-common.cc new file mode 100644 index 000000000..6f4ce3a6d --- /dev/null +++ b/cnn/edges-common.cc @@ -0,0 +1,185 @@ +#include "cnn/edges.h" + +#include +#include +#include + +using namespace std; + +namespace cnn { + +string InnerProduct3D_1D::as_string(const vector& arg_names) const { + ostringstream s; + s << "inner(" << arg_names[0] << "," << arg_names[1] << ") + " << arg_names[2]; + return s.str(); +} + +string GaussianNoise::as_string(const vector& arg_names) const { + ostringstream s; + s << arg_names[0] << " + N(0," << stddev << ')'; + return s.str(); +} + +string Dropout::as_string(const vector& arg_names) const { + ostringstream s; + s << "dropout(" << arg_names[0] << ",p=" << p << ')'; + return s.str(); +} + +string OneMinusX::as_string(const vector& arg_names) const { + ostringstream s; + s << "1 - " << arg_names[0]; + return s.str(); +} + +string Sum::as_string(const vector& arg_names) const { + ostringstream s; + s << arg_names[0]; + for (unsigned i = 1; i < tail.size(); ++i) + s << " + " << arg_names[i]; + return s.str(); +} + +string Tanh::as_string(const vector& arg_names) const { + ostringstream s; + s << "tanh(" << arg_names[0] << ')'; + return s.str(); +} + +string Square::as_string(const vector& arg_names) const { + ostringstream s; + s << "square(" << arg_names[0] << ')'; + return s.str(); +} + +string Exp::as_string(const vector& arg_names) const { + ostringstream os; + os << "exp(" << arg_names[0] << ')'; + return os.str(); +} + +string Log::as_string(const vector& arg_names) const { + ostringstream os; + os << "log(" << arg_names[0] << ')'; + return os.str(); +} + +string Concatenate::as_string(const vector& arg_names) const { + ostringstream os; + os << "concat(" << arg_names[0]; + for (unsigned i = 1; i < arg_names.size(); ++i) { + os << ',' << arg_names[i]; + } + os << ')'; + return os.str(); +} + +string ConcatenateColumns::as_string(const vector& arg_names) const { + ostringstream os; + os << "concat_cols(" << arg_names[0]; + for (unsigned i = 1; i < arg_names.size(); ++i) { + os << ',' << arg_names[i]; + } + os << ')'; + return os.str(); +} + +string Hinge::as_string(const vector& arg_names) const { + ostringstream os; + os << "hinge(" << arg_names[0] << ",m=" << margin << ")"; + return os.str(); +} + +string Identity::as_string(const vector& arg_names) const { + return arg_names[0]; +} + +string MaxPooling1D::as_string(const vector& arg_names) const { + ostringstream os; + os << "maxpool1d(" << arg_names.front() << ",w=" << width << ")"; + return os.str(); +} + +string Softmax::as_string(const vector& arg_names) const { + ostringstream s; + s << "softmax(" << arg_names[0] << ')'; + return s.str(); +} + +string LogSoftmax::as_string(const vector& arg_names) const { + ostringstream s; + s << "log_softmax(" << arg_names[0] << ')'; + return s.str(); +} + +string RestrictedLogSoftmax::as_string(const vector& arg_names) const { + ostringstream s; + s << "r_log_softmax(" << arg_names[0] << ')'; + return s.str(); +} + +string PickElement::as_string(const vector& arg_names) const { + ostringstream s; + s << "pick(" << arg_names[0] << ',' << *pval << ')'; + return s.str(); +} + +// x_1 is a vector +// y = (x_1)[start:end] +string PickRange::as_string(const vector& arg_names) const { + ostringstream s; + s << "slice(" << arg_names[0] << ',' << start << ':' << end << ')'; + return s.str(); +} + +string MatrixMultiply::as_string(const vector& arg_names) const { + ostringstream s; + s << arg_names[0] << " * " << arg_names[1]; + return s.str(); +} + +string CwiseMultiply::as_string(const vector& arg_names) const { + ostringstream s; + s << arg_names[0] << " \\cdot " << arg_names[1]; + return s.str(); +} + +string Multilinear::as_string(const vector& arg_names) const { + ostringstream s; + s << arg_names[0]; + for (unsigned i = 1; i < arg_names.size(); i += 2) + s << " + " << arg_names[i] << " * " << arg_names[i+1]; + return s.str(); +} + +string Negate::as_string(const vector& arg_names) const { + ostringstream s; + s << '-' << arg_names[0]; + return s.str(); +} + +string Rectify::as_string(const vector& arg_names) const { + ostringstream s; + s << "ReLU(" << arg_names[0] << ')'; + return s.str(); +} + +string SquaredEuclideanDistance::as_string(const vector& arg_names) const { + ostringstream s; + s << "|| " << arg_names[0] << " - " << arg_names[1] << " ||^2"; + return s.str(); +} + +string LogisticSigmoid::as_string(const vector& arg_names) const { + ostringstream s; + s << "\\sigma(" << arg_names[0] << ')'; + return s.str(); +} + +string BinaryLogLoss::as_string(const vector& arg_names) const { + ostringstream os; + os << "binary_log_loss(" << arg_names[0] << ", " << *ptarget_y << ')'; + return os.str(); +} + +} // namespace cnn From d074f12e3d2ea2b6b0264f4f9dbb9948e72839bf Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 27 Apr 2015 01:30:25 -0400 Subject: [PATCH 014/965] fix link error --- cnn/backends/eigen/edges.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cnn/backends/eigen/edges.cc b/cnn/backends/eigen/edges.cc index 4f0c9dd1e..2e0a2c65b 100644 --- a/cnn/backends/eigen/edges.cc +++ b/cnn/backends/eigen/edges.cc @@ -8,6 +8,17 @@ using namespace std; namespace cnn { +Tensor InnerProduct3D_1D::forward(const vector& xs) const { + assert(!"not implemented"); +} + +Tensor InnerProduct3D_1D::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + assert(!"not implemented"); +} + Tensor GaussianNoise::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs[0]; From 2244f12662551cb8e7b5efaaec8ae20d3f922398 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 27 Apr 2015 02:33:30 -0400 Subject: [PATCH 015/965] simple enc/dec sample code --- cnn/dict.h | 13 +-- cnn/lstm-fast.h | 3 + cnn/rnn.h | 3 + examples/CMakeLists.txt | 4 +- examples/encdec.cc | 249 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 263 insertions(+), 9 deletions(-) create mode 100644 examples/encdec.cc diff --git a/cnn/dict.h b/cnn/dict.h index 6358c0f91..0550b6c9e 100644 --- a/cnn/dict.h +++ b/cnn/dict.h @@ -12,10 +12,10 @@ namespace cnn { class Dict { typedef std::unordered_map Map; public: - Dict() : b0_(""), frozen(false) { + Dict() : frozen(false) { } - inline unsigned size() const { return words_.size() + 1; } + inline unsigned size() const { return words_.size(); } void Freeze() { frozen = true; } @@ -27,23 +27,20 @@ class Dict { abort(); } words_.push_back(word); - d_[word] = words_.size(); - return words_.size(); + return d_[word] = words_.size() - 1; } else { return i->second; } } inline const std::string& Convert(const int& id) const { - if (id == 0) return b0_; - assert(id <= (int)words_.size()); - return words_[id-1]; + assert(id < (int)words_.size()); + return words_[id]; } void clear() { words_.clear(); d_.clear(); } private: - std::string b0_; bool frozen; std::vector words_; Map d_; diff --git a/cnn/lstm-fast.h b/cnn/lstm-fast.h index 4617eb71a..560b84151 100644 --- a/cnn/lstm-fast.h +++ b/cnn/lstm-fast.h @@ -45,6 +45,9 @@ struct LSTMBuilder_CIFG { // returns node index (variable) of most recent output VariableIndex back() const { return h.back().back(); } + // access memory/hidden state contents + const std::vector& final_h() const { return h.back(); } + // check to make sure parameters have been added before adding input unsigned builder_state; diff --git a/cnn/rnn.h b/cnn/rnn.h index 5394fa84b..6c31f0bb1 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -43,6 +43,9 @@ struct RNNBuilder { // returns node (index) of most recent output VariableIndex back() const { return h.back().back(); } + // access hidden state contents + const std::vector& final_h() const { return h.back(); } + // check to make sure parameters have been added before adding input unsigned builder_state; diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index addd3193d..b61bda7e2 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,8 @@ -PROJECT(cnn:examples) CMAKE_MINIMUM_REQUIRED(VERSION 2.8) +ADD_EXECUTABLE(encdec encdec.cc) +target_link_libraries(encdec cnn ${LIBS}) + ADD_EXECUTABLE(xor xor.cc) target_link_libraries(xor cnn ${LIBS}) diff --git a/examples/encdec.cc b/examples/encdec.cc new file mode 100644 index 000000000..6bba7f984 --- /dev/null +++ b/examples/encdec.cc @@ -0,0 +1,249 @@ +#include "cnn/edges.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/timing.h" +#include "cnn/rnn.h" +#include "cnn/lstm-fast.h" +#include "cnn/dict.h" + +#include +#include +#include + +using namespace std; +using namespace cnn; + +unsigned LAYERS = 2; +unsigned INPUT_DIM = 8; +unsigned HIDDEN_DIM = 24; +unsigned INPUT_VOCAB_SIZE = 0; +unsigned OUTPUT_VOCAB_SIZE = 0; + +cnn::Dict d; +int kSOS; +int kEOS; + +template +struct EncoderDecoder { + LookupParameters* p_c; + LookupParameters* p_ec; // map input to embedding (used in fwd and rev models) + Parameters* p_ie2h; + Parameters* p_bie; + Parameters* p_h2oe; + Parameters* p_boe; + Parameters* p_R; + Parameters* p_bias; + Builder dec_builder; + Builder rev_enc_builder; + Builder fwd_enc_builder; + explicit EncoderDecoder(Model& model) : + dec_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), + rev_enc_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), + fwd_enc_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + p_ie2h = model.add_parameters({long(HIDDEN_DIM * LAYERS * 1.5), long(HIDDEN_DIM * LAYERS * 2)}); + p_bie = model.add_parameters({long(HIDDEN_DIM * LAYERS * 1.5)}); + p_h2oe = model.add_parameters({long(HIDDEN_DIM * LAYERS), long(HIDDEN_DIM * LAYERS * 1.5)}); + p_boe = model.add_parameters({long(HIDDEN_DIM * LAYERS)}); + p_c = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {INPUT_DIM}); + p_ec = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({OUTPUT_VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({OUTPUT_VOCAB_SIZE}); + } + + // build graph and return VariableIndex of total loss + VariableIndex BuildGraph(const vector& insent, const vector& osent, Hypergraph& hg) { + // forward encoder + fwd_enc_builder.new_graph(); + fwd_enc_builder.add_parameter_edges(&hg); + fwd_enc_builder.start_new_sequence(&hg); + for (unsigned t = 0; t < insent.size(); ++t) { + VariableIndex i_x_t = hg.add_lookup(p_ec, insent[t]); + fwd_enc_builder.add_input(i_x_t, &hg); + } + // backward encoder + rev_enc_builder.new_graph(); + rev_enc_builder.add_parameter_edges(&hg); + rev_enc_builder.start_new_sequence(&hg); + for (int t = insent.size() - 1; t >= 0; --t) { + VariableIndex i_x_t = hg.add_lookup(p_ec, insent[t]); + rev_enc_builder.add_input(i_x_t, &hg); + } + + // encoder -> decoder transformation + vector to(LAYERS * 2); + int c = 0; + for (auto h_l : fwd_enc_builder.final_h()) to[c++] = h_l; + for (auto h_l : rev_enc_builder.final_h()) to[c++] = h_l; + assert(c == LAYERS * 2); + VariableIndex i_combined = hg.add_function(to); + VariableIndex i_ie2h = hg.add_parameter(p_ie2h); + VariableIndex i_bie = hg.add_parameter(p_bie); + VariableIndex i_t = hg.add_function({i_bie, i_ie2h, i_combined}); + hg.incremental_forward(); + VariableIndex i_h = hg.add_function({i_t}); + VariableIndex i_h2oe = hg.add_parameter(p_h2oe); + VariableIndex i_boe = hg.add_parameter(p_boe); + VariableIndex i_nc = hg.add_function({i_boe, i_h2oe, i_h}); + vector oein_c(LAYERS); + vector oein_h(LAYERS); + for (int i = 0; i < LAYERS; ++i) { + oein_c[i] = hg.add_function({i_nc}, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM); + oein_h[i] = hg.add_function({oein_c[i]}); + } + dec_builder.new_graph(); + dec_builder.add_parameter_edges(&hg); + dec_builder.start_new_sequence(&hg, oein_c, oein_h); + + // decoder + VariableIndex i_R = hg.add_parameter(p_R); + VariableIndex i_bias = hg.add_parameter(p_bias); + vector errs; + const unsigned oslen = osent.size() - 1; + for (unsigned t = 0; t < oslen; ++t) { + VariableIndex i_x_t = hg.add_lookup(p_c, osent[t]); + VariableIndex i_y_t = dec_builder.add_input(i_x_t, &hg); + VariableIndex i_r_t = hg.add_function({i_bias, i_R, i_y_t}); + VariableIndex i_ydist = hg.add_function({i_r_t}); + errs.push_back(hg.add_function({i_ydist}, osent[t+1])); + } + VariableIndex i_nerr = hg.add_function(errs); + return hg.add_function({i_nerr}); + } +}; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.Convert(""); + kEOS = d.Convert(""); + vector> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + training.push_back(ReadSentence(line, &d)); + ttoks += training.back().size(); + if (training.back().front() != kSOS && training.back().back() != kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + d.Freeze(); // no new word types allowed + INPUT_VOCAB_SIZE = d.size(); + OUTPUT_VOCAB_SIZE = d.size(); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + ++dlc; + dev.push_back(ReadSentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() != kSOS && dev.back().back() != kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + ostringstream os; + os << "bilm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + bool use_momentum = false; + Trainer* sgd = nullptr; + if (use_momentum) + sgd = new MomentumSGDTrainer(&model); + else + sgd = new SimpleSGDTrainer(&model); + + //RNNBuilder rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, &model); + EncoderDecoder lm(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 10; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + random_shuffle(order.begin(), order.end()); + } + + // build graph for this instance + Hypergraph hg; + auto& sent = training[order[si]]; + chars += sent.size() - 1; + ++si; + lm.BuildGraph(sent, sent, hg); + loss += as_scalar(hg.forward()); + hg.backward(); + sgd->update(); + ++lines; + } + sgd->status(); + cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + +#if 0 + lm.RandomSample(); +#endif + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + int dchars = 0; + for (auto& sent : dev) { + Hypergraph hg; + lm.BuildGraph(sent, sent, hg); + dloss += as_scalar(hg.forward()); + dchars += sent.size() - 1; + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } + } + delete sgd; +} + From 7c240d82f8616ee82a4dee11b55d90c96c88625b Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 29 Apr 2015 00:01:09 -0400 Subject: [PATCH 016/965] factor out dim --- cnn/CMakeLists.txt | 2 +- cnn/backends/eigen/dim.cc | 2 + cnn/backends/eigen/dim.h | 64 ++++++++++++++++++++++++++ cnn/backends/eigen/tensor-eigen.h | 75 +++++++------------------------ 4 files changed, 82 insertions(+), 61 deletions(-) create mode 100644 cnn/backends/eigen/dim.cc create mode 100644 cnn/backends/eigen/dim.h diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 8d2c54cf8..4e1a5988d 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -37,7 +37,7 @@ if(WITH_MINERVA_BACKEND) endif(WITH_MINERVA_BACKEND) if(WITH_EIGEN_BACKEND) - list(APPEND cnn_library_SRCS backends/eigen/eigen-backend.cc backends/eigen/edges.cc backends/eigen/model.cc) + list(APPEND cnn_library_SRCS backends/eigen/eigen-backend.cc backends/eigen/dim.cc backends/eigen/edges.cc backends/eigen/model.cc) endif(WITH_EIGEN_BACKEND) file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) diff --git a/cnn/backends/eigen/dim.cc b/cnn/backends/eigen/dim.cc new file mode 100644 index 000000000..c7384b82d --- /dev/null +++ b/cnn/backends/eigen/dim.cc @@ -0,0 +1,2 @@ +#include "cnn/backends/eigen/dim.h" + diff --git a/cnn/backends/eigen/dim.h b/cnn/backends/eigen/dim.h new file mode 100644 index 000000000..9c4072c9d --- /dev/null +++ b/cnn/backends/eigen/dim.h @@ -0,0 +1,64 @@ +#ifndef EIGEN_DIM_H +#define EIGEN_DIM_H + +#include +#include + +#include "cnn/backends/eigen/eigen-serialization.h" +#define CNN_MAX_TENSOR_DIM 8 + +namespace cnn { + +struct Dim { + Dim() { d[0] = 0; } + explicit Dim(int m) { d[0] = m; d[1] = 0; } + Dim(const Dim& o) { std::memcpy(d, o.d, sizeof(d)); } + Dim(int m, int n) { d[0] = m; d[1] = n; d[2] = 0; } + inline int size() const { int p = 1; const int* pd=d; while(*pd) { p *= *pd; ++pd; } return p; } + int ndims() const { int nd = 0; const int* pd = d; while(*pd) { nd++; pd++; } return nd; } + inline unsigned Prod() const { return size(); } + int rows() const { return d[0]; } + int cols() const { return d[1] ? d[1] : 1; } + Dim(std::initializer_list x) { + int c = 0; + for(auto v : x) d[c++] = v; + d[c] = 0; + } + int operator[](unsigned i) const { + return d[i]; + } + int size(unsigned i) const { + return d[i]; + } + Dim transpose() const { return Dim({d[1],d[0]}); } + int d[CNN_MAX_TENSOR_DIM]; + private: + friend class boost::serialization::access; + template void serialize(Archive& ar, const unsigned int) { + ar & d; + ar & d; + } +}; + +inline bool operator==(const Dim& a, const Dim& b) { + if (a.size() != b.size()) return false; + for (unsigned i = 0; i < CNN_MAX_TENSOR_DIM && !(a.d[i] == 0 && b.d[i] == 0); ++i) + if (a.d[i] != b.d[i]) return false; + return true; +} + +inline bool operator!=(const Dim& a, const Dim& b) { return !(a == b); } +inline std::ostream& operator<<(std::ostream& os, const Dim& d) { + os << '{'; + int c = 0; + for (auto v : d.d) { + if (!v) break; + if (c) os << ','; + os << v; + ++c; + } + return os << '}'; +} + +} // namespace cnn +#endif diff --git a/cnn/backends/eigen/tensor-eigen.h b/cnn/backends/eigen/tensor-eigen.h index e04b933f0..8d78fc25c 100644 --- a/cnn/backends/eigen/tensor-eigen.h +++ b/cnn/backends/eigen/tensor-eigen.h @@ -6,6 +6,7 @@ #include #include +#include "cnn/backends/eigen/dim.h" #include "cnn/backends/eigen/eigen-serialization.h" #include "cnn/backends/eigen/random.h" @@ -31,58 +32,6 @@ inline std::vector as_vector(const Tensor& v) { // dummy function with Eigen backend inline Tensor FromEigenMatrix(const Eigen::MatrixXf& src) { return src; } -struct Dim { - Dim() : rows(1), cols(1) {} - explicit Dim(int m) : rows(m), cols(1) {} - Dim(int m, int n) : rows(m), cols(n) {} - inline int size() const { return rows * cols; } - int ndims() const { return (cols == 1 ? 1 : 2); } - inline unsigned Prod() const { return rows * cols; } - Dim(std::initializer_list x) : cols(1) { - unsigned c = 0; - for (auto v : x) { - if (c == 0) rows = v; - if (c == 1) cols = v; - ++c; - } - if (c > 2) { - std::cerr << "Dim class doesn't support more than two dimensions\n"; - abort(); - } - } - int operator[](unsigned i) const { - if (i == 0) return rows; - if (i == 1) return cols; - abort(); - } - int size(unsigned i) const { - return (*this)[i]; - } - unsigned short rows; - unsigned short cols; - Dim transpose() const { return Dim(cols,rows); } - private: - friend class boost::serialization::access; - template void serialize(Archive& ar, const unsigned int) { - ar & rows; - ar & cols; - } -}; - -inline Dim operator*(const Dim& a, const Dim& b) { - assert(a.cols == b.rows); - return Dim(a.rows, b.cols); -} - -inline bool operator==(const Dim& a, const Dim& b) { return (a.rows == b.rows && a.cols == b.cols); } -inline bool operator!=(const Dim& a, const Dim& b) { return !(a == b); } - -inline std::ostream& operator<<(std::ostream& os, const Dim& d) { - return os << '(' << d.rows << ',' << d.cols << ')'; -} - -inline Dim size(const Tensor& m) { return Dim(m.rows(), m.cols()); } - inline Tensor FromRawData(const Dim& dim, const float* data) { Tensor t(dim.size(0), dim.ndims() > 1 ? dim.size(1) : 1); std::memcpy(t.data(), data, sizeof(float) * dim.size()); @@ -90,44 +39,50 @@ inline Tensor FromRawData(const Dim& dim, const float* data) { } inline Tensor Constant(const Dim& d, real c) { - Tensor m(d.rows, d.cols); + Tensor m(d.rows(), d.cols()); m.fill(c); return m; } -inline Tensor Zero(const Dim& d) { return Eigen::MatrixXf::Zero(d.rows, d.cols); } -inline Tensor Ones(const Dim& d) { return Eigen::MatrixXf::Ones(d.rows, d.cols); } +inline Tensor Zero(const Dim& d) { return Eigen::MatrixXf::Zero(d.rows(), d.cols()); } +inline Tensor Ones(const Dim& d) { return Eigen::MatrixXf::Ones(d.rows(), d.cols()); } inline Tensor Random(const Dim& d, real scale) { std::uniform_real_distribution distribution(-scale,scale); auto b = [&] (real) {return distribution(*rndeng);}; - return Eigen::MatrixXf::NullaryExpr(d.rows, d.cols, b); + return Eigen::MatrixXf::NullaryExpr(d.rows(), d.cols(), b); } inline Tensor Random(const Dim& d) { - return Random(d, sqrt(6) / sqrt(d.cols + d.rows)); + return Random(d, sqrt(6) / sqrt(d.cols() + d.rows())); } inline Tensor RandomBernoulli(const Dim& d, real p) { std::bernoulli_distribution distribution(p); auto b = [&] (real) {return distribution(*rndeng);}; - return Eigen::MatrixXf::NullaryExpr(d.rows, d.cols, b); + return Eigen::MatrixXf::NullaryExpr(d.rows(), d.cols(), b); } inline Tensor RandomNormal(const Dim& d, real mean, real stddev) { std::normal_distribution distribution(mean, stddev); auto b = [&] (real) {return distribution(*rndeng);}; - return Eigen::MatrixXf::NullaryExpr(d.rows, d.cols, b); + return Eigen::MatrixXf::NullaryExpr(d.rows(), d.cols(), b); } inline real rand01() { std::uniform_real_distribution distribution(0, 1); return distribution(*rndeng); } +inline Dim size(const Tensor& m) { + if (m.cols() == 1) return Dim({m.rows()}); + return Dim(m.rows(), m.cols()); +} + // column major constructor inline Tensor Ccm(const Dim&d, const std::initializer_list& v) { + std::cerr << "d: " << d << std::endl; Tensor m = Zero(d); int cc = 0; int cr = 0; for (const auto& x : v) { m(cr, cc) = x; ++cr; - if (cr == d.rows) { cr = 0; ++cc; } + if (cr == d.rows()) { cr = 0; ++cc; } } return m; } From 5f7bd01a4dc31e6948d9548ef7552fe78be47598 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 29 Apr 2015 23:35:30 -0400 Subject: [PATCH 017/965] implementation of hermann and blunsom --- cnn/backends/eigen/edges.cc | 47 ++++++- cnn/backends/eigen/tensor-eigen.h | 8 +- cnn/dict.cc | 2 +- cnn/edges-common.cc | 12 ++ cnn/edges.h | 25 ++++ examples/embed_cl.cc | 218 ++++++++++++++++++++++++++++++ 6 files changed, 304 insertions(+), 8 deletions(-) create mode 100644 examples/embed_cl.cc diff --git a/cnn/backends/eigen/edges.cc b/cnn/backends/eigen/edges.cc index 2e0a2c65b..5d0dba987 100644 --- a/cnn/backends/eigen/edges.cc +++ b/cnn/backends/eigen/edges.cc @@ -8,6 +8,51 @@ using namespace std; namespace cnn { +Tensor SumColumns::forward(const vector& xs) const { + assert(xs.size() == 1); + const Tensor& x = *xs.front(); + return x.rowwise().sum(); +} + +Tensor SumColumns::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + Tensor dEdx = *xs.front(); + const int c = dEdf.cols(); + for (int j = 0; j < c; ++j) + dEdx.col(j) = dEdf; + return dEdx; +} + +Tensor KMHNGram::forward(const vector& xs) const { + assert(xs.size() == 1); + const Tensor& x = *xs.front(); + const int new_cols = x.cols() - n + 1; + assert(new_cols > 0); + const int new_rows = x.rows(); + Tensor res = Zero(Dim({new_rows, new_cols})); + for (int j = 0; j < new_cols; ++j) { + auto c_j = res.col(j); + for (int k = 0; k < n; ++k) + c_j += x.col(j + k); + } + return res; +} + +Tensor KMHNGram::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + Tensor dEdx = *xs.front(); + dEdx.setZero(); + const int c = dEdf.cols(); + for (int j = 0; j < c; ++j) + for (int k = 0; k < n; ++k) + dEdx.col(j+k) += dEdf.col(j); + return dEdx; +} + Tensor InnerProduct3D_1D::forward(const vector& xs) const { assert(!"not implemented"); } @@ -51,7 +96,7 @@ Tensor Dropout::backward(const vector& xs, Tensor OneMinusX::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs[0]; - return Ones(cnn::size(x)) - x; + return Constant(cnn::size(x), o) - x; } Tensor OneMinusX::backward(const vector& xs, diff --git a/cnn/backends/eigen/tensor-eigen.h b/cnn/backends/eigen/tensor-eigen.h index 8d78fc25c..8a822939c 100644 --- a/cnn/backends/eigen/tensor-eigen.h +++ b/cnn/backends/eigen/tensor-eigen.h @@ -1,4 +1,4 @@ -#ifndef CNN_TENSOR_EIGEN_H_ +../cnn/backends/eigen/edges.cc#ifndef CNN_TENSOR_EIGEN_H_ #define CNN_TENSOR_EIGEN_H_ #include @@ -38,13 +38,9 @@ inline Tensor FromRawData(const Dim& dim, const float* data) { return t; } -inline Tensor Constant(const Dim& d, real c) { - Tensor m(d.rows(), d.cols()); - m.fill(c); - return m; -} inline Tensor Zero(const Dim& d) { return Eigen::MatrixXf::Zero(d.rows(), d.cols()); } inline Tensor Ones(const Dim& d) { return Eigen::MatrixXf::Ones(d.rows(), d.cols()); } +inline Tensor Constant(const Dim& d, real c) { return Eigen::MatrixXf::Constant(d.rows(), d.cols(), c); } inline Tensor Random(const Dim& d, real scale) { std::uniform_real_distribution distribution(-scale,scale); auto b = [&] (real) {return distribution(*rndeng);}; diff --git a/cnn/dict.cc b/cnn/dict.cc index 4e1810eb5..b6ceec468 100644 --- a/cnn/dict.cc +++ b/cnn/dict.cc @@ -29,7 +29,7 @@ void ReadSentencePair(const std::string& line, std::vector* s, Dict* sd, st std::vector* v = s; while(in) { in >> word; - if (word.empty()) break; + if (!in) break; if (word == sep) { d = td; v = t; continue; } v->push_back(d->Convert(word)); } diff --git a/cnn/edges-common.cc b/cnn/edges-common.cc index 6f4ce3a6d..69c1a9e4e 100644 --- a/cnn/edges-common.cc +++ b/cnn/edges-common.cc @@ -8,6 +8,18 @@ using namespace std; namespace cnn { +string SumColumns::as_string(const vector& arg_names) const { + ostringstream s; + s << "sum_cols(" << arg_names[0] << ')'; + return s.str(); +} + +string KMHNGram::as_string(const vector& arg_names) const { + ostringstream s; + s << "kmh-ngram(" << arg_names[0] << ')'; + return s.str(); +} + string InnerProduct3D_1D::as_string(const vector& arg_names) const { ostringstream s; s << "inner(" << arg_names[0] << "," << arg_names[1] << ") + " << arg_names[2]; diff --git a/cnn/edges.h b/cnn/edges.h index 9e63b8b66..cfaeecfb0 100644 --- a/cnn/edges.h +++ b/cnn/edges.h @@ -5,6 +5,28 @@ namespace cnn { +// y_i = \sum_{j} x_i,j +struct SumColumns : public Edge { + std::string as_string(const std::vector& arg_names) const override; + Tensor forward(const std::vector& xs) const override; + Tensor backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const override; +}; + +// y_i = \sum_{j=1}^n x_1:{i-1+j} +struct KMHNGram : public Edge { + explicit KMHNGram(unsigned n) : n(n) {} + std::string as_string(const std::vector& arg_names) const override; + Tensor forward(const std::vector& xs) const override; + Tensor backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const override; + unsigned n; // width, n=2 for Karl's paper +}; + // Forward: // Y_ij = A_ijk * B_k + C_ij // @@ -49,12 +71,15 @@ struct Dropout : public Edge { // y = 1 - x_1 struct OneMinusX : public Edge { + OneMinusX() : o(1) {} + explicit OneMinusX(real o) : o(o) {} std::string as_string(const std::vector& arg_names) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i) const override; + real o; }; // y = tanh x_1 diff --git a/examples/embed_cl.cc b/examples/embed_cl.cc new file mode 100644 index 000000000..c28fb74dd --- /dev/null +++ b/examples/embed_cl.cc @@ -0,0 +1,218 @@ +#include "cnn/edges.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/timing.h" +#include "cnn/rnn.h" +#include "cnn/lstm-fast.h" +#include "cnn/dict.h" + +#include +#include +#include + +using namespace std; +using namespace cnn; + +unsigned REP_DIM = 128; +unsigned INPUT_VOCAB_SIZE = 0; +unsigned OUTPUT_VOCAB_SIZE = 0; + +cnn::Dict sd; +cnn::Dict td; +int kSRC_SOS; +int kSRC_EOS; +int kTRG_SOS; +int kTRG_EOS; + +struct Encoder { + LookupParameters* p_s; + LookupParameters* p_t; + explicit Encoder(Model& model) { + p_s = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {REP_DIM}); + p_t = model.add_lookup_parameters(OUTPUT_VOCAB_SIZE, {REP_DIM}); + } + + VariableIndex EmbedSource(const vector& sent, Hypergraph& hg) { + vector m(sent.size() + 2); + m[0] = hg.add_lookup(p_s, kSRC_SOS); + int i = 1; + for (auto& w : sent) + m[i++] = hg.add_lookup(p_s, w); + m[i] = hg.add_lookup(p_s, kSRC_EOS); + VariableIndex i_m = hg.add_function(m); + i_m = hg.add_function({i_m}, 2); + return hg.add_function({i_m}); + } + + VariableIndex EmbedTarget(const vector& sent, Hypergraph& hg) { + vector m(sent.size() + 2); + m[0] = hg.add_lookup(p_s, kTRG_SOS); + int i = 1; + for (auto& w : sent) + m[i++] = hg.add_lookup(p_t, w); + m[i] = hg.add_lookup(p_s, kTRG_EOS); + VariableIndex i_m = hg.add_function(m); + i_m = hg.add_function({i_m}, 2); + return hg.add_function({i_m}); + } +}; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + vector, vector>> training, dev; + string line; + kSRC_SOS = sd.Convert(""); + kSRC_EOS = sd.Convert(""); + kTRG_SOS = td.Convert(""); + kTRG_EOS = td.Convert(""); + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + vector src, trg; + ReadSentencePair(line, &src, &sd, &trg, &td); + training.push_back(make_pair(src, trg)); + } + cerr << tlc << " lines, " << sd.size() << " source types, " << td.size() << " target types\n"; + } + sd.Freeze(); // no new word types allowed + td.Freeze(); // no new word types allowed + INPUT_VOCAB_SIZE = sd.size(); + OUTPUT_VOCAB_SIZE = td.size(); +#if 0 + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + ++dlc; + dev.push_back(ReadSentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() != kSOS && dev.back().back() != kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + ostringstream os; + os << "bilm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; +#endif + Model model; + bool use_momentum = false; + Trainer* sgd = nullptr; + if (use_momentum) + sgd = new MomentumSGDTrainer(&model); + else + sgd = new SimpleSGDTrainer(&model); + + Encoder emb(model); +#if 0 + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } +#endif + + unsigned report_every_i = 100; + unsigned dev_every_i_reports = 10; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + random_shuffle(order.begin(), order.end()); + } + + // build graph for this instance + Hypergraph hg; + auto& sent_pair = training[order[si]]; + ++si; + auto& src = sent_pair.first; + auto& trg = sent_pair.second; + VariableIndex i_s = emb.EmbedSource(src, hg); + VariableIndex i_t = emb.EmbedTarget(trg, hg); + VariableIndex i_sim = hg.add_function({i_s,i_t}); + float margin = 2; + VariableIndex i_ms = hg.add_function({i_sim}, margin); + const unsigned K = 20; + vector noise(K); + for (unsigned j = 0; j < K; ++j) { + unsigned s = rand01() * training.size(); + while (s == order[si] || s == training.size()) { s = rand01() * training.size(); } + VariableIndex i_n_j = emb.EmbedTarget(training[s].second, hg); + VariableIndex i_sim_n = hg.add_function({i_s,i_n_j}); + noise[j] = hg.add_function({i_ms, i_sim_n}); + } + VariableIndex i_v = hg.add_function({hg.add_function(noise)}); + hg.add_function({i_v}); + auto iloss = as_scalar(hg.forward()); + assert(iloss >= 0); + if (iloss > 0) { + loss += iloss; + hg.backward(); + sgd->update(); + } + ++lines; + } + sgd->status(); + cerr << " E = " << (loss) << " ppl=" << exp(loss / chars) << ' '; + +#if 0 + lm.RandomSample(); +#endif +#if 0 + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + int dchars = 0; + for (auto& sent : dev) { + Hypergraph hg; + lm.BuildGraph(sent, sent, hg); + dloss += as_scalar(hg.forward()); + dchars += sent.size() - 1; + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } +#endif + } + delete sgd; +} + From 5777b00fed2871711eef06681ab969af83c24ed0 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 30 Apr 2015 22:13:13 -0400 Subject: [PATCH 018/965] cleanup, reshape function --- cnn/backends/eigen/dim.cc | 18 +++++++++++++ cnn/backends/eigen/dim.h | 42 +++++++++++-------------------- cnn/backends/eigen/edges.cc | 19 ++++++++++++++ cnn/backends/eigen/tensor-eigen.h | 2 +- cnn/edges-common.cc | 6 +++++ cnn/edges.h | 15 +++++++++++ cnn/param-edges.cc | 8 +++--- 7 files changed, 78 insertions(+), 32 deletions(-) diff --git a/cnn/backends/eigen/dim.cc b/cnn/backends/eigen/dim.cc index c7384b82d..5f5a1c1a9 100644 --- a/cnn/backends/eigen/dim.cc +++ b/cnn/backends/eigen/dim.cc @@ -1,2 +1,20 @@ #include "cnn/backends/eigen/dim.h" +#include + +namespace cnn { + +std::ostream& operator<<(std::ostream& os, const Dim& d) { + os << '{'; + int c = 0; + for (auto v : d.d) { + if (!v) break; + if (c) os << ','; + os << v; + ++c; + } + return os << '}'; +} + +} // namespace cnn + diff --git a/cnn/backends/eigen/dim.h b/cnn/backends/eigen/dim.h index 9c4072c9d..da2954386 100644 --- a/cnn/backends/eigen/dim.h +++ b/cnn/backends/eigen/dim.h @@ -2,9 +2,10 @@ #define EIGEN_DIM_H #include -#include +#include -#include "cnn/backends/eigen/eigen-serialization.h" +#include +#include #define CNN_MAX_TENSOR_DIM 8 namespace cnn { @@ -12,26 +13,21 @@ namespace cnn { struct Dim { Dim() { d[0] = 0; } explicit Dim(int m) { d[0] = m; d[1] = 0; } - Dim(const Dim& o) { std::memcpy(d, o.d, sizeof(d)); } Dim(int m, int n) { d[0] = m; d[1] = n; d[2] = 0; } - inline int size() const { int p = 1; const int* pd=d; while(*pd) { p *= *pd; ++pd; } return p; } - int ndims() const { int nd = 0; const int* pd = d; while(*pd) { nd++; pd++; } return nd; } - inline unsigned Prod() const { return size(); } - int rows() const { return d[0]; } - int cols() const { return d[1] ? d[1] : 1; } Dim(std::initializer_list x) { int c = 0; for(auto v : x) d[c++] = v; d[c] = 0; } - int operator[](unsigned i) const { - return d[i]; - } - int size(unsigned i) const { - return d[i]; - } - Dim transpose() const { return Dim({d[1],d[0]}); } - int d[CNN_MAX_TENSOR_DIM]; + inline int size() const { int p = 1; const unsigned short* pd=d; while(*pd) { p *= *pd; ++pd; } return p; } + inline int ndims() const { int nd = 0; const unsigned short* pd = d; while(*pd) { nd++; pd++; } return nd; } + inline unsigned Prod() const { return size(); } + inline int rows() const { return d[0]; } + inline int cols() const { return d[1] ? d[1] : 1; } + inline int operator[](unsigned i) const { return d[i]; } + inline int size(unsigned i) const { return d[i]; } + inline Dim transpose() const { return Dim({d[1],d[0]}); } + unsigned short d[CNN_MAX_TENSOR_DIM]; private: friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { @@ -48,17 +44,9 @@ inline bool operator==(const Dim& a, const Dim& b) { } inline bool operator!=(const Dim& a, const Dim& b) { return !(a == b); } -inline std::ostream& operator<<(std::ostream& os, const Dim& d) { - os << '{'; - int c = 0; - for (auto v : d.d) { - if (!v) break; - if (c) os << ','; - os << v; - ++c; - } - return os << '}'; -} + +std::ostream& operator<<(std::ostream& os, const Dim& d); } // namespace cnn + #endif diff --git a/cnn/backends/eigen/edges.cc b/cnn/backends/eigen/edges.cc index 5d0dba987..54633418a 100644 --- a/cnn/backends/eigen/edges.cc +++ b/cnn/backends/eigen/edges.cc @@ -8,6 +8,25 @@ using namespace std; namespace cnn { +Tensor Reshape::forward(const vector& xs) const { + assert(xs.size() == 1); + Tensor fx = *xs.front(); + assert(fx.rows() * fx.cols() == from.size()); + fx.resize(to.size(0), to.size(1)); + return fx; +} + +Tensor Reshape::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + Tensor dEdx = dEdf; + int cols = from.size(1); + if (!cols) ++cols; + dEdx.resize(from.size(0), cols); + return dEdx; +} + Tensor SumColumns::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs.front(); diff --git a/cnn/backends/eigen/tensor-eigen.h b/cnn/backends/eigen/tensor-eigen.h index 8a822939c..aacf19cae 100644 --- a/cnn/backends/eigen/tensor-eigen.h +++ b/cnn/backends/eigen/tensor-eigen.h @@ -1,4 +1,4 @@ -../cnn/backends/eigen/edges.cc#ifndef CNN_TENSOR_EIGEN_H_ +#ifndef CNN_TENSOR_EIGEN_H_ #define CNN_TENSOR_EIGEN_H_ #include diff --git a/cnn/edges-common.cc b/cnn/edges-common.cc index 69c1a9e4e..dc17e0afe 100644 --- a/cnn/edges-common.cc +++ b/cnn/edges-common.cc @@ -8,6 +8,12 @@ using namespace std; namespace cnn { +string Reshape::as_string(const vector& arg_names) const { + ostringstream s; + s << "reshape(" << arg_names[0] << ',' << from << " --> " << to << ')'; + return s.str(); +} + string SumColumns::as_string(const vector& arg_names) const { ostringstream s; s << "sum_cols(" << arg_names[0] << ')'; diff --git a/cnn/edges.h b/cnn/edges.h index cfaeecfb0..6acdc02e6 100644 --- a/cnn/edges.h +++ b/cnn/edges.h @@ -5,6 +5,21 @@ namespace cnn { +// y = reshape(x_1, from --> to) +struct Reshape : public Edge { + explicit Reshape(const Dim& from, const Dim& to) : from(from), to(to) { + assert(from.size() == to.size()); + } + std::string as_string(const std::vector& arg_names) const override; + Tensor forward(const std::vector& xs) const override; + Tensor backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const override; + Dim from; + Dim to; +}; + // y_i = \sum_{j} x_i,j struct SumColumns : public Edge { std::string as_string(const std::vector& arg_names) const override; diff --git a/cnn/param-edges.cc b/cnn/param-edges.cc index 643fa7f7c..c18e62a51 100644 --- a/cnn/param-edges.cc +++ b/cnn/param-edges.cc @@ -11,7 +11,7 @@ bool ParameterEdge::has_parameters() const { return true; } string ParameterEdge::as_string(const vector& arg_names) const { ostringstream s; - s << "params(" << dim << ')'; + s << "parameters(" << dim << ')'; return s.str(); } @@ -34,7 +34,7 @@ void ParameterEdge::accumulate_grad(const Tensor& g) { string InputEdge::as_string(const vector& arg_names) const { ostringstream s; - s << "inputs(" << dim << ')'; + s << "constant(" << dim << ')'; return s.str(); } @@ -54,7 +54,7 @@ Tensor InputEdge::backward(const vector& xs, string ScalarInputEdge::as_string(const vector& arg_names) const { ostringstream s; - s << "scalar_inputs(" << data << ')'; + s << "scalar_constant(" << *pdata << ')'; return s.str(); } @@ -73,7 +73,7 @@ Tensor ScalarInputEdge::backward(const vector& xs, string LookupEdge::as_string(const vector& arg_names) const { ostringstream s; - s << "lookup[|x|=" << params->values.size() << " --> " << dim << ']'; + s << "lookup_parameters(|x|=" << params->values.size() << " --> " << dim << ')'; return s.str(); } From 1b88009f02f485513bc35ed0108799379d1bb0c4 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 1 May 2015 00:22:10 -0400 Subject: [PATCH 019/965] mostly comments, also stub for optimized softmax --- cnn/backends/eigen/edges.cc | 23 ++++++++++++++++++++++- cnn/backends/eigen/eigen-backend.cc | 15 +++++++++++++++ cnn/cnn.cc | 3 +++ cnn/edges-common.cc | 8 +++++++- cnn/edges.h | 26 ++++++++++++++++++++++---- cnn/model.h | 2 +- 6 files changed, 70 insertions(+), 7 deletions(-) diff --git a/cnn/backends/eigen/edges.cc b/cnn/backends/eigen/edges.cc index 54633418a..35c757d4d 100644 --- a/cnn/backends/eigen/edges.cc +++ b/cnn/backends/eigen/edges.cc @@ -115,7 +115,7 @@ Tensor Dropout::backward(const vector& xs, Tensor OneMinusX::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs[0]; - return Constant(cnn::size(x), o) - x; + return Constant(cnn::size(x), c) - x; } Tensor OneMinusX::backward(const vector& xs, @@ -352,6 +352,27 @@ Tensor Softmax::backward(const vector& xs, return Convolution::SoftmaxBackward(dEdf, fx, 1); } +Tensor PickNegLogSoftmax::forward(const vector& xs) const { + assert(xs.size() == 1); + const Tensor& x = *xs.front(); + assert(x.cols() == 1); // need to generalize for multiple vectors + v = Convolution::SoftmaxForward(x, 1); + float cll = -log(v(*pval, 0)); + return Constant({1}, cll); +} + +Tensor PickNegLogSoftmax::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const { + assert(i == 0); + float r = dEdf(*pval, 0) / v(*pval, 0); + // TODO finish implementing + cerr << "not implemented\n"; + abort(); + //return Convolution::SoftmaxBackward(dEdf.cwiseQuotient(v), v, 1); +} + Tensor LogSoftmax::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs.front(); diff --git a/cnn/backends/eigen/eigen-backend.cc b/cnn/backends/eigen/eigen-backend.cc index b9ae4a803..f771535db 100644 --- a/cnn/backends/eigen/eigen-backend.cc +++ b/cnn/backends/eigen/eigen-backend.cc @@ -121,5 +121,20 @@ Eigen::MatrixXf Convolution::SoftmaxBackward(const Eigen::MatrixXf& diff, const } } +#if 0 +Eigen::MatrixXf Convolution::SoftmaxBackwardSingleError( + const real& r, int elem, const Eigen::MatrixXf& top, SoftmaxAlgorithm algorithm) { + // d softmax(x)_i / d x_j = softmax(x)_i * (1 - softmax(x)_i) if i == j + // d softmax(x)_i / d x_j = -softmax(x)_i * softmax(x)_j if i != j + if (top.cols() == 1) { + float off_diag_sum = -top.sum() + top(elem, 0) * (r - 1); + return top.binaryExpr(diff, FSoftmaxBackward(off_diag_sum)); + } else { + cerr << "SoftmaxBackward not implemented for multiple columns\n"; + abort(); + } +} +#endif + } // namespace cnn diff --git a/cnn/cnn.cc b/cnn/cnn.cc index d30529dd9..3ceca2a00 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -151,6 +151,9 @@ void Hypergraph::backward() { } // accumulate gradients into parameters + // this is simpler than you might find in some other frameworks + // since we assume parameters come into the graph as a "function" + // that returns the current value of the parameters for (auto pedge : parameter_edges) pedge->accumulate_grad(nodes[pedge->head_node]->dEdf); } diff --git a/cnn/edges-common.cc b/cnn/edges-common.cc index dc17e0afe..be5db4312 100644 --- a/cnn/edges-common.cc +++ b/cnn/edges-common.cc @@ -46,7 +46,7 @@ string Dropout::as_string(const vector& arg_names) const { string OneMinusX::as_string(const vector& arg_names) const { ostringstream s; - s << "1 - " << arg_names[0]; + s << c << " - " << arg_names[0]; return s.str(); } @@ -124,6 +124,12 @@ string Softmax::as_string(const vector& arg_names) const { return s.str(); } +string PickNegLogSoftmax::as_string(const vector& arg_names) const { + ostringstream s; + s << "log_softmax(" << arg_names[0] << ")_{" << *pval << '}'; + return s.str(); +} + string LogSoftmax::as_string(const vector& arg_names) const { ostringstream s; s << "log_softmax(" << arg_names[0] << ')'; diff --git a/cnn/edges.h b/cnn/edges.h index 6acdc02e6..0a236981d 100644 --- a/cnn/edges.h +++ b/cnn/edges.h @@ -84,17 +84,18 @@ struct Dropout : public Edge { real p; }; -// y = 1 - x_1 +// y = c - x_1 +// (c is a vector or matrix of the constant, usually 1, but can be configured) struct OneMinusX : public Edge { - OneMinusX() : o(1) {} - explicit OneMinusX(real o) : o(o) {} + OneMinusX() : c(1) {} + explicit OneMinusX(real o) : c(o) {} std::string as_string(const std::vector& arg_names) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i) const override; - real o; + real c; }; // y = tanh x_1 @@ -326,6 +327,23 @@ struct LogSoftmax : public Edge { unsigned i) const override; }; +// z = \sum_j \exp (x_i)_j +// y = (x_1)_element - \log z +struct PickNegLogSoftmax : public Edge { + explicit PickNegLogSoftmax(unsigned v) : val(v), pval(&val) {} + // use this constructor if you want to change the value after the graph is constructed + explicit PickNegLogSoftmax(const unsigned* pv) : val(), pval(pv) {} + std::string as_string(const std::vector& arg_names) const override; + Tensor forward(const std::vector& xs) const override; + Tensor backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i) const override; + unsigned val; + const unsigned* pval; + mutable Tensor v; +}; + // z = \sum_{j \in denom} \exp (x_i)_j // y_i = (x_1)_i - \log z struct RestrictedLogSoftmax : public Edge { diff --git a/cnn/model.h b/cnn/model.h index 11a5c6524..cd3e061b7 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -25,7 +25,7 @@ struct ParametersBase { virtual ~ParametersBase(); }; -// represents parameters (e.g., a weight matrix) +// represents parameters (e.g., a weight matrix) that will be optimized struct Parameters : public ParametersBase { friend class Model; void rescale_gradient(real scale) override; From fc4937936e21a27678aa2fccecdd0a23dbf91249 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 1 May 2015 15:22:28 -0400 Subject: [PATCH 020/965] small fixes --- CMakeLists.txt | 1 + examples/CMakeLists.txt | 3 +++ 2 files changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 792d6736e..b2dc49142 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ function(find_cudnn) endfunction() # look for Boost +set(Boost_REALPATH ON) find_package(Boost COMPONENTS program_options serialization unit_test_framework REQUIRED) include_directories(${Boost_INCLUDE_DIR}) set(LIBS ${LIBS} ${Boost_LIBRARIES}) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index b61bda7e2..4b9f2d96a 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,5 +1,8 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) +ADD_EXECUTABLE(embed_cl embed_cl.cc) +target_link_libraries(embed_cl cnn ${LIBS}) + ADD_EXECUTABLE(encdec encdec.cc) target_link_libraries(encdec cnn ${LIBS}) From 5c0fe4f4feac1e62bf268177d01f1e75b4c26021 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 1 May 2015 18:40:04 -0400 Subject: [PATCH 021/965] optimized log softmax --- cnn/backends/eigen/edges.cc | 6 +----- cnn/backends/eigen/eigen-backend.cc | 13 ++++++------- cnn/backends/eigen/eigen-backend.h | 1 + examples/rnnlm.cc | 11 ++++++++++- 4 files changed, 18 insertions(+), 13 deletions(-) diff --git a/cnn/backends/eigen/edges.cc b/cnn/backends/eigen/edges.cc index 35c757d4d..2c8bffd7b 100644 --- a/cnn/backends/eigen/edges.cc +++ b/cnn/backends/eigen/edges.cc @@ -366,11 +366,7 @@ Tensor PickNegLogSoftmax::backward(const vector& xs, const Tensor& dEdf, unsigned i) const { assert(i == 0); - float r = dEdf(*pval, 0) / v(*pval, 0); - // TODO finish implementing - cerr << "not implemented\n"; - abort(); - //return Convolution::SoftmaxBackward(dEdf.cwiseQuotient(v), v, 1); + return Convolution::SoftmaxBackwardSingleError(as_scalar(dEdf), *pval, v); } Tensor LogSoftmax::forward(const vector& xs) const { diff --git a/cnn/backends/eigen/eigen-backend.cc b/cnn/backends/eigen/eigen-backend.cc index f771535db..cb64af33c 100644 --- a/cnn/backends/eigen/eigen-backend.cc +++ b/cnn/backends/eigen/eigen-backend.cc @@ -121,20 +121,19 @@ Eigen::MatrixXf Convolution::SoftmaxBackward(const Eigen::MatrixXf& diff, const } } -#if 0 -Eigen::MatrixXf Convolution::SoftmaxBackwardSingleError( - const real& r, int elem, const Eigen::MatrixXf& top, SoftmaxAlgorithm algorithm) { +Eigen::MatrixXf Convolution::SoftmaxBackwardSingleError(float diff, int elem, const Eigen::MatrixXf& top) { // d softmax(x)_i / d x_j = softmax(x)_i * (1 - softmax(x)_i) if i == j // d softmax(x)_i / d x_j = -softmax(x)_i * softmax(x)_j if i != j if (top.cols() == 1) { - float off_diag_sum = -top.sum() + top(elem, 0) * (r - 1); - return top.binaryExpr(diff, FSoftmaxBackward(off_diag_sum)); + const float r = diff / top(elem, 0); + Eigen::MatrixXf b = top * diff; + b(elem, 0) = (diff - r) * top(elem, 0); + return b; } else { - cerr << "SoftmaxBackward not implemented for multiple columns\n"; + cerr << "SoftmaxBackwardSingleError not implemented for multiple columns\n"; abort(); } } -#endif } // namespace cnn diff --git a/cnn/backends/eigen/eigen-backend.h b/cnn/backends/eigen/eigen-backend.h index 7633a1ef1..c0bb225d0 100644 --- a/cnn/backends/eigen/eigen-backend.h +++ b/cnn/backends/eigen/eigen-backend.h @@ -34,6 +34,7 @@ class Convolution { public: static Eigen::MatrixXf SoftmaxForward(const Eigen::MatrixXf& src, SoftmaxAlgorithm algorithm); static Eigen::MatrixXf SoftmaxBackward(const Eigen::MatrixXf& diff, const Eigen::MatrixXf& top, SoftmaxAlgorithm algorithm); + static Eigen::MatrixXf SoftmaxBackwardSingleError(float diff, int elem, const Eigen::MatrixXf& top); }; } // namespace cnn diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 3a6bfb7e6..9bd64f800 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -51,11 +51,20 @@ struct RNNLanguageModel { // r_t = bias + R * y_t VariableIndex i_r_t = hg.add_function({i_bias, i_R, i_y_t}); // ydist = softmax(r_t) + // LogSoftmax followed by PickElement can be written in one step + // using PickNegLogSoftmax +#if 0 VariableIndex i_ydist = hg.add_function({i_r_t}); errs.push_back(hg.add_function({i_ydist}, sent[t+1])); +#endif + VariableIndex i_err = hg.add_function({i_r_t}, sent[t+1]); + errs.push_back(i_err); } VariableIndex i_nerr = hg.add_function(errs); +#if 0 return hg.add_function({i_nerr}); +#endif + return i_nerr; } // return VariableIndex of total loss @@ -83,7 +92,7 @@ struct RNNLanguageModel { unsigned w = 0; while (w == 0 || (int)w == kSOS) { auto dist = as_vector(hg.incremental_forward()); - double p = (double)rand() / (RAND_MAX + 1.0); + double p = rand01(); for (; w < dist.size(); ++w) { p -= dist[w]; if (p < 0.0) { break; } From 438dabf7f28e08d2b0bd5638f6f25372a2b18200 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 2 May 2015 17:30:53 -0400 Subject: [PATCH 022/965] simplify calling of RNN code --- cnn/CMakeLists.txt | 10 +++-- cnn/c2w.h | 61 +++++++++++++++++++++++++++ cnn/{lstm-fast.cc => lstm.cc} | 45 +++++--------------- cnn/{lstm-fast.h => lstm.h} | 32 +++++++------- cnn/rnn-state-machine.cc | 15 +++++++ cnn/rnn-state-machine.h | 42 ++++++++++++++++++ cnn/rnn.cc | 32 ++------------ cnn/rnn.h | 16 +++---- cnn/{saxe_init.cc => saxe-init.cc} | 2 +- cnn/{saxe_init.h => saxe-init.h} | 0 cnn/tests/test_edges.cc | 1 + cnn/tests/test_init.cc | 2 +- examples/CMakeLists.txt | 4 +- examples/{embed_cl.cc => embed-cl.cc} | 2 - examples/encdec.cc | 13 +++--- examples/rnnlm.cc | 10 ++--- 16 files changed, 174 insertions(+), 113 deletions(-) create mode 100644 cnn/c2w.h rename cnn/{lstm-fast.cc => lstm.cc} (82%) rename cnn/{lstm-fast.h => lstm.h} (73%) create mode 100644 cnn/rnn-state-machine.cc create mode 100644 cnn/rnn-state-machine.h rename cnn/{saxe_init.cc => saxe-init.cc} (96%) rename cnn/{saxe_init.h => saxe-init.h} (100%) rename examples/{embed_cl.cc => embed-cl.cc} (99%) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 4e1a5988d..9b61132ea 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -7,10 +7,11 @@ set(cnn_library_SRCS cnn.cc dict.cc edges-common.cc - lstm-fast.cc + lstm.cc param-edges.cc rnn.cc - saxe_init.cc + rnn-state-machine.cc + saxe-init.cc training.cc ) @@ -18,11 +19,12 @@ set(cnn_library_SRCS set(cnn_library_HDRS cnn.h edges.h - lstm-fast.h + lstm.h model.h param-edges.h rnn.h - saxe_init.h + rnn-state-machine.h + saxe-init.h tensor.h timing.h training.h diff --git a/cnn/c2w.h b/cnn/c2w.h new file mode 100644 index 000000000..8c6c720e3 --- /dev/null +++ b/cnn/c2w.h @@ -0,0 +1,61 @@ +#ifndef CNN_C2W_H_ +#define CNN_C2W_H_ + +#include +#include + +#include "cnn/cnn.h" +#include "cnn/model.h" +#include "cnn/lstm.h" + +namespace cnn { + +// computes a representation of a word by reading characters +// one at a time +struct C2WBuilder { + LSTMBuilder fc2w; + LSTMBuilder rc2w; + LookupParameters* p_lookup; + std::vector words; + std::map wordid2vi; + explicit C2WBuilder(int vocab_size, + unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* m) : + fc2w(layers, input_dim, hidden_dim, m), + rc2w(layers, input_dim, hidden_dim, m), + p_lookup(m->add_lookup_parameters(vocab_size, {input_dim})) { + } + void new_graph(Hypergraph* hg) { + words.clear(); + fc2w.new_graph(hg); + rc2w.new_graph(hg); + } + // compute a composed representation of a word out of characters + // wordid should be a unique index for each word *type* in the graph being built + VariableIndex add_word(int word_id, const std::vector& chars, Hypergraph* hg) { + auto it = wordid2vi.find(word_id); + if (it == wordid2vi.end()) { + fc2w.start_new_sequence(hg); + rc2w.start_new_sequence(hg); + std::vector ins(chars.size()); + std::map c2i; + for (unsigned i = 0; i < ins.size(); ++i) { + VariableIndex& v = c2i[chars[i]]; + if (!v) v = hg->add_lookup(p_lookup, chars[i]); + ins[i] = v; + fc2w.add_input(v, hg); + } + for (int i = ins.size() - 1; i >= 0; --i) + rc2w.add_input(ins[i], hg); + VariableIndex i_concat = hg->add_function({fc2w.back(), rc2w.back()}); + it = wordid2vi.insert(std::make_pair(word_id, i_concat)).first; + } + return it->second; + } +}; + +} // namespace cnn + +#endif diff --git a/cnn/lstm-fast.cc b/cnn/lstm.cc similarity index 82% rename from cnn/lstm-fast.cc rename to cnn/lstm.cc index e4e100d9e..3f94e85c8 100644 --- a/cnn/lstm-fast.cc +++ b/cnn/lstm.cc @@ -1,4 +1,4 @@ -#include "cnn/lstm-fast.h" +#include "cnn/lstm.h" #include #include @@ -13,12 +13,10 @@ namespace cnn { enum { X2I, H2I, C2I, BI, X2O, H2O, C2O, BO, X2C, H2C, BC }; -LSTMBuilder_CIFG::LSTMBuilder_CIFG(unsigned layers, +LSTMBuilder::LSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, Model* model) : hidden_dim(hidden_dim), layers(layers), zeros(hidden_dim, 0) { - builder_state = 0; // created - unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // i @@ -44,24 +42,9 @@ LSTMBuilder_CIFG::LSTMBuilder_CIFG(unsigned layers, } // layers } -void LSTMBuilder_CIFG::new_graph() { - param_vars.clear(); - h.clear(); - h0.clear(); - c0.clear(); - builder_state = 1; -} - -void LSTMBuilder_CIFG::add_parameter_edges(Hypergraph* hg) { - if (builder_state != 1) { - cerr << "Invalid state: " << builder_state << endl; - abort(); - } - builder_state = 2; - +void LSTMBuilder::new_graph(Hypergraph* hg) { + sm.transition(RNNOp::new_graph); param_vars.clear(); - h.clear(); - c.clear(); for (unsigned i = 0; i < layers; ++i) { string layer = to_string(i); @@ -89,15 +72,10 @@ void LSTMBuilder_CIFG::add_parameter_edges(Hypergraph* hg) { } } -void LSTMBuilder_CIFG::start_new_sequence(Hypergraph* hg, - vector c_0, - vector h_0){ - if (builder_state < 2) { - cerr << "Invalid state: " << builder_state << endl; - abort(); - } - builder_state = 3; - +void LSTMBuilder::start_new_sequence(Hypergraph* hg, + vector c_0, + vector h_0) { + sm.transition(RNNOp::start_new_sequence); h.clear(); c.clear(); h0 = h_0; @@ -111,11 +89,8 @@ void LSTMBuilder_CIFG::start_new_sequence(Hypergraph* hg, assert (c0.size() == layers); } -VariableIndex LSTMBuilder_CIFG::add_input(VariableIndex x, Hypergraph* hg) { - if (builder_state != 3) { - cerr << "Invalid state: " << builder_state << endl; - abort(); - } +VariableIndex LSTMBuilder::add_input(VariableIndex x, Hypergraph* hg) { + sm.transition(RNNOp::add_input); const unsigned t = h.size(); h.push_back(vector(layers)); c.push_back(vector(layers)); diff --git a/cnn/lstm-fast.h b/cnn/lstm.h similarity index 73% rename from cnn/lstm-fast.h rename to cnn/lstm.h index 560b84151..59a807363 100644 --- a/cnn/lstm-fast.h +++ b/cnn/lstm.h @@ -1,26 +1,24 @@ -#ifndef CNN_LSTM_FAST_H_ -#define CNN_LSTM_FAST_H_ +#ifndef CNN_LSTM_H_ +#define CNN_LSTM_H_ #include "cnn/cnn.h" #include "cnn/edges.h" +#include "cnn/rnn-state-machine.h" namespace cnn { class Model; -struct LSTMBuilder_CIFG { - LSTMBuilder_CIFG() {} - explicit LSTMBuilder_CIFG(unsigned layers, - unsigned input_dim, - unsigned hidden_dim, - Model* model); +struct LSTMBuilder { + LSTMBuilder() {} + explicit LSTMBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model); - // call this to reset the builder when you are going to create - // a new computation graph - void new_graph(); - - // call this before start_new_sequence - void add_parameter_edges(Hypergraph* hg); + // call this to reset the builder when you are working with a newly + // created Hypergraph object + void new_graph(Hypergraph* hg); // Start new sequence in given Hypergraph with initial c0 and h0 // call after add_parameter edges but before add input, @@ -48,9 +46,6 @@ struct LSTMBuilder_CIFG { // access memory/hidden state contents const std::vector& final_h() const { return h.back(); } - // check to make sure parameters have been added before adding input - unsigned builder_state; - // first index is layer, then ... std::vector> params; @@ -68,6 +63,9 @@ struct LSTMBuilder_CIFG { unsigned hidden_dim; unsigned layers; std::vector zeros; + + // the state machine ensures that the caller is behaving + RNNStateMachine sm; }; } // namespace cnn diff --git a/cnn/rnn-state-machine.cc b/cnn/rnn-state-machine.cc new file mode 100644 index 000000000..08dcce183 --- /dev/null +++ b/cnn/rnn-state-machine.cc @@ -0,0 +1,15 @@ +#include "cnn/rnn-state-machine.h" + +#include + +using namespace std; + +namespace cnn { + +void RNNStateMachine::failure(RNNOp op) { + cerr << "State transition error: currently in state " << q_ << " but received operation " << op << endl; + abort(); +} + +} // namespace cnn + diff --git a/cnn/rnn-state-machine.h b/cnn/rnn-state-machine.h new file mode 100644 index 000000000..919072b6b --- /dev/null +++ b/cnn/rnn-state-machine.h @@ -0,0 +1,42 @@ +#ifndef CNN_RNN_STATE_MACHINE_H_ +#define CNN_RNN_STATE_MACHINE_H_ + +namespace cnn { + +// CURRENT STATE | ACTION | NEXT STATE +// --------------+---------------------+----------------- +// CREATED | new_graph | GRAPH_READY +// GRAPH_READY | start_new_sequence | READING_INPUT +// READING_INPUT | add_input | READING_INPUT +// READING_INPUT | start_new_seqeunce | READING_INPUT +// READING_INPUT | new_graph | GRAPH_READY + +enum RNNState {CREATED, GRAPH_READY, READING_INPUT}; +enum RNNOp {new_graph, start_new_sequence, add_input}; + +class RNNStateMachine { + public: + RNNStateMachine() : q_(RNNState::CREATED) {} + void failure(RNNOp op); + void transition(RNNOp op) { + switch (q_) { + case RNNState::CREATED: + if (op == RNNOp::new_graph) { q_ = RNNState::GRAPH_READY; break; } + failure(op); + case RNNState::GRAPH_READY: + if (op == RNNOp::start_new_sequence) { q_ = RNNState::READING_INPUT; break; } + failure(op); + case RNNState::READING_INPUT: + if (op == RNNOp::add_input) { break; } + if (op == RNNOp::start_new_sequence) { break; } + if (op == RNNOp::new_graph) { q_ = RNNState::GRAPH_READY; break; } + failure(op); + } + } + private: + RNNState q_; +}; + +} // namespace cnn + +#endif diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 0409c8276..f56d63e84 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -15,9 +15,6 @@ RNNBuilder::RNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, Model* model) : hidden_dim(hidden_dim), layers(layers), zeros(hidden_dim, 0) { - builder_state = 0; // created - assert(layers < 10); - unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { Parameters* p_x2h = model->add_parameters(Dim({hidden_dim, layer_input_dim})); @@ -29,25 +26,13 @@ RNNBuilder::RNNBuilder(unsigned layers, } } -void RNNBuilder::new_graph() { +void RNNBuilder::new_graph(Hypergraph* hg) { + sm.transition(RNNOp::new_graph); param_vars.clear(); - h.clear(); - h0.clear(); - builder_state = 1; -} - -void RNNBuilder::add_parameter_edges(Hypergraph* hg) { - if (builder_state != 1) { - cerr << "Invalid state: " << builder_state << endl; - abort(); - } - builder_state = 2; - for (unsigned i = 0; i < layers; ++i) { Parameters* p_x2h = params[i][0]; Parameters* p_h2h = params[i][1]; Parameters* p_hb = params[i][2]; - const string ts = to_string(i); VariableIndex i_x2h = hg->add_parameter(p_x2h); VariableIndex i_h2h = hg->add_parameter(p_h2h); VariableIndex i_hb = hg->add_parameter(p_hb); @@ -57,12 +42,7 @@ void RNNBuilder::add_parameter_edges(Hypergraph* hg) { } void RNNBuilder::start_new_sequence(Hypergraph* hg, vector h_0) { - if (builder_state < 2) { - cerr << "Invalid state: " << builder_state << endl; - abort(); - } - builder_state = 3; - + sm.transition(RNNOp::start_new_sequence); h.clear(); h0 = h_0; if (h0.empty()) { @@ -73,12 +53,8 @@ void RNNBuilder::start_new_sequence(Hypergraph* hg, vector h_0) { } VariableIndex RNNBuilder::add_input(VariableIndex x, Hypergraph* hg) { - if (builder_state != 3) { - cerr << "Invalid state: " << builder_state << endl; - abort(); - } + sm.transition(RNNOp::add_input); const unsigned t = h.size(); - string ts = to_string(t); h.push_back(vector(layers)); vector& ht = h.back(); VariableIndex in = x; diff --git a/cnn/rnn.h b/cnn/rnn.h index 6c31f0bb1..786831d8f 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -3,6 +3,7 @@ #include "cnn/cnn.h" #include "cnn/edges.h" +#include "cnn/rnn-state-machine.h" namespace cnn { @@ -15,12 +16,9 @@ struct RNNBuilder { unsigned hidden_dim, Model* model); - // call this to reset the builder when you are going to create - // a new computation graph - void new_graph(); - - // call this before add_input - void add_parameter_edges(Hypergraph* hg); + // call this to reset the builder when you are working with a newly + // created Hypergraph object + void new_graph(Hypergraph* hg); // Reset for new sequence on hypergraph hg with shared parameters // call this before add_input and after add_parameter_edges, or @@ -46,9 +44,6 @@ struct RNNBuilder { // access hidden state contents const std::vector& final_h() const { return h.back(); } - // check to make sure parameters have been added before adding input - unsigned builder_state; - // first index is layer, then x2h h2h hb std::vector> params; @@ -67,6 +62,9 @@ struct RNNBuilder { unsigned hidden_dim; unsigned layers; std::vector zeros; + + // the state machine ensures that the caller is behaving + RNNStateMachine sm; }; } // namespace cnn diff --git a/cnn/saxe_init.cc b/cnn/saxe-init.cc similarity index 96% rename from cnn/saxe_init.cc rename to cnn/saxe-init.cc index 5eb5e73ef..62dfbb0c9 100644 --- a/cnn/saxe_init.cc +++ b/cnn/saxe-init.cc @@ -1,4 +1,4 @@ -#include "saxe_init.h" +#include "saxe-init.h" #include #include diff --git a/cnn/saxe_init.h b/cnn/saxe-init.h similarity index 100% rename from cnn/saxe_init.h rename to cnn/saxe-init.h diff --git a/cnn/tests/test_edges.cc b/cnn/tests/test_edges.cc index 6a541f55a..c4914968a 100644 --- a/cnn/tests/test_edges.cc +++ b/cnn/tests/test_edges.cc @@ -7,6 +7,7 @@ #include "cnn/tests/test_utils.h" #include "cnn/tensor.h" #include "cnn/edges.h" +#include "cnn/c2w.h" using namespace std; using namespace cnn; diff --git a/cnn/tests/test_init.cc b/cnn/tests/test_init.cc index 2449260cb..1a436af84 100644 --- a/cnn/tests/test_init.cc +++ b/cnn/tests/test_init.cc @@ -6,7 +6,7 @@ #include "cnn/tests/test_utils.h" #include "cnn/tensor.h" -#include "cnn/saxe_init.h" +#include "cnn/saxe-init.h" using namespace std; using namespace cnn; diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 4b9f2d96a..ad44cba68 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,7 +1,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -ADD_EXECUTABLE(embed_cl embed_cl.cc) -target_link_libraries(embed_cl cnn ${LIBS}) +ADD_EXECUTABLE(embed-cl embed-cl.cc) +target_link_libraries(embed-cl cnn ${LIBS}) ADD_EXECUTABLE(encdec encdec.cc) target_link_libraries(encdec cnn ${LIBS}) diff --git a/examples/embed_cl.cc b/examples/embed-cl.cc similarity index 99% rename from examples/embed_cl.cc rename to examples/embed-cl.cc index c28fb74dd..f21c47c20 100644 --- a/examples/embed_cl.cc +++ b/examples/embed-cl.cc @@ -2,8 +2,6 @@ #include "cnn/cnn.h" #include "cnn/training.h" #include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/lstm-fast.h" #include "cnn/dict.h" #include diff --git a/examples/encdec.cc b/examples/encdec.cc index 6bba7f984..f60f5e5e3 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -3,7 +3,7 @@ #include "cnn/training.h" #include "cnn/timing.h" #include "cnn/rnn.h" -#include "cnn/lstm-fast.h" +#include "cnn/lstm.h" #include "cnn/dict.h" #include @@ -53,16 +53,14 @@ struct EncoderDecoder { // build graph and return VariableIndex of total loss VariableIndex BuildGraph(const vector& insent, const vector& osent, Hypergraph& hg) { // forward encoder - fwd_enc_builder.new_graph(); - fwd_enc_builder.add_parameter_edges(&hg); + fwd_enc_builder.new_graph(&hg); fwd_enc_builder.start_new_sequence(&hg); for (unsigned t = 0; t < insent.size(); ++t) { VariableIndex i_x_t = hg.add_lookup(p_ec, insent[t]); fwd_enc_builder.add_input(i_x_t, &hg); } // backward encoder - rev_enc_builder.new_graph(); - rev_enc_builder.add_parameter_edges(&hg); + rev_enc_builder.new_graph(&hg); rev_enc_builder.start_new_sequence(&hg); for (int t = insent.size() - 1; t >= 0; --t) { VariableIndex i_x_t = hg.add_lookup(p_ec, insent[t]); @@ -90,8 +88,7 @@ struct EncoderDecoder { oein_c[i] = hg.add_function({i_nc}, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM); oein_h[i] = hg.add_function({oein_c[i]}); } - dec_builder.new_graph(); - dec_builder.add_parameter_edges(&hg); + dec_builder.new_graph(&hg); dec_builder.start_new_sequence(&hg, oein_c, oein_h); // decoder @@ -178,7 +175,7 @@ int main(int argc, char** argv) { sgd = new SimpleSGDTrainer(&model); //RNNBuilder rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, &model); - EncoderDecoder lm(model); + EncoderDecoder lm(model); if (argc == 4) { string fname = argv[3]; ifstream in(fname); diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 9bd64f800..ea1b0158b 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -3,7 +3,7 @@ #include "cnn/training.h" #include "cnn/timing.h" #include "cnn/rnn.h" -#include "cnn/lstm-fast.h" +#include "cnn/lstm.h" #include "cnn/dict.h" #include @@ -37,8 +37,7 @@ struct RNNLanguageModel { // return VariableIndex of total loss VariableIndex BuildLMGraph(const vector& sent, Hypergraph& hg) { const unsigned slen = sent.size() - 1; - builder.new_graph(); // reset RNN builder for new graph - builder.add_parameter_edges(&hg); // add variables for its parameters + builder.new_graph(&hg); // reset RNN builder for new graph builder.start_new_sequence(&hg); VariableIndex i_R = hg.add_parameter(p_R); // hidden -> word rep parameter VariableIndex i_bias = hg.add_parameter(p_bias); // word bias @@ -71,8 +70,7 @@ struct RNNLanguageModel { void RandomSample(int max_len = 150) { cerr << endl; Hypergraph hg; - builder.new_graph(); // reset RNN builder for new graph - builder.add_parameter_edges(&hg); // add variables for its parameters + builder.new_graph(&hg); // reset RNN builder for new graph builder.start_new_sequence(&hg); VariableIndex i_R = hg.add_parameter(p_R); // hidden -> word rep parameter VariableIndex i_bias = hg.add_parameter(p_bias); // word bias @@ -172,7 +170,7 @@ int main(int argc, char** argv) { sgd = new SimpleSGDTrainer(&model); //RNNBuilder rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, &model); - RNNLanguageModel lm(model); + RNNLanguageModel lm(model); if (argc == 4) { string fname = argv[3]; ifstream in(fname); From e1169e2acf05b8c5461d9b66dbdf48328af8056e Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 2 May 2015 23:32:28 -0400 Subject: [PATCH 023/965] precompute dimensionality of each variable in computation graph --- cnn/{backends/eigen => }/dim.cc | 0 cnn/{backends/eigen => }/dim.h | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename cnn/{backends/eigen => }/dim.cc (100%) rename cnn/{backends/eigen => }/dim.h (100%) diff --git a/cnn/backends/eigen/dim.cc b/cnn/dim.cc similarity index 100% rename from cnn/backends/eigen/dim.cc rename to cnn/dim.cc diff --git a/cnn/backends/eigen/dim.h b/cnn/dim.h similarity index 100% rename from cnn/backends/eigen/dim.h rename to cnn/dim.h From 962ef53f6d193c1b32a1b7304e350d49ee088300 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 2 May 2015 23:33:55 -0400 Subject: [PATCH 024/965] precompute dimensionality of each variable in computation graph --- cnn/CMakeLists.txt | 7 +- cnn/backends/eigen/edges.cc | 20 ++- cnn/backends/eigen/eigen-backend.cc | 12 +- cnn/backends/eigen/model.cc | 4 +- cnn/backends/eigen/tensor-eigen.h | 7 - cnn/cnn.cc | 16 +- cnn/cnn.h | 8 +- cnn/dim.cc | 15 +- cnn/dim.h | 47 ++--- cnn/edges-common.cc | 259 +++++++++++++++++++++++++++- cnn/edges.h | 36 +++- cnn/lstm.cc | 2 +- cnn/model.h | 1 - cnn/param-edges.cc | 16 ++ cnn/param-edges.h | 4 + cnn/tensor.h | 1 + cnn/tests/test_edges.cc | 9 +- examples/embed-cl.cc | 2 +- examples/rnnlm.cc | 2 +- 19 files changed, 404 insertions(+), 64 deletions(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 9b61132ea..757d09690 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -6,6 +6,7 @@ PROJECT(cnn CXX) set(cnn_library_SRCS cnn.cc dict.cc + dim.cc edges-common.cc lstm.cc param-edges.cc @@ -18,6 +19,8 @@ set(cnn_library_SRCS # Headers: set(cnn_library_HDRS cnn.h + dict.h + dim.h edges.h lstm.h model.h @@ -31,7 +34,7 @@ set(cnn_library_HDRS ) if(WITH_THPP_BACKEND) - list(APPEND cnn_library_SRCS backends/thpp/backend.cc backends/thpp/dim.cc backends/thpp/edges.cc backends/thpp/model.cc) + list(APPEND cnn_library_SRCS backends/thpp/backend.cc backends/thpp/edges.cc backends/thpp/model.cc) endif(WITH_THPP_BACKEND) if(WITH_MINERVA_BACKEND) @@ -39,7 +42,7 @@ if(WITH_MINERVA_BACKEND) endif(WITH_MINERVA_BACKEND) if(WITH_EIGEN_BACKEND) - list(APPEND cnn_library_SRCS backends/eigen/eigen-backend.cc backends/eigen/dim.cc backends/eigen/edges.cc backends/eigen/model.cc) + list(APPEND cnn_library_SRCS backends/eigen/eigen-backend.cc backends/eigen/edges.cc backends/eigen/model.cc) endif(WITH_EIGEN_BACKEND) file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) diff --git a/cnn/backends/eigen/edges.cc b/cnn/backends/eigen/edges.cc index 2c8bffd7b..3ef717b9c 100644 --- a/cnn/backends/eigen/edges.cc +++ b/cnn/backends/eigen/edges.cc @@ -86,7 +86,7 @@ Tensor InnerProduct3D_1D::backward(const vector& xs, Tensor GaussianNoise::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs[0]; - return x + RandomNormal(cnn::size(x), 0, stddev); + return x + RandomNormal(Dim(x.rows(), x.cols()), 0, stddev); } Tensor GaussianNoise::backward(const vector& xs, @@ -100,7 +100,7 @@ Tensor GaussianNoise::backward(const vector& xs, Tensor Dropout::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs[0]; - noise_mask = RandomBernoulli(cnn::size(x), p); + noise_mask = RandomBernoulli(Dim(x.rows(), x.cols()), p); return x.cwiseProduct(noise_mask); } @@ -112,13 +112,21 @@ Tensor Dropout::backward(const vector& xs, return dEdf.cwiseProduct(noise_mask); }; -Tensor OneMinusX::forward(const vector& xs) const { +struct FConstantMinus { + FConstantMinus(float c) : c(c) {} + inline float operator()(float x) const { + return c - x; + } + float c; +}; + +Tensor ConstantMinusX::forward(const vector& xs) const { assert(xs.size() == 1); const Tensor& x = *xs[0]; - return Constant(cnn::size(x), c) - x; + return x.unaryExpr(FConstantMinus(c)); } -Tensor OneMinusX::backward(const vector& xs, +Tensor ConstantMinusX::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i) const { @@ -183,7 +191,7 @@ Tensor Exp::backward(const vector& xs, Tensor Log::forward(const vector& xs) const { assert(xs.size() == 1); - return Elewise::Ln(*xs.front()); + return xs.front()->array().log(); } Tensor Log::backward(const vector& xs, diff --git a/cnn/backends/eigen/eigen-backend.cc b/cnn/backends/eigen/eigen-backend.cc index cb64af33c..c43c3fedb 100644 --- a/cnn/backends/eigen/eigen-backend.cc +++ b/cnn/backends/eigen/eigen-backend.cc @@ -44,7 +44,7 @@ Eigen::MatrixXf Elewise::SigmoidBackward(const Eigen::MatrixXf& diff, const Eige struct FRectify { inline float operator()(float x) const { - return (x > 0) ? x : 0; + return (x > 0.f) ? x : 0.f; } }; @@ -62,8 +62,14 @@ Eigen::MatrixXf Elewise::ReluBackward(const Eigen::MatrixXf& diff, const Eigen:: return top.binaryExpr(diff, FRectifyBackward()); } +struct FTanh { + inline float operator()(float x) const { + return tanhf(x); + } +}; + Eigen::MatrixXf Elewise::TanhForward(const Eigen::MatrixXf& x) { - return x.unaryExpr(ptr_fun(tanhf)); + return x.unaryExpr(FTanh()); } struct FTanhBackward { @@ -96,7 +102,7 @@ Eigen::MatrixXf Convolution::SoftmaxForward(const Eigen::MatrixXf& src, SoftmaxA if (src.cols() == 1) { return src.unaryExpr(FSoftmaxNormalize(logsumexp(src))); } else { - cerr << "SoftmaxForward not implemented for multiple columns\n"; + cerr << "SoftmaxForward not implemented for multiple columns: " << src.rows() << "x" << src.cols() << endl; abort(); } } diff --git a/cnn/backends/eigen/model.cc b/cnn/backends/eigen/model.cc index 2da111572..d44551fbe 100644 --- a/cnn/backends/eigen/model.cc +++ b/cnn/backends/eigen/model.cc @@ -9,7 +9,7 @@ namespace cnn { ParametersBase::~ParametersBase() {} -size_t Parameters::size() const { return cnn::size(values).Prod(); } +size_t Parameters::size() const { return dim.size(); } void Parameters::rescale_gradient(real scale) { g *= scale; } @@ -24,7 +24,7 @@ void Parameters::clear() { } size_t LookupParameters::size() const { - return values.size() * dim.Prod(); + return values.size() * dim.size(); } real LookupParameters::g_squared_l2norm() const { diff --git a/cnn/backends/eigen/tensor-eigen.h b/cnn/backends/eigen/tensor-eigen.h index aacf19cae..325d873ad 100644 --- a/cnn/backends/eigen/tensor-eigen.h +++ b/cnn/backends/eigen/tensor-eigen.h @@ -6,7 +6,6 @@ #include #include -#include "cnn/backends/eigen/dim.h" #include "cnn/backends/eigen/eigen-serialization.h" #include "cnn/backends/eigen/random.h" @@ -64,14 +63,8 @@ inline real rand01() { return distribution(*rndeng); } -inline Dim size(const Tensor& m) { - if (m.cols() == 1) return Dim({m.rows()}); - return Dim(m.rows(), m.cols()); -} - // column major constructor inline Tensor Ccm(const Dim&d, const std::initializer_list& v) { - std::cerr << "d: " << d << std::endl; Tensor m = Zero(d); int cc = 0; int cr = 0; diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 3ceca2a00..d7e7a2fe1 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -94,6 +94,19 @@ VariableIndex Hypergraph::add_const_lookup(LookupParameters* p, unsigned index) } const Tensor& Hypergraph::incremental_forward() { + vector xds; + for (unsigned i = last_node_evaluated; i < nodes.size(); ++i) { + Node* node = nodes[i]; + const Edge& in_edge = *edges[node->in_edge]; + xds.resize(in_edge.arity()); + unsigned ti = 0; + for (VariableIndex tail_node_index : in_edge.tail) { + xds[ti] = nodes[tail_node_index]->dim; + ++ti; + } + node->dim = in_edge.dim_forward(xds); + } + vector xs; while (last_node_evaluated < nodes.size()) { Node* node = nodes[last_node_evaluated]; @@ -105,7 +118,8 @@ const Tensor& Hypergraph::incremental_forward() { ++ti; } node->f = in_edge.forward(xs); - node->dEdf = Zero(cnn::size(node->f)); + //node->dEdf = Zero(Dim(node->f.rows(), node->f.cols())); + node->dEdf = Zero(node->dim); ++last_node_evaluated; } return nodes.back()->f; diff --git a/cnn/cnn.h b/cnn/cnn.h index 82fab4a15..f432705ab 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -103,14 +103,16 @@ struct Node { VariableIndex node_id; // my id // computation + Dim dim; // TODO remove these from here, they should be local to the forward/backward - // algorithms + // algorithms which lets them manage memory for the full computation graph Tensor f; // f(x_1 , ... , x_n) Tensor dEdf; // dE/df }; inline void swap(Node& n1, Node& n2) { using std::swap; + swap(n1.dim, n2.dim); swap(n1.f, n2.f); swap(n1.dEdf, n2.dEdf); swap(n1.in_edge, n2.in_edge); @@ -125,6 +127,10 @@ struct Edge { // debugging virtual std::string as_string(const std::vector& var_names) const = 0; + // compute dimensions of results given dimensions of inputs + // also checks to make sure inputs are compatible with each other + virtual Dim dim_forward(const std::vector& xs) const = 0; + // computation virtual Tensor forward(const std::vector& xs) const = 0; // computes the derivative of E with respect to the ith argument to f, that is, xs[i] diff --git a/cnn/dim.cc b/cnn/dim.cc index 5f5a1c1a9..dd01ec876 100644 --- a/cnn/dim.cc +++ b/cnn/dim.cc @@ -1,17 +1,16 @@ -#include "cnn/backends/eigen/dim.h" +#include "cnn/dim.h" #include +using namespace std; + namespace cnn { -std::ostream& operator<<(std::ostream& os, const Dim& d) { +ostream& operator<<(ostream& os, const Dim& d) { os << '{'; - int c = 0; - for (auto v : d.d) { - if (!v) break; - if (c) os << ','; - os << v; - ++c; + for (unsigned i = 0; i < d.nd; ++i) { + if (i) os << ','; + os << d.d[i]; } return os << '}'; } diff --git a/cnn/dim.h b/cnn/dim.h index da2954386..3756edf56 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -1,46 +1,47 @@ -#ifndef EIGEN_DIM_H -#define EIGEN_DIM_H +#ifndef CNN_DIM_H +#define CNN_DIM_H #include #include +#include -#include -#include -#define CNN_MAX_TENSOR_DIM 8 +#define CNN_MAX_TENSOR_DIM 7 + +namespace boost { namespace serialization { class access; } } namespace cnn { struct Dim { - Dim() { d[0] = 0; } - explicit Dim(int m) { d[0] = m; d[1] = 0; } - Dim(int m, int n) { d[0] = m; d[1] = n; d[2] = 0; } - Dim(std::initializer_list x) { - int c = 0; - for(auto v : x) d[c++] = v; - d[c] = 0; + Dim() : nd() {} + explicit Dim(int m) : nd(1) { d[0] = m; } + Dim(int m, int n) : nd(2) { d[0] = m; d[1] = n; } + Dim(std::initializer_list x) : nd() { + for(auto v : x) d[nd++] = v; + } + inline int size() const { + int p = 1; + for (unsigned i = 0; i < nd; ++i) p *= d[i]; + return p; } - inline int size() const { int p = 1; const unsigned short* pd=d; while(*pd) { p *= *pd; ++pd; } return p; } - inline int ndims() const { int nd = 0; const unsigned short* pd = d; while(*pd) { nd++; pd++; } return nd; } - inline unsigned Prod() const { return size(); } + inline int ndims() const { return nd; } inline int rows() const { return d[0]; } - inline int cols() const { return d[1] ? d[1] : 1; } - inline int operator[](unsigned i) const { return d[i]; } - inline int size(unsigned i) const { return d[i]; } + inline int cols() const { return nd > 1 ? d[1] : 1; } + inline int operator[](unsigned i) const { return i < nd ? d[i] : 1; } + inline int size(unsigned i) const { return (*this)[i]; } inline Dim transpose() const { return Dim({d[1],d[0]}); } unsigned short d[CNN_MAX_TENSOR_DIM]; + unsigned short nd; private: friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { - ar & d; + ar & nd; ar & d; } }; inline bool operator==(const Dim& a, const Dim& b) { - if (a.size() != b.size()) return false; - for (unsigned i = 0; i < CNN_MAX_TENSOR_DIM && !(a.d[i] == 0 && b.d[i] == 0); ++i) - if (a.d[i] != b.d[i]) return false; - return true; + if (a.nd != b.nd) return false; + return std::memcmp(a.d, b.d, a.nd) == 0; } inline bool operator!=(const Dim& a, const Dim& b) { return !(a == b); } diff --git a/cnn/edges-common.cc b/cnn/edges-common.cc index be5db4312..406c3c9de 100644 --- a/cnn/edges-common.cc +++ b/cnn/edges-common.cc @@ -8,80 +8,167 @@ using namespace std; namespace cnn { +inline ostream& operator<<(ostream& os, const vector& ds) { + os << '['; + for (unsigned i = 0; i < ds.size(); ++i) + os << (i ? " " : "") << ds[i]; + return os << ']'; +} + +inline bool LooksLikeVector(const Dim& d) { + if (d.ndims() == 1) return true; + if (d.ndims() > 1) { + for (unsigned i = 1; i < d.ndims(); ++i) + if (d[i] != 1) return false; + } + return true; +} + string Reshape::as_string(const vector& arg_names) const { ostringstream s; s << "reshape(" << arg_names[0] << ',' << from << " --> " << to << ')'; return s.str(); } +Dim Reshape::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + assert(xs[0] == from); + return to; +} + string SumColumns::as_string(const vector& arg_names) const { ostringstream s; s << "sum_cols(" << arg_names[0] << ')'; return s.str(); } +Dim SumColumns::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return Dim({xs[0].rows()}); +} + string KMHNGram::as_string(const vector& arg_names) const { ostringstream s; s << "kmh-ngram(" << arg_names[0] << ')'; return s.str(); } +Dim KMHNGram::dim_forward(const vector& xs) const { + assert(xs[0].ndims() == 2); + const int new_cols = xs[0].cols() - n + 1; + if (new_cols < 1) { + cerr << "Bad input dimensions in KMHNGram: " << xs << endl; + abort(); + } + return Dim({xs[0][0], new_cols}); +} + string InnerProduct3D_1D::as_string(const vector& arg_names) const { ostringstream s; s << "inner(" << arg_names[0] << "," << arg_names[1] << ") + " << arg_names[2]; return s.str(); } +Dim InnerProduct3D_1D::dim_forward(const vector& xs) const { + cerr << "InnerProduct3D_1D::dim_forward not implemented\n"; + abort(); +} + string GaussianNoise::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0] << " + N(0," << stddev << ')'; return s.str(); } +Dim GaussianNoise::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string Dropout::as_string(const vector& arg_names) const { ostringstream s; s << "dropout(" << arg_names[0] << ",p=" << p << ')'; return s.str(); } -string OneMinusX::as_string(const vector& arg_names) const { +Dim Dropout::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + +string ConstantMinusX::as_string(const vector& arg_names) const { ostringstream s; s << c << " - " << arg_names[0]; return s.str(); } +Dim ConstantMinusX::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string Sum::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0]; - for (unsigned i = 1; i < tail.size(); ++i) + for (unsigned i = 1; i < arg_names.size(); ++i) s << " + " << arg_names[i]; return s.str(); } +Dim Sum::dim_forward(const vector& xs) const { + for (unsigned i = 1; i < xs.size(); ++i) { + if (xs[0] != xs[1]) { + cerr << "Mismatched input dimensions in Sum: " << xs << endl; + abort(); + } + } + return xs[0]; +} + string Tanh::as_string(const vector& arg_names) const { ostringstream s; s << "tanh(" << arg_names[0] << ')'; return s.str(); } +Dim Tanh::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string Square::as_string(const vector& arg_names) const { ostringstream s; s << "square(" << arg_names[0] << ')'; return s.str(); } +Dim Square::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string Exp::as_string(const vector& arg_names) const { ostringstream os; os << "exp(" << arg_names[0] << ')'; return os.str(); } +Dim Exp::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string Log::as_string(const vector& arg_names) const { ostringstream os; os << "log(" << arg_names[0] << ')'; return os.str(); } +Dim Log::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string Concatenate::as_string(const vector& arg_names) const { ostringstream os; os << "concat(" << arg_names[0]; @@ -92,6 +179,18 @@ string Concatenate::as_string(const vector& arg_names) const { return os.str(); } +Dim Concatenate::dim_forward(const vector& xs) const { + unsigned new_rows = 0; + for (auto& d : xs) { + if (!LooksLikeVector(d)) { + cerr << "Bad input dimensions in Concatenate: " << xs << endl; + abort(); + } + new_rows += d[0]; + } + return Dim({new_rows}); +} + string ConcatenateColumns::as_string(const vector& arg_names) const { ostringstream os; os << "concat_cols(" << arg_names[0]; @@ -102,52 +201,130 @@ string ConcatenateColumns::as_string(const vector& arg_names) const { return os.str(); } +Dim ConcatenateColumns::dim_forward(const vector& xs) const { + assert(xs.size() > 0); + unsigned rows = xs[0][0]; + unsigned new_cols = 0; + for (auto& d : xs) { + if (d[0] != rows) { + cerr << "Bad input dimensions in ConcatenateColumns: " << xs << endl; + abort(); + } + new_cols += d[1]; + } + return Dim({rows, new_cols}); +} + string Hinge::as_string(const vector& arg_names) const { ostringstream os; os << "hinge(" << arg_names[0] << ",m=" << margin << ")"; return os.str(); } +Dim Hinge::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + if (!LooksLikeVector(xs[0])) { + cerr << "Bad input dimensions in Hinge: " << xs << endl; + abort(); + } + return Dim({1}); +} + string Identity::as_string(const vector& arg_names) const { return arg_names[0]; } +Dim Identity::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string MaxPooling1D::as_string(const vector& arg_names) const { ostringstream os; os << "maxpool1d(" << arg_names.front() << ",w=" << width << ")"; return os.str(); } +Dim MaxPooling1D::dim_forward(const vector& xs) const { + cerr << "MaxPooling1D::dim_forward not implemented\n"; + abort(); +} + string Softmax::as_string(const vector& arg_names) const { ostringstream s; s << "softmax(" << arg_names[0] << ')'; return s.str(); } +Dim Softmax::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + if (!LooksLikeVector(xs[0])) { + cerr << "Bad input dimensions in Softmax: " << xs << endl; + abort(); + } + return xs[0]; +} + string PickNegLogSoftmax::as_string(const vector& arg_names) const { ostringstream s; s << "log_softmax(" << arg_names[0] << ")_{" << *pval << '}'; return s.str(); } +Dim PickNegLogSoftmax::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + if (!LooksLikeVector(xs[0])) { + cerr << "Bad input dimensions in PickNegLogSoftmax: " << xs << endl; + abort(); + } + return Dim({1}); +} + string LogSoftmax::as_string(const vector& arg_names) const { ostringstream s; s << "log_softmax(" << arg_names[0] << ')'; return s.str(); } +Dim LogSoftmax::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + if (!LooksLikeVector(xs[0])) { + cerr << "Bad input dimensions in LogSoftmax: " << xs << endl; + abort(); + } + return xs[0]; +} + string RestrictedLogSoftmax::as_string(const vector& arg_names) const { ostringstream s; s << "r_log_softmax(" << arg_names[0] << ')'; return s.str(); } +Dim RestrictedLogSoftmax::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + if (!LooksLikeVector(xs[0])) { + cerr << "Bad input dimensions in RestrictedLogSoftmax: " << xs << endl; + abort(); + } + return xs[0]; +} + string PickElement::as_string(const vector& arg_names) const { ostringstream s; s << "pick(" << arg_names[0] << ',' << *pval << ')'; return s.str(); } +Dim PickElement::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + if (!LooksLikeVector(xs[0])) { + cerr << "Bad input dimensions in PickElement: " << xs << endl; + abort(); + } + return Dim({1}); +} + // x_1 is a vector // y = (x_1)[start:end] string PickRange::as_string(const vector& arg_names) const { @@ -156,18 +333,47 @@ string PickRange::as_string(const vector& arg_names) const { return s.str(); } +Dim PickRange::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + if (!LooksLikeVector(xs[0])) { + cerr << "Bad input dimensions in PickElement: " << xs << endl; + abort(); + } + assert(xs[0][0] <= end); + return Dim({end - start}); +} + string MatrixMultiply::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0] << " * " << arg_names[1]; return s.str(); } +Dim MatrixMultiply::dim_forward(const vector& xs) const { + assert(xs.size() == 2); + if (xs[0].cols() != xs[1].rows()) { + cerr << "Mismatched input dimensions in MatrixMultiply: " << xs << endl; + abort(); + } + if (xs[1].ndims() == 1) return Dim({xs[0].rows()}); + return Dim({xs[0].rows(), xs[1].cols()}); +} + string CwiseMultiply::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0] << " \\cdot " << arg_names[1]; return s.str(); } +Dim CwiseMultiply::dim_forward(const vector& xs) const { + assert(xs.size() == 2); + if (xs[0] != xs[1]) { + cerr << "Mismatched input dimensions in CwiseMultiply: " << xs << endl; + abort(); + } + return xs[0]; +} + string Multilinear::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0]; @@ -176,34 +382,83 @@ string Multilinear::as_string(const vector& arg_names) const { return s.str(); } +Dim Multilinear::dim_forward(const vector& xs) const { + if ((xs.size() - 1) % 2 != 0) { + cerr << "Bad number of inputs for Multilinear: " << xs << endl; + abort(); + } + for (unsigned i = 1; i < xs.size(); i += 2) { + if (xs[i].cols() != xs[i+1].rows() || + xs[0].rows() != xs[i].rows() || + xs[0].cols() != xs[i+1].cols()) { + cerr << "Bad dimensions for Multilinear: " << xs << endl; + abort(); + } + } + return xs[0]; +} + string Negate::as_string(const vector& arg_names) const { ostringstream s; s << '-' << arg_names[0]; return s.str(); } +Dim Negate::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string Rectify::as_string(const vector& arg_names) const { ostringstream s; s << "ReLU(" << arg_names[0] << ')'; return s.str(); } +Dim Rectify::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string SquaredEuclideanDistance::as_string(const vector& arg_names) const { ostringstream s; s << "|| " << arg_names[0] << " - " << arg_names[1] << " ||^2"; return s.str(); } +Dim SquaredEuclideanDistance::dim_forward(const vector& xs) const { + assert(xs.size() == 2); + if (xs[0] != xs[1]) { + cerr << "Mismatched input dimensions in SquaredEuclideanDistance: " << xs << endl; + abort(); + } + return Dim({1}); +} + string LogisticSigmoid::as_string(const vector& arg_names) const { ostringstream s; s << "\\sigma(" << arg_names[0] << ')'; return s.str(); } +Dim LogisticSigmoid::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string BinaryLogLoss::as_string(const vector& arg_names) const { ostringstream os; os << "binary_log_loss(" << arg_names[0] << ", " << *ptarget_y << ')'; return os.str(); } +Dim BinaryLogLoss::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + if (xs[0].rows() != 2 && xs[0].ndims() != 1) { + cerr << "Bad input dimensions in BinaryLogLoss: " << xs << endl; + abort(); + } + return Dim({1}); +} + } // namespace cnn diff --git a/cnn/edges.h b/cnn/edges.h index 0a236981d..8e0ce84e1 100644 --- a/cnn/edges.h +++ b/cnn/edges.h @@ -11,6 +11,7 @@ struct Reshape : public Edge { assert(from.size() == to.size()); } std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -23,6 +24,7 @@ struct Reshape : public Edge { // y_i = \sum_{j} x_i,j struct SumColumns : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -34,6 +36,7 @@ struct SumColumns : public Edge { struct KMHNGram : public Edge { explicit KMHNGram(unsigned n) : n(n) {} std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -51,6 +54,7 @@ struct KMHNGram : public Edge { // (dE/dC)_ij = (dE/dY)_ij struct InnerProduct3D_1D : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -63,6 +67,7 @@ struct InnerProduct3D_1D : public Edge { struct GaussianNoise : public Edge { explicit GaussianNoise(real stddev) : stddev(stddev) {} std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -75,6 +80,7 @@ struct GaussianNoise : public Edge { struct Dropout : public Edge { explicit Dropout(real p) : p(p) {} std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -86,10 +92,10 @@ struct Dropout : public Edge { // y = c - x_1 // (c is a vector or matrix of the constant, usually 1, but can be configured) -struct OneMinusX : public Edge { - OneMinusX() : c(1) {} - explicit OneMinusX(real o) : c(o) {} +struct ConstantMinusX : public Edge { + explicit ConstantMinusX(real o) : c(o) {} std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -101,6 +107,7 @@ struct OneMinusX : public Edge { // y = tanh x_1 struct Tanh : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -111,6 +118,7 @@ struct Tanh : public Edge { // y = x_1 \odot x_1 struct Square : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -121,6 +129,7 @@ struct Square : public Edge { // y = exp x_1 struct Exp : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -131,6 +140,7 @@ struct Exp : public Edge { // y = log x_1 (base e, i.e., natural log) struct Log : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -141,6 +151,7 @@ struct Log : public Edge { // concatenate rows struct Concatenate : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -155,6 +166,7 @@ struct Concatenate : public Edge { // x_i must be a column vector in R^n struct ConcatenateColumns : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -168,6 +180,7 @@ struct Hinge : public Edge { explicit Hinge(unsigned e, real m = 1.0) : element(e), pelement(&element), margin(m) {} explicit Hinge(unsigned* pe, real m = 1.0) : element(), pelement(pe), margin(m) {} std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -182,6 +195,7 @@ struct Hinge : public Edge { // y = x_1 struct Identity : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -196,6 +210,7 @@ struct Identity : public Edge { struct MaxPooling1D : public Edge { MaxPooling1D(unsigned w) : width(w) {} std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -208,6 +223,7 @@ struct MaxPooling1D : public Edge { // y = x_1 * x_2 struct MatrixMultiply : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -218,6 +234,7 @@ struct MatrixMultiply : public Edge { // y = x_1 \cdot x_2 (Hadamard product) struct CwiseMultiply : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -230,6 +247,7 @@ struct CwiseMultiply : public Edge { // this is an ugly hack to deal with diagonal matrices struct Multilinear : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -240,6 +258,7 @@ struct Multilinear : public Edge { // y = -x_1 struct Negate : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -250,6 +269,7 @@ struct Negate : public Edge { // y = max(0,x) struct Rectify : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -266,6 +286,7 @@ struct BinaryLogLoss : public Edge { BinaryLogLoss(real ty) : target_y(ty), ptarget_y(&target_y) {} BinaryLogLoss(real* pty) : target_y(), ptarget_y(pty) {} std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -278,6 +299,7 @@ struct BinaryLogLoss : public Edge { // y = \sum_i x_i struct Sum : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -288,6 +310,7 @@ struct Sum : public Edge { // y = || x_1 - x_2 ||^2 struct SquaredEuclideanDistance : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -298,6 +321,7 @@ struct SquaredEuclideanDistance : public Edge { // y = \sigma(x_1) struct LogisticSigmoid : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -309,6 +333,7 @@ struct LogisticSigmoid : public Edge { // y_i = (x_1)_i / z struct Softmax : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -320,6 +345,7 @@ struct Softmax : public Edge { // y_i = (x_1)_i - \log z struct LogSoftmax : public Edge { std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -334,6 +360,7 @@ struct PickNegLogSoftmax : public Edge { // use this constructor if you want to change the value after the graph is constructed explicit PickNegLogSoftmax(const unsigned* pv) : val(), pval(pv) {} std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -349,6 +376,7 @@ struct PickNegLogSoftmax : public Edge { struct RestrictedLogSoftmax : public Edge { explicit RestrictedLogSoftmax(const std::vector& d) : denom(d) {} std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -365,6 +393,7 @@ struct PickElement : public Edge { // use this constructor if you want to change the value after the graph is constructed explicit PickElement(const unsigned* pv) : val(), pval(pv) {} std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -380,6 +409,7 @@ struct PickElement : public Edge { struct PickRange : public Edge { explicit PickRange(unsigned start, unsigned end) : start(start), end(end) {} std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 3f94e85c8..137793857 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -114,7 +114,7 @@ VariableIndex LSTMBuilder::add_input(VariableIndex x, Hypergraph* hg) { VariableIndex i_ait = hg->add_function({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1, vars[C2I], i_c_tm1}); VariableIndex i_it = hg->add_function({i_ait}); // forget - VariableIndex i_ft = hg->add_function({i_it}); + VariableIndex i_ft = hg->add_function({i_it}, 1.f); // write memory cell VariableIndex i_awt = hg->add_function({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); VariableIndex i_wt = hg->add_function({i_awt}); diff --git a/cnn/model.h b/cnn/model.h index cd3e061b7..30bc79c11 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -41,7 +41,6 @@ struct Parameters : public ParametersBase { private: Parameters() {} explicit Parameters(const Dim& d) : dim(d), values(Random(d)), g(Zero(d)) {} - explicit Parameters(const Tensor& v) : dim(cnn::size(v)), values(v), g(Zero(dim)) {} friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { ar & dim; diff --git a/cnn/param-edges.cc b/cnn/param-edges.cc index c18e62a51..37dedb126 100644 --- a/cnn/param-edges.cc +++ b/cnn/param-edges.cc @@ -15,6 +15,10 @@ string ParameterEdge::as_string(const vector& arg_names) const { return s.str(); } +Dim ParameterEdge::dim_forward(const vector& xs) const { + return dim; +} + Tensor ParameterEdge::forward(const vector& xs) const { assert(xs.size() == 0); return params->values; @@ -38,6 +42,10 @@ string InputEdge::as_string(const vector& arg_names) const { return s.str(); } +Dim InputEdge::dim_forward(const vector& xs) const { + return dim; +} + Tensor InputEdge::forward(const vector& xs) const { assert(xs.size() == 0); assert((int)dim.size() == (int)pdata->size()); @@ -58,6 +66,10 @@ string ScalarInputEdge::as_string(const vector& arg_names) const { return s.str(); } +Dim ScalarInputEdge::dim_forward(const vector& xs) const { + return Dim({1}); +} + Tensor ScalarInputEdge::forward(const vector& xs) const { assert(xs.size() == 0); return FromRawData(Dim({1}), pdata); @@ -77,6 +89,10 @@ string LookupEdge::as_string(const vector& arg_names) const { return s.str(); } +Dim LookupEdge::dim_forward(const vector& xs) const { + return dim; +} + Tensor LookupEdge::forward(const vector& xs) const { assert(xs.size() == 0); return params->values[*pindex]; diff --git a/cnn/param-edges.h b/cnn/param-edges.h index f596b928e..c808800de 100644 --- a/cnn/param-edges.h +++ b/cnn/param-edges.h @@ -15,6 +15,7 @@ struct ParameterEdge : public ParameterEdgeBase { explicit ParameterEdge(Parameters* p) : dim(p->dim), params(p) {} bool has_parameters() const override; std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -29,6 +30,7 @@ struct ParameterEdge : public ParameterEdgeBase { struct InputEdge : public Edge { explicit InputEdge(const Dim& d, const std::vector* pd) : dim(d), pdata(pd) {} std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -43,6 +45,7 @@ struct ScalarInputEdge : public Edge { explicit ScalarInputEdge(real s) : data(s), pdata(&data) {} explicit ScalarInputEdge(const real* ps) : data(), pdata(ps) {} std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, @@ -58,6 +61,7 @@ struct LookupEdge : public ParameterEdgeBase { LookupEdge(LookupParameters* p, const unsigned* pind) : dim(p->dim), index(), pindex(pind), params(p), has_optimizable_parameters(true) {} bool has_parameters() const override; std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; Tensor forward(const std::vector& xs) const override; Tensor backward(const std::vector& xs, const Tensor& fx, diff --git a/cnn/tensor.h b/cnn/tensor.h index 0c2fb0fc7..880460908 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -2,6 +2,7 @@ #define CNN_TENSOR_H_ #include "config.h" +#include "cnn/dim.h" #ifdef WITH_MINERVA_BACKEND # include "backends/minerva/tensor-minerva.h" diff --git a/cnn/tests/test_edges.cc b/cnn/tests/test_edges.cc index c4914968a..e1b46cfa3 100644 --- a/cnn/tests/test_edges.cc +++ b/cnn/tests/test_edges.cc @@ -14,6 +14,11 @@ using namespace cnn; BOOST_GLOBAL_FIXTURE(TestTensorSetup) +Dim size(const Tensor& t) { + if (t.cols() > 1) + return Dim(t.rows(), t.cols()); + return Dim(t.rows()); +} BOOST_AUTO_TEST_CASE(ESqrL2) { @@ -258,9 +263,9 @@ BOOST_AUTO_TEST_CASE(MatrixVector) { BOOST_CHECK_CLOSE(t(vv,1), 34.75, eps); } -BOOST_AUTO_TEST_CASE(EOneMinus) { +BOOST_AUTO_TEST_CASE(EConstantMinus) { Tensor W = Ccm({2,2},{1,2,3,-4}); - OneMinusX om; + ConstantMinusX om(1); vector xs(1, &W); Tensor O = om.forward(xs); cerr << str(W) << endl; diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index f21c47c20..f1ec26fcf 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -162,7 +162,7 @@ int main(int argc, char** argv) { VariableIndex i_t = emb.EmbedTarget(trg, hg); VariableIndex i_sim = hg.add_function({i_s,i_t}); float margin = 2; - VariableIndex i_ms = hg.add_function({i_sim}, margin); + VariableIndex i_ms = hg.add_function({i_sim}, margin); const unsigned K = 20; vector noise(K); for (unsigned j = 0; j < K; ++j) { diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index ea1b0158b..a832b30f1 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -169,8 +169,8 @@ int main(int argc, char** argv) { else sgd = new SimpleSGDTrainer(&model); - //RNNBuilder rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, &model); RNNLanguageModel lm(model); + //RNNLanguageModel lm(model); if (argc == 4) { string fname = argv[3]; ifstream in(fname); From 49c47c112ef04b30dcbd9ec0a267c1cbc919cc39 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 5 May 2015 22:11:07 -0400 Subject: [PATCH 025/965] no runtime memory allocation --- CMakeLists.txt | 64 +- cnn/CMakeLists.txt | 38 +- cnn/backends/eigen/edges.cc | 735 ++++++++++++++--------- cnn/backends/eigen/eigen-backend.cc | 145 ----- cnn/backends/eigen/eigen-backend.h | 42 -- cnn/backends/eigen/eigen-serialization.h | 69 --- cnn/backends/eigen/init.cc | 19 + cnn/backends/eigen/init.h | 10 + cnn/backends/eigen/model.cc | 61 +- cnn/{ => backends/eigen}/saxe-init.cc | 7 +- cnn/backends/eigen/tensor-eigen.h | 89 --- cnn/backends/eigen/tensor.h | 91 +++ cnn/backends/minerva/tensor-minerva.h | 50 -- cnn/backends/thpp/backend.cc | 22 - cnn/backends/thpp/dim.cc | 13 - cnn/backends/thpp/dim.h | 38 -- cnn/backends/thpp/edges.cc | 404 ------------- cnn/backends/thpp/model.cc | 74 --- cnn/backends/thpp/random.h | 12 - cnn/backends/thpp/tensor.h | 162 ----- cnn/cnn.cc | 46 +- cnn/cnn.h | 36 +- cnn/edges.h | 223 ++++--- cnn/model.h | 16 +- cnn/param-edges.cc | 41 +- cnn/param-edges.h | 28 +- cnn/saxe-init.h | 11 +- cnn/tensor.h | 13 +- cnn/training.cc | 14 +- cnn/training.h | 4 +- examples/encdec.cc | 3 + examples/rnnlm.cc | 22 +- examples/xor-xent.cc | 8 +- examples/xor.cc | 10 +- 34 files changed, 922 insertions(+), 1698 deletions(-) delete mode 100644 cnn/backends/eigen/eigen-backend.cc delete mode 100644 cnn/backends/eigen/eigen-backend.h delete mode 100644 cnn/backends/eigen/eigen-serialization.h create mode 100644 cnn/backends/eigen/init.cc create mode 100644 cnn/backends/eigen/init.h rename cnn/{ => backends/eigen}/saxe-init.cc (79%) delete mode 100644 cnn/backends/eigen/tensor-eigen.h create mode 100644 cnn/backends/eigen/tensor.h delete mode 100644 cnn/backends/minerva/tensor-minerva.h delete mode 100644 cnn/backends/thpp/backend.cc delete mode 100644 cnn/backends/thpp/dim.cc delete mode 100644 cnn/backends/thpp/dim.h delete mode 100644 cnn/backends/thpp/edges.cc delete mode 100644 cnn/backends/thpp/model.cc delete mode 100644 cnn/backends/thpp/random.h delete mode 100644 cnn/backends/thpp/tensor.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b2dc49142..917c0a1bd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cnn) cmake_minimum_required(VERSION 2.8 FATAL_ERROR) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -O3 -g") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -O3 -g -DEIGEN_FAST_MATH") enable_testing() @@ -35,61 +35,29 @@ include_directories(${Boost_INCLUDE_DIR}) set(LIBS ${LIBS} ${Boost_LIBRARIES}) if(BACKEND) - message("BACKEND: ${BACKEND}") + message("-- BACKEND: ${BACKEND}") else() - message("BACKEND not specified, defaulting to eigen.") + message("-- BACKEND not specified, defaulting to eigen.") set(BACKEND "eigen") endif() -if(BACKEND MATCHES "^thpp$") - set(WITH_THPP_BACKEND 1) -elseif(BACKEND MATCHES "^eigen$") +if(BACKEND MATCHES "^eigen$") set(WITH_EIGEN_BACKEND 1) -elseif(BACKEND MATCHES "^minerva$") - set(WITH_MINVERA_BACKEND 1) else() - message(SEND_ERROR "BACKEND must be one of thpp, eigen, or minerva.") + message(SEND_ERROR "BACKEND must be eigen") endif() -# look for Minerva -if(WITH_MINERVA_BACKEND) - find_package(Minerva REQUIRED) - include_directories(${MINERVA_INCLUDE_DIR}) - if (ENABLE_CUDA) - set(CUDA_TOOLKIT_ROOT_DIR ${CUDA_ROOT}) - find_package(CUDA REQUIRED) - include_directories(SYSTEM ${CUDA_INCLUDE_DIRS}) - add_definitions(-DHAS_CUDA) - find_cudnn() - include_directories(SYSTEM ${CUDNN_INCLUDE_DIRS}) - else () - message(STATUS "CUDA not enabled (use -DENABLE_CUDA=1)") - endif() -endif(WITH_MINERVA_BACKEND) - -# look for thpp -if(WITH_THPP_BACKEND) - find_package(TH++ REQUIRED) - find_package(TH REQUIRED) - include_directories(${THPP_INCLUDE_DIR}) - include_directories(${TH_INCLUDE_DIR}) - set(LIBS ${LIBS} ${TH_LIBRARIES} ${THPP_LIBRARIES}) - if (ENABLE_CUDA) - find_package(CUDA REQUIRED) - include_directories(SYSTEM ${CUDA_INCLUDE_DIRS}) - find_package(THC REQUIRED) - include_directories(${THC_INCLUDE_DIR}) - else() - message(STATUS "CUDA not enabled (use -DENABLE_CUDA=1)") - endif() - FIND_PACKAGE(OpenMP) - IF(OPENMP_FOUND) - MESSAGE(STATUS "Compiling with OpenMP support") - SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") - SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") - ENDIF(OPENMP_FOUND) -endif(WITH_THPP_BACKEND) +if (ENABLE_CUDA) + find_package(CUDA REQUIRED) + set(CUDA_TOOLKIT_ROOT_DIR ${CUDA_ROOT}) + include_directories(SYSTEM ${CUDA_INCLUDE_DIRS}) + include_directories(SYSTEM ${CUDA_INCLUDE_DIRS}) + add_definitions(-DHAS_CUDA) + #find_cudnn() + #include_directories(SYSTEM ${CUDNN_INCLUDE_DIRS}) +else() + message(STATUS "CUDA not enabled (use -DENABLE_CUDA=1)") +endif() # look for Eigen find_package(Eigen3 REQUIRED) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 757d09690..0d59e216b 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -1,6 +1,3 @@ -# ########## Project setup ########## -PROJECT(cnn CXX) - # ########## cnn library ########## # Sources: set(cnn_library_SRCS @@ -12,7 +9,6 @@ set(cnn_library_SRCS param-edges.cc rnn.cc rnn-state-machine.cc - saxe-init.cc training.cc ) @@ -33,39 +29,35 @@ set(cnn_library_HDRS training.h ) -if(WITH_THPP_BACKEND) - list(APPEND cnn_library_SRCS backends/thpp/backend.cc backends/thpp/edges.cc backends/thpp/model.cc) -endif(WITH_THPP_BACKEND) - -if(WITH_MINERVA_BACKEND) -# list(APPEND cnn_library_SRCS backends/minerva/eigen-backend.cc) -endif(WITH_MINERVA_BACKEND) - if(WITH_EIGEN_BACKEND) - list(APPEND cnn_library_SRCS backends/eigen/eigen-backend.cc backends/eigen/edges.cc backends/eigen/model.cc) + list(APPEND cnn_library_SRCS + backends/eigen/saxe-init.cc + backends/eigen/init.cc + backends/eigen/edges.cc + backends/eigen/model.cc) endif(WITH_EIGEN_BACKEND) file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) -foreach(test_src ${TEST_SRCS}) +#foreach(test_src ${TEST_SRCS}) #Extract the filename without an extension (NAME_WE) - get_filename_component(testName ${test_src} NAME_WE) +# get_filename_component(testName ${test_src} NAME_WE) #Add compile target - add_executable(${testName} ${test_src}) +# add_executable(${testName} ${test_src}) #link to Boost libraries AND your targets and dependencies - target_link_libraries(${testName} cnn ${LIBS}) +# target_link_libraries(${testName} cnn ${LIBS}) - set_target_properties(${testName} PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests.bin) +# set_target_properties(${testName} PROPERTIES +# RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests.bin) #Finally add it to test execution - #Notice the WORKING_DIRECTORY and COMMAND - add_test(NAME ${testName} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests.bin - COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tests.bin/${testName} ) -endforeach(test_src) +# add_test(NAME ${testName} +# WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests.bin +# COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tests.bin/${testName} ) +#endforeach(test_src) # actual target: add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) diff --git a/cnn/backends/eigen/edges.cc b/cnn/backends/eigen/edges.cc index 3ef717b9c..c962beb7f 100644 --- a/cnn/backends/eigen/edges.cc +++ b/cnn/backends/eigen/edges.cc @@ -6,260 +6,291 @@ using namespace std; +// notes on implementing differentiable components +// 1) fx can be understood as a pointer to the (preallocated) location for the result +// of forward to be stored +// 2) fx is not initialized, so after calling forward fx must point to the correct answer +// 3) fx can be repointed to an input, if forward(x) evaluates to x (e.g., in reshaping) +// 4) dEdxi MUST **ACCUMULATE** a result since multiple calls to forward may depend on +// the same x_i. Even, e.g., Identity must be implemented as +// dEdx1 += dEdf. THIS IS EXTREMELY IMPORTANT +// 5) scalars results of forward are placed in fx.v[0] +// 6) CNN manages its own memory, not Eigen, and it is configured with the +// EIGEN_NO_MALLOC option. If you get an error about Eigen attempting to allocate +// memory, it is (probably) because of an implicit creation of a temporary variable. +// To tell Eigen this is not necessary, the noalias() method is available. If you really +// do need a temporary variable, its capacity must be requested by Edge::aux_storage_space + namespace cnn { -Tensor Reshape::forward(const vector& xs) const { - assert(xs.size() == 1); - Tensor fx = *xs.front(); - assert(fx.rows() * fx.cols() == from.size()); - fx.resize(to.size(0), to.size(1)); - return fx; +void Reshape::forward(const vector& xs, Tensor& fx) const { + // just point to the input memory and change dimensions + // dimensions are handled by forward_dim + fx.v = xs[0]->v; } -Tensor Reshape::backward(const vector& xs, +void Reshape::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - Tensor dEdx = dEdf; - int cols = from.size(1); - if (!cols) ++cols; - dEdx.resize(from.size(0), cols); - return dEdx; + unsigned i, + Tensor& dEdxi) const { + const Tensor reshaped(from, dEdf.v); + *dEdxi += *reshaped; } -Tensor SumColumns::forward(const vector& xs) const { - assert(xs.size() == 1); - const Tensor& x = *xs.front(); - return x.rowwise().sum(); +void SumColumns::forward(const vector& xs, Tensor& fx) const { + auto x = **xs[0]; + *fx = x.rowwise().sum(); } -Tensor SumColumns::backward(const vector& xs, +void SumColumns::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - Tensor dEdx = *xs.front(); - const int c = dEdf.cols(); + unsigned i, + Tensor& dEdxi) const { + auto out = *dEdxi; + const int c = out.cols(); for (int j = 0; j < c; ++j) - dEdx.col(j) = dEdf; - return dEdx; + out.col(j) += *dEdf; } -Tensor KMHNGram::forward(const vector& xs) const { +void KMHNGram::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - const Tensor& x = *xs.front(); + auto x = **xs[0]; const int new_cols = x.cols() - n + 1; assert(new_cols > 0); - const int new_rows = x.rows(); - Tensor res = Zero(Dim({new_rows, new_cols})); + auto res = *fx; + res.setZero(); for (int j = 0; j < new_cols; ++j) { auto c_j = res.col(j); for (int k = 0; k < n; ++k) c_j += x.col(j + k); } - return res; } -Tensor KMHNGram::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - Tensor dEdx = *xs.front(); - dEdx.setZero(); - const int c = dEdf.cols(); +void KMHNGram::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + const int c = dEdf.d.cols(); for (int j = 0; j < c; ++j) for (int k = 0; k < n; ++k) - dEdx.col(j+k) += dEdf.col(j); - return dEdx; + (*dEdxi).col(j+k) += (*dEdf).col(j); } -Tensor InnerProduct3D_1D::forward(const vector& xs) const { +void InnerProduct3D_1D::forward(const vector& xs, Tensor& fx) const { assert(!"not implemented"); } -Tensor InnerProduct3D_1D::backward(const vector& xs, +void InnerProduct3D_1D::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { assert(!"not implemented"); } -Tensor GaussianNoise::forward(const vector& xs) const { +void GaussianNoise::forward(const vector& xs, Tensor& fx) const { + cerr << "FIX IMPL GaussianNoise::f\n"; abort(); +#if 0 assert(xs.size() == 1); const Tensor& x = *xs[0]; return x + RandomNormal(Dim(x.rows(), x.cols()), 0, stddev); +#endif } -Tensor GaussianNoise::backward(const vector& xs, +void GaussianNoise::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { + cerr << "FIX IMPL GaussianNoise::b\n"; abort(); +#if 0 assert(i == 0); return dEdf; +#endif }; -Tensor Dropout::forward(const vector& xs) const { +void Dropout::forward(const vector& xs, Tensor& fx) const { + cerr << "FIX IMPL Dropout::f\n"; abort(); +#if 0 assert(xs.size() == 1); const Tensor& x = *xs[0]; noise_mask = RandomBernoulli(Dim(x.rows(), x.cols()), p); return x.cwiseProduct(noise_mask); +#endif } -Tensor Dropout::backward(const vector& xs, +void Dropout::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { + cerr << "FIX IMPL Dropout::b\n"; abort(); +#if 0 assert(i == 0); return dEdf.cwiseProduct(noise_mask); +#endif }; struct FConstantMinus { FConstantMinus(float c) : c(c) {} - inline float operator()(float x) const { + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float x) const { return c - x; } float c; }; -Tensor ConstantMinusX::forward(const vector& xs) const { - assert(xs.size() == 1); - const Tensor& x = *xs[0]; - return x.unaryExpr(FConstantMinus(c)); +void ConstantMinusX::forward(const vector& xs, Tensor& fx) const { + auto x = **xs[0]; + *fx = x.unaryExpr(FConstantMinus(c)); } -Tensor ConstantMinusX::backward(const vector& xs, +void ConstantMinusX::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - return -dEdf; + unsigned i, + Tensor& dEdxi) const { + *dEdxi -= *dEdf; }; -Tensor Sum::forward(const vector& xs) const { - assert(xs.size() > 0); - Tensor res = *xs[0]; - for (unsigned i = 1; i < xs.size(); ++i) - res += *xs[i]; - return res; +void Sum::forward(const vector& xs, Tensor& fx) const { + const unsigned num_args = xs.size(); + if (num_args == 1) { + fx.v = xs[0]->v; + return; + } + auto res = *fx; + const unsigned remainder = num_args % 4; + switch (remainder) { + case 0: res.setZero(); break; + case 1: res = **xs[0]; break; + case 2: res = **xs[0] + **xs[1]; break; + case 3: res = **xs[0] + **xs[1] + **xs[2]; break; + } + for (unsigned i = remainder; i < num_args; i += 4) + res += **xs[i] + **xs[i+1] + **xs[i+2] + **xs[i+3]; } -Tensor Sum::backward(const vector& xs, +void Sum::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - return dEdf; + unsigned i, + Tensor& dEdxi) const { + *dEdxi += *dEdf; }; -Tensor Tanh::forward(const vector& xs) const { - assert(xs.size() == 1); - const Tensor& x = *xs.front(); - return Elewise::TanhForward(x); +struct FTanh { + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float x) const { + return tanhf(x); + } +}; + +void Tanh::forward(const vector& xs, Tensor& fx) const { + auto x = **xs[0]; + *fx = x.unaryExpr(FTanh()); } -Tensor Tanh::backward(const vector& xs, +struct FTanhBackward { + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float t, float d) const { + return (1.f - t * t) * d; + } +}; + +void Tanh::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - assert(i == 0); - const Tensor& x = *xs.front(); - return Elewise::TanhBackward(dEdf, fx, x); + unsigned i, + Tensor& dEdxi) const { + *dEdxi += (*fx).binaryExpr(*dEdf, FTanhBackward()); } -Tensor Square::forward(const vector& xs) const { - assert(xs.size() == 1); // just a single input - const Tensor& x = *xs.front(); - return x.cwiseProduct(x); +void Square::forward(const vector& xs, Tensor& fx) const { + auto x = **xs[0]; + *fx = x.cwiseProduct(x); } -Tensor Square::backward(const vector& xs, +void Square::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - assert(i == 0); - return dEdf.cwiseProduct(*xs.front()) * 2; + unsigned i, + Tensor& dEdxi) const { + auto x = **xs[0]; + *dEdxi += (*dEdf).cwiseProduct(x); }; -Tensor Exp::forward(const vector& xs) const { - assert(xs.size() == 1); - return Elewise::Exp(*xs.front()); +void Exp::forward(const vector& xs, Tensor& fx) const { + auto x = **xs[0]; + *fx = x.array().exp(); } -Tensor Exp::backward(const vector& xs, +void Exp::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - return dEdf.array() * fx.array(); + unsigned i, + Tensor& dEdxi) const { + *dEdxi += (*dEdf).cwiseProduct(*fx); } -Tensor Log::forward(const vector& xs) const { - assert(xs.size() == 1); - return xs.front()->array().log(); +void Log::forward(const vector& xs, Tensor& fx) const { + auto x = **xs[0]; + *fx = x.array().log(); } -Tensor Log::backward(const vector& xs, +void Log::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - return dEdf.array() / xs[0]->array(); + unsigned i, + Tensor& dEdxi) const { + auto x = **xs[0]; + *dEdxi += (*dEdf).cwiseQuotient(x); } -Tensor Concatenate::forward(const vector& xs) const { - assert(xs.size() > 0); +void Concatenate::forward(const vector& xs, Tensor& fx) const { unsigned rows = 0; - for (auto x : xs) rows += x->rows(); + for (auto x : xs) rows += x->d.rows(); + // the following should use auxiliary memory src_row_indices.resize(xs.size()); - Tensor fx(rows, 1); - unsigned i = 0; + unsigned ind = 0; unsigned k = 0; for (auto x : xs) { - src_row_indices[k] = i; - ++k; - const Tensor& cx = *x; - assert(cx.cols() == 1); // this can be relaxed to the same everywhere - const unsigned crows = cx.rows(); - for (unsigned j = 0; j < crows; ++j) { - fx(i, 0) = cx(j, 0); - ++i; - } + src_row_indices[k++] = ind; + auto xi = **x; + assert(xi.cols() == 1); // this can be relaxed to the same everywhere + const unsigned rows = xi.rows(); + (*fx).block(ind, 0, rows, 1) = xi; + ind += rows; } - return fx; } -Tensor Concatenate::backward(const vector& xs, +void Concatenate::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { assert(i < src_row_indices.size()); - Tensor dEdx = *xs[i]; - const unsigned rows = dEdx.rows(); + const unsigned rows = dEdxi.d.rows(); const unsigned begin = src_row_indices[i]; - assert(rows + begin <= dEdf.rows()); - for (unsigned i = 0; i < rows; ++i) - dEdx(i,0) = dEdf(i + begin, 0); - return dEdx; + *dEdxi += (*dEdf).block(begin, 0, rows, 1); } -Tensor ConcatenateColumns::forward(const vector& xs) const { - assert(xs.size() > 0); - const unsigned rows = xs.front()->rows(); - Tensor fx(rows, xs.size()); - unsigned i = 0; - for (auto x : xs) { - assert(x->rows() == rows); - for (unsigned j = 0; j < rows; ++j) - fx(j, i) = (*x)(j, 0); - ++i; - } - return fx; +void ConcatenateColumns::forward(const vector& xs, Tensor& fx) const { + for (unsigned i = 0; i < xs.size(); ++i) + (*fx).col(i) = **xs[i]; } -Tensor ConcatenateColumns::backward(const vector& xs, +void ConcatenateColumns::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - assert(i < fx.cols()); - return dEdf.col(i); + unsigned i, + Tensor& dEdxi) const { + *dEdxi += (*dEdf).col(i); } -Tensor Hinge::forward(const vector& xs) const { +void Hinge::forward(const vector& xs, Tensor& fx) const { + cerr << "FIX IMPL3\n"; abort(); +#if 0 assert(xs.size() == 1); const Tensor& x = *xs.front(); const unsigned rows = x.rows(); @@ -273,12 +304,16 @@ Tensor Hinge::forward(const vector& xs) const { Tensor res(1,1); res(0,0) = y; return res; +#endif } -Tensor Hinge::backward(const vector& xs, +void Hinge::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { + cerr << "FIX IMPL4\n"; abort(); +#if 0 assert(i == 0); const Tensor& x = *xs.front(); const unsigned rows = x.rows(); @@ -290,22 +325,25 @@ Tensor Hinge::backward(const vector& xs, if (*pelement != i && u(i, 0) > 0) { dEdx(i, 0) = diff; tv++; } dEdx(*pelement, 0) = -diff * tv; return dEdx; +#endif } -Tensor Identity::forward(const vector& xs) const { - assert(xs.size() == 1); - return *xs.front(); +void Identity::forward(const vector& xs, Tensor& fx) const { + fx.d = xs[0]->d; + fx.v = xs[0]->v; } -Tensor Identity::backward(const vector& xs, +void Identity::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - assert(i == 0); - return dEdf; + unsigned i, + Tensor& dEdxi) const { + *dEdxi += *dEdf; } -Tensor MaxPooling1D::forward(const vector& xs) const { +void MaxPooling1D::forward(const vector& xs, Tensor& fx) const { + cerr << "FIX IMPL5\n"; abort(); +#if 0 assert(xs.size() == 1); const Tensor& x = *xs.front(); const unsigned x_rows = x.rows(); @@ -329,12 +367,16 @@ Tensor MaxPooling1D::forward(const vector& xs) const { fx(i, 0) = best; } return fx; +#endif } -Tensor MaxPooling1D::backward(const vector& xs, +void MaxPooling1D::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { + cerr << "FIX IMPL6\n"; abort(); +#if 0 const Tensor& x = *xs.front(); const unsigned x_rows = x.rows(); Tensor dEdx = Zero(Dim(x_rows, 1)); @@ -344,55 +386,141 @@ Tensor MaxPooling1D::backward(const vector& xs, for (unsigned i = 0; i < fx_rows; ++i) dEdx(ind[i], 0) = dEdf(i, 0); return dEdx; +#endif } -Tensor Softmax::forward(const vector& xs) const { - assert(xs.size() == 1); - const Tensor& x = *xs.front(); - return Convolution::SoftmaxForward(x, 1); +template +EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float logsumexp(const T& x) { + const float m = x.maxCoeff(); + float z = 0; + for (unsigned i = 0; i < x.rows(); ++i) + z += expf(x(i,0) - m); + return m + logf(z); +} + +struct FSoftmaxNormalize { + explicit FSoftmaxNormalize(float logz) : logz(logz) {} + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float x) const { + return expf(x - logz); + } + float logz; +}; + +void Softmax::forward(const vector& xs, Tensor& fx) const { + if (xs[0]->d.cols() == 1) { + auto x = **xs[0]; + *fx = x.unaryExpr(FSoftmaxNormalize(logsumexp(x))); + } else { + cerr << "SoftmaxForward not implemented for multiple columns\n"; + abort(); + } } -Tensor Softmax::backward(const vector& xs, +struct FSoftmaxBackward { + explicit FSoftmaxBackward(float off_diag_sum) : off_diag_sum(off_diag_sum) {} + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float t, float d) const { + return (off_diag_sum + d) * t; + } + float off_diag_sum; +}; + +void Softmax::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - assert(i == 0); - return Convolution::SoftmaxBackward(dEdf, fx, 1); + unsigned i, + Tensor& dEdxi) const { + float off_diag_sum = -(*fx).cwiseProduct(*dEdf).sum(); + *dEdxi += (*fx).binaryExpr(*dEdf, FSoftmaxBackward(off_diag_sum)); } -Tensor PickNegLogSoftmax::forward(const vector& xs) const { - assert(xs.size() == 1); - const Tensor& x = *xs.front(); - assert(x.cols() == 1); // need to generalize for multiple vectors - v = Convolution::SoftmaxForward(x, 1); - float cll = -log(v(*pval, 0)); - return Constant({1}, cll); +void PickNegLogSoftmax::forward(const vector& xs, Tensor& fx) const { + if (xs[0]->d.cols() == 1) { + auto x = **xs[0]; + logz = logsumexp(x); + fx.v[0] = x(*pval) - logz; + } else { + cerr << "SoftmaxForward not implemented for multiple columns\n"; + abort(); + } } -Tensor PickNegLogSoftmax::backward(const vector& xs, +struct FNegLogSoftmaxBackward { + FNegLogSoftmaxBackward(float lz, float err) : logz(lz), d(err) {} + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float t) const { + return expf(t - logz) * d; + } + float logz; + float d; +}; + +void PickNegLogSoftmax::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - assert(i == 0); - return Convolution::SoftmaxBackwardSingleError(as_scalar(dEdf), *pval, v); + unsigned i, + Tensor& dEdxi) const { + if (xs[0]->d.cols() == 1) { + const auto elem = *pval; + const float err = dEdf.v[0]; + auto x = **xs[0]; + // logz is computed in the forward pass and cached + *dEdxi += x.unaryExpr(FNegLogSoftmaxBackward(logz, err)); + (*dEdxi)(elem) -= err; + } else { + cerr << "PickNegLogSoftmax not implemented for multiple columns\n"; + abort(); + } } -Tensor LogSoftmax::forward(const vector& xs) const { +struct FLogSoftmaxNormalize { + explicit FLogSoftmaxNormalize(float logz) : logz(logz) {} + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float x) const { + return x - logz; + } + float logz; +}; + +void LogSoftmax::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - const Tensor& x = *xs.front(); - return Convolution::SoftmaxForward(x, 1).array().log(); + if (xs[0]->d.cols() == 1) { + auto x = **xs[0]; + *fx = x.unaryExpr(FLogSoftmaxNormalize(logsumexp(x))); + } else { + cerr << "LogSoftmaxForward not implemented for multiple columns\n"; + abort(); + } } -Tensor LogSoftmax::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - assert(i == 0); - Tensor u = fx.array().exp(); - return Convolution::SoftmaxBackward(dEdf.cwiseQuotient(u), u, 1); +struct FWeightedError { + float operator()(float t, float d) const { + return expf(t) * d / expf(t); + } +}; + +struct FLogSoftmaxBackward { + explicit FLogSoftmaxBackward(float off_diag_sum) : off_diag_sum(off_diag_sum) {} + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float t, float d) const { + return off_diag_sum * expf(t) + d; + //return (off_diag_sum + d) * t; + } + float off_diag_sum; +}; + +void LogSoftmax::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + if (xs[0]->d.cols() == 1) { + float off_diag_sum = -(*fx).binaryExpr(*dEdf, FWeightedError()).sum(); + *dEdxi += (*fx).binaryExpr(*dEdf, FLogSoftmaxBackward(off_diag_sum)); + } else { + cerr << "LogSoftmaxBackward not implemented for multiple columns\n"; + abort(); + } } -inline real logsumexp(const Tensor& x, const vector& denom) { +template +EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE real logsumexp(const T& x, const vector& denom) { real m = x(denom[0],0); for (auto i : denom) { real r = x(i,0); @@ -404,219 +532,232 @@ inline real logsumexp(const Tensor& x, const vector& denom) { return m + logf(z); } -Tensor RestrictedLogSoftmax::forward(const vector& xs) const { +void RestrictedLogSoftmax::forward(const vector& xs, Tensor& fx) const { + // TODO create auxiliary mask with -infty's + // and do usual LogSoftmax stuff assert(xs.size() == 1); assert(denom.size() > 0); - const Tensor& x = *xs.front(); - const unsigned rows = x.rows(); + auto x = **xs[0]; assert(x.cols() == 1); const real logz = logsumexp(x, denom); - Tensor fx(rows, 1); - for (unsigned i = 0; i < rows; ++i) - fx(i,0) = -numeric_limits::infinity(); + Constant(fx, -numeric_limits::infinity()); for (auto i : denom) - fx(i,0) = x(i,0) - logz; - if (denom.size() == 1) fx(denom.front(), 0) = 0; - return fx; + (*fx)(i,0) = x(i,0) - logz; + if (denom.size() == 1) (*fx)(denom.front(), 0) = 0; } -Tensor RestrictedLogSoftmax::backward(const vector& xs, +void RestrictedLogSoftmax::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { assert(i == 0); - const Tensor& x = *xs.front(); - const unsigned rows = x.rows(); - Tensor dEdx = Zero(Dim(rows, 1)); - double z = 0; - for (auto i : denom) - z += dEdf(i, 0); - for (auto i : denom) - dEdx(i, 0) = dEdf(i, 0) - exp(fx(i, 0)) * z; - return dEdx; + auto x = **xs[0]; + float z = 0; + for (auto ind : denom) + z += (*dEdf)(ind, 0); + for (auto ind : denom) + (*dEdxi)(ind, 0) += (*dEdf)(ind, 0) - expf((*fx)(ind, 0)) * z; } // x_1 is a vector // y = (x_1)_{*pval} -Tensor PickElement::forward(const vector& xs) const { +void PickElement::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - const Tensor& x = *xs.front(); - assert(x.cols() == 1); - assert(*pval < x.rows()); - Tensor fx(1,1); - fx(0,0) = x(*pval, 0); - return fx; + auto x = **xs[0]; + fx.v[0] = x(*pval); } // derivative is 0 in all dimensions except 1 for the selected element -Tensor PickElement::backward(const vector& xs, +void PickElement::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { assert(i == 0); - assert(dEdf.rows() == 1); - assert(dEdf.cols() == 1); - const Tensor& x = *xs.front(); - - // TODO should be sparse - Tensor dEdx = Zero(Dim(x.rows(), 1)); - dEdx(*pval,0) = dEdf(0,0); - return dEdx; + (*dEdxi)(*pval) += dEdf.v[0]; } // x_1 is a vector // y = (x_1)[start:end] // slice of vector from index start (inclusive) to index end (exclusive) -Tensor PickRange::forward(const vector& xs) const { +void PickRange::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - const Tensor& x = *xs.front(); + auto x = **xs[0]; assert(x.cols() == 1); assert(start >= 0); assert(end <= x.rows()); assert(start < end); - Tensor fx = x.block(start, 0, end-start, 1); - assert(fx.rows() == end-start); - return fx; + assert(fx.d.rows() == end-start); + (*fx) = x.block(start, 0, end-start, 1); } // derivative is 0 in all dimensions except the slice range -Tensor PickRange::backward(const vector& xs, +void PickRange::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { assert(i == 0); - assert(dEdf.rows() == end-start); - assert(dEdf.cols() == 1); - const Tensor& x = *xs.front(); - - // TODO should be sparse - Tensor dEdx = Tensor::Zero(x.rows(), 1); - dEdx.block(start, 0, end-start, 1) = dEdf; - return dEdx; + assert(dEdf.d.rows() == end-start); + assert(dEdf.d.cols() == 1); + (*dEdxi).block(start, 0, end-start, 1) += (*dEdf); } -Tensor MatrixMultiply::forward(const vector& xs) const { +void MatrixMultiply::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); - return (*xs[0]) * (*xs[1]); + auto x1 = **xs[0]; + auto x2 = **xs[1]; + (*fx).noalias() = x1 * x2; } -Tensor MatrixMultiply::backward(const vector& xs, +void MatrixMultiply::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { assert(i < 2); if (i == 0) { - return dEdf * xs[1]->transpose(); + (*dEdxi).noalias() += *dEdf * (**xs[1]).transpose(); } else { - return xs[0]->transpose() * dEdf; + (*dEdxi).noalias() += (**xs[0]).transpose() * *dEdf; } } -Tensor CwiseMultiply::forward(const vector& xs) const { +void CwiseMultiply::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); - return xs[0]->cwiseProduct(*xs[1]); + auto x1 = **xs[0]; + auto x2 = **xs[1]; + *fx = x1.cwiseProduct(x2); } -Tensor CwiseMultiply::backward(const vector& xs, +void CwiseMultiply::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { assert(i < 2); if (i == 0) { - return dEdf.cwiseProduct(*xs[1]); + auto x2 = **xs[1]; + *dEdxi += (*dEdf).cwiseProduct(x2); } else { - return dEdf.cwiseProduct(*xs[0]); + auto x1 = **xs[0]; + *dEdxi += (*dEdf).cwiseProduct(x1); } } -Tensor Multilinear::forward(const vector& xs) const { +void Multilinear::forward(const vector& xs, Tensor& fx) const { assert(xs.size() % 2 == 1); - Tensor fx = *xs.front(); - //cerr << "Multilinear\n"; - //for (unsigned i = 0; i < xs.size(); i++) - // cerr << " (" << xs[i]->rows() << "," << xs[i]->cols() << ")\n"; - for (unsigned i = 1; i < xs.size(); i += 2) { - if (xs[i]->cols() == 1 && xs[i+1]->cols() == 1) - fx += xs[i]->cwiseProduct(*xs[i + 1]); - else - fx += (*xs[i]) * (*xs[i + 1]); + if (xs.size() == 1) { + fx.v = xs[0]->v; + return; + } else { + (*fx) = **xs[0]; + for (unsigned i = 1; i < xs.size(); i += 2) + (*fx).noalias() += (**xs[i]) * (**xs[i + 1]); } - return fx; } -Tensor Multilinear::backward(const vector& xs, +void Multilinear::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { assert(i < xs.size()); - if (i == 0) return dEdf; - if (i % 2 == 1) { // is a matrix - if (xs[i]->cols() == 1) // diagonal matrix - return dEdf.cwiseProduct(*xs[i+1]); - else - return dEdf * xs[i+1]->transpose(); + if (i == 0) { // bias term + *dEdxi += *dEdf; + } else if (i % 2 == 1) { // left argument of matrix multiply + (*dEdxi).noalias() += *dEdf * (**xs[i+1]).transpose(); + } else { // right argument of matrix multiply + (*dEdxi).noalias() += (**xs[i-1]).transpose() * *dEdf; } - // is a vector - if (xs[i-1]->cols() == 1) // xs[i-1] is a diagonal matrix - return xs[i-1]->cwiseProduct(dEdf); - return xs[i-1]->transpose() * dEdf; } -Tensor Negate::forward(const vector& xs) const { +void Negate::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - return -(*xs[0]); + auto x = **xs[0]; + *fx = -x; } -Tensor Negate::backward(const vector& xs, +void Negate::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { assert(i == 0); - return -dEdf; + *dEdxi -= *dEdf; } -Tensor Rectify::forward(const vector& xs) const { +struct FRectify { + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float x) const { + return (x > 0.f) ? x : 0.f; + } +}; + +void Rectify::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - return Elewise::ReluForward(*xs.front()); + auto x = **xs[0]; + *fx = x.unaryExpr(FRectify()); } -Tensor Rectify::backward(const vector& xs, +struct FRectifyBackward { + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float t, float d) const { + return (t) ? d : 0.f; + } +}; + +void Rectify::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - return Elewise::ReluBackward(dEdf, fx, *xs.front()); + unsigned i, + Tensor& dEdxi) const { + *dEdxi += (*fx).binaryExpr(*dEdf, FRectifyBackward()); } -Tensor SquaredEuclideanDistance::forward(const vector& xs) const { +void SquaredEuclideanDistance::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); - Tensor res(1,1); - res(0,0) = (*xs[0] - *xs[1]).squaredNorm(); - return res; + auto x1 = **xs[0]; + auto x2 = **xs[1]; + fx.v[0] = (x1 - x2).squaredNorm(); } -Tensor SquaredEuclideanDistance::backward(const vector& xs, +void SquaredEuclideanDistance::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { assert(i < 2); - real scale = dEdf(0,0) * 2; + auto x1 = **xs[0]; + auto x2 = **xs[1]; + real scale = dEdf.v[0] * 2; if (i == 1) scale = -scale; - return scale * (*xs[0] - *xs[1]); + *dEdxi += scale * (x1 - x2); } -Tensor LogisticSigmoid::forward(const vector& xs) const { +struct FLogisticSigmoid { + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float x) const { + return 1.f / (1.f + expf(-x)); + } +}; + +void LogisticSigmoid::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - const Tensor& x = *xs.front(); - return Elewise::SigmoidForward(x); + auto x = **xs[0]; + *fx = x.unaryExpr(FLogisticSigmoid()); } -Tensor LogisticSigmoid::backward(const vector& xs, +struct FLogisticSigmoidBackward { + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float t, float d) const { + return (1.f - t) * t * d; + } +}; + +void LogisticSigmoid::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - assert(i == 0); - const Tensor& x = *xs.front(); - return Elewise::SigmoidBackward(dEdf, fx, x); + unsigned i, + Tensor& dEdxi) const { + *dEdxi += (*fx).binaryExpr(*dEdf, FLogisticSigmoidBackward()); } // you could do this with LogisticSigmoid, Softmax or a variety of other @@ -624,34 +765,32 @@ Tensor LogisticSigmoid::backward(const vector& xs, // x_1 must be a scalar that is a value between 0 and 1 // target_y is a value between 0 and 1 // y = ty * log(x_1) + (1 - ty) * log(x_1) -Tensor BinaryLogLoss::forward(const vector& xs) const { +void BinaryLogLoss::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - assert(xs.front()->cols() == 1); - assert(xs.front()->rows() == 1); - const real y_pred = (*xs.front())(0,0); + assert(xs.front()->d.size() == 1); + const auto y_pred = xs[0]->v[0]; assert(y_pred >= 0.); assert(y_pred <= 1.); const real ty = *ptarget_y; assert(ty >= 0.); assert(ty <= 1.); - Tensor fx = *xs.front(); - real& res = fx(0,0); + auto& res = fx.v[0]; res = 0; if (ty > 0.) res -= ty * log(y_pred); if ((1 - ty) > 0.) res -= (1 - ty) * log1p(-y_pred); - return fx; } -Tensor BinaryLogLoss::backward(const vector& xs, +void BinaryLogLoss::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { - const real y_pred = (*xs.front())(0,0); + unsigned i, + Tensor& dEdxi) const { + const auto y_pred = xs[0]->v[0]; const real ty = *ptarget_y; real scale = 0; if (ty > 0.) scale -= ty / y_pred; if ((1 - ty) >= 0.) scale += (1 - ty) / (1 - y_pred); - return dEdf * scale; + *dEdxi += *dEdf * scale; } } // namespace cnn diff --git a/cnn/backends/eigen/eigen-backend.cc b/cnn/backends/eigen/eigen-backend.cc deleted file mode 100644 index c43c3fedb..000000000 --- a/cnn/backends/eigen/eigen-backend.cc +++ /dev/null @@ -1,145 +0,0 @@ -#include "cnn/backends/eigen/eigen-backend.h" - -#include -#include -#include - -using namespace std; - -namespace cnn { - -std::mt19937* rndeng = nullptr; -void Initialize(int& argc, char**& argv) { - std::random_device rd; - rndeng = new mt19937(rd()); -} - -Eigen::MatrixXf Elewise::Ln(const Eigen::MatrixXf& x) { - return x.array().log(); -} - -Eigen::MatrixXf Elewise::Exp(const Eigen::MatrixXf& x) { - return x.array().exp(); -} - -struct FSigmoid { - inline float operator()(float x) const { - return 1.f / (1.f + expf(-x)); - } -}; - -Eigen::MatrixXf Elewise::SigmoidForward(const Eigen::MatrixXf& x) { - return x.unaryExpr(FSigmoid()); -} - -struct FSigmoidBackward { - inline float operator()(float t, float d) const { - return (1.f - t) * t * d; - } -}; - -Eigen::MatrixXf Elewise::SigmoidBackward(const Eigen::MatrixXf& diff, const Eigen::MatrixXf& top, const Eigen::MatrixXf& bottom) { - return top.binaryExpr(diff, FSigmoidBackward()); -} - -struct FRectify { - inline float operator()(float x) const { - return (x > 0.f) ? x : 0.f; - } -}; - -Eigen::MatrixXf Elewise::ReluForward(const Eigen::MatrixXf& x) { - return x.unaryExpr(FRectify()); -} - -struct FRectifyBackward { - inline float operator()(float t, float d) const { - return (t) ? d : 0.f; - } -}; - -Eigen::MatrixXf Elewise::ReluBackward(const Eigen::MatrixXf& diff, const Eigen::MatrixXf& top, const Eigen::MatrixXf& bottom) { - return top.binaryExpr(diff, FRectifyBackward()); -} - -struct FTanh { - inline float operator()(float x) const { - return tanhf(x); - } -}; - -Eigen::MatrixXf Elewise::TanhForward(const Eigen::MatrixXf& x) { - return x.unaryExpr(FTanh()); -} - -struct FTanhBackward { - inline float operator()(float t, float d) const { - return (1.f - t * t) * d; - } -}; - -Eigen::MatrixXf Elewise::TanhBackward(const Eigen::MatrixXf& diff, const Eigen::MatrixXf& top, const Eigen::MatrixXf& bottom) { - return top.binaryExpr(diff, FTanhBackward()); -} - -inline float logsumexp(const Eigen::MatrixXf& x) { - const float m = x.maxCoeff(); - float z = 0; - for (unsigned i = 0; i < x.rows(); ++i) - z += expf(x(i,0) - m); - return m + logf(z); -} - -struct FSoftmaxNormalize { - explicit FSoftmaxNormalize(float logz) : logz(logz) {} - inline float operator()(float x) const { - return expf(x - logz); - } - float logz; -}; - -Eigen::MatrixXf Convolution::SoftmaxForward(const Eigen::MatrixXf& src, SoftmaxAlgorithm algorithm) { - if (src.cols() == 1) { - return src.unaryExpr(FSoftmaxNormalize(logsumexp(src))); - } else { - cerr << "SoftmaxForward not implemented for multiple columns: " << src.rows() << "x" << src.cols() << endl; - abort(); - } -} - -struct FSoftmaxBackward { - explicit FSoftmaxBackward(float off_diag_sum) : off_diag_sum(off_diag_sum) {} - inline float operator()(float t, float d) const { - return (off_diag_sum + d) * t; - } - float off_diag_sum; -}; - -Eigen::MatrixXf Convolution::SoftmaxBackward(const Eigen::MatrixXf& diff, const Eigen::MatrixXf& top, SoftmaxAlgorithm algorithm) { - // d softmax(x)_i / d x_j = softmax(x)_i * (1 - softmax(x)_i) if i == j - // d softmax(x)_i / d x_j = -softmax(x)_i * softmax(x)_j if i != j - if (top.cols() == 1) { - float off_diag_sum = -top.cwiseProduct(diff).sum(); - return top.binaryExpr(diff, FSoftmaxBackward(off_diag_sum)); - } else { - cerr << "SoftmaxBackward not implemented for multiple columns\n"; - abort(); - } -} - -Eigen::MatrixXf Convolution::SoftmaxBackwardSingleError(float diff, int elem, const Eigen::MatrixXf& top) { - // d softmax(x)_i / d x_j = softmax(x)_i * (1 - softmax(x)_i) if i == j - // d softmax(x)_i / d x_j = -softmax(x)_i * softmax(x)_j if i != j - if (top.cols() == 1) { - const float r = diff / top(elem, 0); - Eigen::MatrixXf b = top * diff; - b(elem, 0) = (diff - r) * top(elem, 0); - return b; - } else { - cerr << "SoftmaxBackwardSingleError not implemented for multiple columns\n"; - abort(); - } -} - -} // namespace cnn - diff --git a/cnn/backends/eigen/eigen-backend.h b/cnn/backends/eigen/eigen-backend.h deleted file mode 100644 index c0bb225d0..000000000 --- a/cnn/backends/eigen/eigen-backend.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef CNN_EIGEN_BACKEND_H_ -#define CNN_EIGEN_BACKEND_H_ - -#include "Eigen/Eigen" - -namespace cnn { - -void Initialize(int& argc, char**& argv); - -// This is a class that makes some of the Minerva library calls available -// even with the Eigen backend (it will just be used in porting, and until -// Minerva supports everything it should on the CPU, I hope). -// -// Note about names in the Backward functions: -// Minerva's bottom = CNN's x (the input to the function) -// Minvera's top = CNN's fx (the output of the function) -// Minerva's diff = CNN's dEdf (the derivative of the loss with respect to fx) - -class Elewise { - public: - static Eigen::MatrixXf Ln(const Eigen::MatrixXf&); - static Eigen::MatrixXf Exp(const Eigen::MatrixXf&); - static Eigen::MatrixXf SigmoidForward(const Eigen::MatrixXf&); - static Eigen::MatrixXf SigmoidBackward(const Eigen::MatrixXf& diff, const Eigen::MatrixXf& top, const Eigen::MatrixXf& bottom); - static Eigen::MatrixXf ReluForward(const Eigen::MatrixXf&); - static Eigen::MatrixXf ReluBackward(const Eigen::MatrixXf& diff, const Eigen::MatrixXf& top, const Eigen::MatrixXf& bottom); - static Eigen::MatrixXf TanhForward(const Eigen::MatrixXf&); - static Eigen::MatrixXf TanhBackward(const Eigen::MatrixXf& diff, const Eigen::MatrixXf& top, const Eigen::MatrixXf& bottom); -}; - -typedef unsigned SoftmaxAlgorithm; - -class Convolution { - public: - static Eigen::MatrixXf SoftmaxForward(const Eigen::MatrixXf& src, SoftmaxAlgorithm algorithm); - static Eigen::MatrixXf SoftmaxBackward(const Eigen::MatrixXf& diff, const Eigen::MatrixXf& top, SoftmaxAlgorithm algorithm); - static Eigen::MatrixXf SoftmaxBackwardSingleError(float diff, int elem, const Eigen::MatrixXf& top); -}; - -} // namespace cnn - -#endif diff --git a/cnn/backends/eigen/eigen-serialization.h b/cnn/backends/eigen/eigen-serialization.h deleted file mode 100644 index 41809f6d3..000000000 --- a/cnn/backends/eigen/eigen-serialization.h +++ /dev/null @@ -1,69 +0,0 @@ -#ifndef CNN_EIGEN_SERIALIZE_H_ -#define CNN_EIGEN_SERIALIZE_H_ - -#include -#include -#include - -namespace boost{ - namespace serialization{ - - template< class Archive, - class S, - int Rows_, - int Cols_, - int Ops_, - int MaxRows_, - int MaxCols_> - inline void save( - Archive & ar, - const Eigen::Matrix & g, - const unsigned int version) - { - int rows = g.rows(); - int cols = g.cols(); - - ar & rows; - ar & cols; - ar & boost::serialization::make_array(g.data(), rows * cols); - } - - template< class Archive, - class S, - int Rows_, - int Cols_, - int Ops_, - int MaxRows_, - int MaxCols_> - inline void load( - Archive & ar, - Eigen::Matrix & g, - const unsigned int version) - { - int rows, cols; - ar & rows; - ar & cols; - g.resize(rows, cols); - ar & boost::serialization::make_array(g.data(), rows * cols); - } - - template< class Archive, - class S, - int Rows_, - int Cols_, - int Ops_, - int MaxRows_, - int MaxCols_> - inline void serialize( - Archive & ar, - Eigen::Matrix & g, - const unsigned int version) - { - split_free(ar, g, version); - } - - - } // namespace serialization -} // namespace boost - -#endif diff --git a/cnn/backends/eigen/init.cc b/cnn/backends/eigen/init.cc new file mode 100644 index 000000000..4df7bdc01 --- /dev/null +++ b/cnn/backends/eigen/init.cc @@ -0,0 +1,19 @@ +#include "cnn/backends/eigen/init.h" + +#include +#include +#include + +using namespace std; + +namespace cnn { + +std::mt19937* rndeng = nullptr; +void Initialize(int& argc, char**& argv) { + std::random_device rd; + rndeng = new mt19937(rd()); +// rndeng = new mt19937(1); +} + +} // namespace cnn + diff --git a/cnn/backends/eigen/init.h b/cnn/backends/eigen/init.h new file mode 100644 index 000000000..74b82f984 --- /dev/null +++ b/cnn/backends/eigen/init.h @@ -0,0 +1,10 @@ +#ifndef CNN_EIGEN_INIT_H +#define CNN_EIGEN_INIT_H + +namespace cnn { + +void Initialize(int& argc, char**& argv); + +} // namespace cnn + +#endif diff --git a/cnn/backends/eigen/model.cc b/cnn/backends/eigen/model.cc index d44551fbe..a678bdfb0 100644 --- a/cnn/backends/eigen/model.cc +++ b/cnn/backends/eigen/model.cc @@ -1,26 +1,57 @@ #include "cnn/model.h" #include "cnn/tensor.h" +#include "cnn/aligned-mem-pool.h" +#include #include +#define CNN_ALIGN 32 + using namespace std; namespace cnn { ParametersBase::~ParametersBase() {} +Parameters::Parameters(const Dim& d) : dim(d) { + values.d = g.d = d; + values.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); + Randomize(values); + g.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); + Zero(g); +} + size_t Parameters::size() const { return dim.size(); } -void Parameters::rescale_gradient(real scale) { g *= scale; } +void Parameters::rescale_gradient(real scale) { *g *= scale; } real Parameters::g_squared_l2norm() const { - return g.squaredNorm(); + return (*g).squaredNorm(); } -void Parameters::accumulate_grad(const Tensor& d) { g += d; } +void Parameters::accumulate_grad(const Tensor& d) { *g += *d; } void Parameters::clear() { - g.setZero(); + (*g).setZero(); +} + +LookupParameters::LookupParameters(unsigned n, const Dim& d) : dim(d), values(n), grads(n) { + for (unsigned i = 0; i < n; ++i) { + auto& v = values[i]; + v.d = d; + v.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); + Randomize(v); + + auto& g = grads[i]; + g.d = d; + g.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); + Zero(g); + } +} + +void LookupParameters::Initialize(unsigned index, const vector& val) { + assert(val.size() == dim.size()); + memcpy(values[index].v, &val[0], val.size() * sizeof(float)); } size_t LookupParameters::size() const { @@ -29,26 +60,26 @@ size_t LookupParameters::size() const { real LookupParameters::g_squared_l2norm() const { real a = 0; - for (auto& it : this->g) - a += it.second.squaredNorm(); + for (auto i : non_zero_grads) + a += (*grads[i]).squaredNorm(); return a; } void LookupParameters::accumulate_grad(unsigned index, const Tensor& d) { - auto it = this->g.find(index); - if (it == this->g.end()) { - g[index] = d; - } else { - it->second += d; - } + non_zero_grads.insert(index); + *grads[index] += *d; } void LookupParameters::rescale_gradient(real scale) { - for (auto& it : this->g) - it.second *= scale; + for (auto i : non_zero_grads) + *grads[i] *= scale; } -void LookupParameters::clear() { g.clear(); } +void LookupParameters::clear() { + for (auto i : non_zero_grads) + (*grads[i]).setZero(); + non_zero_grads.clear(); +} Model::~Model() { for (auto p : all_params) delete p; diff --git a/cnn/saxe-init.cc b/cnn/backends/eigen/saxe-init.cc similarity index 79% rename from cnn/saxe-init.cc rename to cnn/backends/eigen/saxe-init.cc index 62dfbb0c9..737ddba8d 100644 --- a/cnn/saxe-init.cc +++ b/cnn/backends/eigen/saxe-init.cc @@ -1,4 +1,5 @@ -#include "saxe-init.h" +#include "cnn/saxe-init.h" +#include "cnn/tensor.h" #include #include @@ -16,10 +17,10 @@ inline Eigen::MatrixXf EigenRandomNormal(int dim, real mean, real stddev) { return r; } -Tensor OrthonormalRandom(int dim, real g) { +void OrthonormalRandom(int dim, real g, Tensor& x) { Eigen::MatrixXf m = EigenRandomNormal(dim, 0.0, 0.01); Eigen::JacobiSVD svd(m, Eigen::ComputeFullU); - return FromEigenMatrix(svd.matrixU()); + *x = svd.matrixU(); } } diff --git a/cnn/backends/eigen/tensor-eigen.h b/cnn/backends/eigen/tensor-eigen.h deleted file mode 100644 index 325d873ad..000000000 --- a/cnn/backends/eigen/tensor-eigen.h +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef CNN_TENSOR_EIGEN_H_ -#define CNN_TENSOR_EIGEN_H_ - -#include -#include -#include - -#include -#include "cnn/backends/eigen/eigen-serialization.h" -#include "cnn/backends/eigen/random.h" - -namespace cnn { - -#define EIGEN_BACKEND 1 - -typedef Eigen::MatrixXf Tensor; -typedef float real; - -inline real as_scalar(const Tensor& t) { - assert(t.cols() == 1); - assert(t.rows() == 1); - return t(0,0); -} - -inline std::vector as_vector(const Tensor& v) { - std::vector res(v.rows() * v.cols()); - std::memcpy(&res[0], v.data(), sizeof(real) * res.size()); - return res; -} - -// dummy function with Eigen backend -inline Tensor FromEigenMatrix(const Eigen::MatrixXf& src) { return src; } - -inline Tensor FromRawData(const Dim& dim, const float* data) { - Tensor t(dim.size(0), dim.ndims() > 1 ? dim.size(1) : 1); - std::memcpy(t.data(), data, sizeof(float) * dim.size()); - return t; -} - -inline Tensor Zero(const Dim& d) { return Eigen::MatrixXf::Zero(d.rows(), d.cols()); } -inline Tensor Ones(const Dim& d) { return Eigen::MatrixXf::Ones(d.rows(), d.cols()); } -inline Tensor Constant(const Dim& d, real c) { return Eigen::MatrixXf::Constant(d.rows(), d.cols(), c); } -inline Tensor Random(const Dim& d, real scale) { - std::uniform_real_distribution distribution(-scale,scale); - auto b = [&] (real) {return distribution(*rndeng);}; - return Eigen::MatrixXf::NullaryExpr(d.rows(), d.cols(), b); -} -inline Tensor Random(const Dim& d) { - return Random(d, sqrt(6) / sqrt(d.cols() + d.rows())); -} -inline Tensor RandomBernoulli(const Dim& d, real p) { - std::bernoulli_distribution distribution(p); - auto b = [&] (real) {return distribution(*rndeng);}; - return Eigen::MatrixXf::NullaryExpr(d.rows(), d.cols(), b); -} -inline Tensor RandomNormal(const Dim& d, real mean, real stddev) { - std::normal_distribution distribution(mean, stddev); - auto b = [&] (real) {return distribution(*rndeng);}; - return Eigen::MatrixXf::NullaryExpr(d.rows(), d.cols(), b); -} -inline real rand01() { - std::uniform_real_distribution distribution(0, 1); - return distribution(*rndeng); -} - -// column major constructor -inline Tensor Ccm(const Dim&d, const std::initializer_list& v) { - Tensor m = Zero(d); - int cc = 0; - int cr = 0; - for (const auto& x : v) { - m(cr, cc) = x; - ++cr; - if (cr == d.rows()) { cr = 0; ++cc; } - } - return m; -} - -inline std::string str(const Tensor& T) { - std::ostringstream os; - os << T << std::endl; - return os.str(); -} - -} // namespace cnn - -#include "cnn/backends/eigen/eigen-backend.h" - -#endif diff --git a/cnn/backends/eigen/tensor.h b/cnn/backends/eigen/tensor.h new file mode 100644 index 000000000..5fd47ac40 --- /dev/null +++ b/cnn/backends/eigen/tensor.h @@ -0,0 +1,91 @@ +#ifndef CNN_EIGEN_TENSOR_H +#define CNN_EIGEN_TENSOR_H + +#include +#include +#include + +#include "cnn/backends/eigen/random.h" +#include + +// CNN manages its own memory. DO NOT remove the following line +#define EIGEN_NO_MALLOC +#include + +namespace cnn { + +#define EIGEN_BACKEND 1 + +typedef float real; + +struct Tensor { + Tensor() = default; + Tensor(const Dim& d, float* v) : d(d), v(v) {} + const Eigen::Map operator*() const { + return Eigen::Map(v, d.rows(), d.cols()); + } + Eigen::Map operator*() { + return Eigen::Map(v, d.rows(), d.cols()); + } + Dim d; + float* v; + + private: + friend class boost::serialization::access; + template + void save(Archive& ar, const unsigned int) const { + ar & d; + ar & boost::serialization::make_array(v, d.size()); + } + template + void load(Archive& ar, const unsigned int) { + ar & d; + v = static_cast(std::malloc(d.size() * sizeof(float))); + ar & boost::serialization::make_array(v, d.size()); + } + BOOST_SERIALIZATION_SPLIT_MEMBER() +}; + +inline real as_scalar(const Tensor& t) { + assert(t.d.size() == 1); + return t.v[0]; +} + +inline std::vector as_vector(const Tensor& v) { + std::vector res(v.d.size()); + std::memcpy(&res[0], v.v, sizeof(real) * res.size()); + return res; +} + +inline void Constant(Tensor& d, float c) { + std::memset(d.v, c, d.d.size() * sizeof(float)); +} +inline void Zero(Tensor& d) { + Constant(d, 0); +} +inline void Randomize(Tensor& val, real scale) { + std::uniform_real_distribution distribution(-scale,scale); + auto b = [&] (real) {return distribution(*rndeng);}; + *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); +} +inline void Randomize(Tensor& d) { + Randomize(d, sqrt(6) / sqrt(d.d[0] + d.d[1])); +} +inline void RandomBernoulli(Tensor& val, real p) { + std::bernoulli_distribution distribution(p); + auto b = [&] (real) {return distribution(*rndeng);}; + *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); +} +inline void RandomizeNormal(real mean, real stddev, Tensor& val) { + std::normal_distribution distribution(mean, stddev); + auto b = [&] (real) {return distribution(*rndeng);}; + *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); +} +inline real rand01() { + std::uniform_real_distribution distribution(0, 1); + return distribution(*rndeng); +} + +} // namespace cnn + +#endif diff --git a/cnn/backends/minerva/tensor-minerva.h b/cnn/backends/minerva/tensor-minerva.h deleted file mode 100644 index 8538485ac..000000000 --- a/cnn/backends/minerva/tensor-minerva.h +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef CNN_TENSOR_MINERVA_H_ -#define CNN_TENSOR_MINERVA_H_ - -#include -#include -#include -#include - -#include -#include "minerva.h" - -using namespace minerva; - -namespace cnn { - -#define MINERVA_BACKEND 1 - -typedef minerva::NArray Tensor; -typedef float real; -typedef minerva::Scale Dim; - -inline Tensor Constant(const Dim& d, real c) { return minerva::NArray::Constant(d, c); } -inline Tensor Zero(const Dim& d) { return minerva::NArray::Zeros(d); } -inline Tensor Random(const Dim& d) { return minerva::NArray::Zeros(d); } -inline Dim size(const Tensor& m) { return m.Size(); } - -// avoid using this, because it's slow -inline Tensor FromEigenMatrix(const Eigen::MatrixXf& src) { - const Dim size = {src.rows(), src.cols()}; - std::shared_ptr data(new float[size.Prod()], [](float* ptr) { - delete[] ptr; - }); - auto p = src.data(); - auto d = data.get(); - std::memcpy(d, p, size.Prod() * sizeof(float)); - return NArray::MakeNArray(size, data); -} - -// in column-major order, consecutive elements of the columns are contiguous. -// in Minerva, matrices are stored in column-major (i.e., FORTRAN) order -inline Tensor Ccm(const Dim&d, const std::initializer_list& v) { - std::vector vv = v; - std::shared_ptr input_ptr(new float[d.Prod()], [](float* ptr) { delete[] ptr; }); - std::memcpy(input_ptr.get(), &vv[0], d.Prod() * sizeof(float)); - return minerva::NArray::MakeNArray(d, input_ptr); -} - -} // namespace cnn - -#endif diff --git a/cnn/backends/thpp/backend.cc b/cnn/backends/thpp/backend.cc deleted file mode 100644 index 61c46a907..000000000 --- a/cnn/backends/thpp/backend.cc +++ /dev/null @@ -1,22 +0,0 @@ -#include "cnn/backends/thpp/tensor.h" - -#include -#include - -using namespace std; - -namespace cnn { - -std::mt19937* rndeng = nullptr; - -void Initialize(int& argc, char**& argv) { - cerr << "COMMAND:"; - for (int i = 0; i < argc; ++i) - cerr << ' ' << argv[i]; - cerr << endl; - std::random_device rd; - rndeng = new mt19937(rd()); -} - -} - diff --git a/cnn/backends/thpp/dim.cc b/cnn/backends/thpp/dim.cc deleted file mode 100644 index 79debed34..000000000 --- a/cnn/backends/thpp/dim.cc +++ /dev/null @@ -1,13 +0,0 @@ -#include "cnn/backends/thpp/tensor.h" - -#include - -using namespace std; - -ostream& operator<<(ostream& os, const Dim& d) { - os << '{'; - for (unsigned i = 0; i < d.v.size(); ++i) - os << (i ? ", " : "") << d.v[i]; - return os << '}'; -} - diff --git a/cnn/backends/thpp/dim.h b/cnn/backends/thpp/dim.h deleted file mode 100644 index 3a996a3f7..000000000 --- a/cnn/backends/thpp/dim.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef _CNN_THPP_DIM_H_ -#define _CNN_THPP_DIM_H_ - -#include -#include -#include "thpp/Range.h" - -struct Dim { - Dim() : v() {} - Dim(Dim&& o) = default; - Dim(const Dim& o) = default; - Dim(std::initializer_list x) : v(x) {} - Dim(const thpp::LongRange& r) : v(r.begin(), r.end()) {} - long size() const { - long p = 1; - for (auto x : v) p *= x; - return p; - } - long size(size_t i) const { - return (*this)[i]; - } - long& operator[](long i) { return v[i]; } - long operator[](long i) const { return v[i]; } - long ndims() const { return v.size(); } - long rows() const { return v[0]; }; - long cols() const { return v[1]; }; - operator const std::vector& () const { - return v; - } - std::vector v; -}; - -inline bool operator==(const Dim& a, const Dim& b) { return a.v == b.v; } -inline bool operator!=(const Dim& a, const Dim& b) { return a.v != b.v; } - -std::ostream& operator<<(std::ostream& os, const Dim& d); - -#endif diff --git a/cnn/backends/thpp/edges.cc b/cnn/backends/thpp/edges.cc deleted file mode 100644 index 937206dd5..000000000 --- a/cnn/backends/thpp/edges.cc +++ /dev/null @@ -1,404 +0,0 @@ -#include "cnn/edges.h" - -#include -#include -#include - -using namespace std; - -namespace cnn { - -Tensor InnerProduct3D_1D::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - assert(i < 3); - if (i == 2) return dEdf; - const int ii = dEdf.size(0); - const int jj = dEdf.size(1); - const int kk = xs[1]->size(0); - Tensor dEdx; - if (i == 0) { -// (dE/dA)_ijk = (dE/dY)_ij * L_k - dEdx.resize({ii, jj, kk}); - const real* x1 = xs[1]->data(); - for (int i = 0; i < ii; ++i) { - for (int j = 0; j < jj; ++j) { - const real d = dEdf.at({i,j}); - for (int k = 0; k < kk; ++k) - dEdx.at({i,j,k}) = d * x1[k]; - } - } - return dEdx; - } -// (dE/dB)_k = (dE/dY)_ij * A_ijk - dEdx.resize({kk}); - dEdx.zero(); - const Tensor& x0 = *xs[0]; - for (int i = 0; i < ii; ++i) { - for (int j = 0; j < jj; ++j) { - const real d = dEdf.at({i,j}); - for (int k = 0; k < kk; ++k) - dEdx.at({k}) += d * x0.at({i,j,k}); - } - } - return dEdx; -} - -Tensor CwiseMultiply::forward(const vector& xs) const { - assert(xs.size() == 2); - Tensor fx; - fx.cmul(*xs[0], *xs[1]); - return fx; -} - -Tensor CwiseMultiply::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - assert(i < 2); - Tensor dEdx; - if (i == 0) { - dEdx.cmul(dEdf, *xs[1]); - } else { - dEdx.cmul(dEdf, *xs[0]); - } - return dEdx; -} - -Tensor Negate::forward(const vector& xs) const { - assert(xs.size() == 1); - return -(*xs[0]); -} - -Tensor Negate::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - assert(i == 0); - return -dEdf; -} - -Tensor LogSoftmax::forward(const vector& xs) const { - assert(xs.size() == 1); - const Tensor& x = *xs.front(); - Tensor fx; - fx.softmax(x); - fx.log(); - return fx; -} - -Tensor LogSoftmax::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - assert(i == 0); - - Tensor u; - u.exp(fx); - Tensor dEdu; - dEdu.cdiv(dEdf, u); - Tensor dEdx; - dEdx.softmax_backward(dEdu, u); - return dEdx; -} - -Tensor Softmax::forward(const vector& xs) const { - assert(xs.size() == 1); - const Tensor& x = *xs.front(); - Tensor fx; - fx.softmax(x); - return fx; -} - -Tensor Softmax::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - assert(i == 0); - Tensor dEdx; - dEdx.softmax_backward(dEdf, fx); - return dEdx; -} - -Tensor OneMinusX::forward(const vector& xs) const { - assert(xs.size() == 1); - const Tensor& x = *xs[0]; - Tensor fx; - fx.one_minus(x); - return fx; -} - -Tensor OneMinusX::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - return -dEdf; -}; - -Tensor Concatenate::forward(const vector& xs) const { - assert(xs.size() > 0); - assert(xs.front()->ndims() == 1); - Tensor prev = *xs[0]; - src_row_indices.resize(xs.size()); - src_row_indices[0] = 0; - for (unsigned i = 1; i < xs.size(); ++i) { - src_row_indices[i] = prev.size(0); - Tensor t; - t.cat(prev, *xs[i], 0); - prev = t; - } - return prev; -} - -Tensor Concatenate::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - Tensor dEdx; - unsigned rows = xs[i]->size(0); - dEdx.narrow(dEdf,0,src_row_indices[i], rows); - return dEdx; -} - -Tensor ConcatenateColumns::forward(const vector& xs) const { - assert(xs.size() > 0); - assert(xs.front()->ndims() == 1); - - Tensor prev = *xs[0]; - for (unsigned i = 1; i < xs.size(); ++i) { - Tensor t; - t.cat(prev, *xs[i], 1); - prev = t; - } - return prev; -} - -Tensor ConcatenateColumns::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - Tensor dEdx; - dEdx.narrow(dEdf,1,i,1); - return dEdx; -} - -Tensor SquaredEuclideanDistance::forward(const vector& xs) const { - assert(xs.size() == 2); - Tensor res({1}); - Tensor diff = *xs[0] - *xs[1]; - diff.cmul(diff); - res.at(0) = diff.sumall(); - return res; -} - -Tensor SquaredEuclideanDistance::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - assert(i < 2); - real scale = dEdf.at(0) * 2; - if (i == 1) scale = -scale; - Tensor dEdx = *xs[0] - *xs[1]; - dEdx *= scale; - return dEdx; -} - -Tensor Sum::forward(const vector& xs) const { - assert(xs.size() > 0); - Tensor fx = *xs[0]; - fx.force(Tensor::UNIQUE); - for (unsigned i = 1; i < xs.size(); ++i) - fx += *xs[i]; - return fx; -} - -Tensor Sum::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - return dEdf; -}; - -Tensor Multilinear::forward(const vector& xs) const { - assert(xs.size() % 2 == 1); - Tensor fx = *xs[0]; - fx.force(Tensor::UNIQUE); - for (unsigned i = 1; i < xs.size(); i += 2) - fx.addmv(1, 1, *xs[i], *xs[i+1]); - return fx; -} - -Tensor Multilinear::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - assert(i < xs.size()); - if (i == 0) return dEdf; - Tensor dEdx; - dEdx.resizeAs(*xs[i]); - dEdx.zero(); - // (TODO currently only vector supported, should probably support matrix with addmm) - if (i % 2 == 1) { // dif wrt matrix - dEdx.addr(0, 1, dEdf, *xs[i+1]); - } else { - // dif wrt to right arg of multiplication - Tensor xt = *xs[i-1]; - xt.transpose(); - dEdx.addmv(0, 1, xt, dEdf); - } - return dEdx; -} - -Tensor MatrixMultiply::forward(const vector& xs) const { - assert(xs.size() == 2); - Tensor fx; - if (xs[1]->ndims() == 1) { - fx.resize({xs[0]->size(0)}); - fx.zero(); - fx.addmv(0, 1, *xs[0], *xs[1]); - } else { - fx.resize({xs[0]->size(0), xs[1]->size(1)}); - fx.zero(); - fx.addmm(0, 1, *xs[0], *xs[1]); - } - return fx; -} - -Tensor MatrixMultiply::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - assert(i < 2); - Tensor dEdx; - dEdx.resizeAs(*xs[i]); - dEdx.zero(); - if (i == 0) { // diff wrt a matrix - Tensor xt = *xs[1]; - if (xt.ndims() == 1) { // coeff is vector - dEdx.addr(0, 1, dEdf, xt); - } else { // coeff is matrix - xt.transpose(); - dEdx.addmm(0, 1, dEdf, xt); - } - } else { // diff wrt to second argument - Tensor xt = *xs[0]; // x[0] is a matrix, transpose it - xt.transpose(); - if (dEdf.ndims() > 1) { // matrix - dEdx.addmm(0, 1, xt, dEdf); - } else { // vector - dEdx.addmv(0, 1, xt, dEdf); - } - } - return dEdx; -} - -Tensor Tanh::forward(const vector& xs) const { - assert(xs.size() == 1); - const Tensor& x = *xs.front(); - Tensor fx; - fx.tanh(x); - return fx; -} - -Tensor Tanh::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - assert(i == 0); - Tensor dEdx; - dEdx.tanh_backward(dEdf, fx); - return dEdx; -#if 0 - assert(i == 0); - Tensor o; o.resizeAs(fx); - o.fill(1); - Tensor y = fx; - y.force(Tensor::UNIQUE); - y.cmul(y); - Tensor dEdx; - dEdx.cmul(dEdf, o - y); - return dEdx; -#endif -} - -Tensor LogisticSigmoid::forward(const vector& xs) const { - assert(xs.size() == 1); - const Tensor& x = *xs.front(); - Tensor fx; - fx.logistic_sigmoid(x); - return fx; -} - -Tensor LogisticSigmoid::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - assert(i == 0); - Tensor dEdx; - dEdx.logistic_sigmoid_backward(dEdf, fx); - return dEdx; -} - -// x_1 is a vector -// y = (x_1)_{*pval} -Tensor PickElement::forward(const vector& xs) const { - assert(xs.size() == 1); - const Tensor& x = *xs.front(); - assert(x.ndims() == 1); - Tensor fx; - fx.narrow(x, 0, *pval, 1); - return fx; -} - -// derivative is 0 in all dimensions except 1 for the selected element -Tensor PickElement::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - assert(i == 0); - assert(dEdf.isScalar()); - const Tensor& x = *xs.front(); - - // TODO should be sparse - Tensor dEdx = Zero(Dim({x.size(0)})); - dEdx.at({*pval}) = dEdf.front(); - return dEdx; -} - -// you could do this with LogisticSigmoid, Softmax or a variety of other -// functions, but this is often useful. -// x_1 must be a scalar that is a value between 0 and 1 -// target_y is a value between 0 and 1 -// y = ty * log(x_1) + (1 - ty) * log(x_1) -Tensor BinaryLogLoss::forward(const vector& xs) const { - assert(xs.size() == 1); - assert(xs.front()->isScalar()); - const real y_pred = (*xs.front()).front(); - assert(y_pred >= real(0)); - assert(y_pred <= real(1)); - const real ty = *ptarget_y; - assert(ty >= real(0)); - assert(ty <= real(1)); - real res = 0; - if (ty > 0.) res -= ty * log(y_pred); - if ((1 - ty) > 0.) res -= (1 - ty) * log1p(-y_pred); - Tensor fx; - fx.resizeAs(*xs.front()); - fx.fill(res); - return fx; -} - -Tensor BinaryLogLoss::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { - const real y_pred = xs.front()->front(); - const real ty = *ptarget_y; - real scale = 0; - if (ty > 0.) scale -= ty / y_pred; - if ((1 - ty) >= 0.) scale += (1 - ty) / (1 - y_pred); - return dEdf * scale; -} - -} // namespace cnn diff --git a/cnn/backends/thpp/model.cc b/cnn/backends/thpp/model.cc deleted file mode 100644 index 21261f272..000000000 --- a/cnn/backends/thpp/model.cc +++ /dev/null @@ -1,74 +0,0 @@ -#include "cnn/model.h" -#include "cnn/tensor.h" - -#include - -using namespace std; - -namespace cnn { - -ParametersBase::~ParametersBase() {} - -size_t Parameters::size() const { return num_params(values); } - -void Parameters::rescale_gradient(real scale) { g *= scale; } - -real Parameters::g_squared_l2norm() const { - float n = g.normall(2); - return n * n; -} - -void Parameters::accumulate_grad(const Tensor& d) { g += d; } - -void Parameters::clear() { - g.zero(); -} - -size_t LookupParameters::size() const { - return values.size() * num_params(values[0]); -} - -real LookupParameters::g_squared_l2norm() const { - real a = 0; - for (auto& it : this->g) { - real n = it.second.normall(2); - a += n*n; - } - return a; -} - -void LookupParameters::accumulate_grad(unsigned index, const Tensor& d) { - auto it = this->g.find(index); - if (it == this->g.end()) { - g[index] = d; - } else { - it->second += d; - } -} - -void LookupParameters::rescale_gradient(real scale) { - for (auto& it : this->g) - it.second *= scale; -} - -void LookupParameters::clear() { g.clear(); } - -Model::~Model() { - for (auto p : all_params) delete p; -} - -Parameters* Model::add_parameters(const Dim& d) { - Parameters* p = new Parameters(d); - all_params.push_back(p); - params.push_back(p); - return p; -} - -LookupParameters* Model::add_lookup_parameters(unsigned n, const Dim& d) { - LookupParameters* p = new LookupParameters(n,d); - all_params.push_back(p); - lookup_params.push_back(p); - return p; -} - -} // namespace cnn diff --git a/cnn/backends/thpp/random.h b/cnn/backends/thpp/random.h deleted file mode 100644 index 3f37ad2d6..000000000 --- a/cnn/backends/thpp/random.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef CNN_EIGEN_RANDOM_H -#define CNN_EIGEN_RANDOM_H - -#include - -namespace cnn { - -extern std::mt19937* rndeng; - -} // namespace cnn - -#endif diff --git a/cnn/backends/thpp/tensor.h b/cnn/backends/thpp/tensor.h deleted file mode 100644 index c4f81d055..000000000 --- a/cnn/backends/thpp/tensor.h +++ /dev/null @@ -1,162 +0,0 @@ -#ifndef CNN_THPP_TENSOR_H_ -#define CNN_THPP_TENSOR_H_ - -#include - -#include -#include "thpp/Tensor.h" -#include "cnn/backends/thpp/random.h" -#include "cnn/backends/thpp/dim.h" - -#define THPP_BACKEND 1 - -namespace cnn { - -void Initialize(int& argc, char**& argv); - -typedef thpp::Tensor Tensor; -typedef float real; - -inline real as_scalar(const Tensor& t) { - assert(t.isScalar()); - return t.front(); -} - -inline std::vector as_vector(const Tensor& t) { - std::vector res(t.size()); - std::memcpy(&res[0], t.data(), sizeof(real) * t.size()); - return res; -} - -inline Tensor Constant(const Dim& d, real c) { - Tensor t(d); - t.fill(c); - return t; -} -inline Tensor Zero(const Dim& d) { - Tensor z(d); - z.zero(); - return z; -} - -inline Dim size(const Tensor& m) { return m.sizes(); } - -inline size_t num_params(const Tensor& m) { return m.size(); } - -inline real rand01() { - std::uniform_real_distribution distribution(0, 1); - return distribution(*rndeng); -} - -// avoid using this, because it's slow -inline Tensor FromEigenMatrix(const Eigen::MatrixXf& src) { - if (src.cols() == 1) { - Tensor t({src.rows()}); - auto p = t.storage(); - int i = 0; - for (int r = 0; r < src.rows(); ++r) - p[i++] = src(r, 0); - return t; - } else { - Tensor t({src.rows(), src.cols()}); - auto p = t.storage(); - int i = 0; - for (int r = 0; r < src.rows(); ++r) - for (int c = 0; c < src.cols(); ++c) - p[i++] = src(r,c); - return t; - } -} - -inline Tensor FromRawData(const Dim& dim, const float* data) { - Tensor t(dim); - std::memcpy(t.data(), data, sizeof(float) * dim.size()); - return t; -} - -inline Tensor Random(const Dim& d, real scale) { - // TODO replace with TH-appropriate thing - std::uniform_real_distribution distribution(-scale,scale); - auto b = [&] (real) {return distribution(*rndeng);}; - int cols = 1; - if (d.ndims() > 1) cols = d.size(1); - if (d.ndims() > 2) { assert(!"not implemented"); } - return FromEigenMatrix(Eigen::MatrixXf::NullaryExpr(d.size(0), cols, b)); -} - -inline Tensor Random(const Dim& d) { - return Random(d, sqrt(6) / sqrt(d.size())); -} - -inline Tensor RandomBernoulli(const Dim& d, real p) { - // TODO replace with TH-appropriate thing - std::bernoulli_distribution distribution(p); - auto b = [&] (real) {return distribution(*rndeng);}; - int cols = 1; - if (d.ndims() > 1) cols = d.size(1); - if (d.ndims() > 2) { assert(!"not implemented"); } - return FromEigenMatrix(Eigen::MatrixXf::NullaryExpr(d.size(0), cols, b)); -} - -inline Tensor RandomNormal(const Dim& d, real mean, real stddev) { - // TODO replace with TH-appropriate thing - std::normal_distribution distribution(mean, stddev); - auto b = [&] (real) {return distribution(*rndeng);}; - int cols = 1; - if (d.ndims() > 1) cols = d.size(1); - if (d.ndims() > 2) { assert(!"not implemented"); } - return FromEigenMatrix(Eigen::MatrixXf::NullaryExpr(d.size(0), cols, b)); -} - -inline Tensor Crm(std::initializer_list dim, const std::initializer_list& v) { - Tensor t(dim); - auto p = t.storage(); - int i = 0; - for (const auto& x : v) { - p[i++] = x; - } - return t; -} - -// in column-major order, consecutive elements of the columns are contiguous. -// in TH, matrices are stored in row-major (i.e., C) order -inline Tensor Ccm(std::initializer_list dim, const std::initializer_list& v) { - if (dim.size() == 1) return Crm(dim, v); - assert(dim.size() == 2); - Tensor t(dim); - t.zero(); - int cc = 0; - int cr = 0; - for (const auto& x : v) { - t.at({cr, cc}) = x; - ++cr; - if (cr == t.size(0)) { cr = 0; ++cc; } - } - return t; -} - -inline std::string str(const Tensor& T) { - std::ostringstream os; - if (T.ndims() == 2) { - int m = T.size(0); - int n = T.size(1); - for (int i = 0; i < m; ++i) { - for (int j = 0; j < n; ++j) { - os << '\t' << T.at({i,j}); - } - os << std::endl; - } - } else if (T.ndims() == 1) { - os << T << std::endl; - for (int i = 0; i < T.size(); ++i) { os << '\t' << T.at(i) << std::endl; } - } else { - os << T; - for (int i = 0; i < T.size(); ++i) { os << ' ' << T.at(i); } - os << std::endl; - } - return os.str(); -} - -} // namespace cnn - -#endif diff --git a/cnn/cnn.cc b/cnn/cnn.cc index d7e7a2fe1..f9adcd5ac 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -1,19 +1,34 @@ #include "cnn/cnn.h" #include "cnn/edges.h" #include "cnn/param-edges.h" +#include "cnn/aligned-mem-pool.h" using namespace std; namespace cnn { +AlignedMemoryPool<5> fxs(100000000); +AlignedMemoryPool<5> dEdfs(100000000); + +int n_hgs = 0; + Edge::~Edge() {} bool Edge::has_parameters() const { return false; } +Hypergraph::Hypergraph() : last_node_evaluated() { + ++n_hgs; + if (n_hgs > 1) { + // TODO handle memory better + cerr << "Memory allocator assumes only a single hypergraph at a time.\n"; + abort(); + } +} + Hypergraph::~Hypergraph() { for (auto n : nodes) delete n; for (auto e : edges) delete e; - // don't delete parameter_edges since they're a subset of edges + --n_hgs; } VariableIndex Hypergraph::add_input(real s) { @@ -94,6 +109,16 @@ VariableIndex Hypergraph::add_const_lookup(LookupParameters* p, unsigned index) } const Tensor& Hypergraph::incremental_forward() { + // free any old memory if this is a new HG + if (last_node_evaluated == 0) { + fxs.free(); + dEdfs.zero_and_free(); + } + + assert(nodes.size() > 0); + if (nodes.size() - last_node_evaluated == 0) { + return nodes.back()->f; + } vector xds; for (unsigned i = last_node_evaluated; i < nodes.size(); ++i) { Node* node = nodes[i]; @@ -105,8 +130,15 @@ const Tensor& Hypergraph::incremental_forward() { ++ti; } node->dim = in_edge.dim_forward(xds); + node->f.d = node->dim; + node->f.v = static_cast(fxs.allocate(node->dim.size() * sizeof(float))); + node->dEdf.d = node->dim; + node->dEdf.v = static_cast(dEdfs.allocate(node->dim.size() * sizeof(float))); + assert(node->f.v); + assert(node->dEdf.v); } + //vector dummy(5, "x"); vector xs; while (last_node_evaluated < nodes.size()) { Node* node = nodes[last_node_evaluated]; @@ -117,9 +149,7 @@ const Tensor& Hypergraph::incremental_forward() { xs[ti] = &nodes[tail_node_index]->f; ++ti; } - node->f = in_edge.forward(xs); - //node->dEdf = Zero(Dim(node->f.rows(), node->f.cols())); - node->dEdf = Zero(node->dim); + in_edge.forward(xs, node->f); ++last_node_evaluated; } return nodes.back()->f; @@ -143,7 +173,7 @@ void Hypergraph::backward() { } // initialize dE/dE = 1 - nodes.back()->dEdf = cnn::Constant({1}, 1); + nodes.back()->dEdf.v[0] = 1; // loop in reverse topological order vector xs; @@ -159,10 +189,14 @@ void Hypergraph::backward() { for (unsigned ti = 0; ti < in_edge.tail.size(); ++ti) { if (needs_derivative[in_edge.tail[ti]]) { Node& tail_node = *nodes[in_edge.tail[ti]]; - tail_node.dEdf += in_edge.backward(xs, node.f, node.dEdf, ti); + in_edge.backward(xs, node.f, node.dEdf, ti, tail_node.dEdf); } } } + //vector dummy(5, "x"); + //int cc = 0; // REMOVE + //for (auto n : nodes) { cerr << "NODE " << edges[n->in_edge]->as_string(dummy) << endl << (*n->dEdf) << endl; } + //abort(); // accumulate gradients into parameters // this is simpler than you might find in some other frameworks diff --git a/cnn/cnn.h b/cnn/cnn.h index f432705ab..cd2a07fd6 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -37,7 +37,7 @@ inline void swap(VariableIndex& i1, VariableIndex& i2) { } struct Hypergraph { - Hypergraph() : last_node_evaluated() {} + Hypergraph(); ~Hypergraph(); // INPUTS @@ -76,8 +76,9 @@ struct Hypergraph { void PrintGraphviz() const; // data - std::vector nodes; // **stored in topological order** - std::vector edges; // all edges + std::vector nodes; // **stored in topological order** + std::vector edges; // all edges + std::vector memory_pool; // free this std::vector parameter_edges; // edges that contain parameters that can be updated (subset of edges) VariableIndex last_node_evaluated; // enables forward graphs to be evaluated incrementally }; @@ -98,14 +99,14 @@ struct Node { unsigned in_edge; std::vector out_edges; + // memory + Dim dim; // will be .size() = 0 initially, before memory is allocated + // debugging std::string variable_name() const { return "v" + std::to_string(node_id); } VariableIndex node_id; // my id - // computation - Dim dim; - // TODO remove these from here, they should be local to the forward/backward - // algorithms which lets them manage memory for the full computation graph + // computation results (nb. memory is not owned by Tensor) Tensor f; // f(x_1 , ... , x_n) Tensor dEdf; // dE/df }; @@ -127,17 +128,26 @@ struct Edge { // debugging virtual std::string as_string(const std::vector& var_names) const = 0; - // compute dimensions of results given dimensions of inputs + // compute dimensions of result for given dimensions of inputs // also checks to make sure inputs are compatible with each other virtual Dim dim_forward(const std::vector& xs) const = 0; + // in general, this will return an empty size, but if a component needs to store + // extra information in the forward pass for use in the backward pass, it can + // request the memory here (nb. you could put it on the Edge object, but in general, + // edges should not allocate tensor memory since memory is managed centrally for the + // entire computation graph). TODO + // virtual Dim aux_storage_space() const; + // computation - virtual Tensor forward(const std::vector& xs) const = 0; + virtual void forward(const std::vector& xs, + Tensor& fx) const = 0; // computes the derivative of E with respect to the ith argument to f, that is, xs[i] - virtual Tensor backward(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const = 0; + virtual void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const = 0; virtual bool has_parameters() const; // number of arguments to the function diff --git a/cnn/edges.h b/cnn/edges.h index 8e0ce84e1..a273fbd3e 100644 --- a/cnn/edges.h +++ b/cnn/edges.h @@ -12,11 +12,12 @@ struct Reshape : public Edge { } std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; Dim from; Dim to; }; @@ -25,11 +26,12 @@ struct Reshape : public Edge { struct SumColumns : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // y_i = \sum_{j=1}^n x_1:{i-1+j} @@ -37,11 +39,12 @@ struct KMHNGram : public Edge { explicit KMHNGram(unsigned n) : n(n) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; unsigned n; // width, n=2 for Karl's paper }; @@ -55,11 +58,12 @@ struct KMHNGram : public Edge { struct InnerProduct3D_1D : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // n_{i,j} ~ N(0,stddev) @@ -68,11 +72,12 @@ struct GaussianNoise : public Edge { explicit GaussianNoise(real stddev) : stddev(stddev) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; real stddev; }; @@ -81,12 +86,13 @@ struct Dropout : public Edge { explicit Dropout(real p) : p(p) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; - mutable Tensor noise_mask; + unsigned i, + Tensor& dEdxi) const override; + //mutable Tensor noise_mask; real p; }; @@ -96,11 +102,12 @@ struct ConstantMinusX : public Edge { explicit ConstantMinusX(real o) : c(o) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; real c; }; @@ -108,55 +115,60 @@ struct ConstantMinusX : public Edge { struct Tanh : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // y = x_1 \odot x_1 struct Square : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // y = exp x_1 struct Exp : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // y = log x_1 (base e, i.e., natural log) struct Log : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // concatenate rows struct Concatenate : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; // src_row_indices[i] says what row in fx the ith x vector was assigned to // used to simplify backprop mutable std::vector src_row_indices; @@ -167,11 +179,12 @@ struct Concatenate : public Edge { struct ConcatenateColumns : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // Let x be a vector-valued input, x_i represents the score of the ith element, then @@ -181,26 +194,28 @@ struct Hinge : public Edge { explicit Hinge(unsigned* pe, real m = 1.0) : element(), pelement(pe), margin(m) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; unsigned element; const unsigned* pelement; real margin; - mutable Tensor u; // partial forward values + // mutable Tensor u; // partial forward values }; // y = x_1 struct Identity : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // hyperparameter: width > 1 @@ -211,11 +226,12 @@ struct MaxPooling1D : public Edge { MaxPooling1D(unsigned w) : width(w) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; unsigned width; mutable std::vector ind; }; @@ -224,22 +240,24 @@ struct MaxPooling1D : public Edge { struct MatrixMultiply : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // y = x_1 \cdot x_2 (Hadamard product) struct CwiseMultiply : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // y = x_1 \sum_{i=2, 4 ...} A_i * x_{i+1} @@ -248,33 +266,36 @@ struct CwiseMultiply : public Edge { struct Multilinear : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // y = -x_1 struct Negate : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // y = max(0,x) struct Rectify : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // you could do this with LogisticSigmoid, Softmax or a variety of other @@ -287,11 +308,12 @@ struct BinaryLogLoss : public Edge { BinaryLogLoss(real* pty) : target_y(), ptarget_y(pty) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; real target_y; real* ptarget_y; }; @@ -300,33 +322,36 @@ struct BinaryLogLoss : public Edge { struct Sum : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // y = || x_1 - x_2 ||^2 struct SquaredEuclideanDistance : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // y = \sigma(x_1) struct LogisticSigmoid : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // z = \sum_j \exp (x_i)_j @@ -334,11 +359,12 @@ struct LogisticSigmoid : public Edge { struct Softmax : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // z = \sum_j \exp (x_i)_j @@ -346,11 +372,12 @@ struct Softmax : public Edge { struct LogSoftmax : public Edge { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; }; // z = \sum_j \exp (x_i)_j @@ -361,14 +388,15 @@ struct PickNegLogSoftmax : public Edge { explicit PickNegLogSoftmax(const unsigned* pv) : val(), pval(pv) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; + mutable float logz; unsigned val; const unsigned* pval; - mutable Tensor v; }; // z = \sum_{j \in denom} \exp (x_i)_j @@ -377,11 +405,12 @@ struct RestrictedLogSoftmax : public Edge { explicit RestrictedLogSoftmax(const std::vector& d) : denom(d) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; std::vector denom; }; @@ -394,11 +423,12 @@ struct PickElement : public Edge { explicit PickElement(const unsigned* pv) : val(), pval(pv) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; unsigned val; const unsigned* pval; }; @@ -410,11 +440,12 @@ struct PickRange : public Edge { explicit PickRange(unsigned start, unsigned end) : start(start), end(end) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; unsigned start; unsigned end; }; diff --git a/cnn/model.h b/cnn/model.h index 30bc79c11..9f2fc903b 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -2,7 +2,7 @@ #define CNN_PARAMS_H_ #include -#include +#include #include #include @@ -40,7 +40,7 @@ struct Parameters : public ParametersBase { Tensor g; private: Parameters() {} - explicit Parameters(const Dim& d) : dim(d), values(Random(d)), g(Zero(d)) {} + explicit Parameters(const Dim& d); friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { ar & dim; @@ -54,21 +54,19 @@ struct LookupParameters : public ParametersBase { void rescale_gradient(real scale) override; real g_squared_l2norm() const override; size_t size() const override; - - Tensor& operator[](unsigned i) { return values[i]; } - const Tensor& operator[](unsigned i) const { return values[i]; } + void Initialize(unsigned index, const std::vector& val); void accumulate_grad(unsigned index, const Tensor& g); void clear(); Dim dim; std::vector values; - std::unordered_map g; + std::vector grads; + // gradients are sparse, so track which components are nonzero + std::unordered_set non_zero_grads; private: LookupParameters() {} - LookupParameters(unsigned n, const Dim& d) : dim(d), values(n) { - for (auto& v : values) v = Random(d); - } + LookupParameters(unsigned n, const Dim& d); friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { ar & dim; diff --git a/cnn/param-edges.cc b/cnn/param-edges.cc index 37dedb126..a90cc036f 100644 --- a/cnn/param-edges.cc +++ b/cnn/param-edges.cc @@ -16,18 +16,20 @@ string ParameterEdge::as_string(const vector& arg_names) const { } Dim ParameterEdge::dim_forward(const vector& xs) const { + assert(xs.size() == 0); return dim; } -Tensor ParameterEdge::forward(const vector& xs) const { +void ParameterEdge::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - return params->values; + fx.v = params->values.v; } -Tensor ParameterEdge::backward(const vector& xs, +void ParameterEdge::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { cerr << "called backward() on arity 0 edge\n"; abort(); } @@ -46,16 +48,17 @@ Dim InputEdge::dim_forward(const vector& xs) const { return dim; } -Tensor InputEdge::forward(const vector& xs) const { +void InputEdge::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); assert((int)dim.size() == (int)pdata->size()); - return FromRawData(dim, &pdata->front()); + memcpy(fx.v, &pdata->front(), dim.size() * sizeof(float)); } -Tensor InputEdge::backward(const vector& xs, +void InputEdge::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { cerr << "called backward() on arity 0 edge\n"; abort(); } @@ -70,15 +73,16 @@ Dim ScalarInputEdge::dim_forward(const vector& xs) const { return Dim({1}); } -Tensor ScalarInputEdge::forward(const vector& xs) const { +void ScalarInputEdge::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - return FromRawData(Dim({1}), pdata); + fx.v[0] = *pdata; } -Tensor ScalarInputEdge::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i) const { +void ScalarInputEdge::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { cerr << "called backward() on arity 0 edge\n"; abort(); } @@ -93,15 +97,16 @@ Dim LookupEdge::dim_forward(const vector& xs) const { return dim; } -Tensor LookupEdge::forward(const vector& xs) const { +void LookupEdge::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - return params->values[*pindex]; + *fx = *params->values[*pindex]; } -Tensor LookupEdge::backward(const vector& xs, +void LookupEdge::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const { + unsigned i, + Tensor& dEdxi) const { cerr << "called backward() on arity 0 edge\n"; abort(); } diff --git a/cnn/param-edges.h b/cnn/param-edges.h index c808800de..a76e7193a 100644 --- a/cnn/param-edges.h +++ b/cnn/param-edges.h @@ -16,11 +16,12 @@ struct ParameterEdge : public ParameterEdgeBase { bool has_parameters() const override; std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; void accumulate_grad(const Tensor& g) override; Dim dim; Parameters* params; @@ -31,11 +32,12 @@ struct InputEdge : public Edge { explicit InputEdge(const Dim& d, const std::vector* pd) : dim(d), pdata(pd) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; Dim dim; const std::vector* pdata; }; @@ -46,11 +48,12 @@ struct ScalarInputEdge : public Edge { explicit ScalarInputEdge(const real* ps) : data(), pdata(ps) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; const cnn::real data; const cnn::real* pdata; }; @@ -62,11 +65,12 @@ struct LookupEdge : public ParameterEdgeBase { bool has_parameters() const override; std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - Tensor forward(const std::vector& xs) const override; - Tensor backward(const std::vector& xs, + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i) const override; + unsigned i, + Tensor& dEdxi) const override; void accumulate_grad(const Tensor& g) override; Dim dim; unsigned index; diff --git a/cnn/saxe-init.h b/cnn/saxe-init.h index 9cccebd27..a71a18763 100644 --- a/cnn/saxe-init.h +++ b/cnn/saxe-init.h @@ -1,12 +1,11 @@ -#ifndef SAXE_INIT_H_ -#define SAXE_INIT_H_ - -#include "cnn/tensor.h" +#ifndef CNN_SAXE_INIT_H_ +#define CNN_SAXE_INIT_H_ namespace cnn { -// returns a dim x dim matrix -Tensor OrthonormalRandom(int dim, real g); +struct Tensor; + +void OrthonormalRandom(int dim, float g, Tensor& x); } diff --git a/cnn/tensor.h b/cnn/tensor.h index 880460908..86a02e301 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -4,16 +4,11 @@ #include "config.h" #include "cnn/dim.h" -#ifdef WITH_MINERVA_BACKEND -# include "backends/minerva/tensor-minerva.h" -#endif - -#ifdef WITH_THPP_BACKEND -# include "backends/thpp/tensor.h" -#endif - #ifdef WITH_EIGEN_BACKEND -# include "backends/eigen/tensor-eigen.h" +# include "backends/eigen/init.h" +# include "backends/eigen/tensor.h" +#else +# error "Don't know any backend but Eigen" #endif #endif diff --git a/cnn/training.cc b/cnn/training.cc index cbebc91ad..b542d78f2 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -23,22 +23,21 @@ void Trainer::clip_gradients() { void SimpleSGDTrainer::update(real scale) { clip_gradients(); for (auto p : model->parameters_list()) { - const Tensor reg = p->values * lambda; - p->values -= (eta * scale) * p->g; - p->values -= reg; + auto reg = (*p->values) * lambda; + *p->values -= ((eta * scale) * *p->g + reg); p->clear(); } for (auto p : model->lookup_parameters_list()) { - for (auto& it : p->g) { - const Tensor reg = p->values[it.first] * lambda; - p->values[it.first] -= it.second * (eta * scale); - p->values[it.first] -= reg; + for (auto i : p->non_zero_grads) { + auto reg = (*p->values[i]) * lambda; + *p->values[i] -= (*p->grads[i] * (eta * scale) + reg); } p->clear(); } ++updates; } +#if 0 static inline Tensor& get_or_init(Tensor& x, const Tensor& t) { #if WITH_THPP_BACKEND if (x.ndims() == 0) { @@ -81,6 +80,7 @@ void MomentumSGDTrainer::update(real scale) { } ++updates; } +#endif #if 0 void RMSPropTrainer::update(real scale) { diff --git a/cnn/training.h b/cnn/training.h index f8242ebbf..156e4755e 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -56,8 +56,8 @@ struct MomentumSGDTrainer : public Trainer { real momentum; - std::unordered_map vp; - std::unordered_map> vl; + //std::unordered_map vp; + //std::unordered_map> vl; }; } // namespace cnn diff --git a/examples/encdec.cc b/examples/encdec.cc index f60f5e5e3..9de658b94 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -10,6 +10,9 @@ #include #include +#include +#include + using namespace std; using namespace cnn; diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index a832b30f1..65701c637 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -10,6 +10,9 @@ #include #include +#include +#include + using namespace std; using namespace cnn; @@ -52,18 +55,25 @@ struct RNNLanguageModel { // ydist = softmax(r_t) // LogSoftmax followed by PickElement can be written in one step // using PickNegLogSoftmax -#if 0 +#if 1 VariableIndex i_ydist = hg.add_function({i_r_t}); errs.push_back(hg.add_function({i_ydist}, sent[t+1])); +#if 0 + VariableIndex i_ydist = hg.add_function({i_r_t}); + i_ydist = hg.add_function({i_ydist}); + errs.push_back(hg.add_function({i_ydist}, sent[t+1])); #endif +#else VariableIndex i_err = hg.add_function({i_r_t}, sent[t+1]); errs.push_back(i_err); +#endif } VariableIndex i_nerr = hg.add_function(errs); -#if 0 +#if 1 return hg.add_function({i_nerr}); -#endif +#else return i_nerr; +#endif } // return VariableIndex of total loss @@ -164,9 +174,9 @@ int main(int argc, char** argv) { Model model; bool use_momentum = false; Trainer* sgd = nullptr; - if (use_momentum) - sgd = new MomentumSGDTrainer(&model); - else + //if (use_momentum) + // sgd = new MomentumSGDTrainer(&model); + //else sgd = new SimpleSGDTrainer(&model); RNNLanguageModel lm(model); diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index f1d87c40e..d2ce26796 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -16,8 +16,8 @@ int main(int argc, char** argv) { // parameters const unsigned HIDDEN_SIZE = 8; Model m; - //SimpleSGDTrainer sgd(&m); - MomentumSGDTrainer sgd(&m); + SimpleSGDTrainer sgd(&m); + //MomentumSGDTrainer sgd(&m); Parameters& p_a = *m.add_parameters({1}); Parameters& p_b = *m.add_parameters({HIDDEN_SIZE}); @@ -79,7 +79,7 @@ int main(int argc, char** argv) { loss /= 4; cerr << "E = " << loss << endl; } - //boost::archive::text_oarchive oa(cout); - //oa << m; + boost::archive::text_oarchive oa(cout); + oa << m; } diff --git a/examples/xor.cc b/examples/xor.cc index e79e27773..c2d029aaa 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -3,6 +3,7 @@ #include "cnn/training.h" #include +#include #include #include @@ -21,7 +22,8 @@ int main(int argc, char** argv) { //MomentumSGDTrainer sgd(&m); Parameters& p_a = *m.add_parameters({1}); - Parameters& p_b = *m.add_parameters({HIDDEN_SIZE}); + Parameters& p_b1 = *m.add_parameters({HIDDEN_SIZE/2}); + Parameters& p_b2 = *m.add_parameters({HIDDEN_SIZE/2}); Parameters& p_W = *m.add_parameters({HIDDEN_SIZE, 2}); Parameters& p_V = *m.add_parameters({1, HIDDEN_SIZE}); @@ -29,7 +31,9 @@ int main(int argc, char** argv) { Hypergraph hg; // get symbolic variables corresponding to parameters - VariableIndex i_b = hg.add_parameter(&p_b); + VariableIndex i_b1 = hg.add_parameter(&p_b1); + VariableIndex i_b2 = hg.add_parameter(&p_b2); + VariableIndex i_b = hg.add_function({i_b1, i_b2}); VariableIndex i_a = hg.add_parameter(&p_a); VariableIndex i_W = hg.add_parameter(&p_W); VariableIndex i_V = hg.add_parameter(&p_V); @@ -41,7 +45,7 @@ int main(int argc, char** argv) { // two options: MatrixMultiply and Sum, or Multilinear // these are identical, but Multilinear may be slightly more efficient -#if 0 +#if 1 VariableIndex i_f = hg.add_function({i_W, i_x}); VariableIndex i_g = hg.add_function({i_f, i_b}); #else From 85160334f8ddc395835694037fd13c4fe740935a Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 5 May 2015 22:14:30 -0400 Subject: [PATCH 026/965] clean up --- cnn/backends/eigen/edges.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cnn/backends/eigen/edges.cc b/cnn/backends/eigen/edges.cc index c962beb7f..775c5b83f 100644 --- a/cnn/backends/eigen/edges.cc +++ b/cnn/backends/eigen/edges.cc @@ -217,7 +217,7 @@ void Square::backward(const vector& xs, unsigned i, Tensor& dEdxi) const { auto x = **xs[0]; - *dEdxi += (*dEdf).cwiseProduct(x); + *dEdxi += (*dEdf).cwiseProduct(x) * 2; }; void Exp::forward(const vector& xs, Tensor& fx) const { @@ -552,7 +552,6 @@ void RestrictedLogSoftmax::backward(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i == 0); - auto x = **xs[0]; float z = 0; for (auto ind : denom) z += (*dEdf)(ind, 0); From 3b1a5b91f5e69d640da37fa00ae0c42a3fca782d Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 5 May 2015 23:17:35 -0400 Subject: [PATCH 027/965] memory allocator --- cnn/aligned-mem-pool.h | 80 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 cnn/aligned-mem-pool.h diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h new file mode 100644 index 000000000..a8c4c86fc --- /dev/null +++ b/cnn/aligned-mem-pool.h @@ -0,0 +1,80 @@ +#ifndef CNN_ALIGNED_MEM_POOL_H +#define CNN_ALIGNED_MEM_POOL_H + +#include +#include +//#if HAVE_MM_MALLOC +#include +//#endif + +namespace cnn { + +inline void* cnn_mm_malloc(size_t n, size_t align) { +//#if HAVE_MM_MALLOC + return _mm_malloc(n, align); +//#else +// return std::malloc(n, align); +//#endif +} + +inline void cnn_mm_free(void* mem) { +//#if HAVE_MM_MALLOC + _mm_free(mem); +//#else +// return std::free(n, align); +//#endif +} + +// this is used to manage CPU memory for function values and gradients +template +class AlignedMemoryPool { + public: + explicit AlignedMemoryPool(size_t cap) { + sys_alloc(cap); + zero(); + } + // returns nullptr if OOM + void* allocate(size_t n) { + auto rounded_n = round_up_align(n); + if (rounded_n + used > capacity) + return nullptr; + void* res = static_cast(mem) + used; + used += rounded_n; + return res; + } + void free() { + //std::cerr << "freeing " << used << " bytes\n"; + used = 0; + } + void zero_and_free() { zero(); free(); } + void free_and_grow_capacity(size_t new_cap = 0) { + cnn_mm_free(mem); + if (new_cap) + sys_alloc(new_cap); + else + sys_alloc(capacity * 1.5); + zero(); + } + private: + void sys_alloc(size_t cap) { + capacity = round_up_align(cap); + mem = cnn_mm_malloc(capacity, 1 << AlignedBits); + used = 0; + } + void zero() { + //std::cerr << "zeroing " << (used ? used : capacity) << " bytes\n"; + std::memset(mem, 0, used ? used : capacity); + } + inline static size_t round_up_align(size_t n) { + if (AlignedBits < 2) return n; + auto c = (n & ((1 << AlignedBits) - 1)) > 0 ? 1 : 0; + return ((n >> AlignedBits) + c) << AlignedBits; + } + size_t capacity; + size_t used; + void* mem; +}; + +} // namespace cnn + +#endif From 4e98ae4418b5d183352ae75e6057b64ad18cedd8 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 5 May 2015 23:43:56 -0400 Subject: [PATCH 028/965] documentation fix --- .gitignore | 3 +++ README.md | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index f2860f53e..72f35b05d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ # cmake stuff +build/ Testing/ cnn/Testing/ cnn/tests.bin/ @@ -10,6 +11,8 @@ CMakeFiles cmake_install.cmake # binaries +examples/embed-cl +examples/encdec examples/xor examples/xor-xent examples/rnnlm diff --git a/README.md b/README.md index be308d2b9..bdfed7f8a 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,31 @@ # cnn C++ neural network library +#### Getting started + +You need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function properly. If you use the current stable release, you will get an error like the following: + + Assertion failed: (false && "heap allocation is forbidden (EIGEN_NO_MALLOC is defined)"), function check_that_malloc_is_allowed, file /Users/cdyer/software/eigen-eigen-10219c95fe65/Eigen/src/Core/util/Memory.h, line 188. + #### Building In `src`, you need to first use [`cmake`](http://www.cmake.org/) to generate the makefiles - cmake . -DEIGEN3_INCLUDE_DIR=/Users/cdyer/software/eigen-eigen-36fd1ba04c12 + mkdir build + cd build + cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen Then to compile, run make -j 2 - make test + +To see that things have built properly, you can run + + ./examples/xor + +which will train a multilayer perceptron to predict the xor function. + +#### Debugging If you want to see the compile commands that are used, you can run From c6ba3e280f329d0ee559cabe8a9484caeb22ad5c Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 9 May 2015 00:45:56 -0400 Subject: [PATCH 029/965] cuda prelimiary --- CMakeLists.txt | 4 +- cnn/CMakeLists.txt | 2 + cnn/aligned-mem-pool.h | 33 +++++++++- cnn/backends/eigen/edges.cc | 2 +- cnn/backends/eigen/init.cc | 41 ++++++++++++ cnn/backends/eigen/model.cc | 10 +-- cnn/backends/eigen/tensor.cc | 65 +++++++++++++++++++ cnn/backends/eigen/tensor.h | 57 +++++------------ cnn/cnn.cc | 11 ++-- cnn/cnn.h | 5 +- cnn/dim.h | 5 +- cnn/gru.cc | 120 +++++++++++++++++++++++++++++++++++ cnn/gru.h | 70 ++++++++++++++++++++ 13 files changed, 366 insertions(+), 59 deletions(-) create mode 100644 cnn/backends/eigen/tensor.cc create mode 100644 cnn/gru.cc create mode 100644 cnn/gru.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 917c0a1bd..6a44c8abf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,8 +51,8 @@ if (ENABLE_CUDA) find_package(CUDA REQUIRED) set(CUDA_TOOLKIT_ROOT_DIR ${CUDA_ROOT}) include_directories(SYSTEM ${CUDA_INCLUDE_DIRS}) - include_directories(SYSTEM ${CUDA_INCLUDE_DIRS}) - add_definitions(-DHAS_CUDA) + add_definitions(-DHAVE_CUDA) + set(LIBS ${LIBS} ${CUDA_LIBRARIES}) #find_cudnn() #include_directories(SYSTEM ${CUDNN_INCLUDE_DIRS}) else() diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 0d59e216b..3771cbd25 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -5,6 +5,7 @@ set(cnn_library_SRCS dict.cc dim.cc edges-common.cc + gru.cc lstm.cc param-edges.cc rnn.cc @@ -34,6 +35,7 @@ if(WITH_EIGEN_BACKEND) backends/eigen/saxe-init.cc backends/eigen/init.cc backends/eigen/edges.cc + backends/eigen/tensor.cc backends/eigen/model.cc) endif(WITH_EIGEN_BACKEND) diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h index a8c4c86fc..a3dcd55d0 100644 --- a/cnn/aligned-mem-pool.h +++ b/cnn/aligned-mem-pool.h @@ -3,23 +3,50 @@ #include #include +#include //#if HAVE_MM_MALLOC #include //#endif +#if HAVE_CUDA +#include +#include +#endif namespace cnn { inline void* cnn_mm_malloc(size_t n, size_t align) { //#if HAVE_MM_MALLOC - return _mm_malloc(n, align); + void* ptr = nullptr; +#if HAVE_CUDA + if (cudaMalloc(&ptr, n) != cudaSuccess) { + ptr = nullptr; + } else { + std::cerr << "cudaMalloc succeeded: ptr=" << ptr << std::endl; + } +#else + ptr = _mm_malloc(n, align); +#endif //#else // return std::malloc(n, align); //#endif + if (!ptr) { + std::cerr << "Memory allocation failed n=" << n << " align=" << align << std::endl; + abort(); + } + return ptr; } inline void cnn_mm_free(void* mem) { //#if HAVE_MM_MALLOC +#if HAVE_CUDA + if (cudaFree(mem)) { + std::cerr << "cudaFree failed\n"; + abort(); + } +#else _mm_free(mem); +#endif + //#else // return std::free(n, align); //#endif @@ -63,7 +90,11 @@ class AlignedMemoryPool { } void zero() { //std::cerr << "zeroing " << (used ? used : capacity) << " bytes\n"; +#if HAVE_CUDA + cudaMemset(mem, 0, used ? used : capacity); +#else std::memset(mem, 0, used ? used : capacity); +#endif } inline static size_t round_up_align(size_t n) { if (AlignedBits < 2) return n; diff --git a/cnn/backends/eigen/edges.cc b/cnn/backends/eigen/edges.cc index 775c5b83f..fee9f1baa 100644 --- a/cnn/backends/eigen/edges.cc +++ b/cnn/backends/eigen/edges.cc @@ -540,7 +540,7 @@ void RestrictedLogSoftmax::forward(const vector& xs, Tensor& fx) auto x = **xs[0]; assert(x.cols() == 1); const real logz = logsumexp(x, denom); - Constant(fx, -numeric_limits::infinity()); + TensorTools::Constant(fx, -numeric_limits::infinity()); for (auto i : denom) (*fx)(i,0) = x(i,0) - logz; if (denom.size() == 1) (*fx)(denom.front(), 0) = 0; diff --git a/cnn/backends/eigen/init.cc b/cnn/backends/eigen/init.cc index 4df7bdc01..43f20387e 100644 --- a/cnn/backends/eigen/init.cc +++ b/cnn/backends/eigen/init.cc @@ -1,17 +1,58 @@ #include "cnn/backends/eigen/init.h" +#include "cnn/aligned-mem-pool.h" #include #include #include +#if HAVE_CUDA +#include +#include +#include +#endif + using namespace std; namespace cnn { +AlignedMemoryPool<5>* fxs; +AlignedMemoryPool<5>* dEdfs; + +#if HAVE_CUDA +void Initialize_GPU(int& argc, char**& argv) { + int nDevices; + cudaGetDeviceCount(&nDevices); + if (nDevices < 1) { + cerr << "No GPUs found, recompile without DENABLE_CUDA=1\n"; + abort(); + } + for (int i = 0; i < nDevices; i++) { + cudaDeviceProp prop; + cudaGetDeviceProperties(&prop, i); + cerr << "Device Number: " << i << endl; + cerr << " Device name: " << prop.name << endl; + cerr << " Memory Clock Rate (KHz): " << prop.memoryClockRate << endl; + cerr << " Memory Bus Width (bits): " << prop.memoryBusWidth << endl; + cerr << " Peak Memory Bandwidth (GB/s): " << (2.0*prop.memoryClockRate*(prop.memoryBusWidth/8)/1.0e6) << endl << endl; + } + int selected = 0; + cerr << "**USING DEVICE: " << selected << endl; + cudaSetDevice(selected); +} +#endif + std::mt19937* rndeng = nullptr; void Initialize(int& argc, char**& argv) { + cerr << "Initializing...\n"; +#if HAVE_CUDA + Initialize_GPU(argc, argv); +#endif std::random_device rd; rndeng = new mt19937(rd()); + cerr << "Allocating memory...\n"; + fxs = new AlignedMemoryPool<5>(100000000); + dEdfs = new AlignedMemoryPool<5>(100000000); + cerr << "Done.\n"; // rndeng = new mt19937(1); } diff --git a/cnn/backends/eigen/model.cc b/cnn/backends/eigen/model.cc index a678bdfb0..1251f6f90 100644 --- a/cnn/backends/eigen/model.cc +++ b/cnn/backends/eigen/model.cc @@ -16,9 +16,9 @@ ParametersBase::~ParametersBase() {} Parameters::Parameters(const Dim& d) : dim(d) { values.d = g.d = d; values.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); - Randomize(values); + TensorTools::Randomize(values); g.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); - Zero(g); + TensorTools::Zero(g); } size_t Parameters::size() const { return dim.size(); } @@ -32,7 +32,7 @@ real Parameters::g_squared_l2norm() const { void Parameters::accumulate_grad(const Tensor& d) { *g += *d; } void Parameters::clear() { - (*g).setZero(); + TensorTools::Zero(g); } LookupParameters::LookupParameters(unsigned n, const Dim& d) : dim(d), values(n), grads(n) { @@ -40,12 +40,12 @@ LookupParameters::LookupParameters(unsigned n, const Dim& d) : dim(d), values(n) auto& v = values[i]; v.d = d; v.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); - Randomize(v); + TensorTools::Randomize(v); auto& g = grads[i]; g.d = d; g.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); - Zero(g); + TensorTools::Zero(g); } } diff --git a/cnn/backends/eigen/tensor.cc b/cnn/backends/eigen/tensor.cc new file mode 100644 index 000000000..5184a87dd --- /dev/null +++ b/cnn/backends/eigen/tensor.cc @@ -0,0 +1,65 @@ +#include "cnn/backends/eigen/tensor.h" + +#include +#include +#include + +using namespace std; + +namespace cnn { + +real as_scalar(const Tensor& t) { + assert(t.d.size() == 1); + return t.v[0]; +} + +std::vector as_vector(const Tensor& v) { + std::vector res(v.d.size()); +#if HAVE_CUDA + cudaMemcpy(&res[0], v.v, sizeof(real) * res.size(), cudaMemcpyHostToDevice); +#else + std::memcpy(&res[0], v.v, sizeof(real) * res.size()); +#endif + return res; +} + +void TensorTools::Constant(Tensor& d, float c) { + if (!c) { + std::memset(d.v, c, d.d.size() * sizeof(float)); + } else { + std::fill(d.v, d.v + d.d.size(), c); + } +} + +void TensorTools::Zero(Tensor& d) { + Constant(d, 0); +} + +void TensorTools::Randomize(Tensor& val, real scale) { + std::uniform_real_distribution distribution(-scale,scale); + auto b = [&] (real) {return distribution(*rndeng);}; + *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); +} + +void TensorTools::Randomize(Tensor& d) { + Randomize(d, sqrt(6) / sqrt(d.d[0] + d.d[1])); +} + +void TensorTools::RandomBernoulli(Tensor& val, real p) { + std::bernoulli_distribution distribution(p); + auto b = [&] (real) {return distribution(*rndeng);}; + *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); +} + +void TensorTools::RandomizeNormal(real mean, real stddev, Tensor& val) { + std::normal_distribution distribution(mean, stddev); + auto b = [&] (real) {return distribution(*rndeng);}; + *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); +} + +real rand01() { + std::uniform_real_distribution distribution(0, 1); + return distribution(*rndeng); +} + +} // namespace cnn diff --git a/cnn/backends/eigen/tensor.h b/cnn/backends/eigen/tensor.h index 5fd47ac40..491656a20 100644 --- a/cnn/backends/eigen/tensor.h +++ b/cnn/backends/eigen/tensor.h @@ -2,12 +2,16 @@ #define CNN_EIGEN_TENSOR_H #include -#include #include +#include "cnn/dim.h" #include "cnn/backends/eigen/random.h" -#include +#if HAVE_CUDA +#include +#include +#endif +#include // CNN manages its own memory. DO NOT remove the following line #define EIGEN_NO_MALLOC #include @@ -46,45 +50,18 @@ struct Tensor { BOOST_SERIALIZATION_SPLIT_MEMBER() }; -inline real as_scalar(const Tensor& t) { - assert(t.d.size() == 1); - return t.v[0]; -} +real as_scalar(const Tensor& t); +std::vector as_vector(const Tensor& v); -inline std::vector as_vector(const Tensor& v) { - std::vector res(v.d.size()); - std::memcpy(&res[0], v.v, sizeof(real) * res.size()); - return res; -} - -inline void Constant(Tensor& d, float c) { - std::memset(d.v, c, d.d.size() * sizeof(float)); -} -inline void Zero(Tensor& d) { - Constant(d, 0); -} -inline void Randomize(Tensor& val, real scale) { - std::uniform_real_distribution distribution(-scale,scale); - auto b = [&] (real) {return distribution(*rndeng);}; - *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); -} -inline void Randomize(Tensor& d) { - Randomize(d, sqrt(6) / sqrt(d.d[0] + d.d[1])); -} -inline void RandomBernoulli(Tensor& val, real p) { - std::bernoulli_distribution distribution(p); - auto b = [&] (real) {return distribution(*rndeng);}; - *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); -} -inline void RandomizeNormal(real mean, real stddev, Tensor& val) { - std::normal_distribution distribution(mean, stddev); - auto b = [&] (real) {return distribution(*rndeng);}; - *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); -} -inline real rand01() { - std::uniform_real_distribution distribution(0, 1); - return distribution(*rndeng); -} +struct TensorTools { + static void Constant(Tensor& d, float c); + static void Zero(Tensor& d); + static void Randomize(Tensor& val, real scale); + static void Randomize(Tensor& d); + static void RandomBernoulli(Tensor& val, real p); + static void RandomizeNormal(real mean, real stddev, Tensor& val); +}; +real rand01(); } // namespace cnn diff --git a/cnn/cnn.cc b/cnn/cnn.cc index f9adcd5ac..f8636da56 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -7,9 +7,6 @@ using namespace std; namespace cnn { -AlignedMemoryPool<5> fxs(100000000); -AlignedMemoryPool<5> dEdfs(100000000); - int n_hgs = 0; Edge::~Edge() {} @@ -111,8 +108,8 @@ VariableIndex Hypergraph::add_const_lookup(LookupParameters* p, unsigned index) const Tensor& Hypergraph::incremental_forward() { // free any old memory if this is a new HG if (last_node_evaluated == 0) { - fxs.free(); - dEdfs.zero_and_free(); + fxs->free(); + dEdfs->zero_and_free(); } assert(nodes.size() > 0); @@ -131,9 +128,9 @@ const Tensor& Hypergraph::incremental_forward() { } node->dim = in_edge.dim_forward(xds); node->f.d = node->dim; - node->f.v = static_cast(fxs.allocate(node->dim.size() * sizeof(float))); + node->f.v = static_cast(fxs->allocate(node->dim.size() * sizeof(float))); node->dEdf.d = node->dim; - node->dEdf.v = static_cast(dEdfs.allocate(node->dim.size() * sizeof(float))); + node->dEdf.v = static_cast(dEdfs->allocate(node->dim.size() * sizeof(float))); assert(node->f.v); assert(node->dEdf.v); } diff --git a/cnn/cnn.h b/cnn/cnn.h index cd2a07fd6..b50d8232a 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -8,6 +8,7 @@ #include #include +#include "cnn/aligned-mem-pool.h" #include "cnn/tensor.h" #include "cnn/model.h" @@ -22,8 +23,8 @@ namespace cnn { -// TODO pull fx and dEdf out of the Node object and have them -// as local tables in forward/backward algorithms +extern AlignedMemoryPool<5>* fxs; +extern AlignedMemoryPool<5>* dEdfs; struct Edge; struct ParameterEdgeBase; diff --git a/cnn/dim.h b/cnn/dim.h index 3756edf56..2639eb079 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -2,6 +2,7 @@ #define CNN_DIM_H #include +#include #include #include @@ -28,7 +29,7 @@ struct Dim { inline int cols() const { return nd > 1 ? d[1] : 1; } inline int operator[](unsigned i) const { return i < nd ? d[i] : 1; } inline int size(unsigned i) const { return (*this)[i]; } - inline Dim transpose() const { return Dim({d[1],d[0]}); } + inline Dim transpose() const { return Dim(d[1],d[0]); } unsigned short d[CNN_MAX_TENSOR_DIM]; unsigned short nd; private: @@ -39,6 +40,8 @@ struct Dim { } }; +//static_assert(std::is_trivially_copyable::value, "Dim must be trivially copyable"); + inline bool operator==(const Dim& a, const Dim& b) { if (a.nd != b.nd) return false; return std::memcmp(a.d, b.d, a.nd) == 0; diff --git a/cnn/gru.cc b/cnn/gru.cc new file mode 100644 index 000000000..3c9ccc315 --- /dev/null +++ b/cnn/gru.cc @@ -0,0 +1,120 @@ +#include "cnn/gru.h" + +#include +#include +#include +#include + +#include "cnn/training.h" + +using namespace std; + +namespace cnn { + +enum { X2Z, H2Z, BZ, X2R, H2R, BR, X2H, H2H, BH }; + +GRUBuilder::GRUBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model) : hidden_dim(hidden_dim), layers(layers), zeros(hidden_dim, 0) { + unsigned layer_input_dim = input_dim; + for (unsigned i = 0; i < layers; ++i) { + // z + Parameters* p_x2z = model->add_parameters(Dim({hidden_dim, layer_input_dim})); + Parameters* p_h2z = model->add_parameters(Dim({hidden_dim, hidden_dim})); + Parameters* p_bz = model->add_parameters(Dim({hidden_dim})); + + // r + Parameters* p_x2r = model->add_parameters(Dim({hidden_dim, layer_input_dim})); + Parameters* p_h2r = model->add_parameters(Dim({hidden_dim, hidden_dim})); + Parameters* p_br = model->add_parameters(Dim({hidden_dim})); + + // h + Parameters* p_x2h = model->add_parameters(Dim({hidden_dim, layer_input_dim})); + Parameters* p_h2h = model->add_parameters(Dim({hidden_dim, hidden_dim})); + Parameters* p_bh = model->add_parameters(Dim({hidden_dim})); + layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next + + vector ps = {p_x2z, p_h2z, p_bz, p_x2r, p_h2r, p_br, p_x2h, p_h2h, p_bh}; + params.push_back(ps); + } // layers +} + +void GRUBuilder::new_graph(Hypergraph* hg) { + sm.transition(RNNOp::new_graph); + param_vars.clear(); + + for (unsigned i = 0; i < layers; ++i) { + string layer = to_string(i); + auto& p = params[i]; + + // z + VariableIndex i_x2z = hg->add_parameter(p[X2Z]); + VariableIndex i_h2z = hg->add_parameter(p[H2Z]); + VariableIndex i_bz = hg->add_parameter(p[BZ]); + + // r + VariableIndex i_x2r = hg->add_parameter(p[X2R]); + VariableIndex i_h2r = hg->add_parameter(p[H2R]); + VariableIndex i_br = hg->add_parameter(p[BR]); + + // h + VariableIndex i_x2h = hg->add_parameter(p[X2H]); + VariableIndex i_h2h = hg->add_parameter(p[H2H]); + VariableIndex i_bh = hg->add_parameter(p[BH]); + + vector vars = {i_x2z, i_h2z, i_bz, i_x2r, i_h2r, i_br, i_x2h, i_h2h, i_bh}; + param_vars.push_back(vars); + } +} + +void GRUBuilder::start_new_sequence(Hypergraph* hg, + vector h_0) { + sm.transition(RNNOp::start_new_sequence); + h.clear(); + h0 = h_0; + if (h0.empty()) { + VariableIndex zero_input = hg->add_input(Dim({hidden_dim}), &zeros); + if (h0.empty()) { h0 = vector(layers, zero_input); } + } + assert (h0.size() == layers); +} + +VariableIndex GRUBuilder::add_input(VariableIndex x, Hypergraph* hg) { + sm.transition(RNNOp::add_input); + const unsigned t = h.size(); + h.push_back(vector(layers)); + vector& ht = h.back(); + VariableIndex in = x; + for (unsigned i = 0; i < layers; ++i) { + const vector& vars = param_vars[i]; + VariableIndex i_h_tm1; + if (t == 0) { + // intial value for h at timestep 0 in layer i + // defaults to zero matrix input if not set in add_parameter_edges + i_h_tm1 = h0[i]; + } else { // t > 0 + i_h_tm1 = h[t-1][i]; + } + // update gate + VariableIndex i_zt = hg->add_function({vars[BZ], vars[X2Z], in, vars[H2Z], i_h_tm1}); + i_zt = hg->add_function({i_zt}); + // forget + VariableIndex i_ft = hg->add_function({i_zt}, 1.f); + // reset gate + VariableIndex i_rt = hg->add_function({vars[BR], vars[X2R], in, vars[H2R], i_h_tm1}); + i_rt = hg->add_function({i_rt}); + // candidate activation + VariableIndex i_ght = hg->add_function({i_rt, i_h_tm1}); + VariableIndex i_ct = hg->add_function({vars[BH], vars[X2H], in, vars[H2H], i_ght}); + i_ct = hg->add_function({i_ct}); + + // new hidden state + VariableIndex i_nwt = hg->add_function({i_zt, i_ct}); + VariableIndex i_crt = hg->add_function({i_ft, i_h_tm1}); + in = ht[i] = hg->add_function({i_crt, i_nwt}); + } + return ht.back(); +} + +} // namespace cnn diff --git a/cnn/gru.h b/cnn/gru.h new file mode 100644 index 000000000..17277fa96 --- /dev/null +++ b/cnn/gru.h @@ -0,0 +1,70 @@ +#ifndef CNN_GRU_H_ +#define CNN_GRU_H_ + +#include "cnn/cnn.h" +#include "cnn/edges.h" +#include "cnn/rnn-state-machine.h" + +namespace cnn { + +class Model; + +struct GRUBuilder { + GRUBuilder() {} + explicit GRUBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model); + + // call this to reset the builder when you are working with a newly + // created Hypergraph object + void new_graph(Hypergraph* hg); + + // Start new sequence in given Hypergraph with initial c0 and h0 + // call after add_parameter edges but before add input, + // as well as whenever a new sequence is to be added to the graph + void start_new_sequence(Hypergraph* hg, + std::vector h_0={}); + + // add another timestep by reading in the variable x + // return the hidden representation of the deepest layer + VariableIndex add_input(VariableIndex x, Hypergraph* hg); + + // rewind the last timestep - this DOES NOT remove the variables + // from the computation graph, it just means the next time step will + // see a different previous state. You can remind as many times as + // you want. + void rewind_one_step() { + h.pop_back(); + } + + // returns node index (variable) of most recent output + VariableIndex back() const { return h.back().back(); } + + // access memory/hidden state contents + const std::vector& final_h() const { return h.back(); } + + // first index is layer, then ... + std::vector> params; + + // first index is layer, then ... + std::vector> param_vars; + + // first index is time, second is layer + std::vector> h; + + // initial values of h at each layer + // - default to zero matrix input + std::vector h0; + + unsigned hidden_dim; + unsigned layers; + std::vector zeros; + + // the state machine ensures that the caller is behaving + RNNStateMachine sm; +}; + +} // namespace cnn + +#endif From 38c4560006666535aacc21715a92d78ea67631fc Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 11 May 2015 05:15:27 -0400 Subject: [PATCH 030/965] cuda library stub --- CMakeLists.txt | 2 ++ cnn/CMakeLists.txt | 7 +++++++ cnn/backends/cuda/dummy.cu | 8 ++++++++ cnn/edges-common.cc | 8 ++++---- 4 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 cnn/backends/cuda/dummy.cu diff --git a/CMakeLists.txt b/CMakeLists.txt index 6a44c8abf..077486599 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,6 +30,7 @@ endfunction() # look for Boost set(Boost_REALPATH ON) +#find_package(Boost COMPONENTS program_options serialization REQUIRED) find_package(Boost COMPONENTS program_options serialization unit_test_framework REQUIRED) include_directories(${Boost_INCLUDE_DIR}) set(LIBS ${LIBS} ${Boost_LIBRARIES}) @@ -52,6 +53,7 @@ if (ENABLE_CUDA) set(CUDA_TOOLKIT_ROOT_DIR ${CUDA_ROOT}) include_directories(SYSTEM ${CUDA_INCLUDE_DIRS}) add_definitions(-DHAVE_CUDA) + set(WITH_CUDA 1) set(LIBS ${LIBS} ${CUDA_LIBRARIES}) #find_cudnn() #include_directories(SYSTEM ${CUDNN_INCLUDE_DIRS}) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 3771cbd25..ed02946fc 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -63,5 +63,12 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) # actual target: add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) +if(WITH_CUDA) + set(CUDA_SEPARABLE_COMPILATION ON) + list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE") + SET(CUDA_PROPAGATE_HOST_FLAGS OFF) + cuda_add_library(cnncuda STATIC backends/cuda/dummy.cu) +endif(WITH_CUDA) + # target_compile_features(cnn PRIVATE cxx_range_for) diff --git a/cnn/backends/cuda/dummy.cu b/cnn/backends/cuda/dummy.cu new file mode 100644 index 000000000..813ea6a9e --- /dev/null +++ b/cnn/backends/cuda/dummy.cu @@ -0,0 +1,8 @@ +#include +#include + +// CUDA runtime +#include + + + diff --git a/cnn/edges-common.cc b/cnn/edges-common.cc index 406c3c9de..58cfa79c7 100644 --- a/cnn/edges-common.cc +++ b/cnn/edges-common.cc @@ -18,7 +18,7 @@ inline ostream& operator<<(ostream& os, const vector& ds) { inline bool LooksLikeVector(const Dim& d) { if (d.ndims() == 1) return true; if (d.ndims() > 1) { - for (unsigned i = 1; i < d.ndims(); ++i) + for (int i = 1; i < d.ndims(); ++i) if (d[i] != 1) return false; } return true; @@ -203,8 +203,8 @@ string ConcatenateColumns::as_string(const vector& arg_names) const { Dim ConcatenateColumns::dim_forward(const vector& xs) const { assert(xs.size() > 0); - unsigned rows = xs[0][0]; - unsigned new_cols = 0; + int rows = xs[0][0]; + int new_cols = 0; for (auto& d : xs) { if (d[0] != rows) { cerr << "Bad input dimensions in ConcatenateColumns: " << xs << endl; @@ -339,7 +339,7 @@ Dim PickRange::dim_forward(const vector& xs) const { cerr << "Bad input dimensions in PickElement: " << xs << endl; abort(); } - assert(xs[0][0] <= end); + assert(xs[0][0] <= (int)end); return Dim({end - start}); } From dc116bbe703040b6e29563e8a4444b1cdce8c396 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 12 May 2015 12:03:32 -0400 Subject: [PATCH 031/965] general element access --- cnn/backends/eigen/tensor.cc | 8 ++++++++ cnn/backends/eigen/tensor.h | 2 ++ 2 files changed, 10 insertions(+) diff --git a/cnn/backends/eigen/tensor.cc b/cnn/backends/eigen/tensor.cc index 5184a87dd..5f6ba7d20 100644 --- a/cnn/backends/eigen/tensor.cc +++ b/cnn/backends/eigen/tensor.cc @@ -23,6 +23,14 @@ std::vector as_vector(const Tensor& v) { return res; } +float TensorTools::AccessElement(const Tensor& v, const Dim& index) { +#if HAVE_CUDA + abort(); +#else + return (*v)(index[0], index[1]); +#endif +} + void TensorTools::Constant(Tensor& d, float c) { if (!c) { std::memset(d.v, c, d.d.size() * sizeof(float)); diff --git a/cnn/backends/eigen/tensor.h b/cnn/backends/eigen/tensor.h index 491656a20..9a686aa3f 100644 --- a/cnn/backends/eigen/tensor.h +++ b/cnn/backends/eigen/tensor.h @@ -60,6 +60,8 @@ struct TensorTools { static void Randomize(Tensor& d); static void RandomBernoulli(Tensor& val, real p); static void RandomizeNormal(real mean, real stddev, Tensor& val); + // AccessElement is very, very slow (potentially) - use appropriately + static float AccessElement(const Tensor& v, const Dim& index); }; real rand01(); From 233ddf01106ea8a16bb35c5300dbf4f7f4571a10 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 14 May 2015 03:06:41 -0400 Subject: [PATCH 032/965] refactor: hypergraph->graph, rename --- cnn/CMakeLists.txt | 10 +- cnn/backends/eigen/{edges.cc => nodes.cc} | 8 +- cnn/cnn.cc | 173 ++++++++++------------ cnn/cnn.h | 151 ++++++++----------- cnn/gru.cc | 13 +- cnn/gru.h | 11 +- cnn/lstm.cc | 55 +++---- cnn/lstm.h | 11 +- cnn/{edges-common.cc => nodes-common.cc} | 10 +- cnn/{edges.h => nodes.h} | 119 ++++++++------- cnn/{param-edges.cc => param-nodes.cc} | 44 +++--- cnn/{param-edges.h => param-nodes.h} | 26 ++-- cnn/rnn.cc | 19 +-- cnn/rnn.h | 13 +- examples/embed-cl.cc | 61 ++++---- examples/encdec.cc | 78 +++++----- examples/nlm.cc | 40 ++--- examples/rnnlm.cc | 70 ++++----- examples/xor-xent.cc | 43 +++--- examples/xor.cc | 48 +++--- 20 files changed, 488 insertions(+), 515 deletions(-) rename cnn/backends/eigen/{edges.cc => nodes.cc} (99%) rename cnn/{edges-common.cc => nodes-common.cc} (97%) rename cnn/{edges.h => nodes.h} (78%) rename cnn/{param-edges.cc => param-nodes.cc} (61%) rename cnn/{param-edges.h => param-nodes.h} (80%) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 3771cbd25..4a97a2d82 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -4,10 +4,10 @@ set(cnn_library_SRCS cnn.cc dict.cc dim.cc - edges-common.cc + nodes-common.cc gru.cc lstm.cc - param-edges.cc + param-nodes.cc rnn.cc rnn-state-machine.cc training.cc @@ -18,10 +18,10 @@ set(cnn_library_HDRS cnn.h dict.h dim.h - edges.h + nodes.h lstm.h model.h - param-edges.h + param-nodes.h rnn.h rnn-state-machine.h saxe-init.h @@ -34,7 +34,7 @@ if(WITH_EIGEN_BACKEND) list(APPEND cnn_library_SRCS backends/eigen/saxe-init.cc backends/eigen/init.cc - backends/eigen/edges.cc + backends/eigen/nodes.cc backends/eigen/tensor.cc backends/eigen/model.cc) endif(WITH_EIGEN_BACKEND) diff --git a/cnn/backends/eigen/edges.cc b/cnn/backends/eigen/nodes.cc similarity index 99% rename from cnn/backends/eigen/edges.cc rename to cnn/backends/eigen/nodes.cc index fee9f1baa..e1db9fbe7 100644 --- a/cnn/backends/eigen/edges.cc +++ b/cnn/backends/eigen/nodes.cc @@ -1,4 +1,4 @@ -#include "cnn/edges.h" +#include "cnn/nodes.h" #include #include @@ -19,7 +19,7 @@ using namespace std; // EIGEN_NO_MALLOC option. If you get an error about Eigen attempting to allocate // memory, it is (probably) because of an implicit creation of a temporary variable. // To tell Eigen this is not necessary, the noalias() method is available. If you really -// do need a temporary variable, its capacity must be requested by Edge::aux_storage_space +// do need a temporary variable, its capacity must be requested by Node::aux_storage_space namespace cnn { @@ -645,7 +645,7 @@ void CwiseMultiply::backward(const vector& xs, } } -void Multilinear::forward(const vector& xs, Tensor& fx) const { +void AffineTransform::forward(const vector& xs, Tensor& fx) const { assert(xs.size() % 2 == 1); if (xs.size() == 1) { fx.v = xs[0]->v; @@ -657,7 +657,7 @@ void Multilinear::forward(const vector& xs, Tensor& fx) const { } } -void Multilinear::backward(const vector& xs, +void AffineTransform::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, diff --git a/cnn/cnn.cc b/cnn/cnn.cc index f8636da56..22887e16b 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -1,6 +1,6 @@ #include "cnn/cnn.h" -#include "cnn/edges.h" -#include "cnn/param-edges.h" +#include "cnn/nodes.h" +#include "cnn/param-nodes.h" #include "cnn/aligned-mem-pool.h" using namespace std; @@ -9,11 +9,12 @@ namespace cnn { int n_hgs = 0; -Edge::~Edge() {} - -bool Edge::has_parameters() const { return false; } +Node::~Node() {} +bool Node::has_parameters() const { + return false; +} -Hypergraph::Hypergraph() : last_node_evaluated() { +ComputationGraph::ComputationGraph() : last_node_evaluated() { ++n_hgs; if (n_hgs > 1) { // TODO handle memory better @@ -22,90 +23,70 @@ Hypergraph::Hypergraph() : last_node_evaluated() { } } -Hypergraph::~Hypergraph() { +ComputationGraph::~ComputationGraph() { for (auto n : nodes) delete n; - for (auto e : edges) delete e; --n_hgs; } -VariableIndex Hypergraph::add_input(real s) { +VariableIndex ComputationGraph::add_input(real s) { VariableIndex new_node_index(nodes.size()); - nodes.push_back(new Node(edges.size(), new_node_index)); - ScalarInputEdge* e = new ScalarInputEdge(s); - edges.push_back(e); - edges.back()->head_node = new_node_index; + nodes.push_back(new ScalarInputNode(s)); return new_node_index; } -VariableIndex Hypergraph::add_input(const real* ps) { +VariableIndex ComputationGraph::add_input(const real* ps) { VariableIndex new_node_index(nodes.size()); - nodes.push_back(new Node(edges.size(), new_node_index)); - ScalarInputEdge* e = new ScalarInputEdge(ps); - edges.push_back(e); - edges.back()->head_node = new_node_index; + nodes.push_back(new ScalarInputNode(ps)); return new_node_index; } -VariableIndex Hypergraph::add_input(const Dim& d, const vector* pm) { +VariableIndex ComputationGraph::add_input(const Dim& d, const vector* pm) { VariableIndex new_node_index(nodes.size()); - nodes.push_back(new Node(edges.size(), new_node_index)); - InputEdge* e = new InputEdge(d, pm); - edges.push_back(e); - edges.back()->head_node = new_node_index; + nodes.push_back(new InputNode(d, pm)); return new_node_index; } -VariableIndex Hypergraph::add_parameter(Parameters* p) { +VariableIndex ComputationGraph::add_parameter(Parameters* p) { VariableIndex new_node_index(nodes.size()); - nodes.push_back(new Node(edges.size(), new_node_index)); - ParameterEdge* new_edge = new ParameterEdge(p); - edges.push_back(new_edge); - parameter_edges.push_back(new_edge); - new_edge->head_node = new_node_index; + ParameterNode* new_node = new ParameterNode(p); + nodes.push_back(new_node); + parameter_nodes.push_back(new_node); return new_node_index; } -VariableIndex Hypergraph::add_lookup(LookupParameters* p, const unsigned* pindex) { +VariableIndex ComputationGraph::add_lookup(LookupParameters* p, const unsigned* pindex) { VariableIndex new_node_index(nodes.size()); - nodes.push_back(new Node(edges.size(), new_node_index)); - LookupEdge* new_edge = new LookupEdge(p, pindex); - edges.push_back(new_edge); - parameter_edges.push_back(new_edge); - new_edge->head_node = new_node_index; + LookupNode* new_node = new LookupNode(p, pindex); + nodes.push_back(new_node); + parameter_nodes.push_back(new_node); return new_node_index; } -VariableIndex Hypergraph::add_lookup(LookupParameters* p, unsigned index) { +VariableIndex ComputationGraph::add_lookup(LookupParameters* p, unsigned index) { VariableIndex new_node_index(nodes.size()); - nodes.push_back(new Node(edges.size(), new_node_index)); - LookupEdge* new_edge = new LookupEdge(p, index); - edges.push_back(new_edge); - parameter_edges.push_back(new_edge); - new_edge->head_node = new_node_index; + LookupNode* new_node = new LookupNode(p, index); + nodes.push_back(new_node); + parameter_nodes.push_back(new_node); return new_node_index; } -VariableIndex Hypergraph::add_const_lookup(LookupParameters* p, unsigned* pindex) { +VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, unsigned* pindex) { VariableIndex new_node_index(nodes.size()); - nodes.push_back(new Node(edges.size(), new_node_index)); - LookupEdge* new_edge = new LookupEdge(p, pindex); - new_edge->has_optimizable_parameters = false; - edges.push_back(new_edge); - new_edge->head_node = new_node_index; + LookupNode* new_node = new LookupNode(p, pindex); + new_node->has_optimizable_parameters = false; + nodes.push_back(new_node); return new_node_index; } -VariableIndex Hypergraph::add_const_lookup(LookupParameters* p, unsigned index) { +VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, unsigned index) { VariableIndex new_node_index(nodes.size()); - nodes.push_back(new Node(edges.size(), new_node_index)); - LookupEdge* new_edge = new LookupEdge(p, index); - new_edge->has_optimizable_parameters = false; - edges.push_back(new_edge); - new_edge->head_node = new_node_index; + LookupNode* new_node = new LookupNode(p, index); + new_node->has_optimizable_parameters = false; + nodes.push_back(new_node); return new_node_index; } -const Tensor& Hypergraph::incremental_forward() { +const Tensor& ComputationGraph::incremental_forward() { // free any old memory if this is a new HG if (last_node_evaluated == 0) { fxs->free(); @@ -119,14 +100,14 @@ const Tensor& Hypergraph::incremental_forward() { vector xds; for (unsigned i = last_node_evaluated; i < nodes.size(); ++i) { Node* node = nodes[i]; - const Edge& in_edge = *edges[node->in_edge]; - xds.resize(in_edge.arity()); - unsigned ti = 0; - for (VariableIndex tail_node_index : in_edge.tail) { - xds[ti] = nodes[tail_node_index]->dim; - ++ti; + xds.resize(node->arity()); + unsigned ai = 0; + for (VariableIndex arg : node->args) { + xds[ai] = nodes[arg]->dim; + ++ai; } - node->dim = in_edge.dim_forward(xds); + // TODO remove dim_forward and replace it with the Node constructors + node->dim = node->dim_forward(xds); node->f.d = node->dim; node->f.v = static_cast(fxs->allocate(node->dim.size() * sizeof(float))); node->dEdf.d = node->dim; @@ -139,33 +120,38 @@ const Tensor& Hypergraph::incremental_forward() { vector xs; while (last_node_evaluated < nodes.size()) { Node* node = nodes[last_node_evaluated]; - const Edge& in_edge = *edges[node->in_edge]; - xs.resize(in_edge.arity()); - unsigned ti = 0; - for (VariableIndex tail_node_index : in_edge.tail) { - xs[ti] = &nodes[tail_node_index]->f; - ++ti; + xs.resize(node->arity()); + unsigned ai = 0; + for (VariableIndex arg : node->args) { + xs[ai] = &nodes[arg]->f; + ++ai; } - in_edge.forward(xs, node->f); + + // we pass in node->f rather than expecting forward to know where it lives + // because we may end up batching up operations in a later version + node->forward(xs, node->f); ++last_node_evaluated; } return nodes.back()->f; } -const Tensor& Hypergraph::forward() { +const Tensor& ComputationGraph::forward() { last_node_evaluated = 0; return incremental_forward(); } -void Hypergraph::backward() { +void ComputationGraph::backward() { + if (nodes.back()->dim.size() != 1) { + cerr << "backward() called on non-scalar node.\n"; + abort(); + } // here we find constants to avoid doing extra work vector needs_derivative(nodes.size(), false); for (unsigned ni = 0; ni < nodes.size(); ++ni) { const Node& node = *nodes[ni]; - const Edge& in_edge = *edges[node.in_edge]; - bool is_variable = in_edge.has_parameters(); - for (auto tail_node : in_edge.tail) - is_variable |= needs_derivative[tail_node]; + bool is_variable = node.has_parameters(); + for (auto arg : node.args) + is_variable |= needs_derivative[arg]; needs_derivative[ni] = is_variable; } @@ -176,17 +162,16 @@ void Hypergraph::backward() { vector xs; for (int i = nodes.size() - 1; i >= 0; --i) { const Node& node = *nodes[i]; - const Edge& in_edge = *edges[node.in_edge]; - unsigned ti = 0; - xs.resize(in_edge.arity()); - for (unsigned tail_node_index : in_edge.tail) { - xs[ti] = &nodes[tail_node_index]->f; - ++ti; + unsigned ai = 0; + xs.resize(node.arity()); + for (VariableIndex arg : node.args) { + xs[ai] = &nodes[arg]->f; + ++ai; } - for (unsigned ti = 0; ti < in_edge.tail.size(); ++ti) { - if (needs_derivative[in_edge.tail[ti]]) { - Node& tail_node = *nodes[in_edge.tail[ti]]; - in_edge.backward(xs, node.f, node.dEdf, ti, tail_node.dEdf); + for (unsigned ai = 0; ai < node.args.size(); ++ai) { + if (needs_derivative[node.args[ai]]) { + Node& arg_node = *nodes[node.args[ai]]; + node.backward(xs, node.f, node.dEdf, ai, arg_node.dEdf); } } } @@ -199,25 +184,23 @@ void Hypergraph::backward() { // this is simpler than you might find in some other frameworks // since we assume parameters come into the graph as a "function" // that returns the current value of the parameters - for (auto pedge : parameter_edges) - pedge->accumulate_grad(nodes[pedge->head_node]->dEdf); + for (auto pnode : parameter_nodes) + pnode->accumulate_grad(pnode->dEdf); } -void Hypergraph::PrintGraphviz() const { +void ComputationGraph::PrintGraphviz() const { cerr << "digraph G {\n rankdir=LR;\n nodesep=.05;\n"; unsigned nc = 0; for (auto node : nodes) { vector var_names; - const Edge* in_edge = edges[node->in_edge]; - for (auto tail_node : in_edge->tail) - var_names.push_back(nodes[tail_node]->variable_name()); - cerr << " N" << nc << " [label=\"" << node->variable_name() << " = " - << in_edge->as_string(var_names) << "\"];\n"; + for (auto arg : node->args) + var_names.push_back(string("v")); // TODO + cerr << " N" << nc << " [label=\"v" << nc << " = " + << node->as_string(var_names) << "\"];\n"; + for (auto arg : node->args) + cerr << " N" << ((unsigned)arg) << " -> N" << nc << ";\n"; ++nc; } - for (auto edge : edges) - for (auto ni : edge->tail) - cerr << " N" << ni << " -> N" << edge->head_node << ";\n"; cerr << "}\n"; } diff --git a/cnn/cnn.h b/cnn/cnn.h index b50d8232a..bbd1b9937 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -26,8 +26,7 @@ namespace cnn { extern AlignedMemoryPool<5>* fxs; extern AlignedMemoryPool<5>* dEdfs; -struct Edge; -struct ParameterEdgeBase; +struct ParameterNodeBase; struct Node; BOOST_STRONG_TYPEDEF(unsigned, VariableIndex) @@ -37,9 +36,9 @@ inline void swap(VariableIndex& i1, VariableIndex& i2) { i2 = t; } -struct Hypergraph { - Hypergraph(); - ~Hypergraph(); +struct ComputationGraph { + ComputationGraph(); + ~ComputationGraph(); // INPUTS // the computational network will pull inputs in from the user's data @@ -78,64 +77,54 @@ struct Hypergraph { // data std::vector nodes; // **stored in topological order** - std::vector edges; // all edges - std::vector memory_pool; // free this - std::vector parameter_edges; // edges that contain parameters that can be updated (subset of edges) + std::vector parameter_nodes; // nodes that contain parameters that can be updated (subset of nodes) VariableIndex last_node_evaluated; // enables forward graphs to be evaluated incrementally }; -// represents an SSA variable -// * in_edge is the index of the function that computes the variable -// * out_edges are the list of functions that use this variable -// * f is the computed value of the variable (TODO: remove this, see note below) -// * dEdf is the derivative of the output with respect to the function -struct Node { - // name is currently just used for debugging- maybe eventually for code - // generation though - Node(unsigned in_edge_index, VariableIndex nid) : - in_edge(in_edge_index), - node_id(nid) {} - - // dependency structure - unsigned in_edge; - std::vector out_edges; - - // memory - Dim dim; // will be .size() = 0 initially, before memory is allocated - - // debugging - std::string variable_name() const { return "v" + std::to_string(node_id); } - VariableIndex node_id; // my id +#if 0 +class ExecutionEngine { + public: + virtual ~ExecutionEngine(); + // perform computations + virtual const Tensor& forward() = 0; + virtual const Tensor& incremental_forward() = 0; // if you want to add nodes and evaluate just the new parts + virtual void backward() = 0; +}; - // computation results (nb. memory is not owned by Tensor) - Tensor f; // f(x_1 , ... , x_n) - Tensor dEdf; // dE/df +class SimpleExecutionEngine : public ExecutionEngine { + public: + explicit ExecutionEngine(const ComputationGraph& hg) : hg(*hg) {} + const Tensor& forward() override; + const Tensor& incremental_forward() override; // if you want to add nodes and evaluate just the new parts + void backward() override; + private: + std::vector fxs; + std::vector dEdfs; + const ComputationGraph& hg; }; +#endif -inline void swap(Node& n1, Node& n2) { - using std::swap; - swap(n1.dim, n2.dim); - swap(n1.f, n2.f); - swap(n1.dEdf, n2.dEdf); - swap(n1.in_edge, n2.in_edge); - swap(n1.out_edges, n2.out_edges); - swap(n1.node_id, n2.node_id); -} +// represents an SSA variable +// * in_edge is the **ordered** list of indices of the function arguments +// * fx is the computed value of the variable +// * dEdf is the derivative of the output with respect to the function +struct Node { + virtual ~Node(); -// represents a function of zero or more input variables -// functions with zero inputs are constants or optimizeable parameters -struct Edge { - virtual ~Edge(); - // debugging - virtual std::string as_string(const std::vector& var_names) const = 0; + // does this node have parameters that can be optimized? + virtual bool has_parameters() const; // compute dimensions of result for given dimensions of inputs // also checks to make sure inputs are compatible with each other + // TODO remove this in favor of doing all this in the constructor virtual Dim dim_forward(const std::vector& xs) const = 0; + // TODO look at member args instead of passing in args + virtual std::string as_string(const std::vector& args) const = 0; + // in general, this will return an empty size, but if a component needs to store // extra information in the forward pass for use in the backward pass, it can - // request the memory here (nb. you could put it on the Edge object, but in general, + // request the memory here (nb. you could put it on the Node object, but in general, // edges should not allocate tensor memory since memory is managed centrally for the // entire computation graph). TODO // virtual Dim aux_storage_space() const; @@ -143,72 +132,52 @@ struct Edge { // computation virtual void forward(const std::vector& xs, Tensor& fx) const = 0; - // computes the derivative of E with respect to the ith argument to f, that is, xs[i] + // accumulates the derivative of E with respect to the ith argument to f, that is, xs[i] virtual void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const = 0; - virtual bool has_parameters() const; // number of arguments to the function - inline unsigned arity() const { return tail.size(); } + inline unsigned arity() const { return args.size(); } - // structure - VariableIndex head_node; // index of node to contain result of f - std::vector tail; // arguments of function -}; + // dependency structure + std::vector args; -inline void swap(Edge& e1, Edge& e2) { - using std::swap; - swap(e1.tail, e2.tail); - swap(e1.head_node, e2.head_node); -} + // memory size + Dim dim; // will be .size() = 0 initially, before memory is allocated + + // computation results (nb. memory is not owned by Tensor) + Tensor f; // f(x_1 , ... , x_n) + Tensor dEdf; // dE/df + protected: + Node() : args() {} + explicit Node(const std::initializer_list& a) : args(a) {} + template + explicit Node(const T&c) : args(c.begin(), c.end()) {} +}; template -inline VariableIndex Hypergraph::add_function(const std::initializer_list& arguments) { +inline VariableIndex ComputationGraph::add_function(const std::initializer_list& arguments) { VariableIndex new_node_index(nodes.size()); - unsigned new_edge_index = edges.size(); - nodes.push_back(new Node(new_edge_index, new_node_index)); - Edge* new_edge = new Function; - edges.push_back(new_edge); - new_edge->head_node = new_node_index; - for (auto ni : arguments) { - new_edge->tail.push_back(ni); - nodes[ni]->out_edges.push_back(new_edge_index); - } + nodes.push_back(new Function(arguments)); return new_node_index; } // pass side information to the function. these are likely to be nondifferentiable arguments template -inline VariableIndex Hypergraph::add_function(const std::initializer_list& arguments, +inline VariableIndex ComputationGraph::add_function(const std::initializer_list& arguments, Args&&... side_information) { VariableIndex new_node_index(nodes.size()); - unsigned new_edge_index = edges.size(); - nodes.push_back(new Node(new_edge_index, new_node_index)); - Edge* new_edge = new Function(std::forward(side_information)...); - edges.push_back(new_edge); - new_edge->head_node = new_node_index; - for (auto ni : arguments) { - new_edge->tail.push_back(ni); - nodes[ni]->out_edges.push_back(new_edge_index); - } + nodes.push_back(new Function(arguments, std::forward(side_information)...)); return new_node_index; } template -inline VariableIndex Hypergraph::add_function(const T& arguments) { +inline VariableIndex ComputationGraph::add_function(const T& arguments) { VariableIndex new_node_index(nodes.size()); - unsigned new_edge_index = edges.size(); - nodes.push_back(new Node(new_edge_index, new_node_index)); - Edge* new_edge = new Function; - edges.push_back(new_edge); - new_edge->head_node = new_node_index; - for (auto ni : arguments) { - new_edge->tail.push_back(ni); - nodes[ni]->out_edges.push_back(new_edge_index); - } + nodes.push_back(new Function(arguments)); return new_node_index; } diff --git a/cnn/gru.cc b/cnn/gru.cc index 3c9ccc315..b50ffefd4 100644 --- a/cnn/gru.cc +++ b/cnn/gru.cc @@ -5,6 +5,7 @@ #include #include +#include "cnn/nodes.h" #include "cnn/training.h" using namespace std; @@ -40,7 +41,7 @@ GRUBuilder::GRUBuilder(unsigned layers, } // layers } -void GRUBuilder::new_graph(Hypergraph* hg) { +void GRUBuilder::new_graph(ComputationGraph* hg) { sm.transition(RNNOp::new_graph); param_vars.clear(); @@ -68,7 +69,7 @@ void GRUBuilder::new_graph(Hypergraph* hg) { } } -void GRUBuilder::start_new_sequence(Hypergraph* hg, +void GRUBuilder::start_new_sequence(ComputationGraph* hg, vector h_0) { sm.transition(RNNOp::start_new_sequence); h.clear(); @@ -80,7 +81,7 @@ void GRUBuilder::start_new_sequence(Hypergraph* hg, assert (h0.size() == layers); } -VariableIndex GRUBuilder::add_input(VariableIndex x, Hypergraph* hg) { +VariableIndex GRUBuilder::add_input(VariableIndex x, ComputationGraph* hg) { sm.transition(RNNOp::add_input); const unsigned t = h.size(); h.push_back(vector(layers)); @@ -97,16 +98,16 @@ VariableIndex GRUBuilder::add_input(VariableIndex x, Hypergraph* hg) { i_h_tm1 = h[t-1][i]; } // update gate - VariableIndex i_zt = hg->add_function({vars[BZ], vars[X2Z], in, vars[H2Z], i_h_tm1}); + VariableIndex i_zt = hg->add_function({vars[BZ], vars[X2Z], in, vars[H2Z], i_h_tm1}); i_zt = hg->add_function({i_zt}); // forget VariableIndex i_ft = hg->add_function({i_zt}, 1.f); // reset gate - VariableIndex i_rt = hg->add_function({vars[BR], vars[X2R], in, vars[H2R], i_h_tm1}); + VariableIndex i_rt = hg->add_function({vars[BR], vars[X2R], in, vars[H2R], i_h_tm1}); i_rt = hg->add_function({i_rt}); // candidate activation VariableIndex i_ght = hg->add_function({i_rt, i_h_tm1}); - VariableIndex i_ct = hg->add_function({vars[BH], vars[X2H], in, vars[H2H], i_ght}); + VariableIndex i_ct = hg->add_function({vars[BH], vars[X2H], in, vars[H2H], i_ght}); i_ct = hg->add_function({i_ct}); // new hidden state diff --git a/cnn/gru.h b/cnn/gru.h index 17277fa96..499dbe2ea 100644 --- a/cnn/gru.h +++ b/cnn/gru.h @@ -2,7 +2,6 @@ #define CNN_GRU_H_ #include "cnn/cnn.h" -#include "cnn/edges.h" #include "cnn/rnn-state-machine.h" namespace cnn { @@ -17,18 +16,18 @@ struct GRUBuilder { Model* model); // call this to reset the builder when you are working with a newly - // created Hypergraph object - void new_graph(Hypergraph* hg); + // created ComputationGraph object + void new_graph(ComputationGraph* hg); - // Start new sequence in given Hypergraph with initial c0 and h0 + // Start new sequence in given ComputationGraph with initial c0 and h0 // call after add_parameter edges but before add input, // as well as whenever a new sequence is to be added to the graph - void start_new_sequence(Hypergraph* hg, + void start_new_sequence(ComputationGraph* hg, std::vector h_0={}); // add another timestep by reading in the variable x // return the hidden representation of the deepest layer - VariableIndex add_input(VariableIndex x, Hypergraph* hg); + VariableIndex add_input(VariableIndex x, ComputationGraph* hg); // rewind the last timestep - this DOES NOT remove the variables // from the computation graph, it just means the next time step will diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 137793857..26ec842f7 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -5,6 +5,7 @@ #include #include +#include "cnn/nodes.h" #include "cnn/training.h" using namespace std; @@ -42,7 +43,7 @@ LSTMBuilder::LSTMBuilder(unsigned layers, } // layers } -void LSTMBuilder::new_graph(Hypergraph* hg) { +void LSTMBuilder::new_graph(ComputationGraph* cg) { sm.transition(RNNOp::new_graph); param_vars.clear(); @@ -51,28 +52,28 @@ void LSTMBuilder::new_graph(Hypergraph* hg) { auto& p = params[i]; // i - VariableIndex i_x2i = hg->add_parameter(p[X2I]); - VariableIndex i_h2i = hg->add_parameter(p[H2I]); - VariableIndex i_c2i = hg->add_parameter(p[C2I]); - VariableIndex i_bi = hg->add_parameter(p[BI]); + VariableIndex i_x2i = cg->add_parameter(p[X2I]); + VariableIndex i_h2i = cg->add_parameter(p[H2I]); + VariableIndex i_c2i = cg->add_parameter(p[C2I]); + VariableIndex i_bi = cg->add_parameter(p[BI]); // o - VariableIndex i_x2o = hg->add_parameter(p[X2O]); - VariableIndex i_h2o = hg->add_parameter(p[H2O]); - VariableIndex i_c2o = hg->add_parameter(p[C2O]); - VariableIndex i_bo = hg->add_parameter(p[BO]); + VariableIndex i_x2o = cg->add_parameter(p[X2O]); + VariableIndex i_h2o = cg->add_parameter(p[H2O]); + VariableIndex i_c2o = cg->add_parameter(p[C2O]); + VariableIndex i_bo = cg->add_parameter(p[BO]); // c - VariableIndex i_x2c = hg->add_parameter(p[X2C]); - VariableIndex i_h2c = hg->add_parameter(p[H2C]); - VariableIndex i_bc = hg->add_parameter(p[BC]); + VariableIndex i_x2c = cg->add_parameter(p[X2C]); + VariableIndex i_h2c = cg->add_parameter(p[H2C]); + VariableIndex i_bc = cg->add_parameter(p[BC]); vector vars = {i_x2i, i_h2i, i_c2i, i_bi, i_x2o, i_h2o, i_c2o, i_bo, i_x2c, i_h2c, i_bc}; param_vars.push_back(vars); } } -void LSTMBuilder::start_new_sequence(Hypergraph* hg, +void LSTMBuilder::start_new_sequence(ComputationGraph* cg, vector c_0, vector h_0) { sm.transition(RNNOp::start_new_sequence); @@ -81,7 +82,7 @@ void LSTMBuilder::start_new_sequence(Hypergraph* hg, h0 = h_0; c0 = c_0; if (h0.empty() || c0.empty()) { - VariableIndex zero_input = hg->add_input(Dim({hidden_dim}), &zeros); + VariableIndex zero_input = cg->add_input(Dim({hidden_dim}), &zeros); if (c0.empty()) { c0 = vector(layers, zero_input); } if (h0.empty()) { h0 = vector(layers, zero_input); } } @@ -89,7 +90,7 @@ void LSTMBuilder::start_new_sequence(Hypergraph* hg, assert (c0.size() == layers); } -VariableIndex LSTMBuilder::add_input(VariableIndex x, Hypergraph* hg) { +VariableIndex LSTMBuilder::add_input(VariableIndex x, ComputationGraph* cg) { sm.transition(RNNOp::add_input); const unsigned t = h.size(); h.push_back(vector(layers)); @@ -111,22 +112,22 @@ VariableIndex LSTMBuilder::add_input(VariableIndex x, Hypergraph* hg) { i_c_tm1 = c[t-1][i]; } // input - VariableIndex i_ait = hg->add_function({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1, vars[C2I], i_c_tm1}); - VariableIndex i_it = hg->add_function({i_ait}); + VariableIndex i_ait = cg->add_function({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1, vars[C2I], i_c_tm1}); + VariableIndex i_it = cg->add_function({i_ait}); // forget - VariableIndex i_ft = hg->add_function({i_it}, 1.f); + VariableIndex i_ft = cg->add_function({i_it}, 1.f); // write memory cell - VariableIndex i_awt = hg->add_function({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); - VariableIndex i_wt = hg->add_function({i_awt}); + VariableIndex i_awt = cg->add_function({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); + VariableIndex i_wt = cg->add_function({i_awt}); // output - VariableIndex i_nwt = hg->add_function({i_it, i_wt}); - VariableIndex i_crt = hg->add_function({i_ft, i_c_tm1}); - ct[i] = hg->add_function({i_crt, i_nwt}); // new memory cell at time t + VariableIndex i_nwt = cg->add_function({i_it, i_wt}); + VariableIndex i_crt = cg->add_function({i_ft, i_c_tm1}); + ct[i] = cg->add_function({i_crt, i_nwt}); // new memory cell at time t - VariableIndex i_aot = hg->add_function({vars[BO], vars[X2O], in, vars[H2O], i_h_tm1, vars[C2O], ct[i]}); - VariableIndex i_ot = hg->add_function({i_aot}); - VariableIndex ph_t = hg->add_function({ct[i]}); - in = ht[i] = hg->add_function({i_ot, ph_t}); + VariableIndex i_aot = cg->add_function({vars[BO], vars[X2O], in, vars[H2O], i_h_tm1, vars[C2O], ct[i]}); + VariableIndex i_ot = cg->add_function({i_aot}); + VariableIndex ph_t = cg->add_function({ct[i]}); + in = ht[i] = cg->add_function({i_ot, ph_t}); } return ht.back(); } diff --git a/cnn/lstm.h b/cnn/lstm.h index 59a807363..414538859 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -2,7 +2,6 @@ #define CNN_LSTM_H_ #include "cnn/cnn.h" -#include "cnn/edges.h" #include "cnn/rnn-state-machine.h" namespace cnn { @@ -17,19 +16,19 @@ struct LSTMBuilder { Model* model); // call this to reset the builder when you are working with a newly - // created Hypergraph object - void new_graph(Hypergraph* hg); + // created ComputationGraph object + void new_graph(ComputationGraph* cg); - // Start new sequence in given Hypergraph with initial c0 and h0 + // Start new sequence in given ComputationGraph with initial c0 and h0 // call after add_parameter edges but before add input, // as well as whenever a new sequence is to be added to the graph - void start_new_sequence(Hypergraph* hg, + void start_new_sequence(ComputationGraph* cg, std::vector c_0={}, std::vector h_0={}); // add another timestep by reading in the variable x // return the hidden representation of the deepest layer - VariableIndex add_input(VariableIndex x, Hypergraph* hg); + VariableIndex add_input(VariableIndex x, ComputationGraph* cg); // rewind the last timestep - this DOES NOT remove the variables // from the computation graph, it just means the next time step will diff --git a/cnn/edges-common.cc b/cnn/nodes-common.cc similarity index 97% rename from cnn/edges-common.cc rename to cnn/nodes-common.cc index 406c3c9de..f7172cf36 100644 --- a/cnn/edges-common.cc +++ b/cnn/nodes-common.cc @@ -1,4 +1,4 @@ -#include "cnn/edges.h" +#include "cnn/nodes.h" #include #include @@ -374,7 +374,7 @@ Dim CwiseMultiply::dim_forward(const vector& xs) const { return xs[0]; } -string Multilinear::as_string(const vector& arg_names) const { +string AffineTransform::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0]; for (unsigned i = 1; i < arg_names.size(); i += 2) @@ -382,16 +382,16 @@ string Multilinear::as_string(const vector& arg_names) const { return s.str(); } -Dim Multilinear::dim_forward(const vector& xs) const { +Dim AffineTransform::dim_forward(const vector& xs) const { if ((xs.size() - 1) % 2 != 0) { - cerr << "Bad number of inputs for Multilinear: " << xs << endl; + cerr << "Bad number of inputs for AffineTransform: " << xs << endl; abort(); } for (unsigned i = 1; i < xs.size(); i += 2) { if (xs[i].cols() != xs[i+1].rows() || xs[0].rows() != xs[i].rows() || xs[0].cols() != xs[i+1].cols()) { - cerr << "Bad dimensions for Multilinear: " << xs << endl; + cerr << "Bad dimensions for AffineTransform: " << xs << endl; abort(); } } diff --git a/cnn/edges.h b/cnn/nodes.h similarity index 78% rename from cnn/edges.h rename to cnn/nodes.h index a273fbd3e..85e872617 100644 --- a/cnn/edges.h +++ b/cnn/nodes.h @@ -1,13 +1,13 @@ -#ifndef CNN_EDGES_H_ -#define CNN_EDGES_H_ +#ifndef CNN_NODES_H_ +#define CNN_NODES_H_ #include "cnn/cnn.h" namespace cnn { // y = reshape(x_1, from --> to) -struct Reshape : public Edge { - explicit Reshape(const Dim& from, const Dim& to) : from(from), to(to) { +struct Reshape : public Node { + explicit Reshape(const std::initializer_list& a, const Dim& from, const Dim& to) : Node(a), from(from), to(to) { assert(from.size() == to.size()); } std::string as_string(const std::vector& arg_names) const override; @@ -23,7 +23,8 @@ struct Reshape : public Edge { }; // y_i = \sum_{j} x_i,j -struct SumColumns : public Edge { +struct SumColumns : public Node { + template explicit SumColumns(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -35,8 +36,8 @@ struct SumColumns : public Edge { }; // y_i = \sum_{j=1}^n x_1:{i-1+j} -struct KMHNGram : public Edge { - explicit KMHNGram(unsigned n) : n(n) {} +struct KMHNGram : public Node { + explicit KMHNGram(const std::initializer_list& a, unsigned n) : Node(a), n(n) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -55,7 +56,8 @@ struct KMHNGram : public Edge { // (dE/dA)_ijk = (dE/dY)_ij * L_k // (dE/dB)_k = (dE/dY)_ij * A_ijk // (dE/dC)_ij = (dE/dY)_ij -struct InnerProduct3D_1D : public Edge { +struct InnerProduct3D_1D : public Node { + InnerProduct3D_1D(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -68,8 +70,8 @@ struct InnerProduct3D_1D : public Edge { // n_{i,j} ~ N(0,stddev) // y = x + n -struct GaussianNoise : public Edge { - explicit GaussianNoise(real stddev) : stddev(stddev) {} +struct GaussianNoise : public Node { + explicit GaussianNoise(const std::initializer_list& a, real stddev) : Node(a), stddev(stddev) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -82,8 +84,8 @@ struct GaussianNoise : public Edge { }; // y = dropout(x,p) where p specifies the dropout probability -struct Dropout : public Edge { - explicit Dropout(real p) : p(p) {} +struct Dropout : public Node { + explicit Dropout(const std::initializer_list& a, real p) : Node(a), p(p) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -98,8 +100,8 @@ struct Dropout : public Edge { // y = c - x_1 // (c is a vector or matrix of the constant, usually 1, but can be configured) -struct ConstantMinusX : public Edge { - explicit ConstantMinusX(real o) : c(o) {} +struct ConstantMinusX : public Node { + explicit ConstantMinusX(const std::initializer_list& a, real o) : Node(a), c(o) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -112,7 +114,8 @@ struct ConstantMinusX : public Edge { }; // y = tanh x_1 -struct Tanh : public Edge { +struct Tanh : public Node { + explicit Tanh(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -124,7 +127,8 @@ struct Tanh : public Edge { }; // y = x_1 \odot x_1 -struct Square : public Edge { +struct Square : public Node { + explicit Square(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -136,7 +140,8 @@ struct Square : public Edge { }; // y = exp x_1 -struct Exp : public Edge { +struct Exp : public Node { + explicit Exp(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -148,7 +153,8 @@ struct Exp : public Edge { }; // y = log x_1 (base e, i.e., natural log) -struct Log : public Edge { +struct Log : public Node { + explicit Log(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -160,7 +166,8 @@ struct Log : public Edge { }; // concatenate rows -struct Concatenate : public Edge { +struct Concatenate : public Node { + template explicit Concatenate(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -176,7 +183,8 @@ struct Concatenate : public Edge { // concatenate column vectors into a matrix // x_i must be a column vector in R^n -struct ConcatenateColumns : public Edge { +struct ConcatenateColumns : public Node { + template explicit ConcatenateColumns(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -189,9 +197,9 @@ struct ConcatenateColumns : public Edge { // Let x be a vector-valued input, x_i represents the score of the ith element, then // y = \sum{i != element} max{0, margin - x_element + x_i} -struct Hinge : public Edge { - explicit Hinge(unsigned e, real m = 1.0) : element(e), pelement(&element), margin(m) {} - explicit Hinge(unsigned* pe, real m = 1.0) : element(), pelement(pe), margin(m) {} +struct Hinge : public Node { + explicit Hinge(const std::initializer_list& a, unsigned e, real m = 1.0) : Node(a), element(e), pelement(&element), margin(m) {} + explicit Hinge(const std::initializer_list& a, unsigned* pe, real m = 1.0) : Node(a), element(), pelement(pe), margin(m) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -207,7 +215,8 @@ struct Hinge : public Edge { }; // y = x_1 -struct Identity : public Edge { +struct Identity : public Node { + explicit Identity(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -222,8 +231,8 @@ struct Identity : public Edge { // x_1 is a vector in R^n, which we write x // y is a vector in R^{n / width} // y_i = max_{x_{i * width - width + 1}, ..., x_{i * width}} -struct MaxPooling1D : public Edge { - MaxPooling1D(unsigned w) : width(w) {} +struct MaxPooling1D : public Node { + MaxPooling1D(const std::initializer_list& a, unsigned w) : Node(a), width(w) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -237,7 +246,8 @@ struct MaxPooling1D : public Edge { }; // y = x_1 * x_2 -struct MatrixMultiply : public Edge { +struct MatrixMultiply : public Node { + explicit MatrixMultiply(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -249,7 +259,8 @@ struct MatrixMultiply : public Edge { }; // y = x_1 \cdot x_2 (Hadamard product) -struct CwiseMultiply : public Edge { +struct CwiseMultiply : public Node { + explicit CwiseMultiply(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -261,9 +272,8 @@ struct CwiseMultiply : public Edge { }; // y = x_1 \sum_{i=2, 4 ...} A_i * x_{i+1} -// NOTE: if A_i is a vector then * computes the component-wise product -// this is an ugly hack to deal with diagonal matrices -struct Multilinear : public Edge { +struct AffineTransform : public Node { + template explicit AffineTransform(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -275,7 +285,8 @@ struct Multilinear : public Edge { }; // y = -x_1 -struct Negate : public Edge { +struct Negate : public Node { + explicit Negate(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -287,7 +298,8 @@ struct Negate : public Edge { }; // y = max(0,x) -struct Rectify : public Edge { +struct Rectify : public Node { + explicit Rectify(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -303,9 +315,9 @@ struct Rectify : public Edge { // x_1 must be a scalar that is a value between 0 and 1 // target_y is a value between 0 and 1 // y = ty * log(x_1) + (1 - ty) * log(x_1) -struct BinaryLogLoss : public Edge { - BinaryLogLoss(real ty) : target_y(ty), ptarget_y(&target_y) {} - BinaryLogLoss(real* pty) : target_y(), ptarget_y(pty) {} +struct BinaryLogLoss : public Node { + BinaryLogLoss(const std::initializer_list& a, real ty) : Node(a), target_y(ty), ptarget_y(&target_y) {} + BinaryLogLoss(const std::initializer_list& a, real* pty) : Node(a), target_y(), ptarget_y(pty) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -319,7 +331,8 @@ struct BinaryLogLoss : public Edge { }; // y = \sum_i x_i -struct Sum : public Edge { +struct Sum : public Node { + template explicit Sum(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -331,7 +344,8 @@ struct Sum : public Edge { }; // y = || x_1 - x_2 ||^2 -struct SquaredEuclideanDistance : public Edge { +struct SquaredEuclideanDistance : public Node { + explicit SquaredEuclideanDistance(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -343,7 +357,8 @@ struct SquaredEuclideanDistance : public Edge { }; // y = \sigma(x_1) -struct LogisticSigmoid : public Edge { +struct LogisticSigmoid : public Node { + explicit LogisticSigmoid(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -356,7 +371,8 @@ struct LogisticSigmoid : public Edge { // z = \sum_j \exp (x_i)_j // y_i = (x_1)_i / z -struct Softmax : public Edge { +struct Softmax : public Node { + explicit Softmax(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -369,7 +385,8 @@ struct Softmax : public Edge { // z = \sum_j \exp (x_i)_j // y_i = (x_1)_i - \log z -struct LogSoftmax : public Edge { +struct LogSoftmax : public Node { + explicit LogSoftmax(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -382,10 +399,10 @@ struct LogSoftmax : public Edge { // z = \sum_j \exp (x_i)_j // y = (x_1)_element - \log z -struct PickNegLogSoftmax : public Edge { - explicit PickNegLogSoftmax(unsigned v) : val(v), pval(&val) {} +struct PickNegLogSoftmax : public Node { + explicit PickNegLogSoftmax(const std::initializer_list& a, unsigned v) : Node(a), val(v), pval(&val) {} // use this constructor if you want to change the value after the graph is constructed - explicit PickNegLogSoftmax(const unsigned* pv) : val(), pval(pv) {} + explicit PickNegLogSoftmax(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -401,8 +418,8 @@ struct PickNegLogSoftmax : public Edge { // z = \sum_{j \in denom} \exp (x_i)_j // y_i = (x_1)_i - \log z -struct RestrictedLogSoftmax : public Edge { - explicit RestrictedLogSoftmax(const std::vector& d) : denom(d) {} +struct RestrictedLogSoftmax : public Node { + explicit RestrictedLogSoftmax(const std::initializer_list& a, const std::vector& d) : Node(a), denom(d) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -417,10 +434,10 @@ struct RestrictedLogSoftmax : public Edge { // x_1 is a vector // y = (x_1)_{*pval} // this is used to implement cross-entropy training -struct PickElement : public Edge { - explicit PickElement(unsigned v) : val(v), pval(&val) {} +struct PickElement : public Node { + explicit PickElement(const std::initializer_list& a, unsigned v) : Node(a), val(v), pval(&val) {} // use this constructor if you want to change the value after the graph is constructed - explicit PickElement(const unsigned* pv) : val(), pval(pv) {} + explicit PickElement(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -436,8 +453,8 @@ struct PickElement : public Edge { // x_1 is a vector // y = x_1[start:end] // (start inclusive, end exclusive) -struct PickRange : public Edge { - explicit PickRange(unsigned start, unsigned end) : start(start), end(end) {} +struct PickRange : public Node { + explicit PickRange(const std::initializer_list& a, unsigned start, unsigned end) : Node(a), start(start), end(end) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; diff --git a/cnn/param-edges.cc b/cnn/param-nodes.cc similarity index 61% rename from cnn/param-edges.cc rename to cnn/param-nodes.cc index a90cc036f..4959585ed 100644 --- a/cnn/param-edges.cc +++ b/cnn/param-nodes.cc @@ -1,4 +1,4 @@ -#include "cnn/param-edges.h" +#include "cnn/param-nodes.h" #include "cnn/tensor.h" #include @@ -7,54 +7,54 @@ using namespace std; namespace cnn { -bool ParameterEdge::has_parameters() const { return true; } +bool ParameterNode::has_parameters() const { return true; } -string ParameterEdge::as_string(const vector& arg_names) const { +string ParameterNode::as_string(const vector& arg_names) const { ostringstream s; s << "parameters(" << dim << ')'; return s.str(); } -Dim ParameterEdge::dim_forward(const vector& xs) const { +Dim ParameterNode::dim_forward(const vector& xs) const { assert(xs.size() == 0); return dim; } -void ParameterEdge::forward(const vector& xs, Tensor& fx) const { +void ParameterNode::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); fx.v = params->values.v; } -void ParameterEdge::backward(const vector& xs, +void ParameterNode::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - cerr << "called backward() on arity 0 edge\n"; + cerr << "called backward() on arity 0 node: i = " << i << endl; abort(); } -void ParameterEdge::accumulate_grad(const Tensor& g) { +void ParameterNode::accumulate_grad(const Tensor& g) { params->accumulate_grad(g); } -string InputEdge::as_string(const vector& arg_names) const { +string InputNode::as_string(const vector& arg_names) const { ostringstream s; s << "constant(" << dim << ')'; return s.str(); } -Dim InputEdge::dim_forward(const vector& xs) const { +Dim InputNode::dim_forward(const vector& xs) const { return dim; } -void InputEdge::forward(const vector& xs, Tensor& fx) const { +void InputNode::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); assert((int)dim.size() == (int)pdata->size()); memcpy(fx.v, &pdata->front(), dim.size() * sizeof(float)); } -void InputEdge::backward(const vector& xs, +void InputNode::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -63,22 +63,22 @@ void InputEdge::backward(const vector& xs, abort(); } -string ScalarInputEdge::as_string(const vector& arg_names) const { +string ScalarInputNode::as_string(const vector& arg_names) const { ostringstream s; s << "scalar_constant(" << *pdata << ')'; return s.str(); } -Dim ScalarInputEdge::dim_forward(const vector& xs) const { +Dim ScalarInputNode::dim_forward(const vector& xs) const { return Dim({1}); } -void ScalarInputEdge::forward(const vector& xs, Tensor& fx) const { +void ScalarInputNode::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); fx.v[0] = *pdata; } -void ScalarInputEdge::backward(const vector& xs, +void ScalarInputNode::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -87,22 +87,22 @@ void ScalarInputEdge::backward(const vector& xs, abort(); } -string LookupEdge::as_string(const vector& arg_names) const { +string LookupNode::as_string(const vector& arg_names) const { ostringstream s; s << "lookup_parameters(|x|=" << params->values.size() << " --> " << dim << ')'; return s.str(); } -Dim LookupEdge::dim_forward(const vector& xs) const { +Dim LookupNode::dim_forward(const vector& xs) const { return dim; } -void LookupEdge::forward(const vector& xs, Tensor& fx) const { +void LookupNode::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); *fx = *params->values[*pindex]; } -void LookupEdge::backward(const vector& xs, +void LookupNode::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -111,11 +111,11 @@ void LookupEdge::backward(const vector& xs, abort(); } -bool LookupEdge::has_parameters() const { +bool LookupNode::has_parameters() const { return has_optimizable_parameters; } -void LookupEdge::accumulate_grad(const Tensor& g) { +void LookupNode::accumulate_grad(const Tensor& g) { assert(has_optimizable_parameters); params->accumulate_grad(*pindex, g); } diff --git a/cnn/param-edges.h b/cnn/param-nodes.h similarity index 80% rename from cnn/param-edges.h rename to cnn/param-nodes.h index a76e7193a..4d360fd36 100644 --- a/cnn/param-edges.h +++ b/cnn/param-nodes.h @@ -1,18 +1,18 @@ -#ifndef CNN_PARAM_EDGES_H_ -#define CNN_PARAM_EDGES_H_ +#ifndef CNN_PARAM_NODES_H_ +#define CNN_PARAM_NODES_H_ #include "cnn/cnn.h" #include "cnn/model.h" namespace cnn { -struct ParameterEdgeBase : public Edge { +struct ParameterNodeBase : public Node { virtual void accumulate_grad(const Tensor& g) = 0; }; // represents optimizable parameters -struct ParameterEdge : public ParameterEdgeBase { - explicit ParameterEdge(Parameters* p) : dim(p->dim), params(p) {} +struct ParameterNode : public ParameterNodeBase { + explicit ParameterNode(Parameters* p) : dim(p->dim), params(p) {} bool has_parameters() const override; std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; @@ -28,8 +28,8 @@ struct ParameterEdge : public ParameterEdgeBase { }; // represents specified (not learned) inputs to the network -struct InputEdge : public Edge { - explicit InputEdge(const Dim& d, const std::vector* pd) : dim(d), pdata(pd) {} +struct InputNode : public Node { + explicit InputNode(const Dim& d, const std::vector* pd) : dim(d), pdata(pd) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -43,9 +43,9 @@ struct InputEdge : public Edge { }; // represents specified (not learned) scalar inputs to the network -struct ScalarInputEdge : public Edge { - explicit ScalarInputEdge(real s) : data(s), pdata(&data) {} - explicit ScalarInputEdge(const real* ps) : data(), pdata(ps) {} +struct ScalarInputNode : public Node { + explicit ScalarInputNode(real s) : data(s), pdata(&data) {} + explicit ScalarInputNode(const real* ps) : data(), pdata(ps) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -59,9 +59,9 @@ struct ScalarInputEdge : public Edge { }; // represents a matrix/vector embedding of an item of a discrete set (1-hot coding) -struct LookupEdge : public ParameterEdgeBase { - LookupEdge(LookupParameters* p, unsigned ind) : dim(p->dim), index(ind), pindex(&index), params(p), has_optimizable_parameters(true) {} - LookupEdge(LookupParameters* p, const unsigned* pind) : dim(p->dim), index(), pindex(pind), params(p), has_optimizable_parameters(true) {} +struct LookupNode : public ParameterNodeBase { + LookupNode(LookupParameters* p, unsigned ind) : dim(p->dim), index(ind), pindex(&index), params(p), has_optimizable_parameters(true) {} + LookupNode(LookupParameters* p, const unsigned* pind) : dim(p->dim), index(), pindex(pind), params(p), has_optimizable_parameters(true) {} bool has_parameters() const override; std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; diff --git a/cnn/rnn.cc b/cnn/rnn.cc index f56d63e84..ee3b07e42 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -5,6 +5,7 @@ #include #include +#include "cnn/nodes.h" #include "cnn/training.h" using namespace std; @@ -26,33 +27,33 @@ RNNBuilder::RNNBuilder(unsigned layers, } } -void RNNBuilder::new_graph(Hypergraph* hg) { +void RNNBuilder::new_graph(ComputationGraph* cg) { sm.transition(RNNOp::new_graph); param_vars.clear(); for (unsigned i = 0; i < layers; ++i) { Parameters* p_x2h = params[i][0]; Parameters* p_h2h = params[i][1]; Parameters* p_hb = params[i][2]; - VariableIndex i_x2h = hg->add_parameter(p_x2h); - VariableIndex i_h2h = hg->add_parameter(p_h2h); - VariableIndex i_hb = hg->add_parameter(p_hb); + VariableIndex i_x2h = cg->add_parameter(p_x2h); + VariableIndex i_h2h = cg->add_parameter(p_h2h); + VariableIndex i_hb = cg->add_parameter(p_hb); vector vars = {i_x2h, i_h2h, i_hb}; param_vars.push_back(vars); } } -void RNNBuilder::start_new_sequence(Hypergraph* hg, vector h_0) { +void RNNBuilder::start_new_sequence(ComputationGraph* cg, vector h_0) { sm.transition(RNNOp::start_new_sequence); h.clear(); h0 = h_0; if (h0.empty()) { - VariableIndex zero_input = hg->add_input(Dim({hidden_dim}), &zeros); + VariableIndex zero_input = cg->add_input(Dim({hidden_dim}), &zeros); h0 = vector(layers, zero_input); } assert (h0.size() == layers); } -VariableIndex RNNBuilder::add_input(VariableIndex x, Hypergraph* hg) { +VariableIndex RNNBuilder::add_input(VariableIndex x, ComputationGraph* cg) { sm.transition(RNNOp::add_input); const unsigned t = h.size(); h.push_back(vector(layers)); @@ -69,8 +70,8 @@ VariableIndex RNNBuilder::add_input(VariableIndex x, Hypergraph* hg) { i_h_tm1 = h[t-1][i]; } // h3 = hbias + h2h * h_{t-1} + x2h * in - VariableIndex i_h3 = hg->add_function({vars[2], vars[0], in, vars[1], i_h_tm1}); - in = ht[i] = hg->add_function({i_h3}); + VariableIndex i_h3 = cg->add_function({vars[2], vars[0], in, vars[1], i_h_tm1}); + in = ht[i] = cg->add_function({i_h3}); } return ht.back(); } diff --git a/cnn/rnn.h b/cnn/rnn.h index 786831d8f..178ae57f7 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -2,7 +2,6 @@ #define CNN_RNN_H_ #include "cnn/cnn.h" -#include "cnn/edges.h" #include "cnn/rnn-state-machine.h" namespace cnn { @@ -17,18 +16,18 @@ struct RNNBuilder { Model* model); // call this to reset the builder when you are working with a newly - // created Hypergraph object - void new_graph(Hypergraph* hg); + // created ComputationGraph object + void new_graph(ComputationGraph* cg); - // Reset for new sequence on hypergraph hg with shared parameters + // Reset for new sequence on hypergraph cg with shared parameters // call this before add_input and after add_parameter_edges, or // when starting a new sequence on the same hypergraph. // h_0 is used to initialize hidden layers at timestep 0 to given values - void start_new_sequence(Hypergraph* hg, std::vector h_0={}); + void start_new_sequence(ComputationGraph* cg, std::vector h_0={}); // add another timestep by reading in the variable x // return the hidden representation of the deepest layer - VariableIndex add_input(VariableIndex x, Hypergraph* hg); + VariableIndex add_input(VariableIndex x, ComputationGraph* cg); // rewind the last timestep - this DOES NOT remove the variables // from the computation graph, it just means the next time step will @@ -57,7 +56,7 @@ struct RNNBuilder { // defaults to zero matrix input std::vector h0; - Hypergraph* hg; + ComputationGraph* cg; unsigned hidden_dim; unsigned layers; diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index f1ec26fcf..d3a8b55c0 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -1,4 +1,4 @@ -#include "cnn/edges.h" +#include "cnn/nodes.h" #include "cnn/cnn.h" #include "cnn/training.h" #include "cnn/timing.h" @@ -30,28 +30,29 @@ struct Encoder { p_t = model.add_lookup_parameters(OUTPUT_VOCAB_SIZE, {REP_DIM}); } - VariableIndex EmbedSource(const vector& sent, Hypergraph& hg) { + VariableIndex EmbedSource(const vector& sent, ComputationGraph& cg) { vector m(sent.size() + 2); - m[0] = hg.add_lookup(p_s, kSRC_SOS); + m[0] = cg.add_lookup(p_s, kSRC_SOS); int i = 1; for (auto& w : sent) - m[i++] = hg.add_lookup(p_s, w); - m[i] = hg.add_lookup(p_s, kSRC_EOS); - VariableIndex i_m = hg.add_function(m); - i_m = hg.add_function({i_m}, 2); - return hg.add_function({i_m}); + m[i++] = cg.add_lookup(p_s, w); + m[i] = cg.add_lookup(p_s, kSRC_EOS); + VariableIndex i_m = cg.add_function(m); + //i_m = cg.add_function({i_m}, 2); + //i_m = cg.add_function({i_m}); + return cg.add_function({i_m}); } - VariableIndex EmbedTarget(const vector& sent, Hypergraph& hg) { + VariableIndex EmbedTarget(const vector& sent, ComputationGraph& cg) { vector m(sent.size() + 2); - m[0] = hg.add_lookup(p_s, kTRG_SOS); + m[0] = cg.add_lookup(p_s, kTRG_SOS); int i = 1; for (auto& w : sent) - m[i++] = hg.add_lookup(p_t, w); - m[i] = hg.add_lookup(p_s, kTRG_EOS); - VariableIndex i_m = hg.add_function(m); - i_m = hg.add_function({i_m}, 2); - return hg.add_function({i_m}); + m[i++] = cg.add_lookup(p_t, w); + m[i] = cg.add_lookup(p_s, kTRG_EOS); + VariableIndex i_m = cg.add_function(m); + i_m = cg.add_function({i_m}, 2); + return cg.add_function({i_m}); } }; @@ -153,32 +154,32 @@ int main(int argc, char** argv) { } // build graph for this instance - Hypergraph hg; + ComputationGraph cg; auto& sent_pair = training[order[si]]; ++si; auto& src = sent_pair.first; auto& trg = sent_pair.second; - VariableIndex i_s = emb.EmbedSource(src, hg); - VariableIndex i_t = emb.EmbedTarget(trg, hg); - VariableIndex i_sim = hg.add_function({i_s,i_t}); + VariableIndex i_s = emb.EmbedSource(src, cg); + VariableIndex i_t = emb.EmbedTarget(trg, cg); + VariableIndex i_sim = cg.add_function({i_s,i_t}); float margin = 2; - VariableIndex i_ms = hg.add_function({i_sim}, margin); + VariableIndex i_ms = cg.add_function({i_sim}, margin); const unsigned K = 20; vector noise(K); for (unsigned j = 0; j < K; ++j) { unsigned s = rand01() * training.size(); while (s == order[si] || s == training.size()) { s = rand01() * training.size(); } - VariableIndex i_n_j = emb.EmbedTarget(training[s].second, hg); - VariableIndex i_sim_n = hg.add_function({i_s,i_n_j}); - noise[j] = hg.add_function({i_ms, i_sim_n}); + VariableIndex i_n_j = emb.EmbedTarget(training[s].second, cg); + VariableIndex i_sim_n = cg.add_function({i_s,i_n_j}); + noise[j] = cg.add_function({i_ms, i_sim_n}); } - VariableIndex i_v = hg.add_function({hg.add_function(noise)}); - hg.add_function({i_v}); - auto iloss = as_scalar(hg.forward()); + VariableIndex i_v = cg.add_function({cg.add_function(noise)}); + cg.add_function({i_v}); + auto iloss = as_scalar(cg.forward()); assert(iloss >= 0); if (iloss > 0) { loss += iloss; - hg.backward(); + cg.backward(); sgd->update(); } ++lines; @@ -196,9 +197,9 @@ int main(int argc, char** argv) { double dloss = 0; int dchars = 0; for (auto& sent : dev) { - Hypergraph hg; - lm.BuildGraph(sent, sent, hg); - dloss += as_scalar(hg.forward()); + ComputationGraph cg; + lm.BuildGraph(sent, sent, cg); + dloss += as_scalar(cg.forward()); dchars += sent.size() - 1; } if (dloss < best) { diff --git a/examples/encdec.cc b/examples/encdec.cc index 9de658b94..01fdc5c2b 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -1,4 +1,4 @@ -#include "cnn/edges.h" +#include "cnn/nodes.h" #include "cnn/cnn.h" #include "cnn/training.h" #include "cnn/timing.h" @@ -54,20 +54,20 @@ struct EncoderDecoder { } // build graph and return VariableIndex of total loss - VariableIndex BuildGraph(const vector& insent, const vector& osent, Hypergraph& hg) { + VariableIndex BuildGraph(const vector& insent, const vector& osent, ComputationGraph& cg) { // forward encoder - fwd_enc_builder.new_graph(&hg); - fwd_enc_builder.start_new_sequence(&hg); + fwd_enc_builder.new_graph(&cg); + fwd_enc_builder.start_new_sequence(&cg); for (unsigned t = 0; t < insent.size(); ++t) { - VariableIndex i_x_t = hg.add_lookup(p_ec, insent[t]); - fwd_enc_builder.add_input(i_x_t, &hg); + VariableIndex i_x_t = cg.add_lookup(p_ec, insent[t]); + fwd_enc_builder.add_input(i_x_t, &cg); } // backward encoder - rev_enc_builder.new_graph(&hg); - rev_enc_builder.start_new_sequence(&hg); + rev_enc_builder.new_graph(&cg); + rev_enc_builder.start_new_sequence(&cg); for (int t = insent.size() - 1; t >= 0; --t) { - VariableIndex i_x_t = hg.add_lookup(p_ec, insent[t]); - rev_enc_builder.add_input(i_x_t, &hg); + VariableIndex i_x_t = cg.add_lookup(p_ec, insent[t]); + rev_enc_builder.add_input(i_x_t, &cg); } // encoder -> decoder transformation @@ -76,38 +76,38 @@ struct EncoderDecoder { for (auto h_l : fwd_enc_builder.final_h()) to[c++] = h_l; for (auto h_l : rev_enc_builder.final_h()) to[c++] = h_l; assert(c == LAYERS * 2); - VariableIndex i_combined = hg.add_function(to); - VariableIndex i_ie2h = hg.add_parameter(p_ie2h); - VariableIndex i_bie = hg.add_parameter(p_bie); - VariableIndex i_t = hg.add_function({i_bie, i_ie2h, i_combined}); - hg.incremental_forward(); - VariableIndex i_h = hg.add_function({i_t}); - VariableIndex i_h2oe = hg.add_parameter(p_h2oe); - VariableIndex i_boe = hg.add_parameter(p_boe); - VariableIndex i_nc = hg.add_function({i_boe, i_h2oe, i_h}); + VariableIndex i_combined = cg.add_function(to); + VariableIndex i_ie2h = cg.add_parameter(p_ie2h); + VariableIndex i_bie = cg.add_parameter(p_bie); + VariableIndex i_t = cg.add_function({i_bie, i_ie2h, i_combined}); + cg.incremental_forward(); + VariableIndex i_h = cg.add_function({i_t}); + VariableIndex i_h2oe = cg.add_parameter(p_h2oe); + VariableIndex i_boe = cg.add_parameter(p_boe); + VariableIndex i_nc = cg.add_function({i_boe, i_h2oe, i_h}); vector oein_c(LAYERS); vector oein_h(LAYERS); for (int i = 0; i < LAYERS; ++i) { - oein_c[i] = hg.add_function({i_nc}, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM); - oein_h[i] = hg.add_function({oein_c[i]}); + oein_c[i] = cg.add_function({i_nc}, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM); + oein_h[i] = cg.add_function({oein_c[i]}); } - dec_builder.new_graph(&hg); - dec_builder.start_new_sequence(&hg, oein_c, oein_h); + dec_builder.new_graph(&cg); + dec_builder.start_new_sequence(&cg, oein_c, oein_h); // decoder - VariableIndex i_R = hg.add_parameter(p_R); - VariableIndex i_bias = hg.add_parameter(p_bias); + VariableIndex i_R = cg.add_parameter(p_R); + VariableIndex i_bias = cg.add_parameter(p_bias); vector errs; const unsigned oslen = osent.size() - 1; for (unsigned t = 0; t < oslen; ++t) { - VariableIndex i_x_t = hg.add_lookup(p_c, osent[t]); - VariableIndex i_y_t = dec_builder.add_input(i_x_t, &hg); - VariableIndex i_r_t = hg.add_function({i_bias, i_R, i_y_t}); - VariableIndex i_ydist = hg.add_function({i_r_t}); - errs.push_back(hg.add_function({i_ydist}, osent[t+1])); + VariableIndex i_x_t = cg.add_lookup(p_c, osent[t]); + VariableIndex i_y_t = dec_builder.add_input(i_x_t, &cg); + VariableIndex i_r_t = cg.add_function({i_bias, i_R, i_y_t}); + VariableIndex i_ydist = cg.add_function({i_r_t}); + errs.push_back(cg.add_function({i_ydist}, osent[t+1])); } - VariableIndex i_nerr = hg.add_function(errs); - return hg.add_function({i_nerr}); + VariableIndex i_nerr = cg.add_function(errs); + return cg.add_function({i_nerr}); } }; @@ -207,13 +207,13 @@ int main(int argc, char** argv) { } // build graph for this instance - Hypergraph hg; + ComputationGraph cg; auto& sent = training[order[si]]; chars += sent.size() - 1; ++si; - lm.BuildGraph(sent, sent, hg); - loss += as_scalar(hg.forward()); - hg.backward(); + lm.BuildGraph(sent, sent, cg); + loss += as_scalar(cg.forward()); + cg.backward(); sgd->update(); ++lines; } @@ -230,9 +230,9 @@ int main(int argc, char** argv) { double dloss = 0; int dchars = 0; for (auto& sent : dev) { - Hypergraph hg; - lm.BuildGraph(sent, sent, hg); - dloss += as_scalar(hg.forward()); + ComputationGraph cg; + lm.BuildGraph(sent, sent, cg); + dloss += as_scalar(cg.forward()); dchars += sent.size() - 1; } if (dloss < best) { diff --git a/examples/nlm.cc b/examples/nlm.cc index c5edac727..f88e32945 100644 --- a/examples/nlm.cc +++ b/examples/nlm.cc @@ -1,4 +1,4 @@ -#include "cnn/edges.h" +#include "cnn/nodes.h" #include "cnn/cnn.h" #include "cnn/training.h" #include "cnn/timing.h" @@ -29,37 +29,37 @@ int main(int argc, char** argv) { Parameters* p_hb = model.add_parameters({DIM}); // build the graph - Hypergraph hg; + ComputationGraph cg; unsigned in_c1, in_c2, in_c3; // set these to set the context words - VariableIndex i_c1 = hg.add_lookup(p_c, &in_c1); - VariableIndex i_c2 = hg.add_lookup(p_c, &in_c2); - VariableIndex i_c3 = hg.add_lookup(p_c, &in_c3); - VariableIndex i_C1 = hg.add_parameter(p_C1); - VariableIndex i_C2 = hg.add_parameter(p_C2); - VariableIndex i_C3 = hg.add_parameter(p_C3); - VariableIndex i_hb = hg.add_parameter(p_hb); - VariableIndex i_R = hg.add_parameter(p_R); + VariableIndex i_c1 = cg.add_lookup(p_c, &in_c1); + VariableIndex i_c2 = cg.add_lookup(p_c, &in_c2); + VariableIndex i_c3 = cg.add_lookup(p_c, &in_c3); + VariableIndex i_C1 = cg.add_parameter(p_C1); + VariableIndex i_C2 = cg.add_parameter(p_C2); + VariableIndex i_C3 = cg.add_parameter(p_C3); + VariableIndex i_hb = cg.add_parameter(p_hb); + VariableIndex i_R = cg.add_parameter(p_R); unsigned ytrue; // set ytrue to change the value of the input - VariableIndex i_bias = hg.add_parameter(p_bias); + VariableIndex i_bias = cg.add_parameter(p_bias); // r = hb + C1 * c1 + C2 * c2 + C3 * c3 - VariableIndex i_r = hg.add_function({i_hb, i_C1, i_c1, i_C2, i_c2, i_C3, i_c3}); + VariableIndex i_r = cg.add_function({i_hb, i_C1, i_c1, i_C2, i_c2, i_C3, i_c3}); // nl = rectify(r) - VariableIndex i_nl = hg.add_function({i_r}); + VariableIndex i_nl = cg.add_function({i_r}); // o2 = bias + R * nl - VariableIndex i_o2 = hg.add_function({i_bias, i_R, i_nl}); + VariableIndex i_o2 = cg.add_function({i_bias, i_R, i_nl}); // ydist = softmax(o2) - VariableIndex i_ydist = hg.add_function({i_o2}); + VariableIndex i_ydist = cg.add_function({i_o2}); // nerr = pick(ydist, ytrue) - VariableIndex i_nerr = hg.add_function({i_ydist}, &ytrue); + VariableIndex i_nerr = cg.add_function({i_ydist}, &ytrue); // err = -nerr - hg.add_function({i_nerr}); - hg.PrintGraphviz(); + cg.add_function({i_nerr}); + cg.PrintGraphviz(); // load some training data if (argc != 2) { @@ -90,8 +90,8 @@ int main(int argc, char** argv) { in_c2 = ci[1]; in_c3 = ci[2]; ytrue = ci[3]; - loss += as_scalar(hg.forward()); - hg.backward(); + loss += as_scalar(cg.forward()); + cg.backward(); ++n; sgd.update(1.0); if (n == 2500) break; diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 65701c637..bf1cb852c 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -1,8 +1,9 @@ -#include "cnn/edges.h" +#include "cnn/nodes.h" #include "cnn/cnn.h" #include "cnn/training.h" #include "cnn/timing.h" #include "cnn/rnn.h" +#include "cnn/gru.h" #include "cnn/lstm.h" #include "cnn/dict.h" @@ -38,39 +39,39 @@ struct RNNLanguageModel { } // return VariableIndex of total loss - VariableIndex BuildLMGraph(const vector& sent, Hypergraph& hg) { + VariableIndex BuildLMGraph(const vector& sent, ComputationGraph& cg) { const unsigned slen = sent.size() - 1; - builder.new_graph(&hg); // reset RNN builder for new graph - builder.start_new_sequence(&hg); - VariableIndex i_R = hg.add_parameter(p_R); // hidden -> word rep parameter - VariableIndex i_bias = hg.add_parameter(p_bias); // word bias + builder.new_graph(&cg); // reset RNN builder for new graph + builder.start_new_sequence(&cg); + VariableIndex i_R = cg.add_parameter(p_R); // hidden -> word rep parameter + VariableIndex i_bias = cg.add_parameter(p_bias); // word bias vector errs; for (unsigned t = 0; t < slen; ++t) { // x_t = lookup sent[t] in parameters p_c - VariableIndex i_x_t = hg.add_lookup(p_c, sent[t]); + VariableIndex i_x_t = cg.add_lookup(p_c, sent[t]); // y_t = RNN(x_t) - VariableIndex i_y_t = builder.add_input(i_x_t, &hg); + VariableIndex i_y_t = builder.add_input(i_x_t, &cg); // r_t = bias + R * y_t - VariableIndex i_r_t = hg.add_function({i_bias, i_R, i_y_t}); + VariableIndex i_r_t = cg.add_function({i_bias, i_R, i_y_t}); // ydist = softmax(r_t) // LogSoftmax followed by PickElement can be written in one step // using PickNegLogSoftmax #if 1 - VariableIndex i_ydist = hg.add_function({i_r_t}); - errs.push_back(hg.add_function({i_ydist}, sent[t+1])); + VariableIndex i_ydist = cg.add_function({i_r_t}); + errs.push_back(cg.add_function({i_ydist}, sent[t+1])); #if 0 - VariableIndex i_ydist = hg.add_function({i_r_t}); - i_ydist = hg.add_function({i_ydist}); - errs.push_back(hg.add_function({i_ydist}, sent[t+1])); + VariableIndex i_ydist = cg.add_function({i_r_t}); + i_ydist = cg.add_function({i_ydist}); + errs.push_back(cg.add_function({i_ydist}, sent[t+1])); #endif #else - VariableIndex i_err = hg.add_function({i_r_t}, sent[t+1]); + VariableIndex i_err = cg.add_function({i_r_t}, sent[t+1]); errs.push_back(i_err); #endif } - VariableIndex i_nerr = hg.add_function(errs); + VariableIndex i_nerr = cg.add_function(errs); #if 1 - return hg.add_function({i_nerr}); + return cg.add_function({i_nerr}); #else return i_nerr; #endif @@ -79,27 +80,27 @@ struct RNNLanguageModel { // return VariableIndex of total loss void RandomSample(int max_len = 150) { cerr << endl; - Hypergraph hg; - builder.new_graph(&hg); // reset RNN builder for new graph - builder.start_new_sequence(&hg); - VariableIndex i_R = hg.add_parameter(p_R); // hidden -> word rep parameter - VariableIndex i_bias = hg.add_parameter(p_bias); // word bias + ComputationGraph cg; + builder.new_graph(&cg); // reset RNN builder for new graph + builder.start_new_sequence(&cg); + VariableIndex i_R = cg.add_parameter(p_R); // hidden -> word rep parameter + VariableIndex i_bias = cg.add_parameter(p_bias); // word bias vector errs; int len = 0; int cur = kSOS; while(len < max_len && cur != kEOS) { ++len; // x_t = lookup sent[t] in parameters p_c - VariableIndex i_x_t = hg.add_lookup(p_c, cur); + VariableIndex i_x_t = cg.add_lookup(p_c, cur); // y_t = RNN(x_t) - VariableIndex i_y_t = builder.add_input(i_x_t, &hg); + VariableIndex i_y_t = builder.add_input(i_x_t, &cg); // r_t = bias + R * y_t - VariableIndex i_r_t = hg.add_function({i_bias, i_R, i_y_t}); + VariableIndex i_r_t = cg.add_function({i_bias, i_R, i_y_t}); // ydist = softmax(r_t) - hg.add_function({i_r_t}); + cg.add_function({i_r_t}); unsigned w = 0; while (w == 0 || (int)w == kSOS) { - auto dist = as_vector(hg.incremental_forward()); + auto dist = as_vector(cg.incremental_forward()); double p = rand01(); for (; w < dist.size(); ++w) { p -= dist[w]; @@ -180,6 +181,7 @@ int main(int argc, char** argv) { sgd = new SimpleSGDTrainer(&model); RNNLanguageModel lm(model); + //RNNLanguageModel lm(model); //RNNLanguageModel lm(model); if (argc == 4) { string fname = argv[3]; @@ -209,13 +211,13 @@ int main(int argc, char** argv) { } // build graph for this instance - Hypergraph hg; + ComputationGraph cg; auto& sent = training[order[si]]; chars += sent.size() - 1; ++si; - lm.BuildLMGraph(sent, hg); - loss += as_scalar(hg.forward()); - hg.backward(); + lm.BuildLMGraph(sent, cg); + loss += as_scalar(cg.forward()); + cg.backward(); sgd->update(); ++lines; } @@ -229,9 +231,9 @@ int main(int argc, char** argv) { double dloss = 0; int dchars = 0; for (auto& sent : dev) { - Hypergraph hg; - lm.BuildLMGraph(sent, hg); - dloss += as_scalar(hg.forward()); + ComputationGraph cg; + lm.BuildLMGraph(sent, cg); + dloss += as_scalar(cg.forward()); dchars += sent.size() - 1; } if (dloss < best) { diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index d2ce26796..58046838e 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -1,7 +1,8 @@ -#include "cnn/edges.h" +#include "cnn/nodes.h" #include "cnn/cnn.h" #include "cnn/training.h" +#include #include #include @@ -25,37 +26,37 @@ int main(int argc, char** argv) { Parameters& p_V = *m.add_parameters({1, HIDDEN_SIZE}); // build the graph - Hypergraph hg; + ComputationGraph cg; // get symbolic variables corresponding to parameters - VariableIndex i_b = hg.add_parameter(&p_b); - VariableIndex i_a = hg.add_parameter(&p_a); - VariableIndex i_W = hg.add_parameter(&p_W); - VariableIndex i_V = hg.add_parameter(&p_V); + VariableIndex i_b = cg.add_parameter(&p_b); + VariableIndex i_a = cg.add_parameter(&p_a); + VariableIndex i_W = cg.add_parameter(&p_W); + VariableIndex i_V = cg.add_parameter(&p_V); vector x_values(2); // set x_values to change the inputs to the network - VariableIndex i_x = hg.add_input({2}, &x_values); + VariableIndex i_x = cg.add_input({2}, &x_values); cnn::real y_value; // set y_value to change the target output - // two options: MatrixMultiply and Sum, or Multilinear - // these are identical, but Multilinear may be slightly more efficient + // two options: MatrixMultiply and Sum, or AffineTransform + // these are identical, but AffineTransform may be slightly more efficient #if 0 - VariableIndex i_f = hg.add_function({i_W, i_x}); - VariableIndex i_g = hg.add_function({i_f, i_b}); + VariableIndex i_f = cg.add_function({i_W, i_x}); + VariableIndex i_g = cg.add_function({i_f, i_b}); #else - VariableIndex i_g = hg.add_function({i_b, i_W, i_x}); + VariableIndex i_g = cg.add_function({i_b, i_W, i_x}); #endif - VariableIndex i_h = hg.add_function({i_g}); + VariableIndex i_h = cg.add_function({i_g}); #if 0 - VariableIndex i_p = hg.add_function({i_V, i_h}); - VariableIndex i_uy_pred = hg.add_function({i_p, i_a}); + VariableIndex i_p = cg.add_function({i_V, i_h}); + VariableIndex i_uy_pred = cg.add_function({i_p, i_a}); #else - VariableIndex i_uy_pred = hg.add_function({i_a, i_V, i_h}); + VariableIndex i_uy_pred = cg.add_function({i_a, i_V, i_h}); #endif - VariableIndex i_y_pred = hg.add_function({i_uy_pred}); - hg.add_function({i_y_pred}, &y_value); - hg.PrintGraphviz(); + VariableIndex i_y_pred = cg.add_function({i_uy_pred}); + cg.add_function({i_y_pred}, &y_value); + cg.PrintGraphviz(); //if (argc == 2) { // ifstream in(argv[1]); // boost::archive::text_iarchive ia(in); @@ -71,8 +72,8 @@ int main(int argc, char** argv) { x_values[0] = x1 ? 1 : 0; x_values[1] = x2 ? 1 : 0; y_value = (x1 != x2) ? 1 : 0; - loss += as_scalar(hg.forward()); - hg.backward(); + loss += as_scalar(cg.forward()); + cg.backward(); sgd.update(1.0); } sgd.update_epoch(); diff --git a/examples/xor.cc b/examples/xor.cc index c2d029aaa..cc555d57a 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -1,4 +1,4 @@ -#include "cnn/edges.h" +#include "cnn/nodes.h" #include "cnn/cnn.h" #include "cnn/training.h" @@ -28,39 +28,39 @@ int main(int argc, char** argv) { Parameters& p_V = *m.add_parameters({1, HIDDEN_SIZE}); // build the graph - Hypergraph hg; + ComputationGraph cg; // get symbolic variables corresponding to parameters - VariableIndex i_b1 = hg.add_parameter(&p_b1); - VariableIndex i_b2 = hg.add_parameter(&p_b2); - VariableIndex i_b = hg.add_function({i_b1, i_b2}); - VariableIndex i_a = hg.add_parameter(&p_a); - VariableIndex i_W = hg.add_parameter(&p_W); - VariableIndex i_V = hg.add_parameter(&p_V); + VariableIndex i_b1 = cg.add_parameter(&p_b1); + VariableIndex i_b2 = cg.add_parameter(&p_b2); + VariableIndex i_b = cg.add_function({i_b1, i_b2}); + VariableIndex i_a = cg.add_parameter(&p_a); + VariableIndex i_W = cg.add_parameter(&p_W); + VariableIndex i_V = cg.add_parameter(&p_V); vector x_values(2); // set x_values to change the inputs to the network - VariableIndex i_x = hg.add_input({2}, &x_values); + VariableIndex i_x = cg.add_input({2}, &x_values); cnn::real y_value; // set y_value to change the target output - VariableIndex i_y = hg.add_input(&y_value); + VariableIndex i_y = cg.add_input(&y_value); - // two options: MatrixMultiply and Sum, or Multilinear - // these are identical, but Multilinear may be slightly more efficient -#if 1 - VariableIndex i_f = hg.add_function({i_W, i_x}); - VariableIndex i_g = hg.add_function({i_f, i_b}); + // two options: MatrixMultiply and Sum, or AffineTransform + // these are identical, but AffineTransform may be slightly more efficient +#if 0 + VariableIndex i_f = cg.add_function({i_W, i_x}); + VariableIndex i_g = cg.add_function({i_f, i_b}); #else - VariableIndex i_g = hg.add_function({i_b, i_W, i_x}); + VariableIndex i_g = cg.add_function({i_b, i_W, i_x}); #endif - VariableIndex i_h = hg.add_function({i_g}); + VariableIndex i_h = cg.add_function({i_g}); #if 0 - VariableIndex i_p = hg.add_function({i_V, i_h}); - VariableIndex i_y_pred = hg.add_function({i_p, i_a}); + VariableIndex i_p = cg.add_function({i_V, i_h}); + VariableIndex i_y_pred = cg.add_function({i_p, i_a}); #else - VariableIndex i_y_pred = hg.add_function({i_a, i_V, i_h}); + VariableIndex i_y_pred = cg.add_function({i_a, i_V, i_h}); #endif - hg.add_function({i_y_pred, i_y}); - hg.PrintGraphviz(); + cg.add_function({i_y_pred, i_y}); + cg.PrintGraphviz(); if (argc == 2) { ifstream in(argv[1]); boost::archive::text_iarchive ia(in); @@ -76,8 +76,8 @@ int main(int argc, char** argv) { x_values[0] = x1 ? 1 : -1; x_values[1] = x2 ? 1 : -1; y_value = (x1 != x2) ? 1 : -1; - loss += as_scalar(hg.forward()); - hg.backward(); + loss += as_scalar(cg.forward()); + cg.backward(); sgd.update(1.0); } sgd.update_epoch(); From 2123cbdf877a439e38dd8dd009494d211f50d77a Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 14 May 2015 18:03:23 -0400 Subject: [PATCH 033/965] factor out forward/backward --- cnn/CMakeLists.txt | 2 + cnn/aligned-mem-pool.h | 20 ++++--- cnn/cnn.cc | 116 ++++------------------------------------- cnn/cnn.h | 31 ++--------- cnn/exec.cc | 110 ++++++++++++++++++++++++++++++++++++++ cnn/exec.h | 33 ++++++++++++ 6 files changed, 174 insertions(+), 138 deletions(-) create mode 100644 cnn/exec.cc create mode 100644 cnn/exec.h diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 4a97a2d82..9efa35420 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -4,6 +4,7 @@ set(cnn_library_SRCS cnn.cc dict.cc dim.cc + exec.cc nodes-common.cc gru.cc lstm.cc @@ -18,6 +19,7 @@ set(cnn_library_HDRS cnn.h dict.h dim.h + exec.h nodes.h lstm.h model.h diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h index a3dcd55d0..a21cba691 100644 --- a/cnn/aligned-mem-pool.h +++ b/cnn/aligned-mem-pool.h @@ -58,7 +58,7 @@ class AlignedMemoryPool { public: explicit AlignedMemoryPool(size_t cap) { sys_alloc(cap); - zero(); + zero_all(); } // returns nullptr if OOM void* allocate(size_t n) { @@ -73,14 +73,22 @@ class AlignedMemoryPool { //std::cerr << "freeing " << used << " bytes\n"; used = 0; } - void zero_and_free() { zero(); free(); } void free_and_grow_capacity(size_t new_cap = 0) { cnn_mm_free(mem); if (new_cap) sys_alloc(new_cap); else sys_alloc(capacity * 1.5); - zero(); + zero_all(); + } + // zeros out the amount of allocations + void zero_allocated_memory() { + if (used == 0) return; +#if HAVE_CUDA + cudaMemset(mem, 0, used); +#else + std::memset(mem, 0, used); +#endif } private: void sys_alloc(size_t cap) { @@ -88,12 +96,12 @@ class AlignedMemoryPool { mem = cnn_mm_malloc(capacity, 1 << AlignedBits); used = 0; } - void zero() { + void zero_all() { //std::cerr << "zeroing " << (used ? used : capacity) << " bytes\n"; #if HAVE_CUDA - cudaMemset(mem, 0, used ? used : capacity); + cudaMemset(mem, 0, capacity); #else - std::memset(mem, 0, used ? used : capacity); + std::memset(mem, 0, capacity); #endif } inline static size_t round_up_align(size_t n) { diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 22887e16b..fa1bef79a 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -1,4 +1,5 @@ #include "cnn/cnn.h" +#include "cnn/exec.h" #include "cnn/nodes.h" #include "cnn/param-nodes.h" #include "cnn/aligned-mem-pool.h" @@ -14,7 +15,8 @@ bool Node::has_parameters() const { return false; } -ComputationGraph::ComputationGraph() : last_node_evaluated() { +ComputationGraph::ComputationGraph() : last_node_evaluated(), + ee(new SimpleExecutionEngine(*this)) { ++n_hgs; if (n_hgs > 1) { // TODO handle memory better @@ -50,7 +52,7 @@ VariableIndex ComputationGraph::add_parameter(Parameters* p) { VariableIndex new_node_index(nodes.size()); ParameterNode* new_node = new ParameterNode(p); nodes.push_back(new_node); - parameter_nodes.push_back(new_node); + parameter_nodes.push_back(new_node_index); return new_node_index; } @@ -58,7 +60,7 @@ VariableIndex ComputationGraph::add_lookup(LookupParameters* p, const unsigned* VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, pindex); nodes.push_back(new_node); - parameter_nodes.push_back(new_node); + parameter_nodes.push_back(new_node_index); return new_node_index; } @@ -66,13 +68,15 @@ VariableIndex ComputationGraph::add_lookup(LookupParameters* p, unsigned index) VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, index); nodes.push_back(new_node); - parameter_nodes.push_back(new_node); + parameter_nodes.push_back(new_node_index); return new_node_index; } VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, unsigned* pindex) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, pindex); + // get rid of this in favor of using parameter_nodes to see the needs_derivative + // expression new_node->has_optimizable_parameters = false; nodes.push_back(new_node); return new_node_index; @@ -86,107 +90,9 @@ VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, unsigned i return new_node_index; } -const Tensor& ComputationGraph::incremental_forward() { - // free any old memory if this is a new HG - if (last_node_evaluated == 0) { - fxs->free(); - dEdfs->zero_and_free(); - } - - assert(nodes.size() > 0); - if (nodes.size() - last_node_evaluated == 0) { - return nodes.back()->f; - } - vector xds; - for (unsigned i = last_node_evaluated; i < nodes.size(); ++i) { - Node* node = nodes[i]; - xds.resize(node->arity()); - unsigned ai = 0; - for (VariableIndex arg : node->args) { - xds[ai] = nodes[arg]->dim; - ++ai; - } - // TODO remove dim_forward and replace it with the Node constructors - node->dim = node->dim_forward(xds); - node->f.d = node->dim; - node->f.v = static_cast(fxs->allocate(node->dim.size() * sizeof(float))); - node->dEdf.d = node->dim; - node->dEdf.v = static_cast(dEdfs->allocate(node->dim.size() * sizeof(float))); - assert(node->f.v); - assert(node->dEdf.v); - } - - //vector dummy(5, "x"); - vector xs; - while (last_node_evaluated < nodes.size()) { - Node* node = nodes[last_node_evaluated]; - xs.resize(node->arity()); - unsigned ai = 0; - for (VariableIndex arg : node->args) { - xs[ai] = &nodes[arg]->f; - ++ai; - } - - // we pass in node->f rather than expecting forward to know where it lives - // because we may end up batching up operations in a later version - node->forward(xs, node->f); - ++last_node_evaluated; - } - return nodes.back()->f; -} - -const Tensor& ComputationGraph::forward() { - last_node_evaluated = 0; - return incremental_forward(); -} - -void ComputationGraph::backward() { - if (nodes.back()->dim.size() != 1) { - cerr << "backward() called on non-scalar node.\n"; - abort(); - } - // here we find constants to avoid doing extra work - vector needs_derivative(nodes.size(), false); - for (unsigned ni = 0; ni < nodes.size(); ++ni) { - const Node& node = *nodes[ni]; - bool is_variable = node.has_parameters(); - for (auto arg : node.args) - is_variable |= needs_derivative[arg]; - needs_derivative[ni] = is_variable; - } - - // initialize dE/dE = 1 - nodes.back()->dEdf.v[0] = 1; - - // loop in reverse topological order - vector xs; - for (int i = nodes.size() - 1; i >= 0; --i) { - const Node& node = *nodes[i]; - unsigned ai = 0; - xs.resize(node.arity()); - for (VariableIndex arg : node.args) { - xs[ai] = &nodes[arg]->f; - ++ai; - } - for (unsigned ai = 0; ai < node.args.size(); ++ai) { - if (needs_derivative[node.args[ai]]) { - Node& arg_node = *nodes[node.args[ai]]; - node.backward(xs, node.f, node.dEdf, ai, arg_node.dEdf); - } - } - } - //vector dummy(5, "x"); - //int cc = 0; // REMOVE - //for (auto n : nodes) { cerr << "NODE " << edges[n->in_edge]->as_string(dummy) << endl << (*n->dEdf) << endl; } - //abort(); - - // accumulate gradients into parameters - // this is simpler than you might find in some other frameworks - // since we assume parameters come into the graph as a "function" - // that returns the current value of the parameters - for (auto pnode : parameter_nodes) - pnode->accumulate_grad(pnode->dEdf); -} +const Tensor& ComputationGraph::incremental_forward() { return ee->incremental_forward(); } +const Tensor& ComputationGraph::forward() { return ee->forward(); } +void ComputationGraph::backward() { ee->backward(); } void ComputationGraph::PrintGraphviz() const { cerr << "digraph G {\n rankdir=LR;\n nodesep=.05;\n"; diff --git a/cnn/cnn.h b/cnn/cnn.h index bbd1b9937..8ef94f2f2 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -26,6 +26,7 @@ namespace cnn { extern AlignedMemoryPool<5>* fxs; extern AlignedMemoryPool<5>* dEdfs; +class ExecutionEngine; struct ParameterNodeBase; struct Node; @@ -77,33 +78,12 @@ struct ComputationGraph { // data std::vector nodes; // **stored in topological order** - std::vector parameter_nodes; // nodes that contain parameters that can be updated (subset of nodes) + std::vector parameter_nodes; // nodes that contain parameters that can be updated (subset of nodes) VariableIndex last_node_evaluated; // enables forward graphs to be evaluated incrementally -}; -#if 0 -class ExecutionEngine { - public: - virtual ~ExecutionEngine(); - // perform computations - virtual const Tensor& forward() = 0; - virtual const Tensor& incremental_forward() = 0; // if you want to add nodes and evaluate just the new parts - virtual void backward() = 0; + ExecutionEngine* ee; // handles the execution }; -class SimpleExecutionEngine : public ExecutionEngine { - public: - explicit ExecutionEngine(const ComputationGraph& hg) : hg(*hg) {} - const Tensor& forward() override; - const Tensor& incremental_forward() override; // if you want to add nodes and evaluate just the new parts - void backward() override; - private: - std::vector fxs; - std::vector dEdfs; - const ComputationGraph& hg; -}; -#endif - // represents an SSA variable // * in_edge is the **ordered** list of indices of the function arguments // * fx is the computed value of the variable @@ -146,11 +126,8 @@ struct Node { std::vector args; // memory size - Dim dim; // will be .size() = 0 initially, before memory is allocated + Dim dim; // will be .size() = 0 initially filled in by forward() -- TODO fix this - // computation results (nb. memory is not owned by Tensor) - Tensor f; // f(x_1 , ... , x_n) - Tensor dEdf; // dE/df protected: Node() : args() {} explicit Node(const std::initializer_list& a) : args(a) {} diff --git a/cnn/exec.cc b/cnn/exec.cc new file mode 100644 index 000000000..4e4fc3738 --- /dev/null +++ b/cnn/exec.cc @@ -0,0 +1,110 @@ +#include "cnn/exec.h" + +#include "cnn/param-nodes.h" + +using namespace std; + +namespace cnn { + +ExecutionEngine::~ExecutionEngine() {} + +const Tensor& SimpleExecutionEngine::forward() { + last_node_evaluated = 0; + return incremental_forward(); +} + +const Tensor& SimpleExecutionEngine::incremental_forward() { + // free any old memory if this is a new HG + if (last_node_evaluated == 0) fxs->free(); + + const unsigned node_max_index = cg.nodes.size(); + assert(node_max_index > 0); + nfxs.resize(node_max_index); + if (node_max_index - last_node_evaluated == 0) + return nfxs.back(); + vector xds; + for (unsigned i = last_node_evaluated; i < node_max_index; ++i) { + const Node* node = cg.nodes[i]; + xds.resize(node->arity()); + unsigned ai = 0; + for (VariableIndex arg : node->args) { + xds[ai] = nfxs[arg].d; + ++ai; + } + // TODO remove dim_forward and replace it with the Node constructors + auto dim = node->dim_forward(xds); + nfxs[i].d = dim; + nfxs[i].v = static_cast(fxs->allocate(dim.size() * sizeof(float))); + assert(nfxs[i].v); + } + //vector dummy(5, "x"); + vector xs; + for (; last_node_evaluated < node_max_index; ++last_node_evaluated) { + const Node* node = cg.nodes[last_node_evaluated]; + xs.resize(node->arity()); + unsigned ai = 0; + for (VariableIndex arg : node->args) { + xs[ai] = &nfxs[arg]; + ++ai; + } + node->forward(xs, nfxs[last_node_evaluated]); + } + return nfxs.back(); +} + +void SimpleExecutionEngine::backward() { + if (nfxs.back().d.size() != 1) { + cerr << "backward() called on non-scalar node.\n"; + abort(); + } + const unsigned node_max_index = cg.nodes.size(); + ndEdfs.resize(node_max_index); + dEdfs->free(); + for (unsigned i = 0; i < node_max_index; ++i) { + const auto dim = nfxs[i].d; + ndEdfs[i].d = dim; + ndEdfs[i].v = static_cast(dEdfs->allocate(dim.size() * sizeof(float))); + assert(ndEdfs[i].v); + } + dEdfs->zero_allocated_memory(); + // initialize dE/dE = 1 + ndEdfs.back().v[0] = 1; + + // here we find constants to avoid doing extra work + const unsigned num_nodes = cg.nodes.size(); + vector needs_derivative(num_nodes, false); + for (unsigned ni = 0; ni < num_nodes; ++ni) { + const Node* node = cg.nodes[ni]; + bool is_variable = node->has_parameters(); + for (auto arg : node->args) + is_variable |= needs_derivative[arg]; + needs_derivative[ni] = is_variable; + } + + // loop in reverse topological order + vector xs; + for (int i = num_nodes - 1; i >= 0; --i) { + const Node* node = cg.nodes[i]; + xs.resize(node->arity()); + unsigned ai = 0; + for (VariableIndex arg : node->args) { + xs[ai] = &nfxs[arg]; + ++ai; + } + ai = 0; + for (VariableIndex arg : node->args) { + if (needs_derivative[arg]) + node->backward(xs, nfxs[i], ndEdfs[i], ai, ndEdfs[arg]); + ++ai; + } + } + + // accumulate gradients into parameters + // this is simpler than you might find in some other frameworks + // since we assume parameters come into the graph as a "function" + // that returns the current value of the parameters + for (VariableIndex i : cg.parameter_nodes) + static_cast(cg.nodes[i])->accumulate_grad(ndEdfs[i]); +} + +} // namespace cnn diff --git a/cnn/exec.h b/cnn/exec.h new file mode 100644 index 000000000..95533cc83 --- /dev/null +++ b/cnn/exec.h @@ -0,0 +1,33 @@ +#ifndef CNN_EXEC_H +#define CNN_EXEC_H + +#include "cnn/cnn.h" + +namespace cnn { + +class ExecutionEngine { + public: + virtual ~ExecutionEngine(); + virtual const Tensor& forward() = 0; + virtual const Tensor& incremental_forward() = 0; // if you want to add nodes and evaluate just the new parts + virtual void backward() = 0; + protected: + explicit ExecutionEngine(const ComputationGraph& cg) : cg(cg) {} + const ComputationGraph& cg; +}; + +class SimpleExecutionEngine : public ExecutionEngine { + public: + explicit SimpleExecutionEngine(const ComputationGraph& cg) : ExecutionEngine(cg) {} + const Tensor& forward() override; + const Tensor& incremental_forward() override; // if you want to add nodes and evaluate just the new parts + void backward() override; + private: + std::vector nfxs; + std::vector ndEdfs; + VariableIndex last_node_evaluated; +}; + +} // namespace cnn + +#endif From b958a9e9a3838f897ff562a2a6c23026f1073bab Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 15 May 2015 01:15:46 -0400 Subject: [PATCH 034/965] better handling of dimension initialization --- cnn/cnn.cc | 23 ++++++++++++++++++++++- cnn/cnn.h | 5 +++++ cnn/exec.cc | 18 +++--------------- 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index fa1bef79a..f4ee54ac1 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -33,18 +33,21 @@ ComputationGraph::~ComputationGraph() { VariableIndex ComputationGraph::add_input(real s) { VariableIndex new_node_index(nodes.size()); nodes.push_back(new ScalarInputNode(s)); + set_dim_for_new_node(new_node_index); return new_node_index; } VariableIndex ComputationGraph::add_input(const real* ps) { VariableIndex new_node_index(nodes.size()); nodes.push_back(new ScalarInputNode(ps)); + set_dim_for_new_node(new_node_index); return new_node_index; } VariableIndex ComputationGraph::add_input(const Dim& d, const vector* pm) { VariableIndex new_node_index(nodes.size()); nodes.push_back(new InputNode(d, pm)); + set_dim_for_new_node(new_node_index); return new_node_index; } @@ -53,6 +56,7 @@ VariableIndex ComputationGraph::add_parameter(Parameters* p) { ParameterNode* new_node = new ParameterNode(p); nodes.push_back(new_node); parameter_nodes.push_back(new_node_index); + set_dim_for_new_node(new_node_index); return new_node_index; } @@ -61,6 +65,7 @@ VariableIndex ComputationGraph::add_lookup(LookupParameters* p, const unsigned* LookupNode* new_node = new LookupNode(p, pindex); nodes.push_back(new_node); parameter_nodes.push_back(new_node_index); + set_dim_for_new_node(new_node_index); return new_node_index; } @@ -69,16 +74,18 @@ VariableIndex ComputationGraph::add_lookup(LookupParameters* p, unsigned index) LookupNode* new_node = new LookupNode(p, index); nodes.push_back(new_node); parameter_nodes.push_back(new_node_index); + set_dim_for_new_node(new_node_index); return new_node_index; } VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, unsigned* pindex) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, pindex); - // get rid of this in favor of using parameter_nodes to see the needs_derivative + // get rid of the following in favor of using parameter_nodes to see the needs_derivative // expression new_node->has_optimizable_parameters = false; nodes.push_back(new_node); + set_dim_for_new_node(new_node_index); return new_node_index; } @@ -87,9 +94,23 @@ VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, unsigned i LookupNode* new_node = new LookupNode(p, index); new_node->has_optimizable_parameters = false; nodes.push_back(new_node); + set_dim_for_new_node(new_node_index); return new_node_index; } +// factory function should call this right after creating a new node object +// to set its dimensions properly +void ComputationGraph::set_dim_for_new_node(const VariableIndex& i) { + Node* node = nodes[i]; + vector xds(node->arity()); + unsigned ai = 0; + for (VariableIndex arg : node->args) { + xds[ai] = nodes[arg]->dim; + ++ai; + } + node->dim = node->dim_forward(xds); +} + const Tensor& ComputationGraph::incremental_forward() { return ee->incremental_forward(); } const Tensor& ComputationGraph::forward() { return ee->forward(); } void ComputationGraph::backward() { ee->backward(); } diff --git a/cnn/cnn.h b/cnn/cnn.h index 8ef94f2f2..7f53c2f1b 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -82,6 +82,8 @@ struct ComputationGraph { VariableIndex last_node_evaluated; // enables forward graphs to be evaluated incrementally ExecutionEngine* ee; // handles the execution + private: + void set_dim_for_new_node(const VariableIndex& i); }; // represents an SSA variable @@ -139,6 +141,7 @@ template inline VariableIndex ComputationGraph::add_function(const std::initializer_list& arguments) { VariableIndex new_node_index(nodes.size()); nodes.push_back(new Function(arguments)); + set_dim_for_new_node(new_node_index); return new_node_index; } @@ -148,6 +151,7 @@ inline VariableIndex ComputationGraph::add_function(const std::initializer_list< Args&&... side_information) { VariableIndex new_node_index(nodes.size()); nodes.push_back(new Function(arguments, std::forward(side_information)...)); + set_dim_for_new_node(new_node_index); return new_node_index; } @@ -155,6 +159,7 @@ template inline VariableIndex ComputationGraph::add_function(const T& arguments) { VariableIndex new_node_index(nodes.size()); nodes.push_back(new Function(arguments)); + set_dim_for_new_node(new_node_index); return new_node_index; } diff --git a/cnn/exec.cc b/cnn/exec.cc index 4e4fc3738..c0e5d064d 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -22,21 +22,7 @@ const Tensor& SimpleExecutionEngine::incremental_forward() { nfxs.resize(node_max_index); if (node_max_index - last_node_evaluated == 0) return nfxs.back(); - vector xds; - for (unsigned i = last_node_evaluated; i < node_max_index; ++i) { - const Node* node = cg.nodes[i]; - xds.resize(node->arity()); - unsigned ai = 0; - for (VariableIndex arg : node->args) { - xds[ai] = nfxs[arg].d; - ++ai; - } - // TODO remove dim_forward and replace it with the Node constructors - auto dim = node->dim_forward(xds); - nfxs[i].d = dim; - nfxs[i].v = static_cast(fxs->allocate(dim.size() * sizeof(float))); - assert(nfxs[i].v); - } + //vector dummy(5, "x"); vector xs; for (; last_node_evaluated < node_max_index; ++last_node_evaluated) { @@ -47,6 +33,8 @@ const Tensor& SimpleExecutionEngine::incremental_forward() { xs[ai] = &nfxs[arg]; ++ai; } + nfxs[last_node_evaluated].d = node->dim; + nfxs[last_node_evaluated].v = static_cast(fxs->allocate(node->dim.size() * sizeof(float))); node->forward(xs, nfxs[last_node_evaluated]); } return nfxs.back(); From fd773e17f37e447149471ca5423746881ae936bc Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 15 May 2015 11:26:34 -0400 Subject: [PATCH 035/965] avoid differentiating wrt constants, fix small bug --- cnn/backends/eigen/nodes.cc | 2 +- cnn/cnn.cc | 5 ----- cnn/cnn.h | 3 --- cnn/exec.cc | 14 ++++++++------ cnn/param-nodes.cc | 7 ------- cnn/param-nodes.h | 7 ++----- examples/rnnlm.cc | 4 ++-- 7 files changed, 13 insertions(+), 29 deletions(-) diff --git a/cnn/backends/eigen/nodes.cc b/cnn/backends/eigen/nodes.cc index e1db9fbe7..7a7b80dc9 100644 --- a/cnn/backends/eigen/nodes.cc +++ b/cnn/backends/eigen/nodes.cc @@ -437,7 +437,7 @@ void PickNegLogSoftmax::forward(const vector& xs, Tensor& fx) con if (xs[0]->d.cols() == 1) { auto x = **xs[0]; logz = logsumexp(x); - fx.v[0] = x(*pval) - logz; + fx.v[0] = logz - x(*pval); } else { cerr << "SoftmaxForward not implemented for multiple columns\n"; abort(); diff --git a/cnn/cnn.cc b/cnn/cnn.cc index f4ee54ac1..9656a63b1 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -11,9 +11,6 @@ namespace cnn { int n_hgs = 0; Node::~Node() {} -bool Node::has_parameters() const { - return false; -} ComputationGraph::ComputationGraph() : last_node_evaluated(), ee(new SimpleExecutionEngine(*this)) { @@ -83,7 +80,6 @@ VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, unsigned* LookupNode* new_node = new LookupNode(p, pindex); // get rid of the following in favor of using parameter_nodes to see the needs_derivative // expression - new_node->has_optimizable_parameters = false; nodes.push_back(new_node); set_dim_for_new_node(new_node_index); return new_node_index; @@ -92,7 +88,6 @@ VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, unsigned* VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, unsigned index) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, index); - new_node->has_optimizable_parameters = false; nodes.push_back(new_node); set_dim_for_new_node(new_node_index); return new_node_index; diff --git a/cnn/cnn.h b/cnn/cnn.h index 7f53c2f1b..58f2fd834 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -93,9 +93,6 @@ struct ComputationGraph { struct Node { virtual ~Node(); - // does this node have parameters that can be optimized? - virtual bool has_parameters() const; - // compute dimensions of result for given dimensions of inputs // also checks to make sure inputs are compatible with each other // TODO remove this in favor of doing all this in the constructor diff --git a/cnn/exec.cc b/cnn/exec.cc index c0e5d064d..a57e40d91 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -58,15 +58,17 @@ void SimpleExecutionEngine::backward() { // initialize dE/dE = 1 ndEdfs.back().v[0] = 1; - // here we find constants to avoid doing extra work + // here we find constant paths to avoid doing extra work const unsigned num_nodes = cg.nodes.size(); vector needs_derivative(num_nodes, false); + for (auto i : cg.parameter_nodes) + needs_derivative[i] = true; + for (unsigned ni = 0; ni < num_nodes; ++ni) { - const Node* node = cg.nodes[ni]; - bool is_variable = node->has_parameters(); - for (auto arg : node->args) - is_variable |= needs_derivative[arg]; - needs_derivative[ni] = is_variable; + bool nd = needs_derivative[ni]; + for (auto arg : cg.nodes[ni]->args) + nd |= needs_derivative[arg]; + needs_derivative[ni] = nd; } // loop in reverse topological order diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index 4959585ed..db01d00ce 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -7,8 +7,6 @@ using namespace std; namespace cnn { -bool ParameterNode::has_parameters() const { return true; } - string ParameterNode::as_string(const vector& arg_names) const { ostringstream s; s << "parameters(" << dim << ')'; @@ -111,12 +109,7 @@ void LookupNode::backward(const vector& xs, abort(); } -bool LookupNode::has_parameters() const { - return has_optimizable_parameters; -} - void LookupNode::accumulate_grad(const Tensor& g) { - assert(has_optimizable_parameters); params->accumulate_grad(*pindex, g); } diff --git a/cnn/param-nodes.h b/cnn/param-nodes.h index 4d360fd36..ac0b4c7b8 100644 --- a/cnn/param-nodes.h +++ b/cnn/param-nodes.h @@ -13,7 +13,6 @@ struct ParameterNodeBase : public Node { // represents optimizable parameters struct ParameterNode : public ParameterNodeBase { explicit ParameterNode(Parameters* p) : dim(p->dim), params(p) {} - bool has_parameters() const override; std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -60,9 +59,8 @@ struct ScalarInputNode : public Node { // represents a matrix/vector embedding of an item of a discrete set (1-hot coding) struct LookupNode : public ParameterNodeBase { - LookupNode(LookupParameters* p, unsigned ind) : dim(p->dim), index(ind), pindex(&index), params(p), has_optimizable_parameters(true) {} - LookupNode(LookupParameters* p, const unsigned* pind) : dim(p->dim), index(), pindex(pind), params(p), has_optimizable_parameters(true) {} - bool has_parameters() const override; + LookupNode(LookupParameters* p, unsigned ind) : dim(p->dim), index(ind), pindex(&index), params(p) {} + LookupNode(LookupParameters* p, const unsigned* pind) : dim(p->dim), index(), pindex(pind), params(p) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -76,7 +74,6 @@ struct LookupNode : public ParameterNodeBase { unsigned index; const unsigned* pindex; LookupParameters* params; - bool has_optimizable_parameters; }; } // namespace cnn diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index bf1cb852c..8b5e41f44 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -56,7 +56,7 @@ struct RNNLanguageModel { // ydist = softmax(r_t) // LogSoftmax followed by PickElement can be written in one step // using PickNegLogSoftmax -#if 1 +#if 0 VariableIndex i_ydist = cg.add_function({i_r_t}); errs.push_back(cg.add_function({i_ydist}, sent[t+1])); #if 0 @@ -70,7 +70,7 @@ struct RNNLanguageModel { #endif } VariableIndex i_nerr = cg.add_function(errs); -#if 1 +#if 0 return cg.add_function({i_nerr}); #else return i_nerr; From c554b38783b3dae040811ea0752cec9b94443f3f Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 16 May 2015 21:21:57 -0400 Subject: [PATCH 036/965] cuda progress --- CMakeLists.txt | 11 ++- cnn/CMakeLists.txt | 23 +++--- cnn/aligned-mem-pool.h | 20 ++--- cnn/backends/eigen/init.cc | 60 -------------- cnn/backends/eigen/tensor.cc | 73 ----------------- cnn/backends/eigen/tensor.h | 70 ---------------- cnn/cnn.cc | 5 +- cnn/cnn.h | 4 + cnn/exec.cc | 5 +- cnn/init.cc | 45 +++++++++++ cnn/{backends/eigen => }/init.h | 0 cnn/{backends/eigen => }/model.cc | 2 +- cnn/{backends/eigen => }/nodes.cc | 45 +++++++++-- cnn/param-nodes.cc | 11 ++- cnn/{backends/eigen => }/random.h | 0 cnn/{backends/eigen => }/saxe-init.cc | 0 cnn/tensor.cc | 110 ++++++++++++++++++++++++++ cnn/tensor.h | 74 +++++++++++++++-- 18 files changed, 303 insertions(+), 255 deletions(-) delete mode 100644 cnn/backends/eigen/init.cc delete mode 100644 cnn/backends/eigen/tensor.cc delete mode 100644 cnn/backends/eigen/tensor.h create mode 100644 cnn/init.cc rename cnn/{backends/eigen => }/init.h (100%) rename cnn/{backends/eigen => }/model.cc (99%) rename cnn/{backends/eigen => }/nodes.cc (95%) rename cnn/{backends/eigen => }/random.h (100%) rename cnn/{backends/eigen => }/saxe-init.cc (100%) create mode 100644 cnn/tensor.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 077486599..0c8f6e4bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,7 +31,7 @@ endfunction() # look for Boost set(Boost_REALPATH ON) #find_package(Boost COMPONENTS program_options serialization REQUIRED) -find_package(Boost COMPONENTS program_options serialization unit_test_framework REQUIRED) +find_package(Boost COMPONENTS program_options serialization REQUIRED) include_directories(${Boost_INCLUDE_DIR}) set(LIBS ${LIBS} ${Boost_LIBRARIES}) @@ -44,21 +44,20 @@ endif() if(BACKEND MATCHES "^eigen$") set(WITH_EIGEN_BACKEND 1) +elseif(BACKEND MATCHES "^cuda$") + set(WITH_CUDA_BACKEND 1) else() - message(SEND_ERROR "BACKEND must be eigen") + message(SEND_ERROR "BACKEND must be eigen or cuda") endif() -if (ENABLE_CUDA) +if (WITH_CUDA_BACKEND) find_package(CUDA REQUIRED) set(CUDA_TOOLKIT_ROOT_DIR ${CUDA_ROOT}) include_directories(SYSTEM ${CUDA_INCLUDE_DIRS}) add_definitions(-DHAVE_CUDA) - set(WITH_CUDA 1) set(LIBS ${LIBS} ${CUDA_LIBRARIES}) #find_cudnn() #include_directories(SYSTEM ${CUDNN_INCLUDE_DIRS}) -else() - message(STATUS "CUDA not enabled (use -DENABLE_CUDA=1)") endif() # look for Eigen diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index dc0aefae9..16f97cd75 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -5,12 +5,17 @@ set(cnn_library_SRCS dict.cc dim.cc exec.cc - nodes-common.cc gru.cc + init.cc lstm.cc + model.cc + nodes.cc + nodes-common.cc param-nodes.cc rnn.cc rnn-state-machine.cc + saxe-init.cc + tensor.cc training.cc ) @@ -32,14 +37,10 @@ set(cnn_library_HDRS training.h ) -if(WITH_EIGEN_BACKEND) +if(WITH_CUDA_BACKEND) list(APPEND cnn_library_SRCS - backends/eigen/saxe-init.cc - backends/eigen/init.cc - backends/eigen/nodes.cc - backends/eigen/tensor.cc - backends/eigen/model.cc) -endif(WITH_EIGEN_BACKEND) + cuda.cc) +endif(WITH_CUDA_BACKEND) file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) @@ -65,12 +66,12 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) # actual target: add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) -if(WITH_CUDA) +if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE") SET(CUDA_PROPAGATE_HOST_FLAGS OFF) - cuda_add_library(cnncuda STATIC backends/cuda/dummy.cu) -endif(WITH_CUDA) + cuda_add_library(cnncuda STATIC gpu-ops.cu) +endif(WITH_CUDA_BACKEND) # target_compile_features(cnn PRIVATE cxx_range_for) diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h index a21cba691..2c7623b4a 100644 --- a/cnn/aligned-mem-pool.h +++ b/cnn/aligned-mem-pool.h @@ -8,6 +8,7 @@ #include //#endif #if HAVE_CUDA +#include "cnn/cuda.h" #include #include #endif @@ -18,11 +19,7 @@ inline void* cnn_mm_malloc(size_t n, size_t align) { //#if HAVE_MM_MALLOC void* ptr = nullptr; #if HAVE_CUDA - if (cudaMalloc(&ptr, n) != cudaSuccess) { - ptr = nullptr; - } else { - std::cerr << "cudaMalloc succeeded: ptr=" << ptr << std::endl; - } + CUDA_CHECK(cudaMalloc(&ptr, n)); #else ptr = _mm_malloc(n, align); #endif @@ -39,10 +36,7 @@ inline void* cnn_mm_malloc(size_t n, size_t align) { inline void cnn_mm_free(void* mem) { //#if HAVE_MM_MALLOC #if HAVE_CUDA - if (cudaFree(mem)) { - std::cerr << "cudaFree failed\n"; - abort(); - } + CUDA_CHECK(cudaFree(mem)); #else _mm_free(mem); #endif @@ -85,7 +79,7 @@ class AlignedMemoryPool { void zero_allocated_memory() { if (used == 0) return; #if HAVE_CUDA - cudaMemset(mem, 0, used); + CUDA_CHECK(cudaMemset(mem, 0, used)); #else std::memset(mem, 0, used); #endif @@ -99,15 +93,15 @@ class AlignedMemoryPool { void zero_all() { //std::cerr << "zeroing " << (used ? used : capacity) << " bytes\n"; #if HAVE_CUDA - cudaMemset(mem, 0, capacity); + CUDA_CHECK(cudaMemset(mem, 0, capacity)); #else std::memset(mem, 0, capacity); #endif } inline static size_t round_up_align(size_t n) { if (AlignedBits < 2) return n; - auto c = (n & ((1 << AlignedBits) - 1)) > 0 ? 1 : 0; - return ((n >> AlignedBits) + c) << AlignedBits; + auto c = (n & ((1 << (AlignedBits)) - 1)) > 0 ? 1 : 0; + return ((n >> (AlignedBits)) + c) << (AlignedBits); } size_t capacity; size_t used; diff --git a/cnn/backends/eigen/init.cc b/cnn/backends/eigen/init.cc deleted file mode 100644 index 43f20387e..000000000 --- a/cnn/backends/eigen/init.cc +++ /dev/null @@ -1,60 +0,0 @@ -#include "cnn/backends/eigen/init.h" -#include "cnn/aligned-mem-pool.h" - -#include -#include -#include - -#if HAVE_CUDA -#include -#include -#include -#endif - -using namespace std; - -namespace cnn { - -AlignedMemoryPool<5>* fxs; -AlignedMemoryPool<5>* dEdfs; - -#if HAVE_CUDA -void Initialize_GPU(int& argc, char**& argv) { - int nDevices; - cudaGetDeviceCount(&nDevices); - if (nDevices < 1) { - cerr << "No GPUs found, recompile without DENABLE_CUDA=1\n"; - abort(); - } - for (int i = 0; i < nDevices; i++) { - cudaDeviceProp prop; - cudaGetDeviceProperties(&prop, i); - cerr << "Device Number: " << i << endl; - cerr << " Device name: " << prop.name << endl; - cerr << " Memory Clock Rate (KHz): " << prop.memoryClockRate << endl; - cerr << " Memory Bus Width (bits): " << prop.memoryBusWidth << endl; - cerr << " Peak Memory Bandwidth (GB/s): " << (2.0*prop.memoryClockRate*(prop.memoryBusWidth/8)/1.0e6) << endl << endl; - } - int selected = 0; - cerr << "**USING DEVICE: " << selected << endl; - cudaSetDevice(selected); -} -#endif - -std::mt19937* rndeng = nullptr; -void Initialize(int& argc, char**& argv) { - cerr << "Initializing...\n"; -#if HAVE_CUDA - Initialize_GPU(argc, argv); -#endif - std::random_device rd; - rndeng = new mt19937(rd()); - cerr << "Allocating memory...\n"; - fxs = new AlignedMemoryPool<5>(100000000); - dEdfs = new AlignedMemoryPool<5>(100000000); - cerr << "Done.\n"; -// rndeng = new mt19937(1); -} - -} // namespace cnn - diff --git a/cnn/backends/eigen/tensor.cc b/cnn/backends/eigen/tensor.cc deleted file mode 100644 index 5f6ba7d20..000000000 --- a/cnn/backends/eigen/tensor.cc +++ /dev/null @@ -1,73 +0,0 @@ -#include "cnn/backends/eigen/tensor.h" - -#include -#include -#include - -using namespace std; - -namespace cnn { - -real as_scalar(const Tensor& t) { - assert(t.d.size() == 1); - return t.v[0]; -} - -std::vector as_vector(const Tensor& v) { - std::vector res(v.d.size()); -#if HAVE_CUDA - cudaMemcpy(&res[0], v.v, sizeof(real) * res.size(), cudaMemcpyHostToDevice); -#else - std::memcpy(&res[0], v.v, sizeof(real) * res.size()); -#endif - return res; -} - -float TensorTools::AccessElement(const Tensor& v, const Dim& index) { -#if HAVE_CUDA - abort(); -#else - return (*v)(index[0], index[1]); -#endif -} - -void TensorTools::Constant(Tensor& d, float c) { - if (!c) { - std::memset(d.v, c, d.d.size() * sizeof(float)); - } else { - std::fill(d.v, d.v + d.d.size(), c); - } -} - -void TensorTools::Zero(Tensor& d) { - Constant(d, 0); -} - -void TensorTools::Randomize(Tensor& val, real scale) { - std::uniform_real_distribution distribution(-scale,scale); - auto b = [&] (real) {return distribution(*rndeng);}; - *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); -} - -void TensorTools::Randomize(Tensor& d) { - Randomize(d, sqrt(6) / sqrt(d.d[0] + d.d[1])); -} - -void TensorTools::RandomBernoulli(Tensor& val, real p) { - std::bernoulli_distribution distribution(p); - auto b = [&] (real) {return distribution(*rndeng);}; - *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); -} - -void TensorTools::RandomizeNormal(real mean, real stddev, Tensor& val) { - std::normal_distribution distribution(mean, stddev); - auto b = [&] (real) {return distribution(*rndeng);}; - *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); -} - -real rand01() { - std::uniform_real_distribution distribution(0, 1); - return distribution(*rndeng); -} - -} // namespace cnn diff --git a/cnn/backends/eigen/tensor.h b/cnn/backends/eigen/tensor.h deleted file mode 100644 index 9a686aa3f..000000000 --- a/cnn/backends/eigen/tensor.h +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef CNN_EIGEN_TENSOR_H -#define CNN_EIGEN_TENSOR_H - -#include -#include - -#include "cnn/dim.h" -#include "cnn/backends/eigen/random.h" - -#if HAVE_CUDA -#include -#include -#endif -#include -// CNN manages its own memory. DO NOT remove the following line -#define EIGEN_NO_MALLOC -#include - -namespace cnn { - -#define EIGEN_BACKEND 1 - -typedef float real; - -struct Tensor { - Tensor() = default; - Tensor(const Dim& d, float* v) : d(d), v(v) {} - const Eigen::Map operator*() const { - return Eigen::Map(v, d.rows(), d.cols()); - } - Eigen::Map operator*() { - return Eigen::Map(v, d.rows(), d.cols()); - } - Dim d; - float* v; - - private: - friend class boost::serialization::access; - template - void save(Archive& ar, const unsigned int) const { - ar & d; - ar & boost::serialization::make_array(v, d.size()); - } - template - void load(Archive& ar, const unsigned int) { - ar & d; - v = static_cast(std::malloc(d.size() * sizeof(float))); - ar & boost::serialization::make_array(v, d.size()); - } - BOOST_SERIALIZATION_SPLIT_MEMBER() -}; - -real as_scalar(const Tensor& t); -std::vector as_vector(const Tensor& v); - -struct TensorTools { - static void Constant(Tensor& d, float c); - static void Zero(Tensor& d); - static void Randomize(Tensor& val, real scale); - static void Randomize(Tensor& d); - static void RandomBernoulli(Tensor& val, real p); - static void RandomizeNormal(real mean, real stddev, Tensor& val); - // AccessElement is very, very slow (potentially) - use appropriately - static float AccessElement(const Tensor& v, const Dim& index); -}; -real rand01(); - -} // namespace cnn - -#endif diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 9656a63b1..6f43479b0 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -8,6 +8,9 @@ using namespace std; namespace cnn { +float* kSCALAR_MINUSONE; +float* kSCALAR_ONE; +float* kSCALAR_ZERO; int n_hgs = 0; Node::~Node() {} @@ -116,7 +119,7 @@ void ComputationGraph::PrintGraphviz() const { for (auto node : nodes) { vector var_names; for (auto arg : node->args) - var_names.push_back(string("v")); // TODO + var_names.push_back(string("v") + to_string((unsigned)arg)); cerr << " N" << nc << " [label=\"v" << nc << " = " << node->as_string(var_names) << "\"];\n"; for (auto arg : node->args) diff --git a/cnn/cnn.h b/cnn/cnn.h index 58f2fd834..beb5b9108 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -8,6 +8,7 @@ #include #include +#include "cnn/init.h" #include "cnn/aligned-mem-pool.h" #include "cnn/tensor.h" #include "cnn/model.h" @@ -25,6 +26,9 @@ namespace cnn { extern AlignedMemoryPool<5>* fxs; extern AlignedMemoryPool<5>* dEdfs; +extern float* kSCALAR_MINUSONE; +extern float* kSCALAR_ONE; +extern float* kSCALAR_ZERO; class ExecutionEngine; struct ParameterNodeBase; diff --git a/cnn/exec.cc b/cnn/exec.cc index a57e40d91..4eec90bfd 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -24,7 +24,7 @@ const Tensor& SimpleExecutionEngine::incremental_forward() { return nfxs.back(); //vector dummy(5, "x"); - vector xs; + vector xs(16); for (; last_node_evaluated < node_max_index; ++last_node_evaluated) { const Node* node = cg.nodes[last_node_evaluated]; xs.resize(node->arity()); @@ -35,6 +35,7 @@ const Tensor& SimpleExecutionEngine::incremental_forward() { } nfxs[last_node_evaluated].d = node->dim; nfxs[last_node_evaluated].v = static_cast(fxs->allocate(node->dim.size() * sizeof(float))); + //cerr << "CALLING: " << node->as_string(dummy) << endl; node->forward(xs, nfxs[last_node_evaluated]); } return nfxs.back(); @@ -56,7 +57,7 @@ void SimpleExecutionEngine::backward() { } dEdfs->zero_allocated_memory(); // initialize dE/dE = 1 - ndEdfs.back().v[0] = 1; + ndEdfs.back().v = kSCALAR_ONE; // here we find constant paths to avoid doing extra work const unsigned num_nodes = cg.nodes.size(); diff --git a/cnn/init.cc b/cnn/init.cc new file mode 100644 index 000000000..34b468444 --- /dev/null +++ b/cnn/init.cc @@ -0,0 +1,45 @@ +#include "cnn/init.h" +#include "cnn/aligned-mem-pool.h" + +#include +#include +#include + +#if HAVE_CUDA +#include "cnn/cuda.h" +#include +#endif + +using namespace std; + +namespace cnn { + +#define ALIGN 12 +AlignedMemoryPool* fxs; +AlignedMemoryPool* dEdfs; + +mt19937* rndeng = nullptr; + +void Initialize(int& argc, char**& argv) { + cerr << "Initializing...\n"; +#if HAVE_CUDA + Initialize_GPU(argc, argv); +#else + kSCALAR_MINUSONE = new float; + *kSCALAR_MINUSONE = -1; + kSCALAR_ONE = new float; + *kSCALAR_ONE = 1; + kSCALAR_ZERO = new float; + *kSCALAR_ZERO = 0; +#endif + random_device rd; + rndeng = new mt19937(rd()); +// rndeng = new mt19937(1); + cerr << "Allocating memory...\n"; + fxs = new AlignedMemoryPool(100000000); + dEdfs = new AlignedMemoryPool(100000000); + cerr << "Done.\n"; +} + +} // namespace cnn + diff --git a/cnn/backends/eigen/init.h b/cnn/init.h similarity index 100% rename from cnn/backends/eigen/init.h rename to cnn/init.h diff --git a/cnn/backends/eigen/model.cc b/cnn/model.cc similarity index 99% rename from cnn/backends/eigen/model.cc rename to cnn/model.cc index 1251f6f90..fdce584c7 100644 --- a/cnn/backends/eigen/model.cc +++ b/cnn/model.cc @@ -5,7 +5,7 @@ #include #include -#define CNN_ALIGN 32 +#define CNN_ALIGN 256 using namespace std; diff --git a/cnn/backends/eigen/nodes.cc b/cnn/nodes.cc similarity index 95% rename from cnn/backends/eigen/nodes.cc rename to cnn/nodes.cc index 7a7b80dc9..340d65ee4 100644 --- a/cnn/backends/eigen/nodes.cc +++ b/cnn/nodes.cc @@ -4,6 +4,11 @@ #include #include +#if HAVE_CUDA +#include "cnn/cuda.h" +#include "cnn/gpu-ops.h" +#endif + using namespace std; // notes on implementing differentiable components @@ -63,7 +68,7 @@ void KMHNGram::forward(const vector& xs, Tensor& fx) const { res.setZero(); for (int j = 0; j < new_cols; ++j) { auto c_j = res.col(j); - for (int k = 0; k < n; ++k) + for (unsigned k = 0; k < n; ++k) c_j += x.col(j + k); } } @@ -75,7 +80,7 @@ void KMHNGram::backward(const vector& xs, Tensor& dEdxi) const { const int c = dEdf.d.cols(); for (int j = 0; j < c; ++j) - for (int k = 0; k < n; ++k) + for (unsigned k = 0; k < n; ++k) (*dEdxi).col(j+k) += (*dEdf).col(j); } @@ -161,6 +166,10 @@ void Sum::forward(const vector& xs, Tensor& fx) const { fx.v = xs[0]->v; return; } +#if HAVE_CUDA + for (unsigned i = 0; i < num_args; ++i) + CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[i]->v, 1, fx.v, 1)); +#else auto res = *fx; const unsigned remainder = num_args % 4; switch (remainder) { @@ -171,6 +180,7 @@ void Sum::forward(const vector& xs, Tensor& fx) const { } for (unsigned i = remainder; i < num_args; i += 4) res += **xs[i] + **xs[i+1] + **xs[i+2] + **xs[i+3]; +#endif } void Sum::backward(const vector& xs, @@ -188,8 +198,12 @@ struct FTanh { }; void Tanh::forward(const vector& xs, Tensor& fx) const { +#if HAVE_CUDA + gpu::vtanh(fx.d.size(), xs[0]->v, fx.v); +#else auto x = **xs[0]; *fx = x.unaryExpr(FTanh()); +#endif } struct FTanhBackward { @@ -256,10 +270,14 @@ void Concatenate::forward(const vector& xs, Tensor& fx) const { unsigned k = 0; for (auto x : xs) { src_row_indices[k++] = ind; - auto xi = **x; - assert(xi.cols() == 1); // this can be relaxed to the same everywhere - const unsigned rows = xi.rows(); - (*fx).block(ind, 0, rows, 1) = xi; + auto xi = *x; + assert(xi.d.cols() == 1); // this can be relaxed to the same everywhere + const unsigned rows = xi.d.rows(); +#if HAVE_CUDA + CUDA_CHECK(cudaMemcpyAsync(&fx.v[ind], &xi.v[0], sizeof(float) * rows, cudaMemcpyDeviceToDevice)); +#else + (*fx).block(ind, 0, rows, 1) = *xi; +#endif ind += rows; } } @@ -587,7 +605,7 @@ void PickRange::forward(const vector& xs, Tensor& fx) const { assert(start >= 0); assert(end <= x.rows()); assert(start < end); - assert(fx.d.rows() == end-start); + assert(int(fx.d.rows()) == int(end-start)); (*fx) = x.block(start, 0, end-start, 1); } @@ -598,16 +616,23 @@ void PickRange::backward(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i == 0); - assert(dEdf.d.rows() == end-start); + assert(int(dEdf.d.rows()) == int(end-start)); assert(dEdf.d.cols() == 1); (*dEdxi).block(start, 0, end-start, 1) += (*dEdf); } void MatrixMultiply::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); +#if HAVE_CUDA + auto x1 = *xs[0]; + auto x2 = *xs[1]; + CUBLAS_CHECK(cublasSgemv(cublas_handle, CUBLAS_OP_N, x1.d.rows(), x1.d.cols(), + kSCALAR_ONE, x1.v, x1.d.rows(), x2.v, 1, kSCALAR_ZERO, fx.v, 1)); +#else auto x1 = **xs[0]; auto x2 = **xs[1]; (*fx).noalias() = x1 * x2; +#endif } void MatrixMultiply::backward(const vector& xs, @@ -715,9 +740,13 @@ void Rectify::backward(const vector& xs, void SquaredEuclideanDistance::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); +#if HAVE_CUDA + gpu::sqeucdist(xs[0]->d.size(), xs[0]->v, xs[1]->v, fx.v); +#else auto x1 = **xs[0]; auto x2 = **xs[1]; fx.v[0] = (x1 - x2).squaredNorm(); +#endif } void SquaredEuclideanDistance::backward(const vector& xs, diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index db01d00ce..66ef5f0f1 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -48,8 +48,11 @@ Dim InputNode::dim_forward(const vector& xs) const { void InputNode::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - assert((int)dim.size() == (int)pdata->size()); +#if HAVE_CUDA + cudaMemcpy(fx.v, &pdata->front(), dim.size() * sizeof(float), cudaMemcpyHostToDevice); +#else memcpy(fx.v, &pdata->front(), dim.size() * sizeof(float)); +#endif } void InputNode::backward(const vector& xs, @@ -63,7 +66,7 @@ void InputNode::backward(const vector& xs, string ScalarInputNode::as_string(const vector& arg_names) const { ostringstream s; - s << "scalar_constant(" << *pdata << ')'; + s << "scalar_constant(" << pdata << ')'; return s.str(); } @@ -73,7 +76,11 @@ Dim ScalarInputNode::dim_forward(const vector& xs) const { void ScalarInputNode::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); +#if HAVE_CUDA + cudaMemcpy(fx.v, pdata, 1 * sizeof(float), cudaMemcpyHostToDevice); +#else fx.v[0] = *pdata; +#endif } void ScalarInputNode::backward(const vector& xs, diff --git a/cnn/backends/eigen/random.h b/cnn/random.h similarity index 100% rename from cnn/backends/eigen/random.h rename to cnn/random.h diff --git a/cnn/backends/eigen/saxe-init.cc b/cnn/saxe-init.cc similarity index 100% rename from cnn/backends/eigen/saxe-init.cc rename to cnn/saxe-init.cc diff --git a/cnn/tensor.cc b/cnn/tensor.cc new file mode 100644 index 000000000..552eddfcd --- /dev/null +++ b/cnn/tensor.cc @@ -0,0 +1,110 @@ +#include "cnn/tensor.h" + +#include +#include +#include + +#if HAVE_CUDA +#include "cnn/cuda.h" +#endif + +using namespace std; + +namespace cnn { + +ostream& operator<<(ostream& os, const Tensor& t) { +#if HAVE_CUDA + vector vt = as_vector(t); + Eigen::Map m(&vt[0], t.d.rows(), t.d.cols()); + os << m; +#else + os << (*t); +#endif + return os; +} + +real as_scalar(const Tensor& t) { + assert(t.d.size() == 1); +#if HAVE_CUDA + float res; + CUDA_CHECK(cudaMemcpy(&res, t.v, sizeof(float), cudaMemcpyDeviceToHost)); + return res; +#else + return t.v[0]; +#endif +} + +vector as_vector(const Tensor& v) { + vector res(v.d.size()); +#if HAVE_CUDA + CUDA_CHECK(cudaMemcpy(&res[0], v.v, sizeof(real) * res.size(), cudaMemcpyDeviceToHost)); +#else + memcpy(&res[0], v.v, sizeof(real) * res.size()); +#endif + return res; +} + +float TensorTools::AccessElement(const Tensor& v, const Dim& index) { +#if HAVE_CUDA + abort(); +#else + return (*v)(index[0], index[1]); +#endif +} + +void TensorTools::Constant(Tensor& d, float c) { +#if HAVE_CUDA + if (!c) { + CUDA_CHECK(cudaMemset(d.v, 0, d.d.size() * sizeof(float))); + } else { + fill(d.v, d.v + d.d.size(), c); + } +#else + if (!c) { + CUDA_CHECK(memset(d.v, c, d.d.size() * sizeof(float))); + } else { + fill(d.v, d.v + d.d.size(), c); + } +#endif +} + +void TensorTools::Zero(Tensor& d) { + Constant(d, 0); +} + +void TensorTools::Randomize(Tensor& val, real scale) { + uniform_real_distribution distribution(-scale,scale); + auto b = [&] (real) {return distribution(*rndeng);}; +#if HAVE_CUDA + float* t = new float[val.d.size()]; + Eigen::Map m(t, val.d.rows(), val.d.cols()); + m = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); + CUDA_CHECK(cudaMemcpy(val.v, t, sizeof(real) * val.d.size(), cudaMemcpyHostToDevice)); + delete[] t; +#else + *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); +#endif +} + +void TensorTools::Randomize(Tensor& d) { + Randomize(d, sqrt(6) / sqrt(d.d[0] + d.d[1])); +} + +void TensorTools::RandomBernoulli(Tensor& val, real p) { + bernoulli_distribution distribution(p); + auto b = [&] (real) {return distribution(*rndeng);}; + *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); +} + +void TensorTools::RandomizeNormal(real mean, real stddev, Tensor& val) { + normal_distribution distribution(mean, stddev); + auto b = [&] (real) {return distribution(*rndeng);}; + *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); +} + +real rand01() { + uniform_real_distribution distribution(0, 1); + return distribution(*rndeng); +} + +} // namespace cnn diff --git a/cnn/tensor.h b/cnn/tensor.h index 86a02e301..822a12d3b 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -1,14 +1,72 @@ -#ifndef CNN_TENSOR_H_ -#define CNN_TENSOR_H_ +#ifndef CNN_EIGEN_TENSOR_H +#define CNN_EIGEN_TENSOR_H + +#include +#include -#include "config.h" #include "cnn/dim.h" +#include "cnn/random.h" -#ifdef WITH_EIGEN_BACKEND -# include "backends/eigen/init.h" -# include "backends/eigen/tensor.h" -#else -# error "Don't know any backend but Eigen" +#if HAVE_CUDA +#include +#include +#include "cnn/cuda.h" #endif +#include +// CNN manages its own memory. DO NOT remove the following line +#define EIGEN_NO_MALLOC +#include + +namespace cnn { + +#define EIGEN_BACKEND 1 + +typedef float real; + +struct Tensor { + Tensor() = default; + Tensor(const Dim& d, float* v) : d(d), v(v) {} + const Eigen::Map operator*() const { + return Eigen::Map(v, d.rows(), d.cols()); + } + Eigen::Map operator*() { + return Eigen::Map(v, d.rows(), d.cols()); + } + Dim d; + float* v; + + private: + friend class boost::serialization::access; + template + void save(Archive& ar, const unsigned int) const { + ar & d; + ar & boost::serialization::make_array(v, d.size()); + } + template + void load(Archive& ar, const unsigned int) { + ar & d; + v = static_cast(std::malloc(d.size() * sizeof(float))); + ar & boost::serialization::make_array(v, d.size()); + } + BOOST_SERIALIZATION_SPLIT_MEMBER() +}; + +std::ostream& operator<<(std::ostream& os, const Tensor& t); +real as_scalar(const Tensor& t); +std::vector as_vector(const Tensor& v); + +struct TensorTools { + static void Constant(Tensor& d, float c); + static void Zero(Tensor& d); + static void Randomize(Tensor& val, real scale); + static void Randomize(Tensor& d); + static void RandomBernoulli(Tensor& val, real p); + static void RandomizeNormal(real mean, real stddev, Tensor& val); + // AccessElement is very, very slow (potentially) - use appropriately + static float AccessElement(const Tensor& v, const Dim& index); +}; +real rand01(); + +} // namespace cnn #endif From e9e2ae724cf9970d6d69a43c61ee0afdb2f1fe87 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 16 May 2015 21:27:37 -0400 Subject: [PATCH 037/965] fix for non-gpu version --- cnn/init.cc | 3 ++- cnn/tensor.cc | 2 +- examples/xor.cc | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cnn/init.cc b/cnn/init.cc index 34b468444..1ffa7a3a4 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -1,5 +1,6 @@ #include "cnn/init.h" #include "cnn/aligned-mem-pool.h" +#include "cnn/cnn.h" #include #include @@ -14,7 +15,7 @@ using namespace std; namespace cnn { -#define ALIGN 12 +#define ALIGN 5 AlignedMemoryPool* fxs; AlignedMemoryPool* dEdfs; diff --git a/cnn/tensor.cc b/cnn/tensor.cc index 552eddfcd..4954a707d 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -61,7 +61,7 @@ void TensorTools::Constant(Tensor& d, float c) { } #else if (!c) { - CUDA_CHECK(memset(d.v, c, d.d.size() * sizeof(float))); + memset(d.v, c, d.d.size() * sizeof(float)); } else { fill(d.v, d.v + d.d.size(), c); } diff --git a/examples/xor.cc b/examples/xor.cc index cc555d57a..a7f26ee13 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -45,7 +45,7 @@ int main(int argc, char** argv) { // two options: MatrixMultiply and Sum, or AffineTransform // these are identical, but AffineTransform may be slightly more efficient -#if 0 +#if 1 VariableIndex i_f = cg.add_function({i_W, i_x}); VariableIndex i_g = cg.add_function({i_f, i_b}); #else From 1bc893b3b1193c72e7d2207d2d70f188e4b681ec Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 16 May 2015 22:05:45 -0400 Subject: [PATCH 038/965] add pairwise ranking loss --- cnn/nodes-common.cc | 17 +++++++++++++++++ cnn/nodes.cc | 39 +++++++++++++++++++++++++++++++++------ cnn/nodes.h | 16 ++++++++++++++++ examples/embed-cl.cc | 6 ++---- 4 files changed, 68 insertions(+), 10 deletions(-) diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index c26ff002a..3000bd497 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -215,6 +215,23 @@ Dim ConcatenateColumns::dim_forward(const vector& xs) const { return Dim({rows, new_cols}); } +string PairwiseRankLoss::as_string(const vector& arg_names) const { + ostringstream os; + os << "max(0, " << margin << " - " << arg_names[0] << " + " << arg_names[1] << ')'; + return os.str(); +} + +Dim PairwiseRankLoss::dim_forward(const vector& xs) const { + if (xs.size() != 2 || + xs[0] != xs[1] || + xs[0].rows() != 1 || + (xs[0].ndims() != 1 && xs[0].ndims() != 2)) { + cerr << "Bad input dimensions in PairwiseRankLoss: " << xs << endl; + abort(); + } + return xs[0]; +} + string Hinge::as_string(const vector& arg_names) const { ostringstream os; os << "hinge(" << arg_names[0] << ",m=" << margin << ")"; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 340d65ee4..49944f129 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -306,6 +306,39 @@ void ConcatenateColumns::backward(const vector& xs, *dEdxi += (*dEdf).col(i); } +struct FPairwiseRankLoss { + FPairwiseRankLoss(float m) : margin(m) {} + float operator()(float a, float b) const { + float d = margin - a + b; + return d > 0.f ? d : 0.f; + } + float margin; +}; + +void PairwiseRankLoss::forward(const vector& xs, Tensor& fx) const { + auto a = **xs[0]; + auto b = **xs[1]; + *fx = a.binaryExpr(b, FPairwiseRankLoss(margin)); +} + +struct FRectifyBackward { + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float t, float d) const { + return (t) ? d : 0.f; + } +}; + +void PairwiseRankLoss::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + if (i == 0) { + *dEdxi -= (*fx).binaryExpr(*dEdf, FRectifyBackward()); + } else { + *dEdxi += (*fx).binaryExpr(*dEdf, FRectifyBackward()); + } +} + void Hinge::forward(const vector& xs, Tensor& fx) const { cerr << "FIX IMPL3\n"; abort(); #if 0 @@ -724,12 +757,6 @@ void Rectify::forward(const vector& xs, Tensor& fx) const { *fx = x.unaryExpr(FRectify()); } -struct FRectifyBackward { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float t, float d) const { - return (t) ? d : 0.f; - } -}; - void Rectify::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, diff --git a/cnn/nodes.h b/cnn/nodes.h index 85e872617..5b4de627e 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -195,6 +195,22 @@ struct ConcatenateColumns : public Node { Tensor& dEdxi) const override; }; +// x_1 is a scalar (or row vector) +// x_2 is a scalar (or row vector) +// y = max(0, margin - x_1 + x_2) +struct PairwiseRankLoss : public Node { + explicit PairwiseRankLoss(const std::initializer_list& a, real m = 1.0) : Node(a), margin(m) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; + real margin; +}; + // Let x be a vector-valued input, x_i represents the score of the ith element, then // y = \sum{i != element} max{0, margin - x_element + x_i} struct Hinge : public Node { diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index d3a8b55c0..3e54033c5 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -163,7 +163,6 @@ int main(int argc, char** argv) { VariableIndex i_t = emb.EmbedTarget(trg, cg); VariableIndex i_sim = cg.add_function({i_s,i_t}); float margin = 2; - VariableIndex i_ms = cg.add_function({i_sim}, margin); const unsigned K = 20; vector noise(K); for (unsigned j = 0; j < K; ++j) { @@ -171,10 +170,9 @@ int main(int argc, char** argv) { while (s == order[si] || s == training.size()) { s = rand01() * training.size(); } VariableIndex i_n_j = emb.EmbedTarget(training[s].second, cg); VariableIndex i_sim_n = cg.add_function({i_s,i_n_j}); - noise[j] = cg.add_function({i_ms, i_sim_n}); + noise[j] = cg.add_function({i_sim, i_sim_n}, margin); } - VariableIndex i_v = cg.add_function({cg.add_function(noise)}); - cg.add_function({i_v}); + cg.add_function(noise); auto iloss = as_scalar(cg.forward()); assert(iloss >= 0); if (iloss > 0) { From b273ad8d5cf31d9125e909e849659523b0155f83 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 17 May 2015 15:35:43 -0400 Subject: [PATCH 039/965] reduce number of memory accesses during clipping --- cnn/training.cc | 19 ++++++++++++++----- cnn/training.h | 5 +++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/cnn/training.cc b/cnn/training.cc index b542d78f2..d71c8187a 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -6,7 +6,8 @@ using namespace std; Trainer::~Trainer() {} -void Trainer::clip_gradients() { +float Trainer::clip_gradients() { + float gscale = 1; if (clipping_enabled) { double gg = 0; for (auto p : model->all_parameters_list()) @@ -14,23 +15,31 @@ void Trainer::clip_gradients() { gg = sqrt(gg); if (gg > clip_threshold) { ++clips; - for (auto p : model->all_parameters_list()) - p->rescale_gradient(clip_threshold / gg); + gscale = clip_threshold / gg; } } + return gscale; } void SimpleSGDTrainer::update(real scale) { - clip_gradients(); + const float gscale = clip_gradients(); for (auto p : model->parameters_list()) { +#if HAVE_CUDA + cerr << "implement update\n"; abort(); +#else auto reg = (*p->values) * lambda; - *p->values -= ((eta * scale) * *p->g + reg); + *p->values -= ((eta * scale * gscale) * *p->g + reg); +#endif p->clear(); } for (auto p : model->lookup_parameters_list()) { for (auto i : p->non_zero_grads) { +#if HAVE_CUDA + cerr << "implement lookup update\n"; abort(); +#else auto reg = (*p->values[i]) * lambda; *p->values[i] -= (*p->grads[i] * (eta * scale) + reg); +#endif } p->clear(); } diff --git a/cnn/training.h b/cnn/training.h index 156e4755e..80164569a 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -19,8 +19,9 @@ struct Trainer { eta = eta0 / (1 + epoch * eta_decay); } - // if clipping is enabled and the gradient is too big, clip - void clip_gradients(); + // if clipping is enabled and the gradient is too big, return the amount to + // scale the gradient by (otherwise 1) + float clip_gradients(); // learning rates real eta0; From 6cef22c05032d540c96b032f983df004e76ea9ef Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 17 May 2015 15:47:27 -0400 Subject: [PATCH 040/965] scale properly --- cnn/training.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/training.cc b/cnn/training.cc index d71c8187a..a438d6c23 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -38,7 +38,7 @@ void SimpleSGDTrainer::update(real scale) { cerr << "implement lookup update\n"; abort(); #else auto reg = (*p->values[i]) * lambda; - *p->values[i] -= (*p->grads[i] * (eta * scale) + reg); + *p->values[i] -= (*p->grads[i] * (eta * scale * gscale) + reg); #endif } p->clear(); From 62a03d82850ed207a9940c96c9e2d2e82807f6ac Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 17 May 2015 20:49:59 -0400 Subject: [PATCH 041/965] basic GPU support --- cnn/cuda.cc | 44 ++++++++++++++++++++++ cnn/cuda.h | 51 +++++++++++++++++++++++++ cnn/gpu-ops.cu | 99 +++++++++++++++++++++++++++++++++++++++++++++++++ cnn/gpu-ops.h | 17 +++++++++ cnn/init.cc | 9 ++--- cnn/model.cc | 51 ++++++++++++++++++------- cnn/model.h | 10 ++--- cnn/nodes.cc | 52 +++++++++++++++++++++++--- cnn/training.cc | 10 ++--- 9 files changed, 308 insertions(+), 35 deletions(-) create mode 100644 cnn/cuda.cc create mode 100644 cnn/cuda.h create mode 100644 cnn/gpu-ops.cu create mode 100644 cnn/gpu-ops.h diff --git a/cnn/cuda.cc b/cnn/cuda.cc new file mode 100644 index 000000000..ab0888daa --- /dev/null +++ b/cnn/cuda.cc @@ -0,0 +1,44 @@ +#include + +#include "cnn/cnn.h" +#include "cnn/cuda.h" + +using namespace std; + +namespace cnn { + +cublasHandle_t cublas_handle; + +void Initialize_GPU(int& argc, char**& argv) { + int nDevices; + CUDA_CHECK(cudaGetDeviceCount(&nDevices)); + if (nDevices < 1) { + cerr << "No GPUs found, recompile without DENABLE_CUDA=1\n"; + abort(); + } + for (int i = 0; i < nDevices; i++) { + cudaDeviceProp prop; + CUDA_CHECK(cudaGetDeviceProperties(&prop, i)); + cerr << "Device Number: " << i << endl; + cerr << " Device name: " << prop.name << endl; + cerr << " Memory Clock Rate (KHz): " << prop.memoryClockRate << endl; + cerr << " Memory Bus Width (bits): " << prop.memoryBusWidth << endl; + cerr << " Peak Memory Bandwidth (GB/s): " << (2.0*prop.memoryClockRate*(prop.memoryBusWidth/8)/1.0e6) << endl << endl; + } + int selected = 0; + cerr << "**USING DEVICE: " << selected << endl; + CUDA_CHECK(cudaSetDevice(selected)); + CUBLAS_CHECK(cublasCreate(&cublas_handle)); + CUBLAS_CHECK(cublasSetPointerMode(cublas_handle, CUBLAS_POINTER_MODE_DEVICE)); + CUDA_CHECK(cudaMalloc(&kSCALAR_MINUSONE, sizeof(float))); + CUDA_CHECK(cudaMalloc(&kSCALAR_ONE, sizeof(float))); + CUDA_CHECK(cudaMalloc(&kSCALAR_ZERO, sizeof(float))); + float minusone = -1; + CUDA_CHECK(cudaMemcpy(kSCALAR_MINUSONE, &minusone, sizeof(float), cudaMemcpyHostToDevice)); + float one = 1; + CUDA_CHECK(cudaMemcpy(kSCALAR_ONE, &one, sizeof(float), cudaMemcpyHostToDevice)); + float zero = 0; + CUDA_CHECK(cudaMemcpy(kSCALAR_ZERO, &zero, sizeof(float), cudaMemcpyHostToDevice)); +} + +} // namespace cnn diff --git a/cnn/cuda.h b/cnn/cuda.h new file mode 100644 index 000000000..4ea677f78 --- /dev/null +++ b/cnn/cuda.h @@ -0,0 +1,51 @@ +#ifndef CNN_CUDA_H +#define CNN_CUDA_H +#if HAVE_CUDA + +#include +#include +#include +#include +#include + +#define CUDA_CHECK(stmt) do { \ + cudaError_t err = stmt; \ + if (err != cudaSuccess) { \ + std::cerr << "CUDA failure in " << #stmt << std::endl\ + << cudaGetErrorString(err) << std::endl; \ + abort(); \ + } \ + } while(0) + +#define CUBLAS_CHECK(stmt) do { \ + cublasStatus_t stat = stmt; \ + if (stat != CUBLAS_STATUS_SUCCESS) { \ + std::cerr << "CUBLAS failure in " << #stmt \ + << std::endl << stat << std::endl; \ + abort(); \ + } \ + } while(0) + +namespace cnn { + +inline std::pair SizeToBlockThreadPair(int n) { + assert(n); + int logn; + asm("\tbsr %1, %0\n" + : "=r"(logn) + : "r" (n-1)); + logn = logn > 9 ? 9 : (logn < 4 ? 4 : logn); + ++logn; + int threads = 1 << logn; + int blocks = (n + threads - 1) >> logn; + blocks = blocks > 128 ? 128 : blocks; + return std::make_pair(blocks, threads); +} + +void Initialize_GPU(int& argc, char**& argv); +extern cublasHandle_t cublas_handle; + +} // namespace cnn + +#endif +#endif diff --git a/cnn/gpu-ops.cu b/cnn/gpu-ops.cu new file mode 100644 index 000000000..8ef799387 --- /dev/null +++ b/cnn/gpu-ops.cu @@ -0,0 +1,99 @@ +#include "cnn/gpu-ops.h" +#include "cnn/cuda.h" + +#include +#include +#include +#include + +namespace cnn { +namespace gpu { + +template +__global__ void unaryExprKernel(int n, const float* x, float* y, Func func) { + int i = threadIdx.x + blockIdx.x * blockDim.x; + while (i < n) { + y[i] = func(x[i]); + i += gridDim.x * blockDim.x; + } +} + +template +__global__ void binaryExprAccKernel(int n, const float* x0, const float* x1, float* y, Func func) { + int i = threadIdx.x + blockIdx.x * blockDim.x; + while (i < n) { + y[i] += func(x0[i], x1[i]); + i += gridDim.x * blockDim.x; + } +} + +struct FTanh { + __device__ inline float operator()(float x) const { return tanh(x); } +}; + +void vtanh(int n, float* x, float* y) { + auto tb = SizeToBlockThreadPair(n); + unaryExprKernel<<>>(n, x, y, FTanh()); +} + +struct FTanhBackward { + __device__ inline float operator()(float t, float d) const { + return (1.f - t * t) * d; + } +}; + +void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx) { + auto tb = SizeToBlockThreadPair(n); + binaryExprAccKernel<<>>(n, fx, dEdf, dEdx, FTanhBackward()); +} + +struct FSqDist { + __device__ inline float operator()(float a, float b) const { + float d = a - b; + return d * d; + } +}; + +struct FEuclideanBackward { + FEuclideanBackward(int i, const float* s) : i(i), scalar(s) {} + __device__ inline float operator()(float a, float b) const { + return (i == 0 ? 2.f : -2.f) * (*scalar) * (a - b); + } + int i; + const float* scalar; +}; + +template +__global__ void slowReduceKernel(int n, float* x, float* y, float* r, Func func) { + float tr = 0; + for (int i = 0; i < n; ++i) + tr += func(x[i], y[i]); + r[0] = tr; +} + +void sqeucdist(int n, float* x, float *y, float* res) { + slowReduceKernel<<<1,1>>>(n, x, y, res, FSqDist()); +} + +void sqeucdist_backward(int n, const float* dEdy, const float* x0, const float* x1, float* dEdx, int i) { + auto tb = SizeToBlockThreadPair(n); + binaryExprAccKernel<<>>(n, x0, x1, dEdx, FEuclideanBackward(i, dEdy)); +} + +struct FL2SGDUpdate { + FL2SGDUpdate(float l, float s) : lambda(l), scale(-s) {} + __device__ inline float operator()(float x, float g) const { + float r = x * lambda; + return scale * g - r; + } + float lambda; + float scale; +}; + +void sgd_update(int n, const float* g, float* x, float scale, float lambda) { + auto tb = SizeToBlockThreadPair(n); + binaryExprAccKernel<<>>(n, x, g, x, FL2SGDUpdate(lambda, scale)); +} + +} // namespace gpu +} // namespace cnn diff --git a/cnn/gpu-ops.h b/cnn/gpu-ops.h new file mode 100644 index 000000000..703f9631a --- /dev/null +++ b/cnn/gpu-ops.h @@ -0,0 +1,17 @@ +#ifndef CNN_GPU_OPS_H +#define CNN_GPU_OPS_H + +namespace cnn { +namespace gpu { + +void vtanh(int n, float* x, float* y); +void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx); +void sqeucdist(int n, float* x, float *y, float* res); +void sqeucdist_backward(int n, const float* dEdy, const float* x0, const float* x1, float* dEdx, int i); + +void sgd_update(int n, const float* g, float* x, float scale, float lambda); + +} // namespace gpu +} // namespace cnn + +#endif diff --git a/cnn/init.cc b/cnn/init.cc index 1ffa7a3a4..fb2a99950 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -16,9 +16,8 @@ using namespace std; namespace cnn { #define ALIGN 5 -AlignedMemoryPool* fxs; -AlignedMemoryPool* dEdfs; - +AlignedMemoryPool* fxs = nullptr; +AlignedMemoryPool* dEdfs = nullptr; mt19937* rndeng = nullptr; void Initialize(int& argc, char**& argv) { @@ -34,8 +33,8 @@ void Initialize(int& argc, char**& argv) { *kSCALAR_ZERO = 0; #endif random_device rd; - rndeng = new mt19937(rd()); -// rndeng = new mt19937(1); +// rndeng = new mt19937(rd()); + rndeng = new mt19937(1); cerr << "Allocating memory...\n"; fxs = new AlignedMemoryPool(100000000); dEdfs = new AlignedMemoryPool(100000000); diff --git a/cnn/model.cc b/cnn/model.cc index fdce584c7..18b1a782b 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -1,11 +1,15 @@ #include "cnn/model.h" #include "cnn/tensor.h" #include "cnn/aligned-mem-pool.h" +#include "cnn/cnn.h" #include #include #define CNN_ALIGN 256 +#if HAVE_CUDA +#include "cnn/cuda.h" +#endif using namespace std; @@ -23,13 +27,25 @@ Parameters::Parameters(const Dim& d) : dim(d) { size_t Parameters::size() const { return dim.size(); } -void Parameters::rescale_gradient(real scale) { *g *= scale; } - -real Parameters::g_squared_l2norm() const { - return (*g).squaredNorm(); +void Parameters::g_squared_l2norm(float* sqnorm) const { +#if HAVE_CUDA +// TODO compute norm of gradient - should this be done sparsely or should the gradient +// be allocated in a single block? +// CUBLAS_CHECK(cublasSnrm2(cublas_handle, xs[0]->d.size(), xs[0]->v, 1, fx.v)); +// cerr << "RES: " << fx << endl; + *sqnorm = 1; +#else + *sqnorm = (*g).squaredNorm(); +#endif } -void Parameters::accumulate_grad(const Tensor& d) { *g += *d; } +void Parameters::accumulate_grad(const Tensor& d) { +#if HAVE_CUDA + CUBLAS_CHECK(cublasSaxpy(cublas_handle, g.d.size(), kSCALAR_ONE, d.v, 1, g.v, 1)); +#else + *g += *d; +#endif +} void Parameters::clear() { TensorTools::Zero(g); @@ -50,19 +66,23 @@ LookupParameters::LookupParameters(unsigned n, const Dim& d) : dim(d), values(n) } void LookupParameters::Initialize(unsigned index, const vector& val) { - assert(val.size() == dim.size()); + assert(int(val.size()) == int(dim.size())); +#if HAVE_CUDA + cerr << "implement LookupParameters::Initialize\n"; abort(); +#else memcpy(values[index].v, &val[0], val.size() * sizeof(float)); +#endif } size_t LookupParameters::size() const { return values.size() * dim.size(); } -real LookupParameters::g_squared_l2norm() const { +void LookupParameters::g_squared_l2norm(float* sqnorm) const { real a = 0; for (auto i : non_zero_grads) a += (*grads[i]).squaredNorm(); - return a; + *sqnorm = a; } void LookupParameters::accumulate_grad(unsigned index, const Tensor& d) { @@ -70,11 +90,6 @@ void LookupParameters::accumulate_grad(unsigned index, const Tensor& d) { *grads[index] += *d; } -void LookupParameters::rescale_gradient(real scale) { - for (auto i : non_zero_grads) - *grads[i] *= scale; -} - void LookupParameters::clear() { for (auto i : non_zero_grads) (*grads[i]).setZero(); @@ -85,6 +100,16 @@ Model::~Model() { for (auto p : all_params) delete p; } +void Model::gradient_l2_norm(float* norm) const { + double gg = 0; + for (auto p : all_params) { + float sqn = 0; + p->g_squared_l2norm(&sqn); + gg += sqn; + } + *norm = sqrt(gg); +} + Parameters* Model::add_parameters(const Dim& d) { Parameters* p = new Parameters(d); all_params.push_back(p); diff --git a/cnn/model.h b/cnn/model.h index 9f2fc903b..8bb3d23e3 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -19,8 +19,7 @@ namespace cnn { struct ParametersBase { friend class Model; - virtual void rescale_gradient(real scale) = 0; - virtual real g_squared_l2norm() const = 0; + virtual void g_squared_l2norm(float* sqnorm) const = 0; virtual size_t size() const = 0; virtual ~ParametersBase(); }; @@ -28,8 +27,7 @@ struct ParametersBase { // represents parameters (e.g., a weight matrix) that will be optimized struct Parameters : public ParametersBase { friend class Model; - void rescale_gradient(real scale) override; - real g_squared_l2norm() const override; + void g_squared_l2norm(float* sqnorm) const override; size_t size() const override; void accumulate_grad(const Tensor& g); @@ -51,8 +49,7 @@ struct Parameters : public ParametersBase { // represents a matrix/vector embedding of a discrete set struct LookupParameters : public ParametersBase { friend class Model; - void rescale_gradient(real scale) override; - real g_squared_l2norm() const override; + void g_squared_l2norm(float* sqnorm) const override; size_t size() const override; void Initialize(unsigned index, const std::vector& val); @@ -81,6 +78,7 @@ struct LookupParameters : public ParametersBase { class Model { public: ~Model(); + void gradient_l2_norm(float* norm) const; Parameters* add_parameters(const Dim& d); // initialized randomly LookupParameters* add_lookup_parameters(unsigned n, const Dim& d); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 49944f129..cd73c2c97 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -167,6 +167,7 @@ void Sum::forward(const vector& xs, Tensor& fx) const { return; } #if HAVE_CUDA + TensorTools::Zero(fx); for (unsigned i = 0; i < num_args; ++i) CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[i]->v, 1, fx.v, 1)); #else @@ -188,7 +189,11 @@ void Sum::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#if HAVE_CUDA + CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); +#else *dEdxi += *dEdf; +#endif }; struct FTanh { @@ -217,7 +222,11 @@ void Tanh::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#if HAVE_CUDA + gpu::vtanh_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); +#else *dEdxi += (*fx).binaryExpr(*dEdf, FTanhBackward()); +#endif } void Square::forward(const vector& xs, Tensor& fx) const { @@ -659,8 +668,17 @@ void MatrixMultiply::forward(const vector& xs, Tensor& fx) const #if HAVE_CUDA auto x1 = *xs[0]; auto x2 = *xs[1]; - CUBLAS_CHECK(cublasSgemv(cublas_handle, CUBLAS_OP_N, x1.d.rows(), x1.d.cols(), - kSCALAR_ONE, x1.v, x1.d.rows(), x2.v, 1, kSCALAR_ZERO, fx.v, 1)); + if (x2.d.ndims() == 1 || x2.d.cols() == 1) { + CUBLAS_CHECK(cublasSgemv(cublas_handle, CUBLAS_OP_N, x1.d.rows(), x1.d.cols(), + kSCALAR_ONE, x1.v, x1.d.rows(), x2.v, 1, kSCALAR_ZERO, fx.v, 1)); + } else { + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, + fx.d.rows(), fx.d.cols(), x1.d.cols(), + kSCALAR_ONE, + x1.v, x1.d.rows(), + x2.v, x2.d.rows(), + kSCALAR_ZERO, fx.v, fx.d.rows())); + } #else auto x1 = **xs[0]; auto x2 = **xs[1]; @@ -674,11 +692,29 @@ void MatrixMultiply::backward(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i < 2); +#if HAVE_CUDA + if (i == 0) { + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, + dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), + kSCALAR_ONE, + dEdf.v, dEdf.d.rows(), + xs[1]->v, xs[1]->d.rows(), + kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); + } else { + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, + dEdxi.d.rows(), dEdxi.d.cols(), xs[0]->d.rows(), + kSCALAR_ONE, + xs[0]->v, xs[0]->d.rows(), + dEdf.v, xs[0]->d.rows(), + kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); + } +#else if (i == 0) { (*dEdxi).noalias() += *dEdf * (**xs[1]).transpose(); } else { (*dEdxi).noalias() += (**xs[0]).transpose() * *dEdf; } +#endif } void CwiseMultiply::forward(const vector& xs, Tensor& fx) const { @@ -689,10 +725,10 @@ void CwiseMultiply::forward(const vector& xs, Tensor& fx) const { } void CwiseMultiply::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { assert(i < 2); if (i == 0) { auto x2 = **xs[1]; @@ -782,11 +818,15 @@ void SquaredEuclideanDistance::backward(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i < 2); +#if HAVE_CUDA + gpu::sqeucdist_backward(xs[0]->d.size(), dEdf.v, xs[0]->v, xs[1]->v, dEdxi.v, i); +#else auto x1 = **xs[0]; auto x2 = **xs[1]; real scale = dEdf.v[0] * 2; if (i == 1) scale = -scale; *dEdxi += scale * (x1 - x2); +#endif } struct FLogisticSigmoid { diff --git a/cnn/training.cc b/cnn/training.cc index a438d6c23..9f04fc40b 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -1,5 +1,7 @@ #include "cnn/training.h" +#include "cnn/gpu-ops.h" + namespace cnn { using namespace std; @@ -9,10 +11,8 @@ Trainer::~Trainer() {} float Trainer::clip_gradients() { float gscale = 1; if (clipping_enabled) { - double gg = 0; - for (auto p : model->all_parameters_list()) - gg+=p->g_squared_l2norm(); - gg = sqrt(gg); + float gg = 0; + model->gradient_l2_norm(&gg); if (gg > clip_threshold) { ++clips; gscale = clip_threshold / gg; @@ -25,7 +25,7 @@ void SimpleSGDTrainer::update(real scale) { const float gscale = clip_gradients(); for (auto p : model->parameters_list()) { #if HAVE_CUDA - cerr << "implement update\n"; abort(); + gpu::sgd_update(p->values.d.size(), p->g.v, p->values.v, eta * scale * gscale, lambda); #else auto reg = (*p->values) * lambda; *p->values -= ((eta * scale * gscale) * *p->g + reg); From 432c1fa6f53536ea3eeca9d690134daa8b37baa7 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 17 May 2015 23:48:55 -0400 Subject: [PATCH 042/965] cuda support --- cnn/functors.h | 145 ++++++++++++++++++++++++++++++++++++++++++++++ cnn/gpu-kernels.h | 56 ++++++++++++++++++ cnn/gpu-ops.cu | 84 ++++++--------------------- cnn/gpu-ops.h | 2 + cnn/nodes.cc | 110 +++-------------------------------- 5 files changed, 229 insertions(+), 168 deletions(-) create mode 100644 cnn/functors.h create mode 100644 cnn/gpu-kernels.h diff --git a/cnn/functors.h b/cnn/functors.h new file mode 100644 index 000000000..bd4b1d758 --- /dev/null +++ b/cnn/functors.h @@ -0,0 +1,145 @@ +#ifndef CNN_GPU_FUNCTORS_H +#define CNN_GPU_FUNCTORS_H + +#if HAVE_CUDA +# define CNN_DEVICE_FUNC __device__ +#else +# define CNN_DEVICE_FUNC +#endif + +// these functions are used both in CPU and in GPU computation +// this file may be compiled with NVCC or a standard C++ tool. +// if you need a new elementwise (nullary, unary, binary...) +// functor, this is the place for it + +namespace cnn { + +struct FConstantMinus { + FConstantMinus(float c) : c(c) {} + CNN_DEVICE_FUNC inline float operator()(float x) const { + return c - x; + } + float c; +}; + +struct FTanh { + CNN_DEVICE_FUNC inline float operator()(float x) const { + return tanhf(x); + } +}; + +struct FTanhBackward { + CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + return (1.f - t * t) * d; + } +}; + +struct FPairwiseRankLoss { + FPairwiseRankLoss(float m) : margin(m) {} + CNN_DEVICE_FUNC float operator()(float a, float b) const { + float d = margin - a + b; + return d > 0.f ? d : 0.f; + } + float margin; +}; + +struct FRectifyBackward { + CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + return (t) ? d : 0.f; + } +}; + +struct FSoftmaxNormalize { + explicit FSoftmaxNormalize(float logz) : logz(logz) {} + CNN_DEVICE_FUNC inline float operator()(float x) const { + return expf(x - logz); + } + float logz; +}; + +struct FSoftmaxBackward { + explicit FSoftmaxBackward(float off_diag_sum) : off_diag_sum(off_diag_sum) {} + CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + return (off_diag_sum + d) * t; + } + float off_diag_sum; +}; + +struct FNegLogSoftmaxBackward { + FNegLogSoftmaxBackward(float lz, float err) : logz(lz), d(err) {} + CNN_DEVICE_FUNC inline float operator()(float t) const { + return expf(t - logz) * d; + } + float logz; + float d; +}; + +struct FLogSoftmaxNormalize { + explicit FLogSoftmaxNormalize(float logz) : logz(logz) {} + CNN_DEVICE_FUNC inline float operator()(float x) const { + return x - logz; + } + float logz; +}; + +struct FWeightedError { + float operator()(float t, float d) const { + return expf(t) * d / expf(t); + } +}; + +struct FLogSoftmaxBackward { + explicit FLogSoftmaxBackward(float off_diag_sum) : off_diag_sum(off_diag_sum) {} + CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + return off_diag_sum * expf(t) + d; + //return (off_diag_sum + d) * t; + } + float off_diag_sum; +}; + +struct FRectify { + CNN_DEVICE_FUNC inline float operator()(float x) const { + return (x > 0.f) ? x : 0.f; + } +}; + +struct FLogisticSigmoid { + CNN_DEVICE_FUNC inline float operator()(float x) const { + return 1.f / (1.f + expf(-x)); + } +}; + +struct FLogisticSigmoidBackward { + CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + return (1.f - t) * t * d; + } +}; + +struct FSqDist { + CNN_DEVICE_FUNC inline float operator()(float a, float b) const { + float d = a - b; + return d * d; + } +}; + +struct FEuclideanBackward { + FEuclideanBackward(int i, const float* s) : i(i), scalar(s) {} + CNN_DEVICE_FUNC inline float operator()(float a, float b) const { + return (i == 0 ? 2.f : -2.f) * (*scalar) * (a - b); + } + int i; + const float* scalar; +}; + +struct FL2SGDUpdate { + FL2SGDUpdate(float l, float s) : lambda(l), scale(-s) {} + CNN_DEVICE_FUNC inline float operator()(float x, float g) const { + return scale * g - x * lambda; + } + float lambda; + float scale; +}; + +} // namespace cnn + +#endif diff --git a/cnn/gpu-kernels.h b/cnn/gpu-kernels.h new file mode 100644 index 000000000..691926333 --- /dev/null +++ b/cnn/gpu-kernels.h @@ -0,0 +1,56 @@ +#ifndef CNN_GPU_KERNELS_H +#define CNN_GPU_KERNELS_H + +#include "cnn/cuda.h" + +namespace cnn { +namespace gpu { + +template +__global__ void unaryExprKernel(int n, const float* x, float* y, Func func) { + int i = threadIdx.x + blockIdx.x * blockDim.x; + while (i < n) { + y[i] = func(x[i]); + i += gridDim.x * blockDim.x; + } +} + +template +__global__ void accUnaryExprKernel(int n, const float* x, float* y, Func func) { + int i = threadIdx.x + blockIdx.x * blockDim.x; + while (i < n) { + y[i] += func(x[i]); + i += gridDim.x * blockDim.x; + } +} + +template +__global__ void binaryExprKernel(int n, const float* x0, const float* x1, float* y, Func func) { + int i = threadIdx.x + blockIdx.x * blockDim.x; + while (i < n) { + y[i] = func(x0[i], x1[i]); + i += gridDim.x * blockDim.x; + } +} + +template +__global__ void accBinaryExprKernel(int n, const float* x0, const float* x1, float* y, Func func) { + int i = threadIdx.x + blockIdx.x * blockDim.x; + while (i < n) { + y[i] += func(x0[i], x1[i]); + i += gridDim.x * blockDim.x; + } +} + +template +__global__ void slowReduceKernel(int n, float* x, float* y, float* r, Func func) { + float tr = 0; + for (int i = 0; i < n; ++i) + tr += func(x[i], y[i]); + r[0] = tr; +} + +} // namespace gpu +} // namespace cnn + +#endif diff --git a/cnn/gpu-ops.cu b/cnn/gpu-ops.cu index 8ef799387..8acfeb2ea 100644 --- a/cnn/gpu-ops.cu +++ b/cnn/gpu-ops.cu @@ -1,98 +1,48 @@ -#include "cnn/gpu-ops.h" #include "cnn/cuda.h" - -#include -#include -#include -#include +#include "cnn/gpu-ops.h" +#include "cnn/gpu-kernels.h" +#include "cnn/functors.h" namespace cnn { namespace gpu { -template -__global__ void unaryExprKernel(int n, const float* x, float* y, Func func) { - int i = threadIdx.x + blockIdx.x * blockDim.x; - while (i < n) { - y[i] = func(x[i]); - i += gridDim.x * blockDim.x; - } -} - -template -__global__ void binaryExprAccKernel(int n, const float* x0, const float* x1, float* y, Func func) { - int i = threadIdx.x + blockIdx.x * blockDim.x; - while (i < n) { - y[i] += func(x0[i], x1[i]); - i += gridDim.x * blockDim.x; - } -} - -struct FTanh { - __device__ inline float operator()(float x) const { return tanh(x); } -}; +// this wraps kernel dispatches for various operations (preventing us from +// having to compile a version of nodes.cc with NVCC) void vtanh(int n, float* x, float* y) { auto tb = SizeToBlockThreadPair(n); unaryExprKernel<<>>(n, x, y, FTanh()); } -struct FTanhBackward { - __device__ inline float operator()(float t, float d) const { - return (1.f - t * t) * d; - } -}; - void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx) { auto tb = SizeToBlockThreadPair(n); - binaryExprAccKernel<<>>(n, fx, dEdf, dEdx, FTanhBackward()); + accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FTanhBackward()); } -struct FSqDist { - __device__ inline float operator()(float a, float b) const { - float d = a - b; - return d * d; - } -}; - -struct FEuclideanBackward { - FEuclideanBackward(int i, const float* s) : i(i), scalar(s) {} - __device__ inline float operator()(float a, float b) const { - return (i == 0 ? 2.f : -2.f) * (*scalar) * (a - b); - } - int i; - const float* scalar; -}; +void vlogistic(int n, float* x, float* y) { + auto tb = SizeToBlockThreadPair(n); + unaryExprKernel<<>>(n, x, y, FLogisticSigmoid()); +} -template -__global__ void slowReduceKernel(int n, float* x, float* y, float* r, Func func) { - float tr = 0; - for (int i = 0; i < n; ++i) - tr += func(x[i], y[i]); - r[0] = tr; +void vlogistic_backward(int n, const float* fx, const float* dEdf, float* dEdx) { + auto tb = SizeToBlockThreadPair(n); + accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FLogisticSigmoidBackward()); } +//// BROKEN STUFF UNDER HERE /////////////////////////////////// + void sqeucdist(int n, float* x, float *y, float* res) { slowReduceKernel<<<1,1>>>(n, x, y, res, FSqDist()); } void sqeucdist_backward(int n, const float* dEdy, const float* x0, const float* x1, float* dEdx, int i) { auto tb = SizeToBlockThreadPair(n); - binaryExprAccKernel<<>>(n, x0, x1, dEdx, FEuclideanBackward(i, dEdy)); + accBinaryExprKernel<<>>(n, x0, x1, dEdx, FEuclideanBackward(i, dEdy)); } -struct FL2SGDUpdate { - FL2SGDUpdate(float l, float s) : lambda(l), scale(-s) {} - __device__ inline float operator()(float x, float g) const { - float r = x * lambda; - return scale * g - r; - } - float lambda; - float scale; -}; - void sgd_update(int n, const float* g, float* x, float scale, float lambda) { auto tb = SizeToBlockThreadPair(n); - binaryExprAccKernel<<>>(n, x, g, x, FL2SGDUpdate(lambda, scale)); + accBinaryExprKernel<<>>(n, x, g, x, FL2SGDUpdate(lambda, scale)); } } // namespace gpu diff --git a/cnn/gpu-ops.h b/cnn/gpu-ops.h index 703f9631a..098f2fa89 100644 --- a/cnn/gpu-ops.h +++ b/cnn/gpu-ops.h @@ -6,6 +6,8 @@ namespace gpu { void vtanh(int n, float* x, float* y); void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx); +void vlogistic(int n, float* x, float* y); +void vlogistic_backward(int n, const float* fx, const float* dEdf, float* dEdx); void sqeucdist(int n, float* x, float *y, float* res); void sqeucdist_backward(int n, const float* dEdy, const float* x0, const float* x1, float* dEdx, int i); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index cd73c2c97..497d6b144 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -4,6 +4,7 @@ #include #include +#include "cnn/functors.h" #if HAVE_CUDA #include "cnn/cuda.h" #include "cnn/gpu-ops.h" @@ -139,14 +140,6 @@ void Dropout::backward(const vector& xs, #endif }; -struct FConstantMinus { - FConstantMinus(float c) : c(c) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float x) const { - return c - x; - } - float c; -}; - void ConstantMinusX::forward(const vector& xs, Tensor& fx) const { auto x = **xs[0]; *fx = x.unaryExpr(FConstantMinus(c)); @@ -196,12 +189,6 @@ void Sum::backward(const vector& xs, #endif }; -struct FTanh { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float x) const { - return tanhf(x); - } -}; - void Tanh::forward(const vector& xs, Tensor& fx) const { #if HAVE_CUDA gpu::vtanh(fx.d.size(), xs[0]->v, fx.v); @@ -211,12 +198,6 @@ void Tanh::forward(const vector& xs, Tensor& fx) const { #endif } -struct FTanhBackward { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float t, float d) const { - return (1.f - t * t) * d; - } -}; - void Tanh::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, @@ -315,27 +296,12 @@ void ConcatenateColumns::backward(const vector& xs, *dEdxi += (*dEdf).col(i); } -struct FPairwiseRankLoss { - FPairwiseRankLoss(float m) : margin(m) {} - float operator()(float a, float b) const { - float d = margin - a + b; - return d > 0.f ? d : 0.f; - } - float margin; -}; - void PairwiseRankLoss::forward(const vector& xs, Tensor& fx) const { auto a = **xs[0]; auto b = **xs[1]; *fx = a.binaryExpr(b, FPairwiseRankLoss(margin)); } -struct FRectifyBackward { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float t, float d) const { - return (t) ? d : 0.f; - } -}; - void PairwiseRankLoss::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, @@ -458,14 +424,6 @@ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float logsumexp(const T& x) { return m + logf(z); } -struct FSoftmaxNormalize { - explicit FSoftmaxNormalize(float logz) : logz(logz) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float x) const { - return expf(x - logz); - } - float logz; -}; - void Softmax::forward(const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { auto x = **xs[0]; @@ -476,14 +434,6 @@ void Softmax::forward(const vector& xs, Tensor& fx) const { } } -struct FSoftmaxBackward { - explicit FSoftmaxBackward(float off_diag_sum) : off_diag_sum(off_diag_sum) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float t, float d) const { - return (off_diag_sum + d) * t; - } - float off_diag_sum; -}; - void Softmax::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, @@ -504,15 +454,6 @@ void PickNegLogSoftmax::forward(const vector& xs, Tensor& fx) con } } -struct FNegLogSoftmaxBackward { - FNegLogSoftmaxBackward(float lz, float err) : logz(lz), d(err) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float t) const { - return expf(t - logz) * d; - } - float logz; - float d; -}; - void PickNegLogSoftmax::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, @@ -531,14 +472,6 @@ void PickNegLogSoftmax::backward(const vector& xs, } } -struct FLogSoftmaxNormalize { - explicit FLogSoftmaxNormalize(float logz) : logz(logz) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float x) const { - return x - logz; - } - float logz; -}; - void LogSoftmax::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); if (xs[0]->d.cols() == 1) { @@ -550,21 +483,6 @@ void LogSoftmax::forward(const vector& xs, Tensor& fx) const { } } -struct FWeightedError { - float operator()(float t, float d) const { - return expf(t) * d / expf(t); - } -}; - -struct FLogSoftmaxBackward { - explicit FLogSoftmaxBackward(float off_diag_sum) : off_diag_sum(off_diag_sum) {} - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float t, float d) const { - return off_diag_sum * expf(t) + d; - //return (off_diag_sum + d) * t; - } - float off_diag_sum; -}; - void LogSoftmax::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, @@ -781,12 +699,6 @@ void Negate::backward(const vector& xs, *dEdxi -= *dEdf; } -struct FRectify { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float x) const { - return (x > 0.f) ? x : 0.f; - } -}; - void Rectify::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); auto x = **xs[0]; @@ -829,30 +741,26 @@ void SquaredEuclideanDistance::backward(const vector& xs, #endif } -struct FLogisticSigmoid { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float x) const { - return 1.f / (1.f + expf(-x)); - } -}; - void LogisticSigmoid::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); +#if HAVE_CUDA + gpu::vlogistic(fx.d.size(), xs[0]->v, fx.v); +#else auto x = **xs[0]; *fx = x.unaryExpr(FLogisticSigmoid()); +#endif } -struct FLogisticSigmoidBackward { - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float operator()(float t, float d) const { - return (1.f - t) * t * d; - } -}; - void LogisticSigmoid::backward(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#if HAVE_CUDA + gpu::vlogistic_backward(dEdf.d.size(), fx.v, dEdf.v, dEdxi.v); +#else *dEdxi += (*fx).binaryExpr(*dEdf, FLogisticSigmoidBackward()); +#endif } // you could do this with LogisticSigmoid, Softmax or a variety of other From 42b05a6184b3f667467b98da91a2284a6cf0db8e Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 18 May 2015 08:10:57 -0400 Subject: [PATCH 043/965] gpu --- cnn/functors.h | 6 ++++ cnn/gpu-ops.cu | 20 ++++++++++++ cnn/gpu-ops.h | 4 +++ cnn/nodes.cc | 88 +++++++++++++++++++++++++++++++++++++++----------- 4 files changed, 99 insertions(+), 19 deletions(-) diff --git a/cnn/functors.h b/cnn/functors.h index bd4b1d758..658ba6980 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -22,6 +22,12 @@ struct FConstantMinus { float c; }; +struct FNegate { + CNN_DEVICE_FUNC inline float operator()(float x) const { + return -x; + } +}; + struct FTanh { CNN_DEVICE_FUNC inline float operator()(float x) const { return tanhf(x); diff --git a/cnn/gpu-ops.cu b/cnn/gpu-ops.cu index 8acfeb2ea..10c7c92f7 100644 --- a/cnn/gpu-ops.cu +++ b/cnn/gpu-ops.cu @@ -9,6 +9,26 @@ namespace gpu { // this wraps kernel dispatches for various operations (preventing us from // having to compile a version of nodes.cc with NVCC) +void vnegate(int n, float* x, float* y) { + auto tb = SizeToBlockThreadPair(n); + unaryExprKernel<<>>(n, x, y, FNegate()); +} + +void vnegate_backward(int n, const float* fx, const float* dEdf, float* dEdx) { + auto tb = SizeToBlockThreadPair(n); + accUnaryExprKernel<<>>(n, dEdf, dEdx, FNegate()); +} + +void vrelu(int n, float* x, float* y) { + auto tb = SizeToBlockThreadPair(n); + unaryExprKernel<<>>(n, x, y, FRectify()); +} + +void vrelu_backward(int n, const float* fx, const float* dEdf, float* dEdx) { + auto tb = SizeToBlockThreadPair(n); + accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FRectifyBackward()); +} + void vtanh(int n, float* x, float* y) { auto tb = SizeToBlockThreadPair(n); unaryExprKernel<<>>(n, x, y, FTanh()); diff --git a/cnn/gpu-ops.h b/cnn/gpu-ops.h index 098f2fa89..0b2564d4f 100644 --- a/cnn/gpu-ops.h +++ b/cnn/gpu-ops.h @@ -4,6 +4,10 @@ namespace cnn { namespace gpu { +void vnegate(int n, float* x, float* y); +void vnegate_backward(int n, const float* fx, const float* dEdf, float* dEdx); +void vrelu(int n, float* x, float* y); +void vrelu_backward(int n, const float* fx, const float* dEdf, float* dEdx); void vtanh(int n, float* x, float* y); void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx); void vlogistic(int n, float* x, float* y); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 497d6b144..1dfe694a3 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -581,22 +581,27 @@ void PickRange::backward(const vector& xs, (*dEdxi).block(start, 0, end-start, 1) += (*dEdf); } -void MatrixMultiply::forward(const vector& xs, Tensor& fx) const { - assert(xs.size() == 2); #if HAVE_CUDA - auto x1 = *xs[0]; - auto x2 = *xs[1]; - if (x2.d.ndims() == 1 || x2.d.cols() == 1) { - CUBLAS_CHECK(cublasSgemv(cublas_handle, CUBLAS_OP_N, x1.d.rows(), x1.d.cols(), - kSCALAR_ONE, x1.v, x1.d.rows(), x2.v, 1, kSCALAR_ZERO, fx.v, 1)); +inline void CUDAMatrixMultiply(const Tensor& l, const Tensor& r, Tensor& y, const float* acc_scalar) { + if (r.d.ndims() == 1 || r.d.cols() == 1) { + CUBLAS_CHECK(cublasSgemv(cublas_handle, CUBLAS_OP_N, l.d.rows(), l.d.cols(), + kSCALAR_ONE, l.v, l.d.rows(), r.v, 1, acc_scalar, y.v, 1)); } else { CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, - fx.d.rows(), fx.d.cols(), x1.d.cols(), + y.d.rows(), y.d.cols(), l.d.cols(), kSCALAR_ONE, - x1.v, x1.d.rows(), - x2.v, x2.d.rows(), - kSCALAR_ZERO, fx.v, fx.d.rows())); + l.v, l.d.rows(), + r.v, r.d.rows(), + acc_scalar, y.v, y.d.rows())); } +} +#endif + +void MatrixMultiply::forward(const vector& xs, Tensor& fx) const { + assert(xs.size() == 2); +#if HAVE_CUDA + // fx = 0*fx + xs[0] * xs[1] + CUDAMatrixMultiply(*xs[0], *xs[1], fx, kSCALAR_ZERO); #else auto x1 = **xs[0]; auto x2 = **xs[1]; @@ -663,46 +668,87 @@ void AffineTransform::forward(const vector& xs, Tensor& fx) const fx.v = xs[0]->v; return; } else { +#if HAVE_CUDA + for (unsigned i = 1; i < xs.size(); i += 2) + // fx = (acc_sclar)*fx + xs[0] * xs[1] + CUDAMatrixMultiply(*xs[i], *xs[i + 1], fx, (i == 1) ? kSCALAR_ZERO : kSCALAR_ONE); + CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v, 1, fx.v, 1)); +#else (*fx) = **xs[0]; for (unsigned i = 1; i < xs.size(); i += 2) (*fx).noalias() += (**xs[i]) * (**xs[i + 1]); +#endif } } void AffineTransform::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { assert(i < xs.size()); if (i == 0) { // bias term +#if HAVE_CUDA + CUBLAS_CHECK(cublasSaxpy(cublas_handle, dEdxi.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); +#else *dEdxi += *dEdf; +#endif } else if (i % 2 == 1) { // left argument of matrix multiply +#if HAVE_CUDA + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, + dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), + kSCALAR_ONE, + dEdf.v, dEdf.d.rows(), + xs[i+1]->v, xs[i+1]->d.rows(), + kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); +#else (*dEdxi).noalias() += *dEdf * (**xs[i+1]).transpose(); +#endif } else { // right argument of matrix multiply +#if HAVE_CUDA + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, + dEdxi.d.rows(), dEdxi.d.cols(), xs[i-1]->d.rows(), + kSCALAR_ONE, + xs[i-1]->v, xs[i-1]->d.rows(), + dEdf.v, xs[i-1]->d.rows(), + kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); +#else (*dEdxi).noalias() += (**xs[i-1]).transpose() * *dEdf; +#endif } } void Negate::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); +#if HAVE_CUDA + gpu::vnegate(fx.d.size(), xs[0]->v, fx.v); +#else auto x = **xs[0]; *fx = -x; +#endif } void Negate::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { assert(i == 0); +#if HAVE_CUDA + gpu::vnegate_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); +#else *dEdxi -= *dEdf; +#endif } void Rectify::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); +#if HAVE_CUDA + gpu::vrelu(fx.d.size(), xs[0]->v, fx.v); +#else auto x = **xs[0]; *fx = x.unaryExpr(FRectify()); +#endif } void Rectify::backward(const vector& xs, @@ -710,7 +756,11 @@ void Rectify::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#if HAVE_CUDA + gpu::vrelu_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); +#else *dEdxi += (*fx).binaryExpr(*dEdf, FRectifyBackward()); +#endif } void SquaredEuclideanDistance::forward(const vector& xs, Tensor& fx) const { From b0ea63d7069e51eea49093ce153ac60de9c47a10 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 18 May 2015 10:54:51 -0400 Subject: [PATCH 044/965] more gpu functions --- cnn/functors.h | 12 +++++++++++ cnn/gpu-kernels.h | 9 +++++---- cnn/gpu-ops.cu | 51 +++++++++++++++++++++++++++++++++++++---------- cnn/gpu-ops.h | 17 ++++++++++------ cnn/nodes.cc | 30 +++++++++++++++++++++++++++- 5 files changed, 97 insertions(+), 22 deletions(-) diff --git a/cnn/functors.h b/cnn/functors.h index 658ba6980..a8a51f183 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -14,6 +14,12 @@ namespace cnn { +struct FProduct { + CNN_DEVICE_FUNC inline float operator()(float a, float b) const { + return a * b; + } +}; + struct FConstantMinus { FConstantMinus(float c) : c(c) {} CNN_DEVICE_FUNC inline float operator()(float x) const { @@ -55,6 +61,12 @@ struct FRectifyBackward { } }; +struct FRectifyNegateBackward { + CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + return (t) ? -d : 0.f; + } +}; + struct FSoftmaxNormalize { explicit FSoftmaxNormalize(float logz) : logz(logz) {} CNN_DEVICE_FUNC inline float operator()(float x) const { diff --git a/cnn/gpu-kernels.h b/cnn/gpu-kernels.h index 691926333..30c08bb61 100644 --- a/cnn/gpu-kernels.h +++ b/cnn/gpu-kernels.h @@ -43,11 +43,12 @@ __global__ void accBinaryExprKernel(int n, const float* x0, const float* x1, flo } template -__global__ void slowReduceKernel(int n, float* x, float* y, float* r, Func func) { - float tr = 0; +__global__ void slowReduceKernel(int n, const float* x0, const float* x1, float* y, Func func) { + float ty = 0; + // THIS IS BAD - FIX THIS TO MAKE IT FAST for (int i = 0; i < n; ++i) - tr += func(x[i], y[i]); - r[0] = tr; + ty += func(x0[i], x1[i]); + y[0] = ty; } } // namespace gpu diff --git a/cnn/gpu-ops.cu b/cnn/gpu-ops.cu index 10c7c92f7..29ff0c043 100644 --- a/cnn/gpu-ops.cu +++ b/cnn/gpu-ops.cu @@ -9,17 +9,46 @@ namespace gpu { // this wraps kernel dispatches for various operations (preventing us from // having to compile a version of nodes.cc with NVCC) -void vnegate(int n, float* x, float* y) { +void vpairwise_rank_loss(int n, float margin, const float* xgood, const float* xbad, float* y) { + auto tb = SizeToBlockThreadPair(n); + binaryExprKernel<<>>(n, xgood, xbad, y, FPairwiseRankLoss(margin)); +} + +void vpairwise_rank_loss_backward(int n, bool d_wrt_correct, const float* fx, const float* dEdf, float* dEdx) { + auto tb = SizeToBlockThreadPair(n); + if (d_wrt_correct) { + accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FRectifyNegateBackward()); + } else { + accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FRectifyBackward()); + } +} + +void vcwise_product(int n, const float* x0, const float* x1, float* y) { + auto tb = SizeToBlockThreadPair(n); + binaryExprKernel<<>>(n, x0, x1, y, FProduct()); +} + +void vcwise_product_backward(int n, const float* dEdy, const float* x_other, float* dEdx) { + auto tb = SizeToBlockThreadPair(n); + accBinaryExprKernel<<>>(n, dEdy, x_other, dEdx, FProduct()); +} + +void vconstant_minusx(int n, float c, const float* x, float* y) { + auto tb = SizeToBlockThreadPair(n); + unaryExprKernel<<>>(n, x, y, FConstantMinus(c)); +} + +void vnegate(int n, const float* x, float* y) { auto tb = SizeToBlockThreadPair(n); unaryExprKernel<<>>(n, x, y, FNegate()); } -void vnegate_backward(int n, const float* fx, const float* dEdf, float* dEdx) { +void vnegate_backward(int n, const float* dEdf, float* dEdx) { auto tb = SizeToBlockThreadPair(n); accUnaryExprKernel<<>>(n, dEdf, dEdx, FNegate()); } -void vrelu(int n, float* x, float* y) { +void vrelu(int n, const float* x, float* y) { auto tb = SizeToBlockThreadPair(n); unaryExprKernel<<>>(n, x, y, FRectify()); } @@ -29,7 +58,7 @@ void vrelu_backward(int n, const float* fx, const float* dEdf, float* dEdx) { accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FRectifyBackward()); } -void vtanh(int n, float* x, float* y) { +void vtanh(int n, const float* x, float* y) { auto tb = SizeToBlockThreadPair(n); unaryExprKernel<<>>(n, x, y, FTanh()); } @@ -39,7 +68,7 @@ void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx) { accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FTanhBackward()); } -void vlogistic(int n, float* x, float* y) { +void vlogistic(int n, const float* x, float* y) { auto tb = SizeToBlockThreadPair(n); unaryExprKernel<<>>(n, x, y, FLogisticSigmoid()); } @@ -49,12 +78,6 @@ void vlogistic_backward(int n, const float* fx, const float* dEdf, float* dEdx) accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FLogisticSigmoidBackward()); } -//// BROKEN STUFF UNDER HERE /////////////////////////////////// - -void sqeucdist(int n, float* x, float *y, float* res) { - slowReduceKernel<<<1,1>>>(n, x, y, res, FSqDist()); -} - void sqeucdist_backward(int n, const float* dEdy, const float* x0, const float* x1, float* dEdx, int i) { auto tb = SizeToBlockThreadPair(n); accBinaryExprKernel<<>>(n, x0, x1, dEdx, FEuclideanBackward(i, dEdy)); @@ -65,5 +88,11 @@ void sgd_update(int n, const float* g, float* x, float scale, float lambda) { accBinaryExprKernel<<>>(n, x, g, x, FL2SGDUpdate(lambda, scale)); } +//// BROKEN STUFF UNDER HERE /////////////////////////////////// + +void sqeucdist(int n, const float* x0, const float *x1, float* y) { + slowReduceKernel<<<1,1>>>(n, x0, x1, y, FSqDist()); +} + } // namespace gpu } // namespace cnn diff --git a/cnn/gpu-ops.h b/cnn/gpu-ops.h index 0b2564d4f..4d46be09b 100644 --- a/cnn/gpu-ops.h +++ b/cnn/gpu-ops.h @@ -4,15 +4,20 @@ namespace cnn { namespace gpu { -void vnegate(int n, float* x, float* y); -void vnegate_backward(int n, const float* fx, const float* dEdf, float* dEdx); -void vrelu(int n, float* x, float* y); +void vpairwise_rank_loss(int n, float margin, const float* xgood, const float* xbad, float* y); +void vpairwise_rank_loss_backward(int n, bool d_wrt_correct, const float* fx, const float* dEdf, float* dEdx); +void vcwise_product(int n, const float* x0, const float* x1, float* y); +void vcwise_product_backward(int n, const float* dEdy, const float* x_other, float* dEdx); +void vconstant_minusx(int n, float c, const float* x, float* y); +void vnegate(int n, const float* x, float* y); +void vnegate_backward(int n, const float* dEdf, float* dEdx); +void vrelu(int n, const float* x, float* y); void vrelu_backward(int n, const float* fx, const float* dEdf, float* dEdx); -void vtanh(int n, float* x, float* y); +void vtanh(int n, const float* x, float* y); void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx); -void vlogistic(int n, float* x, float* y); +void vlogistic(int n, const float* x, float* y); void vlogistic_backward(int n, const float* fx, const float* dEdf, float* dEdx); -void sqeucdist(int n, float* x, float *y, float* res); +void sqeucdist(int n, const float* x0, const float *x1, float* y); void sqeucdist_backward(int n, const float* dEdy, const float* x0, const float* x1, float* dEdx, int i); void sgd_update(int n, const float* g, float* x, float scale, float lambda); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 1dfe694a3..35014fa98 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -141,8 +141,12 @@ void Dropout::backward(const vector& xs, }; void ConstantMinusX::forward(const vector& xs, Tensor& fx) const { +#if HAVE_CUDA + gpu::vconstant_minusx(fx.d.size(), c, xs[0]->v, fx.v); +#else auto x = **xs[0]; *fx = x.unaryExpr(FConstantMinus(c)); +#endif } void ConstantMinusX::backward(const vector& xs, @@ -150,7 +154,11 @@ void ConstantMinusX::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#if HAVE_CUDA + gpu::vnegate_backward(dEdxi.d.size(), dEdf.v, dEdxi.v); +#else *dEdxi -= *dEdf; +#endif }; void Sum::forward(const vector& xs, Tensor& fx) const { @@ -297,9 +305,13 @@ void ConcatenateColumns::backward(const vector& xs, } void PairwiseRankLoss::forward(const vector& xs, Tensor& fx) const { +#if HAVE_CUDA + gpu::vpairwise_rank_loss(fx.d.size(), margin, xs[0]->v, xs[1]->v, fx.v); +#else auto a = **xs[0]; auto b = **xs[1]; *fx = a.binaryExpr(b, FPairwiseRankLoss(margin)); +#endif } void PairwiseRankLoss::backward(const vector& xs, @@ -307,11 +319,15 @@ void PairwiseRankLoss::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#if HAVE_CUDA + gpu::vpairwise_rank_loss_backward(dEdf.d.size(), (i == 0), fx.v, dEdf.v, dEdxi.v); +#else if (i == 0) { *dEdxi -= (*fx).binaryExpr(*dEdf, FRectifyBackward()); } else { *dEdxi += (*fx).binaryExpr(*dEdf, FRectifyBackward()); } +#endif } void Hinge::forward(const vector& xs, Tensor& fx) const { @@ -642,9 +658,13 @@ void MatrixMultiply::backward(const vector& xs, void CwiseMultiply::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); +#if HAVE_CUDA + gpu::vcwise_product(fx.d.size(), xs[0]->v, xs[1]->v, fx.v); +#else auto x1 = **xs[0]; auto x2 = **xs[1]; *fx = x1.cwiseProduct(x2); +#endif } void CwiseMultiply::backward(const vector& xs, @@ -654,11 +674,19 @@ void CwiseMultiply::backward(const vector& xs, Tensor& dEdxi) const { assert(i < 2); if (i == 0) { +#if HAVE_CUDA + gpu::vcwise_product_backward(fx.d.size(), dEdf.v, xs[1]->v, dEdxi.v); +#else auto x2 = **xs[1]; *dEdxi += (*dEdf).cwiseProduct(x2); +#endif } else { +#if HAVE_CUDA + gpu::vcwise_product_backward(fx.d.size(), dEdf.v, xs[0]->v, dEdxi.v); +#else auto x1 = **xs[0]; *dEdxi += (*dEdf).cwiseProduct(x1); +#endif } } @@ -735,7 +763,7 @@ void Negate::backward(const vector& xs, Tensor& dEdxi) const { assert(i == 0); #if HAVE_CUDA - gpu::vnegate_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); + gpu::vnegate_backward(fx.d.size(), dEdf.v, dEdxi.v); #else *dEdxi -= *dEdf; #endif From eafb434cebbc1acd854ecef851cc2241a5e8f633 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 20 May 2015 17:36:33 -0400 Subject: [PATCH 045/965] cuda support --- cnn/aligned-mem-pool.h | 4 +- cnn/backends/cuda/dummy.cu | 8 -- cnn/cnn.h | 7 +- cnn/cuda.cc | 6 +- cnn/functors.h | 29 ++++++++ cnn/gpu-ops.cu | 145 ++++++++++++++++++++++++++++++++++++- cnn/gpu-ops.h | 4 + cnn/init.cc | 4 +- cnn/lstm.cc | 49 +++++++++---- cnn/lstm.h | 1 + cnn/model.cc | 44 ++++++++--- cnn/model.h | 4 +- cnn/nodes.cc | 35 ++++----- cnn/nodes.h | 2 +- cnn/param-nodes.cc | 6 +- cnn/tensor.cc | 10 ++- cnn/tensor.h | 15 ++++ cnn/training.cc | 28 +------ examples/CMakeLists.txt | 27 +++---- examples/embed-cl.cc | 19 ++++- examples/rnnlm.cc | 6 +- examples/xor.cc | 13 ++-- 22 files changed, 338 insertions(+), 128 deletions(-) delete mode 100644 cnn/backends/cuda/dummy.cu diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h index 2c7623b4a..0ffb559ad 100644 --- a/cnn/aligned-mem-pool.h +++ b/cnn/aligned-mem-pool.h @@ -79,7 +79,7 @@ class AlignedMemoryPool { void zero_allocated_memory() { if (used == 0) return; #if HAVE_CUDA - CUDA_CHECK(cudaMemset(mem, 0, used)); + CUDA_CHECK(cudaMemsetAsync(mem, 0, used)); #else std::memset(mem, 0, used); #endif @@ -93,7 +93,7 @@ class AlignedMemoryPool { void zero_all() { //std::cerr << "zeroing " << (used ? used : capacity) << " bytes\n"; #if HAVE_CUDA - CUDA_CHECK(cudaMemset(mem, 0, capacity)); + CUDA_CHECK(cudaMemsetAsync(mem, 0, capacity)); #else std::memset(mem, 0, capacity); #endif diff --git a/cnn/backends/cuda/dummy.cu b/cnn/backends/cuda/dummy.cu deleted file mode 100644 index 813ea6a9e..000000000 --- a/cnn/backends/cuda/dummy.cu +++ /dev/null @@ -1,8 +0,0 @@ -#include -#include - -// CUDA runtime -#include - - - diff --git a/cnn/cnn.h b/cnn/cnn.h index beb5b9108..837bce347 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -99,18 +99,17 @@ struct Node { // compute dimensions of result for given dimensions of inputs // also checks to make sure inputs are compatible with each other - // TODO remove this in favor of doing all this in the constructor virtual Dim dim_forward(const std::vector& xs) const = 0; - // TODO look at member args instead of passing in args + // for debugging virtual std::string as_string(const std::vector& args) const = 0; // in general, this will return an empty size, but if a component needs to store // extra information in the forward pass for use in the backward pass, it can // request the memory here (nb. you could put it on the Node object, but in general, // edges should not allocate tensor memory since memory is managed centrally for the - // entire computation graph). TODO - // virtual Dim aux_storage_space() const; + // entire computation graph). + //virtual size_t aux_storage_space() const; // computation virtual void forward(const std::vector& xs, diff --git a/cnn/cuda.cc b/cnn/cuda.cc index ab0888daa..96278597d 100644 --- a/cnn/cuda.cc +++ b/cnn/cuda.cc @@ -34,11 +34,11 @@ void Initialize_GPU(int& argc, char**& argv) { CUDA_CHECK(cudaMalloc(&kSCALAR_ONE, sizeof(float))); CUDA_CHECK(cudaMalloc(&kSCALAR_ZERO, sizeof(float))); float minusone = -1; - CUDA_CHECK(cudaMemcpy(kSCALAR_MINUSONE, &minusone, sizeof(float), cudaMemcpyHostToDevice)); + CUDA_CHECK(cudaMemcpyAsync(kSCALAR_MINUSONE, &minusone, sizeof(float), cudaMemcpyHostToDevice)); float one = 1; - CUDA_CHECK(cudaMemcpy(kSCALAR_ONE, &one, sizeof(float), cudaMemcpyHostToDevice)); + CUDA_CHECK(cudaMemcpyAsync(kSCALAR_ONE, &one, sizeof(float), cudaMemcpyHostToDevice)); float zero = 0; - CUDA_CHECK(cudaMemcpy(kSCALAR_ZERO, &zero, sizeof(float), cudaMemcpyHostToDevice)); + CUDA_CHECK(cudaMemcpyAsync(kSCALAR_ZERO, &zero, sizeof(float), cudaMemcpyHostToDevice)); } } // namespace cnn diff --git a/cnn/functors.h b/cnn/functors.h index a8a51f183..e95cb367a 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -36,7 +36,14 @@ struct FNegate { struct FTanh { CNN_DEVICE_FUNC inline float operator()(float x) const { +#ifdef FAST_TANH + float x2 = x * x; + float a = x * (135135.0f + x2 * (17325.0f + x2 * (378.0f + x2))); + float b = 135135.0f + x2 * (62370.0f + x2 * (3150.0f + x2 * 28.0f)); + return a / b; +#else return tanhf(x); +#endif } }; @@ -92,6 +99,15 @@ struct FNegLogSoftmaxBackward { float d; }; +struct FPtrNegLogSoftmaxBackward { + FPtrNegLogSoftmaxBackward(const float* lz, const float* err) : logz(lz), d(err) {} + CNN_DEVICE_FUNC inline float operator()(float t) const { + return expf(t - *logz) * *d; + } + const float* logz; + const float* d; +}; + struct FLogSoftmaxNormalize { explicit FLogSoftmaxNormalize(float logz) : logz(logz) {} CNN_DEVICE_FUNC inline float operator()(float x) const { @@ -158,6 +174,19 @@ struct FL2SGDUpdate { float scale; }; +struct FBinaryLogLoss { + CNN_DEVICE_FUNC inline float operator()(float x, float x_true) const { + return x_true > 0.f ? -x_true * log(x) : (1.f - x_true) * log1p(-x); + } +}; + +struct FBinaryLogLossBackward { + CNN_DEVICE_FUNC inline float operator()(float x, float x_true, float d) const { + float scale = (x_true > 0.f) ? -x_true/x : (1.f-x_true)/(1.-x); + return d * scale; + } +}; + } // namespace cnn #endif diff --git a/cnn/gpu-ops.cu b/cnn/gpu-ops.cu index 29ff0c043..7f774c005 100644 --- a/cnn/gpu-ops.cu +++ b/cnn/gpu-ops.cu @@ -88,10 +88,151 @@ void sgd_update(int n, const float* g, float* x, float scale, float lambda) { accBinaryExprKernel<<>>(n, x, g, x, FL2SGDUpdate(lambda, scale)); } -//// BROKEN STUFF UNDER HERE /////////////////////////////////// +// adapted from NVIDIA example +__global__ void ker_sqeucdist(int n, const float *x0, const float *x1, float* res) { + __shared__ float buf[256]; + for (int i = threadIdx.x; i < 256; i += blockDim.x) { + float sum = 0; + for (int pos = i; pos < n; pos += 256) { + const float d = x0[pos] - x1[pos]; + sum += d * d; + } + buf[i] = sum; + } + for (int stride = 128; stride > 0; stride >>= 1) { + __syncthreads(); + for (int i = threadIdx.x; i < stride; i += blockDim.x) + buf[i] += buf[stride + i]; + } + __syncthreads(); + if (threadIdx.x == 0) res[0] = buf[0]; +} void sqeucdist(int n, const float* x0, const float *x1, float* y) { - slowReduceKernel<<<1,1>>>(n, x0, x1, y, FSqDist()); + auto tb = SizeToBlockThreadPair(n); + ker_sqeucdist<<>>(n, x0, x1, y); +} + +// adapted from NVIDIA example +__global__ void ker_l2_norm_reducer(int n, const float *x0, float* res, bool sq, bool acc) { + __shared__ float buf[256]; + for (int i = threadIdx.x; i < 256; i += blockDim.x) { + float sum = 0; + for (int pos = i; pos < n; pos += 256) { + const float d = x0[pos]; + sum += sq ? d * d : d; + } + buf[i] = sum; + } + for (int stride = 128; stride > 0; stride >>= 1) { + __syncthreads(); + for (int i = threadIdx.x; i < stride; i += blockDim.x) + buf[i] += buf[stride + i]; + } + __syncthreads(); + if (threadIdx.x == 0) { + if (acc) res[0] += buf[0]; else res[0] = buf[0]; + } +} + +void l2_norm_reducer(int n, const float* x0, float* y, bool square, bool accumulate) { + auto tb = SizeToBlockThreadPair(n); + ker_l2_norm_reducer<<>>(n, x0, y, square, accumulate); +} + +// adapted from NVIDIA example +__global__ void ker_softmax(int n, const float *x0, float* res) { + __shared__ float buf[256]; + for (int i = threadIdx.x; i < 256; i += blockDim.x) { + float me = __int_as_float(0xff800000); + for (int pos = i; pos < n; pos += 256) { + const float d = x0[pos]; + me = d > me ? d : me; + } + buf[i] = me; + } + for (int stride = 128; stride > 0; stride >>= 1) { + __syncthreads(); + for (int i = threadIdx.x; i < stride; i += blockDim.x) + buf[i] = buf[i] > buf[stride + i] ? buf[i] : buf[stride + i]; + } + __syncthreads(); + const float max_elem = buf[0]; + for (int i = threadIdx.x; i < 256; i += blockDim.x) { + float sum = 0; + for (int pos = i; pos < n; pos += 256) + sum += expf(x0[pos] - max_elem); + buf[i] = sum; + } + for (int stride = 128; stride > 0; stride >>= 1) { + __syncthreads(); + for (int i = threadIdx.x; i < stride; i += blockDim.x) + buf[i] += buf[stride + i]; + } + __syncthreads(); + float lz = log(buf[0]) + max_elem; + int i = threadIdx.x + blockIdx.x * blockDim.x; + while (i < n) { + res[i] = exp(x0[i] - lz); + i += gridDim.x * blockDim.x; + } +} + +void softmax(int n, const float* x0, float* y) { + auto tb = SizeToBlockThreadPair(n); + ker_softmax<<>>(n, x0, y); +} + +// adapted from NVIDIA example +__global__ void ker_pnlsoftmax(int n, int elem_idx, const float *x0, float* res, float* logz) { + __shared__ float buf[256]; + for (int i = threadIdx.x; i < 256; i += blockDim.x) { + float me = __int_as_float(0xff800000); + for (int pos = i; pos < n; pos += 256) { + const float d = x0[pos]; + me = d > me ? d : me; + } + buf[i] = me; + } + for (int stride = 128; stride > 0; stride >>= 1) { + __syncthreads(); + for (int i = threadIdx.x; i < stride; i += blockDim.x) + buf[i] = buf[i] > buf[stride + i] ? buf[i] : buf[stride + i]; + } + __syncthreads(); + const float max_elem = buf[0]; + for (int i = threadIdx.x; i < 256; i += blockDim.x) { + float sum = 0; + for (int pos = i; pos < n; pos += 256) + sum += expf(x0[pos] - max_elem); + buf[i] = sum; + } + for (int stride = 128; stride > 0; stride >>= 1) { + __syncthreads(); + for (int i = threadIdx.x; i < stride; i += blockDim.x) + buf[i] += buf[stride + i]; + } + __syncthreads(); + if (threadIdx.x == 0) { + float lz = log(buf[0]) + max_elem; + logz[0] = lz; + res[0] = lz - x0[elem_idx]; + } +} + +void pnlsoftmax(int n, int elem_idx, const float* x0, float* y, float* logz) { + auto tb = SizeToBlockThreadPair(n); + ker_pnlsoftmax<<>>(n, elem_idx, x0, y, logz); +} + +__global__ void fixup_pnl(const float* dEdf, float* dEdxi, int i) { + if (threadIdx.x == 0) dEdxi[i] -= dEdf[0]; +} + +void pnlsoftmax_backward(int n, int elem_idx, const float* x0, const float* dEdf, const float* logz, float* dEdx) { + auto tb = SizeToBlockThreadPair(n); + accUnaryExprKernel<<>>(n, x0, dEdx, FPtrNegLogSoftmaxBackward(logz, dEdf)); + fixup_pnl<<<1,1>>>(dEdf, dEdx, elem_idx); } } // namespace gpu diff --git a/cnn/gpu-ops.h b/cnn/gpu-ops.h index 4d46be09b..6f2b11359 100644 --- a/cnn/gpu-ops.h +++ b/cnn/gpu-ops.h @@ -17,8 +17,12 @@ void vtanh(int n, const float* x, float* y); void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx); void vlogistic(int n, const float* x, float* y); void vlogistic_backward(int n, const float* fx, const float* dEdf, float* dEdx); +void l2_norm_reducer(int n, const float* x0, float* y, bool square, bool accumulate); void sqeucdist(int n, const float* x0, const float *x1, float* y); void sqeucdist_backward(int n, const float* dEdy, const float* x0, const float* x1, float* dEdx, int i); +void softmax(int n, const float* x0, float* y); +void pnlsoftmax(int n, int elem_idx, const float* x0, float* y, float* logz); +void pnlsoftmax_backward(int n, int elem_idx, const float* x0, const float* dEdf, const float* logz, float* dEdx); void sgd_update(int n, const float* g, float* x, float scale, float lambda); diff --git a/cnn/init.cc b/cnn/init.cc index fb2a99950..58ad65cb4 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -33,8 +33,8 @@ void Initialize(int& argc, char**& argv) { *kSCALAR_ZERO = 0; #endif random_device rd; -// rndeng = new mt19937(rd()); - rndeng = new mt19937(1); +// rndeng = new mt19937(1); + rndeng = new mt19937(rd()); cerr << "Allocating memory...\n"; fxs = new AlignedMemoryPool(100000000); dEdfs = new AlignedMemoryPool(100000000); diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 26ec842f7..72e0bd84b 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -82,12 +82,12 @@ void LSTMBuilder::start_new_sequence(ComputationGraph* cg, h0 = h_0; c0 = c_0; if (h0.empty() || c0.empty()) { - VariableIndex zero_input = cg->add_input(Dim({hidden_dim}), &zeros); - if (c0.empty()) { c0 = vector(layers, zero_input); } - if (h0.empty()) { h0 = vector(layers, zero_input); } + has_initial_state = false; + } else { + has_initial_state = true; + assert (h0.size() == layers); + assert (c0.size() == layers); } - assert (h0.size() == layers); - assert (c0.size() == layers); } VariableIndex LSTMBuilder::add_input(VariableIndex x, ComputationGraph* cg) { @@ -102,29 +102,48 @@ VariableIndex LSTMBuilder::add_input(VariableIndex x, ComputationGraph* cg) { const vector& vars = param_vars[i]; VariableIndex i_h_tm1; VariableIndex i_c_tm1; + bool has_prev_state = (t > 0 || has_initial_state); if (t == 0) { - // intial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - i_c_tm1 = c0[i]; + if (has_initial_state) { + // intial value for h and c at timestep 0 in layer i + // defaults to zero matrix input if not set in add_parameter_edges + i_h_tm1 = h0[i]; + i_c_tm1 = c0[i]; + } } else { // t > 0 i_h_tm1 = h[t-1][i]; i_c_tm1 = c[t-1][i]; } // input - VariableIndex i_ait = cg->add_function({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1, vars[C2I], i_c_tm1}); + VariableIndex i_ait; + if (has_prev_state) + i_ait = cg->add_function({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1, vars[C2I], i_c_tm1}); + else + i_ait = cg->add_function({vars[BI], vars[X2I], in}); VariableIndex i_it = cg->add_function({i_ait}); // forget VariableIndex i_ft = cg->add_function({i_it}, 1.f); // write memory cell - VariableIndex i_awt = cg->add_function({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); + VariableIndex i_awt; + if (has_prev_state) + i_awt = cg->add_function({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); + else + i_awt = cg->add_function({vars[BC], vars[X2C], in}); VariableIndex i_wt = cg->add_function({i_awt}); // output - VariableIndex i_nwt = cg->add_function({i_it, i_wt}); - VariableIndex i_crt = cg->add_function({i_ft, i_c_tm1}); - ct[i] = cg->add_function({i_crt, i_nwt}); // new memory cell at time t + if (has_prev_state) { + VariableIndex i_nwt = cg->add_function({i_it, i_wt}); + VariableIndex i_crt = cg->add_function({i_ft, i_c_tm1}); + ct[i] = cg->add_function({i_crt, i_nwt}); // new memory cell at time t + } else { + ct[i] = cg->add_function({i_it, i_wt}); + } - VariableIndex i_aot = cg->add_function({vars[BO], vars[X2O], in, vars[H2O], i_h_tm1, vars[C2O], ct[i]}); + VariableIndex i_aot; + if (has_prev_state) + i_aot = cg->add_function({vars[BO], vars[X2O], in, vars[H2O], i_h_tm1, vars[C2O], ct[i]}); + else + i_aot = cg->add_function({vars[BO], vars[X2O], in}); VariableIndex i_ot = cg->add_function({i_aot}); VariableIndex ph_t = cg->add_function({ct[i]}); in = ht[i] = cg->add_function({i_ot, ph_t}); diff --git a/cnn/lstm.h b/cnn/lstm.h index 414538859..60060c138 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -56,6 +56,7 @@ struct LSTMBuilder { // initial values of h and c at each layer // - both default to zero matrix input + bool has_initial_state; // if this is false, treat h0 and c0 as 0 std::vector h0; std::vector c0; diff --git a/cnn/model.cc b/cnn/model.cc index 18b1a782b..66ee77ce6 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -8,6 +8,7 @@ #define CNN_ALIGN 256 #if HAVE_CUDA +#include "cnn/gpu-ops.h" #include "cnn/cuda.h" #endif @@ -29,11 +30,7 @@ size_t Parameters::size() const { return dim.size(); } void Parameters::g_squared_l2norm(float* sqnorm) const { #if HAVE_CUDA -// TODO compute norm of gradient - should this be done sparsely or should the gradient -// be allocated in a single block? -// CUBLAS_CHECK(cublasSnrm2(cublas_handle, xs[0]->d.size(), xs[0]->v, 1, fx.v)); -// cerr << "RES: " << fx << endl; - *sqnorm = 1; + gpu::l2_norm_reducer(g.d.size(), g.v, sqnorm, true, false); #else *sqnorm = (*g).squaredNorm(); #endif @@ -79,20 +76,32 @@ size_t LookupParameters::size() const { } void LookupParameters::g_squared_l2norm(float* sqnorm) const { +#if HAVE_CUDA + bool acc = false; + for (auto i : non_zero_grads) { + gpu::l2_norm_reducer(grads[i].d.size(), grads[i].v, sqnorm, true, acc); + acc = true; + } +#else real a = 0; for (auto i : non_zero_grads) a += (*grads[i]).squaredNorm(); *sqnorm = a; +#endif } void LookupParameters::accumulate_grad(unsigned index, const Tensor& d) { non_zero_grads.insert(index); +#if HAVE_CUDA + CUBLAS_CHECK(cublasSaxpy(cublas_handle, d.d.size(), kSCALAR_ONE, d.v, 1, grads[index].v, 1)); +#else *grads[index] += *d; +#endif } void LookupParameters::clear() { for (auto i : non_zero_grads) - (*grads[i]).setZero(); + TensorTools::Zero(grads[i]); non_zero_grads.clear(); } @@ -100,14 +109,25 @@ Model::~Model() { for (auto p : all_params) delete p; } -void Model::gradient_l2_norm(float* norm) const { - double gg = 0; +float Model::gradient_l2_norm() const { + if (!gradient_norm_scratch) + gradient_norm_scratch = (float*)cnn_mm_malloc(all_params.size() * sizeof(float), 256); + int pi = 0; for (auto p : all_params) { - float sqn = 0; - p->g_squared_l2norm(&sqn); - gg += sqn; + p->g_squared_l2norm(&gradient_norm_scratch[pi]); + ++pi; } - *norm = sqrt(gg); +#if HAVE_CUDA + float res = 0; + gpu::l2_norm_reducer(all_params.size(), gradient_norm_scratch, gradient_norm_scratch, false, false); + cudaMemcpy(&res, gradient_norm_scratch, sizeof(float), cudaMemcpyDeviceToHost); + return sqrt(res); +#else + double gg = 0; + for (unsigned i = 0; i < pi; ++i) + gg += gradient_norm_scratch[i]; + return sqrt(gg); +#endif } Parameters* Model::add_parameters(const Dim& d) { diff --git a/cnn/model.h b/cnn/model.h index 8bb3d23e3..67dd0a2bc 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -77,8 +77,9 @@ struct LookupParameters : public ParametersBase { // parameters know how to track their gradients, but any extra information (like velocity) will live here class Model { public: + Model() : gradient_norm_scratch() {} ~Model(); - void gradient_l2_norm(float* norm) const; + float gradient_l2_norm() const; Parameters* add_parameters(const Dim& d); // initialized randomly LookupParameters* add_lookup_parameters(unsigned n, const Dim& d); @@ -119,6 +120,7 @@ class Model { std::vector all_params; std::vector params; std::vector lookup_params; + mutable float* gradient_norm_scratch; }; } // namespace cnn diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 35014fa98..fc63d84ef 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -442,8 +442,12 @@ EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float logsumexp(const T& x) { void Softmax::forward(const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { +#if HAVE_CUDA + gpu::softmax(xs[0]->d.size(), xs[0]->v, fx.v); +#else auto x = **xs[0]; *fx = x.unaryExpr(FSoftmaxNormalize(logsumexp(x))); +#endif } else { cerr << "SoftmaxForward not implemented for multiple columns\n"; abort(); @@ -461,9 +465,14 @@ void Softmax::backward(const vector& xs, void PickNegLogSoftmax::forward(const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { + logz = (float*)fxs->allocate(sizeof(float)); +#if HAVE_CUDA + gpu::pnlsoftmax(xs[0]->d.size(), *pval, xs[0]->v, fx.v, logz); +#else auto x = **xs[0]; - logz = logsumexp(x); - fx.v[0] = logz - x(*pval); + *logz = logsumexp(x); + fx.v[0] = *logz - x(*pval); +#endif } else { cerr << "SoftmaxForward not implemented for multiple columns\n"; abort(); @@ -477,11 +486,15 @@ void PickNegLogSoftmax::backward(const vector& xs, Tensor& dEdxi) const { if (xs[0]->d.cols() == 1) { const auto elem = *pval; +#if HAVE_CUDA + gpu::pnlsoftmax_backward(dEdxi.d.size(), elem, xs[0]->v, dEdf.v, logz, dEdxi.v); +#else const float err = dEdf.v[0]; auto x = **xs[0]; // logz is computed in the forward pass and cached - *dEdxi += x.unaryExpr(FNegLogSoftmaxBackward(logz, err)); + *dEdxi += x.unaryExpr(FNegLogSoftmaxBackward(*logz, err)); (*dEdxi)(elem) -= err; +#endif } else { cerr << "PickNegLogSoftmax not implemented for multiple columns\n"; abort(); @@ -849,16 +862,7 @@ void LogisticSigmoid::backward(const vector& xs, void BinaryLogLoss::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); assert(xs.front()->d.size() == 1); - const auto y_pred = xs[0]->v[0]; - assert(y_pred >= 0.); - assert(y_pred <= 1.); - const real ty = *ptarget_y; - assert(ty >= 0.); - assert(ty <= 1.); - auto& res = fx.v[0]; - res = 0; - if (ty > 0.) res -= ty * log(y_pred); - if ((1 - ty) > 0.) res -= (1 - ty) * log1p(-y_pred); + fx.v[0] = FBinaryLogLoss()(xs[0]->v[0], *ptarget_y); } void BinaryLogLoss::backward(const vector& xs, @@ -868,10 +872,7 @@ void BinaryLogLoss::backward(const vector& xs, Tensor& dEdxi) const { const auto y_pred = xs[0]->v[0]; const real ty = *ptarget_y; - real scale = 0; - if (ty > 0.) scale -= ty / y_pred; - if ((1 - ty) >= 0.) scale += (1 - ty) / (1 - y_pred); - *dEdxi += *dEdf * scale; + dEdxi.v[0] += FBinaryLogLossBackward()(y_pred,ty,dEdf.v[0]); } } // namespace cnn diff --git a/cnn/nodes.h b/cnn/nodes.h index 5b4de627e..2afda9c4a 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -427,7 +427,7 @@ struct PickNegLogSoftmax : public Node { const Tensor& dEdf, unsigned i, Tensor& dEdxi) const override; - mutable float logz; + mutable float* logz; unsigned val; const unsigned* pval; }; diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index 66ef5f0f1..9385ae437 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -49,7 +49,7 @@ Dim InputNode::dim_forward(const vector& xs) const { void InputNode::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); #if HAVE_CUDA - cudaMemcpy(fx.v, &pdata->front(), dim.size() * sizeof(float), cudaMemcpyHostToDevice); + cudaMemcpyAsync(fx.v, &pdata->front(), dim.size() * sizeof(float), cudaMemcpyHostToDevice); #else memcpy(fx.v, &pdata->front(), dim.size() * sizeof(float)); #endif @@ -77,7 +77,7 @@ Dim ScalarInputNode::dim_forward(const vector& xs) const { void ScalarInputNode::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); #if HAVE_CUDA - cudaMemcpy(fx.v, pdata, 1 * sizeof(float), cudaMemcpyHostToDevice); + cudaMemcpyAsync(fx.v, pdata, 1 * sizeof(float), cudaMemcpyHostToDevice); #else fx.v[0] = *pdata; #endif @@ -104,7 +104,7 @@ Dim LookupNode::dim_forward(const vector& xs) const { void LookupNode::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - *fx = *params->values[*pindex]; + fx.v = params->values[*pindex].v; } void LookupNode::backward(const vector& xs, diff --git a/cnn/tensor.cc b/cnn/tensor.cc index 4954a707d..f339ceb93 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -52,10 +52,18 @@ float TensorTools::AccessElement(const Tensor& v, const Dim& index) { #endif } +void TensorTools::SetElements(const Tensor& v, const vector& vec) { +#if HAVE_CUDA + cudaMemcpyAsync(v.v, &vec[0], sizeof(real) * vec.size(), cudaMemcpyHostToDevice); +#else + memcpy(v.v, &vec[0], sizeof(real) * vec.size()); +#endif +} + void TensorTools::Constant(Tensor& d, float c) { #if HAVE_CUDA if (!c) { - CUDA_CHECK(cudaMemset(d.v, 0, d.d.size() * sizeof(float))); + CUDA_CHECK(cudaMemsetAsync(d.v, 0, d.d.size() * sizeof(float))); } else { fill(d.v, d.v + d.d.size(), c); } diff --git a/cnn/tensor.h b/cnn/tensor.h index 822a12d3b..4411e71b1 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -40,13 +40,27 @@ struct Tensor { template void save(Archive& ar, const unsigned int) const { ar & d; +#if HAVE_CUDA + float* vc = (float*)malloc(d.size() * sizeof(float)); + CUDA_CHECK(cudaMemcpy(vc, v, d.size() * sizeof(float), cudaMemcpyDeviceToHost)); + ar & boost::serialization::make_array(vc, d.size()); + free(vc); +#else ar & boost::serialization::make_array(v, d.size()); +#endif } template void load(Archive& ar, const unsigned int) { ar & d; +#if HAVE_CUDA + CUDA_CHECK(cudaMalloc(&v, d.size() * sizeof(float))); + float* vc = static_cast(std::malloc(d.size() * sizeof(float))); + ar & boost::serialization::make_array(vc, d.size()); + CUDA_CHECK(cudaMemcpyAsync(v, vc, d.size() * sizeof(float), cudaMemcpyHostToDevice)); +#else v = static_cast(std::malloc(d.size() * sizeof(float))); ar & boost::serialization::make_array(v, d.size()); +#endif } BOOST_SERIALIZATION_SPLIT_MEMBER() }; @@ -64,6 +78,7 @@ struct TensorTools { static void RandomizeNormal(real mean, real stddev, Tensor& val); // AccessElement is very, very slow (potentially) - use appropriately static float AccessElement(const Tensor& v, const Dim& index); + static void SetElements(const Tensor& v, const std::vector& vec); }; real rand01(); diff --git a/cnn/training.cc b/cnn/training.cc index 9f04fc40b..52010da2c 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -11,8 +11,7 @@ Trainer::~Trainer() {} float Trainer::clip_gradients() { float gscale = 1; if (clipping_enabled) { - float gg = 0; - model->gradient_l2_norm(&gg); + float gg = model->gradient_l2_norm(); if (gg > clip_threshold) { ++clips; gscale = clip_threshold / gg; @@ -35,7 +34,7 @@ void SimpleSGDTrainer::update(real scale) { for (auto p : model->lookup_parameters_list()) { for (auto i : p->non_zero_grads) { #if HAVE_CUDA - cerr << "implement lookup update\n"; abort(); + gpu::sgd_update(p->values[i].d.size(), p->grads[i].v, p->values[i].v, eta * scale * gscale, lambda); #else auto reg = (*p->values[i]) * lambda; *p->values[i] -= (*p->grads[i] * (eta * scale * gscale) + reg); @@ -46,27 +45,8 @@ void SimpleSGDTrainer::update(real scale) { ++updates; } -#if 0 -static inline Tensor& get_or_init(Tensor& x, const Tensor& t) { -#if WITH_THPP_BACKEND - if (x.ndims() == 0) { - x = Tensor(t.sizes()); - x.zero(); - } - return x; -#endif -#ifdef WITH_EIGEN_BACKEND - if (x.rows() == 0) { - x = t; - x.setZero(); - } - return x; -#endif -#if WITH_MINERVA_BACKEND -#endif -} - void MomentumSGDTrainer::update(real scale) { +#if 0 clip_gradients(); for (auto p : model->parameters_list()) { Tensor& v = get_or_init(vp[p], p->values); @@ -119,7 +99,7 @@ void RMSPropTrainer::update(real scale) { } p->clear(); } -} #endif +} } // namespace cnn diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index ad44cba68..cbb01c3b3 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,21 +1,12 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -ADD_EXECUTABLE(embed-cl embed-cl.cc) -target_link_libraries(embed-cl cnn ${LIBS}) - -ADD_EXECUTABLE(encdec encdec.cc) -target_link_libraries(encdec cnn ${LIBS}) - -ADD_EXECUTABLE(xor xor.cc) -target_link_libraries(xor cnn ${LIBS}) - -ADD_EXECUTABLE(xor-xent xor-xent.cc) -target_link_libraries(xor-xent cnn ${LIBS}) - -ADD_EXECUTABLE(rnnlm rnnlm.cc) -target_link_libraries(rnnlm cnn ${LIBS}) - -ADD_EXECUTABLE(nlm nlm.cc) -target_link_libraries(nlm cnn ${LIBS}) - +foreach(TARGET embed-cl encdec xor xor-xent rnnlm nlm) + ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) + target_link_libraries(${TARGET} cnn ${LIBS}) + if (WITH_CUDA_BACKEND) + add_dependencies(${TARGET} cnncuda) + target_link_libraries(${TARGET} cnncuda) + CUDA_ADD_CUBLAS_TO_TARGET(${TARGET}) + endif (WITH_CUDA_BACKEND) +endforeach() diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index 3e54033c5..8f8443184 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -25,34 +25,45 @@ int kTRG_EOS; struct Encoder { LookupParameters* p_s; LookupParameters* p_t; + vector m; explicit Encoder(Model& model) { p_s = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {REP_DIM}); p_t = model.add_lookup_parameters(OUTPUT_VOCAB_SIZE, {REP_DIM}); } VariableIndex EmbedSource(const vector& sent, ComputationGraph& cg) { - vector m(sent.size() + 2); + m.resize(sent.size() + 2); m[0] = cg.add_lookup(p_s, kSRC_SOS); int i = 1; for (auto& w : sent) m[i++] = cg.add_lookup(p_s, w); m[i] = cg.add_lookup(p_s, kSRC_EOS); +#define DUMB_ADDITIVE +#ifdef DUMB_ADDITIVE + return cg.add_function(m); +#else VariableIndex i_m = cg.add_function(m); - //i_m = cg.add_function({i_m}, 2); - //i_m = cg.add_function({i_m}); + i_m = cg.add_function({i_m}, 2); + i_m = cg.add_function({i_m}); return cg.add_function({i_m}); +#endif } VariableIndex EmbedTarget(const vector& sent, ComputationGraph& cg) { - vector m(sent.size() + 2); + m.resize(sent.size() + 2); m[0] = cg.add_lookup(p_s, kTRG_SOS); int i = 1; for (auto& w : sent) m[i++] = cg.add_lookup(p_t, w); m[i] = cg.add_lookup(p_s, kTRG_EOS); +#ifdef DUMB_ADDITIVE + return cg.add_function(m); +#else VariableIndex i_m = cg.add_function(m); i_m = cg.add_function({i_m}, 2); + i_m = cg.add_function({i_m}); return cg.add_function({i_m}); +#endif } }; diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 8b5e41f44..390b93283 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -18,8 +18,8 @@ using namespace std; using namespace cnn; unsigned LAYERS = 2; -unsigned INPUT_DIM = 8; -unsigned HIDDEN_DIM = 24; +unsigned INPUT_DIM = 8; //256 +unsigned HIDDEN_DIM = 24; // 1024 unsigned VOCAB_SIZE = 0; cnn::Dict d; @@ -207,7 +207,7 @@ int main(int argc, char** argv) { si = 0; if (first) { first = false; } else { sgd->update_epoch(); } cerr << "**SHUFFLE\n"; - random_shuffle(order.begin(), order.end()); + shuffle(order.begin(), order.end(), *rndeng); } // build graph for this instance diff --git a/examples/xor.cc b/examples/xor.cc index a7f26ee13..4700d7c5e 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -1,7 +1,7 @@ #include "cnn/nodes.h" #include "cnn/cnn.h" #include "cnn/training.h" - +#include "cnn/gpu-ops.h" #include #include @@ -22,8 +22,7 @@ int main(int argc, char** argv) { //MomentumSGDTrainer sgd(&m); Parameters& p_a = *m.add_parameters({1}); - Parameters& p_b1 = *m.add_parameters({HIDDEN_SIZE/2}); - Parameters& p_b2 = *m.add_parameters({HIDDEN_SIZE/2}); + Parameters& p_b = *m.add_parameters({HIDDEN_SIZE}); Parameters& p_W = *m.add_parameters({HIDDEN_SIZE, 2}); Parameters& p_V = *m.add_parameters({1, HIDDEN_SIZE}); @@ -31,9 +30,7 @@ int main(int argc, char** argv) { ComputationGraph cg; // get symbolic variables corresponding to parameters - VariableIndex i_b1 = cg.add_parameter(&p_b1); - VariableIndex i_b2 = cg.add_parameter(&p_b2); - VariableIndex i_b = cg.add_function({i_b1, i_b2}); + VariableIndex i_b = cg.add_parameter(&p_b); VariableIndex i_a = cg.add_parameter(&p_a); VariableIndex i_W = cg.add_parameter(&p_W); VariableIndex i_V = cg.add_parameter(&p_V); @@ -45,7 +42,7 @@ int main(int argc, char** argv) { // two options: MatrixMultiply and Sum, or AffineTransform // these are identical, but AffineTransform may be slightly more efficient -#if 1 +#if 0 VariableIndex i_f = cg.add_function({i_W, i_x}); VariableIndex i_g = cg.add_function({i_f, i_b}); #else @@ -53,7 +50,7 @@ int main(int argc, char** argv) { #endif VariableIndex i_h = cg.add_function({i_g}); -#if 0 +#if 1 VariableIndex i_p = cg.add_function({i_V, i_h}); VariableIndex i_y_pred = cg.add_function({i_p, i_a}); #else From b755759a340551c935d49b208bfae652737dc010 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 20 May 2015 22:20:48 -0400 Subject: [PATCH 046/965] interface cleanup --- cnn/cnn.cc | 2 +- cnn/cnn.h | 2 +- cnn/dim.cc | 7 +++++++ cnn/dim.h | 2 ++ cnn/gru.cc | 18 +++++++++--------- cnn/lstm.cc | 22 +++++++++++----------- cnn/nodes-common.cc | 7 ------- cnn/nodes.cc | 1 - cnn/rnn.cc | 6 +++--- examples/encdec.cc | 12 ++++++------ examples/nlm.cc | 12 ++++++------ examples/rnnlm.cc | 8 ++++---- examples/xor-xent.cc | 8 ++++---- examples/xor.cc | 8 ++++---- 14 files changed, 58 insertions(+), 57 deletions(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 6f43479b0..b09a9cbaf 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -51,7 +51,7 @@ VariableIndex ComputationGraph::add_input(const Dim& d, const vector* pm) return new_node_index; } -VariableIndex ComputationGraph::add_parameter(Parameters* p) { +VariableIndex ComputationGraph::add_parameters(Parameters* p) { VariableIndex new_node_index(nodes.size()); ParameterNode* new_node = new ParameterNode(p); nodes.push_back(new_node); diff --git a/cnn/cnn.h b/cnn/cnn.h index 837bce347..c19b828d7 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -56,7 +56,7 @@ struct ComputationGraph { // parameters are things that are optimized. in contrast to a system like // Torch where computational modules may have their own parameters, in CNN // parameters are just parameters - VariableIndex add_parameter(Parameters* p); + VariableIndex add_parameters(Parameters* p); // use pindex to point to a memory location where the index will live // that the caller owns VariableIndex add_lookup(LookupParameters* p, const unsigned* pindex); diff --git a/cnn/dim.cc b/cnn/dim.cc index dd01ec876..d65945695 100644 --- a/cnn/dim.cc +++ b/cnn/dim.cc @@ -15,5 +15,12 @@ ostream& operator<<(ostream& os, const Dim& d) { return os << '}'; } +ostream& operator<<(ostream& os, const vector& ds) { + os << '['; + for (unsigned i = 0; i < ds.size(); ++i) + os << (i ? " " : "") << ds[i]; + return os << ']'; +} + } // namespace cnn diff --git a/cnn/dim.h b/cnn/dim.h index 2639eb079..1ba33814a 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -5,6 +5,7 @@ #include #include #include +#include #define CNN_MAX_TENSOR_DIM 7 @@ -50,6 +51,7 @@ inline bool operator==(const Dim& a, const Dim& b) { inline bool operator!=(const Dim& a, const Dim& b) { return !(a == b); } std::ostream& operator<<(std::ostream& os, const Dim& d); +std::ostream& operator<<(std::ostream& os, const std::vector& ds); } // namespace cnn diff --git a/cnn/gru.cc b/cnn/gru.cc index b50ffefd4..f18fe6e8e 100644 --- a/cnn/gru.cc +++ b/cnn/gru.cc @@ -50,19 +50,19 @@ void GRUBuilder::new_graph(ComputationGraph* hg) { auto& p = params[i]; // z - VariableIndex i_x2z = hg->add_parameter(p[X2Z]); - VariableIndex i_h2z = hg->add_parameter(p[H2Z]); - VariableIndex i_bz = hg->add_parameter(p[BZ]); + VariableIndex i_x2z = hg->add_parameters(p[X2Z]); + VariableIndex i_h2z = hg->add_parameters(p[H2Z]); + VariableIndex i_bz = hg->add_parameters(p[BZ]); // r - VariableIndex i_x2r = hg->add_parameter(p[X2R]); - VariableIndex i_h2r = hg->add_parameter(p[H2R]); - VariableIndex i_br = hg->add_parameter(p[BR]); + VariableIndex i_x2r = hg->add_parameters(p[X2R]); + VariableIndex i_h2r = hg->add_parameters(p[H2R]); + VariableIndex i_br = hg->add_parameters(p[BR]); // h - VariableIndex i_x2h = hg->add_parameter(p[X2H]); - VariableIndex i_h2h = hg->add_parameter(p[H2H]); - VariableIndex i_bh = hg->add_parameter(p[BH]); + VariableIndex i_x2h = hg->add_parameters(p[X2H]); + VariableIndex i_h2h = hg->add_parameters(p[H2H]); + VariableIndex i_bh = hg->add_parameters(p[BH]); vector vars = {i_x2z, i_h2z, i_bz, i_x2r, i_h2r, i_br, i_x2h, i_h2h, i_bh}; param_vars.push_back(vars); diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 72e0bd84b..51c46c3e7 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -52,21 +52,21 @@ void LSTMBuilder::new_graph(ComputationGraph* cg) { auto& p = params[i]; // i - VariableIndex i_x2i = cg->add_parameter(p[X2I]); - VariableIndex i_h2i = cg->add_parameter(p[H2I]); - VariableIndex i_c2i = cg->add_parameter(p[C2I]); - VariableIndex i_bi = cg->add_parameter(p[BI]); + VariableIndex i_x2i = cg->add_parameters(p[X2I]); + VariableIndex i_h2i = cg->add_parameters(p[H2I]); + VariableIndex i_c2i = cg->add_parameters(p[C2I]); + VariableIndex i_bi = cg->add_parameters(p[BI]); // o - VariableIndex i_x2o = cg->add_parameter(p[X2O]); - VariableIndex i_h2o = cg->add_parameter(p[H2O]); - VariableIndex i_c2o = cg->add_parameter(p[C2O]); - VariableIndex i_bo = cg->add_parameter(p[BO]); + VariableIndex i_x2o = cg->add_parameters(p[X2O]); + VariableIndex i_h2o = cg->add_parameters(p[H2O]); + VariableIndex i_c2o = cg->add_parameters(p[C2O]); + VariableIndex i_bo = cg->add_parameters(p[BO]); // c - VariableIndex i_x2c = cg->add_parameter(p[X2C]); - VariableIndex i_h2c = cg->add_parameter(p[H2C]); - VariableIndex i_bc = cg->add_parameter(p[BC]); + VariableIndex i_x2c = cg->add_parameters(p[X2C]); + VariableIndex i_h2c = cg->add_parameters(p[H2C]); + VariableIndex i_bc = cg->add_parameters(p[BC]); vector vars = {i_x2i, i_h2i, i_c2i, i_bi, i_x2o, i_h2o, i_c2o, i_bo, i_x2c, i_h2c, i_bc}; param_vars.push_back(vars); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 3000bd497..8f52edb79 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -8,13 +8,6 @@ using namespace std; namespace cnn { -inline ostream& operator<<(ostream& os, const vector& ds) { - os << '['; - for (unsigned i = 0; i < ds.size(); ++i) - os << (i ? " " : "") << ds[i]; - return os << ']'; -} - inline bool LooksLikeVector(const Dim& d) { if (d.ndims() == 1) return true; if (d.ndims() > 1) { diff --git a/cnn/nodes.cc b/cnn/nodes.cc index fc63d84ef..6f42ed361 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -61,7 +61,6 @@ void SumColumns::backward(const vector& xs, } void KMHNGram::forward(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); auto x = **xs[0]; const int new_cols = x.cols() - n + 1; assert(new_cols > 0); diff --git a/cnn/rnn.cc b/cnn/rnn.cc index ee3b07e42..0736a4612 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -34,9 +34,9 @@ void RNNBuilder::new_graph(ComputationGraph* cg) { Parameters* p_x2h = params[i][0]; Parameters* p_h2h = params[i][1]; Parameters* p_hb = params[i][2]; - VariableIndex i_x2h = cg->add_parameter(p_x2h); - VariableIndex i_h2h = cg->add_parameter(p_h2h); - VariableIndex i_hb = cg->add_parameter(p_hb); + VariableIndex i_x2h = cg->add_parameters(p_x2h); + VariableIndex i_h2h = cg->add_parameters(p_h2h); + VariableIndex i_hb = cg->add_parameters(p_hb); vector vars = {i_x2h, i_h2h, i_hb}; param_vars.push_back(vars); } diff --git a/examples/encdec.cc b/examples/encdec.cc index 01fdc5c2b..5f3737f30 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -77,13 +77,13 @@ struct EncoderDecoder { for (auto h_l : rev_enc_builder.final_h()) to[c++] = h_l; assert(c == LAYERS * 2); VariableIndex i_combined = cg.add_function(to); - VariableIndex i_ie2h = cg.add_parameter(p_ie2h); - VariableIndex i_bie = cg.add_parameter(p_bie); + VariableIndex i_ie2h = cg.add_parameters(p_ie2h); + VariableIndex i_bie = cg.add_parameters(p_bie); VariableIndex i_t = cg.add_function({i_bie, i_ie2h, i_combined}); cg.incremental_forward(); VariableIndex i_h = cg.add_function({i_t}); - VariableIndex i_h2oe = cg.add_parameter(p_h2oe); - VariableIndex i_boe = cg.add_parameter(p_boe); + VariableIndex i_h2oe = cg.add_parameters(p_h2oe); + VariableIndex i_boe = cg.add_parameters(p_boe); VariableIndex i_nc = cg.add_function({i_boe, i_h2oe, i_h}); vector oein_c(LAYERS); vector oein_h(LAYERS); @@ -95,8 +95,8 @@ struct EncoderDecoder { dec_builder.start_new_sequence(&cg, oein_c, oein_h); // decoder - VariableIndex i_R = cg.add_parameter(p_R); - VariableIndex i_bias = cg.add_parameter(p_bias); + VariableIndex i_R = cg.add_parameters(p_R); + VariableIndex i_bias = cg.add_parameters(p_bias); vector errs; const unsigned oslen = osent.size() - 1; for (unsigned t = 0; t < oslen; ++t) { diff --git a/examples/nlm.cc b/examples/nlm.cc index f88e32945..961b447cd 100644 --- a/examples/nlm.cc +++ b/examples/nlm.cc @@ -34,13 +34,13 @@ int main(int argc, char** argv) { VariableIndex i_c1 = cg.add_lookup(p_c, &in_c1); VariableIndex i_c2 = cg.add_lookup(p_c, &in_c2); VariableIndex i_c3 = cg.add_lookup(p_c, &in_c3); - VariableIndex i_C1 = cg.add_parameter(p_C1); - VariableIndex i_C2 = cg.add_parameter(p_C2); - VariableIndex i_C3 = cg.add_parameter(p_C3); - VariableIndex i_hb = cg.add_parameter(p_hb); - VariableIndex i_R = cg.add_parameter(p_R); + VariableIndex i_C1 = cg.add_parameters(p_C1); + VariableIndex i_C2 = cg.add_parameters(p_C2); + VariableIndex i_C3 = cg.add_parameters(p_C3); + VariableIndex i_hb = cg.add_parameters(p_hb); + VariableIndex i_R = cg.add_parameters(p_R); unsigned ytrue; // set ytrue to change the value of the input - VariableIndex i_bias = cg.add_parameter(p_bias); + VariableIndex i_bias = cg.add_parameters(p_bias); // r = hb + C1 * c1 + C2 * c2 + C3 * c3 VariableIndex i_r = cg.add_function({i_hb, i_C1, i_c1, i_C2, i_c2, i_C3, i_c3}); diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 390b93283..c35448653 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -43,8 +43,8 @@ struct RNNLanguageModel { const unsigned slen = sent.size() - 1; builder.new_graph(&cg); // reset RNN builder for new graph builder.start_new_sequence(&cg); - VariableIndex i_R = cg.add_parameter(p_R); // hidden -> word rep parameter - VariableIndex i_bias = cg.add_parameter(p_bias); // word bias + VariableIndex i_R = cg.add_parameters(p_R); // hidden -> word rep parameter + VariableIndex i_bias = cg.add_parameters(p_bias); // word bias vector errs; for (unsigned t = 0; t < slen; ++t) { // x_t = lookup sent[t] in parameters p_c @@ -83,8 +83,8 @@ struct RNNLanguageModel { ComputationGraph cg; builder.new_graph(&cg); // reset RNN builder for new graph builder.start_new_sequence(&cg); - VariableIndex i_R = cg.add_parameter(p_R); // hidden -> word rep parameter - VariableIndex i_bias = cg.add_parameter(p_bias); // word bias + VariableIndex i_R = cg.add_parameters(p_R); // hidden -> word rep parameter + VariableIndex i_bias = cg.add_parameters(p_bias); // word bias vector errs; int len = 0; int cur = kSOS; diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index 58046838e..8814181d9 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -29,10 +29,10 @@ int main(int argc, char** argv) { ComputationGraph cg; // get symbolic variables corresponding to parameters - VariableIndex i_b = cg.add_parameter(&p_b); - VariableIndex i_a = cg.add_parameter(&p_a); - VariableIndex i_W = cg.add_parameter(&p_W); - VariableIndex i_V = cg.add_parameter(&p_V); + VariableIndex i_b = cg.add_parameters(&p_b); + VariableIndex i_a = cg.add_parameters(&p_a); + VariableIndex i_W = cg.add_parameters(&p_W); + VariableIndex i_V = cg.add_parameters(&p_V); vector x_values(2); // set x_values to change the inputs to the network VariableIndex i_x = cg.add_input({2}, &x_values); diff --git a/examples/xor.cc b/examples/xor.cc index 4700d7c5e..80435c5e5 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -30,10 +30,10 @@ int main(int argc, char** argv) { ComputationGraph cg; // get symbolic variables corresponding to parameters - VariableIndex i_b = cg.add_parameter(&p_b); - VariableIndex i_a = cg.add_parameter(&p_a); - VariableIndex i_W = cg.add_parameter(&p_W); - VariableIndex i_V = cg.add_parameter(&p_V); + VariableIndex i_b = cg.add_parameters(&p_b); + VariableIndex i_a = cg.add_parameters(&p_a); + VariableIndex i_W = cg.add_parameters(&p_W); + VariableIndex i_V = cg.add_parameters(&p_V); vector x_values(2); // set x_values to change the inputs to the network VariableIndex i_x = cg.add_input({2}, &x_values); From 48dcc91851ffbaf7770d1d0cb298bd269e1236cb Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 20 May 2015 23:17:23 -0400 Subject: [PATCH 047/965] remove unnecessary code --- cnn/lstm.cc | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 51c46c3e7..d25102d01 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -15,27 +15,27 @@ namespace cnn { enum { X2I, H2I, C2I, BI, X2O, H2O, C2O, BO, X2C, H2C, BC }; LSTMBuilder::LSTMBuilder(unsigned layers, - unsigned input_dim, - unsigned hidden_dim, - Model* model) : hidden_dim(hidden_dim), layers(layers), zeros(hidden_dim, 0) { + unsigned input_dim, + unsigned hidden_dim, + Model* model) : hidden_dim(hidden_dim), layers(layers), zeros(hidden_dim, 0) { unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // i - Parameters* p_x2i = model->add_parameters(Dim({hidden_dim, layer_input_dim})); - Parameters* p_h2i = model->add_parameters(Dim({hidden_dim, hidden_dim})); - Parameters* p_c2i = model->add_parameters(Dim({hidden_dim, hidden_dim})); - Parameters* p_bi = model->add_parameters(Dim({hidden_dim})); + Parameters* p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2i = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_c2i = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_bi = model->add_parameters({hidden_dim}); // o - Parameters* p_x2o = model->add_parameters(Dim({hidden_dim, layer_input_dim})); - Parameters* p_h2o = model->add_parameters(Dim({hidden_dim, hidden_dim})); - Parameters* p_c2o = model->add_parameters(Dim({hidden_dim, hidden_dim})); - Parameters* p_bo = model->add_parameters(Dim({hidden_dim})); + Parameters* p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2o = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_c2o = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_bo = model->add_parameters({hidden_dim}); // c - Parameters* p_x2c = model->add_parameters(Dim({hidden_dim, layer_input_dim})); - Parameters* p_h2c = model->add_parameters(Dim({hidden_dim, hidden_dim})); - Parameters* p_bc = model->add_parameters(Dim({hidden_dim})); + Parameters* p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2c = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_bc = model->add_parameters({hidden_dim}); layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; @@ -48,7 +48,6 @@ void LSTMBuilder::new_graph(ComputationGraph* cg) { param_vars.clear(); for (unsigned i = 0; i < layers; ++i) { - string layer = to_string(i); auto& p = params[i]; // i From 5558f3552e87ad0cc4349f448c23b918492ec134 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 21 May 2015 00:47:46 -0400 Subject: [PATCH 048/965] refactor lstm --- cnn/CMakeLists.txt | 2 +- cnn/lstm.cc | 30 ++++++++++---------- cnn/lstm.h | 41 ++++++--------------------- cnn/rnn.cc | 49 ++++++++++++++++---------------- cnn/rnn.h | 69 +++++++++++++++++++++++++++++----------------- examples/encdec.cc | 13 ++++----- examples/rnnlm.cc | 7 ++--- 7 files changed, 100 insertions(+), 111 deletions(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 16f97cd75..59950764c 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -5,7 +5,7 @@ set(cnn_library_SRCS dict.cc dim.cc exec.cc - gru.cc +# gru.cc init.cc lstm.cc model.cc diff --git a/cnn/lstm.cc b/cnn/lstm.cc index d25102d01..6308313dc 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -17,7 +17,7 @@ enum { X2I, H2I, C2I, BI, X2O, H2O, C2O, BO, X2C, H2C, BC }; LSTMBuilder::LSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model) : hidden_dim(hidden_dim), layers(layers), zeros(hidden_dim, 0) { + Model* model) : layers(layers) { unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // i @@ -43,8 +43,7 @@ LSTMBuilder::LSTMBuilder(unsigned layers, } // layers } -void LSTMBuilder::new_graph(ComputationGraph* cg) { - sm.transition(RNNOp::new_graph); +void LSTMBuilder::new_graph_impl(ComputationGraph* cg) { param_vars.clear(); for (unsigned i = 0; i < layers; ++i) { @@ -72,25 +71,24 @@ void LSTMBuilder::new_graph(ComputationGraph* cg) { } } -void LSTMBuilder::start_new_sequence(ComputationGraph* cg, - vector c_0, - vector h_0) { - sm.transition(RNNOp::start_new_sequence); +void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { h.clear(); c.clear(); - h0 = h_0; - c0 = c_0; - if (h0.empty() || c0.empty()) { - has_initial_state = false; - } else { + if (hinit.size() > 0) { + assert(layers*2 == hinit.size()); + h0.resize(layers); + c0.resize(layers); + for (unsigned i = 0; i < layers; ++i) { + h0[i] = hinit[i]; + c0[i] = hinit[i + layers]; + } has_initial_state = true; - assert (h0.size() == layers); - assert (c0.size() == layers); + } else { + has_initial_state = false; } } -VariableIndex LSTMBuilder::add_input(VariableIndex x, ComputationGraph* cg) { - sm.transition(RNNOp::add_input); +VariableIndex LSTMBuilder::add_input_impl(VariableIndex x, ComputationGraph* cg) { const unsigned t = h.size(); h.push_back(vector(layers)); c.push_back(vector(layers)); diff --git a/cnn/lstm.h b/cnn/lstm.h index 60060c138..7b9838f64 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -2,49 +2,30 @@ #define CNN_LSTM_H_ #include "cnn/cnn.h" -#include "cnn/rnn-state-machine.h" +#include "cnn/rnn.h" namespace cnn { class Model; -struct LSTMBuilder { - LSTMBuilder() {} +struct LSTMBuilder : public RNNBuilder { explicit LSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, Model* model); - // call this to reset the builder when you are working with a newly - // created ComputationGraph object - void new_graph(ComputationGraph* cg); - - // Start new sequence in given ComputationGraph with initial c0 and h0 - // call after add_parameter edges but before add input, - // as well as whenever a new sequence is to be added to the graph - void start_new_sequence(ComputationGraph* cg, - std::vector c_0={}, - std::vector h_0={}); - - // add another timestep by reading in the variable x - // return the hidden representation of the deepest layer - VariableIndex add_input(VariableIndex x, ComputationGraph* cg); - - // rewind the last timestep - this DOES NOT remove the variables - // from the computation graph, it just means the next time step will - // see a different previous state. You can remind as many times as - // you want. void rewind_one_step() { h.pop_back(); c.pop_back(); } - - // returns node index (variable) of most recent output VariableIndex back() const { return h.back().back(); } + std::vector final_h() const { return h.back(); } + protected: + void new_graph_impl(ComputationGraph* cg) override; + void start_new_sequence_impl(const std::vector& h0) override; + VariableIndex add_input_impl(VariableIndex x, ComputationGraph* cg) override; - // access memory/hidden state contents - const std::vector& final_h() const { return h.back(); } - + public: // first index is layer, then ... std::vector> params; @@ -59,13 +40,7 @@ struct LSTMBuilder { bool has_initial_state; // if this is false, treat h0 and c0 as 0 std::vector h0; std::vector c0; - - unsigned hidden_dim; unsigned layers; - std::vector zeros; - - // the state machine ensures that the caller is behaving - RNNStateMachine sm; }; } // namespace cnn diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 0736a4612..d31b2d31f 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -12,23 +12,24 @@ using namespace std; namespace cnn { -RNNBuilder::RNNBuilder(unsigned layers, +RNNBuilder::~RNNBuilder() {} + +SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model) : hidden_dim(hidden_dim), layers(layers), zeros(hidden_dim, 0) { + Model* model) : layers(layers) { unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { - Parameters* p_x2h = model->add_parameters(Dim({hidden_dim, layer_input_dim})); - Parameters* p_h2h = model->add_parameters(Dim({hidden_dim, hidden_dim})); - Parameters* p_hb = model->add_parameters(Dim({hidden_dim})); + Parameters* p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2h = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_hb = model->add_parameters({hidden_dim}); vector ps = {p_x2h, p_h2h, p_hb}; params.push_back(ps); layer_input_dim = hidden_dim; } } -void RNNBuilder::new_graph(ComputationGraph* cg) { - sm.transition(RNNOp::new_graph); +void SimpleRNNBuilder::new_graph_impl(ComputationGraph* cg) { param_vars.clear(); for (unsigned i = 0; i < layers; ++i) { Parameters* p_x2h = params[i][0]; @@ -42,35 +43,33 @@ void RNNBuilder::new_graph(ComputationGraph* cg) { } } -void RNNBuilder::start_new_sequence(ComputationGraph* cg, vector h_0) { - sm.transition(RNNOp::start_new_sequence); +void SimpleRNNBuilder::start_new_sequence_impl(const vector& h_0) { h.clear(); h0 = h_0; - if (h0.empty()) { - VariableIndex zero_input = cg->add_input(Dim({hidden_dim}), &zeros); - h0 = vector(layers, zero_input); - } - assert (h0.size() == layers); + if (h0.size()) { assert(h0.size() == layers); } } -VariableIndex RNNBuilder::add_input(VariableIndex x, ComputationGraph* cg) { - sm.transition(RNNOp::add_input); +VariableIndex SimpleRNNBuilder::add_input_impl(VariableIndex x, ComputationGraph* cg) { const unsigned t = h.size(); h.push_back(vector(layers)); vector& ht = h.back(); VariableIndex in = x; for (unsigned i = 0; i < layers; ++i) { const vector& vars = param_vars[i]; - VariableIndex i_h_tm1; - if (t == 0) { // first time step - // initial value of h for layer i at timestep 0 - // defaults to zero matrix if not set in add_parameter_edges - i_h_tm1 = h0[i]; - } else { // tth time step - i_h_tm1 = h[t-1][i]; + VariableIndex i_h3; + bool have_prev = (t > 0 || h0.size() > 0); + if (have_prev) { + VariableIndex i_h_tm1; + if (t == 0) { + if (h0.size()) i_h_tm1 = h0[i]; // first time step + } else { // tth time step + i_h_tm1 = h[t-1][i]; + } + // h3 = hbias + h2h * h_{t-1} + x2h * in + i_h3 = cg->add_function({vars[2], vars[0], in, vars[1], i_h_tm1}); + } else { + i_h3 = cg->add_function({vars[2], vars[0], in}); } - // h3 = hbias + h2h * h_{t-1} + x2h * in - VariableIndex i_h3 = cg->add_function({vars[2], vars[0], in, vars[1], i_h_tm1}); in = ht[i] = cg->add_function({i_h3}); } return ht.back(); diff --git a/cnn/rnn.h b/cnn/rnn.h index 178ae57f7..735683678 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -8,41 +8,67 @@ namespace cnn { class Model; +// interface for constructing an RNN, LSTM, GRU, etc. struct RNNBuilder { - RNNBuilder() {} - explicit RNNBuilder(unsigned layers, - unsigned input_dim, - unsigned hidden_dim, - Model* model); - + virtual ~RNNBuilder(); // call this to reset the builder when you are working with a newly // created ComputationGraph object - void new_graph(ComputationGraph* cg); + void new_graph(ComputationGraph* cg) { + sm.transition(RNNOp::new_graph); + new_graph_impl(cg); + } - // Reset for new sequence on hypergraph cg with shared parameters - // call this before add_input and after add_parameter_edges, or + // Reset for new sequence + // call this before add_input and after new_graph, // when starting a new sequence on the same hypergraph. // h_0 is used to initialize hidden layers at timestep 0 to given values - void start_new_sequence(ComputationGraph* cg, std::vector h_0={}); + void start_new_sequence(const std::vector& h_0={}) { + sm.transition(RNNOp::start_new_sequence); + start_new_sequence_impl(h_0); + } // add another timestep by reading in the variable x // return the hidden representation of the deepest layer - VariableIndex add_input(VariableIndex x, ComputationGraph* cg); + VariableIndex add_input(VariableIndex x, ComputationGraph* cg) { + sm.transition(RNNOp::add_input); + return add_input_impl(x, cg); + } // rewind the last timestep - this DOES NOT remove the variables // from the computation graph, it just means the next time step will // see a different previous state. You can remind as many times as // you want. - void rewind_one_step() { - h.pop_back(); - } - + virtual void rewind_one_step() = 0; // returns node (index) of most recent output - VariableIndex back() const { return h.back().back(); } - + virtual VariableIndex back() const = 0; // access hidden state contents - const std::vector& final_h() const { return h.back(); } + virtual std::vector final_h() const = 0; + protected: + virtual void new_graph_impl(ComputationGraph* cg) = 0; + virtual void start_new_sequence_impl(const std::vector& h_0) = 0; + virtual VariableIndex add_input_impl(VariableIndex x, ComputationGraph* cg) = 0; + private: + // the state machine ensures that the caller is behaving + RNNStateMachine sm; +}; + +struct SimpleRNNBuilder : public RNNBuilder { + explicit SimpleRNNBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model); + + protected: + void new_graph_impl(ComputationGraph* cg) override; + void start_new_sequence_impl(const std::vector& h_0) override; + VariableIndex add_input_impl(VariableIndex x, ComputationGraph* cg) override; + + public: + void rewind_one_step() { h.pop_back(); } + VariableIndex back() const { return h.back().back(); } + std::vector final_h() const { return h.back(); } + private: // first index is layer, then x2h h2h hb std::vector> params; @@ -56,14 +82,7 @@ struct RNNBuilder { // defaults to zero matrix input std::vector h0; - ComputationGraph* cg; - - unsigned hidden_dim; unsigned layers; - std::vector zeros; - - // the state machine ensures that the caller is behaving - RNNStateMachine sm; }; } // namespace cnn diff --git a/examples/encdec.cc b/examples/encdec.cc index 5f3737f30..cb31ff3d0 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -57,14 +57,14 @@ struct EncoderDecoder { VariableIndex BuildGraph(const vector& insent, const vector& osent, ComputationGraph& cg) { // forward encoder fwd_enc_builder.new_graph(&cg); - fwd_enc_builder.start_new_sequence(&cg); + fwd_enc_builder.start_new_sequence(); for (unsigned t = 0; t < insent.size(); ++t) { VariableIndex i_x_t = cg.add_lookup(p_ec, insent[t]); fwd_enc_builder.add_input(i_x_t, &cg); } // backward encoder rev_enc_builder.new_graph(&cg); - rev_enc_builder.start_new_sequence(&cg); + rev_enc_builder.start_new_sequence(); for (int t = insent.size() - 1; t >= 0; --t) { VariableIndex i_x_t = cg.add_lookup(p_ec, insent[t]); rev_enc_builder.add_input(i_x_t, &cg); @@ -85,14 +85,13 @@ struct EncoderDecoder { VariableIndex i_h2oe = cg.add_parameters(p_h2oe); VariableIndex i_boe = cg.add_parameters(p_boe); VariableIndex i_nc = cg.add_function({i_boe, i_h2oe, i_h}); - vector oein_c(LAYERS); - vector oein_h(LAYERS); + vector oein(LAYERS * 2); for (int i = 0; i < LAYERS; ++i) { - oein_c[i] = cg.add_function({i_nc}, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM); - oein_h[i] = cg.add_function({oein_c[i]}); + oein[i] = cg.add_function({i_nc}, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM); + oein[i + LAYERS] = cg.add_function({oein[i]}); } dec_builder.new_graph(&cg); - dec_builder.start_new_sequence(&cg, oein_c, oein_h); + dec_builder.start_new_sequence(oein); // decoder VariableIndex i_R = cg.add_parameters(p_R); diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index c35448653..c77f4f869 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -42,7 +42,7 @@ struct RNNLanguageModel { VariableIndex BuildLMGraph(const vector& sent, ComputationGraph& cg) { const unsigned slen = sent.size() - 1; builder.new_graph(&cg); // reset RNN builder for new graph - builder.start_new_sequence(&cg); + builder.start_new_sequence(); VariableIndex i_R = cg.add_parameters(p_R); // hidden -> word rep parameter VariableIndex i_bias = cg.add_parameters(p_bias); // word bias vector errs; @@ -82,7 +82,7 @@ struct RNNLanguageModel { cerr << endl; ComputationGraph cg; builder.new_graph(&cg); // reset RNN builder for new graph - builder.start_new_sequence(&cg); + builder.start_new_sequence(); VariableIndex i_R = cg.add_parameters(p_R); // hidden -> word rep parameter VariableIndex i_bias = cg.add_parameters(p_bias); // word bias vector errs; @@ -181,8 +181,7 @@ int main(int argc, char** argv) { sgd = new SimpleSGDTrainer(&model); RNNLanguageModel lm(model); - //RNNLanguageModel lm(model); - //RNNLanguageModel lm(model); + //RNNLanguageModel lm(model); if (argc == 4) { string fname = argv[3]; ifstream in(fname); From ff8c6018b78ddc67d53f07162921b19d0aba6f2c Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 22 May 2015 12:19:48 -0400 Subject: [PATCH 049/965] typo fix --- cnn/lstm.cc | 6 ++++-- cnn/nodes-common.cc | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 6308313dc..64e52ed89 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -71,6 +71,8 @@ void LSTMBuilder::new_graph_impl(ComputationGraph* cg) { } } +// layout: 0..layers = c +// layers+1..2*layers = h void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { h.clear(); c.clear(); @@ -79,8 +81,8 @@ void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { h0.resize(layers); c0.resize(layers); for (unsigned i = 0; i < layers; ++i) { - h0[i] = hinit[i]; - c0[i] = hinit[i + layers]; + c0[i] = hinit[i]; + h0[i] = hinit[i + layers]; } has_initial_state = true; } else { diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 8f52edb79..84daade7e 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -349,7 +349,7 @@ Dim PickRange::dim_forward(const vector& xs) const { cerr << "Bad input dimensions in PickElement: " << xs << endl; abort(); } - assert(xs[0][0] <= (int)end); + assert((int)end <= xs[0][0]); return Dim({end - start}); } From 69843a8de4598512fbfb065e0e8ba0652b9e940a Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 23 May 2015 15:58:39 -0400 Subject: [PATCH 050/965] momentum training --- cmake/{FindTH.cmake => FindCNN.cmake} | 0 cmake/FindMinerva.cmake | 17 ------------ cmake/FindTH++.cmake | 16 ----------- cmake/FindTHC.cmake | 15 ----------- cnn/CMakeLists.txt | 20 ++++++++++++-- cnn/c2w.h | 20 +++++++------- cnn/graph.cc | 34 +++++++++++++++++++++++ cnn/graph.h | 9 +++++++ cnn/lstm.cc | 1 - cnn/lstm.h | 1 + cnn/param-nodes.cc | 6 ++--- cnn/rnn.cc | 1 - cnn/rnn.h | 1 + cnn/shadow-params.cc | 39 +++++++++++++++++++++++++++ cnn/shadow-params.h | 34 +++++++++++++++++++++++ cnn/training.cc | 38 +++++++++++++++----------- cnn/training.h | 10 ++++--- 17 files changed, 178 insertions(+), 84 deletions(-) rename cmake/{FindTH.cmake => FindCNN.cmake} (100%) delete mode 100644 cmake/FindMinerva.cmake delete mode 100644 cmake/FindTH++.cmake delete mode 100644 cmake/FindTHC.cmake create mode 100644 cnn/graph.cc create mode 100644 cnn/graph.h create mode 100644 cnn/shadow-params.cc create mode 100644 cnn/shadow-params.h diff --git a/cmake/FindTH.cmake b/cmake/FindCNN.cmake similarity index 100% rename from cmake/FindTH.cmake rename to cmake/FindCNN.cmake diff --git a/cmake/FindMinerva.cmake b/cmake/FindMinerva.cmake deleted file mode 100644 index b02bc9228..000000000 --- a/cmake/FindMinerva.cmake +++ /dev/null @@ -1,17 +0,0 @@ -# -# This will define: -# MINERVA_FOUND -# MINERVA_LIBRARY -# MINERVA_INCLUDE_DIR - -find_path(MINERVA_INCLUDE_DIR - NAMES minerva.h - PATHS ${MINERVA_PREFIX_PATH}/minerva) - -find_library(MINERVA_LIBRARY - NAMES minerva - PATHS ${MINERVA_PREFIX_PATH}/lib) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(Minerva DEFAULT_MSG MINERVA_LIBRARY MINERVA_INCLUDE_DIR) - diff --git a/cmake/FindTH++.cmake b/cmake/FindTH++.cmake deleted file mode 100644 index 8fdda38ec..000000000 --- a/cmake/FindTH++.cmake +++ /dev/null @@ -1,16 +0,0 @@ - -CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7 FATAL_ERROR) - -INCLUDE(FindPackageHandleStandardArgs) - -FIND_LIBRARY(THPP_LIBRARY thpp PATHS "${THPP_PREFIX_PATH}/thpp/build") -FIND_PATH(THPP_INCLUDE_DIR "thpp/Tensor.h" PATHS "${THPP_PREFIX_PATH}") - -SET(THPP_LIBRARIES ${THPP_LIBRARY}) - -FIND_PACKAGE_HANDLE_STANDARD_ARGS( - TH++ - REQUIRED_ARGS - THPP_INCLUDE_DIR - THPP_LIBRARY) - diff --git a/cmake/FindTHC.cmake b/cmake/FindTHC.cmake deleted file mode 100644 index 216148a8f..000000000 --- a/cmake/FindTHC.cmake +++ /dev/null @@ -1,15 +0,0 @@ - -CMAKE_MINIMUM_REQUIRED(VERSION 2.8.7 FATAL_ERROR) - -INCLUDE(FindPackageHandleStandardArgs) - -FIND_LIBRARY(THC_LIBRARY THC) -FIND_PATH(THC_INCLUDE_DIR "THC.h" PATHS "${CMAKE_PREFIX_PATH}/include/THC") - -SET(THC_LIBRARIES ${THC_LIBRARY}) - -FIND_PACKAGE_HANDLE_STANDARD_ARGS( - THC - REQUIRED_ARGS - THC_INCLUDE_DIR - THC_LIBRARY) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 59950764c..b786a0bcb 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -5,6 +5,7 @@ set(cnn_library_SRCS dict.cc dim.cc exec.cc + graph.cc # gru.cc init.cc lstm.cc @@ -15,23 +16,35 @@ set(cnn_library_SRCS rnn.cc rnn-state-machine.cc saxe-init.cc + shadow-params.cc tensor.cc training.cc ) # Headers: set(cnn_library_HDRS + aligned-mem-pool.h + c2w.h cnn.h + cuda.h dict.h dim.h exec.h - nodes.h + functors.h + gpu-kernels.h + gpu-ops.h + graph.h + gru.h + init.h lstm.h model.h + nodes.h param-nodes.h - rnn.h + random.h rnn-state-machine.h + rnn.h saxe-init.h + shadow-params.h tensor.h timing.h training.h @@ -73,5 +86,8 @@ if(WITH_CUDA_BACKEND) cuda_add_library(cnncuda STATIC gpu-ops.cu) endif(WITH_CUDA_BACKEND) +install(FILES ${cnn_library_HDRS} DESTINATION include/cnn) +install(TARGETS cnn DESTINATION lib) + # target_compile_features(cnn PRIVATE cxx_range_for) diff --git a/cnn/c2w.h b/cnn/c2w.h index 8c6c720e3..49c25629f 100644 --- a/cnn/c2w.h +++ b/cnn/c2w.h @@ -27,29 +27,29 @@ struct C2WBuilder { rc2w(layers, input_dim, hidden_dim, m), p_lookup(m->add_lookup_parameters(vocab_size, {input_dim})) { } - void new_graph(Hypergraph* hg) { + void new_graph(ComputationGraph* cg) { words.clear(); - fc2w.new_graph(hg); - rc2w.new_graph(hg); + fc2w.new_graph(cg); + rc2w.new_graph(cg); } // compute a composed representation of a word out of characters // wordid should be a unique index for each word *type* in the graph being built - VariableIndex add_word(int word_id, const std::vector& chars, Hypergraph* hg) { + VariableIndex add_word(int word_id, const std::vector& chars, ComputationGraph* cg) { auto it = wordid2vi.find(word_id); if (it == wordid2vi.end()) { - fc2w.start_new_sequence(hg); - rc2w.start_new_sequence(hg); + fc2w.start_new_sequence(cg); + rc2w.start_new_sequence(cg); std::vector ins(chars.size()); std::map c2i; for (unsigned i = 0; i < ins.size(); ++i) { VariableIndex& v = c2i[chars[i]]; - if (!v) v = hg->add_lookup(p_lookup, chars[i]); + if (!v) v = cg->add_lookup(p_lookup, chars[i]); ins[i] = v; - fc2w.add_input(v, hg); + fc2w.add_input(v, cg); } for (int i = ins.size() - 1; i >= 0; --i) - rc2w.add_input(ins[i], hg); - VariableIndex i_concat = hg->add_function({fc2w.back(), rc2w.back()}); + rc2w.add_input(ins[i], cg); + VariableIndex i_concat = cg->add_function({fc2w.back(), rc2w.back()}); it = wordid2vi.insert(std::make_pair(word_id, i_concat)).first; } return it->second; diff --git a/cnn/graph.cc b/cnn/graph.cc new file mode 100644 index 000000000..6db954a6e --- /dev/null +++ b/cnn/graph.cc @@ -0,0 +1,34 @@ +#include "cnn/graph.h" +#include "cnn/cnn.h" +#include + +using namespace std; + +namespace cnn { + +void GraphOptimize(ComputationGraph* cg) { + // topo sort + vector& nodes = cg->nodes; + vector longest_paths(nodes.size()); + for (unsigned i = 0; i < nodes.size(); ++i) { + auto& v = *nodes[i]; // vertex v_i + auto& lp = longest_paths[i]; // distance to v_i + for (auto e : v.args) { + int weight = 0; + if (v.args.size() == 7) weight = 1; + int pte = longest_paths[e] + weight; + if (pte > lp) lp = pte; + } + } + for (unsigned i = 0; i < nodes.size(); ++i) { + vector x; + for (auto e : nodes[i]->args) { + x.push_back(string("x") + to_string(e)); + } + cerr << "LONGEST PATH: " << longest_paths[i] << "\tx" << i << " = " << nodes[i]->as_string(x) << endl; + } + abort(); +} + + +} // namespace cnn diff --git a/cnn/graph.h b/cnn/graph.h new file mode 100644 index 000000000..349542bd9 --- /dev/null +++ b/cnn/graph.h @@ -0,0 +1,9 @@ +#ifndef CNN_GRAPH_H +#define CNN_GRAPH_H + +namespace cnn { +struct ComputationGraph; +void GraphOptimize(ComputationGraph* cg); +}; + +#endif diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 64e52ed89..2d0f532d7 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -6,7 +6,6 @@ #include #include "cnn/nodes.h" -#include "cnn/training.h" using namespace std; diff --git a/cnn/lstm.h b/cnn/lstm.h index 7b9838f64..ffb9fd3d6 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -9,6 +9,7 @@ namespace cnn { class Model; struct LSTMBuilder : public RNNBuilder { + LSTMBuilder() = default; explicit LSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index 9385ae437..988f6d59e 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -60,7 +60,7 @@ void InputNode::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - cerr << "called backward() on arity 0 edge\n"; + cerr << "called backward() on arity 0 node\n"; abort(); } @@ -88,7 +88,7 @@ void ScalarInputNode::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - cerr << "called backward() on arity 0 edge\n"; + cerr << "called backward() on arity 0 node\n"; abort(); } @@ -112,7 +112,7 @@ void LookupNode::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - cerr << "called backward() on arity 0 edge\n"; + cerr << "called backward() on arity 0 node\n"; abort(); } diff --git a/cnn/rnn.cc b/cnn/rnn.cc index d31b2d31f..4e651da52 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -6,7 +6,6 @@ #include #include "cnn/nodes.h" -#include "cnn/training.h" using namespace std; diff --git a/cnn/rnn.h b/cnn/rnn.h index 735683678..b76fe2cf5 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -53,6 +53,7 @@ struct RNNBuilder { }; struct SimpleRNNBuilder : public RNNBuilder { + SimpleRNNBuilder() = default; explicit SimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, diff --git a/cnn/shadow-params.cc b/cnn/shadow-params.cc new file mode 100644 index 000000000..0fb09068e --- /dev/null +++ b/cnn/shadow-params.cc @@ -0,0 +1,39 @@ +#include "cnn/shadow-params.h" +#include "cnn/tensor.h" +#include "cnn/aligned-mem-pool.h" +#include "cnn/model.h" + +using namespace std; + +namespace cnn { + +ShadowParameters::ShadowParameters(const Parameters& p) : h(p.values) { + h.v = (float*)cnn_mm_malloc(h.d.size() * sizeof(float), 256); + TensorTools::Zero(h); +} + +ShadowLookupParameters::ShadowLookupParameters(const LookupParameters& lp) : h(lp.values) { + for (auto& t : h) { + t.v = (float*)cnn_mm_malloc(t.d.size() * sizeof(float), 256); + TensorTools::Zero(t); + } +} + +vector AllocateShadowParameters(const Model& m) { + vector v; + v.reserve(m.parameters_list().size()); + for (auto& p : m.parameters_list()) + v.emplace_back(*p); + return v; +} + +vector AllocateShadowLookupParameters(const Model& m) { + vector v; + v.reserve(m.lookup_parameters_list().size()); + for (auto& p : m.lookup_parameters_list()) + v.emplace_back(*p); + return v; +} + +} // namespace cnn + diff --git a/cnn/shadow-params.h b/cnn/shadow-params.h new file mode 100644 index 000000000..45e5d8bee --- /dev/null +++ b/cnn/shadow-params.h @@ -0,0 +1,34 @@ +#ifndef CNN_SHADOW_PARAMS_H +#define CNN_SHADOW_PARAMS_H + +#include +#include "cnn/tensor.h" + +// if your learner needs to keep track of an extra set of values (one per +// parameter), use the Shadow classes. this can be used to implement, e.g., +// momentum or adagrad + +namespace cnn { + +class Model; +struct Parameters; +struct LookupParameters; + +struct ShadowParameters { + explicit ShadowParameters(const Parameters& p); + Tensor h; +}; + +struct ShadowLookupParameters { + explicit ShadowLookupParameters(const LookupParameters& lp); + std::vector h; +}; + +// one per element in model.parameters_list +std::vector AllocateShadowParameters(const Model& model); +// one per element in model.lookup_parameters_list +std::vector AllocateShadowLookupParameters(const Model& model); + +} // namespace cnn + +#endif diff --git a/cnn/training.cc b/cnn/training.cc index 52010da2c..0719fb20e 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -46,30 +46,36 @@ void SimpleSGDTrainer::update(real scale) { } void MomentumSGDTrainer::update(real scale) { -#if 0 - clip_gradients(); + // executed on the first iteration to create vectors to + // store the velocity + if (!velocity_allocated) { + vp = AllocateShadowParameters(*model); + vlp = AllocateShadowLookupParameters(*model); + velocity_allocated = true; + } + + const float gscale = clip_gradients(); + unsigned pi = 0; for (auto p : model->parameters_list()) { - Tensor& v = get_or_init(vp[p], p->values); - const Tensor reg = p->values * lambda; - v = momentum * v - (eta * scale) * p->g; - p->values += v; - p->values -= reg; + Tensor& v = vp[pi++].h; + auto reg = *p->values * lambda; + (*v) = momentum * (*v) - (eta * scale * gscale) * (*p->g); + *p->values += *v - reg; p->clear(); } + pi = 0; for (auto p : model->lookup_parameters_list()) { - unordered_map& vx = vl[p]; - for (auto& it : p->g) { - Tensor& v = get_or_init(vx[it.first], it.second); - const Tensor reg = p->values[it.first] * lambda; - v = momentum * v - (eta * scale) * it.second; - p->values[it.first] += v; - p->values[it.first] -= reg; + vector& vx = vlp[pi++].h; + for (auto i : p->non_zero_grads) { + Tensor& v = vx[i]; + auto reg = (*p->values[i]) * lambda; + (*v) = momentum * (*v) - (eta * scale * gscale) * (*p->grads[i]); + *p->values[i] += *v - reg; } p->clear(); } ++updates; } -#endif #if 0 void RMSPropTrainer::update(real scale) { @@ -99,7 +105,7 @@ void RMSPropTrainer::update(real scale) { } p->clear(); } -#endif } +#endif } // namespace cnn diff --git a/cnn/training.h b/cnn/training.h index 80164569a..74d0e9203 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -1,10 +1,9 @@ #ifndef CNN_TRAINING_H_ #define CNN_TRAINING_H_ -#include #include -#include #include "cnn/model.h" +#include "cnn/shadow-params.h" namespace cnn { @@ -52,11 +51,16 @@ struct SimpleSGDTrainer : public Trainer { struct MomentumSGDTrainer : public Trainer { explicit MomentumSGDTrainer(Model* m, real lam = 1e-6, real e0 = 0.01, real mom = 0.9) : - Trainer(m, e0, lam), momentum(mom) {} + Trainer(m, e0, lam), momentum(mom), velocity_allocated(false) {} void update(real scale) override; real momentum; + bool velocity_allocated; + + // the following represent the current velocity + std::vector vp; + std::vector vlp; //std::unordered_map vp; //std::unordered_map> vl; }; From 446c596201ec20b5270b9aec9f7cb0c8a89ec7c5 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 24 May 2015 16:21:59 -0400 Subject: [PATCH 051/965] fix memory leak --- cnn/cnn.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index b09a9cbaf..b6c52d111 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -26,6 +26,7 @@ ComputationGraph::ComputationGraph() : last_node_evaluated(), } ComputationGraph::~ComputationGraph() { + delete ee; for (auto n : nodes) delete n; --n_hgs; } From 6a408f69e61d1d47926b90dc4b46905f107331f7 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 26 May 2015 20:14:09 +0900 Subject: [PATCH 052/965] Three small bug fixes --- cnn/nodes.cc | 2 +- cnn/training.h | 6 +++--- examples/xor.cc | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 6f42ed361..205ebbdbb 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -267,7 +267,7 @@ void Concatenate::forward(const vector& xs, Tensor& fx) const { unsigned k = 0; for (auto x : xs) { src_row_indices[k++] = ind; - auto xi = *x; + auto & xi = *x; assert(xi.d.cols() == 1); // this can be relaxed to the same everywhere const unsigned rows = xi.d.rows(); #if HAVE_CUDA diff --git a/cnn/training.h b/cnn/training.h index 74d0e9203..9161ef26d 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -8,7 +8,7 @@ namespace cnn { struct Trainer { - explicit Trainer(Model* m, real e0, real lam) : + explicit Trainer(Model* m, real lam, real e0) : eta0(e0), eta(e0), eta_decay(), epoch(), lambda(lam), clipping_enabled(true), clip_threshold(5), clips(), updates(), model(m) {} virtual ~Trainer(); @@ -45,13 +45,13 @@ struct Trainer { }; struct SimpleSGDTrainer : public Trainer { - explicit SimpleSGDTrainer(Model* m, real lam = 1e-6, real e0 = 0.1) : Trainer(m, e0, lam) {} + explicit SimpleSGDTrainer(Model* m, real lam = 1e-6, real e0 = 0.1) : Trainer(m, lam, e0) {} void update(real scale) override; }; struct MomentumSGDTrainer : public Trainer { explicit MomentumSGDTrainer(Model* m, real lam = 1e-6, real e0 = 0.01, real mom = 0.9) : - Trainer(m, e0, lam), momentum(mom), velocity_allocated(false) {} + Trainer(m, lam, e0), momentum(mom), velocity_allocated(false) {} void update(real scale) override; real momentum; diff --git a/examples/xor.cc b/examples/xor.cc index 80435c5e5..636bbd574 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -35,7 +35,7 @@ int main(int argc, char** argv) { VariableIndex i_W = cg.add_parameters(&p_W); VariableIndex i_V = cg.add_parameters(&p_V); - vector x_values(2); // set x_values to change the inputs to the network + vector x_values(2); // set x_values to change the inputs to the network VariableIndex i_x = cg.add_input({2}, &x_values); cnn::real y_value; // set y_value to change the target output VariableIndex i_y = cg.add_input(&y_value); From cf5bc6994c488c01dd5381b220a4e35c5e24c775 Mon Sep 17 00:00:00 2001 From: David Chiang Date: Tue, 26 May 2015 14:21:48 -0400 Subject: [PATCH 053/965] adding Expression class to make constructing networks simpler. xor examples working. --- cnn/CMakeLists.txt | 2 ++ examples/xor-xent.cc | 39 ++++++++++----------------------------- examples/xor.cc | 40 +++++++++++----------------------------- 3 files changed, 23 insertions(+), 58 deletions(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index b786a0bcb..71165ccf4 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -5,6 +5,7 @@ set(cnn_library_SRCS dict.cc dim.cc exec.cc + expr.cc graph.cc # gru.cc init.cc @@ -30,6 +31,7 @@ set(cnn_library_HDRS dict.h dim.h exec.h + expr.h functors.h gpu-kernels.h gpu-ops.h diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index 8814181d9..d7c29a929 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -1,6 +1,7 @@ #include "cnn/nodes.h" #include "cnn/cnn.h" #include "cnn/training.h" +#include "cnn/expr.h" #include #include @@ -10,6 +11,7 @@ using namespace std; using namespace cnn; +using namespace cnn::expr; int main(int argc, char** argv) { cnn::Initialize(argc, argv); @@ -20,42 +22,21 @@ int main(int argc, char** argv) { SimpleSGDTrainer sgd(&m); //MomentumSGDTrainer sgd(&m); - Parameters& p_a = *m.add_parameters({1}); - Parameters& p_b = *m.add_parameters({HIDDEN_SIZE}); - Parameters& p_W = *m.add_parameters({HIDDEN_SIZE, 2}); - Parameters& p_V = *m.add_parameters({1, HIDDEN_SIZE}); - - // build the graph ComputationGraph cg; - // get symbolic variables corresponding to parameters - VariableIndex i_b = cg.add_parameters(&p_b); - VariableIndex i_a = cg.add_parameters(&p_a); - VariableIndex i_W = cg.add_parameters(&p_W); - VariableIndex i_V = cg.add_parameters(&p_V); + Expression W = parameter(cg, m.add_parameters({HIDDEN_SIZE, 2})); + Expression b = parameter(cg, m.add_parameters({HIDDEN_SIZE})); + Expression V = parameter(cg, m.add_parameters({1, HIDDEN_SIZE})); + Expression a = parameter(cg, m.add_parameters({1})); vector x_values(2); // set x_values to change the inputs to the network - VariableIndex i_x = cg.add_input({2}, &x_values); + Expression x = input(cg, {2}, &x_values); cnn::real y_value; // set y_value to change the target output - // two options: MatrixMultiply and Sum, or AffineTransform - // these are identical, but AffineTransform may be slightly more efficient -#if 0 - VariableIndex i_f = cg.add_function({i_W, i_x}); - VariableIndex i_g = cg.add_function({i_f, i_b}); -#else - VariableIndex i_g = cg.add_function({i_b, i_W, i_x}); -#endif - VariableIndex i_h = cg.add_function({i_g}); + Expression h = tanh(W*x + b); + Expression y_pred = logistic(V*h + a); + Expression loss(&cg, cg.add_function({y_pred.i}, &y_value)); // DWC: I didn't understand why second argument is a real* rather than an input -#if 0 - VariableIndex i_p = cg.add_function({i_V, i_h}); - VariableIndex i_uy_pred = cg.add_function({i_p, i_a}); -#else - VariableIndex i_uy_pred = cg.add_function({i_a, i_V, i_h}); -#endif - VariableIndex i_y_pred = cg.add_function({i_uy_pred}); - cg.add_function({i_y_pred}, &y_value); cg.PrintGraphviz(); //if (argc == 2) { // ifstream in(argv[1]); diff --git a/examples/xor.cc b/examples/xor.cc index 636bbd574..681777cd8 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -2,6 +2,7 @@ #include "cnn/cnn.h" #include "cnn/training.h" #include "cnn/gpu-ops.h" +#include "cnn/expr.h" #include #include @@ -10,6 +11,7 @@ using namespace std; using namespace cnn; +using namespace cnn::expr; int main(int argc, char** argv) { cnn::Initialize(argc, argv); @@ -21,42 +23,22 @@ int main(int argc, char** argv) { SimpleSGDTrainer sgd(&m); //MomentumSGDTrainer sgd(&m); - Parameters& p_a = *m.add_parameters({1}); - Parameters& p_b = *m.add_parameters({HIDDEN_SIZE}); - Parameters& p_W = *m.add_parameters({HIDDEN_SIZE, 2}); - Parameters& p_V = *m.add_parameters({1, HIDDEN_SIZE}); - - // build the graph ComputationGraph cg; - // get symbolic variables corresponding to parameters - VariableIndex i_b = cg.add_parameters(&p_b); - VariableIndex i_a = cg.add_parameters(&p_a); - VariableIndex i_W = cg.add_parameters(&p_W); - VariableIndex i_V = cg.add_parameters(&p_V); + Expression W = parameter(cg, m.add_parameters({HIDDEN_SIZE, 2})); + Expression b = parameter(cg, m.add_parameters({HIDDEN_SIZE})); + Expression V = parameter(cg, m.add_parameters({1, HIDDEN_SIZE})); + Expression a = parameter(cg, m.add_parameters({1})); vector x_values(2); // set x_values to change the inputs to the network - VariableIndex i_x = cg.add_input({2}, &x_values); + Expression x = input(cg, {2}, &x_values); cnn::real y_value; // set y_value to change the target output - VariableIndex i_y = cg.add_input(&y_value); + Expression y = input(cg, &y_value); - // two options: MatrixMultiply and Sum, or AffineTransform - // these are identical, but AffineTransform may be slightly more efficient -#if 0 - VariableIndex i_f = cg.add_function({i_W, i_x}); - VariableIndex i_g = cg.add_function({i_f, i_b}); -#else - VariableIndex i_g = cg.add_function({i_b, i_W, i_x}); -#endif - VariableIndex i_h = cg.add_function({i_g}); + Expression h = tanh(W*x + b); + Expression y_pred = V*h + a; + Expression loss = squaredDistance(y_pred, y); -#if 1 - VariableIndex i_p = cg.add_function({i_V, i_h}); - VariableIndex i_y_pred = cg.add_function({i_p, i_a}); -#else - VariableIndex i_y_pred = cg.add_function({i_a, i_V, i_h}); -#endif - cg.add_function({i_y_pred, i_y}); cg.PrintGraphviz(); if (argc == 2) { ifstream in(argv[1]); From d93fdb30243c85ad9bc2769712cc41d99fea9e19 Mon Sep 17 00:00:00 2001 From: David Chiang Date: Tue, 26 May 2015 15:01:30 -0400 Subject: [PATCH 054/965] nlm example works --- examples/nlm.cc | 50 +++++++++++++++++-------------------------------- 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/examples/nlm.cc b/examples/nlm.cc index 961b447cd..798de2bf8 100644 --- a/examples/nlm.cc +++ b/examples/nlm.cc @@ -2,6 +2,7 @@ #include "cnn/cnn.h" #include "cnn/training.h" #include "cnn/timing.h" +#include "cnn/expr.h" #include #include @@ -9,6 +10,7 @@ using namespace std; using namespace cnn; +using namespace cnn::expr; int main(int argc, char** argv) { cnn::Initialize(argc, argv); @@ -21,44 +23,26 @@ int main(int argc, char** argv) { Model model; SimpleSGDTrainer sgd(&model); LookupParameters* p_c = model.add_lookup_parameters(VOCAB_SIZE, {DIM}); - Parameters* p_C1 = model.add_parameters({DIM, DIM}); - Parameters* p_C2 = model.add_parameters({DIM, DIM}); - Parameters* p_C3 = model.add_parameters({DIM, DIM}); - Parameters* p_R = model.add_parameters({VOCAB_SIZE, DIM}); - Parameters* p_bias = model.add_parameters({VOCAB_SIZE}); - Parameters* p_hb = model.add_parameters({DIM}); - // build the graph ComputationGraph cg; + unsigned in_c1, in_c2, in_c3; // set these to set the context words - VariableIndex i_c1 = cg.add_lookup(p_c, &in_c1); - VariableIndex i_c2 = cg.add_lookup(p_c, &in_c2); - VariableIndex i_c3 = cg.add_lookup(p_c, &in_c3); - VariableIndex i_C1 = cg.add_parameters(p_C1); - VariableIndex i_C2 = cg.add_parameters(p_C2); - VariableIndex i_C3 = cg.add_parameters(p_C3); - VariableIndex i_hb = cg.add_parameters(p_hb); - VariableIndex i_R = cg.add_parameters(p_R); + Expression c1 = lookup(cg, p_c, &in_c1); + Expression c2 = lookup(cg, p_c, &in_c2); + Expression c3 = lookup(cg, p_c, &in_c3); + Expression C1 = parameter(cg, model.add_parameters({DIM, DIM})); + Expression C2 = parameter(cg, model.add_parameters({DIM, DIM})); + Expression C3 = parameter(cg, model.add_parameters({DIM, DIM})); + Expression hb = parameter(cg, model.add_parameters({DIM})); + Expression R = parameter(cg, model.add_parameters({VOCAB_SIZE, DIM})); unsigned ytrue; // set ytrue to change the value of the input - VariableIndex i_bias = cg.add_parameters(p_bias); - - // r = hb + C1 * c1 + C2 * c2 + C3 * c3 - VariableIndex i_r = cg.add_function({i_hb, i_C1, i_c1, i_C2, i_c2, i_C3, i_c3}); - - // nl = rectify(r) - VariableIndex i_nl = cg.add_function({i_r}); - - // o2 = bias + R * nl - VariableIndex i_o2 = cg.add_function({i_bias, i_R, i_nl}); - - // ydist = softmax(o2) - VariableIndex i_ydist = cg.add_function({i_o2}); - - // nerr = pick(ydist, ytrue) - VariableIndex i_nerr = cg.add_function({i_ydist}, &ytrue); + Expression bias = parameter(cg, model.add_parameters({VOCAB_SIZE})); - // err = -nerr - cg.add_function({i_nerr}); + Expression r = hb + C1 * c1 + C2 * c2 + C3 * c3; + Expression nl = rectify(r); + Expression o2 = bias + R * nl; + Expression ydist = log_softmax(o2); + Expression nerr = -pick(ydist, ytrue); cg.PrintGraphviz(); // load some training data From 0b2621af503b4567ec69485dee353e349947123e Mon Sep 17 00:00:00 2001 From: David Chiang Date: Tue, 26 May 2015 21:21:00 -0400 Subject: [PATCH 055/965] forgot two files --- cnn/expr.cc | 26 ++++++++++++++++++++++++++ cnn/expr.h | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 cnn/expr.cc create mode 100644 cnn/expr.h diff --git a/cnn/expr.cc b/cnn/expr.cc new file mode 100644 index 000000000..95de65f40 --- /dev/null +++ b/cnn/expr.cc @@ -0,0 +1,26 @@ +#include "cnn/expr.h" +#include "cnn/nodes.h" + +namespace cnn { namespace expr { + +Expression input(ComputationGraph& g, real s) { return Expression(&g, g.add_input(s)); } +Expression input(ComputationGraph& g, const real *ps) { return Expression(&g, g.add_input(ps)); } +Expression input(ComputationGraph& g, const Dim& d, const std::vector* pdata) { return Expression(&g, g.add_input(d, pdata)); } +Expression parameter(ComputationGraph& g, Parameters* p) { return Expression(&g, g.add_parameters(p)); } +Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index) { return Expression(&g, g.add_lookup(p, index)); } +Expression lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex) { return Expression(&g, g.add_lookup(p, pindex)); } + +Expression operator-(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression operator+(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } +Expression operator-(const Expression& x, const Expression& y) { return x+(-y); } +Expression operator*(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } + +Expression tanh(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression logistic(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression rectify(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } + +Expression squaredDistance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } +Expression pick(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } + +} } diff --git a/cnn/expr.h b/cnn/expr.h new file mode 100644 index 000000000..465c23811 --- /dev/null +++ b/cnn/expr.h @@ -0,0 +1,38 @@ +#ifndef EXPR_H +#define EXPR_H + +#include "cnn/cnn.h" + +namespace cnn { namespace expr { + +struct Expression { + ComputationGraph *pg; + VariableIndex i; + + Expression(ComputationGraph *pg, VariableIndex i) : pg(pg), i(i) { } +}; + +Expression input(ComputationGraph& g, real s); +Expression input(ComputationGraph& g, const real *ps); +Expression input(ComputationGraph& g, const Dim& d, const std::vector* pdata); +Expression parameter(ComputationGraph& g, Parameters* p); +Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index); +Expression lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex); + +Expression operator-(const Expression& x); +Expression operator+(const Expression& x, const Expression& y); +Expression operator-(const Expression& x, const Expression& y); +Expression operator*(const Expression& x, const Expression& y); +//Expression cwiseMultiply(const Expression& x, const Expression& y); + +Expression tanh(const Expression& x); +Expression logistic(const Expression& x); +Expression rectify(const Expression& x); +Expression log_softmax(const Expression& x); + +Expression squaredDistance(const Expression& x, const Expression& y); +Expression pick(const Expression& x, unsigned v); + +} } + +#endif From d58ae119825c2b14a91138d54186120dbdfbb049 Mon Sep 17 00:00:00 2001 From: davidweichiang Date: Wed, 27 May 2015 22:43:56 -0400 Subject: [PATCH 056/965] embed-cl done but not working --- cnn/expr.cc | 11 +++++++-- cnn/expr.h | 26 +++++++++++++++++++++ examples/embed-cl.cc | 54 +++++++++++++++++++------------------------- examples/xor-xent.cc | 2 +- 4 files changed, 59 insertions(+), 34 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index 95de65f40..4be4e3857 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -1,5 +1,4 @@ #include "cnn/expr.h" -#include "cnn/nodes.h" namespace cnn { namespace expr { @@ -14,13 +13,21 @@ Expression operator-(const Expression& x) { return Expression(x.pg, x.pg->add_fu Expression operator+(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression operator-(const Expression& x, const Expression& y) { return x+(-y); } Expression operator*(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } - + Expression tanh(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression logistic(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression rectify(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression squaredDistance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } +Expression binary_log_loss(const Expression& x, real ty) { return Expression(x.pg, x.pg->add_function({x.i}, &ty)); } +Expression binary_log_loss(const Expression& x, real* pty) { return Expression(x.pg, x.pg->add_function({x.i}, pty)); } +Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, m)); } + Expression pick(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } +Expression sum_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } + +Expression kmh_ngram(const Expression& x, unsigned n) { return Expression(x.pg, x.pg->add_function({x.i}, n)); } + } } diff --git a/cnn/expr.h b/cnn/expr.h index 465c23811..77acf18fe 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -2,6 +2,7 @@ #define EXPR_H #include "cnn/cnn.h" +#include "cnn/nodes.h" namespace cnn { namespace expr { @@ -9,6 +10,7 @@ struct Expression { ComputationGraph *pg; VariableIndex i; + Expression() : pg(nullptr) { } Expression(ComputationGraph *pg, VariableIndex i) : pg(pg), i(i) { } }; @@ -31,8 +33,32 @@ Expression rectify(const Expression& x); Expression log_softmax(const Expression& x); Expression squaredDistance(const Expression& x, const Expression& y); +Expression binary_log_loss(const Expression& x, real ty); +Expression binary_log_loss(const Expression& x, real* pty); +Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0); + Expression pick(const Expression& x, unsigned v); +template +Expression sum(const T& xs) { + ComputationGraph *pg = xs.begin()->pg; + std::vector xis(xs.size()); + for (int i=0; iadd_function(xis)); +} + +template +Expression concatenate_cols(const T& xs) { + ComputationGraph *pg = xs.begin()->pg; + std::vector xis(xs.size()); + for (int i=0; iadd_function(xis)); +} + +Expression sum_cols(const Expression& x); + +Expression kmh_ngram(const Expression& x, unsigned n); + } } #endif diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index 8f8443184..a8213df9f 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -3,6 +3,7 @@ #include "cnn/training.h" #include "cnn/timing.h" #include "cnn/dict.h" +#include "cnn/expr.h" #include #include @@ -10,6 +11,7 @@ using namespace std; using namespace cnn; +using namespace cnn::expr; unsigned REP_DIM = 128; unsigned INPUT_VOCAB_SIZE = 0; @@ -25,44 +27,38 @@ int kTRG_EOS; struct Encoder { LookupParameters* p_s; LookupParameters* p_t; - vector m; + vector m; explicit Encoder(Model& model) { p_s = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {REP_DIM}); p_t = model.add_lookup_parameters(OUTPUT_VOCAB_SIZE, {REP_DIM}); } - VariableIndex EmbedSource(const vector& sent, ComputationGraph& cg) { + Expression EmbedSource(const vector& sent, ComputationGraph& cg) { m.resize(sent.size() + 2); - m[0] = cg.add_lookup(p_s, kSRC_SOS); + m[0] = lookup(cg, p_s, kSRC_SOS); int i = 1; for (auto& w : sent) - m[i++] = cg.add_lookup(p_s, w); - m[i] = cg.add_lookup(p_s, kSRC_EOS); + m[i++] = lookup(cg, p_s, w); + m[i] = lookup(cg, p_s, kSRC_EOS); #define DUMB_ADDITIVE #ifdef DUMB_ADDITIVE - return cg.add_function(m); + return sum(m); #else - VariableIndex i_m = cg.add_function(m); - i_m = cg.add_function({i_m}, 2); - i_m = cg.add_function({i_m}); - return cg.add_function({i_m}); + return sum_cols(tanh(kmh_ngram(concatenate_cols(m), 2))); #endif } - VariableIndex EmbedTarget(const vector& sent, ComputationGraph& cg) { + Expression EmbedTarget(const vector& sent, ComputationGraph& cg) { m.resize(sent.size() + 2); - m[0] = cg.add_lookup(p_s, kTRG_SOS); + m[0] = lookup(cg, p_s, kTRG_SOS); int i = 1; for (auto& w : sent) - m[i++] = cg.add_lookup(p_t, w); - m[i] = cg.add_lookup(p_s, kTRG_EOS); + m[i++] = lookup(cg, p_t, w); + m[i] = lookup(cg, p_s, kTRG_EOS); #ifdef DUMB_ADDITIVE - return cg.add_function(m); + return sum(m); #else - VariableIndex i_m = cg.add_function(m); - i_m = cg.add_function({i_m}, 2); - i_m = cg.add_function({i_m}); - return cg.add_function({i_m}); + return sum_cols(tanh(kmh_ngram(concatenate_cols(m), 2))); #endif } }; @@ -168,22 +164,18 @@ int main(int argc, char** argv) { ComputationGraph cg; auto& sent_pair = training[order[si]]; ++si; - auto& src = sent_pair.first; - auto& trg = sent_pair.second; - VariableIndex i_s = emb.EmbedSource(src, cg); - VariableIndex i_t = emb.EmbedTarget(trg, cg); - VariableIndex i_sim = cg.add_function({i_s,i_t}); + Expression s = emb.EmbedSource(sent_pair.first, cg); + Expression sim = squaredDistance(s, emb.EmbedTarget(sent_pair.second, cg)); float margin = 2; const unsigned K = 20; - vector noise(K); + vector noise(K); for (unsigned j = 0; j < K; ++j) { - unsigned s = rand01() * training.size(); - while (s == order[si] || s == training.size()) { s = rand01() * training.size(); } - VariableIndex i_n_j = emb.EmbedTarget(training[s].second, cg); - VariableIndex i_sim_n = cg.add_function({i_s,i_n_j}); - noise[j] = cg.add_function({i_sim, i_sim_n}, margin); + unsigned sample = rand01() * training.size(); + while (sample == order[si] || sample == training.size()) { sample = rand01() * training.size(); } + Expression sim_n = squaredDistance(s, emb.EmbedTarget(training[sample].second, cg)); + noise[j] = pairwise_rank_loss(sim, sim_n, margin); } - cg.add_function(noise); + Expression l = sum(noise); auto iloss = as_scalar(cg.forward()); assert(iloss >= 0); if (iloss > 0) { diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index d7c29a929..e8bfbe405 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -35,7 +35,7 @@ int main(int argc, char** argv) { Expression h = tanh(W*x + b); Expression y_pred = logistic(V*h + a); - Expression loss(&cg, cg.add_function({y_pred.i}, &y_value)); // DWC: I didn't understand why second argument is a real* rather than an input + Expression loss = binary_log_loss(y_pred, &y_value); // DWC: I didn't understand why second argument is a real* rather than an input cg.PrintGraphviz(); //if (argc == 2) { From c275dc03417b6032ce2c00ba60c54f2eef7ad317 Mon Sep 17 00:00:00 2001 From: davidweichiang Date: Fri, 29 May 2015 21:57:28 -0400 Subject: [PATCH 057/965] bug in nlm, add concatenate --- cnn/exec.cc | 1 - cnn/expr.cc | 1 + cnn/expr.h | 9 +++++++++ examples/nlm.cc | 2 +- 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/cnn/exec.cc b/cnn/exec.cc index 4eec90bfd..877174f15 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -35,7 +35,6 @@ const Tensor& SimpleExecutionEngine::incremental_forward() { } nfxs[last_node_evaluated].d = node->dim; nfxs[last_node_evaluated].v = static_cast(fxs->allocate(node->dim.size() * sizeof(float))); - //cerr << "CALLING: " << node->as_string(dummy) << endl; node->forward(xs, nfxs[last_node_evaluated]); } return nfxs.back(); diff --git a/cnn/expr.cc b/cnn/expr.cc index 4be4e3857..4db129ed9 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -25,6 +25,7 @@ Expression binary_log_loss(const Expression& x, real* pty) { return Expression(x Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, m)); } Expression pick(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } +Expression pick(const Expression& x, unsigned* pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } Expression sum_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 77acf18fe..68a529883 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -38,6 +38,7 @@ Expression binary_log_loss(const Expression& x, real* pty); Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0); Expression pick(const Expression& x, unsigned v); +Expression pick(const Expression& x, unsigned* pv); template Expression sum(const T& xs) { @@ -55,6 +56,14 @@ Expression concatenate_cols(const T& xs) { return Expression(pg, pg->add_function(xis)); } +template +Expression concatenate(const T& xs) { + ComputationGraph *pg = xs.begin()->pg; + std::vector xis(xs.size()); + for (int i=0; iadd_function(xis)); +} + Expression sum_cols(const Expression& x); Expression kmh_ngram(const Expression& x, unsigned n); diff --git a/examples/nlm.cc b/examples/nlm.cc index 798de2bf8..f93ae01d8 100644 --- a/examples/nlm.cc +++ b/examples/nlm.cc @@ -42,7 +42,7 @@ int main(int argc, char** argv) { Expression nl = rectify(r); Expression o2 = bias + R * nl; Expression ydist = log_softmax(o2); - Expression nerr = -pick(ydist, ytrue); + Expression nerr = -pick(ydist, &ytrue); cg.PrintGraphviz(); // load some training data From 2078d6a597b58360d8b091a3ea469c97db3d8bb2 Mon Sep 17 00:00:00 2001 From: David Chiang Date: Fri, 29 May 2015 22:02:23 -0400 Subject: [PATCH 058/965] nlm more concise, works for any n --- examples/nlm.cc | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/examples/nlm.cc b/examples/nlm.cc index f93ae01d8..13e51a18e 100644 --- a/examples/nlm.cc +++ b/examples/nlm.cc @@ -7,6 +7,7 @@ #include #include #include +#include using namespace std; using namespace cnn; @@ -26,19 +27,19 @@ int main(int argc, char** argv) { ComputationGraph cg; - unsigned in_c1, in_c2, in_c3; // set these to set the context words - Expression c1 = lookup(cg, p_c, &in_c1); - Expression c2 = lookup(cg, p_c, &in_c2); - Expression c3 = lookup(cg, p_c, &in_c3); - Expression C1 = parameter(cg, model.add_parameters({DIM, DIM})); - Expression C2 = parameter(cg, model.add_parameters({DIM, DIM})); - Expression C3 = parameter(cg, model.add_parameters({DIM, DIM})); + vector in_c(CONTEXT); // set these to set the context words + vector c(CONTEXT); + for (int i=0; i Date: Wed, 3 Jun 2015 23:32:52 -0600 Subject: [PATCH 059/965] Fixed a fatal error on allocating heap --- cnn/tensor.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cnn/tensor.h b/cnn/tensor.h index 4411e71b1..55789a0e0 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -15,6 +15,8 @@ #include // CNN manages its own memory. DO NOT remove the following line #define EIGEN_NO_MALLOC +// This prevents Eigen from trying to allocate heap and crashing due to NO_MALLOC +#define EIGEN_STACK_ALLOCATION_LIMIT 1000000000 #include namespace cnn { From 894e0e2c228b6b840c08fb1612f20b842565db6b Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 5 Jun 2015 07:18:42 -0600 Subject: [PATCH 060/965] Added CUDA functions for Concatenate/PickRange --- cnn/nodes.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 205ebbdbb..ae14ba8cf 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -287,7 +287,11 @@ void Concatenate::backward(const vector& xs, assert(i < src_row_indices.size()); const unsigned rows = dEdxi.d.rows(); const unsigned begin = src_row_indices[i]; +#if HAVE_CUDA + CUBLAS_CHECK(cublasSaxpy(cublas_handle, rows, kSCALAR_ONE, &dEdf.v[begin], 1, dEdxi.v, 1)); +#else *dEdxi += (*dEdf).block(begin, 0, rows, 1); +#endif } void ConcatenateColumns::forward(const vector& xs, Tensor& fx) const { @@ -594,7 +598,11 @@ void PickRange::forward(const vector& xs, Tensor& fx) const { assert(end <= x.rows()); assert(start < end); assert(int(fx.d.rows()) == int(end-start)); +#if HAVE_CUDA + CUDA_CHECK(cudaMemcpyAsync(&fx.v[0], &xs[0]->v[start], sizeof(float) * (end-start), cudaMemcpyDeviceToDevice)); +#else (*fx) = x.block(start, 0, end-start, 1); +#endif } // derivative is 0 in all dimensions except the slice range @@ -606,7 +614,11 @@ void PickRange::backward(const vector& xs, assert(i == 0); assert(int(dEdf.d.rows()) == int(end-start)); assert(dEdf.d.cols() == 1); +#if HAVE_CUDA + CUBLAS_CHECK(cublasSaxpy(cublas_handle, end-start, kSCALAR_ONE, dEdf.v, 1, &dEdxi.v[start], 1)); +#else (*dEdxi).block(start, 0, end-start, 1) += (*dEdf); +#endif } #if HAVE_CUDA From fa728976b31699034112641da1895e75ef7b73ef Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 5 Jun 2015 08:35:41 -0600 Subject: [PATCH 061/965] Added some documentation --- README.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/README.md b/README.md index bdfed7f8a..46a016352 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,51 @@ If you want to see the compile commands that are used, you can run make VERBOSE=1 +#### Training Models + +An illustation of how models are trained (for a simple logistic regression model) is below: + +```c++ +// *** First, we set up the structure of the model +// Create a model, and an SGD trainer to update its parameters. +Model mod; +SimpleSGDTrainer sgd(&mod); +// Define model parameters for a function with 3 inputs and 1 output. +Parameters& p_W = mod.add_parameters({1, 3}); +// Create a "computation graph," which will define the flow of information. +CompuationGraph cg; +// Load the parameters into the computation graph. A VariableIndex identifies the +// position of a particular piece of information within the computation graph. +VariableIndex i_W = cg.add_parameters(&p_weights); +// Create variables defining the input and output of the regression, and load them +// into the computation graph. Note that we don't need to set concrete values yet. +vector x_values(3); +cnn::real y_value; +VariableIndex i_x = cg.add_input({3}, &x_values); +VariableIndex i_y = cg.add_input(&y_value); +// Next, set up the structure to multiply the input by the weight vector, then run +// the output of this through a sigmoid function (logistic regression). +VariableIndex i_f = cg.add_function({i_W, i_x}); +VariableIndex i_y_pred = cg.add_function({i_f}); +// Finally, we create a function to calculate the loss. The model will be optimized +// to minimize the value of the final function in the computation graph. +VariableIndex i_l = cg.add_function({i_y_pred, i_y}); +// We are now done setting up the graph, and we can print out its structure: +cg.PrintGraphViz(); + +// *** Now, we perform a parameter update for a single example. +// Set the input/output to the values specified by the training data: +i_x = {0.5, 0.3, 0.7}; +i_y = 1.0; +// "forward" propagates values forward through the computation graph, and returns +// the loss. +cnn::real loss = as_scalar(cg.forward()); +// "backward" performs back-propagation, and accumulates the gradients of the +// parameters within the "Model" data structure. +cg.backward(); +// "sgd.update" updates parameters of the model that was passed to its constructor. +// Here 1.0 is the scaling factor that allows us to control the size of the update. +sgd.update(1.0); +``` + +Note that this very simple example that doesn't cover things like reading/writing models, recurrent/LSTM networks, or adding biases to functions. The best way to get an idea of how to use cnn for real is to look in the `example` directory, particularly starting with the simplest `xor` example. From 022b6ddc45b9cb54a83d14303e4706aa65d74674 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 5 Jun 2015 13:56:54 -0600 Subject: [PATCH 062/965] support reweighting of columns when summing columns of a matrix --- cnn/nodes-common.cc | 6 ++++-- cnn/nodes.cc | 31 ++++++++++++++++++++++++------- cnn/nodes.h | 13 ++++++++----- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 84daade7e..f1e0e1a5d 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -31,12 +31,14 @@ Dim Reshape::dim_forward(const vector& xs) const { string SumColumns::as_string(const vector& arg_names) const { ostringstream s; - s << "sum_cols(" << arg_names[0] << ')'; + s << "sum_cols(matrix=" << arg_names[0]; + if (arg_names.size() == 2) s << ", col_weighting=" << arg_names[1]; + s << ')'; return s.str(); } Dim SumColumns::dim_forward(const vector& xs) const { - assert(xs.size() == 1); + assert(xs.size() == 1 || xs.size() == 2); return Dim({xs[0].rows()}); } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index ae14ba8cf..6bb7c584a 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -46,18 +46,35 @@ void Reshape::backward(const vector& xs, void SumColumns::forward(const vector& xs, Tensor& fx) const { auto x = **xs[0]; - *fx = x.rowwise().sum(); + auto y = *fx; + if (xs.size() == 1) { + y = x.rowwise().sum(); + } else if (xs.size() == 2) { + auto w = **xs[1]; + y = (x * w.asDiagonal()).rowwise().sum(); + } else { abort(); } } void SumColumns::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { auto out = *dEdxi; const int c = out.cols(); - for (int j = 0; j < c; ++j) - out.col(j) += *dEdf; + if (xs.size() == 1) { + for (int j = 0; j < c; ++j) + out.col(j) += *dEdf; + } else if (xs.size() == 2) { + auto x = **xs[0]; + auto w = **xs[1]; + if (i == 0) { // matrix + for (int j = 0; j < c; ++j) + out.col(j) += w(j) * *dEdf; + } else { // column weighting + out += x.transpose() * *dEdf; + } + } } void KMHNGram::forward(const vector& xs, Tensor& fx) const { diff --git a/cnn/nodes.h b/cnn/nodes.h index 2afda9c4a..b1f0fcd74 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -22,17 +22,20 @@ struct Reshape : public Node { Dim to; }; -// y_i = \sum_{j} x_i,j +// with a single argument x \in R^{n x m} +// y_i = \sum_j x_i,j +// with two arguments x \in R^{n x m} and w \in R^{m} +// y_i = \sum_j x_i,j * w_j struct SumColumns : public Node { template explicit SumColumns(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; void backward(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; }; // y_i = \sum_{j=1}^n x_1:{i-1+j} From beb29df32ff3974c9963d71c9a181b53c2735a2e Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 5 Jun 2015 22:44:54 -0600 Subject: [PATCH 063/965] Fixed two bugs in the documentation --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 46a016352..dc6551ca9 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ Parameters& p_W = mod.add_parameters({1, 3}); CompuationGraph cg; // Load the parameters into the computation graph. A VariableIndex identifies the // position of a particular piece of information within the computation graph. -VariableIndex i_W = cg.add_parameters(&p_weights); +VariableIndex i_W = cg.add_parameters(&p_W); // Create variables defining the input and output of the regression, and load them // into the computation graph. Note that we don't need to set concrete values yet. vector x_values(3); @@ -78,4 +78,4 @@ cg.backward(); sgd.update(1.0); ``` -Note that this very simple example that doesn't cover things like reading/writing models, recurrent/LSTM networks, or adding biases to functions. The best way to get an idea of how to use cnn for real is to look in the `example` directory, particularly starting with the simplest `xor` example. +Note that this very simple example that doesn't cover things like memory initialization, reading/writing models, recurrent/LSTM networks, or adding biases to functions. The best way to get an idea of how to use cnn for real is to look in the `example` directory, particularly starting with the simplest `xor` example. From 7c12e3d5c8e157a25fe6ef591c5dd57d1a78b047 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 6 Jun 2015 01:14:10 -0600 Subject: [PATCH 064/965] simplify SumColumns using Eigen's broadcasting --- cnn/nodes.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 6bb7c584a..ae5687ea2 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -61,18 +61,18 @@ void SumColumns::backward(const vector& xs, unsigned i, Tensor& dEdxi) const { auto out = *dEdxi; - const int c = out.cols(); if (xs.size() == 1) { - for (int j = 0; j < c; ++j) - out.col(j) += *dEdf; + // this uses Eigen's broadcast capability + // the following doesn't compile, so i use the next line + //out.colwise() += *dEdf; + out.colwise() += (*dEdf).col(0); } else if (xs.size() == 2) { auto x = **xs[0]; auto w = **xs[1]; if (i == 0) { // matrix - for (int j = 0; j < c; ++j) - out.col(j) += w(j) * *dEdf; + out.noalias() += *dEdf * w.transpose(); } else { // column weighting - out += x.transpose() * *dEdf; + out.noalias() += x.transpose() * *dEdf; } } } From 77027af087bcb1f31f924ece8eb6720f2aefd2fa Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 7 Jun 2015 16:25:20 -0700 Subject: [PATCH 065/965] add 3d-1d tensor contraction --- cnn/dim.h | 5 +++++ cnn/nodes-common.cc | 21 ++++++++++++++++++--- cnn/nodes.cc | 38 ++++++++++++++++++++++++++++++++++++-- cnn/tensor.cc | 6 ++++-- 4 files changed, 63 insertions(+), 7 deletions(-) diff --git a/cnn/dim.h b/cnn/dim.h index 1ba33814a..e37adcf38 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -25,6 +25,11 @@ struct Dim { for (unsigned i = 0; i < nd; ++i) p *= d[i]; return p; } + inline int sum_dims() const { + int p = 0; + for (unsigned i = 0; i < nd; ++i) p += d[i]; + return p; + } inline int ndims() const { return nd; } inline int rows() const { return d[0]; } inline int cols() const { return nd > 1 ? d[1] : 1; } diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index f1e0e1a5d..310171728 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -60,13 +60,28 @@ Dim KMHNGram::dim_forward(const vector& xs) const { string InnerProduct3D_1D::as_string(const vector& arg_names) const { ostringstream s; - s << "inner(" << arg_names[0] << "," << arg_names[1] << ") + " << arg_names[2]; + s << "dot(" << arg_names[0] << "," << arg_names[1] << ')'; + if (arg_names.size() == 3) s << " + " << arg_names[2]; return s.str(); } Dim InnerProduct3D_1D::dim_forward(const vector& xs) const { - cerr << "InnerProduct3D_1D::dim_forward not implemented\n"; - abort(); + if (xs.size() != 2 && xs.size() != 3) { + cerr << "Expected two or three arguments in InnerProduct3D_1D\n"; + abort(); + } + if (xs[0].ndims() != 3 || + xs[1].ndims() != 1 || + xs[0].size(2) != xs[1].size(0)) { + cerr << "Bad input dimensions in InnerProduct3D_1D: " << xs << endl; + abort(); + } + Dim d({xs[0].size(0), xs[0].size(1)}); + if (xs.size() == 3 && xs[2] != d) { + cerr << "Bad input dimensions in InnerProduct3D_1D: " << xs << endl; + abort(); + } + return d; } string GaussianNoise::as_string(const vector& arg_names) const { diff --git a/cnn/nodes.cc b/cnn/nodes.cc index ae5687ea2..d47f2f17d 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -101,8 +101,28 @@ void KMHNGram::backward(const vector& xs, (*dEdxi).col(j+k) += (*dEdf).col(j); } +// Y_ij = A_ijk * B_k (+ C_ij) void InnerProduct3D_1D::forward(const vector& xs, Tensor& fx) const { - assert(!"not implemented"); + auto b = **xs[1]; + auto y = *fx; + const int i = y.rows(); + const int j = y.cols(); + const int k = b.rows(); + // the following reshape tensors into order 1 or 2 sizes + // but they point to the same memory + Tensor ta({i*j,k}, xs[0]->v); + Tensor ty({i*j}, fx.v); + auto A = *ta; + if (xs.size() == 3) { + Tensor tc({i*j}, xs[2]->v); + auto c = *tc; + // want to do A * b + c, but it triggers memory allocation + (*ty) = c; + (*ty).noalias() += A * b; + } else { + assert(xs.size() == 2); + (*ty).noalias() = A * b; + } } void InnerProduct3D_1D::backward(const vector& xs, @@ -110,7 +130,21 @@ void InnerProduct3D_1D::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - assert(!"not implemented"); + auto b = **xs[1]; + auto y = *fx; + const int si = y.rows(); + const int sj = y.cols(); + const int sk = b.rows(); + Tensor tdEdf({si*sj}, dEdf.v); + if (i == 0) { // 3-tensor + Tensor tdEdxi({si*sj, sk}, dEdxi.v); + (*tdEdxi).noalias() += *tdEdf * (**xs[1]).transpose(); + } else if (i == 1) { // vector + Tensor ta({si*sj,sk}, xs[0]->v); + (*dEdxi).noalias() += (*ta).transpose() * *tdEdf; + } else { // matrix bias + *dEdxi += *dEdf; + } } void GaussianNoise::forward(const vector& xs, Tensor& fx) const { diff --git a/cnn/tensor.cc b/cnn/tensor.cc index f339ceb93..2081e99f7 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -90,12 +90,14 @@ void TensorTools::Randomize(Tensor& val, real scale) { CUDA_CHECK(cudaMemcpy(val.v, t, sizeof(real) * val.d.size(), cudaMemcpyHostToDevice)); delete[] t; #else - *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); + Dim d({val.d.size()}); + Tensor tv(d, val.v); + *tv = Eigen::MatrixXf::NullaryExpr(d.size(), 1, b); #endif } void TensorTools::Randomize(Tensor& d) { - Randomize(d, sqrt(6) / sqrt(d.d[0] + d.d[1])); + Randomize(d, sqrt(6) / sqrt(d.d.sum_dims())); } void TensorTools::RandomBernoulli(Tensor& val, real p) { From 63424bf0ea7515868cef43cffa8c9749e877149a Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 8 Jun 2015 14:30:08 -0700 Subject: [PATCH 066/965] fix potential load/save bug --- cnn/model.h | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/cnn/model.h b/cnn/model.h index 67dd0a2bc..911a9c4e4 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -65,10 +65,24 @@ struct LookupParameters : public ParametersBase { LookupParameters() {} LookupParameters(unsigned n, const Dim& d); friend class boost::serialization::access; - template void serialize(Archive& ar, const unsigned int) { + template + void save(Archive& ar, const unsigned int) const { ar & dim; - ar & values; + int nv = values.size(); + ar & nv; + for (unsigned i = 0; i < values.size(); ++i) + ar & values[i]; } + template + void load(Archive& ar, const unsigned int) { + ar & dim; + int nv; + ar & nv; + assert(nv == (int)values.size()); + for (unsigned i = 0; i < values.size(); ++i) + ar & values[i]; + } + BOOST_SERIALIZATION_SPLIT_MEMBER() }; // this is a collection of parameters From dd849e64d550d7f4e7a05eb5dc8c1df5ee51834c Mon Sep 17 00:00:00 2001 From: Antonis Anastasopoulos Date: Tue, 9 Jun 2015 13:13:30 -0400 Subject: [PATCH 067/965] O --- CMakeLists.txt | 2 +- cnn/CMakeLists.txt | 8 +-- cnn/expr.cc | 20 ++++++ cnn/expr.h | 7 ++ cnn/lstm.cc | 152 ---------------------------------------- cnn/lstm.h | 49 ------------- cnn/rnn.cc | 77 -------------------- cnn/rnn.h | 91 ------------------------ examples/CMakeLists.txt | 3 +- examples/encdec.cc | 15 ++-- 10 files changed, 43 insertions(+), 381 deletions(-) delete mode 100644 cnn/lstm.cc delete mode 100644 cnn/lstm.h delete mode 100644 cnn/rnn.cc delete mode 100644 cnn/rnn.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c8f6e4bb..7ef56e011 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,4 +69,4 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory(cnn) add_subdirectory(examples) - +#add_subdirectory(postedit) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 71165ccf4..5c532bf4d 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -9,12 +9,12 @@ set(cnn_library_SRCS graph.cc # gru.cc init.cc - lstm.cc + lstm-expr.cc model.cc nodes.cc nodes-common.cc param-nodes.cc - rnn.cc + rnn-expr.cc rnn-state-machine.cc saxe-init.cc shadow-params.cc @@ -38,13 +38,13 @@ set(cnn_library_HDRS graph.h gru.h init.h - lstm.h + lstm-expr.h model.h nodes.h param-nodes.h random.h rnn-state-machine.h - rnn.h + rnn-expr.h saxe-init.h shadow-params.h tensor.h diff --git a/cnn/expr.cc b/cnn/expr.cc index 95de65f40..039aeffca 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -20,7 +20,27 @@ Expression logistic(const Expression& x) { return Expression(x.pg, x.pg->add_fun Expression rectify(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} + +Expression concatenate(const std::vector& x) { + std::vector tmp(x.size()); + for(unsigned j = 0; j < x.size(); ++j){ + tmp[j] = x[j].i; + } + //ComputationGraph *tpg = x[0].pg; + return Expression(x[0].pg, x[0].pg->add_function(tmp)); +} +Expression sum(const std::vector& x) { + std::vector tmp(x.size()); + for(unsigned j = 0; j < x.size(); ++j){ + tmp[j] = x[j].i; + } + //tpg = x[0].pg; + return Expression(x[0].pg, x[0].pg->add_function(tmp)); +} + Expression squaredDistance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression pick(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } +Expression pickrange(const Expression& x, unsigned v, unsigned u) { return Expression(x.pg, x.pg->add_function({x.i}, v, u)); } } } diff --git a/cnn/expr.h b/cnn/expr.h index 465c23811..b5bf1d6d5 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -30,8 +30,15 @@ Expression logistic(const Expression& x); Expression rectify(const Expression& x); Expression log_softmax(const Expression& x); +Expression cwise_multiply(const Expression& x, const Expression& y); + +Expression concatenate(const std::vector& x); +Expression sum(const std::vector& x); + + Expression squaredDistance(const Expression& x, const Expression& y); Expression pick(const Expression& x, unsigned v); +Expression pickrange(const Expression& x, unsigned v, unsigned u); } } diff --git a/cnn/lstm.cc b/cnn/lstm.cc deleted file mode 100644 index 2d0f532d7..000000000 --- a/cnn/lstm.cc +++ /dev/null @@ -1,152 +0,0 @@ -#include "cnn/lstm.h" - -#include -#include -#include -#include - -#include "cnn/nodes.h" - -using namespace std; - -namespace cnn { - -enum { X2I, H2I, C2I, BI, X2O, H2O, C2O, BO, X2C, H2C, BC }; - -LSTMBuilder::LSTMBuilder(unsigned layers, - unsigned input_dim, - unsigned hidden_dim, - Model* model) : layers(layers) { - unsigned layer_input_dim = input_dim; - for (unsigned i = 0; i < layers; ++i) { - // i - Parameters* p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2i = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_c2i = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bi = model->add_parameters({hidden_dim}); - - // o - Parameters* p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2o = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_c2o = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bo = model->add_parameters({hidden_dim}); - - // c - Parameters* p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2c = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bc = model->add_parameters({hidden_dim}); - layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - - vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; - params.push_back(ps); - } // layers -} - -void LSTMBuilder::new_graph_impl(ComputationGraph* cg) { - param_vars.clear(); - - for (unsigned i = 0; i < layers; ++i) { - auto& p = params[i]; - - // i - VariableIndex i_x2i = cg->add_parameters(p[X2I]); - VariableIndex i_h2i = cg->add_parameters(p[H2I]); - VariableIndex i_c2i = cg->add_parameters(p[C2I]); - VariableIndex i_bi = cg->add_parameters(p[BI]); - - // o - VariableIndex i_x2o = cg->add_parameters(p[X2O]); - VariableIndex i_h2o = cg->add_parameters(p[H2O]); - VariableIndex i_c2o = cg->add_parameters(p[C2O]); - VariableIndex i_bo = cg->add_parameters(p[BO]); - - // c - VariableIndex i_x2c = cg->add_parameters(p[X2C]); - VariableIndex i_h2c = cg->add_parameters(p[H2C]); - VariableIndex i_bc = cg->add_parameters(p[BC]); - - vector vars = {i_x2i, i_h2i, i_c2i, i_bi, i_x2o, i_h2o, i_c2o, i_bo, i_x2c, i_h2c, i_bc}; - param_vars.push_back(vars); - } -} - -// layout: 0..layers = c -// layers+1..2*layers = h -void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { - h.clear(); - c.clear(); - if (hinit.size() > 0) { - assert(layers*2 == hinit.size()); - h0.resize(layers); - c0.resize(layers); - for (unsigned i = 0; i < layers; ++i) { - c0[i] = hinit[i]; - h0[i] = hinit[i + layers]; - } - has_initial_state = true; - } else { - has_initial_state = false; - } -} - -VariableIndex LSTMBuilder::add_input_impl(VariableIndex x, ComputationGraph* cg) { - const unsigned t = h.size(); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - vector& ht = h.back(); - vector& ct = c.back(); - VariableIndex in = x; - for (unsigned i = 0; i < layers; ++i) { - const vector& vars = param_vars[i]; - VariableIndex i_h_tm1; - VariableIndex i_c_tm1; - bool has_prev_state = (t > 0 || has_initial_state); - if (t == 0) { - if (has_initial_state) { - // intial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - i_c_tm1 = c0[i]; - } - } else { // t > 0 - i_h_tm1 = h[t-1][i]; - i_c_tm1 = c[t-1][i]; - } - // input - VariableIndex i_ait; - if (has_prev_state) - i_ait = cg->add_function({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1, vars[C2I], i_c_tm1}); - else - i_ait = cg->add_function({vars[BI], vars[X2I], in}); - VariableIndex i_it = cg->add_function({i_ait}); - // forget - VariableIndex i_ft = cg->add_function({i_it}, 1.f); - // write memory cell - VariableIndex i_awt; - if (has_prev_state) - i_awt = cg->add_function({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); - else - i_awt = cg->add_function({vars[BC], vars[X2C], in}); - VariableIndex i_wt = cg->add_function({i_awt}); - // output - if (has_prev_state) { - VariableIndex i_nwt = cg->add_function({i_it, i_wt}); - VariableIndex i_crt = cg->add_function({i_ft, i_c_tm1}); - ct[i] = cg->add_function({i_crt, i_nwt}); // new memory cell at time t - } else { - ct[i] = cg->add_function({i_it, i_wt}); - } - - VariableIndex i_aot; - if (has_prev_state) - i_aot = cg->add_function({vars[BO], vars[X2O], in, vars[H2O], i_h_tm1, vars[C2O], ct[i]}); - else - i_aot = cg->add_function({vars[BO], vars[X2O], in}); - VariableIndex i_ot = cg->add_function({i_aot}); - VariableIndex ph_t = cg->add_function({ct[i]}); - in = ht[i] = cg->add_function({i_ot, ph_t}); - } - return ht.back(); -} - -} // namespace cnn diff --git a/cnn/lstm.h b/cnn/lstm.h deleted file mode 100644 index ffb9fd3d6..000000000 --- a/cnn/lstm.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef CNN_LSTM_H_ -#define CNN_LSTM_H_ - -#include "cnn/cnn.h" -#include "cnn/rnn.h" - -namespace cnn { - -class Model; - -struct LSTMBuilder : public RNNBuilder { - LSTMBuilder() = default; - explicit LSTMBuilder(unsigned layers, - unsigned input_dim, - unsigned hidden_dim, - Model* model); - - void rewind_one_step() { - h.pop_back(); - c.pop_back(); - } - VariableIndex back() const { return h.back().back(); } - std::vector final_h() const { return h.back(); } - protected: - void new_graph_impl(ComputationGraph* cg) override; - void start_new_sequence_impl(const std::vector& h0) override; - VariableIndex add_input_impl(VariableIndex x, ComputationGraph* cg) override; - - public: - // first index is layer, then ... - std::vector> params; - - // first index is layer, then ... - std::vector> param_vars; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; -}; - -} // namespace cnn - -#endif diff --git a/cnn/rnn.cc b/cnn/rnn.cc deleted file mode 100644 index 4e651da52..000000000 --- a/cnn/rnn.cc +++ /dev/null @@ -1,77 +0,0 @@ -#include "cnn/rnn.h" - -#include -#include -#include -#include - -#include "cnn/nodes.h" - -using namespace std; - -namespace cnn { - -RNNBuilder::~RNNBuilder() {} - -SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, - unsigned input_dim, - unsigned hidden_dim, - Model* model) : layers(layers) { - unsigned layer_input_dim = input_dim; - for (unsigned i = 0; i < layers; ++i) { - Parameters* p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2h = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_hb = model->add_parameters({hidden_dim}); - vector ps = {p_x2h, p_h2h, p_hb}; - params.push_back(ps); - layer_input_dim = hidden_dim; - } -} - -void SimpleRNNBuilder::new_graph_impl(ComputationGraph* cg) { - param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - Parameters* p_x2h = params[i][0]; - Parameters* p_h2h = params[i][1]; - Parameters* p_hb = params[i][2]; - VariableIndex i_x2h = cg->add_parameters(p_x2h); - VariableIndex i_h2h = cg->add_parameters(p_h2h); - VariableIndex i_hb = cg->add_parameters(p_hb); - vector vars = {i_x2h, i_h2h, i_hb}; - param_vars.push_back(vars); - } -} - -void SimpleRNNBuilder::start_new_sequence_impl(const vector& h_0) { - h.clear(); - h0 = h_0; - if (h0.size()) { assert(h0.size() == layers); } -} - -VariableIndex SimpleRNNBuilder::add_input_impl(VariableIndex x, ComputationGraph* cg) { - const unsigned t = h.size(); - h.push_back(vector(layers)); - vector& ht = h.back(); - VariableIndex in = x; - for (unsigned i = 0; i < layers; ++i) { - const vector& vars = param_vars[i]; - VariableIndex i_h3; - bool have_prev = (t > 0 || h0.size() > 0); - if (have_prev) { - VariableIndex i_h_tm1; - if (t == 0) { - if (h0.size()) i_h_tm1 = h0[i]; // first time step - } else { // tth time step - i_h_tm1 = h[t-1][i]; - } - // h3 = hbias + h2h * h_{t-1} + x2h * in - i_h3 = cg->add_function({vars[2], vars[0], in, vars[1], i_h_tm1}); - } else { - i_h3 = cg->add_function({vars[2], vars[0], in}); - } - in = ht[i] = cg->add_function({i_h3}); - } - return ht.back(); -} - -} // namespace cnn diff --git a/cnn/rnn.h b/cnn/rnn.h deleted file mode 100644 index b76fe2cf5..000000000 --- a/cnn/rnn.h +++ /dev/null @@ -1,91 +0,0 @@ -#ifndef CNN_RNN_H_ -#define CNN_RNN_H_ - -#include "cnn/cnn.h" -#include "cnn/rnn-state-machine.h" - -namespace cnn { - -class Model; - -// interface for constructing an RNN, LSTM, GRU, etc. -struct RNNBuilder { - virtual ~RNNBuilder(); - // call this to reset the builder when you are working with a newly - // created ComputationGraph object - void new_graph(ComputationGraph* cg) { - sm.transition(RNNOp::new_graph); - new_graph_impl(cg); - } - - // Reset for new sequence - // call this before add_input and after new_graph, - // when starting a new sequence on the same hypergraph. - // h_0 is used to initialize hidden layers at timestep 0 to given values - void start_new_sequence(const std::vector& h_0={}) { - sm.transition(RNNOp::start_new_sequence); - start_new_sequence_impl(h_0); - } - - // add another timestep by reading in the variable x - // return the hidden representation of the deepest layer - VariableIndex add_input(VariableIndex x, ComputationGraph* cg) { - sm.transition(RNNOp::add_input); - return add_input_impl(x, cg); - } - - // rewind the last timestep - this DOES NOT remove the variables - // from the computation graph, it just means the next time step will - // see a different previous state. You can remind as many times as - // you want. - virtual void rewind_one_step() = 0; - // returns node (index) of most recent output - virtual VariableIndex back() const = 0; - // access hidden state contents - virtual std::vector final_h() const = 0; - protected: - virtual void new_graph_impl(ComputationGraph* cg) = 0; - virtual void start_new_sequence_impl(const std::vector& h_0) = 0; - virtual VariableIndex add_input_impl(VariableIndex x, ComputationGraph* cg) = 0; - private: - // the state machine ensures that the caller is behaving - RNNStateMachine sm; -}; - -struct SimpleRNNBuilder : public RNNBuilder { - SimpleRNNBuilder() = default; - explicit SimpleRNNBuilder(unsigned layers, - unsigned input_dim, - unsigned hidden_dim, - Model* model); - - protected: - void new_graph_impl(ComputationGraph* cg) override; - void start_new_sequence_impl(const std::vector& h_0) override; - VariableIndex add_input_impl(VariableIndex x, ComputationGraph* cg) override; - - public: - void rewind_one_step() { h.pop_back(); } - VariableIndex back() const { return h.back().back(); } - std::vector final_h() const { return h.back(); } - - private: - // first index is layer, then x2h h2h hb - std::vector> params; - - // first index is layer, then x2h h2h hb - std::vector> param_vars; - - // first index is time, second is layer - std::vector> h; - - // initial value of h - // defaults to zero matrix input - std::vector h0; - - unsigned layers; -}; - -} // namespace cnn - -#endif diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index cbb01c3b3..373782b19 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET embed-cl encdec xor xor-xent rnnlm nlm) +#foreach(TARGET embed-cl encdec encdec-expr xor xor-xent rnnlm nlm) +foreach(TARGET encdec-expr) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/encdec.cc b/examples/encdec.cc index cb31ff3d0..94097ac75 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -16,9 +16,9 @@ using namespace std; using namespace cnn; -unsigned LAYERS = 2; -unsigned INPUT_DIM = 8; -unsigned HIDDEN_DIM = 24; +unsigned LAYERS = 4; +unsigned INPUT_DIM = 500; +unsigned HIDDEN_DIM = 500; unsigned INPUT_VOCAB_SIZE = 0; unsigned OUTPUT_VOCAB_SIZE = 0; @@ -137,9 +137,9 @@ int main(int argc, char** argv) { } cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; } - d.Freeze(); // no new word types allowed - INPUT_VOCAB_SIZE = d.size(); - OUTPUT_VOCAB_SIZE = d.size(); + //d.Freeze(); // no new word types allowed + //INPUT_VOCAB_SIZE = d.size(); + //OUTPUT_VOCAB_SIZE = d.size(); int dlc = 0; int dtoks = 0; @@ -158,6 +158,9 @@ int main(int argc, char** argv) { } cerr << dlc << " lines, " << dtoks << " tokens\n"; } + d.Freeze(); + INPUT_VOCAB_SIZE = d.size(); + OUTPUT_VOCAB_SIZE = d.size(); ostringstream os; os << "bilm" << '_' << LAYERS From 43a777f10962103c5e0bb9509ddf363409d53b9a Mon Sep 17 00:00:00 2001 From: Antonis Anastasopoulos Date: Tue, 9 Jun 2015 13:16:52 -0400 Subject: [PATCH 068/965] Antonis --- cnn/lstm.cc | 214 ++++++++++++++++++++++++++++++++++++++++++++++++++++ cnn/lstm.h | 53 +++++++++++++ cnn/rnn.cc | 87 +++++++++++++++++++++ cnn/rnn.h | 94 +++++++++++++++++++++++ 4 files changed, 448 insertions(+) create mode 100644 cnn/lstm.cc create mode 100644 cnn/lstm.h create mode 100644 cnn/rnn.cc create mode 100644 cnn/rnn.h diff --git a/cnn/lstm.cc b/cnn/lstm.cc new file mode 100644 index 000000000..f90d97a8a --- /dev/null +++ b/cnn/lstm.cc @@ -0,0 +1,214 @@ +#include "cnn/lstm.h" + +#include +#include +#include +#include + +#include "cnn/nodes.h" + +using namespace std; +using namespace cnn::expr; + +namespace cnn { + +enum { X2I, H2I, C2I, BI, X2O, H2O, C2O, BO, X2C, H2C, BC }; + +LSTMBuilder::LSTMBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model) : layers(layers) { + unsigned layer_input_dim = input_dim; + for (unsigned i = 0; i < layers; ++i) { + // i + Parameters* p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2i = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_c2i = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_bi = model->add_parameters({hidden_dim}); + + // o + Parameters* p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2o = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_c2o = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_bo = model->add_parameters({hidden_dim}); + + // c + Parameters* p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2c = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_bc = model->add_parameters({hidden_dim}); + layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next + + vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; + params.push_back(ps); + } // layers +} + +void LSTMBuilder::new_graph_impl(ComputationGraph& cg){ + param_vars.clear(); + cerr << "LSTMBuilder: About to build graph"<< endl; + + for (unsigned i = 0; i < layers; ++i){ + auto& p = params[i]; + + //i + Expression i_x2i = parameter(cg,p[X2I]); + Expression i_h2i = parameter(cg,p[H2I]); + Expression i_c2i = parameter(cg,p[C2I]); + Expression i_bi = parameter(cg,p[BI]); + //o + Expression i_x2o = parameter(cg,p[X2O]); + Expression i_h2o = parameter(cg,p[H2O]); + Expression i_c2o = parameter(cg,p[C2O]); + Expression i_bo = parameter(cg,p[BO]); + //c + Expression i_x2c = parameter(cg,p[X2C]); + Expression i_h2c = parameter(cg,p[H2C]); + Expression i_bc = parameter(cg,p[BC]); + + vector vars = {i_x2i, i_h2i, i_c2i, i_bi, i_x2o, i_h2o, i_c2o, i_bo, i_x2c, i_h2c, i_bc}; + param_vars.push_back(vars); + + + } + cerr << "LSTMBuilder: Built graph"<< endl; +} + +/*void LSTMBuilder::new_graph_impl(ComputationGraph* cg) { + param_vars.clear(); + + for (unsigned i = 0; i < layers; ++i) { + auto& p = params[i]; + + // i + VariableIndex i_x2i = cg->add_parameters(p[X2I]); + VariableIndex i_h2i = cg->add_parameters(p[H2I]); + VariableIndex i_c2i = cg->add_parameters(p[C2I]); + VariableIndex i_bi = cg->add_parameters(p[BI]); + + // o + VariableIndex i_x2o = cg->add_parameters(p[X2O]); + VariableIndex i_h2o = cg->add_parameters(p[H2O]); + VariableIndex i_c2o = cg->add_parameters(p[C2O]); + VariableIndex i_bo = cg->add_parameters(p[BO]); + + // c + VariableIndex i_x2c = cg->add_parameters(p[X2C]); + VariableIndex i_h2c = cg->add_parameters(p[H2C]); + VariableIndex i_bc = cg->add_parameters(p[BC]); + + vector vars = {i_x2i, i_h2i, i_c2i, i_bi, i_x2o, i_h2o, i_c2o, i_bo, i_x2c, i_h2c, i_bc}; + param_vars.push_back(vars); + } +}*/ + +// layout: 0..layers = c +// layers+1..2*layers = h +void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { + h.clear(); + c.clear(); + if (hinit.size() > 0) { + assert(layers*2 == hinit.size()); + h0.resize(layers); + c0.resize(layers); + for (unsigned i = 0; i < layers; ++i) { + c0[i] = hinit[i]; + h0[i] = hinit[i + layers]; + } + has_initial_state = true; + } else { + has_initial_state = false; + } +} + +//VariableIndex LSTMBuilder::add_input_impl(VariableIndex x, ComputationGraph* cg) { +Expression LSTMBuilder::add_input_impl(Expression& x, ComputationGraph& cg) { + cerr << "Input_impl: Came here!" << endl; + const unsigned t = h.size(); + cerr << "Input_impl: Got size" << endl; + //h.push_back(vector(layers)); + //c.push_back(vector(layers)); + h.push_back(vector(layers)); + c.push_back(vector(layers)); + cerr << "Input_impl: pushed back" << endl; + //vector& ht = h.back(); + //vector& ct = c.back(); + vector& ht = h.back(); + vector& ct = c.back(); + Expression in = x; + //VariableIndex in = x; + for (unsigned i = 0; i < layers; ++i) { + const vector& vars = param_vars[i]; + //VariableIndex i_h_tm1; + //VariableIndex i_c_tm1; + Expression i_h_tm1, i_c_tm1; + bool has_prev_state = (t > 0 || has_initial_state); + if (t == 0) { + if (has_initial_state) { + // intial value for h and c at timestep 0 in layer i + // defaults to zero matrix input if not set in add_parameter_edges + i_h_tm1 = h0[i]; + i_c_tm1 = c0[i]; + } + } else { // t > 0 + i_h_tm1 = h[t-1][i]; + i_c_tm1 = c[t-1][i]; + } + // input + Expression i_ait; + if (has_prev_state) + // COmbine VariableIndex with Expressions??? + i_ait = vars[BI] + vars[X2I] * in + vars[H2I]*i_h_tm1 + vars[C2I] * i_c_tm1; + //i_ait = cg->add_function({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1, vars[C2I], i_c_tm1}); + else + i_ait = vars[BI] + vars[X2I] * in; + //i_ait = cg->add_function({vars[BI], vars[X2I], in}); + Expression i_it = logistic(i_ait); + //VariableIndex i_it = cg->add_function({i_ait}); + // forget + Expression i_ft = i_it - 1.f; + //VariableIndex i_ft = cg->add_function({i_it}, 1.f); + // write memory cell + //VariableIndex i_awt; + Expression i_awt; + if (has_prev_state) + i_awt = vars[BV] + vars[X2C] * in + vars[H2C]*i_h_tm1; + //i_awt = cg->add_function({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); + else + i_awt = vars[BV] + vars[X2C] * in; + //i_awt = cg->add_function({vars[BC], vars[X2C], in}); + Expression i_wt = tanh(i_awt); + //VariableIndex i_wt = cg->add_function({i_awt}); + // output + if (has_prev_state) { + //VariableIndex i_nwt = cg->add_function({i_it, i_wt}); + Expression i_nwt = cwise_multiply(i_it,i_wt); + //VariableIndex i_crt = cg->add_function({i_ft, i_c_tm1}); + Expression i_crt = cwise_multiply(i_ft,i_c_tm1); + //ct[i] = cg->add_function({i_crt, i_nwt}); // new memory cell at time t + ct[i] = i_crt + i_nwt; + } else { + //ct[i] = cg->add_function({i_it, i_wt}); + ct[u] = cwise_multiply(i_it,i_wt); + } + + //VariableIndex i_aot; + Expression i_aot; + if (has_prev_state) + i_aot = vars[BO] + vars[X2O] * in + vars[H2O] * i_h_tm1 + vars[C2O] * ct[i]; + //i_aot = cg->add_function({vars[BO], vars[X2O], in, vars[H2O], i_h_tm1, vars[C2O], ct[i]}); + else + i_aot = vars[BO] + vars[X2O] * in; + //i_aot = cg->add_function({vars[BO], vars[X2O], in}); + Expression i_ot = logistic(i_aot); + Expression ph_t = tanh(ct[i]); + in = ht[i] = cwise_multiply(i,ot,ph_t); + + cerr << "Input_impl: Did all" << endl; + //VariableIndex i_ot = cg->add_function({i_aot}); + //VariableIndex ph_t = cg->add_function({ct[i]}); + //in = ht[i] = cg->add_function({i_ot, ph_t}); + } + return ht.back(); +} + +} // namespace cnn diff --git a/cnn/lstm.h b/cnn/lstm.h new file mode 100644 index 000000000..aacdd2789 --- /dev/null +++ b/cnn/lstm.h @@ -0,0 +1,53 @@ +#ifndef CNN_LSTM_H_ +#define CNN_LSTM_H_ + +#include "cnn/cnn.h" +#include "cnn/rnn.h" +#include "cnn/expr.h" + +using namespace cnn::expr; + +namespace cnn { + +class Model; + +struct LSTMBuilder : public RNNBuilder { + LSTMBuilder() = default; + explicit LSTMBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model); + + void rewind_one_step() { + h.pop_back(); + c.pop_back(); + } + Expression back() const { return h.back().back(); } + std::vector final_h() const { return h.back(); } + protected: + void new_graph_impl(ComputationGraph& cg) override; + void start_new_sequence_impl(const std::vector& h0) override; + //VariableIndex add_input_impl(VariableIndex x, ComputationGraph* cg) override; + Expression add_input_impl(Expression& x, ComputationGraph& cg) override; + + public: + // first index is layer, then ... + std::vector> params; + + // first index is layer, then ... + std::vector> param_vars; + + // first index is time, second is layer + std::vector> h, c; + + // initial values of h and c at each layer + // - both default to zero matrix input + bool has_initial_state; // if this is false, treat h0 and c0 as 0 + std::vector h0; + std::vector c0; + unsigned layers; +}; + +} // namespace cnn + +#endif diff --git a/cnn/rnn.cc b/cnn/rnn.cc new file mode 100644 index 000000000..5b1761d2e --- /dev/null +++ b/cnn/rnn.cc @@ -0,0 +1,87 @@ +#include "cnn/rnn.h" + +#include +#include +#include +#include + +#include "cnn/nodes.h" + +using namespace std; +using namespace cnn::expr; +using namespace cnn; + +namespace cnn { + +RNNBuilder::~RNNBuilder() {} + +SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model) : layers(layers) { + unsigned layer_input_dim = input_dim; + for (unsigned i = 0; i < layers; ++i) { + Parameters* p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2h = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_hb = model->add_parameters({hidden_dim}); + vector ps = {p_x2h, p_h2h, p_hb}; + params.push_back(ps); + layer_input_dim = hidden_dim; + } +} + +void SimpleRNNBuilder::new_graph_impl(ComputationGraph& cg) { + param_vars.clear(); + for (unsigned i = 0; i < layers; ++i) { + Parameters* p_x2h = params[i][0]; + Parameters* p_h2h = params[i][1]; + Parameters* p_hb = params[i][2]; + Expression i_x2h = parameter(cg,p_x2h); + Expression i_h2h = parameter(cg,p_h2h); + Expression i_hb = parameter(cg,p_hb); + + //VariableIndex i_x2h = cg->add_parameters(p_x2h); + //VariableIndex i_h2h = cg->add_parameters(p_h2h); + //VariableIndex i_hb = cg->add_parameters(p_hb); + //vector vars = {i_x2h, i_h2h, i_hb}; + vector vars = {i_x2h, i_h2h, i_hb}; + param_vars.push_back(vars); + } +} + +void SimpleRNNBuilder::start_new_sequence_impl(const vector& h_0) { + h.clear(); + h0 = h_0; + if (h0.size()) { assert(h0.size() == layers); } +} + +Expression SimpleRNNBuilder::add_input_impl(Expression& x, ComputationGraph& cg) { + const unsigned t = h.size(); + h.push_back(vector(layers)); + vector& ht = h.back(); + Expression in = x; + for (unsigned i = 0; i < layers; ++i) { + const vector& vars = param_vars[i]; + //Expression i_h3; + bool have_prev = (t > 0 || h0.size() > 0); + if (have_prev) { + Expression i_h_tm1; + if (t == 0) { + if (h0.size()) i_h_tm1 = h0[i]; // first time step + } else { // tth time step + i_h_tm1 = h[t-1][i]; + } + // h3 = hbias + h2h * h_{t-1} + x2h * in + Expression i_h3 = vars[2] + vars[0] * in + vars[1] * i_h_tm1; + //i_h3 = cg->add_function({vars[2], vars[0], in, vars[1], i_h_tm1}); + } else { + //i_h3 = cg->add_function({vars[2], vars[0], in}); + Expression i_h3 = vars[2] + vars[0] * in ; + } + //in = ht[i] = cg->add_function({i_h3}); + in = ht[i] = tanh(i_h3); + } + return ht.back(); +} + +} // namespace cnn diff --git a/cnn/rnn.h b/cnn/rnn.h new file mode 100644 index 000000000..cad9c4c59 --- /dev/null +++ b/cnn/rnn.h @@ -0,0 +1,94 @@ +#ifndef CNN_RNN_H_ +#define CNN_RNN_H_ + +#include "cnn/cnn.h" +#include "cnn/rnn-state-machine.h" +#include "cnn/expr.h" + +using namespace cnn::expr; + +namespace cnn { + +class Model; + +// interface for constructing an RNN, LSTM, GRU, etc. +struct RNNBuilder { + virtual ~RNNBuilder(); + // call this to reset the builder when you are working with a newly + // created ComputationGraph object + void new_graph(ComputationGraph& cg) { + sm.transition(RNNOp::new_graph); + new_graph_impl(cg); + } + + // Reset for new sequence + // call this before add_input and after new_graph, + // when starting a new sequence on the same hypergraph. + // h_0 is used to initialize hidden layers at timestep 0 to given values + void start_new_sequence(const std::vector& h_0={}) { + sm.transition(RNNOp::start_new_sequence); + start_new_sequence_impl(h_0); + } + + // add another timestep by reading in the variable x + // return the hidden representation of the deepest layer + Expression add_input(Expression& x, ComputationGraph& cg) { + sm.transition(RNNOp::add_input); + return add_input_impl(x, cg); + } + + // rewind the last timestep - this DOES NOT remove the variables + // from the computation graph, it just means the next time step will + // see a different previous state. You can remind as many times as + // you want. + virtual void rewind_one_step() = 0; + // returns node (index) of most recent output + virtual Expression back() const = 0; + // access hidden state contents + virtual std::vector final_h() const = 0; + protected: + virtual void new_graph_impl(ComputationGraph& cg) = 0; + virtual void start_new_sequence_impl(const std::vector& h_0) = 0; + virtual Expression add_input_impl(Expression& x, ComputationGraph& cg) = 0; + private: + // the state machine ensures that the caller is behaving + RNNStateMachine sm; +}; + +struct SimpleRNNBuilder : public RNNBuilder { + SimpleRNNBuilder() = default; + explicit SimpleRNNBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model); + + protected: + void new_graph_impl(ComputationGraph& cg) override; + void start_new_sequence_impl(const std::vector& h_0) override; + Expression add_input_impl(Expression& x, ComputationGraph& cg) override; + + public: + void rewind_one_step() { h.pop_back(); } + Expression back() const { return h.back().back(); } + std::vector final_h() const { return h.back(); } + + private: + // first index is layer, then x2h h2h hb + std::vector> params; + + // first index is layer, then x2h h2h hb + std::vector> param_vars; + + // first index is time, second is layer + std::vector> h; + + // initial value of h + // defaults to zero matrix input + std::vector h0; + + unsigned layers; +}; + +} // namespace cnn + +#endif From e6dda47ac90e02c9f6874b1db110fca0c3f1dec2 Mon Sep 17 00:00:00 2001 From: Antonis Anastasopoulos Date: Tue, 9 Jun 2015 14:03:53 -0400 Subject: [PATCH 069/965] Runs but eigen error with large dims --- cnn/CMakeLists.txt | 8 ++--- cnn/lstm.cc | 15 +++----- cnn/rnn-expr.cc | 87 ++++++++++++++++++++++++++++++++++++++++++++++ cnn/rnn.cc | 6 ++-- cnn/tensor.h | 4 ++- 5 files changed, 102 insertions(+), 18 deletions(-) create mode 100644 cnn/rnn-expr.cc diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 5c532bf4d..71165ccf4 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -9,12 +9,12 @@ set(cnn_library_SRCS graph.cc # gru.cc init.cc - lstm-expr.cc + lstm.cc model.cc nodes.cc nodes-common.cc param-nodes.cc - rnn-expr.cc + rnn.cc rnn-state-machine.cc saxe-init.cc shadow-params.cc @@ -38,13 +38,13 @@ set(cnn_library_HDRS graph.h gru.h init.h - lstm-expr.h + lstm.h model.h nodes.h param-nodes.h random.h rnn-state-machine.h - rnn-expr.h + rnn.h saxe-init.h shadow-params.h tensor.h diff --git a/cnn/lstm.cc b/cnn/lstm.cc index f90d97a8a..a198fc923 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -45,7 +45,6 @@ LSTMBuilder::LSTMBuilder(unsigned layers, void LSTMBuilder::new_graph_impl(ComputationGraph& cg){ param_vars.clear(); - cerr << "LSTMBuilder: About to build graph"<< endl; for (unsigned i = 0; i < layers; ++i){ auto& p = params[i]; @@ -70,7 +69,6 @@ void LSTMBuilder::new_graph_impl(ComputationGraph& cg){ } - cerr << "LSTMBuilder: Built graph"<< endl; } /*void LSTMBuilder::new_graph_impl(ComputationGraph* cg) { @@ -122,14 +120,11 @@ void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { //VariableIndex LSTMBuilder::add_input_impl(VariableIndex x, ComputationGraph* cg) { Expression LSTMBuilder::add_input_impl(Expression& x, ComputationGraph& cg) { - cerr << "Input_impl: Came here!" << endl; const unsigned t = h.size(); - cerr << "Input_impl: Got size" << endl; //h.push_back(vector(layers)); //c.push_back(vector(layers)); h.push_back(vector(layers)); c.push_back(vector(layers)); - cerr << "Input_impl: pushed back" << endl; //vector& ht = h.back(); //vector& ct = c.back(); vector& ht = h.back(); @@ -171,10 +166,10 @@ Expression LSTMBuilder::add_input_impl(Expression& x, ComputationGraph& cg) { //VariableIndex i_awt; Expression i_awt; if (has_prev_state) - i_awt = vars[BV] + vars[X2C] * in + vars[H2C]*i_h_tm1; + i_awt = vars[BC] + vars[X2C] * in + vars[H2C]*i_h_tm1; //i_awt = cg->add_function({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); else - i_awt = vars[BV] + vars[X2C] * in; + i_awt = vars[BC] + vars[X2C] * in; //i_awt = cg->add_function({vars[BC], vars[X2C], in}); Expression i_wt = tanh(i_awt); //VariableIndex i_wt = cg->add_function({i_awt}); @@ -188,7 +183,7 @@ Expression LSTMBuilder::add_input_impl(Expression& x, ComputationGraph& cg) { ct[i] = i_crt + i_nwt; } else { //ct[i] = cg->add_function({i_it, i_wt}); - ct[u] = cwise_multiply(i_it,i_wt); + ct[i] = cwise_multiply(i_it,i_wt); } //VariableIndex i_aot; @@ -201,9 +196,9 @@ Expression LSTMBuilder::add_input_impl(Expression& x, ComputationGraph& cg) { //i_aot = cg->add_function({vars[BO], vars[X2O], in}); Expression i_ot = logistic(i_aot); Expression ph_t = tanh(ct[i]); - in = ht[i] = cwise_multiply(i,ot,ph_t); + in = ht[i] = cwise_multiply(i_ot,ph_t); - cerr << "Input_impl: Did all" << endl; + //VariableIndex i_ot = cg->add_function({i_aot}); //VariableIndex ph_t = cg->add_function({ct[i]}); //in = ht[i] = cg->add_function({i_ot, ph_t}); diff --git a/cnn/rnn-expr.cc b/cnn/rnn-expr.cc new file mode 100644 index 000000000..f5b3d17f6 --- /dev/null +++ b/cnn/rnn-expr.cc @@ -0,0 +1,87 @@ +#include "cnn/rnn.h" + +#include +#include +#include +#include + +#include "cnn/nodes.h" + +using namespace std; +using namespace cnn::expr; +using namespace cnn; + +namespace cnn { + +RNNBuilder::~RNNBuilder() {} + +SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model) : layers(layers) { + unsigned layer_input_dim = input_dim; + for (unsigned i = 0; i < layers; ++i) { + Parameters* p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2h = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_hb = model->add_parameters({hidden_dim}); + vector ps = {p_x2h, p_h2h, p_hb}; + params.push_back(ps); + layer_input_dim = hidden_dim; + } +} + +void SimpleRNNBuilder::new_graph_impl(ComputationGraph& cg) { + param_vars.clear(); + for (unsigned i = 0; i < layers; ++i) { + Parameters* p_x2h = params[i][0]; + Parameters* p_h2h = params[i][1]; + Parameters* p_hb = params[i][2]; + Expression i_x2h = parameter(cg,p_x2h); + Expression i_h2h = parameter(cg,p_h2h); + Expression i_hb = parameter(cg,p_hb); + + //VariableIndex i_x2h = cg->add_parameters(p_x2h); + //VariableIndex i_h2h = cg->add_parameters(p_h2h); + //VariableIndex i_hb = cg->add_parameters(p_hb); + //vector vars = {i_x2h, i_h2h, i_hb}; + vector vars = {i_x2h, i_h2h, i_hb}; + param_vars.push_back(vars); + } +} + +void SimpleRNNBuilder::start_new_sequence_impl(const vector& h_0) { + h.clear(); + h0 = h_0; + if (h0.size()) { assert(h0.size() == layers); } +} + +Expression SimpleRNNBuilder::add_input_impl(Expression& x, ComputationGraph& cg) { + const unsigned t = h.size(); + h.push_back(vector(layers)); + vector& ht = h.back(); + Expression in = x; + for (unsigned i = 0; i < layers; ++i) { + const vector& vars = param_vars[i]; + Expression i_h3; + bool have_prev = (t > 0 || h0.size() > 0); + if (have_prev) { + Expression i_h_tm1; + if (t == 0) { + if (h0.size()) i_h_tm1 = h0[i]; // first time step + } else { // tth time step + i_h_tm1 = h[t-1][i]; + } + // h3 = hbias + h2h * h_{t-1} + x2h * in + i_h3 = vars[2] + vars[0] * in + vars[1] * i_h_tm1; + //i_h3 = cg->add_function({vars[2], vars[0], in, vars[1], i_h_tm1}); + } else { + //i_h3 = cg->add_function({vars[2], vars[0], in}); + i_h3 = vars[2] + vars[0] * in ; + } + //in = ht[i] = cg->add_function({i_h3}); + in = ht[i] = tanh(i_h3); + } + return ht.back(); +} + +} // namespace cnn diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 5b1761d2e..f5b3d17f6 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -62,7 +62,7 @@ Expression SimpleRNNBuilder::add_input_impl(Expression& x, ComputationGraph& cg) Expression in = x; for (unsigned i = 0; i < layers; ++i) { const vector& vars = param_vars[i]; - //Expression i_h3; + Expression i_h3; bool have_prev = (t > 0 || h0.size() > 0); if (have_prev) { Expression i_h_tm1; @@ -72,11 +72,11 @@ Expression SimpleRNNBuilder::add_input_impl(Expression& x, ComputationGraph& cg) i_h_tm1 = h[t-1][i]; } // h3 = hbias + h2h * h_{t-1} + x2h * in - Expression i_h3 = vars[2] + vars[0] * in + vars[1] * i_h_tm1; + i_h3 = vars[2] + vars[0] * in + vars[1] * i_h_tm1; //i_h3 = cg->add_function({vars[2], vars[0], in, vars[1], i_h_tm1}); } else { //i_h3 = cg->add_function({vars[2], vars[0], in}); - Expression i_h3 = vars[2] + vars[0] * in ; + i_h3 = vars[2] + vars[0] * in ; } //in = ht[i] = cg->add_function({i_h3}); in = ht[i] = tanh(i_h3); diff --git a/cnn/tensor.h b/cnn/tensor.h index 4411e71b1..165915602 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -14,7 +14,9 @@ #endif #include // CNN manages its own memory. DO NOT remove the following line -#define EIGEN_NO_MALLOC + +// Following line is commented out because it causes errors +//#define EIGEN_NO_MALLOC #include namespace cnn { From 4cfe400e8fba586fe4c7a347c6bf62ad1d84fe73 Mon Sep 17 00:00:00 2001 From: Antonis Anastasopoulos Date: Tue, 9 Jun 2015 14:04:19 -0400 Subject: [PATCH 070/965] Runs but eigen error with large dims --- cnn/rnn-expr.cc | 87 ------------------------------------------------- 1 file changed, 87 deletions(-) delete mode 100644 cnn/rnn-expr.cc diff --git a/cnn/rnn-expr.cc b/cnn/rnn-expr.cc deleted file mode 100644 index f5b3d17f6..000000000 --- a/cnn/rnn-expr.cc +++ /dev/null @@ -1,87 +0,0 @@ -#include "cnn/rnn.h" - -#include -#include -#include -#include - -#include "cnn/nodes.h" - -using namespace std; -using namespace cnn::expr; -using namespace cnn; - -namespace cnn { - -RNNBuilder::~RNNBuilder() {} - -SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, - unsigned input_dim, - unsigned hidden_dim, - Model* model) : layers(layers) { - unsigned layer_input_dim = input_dim; - for (unsigned i = 0; i < layers; ++i) { - Parameters* p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2h = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_hb = model->add_parameters({hidden_dim}); - vector ps = {p_x2h, p_h2h, p_hb}; - params.push_back(ps); - layer_input_dim = hidden_dim; - } -} - -void SimpleRNNBuilder::new_graph_impl(ComputationGraph& cg) { - param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - Parameters* p_x2h = params[i][0]; - Parameters* p_h2h = params[i][1]; - Parameters* p_hb = params[i][2]; - Expression i_x2h = parameter(cg,p_x2h); - Expression i_h2h = parameter(cg,p_h2h); - Expression i_hb = parameter(cg,p_hb); - - //VariableIndex i_x2h = cg->add_parameters(p_x2h); - //VariableIndex i_h2h = cg->add_parameters(p_h2h); - //VariableIndex i_hb = cg->add_parameters(p_hb); - //vector vars = {i_x2h, i_h2h, i_hb}; - vector vars = {i_x2h, i_h2h, i_hb}; - param_vars.push_back(vars); - } -} - -void SimpleRNNBuilder::start_new_sequence_impl(const vector& h_0) { - h.clear(); - h0 = h_0; - if (h0.size()) { assert(h0.size() == layers); } -} - -Expression SimpleRNNBuilder::add_input_impl(Expression& x, ComputationGraph& cg) { - const unsigned t = h.size(); - h.push_back(vector(layers)); - vector& ht = h.back(); - Expression in = x; - for (unsigned i = 0; i < layers; ++i) { - const vector& vars = param_vars[i]; - Expression i_h3; - bool have_prev = (t > 0 || h0.size() > 0); - if (have_prev) { - Expression i_h_tm1; - if (t == 0) { - if (h0.size()) i_h_tm1 = h0[i]; // first time step - } else { // tth time step - i_h_tm1 = h[t-1][i]; - } - // h3 = hbias + h2h * h_{t-1} + x2h * in - i_h3 = vars[2] + vars[0] * in + vars[1] * i_h_tm1; - //i_h3 = cg->add_function({vars[2], vars[0], in, vars[1], i_h_tm1}); - } else { - //i_h3 = cg->add_function({vars[2], vars[0], in}); - i_h3 = vars[2] + vars[0] * in ; - } - //in = ht[i] = cg->add_function({i_h3}); - in = ht[i] = tanh(i_h3); - } - return ht.back(); -} - -} // namespace cnn From 41889d518a4e119d30c0ef664c199f88d7989f2c Mon Sep 17 00:00:00 2001 From: davidweichiang Date: Tue, 9 Jun 2015 14:37:42 -0400 Subject: [PATCH 071/965] check for memory allocation failure --- cnn/exec.cc | 4 ++++ cnn/init.cc | 4 ++-- cnn/nodes.cc | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cnn/exec.cc b/cnn/exec.cc index 877174f15..66675e518 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -35,6 +35,10 @@ const Tensor& SimpleExecutionEngine::incremental_forward() { } nfxs[last_node_evaluated].d = node->dim; nfxs[last_node_evaluated].v = static_cast(fxs->allocate(node->dim.size() * sizeof(float))); + if (nfxs[last_node_evaluated].v == nullptr) { + cerr << "out of memory\n"; + abort(); + } node->forward(xs, nfxs[last_node_evaluated]); } return nfxs.back(); diff --git a/cnn/init.cc b/cnn/init.cc index 58ad65cb4..5bb1c7acb 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -36,8 +36,8 @@ void Initialize(int& argc, char**& argv) { // rndeng = new mt19937(1); rndeng = new mt19937(rd()); cerr << "Allocating memory...\n"; - fxs = new AlignedMemoryPool(100000000); - dEdfs = new AlignedMemoryPool(100000000); + fxs = new AlignedMemoryPool(512*(1<<20)); + dEdfs = new AlignedMemoryPool(512*(1<<20)); cerr << "Done.\n"; } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 205ebbdbb..dc52f441a 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -633,7 +633,7 @@ void MatrixMultiply::forward(const vector& xs, Tensor& fx) const #else auto x1 = **xs[0]; auto x2 = **xs[1]; - (*fx).noalias() = x1 * x2; + *fx = x1 * x2; #endif } From 93a1e71e833fd11e12e657549bb5c96be8e4d1cb Mon Sep 17 00:00:00 2001 From: davidweichiang Date: Tue, 9 Jun 2015 14:49:37 -0400 Subject: [PATCH 072/965] check for memory allocation --- cnn/exec.cc | 5 ++++- cnn/init.cc | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cnn/exec.cc b/cnn/exec.cc index 4eec90bfd..66675e518 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -35,7 +35,10 @@ const Tensor& SimpleExecutionEngine::incremental_forward() { } nfxs[last_node_evaluated].d = node->dim; nfxs[last_node_evaluated].v = static_cast(fxs->allocate(node->dim.size() * sizeof(float))); - //cerr << "CALLING: " << node->as_string(dummy) << endl; + if (nfxs[last_node_evaluated].v == nullptr) { + cerr << "out of memory\n"; + abort(); + } node->forward(xs, nfxs[last_node_evaluated]); } return nfxs.back(); diff --git a/cnn/init.cc b/cnn/init.cc index 58ad65cb4..5bb1c7acb 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -36,8 +36,8 @@ void Initialize(int& argc, char**& argv) { // rndeng = new mt19937(1); rndeng = new mt19937(rd()); cerr << "Allocating memory...\n"; - fxs = new AlignedMemoryPool(100000000); - dEdfs = new AlignedMemoryPool(100000000); + fxs = new AlignedMemoryPool(512*(1<<20)); + dEdfs = new AlignedMemoryPool(512*(1<<20)); cerr << "Done.\n"; } From b18834e39e3809eeb407463af8484393a46e330a Mon Sep 17 00:00:00 2001 From: Antonis Anastasopoulos Date: Tue, 9 Jun 2015 15:04:00 -0400 Subject: [PATCH 073/965] Cleaned encdec --- examples/encdec.cc | 253 ++++++++++++++++++++++++--------------------- 1 file changed, 138 insertions(+), 115 deletions(-) diff --git a/examples/encdec.cc b/examples/encdec.cc index 94097ac75..6b929e084 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -5,6 +5,7 @@ #include "cnn/rnn.h" #include "cnn/lstm.h" #include "cnn/dict.h" +#include "cnn/expr.h" #include #include @@ -15,14 +16,16 @@ using namespace std; using namespace cnn; +using namespace cnn::expr; -unsigned LAYERS = 4; +//parameters +unsigned LAYERS = 3; unsigned INPUT_DIM = 500; unsigned HIDDEN_DIM = 500; unsigned INPUT_VOCAB_SIZE = 0; unsigned OUTPUT_VOCAB_SIZE = 0; -cnn::Dict d; +cnn::Dict d, devd; int kSOS; int kEOS; @@ -43,6 +46,8 @@ struct EncoderDecoder { dec_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), rev_enc_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), fwd_enc_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + + p_ie2h = model.add_parameters({long(HIDDEN_DIM * LAYERS * 1.5), long(HIDDEN_DIM * LAYERS * 2)}); p_bie = model.add_parameters({long(HIDDEN_DIM * LAYERS * 1.5)}); p_h2oe = model.add_parameters({long(HIDDEN_DIM * LAYERS), long(HIDDEN_DIM * LAYERS * 1.5)}); @@ -54,141 +59,148 @@ struct EncoderDecoder { } // build graph and return VariableIndex of total loss - VariableIndex BuildGraph(const vector& insent, const vector& osent, ComputationGraph& cg) { + Expression BuildGraph(const vector& insent, const vector& osent, ComputationGraph& cg) { // forward encoder - fwd_enc_builder.new_graph(&cg); + fwd_enc_builder.new_graph(cg); fwd_enc_builder.start_new_sequence(); for (unsigned t = 0; t < insent.size(); ++t) { - VariableIndex i_x_t = cg.add_lookup(p_ec, insent[t]); - fwd_enc_builder.add_input(i_x_t, &cg); + Expression i_x_t = lookup(cg,p_ec,insent[t]); + fwd_enc_builder.add_input(i_x_t, cg); } // backward encoder - rev_enc_builder.new_graph(&cg); + rev_enc_builder.new_graph(cg); rev_enc_builder.start_new_sequence(); for (int t = insent.size() - 1; t >= 0; --t) { - VariableIndex i_x_t = cg.add_lookup(p_ec, insent[t]); - rev_enc_builder.add_input(i_x_t, &cg); + Expression i_x_t = lookup(cg, p_ec, insent[t]); + rev_enc_builder.add_input(i_x_t, cg); } - + // encoder -> decoder transformation - vector to(LAYERS * 2); - int c = 0; - for (auto h_l : fwd_enc_builder.final_h()) to[c++] = h_l; - for (auto h_l : rev_enc_builder.final_h()) to[c++] = h_l; - assert(c == LAYERS * 2); - VariableIndex i_combined = cg.add_function(to); - VariableIndex i_ie2h = cg.add_parameters(p_ie2h); - VariableIndex i_bie = cg.add_parameters(p_bie); - VariableIndex i_t = cg.add_function({i_bie, i_ie2h, i_combined}); - cg.incremental_forward(); - VariableIndex i_h = cg.add_function({i_t}); - VariableIndex i_h2oe = cg.add_parameters(p_h2oe); - VariableIndex i_boe = cg.add_parameters(p_boe); - VariableIndex i_nc = cg.add_function({i_boe, i_h2oe, i_h}); - vector oein(LAYERS * 2); - for (int i = 0; i < LAYERS; ++i) { - oein[i] = cg.add_function({i_nc}, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM); - oein[i + LAYERS] = cg.add_function({oein[i]}); + vector to; + for (auto h_l : fwd_enc_builder.final_h()) to.push_back(h_l); + for (auto h_l : rev_enc_builder.final_h()) to.push_back(h_l); + + Expression i_combined = concatenate(to); + Expression i_ie2h = parameter(cg, p_ie2h); + Expression i_bie = parameter(cg, p_bie); + Expression i_t = i_bie + i_ie2h * i_combined; + cg.incremental_forward(); + Expression i_h = rectify(i_t); + Expression i_h2oe = parameter(cg,p_h2oe); + Expression i_boe = parameter(cg,p_boe); + Expression i_nc = i_boe + i_h2oe * i_h; + + vector oein1, oein2, oein; + for (int i = 0; i < LAYERS; ++i) { + oein1.push_back(pickrange(i_nc, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM)); + oein2.push_back(tanh(oein1[i])); } - dec_builder.new_graph(&cg); + for (int i = 0; i < LAYERS; ++i) oein.push_back(oein1[i]); + for (int i = 0; i < LAYERS; ++i) oein.push_back(oein2[i]); + + dec_builder.new_graph(cg); dec_builder.start_new_sequence(oein); + // decoder - VariableIndex i_R = cg.add_parameters(p_R); - VariableIndex i_bias = cg.add_parameters(p_bias); - vector errs; + Expression i_R = parameter(cg,p_R); + Expression i_bias = parameter(cg,p_bias); + vector errs; + const unsigned oslen = osent.size() - 1; for (unsigned t = 0; t < oslen; ++t) { - VariableIndex i_x_t = cg.add_lookup(p_c, osent[t]); - VariableIndex i_y_t = dec_builder.add_input(i_x_t, &cg); - VariableIndex i_r_t = cg.add_function({i_bias, i_R, i_y_t}); - VariableIndex i_ydist = cg.add_function({i_r_t}); - errs.push_back(cg.add_function({i_ydist}, osent[t+1])); + Expression i_x_t = lookup(cg, p_c, osent[t]); + Expression i_y_t = dec_builder.add_input(i_x_t, cg); + Expression i_r_t = i_bias + i_R * i_y_t; + Expression i_ydist = log_softmax(i_r_t); + errs.push_back(pick(i_ydist,osent[t+1])); } - VariableIndex i_nerr = cg.add_function(errs); - return cg.add_function({i_nerr}); + Expression i_nerr = sum(errs); + return -i_nerr; } + + }; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); - if (argc != 3 && argc != 4) { - cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; - return 1; - } - kSOS = d.Convert(""); - kEOS = d.Convert(""); - vector> training, dev; - string line; - int tlc = 0; - int ttoks = 0; - cerr << "Reading training data from " << argv[1] << "...\n"; - { - ifstream in(argv[1]); - assert(in); - while(getline(in, line)) { - ++tlc; - training.push_back(ReadSentence(line, &d)); - ttoks += training.back().size(); - if (training.back().front() != kSOS && training.back().back() != kEOS) { - cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; - } - //d.Freeze(); // no new word types allowed - //INPUT_VOCAB_SIZE = d.size(); - //OUTPUT_VOCAB_SIZE = d.size(); - - int dlc = 0; - int dtoks = 0; - cerr << "Reading dev data from " << argv[2] << "...\n"; - { - ifstream in(argv[2]); - assert(in); - while(getline(in, line)) { - ++dlc; - dev.push_back(ReadSentence(line, &d)); - dtoks += dev.back().size(); - if (dev.back().front() != kSOS && dev.back().back() != kEOS) { - cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << dlc << " lines, " << dtoks << " tokens\n"; - } - d.Freeze(); - INPUT_VOCAB_SIZE = d.size(); - OUTPUT_VOCAB_SIZE = d.size(); + cnn::Initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.Convert(""); + kEOS = d.Convert(""); + vector> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + training.push_back(ReadSentence(line, &d)); + ttoks += training.back().size(); + if (training.back().front() != kSOS && training.back().back() != kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + d.Freeze(); // no new word types allowed + INPUT_VOCAB_SIZE = d.size(); + OUTPUT_VOCAB_SIZE = d.size(); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + ++dlc; + dev.push_back(ReadSentence(line, &devd)); + dtoks += dev.back().size(); + if (dev.back().front() != kSOS && dev.back().back() != kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + ostringstream os; - os << "bilm" - << '_' << LAYERS - << '_' << INPUT_DIM - << '_' << HIDDEN_DIM - << "-pid" << getpid() << ".params"; - const string fname = os.str(); - cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; - - Model model; - bool use_momentum = false; - Trainer* sgd = nullptr; - if (use_momentum) - sgd = new MomentumSGDTrainer(&model); - else - sgd = new SimpleSGDTrainer(&model); - - //RNNBuilder rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, &model); + os << "bilm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + bool use_momentum = false; + Trainer* sgd = nullptr; + if (use_momentum) + sgd = new MomentumSGDTrainer(&model); + else + sgd = new SimpleSGDTrainer(&model); + + + //RNNBuilder rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, &model); + //EncoderDecoder lm(model); EncoderDecoder lm(model); - if (argc == 4) { - string fname = argv[3]; - ifstream in(fname); - boost::archive::text_iarchive ia(in); - ia >> model; - } + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } - unsigned report_every_i = 50; + unsigned report_every_i = 50; unsigned dev_every_i_reports = 10; unsigned si = training.size(); vector order(training.size()); @@ -214,9 +226,14 @@ int main(int argc, char** argv) { chars += sent.size() - 1; ++si; lm.BuildGraph(sent, sent, cg); + //cg.PrintGraphviz(); + //cerr << "Built graph" << endl; loss += as_scalar(cg.forward()); + //cerr << "Did forward" << endl; cg.backward(); + //cerr << "Did backward" << endl; sgd->update(); + //cerr << "Updated model" << endl; ++lines; } sgd->status(); @@ -247,5 +264,11 @@ int main(int argc, char** argv) { } } delete sgd; -} + + + + + + + } From 1357a44e3cd4361293f387402a3aaa6de586067a Mon Sep 17 00:00:00 2001 From: Antonis Anastasopoulos Date: Tue, 9 Jun 2015 15:49:17 -0400 Subject: [PATCH 074/965] Changed rnnlm example --- CMakeLists.txt | 1 - cnn/expr.cc | 21 +++------------ cnn/expr.h | 8 +++--- examples/CMakeLists.txt | 3 +-- examples/rnnlm.cc | 60 +++++++++++++++++++++-------------------- 5 files changed, 40 insertions(+), 53 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ef56e011..ba3289408 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,4 +69,3 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory(cnn) add_subdirectory(examples) -#add_subdirectory(postedit) diff --git a/cnn/expr.cc b/cnn/expr.cc index 1fea61233..30378f8fb 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -16,29 +16,14 @@ Expression operator-(const Expression& x, real y) { return Expression(x.pg, x.pg Expression operator*(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression tanh(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression log(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression logistic(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression rectify(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} -Expression concatenate(const std::vector& x) { - std::vector tmp(x.size()); - for(unsigned j = 0; j < x.size(); ++j){ - tmp[j] = x[j].i; - } - //ComputationGraph *tpg = x[0].pg; - return Expression(x[0].pg, x[0].pg->add_function(tmp)); -} -Expression sum(const std::vector& x) { - std::vector tmp(x.size()); - for(unsigned j = 0; j < x.size(); ++j){ - tmp[j] = x[j].i; - } - //tpg = x[0].pg; - return Expression(x[0].pg, x[0].pg->add_function(tmp)); -} - Expression squaredDistance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression binary_log_loss(const Expression& x, real ty) { return Expression(x.pg, x.pg->add_function({x.i}, &ty)); } Expression binary_log_loss(const Expression& x, real* pty) { return Expression(x.pg, x.pg->add_function({x.i}, pty)); } @@ -48,6 +33,8 @@ Expression pick(const Expression& x, unsigned v) { return Expression(x.pg, x.pg- Expression pick(const Expression& x, unsigned* pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } Expression pickrange(const Expression& x, unsigned v, unsigned u) { return Expression(x.pg, x.pg->add_function({x.i}, v, u)); } +Expression pickneglogsoftmax(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } + Expression sum_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression kmh_ngram(const Expression& x, unsigned n) { return Expression(x.pg, x.pg->add_function({x.i}, n)); } diff --git a/cnn/expr.h b/cnn/expr.h index 47f958e72..451104886 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -30,16 +30,14 @@ Expression operator*(const Expression& x, const Expression& y); //Expression cwiseMultiply(const Expression& x, const Expression& y); Expression tanh(const Expression& x); +Expression log(const Expression& x); Expression logistic(const Expression& x); Expression rectify(const Expression& x); Expression log_softmax(const Expression& x); +Expression softmax(const Expression& x); Expression cwise_multiply(const Expression& x, const Expression& y); -Expression concatenate(const std::vector& x); -Expression sum(const std::vector& x); - - Expression squaredDistance(const Expression& x, const Expression& y); Expression binary_log_loss(const Expression& x, real ty); Expression binary_log_loss(const Expression& x, real* pty); @@ -49,6 +47,8 @@ Expression pick(const Expression& x, unsigned v); Expression pick(const Expression& x, unsigned* pv); Expression pickrange(const Expression& x, unsigned v, unsigned u); +Expression pickneglogsoftmax(const Expression& x, unsigned v); + template Expression sum(const T& xs) { ComputationGraph *pg = xs.begin()->pg; diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 373782b19..cbb01c3b3 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,7 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -#foreach(TARGET embed-cl encdec encdec-expr xor xor-xent rnnlm nlm) -foreach(TARGET encdec-expr) +foreach(TARGET embed-cl encdec xor xor-xent rnnlm nlm) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index c77f4f869..4751793d3 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -6,6 +6,7 @@ #include "cnn/gru.h" #include "cnn/lstm.h" #include "cnn/dict.h" +# include "cnn/expr.h" #include #include @@ -38,40 +39,40 @@ struct RNNLanguageModel { p_bias = model.add_parameters({VOCAB_SIZE}); } - // return VariableIndex of total loss - VariableIndex BuildLMGraph(const vector& sent, ComputationGraph& cg) { + // return Expression of total loss + Expression BuildLMGraph(const vector& sent, ComputationGraph& cg) { const unsigned slen = sent.size() - 1; - builder.new_graph(&cg); // reset RNN builder for new graph + builder.new_graph(cg); // reset RNN builder for new graph builder.start_new_sequence(); - VariableIndex i_R = cg.add_parameters(p_R); // hidden -> word rep parameter - VariableIndex i_bias = cg.add_parameters(p_bias); // word bias - vector errs; + Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter + Expression i_bias = parameter(cg, p_bias); // word bias + vector errs; for (unsigned t = 0; t < slen; ++t) { // x_t = lookup sent[t] in parameters p_c - VariableIndex i_x_t = cg.add_lookup(p_c, sent[t]); + Expression i_x_t = lookup(cg, p_c, sent[t]); // y_t = RNN(x_t) - VariableIndex i_y_t = builder.add_input(i_x_t, &cg); - // r_t = bias + R * y_t - VariableIndex i_r_t = cg.add_function({i_bias, i_R, i_y_t}); + Expression i_y_t = builder.add_input(i_x_t, cg); + Expression i_r_t = i_bias + i_R * i_y_t; + // ydist = softmax(r_t) // LogSoftmax followed by PickElement can be written in one step // using PickNegLogSoftmax #if 0 - VariableIndex i_ydist = cg.add_function({i_r_t}); - errs.push_back(cg.add_function({i_ydist}, sent[t+1])); + Expression i_ydist = logsoftmax(i_r_t); + errs.push_back(pick(i_ydist, sent[t+1])); #if 0 - VariableIndex i_ydist = cg.add_function({i_r_t}); - i_ydist = cg.add_function({i_ydist}); - errs.push_back(cg.add_function({i_ydist}, sent[t+1])); + Expression i_ydist = softmax(i_r_t); + i_ydist = log(i_ydist) + errs.push_back(pick(i_ydist, sent[t+1])); #endif #else - VariableIndex i_err = cg.add_function({i_r_t}, sent[t+1]); + Expression i_err = pickneglogsoftmax(i_r_t, sent[t+1]); errs.push_back(i_err); #endif } - VariableIndex i_nerr = cg.add_function(errs); + Expression i_nerr = sum(errs); #if 0 - return cg.add_function({i_nerr}); + return -i_nerr; #else return i_nerr; #endif @@ -81,23 +82,24 @@ struct RNNLanguageModel { void RandomSample(int max_len = 150) { cerr << endl; ComputationGraph cg; - builder.new_graph(&cg); // reset RNN builder for new graph + builder.new_graph(cg); // reset RNN builder for new graph builder.start_new_sequence(); - VariableIndex i_R = cg.add_parameters(p_R); // hidden -> word rep parameter - VariableIndex i_bias = cg.add_parameters(p_bias); // word bias - vector errs; + + Expression i_R = parameter(cg, p_R); + Expression i_bias = parameter(cg, p_bias); + vector errs; int len = 0; int cur = kSOS; while(len < max_len && cur != kEOS) { ++len; - // x_t = lookup sent[t] in parameters p_c - VariableIndex i_x_t = cg.add_lookup(p_c, cur); + Expression i_x_t = lookup(cg, p_c, cur); // y_t = RNN(x_t) - VariableIndex i_y_t = builder.add_input(i_x_t, &cg); + Expression i_y_t = builder.add_input(i_x_t, cg); // r_t = bias + R * y_t - VariableIndex i_r_t = cg.add_function({i_bias, i_R, i_y_t}); - // ydist = softmax(r_t) - cg.add_function({i_r_t}); + Expression i_r_t = i_bias + i_R * i_y_t; + + Expression ydist = softmax(i_r_t); + unsigned w = 0; while (w == 0 || (int)w == kSOS) { auto dist = as_vector(cg.incremental_forward()); @@ -178,7 +180,7 @@ int main(int argc, char** argv) { //if (use_momentum) // sgd = new MomentumSGDTrainer(&model); //else - sgd = new SimpleSGDTrainer(&model); + sgd = new SimpleSGDTrainer(&model); RNNLanguageModel lm(model); //RNNLanguageModel lm(model); From 2239763b01e1f062de839d2372a3a601eb374b14 Mon Sep 17 00:00:00 2001 From: davidweichiang Date: Tue, 9 Jun 2015 15:50:37 -0400 Subject: [PATCH 075/965] more cleanup in encdec --- cnn/lstm.cc | 57 -------- cnn/rnn.cc | 10 +- examples/encdec-expr.cc | 317 ---------------------------------------- examples/encdec.cc | 224 +++++++++++++--------------- 4 files changed, 106 insertions(+), 502 deletions(-) delete mode 100644 examples/encdec-expr.cc diff --git a/cnn/lstm.cc b/cnn/lstm.cc index a198fc923..703158a97 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -71,34 +71,6 @@ void LSTMBuilder::new_graph_impl(ComputationGraph& cg){ } } -/*void LSTMBuilder::new_graph_impl(ComputationGraph* cg) { - param_vars.clear(); - - for (unsigned i = 0; i < layers; ++i) { - auto& p = params[i]; - - // i - VariableIndex i_x2i = cg->add_parameters(p[X2I]); - VariableIndex i_h2i = cg->add_parameters(p[H2I]); - VariableIndex i_c2i = cg->add_parameters(p[C2I]); - VariableIndex i_bi = cg->add_parameters(p[BI]); - - // o - VariableIndex i_x2o = cg->add_parameters(p[X2O]); - VariableIndex i_h2o = cg->add_parameters(p[H2O]); - VariableIndex i_c2o = cg->add_parameters(p[C2O]); - VariableIndex i_bo = cg->add_parameters(p[BO]); - - // c - VariableIndex i_x2c = cg->add_parameters(p[X2C]); - VariableIndex i_h2c = cg->add_parameters(p[H2C]); - VariableIndex i_bc = cg->add_parameters(p[BC]); - - vector vars = {i_x2i, i_h2i, i_c2i, i_bi, i_x2o, i_h2o, i_c2o, i_bo, i_x2c, i_h2c, i_bc}; - param_vars.push_back(vars); - } -}*/ - // layout: 0..layers = c // layers+1..2*layers = h void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { @@ -118,23 +90,15 @@ void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { } } -//VariableIndex LSTMBuilder::add_input_impl(VariableIndex x, ComputationGraph* cg) { Expression LSTMBuilder::add_input_impl(Expression& x, ComputationGraph& cg) { const unsigned t = h.size(); - //h.push_back(vector(layers)); - //c.push_back(vector(layers)); h.push_back(vector(layers)); c.push_back(vector(layers)); - //vector& ht = h.back(); - //vector& ct = c.back(); vector& ht = h.back(); vector& ct = c.back(); Expression in = x; - //VariableIndex in = x; for (unsigned i = 0; i < layers; ++i) { const vector& vars = param_vars[i]; - //VariableIndex i_h_tm1; - //VariableIndex i_c_tm1; Expression i_h_tm1, i_c_tm1; bool has_prev_state = (t > 0 || has_initial_state); if (t == 0) { @@ -151,57 +115,36 @@ Expression LSTMBuilder::add_input_impl(Expression& x, ComputationGraph& cg) { // input Expression i_ait; if (has_prev_state) - // COmbine VariableIndex with Expressions??? i_ait = vars[BI] + vars[X2I] * in + vars[H2I]*i_h_tm1 + vars[C2I] * i_c_tm1; - //i_ait = cg->add_function({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1, vars[C2I], i_c_tm1}); else i_ait = vars[BI] + vars[X2I] * in; - //i_ait = cg->add_function({vars[BI], vars[X2I], in}); Expression i_it = logistic(i_ait); - //VariableIndex i_it = cg->add_function({i_ait}); // forget Expression i_ft = i_it - 1.f; - //VariableIndex i_ft = cg->add_function({i_it}, 1.f); // write memory cell - //VariableIndex i_awt; Expression i_awt; if (has_prev_state) i_awt = vars[BC] + vars[X2C] * in + vars[H2C]*i_h_tm1; - //i_awt = cg->add_function({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); else i_awt = vars[BC] + vars[X2C] * in; - //i_awt = cg->add_function({vars[BC], vars[X2C], in}); Expression i_wt = tanh(i_awt); - //VariableIndex i_wt = cg->add_function({i_awt}); // output if (has_prev_state) { - //VariableIndex i_nwt = cg->add_function({i_it, i_wt}); Expression i_nwt = cwise_multiply(i_it,i_wt); - //VariableIndex i_crt = cg->add_function({i_ft, i_c_tm1}); Expression i_crt = cwise_multiply(i_ft,i_c_tm1); - //ct[i] = cg->add_function({i_crt, i_nwt}); // new memory cell at time t ct[i] = i_crt + i_nwt; } else { - //ct[i] = cg->add_function({i_it, i_wt}); ct[i] = cwise_multiply(i_it,i_wt); } - //VariableIndex i_aot; Expression i_aot; if (has_prev_state) i_aot = vars[BO] + vars[X2O] * in + vars[H2O] * i_h_tm1 + vars[C2O] * ct[i]; - //i_aot = cg->add_function({vars[BO], vars[X2O], in, vars[H2O], i_h_tm1, vars[C2O], ct[i]}); else i_aot = vars[BO] + vars[X2O] * in; - //i_aot = cg->add_function({vars[BO], vars[X2O], in}); Expression i_ot = logistic(i_aot); Expression ph_t = tanh(ct[i]); in = ht[i] = cwise_multiply(i_ot,ph_t); - - - //VariableIndex i_ot = cg->add_function({i_aot}); - //VariableIndex ph_t = cg->add_function({ct[i]}); - //in = ht[i] = cg->add_function({i_ot, ph_t}); } return ht.back(); } diff --git a/cnn/rnn.cc b/cnn/rnn.cc index f5b3d17f6..8ceec4f59 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -40,10 +40,6 @@ void SimpleRNNBuilder::new_graph_impl(ComputationGraph& cg) { Expression i_h2h = parameter(cg,p_h2h); Expression i_hb = parameter(cg,p_hb); - //VariableIndex i_x2h = cg->add_parameters(p_x2h); - //VariableIndex i_h2h = cg->add_parameters(p_h2h); - //VariableIndex i_hb = cg->add_parameters(p_hb); - //vector vars = {i_x2h, i_h2h, i_hb}; vector vars = {i_x2h, i_h2h, i_hb}; param_vars.push_back(vars); } @@ -71,14 +67,10 @@ Expression SimpleRNNBuilder::add_input_impl(Expression& x, ComputationGraph& cg) } else { // tth time step i_h_tm1 = h[t-1][i]; } - // h3 = hbias + h2h * h_{t-1} + x2h * in i_h3 = vars[2] + vars[0] * in + vars[1] * i_h_tm1; - //i_h3 = cg->add_function({vars[2], vars[0], in, vars[1], i_h_tm1}); } else { - //i_h3 = cg->add_function({vars[2], vars[0], in}); - i_h3 = vars[2] + vars[0] * in ; + i_h3 = vars[2] + vars[0] * in; } - //in = ht[i] = cg->add_function({i_h3}); in = ht[i] = tanh(i_h3); } return ht.back(); diff --git a/examples/encdec-expr.cc b/examples/encdec-expr.cc deleted file mode 100644 index 6d7cef18d..000000000 --- a/examples/encdec-expr.cc +++ /dev/null @@ -1,317 +0,0 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -#include "cnn/expr.h" - -#include -#include -#include - -#include -#include - -using namespace std; -using namespace cnn; -using namespace cnn::expr; - -//parameters -unsigned LAYERS = 3; -unsigned INPUT_DIM = 500; -unsigned HIDDEN_DIM = 500; -unsigned INPUT_VOCAB_SIZE = 0; -unsigned OUTPUT_VOCAB_SIZE = 0; - -cnn::Dict d; -int kSOS; -int kEOS; - -template -struct EncoderDecoder { - LookupParameters* p_c; - LookupParameters* p_ec; // map input to embedding (used in fwd and rev models) - Parameters* p_ie2h; - Parameters* p_bie; - Parameters* p_h2oe; - Parameters* p_boe; - Parameters* p_R; - Parameters* p_bias; - Builder dec_builder; - Builder rev_enc_builder; - Builder fwd_enc_builder; - explicit EncoderDecoder(Model& model) : - dec_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), - rev_enc_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), - fwd_enc_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { - - - p_ie2h = model.add_parameters({long(HIDDEN_DIM * LAYERS * 1.5), long(HIDDEN_DIM * LAYERS * 2)}); - p_bie = model.add_parameters({long(HIDDEN_DIM * LAYERS * 1.5)}); - p_h2oe = model.add_parameters({long(HIDDEN_DIM * LAYERS), long(HIDDEN_DIM * LAYERS * 1.5)}); - p_boe = model.add_parameters({long(HIDDEN_DIM * LAYERS)}); - p_c = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {INPUT_DIM}); - p_ec = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {INPUT_DIM}); - p_R = model.add_parameters({OUTPUT_VOCAB_SIZE, HIDDEN_DIM}); - p_bias = model.add_parameters({OUTPUT_VOCAB_SIZE}); - } - - // build graph and return VariableIndex of total loss - Expression BuildGraph(const vector& insent, const vector& osent, ComputationGraph& cg) { - // forward encoder - fwd_enc_builder.new_graph(cg); - fwd_enc_builder.start_new_sequence(); - for (unsigned t = 0; t < insent.size(); ++t) { - //VariableIndex i_x_t = cg.add_lookup(p_ec, insent[t]); - Expression i_x_t = lookup(cg,p_ec,insent[t]); - fwd_enc_builder.add_input(i_x_t, cg); - - - } - // backward encoder - rev_enc_builder.new_graph(cg); - rev_enc_builder.start_new_sequence(); - for (int t = insent.size() - 1; t >= 0; --t) { - //VariableIndex i_x_t = cg.add_lookup(p_ec, insent[t]); - Expression i_x_t = lookup(cg, p_ec, insent[t]); - rev_enc_builder.add_input(i_x_t, cg); - } - - // encoder -> decoder transformation - //vector to(LAYERS * 2); - //vector to(LAYERS * 2); - vector to; - //int c = 0; - //for (auto h_l : fwd_enc_builder.final_h()) to[c++] = h_l; - for (auto h_l : fwd_enc_builder.final_h()) to.push_back(h_l); - //for (auto h_l : rev_enc_builder.final_h()) to[c++] = h_l; - for (auto h_l : rev_enc_builder.final_h()) to.push_back(h_l); - //assert(c == LAYERS * 2); - Expression i_combined = concatenate(to); - Expression i_ie2h = parameter(cg, p_ie2h); - Expression i_bie = parameter(cg, p_bie); - Expression i_t = i_bie + i_ie2h * i_combined; - cg.incremental_forward(); - Expression i_h = rectify(i_t); - Expression i_h2oe = parameter(cg,p_h2oe); - Expression i_boe = parameter(cg,p_boe); - Expression i_nc = i_boe + i_h2oe * i_h; - - //vector oein(LAYERS * 2); - vector oein1, oein2, oein; - for (int i = 0; i < LAYERS; ++i) { - //oein[i] = pickrange(i_nc, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM); - //oein[i + LAYERS] = tanh(oein[i]); - oein1.push_back(pickrange(i_nc, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM)); - oein2.push_back(tanh(oein1[i])); - } - for (int i = 0; i < LAYERS; ++i) oein.push_back(oein1[i]); - for (int i = 0; i < LAYERS; ++i) oein.push_back(oein2[i]); - - dec_builder.new_graph(cg); - dec_builder.start_new_sequence(oein); - - - /* - VariableIndex i_combined = cg.add_function(to); - VariableIndex i_ie2h = cg.add_parameters(p_ie2h); - VariableIndex i_bie = cg.add_parameters(p_bie); - VariableIndex i_t = cg.add_function({i_bie, i_ie2h, i_combined}); - cg.incremental_forward(); - VariableIndex i_h = cg.add_function({i_t}); - VariableIndex i_h2oe = cg.add_parameters(p_h2oe); - VariableIndex i_boe = cg.add_parameters(p_boe); - VariableIndex i_nc = cg.add_function({i_boe, i_h2oe, i_h}); - vector oein(LAYERS * 2); - for (int i = 0; i < LAYERS; ++i) { - oein[i] = cg.add_function({i_nc}, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM); - oein[i + LAYERS] = cg.add_function({oein[i]}); - } - dec_builder.new_graph(&cg); - dec_builder.start_new_sequence(oein); - */ - - // decoder - //VariableIndex i_R = cg.add_parameters(p_R); - //VariableIndex i_bias = cg.add_parameters(p_bias); - Expression i_R = parameter(cg,p_R); - Expression i_bias = parameter(cg,p_bias); - //vector errs; - vector errs; - - const unsigned oslen = osent.size() - 1; - for (unsigned t = 0; t < oslen; ++t) { - Expression i_x_t = lookup(cg, p_c, osent[t]); - Expression i_y_t = dec_builder.add_input(i_x_t, cg); - Expression i_r_t = i_bias + i_R * i_y_t; - Expression i_ydist = log_softmax(i_r_t); - errs.push_back(pick(i_ydist,osent[t+1])); - //VariableIndex i_x_t = cg.add_lookup(p_c, osent[t]); - //VariableIndex i_y_t = dec_builder.add_input(i_x_t, &cg); - //VariableIndex i_r_t = cg.add_function({i_bias, i_R, i_y_t}); - //VariableIndex i_ydist = cg.add_function({i_r_t}); - //errs.push_back(cg.add_function({i_ydist}, osent[t+1])); - } - Expression i_nerr = sum(errs); - return -i_nerr; - //VariableIndex i_nerr = cg.add_function(errs); - //return cg.add_function({i_nerr}); - } - - -}; - -int main(int argc, char** argv) { - cnn::Initialize(argc, argv); - if (argc != 3 && argc != 4) { - cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; - return 1; - } - kSOS = d.Convert(""); - kEOS = d.Convert(""); - vector> training, dev; - string line; - int tlc = 0; - int ttoks = 0; - cerr << "Reading training data from " << argv[1] << "...\n"; - { - ifstream in(argv[1]); - assert(in); - while(getline(in, line)) { - ++tlc; - training.push_back(ReadSentence(line, &d)); - ttoks += training.back().size(); - if (training.back().front() != kSOS && training.back().back() != kEOS) { - cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; - } - //d.Freeze(); // no new word types allowed - //INPUT_VOCAB_SIZE = d.size(); - //OUTPUT_VOCAB_SIZE = d.size(); - - int dlc = 0; - int dtoks = 0; - cerr << "Reading dev data from " << argv[2] << "...\n"; - { - ifstream in(argv[2]); - assert(in); - while(getline(in, line)) { - ++dlc; - dev.push_back(ReadSentence(line, &d)); - dtoks += dev.back().size(); - if (dev.back().front() != kSOS && dev.back().back() != kEOS) { - cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << dlc << " lines, " << dtoks << " tokens\n"; - } - d.Freeze(); - INPUT_VOCAB_SIZE = d.size(); - OUTPUT_VOCAB_SIZE = d.size(); - ostringstream os; - os << "bilm" - << '_' << LAYERS - << '_' << INPUT_DIM - << '_' << HIDDEN_DIM - << "-pid" << getpid() << ".params"; - const string fname = os.str(); - cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; - - Model model; - bool use_momentum = false; - Trainer* sgd = nullptr; - if (use_momentum) - sgd = new MomentumSGDTrainer(&model); - else - sgd = new SimpleSGDTrainer(&model); - - - //RNNBuilder rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, &model); - //EncoderDecoder lm(model); - EncoderDecoder lm(model); - if (argc == 4) { - string fname = argv[3]; - ifstream in(fname); - boost::archive::text_iarchive ia(in); - ia >> model; - } - - unsigned report_every_i = 50; - unsigned dev_every_i_reports = 10; - unsigned si = training.size(); - vector order(training.size()); - for (unsigned i = 0; i < order.size(); ++i) order[i] = i; - bool first = true; - int report = 0; - unsigned lines = 0; - while(1) { - Timer iteration("completed in"); - double loss = 0; - unsigned chars = 0; - for (unsigned i = 0; i < report_every_i; ++i) { - if (si == training.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - random_shuffle(order.begin(), order.end()); - } - - // build graph for this instance - ComputationGraph cg; - auto& sent = training[order[si]]; - chars += sent.size() - 1; - ++si; - lm.BuildGraph(sent, sent, cg); - cg.PrintGraphviz(); - cerr << "Built graph" << endl; - loss += as_scalar(cg.forward()); - cerr << "Did forward" << endl; - cg.backward(); - cerr << "Did backward" << endl; - sgd->update(); - cerr << "Updated model" << endl; - ++lines; - } - sgd->status(); - cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; - -#if 0 - lm.RandomSample(); -#endif - - // show score on dev data? - report++; - if (report % dev_every_i_reports == 0) { - double dloss = 0; - int dchars = 0; - for (auto& sent : dev) { - ComputationGraph cg; - lm.BuildGraph(sent, sent, cg); - dloss += as_scalar(cg.forward()); - dchars += sent.size() - 1; - } - if (dloss < best) { - best = dloss; - ofstream out(fname); - boost::archive::text_oarchive oa(out); - oa << model; - } - cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; - } - } - delete sgd; - - - - - - - - } diff --git a/examples/encdec.cc b/examples/encdec.cc index 6b929e084..75ceaace5 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -58,7 +58,7 @@ struct EncoderDecoder { p_bias = model.add_parameters({OUTPUT_VOCAB_SIZE}); } - // build graph and return VariableIndex of total loss + // build graph and return Expression for total loss Expression BuildGraph(const vector& insent, const vector& osent, ComputationGraph& cg) { // forward encoder fwd_enc_builder.new_graph(cg); @@ -79,19 +79,19 @@ struct EncoderDecoder { vector to; for (auto h_l : fwd_enc_builder.final_h()) to.push_back(h_l); for (auto h_l : rev_enc_builder.final_h()) to.push_back(h_l); - - Expression i_combined = concatenate(to); - Expression i_ie2h = parameter(cg, p_ie2h); - Expression i_bie = parameter(cg, p_bie); - Expression i_t = i_bie + i_ie2h * i_combined; - cg.incremental_forward(); - Expression i_h = rectify(i_t); - Expression i_h2oe = parameter(cg,p_h2oe); - Expression i_boe = parameter(cg,p_boe); - Expression i_nc = i_boe + i_h2oe * i_h; - - vector oein1, oein2, oein; - for (int i = 0; i < LAYERS; ++i) { + + Expression i_combined = concatenate(to); + Expression i_ie2h = parameter(cg, p_ie2h); + Expression i_bie = parameter(cg, p_bie); + Expression i_t = i_bie + i_ie2h * i_combined; + cg.incremental_forward(); + Expression i_h = rectify(i_t); + Expression i_h2oe = parameter(cg,p_h2oe); + Expression i_boe = parameter(cg,p_boe); + Expression i_nc = i_boe + i_h2oe * i_h; + + vector oein1, oein2, oein; + for (int i = 0; i < LAYERS; ++i) { oein1.push_back(pickrange(i_nc, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM)); oein2.push_back(tanh(oein1[i])); } @@ -100,7 +100,6 @@ struct EncoderDecoder { dec_builder.new_graph(cg); dec_builder.start_new_sequence(oein); - // decoder Expression i_R = parameter(cg,p_R); @@ -118,89 +117,87 @@ struct EncoderDecoder { Expression i_nerr = sum(errs); return -i_nerr; } - - }; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); - if (argc != 3 && argc != 4) { - cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; - return 1; - } - kSOS = d.Convert(""); - kEOS = d.Convert(""); - vector> training, dev; - string line; - int tlc = 0; - int ttoks = 0; - cerr << "Reading training data from " << argv[1] << "...\n"; - { - ifstream in(argv[1]); - assert(in); - while(getline(in, line)) { - ++tlc; - training.push_back(ReadSentence(line, &d)); - ttoks += training.back().size(); - if (training.back().front() != kSOS && training.back().back() != kEOS) { - cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; - } - d.Freeze(); // no new word types allowed - INPUT_VOCAB_SIZE = d.size(); - OUTPUT_VOCAB_SIZE = d.size(); - - int dlc = 0; - int dtoks = 0; - cerr << "Reading dev data from " << argv[2] << "...\n"; - { - ifstream in(argv[2]); - assert(in); - while(getline(in, line)) { - ++dlc; - dev.push_back(ReadSentence(line, &devd)); - dtoks += dev.back().size(); - if (dev.back().front() != kSOS && dev.back().back() != kEOS) { - cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << dlc << " lines, " << dtoks << " tokens\n"; - } - + cnn::Initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.Convert(""); + kEOS = d.Convert(""); + vector> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + training.push_back(ReadSentence(line, &d)); + ttoks += training.back().size(); + if (training.back().front() != kSOS && training.back().back() != kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + d.Freeze(); // no new word types allowed + INPUT_VOCAB_SIZE = d.size(); + OUTPUT_VOCAB_SIZE = d.size(); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + ++dlc; + dev.push_back(ReadSentence(line, &devd)); + dtoks += dev.back().size(); + if (dev.back().front() != kSOS && dev.back().back() != kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + ostringstream os; - os << "bilm" - << '_' << LAYERS - << '_' << INPUT_DIM - << '_' << HIDDEN_DIM - << "-pid" << getpid() << ".params"; - const string fname = os.str(); - cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; - - Model model; - bool use_momentum = false; - Trainer* sgd = nullptr; - if (use_momentum) - sgd = new MomentumSGDTrainer(&model); - else - sgd = new SimpleSGDTrainer(&model); - + os << "bilm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; - //RNNBuilder rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, &model); - //EncoderDecoder lm(model); + Model model; + bool use_momentum = false; + Trainer* sgd = nullptr; + if (use_momentum) + sgd = new MomentumSGDTrainer(&model); + else + sgd = new SimpleSGDTrainer(&model); + + + //RNNBuilder rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, &model); + //EncoderDecoder lm(model); EncoderDecoder lm(model); - if (argc == 4) { - string fname = argv[3]; - ifstream in(fname); - boost::archive::text_iarchive ia(in); - ia >> model; - } - - unsigned report_every_i = 50; + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; unsigned dev_every_i_reports = 10; unsigned si = training.size(); vector order(training.size()); @@ -214,12 +211,12 @@ int main(int argc, char** argv) { unsigned chars = 0; for (unsigned i = 0; i < report_every_i; ++i) { if (si == training.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - random_shuffle(order.begin(), order.end()); + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + random_shuffle(order.begin(), order.end()); } - + // build graph for this instance ComputationGraph cg; auto& sent = training[order[si]]; @@ -227,48 +224,37 @@ int main(int argc, char** argv) { ++si; lm.BuildGraph(sent, sent, cg); //cg.PrintGraphviz(); - //cerr << "Built graph" << endl; loss += as_scalar(cg.forward()); - //cerr << "Did forward" << endl; cg.backward(); - //cerr << "Did backward" << endl; sgd->update(); - //cerr << "Updated model" << endl; ++lines; } sgd->status(); cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; - + #if 0 lm.RandomSample(); #endif - + // show score on dev data? report++; if (report % dev_every_i_reports == 0) { double dloss = 0; int dchars = 0; for (auto& sent : dev) { - ComputationGraph cg; - lm.BuildGraph(sent, sent, cg); - dloss += as_scalar(cg.forward()); - dchars += sent.size() - 1; + ComputationGraph cg; + lm.BuildGraph(sent, sent, cg); + dloss += as_scalar(cg.forward()); + dchars += sent.size() - 1; } if (dloss < best) { - best = dloss; - ofstream out(fname); - boost::archive::text_oarchive oa(out); - oa << model; + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; } cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; } } delete sgd; - - - - - - - - } +} From 78eb15abdbdb3f089b8a35a8df75ffd2b2daccdc Mon Sep 17 00:00:00 2001 From: davidweichiang Date: Tue, 9 Jun 2015 16:45:52 -0400 Subject: [PATCH 076/965] more small cleanups, fixed bug in lstm --- cnn/expr.cc | 2 +- cnn/expr.h | 3 +-- cnn/lstm.cc | 4 ++-- cnn/lstm.h | 3 +-- cnn/rnn.cc | 32 ++++++++++++++------------------ cnn/rnn.h | 8 ++++---- examples/encdec.cc | 6 +++--- examples/rnnlm.cc | 9 +++------ examples/xor-xent.cc | 2 +- 9 files changed, 30 insertions(+), 39 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index 30378f8fb..b0eff5af8 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -12,7 +12,7 @@ Expression lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pind Expression operator-(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression operator+(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression operator-(const Expression& x, const Expression& y) { return x+(-y); } -Expression operator-(const Expression& x, real y) { return Expression(x.pg, x.pg->add_function({x.i}, y)); } +Expression operator-(real x, const Expression& y) { return Expression(y.pg, y.pg->add_function({y.i}, x)); } Expression operator*(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression tanh(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 451104886..12844bcc7 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -25,9 +25,8 @@ Expression operator-(const Expression& x); Expression operator+(const Expression& x, const Expression& y); //Expression operator+(const Expression& x, real y); Expression operator-(const Expression& x, const Expression& y); -Expression operator-(const Expression& x, real y); +Expression operator-(real x, const Expression& y); Expression operator*(const Expression& x, const Expression& y); -//Expression cwiseMultiply(const Expression& x, const Expression& y); Expression tanh(const Expression& x); Expression log(const Expression& x); diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 703158a97..fc1774a4c 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -90,7 +90,7 @@ void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { } } -Expression LSTMBuilder::add_input_impl(Expression& x, ComputationGraph& cg) { +Expression LSTMBuilder::add_input_impl(Expression& x) { const unsigned t = h.size(); h.push_back(vector(layers)); c.push_back(vector(layers)); @@ -120,7 +120,7 @@ Expression LSTMBuilder::add_input_impl(Expression& x, ComputationGraph& cg) { i_ait = vars[BI] + vars[X2I] * in; Expression i_it = logistic(i_ait); // forget - Expression i_ft = i_it - 1.f; + Expression i_ft = 1.f - i_it; // write memory cell Expression i_awt; if (has_prev_state) diff --git a/cnn/lstm.h b/cnn/lstm.h index aacdd2789..9925c5157 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -27,8 +27,7 @@ struct LSTMBuilder : public RNNBuilder { protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; - //VariableIndex add_input_impl(VariableIndex x, ComputationGraph* cg) override; - Expression add_input_impl(Expression& x, ComputationGraph& cg) override; + Expression add_input_impl(Expression& x) override; public: // first index is layer, then ... diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 8ceec4f59..7e2fd0b18 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -51,29 +51,25 @@ void SimpleRNNBuilder::start_new_sequence_impl(const vector& h_0) { if (h0.size()) { assert(h0.size() == layers); } } -Expression SimpleRNNBuilder::add_input_impl(Expression& x, ComputationGraph& cg) { +Expression SimpleRNNBuilder::add_input_impl(Expression &in) { const unsigned t = h.size(); h.push_back(vector(layers)); - vector& ht = h.back(); - Expression in = x; + + Expression x = in; + for (unsigned i = 0; i < layers; ++i) { const vector& vars = param_vars[i]; - Expression i_h3; - bool have_prev = (t > 0 || h0.size() > 0); - if (have_prev) { - Expression i_h_tm1; - if (t == 0) { - if (h0.size()) i_h_tm1 = h0[i]; // first time step - } else { // tth time step - i_h_tm1 = h[t-1][i]; - } - i_h3 = vars[2] + vars[0] * in + vars[1] * i_h_tm1; - } else { - i_h3 = vars[2] + vars[0] * in; - } - in = ht[i] = tanh(i_h3); + + Expression y = vars[2] + vars[0] * x; + + if (t == 0 && h0.size() > 0) + y = y + vars[1] * h0[i]; + else if (t > 0) + y = y + vars[1] * h[t-1][i]; + + x = h[t][i] = tanh(y); } - return ht.back(); + return h[t].back(); } } // namespace cnn diff --git a/cnn/rnn.h b/cnn/rnn.h index cad9c4c59..3a3e4cd88 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -32,9 +32,9 @@ struct RNNBuilder { // add another timestep by reading in the variable x // return the hidden representation of the deepest layer - Expression add_input(Expression& x, ComputationGraph& cg) { + Expression add_input(Expression& x) { sm.transition(RNNOp::add_input); - return add_input_impl(x, cg); + return add_input_impl(x); } // rewind the last timestep - this DOES NOT remove the variables @@ -49,7 +49,7 @@ struct RNNBuilder { protected: virtual void new_graph_impl(ComputationGraph& cg) = 0; virtual void start_new_sequence_impl(const std::vector& h_0) = 0; - virtual Expression add_input_impl(Expression& x, ComputationGraph& cg) = 0; + virtual Expression add_input_impl(Expression& x) = 0; private: // the state machine ensures that the caller is behaving RNNStateMachine sm; @@ -65,7 +65,7 @@ struct SimpleRNNBuilder : public RNNBuilder { protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h_0) override; - Expression add_input_impl(Expression& x, ComputationGraph& cg) override; + Expression add_input_impl(Expression& x) override; public: void rewind_one_step() { h.pop_back(); } diff --git a/examples/encdec.cc b/examples/encdec.cc index 75ceaace5..6fc899d20 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -65,14 +65,14 @@ struct EncoderDecoder { fwd_enc_builder.start_new_sequence(); for (unsigned t = 0; t < insent.size(); ++t) { Expression i_x_t = lookup(cg,p_ec,insent[t]); - fwd_enc_builder.add_input(i_x_t, cg); + fwd_enc_builder.add_input(i_x_t); } // backward encoder rev_enc_builder.new_graph(cg); rev_enc_builder.start_new_sequence(); for (int t = insent.size() - 1; t >= 0; --t) { Expression i_x_t = lookup(cg, p_ec, insent[t]); - rev_enc_builder.add_input(i_x_t, cg); + rev_enc_builder.add_input(i_x_t); } // encoder -> decoder transformation @@ -109,7 +109,7 @@ struct EncoderDecoder { const unsigned oslen = osent.size() - 1; for (unsigned t = 0; t < oslen; ++t) { Expression i_x_t = lookup(cg, p_c, osent[t]); - Expression i_y_t = dec_builder.add_input(i_x_t, cg); + Expression i_y_t = dec_builder.add_input(i_x_t); Expression i_r_t = i_bias + i_R * i_y_t; Expression i_ydist = log_softmax(i_r_t); errs.push_back(pick(i_ydist,osent[t+1])); diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 4751793d3..13879f1e7 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -48,13 +48,11 @@ struct RNNLanguageModel { Expression i_bias = parameter(cg, p_bias); // word bias vector errs; for (unsigned t = 0; t < slen; ++t) { - // x_t = lookup sent[t] in parameters p_c Expression i_x_t = lookup(cg, p_c, sent[t]); // y_t = RNN(x_t) - Expression i_y_t = builder.add_input(i_x_t, cg); + Expression i_y_t = builder.add_input(i_x_t); Expression i_r_t = i_bias + i_R * i_y_t; - // ydist = softmax(r_t) // LogSoftmax followed by PickElement can be written in one step // using PickNegLogSoftmax #if 0 @@ -78,7 +76,7 @@ struct RNNLanguageModel { #endif } - // return VariableIndex of total loss + // return Expression for total loss void RandomSample(int max_len = 150) { cerr << endl; ComputationGraph cg; @@ -94,8 +92,7 @@ struct RNNLanguageModel { ++len; Expression i_x_t = lookup(cg, p_c, cur); // y_t = RNN(x_t) - Expression i_y_t = builder.add_input(i_x_t, cg); - // r_t = bias + R * y_t + Expression i_y_t = builder.add_input(i_x_t); Expression i_r_t = i_bias + i_R * i_y_t; Expression ydist = softmax(i_r_t); diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index e8bfbe405..10f142c9e 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -35,7 +35,7 @@ int main(int argc, char** argv) { Expression h = tanh(W*x + b); Expression y_pred = logistic(V*h + a); - Expression loss = binary_log_loss(y_pred, &y_value); // DWC: I didn't understand why second argument is a real* rather than an input + Expression loss = binary_log_loss(y_pred, &y_value); cg.PrintGraphviz(); //if (argc == 2) { From f6ca013797d8734a0fd9ea965c74b042d82d362c Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 9 Jun 2015 14:13:38 -0700 Subject: [PATCH 077/965] add sum_cols function that supports reweighting columns --- cnn/expr.cc | 1 + cnn/expr.h | 1 + 2 files changed, 2 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index b0eff5af8..9182c2e67 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -36,6 +36,7 @@ Expression pickrange(const Expression& x, unsigned v, unsigned u) { return Expre Expression pickneglogsoftmax(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } Expression sum_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression sum_cols(const Expression& x, const Expression& w) { return Expression(x.pg, x.pg->add_function({x.i,w.i})); } Expression kmh_ngram(const Expression& x, unsigned n) { return Expression(x.pg, x.pg->add_function({x.i}, n)); } diff --git a/cnn/expr.h b/cnn/expr.h index 12844bcc7..b1f94b841 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -73,6 +73,7 @@ Expression concatenate(const T& xs) { } Expression sum_cols(const Expression& x); +Expression sum_cols(const Expression& x, const Expression& w); Expression kmh_ngram(const Expression& x, unsigned n); From 4cf101db628b9c74dcc43a653941cdb4aa55ae47 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 9 Jun 2015 18:42:37 -0700 Subject: [PATCH 078/965] example tagging model, fix for RNN interface --- cnn/lstm.cc | 2 +- cnn/lstm.h | 2 +- cnn/rnn.cc | 2 +- cnn/rnn.h | 6 +- examples/CMakeLists.txt | 2 +- examples/tag-bilstm.cc | 238 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 245 insertions(+), 7 deletions(-) create mode 100644 examples/tag-bilstm.cc diff --git a/cnn/lstm.cc b/cnn/lstm.cc index fc1774a4c..3c60c6bd1 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -90,7 +90,7 @@ void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { } } -Expression LSTMBuilder::add_input_impl(Expression& x) { +Expression LSTMBuilder::add_input_impl(const Expression& x) { const unsigned t = h.size(); h.push_back(vector(layers)); c.push_back(vector(layers)); diff --git a/cnn/lstm.h b/cnn/lstm.h index 9925c5157..0b827c77c 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -27,7 +27,7 @@ struct LSTMBuilder : public RNNBuilder { protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(Expression& x) override; + Expression add_input_impl(const Expression& x) override; public: // first index is layer, then ... diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 7e2fd0b18..0044c9017 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -51,7 +51,7 @@ void SimpleRNNBuilder::start_new_sequence_impl(const vector& h_0) { if (h0.size()) { assert(h0.size() == layers); } } -Expression SimpleRNNBuilder::add_input_impl(Expression &in) { +Expression SimpleRNNBuilder::add_input_impl(const Expression &in) { const unsigned t = h.size(); h.push_back(vector(layers)); diff --git a/cnn/rnn.h b/cnn/rnn.h index 3a3e4cd88..60ba65cf1 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -32,7 +32,7 @@ struct RNNBuilder { // add another timestep by reading in the variable x // return the hidden representation of the deepest layer - Expression add_input(Expression& x) { + Expression add_input(const Expression& x) { sm.transition(RNNOp::add_input); return add_input_impl(x); } @@ -49,7 +49,7 @@ struct RNNBuilder { protected: virtual void new_graph_impl(ComputationGraph& cg) = 0; virtual void start_new_sequence_impl(const std::vector& h_0) = 0; - virtual Expression add_input_impl(Expression& x) = 0; + virtual Expression add_input_impl(const Expression& x) = 0; private: // the state machine ensures that the caller is behaving RNNStateMachine sm; @@ -65,7 +65,7 @@ struct SimpleRNNBuilder : public RNNBuilder { protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h_0) override; - Expression add_input_impl(Expression& x) override; + Expression add_input_impl(const Expression& x) override; public: void rewind_one_step() { h.pop_back(); } diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index cbb01c3b3..ed7c64b96 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET embed-cl encdec xor xor-xent rnnlm nlm) +foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm nlm) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/tag-bilstm.cc b/examples/tag-bilstm.cc new file mode 100644 index 000000000..56386634c --- /dev/null +++ b/examples/tag-bilstm.cc @@ -0,0 +1,238 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/timing.h" +#include "cnn/rnn.h" +#include "cnn/gru.h" +#include "cnn/lstm.h" +#include "cnn/dict.h" +# include "cnn/expr.h" + +#include +#include +#include + +#include +#include + +using namespace std; +using namespace cnn; + +unsigned LAYERS = 2; +unsigned INPUT_DIM = 32; +unsigned HIDDEN_DIM = 64; +unsigned TAG_HIDDEN_DIM = 32; +unsigned TAG_DIM = 24; +unsigned TAG_SIZE = 0; +unsigned VOCAB_SIZE = 0; + +cnn::Dict d; +cnn::Dict td; +int kSOS; +int kEOS; + +template +struct RNNLanguageModel { + LookupParameters* p_w; + Parameters* p_l2th; + Parameters* p_r2th; + Parameters* p_thbias; + + Parameters* p_th2t; + Parameters* p_tbias; + Builder l2rbuilder; + Builder r2lbuilder; + explicit RNNLanguageModel(Model& model) : + l2rbuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), + r2lbuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + p_w = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_l2th = model.add_parameters({TAG_HIDDEN_DIM, HIDDEN_DIM}); + p_r2th = model.add_parameters({TAG_HIDDEN_DIM, HIDDEN_DIM}); + p_thbias = model.add_parameters({TAG_HIDDEN_DIM}); + + p_th2t = model.add_parameters({TAG_SIZE, TAG_HIDDEN_DIM}); + p_tbias = model.add_parameters({TAG_SIZE}); + } + + // return Expression of total loss + Expression BuildTaggingGraph(const vector& sent, const vector& tags, ComputationGraph& cg, double* cor = 0) { + const unsigned slen = sent.size(); + l2rbuilder.new_graph(cg); // reset RNN builder for new graph + l2rbuilder.start_new_sequence(); + r2lbuilder.new_graph(cg); // reset RNN builder for new graph + r2lbuilder.start_new_sequence(); + Expression i_l2th = parameter(cg, p_l2th); + Expression i_r2th = parameter(cg, p_r2th); + Expression i_thbias = parameter(cg, p_thbias); + Expression i_th2t = parameter(cg, p_th2t); + Expression i_tbias = parameter(cg, p_tbias); + vector errs; + vector i_words(slen); + vector fwds(slen); + vector revs(slen); + + // read sequence from left to right + l2rbuilder.add_input(lookup(cg, p_w, kSOS)); + for (unsigned t = 0; t < slen; ++t) { + i_words[t] = lookup(cg, p_w, sent[t]); + fwds[t] = l2rbuilder.add_input(i_words[t]); + } + + // read sequence from right to left + r2lbuilder.add_input(lookup(cg, p_w, kEOS)); + for (unsigned t = 0; t < slen; ++t) + revs[slen - t - 1] = r2lbuilder.add_input(i_words[slen - t - 1]); + + for (unsigned t = 0; t < slen; ++t) { + Expression i_t = i_th2t * tanh(i_l2th * fwds[t] + i_r2th * revs[t] + i_thbias) + i_tbias; + if (cor) { + vector dist = as_vector(cg.incremental_forward()); + double best = -9e99; + int besti = -1; + for (int i = 0; i < dist.size(); ++i) { + if (dist[i] > best) { best = dist[i]; besti = i; } + } + if (tags[t] == besti) (*cor)++; + } + Expression i_err = pickneglogsoftmax(i_t, tags[t]); + errs.push_back(i_err); + } + return sum(errs); + } +}; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.Convert(""); + kEOS = d.Convert(""); + vector,vector>> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + vector x,y; + ReadSentencePair(line, &x, &d, &y, &td); + assert(x.size() == y.size()); + if (x.size() == 0) { cerr << line << endl; abort(); } + training.push_back(make_pair(x,y)); + ttoks += x.size(); + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + cerr << "Tags: " << td.size() << endl; + } + d.Freeze(); // no new word types allowed + td.Freeze(); // no new tag types allowed + VOCAB_SIZE = d.size(); + TAG_SIZE = td.size(); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + ++dlc; + vector x,y; + ReadSentencePair(line, &x, &d, &y, &td); + assert(x.size() == y.size()); + dev.push_back(make_pair(x,y)); + dtoks += x.size(); + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + ostringstream os; + os << "tagger" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + bool use_momentum = false; + Trainer* sgd = nullptr; + //if (use_momentum) + // sgd = new MomentumSGDTrainer(&model); + //else + sgd = new SimpleSGDTrainer(&model); + + RNNLanguageModel lm(model); + //RNNLanguageModel lm(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 25; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + double correct = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& sent = training[order[si]]; + chars += sent.first.size(); + ++si; + lm.BuildTaggingGraph(sent.first, sent.second, cg, &correct); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(); + ++lines; + } + sgd->status(); + cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << " (acc=" << (correct / chars) << ") "; + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + int dchars = 0; + double dcorr = 0; + for (auto& sent : dev) { + ComputationGraph cg; + lm.BuildTaggingGraph(sent.first, sent.second, cg, &dcorr); + dloss += as_scalar(cg.forward()); + dchars += sent.first.size(); + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << " acc=" << (dcorr / dchars) << ' '; + } + } + delete sgd; +} + From 0dd0de7600427e3a2428c73bfa9c8429296dbe1e Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 9 Jun 2015 20:13:30 -0700 Subject: [PATCH 079/965] remove redundant computation --- cnn/expr.cc | 1 - cnn/expr.h | 1 - cnn/nodes.cc | 21 ++++----------------- cnn/nodes.h | 4 ++-- 4 files changed, 6 insertions(+), 21 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index 9182c2e67..b0eff5af8 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -36,7 +36,6 @@ Expression pickrange(const Expression& x, unsigned v, unsigned u) { return Expre Expression pickneglogsoftmax(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } Expression sum_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } -Expression sum_cols(const Expression& x, const Expression& w) { return Expression(x.pg, x.pg->add_function({x.i,w.i})); } Expression kmh_ngram(const Expression& x, unsigned n) { return Expression(x.pg, x.pg->add_function({x.i}, n)); } diff --git a/cnn/expr.h b/cnn/expr.h index b1f94b841..12844bcc7 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -73,7 +73,6 @@ Expression concatenate(const T& xs) { } Expression sum_cols(const Expression& x); -Expression sum_cols(const Expression& x, const Expression& w); Expression kmh_ngram(const Expression& x, unsigned n); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 3d7a186ac..46a404bf1 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -49,9 +49,6 @@ void SumColumns::forward(const vector& xs, Tensor& fx) const { auto y = *fx; if (xs.size() == 1) { y = x.rowwise().sum(); - } else if (xs.size() == 2) { - auto w = **xs[1]; - y = (x * w.asDiagonal()).rowwise().sum(); } else { abort(); } } @@ -61,20 +58,10 @@ void SumColumns::backward(const vector& xs, unsigned i, Tensor& dEdxi) const { auto out = *dEdxi; - if (xs.size() == 1) { - // this uses Eigen's broadcast capability - // the following doesn't compile, so i use the next line - //out.colwise() += *dEdf; - out.colwise() += (*dEdf).col(0); - } else if (xs.size() == 2) { - auto x = **xs[0]; - auto w = **xs[1]; - if (i == 0) { // matrix - out.noalias() += *dEdf * w.transpose(); - } else { // column weighting - out.noalias() += x.transpose() * *dEdf; - } - } + // this uses Eigen's broadcast capability + // the following doesn't compile, so i use the next line + //out.colwise() += *dEdf; + out.colwise() += (*dEdf).col(0); } void KMHNGram::forward(const vector& xs, Tensor& fx) const { diff --git a/cnn/nodes.h b/cnn/nodes.h index b1f0fcd74..e1bf0339d 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -24,8 +24,7 @@ struct Reshape : public Node { // with a single argument x \in R^{n x m} // y_i = \sum_j x_i,j -// with two arguments x \in R^{n x m} and w \in R^{m} -// y_i = \sum_j x_i,j * w_j +// if you want to reweight the columns and then sum them, use MatrixMultiply struct SumColumns : public Node { template explicit SumColumns(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; @@ -334,6 +333,7 @@ struct Rectify : public Node { // x_1 must be a scalar that is a value between 0 and 1 // target_y is a value between 0 and 1 // y = ty * log(x_1) + (1 - ty) * log(x_1) +// TODO get rid of ty/pty and instead have this as a VariableIndex struct BinaryLogLoss : public Node { BinaryLogLoss(const std::initializer_list& a, real ty) : Node(a), target_y(ty), ptarget_y(&target_y) {} BinaryLogLoss(const std::initializer_list& a, real* pty) : Node(a), target_y(), ptarget_y(pty) {} From 6a06b8c85fa18ee2d69bf95f8d845c50b959a8ca Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 9 Jun 2015 21:16:56 -0700 Subject: [PATCH 080/965] inconsistent use of expression --- cnn/expr.cc | 3 +-- cnn/expr.h | 3 +-- cnn/nodes-common.cc | 8 ++++++-- cnn/nodes.cc | 8 +++----- cnn/nodes.h | 8 ++------ examples/xor-xent.cc | 3 ++- 6 files changed, 15 insertions(+), 18 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index b0eff5af8..3e2cfa857 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -25,8 +25,7 @@ Expression softmax(const Expression& x) { return Expression(x.pg, x.pg->add_func Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} Expression squaredDistance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } -Expression binary_log_loss(const Expression& x, real ty) { return Expression(x.pg, x.pg->add_function({x.i}, &ty)); } -Expression binary_log_loss(const Expression& x, real* pty) { return Expression(x.pg, x.pg->add_function({x.i}, pty)); } +Expression binary_log_loss(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i,y.i})); } Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, m)); } Expression pick(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } diff --git a/cnn/expr.h b/cnn/expr.h index 12844bcc7..002a17a7e 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -38,8 +38,7 @@ Expression softmax(const Expression& x); Expression cwise_multiply(const Expression& x, const Expression& y); Expression squaredDistance(const Expression& x, const Expression& y); -Expression binary_log_loss(const Expression& x, real ty); -Expression binary_log_loss(const Expression& x, real* pty); +Expression binary_log_loss(const Expression& x, const Expression& y); Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0); Expression pick(const Expression& x, unsigned v); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 310171728..ed9e1636e 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -475,16 +475,20 @@ Dim LogisticSigmoid::dim_forward(const vector& xs) const { string BinaryLogLoss::as_string(const vector& arg_names) const { ostringstream os; - os << "binary_log_loss(" << arg_names[0] << ", " << *ptarget_y << ')'; + os << "binary_log_loss(" << arg_names[0] << ", " << arg_names[1] << ')'; return os.str(); } Dim BinaryLogLoss::dim_forward(const vector& xs) const { - assert(xs.size() == 1); + assert(xs.size() == 2); if (xs[0].rows() != 2 && xs[0].ndims() != 1) { cerr << "Bad input dimensions in BinaryLogLoss: " << xs << endl; abort(); } + if (xs[1].rows() != 2 && xs[1].ndims() != 1) { + cerr << "Bad input dimensions in BinaryLogLoss: " << xs << endl; + abort(); + } return Dim({1}); } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 46a404bf1..88863530e 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -909,9 +909,7 @@ void LogisticSigmoid::backward(const vector& xs, // target_y is a value between 0 and 1 // y = ty * log(x_1) + (1 - ty) * log(x_1) void BinaryLogLoss::forward(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); - assert(xs.front()->d.size() == 1); - fx.v[0] = FBinaryLogLoss()(xs[0]->v[0], *ptarget_y); + fx.v[0] = FBinaryLogLoss()(xs[0]->v[0], xs[1]->v[0]); } void BinaryLogLoss::backward(const vector& xs, @@ -919,8 +917,8 @@ void BinaryLogLoss::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - const auto y_pred = xs[0]->v[0]; - const real ty = *ptarget_y; + const auto y_pred = xs[i]->v[0]; + const auto ty = xs[1-i]->v[0]; dEdxi.v[0] += FBinaryLogLossBackward()(y_pred,ty,dEdf.v[0]); } diff --git a/cnn/nodes.h b/cnn/nodes.h index e1bf0339d..77da0626e 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -331,12 +331,10 @@ struct Rectify : public Node { // you could do this with LogisticSigmoid, Softmax or a variety of other // functions, but this is often useful. // x_1 must be a scalar that is a value between 0 and 1 -// target_y is a value between 0 and 1 +// x_2 (ty) must be a scalar that is a value between 0 and 1 // y = ty * log(x_1) + (1 - ty) * log(x_1) -// TODO get rid of ty/pty and instead have this as a VariableIndex struct BinaryLogLoss : public Node { - BinaryLogLoss(const std::initializer_list& a, real ty) : Node(a), target_y(ty), ptarget_y(&target_y) {} - BinaryLogLoss(const std::initializer_list& a, real* pty) : Node(a), target_y(), ptarget_y(pty) {} + BinaryLogLoss(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -345,8 +343,6 @@ struct BinaryLogLoss : public Node { const Tensor& dEdf, unsigned i, Tensor& dEdxi) const override; - real target_y; - real* ptarget_y; }; // y = \sum_i x_i diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index 10f142c9e..bdf6422e3 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -32,10 +32,11 @@ int main(int argc, char** argv) { vector x_values(2); // set x_values to change the inputs to the network Expression x = input(cg, {2}, &x_values); cnn::real y_value; // set y_value to change the target output + Expression y = input(cg, &y_value); Expression h = tanh(W*x + b); Expression y_pred = logistic(V*h + a); - Expression loss = binary_log_loss(y_pred, &y_value); + Expression loss = binary_log_loss(y_pred, y); cg.PrintGraphviz(); //if (argc == 2) { From 61acfe8f2d9e7b2d285439c916a5f7c819037522 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 10 Jun 2015 00:30:00 -0700 Subject: [PATCH 081/965] few random enhancements: add softsign nonlinearity, normalized spelling of squared_distance, added comment about how to make LSTMs faster --- cnn/expr.cc | 15 +++++++++++++-- cnn/expr.h | 5 ++++- cnn/functors.h | 13 +++++++++++++ cnn/lstm.cc | 4 ++++ cnn/nodes-common.cc | 15 +++++++++++++++ cnn/nodes.cc | 14 ++++++++++++++ cnn/nodes.h | 13 +++++++++++++ examples/embed-cl.cc | 4 ++-- examples/xor.cc | 3 ++- 9 files changed, 80 insertions(+), 6 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index 3e2cfa857..b1c2b6e87 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -1,5 +1,7 @@ #include "cnn/expr.h" +#include + namespace cnn { namespace expr { Expression input(ComputationGraph& g, real s) { return Expression(&g, g.add_input(s)); } @@ -17,14 +19,23 @@ Expression operator*(const Expression& x, const Expression& y) { return Expressi Expression tanh(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression exp(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression logistic(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression rectify(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } - +Expression softsign(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } + +Expression affine_transform(const std::initializer_list& xs) { + ComputationGraph *pg = xs.begin()->pg; + std::vector xis(xs.size()); + int i = 0; + for (auto& e : xs) xis[i++] = e.i; + return Expression(pg, pg->add_function(xis)); +} Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} -Expression squaredDistance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } +Expression squared_distance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression binary_log_loss(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i,y.i})); } Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, m)); } diff --git a/cnn/expr.h b/cnn/expr.h index 002a17a7e..5c71aa164 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -29,15 +29,18 @@ Expression operator-(real x, const Expression& y); Expression operator*(const Expression& x, const Expression& y); Expression tanh(const Expression& x); +Expression exp(const Expression& x); Expression log(const Expression& x); Expression logistic(const Expression& x); Expression rectify(const Expression& x); Expression log_softmax(const Expression& x); Expression softmax(const Expression& x); +Expression softsign(const Expression& x); +Expression affine_transform(const std::initializer_list& xs); Expression cwise_multiply(const Expression& x, const Expression& y); -Expression squaredDistance(const Expression& x, const Expression& y); +Expression squared_distance(const Expression& x, const Expression& y); Expression binary_log_loss(const Expression& x, const Expression& y); Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0); diff --git a/cnn/functors.h b/cnn/functors.h index e95cb367a..9a3116dbd 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -137,6 +137,19 @@ struct FRectify { } }; +struct FSoftSign { + CNN_DEVICE_FUNC inline float operator()(float x) const { + return x / (1.f + (x < 0.f ? -x : x)); + } +}; + +struct FSoftSignBackward { + CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + float a = 1.f - (t < 0.f ? -t : t); + return a * a * d; + } +}; + struct FLogisticSigmoid { CNN_DEVICE_FUNC inline float operator()(float x) const { return 1.f / (1.f + expf(-x)); diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 3c60c6bd1..b59237225 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -116,8 +116,10 @@ Expression LSTMBuilder::add_input_impl(const Expression& x) { Expression i_ait; if (has_prev_state) i_ait = vars[BI] + vars[X2I] * in + vars[H2I]*i_h_tm1 + vars[C2I] * i_c_tm1; +// i_ait = affine_transform({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1, vars[C2I], i_c_tm1}); else i_ait = vars[BI] + vars[X2I] * in; +// i_ait = affine_transform({vars[BI], vars[X2I], in}); Expression i_it = logistic(i_ait); // forget Expression i_ft = 1.f - i_it; @@ -125,8 +127,10 @@ Expression LSTMBuilder::add_input_impl(const Expression& x) { Expression i_awt; if (has_prev_state) i_awt = vars[BC] + vars[X2C] * in + vars[H2C]*i_h_tm1; + //i_awt = affine_transform({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); else i_awt = vars[BC] + vars[X2C] * in; + //i_awt = affine_transform({vars[BC], vars[X2C], in}); Expression i_wt = tanh(i_awt); // output if (has_prev_state) { diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index ed9e1636e..ae5b1f61b 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -292,6 +292,21 @@ Dim Softmax::dim_forward(const vector& xs) const { return xs[0]; } +string SoftSign::as_string(const vector& arg_names) const { + ostringstream s; + s << "softsign(" << arg_names[0] << ')'; + return s.str(); +} + +Dim SoftSign::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + if (!LooksLikeVector(xs[0])) { + cerr << "Bad input dimensions in Softsign: " << xs << endl; + abort(); + } + return xs[0]; +} + string PickNegLogSoftmax::as_string(const vector& arg_names) const { ostringstream s; s << "log_softmax(" << arg_names[0] << ")_{" << *pval << '}'; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 88863530e..6ba2df987 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -903,6 +903,20 @@ void LogisticSigmoid::backward(const vector& xs, #endif } +void SoftSign::forward(const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + auto x = **xs[0]; + *fx = x.unaryExpr(FSoftSign()); +} + +void SoftSign::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + *dEdxi += (*fx).binaryExpr(*dEdf, FSoftSignBackward()); +} + // you could do this with LogisticSigmoid, Softmax or a variety of other // functions, but this is often useful. // x_1 must be a scalar that is a value between 0 and 1 diff --git a/cnn/nodes.h b/cnn/nodes.h index 77da0626e..4021266bf 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -384,6 +384,19 @@ struct LogisticSigmoid : public Node { Tensor& dEdxi) const override; }; +// y = x / (1 + |x|) +struct SoftSign : public Node { + explicit SoftSign(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // z = \sum_j \exp (x_i)_j // y_i = (x_1)_i / z struct Softmax : public Node { diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index a8213df9f..155ff415d 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -165,14 +165,14 @@ int main(int argc, char** argv) { auto& sent_pair = training[order[si]]; ++si; Expression s = emb.EmbedSource(sent_pair.first, cg); - Expression sim = squaredDistance(s, emb.EmbedTarget(sent_pair.second, cg)); + Expression sim = squared_distance(s, emb.EmbedTarget(sent_pair.second, cg)); float margin = 2; const unsigned K = 20; vector noise(K); for (unsigned j = 0; j < K; ++j) { unsigned sample = rand01() * training.size(); while (sample == order[si] || sample == training.size()) { sample = rand01() * training.size(); } - Expression sim_n = squaredDistance(s, emb.EmbedTarget(training[sample].second, cg)); + Expression sim_n = squared_distance(s, emb.EmbedTarget(training[sample].second, cg)); noise[j] = pairwise_rank_loss(sim, sim_n, margin); } Expression l = sum(noise); diff --git a/examples/xor.cc b/examples/xor.cc index 681777cd8..8ba8a25bc 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -36,8 +36,9 @@ int main(int argc, char** argv) { Expression y = input(cg, &y_value); Expression h = tanh(W*x + b); + //Expression h = softsign(W*x + b); Expression y_pred = V*h + a; - Expression loss = squaredDistance(y_pred, y); + Expression loss = squared_distance(y_pred, y); cg.PrintGraphviz(); if (argc == 2) { From 39da3831d1d29cd71b18c18f87dd4311985e1c6b Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 10 Jun 2015 10:30:11 -0700 Subject: [PATCH 082/965] componentwise division --- cnn/expr.cc | 1 + cnn/expr.h | 2 ++ cnn/functors.h | 6 ++++++ cnn/nodes-common.cc | 15 +++++++++++++++ cnn/nodes.cc | 23 +++++++++++++++++++++++ cnn/nodes.h | 13 +++++++++++++ 6 files changed, 60 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index b1c2b6e87..ef4e8e902 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -16,6 +16,7 @@ Expression operator+(const Expression& x, const Expression& y) { return Expressi Expression operator-(const Expression& x, const Expression& y) { return x+(-y); } Expression operator-(real x, const Expression& y) { return Expression(y.pg, y.pg->add_function({y.i}, x)); } Expression operator*(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } +Expression cdiv(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression tanh(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 5c71aa164..bd8d3aed3 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -27,6 +27,8 @@ Expression operator+(const Expression& x, const Expression& y); Expression operator-(const Expression& x, const Expression& y); Expression operator-(real x, const Expression& y); Expression operator*(const Expression& x, const Expression& y); +// componentwise division +Expression cdiv(const Expression& x, const Expression& y); Expression tanh(const Expression& x); Expression exp(const Expression& x); diff --git a/cnn/functors.h b/cnn/functors.h index 9a3116dbd..d322caf36 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -20,6 +20,12 @@ struct FProduct { } }; +struct FQuotient { + CNN_DEVICE_FUNC inline float operator()(float a, float b) const { + return a / b; + } +}; + struct FConstantMinus { FConstantMinus(float c) : c(c) {} CNN_DEVICE_FUNC inline float operator()(float x) const { diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index ae5b1f61b..6f3ca0a03 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -416,6 +416,21 @@ Dim CwiseMultiply::dim_forward(const vector& xs) const { return xs[0]; } +string CwiseQuotient::as_string(const vector& arg_names) const { + ostringstream s; + s << arg_names[0] << " / " << arg_names[1]; + return s.str(); +} + +Dim CwiseQuotient::dim_forward(const vector& xs) const { + assert(xs.size() == 2); + if (xs[0] != xs[1]) { + cerr << "Mismatched input dimensions in CwiseQuotient: " << xs << endl; + abort(); + } + return xs[0]; +} + string AffineTransform::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0]; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 6ba2df987..33d53e702 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -718,6 +718,29 @@ void MatrixMultiply::backward(const vector& xs, #endif } +void CwiseQuotient::forward(const vector& xs, Tensor& fx) const { + assert(xs.size() == 2); + auto x1 = **xs[0]; + auto x2 = **xs[1]; + *fx = x1.cwiseQuotient(x2); +} + +void CwiseQuotient::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + if (i == 0) { + auto x2 = **xs[1]; + *dEdxi += (*dEdf).cwiseQuotient(x2); + } else { // i = 1 + auto x1 = **xs[0]; + auto x2 = **xs[1]; + *dEdxi -= (*dEdf).cwiseQuotient(x2.cwiseProduct(x2)).cwiseProduct(x1); + } +} + void CwiseMultiply::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); #if HAVE_CUDA diff --git a/cnn/nodes.h b/cnn/nodes.h index 4021266bf..6a61286d4 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -289,6 +289,19 @@ struct CwiseMultiply : public Node { Tensor& dEdxi) const override; }; +// y = x_1 / x_2 (cwiseQuotient) +struct CwiseQuotient : public Node { + explicit CwiseQuotient(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = x_1 \sum_{i=2, 4 ...} A_i * x_{i+1} struct AffineTransform : public Node { template explicit AffineTransform(const T& a) : Node(a) {} From 41f035485b856c5b0173fab8916c27eac861b69a Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 10 Jun 2015 19:27:25 -0700 Subject: [PATCH 083/965] support auxiliary storage; dropout; gaussian noise --- cnn/cnn.cc | 1 + cnn/cnn.h | 10 +++++++++- cnn/exec.cc | 10 ++++++++++ cnn/expr.cc | 2 ++ cnn/expr.h | 2 ++ cnn/lstm.cc | 22 ++++++++++++---------- cnn/model.cc | 9 +++++++++ cnn/model.h | 3 +++ cnn/nodes.cc | 40 +++++++++++++++++----------------------- cnn/nodes.h | 11 ++++++----- cnn/tensor.cc | 8 ++++++-- 11 files changed, 77 insertions(+), 41 deletions(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index b6c52d111..8e04e6d2e 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -14,6 +14,7 @@ float* kSCALAR_ZERO; int n_hgs = 0; Node::~Node() {} +size_t Node::aux_storage_size() const { return 0; } ComputationGraph::ComputationGraph() : last_node_evaluated(), ee(new SimpleExecutionEngine(*this)) { diff --git a/cnn/cnn.h b/cnn/cnn.h index c19b828d7..5f99dbf46 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -109,7 +109,7 @@ struct Node { // request the memory here (nb. you could put it on the Node object, but in general, // edges should not allocate tensor memory since memory is managed centrally for the // entire computation graph). - //virtual size_t aux_storage_space() const; + virtual size_t aux_storage_size() const; // computation virtual void forward(const std::vector& xs, @@ -135,6 +135,14 @@ struct Node { explicit Node(const std::initializer_list& a) : args(a) {} template explicit Node(const T&c) : args(c.begin(), c.end()) {} + + public: + // auxiliary memory + mutable void* aux_mem; // this will usually be null. but, if your node needs to store intermediate values + // between forward and backward, you can use store it here. request the + // number of bytes you need from aux_storage_size(). Note: + // this memory will be on the CPU or GPU, depending on your computation + // backend }; template diff --git a/cnn/exec.cc b/cnn/exec.cc index 66675e518..924678866 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -39,6 +39,16 @@ const Tensor& SimpleExecutionEngine::incremental_forward() { cerr << "out of memory\n"; abort(); } + void* aux_mem = nullptr; + size_t aux_size = node->aux_storage_size(); + if (aux_size) { + aux_mem = fxs->allocate(aux_size); + if (!aux_mem) { + cerr << "out of memory\n"; + abort(); + } + } + node->aux_mem = aux_mem; node->forward(xs, nfxs[last_node_evaluated]); } return nfxs.back(); diff --git a/cnn/expr.cc b/cnn/expr.cc index ef4e8e902..bc0e629b2 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -26,6 +26,8 @@ Expression rectify(const Expression& x) { return Expression(x.pg, x.pg->add_func Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression softsign(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression noise(const Expression& x, real stddev) { return Expression(x.pg, x.pg->add_function({x.i}, stddev)); } +Expression dropout(const Expression& x, real p) { return Expression(x.pg, x.pg->add_function({x.i}, p)); } Expression affine_transform(const std::initializer_list& xs) { ComputationGraph *pg = xs.begin()->pg; diff --git a/cnn/expr.h b/cnn/expr.h index bd8d3aed3..90419c6eb 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -38,6 +38,8 @@ Expression rectify(const Expression& x); Expression log_softmax(const Expression& x); Expression softmax(const Expression& x); Expression softsign(const Expression& x); +Expression noise(const Expression& x, real stddev); +Expression dropout(const Expression& x, real p); Expression affine_transform(const std::initializer_list& xs); Expression cwise_multiply(const Expression& x, const Expression& y); diff --git a/cnn/lstm.cc b/cnn/lstm.cc index b59237225..678c3720b 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -115,22 +115,22 @@ Expression LSTMBuilder::add_input_impl(const Expression& x) { // input Expression i_ait; if (has_prev_state) - i_ait = vars[BI] + vars[X2I] * in + vars[H2I]*i_h_tm1 + vars[C2I] * i_c_tm1; -// i_ait = affine_transform({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1, vars[C2I], i_c_tm1}); +// i_ait = vars[BI] + vars[X2I] * in + vars[H2I]*i_h_tm1 + vars[C2I] * i_c_tm1; + i_ait = affine_transform({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1, vars[C2I], i_c_tm1}); else - i_ait = vars[BI] + vars[X2I] * in; -// i_ait = affine_transform({vars[BI], vars[X2I], in}); +// i_ait = vars[BI] + vars[X2I] * in; + i_ait = affine_transform({vars[BI], vars[X2I], in}); Expression i_it = logistic(i_ait); // forget Expression i_ft = 1.f - i_it; // write memory cell Expression i_awt; if (has_prev_state) - i_awt = vars[BC] + vars[X2C] * in + vars[H2C]*i_h_tm1; - //i_awt = affine_transform({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); +// i_awt = vars[BC] + vars[X2C] * in + vars[H2C]*i_h_tm1; + i_awt = affine_transform({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); else - i_awt = vars[BC] + vars[X2C] * in; - //i_awt = affine_transform({vars[BC], vars[X2C], in}); +// i_awt = vars[BC] + vars[X2C] * in; + i_awt = affine_transform({vars[BC], vars[X2C], in}); Expression i_wt = tanh(i_awt); // output if (has_prev_state) { @@ -143,9 +143,11 @@ Expression LSTMBuilder::add_input_impl(const Expression& x) { Expression i_aot; if (has_prev_state) - i_aot = vars[BO] + vars[X2O] * in + vars[H2O] * i_h_tm1 + vars[C2O] * ct[i]; +// i_aot = vars[BO] + vars[X2O] * in + vars[H2O] * i_h_tm1 + vars[C2O] * ct[i]; + i_aot = affine_transform({vars[BO], vars[X2O], in, vars[H2O], i_h_tm1, vars[C2O], ct[i]}); else - i_aot = vars[BO] + vars[X2O] * in; +// i_aot = vars[BO] + vars[X2O] * in; + i_aot = affine_transform({vars[BO], vars[X2O], in}); Expression i_ot = logistic(i_aot); Expression ph_t = tanh(ct[i]); in = ht[i] = cwise_multiply(i_ot,ph_t); diff --git a/cnn/model.cc b/cnn/model.cc index 66ee77ce6..ba0724cfd 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -28,6 +28,10 @@ Parameters::Parameters(const Dim& d) : dim(d) { size_t Parameters::size() const { return dim.size(); } +void Parameters::scale_parameters(float a) { + (*g) *= a; +} + void Parameters::g_squared_l2norm(float* sqnorm) const { #if HAVE_CUDA gpu::l2_norm_reducer(g.d.size(), g.v, sqnorm, true, false); @@ -62,6 +66,11 @@ LookupParameters::LookupParameters(unsigned n, const Dim& d) : dim(d), values(n) } } +void LookupParameters::scale_parameters(float a) { + for (auto& p : values) + (*p) *= a; +} + void LookupParameters::Initialize(unsigned index, const vector& val) { assert(int(val.size()) == int(dim.size())); #if HAVE_CUDA diff --git a/cnn/model.h b/cnn/model.h index 911a9c4e4..98a9f0be8 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -19,6 +19,7 @@ namespace cnn { struct ParametersBase { friend class Model; + virtual void scale_parameters(float a) = 0; virtual void g_squared_l2norm(float* sqnorm) const = 0; virtual size_t size() const = 0; virtual ~ParametersBase(); @@ -27,6 +28,7 @@ struct ParametersBase { // represents parameters (e.g., a weight matrix) that will be optimized struct Parameters : public ParametersBase { friend class Model; + void scale_parameters(float a) override; void g_squared_l2norm(float* sqnorm) const override; size_t size() const override; @@ -49,6 +51,7 @@ struct Parameters : public ParametersBase { // represents a matrix/vector embedding of a discrete set struct LookupParameters : public ParametersBase { friend class Model; + void scale_parameters(float a) override; void g_squared_l2norm(float* sqnorm) const override; size_t size() const override; void Initialize(unsigned index, const std::vector& val); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 33d53e702..c7d0c5818 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -134,13 +134,14 @@ void InnerProduct3D_1D::backward(const vector& xs, } } +size_t GaussianNoise::aux_storage_size() const { + return dim.size() * sizeof(float); +} + void GaussianNoise::forward(const vector& xs, Tensor& fx) const { - cerr << "FIX IMPL GaussianNoise::f\n"; abort(); -#if 0 - assert(xs.size() == 1); - const Tensor& x = *xs[0]; - return x + RandomNormal(Dim(x.rows(), x.cols()), 0, stddev); -#endif + Tensor m(dim, (float*)aux_mem); + TensorTools::RandomizeNormal(0, stddev, m); + (*fx) = **xs[0] + *m; } void GaussianNoise::backward(const vector& xs, @@ -148,21 +149,17 @@ void GaussianNoise::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - cerr << "FIX IMPL GaussianNoise::b\n"; abort(); -#if 0 - assert(i == 0); - return dEdf; -#endif + *dEdxi += *dEdf; }; +size_t Dropout::aux_storage_size() const { + return dim.size() * sizeof(float); +} + void Dropout::forward(const vector& xs, Tensor& fx) const { - cerr << "FIX IMPL Dropout::f\n"; abort(); -#if 0 - assert(xs.size() == 1); - const Tensor& x = *xs[0]; - noise_mask = RandomBernoulli(Dim(x.rows(), x.cols()), p); - return x.cwiseProduct(noise_mask); -#endif + Tensor m(dim, (float*)aux_mem); + TensorTools::RandomBernoulli(m, p); + (*fx) = (**xs[0]).cwiseProduct(*m); } void Dropout::backward(const vector& xs, @@ -170,11 +167,8 @@ void Dropout::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - cerr << "FIX IMPL Dropout::b\n"; abort(); -#if 0 - assert(i == 0); - return dEdf.cwiseProduct(noise_mask); -#endif + Tensor m(dim, (float*)aux_mem); + (*dEdxi) += (*dEdf).cwiseProduct(*m); }; void ConstantMinusX::forward(const vector& xs, Tensor& fx) const { diff --git a/cnn/nodes.h b/cnn/nodes.h index 6a61286d4..388ccf852 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -76,6 +76,7 @@ struct GaussianNoise : public Node { explicit GaussianNoise(const std::initializer_list& a, real stddev) : Node(a), stddev(stddev) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + size_t aux_storage_size() const override; void forward(const std::vector& xs, Tensor& fx) const override; void backward(const std::vector& xs, const Tensor& fx, @@ -90,13 +91,13 @@ struct Dropout : public Node { explicit Dropout(const std::initializer_list& a, real p) : Node(a), p(p) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + size_t aux_storage_size() const override; void forward(const std::vector& xs, Tensor& fx) const override; void backward(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; - //mutable Tensor noise_mask; + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; real p; }; diff --git a/cnn/tensor.cc b/cnn/tensor.cc index 2081e99f7..b76fcce6b 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -103,13 +103,17 @@ void TensorTools::Randomize(Tensor& d) { void TensorTools::RandomBernoulli(Tensor& val, real p) { bernoulli_distribution distribution(p); auto b = [&] (real) {return distribution(*rndeng);}; - *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); + Dim d({val.d.size()}); + Tensor tv(d, val.v); + *tv = Eigen::MatrixXf::NullaryExpr(d.size(), 1, b); } void TensorTools::RandomizeNormal(real mean, real stddev, Tensor& val) { normal_distribution distribution(mean, stddev); auto b = [&] (real) {return distribution(*rndeng);}; - *val = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); + Dim d({val.d.size()}); + Tensor tv(d, val.v); + *tv = Eigen::MatrixXf::NullaryExpr(d.size(), 1, b); } real rand01() { From 29cd2a729139f09c7c0bcb9c14468f791eb77671 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 11 Jun 2015 21:29:53 -0400 Subject: [PATCH 084/965] add l1 distance --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/nodes-common.cc | 15 +++++++++++++++ cnn/nodes.cc | 18 ++++++++++++++++++ cnn/nodes.h | 13 +++++++++++++ 5 files changed, 48 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index bc0e629b2..bb2b57674 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -39,6 +39,7 @@ Expression affine_transform(const std::initializer_list& xs) { Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} Expression squared_distance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } +Expression l1_distance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression binary_log_loss(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i,y.i})); } Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, m)); } diff --git a/cnn/expr.h b/cnn/expr.h index 90419c6eb..7a50c0924 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -45,6 +45,7 @@ Expression affine_transform(const std::initializer_list& xs); Expression cwise_multiply(const Expression& x, const Expression& y); Expression squared_distance(const Expression& x, const Expression& y); +Expression l1_distance(const Expression& x, const Expression& y); Expression binary_log_loss(const Expression& x, const Expression& y); Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 6f3ca0a03..70149ae8f 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -477,6 +477,21 @@ Dim Rectify::dim_forward(const vector& xs) const { return xs[0]; } +string L1Distance::as_string(const vector& arg_names) const { + ostringstream s; + s << "|| " << arg_names[0] << " - " << arg_names[1] << " ||^2"; + return s.str(); +} + +Dim L1Distance::dim_forward(const vector& xs) const { + assert(xs.size() == 2); + if (xs[0] != xs[1]) { + cerr << "Mismatched input dimensions in L1Distance: " << xs << endl; + abort(); + } + return Dim({1}); +} + string SquaredEuclideanDistance::as_string(const vector& arg_names) const { ostringstream s; s << "|| " << arg_names[0] << " - " << arg_names[1] << " ||^2"; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index c7d0c5818..d56e1e8b9 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -870,6 +870,24 @@ void Rectify::backward(const vector& xs, #endif } +void L1Distance::forward(const vector& xs, Tensor& fx) const { + assert(xs.size() == 2); + auto x = **xs[0]; + auto y = **xs[1]; + fx.v[0] = (x - y).lpNorm<1>(); +} + +void L1Distance::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + auto x = **xs[i]; + real scale = dEdf.v[0]; + cerr << "Implement L1Distance::backward()\n"; abort(); +} + void SquaredEuclideanDistance::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); #if HAVE_CUDA diff --git a/cnn/nodes.h b/cnn/nodes.h index 388ccf852..bddeb7178 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -385,6 +385,19 @@ struct SquaredEuclideanDistance : public Node { Tensor& dEdxi) const override; }; +// y = || x_1 - x_2 ||_1 +struct L1Distance : public Node { + explicit L1Distance(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = \sigma(x_1) struct LogisticSigmoid : public Node { explicit LogisticSigmoid(const std::initializer_list& a) : Node(a) {} From c36e949beee201551fa8a057af515dc04772766c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 12 Jun 2015 14:46:30 +0900 Subject: [PATCH 085/965] Added "Average" function --- cnn/nodes.cc | 27 +++++++++++++++++++++++++++ cnn/nodes.h | 13 +++++++++++++ 2 files changed, 40 insertions(+) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index d56e1e8b9..37f3f3c2a 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -228,6 +228,33 @@ void Sum::backward(const vector& xs, #endif }; +void Average::forward(const vector& xs, Tensor& fx) const { + const unsigned num_args = xs.size(); + if (num_args == 1) { + fx.v = xs[0]->v; + return; + } + auto res = *fx; + const unsigned remainder = num_args % 4; + switch (remainder) { + case 0: res.setZero(); break; + case 1: res = **xs[0]; break; + case 2: res = **xs[0] + **xs[1]; break; + case 3: res = **xs[0] + **xs[1] + **xs[2]; break; + } + for (unsigned i = remainder; i < num_args; i += 4) + res += **xs[i] + **xs[i+1] + **xs[i+2] + **xs[i+3]; + res /= num_args; +} + +void Average::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + *dEdxi += (*dEdf / xs.size()); +}; + void Tanh::forward(const vector& xs, Tensor& fx) const { #if HAVE_CUDA gpu::vtanh(fx.d.size(), xs[0]->v, fx.v); diff --git a/cnn/nodes.h b/cnn/nodes.h index bddeb7178..832137669 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -372,6 +372,19 @@ struct Sum : public Node { Tensor& dEdxi) const override; }; +// y = ( \sum_i x_i ) / |x| +struct Average : public Node { + template explicit Average(const T& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = || x_1 - x_2 ||^2 struct SquaredEuclideanDistance : public Node { explicit SquaredEuclideanDistance(const std::initializer_list& a) : Node(a) {} From 75f8cc32c6aa4310f0b8ac9470996364b386cf53 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 12 Jun 2015 14:48:12 +0900 Subject: [PATCH 086/965] Added missing functions in nodes-common.cc --- cnn/nodes-common.cc | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 70149ae8f..457f56aa9 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -135,6 +135,25 @@ Dim Sum::dim_forward(const vector& xs) const { return xs[0]; } +string Average::as_string(const vector& arg_names) const { + ostringstream s; + s << "average(" << arg_names[0]; + for (unsigned i = 1; i < arg_names.size(); ++i) + s << ", " << arg_names[i]; + s << ")"; + return s.str(); +} + +Dim Average::dim_forward(const vector& xs) const { + for (unsigned i = 1; i < xs.size(); ++i) { + if (xs[0] != xs[1]) { + cerr << "Mismatched input dimensions in Average: " << xs << endl; + abort(); + } + } + return xs[0]; +} + string Tanh::as_string(const vector& arg_names) const { ostringstream s; s << "tanh(" << arg_names[0] << ')'; From 1e6dd243190e354ed010cc4a06651e33047f23eb Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 12 Jun 2015 14:52:00 +0900 Subject: [PATCH 087/965] Made final_h return h0 if the sequence is empty --- cnn/lstm.h | 2 +- cnn/rnn.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/lstm.h b/cnn/lstm.h index 0b827c77c..7ab7726a3 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -23,7 +23,7 @@ struct LSTMBuilder : public RNNBuilder { c.pop_back(); } Expression back() const { return h.back().back(); } - std::vector final_h() const { return h.back(); } + std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; diff --git a/cnn/rnn.h b/cnn/rnn.h index 60ba65cf1..f69c71e36 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -70,7 +70,7 @@ struct SimpleRNNBuilder : public RNNBuilder { public: void rewind_one_step() { h.pop_back(); } Expression back() const { return h.back().back(); } - std::vector final_h() const { return h.back(); } + std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } private: // first index is layer, then x2h h2h hb From 85718cc3f5f81f2668d3dbe8c31b07e1b9ed87ac Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 12 Jun 2015 15:18:16 +0900 Subject: [PATCH 088/965] Added the final_s function to RNN/LSTM --- cnn/lstm.h | 5 +++++ cnn/rnn.h | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/cnn/lstm.h b/cnn/lstm.h index 7ab7726a3..ca944128e 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -24,6 +24,11 @@ struct LSTMBuilder : public RNNBuilder { } Expression back() const { return h.back().back(); } std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } + std::vector final_s() const { + std::vector ret = (c.size() == 0 ? c0 : c.back()); + for(auto my_h : final_h()) ret.push_back(my_h); + return ret; + } protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; diff --git a/cnn/rnn.h b/cnn/rnn.h index f69c71e36..a0cce20fb 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -44,8 +44,11 @@ struct RNNBuilder { virtual void rewind_one_step() = 0; // returns node (index) of most recent output virtual Expression back() const = 0; - // access hidden state contents + // access the final output of each hidden layer virtual std::vector final_h() const = 0; + // access the state of each hidden layer, in a format that can be used in + // start_new_sequence + virtual std::vector final_s() const = 0; protected: virtual void new_graph_impl(ComputationGraph& cg) = 0; virtual void start_new_sequence_impl(const std::vector& h_0) = 0; @@ -71,6 +74,7 @@ struct SimpleRNNBuilder : public RNNBuilder { void rewind_one_step() { h.pop_back(); } Expression back() const { return h.back().back(); } std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } + std::vector final_s() const { return final_h(); } private: // first index is layer, then x2h h2h hb From 49dfd48aa7e85b2afd8e62302120c653cafad39d Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 12 Jun 2015 21:35:50 +0900 Subject: [PATCH 089/965] Added average to expression --- cnn/expr.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cnn/expr.h b/cnn/expr.h index 7a50c0924..1ab848d60 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -63,6 +63,14 @@ Expression sum(const T& xs) { return Expression(pg, pg->add_function(xis)); } +template +Expression average(const T& xs) { + ComputationGraph *pg = xs.begin()->pg; + std::vector xis(xs.size()); + for (int i=0; iadd_function(xis)); +} + template Expression concatenate_cols(const T& xs) { ComputationGraph *pg = xs.begin()->pg; From 78363d038b9532c1d7a084a7598c769dfabeb33f Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 12 Jun 2015 11:42:05 -0400 Subject: [PATCH 090/965] support const lookups in new interface --- cnn/cnn.cc | 2 +- cnn/cnn.h | 2 +- cnn/expr.cc | 3 +++ cnn/expr.h | 2 ++ 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 8e04e6d2e..beb3096eb 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -80,7 +80,7 @@ VariableIndex ComputationGraph::add_lookup(LookupParameters* p, unsigned index) return new_node_index; } -VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, unsigned* pindex) { +VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, const unsigned* pindex) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, pindex); // get rid of the following in favor of using parameter_nodes to see the needs_derivative diff --git a/cnn/cnn.h b/cnn/cnn.h index 5f99dbf46..a3cebce5a 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -62,7 +62,7 @@ struct ComputationGraph { VariableIndex add_lookup(LookupParameters* p, const unsigned* pindex); VariableIndex add_lookup(LookupParameters* p, unsigned index); // just like add_lookup, but don't optimize the lookup parameters - VariableIndex add_const_lookup(LookupParameters* p, unsigned* pindex); + VariableIndex add_const_lookup(LookupParameters* p, const unsigned* pindex); VariableIndex add_const_lookup(LookupParameters* p, unsigned index); // COMPUTATIONS diff --git a/cnn/expr.cc b/cnn/expr.cc index bb2b57674..ee8d50093 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -10,6 +10,8 @@ Expression input(ComputationGraph& g, const Dim& d, const std::vector* pd Expression parameter(ComputationGraph& g, Parameters* p) { return Expression(&g, g.add_parameters(p)); } Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index) { return Expression(&g, g.add_lookup(p, index)); } Expression lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex) { return Expression(&g, g.add_lookup(p, pindex)); } +Expression const_lookup(ComputationGraph& g, LookupParameters* p, unsigned index) { return Expression(&g, g.add_const_lookup(p, index)); } +Expression const_lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex) { return Expression(&g, g.add_const_lookup(p, pindex)); } Expression operator-(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression operator+(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } @@ -39,6 +41,7 @@ Expression affine_transform(const std::initializer_list& xs) { Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} Expression squared_distance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } +//Expression huber_distance(const Expression& x, const Expression& y, real d) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, d)); } Expression l1_distance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression binary_log_loss(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i,y.i})); } Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, m)); } diff --git a/cnn/expr.h b/cnn/expr.h index 1ab848d60..06ad50b9f 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -20,6 +20,8 @@ Expression input(ComputationGraph& g, const Dim& d, const std::vector* pd Expression parameter(ComputationGraph& g, Parameters* p); Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index); Expression lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex); +Expression const_lookup(ComputationGraph& g, LookupParameters* p, unsigned index); +Expression const_lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex); Expression operator-(const Expression& x); Expression operator+(const Expression& x, const Expression& y); From 90ccc87b711ec6176abac1a81515e50995784d0b Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 13 Jun 2015 12:55:59 -0400 Subject: [PATCH 091/965] enable restricted softmax --- cnn/expr.cc | 1 + cnn/expr.h | 1 + 2 files changed, 2 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index ee8d50093..9ca1bd8f3 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -26,6 +26,7 @@ Expression exp(const Expression& x) { return Expression(x.pg, x.pg->add_function Expression logistic(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression rectify(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression log_softmax(const Expression& x, const std::vector& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } Expression softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression softsign(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression noise(const Expression& x, real stddev) { return Expression(x.pg, x.pg->add_function({x.i}, stddev)); } diff --git a/cnn/expr.h b/cnn/expr.h index 06ad50b9f..7dbf5c79e 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -38,6 +38,7 @@ Expression log(const Expression& x); Expression logistic(const Expression& x); Expression rectify(const Expression& x); Expression log_softmax(const Expression& x); +Expression log_softmax(const Expression& x, const std::vector& restriction); Expression softmax(const Expression& x); Expression softsign(const Expression& x); Expression noise(const Expression& x, real stddev); From 2422212db362d840d005837e37c9b669dbff3b3b Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 13 Jun 2015 15:49:48 -0400 Subject: [PATCH 092/965] support for reshape and transpose --- cnn/dim.h | 7 ++++++- cnn/expr.cc | 3 +++ cnn/expr.h | 3 +++ cnn/nodes-common.cc | 15 +++++++++++++-- cnn/nodes.cc | 18 +++++++++++++++++- cnn/nodes.h | 22 +++++++++++++++++----- 6 files changed, 59 insertions(+), 9 deletions(-) diff --git a/cnn/dim.h b/cnn/dim.h index e37adcf38..831104238 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -3,6 +3,7 @@ #include #include +#include #include #include #include @@ -35,7 +36,11 @@ struct Dim { inline int cols() const { return nd > 1 ? d[1] : 1; } inline int operator[](unsigned i) const { return i < nd ? d[i] : 1; } inline int size(unsigned i) const { return (*this)[i]; } - inline Dim transpose() const { return Dim(d[1],d[0]); } + inline Dim transpose() const { + if (nd == 1) { return Dim(1, d[0]); } + else if (nd == 2) { return Dim(d[1], d[0]); } + throw std::invalid_argument("Cannot transpose Dim object with more than 2 dimensions"); + } unsigned short d[CNN_MAX_TENSOR_DIM]; unsigned short nd; private: diff --git a/cnn/expr.cc b/cnn/expr.cc index 9ca1bd8f3..453a6a279 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -32,6 +32,9 @@ Expression softsign(const Expression& x) { return Expression(x.pg, x.pg->add_fun Expression noise(const Expression& x, real stddev) { return Expression(x.pg, x.pg->add_function({x.i}, stddev)); } Expression dropout(const Expression& x, real p) { return Expression(x.pg, x.pg->add_function({x.i}, p)); } +Expression reshape(const Expression& x, const Dim& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } +Expression transpose(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } + Expression affine_transform(const std::initializer_list& xs) { ComputationGraph *pg = xs.begin()->pg; std::vector xis(xs.size()); diff --git a/cnn/expr.h b/cnn/expr.h index 7dbf5c79e..19525d9cf 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -44,6 +44,9 @@ Expression softsign(const Expression& x); Expression noise(const Expression& x, real stddev); Expression dropout(const Expression& x, real p); +Expression reshape(const Expression& x, const Dim& d); +Expression transpose(const Expression& x); + Expression affine_transform(const std::initializer_list& xs); Expression cwise_multiply(const Expression& x, const Expression& y); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 457f56aa9..8daa1e872 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -17,15 +17,26 @@ inline bool LooksLikeVector(const Dim& d) { return true; } +string Transpose::as_string(const vector& arg_names) const { + ostringstream s; + s << arg_names[0] << "^T"; + return s.str(); +} + +Dim Transpose::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0].transpose(); +} + string Reshape::as_string(const vector& arg_names) const { ostringstream s; - s << "reshape(" << arg_names[0] << ',' << from << " --> " << to << ')'; + s << "reshape(" << arg_names[0] << " --> " << to << ')'; return s.str(); } Dim Reshape::dim_forward(const vector& xs) const { assert(xs.size() == 1); - assert(xs[0] == from); + assert(xs[0].size() == to.size()); return to; } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 37f3f3c2a..3147a8496 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -29,6 +29,22 @@ using namespace std; namespace cnn { +void Transpose::forward(const vector& xs, Tensor& fx) const { + if (dim.rows() == 1 || dim.cols() == 1) { + fx.v = xs[0]->v; + } else { + *fx = (**xs[0]).transpose(); + } +} + +void Transpose::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + *dEdxi += (*dEdf).transpose(); +} + void Reshape::forward(const vector& xs, Tensor& fx) const { // just point to the input memory and change dimensions // dimensions are handled by forward_dim @@ -40,7 +56,7 @@ void Reshape::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - const Tensor reshaped(from, dEdf.v); + const Tensor reshaped(dEdxi.d, dEdf.v); *dEdxi += *reshaped; } diff --git a/cnn/nodes.h b/cnn/nodes.h index 832137669..b44577450 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -5,11 +5,24 @@ namespace cnn { -// y = reshape(x_1, from --> to) +// y = x_1^T +// NOTE: if you have a column or row vector as input, runtime is constant +// if you have a matrix as input, the runtime is O(mn) - try to avoid using this +struct Transpose : public Node { + explicit Transpose(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + +// y = reshape(x_1, --> to) struct Reshape : public Node { - explicit Reshape(const std::initializer_list& a, const Dim& from, const Dim& to) : Node(a), from(from), to(to) { - assert(from.size() == to.size()); - } + explicit Reshape(const std::initializer_list& a, const Dim& to) : Node(a), to(to) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -18,7 +31,6 @@ struct Reshape : public Node { const Tensor& dEdf, unsigned i, Tensor& dEdxi) const override; - Dim from; Dim to; }; From 28fe602df622a5417c50ea49ba06ab9c1a0dd9fe Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 13 Jun 2015 16:32:30 -0400 Subject: [PATCH 093/965] tagging example supports non-tag tokens --- examples/tag-bilstm.cc | 80 +++++++++++++++++++++++++++--------------- 1 file changed, 51 insertions(+), 29 deletions(-) diff --git a/examples/tag-bilstm.cc b/examples/tag-bilstm.cc index 56386634c..c43a4997e 100644 --- a/examples/tag-bilstm.cc +++ b/examples/tag-bilstm.cc @@ -18,16 +18,19 @@ using namespace std; using namespace cnn; -unsigned LAYERS = 2; -unsigned INPUT_DIM = 32; -unsigned HIDDEN_DIM = 64; +float pdrop = 0.5; +unsigned LAYERS = 1; +unsigned INPUT_DIM = 128; +unsigned HIDDEN_DIM = 128; unsigned TAG_HIDDEN_DIM = 32; -unsigned TAG_DIM = 24; +unsigned TAG_DIM = 32; unsigned TAG_SIZE = 0; unsigned VOCAB_SIZE = 0; +bool eval = false; cnn::Dict d; cnn::Dict td; +int kNONE; int kSOS; int kEOS; @@ -55,7 +58,7 @@ struct RNNLanguageModel { } // return Expression of total loss - Expression BuildTaggingGraph(const vector& sent, const vector& tags, ComputationGraph& cg, double* cor = 0) { + Expression BuildTaggingGraph(const vector& sent, const vector& tags, ComputationGraph& cg, double* cor = 0, unsigned* ntagged = 0) { const unsigned slen = sent.size(); l2rbuilder.new_graph(cg); // reset RNN builder for new graph l2rbuilder.start_new_sequence(); @@ -75,6 +78,7 @@ struct RNNLanguageModel { l2rbuilder.add_input(lookup(cg, p_w, kSOS)); for (unsigned t = 0; t < slen; ++t) { i_words[t] = lookup(cg, p_w, sent[t]); + if (!eval) { i_words[t] = noise(i_words[t], 0.1); } fwds[t] = l2rbuilder.add_input(i_words[t]); } @@ -84,18 +88,25 @@ struct RNNLanguageModel { revs[slen - t - 1] = r2lbuilder.add_input(i_words[slen - t - 1]); for (unsigned t = 0; t < slen; ++t) { - Expression i_t = i_th2t * tanh(i_l2th * fwds[t] + i_r2th * revs[t] + i_thbias) + i_tbias; - if (cor) { - vector dist = as_vector(cg.incremental_forward()); - double best = -9e99; - int besti = -1; - for (int i = 0; i < dist.size(); ++i) { - if (dist[i] > best) { best = dist[i]; besti = i; } + if (tags[t] != kNONE) { + if (ntagged) (*ntagged)++; + Expression i_th = tanh(affine_transform({i_thbias, i_l2th, fwds[t], i_r2th, revs[t]})); + //if (!eval) { i_th = dropout(i_th, pdrop); } + Expression i_t = affine_transform({i_tbias, i_th2t, i_th}); + if (cor) { + vector dist = as_vector(cg.incremental_forward()); + double best = -9e99; + int besti = -1; + for (int i = 0; i < dist.size(); ++i) { + if (dist[i] > best) { best = dist[i]; besti = i; } + } + if (tags[t] == besti) (*cor)++; + } + if (tags[t] != kNONE) { + Expression i_err = pickneglogsoftmax(i_t, tags[t]); + errs.push_back(i_err); } - if (tags[t] == besti) (*cor)++; } - Expression i_err = pickneglogsoftmax(i_t, tags[t]); - errs.push_back(i_err); } return sum(errs); } @@ -107,6 +118,7 @@ int main(int argc, char** argv) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; } + kNONE = td.Convert("*"); kSOS = d.Convert(""); kEOS = d.Convert(""); vector,vector>> training, dev; @@ -119,11 +131,19 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++tlc; + int nc = 0; vector x,y; ReadSentencePair(line, &x, &d, &y, &td); assert(x.size() == y.size()); if (x.size() == 0) { cerr << line << endl; abort(); } training.push_back(make_pair(x,y)); + for (unsigned i = 0; i < y.size(); ++i) { + if (y[i] != kNONE) { ++nc; } + } + if (nc == 0) { + cerr << "No tagged tokens in line " << tlc << endl; + abort(); + } ttoks += x.size(); } cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; @@ -161,12 +181,12 @@ int main(int argc, char** argv) { double best = 9e+99; Model model; - bool use_momentum = false; + bool use_momentum = true; Trainer* sgd = nullptr; - //if (use_momentum) - // sgd = new MomentumSGDTrainer(&model); - //else - sgd = new SimpleSGDTrainer(&model); + if (use_momentum) + sgd = new MomentumSGDTrainer(&model); + else + sgd = new SimpleSGDTrainer(&model); RNNLanguageModel lm(model); //RNNLanguageModel lm(model); @@ -188,7 +208,7 @@ int main(int argc, char** argv) { while(1) { Timer iteration("completed in"); double loss = 0; - unsigned chars = 0; + unsigned ttags = 0; double correct = 0; for (unsigned i = 0; i < report_every_i; ++i) { if (si == training.size()) { @@ -201,36 +221,38 @@ int main(int argc, char** argv) { // build graph for this instance ComputationGraph cg; auto& sent = training[order[si]]; - chars += sent.first.size(); ++si; - lm.BuildTaggingGraph(sent.first, sent.second, cg, &correct); + lm.BuildTaggingGraph(sent.first, sent.second, cg, &correct, &ttags); loss += as_scalar(cg.forward()); cg.backward(); - sgd->update(); + sgd->update(1.0); ++lines; } sgd->status(); - cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << " (acc=" << (correct / chars) << ") "; + cerr << " E = " << (loss / ttags) << " ppl=" << exp(loss / ttags) << " (acc=" << (correct / ttags) << ") "; // show score on dev data? report++; if (report % dev_every_i_reports == 0) { double dloss = 0; - int dchars = 0; + unsigned dtags = 0; double dcorr = 0; + eval = true; + //lm.p_th2t->scale_parameters(pdrop); for (auto& sent : dev) { ComputationGraph cg; - lm.BuildTaggingGraph(sent.first, sent.second, cg, &dcorr); + lm.BuildTaggingGraph(sent.first, sent.second, cg, &dcorr, &dtags); dloss += as_scalar(cg.forward()); - dchars += sent.first.size(); } + //lm.p_th2t->scale_parameters(1/pdrop); + eval = false; if (dloss < best) { best = dloss; ofstream out(fname); boost::archive::text_oarchive oa(out); oa << model; } - cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << " acc=" << (dcorr / dchars) << ' '; + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dtags) << " ppl=" << exp(dloss / dtags) << " acc=" << (dcorr / dtags) << ' '; } } delete sgd; From 8f06e990886794197ca2af7fe81a0e08754df949 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 14 Jun 2015 14:37:23 +0900 Subject: [PATCH 094/965] Fixed include to "stdexcept" --- cnn/dim.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/dim.h b/cnn/dim.h index 831104238..0985c50e3 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -3,7 +3,7 @@ #include #include -#include +#include #include #include #include From 1fbb86893ae1eef238266bca0891d268764518c7 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 14 Jun 2015 17:01:41 -0400 Subject: [PATCH 095/965] dot product --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/nodes-common.cc | 14 ++++++++++++++ cnn/nodes.cc | 12 ++++++++++++ cnn/nodes.h | 13 +++++++++++++ 5 files changed, 41 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index 453a6a279..2b9b306ff 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -44,6 +44,7 @@ Expression affine_transform(const std::initializer_list& xs) { } Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} +Expression dot_product(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression squared_distance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } //Expression huber_distance(const Expression& x, const Expression& y, real d) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, d)); } Expression l1_distance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 19525d9cf..652294e59 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -50,6 +50,7 @@ Expression transpose(const Expression& x); Expression affine_transform(const std::initializer_list& xs); Expression cwise_multiply(const Expression& x, const Expression& y); +Expression dot_product(const Expression& x, const Expression& y); Expression squared_distance(const Expression& x, const Expression& y); Expression l1_distance(const Expression& x, const Expression& y); Expression binary_log_loss(const Expression& x, const Expression& y); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 8daa1e872..b44b199fb 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -17,6 +17,20 @@ inline bool LooksLikeVector(const Dim& d) { return true; } +string DotProduct::as_string(const vector& arg_names) const { + ostringstream s; + s << arg_names[0] << "^T . " << arg_names[1]; + return s.str(); +} + +Dim DotProduct::dim_forward(const vector& xs) const { + assert(xs.size() == 2); + assert(LooksLikeVector(xs[0])); + assert(LooksLikeVector(xs[1])); + assert(xs[0].rows() == xs[1].rows()); + return Dim({1}); +} + string Transpose::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0] << "^T"; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 3147a8496..f75b58200 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -29,6 +29,18 @@ using namespace std; namespace cnn { +void DotProduct::forward(const vector& xs, Tensor& fx) const { + *fx = (**xs[0]).transpose() * (**xs[1]); +} + +void DotProduct::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + (*dEdxi) += (dEdf.v[0]) * (**xs[1 - i]); +} + void Transpose::forward(const vector& xs, Tensor& fx) const { if (dim.rows() == 1 || dim.cols() == 1) { fx.v = xs[0]->v; diff --git a/cnn/nodes.h b/cnn/nodes.h index b44577450..6de3d17d9 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -5,6 +5,19 @@ namespace cnn { +// y = x_1^T . x_2 +struct DotProduct : public Node { + explicit DotProduct(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = x_1^T // NOTE: if you have a column or row vector as input, runtime is constant // if you have a matrix as input, the runtime is O(mn) - try to avoid using this From 3f0aa5424040049605da9b17a33f414bf09e6b02 Mon Sep 17 00:00:00 2001 From: armatthews Date: Tue, 16 Jun 2015 13:50:55 -0400 Subject: [PATCH 096/965] added ability to serialize dicts --- cnn/dict.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cnn/dict.h b/cnn/dict.h index 0550b6c9e..8b5a6d7e8 100644 --- a/cnn/dict.h +++ b/cnn/dict.h @@ -7,6 +7,11 @@ #include #include +#include +#include +#include +#include + namespace cnn { class Dict { @@ -44,6 +49,13 @@ class Dict { bool frozen; std::vector words_; Map d_; + + friend class boost::serialization::access; + template void serialize(Archive& ar, const unsigned int) { + ar & frozen; + ar & words_; + ar & d_; + } }; std::vector ReadSentence(const std::string& line, Dict* sd); From 8a2037e92db1255021232a820f942d2ea1b39914 Mon Sep 17 00:00:00 2001 From: armatthews Date: Tue, 16 Jun 2015 13:52:07 -0400 Subject: [PATCH 097/965] Added Adagrad and Adadelta trainers --- cnn/training.cc | 109 ++++++++++++++++++++++++++++++++++++++++++++++++ cnn/training.h | 25 +++++++++++ 2 files changed, 134 insertions(+) diff --git a/cnn/training.cc b/cnn/training.cc index 0719fb20e..f6cd0a362 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -77,6 +77,115 @@ void MomentumSGDTrainer::update(real scale) { ++updates; } +void AdagradTrainer::update(real scale) { + unsigned pi; + if (!shadow_params_allocated) { + vp = AllocateShadowParameters(*model); + vlp = AllocateShadowLookupParameters(*model); + shadow_params_allocated = true; + } + + pi = 0; + const float gscale = clip_gradients(); + for (auto p : model->parameters_list()) { + Tensor& v = vp[pi++].h; + auto reg = (*p->values) * lambda; + auto g2 = (*p->g).cwiseProduct(*p->g); + (*v) += g2; + auto delta = -(eta * scale * gscale) * (*p->g).cwiseQuotient(((*v).array() + epsilon).matrix().cwiseSqrt()); + *p->values += delta - reg; + p->clear(); + } + + pi = 0; + for (auto p : model->lookup_parameters_list()) { + vector& vx = vlp[pi++].h; + for (auto i : p->non_zero_grads) { + Tensor& v = vx[i]; + auto reg = (*p->values[i]) * lambda; + auto g2 = (*p->grads[i]).cwiseProduct(*p->grads[i]); + (*v) += g2; + auto delta = -(eta * scale * gscale) * (*p->grads[i]).cwiseQuotient(((*v).array() + epsilon).matrix().cwiseSqrt()); + *p->values[i] += delta - reg; + } + p->clear(); + } + + ++updates; +} + +void AdadeltaTrainer::update(real scale) { + unsigned pi; + if (!shadow_params_allocated) { + hg = AllocateShadowParameters(*model); + hlg = AllocateShadowLookupParameters(*model); + hd = AllocateShadowParameters(*model); + hld = AllocateShadowLookupParameters(*model); + + /*pi = 0; + for (auto p : model->parameters_list()) { + TensorTools::Constant(hg[pi].h, epsilon); + TensorTools::Constant(hd[pi].h, epsilon); + ++pi; + } + + pi = 0; + for (auto p : model->lookup_parameters_list()) { + vector& hgx = hlg[pi].h; + vector& hdx = hld[pi].h; + for (unsigned i = 0; i < hgx.size(); ++i) { + TensorTools::Constant(hgx[i], epsilon); + TensorTools::Constant(hdx[i], epsilon); + } + ++pi; + }*/ + + shadow_params_allocated = true; + } + + const float gscale = clip_gradients(); + pi = 0; + for (auto p : model->parameters_list()) { + auto& g = (scale * gscale) * *p->g; + Tensor& hgv = hg[pi].h; + Tensor& hdv = hd[pi].h; + auto reg = (*p->values) * lambda; + auto g2 = g.cwiseProduct(g); + *hgv = rho * *hgv + (1.0 - rho) * g2; + auto num = -g.cwiseProduct(((*hdv).array() + epsilon).matrix().cwiseSqrt()); + auto den = ((*hgv).array() + epsilon).matrix().cwiseSqrt(); + auto delta = num.cwiseQuotient(den); + auto d2 = delta.cwiseProduct(delta); + *hdv = rho * *hdv + (1.0 - rho) * d2; + *p->values += delta - reg; + p->clear(); + pi++; + } + + pi = 0; + for (auto p : model->lookup_parameters_list()) { + vector& hgvx = hlg[pi].h; + vector& hdvx = hld[pi].h; + for (auto i : p->non_zero_grads) { + Tensor& hgv = hgvx[i]; + Tensor& hdv = hdvx[i]; + auto& g = scale * gscale * *p->grads[i]; + auto reg = (*p->values[i]) * lambda; + auto g2 = g.cwiseProduct(g); + *hgv = rho * *hgv + (1.0 - rho) * g2; + auto num = -g.cwiseProduct(((*hdv).array() + epsilon).matrix().cwiseSqrt()); + auto den = ((*hgv).array() + epsilon).matrix().cwiseSqrt(); + auto delta = num.cwiseQuotient(den); + auto d2 = delta.cwiseProduct(delta); + *hdv = rho * *hdv + (1.0 - rho) * d2; + *p->values[i] += delta - reg; + } + p->clear(); + pi++; + } + ++updates; +} + #if 0 void RMSPropTrainer::update(real scale) { for (auto p : params) { diff --git a/cnn/training.h b/cnn/training.h index 9161ef26d..b4aa9b2e8 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -65,6 +65,31 @@ struct MomentumSGDTrainer : public Trainer { //std::unordered_map> vl; }; +struct AdagradTrainer : public Trainer { + explicit AdagradTrainer(Model* m, real lam = 1e-6, real e0 = 0.1, real eps = 1e-20) : + Trainer(m, lam, e0), epsilon(eps), shadow_params_allocated(false) {} + void update(real scale) override; + + real epsilon; + bool shadow_params_allocated; + std::vector vp; + std::vector vlp; +}; + +struct AdadeltaTrainer : public Trainer { + explicit AdadeltaTrainer(Model* m, real lam = 1e-6, real eps = 1e-6, real rho = 0.95) : + Trainer(m, lam, 1.0), epsilon(eps), rho(rho), shadow_params_allocated(false) {} + void update(real scale) override; + + real epsilon; + real rho; + bool shadow_params_allocated; + std::vector hg; // History of gradients + std::vector hlg; + std::vector hd; // History of deltas + std::vector hld; +}; + } // namespace cnn #endif From 8569ec06a31ed8d67a57aab751bdea47a5703ce4 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 16 Jun 2015 18:28:24 -0400 Subject: [PATCH 098/965] add huber loss --- cnn/expr.cc | 2 +- cnn/expr.h | 1 + cnn/functors.h | 22 ++++++++++++++++++++++ cnn/nodes-common.cc | 17 ++++++++++++++++- cnn/nodes.cc | 19 ++++++++++++++++++- cnn/nodes.h | 14 ++++++++++++++ 6 files changed, 72 insertions(+), 3 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index 2b9b306ff..d2da32530 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -46,7 +46,7 @@ Expression cwise_multiply(const Expression& x, const Expression& y) {return Expr Expression dot_product(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression squared_distance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } -//Expression huber_distance(const Expression& x, const Expression& y, real d) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, d)); } +Expression huber_distance(const Expression& x, const Expression& y, real c) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, c)); } Expression l1_distance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression binary_log_loss(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i,y.i})); } Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, m)); } diff --git a/cnn/expr.h b/cnn/expr.h index 652294e59..c1e59f38e 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -52,6 +52,7 @@ Expression cwise_multiply(const Expression& x, const Expression& y); Expression dot_product(const Expression& x, const Expression& y); Expression squared_distance(const Expression& x, const Expression& y); +Expression huber_distance(const Expression& x, const Expression& y, float c = 1.345f); Expression l1_distance(const Expression& x, const Expression& y); Expression binary_log_loss(const Expression& x, const Expression& y); Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0); diff --git a/cnn/functors.h b/cnn/functors.h index d322caf36..15f3deec9 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -14,6 +14,28 @@ namespace cnn { +struct FHuberForward { + FHuberForward(float c) : c(c) {} + CNN_DEVICE_FUNC inline float operator()(float x) const { + const float a = fabs(x); + return (a < c) ? x*x : c*(2*a - c); + } + const float c; +}; + +template int sgn(T val) { + return (T(0) < val) - (val < T(0)); +} + +struct FHuberBackward { + FHuberBackward(float c) : c(c) {} + CNN_DEVICE_FUNC inline float operator()(float x, float d) const { + const float a = fabs(x); + return (2 * d) * ((a < c) ? x : c * sgn(x)); + } + const float c; +}; + struct FProduct { CNN_DEVICE_FUNC inline float operator()(float a, float b) const { return a * b; diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index b44b199fb..ba3ecee29 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -521,9 +521,24 @@ Dim Rectify::dim_forward(const vector& xs) const { return xs[0]; } +string HuberDistance::as_string(const vector& arg_names) const { + ostringstream s; + s << "|| " << arg_names[0] << " - " << arg_names[1] << " ||_H(" << d << ')'; + return s.str(); +} + +Dim HuberDistance::dim_forward(const vector& xs) const { + assert(xs.size() == 2); + if (xs[0] != xs[1]) { + cerr << "Mismatched input dimensions in HuberDistance: " << xs << endl; + abort(); + } + return Dim({1}); +} + string L1Distance::as_string(const vector& arg_names) const { ostringstream s; - s << "|| " << arg_names[0] << " - " << arg_names[1] << " ||^2"; + s << "|| " << arg_names[0] << " - " << arg_names[1] << " ||_1"; return s.str(); } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index f75b58200..8e3d36c3a 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -2,7 +2,6 @@ #include #include -#include #include "cnn/functors.h" #if HAVE_CUDA @@ -925,6 +924,24 @@ void Rectify::backward(const vector& xs, #endif } +void HuberDistance::forward(const vector& xs, Tensor& fx) const { + assert(xs.size() == 2); + auto x = **xs[0]; + auto y = **xs[1]; + *fx = (x - y).unaryExpr(FHuberForward(d)); +} + +void HuberDistance::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + auto x = **xs[i]; + auto y = **xs[1-i]; + *dEdxi += (x - y).binaryExpr(*dEdf, FHuberBackward(d)); +} + void L1Distance::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); auto x = **xs[0]; diff --git a/cnn/nodes.h b/cnn/nodes.h index 6de3d17d9..afc9c7067 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -423,6 +423,20 @@ struct SquaredEuclideanDistance : public Node { Tensor& dEdxi) const override; }; +// y = || x_1 - x_2 ||_H(d) +struct HuberDistance : public Node { + explicit HuberDistance(const std::initializer_list& a, float d = 1.345f) : Node(a), d(d) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; + float d; +}; + // y = || x_1 - x_2 ||_1 struct L1Distance : public Node { explicit L1Distance(const std::initializer_list& a) : Node(a) {} From ad436a0867b7fe3c5d0e637cbeb917bc93b4a409 Mon Sep 17 00:00:00 2001 From: armatthews Date: Wed, 17 Jun 2015 03:03:44 -0400 Subject: [PATCH 099/965] Only allow dict serialization if Boost version is >= 1.56 --- cnn/dict.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cnn/dict.h b/cnn/dict.h index 8b5a6d7e8..8b94dd3e3 100644 --- a/cnn/dict.h +++ b/cnn/dict.h @@ -7,10 +7,12 @@ #include #include +#if BOOSTVERSION >= 105600 #include #include #include #include +#endif namespace cnn { @@ -50,12 +52,14 @@ class Dict { std::vector words_; Map d_; +#if BOOST_VERSION >= 105600 friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { ar & frozen; ar & words_; ar & d_; } +#endif }; std::vector ReadSentence(const std::string& line, Dict* sd); From f971bb4ba702f1dd5630b409635adeaa8cf9eb6d Mon Sep 17 00:00:00 2001 From: armatthews Date: Wed, 17 Jun 2015 03:19:08 -0400 Subject: [PATCH 100/965] minor corrections --- cnn/dict.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cnn/dict.h b/cnn/dict.h index 8b94dd3e3..9c93904ff 100644 --- a/cnn/dict.h +++ b/cnn/dict.h @@ -7,7 +7,8 @@ #include #include -#if BOOSTVERSION >= 105600 +#include +#if BOOST_VERSION >= 105600 #include #include #include From c7c779cc22e992242dfb062ff67057a8f0b2b511 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 18 Jun 2015 13:28:44 +0900 Subject: [PATCH 101/965] Added CUDA versions of concatenate columns etc. --- cnn/nodes.cc | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 8e3d36c3a..729fcacf8 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -44,7 +44,12 @@ void Transpose::forward(const vector& xs, Tensor& fx) const { if (dim.rows() == 1 || dim.cols() == 1) { fx.v = xs[0]->v; } else { +#if HAVE_CUDA + CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, fx.d.rows(), fx.d.cols(), + kSCALAR_ONE, xs[0]->v, fx.d.rows(), kSCALAR_ZERO, NULL, fx.d.rows(), fx.v, fx.d.rows())); +#else *fx = (**xs[0]).transpose(); +#endif } } @@ -53,7 +58,12 @@ void Transpose::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#if HAVE_CUDA + CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols(), + kSCALAR_ONE, dEdf.v, dEdxi.d.rows(), kSCALAR_ONE, NULL, dEdxi.d.rows(), dEdxi.v, dEdxi.d.rows())); +#else *dEdxi += (*dEdf).transpose(); +#endif } void Reshape::forward(const vector& xs, Tensor& fx) const { @@ -381,8 +391,16 @@ void Concatenate::backward(const vector& xs, } void ConcatenateColumns::forward(const vector& xs, Tensor& fx) const { - for (unsigned i = 0; i < xs.size(); ++i) + for (unsigned i = 0; i < xs.size(); ++i) { +#if HAVE_CUDA + // CUBLAS matricies are column-major, so just copy the memory + auto & xi = *xs[i]; + const unsigned rows = xi.d.rows(); + CUDA_CHECK(cudaMemcpyAsync(&fx.v[i*rows], &xi.v[0], sizeof(float) * rows, cudaMemcpyDeviceToDevice)); +#else (*fx).col(i) = **xs[i]; +#endif + } } void ConcatenateColumns::backward(const vector& xs, @@ -390,7 +408,13 @@ void ConcatenateColumns::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#if HAVE_CUDA + const unsigned rows = dEdxi.d.rows(); + const unsigned begin = i*rows; + CUBLAS_CHECK(cublasSaxpy(cublas_handle, rows, kSCALAR_ONE, &dEdf.v[begin], 1, dEdxi.v, 1)); +#else *dEdxi += (*dEdf).col(i); +#endif } void PairwiseRankLoss::forward(const vector& xs, Tensor& fx) const { From d50b6e0bef731bd2525c8d6e37b97ef525da5abb Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 18 Jun 2015 14:46:48 +0900 Subject: [PATCH 102/965] (slightly ugly?) GPU impl of softmax backward --- cnn/gpu-ops.cu | 30 ++++++++++++++++++++++++++++++ cnn/gpu-ops.h | 1 + cnn/nodes.cc | 8 ++++++-- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/cnn/gpu-ops.cu b/cnn/gpu-ops.cu index 7f774c005..0ad62c5c7 100644 --- a/cnn/gpu-ops.cu +++ b/cnn/gpu-ops.cu @@ -183,6 +183,36 @@ void softmax(int n, const float* x0, float* y) { ker_softmax<<>>(n, x0, y); } +// A kernel to calculate the dot product between two arrays +__global__ void ker_dotproduct(int n, const float* x, const float* y, float* z) { + __shared__ float buf[256]; + for (int i = threadIdx.x; i < 256; i += blockDim.x) { + float sum = 0; + for (int pos = i; pos < n; pos += 256) + sum += x[pos] * y[pos]; + buf[i] = sum; + } + for (int stride = 128; stride > 0; stride >>= 1) { + __syncthreads(); + for (int i = threadIdx.x; i < stride; i += blockDim.x) + buf[i] += buf[stride + i]; + } + __syncthreads(); + if (threadIdx.x == 0) + z[0] = buf[0]; +} + +void softmax_backward(int n, const float* fx, const float* dEdf, float* dEdx) { + auto tb = SizeToBlockThreadPair(n); + float* gpu_ods; + float ods; + cudaMalloc((void **)&gpu_ods, sizeof(float)); + ker_dotproduct<<>>(n, fx, dEdf, gpu_ods); + cudaMemcpy(&ods, gpu_ods, sizeof(float), cudaMemcpyDeviceToHost); + cudaFree(gpu_ods); + accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FSoftmaxBackward(-ods)); +} + // adapted from NVIDIA example __global__ void ker_pnlsoftmax(int n, int elem_idx, const float *x0, float* res, float* logz) { __shared__ float buf[256]; diff --git a/cnn/gpu-ops.h b/cnn/gpu-ops.h index 6f2b11359..207d9c4df 100644 --- a/cnn/gpu-ops.h +++ b/cnn/gpu-ops.h @@ -21,6 +21,7 @@ void l2_norm_reducer(int n, const float* x0, float* y, bool square, bool accumul void sqeucdist(int n, const float* x0, const float *x1, float* y); void sqeucdist_backward(int n, const float* dEdy, const float* x0, const float* x1, float* dEdx, int i); void softmax(int n, const float* x0, float* y); +void softmax_backward(int n, const float* x0, const float* dEdf, float* dEdx); void pnlsoftmax(int n, int elem_idx, const float* x0, float* y, float* logz); void pnlsoftmax_backward(int n, int elem_idx, const float* x0, const float* dEdf, const float* logz, float* dEdx); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 729fcacf8..607088ea5 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -46,7 +46,7 @@ void Transpose::forward(const vector& xs, Tensor& fx) const { } else { #if HAVE_CUDA CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, fx.d.rows(), fx.d.cols(), - kSCALAR_ONE, xs[0]->v, fx.d.rows(), kSCALAR_ZERO, NULL, fx.d.rows(), fx.v, fx.d.rows())); + kSCALAR_ONE, xs[0]->v, xs[0]->d.rows(), kSCALAR_ZERO, NULL, fx.d.rows(), fx.v, fx.d.rows())); #else *fx = (**xs[0]).transpose(); #endif @@ -60,7 +60,7 @@ void Transpose::backward(const vector& xs, Tensor& dEdxi) const { #if HAVE_CUDA CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols(), - kSCALAR_ONE, dEdf.v, dEdxi.d.rows(), kSCALAR_ONE, NULL, dEdxi.d.rows(), dEdxi.v, dEdxi.d.rows())); + kSCALAR_ONE, dEdf.v, dEdf.d.rows(), kSCALAR_ONE, dEdxi.v, dEdxi.d.rows(), dEdxi.v, dEdxi.d.rows())); #else *dEdxi += (*dEdf).transpose(); #endif @@ -572,8 +572,12 @@ void Softmax::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#if HAVE_CUDA + gpu::softmax_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); +#else float off_diag_sum = -(*fx).cwiseProduct(*dEdf).sum(); *dEdxi += (*fx).binaryExpr(*dEdf, FSoftmaxBackward(off_diag_sum)); +#endif } void PickNegLogSoftmax::forward(const vector& xs, Tensor& fx) const { From fb0a98be03873b7607cbfc767f52612d6a2ec24f Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 19 Jun 2015 16:34:00 +0900 Subject: [PATCH 103/965] Changed "short"s in dimensions to "int"s --- cnn/dim.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/dim.h b/cnn/dim.h index 0985c50e3..76b8f398e 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -41,8 +41,8 @@ struct Dim { else if (nd == 2) { return Dim(d[1], d[0]); } throw std::invalid_argument("Cannot transpose Dim object with more than 2 dimensions"); } - unsigned short d[CNN_MAX_TENSOR_DIM]; - unsigned short nd; + unsigned int d[CNN_MAX_TENSOR_DIM]; + unsigned intint nd; private: friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { From eee181267cd681d4f5aeb214cdf1c2fc24679b50 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 19 Jun 2015 16:36:14 +0900 Subject: [PATCH 104/965] Fixed typo --- cnn/dim.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/dim.h b/cnn/dim.h index 76b8f398e..d343d6c4b 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -42,7 +42,7 @@ struct Dim { throw std::invalid_argument("Cannot transpose Dim object with more than 2 dimensions"); } unsigned int d[CNN_MAX_TENSOR_DIM]; - unsigned intint nd; + unsigned int nd; private: friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { From 495ef3fac70efe22990b594892d02538ffa3ec33 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 20 Jun 2015 15:27:10 -0400 Subject: [PATCH 105/965] add basic (non-optimized!) support for 1d convs and k max pooling --- cnn/CMakeLists.txt | 2 + cnn/conv.cc | 156 +++++++++++++++++++++++++++++++++++++++++++++ cnn/conv.h | 39 ++++++++++++ cnn/expr.cc | 7 ++ cnn/expr.h | 4 ++ 5 files changed, 208 insertions(+) create mode 100644 cnn/conv.cc create mode 100644 cnn/conv.h diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 71165ccf4..ba9fca2f8 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -2,6 +2,7 @@ # Sources: set(cnn_library_SRCS cnn.cc + conv.cc dict.cc dim.cc exec.cc @@ -27,6 +28,7 @@ set(cnn_library_HDRS aligned-mem-pool.h c2w.h cnn.h + conv.h cuda.h dict.h dim.h diff --git a/cnn/conv.cc b/cnn/conv.cc new file mode 100644 index 000000000..37ea24955 --- /dev/null +++ b/cnn/conv.cc @@ -0,0 +1,156 @@ +#include "cnn/conv.h" + +#include +#include +#include + +#include "cnn/functors.h" +#if HAVE_CUDA +#include "cnn/cuda.h" +#include "cnn/gpu-ops.h" +#endif + +using namespace std; + +namespace cnn { + +string Conv1DNarrow::as_string(const vector& arg_names) const { + ostringstream os; + os << "conv1dnarrow(" << arg_names[0] << ", f=" << arg_names[1] << ')'; + return os.str(); +} + +Dim Conv1DNarrow::dim_forward(const vector& xs) const { + int ocols = xs[0].cols() - xs[1].cols() + 1; + if (xs[0].ndims() != 2 || xs[1].ndims() != 2 || + xs[0].rows() != xs[1].rows() || + ocols < 1) { + cerr << "Bad input dimensions in Conv1DNarrow: " << xs << endl; + abort(); + } + return Dim({xs[0].rows(), ocols}); +} + +void Conv1DNarrow::forward(const vector& xs, Tensor& fx) const { + // TODO this is a bad implementation- rewrite to use unsupported Eigen tensor library + auto x = **xs[0]; // input + auto f = **xs[1]; // filter + auto y = *fx; + const unsigned rows = x.rows(); + const unsigned ycols = dim.cols(); + const unsigned fcols = f.cols(); + for (unsigned i = 0; i < rows; ++i) { + for (unsigned j = 0; j < ycols; ++j) { + float t = 0; + for (unsigned k = 0; k < fcols; ++k) + t += f(i, k) * x(i, j + k); + y(i, j) = t; + } + } +} + +void Conv1DNarrow::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + // TODO this is a bad implementation- rewrite to use unsupported Eigen tensor library + assert(i < 2); + const unsigned rows = xs[0]->d.rows(); + const unsigned ycols = dim.cols(); + const unsigned fcols = xs[1]->d.cols(); + auto d = *dEdf; + auto di = *dEdxi; + if (i == 0) { // derivative wrt input x + auto f = **xs[1]; + for (unsigned i = 0; i < rows; ++i) { + for (unsigned j = 0; j < ycols; ++j) { + for (unsigned k = 0; k < fcols; ++k) + di(i, j + k) += f(i, k) * d(i, j); + } + } + } else { // derivative wrt filter f + auto x = **xs[0]; + for (unsigned i = 0; i < rows; ++i) { + for (unsigned j = 0; j < ycols; ++j) { + for (unsigned k = 0; k < fcols; ++k) + di(i, k) += x(i, j + k) * d(i, j); + } + } + } +} + +string KMaxPooling::as_string(const vector& arg_names) const { + ostringstream os; + os << "kmaxpool(" << arg_names[0] << ", k=" << k << ')'; + return os.str(); +} + +Dim KMaxPooling::dim_forward(const vector& xs) const { + if (k < 1) { + cerr << "Bad bad k in KMaxPooling: " << k << endl; + abort(); + } + if (xs[0].ndims() != 2 || + (xs[0].cols() < k)) { + cerr << "Bad input dimensions in KMaxPooling: " << xs << endl; + abort(); + } + return Dim({xs[0].rows(), k}); +} + +size_t KMaxPooling::aux_storage_size() const { + // map of where the entries in f(x) go to entries in x + return sizeof(int) * dim.size(); +} + +void KMaxPooling::forward(const vector& xs, Tensor& fx) const { + auto x=**xs[0]; + auto y=*fx; + float tmp[1024]; + assert(x.cols() < 1024); + int mi = 0; + const unsigned rows = x.rows(); + const unsigned xcols = x.cols(); + int* maxmap = static_cast(aux_mem); + for (unsigned i=0; i < rows; ++i) { + //cerr << "row(" << i << ")=" << x.row(i) << endl; + for (unsigned j=0; j < xcols; ++j) + tmp[j] = -x(i,j); + nth_element(tmp, tmp + (k-1), tmp + xcols); + const float c = -tmp[k-1]; // kth largest element in row i + int tt = 0; + for (unsigned j = 0; j < xcols; ++j) { + const float xij = x(i,j); + if (xij >= c) { + //cerr << xij << ' '; + y(i,tt) = xij; + //assert(mi < dim.size()); + maxmap[mi++] = j; + ++tt; + if (tt == k) break; // could happen in case of ties + } + } + //cerr << endl; abort(); + } +} + +void KMaxPooling::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + const unsigned rows = dim.rows(); + const unsigned cols = dim.cols(); + const int* maxmap = static_cast(aux_mem); + for (unsigned i = 0; i < rows; ++i) { + int mi = 0; + for (unsigned j = 0; j < cols; ++j) { + assert(mi < dim.size()); + const int oj = maxmap[mi++]; + (*dEdxi)(i, oj) += (*dEdf)(i, j); + } + } +} + +} // namespace cnn diff --git a/cnn/conv.h b/cnn/conv.h new file mode 100644 index 000000000..f3dd263bd --- /dev/null +++ b/cnn/conv.h @@ -0,0 +1,39 @@ +#ifndef CNN_CONV_H_ +#define CNN_CONV_H_ + +#include "cnn/cnn.h" + +namespace cnn { + +struct KMaxPooling : public Node { + explicit KMaxPooling(const std::initializer_list& a, unsigned k = 1) : Node(a), k(k) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + size_t aux_storage_size() const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; + unsigned k; +}; + +// y = x_1 *conv x_2 +// x_1 \in R^{d x s} (input) +// x_2 \in R^{d x m} (filter) +struct Conv1DNarrow : public Node { + explicit Conv1DNarrow(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + +} // namespace cnn + +#endif diff --git a/cnn/expr.cc b/cnn/expr.cc index d2da32530..5cad7953d 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -2,6 +2,9 @@ #include +#include "cnn/nodes.h" +#include "cnn/conv.h" + namespace cnn { namespace expr { Expression input(ComputationGraph& g, real s) { return Expression(&g, g.add_input(s)); } @@ -51,6 +54,10 @@ Expression l1_distance(const Expression& x, const Expression& y) { return Expres Expression binary_log_loss(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i,y.i})); } Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, m)); } +Expression conv1d_narrow(const Expression& x, const Expression& f) { return Expression(x.pg, x.pg->add_function({x.i, f.i})); } +//Expression conv1d_wide(const Expression& x, const Expression& f) { return Expression(x.pg, x.pg->add_function({x.i, f.i})); } +Expression kmax_pooling(const Expression& x, unsigned k) { return Expression(x.pg, x.pg->add_function({x.i}, k)); } + Expression pick(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } Expression pick(const Expression& x, unsigned* pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } Expression pickrange(const Expression& x, unsigned v, unsigned u) { return Expression(x.pg, x.pg->add_function({x.i}, v, u)); } diff --git a/cnn/expr.h b/cnn/expr.h index c1e59f38e..2d6980902 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -57,6 +57,10 @@ Expression l1_distance(const Expression& x, const Expression& y); Expression binary_log_loss(const Expression& x, const Expression& y); Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0); +Expression conv1d_narrow(const Expression& x, const Expression& f); +Expression conv1d_wide(const Expression& x, const Expression& f); +Expression kmax_pooling(const Expression& x, unsigned k); + Expression pick(const Expression& x, unsigned v); Expression pick(const Expression& x, unsigned* pv); Expression pickrange(const Expression& x, unsigned v, unsigned u); From 343166f1553d4e5f09464e12b21130a5846d0763 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 20 Jun 2015 22:49:29 -0400 Subject: [PATCH 106/965] add wide 1d convolution, folding layer --- cnn/conv.cc | 116 +++++++++++++++++++++++++++++++++++++++++++++++++++- cnn/conv.h | 28 +++++++++++++ cnn/expr.cc | 3 +- cnn/expr.h | 1 + 4 files changed, 146 insertions(+), 2 deletions(-) diff --git a/cnn/conv.cc b/cnn/conv.cc index 37ea24955..627610fc0 100644 --- a/cnn/conv.cc +++ b/cnn/conv.cc @@ -14,13 +14,59 @@ using namespace std; namespace cnn { +string FoldRows::as_string(const vector& arg_names) const { + ostringstream os; + os << "fold_rows(" << arg_names[0] << ", nrows=" << nrows << ')'; + return os.str(); +} + +Dim FoldRows::dim_forward(const vector& xs) const { + int orows = xs[0].rows() / nrows; + if ((orows * nrows != xs[0].rows()) || xs.size() != 1 || xs[0].ndims() != 2) { + cerr << "Bad input dimensions in FoldRows: " << xs << endl; + abort(); + } + return Dim({orows, xs[0].cols()}); +} + +void FoldRows::forward(const vector& xs, Tensor& fx) const { + auto x = **xs[0]; + auto y = *fx; + int orows = y.rows(); + for (int i = 0; i < orows; ++i) { + for (unsigned j = 0; j < nrows; ++j) { + if (j) + y.row(i) += x.row(i * nrows + j); + else // j = 0 + y.row(i) = x.row(i * nrows); + } + } +} + +void FoldRows::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + int orows = fx.d.rows(); + auto d = *dEdf; + auto di = *dEdxi; + for (int i = 0; i < orows; ++i) + for (unsigned j = 0; j < nrows; ++j) + di.row(i * nrows + j) += d.row(i); +} + string Conv1DNarrow::as_string(const vector& arg_names) const { ostringstream os; - os << "conv1dnarrow(" << arg_names[0] << ", f=" << arg_names[1] << ')'; + os << "conv1d_narrow(" << arg_names[0] << ", f=" << arg_names[1] << ')'; return os.str(); } Dim Conv1DNarrow::dim_forward(const vector& xs) const { + if (xs.size() != 2) { + cerr << "Conv1DNarrow requires two inputs: " << xs << endl; + abort(); + } int ocols = xs[0].cols() - xs[1].cols() + 1; if (xs[0].ndims() != 2 || xs[1].ndims() != 2 || xs[0].rows() != xs[1].rows() || @@ -80,6 +126,74 @@ void Conv1DNarrow::backward(const vector& xs, } } +string Conv1DWide::as_string(const vector& arg_names) const { + ostringstream os; + os << "conv1d_wide(" << arg_names[0] << ", f=" << arg_names[1] << ')'; + return os.str(); +} + +Dim Conv1DWide::dim_forward(const vector& xs) const { + if (xs.size() != 2) { + cerr << "Conv1DWide requires two inputs: " << xs << endl; + abort(); + } + int ocols = xs[0].cols() + xs[1].cols() - 1; + if (xs[0].ndims() != 2 || xs[1].ndims() != 2 || + xs[0].rows() != xs[1].rows()) { + cerr << "Bad input dimensions in Conv1DWide: " << xs << endl; + abort(); + } + return Dim({xs[0].rows(), ocols}); +} + +void Conv1DWide::forward(const vector& xs, Tensor& fx) const { + TensorTools::Zero(fx); + auto x = **xs[0]; // input + auto f = **xs[1]; // filter + auto y = *fx; + const unsigned rows = x.rows(); + const unsigned xcols = x.cols(); + const unsigned fcols = f.cols(); + for (unsigned i = 0; i < rows; ++i) { + for (unsigned j = 0; j < xcols; ++j) { + const float xij = x(i, j); + for (unsigned k = 0; k < fcols; ++k) + y(i, j + k) += f(i, k) * xij; + } + } +} + +void Conv1DWide::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + const unsigned rows = xs[0]->d.rows(); + const unsigned xcols = xs[0]->d.cols(); + const unsigned fcols = xs[1]->d.cols(); + auto d = *dEdf; + auto di = *dEdxi; + if (i == 0) { // derivative wrt input x + auto f = **xs[1]; + for (unsigned i = 0; i < rows; ++i) { + for (unsigned j = 0; j < xcols; ++j) { + for (unsigned k = 0; k < fcols; ++k) + di(i, j) += f(i, k) * d(i, j + k); + } + } + } else { // derivative wrt filter f + auto x = **xs[0]; + for (unsigned i = 0; i < rows; ++i) { + for (unsigned j = 0; j < xcols; ++j) { + const float xij = x(i, j); + for (unsigned k = 0; k < fcols; ++k) + di(i, k) += xij * d(i, j + k); + } + } + } +} + string KMaxPooling::as_string(const vector& arg_names) const { ostringstream os; os << "kmaxpool(" << arg_names[0] << ", k=" << k << ')'; diff --git a/cnn/conv.h b/cnn/conv.h index f3dd263bd..0dd6c66e3 100644 --- a/cnn/conv.h +++ b/cnn/conv.h @@ -19,6 +19,19 @@ struct KMaxPooling : public Node { unsigned k; }; +struct FoldRows : public Node { + explicit FoldRows(const std::initializer_list& a, unsigned nrows) : Node(a), nrows(nrows) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; + unsigned nrows; +}; + // y = x_1 *conv x_2 // x_1 \in R^{d x s} (input) // x_2 \in R^{d x m} (filter) @@ -34,6 +47,21 @@ struct Conv1DNarrow : public Node { Tensor& dEdxi) const override; }; +// y = x_1 *conv x_2 +// x_1 \in R^{d x s} (input) +// x_2 \in R^{d x m} (filter) +struct Conv1DWide : public Node { + explicit Conv1DWide(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + } // namespace cnn #endif diff --git a/cnn/expr.cc b/cnn/expr.cc index 5cad7953d..e523ddd1c 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -55,8 +55,9 @@ Expression binary_log_loss(const Expression& x, const Expression& y) { return Ex Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, m)); } Expression conv1d_narrow(const Expression& x, const Expression& f) { return Expression(x.pg, x.pg->add_function({x.i, f.i})); } -//Expression conv1d_wide(const Expression& x, const Expression& f) { return Expression(x.pg, x.pg->add_function({x.i, f.i})); } +Expression conv1d_wide(const Expression& x, const Expression& f) { return Expression(x.pg, x.pg->add_function({x.i, f.i})); } Expression kmax_pooling(const Expression& x, unsigned k) { return Expression(x.pg, x.pg->add_function({x.i}, k)); } +Expression fold_rows(const Expression& x, unsigned nrows) { return Expression(x.pg, x.pg->add_function({x.i}, nrows)); } Expression pick(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } Expression pick(const Expression& x, unsigned* pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } diff --git a/cnn/expr.h b/cnn/expr.h index 2d6980902..71138c1ed 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -60,6 +60,7 @@ Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1 Expression conv1d_narrow(const Expression& x, const Expression& f); Expression conv1d_wide(const Expression& x, const Expression& f); Expression kmax_pooling(const Expression& x, unsigned k); +Expression fold_rows(const Expression& x, unsigned nrows=2); Expression pick(const Expression& x, unsigned v); Expression pick(const Expression& x, unsigned* pv); From e3a9df9b08e587a1dbdb3bcd6fea5e25b7880dc7 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 20 Jun 2015 22:52:33 -0400 Subject: [PATCH 107/965] debugging notes --- cnn/nodes.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 607088ea5..8b2bc6e5b 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -25,6 +25,11 @@ using namespace std; // memory, it is (probably) because of an implicit creation of a temporary variable. // To tell Eigen this is not necessary, the noalias() method is available. If you really // do need a temporary variable, its capacity must be requested by Node::aux_storage_space +// +// notes on debugging problems with differentiable components +// 1) fx is uninitialized when forward is called- are you relying on it being 0? +// 2) dEdxi must accummulate (see point 4 above!) +// namespace cnn { From 4aeb570e690c6e4c8db5e4424b9e82b9129d9674 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 21 Jun 2015 15:17:23 -0400 Subject: [PATCH 108/965] text cat example (neural bag of words) --- cnn/expr.cc | 3 + cnn/expr.h | 5 + cnn/nodes-common.cc | 19 ++- cnn/nodes.cc | 69 ++++++---- cnn/nodes.h | 18 ++- examples/CMakeLists.txt | 2 +- examples/example-data/textcat.txt | 6 + examples/textcat.cc | 219 ++++++++++++++++++++++++++++++ 8 files changed, 308 insertions(+), 33 deletions(-) create mode 100644 examples/example-data/textcat.txt create mode 100644 examples/textcat.cc diff --git a/cnn/expr.cc b/cnn/expr.cc index e523ddd1c..c3d2472e6 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -21,6 +21,7 @@ Expression operator+(const Expression& x, const Expression& y) { return Expressi Expression operator-(const Expression& x, const Expression& y) { return x+(-y); } Expression operator-(real x, const Expression& y) { return Expression(y.pg, y.pg->add_function({y.i}, x)); } Expression operator*(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } +Expression operator*(const Expression& x, float y) { return Expression(x.pg, x.pg->add_function({x.i}, y)); } Expression cdiv(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression tanh(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } @@ -28,6 +29,8 @@ Expression log(const Expression& x) { return Expression(x.pg, x.pg->add_function Expression exp(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression logistic(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression rectify(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression hinge(const Expression& x, unsigned index, float m) { return Expression(x.pg, x.pg->add_function({x.i}, index, m)); } +Expression hinge(const Expression& x, const unsigned* pindex, float m) { return Expression(x.pg, x.pg->add_function({x.i}, pindex, m)); } Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log_softmax(const Expression& x, const std::vector& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } Expression softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 71138c1ed..5965b0a11 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -29,6 +29,9 @@ Expression operator+(const Expression& x, const Expression& y); Expression operator-(const Expression& x, const Expression& y); Expression operator-(real x, const Expression& y); Expression operator*(const Expression& x, const Expression& y); +Expression operator*(const Expression& x, float y); +inline Expression operator*(float y, const Expression& x) { return x * y; } +inline Expression operator/(const Expression& x, float y) { return x * (1.f / y); } // componentwise division Expression cdiv(const Expression& x, const Expression& y); @@ -37,6 +40,8 @@ Expression exp(const Expression& x); Expression log(const Expression& x); Expression logistic(const Expression& x); Expression rectify(const Expression& x); +Expression hinge(const Expression& x, unsigned index, float m = 1.0); +Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0); Expression log_softmax(const Expression& x); Expression log_softmax(const Expression& x, const std::vector& restriction); Expression softmax(const Expression& x); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index ba3ecee29..f2fa9cd5c 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -17,6 +17,20 @@ inline bool LooksLikeVector(const Dim& d) { return true; } +string ConstScalarMultiply::as_string(const vector& arg_names) const { + ostringstream s; + s << arg_names[0] << " * " << alpha; + return s.str(); +} + +Dim ConstScalarMultiply::dim_forward(const vector& xs) const { + if (xs.size() != 1) { + cerr << "ConstScalarMultiply expects one argument: " << xs << endl; + abort(); + } + return xs[0]; +} + string DotProduct::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0] << "^T . " << arg_names[1]; @@ -288,13 +302,12 @@ Dim PairwiseRankLoss::dim_forward(const vector& xs) const { string Hinge::as_string(const vector& arg_names) const { ostringstream os; - os << "hinge(" << arg_names[0] << ",m=" << margin << ")"; + os << "hinge(" << arg_names[0] << ", pe=" << pelement << ", m=" << margin << ')'; return os.str(); } Dim Hinge::dim_forward(const vector& xs) const { - assert(xs.size() == 1); - if (!LooksLikeVector(xs[0])) { + if (xs.size() != 1 || !LooksLikeVector(xs[0])) { cerr << "Bad input dimensions in Hinge: " << xs << endl; abort(); } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 8b2bc6e5b..4603d4eb5 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -33,6 +33,19 @@ using namespace std; namespace cnn { +void ConstScalarMultiply::forward(const vector& xs, Tensor& fx) const { + *fx = (**xs[0]) * alpha; +} + +void ConstScalarMultiply::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i == 0); + *dEdxi += *dEdf * alpha; +} + void DotProduct::forward(const vector& xs, Tensor& fx) const { *fx = (**xs[0]).transpose() * (**xs[1]); } @@ -448,23 +461,26 @@ void PairwiseRankLoss::backward(const vector& xs, #endif } +size_t Hinge::aux_storage_size() const { + return dim.size() * sizeof(float); +} + void Hinge::forward(const vector& xs, Tensor& fx) const { - cerr << "FIX IMPL3\n"; abort(); -#if 0 assert(xs.size() == 1); - const Tensor& x = *xs.front(); + auto x = **xs[0]; const unsigned rows = x.rows(); - if (u.rows() != rows) - u = Tensor(rows, 1); // local forward value - real y = 0; - const real mlystar = margin - x(*pelement, 0); - for (unsigned i = 0; i < rows; ++i) - if (*pelement != i) - y += u(i, 0) = max(real(0), mlystar + x(i,0)); - Tensor res(1,1); - res(0,0) = y; - return res; -#endif + float y = 0; + float* eloss = static_cast(aux_mem); + const real mlystar = margin - x(*pelement); + for (unsigned i = 0; i < rows; ++i) { + if (*pelement != i) { + eloss[i] = max(0.f, mlystar + x(i)); + y += eloss[i]; + } else { + eloss[i] = 0; + } + } + fx.v[0] = y; } void Hinge::backward(const vector& xs, @@ -472,20 +488,19 @@ void Hinge::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - cerr << "FIX IMPL4\n"; abort(); -#if 0 assert(i == 0); - const Tensor& x = *xs.front(); - const unsigned rows = x.rows(); - Tensor dEdx = Zero(Dim(rows, 1)); - if (fx(0,0) == 0) return dEdx; - const real diff = dEdf(0,0); - unsigned tv = 0; - for (unsigned i = 0; i < rows; ++i) - if (*pelement != i && u(i, 0) > 0) { dEdx(i, 0) = diff; tv++; } - dEdx(*pelement, 0) = -diff * tv; - return dEdx; -#endif + if (fx.v[0]) { // there was some loss + const float d = dEdf.v[0]; + const unsigned rows = dEdxi.d.rows(); + const float* eloss = static_cast(aux_mem); + unsigned tne = 0; // total number of errors + for (unsigned i = 0; i < rows; ++i) + if (eloss[i] > 0) { + (*dEdxi)(i) += d; + ++tne; + } + (*dEdxi)(*pelement) -= d * tne; + } } void Identity::forward(const vector& xs, Tensor& fx) const { diff --git a/cnn/nodes.h b/cnn/nodes.h index afc9c7067..addc1ed93 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -5,6 +5,20 @@ namespace cnn { +// y = alpha * x_1 +struct ConstScalarMultiply : public Node { + explicit ConstScalarMultiply(const std::initializer_list& a, float alpha) : Node(a), alpha(alpha) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; + float alpha; +}; + // y = x_1^T . x_2 struct DotProduct : public Node { explicit DotProduct(const std::initializer_list& a) : Node(a) {} @@ -243,9 +257,10 @@ struct PairwiseRankLoss : public Node { // y = \sum{i != element} max{0, margin - x_element + x_i} struct Hinge : public Node { explicit Hinge(const std::initializer_list& a, unsigned e, real m = 1.0) : Node(a), element(e), pelement(&element), margin(m) {} - explicit Hinge(const std::initializer_list& a, unsigned* pe, real m = 1.0) : Node(a), element(), pelement(pe), margin(m) {} + explicit Hinge(const std::initializer_list& a, const unsigned* pe, real m = 1.0) : Node(a), element(), pelement(pe), margin(m) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + size_t aux_storage_size() const override; void forward(const std::vector& xs, Tensor& fx) const override; void backward(const std::vector& xs, const Tensor& fx, @@ -255,7 +270,6 @@ struct Hinge : public Node { unsigned element; const unsigned* pelement; real margin; - // mutable Tensor u; // partial forward values }; // y = x_1 diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index ed7c64b96..d4038b2fa 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm nlm) +foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm nlm textcat) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/example-data/textcat.txt b/examples/example-data/textcat.txt new file mode 100644 index 000000000..116856ccf --- /dev/null +++ b/examples/example-data/textcat.txt @@ -0,0 +1,6 @@ +what is your name ? ||| Q +where do you live ? ||| Q +i live in pittsburgh . ||| D +my name is bond . ||| D +wtf ? she asked . ||| D +did she say " yes . " ? ||| Q diff --git a/examples/textcat.cc b/examples/textcat.cc new file mode 100644 index 000000000..2edc4becc --- /dev/null +++ b/examples/textcat.cc @@ -0,0 +1,219 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/timing.h" +#include "cnn/rnn.h" +#include "cnn/gru.h" +#include "cnn/lstm.h" +#include "cnn/dict.h" +#include "cnn/expr.h" + +#include +#include + +#include +#include + +using namespace std; +using namespace cnn; + +unsigned INPUT_DIM = 48; +unsigned OUTPUT_DIM = 48; +unsigned VOCAB_SIZE = 0; +unsigned LABEL_SIZE = 0; + +bool eval = false; +cnn::Dict d; +cnn::Dict ld; +int kSOS; +int kEOS; + +struct NeuralBagOfWords { + LookupParameters* p_w; + Parameters* p_c2h; + Parameters* p_hbias; + Parameters* p_h2o; + Parameters* p_obias; + + explicit NeuralBagOfWords(Model& m) : + p_w(m.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), + p_c2h(m.add_parameters({OUTPUT_DIM, INPUT_DIM})), + p_hbias(m.add_parameters({OUTPUT_DIM})), + p_h2o(m.add_parameters({LABEL_SIZE, OUTPUT_DIM})), + p_obias(m.add_parameters({LABEL_SIZE})) {} + + Expression BuildClassifier(const vector& x, ComputationGraph& cg) { + Expression c2h = parameter(cg, p_c2h); + Expression hbias = parameter(cg, p_hbias); + Expression h2o = parameter(cg, p_h2o); + Expression obias = parameter(cg, p_obias); + + vector vx(x.size()); + for (unsigned i = 0; i < x.size(); ++i) + vx[i] = lookup(cg, p_w, x[i]); + Expression h = rectify(c2h * sum(vx) / x.size() + hbias); + Expression y_pred = obias + h2o * h; + return y_pred; + } +}; + +bool IsCurrentPredictionCorrection(ComputationGraph& cg, int y_true) { + auto v = as_vector(cg.incremental_forward()); + assert(v.size() > 1); + int besti = 0; + float best = v[0]; + for (unsigned i = 1; i < v.size(); ++i) + if (v[i] > best) { best = v[i]; besti = i; } + return (besti == y_true); +} + +Expression CrossEntropyLoss(const Expression& y_pred, int y_true) { + Expression lp = log_softmax(y_pred); + Expression nll = -pick(lp, y_true); + return nll; +} + +Expression HingeLoss(const Expression& y_pred, int y_true) { + Expression hl = hinge(y_pred, y_true, 10.0f); + return hl; +} + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.Convert(""); + kEOS = d.Convert(""); + vector,int>> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + vector x,y; + ReadSentencePair(line, &x, &d, &y, &ld); + if (x.size() == 0 || y.size() != 1) { cerr << line << endl; abort(); } + training.push_back(make_pair(x,y[0])); + ttoks += x.size(); + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + cerr << "Labels: " << ld.size() << endl; + } + LABEL_SIZE = ld.size(); + //d.Freeze(); // no new word types allowed + ld.Freeze(); // no new tag types allowed + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + ++dlc; + vector x,y; + ReadSentencePair(line, &x, &d, &y, &ld); + assert(y.size() == 1); + dev.push_back(make_pair(x,y[0])); + dtoks += x.size(); + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + VOCAB_SIZE = d.size(); + ostringstream os; + os << "textcat" + << '_' << INPUT_DIM + << '_' << OUTPUT_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + bool use_momentum = true; + Trainer* sgd = nullptr; + if (use_momentum) + sgd = new MomentumSGDTrainer(&model); + else + sgd = new SimpleSGDTrainer(&model); + + NeuralBagOfWords nbow(model); + + unsigned report_every_i = min(200, int(training.size())); + unsigned dev_every_i_reports = 25; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned ttags = 0; + unsigned correct = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& sentx_y = training[order[si]]; + const auto& x = sentx_y.first; + const int y = sentx_y.second; + ++si; + Expression y_pred = nbow.BuildClassifier(x, cg); + //CrossEntropyLoss(y_pred, y); + HingeLoss(y_pred, y); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(0.1); + ++lines; + ++ttags; + } + sgd->status(); + cerr << " E = " << (loss / ttags) << " ppl=" << exp(loss / ttags) << " (acc=" << (correct / (double)ttags) << ") "; + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + unsigned dtags = 0; + unsigned dcorr = 0; + eval = true; + //lm.p_th2t->scale_parameters(pdrop); + for (auto& sent : dev) { + const auto& x = sent.first; + const int y = sent.second; + ComputationGraph cg; + Expression y_pred = nbow.BuildClassifier(x, cg); + if (IsCurrentPredictionCorrection(cg, y)) dcorr++; + //CrossEntropyLoss(y_pred, y); + HingeLoss(y_pred, y); + dloss += as_scalar(cg.incremental_forward()); + dtags++; + } + //lm.p_th2t->scale_parameters(1/pdrop); + eval = false; + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dtags) << " ppl=" << exp(dloss / dtags) << " acc=" << (dcorr / (double)dtags) << ' '; + } + } + delete sgd; +} + From 59180d356c5abe8924e0cde1b19b0e36e37a830f Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 22 Jun 2015 22:31:29 -0400 Subject: [PATCH 109/965] dcnn example --- cnn/conv.cc | 41 ++++++++++++++ cnn/conv.h | 12 ++++ cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/model.cc | 46 +++++++++++++-- cnn/model.h | 11 +++- examples/textcat.cc | 132 ++++++++++++++++++++++++++++++++++++++------ 7 files changed, 220 insertions(+), 24 deletions(-) diff --git a/cnn/conv.cc b/cnn/conv.cc index 627610fc0..81ce7db65 100644 --- a/cnn/conv.cc +++ b/cnn/conv.cc @@ -14,6 +14,40 @@ using namespace std; namespace cnn { +string AddVectorToAllColumns::as_string(const vector& arg_names) const { + ostringstream os; + os << "fold_rows(" << arg_names[0] << ", " << arg_names[1] << ')'; + return os.str(); +} + +Dim AddVectorToAllColumns::dim_forward(const vector& xs) const { + if (xs.size() != 2 || xs[0].rows() != xs[1].rows() || xs[0].ndims() != 2 || xs[1].ndims() != 1) { + cerr << "Bad input dimensions in AddVectorToAllColumns: " << xs << endl; + abort(); + } + return xs[0]; +} + +void AddVectorToAllColumns::forward(const vector& xs, Tensor& fx) const { + auto y = *fx; + auto x = **xs[0]; + auto b = **xs[1]; + y = x.colwise() + b.col(0); +} + +void AddVectorToAllColumns::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + if (i == 0) { // x + (*dEdxi) += (*dEdf); + } else { // bias + (*dEdxi).col(0) += (*dEdf).rowwise().sum(); + } +} + string FoldRows::as_string(const vector& arg_names) const { ostringstream os; os << "fold_rows(" << arg_names[0] << ", nrows=" << nrows << ')'; @@ -247,6 +281,7 @@ void KMaxPooling::forward(const vector& xs, Tensor& fx) const { } //cerr << endl; abort(); } + assert(mi == dim.size()); } void KMaxPooling::backward(const vector& xs, @@ -262,6 +297,12 @@ void KMaxPooling::backward(const vector& xs, for (unsigned j = 0; j < cols; ++j) { assert(mi < dim.size()); const int oj = maxmap[mi++]; + if (oj > (*dEdxi).cols() || oj < 0) { + cerr << dim << (*fx) << endl << (*dEdxi) << endl; + cerr << "MM:"; for (int k=0;k < dim.size(); ++k) cerr << ' ' << maxmap[k]; + cerr << endl; + cerr << "BAD: " << oj << endl; abort(); + } (*dEdxi)(i, oj) += (*dEdf)(i, j); } } diff --git a/cnn/conv.h b/cnn/conv.h index 0dd6c66e3..01713478c 100644 --- a/cnn/conv.h +++ b/cnn/conv.h @@ -5,6 +5,18 @@ namespace cnn { +struct AddVectorToAllColumns : public Node { + explicit AddVectorToAllColumns(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + struct KMaxPooling : public Node { explicit KMaxPooling(const std::initializer_list& a, unsigned k = 1) : Node(a), k(k) {} std::string as_string(const std::vector& arg_names) const override; diff --git a/cnn/expr.cc b/cnn/expr.cc index c3d2472e6..e242b5b99 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -23,6 +23,7 @@ Expression operator-(real x, const Expression& y) { return Expression(y.pg, y.pg Expression operator*(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression operator*(const Expression& x, float y) { return Expression(x.pg, x.pg->add_function({x.i}, y)); } Expression cdiv(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } +Expression colwise_add(const Expression& x, const Expression& bias) { return Expression(x.pg, x.pg->add_function({x.i, bias.i})); } Expression tanh(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 5965b0a11..f619c7d4a 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -34,6 +34,7 @@ inline Expression operator*(float y, const Expression& x) { return x * y; } inline Expression operator/(const Expression& x, float y) { return x * (1.f / y); } // componentwise division Expression cdiv(const Expression& x, const Expression& y); +Expression colwise_add(const Expression& x, const Expression& bias); Expression tanh(const Expression& x); Expression exp(const Expression& x); diff --git a/cnn/model.cc b/cnn/model.cc index ba0724cfd..682a7508c 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -18,10 +18,10 @@ namespace cnn { ParametersBase::~ParametersBase() {} -Parameters::Parameters(const Dim& d) : dim(d) { +Parameters::Parameters(const Dim& d, float scale) : dim(d) { values.d = g.d = d; values.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); - TensorTools::Randomize(values); + if (scale) TensorTools::Randomize(values, scale); else TensorTools::Randomize(values); g.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); TensorTools::Zero(g); } @@ -32,6 +32,14 @@ void Parameters::scale_parameters(float a) { (*g) *= a; } +void Parameters::squared_l2norm(float* sqnorm) const { +#if HAVE_CUDA + gpu::l2_norm_reducer(values.d.size(), values.v, sqnorm, true, false); +#else + *sqnorm = (*values).squaredNorm(); +#endif +} + void Parameters::g_squared_l2norm(float* sqnorm) const { #if HAVE_CUDA gpu::l2_norm_reducer(g.d.size(), g.v, sqnorm, true, false); @@ -99,6 +107,21 @@ void LookupParameters::g_squared_l2norm(float* sqnorm) const { #endif } +void LookupParameters::squared_l2norm(float* sqnorm) const { +#if HAVE_CUDA + bool acc = false; + for (unsigned i = 0; i < values.size(); ++i) { + gpu::l2_norm_reducer(values[i].d.size(), values[i].v, sqnorm, true, acc); + acc = true; + } +#else + float a = 0; + for (unsigned i = 0; i < values.size(); ++i) + a += (*values[i]).squaredNorm(); + *sqnorm = a; +#endif +} + void LookupParameters::accumulate_grad(unsigned index, const Tensor& d) { non_zero_grads.insert(index); #if HAVE_CUDA @@ -118,6 +141,21 @@ Model::~Model() { for (auto p : all_params) delete p; } +void Model::project_weights(float radius) { + static float* project_scratch = 0; + if (!project_scratch) + project_scratch = (float*)cnn_mm_malloc(all_params.size() * sizeof(float), 256); + int pi = 0; + for (auto p : all_params) { + p->squared_l2norm(&project_scratch[pi]); + ++pi; + } + double gg = 0; + for (unsigned i = 0; i < pi; ++i) + gg += project_scratch[i]; + cerr << "NORM: " << sqrt(gg) << endl; +} + float Model::gradient_l2_norm() const { if (!gradient_norm_scratch) gradient_norm_scratch = (float*)cnn_mm_malloc(all_params.size() * sizeof(float), 256); @@ -139,8 +177,8 @@ float Model::gradient_l2_norm() const { #endif } -Parameters* Model::add_parameters(const Dim& d) { - Parameters* p = new Parameters(d); +Parameters* Model::add_parameters(const Dim& d, float scale) { + Parameters* p = new Parameters(d, scale); all_params.push_back(p); params.push_back(p); return p; diff --git a/cnn/model.h b/cnn/model.h index 98a9f0be8..095d20334 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -20,6 +20,7 @@ namespace cnn { struct ParametersBase { friend class Model; virtual void scale_parameters(float a) = 0; + virtual void squared_l2norm(float* sqnorm) const = 0; virtual void g_squared_l2norm(float* sqnorm) const = 0; virtual size_t size() const = 0; virtual ~ParametersBase(); @@ -29,6 +30,7 @@ struct ParametersBase { struct Parameters : public ParametersBase { friend class Model; void scale_parameters(float a) override; + void squared_l2norm(float* sqnorm) const override; void g_squared_l2norm(float* sqnorm) const override; size_t size() const override; @@ -40,7 +42,8 @@ struct Parameters : public ParametersBase { Tensor g; private: Parameters() {} - explicit Parameters(const Dim& d); + explicit Parameters(const Dim& d, float minmax); // initialize with ~U(-minmax,+minmax) + // or Glorot initialization if minmax = 0 friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { ar & dim; @@ -52,6 +55,7 @@ struct Parameters : public ParametersBase { struct LookupParameters : public ParametersBase { friend class Model; void scale_parameters(float a) override; + void squared_l2norm(float* sqnorm) const override; void g_squared_l2norm(float* sqnorm) const override; size_t size() const override; void Initialize(unsigned index, const std::vector& val); @@ -97,8 +101,11 @@ class Model { Model() : gradient_norm_scratch() {} ~Model(); float gradient_l2_norm() const; - Parameters* add_parameters(const Dim& d); // initialized randomly + // set scale to use custom initialization + Parameters* add_parameters(const Dim& d, float scale = 0.0f); LookupParameters* add_lookup_parameters(unsigned n, const Dim& d); + // project weights so their L2 norm = radius + void project_weights(float radius = 1.0f); const std::vector& all_parameters_list() const { return all_params; } const std::vector& parameters_list() const { return params; } diff --git a/examples/textcat.cc b/examples/textcat.cc index 2edc4becc..aa5380fb8 100644 --- a/examples/textcat.cc +++ b/examples/textcat.cc @@ -17,12 +17,12 @@ using namespace std; using namespace cnn; -unsigned INPUT_DIM = 48; -unsigned OUTPUT_DIM = 48; +unsigned INPUT_DIM = 36; +unsigned OUTPUT_DIM = 36; unsigned VOCAB_SIZE = 0; unsigned LABEL_SIZE = 0; +float pdropout = 0.5; -bool eval = false; cnn::Dict d; cnn::Dict ld; int kSOS; @@ -51,12 +51,108 @@ struct NeuralBagOfWords { vector vx(x.size()); for (unsigned i = 0; i < x.size(); ++i) vx[i] = lookup(cg, p_w, x[i]); - Expression h = rectify(c2h * sum(vx) / x.size() + hbias); + Expression c = sum(vx); + Expression h = rectify(c2h * c / x.size() + hbias); Expression y_pred = obias + h2o * h; return y_pred; } }; +struct ConvLayer { + // in_rows = rows per word in input matrix + // k_fold_rows = 1 no folding, 2 fold two rows together, 3 ... + // filter_width = length of filter (columns) + // in_nfmaps = number of feature maps in input + // out_nfmaps = number of feature maps in output + ConvLayer(Model&m, int in_rows, int k_fold_rows, int filter_width, int in_nfmaps, int out_nfmaps) : + p_filts(in_nfmaps), + p_fbias(in_nfmaps), + k_fold_rows(k_fold_rows) { + if (k_fold_rows < 1 || ((in_rows / k_fold_rows) * k_fold_rows != in_rows)) { + cerr << "Bad k_fold_rows=" << k_fold_rows << endl; + abort(); + } + for (int i = 0; i < in_nfmaps; ++i) { + p_filts[i].resize(out_nfmaps); + p_fbias[i].resize(out_nfmaps); + for (int j = 0; j < out_nfmaps; ++j) { + p_filts[i][j] = m.add_parameters({in_rows, filter_width}, 0.01); + p_fbias[i][j] = m.add_parameters({in_rows}, 0.05); + } + } + //for (int j = 0; j < out_nfmaps; ++j) + //p_fbias[j] = m.add_parameters({in_rows}); + } + + vector apply(ComputationGraph& cg, const vector& inlayer, int k_out) const { + const unsigned out_nfmaps = p_filts.front().size(); + const unsigned in_nfmaps = p_filts.size(); + if (in_nfmaps != inlayer.size()) { + cerr << "Mismatched number of input features (" << inlayer.size() << "), expected " << in_nfmaps << endl; + abort(); + } + vector r(out_nfmaps); + + vector tmp(in_nfmaps); + for (int fj = 0; fj < out_nfmaps; ++fj) { + for (int fi = 0; fi < in_nfmaps; ++fi) { + Expression t = conv1d_wide(inlayer[fi], parameter(cg, p_filts[fi][fj])); + t = colwise_add(t, parameter(cg, p_fbias[fi][fj])); + tmp[fi] = t; + } + Expression s = sum(tmp); + if (k_fold_rows > 1) + s = fold_rows(s, k_fold_rows); + s = kmax_pooling(s, k_out); + r[fj] = rectify(s); + } + return r; + } + vector> p_filts; // [feature map index from][feature map index to] + vector> p_fbias; // [feature map index from][feature map index to] + int k_fold_rows; +}; + +struct ConvNet { + LookupParameters* p_w; + ConvLayer cl1; + ConvLayer cl2; + Parameters* p_t2o; + Parameters* p_obias; + + explicit ConvNet(Model& m) : + p_w(m.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), + //ConvLayer(Model&m, int in_rows, int k_fold_rows, int filter_width, int in_nfmaps, int out_nfmaps) : + cl1(m, INPUT_DIM, 2, 10, 1, 6), + cl2(m, INPUT_DIM/2, 2, 6, 6, 14), + p_t2o(m.add_parameters({LABEL_SIZE, 14 * (INPUT_DIM / 4) * 5})), + p_obias(m.add_parameters({LABEL_SIZE})) { + } + + Expression BuildClassifier(const vector& x, ComputationGraph& cg, bool for_training) { + Expression t2o = parameter(cg, p_t2o); + Expression obias = parameter(cg, p_obias); + int k_2 = 5; + int len = x.size(); + int k_1 = max(k_2, len / 2); + vector vx(x.size()); + for (unsigned i = 0; i < x.size(); ++i) + vx[i] = lookup(cg, p_w, x[i]); + Expression s = concatenate_cols(vx); + + vector l0(1, s); + vector l1 = cl1.apply(cg, l0, k_1); + vector l2 = cl2.apply(cg, l1, k_2); + for(auto& fm : l2) + fm = reshape(fm, {k_2 * INPUT_DIM / 4}); + Expression t = concatenate(l2); + if (for_training) + t = dropout(t, pdropout); + Expression r = t2o * t + obias; + return r; + } +}; + bool IsCurrentPredictionCorrection(ComputationGraph& cg, int y_true) { auto v = as_vector(cg.incremental_forward()); assert(v.size() > 1); @@ -136,16 +232,15 @@ int main(int argc, char** argv) { double best = 9e+99; Model model; - bool use_momentum = true; Trainer* sgd = nullptr; - if (use_momentum) - sgd = new MomentumSGDTrainer(&model); - else - sgd = new SimpleSGDTrainer(&model); + //sgd = new MomentumSGDTrainer(&model); + sgd = new AdagradTrainer(&model); + //sgd = new SimpleSGDTrainer(&model); - NeuralBagOfWords nbow(model); + //NeuralBagOfWords nbow(model); + ConvNet nbow(model); - unsigned report_every_i = min(200, int(training.size())); + unsigned report_every_i = min(100, int(training.size())); unsigned dev_every_i_reports = 25; unsigned si = training.size(); vector order(training.size()); @@ -172,17 +267,19 @@ int main(int argc, char** argv) { const auto& x = sentx_y.first; const int y = sentx_y.second; ++si; - Expression y_pred = nbow.BuildClassifier(x, cg); + //cerr << "LINE: " << order[si] << endl; + Expression y_pred = nbow.BuildClassifier(x, cg, true); //CrossEntropyLoss(y_pred, y); HingeLoss(y_pred, y); loss += as_scalar(cg.forward()); cg.backward(); - sgd->update(0.1); + sgd->update(2.0); ++lines; ++ttags; } sgd->status(); cerr << " E = " << (loss / ttags) << " ppl=" << exp(loss / ttags) << " (acc=" << (correct / (double)ttags) << ") "; + model.project_weights(); // show score on dev data? report++; @@ -190,21 +287,20 @@ int main(int argc, char** argv) { double dloss = 0; unsigned dtags = 0; unsigned dcorr = 0; - eval = true; - //lm.p_th2t->scale_parameters(pdrop); for (auto& sent : dev) { const auto& x = sent.first; const int y = sent.second; + nbow.p_t2o->scale_parameters(pdropout); ComputationGraph cg; - Expression y_pred = nbow.BuildClassifier(x, cg); + Expression y_pred = nbow.BuildClassifier(x, cg, false); if (IsCurrentPredictionCorrection(cg, y)) dcorr++; //CrossEntropyLoss(y_pred, y); HingeLoss(y_pred, y); + //cerr << "DEVLINE: " << dtags << endl; dloss += as_scalar(cg.incremental_forward()); + nbow.p_t2o->scale_parameters(1.f/pdropout); dtags++; } - //lm.p_th2t->scale_parameters(1/pdrop); - eval = false; if (dloss < best) { best = dloss; ofstream out(fname); From 0dc42319fead52255994662600d2136892a96b33 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Sat, 27 Jun 2015 01:06:21 +0300 Subject: [PATCH 110/965] build instructions without Eigen --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index dc6551ca9..a4a11e0d6 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ You need the [development version of the Eigen library](https://bitbucket.org/ei Assertion failed: (false && "heap allocation is forbidden (EIGEN_NO_MALLOC is defined)"), function check_that_malloc_is_allowed, file /Users/cdyer/software/eigen-eigen-10219c95fe65/Eigen/src/Core/util/Memory.h, line 188. + #### Building In `src`, you need to first use [`cmake`](http://www.cmake.org/) to generate the makefiles @@ -25,6 +26,20 @@ To see that things have built properly, you can run which will train a multilayer perceptron to predict the xor function. +#### Building without Eigen installed + +If you don't have Eigen installed, the instructions below will fetch and compile +both `Eigen` and `cnn`. + + git clone https://github.com/yoavg/cnn.git + hg clone https://bitbucket.org/eigen/eigen/ + + cd cnn/ + mkdir build + cd build + cmake .. -DEIGEN3_INCLUDE_DIR=../eigen + make -j 2 + #### Debugging If you want to see the compile commands that are used, you can run From 36df9e781bd57de2894886a6a159d8aa3ee18786 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 27 Jun 2015 00:38:41 -0400 Subject: [PATCH 111/965] lic terms --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index e06d20818..28ab34023 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ Apache License same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright 2015 Chris Dyer Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From 1ea8ed14978b57f4ce8f4281566c4266b7ce6643 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 27 Jun 2015 02:28:53 -0400 Subject: [PATCH 112/965] more flexible types --- cnn/expr.cc | 8 -------- cnn/expr.h | 49 +++++++++++++++++++++---------------------------- 2 files changed, 21 insertions(+), 36 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index e242b5b99..435dfea16 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -41,14 +41,6 @@ Expression dropout(const Expression& x, real p) { return Expression(x.pg, x.pg-> Expression reshape(const Expression& x, const Dim& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } Expression transpose(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } - -Expression affine_transform(const std::initializer_list& xs) { - ComputationGraph *pg = xs.begin()->pg; - std::vector xis(xs.size()); - int i = 0; - for (auto& e : xs) xis[i++] = e.i; - return Expression(pg, pg->add_function(xis)); -} Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} Expression dot_product(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index f619c7d4a..2b0c3855d 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -53,7 +53,6 @@ Expression dropout(const Expression& x, real p); Expression reshape(const Expression& x, const Dim& d); Expression transpose(const Expression& x); -Expression affine_transform(const std::initializer_list& xs); Expression cwise_multiply(const Expression& x, const Expression& y); Expression dot_product(const Expression& x, const Expression& y); @@ -63,52 +62,46 @@ Expression l1_distance(const Expression& x, const Expression& y); Expression binary_log_loss(const Expression& x, const Expression& y); Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0); +// various convolutiony things Expression conv1d_narrow(const Expression& x, const Expression& f); Expression conv1d_wide(const Expression& x, const Expression& f); Expression kmax_pooling(const Expression& x, unsigned k); Expression fold_rows(const Expression& x, unsigned nrows=2); +Expression sum_cols(const Expression& x); +Expression kmh_ngram(const Expression& x, unsigned n); +// pick parts out of bigger objects Expression pick(const Expression& x, unsigned v); Expression pick(const Expression& x, unsigned* pv); Expression pickrange(const Expression& x, unsigned v, unsigned u); - Expression pickneglogsoftmax(const Expression& x, unsigned v); -template -Expression sum(const T& xs) { - ComputationGraph *pg = xs.begin()->pg; - std::vector xis(xs.size()); - for (int i=0; iadd_function(xis)); +namespace detail { + template + Expression f(const T& xs) { + ComputationGraph *pg = xs.begin()->pg; + std::vector xis(xs.size()); + int i = 0; + for (auto xi = xs.begin(); xi != xs.end(); ++xi) xis[i++] = xi->i; + return Expression(pg, pg->add_function(xis)); + } } template -Expression average(const T& xs) { - ComputationGraph *pg = xs.begin()->pg; - std::vector xis(xs.size()); - for (int i=0; iadd_function(xis)); -} +inline Expression sum(const T& xs) { return detail::f(xs); } template -Expression concatenate_cols(const T& xs) { - ComputationGraph *pg = xs.begin()->pg; - std::vector xis(xs.size()); - for (int i=0; iadd_function(xis)); -} +inline Expression average(const T& xs) { return detail::f(xs); } template -Expression concatenate(const T& xs) { - ComputationGraph *pg = xs.begin()->pg; - std::vector xis(xs.size()); - for (int i=0; iadd_function(xis)); -} +inline Expression concatenate_cols(const T& xs) { return detail::f(xs); } -Expression sum_cols(const Expression& x); +template +inline Expression concatenate(const T& xs) { return detail::f(xs); } -Expression kmh_ngram(const Expression& x, unsigned n); +template +inline Expression affine_transform(const T& xs) { return detail::f(xs); } +inline Expression affine_transform(const std::initializer_list& xs) { return detail::f(xs); } } } From beacae89da8b3e295620c341e1dc15a34c7e2a45 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 27 Jun 2015 02:56:26 -0400 Subject: [PATCH 113/965] eigen fix --- cnn/nodes.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 4603d4eb5..297002440 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -565,7 +565,7 @@ void MaxPooling1D::backward(const vector& xs, } template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE float logsumexp(const T& x) { +EIGEN_STRONG_INLINE float logsumexp(const T& x) { const float m = x.maxCoeff(); float z = 0; for (unsigned i = 0; i < x.rows(); ++i) @@ -664,7 +664,7 @@ void LogSoftmax::backward(const vector& xs, } template -EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE real logsumexp(const T& x, const vector& denom) { +EIGEN_STRONG_INLINE real logsumexp(const T& x, const vector& denom) { real m = x(denom[0],0); for (auto i : denom) { real r = x(i,0); From 29699374b2690de60eaf859d69369133a274bdb2 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 29 Jun 2015 00:17:49 -0400 Subject: [PATCH 114/965] adam training algorithm --- cnn/training.cc | 74 +++++++++++++++++++++++++++++++++---------------- cnn/training.h | 16 +++++++++++ 2 files changed, 66 insertions(+), 24 deletions(-) diff --git a/cnn/training.cc b/cnn/training.cc index f6cd0a362..1783a5376 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -186,35 +186,61 @@ void AdadeltaTrainer::update(real scale) { ++updates; } -#if 0 -void RMSPropTrainer::update(real scale) { - for (auto p : params) { - Tensor& x = p->values; - Tensor& g = p->g; - Tensor& v = vp[p]; - v *= decay; - v += g.cwiseProduct(g) * (1.0 - decay); - const Tensor reg = x * lambda; - x -= eta * g.cwiseQuotient((v + Tensor::Constant(v.rows(),v.cols(),eps)).cwiseSqrt()); - x -= reg; +void AdamTrainer::update(real scale) { + unsigned pi; + if (!shadow_params_allocated) { + m = AllocateShadowParameters(*model); + lm = AllocateShadowLookupParameters(*model); + v = AllocateShadowParameters(*model); + lv = AllocateShadowLookupParameters(*model); + shadow_params_allocated = true; + } + + const float gscale = clip_gradients(); + pi = 0; + static unsigned t = 0; + for (auto p : model->parameters_list()) { + ++t; + auto g_t = (scale * gscale) * *p->g; + auto m_t = *m[pi].h; + auto v_t = *v[pi].h; + auto reg = (*p->values) * lambda; + m_t = beta_1 * m_t + (1 - beta_1) * g_t; + auto g2 = g_t.cwiseProduct(g_t); + v_t = beta_2 * v_t + (1 - beta_2) * g2; + float s1 = 1 - pow(beta_1, t); + float s2 = 1 - pow(beta_2, t); + auto mhat = m_t / s1; + auto vhat = v_t / s2; + auto delta = (-eta * mhat).cwiseQuotient((vhat.array().sqrt() + eps).matrix()); + *p->values += delta - reg; p->clear(); + pi++; } - for (auto p : lookup_params) { - unordered_map& vt = vl[p]; - for (auto it : p->g) { - Tensor& x = p->values[it.first]; - Tensor& g = it.second; - Tensor& v = vt[it.first]; - if (v.rows() == 0) v = g * 0; - v *= decay; - v += g.cwiseProduct(g) * (1.0 - decay); - const Tensor reg = x * lambda; - x -= eta * g.cwiseQuotient((v + Tensor::Constant(v.rows(),v.cols(),eps)).cwiseSqrt()); - x -= reg; + + pi = 0; + for (auto p : model->lookup_parameters_list()) { + vector& vm = lm[pi].h; + vector& vv = lv[pi].h; + for (auto i : p->non_zero_grads) { + auto m_t = *vm[i]; + auto v_t = *vv[i]; + auto g_t = scale * gscale * *p->grads[i]; + auto g2 = g_t.cwiseProduct(g_t); + auto reg = (*p->values[i]) * lambda; + m_t = beta_1 * m_t + (1 - beta_1) * g_t; + v_t = beta_2 * v_t + (1 - beta_2) * g2; + float s1 = 1 - pow(beta_1, t); + float s2 = 1 - pow(beta_2, t); + auto mhat = m_t / s1; + auto vhat = v_t / s2; + auto delta = (-eta * mhat).cwiseQuotient((vhat.array().sqrt() + eps).matrix()); + *p->values[i] += delta - reg; } p->clear(); + pi++; } + ++updates; } -#endif } // namespace cnn diff --git a/cnn/training.h b/cnn/training.h index b4aa9b2e8..5a6a71631 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -90,6 +90,22 @@ struct AdadeltaTrainer : public Trainer { std::vector hld; }; +struct AdamTrainer : public Trainer { + explicit AdamTrainer(Model* m, float lambda = 1e-6, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8) : + Trainer(m, lambda, alpha), beta_1(beta_1), beta_2(beta_2), eps(eps), shadow_params_allocated(false) {} + + void update(real scale) override; + + float beta_1; + float beta_2; + float eps; + bool shadow_params_allocated; + std::vector m; // History of gradients + std::vector lm; + std::vector v; // History of deltas + std::vector lv; +}; + } // namespace cnn #endif From 7a2f0613ea5932e72b7bf76131e79e897ccddbae Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Mon, 29 Jun 2015 19:18:28 +0300 Subject: [PATCH 115/965] add a get_value method for the value of a non-top expression --- cnn/CMakeLists.txt | 3 ++- cnn/cnn.cc | 1 + cnn/cnn.h | 1 + cnn/exec.cc | 8 ++++++++ cnn/exec.h | 2 ++ cnn/expr.h | 1 + 6 files changed, 15 insertions(+), 1 deletion(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index ba9fca2f8..85203ecde 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -82,7 +82,8 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) #endforeach(test_src) # actual target: -add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) +#add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) +add_library(cnn SHARED ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE") diff --git a/cnn/cnn.cc b/cnn/cnn.cc index beb3096eb..428a57131 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -113,6 +113,7 @@ void ComputationGraph::set_dim_for_new_node(const VariableIndex& i) { const Tensor& ComputationGraph::incremental_forward() { return ee->incremental_forward(); } const Tensor& ComputationGraph::forward() { return ee->forward(); } +const Tensor& ComputationGraph::get_value(VariableIndex i) { return ee->get_value(i); } void ComputationGraph::backward() { ee->backward(); } void ComputationGraph::PrintGraphviz() const { diff --git a/cnn/cnn.h b/cnn/cnn.h index a3cebce5a..5fb72d7a4 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -75,6 +75,7 @@ struct ComputationGraph { // perform computations const Tensor& forward(); const Tensor& incremental_forward(); // if you want to add nodes and evaluate just the new parts + const Tensor& get_value(VariableIndex i); void backward(); // debugging diff --git a/cnn/exec.cc b/cnn/exec.cc index 924678866..5d63978ac 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -13,6 +13,14 @@ const Tensor& SimpleExecutionEngine::forward() { return incremental_forward(); } +const Tensor& SimpleExecutionEngine::get_value(VariableIndex i) { + assert(i < cg.nodes.size()); + if (i < last_node_evaluated) { + incremental_forward(); + } + return nfxs[i]; +} + const Tensor& SimpleExecutionEngine::incremental_forward() { // free any old memory if this is a new HG if (last_node_evaluated == 0) fxs->free(); diff --git a/cnn/exec.h b/cnn/exec.h index 95533cc83..972d3126d 100644 --- a/cnn/exec.h +++ b/cnn/exec.h @@ -10,6 +10,7 @@ class ExecutionEngine { virtual ~ExecutionEngine(); virtual const Tensor& forward() = 0; virtual const Tensor& incremental_forward() = 0; // if you want to add nodes and evaluate just the new parts + virtual const Tensor& get_value(VariableIndex i) = 0; virtual void backward() = 0; protected: explicit ExecutionEngine(const ComputationGraph& cg) : cg(cg) {} @@ -21,6 +22,7 @@ class SimpleExecutionEngine : public ExecutionEngine { explicit SimpleExecutionEngine(const ComputationGraph& cg) : ExecutionEngine(cg) {} const Tensor& forward() override; const Tensor& incremental_forward() override; // if you want to add nodes and evaluate just the new parts + const Tensor& get_value(VariableIndex i) override; void backward() override; private: std::vector nfxs; diff --git a/cnn/expr.h b/cnn/expr.h index f619c7d4a..4724a2eb4 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -12,6 +12,7 @@ struct Expression { Expression() : pg(nullptr) { } Expression(ComputationGraph *pg, VariableIndex i) : pg(pg), i(i) { } + const Tensor& value() { return pg->get_value(i); } }; Expression input(ComputationGraph& g, real s); From 5c656e966dd8d188579190ed3104ccbb9dd7204d Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Tue, 30 Jun 2015 17:33:31 +0300 Subject: [PATCH 116/965] pycnn initial --- cnn/expr.cc | 3 + cnn/expr.h | 1 + pycnn/pycnn.pxd | 155 +++++++++++++++++++++++++++ pycnn/pycnn.pyx | 279 ++++++++++++++++++++++++++++++++++++++++++++++++ pycnn/setup.py | 20 ++++ pycnn/xor.py | 59 ++++++++++ 6 files changed, 517 insertions(+) create mode 100644 pycnn/pycnn.pxd create mode 100644 pycnn/pycnn.pyx create mode 100644 pycnn/setup.py create mode 100644 pycnn/xor.py diff --git a/cnn/expr.cc b/cnn/expr.cc index e242b5b99..be4411297 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -49,6 +49,9 @@ Expression affine_transform(const std::initializer_list& xs) { for (auto& e : xs) xis[i++] = e.i; return Expression(pg, pg->add_function(xis)); } +Expression affine_transform(ComputationGraph& g, const std::vector& xs) { + return Expression(&g, g.add_function(xs)); +} Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} Expression dot_product(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index f619c7d4a..341c3659f 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -54,6 +54,7 @@ Expression reshape(const Expression& x, const Dim& d); Expression transpose(const Expression& x); Expression affine_transform(const std::initializer_list& xs); +Expression affine_transform(ComputationGraph& g, const std::vector& xs); Expression cwise_multiply(const Expression& x, const Expression& y); Expression dot_product(const Expression& x, const Expression& y); diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd new file mode 100644 index 000000000..8b7b8b521 --- /dev/null +++ b/pycnn/pycnn.pxd @@ -0,0 +1,155 @@ +from libcpp.vector cimport vector + +ctypedef float real + +cdef extern from "cnn/init.h" namespace "cnn": + cdef void Initialize(int& argc, char **& argv) + +cdef extern from "cnn/dim.h" namespace "cnn": + cdef cppclass CDim "cnn::Dim": + CDim() except + + CDim(int m) except + + CDim(int m, int n) except + + #CDim(std::initializer_list[long] x) except + + int size() + int sum_dims() + int ndims() + int rows() + int cols() + int size(unsigned i) + CDim transpose() + +cdef extern from "cnn/tensor.h" namespace "cnn": + cdef cppclass CTensor "cnn::Tensor": + pass + float c_as_scalar "cnn::as_scalar" (CTensor& t) + vector[float] c_as_vector "cnn::as_vector" (CTensor& t) + +cdef extern from "cnn/model.h" namespace "cnn": + cdef cppclass CParameters "cnn::Parameters": + CParameters() + #void scale_parameters(float a) # override; + #void squared_l2norm(float* sqnorm) const # override; + #void g_squared_l2norm(float* sqnorm) const # override; + #size_t size() const # override; + #void accumulate_grad(const Tensor& g) + #void clear() + pass + + cdef cppclass CLookupParameters "cnn::LookupParameters": + CLookupParameters() + #void scale_parameters(float a) # override; + #void squared_l2norm(float* sqnorm) const # override; + #void g_squared_l2norm(float* sqnorm) const # override; + #size_t size() const # override; + #void accumulate_grad(const Tensor& g) + #void clear() + #void Initialize(unsigned index, const vector[float]& val) + pass + + cdef cppclass CModel "cnn::Model": + CModel() + #float gradient_l2_norm() const + CParameters* add_parameters(CDim& d, float scale = 0.0) + CLookupParameters* add_lookup_parameters(unsigned n, const CDim& d) + +cdef extern from "cnn/cnn.h" namespace "cnn": + ctypedef unsigned VariableIndex + cdef cppclass CComputationGraph "cnn::ComputationGraph": + CComputationGraph() except + + # Inputs + VariableIndex add_input(real s) + VariableIndex add_input(const real* ps) + VariableIndex add_input(const CDim& d, const vector[float]* pdata) + + # Parameters + VariableIndex add_parameters(CParameters* p) + VariableIndex add_lookup(CLookupParameters* p, const unsigned* pindex) + VariableIndex add_lookup(CLookupParameters* p, unsigned index) + VariableIndex add_const_lookup(CLookupParameters* p, const unsigned* pindex) + VariableIndex add_const_lookup(CLookupParameters* p, unsigned index) + + const CTensor& forward() + const CTensor& incremental_forward() + #const CTensor& get_value(VariableIndex i) + void backward() + + void PrintGraphviz() const + +cdef extern from "cnn/training.h" namespace "cnn": + cdef cppclass CSimpleSGDTrainer "cnn::SimpleSGDTrainer": + CSimpleSGDTrainer(CModel* m, float lam, float e0) + void update(float s) + void update_epoch(float r) + + +cdef extern from "cnn/expr.h" namespace "cnn::expr": + cdef cppclass CExpression "cnn::expr::Expression": + CExpression() + CExpression(CComputationGraph *pg, long i) + CComputationGraph *pg + long i + #CExpression c_input "cnn::expr::input" (CComputationGraph& g, float s) # + CExpression c_input "cnn::expr::input" (CComputationGraph& g, float *ps) # + CExpression c_input "cnn::expr::input" (CComputationGraph& g, CDim& d, vector[float]* pdata) + CExpression c_parameter "cnn::expr::parameter" (CComputationGraph& g, CParameters* p) # + #CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # + CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters* p, unsigned* pindex) # + #CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # + CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, unsigned* pindex) # + + CExpression c_op_neg "cnn::expr::operator-" (CExpression& x) # + CExpression c_op_add "cnn::expr::operator+" (CExpression& x, CExpression& y) # + CExpression c_op_mul "cnn::expr::operator*" (CExpression& x, CExpression& y) # + CExpression c_op_scalar_mul "cnn::expr::operator*" (CExpression& x, float y) # + CExpression c_op_scalar_sub "cnn::expr::operator-" (float y, CExpression& x) # + + CExpression c_cdiv "cnn::expr::cdiv" (CExpression& x, CExpression& y) # + CExpression c_colwise_add "cnn::expr::colwise_add" (CExpression& x, CExpression& bias) # + + CExpression c_tanh "cnn::expr::tanh" (CExpression& x) # + CExpression c_exp "cnn::expr::exp" (CExpression& x) # + CExpression c_log "cnn::expr::log" (CExpression& x) # + CExpression c_logistic "cnn::expr::logistic" (CExpression& x) # + CExpression c_rectify "cnn::expr::rectify" (CExpression& x) # + #CExpression c_hinge "cnn::expr::hinge" (CExpression& x, unsigned index, float m=?) # + CExpression c_hinge "cnn::expr::hinge" (CExpression& x, unsigned* pindex, float m) # + CExpression c_log_softmax "cnn::expr::log_softmax" (CExpression& x) # + CExpression c_log_softmax "cnn::expr::log_softmax" (CExpression& x, vector[unsigned]& restriction) #? + CExpression c_softmax "cnn::expr::softmax" (CExpression& x) # + CExpression c_softsign "cnn::expr::softsign" (CExpression& x) # + CExpression c_noise "cnn::expr::noise" (CExpression& x, float stddev) # + CExpression c_dropout "cnn::expr::dropout" (CExpression& x, float p) # + + CExpression c_reshape "cnn::expr::reshape" (CExpression& x, CDim& d) #? + CExpression c_transpose "cnn::expr::transpose" (CExpression& x) # + + #CExpression c_affine_transform "cnn::expr::affine_transform" (const std::initializer_list& xs) + CExpression c_cwise_multiply "cnn::expr::cwise_multiply" (CExpression& x, CExpression& y) # + + CExpression c_dot_product "cnn::expr::dot_product" (CExpression& x, CExpression& y) # + CExpression c_squared_distance "cnn::expr::squared_distance" (CExpression& x, CExpression& y) # + CExpression c_huber_distance "cnn::expr::huber_distance" (CExpression& x, CExpression& y, float c) # + CExpression c_l1_distance "cnn::expr::l1_distance" (CExpression& x, CExpression& y) # + CExpression c_binary_log_loss "cnn::expr::binary_log_loss" (CExpression& x, CExpression& y) # + CExpression c_pairwise_rank_loss "cnn::expr::pairwise_rank_loss" (CExpression& x, CExpression& y, float m) # + + CExpression c_conv1d_narrow "cnn::expr::conv1d_narrow" (CExpression& x, CExpression& f) # + CExpression c_conv1d_wide "cnn::expr::conv1d_wide" (CExpression& x, CExpression& f) # + CExpression c_kmax_pooling "cnn::expr::kmax_pooling" (CExpression& x, unsigned k) # + CExpression c_fold_rows "cnn::expr::fold_rows" (CExpression& x, unsigned nrows) # + + #CExpression c_pick "cnn::expr::pick" (CExpression& x, unsigned v) # + CExpression c_pick "cnn::expr::pick" (CExpression& x, unsigned* pv) # + CExpression c_pickrange "cnn::expr::pickrange" (CExpression& x, unsigned v, unsigned u) # + + CExpression c_pickneglogsoftmax "cnn::expr::pickneglogsoftmax" (CExpression& x, unsigned v) # + + CExpression c_sum_cols "cnn::expr::sum_cols" (CExpression& x) # + CExpression c_kmh_ngram "cnn::expr::kmh_ngram" (CExpression& x, unsigned n) # + +#cdef extern from "cnn/model.h" namespace "cnn": +# cdef cppclass Model: + + + diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx new file mode 100644 index 000000000..f8729055a --- /dev/null +++ b/pycnn/pycnn.pyx @@ -0,0 +1,279 @@ +from pycnn cimport * +cimport pycnn + +cdef init(): + cdef char** argv = [] + cdef int argc = 0 + pycnn.Initialize(argc,argv) +init() + +#cdef class Dim: +# cdef CDim *thisptr +# def __cinit__(self, int n): +# self.thisptr = new CDim(n) +# def __dealloc__(self): +# del self.thisptr +# def bla(self): +# return self.thisptr.size() + +cdef CDim Dim(dim): + if isinstance(dim, tuple): + if len(dim) == 1: return CDim(dim[0]) + if len(dim) == 2: return CDim(dim[0],dim[1]) + return CDim(dim) + +cdef class Parameters: + cdef CParameters *thisptr + def __cinit__(self): + self.thisptr = NULL + @staticmethod + cdef wrap_ptr(CParameters* ptr): + self = Parameters() + self.thisptr = ptr + return self + +cdef class LookupParameters: + cdef CLookupParameters *thisptr + def __cinit__(self): + self.thisptr = NULL + @staticmethod + cdef wrap_ptr(CLookupParameters* ptr): + self = LookupParameters() + self.thisptr = ptr + return self + +cdef class Model: + cdef CModel *thisptr + cdef object named_params + def __cinit__(self): + self.thisptr = new CModel() + def __init__(self): + self.named_params = {} + + def __dealloc__(self): del self.thisptr + + def add_parameters(self, name, dim, scale=0): + cdef CParameters* p + if isinstance(dim, tuple): + if len(dim) == 1: + p = self.thisptr.add_parameters(CDim(dim[0])) + elif len(dim) == 2: + p = self.thisptr.add_parameters(CDim(dim[0],dim[1])) + else: + raise "Unsupported dimension",dim + else: # dim is a single numner + p = self.thisptr.add_parameters(CDim(dim)) + cdef Parameters pp = Parameters.wrap_ptr(p) + self.named_params[name] = pp + return pp + + def __getitem__(self, name): + return self.named_params[name] + + def __contains__(self, name): + return name in self.named_params + +cdef _add(Expr2 a, Expr2 b): return Expr2.from_cexpr(c_op_add(a.c(), b.c())) +cdef _mul(Expr2 a, Expr2 b): return Expr2.from_cexpr(c_op_mul(a.c(), b.c())) +cdef _neg(Expr2 a): return Expr2.from_cexpr(c_op_neg(a.c())) +cdef _scalarsub(float a, Expr2 b): return Expr2.from_cexpr(c_op_scalar_sub(a, b.c())) +cdef _cmul(Expr2 a, float b): return Expr2.from_cexpr(c_op_scalar_mul(a.c(), b)) + +cdef class Expr2: + cdef CComputationGraph *cg + cdef VariableIndex vindex + def __cinit__(self): + self.cg = NULL + self.vindex = 0 + @staticmethod + cdef Expr2 from_cexpr(CExpression cexpr): + self = Expr2() + self.cg = cexpr.pg + self.vindex = cexpr.i + return self + cdef CExpression c(self): + return CExpression(self.cg, self.vindex) + + #cdef scalar(self): + # return c_as_scalar(self.cg.get_value(self.vindex)) + + def __add__(self, other): return _add(self,other) + def __mul__(self, other): + if isinstance(self, Expr2) and isinstance(other, Expr2): + return _mul(self,other) + elif isinstance(self, (int,float)) or isinstance(other, (int,float)): + return _cmul(self, other) + else: raise NotImplementedError() + def __neg__(self): return _neg(self) + def __sub__(self, other): + if isinstance(self,Expr2) and isinstance(other,Expr2): + return self+(-other) + elif isinstance(self,(int,float)) and isinstance(other,Expr2): + return _scalarsub(self, other) + elif isinstance(self,Expr2) and isinstance(other,(int, float)): + return _neg(_scalarsub(other, self)) + else: raise NotImplementedError() + + +cpdef Expr2 parameter(ComputationGraph g, Parameters p): + return Expr2.from_cexpr(c_parameter(g.thisptr[0], p.thisptr)) + +cdef class InputExpr2(Expr2): + cdef float val + def __cinit__(self, ComputationGraph g, float s): + self.val = s + self.cg = g.thisptr + cdef CExpression e + e = c_input(self.cg[0], &(self.val)) + self.vindex = e.i + def set_input(self, float s): + self.val = s + +cdef class VecInputExpr2(Expr2): + cdef vector[float] data + def __cinit__(self, ComputationGraph g, vector[float] data): + dim = len(data) + self.data = data + self.cg = g.thisptr + cdef CExpression e + e = c_input(self.cg[0], Dim(dim), &(self.data)) + self.vindex = e.i + def set_input(self, vector[float] data): + self.data = data + +cdef class LookupExpr2(Expr2): + cdef unsigned index + def __cinit__(self, ComputationGraph g, LookupParameters p, unsigned index): + self.index = index + self.cg = g.thisptr + cdef CExpression e + e = c_lookup(self.cg[0], p.thisptr, &(self.index)) + self.vindex = e.i + def set_index(self, unsigned index): + self.index = index + +cdef class ConstLookupExpr2(Expr2): + cdef unsigned index + def __cinit__(self, ComputationGraph g, LookupParameters p, unsigned index): + self.index = index + self.cg = g.thisptr + cdef CExpression e + e = c_const_lookup(self.cg[0], p.thisptr, &(self.index)) + self.vindex = e.i + def set_index(self, unsigned index): + self.index = index + +# binary-exp +cpdef Expr2 cdiv(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_cdiv(x.c(), y.c())) +cpdef Expr2 colwise_add(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_colwise_add(x.c(), y.c())) + +cpdef Expr2 cwise_multiply(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_cwise_multiply(x.c(), y.c())) +cpdef Expr2 dot_product(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_dot_product(x.c(), y.c())) +cpdef Expr2 squared_distance(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_squared_distance(x.c(), y.c())) +cpdef Expr2 l1_distance(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_l1_distance(x.c(), y.c())) +cpdef Expr2 binary_log_loss(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_binary_log_loss(x.c(), y.c())) +cpdef Expr2 conv1d_narrow(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_conv1d_narrow(x.c(), y.c())) +cpdef Expr2 conv1d_wide(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_conv1d_wide(x.c(), y.c())) + +# unary-exp +cpdef Expr2 tanh(Expr2 x): return Expr2.from_cexpr(c_tanh(x.c())) +cpdef Expr2 exp(Expr2 x): return Expr2.from_cexpr(c_exp(x.c())) +cpdef Expr2 log(Expr2 x): return Expr2.from_cexpr(c_log(x.c())) +cpdef Expr2 logistic(Expr2 x): return Expr2.from_cexpr(c_logistic(x.c())) +cpdef Expr2 rectify(Expr2 x): return Expr2.from_cexpr(c_rectify(x.c())) +cpdef Expr2 log_softmax(Expr2 x, list restrict=None): + if restrict is None: + return Expr2.from_cexpr(c_log_softmax(x.c())) + cdef vector[unsigned] vec = restrict + return Expr2.from_cexpr(c_log_softmax(x.c(), vec)) +cpdef Expr2 softmax(Expr2 x): return Expr2.from_cexpr(c_softmax(x.c())) +cpdef Expr2 softsign(Expr2 x): return Expr2.from_cexpr(c_softsign(x.c())) +cpdef Expr2 transpose(Expr2 x): return Expr2.from_cexpr(c_transpose(x.c())) +cpdef Expr2 sum_cols(Expr2 x): return Expr2.from_cexpr(c_sum_cols(x.c())) +#expr-opt +cpdef Expr2 fold_rows(Expr2 x, unsigned nrows=2): return Expr2.from_cexpr(c_fold_rows(x.c(),nrows)) +#expr-expr-opt +cpdef Expr2 pairwise_rank_loss(Expr2 x, Expr2 y, float m=1.0): return Expr2.from_cexpr(c_pairwise_rank_loss(x.c(), y.c(), m)) +cpdef Expr2 huber_distance(Expr2 x, Expr2 y, float c=1.345): return Expr2.from_cexpr(c_huber_distance(x.c(), y.c(), c)) +#expr-unsigned +cpdef Expr2 kmax_pooling(Expr2 x, unsigned k): return Expr2.from_cexpr(c_kmax_pooling(x.c(), k)) +cpdef Expr2 pickneglogsoftmax(Expr2 x, unsigned v): return Expr2.from_cexpr(c_pickneglogsoftmax(x.c(), v)) +cpdef Expr2 kmh_ngram(Expr2 x, unsigned v): return Expr2.from_cexpr(c_kmh_ngram(x.c(), v)) +cpdef Expr2 pickrange(Expr2 x, unsigned v, unsigned u): return Expr2.from_cexpr(c_pickrange(x.c(), v, u)) +#expr-float +cpdef Expr2 noise(Expr2 x, float stddev): return Expr2.from_cexpr(c_noise(x.c(), stddev)) +cpdef Expr2 dropout(Expr2 x, float p): return Expr2.from_cexpr(c_dropout(x.c(), p)) +#expr-dim +cpdef Expr2 reshape(Expr2 x, tuple d): return Expr2.from_cexpr(c_reshape(x.c(),Dim(d))) +#expr-ptr +cdef class hinge(Expr2): + cdef unsigned index + def __cinit__(self, Expr2 x, unsigned index, float m=1.0): + self.index = index + self.cg = x.cg + cdef CExpression e + e = c_hinge(x.c(), &(self.index), m) + self.vindex = e.i + def set_index(self, unsigned i): + self.index = i + +cdef class pick(Expr2): + cdef unsigned index + def __cinit__(self, Expr2 x, unsigned index): + self.index = index + self.cg = x.cg + cdef CExpression e + e = c_pick(x.c(), &(self.index)) + self.vindex = e.i + def set_index(self, unsigned i): + self.index = i + + +cdef class ComputationGraph: + cdef CComputationGraph *thisptr, + def __cinit__(self): + self.thisptr = new CComputationGraph() + def __dealloc__(self): + del self.thisptr + + cpdef renew(self): + del self.thisptr + self.thisptr = new CComputationGraph() + return self + + def parameters(self, model, name, dim=None): + cdef Parameters params + cdef Expr2 result + if name in model: + params = model[name] + else: + assert(dim is not None) + params = model.add_parameters(name, dim) + result = Expr2.from_cexpr(c_parameter(self.thisptr[0], params.thisptr)) + #result = self._expr(parameter(self.thisptr[0], params.thisptr)) + #result = Expression.wrap_ptr(&(parameter(self.thisptr[0], params.thisptr))) + return result + + cpdef forward_scalar(self): + return c_as_scalar(self.thisptr.forward()) + + cpdef forward_vec(self): + return c_as_vector(self.thisptr.forward()) + + cpdef backward(self): + self.thisptr.backward() + + +cdef class SimpleSGDTrainer: + cdef CSimpleSGDTrainer *thisptr + def __cinit__(self, Model m, float lam = 1e-6, float e0 = 0.1): + self.thisptr = new CSimpleSGDTrainer(m.thisptr, lam, e0) + def __dealloc__(self): + del self.thisptr + cpdef update(self, float s): + self.thisptr.update(s) + cpdef update_epoch(self, float r = 1.0): + self.thisptr.update_epoch(r) + + + diff --git a/pycnn/setup.py b/pycnn/setup.py new file mode 100644 index 000000000..75f3c45df --- /dev/null +++ b/pycnn/setup.py @@ -0,0 +1,20 @@ +from distutils.core import setup +from distutils.extension import Extension +from Cython.Distutils import build_ext + +ext = Extension( + "pycnn", # name of extension + ["pycnn.pyx"], # filename of our Pyrex/Cython source + language="c++", # this causes Pyrex/Cython to create C++ source + include_dirs=["/home/yogo/Vork/Research/cnn/cnn/", + "/home/yogo/Vork/Research/cnn/eigen/"], + libraries=['cnn'], # ditto + library_dirs=["."], + #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed + extra_compile_args=["-std=c++11"] + + ) + +setup(ext_modules = [ext], + cmdclass = {'build_ext': build_ext} + ) diff --git a/pycnn/xor.py b/pycnn/xor.py new file mode 100644 index 000000000..ee68ee3cb --- /dev/null +++ b/pycnn/xor.py @@ -0,0 +1,59 @@ +from pycnn import * + +HIDDEN_SIZE = 8 +ITERATIONS = 30 + +m = Model() +sgd = SimpleSGDTrainer(m) + +cg = ComputationGraph() + +m.add_parameters("W",(HIDDEN_SIZE, 2)) +m.add_parameters("b",HIDDEN_SIZE) +m.add_parameters("V",(1, HIDDEN_SIZE)) +m.add_parameters("a",1) + +W = cg.parameters(m, "W") +b = cg.parameters(m, "b") +V = cg.parameters(m, "V") +a = cg.parameters(m, "a") + +x = VecInputExpr2(cg, [0,0]) +y = InputExpr2(cg, 0) +#print type(x) +h = tanh((W*x) + b) +y_pred = (V*h) + a +loss = squared_distance(y_pred, y) + +for iter in xrange(ITERATIONS): + mloss = 0.0 + for mi in xrange(4): + x1 = mi % 2 + x2 = (mi / 2) % 2 + x.set_input([1 if x1 else -1, 1 if x2 else -1]) + y.set_input(1 if x1 != x2 else -1) + mloss += cg.forward_scalar() + cg.backward() + sgd.update(1.0) + sgd.update_epoch(); + mloss /= 4 + print "loss: %0.9f" % mloss + +x.set_input([-1,1]) +z = -(-y_pred) +print cg.forward_scalar() +#print y_pred.scalar() + +cg = cg.renew() +W = cg.parameters(m, "W") +b = cg.parameters(m, "b") +V = cg.parameters(m, "V") +a = cg.parameters(m, "a") + +x = VecInputExpr2(cg, [0,0]) +y = InputExpr2(cg, 0) +#print type(x) +h = tanh((W*x) + b) +y_pred = (V*h) + a +x.set_input([1,-1]) +print "XX",cg.forward_scalar() From 882a47a9bdc02504832267c2ea5275dd08cfa34a Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 4 Jul 2015 18:19:47 -0700 Subject: [PATCH 117/965] simplify handling of dropout --- cnn/nodes.cc | 10 +++++----- cnn/tensor.cc | 4 ++-- cnn/tensor.h | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 297002440..ac8a17903 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -213,15 +213,15 @@ size_t Dropout::aux_storage_size() const { void Dropout::forward(const vector& xs, Tensor& fx) const { Tensor m(dim, (float*)aux_mem); - TensorTools::RandomBernoulli(m, p); + TensorTools::RandomBernoulli(m, (1.f-p), 1.f / (1.f-p)); (*fx) = (**xs[0]).cwiseProduct(*m); } void Dropout::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { Tensor m(dim, (float*)aux_mem); (*dEdxi) += (*dEdf).cwiseProduct(*m); }; diff --git a/cnn/tensor.cc b/cnn/tensor.cc index b76fcce6b..b89cf0750 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -100,9 +100,9 @@ void TensorTools::Randomize(Tensor& d) { Randomize(d, sqrt(6) / sqrt(d.d.sum_dims())); } -void TensorTools::RandomBernoulli(Tensor& val, real p) { +void TensorTools::RandomBernoulli(Tensor& val, real p, real scale) { bernoulli_distribution distribution(p); - auto b = [&] (real) {return distribution(*rndeng);}; + auto b = [&] (real) {return distribution(*rndeng) * scale;}; Dim d({val.d.size()}); Tensor tv(d, val.v); *tv = Eigen::MatrixXf::NullaryExpr(d.size(), 1, b); diff --git a/cnn/tensor.h b/cnn/tensor.h index 729155a7e..7446edbbe 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -80,7 +80,8 @@ struct TensorTools { static void Zero(Tensor& d); static void Randomize(Tensor& val, real scale); static void Randomize(Tensor& d); - static void RandomBernoulli(Tensor& val, real p); + // sample some bernoulli random variables and scale them by scale + static void RandomBernoulli(Tensor& val, real p, real scale = 1.0); static void RandomizeNormal(real mean, real stddev, Tensor& val); // AccessElement is very, very slow (potentially) - use appropriately static float AccessElement(const Tensor& v, const Dim& index); From 1bd6a0af5d04eb76c64837e50730f918d77e95e3 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Tue, 7 Jul 2015 12:49:54 +0300 Subject: [PATCH 118/965] Fixes to pycnn --- cnn/CMakeLists.txt | 2 +- cnn/expr.cc | 8 +- cnn/expr.h | 2 +- pycnn/makefile | 5 + pycnn/nlm.py | 76 ++++++ pycnn/pycnn.pxd | 33 ++- pycnn/pycnn.pyx | 585 ++++++++++++++++++++++++++++++++++----------- pycnn/rnnlm.py | 134 +++++++++++ pycnn/util.py | 36 +++ pycnn/xor.py | 41 +++- 10 files changed, 758 insertions(+), 164 deletions(-) create mode 100644 pycnn/makefile create mode 100644 pycnn/nlm.py create mode 100644 pycnn/rnnlm.py create mode 100644 pycnn/util.py diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index ba9fca2f8..9c8dd9904 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -82,7 +82,7 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) #endforeach(test_src) # actual target: -add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) +add_library(cnn SHARED ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE") diff --git a/cnn/expr.cc b/cnn/expr.cc index be4411297..c2dd9f669 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -49,8 +49,12 @@ Expression affine_transform(const std::initializer_list& xs) { for (auto& e : xs) xis[i++] = e.i; return Expression(pg, pg->add_function(xis)); } -Expression affine_transform(ComputationGraph& g, const std::vector& xs) { - return Expression(&g, g.add_function(xs)); +Expression affine_transform(const std::vector& xs) { + ComputationGraph *pg = xs.begin()->pg; + std::vector xis(xs.size()); + int i = 0; + for (auto& e : xs) xis[i++] = e.i; + return Expression(pg, pg->add_function(xis)); } Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} diff --git a/cnn/expr.h b/cnn/expr.h index 341c3659f..b025104ff 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -54,7 +54,7 @@ Expression reshape(const Expression& x, const Dim& d); Expression transpose(const Expression& x); Expression affine_transform(const std::initializer_list& xs); -Expression affine_transform(ComputationGraph& g, const std::vector& xs); +Expression affine_transform(const std::vector& xs); Expression cwise_multiply(const Expression& x, const Expression& y); Expression dot_product(const Expression& x, const Expression& y); diff --git a/pycnn/makefile b/pycnn/makefile new file mode 100644 index 000000000..dd80684aa --- /dev/null +++ b/pycnn/makefile @@ -0,0 +1,5 @@ +pycnn.so: ../build/cnn/libcnn.so pycnn.pyx pycnn.pxd setup.py + cp ../build/cnn/libcnn.so . + python2 setup.py build_ext --inplace + + diff --git a/pycnn/nlm.py b/pycnn/nlm.py new file mode 100644 index 000000000..11249dde3 --- /dev/null +++ b/pycnn/nlm.py @@ -0,0 +1,76 @@ +from pycnn import * + + + +from util import CorpusReader, Vocab +#corpus = CorpusReader("../examples/example-data/fin-toy.txt") +corpus = CorpusReader("ngrams") +vocab = Vocab.from_corpus(corpus) + +def corpus_to_examples(corpus,CONTEXT=3): + for sent in corpus: + for i in xrange(CONTEXT,len(sent)): + ctx = sent[i-CONTEXT:i] + word = sent[i] + yield (ctx, word) + +#for ctx, word in corpus_to_examples(corpus): +# print " ".join(str(vocab.w2i[c]) for c in ctx),vocab.w2i[word] +#sys.exit() + + +print vocab.size() + +CONTEXT = 3 +DIM = 100 +VOCAB_SIZE = vocab.size() + +m = Model() +sgd = SimpleSGDTrainer(m) +cg = ComputationGraph() + +class InputWordIds: + def __init__(self, cg, lookup_params, nwords): + self.exprs = [LookupExpression(cg, lookup_params) for _ in xrange(nwords)] + def feed(self, word_ids): + [e.set(i) for (e,i) in zip(self.exprs,word_ids)] + +# TODO this can be made nicer I think +m.add_lookup_parameters("word_lookup", (VOCAB_SIZE, DIM)) +contexts = InputWordIds(cg, m["word_lookup"], CONTEXT) +cvec = concatenate(contexts.exprs) # TODO + +C = cg.parameters(m, "C", (DIM, DIM*CONTEXT)) +hb = cg.parameters(m, "hb", DIM) +R = cg.parameters(m, "R", (VOCAB_SIZE, DIM)) +bias = cg.parameters(m, "bias", VOCAB_SIZE) + +r = hb + (C * cvec) +nl = rectify(r) +o2 = bias + (R * nl) +ydist = log_softmax(o2) +expected_outcome = IntValue() +nerr = -pick(ydist, expected_outcome) # TODO: make nicer API! + +cg.PrintGraphviz() + + +data = list(corpus_to_examples(corpus)) +loss = 0.0 +#for i, (context_words, target_word) in enumerate(corpus_to_examples(corpus)): +import time +thestart = time.time() +for iter in xrange(100): + start = time.time() + for i, (context_words, target_word) in enumerate(data): + contexts.feed([vocab.w2i[w] for w in context_words]) + expected_outcome.set(vocab.w2i[target_word]) + loss += cg.forward_scalar() + cg.backward() + sgd.update(1.0) + if i == 2500: break + print loss / float(i) + loss = 0.0 + print "TIME:", (time.time() - start) * 1000 + +print "total:",time.time() - thestart diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index 8b7b8b521..c3928894d 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -81,6 +81,7 @@ cdef extern from "cnn/training.h" namespace "cnn": CSimpleSGDTrainer(CModel* m, float lam, float e0) void update(float s) void update_epoch(float r) + void status() cdef extern from "cnn/expr.h" namespace "cnn::expr": @@ -124,7 +125,7 @@ cdef extern from "cnn/expr.h" namespace "cnn::expr": CExpression c_reshape "cnn::expr::reshape" (CExpression& x, CDim& d) #? CExpression c_transpose "cnn::expr::transpose" (CExpression& x) # - #CExpression c_affine_transform "cnn::expr::affine_transform" (const std::initializer_list& xs) + CExpression c_affine_transform "cnn::expr::affine_transform" (const vector[CExpression]& xs) CExpression c_cwise_multiply "cnn::expr::cwise_multiply" (CExpression& x, CExpression& y) # CExpression c_dot_product "cnn::expr::dot_product" (CExpression& x, CExpression& y) # @@ -145,11 +146,41 @@ cdef extern from "cnn/expr.h" namespace "cnn::expr": CExpression c_pickneglogsoftmax "cnn::expr::pickneglogsoftmax" (CExpression& x, unsigned v) # + # expecting a vector of CExpression + CExpression c_average "cnn::expr::average" (vector[CExpression]& xs) + CExpression c_concat_cols "cnn::expr::concatenate_cols" (vector[CExpression]& xs) + CExpression c_concat "cnn::expr::concatenate" (vector[CExpression]& xs) + + CExpression c_sum "cnn::expr::sum" (vector[CExpression]& xs) + CExpression c_sum_cols "cnn::expr::sum_cols" (CExpression& x) # CExpression c_kmh_ngram "cnn::expr::kmh_ngram" (CExpression& x, unsigned n) # #cdef extern from "cnn/model.h" namespace "cnn": # cdef cppclass Model: +# TODO unify with LSTMBuilder using inheritance +cdef extern from "cnn/rnn.h" namespace "cnn": + #cdef cppclass RNNBuilder "cnn::RNNBuilder": + cdef cppclass CSimpleRNNBuilder "cnn::SimpleRNNBuilder": + CSimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) + void new_graph(CComputationGraph &cg) + void start_new_sequence(vector[CExpression] ces) + CExpression add_input(CExpression &x) + void rewind_one_step() + CExpression back() + vector[CExpression] final_h() + vector[CExpression] final_s() + +cdef extern from "cnn/lstm.h" namespace "cnn": + cdef cppclass CLSTMBuilder "cnn::LSTMBuilder": + CLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) + void new_graph(CComputationGraph &cg) + void start_new_sequence(vector[CExpression] ces) + CExpression add_input(CExpression &x) + void rewind_one_step() + CExpression back() + vector[CExpression] final_h() + vector[CExpression] final_s() diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index f8729055a..2131795c4 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -1,3 +1,25 @@ +import sys +from cython.operator cimport dereference as deref +# TODO: +# - set random seed (in CNN) +# - better input / output support +# WORKS, but need to be unified? for example, why "pick" takes a pointer to int, and "squared_distance" takes an expression? +# - load embeddings file +# - load/save models +# - make ComputationGraph a singleton??? +# - NOTE: why do we need to filter short sentences in rnnlm.py or crash?? + +# Examples: +# V xor +# V xor-xent +# - textcat +# - tag-bilstm +# - rnnlm +# V nlm +# - encdec +# - embedcl +# - embed/nlm -- negative sampling? + from pycnn cimport * cimport pycnn @@ -7,20 +29,19 @@ cdef init(): pycnn.Initialize(argc,argv) init() -#cdef class Dim: -# cdef CDim *thisptr -# def __cinit__(self, int n): -# self.thisptr = new CDim(n) -# def __dealloc__(self): -# del self.thisptr -# def bla(self): -# return self.thisptr.size() - cdef CDim Dim(dim): + """ + dim: either a tuple or an int + """ if isinstance(dim, tuple): if len(dim) == 1: return CDim(dim[0]) - if len(dim) == 2: return CDim(dim[0],dim[1]) - return CDim(dim) + elif len(dim) == 2: return CDim(dim[0],dim[1]) + else: + raise "Unsupported dimension",dim + # hope it's a number. TODO: error checking / exception + if isinstance(dim, int): + return CDim(dim) + raise "Unsupported dimension",dim cdef class Parameters: cdef CParameters *thisptr @@ -54,161 +75,402 @@ cdef class Model: def add_parameters(self, name, dim, scale=0): cdef CParameters* p - if isinstance(dim, tuple): - if len(dim) == 1: - p = self.thisptr.add_parameters(CDim(dim[0])) - elif len(dim) == 2: - p = self.thisptr.add_parameters(CDim(dim[0],dim[1])) - else: - raise "Unsupported dimension",dim - else: # dim is a single numner - p = self.thisptr.add_parameters(CDim(dim)) + p = self.thisptr.add_parameters(Dim(dim)) cdef Parameters pp = Parameters.wrap_ptr(p) self.named_params[name] = pp return pp + def add_lookup_parameters(self, name, dim, scale=0): + assert(isinstance(dim, tuple)) + cdef int nids = dim[0] + rest = tuple(dim[1:]) + cdef CLookupParameters* p + p = self.thisptr.add_lookup_parameters(nids, Dim(rest)) + cdef LookupParameters pp = LookupParameters.wrap_ptr(p) + self.named_params[name] = pp + return pp + def __getitem__(self, name): return self.named_params[name] def __contains__(self, name): return name in self.named_params -cdef _add(Expr2 a, Expr2 b): return Expr2.from_cexpr(c_op_add(a.c(), b.c())) -cdef _mul(Expr2 a, Expr2 b): return Expr2.from_cexpr(c_op_mul(a.c(), b.c())) -cdef _neg(Expr2 a): return Expr2.from_cexpr(c_op_neg(a.c())) -cdef _scalarsub(float a, Expr2 b): return Expr2.from_cexpr(c_op_scalar_sub(a, b.c())) -cdef _cmul(Expr2 a, float b): return Expr2.from_cexpr(c_op_scalar_mul(a.c(), b)) -cdef class Expr2: + +# {{{ Computation Graph + +# {{{ "Pointers" + +cdef class UnsignedValue: + cdef unsigned val + def __cinit__(self, val = 0): self.val = val + def set(self, val): self.val = val + def get(self): return self.val + cdef unsigned* addr(self): return &(self.val) + +cdef class FloatValue: + cdef float val + def __cinit__(self, val = 0): self.val = val + def set(self, val): self.val = val + def get(self): return self.val + cdef float* addr(self): return &(self.val) + +cdef class FloatVectorValue: + cdef vector[float] *vals + def __cinit__(self, vals): + self.vals = new vector[float]() + self.set(vals) + def __dealloc__(self): + del self.vals + def set(self, newval): + self.vals.clear() + for f in newval: self.vals.push_back(f) + def get(self): return deref(self.vals) + def size(self): return len(deref(self.vals)) + cdef vector[float]* addr(self): return self.vals + +# }}} + +cdef class ComputationGraph: + cdef CComputationGraph *thisptr, + cdef list _inputs + def __cinit__(self): + self.thisptr = new CComputationGraph() + self._inputs = [] + def __dealloc__(self): + del self.thisptr + + cpdef renew(self): + del self.thisptr + self.thisptr = new CComputationGraph() + self._inputs = [] + return self + + def parameters(self, model, name, dim=None): + cdef Parameters params + cdef Expression result + if name in model: + params = model[name] + else: + assert(dim is not None) + params = model.add_parameters(name, dim) + result = Expression.from_cexpr(c_parameter(self.thisptr[0], params.thisptr)) + #result = self._expr(parameter(self.thisptr[0], params.thisptr)) + #result = Expression.wrap_ptr(&(parameter(self.thisptr[0], params.thisptr))) + return result + + cpdef forward_scalar(self): + return c_as_scalar(self.thisptr.forward()) + + cpdef inc_forward_scalar(self): + return c_as_scalar(self.thisptr.incremental_forward()) + + cpdef forward_vec(self): + return c_as_vector(self.thisptr.forward()) + + cpdef inc_forward_vec(self): + return c_as_vector(self.thisptr.incremental_forward()) + + cpdef backward(self): + self.thisptr.backward() + + cpdef PrintGraphviz(self): + self.thisptr.PrintGraphviz() + + # CNN handles changing inputs keeping pointers to memoty locations. + # Because of python's memory management, objects that wrap such pointers + # must be registered in a central location. This location would be the + # computation graph. + # + # We need to support the following cases: + # input(real*) + # input(vector*) + # lookup(params, unsigned*) + # const_lookup(params, unsigned*) + # pick(unsigned*) + # + # We have the classes UnsignedValue, FloatValue and FloatVectorValue for + # this purpose. + cpdef inputValue(self, FloatValue v): + self._inputs.append(v) + return inputValue(self, v) + cpdef inputVector(self, FloatVectorValue fv): + self._inputs.append(fv) + return inputVector(self, fv) + cpdef lookup(self, LookupParameters p, UnsignedValue v, update=True): + self._inputs.append(v) + return lookup(self, p, v, update) + + + + +# }}} + +#{{{ Expressions + +cdef _add(Expression a, Expression b): return Expression.from_cexpr(c_op_add(a.c(), b.c())) +cdef _mul(Expression a, Expression b): return Expression.from_cexpr(c_op_mul(a.c(), b.c())) +cdef _neg(Expression a): return Expression.from_cexpr(c_op_neg(a.c())) +cdef _scalarsub(float a, Expression b): return Expression.from_cexpr(c_op_scalar_sub(a, b.c())) +cdef _cmul(Expression a, float b): return Expression.from_cexpr(c_op_scalar_mul(a.c(), b)) + +cdef class Expression: #{{{ cdef CComputationGraph *cg cdef VariableIndex vindex def __cinit__(self): self.cg = NULL self.vindex = 0 @staticmethod - cdef Expr2 from_cexpr(CExpression cexpr): - self = Expr2() + cdef Expression from_cexpr(CExpression cexpr): + self = Expression() self.cg = cexpr.pg self.vindex = cexpr.i return self cdef CExpression c(self): return CExpression(self.cg, self.vindex) + def __repr__(self): + return str(self) + def __str__(self): + return "exprssion %s" % self.vindex #cdef scalar(self): # return c_as_scalar(self.cg.get_value(self.vindex)) def __add__(self, other): return _add(self,other) def __mul__(self, other): - if isinstance(self, Expr2) and isinstance(other, Expr2): + if isinstance(self, Expression) and isinstance(other, Expression): return _mul(self,other) elif isinstance(self, (int,float)) or isinstance(other, (int,float)): return _cmul(self, other) else: raise NotImplementedError() def __neg__(self): return _neg(self) def __sub__(self, other): - if isinstance(self,Expr2) and isinstance(other,Expr2): + if isinstance(self,Expression) and isinstance(other,Expression): return self+(-other) - elif isinstance(self,(int,float)) and isinstance(other,Expr2): + elif isinstance(self,(int,float)) and isinstance(other,Expression): return _scalarsub(self, other) - elif isinstance(self,Expr2) and isinstance(other,(int, float)): + elif isinstance(self,Expression) and isinstance(other,(int, float)): return _neg(_scalarsub(other, self)) else: raise NotImplementedError() - - -cpdef Expr2 parameter(ComputationGraph g, Parameters p): - return Expr2.from_cexpr(c_parameter(g.thisptr[0], p.thisptr)) - -cdef class InputExpr2(Expr2): - cdef float val +#}}} + +cpdef Expression parameter(ComputationGraph g, Parameters p): + return Expression.from_cexpr(c_parameter(g.thisptr[0], p.thisptr)) + +# {{{ Mutable Expressions +# These depend values that can be set by the caller + +#cdef class InputExpression(Expression): +# cdef float val +# def __cinit__(self, ComputationGraph g, float s): +# self.val = s +# self.cg = g.thisptr +# cdef CExpression e +# e = c_input(self.cg[0], &(self.val)) +# self.vindex = e.i +# def set(self, float s): +# self.val = s + +cdef class inputExpression(Expression): + cdef FloatValue val def __cinit__(self, ComputationGraph g, float s): - self.val = s + self.val = FloatValue(s) self.cg = g.thisptr cdef CExpression e - e = c_input(self.cg[0], &(self.val)) + e = c_input(self.cg[0], self.val.addr()) self.vindex = e.i - def set_input(self, float s): - self.val = s - -cdef class VecInputExpr2(Expr2): - cdef vector[float] data - def __cinit__(self, ComputationGraph g, vector[float] data): - dim = len(data) - self.data = data + g._inputs.append(self) + def set(self, float s): + self.val.set(s) +# +#cdef class VecInputExpression(Expression): +# cdef vector[float] *data +# def __cinit__(self, ComputationGraph g, vector[float] data): +# cdef float f +# dim = len(data) +# self.data = new vector[float]() +# for f in data: +# self.data.push_back(f) +# self.cg = g.thisptr +# cdef CExpression e +# e = c_input(self.cg[0], Dim(dim), self.data) +# self.vindex = e.i +# def __dealloc__(self): +# print >> sys.stderr,"del" +# del self.data +# def set(self, vector[float] data): +# cdef float f +# self.data.clear() +# for f in data: +# self.data.push_back(f) + +cdef class vecInputExpression(Expression): + cdef FloatVectorValue val + def __cinit__(self, ComputationGraph g, FloatVectorValue val): + self.val = val self.cg = g.thisptr cdef CExpression e - e = c_input(self.cg[0], Dim(dim), &(self.data)) + e = c_input(self.cg[0], Dim(val.size()), self.val.addr()) self.vindex = e.i - def set_input(self, vector[float] data): - self.data = data - -cdef class LookupExpr2(Expr2): - cdef unsigned index - def __cinit__(self, ComputationGraph g, LookupParameters p, unsigned index): - self.index = index + g._inputs.append(self) + def set(self, vector[float] data): + self.val.set(data) + +#cdef class LookupExpression(Expression): +# cdef unsigned index +# def __cinit__(self, ComputationGraph g, LookupParameters p, unsigned index=0): +# self.index = 1 +# #self.pindex = &(self.index) +# #self.pindex[0] = index +# self.cg = g.thisptr +# cdef CExpression e +# e = c_lookup(self.cg[0], p.thisptr, &(self.index)) +# self.vindex = e.i +# def set(self,i): self.index=i + +cdef class lookupExpression(Expression): + cdef UnsignedValue val + def __cinit__(self, ComputationGraph g, LookupParameters p, unsigned index=0, update=True): + self.val = UnsignedValue(index) self.cg = g.thisptr cdef CExpression e - e = c_lookup(self.cg[0], p.thisptr, &(self.index)) + if update: + e = c_lookup(self.cg[0], p.thisptr, self.val.addr()) + else: + e = c_const_lookup(self.cg[0], p.thisptr, self.val.addr()) self.vindex = e.i - def set_index(self, unsigned index): - self.index = index + g._inputs.append(self) + def set(self,i): self.val.set(i) + +#cdef class ConstLookupExpression(Expression): +# """Const in the sense that the lookup table is not updated. +# """ +# cdef unsigned index +# def __cinit__(self, ComputationGraph g, LookupParameters p, unsigned index): +# self.index = index +# self.cg = g.thisptr +# cdef CExpression e +# e = c_const_lookup(self.cg[0], p.thisptr, &(self.index)) +# self.vindex = e.i +# def set_index(self, unsigned index): +# self.index = index +# }}} + +#cdef class pick(Expression): +# cdef IntValue index +# def __cinit__(self, Expression x, IntValue index): +# self.index = index +# self.cg = x.cg +# cdef CExpression e +# e = c_pick(x.c(), &(self.index.val)) +# self.vindex = e.i +# #def set_index(self, unsigned i): +# # self.index = i + + +cdef Expression inputValue(ComputationGraph cg, FloatValue v): + return Expression.from_cexpr(c_input(cg.thisptr[0], v.addr())) + +cdef Expression inputVector(ComputationGraph cg, FloatVectorValue v): + return Expression.from_cexpr(c_input(cg.thisptr[0], Dim(v.size()), v.addr())) + +cdef Expression lookup(ComputationGraph cg, LookupParameters p, UnsignedValue v, update): + if update: + return Expression.from_cexpr(c_lookup(cg.thisptr[0], p.thisptr, v.addr())) + else: + return Expression.from_cexpr(c_const_lookup(cg.thisptr[0], p.thisptr, v.addr())) + +cpdef Expression pick(Expression x, UnsignedValue v): + # TODO register automatically in CG!! how? + #x.cg._inputs.append(v) + return Expression.from_cexpr(c_pick(x.c(), v.addr())) -cdef class ConstLookupExpr2(Expr2): - cdef unsigned index - def __cinit__(self, ComputationGraph g, LookupParameters p, unsigned index): - self.index = index - self.cg = g.thisptr - cdef CExpression e - e = c_const_lookup(self.cg[0], p.thisptr, &(self.index)) - self.vindex = e.i - def set_index(self, unsigned index): - self.index = index # binary-exp -cpdef Expr2 cdiv(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_cdiv(x.c(), y.c())) -cpdef Expr2 colwise_add(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_colwise_add(x.c(), y.c())) +cpdef Expression cdiv(Expression x, Expression y): return Expression.from_cexpr(c_cdiv(x.c(), y.c())) +cpdef Expression colwise_add(Expression x, Expression y): return Expression.from_cexpr(c_colwise_add(x.c(), y.c())) -cpdef Expr2 cwise_multiply(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_cwise_multiply(x.c(), y.c())) -cpdef Expr2 dot_product(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_dot_product(x.c(), y.c())) -cpdef Expr2 squared_distance(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_squared_distance(x.c(), y.c())) -cpdef Expr2 l1_distance(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_l1_distance(x.c(), y.c())) -cpdef Expr2 binary_log_loss(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_binary_log_loss(x.c(), y.c())) -cpdef Expr2 conv1d_narrow(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_conv1d_narrow(x.c(), y.c())) -cpdef Expr2 conv1d_wide(Expr2 x, Expr2 y): return Expr2.from_cexpr(c_conv1d_wide(x.c(), y.c())) +cpdef Expression cwise_multiply(Expression x, Expression y): return Expression.from_cexpr(c_cwise_multiply(x.c(), y.c())) +cpdef Expression dot_product(Expression x, Expression y): return Expression.from_cexpr(c_dot_product(x.c(), y.c())) +cpdef Expression squared_distance(Expression x, Expression y): return Expression.from_cexpr(c_squared_distance(x.c(), y.c())) +cpdef Expression l1_distance(Expression x, Expression y): return Expression.from_cexpr(c_l1_distance(x.c(), y.c())) +cpdef Expression binary_log_loss(Expression x, Expression y): return Expression.from_cexpr(c_binary_log_loss(x.c(), y.c())) +cpdef Expression conv1d_narrow(Expression x, Expression y): return Expression.from_cexpr(c_conv1d_narrow(x.c(), y.c())) +cpdef Expression conv1d_wide(Expression x, Expression y): return Expression.from_cexpr(c_conv1d_wide(x.c(), y.c())) # unary-exp -cpdef Expr2 tanh(Expr2 x): return Expr2.from_cexpr(c_tanh(x.c())) -cpdef Expr2 exp(Expr2 x): return Expr2.from_cexpr(c_exp(x.c())) -cpdef Expr2 log(Expr2 x): return Expr2.from_cexpr(c_log(x.c())) -cpdef Expr2 logistic(Expr2 x): return Expr2.from_cexpr(c_logistic(x.c())) -cpdef Expr2 rectify(Expr2 x): return Expr2.from_cexpr(c_rectify(x.c())) -cpdef Expr2 log_softmax(Expr2 x, list restrict=None): +cpdef Expression tanh(Expression x): return Expression.from_cexpr(c_tanh(x.c())) +cpdef Expression exp(Expression x): return Expression.from_cexpr(c_exp(x.c())) +cpdef Expression log(Expression x): return Expression.from_cexpr(c_log(x.c())) +cpdef Expression logistic(Expression x): return Expression.from_cexpr(c_logistic(x.c())) +cpdef Expression rectify(Expression x): return Expression.from_cexpr(c_rectify(x.c())) +cpdef Expression log_softmax(Expression x, list restrict=None): if restrict is None: - return Expr2.from_cexpr(c_log_softmax(x.c())) + return Expression.from_cexpr(c_log_softmax(x.c())) cdef vector[unsigned] vec = restrict - return Expr2.from_cexpr(c_log_softmax(x.c(), vec)) -cpdef Expr2 softmax(Expr2 x): return Expr2.from_cexpr(c_softmax(x.c())) -cpdef Expr2 softsign(Expr2 x): return Expr2.from_cexpr(c_softsign(x.c())) -cpdef Expr2 transpose(Expr2 x): return Expr2.from_cexpr(c_transpose(x.c())) -cpdef Expr2 sum_cols(Expr2 x): return Expr2.from_cexpr(c_sum_cols(x.c())) + return Expression.from_cexpr(c_log_softmax(x.c(), vec)) +cpdef Expression softmax(Expression x): return Expression.from_cexpr(c_softmax(x.c())) +cpdef Expression softsign(Expression x): return Expression.from_cexpr(c_softsign(x.c())) +cpdef Expression transpose(Expression x): return Expression.from_cexpr(c_transpose(x.c())) +cpdef Expression sum_cols(Expression x): return Expression.from_cexpr(c_sum_cols(x.c())) #expr-opt -cpdef Expr2 fold_rows(Expr2 x, unsigned nrows=2): return Expr2.from_cexpr(c_fold_rows(x.c(),nrows)) +cpdef Expression fold_rows(Expression x, unsigned nrows=2): return Expression.from_cexpr(c_fold_rows(x.c(),nrows)) #expr-expr-opt -cpdef Expr2 pairwise_rank_loss(Expr2 x, Expr2 y, float m=1.0): return Expr2.from_cexpr(c_pairwise_rank_loss(x.c(), y.c(), m)) -cpdef Expr2 huber_distance(Expr2 x, Expr2 y, float c=1.345): return Expr2.from_cexpr(c_huber_distance(x.c(), y.c(), c)) +cpdef Expression pairwise_rank_loss(Expression x, Expression y, float m=1.0): return Expression.from_cexpr(c_pairwise_rank_loss(x.c(), y.c(), m)) +cpdef Expression huber_distance(Expression x, Expression y, float c=1.345): return Expression.from_cexpr(c_huber_distance(x.c(), y.c(), c)) #expr-unsigned -cpdef Expr2 kmax_pooling(Expr2 x, unsigned k): return Expr2.from_cexpr(c_kmax_pooling(x.c(), k)) -cpdef Expr2 pickneglogsoftmax(Expr2 x, unsigned v): return Expr2.from_cexpr(c_pickneglogsoftmax(x.c(), v)) -cpdef Expr2 kmh_ngram(Expr2 x, unsigned v): return Expr2.from_cexpr(c_kmh_ngram(x.c(), v)) -cpdef Expr2 pickrange(Expr2 x, unsigned v, unsigned u): return Expr2.from_cexpr(c_pickrange(x.c(), v, u)) +cpdef Expression kmax_pooling(Expression x, unsigned k): return Expression.from_cexpr(c_kmax_pooling(x.c(), k)) +cpdef Expression pickneglogsoftmax(Expression x, unsigned v): return Expression.from_cexpr(c_pickneglogsoftmax(x.c(), v)) + +cpdef Expression kmh_ngram(Expression x, unsigned v): return Expression.from_cexpr(c_kmh_ngram(x.c(), v)) +cpdef Expression pickrange(Expression x, unsigned v, unsigned u): return Expression.from_cexpr(c_pickrange(x.c(), v, u)) #expr-float -cpdef Expr2 noise(Expr2 x, float stddev): return Expr2.from_cexpr(c_noise(x.c(), stddev)) -cpdef Expr2 dropout(Expr2 x, float p): return Expr2.from_cexpr(c_dropout(x.c(), p)) +cpdef Expression noise(Expression x, float stddev): return Expression.from_cexpr(c_noise(x.c(), stddev)) +cpdef Expression dropout(Expression x, float p): return Expression.from_cexpr(c_dropout(x.c(), p)) #expr-dim -cpdef Expr2 reshape(Expr2 x, tuple d): return Expr2.from_cexpr(c_reshape(x.c(),Dim(d))) +cpdef Expression reshape(Expression x, tuple d): return Expression.from_cexpr(c_reshape(x.c(),Dim(d))) + +cpdef Expression esum(list xs): + cdef vector[CExpression] cvec + cvec = vector[CExpression]() + cdef Expression x + for x in xs: cvec.push_back(x.c()) + #print >> sys.stderr, cvec.size() + return Expression.from_cexpr(c_sum(cvec)) + +cpdef Expression average(list xs): + cdef vector[CExpression] cvec + cdef Expression x + for x in xs: + cvec.push_back(x.c()) + print >> sys.stderr,"pushing",cvec.back().i + return Expression.from_cexpr(c_average(cvec)) + +cpdef Expression concatenate_cols(list xs): + cdef vector[CExpression] cvec + cdef Expression x + for x in xs: cvec.push_back(x.c()) + return Expression.from_cexpr(c_concat_cols(cvec)) + +cpdef Expression concatenate(list xs): + cdef vector[CExpression] cvec + cdef Expression x + for x in xs: cvec.push_back(x.c()) + return Expression.from_cexpr(c_concat(cvec)) + + +cpdef Expression affine_transform(list exprs): + cdef Expression e + cdef vector[CExpression] ves + for e in exprs: + ves.push_back(e.c()) + return Expression.from_cexpr(c_affine_transform(ves)) + #expr-ptr -cdef class hinge(Expr2): +cdef class hinge(Expression): cdef unsigned index - def __cinit__(self, Expr2 x, unsigned index, float m=1.0): + def __cinit__(self, Expression x, unsigned index, float m=1.0): self.index = index self.cg = x.cg cdef CExpression e @@ -217,53 +479,79 @@ cdef class hinge(Expr2): def set_index(self, unsigned i): self.index = i -cdef class pick(Expr2): - cdef unsigned index - def __cinit__(self, Expr2 x, unsigned index): - self.index = index - self.cg = x.cg - cdef CExpression e - e = c_pick(x.c(), &(self.index)) - self.vindex = e.i - def set_index(self, unsigned i): - self.index = i - +# }}} -cdef class ComputationGraph: - cdef CComputationGraph *thisptr, - def __cinit__(self): - self.thisptr = new CComputationGraph() +# {{{ RNNS / Builders +# TODO: unify these with inheritance +cdef class SimpleRNNBuilder: + cdef CSimpleRNNBuilder *thisptr + def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): + self.thisptr = new CSimpleRNNBuilder(layers, input_dim, hidden_dim, model.thisptr) def __dealloc__(self): del self.thisptr - - cpdef renew(self): + cpdef new_graph(self, ComputationGraph cg): self.thisptr.new_graph(cg.thisptr[0]) + cpdef start_new_sequence(self, es=None): + cdef vector[CExpression] ces = vector[CExpression]() + cdef Expression e + if es: + for e in es: ces.push_back(e.c()) + self.thisptr.start_new_sequence(ces) + cpdef Expression add_input(self, Expression e): + return Expression.from_cexpr(self.thisptr.add_input(e.c())) + cpdef rewind_one_step(self): self.thisptr.rewind_one_step() + cpdef Expression back(self): + return Expression.from_cexpr(self.thisptr.back()) + cpdef final_h(self): + cdef list res = [] + cdef CExpression cexp + cdef vector[CExpression] cexps = self.thisptr.final_h() + for cexp in cexps: + res.append(Expression.from_cexpr(cexp)) + return res + cpdef final_s(self): + cdef list res = [] + cdef CExpression cexp + cdef vector[CExpression] cexps = self.thisptr.final_s() + for cexp in cexps: + res.append(Expression.from_cexpr(cexp)) + return res + +cdef class LSTMBuilder: + cdef CLSTMBuilder *thisptr + def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): + self.thisptr = new CLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr) + def __dealloc__(self): del self.thisptr - self.thisptr = new CComputationGraph() - return self - - def parameters(self, model, name, dim=None): - cdef Parameters params - cdef Expr2 result - if name in model: - params = model[name] - else: - assert(dim is not None) - params = model.add_parameters(name, dim) - result = Expr2.from_cexpr(c_parameter(self.thisptr[0], params.thisptr)) - #result = self._expr(parameter(self.thisptr[0], params.thisptr)) - #result = Expression.wrap_ptr(&(parameter(self.thisptr[0], params.thisptr))) - return result - - cpdef forward_scalar(self): - return c_as_scalar(self.thisptr.forward()) - - cpdef forward_vec(self): - return c_as_vector(self.thisptr.forward()) - - cpdef backward(self): - self.thisptr.backward() - + cpdef new_graph(self, ComputationGraph cg): self.thisptr.new_graph(cg.thisptr[0]) + cpdef start_new_sequence(self, es=None): + cdef vector[CExpression] ces = vector[CExpression]() + cdef Expression e + if es: + for e in es: ces.push_back(e.c()) + self.thisptr.start_new_sequence(ces) + cpdef Expression add_input(self, Expression e): + return Expression.from_cexpr(self.thisptr.add_input(e.c())) + cpdef rewind_one_step(self): self.thisptr.rewind_one_step() + cpdef Expression back(self): + return Expression.from_cexpr(self.thisptr.back()) + cpdef final_h(self): + cdef list res = [] + cdef CExpression cexp + cdef vector[CExpression] cexps = self.thisptr.final_h() + for cexp in cexps: + res.append(Expression.from_cexpr(cexp)) + return res + cpdef final_s(self): + cdef list res = [] + cdef CExpression cexp + cdef vector[CExpression] cexps = self.thisptr.final_s() + for cexp in cexps: + res.append(Expression.from_cexpr(cexp)) + return res + +# }}} +# {{{ Training cdef class SimpleSGDTrainer: cdef CSimpleSGDTrainer *thisptr def __cinit__(self, Model m, float lam = 1e-6, float e0 = 0.1): @@ -274,6 +562,11 @@ cdef class SimpleSGDTrainer: self.thisptr.update(s) cpdef update_epoch(self, float r = 1.0): self.thisptr.update_epoch(r) + cpdef status(self): + self.thisptr.status() +#}}} + + + - diff --git a/pycnn/rnnlm.py b/pycnn/rnnlm.py new file mode 100644 index 000000000..35948e588 --- /dev/null +++ b/pycnn/rnnlm.py @@ -0,0 +1,134 @@ +from pycnn import * +import random + +LAYERS = 2 +INPUT_DIM = 5 #256 +HIDDEN_DIM = 50 #1024 +VOCAB_SIZE = 0 + +from collections import defaultdict +from itertools import count +import sys +import util + +class RNNLanguageModel: + def __init__(self, model, cg, builder=SimpleRNNBuilder): + self.cg = cg + self.m = model + self.builder = builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) + + model.add_lookup_parameters("lookup", (VOCAB_SIZE, INPUT_DIM)) + model.add_parameters("R", (VOCAB_SIZE, HIDDEN_DIM)) + model.add_parameters("bias", (VOCAB_SIZE)) + + def BuildLMGraph(self, sent): + cg = self.cg.renew() + builder = self.builder + builder.new_graph(cg) # TODO WHY? + builder.start_new_sequence() + + R = cg.parameters(self.m, "R") + bias = cg.parameters(self.m, "bias") + errs = [] # will hold expressions + es=[] + for (cw,nw) in zip(sent,sent[1:]): + # assume word is already a word-id + x_t = lookupExpression(cg, self.m["lookup"], int(cw)) + y_t = builder.add_input(x_t) # TODO what does this do exactly? + r_t = bias + (R * y_t) + #f = softmax(r_t) + #vec = cg.inc_forward_vec() + err = pickneglogsoftmax(r_t, int(nw)) + #e = cg.forward_scalar() + #print >> sys.stdout, " ",e, + #es.append(e) + #print >> sys.stdout, cg.inc_forward_scalar() + errs.append(err) + #print >> sys.stdout, vec + #print >> sys.stdout, nw + #print >> sys.stdout, vec[nw] + nerr = esum(errs) + #print >> sys.stdout, sum(es), cg.forward_scalar() + return nerr + + def sample(self, first=1, nchars=0, stop=-1): + res = [first] + cg = self.cg.renew() + builder = self.builder + builder.new_graph(cg) # TODO WHY? + builder.start_new_sequence() + + R = cg.parameters(self.m, "R") + bias = cg.parameters(self.m, "bias") + cw = first #TODO: start symbol? + while True: + x_t = lookupExpression(cg, self.m["lookup"], cw) + y_t = builder.add_input(x_t) # TODO what does this do exactly? + + #s = concatenate(builder.final_h()) + #sv = cg.inc_forward_vec() + #print len(sv) + + r_t = bias + (R * y_t) + ydist = softmax(r_t) + dist = cg.inc_forward_vec() + rnd = random.random() + assert(0 <= rnd <= 1.0) + for i,p in enumerate(dist): + rnd -= p + if rnd <= 0: break + res.append(i) + cw = i + if cw == stop: break + if nchars and len(res) > nchars: break + return res + +if __name__ == '__main__': + train = util.CharsCorpusReader(sys.argv[1],begin="") + #train = util.CorpusReader(sys.argv[1]) + vocab = util.Vocab.from_corpus(train) + + VOCAB_SIZE = vocab.size() + + model = Model() + sgd = SimpleSGDTrainer(model) + cg = ComputationGraph() + + lm = RNNLanguageModel(model, cg, builder=LSTMBuilder) + + train = list(train) + + #fout = file("a","w") + chars = loss = 0.0 + for ITER in xrange(1000): + random.shuffle(train) + for i,sent in enumerate(train): + if i % 50 == 0: + sgd.status() + if chars > 0: print loss / chars, + #samp = lm.sample(first=vocab.w2i[""],stop=vocab.w2i[""]) + for _ in xrange(1): + samp = lm.sample(first=vocab.w2i[""],stop=vocab.w2i["\n"]) + print "".join([vocab.i2w[c] for c in samp]).strip() + loss = 0.0 + chars = 0.0 + + #if len(sent) < 4: continue + chars += len(sent)-1 + #print sent + isent = [vocab.w2i[w] for w in sent] + errs = lm.BuildLMGraph(isent) + #st = str(errs) + #fout.write(str(errs)) + #cg.PrintGraphviz() + loss += cg.inc_forward_scalar() + #loss += cg.forward_scalar() + cg.backward() + sgd.update(1.0) + print "ITER",ITER,loss + sgd.status() + sgd.update_epoch(1.0) + if ITER % 1 == 0: + pass + #samp = lm.sample(first=vocab.w2i[""],stop=vocab.w2i[""]) + #print " ".join([vocab.i2w[c] for c in samp]) diff --git a/pycnn/util.py b/pycnn/util.py new file mode 100644 index 000000000..f3ac0c425 --- /dev/null +++ b/pycnn/util.py @@ -0,0 +1,36 @@ +from collections import defaultdict +from itertools import count +class Vocab: + def __init__(self, w2i=None): + if w2i is None: w2i = defaultdict(count(0).next) + self.w2i = dict(w2i) + self.i2w = {i:w for w,i in w2i.iteritems()} + @classmethod + def from_corpus(cls, corpus): + w2i = defaultdict(count(0).next) + for sent in corpus: + [w2i[word] for word in sent] + return Vocab(w2i) + + def size(self): return len(self.w2i.keys()) + +class CorpusReader: + def __init__(self, fname): + self.fname = fname + def __iter__(self): + for line in file(self.fname): + line = line.strip().split() + #line = [' ' if x == '' else x for x in line] + yield line + +class CharsCorpusReader: + def __init__(self, fname, begin=None): + self.fname = fname + self.begin = begin + def __iter__(self): + begin = self.begin + for line in file(self.fname): + line = list(line) + if begin: + line = [begin] + line + yield line diff --git a/pycnn/xor.py b/pycnn/xor.py index ee68ee3cb..f4fe608d0 100644 --- a/pycnn/xor.py +++ b/pycnn/xor.py @@ -1,7 +1,9 @@ from pycnn import * +xsent = True + HIDDEN_SIZE = 8 -ITERATIONS = 30 +ITERATIONS = 2000 m = Model() sgd = SimpleSGDTrainer(m) @@ -18,28 +20,37 @@ V = cg.parameters(m, "V") a = cg.parameters(m, "a") -x = VecInputExpr2(cg, [0,0]) -y = InputExpr2(cg, 0) +x = VecInputExpression(cg, [0,0]) +y = InputExpression(cg, 0) #print type(x) h = tanh((W*x) + b) -y_pred = (V*h) + a -loss = squared_distance(y_pred, y) +if xsent: + y_pred = logistic((V*h) + a) + loss = binary_log_loss(y_pred, y) + T = 1 + F = 0 +else: + y_pred = (V*h) + a + loss = squared_distance(y_pred, y) + T = 1 + F = -1 + for iter in xrange(ITERATIONS): mloss = 0.0 for mi in xrange(4): x1 = mi % 2 x2 = (mi / 2) % 2 - x.set_input([1 if x1 else -1, 1 if x2 else -1]) - y.set_input(1 if x1 != x2 else -1) + x.set([T if x1 else F, T if x2 else F]) + y.set(T if x1 != x2 else F) mloss += cg.forward_scalar() cg.backward() sgd.update(1.0) sgd.update_epoch(); - mloss /= 4 + mloss /= 4. print "loss: %0.9f" % mloss -x.set_input([-1,1]) +x.set([F,T]) z = -(-y_pred) print cg.forward_scalar() #print y_pred.scalar() @@ -50,10 +61,14 @@ V = cg.parameters(m, "V") a = cg.parameters(m, "a") -x = VecInputExpr2(cg, [0,0]) -y = InputExpr2(cg, 0) +x = VecInputExpression(cg, [0,0]) +y = InputExpression(cg, 0) #print type(x) h = tanh((W*x) + b) -y_pred = (V*h) + a -x.set_input([1,-1]) +if xsent: + y_pred = logistic((V*h) + a) +else: + y_pred = (V*h) + a +x.set([T,F]) print "XX",cg.forward_scalar() + From a6798dc961c1eea750df474db9734ab5b56832ff Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Tue, 7 Jul 2015 19:25:15 +0300 Subject: [PATCH 119/965] Improved forward/query-value interface. --- cnn/CMakeLists.txt | 4 +- cnn/cnn.cc | 1 + cnn/cnn.h | 12 +- cnn/exec.cc | 7 +- cnn/exec.h | 2 + examples/CMakeLists.txt | 2 +- examples/rnnlm2.cc | 253 ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 275 insertions(+), 6 deletions(-) create mode 100644 examples/rnnlm2.cc diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 85203ecde..a283964b4 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -82,8 +82,8 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) #endforeach(test_src) # actual target: -#add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) -add_library(cnn SHARED ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) +add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) +#add_library(cnn SHARED ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE") diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 428a57131..0169ed531 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -114,6 +114,7 @@ void ComputationGraph::set_dim_for_new_node(const VariableIndex& i) { const Tensor& ComputationGraph::incremental_forward() { return ee->incremental_forward(); } const Tensor& ComputationGraph::forward() { return ee->forward(); } const Tensor& ComputationGraph::get_value(VariableIndex i) { return ee->get_value(i); } +void ComputationGraph::invalidate() { ee->invalidate(); } void ComputationGraph::backward() { ee->backward(); } void ComputationGraph::PrintGraphviz() const { diff --git a/cnn/cnn.h b/cnn/cnn.h index 5fb72d7a4..508a0b690 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -73,9 +73,19 @@ struct ComputationGraph { template inline VariableIndex add_function(const T& arguments); // perform computations + + // run complete forward pass from first node to last existing one, ignoring all precomputed values. const Tensor& forward(); - const Tensor& incremental_forward(); // if you want to add nodes and evaluate just the new parts + // run forward pass from the last computed node to last existing. + // useful if you want to add nodes and evaluate just the new parts. + const Tensor& incremental_forward(); + // get forward value for node at index i. used cached values if available, + // performs forward evaluation if note available (may compute more than strictly + // what is needed). const Tensor& get_value(VariableIndex i); + // clears forward caches (for get_value etc). + void invalidate(); + // computes backward gradients from the front-most evaluated node. void backward(); // debugging diff --git a/cnn/exec.cc b/cnn/exec.cc index 5d63978ac..5180c9a91 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -8,14 +8,17 @@ namespace cnn { ExecutionEngine::~ExecutionEngine() {} +void SimpleExecutionEngine::invalidate() { + last_node_evaluated = 0; +} const Tensor& SimpleExecutionEngine::forward() { - last_node_evaluated = 0; + invalidate(); return incremental_forward(); } const Tensor& SimpleExecutionEngine::get_value(VariableIndex i) { assert(i < cg.nodes.size()); - if (i < last_node_evaluated) { + if (i >= last_node_evaluated) { incremental_forward(); } return nfxs[i]; diff --git a/cnn/exec.h b/cnn/exec.h index 972d3126d..deb680c45 100644 --- a/cnn/exec.h +++ b/cnn/exec.h @@ -8,6 +8,7 @@ namespace cnn { class ExecutionEngine { public: virtual ~ExecutionEngine(); + virtual void invalidate() = 0; virtual const Tensor& forward() = 0; virtual const Tensor& incremental_forward() = 0; // if you want to add nodes and evaluate just the new parts virtual const Tensor& get_value(VariableIndex i) = 0; @@ -20,6 +21,7 @@ class ExecutionEngine { class SimpleExecutionEngine : public ExecutionEngine { public: explicit SimpleExecutionEngine(const ComputationGraph& cg) : ExecutionEngine(cg) {} + void invalidate() override; const Tensor& forward() override; const Tensor& incremental_forward() override; // if you want to add nodes and evaluate just the new parts const Tensor& get_value(VariableIndex i) override; diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index d4038b2fa..dc9ccdd61 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm nlm textcat) +foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm nlm textcat rnnlm2) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/rnnlm2.cc b/examples/rnnlm2.cc new file mode 100644 index 000000000..94ea63bc5 --- /dev/null +++ b/examples/rnnlm2.cc @@ -0,0 +1,253 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/timing.h" +#include "cnn/rnn.h" +#include "cnn/gru.h" +#include "cnn/lstm.h" +#include "cnn/dict.h" +# include "cnn/expr.h" + +#include +#include +#include + +#include +#include + +using namespace std; +using namespace cnn; + +unsigned LAYERS = 2; +unsigned INPUT_DIM = 8; //256 +unsigned HIDDEN_DIM = 24; // 1024 +unsigned VOCAB_SIZE = 0; + +cnn::Dict d; +int kSOS; +int kEOS; + +template +struct RNNLanguageModel { + LookupParameters* p_c; + Parameters* p_R; + Parameters* p_bias; + Builder builder; + explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({VOCAB_SIZE}); + } + + // return Expression of total loss + Expression BuildLMGraph(const vector& sent, ComputationGraph& cg) { + const unsigned slen = sent.size() - 1; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter + Expression i_bias = parameter(cg, p_bias); // word bias + vector errs; + for (unsigned t = 0; t < slen; ++t) { + Expression i_x_t = lookup(cg, p_c, sent[t]); + // y_t = RNN(x_t) + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + + // we can easily look at intermidiate values + std::vector r_t = as_vector(i_r_t.value()); + for (float f : r_t) cout << f << " "; cout << endl; + cout << "[" << as_scalar(pick(i_r_t, sent[t+1]).value()) << "]" << endl; + + // LogSoftmax followed by PickElement can be written in one step + // using PickNegLogSoftmax +#if 0 + Expression i_ydist = logsoftmax(i_r_t); + errs.push_back(pick(i_ydist, sent[t+1])); +#if 0 + Expression i_ydist = softmax(i_r_t); + i_ydist = log(i_ydist) + errs.push_back(pick(i_ydist, sent[t+1])); +#endif +#else + Expression i_err = pickneglogsoftmax(i_r_t, sent[t+1]); + errs.push_back(i_err); +#endif + } + Expression i_nerr = sum(errs); +#if 0 + return -i_nerr; +#else + return i_nerr; +#endif + } + + // return Expression for total loss + void RandomSample(int max_len = 150) { + cerr << endl; + ComputationGraph cg; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + + Expression i_R = parameter(cg, p_R); + Expression i_bias = parameter(cg, p_bias); + vector errs; + int len = 0; + int cur = kSOS; + while(len < max_len && cur != kEOS) { + ++len; + Expression i_x_t = lookup(cg, p_c, cur); + // y_t = RNN(x_t) + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + + Expression ydist = softmax(i_r_t); + + unsigned w = 0; + while (w == 0 || (int)w == kSOS) { + auto dist = as_vector(cg.incremental_forward()); + double p = rand01(); + for (; w < dist.size(); ++w) { + p -= dist[w]; + if (p < 0.0) { break; } + } + if (w == dist.size()) w = kEOS; + } + cerr << (len == 1 ? "" : " ") << d.Convert(w); + cur = w; + } + cerr << endl; + } +}; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.Convert(""); + kEOS = d.Convert(""); + vector> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + training.push_back(ReadSentence(line, &d)); + ttoks += training.back().size(); + if (training.back().front() != kSOS && training.back().back() != kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + d.Freeze(); // no new word types allowed + VOCAB_SIZE = d.size(); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + ++dlc; + dev.push_back(ReadSentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() != kSOS && dev.back().back() != kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + ostringstream os; + os << "lm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + bool use_momentum = false; + Trainer* sgd = nullptr; + //if (use_momentum) + // sgd = new MomentumSGDTrainer(&model); + //else + sgd = new SimpleSGDTrainer(&model); + + RNNLanguageModel lm(model); + //RNNLanguageModel lm(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 500; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& sent = training[order[si]]; + chars += sent.size() - 1; + ++si; + lm.BuildLMGraph(sent, cg); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(); + ++lines; + } + sgd->status(); + cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + lm.RandomSample(); + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + int dchars = 0; + for (auto& sent : dev) { + ComputationGraph cg; + lm.BuildLMGraph(sent, cg); + dloss += as_scalar(cg.forward()); + dchars += sent.size() - 1; + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } + } + delete sgd; +} + From 5123ce84bd9b3cf5a63e78b192d36a8c5c10fdcf Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 8 Jul 2015 00:48:41 +0000 Subject: [PATCH 120/965] deal with crappy libm --- CMakeLists.txt | 4 +++- cnn/functors.h | 30 ++++++++++++++++++++++++------ cnn/nodes.cc | 6 +++--- cnn/saxe-init.cc | 19 +++++++++---------- cnn/tensor.cc | 21 +++++++-------------- 5 files changed, 46 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ba3289408..b02349cae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,8 +29,10 @@ function(find_cudnn) endfunction() # look for Boost +if(DEFINED ENV{BOOST_ROOT}) + set(Boost_NO_SYSTEM_PATHS ON) +endif() set(Boost_REALPATH ON) -#find_package(Boost COMPONENTS program_options serialization REQUIRED) find_package(Boost COMPONENTS program_options serialization REQUIRED) include_directories(${Boost_INCLUDE_DIR}) set(LIBS ${LIBS} ${Boost_LIBRARIES}) diff --git a/cnn/functors.h b/cnn/functors.h index 15f3deec9..a688f30ce 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -12,6 +12,24 @@ // if you need a new elementwise (nullary, unary, binary...) // functor, this is the place for it +#define cast_uint32_t static_cast + +static inline float fastpow2 (float p) { + float offset = (p < 0) ? 1.0f : 0.0f; + float clipp = (p < -126) ? -126.0f : p; + int w = clipp; + float z = clipp - w + offset; + union { uint32_t i; float f; } v = { cast_uint32_t ( (1 << 23) * (clipp + 121.2740575f + 27.7280233f / (4.84252568f - z) - 1.49012907f * z) ) }; + + return v.f; +} + +static inline float fastexp (float p) { + return fastpow2 (1.442695040f * p); +} + +#define CNN_EXPF fastexp + namespace cnn { struct FHuberForward { @@ -105,7 +123,7 @@ struct FRectifyNegateBackward { struct FSoftmaxNormalize { explicit FSoftmaxNormalize(float logz) : logz(logz) {} CNN_DEVICE_FUNC inline float operator()(float x) const { - return expf(x - logz); + return CNN_EXPF(x - logz); } float logz; }; @@ -121,7 +139,7 @@ struct FSoftmaxBackward { struct FNegLogSoftmaxBackward { FNegLogSoftmaxBackward(float lz, float err) : logz(lz), d(err) {} CNN_DEVICE_FUNC inline float operator()(float t) const { - return expf(t - logz) * d; + return CNN_EXPF(t - logz) * d; } float logz; float d; @@ -130,7 +148,7 @@ struct FNegLogSoftmaxBackward { struct FPtrNegLogSoftmaxBackward { FPtrNegLogSoftmaxBackward(const float* lz, const float* err) : logz(lz), d(err) {} CNN_DEVICE_FUNC inline float operator()(float t) const { - return expf(t - *logz) * *d; + return CNN_EXPF(t - *logz) * *d; } const float* logz; const float* d; @@ -146,14 +164,14 @@ struct FLogSoftmaxNormalize { struct FWeightedError { float operator()(float t, float d) const { - return expf(t) * d / expf(t); + return CNN_EXPF(t) * d / CNN_EXPF(t); } }; struct FLogSoftmaxBackward { explicit FLogSoftmaxBackward(float off_diag_sum) : off_diag_sum(off_diag_sum) {} CNN_DEVICE_FUNC inline float operator()(float t, float d) const { - return off_diag_sum * expf(t) + d; + return off_diag_sum * CNN_EXPF(t) + d; //return (off_diag_sum + d) * t; } float off_diag_sum; @@ -180,7 +198,7 @@ struct FSoftSignBackward { struct FLogisticSigmoid { CNN_DEVICE_FUNC inline float operator()(float x) const { - return 1.f / (1.f + expf(-x)); + return 1.f / (1.f + CNN_EXPF(-x)); } }; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index ac8a17903..3d1c12df5 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -569,7 +569,7 @@ EIGEN_STRONG_INLINE float logsumexp(const T& x) { const float m = x.maxCoeff(); float z = 0; for (unsigned i = 0; i < x.rows(); ++i) - z += expf(x(i,0) - m); + z += CNN_EXPF(x(i,0) - m); return m + logf(z); } @@ -672,7 +672,7 @@ EIGEN_STRONG_INLINE real logsumexp(const T& x, const vector& denom) { } real z = 0; for (auto i : denom) - z += expf(x(i,0) - m); + z += CNN_EXPF(x(i,0) - m); return m + logf(z); } @@ -700,7 +700,7 @@ void RestrictedLogSoftmax::backward(const vector& xs, for (auto ind : denom) z += (*dEdf)(ind, 0); for (auto ind : denom) - (*dEdxi)(ind, 0) += (*dEdf)(ind, 0) - expf((*fx)(ind, 0)) * z; + (*dEdxi)(ind, 0) += (*dEdf)(ind, 0) - CNN_EXPF((*fx)(ind, 0)) * z; } // x_1 is a vector diff --git a/cnn/saxe-init.cc b/cnn/saxe-init.cc index 737ddba8d..568a74edb 100644 --- a/cnn/saxe-init.cc +++ b/cnn/saxe-init.cc @@ -10,17 +10,16 @@ using namespace std; namespace cnn { -inline Eigen::MatrixXf EigenRandomNormal(int dim, real mean, real stddev) { - normal_distribution distribution(mean, stddev); - auto b = [&] (real) {return distribution(*rndeng);}; - Eigen::MatrixXf r = Eigen::MatrixXf::NullaryExpr(dim, dim, b); - return r; -} - -void OrthonormalRandom(int dim, real g, Tensor& x) { - Eigen::MatrixXf m = EigenRandomNormal(dim, 0.0, 0.01); - Eigen::JacobiSVD svd(m, Eigen::ComputeFullU); +void OrthonormalRandom(int dd, float g, Tensor& x) { + Tensor t; + t.d = Dim({dd, dd}); + t.v = new float[dd * dd]; + normal_distribution distribution(0, 0.01); + auto b = [&] () {return distribution(*rndeng);}; + generate(t.v, t.v + dd*dd, b); + Eigen::JacobiSVD svd(*t, Eigen::ComputeFullU); *x = svd.matrixU(); + delete[] t.v; } } diff --git a/cnn/tensor.cc b/cnn/tensor.cc index b89cf0750..3f2bf3bb2 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -82,17 +82,14 @@ void TensorTools::Zero(Tensor& d) { void TensorTools::Randomize(Tensor& val, real scale) { uniform_real_distribution distribution(-scale,scale); - auto b = [&] (real) {return distribution(*rndeng);}; + auto b = [&] {return distribution(*rndeng);}; #if HAVE_CUDA float* t = new float[val.d.size()]; - Eigen::Map m(t, val.d.rows(), val.d.cols()); - m = Eigen::MatrixXf::NullaryExpr(val.d.rows(), val.d.cols(), b); + generate(t, t + val.d.size(), b); CUDA_CHECK(cudaMemcpy(val.v, t, sizeof(real) * val.d.size(), cudaMemcpyHostToDevice)); delete[] t; #else - Dim d({val.d.size()}); - Tensor tv(d, val.v); - *tv = Eigen::MatrixXf::NullaryExpr(d.size(), 1, b); + generate(val.v, val.v + val.d.size(), b); #endif } @@ -102,18 +99,14 @@ void TensorTools::Randomize(Tensor& d) { void TensorTools::RandomBernoulli(Tensor& val, real p, real scale) { bernoulli_distribution distribution(p); - auto b = [&] (real) {return distribution(*rndeng) * scale;}; - Dim d({val.d.size()}); - Tensor tv(d, val.v); - *tv = Eigen::MatrixXf::NullaryExpr(d.size(), 1, b); + auto b = [&] {return distribution(*rndeng) * scale;}; + generate(val.v, val.v + val.d.size(), b); } void TensorTools::RandomizeNormal(real mean, real stddev, Tensor& val) { normal_distribution distribution(mean, stddev); - auto b = [&] (real) {return distribution(*rndeng);}; - Dim d({val.d.size()}); - Tensor tv(d, val.v); - *tv = Eigen::MatrixXf::NullaryExpr(d.size(), 1, b); + auto b = [&] {return distribution(*rndeng);}; + generate(val.v, val.v + val.d.size(), b); } real rand01() { From 590c295b578848ae1915c5537f522a9e3e3c7d1e Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 8 Jul 2015 01:35:13 +0000 Subject: [PATCH 121/965] trace of product --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/nodes-common.cc | 14 ++++++++++++++ cnn/nodes.cc | 17 +++++++++++++++++ cnn/nodes.h | 13 +++++++++++++ 5 files changed, 46 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index 435dfea16..43bc9f9db 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -41,6 +41,7 @@ Expression dropout(const Expression& x, real p) { return Expression(x.pg, x.pg-> Expression reshape(const Expression& x, const Dim& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } Expression transpose(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression trace_of_product(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} Expression dot_product(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index d6b1f20a4..a8a07f225 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -54,6 +54,7 @@ Expression dropout(const Expression& x, real p); Expression reshape(const Expression& x, const Dim& d); Expression transpose(const Expression& x); +Expression trace_of_product(const Expression& x, const Expression& y); Expression cwise_multiply(const Expression& x, const Expression& y); Expression dot_product(const Expression& x, const Expression& y); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index f2fa9cd5c..f9d1fdd0d 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -17,6 +17,20 @@ inline bool LooksLikeVector(const Dim& d) { return true; } +string TraceOfProduct::as_string(const vector& arg_names) const { + ostringstream s; + s << "Tr(" << arg_names[0] << " * " << arg_names[1] << "^T)"; + return s.str(); +} + +Dim TraceOfProduct::dim_forward(const vector& xs) const { + if (xs.size() != 2 || xs[0] != xs[1]) { + cerr << "Bad arguments in TraceOfProduct: " << xs << endl; + abort(); + } + return Dim({1}); +} + string ConstScalarMultiply::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0] << " * " << alpha; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 3d1c12df5..fbf6978b6 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -33,6 +33,23 @@ using namespace std; namespace cnn { +void TraceOfProduct::forward(const vector& xs, Tensor& fx) const { + auto x1 = **xs[0]; + auto x2 = **xs[1]; + fx.v[0] = (x1 * x2.transpose()).trace(); +} + +void TraceOfProduct::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + const float d = dEdf.v[0]; + auto xother = **xs[1 - i]; + *dEdxi += d * xother; +} + void ConstScalarMultiply::forward(const vector& xs, Tensor& fx) const { *fx = (**xs[0]) * alpha; } diff --git a/cnn/nodes.h b/cnn/nodes.h index addc1ed93..f945b3f19 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -5,6 +5,19 @@ namespace cnn { +// y = Tr(x_1 * x_2^T) +struct TraceOfProduct : public Node { + explicit TraceOfProduct(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = alpha * x_1 struct ConstScalarMultiply : public Node { explicit ConstScalarMultiply(const std::initializer_list& a, float alpha) : Node(a), alpha(alpha) {} From 45c038f96e3d3730d20c044f4e25e2fd465ebf8a Mon Sep 17 00:00:00 2001 From: trevorcohn Date: Wed, 8 Jul 2015 11:57:53 -0700 Subject: [PATCH 122/965] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index a4a11e0d6..493569766 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,11 @@ You need the [development version of the Eigen library](https://bitbucket.org/ei #### Building +First you need to fetch the dependent libraries + + git submodule init + git submodule update + In `src`, you need to first use [`cmake`](http://www.cmake.org/) to generate the makefiles mkdir build From 57355523e737b120a9c3c7b8bea37b5402bde4dd Mon Sep 17 00:00:00 2001 From: Trevor Cohn Date: Wed, 8 Jul 2015 12:04:55 -0700 Subject: [PATCH 123/965] skip-gram RNN language model --- .gitmodules | 3 + CMakeLists.txt | 3 +- cnn/rnn.cc | 53 +++++++-- cnn/rnn.h | 6 +- examples/CMakeLists.txt | 2 +- examples/skiprnnlm.cc | 258 ++++++++++++++++++++++++++++++++++++++++ external/easyloggingpp | 1 + 7 files changed, 313 insertions(+), 13 deletions(-) create mode 100644 .gitmodules create mode 100644 examples/skiprnnlm.cc create mode 160000 external/easyloggingpp diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..1207f4738 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "external/easyloggingpp"] + path = external/easyloggingpp + url = https://github.com/easylogging/easyloggingpp.git diff --git a/CMakeLists.txt b/CMakeLists.txt index b02349cae..2838e7e38 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,8 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -O3 -g -DEIGEN_FAST_MAT enable_testing() -include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${CMAKE_CURRENT_SOURCE_DIR} + ${PROJECT_SOURCE_DIR}/external/easyloggingpp/src) function(find_cudnn) set(CUDNN_ROOT "" CACHE PATH "CUDNN root path") diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 0044c9017..6bb3f0217 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -13,18 +13,23 @@ using namespace cnn; namespace cnn { +enum { X2H=0, H2H, HB, L2H }; + RNNBuilder::~RNNBuilder() {} SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model) : layers(layers) { + Model* model, + bool support_lags) : layers(layers), lagging(support_lags) { unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { Parameters* p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); Parameters* p_h2h = model->add_parameters({hidden_dim, hidden_dim}); Parameters* p_hb = model->add_parameters({hidden_dim}); vector ps = {p_x2h, p_h2h, p_hb}; + if (lagging) + ps.push_back(model->add_parameters({hidden_dim, hidden_dim})); params.push_back(ps); layer_input_dim = hidden_dim; } @@ -33,14 +38,20 @@ SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, void SimpleRNNBuilder::new_graph_impl(ComputationGraph& cg) { param_vars.clear(); for (unsigned i = 0; i < layers; ++i) { - Parameters* p_x2h = params[i][0]; - Parameters* p_h2h = params[i][1]; - Parameters* p_hb = params[i][2]; + Parameters* p_x2h = params[i][X2H]; + Parameters* p_h2h = params[i][H2H]; + Parameters* p_hb = params[i][HB]; Expression i_x2h = parameter(cg,p_x2h); Expression i_h2h = parameter(cg,p_h2h); Expression i_hb = parameter(cg,p_hb); - vector vars = {i_x2h, i_h2h, i_hb}; + + if (lagging) { + Parameters* p_l2h = params[i][L2H]; + Expression i_l2h = parameter(cg,p_l2h); + vars.push_back(i_l2h); + } + param_vars.push_back(vars); } } @@ -60,12 +71,34 @@ Expression SimpleRNNBuilder::add_input_impl(const Expression &in) { for (unsigned i = 0; i < layers; ++i) { const vector& vars = param_vars[i]; - Expression y = vars[2] + vars[0] * x; + Expression y = vars[HB] + vars[X2H] * x; + + if (t == 0 && h0.size() > 0) + y = y + vars[H2H] * h0[i]; + else if (t >= 1) + y = y + vars[H2H] * h[t-1][i]; + + x = h[t][i] = tanh(y); + } + return h[t].back(); +} + +Expression SimpleRNNBuilder::add_auxiliary_input(const Expression &in, const Expression &aux) { + const unsigned t = h.size(); + h.push_back(vector(layers)); + + Expression x = in; + + for (unsigned i = 0; i < layers; ++i) { + const vector& vars = param_vars[i]; + assert(vars.size() >= L2H + 1); + + Expression y = vars[HB] + vars[X2H] * x + vars[L2H] * aux; - if (t == 0 && h0.size() > 0) - y = y + vars[1] * h0[i]; - else if (t > 0) - y = y + vars[1] * h[t-1][i]; + if (t == 0 && h0.size() > 0) + y = y + vars[H2H] * h0[i]; + else if (t >= 1) + y = y + vars[H2H] * h[t-1][i]; x = h[t][i] = tanh(y); } diff --git a/cnn/rnn.h b/cnn/rnn.h index a0cce20fb..a68b7f31b 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -63,7 +63,8 @@ struct SimpleRNNBuilder : public RNNBuilder { explicit SimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model); + Model* model, + bool support_lags=false); protected: void new_graph_impl(ComputationGraph& cg) override; @@ -71,6 +72,8 @@ struct SimpleRNNBuilder : public RNNBuilder { Expression add_input_impl(const Expression& x) override; public: + Expression add_auxiliary_input(const Expression& x, const Expression &aux); + void rewind_one_step() { h.pop_back(); } Expression back() const { return h.back().back(); } std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } @@ -91,6 +94,7 @@ struct SimpleRNNBuilder : public RNNBuilder { std::vector h0; unsigned layers; + bool lagging; }; } // namespace cnn diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index dc9ccdd61..698d306b7 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm nlm textcat rnnlm2) +foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm nlm textcat rnnlm2 skiprnnlm) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/skiprnnlm.cc b/examples/skiprnnlm.cc new file mode 100644 index 000000000..caf7a529f --- /dev/null +++ b/examples/skiprnnlm.cc @@ -0,0 +1,258 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/timing.h" +#include "cnn/rnn.h" +#include "cnn/gru.h" +#include "cnn/lstm.h" +#include "cnn/dict.h" +#include "cnn/expr.h" + +#include "easylogging++.h" + +#include +#include +#include +#include + +#include +#include + +using namespace std; +using namespace cnn; + +INITIALIZE_EASYLOGGINGPP + +unsigned LAYERS = 2; +unsigned INPUT_DIM = 8; //256 +unsigned HIDDEN_DIM = 24; // 1024 +unsigned VOCAB_SIZE = 0; + +cnn::Dict d; +int kSOS; +int kEOS; + +// +typedef tuple TokenSkip; +enum { WORD=0, SIDX, WIDX }; +typedef vector Sentence; +typedef vector Document; +typedef vector Corpus; + + +struct RNNSkipLM { + LookupParameters* p_c; + Parameters* p_R; + Parameters* p_bias; + SimpleRNNBuilder builder; + explicit RNNSkipLM(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model, true) { + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({VOCAB_SIZE}); + } + + // return Expression of total loss + Expression BuildLMGraph(const Document& doc, ComputationGraph& cg) { + Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter + Expression i_bias = parameter(cg, p_bias); // word bias + vector errs; + vector> hidden; + uint64_t si = 0; + for (auto &sent: doc) { + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + hidden.push_back({}); + for (unsigned t = 0; t < sent.size()-1; ++t) { + auto &token = sent[t]; + Expression i_x_t = lookup(cg, p_c, std::get(token)); + // y_t = RNN(x_t) + + Expression i_y_t; + if (std::get(token) >= 0) { + i_y_t = builder.add_auxiliary_input(i_x_t, + hidden[std::get(token)][std::get(token)]); + } else { + i_y_t = builder.add_input(i_x_t); + } + Expression i_r_t = i_bias + i_R * i_y_t; + + Expression i_err = pickneglogsoftmax(i_r_t, std::get(sent[t+1])); + errs.push_back(i_err); + + // only use top-most layer for skipping + hidden.back().push_back(builder.back()); + } + ++si; + } + Expression i_nerr = sum(errs); + return i_nerr; + } +}; + + +void read_documents(const std::string &filename, Corpus &text); + +int main(int argc, char** argv) { + START_EASYLOGGINGPP(argc, argv); + el::Configurations defaultConf; + defaultConf.setToDefault(); + defaultConf.set(el::Level::Info, el::ConfigurationType::Format, "%datetime{%h:%m:%s} %level %msg"); + el::Loggers::reconfigureLogger("default", defaultConf); + + cnn::Initialize(argc, argv); + if (argc != 3 && argc != 4) { + LOG(INFO) << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.Convert(""); + kEOS = d.Convert(""); + + // load the corpora + Corpus training, dev; + LOG(INFO) << "Reading training data from " << argv[1] << "...\n"; + read_documents(argv[1], training); + d.Freeze(); // no new word types allowed + VOCAB_SIZE = d.size(); + LOG(INFO) << "Reading dev data from " << argv[2] << "...\n"; + read_documents(argv[2], dev); + + ostringstream os; + os << "lm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + LOG(INFO) << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + bool use_momentum = false; + Trainer* sgd = nullptr; + if (use_momentum) + sgd = new MomentumSGDTrainer(&model); + else + sgd = new SimpleSGDTrainer(&model); + + RNNSkipLM lm(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 500; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + LOG(INFO) << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& doc = training[order[si]]; + for (auto &sent: doc) + chars += sent.size() - 1; + ++si; + //LOG(INFO) << "sent length " << sent.size(); + lm.BuildLMGraph(doc, cg); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(); + ++lines; + } + sgd->status(); + // FIXME: is chars incorrect? + LOG(INFO) << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + //lm.RandomSample(); // why??? + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + int dchars = 0; + for (int i = 0; i < dev.size(); ++i) { + const auto& doc = dev[i]; + ComputationGraph cg; + lm.BuildLMGraph(doc, cg); + dloss += as_scalar(cg.forward()); + for (auto &sent: doc) + dchars += sent.size() - 1; + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + LOG(INFO) << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } + } + delete sgd; +} + +void read_documents(const std::string &filename, Corpus &corpus) { + ifstream in(filename); + assert(in); + int toks = 0, lno = 0; + string line; + Document doc; + while(std::getline(in, line)) { + ++lno; + auto sentence = ReadSentence(line, &d); + if (sentence.empty()) { + // empty lines separate documents + corpus.push_back(doc); + doc.clear(); + } else { + if (sentence.front() != kSOS && sentence.back() != kEOS) { + LOG(INFO) << "Sentence in " << filename << ":" << lno << " didn't start or end with , \n"; + abort(); + } + // re-package sentence + Sentence s; + for (auto tok: sentence) + s.push_back(TokenSkip(tok,-1,-1)); + doc.push_back(s); + toks += sentence.size(); + } + } + + assert(doc.empty()); + + // add in 'skip links' -- for now, based on identical tokens + int num_skips = 0; + for (auto &doc: corpus) { + map> mrocc; + for (int i = 0; i < doc.size(); ++i) { + auto &sentence = doc[i]; + for (int j = 0; j < sentence.size(); ++j) { + auto &token = sentence[j]; + if (std::get(token) != kEOS && std::get(token) != kSOS) { + const auto &found = mrocc.find(std::get(token)); + if (found != mrocc.end()) { + std::get(token) = found->second.first; + std::get(token) = found->second.second; + num_skips++; + } + mrocc[std::get(token)] = make_pair(i, j); + } + } + } + } + LOG(INFO) << corpus.size() << " documents, " << (lno-corpus.size()) << " sentences, " << num_skips << " skips, " << toks << " tokens, " << d.size() << " types\n"; +} diff --git a/external/easyloggingpp b/external/easyloggingpp new file mode 160000 index 000000000..f926802df --- /dev/null +++ b/external/easyloggingpp @@ -0,0 +1 @@ +Subproject commit f926802dfbde716d82b64b8ef3c25b7f0fcfec65 From 905e1d4e48151ae14d61ffc3c66962690de77c39 Mon Sep 17 00:00:00 2001 From: trevorcohn Date: Wed, 8 Jul 2015 12:08:07 -0700 Subject: [PATCH 124/965] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 493569766..d7fb923c8 100644 --- a/README.md +++ b/README.md @@ -12,8 +12,8 @@ You need the [development version of the Eigen library](https://bitbucket.org/ei First you need to fetch the dependent libraries - git submodule init - git submodule update + git submodule init + git submodule update In `src`, you need to first use [`cmake`](http://www.cmake.org/) to generate the makefiles From baa4fa4d4dbd491c68a112fb39b222541d9a0943 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Thu, 9 Jul 2015 00:41:26 +0300 Subject: [PATCH 125/965] feature-complete (except for GRU) --- pycnn/pycnn.pxd | 29 +++++- pycnn/pycnn.pyx | 241 ++++++++++++++++++++++++++---------------------- 2 files changed, 160 insertions(+), 110 deletions(-) diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index c3928894d..dd0cf9e7d 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -21,6 +21,7 @@ cdef extern from "cnn/dim.h" namespace "cnn": cdef extern from "cnn/tensor.h" namespace "cnn": cdef cppclass CTensor "cnn::Tensor": + CDim d pass float c_as_scalar "cnn::as_scalar" (CTensor& t) vector[float] c_as_vector "cnn::as_vector" (CTensor& t) @@ -71,7 +72,8 @@ cdef extern from "cnn/cnn.h" namespace "cnn": const CTensor& forward() const CTensor& incremental_forward() - #const CTensor& get_value(VariableIndex i) + const CTensor& get_value(VariableIndex i) + void invalidate() void backward() void PrintGraphviz() const @@ -83,6 +85,30 @@ cdef extern from "cnn/training.h" namespace "cnn": void update_epoch(float r) void status() + cdef cppclass CMomentumSGDTrainer "cnn::MomentumSGDTrainer": + CMomentumSGDTrainer(CModel* m, float lam, float e0, float mom) + void update(float s) + void update_epoch(float r) + void status() + + cdef cppclass CAdagradTrainer "cnn::AdagradTrainer": + CAdagradTrainer(CModel* m, float lam, float e0, float eps) + void update(float s) + void update_epoch(float r) + void status() + + cdef cppclass CAdadeltaTrainer "cnn::AdadeltaTrainer": + CAdadeltaTrainer(CModel* m, float lam, float eps, float rho) + void update(float s) + void update_epoch(float r) + void status() + + cdef cppclass CAdamTrainer "cnn::AdamTrainer": + CAdamTrainer(CModel* m, float lam, float alpha, float beta_1, float beta_2, float eps) + void update(float s) + void update_epoch(float r) + void status() + cdef extern from "cnn/expr.h" namespace "cnn::expr": cdef cppclass CExpression "cnn::expr::Expression": @@ -183,4 +209,3 @@ cdef extern from "cnn/lstm.h" namespace "cnn": vector[CExpression] final_h() vector[CExpression] final_s() - diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 2131795c4..c47e4835f 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -1,5 +1,8 @@ +# on numpy arrays, see: https://github.com/cython/cython/wiki/tutorials-NumpyPointerToC + import sys from cython.operator cimport dereference as deref +import numpy as np # TODO: # - set random seed (in CNN) # - better input / output support @@ -9,6 +12,11 @@ from cython.operator cimport dereference as deref # - make ComputationGraph a singleton??? # - NOTE: why do we need to filter short sentences in rnnlm.py or crash?? +# TODO: +# c2w.h (build a word-from-letters encoder) +# dict.h -- do we even need it? +# gru.h -- it is not the same as lstm/rnn for some reason. but should be trivial to add + # Examples: # V xor # V xor-xent @@ -43,6 +51,7 @@ cdef CDim Dim(dim): return CDim(dim) raise "Unsupported dimension",dim +# {{{ Model / Parameters cdef class Parameters: cdef CParameters *thisptr def __cinit__(self): @@ -96,7 +105,7 @@ cdef class Model: def __contains__(self, name): return name in self.named_params - +# }}} # {{{ Computation Graph @@ -192,15 +201,17 @@ cdef class ComputationGraph: # # We have the classes UnsignedValue, FloatValue and FloatVectorValue for # this purpose. - cpdef inputValue(self, FloatValue v): - self._inputs.append(v) - return inputValue(self, v) - cpdef inputVector(self, FloatVectorValue fv): - self._inputs.append(fv) - return inputVector(self, fv) - cpdef lookup(self, LookupParameters p, UnsignedValue v, update=True): - self._inputs.append(v) - return lookup(self, p, v, update) + cpdef inputValue(self, float v = 0.0): + return _inputExpression(self, v) + cpdef inputVector(self, int dim): + return _vecInputExpression(self, vector[float](dim)) + cpdef inputMatrix(self, int d1, int d2): + return _vecInputExpression(self, vector[float](d1*d2), (d1,d2)) + cpdef lookup(self, LookupParameters p, unsigned v = 0, update=True): + return _lookupExpression(self, p, v, update) + cpdef outputPicker(self, Expression e, unsigned v = 0): + r = _pickerExpression(self, e, v) + return r @@ -216,7 +227,8 @@ cdef _scalarsub(float a, Expression b): return Expression.from_cexpr(c_op_scalar cdef _cmul(Expression a, float b): return Expression.from_cexpr(c_op_scalar_mul(a.c(), b)) cdef class Expression: #{{{ - cdef CComputationGraph *cg + #cdef CComputationGraph *cg + cdef CComputationGraph* cg cdef VariableIndex vindex def __cinit__(self): self.cg = NULL @@ -234,8 +246,31 @@ cdef class Expression: #{{{ return str(self) def __str__(self): return "exprssion %s" % self.vindex - #cdef scalar(self): - # return c_as_scalar(self.cg.get_value(self.vindex)) + + cpdef scalar_value(self): + return c_as_scalar(self.cg.get_value(self.vindex)) + + cpdef vec_value(self): + return c_as_vector(self.cg.get_value(self.vindex)) + + cpdef npvalue(self): + cdef CTensor t + cdef CDim dim + t = self.cg.get_value(self.vindex) + dim = t.d + arr = np.array(c_as_vector(t)) + if dim.ndims() == 2: + arr = arr.reshape(dim.rows(), dim.cols()) + return arr + + cpdef value(self): + cdef CTensor t + t = self.cg.get_value(self.vindex) + if t.d.ndims() == 2: + return self.npvalue() + vec = self.vec_value() + if len(vec) == 1: return vec[0] + return vec def __add__(self, other): return _add(self,other) def __mul__(self, other): @@ -261,18 +296,7 @@ cpdef Expression parameter(ComputationGraph g, Parameters p): # {{{ Mutable Expressions # These depend values that can be set by the caller -#cdef class InputExpression(Expression): -# cdef float val -# def __cinit__(self, ComputationGraph g, float s): -# self.val = s -# self.cg = g.thisptr -# cdef CExpression e -# e = c_input(self.cg[0], &(self.val)) -# self.vindex = e.i -# def set(self, float s): -# self.val = s - -cdef class inputExpression(Expression): +cdef class _inputExpression(Expression): cdef FloatValue val def __cinit__(self, ComputationGraph g, float s): self.val = FloatValue(s) @@ -282,54 +306,24 @@ cdef class inputExpression(Expression): self.vindex = e.i g._inputs.append(self) def set(self, float s): + self.cg.invalidate() self.val.set(s) -# -#cdef class VecInputExpression(Expression): -# cdef vector[float] *data -# def __cinit__(self, ComputationGraph g, vector[float] data): -# cdef float f -# dim = len(data) -# self.data = new vector[float]() -# for f in data: -# self.data.push_back(f) -# self.cg = g.thisptr -# cdef CExpression e -# e = c_input(self.cg[0], Dim(dim), self.data) -# self.vindex = e.i -# def __dealloc__(self): -# print >> sys.stderr,"del" -# del self.data -# def set(self, vector[float] data): -# cdef float f -# self.data.clear() -# for f in data: -# self.data.push_back(f) - -cdef class vecInputExpression(Expression): + +cdef class _vecInputExpression(Expression): cdef FloatVectorValue val - def __cinit__(self, ComputationGraph g, FloatVectorValue val): - self.val = val + def __cinit__(self, ComputationGraph g, vector[float] val, dim=None): + self.val = FloatVectorValue(val) + if dim is None: dim = self.val.size() self.cg = g.thisptr cdef CExpression e - e = c_input(self.cg[0], Dim(val.size()), self.val.addr()) + e = c_input(self.cg[0], Dim(dim), self.val.addr()) self.vindex = e.i g._inputs.append(self) def set(self, vector[float] data): + self.cg.invalidate() self.val.set(data) -#cdef class LookupExpression(Expression): -# cdef unsigned index -# def __cinit__(self, ComputationGraph g, LookupParameters p, unsigned index=0): -# self.index = 1 -# #self.pindex = &(self.index) -# #self.pindex[0] = index -# self.cg = g.thisptr -# cdef CExpression e -# e = c_lookup(self.cg[0], p.thisptr, &(self.index)) -# self.vindex = e.i -# def set(self,i): self.index=i - -cdef class lookupExpression(Expression): +cdef class _lookupExpression(Expression): cdef UnsignedValue val def __cinit__(self, ComputationGraph g, LookupParameters p, unsigned index=0, update=True): self.val = UnsignedValue(index) @@ -341,50 +335,26 @@ cdef class lookupExpression(Expression): e = c_const_lookup(self.cg[0], p.thisptr, self.val.addr()) self.vindex = e.i g._inputs.append(self) - def set(self,i): self.val.set(i) - -#cdef class ConstLookupExpression(Expression): -# """Const in the sense that the lookup table is not updated. -# """ -# cdef unsigned index -# def __cinit__(self, ComputationGraph g, LookupParameters p, unsigned index): -# self.index = index -# self.cg = g.thisptr -# cdef CExpression e -# e = c_const_lookup(self.cg[0], p.thisptr, &(self.index)) -# self.vindex = e.i -# def set_index(self, unsigned index): -# self.index = index -# }}} - -#cdef class pick(Expression): -# cdef IntValue index -# def __cinit__(self, Expression x, IntValue index): -# self.index = index -# self.cg = x.cg -# cdef CExpression e -# e = c_pick(x.c(), &(self.index.val)) -# self.vindex = e.i -# #def set_index(self, unsigned i): -# # self.index = i - - -cdef Expression inputValue(ComputationGraph cg, FloatValue v): - return Expression.from_cexpr(c_input(cg.thisptr[0], v.addr())) + def set(self,i): + self.cg.invalidate() + self.val.set(i) -cdef Expression inputVector(ComputationGraph cg, FloatVectorValue v): - return Expression.from_cexpr(c_input(cg.thisptr[0], Dim(v.size()), v.addr())) +cdef class _pickerExpression(Expression): + cdef UnsignedValue val + def __cinit__(self, ComputationGraph g, Expression e, unsigned index=0): + self.val = UnsignedValue(index) + self.cg = e.cg + cdef CExpression ce + ce = c_pick(e.c(), self.val.addr()) + self.vindex = ce.i + g._inputs.append(self) + def set(self,i): + self.cg.invalidate() + self.val.set(i) -cdef Expression lookup(ComputationGraph cg, LookupParameters p, UnsignedValue v, update): - if update: - return Expression.from_cexpr(c_lookup(cg.thisptr[0], p.thisptr, v.addr())) - else: - return Expression.from_cexpr(c_const_lookup(cg.thisptr[0], p.thisptr, v.addr())) +pick = _pickerExpression -cpdef Expression pick(Expression x, UnsignedValue v): - # TODO register automatically in CG!! how? - #x.cg._inputs.append(v) - return Expression.from_cexpr(c_pick(x.c(), v.addr())) +# }}} # binary-exp @@ -483,7 +453,8 @@ cdef class hinge(Expression): # {{{ RNNS / Builders # TODO: unify these with inheritance -cdef class SimpleRNNBuilder: + +cdef class SimpleRNNBuilder: # {{{ cdef CSimpleRNNBuilder *thisptr def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): self.thisptr = new CSimpleRNNBuilder(layers, input_dim, hidden_dim, model.thisptr) @@ -515,8 +486,9 @@ cdef class SimpleRNNBuilder: for cexp in cexps: res.append(Expression.from_cexpr(cexp)) return res +#}}} -cdef class LSTMBuilder: +cdef class LSTMBuilder: # {{{ cdef CLSTMBuilder *thisptr def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): self.thisptr = new CLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr) @@ -548,7 +520,8 @@ cdef class LSTMBuilder: for cexp in cexps: res.append(Expression.from_cexpr(cexp)) return res - +# }}} + # }}} # {{{ Training @@ -564,6 +537,58 @@ cdef class SimpleSGDTrainer: self.thisptr.update_epoch(r) cpdef status(self): self.thisptr.status() + +cdef class MomentumSGDTrainer: + cdef CMomentumSGDTrainer *thisptr + def __cinit__(self, Model m, float lam = 1e-6, float e0 = 0.01, float mom = 0.9): + self.thisptr = new CMomentumSGDTrainer(m.thisptr, lam, e0, mom) + def __dealloc__(self): + del self.thisptr + cpdef update(self, float s): + self.thisptr.update(s) + cpdef update_epoch(self, float r = 1.0): + self.thisptr.update_epoch(r) + cpdef status(self): + self.thisptr.status() + +cdef class AdagradTrainer: + cdef CAdagradTrainer *thisptr + def __cinit__(self, Model m, float lam = 1e-6, float e0 = 0.1, float eps = 1e-20): + self.thisptr = new CAdagradTrainer(m.thisptr, lam, e0, eps) + def __dealloc__(self): + del self.thisptr + cpdef update(self, float s): + self.thisptr.update(s) + cpdef update_epoch(self, float r = 1.0): + self.thisptr.update_epoch(r) + cpdef status(self): + self.thisptr.status() + +cdef class AdadeltaTrainer: + cdef CAdadeltaTrainer *thisptr + def __cinit__(self, Model m, float lam = 1e-6, float eps = 1e-6, float rho = 0.95): + self.thisptr = new CAdadeltaTrainer(m.thisptr, lam, eps, rho) + def __dealloc__(self): + del self.thisptr + cpdef update(self, float s): + self.thisptr.update(s) + cpdef update_epoch(self, float r = 1.0): + self.thisptr.update_epoch(r) + cpdef status(self): + self.thisptr.status() + +cdef class AdamTrainer: + cdef CAdamTrainer *thisptr + def __cinit__(self, Model m, float lam = 1e-6, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, eps = 1e-8 ): + self.thisptr = new CAdamTrainer(m.thisptr, lam, alpha, beta_1, beta_2, eps) + def __dealloc__(self): + del self.thisptr + cpdef update(self, float s): + self.thisptr.update(s) + cpdef update_epoch(self, float r = 1.0): + self.thisptr.update_epoch(r) + cpdef status(self): + self.thisptr.status() #}}} From 75bf12d14a2537e4105c50181a7deb8e9eaa9a2c Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Thu, 9 Jul 2015 12:38:47 +0300 Subject: [PATCH 126/965] fixes --- pycnn/nlm.py | 8 ++++---- pycnn/pycnn.pyx | 12 ++++++------ pycnn/rnnlm.py | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pycnn/nlm.py b/pycnn/nlm.py index 11249dde3..b32ea1075 100644 --- a/pycnn/nlm.py +++ b/pycnn/nlm.py @@ -31,7 +31,7 @@ def corpus_to_examples(corpus,CONTEXT=3): class InputWordIds: def __init__(self, cg, lookup_params, nwords): - self.exprs = [LookupExpression(cg, lookup_params) for _ in xrange(nwords)] + self.exprs = [cg.lookup(lookup_params) for _ in xrange(nwords)] def feed(self, word_ids): [e.set(i) for (e,i) in zip(self.exprs,word_ids)] @@ -49,8 +49,8 @@ def feed(self, word_ids): nl = rectify(r) o2 = bias + (R * nl) ydist = log_softmax(o2) -expected_outcome = IntValue() -nerr = -pick(ydist, expected_outcome) # TODO: make nicer API! +val_at_expected_outcome = cg.outputPicker(ydist) +nerr = -val_at_expected_outcome cg.PrintGraphviz() @@ -64,7 +64,7 @@ def feed(self, word_ids): start = time.time() for i, (context_words, target_word) in enumerate(data): contexts.feed([vocab.w2i[w] for w in context_words]) - expected_outcome.set(vocab.w2i[target_word]) + val_at_expected_outcome.set(vocab.w2i[target_word]) loss += cg.forward_scalar() cg.backward() sgd.update(1.0) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index c47e4835f..6c4b1b911 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -47,7 +47,7 @@ cdef CDim Dim(dim): else: raise "Unsupported dimension",dim # hope it's a number. TODO: error checking / exception - if isinstance(dim, int): + if isinstance(dim, (int, float)): return CDim(dim) raise "Unsupported dimension",dim @@ -531,7 +531,7 @@ cdef class SimpleSGDTrainer: self.thisptr = new CSimpleSGDTrainer(m.thisptr, lam, e0) def __dealloc__(self): del self.thisptr - cpdef update(self, float s): + cpdef update(self, float s=1.0): self.thisptr.update(s) cpdef update_epoch(self, float r = 1.0): self.thisptr.update_epoch(r) @@ -544,7 +544,7 @@ cdef class MomentumSGDTrainer: self.thisptr = new CMomentumSGDTrainer(m.thisptr, lam, e0, mom) def __dealloc__(self): del self.thisptr - cpdef update(self, float s): + cpdef update(self, float s=1.0): self.thisptr.update(s) cpdef update_epoch(self, float r = 1.0): self.thisptr.update_epoch(r) @@ -557,7 +557,7 @@ cdef class AdagradTrainer: self.thisptr = new CAdagradTrainer(m.thisptr, lam, e0, eps) def __dealloc__(self): del self.thisptr - cpdef update(self, float s): + cpdef update(self, float s=1.0): self.thisptr.update(s) cpdef update_epoch(self, float r = 1.0): self.thisptr.update_epoch(r) @@ -570,7 +570,7 @@ cdef class AdadeltaTrainer: self.thisptr = new CAdadeltaTrainer(m.thisptr, lam, eps, rho) def __dealloc__(self): del self.thisptr - cpdef update(self, float s): + cpdef update(self, float s=1.0): self.thisptr.update(s) cpdef update_epoch(self, float r = 1.0): self.thisptr.update_epoch(r) @@ -583,7 +583,7 @@ cdef class AdamTrainer: self.thisptr = new CAdamTrainer(m.thisptr, lam, alpha, beta_1, beta_2, eps) def __dealloc__(self): del self.thisptr - cpdef update(self, float s): + cpdef update(self, float s=1.0): self.thisptr.update(s) cpdef update_epoch(self, float r = 1.0): self.thisptr.update_epoch(r) diff --git a/pycnn/rnnlm.py b/pycnn/rnnlm.py index 35948e588..bce3ca2ce 100644 --- a/pycnn/rnnlm.py +++ b/pycnn/rnnlm.py @@ -33,7 +33,7 @@ def BuildLMGraph(self, sent): es=[] for (cw,nw) in zip(sent,sent[1:]): # assume word is already a word-id - x_t = lookupExpression(cg, self.m["lookup"], int(cw)) + x_t = cg.lookup(self.m["lookup"], int(cw)) y_t = builder.add_input(x_t) # TODO what does this do exactly? r_t = bias + (R * y_t) #f = softmax(r_t) @@ -62,7 +62,7 @@ def sample(self, first=1, nchars=0, stop=-1): bias = cg.parameters(self.m, "bias") cw = first #TODO: start symbol? while True: - x_t = lookupExpression(cg, self.m["lookup"], cw) + x_t = cg.lookup(self.m["lookup"], cw) y_t = builder.add_input(x_t) # TODO what does this do exactly? #s = concatenate(builder.final_h()) From 230e3e58478307c43333c9c6e4d25aa2bc0c92cd Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Thu, 9 Jul 2015 19:04:57 +0300 Subject: [PATCH 127/965] load/save params to and from np arrays --- pycnn/pycnn.pxd | 8 ++++++- pycnn/pycnn.pyx | 62 +++++++++++++++++++++++++++++++++++++++++++++---- pycnn/rnnlm.py | 7 +++++- 3 files changed, 71 insertions(+), 6 deletions(-) diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index dd0cf9e7d..227bcc144 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -1,4 +1,5 @@ from libcpp.vector cimport vector +from libcpp.string cimport string ctypedef float real @@ -22,6 +23,7 @@ cdef extern from "cnn/dim.h" namespace "cnn": cdef extern from "cnn/tensor.h" namespace "cnn": cdef cppclass CTensor "cnn::Tensor": CDim d + float* v pass float c_as_scalar "cnn::as_scalar" (CTensor& t) vector[float] c_as_vector "cnn::as_vector" (CTensor& t) @@ -29,6 +31,7 @@ cdef extern from "cnn/tensor.h" namespace "cnn": cdef extern from "cnn/model.h" namespace "cnn": cdef cppclass CParameters "cnn::Parameters": CParameters() + CTensor values #void scale_parameters(float a) # override; #void squared_l2norm(float* sqnorm) const # override; #void g_squared_l2norm(float* sqnorm) const # override; @@ -39,13 +42,14 @@ cdef extern from "cnn/model.h" namespace "cnn": cdef cppclass CLookupParameters "cnn::LookupParameters": CLookupParameters() + vector[CTensor] values #void scale_parameters(float a) # override; #void squared_l2norm(float* sqnorm) const # override; #void g_squared_l2norm(float* sqnorm) const # override; #size_t size() const # override; #void accumulate_grad(const Tensor& g) #void clear() - #void Initialize(unsigned index, const vector[float]& val) + void Initialize(unsigned index, const vector[float]& val) pass cdef cppclass CModel "cnn::Model": @@ -53,6 +57,8 @@ cdef extern from "cnn/model.h" namespace "cnn": #float gradient_l2_norm() const CParameters* add_parameters(CDim& d, float scale = 0.0) CLookupParameters* add_lookup_parameters(unsigned n, const CDim& d) + #void save(string fname) + #void load(string fname) cdef extern from "cnn/cnn.h" namespace "cnn": ctypedef unsigned VariableIndex diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 6c4b1b911..7c0a3942e 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -51,6 +51,12 @@ cdef CDim Dim(dim): return CDim(dim) raise "Unsupported dimension",dim +cdef c_tensor_as_np(CTensor &t): + # TODO: make more efficient, with less copy + arr = np.array(c_as_vector(t)) + if t.d.ndims() == 1: return arr + else: return arr.reshape(t.d.rows(), t.d.cols()) + # {{{ Model / Parameters cdef class Parameters: cdef CParameters *thisptr @@ -62,6 +68,30 @@ cdef class Parameters: self.thisptr = ptr return self + cpdef as_array(self): + """ + Return as a numpy array. + """ + cdef CTensor t + return c_tensor_as_np(self.thisptr.values) + + # TODO: make more efficient + cpdef load_array(self, arr): + cdef CTensor t + cdef float* vals + t = self.thisptr.values + shape = arr.shape + if len(shape) == 1: + assert(t.d.ndims() == 1) + assert(t.d.size() == arr.size) + if len(shape) == 2: + assert(t.d.rows() == shape[0] and t.d.cols() == shape[1]) + vals = t.v + arr = arr.flatten() + for i in xrange(arr.size): + vals[i] = arr[i] + + cdef class LookupParameters: cdef CLookupParameters *thisptr def __cinit__(self): @@ -72,6 +102,27 @@ cdef class LookupParameters: self.thisptr = ptr return self + cpdef init_from_array(self, arr): + if len(arr) > self.thisptr.values.size(): + raise Exception("too many rows") + if arr.shape[1] != self.thisptr.values[0].d.rows(): + raise Exception("dim mismatch") + cdef vector[float] r + for i,row in enumerate(arr): + self.init_row(i, row) + + cpdef init_row(self, unsigned i, vector[float] row): + self.thisptr.Initialize(i, row) + + cpdef as_array(self): + """ + Return as a numpy array. + """ + cdef vector[CTensor] vals + vals = self.thisptr.values + return np.vstack([c_tensor_as_np(t).reshape(1,-1) for t in vals]) + + cdef class Model: cdef CModel *thisptr cdef object named_params @@ -105,6 +156,13 @@ cdef class Model: def __contains__(self, name): return name in self.named_params + #def load(self, fname): + # self.thisptr.load(fname) + + #def save(self, fname): + # self.thisptr.save(fname) + + # }}} # {{{ Computation Graph @@ -591,7 +649,3 @@ cdef class AdamTrainer: self.thisptr.status() #}}} - - - - diff --git a/pycnn/rnnlm.py b/pycnn/rnnlm.py index bce3ca2ce..2ed6d9c88 100644 --- a/pycnn/rnnlm.py +++ b/pycnn/rnnlm.py @@ -100,7 +100,7 @@ def sample(self, first=1, nchars=0, stop=-1): #fout = file("a","w") chars = loss = 0.0 - for ITER in xrange(1000): + for ITER in xrange(1): random.shuffle(train) for i,sent in enumerate(train): if i % 50 == 0: @@ -112,6 +112,7 @@ def sample(self, first=1, nchars=0, stop=-1): print "".join([vocab.i2w[c] for c in samp]).strip() loss = 0.0 chars = 0.0 + if i > 1000: break #if len(sent) < 4: continue chars += len(sent)-1 @@ -132,3 +133,7 @@ def sample(self, first=1, nchars=0, stop=-1): pass #samp = lm.sample(first=vocab.w2i[""],stop=vocab.w2i[""]) #print " ".join([vocab.i2w[c] for c in samp]) + params = model["lookup"] + x = params.get() + print x + print x.shape From a4e66b8f7f6d89a64dc9d9dab2d572dd62fe33b8 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Thu, 9 Jul 2015 21:20:25 +0300 Subject: [PATCH 128/965] install hints --- INSTALL | 21 +++++++++++++++++++++ pycnn/rnnlm.py | 7 +------ 2 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 INSTALL diff --git a/INSTALL b/INSTALL new file mode 100644 index 000000000..4d4cdadb0 --- /dev/null +++ b/INSTALL @@ -0,0 +1,21 @@ +# installation instructions for pycnn + +mkdir cnn +cd cnn +git clone https://github.com/yoavg/cnn.git +hg clone https://bitbucket.org/eigen/eigen/ + +cd cnn +git checkout pycnn # branch +mkdir build +cd build +cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBOOST_ROOT=/home/yogo/.local/boost +make -j 2 + +cd ../pycnn +pip2 install cython --user +make +export LD_LIBRARY_PATH=/home/yogo/cnn/cnn/pycnn + +# check that it works: +python2 rnnlm.py rnnlm.py diff --git a/pycnn/rnnlm.py b/pycnn/rnnlm.py index 2ed6d9c88..92b3af01f 100644 --- a/pycnn/rnnlm.py +++ b/pycnn/rnnlm.py @@ -100,7 +100,7 @@ def sample(self, first=1, nchars=0, stop=-1): #fout = file("a","w") chars = loss = 0.0 - for ITER in xrange(1): + for ITER in xrange(100): random.shuffle(train) for i,sent in enumerate(train): if i % 50 == 0: @@ -112,7 +112,6 @@ def sample(self, first=1, nchars=0, stop=-1): print "".join([vocab.i2w[c] for c in samp]).strip() loss = 0.0 chars = 0.0 - if i > 1000: break #if len(sent) < 4: continue chars += len(sent)-1 @@ -133,7 +132,3 @@ def sample(self, first=1, nchars=0, stop=-1): pass #samp = lm.sample(first=vocab.w2i[""],stop=vocab.w2i[""]) #print " ".join([vocab.i2w[c] for c in samp]) - params = model["lookup"] - x = params.get() - print x - print x.shape From 87dff81492964bf5773b67b951123c337d965470 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Thu, 9 Jul 2015 22:30:10 +0300 Subject: [PATCH 129/965] fixed hinge --- pycnn/pycnn.pyx | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 7c0a3942e..d2e20b9d1 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -406,12 +406,27 @@ cdef class _pickerExpression(Expression): ce = c_pick(e.c(), self.val.addr()) self.vindex = ce.i g._inputs.append(self) - def set(self,i): + def set_index(self,i): self.cg.invalidate() self.val.set(i) pick = _pickerExpression +cdef class _hingeExpression(Expression): + cdef UnsignedValue val + def __cinit__(self, ComputationGraph g, Expression x, unsigned index, float m=1.0): + self.val = UnsignedValue(index) + self.cg = x.cg + cdef CExpression e + e = c_hinge(x.c(), self.val.addr(), m) + self.vindex = e.i + g._inputs.append(self) + def set_index(self, unsigned i): + self.cg.invalidate() + self.val.set(i) + +hinge = _hingeExpression + # }}} @@ -495,17 +510,6 @@ cpdef Expression affine_transform(list exprs): ves.push_back(e.c()) return Expression.from_cexpr(c_affine_transform(ves)) -#expr-ptr -cdef class hinge(Expression): - cdef unsigned index - def __cinit__(self, Expression x, unsigned index, float m=1.0): - self.index = index - self.cg = x.cg - cdef CExpression e - e = c_hinge(x.c(), &(self.index), m) - self.vindex = e.i - def set_index(self, unsigned i): - self.index = i # }}} From 2211f1f2028eb3f7d739f3673135b685f132d903 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 10 Jul 2015 16:49:02 +0900 Subject: [PATCH 130/965] Made CUDA choose device with most free memory by default --- cnn/cuda.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/cnn/cuda.cc b/cnn/cuda.cc index 96278597d..dcc3c7316 100644 --- a/cnn/cuda.cc +++ b/cnn/cuda.cc @@ -16,6 +16,8 @@ void Initialize_GPU(int& argc, char**& argv) { cerr << "No GPUs found, recompile without DENABLE_CUDA=1\n"; abort(); } + size_t free_bytes, total_bytes, max_free = 0; + int selected = 0; for (int i = 0; i < nDevices; i++) { cudaDeviceProp prop; CUDA_CHECK(cudaGetDeviceProperties(&prop, i)); @@ -24,8 +26,15 @@ void Initialize_GPU(int& argc, char**& argv) { cerr << " Memory Clock Rate (KHz): " << prop.memoryClockRate << endl; cerr << " Memory Bus Width (bits): " << prop.memoryBusWidth << endl; cerr << " Peak Memory Bandwidth (GB/s): " << (2.0*prop.memoryClockRate*(prop.memoryBusWidth/8)/1.0e6) << endl << endl; + CUDA_CHECK(cudaSetDevice(i)); + CUDA_CHECK(cudaMemGetInfo( &free_bytes, &total_bytes )); + CUDA_CHECK(cudaDeviceReset()); + cerr << " Memory Free (MB): " << (int)free_bytes/1.0e6 << "/" << (int)total_bytes/1.0e6 << endl << endl; + if(free_bytes > max_free) { + max_free = free_bytes; + selected = i; + } } - int selected = 0; cerr << "**USING DEVICE: " << selected << endl; CUDA_CHECK(cudaSetDevice(selected)); CUBLAS_CHECK(cublasCreate(&cublas_handle)); From b10bb37dc46370028d0c46bff63733284185efb7 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 10 Jul 2015 14:43:59 -0700 Subject: [PATCH 131/965] fix concat cols --- cnn/nodes.cc | 24 ++++++++++++++++++++++-- cnn/nodes.h | 1 + 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index fbf6978b6..3bd8978d6 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -425,15 +425,29 @@ void Concatenate::backward(const vector& xs, #endif } +#define MAX_CONCAT_COLS_ARGS 512 +size_t ConcatenateColumns::aux_storage_size() const { + return MAX_CONCAT_COLS_ARGS * sizeof(unsigned); +} + void ConcatenateColumns::forward(const vector& xs, Tensor& fx) const { + unsigned c = 0; + assert(xs.size() < MAX_CONCAT_COLS_ARGS); for (unsigned i = 0; i < xs.size(); ++i) { + static_cast(aux_mem)[i] = c; #if HAVE_CUDA + assert(xs[i]->d.cols() == 1); // CUBLAS matricies are column-major, so just copy the memory auto & xi = *xs[i]; const unsigned rows = xi.d.rows(); CUDA_CHECK(cudaMemcpyAsync(&fx.v[i*rows], &xi.v[0], sizeof(float) * rows, cudaMemcpyDeviceToDevice)); #else - (*fx).col(i) = **xs[i]; + auto xi = **xs[i]; + int d = xi.cols(); + for (int j = 0; j < d; ++j) { + (*fx).col(c) = xi.col(j); + c++; + } #endif } } @@ -448,7 +462,13 @@ void ConcatenateColumns::backward(const vector& xs, const unsigned begin = i*rows; CUBLAS_CHECK(cublasSaxpy(cublas_handle, rows, kSCALAR_ONE, &dEdf.v[begin], 1, dEdxi.v, 1)); #else - *dEdxi += (*dEdf).col(i); + auto dEdx = *dEdxi; + int d = dEdx.cols(); + int c = static_cast(aux_mem)[i]; + for (int j = 0; j < d; ++j) { + dEdx.col(j) += (*dEdf).col(c); + ++c; + } #endif } diff --git a/cnn/nodes.h b/cnn/nodes.h index f945b3f19..06d5e04af 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -242,6 +242,7 @@ struct ConcatenateColumns : public Node { template explicit ConcatenateColumns(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + size_t aux_storage_size() const override; void forward(const std::vector& xs, Tensor& fx) const override; void backward(const std::vector& xs, const Tensor& fx, From 826cee230dedf0fedec48330d5f2e20cd3881b0f Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 10 Jul 2015 17:39:58 -0700 Subject: [PATCH 132/965] max of two vectors --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/nodes-common.cc | 14 ++++++++++++++ cnn/nodes.cc | 32 ++++++++++++++++++++++++++++++++ cnn/nodes.h | 14 ++++++++++++++ 5 files changed, 62 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index 43bc9f9db..fac2f98f2 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -36,6 +36,7 @@ Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_ Expression log_softmax(const Expression& x, const std::vector& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } Expression softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression softsign(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression max(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression noise(const Expression& x, real stddev) { return Expression(x.pg, x.pg->add_function({x.i}, stddev)); } Expression dropout(const Expression& x, real p) { return Expression(x.pg, x.pg->add_function({x.i}, p)); } diff --git a/cnn/expr.h b/cnn/expr.h index a8a07f225..c7c7bb2eb 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -48,6 +48,7 @@ Expression log_softmax(const Expression& x); Expression log_softmax(const Expression& x, const std::vector& restriction); Expression softmax(const Expression& x); Expression softsign(const Expression& x); +Expression max(const Expression& x, const Expression& y); Expression noise(const Expression& x, real stddev); Expression dropout(const Expression& x, real p); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index f9d1fdd0d..de6401c77 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -17,6 +17,20 @@ inline bool LooksLikeVector(const Dim& d) { return true; } +string Max::as_string(const vector& arg_names) const { + ostringstream s; + s << "max{" << arg_names[0] << ", " << arg_names[1] << "}"; + return s.str(); +} + +Dim Max::dim_forward(const vector& xs) const { + if (xs.size() != 2 || xs[0] != xs[1]) { + cerr << "Bad arguments in Max: " << xs << endl; + abort(); + } + return xs[0]; +} + string TraceOfProduct::as_string(const vector& arg_names) const { ostringstream s; s << "Tr(" << arg_names[0] << " * " << arg_names[1] << "^T)"; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 3bd8978d6..d72db9728 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -33,6 +33,38 @@ using namespace std; namespace cnn { +size_t Max::aux_storage_size() const { + return dim.size() * sizeof(char); +} + +void Max::forward(const vector& xs, Tensor& fx) const { + float* y = fx.v; + const float* x1 = xs[0]->v; + const float* x2 = xs[0]->v; + char* one_is_bigger = static_cast(aux_mem); + int s = dim.size(); + for (int i = 0; i < s; ++i) { + bool o = x1[i] > x2[i]; + one_is_bigger[i] = o; + y[i] = o ? x1[i] : x2[i]; + } +} + +void Max::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + bool invert = (i == 1); + int s = dim.size(); + float* d = dEdxi.v; + const char* one_is_bigger = static_cast(aux_mem); + for (int i = 0; i < s; ++i) { + d[i] = one_is_bigger[i] ^ invert; + } +} + void TraceOfProduct::forward(const vector& xs, Tensor& fx) const { auto x1 = **xs[0]; auto x2 = **xs[1]; diff --git a/cnn/nodes.h b/cnn/nodes.h index 06d5e04af..aacd71c97 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -5,6 +5,20 @@ namespace cnn { +// y = max{x_1, x_2} +struct Max : public Node { + explicit Max(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + size_t aux_storage_size() const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = Tr(x_1 * x_2^T) struct TraceOfProduct : public Node { explicit TraceOfProduct(const std::initializer_list& a) : Node(a) {} From 5fc5ee491f73e9d2f27419cbded2b9594f55191c Mon Sep 17 00:00:00 2001 From: Trevor Cohn Date: Fri, 10 Jul 2015 18:21:12 -0700 Subject: [PATCH 133/965] SGD can selectively update some parameters --- cnn/training.cc | 8 ++++++-- cnn/training.h | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cnn/training.cc b/cnn/training.cc index 1783a5376..98b9d1a68 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -21,8 +21,12 @@ float Trainer::clip_gradients() { } void SimpleSGDTrainer::update(real scale) { + update(model->lookup_parameters_list(), model->parameters_list(), scale); +} + +void SimpleSGDTrainer::update(const std::vector &lookup_params, const std::vector ¶ms, real scale) { const float gscale = clip_gradients(); - for (auto p : model->parameters_list()) { + for (auto p : params) { #if HAVE_CUDA gpu::sgd_update(p->values.d.size(), p->g.v, p->values.v, eta * scale * gscale, lambda); #else @@ -31,7 +35,7 @@ void SimpleSGDTrainer::update(real scale) { #endif p->clear(); } - for (auto p : model->lookup_parameters_list()) { + for (auto p : lookup_params) { for (auto i : p->non_zero_grads) { #if HAVE_CUDA gpu::sgd_update(p->values[i].d.size(), p->grads[i].v, p->values[i].v, eta * scale * gscale, lambda); diff --git a/cnn/training.h b/cnn/training.h index 5a6a71631..9837311a7 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -47,6 +47,7 @@ struct Trainer { struct SimpleSGDTrainer : public Trainer { explicit SimpleSGDTrainer(Model* m, real lam = 1e-6, real e0 = 0.1) : Trainer(m, lam, e0) {} void update(real scale) override; + void update(const std::vector &lookup_params, const std::vector ¶ms, real scale = 1); }; struct MomentumSGDTrainer : public Trainer { From 4ea8ad8d3c629d61cc41e906500a5ba5e690c7a4 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Sat, 11 Jul 2015 15:08:52 +0300 Subject: [PATCH 134/965] improved setup.py. cg parameters interface change. --- examples/encdec.cc | 36 +++++++-------- pycnn/encdec.py | 106 +++++++++++++++++++++++++++++++++++++++++++++ pycnn/nlm.py | 12 +++-- pycnn/pycnn.pxd | 2 + pycnn/pycnn.pyx | 58 ++++++++++++++++++++----- pycnn/rnnlm.py | 8 ++-- pycnn/setup.py | 3 +- pycnn/xor.py | 24 +++++----- 8 files changed, 196 insertions(+), 53 deletions(-) create mode 100644 pycnn/encdec.py diff --git a/examples/encdec.cc b/examples/encdec.cc index 6fc899d20..fa1f0b81c 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -210,24 +210,24 @@ int main(int argc, char** argv) { double loss = 0; unsigned chars = 0; for (unsigned i = 0; i < report_every_i; ++i) { - if (si == training.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - random_shuffle(order.begin(), order.end()); - } - - // build graph for this instance - ComputationGraph cg; - auto& sent = training[order[si]]; - chars += sent.size() - 1; - ++si; - lm.BuildGraph(sent, sent, cg); - //cg.PrintGraphviz(); - loss += as_scalar(cg.forward()); - cg.backward(); - sgd->update(); - ++lines; + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + random_shuffle(order.begin(), order.end()); + } + + // build graph for this instance + ComputationGraph cg; + auto& sent = training[order[si]]; + chars += sent.size() - 1; + ++si; + lm.BuildGraph(sent, sent, cg); + //cg.PrintGraphviz(); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(); + ++lines; } sgd->status(); cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; diff --git a/pycnn/encdec.py b/pycnn/encdec.py new file mode 100644 index 000000000..7c8012b24 --- /dev/null +++ b/pycnn/encdec.py @@ -0,0 +1,106 @@ +from pycnn import * + +LAYERS = 3 +INPUT_DIM = 500 +HIDDEN_DIM = 500 +INPUT_VOCAB_SIZE = 0 +OUTPUT_VOCAB_SIZE = 0 + +class EncoderDecoder: + def __init__(self, model, builder=LSTMBuilder): + self.m = model + model.add_parameters("ie2h", (HIDDEN_DIM*LAYERS*1.5, HIDDEN_DIM*LAYERS*2)) + model.add_parameters("bie", HIDDEN_DIM*LAYERS*1.5) + model.add_parameters("h2oe", (HIDDEN_DIM*LAYERS, HIDDEN_DIM*LAYERS*1.5)) + model.add_parameters("boe", (HIDDEN_DIM*LAYERS)) + model.add_lookup_parameters("c", (INPUT_VOCAB_SIZE, INPUT_DIM)) + model.add_lookup_parameters("ec", (INPUT_VOCAB_SIZE, INPUT_DIM)) + model.add_parameters("R", (OUTPUT_VOCAB_SIZE, HIDDEN_DIM)) + model.add_parameters("bias", OUTPUT_VOCAB_SIZE) + + self.dec_builder = builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) + self.fwd_enc_builder = builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) + self.rev_enc_builder = builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) + + def BuildGraph(self, isent, osent, cg): + fwb = self.fwd_enc_builder + fwb.new_graph(cg) + fwb.start_new_sequence() + # fw encoder + for wid in isent: + fwb.add_input(cg.lookup(model["ec"], wid)) + # bw encoder + bwb = self.rev_enc_builder + bwb.new_graph(cg) + bwb.start_new_sequence() + for wid in reversed(isent): + bwb.add_input(cg.lookup(model["ec"], wid)) + + # combine encoders: + to = fwb.final_h() + bwb.final_h() + combined = concatenate(to) + ie2h = cg.parameters(self.m["ie2h"]) + bie = cg.parameters(self.m["bie"]) + t = bie + (ie2h * combined) + cg.inc_forward_vec() + h = rectify(t) + h2oe = cg.parameters(self.m["h2oe"]) + boe = cg.parameters(self.m["boe"]) + nc = boe + (h2oe * h) + + oein1 = [pickrange(nc, i* HIDDEN_DIM, (i+1)*HIDDEN_DIM) for i in xrange(LAYERS)] + oein2 = [tanh(x) for x in oein1] + oein = oein1 + oein2 + + decb = self.dec_builder + decb.new_graph(cg) + decb.start_new_sequence(oein) + # decoder + R = cg.parameters(self.m["R"]) + bias = cg.parameters(self.m["bias"]) + + errs = [] + for (cw,nw) in zip(osent, osent[1:]): + x_t = cg.lookup(self.m["c"], cw) + y_t = decb.add_input(x_t) + r_t = bias + (R * y_t) + ydist = log_softmax(r_t) + errs.append(cg.outputPicker(ydist, nw)) + return -esum(errs) + +if __name__ == '__main__': + import sys + import util + import random + + train = util.CharsCorpusReader(sys.argv[1],begin="") + vocab = util.Vocab.from_corpus(train) + INPUT_VOCAB_SIZE = vocab.size() + OUTPUT_VOCAB_SIZE = vocab.size() + + model = Model() + sgd = SimpleSGDTrainer(model) + cg = ComputationGraph() + + lm = EncoderDecoder(model, LSTMBuilder) + + train = list(train) + chars = loss = 0.0 + while True: + random.shuffle(train) + for i,sent in enumerate(train,1): + if i % 50 == 0: + print "E = ", (loss / chars) + sgd.status() + + chars = loss = 0.0 + + cg.renew() + chars += len(sent) - 1 + isent = [vocab.w2i[w] for w in sent] + lm.BuildGraph(isent, isent, cg) + loss += cg.forward_scalar() + cg.backward() + sgd.update() + sgd.update_epoch() + diff --git a/pycnn/nlm.py b/pycnn/nlm.py index b32ea1075..b447b9e0d 100644 --- a/pycnn/nlm.py +++ b/pycnn/nlm.py @@ -1,7 +1,5 @@ from pycnn import * - - from util import CorpusReader, Vocab #corpus = CorpusReader("../examples/example-data/fin-toy.txt") corpus = CorpusReader("ngrams") @@ -40,10 +38,10 @@ def feed(self, word_ids): contexts = InputWordIds(cg, m["word_lookup"], CONTEXT) cvec = concatenate(contexts.exprs) # TODO -C = cg.parameters(m, "C", (DIM, DIM*CONTEXT)) -hb = cg.parameters(m, "hb", DIM) -R = cg.parameters(m, "R", (VOCAB_SIZE, DIM)) -bias = cg.parameters(m, "bias", VOCAB_SIZE) +C = cg.parameters(m.add_parameters("C", (DIM, DIM*CONTEXT))) +hb = cg.parameters(m.add_parameters("hb", DIM)) +R = cg.parameters(m.add_parameters("R", (VOCAB_SIZE, DIM))) +bias = cg.parameters(m.add_parameters("bias", VOCAB_SIZE)) r = hb + (C * cvec) nl = rectify(r) @@ -64,7 +62,7 @@ def feed(self, word_ids): start = time.time() for i, (context_words, target_word) in enumerate(data): contexts.feed([vocab.w2i[w] for w in context_words]) - val_at_expected_outcome.set(vocab.w2i[target_word]) + val_at_expected_outcome.set_index(vocab.w2i[target_word]) loss += cg.forward_scalar() cg.backward() sgd.update(1.0) diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index 227bcc144..ceba0674b 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -38,6 +38,7 @@ cdef extern from "cnn/model.h" namespace "cnn": #size_t size() const # override; #void accumulate_grad(const Tensor& g) #void clear() + CDim dim pass cdef cppclass CLookupParameters "cnn::LookupParameters": @@ -49,6 +50,7 @@ cdef extern from "cnn/model.h" namespace "cnn": #size_t size() const # override; #void accumulate_grad(const Tensor& g) #void clear() + CDim dim void Initialize(unsigned index, const vector[float]& val) pass diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index d2e20b9d1..e8cedf383 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -68,6 +68,10 @@ cdef class Parameters: self.thisptr = ptr return self + cpdef shape(self): + if self.thisptr.dim.ndims() == 1: return (self.thisptr.dim.rows()) + return (self.thisptr.dim.rows(), self.thisptr.dim.cols()) + cpdef as_array(self): """ Return as a numpy array. @@ -111,6 +115,11 @@ cdef class LookupParameters: for i,row in enumerate(arr): self.init_row(i, row) + cpdef shape(self): + if self.thisptr.dim.cols() != 1: + return (self.thisptr.values.size(), self.thisptr.dim.rows(), self.thisptr.dim.cols()) + return (self.thisptr.values.size(), self.thisptr.dim.rows()) + cpdef init_row(self, unsigned i, vector[float] row): self.thisptr.Initialize(i, row) @@ -126,28 +135,36 @@ cdef class LookupParameters: cdef class Model: cdef CModel *thisptr cdef object named_params + cdef object lookups + cdef object regular def __cinit__(self): self.thisptr = new CModel() def __init__(self): self.named_params = {} + self.lookups = [] + self.regular = [] def __dealloc__(self): del self.thisptr def add_parameters(self, name, dim, scale=0): cdef CParameters* p + assert(name not in self.named_params), "name already registered" p = self.thisptr.add_parameters(Dim(dim)) cdef Parameters pp = Parameters.wrap_ptr(p) self.named_params[name] = pp + self.regular.append(name) return pp - def add_lookup_parameters(self, name, dim, scale=0): - assert(isinstance(dim, tuple)) + def add_lookup_parameters(self, name, dim): + assert(isinstance(dim, tuple)), "name already registered" + assert(name not in self.named_params) cdef int nids = dim[0] rest = tuple(dim[1:]) cdef CLookupParameters* p p = self.thisptr.add_lookup_parameters(nids, Dim(rest)) cdef LookupParameters pp = LookupParameters.wrap_ptr(p) self.named_params[name] = pp + self.lookups.append(name) return pp def __getitem__(self, name): @@ -156,6 +173,11 @@ cdef class Model: def __contains__(self, name): return name in self.named_params + def parameters(self): return self.named_params.keys() + + def lookup_parameters(self): return list(self.lookups) + def regular_parameters(self): return list(self.regular) + #def load(self, fname): # self.thisptr.load(fname) @@ -214,19 +236,30 @@ cdef class ComputationGraph: self._inputs = [] return self - def parameters(self, model, name, dim=None): - cdef Parameters params + #def parameters(self, model, name, dim=None): + # cdef Parameters params + # cdef Expression result + # if name in model: + # params = model[name] + # else: + # assert(dim is not None) + # params = model.add_parameters(name, dim) + # result = Expression.from_cexpr(c_parameter(self.thisptr[0], params.thisptr)) + # return result + + def parameters(self, Parameters params): cdef Expression result - if name in model: - params = model[name] - else: - assert(dim is not None) - params = model.add_parameters(name, dim) result = Expression.from_cexpr(c_parameter(self.thisptr[0], params.thisptr)) - #result = self._expr(parameter(self.thisptr[0], params.thisptr)) - #result = Expression.wrap_ptr(&(parameter(self.thisptr[0], params.thisptr))) return result + def params_from_model(self, model): + results = {} + for name in model.regular_parameters(): + results[name] = self.parameters(model[name]) + for name in model.lookup_parameters(): + results[name] = self.lookup(model[name]) + return results + cpdef forward_scalar(self): return c_as_scalar(self.thisptr.forward()) @@ -239,6 +272,9 @@ cdef class ComputationGraph: cpdef inc_forward_vec(self): return c_as_vector(self.thisptr.incremental_forward()) + cpdef forward(self): self.thisptr.forward() + cpdef inc_forward(self): self.thisptr.incremental_forward() + cpdef backward(self): self.thisptr.backward() diff --git a/pycnn/rnnlm.py b/pycnn/rnnlm.py index 92b3af01f..a262b10ee 100644 --- a/pycnn/rnnlm.py +++ b/pycnn/rnnlm.py @@ -27,8 +27,8 @@ def BuildLMGraph(self, sent): builder.new_graph(cg) # TODO WHY? builder.start_new_sequence() - R = cg.parameters(self.m, "R") - bias = cg.parameters(self.m, "bias") + R = cg.parameters(self.m["R"]) + bias = cg.parameters(self.m["bias"]) errs = [] # will hold expressions es=[] for (cw,nw) in zip(sent,sent[1:]): @@ -58,8 +58,8 @@ def sample(self, first=1, nchars=0, stop=-1): builder.new_graph(cg) # TODO WHY? builder.start_new_sequence() - R = cg.parameters(self.m, "R") - bias = cg.parameters(self.m, "bias") + R = cg.parameters(self.m["R"]) + bias = cg.parameters(self.m["bias"]) cw = first #TODO: start symbol? while True: x_t = cg.lookup(self.m["lookup"], cw) diff --git a/pycnn/setup.py b/pycnn/setup.py index 75f3c45df..17e941e0c 100644 --- a/pycnn/setup.py +++ b/pycnn/setup.py @@ -11,7 +11,8 @@ libraries=['cnn'], # ditto library_dirs=["."], #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed - extra_compile_args=["-std=c++11"] + extra_compile_args=["-std=c++11"], + runtime_library_dirs=["$ORIGIN/./"], ) diff --git a/pycnn/xor.py b/pycnn/xor.py index f4fe608d0..eb9766344 100644 --- a/pycnn/xor.py +++ b/pycnn/xor.py @@ -15,13 +15,13 @@ m.add_parameters("V",(1, HIDDEN_SIZE)) m.add_parameters("a",1) -W = cg.parameters(m, "W") -b = cg.parameters(m, "b") -V = cg.parameters(m, "V") -a = cg.parameters(m, "a") +W = cg.parameters(m["W"]) +b = cg.parameters(m["b"]) +V = cg.parameters(m["V"]) +a = cg.parameters(m["a"]) -x = VecInputExpression(cg, [0,0]) -y = InputExpression(cg, 0) +x = cg.inputVector(2) +y = cg.inputValue(0) #print type(x) h = tanh((W*x) + b) if xsent: @@ -56,13 +56,13 @@ #print y_pred.scalar() cg = cg.renew() -W = cg.parameters(m, "W") -b = cg.parameters(m, "b") -V = cg.parameters(m, "V") -a = cg.parameters(m, "a") +W = cg.parameters(m["W"]) +b = cg.parameters(m["b"]) +V = cg.parameters(m["V"]) +a = cg.parameters(m["a"]) -x = VecInputExpression(cg, [0,0]) -y = InputExpression(cg, 0) +x = cg.inputVector(2) +y = cg.inputValue() #print type(x) h = tanh((W*x) + b) if xsent: From b7727a992126b534ba2d8a900b4f7025c0b0f248 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 12 Jul 2015 05:43:21 +0000 Subject: [PATCH 135/965] remove warnings --- CMakeLists.txt | 2 +- cnn/model.cc | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2838e7e38..99b61eedb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cnn) cmake_minimum_required(VERSION 2.8 FATAL_ERROR) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -O3 -g -DEIGEN_FAST_MATH") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -O3 -g -DEIGEN_FAST_MATH -Wno-unused-local-typedefs") enable_testing() diff --git a/cnn/model.cc b/cnn/model.cc index 682a7508c..0a2113688 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -151,7 +151,7 @@ void Model::project_weights(float radius) { ++pi; } double gg = 0; - for (unsigned i = 0; i < pi; ++i) + for (int i = 0; i < pi; ++i) gg += project_scratch[i]; cerr << "NORM: " << sqrt(gg) << endl; } @@ -171,7 +171,7 @@ float Model::gradient_l2_norm() const { return sqrt(res); #else double gg = 0; - for (unsigned i = 0; i < pi; ++i) + for (int i = 0; i < pi; ++i) gg += gradient_norm_scratch[i]; return sqrt(gg); #endif From d721f7f126737989ad4c0892bae2636057917374 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 12 Jul 2015 06:08:54 +0000 Subject: [PATCH 136/965] slightly faster compiler configuration --- CMakeLists.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 99b61eedb..b67a4ecf0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,14 @@ project(cnn) cmake_minimum_required(VERSION 2.8 FATAL_ERROR) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -O3 -g -DEIGEN_FAST_MATH -Wno-unused-local-typedefs") + +# CNN uses Eigen which exploits modern CPU architectures. To get the +# best possible performance, the following are recommended: +# 1. use very recent versions of gcc or Clang to build +# 2. try compiler options like -march=native or other architecture +# flags (the compiler does not always make the best configuration +# decisions without help) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -Wno-unused-local-typedefs") enable_testing() From c2dbfd471429b9b4cee5c427cfa752e9631bd9fc Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 12 Jul 2015 06:15:14 +0000 Subject: [PATCH 137/965] better compilation flags --- CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b67a4ecf0..ce2d6cf8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,10 +6,11 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # CNN uses Eigen which exploits modern CPU architectures. To get the # best possible performance, the following are recommended: # 1. use very recent versions of gcc or Clang to build -# 2. try compiler options like -march=native or other architecture +# 2. use very recent versions of Eigen (ideally the dev version) +# 3. try compiler options like -march=native or other architecture # flags (the compiler does not always make the best configuration # decisions without help) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -Wno-unused-local-typedefs") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funroll-loops -Wall -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -Wno-unused-local-typedefs") enable_testing() From 16782bf88e936dee1e66a1b87ddff3a1022d632b Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 12 Jul 2015 09:20:54 +0000 Subject: [PATCH 138/965] conditional compilation of fastexp --- cnn/functors.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/cnn/functors.h b/cnn/functors.h index a688f30ce..bd1095c51 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -28,7 +28,26 @@ static inline float fastexp (float p) { return fastpow2 (1.442695040f * p); } +#if 0 +#define EXPAF (8388608 / 0.6931471806f) +static inline float fastexp (float p) { + union { float f; int32_t i; } eco; + eco.i = (int32_t)(EXPAF * (p)) + 1065353216; + return eco.f; +} +#endif + +#if defined(__GNU_LIBRARY__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ < 14) +#define USE_FASTEXP +#else +#undef USE_FASTEXP +#endif + +#ifdef USE_FASTEXP #define CNN_EXPF fastexp +#else +#define CNN_EXPF expf +#endif namespace cnn { From 65e302767df15b6c6b738d540b720b0f0c1ffcc1 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 12 Jul 2015 10:26:41 +0000 Subject: [PATCH 139/965] more efficient concat --- cnn/nodes.cc | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index d72db9728..59689e16c 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -476,10 +476,8 @@ void ConcatenateColumns::forward(const vector& xs, Tensor& fx) co #else auto xi = **xs[i]; int d = xi.cols(); - for (int j = 0; j < d; ++j) { - (*fx).col(c) = xi.col(j); - c++; - } + (*fx).middleCols(c, d) = xi; + c += d; #endif } } @@ -497,10 +495,7 @@ void ConcatenateColumns::backward(const vector& xs, auto dEdx = *dEdxi; int d = dEdx.cols(); int c = static_cast(aux_mem)[i]; - for (int j = 0; j < d; ++j) { - dEdx.col(j) += (*dEdf).col(c); - ++c; - } + dEdx += (*dEdf).middleCols(c, d); #endif } From 8555d16265510a23fe6324c2e2d7434a9ee5f5bb Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 12 Jul 2015 10:57:26 +0000 Subject: [PATCH 140/965] more generic concat --- cnn/dim.h | 2 ++ cnn/nodes-common.cc | 9 ++++++--- cnn/nodes.cc | 6 +++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/cnn/dim.h b/cnn/dim.h index d343d6c4b..345e53e8a 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -1,6 +1,7 @@ #ifndef CNN_DIM_H #define CNN_DIM_H +#include #include #include #include @@ -34,6 +35,7 @@ struct Dim { inline int ndims() const { return nd; } inline int rows() const { return d[0]; } inline int cols() const { return nd > 1 ? d[1] : 1; } + inline void set(unsigned i, unsigned s) { assert(i < nd); assert(s > 0); d[i] = s; } inline int operator[](unsigned i) const { return i < nd ? d[i] : 1; } inline int size(unsigned i) const { return (*this)[i]; } inline Dim transpose() const { diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index de6401c77..46a7bc410 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -277,14 +277,17 @@ string Concatenate::as_string(const vector& arg_names) const { Dim Concatenate::dim_forward(const vector& xs) const { unsigned new_rows = 0; + Dim dr = xs[0]; for (auto& d : xs) { - if (!LooksLikeVector(d)) { + new_rows += d[0]; + dr.set(0, d[0]); + if (dr != d) { cerr << "Bad input dimensions in Concatenate: " << xs << endl; abort(); } - new_rows += d[0]; } - return Dim({new_rows}); + dr.set(0, new_rows); + return dr; } string ConcatenateColumns::as_string(const vector& arg_names) const { diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 59689e16c..d96e93edb 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -431,12 +431,12 @@ void Concatenate::forward(const vector& xs, Tensor& fx) const { for (auto x : xs) { src_row_indices[k++] = ind; auto & xi = *x; - assert(xi.d.cols() == 1); // this can be relaxed to the same everywhere const unsigned rows = xi.d.rows(); #if HAVE_CUDA + assert(xi.d.cols() == 1); // this can be relaxed to the same everywhere CUDA_CHECK(cudaMemcpyAsync(&fx.v[ind], &xi.v[0], sizeof(float) * rows, cudaMemcpyDeviceToDevice)); #else - (*fx).block(ind, 0, rows, 1) = *xi; + (*fx).middleRows(ind, rows) = *xi; #endif ind += rows; } @@ -453,7 +453,7 @@ void Concatenate::backward(const vector& xs, #if HAVE_CUDA CUBLAS_CHECK(cublasSaxpy(cublas_handle, rows, kSCALAR_ONE, &dEdf.v[begin], 1, dEdxi.v, 1)); #else - *dEdxi += (*dEdf).block(begin, 0, rows, 1); + *dEdxi += (*dEdf).middleRows(begin, rows); #endif } From 79b8f6f1336d62bad1be1c29efd44e9d7d5d2626 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 12 Jul 2015 11:41:14 +0000 Subject: [PATCH 141/965] fix bug in max --- cnn/nodes.cc | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index d96e93edb..ceb69f008 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -34,20 +34,17 @@ using namespace std; namespace cnn { size_t Max::aux_storage_size() const { - return dim.size() * sizeof(char); + return dim.size() * sizeof(float); } void Max::forward(const vector& xs, Tensor& fx) const { - float* y = fx.v; - const float* x1 = xs[0]->v; - const float* x2 = xs[0]->v; - char* one_is_bigger = static_cast(aux_mem); - int s = dim.size(); - for (int i = 0; i < s; ++i) { - bool o = x1[i] > x2[i]; - one_is_bigger[i] = o; - y[i] = o ? x1[i] : x2[i]; - } + auto y = *fx; + auto x1 = **xs[0]; + auto x2 = **xs[1]; + Tensor t(fx.d, static_cast(aux_mem)); + auto u = *t; + u = (x1.array() > x2.array()).matrix().cast(); + y = x1.cwiseMax(x2); } void Max::backward(const vector& xs, @@ -56,12 +53,11 @@ void Max::backward(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i < 2); - bool invert = (i == 1); - int s = dim.size(); - float* d = dEdxi.v; - const char* one_is_bigger = static_cast(aux_mem); - for (int i = 0; i < s; ++i) { - d[i] = one_is_bigger[i] ^ invert; + const Tensor t(dEdxi.d, static_cast(aux_mem)); + if (i == 0) { + *dEdxi += (*t).cwiseProduct(*dEdf); + } else { + *dEdxi += (Eigen::MatrixXf::Ones(dEdxi.d.rows(), dEdxi.d.cols()) - *t).cwiseProduct(*dEdf); } } From 5f96de06e5370f7700cd32cc0a4d08e96d4f0e50 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 12 Jul 2015 12:05:51 +0000 Subject: [PATCH 142/965] better max --- cnn/functors.h | 12 ++++++++++-- cnn/nodes.cc | 10 +++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/cnn/functors.h b/cnn/functors.h index bd1095c51..10e572127 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -24,11 +24,13 @@ static inline float fastpow2 (float p) { return v.f; } +#if 1 static inline float fastexp (float p) { return fastpow2 (1.442695040f * p); } - -#if 0 +#else +// Schraudolph version, but it's a bit crappy in terms of +// performance and not that much faster #define EXPAF (8388608 / 0.6931471806f) static inline float fastexp (float p) { union { float f; int32_t i; } eco; @@ -112,6 +114,12 @@ struct FTanh { } }; +struct FMaxBackwardInv { + CNN_DEVICE_FUNC inline float operator()(float u, float d) const { + return (1.f - u) * d; + } +}; + struct FTanhBackward { CNN_DEVICE_FUNC inline float operator()(float t, float d) const { return (1.f - t * t) * d; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index ceb69f008..984c4d268 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -48,16 +48,16 @@ void Max::forward(const vector& xs, Tensor& fx) const { } void Max::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { assert(i < 2); const Tensor t(dEdxi.d, static_cast(aux_mem)); if (i == 0) { *dEdxi += (*t).cwiseProduct(*dEdf); } else { - *dEdxi += (Eigen::MatrixXf::Ones(dEdxi.d.rows(), dEdxi.d.cols()) - *t).cwiseProduct(*dEdf); + *dEdxi += (*t).binaryExpr(*dEdf, FMaxBackwardInv()); } } From 1849228b0965fc8d0d65ae86d5b6887e34580f8f Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 12 Jul 2015 12:17:01 +0000 Subject: [PATCH 143/965] min --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/nodes-common.cc | 14 ++++++++++++++ cnn/nodes.cc | 28 ++++++++++++++++++++++++++++ cnn/nodes.h | 14 ++++++++++++++ 5 files changed, 58 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index fac2f98f2..2dda787f3 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -36,6 +36,7 @@ Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_ Expression log_softmax(const Expression& x, const std::vector& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } Expression softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression softsign(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression min(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression max(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression noise(const Expression& x, real stddev) { return Expression(x.pg, x.pg->add_function({x.i}, stddev)); } Expression dropout(const Expression& x, real p) { return Expression(x.pg, x.pg->add_function({x.i}, p)); } diff --git a/cnn/expr.h b/cnn/expr.h index c7c7bb2eb..453e0ab54 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -48,6 +48,7 @@ Expression log_softmax(const Expression& x); Expression log_softmax(const Expression& x, const std::vector& restriction); Expression softmax(const Expression& x); Expression softsign(const Expression& x); +Expression min(const Expression& x, const Expression& y); Expression max(const Expression& x, const Expression& y); Expression noise(const Expression& x, real stddev); Expression dropout(const Expression& x, real p); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 46a7bc410..e87d0ea59 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -17,6 +17,20 @@ inline bool LooksLikeVector(const Dim& d) { return true; } +string Min::as_string(const vector& arg_names) const { + ostringstream s; + s << "min{" << arg_names[0] << ", " << arg_names[1] << "}"; + return s.str(); +} + +Dim Min::dim_forward(const vector& xs) const { + if (xs.size() != 2 || xs[0] != xs[1]) { + cerr << "Bad arguments in Min: " << xs << endl; + abort(); + } + return xs[0]; +} + string Max::as_string(const vector& arg_names) const { ostringstream s; s << "max{" << arg_names[0] << ", " << arg_names[1] << "}"; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 984c4d268..5973c1b62 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -33,6 +33,34 @@ using namespace std; namespace cnn { +size_t Min::aux_storage_size() const { + return dim.size() * sizeof(float); +} + +void Min::forward(const vector& xs, Tensor& fx) const { + auto y = *fx; + auto x1 = **xs[0]; + auto x2 = **xs[1]; + Tensor t(fx.d, static_cast(aux_mem)); + auto u = *t; + u = (x1.array() < x2.array()).matrix().cast(); + y = x1.cwiseMin(x2); +} + +void Min::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + const Tensor t(dEdxi.d, static_cast(aux_mem)); + if (i == 0) { + *dEdxi += (*t).cwiseProduct(*dEdf); + } else { + *dEdxi += (*t).binaryExpr(*dEdf, FMaxBackwardInv()); + } +} + size_t Max::aux_storage_size() const { return dim.size() * sizeof(float); } diff --git a/cnn/nodes.h b/cnn/nodes.h index aacd71c97..e93595113 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -5,6 +5,20 @@ namespace cnn { +// y = min{x_1, x_2} +struct Min : public Node { + explicit Min(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + size_t aux_storage_size() const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = max{x_1, x_2} struct Max : public Node { explicit Max(const std::initializer_list& a) : Node(a) {} From a82dbade5072e6ca47b70d60c600298037749795 Mon Sep 17 00:00:00 2001 From: armatthews Date: Mon, 13 Jul 2015 17:45:22 -0400 Subject: [PATCH 144/965] Added RMSprop --- cnn/training.cc | 40 ++++++++++++++++++++++++++++++++++++++++ cnn/training.h | 12 ++++++++++++ 2 files changed, 52 insertions(+) diff --git a/cnn/training.cc b/cnn/training.cc index 1783a5376..e08254d83 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -186,6 +186,46 @@ void AdadeltaTrainer::update(real scale) { ++updates; } +void RmsPropTrainer::update(real scale) { + unsigned pi = 0; + if (!shadow_params_allocated) { + hg.resize(model->parameters_list().size()); + + pi = 0; + hlg.resize(model->lookup_parameters_list().size()); + for (auto p : model->lookup_parameters_list()) { + hlg[pi++].resize(p->size()); + } + + shadow_params_allocated = true; + } + + const float gscale = clip_gradients(); + pi = 0; + for (auto p : model->parameters_list()) { + real& d2 = hg[pi++]; + auto reg = (*p->values) * lambda; + real g2 = (*p->g).squaredNorm(); + d2 = rho * d2 + (1.0 - rho) * g2; + *p->values -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * *p->g + reg); + p->clear(); + } + + pi = 0; + for (auto p : model->lookup_parameters_list()) { + vector& hlgx = hlg[pi++]; + for (auto i : p->non_zero_grads) { + real& d2 = hlgx[i]; + auto reg = (*p->values[i]) * lambda; + real g2 = (*p->grads[i]).squaredNorm(); + d2 = rho * d2 + (1.0 - rho) * g2; + *p->values[i] -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * *p->grads[i] + reg); + } + p->clear(); + } + ++updates; +} + void AdamTrainer::update(real scale) { unsigned pi; if (!shadow_params_allocated) { diff --git a/cnn/training.h b/cnn/training.h index 5a6a71631..25d05c6f1 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -90,6 +90,18 @@ struct AdadeltaTrainer : public Trainer { std::vector hld; }; +struct RmsPropTrainer : public Trainer { + explicit RmsPropTrainer(Model* m, real lam = 1e-6, real e0 = 0.1, real eps = 1e-20, real rho = 0.95) : + Trainer(m, lam, e0), epsilon(eps), rho(rho), shadow_params_allocated(false) {} + void update(real scale) override; + + real epsilon; + real rho; + bool shadow_params_allocated; + std::vector hg; // History of gradients + std::vector > hlg; +}; + struct AdamTrainer : public Trainer { explicit AdamTrainer(Model* m, float lambda = 1e-6, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8) : Trainer(m, lambda, alpha), beta_1(beta_1), beta_2(beta_2), eps(eps), shadow_params_allocated(false) {} From 5b8f36759b59e28b1076ad9b43b3cd81bc3237a0 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 13 Jul 2015 23:38:47 +0000 Subject: [PATCH 145/965] make GRUs work again --- cnn/CMakeLists.txt | 2 +- cnn/gru.cc | 120 ++++++++++++++++++++++++--------------------- cnn/gru.h | 55 +++++++-------------- 3 files changed, 82 insertions(+), 95 deletions(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index a283964b4..e28e83c3d 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -8,7 +8,7 @@ set(cnn_library_SRCS exec.cc expr.cc graph.cc -# gru.cc + gru.cc init.cc lstm.cc model.cc diff --git a/cnn/gru.cc b/cnn/gru.cc index f18fe6e8e..0e1fd17fd 100644 --- a/cnn/gru.cc +++ b/cnn/gru.cc @@ -21,19 +21,19 @@ GRUBuilder::GRUBuilder(unsigned layers, unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // z - Parameters* p_x2z = model->add_parameters(Dim({hidden_dim, layer_input_dim})); - Parameters* p_h2z = model->add_parameters(Dim({hidden_dim, hidden_dim})); - Parameters* p_bz = model->add_parameters(Dim({hidden_dim})); + Parameters* p_x2z = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2z = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_bz = model->add_parameters({hidden_dim}); // r - Parameters* p_x2r = model->add_parameters(Dim({hidden_dim, layer_input_dim})); - Parameters* p_h2r = model->add_parameters(Dim({hidden_dim, hidden_dim})); - Parameters* p_br = model->add_parameters(Dim({hidden_dim})); + Parameters* p_x2r = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2r = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_br = model->add_parameters({hidden_dim}); // h - Parameters* p_x2h = model->add_parameters(Dim({hidden_dim, layer_input_dim})); - Parameters* p_h2h = model->add_parameters(Dim({hidden_dim, hidden_dim})); - Parameters* p_bh = model->add_parameters(Dim({hidden_dim})); + Parameters* p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2h = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_bh = model->add_parameters({hidden_dim}); layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next vector ps = {p_x2z, p_h2z, p_bz, p_x2r, p_h2r, p_br, p_x2h, p_h2h, p_bh}; @@ -41,79 +41,85 @@ GRUBuilder::GRUBuilder(unsigned layers, } // layers } -void GRUBuilder::new_graph(ComputationGraph* hg) { - sm.transition(RNNOp::new_graph); +void GRUBuilder::new_graph_impl(ComputationGraph& cg) { param_vars.clear(); - for (unsigned i = 0; i < layers; ++i) { - string layer = to_string(i); auto& p = params[i]; // z - VariableIndex i_x2z = hg->add_parameters(p[X2Z]); - VariableIndex i_h2z = hg->add_parameters(p[H2Z]); - VariableIndex i_bz = hg->add_parameters(p[BZ]); + Expression x2z = parameter(cg,p[X2Z]); + Expression h2z = parameter(cg,p[H2Z]); + Expression bz = parameter(cg,p[BZ]); // r - VariableIndex i_x2r = hg->add_parameters(p[X2R]); - VariableIndex i_h2r = hg->add_parameters(p[H2R]); - VariableIndex i_br = hg->add_parameters(p[BR]); + Expression x2r = parameter(cg,p[X2R]); + Expression h2r = parameter(cg,p[H2R]); + Expression br = parameter(cg,p[BR]); // h - VariableIndex i_x2h = hg->add_parameters(p[X2H]); - VariableIndex i_h2h = hg->add_parameters(p[H2H]); - VariableIndex i_bh = hg->add_parameters(p[BH]); + Expression x2h = parameter(cg,p[X2H]); + Expression h2h = parameter(cg,p[H2H]); + Expression bh = parameter(cg,p[BH]); - vector vars = {i_x2z, i_h2z, i_bz, i_x2r, i_h2r, i_br, i_x2h, i_h2h, i_bh}; + vector vars = {x2z, h2z, bz, x2r, h2r, br, x2h, h2h, bh}; param_vars.push_back(vars); } } -void GRUBuilder::start_new_sequence(ComputationGraph* hg, - vector h_0) { - sm.transition(RNNOp::start_new_sequence); +void GRUBuilder::start_new_sequence_impl(const std::vector& h_0) { h.clear(); h0 = h_0; - if (h0.empty()) { - VariableIndex zero_input = hg->add_input(Dim({hidden_dim}), &zeros); - if (h0.empty()) { h0 = vector(layers, zero_input); } + if (!h0.empty()) { + assert (h0.size() == layers); } - assert (h0.size() == layers); } -VariableIndex GRUBuilder::add_input(VariableIndex x, ComputationGraph* hg) { - sm.transition(RNNOp::add_input); +Expression GRUBuilder::add_input_impl(const Expression& x) { + const bool has_initial_state = (h0.size() > 0); const unsigned t = h.size(); - h.push_back(vector(layers)); - vector& ht = h.back(); - VariableIndex in = x; + h.push_back(vector(layers)); + vector& ht = h.back(); + Expression in = x; for (unsigned i = 0; i < layers; ++i) { - const vector& vars = param_vars[i]; - VariableIndex i_h_tm1; - if (t == 0) { - // intial value for h at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_tm1 = h0[i]; - } else { // t > 0 - i_h_tm1 = h[t-1][i]; - } + const vector& vars = param_vars[i]; + Expression h_tm1; + // prev_zero means that h_tm1 should be treated as 0 + bool prev_zero = false; + if (t > 0 || has_initial_state) { + h_tm1 = (t == 0) ? h0[i] : h[t-1][i]; + } else { prev_zero = true; } // update gate - VariableIndex i_zt = hg->add_function({vars[BZ], vars[X2Z], in, vars[H2Z], i_h_tm1}); - i_zt = hg->add_function({i_zt}); + Expression zt; + if (prev_zero) + zt = affine_transform({vars[BZ], vars[X2Z], in}); + else + zt = affine_transform({vars[BZ], vars[X2Z], in, vars[H2Z], h_tm1}); + zt = logistic(zt); // forget - VariableIndex i_ft = hg->add_function({i_zt}, 1.f); + Expression ft = 1.f - zt; // reset gate - VariableIndex i_rt = hg->add_function({vars[BR], vars[X2R], in, vars[H2R], i_h_tm1}); - i_rt = hg->add_function({i_rt}); + Expression rt; + if (prev_zero) + rt = affine_transform({vars[BR], vars[X2R], in}); + else + rt = affine_transform({vars[BR], vars[X2R], in, vars[H2R], h_tm1}); + rt = logistic(rt); + // candidate activation - VariableIndex i_ght = hg->add_function({i_rt, i_h_tm1}); - VariableIndex i_ct = hg->add_function({vars[BH], vars[X2H], in, vars[H2H], i_ght}); - i_ct = hg->add_function({i_ct}); - - // new hidden state - VariableIndex i_nwt = hg->add_function({i_zt, i_ct}); - VariableIndex i_crt = hg->add_function({i_ft, i_h_tm1}); - in = ht[i] = hg->add_function({i_crt, i_nwt}); + Expression ct; + if (prev_zero) { + ct = affine_transform({vars[BH], vars[X2H], in}); + ct = tanh(ct); + Expression nwt = cwise_multiply(zt, ct); + in = ht[i] = nwt; + } else { + Expression ght = cwise_multiply(rt, h_tm1); + ct = affine_transform({vars[BH], vars[X2H], in, vars[H2H], ght}); + ct = tanh(ct); + Expression nwt = cwise_multiply(zt, ct); + Expression crt = cwise_multiply(ft, h_tm1); + in = ht[i] = crt + nwt; + } } return ht.back(); } diff --git a/cnn/gru.h b/cnn/gru.h index 499dbe2ea..53f345ee0 100644 --- a/cnn/gru.h +++ b/cnn/gru.h @@ -2,59 +2,40 @@ #define CNN_GRU_H_ #include "cnn/cnn.h" -#include "cnn/rnn-state-machine.h" +#include "cnn/rnn.h" namespace cnn { class Model; -struct GRUBuilder { - GRUBuilder() {} +struct GRUBuilder : public RNNBuilder { + GRUBuilder() = default; explicit GRUBuilder(unsigned layers, - unsigned input_dim, - unsigned hidden_dim, - Model* model); - - // call this to reset the builder when you are working with a newly - // created ComputationGraph object - void new_graph(ComputationGraph* hg); - - // Start new sequence in given ComputationGraph with initial c0 and h0 - // call after add_parameter edges but before add input, - // as well as whenever a new sequence is to be added to the graph - void start_new_sequence(ComputationGraph* hg, - std::vector h_0={}); - - // add another timestep by reading in the variable x - // return the hidden representation of the deepest layer - VariableIndex add_input(VariableIndex x, ComputationGraph* hg); - - // rewind the last timestep - this DOES NOT remove the variables - // from the computation graph, it just means the next time step will - // see a different previous state. You can remind as many times as - // you want. - void rewind_one_step() { - h.pop_back(); - } - - // returns node index (variable) of most recent output - VariableIndex back() const { return h.back().back(); } - - // access memory/hidden state contents - const std::vector& final_h() const { return h.back(); } + unsigned input_dim, + unsigned hidden_dim, + Model* model); + std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } + std::vector final_s() const { return final_h(); } + void rewind_one_step() { h.pop_back(); } + Expression back() const { return h.back().back(); } + + protected: + void new_graph_impl(ComputationGraph& cg) override; + void start_new_sequence_impl(const std::vector& h0) override; + Expression add_input_impl(const Expression& x) override; // first index is layer, then ... std::vector> params; // first index is layer, then ... - std::vector> param_vars; + std::vector> param_vars; // first index is time, second is layer - std::vector> h; + std::vector> h; // initial values of h at each layer // - default to zero matrix input - std::vector h0; + std::vector h0; unsigned hidden_dim; unsigned layers; From 5aa73db0399a9d43250403abd987c7b800a48bd0 Mon Sep 17 00:00:00 2001 From: Trevor Cohn Date: Wed, 15 Jul 2015 00:09:31 -0700 Subject: [PATCH 146/965] added operator+(expression, const) --- cnn/expr.cc | 3 +++ cnn/expr.h | 4 +++- cnn/functors.h | 8 ++++++++ cnn/nodes-common.cc | 11 +++++++++++ cnn/nodes.cc | 14 ++++++++++++++ cnn/nodes.h | 15 +++++++++++++++ 6 files changed, 54 insertions(+), 1 deletion(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index 43bc9f9db..309606be8 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -18,8 +18,11 @@ Expression const_lookup(ComputationGraph& g, LookupParameters* p, const unsigned Expression operator-(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression operator+(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } +Expression operator+(real x, const Expression& y) { return Expression(y.pg, y.pg->add_function({y.i}, x)); } +Expression operator+(const Expression& x, real y) { return y+x; } Expression operator-(const Expression& x, const Expression& y) { return x+(-y); } Expression operator-(real x, const Expression& y) { return Expression(y.pg, y.pg->add_function({y.i}, x)); } +Expression operator-(const Expression& x, real y) { return -(y-x); } Expression operator*(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression operator*(const Expression& x, float y) { return Expression(x.pg, x.pg->add_function({x.i}, y)); } Expression cdiv(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index a8a07f225..2cfcb3b75 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -26,9 +26,11 @@ Expression const_lookup(ComputationGraph& g, LookupParameters* p, const unsigned Expression operator-(const Expression& x); Expression operator+(const Expression& x, const Expression& y); -//Expression operator+(const Expression& x, real y); +Expression operator+(const Expression& x, real y); +Expression operator+(real x, const Expression& y); Expression operator-(const Expression& x, const Expression& y); Expression operator-(real x, const Expression& y); +Expression operator-(const Expression& x, real y); Expression operator*(const Expression& x, const Expression& y); Expression operator*(const Expression& x, float y); inline Expression operator*(float y, const Expression& x) { return x * y; } diff --git a/cnn/functors.h b/cnn/functors.h index a688f30ce..7b222a51b 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -66,6 +66,14 @@ struct FQuotient { } }; +struct FConstantPlus { + FConstantPlus(float c) : c(c) {} + CNN_DEVICE_FUNC inline float operator()(float x) const { + return c + x; + } + float c; +}; + struct FConstantMinus { FConstantMinus(float c) : c(c) {} CNN_DEVICE_FUNC inline float operator()(float x) const { diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index f9d1fdd0d..7edb94fa8 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -159,6 +159,17 @@ Dim Dropout::dim_forward(const vector& xs) const { return xs[0]; } +string ConstantPlusX::as_string(const vector& arg_names) const { + ostringstream s; + s << c << " + " << arg_names[0]; + return s.str(); +} + +Dim ConstantPlusX::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string ConstantMinusX::as_string(const vector& arg_names) const { ostringstream s; s << c << " - " << arg_names[0]; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 3bd8978d6..e5c1406d8 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -243,6 +243,20 @@ void Dropout::backward(const vector& xs, (*dEdxi) += (*dEdf).cwiseProduct(*m); }; +void ConstantPlusX::forward(const vector& xs, Tensor& fx) const { + auto x = **xs[0]; + *fx = x.unaryExpr(FConstantPlus(c)); +} + +void ConstantPlusX::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + *dEdxi += *dEdf; +}; + + void ConstantMinusX::forward(const vector& xs, Tensor& fx) const { #if HAVE_CUDA gpu::vconstant_minusx(fx.d.size(), c, xs[0]->v, fx.v); diff --git a/cnn/nodes.h b/cnn/nodes.h index 06d5e04af..4e3c754bd 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -153,6 +153,21 @@ struct Dropout : public Node { real p; }; +// y = c + x_1 +// (c is a vector or matrix of the constant, usually 1, but can be configured) +struct ConstantPlusX : public Node { + explicit ConstantPlusX(const std::initializer_list& a, real o) : Node(a), c(o) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; + real c; +}; + // y = c - x_1 // (c is a vector or matrix of the constant, usually 1, but can be configured) struct ConstantMinusX : public Node { From 0d97936e962a50883338b8c91f777b4d5200e71c Mon Sep 17 00:00:00 2001 From: yogo Date: Wed, 15 Jul 2015 13:04:03 +0300 Subject: [PATCH 147/965] setup.py update --- pycnn/setup.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/pycnn/setup.py b/pycnn/setup.py index 75f3c45df..6997f4ed6 100644 --- a/pycnn/setup.py +++ b/pycnn/setup.py @@ -2,12 +2,19 @@ from distutils.extension import Extension from Cython.Distutils import build_ext + +# Remove the "-Wstrict-prototypes" compiler option, which isn't valid for C++. +import distutils.sysconfig +cfg_vars = distutils.sysconfig.get_config_vars() +if "CFLAGS" in cfg_vars: + cfg_vars["CFLAGS"] = cfg_vars["CFLAGS"].replace("-Wstrict-prototypes", "") + ext = Extension( "pycnn", # name of extension ["pycnn.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source - include_dirs=["/home/yogo/Vork/Research/cnn/cnn/", - "/home/yogo/Vork/Research/cnn/eigen/"], + include_dirs=["../../cnn/", + "../../eigen/"], libraries=['cnn'], # ditto library_dirs=["."], #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed From d26f29cc6cfc30069d28276fd2698ea8e0951e65 Mon Sep 17 00:00:00 2001 From: armatthews Date: Wed, 15 Jul 2015 16:43:39 -0400 Subject: [PATCH 148/965] Allow initializer lists wherever a vector of Expressions is possible --- cnn/expr.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cnn/expr.h b/cnn/expr.h index a8a07f225..6186f2ed8 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -91,15 +91,19 @@ namespace detail { template inline Expression sum(const T& xs) { return detail::f(xs); } +inline Expression sum(const std::initializer_list& xs) { return detail::f(xs); } template inline Expression average(const T& xs) { return detail::f(xs); } +inline Expression average(const std::initializer_list& xs) { return detail::f(xs); } template inline Expression concatenate_cols(const T& xs) { return detail::f(xs); } +inline Expression concatenate_cols(const std::initializer_list& xs) { return detail::f(xs); } template inline Expression concatenate(const T& xs) { return detail::f(xs); } +inline Expression concatenate(const std::initializer_list& xs) { return detail::f(xs); } template inline Expression affine_transform(const T& xs) { return detail::f(xs); } From 745f652c11e75f019d11b706e86fa55edd4e0f54 Mon Sep 17 00:00:00 2001 From: Trevor Cohn Date: Wed, 15 Jul 2015 15:59:04 -0700 Subject: [PATCH 149/965] fixed crazy memory bug from non-32bit aligned scalars --- cnn/cnn.h | 4 ++-- cnn/exec.cc | 11 ++++++----- cnn/init.cc | 8 ++++---- cnn/nodes.cc | 1 + examples/CMakeLists.txt | 2 +- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/cnn/cnn.h b/cnn/cnn.h index 508a0b690..9f98eea8c 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -24,8 +24,8 @@ namespace cnn { -extern AlignedMemoryPool<5>* fxs; -extern AlignedMemoryPool<5>* dEdfs; +extern AlignedMemoryPool<6>* fxs; +extern AlignedMemoryPool<6>* dEdfs; extern float* kSCALAR_MINUSONE; extern float* kSCALAR_ONE; extern float* kSCALAR_ZERO; diff --git a/cnn/exec.cc b/cnn/exec.cc index 5180c9a91..1645ef6bc 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -70,10 +70,11 @@ void SimpleExecutionEngine::backward() { cerr << "backward() called on non-scalar node.\n"; abort(); } - const unsigned node_max_index = cg.nodes.size(); - ndEdfs.resize(node_max_index); + + const unsigned num_nodes = cg.nodes.size(); + ndEdfs.resize(num_nodes); dEdfs->free(); - for (unsigned i = 0; i < node_max_index; ++i) { + for (unsigned i = 0; i < num_nodes; ++i) { const auto dim = nfxs[i].d; ndEdfs[i].d = dim; ndEdfs[i].v = static_cast(dEdfs->allocate(dim.size() * sizeof(float))); @@ -84,7 +85,6 @@ void SimpleExecutionEngine::backward() { ndEdfs.back().v = kSCALAR_ONE; // here we find constant paths to avoid doing extra work - const unsigned num_nodes = cg.nodes.size(); vector needs_derivative(num_nodes, false); for (auto i : cg.parameter_nodes) needs_derivative[i] = true; @@ -108,8 +108,9 @@ void SimpleExecutionEngine::backward() { } ai = 0; for (VariableIndex arg : node->args) { - if (needs_derivative[arg]) + if (needs_derivative[arg]) { node->backward(xs, nfxs[i], ndEdfs[i], ai, ndEdfs[arg]); + } ++ai; } } diff --git a/cnn/init.cc b/cnn/init.cc index 5bb1c7acb..ccfdf6e33 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -15,7 +15,7 @@ using namespace std; namespace cnn { -#define ALIGN 5 +#define ALIGN 6 AlignedMemoryPool* fxs = nullptr; AlignedMemoryPool* dEdfs = nullptr; mt19937* rndeng = nullptr; @@ -25,11 +25,11 @@ void Initialize(int& argc, char**& argv) { #if HAVE_CUDA Initialize_GPU(argc, argv); #else - kSCALAR_MINUSONE = new float; + kSCALAR_MINUSONE = (float*) cnn_mm_malloc(1, 32); *kSCALAR_MINUSONE = -1; - kSCALAR_ONE = new float; + kSCALAR_ONE = (float*) cnn_mm_malloc(1, 32); *kSCALAR_ONE = 1; - kSCALAR_ZERO = new float; + kSCALAR_ZERO = (float*) cnn_mm_malloc(1, 32); *kSCALAR_ZERO = 0; #endif random_device rd; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index c9764ce6a..1c099d54b 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -363,6 +363,7 @@ void Sum::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { + #if HAVE_CUDA CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); #else diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 698d306b7..059d41a9d 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm nlm textcat rnnlm2 skiprnnlm) +foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm nlm textcat rnnlm2 skiprnnlm attentional biattentional) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) From 9bb015a97755e32914165dc084b821cbd2b7cd46 Mon Sep 17 00:00:00 2001 From: armatthews Date: Thu, 16 Jul 2015 20:09:24 -0400 Subject: [PATCH 150/965] Added ability to check if a word is in a dictionary --- cnn/dict.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cnn/dict.h b/cnn/dict.h index 9c93904ff..a180c0b87 100644 --- a/cnn/dict.h +++ b/cnn/dict.h @@ -25,6 +25,10 @@ class Dict { inline unsigned size() const { return words_.size(); } + inline bool Contains(const std::string& words) { + return !(d_.find(words) == d_.end()); + } + void Freeze() { frozen = true; } inline int Convert(const std::string& word) { From a8be157f3bab042a4a58013044a7b73cea63bd73 Mon Sep 17 00:00:00 2001 From: Gaurav Kumar Date: Thu, 16 Jul 2015 18:44:27 -0700 Subject: [PATCH 151/965] Fixed bug in binarylogloss --- cnn/functors.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cnn/functors.h b/cnn/functors.h index 15fff09f3..0aef2786c 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -270,7 +270,15 @@ struct FL2SGDUpdate { struct FBinaryLogLoss { CNN_DEVICE_FUNC inline float operator()(float x, float x_true) const { - return x_true > 0.f ? -x_true * log(x) : (1.f - x_true) * log1p(-x); + if (x_true == 0.f) { + return -1.f * x_true * log(x); + } + else if (x_true == 1.f) { + return -1.f * (1.f - x_true) * log1p(-x); + } + else { + return -1.f * (x_true * log(x) + (1.f - x_true) * log1p(-x)); + } } }; From 9aeabf74ddeea3b26148dcb09218eeae5abb6f93 Mon Sep 17 00:00:00 2001 From: Gaurav Kumar Date: Thu, 16 Jul 2015 18:57:15 -0700 Subject: [PATCH 152/965] Fixed bug in binarylogloss --- cnn/functors.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/functors.h b/cnn/functors.h index 0aef2786c..6f9138afe 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -270,10 +270,10 @@ struct FL2SGDUpdate { struct FBinaryLogLoss { CNN_DEVICE_FUNC inline float operator()(float x, float x_true) const { - if (x_true == 0.f) { + if (x_true == 1.f) { return -1.f * x_true * log(x); } - else if (x_true == 1.f) { + else if (x_true == 0.f) { return -1.f * (1.f - x_true) * log1p(-x); } else { From e96712a99f888f5a36e223ef9a96b4a0932bd699 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 17 Jul 2015 09:10:20 -0700 Subject: [PATCH 153/965] remove dead files --- examples/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 059d41a9d..dc9ccdd61 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm nlm textcat rnnlm2 skiprnnlm attentional biattentional) +foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm nlm textcat rnnlm2) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) From 293c11ca123656759717f0ab0b14d43908b45d9b Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 17 Jul 2015 12:48:42 -0700 Subject: [PATCH 154/965] fix for possible failure with vectors --- cnn/dim.h | 1 + cnn/nodes-common.cc | 10 ++++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cnn/dim.h b/cnn/dim.h index 345e53e8a..8d50207d6 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -32,6 +32,7 @@ struct Dim { for (unsigned i = 0; i < nd; ++i) p += d[i]; return p; } + inline void resize(unsigned i) { nd = i; } inline int ndims() const { return nd; } inline int rows() const { return d[0]; } inline int cols() const { return nd > 1 ? d[1] : 1; } diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 5b396d29e..18d25b3a3 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -303,10 +303,12 @@ string Concatenate::as_string(const vector& arg_names) const { Dim Concatenate::dim_forward(const vector& xs) const { unsigned new_rows = 0; Dim dr = xs[0]; - for (auto& d : xs) { - new_rows += d[0]; - dr.set(0, d[0]); - if (dr != d) { + if (LooksLikeVector(dr)) dr.resize(1); + for (auto c : xs) { + if (LooksLikeVector(c)) c.resize(1); + new_rows += c[0]; + dr.set(0, c[0]); + if (dr != c) { cerr << "Bad input dimensions in Concatenate: " << xs << endl; abort(); } From 484648ebae32c8b689bed45d4e7ede475e5b9217 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Sun, 19 Jul 2015 00:39:54 +0300 Subject: [PATCH 155/965] save and load --- cnn/CMakeLists.txt | 1 + cnn/model.cc | 18 ++++++++++++++++++ cnn/model.h | 5 +++++ pycnn/pycnn.pxd | 3 +++ pycnn/pycnn.pyx | 8 ++++---- pycnn/rnnlm.py | 44 +++++++++----------------------------------- 6 files changed, 40 insertions(+), 39 deletions(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 6cf38e5a4..70aa6989a 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -83,6 +83,7 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) # actual target: add_library(cnn SHARED ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) +target_link_libraries(cnn ${LIBS}) #add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) diff --git a/cnn/model.cc b/cnn/model.cc index 682a7508c..18002a7f2 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -6,6 +6,11 @@ #include #include +#include +#include +#include +#include + #define CNN_ALIGN 256 #if HAVE_CUDA #include "cnn/gpu-ops.h" @@ -191,4 +196,17 @@ LookupParameters* Model::add_lookup_parameters(unsigned n, const Dim& d) { return p; } +void save_cnn_model(std::string filename, Model* model) { + std::ofstream out(filename); + boost::archive::text_oarchive oa(out); + oa << (*model); +}; + +void load_cnn_model(std::string filename, Model* model) { + std::ifstream in(filename); + boost::archive::text_iarchive ia(in); + ia >> (*model); +}; + + } // namespace cnn diff --git a/cnn/model.h b/cnn/model.h index 095d20334..26e3b3400 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -3,6 +3,8 @@ #include #include +#include + #include #include @@ -147,6 +149,9 @@ class Model { mutable float* gradient_norm_scratch; }; +void save_cnn_model(std::string filename, Model* model); +void load_cnn_model(std::string filename, Model* model); + } // namespace cnn #endif diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index ceba0674b..fd31fcaa3 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -62,6 +62,9 @@ cdef extern from "cnn/model.h" namespace "cnn": #void save(string fname) #void load(string fname) + void load_cnn_model "cnn::load_cnn_model" (string filename, CModel *model) + void save_cnn_model "cnn::save_cnn_model" (string filename, CModel *model) + cdef extern from "cnn/cnn.h" namespace "cnn": ctypedef unsigned VariableIndex cdef cppclass CComputationGraph "cnn::ComputationGraph": diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index e8cedf383..9228a60a0 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -178,11 +178,11 @@ cdef class Model: def lookup_parameters(self): return list(self.lookups) def regular_parameters(self): return list(self.regular) - #def load(self, fname): - # self.thisptr.load(fname) + def save(self, string fname): + save_cnn_model(fname, self.thisptr) - #def save(self, fname): - # self.thisptr.save(fname) + def load(self, string fname): + load_cnn_model(fname, self.thisptr) # }}} diff --git a/pycnn/rnnlm.py b/pycnn/rnnlm.py index a262b10ee..06f5b5b43 100644 --- a/pycnn/rnnlm.py +++ b/pycnn/rnnlm.py @@ -1,9 +1,10 @@ from pycnn import * +import time import random LAYERS = 2 -INPUT_DIM = 5 #256 -HIDDEN_DIM = 50 #1024 +INPUT_DIM = 256 #256 +HIDDEN_DIM = 1024 #1024 VOCAB_SIZE = 0 from collections import defaultdict @@ -34,46 +35,30 @@ def BuildLMGraph(self, sent): for (cw,nw) in zip(sent,sent[1:]): # assume word is already a word-id x_t = cg.lookup(self.m["lookup"], int(cw)) - y_t = builder.add_input(x_t) # TODO what does this do exactly? + y_t = builder.add_input(x_t) r_t = bias + (R * y_t) - #f = softmax(r_t) - #vec = cg.inc_forward_vec() err = pickneglogsoftmax(r_t, int(nw)) - #e = cg.forward_scalar() - #print >> sys.stdout, " ",e, - #es.append(e) - #print >> sys.stdout, cg.inc_forward_scalar() errs.append(err) - #print >> sys.stdout, vec - #print >> sys.stdout, nw - #print >> sys.stdout, vec[nw] nerr = esum(errs) - #print >> sys.stdout, sum(es), cg.forward_scalar() return nerr def sample(self, first=1, nchars=0, stop=-1): res = [first] cg = self.cg.renew() builder = self.builder - builder.new_graph(cg) # TODO WHY? + builder.new_graph(cg) builder.start_new_sequence() R = cg.parameters(self.m["R"]) bias = cg.parameters(self.m["bias"]) - cw = first #TODO: start symbol? + cw = first while True: x_t = cg.lookup(self.m["lookup"], cw) - y_t = builder.add_input(x_t) # TODO what does this do exactly? - - #s = concatenate(builder.final_h()) - #sv = cg.inc_forward_vec() - #print len(sv) - + y_t = builder.add_input(x_t) r_t = bias + (R * y_t) ydist = softmax(r_t) dist = cg.inc_forward_vec() rnd = random.random() - assert(0 <= rnd <= 1.0) for i,p in enumerate(dist): rnd -= p if rnd <= 0: break @@ -85,7 +70,6 @@ def sample(self, first=1, nchars=0, stop=-1): if __name__ == '__main__': train = util.CharsCorpusReader(sys.argv[1],begin="") - #train = util.CorpusReader(sys.argv[1]) vocab = util.Vocab.from_corpus(train) VOCAB_SIZE = vocab.size() @@ -98,37 +82,27 @@ def sample(self, first=1, nchars=0, stop=-1): train = list(train) - #fout = file("a","w") chars = loss = 0.0 for ITER in xrange(100): random.shuffle(train) for i,sent in enumerate(train): + _start = time.time() if i % 50 == 0: sgd.status() if chars > 0: print loss / chars, - #samp = lm.sample(first=vocab.w2i[""],stop=vocab.w2i[""]) for _ in xrange(1): samp = lm.sample(first=vocab.w2i[""],stop=vocab.w2i["\n"]) print "".join([vocab.i2w[c] for c in samp]).strip() loss = 0.0 chars = 0.0 - #if len(sent) < 4: continue chars += len(sent)-1 - #print sent isent = [vocab.w2i[w] for w in sent] errs = lm.BuildLMGraph(isent) - #st = str(errs) - #fout.write(str(errs)) - #cg.PrintGraphviz() loss += cg.inc_forward_scalar() - #loss += cg.forward_scalar() cg.backward() sgd.update(1.0) + print "TM:",(time.time() - _start)/len(sent) print "ITER",ITER,loss sgd.status() sgd.update_epoch(1.0) - if ITER % 1 == 0: - pass - #samp = lm.sample(first=vocab.w2i[""],stop=vocab.w2i[""]) - #print " ".join([vocab.i2w[c] for c in samp]) From 5616856f2a7b5dca50ddae588b82e1657fcc869c Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Mon, 20 Jul 2015 17:17:09 +0300 Subject: [PATCH 156/965] size --- pycnn/rnnlm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pycnn/rnnlm.py b/pycnn/rnnlm.py index 06f5b5b43..9802dfd18 100644 --- a/pycnn/rnnlm.py +++ b/pycnn/rnnlm.py @@ -3,8 +3,8 @@ import random LAYERS = 2 -INPUT_DIM = 256 #256 -HIDDEN_DIM = 1024 #1024 +INPUT_DIM = 50 #256 +HIDDEN_DIM = 50 #1024 VOCAB_SIZE = 0 from collections import defaultdict From c592a8f23537f6655a247b916fa62b9e127b257f Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Mon, 20 Jul 2015 19:23:09 +0300 Subject: [PATCH 157/965] cg as singleton, freshness guards. --- pycnn/pycnn.pyx | 213 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 147 insertions(+), 66 deletions(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 9228a60a0..8e7d2f7b1 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -9,7 +9,6 @@ import numpy as np # WORKS, but need to be unified? for example, why "pick" takes a pointer to int, and "squared_distance" takes an expression? # - load embeddings file # - load/save models -# - make ComputationGraph a singleton??? # - NOTE: why do we need to filter short sentences in rnnlm.py or crash?? # TODO: @@ -37,6 +36,7 @@ cdef init(): pycnn.Initialize(argc,argv) init() + cdef CDim Dim(dim): """ dim: either a tuple or an int @@ -221,12 +221,25 @@ cdef class FloatVectorValue: # }}} +cdef int SECRET = 923148 +cdef ComputationGraph _cg = ComputationGraph(SECRET) + +def cg_version(): return _cg._cg_version +def renew_cg(): return _cg.renew() + +cpdef ComputationGraph cg(): + global _cg + return _cg + cdef class ComputationGraph: cdef CComputationGraph *thisptr, cdef list _inputs - def __cinit__(self): + cdef int _cg_version + def __cinit__(self, int guard=0): + if guard != SECRET: raise RuntimeError("Do not instantiate ComputationGraph directly. Use pycnn.cg()") self.thisptr = new CComputationGraph() self._inputs = [] + self._cg_version = 0 def __dealloc__(self): del self.thisptr @@ -234,8 +247,11 @@ cdef class ComputationGraph: del self.thisptr self.thisptr = new CComputationGraph() self._inputs = [] + self._cg_version += 1 return self + cpdef version(self): return self._cg_version + #def parameters(self, model, name, dim=None): # cdef Parameters params # cdef Expression result @@ -249,7 +265,7 @@ cdef class ComputationGraph: def parameters(self, Parameters params): cdef Expression result - result = Expression.from_cexpr(c_parameter(self.thisptr[0], params.thisptr)) + result = Expression.from_cexpr(self._cg_version, c_parameter(self.thisptr[0], params.thisptr)) return result def params_from_model(self, model): @@ -313,25 +329,30 @@ cdef class ComputationGraph: # }}} #{{{ Expressions +cdef ensure_freshness(Expression a): + if a.cg_version != _cg.version(): raise ValueError("Attempt to use a stale expression.") -cdef _add(Expression a, Expression b): return Expression.from_cexpr(c_op_add(a.c(), b.c())) -cdef _mul(Expression a, Expression b): return Expression.from_cexpr(c_op_mul(a.c(), b.c())) -cdef _neg(Expression a): return Expression.from_cexpr(c_op_neg(a.c())) -cdef _scalarsub(float a, Expression b): return Expression.from_cexpr(c_op_scalar_sub(a, b.c())) -cdef _cmul(Expression a, float b): return Expression.from_cexpr(c_op_scalar_mul(a.c(), b)) +cdef _add(Expression a, Expression b): ensure_freshness(b); return Expression.from_cexpr(a.cg_version, c_op_add(a.c(), b.c())) +cdef _mul(Expression a, Expression b): ensure_freshness(b); return Expression.from_cexpr(a.cg_version, c_op_mul(a.c(), b.c())) +cdef _neg(Expression a): return Expression.from_cexpr(a.cg_version, c_op_neg(a.c())) +cdef _scalarsub(float a, Expression b): ensure_freshness(b); return Expression.from_cexpr(b.cg_version, c_op_scalar_sub(a, b.c())) +cdef _cmul(Expression a, float b): return Expression.from_cexpr(a.cg_version, c_op_scalar_mul(a.c(), b)) cdef class Expression: #{{{ #cdef CComputationGraph *cg cdef CComputationGraph* cg cdef VariableIndex vindex + cdef int cg_version def __cinit__(self): self.cg = NULL self.vindex = 0 @staticmethod - cdef Expression from_cexpr(CExpression cexpr): + cdef Expression from_cexpr(int cgv, CExpression cexpr): + if cgv != _cg._cg_version: raise ValueError("Attempt to use a stale expression, from a previous Computation Graph.") self = Expression() self.cg = cexpr.pg self.vindex = cexpr.i + self.cg_version = cgv return self cdef CExpression c(self): return CExpression(self.cg, self.vindex) @@ -339,15 +360,18 @@ cdef class Expression: #{{{ def __repr__(self): return str(self) def __str__(self): - return "exprssion %s" % self.vindex + return "exprssion %s/%s" % (self.vindex, self.cg_version) cpdef scalar_value(self): + if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") return c_as_scalar(self.cg.get_value(self.vindex)) cpdef vec_value(self): + if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") return c_as_vector(self.cg.get_value(self.vindex)) cpdef npvalue(self): + if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") cdef CTensor t cdef CDim dim t = self.cg.get_value(self.vindex) @@ -358,6 +382,7 @@ cdef class Expression: #{{{ return arr cpdef value(self): + if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") cdef CTensor t t = self.cg.get_value(self.vindex) if t.d.ndims() == 2: @@ -384,8 +409,10 @@ cdef class Expression: #{{{ else: raise NotImplementedError() #}}} -cpdef Expression parameter(ComputationGraph g, Parameters p): - return Expression.from_cexpr(c_parameter(g.thisptr[0], p.thisptr)) +cdef Expression _parameter(ComputationGraph g, Parameters p): + return Expression.from_cexpr(g.version(), c_parameter(g.thisptr[0], p.thisptr)) + +def parameter(Parameters p): return _parameter(_cg, p) # {{{ Mutable Expressions # These depend values that can be set by the caller @@ -395,6 +422,7 @@ cdef class _inputExpression(Expression): def __cinit__(self, ComputationGraph g, float s): self.val = FloatValue(s) self.cg = g.thisptr + self.cg_version = g.version() cdef CExpression e e = c_input(self.cg[0], self.val.addr()) self.vindex = e.i @@ -403,12 +431,16 @@ cdef class _inputExpression(Expression): self.cg.invalidate() self.val.set(s) +def scalarInput(float s): + return _inputExpression(_cg, s) + cdef class _vecInputExpression(Expression): cdef FloatVectorValue val def __cinit__(self, ComputationGraph g, vector[float] val, dim=None): self.val = FloatVectorValue(val) if dim is None: dim = self.val.size() self.cg = g.thisptr + self.cg_version = g.version() cdef CExpression e e = c_input(self.cg[0], Dim(dim), self.val.addr()) self.vindex = e.i @@ -417,11 +449,15 @@ cdef class _vecInputExpression(Expression): self.cg.invalidate() self.val.set(data) +def vecInput(vector[float] val, dim=None): + return _vecInputExpression(_cg, val, dim) + cdef class _lookupExpression(Expression): cdef UnsignedValue val def __cinit__(self, ComputationGraph g, LookupParameters p, unsigned index=0, update=True): self.val = UnsignedValue(index) self.cg = g.thisptr + self.cg_version = g.version() cdef CExpression e if update: e = c_lookup(self.cg[0], p.thisptr, self.val.addr()) @@ -433,11 +469,15 @@ cdef class _lookupExpression(Expression): self.cg.invalidate() self.val.set(i) +def lookup(LookupParameters p, unsigned index=0, update=True): + return _lookupExpression(_cg, p, index, update) + cdef class _pickerExpression(Expression): cdef UnsignedValue val def __cinit__(self, ComputationGraph g, Expression e, unsigned index=0): self.val = UnsignedValue(index) self.cg = e.cg + self.cg_version = g.version() cdef CExpression ce ce = c_pick(e.c(), self.val.addr()) self.vindex = ce.i @@ -446,13 +486,15 @@ cdef class _pickerExpression(Expression): self.cg.invalidate() self.val.set(i) -pick = _pickerExpression +def pick(Expression e, unsigned index=0): + return _pickerExpression(_cg, e, index) cdef class _hingeExpression(Expression): cdef UnsignedValue val def __cinit__(self, ComputationGraph g, Expression x, unsigned index, float m=1.0): self.val = UnsignedValue(index) self.cg = x.cg + self.cg_version = g.version() cdef CExpression e e = c_hinge(x.c(), self.val.addr(), m) self.vindex = e.i @@ -461,90 +503,99 @@ cdef class _hingeExpression(Expression): self.cg.invalidate() self.val.set(i) -hinge = _hingeExpression +def hinge(Expression x, unsigned index, float m=1.0): + return _hingeExpression(_cg, x, index, m) # }}} # binary-exp -cpdef Expression cdiv(Expression x, Expression y): return Expression.from_cexpr(c_cdiv(x.c(), y.c())) -cpdef Expression colwise_add(Expression x, Expression y): return Expression.from_cexpr(c_colwise_add(x.c(), y.c())) +cpdef Expression cdiv(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_cdiv(x.c(), y.c())) +cpdef Expression colwise_add(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_colwise_add(x.c(), y.c())) -cpdef Expression cwise_multiply(Expression x, Expression y): return Expression.from_cexpr(c_cwise_multiply(x.c(), y.c())) -cpdef Expression dot_product(Expression x, Expression y): return Expression.from_cexpr(c_dot_product(x.c(), y.c())) -cpdef Expression squared_distance(Expression x, Expression y): return Expression.from_cexpr(c_squared_distance(x.c(), y.c())) -cpdef Expression l1_distance(Expression x, Expression y): return Expression.from_cexpr(c_l1_distance(x.c(), y.c())) -cpdef Expression binary_log_loss(Expression x, Expression y): return Expression.from_cexpr(c_binary_log_loss(x.c(), y.c())) -cpdef Expression conv1d_narrow(Expression x, Expression y): return Expression.from_cexpr(c_conv1d_narrow(x.c(), y.c())) -cpdef Expression conv1d_wide(Expression x, Expression y): return Expression.from_cexpr(c_conv1d_wide(x.c(), y.c())) +cpdef Expression cwise_multiply(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_cwise_multiply(x.c(), y.c())) +cpdef Expression dot_product(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_dot_product(x.c(), y.c())) +cpdef Expression squared_distance(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_squared_distance(x.c(), y.c())) +cpdef Expression l1_distance(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_l1_distance(x.c(), y.c())) +cpdef Expression binary_log_loss(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_binary_log_loss(x.c(), y.c())) +cpdef Expression conv1d_narrow(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_conv1d_narrow(x.c(), y.c())) +cpdef Expression conv1d_wide(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_conv1d_wide(x.c(), y.c())) # unary-exp -cpdef Expression tanh(Expression x): return Expression.from_cexpr(c_tanh(x.c())) -cpdef Expression exp(Expression x): return Expression.from_cexpr(c_exp(x.c())) -cpdef Expression log(Expression x): return Expression.from_cexpr(c_log(x.c())) -cpdef Expression logistic(Expression x): return Expression.from_cexpr(c_logistic(x.c())) -cpdef Expression rectify(Expression x): return Expression.from_cexpr(c_rectify(x.c())) +cpdef Expression tanh(Expression x): return Expression.from_cexpr(x.cg_version, c_tanh(x.c())) +cpdef Expression exp(Expression x): return Expression.from_cexpr(x.cg_version, c_exp(x.c())) +cpdef Expression log(Expression x): return Expression.from_cexpr(x.cg_version, c_log(x.c())) +cpdef Expression logistic(Expression x): return Expression.from_cexpr(x.cg_version, c_logistic(x.c())) +cpdef Expression rectify(Expression x): return Expression.from_cexpr(x.cg_version, c_rectify(x.c())) cpdef Expression log_softmax(Expression x, list restrict=None): if restrict is None: - return Expression.from_cexpr(c_log_softmax(x.c())) + return Expression.from_cexpr(x.cg_version, c_log_softmax(x.c())) cdef vector[unsigned] vec = restrict - return Expression.from_cexpr(c_log_softmax(x.c(), vec)) -cpdef Expression softmax(Expression x): return Expression.from_cexpr(c_softmax(x.c())) -cpdef Expression softsign(Expression x): return Expression.from_cexpr(c_softsign(x.c())) -cpdef Expression transpose(Expression x): return Expression.from_cexpr(c_transpose(x.c())) -cpdef Expression sum_cols(Expression x): return Expression.from_cexpr(c_sum_cols(x.c())) + return Expression.from_cexpr(x.cg_version, c_log_softmax(x.c(), vec)) +cpdef Expression softmax(Expression x): return Expression.from_cexpr(x.cg_version, c_softmax(x.c())) +cpdef Expression softsign(Expression x): return Expression.from_cexpr(x.cg_version, c_softsign(x.c())) +cpdef Expression transpose(Expression x): return Expression.from_cexpr(x.cg_version, c_transpose(x.c())) +cpdef Expression sum_cols(Expression x): return Expression.from_cexpr(x.cg_version, c_sum_cols(x.c())) #expr-opt -cpdef Expression fold_rows(Expression x, unsigned nrows=2): return Expression.from_cexpr(c_fold_rows(x.c(),nrows)) +cpdef Expression fold_rows(Expression x, unsigned nrows=2): return Expression.from_cexpr(x.cg_version, c_fold_rows(x.c(),nrows)) #expr-expr-opt -cpdef Expression pairwise_rank_loss(Expression x, Expression y, float m=1.0): return Expression.from_cexpr(c_pairwise_rank_loss(x.c(), y.c(), m)) -cpdef Expression huber_distance(Expression x, Expression y, float c=1.345): return Expression.from_cexpr(c_huber_distance(x.c(), y.c(), c)) +cpdef Expression pairwise_rank_loss(Expression x, Expression y, float m=1.0): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_pairwise_rank_loss(x.c(), y.c(), m)) +cpdef Expression huber_distance(Expression x, Expression y, float c=1.345): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_huber_distance(x.c(), y.c(), c)) #expr-unsigned -cpdef Expression kmax_pooling(Expression x, unsigned k): return Expression.from_cexpr(c_kmax_pooling(x.c(), k)) -cpdef Expression pickneglogsoftmax(Expression x, unsigned v): return Expression.from_cexpr(c_pickneglogsoftmax(x.c(), v)) +cpdef Expression kmax_pooling(Expression x, unsigned k): return Expression.from_cexpr(x.cg_version, c_kmax_pooling(x.c(), k)) +cpdef Expression pickneglogsoftmax(Expression x, unsigned v): return Expression.from_cexpr(x.cg_version, c_pickneglogsoftmax(x.c(), v)) -cpdef Expression kmh_ngram(Expression x, unsigned v): return Expression.from_cexpr(c_kmh_ngram(x.c(), v)) -cpdef Expression pickrange(Expression x, unsigned v, unsigned u): return Expression.from_cexpr(c_pickrange(x.c(), v, u)) +cpdef Expression kmh_ngram(Expression x, unsigned v): return Expression.from_cexpr(x.cg_version, c_kmh_ngram(x.c(), v)) +cpdef Expression pickrange(Expression x, unsigned v, unsigned u): return Expression.from_cexpr(x.cg_version, c_pickrange(x.c(), v, u)) #expr-float -cpdef Expression noise(Expression x, float stddev): return Expression.from_cexpr(c_noise(x.c(), stddev)) -cpdef Expression dropout(Expression x, float p): return Expression.from_cexpr(c_dropout(x.c(), p)) +cpdef Expression noise(Expression x, float stddev): return Expression.from_cexpr(x.cg_version, c_noise(x.c(), stddev)) +cpdef Expression dropout(Expression x, float p): return Expression.from_cexpr(x.cg_version, c_dropout(x.c(), p)) #expr-dim -cpdef Expression reshape(Expression x, tuple d): return Expression.from_cexpr(c_reshape(x.c(),Dim(d))) +cpdef Expression reshape(Expression x, tuple d): return Expression.from_cexpr(x.cg_version, c_reshape(x.c(),Dim(d))) cpdef Expression esum(list xs): cdef vector[CExpression] cvec cvec = vector[CExpression]() cdef Expression x - for x in xs: cvec.push_back(x.c()) + for x in xs: + ensure_freshness(x) + cvec.push_back(x.c()) #print >> sys.stderr, cvec.size() - return Expression.from_cexpr(c_sum(cvec)) + return Expression.from_cexpr(x.cg_version, c_sum(cvec)) cpdef Expression average(list xs): cdef vector[CExpression] cvec cdef Expression x for x in xs: + ensure_freshness(x) cvec.push_back(x.c()) print >> sys.stderr,"pushing",cvec.back().i - return Expression.from_cexpr(c_average(cvec)) + return Expression.from_cexpr(x.cg_version, c_average(cvec)) cpdef Expression concatenate_cols(list xs): cdef vector[CExpression] cvec cdef Expression x - for x in xs: cvec.push_back(x.c()) - return Expression.from_cexpr(c_concat_cols(cvec)) + for x in xs: + ensure_freshness(x) + cvec.push_back(x.c()) + return Expression.from_cexpr(x.cg_version, c_concat_cols(cvec)) cpdef Expression concatenate(list xs): cdef vector[CExpression] cvec cdef Expression x - for x in xs: cvec.push_back(x.c()) - return Expression.from_cexpr(c_concat(cvec)) + for x in xs: + ensure_freshness(x) + cvec.push_back(x.c()) + return Expression.from_cexpr(x.cg_version, c_concat(cvec)) cpdef Expression affine_transform(list exprs): cdef Expression e cdef vector[CExpression] ves for e in exprs: + ensure_freshness(e) ves.push_back(e.c()) - return Expression.from_cexpr(c_affine_transform(ves)) + return Expression.from_cexpr(e.cg_version, c_affine_transform(ves)) # }}} @@ -554,69 +605,99 @@ cpdef Expression affine_transform(list exprs): cdef class SimpleRNNBuilder: # {{{ cdef CSimpleRNNBuilder *thisptr + cdef int cg_version def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): self.thisptr = new CSimpleRNNBuilder(layers, input_dim, hidden_dim, model.thisptr) + self.cg_version = -1 def __dealloc__(self): del self.thisptr - cpdef new_graph(self, ComputationGraph cg): self.thisptr.new_graph(cg.thisptr[0]) + #cpdef new_graph(self, ComputationGraph cg): self.thisptr.new_graph(cg.thisptr[0]) + cpdef new_graph(self): + self.thisptr.new_graph(_cg.thisptr[0]) + self.cg_version = _cg.version() cpdef start_new_sequence(self, es=None): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") cdef vector[CExpression] ces = vector[CExpression]() cdef Expression e if es: - for e in es: ces.push_back(e.c()) + for e in es: + ensure_freshness(e) + ces.push_back(e.c()) self.thisptr.start_new_sequence(ces) cpdef Expression add_input(self, Expression e): - return Expression.from_cexpr(self.thisptr.add_input(e.c())) - cpdef rewind_one_step(self): self.thisptr.rewind_one_step() + ensure_freshness(e) + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + return Expression.from_cexpr(self.cg_version, self.thisptr.add_input(e.c())) + cpdef rewind_one_step(self): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + self.thisptr.rewind_one_step() cpdef Expression back(self): - return Expression.from_cexpr(self.thisptr.back()) + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + return Expression.from_cexpr(self.cg_version, self.thisptr.back()) cpdef final_h(self): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") cdef list res = [] cdef CExpression cexp cdef vector[CExpression] cexps = self.thisptr.final_h() for cexp in cexps: - res.append(Expression.from_cexpr(cexp)) + res.append(Expression.from_cexpr(self.cg_version, cexp)) return res cpdef final_s(self): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") cdef list res = [] cdef CExpression cexp cdef vector[CExpression] cexps = self.thisptr.final_s() for cexp in cexps: - res.append(Expression.from_cexpr(cexp)) + res.append(Expression.from_cexpr(self.cg_version, cexp)) return res #}}} cdef class LSTMBuilder: # {{{ cdef CLSTMBuilder *thisptr + cdef int cg_version def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): self.thisptr = new CLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr) + self.cg_version = -1 def __dealloc__(self): del self.thisptr - cpdef new_graph(self, ComputationGraph cg): self.thisptr.new_graph(cg.thisptr[0]) + #cpdef new_graph(self, ComputationGraph cg): self.thisptr.new_graph(cg.thisptr[0]) + cpdef new_graph(self): + self.thisptr.new_graph(_cg.thisptr[0]) + self.cg_version = _cg.version() cpdef start_new_sequence(self, es=None): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") cdef vector[CExpression] ces = vector[CExpression]() cdef Expression e if es: - for e in es: ces.push_back(e.c()) + for e in es: + ensure_freshness(e) + ces.push_back(e.c()) self.thisptr.start_new_sequence(ces) cpdef Expression add_input(self, Expression e): - return Expression.from_cexpr(self.thisptr.add_input(e.c())) - cpdef rewind_one_step(self): self.thisptr.rewind_one_step() + ensure_freshness(e) + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + return Expression.from_cexpr(self.cg_version, self.thisptr.add_input(e.c())) + cpdef rewind_one_step(self): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + self.thisptr.rewind_one_step() cpdef Expression back(self): - return Expression.from_cexpr(self.thisptr.back()) + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + return Expression.from_cexpr(self.cg_version, self.thisptr.back()) cpdef final_h(self): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") cdef list res = [] cdef CExpression cexp cdef vector[CExpression] cexps = self.thisptr.final_h() for cexp in cexps: - res.append(Expression.from_cexpr(cexp)) + res.append(Expression.from_cexpr(self.cg_version, cexp)) return res cpdef final_s(self): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") cdef list res = [] cdef CExpression cexp cdef vector[CExpression] cexps = self.thisptr.final_s() for cexp in cexps: - res.append(Expression.from_cexpr(cexp)) + res.append(Expression.from_cexpr(self.cg_version, cexp)) return res # }}} From 43448239fd403fb31b351753a29d76b818142a21 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Mon, 20 Jul 2015 19:32:50 +0300 Subject: [PATCH 158/965] updated rnnlm and xor examples. --- pycnn/rnnlm.py | 34 ++++++++++++++++------------------ pycnn/xor.py | 37 ++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 37 deletions(-) diff --git a/pycnn/rnnlm.py b/pycnn/rnnlm.py index 9802dfd18..46357c4f1 100644 --- a/pycnn/rnnlm.py +++ b/pycnn/rnnlm.py @@ -13,8 +13,7 @@ import util class RNNLanguageModel: - def __init__(self, model, cg, builder=SimpleRNNBuilder): - self.cg = cg + def __init__(self, model, builder=SimpleRNNBuilder): self.m = model self.builder = builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) @@ -23,18 +22,18 @@ def __init__(self, model, cg, builder=SimpleRNNBuilder): model.add_parameters("bias", (VOCAB_SIZE)) def BuildLMGraph(self, sent): - cg = self.cg.renew() + renew_cg() builder = self.builder - builder.new_graph(cg) # TODO WHY? + builder.new_graph() builder.start_new_sequence() - R = cg.parameters(self.m["R"]) - bias = cg.parameters(self.m["bias"]) + R = parameter(self.m["R"]) + bias = parameter(self.m["bias"]) errs = [] # will hold expressions es=[] for (cw,nw) in zip(sent,sent[1:]): # assume word is already a word-id - x_t = cg.lookup(self.m["lookup"], int(cw)) + x_t = lookup(self.m["lookup"], int(cw)) y_t = builder.add_input(x_t) r_t = bias + (R * y_t) err = pickneglogsoftmax(r_t, int(nw)) @@ -44,20 +43,20 @@ def BuildLMGraph(self, sent): def sample(self, first=1, nchars=0, stop=-1): res = [first] - cg = self.cg.renew() + renew_cg() builder = self.builder - builder.new_graph(cg) + builder.new_graph() builder.start_new_sequence() - R = cg.parameters(self.m["R"]) - bias = cg.parameters(self.m["bias"]) + R = parameter(self.m["R"]) + bias = parameter(self.m["bias"]) cw = first while True: - x_t = cg.lookup(self.m["lookup"], cw) + x_t = lookup(self.m["lookup"], cw) y_t = builder.add_input(x_t) r_t = bias + (R * y_t) ydist = softmax(r_t) - dist = cg.inc_forward_vec() + dist = cg().inc_forward_vec() rnd = random.random() for i,p in enumerate(dist): rnd -= p @@ -76,9 +75,8 @@ def sample(self, first=1, nchars=0, stop=-1): model = Model() sgd = SimpleSGDTrainer(model) - cg = ComputationGraph() - lm = RNNLanguageModel(model, cg, builder=LSTMBuilder) + lm = RNNLanguageModel(model, builder=LSTMBuilder) train = list(train) @@ -99,10 +97,10 @@ def sample(self, first=1, nchars=0, stop=-1): chars += len(sent)-1 isent = [vocab.w2i[w] for w in sent] errs = lm.BuildLMGraph(isent) - loss += cg.inc_forward_scalar() - cg.backward() + loss += cg().inc_forward_scalar() + cg().backward() sgd.update(1.0) - print "TM:",(time.time() - _start)/len(sent) + #print "TM:",(time.time() - _start)/len(sent) print "ITER",ITER,loss sgd.status() sgd.update_epoch(1.0) diff --git a/pycnn/xor.py b/pycnn/xor.py index eb9766344..2b8996c4d 100644 --- a/pycnn/xor.py +++ b/pycnn/xor.py @@ -1,6 +1,7 @@ from pycnn import * xsent = True +xsent = False HIDDEN_SIZE = 8 ITERATIONS = 2000 @@ -8,20 +9,18 @@ m = Model() sgd = SimpleSGDTrainer(m) -cg = ComputationGraph() - m.add_parameters("W",(HIDDEN_SIZE, 2)) m.add_parameters("b",HIDDEN_SIZE) m.add_parameters("V",(1, HIDDEN_SIZE)) m.add_parameters("a",1) -W = cg.parameters(m["W"]) -b = cg.parameters(m["b"]) -V = cg.parameters(m["V"]) -a = cg.parameters(m["a"]) +W = parameter(m["W"]) +b = parameter(m["b"]) +V = parameter(m["V"]) +a = parameter(m["a"]) -x = cg.inputVector(2) -y = cg.inputValue(0) +x = vecInput([1,1]) +y = scalarInput(0) #print type(x) h = tanh((W*x) + b) if xsent: @@ -43,8 +42,8 @@ x2 = (mi / 2) % 2 x.set([T if x1 else F, T if x2 else F]) y.set(T if x1 != x2 else F) - mloss += cg.forward_scalar() - cg.backward() + mloss += cg().forward_scalar() + cg().backward() sgd.update(1.0) sgd.update_epoch(); mloss /= 4. @@ -52,17 +51,17 @@ x.set([F,T]) z = -(-y_pred) -print cg.forward_scalar() +print cg().forward_scalar() #print y_pred.scalar() -cg = cg.renew() -W = cg.parameters(m["W"]) -b = cg.parameters(m["b"]) -V = cg.parameters(m["V"]) -a = cg.parameters(m["a"]) +renew_cg() +W = parameter(m["W"]) +b = parameter(m["b"]) +V = parameter(m["V"]) +a = parameter(m["a"]) -x = cg.inputVector(2) -y = cg.inputValue() +x = vecInput([1,1]) +y = scalarInput(0) #print type(x) h = tanh((W*x) + b) if xsent: @@ -70,5 +69,5 @@ else: y_pred = (V*h) + a x.set([T,F]) -print "XX",cg.forward_scalar() +print "XX",cg().forward_scalar() From ec203dca3df1ce27eeebbea77d27318ff38b1be4 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Mon, 20 Jul 2015 20:12:48 +0300 Subject: [PATCH 159/965] reorganize a bit. --- pycnn/pycnn.pyx | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 8e7d2f7b1..fd12af8ce 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -252,17 +252,6 @@ cdef class ComputationGraph: cpdef version(self): return self._cg_version - #def parameters(self, model, name, dim=None): - # cdef Parameters params - # cdef Expression result - # if name in model: - # params = model[name] - # else: - # assert(dim is not None) - # params = model.add_parameters(name, dim) - # result = Expression.from_cexpr(c_parameter(self.thisptr[0], params.thisptr)) - # return result - def parameters(self, Parameters params): cdef Expression result result = Expression.from_cexpr(self._cg_version, c_parameter(self.thisptr[0], params.thisptr)) @@ -311,15 +300,15 @@ cdef class ComputationGraph: # # We have the classes UnsignedValue, FloatValue and FloatVectorValue for # this purpose. - cpdef inputValue(self, float v = 0.0): + cdef inputValue(self, float v = 0.0): return _inputExpression(self, v) - cpdef inputVector(self, int dim): + cdef inputVector(self, int dim): return _vecInputExpression(self, vector[float](dim)) - cpdef inputMatrix(self, int d1, int d2): + cdef inputMatrix(self, int d1, int d2): return _vecInputExpression(self, vector[float](d1*d2), (d1,d2)) - cpdef lookup(self, LookupParameters p, unsigned v = 0, update=True): + cdef lookup(self, LookupParameters p, unsigned v = 0, update=True): return _lookupExpression(self, p, v, update) - cpdef outputPicker(self, Expression e, unsigned v = 0): + cdef outputPicker(self, Expression e, unsigned v = 0): r = _pickerExpression(self, e, v) return r @@ -432,7 +421,7 @@ cdef class _inputExpression(Expression): self.val.set(s) def scalarInput(float s): - return _inputExpression(_cg, s) + return _cg.inputValue(s) cdef class _vecInputExpression(Expression): cdef FloatVectorValue val @@ -449,8 +438,11 @@ cdef class _vecInputExpression(Expression): self.cg.invalidate() self.val.set(data) -def vecInput(vector[float] val, dim=None): - return _vecInputExpression(_cg, val, dim) +def vecInput(int dim): + return _cg.inputVector(dim) + +def matInput(int d1, int d2): + return _cg.inputMatrix(d1, d2) cdef class _lookupExpression(Expression): cdef UnsignedValue val @@ -470,7 +462,7 @@ cdef class _lookupExpression(Expression): self.val.set(i) def lookup(LookupParameters p, unsigned index=0, update=True): - return _lookupExpression(_cg, p, index, update) + return _cg.lookup(p, index, update) cdef class _pickerExpression(Expression): cdef UnsignedValue val @@ -487,7 +479,7 @@ cdef class _pickerExpression(Expression): self.val.set(i) def pick(Expression e, unsigned index=0): - return _pickerExpression(_cg, e, index) + return _cg.outputPicker(e, index) cdef class _hingeExpression(Expression): cdef UnsignedValue val From f08504dbc83d00dcd94218dea1cd15ab3355fb6b Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Mon, 20 Jul 2015 20:33:20 +0300 Subject: [PATCH 160/965] both static and shared libs. --- cnn/CMakeLists.txt | 4 +++- pycnn/makefile | 4 ++-- pycnn/setup.py | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 70aa6989a..2a74e3f1e 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -82,8 +82,10 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) #endforeach(test_src) # actual target: -add_library(cnn SHARED ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) +add_library(cnn STATIC ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) +add_library(cnn_shared SHARED ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) target_link_libraries(cnn ${LIBS}) +target_link_libraries(cnn_shared ${LIBS}) #add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) diff --git a/pycnn/makefile b/pycnn/makefile index dd80684aa..379093189 100644 --- a/pycnn/makefile +++ b/pycnn/makefile @@ -1,5 +1,5 @@ -pycnn.so: ../build/cnn/libcnn.so pycnn.pyx pycnn.pxd setup.py - cp ../build/cnn/libcnn.so . +pycnn.so: ../build/cnn/libcnn_shared.so pycnn.pyx pycnn.pxd setup.py + cp ../build/cnn/libcnn_shared.so . python2 setup.py build_ext --inplace diff --git a/pycnn/setup.py b/pycnn/setup.py index a4641be9f..e7100d369 100644 --- a/pycnn/setup.py +++ b/pycnn/setup.py @@ -15,7 +15,7 @@ language="c++", # this causes Pyrex/Cython to create C++ source include_dirs=["../../cnn/", "../../eigen/"], - libraries=['cnn'], # ditto + libraries=['cnn_shared'], # ditto library_dirs=["."], #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed extra_compile_args=["-std=c++11"], From 3a6155568fa1cd33fcd7b4e85392ef004a539239 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 21 Jul 2015 22:59:50 +0900 Subject: [PATCH 161/965] Fixed functors to work with CUDA --- cnn/functors.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cnn/functors.h b/cnn/functors.h index a688f30ce..51f80918f 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -1,6 +1,8 @@ #ifndef CNN_GPU_FUNCTORS_H #define CNN_GPU_FUNCTORS_H +#include + #if HAVE_CUDA # define CNN_DEVICE_FUNC __device__ #else @@ -28,7 +30,11 @@ static inline float fastexp (float p) { return fastpow2 (1.442695040f * p); } -#define CNN_EXPF fastexp +#if HAVE_CUDA +# define CNN_EXPF exp +#else +# define CNN_EXPF fastexp +#endif namespace cnn { From 2f8d63a9dae002b218b4cd671ed69376f505ccd0 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 24 Jul 2015 13:46:34 -0700 Subject: [PATCH 162/965] bigger alignment --- cnn/init.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cnn/init.cc b/cnn/init.cc index ccfdf6e33..a77afaff0 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -25,11 +25,11 @@ void Initialize(int& argc, char**& argv) { #if HAVE_CUDA Initialize_GPU(argc, argv); #else - kSCALAR_MINUSONE = (float*) cnn_mm_malloc(1, 32); + kSCALAR_MINUSONE = (float*) cnn_mm_malloc(1, 256); *kSCALAR_MINUSONE = -1; - kSCALAR_ONE = (float*) cnn_mm_malloc(1, 32); + kSCALAR_ONE = (float*) cnn_mm_malloc(1, 256); *kSCALAR_ONE = 1; - kSCALAR_ZERO = (float*) cnn_mm_malloc(1, 32); + kSCALAR_ZERO = (float*) cnn_mm_malloc(1, 256); *kSCALAR_ZERO = 0; #endif random_device rd; From f898a703dc8791ebaaae00e9c6d8fb7ccd5f6dd1 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 24 Jul 2015 15:56:31 -0700 Subject: [PATCH 163/965] fixing trevor bug --- cnn/tensor.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cnn/tensor.h b/cnn/tensor.h index 7446edbbe..5974d0a77 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -6,6 +6,7 @@ #include "cnn/dim.h" #include "cnn/random.h" +#include "cnn/aligned-mem-pool.h" #if HAVE_CUDA #include @@ -64,7 +65,7 @@ struct Tensor { ar & boost::serialization::make_array(vc, d.size()); CUDA_CHECK(cudaMemcpyAsync(v, vc, d.size() * sizeof(float), cudaMemcpyHostToDevice)); #else - v = static_cast(std::malloc(d.size() * sizeof(float))); + v = static_cast(cnn_mm_malloc(d.size() * sizeof(float), 32)); ar & boost::serialization::make_array(v, d.size()); #endif } From 03601ab548d2b27e7f66066a008c320bfed30258 Mon Sep 17 00:00:00 2001 From: kaishengyao Date: Mon, 27 Jul 2015 14:02:15 -0700 Subject: [PATCH 164/965] cygwin support --- CMakeLists.txt | 9 +++++++++ cnn/cnn-helper.h | 25 +++++++++++++++++++++++++ cnn/cnn.cc | 1 + cnn/graph.cc | 1 + cnn/rnn-state-machine.cc | 1 + 5 files changed, 37 insertions(+) create mode 100755 cnn/cnn-helper.h diff --git a/CMakeLists.txt b/CMakeLists.txt index ce2d6cf8e..3aebb8224 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,15 @@ set(Boost_REALPATH ON) find_package(Boost COMPONENTS program_options serialization REQUIRED) include_directories(${Boost_INCLUDE_DIR}) set(LIBS ${LIBS} ${Boost_LIBRARIES}) +# trouble shooting: +# if boost library cannot be found, in addition to install boost library +# check if environment variables are set +# +# to set boost root and its library root in environment variable, use +# for example +# echo "export BOOST_LIBRARYDIR=/usr/local/lib" >> ~/.bashrc +# echo "export BOOST_ROOT=/cygdrive/d/tools/boost_1_58_0/boost_1_58_0" >> ~/.bashrc +# then run source ~/.bashrc to have those environment variable effective immediately if(BACKEND) message("-- BACKEND: ${BACKEND}") diff --git a/cnn/cnn-helper.h b/cnn/cnn-helper.h new file mode 100755 index 000000000..3b796a61a --- /dev/null +++ b/cnn/cnn-helper.h @@ -0,0 +1,25 @@ +#ifndef CNN_HELPER_H_ +#define CNN_HELPER_H_ + +#include + +/// helper functions + +namespace cnn { + +/** + this fix a compilation problem in cygwin +*/ +#if defined(__CYGWIN__) + template + inline std::string to_string(T value) + { + std::ostringstream os; + os << value; + return os.str(); + } +#endif + +} // namespace cnn + +#endif diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 0169ed531..ab60ec903 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -3,6 +3,7 @@ #include "cnn/nodes.h" #include "cnn/param-nodes.h" #include "cnn/aligned-mem-pool.h" +#include "cnn/cnn-helper.h" using namespace std; diff --git a/cnn/graph.cc b/cnn/graph.cc index 6db954a6e..21b9bcc20 100644 --- a/cnn/graph.cc +++ b/cnn/graph.cc @@ -1,6 +1,7 @@ #include "cnn/graph.h" #include "cnn/cnn.h" #include +#include "cnn/cnn-helper.h" using namespace std; diff --git a/cnn/rnn-state-machine.cc b/cnn/rnn-state-machine.cc index 08dcce183..745175206 100644 --- a/cnn/rnn-state-machine.cc +++ b/cnn/rnn-state-machine.cc @@ -1,6 +1,7 @@ #include "cnn/rnn-state-machine.h" #include +#include "cnn/cnn.h" using namespace std; From c25a52f5773b0538da9cb364ebf5b2ce8af9e863 Mon Sep 17 00:00:00 2001 From: kaisheny Date: Mon, 27 Jul 2015 14:56:04 -0700 Subject: [PATCH 165/965] updated cmakelist.txt --- CMakeLists.txt | 2 +- cnn/cnn-helper.h | 0 2 files changed, 1 insertion(+), 1 deletion(-) mode change 100755 => 100644 cnn/cnn-helper.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 3aebb8224..1701c5c02 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,9 +42,9 @@ if(DEFINED ENV{BOOST_ROOT}) set(Boost_NO_SYSTEM_PATHS ON) endif() set(Boost_REALPATH ON) -find_package(Boost COMPONENTS program_options serialization REQUIRED) include_directories(${Boost_INCLUDE_DIR}) set(LIBS ${LIBS} ${Boost_LIBRARIES}) +find_package(Boost COMPONENTS program_options serialization REQUIRED) # trouble shooting: # if boost library cannot be found, in addition to install boost library # check if environment variables are set diff --git a/cnn/cnn-helper.h b/cnn/cnn-helper.h old mode 100755 new mode 100644 From 8140a6456690837d9d444467f90c24f0c3091d73 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 27 Jul 2015 18:11:52 -0700 Subject: [PATCH 166/965] subgradient of l1distance --- cnn/functors.h | 6 ++++++ cnn/nodes.cc | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/cnn/functors.h b/cnn/functors.h index 51f80918f..c3f8f51a4 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -51,6 +51,12 @@ template int sgn(T val) { return (T(0) < val) - (val < T(0)); } +struct FL1Backward { + CNN_DEVICE_FUNC inline float operator()(float x, float d) const { + return sgn(x) * d; + } +}; + struct FHuberBackward { FHuberBackward(float c) : c(c) {} CNN_DEVICE_FUNC inline float operator()(float x, float d) const { diff --git a/cnn/nodes.cc b/cnn/nodes.cc index fbf6978b6..cc427cb9b 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1021,8 +1021,8 @@ void L1Distance::backward(const vector& xs, Tensor& dEdxi) const { assert(i < 2); auto x = **xs[i]; - real scale = dEdf.v[0]; - cerr << "Implement L1Distance::backward()\n"; abort(); + auto y = **xs[1-i]; + *dEdxi += (x - y).binaryExpr(*dEdf, FL1Backward()); } void SquaredEuclideanDistance::forward(const vector& xs, Tensor& fx) const { From b3326d2e0fafd2fe9be6e031d97ec3badef5d0f2 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 28 Jul 2015 10:03:58 -0700 Subject: [PATCH 167/965] fix cmake command ordering --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1701c5c02..3aebb8224 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,9 +42,9 @@ if(DEFINED ENV{BOOST_ROOT}) set(Boost_NO_SYSTEM_PATHS ON) endif() set(Boost_REALPATH ON) +find_package(Boost COMPONENTS program_options serialization REQUIRED) include_directories(${Boost_INCLUDE_DIR}) set(LIBS ${LIBS} ${Boost_LIBRARIES}) -find_package(Boost COMPONENTS program_options serialization REQUIRED) # trouble shooting: # if boost library cannot be found, in addition to install boost library # check if environment variables are set From 8435baa08478c2ca402a1820ec589f211fd07ae1 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 28 Jul 2015 10:58:14 -0700 Subject: [PATCH 168/965] use internal stack pointer --- cnn/lstm.cc | 11 +++++------ cnn/lstm.h | 6 +----- cnn/rnn.cc | 10 +++++----- cnn/rnn.h | 28 +++++++++++++++++++++++----- 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 678c3720b..9fb03247b 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -90,8 +90,7 @@ void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { } } -Expression LSTMBuilder::add_input_impl(const Expression& x) { - const unsigned t = h.size(); +Expression LSTMBuilder::add_input_impl(int prev, const Expression& x) { h.push_back(vector(layers)); c.push_back(vector(layers)); vector& ht = h.back(); @@ -100,8 +99,8 @@ Expression LSTMBuilder::add_input_impl(const Expression& x) { for (unsigned i = 0; i < layers; ++i) { const vector& vars = param_vars[i]; Expression i_h_tm1, i_c_tm1; - bool has_prev_state = (t > 0 || has_initial_state); - if (t == 0) { + bool has_prev_state = (prev >= 0 || has_initial_state); + if (prev < 0) { if (has_initial_state) { // intial value for h and c at timestep 0 in layer i // defaults to zero matrix input if not set in add_parameter_edges @@ -109,8 +108,8 @@ Expression LSTMBuilder::add_input_impl(const Expression& x) { i_c_tm1 = c0[i]; } } else { // t > 0 - i_h_tm1 = h[t-1][i]; - i_c_tm1 = c[t-1][i]; + i_h_tm1 = h[prev][i]; + i_c_tm1 = c[prev][i]; } // input Expression i_ait; diff --git a/cnn/lstm.h b/cnn/lstm.h index ca944128e..acea252a0 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -18,10 +18,6 @@ struct LSTMBuilder : public RNNBuilder { unsigned hidden_dim, Model* model); - void rewind_one_step() { - h.pop_back(); - c.pop_back(); - } Expression back() const { return h.back().back(); } std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } std::vector final_s() const { @@ -32,7 +28,7 @@ struct LSTMBuilder : public RNNBuilder { protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(const Expression& x) override; + Expression add_input_impl(int prev, const Expression& x) override; public: // first index is layer, then ... diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 0044c9017..0f8f5ed23 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -51,7 +51,7 @@ void SimpleRNNBuilder::start_new_sequence_impl(const vector& h_0) { if (h0.size()) { assert(h0.size() == layers); } } -Expression SimpleRNNBuilder::add_input_impl(const Expression &in) { +Expression SimpleRNNBuilder::add_input_impl(int prev, const Expression &in) { const unsigned t = h.size(); h.push_back(vector(layers)); @@ -60,12 +60,12 @@ Expression SimpleRNNBuilder::add_input_impl(const Expression &in) { for (unsigned i = 0; i < layers; ++i) { const vector& vars = param_vars[i]; - Expression y = vars[2] + vars[0] * x; + Expression y = affine_transform({vars[2], vars[0], x}); - if (t == 0 && h0.size() > 0) + if (prev == -1 && h0.size() > 0) y = y + vars[1] * h0[i]; - else if (t > 0) - y = y + vars[1] * h[t-1][i]; + else if (prev >= 0) + y = y + vars[1] * h[prev][i]; x = h[t][i] = tanh(y); } diff --git a/cnn/rnn.h b/cnn/rnn.h index a0cce20fb..17760b210 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -11,9 +11,18 @@ namespace cnn { class Model; +BOOST_STRONG_TYPEDEF(int, RNNPointer) +inline void swap(RNNPointer& i1, RNNPointer& i2) { + RNNPointer t = i1; i1 = i2; i2 = t; +} + // interface for constructing an RNN, LSTM, GRU, etc. struct RNNBuilder { + RNNBuilder() : cur(-1) {} virtual ~RNNBuilder(); + + RNNPointer state() const { return cur; } + // call this to reset the builder when you are working with a newly // created ComputationGraph object void new_graph(ComputationGraph& cg) { @@ -27,6 +36,8 @@ struct RNNBuilder { // h_0 is used to initialize hidden layers at timestep 0 to given values void start_new_sequence(const std::vector& h_0={}) { sm.transition(RNNOp::start_new_sequence); + cur = RNNPointer(-1); + head.clear(); start_new_sequence_impl(h_0); } @@ -34,14 +45,20 @@ struct RNNBuilder { // return the hidden representation of the deepest layer Expression add_input(const Expression& x) { sm.transition(RNNOp::add_input); - return add_input_impl(x); + head.push_back(cur); + int rcp = cur; + cur = head.size() - 1; + return add_input_impl(rcp, x); } // rewind the last timestep - this DOES NOT remove the variables // from the computation graph, it just means the next time step will // see a different previous state. You can remind as many times as // you want. - virtual void rewind_one_step() = 0; + void rewind_one_step() { + cur = head[cur]; + } + // returns node (index) of most recent output virtual Expression back() const = 0; // access the final output of each hidden layer @@ -52,10 +69,12 @@ struct RNNBuilder { protected: virtual void new_graph_impl(ComputationGraph& cg) = 0; virtual void start_new_sequence_impl(const std::vector& h_0) = 0; - virtual Expression add_input_impl(const Expression& x) = 0; + virtual Expression add_input_impl(int prev, const Expression& x) = 0; private: // the state machine ensures that the caller is behaving RNNStateMachine sm; + RNNPointer cur; + std::vector head; // head[i] returns the head position }; struct SimpleRNNBuilder : public RNNBuilder { @@ -68,10 +87,9 @@ struct SimpleRNNBuilder : public RNNBuilder { protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h_0) override; - Expression add_input_impl(const Expression& x) override; + Expression add_input_impl(int prev, const Expression& x) override; public: - void rewind_one_step() { h.pop_back(); } Expression back() const { return h.back().back(); } std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } std::vector final_s() const { return final_h(); } From 0c4f386c8be505213511246ed861fc4bd402bf39 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 28 Jul 2015 11:02:28 -0700 Subject: [PATCH 169/965] let RNN connect to arbitrary previous states --- cnn/rnn.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cnn/rnn.h b/cnn/rnn.h index 17760b210..9a4d90f73 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -51,6 +51,16 @@ struct RNNBuilder { return add_input_impl(rcp, x); } + // add another timestep, but define recurrent connection to prev + // rather than to head[cur] + // this can be used to construct trees, implement beam search, etc. + Expression add_input(const RNNPointer& prev, const Expression& x) { + sm.transition(RNNOp::add_input); + head.push_back(prev); + cur = head.size() - 1; + return add_input_impl(prev, x); + } + // rewind the last timestep - this DOES NOT remove the variables // from the computation graph, it just means the next time step will // see a different previous state. You can remind as many times as From 8bfdd77f303bb438a19b0a2568d8c332a278713c Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 28 Jul 2015 16:03:34 -0700 Subject: [PATCH 170/965] fix init --- cnn/init.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cnn/init.cc b/cnn/init.cc index a77afaff0..522abe4c4 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -25,11 +25,11 @@ void Initialize(int& argc, char**& argv) { #if HAVE_CUDA Initialize_GPU(argc, argv); #else - kSCALAR_MINUSONE = (float*) cnn_mm_malloc(1, 256); + kSCALAR_MINUSONE = (float*) cnn_mm_malloc(sizeof(float), 256); *kSCALAR_MINUSONE = -1; - kSCALAR_ONE = (float*) cnn_mm_malloc(1, 256); + kSCALAR_ONE = (float*) cnn_mm_malloc(sizeof(float), 256); *kSCALAR_ONE = 1; - kSCALAR_ZERO = (float*) cnn_mm_malloc(1, 256); + kSCALAR_ZERO = (float*) cnn_mm_malloc(sizeof(float), 256); *kSCALAR_ZERO = 0; #endif random_device rd; From f5aa6ebb8b91f348f82fa2daeaa751299f4d1b2d Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 29 Jul 2015 18:18:25 +0800 Subject: [PATCH 171/965] Added ability to copy parameters, recurrent nets --- cnn/lstm.cc | 8 ++++++++ cnn/lstm.h | 1 + cnn/model.cc | 11 +++++++++++ cnn/model.h | 2 ++ cnn/rnn.cc | 10 ++++++++++ cnn/rnn.h | 3 +++ cnn/tensor.cc | 8 ++++++++ cnn/tensor.h | 1 + 8 files changed, 44 insertions(+) diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 678c3720b..420adb5cd 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -155,4 +155,12 @@ Expression LSTMBuilder::add_input_impl(const Expression& x) { return ht.back(); } +void LSTMBuilder::copy(const RNNBuilder & rnn) { + const LSTMBuilder & rnn_lstm = (const LSTMBuilder&)rnn; + assert(params.size() == rnn_lstm.params.size()); + for(size_t i = 0; i < params.size(); ++i) + for(size_t j = 0; j < params[i].size(); ++j) + params[i][j]->copy(*rnn_lstm.params[i][j]); +} + } // namespace cnn diff --git a/cnn/lstm.h b/cnn/lstm.h index ca944128e..080f83be9 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -29,6 +29,7 @@ struct LSTMBuilder : public RNNBuilder { for(auto my_h : final_h()) ret.push_back(my_h); return ret; } + void copy(const RNNBuilder & params) override; protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; diff --git a/cnn/model.cc b/cnn/model.cc index 682a7508c..e9cb4788e 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -48,6 +48,11 @@ void Parameters::g_squared_l2norm(float* sqnorm) const { #endif } +void Parameters::copy(const Parameters & param) { + assert(dim == param.dim); + TensorTools::CopyElements(values, param.values); +} + void Parameters::accumulate_grad(const Tensor& d) { #if HAVE_CUDA CUBLAS_CHECK(cublasSaxpy(cublas_handle, g.d.size(), kSCALAR_ONE, d.v, 1, g.v, 1)); @@ -122,6 +127,12 @@ void LookupParameters::squared_l2norm(float* sqnorm) const { #endif } +void LookupParameters::copy(const LookupParameters & param) { + assert(dim == param.dim); + for(size_t i = 0; i < param.values.size(); ++i) + TensorTools::CopyElements(values[i], param.values[i]); +} + void LookupParameters::accumulate_grad(unsigned index, const Tensor& d) { non_zero_grads.insert(index); #if HAVE_CUDA diff --git a/cnn/model.h b/cnn/model.h index 095d20334..680ccfe30 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -34,6 +34,7 @@ struct Parameters : public ParametersBase { void g_squared_l2norm(float* sqnorm) const override; size_t size() const override; + void copy(const Parameters & val); void accumulate_grad(const Tensor& g); void clear(); @@ -60,6 +61,7 @@ struct LookupParameters : public ParametersBase { size_t size() const override; void Initialize(unsigned index, const std::vector& val); + void copy(const LookupParameters & val); void accumulate_grad(unsigned index, const Tensor& g); void clear(); diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 0044c9017..896aad8f8 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -72,4 +72,14 @@ Expression SimpleRNNBuilder::add_input_impl(const Expression &in) { return h[t].back(); } +void SimpleRNNBuilder::copy(const RNNBuilder & rnn) { + const SimpleRNNBuilder & rnn_simple = (const SimpleRNNBuilder&)rnn; + assert(params.size() == rnn_simple.params.size()); + for(size_t i = 0; i < rnn_simple.params.size(); ++i) { + params[i][0]->copy(*rnn_simple.params[i][0]); + params[i][1]->copy(*rnn_simple.params[i][1]); + params[i][2]->copy(*rnn_simple.params[i][2]); + } +} + } // namespace cnn diff --git a/cnn/rnn.h b/cnn/rnn.h index a0cce20fb..43f172916 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -49,6 +49,8 @@ struct RNNBuilder { // access the state of each hidden layer, in a format that can be used in // start_new_sequence virtual std::vector final_s() const = 0; + // copy the parameters of another builder + virtual void copy(const RNNBuilder & params) = 0; protected: virtual void new_graph_impl(ComputationGraph& cg) = 0; virtual void start_new_sequence_impl(const std::vector& h_0) = 0; @@ -75,6 +77,7 @@ struct SimpleRNNBuilder : public RNNBuilder { Expression back() const { return h.back().back(); } std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } std::vector final_s() const { return final_h(); } + void copy(const RNNBuilder & params) override; private: // first index is layer, then x2h h2h hb diff --git a/cnn/tensor.cc b/cnn/tensor.cc index 3f2bf3bb2..b83d0c89b 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -60,6 +60,14 @@ void TensorTools::SetElements(const Tensor& v, const vector& vec) { #endif } +void TensorTools::CopyElements(const Tensor& v, const Tensor& v_src) { +#if HAVE_CUDA + cudaMemcpyAsync(v.v, v_src.v, sizeof(real) * v.d.size(), cudaMemcpyDeviceToDevice); +#else + memcpy(v.v, v_src.v, sizeof(real) * v.d.size()); +#endif +} + void TensorTools::Constant(Tensor& d, float c) { #if HAVE_CUDA if (!c) { diff --git a/cnn/tensor.h b/cnn/tensor.h index 7446edbbe..0ad39d619 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -86,6 +86,7 @@ struct TensorTools { // AccessElement is very, very slow (potentially) - use appropriately static float AccessElement(const Tensor& v, const Dim& index); static void SetElements(const Tensor& v, const std::vector& vec); + static void CopyElements(const Tensor& v, const Tensor& v_src); }; real rand01(); From b1bfd0b1037ed110d1d9578b2d23958fc511e9ae Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 29 Jul 2015 14:59:09 -0700 Subject: [PATCH 172/965] fix for possible vector error --- cnn/dim.h | 9 +++++++++ cnn/nodes-common.cc | 15 +++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/cnn/dim.h b/cnn/dim.h index 8d50207d6..e93473418 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -32,6 +32,15 @@ struct Dim { for (unsigned i = 0; i < nd; ++i) p += d[i]; return p; } + inline Dim truncate() const { + Dim r = *this; + int m = 1; + int s = size(); + for (int i = 1; i < s; ++i) + if (size(i) > 1) m = i; + r.resize(m); + return r; + } inline void resize(unsigned i) { nd = i; } inline int ndims() const { return nd; } inline int rows() const { return d[0]; } diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 18d25b3a3..0f0a80fb7 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -218,13 +218,14 @@ string Sum::as_string(const vector& arg_names) const { } Dim Sum::dim_forward(const vector& xs) const { + Dim d = xs[0].truncate(); for (unsigned i = 1; i < xs.size(); ++i) { - if (xs[0] != xs[1]) { + if (d != xs[i].truncate()) { cerr << "Mismatched input dimensions in Sum: " << xs << endl; abort(); } } - return xs[0]; + return d; } string Average::as_string(const vector& arg_names) const { @@ -524,11 +525,12 @@ string CwiseMultiply::as_string(const vector& arg_names) const { Dim CwiseMultiply::dim_forward(const vector& xs) const { assert(xs.size() == 2); - if (xs[0] != xs[1]) { + Dim d = xs[0].truncate(); + if (d != xs[1].truncate()) { cerr << "Mismatched input dimensions in CwiseMultiply: " << xs << endl; abort(); } - return xs[0]; + return d; } string CwiseQuotient::as_string(const vector& arg_names) const { @@ -539,11 +541,12 @@ string CwiseQuotient::as_string(const vector& arg_names) const { Dim CwiseQuotient::dim_forward(const vector& xs) const { assert(xs.size() == 2); - if (xs[0] != xs[1]) { + Dim d = xs[0].truncate(); + if (d != xs[1].truncate()) { cerr << "Mismatched input dimensions in CwiseQuotient: " << xs << endl; abort(); } - return xs[0]; + return d; } string AffineTransform::as_string(const vector& arg_names) const { From b772326b1c2b2cfc6372a11a0466987c37f3c01b Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 29 Jul 2015 15:55:19 -0700 Subject: [PATCH 173/965] fix bug --- cnn/dim.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/dim.h b/cnn/dim.h index e93473418..3c3cf932f 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -37,7 +37,7 @@ struct Dim { int m = 1; int s = size(); for (int i = 1; i < s; ++i) - if (size(i) > 1) m = i; + if (size(i) > 1) m = i + 1; r.resize(m); return r; } From e5c56b51ae7a219ed33ddaa83cd096fd0d5168db Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 29 Jul 2015 20:44:42 -0700 Subject: [PATCH 174/965] rnnlm-aevb added --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/tensor.cc | 5 + cnn/tensor.h | 1 + examples/CMakeLists.txt | 2 +- examples/rnnlm-aevb.cc | 252 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 261 insertions(+), 1 deletion(-) create mode 100644 examples/rnnlm-aevb.cc diff --git a/cnn/expr.cc b/cnn/expr.cc index 35137abf9..0e2eb39b4 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -31,6 +31,7 @@ Expression colwise_add(const Expression& x, const Expression& bias) { return Exp Expression tanh(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression exp(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression square(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression logistic(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression rectify(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression hinge(const Expression& x, unsigned index, float m) { return Expression(x.pg, x.pg->add_function({x.i}, index, m)); } diff --git a/cnn/expr.h b/cnn/expr.h index d0f5bf3c1..35695b349 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -41,6 +41,7 @@ Expression colwise_add(const Expression& x, const Expression& bias); Expression tanh(const Expression& x); Expression exp(const Expression& x); +Expression square(const Expression& x); Expression log(const Expression& x); Expression logistic(const Expression& x); Expression rectify(const Expression& x); diff --git a/cnn/tensor.cc b/cnn/tensor.cc index 3f2bf3bb2..a0be9b2d2 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -114,4 +114,9 @@ real rand01() { return distribution(*rndeng); } +real rand_normal() { + normal_distribution distribution(0, 1); + return distribution(*rndeng); +} + } // namespace cnn diff --git a/cnn/tensor.h b/cnn/tensor.h index 5974d0a77..4ba10ac34 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -89,6 +89,7 @@ struct TensorTools { static void SetElements(const Tensor& v, const std::vector& vec); }; real rand01(); +real rand_normal(); } // namespace cnn diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index dc9ccdd61..1fde2b0d8 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm nlm textcat rnnlm2) +foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/rnnlm-aevb.cc b/examples/rnnlm-aevb.cc new file mode 100644 index 000000000..31dc7c1f0 --- /dev/null +++ b/examples/rnnlm-aevb.cc @@ -0,0 +1,252 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/timing.h" +#include "cnn/rnn.h" +#include "cnn/gru.h" +#include "cnn/lstm.h" +#include "cnn/dict.h" +# include "cnn/expr.h" + +#include +#include +#include + +#include +#include + +using namespace std; +using namespace cnn; + +unsigned LAYERS = 2; +unsigned INPUT_DIM = 32; //256 +unsigned HIDDEN_DIM = 128; // 1024 +unsigned HIDDEN_DIM2 = 32; +unsigned VOCAB_SIZE = 0; +unsigned LATENT_DIM = 2; +unsigned L = 10; +vector> eps(L, vector(LATENT_DIM)); + +cnn::Dict d; +int kSOS; +int kEOS; + +template +struct RNNLanguageModel { + LookupParameters* p_c; // should we have two of these? + Builder ebuilder; + Parameters* p_H; + Parameters* p_hb; + Parameters* p_h2m; + Parameters* p_mb; + Parameters* p_h2s; + Parameters* p_sb; + + // DECODER + Builder dbuilder; + Parameters* p_R; + Parameters* p_bias; + Parameters* p_z2h0; + Parameters* p_h0b; + + explicit RNNLanguageModel(Model& model) : + ebuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), + dbuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + p_H = model.add_parameters({HIDDEN_DIM2, HIDDEN_DIM}); + p_hb = model.add_parameters({HIDDEN_DIM2}); + p_h2m = model.add_parameters({LATENT_DIM, HIDDEN_DIM2}); + p_mb = model.add_parameters({LATENT_DIM}); + p_h2s = model.add_parameters({LATENT_DIM, HIDDEN_DIM2}); + p_sb = model.add_parameters({LATENT_DIM}); + + p_z2h0 = model.add_parameters({HIDDEN_DIM * LAYERS, LATENT_DIM}); + p_h0b = model.add_parameters({HIDDEN_DIM * LAYERS}); + + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({VOCAB_SIZE}); + } + + // return Expression of total loss + Expression BuildLMGraph(const vector& sent, ComputationGraph& cg, bool flag = false) { + const unsigned slen = sent.size() - 1; + ebuilder.new_graph(cg); // reset RNN builder for new graph + + ebuilder.start_new_sequence(); + Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter + Expression i_bias = parameter(cg, p_bias); // word bias + for (unsigned t = 0; t < slen; ++t) { + Expression i_x_t = lookup(cg, p_c, sent[t]); + // y_t = RNN(x_t) + ebuilder.add_input(i_x_t); + } + Expression i_H = parameter(cg, p_H); + Expression i_hb = parameter(cg, p_hb); + Expression h = tanh(i_H * ebuilder.back() + i_hb); + Expression mu = parameter(cg, p_h2m) * h + parameter(cg, p_mb); + if (flag) { + vector v = as_vector(cg.get_value(mu.i)); + for (unsigned i = 0; i < (slen-2); ++i) cout << d.Convert(sent[i+1]); + cout << " |||"; + for (auto& x : v) cout << ' ' << x; + cout << endl; + } + Expression logsig = 0.5 * parameter(cg, p_h2s) * h + parameter(cg, p_sb); + Expression log_prior = 0.5 * sum_cols(transpose(2 * logsig - square(mu) - exp(2 * logsig))); + vector errs; + dbuilder.new_graph(cg); + for (unsigned l = 0; l < L; ++l) { // noise samples + for (auto& x : eps[l]) x = rand_normal(); + Expression ceps = input(cg, {LATENT_DIM}, &eps[l]); + Expression z = mu + cwise_multiply(ceps, exp(logsig)); + Expression h0 = parameter(cg, p_z2h0) * z + parameter(cg, p_h0b); + vector h0s(LAYERS); + for (unsigned i = 0; i < LAYERS; ++i) { + h0s[i] = pickrange(h0, i * HIDDEN_DIM, (i+1) * HIDDEN_DIM); + } + dbuilder.start_new_sequence(h0s); + for (unsigned t = 0; t < slen; ++t) { + Expression i_x_t = lookup(cg, p_c, sent[t]); + // y_t = RNN(x_t) + Expression i_y_t = dbuilder.add_input(i_x_t); + Expression i_r_t = affine_transform({i_bias, i_R, i_y_t}); + Expression i_err = pickneglogsoftmax(i_r_t, sent[t+1]); + errs.push_back(i_err); + } + } + return sum(errs) / L - log_prior; + } +}; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.Convert(""); + kEOS = d.Convert(""); + vector> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + training.push_back(ReadSentence(line, &d)); + ttoks += training.back().size(); + if (training.back().front() != kSOS && training.back().back() != kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + d.Freeze(); // no new word types allowed + VOCAB_SIZE = d.size(); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + ++dlc; + dev.push_back(ReadSentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() != kSOS && dev.back().back() != kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + ostringstream os; + os << "lm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + bool use_momentum = false; + Trainer* sgd = nullptr; + //if (use_momentum) + // sgd = new MomentumSGDTrainer(&model); + //else + sgd = new SimpleSGDTrainer(&model); + + RNNLanguageModel lm(model); + //RNNLanguageModel lm(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 10; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& sent = training[order[si]]; + chars += sent.size() - 1; + ++si; + lm.BuildLMGraph(sent, cg); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(); + ++lines; + } + sgd->status(); + cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + cout << endl; + double dloss = 0; + int dchars = 0; + for (auto& sent : dev) { + ComputationGraph cg; + lm.BuildLMGraph(sent, cg, true); + dloss += as_scalar(cg.forward()); + dchars += sent.size() - 1; + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } + } + delete sgd; +} + From 44670174e100544762dd4293f134b7dd2fd45d4b Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 30 Jul 2015 17:07:42 -0700 Subject: [PATCH 175/965] deep lstm --- cnn/CMakeLists.txt | 1 + cnn/deep-lstm.cc | 162 +++++++++++++++++++++++++++++++++++++++++++++ cnn/deep-lstm.h | 54 +++++++++++++++ 3 files changed, 217 insertions(+) create mode 100644 cnn/deep-lstm.cc create mode 100644 cnn/deep-lstm.h diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index e28e83c3d..7a348b5dc 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -3,6 +3,7 @@ set(cnn_library_SRCS cnn.cc conv.cc + deep-lstm.cc dict.cc dim.cc exec.cc diff --git a/cnn/deep-lstm.cc b/cnn/deep-lstm.cc new file mode 100644 index 000000000..222969bae --- /dev/null +++ b/cnn/deep-lstm.cc @@ -0,0 +1,162 @@ +#include "cnn/deep-lstm.h" + +#include +#include +#include +#include + +#include "cnn/nodes.h" + +using namespace std; +using namespace cnn::expr; + +namespace cnn { + +enum { X2I, H2I, C2I, BI, X2O, H2O, C2O, BO, X2C, H2C, BC }; + +DeepLSTMBuilder::DeepLSTMBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model) : layers(layers) { + unsigned layer_input_dim = input_dim; + for (unsigned i = 0; i < layers; ++i) { + // i + Parameters* p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2i = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_c2i = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_bi = model->add_parameters({hidden_dim}); + + // o + Parameters* p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2o = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_c2o = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_bo = model->add_parameters({hidden_dim}); + + // c + Parameters* p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2c = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_bc = model->add_parameters({hidden_dim}); + layer_input_dim = hidden_dim + input_dim; // output (hidden) from 1st layer is input to next + + vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; + params.push_back(ps); + } // layers +} + +void DeepLSTMBuilder::new_graph_impl(ComputationGraph& cg){ + param_vars.clear(); + + for (unsigned i = 0; i < layers; ++i){ + auto& p = params[i]; + + //i + Expression i_x2i = parameter(cg,p[X2I]); + Expression i_h2i = parameter(cg,p[H2I]); + Expression i_c2i = parameter(cg,p[C2I]); + Expression i_bi = parameter(cg,p[BI]); + //o + Expression i_x2o = parameter(cg,p[X2O]); + Expression i_h2o = parameter(cg,p[H2O]); + Expression i_c2o = parameter(cg,p[C2O]); + Expression i_bo = parameter(cg,p[BO]); + //c + Expression i_x2c = parameter(cg,p[X2C]); + Expression i_h2c = parameter(cg,p[H2C]); + Expression i_bc = parameter(cg,p[BC]); + + vector vars = {i_x2i, i_h2i, i_c2i, i_bi, i_x2o, i_h2o, i_c2o, i_bo, i_x2c, i_h2c, i_bc}; + param_vars.push_back(vars); + } +} + +// layout: 0..layers = c +// layers+1..2*layers = h +void DeepLSTMBuilder::start_new_sequence_impl(const vector& hinit) { + h.clear(); + c.clear(); + if (hinit.size() > 0) { + assert(layers*2 == hinit.size()); + h0.resize(layers); + c0.resize(layers); + for (unsigned i = 0; i < layers; ++i) { + c0[i] = hinit[i]; + h0[i] = hinit[i + layers]; + } + has_initial_state = true; + } else { + has_initial_state = false; + } +} + +Expression DeepLSTMBuilder::add_input_impl(int prev, const Expression& x) { + h.push_back(vector(layers)); + c.push_back(vector(layers)); + o.push_back(Expression()); + vector& ht = h.back(); + vector& ct = c.back(); + Expression& ot = o.back(); + Expression in = x; + vector cc(layers); + for (unsigned i = 0; i < layers; ++i) { + if (i > 0) + in = concatenate({in, x}); + const vector& vars = param_vars[i]; + Expression i_h_tm1, i_c_tm1; + bool has_prev_state = (prev >= 0 || has_initial_state); + if (prev < 0) { + if (has_initial_state) { + // intial value for h and c at timestep 0 in layer i + // defaults to zero matrix input if not set in add_parameter_edges + i_h_tm1 = h0[i]; + i_c_tm1 = c0[i]; + } + } else { // t > 0 + i_h_tm1 = h[prev][i]; + i_c_tm1 = c[prev][i]; + } + // input + Expression i_ait; + if (has_prev_state) +// i_ait = vars[BI] + vars[X2I] * in + vars[H2I]*i_h_tm1 + vars[C2I] * i_c_tm1; + i_ait = affine_transform({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1, vars[C2I], i_c_tm1}); + else +// i_ait = vars[BI] + vars[X2I] * in; + i_ait = affine_transform({vars[BI], vars[X2I], in}); + Expression i_it = logistic(i_ait); + // forget + Expression i_ft = 1.f - i_it; + // write memory cell + Expression i_awt; + if (has_prev_state) +// i_awt = vars[BC] + vars[X2C] * in + vars[H2C]*i_h_tm1; + i_awt = affine_transform({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); + else +// i_awt = vars[BC] + vars[X2C] * in; + i_awt = affine_transform({vars[BC], vars[X2C], in}); + Expression i_wt = tanh(i_awt); + // output + if (has_prev_state) { + Expression i_nwt = cwise_multiply(i_it,i_wt); + Expression i_crt = cwise_multiply(i_ft,i_c_tm1); + ct[i] = i_crt + i_nwt; + } else { + ct[i] = cwise_multiply(i_it,i_wt); + } + + Expression i_aot; + if (has_prev_state) +// i_aot = vars[BO] + vars[X2O] * in + vars[H2O] * i_h_tm1 + vars[C2O] * ct[i]; + i_aot = affine_transform({vars[BO], vars[X2O], in, vars[H2O], i_h_tm1, vars[C2O], ct[i]}); + else +// i_aot = vars[BO] + vars[X2O] * in; + i_aot = affine_transform({vars[BO], vars[X2O], in}); + Expression i_ot = logistic(i_aot); + Expression ph_t = tanh(ct[i]); + in = ht[i] = cwise_multiply(i_ot,ph_t); + cc[i] = in; + } + ot = concatenate(cc); + return ot; +} + +} // namespace cnn diff --git a/cnn/deep-lstm.h b/cnn/deep-lstm.h new file mode 100644 index 000000000..9a14c713e --- /dev/null +++ b/cnn/deep-lstm.h @@ -0,0 +1,54 @@ +#ifndef CNN_DEEP_LSTM_H_ +#define CNN_DEEP_LSTM_H_ + +#include "cnn/cnn.h" +#include "cnn/rnn.h" +#include "cnn/expr.h" + +using namespace cnn::expr; + +namespace cnn { + +class Model; + +struct DeepLSTMBuilder : public RNNBuilder { + DeepLSTMBuilder() = default; + explicit DeepLSTMBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model); + + Expression back() const { return h.back().back(); } + std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } + std::vector final_s() const { + std::vector ret = (c.size() == 0 ? c0 : c.back()); + for(auto my_h : final_h()) ret.push_back(my_h); + return ret; + } + protected: + void new_graph_impl(ComputationGraph& cg) override; + void start_new_sequence_impl(const std::vector& h0) override; + Expression add_input_impl(int prev, const Expression& x) override; + + public: + // first index is layer, then ... + std::vector> params; + + // first index is layer, then ... + std::vector> param_vars; + + // first index is time, second is layer + std::vector> h, c; + std::vector o; + + // initial values of h and c at each layer + // - both default to zero matrix input + bool has_initial_state; // if this is false, treat h0 and c0 as 0 + std::vector h0; + std::vector c0; + unsigned layers; +}; + +} // namespace cnn + +#endif From bfdd0e9e08b11bef42ef1c603ac91cf6055186d1 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 30 Jul 2015 17:34:17 -0700 Subject: [PATCH 176/965] gradient checker --- cnn/CMakeLists.txt | 1 + cnn/grad-check.cc | 49 ++++++++++++++++++++++++++++++++++++++++++++++ cnn/grad-check.h | 13 ++++++++++++ cnn/param-nodes.cc | 2 +- 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 cnn/grad-check.cc create mode 100644 cnn/grad-check.h diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 7a348b5dc..d529c3b81 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -8,6 +8,7 @@ set(cnn_library_SRCS dim.cc exec.cc expr.cc + grad-check.cc graph.cc gru.cc init.cc diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc new file mode 100644 index 000000000..df5f444b7 --- /dev/null +++ b/cnn/grad-check.cc @@ -0,0 +1,49 @@ +#include "cnn/grad-check.h" + +#include +#include + +#include "cnn/model.h" +#include "cnn/cnn.h" +#include "cnn/tensor.h" + +using namespace std; + +namespace cnn { + +void CheckGrad(Model& m, ComputationGraph& g) { + float alpha = 1e-4; + float E = as_scalar(g.forward()); + g.backward(); + + bool flag = false; + const vector& params = m.parameters_list(); + for (auto pp : params) { + cerr << "\nPARAMETERS " << pp << endl; + Parameters& p = *pp; + size_t ts = p.dim.size(); + for (size_t i = 0; i < ts; ++i) { + float old = p.values.v[i]; + p.values.v[i] = old - alpha; + float E_left = as_scalar(g.forward()); + + p.values.v[i] = old + alpha; + float E_right = as_scalar(g.forward()); + float g = (E_right - E_left) / (2 * alpha); + float f = fabs(g - p.g.v[i]); + float m = max(fabs(g), fabs(p.g.v[i])); + if (m > 0.f) f /= m; + if (f > 0.1) { flag = true; cerr << "*** "; } + cerr << p.g.v[i] << ' ' << g << endl; + } + } + if (flag) { + cerr << "\n*** GRADIENT CHECK FAILED ***\n"; + } else { + cerr << "\nGRADIENT CHECK PASSED\n"; + } +// const vector& lookup_params = m.lookup_parameters_list(); +} + +} + diff --git a/cnn/grad-check.h b/cnn/grad-check.h new file mode 100644 index 000000000..ce2966f56 --- /dev/null +++ b/cnn/grad-check.h @@ -0,0 +1,13 @@ +#ifndef CNN_GRAD_CHECK_H +#define CNN_GRAD_CHECK_H + +namespace cnn { + +class Model; +struct ComputationGraph; + +void CheckGrad(Model& m, ComputationGraph& g); + +} // namespace cnn + +#endif diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index 988f6d59e..918dc27c9 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -9,7 +9,7 @@ namespace cnn { string ParameterNode::as_string(const vector& arg_names) const { ostringstream s; - s << "parameters(" << dim << ')'; + s << "parameters(" << dim << ", " << params << ')'; return s.str(); } From 91b1448f3c7cf74b4734446c55ce6a731bf2411b Mon Sep 17 00:00:00 2001 From: Trevor Cohn Date: Fri, 31 Jul 2015 10:50:12 +1000 Subject: [PATCH 177/965] Fixed repeating of final symbol when using ReadSentence --- cnn/dict.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cnn/dict.cc b/cnn/dict.cc index b6ceec468..f0b37403b 100644 --- a/cnn/dict.cc +++ b/cnn/dict.cc @@ -11,11 +11,10 @@ namespace cnn { std::vector ReadSentence(const std::string& line, Dict* sd) { std::istringstream in(line); std::string word; - std::string sep = "|||"; std::vector res; while(in) { in >> word; - if (word.empty()) break; + if (!in || word.empty()) break; res.push_back(sd->Convert(word)); } return res; From 0a51ce509d0b184d86fdb4543c547c291b2e2af3 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 30 Jul 2015 18:27:53 -0700 Subject: [PATCH 178/965] lookup table check --- cnn/grad-check.cc | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc index df5f444b7..208816cd9 100644 --- a/cnn/grad-check.cc +++ b/cnn/grad-check.cc @@ -12,7 +12,7 @@ using namespace std; namespace cnn { void CheckGrad(Model& m, ComputationGraph& g) { - float alpha = 1e-4; + float alpha = 5e-4; float E = as_scalar(g.forward()); g.backward(); @@ -32,17 +32,47 @@ void CheckGrad(Model& m, ComputationGraph& g) { float g = (E_right - E_left) / (2 * alpha); float f = fabs(g - p.g.v[i]); float m = max(fabs(g), fabs(p.g.v[i])); - if (m > 0.f) f /= m; - if (f > 0.1) { flag = true; cerr << "*** "; } + if (f > 0.1) { + if (m > 0.f) f /= m; + if (f > 0.1) { flag = true; cerr << "***[" << f << "] "; } + } cerr << p.g.v[i] << ' ' << g << endl; } } + + const vector& lookup_params = m.lookup_parameters_list(); + for (auto pp : lookup_params) { + cerr << "\nLOOKUP PARAMETERS " << pp << endl; + LookupParameters& p = *pp; + size_t ts = p.dim.size(); + for (unsigned j : p.non_zero_grads) { + cerr << "OBJECT=" << j << endl; + Tensor& v = p.values[j]; + Tensor& ag = p.grads[j]; + for (size_t i = 0; i < ts; ++i) { + float old = v.v[i]; + v.v[i] = old - alpha; + float E_left = as_scalar(g.forward()); + + v.v[i] = old + alpha; + float E_right = as_scalar(g.forward()); + float g = (E_right - E_left) / (2 * alpha); + float f = fabs(g - ag.v[i]); + float m = max(fabs(g), fabs(ag.v[i])); + if (f > 0.1) { + if (m > 0.f) f /= m; + if (f > 0.1) { flag = true; cerr << "*** "; } + } + cerr << ag.v[i] << ' ' << g << endl; + } + } + } + if (flag) { cerr << "\n*** GRADIENT CHECK FAILED ***\n"; } else { cerr << "\nGRADIENT CHECK PASSED\n"; } -// const vector& lookup_params = m.lookup_parameters_list(); } } From 498d1ef001f1f45d18855cb28ca39a33f44954dc Mon Sep 17 00:00:00 2001 From: Trevor Cohn Date: Mon, 3 Aug 2015 10:50:04 +1000 Subject: [PATCH 179/965] added method for finding dimensionality of hidden layer in RNN/LSTM/GRU (use in init) --- cnn/gru.h | 1 + cnn/lstm.h | 1 + cnn/rnn.h | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/cnn/gru.h b/cnn/gru.h index a0a9295f5..7d62cbf3c 100644 --- a/cnn/gru.h +++ b/cnn/gru.h @@ -17,6 +17,7 @@ struct GRUBuilder : public RNNBuilder { std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } std::vector final_s() const { return final_h(); } Expression back() const { return h.back().back(); } + unsigned num_h0_components() const override { return layers; } protected: void new_graph_impl(ComputationGraph& cg) override; diff --git a/cnn/lstm.h b/cnn/lstm.h index acea252a0..5b9253c02 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -25,6 +25,7 @@ struct LSTMBuilder : public RNNBuilder { for(auto my_h : final_h()) ret.push_back(my_h); return ret; } + unsigned num_h0_components() const override { return 2 * layers; } protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; diff --git a/cnn/rnn.h b/cnn/rnn.h index 94a53943f..67a0cba38 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -76,6 +76,8 @@ struct RNNBuilder { // access the state of each hidden layer, in a format that can be used in // start_new_sequence virtual std::vector final_s() const = 0; + + virtual unsigned num_h0_components() const = 0; protected: virtual void new_graph_impl(ComputationGraph& cg) = 0; virtual void start_new_sequence_impl(const std::vector& h_0) = 0; @@ -107,6 +109,8 @@ struct SimpleRNNBuilder : public RNNBuilder { std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } std::vector final_s() const { return final_h(); } + unsigned num_h0_components() const override { return layers; } + private: // first index is layer, then x2h h2h hb std::vector> params; From 6acd24cbd4198bcf1e561aeabc6b70ea4cdb8d7a Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 4 Aug 2015 15:42:22 -0700 Subject: [PATCH 180/965] is_valid check --- cnn/tensor.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cnn/tensor.h b/cnn/tensor.h index 4ba10ac34..2660e9894 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -39,6 +39,18 @@ struct Tensor { Eigen::Map operator*() { return Eigen::Map(v, d.rows(), d.cols()); } + // this is very slow: use sparingly + inline bool is_valid() const { +#if HAVE_CUDA + std::cerr << "is_valid() not implemented with HAVE_CUDA\n"; + abort(); +#else + const size_t s = d.size(); + for (unsigned i = 0; i < s; ++i) + if (std::isnan(v[i]) || std::isinf(v[i])) return false; + return true; +#endif + } Dim d; float* v; From 2c57a5e00e0e8870cc86f1181bea589ce520785f Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 5 Aug 2015 00:05:43 -0700 Subject: [PATCH 181/965] poisson regression loss --- cnn/expr.cc | 2 ++ cnn/expr.h | 2 ++ cnn/nodes-common.cc | 14 ++++++++++++++ cnn/nodes.cc | 18 ++++++++++++++++++ cnn/nodes.h | 23 +++++++++++++++++++++++ 5 files changed, 59 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index 0e2eb39b4..4ed221bab 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -56,6 +56,8 @@ Expression huber_distance(const Expression& x, const Expression& y, real c) { re Expression l1_distance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression binary_log_loss(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i,y.i})); } Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, m)); } +Expression poisson_loss(const Expression& x, unsigned y) { return Expression(x.pg, x.pg->add_function({x.i}, y)); } +Expression poisson_loss(const Expression& x, const unsigned* py) { return Expression(x.pg, x.pg->add_function({x.i}, py)); } Expression conv1d_narrow(const Expression& x, const Expression& f) { return Expression(x.pg, x.pg->add_function({x.i, f.i})); } Expression conv1d_wide(const Expression& x, const Expression& f) { return Expression(x.pg, x.pg->add_function({x.i, f.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 35695b349..2ff6b99cc 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -68,6 +68,8 @@ Expression huber_distance(const Expression& x, const Expression& y, float c = 1. Expression l1_distance(const Expression& x, const Expression& y); Expression binary_log_loss(const Expression& x, const Expression& y); Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0); +Expression poisson_loss(const Expression& x, unsigned y); +Expression poisson_loss(const Expression& x, const unsigned* py); // various convolutiony things Expression conv1d_narrow(const Expression& x, const Expression& f); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 0f0a80fb7..916eccbb9 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -625,6 +625,20 @@ Dim L1Distance::dim_forward(const vector& xs) const { return Dim({1}); } +string PoissonRegressionLoss::as_string(const vector& arg_names) const { + ostringstream s; + s << "-log Poisson(" << pty << "; lambda=\\exp" << arg_names[0] << ')'; + return s.str(); +} + +Dim PoissonRegressionLoss::dim_forward(const vector& xs) const { + if (xs.size() != 1 || xs[0].size() != 1) { + cerr << "Bad input dimensions in PoissonRegressionLoss: " << xs << endl; + abort(); + } + return xs[0]; +} + string SquaredEuclideanDistance::as_string(const vector& arg_names) const { ostringstream s; s << "|| " << arg_names[0] << " - " << arg_names[1] << " ||^2"; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 17c310b59..f06f5d7b6 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1111,6 +1111,24 @@ void L1Distance::backward(const vector& xs, *dEdxi += (x - y).binaryExpr(*dEdf, FL1Backward()); } +void PoissonRegressionLoss::forward(const vector& xs, Tensor& fx) const { + const auto y = *pty; + const auto z = lgamma(y + 1); + const auto x = xs[0]->v[0]; + fx.v[0] = expf(x) + z - y * x; +} + +void PoissonRegressionLoss::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + const auto x = xs[0]->v[0]; + const auto y = *pty; + auto& dEdx = dEdxi.v[0]; + dEdx += expf(x) - y; +} + void SquaredEuclideanDistance::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); #if HAVE_CUDA diff --git a/cnn/nodes.h b/cnn/nodes.h index 17bbb62cb..bdaa103cc 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -481,6 +481,29 @@ struct Average : public Node { Tensor& dEdxi) const override; }; +// this is used to implement poisson regression +// x_1 = log predicted mean +// ty = true y (this is not a VariableIndex since it has to be a nonnegative integer and +// is therefore nondifferentiable. There are various continuous extensions +// using the incomplete gamma function that could be used, but meh) +// y = log Poisson(ty; \lambda = \exp x_1) +// = ty*x_1 - exp(x_1) - log(ty!) +struct PoissonRegressionLoss : public Node { + explicit PoissonRegressionLoss(const std::initializer_list& a, unsigned true_y) : Node(a), ty(true_y), pty(&ty) {} + explicit PoissonRegressionLoss(const std::initializer_list& a, const unsigned* ptrue_y) : Node(a), ty(), pty(ptrue_y) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; + private: + unsigned ty; + const unsigned* pty; +}; + // y = || x_1 - x_2 ||^2 struct SquaredEuclideanDistance : public Node { explicit SquaredEuclideanDistance(const std::initializer_list& a) : Node(a) {} From 2790752458bdc2c0bc6a0b1c235aac7387774ea3 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 5 Aug 2015 00:53:34 -0700 Subject: [PATCH 182/965] poisson regression example --- examples/CMakeLists.txt | 2 +- examples/example-data/dev-poi.txt | 4 + examples/example-data/train-poi.txt | 200 +++++++++++++++++++++++++++ examples/poisson-regression.cc | 205 ++++++++++++++++++++++++++++ 4 files changed, 410 insertions(+), 1 deletion(-) create mode 100644 examples/example-data/dev-poi.txt create mode 100644 examples/example-data/train-poi.txt create mode 100644 examples/poisson-regression.cc diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 1fde2b0d8..1b5eca3f8 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2) +foreach(TARGET poisson-regression tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/example-data/dev-poi.txt b/examples/example-data/dev-poi.txt new file mode 100644 index 000000000..ac1251ea5 --- /dev/null +++ b/examples/example-data/dev-poi.txt @@ -0,0 +1,4 @@ + i 'll take it . ||| 5 + we want to have a table near the window . ||| 10 + how can i help you ? ||| 6 + would you , please ? ||| 5 diff --git a/examples/example-data/train-poi.txt b/examples/example-data/train-poi.txt new file mode 100644 index 000000000..10ad8e20b --- /dev/null +++ b/examples/example-data/train-poi.txt @@ -0,0 +1,200 @@ + a bag of cookies and a lemon bar . ||| 9 + sorry , i 'll take care of the dog . ||| 10 + i would like two tickets for " cats " , for this thursday . ||| 14 + to the fairmont hotel , please . ||| 7 + where is the coffee shop ? ||| 6 + i 'd like a children 's sweater . ||| 8 + my suitcase is damaged . ||| 5 + i need a claim form , please . ||| 8 + your name again ? ||| 4 + is mr. brown there ? ||| 5 + okay . it costs eighty- five cents for regular mail and three dollars and zero cents extra for special delivery . ||| 21 + can i charter a boat for a day ? ||| 9 + at which window can i make a reservation ? ||| 9 + what 's that ? ||| 4 + do i have to dress up ? ||| 7 + could you tell me how to get to the opera ? ||| 11 + were n't you a bit too intoxicated last night , honey ? ||| 12 + please follow the instructions from our staff . ||| 8 + this is it . ||| 4 + please stop here . ||| 4 + is there a department store near here ? ||| 8 + you can get it at the book store or souvenir shop . ||| 12 + full tank , please . ||| 5 + is there any cheaper room ? ||| 6 + i prefer an automatic car . ||| 6 + i 'm going to stay at the dormitory of harvard university . ||| 12 + what is today 's rate ? ||| 6 + three glasses of cherry juice , please . ||| 8 + i suffer chronically from asthma . ||| 6 + i have about three thousand dollars . ||| 7 + tonight ? i think tonight is already full , but i 'll check . ||| 14 + all right , sir . ||| 5 + it comes with a choice of french fries or rice pilaf . ||| 12 + how do i get to this place ? ||| 8 + what kind of story is it ? ||| 7 + it 's well engineered . ||| 5 + three times . ||| 3 + which window sells stamps ? ||| 5 + after he attacked me , he drove away in a white van . ||| 13 + are there any special sights ? ||| 6 + all right . ||| 3 + please keep this tag and present it when you come to pick it up . ||| 15 + i would buy this if i were you . ||| 9 + they were listening to his speech with open ears . ||| 10 + two hundred dollars . ||| 4 + how much for a night ? ||| 6 + where 's the nearest bookshop ? ||| 6 + how long is the carry over that pond ? ||| 9 + surely sir , but what happened to you ? ||| 9 + i want something that looks more natural . ||| 8 + should i avoid any types of food while taking this medicine ? ||| 12 + will i have any difficulty with the customs ? ||| 9 + do you have broad toe dress shoes ? ||| 8 + may i have some red wine ? ||| 7 + you 'll get it at the gate . ||| 8 + tell me when we get to the museum . ||| 9 + does this bus go to the sheraton hotel ? ||| 9 + what does that come to ? ||| 6 + it 's a little bit hot . ||| 7 + how many blocks from here ? ||| 6 + just a shower is okay . ||| 6 + my eyes are bloodshot . ||| 5 + no . ||| 2 + may i suggest a twin for single use instead ? we have one . ||| 14 + my car is out of order . ||| 7 + i can n't guarantee that , but we will try our best . ||| 13 + i 'd like a tight perm , please . ||| 9 + the sea was seen far below . ||| 7 + she wants a beer . ||| 5 + you need an operation . ||| 5 + more eggs , please . ||| 5 + where is the bus stop for the central park ? ||| 10 + cabs ? ||| 2 + do you have any tickets left for " miss saigon " tomorrow 's matinee ? ||| 15 + here 's your key , sir . ||| 7 + room fifty- six twelve . ||| 5 + how many tablets does it contain ? ||| 7 + i love your sweater . ||| 5 + go ahead . ||| 3 + here we are . ||| 4 + this is your hotel . ||| 5 + when 's the basketball game on ? ||| 7 + good morning . ||| 3 + i 'm afraid i will need to see some form of identification . ||| 13 + what was your impression ? ||| 5 + certainly . ||| 2 + i 'm taking flight twelve to tokyo . ||| 8 + i 'd like to make a long distance call , please . ||| 12 + five months . ||| 3 + it is slow . ||| 4 + can i get a beer , please ? i 'd like another beer . ||| 14 + i 'd like a dual- voltage shaver , please . ||| 10 + to new york ? ||| 4 + what days of the week does it take place ? ||| 10 + what kind of dressing ? ||| 5 + this is rather cold . ||| 5 + my gums are very sore . ||| 6 + i 'd like some styling gel . ||| 7 + sorry , this space is already taken . ||| 8 + can we see a menu ? ||| 6 + my size is six . ||| 5 + i 'm all right . ||| 5 + thank you , that 's enough . ||| 7 + any taxi would not stop unless you wait for them at the taxi stand . ||| 15 + my budget is under fifty dollars for a night . ||| 10 + will you take a picture together with me ? ||| 9 + how much is the service charge ? ||| 7 + did the turnover in north america rise by more than five percent ? ||| 13 + where is the women 's clothing department ? ||| 8 + who 's your best friend ? ||| 6 + you did n't happen to be around the corner of twelfth and g about eight thirty tonight , did you ? ||| 21 + did you know that one of the grand champions of sumo , a kind of traditional japanese- style wrestling , is an american ? ||| 24 + health- sports day october tenth is a national holiday designed to promote the health of the people . ||| 18 + is this for wall street ? ||| 6 + i 'd like to rent it from the fifth to the tenth of december . ||| 15 + i left my valuables in the safety deposit box in my room . ||| 13 + all right . ||| 3 + do you want me to check under the hood ? ||| 10 + hello , i 'd like to make a reservation for two in july from the twenty- seventh through the thirty- first . ||| 22 + do you want the collision damage waiver and personal accident insurance ? ||| 12 + sugar ? ||| 2 + can i pay with master card ? ||| 7 + the keys go here . ||| 5 + is this the place to pick up the baggage for nw nine o seven ? ||| 15 + i 'll have this brand . ||| 6 + can you recommend a good nightclub ? ||| 7 + guess who i ran into yesterday ? ||| 7 + there is a very good indian restaurant near the subway station . ||| 12 + i 'd like a carafe of red wine , please . ||| 11 + i 'm so happy to have been able to come to this country . ||| 14 + my name and address are on it . ||| 8 + could you help me find my suitcase ? ||| 8 + what kind of stone is this ? ||| 7 + i 'd like to point out that our government is being unkind to the so- called boat people . ||| 19 + i realize that japan is already much too over- populated to let in those uninvited guests . ||| 17 + but , on the other hand , many sectors of our industry need manual labor resources . ||| 17 + from that mountain , you can see the whole city . ||| 11 + during this season , many different kinds of flowers are blooming . ||| 12 + they are very beautiful . ||| 5 + more fruit , please . ||| 5 + do you have a sunshade ? ||| 6 + okay. you can try on or hold them if you want . ||| 12 + follow me . ||| 3 + i think i left it near the cashier . ||| 9 + no , they tend to pamper their children . ||| 9 + some japanese parents can n't say no to them . ||| 10 + i enjoyed my stay with you . ||| 7 + please tell him that yamada called . ||| 7 + how can i get to the twin towers by subway ? ||| 11 + okay . thank you . ||| 5 + please take your key with you when you go out , sir . ||| 13 + would you make arrangements in advance ? ||| 7 + i would like a reservation for two , please . ||| 10 + i 'd like a cigarette lighter . ||| 7 + all right , please fill out this information here . ||| 10 + which would you like , beef , chicken or fish ? ||| 11 + we 'd like to make a reservation for two for the tour . ||| 13 + is it possible to take different routes going and coming back ? ||| 12 + is there a snack bar here ? ||| 7 + excuse me , sir . ||| 5 + i 'd like to do some sightseeing in boston . ||| 10 + sorry to bother you , but will we make it before the game starts ? ||| 15 + can i listen to this cassette ? ||| 7 + do you have a menu in japanese ? ||| 8 + service . ||| 2 + recently my complexion is dull and foundation does n't hold . ||| 11 + it 's five after one . ||| 6 + can you shorten the waist ? ||| 6 + this is not our order . ||| 6 + i think it 's for the next table . ||| 9 + i 'm being helped . ||| 5 + thank you . ||| 3 + i 'd like a pain- killer . ||| 7 + who is your favorite actress ? ||| 6 + i 'd like an oval one . ||| 7 + what sort of music do they play there ? ||| 9 + i do n't like the color . ||| 7 + show me another one , please . ||| 7 + where 's the nearest casino ? ||| 6 + planes are by far the most convenient for trips from tokyo to hokkaido , shikoku and kyushu . ||| 18 + please take me to the morning market . ||| 8 + to the ford museum , please . ||| 7 + the frame of my glasses is broken . ||| 8 + there are so many shopping centers . ||| 7 + from three o 'clock . ||| 5 + can i exchange the battery ? ||| 6 + great . ||| 2 + i have a window seat . ||| 6 + uh , if you 'd like to trade seats later , miss . ||| 13 + where is the closest hospital from here ? ||| 8 + i hope you 'll like it . ||| 7 + i enjoyed the sightseeing of new york yesterday . ||| 9 + i 'm interested in the blue handbag in the window . ||| 11 + it 's eight dollars a person . ||| 7 + contact your landlord when you have any problems . ||| 9 + give me a shampoo and style it as it is now , please . ||| 14 + there 's no more soap . ||| 6 + when you get there , ask someone else , please . ||| 11 + mr. aoki. yes , a single room for two nights ? ||| 11 + please tell me the fastest way to go to san francisco . ||| 12 diff --git a/examples/poisson-regression.cc b/examples/poisson-regression.cc new file mode 100644 index 000000000..10575b29f --- /dev/null +++ b/examples/poisson-regression.cc @@ -0,0 +1,205 @@ +#include "cnn/grad-check.h" +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/timing.h" +#include "cnn/rnn.h" +#include "cnn/gru.h" +#include "cnn/deep-lstm.h" +#include "cnn/lstm.h" +#include "cnn/dict.h" +# include "cnn/expr.h" + +#include +#include +#include + +#include +#include + +using namespace std; +using namespace cnn; + +unsigned LAYERS = 2; +unsigned INPUT_DIM = 16; //256 +unsigned HIDDEN_DIM = 32; // 1024 +unsigned VOCAB_SIZE = 0; + +cnn::Dict d; +int kSOS; +int kEOS; + +template +struct RNNLengthPredictor { + LookupParameters* p_c; + Parameters* p_R; + Parameters* p_bias; + Builder builder; + explicit RNNLengthPredictor(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({1, HIDDEN_DIM}); + p_bias = model.add_parameters({1}); + } + + // return Expression of total loss + Expression BuildLMGraph(const vector& sent, unsigned len, ComputationGraph& cg, bool flag = false) { + const unsigned slen = sent.size() - 1; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + Expression R = parameter(cg, p_R); + Expression bias = parameter(cg, p_bias); + vector errs; + for (unsigned t = 0; t < slen; ++t) { + Expression i_x_t = lookup(cg, p_c, sent[t]); + // y_t = RNN(x_t) + builder.add_input(i_x_t); + } + Expression pred = affine_transform({bias, R, builder.back()}); + if (flag) { + unsigned x = exp(as_scalar(cg.incremental_forward())); + cerr << "PRED=" << x << " TRUE=" << len << "\t(DIFF=" << ((int)x - (int)len) << ")" << endl; + } + return poisson_loss(pred, len); + } +}; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.Convert(""); + kEOS = d.Convert(""); + vector,unsigned>> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + Dict td; + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + vector x, ty; + ReadSentencePair(line, &x, &d, &ty, &td); + assert(ty.size() == 1); + const string& v = td.Convert(ty[0]); + for(auto c : v) { assert(c >= '0' && c <= '9'); } + unsigned y = atoi(v.c_str()); + training.push_back(make_pair(x,y)); + ttoks += training.back().first.size(); + if (training.back().first.front() != kSOS && training.back().first.back() != kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + d.Freeze(); // no new word types allowed + VOCAB_SIZE = d.size(); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + Dict td; + while(getline(in, line)) { + ++dlc; + vector x, ty; + ReadSentencePair(line, &x, &d, &ty, &td); + assert(ty.size() == 1); + const string& v = td.Convert(ty[0]); + for(auto c : v) { assert(c >= '0' && c <= '9'); } + unsigned y = atoi(v.c_str()); + dev.push_back(make_pair(x,y)); + dtoks += dev.back().first.size(); + if (dev.back().first.front() != kSOS && dev.back().first.back() != kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + ostringstream os; + os << "lm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + Trainer* sgd = nullptr; + sgd = new SimpleSGDTrainer(&model); + + RNNLengthPredictor lm(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 20; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& sent = training[order[si]]; + ++si; + lm.BuildLMGraph(sent.first, sent.second, cg); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(); + ++lines; + ++chars; + } + sgd->status(); + cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + int dchars = 0; + for (auto& sent : dev) { + ComputationGraph cg; + lm.BuildLMGraph(sent.first, sent.second, cg, true); + dloss += as_scalar(cg.forward()); + dchars++; + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } + } + delete sgd; +} + From cd60f9298e1e304886fe096499561fd15602eaec Mon Sep 17 00:00:00 2001 From: armatthews Date: Wed, 5 Aug 2015 20:25:25 -0400 Subject: [PATCH 183/965] A first stab at multiprocessing --- examples/mp.cc | 162 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 examples/mp.cc diff --git a/examples/mp.cc b/examples/mp.cc new file mode 100644 index 000000000..fa6480b88 --- /dev/null +++ b/examples/mp.cc @@ -0,0 +1,162 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/gpu-ops.h" +#include "cnn/expr.h" +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace cnn; +using namespace cnn::expr; + +const unsigned num_children = 10; +struct Workload { + pid_t pid; + unsigned start; + unsigned end; + int pipe[2]; +}; + +vector> ReadData(string filename) { + vector> data; + ifstream fs(filename); + string line; + while (getline(fs, line)) { + vector parts; + boost::split(parts, line, boost::is_any_of("\t")); + data.push_back(make_pair(atof(parts[0].c_str()), atof(parts[1].c_str()))); + } + return data; +} + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + + if (argc < 2) { + cerr << "Usage: " << argv[0] << " data.txt" << endl; + cerr << "Where data.txt contains tab-delimited pairs of floats." << endl; + return 1; + } + vector> data = ReadData(argv[1]); + + Model model; + AdamTrainer sgd(&model, 0.0); + + ComputationGraph cg; + + Parameters* m_param = model.add_parameters({1, 1}); + Parameters* b_param = model.add_parameters({1}); + Expression m = parameter(cg, m_param); + Expression b = parameter(cg, b_param); + + cnn::real x_value, y_value; + Expression x = input(cg, &x_value); + Expression y_star = input(cg, &y_value); + Expression y = m * x + b; + Expression loss = squared_distance(y, y_star); + + // train the parameters + for (unsigned iter = 0; true; ++iter) { + random_shuffle(data.begin(), data.end()); + Workload workloads[num_children]; + pid_t pid; + unsigned cid = 0; + for (cid = 0; cid < num_children; cid++) { + unsigned start = (unsigned)(1.0 * cid / num_children * data.size() + 0.5); + unsigned end = (unsigned)(1.0 * (cid + 1) / num_children * data.size() + 0.5); + workloads[cid].start = start; + workloads[cid].end = end; + pipe(workloads[cid].pipe); + pid = fork(); + if (pid == 0 || pid == -1) { + break; + } + workloads[cid].pid = pid; + //cerr << "work load for child " << cid << " (pid=" << workloads[cid].pid << ") is from " << workloads[cid].start << " to " << workloads[cid].end << endl; + } + + if (pid == -1) { + cerr << "Fork failed. Exiting ..."; + return 1; + } + else if (pid == 0) { + assert (cid >= 0 && cid < num_children); + unsigned start = workloads[cid].start; + unsigned end = workloads[cid].end; + assert (start < end); + assert (end <= data.size()); + + cnn::real m_start = as_scalar(m.value()); + cnn::real b_start = as_scalar(b.value()); + + // Actually do the training thing + cnn::real loss = 0; + for (auto it = data.begin() + start; it != data.begin() + end; ++it) { + auto p = *it; + x_value = get<0>(p); + y_value = get<1>(p); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd.update(1.0); + } + loss /= data.size(); + + cnn::real m_end = as_scalar(m.value()); + cnn::real b_end = as_scalar(b.value()); + //cerr << "pid = " << getpid() << "\t" << "iter = " << iter << "\t" << "loss = " << loss << "\tm = " << m_end << "/" << m_start << "\tb = " << b_end << "/" << b_start << endl; + //cerr << iter << "\t" << "loss = " << loss << "\tm = " << m_end << "\tb = " << b_end << endl; + + write(workloads[cid].pipe[1], (char*)&m_end, sizeof(cnn::real)); + write(workloads[cid].pipe[1], (char*)&b_end, sizeof(cnn::real)); + write(workloads[cid].pipe[1], (char*)&loss, sizeof(cnn::real)); + return 0; + } + else { + // Send the start and end indices ot the child + char buf[256]; + vector m_values; + vector b_values; + vector loss_values; + for(unsigned cid = 0; cid < num_children; ++cid) { + // Read the new m and b values from the child + cnn::real m, b, loss; + read(workloads[cid].pipe[0], (char*)&m, sizeof(cnn::real)); + read(workloads[cid].pipe[0], (char*)&b, sizeof(cnn::real)); + read(workloads[cid].pipe[0], (char*)&loss, sizeof(cnn::real)); + m_values.push_back(m); + b_values.push_back(b); + loss_values.push_back(loss); + // Wait until the child dies + wait(NULL); + } + cnn::real m = 0.0; + cnn::real b = 0.0; + cnn::real loss = 0.0; + for (unsigned i = 0; i < m_values.size(); ++i) { + m += m_values[i]; + b += b_values[i]; + loss += loss_values[i]; + } + m /= m_values.size(); + b /= b_values.size(); + + // Update parameters to use the new m and b values + TensorTools::SetElements(m_param->values, {m}); + TensorTools::SetElements(b_param->values, {b}); + sgd.update_epoch(); + cerr << iter << "\t" << "loss = " << loss << "\tm = " << m << "\tb = " << b << endl; + } + } +} + From 67a9078bf61d8964d0ad4f8ada7c4970dae13eb7 Mon Sep 17 00:00:00 2001 From: armatthews Date: Wed, 5 Aug 2015 20:25:49 -0400 Subject: [PATCH 184/965] Added mp to cmakelists.txt --- examples/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 1fde2b0d8..871944fa4 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2) +foreach(TARGET tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2 mp) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) From f5fce80fb0c54ec2a9bf46e97fd610f1aaaf6bdd Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 5 Aug 2015 17:39:32 -0700 Subject: [PATCH 185/965] tensor contraction --- cnn/expr.cc | 2 ++ cnn/expr.h | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index 4ed221bab..4757ed37a 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -27,6 +27,8 @@ Expression operator*(const Expression& x, const Expression& y) { return Expressi Expression operator*(const Expression& x, float y) { return Expression(x.pg, x.pg->add_function({x.i}, y)); } Expression cdiv(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression colwise_add(const Expression& x, const Expression& bias) { return Expression(x.pg, x.pg->add_function({x.i, bias.i})); } +Expression contract3d_1d(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } +Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b) { return Expression(x.pg, x.pg->add_function({x.i, y.i, b.i})); } Expression tanh(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 2ff6b99cc..948500e71 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -38,6 +38,10 @@ inline Expression operator/(const Expression& x, float y) { return x * (1.f / y) // componentwise division Expression cdiv(const Expression& x, const Expression& y); Expression colwise_add(const Expression& x, const Expression& bias); +// z_ij = x_ijk * y_k +Expression contract3d_1d(const Expression& x, const Expression& y); +// z_ij = x_ijk * y_k + b_ij +Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b); Expression tanh(const Expression& x); Expression exp(const Expression& x); From ccd3b4de3a94a6e59c4c790e79d4a1f59a849f16 Mon Sep 17 00:00:00 2001 From: armatthews Date: Thu, 6 Aug 2015 13:21:32 -0400 Subject: [PATCH 186/965] These things really ought to be unsigned --- cnn/init.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cnn/init.cc b/cnn/init.cc index 522abe4c4..599ccaa3e 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -33,11 +33,11 @@ void Initialize(int& argc, char**& argv) { *kSCALAR_ZERO = 0; #endif random_device rd; -// rndeng = new mt19937(1); + //rndeng = new mt19937(1); rndeng = new mt19937(rd()); cerr << "Allocating memory...\n"; - fxs = new AlignedMemoryPool(512*(1<<20)); - dEdfs = new AlignedMemoryPool(512*(1<<20)); + fxs = new AlignedMemoryPool(512UL*(1UL<<20)); + dEdfs = new AlignedMemoryPool(512UL*(1UL<<20)); cerr << "Done.\n"; } From be067c5d52a9bb508cb543219bb0507bedbd9cfb Mon Sep 17 00:00:00 2001 From: armatthews Date: Thu, 6 Aug 2015 13:42:56 -0400 Subject: [PATCH 187/965] Some cleanup --- examples/mp.cc | 59 +++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/examples/mp.cc b/examples/mp.cc index fa6480b88..f3b3a83ec 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -28,11 +28,29 @@ struct Workload { int pipe[2]; }; +struct ModelParameters { + Parameters* m; + Parameters* b; +}; + +void BuildComputationGraph(ComputationGraph& cg, ModelParameters& model_parameters, cnn::real* x_value, cnn::real* y_value) { + Expression m = parameter(cg, model_parameters.m); + Expression b = parameter(cg, model_parameters.b); + + Expression x = input(cg, x_value); + Expression y_star = input(cg, y_value); + Expression y = m * x + b; + Expression loss = squared_distance(y, y_star); +} + vector> ReadData(string filename) { vector> data; ifstream fs(filename); string line; while (getline(fs, line)) { + if (line.size() > 0 && line[0] == '#') { + continue; + } vector parts; boost::split(parts, line, boost::is_any_of("\t")); data.push_back(make_pair(atof(parts[0].c_str()), atof(parts[1].c_str()))); @@ -49,27 +67,22 @@ int main(int argc, char** argv) { return 1; } vector> data = ReadData(argv[1]); + vector workloads(num_children); Model model; AdamTrainer sgd(&model, 0.0); ComputationGraph cg; - + cnn::real x_value, y_value; Parameters* m_param = model.add_parameters({1, 1}); Parameters* b_param = model.add_parameters({1}); - Expression m = parameter(cg, m_param); - Expression b = parameter(cg, b_param); + ModelParameters model_params = {m_param, b_param}; + BuildComputationGraph(cg, model_params, &x_value, &y_value); - cnn::real x_value, y_value; - Expression x = input(cg, &x_value); - Expression y_star = input(cg, &y_value); - Expression y = m * x + b; - Expression loss = squared_distance(y, y_star); // train the parameters for (unsigned iter = 0; true; ++iter) { random_shuffle(data.begin(), data.end()); - Workload workloads[num_children]; pid_t pid; unsigned cid = 0; for (cid = 0; cid < num_children; cid++) { @@ -79,27 +92,24 @@ int main(int argc, char** argv) { workloads[cid].end = end; pipe(workloads[cid].pipe); pid = fork(); - if (pid == 0 || pid == -1) { + if (pid == -1) { + cerr << "Fork failed. Exiting ..."; + return 1; + } + else if (pid == 0) { + // children shouldn't continue looping break; } workloads[cid].pid = pid; - //cerr << "work load for child " << cid << " (pid=" << workloads[cid].pid << ") is from " << workloads[cid].start << " to " << workloads[cid].end << endl; } - if (pid == -1) { - cerr << "Fork failed. Exiting ..."; - return 1; - } - else if (pid == 0) { + if (pid == 0) { assert (cid >= 0 && cid < num_children); unsigned start = workloads[cid].start; unsigned end = workloads[cid].end; assert (start < end); assert (end <= data.size()); - cnn::real m_start = as_scalar(m.value()); - cnn::real b_start = as_scalar(b.value()); - // Actually do the training thing cnn::real loss = 0; for (auto it = data.begin() + start; it != data.begin() + end; ++it) { @@ -112,10 +122,8 @@ int main(int argc, char** argv) { } loss /= data.size(); - cnn::real m_end = as_scalar(m.value()); - cnn::real b_end = as_scalar(b.value()); - //cerr << "pid = " << getpid() << "\t" << "iter = " << iter << "\t" << "loss = " << loss << "\tm = " << m_end << "/" << m_start << "\tb = " << b_end << "/" << b_start << endl; - //cerr << iter << "\t" << "loss = " << loss << "\tm = " << m_end << "\tb = " << b_end << endl; + cnn::real m_end = as_scalar(model_params.m->values); + cnn::real b_end = as_scalar(model_params.b->values); write(workloads[cid].pipe[1], (char*)&m_end, sizeof(cnn::real)); write(workloads[cid].pipe[1], (char*)&b_end, sizeof(cnn::real)); @@ -123,13 +131,10 @@ int main(int argc, char** argv) { return 0; } else { - // Send the start and end indices ot the child - char buf[256]; vector m_values; vector b_values; vector loss_values; for(unsigned cid = 0; cid < num_children; ++cid) { - // Read the new m and b values from the child cnn::real m, b, loss; read(workloads[cid].pipe[0], (char*)&m, sizeof(cnn::real)); read(workloads[cid].pipe[0], (char*)&b, sizeof(cnn::real)); @@ -137,9 +142,9 @@ int main(int argc, char** argv) { m_values.push_back(m); b_values.push_back(b); loss_values.push_back(loss); - // Wait until the child dies wait(NULL); } + cnn::real m = 0.0; cnn::real b = 0.0; cnn::real loss = 0.0; From 5ebdb9b64ee2ccefb01ddefd95eefcb5a7c88c1a Mon Sep 17 00:00:00 2001 From: armatthews Date: Thu, 6 Aug 2015 14:16:03 -0400 Subject: [PATCH 188/965] Factored parent and child process code into methods --- examples/mp.cc | 176 +++++++++++++++++++++++++++---------------------- 1 file changed, 97 insertions(+), 79 deletions(-) diff --git a/examples/mp.cc b/examples/mp.cc index f3b3a83ec..f8b84b975 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -20,7 +20,9 @@ using namespace std; using namespace cnn; using namespace cnn::expr; -const unsigned num_children = 10; +typedef pair Datum; + +const unsigned num_children = 2; struct Workload { pid_t pid; unsigned start; @@ -43,8 +45,8 @@ void BuildComputationGraph(ComputationGraph& cg, ModelParameters& model_paramete Expression loss = squared_distance(y, y_star); } -vector> ReadData(string filename) { - vector> data; +vector ReadData(string filename) { + vector data; ifstream fs(filename); string line; while (getline(fs, line)) { @@ -58,6 +60,86 @@ vector> ReadData(string filename) { return data; } +unsigned SpawnChildren(vector& workloads) { + assert (workloads.size() == num_children); + pid_t pid; + unsigned cid; + for (cid = 0; cid < num_children; ++cid) { + pid = fork(); + if (pid == -1) { + cerr << "Fork failed. Exiting ..."; + return 1; + } + else if (pid == 0) { + // children shouldn't continue looping + break; + } + workloads[cid].pid = pid; + } + return cid; +} + +int RunChild(unsigned cid, ComputationGraph& cg, Trainer* trainer, vector& workloads, + const vector& data, cnn::real& x_value, cnn::real& y_value, ModelParameters& model_params) { + assert (cid >= 0 && cid < num_children); + unsigned start = workloads[cid].start; + unsigned end = workloads[cid].end; + assert (start < end); + assert (end <= data.size()); + + cnn::real loss = 0; + for (auto it = data.begin() + start; it != data.begin() + end; ++it) { + auto p = *it; + x_value = get<0>(p); + y_value = get<1>(p); + loss += as_scalar(cg.forward()); + cg.backward(); + trainer->update(1.0); + } + loss /= (end - start); + + cnn::real m_end = as_scalar(model_params.m->values); + cnn::real b_end = as_scalar(model_params.b->values); + + write(workloads[cid].pipe[1], (char*)&m_end, sizeof(cnn::real)); + write(workloads[cid].pipe[1], (char*)&b_end, sizeof(cnn::real)); + write(workloads[cid].pipe[1], (char*)&loss, sizeof(cnn::real)); + return 0; +} + +void RunParent(unsigned iter, vector& workloads, ModelParameters& model_params, Trainer* trainer) { + vector m_values; + vector b_values; + vector loss_values; + for(unsigned cid = 0; cid < num_children; ++cid) { + cnn::real m, b, loss; + read(workloads[cid].pipe[0], (char*)&m, sizeof(cnn::real)); + read(workloads[cid].pipe[0], (char*)&b, sizeof(cnn::real)); + read(workloads[cid].pipe[0], (char*)&loss, sizeof(cnn::real)); + m_values.push_back(m); + b_values.push_back(b); + loss_values.push_back(loss); + wait(NULL); + } + + cnn::real m = 0.0; + cnn::real b = 0.0; + cnn::real loss = 0.0; + for (unsigned i = 0; i < m_values.size(); ++i) { + m += m_values[i]; + b += b_values[i]; + loss += loss_values[i]; + } + m /= m_values.size(); + b /= b_values.size(); + + // Update parameters to use the new m and b values + TensorTools::SetElements(model_params.m->values, {m}); + TensorTools::SetElements(model_params.b->values, {b}); + trainer->update_epoch(); + cerr << iter << "\t" << "loss = " << loss << "\tm = " << m << "\tb = " << b << endl; +} + int main(int argc, char** argv) { cnn::Initialize(argc, argv); @@ -66,7 +148,7 @@ int main(int argc, char** argv) { cerr << "Where data.txt contains tab-delimited pairs of floats." << endl; return 1; } - vector> data = ReadData(argv[1]); + vector data = ReadData(argv[1]); vector workloads(num_children); Model model; @@ -79,88 +161,24 @@ int main(int argc, char** argv) { ModelParameters model_params = {m_param, b_param}; BuildComputationGraph(cg, model_params, &x_value, &y_value); + for (unsigned cid = 0; cid < num_children; cid++) { + unsigned start = (unsigned)(1.0 * cid / num_children * data.size() + 0.5); + unsigned end = (unsigned)(1.0 * (cid + 1) / num_children * data.size() + 0.5); + workloads[cid].start = start; + workloads[cid].end = end; + pipe(workloads[cid].pipe); + } // train the parameters for (unsigned iter = 0; true; ++iter) { random_shuffle(data.begin(), data.end()); - pid_t pid; - unsigned cid = 0; - for (cid = 0; cid < num_children; cid++) { - unsigned start = (unsigned)(1.0 * cid / num_children * data.size() + 0.5); - unsigned end = (unsigned)(1.0 * (cid + 1) / num_children * data.size() + 0.5); - workloads[cid].start = start; - workloads[cid].end = end; - pipe(workloads[cid].pipe); - pid = fork(); - if (pid == -1) { - cerr << "Fork failed. Exiting ..."; - return 1; - } - else if (pid == 0) { - // children shouldn't continue looping - break; - } - workloads[cid].pid = pid; - } + unsigned cid = SpawnChildren(workloads); - if (pid == 0) { - assert (cid >= 0 && cid < num_children); - unsigned start = workloads[cid].start; - unsigned end = workloads[cid].end; - assert (start < end); - assert (end <= data.size()); - - // Actually do the training thing - cnn::real loss = 0; - for (auto it = data.begin() + start; it != data.begin() + end; ++it) { - auto p = *it; - x_value = get<0>(p); - y_value = get<1>(p); - loss += as_scalar(cg.forward()); - cg.backward(); - sgd.update(1.0); - } - loss /= data.size(); - - cnn::real m_end = as_scalar(model_params.m->values); - cnn::real b_end = as_scalar(model_params.b->values); - - write(workloads[cid].pipe[1], (char*)&m_end, sizeof(cnn::real)); - write(workloads[cid].pipe[1], (char*)&b_end, sizeof(cnn::real)); - write(workloads[cid].pipe[1], (char*)&loss, sizeof(cnn::real)); - return 0; + if (cid < num_children) { + return RunChild(cid, cg, &sgd, workloads, data, x_value, y_value, model_params); } else { - vector m_values; - vector b_values; - vector loss_values; - for(unsigned cid = 0; cid < num_children; ++cid) { - cnn::real m, b, loss; - read(workloads[cid].pipe[0], (char*)&m, sizeof(cnn::real)); - read(workloads[cid].pipe[0], (char*)&b, sizeof(cnn::real)); - read(workloads[cid].pipe[0], (char*)&loss, sizeof(cnn::real)); - m_values.push_back(m); - b_values.push_back(b); - loss_values.push_back(loss); - wait(NULL); - } - - cnn::real m = 0.0; - cnn::real b = 0.0; - cnn::real loss = 0.0; - for (unsigned i = 0; i < m_values.size(); ++i) { - m += m_values[i]; - b += b_values[i]; - loss += loss_values[i]; - } - m /= m_values.size(); - b /= b_values.size(); - - // Update parameters to use the new m and b values - TensorTools::SetElements(m_param->values, {m}); - TensorTools::SetElements(b_param->values, {b}); - sgd.update_epoch(); - cerr << iter << "\t" << "loss = " << loss << "\tm = " << m << "\tb = " << b << endl; + RunParent(iter, workloads, model_params, &sgd); } } } From 51d1369e25ab28f00c9f525c576891fae76ec41b Mon Sep 17 00:00:00 2001 From: armatthews Date: Thu, 6 Aug 2015 15:04:16 -0400 Subject: [PATCH 189/965] more minor cleanup --- examples/mp.cc | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/examples/mp.cc b/examples/mp.cc index f8b84b975..2a920297f 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -1,7 +1,5 @@ -#include "cnn/nodes.h" #include "cnn/cnn.h" #include "cnn/training.h" -#include "cnn/gpu-ops.h" #include "cnn/expr.h" #include #include @@ -21,8 +19,22 @@ using namespace cnn; using namespace cnn::expr; typedef pair Datum; - const unsigned num_children = 2; + +cnn::real ReadReal(int pipe) { + cnn::real v; + read(pipe, &v, sizeof(cnn::real)); + return v; +} + +void WriteReal(int pipe, cnn::real v) { + write(pipe, &v, sizeof(cnn::real)); +} + +cnn::real Mean(const vector& values) { + return accumulate(values.begin(), values.end(), 0.0) / values.size(); +} + struct Workload { pid_t pid; unsigned start; @@ -111,26 +123,24 @@ void RunParent(unsigned iter, vector& workloads, ModelParameters& mode vector m_values; vector b_values; vector loss_values; - for(unsigned cid = 0; cid < num_children; ++cid) { - cnn::real m, b, loss; - read(workloads[cid].pipe[0], (char*)&m, sizeof(cnn::real)); - read(workloads[cid].pipe[0], (char*)&b, sizeof(cnn::real)); - read(workloads[cid].pipe[0], (char*)&loss, sizeof(cnn::real)); + for(unsigned cid = 0; cid < num_children; ++cid) { + cnn::real m = ReadReal(workloads[cid].pipe[0]); + cnn::real b = ReadReal(workloads[cid].pipe[0]); + cnn::real loss = ReadReal(workloads[cid].pipe[0]); m_values.push_back(m); b_values.push_back(b); loss_values.push_back(loss); wait(NULL); } - cnn::real m = 0.0; + cnn::real m = Mean(m_values); cnn::real b = 0.0; cnn::real loss = 0.0; for (unsigned i = 0; i < m_values.size(); ++i) { - m += m_values[i]; b += b_values[i]; loss += loss_values[i]; } - m /= m_values.size(); + b /= b_values.size(); // Update parameters to use the new m and b values From fcb78a8b89664a9c61dba501180a3473b92fb6b1 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 7 Aug 2015 00:07:04 +0000 Subject: [PATCH 190/965] fix broken fastpow2 --- cnn/functors.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cnn/functors.h b/cnn/functors.h index b3c3ad93d..3c3160cbd 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -16,6 +16,8 @@ #define cast_uint32_t static_cast +// THIS CODE IS BROKEN- sometimes it returns NaN +// it is commented out for this reason static inline float fastpow2 (float p) { float offset = (p < 0) ? 1.0f : 0.0f; float clipp = (p < -126) ? -126.0f : p; @@ -27,10 +29,16 @@ static inline float fastpow2 (float p) { } #if 1 +#if 0 static inline float fastexp (float p) { return fastpow2 (1.442695040f * p); } #else +static inline float fastexp (float p) { + return exp(p); +} +#endif +#else // Schraudolph version, but it's a bit crappy in terms of // performance and not that much faster #define EXPAF (8388608 / 0.6931471806f) From 4a44a85ee4c9af8da76f29376019cd9b4b0b4b12 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 6 Aug 2015 21:50:40 -0700 Subject: [PATCH 191/965] fix for a couple distance bugs --- cnn/functors.h | 9 ++++++--- cnn/nodes.cc | 15 ++++++++++----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/cnn/functors.h b/cnn/functors.h index 3c3160cbd..e1275340f 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -77,18 +77,21 @@ template int sgn(T val) { } struct FL1Backward { - CNN_DEVICE_FUNC inline float operator()(float x, float d) const { + FL1Backward(float d) : d(d) {} + CNN_DEVICE_FUNC inline float operator()(float x) const { return sgn(x) * d; } + const float d; }; struct FHuberBackward { - FHuberBackward(float c) : c(c) {} - CNN_DEVICE_FUNC inline float operator()(float x, float d) const { + FHuberBackward(float c, float dEdf) : c(c), d(dEdf) {} + CNN_DEVICE_FUNC inline float operator()(float x) const { const float a = fabs(x); return (2 * d) * ((a < c) ? x : c * sgn(x)); } const float c; + const float d; }; struct FProduct { diff --git a/cnn/nodes.cc b/cnn/nodes.cc index f06f5d7b6..e64d4b3fb 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1077,9 +1077,14 @@ void Rectify::backward(const vector& xs, void HuberDistance::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); - auto x = **xs[0]; - auto y = **xs[1]; - *fx = (x - y).unaryExpr(FHuberForward(d)); + auto x = *xs[0]; + auto y = *xs[1]; + const FHuberForward fhf(d); + const size_t s = x.d.size(); + float dist = 0; + for (size_t i = 0; i < s; ++i) + dist += fhf(x.v[i] - y.v[i]); + fx.v[0] = dist; } void HuberDistance::backward(const vector& xs, @@ -1090,7 +1095,7 @@ void HuberDistance::backward(const vector& xs, assert(i < 2); auto x = **xs[i]; auto y = **xs[1-i]; - *dEdxi += (x - y).binaryExpr(*dEdf, FHuberBackward(d)); + *dEdxi += (x - y).unaryExpr(FHuberBackward(d, dEdf.v[0])); } void L1Distance::forward(const vector& xs, Tensor& fx) const { @@ -1108,7 +1113,7 @@ void L1Distance::backward(const vector& xs, assert(i < 2); auto x = **xs[i]; auto y = **xs[1-i]; - *dEdxi += (x - y).binaryExpr(*dEdf, FL1Backward()); + *dEdxi += (x - y).unaryExpr(FL1Backward(dEdf.v[0])); } void PoissonRegressionLoss::forward(const vector& xs, Tensor& fx) const { From a49bb96898467935881a34096eb532e7e0914ab4 Mon Sep 17 00:00:00 2001 From: armatthews Date: Fri, 7 Aug 2015 14:39:02 -0400 Subject: [PATCH 192/965] Multiprocessing example --- CMakeLists.txt | 2 +- examples/mp.cc | 228 ++++++++++++++++++++++++++++++++++--------------- 2 files changed, 162 insertions(+), 68 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3aebb8224..a4b2e2403 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # 3. try compiler options like -march=native or other architecture # flags (the compiler does not always make the best configuration # decisions without help) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funroll-loops -Wall -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -Wno-unused-local-typedefs") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funroll-loops -Wall -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -Wno-unused-local-typedefs -march=native") enable_testing() diff --git a/examples/mp.cc b/examples/mp.cc index 2a920297f..0a6107415 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -18,8 +19,18 @@ using namespace std; using namespace cnn; using namespace cnn::expr; +struct SharedObject { + cnn::real m; + cnn::real b; + cnn::real loss; + + cnn::real temp_m; + cnn::real temp_b; +}; + typedef pair Datum; -const unsigned num_children = 2; +const unsigned num_children = 4; +SharedObject* shared_memory = nullptr; cnn::real ReadReal(int pipe) { cnn::real v; @@ -31,15 +42,34 @@ void WriteReal(int pipe, cnn::real v) { write(pipe, &v, sizeof(cnn::real)); } +template +void WriteIntVector(int pipe, const vector& vec) { + unsigned length = vec.size(); + write(pipe, &length, sizeof(unsigned)); + for (T v : vec) { + write(pipe, &v, sizeof(T)); + } +} + +template +vector ReadIntVector(int pipe) { + unsigned length; + read(pipe, &length, sizeof(unsigned)); + vector vec(length); + for (unsigned i = 0; i < length; ++i) { + read(pipe, &vec[i], sizeof(T)); + } + return vec; +} + cnn::real Mean(const vector& values) { return accumulate(values.begin(), values.end(), 0.0) / values.size(); } struct Workload { pid_t pid; - unsigned start; - unsigned end; - int pipe[2]; + int c2p[2]; // Child to parent pipe + int p2c[2]; // Parent to child pipe }; struct ModelParameters { @@ -60,6 +90,10 @@ void BuildComputationGraph(ComputationGraph& cg, ModelParameters& model_paramete vector ReadData(string filename) { vector data; ifstream fs(filename); + if (!fs.is_open()) { + cerr << "ERROR: Unable to open " << filename << endl; + exit(1); + } string line; while (getline(fs, line)) { if (line.size() > 0 && line[0] == '#') { @@ -94,60 +128,110 @@ unsigned SpawnChildren(vector& workloads) { int RunChild(unsigned cid, ComputationGraph& cg, Trainer* trainer, vector& workloads, const vector& data, cnn::real& x_value, cnn::real& y_value, ModelParameters& model_params) { assert (cid >= 0 && cid < num_children); - unsigned start = workloads[cid].start; - unsigned end = workloads[cid].end; - assert (start < end); - assert (end <= data.size()); - - cnn::real loss = 0; - for (auto it = data.begin() + start; it != data.begin() + end; ++it) { - auto p = *it; - x_value = get<0>(p); - y_value = get<1>(p); - loss += as_scalar(cg.forward()); - cg.backward(); - trainer->update(1.0); - } - loss /= (end - start); + while (true) { + // Check if the parent wants us to exit + bool cont = false; + read(workloads[cid].p2c[0], &cont, sizeof(bool)); + if (!cont) { + break; + } + + // Read in our workload and update our local model + vector indices = ReadIntVector(workloads[cid].p2c[0]); + + TensorTools::SetElements(model_params.m->values, {shared_memory->m}); + TensorTools::SetElements(model_params.b->values, {shared_memory->b}); + + cnn::real loss = 0; + for (unsigned i : indices) { + assert (i < data.size()); + auto p = data[i]; + x_value = get<0>(p); + y_value = get<1>(p); + loss += as_scalar(cg.forward()); + cg.backward(); + trainer->update(1.0); + } + loss /= indices.size(); - cnn::real m_end = as_scalar(model_params.m->values); - cnn::real b_end = as_scalar(model_params.b->values); + // Get our final values of each parameter and send them back to the parent, + // along with the current loss value + cnn::real m = as_scalar(model_params.m->values); + cnn::real b = as_scalar(model_params.b->values); + shared_memory->temp_m += m; + shared_memory->temp_b += b; + shared_memory->loss += loss; - write(workloads[cid].pipe[1], (char*)&m_end, sizeof(cnn::real)); - write(workloads[cid].pipe[1], (char*)&b_end, sizeof(cnn::real)); - write(workloads[cid].pipe[1], (char*)&loss, sizeof(cnn::real)); + /*write(workloads[cid].c2p[1], (char*)&m, sizeof(cnn::real)); + write(workloads[cid].c2p[1], (char*)&b, sizeof(cnn::real)); + write(workloads[cid].c2p[1], (char*)&loss, sizeof(cnn::real));*/ + WriteReal(workloads[cid].c2p[1], 0.0); + } return 0; } -void RunParent(unsigned iter, vector& workloads, ModelParameters& model_params, Trainer* trainer) { - vector m_values; - vector b_values; - vector loss_values; - for(unsigned cid = 0; cid < num_children; ++cid) { - cnn::real m = ReadReal(workloads[cid].pipe[0]); - cnn::real b = ReadReal(workloads[cid].pipe[0]); - cnn::real loss = ReadReal(workloads[cid].pipe[0]); - m_values.push_back(m); - b_values.push_back(b); - loss_values.push_back(loss); - wait(NULL); - } +void RunParent(vector& data, vector& workloads, ModelParameters& model_params, Trainer* trainer) { + shared_memory->m = TensorTools::AccessElement(model_params.m->values, {0, 0}); + shared_memory->b = TensorTools::AccessElement(model_params.b->values, {0, 0}); - cnn::real m = Mean(m_values); - cnn::real b = 0.0; - cnn::real loss = 0.0; - for (unsigned i = 0; i < m_values.size(); ++i) { - b += b_values[i]; - loss += loss_values[i]; - } + for (unsigned iter = 0; iter < 10; ++iter) { + shared_memory->loss = 0.0; + shared_memory->temp_m = 0.0; + shared_memory->temp_b = 0.0; + /*vector m_values; + vector b_values; + vector loss_values;*/ + for(unsigned cid = 0; cid < num_children; ++cid) { + unsigned start = (unsigned)(1.0 * cid / num_children * data.size() + 0.5); + unsigned end = (unsigned)(1.0 * (cid + 1) / num_children * data.size() + 0.5); + vector indices; + indices.reserve(end - start); + for (unsigned i = start; i < end; ++i) { + indices.push_back(i); + } + bool cont = true; + write(workloads[cid].p2c[1], &cont, sizeof(bool)); + WriteIntVector(workloads[cid].p2c[1], indices); - b /= b_values.size(); + /*cnn::real m = ReadReal(workloads[cid].c2p[0]); + cnn::real b = ReadReal(workloads[cid].c2p[0]); + cnn::real loss = ReadReal(workloads[cid].c2p[0]); + m_values.push_back(m); + b_values.push_back(b); + loss_values.push_back(loss);*/ + } - // Update parameters to use the new m and b values - TensorTools::SetElements(model_params.m->values, {m}); - TensorTools::SetElements(model_params.b->values, {b}); - trainer->update_epoch(); - cerr << iter << "\t" << "loss = " << loss << "\tm = " << m << "\tb = " << b << endl; + for(unsigned cid = 0; cid < num_children; ++cid) { + ReadReal(workloads[cid].c2p[0]); + } + + /*cnn::real m = Mean(m_values); + cnn::real b = 0.0; + cnn::real loss = 0.0; + for (unsigned i = 0; i < m_values.size(); ++i) { + b += b_values[i]; + loss += loss_values[i]; + } + + b /= b_values.size();*/ + + shared_memory->m = shared_memory->temp_m / num_children; + shared_memory->b = shared_memory->temp_b / num_children; + + // Update parameters to use the new m and b values + //TensorTools::SetElements(model_params.m->values, {m}); + //TensorTools::SetElements(model_params.b->values, {b}); + trainer->update_epoch(); + //cerr << shared_memory->m << "\t" << iter << "\t" << "loss = " << loss << "\tm = " << m << "\tb = " << b << endl; + cerr << iter << "\t" << "loss = " << shared_memory->loss << "\tm = " << shared_memory->m << "\tb = " << shared_memory->b << endl; + } + + // Kill all children one by one and wait for them to exit + for (unsigned cid = 0; cid < num_children; ++cid) { + bool cont = false; + write(workloads[cid].p2c[1], &cont, sizeof(cont)); + wait(NULL); + } } int main(int argc, char** argv) { @@ -171,25 +255,35 @@ int main(int argc, char** argv) { ModelParameters model_params = {m_param, b_param}; BuildComputationGraph(cg, model_params, &x_value, &y_value); - for (unsigned cid = 0; cid < num_children; cid++) { - unsigned start = (unsigned)(1.0 * cid / num_children * data.size() + 0.5); - unsigned end = (unsigned)(1.0 * (cid + 1) / num_children * data.size() + 0.5); - workloads[cid].start = start; - workloads[cid].end = end; - pipe(workloads[cid].pipe); + unsigned shm_size = 1024; + assert (sizeof(SharedObject) < shm_size); + key_t shm_key = ftok("/home/austinma/shared", 'R'); + if (shm_key == -1) { + cerr << "Unable to get shared memory key" << endl; + return 1; } + int shm_id = shmget(shm_key, shm_size, 0644 | IPC_CREAT); + if (shm_id == -1) { + cerr << "Unable to create shared memory" << endl; + return 1; + } + void* shm_p = shmat(shm_id, nullptr, 0); + if (shm_p == (void*)-1) { + cerr << "Unable to get shared memory pointer"; + return 1; + } + shared_memory = (SharedObject*)shm_p; - // train the parameters - for (unsigned iter = 0; true; ++iter) { - random_shuffle(data.begin(), data.end()); - unsigned cid = SpawnChildren(workloads); + for (unsigned cid = 0; cid < num_children; cid++) { + pipe(workloads[cid].p2c); + pipe(workloads[cid].c2p); + } - if (cid < num_children) { - return RunChild(cid, cg, &sgd, workloads, data, x_value, y_value, model_params); - } - else { - RunParent(iter, workloads, model_params, &sgd); - } + unsigned cid = SpawnChildren(workloads); + if (cid < num_children) { + return RunChild(cid, cg, &sgd, workloads, data, x_value, y_value, model_params); + } + else { + RunParent(data, workloads, model_params, &sgd); } } - From 2f19c3129c95f021951e7c5e45b7f99fc878f251 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 11 Aug 2015 17:48:53 -0700 Subject: [PATCH 193/965] add check --- cnn/param-nodes.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index 918dc27c9..bf3d21715 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -104,6 +104,7 @@ Dim LookupNode::dim_forward(const vector& xs) const { void LookupNode::forward(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); + assert(*pindex < params->values.size()); fx.v = params->values[*pindex].v; } From 96a83241de56f01db1e5fdbf4f5c3dfd341a753f Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 12 Aug 2015 15:12:08 -0700 Subject: [PATCH 194/965] add clear() to CG --- cnn/cnn.cc | 11 ++++++++++- cnn/cnn.h | 5 +++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index ab60ec903..00ab0b5a9 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -4,6 +4,7 @@ #include "cnn/param-nodes.h" #include "cnn/aligned-mem-pool.h" #include "cnn/cnn-helper.h" +#include "cnn/expr.h" using namespace std; @@ -28,11 +29,18 @@ ComputationGraph::ComputationGraph() : last_node_evaluated(), } ComputationGraph::~ComputationGraph() { + this->clear(); delete ee; - for (auto n : nodes) delete n; --n_hgs; } +void ComputationGraph::clear() { + last_node_evaluated = VariableIndex(); + parameter_nodes.clear(); + for (auto n : nodes) delete n; + nodes.clear(); +} + VariableIndex ComputationGraph::add_input(real s) { VariableIndex new_node_index(nodes.size()); nodes.push_back(new ScalarInputNode(s)); @@ -115,6 +123,7 @@ void ComputationGraph::set_dim_for_new_node(const VariableIndex& i) { const Tensor& ComputationGraph::incremental_forward() { return ee->incremental_forward(); } const Tensor& ComputationGraph::forward() { return ee->forward(); } const Tensor& ComputationGraph::get_value(VariableIndex i) { return ee->get_value(i); } +const Tensor& ComputationGraph::get_value(const expr::Expression& e) { return this->get_value(e.i); } void ComputationGraph::invalidate() { ee->invalidate(); } void ComputationGraph::backward() { ee->backward(); } diff --git a/cnn/cnn.h b/cnn/cnn.h index 9f98eea8c..f2ff70c32 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -33,6 +33,7 @@ extern float* kSCALAR_ZERO; class ExecutionEngine; struct ParameterNodeBase; struct Node; +namespace expr { struct Expression; } BOOST_STRONG_TYPEDEF(unsigned, VariableIndex) inline void swap(VariableIndex& i1, VariableIndex& i2) { @@ -72,6 +73,9 @@ struct ComputationGraph { Args&&... side_information); template inline VariableIndex add_function(const T& arguments); + // reset ComputationGraph to a newly created state + void clear(); + // perform computations // run complete forward pass from first node to last existing one, ignoring all precomputed values. @@ -83,6 +87,7 @@ struct ComputationGraph { // performs forward evaluation if note available (may compute more than strictly // what is needed). const Tensor& get_value(VariableIndex i); + const Tensor& get_value(const expr::Expression& e); // clears forward caches (for get_value etc). void invalidate(); // computes backward gradients from the front-most evaluated node. From 75a02b0b974e1266a5a88bb546c123a7e0ffd7aa Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Fri, 14 Aug 2015 14:37:52 +0300 Subject: [PATCH 195/965] remove un-needed stuff. --- pycnn/pycnn.pxd | 2 +- pycnn/pycnn.pyx | 25 ++++++++++--------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index fd31fcaa3..adfebbd24 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -124,7 +124,7 @@ cdef extern from "cnn/training.h" namespace "cnn": cdef extern from "cnn/expr.h" namespace "cnn::expr": cdef cppclass CExpression "cnn::expr::Expression": CExpression() - CExpression(CComputationGraph *pg, long i) + CExpression(CComputationGraph *pg, VariableIndex i) CComputationGraph *pg long i #CExpression c_input "cnn::expr::input" (CComputationGraph& g, float s) # diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index fd12af8ce..afc99ed11 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -173,10 +173,9 @@ cdef class Model: def __contains__(self, name): return name in self.named_params - def parameters(self): return self.named_params.keys() - - def lookup_parameters(self): return list(self.lookups) - def regular_parameters(self): return list(self.regular) + #def parameters(self): return self.named_params.keys() + #def lookup_parameters(self): return list(self.lookups) + #def regular_parameters(self): return list(self.regular) def save(self, string fname): save_cnn_model(fname, self.thisptr) @@ -184,7 +183,6 @@ cdef class Model: def load(self, string fname): load_cnn_model(fname, self.thisptr) - # }}} # {{{ Computation Graph @@ -257,13 +255,13 @@ cdef class ComputationGraph: result = Expression.from_cexpr(self._cg_version, c_parameter(self.thisptr[0], params.thisptr)) return result - def params_from_model(self, model): - results = {} - for name in model.regular_parameters(): - results[name] = self.parameters(model[name]) - for name in model.lookup_parameters(): - results[name] = self.lookup(model[name]) - return results + #def params_from_model(self, model): + # results = {} + # for name in model.regular_parameters(): + # results[name] = self.parameters(model[name]) + # for name in model.lookup_parameters(): + # results[name] = self.lookup(model[name]) + # return results cpdef forward_scalar(self): return c_as_scalar(self.thisptr.forward()) @@ -312,9 +310,6 @@ cdef class ComputationGraph: r = _pickerExpression(self, e, v) return r - - - # }}} #{{{ Expressions From 8d6c8551ed1b625687f3fab70ba7624f9d539bc3 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Fri, 14 Aug 2015 17:36:58 +0300 Subject: [PATCH 196/965] added RNNState. --- pycnn/pycnn.pxd | 12 ++++++++++++ pycnn/pycnn.pyx | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index adfebbd24..be114f75d 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -204,10 +204,19 @@ cdef extern from "cnn/rnn.h" namespace "cnn": void new_graph(CComputationGraph &cg) void start_new_sequence(vector[CExpression] ces) CExpression add_input(CExpression &x) + CExpression add_input(CRNNPointer prev, CExpression &x) void rewind_one_step() CExpression back() vector[CExpression] final_h() vector[CExpression] final_s() + CRNNPointer prev(CRNNPointer p) + CRNNPointer state() + +cdef extern from "cnn/rnn.h" namespace "cnn": + cdef cppclass CRNNPointer "cnn::RNNPointer": + CRNNPointer() + CRNNPointer(int i) + #cdef cppclass RNNPointer cdef extern from "cnn/lstm.h" namespace "cnn": cdef cppclass CLSTMBuilder "cnn::LSTMBuilder": @@ -215,8 +224,11 @@ cdef extern from "cnn/lstm.h" namespace "cnn": void new_graph(CComputationGraph &cg) void start_new_sequence(vector[CExpression] ces) CExpression add_input(CExpression &x) + CExpression add_input(CRNNPointer prev, CExpression &x) void rewind_one_step() CExpression back() vector[CExpression] final_h() vector[CExpression] final_s() + CRNNPointer prev(CRNNPointer p) + CRNNPointer state() diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index afc99ed11..1d116d0fc 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -615,6 +615,11 @@ cdef class SimpleRNNBuilder: # {{{ ensure_freshness(e) if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") return Expression.from_cexpr(self.cg_version, self.thisptr.add_input(e.c())) + cdef Expression add_input_to_prev(self, CRNNPointer prev, Expression e): + ensure_freshness(e) + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + return Expression.from_cexpr(self.cg_version, self.thisptr.add_input(prev, e.c())) + cpdef rewind_one_step(self): if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") self.thisptr.rewind_one_step() @@ -637,6 +642,11 @@ cdef class SimpleRNNBuilder: # {{{ for cexp in cexps: res.append(Expression.from_cexpr(self.cg_version, cexp)) return res + + cpdef RNNState initial_state(self): + self.new_graph() + self.start_new_sequence() + return RNNState(self, -1) #}}} cdef class LSTMBuilder: # {{{ @@ -664,6 +674,11 @@ cdef class LSTMBuilder: # {{{ ensure_freshness(e) if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") return Expression.from_cexpr(self.cg_version, self.thisptr.add_input(e.c())) + cdef Expression add_input_to_prev(self, CRNNPointer prev, Expression e): + ensure_freshness(e) + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + return Expression.from_cexpr(self.cg_version, self.thisptr.add_input(prev, e.c())) + cpdef rewind_one_step(self): if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") self.thisptr.rewind_one_step() @@ -688,6 +703,30 @@ cdef class LSTMBuilder: # {{{ return res # }}} +cdef class RNNState: + cdef SimpleRNNBuilder builder # TODO: make RNNBuilder + cdef int state_idx + cdef RNNState _prev + cdef Expression _out + # TODO: should be callable only from C + def __cinit__(self, SimpleRNNBuilder builder, int state_idx=-1, RNNState prev_state=None, Expression out=None): + self.builder = builder + self.state_idx=state_idx + self._prev = prev_state + self._out = out + + cpdef RNNState add_input(self, Expression x): + cdef Expression res = self.builder.add_input_to_prev(CRNNPointer(self.state_idx), x) + cdef int state_idx = self.builder.thisptr.state() + # TODO: keep res? + return RNNState(self.builder, state_idx, self, res) + + cpdef int state(self): return self.state_idx + + cpdef Expression output(self): return self._out + + cpdef RNNState prev(self): return self._prev + # }}} # {{{ Training From f731c1dd5773239b13c5bd2d817626ff0f112619 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Fri, 14 Aug 2015 18:28:34 +0300 Subject: [PATCH 197/965] SimpleRNN/LSTM wrapping unified with inheritance. RNNState works with both LSTM and RNN states. rnnlm.py example modified to use the new RNNState interface. --- pycnn/pycnn.pxd | 37 ++++++++------ pycnn/pycnn.pyx | 92 ++++++++++++++--------------------- pycnn/rnnlm.py | 17 +++---- pycnn/rnnlm_builder.py | 106 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 173 insertions(+), 79 deletions(-) create mode 100644 pycnn/rnnlm_builder.py diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index be114f75d..18a9e82b8 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -196,11 +196,8 @@ cdef extern from "cnn/expr.h" namespace "cnn::expr": #cdef extern from "cnn/model.h" namespace "cnn": # cdef cppclass Model: -# TODO unify with LSTMBuilder using inheritance cdef extern from "cnn/rnn.h" namespace "cnn": - #cdef cppclass RNNBuilder "cnn::RNNBuilder": - cdef cppclass CSimpleRNNBuilder "cnn::SimpleRNNBuilder": - CSimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) + cdef cppclass CRNNBuilder "cnn::RNNBuilder": void new_graph(CComputationGraph &cg) void start_new_sequence(vector[CExpression] ces) CExpression add_input(CExpression &x) @@ -209,26 +206,38 @@ cdef extern from "cnn/rnn.h" namespace "cnn": CExpression back() vector[CExpression] final_h() vector[CExpression] final_s() - CRNNPointer prev(CRNNPointer p) CRNNPointer state() +# TODO unify with LSTMBuilder using inheritance +cdef extern from "cnn/rnn.h" namespace "cnn": + #cdef cppclass RNNBuilder "cnn::RNNBuilder": + cdef cppclass CSimpleRNNBuilder "cnn::SimpleRNNBuilder" (CRNNBuilder): + CSimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) + #void new_graph(CComputationGraph &cg) + #void start_new_sequence(vector[CExpression] ces) + #CExpression add_input(CExpression &x) + #CExpression add_input(CRNNPointer prev, CExpression &x) + #void rewind_one_step() + CExpression back() + vector[CExpression] final_h() + vector[CExpression] final_s() + #CRNNPointer state() + cdef extern from "cnn/rnn.h" namespace "cnn": cdef cppclass CRNNPointer "cnn::RNNPointer": CRNNPointer() CRNNPointer(int i) - #cdef cppclass RNNPointer cdef extern from "cnn/lstm.h" namespace "cnn": - cdef cppclass CLSTMBuilder "cnn::LSTMBuilder": + cdef cppclass CLSTMBuilder "cnn::LSTMBuilder" (CRNNBuilder): CLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) - void new_graph(CComputationGraph &cg) - void start_new_sequence(vector[CExpression] ces) - CExpression add_input(CExpression &x) - CExpression add_input(CRNNPointer prev, CExpression &x) - void rewind_one_step() + #void new_graph(CComputationGraph &cg) + #void start_new_sequence(vector[CExpression] ces) + #CExpression add_input(CExpression &x) + #CExpression add_input(CRNNPointer prev, CExpression &x) + #void rewind_one_step() CExpression back() vector[CExpression] final_h() vector[CExpression] final_s() - CRNNPointer prev(CRNNPointer p) - CRNNPointer state() + #CRNNPointer state() diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 1d116d0fc..d14789940 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -590,18 +590,23 @@ cpdef Expression affine_transform(list exprs): # {{{ RNNS / Builders # TODO: unify these with inheritance -cdef class SimpleRNNBuilder: # {{{ - cdef CSimpleRNNBuilder *thisptr +cdef class RNNBuilder: # {{{ + cdef CRNNBuilder *thisptr cdef int cg_version - def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): - self.thisptr = new CSimpleRNNBuilder(layers, input_dim, hidden_dim, model.thisptr) - self.cg_version = -1 + def __cinit_(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): + # TODO disable calling this directly. + raise RuntimeError("Cannot instantiate RNNBuilder directly.") + #def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): + # self.thisptr = 0 #new CSimpleRNNBuilder(layers, input_dim, hidden_dim, model.thisptr) + # self.cg_version = -1 + def __dealloc__(self): del self.thisptr - #cpdef new_graph(self, ComputationGraph cg): self.thisptr.new_graph(cg.thisptr[0]) + cpdef new_graph(self): self.thisptr.new_graph(_cg.thisptr[0]) self.cg_version = _cg.version() + cpdef start_new_sequence(self, es=None): if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") cdef vector[CExpression] ces = vector[CExpression]() @@ -611,10 +616,12 @@ cdef class SimpleRNNBuilder: # {{{ ensure_freshness(e) ces.push_back(e.c()) self.thisptr.start_new_sequence(ces) + cpdef Expression add_input(self, Expression e): ensure_freshness(e) if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") return Expression.from_cexpr(self.cg_version, self.thisptr.add_input(e.c())) + cdef Expression add_input_to_prev(self, CRNNPointer prev, Expression e): ensure_freshness(e) if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") @@ -623,9 +630,11 @@ cdef class SimpleRNNBuilder: # {{{ cpdef rewind_one_step(self): if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") self.thisptr.rewind_one_step() + cpdef Expression back(self): if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") return Expression.from_cexpr(self.cg_version, self.thisptr.back()) + cpdef final_h(self): if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") cdef list res = [] @@ -634,6 +643,7 @@ cdef class SimpleRNNBuilder: # {{{ for cexp in cexps: res.append(Expression.from_cexpr(self.cg_version, cexp)) return res + cpdef final_s(self): if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") cdef list res = [] @@ -648,68 +658,35 @@ cdef class SimpleRNNBuilder: # {{{ self.start_new_sequence() return RNNState(self, -1) #}}} + +cdef class SimpleRNNBuilder(RNNBuilder): # {{{ + def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): + self.thisptr = new CSimpleRNNBuilder(layers, input_dim, hidden_dim, model.thisptr) + self.cg_version = -1 + + def whoami(self): return "SimpleRNNBuilder" +#}}} -cdef class LSTMBuilder: # {{{ - cdef CLSTMBuilder *thisptr - cdef int cg_version +cdef class LSTMBuilder(RNNBuilder): # {{{ def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): self.thisptr = new CLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr) self.cg_version = -1 - def __dealloc__(self): - del self.thisptr - #cpdef new_graph(self, ComputationGraph cg): self.thisptr.new_graph(cg.thisptr[0]) - cpdef new_graph(self): - self.thisptr.new_graph(_cg.thisptr[0]) - self.cg_version = _cg.version() - cpdef start_new_sequence(self, es=None): - if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") - cdef vector[CExpression] ces = vector[CExpression]() - cdef Expression e - if es: - for e in es: - ensure_freshness(e) - ces.push_back(e.c()) - self.thisptr.start_new_sequence(ces) - cpdef Expression add_input(self, Expression e): - ensure_freshness(e) - if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") - return Expression.from_cexpr(self.cg_version, self.thisptr.add_input(e.c())) - cdef Expression add_input_to_prev(self, CRNNPointer prev, Expression e): - ensure_freshness(e) - if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") - return Expression.from_cexpr(self.cg_version, self.thisptr.add_input(prev, e.c())) - cpdef rewind_one_step(self): - if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") - self.thisptr.rewind_one_step() - cpdef Expression back(self): - if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") - return Expression.from_cexpr(self.cg_version, self.thisptr.back()) - cpdef final_h(self): - if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") - cdef list res = [] - cdef CExpression cexp - cdef vector[CExpression] cexps = self.thisptr.final_h() - for cexp in cexps: - res.append(Expression.from_cexpr(self.cg_version, cexp)) - return res - cpdef final_s(self): - if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") - cdef list res = [] - cdef CExpression cexp - cdef vector[CExpression] cexps = self.thisptr.final_s() - for cexp in cexps: - res.append(Expression.from_cexpr(self.cg_version, cexp)) - return res + def whoami(self): return "LSTMBuilder" # }}} cdef class RNNState: - cdef SimpleRNNBuilder builder # TODO: make RNNBuilder + """ + This is the main class for working with RNNs / LSTMs / GRUs. + Request an RNNState initial_state() from a builder, and then progress from there. + """ + # TODO add final_h and final_s support from builders. + cdef RNNBuilder builder cdef int state_idx cdef RNNState _prev cdef Expression _out # TODO: should be callable only from C - def __cinit__(self, SimpleRNNBuilder builder, int state_idx=-1, RNNState prev_state=None, Expression out=None): + def __cinit__(self, RNNBuilder builder, int state_idx=-1, RNNState prev_state=None, Expression out=None): self.builder = builder self.state_idx=state_idx self._prev = prev_state @@ -718,7 +695,6 @@ cdef class RNNState: cpdef RNNState add_input(self, Expression x): cdef Expression res = self.builder.add_input_to_prev(CRNNPointer(self.state_idx), x) cdef int state_idx = self.builder.thisptr.state() - # TODO: keep res? return RNNState(self.builder, state_idx, self, res) cpdef int state(self): return self.state_idx @@ -727,6 +703,8 @@ cdef class RNNState: cpdef RNNState prev(self): return self._prev + def b(self): return self.builder + # }}} # {{{ Training diff --git a/pycnn/rnnlm.py b/pycnn/rnnlm.py index 46357c4f1..f879ba566 100644 --- a/pycnn/rnnlm.py +++ b/pycnn/rnnlm.py @@ -23,18 +23,18 @@ def __init__(self, model, builder=SimpleRNNBuilder): def BuildLMGraph(self, sent): renew_cg() - builder = self.builder - builder.new_graph() - builder.start_new_sequence() + init_state = self.builder.initial_state() R = parameter(self.m["R"]) bias = parameter(self.m["bias"]) errs = [] # will hold expressions es=[] + state = init_state for (cw,nw) in zip(sent,sent[1:]): # assume word is already a word-id x_t = lookup(self.m["lookup"], int(cw)) - y_t = builder.add_input(x_t) + state = state.add_input(x_t) + y_t = state.output() r_t = bias + (R * y_t) err = pickneglogsoftmax(r_t, int(nw)) errs.append(err) @@ -44,16 +44,15 @@ def BuildLMGraph(self, sent): def sample(self, first=1, nchars=0, stop=-1): res = [first] renew_cg() - builder = self.builder - builder.new_graph() - builder.start_new_sequence() + state = self.builder.initial_state() R = parameter(self.m["R"]) bias = parameter(self.m["bias"]) cw = first while True: x_t = lookup(self.m["lookup"], cw) - y_t = builder.add_input(x_t) + state = state.add_input(x_t) + y_t = state.output() r_t = bias + (R * y_t) ydist = softmax(r_t) dist = cg().inc_forward_vec() @@ -77,6 +76,8 @@ def sample(self, first=1, nchars=0, stop=-1): sgd = SimpleSGDTrainer(model) lm = RNNLanguageModel(model, builder=LSTMBuilder) + #lm = RNNLanguageModel(model, builder=SimpleRNNBuilder) + #lm = RNNLanguageModel(model, builder=RNNBuilder) train = list(train) diff --git a/pycnn/rnnlm_builder.py b/pycnn/rnnlm_builder.py new file mode 100644 index 000000000..46357c4f1 --- /dev/null +++ b/pycnn/rnnlm_builder.py @@ -0,0 +1,106 @@ +from pycnn import * +import time +import random + +LAYERS = 2 +INPUT_DIM = 50 #256 +HIDDEN_DIM = 50 #1024 +VOCAB_SIZE = 0 + +from collections import defaultdict +from itertools import count +import sys +import util + +class RNNLanguageModel: + def __init__(self, model, builder=SimpleRNNBuilder): + self.m = model + self.builder = builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) + + model.add_lookup_parameters("lookup", (VOCAB_SIZE, INPUT_DIM)) + model.add_parameters("R", (VOCAB_SIZE, HIDDEN_DIM)) + model.add_parameters("bias", (VOCAB_SIZE)) + + def BuildLMGraph(self, sent): + renew_cg() + builder = self.builder + builder.new_graph() + builder.start_new_sequence() + + R = parameter(self.m["R"]) + bias = parameter(self.m["bias"]) + errs = [] # will hold expressions + es=[] + for (cw,nw) in zip(sent,sent[1:]): + # assume word is already a word-id + x_t = lookup(self.m["lookup"], int(cw)) + y_t = builder.add_input(x_t) + r_t = bias + (R * y_t) + err = pickneglogsoftmax(r_t, int(nw)) + errs.append(err) + nerr = esum(errs) + return nerr + + def sample(self, first=1, nchars=0, stop=-1): + res = [first] + renew_cg() + builder = self.builder + builder.new_graph() + builder.start_new_sequence() + + R = parameter(self.m["R"]) + bias = parameter(self.m["bias"]) + cw = first + while True: + x_t = lookup(self.m["lookup"], cw) + y_t = builder.add_input(x_t) + r_t = bias + (R * y_t) + ydist = softmax(r_t) + dist = cg().inc_forward_vec() + rnd = random.random() + for i,p in enumerate(dist): + rnd -= p + if rnd <= 0: break + res.append(i) + cw = i + if cw == stop: break + if nchars and len(res) > nchars: break + return res + +if __name__ == '__main__': + train = util.CharsCorpusReader(sys.argv[1],begin="") + vocab = util.Vocab.from_corpus(train) + + VOCAB_SIZE = vocab.size() + + model = Model() + sgd = SimpleSGDTrainer(model) + + lm = RNNLanguageModel(model, builder=LSTMBuilder) + + train = list(train) + + chars = loss = 0.0 + for ITER in xrange(100): + random.shuffle(train) + for i,sent in enumerate(train): + _start = time.time() + if i % 50 == 0: + sgd.status() + if chars > 0: print loss / chars, + for _ in xrange(1): + samp = lm.sample(first=vocab.w2i[""],stop=vocab.w2i["\n"]) + print "".join([vocab.i2w[c] for c in samp]).strip() + loss = 0.0 + chars = 0.0 + + chars += len(sent)-1 + isent = [vocab.w2i[w] for w in sent] + errs = lm.BuildLMGraph(isent) + loss += cg().inc_forward_scalar() + cg().backward() + sgd.update(1.0) + #print "TM:",(time.time() - _start)/len(sent) + print "ITER",ITER,loss + sgd.status() + sgd.update_epoch(1.0) From d9afb7889c1e3cc540eef99fcf2cbfccba5e88ed Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Fri, 14 Aug 2015 23:13:46 +0300 Subject: [PATCH 198/965] access to h and s from RNNState. bilstm-tagger example. --- cnn/lstm.h | 8 ++ cnn/rnn.h | 5 ++ pycnn/bilstmtagger.py | 178 ++++++++++++++++++++++++++++++++++++++++++ pycnn/pycnn.pxd | 29 ++++--- pycnn/pycnn.pyx | 79 ++++++++++++++++--- pycnn/rnnlm.py | 5 +- 6 files changed, 277 insertions(+), 27 deletions(-) create mode 100644 pycnn/bilstmtagger.py diff --git a/cnn/lstm.h b/cnn/lstm.h index 120e32e3f..1f6fb2d09 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -25,6 +25,14 @@ struct LSTMBuilder : public RNNBuilder { for(auto my_h : final_h()) ret.push_back(my_h); return ret; } + + std::vector get_h(RNNPointer i) const { return (i == -1 ? h0 : h[i]); } + std::vector get_s(RNNPointer i) const { + std::vector ret = (i == -1 ? c0 : c[i]); + for(auto my_h : get_h(i)) ret.push_back(my_h); + return ret; + } + void copy(const RNNBuilder & params) override; protected: void new_graph_impl(ComputationGraph& cg) override; diff --git a/cnn/rnn.h b/cnn/rnn.h index 21273c430..230e50b74 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -73,9 +73,11 @@ struct RNNBuilder { virtual Expression back() const = 0; // access the final output of each hidden layer virtual std::vector final_h() const = 0; + virtual std::vector get_h(RNNPointer i) const = 0; // access the state of each hidden layer, in a format that can be used in // start_new_sequence virtual std::vector final_s() const = 0; + virtual std::vector get_s(RNNPointer i) const = 0; // copy the parameters of another builder virtual void copy(const RNNBuilder & params) = 0; protected: @@ -105,6 +107,9 @@ struct SimpleRNNBuilder : public RNNBuilder { Expression back() const { return h.back().back(); } std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } std::vector final_s() const { return final_h(); } + + std::vector get_h(RNNPointer i) const { return (i == -1 ? h0 : h[i]); } + std::vector get_s(RNNPointer i) const { return get_h(i); } void copy(const RNNBuilder & params) override; private: diff --git a/pycnn/bilstmtagger.py b/pycnn/bilstmtagger.py new file mode 100644 index 000000000..5b4d50138 --- /dev/null +++ b/pycnn/bilstmtagger.py @@ -0,0 +1,178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +from pycnn import * +from collections import Counter +import random + +import util + +train_file="/home/yogo/Vork/Research/corpora/pos/WSJ.TRAIN" +test_file="/home/yogo/Vork/Research/corpora/pos/WSJ.TEST" + +MLP=True + +def read(fname): + sent = [] + for line in file(fname): + line = line.strip().split() + if not line: + if sent: yield sent + sent = [] + else: + w,p = line + sent.append((w,p)) + +train=list(read(train_file)) +test=list(read(test_file)) +words=[] +tags=[] +wc=Counter() +for s in train: + for w,p in s: + words.append(w) + tags.append(p) + wc[w]+=1 +words.append("_UNK_") +#words=[w if wc[w] > 1 else "_UNK_" for w in words] +tags.append("_START_") + +for s in test: + for w,p in s: + words.append(w) + +vw = util.Vocab.from_corpus([words]) +vt = util.Vocab.from_corpus([tags]) +UNK = vw.w2i["_UNK_"] + +nwords = vw.size() +ntags = vt.size() + +model = Model() +sgd = SimpleSGDTrainer(model) + +model.add_lookup_parameters("lookup", (nwords, 128)) +model.add_lookup_parameters("tl", (ntags, 30)) +if MLP: + pH = model.add_parameters("HID", (32, 50*2)) + pO = model.add_parameters("OUT", (ntags, 32)) +else: + pO = model.add_parameters("OUT", (ntags, 50*2)) + +builders=[ + LSTMBuilder(2, 128, 50, model), + LSTMBuilder(2, 128, 50, model), + ] + +def build_tagging_graph(words, tags, model, builders): + renew_cg() + f_init, b_init = [b.initial_state() for b in builders] + + wembs = [lookup(model["lookup"], w) for w in words] + wembs = [noise(we,0.1) for we in wembs] + + fw = [x.output() for x in f_init.add_inputs(wembs)] + bw = [x.output() for x in b_init.add_inputs(reversed(wembs))] + + if MLP: + H = parameter(pH) + O = parameter(pO) + else: + O = parameter(pO) + errs = [] + #pt = tb.add_input(lookup(model["tl"],vt.w2i["_START_"])) + for f,b,t in zip(fw, reversed(bw), tags): + #f_b = concatenate([f,b,pt]) + f_b = concatenate([f,b]) + if MLP: + r_t = O*(tanh(H * f_b)) + else: + r_t = O * f_b + #pt = tb.add_input(lookup(model["tl"],np.argmax(r_t.npvalue()))) + err = pickneglogsoftmax(r_t, t) + errs.append(err) + return esum(errs) + +def tag_sent(sent, model, builders): + renew_cg() + f_init, b_init = [b.initial_state() for b in builders] + wembs = [lookup(model["lookup"], vw.w2i.get(w, UNK)) for w,t in sent] + + fw = [x.output() for x in f_init.add_inputs(wembs)] + bw = [x.output() for x in b_init.add_inputs(reversed(wembs))] + + if MLP: + H = parameter(pH) + O = parameter(pO) + else: + O = parameter(pO) + tags=[] + #pt = tb.add_input(lookup(model["tl"],vt.w2i["_START_"])) + for f,b,(w,t) in zip(fw,reversed(bw),sent): + #r_t = R * concatenate([f,b,pt]) + if MLP: + r_t = O*(tanh(H * concatenate([f,b]))) + else: + r_t = O*concatenate([f,b]) + out = softmax(r_t) + chosen = np.argmax(out.npvalue()) + #pt = tb.add_input(lookup(model["tl"],chosen)) + tags.append(vt.i2w[chosen]) + return tags + + +tagged = loss = 0 +for ITER in xrange(50): + random.shuffle(train) + for i,s in enumerate(train,1): + if i % 5000 == 0: + sgd.status() + print loss / tagged + loss = 0 + tagged = 0 + if i % 10000 == 0: + good = bad = 0.0 + for sent in test: + tags = tag_sent(sent, model, builders) + golds = [t for w,t in sent] + for go,gu in zip(golds,tags): + if go == gu: good +=1 + else: bad+=1 + print good/(good+bad) + ws = [vw.w2i.get(w, UNK) for w,p in s] + ps = [vt.w2i[p] for w,p in s] + build_tagging_graph(ws,ps,model,builders) + loss += cg().inc_forward_scalar() + tagged += len(ps) + cg().backward() + sgd.update() + + + + + diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index 18a9e82b8..397f62762 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -163,6 +163,8 @@ cdef extern from "cnn/expr.h" namespace "cnn::expr": CExpression c_transpose "cnn::expr::transpose" (CExpression& x) # CExpression c_affine_transform "cnn::expr::affine_transform" (const vector[CExpression]& xs) + + CExpression c_trace_of_product "cnn::expr::trace_of_product" (CExpression& x, CExpression& y); CExpression c_cwise_multiply "cnn::expr::cwise_multiply" (CExpression& x, CExpression& y) # CExpression c_dot_product "cnn::expr::dot_product" (CExpression& x, CExpression& y) # @@ -197,6 +199,10 @@ cdef extern from "cnn/expr.h" namespace "cnn::expr": # cdef cppclass Model: cdef extern from "cnn/rnn.h" namespace "cnn": + cdef cppclass CRNNPointer "cnn::RNNPointer": + CRNNPointer() + CRNNPointer(int i) + cdef cppclass CRNNBuilder "cnn::RNNBuilder": void new_graph(CComputationGraph &cg) void start_new_sequence(vector[CExpression] ces) @@ -206,6 +212,8 @@ cdef extern from "cnn/rnn.h" namespace "cnn": CExpression back() vector[CExpression] final_h() vector[CExpression] final_s() + vector[CExpression] get_h(CRNNPointer i) + vector[CExpression] get_s(CRNNPointer i) CRNNPointer state() # TODO unify with LSTMBuilder using inheritance @@ -218,16 +226,13 @@ cdef extern from "cnn/rnn.h" namespace "cnn": #CExpression add_input(CExpression &x) #CExpression add_input(CRNNPointer prev, CExpression &x) #void rewind_one_step() - CExpression back() - vector[CExpression] final_h() - vector[CExpression] final_s() + #CExpression back() + #vector[CExpression] final_h() + #vector[CExpression] final_s() + #vector[CExpression] get_h(CRNNPointer i) + #vector[CExpression] get_s(CRNNPointer i) #CRNNPointer state() -cdef extern from "cnn/rnn.h" namespace "cnn": - cdef cppclass CRNNPointer "cnn::RNNPointer": - CRNNPointer() - CRNNPointer(int i) - cdef extern from "cnn/lstm.h" namespace "cnn": cdef cppclass CLSTMBuilder "cnn::LSTMBuilder" (CRNNBuilder): CLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) @@ -236,8 +241,10 @@ cdef extern from "cnn/lstm.h" namespace "cnn": #CExpression add_input(CExpression &x) #CExpression add_input(CRNNPointer prev, CExpression &x) #void rewind_one_step() - CExpression back() - vector[CExpression] final_h() - vector[CExpression] final_s() + #CExpression back() + #vector[CExpression] final_h() + #vector[CExpression] final_s() + #vector[CExpression] get_h(CRNNPointer i) + #vector[CExpression] get_s(CRNNPointer i) #CRNNPointer state() diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index d14789940..d41945194 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -500,6 +500,7 @@ def hinge(Expression x, unsigned index, float m=1.0): cpdef Expression cdiv(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_cdiv(x.c(), y.c())) cpdef Expression colwise_add(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_colwise_add(x.c(), y.c())) +cpdef Expression trace_of_product(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_trace_of_product(x.c(), y.c())) cpdef Expression cwise_multiply(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_cwise_multiply(x.c(), y.c())) cpdef Expression dot_product(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_dot_product(x.c(), y.c())) cpdef Expression squared_distance(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_squared_distance(x.c(), y.c())) @@ -592,6 +593,7 @@ cpdef Expression affine_transform(list exprs): cdef class RNNBuilder: # {{{ cdef CRNNBuilder *thisptr + cdef RNNState _init_state cdef int cg_version def __cinit_(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): # TODO disable calling this directly. @@ -603,11 +605,11 @@ cdef class RNNBuilder: # {{{ def __dealloc__(self): del self.thisptr - cpdef new_graph(self): + cdef new_graph(self): self.thisptr.new_graph(_cg.thisptr[0]) self.cg_version = _cg.version() - cpdef start_new_sequence(self, es=None): + cdef start_new_sequence(self, es=None): if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") cdef vector[CExpression] ces = vector[CExpression]() cdef Expression e @@ -617,7 +619,7 @@ cdef class RNNBuilder: # {{{ ces.push_back(e.c()) self.thisptr.start_new_sequence(ces) - cpdef Expression add_input(self, Expression e): + cdef Expression add_input(self, Expression e): ensure_freshness(e) if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") return Expression.from_cexpr(self.cg_version, self.thisptr.add_input(e.c())) @@ -627,15 +629,15 @@ cdef class RNNBuilder: # {{{ if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") return Expression.from_cexpr(self.cg_version, self.thisptr.add_input(prev, e.c())) - cpdef rewind_one_step(self): + cdef rewind_one_step(self): if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") self.thisptr.rewind_one_step() - cpdef Expression back(self): + cdef Expression back(self): if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") return Expression.from_cexpr(self.cg_version, self.thisptr.back()) - cpdef final_h(self): + cdef final_h(self): if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") cdef list res = [] cdef CExpression cexp @@ -644,7 +646,7 @@ cdef class RNNBuilder: # {{{ res.append(Expression.from_cexpr(self.cg_version, cexp)) return res - cpdef final_s(self): + cdef final_s(self): if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") cdef list res = [] cdef CExpression cexp @@ -653,10 +655,30 @@ cdef class RNNBuilder: # {{{ res.append(Expression.from_cexpr(self.cg_version, cexp)) return res + cdef get_h(self, CRNNPointer i): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + cdef list res = [] + cdef CExpression cexp + cdef vector[CExpression] cexps = self.thisptr.get_h(i) + for cexp in cexps: + res.append(Expression.from_cexpr(self.cg_version, cexp)) + return res + + cdef get_s(self, CRNNPointer i): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + cdef list res = [] + cdef CExpression cexp + cdef vector[CExpression] cexps = self.thisptr.get_s(i) + for cexp in cexps: + res.append(Expression.from_cexpr(self.cg_version, cexp)) + return res + cpdef RNNState initial_state(self): - self.new_graph() - self.start_new_sequence() - return RNNState(self, -1) + if self.cg_version != _cg.version(): + self.new_graph() + self.start_new_sequence() + self._init_state = RNNState(self, -1) + return self._init_state #}}} cdef class SimpleRNNBuilder(RNNBuilder): # {{{ @@ -675,12 +697,11 @@ cdef class LSTMBuilder(RNNBuilder): # {{{ def whoami(self): return "LSTMBuilder" # }}} -cdef class RNNState: +cdef class RNNState: # {{{ """ This is the main class for working with RNNs / LSTMs / GRUs. Request an RNNState initial_state() from a builder, and then progress from there. """ - # TODO add final_h and final_s support from builders. cdef RNNBuilder builder cdef int state_idx cdef RNNState _prev @@ -697,13 +718,45 @@ cdef class RNNState: cdef int state_idx = self.builder.thisptr.state() return RNNState(self.builder, state_idx, self, res) - cpdef int state(self): return self.state_idx + def add_inputs(self, xs): + """ + returns the list of states obtained by adding the given inputs + to the current state, one by one. + """ + states = [] + cur = self + for x in xs: + cur = cur.add_input(x) + states.append(cur) + return states + + #cpdef int state(self): return self.state_idx cpdef Expression output(self): return self._out + cpdef tuple h(self): + """ + tuple of expressions representing the output of each hidden layer + of the current step. + the actual output of the network is at h()[-1]. + """ + return tuple(self.builder.get_h(CRNNPointer(self.state_idx))) + + cpdef tuple s(self): + """ + tuple of expressions representing the hidden state of the current + step. + + For SimpleRNN, s() is the same as h() + For LSTM, s() is a series of of memory vectors, followed the series + followed by the series returned by h(). + """ + return tuple(self.builder.get_s(CRNNPointer(self.state_idx))) + cpdef RNNState prev(self): return self._prev def b(self): return self.builder + #}}} # }}} diff --git a/pycnn/rnnlm.py b/pycnn/rnnlm.py index f879ba566..1c9209bcc 100644 --- a/pycnn/rnnlm.py +++ b/pycnn/rnnlm.py @@ -75,9 +75,8 @@ def sample(self, first=1, nchars=0, stop=-1): model = Model() sgd = SimpleSGDTrainer(model) - lm = RNNLanguageModel(model, builder=LSTMBuilder) - #lm = RNNLanguageModel(model, builder=SimpleRNNBuilder) - #lm = RNNLanguageModel(model, builder=RNNBuilder) + #lm = RNNLanguageModel(model, builder=LSTMBuilder) + lm = RNNLanguageModel(model, builder=SimpleRNNBuilder) train = list(train) From 1b9a47b684e159a601b1eeb3af400377f8f3e923 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Sat, 15 Aug 2015 00:35:09 +0300 Subject: [PATCH 199/965] access forward and backward through the Expression interface. Update xor, rnnlm and bilstmtagger examples. --- cnn/cnn.cc | 1 + cnn/cnn.h | 2 ++ cnn/exec.cc | 14 +++++++++++--- cnn/exec.h | 2 ++ pycnn/bilstmtagger.py | 45 ++++++------------------------------------- pycnn/pycnn.pxd | 1 + pycnn/pycnn.pyx | 9 +++++++++ pycnn/rnnlm.py | 6 +++--- pycnn/xor.py | 24 ++++++++++++++--------- 9 files changed, 50 insertions(+), 54 deletions(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 0169ed531..451dcbd6c 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -116,6 +116,7 @@ const Tensor& ComputationGraph::forward() { return ee->forward(); } const Tensor& ComputationGraph::get_value(VariableIndex i) { return ee->get_value(i); } void ComputationGraph::invalidate() { ee->invalidate(); } void ComputationGraph::backward() { ee->backward(); } +void ComputationGraph::backward(VariableIndex i) { ee->backward(i); } void ComputationGraph::PrintGraphviz() const { cerr << "digraph G {\n rankdir=LR;\n nodesep=.05;\n"; diff --git a/cnn/cnn.h b/cnn/cnn.h index 508a0b690..eaf2fd4aa 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -87,6 +87,8 @@ struct ComputationGraph { void invalidate(); // computes backward gradients from the front-most evaluated node. void backward(); + // computes backward gradients from node i (assuming it already been evaluated). + void backward(VariableIndex i); // debugging void PrintGraphviz() const; diff --git a/cnn/exec.cc b/cnn/exec.cc index 5180c9a91..5aede7b00 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -66,11 +66,19 @@ const Tensor& SimpleExecutionEngine::incremental_forward() { } void SimpleExecutionEngine::backward() { - if (nfxs.back().d.size() != 1) { + assert(nfxs.size() == cg.nodes.size()); + backward((VariableIndex)(cg.nodes.size()-1)); +} + +// TODO what is happening with parameter nodes if from_where > param_node_id ? +void SimpleExecutionEngine::backward(VariableIndex from_where) { + assert(from_where+1 <= nfxs.size()); + assert(from_where+1 <= cg.nodes.size()); + if (nfxs[from_where].d.size() != 1) { cerr << "backward() called on non-scalar node.\n"; abort(); } - const unsigned node_max_index = cg.nodes.size(); + const unsigned node_max_index = from_where+1; ndEdfs.resize(node_max_index); dEdfs->free(); for (unsigned i = 0; i < node_max_index; ++i) { @@ -84,7 +92,7 @@ void SimpleExecutionEngine::backward() { ndEdfs.back().v = kSCALAR_ONE; // here we find constant paths to avoid doing extra work - const unsigned num_nodes = cg.nodes.size(); + const unsigned num_nodes = from_where+1; vector needs_derivative(num_nodes, false); for (auto i : cg.parameter_nodes) needs_derivative[i] = true; diff --git a/cnn/exec.h b/cnn/exec.h index deb680c45..a08ad8e0d 100644 --- a/cnn/exec.h +++ b/cnn/exec.h @@ -13,6 +13,7 @@ class ExecutionEngine { virtual const Tensor& incremental_forward() = 0; // if you want to add nodes and evaluate just the new parts virtual const Tensor& get_value(VariableIndex i) = 0; virtual void backward() = 0; + virtual void backward(VariableIndex i) = 0; protected: explicit ExecutionEngine(const ComputationGraph& cg) : cg(cg) {} const ComputationGraph& cg; @@ -26,6 +27,7 @@ class SimpleExecutionEngine : public ExecutionEngine { const Tensor& incremental_forward() override; // if you want to add nodes and evaluate just the new parts const Tensor& get_value(VariableIndex i) override; void backward() override; + void backward(VariableIndex i) override; private: std::vector nfxs; std::vector ndEdfs; diff --git a/pycnn/bilstmtagger.py b/pycnn/bilstmtagger.py index 5b4d50138..7bcbd3543 100644 --- a/pycnn/bilstmtagger.py +++ b/pycnn/bilstmtagger.py @@ -1,31 +1,3 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - from pycnn import * from collections import Counter import random @@ -85,8 +57,8 @@ def read(fname): pO = model.add_parameters("OUT", (ntags, 50*2)) builders=[ - LSTMBuilder(2, 128, 50, model), - LSTMBuilder(2, 128, 50, model), + LSTMBuilder(1, 128, 50, model), + LSTMBuilder(1, 128, 50, model), ] def build_tagging_graph(words, tags, model, builders): @@ -105,15 +77,12 @@ def build_tagging_graph(words, tags, model, builders): else: O = parameter(pO) errs = [] - #pt = tb.add_input(lookup(model["tl"],vt.w2i["_START_"])) for f,b,t in zip(fw, reversed(bw), tags): - #f_b = concatenate([f,b,pt]) f_b = concatenate([f,b]) if MLP: r_t = O*(tanh(H * f_b)) else: r_t = O * f_b - #pt = tb.add_input(lookup(model["tl"],np.argmax(r_t.npvalue()))) err = pickneglogsoftmax(r_t, t) errs.append(err) return esum(errs) @@ -132,16 +101,13 @@ def tag_sent(sent, model, builders): else: O = parameter(pO) tags=[] - #pt = tb.add_input(lookup(model["tl"],vt.w2i["_START_"])) for f,b,(w,t) in zip(fw,reversed(bw),sent): - #r_t = R * concatenate([f,b,pt]) if MLP: r_t = O*(tanh(H * concatenate([f,b]))) else: r_t = O*concatenate([f,b]) out = softmax(r_t) chosen = np.argmax(out.npvalue()) - #pt = tb.add_input(lookup(model["tl"],chosen)) tags.append(vt.i2w[chosen]) return tags @@ -166,10 +132,11 @@ def tag_sent(sent, model, builders): print good/(good+bad) ws = [vw.w2i.get(w, UNK) for w,p in s] ps = [vt.w2i[p] for w,p in s] - build_tagging_graph(ws,ps,model,builders) - loss += cg().inc_forward_scalar() + sum_errs = build_tagging_graph(ws,ps,model,builders) + squared = -sum_errs# * sum_errs + loss += sum_errs.scalar_value() tagged += len(ps) - cg().backward() + sum_errs.backward() sgd.update() diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index 397f62762..1dcf0bb8e 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -86,6 +86,7 @@ cdef extern from "cnn/cnn.h" namespace "cnn": const CTensor& get_value(VariableIndex i) void invalidate() void backward() + void backward(VariableIndex i) void PrintGraphviz() const diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index d41945194..f9a61a6a8 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -375,6 +375,15 @@ cdef class Expression: #{{{ if len(vec) == 1: return vec[0] return vec + # TODO this runs incremental forward on the entire graph, may not be optimal in terms of efficiency. + cpdef forward(self): + if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") + self.cg.incremental_forward() + + cpdef backward(self): + if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") + self.cg.backward(self.vindex) + def __add__(self, other): return _add(self,other) def __mul__(self, other): if isinstance(self, Expression) and isinstance(other, Expression): diff --git a/pycnn/rnnlm.py b/pycnn/rnnlm.py index 1c9209bcc..1b2abd013 100644 --- a/pycnn/rnnlm.py +++ b/pycnn/rnnlm.py @@ -55,7 +55,7 @@ def sample(self, first=1, nchars=0, stop=-1): y_t = state.output() r_t = bias + (R * y_t) ydist = softmax(r_t) - dist = cg().inc_forward_vec() + dist = ydist.vec_value() rnd = random.random() for i,p in enumerate(dist): rnd -= p @@ -97,8 +97,8 @@ def sample(self, first=1, nchars=0, stop=-1): chars += len(sent)-1 isent = [vocab.w2i[w] for w in sent] errs = lm.BuildLMGraph(isent) - loss += cg().inc_forward_scalar() - cg().backward() + loss += errs.scalar_value() + errs.backward() sgd.update(1.0) #print "TM:",(time.time() - _start)/len(sent) print "ITER",ITER,loss diff --git a/pycnn/xor.py b/pycnn/xor.py index 2b8996c4d..452017342 100644 --- a/pycnn/xor.py +++ b/pycnn/xor.py @@ -1,6 +1,6 @@ from pycnn import * -xsent = True +#xsent = True xsent = False HIDDEN_SIZE = 8 @@ -19,9 +19,8 @@ V = parameter(m["V"]) a = parameter(m["a"]) -x = vecInput([1,1]) +x = vecInput(2) y = scalarInput(0) -#print type(x) h = tanh((W*x) + b) if xsent: y_pred = logistic((V*h) + a) @@ -42,8 +41,10 @@ x2 = (mi / 2) % 2 x.set([T if x1 else F, T if x2 else F]) y.set(T if x1 != x2 else F) - mloss += cg().forward_scalar() - cg().backward() + #mloss += cg().forward_scalar() + mloss += loss.scalar_value() + #cg().backward() + loss.backward() sgd.update(1.0) sgd.update_epoch(); mloss /= 4. @@ -51,7 +52,7 @@ x.set([F,T]) z = -(-y_pred) -print cg().forward_scalar() +print z.scalar_value() #print y_pred.scalar() renew_cg() @@ -60,14 +61,19 @@ V = parameter(m["V"]) a = parameter(m["a"]) -x = vecInput([1,1]) +x = vecInput(2) y = scalarInput(0) -#print type(x) h = tanh((W*x) + b) if xsent: y_pred = logistic((V*h) + a) else: y_pred = (V*h) + a x.set([T,F]) -print "XX",cg().forward_scalar() +print "TF",y_pred.scalar_value() +x.set([F,F]) +print "FF",y_pred.scalar_value() +x.set([T,T]) +print "TT",y_pred.scalar_value() +x.set([F,T]) +print "FT",y_pred.scalar_value() From e3148824762374ca1c8512d1a39dec6ff56fe643 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Sat, 15 Aug 2015 01:10:04 +0300 Subject: [PATCH 200/965] Re-organize examples. INSTALL instructions. --- INSTALL.md | 57 +++++++++++++++++++++++++++ {pycnn => pyexamples}/bilstmtagger.py | 5 +-- {pycnn => pyexamples}/rnnlm.py | 0 {pycnn => pyexamples}/util.py | 0 {pycnn => pyexamples}/xor.py | 0 5 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 INSTALL.md rename {pycnn => pyexamples}/bilstmtagger.py (97%) rename {pycnn => pyexamples}/rnnlm.py (100%) rename {pycnn => pyexamples}/util.py (100%) rename {pycnn => pyexamples}/xor.py (100%) diff --git a/INSTALL.md b/INSTALL.md new file mode 100644 index 000000000..94045df31 --- /dev/null +++ b/INSTALL.md @@ -0,0 +1,57 @@ + + + +First, get CNN and Eigen: + +```bash +mkdir cnn +cd cnn +git clone https://github.com/yoavg/cnn.git +hg clone https://bitbucket.org/eigen/eigen/ +``` + +Compile CNN. +Note that we are currently relying on the CNN code that is in the +`pycnn` branch (it has a few modifications needed for pyCNN to work), +but at some point this will be merged into cnn proper. +(modify the code below to point to the correct boost location) + +```bash +cd cnn +git checkout pycnn # branch +mkdir build +cd build +cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBOOST_ROOT=/home/yogo/.local/boost +make -j 2 +``` + +Now that CNN is compiled, we need to compile the pycnn module. +This requires having cython installed. +If you don't have cython, it can be installed with either `pip install cython` or better yet `conda install cython`. + +```bash +pip2 install cython --user +cd ../pycnn +make +make install +``` + +We are almost there. +We need to tell the environment where to find the compiled cnn shared library. +The pyCNN's `make` fetched a copy of `libcnn_shared.so` and put it in the `pycnn` lib. + +Add the following line to your profile (`.zshrc` or `.bashrc`), change +according to your installation location. + +```bash +export LD_LIBRARY_PATH=/home/yogo/cnn/cnn/pycnn +``` + +Now, check that everything works: + +```bash +# check that it works: +cd pycnn +python2 xor.py +python2 rnnlm.py rnnlm.py + diff --git a/pycnn/bilstmtagger.py b/pyexamples/bilstmtagger.py similarity index 97% rename from pycnn/bilstmtagger.py rename to pyexamples/bilstmtagger.py index 7bcbd3543..4a64d6955 100644 --- a/pycnn/bilstmtagger.py +++ b/pyexamples/bilstmtagger.py @@ -4,9 +4,11 @@ import util +# format of files: each line is "wordtag", blank line is new sentence. train_file="/home/yogo/Vork/Research/corpora/pos/WSJ.TRAIN" test_file="/home/yogo/Vork/Research/corpora/pos/WSJ.TEST" + MLP=True def read(fname): @@ -140,6 +142,3 @@ def tag_sent(sent, model, builders): sgd.update() - - - diff --git a/pycnn/rnnlm.py b/pyexamples/rnnlm.py similarity index 100% rename from pycnn/rnnlm.py rename to pyexamples/rnnlm.py diff --git a/pycnn/util.py b/pyexamples/util.py similarity index 100% rename from pycnn/util.py rename to pyexamples/util.py diff --git a/pycnn/xor.py b/pyexamples/xor.py similarity index 100% rename from pycnn/xor.py rename to pyexamples/xor.py From 6349492e6b28f065b60ee2ad0ac0b4e7e2b3de34 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Sat, 15 Aug 2015 01:15:56 +0300 Subject: [PATCH 201/965] updated install instructions. --- INSTALL | 21 -------- INSTALL.md | 7 +-- pycnn/encdec.py | 106 ----------------------------------------- pycnn/makefile | 6 +++ pycnn/nlm.py | 74 ---------------------------- pycnn/rnnlm_builder.py | 106 ----------------------------------------- 6 files changed, 10 insertions(+), 310 deletions(-) delete mode 100644 INSTALL delete mode 100644 pycnn/encdec.py delete mode 100644 pycnn/nlm.py delete mode 100644 pycnn/rnnlm_builder.py diff --git a/INSTALL b/INSTALL deleted file mode 100644 index 4d4cdadb0..000000000 --- a/INSTALL +++ /dev/null @@ -1,21 +0,0 @@ -# installation instructions for pycnn - -mkdir cnn -cd cnn -git clone https://github.com/yoavg/cnn.git -hg clone https://bitbucket.org/eigen/eigen/ - -cd cnn -git checkout pycnn # branch -mkdir build -cd build -cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBOOST_ROOT=/home/yogo/.local/boost -make -j 2 - -cd ../pycnn -pip2 install cython --user -make -export LD_LIBRARY_PATH=/home/yogo/cnn/cnn/pycnn - -# check that it works: -python2 rnnlm.py rnnlm.py diff --git a/INSTALL.md b/INSTALL.md index 94045df31..202d61035 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,5 +1,4 @@ - - +# Installing the pyCNN module. First, get CNN and Eigen: @@ -51,7 +50,9 @@ Now, check that everything works: ```bash # check that it works: -cd pycnn +cd .. +cd pyexamples python2 xor.py python2 rnnlm.py rnnlm.py +``` diff --git a/pycnn/encdec.py b/pycnn/encdec.py deleted file mode 100644 index 7c8012b24..000000000 --- a/pycnn/encdec.py +++ /dev/null @@ -1,106 +0,0 @@ -from pycnn import * - -LAYERS = 3 -INPUT_DIM = 500 -HIDDEN_DIM = 500 -INPUT_VOCAB_SIZE = 0 -OUTPUT_VOCAB_SIZE = 0 - -class EncoderDecoder: - def __init__(self, model, builder=LSTMBuilder): - self.m = model - model.add_parameters("ie2h", (HIDDEN_DIM*LAYERS*1.5, HIDDEN_DIM*LAYERS*2)) - model.add_parameters("bie", HIDDEN_DIM*LAYERS*1.5) - model.add_parameters("h2oe", (HIDDEN_DIM*LAYERS, HIDDEN_DIM*LAYERS*1.5)) - model.add_parameters("boe", (HIDDEN_DIM*LAYERS)) - model.add_lookup_parameters("c", (INPUT_VOCAB_SIZE, INPUT_DIM)) - model.add_lookup_parameters("ec", (INPUT_VOCAB_SIZE, INPUT_DIM)) - model.add_parameters("R", (OUTPUT_VOCAB_SIZE, HIDDEN_DIM)) - model.add_parameters("bias", OUTPUT_VOCAB_SIZE) - - self.dec_builder = builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) - self.fwd_enc_builder = builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) - self.rev_enc_builder = builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) - - def BuildGraph(self, isent, osent, cg): - fwb = self.fwd_enc_builder - fwb.new_graph(cg) - fwb.start_new_sequence() - # fw encoder - for wid in isent: - fwb.add_input(cg.lookup(model["ec"], wid)) - # bw encoder - bwb = self.rev_enc_builder - bwb.new_graph(cg) - bwb.start_new_sequence() - for wid in reversed(isent): - bwb.add_input(cg.lookup(model["ec"], wid)) - - # combine encoders: - to = fwb.final_h() + bwb.final_h() - combined = concatenate(to) - ie2h = cg.parameters(self.m["ie2h"]) - bie = cg.parameters(self.m["bie"]) - t = bie + (ie2h * combined) - cg.inc_forward_vec() - h = rectify(t) - h2oe = cg.parameters(self.m["h2oe"]) - boe = cg.parameters(self.m["boe"]) - nc = boe + (h2oe * h) - - oein1 = [pickrange(nc, i* HIDDEN_DIM, (i+1)*HIDDEN_DIM) for i in xrange(LAYERS)] - oein2 = [tanh(x) for x in oein1] - oein = oein1 + oein2 - - decb = self.dec_builder - decb.new_graph(cg) - decb.start_new_sequence(oein) - # decoder - R = cg.parameters(self.m["R"]) - bias = cg.parameters(self.m["bias"]) - - errs = [] - for (cw,nw) in zip(osent, osent[1:]): - x_t = cg.lookup(self.m["c"], cw) - y_t = decb.add_input(x_t) - r_t = bias + (R * y_t) - ydist = log_softmax(r_t) - errs.append(cg.outputPicker(ydist, nw)) - return -esum(errs) - -if __name__ == '__main__': - import sys - import util - import random - - train = util.CharsCorpusReader(sys.argv[1],begin="") - vocab = util.Vocab.from_corpus(train) - INPUT_VOCAB_SIZE = vocab.size() - OUTPUT_VOCAB_SIZE = vocab.size() - - model = Model() - sgd = SimpleSGDTrainer(model) - cg = ComputationGraph() - - lm = EncoderDecoder(model, LSTMBuilder) - - train = list(train) - chars = loss = 0.0 - while True: - random.shuffle(train) - for i,sent in enumerate(train,1): - if i % 50 == 0: - print "E = ", (loss / chars) - sgd.status() - - chars = loss = 0.0 - - cg.renew() - chars += len(sent) - 1 - isent = [vocab.w2i[w] for w in sent] - lm.BuildGraph(isent, isent, cg) - loss += cg.forward_scalar() - cg.backward() - sgd.update() - sgd.update_epoch() - diff --git a/pycnn/makefile b/pycnn/makefile index 379093189..ed59c93a9 100644 --- a/pycnn/makefile +++ b/pycnn/makefile @@ -2,4 +2,10 @@ pycnn.so: ../build/cnn/libcnn_shared.so pycnn.pyx pycnn.pxd setup.py cp ../build/cnn/libcnn_shared.so . python2 setup.py build_ext --inplace +install: pycnn.so + python2 setup.py install --user + +clean: + rm *.so *.cpp + diff --git a/pycnn/nlm.py b/pycnn/nlm.py deleted file mode 100644 index b447b9e0d..000000000 --- a/pycnn/nlm.py +++ /dev/null @@ -1,74 +0,0 @@ -from pycnn import * - -from util import CorpusReader, Vocab -#corpus = CorpusReader("../examples/example-data/fin-toy.txt") -corpus = CorpusReader("ngrams") -vocab = Vocab.from_corpus(corpus) - -def corpus_to_examples(corpus,CONTEXT=3): - for sent in corpus: - for i in xrange(CONTEXT,len(sent)): - ctx = sent[i-CONTEXT:i] - word = sent[i] - yield (ctx, word) - -#for ctx, word in corpus_to_examples(corpus): -# print " ".join(str(vocab.w2i[c]) for c in ctx),vocab.w2i[word] -#sys.exit() - - -print vocab.size() - -CONTEXT = 3 -DIM = 100 -VOCAB_SIZE = vocab.size() - -m = Model() -sgd = SimpleSGDTrainer(m) -cg = ComputationGraph() - -class InputWordIds: - def __init__(self, cg, lookup_params, nwords): - self.exprs = [cg.lookup(lookup_params) for _ in xrange(nwords)] - def feed(self, word_ids): - [e.set(i) for (e,i) in zip(self.exprs,word_ids)] - -# TODO this can be made nicer I think -m.add_lookup_parameters("word_lookup", (VOCAB_SIZE, DIM)) -contexts = InputWordIds(cg, m["word_lookup"], CONTEXT) -cvec = concatenate(contexts.exprs) # TODO - -C = cg.parameters(m.add_parameters("C", (DIM, DIM*CONTEXT))) -hb = cg.parameters(m.add_parameters("hb", DIM)) -R = cg.parameters(m.add_parameters("R", (VOCAB_SIZE, DIM))) -bias = cg.parameters(m.add_parameters("bias", VOCAB_SIZE)) - -r = hb + (C * cvec) -nl = rectify(r) -o2 = bias + (R * nl) -ydist = log_softmax(o2) -val_at_expected_outcome = cg.outputPicker(ydist) -nerr = -val_at_expected_outcome - -cg.PrintGraphviz() - - -data = list(corpus_to_examples(corpus)) -loss = 0.0 -#for i, (context_words, target_word) in enumerate(corpus_to_examples(corpus)): -import time -thestart = time.time() -for iter in xrange(100): - start = time.time() - for i, (context_words, target_word) in enumerate(data): - contexts.feed([vocab.w2i[w] for w in context_words]) - val_at_expected_outcome.set_index(vocab.w2i[target_word]) - loss += cg.forward_scalar() - cg.backward() - sgd.update(1.0) - if i == 2500: break - print loss / float(i) - loss = 0.0 - print "TIME:", (time.time() - start) * 1000 - -print "total:",time.time() - thestart diff --git a/pycnn/rnnlm_builder.py b/pycnn/rnnlm_builder.py deleted file mode 100644 index 46357c4f1..000000000 --- a/pycnn/rnnlm_builder.py +++ /dev/null @@ -1,106 +0,0 @@ -from pycnn import * -import time -import random - -LAYERS = 2 -INPUT_DIM = 50 #256 -HIDDEN_DIM = 50 #1024 -VOCAB_SIZE = 0 - -from collections import defaultdict -from itertools import count -import sys -import util - -class RNNLanguageModel: - def __init__(self, model, builder=SimpleRNNBuilder): - self.m = model - self.builder = builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) - - model.add_lookup_parameters("lookup", (VOCAB_SIZE, INPUT_DIM)) - model.add_parameters("R", (VOCAB_SIZE, HIDDEN_DIM)) - model.add_parameters("bias", (VOCAB_SIZE)) - - def BuildLMGraph(self, sent): - renew_cg() - builder = self.builder - builder.new_graph() - builder.start_new_sequence() - - R = parameter(self.m["R"]) - bias = parameter(self.m["bias"]) - errs = [] # will hold expressions - es=[] - for (cw,nw) in zip(sent,sent[1:]): - # assume word is already a word-id - x_t = lookup(self.m["lookup"], int(cw)) - y_t = builder.add_input(x_t) - r_t = bias + (R * y_t) - err = pickneglogsoftmax(r_t, int(nw)) - errs.append(err) - nerr = esum(errs) - return nerr - - def sample(self, first=1, nchars=0, stop=-1): - res = [first] - renew_cg() - builder = self.builder - builder.new_graph() - builder.start_new_sequence() - - R = parameter(self.m["R"]) - bias = parameter(self.m["bias"]) - cw = first - while True: - x_t = lookup(self.m["lookup"], cw) - y_t = builder.add_input(x_t) - r_t = bias + (R * y_t) - ydist = softmax(r_t) - dist = cg().inc_forward_vec() - rnd = random.random() - for i,p in enumerate(dist): - rnd -= p - if rnd <= 0: break - res.append(i) - cw = i - if cw == stop: break - if nchars and len(res) > nchars: break - return res - -if __name__ == '__main__': - train = util.CharsCorpusReader(sys.argv[1],begin="") - vocab = util.Vocab.from_corpus(train) - - VOCAB_SIZE = vocab.size() - - model = Model() - sgd = SimpleSGDTrainer(model) - - lm = RNNLanguageModel(model, builder=LSTMBuilder) - - train = list(train) - - chars = loss = 0.0 - for ITER in xrange(100): - random.shuffle(train) - for i,sent in enumerate(train): - _start = time.time() - if i % 50 == 0: - sgd.status() - if chars > 0: print loss / chars, - for _ in xrange(1): - samp = lm.sample(first=vocab.w2i[""],stop=vocab.w2i["\n"]) - print "".join([vocab.i2w[c] for c in samp]).strip() - loss = 0.0 - chars = 0.0 - - chars += len(sent)-1 - isent = [vocab.w2i[w] for w in sent] - errs = lm.BuildLMGraph(isent) - loss += cg().inc_forward_scalar() - cg().backward() - sgd.update(1.0) - #print "TM:",(time.time() - _start)/len(sent) - print "ITER",ITER,loss - sgd.status() - sgd.update_epoch(1.0) From 0ba11be4a70f1e74a27d5bc2d70335f3c98d16d6 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Sat, 15 Aug 2015 01:28:36 +0300 Subject: [PATCH 202/965] updated install instructions. --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 202d61035..3f79091e9 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -20,7 +20,7 @@ cd cnn git checkout pycnn # branch mkdir build cd build -cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBOOST_ROOT=/home/yogo/.local/boost +cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBOOST_ROOT=/home/yogo/.local/boost -DBoost_NO_BOOST_CMAKE=ON make -j 2 ``` From ca5ab0f2f31269f9a4b42090b982ebaa7c2c0bf0 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Sat, 15 Aug 2015 01:39:46 +0300 Subject: [PATCH 203/965] updated instructions. --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 3f79091e9..eefc0a04e 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -20,7 +20,7 @@ cd cnn git checkout pycnn # branch mkdir build cd build -cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBOOST_ROOT=/home/yogo/.local/boost -DBoost_NO_BOOST_CMAKE=ON +cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBOOST_ROOT=/home/yogo/boost/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON make -j 2 ``` From 743bfee072a3e5ad2641a80f6c561bd0601ea50b Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Sat, 15 Aug 2015 02:06:35 +0300 Subject: [PATCH 204/965] INSTAll.md --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index eefc0a04e..0bf88d174 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -20,7 +20,7 @@ cd cnn git checkout pycnn # branch mkdir build cd build -cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBOOST_ROOT=/home/yogo/boost/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON +cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBOOST_ROOT=/home/yogo/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON make -j 2 ``` From fb0a9ceb284cc7e12fea5aa004cbb8fdd4f31312 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Mon, 17 Aug 2015 03:52:46 +0300 Subject: [PATCH 205/965] make rnnlm importable --- pyexamples/rnnlm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyexamples/rnnlm.py b/pyexamples/rnnlm.py index 1b2abd013..8b906079c 100644 --- a/pyexamples/rnnlm.py +++ b/pyexamples/rnnlm.py @@ -13,7 +13,7 @@ import util class RNNLanguageModel: - def __init__(self, model, builder=SimpleRNNBuilder): + def __init__(self, model, LAYERS, INPUT_DIM, HIDDEN_DIM, VOCAB_SIZE, builder=SimpleRNNBuilder): self.m = model self.builder = builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) @@ -76,7 +76,7 @@ def sample(self, first=1, nchars=0, stop=-1): sgd = SimpleSGDTrainer(model) #lm = RNNLanguageModel(model, builder=LSTMBuilder) - lm = RNNLanguageModel(model, builder=SimpleRNNBuilder) + lm = RNNLanguageModel(model, LAYERS, INPUT_DIM, HIDDEN_DIM, VOCAB_SIZE, builder=SimpleRNNBuilder) train = list(train) From 809d0980ac5a70edfc79d9c08339f530a2b5a42d Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 17 Aug 2015 23:40:40 -0400 Subject: [PATCH 206/965] fix header guard naming conv --- cnn/expr.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/expr.h b/cnn/expr.h index 948500e71..315dc8cde 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -1,5 +1,5 @@ -#ifndef EXPR_H -#define EXPR_H +#ifndef CNN_EXPR_H +#define CNN_EXPR_H #include "cnn/cnn.h" #include "cnn/nodes.h" From 86aa406cbc983849fd1c826e3966ae8c444e34b5 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 17 Aug 2015 23:59:06 -0400 Subject: [PATCH 207/965] start replacing abort() with throw --- cnn/aligned-mem-pool.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h index 0ffb559ad..a480251be 100644 --- a/cnn/aligned-mem-pool.h +++ b/cnn/aligned-mem-pool.h @@ -4,6 +4,7 @@ #include #include #include +#include //#if HAVE_MM_MALLOC #include //#endif @@ -16,19 +17,15 @@ namespace cnn { inline void* cnn_mm_malloc(size_t n, size_t align) { -//#if HAVE_MM_MALLOC void* ptr = nullptr; #if HAVE_CUDA CUDA_CHECK(cudaMalloc(&ptr, n)); #else ptr = _mm_malloc(n, align); #endif -//#else -// return std::malloc(n, align); -//#endif if (!ptr) { std::cerr << "Memory allocation failed n=" << n << " align=" << align << std::endl; - abort(); + throw std::runtime_error("Memory allocation failed in cnn_mm_malloc()"); } return ptr; } From 6074b374b7daa15595b9b16ec33356dd4a83b453 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 18 Aug 2015 00:28:53 -0400 Subject: [PATCH 208/965] transition to throw from abort --- cnn/cnn.cc | 5 ++--- cnn/conv.cc | 20 ++++++++++---------- cnn/cuda.cc | 2 +- cnn/cuda.h | 12 ++++++++++-- cnn/dict.h | 3 ++- 5 files changed, 25 insertions(+), 17 deletions(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 00ab0b5a9..10911b0cd 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -22,9 +22,8 @@ ComputationGraph::ComputationGraph() : last_node_evaluated(), ee(new SimpleExecutionEngine(*this)) { ++n_hgs; if (n_hgs > 1) { - // TODO handle memory better - cerr << "Memory allocator assumes only a single hypergraph at a time.\n"; - abort(); + cerr << "Memory allocator assumes only a single ComputationGraph at a time.\n"; + throw std::runtime_error("Attempted to create >1 CG"); } } diff --git a/cnn/conv.cc b/cnn/conv.cc index 81ce7db65..28f202f89 100644 --- a/cnn/conv.cc +++ b/cnn/conv.cc @@ -3,6 +3,7 @@ #include #include #include +#include #include "cnn/functors.h" #if HAVE_CUDA @@ -23,7 +24,7 @@ string AddVectorToAllColumns::as_string(const vector& arg_names) const { Dim AddVectorToAllColumns::dim_forward(const vector& xs) const { if (xs.size() != 2 || xs[0].rows() != xs[1].rows() || xs[0].ndims() != 2 || xs[1].ndims() != 1) { cerr << "Bad input dimensions in AddVectorToAllColumns: " << xs << endl; - abort(); + throw std::invalid_argument("bad input dimensions in AddVectorToAllColumns"); } return xs[0]; } @@ -58,7 +59,7 @@ Dim FoldRows::dim_forward(const vector& xs) const { int orows = xs[0].rows() / nrows; if ((orows * nrows != xs[0].rows()) || xs.size() != 1 || xs[0].ndims() != 2) { cerr << "Bad input dimensions in FoldRows: " << xs << endl; - abort(); + throw std::invalid_argument("bad input dimensions in FoldRows"); } return Dim({orows, xs[0].cols()}); } @@ -99,14 +100,14 @@ string Conv1DNarrow::as_string(const vector& arg_names) const { Dim Conv1DNarrow::dim_forward(const vector& xs) const { if (xs.size() != 2) { cerr << "Conv1DNarrow requires two inputs: " << xs << endl; - abort(); + throw std::invalid_argument("Conv1DNarrow requires 2 dimensions"); } int ocols = xs[0].cols() - xs[1].cols() + 1; if (xs[0].ndims() != 2 || xs[1].ndims() != 2 || xs[0].rows() != xs[1].rows() || ocols < 1) { cerr << "Bad input dimensions in Conv1DNarrow: " << xs << endl; - abort(); + throw std::invalid_argument("bad input dimensions in Conv1DNarrow"); } return Dim({xs[0].rows(), ocols}); } @@ -169,13 +170,13 @@ string Conv1DWide::as_string(const vector& arg_names) const { Dim Conv1DWide::dim_forward(const vector& xs) const { if (xs.size() != 2) { cerr << "Conv1DWide requires two inputs: " << xs << endl; - abort(); + throw std::invalid_argument("Conv1DWide requires two inputs"); } int ocols = xs[0].cols() + xs[1].cols() - 1; if (xs[0].ndims() != 2 || xs[1].ndims() != 2 || xs[0].rows() != xs[1].rows()) { cerr << "Bad input dimensions in Conv1DWide: " << xs << endl; - abort(); + throw std::invalid_argument("bad input dimensions in Conv1DWide"); } return Dim({xs[0].rows(), ocols}); } @@ -237,12 +238,11 @@ string KMaxPooling::as_string(const vector& arg_names) const { Dim KMaxPooling::dim_forward(const vector& xs) const { if (k < 1) { cerr << "Bad bad k in KMaxPooling: " << k << endl; - abort(); + throw std::invalid_argument("bad k in KMaxPooling"); } - if (xs[0].ndims() != 2 || - (xs[0].cols() < k)) { + if (xs[0].ndims() != 2 || (xs[0].cols() < k)) { cerr << "Bad input dimensions in KMaxPooling: " << xs << endl; - abort(); + throw std::invalid_argument("bad input dimensions in KMaxPooling"); } return Dim({xs[0].rows(), k}); } diff --git a/cnn/cuda.cc b/cnn/cuda.cc index dcc3c7316..35dcbbf85 100644 --- a/cnn/cuda.cc +++ b/cnn/cuda.cc @@ -14,7 +14,7 @@ void Initialize_GPU(int& argc, char**& argv) { CUDA_CHECK(cudaGetDeviceCount(&nDevices)); if (nDevices < 1) { cerr << "No GPUs found, recompile without DENABLE_CUDA=1\n"; - abort(); + throw std::runtime_error("No GPUs found but CNN compiled with CUDA support."); } size_t free_bytes, total_bytes, max_free = 0; int selected = 0; diff --git a/cnn/cuda.h b/cnn/cuda.h index 4ea677f78..52a69fe92 100644 --- a/cnn/cuda.h +++ b/cnn/cuda.h @@ -4,16 +4,24 @@ #include #include +#include #include #include #include +namespace cnn { +class CudaException : public std::runtime_error { + public: + explicit CudaException(const char* msg) : runtime_error(msg) {} +}; +} // namespace cnn + #define CUDA_CHECK(stmt) do { \ cudaError_t err = stmt; \ if (err != cudaSuccess) { \ std::cerr << "CUDA failure in " << #stmt << std::endl\ << cudaGetErrorString(err) << std::endl; \ - abort(); \ + throw CudaException(#stmt); \ } \ } while(0) @@ -22,7 +30,7 @@ if (stat != CUBLAS_STATUS_SUCCESS) { \ std::cerr << "CUBLAS failure in " << #stmt \ << std::endl << stat << std::endl; \ - abort(); \ + throw CudaException(#stmt); \ } \ } while(0) diff --git a/cnn/dict.h b/cnn/dict.h index a180c0b87..4394db02b 100644 --- a/cnn/dict.h +++ b/cnn/dict.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #if BOOST_VERSION >= 105600 @@ -36,7 +37,7 @@ class Dict { if (i == d_.end()) { if (frozen) { std::cerr << "Unknown word encountered: " << word << std::endl; - abort(); + throw std::runtime_error("Unknown word encountered in frozen dictionary: " + word); } words_.push_back(word); return d_[word] = words_.size() - 1; From 36ca901e5ad6866d6f4eb8e6b3158c2a4caa81b4 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 18 Aug 2015 01:02:35 -0400 Subject: [PATCH 209/965] partial port away from abort(), get rid of dead code --- cnn/aligned-mem-pool.h | 6 ++--- cnn/cuda.h | 11 +++------ cnn/except.h | 30 ++++++++++++++++++++++++ cnn/graph.cc | 5 ++-- cnn/model.cc | 3 ++- cnn/nodes-common.cc | 11 --------- cnn/nodes.cc | 52 +++--------------------------------------- cnn/nodes.h | 18 --------------- 8 files changed, 42 insertions(+), 94 deletions(-) create mode 100644 cnn/except.h diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h index a480251be..566f94bdf 100644 --- a/cnn/aligned-mem-pool.h +++ b/cnn/aligned-mem-pool.h @@ -4,10 +4,8 @@ #include #include #include -#include -//#if HAVE_MM_MALLOC #include -//#endif +#include "cnn/except.h" #if HAVE_CUDA #include "cnn/cuda.h" #include @@ -25,7 +23,7 @@ inline void* cnn_mm_malloc(size_t n, size_t align) { #endif if (!ptr) { std::cerr << "Memory allocation failed n=" << n << " align=" << align << std::endl; - throw std::runtime_error("Memory allocation failed in cnn_mm_malloc()"); + throw cnn::out_of_memory("Memory allocation failed in cnn_mm_malloc()"); } return ptr; } diff --git a/cnn/cuda.h b/cnn/cuda.h index 52a69fe92..92f85e3b8 100644 --- a/cnn/cuda.h +++ b/cnn/cuda.h @@ -9,19 +9,14 @@ #include #include -namespace cnn { -class CudaException : public std::runtime_error { - public: - explicit CudaException(const char* msg) : runtime_error(msg) {} -}; -} // namespace cnn +#include "cnn/except.h" #define CUDA_CHECK(stmt) do { \ cudaError_t err = stmt; \ if (err != cudaSuccess) { \ std::cerr << "CUDA failure in " << #stmt << std::endl\ << cudaGetErrorString(err) << std::endl; \ - throw CudaException(#stmt); \ + throw cnn::cuda_exception(#stmt); \ } \ } while(0) @@ -30,7 +25,7 @@ class CudaException : public std::runtime_error { if (stat != CUBLAS_STATUS_SUCCESS) { \ std::cerr << "CUBLAS failure in " << #stmt \ << std::endl << stat << std::endl; \ - throw CudaException(#stmt); \ + throw cnn::cuda_exception(#stmt); \ } \ } while(0) diff --git a/cnn/except.h b/cnn/except.h new file mode 100644 index 000000000..8c0df02f5 --- /dev/null +++ b/cnn/except.h @@ -0,0 +1,30 @@ +#ifndef CNN_EXCEPT_H_ +#define CNN_EXCEPT_H_ + +#include + +namespace cnn { + +// if CNN exhausts its memory pool +class out_of_memory : public std::runtime_error { + public: + out_of_memory(const std::string& what_arg) : runtime_error(what_arg) {} +}; + +// this error occurs when some logic is +// attempted to execut on a CUDA backend but the +// logic has not been implemented. +class cuda_not_implemented : public std::logic_error { + public: + cuda_not_implemented(const std::string& what_arg) : logic_error(what_arg) {} +}; + +// this is thrown when cuda returns an error (bad arguments, memory, state, etc) +class cuda_exception : public std::runtime_error { + public: + cuda_exception(const std::string& what_arg) : runtime_error(what_arg) {} +}; + +} // namespace cnn + +#endif diff --git a/cnn/graph.cc b/cnn/graph.cc index 21b9bcc20..5e2c9f3bd 100644 --- a/cnn/graph.cc +++ b/cnn/graph.cc @@ -28,8 +28,7 @@ void GraphOptimize(ComputationGraph* cg) { } cerr << "LONGEST PATH: " << longest_paths[i] << "\tx" << i << " = " << nodes[i]->as_string(x) << endl; } - abort(); + abort();// DEBUGGING } - -} // namespace cnn +} // namespaiice cnn diff --git a/cnn/model.cc b/cnn/model.cc index 0a2113688..f407aa03a 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -82,7 +82,8 @@ void LookupParameters::scale_parameters(float a) { void LookupParameters::Initialize(unsigned index, const vector& val) { assert(int(val.size()) == int(dim.size())); #if HAVE_CUDA - cerr << "implement LookupParameters::Initialize\n"; abort(); + cerr << "implement LookupParameters::Initialize\n"; + throw cuda_not_implemented("LookupParameters::Initialize"); #else memcpy(values[index].v, &val[0], val.size() * sizeof(float)); #endif diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 916eccbb9..eda0f27a9 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -382,17 +382,6 @@ Dim Identity::dim_forward(const vector& xs) const { return xs[0]; } -string MaxPooling1D::as_string(const vector& arg_names) const { - ostringstream os; - os << "maxpool1d(" << arg_names.front() << ",w=" << width << ")"; - return os.str(); -} - -Dim MaxPooling1D::dim_forward(const vector& xs) const { - cerr << "MaxPooling1D::dim_forward not implemented\n"; - abort(); -} - string Softmax::as_string(const vector& arg_names) const { ostringstream s; s << "softmax(" << arg_names[0] << ')'; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index e64d4b3fb..cd1ab9b10 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -177,7 +177,9 @@ void SumColumns::forward(const vector& xs, Tensor& fx) const { auto y = *fx; if (xs.size() == 1) { y = x.rowwise().sum(); - } else { abort(); } + } else { + throw std::invalid_argument("two inputs in SumColumns::forward!"); + } } void SumColumns::backward(const vector& xs, @@ -619,54 +621,6 @@ void Identity::backward(const vector& xs, *dEdxi += *dEdf; } -void MaxPooling1D::forward(const vector& xs, Tensor& fx) const { - cerr << "FIX IMPL5\n"; abort(); -#if 0 - assert(xs.size() == 1); - const Tensor& x = *xs.front(); - const unsigned x_rows = x.rows(); - assert(x.cols() == 1); - const unsigned fx_rows = x_rows / width; - ind.resize(fx_rows); - Tensor fx = Zero(Dim(fx_rows, 1)); - for (unsigned i = 0; i < fx_rows; ++i) { - unsigned from = i * width; - unsigned to = from + width; - if (to > x_rows) to = x_rows; - real best = x(from, 0); - unsigned bestr = from; - for (unsigned r = from + 1; r < to; ++r) { - if (x(r, 0) > best) { - best = x(r,0); - bestr = r; - } - } - ind[i] = bestr; - fx(i, 0) = best; - } - return fx; -#endif -} - -void MaxPooling1D::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - cerr << "FIX IMPL6\n"; abort(); -#if 0 - const Tensor& x = *xs.front(); - const unsigned x_rows = x.rows(); - Tensor dEdx = Zero(Dim(x_rows, 1)); - const unsigned fx_rows = x_rows / width; - assert(fx_rows == ind.size()); - assert(fx_rows == dEdf.rows()); - for (unsigned i = 0; i < fx_rows; ++i) - dEdx(ind[i], 0) = dEdf(i, 0); - return dEdx; -#endif -} - template EIGEN_STRONG_INLINE float logsumexp(const T& x) { const float m = x.maxCoeff(); diff --git a/cnn/nodes.h b/cnn/nodes.h index bdaa103cc..b076c05d9 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -342,24 +342,6 @@ struct Identity : public Node { Tensor& dEdxi) const override; }; -// hyperparameter: width > 1 -// x_1 is a vector in R^n, which we write x -// y is a vector in R^{n / width} -// y_i = max_{x_{i * width - width + 1}, ..., x_{i * width}} -struct MaxPooling1D : public Node { - MaxPooling1D(const std::initializer_list& a, unsigned w) : Node(a), width(w) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; - unsigned width; - mutable std::vector ind; -}; - // y = x_1 * x_2 struct MatrixMultiply : public Node { explicit MatrixMultiply(const std::initializer_list& a) : Node(a) {} From a0b178f599577cf0cd06f26758841d6d15c6b98b Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 18 Aug 2015 01:18:12 -0400 Subject: [PATCH 210/965] example porting --- cnn/nodes-common.cc | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index eda0f27a9..f350d03c3 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -26,7 +26,7 @@ string Min::as_string(const vector& arg_names) const { Dim Min::dim_forward(const vector& xs) const { if (xs.size() != 2 || xs[0] != xs[1]) { cerr << "Bad arguments in Min: " << xs << endl; - abort(); + throw std::invalid_argument("invalid arguments to Min"); } return xs[0]; } @@ -40,7 +40,7 @@ string Max::as_string(const vector& arg_names) const { Dim Max::dim_forward(const vector& xs) const { if (xs.size() != 2 || xs[0] != xs[1]) { cerr << "Bad arguments in Max: " << xs << endl; - abort(); + throw std::invalid_argument("invalid arguments to Max"); } return xs[0]; } @@ -54,7 +54,7 @@ string TraceOfProduct::as_string(const vector& arg_names) const { Dim TraceOfProduct::dim_forward(const vector& xs) const { if (xs.size() != 2 || xs[0] != xs[1]) { cerr << "Bad arguments in TraceOfProduct: " << xs << endl; - abort(); + throw std::invalid_argument("invalid arguments to TraceOfProduct"); } return Dim({1}); } @@ -68,7 +68,7 @@ string ConstScalarMultiply::as_string(const vector& arg_names) const { Dim ConstScalarMultiply::dim_forward(const vector& xs) const { if (xs.size() != 1) { cerr << "ConstScalarMultiply expects one argument: " << xs << endl; - abort(); + throw std::invalid_argument("ConstScalarMultiply expects one argument"); } return xs[0]; } @@ -80,10 +80,13 @@ string DotProduct::as_string(const vector& arg_names) const { } Dim DotProduct::dim_forward(const vector& xs) const { - assert(xs.size() == 2); - assert(LooksLikeVector(xs[0])); - assert(LooksLikeVector(xs[1])); - assert(xs[0].rows() == xs[1].rows()); + if (xs.size() != 2 || + !LooksLikeVector(xs[0]) || + !LooksLikeVector(xs[1]) || + xs[0].rows() != xs[1].rows()) { + cerr << "Bad arguments to DotProduct: " << xs << endl; + throw std::invalid_argument("Bad arguments to DotProduct"); + } return Dim({1}); } @@ -94,7 +97,10 @@ string Transpose::as_string(const vector& arg_names) const { } Dim Transpose::dim_forward(const vector& xs) const { - assert(xs.size() == 1); + if (xs.size() != 1) { + cerr << "Bad arguments to Transpose: " << xs << endl; + throw std::invalid_argument("Bad arguments to Transpose"); + } return xs[0].transpose(); } @@ -549,14 +555,14 @@ string AffineTransform::as_string(const vector& arg_names) const { Dim AffineTransform::dim_forward(const vector& xs) const { if ((xs.size() - 1) % 2 != 0) { cerr << "Bad number of inputs for AffineTransform: " << xs << endl; - abort(); + throw std::invalid_argument("Bad number of inputs to AffineTransform"); } for (unsigned i = 1; i < xs.size(); i += 2) { if (xs[i].cols() != xs[i+1].rows() || xs[0].rows() != xs[i].rows() || xs[0].cols() != xs[i+1].cols()) { cerr << "Bad dimensions for AffineTransform: " << xs << endl; - abort(); + throw std::invalid_argument("Bad dimensions to AffineTransform"); } } return xs[0]; From 5dd7f86dd507300d86d82215cb1c0afe18536787 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Wed, 19 Aug 2015 00:25:04 +0300 Subject: [PATCH 211/965] pick and pickrange as indexing. --- pycnn/pycnn.pyx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index f9a61a6a8..f9e1ef032 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -346,6 +346,12 @@ cdef class Expression: #{{{ def __str__(self): return "exprssion %s/%s" % (self.vindex, self.cg_version) + def __getitem__(self, int i): + return pick(self, i) + + def __getslice__(self, int i, int j): + return pickrange(self, i, j) + cpdef scalar_value(self): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") return c_as_scalar(self.cg.get_value(self.vindex)) From 15f85016c05be14bdfdcf936bad847c22e40ef85 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Wed, 19 Aug 2015 01:40:17 +0300 Subject: [PATCH 212/965] fix representation as numpy arrays to work in the column-major rep of Eigen. --- pycnn/pycnn.pyx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index f9e1ef032..7c4b76415 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -55,7 +55,7 @@ cdef c_tensor_as_np(CTensor &t): # TODO: make more efficient, with less copy arr = np.array(c_as_vector(t)) if t.d.ndims() == 1: return arr - else: return arr.reshape(t.d.rows(), t.d.cols()) + else: return arr.reshape(t.d.rows(), t.d.cols(),order='F') # {{{ Model / Parameters cdef class Parameters: @@ -129,7 +129,7 @@ cdef class LookupParameters: """ cdef vector[CTensor] vals vals = self.thisptr.values - return np.vstack([c_tensor_as_np(t).reshape(1,-1) for t in vals]) + return np.vstack([c_tensor_as_np(t).reshape(1,-1,order='F') for t in vals]) cdef class Model: @@ -368,7 +368,7 @@ cdef class Expression: #{{{ dim = t.d arr = np.array(c_as_vector(t)) if dim.ndims() == 2: - arr = arr.reshape(dim.rows(), dim.cols()) + arr = arr.reshape(dim.rows(), dim.cols(),order='F') return arr cpdef value(self): From 45166ba9884f28de7928f1fd36dadf9478acc403 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Wed, 19 Aug 2015 14:17:33 +0300 Subject: [PATCH 213/965] some doc --- pycnn/pycnn.pyx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 7c4b76415..5e64a1a61 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -542,6 +542,9 @@ cpdef Expression sum_cols(Expression x): return Expression.from_cexpr(x.cg_versi #expr-opt cpdef Expression fold_rows(Expression x, unsigned nrows=2): return Expression.from_cexpr(x.cg_version, c_fold_rows(x.c(),nrows)) #expr-expr-opt +# x is scalar or row vector +# y is scalar or row vector +# res = max(0, m - x + y) cpdef Expression pairwise_rank_loss(Expression x, Expression y, float m=1.0): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_pairwise_rank_loss(x.c(), y.c(), m)) cpdef Expression huber_distance(Expression x, Expression y, float c=1.345): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_huber_distance(x.c(), y.c(), c)) #expr-unsigned From 806e4efc086ef4d67fd8b7f20b900bd871be23ad Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Wed, 19 Aug 2015 14:24:13 +0300 Subject: [PATCH 214/965] Create INSTALL --- pycnn/INSTALL | 1 + 1 file changed, 1 insertion(+) create mode 100644 pycnn/INSTALL diff --git a/pycnn/INSTALL b/pycnn/INSTALL new file mode 100644 index 000000000..6aacc2fad --- /dev/null +++ b/pycnn/INSTALL @@ -0,0 +1 @@ +See installation instruction in ../INSTALL.md From 9ad802b0828f46c3725c2c5d07d06d5d4111f39b Mon Sep 17 00:00:00 2001 From: Austin Matthews Date: Sat, 22 Aug 2015 19:01:46 -0700 Subject: [PATCH 215/965] Added ability to specify random seed when calling cnn::initialize. Default is still to pick a seed randomly. --- cnn/init.cc | 10 ++++++---- cnn/init.h | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/cnn/init.cc b/cnn/init.cc index 599ccaa3e..1bb77ebef 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -20,7 +20,7 @@ AlignedMemoryPool* fxs = nullptr; AlignedMemoryPool* dEdfs = nullptr; mt19937* rndeng = nullptr; -void Initialize(int& argc, char**& argv) { +void Initialize(int& argc, char**& argv, unsigned random_seed) { cerr << "Initializing...\n"; #if HAVE_CUDA Initialize_GPU(argc, argv); @@ -32,9 +32,11 @@ void Initialize(int& argc, char**& argv) { kSCALAR_ZERO = (float*) cnn_mm_malloc(sizeof(float), 256); *kSCALAR_ZERO = 0; #endif - random_device rd; - //rndeng = new mt19937(1); - rndeng = new mt19937(rd()); + if (random_seed == 0) { + random_device rd; + random_seed = rd(); + } + rndeng = new mt19937(random_seed); cerr << "Allocating memory...\n"; fxs = new AlignedMemoryPool(512UL*(1UL<<20)); dEdfs = new AlignedMemoryPool(512UL*(1UL<<20)); diff --git a/cnn/init.h b/cnn/init.h index 74b82f984..95eccc17f 100644 --- a/cnn/init.h +++ b/cnn/init.h @@ -3,7 +3,7 @@ namespace cnn { -void Initialize(int& argc, char**& argv); +void Initialize(int& argc, char**& argv, unsigned random_seed = 0); } // namespace cnn From c6d96d0acf5c0c1c6ca865d808b21d2ccee701f7 Mon Sep 17 00:00:00 2001 From: Austin Matthews Date: Sat, 22 Aug 2015 19:02:47 -0700 Subject: [PATCH 216/965] Added ability to forward() or incremental_forward() up to a specific VariableIndex. This is particularly helpful when debugging computation graphs. --- cnn/exec.cc | 18 ++++++++++++++---- cnn/exec.h | 8 ++++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/cnn/exec.cc b/cnn/exec.cc index 1645ef6bc..fe868c340 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -11,24 +11,34 @@ ExecutionEngine::~ExecutionEngine() {} void SimpleExecutionEngine::invalidate() { last_node_evaluated = 0; } -const Tensor& SimpleExecutionEngine::forward() { + +const Tensor& SimpleExecutionEngine::forward() { + const VariableIndex node_max_index = (VariableIndex)cg.nodes.size(); + return forward(node_max_index); +} + +const Tensor& SimpleExecutionEngine::forward(VariableIndex i) { invalidate(); - return incremental_forward(); + return incremental_forward(i); } const Tensor& SimpleExecutionEngine::get_value(VariableIndex i) { assert(i < cg.nodes.size()); if (i >= last_node_evaluated) { - incremental_forward(); + incremental_forward(i); } return nfxs[i]; } const Tensor& SimpleExecutionEngine::incremental_forward() { + const VariableIndex node_max_index = (VariableIndex)cg.nodes.size(); + return incremental_forward(node_max_index); +} + +const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex node_max_index) { // free any old memory if this is a new HG if (last_node_evaluated == 0) fxs->free(); - const unsigned node_max_index = cg.nodes.size(); assert(node_max_index > 0); nfxs.resize(node_max_index); if (node_max_index - last_node_evaluated == 0) diff --git a/cnn/exec.h b/cnn/exec.h index deb680c45..40555b316 100644 --- a/cnn/exec.h +++ b/cnn/exec.h @@ -10,8 +10,10 @@ class ExecutionEngine { virtual ~ExecutionEngine(); virtual void invalidate() = 0; virtual const Tensor& forward() = 0; + virtual const Tensor& forward(VariableIndex i) = 0; virtual const Tensor& incremental_forward() = 0; // if you want to add nodes and evaluate just the new parts - virtual const Tensor& get_value(VariableIndex i) = 0; + virtual const Tensor& incremental_forward(VariableIndex i) = 0; + virtual const Tensor& get_value(VariableIndex i) = 0; virtual void backward() = 0; protected: explicit ExecutionEngine(const ComputationGraph& cg) : cg(cg) {} @@ -23,8 +25,10 @@ class SimpleExecutionEngine : public ExecutionEngine { explicit SimpleExecutionEngine(const ComputationGraph& cg) : ExecutionEngine(cg) {} void invalidate() override; const Tensor& forward() override; + const Tensor& forward(VariableIndex i) override; const Tensor& incremental_forward() override; // if you want to add nodes and evaluate just the new parts - const Tensor& get_value(VariableIndex i) override; + const Tensor& incremental_forward(VariableIndex i) override; + const Tensor& get_value(VariableIndex i) override; void backward() override; private: std::vector nfxs; From f011fc1b3214ff7b35fe6b5581cc3c4f2d155115 Mon Sep 17 00:00:00 2001 From: Austin Matthews Date: Sat, 22 Aug 2015 19:03:52 -0700 Subject: [PATCH 217/965] Removed unnecessary spaces --- cnn/CMakeLists.txt | 8 ++++---- cnn/cnn-helper.h | 2 +- cnn/conv.cc | 2 +- cnn/deep-lstm.cc | 4 ++-- cnn/deep-lstm.h | 4 ++-- cnn/dict.cc | 2 +- cnn/gpu-ops.cu | 2 +- cnn/gru.cc | 2 +- cnn/gru.h | 2 +- cnn/lstm.cc | 8 ++++---- cnn/lstm.h | 4 ++-- cnn/rnn.cc | 4 ++-- cnn/rnn.h | 2 +- cnn/training.cc | 2 +- cnn/treelstm.cc | 10 +++++----- cnn/treelstm.h | 4 ++-- 16 files changed, 31 insertions(+), 31 deletions(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 096c4b839..673a20180 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -75,13 +75,13 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) #link to Boost libraries AND your targets and dependencies # target_link_libraries(${testName} cnn ${LIBS}) -# set_target_properties(${testName} PROPERTIES +# set_target_properties(${testName} PROPERTIES # RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests.bin) - #Finally add it to test execution - + #Finally add it to test execution - #Notice the WORKING_DIRECTORY and COMMAND -# add_test(NAME ${testName} -# WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests.bin +# add_test(NAME ${testName} +# WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests.bin # COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tests.bin/${testName} ) #endforeach(test_src) diff --git a/cnn/cnn-helper.h b/cnn/cnn-helper.h index 3b796a61a..4fa7aeab6 100644 --- a/cnn/cnn-helper.h +++ b/cnn/cnn-helper.h @@ -3,7 +3,7 @@ #include -/// helper functions +/// helper functions namespace cnn { diff --git a/cnn/conv.cc b/cnn/conv.cc index 28f202f89..c5a590b1f 100644 --- a/cnn/conv.cc +++ b/cnn/conv.cc @@ -263,7 +263,7 @@ void KMaxPooling::forward(const vector& xs, Tensor& fx) const { int* maxmap = static_cast(aux_mem); for (unsigned i=0; i < rows; ++i) { //cerr << "row(" << i << ")=" << x.row(i) << endl; - for (unsigned j=0; j < xcols; ++j) + for (unsigned j=0; j < xcols; ++j) tmp[j] = -x(i,j); nth_element(tmp, tmp + (k-1), tmp + xcols); const float c = -tmp[k-1]; // kth largest element in row i diff --git a/cnn/deep-lstm.cc b/cnn/deep-lstm.cc index 222969bae..e3d6a2ff0 100644 --- a/cnn/deep-lstm.cc +++ b/cnn/deep-lstm.cc @@ -25,7 +25,7 @@ DeepLSTMBuilder::DeepLSTMBuilder(unsigned layers, Parameters* p_h2i = model->add_parameters({hidden_dim, hidden_dim}); Parameters* p_c2i = model->add_parameters({hidden_dim, hidden_dim}); Parameters* p_bi = model->add_parameters({hidden_dim}); - + // o Parameters* p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); Parameters* p_h2o = model->add_parameters({hidden_dim, hidden_dim}); @@ -142,7 +142,7 @@ Expression DeepLSTMBuilder::add_input_impl(int prev, const Expression& x) { } else { ct[i] = cwise_multiply(i_it,i_wt); } - + Expression i_aot; if (has_prev_state) // i_aot = vars[BO] + vars[X2O] * in + vars[H2O] * i_h_tm1 + vars[C2O] * ct[i]; diff --git a/cnn/deep-lstm.h b/cnn/deep-lstm.h index 9a14c713e..3cc2f550e 100644 --- a/cnn/deep-lstm.h +++ b/cnn/deep-lstm.h @@ -20,7 +20,7 @@ struct DeepLSTMBuilder : public RNNBuilder { Expression back() const { return h.back().back(); } std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const { + std::vector final_s() const { std::vector ret = (c.size() == 0 ? c0 : c.back()); for(auto my_h : final_h()) ret.push_back(my_h); return ret; @@ -37,7 +37,7 @@ struct DeepLSTMBuilder : public RNNBuilder { // first index is layer, then ... std::vector> param_vars; - // first index is time, second is layer + // first index is time, second is layer std::vector> h, c; std::vector o; diff --git a/cnn/dict.cc b/cnn/dict.cc index f0b37403b..37e5bfd2e 100644 --- a/cnn/dict.cc +++ b/cnn/dict.cc @@ -25,7 +25,7 @@ void ReadSentencePair(const std::string& line, std::vector* s, Dict* sd, st std::string word; std::string sep = "|||"; Dict* d = sd; - std::vector* v = s; + std::vector* v = s; while(in) { in >> word; if (!in) break; diff --git a/cnn/gpu-ops.cu b/cnn/gpu-ops.cu index 0ad62c5c7..73f92c5e5 100644 --- a/cnn/gpu-ops.cu +++ b/cnn/gpu-ops.cu @@ -209,7 +209,7 @@ void softmax_backward(int n, const float* fx, const float* dEdf, float* dEdx) { cudaMalloc((void **)&gpu_ods, sizeof(float)); ker_dotproduct<<>>(n, fx, dEdf, gpu_ods); cudaMemcpy(&ods, gpu_ods, sizeof(float), cudaMemcpyDeviceToHost); - cudaFree(gpu_ods); + cudaFree(gpu_ods); accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FSoftmaxBackward(-ods)); } diff --git a/cnn/gru.cc b/cnn/gru.cc index f74179a5e..d256a3356 100644 --- a/cnn/gru.cc +++ b/cnn/gru.cc @@ -24,7 +24,7 @@ GRUBuilder::GRUBuilder(unsigned layers, Parameters* p_x2z = model->add_parameters({hidden_dim, layer_input_dim}); Parameters* p_h2z = model->add_parameters({hidden_dim, hidden_dim}); Parameters* p_bz = model->add_parameters({hidden_dim}); - + // r Parameters* p_x2r = model->add_parameters({hidden_dim, layer_input_dim}); Parameters* p_h2r = model->add_parameters({hidden_dim, hidden_dim}); diff --git a/cnn/gru.h b/cnn/gru.h index 22e03262f..34b96774b 100644 --- a/cnn/gru.h +++ b/cnn/gru.h @@ -31,7 +31,7 @@ struct GRUBuilder : public RNNBuilder { // first index is layer, then ... std::vector> param_vars; - // first index is time, second is layer + // first index is time, second is layer std::vector> h; // initial values of h at each layer diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 6b17476b5..4124375b1 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -25,7 +25,7 @@ LSTMBuilder::LSTMBuilder(unsigned layers, Parameters* p_h2i = model->add_parameters({hidden_dim, hidden_dim}); Parameters* p_c2i = model->add_parameters({hidden_dim, hidden_dim}); Parameters* p_bi = model->add_parameters({hidden_dim}); - + // o Parameters* p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); Parameters* p_h2o = model->add_parameters({hidden_dim, hidden_dim}); @@ -66,8 +66,8 @@ void LSTMBuilder::new_graph_impl(ComputationGraph& cg){ vector vars = {i_x2i, i_h2i, i_c2i, i_bi, i_x2o, i_h2o, i_c2o, i_bo, i_x2c, i_h2c, i_bc}; param_vars.push_back(vars); - - + + } } @@ -139,7 +139,7 @@ Expression LSTMBuilder::add_input_impl(int prev, const Expression& x) { } else { ct[i] = cwise_multiply(i_it,i_wt); } - + Expression i_aot; if (has_prev_state) // i_aot = vars[BO] + vars[X2O] * in + vars[H2O] * i_h_tm1 + vars[C2O] * ct[i]; diff --git a/cnn/lstm.h b/cnn/lstm.h index 908d85a9b..774f078ed 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -20,7 +20,7 @@ struct LSTMBuilder : public RNNBuilder { Expression back() const { return h.back().back(); } std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const { + std::vector final_s() const { std::vector ret = (c.size() == 0 ? c0 : c.back()); for(auto my_h : final_h()) ret.push_back(my_h); return ret; @@ -39,7 +39,7 @@ struct LSTMBuilder : public RNNBuilder { // first index is layer, then ... std::vector> param_vars; - // first index is time, second is layer + // first index is time, second is layer std::vector> h, c; // initial values of h and c at each layer diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 07174a3c1..2cf093d6b 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -20,7 +20,7 @@ RNNBuilder::~RNNBuilder() {} SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model, + Model* model, bool support_lags) : layers(layers), lagging(support_lags) { unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { @@ -95,7 +95,7 @@ Expression SimpleRNNBuilder::add_auxiliary_input(const Expression &in, const Exp Expression y = affine_transform({vars[HB], vars[X2H], x, vars[L2H], aux}); - if (t == 0 && h0.size() > 0) + if (t == 0 && h0.size() > 0) y = y + vars[H2H] * h0[i]; else if (t >= 1) y = y + vars[H2H] * h[t-1][i]; diff --git a/cnn/rnn.h b/cnn/rnn.h index f38a2c481..af0a411ec 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -120,7 +120,7 @@ struct SimpleRNNBuilder : public RNNBuilder { // first index is layer, then x2h h2h hb std::vector> param_vars; - // first index is time, second is layer + // first index is time, second is layer std::vector> h; // initial value of h diff --git a/cnn/training.cc b/cnn/training.cc index 340f3f745..93111f66d 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -84,7 +84,7 @@ void MomentumSGDTrainer::update(real scale) { void AdagradTrainer::update(real scale) { unsigned pi; if (!shadow_params_allocated) { - vp = AllocateShadowParameters(*model); + vp = AllocateShadowParameters(*model); vlp = AllocateShadowLookupParameters(*model); shadow_params_allocated = true; } diff --git a/cnn/treelstm.cc b/cnn/treelstm.cc index 6d6f8b5fb..f5a5f3c89 100644 --- a/cnn/treelstm.cc +++ b/cnn/treelstm.cc @@ -35,7 +35,7 @@ TreeLSTMBuilder::TreeLSTMBuilder(unsigned N, LookupParameters* p_h2f = model->add_lookup_parameters(N*N, {hidden_dim, hidden_dim}); Parameters* p_c2f = model->add_parameters({hidden_dim, hidden_dim}); Parameters* p_bf = model->add_parameters({hidden_dim}); - + // o Parameters* p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); LookupParameters* p_h2o = model->add_lookup_parameters(N, {hidden_dim, hidden_dim}); @@ -90,7 +90,7 @@ void TreeLSTMBuilder::new_graph_impl(ComputationGraph& cg){ lvars[k * (N + 3) + 3 + j] = lookup(cg, lp[H2F], k); } } - lparam_vars.push_back(lvars); + lparam_vars.push_back(lvars); } } @@ -125,7 +125,7 @@ Expression TreeLSTMBuilder::add_input(vector children, const Expression& x) const vector& vars = param_vars[i]; vector i_h_children, i_c_children; i_h_children.reserve(children.size() > 1 ? children.size() : 1); - i_c_children.reserve(children.size() > 1 ? children.size() : 1); + i_c_children.reserve(children.size() > 1 ? children.size() : 1); bool has_prev_state = (children.size() > 0 || has_initial_state); if (children.size() == 0) { @@ -163,7 +163,7 @@ Expression TreeLSTMBuilder::add_input(vector children, const Expression& x) i_ait = affine_transform({vars[BI], vars[X2I], in}); Expression i_it = logistic(i_ait); - // forget + // forget vector i_ft; for (unsigned k = 0; k < children.size(); ++k) { unsigned ek = (k < N) ? k : N - 1; @@ -218,7 +218,7 @@ Expression TreeLSTMBuilder::add_input(vector children, const Expression& x) else { ct[i] = cwise_multiply(i_it, i_wt); } - + // output Expression i_aot; if (has_prev_state) { diff --git a/cnn/treelstm.h b/cnn/treelstm.h index e7b9a863d..96a16b5d5 100644 --- a/cnn/treelstm.h +++ b/cnn/treelstm.h @@ -21,7 +21,7 @@ struct TreeLSTMBuilder : public RNNBuilder { Expression back() const { return h.back().back(); } std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const { + std::vector final_s() const { std::vector ret = (c.size() == 0 ? c0 : c.back()); for(auto my_h : final_h()) ret.push_back(my_h); return ret; @@ -43,7 +43,7 @@ struct TreeLSTMBuilder : public RNNBuilder { std::vector> param_vars; std::vector> lparam_vars; - // first index is time, second is layer + // first index is time, second is layer std::vector> h, c; // initial values of h and c at each layer From 988e341450bd21e0f6defc1216bff77e9c18b2b9 Mon Sep 17 00:00:00 2001 From: Austin Date: Fri, 28 Aug 2015 01:03:39 +0900 Subject: [PATCH 218/965] mp branch --- cnn/aligned-mem-pool.h | 35 +++++++++++++- cnn/cnn.h | 1 + cnn/init.cc | 13 ++++- cnn/init.h | 1 + cnn/model.cc | 10 ++-- examples/mp.cc | 106 +++++++++++++++++------------------------ 6 files changed, 97 insertions(+), 69 deletions(-) diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h index 566f94bdf..52f6678c0 100644 --- a/cnn/aligned-mem-pool.h +++ b/cnn/aligned-mem-pool.h @@ -4,6 +4,9 @@ #include #include #include +#include +#include +#include #include #include "cnn/except.h" #if HAVE_CUDA @@ -45,10 +48,11 @@ inline void cnn_mm_free(void* mem) { template class AlignedMemoryPool { public: - explicit AlignedMemoryPool(size_t cap) { + explicit AlignedMemoryPool(size_t cap, bool shared = false) : shared(shared) { sys_alloc(cap); zero_all(); } + // returns nullptr if OOM void* allocate(size_t n) { auto rounded_n = round_up_align(n); @@ -82,7 +86,33 @@ class AlignedMemoryPool { private: void sys_alloc(size_t cap) { capacity = round_up_align(cap); - mem = cnn_mm_malloc(capacity, 1 << AlignedBits); + if (shared) { + /*char* shared_filename = tmpnam(NULL); + open(shared_filename, O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666); + key_t shm_key = ftok(shared_filename, 'R'); + if (shm_key == -1) { + std::cerr << "Unable to get shared memory key" << std::endl; + abort(); + } + int shm_id = shmget(shm_key, capacity, 0644 | IPC_CREAT); + if (shm_id == -1) { + std::cerr << "Unable to create shared memory" << std::endl; + std::cerr << "Requested shared memory size: " << capacity << std::endl; + std::cerr << "Verify that this is less than the maximum shared memory size, which" << std::endl; + std::cerr << "can be found in /proc/sys/kernel/shmmax" << std::endl; + perror("shmget"); + abort(); + } + mem = shmat(shm_id, nullptr, 0); + if (mem == (void*)-1) { + std::cerr << "Unable to get shared memory pointer" << std::endl; + abort(); + }*/ + mem = mmap(NULL, capacity, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0); + } + else { + mem = cnn_mm_malloc(capacity, 1 << AlignedBits); + } used = 0; } void zero_all() { @@ -100,6 +130,7 @@ class AlignedMemoryPool { } size_t capacity; size_t used; + bool shared; void* mem; }; diff --git a/cnn/cnn.h b/cnn/cnn.h index f2ff70c32..2e997d232 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -26,6 +26,7 @@ namespace cnn { extern AlignedMemoryPool<6>* fxs; extern AlignedMemoryPool<6>* dEdfs; +extern AlignedMemoryPool<6>* ps; extern float* kSCALAR_MINUSONE; extern float* kSCALAR_ONE; extern float* kSCALAR_ZERO; diff --git a/cnn/init.cc b/cnn/init.cc index 1bb77ebef..14b1407a4 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -18,6 +18,7 @@ namespace cnn { #define ALIGN 6 AlignedMemoryPool* fxs = nullptr; AlignedMemoryPool* dEdfs = nullptr; +AlignedMemoryPool* ps = nullptr; mt19937* rndeng = nullptr; void Initialize(int& argc, char**& argv, unsigned random_seed) { @@ -38,10 +39,18 @@ void Initialize(int& argc, char**& argv, unsigned random_seed) { } rndeng = new mt19937(random_seed); cerr << "Allocating memory...\n"; - fxs = new AlignedMemoryPool(512UL*(1UL<<20)); - dEdfs = new AlignedMemoryPool(512UL*(1UL<<20)); + fxs = new AlignedMemoryPool(512UL*(1UL<<20)); // values + dEdfs = new AlignedMemoryPool(512UL*(1UL<<20)); // gradients + ps = new AlignedMemoryPool(512UL*(1UL<<20), true); // parameters cerr << "Done.\n"; } +void Cleanup() { + delete rndeng; + delete fxs; + delete dEdfs; + delete ps; +} + } // namespace cnn diff --git a/cnn/init.h b/cnn/init.h index 95eccc17f..e83125ab9 100644 --- a/cnn/init.h +++ b/cnn/init.h @@ -4,6 +4,7 @@ namespace cnn { void Initialize(int& argc, char**& argv, unsigned random_seed = 0); +void Cleanup(); } // namespace cnn diff --git a/cnn/model.cc b/cnn/model.cc index b519fe04a..7b139ff14 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -20,9 +20,11 @@ ParametersBase::~ParametersBase() {} Parameters::Parameters(const Dim& d, float scale) : dim(d) { values.d = g.d = d; - values.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); + //values.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); + values.v = static_cast(ps->allocate(d.size() * sizeof(float))); if (scale) TensorTools::Randomize(values, scale); else TensorTools::Randomize(values); - g.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); + //g.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); + g.v = static_cast(ps->allocate(d.size() * sizeof(float))); TensorTools::Zero(g); } @@ -69,12 +71,14 @@ LookupParameters::LookupParameters(unsigned n, const Dim& d) : dim(d), values(n) for (unsigned i = 0; i < n; ++i) { auto& v = values[i]; v.d = d; - v.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); + //v.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); + v.v = static_cast(ps->allocate(d.size() * sizeof(float))); TensorTools::Randomize(v); auto& g = grads[i]; g.d = d; g.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); + g.v = static_cast(ps->allocate(d.size() * sizeof(float))); TensorTools::Zero(g); } } diff --git a/examples/mp.cc b/examples/mp.cc index 0a6107415..cef7045e5 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -20,16 +20,11 @@ using namespace cnn; using namespace cnn::expr; struct SharedObject { - cnn::real m; - cnn::real b; - cnn::real loss; - - cnn::real temp_m; - cnn::real temp_b; + cnn::real fake; }; typedef pair Datum; -const unsigned num_children = 4; +const unsigned num_children = 1; SharedObject* shared_memory = nullptr; cnn::real ReadReal(int pipe) { @@ -138,10 +133,11 @@ int RunChild(unsigned cid, ComputationGraph& cg, Trainer* trainer, vector indices = ReadIntVector(workloads[cid].p2c[0]); - - TensorTools::SetElements(model_params.m->values, {shared_memory->m}); - TensorTools::SetElements(model_params.b->values, {shared_memory->b}); + cnn::real old_m = as_scalar(model_params.m->values); + cnn::real old_b = as_scalar(model_params.b->values); + + // Run the actual training loop cnn::real loss = 0; for (unsigned i : indices) { assert (i < data.size()); @@ -150,38 +146,31 @@ int RunChild(unsigned cid, ComputationGraph& cg, Trainer* trainer, vector(p); loss += as_scalar(cg.forward()); cg.backward(); + cnn::real old_mt = as_scalar(model_params.m->values); trainer->update(1.0); + cnn::real new_mt = as_scalar(model_params.m->values); } - loss /= indices.size(); + trainer->update_epoch(); - // Get our final values of each parameter and send them back to the parent, - // along with the current loss value cnn::real m = as_scalar(model_params.m->values); cnn::real b = as_scalar(model_params.b->values); - shared_memory->temp_m += m; - shared_memory->temp_b += b; - shared_memory->loss += loss; - - /*write(workloads[cid].c2p[1], (char*)&m, sizeof(cnn::real)); - write(workloads[cid].c2p[1], (char*)&b, sizeof(cnn::real)); - write(workloads[cid].c2p[1], (char*)&loss, sizeof(cnn::real));*/ - WriteReal(workloads[cid].c2p[1], 0.0); + + // Let the parent know that we're done and return the loss value + WriteReal(workloads[cid].c2p[1], m); + WriteReal(workloads[cid].c2p[1], b); + WriteReal(workloads[cid].c2p[1], loss); } return 0; } -void RunParent(vector& data, vector& workloads, ModelParameters& model_params, Trainer* trainer) { - shared_memory->m = TensorTools::AccessElement(model_params.m->values, {0, 0}); - shared_memory->b = TensorTools::AccessElement(model_params.b->values, {0, 0}); - - for (unsigned iter = 0; iter < 10; ++iter) { - shared_memory->loss = 0.0; - shared_memory->temp_m = 0.0; - shared_memory->temp_b = 0.0; - /*vector m_values; - vector b_values; - vector loss_values;*/ +void RunParent(vector& data, unsigned num_iterations, vector& workloads, ModelParameters& model_params, Trainer* trainer) { + for (unsigned iter = 0; iter < num_iterations; ++iter) { + vector ms(num_children); + vector bs(num_children); + vector losses(num_children); + // TODO: Store the data in shared RAM, shuffle every iteration, let children's assignments live in smem too for(unsigned cid = 0; cid < num_children; ++cid) { + // work out the indices of the data points we want this child to consider unsigned start = (unsigned)(1.0 * cid / num_children * data.size() + 0.5); unsigned end = (unsigned)(1.0 * (cid + 1) / num_children * data.size() + 0.5); vector indices; @@ -189,41 +178,30 @@ void RunParent(vector& data, vector& workloads, ModelParameters for (unsigned i = start; i < end; ++i) { indices.push_back(i); } + // Tell the child it's not time to quit yet bool cont = true; write(workloads[cid].p2c[1], &cont, sizeof(bool)); WriteIntVector(workloads[cid].p2c[1], indices); + /*} - /*cnn::real m = ReadReal(workloads[cid].c2p[0]); - cnn::real b = ReadReal(workloads[cid].c2p[0]); - cnn::real loss = ReadReal(workloads[cid].c2p[0]); - m_values.push_back(m); - b_values.push_back(b); - loss_values.push_back(loss);*/ - } - - for(unsigned cid = 0; cid < num_children; ++cid) { - ReadReal(workloads[cid].c2p[0]); + // Wait for each child to finish training its load + for(unsigned cid = 0; cid < num_children; ++cid) {*/ + ms[cid] = ReadReal(workloads[cid].c2p[0]); + bs[cid] = ReadReal(workloads[cid].c2p[0]); + losses[cid] = ReadReal(workloads[cid].c2p[0]); } - /*cnn::real m = Mean(m_values); - cnn::real b = 0.0; - cnn::real loss = 0.0; - for (unsigned i = 0; i < m_values.size(); ++i) { - b += b_values[i]; - loss += loss_values[i]; + cerr << "ID\tm\tb\tloss" << endl; + cerr << "============================" << endl; + for (unsigned cid = 0; cid < num_children; ++cid) { + cerr << cid << "\t" << ms[cid] << "\t" << bs[cid] << "\t" << losses[cid] << endl; } - b /= b_values.size();*/ - - shared_memory->m = shared_memory->temp_m / num_children; - shared_memory->b = shared_memory->temp_b / num_children; - - // Update parameters to use the new m and b values - //TensorTools::SetElements(model_params.m->values, {m}); - //TensorTools::SetElements(model_params.b->values, {b}); + // TODO: This is currently uneffective because it doesn't affect the Trainers on the child processes trainer->update_epoch(); - //cerr << shared_memory->m << "\t" << iter << "\t" << "loss = " << loss << "\tm = " << m << "\tb = " << b << endl; - cerr << iter << "\t" << "loss = " << shared_memory->loss << "\tm = " << shared_memory->m << "\tb = " << shared_memory->b << endl; + + cnn::real loss = accumulate(losses.begin(), losses.end(), 0.0) / data.size(); + cerr << iter << "\t" << "loss = " << loss << endl; } // Kill all children one by one and wait for them to exit @@ -232,6 +210,8 @@ void RunParent(vector& data, vector& workloads, ModelParameters write(workloads[cid].p2c[1], &cont, sizeof(cont)); wait(NULL); } + + cnn::Cleanup(); } int main(int argc, char** argv) { @@ -242,11 +222,13 @@ int main(int argc, char** argv) { cerr << "Where data.txt contains tab-delimited pairs of floats." << endl; return 1; } + unsigned num_iterations = (argc >= 3) ? atoi(argv[2]) : 10; vector data = ReadData(argv[1]); vector workloads(num_children); - Model model; - AdamTrainer sgd(&model, 0.0); + Model model; + SimpleSGDTrainer sgd(&model, 0.0, 0.001); + //AdamTrainer sgd(&model, 0.0); ComputationGraph cg; cnn::real x_value, y_value; @@ -257,7 +239,7 @@ int main(int argc, char** argv) { unsigned shm_size = 1024; assert (sizeof(SharedObject) < shm_size); - key_t shm_key = ftok("/home/austinma/shared", 'R'); + key_t shm_key = ftok("/Users/austinma/shared2", 'R'); if (shm_key == -1) { cerr << "Unable to get shared memory key" << endl; return 1; @@ -284,6 +266,6 @@ int main(int argc, char** argv) { return RunChild(cid, cg, &sgd, workloads, data, x_value, y_value, model_params); } else { - RunParent(data, workloads, model_params, &sgd); + RunParent(data, num_iterations, workloads, model_params, &sgd); } } From 8a674692c1402baf64f5187cf7c01c285c8f5b17 Mon Sep 17 00:00:00 2001 From: Austin Date: Fri, 28 Aug 2015 02:13:30 +0900 Subject: [PATCH 219/965] Cleaned up mp example a bit --- examples/mp.cc | 97 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 59 insertions(+), 38 deletions(-) diff --git a/examples/mp.cc b/examples/mp.cc index cef7045e5..5e638b73b 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -14,19 +14,53 @@ #include #include #include +/* +TODO: +- Can we move the data vector into shared memory so that we can shuffle it + between iterations and not have to send huge vectors of integers around? +- Can we use some sort of shared memory queue to allow threads to spread + work more evenly? +*/ using namespace std; using namespace cnn; using namespace cnn::expr; +typedef pair Datum; +const unsigned num_children = 8; + +// This shared object/shared memory stuff is junk now +// It used to be useful, but now I'm just leaving it here +// so that I don't have to look up how to do all tis stuff +// in case I ever need to use it again. struct SharedObject { cnn::real fake; }; - -typedef pair Datum; -const unsigned num_children = 1; SharedObject* shared_memory = nullptr; +SharedObject* GetSharedMemory() { + unsigned shm_size = 1024; + assert (sizeof(SharedObject) < shm_size); + key_t shm_key = ftok("/Users/austinma/shared2", 'R'); + if (shm_key == -1) { + cerr << "Unable to get shared memory key" << endl; + return NULL; + } + int shm_id = shmget(shm_key, shm_size, 0644 | IPC_CREAT); + if (shm_id == -1) { + cerr << "Unable to create shared memory" << endl; + return NULL; + } + void* shm_p = shmat(shm_id, nullptr, 0); + if (shm_p == (void*)-1) { + cerr << "Unable to get shared memory pointer"; + return NULL; + } + return (SharedObject*)shm_p; +} +// Some simple functions that do IO to/from pipes. +// These are used to send data from child processes +// to the parent process or vice/versa. cnn::real ReadReal(int pipe) { cnn::real v; read(pipe, &v, sizeof(cnn::real)); @@ -57,8 +91,12 @@ vector ReadIntVector(int pipe) { return vec; } +cnn::real SumValues(const vector& values) { + return accumulate(values.begin(), values.end(), 0.0); +} + cnn::real Mean(const vector& values) { - return accumulate(values.begin(), values.end(), 0.0) / values.size(); + return SumValues(values) / values.size(); } struct Workload { @@ -134,9 +172,6 @@ int RunChild(unsigned cid, ComputationGraph& cg, Trainer* trainer, vector indices = ReadIntVector(workloads[cid].p2c[0]); - cnn::real old_m = as_scalar(model_params.m->values); - cnn::real old_b = as_scalar(model_params.b->values); - // Run the actual training loop cnn::real loss = 0; for (unsigned i : indices) { @@ -146,9 +181,7 @@ int RunChild(unsigned cid, ComputationGraph& cg, Trainer* trainer, vector(p); loss += as_scalar(cg.forward()); cg.backward(); - cnn::real old_mt = as_scalar(model_params.m->values); trainer->update(1.0); - cnn::real new_mt = as_scalar(model_params.m->values); } trainer->update_epoch(); @@ -168,24 +201,29 @@ void RunParent(vector& data, unsigned num_iterations, vector& w vector ms(num_children); vector bs(num_children); vector losses(num_children); - // TODO: Store the data in shared RAM, shuffle every iteration, let children's assignments live in smem too + vector indices(data.size()); + for (unsigned i = 0; i < data.size(); ++i) { + indices[i] = i; + } + random_shuffle(indices.begin(), indices.end()); + for(unsigned cid = 0; cid < num_children; ++cid) { // work out the indices of the data points we want this child to consider unsigned start = (unsigned)(1.0 * cid / num_children * data.size() + 0.5); unsigned end = (unsigned)(1.0 * (cid + 1) / num_children * data.size() + 0.5); - vector indices; - indices.reserve(end - start); + vector child_indices; + child_indices.reserve(end - start); for (unsigned i = start; i < end; ++i) { - indices.push_back(i); + child_indices.push_back(indices[i]); } // Tell the child it's not time to quit yet bool cont = true; write(workloads[cid].p2c[1], &cont, sizeof(bool)); - WriteIntVector(workloads[cid].p2c[1], indices); - /*} + WriteIntVector(workloads[cid].p2c[1], child_indices); + } // Wait for each child to finish training its load - for(unsigned cid = 0; cid < num_children; ++cid) {*/ + for(unsigned cid = 0; cid < num_children; ++cid) { ms[cid] = ReadReal(workloads[cid].c2p[0]); bs[cid] = ReadReal(workloads[cid].c2p[0]); losses[cid] = ReadReal(workloads[cid].c2p[0]); @@ -200,7 +238,7 @@ void RunParent(vector& data, unsigned num_iterations, vector& w // TODO: This is currently uneffective because it doesn't affect the Trainers on the child processes trainer->update_epoch(); - cnn::real loss = accumulate(losses.begin(), losses.end(), 0.0) / data.size(); + cnn::real loss = SumValues(losses) / data.size(); cerr << iter << "\t" << "loss = " << loss << endl; } @@ -215,7 +253,7 @@ void RunParent(vector& data, unsigned num_iterations, vector& w } int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::Initialize(argc, argv, 0, true); if (argc < 2) { cerr << "Usage: " << argv[0] << " data.txt" << endl; @@ -227,8 +265,8 @@ int main(int argc, char** argv) { vector workloads(num_children); Model model; - SimpleSGDTrainer sgd(&model, 0.0, 0.001); - //AdamTrainer sgd(&model, 0.0); + //SimpleSGDTrainer sgd(&model, 0.0, 0.001); + AdamTrainer sgd(&model, 0.0); ComputationGraph cg; cnn::real x_value, y_value; @@ -237,24 +275,7 @@ int main(int argc, char** argv) { ModelParameters model_params = {m_param, b_param}; BuildComputationGraph(cg, model_params, &x_value, &y_value); - unsigned shm_size = 1024; - assert (sizeof(SharedObject) < shm_size); - key_t shm_key = ftok("/Users/austinma/shared2", 'R'); - if (shm_key == -1) { - cerr << "Unable to get shared memory key" << endl; - return 1; - } - int shm_id = shmget(shm_key, shm_size, 0644 | IPC_CREAT); - if (shm_id == -1) { - cerr << "Unable to create shared memory" << endl; - return 1; - } - void* shm_p = shmat(shm_id, nullptr, 0); - if (shm_p == (void*)-1) { - cerr << "Unable to get shared memory pointer"; - return 1; - } - shared_memory = (SharedObject*)shm_p; + shared_memory = GetSharedMemory(); for (unsigned cid = 0; cid < num_children; cid++) { pipe(workloads[cid].p2c); From f46abce80978aef1fa54052b3413072ddee592e3 Mon Sep 17 00:00:00 2001 From: Austin Date: Fri, 28 Aug 2015 11:18:17 +0900 Subject: [PATCH 220/965] Made a parameter to Initialize() indicating whether or not parameters should be stored in shared memory --- cnn/init.cc | 12 +++++++----- cnn/init.h | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/cnn/init.cc b/cnn/init.cc index 14b1407a4..17404b926 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -15,13 +15,15 @@ using namespace std; namespace cnn { -#define ALIGN 6 +const unsigned ALIGN = 6; +const unsigned node_value_memory_size = 512UL * (1UL << 20); +const unsigned parameter_memory_size = 512UL * (1UL << 20); AlignedMemoryPool* fxs = nullptr; AlignedMemoryPool* dEdfs = nullptr; AlignedMemoryPool* ps = nullptr; mt19937* rndeng = nullptr; -void Initialize(int& argc, char**& argv, unsigned random_seed) { +void Initialize(int& argc, char**& argv, unsigned random_seed, bool shared_parameters) { cerr << "Initializing...\n"; #if HAVE_CUDA Initialize_GPU(argc, argv); @@ -39,9 +41,9 @@ void Initialize(int& argc, char**& argv, unsigned random_seed) { } rndeng = new mt19937(random_seed); cerr << "Allocating memory...\n"; - fxs = new AlignedMemoryPool(512UL*(1UL<<20)); // values - dEdfs = new AlignedMemoryPool(512UL*(1UL<<20)); // gradients - ps = new AlignedMemoryPool(512UL*(1UL<<20), true); // parameters + fxs = new AlignedMemoryPool(node_value_memory_size); // values + dEdfs = new AlignedMemoryPool(node_value_memory_size); // gradients + ps = new AlignedMemoryPool(parameter_memory_size, shared_parameters); // parameters cerr << "Done.\n"; } diff --git a/cnn/init.h b/cnn/init.h index e83125ab9..e9e8fef60 100644 --- a/cnn/init.h +++ b/cnn/init.h @@ -3,7 +3,7 @@ namespace cnn { -void Initialize(int& argc, char**& argv, unsigned random_seed = 0); +void Initialize(int& argc, char**& argv, unsigned random_seed = 0, bool shared_parameters = false); void Cleanup(); } // namespace cnn From c7c4c24d1c14bf46342bee0b8a8ed5c87fceecf6 Mon Sep 17 00:00:00 2001 From: Austin Date: Fri, 28 Aug 2015 12:02:31 +0900 Subject: [PATCH 221/965] Just added a TODO reminder --- examples/mp.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/mp.cc b/examples/mp.cc index 5e638b73b..638f8c1ad 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -20,6 +20,7 @@ between iterations and not have to send huge vectors of integers around? - Can we use some sort of shared memory queue to allow threads to spread work more evenly? +- The shadow params in the trainers need to be shared. */ using namespace std; From fd4834ee4a129812c05964a908195b8cc8c79d37 Mon Sep 17 00:00:00 2001 From: Austin Date: Fri, 28 Aug 2015 15:07:31 +0900 Subject: [PATCH 222/965] mp example now trains an RNN language model --- examples/mp.cc | 199 ++++++++++++++++++++++++++----------------------- 1 file changed, 107 insertions(+), 92 deletions(-) diff --git a/examples/mp.cc b/examples/mp.cc index 638f8c1ad..079504393 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -1,6 +1,8 @@ #include "cnn/cnn.h" #include "cnn/training.h" #include "cnn/expr.h" +#include "cnn/dict.h" +#include "cnn/lstm.h" #include #include #include @@ -27,37 +29,8 @@ using namespace std; using namespace cnn; using namespace cnn::expr; -typedef pair Datum; -const unsigned num_children = 8; - -// This shared object/shared memory stuff is junk now -// It used to be useful, but now I'm just leaving it here -// so that I don't have to look up how to do all tis stuff -// in case I ever need to use it again. -struct SharedObject { - cnn::real fake; -}; -SharedObject* shared_memory = nullptr; -SharedObject* GetSharedMemory() { - unsigned shm_size = 1024; - assert (sizeof(SharedObject) < shm_size); - key_t shm_key = ftok("/Users/austinma/shared2", 'R'); - if (shm_key == -1) { - cerr << "Unable to get shared memory key" << endl; - return NULL; - } - int shm_id = shmget(shm_key, shm_size, 0644 | IPC_CREAT); - if (shm_id == -1) { - cerr << "Unable to create shared memory" << endl; - return NULL; - } - void* shm_p = shmat(shm_id, nullptr, 0); - if (shm_p == (void*)-1) { - cerr << "Unable to get shared memory pointer"; - return NULL; - } - return (SharedObject*)shm_p; -} +typedef vector Datum; +unsigned num_children = 1; // Some simple functions that do IO to/from pipes. // These are used to send data from child processes @@ -106,20 +79,87 @@ struct Workload { int p2c[2]; // Parent to child pipe }; -struct ModelParameters { - Parameters* m; - Parameters* b; -}; +unsigned LAYERS = 2; +unsigned INPUT_DIM = 8; //256 +unsigned HIDDEN_DIM = 24; // 1024 +unsigned VOCAB_SIZE = 5500; + +cnn::Dict d; +int kSOS; +int kEOS; + +template +struct RNNLanguageModel { + LookupParameters* p_c; + Parameters* p_R; + Parameters* p_bias; + Builder builder; + explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({VOCAB_SIZE}); + } -void BuildComputationGraph(ComputationGraph& cg, ModelParameters& model_parameters, cnn::real* x_value, cnn::real* y_value) { - Expression m = parameter(cg, model_parameters.m); - Expression b = parameter(cg, model_parameters.b); + // return Expression of total loss + Expression BuildLMGraph(const vector& sent, ComputationGraph& cg) { + const unsigned slen = sent.size() - 1; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter + Expression i_bias = parameter(cg, p_bias); // word bias + vector errs; + for (unsigned t = 0; t < slen; ++t) { + Expression i_x_t = lookup(cg, p_c, sent[t]); + // y_t = RNN(x_t) + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + + // LogSoftmax followed by PickElement can be written in one step + // using PickNegLogSoftmax + Expression i_err = pickneglogsoftmax(i_r_t, sent[t+1]); + errs.push_back(i_err); + } + Expression i_nerr = sum(errs); + return i_nerr; + } - Expression x = input(cg, x_value); - Expression y_star = input(cg, y_value); - Expression y = m * x + b; - Expression loss = squared_distance(y, y_star); -} + // return Expression for total loss + void RandomSample(int max_len = 150) { + cerr << endl; + ComputationGraph cg; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + + Expression i_R = parameter(cg, p_R); + Expression i_bias = parameter(cg, p_bias); + vector errs; + int len = 0; + int cur = kSOS; + while(len < max_len && cur != kEOS) { + ++len; + Expression i_x_t = lookup(cg, p_c, cur); + // y_t = RNN(x_t) + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + + Expression ydist = softmax(i_r_t); + + unsigned w = 0; + while (w == 0 || (int)w == kSOS) { + auto dist = as_vector(cg.incremental_forward()); + double p = rand01(); + for (; w < dist.size(); ++w) { + p -= dist[w]; + if (p < 0.0) { break; } + } + if (w == dist.size()) w = kEOS; + } + cerr << (len == 1 ? "" : " ") << d.Convert(w); + cur = w; + } + cerr << endl; + } +}; vector ReadData(string filename) { vector data; @@ -130,12 +170,7 @@ vector ReadData(string filename) { } string line; while (getline(fs, line)) { - if (line.size() > 0 && line[0] == '#') { - continue; - } - vector parts; - boost::split(parts, line, boost::is_any_of("\t")); - data.push_back(make_pair(atof(parts[0].c_str()), atof(parts[1].c_str()))); + data.push_back(ReadSentence(line, &d)); } return data; } @@ -159,8 +194,9 @@ unsigned SpawnChildren(vector& workloads) { return cid; } -int RunChild(unsigned cid, ComputationGraph& cg, Trainer* trainer, vector& workloads, - const vector& data, cnn::real& x_value, cnn::real& y_value, ModelParameters& model_params) { +template +int RunChild(unsigned cid, RNNLanguageModel& rnnlm, Trainer* trainer, vector& workloads, + const vector& data) { assert (cid >= 0 && cid < num_children); while (true) { // Check if the parent wants us to exit @@ -177,31 +213,23 @@ int RunChild(unsigned cid, ComputationGraph& cg, Trainer* trainer, vector(p); - y_value = get<1>(p); + const Datum& datum = data[i]; + ComputationGraph cg; + rnnlm.BuildLMGraph(datum, cg); loss += as_scalar(cg.forward()); cg.backward(); trainer->update(1.0); } trainer->update_epoch(); - cnn::real m = as_scalar(model_params.m->values); - cnn::real b = as_scalar(model_params.b->values); - // Let the parent know that we're done and return the loss value - WriteReal(workloads[cid].c2p[1], m); - WriteReal(workloads[cid].c2p[1], b); WriteReal(workloads[cid].c2p[1], loss); } return 0; } -void RunParent(vector& data, unsigned num_iterations, vector& workloads, ModelParameters& model_params, Trainer* trainer) { - for (unsigned iter = 0; iter < num_iterations; ++iter) { - vector ms(num_children); - vector bs(num_children); - vector losses(num_children); +void RunParent(vector& data, vector& dev_data, vector& workloads) { + for (unsigned iter = 0; iter < 0; ++iter) { vector indices(data.size()); for (unsigned i = 0; i < data.size(); ++i) { indices[i] = i; @@ -224,21 +252,11 @@ void RunParent(vector& data, unsigned num_iterations, vector& w } // Wait for each child to finish training its load + vector losses(num_children); for(unsigned cid = 0; cid < num_children; ++cid) { - ms[cid] = ReadReal(workloads[cid].c2p[0]); - bs[cid] = ReadReal(workloads[cid].c2p[0]); losses[cid] = ReadReal(workloads[cid].c2p[0]); } - cerr << "ID\tm\tb\tloss" << endl; - cerr << "============================" << endl; - for (unsigned cid = 0; cid < num_children; ++cid) { - cerr << cid << "\t" << ms[cid] << "\t" << bs[cid] << "\t" << losses[cid] << endl; - } - - // TODO: This is currently uneffective because it doesn't affect the Trainers on the child processes - trainer->update_epoch(); - cnn::real loss = SumValues(losses) / data.size(); cerr << iter << "\t" << "loss = " << loss << endl; } @@ -256,27 +274,24 @@ void RunParent(vector& data, unsigned num_iterations, vector& w int main(int argc, char** argv) { cnn::Initialize(argc, argv, 0, true); - if (argc < 2) { - cerr << "Usage: " << argv[0] << " data.txt" << endl; - cerr << "Where data.txt contains tab-delimited pairs of floats." << endl; + if (argc < 4) { + cerr << "Usage: " << argv[0] << " cores corpus.txt dev.txt" << endl; return 1; } - unsigned num_iterations = (argc >= 3) ? atoi(argv[2]) : 10; - vector data = ReadData(argv[1]); + num_children = atoi(argv[1]); + kSOS = d.Convert(""); + kEOS = d.Convert(""); + assert (num_children > 0 && num_children <= 64); + + vector data = ReadData(argv[2]); + vector dev_data = ReadData(argv[3]); vector workloads(num_children); Model model; - //SimpleSGDTrainer sgd(&model, 0.0, 0.001); - AdamTrainer sgd(&model, 0.0); - - ComputationGraph cg; - cnn::real x_value, y_value; - Parameters* m_param = model.add_parameters({1, 1}); - Parameters* b_param = model.add_parameters({1}); - ModelParameters model_params = {m_param, b_param}; - BuildComputationGraph(cg, model_params, &x_value, &y_value); + SimpleSGDTrainer sgd(&model, 0.0); + //AdamTrainer sgd(&model, 0.0); - shared_memory = GetSharedMemory(); + RNNLanguageModel rnnlm(model); for (unsigned cid = 0; cid < num_children; cid++) { pipe(workloads[cid].p2c); @@ -285,9 +300,9 @@ int main(int argc, char** argv) { unsigned cid = SpawnChildren(workloads); if (cid < num_children) { - return RunChild(cid, cg, &sgd, workloads, data, x_value, y_value, model_params); + return RunChild(cid, rnnlm, &sgd, workloads, data); } else { - RunParent(data, num_iterations, workloads, model_params, &sgd); + RunParent(data, dev_data, workloads); } } From b1a38da7c94f46805644a44a86c35b0c804f32ef Mon Sep 17 00:00:00 2001 From: Austin Date: Fri, 28 Aug 2015 16:47:02 +0900 Subject: [PATCH 223/965] Switched MP example to using a boost message queue --- examples/mp.cc | 63 +++++++++++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/examples/mp.cc b/examples/mp.cc index 079504393..ae8220217 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -28,6 +29,7 @@ using namespace std; using namespace cnn; using namespace cnn::expr; +using namespace boost::interprocess; typedef vector Datum; unsigned num_children = 1; @@ -87,6 +89,7 @@ unsigned VOCAB_SIZE = 5500; cnn::Dict d; int kSOS; int kEOS; +const string queue_name = "cnn_mp_work_queue"; template struct RNNLanguageModel { @@ -197,7 +200,12 @@ unsigned SpawnChildren(vector& workloads) { template int RunChild(unsigned cid, RNNLanguageModel& rnnlm, Trainer* trainer, vector& workloads, const vector& data) { - assert (cid >= 0 && cid < num_children); + assert (cid >= 0 && cid < num_children); + unsigned i; + unsigned priority; + message_queue::size_type recvd_size; + message_queue mq(open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); + while (true) { // Check if the parent wants us to exit bool cont = false; @@ -206,12 +214,13 @@ int RunChild(unsigned cid, RNNLanguageModel& rnnlm, Trainer* trainer, vector< break; } - // Read in our workload and update our local model - vector indices = ReadIntVector(workloads[cid].p2c[0]); - // Run the actual training loop cnn::real loss = 0; - for (unsigned i : indices) { + while (true) { + mq.receive(&i, sizeof(i), recvd_size, priority); + if (i == -1U) { + break; + } assert (i < data.size()); const Datum& datum = data[i]; ComputationGraph cg; @@ -225,30 +234,34 @@ int RunChild(unsigned cid, RNNLanguageModel& rnnlm, Trainer* trainer, vector< // Let the parent know that we're done and return the loss value WriteReal(workloads[cid].c2p[1], loss); } + return 0; } void RunParent(vector& data, vector& dev_data, vector& workloads) { - for (unsigned iter = 0; iter < 0; ++iter) { - vector indices(data.size()); - for (unsigned i = 0; i < data.size(); ++i) { - indices[i] = i; - } + message_queue mq(open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); + vector indices(data.size()); + for (unsigned i = 0; i < data.size(); ++i) { + indices[i] = i; + } + for (unsigned iter = 0; iter < 2; ++iter) { random_shuffle(indices.begin(), indices.end()); - for(unsigned cid = 0; cid < num_children; ++cid) { - // work out the indices of the data points we want this child to consider - unsigned start = (unsigned)(1.0 * cid / num_children * data.size() + 0.5); - unsigned end = (unsigned)(1.0 * (cid + 1) / num_children * data.size() + 0.5); - vector child_indices; - child_indices.reserve(end - start); - for (unsigned i = start; i < end; ++i) { - child_indices.push_back(indices[i]); - } - // Tell the child it's not time to quit yet + // Tell all the children to start up + for (unsigned cid = 0; cid < num_children; ++cid) { bool cont = true; - write(workloads[cid].p2c[1], &cont, sizeof(bool)); - WriteIntVector(workloads[cid].p2c[1], child_indices); + write(workloads[cid].p2c[1], &cont, sizeof(bool)); + } + + // Write all the indices to the queue for the children to process + for (unsigned i : indices) { + mq.send(&i, sizeof(i), 0); + } + + // Send a bunch of stop messages to the children + for (unsigned cid = 0; cid < num_children; ++cid) { + unsigned stop = -1U; + mq.send(&stop, sizeof(stop), 0); } // Wait for each child to finish training its load @@ -262,9 +275,9 @@ void RunParent(vector& data, vector& dev_data, vector& w } // Kill all children one by one and wait for them to exit - for (unsigned cid = 0; cid < num_children; ++cid) { + for (unsigned cid = 0; cid < num_children; ++cid) { bool cont = false; - write(workloads[cid].p2c[1], &cont, sizeof(cont)); + write(workloads[cid].p2c[1], &cont, sizeof(bool)); wait(NULL); } @@ -293,6 +306,8 @@ int main(int argc, char** argv) { RNNLanguageModel rnnlm(model); + message_queue::remove(queue_name.c_str()); + for (unsigned cid = 0; cid < num_children; cid++) { pipe(workloads[cid].p2c); pipe(workloads[cid].c2p); From 43ec8a8bd91b9b2831a4e2438829f4a7cc0a8613 Mon Sep 17 00:00:00 2001 From: Austin Date: Tue, 1 Sep 2015 11:55:26 +0900 Subject: [PATCH 224/965] Refactored MP example --- cnn/mp.h | 209 +++++++++++++++++++++++++++++++++ examples/mp.cc | 297 +++++------------------------------------------ examples/rnnlm.h | 94 +++++++++++++++ 3 files changed, 334 insertions(+), 266 deletions(-) create mode 100644 cnn/mp.h create mode 100644 examples/rnnlm.h diff --git a/cnn/mp.h b/cnn/mp.h new file mode 100644 index 000000000..b13b2d317 --- /dev/null +++ b/cnn/mp.h @@ -0,0 +1,209 @@ +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/expr.h" +#include "cnn/dict.h" +#include "cnn/lstm.h" +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace cnn { + namespace mp { + const std::string queue_name = "cnn_mp_work_queue"; // TODO + // Some simple functions that do IO to/from pipes. + // These are used to send data from child processes + // to the parent process or vice/versa. + cnn::real ReadReal(int pipe) { + cnn::real v; + read(pipe, &v, sizeof(cnn::real)); + return v; + } + + void WriteReal(int pipe, cnn::real v) { + write(pipe, &v, sizeof(cnn::real)); + } + + template + void WriteIntVector(int pipe, const std::vector& vec) { + unsigned length = vec.size(); + write(pipe, &length, sizeof(unsigned)); + for (T v : vec) { + write(pipe, &v, sizeof(T)); + } + } + + template + std::vector ReadIntVector(int pipe) { + unsigned length; + read(pipe, &length, sizeof(unsigned)); + std::vector vec(length); + for (unsigned i = 0; i < length; ++i) { + read(pipe, &vec[i], sizeof(T)); + } + return vec; + } + + cnn::real SumValues(const std::vector& values) { + return accumulate(values.begin(), values.end(), 0.0); + } + + cnn::real Mean(const std::vector& values) { + return SumValues(values) / values.size(); + } + + // A simple struct to hold information about a child process + // TODO: Rename me! + struct Workload { + pid_t pid; + int c2p[2]; // Child to parent pipe + int p2c[2]; // Parent to child pipe + }; + + unsigned SpawnChildren(std::vector& workloads) { + const unsigned num_children = workloads.size(); + assert (workloads.size() == num_children); + pid_t pid; + unsigned cid; + for (cid = 0; cid < num_children; ++cid) { + pid = fork(); + if (pid == -1) { + std::cerr << "Fork failed. Exiting ..." << std::endl; + return 1; + } + else if (pid == 0) { + // children shouldn't continue looping + break; + } + workloads[cid].pid = pid; + } + return cid; + } + + std::vector CreateWorkloads(unsigned num_children) { + std::vector workloads(num_children); + for (unsigned cid = 0; cid < num_children; cid++) { + pipe(workloads[cid].p2c); + pipe(workloads[cid].c2p); + } + return workloads; + } + + // This interface is used by the child processes and called + // once per datum. + template + class ILearner { + public: + virtual ~ILearner() {} + virtual cnn::real LearnFromDatum(const D& datum) = 0; + }; + + template + void RunParent(std::vector& data, std::vector& dev_data, + std::vector& workloads, unsigned num_iterations) { + const unsigned num_children = workloads.size(); + boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); + std::vector indices(data.size()); + for (unsigned i = 0; i < data.size(); ++i) { + indices[i] = i; + } + for (unsigned iter = 0; iter < num_iterations; ++iter) { + random_shuffle(indices.begin(), indices.end()); + + // Tell all the children to start up + for (unsigned cid = 0; cid < num_children; ++cid) { + bool cont = true; + write(workloads[cid].p2c[1], &cont, sizeof(bool)); + } + + // Write all the indices to the queue for the children to process + for (unsigned i : indices) { + mq.send(&i, sizeof(i), 0); + } + + // Send a bunch of stop messages to the children + for (unsigned cid = 0; cid < num_children; ++cid) { + unsigned stop = -1U; + mq.send(&stop, sizeof(stop), 0); + } + + // Wait for each child to finish training its load + std::vector losses(num_children); + for(unsigned cid = 0; cid < num_children; ++cid) { + losses[cid] = ReadReal(workloads[cid].c2p[0]); + } + + cnn::real loss = SumValues(losses) / data.size(); + std::cerr << iter << "\t" << "loss = " << loss << std::endl; + } + + // Kill all children one by one and wait for them to exit + for (unsigned cid = 0; cid < num_children; ++cid) { + bool cont = false; + write(workloads[cid].p2c[1], &cont, sizeof(bool)); + wait(NULL); + } + } + + template + int RunChild(unsigned cid, ILearner* learner, Trainer* trainer, + std::vector& workloads, const std::vector& data) { + const unsigned num_children = workloads.size(); + assert (cid >= 0 && cid < num_children); + unsigned i; + unsigned priority; + boost::interprocess::message_queue::size_type recvd_size; + boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); + + while (true) { + // Check if the parent wants us to exit + bool cont = false; + read(workloads[cid].p2c[0], &cont, sizeof(bool)); + if (!cont) { + break; + } + + // Run the actual training loop + cnn::real loss = 0; + while (true) { + mq.receive(&i, sizeof(i), recvd_size, priority); + if (i == -1U) { + break; + } + assert (i < data.size()); + const D& datum = data[i]; + loss += learner->LearnFromDatum(datum); + trainer->update(1.0); + } + trainer->update_epoch(); + + // Let the parent know that we're done and return the loss value + WriteReal(workloads[cid].c2p[1], loss); + } + return 0; + } + + template + void RunMultiProcess(unsigned num_children, ILearner* learner, Trainer* trainer, std::vector& train_data, + std::vector& dev_data, unsigned num_iterations) { + std::vector workloads = CreateWorkloads(num_children); + unsigned cid = SpawnChildren(workloads); + if (cid < num_children) { + RunChild(cid, learner, trainer, workloads, train_data); + } + else { + RunParent(train_data, dev_data, workloads, num_iterations); + } + } + } +}; diff --git a/examples/mp.cc b/examples/mp.cc index ae8220217..05518920a 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -1,168 +1,30 @@ #include "cnn/cnn.h" #include "cnn/training.h" #include "cnn/expr.h" -#include "cnn/dict.h" #include "cnn/lstm.h" +#include "cnn/mp.h" +#include "rnnlm.h" #include #include #include -#include -#include -#include -#include #include #include #include -#include -#include -#include /* TODO: - Can we move the data vector into shared memory so that we can shuffle it between iterations and not have to send huge vectors of integers around? -- Can we use some sort of shared memory queue to allow threads to spread - work more evenly? - The shadow params in the trainers need to be shared. */ using namespace std; using namespace cnn; using namespace cnn::expr; +using namespace cnn::mp; using namespace boost::interprocess; typedef vector Datum; -unsigned num_children = 1; - -// Some simple functions that do IO to/from pipes. -// These are used to send data from child processes -// to the parent process or vice/versa. -cnn::real ReadReal(int pipe) { - cnn::real v; - read(pipe, &v, sizeof(cnn::real)); - return v; -} - -void WriteReal(int pipe, cnn::real v) { - write(pipe, &v, sizeof(cnn::real)); -} - -template -void WriteIntVector(int pipe, const vector& vec) { - unsigned length = vec.size(); - write(pipe, &length, sizeof(unsigned)); - for (T v : vec) { - write(pipe, &v, sizeof(T)); - } -} - -template -vector ReadIntVector(int pipe) { - unsigned length; - read(pipe, &length, sizeof(unsigned)); - vector vec(length); - for (unsigned i = 0; i < length; ++i) { - read(pipe, &vec[i], sizeof(T)); - } - return vec; -} - -cnn::real SumValues(const vector& values) { - return accumulate(values.begin(), values.end(), 0.0); -} - -cnn::real Mean(const vector& values) { - return SumValues(values) / values.size(); -} - -struct Workload { - pid_t pid; - int c2p[2]; // Child to parent pipe - int p2c[2]; // Parent to child pipe -}; - -unsigned LAYERS = 2; -unsigned INPUT_DIM = 8; //256 -unsigned HIDDEN_DIM = 24; // 1024 -unsigned VOCAB_SIZE = 5500; - -cnn::Dict d; -int kSOS; -int kEOS; -const string queue_name = "cnn_mp_work_queue"; - -template -struct RNNLanguageModel { - LookupParameters* p_c; - Parameters* p_R; - Parameters* p_bias; - Builder builder; - explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { - p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); - p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); - p_bias = model.add_parameters({VOCAB_SIZE}); - } - - // return Expression of total loss - Expression BuildLMGraph(const vector& sent, ComputationGraph& cg) { - const unsigned slen = sent.size() - 1; - builder.new_graph(cg); // reset RNN builder for new graph - builder.start_new_sequence(); - Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter - Expression i_bias = parameter(cg, p_bias); // word bias - vector errs; - for (unsigned t = 0; t < slen; ++t) { - Expression i_x_t = lookup(cg, p_c, sent[t]); - // y_t = RNN(x_t) - Expression i_y_t = builder.add_input(i_x_t); - Expression i_r_t = i_bias + i_R * i_y_t; - - // LogSoftmax followed by PickElement can be written in one step - // using PickNegLogSoftmax - Expression i_err = pickneglogsoftmax(i_r_t, sent[t+1]); - errs.push_back(i_err); - } - Expression i_nerr = sum(errs); - return i_nerr; - } - - // return Expression for total loss - void RandomSample(int max_len = 150) { - cerr << endl; - ComputationGraph cg; - builder.new_graph(cg); // reset RNN builder for new graph - builder.start_new_sequence(); - - Expression i_R = parameter(cg, p_R); - Expression i_bias = parameter(cg, p_bias); - vector errs; - int len = 0; - int cur = kSOS; - while(len < max_len && cur != kEOS) { - ++len; - Expression i_x_t = lookup(cg, p_c, cur); - // y_t = RNN(x_t) - Expression i_y_t = builder.add_input(i_x_t); - Expression i_r_t = i_bias + i_R * i_y_t; - - Expression ydist = softmax(i_r_t); - - unsigned w = 0; - while (w == 0 || (int)w == kSOS) { - auto dist = as_vector(cg.incremental_forward()); - double p = rand01(); - for (; w < dist.size(); ++w) { - p -= dist[w]; - if (p < 0.0) { break; } - } - if (w == dist.size()) w = kEOS; - } - cerr << (len == 1 ? "" : " ") << d.Convert(w); - cur = w; - } - cerr << endl; - } -}; vector ReadData(string filename) { vector data; @@ -178,146 +40,49 @@ vector ReadData(string filename) { return data; } -unsigned SpawnChildren(vector& workloads) { - assert (workloads.size() == num_children); - pid_t pid; - unsigned cid; - for (cid = 0; cid < num_children; ++cid) { - pid = fork(); - if (pid == -1) { - cerr << "Fork failed. Exiting ..."; - return 1; - } - else if (pid == 0) { - // children shouldn't continue looping - break; - } - workloads[cid].pid = pid; - } - return cid; -} - -template -int RunChild(unsigned cid, RNNLanguageModel& rnnlm, Trainer* trainer, vector& workloads, - const vector& data) { - assert (cid >= 0 && cid < num_children); - unsigned i; - unsigned priority; - message_queue::size_type recvd_size; - message_queue mq(open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); - - while (true) { - // Check if the parent wants us to exit - bool cont = false; - read(workloads[cid].p2c[0], &cont, sizeof(bool)); - if (!cont) { - break; - } - - // Run the actual training loop - cnn::real loss = 0; - while (true) { - mq.receive(&i, sizeof(i), recvd_size, priority); - if (i == -1U) { - break; - } - assert (i < data.size()); - const Datum& datum = data[i]; - ComputationGraph cg; - rnnlm.BuildLMGraph(datum, cg); - loss += as_scalar(cg.forward()); - cg.backward(); - trainer->update(1.0); - } - trainer->update_epoch(); - - // Let the parent know that we're done and return the loss value - WriteReal(workloads[cid].c2p[1], loss); - } - - return 0; -} - -void RunParent(vector& data, vector& dev_data, vector& workloads) { - message_queue mq(open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); - vector indices(data.size()); - for (unsigned i = 0; i < data.size(); ++i) { - indices[i] = i; - } - for (unsigned iter = 0; iter < 2; ++iter) { - random_shuffle(indices.begin(), indices.end()); - - // Tell all the children to start up - for (unsigned cid = 0; cid < num_children; ++cid) { - bool cont = true; - write(workloads[cid].p2c[1], &cont, sizeof(bool)); - } - - // Write all the indices to the queue for the children to process - for (unsigned i : indices) { - mq.send(&i, sizeof(i), 0); - } - - // Send a bunch of stop messages to the children - for (unsigned cid = 0; cid < num_children; ++cid) { - unsigned stop = -1U; - mq.send(&stop, sizeof(stop), 0); - } - - // Wait for each child to finish training its load - vector losses(num_children); - for(unsigned cid = 0; cid < num_children; ++cid) { - losses[cid] = ReadReal(workloads[cid].c2p[0]); - } - - cnn::real loss = SumValues(losses) / data.size(); - cerr << iter << "\t" << "loss = " << loss << endl; - } - - // Kill all children one by one and wait for them to exit - for (unsigned cid = 0; cid < num_children; ++cid) { - bool cont = false; - write(workloads[cid].p2c[1], &cont, sizeof(bool)); - wait(NULL); +template +class Learner : public ILearner { +public: + explicit Learner(RNNLanguageModel& rnnlm) : rnnlm(rnnlm) {} + ~Learner() {} + cnn::real LearnFromDatum(const D& datum) { + ComputationGraph cg; + rnnlm.BuildLMGraph(datum, cg); + cnn::real loss = as_scalar(cg.forward()); + cg.backward(); + return loss; } - - cnn::Cleanup(); -} +private: + RNNLanguageModel& rnnlm; +}; int main(int argc, char** argv) { - cnn::Initialize(argc, argv, 0, true); - if (argc < 4) { - cerr << "Usage: " << argv[0] << " cores corpus.txt dev.txt" << endl; + cerr << "Usage: " << argv[0] << " cores corpus.txt dev.txt [iterations]" << endl; return 1; } - num_children = atoi(argv[1]); - kSOS = d.Convert(""); - kEOS = d.Convert(""); + unsigned num_children = atoi(argv[1]); assert (num_children > 0 && num_children <= 64); - vector data = ReadData(argv[2]); vector dev_data = ReadData(argv[3]); - vector workloads(num_children); + unsigned num_iterations = (argc >= 5) ? atoi(argv[4]) : UINT_MAX; + + cnn::Initialize(argc, argv, 0, true); - Model model; - SimpleSGDTrainer sgd(&model, 0.0); - //AdamTrainer sgd(&model, 0.0); + Model model; + SimpleSGDTrainer sgd(&model, 0.0); RNNLanguageModel rnnlm(model); + // TODO: This shouldn't be necessary if we pick a new, random queue name every run message_queue::remove(queue_name.c_str()); - for (unsigned cid = 0; cid < num_children; cid++) { - pipe(workloads[cid].p2c); - pipe(workloads[cid].c2p); - } + ILearner* learner = new Learner(rnnlm); + RunMultiProcess(num_children, learner, &sgd, data, dev_data, num_iterations); - unsigned cid = SpawnChildren(workloads); - if (cid < num_children) { - return RunChild(cid, rnnlm, &sgd, workloads, data); - } - else { - RunParent(data, dev_data, workloads); + if (learner != NULL) { + delete learner; } + learner = NULL; + cnn::Cleanup(); } diff --git a/examples/rnnlm.h b/examples/rnnlm.h new file mode 100644 index 000000000..9e1b367ab --- /dev/null +++ b/examples/rnnlm.h @@ -0,0 +1,94 @@ +#include "cnn/cnn.h" +#include "cnn/expr.h" +#include "cnn/dict.h" +#include "cnn/lstm.h" + +#include + +using namespace std; +using namespace cnn; +using namespace cnn::expr; + +unsigned LAYERS = 2; +unsigned INPUT_DIM = 8; //256 +unsigned HIDDEN_DIM = 24; // 1024 +unsigned VOCAB_SIZE = 5500; + +cnn::Dict d; +int kSOS; +int kEOS; + +template +struct RNNLanguageModel { + LookupParameters* p_c; + Parameters* p_R; + Parameters* p_bias; + Builder builder; + explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + kSOS = d.Convert(""); + kEOS = d.Convert(""); + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({VOCAB_SIZE}); + } + + // return Expression of total loss + Expression BuildLMGraph(const vector& sent, ComputationGraph& cg) { + const unsigned slen = sent.size() - 1; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter + Expression i_bias = parameter(cg, p_bias); // word bias + vector errs; + for (unsigned t = 0; t < slen; ++t) { + Expression i_x_t = lookup(cg, p_c, sent[t]); + // y_t = RNN(x_t) + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + + // LogSoftmax followed by PickElement can be written in one step + // using PickNegLogSoftmax + Expression i_err = pickneglogsoftmax(i_r_t, sent[t+1]); + errs.push_back(i_err); + } + Expression i_nerr = sum(errs); + return i_nerr; + } + + // return Expression for total loss + void RandomSample(int max_len = 150) { + cerr << endl; + ComputationGraph cg; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + + Expression i_R = parameter(cg, p_R); + Expression i_bias = parameter(cg, p_bias); + vector errs; + int len = 0; + int cur = kSOS; + while(len < max_len && cur != kEOS) { + ++len; + Expression i_x_t = lookup(cg, p_c, cur); + // y_t = RNN(x_t) + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + + Expression ydist = softmax(i_r_t); + + unsigned w = 0; + while (w == 0 || (int)w == kSOS) { + auto dist = as_vector(cg.incremental_forward()); + double p = rand01(); + for (; w < dist.size(); ++w) { + p -= dist[w]; + if (p < 0.0) { break; } + } + if (w == dist.size()) w = kEOS; + } + cerr << (len == 1 ? "" : " ") << d.Convert(w); + cur = w; + } + cerr << endl; + } +}; From ef2926f4a84031248f708a03ba65db2ec2243567 Mon Sep 17 00:00:00 2001 From: Austin Date: Tue, 1 Sep 2015 15:47:03 +0900 Subject: [PATCH 225/965] minor touch ups --- cnn/mp.h | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/cnn/mp.h b/cnn/mp.h index b13b2d317..d7b9a72c4 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -20,7 +20,9 @@ namespace cnn { namespace mp { - const std::string queue_name = "cnn_mp_work_queue"; // TODO + // TODO: Pass this around instead of having it be global + std::string queue_name = "cnn_mp_work_queue"; + // Some simple functions that do IO to/from pipes. // These are used to send data from child processes // to the parent process or vice/versa. @@ -109,7 +111,7 @@ namespace cnn { }; template - void RunParent(std::vector& data, std::vector& dev_data, + void RunParent(const std::vector& data, const std::vector& dev_data, std::vector& workloads, unsigned num_iterations) { const unsigned num_children = workloads.size(); boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); @@ -117,7 +119,9 @@ namespace cnn { for (unsigned i = 0; i < data.size(); ++i) { indices[i] = i; } + for (unsigned iter = 0; iter < num_iterations; ++iter) { + // Shuffle the data indices random_shuffle(indices.begin(), indices.end()); // Tell all the children to start up @@ -193,9 +197,17 @@ namespace cnn { return 0; } + std::string GenerateQueueName() { + std::ostringstream ss; + ss << "cnn_mp_work_queue"; + ss << rand(); + return ss.str(); + } + template - void RunMultiProcess(unsigned num_children, ILearner* learner, Trainer* trainer, std::vector& train_data, - std::vector& dev_data, unsigned num_iterations) { + void RunMultiProcess(unsigned num_children, ILearner* learner, Trainer* trainer, const std::vector& train_data, + const std::vector& dev_data, unsigned num_iterations) { + queue_name = GenerateQueueName(); std::vector workloads = CreateWorkloads(num_children); unsigned cid = SpawnChildren(workloads); if (cid < num_children) { From 2efc6c048dc0850417dd6141c167cca1f171da7b Mon Sep 17 00:00:00 2001 From: Austin Date: Wed, 2 Sep 2015 12:07:59 +0900 Subject: [PATCH 226/965] Switched learner from being a pointer to just a stack variable --- examples/mp.cc | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/examples/mp.cc b/examples/mp.cc index 05518920a..04ea49b5a 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -77,12 +77,6 @@ int main(int argc, char** argv) { // TODO: This shouldn't be necessary if we pick a new, random queue name every run message_queue::remove(queue_name.c_str()); - ILearner* learner = new Learner(rnnlm); - RunMultiProcess(num_children, learner, &sgd, data, dev_data, num_iterations); - - if (learner != NULL) { - delete learner; - } - learner = NULL; - cnn::Cleanup(); + Learner learner(rnnlm); + RunMultiProcess(num_children, &learner, &sgd, data, dev_data, num_iterations); } From 16462574f4765482dd215293dade14e846fb6c45 Mon Sep 17 00:00:00 2001 From: Austin Date: Wed, 2 Sep 2015 16:12:36 +0900 Subject: [PATCH 227/965] Added StatusReporter --- cnn/mp.h | 64 +++++++++++++++++++++++++++++++++++++++++++------- examples/mp.cc | 36 ++++++++++++++++++++++++---- 2 files changed, 87 insertions(+), 13 deletions(-) diff --git a/cnn/mp.h b/cnn/mp.h index d7b9a72c4..7e23713bf 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -7,6 +7,9 @@ #include #include #include +#include +#include +#include #include #include @@ -20,8 +23,27 @@ namespace cnn { namespace mp { - // TODO: Pass this around instead of having it be global + // TODO: Pass these around instead of having them be global std::string queue_name = "cnn_mp_work_queue"; + std::string shared_memory_name = "cnn_mp_shared_memory"; + + template + struct SharedObject { + SharedObject() : reporter(), mutex(1) {} + R reporter; + boost::interprocess::interprocess_semaphore mutex; + }; + + /// XXX: We never delete these objects + template + SharedObject* GetSharedMemory() { + auto shm = new boost::interprocess::shared_memory_object(boost::interprocess::create_only, shared_memory_name.c_str(), boost::interprocess::read_write); + shm->truncate(sizeof(SharedObject)); + auto region = new boost::interprocess::mapped_region (*shm, boost::interprocess::read_write); + void* addr = region->get_address(); + SharedObject* obj = new (addr) SharedObject(); + return obj; + } // Some simple functions that do IO to/from pipes. // These are used to send data from child processes @@ -110,6 +132,11 @@ namespace cnn { virtual cnn::real LearnFromDatum(const D& datum) = 0; }; + class IStatusReporter { + public: + virtual void Update(unsigned i, cnn::real loss) = 0; + }; + template void RunParent(const std::vector& data, const std::vector& dev_data, std::vector& workloads, unsigned num_iterations) { @@ -159,16 +186,15 @@ namespace cnn { } } - template + template int RunChild(unsigned cid, ILearner* learner, Trainer* trainer, - std::vector& workloads, const std::vector& data) { + std::vector& workloads, const std::vector& data, SharedObject* shared_memory) { const unsigned num_children = workloads.size(); assert (cid >= 0 && cid < num_children); unsigned i; unsigned priority; boost::interprocess::message_queue::size_type recvd_size; - boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); - + boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); while (true) { // Check if the parent wants us to exit bool cont = false; @@ -186,8 +212,13 @@ namespace cnn { } assert (i < data.size()); const D& datum = data[i]; - loss += learner->LearnFromDatum(datum); + cnn::real datum_loss = learner->LearnFromDatum(datum); + loss += datum_loss; trainer->update(1.0); + + shared_memory->mutex.wait(); + shared_memory->reporter.Update(i, datum_loss); + shared_memory->mutex.post(); } trainer->update_epoch(); @@ -204,14 +235,31 @@ namespace cnn { return ss.str(); } - template + std::string GenerateSharedMemoryName() { + std::ostringstream ss; + ss << "cnn_mp_shared_memory"; + ss << rand(); + return ss.str(); + } + + template void RunMultiProcess(unsigned num_children, ILearner* learner, Trainer* trainer, const std::vector& train_data, const std::vector& dev_data, unsigned num_iterations) { queue_name = GenerateQueueName(); + shared_memory_name = GenerateSharedMemoryName(); + + struct shm_remove + { + shm_remove() { boost::interprocess::shared_memory_object::remove(queue_name.c_str()); } + ~shm_remove(){ boost::interprocess::shared_memory_object::remove(queue_name.c_str()); } + } remover; + + SharedObject* shared_memory = GetSharedMemory(); + std::vector workloads = CreateWorkloads(num_children); unsigned cid = SpawnChildren(workloads); if (cid < num_children) { - RunChild(cid, learner, trainer, workloads, train_data); + RunChild(cid, learner, trainer, workloads, train_data, shared_memory); } else { RunParent(train_data, dev_data, workloads, num_iterations); diff --git a/examples/mp.cc b/examples/mp.cc index 04ea49b5a..735ef68b9 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -43,8 +43,9 @@ vector ReadData(string filename) { template class Learner : public ILearner { public: - explicit Learner(RNNLanguageModel& rnnlm) : rnnlm(rnnlm) {} + explicit Learner(RNNLanguageModel& rnnlm, unsigned data_size) : rnnlm(rnnlm) {} ~Learner() {} + cnn::real LearnFromDatum(const D& datum) { ComputationGraph cg; rnnlm.BuildLMGraph(datum, cg); @@ -52,22 +53,45 @@ class Learner : public ILearner { cg.backward(); return loss; } + private: RNNLanguageModel& rnnlm; }; +class StatusReporter : public IStatusReporter { +public: + StatusReporter() : data_size(1000), batch_count(0), datum_count(0), batch_loss(0) {} + void Update(unsigned index, cnn::real loss) { + batch_loss += loss; + datum_count++; + batch_count++; + if (batch_count == 50) { + cerr << "--" << (1.0 * datum_count / data_size) << " avg loss = " << batch_loss / batch_count << endl; + cerr.flush(); + batch_count = 0; + batch_loss = 0.0; + } + } +private: + unsigned data_size; + unsigned batch_count; + unsigned datum_count; + cnn::real batch_loss; +}; + int main(int argc, char** argv) { if (argc < 4) { cerr << "Usage: " << argv[0] << " cores corpus.txt dev.txt [iterations]" << endl; return 1; } + srand(time(NULL)); unsigned num_children = atoi(argv[1]); - assert (num_children > 0 && num_children <= 64); + assert (num_children <= 64); vector data = ReadData(argv[2]); vector dev_data = ReadData(argv[3]); unsigned num_iterations = (argc >= 5) ? atoi(argv[4]) : UINT_MAX; - cnn::Initialize(argc, argv, 0, true); + cnn::Initialize(argc, argv, 1, true); Model model; SimpleSGDTrainer sgd(&model, 0.0); @@ -75,8 +99,10 @@ int main(int argc, char** argv) { RNNLanguageModel rnnlm(model); // TODO: This shouldn't be necessary if we pick a new, random queue name every run + //queue_name = GenerateQueueName(); + //cerr << "Creating message queue with name: " << queue_name << endl; message_queue::remove(queue_name.c_str()); - Learner learner(rnnlm); - RunMultiProcess(num_children, &learner, &sgd, data, dev_data, num_iterations); + Learner learner(rnnlm, data.size()); + RunMultiProcess(num_children, &learner, &sgd, data, dev_data, num_iterations); } From 8e8806f8246f0fcd03057bd49140eb5e6cc6a721 Mon Sep 17 00:00:00 2001 From: Kevin Duh Date: Wed, 2 Sep 2015 21:35:41 +0900 Subject: [PATCH 228/965] Add SetUnk(w) to dict.h to allow auto mapping of unknown words to w --- cnn/dict.h | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/cnn/dict.h b/cnn/dict.h index 4394db02b..47a07041c 100644 --- a/cnn/dict.h +++ b/cnn/dict.h @@ -21,7 +21,7 @@ namespace cnn { class Dict { typedef std::unordered_map Map; public: - Dict() : frozen(false) { + Dict() : frozen(false), map_unk(false), unk_id(-1) { } inline unsigned size() const { return words_.size(); } @@ -36,8 +36,13 @@ class Dict { auto i = d_.find(word); if (i == d_.end()) { if (frozen) { - std::cerr << "Unknown word encountered: " << word << std::endl; - throw std::runtime_error("Unknown word encountered in frozen dictionary: " + word); + if (map_unk) { + return unk_id; + } + else { + std::cerr << "Unknown word encountered: " << word << std::endl; + throw std::runtime_error("Unknown word encountered in frozen dictionary: " + word); + } } words_.push_back(word); return d_[word] = words_.size() - 1; @@ -51,10 +56,20 @@ class Dict { return words_[id]; } + void SetUnk(const std::string& word) { + if (!frozen) + throw std::runtime_error("Please call SetUnk() only after dictionary is frozen"); + + unk_id = Convert(word); + map_unk = true; + } + void clear() { words_.clear(); d_.clear(); } private: bool frozen; + bool map_unk; // if true, map unknown word to unk_id + int unk_id; std::vector words_; Map d_; @@ -62,6 +77,8 @@ class Dict { friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { ar & frozen; + ar & map_unk; + ar & unk_id; ar & words_; ar & d_; } From d33e3061a7f327010084a4f621e76889d4b6f83e Mon Sep 17 00:00:00 2001 From: Austin Date: Thu, 3 Sep 2015 17:58:09 +0900 Subject: [PATCH 229/965] implemented dev set in mp --- cnn/aligned-mem-pool.h | 21 ----- cnn/mp.h | 200 ++++++++++++++++++++--------------------- examples/mp.cc | 42 +++------ 3 files changed, 105 insertions(+), 158 deletions(-) diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h index 52f6678c0..747ac6103 100644 --- a/cnn/aligned-mem-pool.h +++ b/cnn/aligned-mem-pool.h @@ -87,27 +87,6 @@ class AlignedMemoryPool { void sys_alloc(size_t cap) { capacity = round_up_align(cap); if (shared) { - /*char* shared_filename = tmpnam(NULL); - open(shared_filename, O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666); - key_t shm_key = ftok(shared_filename, 'R'); - if (shm_key == -1) { - std::cerr << "Unable to get shared memory key" << std::endl; - abort(); - } - int shm_id = shmget(shm_key, capacity, 0644 | IPC_CREAT); - if (shm_id == -1) { - std::cerr << "Unable to create shared memory" << std::endl; - std::cerr << "Requested shared memory size: " << capacity << std::endl; - std::cerr << "Verify that this is less than the maximum shared memory size, which" << std::endl; - std::cerr << "can be found in /proc/sys/kernel/shmmax" << std::endl; - perror("shmget"); - abort(); - } - mem = shmat(shm_id, nullptr, 0); - if (mem == (void*)-1) { - std::cerr << "Unable to get shared memory pointer" << std::endl; - abort(); - }*/ mem = mmap(NULL, capacity, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0); } else { diff --git a/cnn/mp.h b/cnn/mp.h index 7e23713bf..0272be6fb 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -27,24 +27,12 @@ namespace cnn { std::string queue_name = "cnn_mp_work_queue"; std::string shared_memory_name = "cnn_mp_shared_memory"; - template - struct SharedObject { - SharedObject() : reporter(), mutex(1) {} - R reporter; - boost::interprocess::interprocess_semaphore mutex; + struct WorkloadHeader { + bool is_dev_set; + bool end_of_epoch; + unsigned report_frequency; }; - /// XXX: We never delete these objects - template - SharedObject* GetSharedMemory() { - auto shm = new boost::interprocess::shared_memory_object(boost::interprocess::create_only, shared_memory_name.c_str(), boost::interprocess::read_write); - shm->truncate(sizeof(SharedObject)); - auto region = new boost::interprocess::mapped_region (*shm, boost::interprocess::read_write); - void* addr = region->get_address(); - SharedObject* obj = new (addr) SharedObject(); - return obj; - } - // Some simple functions that do IO to/from pipes. // These are used to send data from child processes // to the parent process or vice/versa. @@ -58,26 +46,6 @@ namespace cnn { write(pipe, &v, sizeof(cnn::real)); } - template - void WriteIntVector(int pipe, const std::vector& vec) { - unsigned length = vec.size(); - write(pipe, &length, sizeof(unsigned)); - for (T v : vec) { - write(pipe, &v, sizeof(T)); - } - } - - template - std::vector ReadIntVector(int pipe) { - unsigned length; - read(pipe, &length, sizeof(unsigned)); - std::vector vec(length); - for (unsigned i = 0; i < length; ++i) { - read(pipe, &vec[i], sizeof(T)); - } - return vec; - } - cnn::real SumValues(const std::vector& values) { return accumulate(values.begin(), values.end(), 0.0); } @@ -129,53 +97,75 @@ namespace cnn { class ILearner { public: virtual ~ILearner() {} - virtual cnn::real LearnFromDatum(const D& datum) = 0; + virtual cnn::real LearnFromDatum(const D& datum, bool learn) = 0; }; - class IStatusReporter { - public: - virtual void Update(unsigned i, cnn::real loss) = 0; - }; + // Called by the parent to process a chunk of data + cnn::real RunDataSet(std::vector::iterator begin, std::vector::iterator end, const std::vector& workloads, + boost::interprocess::message_queue& mq, const WorkloadHeader& header) { + const unsigned num_children = workloads.size(); + + // Tell all the children to start up + for (unsigned cid = 0; cid < num_children; ++cid) { + bool cont = true; + write(workloads[cid].p2c[1], &cont, sizeof(bool)); + write(workloads[cid].p2c[1], &header, sizeof(WorkloadHeader)); + } + + // Write all the indices to the queue for the children to process + for (auto curr = begin; curr != end; ++curr) { + unsigned i = *curr; + mq.send(&i, sizeof(i), 0); + } + + // Send a bunch of stop messages to the children + for (unsigned cid = 0; cid < num_children; ++cid) { + unsigned stop = -1U; + mq.send(&stop, sizeof(stop), 0); + } + + // Wait for each child to finish training its load + std::vector losses(num_children); + for(unsigned cid = 0; cid < num_children; ++cid) { + losses[cid] = ReadReal(workloads[cid].c2p[0]); + } + + cnn::real loss = SumValues(losses) / std::distance(begin, end); + return loss; + } template - void RunParent(const std::vector& data, const std::vector& dev_data, - std::vector& workloads, unsigned num_iterations) { + void RunParent(const std::vector& train_data, const std::vector& dev_data, + std::vector& workloads, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency) { const unsigned num_children = workloads.size(); boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); - std::vector indices(data.size()); - for (unsigned i = 0; i < data.size(); ++i) { - indices[i] = i; - } + std::vector train_indices(train_data.size()); + std::iota(train_indices.begin(), train_indices.end(), 0); + + std::vector dev_indices(dev_data.size()); + std::iota(dev_indices.begin(), dev_indices.end(), 0); for (unsigned iter = 0; iter < num_iterations; ++iter) { - // Shuffle the data indices - random_shuffle(indices.begin(), indices.end()); + // Shuffle the training data indices + random_shuffle(train_indices.begin(), train_indices.end()); - // Tell all the children to start up - for (unsigned cid = 0; cid < num_children; ++cid) { - bool cont = true; - write(workloads[cid].p2c[1], &cont, sizeof(bool)); - } + cnn::real train_loss = 0.0; - // Write all the indices to the queue for the children to process - for (unsigned i : indices) { - mq.send(&i, sizeof(i), 0); - } + std::vector::iterator begin = train_indices.begin(); + while (begin != train_indices.end()) { + std::vector::iterator end = begin + dev_frequency; + if (end > train_indices.end()) { + end = train_indices.end(); + } + double fractional_iter = iter + 1.0 * distance(train_indices.begin(), end) / train_indices.size(); + train_loss += RunDataSet(begin, end, workloads, mq, {false, end == train_indices.end(), report_frequency}); + std::cerr << fractional_iter << "\t" << "loss = " << train_loss << std::endl; - // Send a bunch of stop messages to the children - for (unsigned cid = 0; cid < num_children; ++cid) { - unsigned stop = -1U; - mq.send(&stop, sizeof(stop), 0); - } + cnn::real dev_loss = RunDataSet(dev_indices.begin(), dev_indices.end(), workloads, mq, {true, false, 50}); + std::cerr << fractional_iter << "\t" << "dev loss = " << dev_loss << std::endl; - // Wait for each child to finish training its load - std::vector losses(num_children); - for(unsigned cid = 0; cid < num_children; ++cid) { - losses[cid] = ReadReal(workloads[cid].c2p[0]); + begin = end; } - - cnn::real loss = SumValues(losses) / data.size(); - std::cerr << iter << "\t" << "loss = " << loss << std::endl; } // Kill all children one by one and wait for them to exit @@ -186,9 +176,10 @@ namespace cnn { } } - template + template int RunChild(unsigned cid, ILearner* learner, Trainer* trainer, - std::vector& workloads, const std::vector& data, SharedObject* shared_memory) { + std::vector& workloads, const std::vector& train_data, + const std::vector& dev_data) { const unsigned num_children = workloads.size(); assert (cid >= 0 && cid < num_children); unsigned i; @@ -203,27 +194,42 @@ namespace cnn { break; } + // Check if we're running on the training data or the dev data + WorkloadHeader header; + read(workloads[cid].p2c[0], &header, sizeof(WorkloadHeader)); + // Run the actual training loop - cnn::real loss = 0; + cnn::real total_loss = 0; + cnn::real batch_loss = 0; + unsigned batch_counter = 0; while (true) { mq.receive(&i, sizeof(i), recvd_size, priority); if (i == -1U) { break; } - assert (i < data.size()); - const D& datum = data[i]; - cnn::real datum_loss = learner->LearnFromDatum(datum); - loss += datum_loss; - trainer->update(1.0); - - shared_memory->mutex.wait(); - shared_memory->reporter.Update(i, datum_loss); - shared_memory->mutex.post(); + assert (i < (header.is_dev_set ? dev_data.size() : train_data.size())); + const D& datum = (header.is_dev_set ? dev_data[i] : train_data[i]); + cnn::real datum_loss = learner->LearnFromDatum(datum, !header.is_dev_set); + total_loss += datum_loss; + batch_loss += datum_loss; + batch_counter++; + if (!header.is_dev_set) { + trainer->update(1.0); + } + if (batch_counter == header.report_frequency) { + if (cid == 0) { + std::cerr << batch_loss / batch_counter << std::endl; + } + batch_loss = 0; + batch_counter = 0; + } + } + if (header.end_of_epoch) { + trainer->update_epoch(); } - trainer->update_epoch(); // Let the parent know that we're done and return the loss value - WriteReal(workloads[cid].c2p[1], loss); + WriteReal(workloads[cid].c2p[1], total_loss); } return 0; } @@ -235,34 +241,18 @@ namespace cnn { return ss.str(); } - std::string GenerateSharedMemoryName() { - std::ostringstream ss; - ss << "cnn_mp_shared_memory"; - ss << rand(); - return ss.str(); - } - - template + template void RunMultiProcess(unsigned num_children, ILearner* learner, Trainer* trainer, const std::vector& train_data, - const std::vector& dev_data, unsigned num_iterations) { - queue_name = GenerateQueueName(); - shared_memory_name = GenerateSharedMemoryName(); - - struct shm_remove - { - shm_remove() { boost::interprocess::shared_memory_object::remove(queue_name.c_str()); } - ~shm_remove(){ boost::interprocess::shared_memory_object::remove(queue_name.c_str()); } - } remover; - - SharedObject* shared_memory = GetSharedMemory(); + const std::vector& dev_data, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency) { + queue_name = GenerateQueueName(); std::vector workloads = CreateWorkloads(num_children); unsigned cid = SpawnChildren(workloads); if (cid < num_children) { - RunChild(cid, learner, trainer, workloads, train_data, shared_memory); + RunChild(cid, learner, trainer, workloads, train_data, dev_data); } else { - RunParent(train_data, dev_data, workloads, num_iterations); + RunParent(train_data, dev_data, workloads, num_iterations, dev_frequency, report_frequency); } } } diff --git a/examples/mp.cc b/examples/mp.cc index 735ef68b9..094d7ddad 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -13,8 +13,6 @@ #include /* TODO: -- Can we move the data vector into shared memory so that we can shuffle it - between iterations and not have to send huge vectors of integers around? - The shadow params in the trainers need to be shared. */ @@ -46,11 +44,13 @@ class Learner : public ILearner { explicit Learner(RNNLanguageModel& rnnlm, unsigned data_size) : rnnlm(rnnlm) {} ~Learner() {} - cnn::real LearnFromDatum(const D& datum) { + cnn::real LearnFromDatum(const D& datum, bool learn) { ComputationGraph cg; rnnlm.BuildLMGraph(datum, cg); cnn::real loss = as_scalar(cg.forward()); - cg.backward(); + if (learn) { + cg.backward(); + } return loss; } @@ -58,27 +58,6 @@ class Learner : public ILearner { RNNLanguageModel& rnnlm; }; -class StatusReporter : public IStatusReporter { -public: - StatusReporter() : data_size(1000), batch_count(0), datum_count(0), batch_loss(0) {} - void Update(unsigned index, cnn::real loss) { - batch_loss += loss; - datum_count++; - batch_count++; - if (batch_count == 50) { - cerr << "--" << (1.0 * datum_count / data_size) << " avg loss = " << batch_loss / batch_count << endl; - cerr.flush(); - batch_count = 0; - batch_loss = 0.0; - } - } -private: - unsigned data_size; - unsigned batch_count; - unsigned datum_count; - cnn::real batch_loss; -}; - int main(int argc, char** argv) { if (argc < 4) { cerr << "Usage: " << argv[0] << " cores corpus.txt dev.txt [iterations]" << endl; @@ -90,19 +69,18 @@ int main(int argc, char** argv) { vector data = ReadData(argv[2]); vector dev_data = ReadData(argv[3]); unsigned num_iterations = (argc >= 5) ? atoi(argv[4]) : UINT_MAX; + unsigned dev_frequency = 5000; + unsigned report_frequency = 10; cnn::Initialize(argc, argv, 1, true); Model model; - SimpleSGDTrainer sgd(&model, 0.0); + SimpleSGDTrainer sgd(&model, 0.0, 0.2); + //AdagradTrainer sgd(&model, 0.0); + //AdamTrainer sgd(&model, 0.0); RNNLanguageModel rnnlm(model); - // TODO: This shouldn't be necessary if we pick a new, random queue name every run - //queue_name = GenerateQueueName(); - //cerr << "Creating message queue with name: " << queue_name << endl; - message_queue::remove(queue_name.c_str()); - Learner learner(rnnlm, data.size()); - RunMultiProcess(num_children, &learner, &sgd, data, dev_data, num_iterations); + RunMultiProcess(num_children, &learner, &sgd, data, dev_data, num_iterations, dev_frequency, report_frequency); } From 24ae091e664e2187ce25ae86b4d350047c8880a4 Mon Sep 17 00:00:00 2001 From: austinma Date: Fri, 4 Sep 2015 02:59:21 -0400 Subject: [PATCH 230/965] Remove queue before trying to create it. Also made Read and Write functions to pipes templated --- cnn/mp.h | 66 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/cnn/mp.h b/cnn/mp.h index 0272be6fb..99520a1f9 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -25,7 +25,7 @@ namespace cnn { namespace mp { // TODO: Pass these around instead of having them be global std::string queue_name = "cnn_mp_work_queue"; - std::string shared_memory_name = "cnn_mp_shared_memory"; + std::string shared_memory_name = "cnn_mp_shared_memory"; struct WorkloadHeader { bool is_dev_set; @@ -36,14 +36,18 @@ namespace cnn { // Some simple functions that do IO to/from pipes. // These are used to send data from child processes // to the parent process or vice/versa. - cnn::real ReadReal(int pipe) { - cnn::real v; - read(pipe, &v, sizeof(cnn::real)); + template + T Read(int pipe) { + T v; + int err = read(pipe, &v, sizeof(T)); + assert (err != -1); return v; } - void WriteReal(int pipe, cnn::real v) { - write(pipe, &v, sizeof(cnn::real)); + template + void Write(int pipe, const T& v) { + int err = write(pipe, &v, sizeof(T)); + assert (err != -1); } cnn::real SumValues(const std::vector& values) { @@ -83,10 +87,13 @@ namespace cnn { } std::vector CreateWorkloads(unsigned num_children) { + int err; std::vector workloads(num_children); - for (unsigned cid = 0; cid < num_children; cid++) { - pipe(workloads[cid].p2c); - pipe(workloads[cid].c2p); + for (unsigned cid = 0; cid < num_children; cid++) { + err = pipe(workloads[cid].p2c); + assert (err == 0); + err = pipe(workloads[cid].c2p); + assert (err == 0); } return workloads; } @@ -108,8 +115,8 @@ namespace cnn { // Tell all the children to start up for (unsigned cid = 0; cid < num_children; ++cid) { bool cont = true; - write(workloads[cid].p2c[1], &cont, sizeof(bool)); - write(workloads[cid].p2c[1], &header, sizeof(WorkloadHeader)); + Write(workloads[cid].p2c[1], cont); + Write(workloads[cid].p2c[1], header); } // Write all the indices to the queue for the children to process @@ -127,7 +134,7 @@ namespace cnn { // Wait for each child to finish training its load std::vector losses(num_children); for(unsigned cid = 0; cid < num_children; ++cid) { - losses[cid] = ReadReal(workloads[cid].c2p[0]); + losses[cid] = Read(workloads[cid].c2p[0]); } cnn::real loss = SumValues(losses) / std::distance(begin, end); @@ -161,7 +168,7 @@ namespace cnn { train_loss += RunDataSet(begin, end, workloads, mq, {false, end == train_indices.end(), report_frequency}); std::cerr << fractional_iter << "\t" << "loss = " << train_loss << std::endl; - cnn::real dev_loss = RunDataSet(dev_indices.begin(), dev_indices.end(), workloads, mq, {true, false, 50}); + cnn::real dev_loss = RunDataSet(dev_indices.begin(), dev_indices.end(), workloads, mq, {true, false, report_frequency}); std::cerr << fractional_iter << "\t" << "dev loss = " << dev_loss << std::endl; begin = end; @@ -169,9 +176,9 @@ namespace cnn { } // Kill all children one by one and wait for them to exit - for (unsigned cid = 0; cid < num_children; ++cid) { + for (unsigned cid = 0; cid < num_children; ++cid) { bool cont = false; - write(workloads[cid].p2c[1], &cont, sizeof(bool)); + Write(workloads[cid].p2c[1], &cont); wait(NULL); } } @@ -181,44 +188,47 @@ namespace cnn { std::vector& workloads, const std::vector& train_data, const std::vector& dev_data) { const unsigned num_children = workloads.size(); - assert (cid >= 0 && cid < num_children); + assert (cid >= 0 && cid < num_children); + int err; unsigned i; unsigned priority; boost::interprocess::message_queue::size_type recvd_size; - boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); + boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); while (true) { // Check if the parent wants us to exit - bool cont = false; - read(workloads[cid].p2c[0], &cont, sizeof(bool)); + bool cont = Read(workloads[cid].p2c[0]); + assert (err == 0); if (!cont) { break; } // Check if we're running on the training data or the dev data - WorkloadHeader header; - read(workloads[cid].p2c[0], &header, sizeof(WorkloadHeader)); + //std::cerr << "#" << cid << " waiting for header" << std::endl; + WorkloadHeader header = Read(workloads[cid].p2c[0]); + assert (err == 0); // Run the actual training loop cnn::real total_loss = 0; cnn::real batch_loss = 0; unsigned batch_counter = 0; while (true) { - mq.receive(&i, sizeof(i), recvd_size, priority); + mq.receive(&i, sizeof(unsigned), recvd_size, priority); if (i == -1U) { break; } + assert (i < (header.is_dev_set ? dev_data.size() : train_data.size())); const D& datum = (header.is_dev_set ? dev_data[i] : train_data[i]); cnn::real datum_loss = learner->LearnFromDatum(datum, !header.is_dev_set); total_loss += datum_loss; batch_loss += datum_loss; - batch_counter++; + batch_counter++; if (!header.is_dev_set) { trainer->update(1.0); } if (batch_counter == header.report_frequency) { if (cid == 0) { - std::cerr << batch_loss / batch_counter << std::endl; + std::cerr << (header.is_dev_set ? "dev" : "train") << " x-ent: " << batch_loss / batch_counter << std::endl; } batch_loss = 0; batch_counter = 0; @@ -229,7 +239,7 @@ namespace cnn { } // Let the parent know that we're done and return the loss value - WriteReal(workloads[cid].c2p[1], total_loss); + Write(workloads[cid].c2p[1], total_loss); } return 0; } @@ -244,8 +254,8 @@ namespace cnn { template void RunMultiProcess(unsigned num_children, ILearner* learner, Trainer* trainer, const std::vector& train_data, const std::vector& dev_data, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency) { - queue_name = GenerateQueueName(); - + queue_name = GenerateQueueName(); + boost::interprocess::message_queue::remove(queue_name.c_str()); std::vector workloads = CreateWorkloads(num_children); unsigned cid = SpawnChildren(workloads); if (cid < num_children) { @@ -256,4 +266,4 @@ namespace cnn { } } } -}; +} From 10c07d0cc1d3bab6f9de3a9ccb80dd821cb7278f Mon Sep 17 00:00:00 2001 From: austinma Date: Fri, 4 Sep 2015 04:00:53 -0400 Subject: [PATCH 231/965] Added mechanism to allow saving of models to MP example --- cnn/mp.h | 13 ++++++++++--- examples/mp.cc | 2 ++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/cnn/mp.h b/cnn/mp.h index 99520a1f9..7434e01df 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -105,6 +106,7 @@ namespace cnn { public: virtual ~ILearner() {} virtual cnn::real LearnFromDatum(const D& datum, bool learn) = 0; + virtual void SaveModel() = 0; }; // Called by the parent to process a chunk of data @@ -142,7 +144,7 @@ namespace cnn { } template - void RunParent(const std::vector& train_data, const std::vector& dev_data, + void RunParent(const std::vector& train_data, const std::vector& dev_data, ILearner* learner, std::vector& workloads, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency) { const unsigned num_children = workloads.size(); boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); @@ -152,6 +154,7 @@ namespace cnn { std::vector dev_indices(dev_data.size()); std::iota(dev_indices.begin(), dev_indices.end(), 0); + cnn::real best_dev_loss = std::numeric_limits::max(); for (unsigned iter = 0; iter < num_iterations; ++iter) { // Shuffle the training data indices random_shuffle(train_indices.begin(), train_indices.end()); @@ -169,7 +172,11 @@ namespace cnn { std::cerr << fractional_iter << "\t" << "loss = " << train_loss << std::endl; cnn::real dev_loss = RunDataSet(dev_indices.begin(), dev_indices.end(), workloads, mq, {true, false, report_frequency}); - std::cerr << fractional_iter << "\t" << "dev loss = " << dev_loss << std::endl; + bool new_best = (dev_loss < best_dev_loss); + std::cerr << fractional_iter << "\t" << "dev loss = " << dev_loss << (new_best ? " (New best!)" : "") << std::endl; + if (new_best) { + learner->SaveModel(); + } begin = end; } @@ -262,7 +269,7 @@ namespace cnn { RunChild(cid, learner, trainer, workloads, train_data, dev_data); } else { - RunParent(train_data, dev_data, workloads, num_iterations, dev_frequency, report_frequency); + RunParent(train_data, dev_data, learner, workloads, num_iterations, dev_frequency, report_frequency); } } } diff --git a/examples/mp.cc b/examples/mp.cc index 094d7ddad..6a820f853 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -54,6 +54,8 @@ class Learner : public ILearner { return loss; } + void SaveModel() {} + private: RNNLanguageModel& rnnlm; }; From d901a90e311b4f3ae268a1daa3865e09dea8c140 Mon Sep 17 00:00:00 2001 From: austinma Date: Sat, 5 Sep 2015 02:16:38 -0400 Subject: [PATCH 232/965] Fixed bug in logic that decides whether to save model after evaluating dev set --- cnn/mp.h | 1 + 1 file changed, 1 insertion(+) diff --git a/cnn/mp.h b/cnn/mp.h index 7434e01df..d65a70a72 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -176,6 +176,7 @@ namespace cnn { std::cerr << fractional_iter << "\t" << "dev loss = " << dev_loss << (new_best ? " (New best!)" : "") << std::endl; if (new_best) { learner->SaveModel(); + best_dev_loss = dev_loss; } begin = end; From 92f5a70bb59f728e2270952aac5936162159e7b7 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 9 Sep 2015 22:59:52 -0400 Subject: [PATCH 233/965] prevent extra memory copy --- cnn/nodes.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index cb47afb99..e22916fb8 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -884,7 +884,7 @@ void MatrixMultiply::forward(const vector& xs, Tensor& fx) const #else auto x1 = **xs[0]; auto x2 = **xs[1]; - *fx = x1 * x2; + (*fx).noalias() = x1 * x2; #endif } From bd1d3c1ce2c94a51a4a66866338f1df14e512054 Mon Sep 17 00:00:00 2001 From: austinma Date: Thu, 10 Sep 2015 00:29:29 -0400 Subject: [PATCH 234/965] Added getter to see if a memory pool is shared --- cnn/aligned-mem-pool.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h index 747ac6103..0dba70a18 100644 --- a/cnn/aligned-mem-pool.h +++ b/cnn/aligned-mem-pool.h @@ -83,6 +83,10 @@ class AlignedMemoryPool { std::memset(mem, 0, used); #endif } + + bool is_shared() { + return shared; + } private: void sys_alloc(size_t cap) { capacity = round_up_align(cap); From 79a6c620102fb2fa50ae7be60b7ecbab0e260776 Mon Sep 17 00:00:00 2001 From: austinma Date: Thu, 10 Sep 2015 00:31:18 -0400 Subject: [PATCH 235/965] model.cc now allocates parameters in a memory pool --- cnn/model.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/cnn/model.cc b/cnn/model.cc index 7b139ff14..0481fe084 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -71,13 +71,11 @@ LookupParameters::LookupParameters(unsigned n, const Dim& d) : dim(d), values(n) for (unsigned i = 0; i < n; ++i) { auto& v = values[i]; v.d = d; - //v.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); v.v = static_cast(ps->allocate(d.size() * sizeof(float))); TensorTools::Randomize(v); auto& g = grads[i]; g.d = d; - g.v = (float*)cnn_mm_malloc(d.size() * sizeof(float), CNN_ALIGN); g.v = static_cast(ps->allocate(d.size() * sizeof(float))); TensorTools::Zero(g); } From e825c1c8e071d57cb82e83b7d55cc1c5ff0d88a3 Mon Sep 17 00:00:00 2001 From: dhg Date: Thu, 10 Sep 2015 20:36:17 -0700 Subject: [PATCH 236/965] Fixed bugs in cg.get_value and inconsistent semantics --- cnn/exec.cc | 73 ++++++++++++++++++++++++++--------------------------- cnn/exec.h | 2 +- 2 files changed, 37 insertions(+), 38 deletions(-) diff --git a/cnn/exec.cc b/cnn/exec.cc index fe868c340..21bfcd477 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -9,11 +9,11 @@ namespace cnn { ExecutionEngine::~ExecutionEngine() {} void SimpleExecutionEngine::invalidate() { - last_node_evaluated = 0; + num_nodes_evaluated = 0; } const Tensor& SimpleExecutionEngine::forward() { - const VariableIndex node_max_index = (VariableIndex)cg.nodes.size(); + const VariableIndex node_max_index = (VariableIndex)(cg.nodes.size() - 1); return forward(node_max_index); } @@ -24,55 +24,54 @@ const Tensor& SimpleExecutionEngine::forward(VariableIndex i) { const Tensor& SimpleExecutionEngine::get_value(VariableIndex i) { assert(i < cg.nodes.size()); - if (i >= last_node_evaluated) { - incremental_forward(i); + if (i >= num_nodes_evaluated) { + incremental_forward(); } return nfxs[i]; } const Tensor& SimpleExecutionEngine::incremental_forward() { - const VariableIndex node_max_index = (VariableIndex)cg.nodes.size(); + const VariableIndex node_max_index = (VariableIndex)(cg.nodes.size() - 1); return incremental_forward(node_max_index); } -const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex node_max_index) { +const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { // free any old memory if this is a new HG - if (last_node_evaluated == 0) fxs->free(); - - assert(node_max_index > 0); - nfxs.resize(node_max_index); - if (node_max_index - last_node_evaluated == 0) - return nfxs.back(); - - //vector dummy(5, "x"); - vector xs(16); - for (; last_node_evaluated < node_max_index; ++last_node_evaluated) { - const Node* node = cg.nodes[last_node_evaluated]; - xs.resize(node->arity()); - unsigned ai = 0; - for (VariableIndex arg : node->args) { - xs[ai] = &nfxs[arg]; - ++ai; - } - nfxs[last_node_evaluated].d = node->dim; - nfxs[last_node_evaluated].v = static_cast(fxs->allocate(node->dim.size() * sizeof(float))); - if (nfxs[last_node_evaluated].v == nullptr) { - cerr << "out of memory\n"; - abort(); - } - void* aux_mem = nullptr; - size_t aux_size = node->aux_storage_size(); - if (aux_size) { - aux_mem = fxs->allocate(aux_size); - if (!aux_mem) { + if (num_nodes_evaluated == 0) fxs->free(); + + if (i >= num_nodes_evaluated) { + nfxs.resize(i + 1); + + //vector dummy(5, "x"); + vector xs(16); + for (; num_nodes_evaluated <= i; ++num_nodes_evaluated) { + const Node* node = cg.nodes[num_nodes_evaluated]; + xs.resize(node->arity()); + unsigned ai = 0; + for (VariableIndex arg : node->args) { + xs[ai] = &nfxs[arg]; + ++ai; + } + nfxs[num_nodes_evaluated].d = node->dim; + nfxs[num_nodes_evaluated].v = static_cast(fxs->allocate(node->dim.size() * sizeof(float))); + if (nfxs[num_nodes_evaluated].v == nullptr) { cerr << "out of memory\n"; abort(); } + void* aux_mem = nullptr; + size_t aux_size = node->aux_storage_size(); + if (aux_size) { + aux_mem = fxs->allocate(aux_size); + if (!aux_mem) { + cerr << "out of memory\n"; + abort(); + } + } + node->aux_mem = aux_mem; + node->forward(xs, nfxs[num_nodes_evaluated]); } - node->aux_mem = aux_mem; - node->forward(xs, nfxs[last_node_evaluated]); } - return nfxs.back(); + return nfxs[i]; } void SimpleExecutionEngine::backward() { diff --git a/cnn/exec.h b/cnn/exec.h index 40555b316..46843eb6d 100644 --- a/cnn/exec.h +++ b/cnn/exec.h @@ -33,7 +33,7 @@ class SimpleExecutionEngine : public ExecutionEngine { private: std::vector nfxs; std::vector ndEdfs; - VariableIndex last_node_evaluated; + VariableIndex num_nodes_evaluated; }; } // namespace cnn From 228d571d07bff20babe9f894c6a2922cd07f52ea Mon Sep 17 00:00:00 2001 From: austinma Date: Mon, 14 Sep 2015 05:14:36 -0400 Subject: [PATCH 237/965] Shared memory is back to maintain counters and mutexes --- cnn/mp.h | 196 ++++++++++++++++++++++++++----------------------------- 1 file changed, 93 insertions(+), 103 deletions(-) diff --git a/cnn/mp.h b/cnn/mp.h index d65a70a72..c6ab07ebb 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -1,3 +1,4 @@ +#pragma once #include "cnn/cnn.h" #include "cnn/training.h" #include "cnn/expr.h" @@ -10,6 +11,7 @@ #include #include #include +#include #include #include @@ -25,8 +27,10 @@ namespace cnn { namespace mp { // TODO: Pass these around instead of having them be global - std::string queue_name = "cnn_mp_work_queue"; - std::string shared_memory_name = "cnn_mp_shared_memory"; + extern std::string queue_name; + extern std::string shared_memory_name; + extern timespec start_time; + extern bool stop_requested; struct WorkloadHeader { bool is_dev_set; @@ -34,31 +38,6 @@ namespace cnn { unsigned report_frequency; }; - // Some simple functions that do IO to/from pipes. - // These are used to send data from child processes - // to the parent process or vice/versa. - template - T Read(int pipe) { - T v; - int err = read(pipe, &v, sizeof(T)); - assert (err != -1); - return v; - } - - template - void Write(int pipe, const T& v) { - int err = write(pipe, &v, sizeof(T)); - assert (err != -1); - } - - cnn::real SumValues(const std::vector& values) { - return accumulate(values.begin(), values.end(), 0.0); - } - - cnn::real Mean(const std::vector& values) { - return SumValues(values) / values.size(); - } - // A simple struct to hold information about a child process // TODO: Rename me! struct Workload { @@ -67,38 +46,6 @@ namespace cnn { int p2c[2]; // Parent to child pipe }; - unsigned SpawnChildren(std::vector& workloads) { - const unsigned num_children = workloads.size(); - assert (workloads.size() == num_children); - pid_t pid; - unsigned cid; - for (cid = 0; cid < num_children; ++cid) { - pid = fork(); - if (pid == -1) { - std::cerr << "Fork failed. Exiting ..." << std::endl; - return 1; - } - else if (pid == 0) { - // children shouldn't continue looping - break; - } - workloads[cid].pid = pid; - } - return cid; - } - - std::vector CreateWorkloads(unsigned num_children) { - int err; - std::vector workloads(num_children); - for (unsigned cid = 0; cid < num_children; cid++) { - err = pipe(workloads[cid].p2c); - assert (err == 0); - err = pipe(workloads[cid].c2p); - assert (err == 0); - } - return workloads; - } - // This interface is used by the child processes and called // once per datum. template @@ -109,39 +56,58 @@ namespace cnn { virtual void SaveModel() = 0; }; - // Called by the parent to process a chunk of data - cnn::real RunDataSet(std::vector::iterator begin, std::vector::iterator end, const std::vector& workloads, - boost::interprocess::message_queue& mq, const WorkloadHeader& header) { - const unsigned num_children = workloads.size(); + struct SharedObject { + SharedObject() : update_mutex(1), counter_mutex(1), counter(0) {} + boost::interprocess::interprocess_semaphore update_mutex; + boost::interprocess::interprocess_semaphore counter_mutex; + unsigned counter; + }; + extern SharedObject* shared_object; - // Tell all the children to start up - for (unsigned cid = 0; cid < num_children; ++cid) { - bool cont = true; - Write(workloads[cid].p2c[1], cont); - Write(workloads[cid].p2c[1], header); - } + /// XXX: We never delete these objects + template + T* GetSharedMemory() { + /*std::cerr << "Creating shared memory named " << shared_memory_name << std::endl; + auto shm = new boost::interprocess::shared_memory_object(boost::interprocess::create_only, shared_memory_name.c_str(), boost::interprocess::read_write); + shm->truncate(sizeof(T)); + auto region = new boost::interprocess::mapped_region (*shm, boost::interprocess::read_write);*/ + auto region = new boost::interprocess::mapped_region(boost::interprocess::anonymous_shared_memory(sizeof(T))); + void* addr = region->get_address(); + T* obj = new (addr) SharedObject(); + return obj; + } - // Write all the indices to the queue for the children to process - for (auto curr = begin; curr != end; ++curr) { - unsigned i = *curr; - mq.send(&i, sizeof(i), 0); - } + // Some simple functions that do IO to/from pipes. + // These are used to send data from child processes + // to the parent process or vice/versa. + template + T Read(int pipe) { + T v; + int err = read(pipe, &v, sizeof(T)); + assert (err != -1); + return v; + } - // Send a bunch of stop messages to the children - for (unsigned cid = 0; cid < num_children; ++cid) { - unsigned stop = -1U; - mq.send(&stop, sizeof(stop), 0); - } + template + void Write(int pipe, const T& v) { + int err = write(pipe, &v, sizeof(T)); + assert (err != -1); + } - // Wait for each child to finish training its load - std::vector losses(num_children); - for(unsigned cid = 0; cid < num_children; ++cid) { - losses[cid] = Read(workloads[cid].c2p[0]); - } + std::string GenerateQueueName(); + std::string GenerateSharedMemoryName(); - cnn::real loss = SumValues(losses) / std::distance(begin, end); - return loss; - } + cnn::real SumValues(const std::vector& values); + cnn::real Mean(const std::vector& values); + + std::string ElapsedTimeString(const timespec& start, const timespec& end); + + unsigned SpawnChildren(std::vector& workloads); + std::vector CreateWorkloads(unsigned num_children); + + // Called by the parent to process a chunk of data + cnn::real RunDataSet(std::vector::iterator begin, std::vector::iterator end, const std::vector& workloads, + boost::interprocess::message_queue& mq, const WorkloadHeader& header); template void RunParent(const std::vector& train_data, const std::vector& dev_data, ILearner* learner, @@ -155,7 +121,7 @@ namespace cnn { std::iota(dev_indices.begin(), dev_indices.end(), 0); cnn::real best_dev_loss = std::numeric_limits::max(); - for (unsigned iter = 0; iter < num_iterations; ++iter) { + for (unsigned iter = 0; iter < num_iterations && !stop_requested; ++iter) { // Shuffle the training data indices random_shuffle(train_indices.begin(), train_indices.end()); @@ -171,9 +137,16 @@ namespace cnn { train_loss += RunDataSet(begin, end, workloads, mq, {false, end == train_indices.end(), report_frequency}); std::cerr << fractional_iter << "\t" << "loss = " << train_loss << std::endl; + if (stop_requested) { + break; + } + cnn::real dev_loss = RunDataSet(dev_indices.begin(), dev_indices.end(), workloads, mq, {true, false, report_frequency}); bool new_best = (dev_loss < best_dev_loss); std::cerr << fractional_iter << "\t" << "dev loss = " << dev_loss << (new_best ? " (New best!)" : "") << std::endl; + if (stop_requested) { + break; + } if (new_best) { learner->SaveModel(); best_dev_loss = dev_loss; @@ -197,23 +170,20 @@ namespace cnn { const std::vector& dev_data) { const unsigned num_children = workloads.size(); assert (cid >= 0 && cid < num_children); - int err; unsigned i; unsigned priority; boost::interprocess::message_queue::size_type recvd_size; boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); while (true) { // Check if the parent wants us to exit - bool cont = Read(workloads[cid].p2c[0]); - assert (err == 0); + bool cont = Read(workloads[cid].p2c[0]); if (!cont) { break; } // Check if we're running on the training data or the dev data //std::cerr << "#" << cid << " waiting for header" << std::endl; - WorkloadHeader header = Read(workloads[cid].p2c[0]); - assert (err == 0); + WorkloadHeader header = Read(workloads[cid].p2c[0]); // Run the actual training loop cnn::real total_loss = 0; @@ -230,9 +200,32 @@ namespace cnn { cnn::real datum_loss = learner->LearnFromDatum(datum, !header.is_dev_set); total_loss += datum_loss; batch_loss += datum_loss; - batch_counter++; - if (!header.is_dev_set) { - trainer->update(1.0); + batch_counter++; + + bool do_update = !header.is_dev_set && cid == 0 && (batch_counter % 10 == 9); + shared_object->counter_mutex.wait(); + unsigned counter = ++shared_object->counter; + if (do_update) { shared_object->counter = 0; } + shared_object->counter_mutex.post(); + if (do_update) { + /*std::cerr << "Parameter checking part 1..." << std::endl; + for (LookupParameters* p : trainer->model->lookup_parameters_list()) { + for (unsigned s = 0; s < p->size(); ++s) { + assert (p->values[s].is_valid()); + assert (p->grads[s].is_valid()); + } + }*/ + shared_object->update_mutex.wait(); + trainer->update(1.0 / counter); + shared_object->update_mutex.post(); + /*std::cerr << "Parameter checking part 2..." << std::endl; + for (LookupParameters* p : trainer->model->lookup_parameters_list()) { + for (unsigned s = 0; s < p->size(); ++s) { + assert (p->values[s].is_valid()); + assert (p->grads[s].is_valid()); + } + } + std::cerr << "Parameter checking done." << std::endl;*/ } if (batch_counter == header.report_frequency) { if (cid == 0) { @@ -252,18 +245,15 @@ namespace cnn { return 0; } - std::string GenerateQueueName() { - std::ostringstream ss; - ss << "cnn_mp_work_queue"; - ss << rand(); - return ss.str(); - } - template void RunMultiProcess(unsigned num_children, ILearner* learner, Trainer* trainer, const std::vector& train_data, const std::vector& dev_data, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency) { + assert (cnn::ps->is_shared()); queue_name = GenerateQueueName(); boost::interprocess::message_queue::remove(queue_name.c_str()); + boost::interprocess::message_queue::remove(queue_name.c_str()); + shared_memory_name = GenerateSharedMemoryName(); + shared_object = GetSharedMemory(); std::vector workloads = CreateWorkloads(num_children); unsigned cid = SpawnChildren(workloads); if (cid < num_children) { From 52b78372ba76ccbb874bf0005cfeed11a0936184 Mon Sep 17 00:00:00 2001 From: Austin Matthews Date: Mon, 14 Sep 2015 02:23:52 -0700 Subject: [PATCH 238/965] merge --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index a4b2e2403..0b344eb4e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,6 +75,9 @@ if (WITH_CUDA_BACKEND) set(CUDA_TOOLKIT_ROOT_DIR ${CUDA_ROOT}) include_directories(SYSTEM ${CUDA_INCLUDE_DIRS}) add_definitions(-DHAVE_CUDA) + list(APPEND CUDA_LIBRARIES /usr/lib64/libpthread.so) + MESSAGE("CUDA_LIBRARIES: ${CUDA_LIBRARIES}") + list(REMOVE_ITEM CUDA_LIBRARIES -lpthread) set(LIBS ${LIBS} ${CUDA_LIBRARIES}) #find_cudnn() #include_directories(SYSTEM ${CUDNN_INCLUDE_DIRS}) From 348cdf1997e555614d1a70313ac4c9b3fcb3969b Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Tue, 15 Sep 2015 14:41:32 +0300 Subject: [PATCH 239/965] small updates --- pycnn/pycnn.pyx | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 5e64a1a61..454cf0736 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -120,6 +120,9 @@ cdef class LookupParameters: return (self.thisptr.values.size(), self.thisptr.dim.rows(), self.thisptr.dim.cols()) return (self.thisptr.values.size(), self.thisptr.dim.rows()) + def __getitem__(self, int i): + return lookup(self, i) + cpdef init_row(self, unsigned i, vector[float] row): self.thisptr.Initialize(i, row) @@ -575,7 +578,6 @@ cpdef Expression average(list xs): for x in xs: ensure_freshness(x) cvec.push_back(x.c()) - print >> sys.stderr,"pushing",cvec.back().i return Expression.from_cexpr(x.cg_version, c_average(cvec)) cpdef Expression concatenate_cols(list xs): @@ -776,6 +778,41 @@ cdef class RNNState: # {{{ def b(self): return self.builder #}}} + +# TODO: do at least minimal testing for this +cdef class StackedRNNState: + cdef list states + cdef StackedRNNState prev + def __init__(self, list states, StackedRNNState prev=None): + self.states = states + self.prev = prev + + cpdef StackedRNNState add_input(self, Expression x): + cdef list next_states + next_states = [] + for s in self.states: + next_states.append(s.add_input(x)) + x = next_states[-1].output() + return StackedRNNState(next_states, self) + + def output(self): return self.states[-1].output() + + def prev(self): return self.prev + def h(self): return [s.h() for s in self.states] + def s(self): return [s.s() for s in self.states] + + def add_inputs(self, xs): + """ + returns the list of states obtained by adding the given inputs + to the current state, one by one. + """ + states = [] + cur = self + for x in xs: + cur = cur.add_input(x) + states.append(cur) + return states + # }}} # {{{ Training From c26dbd714c673a8358e3d48885011e2a7475a323 Mon Sep 17 00:00:00 2001 From: Waleed Ammar Date: Tue, 15 Sep 2015 16:57:25 -0400 Subject: [PATCH 240/965] Unlike traditioanl dropout which stochasticaly zeros individual scalars in an expression, block_dropout stochastically zeros the entire expression. --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/nodes-common.cc | 11 +++++++++++ cnn/nodes.cc | 21 +++++++++++++++++++++ cnn/nodes.h | 15 +++++++++++++++ 5 files changed, 49 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index 4757ed37a..53c055e57 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -46,6 +46,7 @@ Expression min(const Expression& x, const Expression& y) { return Expression(x.p Expression max(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression noise(const Expression& x, real stddev) { return Expression(x.pg, x.pg->add_function({x.i}, stddev)); } Expression dropout(const Expression& x, real p) { return Expression(x.pg, x.pg->add_function({x.i}, p)); } +Expression block_dropout(const Expression& x, real p) { return Expression(x.pg, x.pg->add_function({x.i}, p)); } Expression reshape(const Expression& x, const Dim& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } Expression transpose(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 315dc8cde..a02053a65 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -59,6 +59,7 @@ Expression min(const Expression& x, const Expression& y); Expression max(const Expression& x, const Expression& y); Expression noise(const Expression& x, real stddev); Expression dropout(const Expression& x, real p); +Expression block_dropout(const Expression& x, real p); Expression reshape(const Expression& x, const Dim& d); Expression transpose(const Expression& x); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index f350d03c3..db46a38bb 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -193,6 +193,17 @@ Dim Dropout::dim_forward(const vector& xs) const { return xs[0]; } +string BlockDropout::as_string(const vector& arg_names) const { + ostringstream s; + s << "block_dropout(" << arg_names[0] << ",dropout_probability=" << dropout_probability << ')'; + return s.str(); +} + +Dim BlockDropout::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string ConstantPlusX::as_string(const vector& arg_names) const { ostringstream s; s << c << " + " << arg_names[0]; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index e22916fb8..7428a35a2 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -301,6 +301,27 @@ void Dropout::backward(const vector& xs, (*dEdxi) += (*dEdf).cwiseProduct(*m); }; +size_t BlockDropout::aux_storage_size() const { + // we just need to remember whether this entire block is turned on (1.0) or off (0.0) + return 1 * sizeof(float); +} + +void BlockDropout::forward(const vector& xs, Tensor& fx) const { + bernoulli_distribution distribution(dropout_probability); + float block_multiplier = distribution(*rndeng)? 1.0 : 0.0; + *(static_cast(aux_mem)) = block_multiplier; + (*fx) = **xs[0] * block_multiplier; +} + +void BlockDropout::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + float block_multiplier = *(static_cast(aux_mem)); + (*dEdxi) += (*dEdf) * block_multiplier; +} + void ConstantPlusX::forward(const vector& xs, Tensor& fx) const { auto x = **xs[0]; *fx = x.unaryExpr(FConstantPlus(c)); diff --git a/cnn/nodes.h b/cnn/nodes.h index bdaa103cc..0ccb908ff 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -181,6 +181,21 @@ struct Dropout : public Node { real p; }; +// y = block_dropout(x,p) where p specifies the probability for dropping-out the entire block +struct BlockDropout : public Node { + explicit BlockDropout(const std::initializer_list& a, real p) : Node(a), dropout_probability(p) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + size_t aux_storage_size() const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; + real dropout_probability; +}; + // y = c + x_1 // (c is a vector or matrix of the constant, usually 1, but can be configured) struct ConstantPlusX : public Node { From 17d5b029436e9c9a1aa5ca54a1fe6ae7be714f6b Mon Sep 17 00:00:00 2001 From: austinma Date: Thu, 17 Sep 2015 01:49:24 -0400 Subject: [PATCH 241/965] Fixed issue with adagrad and scale parameter --- cnn/training.cc | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/cnn/training.cc b/cnn/training.cc index 93111f66d..fdc17ead3 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -6,6 +6,11 @@ namespace cnn { using namespace std; +template +bool is_valid(const Eigen::MatrixBase& x) { + return ((x - x).array() == (x - x).array()).all(); +} + Trainer::~Trainer() {} float Trainer::clip_gradients() { @@ -94,9 +99,10 @@ void AdagradTrainer::update(real scale) { for (auto p : model->parameters_list()) { Tensor& v = vp[pi++].h; auto reg = (*p->values) * lambda; - auto g2 = (*p->g).cwiseProduct(*p->g); + auto g = scale * gscale * (*p->g); + auto g2 = g.cwiseProduct(g); (*v) += g2; - auto delta = -(eta * scale * gscale) * (*p->g).cwiseQuotient(((*v).array() + epsilon).matrix().cwiseSqrt()); + auto delta = -eta * g.cwiseQuotient(((*v).array() + epsilon).matrix().cwiseSqrt()); *p->values += delta - reg; p->clear(); } @@ -107,9 +113,10 @@ void AdagradTrainer::update(real scale) { for (auto i : p->non_zero_grads) { Tensor& v = vx[i]; auto reg = (*p->values[i]) * lambda; - auto g2 = (*p->grads[i]).cwiseProduct(*p->grads[i]); + auto g = scale * gscale * (*p->grads[i]); + auto g2 = g.cwiseProduct(g); (*v) += g2; - auto delta = -(eta * scale * gscale) * (*p->grads[i]).cwiseQuotient(((*v).array() + epsilon).matrix().cwiseSqrt()); + auto delta = -eta * g.cwiseQuotient(((*v).array() + epsilon).matrix().cwiseSqrt()); *p->values[i] += delta - reg; } p->clear(); From 8ed772226618350869544840672fc121fe5b0e67 Mon Sep 17 00:00:00 2001 From: austinma Date: Thu, 17 Sep 2015 01:50:23 -0400 Subject: [PATCH 242/965] Refactoring of MP code --- cnn/CMakeLists.txt | 2 + cnn/mp.cc | 77 +++++++++++++++++++++++ cnn/mp.h | 133 ++++++++++++++++++++++++---------------- examples/CMakeLists.txt | 2 +- examples/mp.cc | 2 +- 5 files changed, 162 insertions(+), 54 deletions(-) create mode 100644 cnn/mp.cc diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 673a20180..0f0438f03 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -14,6 +14,7 @@ set(cnn_library_SRCS init.cc lstm.cc model.cc + mp.cc nodes.cc nodes-common.cc param-nodes.cc @@ -45,6 +46,7 @@ set(cnn_library_HDRS init.h lstm.h model.h + mp.h nodes.h param-nodes.h random.h diff --git a/cnn/mp.cc b/cnn/mp.cc new file mode 100644 index 000000000..bb8d84116 --- /dev/null +++ b/cnn/mp.cc @@ -0,0 +1,77 @@ +#include "mp.h" +using namespace std; +using namespace boost::interprocess; + +namespace cnn { + namespace mp { + // TODO: Pass these around instead of having them be global + std::string queue_name = "cnn_mp_work_queue"; + std::string shared_memory_name = "cnn_mp_shared_memory"; + timespec start_time; + bool stop_requested = false; + SharedObject* shared_object = nullptr; + + std::string GenerateQueueName() { + std::ostringstream ss; + ss << "cnn_mp_work_queue"; + ss << rand(); + return ss.str(); + } + + std::string GenerateSharedMemoryName() { + std::ostringstream ss; + ss << "cnn_mp_shared_memory"; + ss << rand(); + return ss.str(); + } + + cnn::real SumValues(const std::vector& values) { + return accumulate(values.begin(), values.end(), 0.0); + } + + cnn::real Mean(const std::vector& values) { + return SumValues(values) / values.size(); + } + + std::string ElapsedTimeString(const timespec& start, const timespec& end) { + std::ostringstream ss; + time_t secs = end.tv_sec - start.tv_sec; + long nsec = end.tv_nsec - start.tv_nsec; + ss << secs << " seconds and " << nsec << "nseconds"; + return ss.str(); + } + + unsigned SpawnChildren(std::vector& workloads) { + const unsigned num_children = workloads.size(); + assert (workloads.size() == num_children); + pid_t pid; + unsigned cid; + for (cid = 0; cid < num_children; ++cid) { + pid = fork(); + if (pid == -1) { + std::cerr << "Fork failed. Exiting ..." << std::endl; + return 1; + } + else if (pid == 0) { + // children shouldn't continue looping + break; + } + workloads[cid].pid = pid; + } + return cid; + } + + std::vector CreateWorkloads(unsigned num_children) { + int err; + std::vector workloads(num_children); + for (unsigned cid = 0; cid < num_children; cid++) { + err = pipe(workloads[cid].p2c); + assert (err == 0); + err = pipe(workloads[cid].c2p); + assert (err == 0); + } + return workloads; + } + + } +} diff --git a/cnn/mp.h b/cnn/mp.h index c6ab07ebb..ec760b90c 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -23,6 +23,7 @@ #include #include #include +#include namespace cnn { namespace mp { @@ -48,12 +49,12 @@ namespace cnn { // This interface is used by the child processes and called // once per datum. - template + template class ILearner { - public: - virtual ~ILearner() {} - virtual cnn::real LearnFromDatum(const D& datum, bool learn) = 0; - virtual void SaveModel() = 0; + public: + virtual ~ILearner() {} + virtual S LearnFromDatum(const D& datum, bool learn) = 0; + virtual void SaveModel() = 0; }; struct SharedObject { @@ -106,11 +107,48 @@ namespace cnn { std::vector CreateWorkloads(unsigned num_children); // Called by the parent to process a chunk of data - cnn::real RunDataSet(std::vector::iterator begin, std::vector::iterator end, const std::vector& workloads, - boost::interprocess::message_queue& mq, const WorkloadHeader& header); + template + S RunDataSet(std::vector::iterator begin, std::vector::iterator end, const std::vector& workloads, + boost::interprocess::message_queue& mq, const WorkloadHeader& header) { + const unsigned num_children = workloads.size(); + + // Tell all the children to start up + for (unsigned cid = 0; cid < num_children; ++cid) { + bool cont = true; + Write(workloads[cid].p2c[1], cont); + Write(workloads[cid].p2c[1], header); + } + + // Write all the indices to the queue for the children to process + for (auto curr = begin; curr != end; ++curr) { + unsigned i = *curr; + mq.send(&i, sizeof(i), 0); + if (stop_requested) { + break; + } + } + + // Send a bunch of stop messages to the children + for (unsigned cid = 0; cid < num_children; ++cid) { + unsigned stop = -1U; + mq.send(&stop, sizeof(stop), (stop_requested ? 1 : 0)); + } - template - void RunParent(const std::vector& train_data, const std::vector& dev_data, ILearner* learner, + // Wait for each child to finish training its load + std::vector losses(num_children); + for(unsigned cid = 0; cid < num_children; ++cid) { + losses[cid] = Read(workloads[cid].c2p[0]); + } + + S total_loss = S(); + for (S& datum_loss : losses) { + total_loss += datum_loss; + } + return total_loss; + } + + template + void RunParent(const std::vector& train_data, const std::vector& dev_data, ILearner* learner, std::vector& workloads, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency) { const unsigned num_children = workloads.size(); boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); @@ -120,12 +158,14 @@ namespace cnn { std::vector dev_indices(dev_data.size()); std::iota(dev_indices.begin(), dev_indices.end(), 0); - cnn::real best_dev_loss = std::numeric_limits::max(); + S best_dev_loss = S(); + bool first_dev_run = true; + std::mt19937 rndeng(42); for (unsigned iter = 0; iter < num_iterations && !stop_requested; ++iter) { // Shuffle the training data indices - random_shuffle(train_indices.begin(), train_indices.end()); + std::shuffle(train_indices.begin(), train_indices.end(), rndeng); - cnn::real train_loss = 0.0; + S train_loss = S(); std::vector::iterator begin = train_indices.begin(); while (begin != train_indices.end()) { @@ -134,15 +174,17 @@ namespace cnn { end = train_indices.end(); } double fractional_iter = iter + 1.0 * distance(train_indices.begin(), end) / train_indices.size(); - train_loss += RunDataSet(begin, end, workloads, mq, {false, end == train_indices.end(), report_frequency}); - std::cerr << fractional_iter << "\t" << "loss = " << train_loss << std::endl; + S batch_loss = RunDataSet(begin, end, workloads, mq, {false, end == train_indices.end(), report_frequency}); + train_loss += batch_loss; + std::cerr << fractional_iter << "\t" << "loss = " << batch_loss << std::endl; if (stop_requested) { break; } - cnn::real dev_loss = RunDataSet(dev_indices.begin(), dev_indices.end(), workloads, mq, {true, false, report_frequency}); - bool new_best = (dev_loss < best_dev_loss); + S dev_loss = RunDataSet(dev_indices.begin(), dev_indices.end(), workloads, mq, {true, false, report_frequency}); + bool new_best = (first_dev_run || dev_loss < best_dev_loss); + first_dev_run = false; std::cerr << fractional_iter << "\t" << "dev loss = " << dev_loss << (new_best ? " (New best!)" : "") << std::endl; if (stop_requested) { break; @@ -159,13 +201,13 @@ namespace cnn { // Kill all children one by one and wait for them to exit for (unsigned cid = 0; cid < num_children; ++cid) { bool cont = false; - Write(workloads[cid].p2c[1], &cont); + Write(workloads[cid].p2c[1], cont); wait(NULL); } } - template - int RunChild(unsigned cid, ILearner* learner, Trainer* trainer, + template + int RunChild(unsigned cid, ILearner* learner, Trainer* trainer, std::vector& workloads, const std::vector& train_data, const std::vector& dev_data) { const unsigned num_children = workloads.size(); @@ -176,18 +218,17 @@ namespace cnn { boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); while (true) { // Check if the parent wants us to exit - bool cont = Read(workloads[cid].p2c[0]); - if (!cont) { + bool cont = Read(workloads[cid].p2c[0]); + if (cont == 0) { break; } - // Check if we're running on the training data or the dev data - //std::cerr << "#" << cid << " waiting for header" << std::endl; - WorkloadHeader header = Read(workloads[cid].p2c[0]); + // Check if we're running on the training data or the dev data + WorkloadHeader header = Read(workloads[cid].p2c[0]); // Run the actual training loop - cnn::real total_loss = 0; - cnn::real batch_loss = 0; + S total_loss = S(); + S batch_loss = S(); unsigned batch_counter = 0; while (true) { mq.receive(&i, sizeof(unsigned), recvd_size, priority); @@ -197,46 +238,34 @@ namespace cnn { assert (i < (header.is_dev_set ? dev_data.size() : train_data.size())); const D& datum = (header.is_dev_set ? dev_data[i] : train_data[i]); - cnn::real datum_loss = learner->LearnFromDatum(datum, !header.is_dev_set); + S datum_loss = learner->LearnFromDatum(datum, !header.is_dev_set); total_loss += datum_loss; batch_loss += datum_loss; batch_counter++; - bool do_update = !header.is_dev_set && cid == 0 && (batch_counter % 10 == 9); - shared_object->counter_mutex.wait(); - unsigned counter = ++shared_object->counter; - if (do_update) { shared_object->counter = 0; } - shared_object->counter_mutex.post(); + bool do_update = !header.is_dev_set && cid == 0; + unsigned counter = 0; + if (!header.is_dev_set) { + shared_object->counter_mutex.wait(); + counter = ++shared_object->counter; + if (do_update) { shared_object->counter = 0; } + shared_object->counter_mutex.post(); + } if (do_update) { - /*std::cerr << "Parameter checking part 1..." << std::endl; - for (LookupParameters* p : trainer->model->lookup_parameters_list()) { - for (unsigned s = 0; s < p->size(); ++s) { - assert (p->values[s].is_valid()); - assert (p->grads[s].is_valid()); - } - }*/ shared_object->update_mutex.wait(); trainer->update(1.0 / counter); shared_object->update_mutex.post(); - /*std::cerr << "Parameter checking part 2..." << std::endl; - for (LookupParameters* p : trainer->model->lookup_parameters_list()) { - for (unsigned s = 0; s < p->size(); ++s) { - assert (p->values[s].is_valid()); - assert (p->grads[s].is_valid()); - } - } - std::cerr << "Parameter checking done." << std::endl;*/ } if (batch_counter == header.report_frequency) { if (cid == 0) { - std::cerr << (header.is_dev_set ? "dev" : "train") << " x-ent: " << batch_loss / batch_counter << std::endl; + std::cerr << (header.is_dev_set ? "dev" : "train") << " loss: " << batch_loss << std::endl; } - batch_loss = 0; + batch_loss = S(); batch_counter = 0; } } if (header.end_of_epoch) { - trainer->update_epoch(); + //trainer->update_epoch(); } // Let the parent know that we're done and return the loss value @@ -245,8 +274,8 @@ namespace cnn { return 0; } - template - void RunMultiProcess(unsigned num_children, ILearner* learner, Trainer* trainer, const std::vector& train_data, + template + void RunMultiProcess(unsigned num_children, ILearner* learner, Trainer* trainer, const std::vector& train_data, const std::vector& dev_data, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency) { assert (cnn::ps->is_shared()); queue_name = GenerateQueueName(); diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index cbf43babc..5c015cf38 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -2,7 +2,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET poisson-regression tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2 mp) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) - target_link_libraries(${TARGET} cnn ${LIBS}) + target_link_libraries(${TARGET} cnn ${LIBS} rt pthread) if (WITH_CUDA_BACKEND) add_dependencies(${TARGET} cnncuda) target_link_libraries(${TARGET} cnncuda) diff --git a/examples/mp.cc b/examples/mp.cc index 6a820f853..1d77b2586 100644 --- a/examples/mp.cc +++ b/examples/mp.cc @@ -39,7 +39,7 @@ vector ReadData(string filename) { } template -class Learner : public ILearner { +class Learner : public ILearner { public: explicit Learner(RNNLanguageModel& rnnlm, unsigned data_size) : rnnlm(rnnlm) {} ~Learner() {} From cc1ce028ad8a6631a047f17941464523297ca9be Mon Sep 17 00:00:00 2001 From: Waleed Ammar Date: Thu, 17 Sep 2015 15:01:02 -0400 Subject: [PATCH 243/965] fix block_dropout --- cnn/nodes.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 7428a35a2..8b49d62a7 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -307,8 +307,13 @@ size_t BlockDropout::aux_storage_size() const { } void BlockDropout::forward(const vector& xs, Tensor& fx) const { - bernoulli_distribution distribution(dropout_probability); + bernoulli_distribution distribution(1.0 - dropout_probability); float block_multiplier = distribution(*rndeng)? 1.0 : 0.0; + block_multiplier = + dropout_probability == 1.0? 0.0 : block_multiplier / (1.0 - dropout_probability); + if (dropout_probability > 1.0 || dropout_probability < 0.0) { + assert(false && "dropout probability must be in the range [0, 1]"); + } *(static_cast(aux_mem)) = block_multiplier; (*fx) = **xs[0] * block_multiplier; } From 29bfde7c00e06ede3c78b14415e8ceab185c3e41 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Mon, 21 Sep 2015 12:32:31 +0300 Subject: [PATCH 244/965] option to force recalculate in expression forward --- pycnn/pycnn.pyx | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 454cf0736..d437ea42b 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -355,18 +355,21 @@ cdef class Expression: #{{{ def __getslice__(self, int i, int j): return pickrange(self, i, j) - cpdef scalar_value(self): + cpdef scalar_value(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") + if recalculate: self.cg.forward() return c_as_scalar(self.cg.get_value(self.vindex)) - cpdef vec_value(self): + cpdef vec_value(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") + if recalculate: self.cg.forward() return c_as_vector(self.cg.get_value(self.vindex)) - cpdef npvalue(self): + cpdef npvalue(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") cdef CTensor t cdef CDim dim + if recalculate: self.cg.forward() t = self.cg.get_value(self.vindex) dim = t.d arr = np.array(c_as_vector(t)) @@ -374,9 +377,10 @@ cdef class Expression: #{{{ arr = arr.reshape(dim.rows(), dim.cols(),order='F') return arr - cpdef value(self): + cpdef value(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") cdef CTensor t + if recalculate: self.cg.forward() t = self.cg.get_value(self.vindex) if t.d.ndims() == 2: return self.npvalue() @@ -385,9 +389,10 @@ cdef class Expression: #{{{ return vec # TODO this runs incremental forward on the entire graph, may not be optimal in terms of efficiency. - cpdef forward(self): + cpdef forward(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") - self.cg.incremental_forward() + if recalculate: self.cg.forward() + else: self.cg.incremental_forward() cpdef backward(self): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") @@ -778,8 +783,7 @@ cdef class RNNState: # {{{ def b(self): return self.builder #}}} - -# TODO: do at least minimal testing for this +# StackedRNNState TODO: do at least minimal testing for this #{{{ cdef class StackedRNNState: cdef list states cdef StackedRNNState prev @@ -812,6 +816,7 @@ cdef class StackedRNNState: cur = cur.add_input(x) states.append(cur) return states +#}}} # }}} From 06749ee738fee4763fc220e6144cbd72c63e9797 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Mon, 21 Sep 2015 12:37:35 +0300 Subject: [PATCH 245/965] documentation (xor, API) --- pyexamples/tutorials/API.ipynb | 279 +++++++ pyexamples/tutorials/tutorial-1-xor.ipynb | 885 ++++++++++++++++++++++ 2 files changed, 1164 insertions(+) create mode 100644 pyexamples/tutorials/API.ipynb create mode 100644 pyexamples/tutorials/tutorial-1-xor.ipynb diff --git a/pyexamples/tutorials/API.ipynb b/pyexamples/tutorials/API.ipynb new file mode 100644 index 000000000..1b35f7f9d --- /dev/null +++ b/pyexamples/tutorials/API.ipynb @@ -0,0 +1,279 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Expression building\n", + "\n", + "### (note: may have old API in some cases)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from pycnn import *\n", + "\n", + "## ==== Create a new computation graph\n", + "# (it is a singleton, we have one at each stage.\n", + "# renew_cg() clears the current one and starts anew)\n", + "renew_cg()\n", + "\n", + "## ==== Creating Expressions from user input / constants.\n", + "x = scalarInput(value)\n", + "\n", + "v = vecIn(dimension)\n", + "v.set([1,2,3])\n", + "\n", + "z = matInput(dim1, dim2)\n", + "# for example:\n", + "z1 = matInput(2, 2)\n", + "z1.set([1,2,3,4])\n", + "\n", + "## ==== We can take the value of an expression. \n", + "# For complex expressions, this will run forward propagation.\n", + "print z.value() \n", + "print z.npvalue() # as numpy array\n", + "print v.vec_value() # as vector, if vector\n", + "print x.scalar_valur() # as scalar, if scalar\n", + "print x.value() # choose the correct one\n", + "\n", + "## ==== Parameters\n", + "# Parameters are things we tune during training.\n", + "# Usually a matrix or a vector.\n", + "\n", + "# First we create a model and add the parameters to it.\n", + "m = Model() \n", + "pW = m.add_parameters(\"W\", (8,8)) # an 8x8 matrix\n", + "pb = m.add_parameters(\"b\", 8)\n", + "# then we create an Expression out of the model's parameters\n", + "W = parameter(pW) # or W = parameter(m[\"W\"])\n", + "b = parameter(pb)\n", + "\n", + "## ===== Lookup parameters\n", + "# Similar to parameters, but are representing a \"lookup table\"\n", + "# that maps numbers to vectors.\n", + "# These are used for embedding matrices.\n", + "# for example, this will have VOCAB_SIZE rows, each of DIM dimensions.\n", + "lp = m.add_lookup_parameters(\"lookup\", (VOCAB_SIZE, DIM))\n", + "e5 = lookup(lp, 5) # create an Expression from row 5.\n", + "e5c = lookup(lp, 5, update=False) # as before, but don't update when optimizing.\n", + "e5.set(9) # now the e5 expression contains row 9\n", + "e5c.set(9) # ditto\n", + "\n", + "## ===== Combine expression into complex expressions.\n", + "\n", + "# Math \n", + "e = e1 + e2 \n", + "e = e1 * e2 # for vectors/matrices: matrix multiplication (like e1.dot(e2) in numpy)\n", + "e = e1 - e2 \n", + "e = -e1 \n", + "\n", + "e = dot_product(e1, e2)\n", + "e = cwise_multiply(e1, e2) # component-wise divide (like e1*e2 in numpy)\n", + "e = cdiv(e1, e2) # component-wise divide\n", + "e = colwise_add(e1, e2) # column-wise addition\n", + "\n", + "# Matrix Shapes\n", + "e = reshape(e1, new_dimension)\n", + "e = transpose(e1)\n", + "\n", + "# Per-element unary functions.\n", + "e = tanh(e1) \n", + "e = exp(e1)\n", + "e = log(e1)\n", + "e = logistic(e1) # Sigmoid(x)\n", + "e = rectify(e1) # Relu (= max(x,0))\n", + "e =softsign(e1) # x/(1+|x|)\n", + "\n", + "# softmaxes\n", + "e = softmax(e1)\n", + "e = log_softmax(e1, restrict=[]) # restrict is a set of indices. \n", + " # if not empty, only entries in restrict are part \n", + " # of softmax computation, others get 0.\n", + "\n", + "\n", + "e = sum_cols(e1)\n", + "\n", + "\n", + "# Picking values from vector expressions\n", + "e = pick(e1, k) # k is unsigned integer, e1 is vector. return e1[k]\n", + "e = e1[k] # same\n", + "\n", + "e = pickrange(e1, k, v) # like python's e1[k:v] for lists. e1 is an Expression, k,v integers.\n", + "e = e1[k:v] # same\n", + "\n", + "e = pickneglogsoftmax(e1, k) # k is unsigned integer. equiv to: (pick(-log(softmax(e1)), k))\n", + " \n", + "\n", + "# Neural net stuff\n", + "noise(e1, stddev) # add a noise to each element from a gausian with standard-dev = stddev\n", + "dropout(e1, p) # apply dropout with probability p \n", + "\n", + "# functions over lists of expressions\n", + "e = esum([e1, e2, ...]) # sum\n", + "e = average([e1, e2, ...]) # average\n", + "e = concatenate_cols([e1, e2, ...]) # e1, e2,.. are column vectors. return a matrix. (sim to np.hstack([e1,e2,...])\n", + "e = concatenate([e1, e2, ...]) # concatenate\n", + "\n", + "e = affine_transform([e0,e1,e2, ...]) # e = e0 + ((e1*e2) + (e3*e4) ...) \n", + "\n", + "## Loss functions\n", + "e = squared_distance(e1, e2)\n", + "e = l1_distance(e1, e2)\n", + "e = huber_distance(e1, e2, c=1.345)\n", + "\n", + "# e1 must be a scalar that is a value between 0 and 1\n", + "# e2 (ty) must be a scalar that is a value between 0 and 1\n", + "# e = ty * log(e1) + (1 - ty) * log(e1)\n", + "e = binary_log_loss(e1, e2)\n", + "\n", + "# e1 is row vector or scalar\n", + "# e2 is row vector or scalar\n", + "# m is number\n", + "# e = max(0, m - (e1 - e2))\n", + "e = pairwise_rank_loss(e1, e2, m=1.0) \n", + "\n", + "# Convolutions TODO\n", + "e = conv1d_narrow(e1, e2) #\n", + "e = conv1d_wide(e1, e2) #\n", + "e = kmax_pooling(e1, k) # kmax-pooling operation (Kalchbrenner et al 2014)\n", + "e = kmh_ngram(e1, k) # \n", + "e = fold_rows(e1, nrows=2) #\n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Recipe" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "added\n", + "[1, 2, 3] 1\n", + "3.28097844124\n", + "[3, 2, 4] 2\n", + "1.66672432423\n", + "0\n" + ] + } + ], + "source": [ + "from pycnn import *\n", + "# create model\n", + "m = Model()\n", + "# add parameters to model\n", + "m.add_parameters(\"W\", (10,30))\n", + "m.add_parameters(\"b\", 10)\n", + "m.add_lookup_parameters(\"lookup\", (500, 10))\n", + "print \"added\"\n", + "\n", + "# create trainer \n", + "trainer = SimpleSGDTrainer(m)\n", + "\n", + "# function for graph creation\n", + "def create_network_return_loss(model, inputs, expected_output):\n", + " \"\"\"\n", + " inputs is a list of numbers\n", + " \"\"\"\n", + " renew_cg()\n", + " W = parameter(model[\"W\"])\n", + " b = parameter(model[\"b\"])\n", + " lookup = model[\"lookup\"]\n", + " emb_vectors = [lookup[i] for i in inputs]\n", + " net_input = concatenate(emb_vectors)\n", + " net_output = softmax( (W*net_input) + b)\n", + " loss = -log(pick(net_output, expected_output))\n", + " return loss\n", + "\n", + "# function for prediction\n", + "def create_network_return_best(model, inputs):\n", + " \"\"\"\n", + " inputs is a list of numbers\n", + " \"\"\"\n", + " renew_cg()\n", + " W = parameter(model[\"W\"])\n", + " b = parameter(model[\"b\"])\n", + " lookup = model[\"lookup\"]\n", + " emb_vectors = [lookup[i] for i in inputs]\n", + " net_input = concatenate(emb_vectors)\n", + " net_output = softmax( (W*net_input) + b)\n", + " return np.argmax(net_output)\n", + "\n", + "\n", + "# train network\n", + "for inp,lbl in ( ([1,2,3],1), ([3,2,4],2) ):\n", + " print inp, lbl\n", + " loss = create_network_return_loss(m, inp, lbl)\n", + " print loss.value() # need to run loss.value() for the forward prop\n", + " loss.backward()\n", + " trainer.update()\n", + "\n", + "print create_network_return_best(m, [1,2,3])\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/pyexamples/tutorials/tutorial-1-xor.ipynb b/pyexamples/tutorials/tutorial-1-xor.ipynb new file mode 100644 index 000000000..904e28657 --- /dev/null +++ b/pyexamples/tutorials/tutorial-1-xor.ipynb @@ -0,0 +1,885 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# we assume that we have the pycnn module in your path.\n", + "# we also assume that LD_LIBRARY_PATH includes a pointer to where libcnn_shared.so is.\n", + "from pycnn import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Working with the pyCNN package\n", + "\n", + "The pyCNN package is intended for neural-network processing on the CPU, and is particularly suited for NLP applications. It is a python-wrapper for the CNN package written by Chris Dyer.\n", + "\n", + "There are two modes of operation:\n", + "\n", + "* __Static networks__, in which a network is built and then being fed with different inputs/outputs. Most NN packages work this way.\n", + "* __Dynamic networks__, in which a new network is built for each training example (sharing parameters with the networks of other trianing examples). This approach is what makes pyCNN unique, and where most of it power comes from.\n", + "\n", + "We will describe both of these modes." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Package Fundementals\n", + "\n", + "The main piece of pyCNN is the `ComputationGraph`, which is what essentially defined a neural network.\n", + "The `ComputationGraph` is composed of expressions, which relate to the inputs and outputs of the network,\n", + "as well as the `Parameters` of the network. The parameters are the things in the network that are optimized over time, and all of the parameters sit inside a `Model`. There are `trainers` (for example `SimpleSGDTrainer`) that are in charge of setting the parameter values.\n", + "\n", + "We will not be using the `ComputationGraph` directly, but it is there in the background, as a singleton object.\n", + "When `pycnn` is imported, a new `ComputationGraph` is created. We can then reset the computation graph to a new state\n", + "by calling `renew_cg()`.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Static Networks\n", + "\n", + "The life-cycle of a pyCNN program is:\n", + "1. Create a `Model`, and populate it with `Parameters`.\n", + "2. Renew the computation graph, and create `Expression` representing the network.\n", + " (the network will include the `Expression`s for the `Parameters` defined in the model)\n", + "3. Optimize the model for the objective of the network.\n", + "\n", + "As an example, consider a model for solving the \"xor\" problem. The network has two inputs, which can be 0 or 1, and a single output which should be the xor of the two inputs.\n", + "We will model this as a multi-layer perceptron with a single hidden node.\n", + "\n", + "Let $x = x_1, x_2$ be our input. We will have a hidden-layer of 8 nodes, and an output layer of a single node. The activation on the hidden layer will be a $tanh$. Our network will then be:\n", + "\n", + "$\\sigma(V(tanh(Wx+b)))$\n", + "\n", + "Where $W$ is a $8 \\times 2$ matrix, and $V$ is an $8 \\times 1$ matrix, and $b$ is an 8-dim vector.\n", + "\n", + "We want the output to be either 0 or 1, so we take the output layer to be the logistic-sigmoid function, $\\sigma(x)$, that takes values between $-\\infty$ and $+\\infty$ and returns numbers in $[0,1]$.\n", + "\n", + "We will begin by defining the model and the computation graph.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# create a model and add the parameters.\n", + "m = Model()\n", + "m.add_parameters(\"W\", (8,2))\n", + "m.add_parameters(\"V\", (1,8))\n", + "m.add_parameters(\"b\", (8))\n", + "\n", + "renew_cg() # new computation graph. not strictly needed here, but good practice.\n", + "\n", + "# associate the parameters with cg Expressions\n", + "W = parameter(m[\"W\"])\n", + "V = parameter(m[\"V\"])\n", + "b = parameter(m[\"b\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[-0.391936719417572,\n", + " 0.4916459918022156,\n", + " -0.471852570772171,\n", + " 0.8333062529563904,\n", + " -0.6168352961540222,\n", + " -0.2860015630722046,\n", + " 0.13444989919662476,\n", + " -0.7587275505065918]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#b[1:-1].value()\n", + "b.value()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The first block creates a model and populates it with parameters.\n", + "The second block creates a computation graph and adds the parameters to it, transforming them into `Expression`s.\n", + "The need to distinguish model parameters from \"expressions\" will become clearer later.\n", + "\n", + "We now make use of the W and V expressions, in order to created the complete expression for the network." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "x = vecInput(2) # an input vector of size 2. Also an expression.\n", + "output = logistic(V*(tanh((W*x)+b)))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.46759992837905884" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# we can now query our network\n", + "x.set([0,0])\n", + "output.value()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# we want to be able to define a loss, so we need an input expression to work against.\n", + "y = scalarInput(0) # this will hold the correct answer\n", + "loss = binary_log_loss(output, y)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-0.510900914669\n", + "0.916177868843\n" + ] + } + ], + "source": [ + "x.set([1,0])\n", + "y.set(0)\n", + "print loss.value()\n", + "\n", + "y.set(1)\n", + "print loss.value()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Training\n", + "We now want to set the parameters weights such that the loss is minimized. \n", + "\n", + "For this, we will use a trainer object. A trainer is constructed with respect to the parameters of a given model." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "trainer = SimpleSGDTrainer(m)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To use the trainer, we need to:\n", + "* **call the `forward_scalar`** method of `ComputationGraph`. This will run a forward pass through the network, calculating all the intermediate values until the last one (`loss`, in our case), and then convert the value to a scalar. (The final output of our network **must** be a single scalar value. However, if we do not care about the value, we can just use `cg.forward()` instead of `cg.forward_sclar()`.\n", + "* **call the `backward`** method of `ComputationGraph`. This will run a backward pass from the last node, calculating the gradients with respect to minimizing the last expression (in our case we want to minimize the loss). The gradients are stored in the model, and we can now let the `trainer` take care of the optimization step.\n", + "* **call `trainer.update()`** to optimize the values with respect to the latest gradients." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "the loss before step is: 0.237541377544\n", + "the loss after step is: 0.215936839581\n" + ] + } + ], + "source": [ + "x.set([1,0])\n", + "y.set(1)\n", + "loss_value = loss.value() # this performs a forward through the network.\n", + "print \"the loss before step is:\",loss_value\n", + "\n", + "# now do an optimization step\n", + "loss.backward() # compute the gradients\n", + "trainer.update()\n", + "\n", + "# see how it affected the loss:\n", + "loss_value = loss.value(recalculate=True) # recalucate=True means \"don't use precomputed value\"\n", + "print \"the loss after step is:\",loss_value\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The optimization step indeed made the loss decrease. We now need to run this in a loop.\n", + "To this end, we will create a `training set`, and iterate over it.\n", + "\n", + "For the xor problem, the training instances are easy to create." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def create_xor_instances(num_rounds=2000):\n", + " questions = []\n", + " answers = []\n", + " for round in xrange(num_rounds):\n", + " for x1 in 0,1:\n", + " for x2 in 0,1:\n", + " answer = 0 if x1==x2 else 1\n", + " questions.append((x1,x2))\n", + " answers.append(answer)\n", + " return questions, answers \n", + "\n", + "questions, answers = create_xor_instances()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now feed each question / answer pair to the network, and try to minimize the loss.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "average loss is: -0.0736760540307\n", + "average loss is: -0.0431773296744\n", + "average loss is: -0.0329923908412\n", + "average loss is: -0.0265793037787\n", + "average loss is: -0.0219315118343\n", + "average loss is: -0.0185768032136\n", + "average loss is: -0.0160888710139\n", + "average loss is: -0.0141828030394\n", + "average loss is: -0.0126798275403\n", + "average loss is: -0.0114656574577\n", + "average loss is: -0.0104649186862\n", + "average loss is: -0.00962608709466\n", + "average loss is: -0.0089128920701\n", + "average loss is: -0.00829910863324\n", + "average loss is: -0.00776528354424\n", + "average loss is: -0.00729674054834\n", + "average loss is: -0.00688219008419\n", + "average loss is: -0.00651278639471\n", + "average loss is: -0.00618152223086\n", + "average loss is: -0.00588276661444\n", + "average loss is: -0.00561194644775\n", + "average loss is: -0.00536530932623\n", + "average loss is: -0.00513974289653\n", + "average loss is: -0.00493264887171\n", + "average loss is: -0.00474184197951\n", + "average loss is: -0.00456546585523\n", + "average loss is: -0.00440193738926\n", + "average loss is: -0.00424990062352\n", + "average loss is: -0.00410817924357\n", + "average loss is: -0.00397575346412\n", + "average loss is: -0.00385173368884\n", + "average loss is: -0.0037353409997\n", + "average loss is: -0.00362589035656\n", + "average loss is: -0.00352277747492\n", + "average loss is: -0.0034254647359\n", + "average loss is: -0.00333347332166\n", + "average loss is: -0.0032463763395\n", + "average loss is: -0.00316379235218\n", + "average loss is: -0.00308537749233\n", + "average loss is: -0.00301082218514\n", + "average loss is: -0.00293984767561\n", + "average loss is: -0.00287220093921\n", + "average loss is: -0.0028076520279\n", + "average loss is: -0.00274599160401\n", + "average loss is: -0.00268702900767\n", + "average loss is: -0.00263059020554\n", + "average loss is: -0.00257651594453\n", + "average loss is: -0.00252466075627\n", + "average loss is: -0.00247489001897\n", + "average loss is: -0.00242707972354\n", + "average loss is: -0.00238111569624\n", + "average loss is: -0.00233689236173\n", + "average loss is: -0.00229431213741\n", + "average loss is: -0.00225328474719\n", + "average loss is: -0.00221372625837\n", + "average loss is: -0.00217555890941\n", + "average loss is: -0.00213871019562\n", + "average loss is: -0.00210311289732\n", + "average loss is: -0.00206870423375\n", + "average loss is: -0.00203542506477\n", + "average loss is: -0.00200322053556\n", + "average loss is: -0.00197203894936\n", + "average loss is: -0.00194183212189\n", + "average loss is: -0.00191255454974\n", + "average loss is: -0.00188416398736\n", + "average loss is: -0.00185662054628\n", + "average loss is: -0.00182988676211\n", + "average loss is: -0.00180392725441\n", + "average loss is: -0.00177870851088\n", + "average loss is: -0.00175419908922\n", + "average loss is: -0.00173036946333\n", + "average loss is: -0.00170719160213\n", + "average loss is: -0.00168463913631\n", + "average loss is: -0.00166268690267\n", + "average loss is: -0.0016413110688\n", + "average loss is: -0.00162048917527\n", + "average loss is: -0.00160019980025\n", + "average loss is: -0.00158042266556\n", + "average loss is: -0.0015611385186\n", + "average loss is: -0.00154232902762\n" + ] + } + ], + "source": [ + "total_loss = 0\n", + "seen_instances = 0\n", + "for question, answer in zip(questions, answers):\n", + " x.set(question)\n", + " y.set(answer)\n", + " seen_instances += 1\n", + " total_loss += loss.value()\n", + " loss.backward()\n", + " trainer.update()\n", + " if (seen_instances > 1 and seen_instances % 100 == 0):\n", + " print \"average loss is:\",total_loss / seen_instances\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "our network is now trained, let's verify that it indeed learned the xor function:" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0,1 0.998457551003\n", + "1,0 0.998303294182\n", + "0,0 0.00132494198624\n", + "1,1 0.00213180552237\n" + ] + } + ], + "source": [ + "x.set([0,1])\n", + "print \"0,1\",output.value()\n", + "\n", + "x.set([1,0])\n", + "print \"1,0\",output.value()\n", + "\n", + "x.set([0,0])\n", + "print \"0,0\",output.value()\n", + "\n", + "x.set([1,1])\n", + "print \"1,1\",output.value()\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In case we are curious about the parameter values, we can query them:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1.90704894, 1.75941706],\n", + " [-0.51026875, -0.73472238],\n", + " [ 1.00825202, 0.86155057],\n", + " [-1.68297076, -1.80956674],\n", + " [-1.2174753 , -1.15852094],\n", + " [-3.23514462, 2.84460068],\n", + " [ 1.63482118, 1.50156498],\n", + " [ 2.60078287, -3.01065731]])" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "W.value()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 2.06817722, 0.85734618, 0.69402838, 3.06676149, -1.10298848,\n", + " 5.04940414, 1.77656221, 4.74531031]])" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "V.value()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[-0.5166335701942444,\n", + " 0.8676984906196594,\n", + " 0.008914745412766933,\n", + " 2.637610912322998,\n", + " 0.019709745422005653,\n", + " -1.4869117736816406,\n", + " -0.33558133244514465,\n", + " -1.3341320753097534]" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "b.value()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## To summarize\n", + "Here is a complete program:" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "average loss is: 0.000710777640343\n", + "average loss is: 0.00538051903248\n", + "average loss is: 0.008753751417\n", + "average loss is: 0.00962603349239\n", + "average loss is: 0.00916970175505\n", + "average loss is: 0.00848576014241\n", + "average loss is: 0.00780005061201\n", + "average loss is: 0.0071754240524\n", + "average loss is: 0.0066243140565\n", + "average loss is: 0.00614239533804\n", + "average loss is: 0.00572097523307\n", + "average loss is: 0.00535109124146\n", + "average loss is: 0.00502474307441\n", + "average loss is: 0.00473515995978\n", + "average loss is: 0.00447674103267\n", + "average loss is: 0.00424488715769\n", + "average loss is: 0.00403580133858\n", + "average loss is: 0.00384634935659\n", + "average loss is: 0.00367392660486\n", + "average loss is: 0.00351635961281\n", + "average loss is: 0.00337182009371\n", + "average loss is: 0.00323876434577\n", + "average loss is: 0.00311587982183\n", + "average loss is: 0.00300204546501\n", + "average loss is: 0.0028963002421\n", + "average loss is: 0.00279780962182\n", + "average loss is: 0.00270585036854\n", + "average loss is: 0.00261979493978\n", + "average loss is: 0.00253909190298\n", + "average loss is: 0.00246325349792\n", + "average loss is: 0.00239185206555\n", + "average loss is: 0.0023245080647\n", + "average loss is: 0.00226088441619\n", + "average loss is: 0.00220067988526\n", + "average loss is: 0.00214362350718\n", + "average loss is: 0.00208947365366\n", + "average loss is: 0.0020380129623\n", + "average loss is: 0.00198904496207\n", + "average loss is: 0.00194239226152\n", + "average loss is: 0.00189789384627\n", + "average loss is: 0.00185540357037\n", + "average loss is: 0.00181478771642\n", + "average loss is: 0.00177592387499\n", + "average loss is: 0.00173870052693\n", + "average loss is: 0.0017030151133\n", + "average loss is: 0.00166877407409\n", + "average loss is: 0.00163589137076\n", + "average loss is: 0.00160428755732\n", + "average loss is: 0.00157388916344\n", + "average loss is: 0.00154462760519\n", + "average loss is: 0.00151644010562\n", + "average loss is: 0.00148926836801\n", + "average loss is: 0.00146305795107\n", + "average loss is: 0.00143775891996\n", + "average loss is: 0.00141332406345\n", + "average loss is: 0.00138970975105\n", + "average loss is: 0.00136687505267\n", + "average loss is: 0.00134478173209\n", + "average loss is: 0.00132339411352\n", + "average loss is: 0.00130267874258\n", + "average loss is: 0.00128260426256\n", + "average loss is: 0.00126314118082\n", + "average loss is: 0.0012442619527\n", + "average loss is: 0.00122594058595\n", + "average loss is: 0.00120815254805\n", + "average loss is: 0.00119087479342\n", + "average loss is: 0.00117408560255\n", + "average loss is: 0.00115776436539\n", + "average loss is: 0.00114189174765\n", + "average loss is: 0.00112644939362\n", + "average loss is: 0.00111142013773\n", + "average loss is: 0.00109678746174\n", + "average loss is: 0.00108253585497\n", + "average loss is: 0.0010686503392\n", + "average loss is: 0.00105511702904\n", + "average loss is: 0.00104192272314\n", + "average loss is: 0.00102905462018\n", + "average loss is: 0.00101650077129\n", + "average loss is: 0.0010042497123\n", + "average loss is: 0.000992290693015\n" + ] + } + ], + "source": [ + "# define the parameters\n", + "m = Model()\n", + "m.add_parameters(\"W\", (8,2))\n", + "m.add_parameters(\"V\", (1,8))\n", + "m.add_parameters(\"b\", (8))\n", + "\n", + "# renew the computation graph\n", + "renew_cg()\n", + "\n", + "# add the parameters to the graph\n", + "W = parameter(m[\"W\"])\n", + "V = parameter(m[\"V\"])\n", + "b = parameter(m[\"b\"])\n", + "\n", + "# create the network\n", + "x = vecInput(2) # an input vector of size 2.\n", + "output = logistic(V*(tanh((W*x)+b)))\n", + "# define the loss with respect to an output y.\n", + "y = scalarInput(0) # this will hold the correct answer\n", + "loss = binary_log_loss(output, y)\n", + "\n", + "# create training instances\n", + "def create_xor_instances(num_rounds=2000):\n", + " questions = []\n", + " answers = []\n", + " for round in xrange(num_rounds):\n", + " for x1 in 0,1:\n", + " for x2 in 0,1:\n", + " answer = 0 if x1==x2 else 1\n", + " questions.append((x1,x2))\n", + " answers.append(answer)\n", + " return questions, answers \n", + "\n", + "questions, answers = create_xor_instances()\n", + "\n", + "# train the network\n", + "trainer = SimpleSGDTrainer(m)\n", + "\n", + "total_loss = 0\n", + "seen_instances = 0\n", + "for question, answer in zip(questions, answers):\n", + " x.set(question)\n", + " y.set(answer)\n", + " seen_instances += 1\n", + " total_loss += loss.value()\n", + " loss.backward()\n", + " trainer.update()\n", + " if (seen_instances > 1 and seen_instances % 100 == 0):\n", + " print \"average loss is:\",total_loss / seen_instances\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Dynamic Networks\n", + "\n", + "Dynamic networks are very similar to static ones, but instead of creating the network once and then calling \"set\" in each training example to change the inputs, we just create a new network for each training example.\n", + "\n", + "We present an example below. While the value of this may not be clear in the `xor` example, the dynamic approach\n", + "is very convenient for networks for which the structure is not fixed, such as recurrent or recursive networks." + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "average loss is: -0.0434117043018\n", + "average loss is: -0.030382682085\n", + "average loss is: -0.0260350414117\n", + "average loss is: -0.0245157124847\n", + "average loss is: -0.0215704288483\n", + "average loss is: -0.0178998744239\n", + "average loss is: -0.0148817687695\n", + "average loss is: -0.0126448741369\n", + "average loss is: -0.0109926707587\n", + "average loss is: -0.00973503550515\n", + "average loss is: -0.00874631876634\n", + "average loss is: -0.00794731451975\n", + "average loss is: -0.00728702781435\n", + "average loss is: -0.00673133983875\n", + "average loss is: -0.00625665952327\n", + "average loss is: -0.00584609933663\n", + "average loss is: -0.00548723993439\n", + "average loss is: -0.00517074972184\n", + "average loss is: -0.00488942034788\n", + "average loss is: -0.00463762690453\n", + "average loss is: -0.00441089029069\n", + "average loss is: -0.00420562038346\n", + "average loss is: -0.00401886963711\n", + "average loss is: -0.00384821915689\n", + "average loss is: -0.00369165667389\n", + "average loss is: -0.00354749959141\n", + "average loss is: -0.00341432033779\n", + "average loss is: -0.00329090173223\n", + "average loss is: -0.00317620157505\n", + "average loss is: -0.00306932546338\n", + "average loss is: -0.00296949436062\n", + "average loss is: -0.00287602832846\n", + "average loss is: -0.00278833741689\n", + "average loss is: -0.00270589900306\n", + "average loss is: -0.00262825351767\n", + "average loss is: -0.00255499271922\n", + "average loss is: -0.00248575425367\n", + "average loss is: -0.00242021449964\n", + "average loss is: -0.00235808361865\n", + "average loss is: -0.00229910133278\n", + "average loss is: -0.00224303434427\n", + "average loss is: -0.00218967100073\n", + "average loss is: -0.00213881912322\n", + "average loss is: -0.00209030493051\n", + "average loss is: -0.00204397013002\n", + "average loss is: -0.00199967051132\n", + "average loss is: -0.00195727446959\n", + "average loss is: -0.00191666179603\n", + "average loss is: -0.00187772191776\n", + "average loss is: -0.0018403530397\n", + "average loss is: -0.00180446159583\n", + "average loss is: -0.0017699615956\n", + "average loss is: -0.00173677365427\n", + "average loss is: -0.00170482409213\n", + "average loss is: -0.00167404436261\n", + "average loss is: -0.00164437123308\n", + "average loss is: -0.00161574586736\n", + "average loss is: -0.00158811347559\n", + "average loss is: -0.0015614229679\n", + "average loss is: -0.00153562722582\n", + "average loss is: -0.00151068181977\n", + "average loss is: -0.00148654521539\n", + "average loss is: -0.00146317849714\n", + "average loss is: -0.00144054521572\n", + "average loss is: -0.00141861138174\n", + "average loss is: -0.0013973448718\n", + "average loss is: -0.00137671559425\n", + "average loss is: -0.00135669496189\n", + "average loss is: -0.00133725664821\n", + "average loss is: -0.00131837574296\n", + "average loss is: -0.00130002835688\n", + "average loss is: -0.00128219219668\n", + "average loss is: -0.00126484589098\n", + "average loss is: -0.00124796962008\n", + "average loss is: -0.00123154441345\n", + "average loss is: -0.00121555239431\n", + "average loss is: -0.00119997651854\n", + "average loss is: -0.00118480070451\n", + "average loss is: -0.00117000979887\n", + "average loss is: -0.00115558931208\n" + ] + } + ], + "source": [ + "# create training instances, this is as before\n", + "def create_xor_instances(num_rounds=2000):\n", + " questions = []\n", + " answers = []\n", + " for round in xrange(num_rounds):\n", + " for x1 in 0,1:\n", + " for x2 in 0,1:\n", + " answer = 0 if x1==x2 else 1\n", + " questions.append((x1,x2))\n", + " answers.append(answer)\n", + " return questions, answers \n", + "\n", + "questions, answers = create_xor_instances()\n", + "\n", + "# create a network for the xor problem given input and output\n", + "def create_xor_network(model, inputs, expected_answer):\n", + " renew_cg()\n", + " W = parameter(model[\"W\"])\n", + " V = parameter(model[\"V\"])\n", + " b = parameter(model[\"b\"])\n", + " x = vecInput(len(inputs))\n", + " x.set(inputs)\n", + " y = scalarInput(expected_answer)\n", + " output = logistic(V*(tanh((W*x)+b)))\n", + " loss = binary_log_loss(output, y)\n", + " return loss\n", + "\n", + "m = Model()\n", + "m.add_parameters(\"W\", (8,2))\n", + "m.add_parameters(\"V\", (1,8))\n", + "m.add_parameters(\"b\", (8))\n", + "trainer = SimpleSGDTrainer(m)\n", + "\n", + "seen_instances = 0\n", + "total_loss = 0\n", + "for question, answer in zip(questions, answers):\n", + " loss = create_xor_network(m, question, answer)\n", + " seen_instances += 1\n", + " total_loss += loss.value()\n", + " loss.backward()\n", + " trainer.update()\n", + " if (seen_instances > 1 and seen_instances % 100 == 0):\n", + " print \"average loss is:\",total_loss / seen_instances\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From 6b987432bfdf5b3b2e1c3237d2745c8f4441a641 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Mon, 21 Sep 2015 13:15:37 +0300 Subject: [PATCH 246/965] rnn example --- pyexamples/tutorials/RNNs.ipynb | 740 ++++++++++++++++++++++++++++++++ 1 file changed, 740 insertions(+) create mode 100644 pyexamples/tutorials/RNNs.ipynb diff --git a/pyexamples/tutorials/RNNs.ipynb b/pyexamples/tutorials/RNNs.ipynb new file mode 100644 index 000000000..f29f57c0c --- /dev/null +++ b/pyexamples/tutorials/RNNs.ipynb @@ -0,0 +1,740 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We want to train an LSTM model over a large vocabulary.\n", + "\n", + "We do not care so much about the perplexity / probability as much as we care about the representation itself, but we want to (pre)train it in an unsupervised way, so we will use the corpus (previous words) as our guiding principle." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# we assume that we have the pycnn module in your path.\n", + "# we also assume that LD_LIBRARY_PATH includes a pointer to where libcnn_shared.so is.\n", + "from pycnn import *" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## An LSTM/RNN overview:\n", + "\n", + "An (1-layer) RNN can be thought of as a sequence of cells, $h_1,...,h_k$, where $h_i$ indicates the time dimenstion. \n", + "\n", + "Each cell $h_i$ has an input $x_i$ and an output $r_i$. In addition to $x_i$, cell $h_i$ receives as input also $r_{i-1}$.\n", + "\n", + "In a deep (multi-layer) RNN, we don't have a sequence, but a grid. That is we have several layers of sequences:\n", + "\n", + "* $h_1^3,...,h_k^3$ \n", + "* $h_1^2,...,h_k^2$ \n", + "* $h_1^1,...h_k^1$, \n", + "\n", + "Let $r_i^j$ be the output of cell $h_i^j$. Then:\n", + "\n", + "The input to $h_i^1$ is $x_i$ and $r_{i-1}^1$.\n", + "\n", + "The input to $h_i^2$ is $r_i^1$ and $r_{i-1}^2$,\n", + "and so on.\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The LSTM (RNN) Interface\n", + "\n", + "RNN / LSTM / GRU follow the same interface. We have a \"builder\" which is in charge of creating definining the parameters for the sequence." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "model = Model()\n", + "NUM_LAYERS=2\n", + "INPUT_DIM=50\n", + "HIDDEN_DIM=10\n", + "builder = LSTMBuilder(NUM_LAYERS, INPUT_DIM, HIDDEN_DIM, model)\n", + "# or:\n", + "# builder = SimpleRNNBuilder(NUM_LAYERS, INPUT_DIM, HIDDEN_DIM, model)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that when we create the builder, it adds the internal RNN parameters to the `model`.\n", + "We do not need to care about them, but they will be optimized together with the rest of the network's parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s0 = builder.initial_state()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "x1 = vecInput(INPUT_DIM)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "s1=s0.add_input(x1)\n", + "y1 = s1.output()\n", + "# here, we add x1 to the RNN, and the output we get from the top is y (a HIDEN_DIM-dim vector)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(10,)" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y1.npvalue().shape" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s2=s1.add_input(x1) # we can add another input\n", + "y2=s2.output()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If our LSTM/RNN was one layer deep, y2 would be equal to the hidden state. However, since it is 2 layers deep, y2 is only the hidden state (= output) of the last layer." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we were to want access to the all the hidden state (the output of both the first and the last layers), we could use the `.h()` method, which returns a list of expressions, one for each layer:" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(exprssion 54/0, exprssion 66/0)\n" + ] + } + ], + "source": [ + "print s2.h()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The same interface that we saw until now for the LSTM, holds also for the Simple RNN:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "all layers: (exprssion 32/0, exprssion 42/0)\n" + ] + } + ], + "source": [ + "# create a simple rnn builder\n", + "rnnbuilder=SimpleRNNBuilder(NUM_LAYERS, INPUT_DIM, HIDDEN_DIM, model)\n", + "\n", + "# initialize a new graph, and a new sequence\n", + "rs0 = rnnbuilder.initial_state()\n", + "\n", + "# add inputs\n", + "rs1 = rs0.add_input(x1)\n", + "ry1 = rs1.output()\n", + "print \"all layers:\", s1.h()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(exprssion 28/0, exprssion 38/0, exprssion 32/0, exprssion 42/0)\n" + ] + } + ], + "source": [ + "print s1.s()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To summarize, when calling `.add_input(x)` on an `RNNState` what happens is that the state creates a new RNN/LSTM column, passing it: \n", + "1. the state of the current RNN column\n", + "2. the input `x`\n", + "\n", + "The state is then returned, and we can call it's `output()` method to get the output `y`, which is the output at the top of the column. We can access the outputs of all the layers (not only the last one) using the `.h()` method of the state.\n", + "\n", + "**`.s()`** The internal state of the RNN may be more involved than just the outputs $h$. This is the case for the LSTM, that keeps an extra \"memory\" cell, that is used when calculating $h$, and which is also passed to the next column. To access the entire hidden state, we use the `.s()` method. \n", + "\n", + "The output of `.s()` differs by the type of RNN being used. For the simple-RNN, it is the same as `.h()`. For the LSTM, it is more involved.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RNN h: (exprssion 74/0, exprssion 76/0)\n", + "RNN s: (exprssion 74/0, exprssion 76/0)\n", + "LSTM h: (exprssion 32/0, exprssion 42/0)\n", + "LSTM s: (exprssion 28/0, exprssion 38/0, exprssion 32/0, exprssion 42/0)\n" + ] + } + ], + "source": [ + "rnn_h = rs1.h()\n", + "rnn_s = rs1.s()\n", + "print \"RNN h:\", rnn_h\n", + "print \"RNN s:\", rnn_s\n", + "\n", + "\n", + "lstm_h = s1.h()\n", + "lstm_s = s1.s()\n", + "print \"LSTM h:\", lstm_h\n", + "print \"LSTM s:\", lstm_s\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see, the LSTM has two extra state expressions (one for each hidden layer) before the outputs h." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extra options in the RNN/LSTM interface\n", + "\n", + "**Stack LSTM** The RNN's are shaped as a stack: we can remove the top and continue from the previous state.\n", + "This is done either by remembering the previous state and continuing it with a new `.add_input()`, or using\n", + "we can access the previous state of a given state using the `.prev()` method of state.\n", + "\n", + "**Initializing a new sequence with a given state** When we call `builder.initial_state()`, we are assuming the state has random /0 initialization. If we want, we can specify a list of expressions that will serve as the initial state. The expected format is the same as the results of a call to `.final_s()`. TODO: this is not supported yet." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "s2=s1.add_input(x1)\n", + "s3=s2.add_input(x1)\n", + "s4=s3.add_input(x1)\n", + "\n", + "# let's continue s3 with a new input.\n", + "s5=s3.add_input(x1)\n", + "\n", + "# we now have two different sequences:\n", + "# s0,s1,s2,s3,s4\n", + "# s0,s1,s2,s3,s5\n", + "# the two sequences share parameters.\n", + "\n", + "assert(s5.prev() == s3)\n", + "assert(s4.prev() == s3)\n", + "\n", + "s6=s3.prev().add_input(x1)\n", + "# we now have an additional sequence:\n", + "# s0,s1,s2,s6" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(exprssion 184/0, exprssion 196/0)" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s6.h()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(exprssion 180/0, exprssion 192/0, exprssion 184/0, exprssion 196/0)" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "s6.s()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Charecter-level LSTM\n", + "\n", + "Now that we know the basics of RNNs, let's build a character-level LSTM language-model.\n", + "We have a sequence LSTM that, at each step, gets as input a character, and needs to predict the next character." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import random\n", + "from collections import defaultdict\n", + "from itertools import count\n", + "import sys\n", + "\n", + "LAYERS = 2\n", + "INPUT_DIM = 50 \n", + "HIDDEN_DIM = 50 \n", + "\n", + "characters = list(\"abcdefghijklmnopqrstuvwxyz \")\n", + "characters.append(\"\")\n", + "\n", + "int2char = list(characters)\n", + "char2int = {c:i for i,c in enumerate(characters)}\n", + "\n", + "VOCAB_SIZE = len(characters)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "model = Model()\n", + "\n", + "\n", + "srnn = SimpleRNNBuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, model)\n", + "lstm = LSTMBuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, model)\n", + "\n", + "model.add_lookup_parameters(\"lookup\", (VOCAB_SIZE, INPUT_DIM))\n", + "model.add_parameters(\"R\", (VOCAB_SIZE, HIDDEN_DIM))\n", + "model.add_parameters(\"bias\", (VOCAB_SIZE))\n", + "\n", + "# return compute loss of RNN for one sentence\n", + "def do_one_sentence(rnn, sentence):\n", + " # setup the sentence\n", + " renew_cg()\n", + " s0 = rnn.initial_state()\n", + " \n", + " \n", + " R = parameter(model[\"R\"])\n", + " bias = parameter(model[\"bias\"])\n", + " lookup = model[\"lookup\"]\n", + " sentence = [\"\"] + list(sentence) + [\"\"]\n", + " sentence = [char2int[c] for c in sentence]\n", + " s = s0\n", + " loss = []\n", + " for char,next_char in zip(sentence,sentence[1:]):\n", + " s = s.add_input(lookup[char])\n", + " probs = softmax(R*s.output() + bias)\n", + " loss.append( -log(pick(probs,next_char)) )\n", + " loss = esum(loss)\n", + " return loss\n", + " \n", + "\n", + "# generate from model:\n", + "def generate(rnn):\n", + " def sample(probs):\n", + " rnd = random.random()\n", + " for i,p in enumerate(probs):\n", + " rnd -= p\n", + " if rnd <= 0: break\n", + " return i\n", + " \n", + " # setup the sentence\n", + " renew_cg()\n", + " s0 = rnn.initial_state()\n", + " \n", + " R = parameter(model[\"R\"])\n", + " bias = parameter(model[\"bias\"])\n", + " lookup = model[\"lookup\"]\n", + " \n", + " s = s0.add_input(lookup[char2int[\"\"]])\n", + " out=[]\n", + " while True:\n", + " probs = softmax(R*s.output() + bias)\n", + " probs = probs.vec_value()\n", + " next_char = sample(probs)\n", + " out.append(int2char[next_char])\n", + " if out[-1] == \"\": break\n", + " s = s.add_input(lookup[next_char])\n", + " return \"\".join(out[:-1]) # strip the \n", + " \n", + "\n", + "# train, and generate every 5 samples\n", + "def train(rnn, sentence):\n", + " trainer = SimpleSGDTrainer(model)\n", + " for i in xrange(200):\n", + " loss = do_one_sentence(rnn, sentence)\n", + " loss_value = loss.value()\n", + " loss.backward()\n", + " trainer.update()\n", + " if i % 5 == 0: \n", + " print loss_value,\n", + " print generate(rnn)\n", + " " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Notice that:\n", + "1. We pass the same rnn-builder to `do_one_sentence` over and over again.\n", + "We must re-use the same rnn-builder, as this is where the shared parameters are kept.\n", + "2. We `renew_cg()` before each sentence -- because we want to have a new graph (new network) for this sentence.\n", + "The parameters will be shared through the model and the shared rnn-builder." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "159.679000854 lmt nx ygtflbjxpoq lwy f\n", + "92.4982833862 afjvta ltvopebstkfdo rlo yqnopb ifpqbzi\n", + "61.3959312439 aavleiq po rvtzeakqyg zur\n", + "37.0580444336 vnlbclj fjo j mamlndfe dixnjhgdtof bdzhe ddvyuwa ohryltop fvek cemouaa dcg ndeilci cxgphmzthauhxzcl\n", + "19.9309463501 iwomtno iwv nwe\n", + "7.24577760696 a quicknbrown vx tuxpcy ouxr she hazy dog\n", + "2.65018558502 a quick brown fox jumped over tue lazy dog\n", + "0.954704046249 a quick brown fox jhmped over the lazy dog\n", + "0.626812160015 a quick brown fox jumped over the lazy dog\n", + "0.466860800982 a quick brown fox jumped over the lazy dog\n", + "0.37179967761 a quick brown fox jumped over the lazy dog\n", + "0.308676809072 a quick brown fox jumped over the lazy dog\n", + "0.263797819614 a quick brown fox jumped over the lazy dog\n", + "0.230166554451 a quick brown fox jumped over the lazx dog\n", + "0.204109430313 a quick brown fox jumped over the lazy dog\n", + "0.183262810111 a nuick browk fox jumped over the lazy dog\n", + "0.166249394417 a quick brown fox jumped over the lazy dog\n", + "0.152071535587 a quick brown fox jumped over whe lazy dog\n", + "0.140101358294 a quick brown fox jumped over the lazy dog\n", + "0.129877090454 a quick brown fox jumped over the lazy dog\n", + "0.121072113514 a quick brown fox jumped over the lazy dog\n", + "0.113252848387 a quick brown fox jumped over the lazy dog\n", + "0.106449194252 a quick brown fox jumped over the lazy dog\n", + "0.100415848196 a quick brown fox jumped over the lazy dog\n", + "0.09498013556 a quick brown fox jumped over the lazy dog\n", + "0.0900921970606 a quick brown fox jumped over the lazy dog\n", + "0.0856867656112 a quick brown fox jumped over the lazy dog\n", + "0.0817062109709 a quick brown fox jumped over the lazy dog\n", + "0.0780855119228 a quick brown fox jumped over the lazy dog\n", + "0.0747060477734 a quick brown fox jumped over the lazy dog\n", + "0.0716441199183 a quick brown fox jumped over the lazy dog\n", + "0.0688194260001 a quick brown fox jumped over the lazy dog\n", + "0.0662013664842 a quick brown fox jumped over the lazy dog\n", + "0.0637593045831 a quick brown fox jumped over the lazy dog\n", + "0.0614740736783 a quick brown fox jumped over the lazy dog\n", + "0.0594449453056 a quick brown fox jumped over the lazy dog\n", + "0.0574542097747 a quick brown fox jumped over the lazy dog\n", + "0.0555782169104 a quick brown fox jumped over the lazy dog\n", + "0.0538321807981 a quick brown fox jumped over the lazy dog\n", + "0.0522314347327 a quick brown fox jumped over the lazy dog\n" + ] + } + ], + "source": [ + "sentence = \"a quick brown fox jumped over the lazy dog\"\n", + "train(srnn, sentence)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "141.691223145 uvybot firnqqci \n", + "130.66217041 nud s ddco e u sqo ryastfig scoxoupa se mz jmxr v\n", + "126.464065552 uuipfaa gyoe pmftgnidnvonf uyddorehj zxbuatudorecdaneoo oepvq uox\n", + "118.422286987 s l whurp yypde beyn ex kavk x uzdlboxc tuq ac aupztide rdmfua qe e wm jxu\n", + "105.712097168 e ck ohelfl e akmfer oewe gp os\n", + "90.3664779663 gzh dofuth lxjuaz thke\n", + "77.7215118408 a eckn vv\n", + "64.3503112793 jr vrof\n", + "55.7599029541 d zcsn ver fe zezz doj dor em ed ama xuei ob\n", + "47.3434677124 gcz bbovrw vunmpjd ofg\n", + "39.2717132568 auil bkbgor ffhg tde abgea oirn ffxgz die berr tref efhe hde oei \n", + "29.5673542023 uqyk qvog tvm for oxx jtme dxgk tve laue doy qfx dzz do rh thl dze do ex uuee don frx jamm dur eohn fom pdo jhe duz qzg qwor hote l oe joy jox fmqme doch vinn tte ta luzc do\n", + "23.5196590424 \n", + "17.6167182922 k iock nogr the lzz upiek vohe ttea loa pdogw theplddoy bdor joa muuped over the lazy doger ohen ohe amzy dor\n", + "13.1281785965 b dugckk howr fo\n", + "8.73806285858 p quxpd over the laza doo\n", + "6.34239006042 a quik bron fox jumped b\n", + "4.15951299667 ca quick brown fox jumpedd over the lazy dog\n", + "2.31204366684 pa quick brown fox jumped over the lazy dog\n", + "1.6212117672 b dog\n", + "1.25511050224 a quick brown fox jumped over the laay dog\n", + "1.01962459087 a quick brown fox jumped over the lazy dog\n", + "0.856129348278 y quick brown fox jumped over the lazy dog\n", + "0.736417710781 a quick brown fox jumped over the lazy dog\n", + "0.645215630531 ua quikk brown fox jumped over the lazy dog\n", + "0.573442876339 a quick brown fox jumped over the lazy dog\n", + "0.515612900257 a quick brown fox jumped over the lazy dog\n", + "0.468045383692 a quick brown fox jumped over the lazy dog\n", + "0.428334087133 a quick brown fox jumped over the lazy dog\n", + "0.394624918699 a quick brown fox jumped over the lazy dog\n", + "0.365713119507 a quick brown fox jumped over the lazy dog\n", + "0.340574681759 a quick brown fox jumped over tee lazy dog\n", + "0.318626344204 a quick brown fox jumped over the lazy dog\n", + "0.299313008785 a quick brown fox jumped over the lazy dog\n", + "0.282055020332 aa quick brown fox jumped over the lazy dog\n", + "0.266678541899 a quick brown fox jumped over the lazy dog\n", + "0.252810955048 a quick brown fox jumped over the lazy dog\n", + "0.240284785628 a quick brown fox jumped over the lazy dog\n", + "0.228963255882 a quick brown fox jumped over the lazy dog\n", + "0.218599379063 a quick brown fox jumped over the lazy dog\n" + ] + } + ], + "source": [ + "sentence = \"a quick brown fox jumped over the lazy dog\"\n", + "train(lstm, sentence)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The model seem to learn the sentence quite well.\n", + "\n", + "Somewhat surprisingly, the Simple-RNN model learn quicker than the LSTM!\n", + "\n", + "How can that be?\n", + "\n", + "The answer is that we are cheating a bit. The sentence we are trying to learn\n", + "has each letter exactly once. This means a simple bigram model can memorize\n", + "it very well.\n", + "\n", + "Try it out with more complex sequences.\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "316.674530029 a quick brown fox jumped over the lazy dog\n", + "105.89151001 a quick brown fox jumped over the lazy dog\n", + "47.5085983276 a quick browitleh aheclazy dog\n", + "14.6825256348 thellazy dog\n", + "2.44217705727 the ere makqne mn thi ste\n", + "0.339166790247 thele pretzels are making me thirsty\n", + "0.185528486967 these pretzels are making me thirsty\n", + "0.136738568544 these mretsels are making me thirsty\n", + "0.109439112246 these pretzels are making me thirsty\n", + "0.0916935577989 these pretzels are making me thirsty\n", + "0.0791544318199 these pretzels are making me thirsty\n", + "0.0697760358453 these pretzels are making me thirsty\n", + "0.0624843500555 these pretzels are making me thirsty\n", + "0.0566432401538 these pretzels are making me thirsty\n", + "0.0518313497305 these pretzels are making me thirsty\n", + "0.0478418208659 these pretzels are making me thirsty\n", + "0.0444259755313 these pretzels are making me thirsty\n", + "0.0414918512106 these pretzels are making me thirsty\n", + "0.0389476977289 these pretzels are making me thirsty\n", + "0.0366978682578 these pretzels are making me thirsty\n", + "0.0347270295024 these pretzels are making me thirsty\n", + "0.0329472795129 these pretzels are making me thirsty\n", + "0.0313814878464 these pretzels are making me thirsty\n", + "0.0299570858479 these pretzels are making me thirsty\n", + "0.0286129526794 these pretzels are making me thirsty\n", + "0.0274254083633 these pretzels are making me thirsty\n", + "0.0263181217015 these pretzels are making me thirsty\n", + "0.0253330375999 these pretzels are making me thirsty\n", + "0.0244014579803 these pretzels are making me thirsty\n", + "0.0235347989947 these pretzels are making me thirsty\n", + "0.0227559711784 these pretzels are making me thirsty\n", + "0.0219390057027 these pretzels are making me thirsty\n", + "0.0212938319892 these pretzels are making me thirsty\n", + "0.0206219516695 these pretzels are making me thirsty\n", + "0.0200188029557 these pretzels are making me thirsty\n", + "0.0194500312209 these pretzels are making me thirsty\n", + "0.0189003441483 these pretzels are making me thirsty\n", + "0.0183964911848 these pretzels are making me thirsty\n", + "0.0178849939257 these pretzels are making me thirsty\n", + "0.0174269638956 these pretzels are making me thirsty\n" + ] + } + ], + "source": [ + "train(srnn, \"these pretzels are making me thirsty\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.10" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From 8d9b546cc315002389f03e64697fdefe2a51ffec Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Mon, 21 Sep 2015 13:20:39 +0300 Subject: [PATCH 247/965] rnn example --- pyexamples/tutorials/RNNs.ipynb | 302 +++++++++++++++----------------- 1 file changed, 142 insertions(+), 160 deletions(-) diff --git a/pyexamples/tutorials/RNNs.ipynb b/pyexamples/tutorials/RNNs.ipynb index f29f57c0c..3362ae8d5 100644 --- a/pyexamples/tutorials/RNNs.ipynb +++ b/pyexamples/tutorials/RNNs.ipynb @@ -1,17 +1,8 @@ { "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We want to train an LSTM model over a large vocabulary.\n", - "\n", - "We do not care so much about the perplexity / probability as much as we care about the representation itself, but we want to (pre)train it in an unsupervised way, so we will use the corpus (previous words) as our guiding principle." - ] - }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "metadata": { "collapsed": true }, @@ -62,7 +53,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": { "collapsed": true }, @@ -87,7 +78,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": { "collapsed": true }, @@ -98,7 +89,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": { "collapsed": false }, @@ -109,7 +100,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "metadata": { "collapsed": false }, @@ -122,7 +113,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": { "collapsed": false }, @@ -133,7 +124,7 @@ "(10,)" ] }, - "execution_count": 8, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -144,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "metadata": { "collapsed": true }, @@ -170,7 +161,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "metadata": { "collapsed": false }, @@ -196,7 +187,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "metadata": { "collapsed": false }, @@ -224,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": { "collapsed": false }, @@ -258,7 +249,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "metadata": { "collapsed": false }, @@ -309,7 +300,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "metadata": { "collapsed": true }, @@ -337,7 +328,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -348,7 +339,7 @@ "(exprssion 184/0, exprssion 196/0)" ] }, - "execution_count": 15, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -359,7 +350,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -370,7 +361,7 @@ "(exprssion 180/0, exprssion 192/0, exprssion 184/0, exprssion 196/0)" ] }, - "execution_count": 16, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -393,7 +384,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "metadata": { "collapsed": false }, @@ -420,7 +411,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -514,7 +505,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -523,46 +514,46 @@ "name": "stdout", "output_type": "stream", "text": [ - "159.679000854 lmt nx ygtflbjxpoq lwy f\n", - "92.4982833862 afjvta ltvopebstkfdo rlo yqnopb ifpqbzi\n", - "61.3959312439 aavleiq po rvtzeakqyg zur\n", - "37.0580444336 vnlbclj fjo j mamlndfe dixnjhgdtof bdzhe ddvyuwa ohryltop fvek cemouaa dcg ndeilci cxgphmzthauhxzcl\n", - "19.9309463501 iwomtno iwv nwe\n", - "7.24577760696 a quicknbrown vx tuxpcy ouxr she hazy dog\n", - "2.65018558502 a quick brown fox jumped over tue lazy dog\n", - "0.954704046249 a quick brown fox jhmped over the lazy dog\n", - "0.626812160015 a quick brown fox jumped over the lazy dog\n", - "0.466860800982 a quick brown fox jumped over the lazy dog\n", - "0.37179967761 a quick brown fox jumped over the lazy dog\n", - "0.308676809072 a quick brown fox jumped over the lazy dog\n", - "0.263797819614 a quick brown fox jumped over the lazy dog\n", - "0.230166554451 a quick brown fox jumped over the lazx dog\n", - "0.204109430313 a quick brown fox jumped over the lazy dog\n", - "0.183262810111 a nuick browk fox jumped over the lazy dog\n", - "0.166249394417 a quick brown fox jumped over the lazy dog\n", - "0.152071535587 a quick brown fox jumped over whe lazy dog\n", - "0.140101358294 a quick brown fox jumped over the lazy dog\n", - "0.129877090454 a quick brown fox jumped over the lazy dog\n", - "0.121072113514 a quick brown fox jumped over the lazy dog\n", - "0.113252848387 a quick brown fox jumped over the lazy dog\n", - "0.106449194252 a quick brown fox jumped over the lazy dog\n", - "0.100415848196 a quick brown fox jumped over the lazy dog\n", - "0.09498013556 a quick brown fox jumped over the lazy dog\n", - "0.0900921970606 a quick brown fox jumped over the lazy dog\n", - "0.0856867656112 a quick brown fox jumped over the lazy dog\n", - "0.0817062109709 a quick brown fox jumped over the lazy dog\n", - "0.0780855119228 a quick brown fox jumped over the lazy dog\n", - "0.0747060477734 a quick brown fox jumped over the lazy dog\n", - "0.0716441199183 a quick brown fox jumped over the lazy dog\n", - "0.0688194260001 a quick brown fox jumped over the lazy dog\n", - "0.0662013664842 a quick brown fox jumped over the lazy dog\n", - "0.0637593045831 a quick brown fox jumped over the lazy dog\n", - "0.0614740736783 a quick brown fox jumped over the lazy dog\n", - "0.0594449453056 a quick brown fox jumped over the lazy dog\n", - "0.0574542097747 a quick brown fox jumped over the lazy dog\n", - "0.0555782169104 a quick brown fox jumped over the lazy dog\n", - "0.0538321807981 a quick brown fox jumped over the lazy dog\n", - "0.0522314347327 a quick brown fox jumped over the lazy dog\n" + "148.033477783 uloocopmczrrjnai funpgrh gn\n", + "91.8539962769 nonfg rujw ogil rz bfagqome doouqarbayv nkfkq fa ryeafeoi\n", + "54.739528656 fie qmek tgs uzv\n", + "30.164937973 z ouwu ol ruiheb \n", + "10.7598457336 a fuic\n", + "3.2049407959 a quico bgow ary dufox oumped over the lazy dog\n", + "1.03240394592 a quick brown fox jumped over the lazy dog\n", + "0.650553286076 a quick brown fox jumped over the lazy dog\n", + "0.47541359067 a qukck brown fox jumped over the lazy dog\n", + "0.374430119991 a quick brown fox jumped over the lazy dog\n", + "0.308728694916 a quick brown fox jumped over the lazy dog\n", + "0.262536674738 a quick brown fox jumped over the lazy dog\n", + "0.22830298543 a quick brown fox jumped over the lazy dog\n", + "0.201896265149 a quick brown fox jumped over the lazy dog\n", + "0.180914476514 a quick brown fox jumped over the lazy dog\n", + "0.1638764292 a quick brown fox jumped over the lazy dog\n", + "0.149730876088 a quick brown fox jumped over the lazy dog\n", + "0.137800350785 a quick brown fox jumped over the lazy dog\n", + "0.127627104521 a quick brown fox jumped over the lazy dog\n", + "0.118834555149 a quick brown fox jumped over the lazy dog\n", + "0.111203595996 a quick brown fox jumped over the lazy dog\n", + "0.104423552752 a quick brown fox jumped over the lazy dog\n", + "0.0984442383051 a quick brown fox jumped over the lazy dog\n", + "0.0930855795741 a quick brown fox jumped over the lazy dog\n", + "0.0882897824049 a quick brown fox jumped over the lazy dog\n", + "0.0839573442936 a quick brown fox jumped over the lazy dog\n", + "0.0800611972809 a quick brown fox jumped over the lazy dog\n", + "0.0764751881361 a quick brown fox jumped over the lazy dog\n", + "0.0732067674398 a quick brown fox jumped over the lazy dog\n", + "0.0701641961932 a quick brown fox jumped over the lazy dog\n", + "0.0673855319619 a quick brown fox jumped over the lazy dog\n", + "0.0648249685764 a quick brown fox jumped over the lazy dog\n", + "0.0623983256519 a quick brown fox jumped over the lazy dog\n", + "0.060231667012 a quick brown fox jumped over the lazy dog\n", + "0.0581797286868 a quick brown fox jumped over the lazy dog\n", + "0.0562158599496 a quick brown fox jumped over the lazy dog\n", + "0.0544277988374 a quick brown fox jumped over the lazy dog\n", + "0.0527582615614 a quick brown fox jumped over the lazy dog\n", + "0.0511232204735 a quick brown fox jumped over the lazy dog\n", + "0.0496219098568 a quick brown fox jumped over the lazy dog\n" ] } ], @@ -573,7 +564,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -582,46 +573,46 @@ "name": "stdout", "output_type": "stream", "text": [ - "141.691223145 uvybot firnqqci \n", - "130.66217041 nud s ddco e u sqo ryastfig scoxoupa se mz jmxr v\n", - "126.464065552 uuipfaa gyoe pmftgnidnvonf uyddorehj zxbuatudorecdaneoo oepvq uox\n", - "118.422286987 s l whurp yypde beyn ex kavk x uzdlboxc tuq ac aupztide rdmfua qe e wm jxu\n", - "105.712097168 e ck ohelfl e akmfer oewe gp os\n", - "90.3664779663 gzh dofuth lxjuaz thke\n", - "77.7215118408 a eckn vv\n", - "64.3503112793 jr vrof\n", - "55.7599029541 d zcsn ver fe zezz doj dor em ed ama xuei ob\n", - "47.3434677124 gcz bbovrw vunmpjd ofg\n", - "39.2717132568 auil bkbgor ffhg tde abgea oirn ffxgz die berr tref efhe hde oei \n", - "29.5673542023 uqyk qvog tvm for oxx jtme dxgk tve laue doy qfx dzz do rh thl dze do ex uuee don frx jamm dur eohn fom pdo jhe duz qzg qwor hote l oe joy jox fmqme doch vinn tte ta luzc do\n", - "23.5196590424 \n", - "17.6167182922 k iock nogr the lzz upiek vohe ttea loa pdogw theplddoy bdor joa muuped over the lazy doger ohen ohe amzy dor\n", - "13.1281785965 b dugckk howr fo\n", - "8.73806285858 p quxpd over the laza doo\n", - "6.34239006042 a quik bron fox jumped b\n", - "4.15951299667 ca quick brown fox jumpedd over the lazy dog\n", - "2.31204366684 pa quick brown fox jumped over the lazy dog\n", - "1.6212117672 b dog\n", - "1.25511050224 a quick brown fox jumped over the laay dog\n", - "1.01962459087 a quick brown fox jumped over the lazy dog\n", - "0.856129348278 y quick brown fox jumped over the lazy dog\n", - "0.736417710781 a quick brown fox jumped over the lazy dog\n", - "0.645215630531 ua quikk brown fox jumped over the lazy dog\n", - "0.573442876339 a quick brown fox jumped over the lazy dog\n", - "0.515612900257 a quick brown fox jumped over the lazy dog\n", - "0.468045383692 a quick brown fox jumped over the lazy dog\n", - "0.428334087133 a quick brown fox jumped over the lazy dog\n", - "0.394624918699 a quick brown fox jumped over the lazy dog\n", - "0.365713119507 a quick brown fox jumped over the lazy dog\n", - "0.340574681759 a quick brown fox jumped over tee lazy dog\n", - "0.318626344204 a quick brown fox jumped over the lazy dog\n", - "0.299313008785 a quick brown fox jumped over the lazy dog\n", - "0.282055020332 aa quick brown fox jumped over the lazy dog\n", - "0.266678541899 a quick brown fox jumped over the lazy dog\n", - "0.252810955048 a quick brown fox jumped over the lazy dog\n", - "0.240284785628 a quick brown fox jumped over the lazy dog\n", - "0.228963255882 a quick brown fox jumped over the lazy dog\n", - "0.218599379063 a quick brown fox jumped over the lazy dog\n" + "137.304412842 prmnuxlwid d ux udn o axez da lxojhfu dp z\n", + "129.910614014 skedaeip m vn eji ru w \n", + "124.140289307 y ogzi d uj ch oaoag p ivo c ft ghd rl od vqo p rm pottx e ehrto odou pky ojmoxurootff r mhe u\n", + "111.025337219 r ktue wkxu\n", + "98.0487518311 ckx roxy oinad juee reee yrhs wddt cr hej qvpn to ah jplfee h cejte yh\n", + "81.2529830933 d roqo cbn uotx uojp dncfooar gdpbooguy \n", + "68.0369262695 lu gu zupn oxe ex ghd fhx jzr dom eahpfm\n", + "54.3006706238 jc cg uupkbkoogvwo no\n", + "42.3075561523 uqci jufk def rw ummtl uik born uuuii bkrn dokn rfow lup\n", + "31.4120750427 br dtojej\n", + "22.4915180206 aa quick brown oox fumpfeer over the ol\n", + "15.6982011795 qxic bbrwn fox jumpjoer ooe laz doe\n", + "10.5527915955 d gbrown fox jumped overat\n", + "6.46443843842 l qumpd dog\n", + "3.84945011139 a quick brown fox ee lzt jmmped over the lazy dog\n", + "2.08847999573 a quick brown fox jumped over the lazy dog\n", + "1.49571335316 a quick brown fox jumped over the lazy dog\n", + "1.15657103062 a quicb brown fox jumped over the lazy dog\n", + "0.938805937767 a quick brown fox jumped over tan fover the lazy dog\n", + "0.788115262985 a quick brown fox jumped over ohe lazy dog\n", + "0.678014576435 a quick brown fox jumped over the lazy dog\n", + "0.594275057316 a quick brown fox jumped over the lazy dog\n", + "0.52849572897 a quicqk brown fox jumped over the lazy dog\n", + "0.4755628407 a quick brown fox jumped over the lazy dog\n", + "0.432055711746 x quick brown fox jumped over the lazy dog\n", + "0.39562445879 a quick broon fox jumped over the lazy dog\n", + "0.364839941263 a quick brown fox jumped over the lazed over the lazy dog\n", + "0.338363438845 a quick brown fox jumped over the lazy dog\n", + "0.315368592739 a quick brown fox jumped over the lazy dog\n", + "0.295288294554 a quik brown fox jumped over the lazy dog\n", + "0.277546137571 a quick brown fox jumped over the lazy dog\n", + "0.261784315109 a quick brown fox jumped over the lazy dog\n", + "0.2476875633 a quick brown fox jumpeef over the lazy dog\n", + "0.234950631857 a quick brown fox jumped over the lazy dog\n", + "0.223440438509 a quick brown fox jumped over the lazy dog\n", + "0.21306720376 a quick buown fox jumped over the lazy dog\n", + "0.2035497576 a quick brown fox jumped over the lazed overr the lazy dog\n", + "0.194814369082 a kuickk qown fox jumped over the lazy dog\n", + "0.18677970767 a quick brown fox jumped over the lazy dog\n", + "0.179387688637 aa quick brown fox jumped over the lazy dog\n" ] } ], @@ -650,7 +641,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -659,61 +650,52 @@ "name": "stdout", "output_type": "stream", "text": [ - "316.674530029 a quick brown fox jumped over the lazy dog\n", - "105.89151001 a quick brown fox jumped over the lazy dog\n", - "47.5085983276 a quick browitleh aheclazy dog\n", - "14.6825256348 thellazy dog\n", - "2.44217705727 the ere makqne mn thi ste\n", - "0.339166790247 thele pretzels are making me thirsty\n", - "0.185528486967 these pretzels are making me thirsty\n", - "0.136738568544 these mretsels are making me thirsty\n", - "0.109439112246 these pretzels are making me thirsty\n", - "0.0916935577989 these pretzels are making me thirsty\n", - "0.0791544318199 these pretzels are making me thirsty\n", - "0.0697760358453 these pretzels are making me thirsty\n", - "0.0624843500555 these pretzels are making me thirsty\n", - "0.0566432401538 these pretzels are making me thirsty\n", - "0.0518313497305 these pretzels are making me thirsty\n", - "0.0478418208659 these pretzels are making me thirsty\n", - "0.0444259755313 these pretzels are making me thirsty\n", - "0.0414918512106 these pretzels are making me thirsty\n", - "0.0389476977289 these pretzels are making me thirsty\n", - "0.0366978682578 these pretzels are making me thirsty\n", - "0.0347270295024 these pretzels are making me thirsty\n", - "0.0329472795129 these pretzels are making me thirsty\n", - "0.0313814878464 these pretzels are making me thirsty\n", - "0.0299570858479 these pretzels are making me thirsty\n", - "0.0286129526794 these pretzels are making me thirsty\n", - "0.0274254083633 these pretzels are making me thirsty\n", - "0.0263181217015 these pretzels are making me thirsty\n", - "0.0253330375999 these pretzels are making me thirsty\n", - "0.0244014579803 these pretzels are making me thirsty\n", - "0.0235347989947 these pretzels are making me thirsty\n", - "0.0227559711784 these pretzels are making me thirsty\n", - "0.0219390057027 these pretzels are making me thirsty\n", - "0.0212938319892 these pretzels are making me thirsty\n", - "0.0206219516695 these pretzels are making me thirsty\n", - "0.0200188029557 these pretzels are making me thirsty\n", - "0.0194500312209 these pretzels are making me thirsty\n", - "0.0189003441483 these pretzels are making me thirsty\n", - "0.0183964911848 these pretzels are making me thirsty\n", - "0.0178849939257 these pretzels are making me thirsty\n", - "0.0174269638956 these pretzels are making me thirsty\n" + "316.059265137 a quick brown fox jumped over the lazy dog\n", + "97.8145599365 a quick brown fox jumped over the lazy dog\n", + "52.8635063171 a quickxbrown fox jumped over therntz\n", + "24.4791564941 a quick brown fox jumped over thirn vr the n pritu\n", + "4.01108551025 thece prejzels are muking mre n the laz oakd gretzels are mupte\n", + "1.92300200462 these pretzels are making me thirsty\n", + "0.39481985569 these pretzels are making me thirsty\n", + "0.135318264365 these pretzels are making me thirsty\n", + "0.101885713637 these pretzels are making me thirsty\n", + "0.0829276740551 these pretzels are making me thirsty\n", + "0.0703410431743 these pretzels are making me thirsty\n", + "0.0612589642406 these pretzels are making me thirsty\n", + "0.054374050349 these pretzels are making me thirsty\n", + "0.0489393435419 these pretzels are making me thirsty\n", + "0.0445105880499 these pretzels are making me thirsty\n", + "0.0409039668739 these pretzels are making me thirsty\n", + "0.0377906225622 these pretzels are making me thirsty\n", + "0.0351626649499 these pretzels are making me thirsty\n", + "0.0328748859465 these pretzels are making me thirsty\n", + "0.0309081021696 these pretzels are making me thirsty\n", + "0.0291361920536 these pretzels are making me thirsty\n", + "0.0275705922395 these pretzels are making me thirsty\n", + "0.0261883735657 these pretzels are making me thirsty\n", + "0.0249245800078 these pretzels are making me thirsty\n", + "0.0237868223339 these pretzels are making me thirsty\n", + "0.0227445568889 these pretzels are making me thirsty\n", + "0.0217939633876 these pretzels are making me thirsty\n", + "0.020915934816 these pretzels are making me thirsty\n", + "0.0200990028679 these pretzels are making me thirsty\n", + "0.0193889811635 these pretzels are making me thirsty\n", + "0.0187018848956 these pretzels are making me thirsty\n", + "0.0180453378707 these pretzels are making me thirsty\n", + "0.017415529117 these pretzels are making me thirsty\n", + "0.016888782382 these pretzels are making me thirsty\n", + "0.0163544174284 these pretzels are making me thirsty\n", + "0.0158963911235 these pretzels are making me thirsty\n", + "0.0153925828636 these pretzels are making me thirsty\n", + "0.0149803832173 these pretzels are making me thirsty\n", + "0.0145872598514 these pretzels are making me thirsty\n", + "0.0141636235639 these pretzels are making me thirsty\n" ] } ], "source": [ "train(srnn, \"these pretzels are making me thirsty\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { From 63ed049da85a681bd43cbbcc8d8cb1358ddf1116 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Tue, 22 Sep 2015 01:24:18 +0300 Subject: [PATCH 248/965] fixed embarassing mistake in RNNs.ipynb --- pyexamples/tutorials/RNNs.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyexamples/tutorials/RNNs.ipynb b/pyexamples/tutorials/RNNs.ipynb index 3362ae8d5..c5e269819 100644 --- a/pyexamples/tutorials/RNNs.ipynb +++ b/pyexamples/tutorials/RNNs.ipynb @@ -632,7 +632,7 @@ "How can that be?\n", "\n", "The answer is that we are cheating a bit. The sentence we are trying to learn\n", - "has each letter exactly once. This means a simple bigram model can memorize\n", + "has each letter-bigram exactly once. This means a simple trigram model can memorize\n", "it very well.\n", "\n", "Try it out with more complex sequences.\n", From 785c7fefcd81d65e8d334a7b0fe823b837e352e4 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 22 Sep 2015 17:35:30 -0400 Subject: [PATCH 249/965] fix override warnings from new version of clang --- cnn/deep-lstm.h | 6 +++--- cnn/gru.cc | 1 - cnn/gru.h | 6 +++--- cnn/lstm.h | 6 +++--- cnn/rnn.h | 6 +++--- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/cnn/deep-lstm.h b/cnn/deep-lstm.h index 3cc2f550e..6b49f7c86 100644 --- a/cnn/deep-lstm.h +++ b/cnn/deep-lstm.h @@ -18,9 +18,9 @@ struct DeepLSTMBuilder : public RNNBuilder { unsigned hidden_dim, Model* model); - Expression back() const { return h.back().back(); } - std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const { + Expression back() const override { return h.back().back(); } + std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } + std::vector final_s() const override { std::vector ret = (c.size() == 0 ? c0 : c.back()); for(auto my_h : final_h()) ret.push_back(my_h); return ret; diff --git a/cnn/gru.cc b/cnn/gru.cc index d256a3356..cb471213f 100644 --- a/cnn/gru.cc +++ b/cnn/gru.cc @@ -76,7 +76,6 @@ void GRUBuilder::start_new_sequence_impl(const std::vector& h_0) { Expression GRUBuilder::add_input_impl(int prev, const Expression& x) { const bool has_initial_state = (h0.size() > 0); - const unsigned t = h.size(); h.push_back(vector(layers)); vector& ht = h.back(); Expression in = x; diff --git a/cnn/gru.h b/cnn/gru.h index 34b96774b..4fee9b716 100644 --- a/cnn/gru.h +++ b/cnn/gru.h @@ -14,9 +14,9 @@ struct GRUBuilder : public RNNBuilder { unsigned input_dim, unsigned hidden_dim, Model* model); - std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const { return final_h(); } - Expression back() const { return h.back().back(); } + Expression back() const override { return h.back().back(); } + std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } + std::vector final_s() const override { return final_h(); } unsigned num_h0_components() const override { return layers; } void copy(const RNNBuilder & params) override; diff --git a/cnn/lstm.h b/cnn/lstm.h index 774f078ed..b73627424 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -18,9 +18,9 @@ struct LSTMBuilder : public RNNBuilder { unsigned hidden_dim, Model* model); - Expression back() const { return h.back().back(); } - std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const { + Expression back() const override { return h.back().back(); } + std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } + std::vector final_s() const override { std::vector ret = (c.size() == 0 ? c0 : c.back()); for(auto my_h : final_h()) ret.push_back(my_h); return ret; diff --git a/cnn/rnn.h b/cnn/rnn.h index af0a411ec..e761872c7 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -106,9 +106,9 @@ struct SimpleRNNBuilder : public RNNBuilder { public: Expression add_auxiliary_input(const Expression& x, const Expression &aux); - Expression back() const { return h.back().back(); } - std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const { return final_h(); } + Expression back() const override { return h.back().back(); } + std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } + std::vector final_s() const override { return final_h(); } void copy(const RNNBuilder & params) override; unsigned num_h0_components() const override { return layers; } From 519441ac704f5609aa2b63da36802d68e081a933 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 22 Sep 2015 19:17:16 -0400 Subject: [PATCH 250/965] add LogSumExp node type --- cnn/expr.h | 4 ++++ cnn/nodes-common.cc | 19 +++++++++++++++++++ cnn/nodes.cc | 38 ++++++++++++++++++++++++++++++++++---- cnn/nodes.h | 14 ++++++++++++++ 4 files changed, 71 insertions(+), 4 deletions(-) diff --git a/cnn/expr.h b/cnn/expr.h index a02053a65..ea4127050 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -101,6 +101,10 @@ namespace detail { } } +template +inline Expression logsumexp(const T& xs) { return detail::f(xs); } +inline Expression logsumexp(const std::initializer_list& xs) { return detail::f(xs); } + template inline Expression sum(const T& xs) { return detail::f(xs); } inline Expression sum(const std::initializer_list& xs) { return detail::f(xs); } diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index db46a38bb..bd9a042cb 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -226,6 +226,25 @@ Dim ConstantMinusX::dim_forward(const vector& xs) const { return xs[0]; } +string LogSumExp::as_string(const vector& arg_names) const { + ostringstream s; + s << "log(exp " << arg_names[0]; + for (unsigned i = 1; i < arg_names.size(); ++i) + s << " + exp " << arg_names[i]; + s << ")"; + return s.str(); +} + +Dim LogSumExp::dim_forward(const vector& xs) const { + Dim d = xs[0].truncate(); + for (unsigned i = 1; i < xs.size(); ++i) { + if (d != xs[i].truncate()) { + cerr << "Mismatched input dimensions in LogSumExp: " << xs << endl; + abort(); + } + } + return d; +} string Sum::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0]; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 7428a35a2..38d6a1b7d 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -346,10 +346,10 @@ void ConstantMinusX::forward(const vector& xs, Tensor& fx) const } void ConstantMinusX::backward(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { #if HAVE_CUDA gpu::vnegate_backward(dEdxi.d.size(), dEdf.v, dEdxi.v); #else @@ -357,6 +357,36 @@ void ConstantMinusX::backward(const vector& xs, #endif }; +void LogSumExp::forward(const vector& xs, Tensor& fx) const { + const unsigned num_args = xs.size(); + if (num_args == 1) { + fx.v = xs[0]->v; + return; + } + auto res = *fx; + // TODO implement so as to avoid underflow + res.setZero(); + for (unsigned i = 0; i < xs.size(); ++i) + res.array() += (**xs[i]).array().exp(); + res = res.array().log(); +} + +void LogSumExp::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + if (xs.size() == 0) { + *dEdxi += *dEdf; + return; + } + // df/dx_i = 1/{sum_j exp(x_j)} * exp(x_i)} + // = 1/{exp f(x)} * exp(x_i) + // = exp(x_i - f(x)) + auto d = *dEdxi; + d.array() += (**xs[i] - *fx).array().exp() * (*dEdf).array(); +}; + void Sum::forward(const vector& xs, Tensor& fx) const { const unsigned num_args = xs.size(); if (num_args == 1) { diff --git a/cnn/nodes.h b/cnn/nodes.h index 0ccb908ff..845efea0c 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -470,6 +470,20 @@ struct BinaryLogLoss : public Node { Tensor& dEdxi) const override; }; +// y = \log \sum_i \exp x_i +// done in log space carefully to avoid over/underflow issues +struct LogSumExp : public Node { + template explicit LogSumExp(const T& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = \sum_i x_i struct Sum : public Node { template explicit Sum(const T& a) : Node(a) {} From 213b58df998c6d52b2ef076871d01597729811ca Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 29 Sep 2015 11:57:15 -0400 Subject: [PATCH 251/965] segrnn example --- cnn/expr.h | 4 + cnn/nodes.cc | 25 +- cnn/nodes.h | 2 +- examples/example-data/seg-sup.dev.txt | 6 + examples/segrnn-sup.cc | 465 ++++++++++++++++++++++++++ 5 files changed, 488 insertions(+), 14 deletions(-) create mode 100644 examples/example-data/seg-sup.dev.txt create mode 100644 examples/segrnn-sup.cc diff --git a/cnn/expr.h b/cnn/expr.h index ea4127050..ee1836a1d 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -109,6 +109,10 @@ template inline Expression sum(const T& xs) { return detail::f(xs); } inline Expression sum(const std::initializer_list& xs) { return detail::f(xs); } +template +inline Expression max(const T& xs) { return detail::f(xs); } +inline Expression max(const std::initializer_list& xs) { return detail::f(xs); } + template inline Expression average(const T& xs) { return detail::f(xs); } inline Expression average(const std::initializer_list& xs) { return detail::f(xs); } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 38d6a1b7d..d1b63a05c 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -357,18 +357,26 @@ void ConstantMinusX::backward(const vector& xs, #endif }; +template +EIGEN_STRONG_INLINE float logsumexp(const T& x) { + const float m = x.maxCoeff(); + float z = 0; + for (unsigned i = 0; i < x.rows(); ++i) + z += CNN_EXPF(x(i,0) - m); + return m + logf(z); +} + void LogSumExp::forward(const vector& xs, Tensor& fx) const { const unsigned num_args = xs.size(); if (num_args == 1) { fx.v = xs[0]->v; return; } - auto res = *fx; // TODO implement so as to avoid underflow - res.setZero(); + Eigen::Matrix v(xs.size(), 1); for (unsigned i = 0; i < xs.size(); ++i) - res.array() += (**xs[i]).array().exp(); - res = res.array().log(); + v(i,0) = (**xs[i])(0,0); + fx.v[0] = logsumexp(v); } void LogSumExp::backward(const vector& xs, @@ -720,15 +728,6 @@ void MaxPooling1D::backward(const vector& xs, #endif } -template -EIGEN_STRONG_INLINE float logsumexp(const T& x) { - const float m = x.maxCoeff(); - float z = 0; - for (unsigned i = 0; i < x.rows(); ++i) - z += CNN_EXPF(x(i,0) - m); - return m + logf(z); -} - void Softmax::forward(const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { #if HAVE_CUDA diff --git a/cnn/nodes.h b/cnn/nodes.h index 845efea0c..198a6fca8 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -21,7 +21,7 @@ struct Min : public Node { // y = max{x_1, x_2} struct Max : public Node { - explicit Max(const std::initializer_list& a) : Node(a) {} + template explicit Max(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; diff --git a/examples/example-data/seg-sup.dev.txt b/examples/example-data/seg-sup.dev.txt new file mode 100644 index 000000000..1dc04b47d --- /dev/null +++ b/examples/example-data/seg-sup.dev.txt @@ -0,0 +1,6 @@ +a a 0 1 a ||| O:1 O:1 N:2 O:1 +x y 1 a ||| O:1 O:1 N:1 O:1 +a a a ||| O:1 O:1 O:1 +1 0 1 a ||| N:3 O:1 +a 1 a 1 ||| O:1 N:1 O:1 N:1 +0 0 a a 0 0 a a ||| N:2 O:1 O:1 N:2 O:1 O:1 diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc new file mode 100644 index 000000000..28521e163 --- /dev/null +++ b/examples/segrnn-sup.cc @@ -0,0 +1,465 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/timing.h" +#include "cnn/rnn.h" +#include "cnn/gru.h" +#include "cnn/lstm.h" +#include "cnn/dict.h" +#include "cnn/expr.h" + +#include +#include +#include +#include +#include + +#include +#include + +using namespace std; +using namespace cnn; + +unsigned LAYERS = 1; +unsigned INPUT_DIM = 64; +unsigned XCRIBE_DIM = 64; +unsigned SEG_DIM = 32; +unsigned H1DIM = 48; +unsigned H2DIM = 36; +unsigned TAG_DIM = 16; +unsigned TAG_SIZE = 0; +unsigned VOCAB_SIZE = 0; +unsigned DURATION_DIM = 8; + +bool eval = false; +cnn::Dict d; +cnn::Dict td; +int kNONE; +int kSOS; +int kEOS; + +// returns embeddings of labels +struct SymbolEmbedding { + SymbolEmbedding(Model& m, unsigned n, unsigned dim) { + p_labels = m.add_lookup_parameters(n, {dim}); + } + void new_graph(ComputationGraph& g) { cg = &g; } + Expression embed(unsigned label_id) { + return lookup(*cg, p_labels, label_id); + } + ComputationGraph* cg; + LookupParameters* p_labels; +}; + +struct DurationEmbedding { + virtual ~DurationEmbedding(); + virtual void new_graph(ComputationGraph& g) = 0; + virtual Expression embed(unsigned dur) = 0; +}; + +DurationEmbedding::~DurationEmbedding() {} + +struct MLPDurationEmbedding : public DurationEmbedding { + MLPDurationEmbedding(Model& m, unsigned hidden, unsigned dim) { + p_zero = m.add_parameters({dim}); + p_d2h = m.add_parameters({hidden, 2}); + p_hb = m.add_parameters({hidden}); + p_h2o = m.add_parameters({dim, hidden}); + p_ob = m.add_parameters({dim}); + dur_xs.resize(10000, vector(2)); + for (unsigned i = 1; i < dur_xs.size(); ++i) { + dur_xs[i][0] = i; + dur_xs[i][1] = float(i) / logf(2); + } + } + void new_graph(ComputationGraph& g) override { + zero = parameter(g, p_zero); + d2h = parameter(g, p_d2h); + hb = parameter(g, p_hb); + h2o = parameter(g, p_h2o); + ob = parameter(g, p_ob); + cg = &g; + } + Expression embed(unsigned dur) override { + if (dur) { + Expression x = input(*cg, {2}, &dur_xs[dur]); + Expression h = rectify(affine_transform({hb, d2h, x})); + return affine_transform({ob, h2o, h}); + } else { + return zero; + } + } + + ComputationGraph* cg; + vector> dur_xs; + Expression zero, d2h, hb, h2o, ob; + Parameters* p_zero; + Parameters* p_d2h; + Parameters* p_hb; + Parameters* p_h2o; + Parameters* p_ob; +}; + +struct BinnedDurationEmbedding : public DurationEmbedding { + BinnedDurationEmbedding(Model& m, unsigned dim, unsigned num_bins = 8) : max_bin(num_bins - 1) { + p_e = m.add_lookup_parameters(num_bins, {dim}); + } + void new_graph(ComputationGraph& g) override { + cg = &g; + } + Expression embed(unsigned dur) override { + if (dur) dur = static_cast(log(dur) / log(1.6)) + 1; + if (dur > max_bin) { dur = max_bin; } + return lookup(*cg, p_e, dur); + } + ComputationGraph* cg; + int max_bin; + LookupParameters* p_e; +}; + +template +struct BiTrans { + Builder l2rbuilder; + Builder r2lbuilder; + Parameters* p_f2c; + Parameters* p_r2c; + Parameters* p_cb; + + explicit BiTrans(Model& model) : + l2rbuilder(LAYERS, INPUT_DIM, XCRIBE_DIM, &model), + r2lbuilder(LAYERS, INPUT_DIM, XCRIBE_DIM, &model) { + p_f2c = model.add_parameters({XCRIBE_DIM, INPUT_DIM}); + p_r2c = model.add_parameters({XCRIBE_DIM, INPUT_DIM}); + p_cb = model.add_parameters({XCRIBE_DIM}); + } + + vector transcribe(ComputationGraph& cg, const vector& x) { + l2rbuilder.new_graph(cg); + l2rbuilder.start_new_sequence(); + r2lbuilder.new_graph(cg); + r2lbuilder.start_new_sequence(); + Expression f2c = parameter(cg, p_f2c); + Expression r2c = parameter(cg, p_r2c); + Expression cb = parameter(cg, p_cb); + + const int len = x.size(); + vector fwd(len), rev(len), res(len); + for (int i = 0; i < len; ++i) + fwd[i] = l2rbuilder.add_input(x[i]); + for (int i = len - 1; i >= 0; --i) + rev[i] = r2lbuilder.add_input(x[i]); + for (int i = 0; i < len; ++i) + res[i] = affine_transform({cb, f2c, fwd[i], r2c, rev[i]}); + return res; + } +}; + +// uni-directional segment embeddings +// first call construct_chart(sequence), then access the embeddings of the spans with operator()(i,j) +template +struct SegEmbedUni { + Parameters* p_h0; + int len; + Builder builder; + vector> h; // h[i][length of segment - 1] + explicit SegEmbedUni(Model& m) : + builder(LAYERS, XCRIBE_DIM, SEG_DIM, &m) { + p_h0 = m.add_parameters({XCRIBE_DIM}); + } + void construct_chart(ComputationGraph& cg, const vector& c, int max_seg_len = 0) { + len = c.size(); + h.clear(); + h.resize(len); + Expression h0 = parameter(cg, p_h0); + builder.new_graph(cg); + for (int i = 0; i < len; ++i) { + int max_j = i + len; + if (max_seg_len) max_j = i + max_seg_len; + if (max_j > len) max_j = len; + int seg_len = max_j - i; + auto& hi = h[i]; + hi.resize(seg_len); + + builder.start_new_sequence(); + builder.add_input(h0); + for (int k = 0; k < seg_len; ++k) + hi[k] = builder.add_input(c[i+k]); + } + } + // returns the embedding of segment [i,j] + const Expression& operator()(int i, int j) const { + assert(j < len); + assert(j >= i); + return h[i][j - i]; + } +}; + +// uni-directional segment embeddings +// first call construct_chart(sequence), then access the embeddings of the spans with operator()(i,j) +template +struct SegEmbedBi { + int len; + vector>> h; + SegEmbedUni fwd, rev; + explicit SegEmbedBi(Model& m) : fwd(m), rev(m) {} + void construct_chart(ComputationGraph& cg, const vector& c, int max_seg_len = 0) { + len = c.size(); + fwd.construct_chart(cg, c, max_seg_len); + vector rc(len); + for (int i = 0; i < len; ++i) rc[i] = c[len - 1 - i]; + rev.construct_chart(cg, rc, max_seg_len); + h.clear(); + h.resize(len); + for (int i = 0; i < len; ++i) { + int max_j = i + len; + if (max_seg_len) max_j = i + max_seg_len; + if (max_j > len) max_j = len; + int seg_len = max_j - i; + auto& hi = h[i]; + hi.resize(seg_len); + for (int k = 0; k < seg_len; ++k) { + int j = i + k; + const Expression& fe = fwd(i, j); + const Expression& re = rev(len-1-j, len-1-i); + hi[k] = make_pair(fe,re); + } + } + } + const pair& operator()(int i, int j) const { + assert(j >= i); + assert(j < len); + return h[i][j-i]; + } +}; + +template +struct ZerothOrderSemiCRF { + SymbolEmbedding* xe; + SymbolEmbedding* ye; + DurationEmbedding* de; + BiTrans bt; + SegEmbedBi seb; + explicit ZerothOrderSemiCRF(Model& model) : + bt(model), seb(model) { + xe = new SymbolEmbedding(model, VOCAB_SIZE, INPUT_DIM); + ye = new SymbolEmbedding(model, TAG_SIZE, TAG_DIM); + de = new BinnedDurationEmbedding(model, DURATION_DIM); + + // potential lower layer + p_d2h1 = model.add_parameters({H1DIM, DURATION_DIM}); + p_y2h1 = model.add_parameters({H1DIM, TAG_DIM}); + p_fwd2h1 = model.add_parameters({H1DIM, SEG_DIM}); + p_rev2h1 = model.add_parameters({H1DIM, SEG_DIM}); + p_h1b = model.add_parameters({H1DIM}); + + // potential upper layer + p_h12h2 = model.add_parameters({H2DIM, H1DIM}); + p_h2b = model.add_parameters({H2DIM}); + + // potential output layer + p_h22o = model.add_parameters({1, H2DIM}); + p_ob = model.add_parameters({1}); + } + + // return Expression of total loss + Expression SupervisedLoss(const vector& x, + const vector>& yz, // .first = y, .second = duration (z) + ComputationGraph& cg, + int max_seg_len = 0) { + int len = x.size(); + + // is_ref[i][j][y] returns true iff, in the reference, span(i,j) is labeled y + vector>> is_ref(len, vector>(len+1, vector(TAG_SIZE, false))); + unsigned cur = 0; + for (unsigned ri = 0; ri < yz.size(); ++ri) { + assert(cur < len); + int y = yz[ri].first; + int dur = yz[ri].second; + if (max_seg_len && dur > max_seg_len) { + cerr << "max_seg_len=" << max_seg_len << " but reference duration is " << dur << endl; + abort(); + } + unsigned j = cur + dur; + assert(j <= len); + is_ref[cur][j][y] = true; + // cerr << "Span[" << cur << "," << j << ")=" << td.Convert(y) << endl; + cur = j; + } + assert(cur == len); + + xe->new_graph(cg); + ye->new_graph(cg); + de->new_graph(cg); + Expression d2h1 = parameter(cg, p_d2h1); + Expression y2h1 = parameter(cg, p_y2h1); + Expression fwd2h1 = parameter(cg, p_fwd2h1); + Expression rev2h1 = parameter(cg, p_rev2h1); + Expression h1b = parameter(cg, p_h1b); + Expression h12h2 = parameter(cg, p_h12h2); + Expression h2b = parameter(cg, p_h2b); + Expression h22o = parameter(cg, p_h22o); + Expression ob = parameter(cg, p_ob); + vector xins(x.size()); + for (int i = 0; i < len; ++i) + xins[i] = xe->embed(x[i]); + vector c = bt.transcribe(cg, xins); + seb.construct_chart(cg, c, max_seg_len); + vector fwd(len+1); // fwd trellis for model + vector ref_fwd(len+1); // fwd trellis for reference + vector f, fr; + // careful: in the other algorithms spans are [i,j], here they are [i,j) + for (int j = 1; j <= len; ++j) { + // fwd[j] is the total unnoramlized probability for all segmentations / labels + // ending (and including) the symbol at position j-1 + f.clear(); // f stores all additive contributions to item [j] + fr.clear(); + for (unsigned tag = 0; tag < TAG_SIZE; ++tag) { + Expression y = ye->embed(tag); + const int i_start = max_seg_len ? max(0, j - max_seg_len) : 0; + for (int i = i_start; i < j; ++i) { // i is the starting position + bool matches_ref = is_ref[i][j][tag]; + auto seg_embedding_ij = seb(i, j-1); // pair + Expression d = de->embed(j - i); + // factor includes: fwd embedding, rev embedding, duration embedding, label embedding + Expression h1 = rectify(affine_transform({h1b, d2h1, d, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second})); + Expression h2 = tanh(affine_transform({h2b, h12h2, h1})); + //Expression p = exp(affine_transform({ob, h22o, h2})); + Expression p = affine_transform({ob, h22o, h2}); + if (i == 0) { // fwd[0] is the path up and including -1, so it's the empty set, i.e., its probability is 1 + f.push_back(p); + if (matches_ref) fr.push_back(p); + } else { + // f.push_back(p * fwd[i]); + // if (matches_ref) fr.push_back(p * ref_fwd[i]); + f.push_back(p + fwd[i]); + if (matches_ref) fr.push_back(p + ref_fwd[i]); + } + } + } + fwd[j] = logsumexp(f); + if (fr.size()) ref_fwd[j] = logsumexp(fr); + } + //return log(fwd.back()) - log(ref_fwd.back()); + return fwd.back() - ref_fwd.back(); + } + Parameters* p_d2h1, *p_y2h1, *p_fwd2h1, *p_rev2h1, *p_h1b; + Parameters* p_h12h2, *p_h2b; + Parameters* p_h22o, *p_ob; +}; + +// a a 0 1 a ||| O:1 O:1 N:2 O:1 +pair,vector>> ParseTrainingInstance(const std::string& line) { + std::istringstream in(line); + std::string word; + std::string sep = "|||"; + vector x; + vector> yz; + while(1) { + in >> word; + if (word == sep) break; + x.push_back(d.Convert(word)); + } + while(1) { + in >> word; + if (!in) break; + size_t p = word.rfind(':'); + if (p == string::npos || p == 0 || p == (word.size() - 1)) { + cerr << "mal-formed label: " << word << endl; + abort(); + } + int y = td.Convert(word.substr(0, p)); + int z = atoi(word.substr(p+1).c_str()); + yz.push_back(make_pair(y,z)); + } + return make_pair(x, yz); +} + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + vector,vector>>> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + training.push_back(ParseTrainingInstance(line)); + } + } + d.Freeze(); // no new word types allowed + td.Freeze(); // no new tag types allowed + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + dev.push_back(ParseTrainingInstance(line)); + } + } + VOCAB_SIZE = d.size(); + TAG_SIZE = td.size(); + ostringstream os; + os << "0scrf" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << XCRIBE_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + auto sgd = new SimpleSGDTrainer(&model); + + ZerothOrderSemiCRF crf(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 25; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned ttags = 0; + double correct = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& sent = training[order[si]]; + ++si; + crf.SupervisedLoss(sent.first, sent.second, cg); + ttags += sent.second.size(); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(1.0); + ++lines; + } + sgd->status(); + cerr << " E = " << (loss / ttags) << " ppl=" << exp(loss / ttags) << " (acc=" << (correct / ttags) << ") "; + } + delete sgd; +} + From 7d294b3639b454f8451016e3ff97f54878cde415 Mon Sep 17 00:00:00 2001 From: dhg Date: Fri, 2 Oct 2015 13:10:44 -0700 Subject: [PATCH 252/965] added is_frozen() to Dict --- cnn/dict.h | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/cnn/dict.h b/cnn/dict.h index 47a07041c..05c4dc373 100644 --- a/cnn/dict.h +++ b/cnn/dict.h @@ -31,18 +31,19 @@ class Dict { } void Freeze() { frozen = true; } + bool is_frozen() { return frozen; } inline int Convert(const std::string& word) { auto i = d_.find(word); if (i == d_.end()) { if (frozen) { - if (map_unk) { - return unk_id; - } - else { - std::cerr << "Unknown word encountered: " << word << std::endl; - throw std::runtime_error("Unknown word encountered in frozen dictionary: " + word); - } + if (map_unk) { + return unk_id; + } + else { + std::cerr << "Unknown word encountered: " << word << std::endl; + throw std::runtime_error("Unknown word encountered in frozen dictionary: " + word); + } } words_.push_back(word); return d_[word] = words_.size() - 1; From cfc361f984f35bbb743f9e5f09fe1e33674df4e8 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 5 Oct 2015 10:22:25 -0400 Subject: [PATCH 253/965] tok embed --- examples/CMakeLists.txt | 2 +- examples/tok-embed.cc | 301 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 302 insertions(+), 1 deletion(-) create mode 100644 examples/tok-embed.cc diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index cbf43babc..00937815f 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET poisson-regression tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2 mp) +foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2 mp) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/tok-embed.cc b/examples/tok-embed.cc new file mode 100644 index 000000000..d977e4c4e --- /dev/null +++ b/examples/tok-embed.cc @@ -0,0 +1,301 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/timing.h" +#include "cnn/rnn.h" +#include "cnn/gru.h" +#include "cnn/lstm.h" +#include "cnn/dict.h" +#include "cnn/expr.h" + +#include +#include +#include +#include +#include + +#include +#include + +using namespace std; +using namespace cnn; + +unsigned LAYERS = 1; +unsigned CODE_DIM = 64; +unsigned CHAR_DIM = 64; +unsigned EMBED_DIM = 64; +unsigned SEG_DIM = 32; +unsigned H1DIM = 48; +unsigned H2DIM = 36; +unsigned TAG_DIM = 16; +unsigned TAG_SIZE = 0; +unsigned VOCAB_SIZE = 0; +unsigned DURATION_DIM = 8; + +bool eval = false; +cnn::Dict d; +int kNONE; +int kSOW; +int kEOW; + +// given the first character of a UTF8 block, find out how wide it is +// see http://en.wikipedia.org/wiki/UTF-8 for more info +inline unsigned int UTF8Len(unsigned char x) { + if (x < 0x80) return 1; + else if ((x >> 5) == 0x06) return 2; + else if ((x >> 4) == 0x0e) return 3; + else if ((x >> 3) == 0x1e) return 4; + else if ((x >> 2) == 0x3e) return 5; + else if ((x >> 1) == 0x7e) return 6; + else abort(); +} + +struct PrefixNode { + PrefixNode() : + terminal(false), + bias(nullptr), pred(nullptr), zero_cond(nullptr), zero_child(nullptr), + one_cond(nullptr), one_child(nullptr) {} + + ~PrefixNode() { + delete zero_child; + delete one_child; + } + + bool terminal; + Parameters* bias; + Parameters* pred; + Parameters* zero_cond; + PrefixNode* zero_child; + Parameters* one_cond; + PrefixNode* one_child; +}; + +// instructions for use +// 1) add all codes using add("0000") and the like +// 2) then call AllocateParameters(m, dim) +struct PrefixCode { + PrefixCode() : params_allocated(false) {} + + PrefixNode* add(const string& pfc) { + assert(!params_allocated); + PrefixNode* cur = &root; + for (unsigned i = 0; i < pfc.size(); ++i) { + if (cur->terminal) { + cerr << "Prefix property violated at position " << i << " of " << pfc << endl; + abort(); + } + assert(pfc[i] == '0' || pfc[i] == '1'); + PrefixNode*& next = pfc[i] == '0' ? cur->zero_child : cur->one_child; + if (!next) next = new PrefixNode; + cur = next; + } + cur->terminal = true; + return cur; + } + + void AllocateParameters_rec(Model& m, unsigned dim, PrefixNode* n) { + if (!n->terminal) { + if (!n->zero_child || !n->one_child) { + cerr << "Non-binary production in prefix code\n"; + abort(); + } + n->bias = m.add_parameters({1}); + n->pred = m.add_parameters({dim}); + n->zero_cond = m.add_parameters({dim}); + AllocateParameters_rec(m, dim, n->zero_child); + n->one_cond = m.add_parameters({dim}); + AllocateParameters_rec(m, dim, n->one_child); + } + } + + void AllocateParameters(Model& m, unsigned dim) { + params_allocated = true; + AllocateParameters_rec(m, dim, &root); + } + + bool params_allocated; + PrefixNode root; +}; + +// returns embeddings of labels +struct SymbolEmbedding { + SymbolEmbedding(Model& m, unsigned n, unsigned dim) { + p_labels = m.add_lookup_parameters(n, {dim}); + } + void new_graph(ComputationGraph& g) { cg = &g; } + Expression embed(unsigned label_id) { + return lookup(*cg, p_labels, label_id); + } + ComputationGraph* cg; + LookupParameters* p_labels; +}; + +struct PrefixCodeDecoder { + LSTMBuilder decoder; + PrefixCode* pfc; + Parameters* p_start; + explicit PrefixCodeDecoder(Model& model, PrefixCode* pc) : + decoder(LAYERS, CHAR_DIM, EMBED_DIM, &model), pfc(pc) { + p_start = model.add_parameters({EMBED_DIM}); + } + Expression loss(ComputationGraph& cg, const Expression& v, const string& code) { + decoder.new_graph(cg); + Expression h = tanh(v); + vector init = {v, h}; + decoder.start_new_sequence(init); + Expression start = parameter(cg, p_start); + PrefixNode* cur = &pfc->root; + decoder.add_input(start); + size_t i = 0; + vector errs(code.size()); + while(i < code.size()) { + assert(cur); + Expression pred = decoder.back(); + Expression rp = parameter(cg, cur->pred); + Expression bias = parameter(cg, cur->bias); + Expression p = logistic(dot_product(pred, rp) + bias); + // maybe squared error instead of xentropy? + if (code[i] == '0') p = 1.f - p; + errs[i] = log(p); + Expression cond = parameter(cg, code[i] == '0' ? cur->zero_cond : cur->one_cond); + decoder.add_input(cond); + cur = code[i] == '0' ? cur->zero_child : cur->one_child; + ++i; + } + assert(cur->terminal); + return -sum(errs); + } +}; + +template +struct BiCharLSTM { + Builder l2rbuilder; + Builder r2lbuilder; + Parameters* p_f2c; + Parameters* p_r2c; + Parameters* p_cb; + Parameters* p_c2x; + Parameters* p_xb; + SymbolEmbedding sym; + + explicit BiCharLSTM(Model& model) : + l2rbuilder(LAYERS, CHAR_DIM, EMBED_DIM, &model), + r2lbuilder(LAYERS, CHAR_DIM, EMBED_DIM, &model), + sym(model, d.size(), CHAR_DIM) { + p_f2c = model.add_parameters({EMBED_DIM, CHAR_DIM}); + p_r2c = model.add_parameters({EMBED_DIM, CHAR_DIM}); + p_cb = model.add_parameters({EMBED_DIM}); + p_c2x = model.add_parameters({EMBED_DIM, EMBED_DIM}); + p_xb = model.add_parameters({EMBED_DIM}); + } + + Expression embed(ComputationGraph& cg, const vector& x) { + l2rbuilder.new_graph(cg); + l2rbuilder.start_new_sequence(); + r2lbuilder.new_graph(cg); + r2lbuilder.start_new_sequence(); + sym.new_graph(cg); + Expression f2c = parameter(cg, p_f2c); + Expression r2c = parameter(cg, p_r2c); + Expression cb = parameter(cg, p_cb); + Expression c2x = parameter(cg, p_c2x); + Expression xb = parameter(cg, p_xb); + + int len = x.size(); + vector xe(len + 2); + xe[0] = sym.embed(kSOW); + for (int i = 0; i < len; ++i) + xe[i+1] = sym.embed(x[i]); + xe.back() = sym.embed(kEOW); + + len += 2; + for (int i = 0; i < len; ++i) + l2rbuilder.add_input(xe[i]); + for (int i = len - 1; i >= 0; --i) + r2lbuilder.add_input(xe[i]); + Expression c = rectify(affine_transform({cb, f2c, l2rbuilder.back(), r2c, r2lbuilder.back()})); + return affine_transform({xb, c2x, c}); + } +}; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + Model model; + Trainer* sgd = nullptr; + sgd = new SimpleSGDTrainer(&model); + vector>> training; + kSOW = d.Convert(""); + kEOW = d.Convert(""); + PrefixCode pc; + { + cerr << "Reading training data from " << argv[1] << " ...\n"; + ifstream in(argv[1]); + string line; + string code; + vector chars; + while(getline(in, line)) { + size_t s1 = line.find('\t'); + size_t s2 = line.rfind('\t'); + if (s1 == s2 || s2 == (s1+1) || s1 == string::npos) { + cerr << "malformed input: " << line << endl; + abort(); + } + code = line.substr(s1 + 1, s2 - s1 - 1); + pc.add(code); + size_t cur = s2 + 1; + chars.clear(); + while(cur < line.size()) { + size_t len = UTF8Len(line[cur]); + chars.push_back(d.Convert(line.substr(cur, len))); + cur += len; + } + training.push_back(make_pair(code, chars)); + } + } + cerr << "Character set size = " << d.size() << endl; + pc.AllocateParameters(model, CODE_DIM); + BiCharLSTM bclm(model); + PrefixCodeDecoder d(model, &pc); + cerr << "Parameters allocated.\n"; + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + unsigned report_every_i = 50; + unsigned si = training.size(); + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned ttags = 0; + double correct = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& sent = training[order[si]]; + ++si; + Expression w = bclm.embed(cg, sent.second); + d.loss(cg, w, sent.first); + ttags += 1; + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(1.0); + ++lines; + } + sgd->status(); + cerr << " E = " << (loss / ttags) << " ppl=" << exp(loss / ttags) << " (acc=" << (correct / ttags) << ") "; + } + delete sgd; +} + From ac94e6a14c56b9eaa0dbc8b5e46500337417f381 Mon Sep 17 00:00:00 2001 From: Manaal Faruqui Date: Wed, 7 Oct 2015 01:48:25 -0400 Subject: [PATCH 254/965] Added a new program for easy understanding of cnn through training an LSTM --- examples/CMakeLists.txt | 2 +- examples/easy-char-lstm-lm.cc | 261 ++++++++++++++++++++++++++++++++++ 2 files changed, 262 insertions(+), 1 deletion(-) create mode 100644 examples/easy-char-lstm-lm.cc diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 00937815f..ac8ea1731 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2 mp) +foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2 mp easy-char-lstm-lm) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/easy-char-lstm-lm.cc b/examples/easy-char-lstm-lm.cc new file mode 100644 index 000000000..415591263 --- /dev/null +++ b/examples/easy-char-lstm-lm.cc @@ -0,0 +1,261 @@ +/* + This program is meant to be an easy to understand tutorial on how to + use the cnn package for training neural networks. + + This program trains a character level language model with + character embeddings in an LSTM neural network. The parameters + of the LSTM model and the character embeddings are trained by minimizing + the negative log-likelihood on an input corpus. + + Inputs: vocab.txt -- file containing the list of characters separated by + whitespace in a single line. + Ex: a b c e ... z + train.txt -- file containing character sequences separated by + whitespace, every line is a word with spaces in between + every character. + ex: c a t + c a t s + ... + char_size -- desired length of the character embedding. + hidden_size -- length of the hidden layer in the LSTM. + + Run: ./build/examples/easy-char-lstm-lm vocab.txt train.txt 100 50 +*/ + +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/gpu-ops.h" +#include "cnn/expr.h" + +#include +#include + +#include +#include +#include +#include + +using namespace std; +using namespace cnn; +using namespace cnn::expr; + +/* + Function to read a line into words separated by 'delim' + This has nothing to be neural netowrks -- its just a utility function. +*/ +vector split_line(const string& line, char delim) { + vector words; + stringstream ss(line); + string item; + while (std::getline(ss, item, delim)) { + if (!item.empty()) + words.push_back(item); + } + return words; +} + +/* + This is the main class for implemeting LSTM based neural network. +*/ +class LSTM { + +public: + /* + Every parameter that we want to tune or every matrix/vector that we plan + on using during computation is declared as an 'Expression' in the cnn tool. + */ + Expression W_ix, W_ih, W_ic, W_cx, W_ch, + W_ox, W_oh, W_oc; // Weight matrices + Expression b_i, b_f, b_c, b_o; // Bias vectors + int char_len, hidden_len; // Length of the character embedding + // and internal hidden layer of the LSTM + + LSTM() {} + + /* + Initialize the parameters of the model: specify their dimensions. + These parameters are automatically initialized in the library. + + We will see what ComputationGraph and Model are in the main() function. + */ + void Init(const int& char_length, const int& hidden_length, + ComputationGraph *cg, Model *m) { + char_len = char_length; + hidden_len = hidden_length; + + /* + Every expression that you want to use should be added as a parameter + to the model (m, here) that you want to train. Also, it needs to be + specified that it will be a part of the ComputationGraph (cg). + */ + W_ix = parameter(*cg, m->add_parameters({hidden_len, char_len})); + W_ih = parameter(*cg, m->add_parameters({hidden_len, hidden_len})); + W_ic = parameter(*cg, m->add_parameters({hidden_len, hidden_len})); + + W_cx = parameter(*cg, m->add_parameters({hidden_len, char_len})); + W_ch = parameter(*cg, m->add_parameters({hidden_len, hidden_len})); + + W_ox = parameter(*cg, m->add_parameters({hidden_len, char_len})); + W_oh = parameter(*cg, m->add_parameters({hidden_len, hidden_len})); + W_oc = parameter(*cg, m->add_parameters({hidden_len, hidden_len})); + + b_i = parameter(*cg, m->add_parameters({hidden_len, 1})); + b_f = parameter(*cg, m->add_parameters({hidden_len, 1})); + b_c = parameter(*cg, m->add_parameters({hidden_len, 1})); + b_o = parameter(*cg, m->add_parameters({hidden_len, 1})); + } + + /* + This function reads a list of input vectors and outputs the list + of corresponding hidden layers from the LSTM. + */ + void GetHiddenUnits(const vector& cols, + Expression& h_init, + vector* hidden) { + // Initialize the hidden unit and the cell of the LSTM. + Expression h = h_init, c = h_init; + for (unsigned t = 0; t < cols.size(); ++t) { // Iterate over the input + /* + These are general LSTM computation equations. + Functions like logictic(), cwise_multiply() come from cnn library. + */ + Expression i = logistic(W_ix * cols[t] + W_ih * h + W_ic * c + b_i); + Expression f = 1.f - i; + + Expression temp = tanh(W_cx * cols[t] + W_ch * h + b_c); + c = cwise_multiply(f, c) + cwise_multiply(i, temp); + + Expression o = logistic(W_ox * cols[t] + W_oh * h + W_oc * c + b_o); + h = cwise_multiply(o, tanh(c)); + hidden->push_back(h); // Push the hidden layer at time t in the output. + } + } +}; + +/* + This function computes the total loss while predicting the next character + in sequence. This could be any loss function that you like. The end result + of the loss function should be a scalar Expression. + + @param(targets) -- the correct character ids to be predicted + @param(hidden_to_vocab) -- matrix to convert a hidden layer vector to a + vector of vocabulary size. +*/ +Expression ComputeLoss(const vector& hidden_units, + const vector& targets, + Expression& hidden_to_vocab) { + vector losses; + for (unsigned i = 0; i < targets.size(); ++i) { + // Project every hidden layer to a vector of size vocabulary + Expression out = hidden_to_vocab * hidden_units[i]; + // This function computes the negative log-likelihood of obsering + // the correct output character. + Expression loss = pickneglogsoftmax(out, targets[i]); + losses.push_back(loss); + } + return sum(losses); // sum all neg-llh over predictions +} + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + + // Read the vocab file and determine the size of vocabulary + ifstream vocab_file(argv[1]); + vector chars; + if (vocab_file.is_open()) { + string line; + getline(vocab_file, line); + chars = split_line(line, ' '); + } else { + cerr << "File opening failed" << endl; + } + unsigned vocab_size = chars.size(); + + // Assign a unique id to every character in the vocabualry + unordered_map char_to_id; + int num_chars = 0; + for (const string& ch : chars) { + char_to_id[ch] = num_chars++; + } + + // Read the rest of command line parameters + string train_filename = argv[2]; // train file + unsigned char_size = atoi(argv[3]); + unsigned hidden_size = atoi(argv[4]); + vector ZERO(hidden_size, 0.0f); + + Model m; // Model that we will train + SimpleSGDTrainer sgd(&m); // We will train the model using stochastic + // gradient descent. + + // Variable that keeps track of the parameters and the computations being + // performed, in order to perform backpropagation later. + ComputationGraph cg; + + // Instead of representing a character vector by a one-hot vector and using + // a projection matrix to obtain its embedding, cnn provides a more efficent + // way of storing & updating the dense embeddings that are to be indexed + // frequently by their chracter ids. + LookupParameters* char_vecs = m.add_lookup_parameters(vocab_size, + {char_size}); + + // Paramter to project the hidden layer to a vocab_size vector for prediction + Expression hidden_to_vocab = parameter(cg, m.add_parameters({vocab_size, + hidden_size})); + LSTM lstm; + + // Initialize the parameters of the LSTM while making sure that those + // parameters are part of the ConfigurationGraph cg and the Model m -- so + // that they can be updated using backprop. + lstm.Init(char_size, hidden_size, &cg, &m); + + // Read the training file and train the model + unsigned num_iter = 100; + for (unsigned iter = 0; iter < num_iter; ++iter) { + ifstream train_file(train_filename); + if (train_file.is_open()) { + string line; + double loss = 0; + while (getline(train_file, line)) { + chars = split_line(line, ' '); + + vector input_vecs; + vector targets; + targets.clear(); + unsigned index = 0; + for (const string& ch : chars) { + // Construct a vector of the input vectors. The lookup function finds + // the vector corresponding to a given id 'char_to_id[ch]'. + if (index < chars.size() - 1) { + // Input are all characters except the last one '' + input_vecs.push_back(lookup(cg, char_vecs, char_to_id[ch])); + } + if (index > 0) { + // The characters to be predicted are all the characters except + // the first one. '' + targets.push_back(char_to_id[ch]); + } + ++index; + } + + vector hidden_units; + // Initialize the hidden layer of LSTM to be a zero vector + Expression h = input(cg, {hidden_size}, &ZERO); + // Obtain the hidden layer outputs + lstm.GetHiddenUnits(input_vecs, h, &hidden_units); + // Predict the output character using hidden layers and compute loss + Expression e = ComputeLoss(hidden_units, targets, hidden_to_vocab); + // The forward function runs all the expressions of computation we have + // built till now in the computation graph and return the output of the + // last step -- in this case, the prediction loss. + loss += as_scalar(cg.forward()); + cg.backward(); // Compute graidents using backpropagation + sgd.update(1); // Updata parameters with learning rate 1. + } + cerr << "nllh: " << loss << endl; + train_file.close(); + } + } +} + From 0b0469c343e7c88a7eb2f806b907cd4dff775a59 Mon Sep 17 00:00:00 2001 From: Manaal Faruqui Date: Wed, 7 Oct 2015 23:11:35 -0400 Subject: [PATCH 255/965] My first encoder decoder morphology predictor --- examples/CMakeLists.txt | 2 +- examples/morph.cc | 317 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 318 insertions(+), 1 deletion(-) create mode 100644 examples/morph.cc diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index ac8ea1731..f5e2967e8 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2 mp easy-char-lstm-lm) +foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2 mp morph) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/morph.cc b/examples/morph.cc new file mode 100644 index 000000000..98eac2641 --- /dev/null +++ b/examples/morph.cc @@ -0,0 +1,317 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/gpu-ops.h" +#include "cnn/expr.h" + +#include +#include + +#include +#include +#include +#include + +using namespace std; +using namespace cnn; +using namespace cnn::expr; + +string BOW = "", EOW = ""; + +vector split_line(const string& line, char delim) { + vector words; + stringstream ss(line); + string item; + while (std::getline(ss, item, delim)) { + if (!item.empty()) + words.push_back(item); + } + return words; +} + +class LSTM { + + protected: + /* The parameters of the model */ + Expression W_ix, W_ih, W_ic, W_cx, W_ch, + W_ox, W_oh, W_oc; // Weight matrices + Expression b_i, b_f, b_c, b_o; // Bias vectors + Parameters *pW_ix, *pW_ih, *pW_ic, *pW_cx, *pW_ch, *pW_ox, *pW_oh, *pW_oc; + Parameters *pb_i, *pb_f, *pb_c, *pb_o; + int char_len, hidden_len; + + public: + LSTM() {} + + void Init(const int& char_length, const int& hidden_length, Model *m) { + char_len = char_length; + hidden_len = hidden_length; + + pW_ix = m->add_parameters({hidden_len, char_len}); + pW_ih = m->add_parameters({hidden_len, hidden_len}); + pW_ic = m->add_parameters({hidden_len, hidden_len}); + + pW_cx = m->add_parameters({hidden_len, char_len}); + pW_ch = m->add_parameters({hidden_len, hidden_len}); + + pW_ox = m->add_parameters({hidden_len, char_len}); + pW_oh = m->add_parameters({hidden_len, hidden_len}); + pW_oc = m->add_parameters({hidden_len, hidden_len}); + + pb_i = m->add_parameters({hidden_len, 1}); + pb_f = m->add_parameters({hidden_len, 1}); + pb_c = m->add_parameters({hidden_len, 1}); + pb_o = m->add_parameters({hidden_len, 1}); + } + + void InitNewCG(ComputationGraph* cg) { + W_ix = parameter(*cg, pW_ix); + W_ih = parameter(*cg, pW_ih); + W_ic = parameter(*cg, pW_ic); + + W_cx = parameter(*cg, pW_cx); + W_ch = parameter(*cg, pW_ch); + + W_ox = parameter(*cg, pW_ox); + W_oh = parameter(*cg, pW_oh); + W_oc = parameter(*cg, pW_oc); + + b_i = parameter(*cg, pb_i); + b_f = parameter(*cg, pb_f); + b_c = parameter(*cg, pb_c); + b_o = parameter(*cg, pb_o); + } + + void ComputeHC (const Expression& input, Expression* h, Expression* c) { + Expression i = logistic(affine_transform({b_i, W_ix, input, W_ih, *h, W_ic, *c})); + Expression f = 1.f - i; + + Expression temp = tanh(affine_transform({b_c, W_cx, input, W_ch, *h})); + *c = cwise_multiply(f, *c) + cwise_multiply(i, temp); // Update c + + Expression o = logistic(affine_transform({b_o, W_ox, input, W_oh, *h, W_oc, *c})); + *h = cwise_multiply(o, tanh(*c)); // Update h + } + + void GetAllHiddenUnits(const vector& cols, const Expression& h_init, + const Expression& c_init, vector* hidden) { + Expression h = h_init, c = c_init; + for (unsigned t = 0; t < cols.size(); ++t) { + ComputeHC(cols[t], &h, &c); + hidden->push_back(h); + } + } + + void GetLastHiddenUnit(const vector& cols, const Expression& h_init, + const Expression& c_init, Expression* hidden) { + Expression h = h_init, c = c_init; + for (unsigned t = 0; t < cols.size(); ++t) { + ComputeHC(cols[t], &h, &c); + } + *hidden = h; + } +}; + +class Encoder : public LSTM { + public: + void EncodeInputIntoVector(const vector& cols, Expression& h_init, + const Expression& c_init, Expression* hidden) { + GetLastHiddenUnit(cols, h_init, c_init, hidden); + } +}; + +class Decoder : public LSTM { + public: + void DecodeUntilTermFound(const Expression& encoded_word_vec, unsigned terminator, + const Expression& hidden_to_output, + LookupParameters* char_vecs, + unordered_map& char_to_id, + const Expression& h_init, const Expression& c_init, + vector* pred_target_ids, + ComputationGraph* cg) { + Expression input_word_vec = lookup(*cg, char_vecs, char_to_id[BOW]); + Expression h = h_init, c = c_init; + while (true) { + Expression input = concatenate({encoded_word_vec, input_word_vec}); + ComputeHC(input, &h, &c); + Expression out = hidden_to_output * h; + vector dist = as_vector(cg->incremental_forward()); + unsigned pred_index = 0; + float best_score = dist[pred_index]; + for (unsigned index = 1; index < dist.size(); ++index) { + if (dist[index] > best_score) { + best_score = dist[index]; + pred_index = index; + } + } + pred_target_ids->push_back(pred_index); + if (pred_index == terminator) { + return; // If the end is found, break from the loop and return + } + input_word_vec = lookup(*cg, char_vecs, pred_index); + } + } +}; + +Expression ComputeLoss(const vector& hidden_units, + const vector& targets, + Expression& hidden_to_output) { + assert(hidden_units.size() == targets.size()); + vector losses; + for (unsigned i = 0; i < hidden_units.size(); ++i) { + Expression out = hidden_to_output * hidden_units[i]; + losses.push_back(pickneglogsoftmax(out, targets[i])); + } + return sum(losses); +} + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + + // Read the vocab file + ifstream vocab_file(argv[1]); + vector chars; + if (vocab_file.is_open()) { + string line; + getline(vocab_file, line); + chars = split_line(line, ' '); + } else { + cerr << "File opening failed" << endl; + } + unsigned vocab_size = chars.size(); + unordered_map char_to_id; + unordered_map id_to_char; + unsigned num_chars = 0; + for (const string& ch : chars) { + char_to_id[ch] = num_chars; + id_to_char[num_chars] = ch; + num_chars++; + } + + string train_filename = argv[2]; // train file + string test_filename = argv[3]; + unsigned char_size = atoi(argv[4]); + unsigned hidden_size = atoi(argv[5]); + unsigned num_iter = atoi(argv[6]); + vector ZERO(hidden_size, 0.0f); + + Model m; + float regularization_strength = 1e-6f; + AdadeltaTrainer sgd(&m, regularization_strength); + + LookupParameters* char_vecs = m.add_lookup_parameters(vocab_size, + {char_size}); + Parameters* phidden_to_vocab = m.add_parameters({vocab_size, hidden_size}); + + Encoder encoder; + Decoder decoder; + encoder.Init(char_size, hidden_size, &m); + + // The decoder takes encoded word vector with a character vector as input + // at every step. Thus the input length is char_size + hidden_size + decoder.Init(char_size + hidden_size, hidden_size, &m); + + // Read the training file and train the model + for (unsigned iter = 0; iter < num_iter; ++iter) { + ifstream train_file(train_filename); + if (train_file.is_open()) { + string line; + double loss = 0; + while (getline(train_file, line)) { + chars = split_line(line, ' '); + + ComputationGraph cg; + encoder.InitNewCG(&cg); + decoder.InitNewCG(&cg); + Expression hidden_to_vocab = parameter(cg, phidden_to_vocab); + + vector input_vecs; + vector target_vecs; + vector target_ids; + input_vecs.clear(); target_vecs.clear(); target_ids.clear(); + bool reading_target = false; + for (const string& ch : chars) { + input_vecs.push_back(lookup(cg, char_vecs, char_to_id[ch])); + if (reading_target) { + target_vecs.push_back(lookup(cg, char_vecs, char_to_id[ch])); + target_ids.push_back(char_to_id[ch]); + } + if (ch == EOW) { + reading_target = true; + } + } + + // Read the input char vectors and obtain word representation + Expression encoded_input_word_vec; + Expression h = input(cg, {hidden_size}, &ZERO); + encoder.EncodeInputIntoVector(input_vecs, h, h, &encoded_input_word_vec); + + // Use this encoded word vector to predict the transformed word + // The input will not include '' + vector input_target_vecs; + for (unsigned i = 0; i < target_vecs.size() - 1; ++i) { + input_target_vecs.push_back(concatenate({encoded_input_word_vec, + target_vecs[i]})); + } + + // The output will not include '' + vector output_target_ids; + for (unsigned i = 1; i < target_ids.size(); ++i) { + output_target_ids.push_back(target_ids[i]); + } + + vector pred_target_vecs; + decoder.GetAllHiddenUnits(input_target_vecs, h, h, &pred_target_vecs); + Expression e = ComputeLoss(pred_target_vecs, output_target_ids, + hidden_to_vocab); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd.update(1.0f); + } + cerr << "Iter " << iter << " nllh: " << loss << endl; + train_file.close(); + } else { + cerr << "Failed to open the file" << endl; + } + } + + // Read the test file and output predictions for the words. + ifstream test_file(test_filename); + if (test_file.is_open()) { + string line; + while (getline(test_file, line)) { + chars = split_line(line, ' '); + + ComputationGraph cg; + encoder.InitNewCG(&cg); + decoder.InitNewCG(&cg); + Expression hidden_to_vocab = parameter(cg, phidden_to_vocab); + + vector input_vecs; + vector pred_target_ids; + input_vecs.clear(); pred_target_ids.clear(); + cerr << "Input: "; + for (const string& ch : chars) { + input_vecs.push_back(lookup(cg, char_vecs, char_to_id[ch])); + cerr << ch; + } + cerr << endl; + // Read the input char vectors and obtain word representation + Expression encoded_input_word_vec; + Expression h = input(cg, {hidden_size}, &ZERO); + encoder.EncodeInputIntoVector(input_vecs, h, h, &encoded_input_word_vec); + + decoder.DecodeUntilTermFound(encoded_input_word_vec, char_to_id[EOW], + hidden_to_vocab, char_vecs, char_to_id, h, + h, &pred_target_ids, &cg); + cerr << "Output: "; + for (unsigned i = 0; i < pred_target_ids.size() - 1; ++i) { + cerr << id_to_char[pred_target_ids[i]]; + } + cerr << endl; + } + } else { + cerr << "Test file opening failed" << endl; + } + return 1; +} From b91a7fc8142349eb71171d2e7b7ed9ed5d69278d Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 8 Oct 2015 13:00:18 -0400 Subject: [PATCH 256/965] warnings --- cnn/grad-check.cc | 2 +- cnn/graph.h | 2 +- cnn/nodes.cc | 17 ++++++++--------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc index 208816cd9..45bf58e59 100644 --- a/cnn/grad-check.cc +++ b/cnn/grad-check.cc @@ -13,7 +13,7 @@ namespace cnn { void CheckGrad(Model& m, ComputationGraph& g) { float alpha = 5e-4; - float E = as_scalar(g.forward()); + g.forward(); g.backward(); bool flag = false; diff --git a/cnn/graph.h b/cnn/graph.h index 349542bd9..227a6d00a 100644 --- a/cnn/graph.h +++ b/cnn/graph.h @@ -4,6 +4,6 @@ namespace cnn { struct ComputationGraph; void GraphOptimize(ComputationGraph* cg); -}; +} // namespace cnn #endif diff --git a/cnn/nodes.cc b/cnn/nodes.cc index d1b63a05c..3c1915f54 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -280,7 +280,7 @@ void GaussianNoise::backward(const vector& xs, unsigned i, Tensor& dEdxi) const { *dEdxi += *dEdf; -}; +} size_t Dropout::aux_storage_size() const { return dim.size() * sizeof(float); @@ -299,7 +299,7 @@ void Dropout::backward(const vector& xs, Tensor& dEdxi) const { Tensor m(dim, (float*)aux_mem); (*dEdxi) += (*dEdf).cwiseProduct(*m); -}; +} size_t BlockDropout::aux_storage_size() const { // we just need to remember whether this entire block is turned on (1.0) or off (0.0) @@ -333,8 +333,7 @@ void ConstantPlusX::backward(const vector& xs, unsigned i, Tensor& dEdxi) const { *dEdxi += *dEdf; -}; - +} void ConstantMinusX::forward(const vector& xs, Tensor& fx) const { #if HAVE_CUDA @@ -355,7 +354,7 @@ void ConstantMinusX::backward(const vector& xs, #else *dEdxi -= *dEdf; #endif -}; +} template EIGEN_STRONG_INLINE float logsumexp(const T& x) { @@ -393,7 +392,7 @@ void LogSumExp::backward(const vector& xs, // = exp(x_i - f(x)) auto d = *dEdxi; d.array() += (**xs[i] - *fx).array().exp() * (*dEdf).array(); -}; +} void Sum::forward(const vector& xs, Tensor& fx) const { const unsigned num_args = xs.size(); @@ -430,7 +429,7 @@ void Sum::backward(const vector& xs, #else *dEdxi += *dEdf; #endif -}; +} void Average::forward(const vector& xs, Tensor& fx) const { const unsigned num_args = xs.size(); @@ -457,7 +456,7 @@ void Average::backward(const vector& xs, unsigned i, Tensor& dEdxi) const { *dEdxi += (*dEdf / xs.size()); -}; +} void Tanh::forward(const vector& xs, Tensor& fx) const { #if HAVE_CUDA @@ -492,7 +491,7 @@ void Square::backward(const vector& xs, Tensor& dEdxi) const { auto x = **xs[0]; *dEdxi += (*dEdf).cwiseProduct(x) * 2; -}; +} void Exp::forward(const vector& xs, Tensor& fx) const { auto x = **xs[0]; From 69b4f1237820eb50339ccd6d50ec17ae3e38af74 Mon Sep 17 00:00:00 2001 From: Manaal Faruqui Date: Thu, 8 Oct 2015 17:59:02 -0400 Subject: [PATCH 257/965] Put the prediction module inside decoder. --- examples/morph.cc | 54 +++++++++++++++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/examples/morph.cc b/examples/morph.cc index 98eac2641..a30dc0b12 100644 --- a/examples/morph.cc +++ b/examples/morph.cc @@ -36,16 +36,23 @@ class LSTM { Expression W_ix, W_ih, W_ic, W_cx, W_ch, W_ox, W_oh, W_oc; // Weight matrices Expression b_i, b_f, b_c, b_o; // Bias vectors + + // Project hidden layer for predicting words (only used by decoder) + Expression hidden_to_output; + Parameters *pW_ix, *pW_ih, *pW_ic, *pW_cx, *pW_ch, *pW_ox, *pW_oh, *pW_oc; Parameters *pb_i, *pb_f, *pb_c, *pb_o; - int char_len, hidden_len; + Parameters *phidden_to_output; + int char_len, hidden_len, vocab_len; public: LSTM() {} - void Init(const int& char_length, const int& hidden_length, Model *m) { + void Init(const int& char_length, const int& hidden_length, + const int& vocab_length, Model *m) { char_len = char_length; hidden_len = hidden_length; + vocab_len = vocab_length; pW_ix = m->add_parameters({hidden_len, char_len}); pW_ih = m->add_parameters({hidden_len, hidden_len}); @@ -62,6 +69,8 @@ class LSTM { pb_f = m->add_parameters({hidden_len, 1}); pb_c = m->add_parameters({hidden_len, 1}); pb_o = m->add_parameters({hidden_len, 1}); + + phidden_to_output = m->add_parameters({vocab_len, hidden_len}); } void InitNewCG(ComputationGraph* cg) { @@ -80,9 +89,11 @@ class LSTM { b_f = parameter(*cg, pb_f); b_c = parameter(*cg, pb_c); b_o = parameter(*cg, pb_o); + + hidden_to_output = parameter(*cg, phidden_to_output); } - void ComputeHC (const Expression& input, Expression* h, Expression* c) { + void ComputeHC (const Expression& input, Expression* h, Expression* c) const { Expression i = logistic(affine_transform({b_i, W_ix, input, W_ih, *h, W_ic, *c})); Expression f = 1.f - i; @@ -94,7 +105,8 @@ class LSTM { } void GetAllHiddenUnits(const vector& cols, const Expression& h_init, - const Expression& c_init, vector* hidden) { + const Expression& c_init, vector* hidden) + const { Expression h = h_init, c = c_init; for (unsigned t = 0; t < cols.size(); ++t) { ComputeHC(cols[t], &h, &c); @@ -103,7 +115,7 @@ class LSTM { } void GetLastHiddenUnit(const vector& cols, const Expression& h_init, - const Expression& c_init, Expression* hidden) { + const Expression& c_init, Expression* hidden) const { Expression h = h_init, c = c_init; for (unsigned t = 0; t < cols.size(); ++t) { ComputeHC(cols[t], &h, &c); @@ -115,20 +127,31 @@ class LSTM { class Encoder : public LSTM { public: void EncodeInputIntoVector(const vector& cols, Expression& h_init, - const Expression& c_init, Expression* hidden) { + const Expression& c_init, Expression* hidden) const { GetLastHiddenUnit(cols, h_init, c_init, hidden); } }; class Decoder : public LSTM { + public: + Expression ComputeLoss(const vector& hidden_units, + const vector& targets) const { + assert(hidden_units.size() == targets.size()); + vector losses; + for (unsigned i = 0; i < hidden_units.size(); ++i) { + Expression out = hidden_to_output * hidden_units[i]; + losses.push_back(pickneglogsoftmax(out, targets[i])); + } + return sum(losses); + } + void DecodeUntilTermFound(const Expression& encoded_word_vec, unsigned terminator, - const Expression& hidden_to_output, LookupParameters* char_vecs, unordered_map& char_to_id, const Expression& h_init, const Expression& c_init, vector* pred_target_ids, - ComputationGraph* cg) { + ComputationGraph* cg) const { Expression input_word_vec = lookup(*cg, char_vecs, char_to_id[BOW]); Expression h = h_init, c = c_init; while (true) { @@ -201,15 +224,14 @@ int main(int argc, char** argv) { LookupParameters* char_vecs = m.add_lookup_parameters(vocab_size, {char_size}); - Parameters* phidden_to_vocab = m.add_parameters({vocab_size, hidden_size}); Encoder encoder; Decoder decoder; - encoder.Init(char_size, hidden_size, &m); + encoder.Init(char_size, hidden_size, vocab_size, &m); // The decoder takes encoded word vector with a character vector as input // at every step. Thus the input length is char_size + hidden_size - decoder.Init(char_size + hidden_size, hidden_size, &m); + decoder.Init(char_size + hidden_size, hidden_size, vocab_size, &m); // Read the training file and train the model for (unsigned iter = 0; iter < num_iter; ++iter) { @@ -223,7 +245,6 @@ int main(int argc, char** argv) { ComputationGraph cg; encoder.InitNewCG(&cg); decoder.InitNewCG(&cg); - Expression hidden_to_vocab = parameter(cg, phidden_to_vocab); vector input_vecs; vector target_vecs; @@ -262,8 +283,7 @@ int main(int argc, char** argv) { vector pred_target_vecs; decoder.GetAllHiddenUnits(input_target_vecs, h, h, &pred_target_vecs); - Expression e = ComputeLoss(pred_target_vecs, output_target_ids, - hidden_to_vocab); + Expression e = decoder.ComputeLoss(pred_target_vecs, output_target_ids); loss += as_scalar(cg.forward()); cg.backward(); sgd.update(1.0f); @@ -285,7 +305,6 @@ int main(int argc, char** argv) { ComputationGraph cg; encoder.InitNewCG(&cg); decoder.InitNewCG(&cg); - Expression hidden_to_vocab = parameter(cg, phidden_to_vocab); vector input_vecs; vector pred_target_ids; @@ -300,10 +319,9 @@ int main(int argc, char** argv) { Expression encoded_input_word_vec; Expression h = input(cg, {hidden_size}, &ZERO); encoder.EncodeInputIntoVector(input_vecs, h, h, &encoded_input_word_vec); - decoder.DecodeUntilTermFound(encoded_input_word_vec, char_to_id[EOW], - hidden_to_vocab, char_vecs, char_to_id, h, - h, &pred_target_ids, &cg); + char_vecs, char_to_id, h, h, + &pred_target_ids, &cg); cerr << "Output: "; for (unsigned i = 0; i < pred_target_ids.size() - 1; ++i) { cerr << id_to_char[pred_target_ids[i]]; From a1dd235f59f7ecc999bc5830f0499615b45efa2c Mon Sep 17 00:00:00 2001 From: Manaal Faruqui Date: Thu, 8 Oct 2015 18:29:15 -0400 Subject: [PATCH 258/965] Added a whole nn class containing encoder & decoder --- examples/morph.cc | 67 ++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/examples/morph.cc b/examples/morph.cc index a30dc0b12..c89484731 100644 --- a/examples/morph.cc +++ b/examples/morph.cc @@ -73,7 +73,7 @@ class LSTM { phidden_to_output = m->add_parameters({vocab_len, hidden_len}); } - void InitNewCG(ComputationGraph* cg) { + void AddParamsToCG(ComputationGraph* cg) { W_ix = parameter(*cg, pW_ix); W_ih = parameter(*cg, pW_ih); W_ic = parameter(*cg, pW_ic); @@ -176,17 +176,24 @@ class Decoder : public LSTM { } }; -Expression ComputeLoss(const vector& hidden_units, - const vector& targets, - Expression& hidden_to_output) { - assert(hidden_units.size() == targets.size()); - vector losses; - for (unsigned i = 0; i < hidden_units.size(); ++i) { - Expression out = hidden_to_output * hidden_units[i]; - losses.push_back(pickneglogsoftmax(out, targets[i])); +class MorphTrans { + public: + Encoder encoder; + Decoder decoder; + LookupParameters* char_vecs; + + MorphTrans(const int& char_length, const int& hidden_length, + const int& vocab_length, Model *m) { + encoder.Init(char_length, hidden_length, vocab_length, m); + decoder.Init(char_length + hidden_length, hidden_length, vocab_length, m); + char_vecs = m->add_lookup_parameters(vocab_length, {char_length}); } - return sum(losses); -} + + void AddParamsToCG(ComputationGraph* cg) { + encoder.AddParamsToCG(cg); + decoder.AddParamsToCG(cg); + } +}; int main(int argc, char** argv) { cnn::Initialize(argc, argv); @@ -221,17 +228,7 @@ int main(int argc, char** argv) { Model m; float regularization_strength = 1e-6f; AdadeltaTrainer sgd(&m, regularization_strength); - - LookupParameters* char_vecs = m.add_lookup_parameters(vocab_size, - {char_size}); - - Encoder encoder; - Decoder decoder; - encoder.Init(char_size, hidden_size, vocab_size, &m); - - // The decoder takes encoded word vector with a character vector as input - // at every step. Thus the input length is char_size + hidden_size - decoder.Init(char_size + hidden_size, hidden_size, vocab_size, &m); + MorphTrans nn(char_size, hidden_size, vocab_size, &m); // Read the training file and train the model for (unsigned iter = 0; iter < num_iter; ++iter) { @@ -243,8 +240,7 @@ int main(int argc, char** argv) { chars = split_line(line, ' '); ComputationGraph cg; - encoder.InitNewCG(&cg); - decoder.InitNewCG(&cg); + nn.AddParamsToCG(&cg); vector input_vecs; vector target_vecs; @@ -252,9 +248,9 @@ int main(int argc, char** argv) { input_vecs.clear(); target_vecs.clear(); target_ids.clear(); bool reading_target = false; for (const string& ch : chars) { - input_vecs.push_back(lookup(cg, char_vecs, char_to_id[ch])); + input_vecs.push_back(lookup(cg, nn.char_vecs, char_to_id[ch])); if (reading_target) { - target_vecs.push_back(lookup(cg, char_vecs, char_to_id[ch])); + target_vecs.push_back(lookup(cg, nn.char_vecs, char_to_id[ch])); target_ids.push_back(char_to_id[ch]); } if (ch == EOW) { @@ -265,7 +261,7 @@ int main(int argc, char** argv) { // Read the input char vectors and obtain word representation Expression encoded_input_word_vec; Expression h = input(cg, {hidden_size}, &ZERO); - encoder.EncodeInputIntoVector(input_vecs, h, h, &encoded_input_word_vec); + nn.encoder.EncodeInputIntoVector(input_vecs, h, h, &encoded_input_word_vec); // Use this encoded word vector to predict the transformed word // The input will not include '' @@ -282,8 +278,8 @@ int main(int argc, char** argv) { } vector pred_target_vecs; - decoder.GetAllHiddenUnits(input_target_vecs, h, h, &pred_target_vecs); - Expression e = decoder.ComputeLoss(pred_target_vecs, output_target_ids); + nn.decoder.GetAllHiddenUnits(input_target_vecs, h, h, &pred_target_vecs); + Expression e = nn.decoder.ComputeLoss(pred_target_vecs, output_target_ids); loss += as_scalar(cg.forward()); cg.backward(); sgd.update(1.0f); @@ -303,25 +299,24 @@ int main(int argc, char** argv) { chars = split_line(line, ' '); ComputationGraph cg; - encoder.InitNewCG(&cg); - decoder.InitNewCG(&cg); + nn.AddParamsToCG(&cg); vector input_vecs; vector pred_target_ids; input_vecs.clear(); pred_target_ids.clear(); cerr << "Input: "; for (const string& ch : chars) { - input_vecs.push_back(lookup(cg, char_vecs, char_to_id[ch])); + input_vecs.push_back(lookup(cg, nn.char_vecs, char_to_id[ch])); cerr << ch; } cerr << endl; // Read the input char vectors and obtain word representation Expression encoded_input_word_vec; Expression h = input(cg, {hidden_size}, &ZERO); - encoder.EncodeInputIntoVector(input_vecs, h, h, &encoded_input_word_vec); - decoder.DecodeUntilTermFound(encoded_input_word_vec, char_to_id[EOW], - char_vecs, char_to_id, h, h, - &pred_target_ids, &cg); + nn.encoder.EncodeInputIntoVector(input_vecs, h, h, &encoded_input_word_vec); + nn.decoder.DecodeUntilTermFound(encoded_input_word_vec, char_to_id[EOW], + nn.char_vecs, char_to_id, h, h, + &pred_target_ids, &cg); cerr << "Output: "; for (unsigned i = 0; i < pred_target_ids.size() - 1; ++i) { cerr << id_to_char[pred_target_ids[i]]; From d837d8d5524c698a61aed28cfc4a4088883538d2 Mon Sep 17 00:00:00 2001 From: Waleed Ammar Date: Thu, 8 Oct 2015 21:21:09 -0400 Subject: [PATCH 259/965] cubic activtion function --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/nodes-common.cc | 11 +++++++++++ cnn/nodes.cc | 14 ++++++++++++++ cnn/nodes.h | 13 +++++++++++++ 5 files changed, 40 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index 53c055e57..17c1c4a52 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -34,6 +34,7 @@ Expression tanh(const Expression& x) { return Expression(x.pg, x.pg->add_functio Expression log(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression exp(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression square(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression cube(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression logistic(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression rectify(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression hinge(const Expression& x, unsigned index, float m) { return Expression(x.pg, x.pg->add_function({x.i}, index, m)); } diff --git a/cnn/expr.h b/cnn/expr.h index ee1836a1d..242f55f73 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -46,6 +46,7 @@ Expression contract3d_1d(const Expression& x, const Expression& y, const Express Expression tanh(const Expression& x); Expression exp(const Expression& x); Expression square(const Expression& x); +Expression cube(const Expression& x); Expression log(const Expression& x); Expression logistic(const Expression& x); Expression rectify(const Expression& x); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index bd9a042cb..692a7e734 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -305,6 +305,17 @@ Dim Square::dim_forward(const vector& xs) const { return xs[0]; } +string Cube::as_string(const vector& arg_names) const { + ostringstream s; + s << "cube(" << arg_names[0] << ')'; + return s.str(); +} + +Dim Cube::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string Exp::as_string(const vector& arg_names) const { ostringstream os; os << "exp(" << arg_names[0] << ')'; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index f2021b858..546c4f351 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -498,6 +498,20 @@ void Square::backward(const vector& xs, *dEdxi += (*dEdf).cwiseProduct(x) * 2; } +void Cube::forward(const vector& xs, Tensor& fx) const { + auto x = **xs[0]; + *fx = x.cwiseProduct(x).cwiseProduct(x); +} + +void Cube::backward(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + auto x = **xs[0]; + *dEdxi += (*dEdf).cwiseProduct(x.cwiseProduct(x)) * 3; +}; + void Exp::forward(const vector& xs, Tensor& fx) const { auto x = **xs[0]; *fx = x.array().exp(); diff --git a/cnn/nodes.h b/cnn/nodes.h index 198a6fca8..e634c68a1 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -252,6 +252,19 @@ struct Square : public Node { Tensor& dEdxi) const override; }; +// y = x_1 \odot x_1 \odot x_1 +struct Cube : public Node { + explicit Cube(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward(const std::vector& xs, Tensor& fx) const override; + void backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = exp x_1 struct Exp : public Node { explicit Exp(const std::initializer_list& a) : Node(a) {} From 8034d110600bc7a594d10776c976028f8bb11079 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 9 Oct 2015 02:03:41 -0400 Subject: [PATCH 260/965] you know to do --- TODO.cnn | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 TODO.cnn diff --git a/TODO.cnn b/TODO.cnn new file mode 100644 index 000000000..7866b8158 --- /dev/null +++ b/TODO.cnn @@ -0,0 +1,34 @@ +PRIORITIES: + +Multiprocessor/single memory version has to get merged with good, clear examples [cdyer needs to try it out, then work with Austin] + +cnn/init.cc [volunteer!!!] + * This is an unlovely place that every CNN code calls as its first thing + * it should read (and remove) any cnn specific arguments from argc, argv + * add a --help argument + * what should the other arguments do? + - configure memory limits + - possibly enable things like initialization strategies for random variables (this + is not trivial, but worth doing0 + - set rnd seed behavior + - configure GPU nonsense + - configure multiproc/multithread + +tests/ [volunteer!!!] + * speaks for itself + * we need to report very clear, detailed runtime on lots of things. in PARTICULAR: big M-v and M-M products, but also softmax. these should be as close to the "user expr.h API" as possible since we want the these tests to be stable. + * we should have a separate mechanism for testing nodes in isolation, make sure fx can deal with non-zero numbers, make sure dEdxi does the right thing with non-zero numbers (different than fx!). + * we should have one example that calls the fin diff gradient checker on a non-trivial example + +cnn/tensor.* [volunteer!!!] + * big change: start using the CNN multidim tensor library when it makes sense + * almost as big: make it so memory lives in GPU and CPU, and the scheduler will try to do smart things with CPU memory. This will mean the behavior of where memory lives will not be #if CUDA but rather a runtime property of the tensor. this affect all nodes. + +cnn/exec.cc + * parallel execution of nodes (we've got the whole FSCKING graph). problem is, i don't know anything about how to elegantly put work like we've got into a threadpool or whatever it is the low-overhead kids are doing these days. I'd rather not pollute the Node code with this AT ALL. + * more importantly, auto-batching + +cnn/examples/rnnlm.cc + * add real program options to do something nontrivial + * give elegant example of beam search implementation + From c7c66009b824ab793352aa6ba8aa6356826eec52 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 9 Oct 2015 02:56:22 -0400 Subject: [PATCH 261/965] test stub --- CMakeLists.txt | 4 +++- cmake/FindEigen3.cmake | 9 +++++++++ tests/CMakeLists.txt | 14 ++++++++++++++ tests/README.md | 1 + tests/test-cnn.cc | 29 +++++++++++++++++++++++++++++ 5 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 tests/CMakeLists.txt create mode 100644 tests/README.md create mode 100644 tests/test-cnn.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index a4b2e2403..b8e5700f0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # 3. try compiler options like -march=native or other architecture # flags (the compiler does not always make the best configuration # decisions without help) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funroll-loops -Wall -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -Wno-unused-local-typedefs -march=native") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funroll-loops -Wall -Wpedantic -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -Wno-unused-local-typedefs -march=native") enable_testing() @@ -88,4 +88,6 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory(cnn) +add_subdirectory(tests) add_subdirectory(examples) +enable_testing() diff --git a/cmake/FindEigen3.cmake b/cmake/FindEigen3.cmake index 9c546a05d..cea1afeab 100644 --- a/cmake/FindEigen3.cmake +++ b/cmake/FindEigen3.cmake @@ -9,6 +9,12 @@ # EIGEN3_FOUND - system has eigen lib with correct version # EIGEN3_INCLUDE_DIR - the eigen include directory # EIGEN3_VERSION - eigen version +# +# This module reads hints about search locations from +# the following enviroment variables: +# +# EIGEN3_ROOT +# EIGEN3_ROOT_DIR # Copyright (c) 2006, 2007 Montel Laurent, # Copyright (c) 2008, 2009 Gael Guennebaud, @@ -62,6 +68,9 @@ if (EIGEN3_INCLUDE_DIR) else (EIGEN3_INCLUDE_DIR) find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library + HINTS + ENV EIGEN3_ROOT + ENV EIGEN3_ROOT_DIR PATHS ${CMAKE_INSTALL_PREFIX}/include ${KDE4_INCLUDE_DIR} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 000000000..c74ed33e7 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,14 @@ +find_package (Boost COMPONENTS system filesystem unit_test_framework REQUIRED) +include_directories (${TEST_SOURCE_DIR}/src + ${Boost_INCLUDE_DIRS} + ) + +add_definitions (-DBOOST_TEST_DYN_LINK) + +add_executable (test-cnn test-cnn.cc) + +target_link_libraries (test-cnn cnn ${LIBS} + ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} + ) +add_test(test-cnn test-cnn) + diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 000000000..cc4630528 --- /dev/null +++ b/tests/README.md @@ -0,0 +1 @@ +Use `test-cnn.cc` as a reference for how to set up subsequent tests. diff --git a/tests/test-cnn.cc b/tests/test-cnn.cc new file mode 100644 index 000000000..8cf68b294 --- /dev/null +++ b/tests/test-cnn.cc @@ -0,0 +1,29 @@ +#include +#define BOOST_TEST_MODULE CNNBasicTest +#include + +struct ConfigureCNNTest { + ConfigureCNNTest() { + // set up some dummy arguments to cnn + for (auto x : {"ConfigureCNNTest", "--cnn.mem", "1MB"}) { + av.push_back(strdup(x)); + } + av.push_back(nullptr); + char **argv = &av[0]; + int argc = av.size(); + cnn::Initialize(argc, argv); + } + ~ConfigureCNNTest() { + for (auto x : av) free(x); + } + std::vector av; +}; + +// configure CNN +BOOST_GLOBAL_FIXTURE(ConfigureCNNTest); + +BOOST_AUTO_TEST_CASE( aligned_allocator ) { + void* mem = cnn::cnn_mm_malloc(1024, 0x100); + BOOST_CHECK_EQUAL(((unsigned long)(mem) & 0xff), 0); +} + From 5fa8b0487b9964ad95fe1e28b415c5e53aa42fe5 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 9 Oct 2015 03:25:55 -0400 Subject: [PATCH 262/965] todo --- TODO.cnn | 3 +++ 1 file changed, 3 insertions(+) diff --git a/TODO.cnn b/TODO.cnn index 7866b8158..9d7b59761 100644 --- a/TODO.cnn +++ b/TODO.cnn @@ -2,6 +2,9 @@ PRIORITIES: Multiprocessor/single memory version has to get merged with good, clear examples [cdyer needs to try it out, then work with Austin] +throughout: instead of aborting, throw a proper exception type (this make's life easier +for Yoav's Python wrapper) [volunteer!!!] + cnn/init.cc [volunteer!!!] * This is an unlovely place that every CNN code calls as its first thing * it should read (and remove) any cnn specific arguments from argc, argv From f340e03bda62e1d3c0694f8dd4f16255f999c08b Mon Sep 17 00:00:00 2001 From: Manaal Faruqui Date: Fri, 9 Oct 2015 13:12:19 -0400 Subject: [PATCH 263/965] Added bias and tranformation, better modules --- examples/morph.cc | 204 ++++++++++++++++++++++++++++------------------ 1 file changed, 126 insertions(+), 78 deletions(-) diff --git a/examples/morph.cc b/examples/morph.cc index c89484731..811d98b58 100644 --- a/examples/morph.cc +++ b/examples/morph.cc @@ -38,14 +38,18 @@ class LSTM { Expression b_i, b_f, b_c, b_o; // Bias vectors // Project hidden layer for predicting words (only used by decoder) - Expression hidden_to_output; + Expression hidden_to_output, hidden_to_output_bias; Parameters *pW_ix, *pW_ih, *pW_ic, *pW_cx, *pW_ch, *pW_ox, *pW_oh, *pW_oc; Parameters *pb_i, *pb_f, *pb_c, *pb_o; - Parameters *phidden_to_output; - int char_len, hidden_len, vocab_len; + Parameters *phidden_to_output, *phidden_to_output_bias; + + vector ZERO; + Expression h_init; public: + int char_len, hidden_len, vocab_len; + LSTM() {} void Init(const int& char_length, const int& hidden_length, @@ -71,6 +75,11 @@ class LSTM { pb_o = m->add_parameters({hidden_len, 1}); phidden_to_output = m->add_parameters({vocab_len, hidden_len}); + phidden_to_output_bias = m->add_parameters({vocab_len, 1}); + + for (int i = 0; i < hidden_len; ++i) { + ZERO.push_back(0.); + } } void AddParamsToCG(ComputationGraph* cg) { @@ -91,11 +100,14 @@ class LSTM { b_o = parameter(*cg, pb_o); hidden_to_output = parameter(*cg, phidden_to_output); + hidden_to_output_bias = parameter(*cg, phidden_to_output_bias); + + h_init = input(*cg, {hidden_len}, &ZERO); } void ComputeHC (const Expression& input, Expression* h, Expression* c) const { Expression i = logistic(affine_transform({b_i, W_ix, input, W_ih, *h, W_ic, *c})); - Expression f = 1.f - i; + Expression f = 1.0f - i; Expression temp = tanh(affine_transform({b_c, W_cx, input, W_ch, *h})); *c = cwise_multiply(f, *c) + cwise_multiply(i, temp); // Update c @@ -104,19 +116,18 @@ class LSTM { *h = cwise_multiply(o, tanh(*c)); // Update h } - void GetAllHiddenUnits(const vector& cols, const Expression& h_init, - const Expression& c_init, vector* hidden) - const { - Expression h = h_init, c = c_init; + void GetAllHiddenUnits(const vector& cols, + vector* hidden) const { + Expression h = h_init, c = h_init; for (unsigned t = 0; t < cols.size(); ++t) { ComputeHC(cols[t], &h, &c); hidden->push_back(h); } } - void GetLastHiddenUnit(const vector& cols, const Expression& h_init, - const Expression& c_init, Expression* hidden) const { - Expression h = h_init, c = c_init; + void GetLastHiddenUnit(const vector& cols, Expression* hidden) + const { + Expression h = h_init, c = h_init; for (unsigned t = 0; t < cols.size(); ++t) { ComputeHC(cols[t], &h, &c); } @@ -126,38 +137,43 @@ class LSTM { class Encoder : public LSTM { public: - void EncodeInputIntoVector(const vector& cols, Expression& h_init, - const Expression& c_init, Expression* hidden) const { - GetLastHiddenUnit(cols, h_init, c_init, hidden); + void EncodeInputIntoVector(const vector& cols, + Expression* hidden) const { + GetLastHiddenUnit(cols, hidden); } }; class Decoder : public LSTM { public: + void ProjectToVocab(const Expression& hidden, Expression* out) const { + *out = affine_transform({hidden_to_output_bias, hidden_to_output, hidden}); + } + Expression ComputeLoss(const vector& hidden_units, const vector& targets) const { assert(hidden_units.size() == targets.size()); vector losses; for (unsigned i = 0; i < hidden_units.size(); ++i) { - Expression out = hidden_to_output * hidden_units[i]; + Expression out; + ProjectToVocab(hidden_units[i], &out); losses.push_back(pickneglogsoftmax(out, targets[i])); } return sum(losses); } - void DecodeUntilTermFound(const Expression& encoded_word_vec, unsigned terminator, + void DecodeUntilTermFound(const Expression& encoded_word_vec, LookupParameters* char_vecs, unordered_map& char_to_id, - const Expression& h_init, const Expression& c_init, vector* pred_target_ids, ComputationGraph* cg) const { Expression input_word_vec = lookup(*cg, char_vecs, char_to_id[BOW]); - Expression h = h_init, c = c_init; + Expression h = h_init, c = h_init; while (true) { Expression input = concatenate({encoded_word_vec, input_word_vec}); ComputeHC(input, &h, &c); - Expression out = hidden_to_output * h; + Expression out; + ProjectToVocab(h, &out); vector dist = as_vector(cg->incremental_forward()); unsigned pred_index = 0; float best_score = dist[pred_index]; @@ -167,10 +183,10 @@ class Decoder : public LSTM { pred_index = index; } } - pred_target_ids->push_back(pred_index); - if (pred_index == terminator) { + if (pred_index == char_to_id[EOW]) { return; // If the end is found, break from the loop and return } + pred_target_ids->push_back(pred_index); input_word_vec = lookup(*cg, char_vecs, pred_index); } } @@ -181,17 +197,93 @@ class MorphTrans { Encoder encoder; Decoder decoder; LookupParameters* char_vecs; + Expression transform_encoded, transform_encoded_bias; + Parameters *ptransform_encoded, *ptransform_encoded_bias; MorphTrans(const int& char_length, const int& hidden_length, const int& vocab_length, Model *m) { encoder.Init(char_length, hidden_length, vocab_length, m); decoder.Init(char_length + hidden_length, hidden_length, vocab_length, m); + char_vecs = m->add_lookup_parameters(vocab_length, {char_length}); + ptransform_encoded = m->add_parameters({hidden_length, hidden_length}); + ptransform_encoded_bias = m->add_parameters({hidden_length, 1}); } void AddParamsToCG(ComputationGraph* cg) { encoder.AddParamsToCG(cg); decoder.AddParamsToCG(cg); + transform_encoded = parameter(*cg, ptransform_encoded); + transform_encoded_bias = parameter(*cg, ptransform_encoded_bias); + } + + void TransformEncodedInputForDecoding(Expression* encoded_input) const { + return; + *encoded_input = affine_transform( + {transform_encoded_bias, transform_encoded, *encoded_input}); + } + + void EncodeInputAndTransform(const vector& inputs, + Expression* encoded_input_vec, + ComputationGraph* cg) const { + vector input_vecs; + for (const unsigned& input_id : inputs) { + input_vecs.push_back(lookup(*cg, char_vecs, input_id)); + } + + // Running the encoder now. + encoder.EncodeInputIntoVector(input_vecs, encoded_input_vec); + + // Transform it to feed it into the decoder + TransformEncodedInputForDecoding(encoded_input_vec); + } + + float Train(const vector& inputs, const vector& outputs, + Model *m, AdadeltaTrainer* ada_gd) { + ComputationGraph cg; + AddParamsToCG(&cg); + + // Encode and Transofrm to feed into decoder + Expression encoded_input_vec; + EncodeInputAndTransform(inputs, &encoded_input_vec, &cg); + + // Use this encoded word vector to predict the transformed word + vector input_vecs_for_dec; + vector output_ids_for_pred; + for (unsigned i = 0; i < outputs.size(); ++i) { + if (i < outputs.size() - 1) { + // '' will not be fed as input -- it needs to be predicted. + input_vecs_for_dec.push_back(concatenate( + {encoded_input_vec, lookup(cg, char_vecs, outputs[i])})); + } + if (i > 0) { // '' will not be predicted in the output -- its fed in. + output_ids_for_pred.push_back(outputs[i]); + } + } + + vector dec_hidden_units; + decoder.GetAllHiddenUnits(input_vecs_for_dec, &dec_hidden_units); + Expression loss = decoder.ComputeLoss(dec_hidden_units, output_ids_for_pred); + + float return_loss = as_scalar(cg.forward()); + cg.backward(); + ada_gd->update(1.0f); + return return_loss; + } + + void Predict(vector& inputs, + unordered_map& char_to_id, + vector* outputs) { + ComputationGraph cg; + AddParamsToCG(&cg); + + // Encode and Transofrm to feed into decoder + Expression encoded_input_vec; + EncodeInputAndTransform(inputs, &encoded_input_vec, &cg); + + // Make preditions using the decoder. + decoder.DecodeUntilTermFound(encoded_input_vec, char_vecs, char_to_id, + outputs, &cg); } }; @@ -223,11 +315,10 @@ int main(int argc, char** argv) { unsigned char_size = atoi(argv[4]); unsigned hidden_size = atoi(argv[5]); unsigned num_iter = atoi(argv[6]); - vector ZERO(hidden_size, 0.0f); Model m; float regularization_strength = 1e-6f; - AdadeltaTrainer sgd(&m, regularization_strength); + AdadeltaTrainer ada_gd(&m, regularization_strength); MorphTrans nn(char_size, hidden_size, vocab_size, &m); // Read the training file and train the model @@ -235,56 +326,24 @@ int main(int argc, char** argv) { ifstream train_file(train_filename); if (train_file.is_open()) { string line; - double loss = 0; + float loss = 0; while (getline(train_file, line)) { chars = split_line(line, ' '); - - ComputationGraph cg; - nn.AddParamsToCG(&cg); - - vector input_vecs; - vector target_vecs; - vector target_ids; - input_vecs.clear(); target_vecs.clear(); target_ids.clear(); + vector input_ids, target_ids; + input_ids.clear(); target_ids.clear(); bool reading_target = false; for (const string& ch : chars) { - input_vecs.push_back(lookup(cg, nn.char_vecs, char_to_id[ch])); + input_ids.push_back(char_to_id[ch]); if (reading_target) { - target_vecs.push_back(lookup(cg, nn.char_vecs, char_to_id[ch])); target_ids.push_back(char_to_id[ch]); } if (ch == EOW) { reading_target = true; } } - - // Read the input char vectors and obtain word representation - Expression encoded_input_word_vec; - Expression h = input(cg, {hidden_size}, &ZERO); - nn.encoder.EncodeInputIntoVector(input_vecs, h, h, &encoded_input_word_vec); - - // Use this encoded word vector to predict the transformed word - // The input will not include '' - vector input_target_vecs; - for (unsigned i = 0; i < target_vecs.size() - 1; ++i) { - input_target_vecs.push_back(concatenate({encoded_input_word_vec, - target_vecs[i]})); - } - - // The output will not include '' - vector output_target_ids; - for (unsigned i = 1; i < target_ids.size(); ++i) { - output_target_ids.push_back(target_ids[i]); - } - - vector pred_target_vecs; - nn.decoder.GetAllHiddenUnits(input_target_vecs, h, h, &pred_target_vecs); - Expression e = nn.decoder.ComputeLoss(pred_target_vecs, output_target_ids); - loss += as_scalar(cg.forward()); - cg.backward(); - sgd.update(1.0f); + loss += nn.Train(input_ids, target_ids, &m, &ada_gd); } - cerr << "Iter " << iter << " nllh: " << loss << endl; + cerr << "Iter " << iter + 1 << " nllh: " << loss << endl; train_file.close(); } else { cerr << "Failed to open the file" << endl; @@ -297,28 +356,17 @@ int main(int argc, char** argv) { string line; while (getline(test_file, line)) { chars = split_line(line, ' '); - - ComputationGraph cg; - nn.AddParamsToCG(&cg); - - vector input_vecs; + vector input_ids, target_ids; vector pred_target_ids; - input_vecs.clear(); pred_target_ids.clear(); - cerr << "Input: "; + input_ids.clear(); pred_target_ids.clear(); + cerr << "Input: " << line; for (const string& ch : chars) { - input_vecs.push_back(lookup(cg, nn.char_vecs, char_to_id[ch])); - cerr << ch; + input_ids.push_back(char_to_id[ch]); } - cerr << endl; // Read the input char vectors and obtain word representation - Expression encoded_input_word_vec; - Expression h = input(cg, {hidden_size}, &ZERO); - nn.encoder.EncodeInputIntoVector(input_vecs, h, h, &encoded_input_word_vec); - nn.decoder.DecodeUntilTermFound(encoded_input_word_vec, char_to_id[EOW], - nn.char_vecs, char_to_id, h, h, - &pred_target_ids, &cg); + nn.Predict(input_ids, char_to_id, &pred_target_ids); cerr << "Output: "; - for (unsigned i = 0; i < pred_target_ids.size() - 1; ++i) { + for (unsigned i = 0; i < pred_target_ids.size(); ++i) { cerr << id_to_char[pred_target_ids[i]]; } cerr << endl; From bce47b2c275cc104230b650b6224c946e4ff83e7 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 11 Oct 2015 22:34:22 -0400 Subject: [PATCH 264/965] more seg bi rnns --- cnn/nodes.cc | 15 +++++++++++---- cnn/nodes.h | 1 + examples/segrnn-sup.cc | 36 +++++++++++++++++++++++++++--------- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 546c4f351..45706db35 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -370,17 +370,24 @@ EIGEN_STRONG_INLINE float logsumexp(const T& x) { return m + logf(z); } +// this i need to do something better, but this is a work-around +// if this is too small, just make it bigger +#define MAX_LOG_SUM_EXP 65536 +size_t LogSumExp::aux_storage_size() const { + return MAX_LOG_SUM_EXP * sizeof(float); +} + void LogSumExp::forward(const vector& xs, Tensor& fx) const { const unsigned num_args = xs.size(); if (num_args == 1) { fx.v = xs[0]->v; return; } - // TODO implement so as to avoid underflow - Eigen::Matrix v(xs.size(), 1); for (unsigned i = 0; i < xs.size(); ++i) - v(i,0) = (**xs[i])(0,0); - fx.v[0] = logsumexp(v); + static_cast(aux_mem)[i] = (**xs[i])(0,0); + Dim r = {(int)xs.size()}; + Tensor v(r, static_cast(aux_mem)); + fx.v[0] = logsumexp(*v); } void LogSumExp::backward(const vector& xs, diff --git a/cnn/nodes.h b/cnn/nodes.h index e634c68a1..9ceb19b2b 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -489,6 +489,7 @@ struct LogSumExp : public Node { template explicit LogSumExp(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + size_t aux_storage_size() const override; void forward(const std::vector& xs, Tensor& fx) const override; void backward(const std::vector& xs, const Tensor& fx, diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index 28521e163..e82dbc815 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -21,15 +21,15 @@ using namespace std; using namespace cnn; unsigned LAYERS = 1; -unsigned INPUT_DIM = 64; -unsigned XCRIBE_DIM = 64; -unsigned SEG_DIM = 32; -unsigned H1DIM = 48; -unsigned H2DIM = 36; -unsigned TAG_DIM = 16; +unsigned INPUT_DIM = 24; +unsigned XCRIBE_DIM = 24; +unsigned SEG_DIM = 16; +unsigned H1DIM = 24; +unsigned H2DIM = 18; +unsigned TAG_DIM = 8; unsigned TAG_SIZE = 0; unsigned VOCAB_SIZE = 0; -unsigned DURATION_DIM = 8; +unsigned DURATION_DIM = 4; bool eval = false; cnn::Dict d; @@ -425,8 +425,8 @@ int main(int argc, char** argv) { ia >> model; } - unsigned report_every_i = 50; - unsigned dev_every_i_reports = 25; + unsigned report_every_i = 10; + unsigned dev_every_i_reports = 5; unsigned si = training.size(); vector order(training.size()); for (unsigned i = 0; i < order.size(); ++i) order[i] = i; @@ -459,6 +459,24 @@ int main(int argc, char** argv) { } sgd->status(); cerr << " E = " << (loss / ttags) << " ppl=" << exp(loss / ttags) << " (acc=" << (correct / ttags) << ") "; + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + unsigned dtags = 0; + for (auto& sent : dev) { + ComputationGraph cg; + crf.SupervisedLoss(sent.first, sent.second, cg); + dtags += sent.second.size(); + dloss += as_scalar(cg.forward()); + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dtags) << " ppl=" << exp(dloss / dtags) << ' '; + } } delete sgd; } From af137e8bf820d9ce49a013d8c21b45595908e73c Mon Sep 17 00:00:00 2001 From: Lingpeng Kong Date: Mon, 12 Oct 2015 20:02:19 -0400 Subject: [PATCH 265/965] dict freeze bug, handle oov in dev-test --- cnn/dict.h | 75 +++++++++++++++++++++++++++++------------------------ cnn/exec.cc | 2 +- cnn/init.cc | 4 +-- 3 files changed, 44 insertions(+), 37 deletions(-) diff --git a/cnn/dict.h b/cnn/dict.h index 47a07041c..025f3b70d 100644 --- a/cnn/dict.h +++ b/cnn/dict.h @@ -18,8 +18,8 @@ namespace cnn { -class Dict { - typedef std::unordered_map Map; + class Dict { + typedef std::unordered_map Map; public: Dict() : frozen(false), map_unk(false), unk_id(-1) { } @@ -36,37 +36,44 @@ class Dict { auto i = d_.find(word); if (i == d_.end()) { if (frozen) { - if (map_unk) { - return unk_id; - } - else { - std::cerr << "Unknown word encountered: " << word << std::endl; - throw std::runtime_error("Unknown word encountered in frozen dictionary: " + word); - } - } - words_.push_back(word); - return d_[word] = words_.size() - 1; - } else { - return i->second; - } + if (map_unk) { + return unk_id; + } + else { + std::cerr << map_unk << std::endl; + std::cerr << "Unknown word encountered: " << word << std::endl; + throw std::runtime_error("Unknown word encountered in frozen dictionary: " + word); + } + } + words_.push_back(word); + return d_[word] = words_.size() - 1; + } else { + return i->second; } +} - inline const std::string& Convert(const int& id) const { - assert(id < (int)words_.size()); - return words_[id]; - } +inline const std::string& Convert(const int& id) const { + assert(id < (int)words_.size()); + return words_[id]; +} - void SetUnk(const std::string& word) { - if (!frozen) - throw std::runtime_error("Please call SetUnk() only after dictionary is frozen"); - - unk_id = Convert(word); - map_unk = true; - } +void SetUnk(const std::string& word) { + if (!frozen) + throw std::runtime_error("Please call SetUnk() only after dictionary is frozen"); + if (map_unk) + throw std::runtime_error("Set UNK more than one time"); + + // temporarily unfrozen the dictionary to allow the add of the UNK + frozen = false; + unk_id = Convert(word); + frozen = true; - void clear() { words_.clear(); d_.clear(); } + map_unk = true; +} - private: +void clear() { words_.clear(); d_.clear(); } + +private: bool frozen; bool map_unk; // if true, map unknown word to unk_id int unk_id; @@ -76,12 +83,12 @@ class Dict { #if BOOST_VERSION >= 105600 friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { - ar & frozen; - ar & map_unk; - ar & unk_id; - ar & words_; - ar & d_; - } + ar & frozen; + ar & map_unk; + ar & unk_id; + ar & words_; + ar & d_; +} #endif }; diff --git a/cnn/exec.cc b/cnn/exec.cc index fe868c340..90d5e727b 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -65,7 +65,7 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex node_max_ if (aux_size) { aux_mem = fxs->allocate(aux_size); if (!aux_mem) { - cerr << "out of memory\n"; + cerr << "aux out of memory\n"; abort(); } } diff --git a/cnn/init.cc b/cnn/init.cc index 1bb77ebef..ddcff3398 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -38,8 +38,8 @@ void Initialize(int& argc, char**& argv, unsigned random_seed) { } rndeng = new mt19937(random_seed); cerr << "Allocating memory...\n"; - fxs = new AlignedMemoryPool(512UL*(1UL<<20)); - dEdfs = new AlignedMemoryPool(512UL*(1UL<<20)); + fxs = new AlignedMemoryPool(512UL*(1UL<<24)); + dEdfs = new AlignedMemoryPool(512UL*(1UL<<24)); cerr << "Done.\n"; } From c6b4efad23e876b3a0ee406ab24b3122dd91c677 Mon Sep 17 00:00:00 2001 From: Lingpeng Kong Date: Mon, 12 Oct 2015 20:07:05 -0400 Subject: [PATCH 266/965] mem --- cnn/init.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/init.cc b/cnn/init.cc index ddcff3398..1bb77ebef 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -38,8 +38,8 @@ void Initialize(int& argc, char**& argv, unsigned random_seed) { } rndeng = new mt19937(random_seed); cerr << "Allocating memory...\n"; - fxs = new AlignedMemoryPool(512UL*(1UL<<24)); - dEdfs = new AlignedMemoryPool(512UL*(1UL<<24)); + fxs = new AlignedMemoryPool(512UL*(1UL<<20)); + dEdfs = new AlignedMemoryPool(512UL*(1UL<<20)); cerr << "Done.\n"; } From fc3c4579c59d2f16e76334a1b24dafcc29c00e73 Mon Sep 17 00:00:00 2001 From: Lingpeng Kong Date: Mon, 12 Oct 2015 20:09:45 -0400 Subject: [PATCH 267/965] handle dev-test oov --- examples/segrnn-sup.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index e82dbc815..d1bd616d6 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -394,6 +394,9 @@ int main(int argc, char** argv) { } d.Freeze(); // no new word types allowed td.Freeze(); // no new tag types allowed + + d.SetUnk(""); // set UNK to allow the unseen character in the dev and test set + cerr << "Reading dev data from " << argv[2] << "...\n"; { ifstream in(argv[2]); From e2eec896ac680a48449c645c19e02581771e79c8 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 12 Oct 2015 20:28:38 -0400 Subject: [PATCH 268/965] let binary log loss deal with vectors rather just scalars --- cnn/functors.h | 6 ++++-- cnn/nodes.cc | 13 +++---------- cnn/nodes.h | 4 ++-- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/cnn/functors.h b/cnn/functors.h index 5c32217aa..1137a8eb1 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -302,10 +302,12 @@ struct FBinaryLogLoss { }; struct FBinaryLogLossBackward { - CNN_DEVICE_FUNC inline float operator()(float x, float x_true, float d) const { - float scale = (x_true > 0.f) ? -x_true/x : (1.f-x_true)/(1.-x); + explicit FBinaryLogLossBackward(float d) : d(d) {} + CNN_DEVICE_FUNC inline float operator()(float x, float x_true) const { + float scale = (x_true > 0.f) ? -x_true/x : (1.f-x_true)/(1.f-x); return d * scale; } + float d; }; } // namespace cnn diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 45706db35..eb9df747a 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -517,7 +517,7 @@ void Cube::backward(const vector& xs, Tensor& dEdxi) const { auto x = **xs[0]; *dEdxi += (*dEdf).cwiseProduct(x.cwiseProduct(x)) * 3; -}; +} void Exp::forward(const vector& xs, Tensor& fx) const { auto x = **xs[0]; @@ -1275,13 +1275,8 @@ void SoftSign::backward(const vector& xs, *dEdxi += (*fx).binaryExpr(*dEdf, FSoftSignBackward()); } -// you could do this with LogisticSigmoid, Softmax or a variety of other -// functions, but this is often useful. -// x_1 must be a scalar that is a value between 0 and 1 -// target_y is a value between 0 and 1 -// y = ty * log(x_1) + (1 - ty) * log(x_1) void BinaryLogLoss::forward(const vector& xs, Tensor& fx) const { - fx.v[0] = FBinaryLogLoss()(xs[0]->v[0], xs[1]->v[0]); + *fx = (**xs[0]).binaryExpr(**xs[1], FBinaryLogLoss()); } void BinaryLogLoss::backward(const vector& xs, @@ -1289,9 +1284,7 @@ void BinaryLogLoss::backward(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - const auto y_pred = xs[i]->v[0]; - const auto ty = xs[1-i]->v[0]; - dEdxi.v[0] += FBinaryLogLossBackward()(y_pred,ty,dEdf.v[0]); + *dEdxi += (**xs[i]).binaryExpr(**xs[1-i], FBinaryLogLossBackward(dEdf.v[0])); } } // namespace cnn diff --git a/cnn/nodes.h b/cnn/nodes.h index 9ceb19b2b..537d7f84c 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -468,8 +468,8 @@ struct Rectify : public Node { // you could do this with LogisticSigmoid, Softmax or a variety of other // functions, but this is often useful. -// x_1 must be a scalar that is a value between 0 and 1 -// x_2 (ty) must be a scalar that is a value between 0 and 1 +// x_1 must be a vector with values between 0 and 1 +// target_y is an equivalently sized vector w values between 0 and 1 // y = ty * log(x_1) + (1 - ty) * log(x_1) struct BinaryLogLoss : public Node { BinaryLogLoss(const std::initializer_list& a) : Node(a) {} From c2b06bf5bd68d35e2ef94e1fd9db92eda5f2369f Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 12 Oct 2015 21:21:57 -0400 Subject: [PATCH 269/965] fix bug --- cnn/nodes.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index eb9df747a..b5fccdc22 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1276,7 +1276,15 @@ void SoftSign::backward(const vector& xs, } void BinaryLogLoss::forward(const vector& xs, Tensor& fx) const { - *fx = (**xs[0]).binaryExpr(**xs[1], FBinaryLogLoss()); + auto x = *xs[0]; + auto y = *xs[1]; + const FBinaryLogLoss bll; + const size_t s = x.d.size(); + float dist = 0; + for (size_t i = 0; i < s; ++i) + dist += bll(x.v[i], y.v[i]); + fx.v[0] = dist; +// *fx = (**xs[0]).binaryExpr(**xs[1], FBinaryLogLoss()); } void BinaryLogLoss::backward(const vector& xs, From c709baae329f0a1da9c5d732bd392aead72ccc23 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 12 Oct 2015 23:24:27 -0400 Subject: [PATCH 270/965] fix underflow/overflow errors in binary cross-entropy --- cnn/functors.h | 78 +++++++++++++------------------------------------ cnn/nodes.cc | 7 ++--- cnn/training.cc | 4 +++ 3 files changed, 28 insertions(+), 61 deletions(-) diff --git a/cnn/functors.h b/cnn/functors.h index 1137a8eb1..d2221479c 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -14,53 +14,6 @@ // if you need a new elementwise (nullary, unary, binary...) // functor, this is the place for it -#define cast_uint32_t static_cast - -// THIS CODE IS BROKEN- sometimes it returns NaN -// it is commented out for this reason -static inline float fastpow2 (float p) { - float offset = (p < 0) ? 1.0f : 0.0f; - float clipp = (p < -126) ? -126.0f : p; - int w = clipp; - float z = clipp - w + offset; - union { uint32_t i; float f; } v = { cast_uint32_t ( (1 << 23) * (clipp + 121.2740575f + 27.7280233f / (4.84252568f - z) - 1.49012907f * z) ) }; - - return v.f; -} - -#if 1 -#if 0 -static inline float fastexp (float p) { - return fastpow2 (1.442695040f * p); -} -#else -static inline float fastexp (float p) { - return exp(p); -} -#endif -#else -// Schraudolph version, but it's a bit crappy in terms of -// performance and not that much faster -#define EXPAF (8388608 / 0.6931471806f) -static inline float fastexp (float p) { - union { float f; int32_t i; } eco; - eco.i = (int32_t)(EXPAF * (p)) + 1065353216; - return eco.f; -} -#endif - -#if defined(__GNU_LIBRARY__) && (__GLIBC__ == 2) && (__GLIBC_MINOR__ < 14) && !defined(HAVE_CUDA) -#define USE_FASTEXP -#else -#undef USE_FASTEXP -#endif - -#ifdef USE_FASTEXP -#define CNN_EXPF fastexp -#else -#define CNN_EXPF expf -#endif - namespace cnn { struct FHuberForward { @@ -136,7 +89,7 @@ struct FTanh { float b = 135135.0f + x2 * (62370.0f + x2 * (3150.0f + x2 * 28.0f)); return a / b; #else - return tanhf(x); + return tanhf(x); #endif } }; @@ -177,7 +130,7 @@ struct FRectifyNegateBackward { struct FSoftmaxNormalize { explicit FSoftmaxNormalize(float logz) : logz(logz) {} CNN_DEVICE_FUNC inline float operator()(float x) const { - return CNN_EXPF(x - logz); + return expf(x - logz); } float logz; }; @@ -193,7 +146,7 @@ struct FSoftmaxBackward { struct FNegLogSoftmaxBackward { FNegLogSoftmaxBackward(float lz, float err) : logz(lz), d(err) {} CNN_DEVICE_FUNC inline float operator()(float t) const { - return CNN_EXPF(t - logz) * d; + return expf(t - logz) * d; } float logz; float d; @@ -202,7 +155,7 @@ struct FNegLogSoftmaxBackward { struct FPtrNegLogSoftmaxBackward { FPtrNegLogSoftmaxBackward(const float* lz, const float* err) : logz(lz), d(err) {} CNN_DEVICE_FUNC inline float operator()(float t) const { - return CNN_EXPF(t - *logz) * *d; + return expf(t - *logz) * *d; } const float* logz; const float* d; @@ -218,14 +171,14 @@ struct FLogSoftmaxNormalize { struct FWeightedError { float operator()(float t, float d) const { - return CNN_EXPF(t) * d / CNN_EXPF(t); + return expf(t) * d / expf(t); } }; struct FLogSoftmaxBackward { explicit FLogSoftmaxBackward(float off_diag_sum) : off_diag_sum(off_diag_sum) {} CNN_DEVICE_FUNC inline float operator()(float t, float d) const { - return off_diag_sum * CNN_EXPF(t) + d; + return off_diag_sum * expf(t) + d; //return (off_diag_sum + d) * t; } float off_diag_sum; @@ -252,7 +205,7 @@ struct FSoftSignBackward { struct FLogisticSigmoid { CNN_DEVICE_FUNC inline float operator()(float x) const { - return 1.f / (1.f + CNN_EXPF(-x)); + return 1.f / (1.f + expf(-x)); } }; @@ -290,12 +243,16 @@ struct FL2SGDUpdate { struct FBinaryLogLoss { CNN_DEVICE_FUNC inline float operator()(float x, float x_true) const { if (x_true == 1.f) { + if (x == 0.f) x = std::numeric_limits::min(); return -1.f * x_true * log(x); } else if (x_true == 0.f) { - return -1.f * (1.f - x_true) * log1p(-x); + if (x == 1.f) x = std::numeric_limits::min(); + return (x_true - 1.f) * log1p(-x); } else { + if (x == 0.f) x = std::numeric_limits::min(); + if (x == 1.f) x = std::numeric_limits::min(); return -1.f * (x_true * log(x) + (1.f - x_true) * log1p(-x)); } } @@ -304,8 +261,15 @@ struct FBinaryLogLoss { struct FBinaryLogLossBackward { explicit FBinaryLogLossBackward(float d) : d(d) {} CNN_DEVICE_FUNC inline float operator()(float x, float x_true) const { - float scale = (x_true > 0.f) ? -x_true/x : (1.f-x_true)/(1.f-x); - return d * scale; + if (x == x_true) return 0; + if (x == 0.f) x = std::numeric_limits::min(); + if (x == 1.f) x = 0.9999999f; + if (x_true == 1.f) { + return d * -x_true / x; + } else if (x_true == 0.f) { + return d * (1.f - x_true) / (1.f - x); + } + return d * ((1.f - x_true) / (1.f - x) + (-x_true / x)); } float d; }; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index b5fccdc22..7b9177923 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -366,7 +366,7 @@ EIGEN_STRONG_INLINE float logsumexp(const T& x) { const float m = x.maxCoeff(); float z = 0; for (unsigned i = 0; i < x.rows(); ++i) - z += CNN_EXPF(x(i,0) - m); + z += expf(x(i,0) - m); return m + logf(z); } @@ -852,7 +852,7 @@ EIGEN_STRONG_INLINE real logsumexp(const T& x, const vector& denom) { } real z = 0; for (auto i : denom) - z += CNN_EXPF(x(i,0) - m); + z += expf(x(i,0) - m); return m + logf(z); } @@ -880,7 +880,7 @@ void RestrictedLogSoftmax::backward(const vector& xs, for (auto ind : denom) z += (*dEdf)(ind, 0); for (auto ind : denom) - (*dEdxi)(ind, 0) += (*dEdf)(ind, 0) - CNN_EXPF((*fx)(ind, 0)) * z; + (*dEdxi)(ind, 0) += (*dEdf)(ind, 0) - expf((*fx)(ind, 0)) * z; } // x_1 is a vector @@ -1284,7 +1284,6 @@ void BinaryLogLoss::forward(const vector& xs, Tensor& fx) const { for (size_t i = 0; i < s; ++i) dist += bll(x.v[i], y.v[i]); fx.v[0] = dist; -// *fx = (**xs[0]).binaryExpr(**xs[1], FBinaryLogLoss()); } void BinaryLogLoss::backward(const vector& xs, diff --git a/cnn/training.cc b/cnn/training.cc index 93111f66d..3037c0add 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -12,6 +12,10 @@ float Trainer::clip_gradients() { float gscale = 1; if (clipping_enabled) { float gg = model->gradient_l2_norm(); + if (isnan(gg) || isinf(gg)) { + cerr << "Magnitude of gradient is bad: " << gg << endl; + abort(); + } if (gg > clip_threshold) { ++clips; gscale = clip_threshold / gg; From 0593b55269aeb6ddc7b0b60fa1a432950f9fce4e Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 12 Oct 2015 23:30:22 -0400 Subject: [PATCH 271/965] one more rng --- cnn/tensor.cc | 7 +++++++ cnn/tensor.h | 1 + 2 files changed, 8 insertions(+) diff --git a/cnn/tensor.cc b/cnn/tensor.cc index 3cdc1b03a..f7b44ff25 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -122,6 +122,13 @@ real rand01() { return distribution(*rndeng); } +int rand0n(int n) { + assert(n > 0); + int x = rand01() * n; + while(n == x) { x = rand01() * n; } + return x; +} + real rand_normal() { normal_distribution distribution(0, 1); return distribution(*rndeng); diff --git a/cnn/tensor.h b/cnn/tensor.h index 5517dfda0..cdd0e1be6 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -102,6 +102,7 @@ struct TensorTools { static void CopyElements(const Tensor& v, const Tensor& v_src); }; real rand01(); +int rand0n(int n); real rand_normal(); } // namespace cnn From 613edaba5f3f8f0253e436c021b5f7bd2307823c Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 13 Oct 2015 02:15:58 -0400 Subject: [PATCH 272/965] make rnn code take advantage of eigen speedup --- cnn/nodes.cc | 21 ++++++++++++++------- cnn/rnn.cc | 12 ++++++++---- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 7b9177923..e3b17118f 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -475,7 +475,8 @@ void Tanh::forward(const vector& xs, Tensor& fx) const { gpu::vtanh(fx.d.size(), xs[0]->v, fx.v); #else auto x = **xs[0]; - *fx = x.unaryExpr(FTanh()); + (*fx).array() = x.array().tanh(); +// *fx = x.unaryExpr(FTanh()); #endif } @@ -493,7 +494,7 @@ void Tanh::backward(const vector& xs, void Square::forward(const vector& xs, Tensor& fx) const { auto x = **xs[0]; - *fx = x.cwiseProduct(x); + (*fx).array() = x.array().square(); } void Square::backward(const vector& xs, @@ -507,7 +508,7 @@ void Square::backward(const vector& xs, void Cube::forward(const vector& xs, Tensor& fx) const { auto x = **xs[0]; - *fx = x.cwiseProduct(x).cwiseProduct(x); + (*fx).array() = x.array().cube(); } void Cube::backward(const vector& xs, @@ -516,7 +517,8 @@ void Cube::backward(const vector& xs, unsigned i, Tensor& dEdxi) const { auto x = **xs[0]; - *dEdxi += (*dEdf).cwiseProduct(x.cwiseProduct(x)) * 3; +// *dEdxi += (*dEdf).cwiseProduct(x.cwiseProduct(x)) * 3; + (*dEdxi).array() += (*dEdf).array() * x.array().square() * 3; } void Exp::forward(const vector& xs, Tensor& fx) const { @@ -1063,9 +1065,14 @@ void AffineTransform::forward(const vector& xs, Tensor& fx) const CUDAMatrixMultiply(*xs[i], *xs[i + 1], fx, (i == 1) ? kSCALAR_ZERO : kSCALAR_ONE); CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v, 1, fx.v, 1)); #else - (*fx) = **xs[0]; - for (unsigned i = 1; i < xs.size(); i += 2) - (*fx).noalias() += (**xs[i]) * (**xs[i + 1]); + if (xs.size() == 3) { + // size 3 is optimized in newer versions of eigen + (*fx).noalias() = **xs[0] + **xs[1] * **xs[2]; + } else { + (*fx) = **xs[0]; + for (unsigned i = 1; i < xs.size(); i += 2) + (*fx).noalias() += (**xs[i]) * (**xs[i + 1]); + } #endif } } diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 2cf093d6b..85d5de2b9 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -6,6 +6,7 @@ #include #include "cnn/nodes.h" +#include "cnn/expr.h" using namespace std; using namespace cnn::expr; @@ -71,13 +72,16 @@ Expression SimpleRNNBuilder::add_input_impl(int prev, const Expression &in) { for (unsigned i = 0; i < layers; ++i) { const vector& vars = param_vars[i]; + // y <--- f(x) Expression y = affine_transform({vars[2], vars[0], x}); + // y <--- g(y_prev) if (prev == -1 && h0.size() > 0) - y = y + vars[1] * h0[i]; + y = affine_transform({y, vars[1], h0[i]}); else if (prev >= 0) - y = y + vars[1] * h[prev][i]; + y = affine_transform({y, vars[1], h[prev][i]}); + // x <--- tanh(y) x = h[t][i] = tanh(y); } return h[t].back(); @@ -96,9 +100,9 @@ Expression SimpleRNNBuilder::add_auxiliary_input(const Expression &in, const Exp Expression y = affine_transform({vars[HB], vars[X2H], x, vars[L2H], aux}); if (t == 0 && h0.size() > 0) - y = y + vars[H2H] * h0[i]; + y = affine_transform({y, vars[H2H], h0[i]}); else if (t >= 1) - y = y + vars[H2H] * h[t-1][i]; + y = affine_transform({y, vars[H2H], h[t-1][i]}); x = h[t][i] = tanh(y); } From 9c31d683b66587cdec23cbae66f1a96de946f992 Mon Sep 17 00:00:00 2001 From: Waleed Ammar Date: Wed, 14 Oct 2015 11:57:32 -0400 Subject: [PATCH 273/965] bugfix: RNNBuilder::back() should use state "cur" to index the vector of hidden states "h" --- cnn/gru.h | 2 +- cnn/lstm.h | 2 +- cnn/rnn.h | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cnn/gru.h b/cnn/gru.h index 4fee9b716..3200ef07b 100644 --- a/cnn/gru.h +++ b/cnn/gru.h @@ -14,7 +14,7 @@ struct GRUBuilder : public RNNBuilder { unsigned input_dim, unsigned hidden_dim, Model* model); - Expression back() const override { return h.back().back(); } + Expression back() const override { return (cur == -1? h0.back() : h[cur].back()); } std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } std::vector final_s() const override { return final_h(); } unsigned num_h0_components() const override { return layers; } diff --git a/cnn/lstm.h b/cnn/lstm.h index b73627424..086a09e91 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -18,7 +18,7 @@ struct LSTMBuilder : public RNNBuilder { unsigned hidden_dim, Model* model); - Expression back() const override { return h.back().back(); } + Expression back() const override { return (cur == -1? h0.back() : h[cur].back()); } std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } std::vector final_s() const override { std::vector ret = (c.size() == 0 ? c0 : c.back()); diff --git a/cnn/rnn.h b/cnn/rnn.h index e761872c7..eac7af58e 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -83,10 +83,10 @@ struct RNNBuilder { virtual void new_graph_impl(ComputationGraph& cg) = 0; virtual void start_new_sequence_impl(const std::vector& h_0) = 0; virtual Expression add_input_impl(int prev, const Expression& x) = 0; + RNNPointer cur; private: // the state machine ensures that the caller is behaving RNNStateMachine sm; - RNNPointer cur; std::vector head; // head[i] returns the head position }; @@ -106,7 +106,7 @@ struct SimpleRNNBuilder : public RNNBuilder { public: Expression add_auxiliary_input(const Expression& x, const Expression &aux); - Expression back() const override { return h.back().back(); } + Expression back() const override { return (cur == -1? h0.back() : h[cur].back()); } std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } std::vector final_s() const override { return final_h(); } void copy(const RNNBuilder & params) override; From cd6d0e568e08701d0297748a542627e8fea3ab07 Mon Sep 17 00:00:00 2001 From: Waleed Ammar Date: Wed, 14 Oct 2015 12:02:13 -0400 Subject: [PATCH 274/965] Add an explicit Model::reset_gradient() method. Useful if the gradient is contaminated with nans (which rarely happens). --- cnn/model.cc | 5 +++++ cnn/model.h | 1 + cnn/nodes.cc | 1 - 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cnn/model.cc b/cnn/model.cc index b519fe04a..190cad410 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -203,4 +203,9 @@ LookupParameters* Model::add_lookup_parameters(unsigned n, const Dim& d) { return p; } +void Model::reset_gradient() { + for (auto p : params) { p->clear(); } + for (auto p : lookup_params) { p->clear(); } +} + } // namespace cnn diff --git a/cnn/model.h b/cnn/model.h index 680ccfe30..e50b12459 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -103,6 +103,7 @@ class Model { Model() : gradient_norm_scratch() {} ~Model(); float gradient_l2_norm() const; + void reset_gradient(); // set scale to use custom initialization Parameters* add_parameters(const Dim& d, float scale = 0.0f); LookupParameters* add_lookup_parameters(unsigned n, const Dim& d); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index e3b17118f..b9cb853de 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -476,7 +476,6 @@ void Tanh::forward(const vector& xs, Tensor& fx) const { #else auto x = **xs[0]; (*fx).array() = x.array().tanh(); -// *fx = x.unaryExpr(FTanh()); #endif } From 8a49db539585bb5e9a60507f398b4b54ab4c33d9 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 14 Oct 2015 21:27:13 -0400 Subject: [PATCH 275/965] fix possible compile error --- cnn/nodes.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index b9cb853de..18358203c 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1284,7 +1284,7 @@ void SoftSign::backward(const vector& xs, void BinaryLogLoss::forward(const vector& xs, Tensor& fx) const { auto x = *xs[0]; auto y = *xs[1]; - const FBinaryLogLoss bll; + FBinaryLogLoss bll; const size_t s = x.d.size(); float dist = 0; for (size_t i = 0; i < s; ++i) From 97d1b57cedf0d5a234f7fa91607795c58ab6bb5a Mon Sep 17 00:00:00 2001 From: Waleed Ammar Date: Wed, 14 Oct 2015 21:44:18 -0400 Subject: [PATCH 276/965] Update TODO.cnn --- TODO.cnn | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.cnn b/TODO.cnn index 9d7b59761..6ac8b5ee2 100644 --- a/TODO.cnn +++ b/TODO.cnn @@ -22,6 +22,7 @@ tests/ [volunteer!!!] * we need to report very clear, detailed runtime on lots of things. in PARTICULAR: big M-v and M-M products, but also softmax. these should be as close to the "user expr.h API" as possible since we want the these tests to be stable. * we should have a separate mechanism for testing nodes in isolation, make sure fx can deal with non-zero numbers, make sure dEdxi does the right thing with non-zero numbers (different than fx!). * we should have one example that calls the fin diff gradient checker on a non-trivial example + * TODO(wammar): test the basic functionality of LSTMs. cnn/tensor.* [volunteer!!!] * big change: start using the CNN multidim tensor library when it makes sense From cfca0172cae215b5bd3a6b9f6777d492ad258c5b Mon Sep 17 00:00:00 2001 From: Manaal Faruqui Date: Mon, 19 Oct 2015 16:02:24 -0400 Subject: [PATCH 277/965] Encoder decoder with separate parameters for all morph --- examples/sep_morph.cc | 348 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 348 insertions(+) create mode 100644 examples/sep_morph.cc diff --git a/examples/sep_morph.cc b/examples/sep_morph.cc new file mode 100644 index 000000000..13bd8d70d --- /dev/null +++ b/examples/sep_morph.cc @@ -0,0 +1,348 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/rnn.h" +#include "cnn/gru.h" +#include "cnn/lstm.h" +#include "cnn/training.h" +#include "cnn/gpu-ops.h" +#include "cnn/expr.h" + +#include +#include + +#include +#include +#include +#include + +using namespace std; +using namespace cnn; +using namespace cnn::expr; + +string BOW = "", EOW = ""; +unsigned MAX_PRED_LEN = 100; + +vector split_line(const string& line, char delim) { + vector words; + stringstream ss(line); + string item; + while (std::getline(ss, item, delim)) { + if (!item.empty()) + words.push_back(item); + } + return words; +} + +template +class MorphTrans { + public: + Builder input_forward, input_backward, output_forward; + LookupParameters* char_vecs; + + Expression hidden_to_output, hidden_to_output_bias; + Parameters *phidden_to_output, *phidden_to_output_bias; + + Expression transform_encoded, transform_encoded_bias; + Parameters *ptransform_encoded, *ptransform_encoded_bias; + + MorphTrans(const int& char_length, const int& hidden_length, + const int& vocab_length, const int& layers, Model *m) : + input_forward(layers, char_length, hidden_length, m), + input_backward(layers, char_length, hidden_length, m), + output_forward(layers, char_length + hidden_length, hidden_length, m) { + char_vecs = m->add_lookup_parameters(vocab_length, {char_length}); + + phidden_to_output = m->add_parameters({vocab_length, hidden_length}); + phidden_to_output_bias = m->add_parameters({vocab_length, 1}); + + ptransform_encoded = m->add_parameters({hidden_length, 2 * hidden_length}); + ptransform_encoded_bias = m->add_parameters({hidden_length, 1}); + } + + void AddParamsToCG(ComputationGraph* cg) { + input_forward.new_graph(*cg); + input_backward.new_graph(*cg); + output_forward.new_graph(*cg); + + hidden_to_output = parameter(*cg, phidden_to_output); + hidden_to_output_bias = parameter(*cg, phidden_to_output_bias); + + transform_encoded = parameter(*cg, ptransform_encoded); + transform_encoded_bias = parameter(*cg, ptransform_encoded_bias); + } + + void RunFwdBwd(const vector& inputs, + Expression* hidden, ComputationGraph *cg) { + vector input_vecs; + for (const unsigned& input_id : inputs) { + input_vecs.push_back(lookup(*cg, char_vecs, input_id)); + } + + // Run forward LSTM + Expression forward_unit; + input_forward.start_new_sequence(); + for (unsigned i = 0; i < input_vecs.size(); ++i) { + forward_unit = input_forward.add_input(input_vecs[i]); + } + + // Run backward LSTM + reverse(input_vecs.begin(), input_vecs.end()); + Expression backward_unit; + input_backward.start_new_sequence(); + for (unsigned i = 0; i < input_vecs.size(); ++i) { + backward_unit = input_backward.add_input(input_vecs[i]); + } + + // Concatenate the forward and back hidden layers + *hidden = concatenate({forward_unit, backward_unit}); + } + + void TransformEncodedInputForDecoding(Expression* encoded_input) const { + *encoded_input = affine_transform({transform_encoded_bias, + transform_encoded, *encoded_input}); + } + + void ProjectToVocab(const Expression& hidden, Expression* out) const { + *out = affine_transform({hidden_to_output_bias, hidden_to_output, hidden}); + } + + Expression ComputeLoss(const vector& hidden_units, + const vector& targets) const { + assert(hidden_units.size() == targets.size()); + vector losses; + for (unsigned i = 0; i < hidden_units.size(); ++i) { + Expression out; + ProjectToVocab(hidden_units[i], &out); + losses.push_back(pickneglogsoftmax(out, targets[i])); + } + return sum(losses); + } + + float Train(const vector& inputs, const vector& outputs, + AdadeltaTrainer* ada_gd) { + ComputationGraph cg; + AddParamsToCG(&cg); + + // Encode and Transform to feed into decoder + Expression encoded_input_vec; + RunFwdBwd(inputs, &encoded_input_vec, &cg); + TransformEncodedInputForDecoding(&encoded_input_vec); + + // Use this encoded word vector to predict the transformed word + vector input_vecs_for_dec; + vector output_ids_for_pred; + for (unsigned i = 0; i < outputs.size(); ++i) { + if (i < outputs.size() - 1) { + // '' will not be fed as input -- it needs to be predicted. + input_vecs_for_dec.push_back(concatenate( + {encoded_input_vec, lookup(cg, char_vecs, outputs[i])})); + } + if (i > 0) { // '' will not be predicted in the output -- its fed in. + output_ids_for_pred.push_back(outputs[i]); + } + } + + vector decoder_hidden_units; + output_forward.start_new_sequence(); + for (const auto& vec : input_vecs_for_dec) { + decoder_hidden_units.push_back(output_forward.add_input(vec)); + } + Expression loss = ComputeLoss(decoder_hidden_units, output_ids_for_pred); + + float return_loss = as_scalar(cg.forward()); + cg.backward(); + ada_gd->update(1.0f); + return return_loss; + } + + void Decode(const Expression& encoded_word_vec, + unordered_map& char_to_id, + vector* pred_target_ids, ComputationGraph* cg) { + Expression input_word_vec = lookup(*cg, char_vecs, char_to_id[BOW]); + pred_target_ids->push_back(char_to_id[BOW]); + output_forward.start_new_sequence(); + while (pred_target_ids->size() < MAX_PRED_LEN) { + Expression input = concatenate({encoded_word_vec, input_word_vec}); + Expression hidden = output_forward.add_input(input); + Expression out; + ProjectToVocab(hidden, &out); + vector dist = as_vector(cg->incremental_forward()); + unsigned pred_index = 0; + float best_score = dist[pred_index]; + for (unsigned index = 1; index < dist.size(); ++index) { + if (dist[index] > best_score) { + best_score = dist[index]; + pred_index = index; + } + } + pred_target_ids->push_back(pred_index); + if (pred_index == char_to_id[EOW]) { + return; // If the end is found, break from the loop and return + } + input_word_vec = lookup(*cg, char_vecs, pred_index); + } + } + + void Predict(const vector& inputs, + unordered_map& char_to_id, + vector* outputs) { + ComputationGraph cg; + AddParamsToCG(&cg); + + // Encode and Transofrm to feed into decoder + Expression encoded_input_vec; + RunFwdBwd(inputs, &encoded_input_vec, &cg); + TransformEncodedInputForDecoding(&encoded_input_vec); + + // Make preditions using the decoder. + Decode(encoded_input_vec, char_to_id, outputs, &cg); + } +}; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + + string vocab_filename = argv[1]; // vocabulary of words/characters + string morph_filename = argv[2]; + string train_filename = argv[3]; + string test_filename = argv[4]; + unsigned char_size = atoi(argv[5]); + unsigned hidden_size = atoi(argv[6]); + unsigned num_iter = atoi(argv[7]); + float reg_strength = atof(argv[8]); + unsigned layers = atoi(argv[9]); + + ifstream vocab_file(vocab_filename); + vector chars; + if (vocab_file.is_open()) { // Reading the vocab file + string line; + getline(vocab_file, line); + chars = split_line(line, ' '); + } else { + cerr << "File opening failed" << endl; + } + unordered_map char_to_id; + unordered_map id_to_char; + unsigned char_id = 0; + for (const string& ch : chars) { + char_to_id[ch] = char_id; + id_to_char[char_id] = ch; + char_id++; + } + unsigned vocab_size = char_to_id.size(); + + ifstream morph_file(morph_filename); + vector morph_attrs; + if (morph_file.is_open()) { // Reading the vocab file + string line; + getline(morph_file, line); + morph_attrs = split_line(line, ' '); + } else { + cerr << "File opening failed" << endl; + } + unordered_map morph_to_id; + unordered_map id_to_morph; + unsigned morph_id = 0; + for (const string& ch : morph_attrs) { + morph_to_id[ch] = morph_id; + id_to_morph[morph_id] = ch; + morph_id++; + } + unsigned morph_size = morph_to_id.size(); + + vector m; + vector optimizer; + vector > nn; + for (unsigned i = 0; i < morph_size; ++i) { + m.push_back(new Model()); + AdadeltaTrainer ada(m[i], reg_strength); + optimizer.push_back(ada); + MorphTrans neural(char_size, hidden_size, vocab_size, layers, m[i]); + nn.push_back(neural); + } + + // Read the training file in a vector + vector train_data; + ifstream train_file(train_filename); + if (train_file.is_open()) { + string line; + while (getline(train_file, line)) { + train_data.push_back(line); + } + } + train_file.close(); + + // Read the test file in a vector + vector test_data; + ifstream test_file(test_filename); + if (test_file.is_open()) { + string line; + while (getline(test_file, line)) { + test_data.push_back(line); + } + } + test_file.close(); + + // Read the training file and train the model + for (unsigned iter = 0; iter < num_iter; ++iter) { + unsigned line_id = 0; + random_shuffle(train_data.begin(), train_data.end()); + vector loss(morph_size, 0.0f); + for (string& line : train_data) { + vector items = split_line(line, '|'); + vector input_ids, target_ids; + input_ids.clear(); target_ids.clear(); + for (const string& ch : split_line(items[0], ' ')) { + input_ids.push_back(char_to_id[ch]); + } + for (const string& ch : split_line(items[1], ' ')) { + target_ids.push_back(char_to_id[ch]); + } + unsigned morph_id = morph_to_id[items[2]]; + loss[morph_id] += nn[morph_id].Train(input_ids, target_ids, &optimizer[morph_id]); + cerr << ++line_id << "\r"; + } + + cerr << "Iter " << iter + 1 << " "; + for (unsigned i = 0; i < loss.size(); ++i) { + cerr << loss[i] << " "; + } + cerr << "Sum: " << accumulate(loss.begin(), loss.end(), 0.) << endl; + + // Read the test file and output predictions for the words. + string line; + double correct = 0, total = 0; + for (string& line : test_data) { + vector items = split_line(line, '|'); + vector input_ids, target_ids, pred_target_ids; + input_ids.clear(); target_ids.clear(); pred_target_ids.clear(); + for (const string& ch : split_line(items[0], ' ')) { + input_ids.push_back(char_to_id[ch]); + } + for (const string& ch : split_line(items[1], ' ')) { + target_ids.push_back(char_to_id[ch]); + } + unsigned morph_id = morph_to_id[items[2]]; + nn[morph_id].Predict(input_ids, char_to_id, &pred_target_ids); + + string prediction = ""; + for (unsigned i = 0; i < pred_target_ids.size(); ++i) { + prediction += id_to_char[pred_target_ids[i]]; + if (i != pred_target_ids.size() - 1) { + prediction += " "; + } + } + if (prediction == items[1]) { + correct += 1; + } else { // If wrong, print prediction and correct answer + if (iter == num_iter - 1) { + cout << items[0] << '|' << items[1] << '|' << items[2] << endl; + cout << items[0] << '|' << prediction << '|' << items[2] << endl; + } + } + total += 1; + } + cerr << "Prediction Accuracy: " << correct / total << endl; + } + return 1; +} From 1ae38d36cf2c55749f410490e92b979fa3c85125 Mon Sep 17 00:00:00 2001 From: Lingpeng Kong Date: Tue, 20 Oct 2015 17:27:05 -0400 Subject: [PATCH 278/965] incremental_forward index fix --- cnn/exec.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cnn/exec.cc b/cnn/exec.cc index 90d5e727b..2e8a00295 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -25,7 +25,8 @@ const Tensor& SimpleExecutionEngine::forward(VariableIndex i) { const Tensor& SimpleExecutionEngine::get_value(VariableIndex i) { assert(i < cg.nodes.size()); if (i >= last_node_evaluated) { - incremental_forward(i); + // node_max_index is used as a sentinel here, so we should forward until (i+1) not i + incremental_forward( (VariableIndex)((unsigned int)i+1) ); } return nfxs[i]; } From bb4ecc90ab556744ec6b61a1e4972c548132a407 Mon Sep 17 00:00:00 2001 From: dhg Date: Wed, 21 Oct 2015 05:28:51 -0700 Subject: [PATCH 279/965] add bounds check for i in forward(i) and incremental_forward(i) --- cnn/exec.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cnn/exec.cc b/cnn/exec.cc index fbc5fd0d3..117274a81 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -36,6 +36,8 @@ const Tensor& SimpleExecutionEngine::incremental_forward() { } const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { + assert(i < cg.nodes.size()); + // free any old memory if this is a new HG if (num_nodes_evaluated == 0) fxs->free(); From 467cbe615a11895c9cdda66e0e8dbefbf79e8864 Mon Sep 17 00:00:00 2001 From: dhg Date: Wed, 21 Oct 2015 06:07:57 -0700 Subject: [PATCH 280/965] Removed obsolete last_node_evaluated field on ComputationGraph. It can never be set and, thus, will always be zero. It is left over from when ExecutionEngine was extracted out of ComputationGraph. --- cnn/cnn.cc | 3 +-- cnn/cnn.h | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 10911b0cd..b84cbc124 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -18,7 +18,7 @@ int n_hgs = 0; Node::~Node() {} size_t Node::aux_storage_size() const { return 0; } -ComputationGraph::ComputationGraph() : last_node_evaluated(), +ComputationGraph::ComputationGraph() : ee(new SimpleExecutionEngine(*this)) { ++n_hgs; if (n_hgs > 1) { @@ -34,7 +34,6 @@ ComputationGraph::~ComputationGraph() { } void ComputationGraph::clear() { - last_node_evaluated = VariableIndex(); parameter_nodes.clear(); for (auto n : nodes) delete n; nodes.clear(); diff --git a/cnn/cnn.h b/cnn/cnn.h index f2ff70c32..8e5ad8b08 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -99,7 +99,6 @@ struct ComputationGraph { // data std::vector nodes; // **stored in topological order** std::vector parameter_nodes; // nodes that contain parameters that can be updated (subset of nodes) - VariableIndex last_node_evaluated; // enables forward graphs to be evaluated incrementally ExecutionEngine* ee; // handles the execution private: From 0600c5dcc3d7e87b022b2b22a32c28366d4167a1 Mon Sep 17 00:00:00 2001 From: dhg Date: Wed, 21 Oct 2015 23:10:02 -0700 Subject: [PATCH 281/965] fix override warnings from new version of clang --- cnn/rnn.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cnn/rnn.h b/cnn/rnn.h index a84da37b2..6a05b47be 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -108,12 +108,12 @@ struct SimpleRNNBuilder : public RNNBuilder { public: Expression add_auxiliary_input(const Expression& x, const Expression &aux); - Expression back() const override { return (cur == -1? h0.back() : h[cur].back()); } + Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } std::vector final_s() const override { return final_h(); } - std::vector get_h(RNNPointer i) const { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const { return get_h(i); } + std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } + std::vector get_s(RNNPointer i) const override { return get_h(i); } void copy(const RNNBuilder & params) override; unsigned num_h0_components() const override { return layers; } From 52017b1bdc2ad7b6f135634b5a8ca46b1c006df1 Mon Sep 17 00:00:00 2001 From: dhg Date: Wed, 21 Oct 2015 23:36:30 -0700 Subject: [PATCH 282/965] GRUBuilder was missing get_h and get_s implementations --- cnn/gru.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cnn/gru.h b/cnn/gru.h index 3200ef07b..ec852f09b 100644 --- a/cnn/gru.h +++ b/cnn/gru.h @@ -17,6 +17,8 @@ struct GRUBuilder : public RNNBuilder { Expression back() const override { return (cur == -1? h0.back() : h[cur].back()); } std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } std::vector final_s() const override { return final_h(); } + std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } + std::vector get_s(RNNPointer i) const override { return get_h(i); } unsigned num_h0_components() const override { return layers; } void copy(const RNNBuilder & params) override; From ca3df16a4f599439356265a6b93fa05a64408b8c Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 22 Oct 2015 22:37:48 -0400 Subject: [PATCH 283/965] automatic build and test --- .travis.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..14e632475 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,14 @@ +language: cpp +compiler: + - gcc + +before_script: + - hg clone https://bitbucket.org/eigen/eigen + - mkdir build + - cd build + - cmake .. -DEIGEN3_INCLUDE_DIR=../eigen + +script: + - make + - make test + From f9f27b6e23db9ebe2b3d60355345fa12fa0c916e Mon Sep 17 00:00:00 2001 From: austinma Date: Mon, 26 Oct 2015 02:24:23 -0400 Subject: [PATCH 284/965] Removed treelstm --- cnn/treelstm.cc | 260 ------------------------------------------------ cnn/treelstm.h | 60 ----------- 2 files changed, 320 deletions(-) delete mode 100644 cnn/treelstm.cc delete mode 100644 cnn/treelstm.h diff --git a/cnn/treelstm.cc b/cnn/treelstm.cc deleted file mode 100644 index f5a5f3c89..000000000 --- a/cnn/treelstm.cc +++ /dev/null @@ -1,260 +0,0 @@ -#include "cnn/treelstm.h" - -#include -#include -#include -#include - -#include "cnn/nodes.h" - -using namespace std; -using namespace cnn::expr; - -namespace cnn { - -enum { X2I, C2I, BI, X2F, C2F, BF, X2O, C2O, BO, X2C, BC }; -enum { H2I, H2F, H2O, H2C }; -// See "Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks" -// by Tai, Socher, and Manning (2015), section 3.2, for details on this model. -// http://arxiv.org/pdf/1503.00075v3.pdf -TreeLSTMBuilder::TreeLSTMBuilder(unsigned N, - unsigned layers, - unsigned input_dim, - unsigned hidden_dim, - Model* model) : layers(layers), N(N) { - unsigned layer_input_dim = input_dim; - for (unsigned i = 0; i < layers; ++i) { - // i - Parameters* p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); - LookupParameters* p_h2i = model->add_lookup_parameters(N, {hidden_dim, hidden_dim}); - Parameters* p_c2i = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bi = model->add_parameters({hidden_dim}); - - // f - Parameters* p_x2f = model->add_parameters({hidden_dim, layer_input_dim}); - LookupParameters* p_h2f = model->add_lookup_parameters(N*N, {hidden_dim, hidden_dim}); - Parameters* p_c2f = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bf = model->add_parameters({hidden_dim}); - - // o - Parameters* p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); - LookupParameters* p_h2o = model->add_lookup_parameters(N, {hidden_dim, hidden_dim}); - Parameters* p_c2o = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bo = model->add_parameters({hidden_dim}); - - // c (a.k.a. u) - Parameters* p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); - LookupParameters* p_h2c = model->add_lookup_parameters(N, {hidden_dim, hidden_dim}); - Parameters* p_bc = model->add_parameters({hidden_dim}); - layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - - vector ps = {p_x2i, p_c2i, p_bi, p_x2f, p_c2f, p_bf, p_x2o, p_c2o, p_bo, p_x2c, p_bc}; - vector lps = {p_h2i, p_h2f, p_h2o, p_h2c}; - params.push_back(ps); - lparams.push_back(lps); - } // layers -} - -void TreeLSTMBuilder::new_graph_impl(ComputationGraph& cg){ - param_vars.clear(); - - for (unsigned i = 0; i < layers; ++i){ - auto& p = params[i]; - auto& lp = lparams[i]; - - //i - Expression i_x2i = parameter(cg, p[X2I]); - Expression i_c2i = parameter(cg, p[C2I]); - Expression i_bi = parameter(cg, p[BI]); - //f - Expression i_x2f = parameter(cg, p[X2F]); - Expression i_c2f = parameter(cg, p[C2F]); - Expression i_bf = parameter(cg, p[BF]); - //o - Expression i_x2o = parameter(cg, p[X2O]); - Expression i_c2o = parameter(cg, p[C2O]); - Expression i_bo = parameter(cg, p[BO]); - //c - Expression i_x2c = parameter(cg, p[X2C]); - Expression i_bc = parameter(cg, p[BC]); - - vector vars = {i_x2i, i_c2i, i_bi, i_x2f, i_c2f, i_bf, i_x2o, i_c2o, i_bo, i_x2c, i_bc}; - param_vars.push_back(vars); - - vector lvars((3 + N) * N); - for (unsigned k = 0; k < N; ++k) { - lvars[k * (N + 3) + 0] = lookup(cg, lp[H2I], k); - lvars[k * (N + 3) + 1] = lookup(cg, lp[H2O], k); - lvars[k * (N + 3) + 2] = lookup(cg, lp[H2C], k); - for (unsigned j = 0; j < N; ++j) { - lvars[k * (N + 3) + 3 + j] = lookup(cg, lp[H2F], k); - } - } - lparam_vars.push_back(lvars); - } -} - -// layout: 0..layers = c -// layers+1..2*layers = h -void TreeLSTMBuilder::start_new_sequence_impl(const vector& hinit) { - h.clear(); - c.clear(); - if (hinit.size() > 0) { - assert(layers*2 == hinit.size()); - h0.resize(layers); - c0.resize(layers); - for (unsigned i = 0; i < layers; ++i) { - c0[i] = hinit[i]; - h0[i] = hinit[i + layers]; - } - has_initial_state = true; - } else { - has_initial_state = false; - } -} - -Expression TreeLSTMBuilder::add_input(vector children, const Expression& x) { - ComputationGraph& cg = *(ComputationGraph*)x.pg; - h.push_back(vector(layers)); - c.push_back(vector(layers)); - vector& ht = h.back(); - vector& ct = c.back(); - - Expression in = x; - for (unsigned i = 0; i < layers; ++i) { - const vector& vars = param_vars[i]; - vector i_h_children, i_c_children; - i_h_children.reserve(children.size() > 1 ? children.size() : 1); - i_c_children.reserve(children.size() > 1 ? children.size() : 1); - - bool has_prev_state = (children.size() > 0 || has_initial_state); - if (children.size() == 0) { - i_h_children.push_back(Expression()); - i_c_children.push_back(Expression()); - if (has_initial_state) { - // intial value for h and c at timestep 0 in layer i - // defaults to zero matrix input if not set in add_parameter_edges - i_h_children[0] = h0[i]; - i_c_children[0] = c0[i]; - } - } - else { // t > 0 - for (int child : children) { - i_h_children.push_back(h[child][i]); - i_c_children.push_back(c[child][i]); - } - } - - // input - Expression i_ait; - if (has_prev_state) { - vector xs = {vars[BI], vars[X2I], in}; - xs.reserve(2 * children.size() + 3); - for (unsigned j = 0; j < children.size(); ++j) { - unsigned ej = (j < N) ? j : N - 1; - xs.push_back(lookup(cg, lparams[i][H2I], ej)); - //xs.push_back(lparam_vars[i][j * (N + 3) + 0]); - xs.push_back(i_h_children[j]); - } - assert (xs.size() == 2 * children.size() + 3); - i_ait = affine_transform(xs); - } - else - i_ait = affine_transform({vars[BI], vars[X2I], in}); - Expression i_it = logistic(i_ait); - - // forget - vector i_ft; - for (unsigned k = 0; k < children.size(); ++k) { - unsigned ek = (k < N) ? k : N - 1; - Expression i_aft; - if (has_prev_state) { - vector xs = {vars[BF], vars[X2F], in}; - xs.reserve(2 * children.size() + 3); - for (unsigned j = 0; j < children.size(); ++j) { - unsigned ej = (j < N) ? j : N - 1; - xs.push_back(lookup(cg, lparams[i][H2F], ej * N + ek)); - //xs.push_back(lparam_vars[i][j * (N + 3) + 3 + k]); - xs.push_back(i_h_children[j]); - } - assert (xs.size() == 2 * children.size() + 3); - i_aft = affine_transform(xs); - } - else - i_ait = affine_transform({vars[BF], vars[X2F], in}); - i_ft.push_back(logistic(i_aft)); - } - - // write memory cell - Expression i_awt; - if (has_prev_state) { - vector xs = {vars[BC], vars[X2C], in}; - // This is the one and only place that should *not* condition on i_c_children - // This should condition only on x (a.k.a. in), the bias (vars[BC]) and i_h_children - xs.reserve(2 * children.size() + 3); - for (unsigned j = 0; j < children.size(); ++j) { - unsigned ej = (j < N) ? j : N - 1; - xs.push_back(lookup(cg, lparams[i][H2C], ej)); - //xs.push_back(lparam_vars[i][j * (N + 3) + 2]); - xs.push_back(i_h_children[j]); - } - assert (xs.size() == 2 * children.size() + 3); - i_awt = affine_transform(xs); - } - else - i_awt = affine_transform({vars[BC], vars[X2C], in}); - Expression i_wt = tanh(i_awt); - - // compute new cell value - if (has_prev_state) { - Expression i_nwt = cwise_multiply(i_it, i_wt); - vector i_crts(children.size()); - for (unsigned j = 0; j < children.size(); ++j) { - i_crts[j] = cwise_multiply(i_ft[j], i_c_children[j]); - } - Expression i_crt = sum(i_crts); - ct[i] = i_crt + i_nwt; - } - else { - ct[i] = cwise_multiply(i_it, i_wt); - } - - // output - Expression i_aot; - if (has_prev_state) { - vector xs = {vars[BO], vars[X2O], in}; - xs.reserve(2 * children.size() + 3); - for (unsigned j = 0; j < children.size(); ++j) { - unsigned ej = (j < N) ? j : N - 1; - xs.push_back(lookup(cg, lparams[i][H2O], ej)); - //xs.push_back(lparam_vars[i][j * (N + 3) + 1]); - xs.push_back(i_h_children[j]); - } - assert (xs.size() == 2 * children.size() + 3); - i_aot = affine_transform(xs); - } - else - i_aot = affine_transform({vars[BO], vars[X2O], in}); - Expression i_ot = logistic(i_aot); - - // Compute new h value - Expression ph_t = tanh(ct[i]); - in = ht[i] = cwise_multiply(i_ot, ph_t); - } - return ht.back(); -} - -Expression TreeLSTMBuilder::add_input_impl(int prev, const Expression& x) { - assert (false); - return x; -} - -void TreeLSTMBuilder::copy(const RNNBuilder & rnn) { - const TreeLSTMBuilder & rnn_treelstm = (const TreeLSTMBuilder&)rnn; - assert(params.size() == rnn_treelstm.params.size()); - for(size_t i = 0; i < params.size(); ++i) - for(size_t j = 0; j < params[i].size(); ++j) - params[i][j]->copy(*rnn_treelstm.params[i][j]); -} - -} // namespace cnn diff --git a/cnn/treelstm.h b/cnn/treelstm.h deleted file mode 100644 index 96a16b5d5..000000000 --- a/cnn/treelstm.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef CNN_TREELSTM_H_ -#define CNN_TREELSTM_H_ - -#include "cnn/cnn.h" -#include "cnn/rnn.h" -#include "cnn/expr.h" - -using namespace cnn::expr; - -namespace cnn { - -class Model; - -struct TreeLSTMBuilder : public RNNBuilder { - TreeLSTMBuilder() = default; - explicit TreeLSTMBuilder(unsigned N, //Max branching factor - unsigned layers, - unsigned input_dim, - unsigned hidden_dim, - Model* model); - - Expression back() const { return h.back().back(); } - std::vector final_h() const { return (h.size() == 0 ? h0 : h.back()); } - std::vector final_s() const { - std::vector ret = (c.size() == 0 ? c0 : c.back()); - for(auto my_h : final_h()) ret.push_back(my_h); - return ret; - } - unsigned num_h0_components() const override { return 2 * layers; } - void copy(const RNNBuilder & params) override; - Expression add_input(std::vector children, const Expression& x); - protected: - void new_graph_impl(ComputationGraph& cg) override; - void start_new_sequence_impl(const std::vector& h0) override; - Expression add_input_impl(int prev, const Expression& x) override; - - public: - // first index is layer, then ... - std::vector> params; - std::vector> lparams; - - // first index is layer, then ... - std::vector> param_vars; - std::vector> lparam_vars; - - // first index is time, second is layer - std::vector> h, c; - - // initial values of h and c at each layer - // - both default to zero matrix input - bool has_initial_state; // if this is false, treat h0 and c0 as 0 - std::vector h0; - std::vector c0; - unsigned layers; - unsigned N; // Max branching factor -}; - -} // namespace cnn - -#endif From 3c17a3374678394f1b50653f965eb49ef9eb8aa4 Mon Sep 17 00:00:00 2001 From: austinma Date: Mon, 26 Oct 2015 02:30:55 -0400 Subject: [PATCH 285/965] removed treelstm --- cnn/CMakeLists.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 0f0438f03..eb0a6835c 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -24,7 +24,6 @@ set(cnn_library_SRCS shadow-params.cc tensor.cc training.cc - treelstm.cc ) # Headers: @@ -56,8 +55,7 @@ set(cnn_library_HDRS shadow-params.h tensor.h timing.h - training.h - treelstm.h + training.h ) if(WITH_CUDA_BACKEND) From 458d4a34a832acaaaa8ab5fdd5df08b6bba5f3a2 Mon Sep 17 00:00:00 2001 From: austinma Date: Mon, 26 Oct 2015 02:31:50 -0400 Subject: [PATCH 286/965] removed spurious spaces --- cnn/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index eb0a6835c..f710acdb7 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -55,7 +55,7 @@ set(cnn_library_HDRS shadow-params.h tensor.h timing.h - training.h + training.h ) if(WITH_CUDA_BACKEND) From e569a92130af88567e3399835fd24689b1eca878 Mon Sep 17 00:00:00 2001 From: Lingpeng Kong Date: Mon, 26 Oct 2015 20:29:15 -0400 Subject: [PATCH 287/965] more segrnn --- examples/segrnn-sup.cc | 273 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 252 insertions(+), 21 deletions(-) diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index d1bd616d6..21f2615fa 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -13,20 +13,23 @@ #include #include #include +#include #include #include +#include + using namespace std; using namespace cnn; unsigned LAYERS = 1; -unsigned INPUT_DIM = 24; -unsigned XCRIBE_DIM = 24; -unsigned SEG_DIM = 16; -unsigned H1DIM = 24; -unsigned H2DIM = 18; -unsigned TAG_DIM = 8; +unsigned INPUT_DIM = 64; +unsigned XCRIBE_DIM = 64; +unsigned SEG_DIM = 48; +unsigned H1DIM = 64; +unsigned H2DIM = 48; +unsigned TAG_DIM = 16; unsigned TAG_SIZE = 0; unsigned VOCAB_SIZE = 0; unsigned DURATION_DIM = 4; @@ -38,6 +41,8 @@ int kNONE; int kSOS; int kEOS; +bool use_pretrained_embeding = true; + // returns embeddings of labels struct SymbolEmbedding { SymbolEmbedding(Model& m, unsigned n, unsigned dim) { @@ -242,6 +247,28 @@ struct ZerothOrderSemiCRF { explicit ZerothOrderSemiCRF(Model& model) : bt(model), seb(model) { xe = new SymbolEmbedding(model, VOCAB_SIZE, INPUT_DIM); + + if (use_pretrained_embeding) { + ifstream fin("/usr1/corpora/LDC2011T13/vec-cwin.txt"); + string s; + while( getline(fin,s) ) + { + vector fields; + boost::algorithm::trim(s); + boost::algorithm::split( fields, s, boost::algorithm::is_any_of( " " ) ); + string word = fields[0]; + vector p_embeding; + for (int ind = 1; ind < fields.size(); ++ind){ + p_embeding.push_back(std::stod(fields[ind])); + } + if (d.Contains(word)){ + // cout << "init" << endl; + xe->p_labels->Initialize(d.Convert(word), p_embeding); + } + + } + } + ye = new SymbolEmbedding(model, TAG_SIZE, TAG_DIM); de = new BinnedDurationEmbedding(model, DURATION_DIM); @@ -307,6 +334,7 @@ struct ZerothOrderSemiCRF { vector fwd(len+1); // fwd trellis for model vector ref_fwd(len+1); // fwd trellis for reference vector f, fr; + // careful: in the other algorithms spans are [i,j], here they are [i,j) for (int j = 1; j <= len; ++j) { // fwd[j] is the total unnoramlized probability for all segmentations / labels @@ -336,12 +364,131 @@ struct ZerothOrderSemiCRF { } } } + // cerr << "info\t" << j << "\tsize: " << f.size() << endl; + // for(auto& e : f){ + // cerr << "node\t" << as_scalar(cg.get_value(e.i)) << endl; + // } + // cerr << "size of vector f at j = " << j << " equals " << f.size() << endl; + // cerr << "info end" << endl; fwd[j] = logsumexp(f); + + // cerr << "shock me\t" << as_scalar(cg.get_value((fwd[j]))) << endl; + if (fr.size()) ref_fwd[j] = logsumexp(fr); } //return log(fwd.back()) - log(ref_fwd.back()); return fwd.back() - ref_fwd.back(); } + + Expression ViterbiDecode(const vector& x, + const vector>& yz_gold, // .first = y, .second = duration (z) + ComputationGraph& cg, + vector> &yz_pred, + int max_seg_len = 0) { + yz_pred.clear(); + int len = x.size(); + + xe->new_graph(cg); + ye->new_graph(cg); + de->new_graph(cg); + Expression d2h1 = parameter(cg, p_d2h1); + Expression y2h1 = parameter(cg, p_y2h1); + Expression fwd2h1 = parameter(cg, p_fwd2h1); + Expression rev2h1 = parameter(cg, p_rev2h1); + Expression h1b = parameter(cg, p_h1b); + Expression h12h2 = parameter(cg, p_h12h2); + Expression h2b = parameter(cg, p_h2b); + Expression h22o = parameter(cg, p_h22o); + Expression ob = parameter(cg, p_ob); + vector xins(x.size()); + for (int i = 0; i < len; ++i) + xins[i] = xe->embed(x[i]); + vector c = bt.transcribe(cg, xins); + seb.construct_chart(cg, c, max_seg_len); + vector fwd(len+1); // fwd trellis for model + vector f, fr; + vector> ijt; // ijt stores positions where we get the max (i.e. i, j and tag) + vector> it; // it stores positions where we get the max ending at j + it.push_back(make_tuple(0,0,0)); // push one to make the index consistent, now it[j] means j rather than j+1 + // careful: in the other algorithms spans are [i,j], here they are [i,j) + for (int j = 1; j <= len; ++j) { + // fwd[j] is the total unnoramlized probability for all segmentations / labels + // ending (and including) the symbol at position j-1 + f.clear(); // f stores all additive contributions to item [j] + fr.clear(); + ijt.clear(); + for (unsigned tag = 0; tag < TAG_SIZE; ++tag) { + Expression y = ye->embed(tag); + const int i_start = max_seg_len ? max(0, j - max_seg_len) : 0; + for (int i = i_start; i < j; ++i) { // i is the starting position + auto seg_embedding_ij = seb(i, j-1); // pair + Expression d = de->embed(j - i); + // factor includes: fwd embedding, rev embedding, duration embedding, label embedding + Expression h1 = rectify(affine_transform({h1b, d2h1, d, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second})); + Expression h2 = tanh(affine_transform({h2b, h12h2, h1})); + //Expression p = exp(affine_transform({ob, h22o, h2})); + Expression p = affine_transform({ob, h22o, h2}); + + if (i == 0) { // fwd[0] is the path up and including -1, so it's the empty set, i.e., its probability is 1 + f.push_back(p); + } else { + f.push_back(p + fwd[i]); + } + ijt.push_back(std::make_tuple(i, j, tag)); + } + } + // cerr << "size of vector f at j = " << j << " equals " << f.size() << endl; + unsigned max_ind = 0; + auto max_val = as_scalar(cg.get_value(f[0].i)); + for(auto ind = 1; ind < f.size(); ++ind){ + auto val = as_scalar(cg.get_value(f[ind].i)); + // cerr << val << endl; + if (max_val < val){ + max_val = val; + max_ind = ind; + } + } + fwd[j] = f[max_ind]; + it.push_back(ijt[max_ind]); + // cerr << "max value = \t" << as_scalar(cg.get_value(fwd[j])) << endl; + } + // for(auto j = 1; j <= len; ++j) { + // cerr << j << "\t" << std::get<0>(it[j]) << "\t" << std::get<1>(it[j]) << "\t" << std::get<2>(it[j]) << endl; + // } + auto cur_j = len; + vector> pred; + while(cur_j > 0){ + auto cur_i = std::get<0>(it[cur_j]); + pred.push_back(make_tuple(cur_i, cur_j, std::get<2>(it[cur_j]))); + yz_pred.push_back(make_pair(std::get<2>(it[cur_j]), cur_j - cur_i)); + cur_j = cur_i; + } + std::reverse(pred.begin(),pred.end()); + std::reverse(yz_pred.begin(),yz_pred.end()); + cout << "==pred==" << endl; + // for(auto e : pred){ + // cout << std::get<0>(e) << "\t" << std::get<1>(e) << "\t" << std::get<2>(e) << endl; + // } + + for(auto e: yz_pred){ + cout << e.first << "," << e.second << "\t"; + } + cout << endl; + + cout << "==gold==" << endl; + for(auto e: yz_gold){ + cout << e.first << "," << e.second << "\t"; + } + cout << endl; + + // abort(); + return fwd.back(); + } + + + + + Parameters* p_d2h1, *p_y2h1, *p_fwd2h1, *p_rev2h1, *p_h1b; Parameters* p_h12h2, *p_h2b; Parameters* p_h22o, *p_ob; @@ -374,6 +521,62 @@ pair,vector>> ParseTrainingInstance(const std::string& return make_pair(x, yz); } +bool inline check_max_seg(const vector>& yz, int max_seg_len = 0){ + if (max_seg_len == 0) return true; + for (unsigned ri = 0; ri < yz.size(); ++ri) { + int dur = yz[ri].second; + if (max_seg_len && dur > max_seg_len) { + cerr << "SKIP: max_seg_len=" << max_seg_len << " but reference duration is " << dur << endl; + return false; + } + } + return true; +} + +double compute_f_score(vector>>& yz_preds, vector>>& yz_golds){ + assert(yz_preds.size() == yz_golds.size()); + int p_correct = 0; + int r_correct = 0; + int p_total = 0; + int r_total = 0; + for (int i = 0; i < yz_preds.size(); i++){ + // for sentence i + std::set> gold; + std::set> pred; + vector>& yz_pred = yz_preds[i]; + vector>& yz_gold = yz_golds[i]; + int cur = 0; + for(auto e : yz_pred){ + pred.insert(make_pair(cur, cur + e.second)); + cur += e.second; + } + cur = 0; + for(auto e : yz_gold){ + gold.insert(make_pair(cur, cur + e.second)); + cur += e.second; + } + + for (auto e : pred){ + if(gold.find(e) != gold.end()){ + p_correct++; + } + p_total++; + } + for (auto e : gold){ + if(pred.find(e) != pred.end()){ + r_correct++; + } + r_total++; + } + } + double p = (double)(p_correct) / (double)(p_total); + double r = (double)(r_correct) / (double)(r_total); + double f = 2.0 * ((p * r) / (p + r)); + cerr << "p: " << p << "\tr: " << r << "\tf: " << f << endl; + return f; + +} + int main(int argc, char** argv) { cnn::Initialize(argc, argv); if (argc != 3 && argc != 4) { @@ -394,7 +597,7 @@ int main(int argc, char** argv) { } d.Freeze(); // no new word types allowed td.Freeze(); // no new tag types allowed - + d.SetUnk(""); // set UNK to allow the unseen character in the dev and test set cerr << "Reading dev data from " << argv[2] << "...\n"; @@ -407,18 +610,31 @@ int main(int argc, char** argv) { } VOCAB_SIZE = d.size(); TAG_SIZE = td.size(); + + cerr << "TAG_SIZE = " << td.size() << endl; ostringstream os; os << "0scrf" << '_' << LAYERS << '_' << INPUT_DIM << '_' << XCRIBE_DIM - << "-pid" << getpid() << ".params"; - const string fname = os.str(); + << "-pid" << getpid(); + const string fname = os.str() + ".params"; cerr << "Parameters will be written to: " << fname << endl; double best = 9e+99; + const string f_d_name = os.str() + ".dict"; + ofstream out_d(f_d_name); + boost::archive::text_oarchive oa_d(out_d); + oa_d << d; + + const string f_td_name = os.str() + ".tdict"; + ofstream out_td(f_td_name); + boost::archive::text_oarchive oa_td(out_td); + oa_td << td; + Model model; auto sgd = new SimpleSGDTrainer(&model); + int max_seg_len = 10; ZerothOrderSemiCRF crf(model); if (argc == 4) { @@ -429,7 +645,7 @@ int main(int argc, char** argv) { } unsigned report_every_i = 10; - unsigned dev_every_i_reports = 5; + unsigned dev_every_i_reports = 100; unsigned si = training.size(); vector order(training.size()); for (unsigned i = 0; i < order.size(); ++i) order[i] = i; @@ -446,18 +662,20 @@ int main(int argc, char** argv) { si = 0; if (first) { first = false; } else { sgd->update_epoch(); } cerr << "**SHUFFLE\n"; - shuffle(order.begin(), order.end(), *rndeng); + // shuffle(order.begin(), order.end(), *rndeng); } // build graph for this instance ComputationGraph cg; auto& sent = training[order[si]]; ++si; - crf.SupervisedLoss(sent.first, sent.second, cg); - ttags += sent.second.size(); - loss += as_scalar(cg.forward()); - cg.backward(); - sgd->update(1.0); + if(check_max_seg(sent.second, max_seg_len)){ + crf.SupervisedLoss(sent.first, sent.second, cg, max_seg_len); + ttags += sent.second.size(); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(1.0); + } ++lines; } sgd->status(); @@ -466,14 +684,27 @@ int main(int argc, char** argv) { if (report % dev_every_i_reports == 0) { double dloss = 0; unsigned dtags = 0; + double f_best = 0; + vector>> yz_preds; + vector>> yz_golds; for (auto& sent : dev) { ComputationGraph cg; - crf.SupervisedLoss(sent.first, sent.second, cg); - dtags += sent.second.size(); - dloss += as_scalar(cg.forward()); + if(check_max_seg(sent.second, max_seg_len)){ + crf.SupervisedLoss(sent.first, sent.second, cg, max_seg_len); + dtags += sent.second.size(); + dloss += as_scalar(cg.forward()); + } + vector> yz_pred; + crf.ViterbiDecode(sent.first, sent.second, cg, yz_pred, max_seg_len); + yz_golds.push_back(sent.second); + yz_preds.push_back(yz_pred); } - if (dloss < best) { - best = dloss; + cout << "iter_end" << endl; + + double f = compute_f_score(yz_preds, yz_golds); + + if (f > f_best) { + f_best = f; ofstream out(fname); boost::archive::text_oarchive oa(out); oa << model; From 66fa8752fe695fa53dd40fb8019c10611e0a109a Mon Sep 17 00:00:00 2001 From: Manaal Faruqui Date: Tue, 27 Oct 2015 21:09:15 -0400 Subject: [PATCH 288/965] adding beam search --- examples/sep_morph_char_beam.cc | 511 ++++++++++++++++++++++++++++++++ 1 file changed, 511 insertions(+) create mode 100644 examples/sep_morph_char_beam.cc diff --git a/examples/sep_morph_char_beam.cc b/examples/sep_morph_char_beam.cc new file mode 100644 index 000000000..df02810e8 --- /dev/null +++ b/examples/sep_morph_char_beam.cc @@ -0,0 +1,511 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/rnn.h" +#include "cnn/gru.h" +#include "cnn/lstm.h" +#include "cnn/training.h" +#include "cnn/gpu-ops.h" +#include "cnn/expr.h" + +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace cnn; +using namespace cnn::expr; + +string BOW = "", EOW = ""; +unsigned MAX_PRED_LEN = 100; +float NEG_INF = numeric_limits::min(); + +vector split_line(const string& line, char delim) { + vector words; + stringstream ss(line); + string item; + while (std::getline(ss, item, delim)) { + if (!item.empty()) + words.push_back(item); + } + return words; +} + +template +class MorphTrans { + public: + Builder input_forward, input_backward, output_forward; + LookupParameters* char_vecs; + + Expression hidden_to_output, hidden_to_output_bias; + Parameters *phidden_to_output, *phidden_to_output_bias; + + Expression transform_encoded, transform_encoded_bias; + Parameters *ptransform_encoded, *ptransform_encoded_bias; + + unsigned char_len; + Expression EPS; + Parameters *peps_vec; + + MorphTrans(const int& char_length, const int& hidden_length, + const int& vocab_length, const int& layers, Model *m) : + input_forward(layers, char_length, hidden_length, m), + input_backward(layers, char_length, hidden_length, m), + output_forward(layers, 2 * char_length + hidden_length, hidden_length, m) { + char_len = char_length; + char_vecs = m->add_lookup_parameters(vocab_length, {char_length}); + + phidden_to_output = m->add_parameters({vocab_length, hidden_length}); + phidden_to_output_bias = m->add_parameters({vocab_length, 1}); + + ptransform_encoded = m->add_parameters({hidden_length, 2 * hidden_length}); + ptransform_encoded_bias = m->add_parameters({hidden_length, 1}); + + peps_vec = m->add_parameters({char_len, 1}); + } + + void AddParamsToCG(ComputationGraph* cg) { + input_forward.new_graph(*cg); + input_backward.new_graph(*cg); + output_forward.new_graph(*cg); + + hidden_to_output = parameter(*cg, phidden_to_output); + hidden_to_output_bias = parameter(*cg, phidden_to_output_bias); + + transform_encoded = parameter(*cg, ptransform_encoded); + transform_encoded_bias = parameter(*cg, ptransform_encoded_bias); + + EPS = parameter(*cg, peps_vec); + } + + void RunFwdBwd(const vector& inputs, + Expression* hidden, ComputationGraph *cg) { + vector input_vecs; + for (const unsigned& input_id : inputs) { + input_vecs.push_back(lookup(*cg, char_vecs, input_id)); + } + + // Run forward LSTM + Expression forward_unit; + input_forward.start_new_sequence(); + for (unsigned i = 0; i < input_vecs.size(); ++i) { + forward_unit = input_forward.add_input(input_vecs[i]); + } + + // Run backward LSTM + reverse(input_vecs.begin(), input_vecs.end()); + Expression backward_unit; + input_backward.start_new_sequence(); + for (unsigned i = 0; i < input_vecs.size(); ++i) { + backward_unit = input_backward.add_input(input_vecs[i]); + } + + // Concatenate the forward and back hidden layers + *hidden = concatenate({forward_unit, backward_unit}); + } + + void TransformEncodedInputForDecoding(Expression* encoded_input) const { + *encoded_input = affine_transform({transform_encoded_bias, + transform_encoded, *encoded_input}); + } + + void ProjectToVocab(const Expression& hidden, Expression* out) const { + *out = affine_transform({hidden_to_output_bias, hidden_to_output, hidden}); + } + + Expression ComputeLoss(const vector& hidden_units, + const vector& targets) const { + assert(hidden_units.size() == targets.size()); + vector losses; + for (unsigned i = 0; i < hidden_units.size(); ++i) { + Expression out; + ProjectToVocab(hidden_units[i], &out); + losses.push_back(pickneglogsoftmax(out, targets[i])); + } + return sum(losses); + } + + float Train(const vector& inputs, const vector& outputs, + AdadeltaTrainer* ada_gd) { + ComputationGraph cg; + AddParamsToCG(&cg); + + // Encode and Transform to feed into decoder + Expression encoded_input_vec; + RunFwdBwd(inputs, &encoded_input_vec, &cg); + TransformEncodedInputForDecoding(&encoded_input_vec); + + // Use this encoded word vector to predict the transformed word + vector input_vecs_for_dec; + vector output_ids_for_pred; + for (unsigned i = 0; i < outputs.size(); ++i) { + if (i < outputs.size() - 1) { + // '' will not be fed as input -- it needs to be predicted. + if (i < inputs.size() - 1) { + input_vecs_for_dec.push_back(concatenate( + {encoded_input_vec, lookup(cg, char_vecs, outputs[i]), + lookup(cg, char_vecs, inputs[i+1])})); + } else { + input_vecs_for_dec.push_back(concatenate( + {encoded_input_vec, lookup(cg, char_vecs, outputs[i]), EPS})); + } + } + if (i > 0) { // '' will not be predicted in the output -- its fed in. + output_ids_for_pred.push_back(outputs[i]); + } + } + + vector decoder_hidden_units; + output_forward.start_new_sequence(); + for (const auto& vec : input_vecs_for_dec) { + decoder_hidden_units.push_back(output_forward.add_input(vec)); + } + Expression loss = ComputeLoss(decoder_hidden_units, output_ids_for_pred); + + float return_loss = as_scalar(cg.forward()); + cg.backward(); + ada_gd->update(1.0f); + return return_loss; + } + + void Decode(const Expression& encoded_word_vec, + unordered_map& char_to_id, + vector* pred_target_ids, + const vector input_ids, ComputationGraph* cg) { + Expression input_word_vec = lookup(*cg, char_vecs, char_to_id[BOW]); + pred_target_ids->push_back(char_to_id[BOW]); + output_forward.start_new_sequence(); + unsigned out_index = 1; + while (pred_target_ids->size() < MAX_PRED_LEN) { + Expression input; + if (out_index < input_ids.size()) { + input = concatenate({encoded_word_vec, input_word_vec, + lookup(*cg, char_vecs, input_ids[out_index])}); + } else { + input = concatenate({encoded_word_vec, input_word_vec, EPS}); + } + Expression hidden = output_forward.add_input(input); + Expression out; + ProjectToVocab(hidden, &out); + vector dist = as_vector(cg->incremental_forward()); + unsigned pred_index = 0; + float best_score = dist[pred_index]; + for (unsigned index = 1; index < dist.size(); ++index) { + if (dist[index] > best_score) { + best_score = dist[index]; + pred_index = index; + } + } + pred_target_ids->push_back(pred_index); + if (pred_index == char_to_id[EOW]) { + return; // If the end is found, break from the loop and return + } + input_word_vec = lookup(*cg, char_vecs, pred_index); + out_index++; + } + } + + void BeamDecode(const Expression& encoded_word_vec, + unordered_map& char_to_id, + vector* pred_target_ids, + const vector& input_ids, const unsigned beam_size, + ComputationGraph* cg) { + Expression prev_output_vec = lookup(*cg, char_vecs, char_to_id[BOW]); + output_forward.start_new_sequence(); + unsigned out_index = 1; + + // Enter the start symbol in the decoder. + Expression input = concatenate({encoded_word_vec, prev_output_vec, + lookup(*cg, char_vecs, input_ids[out_index])}); + Expression hidden = output_forward.add_input(input); + Expression out; + ProjectToVocab(hidden, &out); + out = log_softmax(out); + vector log_dist = as_vector(cg->incremental_forward()); + priority_queue > init_queue; + for (unsigned i = 0; i < log_dist.size(); ++i) { + init_queue.push(make_pair(log_dist[i], i)); + } + unsigned vocab_size = log_dist.size(); + + // Initialise the beam_size sequences, scores, hidden states. + vector > sequences; + vector log_scores; + vector prev_states; + for (unsigned beam_id = 0; beam_id < beam_size; ++beam_id) { + vector seq; + seq.push_back(char_to_id[BOW]); + seq.push_back(init_queue.top().second); + sequences.push_back(seq); + + log_scores.push_back(init_queue.top().first); + prev_states.push_back(output_forward.state()); + init_queue.pop(); + } + + vector neg_inf(vocab_size, NEG_INF); + Expression neg_inf_vec = cnn::expr::input(*cg, {vocab_size}, &neg_inf); + + vector active_beams(beam_size, true); + while (true) { + out_index++; + Expression input_char_vec; + if (out_index < input_ids.size()) { + input_char_vec = lookup(*cg, char_vecs, input_ids[out_index]); + } else { + input_char_vec = EPS; + } + + priority_queue > > probs_queue; + unordered_map curr_states; + vector out_dist; + for (unsigned beam_id = 0; beam_id < beam_size; ++beam_id) { + if (active_beams[beam_id]) { + unsigned prev_out_char = sequences[beam_id].back(); + Expression prev_out_vec = lookup(*cg, char_vecs, prev_out_char); + Expression input = concatenate({encoded_word_vec, prev_out_vec, + input_char_vec}); + hidden = output_forward.add_input(prev_states[beam_id], input); + curr_states[beam_id] = output_forward.state(); + + ProjectToVocab(hidden, &out); + out_dist.push_back(log_softmax(out)); + } else { + out_dist.push_back(neg_inf_vec); + } + } + Expression all_scores = concatenate(out_dist); + vector log_dist = as_vector(cg->incremental_forward()); + + for (unsigned index = 0; index < log_dist.size(); ++index) { + unsigned beam_id = index / vocab_size; + unsigned char_id = index % vocab_size; + if (active_beams[beam_id]) { + pair location = make_pair(beam_id, char_id); + probs_queue.push(pair >( + log_scores[beam_id] + log_dist[index], location)); + } + } + + // Find the beam_size best now and update the variables. + unordered_map > new_seq; + for (unsigned beam_id = 0; beam_id < beam_size; ++beam_id) { + if (active_beams[beam_id]) { + float log_prob = probs_queue.top().first; + pair location = probs_queue.top().second; + unsigned old_beam_id = location.first, char_id = location.second; + + vector seq = sequences[old_beam_id]; + seq.push_back(char_id); + new_seq[beam_id] = seq; + log_scores[beam_id] = log_prob; // Update the score + prev_states[beam_id] = curr_states[old_beam_id]; // Update hidden state + + probs_queue.pop(); + } + } + + // Update the sequences now. + for (auto& it : new_seq) { + sequences[it.first] = it.second; + } + + // Check if a sequence should be made inactive. + for (unsigned beam_id = 0; beam_id < beam_size; ++beam_id) { + if (active_beams[beam_id] && + (sequences[beam_id].back() == char_to_id[EOW] || + sequences[beam_id].size() > MAX_PRED_LEN)) { + active_beams[beam_id] = false; + } + } + + // Check if all sequences are inactive. + /*bool all_inactive = true; + for (unsigned beam_id = 0; beam_id < beam_size; ++beam_id) { + if (active_beams[beam_id]) { + all_inactive = false; + break; + } + }*/ + + // When the sequence with highest score has become inactive, return. + unsigned max_beam_index = distance(log_scores.begin(), + max_element(log_scores.begin(), + log_scores.end())); + if (!active_beams[max_beam_index]) { + *pred_target_ids = sequences[max_beam_index]; + return; + } + } + } + + void Predict(const vector& inputs, + unordered_map& char_to_id, + const unsigned beam_size, + vector* outputs) { + ComputationGraph cg; + AddParamsToCG(&cg); + + // Encode and Transofrm to feed into decoder + Expression encoded_input_vec; + RunFwdBwd(inputs, &encoded_input_vec, &cg); + TransformEncodedInputForDecoding(&encoded_input_vec); + + // Make preditions using the decoder. + BeamDecode(encoded_input_vec, char_to_id, outputs, inputs, beam_size, &cg); + } +}; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + + string vocab_filename = argv[1]; // vocabulary of words/characters + string morph_filename = argv[2]; + string train_filename = argv[3]; + string test_filename = argv[4]; + unsigned char_size = atoi(argv[5]); + unsigned hidden_size = atoi(argv[6]); + unsigned num_iter = atoi(argv[7]); + float reg_strength = atof(argv[8]); + unsigned layers = atoi(argv[9]); + unsigned beam_size = atoi(argv[10]); + + ifstream vocab_file(vocab_filename); + vector chars; + if (vocab_file.is_open()) { // Reading the vocab file + string line; + getline(vocab_file, line); + chars = split_line(line, ' '); + } else { + cerr << "File opening failed" << endl; + } + unordered_map char_to_id; + unordered_map id_to_char; + unsigned char_id = 0; + for (const string& ch : chars) { + char_to_id[ch] = char_id; + id_to_char[char_id] = ch; + char_id++; + } + unsigned vocab_size = char_to_id.size(); + + ifstream morph_file(morph_filename); + vector morph_attrs; + if (morph_file.is_open()) { // Reading the vocab file + string line; + getline(morph_file, line); + morph_attrs = split_line(line, ' '); + } else { + cerr << "File opening failed" << endl; + } + unordered_map morph_to_id; + unordered_map id_to_morph; + unsigned morph_id = 0; + for (const string& ch : morph_attrs) { + morph_to_id[ch] = morph_id; + id_to_morph[morph_id] = ch; + morph_id++; + } + unsigned morph_size = morph_to_id.size(); + + vector m; + vector optimizer; + vector > nn; + for (unsigned i = 0; i < morph_size; ++i) { + m.push_back(new Model()); + AdadeltaTrainer ada(m[i], reg_strength); + optimizer.push_back(ada); + MorphTrans neural(char_size, hidden_size, vocab_size, layers, m[i]); + nn.push_back(neural); + } + + // Read the training file in a vector + vector train_data; + ifstream train_file(train_filename); + if (train_file.is_open()) { + string line; + while (getline(train_file, line)) { + train_data.push_back(line); + } + } + train_file.close(); + + // Read the test file in a vector + vector test_data; + ifstream test_file(test_filename); + if (test_file.is_open()) { + string line; + while (getline(test_file, line)) { + test_data.push_back(line); + } + } + test_file.close(); + + // Read the training file and train the model + for (unsigned iter = 0; iter < num_iter; ++iter) { + unsigned line_id = 0; + random_shuffle(train_data.begin(), train_data.end()); + vector loss(morph_size, 0.0f); + for (string& line : train_data) { + vector items = split_line(line, '|'); + vector input_ids, target_ids; + input_ids.clear(); target_ids.clear(); + for (const string& ch : split_line(items[0], ' ')) { + input_ids.push_back(char_to_id[ch]); + } + for (const string& ch : split_line(items[1], ' ')) { + target_ids.push_back(char_to_id[ch]); + } + unsigned morph_id = morph_to_id[items[2]]; + loss[morph_id] += nn[morph_id].Train(input_ids, target_ids, &optimizer[morph_id]); + cerr << ++line_id << "\r"; + } + + cerr << "Iter " << iter + 1 << " "; + for (unsigned i = 0; i < loss.size(); ++i) { + cerr << loss[i] << " "; + } + cerr << "Sum: " << accumulate(loss.begin(), loss.end(), 0.) << endl; + + // Read the test file and output predictions for the words. + string line; + double correct = 0, total = 0; + for (string& line : test_data) { + vector items = split_line(line, '|'); + vector input_ids, target_ids, pred_target_ids; + input_ids.clear(); target_ids.clear(); pred_target_ids.clear(); + for (const string& ch : split_line(items[0], ' ')) { + input_ids.push_back(char_to_id[ch]); + } + for (const string& ch : split_line(items[1], ' ')) { + target_ids.push_back(char_to_id[ch]); + } + unsigned morph_id = morph_to_id[items[2]]; + nn[morph_id].Predict(input_ids, char_to_id, beam_size, &pred_target_ids); + + string prediction = ""; + for (unsigned i = 0; i < pred_target_ids.size(); ++i) { + prediction += id_to_char[pred_target_ids[i]]; + if (i != pred_target_ids.size() - 1) { + prediction += " "; + } + } + if (prediction == items[1]) { + correct += 1; + } else { // If wrong, print prediction and correct answer + if (iter == num_iter - 1) { + cout << items[0] << '|' << items[1] << '|' << items[2] << endl; + cout << items[0] << '|' << prediction << '|' << items[2] << endl; + } + } + total += 1; + } + cerr << "Prediction Accuracy: " << correct / total << endl; + } + return 1; +} From 3dd10d89fd8d0b988540d94db12b2f021cf20da0 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Wed, 28 Oct 2015 09:31:18 +0200 Subject: [PATCH 289/965] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d7fb923c8..6597e032f 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ which will train a multilayer perceptron to predict the xor function. If you don't have Eigen installed, the instructions below will fetch and compile both `Eigen` and `cnn`. - git clone https://github.com/yoavg/cnn.git + git clone https://github.com/clab/cnn.git hg clone https://bitbucket.org/eigen/eigen/ cd cnn/ From 8295d44d841e125aa55558114ea25f3782153d54 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 29 Oct 2015 21:41:57 -0400 Subject: [PATCH 290/965] Removed compile options causing errors/warnings --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b8e5700f0..88fb4d29b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # 3. try compiler options like -march=native or other architecture # flags (the compiler does not always make the best configuration # decisions without help) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funroll-loops -Wall -Wpedantic -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -Wno-unused-local-typedefs -march=native") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funroll-loops -Wall -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -march=native") enable_testing() From d7fa7d7150bfd213140f8c9cd09d5d2c000732ed Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 31 Oct 2015 04:49:26 +0900 Subject: [PATCH 291/965] Fixed compile error on older versions of gcc --- cnn/dict.h | 98 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 51 insertions(+), 47 deletions(-) diff --git a/cnn/dict.h b/cnn/dict.h index 23c909218..c636c02c5 100644 --- a/cnn/dict.h +++ b/cnn/dict.h @@ -9,18 +9,18 @@ #include #include +#include +#include #if BOOST_VERSION >= 105600 #include -#include #include -#include #endif namespace cnn { - class Dict { - typedef std::unordered_map Map; - public: +class Dict { +typedef std::unordered_map Map; +public: Dict() : frozen(false), map_unk(false), unk_id(-1) { } @@ -37,42 +37,42 @@ namespace cnn { auto i = d_.find(word); if (i == d_.end()) { if (frozen) { - if (map_unk) { - return unk_id; - } - else { - std::cerr << map_unk << std::endl; - std::cerr << "Unknown word encountered: " << word << std::endl; - throw std::runtime_error("Unknown word encountered in frozen dictionary: " + word); - } - } - words_.push_back(word); - return d_[word] = words_.size() - 1; - } else { - return i->second; + if (map_unk) { + return unk_id; + } + else { + std::cerr << map_unk << std::endl; + std::cerr << "Unknown word encountered: " << word << std::endl; + throw std::runtime_error("Unknown word encountered in frozen dictionary: " + word); + } + } + words_.push_back(word); + return d_[word] = words_.size() - 1; + } else { + return i->second; + } } -} - -inline const std::string& Convert(const int& id) const { - assert(id < (int)words_.size()); - return words_[id]; -} - -void SetUnk(const std::string& word) { - if (!frozen) - throw std::runtime_error("Please call SetUnk() only after dictionary is frozen"); - if (map_unk) - throw std::runtime_error("Set UNK more than one time"); - - // temporarily unfrozen the dictionary to allow the add of the UNK - frozen = false; - unk_id = Convert(word); - frozen = true; - - map_unk = true; -} - -void clear() { words_.clear(); d_.clear(); } + + inline const std::string& Convert(const int& id) const { + assert(id < (int)words_.size()); + return words_[id]; + } + + void SetUnk(const std::string& word) { + if (!frozen) + throw std::runtime_error("Please call SetUnk() only after dictionary is frozen"); + if (map_unk) + throw std::runtime_error("Set UNK more than one time"); + + // temporarily unfrozen the dictionary to allow the add of the UNK + frozen = false; + unk_id = Convert(word); + frozen = true; + + map_unk = true; + } + + void clear() { words_.clear(); d_.clear(); } private: bool frozen; @@ -81,15 +81,19 @@ void clear() { words_.clear(); d_.clear(); } std::vector words_; Map d_; -#if BOOST_VERSION >= 105600 friend class boost::serialization::access; +#if BOOST_VERSION >= 105600 + template void serialize(Archive& ar, const unsigned int) { + ar & frozen; + ar & map_unk; + ar & unk_id; + ar & words_; + ar & d_; + } +#else template void serialize(Archive& ar, const unsigned int) { - ar & frozen; - ar & map_unk; - ar & unk_id; - ar & words_; - ar & d_; -} + throw std::invalid_argument("Serializing dictionaries is only supported on versions of boost 1.56 or higher"); + } #endif }; From 7533c38b8c6b8b2d4212a4fa1bc77c5e470f527e Mon Sep 17 00:00:00 2001 From: Manaal Faruqui Date: Sat, 31 Oct 2015 22:37:57 -0400 Subject: [PATCH 292/965] Example to read-write objects to file --- examples/read-write.cc | 159 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 examples/read-write.cc diff --git a/examples/read-write.cc b/examples/read-write.cc new file mode 100644 index 000000000..95e399532 --- /dev/null +++ b/examples/read-write.cc @@ -0,0 +1,159 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/gpu-ops.h" +#include "cnn/expr.h" +#include +#include + +#include +#include + +using namespace std; +using namespace cnn; +using namespace cnn::expr; + + +// This is a sample class which implements the xor model from xor.cc +// Everything in this class is just as you would do the usual except for +// parts with provided comments. +class XORModel { +public: + unsigned hidden_size; + + Expression W, b, V, a; + Parameters *pW, *pb, *pV, *pa; + + // It is important to have a null default constructor for the class, as + // we would first need to read the class object from the file, followed by + // the cnn model which has saved parameters. + XORModel() {} + + XORModel(const unsigned& hidden_len, Model *m) { + hidden_size = hidden_len; + InitParams(m); + } + + void InitParams(Model *m) { + pW = m->add_parameters({hidden_size, 2}); + pb = m->add_parameters({hidden_size}); + pV = m->add_parameters({1, hidden_size}); + pa = m->add_parameters({1}); + } + + void AddParamsToCG(ComputationGraph *cg) { + W = parameter(*cg, pW); + b = parameter(*cg, pb); + V = parameter(*cg, pV); + a = parameter(*cg, pa); + } + + float Train(vector &input, cnn::real &gold_output, + SimpleSGDTrainer *sgd) { + ComputationGraph cg; + AddParamsToCG(&cg); + + Expression x = cnn::expr::input(cg, {input.size()}, &input); + Expression y = cnn::expr::input(cg, &gold_output); + + Expression h = tanh(W*x + b); + Expression y_pred = V*h + a; + Expression loss = squared_distance(y_pred, y); + float return_loss = as_scalar(cg.forward()); + cg.backward(); + sgd->update(1.0); + return return_loss; + } + + float Decode(vector &input) { + ComputationGraph cg; + AddParamsToCG(&cg); + + Expression x = cnn::expr::input(cg, {input.size()}, &input); + Expression h = tanh(W*x + b); + Expression y_pred = V*h + a; + return as_scalar(cg.forward()); + } + + // This function should save all those variables in the archive, which + // determine the size of other members of the class, here: hidden_size + friend class boost::serialization::access; + template void serialize(Archive& ar, const unsigned int) { + + // This can either save or read the value of hidden_size from ar, + // depending on whether its the output or input archive. + ar & hidden_size; + } +}; + +void WriteToFile(string& filename, XORModel &model, Model &cnn_model) { + ofstream outfile(filename); + if (!outfile.is_open()) { + cerr << "File opening failed" << endl; + } + + boost::archive::text_oarchive oa(outfile); + oa & model; // Write down your class object. + oa & cnn_model; // Write down the cnn::Model object. + outfile.close(); +} + +void ReadFromFile(string& filename, XORModel *model, Model *cnn_model) { + ifstream infile(filename); + if (!infile.is_open()) { + cerr << "File opening failed" << endl; + } + + boost::archive::text_iarchive ia(infile); + ia & *model; // Read your class object + + // Now determine structure of cnn::Model depending on the + // the structure of your class object + model->InitParams(cnn_model); + ia & *cnn_model; // Read the cnn::Model + + infile.close(); +} + + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + + const unsigned HIDDEN = 8; + const unsigned ITERATIONS = 20; + Model m; + SimpleSGDTrainer sgd(&m); + XORModel model(HIDDEN, &m); + + vector x_values(2); // set x_values to change the inputs + cnn::real y_value; // set y_value to change the target output + + // Train the model + for (unsigned iter = 0; iter < ITERATIONS; ++iter) { + double loss = 0; + for (unsigned mi = 0; mi < 4; ++mi) { + bool x1 = mi % 2; + bool x2 = (mi / 2) % 2; + x_values[0] = x1 ? 1 : -1; + x_values[1] = x2 ? 1 : -1; + y_value = (x1 != x2) ? 1 : -1; + loss += model.Train(x_values, y_value, &sgd); + } + loss /= 4; + cerr << "E = " << loss << endl; + } + + string outfile = "out.txt"; + cerr << "Written model to File: " << outfile << endl; + WriteToFile(outfile, model, m); // Writing objects to file + + // New objects in which the written archive will be read + Model read_cnn_model; + XORModel read_model; + + cerr << "Reading model from File: " << outfile << endl; + ReadFromFile(outfile, &read_model, &read_cnn_model); // Reading from file + cerr << "Output for the input: " << x_values[0] << " " << x_values[1] << endl; + cerr << read_model.Decode(x_values); // Checking output for sanity +} + From 18a5f72b83073c52530b97f3c182305e07e3b3de Mon Sep 17 00:00:00 2001 From: Manaal Faruqui Date: Sat, 31 Oct 2015 22:43:39 -0400 Subject: [PATCH 293/965] add the binary to CMakeLists.txt --- examples/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index f5e2967e8..233dbdbd9 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2 mp morph) +foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2 mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) From 80adb29ae57743f6b3be89da531a5a3915038134 Mon Sep 17 00:00:00 2001 From: Manaal Faruqui Date: Sat, 31 Oct 2015 22:47:51 -0400 Subject: [PATCH 294/965] removed bad changes --- examples/easy-char-lstm-lm.cc | 261 ---------------- examples/morph.cc | 378 ----------------------- examples/sep_morph.cc | 348 ---------------------- examples/sep_morph_char_beam.cc | 511 -------------------------------- 4 files changed, 1498 deletions(-) delete mode 100644 examples/easy-char-lstm-lm.cc delete mode 100644 examples/morph.cc delete mode 100644 examples/sep_morph.cc delete mode 100644 examples/sep_morph_char_beam.cc diff --git a/examples/easy-char-lstm-lm.cc b/examples/easy-char-lstm-lm.cc deleted file mode 100644 index 415591263..000000000 --- a/examples/easy-char-lstm-lm.cc +++ /dev/null @@ -1,261 +0,0 @@ -/* - This program is meant to be an easy to understand tutorial on how to - use the cnn package for training neural networks. - - This program trains a character level language model with - character embeddings in an LSTM neural network. The parameters - of the LSTM model and the character embeddings are trained by minimizing - the negative log-likelihood on an input corpus. - - Inputs: vocab.txt -- file containing the list of characters separated by - whitespace in a single line. - Ex: a b c e ... z - train.txt -- file containing character sequences separated by - whitespace, every line is a word with spaces in between - every character. - ex: c a t - c a t s - ... - char_size -- desired length of the character embedding. - hidden_size -- length of the hidden layer in the LSTM. - - Run: ./build/examples/easy-char-lstm-lm vocab.txt train.txt 100 50 -*/ - -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/gpu-ops.h" -#include "cnn/expr.h" - -#include -#include - -#include -#include -#include -#include - -using namespace std; -using namespace cnn; -using namespace cnn::expr; - -/* - Function to read a line into words separated by 'delim' - This has nothing to be neural netowrks -- its just a utility function. -*/ -vector split_line(const string& line, char delim) { - vector words; - stringstream ss(line); - string item; - while (std::getline(ss, item, delim)) { - if (!item.empty()) - words.push_back(item); - } - return words; -} - -/* - This is the main class for implemeting LSTM based neural network. -*/ -class LSTM { - -public: - /* - Every parameter that we want to tune or every matrix/vector that we plan - on using during computation is declared as an 'Expression' in the cnn tool. - */ - Expression W_ix, W_ih, W_ic, W_cx, W_ch, - W_ox, W_oh, W_oc; // Weight matrices - Expression b_i, b_f, b_c, b_o; // Bias vectors - int char_len, hidden_len; // Length of the character embedding - // and internal hidden layer of the LSTM - - LSTM() {} - - /* - Initialize the parameters of the model: specify their dimensions. - These parameters are automatically initialized in the library. - - We will see what ComputationGraph and Model are in the main() function. - */ - void Init(const int& char_length, const int& hidden_length, - ComputationGraph *cg, Model *m) { - char_len = char_length; - hidden_len = hidden_length; - - /* - Every expression that you want to use should be added as a parameter - to the model (m, here) that you want to train. Also, it needs to be - specified that it will be a part of the ComputationGraph (cg). - */ - W_ix = parameter(*cg, m->add_parameters({hidden_len, char_len})); - W_ih = parameter(*cg, m->add_parameters({hidden_len, hidden_len})); - W_ic = parameter(*cg, m->add_parameters({hidden_len, hidden_len})); - - W_cx = parameter(*cg, m->add_parameters({hidden_len, char_len})); - W_ch = parameter(*cg, m->add_parameters({hidden_len, hidden_len})); - - W_ox = parameter(*cg, m->add_parameters({hidden_len, char_len})); - W_oh = parameter(*cg, m->add_parameters({hidden_len, hidden_len})); - W_oc = parameter(*cg, m->add_parameters({hidden_len, hidden_len})); - - b_i = parameter(*cg, m->add_parameters({hidden_len, 1})); - b_f = parameter(*cg, m->add_parameters({hidden_len, 1})); - b_c = parameter(*cg, m->add_parameters({hidden_len, 1})); - b_o = parameter(*cg, m->add_parameters({hidden_len, 1})); - } - - /* - This function reads a list of input vectors and outputs the list - of corresponding hidden layers from the LSTM. - */ - void GetHiddenUnits(const vector& cols, - Expression& h_init, - vector* hidden) { - // Initialize the hidden unit and the cell of the LSTM. - Expression h = h_init, c = h_init; - for (unsigned t = 0; t < cols.size(); ++t) { // Iterate over the input - /* - These are general LSTM computation equations. - Functions like logictic(), cwise_multiply() come from cnn library. - */ - Expression i = logistic(W_ix * cols[t] + W_ih * h + W_ic * c + b_i); - Expression f = 1.f - i; - - Expression temp = tanh(W_cx * cols[t] + W_ch * h + b_c); - c = cwise_multiply(f, c) + cwise_multiply(i, temp); - - Expression o = logistic(W_ox * cols[t] + W_oh * h + W_oc * c + b_o); - h = cwise_multiply(o, tanh(c)); - hidden->push_back(h); // Push the hidden layer at time t in the output. - } - } -}; - -/* - This function computes the total loss while predicting the next character - in sequence. This could be any loss function that you like. The end result - of the loss function should be a scalar Expression. - - @param(targets) -- the correct character ids to be predicted - @param(hidden_to_vocab) -- matrix to convert a hidden layer vector to a - vector of vocabulary size. -*/ -Expression ComputeLoss(const vector& hidden_units, - const vector& targets, - Expression& hidden_to_vocab) { - vector losses; - for (unsigned i = 0; i < targets.size(); ++i) { - // Project every hidden layer to a vector of size vocabulary - Expression out = hidden_to_vocab * hidden_units[i]; - // This function computes the negative log-likelihood of obsering - // the correct output character. - Expression loss = pickneglogsoftmax(out, targets[i]); - losses.push_back(loss); - } - return sum(losses); // sum all neg-llh over predictions -} - -int main(int argc, char** argv) { - cnn::Initialize(argc, argv); - - // Read the vocab file and determine the size of vocabulary - ifstream vocab_file(argv[1]); - vector chars; - if (vocab_file.is_open()) { - string line; - getline(vocab_file, line); - chars = split_line(line, ' '); - } else { - cerr << "File opening failed" << endl; - } - unsigned vocab_size = chars.size(); - - // Assign a unique id to every character in the vocabualry - unordered_map char_to_id; - int num_chars = 0; - for (const string& ch : chars) { - char_to_id[ch] = num_chars++; - } - - // Read the rest of command line parameters - string train_filename = argv[2]; // train file - unsigned char_size = atoi(argv[3]); - unsigned hidden_size = atoi(argv[4]); - vector ZERO(hidden_size, 0.0f); - - Model m; // Model that we will train - SimpleSGDTrainer sgd(&m); // We will train the model using stochastic - // gradient descent. - - // Variable that keeps track of the parameters and the computations being - // performed, in order to perform backpropagation later. - ComputationGraph cg; - - // Instead of representing a character vector by a one-hot vector and using - // a projection matrix to obtain its embedding, cnn provides a more efficent - // way of storing & updating the dense embeddings that are to be indexed - // frequently by their chracter ids. - LookupParameters* char_vecs = m.add_lookup_parameters(vocab_size, - {char_size}); - - // Paramter to project the hidden layer to a vocab_size vector for prediction - Expression hidden_to_vocab = parameter(cg, m.add_parameters({vocab_size, - hidden_size})); - LSTM lstm; - - // Initialize the parameters of the LSTM while making sure that those - // parameters are part of the ConfigurationGraph cg and the Model m -- so - // that they can be updated using backprop. - lstm.Init(char_size, hidden_size, &cg, &m); - - // Read the training file and train the model - unsigned num_iter = 100; - for (unsigned iter = 0; iter < num_iter; ++iter) { - ifstream train_file(train_filename); - if (train_file.is_open()) { - string line; - double loss = 0; - while (getline(train_file, line)) { - chars = split_line(line, ' '); - - vector input_vecs; - vector targets; - targets.clear(); - unsigned index = 0; - for (const string& ch : chars) { - // Construct a vector of the input vectors. The lookup function finds - // the vector corresponding to a given id 'char_to_id[ch]'. - if (index < chars.size() - 1) { - // Input are all characters except the last one '' - input_vecs.push_back(lookup(cg, char_vecs, char_to_id[ch])); - } - if (index > 0) { - // The characters to be predicted are all the characters except - // the first one. '' - targets.push_back(char_to_id[ch]); - } - ++index; - } - - vector hidden_units; - // Initialize the hidden layer of LSTM to be a zero vector - Expression h = input(cg, {hidden_size}, &ZERO); - // Obtain the hidden layer outputs - lstm.GetHiddenUnits(input_vecs, h, &hidden_units); - // Predict the output character using hidden layers and compute loss - Expression e = ComputeLoss(hidden_units, targets, hidden_to_vocab); - // The forward function runs all the expressions of computation we have - // built till now in the computation graph and return the output of the - // last step -- in this case, the prediction loss. - loss += as_scalar(cg.forward()); - cg.backward(); // Compute graidents using backpropagation - sgd.update(1); // Updata parameters with learning rate 1. - } - cerr << "nllh: " << loss << endl; - train_file.close(); - } - } -} - diff --git a/examples/morph.cc b/examples/morph.cc deleted file mode 100644 index 811d98b58..000000000 --- a/examples/morph.cc +++ /dev/null @@ -1,378 +0,0 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/gpu-ops.h" -#include "cnn/expr.h" - -#include -#include - -#include -#include -#include -#include - -using namespace std; -using namespace cnn; -using namespace cnn::expr; - -string BOW = "", EOW = ""; - -vector split_line(const string& line, char delim) { - vector words; - stringstream ss(line); - string item; - while (std::getline(ss, item, delim)) { - if (!item.empty()) - words.push_back(item); - } - return words; -} - -class LSTM { - - protected: - /* The parameters of the model */ - Expression W_ix, W_ih, W_ic, W_cx, W_ch, - W_ox, W_oh, W_oc; // Weight matrices - Expression b_i, b_f, b_c, b_o; // Bias vectors - - // Project hidden layer for predicting words (only used by decoder) - Expression hidden_to_output, hidden_to_output_bias; - - Parameters *pW_ix, *pW_ih, *pW_ic, *pW_cx, *pW_ch, *pW_ox, *pW_oh, *pW_oc; - Parameters *pb_i, *pb_f, *pb_c, *pb_o; - Parameters *phidden_to_output, *phidden_to_output_bias; - - vector ZERO; - Expression h_init; - - public: - int char_len, hidden_len, vocab_len; - - LSTM() {} - - void Init(const int& char_length, const int& hidden_length, - const int& vocab_length, Model *m) { - char_len = char_length; - hidden_len = hidden_length; - vocab_len = vocab_length; - - pW_ix = m->add_parameters({hidden_len, char_len}); - pW_ih = m->add_parameters({hidden_len, hidden_len}); - pW_ic = m->add_parameters({hidden_len, hidden_len}); - - pW_cx = m->add_parameters({hidden_len, char_len}); - pW_ch = m->add_parameters({hidden_len, hidden_len}); - - pW_ox = m->add_parameters({hidden_len, char_len}); - pW_oh = m->add_parameters({hidden_len, hidden_len}); - pW_oc = m->add_parameters({hidden_len, hidden_len}); - - pb_i = m->add_parameters({hidden_len, 1}); - pb_f = m->add_parameters({hidden_len, 1}); - pb_c = m->add_parameters({hidden_len, 1}); - pb_o = m->add_parameters({hidden_len, 1}); - - phidden_to_output = m->add_parameters({vocab_len, hidden_len}); - phidden_to_output_bias = m->add_parameters({vocab_len, 1}); - - for (int i = 0; i < hidden_len; ++i) { - ZERO.push_back(0.); - } - } - - void AddParamsToCG(ComputationGraph* cg) { - W_ix = parameter(*cg, pW_ix); - W_ih = parameter(*cg, pW_ih); - W_ic = parameter(*cg, pW_ic); - - W_cx = parameter(*cg, pW_cx); - W_ch = parameter(*cg, pW_ch); - - W_ox = parameter(*cg, pW_ox); - W_oh = parameter(*cg, pW_oh); - W_oc = parameter(*cg, pW_oc); - - b_i = parameter(*cg, pb_i); - b_f = parameter(*cg, pb_f); - b_c = parameter(*cg, pb_c); - b_o = parameter(*cg, pb_o); - - hidden_to_output = parameter(*cg, phidden_to_output); - hidden_to_output_bias = parameter(*cg, phidden_to_output_bias); - - h_init = input(*cg, {hidden_len}, &ZERO); - } - - void ComputeHC (const Expression& input, Expression* h, Expression* c) const { - Expression i = logistic(affine_transform({b_i, W_ix, input, W_ih, *h, W_ic, *c})); - Expression f = 1.0f - i; - - Expression temp = tanh(affine_transform({b_c, W_cx, input, W_ch, *h})); - *c = cwise_multiply(f, *c) + cwise_multiply(i, temp); // Update c - - Expression o = logistic(affine_transform({b_o, W_ox, input, W_oh, *h, W_oc, *c})); - *h = cwise_multiply(o, tanh(*c)); // Update h - } - - void GetAllHiddenUnits(const vector& cols, - vector* hidden) const { - Expression h = h_init, c = h_init; - for (unsigned t = 0; t < cols.size(); ++t) { - ComputeHC(cols[t], &h, &c); - hidden->push_back(h); - } - } - - void GetLastHiddenUnit(const vector& cols, Expression* hidden) - const { - Expression h = h_init, c = h_init; - for (unsigned t = 0; t < cols.size(); ++t) { - ComputeHC(cols[t], &h, &c); - } - *hidden = h; - } -}; - -class Encoder : public LSTM { - public: - void EncodeInputIntoVector(const vector& cols, - Expression* hidden) const { - GetLastHiddenUnit(cols, hidden); - } -}; - -class Decoder : public LSTM { - - public: - void ProjectToVocab(const Expression& hidden, Expression* out) const { - *out = affine_transform({hidden_to_output_bias, hidden_to_output, hidden}); - } - - Expression ComputeLoss(const vector& hidden_units, - const vector& targets) const { - assert(hidden_units.size() == targets.size()); - vector losses; - for (unsigned i = 0; i < hidden_units.size(); ++i) { - Expression out; - ProjectToVocab(hidden_units[i], &out); - losses.push_back(pickneglogsoftmax(out, targets[i])); - } - return sum(losses); - } - - void DecodeUntilTermFound(const Expression& encoded_word_vec, - LookupParameters* char_vecs, - unordered_map& char_to_id, - vector* pred_target_ids, - ComputationGraph* cg) const { - Expression input_word_vec = lookup(*cg, char_vecs, char_to_id[BOW]); - Expression h = h_init, c = h_init; - while (true) { - Expression input = concatenate({encoded_word_vec, input_word_vec}); - ComputeHC(input, &h, &c); - Expression out; - ProjectToVocab(h, &out); - vector dist = as_vector(cg->incremental_forward()); - unsigned pred_index = 0; - float best_score = dist[pred_index]; - for (unsigned index = 1; index < dist.size(); ++index) { - if (dist[index] > best_score) { - best_score = dist[index]; - pred_index = index; - } - } - if (pred_index == char_to_id[EOW]) { - return; // If the end is found, break from the loop and return - } - pred_target_ids->push_back(pred_index); - input_word_vec = lookup(*cg, char_vecs, pred_index); - } - } -}; - -class MorphTrans { - public: - Encoder encoder; - Decoder decoder; - LookupParameters* char_vecs; - Expression transform_encoded, transform_encoded_bias; - Parameters *ptransform_encoded, *ptransform_encoded_bias; - - MorphTrans(const int& char_length, const int& hidden_length, - const int& vocab_length, Model *m) { - encoder.Init(char_length, hidden_length, vocab_length, m); - decoder.Init(char_length + hidden_length, hidden_length, vocab_length, m); - - char_vecs = m->add_lookup_parameters(vocab_length, {char_length}); - ptransform_encoded = m->add_parameters({hidden_length, hidden_length}); - ptransform_encoded_bias = m->add_parameters({hidden_length, 1}); - } - - void AddParamsToCG(ComputationGraph* cg) { - encoder.AddParamsToCG(cg); - decoder.AddParamsToCG(cg); - transform_encoded = parameter(*cg, ptransform_encoded); - transform_encoded_bias = parameter(*cg, ptransform_encoded_bias); - } - - void TransformEncodedInputForDecoding(Expression* encoded_input) const { - return; - *encoded_input = affine_transform( - {transform_encoded_bias, transform_encoded, *encoded_input}); - } - - void EncodeInputAndTransform(const vector& inputs, - Expression* encoded_input_vec, - ComputationGraph* cg) const { - vector input_vecs; - for (const unsigned& input_id : inputs) { - input_vecs.push_back(lookup(*cg, char_vecs, input_id)); - } - - // Running the encoder now. - encoder.EncodeInputIntoVector(input_vecs, encoded_input_vec); - - // Transform it to feed it into the decoder - TransformEncodedInputForDecoding(encoded_input_vec); - } - - float Train(const vector& inputs, const vector& outputs, - Model *m, AdadeltaTrainer* ada_gd) { - ComputationGraph cg; - AddParamsToCG(&cg); - - // Encode and Transofrm to feed into decoder - Expression encoded_input_vec; - EncodeInputAndTransform(inputs, &encoded_input_vec, &cg); - - // Use this encoded word vector to predict the transformed word - vector input_vecs_for_dec; - vector output_ids_for_pred; - for (unsigned i = 0; i < outputs.size(); ++i) { - if (i < outputs.size() - 1) { - // '' will not be fed as input -- it needs to be predicted. - input_vecs_for_dec.push_back(concatenate( - {encoded_input_vec, lookup(cg, char_vecs, outputs[i])})); - } - if (i > 0) { // '' will not be predicted in the output -- its fed in. - output_ids_for_pred.push_back(outputs[i]); - } - } - - vector dec_hidden_units; - decoder.GetAllHiddenUnits(input_vecs_for_dec, &dec_hidden_units); - Expression loss = decoder.ComputeLoss(dec_hidden_units, output_ids_for_pred); - - float return_loss = as_scalar(cg.forward()); - cg.backward(); - ada_gd->update(1.0f); - return return_loss; - } - - void Predict(vector& inputs, - unordered_map& char_to_id, - vector* outputs) { - ComputationGraph cg; - AddParamsToCG(&cg); - - // Encode and Transofrm to feed into decoder - Expression encoded_input_vec; - EncodeInputAndTransform(inputs, &encoded_input_vec, &cg); - - // Make preditions using the decoder. - decoder.DecodeUntilTermFound(encoded_input_vec, char_vecs, char_to_id, - outputs, &cg); - } -}; - -int main(int argc, char** argv) { - cnn::Initialize(argc, argv); - - // Read the vocab file - ifstream vocab_file(argv[1]); - vector chars; - if (vocab_file.is_open()) { - string line; - getline(vocab_file, line); - chars = split_line(line, ' '); - } else { - cerr << "File opening failed" << endl; - } - unsigned vocab_size = chars.size(); - unordered_map char_to_id; - unordered_map id_to_char; - unsigned num_chars = 0; - for (const string& ch : chars) { - char_to_id[ch] = num_chars; - id_to_char[num_chars] = ch; - num_chars++; - } - - string train_filename = argv[2]; // train file - string test_filename = argv[3]; - unsigned char_size = atoi(argv[4]); - unsigned hidden_size = atoi(argv[5]); - unsigned num_iter = atoi(argv[6]); - - Model m; - float regularization_strength = 1e-6f; - AdadeltaTrainer ada_gd(&m, regularization_strength); - MorphTrans nn(char_size, hidden_size, vocab_size, &m); - - // Read the training file and train the model - for (unsigned iter = 0; iter < num_iter; ++iter) { - ifstream train_file(train_filename); - if (train_file.is_open()) { - string line; - float loss = 0; - while (getline(train_file, line)) { - chars = split_line(line, ' '); - vector input_ids, target_ids; - input_ids.clear(); target_ids.clear(); - bool reading_target = false; - for (const string& ch : chars) { - input_ids.push_back(char_to_id[ch]); - if (reading_target) { - target_ids.push_back(char_to_id[ch]); - } - if (ch == EOW) { - reading_target = true; - } - } - loss += nn.Train(input_ids, target_ids, &m, &ada_gd); - } - cerr << "Iter " << iter + 1 << " nllh: " << loss << endl; - train_file.close(); - } else { - cerr << "Failed to open the file" << endl; - } - } - - // Read the test file and output predictions for the words. - ifstream test_file(test_filename); - if (test_file.is_open()) { - string line; - while (getline(test_file, line)) { - chars = split_line(line, ' '); - vector input_ids, target_ids; - vector pred_target_ids; - input_ids.clear(); pred_target_ids.clear(); - cerr << "Input: " << line; - for (const string& ch : chars) { - input_ids.push_back(char_to_id[ch]); - } - // Read the input char vectors and obtain word representation - nn.Predict(input_ids, char_to_id, &pred_target_ids); - cerr << "Output: "; - for (unsigned i = 0; i < pred_target_ids.size(); ++i) { - cerr << id_to_char[pred_target_ids[i]]; - } - cerr << endl; - } - } else { - cerr << "Test file opening failed" << endl; - } - return 1; -} diff --git a/examples/sep_morph.cc b/examples/sep_morph.cc deleted file mode 100644 index 13bd8d70d..000000000 --- a/examples/sep_morph.cc +++ /dev/null @@ -1,348 +0,0 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/lstm.h" -#include "cnn/training.h" -#include "cnn/gpu-ops.h" -#include "cnn/expr.h" - -#include -#include - -#include -#include -#include -#include - -using namespace std; -using namespace cnn; -using namespace cnn::expr; - -string BOW = "", EOW = ""; -unsigned MAX_PRED_LEN = 100; - -vector split_line(const string& line, char delim) { - vector words; - stringstream ss(line); - string item; - while (std::getline(ss, item, delim)) { - if (!item.empty()) - words.push_back(item); - } - return words; -} - -template -class MorphTrans { - public: - Builder input_forward, input_backward, output_forward; - LookupParameters* char_vecs; - - Expression hidden_to_output, hidden_to_output_bias; - Parameters *phidden_to_output, *phidden_to_output_bias; - - Expression transform_encoded, transform_encoded_bias; - Parameters *ptransform_encoded, *ptransform_encoded_bias; - - MorphTrans(const int& char_length, const int& hidden_length, - const int& vocab_length, const int& layers, Model *m) : - input_forward(layers, char_length, hidden_length, m), - input_backward(layers, char_length, hidden_length, m), - output_forward(layers, char_length + hidden_length, hidden_length, m) { - char_vecs = m->add_lookup_parameters(vocab_length, {char_length}); - - phidden_to_output = m->add_parameters({vocab_length, hidden_length}); - phidden_to_output_bias = m->add_parameters({vocab_length, 1}); - - ptransform_encoded = m->add_parameters({hidden_length, 2 * hidden_length}); - ptransform_encoded_bias = m->add_parameters({hidden_length, 1}); - } - - void AddParamsToCG(ComputationGraph* cg) { - input_forward.new_graph(*cg); - input_backward.new_graph(*cg); - output_forward.new_graph(*cg); - - hidden_to_output = parameter(*cg, phidden_to_output); - hidden_to_output_bias = parameter(*cg, phidden_to_output_bias); - - transform_encoded = parameter(*cg, ptransform_encoded); - transform_encoded_bias = parameter(*cg, ptransform_encoded_bias); - } - - void RunFwdBwd(const vector& inputs, - Expression* hidden, ComputationGraph *cg) { - vector input_vecs; - for (const unsigned& input_id : inputs) { - input_vecs.push_back(lookup(*cg, char_vecs, input_id)); - } - - // Run forward LSTM - Expression forward_unit; - input_forward.start_new_sequence(); - for (unsigned i = 0; i < input_vecs.size(); ++i) { - forward_unit = input_forward.add_input(input_vecs[i]); - } - - // Run backward LSTM - reverse(input_vecs.begin(), input_vecs.end()); - Expression backward_unit; - input_backward.start_new_sequence(); - for (unsigned i = 0; i < input_vecs.size(); ++i) { - backward_unit = input_backward.add_input(input_vecs[i]); - } - - // Concatenate the forward and back hidden layers - *hidden = concatenate({forward_unit, backward_unit}); - } - - void TransformEncodedInputForDecoding(Expression* encoded_input) const { - *encoded_input = affine_transform({transform_encoded_bias, - transform_encoded, *encoded_input}); - } - - void ProjectToVocab(const Expression& hidden, Expression* out) const { - *out = affine_transform({hidden_to_output_bias, hidden_to_output, hidden}); - } - - Expression ComputeLoss(const vector& hidden_units, - const vector& targets) const { - assert(hidden_units.size() == targets.size()); - vector losses; - for (unsigned i = 0; i < hidden_units.size(); ++i) { - Expression out; - ProjectToVocab(hidden_units[i], &out); - losses.push_back(pickneglogsoftmax(out, targets[i])); - } - return sum(losses); - } - - float Train(const vector& inputs, const vector& outputs, - AdadeltaTrainer* ada_gd) { - ComputationGraph cg; - AddParamsToCG(&cg); - - // Encode and Transform to feed into decoder - Expression encoded_input_vec; - RunFwdBwd(inputs, &encoded_input_vec, &cg); - TransformEncodedInputForDecoding(&encoded_input_vec); - - // Use this encoded word vector to predict the transformed word - vector input_vecs_for_dec; - vector output_ids_for_pred; - for (unsigned i = 0; i < outputs.size(); ++i) { - if (i < outputs.size() - 1) { - // '' will not be fed as input -- it needs to be predicted. - input_vecs_for_dec.push_back(concatenate( - {encoded_input_vec, lookup(cg, char_vecs, outputs[i])})); - } - if (i > 0) { // '' will not be predicted in the output -- its fed in. - output_ids_for_pred.push_back(outputs[i]); - } - } - - vector decoder_hidden_units; - output_forward.start_new_sequence(); - for (const auto& vec : input_vecs_for_dec) { - decoder_hidden_units.push_back(output_forward.add_input(vec)); - } - Expression loss = ComputeLoss(decoder_hidden_units, output_ids_for_pred); - - float return_loss = as_scalar(cg.forward()); - cg.backward(); - ada_gd->update(1.0f); - return return_loss; - } - - void Decode(const Expression& encoded_word_vec, - unordered_map& char_to_id, - vector* pred_target_ids, ComputationGraph* cg) { - Expression input_word_vec = lookup(*cg, char_vecs, char_to_id[BOW]); - pred_target_ids->push_back(char_to_id[BOW]); - output_forward.start_new_sequence(); - while (pred_target_ids->size() < MAX_PRED_LEN) { - Expression input = concatenate({encoded_word_vec, input_word_vec}); - Expression hidden = output_forward.add_input(input); - Expression out; - ProjectToVocab(hidden, &out); - vector dist = as_vector(cg->incremental_forward()); - unsigned pred_index = 0; - float best_score = dist[pred_index]; - for (unsigned index = 1; index < dist.size(); ++index) { - if (dist[index] > best_score) { - best_score = dist[index]; - pred_index = index; - } - } - pred_target_ids->push_back(pred_index); - if (pred_index == char_to_id[EOW]) { - return; // If the end is found, break from the loop and return - } - input_word_vec = lookup(*cg, char_vecs, pred_index); - } - } - - void Predict(const vector& inputs, - unordered_map& char_to_id, - vector* outputs) { - ComputationGraph cg; - AddParamsToCG(&cg); - - // Encode and Transofrm to feed into decoder - Expression encoded_input_vec; - RunFwdBwd(inputs, &encoded_input_vec, &cg); - TransformEncodedInputForDecoding(&encoded_input_vec); - - // Make preditions using the decoder. - Decode(encoded_input_vec, char_to_id, outputs, &cg); - } -}; - -int main(int argc, char** argv) { - cnn::Initialize(argc, argv); - - string vocab_filename = argv[1]; // vocabulary of words/characters - string morph_filename = argv[2]; - string train_filename = argv[3]; - string test_filename = argv[4]; - unsigned char_size = atoi(argv[5]); - unsigned hidden_size = atoi(argv[6]); - unsigned num_iter = atoi(argv[7]); - float reg_strength = atof(argv[8]); - unsigned layers = atoi(argv[9]); - - ifstream vocab_file(vocab_filename); - vector chars; - if (vocab_file.is_open()) { // Reading the vocab file - string line; - getline(vocab_file, line); - chars = split_line(line, ' '); - } else { - cerr << "File opening failed" << endl; - } - unordered_map char_to_id; - unordered_map id_to_char; - unsigned char_id = 0; - for (const string& ch : chars) { - char_to_id[ch] = char_id; - id_to_char[char_id] = ch; - char_id++; - } - unsigned vocab_size = char_to_id.size(); - - ifstream morph_file(morph_filename); - vector morph_attrs; - if (morph_file.is_open()) { // Reading the vocab file - string line; - getline(morph_file, line); - morph_attrs = split_line(line, ' '); - } else { - cerr << "File opening failed" << endl; - } - unordered_map morph_to_id; - unordered_map id_to_morph; - unsigned morph_id = 0; - for (const string& ch : morph_attrs) { - morph_to_id[ch] = morph_id; - id_to_morph[morph_id] = ch; - morph_id++; - } - unsigned morph_size = morph_to_id.size(); - - vector m; - vector optimizer; - vector > nn; - for (unsigned i = 0; i < morph_size; ++i) { - m.push_back(new Model()); - AdadeltaTrainer ada(m[i], reg_strength); - optimizer.push_back(ada); - MorphTrans neural(char_size, hidden_size, vocab_size, layers, m[i]); - nn.push_back(neural); - } - - // Read the training file in a vector - vector train_data; - ifstream train_file(train_filename); - if (train_file.is_open()) { - string line; - while (getline(train_file, line)) { - train_data.push_back(line); - } - } - train_file.close(); - - // Read the test file in a vector - vector test_data; - ifstream test_file(test_filename); - if (test_file.is_open()) { - string line; - while (getline(test_file, line)) { - test_data.push_back(line); - } - } - test_file.close(); - - // Read the training file and train the model - for (unsigned iter = 0; iter < num_iter; ++iter) { - unsigned line_id = 0; - random_shuffle(train_data.begin(), train_data.end()); - vector loss(morph_size, 0.0f); - for (string& line : train_data) { - vector items = split_line(line, '|'); - vector input_ids, target_ids; - input_ids.clear(); target_ids.clear(); - for (const string& ch : split_line(items[0], ' ')) { - input_ids.push_back(char_to_id[ch]); - } - for (const string& ch : split_line(items[1], ' ')) { - target_ids.push_back(char_to_id[ch]); - } - unsigned morph_id = morph_to_id[items[2]]; - loss[morph_id] += nn[morph_id].Train(input_ids, target_ids, &optimizer[morph_id]); - cerr << ++line_id << "\r"; - } - - cerr << "Iter " << iter + 1 << " "; - for (unsigned i = 0; i < loss.size(); ++i) { - cerr << loss[i] << " "; - } - cerr << "Sum: " << accumulate(loss.begin(), loss.end(), 0.) << endl; - - // Read the test file and output predictions for the words. - string line; - double correct = 0, total = 0; - for (string& line : test_data) { - vector items = split_line(line, '|'); - vector input_ids, target_ids, pred_target_ids; - input_ids.clear(); target_ids.clear(); pred_target_ids.clear(); - for (const string& ch : split_line(items[0], ' ')) { - input_ids.push_back(char_to_id[ch]); - } - for (const string& ch : split_line(items[1], ' ')) { - target_ids.push_back(char_to_id[ch]); - } - unsigned morph_id = morph_to_id[items[2]]; - nn[morph_id].Predict(input_ids, char_to_id, &pred_target_ids); - - string prediction = ""; - for (unsigned i = 0; i < pred_target_ids.size(); ++i) { - prediction += id_to_char[pred_target_ids[i]]; - if (i != pred_target_ids.size() - 1) { - prediction += " "; - } - } - if (prediction == items[1]) { - correct += 1; - } else { // If wrong, print prediction and correct answer - if (iter == num_iter - 1) { - cout << items[0] << '|' << items[1] << '|' << items[2] << endl; - cout << items[0] << '|' << prediction << '|' << items[2] << endl; - } - } - total += 1; - } - cerr << "Prediction Accuracy: " << correct / total << endl; - } - return 1; -} diff --git a/examples/sep_morph_char_beam.cc b/examples/sep_morph_char_beam.cc deleted file mode 100644 index df02810e8..000000000 --- a/examples/sep_morph_char_beam.cc +++ /dev/null @@ -1,511 +0,0 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/lstm.h" -#include "cnn/training.h" -#include "cnn/gpu-ops.h" -#include "cnn/expr.h" - -#include -#include - -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace cnn; -using namespace cnn::expr; - -string BOW = "", EOW = ""; -unsigned MAX_PRED_LEN = 100; -float NEG_INF = numeric_limits::min(); - -vector split_line(const string& line, char delim) { - vector words; - stringstream ss(line); - string item; - while (std::getline(ss, item, delim)) { - if (!item.empty()) - words.push_back(item); - } - return words; -} - -template -class MorphTrans { - public: - Builder input_forward, input_backward, output_forward; - LookupParameters* char_vecs; - - Expression hidden_to_output, hidden_to_output_bias; - Parameters *phidden_to_output, *phidden_to_output_bias; - - Expression transform_encoded, transform_encoded_bias; - Parameters *ptransform_encoded, *ptransform_encoded_bias; - - unsigned char_len; - Expression EPS; - Parameters *peps_vec; - - MorphTrans(const int& char_length, const int& hidden_length, - const int& vocab_length, const int& layers, Model *m) : - input_forward(layers, char_length, hidden_length, m), - input_backward(layers, char_length, hidden_length, m), - output_forward(layers, 2 * char_length + hidden_length, hidden_length, m) { - char_len = char_length; - char_vecs = m->add_lookup_parameters(vocab_length, {char_length}); - - phidden_to_output = m->add_parameters({vocab_length, hidden_length}); - phidden_to_output_bias = m->add_parameters({vocab_length, 1}); - - ptransform_encoded = m->add_parameters({hidden_length, 2 * hidden_length}); - ptransform_encoded_bias = m->add_parameters({hidden_length, 1}); - - peps_vec = m->add_parameters({char_len, 1}); - } - - void AddParamsToCG(ComputationGraph* cg) { - input_forward.new_graph(*cg); - input_backward.new_graph(*cg); - output_forward.new_graph(*cg); - - hidden_to_output = parameter(*cg, phidden_to_output); - hidden_to_output_bias = parameter(*cg, phidden_to_output_bias); - - transform_encoded = parameter(*cg, ptransform_encoded); - transform_encoded_bias = parameter(*cg, ptransform_encoded_bias); - - EPS = parameter(*cg, peps_vec); - } - - void RunFwdBwd(const vector& inputs, - Expression* hidden, ComputationGraph *cg) { - vector input_vecs; - for (const unsigned& input_id : inputs) { - input_vecs.push_back(lookup(*cg, char_vecs, input_id)); - } - - // Run forward LSTM - Expression forward_unit; - input_forward.start_new_sequence(); - for (unsigned i = 0; i < input_vecs.size(); ++i) { - forward_unit = input_forward.add_input(input_vecs[i]); - } - - // Run backward LSTM - reverse(input_vecs.begin(), input_vecs.end()); - Expression backward_unit; - input_backward.start_new_sequence(); - for (unsigned i = 0; i < input_vecs.size(); ++i) { - backward_unit = input_backward.add_input(input_vecs[i]); - } - - // Concatenate the forward and back hidden layers - *hidden = concatenate({forward_unit, backward_unit}); - } - - void TransformEncodedInputForDecoding(Expression* encoded_input) const { - *encoded_input = affine_transform({transform_encoded_bias, - transform_encoded, *encoded_input}); - } - - void ProjectToVocab(const Expression& hidden, Expression* out) const { - *out = affine_transform({hidden_to_output_bias, hidden_to_output, hidden}); - } - - Expression ComputeLoss(const vector& hidden_units, - const vector& targets) const { - assert(hidden_units.size() == targets.size()); - vector losses; - for (unsigned i = 0; i < hidden_units.size(); ++i) { - Expression out; - ProjectToVocab(hidden_units[i], &out); - losses.push_back(pickneglogsoftmax(out, targets[i])); - } - return sum(losses); - } - - float Train(const vector& inputs, const vector& outputs, - AdadeltaTrainer* ada_gd) { - ComputationGraph cg; - AddParamsToCG(&cg); - - // Encode and Transform to feed into decoder - Expression encoded_input_vec; - RunFwdBwd(inputs, &encoded_input_vec, &cg); - TransformEncodedInputForDecoding(&encoded_input_vec); - - // Use this encoded word vector to predict the transformed word - vector input_vecs_for_dec; - vector output_ids_for_pred; - for (unsigned i = 0; i < outputs.size(); ++i) { - if (i < outputs.size() - 1) { - // '' will not be fed as input -- it needs to be predicted. - if (i < inputs.size() - 1) { - input_vecs_for_dec.push_back(concatenate( - {encoded_input_vec, lookup(cg, char_vecs, outputs[i]), - lookup(cg, char_vecs, inputs[i+1])})); - } else { - input_vecs_for_dec.push_back(concatenate( - {encoded_input_vec, lookup(cg, char_vecs, outputs[i]), EPS})); - } - } - if (i > 0) { // '' will not be predicted in the output -- its fed in. - output_ids_for_pred.push_back(outputs[i]); - } - } - - vector decoder_hidden_units; - output_forward.start_new_sequence(); - for (const auto& vec : input_vecs_for_dec) { - decoder_hidden_units.push_back(output_forward.add_input(vec)); - } - Expression loss = ComputeLoss(decoder_hidden_units, output_ids_for_pred); - - float return_loss = as_scalar(cg.forward()); - cg.backward(); - ada_gd->update(1.0f); - return return_loss; - } - - void Decode(const Expression& encoded_word_vec, - unordered_map& char_to_id, - vector* pred_target_ids, - const vector input_ids, ComputationGraph* cg) { - Expression input_word_vec = lookup(*cg, char_vecs, char_to_id[BOW]); - pred_target_ids->push_back(char_to_id[BOW]); - output_forward.start_new_sequence(); - unsigned out_index = 1; - while (pred_target_ids->size() < MAX_PRED_LEN) { - Expression input; - if (out_index < input_ids.size()) { - input = concatenate({encoded_word_vec, input_word_vec, - lookup(*cg, char_vecs, input_ids[out_index])}); - } else { - input = concatenate({encoded_word_vec, input_word_vec, EPS}); - } - Expression hidden = output_forward.add_input(input); - Expression out; - ProjectToVocab(hidden, &out); - vector dist = as_vector(cg->incremental_forward()); - unsigned pred_index = 0; - float best_score = dist[pred_index]; - for (unsigned index = 1; index < dist.size(); ++index) { - if (dist[index] > best_score) { - best_score = dist[index]; - pred_index = index; - } - } - pred_target_ids->push_back(pred_index); - if (pred_index == char_to_id[EOW]) { - return; // If the end is found, break from the loop and return - } - input_word_vec = lookup(*cg, char_vecs, pred_index); - out_index++; - } - } - - void BeamDecode(const Expression& encoded_word_vec, - unordered_map& char_to_id, - vector* pred_target_ids, - const vector& input_ids, const unsigned beam_size, - ComputationGraph* cg) { - Expression prev_output_vec = lookup(*cg, char_vecs, char_to_id[BOW]); - output_forward.start_new_sequence(); - unsigned out_index = 1; - - // Enter the start symbol in the decoder. - Expression input = concatenate({encoded_word_vec, prev_output_vec, - lookup(*cg, char_vecs, input_ids[out_index])}); - Expression hidden = output_forward.add_input(input); - Expression out; - ProjectToVocab(hidden, &out); - out = log_softmax(out); - vector log_dist = as_vector(cg->incremental_forward()); - priority_queue > init_queue; - for (unsigned i = 0; i < log_dist.size(); ++i) { - init_queue.push(make_pair(log_dist[i], i)); - } - unsigned vocab_size = log_dist.size(); - - // Initialise the beam_size sequences, scores, hidden states. - vector > sequences; - vector log_scores; - vector prev_states; - for (unsigned beam_id = 0; beam_id < beam_size; ++beam_id) { - vector seq; - seq.push_back(char_to_id[BOW]); - seq.push_back(init_queue.top().second); - sequences.push_back(seq); - - log_scores.push_back(init_queue.top().first); - prev_states.push_back(output_forward.state()); - init_queue.pop(); - } - - vector neg_inf(vocab_size, NEG_INF); - Expression neg_inf_vec = cnn::expr::input(*cg, {vocab_size}, &neg_inf); - - vector active_beams(beam_size, true); - while (true) { - out_index++; - Expression input_char_vec; - if (out_index < input_ids.size()) { - input_char_vec = lookup(*cg, char_vecs, input_ids[out_index]); - } else { - input_char_vec = EPS; - } - - priority_queue > > probs_queue; - unordered_map curr_states; - vector out_dist; - for (unsigned beam_id = 0; beam_id < beam_size; ++beam_id) { - if (active_beams[beam_id]) { - unsigned prev_out_char = sequences[beam_id].back(); - Expression prev_out_vec = lookup(*cg, char_vecs, prev_out_char); - Expression input = concatenate({encoded_word_vec, prev_out_vec, - input_char_vec}); - hidden = output_forward.add_input(prev_states[beam_id], input); - curr_states[beam_id] = output_forward.state(); - - ProjectToVocab(hidden, &out); - out_dist.push_back(log_softmax(out)); - } else { - out_dist.push_back(neg_inf_vec); - } - } - Expression all_scores = concatenate(out_dist); - vector log_dist = as_vector(cg->incremental_forward()); - - for (unsigned index = 0; index < log_dist.size(); ++index) { - unsigned beam_id = index / vocab_size; - unsigned char_id = index % vocab_size; - if (active_beams[beam_id]) { - pair location = make_pair(beam_id, char_id); - probs_queue.push(pair >( - log_scores[beam_id] + log_dist[index], location)); - } - } - - // Find the beam_size best now and update the variables. - unordered_map > new_seq; - for (unsigned beam_id = 0; beam_id < beam_size; ++beam_id) { - if (active_beams[beam_id]) { - float log_prob = probs_queue.top().first; - pair location = probs_queue.top().second; - unsigned old_beam_id = location.first, char_id = location.second; - - vector seq = sequences[old_beam_id]; - seq.push_back(char_id); - new_seq[beam_id] = seq; - log_scores[beam_id] = log_prob; // Update the score - prev_states[beam_id] = curr_states[old_beam_id]; // Update hidden state - - probs_queue.pop(); - } - } - - // Update the sequences now. - for (auto& it : new_seq) { - sequences[it.first] = it.second; - } - - // Check if a sequence should be made inactive. - for (unsigned beam_id = 0; beam_id < beam_size; ++beam_id) { - if (active_beams[beam_id] && - (sequences[beam_id].back() == char_to_id[EOW] || - sequences[beam_id].size() > MAX_PRED_LEN)) { - active_beams[beam_id] = false; - } - } - - // Check if all sequences are inactive. - /*bool all_inactive = true; - for (unsigned beam_id = 0; beam_id < beam_size; ++beam_id) { - if (active_beams[beam_id]) { - all_inactive = false; - break; - } - }*/ - - // When the sequence with highest score has become inactive, return. - unsigned max_beam_index = distance(log_scores.begin(), - max_element(log_scores.begin(), - log_scores.end())); - if (!active_beams[max_beam_index]) { - *pred_target_ids = sequences[max_beam_index]; - return; - } - } - } - - void Predict(const vector& inputs, - unordered_map& char_to_id, - const unsigned beam_size, - vector* outputs) { - ComputationGraph cg; - AddParamsToCG(&cg); - - // Encode and Transofrm to feed into decoder - Expression encoded_input_vec; - RunFwdBwd(inputs, &encoded_input_vec, &cg); - TransformEncodedInputForDecoding(&encoded_input_vec); - - // Make preditions using the decoder. - BeamDecode(encoded_input_vec, char_to_id, outputs, inputs, beam_size, &cg); - } -}; - -int main(int argc, char** argv) { - cnn::Initialize(argc, argv); - - string vocab_filename = argv[1]; // vocabulary of words/characters - string morph_filename = argv[2]; - string train_filename = argv[3]; - string test_filename = argv[4]; - unsigned char_size = atoi(argv[5]); - unsigned hidden_size = atoi(argv[6]); - unsigned num_iter = atoi(argv[7]); - float reg_strength = atof(argv[8]); - unsigned layers = atoi(argv[9]); - unsigned beam_size = atoi(argv[10]); - - ifstream vocab_file(vocab_filename); - vector chars; - if (vocab_file.is_open()) { // Reading the vocab file - string line; - getline(vocab_file, line); - chars = split_line(line, ' '); - } else { - cerr << "File opening failed" << endl; - } - unordered_map char_to_id; - unordered_map id_to_char; - unsigned char_id = 0; - for (const string& ch : chars) { - char_to_id[ch] = char_id; - id_to_char[char_id] = ch; - char_id++; - } - unsigned vocab_size = char_to_id.size(); - - ifstream morph_file(morph_filename); - vector morph_attrs; - if (morph_file.is_open()) { // Reading the vocab file - string line; - getline(morph_file, line); - morph_attrs = split_line(line, ' '); - } else { - cerr << "File opening failed" << endl; - } - unordered_map morph_to_id; - unordered_map id_to_morph; - unsigned morph_id = 0; - for (const string& ch : morph_attrs) { - morph_to_id[ch] = morph_id; - id_to_morph[morph_id] = ch; - morph_id++; - } - unsigned morph_size = morph_to_id.size(); - - vector m; - vector optimizer; - vector > nn; - for (unsigned i = 0; i < morph_size; ++i) { - m.push_back(new Model()); - AdadeltaTrainer ada(m[i], reg_strength); - optimizer.push_back(ada); - MorphTrans neural(char_size, hidden_size, vocab_size, layers, m[i]); - nn.push_back(neural); - } - - // Read the training file in a vector - vector train_data; - ifstream train_file(train_filename); - if (train_file.is_open()) { - string line; - while (getline(train_file, line)) { - train_data.push_back(line); - } - } - train_file.close(); - - // Read the test file in a vector - vector test_data; - ifstream test_file(test_filename); - if (test_file.is_open()) { - string line; - while (getline(test_file, line)) { - test_data.push_back(line); - } - } - test_file.close(); - - // Read the training file and train the model - for (unsigned iter = 0; iter < num_iter; ++iter) { - unsigned line_id = 0; - random_shuffle(train_data.begin(), train_data.end()); - vector loss(morph_size, 0.0f); - for (string& line : train_data) { - vector items = split_line(line, '|'); - vector input_ids, target_ids; - input_ids.clear(); target_ids.clear(); - for (const string& ch : split_line(items[0], ' ')) { - input_ids.push_back(char_to_id[ch]); - } - for (const string& ch : split_line(items[1], ' ')) { - target_ids.push_back(char_to_id[ch]); - } - unsigned morph_id = morph_to_id[items[2]]; - loss[morph_id] += nn[morph_id].Train(input_ids, target_ids, &optimizer[morph_id]); - cerr << ++line_id << "\r"; - } - - cerr << "Iter " << iter + 1 << " "; - for (unsigned i = 0; i < loss.size(); ++i) { - cerr << loss[i] << " "; - } - cerr << "Sum: " << accumulate(loss.begin(), loss.end(), 0.) << endl; - - // Read the test file and output predictions for the words. - string line; - double correct = 0, total = 0; - for (string& line : test_data) { - vector items = split_line(line, '|'); - vector input_ids, target_ids, pred_target_ids; - input_ids.clear(); target_ids.clear(); pred_target_ids.clear(); - for (const string& ch : split_line(items[0], ' ')) { - input_ids.push_back(char_to_id[ch]); - } - for (const string& ch : split_line(items[1], ' ')) { - target_ids.push_back(char_to_id[ch]); - } - unsigned morph_id = morph_to_id[items[2]]; - nn[morph_id].Predict(input_ids, char_to_id, beam_size, &pred_target_ids); - - string prediction = ""; - for (unsigned i = 0; i < pred_target_ids.size(); ++i) { - prediction += id_to_char[pred_target_ids[i]]; - if (i != pred_target_ids.size() - 1) { - prediction += " "; - } - } - if (prediction == items[1]) { - correct += 1; - } else { // If wrong, print prediction and correct answer - if (iter == num_iter - 1) { - cout << items[0] << '|' << items[1] << '|' << items[2] << endl; - cout << items[0] << '|' << prediction << '|' << items[2] << endl; - } - } - total += 1; - } - cerr << "Prediction Accuracy: " << correct / total << endl; - } - return 1; -} From 7ffa933e27ab27108c9a026a3155f41496162e6f Mon Sep 17 00:00:00 2001 From: Lingpeng Kong Date: Sun, 1 Nov 2015 19:15:30 -0500 Subject: [PATCH 295/965] install boost when doing CI building --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 14e632475..907bde421 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,8 @@ compiler: - gcc before_script: + - sudo apt-get update -qq + - sudo apt-get install libboost-thread-dev libboost-system-dev libboost-test-dev - hg clone https://bitbucket.org/eigen/eigen - mkdir build - cd build From da28be26ba96e6abb47ce8013746084078017bf0 Mon Sep 17 00:00:00 2001 From: Lingpeng Kong Date: Sun, 1 Nov 2015 19:44:33 -0500 Subject: [PATCH 296/965] CI only install required boost module --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 907bde421..1ae4451cb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ compiler: before_script: - sudo apt-get update -qq - - sudo apt-get install libboost-thread-dev libboost-system-dev libboost-test-dev + - sudo apt-get install libboost-filesystem-dev libboost-program-options-dev libboost-serialization-dev - hg clone https://bitbucket.org/eigen/eigen - mkdir build - cd build From 31abb94b3e451e4755ecce460c9d992cc8f94ff9 Mon Sep 17 00:00:00 2001 From: Lingpeng Kong Date: Sun, 1 Nov 2015 19:48:34 -0500 Subject: [PATCH 297/965] CI only install required boost module --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1ae4451cb..13ca9c2ad 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ compiler: before_script: - sudo apt-get update -qq - - sudo apt-get install libboost-filesystem-dev libboost-program-options-dev libboost-serialization-dev + - sudo apt-get install libboost-filesystem-dev libboost-program-options-dev libboost-serialization-dev libboost-test-dev - hg clone https://bitbucket.org/eigen/eigen - mkdir build - cd build From ccad12ff69be41d691656b29855496ea933361ea Mon Sep 17 00:00:00 2001 From: Lingpeng Kong Date: Mon, 2 Nov 2015 17:26:19 -0500 Subject: [PATCH 298/965] CI eigen path --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 13ca9c2ad..95872e121 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ before_script: - hg clone https://bitbucket.org/eigen/eigen - mkdir build - cd build - - cmake .. -DEIGEN3_INCLUDE_DIR=../eigen + - cmake .. -DEIGEN3_INCLUDE_DIR=eigen script: - make From 7ceb687cbd6ff58f5ac9fa4308ea4fdc7c20f5e4 Mon Sep 17 00:00:00 2001 From: Lingpeng Kong Date: Mon, 2 Nov 2015 17:38:11 -0500 Subject: [PATCH 299/965] CI gcc 4.8 --- .travis.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.travis.yml b/.travis.yml index 95872e121..ae45102dc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,16 @@ language: cpp compiler: - gcc +install: +- if [ "$CXX" = "g++" ]; then export CXX="g++-4.8" CC="gcc-4.8"; fi +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-4.8 + - g++-4.8 + before_script: - sudo apt-get update -qq - sudo apt-get install libboost-filesystem-dev libboost-program-options-dev libboost-serialization-dev libboost-test-dev From 59d1c9a516f98d316341993152f18f22f435c65d Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 3 Nov 2015 13:08:51 -0500 Subject: [PATCH 300/965] README fix to use Expression notation and fix bugs --- README.md | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 6597e032f..89daddcf4 100644 --- a/README.md +++ b/README.md @@ -60,33 +60,30 @@ An illustation of how models are trained (for a simple logistic regression model // Create a model, and an SGD trainer to update its parameters. Model mod; SimpleSGDTrainer sgd(&mod); -// Define model parameters for a function with 3 inputs and 1 output. -Parameters& p_W = mod.add_parameters({1, 3}); // Create a "computation graph," which will define the flow of information. -CompuationGraph cg; -// Load the parameters into the computation graph. A VariableIndex identifies the -// position of a particular piece of information within the computation graph. -VariableIndex i_W = cg.add_parameters(&p_W); +ComputationGraph cg; +// Initialize a 1x3 parameter vector, and add the parameters to be part of the +// computation graph. +Expression W = parameter(cg, mod.add_parameters({1, 3})); // Create variables defining the input and output of the regression, and load them // into the computation graph. Note that we don't need to set concrete values yet. vector x_values(3); +Expression x = input(cg, {3}, &x_values); cnn::real y_value; -VariableIndex i_x = cg.add_input({3}, &x_values); -VariableIndex i_y = cg.add_input(&y_value); +Expression y = input(cg, &y_value); // Next, set up the structure to multiply the input by the weight vector, then run -// the output of this through a sigmoid function (logistic regression). -VariableIndex i_f = cg.add_function({i_W, i_x}); -VariableIndex i_y_pred = cg.add_function({i_f}); +// the output of this through a logistic sigmoid function (logistic regression). +Expression y_pred = logistic(W*x); // Finally, we create a function to calculate the loss. The model will be optimized // to minimize the value of the final function in the computation graph. -VariableIndex i_l = cg.add_function({i_y_pred, i_y}); +Expression l = binary_log_loss(y_pred, y); // We are now done setting up the graph, and we can print out its structure: -cg.PrintGraphViz(); +cg.PrintGraphviz(); // *** Now, we perform a parameter update for a single example. // Set the input/output to the values specified by the training data: -i_x = {0.5, 0.3, 0.7}; -i_y = 1.0; +x_values = {0.5, 0.3, 0.7}; +y_value = 1.0; // "forward" propagates values forward through the computation graph, and returns // the loss. cnn::real loss = as_scalar(cg.forward()); From 10f32f8eb42658c9645020bcc9e3fca96093c117 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 3 Nov 2015 13:26:20 -0500 Subject: [PATCH 301/965] Fixed clang compile error wrt mismatched types --- examples/read-write.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/read-write.cc b/examples/read-write.cc index 95e399532..902eabe26 100644 --- a/examples/read-write.cc +++ b/examples/read-write.cc @@ -53,7 +53,7 @@ class XORModel { ComputationGraph cg; AddParamsToCG(&cg); - Expression x = cnn::expr::input(cg, {input.size()}, &input); + Expression x = cnn::expr::input(cg, {(long)input.size()}, &input); Expression y = cnn::expr::input(cg, &gold_output); Expression h = tanh(W*x + b); @@ -69,7 +69,7 @@ class XORModel { ComputationGraph cg; AddParamsToCG(&cg); - Expression x = cnn::expr::input(cg, {input.size()}, &input); + Expression x = cnn::expr::input(cg, {(long)input.size()}, &input); Expression h = tanh(W*x + b); Expression y_pred = V*h + a; return as_scalar(cg.forward()); From a20e85844c3dc2d997b1888c326ef2045ca8c273 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 3 Nov 2015 15:33:45 -0500 Subject: [PATCH 302/965] Initial (re-)commit of batching stuff --- cnn/cnn.cc | 38 ++++++++ cnn/cnn.h | 21 ++++- cnn/conv.cc | 20 ++--- cnn/conv.h | 20 ++--- cnn/dim.cc | 1 + cnn/dim.h | 40 +++++++-- cnn/exec.cc | 6 +- cnn/nodes-common.cc | 69 +++++++++------ cnn/nodes.cc | 192 ++++++++++++++++++++-------------------- cnn/nodes.h | 192 ++++++++++++++++++++-------------------- cnn/param-nodes.cc | 16 ++-- cnn/param-nodes.h | 16 ++-- cnn/tensor.h | 40 ++++++++- examples/CMakeLists.txt | 2 +- examples/xor-batch.cc | 69 +++++++++++++++ 15 files changed, 469 insertions(+), 273 deletions(-) create mode 100644 examples/xor-batch.cc diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 597ab7645..840901379 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -18,6 +18,44 @@ int n_hgs = 0; Node::~Node() {} size_t Node::aux_storage_size() const { return 0; } +// perform the forward/backward passes in one or multiple calls +// TODO: This is a lot of code for something simple. Can it be shortened? +void Node::forward(const std::vector& xs, + Tensor& fx) const { + if(this->supports_multibatch() || fx.d.batch_elems() == 1) { + forward_impl(xs, fx); + } else { + for(int b = 0; b < fx.d.batch_elems(); ++b) { + std::vector xs_elems; + std::vector xs_ptrs; + for(int i = 0; i < xs.size(); ++i) xs_elems.push_back(xs[i]->batch_elem(b)); + for(int i = 0; i < xs.size(); ++i) xs_ptrs.push_back(&xs_elems[i]); + Tensor fx_elem(fx.batch_elem(b)); + forward_impl(xs_ptrs, fx_elem); + } + } +} +void Node::backward(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + if(this->supports_multibatch() || fx.d.batch_elems() == 1) { + backward_impl(xs, fx, dEdf, i, dEdxi); + } else { + for(int b = 0; b < fx.d.batch_elems(); ++b) { + std::vector xs_elems; + std::vector xs_ptrs; + for(int i = 0; i < xs.size(); ++i) xs_elems.push_back(xs[i]->batch_elem(b)); + for(int i = 0; i < xs.size(); ++i) xs_ptrs.push_back(&xs_elems[i]); + Tensor fx_elem(fx.batch_elem(b)); + Tensor dEdf_elem(dEdf.batch_elem(b)); + Tensor dEdxi_elem(dEdxi.batch_elem(b)); + backward_impl(xs_ptrs, fx_elem, dEdf_elem, i, dEdxi_elem); + } + } +} + ComputationGraph::ComputationGraph() : ee(new SimpleExecutionEngine(*this)) { ++n_hgs; diff --git a/cnn/cnn.h b/cnn/cnn.h index db4d21798..e838d899e 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -128,15 +128,30 @@ struct Node { // entire computation graph). virtual size_t aux_storage_size() const; + // computation - virtual void forward(const std::vector& xs, - Tensor& fx) const = 0; + virtual void forward_impl(const std::vector& xs, + Tensor& fx) const = 0; // accumulates the derivative of E with respect to the ith argument to f, that is, xs[i] + virtual void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const = 0; + + // whether this node supports computing multiple batches in one call. + // if true, forward and backward will be called once with a multi-batch tensor. + // if false, forward and backward will be called multiple times for each item. + virtual bool supports_multibatch() const { return false; } + + // perform the forward/backward passes in one or multiple calls + virtual void forward(const std::vector& xs, + Tensor& fx) const final; virtual void backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, - Tensor& dEdxi) const = 0; + Tensor& dEdxi) const final; // number of arguments to the function inline unsigned arity() const { return args.size(); } diff --git a/cnn/conv.cc b/cnn/conv.cc index c5a590b1f..9ae31f099 100644 --- a/cnn/conv.cc +++ b/cnn/conv.cc @@ -29,14 +29,14 @@ Dim AddVectorToAllColumns::dim_forward(const vector& xs) const { return xs[0]; } -void AddVectorToAllColumns::forward(const vector& xs, Tensor& fx) const { +void AddVectorToAllColumns::forward_impl(const vector& xs, Tensor& fx) const { auto y = *fx; auto x = **xs[0]; auto b = **xs[1]; y = x.colwise() + b.col(0); } -void AddVectorToAllColumns::backward(const vector& xs, +void AddVectorToAllColumns::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -64,7 +64,7 @@ Dim FoldRows::dim_forward(const vector& xs) const { return Dim({orows, xs[0].cols()}); } -void FoldRows::forward(const vector& xs, Tensor& fx) const { +void FoldRows::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; auto y = *fx; int orows = y.rows(); @@ -78,7 +78,7 @@ void FoldRows::forward(const vector& xs, Tensor& fx) const { } } -void FoldRows::backward(const vector& xs, +void FoldRows::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -112,7 +112,7 @@ Dim Conv1DNarrow::dim_forward(const vector& xs) const { return Dim({xs[0].rows(), ocols}); } -void Conv1DNarrow::forward(const vector& xs, Tensor& fx) const { +void Conv1DNarrow::forward_impl(const vector& xs, Tensor& fx) const { // TODO this is a bad implementation- rewrite to use unsupported Eigen tensor library auto x = **xs[0]; // input auto f = **xs[1]; // filter @@ -130,7 +130,7 @@ void Conv1DNarrow::forward(const vector& xs, Tensor& fx) const { } } -void Conv1DNarrow::backward(const vector& xs, +void Conv1DNarrow::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -181,7 +181,7 @@ Dim Conv1DWide::dim_forward(const vector& xs) const { return Dim({xs[0].rows(), ocols}); } -void Conv1DWide::forward(const vector& xs, Tensor& fx) const { +void Conv1DWide::forward_impl(const vector& xs, Tensor& fx) const { TensorTools::Zero(fx); auto x = **xs[0]; // input auto f = **xs[1]; // filter @@ -198,7 +198,7 @@ void Conv1DWide::forward(const vector& xs, Tensor& fx) const { } } -void Conv1DWide::backward(const vector& xs, +void Conv1DWide::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -252,7 +252,7 @@ size_t KMaxPooling::aux_storage_size() const { return sizeof(int) * dim.size(); } -void KMaxPooling::forward(const vector& xs, Tensor& fx) const { +void KMaxPooling::forward_impl(const vector& xs, Tensor& fx) const { auto x=**xs[0]; auto y=*fx; float tmp[1024]; @@ -284,7 +284,7 @@ void KMaxPooling::forward(const vector& xs, Tensor& fx) const { assert(mi == dim.size()); } -void KMaxPooling::backward(const vector& xs, +void KMaxPooling::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, diff --git a/cnn/conv.h b/cnn/conv.h index 01713478c..b3b3be140 100644 --- a/cnn/conv.h +++ b/cnn/conv.h @@ -9,8 +9,8 @@ struct AddVectorToAllColumns : public Node { explicit AddVectorToAllColumns(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -22,8 +22,8 @@ struct KMaxPooling : public Node { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -35,8 +35,8 @@ struct FoldRows : public Node { explicit FoldRows(const std::initializer_list& a, unsigned nrows) : Node(a), nrows(nrows) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -51,8 +51,8 @@ struct Conv1DNarrow : public Node { explicit Conv1DNarrow(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -66,8 +66,8 @@ struct Conv1DWide : public Node { explicit Conv1DWide(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, diff --git a/cnn/dim.cc b/cnn/dim.cc index d65945695..85b5739dc 100644 --- a/cnn/dim.cc +++ b/cnn/dim.cc @@ -12,6 +12,7 @@ ostream& operator<<(ostream& os, const Dim& d) { if (i) os << ','; os << d.d[i]; } + if(d.bd != 1) os << 'X' << d.bd; return os << '}'; } diff --git a/cnn/dim.h b/cnn/dim.h index 3c3cf932f..c35f45c03 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -9,6 +9,9 @@ #include #include +// DEBUG!!! +#include + #define CNN_MAX_TENSOR_DIM 7 namespace boost { namespace serialization { class access; } } @@ -16,13 +19,29 @@ namespace boost { namespace serialization { class access; } } namespace cnn { struct Dim { - Dim() : nd() {} - explicit Dim(int m) : nd(1) { d[0] = m; } - Dim(int m, int n) : nd(2) { d[0] = m; d[1] = n; } - Dim(std::initializer_list x) : nd() { + Dim() : nd(), bd(1) {} + // explicit Dim(int m) : nd(1), bd(1) { d[0] = m; } + // TODO: The constructors for dimensions w/ and w/o batches is not intuitive. + // can this be fixed in some way? + // Dim(int m, int n) : nd(2), bd(1) { d[0] = m; d[1] = n; } + Dim(std::initializer_list x) : nd(), bd(1) { + for(auto v : x) d[nd++] = v; + std::cerr << "Dim( "; for(auto v : x) std::cerr << v << " "; std::cerr << ")" << std::endl; + } + Dim(std::initializer_list x, int b) : nd(), bd(b) { for(auto v : x) d[nd++] = v; + std::cerr << "Dim( "; for(auto v : x) std::cerr << v << " "; std::cerr << "X" << bd << " )" << std::endl; } + // Dim(const std::vector & x) : nd(), bd(1) { + // for(auto v : x) d[nd++] = v; + // } + // Dim(const std::vector & x, int b) : nd(), bd(b) { + // for(auto v : x) d[nd++] = v; + // } inline int size() const { + return batch_size() * bd; + } + inline int batch_size() const { int p = 1; for (unsigned i = 0; i < nd; ++i) p *= d[i]; return p; @@ -41,20 +60,27 @@ struct Dim { r.resize(m); return r; } + inline Dim single_batch() const { + Dim r = *this; + r.bd = 1; + return r; + } inline void resize(unsigned i) { nd = i; } inline int ndims() const { return nd; } inline int rows() const { return d[0]; } inline int cols() const { return nd > 1 ? d[1] : 1; } + inline int batch_elems() const { return bd; } inline void set(unsigned i, unsigned s) { assert(i < nd); assert(s > 0); d[i] = s; } inline int operator[](unsigned i) const { return i < nd ? d[i] : 1; } inline int size(unsigned i) const { return (*this)[i]; } inline Dim transpose() const { - if (nd == 1) { return Dim(1, d[0]); } - else if (nd == 2) { return Dim(d[1], d[0]); } + if (nd == 1) { return Dim({1, d[0]}, bd); } + else if (nd == 2) { return Dim({d[1], d[0]}, bd); } throw std::invalid_argument("Cannot transpose Dim object with more than 2 dimensions"); } unsigned int d[CNN_MAX_TENSOR_DIM]; unsigned int nd; + unsigned int bd; private: friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { @@ -66,7 +92,7 @@ struct Dim { //static_assert(std::is_trivially_copyable::value, "Dim must be trivially copyable"); inline bool operator==(const Dim& a, const Dim& b) { - if (a.nd != b.nd) return false; + if (a.nd != b.nd || a.bd != b.bd) return false; return std::memcmp(a.d, b.d, a.nd) == 0; } diff --git a/cnn/exec.cc b/cnn/exec.cc index eaffef87c..dc7ca6d92 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -85,7 +85,7 @@ void SimpleExecutionEngine::backward() { void SimpleExecutionEngine::backward(VariableIndex from_where) { assert(from_where+1 <= nfxs.size()); assert(from_where+1 <= cg.nodes.size()); - if (nfxs[from_where].d.size() != 1) { + if (nfxs[from_where].d.batch_size() != 1) { cerr << "backward() called on non-scalar node.\n"; abort(); } @@ -101,7 +101,9 @@ void SimpleExecutionEngine::backward(VariableIndex from_where) { } dEdfs->zero_allocated_memory(); // initialize dE/dE = 1 - ndEdfs.back().v = kSCALAR_ONE; + auto end = ndEdfs.back().v + nfxs.back().d.size(); + for(auto it = ndEdfs.back().v; it < end; ++it) + *it = 1; // here we find constant paths to avoid doing extra work vector needs_derivative(num_nodes, false); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 692a7e734..d74317ea5 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -28,7 +28,7 @@ Dim Min::dim_forward(const vector& xs) const { cerr << "Bad arguments in Min: " << xs << endl; throw std::invalid_argument("invalid arguments to Min"); } - return xs[0]; + return xs[0].bd >= xs[1].bd ? xs[0] : xs[1]; } string Max::as_string(const vector& arg_names) const { @@ -42,7 +42,7 @@ Dim Max::dim_forward(const vector& xs) const { cerr << "Bad arguments in Max: " << xs << endl; throw std::invalid_argument("invalid arguments to Max"); } - return xs[0]; + return xs[0].bd >= xs[1].bd ? xs[0] : xs[1]; } string TraceOfProduct::as_string(const vector& arg_names) const { @@ -56,7 +56,7 @@ Dim TraceOfProduct::dim_forward(const vector& xs) const { cerr << "Bad arguments in TraceOfProduct: " << xs << endl; throw std::invalid_argument("invalid arguments to TraceOfProduct"); } - return Dim({1}); + return Dim({1}, max(xs[0].bd, xs[1].bd)); } string ConstScalarMultiply::as_string(const vector& arg_names) const { @@ -87,7 +87,7 @@ Dim DotProduct::dim_forward(const vector& xs) const { cerr << "Bad arguments to DotProduct: " << xs << endl; throw std::invalid_argument("Bad arguments to DotProduct"); } - return Dim({1}); + return Dim({1}, max(xs[0].bd, xs[1].bd)); } string Transpose::as_string(const vector& arg_names) const { @@ -126,7 +126,8 @@ string SumColumns::as_string(const vector& arg_names) const { Dim SumColumns::dim_forward(const vector& xs) const { assert(xs.size() == 1 || xs.size() == 2); - return Dim({xs[0].rows()}); + int bd = (xs.size() == 1 ? xs[0].bd : max(xs[0].bd, xs[1].bd)); + return Dim({xs[0].rows()}, bd); } string KMHNGram::as_string(const vector& arg_names) const { @@ -163,7 +164,8 @@ Dim InnerProduct3D_1D::dim_forward(const vector& xs) const { cerr << "Bad input dimensions in InnerProduct3D_1D: " << xs << endl; abort(); } - Dim d({xs[0].size(0), xs[0].size(1)}); + Dim d({xs[0].size(0), xs[0].size(1)}, max(xs[0].bd, xs[1].bd)); + if(xs.size() == 3) d.bd = max(d.bd, xs[2].bd); if (xs.size() == 3 && xs[2] != d) { cerr << "Bad input dimensions in InnerProduct3D_1D: " << xs << endl; abort(); @@ -238,10 +240,11 @@ string LogSumExp::as_string(const vector& arg_names) const { Dim LogSumExp::dim_forward(const vector& xs) const { Dim d = xs[0].truncate(); for (unsigned i = 1; i < xs.size(); ++i) { - if (d != xs[i].truncate()) { + if (d.single_batch() != xs[i].truncate().single_batch()) { cerr << "Mismatched input dimensions in LogSumExp: " << xs << endl; abort(); } + d.bd = max(xs[i].bd, d.bd); } return d; } @@ -256,10 +259,11 @@ string Sum::as_string(const vector& arg_names) const { Dim Sum::dim_forward(const vector& xs) const { Dim d = xs[0].truncate(); for (unsigned i = 1; i < xs.size(); ++i) { - if (d != xs[i].truncate()) { + if (d.single_batch() != xs[i].truncate().single_batch()) { cerr << "Mismatched input dimensions in Sum: " << xs << endl; abort(); } + d.bd = max(xs[i].bd, d.bd); } return d; } @@ -274,13 +278,15 @@ string Average::as_string(const vector& arg_names) const { } Dim Average::dim_forward(const vector& xs) const { + Dim d(xs[0]); for (unsigned i = 1; i < xs.size(); ++i) { - if (xs[0] != xs[1]) { + if (xs[0].single_batch() != xs[1].single_batch()) { cerr << "Mismatched input dimensions in Average: " << xs << endl; abort(); } + d.bd = max(xs[i].bd, d.bd); } - return xs[0]; + return d; } string Tanh::as_string(const vector& arg_names) const { @@ -360,6 +366,7 @@ Dim Concatenate::dim_forward(const vector& xs) const { cerr << "Bad input dimensions in Concatenate: " << xs << endl; abort(); } + dr.bd = max(dr.bd, c.bd); } dr.set(0, new_rows); return dr; @@ -379,14 +386,16 @@ Dim ConcatenateColumns::dim_forward(const vector& xs) const { assert(xs.size() > 0); int rows = xs[0][0]; int new_cols = 0; + int bd = 1; for (auto& d : xs) { if (d[0] != rows) { cerr << "Bad input dimensions in ConcatenateColumns: " << xs << endl; abort(); } new_cols += d[1]; + bd = max(bd, (int)d.bd); } - return Dim({rows, new_cols}); + return Dim({rows, new_cols}, bd); } string PairwiseRankLoss::as_string(const vector& arg_names) const { @@ -403,7 +412,7 @@ Dim PairwiseRankLoss::dim_forward(const vector& xs) const { cerr << "Bad input dimensions in PairwiseRankLoss: " << xs << endl; abort(); } - return xs[0]; + return xs[0].bd >= xs[1].bd ? xs[0] : xs[1]; } string Hinge::as_string(const vector& arg_names) const { @@ -417,7 +426,7 @@ Dim Hinge::dim_forward(const vector& xs) const { cerr << "Bad input dimensions in Hinge: " << xs << endl; abort(); } - return Dim({1}); + return Dim({1}, xs[0].bd); } string Identity::as_string(const vector& arg_names) const { @@ -471,7 +480,7 @@ Dim PickNegLogSoftmax::dim_forward(const vector& xs) const { cerr << "Bad input dimensions in PickNegLogSoftmax: " << xs << endl; abort(); } - return Dim({1}); + return Dim({1}, xs[0].bd); } string LogSoftmax::as_string(const vector& arg_names) const { @@ -516,7 +525,7 @@ Dim PickElement::dim_forward(const vector& xs) const { cerr << "Bad input dimensions in PickElement: " << xs << endl; abort(); } - return Dim({1}); + return Dim({1}, xs[0].bd); } // x_1 is a vector @@ -534,7 +543,7 @@ Dim PickRange::dim_forward(const vector& xs) const { abort(); } assert((int)end <= xs[0][0]); - return Dim({end - start}); + return Dim({end - start}, xs[0].bd); } string MatrixMultiply::as_string(const vector& arg_names) const { @@ -549,8 +558,8 @@ Dim MatrixMultiply::dim_forward(const vector& xs) const { cerr << "Mismatched input dimensions in MatrixMultiply: " << xs << endl; abort(); } - if (xs[1].ndims() == 1) return Dim({xs[0].rows()}); - return Dim({xs[0].rows(), xs[1].cols()}); + if (xs[1].ndims() == 1) return Dim({xs[0].rows()}, max(xs[0].bd, xs[1].bd)); + return Dim({xs[0].rows(), xs[1].cols()}, max(xs[0].bd, xs[1].bd)); } string CwiseMultiply::as_string(const vector& arg_names) const { @@ -562,10 +571,11 @@ string CwiseMultiply::as_string(const vector& arg_names) const { Dim CwiseMultiply::dim_forward(const vector& xs) const { assert(xs.size() == 2); Dim d = xs[0].truncate(); - if (d != xs[1].truncate()) { + if (d.single_batch() != xs[1].truncate().single_batch()) { cerr << "Mismatched input dimensions in CwiseMultiply: " << xs << endl; abort(); } + d.bd = max(xs[1].bd, d.bd); return d; } @@ -578,10 +588,11 @@ string CwiseQuotient::as_string(const vector& arg_names) const { Dim CwiseQuotient::dim_forward(const vector& xs) const { assert(xs.size() == 2); Dim d = xs[0].truncate(); - if (d != xs[1].truncate()) { + if (d.single_batch() != xs[1].truncate().single_batch()) { cerr << "Mismatched input dimensions in CwiseQuotient: " << xs << endl; abort(); } + d.bd = max(xs[1].bd, d.bd); return d; } @@ -598,15 +609,17 @@ Dim AffineTransform::dim_forward(const vector& xs) const { cerr << "Bad number of inputs for AffineTransform: " << xs << endl; throw std::invalid_argument("Bad number of inputs to AffineTransform"); } + Dim d = xs[0]; for (unsigned i = 1; i < xs.size(); i += 2) { if (xs[i].cols() != xs[i+1].rows() || xs[0].rows() != xs[i].rows() || xs[0].cols() != xs[i+1].cols()) { cerr << "Bad dimensions for AffineTransform: " << xs << endl; throw std::invalid_argument("Bad dimensions to AffineTransform"); + d.bd = max(max(d.bd, xs[0].bd), xs[1].bd); } } - return xs[0]; + return d; } string Negate::as_string(const vector& arg_names) const { @@ -639,11 +652,11 @@ string HuberDistance::as_string(const vector& arg_names) const { Dim HuberDistance::dim_forward(const vector& xs) const { assert(xs.size() == 2); - if (xs[0] != xs[1]) { + if (xs[0].single_batch() != xs[1].single_batch()) { cerr << "Mismatched input dimensions in HuberDistance: " << xs << endl; abort(); } - return Dim({1}); + return Dim({1}, max(xs[0].bd, xs[1].bd)); } string L1Distance::as_string(const vector& arg_names) const { @@ -654,11 +667,11 @@ string L1Distance::as_string(const vector& arg_names) const { Dim L1Distance::dim_forward(const vector& xs) const { assert(xs.size() == 2); - if (xs[0] != xs[1]) { + if (xs[0].single_batch() != xs[1].single_batch()) { cerr << "Mismatched input dimensions in L1Distance: " << xs << endl; abort(); } - return Dim({1}); + return Dim({1}, max(xs[0].bd, xs[1].bd)); } string PoissonRegressionLoss::as_string(const vector& arg_names) const { @@ -683,11 +696,11 @@ string SquaredEuclideanDistance::as_string(const vector& arg_names) cons Dim SquaredEuclideanDistance::dim_forward(const vector& xs) const { assert(xs.size() == 2); - if (xs[0] != xs[1]) { + if (xs[0].single_batch() != xs[1].single_batch()) { cerr << "Mismatched input dimensions in SquaredEuclideanDistance: " << xs << endl; abort(); } - return Dim({1}); + return Dim({1}, max(xs[0].bd, xs[1].bd)); } string LogisticSigmoid::as_string(const vector& arg_names) const { @@ -717,7 +730,7 @@ Dim BinaryLogLoss::dim_forward(const vector& xs) const { cerr << "Bad input dimensions in BinaryLogLoss: " << xs << endl; abort(); } - return Dim({1}); + return Dim({1}, max(xs[0].bd, xs[1].bd)); } } // namespace cnn diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 18358203c..905180623 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -37,7 +37,7 @@ size_t Min::aux_storage_size() const { return dim.size() * sizeof(float); } -void Min::forward(const vector& xs, Tensor& fx) const { +void Min::forward_impl(const vector& xs, Tensor& fx) const { auto y = *fx; auto x1 = **xs[0]; auto x2 = **xs[1]; @@ -47,7 +47,7 @@ void Min::forward(const vector& xs, Tensor& fx) const { y = x1.cwiseMin(x2); } -void Min::backward(const vector& xs, +void Min::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -65,7 +65,7 @@ size_t Max::aux_storage_size() const { return dim.size() * sizeof(float); } -void Max::forward(const vector& xs, Tensor& fx) const { +void Max::forward_impl(const vector& xs, Tensor& fx) const { auto y = *fx; auto x1 = **xs[0]; auto x2 = **xs[1]; @@ -75,7 +75,7 @@ void Max::forward(const vector& xs, Tensor& fx) const { y = x1.cwiseMax(x2); } -void Max::backward(const vector& xs, +void Max::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -89,13 +89,13 @@ void Max::backward(const vector& xs, } } -void TraceOfProduct::forward(const vector& xs, Tensor& fx) const { +void TraceOfProduct::forward_impl(const vector& xs, Tensor& fx) const { auto x1 = **xs[0]; auto x2 = **xs[1]; fx.v[0] = (x1 * x2.transpose()).trace(); } -void TraceOfProduct::backward(const vector& xs, +void TraceOfProduct::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -106,11 +106,11 @@ void TraceOfProduct::backward(const vector& xs, *dEdxi += d * xother; } -void ConstScalarMultiply::forward(const vector& xs, Tensor& fx) const { +void ConstScalarMultiply::forward_impl(const vector& xs, Tensor& fx) const { *fx = (**xs[0]) * alpha; } -void ConstScalarMultiply::backward(const vector& xs, +void ConstScalarMultiply::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -119,11 +119,11 @@ void ConstScalarMultiply::backward(const vector& xs, *dEdxi += *dEdf * alpha; } -void DotProduct::forward(const vector& xs, Tensor& fx) const { +void DotProduct::forward_impl(const vector& xs, Tensor& fx) const { *fx = (**xs[0]).transpose() * (**xs[1]); } -void DotProduct::backward(const vector& xs, +void DotProduct::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -131,7 +131,7 @@ void DotProduct::backward(const vector& xs, (*dEdxi) += (dEdf.v[0]) * (**xs[1 - i]); } -void Transpose::forward(const vector& xs, Tensor& fx) const { +void Transpose::forward_impl(const vector& xs, Tensor& fx) const { if (dim.rows() == 1 || dim.cols() == 1) { fx.v = xs[0]->v; } else { @@ -144,7 +144,7 @@ void Transpose::forward(const vector& xs, Tensor& fx) const { } } -void Transpose::backward(const vector& xs, +void Transpose::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -157,13 +157,13 @@ void Transpose::backward(const vector& xs, #endif } -void Reshape::forward(const vector& xs, Tensor& fx) const { +void Reshape::forward_impl(const vector& xs, Tensor& fx) const { // just point to the input memory and change dimensions // dimensions are handled by forward_dim fx.v = xs[0]->v; } -void Reshape::backward(const vector& xs, +void Reshape::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -172,7 +172,7 @@ void Reshape::backward(const vector& xs, *dEdxi += *reshaped; } -void SumColumns::forward(const vector& xs, Tensor& fx) const { +void SumColumns::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; auto y = *fx; if (xs.size() == 1) { @@ -182,7 +182,7 @@ void SumColumns::forward(const vector& xs, Tensor& fx) const { } } -void SumColumns::backward(const vector& xs, +void SumColumns::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -194,7 +194,7 @@ void SumColumns::backward(const vector& xs, out.colwise() += (*dEdf).col(0); } -void KMHNGram::forward(const vector& xs, Tensor& fx) const { +void KMHNGram::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; const int new_cols = x.cols() - n + 1; assert(new_cols > 0); @@ -207,7 +207,7 @@ void KMHNGram::forward(const vector& xs, Tensor& fx) const { } } -void KMHNGram::backward(const vector& xs, +void KMHNGram::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -219,7 +219,7 @@ void KMHNGram::backward(const vector& xs, } // Y_ij = A_ijk * B_k (+ C_ij) -void InnerProduct3D_1D::forward(const vector& xs, Tensor& fx) const { +void InnerProduct3D_1D::forward_impl(const vector& xs, Tensor& fx) const { auto b = **xs[1]; auto y = *fx; const int i = y.rows(); @@ -242,7 +242,7 @@ void InnerProduct3D_1D::forward(const vector& xs, Tensor& fx) con } } -void InnerProduct3D_1D::backward(const vector& xs, +void InnerProduct3D_1D::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -268,13 +268,13 @@ size_t GaussianNoise::aux_storage_size() const { return dim.size() * sizeof(float); } -void GaussianNoise::forward(const vector& xs, Tensor& fx) const { +void GaussianNoise::forward_impl(const vector& xs, Tensor& fx) const { Tensor m(dim, (float*)aux_mem); TensorTools::RandomizeNormal(0, stddev, m); (*fx) = **xs[0] + *m; } -void GaussianNoise::backward(const vector& xs, +void GaussianNoise::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -286,13 +286,13 @@ size_t Dropout::aux_storage_size() const { return dim.size() * sizeof(float); } -void Dropout::forward(const vector& xs, Tensor& fx) const { +void Dropout::forward_impl(const vector& xs, Tensor& fx) const { Tensor m(dim, (float*)aux_mem); TensorTools::RandomBernoulli(m, (1.f-p), 1.f / (1.f-p)); (*fx) = (**xs[0]).cwiseProduct(*m); } -void Dropout::backward(const vector& xs, +void Dropout::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -306,7 +306,7 @@ size_t BlockDropout::aux_storage_size() const { return 1 * sizeof(float); } -void BlockDropout::forward(const vector& xs, Tensor& fx) const { +void BlockDropout::forward_impl(const vector& xs, Tensor& fx) const { bernoulli_distribution distribution(1.0 - dropout_probability); float block_multiplier = distribution(*rndeng)? 1.0 : 0.0; block_multiplier = @@ -318,7 +318,7 @@ void BlockDropout::forward(const vector& xs, Tensor& fx) const { (*fx) = **xs[0] * block_multiplier; } -void BlockDropout::backward(const vector& xs, +void BlockDropout::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -327,12 +327,12 @@ void BlockDropout::backward(const vector& xs, (*dEdxi) += (*dEdf) * block_multiplier; } -void ConstantPlusX::forward(const vector& xs, Tensor& fx) const { +void ConstantPlusX::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; *fx = x.unaryExpr(FConstantPlus(c)); } -void ConstantPlusX::backward(const vector& xs, +void ConstantPlusX::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -340,7 +340,7 @@ void ConstantPlusX::backward(const vector& xs, *dEdxi += *dEdf; } -void ConstantMinusX::forward(const vector& xs, Tensor& fx) const { +void ConstantMinusX::forward_impl(const vector& xs, Tensor& fx) const { #if HAVE_CUDA gpu::vconstant_minusx(fx.d.size(), c, xs[0]->v, fx.v); #else @@ -349,7 +349,7 @@ void ConstantMinusX::forward(const vector& xs, Tensor& fx) const #endif } -void ConstantMinusX::backward(const vector& xs, +void ConstantMinusX::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -377,7 +377,7 @@ size_t LogSumExp::aux_storage_size() const { return MAX_LOG_SUM_EXP * sizeof(float); } -void LogSumExp::forward(const vector& xs, Tensor& fx) const { +void LogSumExp::forward_impl(const vector& xs, Tensor& fx) const { const unsigned num_args = xs.size(); if (num_args == 1) { fx.v = xs[0]->v; @@ -390,7 +390,7 @@ void LogSumExp::forward(const vector& xs, Tensor& fx) const { fx.v[0] = logsumexp(*v); } -void LogSumExp::backward(const vector& xs, +void LogSumExp::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -406,7 +406,7 @@ void LogSumExp::backward(const vector& xs, d.array() += (**xs[i] - *fx).array().exp() * (*dEdf).array(); } -void Sum::forward(const vector& xs, Tensor& fx) const { +void Sum::forward_impl(const vector& xs, Tensor& fx) const { const unsigned num_args = xs.size(); if (num_args == 1) { fx.v = xs[0]->v; @@ -430,7 +430,7 @@ void Sum::forward(const vector& xs, Tensor& fx) const { #endif } -void Sum::backward(const vector& xs, +void Sum::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -443,7 +443,7 @@ void Sum::backward(const vector& xs, #endif } -void Average::forward(const vector& xs, Tensor& fx) const { +void Average::forward_impl(const vector& xs, Tensor& fx) const { const unsigned num_args = xs.size(); if (num_args == 1) { fx.v = xs[0]->v; @@ -462,7 +462,7 @@ void Average::forward(const vector& xs, Tensor& fx) const { res /= num_args; } -void Average::backward(const vector& xs, +void Average::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -470,7 +470,7 @@ void Average::backward(const vector& xs, *dEdxi += (*dEdf / xs.size()); } -void Tanh::forward(const vector& xs, Tensor& fx) const { +void Tanh::forward_impl(const vector& xs, Tensor& fx) const { #if HAVE_CUDA gpu::vtanh(fx.d.size(), xs[0]->v, fx.v); #else @@ -479,7 +479,7 @@ void Tanh::forward(const vector& xs, Tensor& fx) const { #endif } -void Tanh::backward(const vector& xs, +void Tanh::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -491,12 +491,12 @@ void Tanh::backward(const vector& xs, #endif } -void Square::forward(const vector& xs, Tensor& fx) const { +void Square::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; (*fx).array() = x.array().square(); } -void Square::backward(const vector& xs, +void Square::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -505,12 +505,12 @@ void Square::backward(const vector& xs, *dEdxi += (*dEdf).cwiseProduct(x) * 2; } -void Cube::forward(const vector& xs, Tensor& fx) const { +void Cube::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; (*fx).array() = x.array().cube(); } -void Cube::backward(const vector& xs, +void Cube::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -520,12 +520,12 @@ void Cube::backward(const vector& xs, (*dEdxi).array() += (*dEdf).array() * x.array().square() * 3; } -void Exp::forward(const vector& xs, Tensor& fx) const { +void Exp::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; *fx = x.array().exp(); } -void Exp::backward(const vector& xs, +void Exp::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -533,12 +533,12 @@ void Exp::backward(const vector& xs, *dEdxi += (*dEdf).cwiseProduct(*fx); } -void Log::forward(const vector& xs, Tensor& fx) const { +void Log::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; *fx = x.array().log(); } -void Log::backward(const vector& xs, +void Log::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -547,7 +547,7 @@ void Log::backward(const vector& xs, *dEdxi += (*dEdf).cwiseQuotient(x); } -void Concatenate::forward(const vector& xs, Tensor& fx) const { +void Concatenate::forward_impl(const vector& xs, Tensor& fx) const { unsigned rows = 0; for (auto x : xs) rows += x->d.rows(); // the following should use auxiliary memory @@ -568,7 +568,7 @@ void Concatenate::forward(const vector& xs, Tensor& fx) const { } } -void Concatenate::backward(const vector& xs, +void Concatenate::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -588,7 +588,7 @@ size_t ConcatenateColumns::aux_storage_size() const { return MAX_CONCAT_COLS_ARGS * sizeof(unsigned); } -void ConcatenateColumns::forward(const vector& xs, Tensor& fx) const { +void ConcatenateColumns::forward_impl(const vector& xs, Tensor& fx) const { unsigned c = 0; assert(xs.size() < MAX_CONCAT_COLS_ARGS); for (unsigned i = 0; i < xs.size(); ++i) { @@ -608,7 +608,7 @@ void ConcatenateColumns::forward(const vector& xs, Tensor& fx) co } } -void ConcatenateColumns::backward(const vector& xs, +void ConcatenateColumns::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -625,7 +625,7 @@ void ConcatenateColumns::backward(const vector& xs, #endif } -void PairwiseRankLoss::forward(const vector& xs, Tensor& fx) const { +void PairwiseRankLoss::forward_impl(const vector& xs, Tensor& fx) const { #if HAVE_CUDA gpu::vpairwise_rank_loss(fx.d.size(), margin, xs[0]->v, xs[1]->v, fx.v); #else @@ -635,7 +635,7 @@ void PairwiseRankLoss::forward(const vector& xs, Tensor& fx) cons #endif } -void PairwiseRankLoss::backward(const vector& xs, +void PairwiseRankLoss::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -655,7 +655,7 @@ size_t Hinge::aux_storage_size() const { return dim.size() * sizeof(float); } -void Hinge::forward(const vector& xs, Tensor& fx) const { +void Hinge::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); auto x = **xs[0]; const unsigned rows = x.rows(); @@ -673,7 +673,7 @@ void Hinge::forward(const vector& xs, Tensor& fx) const { fx.v[0] = y; } -void Hinge::backward(const vector& xs, +void Hinge::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -693,12 +693,12 @@ void Hinge::backward(const vector& xs, } } -void Identity::forward(const vector& xs, Tensor& fx) const { +void Identity::forward_impl(const vector& xs, Tensor& fx) const { fx.d = xs[0]->d; fx.v = xs[0]->v; } -void Identity::backward(const vector& xs, +void Identity::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -706,7 +706,7 @@ void Identity::backward(const vector& xs, *dEdxi += *dEdf; } -void MaxPooling1D::forward(const vector& xs, Tensor& fx) const { +void MaxPooling1D::forward_impl(const vector& xs, Tensor& fx) const { cerr << "FIX IMPL5\n"; abort(); #if 0 assert(xs.size() == 1); @@ -735,7 +735,7 @@ void MaxPooling1D::forward(const vector& xs, Tensor& fx) const { #endif } -void MaxPooling1D::backward(const vector& xs, +void MaxPooling1D::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -754,7 +754,7 @@ void MaxPooling1D::backward(const vector& xs, #endif } -void Softmax::forward(const vector& xs, Tensor& fx) const { +void Softmax::forward_impl(const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { #if HAVE_CUDA gpu::softmax(xs[0]->d.size(), xs[0]->v, fx.v); @@ -768,7 +768,7 @@ void Softmax::forward(const vector& xs, Tensor& fx) const { } } -void Softmax::backward(const vector& xs, +void Softmax::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -781,7 +781,7 @@ void Softmax::backward(const vector& xs, #endif } -void PickNegLogSoftmax::forward(const vector& xs, Tensor& fx) const { +void PickNegLogSoftmax::forward_impl(const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { logz = (float*)fxs->allocate(sizeof(float)); #if HAVE_CUDA @@ -797,7 +797,7 @@ void PickNegLogSoftmax::forward(const vector& xs, Tensor& fx) con } } -void PickNegLogSoftmax::backward(const vector& xs, +void PickNegLogSoftmax::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -819,7 +819,7 @@ void PickNegLogSoftmax::backward(const vector& xs, } } -void LogSoftmax::forward(const vector& xs, Tensor& fx) const { +void LogSoftmax::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); if (xs[0]->d.cols() == 1) { auto x = **xs[0]; @@ -830,7 +830,7 @@ void LogSoftmax::forward(const vector& xs, Tensor& fx) const { } } -void LogSoftmax::backward(const vector& xs, +void LogSoftmax::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -857,7 +857,7 @@ EIGEN_STRONG_INLINE real logsumexp(const T& x, const vector& denom) { return m + logf(z); } -void RestrictedLogSoftmax::forward(const vector& xs, Tensor& fx) const { +void RestrictedLogSoftmax::forward_impl(const vector& xs, Tensor& fx) const { // TODO create auxiliary mask with -infty's // and do usual LogSoftmax stuff assert(xs.size() == 1); @@ -871,7 +871,7 @@ void RestrictedLogSoftmax::forward(const vector& xs, Tensor& fx) if (denom.size() == 1) (*fx)(denom.front(), 0) = 0; } -void RestrictedLogSoftmax::backward(const vector& xs, +void RestrictedLogSoftmax::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -886,14 +886,14 @@ void RestrictedLogSoftmax::backward(const vector& xs, // x_1 is a vector // y = (x_1)_{*pval} -void PickElement::forward(const vector& xs, Tensor& fx) const { +void PickElement::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); auto x = **xs[0]; fx.v[0] = x(*pval); } // derivative is 0 in all dimensions except 1 for the selected element -void PickElement::backward(const vector& xs, +void PickElement::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -905,7 +905,7 @@ void PickElement::backward(const vector& xs, // x_1 is a vector // y = (x_1)[start:end] // slice of vector from index start (inclusive) to index end (exclusive) -void PickRange::forward(const vector& xs, Tensor& fx) const { +void PickRange::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); auto x = **xs[0]; assert(x.cols() == 1); @@ -921,7 +921,7 @@ void PickRange::forward(const vector& xs, Tensor& fx) const { } // derivative is 0 in all dimensions except the slice range -void PickRange::backward(const vector& xs, +void PickRange::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -952,7 +952,7 @@ inline void CUDAMatrixMultiply(const Tensor& l, const Tensor& r, Tensor& y, cons } #endif -void MatrixMultiply::forward(const vector& xs, Tensor& fx) const { +void MatrixMultiply::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); #if HAVE_CUDA // fx = 0*fx + xs[0] * xs[1] @@ -964,7 +964,7 @@ void MatrixMultiply::forward(const vector& xs, Tensor& fx) const #endif } -void MatrixMultiply::backward(const vector& xs, +void MatrixMultiply::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -995,14 +995,14 @@ void MatrixMultiply::backward(const vector& xs, #endif } -void CwiseQuotient::forward(const vector& xs, Tensor& fx) const { +void CwiseQuotient::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); auto x1 = **xs[0]; auto x2 = **xs[1]; *fx = x1.cwiseQuotient(x2); } -void CwiseQuotient::backward(const vector& xs, +void CwiseQuotient::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -1018,7 +1018,7 @@ void CwiseQuotient::backward(const vector& xs, } } -void CwiseMultiply::forward(const vector& xs, Tensor& fx) const { +void CwiseMultiply::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); #if HAVE_CUDA gpu::vcwise_product(fx.d.size(), xs[0]->v, xs[1]->v, fx.v); @@ -1029,7 +1029,7 @@ void CwiseMultiply::forward(const vector& xs, Tensor& fx) const { #endif } -void CwiseMultiply::backward(const vector& xs, +void CwiseMultiply::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -1052,7 +1052,7 @@ void CwiseMultiply::backward(const vector& xs, } } -void AffineTransform::forward(const vector& xs, Tensor& fx) const { +void AffineTransform::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() % 2 == 1); if (xs.size() == 1) { fx.v = xs[0]->v; @@ -1076,7 +1076,7 @@ void AffineTransform::forward(const vector& xs, Tensor& fx) const } } -void AffineTransform::backward(const vector& xs, +void AffineTransform::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -1113,7 +1113,7 @@ void AffineTransform::backward(const vector& xs, } } -void Negate::forward(const vector& xs, Tensor& fx) const { +void Negate::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); #if HAVE_CUDA gpu::vnegate(fx.d.size(), xs[0]->v, fx.v); @@ -1123,7 +1123,7 @@ void Negate::forward(const vector& xs, Tensor& fx) const { #endif } -void Negate::backward(const vector& xs, +void Negate::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -1136,7 +1136,7 @@ void Negate::backward(const vector& xs, #endif } -void Rectify::forward(const vector& xs, Tensor& fx) const { +void Rectify::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); #if HAVE_CUDA gpu::vrelu(fx.d.size(), xs[0]->v, fx.v); @@ -1146,7 +1146,7 @@ void Rectify::forward(const vector& xs, Tensor& fx) const { #endif } -void Rectify::backward(const vector& xs, +void Rectify::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -1158,7 +1158,7 @@ void Rectify::backward(const vector& xs, #endif } -void HuberDistance::forward(const vector& xs, Tensor& fx) const { +void HuberDistance::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); auto x = *xs[0]; auto y = *xs[1]; @@ -1170,7 +1170,7 @@ void HuberDistance::forward(const vector& xs, Tensor& fx) const { fx.v[0] = dist; } -void HuberDistance::backward(const vector& xs, +void HuberDistance::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -1181,14 +1181,14 @@ void HuberDistance::backward(const vector& xs, *dEdxi += (x - y).unaryExpr(FHuberBackward(d, dEdf.v[0])); } -void L1Distance::forward(const vector& xs, Tensor& fx) const { +void L1Distance::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); auto x = **xs[0]; auto y = **xs[1]; fx.v[0] = (x - y).lpNorm<1>(); } -void L1Distance::backward(const vector& xs, +void L1Distance::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -1199,14 +1199,14 @@ void L1Distance::backward(const vector& xs, *dEdxi += (x - y).unaryExpr(FL1Backward(dEdf.v[0])); } -void PoissonRegressionLoss::forward(const vector& xs, Tensor& fx) const { +void PoissonRegressionLoss::forward_impl(const vector& xs, Tensor& fx) const { const auto y = *pty; const auto z = lgamma(y + 1); const auto x = xs[0]->v[0]; fx.v[0] = expf(x) + z - y * x; } -void PoissonRegressionLoss::backward(const vector& xs, +void PoissonRegressionLoss::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -1217,7 +1217,7 @@ void PoissonRegressionLoss::backward(const vector& xs, dEdx += expf(x) - y; } -void SquaredEuclideanDistance::forward(const vector& xs, Tensor& fx) const { +void SquaredEuclideanDistance::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); #if HAVE_CUDA gpu::sqeucdist(xs[0]->d.size(), xs[0]->v, xs[1]->v, fx.v); @@ -1228,7 +1228,7 @@ void SquaredEuclideanDistance::forward(const vector& xs, Tensor& #endif } -void SquaredEuclideanDistance::backward(const vector& xs, +void SquaredEuclideanDistance::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -1245,7 +1245,7 @@ void SquaredEuclideanDistance::backward(const vector& xs, #endif } -void LogisticSigmoid::forward(const vector& xs, Tensor& fx) const { +void LogisticSigmoid::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); #if HAVE_CUDA gpu::vlogistic(fx.d.size(), xs[0]->v, fx.v); @@ -1255,7 +1255,7 @@ void LogisticSigmoid::forward(const vector& xs, Tensor& fx) const #endif } -void LogisticSigmoid::backward(const vector& xs, +void LogisticSigmoid::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -1267,13 +1267,13 @@ void LogisticSigmoid::backward(const vector& xs, #endif } -void SoftSign::forward(const vector& xs, Tensor& fx) const { +void SoftSign::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); auto x = **xs[0]; *fx = x.unaryExpr(FSoftSign()); } -void SoftSign::backward(const vector& xs, +void SoftSign::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -1281,7 +1281,7 @@ void SoftSign::backward(const vector& xs, *dEdxi += (*fx).binaryExpr(*dEdf, FSoftSignBackward()); } -void BinaryLogLoss::forward(const vector& xs, Tensor& fx) const { +void BinaryLogLoss::forward_impl(const vector& xs, Tensor& fx) const { auto x = *xs[0]; auto y = *xs[1]; FBinaryLogLoss bll; @@ -1292,7 +1292,7 @@ void BinaryLogLoss::forward(const vector& xs, Tensor& fx) const { fx.v[0] = dist; } -void BinaryLogLoss::backward(const vector& xs, +void BinaryLogLoss::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, diff --git a/cnn/nodes.h b/cnn/nodes.h index 537d7f84c..09f9b4ab7 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -11,8 +11,8 @@ struct Min : public Node { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -25,8 +25,8 @@ struct Max : public Node { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -38,8 +38,8 @@ struct TraceOfProduct : public Node { explicit TraceOfProduct(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -51,8 +51,8 @@ struct ConstScalarMultiply : public Node { explicit ConstScalarMultiply(const std::initializer_list& a, float alpha) : Node(a), alpha(alpha) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -65,8 +65,8 @@ struct DotProduct : public Node { explicit DotProduct(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -80,8 +80,8 @@ struct Transpose : public Node { explicit Transpose(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -93,8 +93,8 @@ struct Reshape : public Node { explicit Reshape(const std::initializer_list& a, const Dim& to) : Node(a), to(to) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -109,8 +109,8 @@ struct SumColumns : public Node { template explicit SumColumns(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -122,8 +122,8 @@ struct KMHNGram : public Node { explicit KMHNGram(const std::initializer_list& a, unsigned n) : Node(a), n(n) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -142,8 +142,8 @@ struct InnerProduct3D_1D : public Node { InnerProduct3D_1D(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -157,8 +157,8 @@ struct GaussianNoise : public Node { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -172,8 +172,8 @@ struct Dropout : public Node { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -187,8 +187,8 @@ struct BlockDropout : public Node { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -202,8 +202,8 @@ struct ConstantPlusX : public Node { explicit ConstantPlusX(const std::initializer_list& a, real o) : Node(a), c(o) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -217,8 +217,8 @@ struct ConstantMinusX : public Node { explicit ConstantMinusX(const std::initializer_list& a, real o) : Node(a), c(o) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -231,8 +231,8 @@ struct Tanh : public Node { explicit Tanh(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -244,8 +244,8 @@ struct Square : public Node { explicit Square(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -257,8 +257,8 @@ struct Cube : public Node { explicit Cube(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -270,8 +270,8 @@ struct Exp : public Node { explicit Exp(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -283,8 +283,8 @@ struct Log : public Node { explicit Log(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -296,8 +296,8 @@ struct Concatenate : public Node { template explicit Concatenate(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -314,8 +314,8 @@ struct ConcatenateColumns : public Node { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -329,8 +329,8 @@ struct PairwiseRankLoss : public Node { explicit PairwiseRankLoss(const std::initializer_list& a, real m = 1.0) : Node(a), margin(m) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -346,8 +346,8 @@ struct Hinge : public Node { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -362,8 +362,8 @@ struct Identity : public Node { explicit Identity(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -378,8 +378,8 @@ struct MaxPooling1D : public Node { MaxPooling1D(const std::initializer_list& a, unsigned w) : Node(a), width(w) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -393,8 +393,8 @@ struct MatrixMultiply : public Node { explicit MatrixMultiply(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -406,8 +406,8 @@ struct CwiseMultiply : public Node { explicit CwiseMultiply(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -419,8 +419,8 @@ struct CwiseQuotient : public Node { explicit CwiseQuotient(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -432,8 +432,8 @@ struct AffineTransform : public Node { template explicit AffineTransform(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -445,8 +445,8 @@ struct Negate : public Node { explicit Negate(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -458,8 +458,8 @@ struct Rectify : public Node { explicit Rectify(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -475,8 +475,8 @@ struct BinaryLogLoss : public Node { BinaryLogLoss(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -490,8 +490,8 @@ struct LogSumExp : public Node { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -503,8 +503,8 @@ struct Sum : public Node { template explicit Sum(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -516,8 +516,8 @@ struct Average : public Node { template explicit Average(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -536,8 +536,8 @@ struct PoissonRegressionLoss : public Node { explicit PoissonRegressionLoss(const std::initializer_list& a, const unsigned* ptrue_y) : Node(a), ty(), pty(ptrue_y) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -552,8 +552,8 @@ struct SquaredEuclideanDistance : public Node { explicit SquaredEuclideanDistance(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -565,8 +565,8 @@ struct HuberDistance : public Node { explicit HuberDistance(const std::initializer_list& a, float d = 1.345f) : Node(a), d(d) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -579,8 +579,8 @@ struct L1Distance : public Node { explicit L1Distance(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -592,8 +592,8 @@ struct LogisticSigmoid : public Node { explicit LogisticSigmoid(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -605,8 +605,8 @@ struct SoftSign : public Node { explicit SoftSign(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -619,8 +619,8 @@ struct Softmax : public Node { explicit Softmax(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -633,8 +633,8 @@ struct LogSoftmax : public Node { explicit LogSoftmax(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -649,8 +649,8 @@ struct PickNegLogSoftmax : public Node { explicit PickNegLogSoftmax(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -666,8 +666,8 @@ struct RestrictedLogSoftmax : public Node { explicit RestrictedLogSoftmax(const std::initializer_list& a, const std::vector& d) : Node(a), denom(d) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -684,8 +684,8 @@ struct PickElement : public Node { explicit PickElement(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -701,8 +701,8 @@ struct PickRange : public Node { explicit PickRange(const std::initializer_list& a, unsigned start, unsigned end) : Node(a), start(start), end(end) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index bf3d21715..0a5ac7f63 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -18,12 +18,12 @@ Dim ParameterNode::dim_forward(const vector& xs) const { return dim; } -void ParameterNode::forward(const vector& xs, Tensor& fx) const { +void ParameterNode::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); fx.v = params->values.v; } -void ParameterNode::backward(const vector& xs, +void ParameterNode::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -46,7 +46,7 @@ Dim InputNode::dim_forward(const vector& xs) const { return dim; } -void InputNode::forward(const vector& xs, Tensor& fx) const { +void InputNode::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); #if HAVE_CUDA cudaMemcpyAsync(fx.v, &pdata->front(), dim.size() * sizeof(float), cudaMemcpyHostToDevice); @@ -55,7 +55,7 @@ void InputNode::forward(const vector& xs, Tensor& fx) const { #endif } -void InputNode::backward(const vector& xs, +void InputNode::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -74,7 +74,7 @@ Dim ScalarInputNode::dim_forward(const vector& xs) const { return Dim({1}); } -void ScalarInputNode::forward(const vector& xs, Tensor& fx) const { +void ScalarInputNode::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); #if HAVE_CUDA cudaMemcpyAsync(fx.v, pdata, 1 * sizeof(float), cudaMemcpyHostToDevice); @@ -83,7 +83,7 @@ void ScalarInputNode::forward(const vector& xs, Tensor& fx) const #endif } -void ScalarInputNode::backward(const vector& xs, +void ScalarInputNode::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -102,13 +102,13 @@ Dim LookupNode::dim_forward(const vector& xs) const { return dim; } -void LookupNode::forward(const vector& xs, Tensor& fx) const { +void LookupNode::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); assert(*pindex < params->values.size()); fx.v = params->values[*pindex].v; } -void LookupNode::backward(const vector& xs, +void LookupNode::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, diff --git a/cnn/param-nodes.h b/cnn/param-nodes.h index ac0b4c7b8..5c31a2622 100644 --- a/cnn/param-nodes.h +++ b/cnn/param-nodes.h @@ -15,8 +15,8 @@ struct ParameterNode : public ParameterNodeBase { explicit ParameterNode(Parameters* p) : dim(p->dim), params(p) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -31,8 +31,8 @@ struct InputNode : public Node { explicit InputNode(const Dim& d, const std::vector* pd) : dim(d), pdata(pd) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -47,8 +47,8 @@ struct ScalarInputNode : public Node { explicit ScalarInputNode(const real* ps) : data(), pdata(ps) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, @@ -63,8 +63,8 @@ struct LookupNode : public ParameterNodeBase { LookupNode(LookupParameters* p, const unsigned* pind) : dim(p->dim), index(), pindex(pind), params(p) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - void forward(const std::vector& xs, Tensor& fx) const override; - void backward(const std::vector& xs, + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, diff --git a/cnn/tensor.h b/cnn/tensor.h index cdd0e1be6..bbb7558c0 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -33,11 +33,13 @@ typedef float real; struct Tensor { Tensor() = default; Tensor(const Dim& d, float* v) : d(d), v(v) {} - const Eigen::Map operator*() const { - return Eigen::Map(v, d.rows(), d.cols()); + const Eigen::Map operator*() const { + assert(d.batch_elems() == 1); + return Eigen::Map(v, d.rows(), d.cols()); } - Eigen::Map operator*() { - return Eigen::Map(v, d.rows(), d.cols()); + Eigen::Map operator*() { + assert(d.batch_elems() == 1); + return Eigen::Map(v, d.rows(), d.cols()); } // this is very slow: use sparingly inline bool is_valid() const { @@ -51,8 +53,38 @@ struct Tensor { return true; #endif } + + // get a tensor representing a single batch. + // TODO: This is a bit wasteful, as it re-calculates bs.batch_size() every time. + Tensor batch_elem(unsigned b) const { + if(d.batch_elems() == 1) { + return *this; + } else { + const unsigned bsize = d.batch_size(); + Dim new_d(d); new_d.bd = 1; + Tensor ret(new_d, v + bsize * (b % d.batch_elems())); + // std::cerr << "Getting tensor for batch " << (b % d.batch_elems()) << " bsize: " << bsize << ", ptr=" << (long)ret.v << std::endl; + return ret; + } + } + + // get tensors for all batches + std::vector batch_elems() const { + if(d.batch_elems() == 1) { + return std::vector(1, *this); + } else { + std::vector bs(d.batch_elems()); + unsigned bsize = d.batch_size(); + Dim new_d = d; new_d.bd = 1; + for(unsigned b = 0; b < d.batch_elems(); ++b) + bs[b] = Tensor(new_d, v + bsize * b); + return bs; + } + } + Dim d; float* v; + std::vector bs; private: friend class boost::serialization::access; diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 233dbdbd9..a1b44850d 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent rnnlm-aevb rnnlm nlm textcat rnnlm2 mp read-write) +foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch rnnlm-aevb rnnlm nlm textcat rnnlm2 mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/xor-batch.cc b/examples/xor-batch.cc new file mode 100644 index 000000000..966ed8c2d --- /dev/null +++ b/examples/xor-batch.cc @@ -0,0 +1,69 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/gpu-ops.h" +#include "cnn/expr.h" +#include +#include + +#include +#include + +using namespace std; +using namespace cnn; +using namespace cnn::expr; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + + // parameters + const unsigned HIDDEN_SIZE = 8; + const unsigned ITERATIONS = 100; + Model m; + SimpleSGDTrainer sgd(&m); + //MomentumSGDTrainer sgd(&m); + + ComputationGraph cg; + + Expression W = parameter(cg, m.add_parameters({HIDDEN_SIZE, 2})); + Expression b = parameter(cg, m.add_parameters({HIDDEN_SIZE})); + Expression V = parameter(cg, m.add_parameters({1, HIDDEN_SIZE})); + Expression a = parameter(cg, m.add_parameters({1})); + + // set x_values to change the inputs to the network + Dim x_dim({2}, 4), y_dim({1}, 4); + vector x_values = {1, 1, -1, 1, 1, -1, -1, -1}; + Expression x = input(cg, x_dim, &x_values); + // set y_values expressing the output + vector y_values = {-1, 1, 1, -1}; + Expression y = input(cg, y_dim, &y_values); + + Expression h = tanh(W*x + b); + //Expression h = softsign(W*x + b); + Expression y_pred = V*h + a; + cg.PrintGraphviz(); + Expression loss = squared_distance(y_pred, y); + + cg.PrintGraphviz(); + if (argc == 2) { + ifstream in(argv[1]); + boost::archive::text_iarchive ia(in); + ia >> m; + } + + // train the parameters + for (unsigned iter = 0; iter < ITERATIONS; ++iter) { + vector losses = as_vector(cg.forward()); + cg.backward(); + sgd.update(0.1); + sgd.update_epoch(); + float loss = 0; + for(auto l : losses) + loss += l; + loss /= 4; + cerr << "E = " << loss << endl; + } + boost::archive::text_oarchive oa(cout); + oa << m; +} + From 568fdda703e0d7b40d14849d1a25bdbbf9c06812 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 4 Nov 2015 06:15:08 +0900 Subject: [PATCH 303/965] Fixed some errors and warnings --- cnn/cnn.cc | 12 ++++++------ cnn/tensor.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 840901379..2794c92d8 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -26,10 +26,10 @@ void Node::forward(const std::vector& xs, forward_impl(xs, fx); } else { for(int b = 0; b < fx.d.batch_elems(); ++b) { - std::vector xs_elems; + std::vector xs_elems; std::vector xs_ptrs; - for(int i = 0; i < xs.size(); ++i) xs_elems.push_back(xs[i]->batch_elem(b)); - for(int i = 0; i < xs.size(); ++i) xs_ptrs.push_back(&xs_elems[i]); + for(size_t i = 0; i < xs.size(); ++i) xs_elems.push_back(xs[i]->batch_elem(b)); + for(size_t i = 0; i < xs.size(); ++i) xs_ptrs.push_back(&xs_elems[i]); Tensor fx_elem(fx.batch_elem(b)); forward_impl(xs_ptrs, fx_elem); } @@ -44,10 +44,10 @@ void Node::backward(const std::vector& xs, backward_impl(xs, fx, dEdf, i, dEdxi); } else { for(int b = 0; b < fx.d.batch_elems(); ++b) { - std::vector xs_elems; + std::vector xs_elems; std::vector xs_ptrs; - for(int i = 0; i < xs.size(); ++i) xs_elems.push_back(xs[i]->batch_elem(b)); - for(int i = 0; i < xs.size(); ++i) xs_ptrs.push_back(&xs_elems[i]); + for(size_t i = 0; i < xs.size(); ++i) xs_elems.push_back(xs[i]->batch_elem(b)); + for(size_t i = 0; i < xs.size(); ++i) xs_ptrs.push_back(&xs_elems[i]); Tensor fx_elem(fx.batch_elem(b)); Tensor dEdf_elem(dEdf.batch_elem(b)); Tensor dEdxi_elem(dEdxi.batch_elem(b)); diff --git a/cnn/tensor.h b/cnn/tensor.h index bbb7558c0..3acc1234f 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -76,7 +76,7 @@ struct Tensor { std::vector bs(d.batch_elems()); unsigned bsize = d.batch_size(); Dim new_d = d; new_d.bd = 1; - for(unsigned b = 0; b < d.batch_elems(); ++b) + for(int b = 0; b < d.batch_elems(); ++b) bs[b] = Tensor(new_d, v + bsize * b); return bs; } From 4a7577890e71aeb828d8d0704a8cc27fc4504bb0 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 3 Nov 2015 16:56:09 -0500 Subject: [PATCH 304/965] Re-added Austin's batch parameter lookup --- cnn/cnn.cc | 35 ++++++++++++++++ cnn/cnn.h | 4 ++ cnn/expr.cc | 4 ++ cnn/expr.h | 4 ++ cnn/param-nodes.cc | 39 +++++++++++++++++ cnn/param-nodes.h | 23 ++++++++++ cnn/tensor.h | 8 +++- examples/CMakeLists.txt | 2 +- examples/xor-batch-lookup.cc | 81 ++++++++++++++++++++++++++++++++++++ 9 files changed, 197 insertions(+), 3 deletions(-) create mode 100644 examples/xor-batch-lookup.cc diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 2794c92d8..0bf7bc870 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -125,6 +125,25 @@ VariableIndex ComputationGraph::add_lookup(LookupParameters* p, unsigned index) return new_node_index; } +VariableIndex ComputationGraph::add_batch_lookup(LookupParameters* p, const std::vector& indices) { + VariableIndex new_node_index(nodes.size()); + BatchLookupNode* new_node = new BatchLookupNode(p, indices); + nodes.push_back(new_node); + parameter_nodes.push_back(new_node_index); + set_dim_for_new_node(new_node_index); + return new_node_index; +} + +VariableIndex ComputationGraph::add_batch_lookup(LookupParameters* p, const std::vector* indices) { + VariableIndex new_node_index(nodes.size()); + BatchLookupNode* new_node = new BatchLookupNode(p, indices); + nodes.push_back(new_node); + parameter_nodes.push_back(new_node_index); + set_dim_for_new_node(new_node_index); + return new_node_index; +} + + VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, const unsigned* pindex) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, pindex); @@ -143,6 +162,22 @@ VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, unsigned i return new_node_index; } +VariableIndex ComputationGraph::add_batch_const_lookup(LookupParameters* p, const std::vector& indices) { + VariableIndex new_node_index(nodes.size()); + BatchLookupNode* new_node = new BatchLookupNode(p, indices); + nodes.push_back(new_node); + set_dim_for_new_node(new_node_index); + return new_node_index; +} + +VariableIndex ComputationGraph::add_batch_const_lookup(LookupParameters* p, const std::vector* indices) { + VariableIndex new_node_index(nodes.size()); + BatchLookupNode* new_node = new BatchLookupNode(p, indices); + nodes.push_back(new_node); + set_dim_for_new_node(new_node_index); + return new_node_index; +} + // factory function should call this right after creating a new node object // to set its dimensions properly void ComputationGraph::set_dim_for_new_node(const VariableIndex& i) { diff --git a/cnn/cnn.h b/cnn/cnn.h index e838d899e..51cd11942 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -62,9 +62,13 @@ struct ComputationGraph { // that the caller owns VariableIndex add_lookup(LookupParameters* p, const unsigned* pindex); VariableIndex add_lookup(LookupParameters* p, unsigned index); + VariableIndex add_batch_lookup(LookupParameters* p, const std::vector* pindices); + VariableIndex add_batch_lookup(LookupParameters* p, const std::vector& indices); // just like add_lookup, but don't optimize the lookup parameters VariableIndex add_const_lookup(LookupParameters* p, const unsigned* pindex); VariableIndex add_const_lookup(LookupParameters* p, unsigned index); + VariableIndex add_batch_const_lookup(LookupParameters* p, const std::vector* pindices); + VariableIndex add_batch_const_lookup(LookupParameters* p, const std::vector& indices); // COMPUTATIONS template inline VariableIndex add_function(const std::initializer_list& arguments); diff --git a/cnn/expr.cc b/cnn/expr.cc index 67cfeed4b..be34c93e3 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -13,8 +13,12 @@ Expression input(ComputationGraph& g, const Dim& d, const std::vector* pd Expression parameter(ComputationGraph& g, Parameters* p) { return Expression(&g, g.add_parameters(p)); } Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index) { return Expression(&g, g.add_lookup(p, index)); } Expression lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex) { return Expression(&g, g.add_lookup(p, pindex)); } +Expression batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices) { return Expression(&g, g.add_batch_lookup(p, indices)); } +Expression batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices) { return Expression(&g, g.add_batch_lookup(p, pindices)); } Expression const_lookup(ComputationGraph& g, LookupParameters* p, unsigned index) { return Expression(&g, g.add_const_lookup(p, index)); } Expression const_lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex) { return Expression(&g, g.add_const_lookup(p, pindex)); } +Expression const_batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices) { return Expression(&g, g.add_batch_const_lookup(p, indices)); } +Expression const_batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices) { return Expression(&g, g.add_batch_const_lookup(p, pindices)); } Expression operator-(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression operator+(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 242f55f73..26d66230e 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -21,8 +21,12 @@ Expression input(ComputationGraph& g, const Dim& d, const std::vector* pd Expression parameter(ComputationGraph& g, Parameters* p); Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index); Expression lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex); +Expression batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices); +Expression batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices); Expression const_lookup(ComputationGraph& g, LookupParameters* p, unsigned index); Expression const_lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex); +Expression const_batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices); +Expression const_batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices); Expression operator-(const Expression& x); Expression operator+(const Expression& x, const Expression& y); diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index 0a5ac7f63..3dd3ea1cd 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -121,4 +121,43 @@ void LookupNode::accumulate_grad(const Tensor& g) { params->accumulate_grad(*pindex, g); } +string BatchLookupNode::as_string(const vector& arg_names) const { + ostringstream s; + s << "batch_lookup_parameters(|x|=" << params->values.size() << " --> " << dim << ')'; + return s.str(); +} + +Dim BatchLookupNode::dim_forward(const vector& xs) const { + return dim; +} + +void BatchLookupNode::forward_impl(const vector& xs, Tensor& fx) const { + assert(xs.size() == 0); + assert (fx.d.batch_elems() == pindices->size()); + for (unsigned b = 0; b < pindices->size(); ++b) { + unsigned i = pindices->at(b); + assert (i < params->values.size()); + float* v = fx.v + fx.d.batch_size() * (b % fx.d.batch_elems()); + memcpy(v, params->values[i].v, fx.d.batch_size() * sizeof(float)); + } +} + +void BatchLookupNode::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + cerr << "called backward() on arity 0 node\n"; + abort(); +} + +void BatchLookupNode::accumulate_grad(const Tensor& g) { + const vector& gb = g.batch_elems(); + for (unsigned b = 0; b < pindices->size(); ++b) { + unsigned i = pindices->at(b); + assert (i < params->values.size()); + params->accumulate_grad(i, gb[b]); + } +} + } // namespace cnn diff --git a/cnn/param-nodes.h b/cnn/param-nodes.h index 5c31a2622..0d9ccf7e2 100644 --- a/cnn/param-nodes.h +++ b/cnn/param-nodes.h @@ -76,6 +76,29 @@ struct LookupNode : public ParameterNodeBase { LookupParameters* params; }; +struct BatchLookupNode : public ParameterNodeBase { + BatchLookupNode(LookupParameters* p, const std::vector& indices) : dim(p->dim), indices(indices), pindices(&this->indices), params(p) { + dim.bd = indices.size(); + } + BatchLookupNode(LookupParameters* p, const std::vector* pindices) : dim(p->dim), indices(), pindices(pindices), params(p) { + dim.bd = indices.size(); + } + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; + void accumulate_grad(const Tensor& g) override; + virtual bool supports_multibatch() const override { return true; } + Dim dim; + std::vector indices; + const std::vector* pindices; + LookupParameters* params; +}; + } // namespace cnn #endif diff --git a/cnn/tensor.h b/cnn/tensor.h index 3acc1234f..7d955e4ee 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -54,15 +54,18 @@ struct Tensor { #endif } - // get a tensor representing a single batch. + // Get a tensor representing a single batch. + // If this tensor only has a single batch, then broadcast. Otherwise, check to + // make sure that the requested batch is smaller than the number of batches. // TODO: This is a bit wasteful, as it re-calculates bs.batch_size() every time. Tensor batch_elem(unsigned b) const { if(d.batch_elems() == 1) { return *this; } else { + assert(b < d.batch_elems()); const unsigned bsize = d.batch_size(); Dim new_d(d); new_d.bd = 1; - Tensor ret(new_d, v + bsize * (b % d.batch_elems())); + Tensor ret(new_d, v + bsize * b); // std::cerr << "Getting tensor for batch " << (b % d.batch_elems()) << " bsize: " << bsize << ", ptr=" << (long)ret.v << std::endl; return ret; } @@ -76,6 +79,7 @@ struct Tensor { std::vector bs(d.batch_elems()); unsigned bsize = d.batch_size(); Dim new_d = d; new_d.bd = 1; + assert (d.batch_elems() >= 0); for(int b = 0; b < d.batch_elems(); ++b) bs[b] = Tensor(new_d, v + bsize * b); return bs; diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index a1b44850d..1c6a10f40 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch rnnlm-aevb rnnlm nlm textcat rnnlm2 mp read-write) +foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm-aevb rnnlm nlm textcat rnnlm2 mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup.cc new file mode 100644 index 000000000..0d3347228 --- /dev/null +++ b/examples/xor-batch-lookup.cc @@ -0,0 +1,81 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/gpu-ops.h" +#include "cnn/expr.h" +#include +#include + +#include +#include + +using namespace std; +using namespace cnn; +using namespace cnn::expr; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + + // parameters + const unsigned HIDDEN_SIZE = 8; + const unsigned ITERATIONS = 500; + Model m; + SimpleSGDTrainer sgd(&m); + //MomentumSGDTrainer sgd(&m); + + ComputationGraph cg; + + Expression W = parameter(cg, m.add_parameters({HIDDEN_SIZE, 2})); + Expression b = parameter(cg, m.add_parameters({HIDDEN_SIZE})); + Expression V = parameter(cg, m.add_parameters({1, HIDDEN_SIZE})); + Expression a = parameter(cg, m.add_parameters({1})); + + LookupParameters* x_values = m.add_lookup_parameters(4, {2}); + LookupParameters* y_values = m.add_lookup_parameters(4, {1}); + x_values->Initialize(0, {0.0, 0.0}); + x_values->Initialize(1, {0.0, 1.0}); + x_values->Initialize(2, {1.0, 0.0}); + x_values->Initialize(3, {1.0, 1.0}); + y_values->Initialize(0, {0.0}); + y_values->Initialize(1, {1.0}); + y_values->Initialize(2, {1.0}); + y_values->Initialize(3, {0.0}); + //cerr << "x_values dim is " << x_values->dim << endl; + //Dim x_dim(std::vector(1,2), 4), + //Dim y_dim(std::vector(1,1), 4); + //vector x_values = {1, 1, -1, 1, 1, -1, -1, -1}; // set x_values to change the inputs to the network + //vector y_values = {-1, 1, 1, -1}; // set y_values expressing the output + //Expression y = input(cg, y_dim, &y_values); + + Expression x = const_batch_lookup(cg, x_values, {0, 1, 2, 3}); + Expression y = const_batch_lookup(cg, y_values, {0, 1, 2, 3}); + + cerr << "x is " << x.value().d << ", y is " << y.value().d << endl; + Expression h = tanh(W*x + b); + //Expression h = softsign(W*x + b); + Expression y_pred = V*h + a; + Expression loss = squared_distance(y_pred, y); + + //cg.PrintGraphviz(); + if (argc == 2) { + ifstream in(argv[1]); + boost::archive::text_iarchive ia(in); + ia >> m; + } + + // train the parameters + for (unsigned iter = 0; iter < ITERATIONS; ++iter) { + vector losses = as_vector(cg.forward()); + cg.backward(); + sgd.update(0.25); + sgd.update_epoch(); + float loss = 0; + for(auto l : losses) + loss += l; + loss /= 4; + cerr << "E = " << loss << endl; + } + //boost::archive::text_oarchive oa(cout); + //oa << m; +} + From 71c0fe9bb7bffcd3fde942d3dcc6921575792083 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 5 Nov 2015 12:52:03 -0500 Subject: [PATCH 305/965] Combine non-batched and batched lookup nodes --- cnn/cnn.cc | 16 ++++----- cnn/cnn.h | 8 ++--- cnn/dim.h | 5 --- cnn/expr.cc | 8 ++--- cnn/expr.h | 9 ++--- cnn/param-nodes.cc | 65 +++++++++++++----------------------- cnn/param-nodes.h | 32 +++++------------- examples/xor-batch-lookup.cc | 28 ++++++---------- examples/xor-batch.cc | 5 ++- 9 files changed, 67 insertions(+), 109 deletions(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 0bf7bc870..69f28bf2d 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -125,18 +125,18 @@ VariableIndex ComputationGraph::add_lookup(LookupParameters* p, unsigned index) return new_node_index; } -VariableIndex ComputationGraph::add_batch_lookup(LookupParameters* p, const std::vector& indices) { +VariableIndex ComputationGraph::add_lookup(LookupParameters* p, const std::vector& indices) { VariableIndex new_node_index(nodes.size()); - BatchLookupNode* new_node = new BatchLookupNode(p, indices); + LookupNode* new_node = new LookupNode(p, indices); nodes.push_back(new_node); parameter_nodes.push_back(new_node_index); set_dim_for_new_node(new_node_index); return new_node_index; } -VariableIndex ComputationGraph::add_batch_lookup(LookupParameters* p, const std::vector* indices) { +VariableIndex ComputationGraph::add_lookup(LookupParameters* p, const std::vector* indices) { VariableIndex new_node_index(nodes.size()); - BatchLookupNode* new_node = new BatchLookupNode(p, indices); + LookupNode* new_node = new LookupNode(p, indices); nodes.push_back(new_node); parameter_nodes.push_back(new_node_index); set_dim_for_new_node(new_node_index); @@ -162,17 +162,17 @@ VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, unsigned i return new_node_index; } -VariableIndex ComputationGraph::add_batch_const_lookup(LookupParameters* p, const std::vector& indices) { +VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, const std::vector& indices) { VariableIndex new_node_index(nodes.size()); - BatchLookupNode* new_node = new BatchLookupNode(p, indices); + LookupNode* new_node = new LookupNode(p, indices); nodes.push_back(new_node); set_dim_for_new_node(new_node_index); return new_node_index; } -VariableIndex ComputationGraph::add_batch_const_lookup(LookupParameters* p, const std::vector* indices) { +VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, const std::vector* indices) { VariableIndex new_node_index(nodes.size()); - BatchLookupNode* new_node = new BatchLookupNode(p, indices); + LookupNode* new_node = new LookupNode(p, indices); nodes.push_back(new_node); set_dim_for_new_node(new_node_index); return new_node_index; diff --git a/cnn/cnn.h b/cnn/cnn.h index 51cd11942..000d721ff 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -62,13 +62,13 @@ struct ComputationGraph { // that the caller owns VariableIndex add_lookup(LookupParameters* p, const unsigned* pindex); VariableIndex add_lookup(LookupParameters* p, unsigned index); - VariableIndex add_batch_lookup(LookupParameters* p, const std::vector* pindices); - VariableIndex add_batch_lookup(LookupParameters* p, const std::vector& indices); + VariableIndex add_lookup(LookupParameters* p, const std::vector* pindices); + VariableIndex add_lookup(LookupParameters* p, const std::vector& indices); // just like add_lookup, but don't optimize the lookup parameters VariableIndex add_const_lookup(LookupParameters* p, const unsigned* pindex); VariableIndex add_const_lookup(LookupParameters* p, unsigned index); - VariableIndex add_batch_const_lookup(LookupParameters* p, const std::vector* pindices); - VariableIndex add_batch_const_lookup(LookupParameters* p, const std::vector& indices); + VariableIndex add_const_lookup(LookupParameters* p, const std::vector* pindices); + VariableIndex add_const_lookup(LookupParameters* p, const std::vector& indices); // COMPUTATIONS template inline VariableIndex add_function(const std::initializer_list& arguments); diff --git a/cnn/dim.h b/cnn/dim.h index c35f45c03..66df9c088 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -9,9 +9,6 @@ #include #include -// DEBUG!!! -#include - #define CNN_MAX_TENSOR_DIM 7 namespace boost { namespace serialization { class access; } } @@ -26,11 +23,9 @@ struct Dim { // Dim(int m, int n) : nd(2), bd(1) { d[0] = m; d[1] = n; } Dim(std::initializer_list x) : nd(), bd(1) { for(auto v : x) d[nd++] = v; - std::cerr << "Dim( "; for(auto v : x) std::cerr << v << " "; std::cerr << ")" << std::endl; } Dim(std::initializer_list x, int b) : nd(), bd(b) { for(auto v : x) d[nd++] = v; - std::cerr << "Dim( "; for(auto v : x) std::cerr << v << " "; std::cerr << "X" << bd << " )" << std::endl; } // Dim(const std::vector & x) : nd(), bd(1) { // for(auto v : x) d[nd++] = v; diff --git a/cnn/expr.cc b/cnn/expr.cc index be34c93e3..f38c3287e 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -13,12 +13,12 @@ Expression input(ComputationGraph& g, const Dim& d, const std::vector* pd Expression parameter(ComputationGraph& g, Parameters* p) { return Expression(&g, g.add_parameters(p)); } Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index) { return Expression(&g, g.add_lookup(p, index)); } Expression lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex) { return Expression(&g, g.add_lookup(p, pindex)); } -Expression batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices) { return Expression(&g, g.add_batch_lookup(p, indices)); } -Expression batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices) { return Expression(&g, g.add_batch_lookup(p, pindices)); } +Expression lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices) { return Expression(&g, g.add_lookup(p, indices)); } +Expression lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices) { return Expression(&g, g.add_lookup(p, pindices)); } Expression const_lookup(ComputationGraph& g, LookupParameters* p, unsigned index) { return Expression(&g, g.add_const_lookup(p, index)); } Expression const_lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex) { return Expression(&g, g.add_const_lookup(p, pindex)); } -Expression const_batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices) { return Expression(&g, g.add_batch_const_lookup(p, indices)); } -Expression const_batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices) { return Expression(&g, g.add_batch_const_lookup(p, pindices)); } +Expression const_lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices) { return Expression(&g, g.add_const_lookup(p, indices)); } +Expression const_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices) { return Expression(&g, g.add_const_lookup(p, pindices)); } Expression operator-(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression operator+(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 26d66230e..cf21665ae 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -21,12 +21,13 @@ Expression input(ComputationGraph& g, const Dim& d, const std::vector* pd Expression parameter(ComputationGraph& g, Parameters* p); Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index); Expression lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex); -Expression batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices); -Expression batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices); Expression const_lookup(ComputationGraph& g, LookupParameters* p, unsigned index); Expression const_lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex); -Expression const_batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices); -Expression const_batch_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices); +// Batched versions of lookup and const_lookup +Expression lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices); +Expression lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices); +Expression const_lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices); +Expression const_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices); Expression operator-(const Expression& x); Expression operator+(const Expression& x, const Expression& y); diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index 3dd3ea1cd..175aaa09d 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -104,8 +104,20 @@ Dim LookupNode::dim_forward(const vector& xs) const { void LookupNode::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - assert(*pindex < params->values.size()); - fx.v = params->values[*pindex].v; + if(pindex) { + assert(*pindex < params->values.size()); + assert (fx.d.batch_elems() == 1); + fx.v = params->values[*pindex].v; + } else { + assert (pindices); + assert (fx.d.batch_elems() == pindices->size()); + for (unsigned b = 0; b < pindices->size(); ++b) { + unsigned i = pindices->at(b); + assert (i < params->values.size()); + float* v = fx.v + fx.d.batch_size() * (b % fx.d.batch_elems()); + memcpy(v, params->values[i].v, fx.d.batch_size() * sizeof(float)); + } + } } void LookupNode::backward_impl(const vector& xs, @@ -118,45 +130,16 @@ void LookupNode::backward_impl(const vector& xs, } void LookupNode::accumulate_grad(const Tensor& g) { - params->accumulate_grad(*pindex, g); -} - -string BatchLookupNode::as_string(const vector& arg_names) const { - ostringstream s; - s << "batch_lookup_parameters(|x|=" << params->values.size() << " --> " << dim << ')'; - return s.str(); -} - -Dim BatchLookupNode::dim_forward(const vector& xs) const { - return dim; -} - -void BatchLookupNode::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 0); - assert (fx.d.batch_elems() == pindices->size()); - for (unsigned b = 0; b < pindices->size(); ++b) { - unsigned i = pindices->at(b); - assert (i < params->values.size()); - float* v = fx.v + fx.d.batch_size() * (b % fx.d.batch_elems()); - memcpy(v, params->values[i].v, fx.d.batch_size() * sizeof(float)); - } -} - -void BatchLookupNode::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - cerr << "called backward() on arity 0 node\n"; - abort(); -} - -void BatchLookupNode::accumulate_grad(const Tensor& g) { - const vector& gb = g.batch_elems(); - for (unsigned b = 0; b < pindices->size(); ++b) { - unsigned i = pindices->at(b); - assert (i < params->values.size()); - params->accumulate_grad(i, gb[b]); + if(pindex) { + params->accumulate_grad(*pindex, g); + } else { + assert (pindices); + const vector& gb = g.batch_elems(); + for (unsigned b = 0; b < pindices->size(); ++b) { + unsigned i = pindices->at(b); + assert (i < params->values.size()); + params->accumulate_grad(i, gb[b]); + } } } diff --git a/cnn/param-nodes.h b/cnn/param-nodes.h index 0d9ccf7e2..7f3d3d19c 100644 --- a/cnn/param-nodes.h +++ b/cnn/param-nodes.h @@ -59,32 +59,17 @@ struct ScalarInputNode : public Node { // represents a matrix/vector embedding of an item of a discrete set (1-hot coding) struct LookupNode : public ParameterNodeBase { - LookupNode(LookupParameters* p, unsigned ind) : dim(p->dim), index(ind), pindex(&index), params(p) {} - LookupNode(LookupParameters* p, const unsigned* pind) : dim(p->dim), index(), pindex(pind), params(p) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; - void accumulate_grad(const Tensor& g) override; - Dim dim; - unsigned index; - const unsigned* pindex; - LookupParameters* params; -}; - -struct BatchLookupNode : public ParameterNodeBase { - BatchLookupNode(LookupParameters* p, const std::vector& indices) : dim(p->dim), indices(indices), pindices(&this->indices), params(p) { - dim.bd = indices.size(); + LookupNode(LookupParameters* p, unsigned ind) : dim(p->dim), index(ind), pindex(&index), indices(), pindices(), params(p) {} + LookupNode(LookupParameters* p, const unsigned* pind) : dim(p->dim), index(), pindex(pind), indices(), pindices(), params(p) {} + LookupNode(LookupParameters* p, const std::vector& indices) : dim(p->dim), index(), pindex(), indices(indices), pindices(&this->indices), params(p) { + dim.bd = pindices->size(); } - BatchLookupNode(LookupParameters* p, const std::vector* pindices) : dim(p->dim), indices(), pindices(pindices), params(p) { - dim.bd = indices.size(); + LookupNode(LookupParameters* p, const std::vector* pindices) : dim(p->dim), index(), pindex(), indices(), pindices(pindices), params(p) { + dim.bd = pindices->size(); } std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -92,8 +77,9 @@ struct BatchLookupNode : public ParameterNodeBase { unsigned i, Tensor& dEdxi) const override; void accumulate_grad(const Tensor& g) override; - virtual bool supports_multibatch() const override { return true; } Dim dim; + unsigned index; + const unsigned* pindex; std::vector indices; const std::vector* pindices; LookupParameters* params; diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup.cc index 0d3347228..e9990ebd1 100644 --- a/examples/xor-batch-lookup.cc +++ b/examples/xor-batch-lookup.cc @@ -18,7 +18,7 @@ int main(int argc, char** argv) { // parameters const unsigned HIDDEN_SIZE = 8; - const unsigned ITERATIONS = 500; + const unsigned ITERATIONS = 100; Model m; SimpleSGDTrainer sgd(&m); //MomentumSGDTrainer sgd(&m); @@ -32,23 +32,17 @@ int main(int argc, char** argv) { LookupParameters* x_values = m.add_lookup_parameters(4, {2}); LookupParameters* y_values = m.add_lookup_parameters(4, {1}); - x_values->Initialize(0, {0.0, 0.0}); - x_values->Initialize(1, {0.0, 1.0}); - x_values->Initialize(2, {1.0, 0.0}); - x_values->Initialize(3, {1.0, 1.0}); - y_values->Initialize(0, {0.0}); + x_values->Initialize(0, {1.0, 1.0}); + x_values->Initialize(1, {-1.0, 1.0}); + x_values->Initialize(2, {1.0, -1.0}); + x_values->Initialize(3, {-1.0, -1.0}); + y_values->Initialize(0, {-1.0}); y_values->Initialize(1, {1.0}); y_values->Initialize(2, {1.0}); - y_values->Initialize(3, {0.0}); - //cerr << "x_values dim is " << x_values->dim << endl; - //Dim x_dim(std::vector(1,2), 4), - //Dim y_dim(std::vector(1,1), 4); - //vector x_values = {1, 1, -1, 1, 1, -1, -1, -1}; // set x_values to change the inputs to the network - //vector y_values = {-1, 1, 1, -1}; // set y_values expressing the output - //Expression y = input(cg, y_dim, &y_values); + y_values->Initialize(3, {-1.0}); - Expression x = const_batch_lookup(cg, x_values, {0, 1, 2, 3}); - Expression y = const_batch_lookup(cg, y_values, {0, 1, 2, 3}); + Expression x = const_lookup(cg, x_values, {0, 1, 2, 3}); + Expression y = const_lookup(cg, y_values, {0, 1, 2, 3}); cerr << "x is " << x.value().d << ", y is " << y.value().d << endl; Expression h = tanh(W*x + b); @@ -56,7 +50,7 @@ int main(int argc, char** argv) { Expression y_pred = V*h + a; Expression loss = squared_distance(y_pred, y); - //cg.PrintGraphviz(); + cg.PrintGraphviz(); if (argc == 2) { ifstream in(argv[1]); boost::archive::text_iarchive ia(in); @@ -67,7 +61,7 @@ int main(int argc, char** argv) { for (unsigned iter = 0; iter < ITERATIONS; ++iter) { vector losses = as_vector(cg.forward()); cg.backward(); - sgd.update(0.25); + sgd.update(0.1); sgd.update_epoch(); float loss = 0; for(auto l : losses) diff --git a/examples/xor-batch.cc b/examples/xor-batch.cc index 966ed8c2d..855ee7f9c 100644 --- a/examples/xor-batch.cc +++ b/examples/xor-batch.cc @@ -41,7 +41,6 @@ int main(int argc, char** argv) { Expression h = tanh(W*x + b); //Expression h = softsign(W*x + b); Expression y_pred = V*h + a; - cg.PrintGraphviz(); Expression loss = squared_distance(y_pred, y); cg.PrintGraphviz(); @@ -63,7 +62,7 @@ int main(int argc, char** argv) { loss /= 4; cerr << "E = " << loss << endl; } - boost::archive::text_oarchive oa(cout); - oa << m; + //boost::archive::text_oarchive oa(cout); + //oa << m; } From 4d8b53deb363b0ad1582cb980832923fc9c85eb2 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 5 Nov 2015 13:43:49 -0500 Subject: [PATCH 306/965] Bug fix to the batch example --- cnn/param-nodes.h | 1 + examples/xor-batch-lookup.cc | 5 ++--- examples/xor-batch.cc | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cnn/param-nodes.h b/cnn/param-nodes.h index 7f3d3d19c..cc2adf924 100644 --- a/cnn/param-nodes.h +++ b/cnn/param-nodes.h @@ -31,6 +31,7 @@ struct InputNode : public Node { explicit InputNode(const Dim& d, const std::vector* pd) : dim(d), pdata(pd) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup.cc index e9990ebd1..0d0b9300e 100644 --- a/examples/xor-batch-lookup.cc +++ b/examples/xor-batch-lookup.cc @@ -18,10 +18,9 @@ int main(int argc, char** argv) { // parameters const unsigned HIDDEN_SIZE = 8; - const unsigned ITERATIONS = 100; + const unsigned ITERATIONS = 200; Model m; SimpleSGDTrainer sgd(&m); - //MomentumSGDTrainer sgd(&m); ComputationGraph cg; @@ -61,7 +60,7 @@ int main(int argc, char** argv) { for (unsigned iter = 0; iter < ITERATIONS; ++iter) { vector losses = as_vector(cg.forward()); cg.backward(); - sgd.update(0.1); + sgd.update(0.25); sgd.update_epoch(); float loss = 0; for(auto l : losses) diff --git a/examples/xor-batch.cc b/examples/xor-batch.cc index 855ee7f9c..b34d12b44 100644 --- a/examples/xor-batch.cc +++ b/examples/xor-batch.cc @@ -18,10 +18,9 @@ int main(int argc, char** argv) { // parameters const unsigned HIDDEN_SIZE = 8; - const unsigned ITERATIONS = 100; + const unsigned ITERATIONS = 200; Model m; SimpleSGDTrainer sgd(&m); - //MomentumSGDTrainer sgd(&m); ComputationGraph cg; @@ -32,10 +31,11 @@ int main(int argc, char** argv) { // set x_values to change the inputs to the network Dim x_dim({2}, 4), y_dim({1}, 4); - vector x_values = {1, 1, -1, 1, 1, -1, -1, -1}; + cerr << "x_dim=" << x_dim << ", y_dim=" << y_dim << endl; + vector x_values = {1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0}; Expression x = input(cg, x_dim, &x_values); // set y_values expressing the output - vector y_values = {-1, 1, 1, -1}; + vector y_values = {-1.0, 1.0, 1.0, -1.0}; Expression y = input(cg, y_dim, &y_values); Expression h = tanh(W*x + b); @@ -54,7 +54,7 @@ int main(int argc, char** argv) { for (unsigned iter = 0; iter < ITERATIONS; ++iter) { vector losses = as_vector(cg.forward()); cg.backward(); - sgd.update(0.1); + sgd.update(0.25); sgd.update_epoch(); float loss = 0; for(auto l : losses) From 1ae8c6efda44906037b8cfa87f14e01128da7a09 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 5 Nov 2015 15:07:56 -0500 Subject: [PATCH 307/965] Input node passing by reference, like others --- cnn/param-nodes.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cnn/param-nodes.h b/cnn/param-nodes.h index ac0b4c7b8..51b60d270 100644 --- a/cnn/param-nodes.h +++ b/cnn/param-nodes.h @@ -28,7 +28,8 @@ struct ParameterNode : public ParameterNodeBase { // represents specified (not learned) inputs to the network struct InputNode : public Node { - explicit InputNode(const Dim& d, const std::vector* pd) : dim(d), pdata(pd) {} + explicit InputNode(const Dim& d, const std::vector& dat) : dim(d), data(dat), pdata(&data) {} + explicit InputNode(const Dim& d, const std::vector* pdat) : dim(d), data(), pdata(pdat) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward(const std::vector& xs, Tensor& fx) const override; @@ -38,6 +39,7 @@ struct InputNode : public Node { unsigned i, Tensor& dEdxi) const override; Dim dim; + const std::vector data; const std::vector* pdata; }; From a189c283035138e5ebaa6365fe66337953f93581 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 5 Nov 2015 15:51:46 -0500 Subject: [PATCH 308/965] Added an expression for input by vector reference --- cnn/cnn.cc | 7 +++++++ cnn/cnn.h | 1 + cnn/expr.cc | 1 + cnn/expr.h | 1 + 4 files changed, 10 insertions(+) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 597ab7645..cdfa0bcff 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -53,6 +53,13 @@ VariableIndex ComputationGraph::add_input(const real* ps) { return new_node_index; } +VariableIndex ComputationGraph::add_input(const Dim& d, const vector& pm) { + VariableIndex new_node_index(nodes.size()); + nodes.push_back(new InputNode(d, pm)); + set_dim_for_new_node(new_node_index); + return new_node_index; +} + VariableIndex ComputationGraph::add_input(const Dim& d, const vector* pm) { VariableIndex new_node_index(nodes.size()); nodes.push_back(new InputNode(d, pm)); diff --git a/cnn/cnn.h b/cnn/cnn.h index db4d21798..c556f421b 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -51,6 +51,7 @@ struct ComputationGraph { // structures and make them available to the computation VariableIndex add_input(real s); // add scalar VariableIndex add_input(const real* ps); // add pointer to scalar + VariableIndex add_input(const Dim& d, const std::vector& data); VariableIndex add_input(const Dim& d, const std::vector* pdata); // PARAMETERS diff --git a/cnn/expr.cc b/cnn/expr.cc index 67cfeed4b..9f3e58aa2 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -9,6 +9,7 @@ namespace cnn { namespace expr { Expression input(ComputationGraph& g, real s) { return Expression(&g, g.add_input(s)); } Expression input(ComputationGraph& g, const real *ps) { return Expression(&g, g.add_input(ps)); } +Expression input(ComputationGraph& g, const Dim& d, const std::vector& data) { return Expression(&g, g.add_input(d, data)); } Expression input(ComputationGraph& g, const Dim& d, const std::vector* pdata) { return Expression(&g, g.add_input(d, pdata)); } Expression parameter(ComputationGraph& g, Parameters* p) { return Expression(&g, g.add_parameters(p)); } Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index) { return Expression(&g, g.add_lookup(p, index)); } diff --git a/cnn/expr.h b/cnn/expr.h index 242f55f73..ec39a5196 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -17,6 +17,7 @@ struct Expression { Expression input(ComputationGraph& g, real s); Expression input(ComputationGraph& g, const real *ps); +Expression input(ComputationGraph& g, const Dim& d, const std::vector& data); Expression input(ComputationGraph& g, const Dim& d, const std::vector* pdata); Expression parameter(ComputationGraph& g, Parameters* p); Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index); From 69b509df5bdc29d0f92ac6336c40af29b23a8423 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 6 Nov 2015 17:05:43 -0500 Subject: [PATCH 309/965] Added working rnnlm example --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/nodes-common.cc | 2 +- cnn/nodes.cc | 48 ++++++-- cnn/nodes.h | 10 +- cnn/param-nodes.h | 2 +- cnn/tensor.h | 8 ++ examples/CMakeLists.txt | 2 +- examples/rnnlm-batch.cc | 256 ++++++++++++++++++++++++++++++++++++++++ 9 files changed, 314 insertions(+), 16 deletions(-) create mode 100644 examples/rnnlm-batch.cc diff --git a/cnn/expr.cc b/cnn/expr.cc index f38c3287e..0603c9730 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -78,6 +78,7 @@ Expression pick(const Expression& x, unsigned* pv) { return Expression(x.pg, x.p Expression pickrange(const Expression& x, unsigned v, unsigned u) { return Expression(x.pg, x.pg->add_function({x.i}, v, u)); } Expression pickneglogsoftmax(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } +Expression pickneglogsoftmax(const Expression& x, const std::vector & v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } Expression sum_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index cf21665ae..bca489b8a 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -95,6 +95,7 @@ Expression pick(const Expression& x, unsigned v); Expression pick(const Expression& x, unsigned* pv); Expression pickrange(const Expression& x, unsigned v, unsigned u); Expression pickneglogsoftmax(const Expression& x, unsigned v); +Expression pickneglogsoftmax(const Expression& x, const std::vector & v); namespace detail { template diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index d74317ea5..3fedecf3a 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -616,8 +616,8 @@ Dim AffineTransform::dim_forward(const vector& xs) const { xs[0].cols() != xs[i+1].cols()) { cerr << "Bad dimensions for AffineTransform: " << xs << endl; throw std::invalid_argument("Bad dimensions to AffineTransform"); - d.bd = max(max(d.bd, xs[0].bd), xs[1].bd); } + d.bd = max(max(d.bd, xs[i].bd), xs[i+1].bd); } return d; } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 905180623..44a6a2e82 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -783,16 +783,27 @@ void Softmax::backward_impl(const vector& xs, void PickNegLogSoftmax::forward_impl(const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { - logz = (float*)fxs->allocate(sizeof(float)); + logz = (float*)fxs->allocate(sizeof(float)*fx.d.batch_elems()); #if HAVE_CUDA + assert(fx.d.batch_elems() == 1); gpu::pnlsoftmax(xs[0]->d.size(), *pval, xs[0]->v, fx.v, logz); #else - auto x = **xs[0]; - *logz = logsumexp(x); - fx.v[0] = *logz - x(*pval); + if(pval) { + auto x = **xs[0]; + *logz = logsumexp(x); + fx.v[0] = *logz - x(*pval); + } else { + assert(pvals); + assert(pvals->size() == fx.d.batch_elems()); + for(unsigned b = 0; b < pvals->size(); ++b) { + auto x = xs[0]->batch_matrix(b); + logz[b] = logsumexp(x); + fx.v[b] = logz[b] - x((*pvals)[b]); + } + } #endif } else { - cerr << "SoftmaxForward not implemented for multiple columns\n"; + cerr << "PickNegLogSoftmax::forward not implemented for multiple columns\n"; abort(); } } @@ -803,15 +814,30 @@ void PickNegLogSoftmax::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { if (xs[0]->d.cols() == 1) { - const auto elem = *pval; #if HAVE_CUDA + assert(fx.d.batch_elems() == 1); + const auto elem = *pval; gpu::pnlsoftmax_backward(dEdxi.d.size(), elem, xs[0]->v, dEdf.v, logz, dEdxi.v); #else - const float err = dEdf.v[0]; - auto x = **xs[0]; - // logz is computed in the forward pass and cached - *dEdxi += x.unaryExpr(FNegLogSoftmaxBackward(*logz, err)); - (*dEdxi)(elem) -= err; + if(pval) { + const auto elem = *pval; + const float err = dEdf.v[0]; + auto x = **xs[0]; + // logz is computed in the forward pass and cached + *dEdxi += x.unaryExpr(FNegLogSoftmaxBackward(*logz, err)); + (*dEdxi)(elem) -= err; + } else { + assert(pvals); + assert(pvals->size() == fx.d.batch_elems()); + for(unsigned b = 0; b < pvals->size(); ++b) { + const auto elem = (*pvals)[b]; + const float err = dEdf.v[b]; + auto x = xs[0]->batch_matrix(b); + auto dEdxi_mat = dEdxi.batch_matrix(b); + dEdxi_mat += x.unaryExpr(FNegLogSoftmaxBackward(logz[b], err)); + dEdxi_mat(elem) -= err; + } + } #endif } else { cerr << "PickNegLogSoftmax not implemented for multiple columns\n"; diff --git a/cnn/nodes.h b/cnn/nodes.h index 09f9b4ab7..1cce85e91 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -644,11 +644,15 @@ struct LogSoftmax : public Node { // z = \sum_j \exp (x_i)_j // y = (x_1)_element - \log z struct PickNegLogSoftmax : public Node { - explicit PickNegLogSoftmax(const std::initializer_list& a, unsigned v) : Node(a), val(v), pval(&val) {} + explicit PickNegLogSoftmax(const std::initializer_list& a, unsigned v) : Node(a), val(v), pval(&val), vals(), pvals() {} // use this constructor if you want to change the value after the graph is constructed - explicit PickNegLogSoftmax(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv) {} + explicit PickNegLogSoftmax(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv), vals(), pvals() {} + explicit PickNegLogSoftmax(const std::initializer_list& a, const std::vector& v) : Node(a), val(), pval(), vals(v), pvals(&vals) {} + // use this constructor if you want to change the value after the graph is constructed + explicit PickNegLogSoftmax(const std::initializer_list& a, const std::vector* pv) : Node(a), val(), pval(), vals(), pvals(pv) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -658,6 +662,8 @@ struct PickNegLogSoftmax : public Node { mutable float* logz; unsigned val; const unsigned* pval; + std::vector vals; + const std::vector* pvals; }; // z = \sum_{j \in denom} \exp (x_i)_j diff --git a/cnn/param-nodes.h b/cnn/param-nodes.h index cc2adf924..a5907edae 100644 --- a/cnn/param-nodes.h +++ b/cnn/param-nodes.h @@ -31,7 +31,7 @@ struct InputNode : public Node { explicit InputNode(const Dim& d, const std::vector* pd) : dim(d), pdata(pd) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - virtual bool supports_multibatch() const override { return true; } + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, diff --git a/cnn/tensor.h b/cnn/tensor.h index 7d955e4ee..5a0955698 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -41,6 +41,14 @@ struct Tensor { assert(d.batch_elems() == 1); return Eigen::Map(v, d.rows(), d.cols()); } + const Eigen::Map batch_matrix(unsigned bid) const { + assert(bid < d.batch_elems()); + return Eigen::Map(v + bid*d.batch_size(), d.rows(), d.cols()); + } + Eigen::Map batch_matrix(unsigned bid) { + assert(bid < d.batch_elems()); + return Eigen::Map(v + bid*d.batch_size(), d.rows(), d.cols()); + } // this is very slow: use sparingly inline bool is_valid() const { #if HAVE_CUDA diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 1c6a10f40..fa56bb2a9 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm-aevb rnnlm nlm textcat rnnlm2 mp read-write) +foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-batch nlm textcat rnnlm2 mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/rnnlm-batch.cc b/examples/rnnlm-batch.cc new file mode 100644 index 000000000..0a7164f13 --- /dev/null +++ b/examples/rnnlm-batch.cc @@ -0,0 +1,256 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/timing.h" +#include "cnn/rnn.h" +#include "cnn/gru.h" +#include "cnn/lstm.h" +#include "cnn/dict.h" +# include "cnn/expr.h" + +#include +#include +#include +#include + +#include +#include + +using namespace std; +using namespace cnn; + +unsigned LAYERS = 2; +unsigned INPUT_DIM = 8; //256 +unsigned HIDDEN_DIM = 24; // 1024 +unsigned BATCH_SIZE = 4; +unsigned VOCAB_SIZE = 0; + +cnn::Dict d; +int kSOS; +int kEOS; + +template +struct RNNLanguageModel { + LookupParameters* p_c; + Parameters* p_R; + Parameters* p_bias; + Builder builder; + explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({VOCAB_SIZE}); + } + + // return Expression of total loss + Expression BuildLMGraphs(const vector >& sents, + unsigned id, + unsigned bsize, + unsigned & chars, + ComputationGraph& cg) { + const unsigned slen = sents[id].size(); + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter + Expression i_bias = parameter(cg, p_bias); // word bias + vector errs; + vector last_arr(bsize, sents[0][0]), next_arr(bsize); + for (unsigned t = 1; t < slen; ++t) { + for (unsigned i = 0; i < bsize; ++i) { + next_arr[i] = sents[id+i][t]; + if(next_arr[i] != *sents[id].rbegin()) chars++; // add non-EOS + } + // y_t = RNN(x_t) + Expression i_x_t = lookup(cg, p_c, last_arr); + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + Expression i_err = pickneglogsoftmax(i_r_t, next_arr); + errs.push_back(i_err); + last_arr = next_arr; + } + Expression i_nerr = sum(errs); + return i_nerr; + } + + // return Expression for total loss + void RandomSample(int max_len = 150) { + cerr << endl; + ComputationGraph cg; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + + Expression i_R = parameter(cg, p_R); + Expression i_bias = parameter(cg, p_bias); + vector errs; + int len = 0; + int cur = kSOS; + while(len < max_len && cur != kEOS) { + ++len; + Expression i_x_t = lookup(cg, p_c, cur); + // y_t = RNN(x_t) + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + + Expression ydist = softmax(i_r_t); + + unsigned w = 0; + while (w == 0 || (int)w == kSOS) { + auto dist = as_vector(cg.incremental_forward()); + double p = rand01(); + for (; w < dist.size(); ++w) { + p -= dist[w]; + if (p < 0.0) { break; } + } + if (w == dist.size()) w = kEOS; + } + cerr << (len == 1 ? "" : " ") << d.Convert(w); + cur = w; + } + cerr << endl; + } +}; + +// Sort in descending order of length +struct CompareLen { + bool operator()(const std::vector& first, const std::vector& second) { + return first.size() > second.size(); + } +}; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.Convert(""); + kEOS = d.Convert(""); + vector> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + training.push_back(ReadSentence(line, &d)); + ttoks += training.back().size(); + if (training.back().front() != kSOS && training.back().back() != kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + d.Freeze(); // no new word types allowed + VOCAB_SIZE = d.size(); + + // Sort the training sentences in descending order of length + CompareLen comp; + sort(training.begin(), training.end(), comp); + // Pad the sentences in the same batch with EOS so they are the same length + // This modifies the training objective a bit by making it necessary to + // predict EOS multiple times, but it's easy and not so harmful + for(size_t i = 0; i < training.size(); i += BATCH_SIZE) + for(size_t j = 1; j < BATCH_SIZE; ++j) + while(training[i+j].size() < training[i].size()) + training[i+j].push_back(kEOS); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + ++dlc; + dev.push_back(ReadSentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() != kSOS && dev.back().back() != kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + + ostringstream os; + os << "lm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + Trainer* sgd = nullptr; + sgd = new SimpleSGDTrainer(&model); + sgd->clip_threshold *= BATCH_SIZE; + + RNNLanguageModel lm(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 500; + vector order((training.size()+BATCH_SIZE-1)/BATCH_SIZE); + unsigned si = order.size(); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i*BATCH_SIZE; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i, ++si) { + if (si == order.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + // build graph for this instance + ComputationGraph cg; + unsigned bsize = std::min((unsigned)training.size()-order[si], BATCH_SIZE); // Batch size + lm.BuildLMGraphs(training, order[si], bsize, chars, cg); + vector losses = as_vector(cg.forward()); + for(float l : losses) + loss += l; + cg.backward(); + sgd->update(); + lines += bsize; + } + sgd->status(); + cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + lm.RandomSample(); + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + unsigned dchars = 0; + for (unsigned i = 0; i < dev.size(); ++i) { + ComputationGraph cg; + lm.BuildLMGraphs(dev, i, 1, dchars, cg); + dloss += as_scalar(cg.forward()); + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } + } + delete sgd; +} + From d278956454f73c7a8a0c1e414798f358b026f4d9 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 11 Nov 2015 03:13:50 -0500 Subject: [PATCH 310/965] fix warnings --- cnn/lstm.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/lstm.h b/cnn/lstm.h index 28967cbc1..f35ee195e 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -27,8 +27,8 @@ struct LSTMBuilder : public RNNBuilder { } unsigned num_h0_components() const override { return 2 * layers; } - std::vector get_h(RNNPointer i) const { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const { + std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } + std::vector get_s(RNNPointer i) const override { std::vector ret = (i == -1 ? c0 : c[i]); for(auto my_h : get_h(i)) ret.push_back(my_h); return ret; From 2041ae548a68a1f17c0771b2692f772621398d7b Mon Sep 17 00:00:00 2001 From: Manaal Faruqui Date: Wed, 18 Nov 2015 14:57:55 -0500 Subject: [PATCH 311/965] Add FastLSTM: Uses a diagonal matrix for C2O, C2I --- cnn/CMakeLists.txt | 2 + cnn/fast-lstm.cc | 173 +++++++++++++++++++++++++++++++++++++++++++++ cnn/fast-lstm.h | 66 +++++++++++++++++ 3 files changed, 241 insertions(+) create mode 100644 cnn/fast-lstm.cc create mode 100644 cnn/fast-lstm.h diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 5cdb533b3..7397c16d3 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -8,6 +8,7 @@ set(cnn_library_SRCS dim.cc exec.cc expr.cc + fast-lstm.cc grad-check.cc graph.cc gru.cc @@ -37,6 +38,7 @@ set(cnn_library_HDRS dim.h exec.h expr.h + fast-lstm.h functors.h gpu-kernels.h gpu-ops.h diff --git a/cnn/fast-lstm.cc b/cnn/fast-lstm.cc new file mode 100644 index 000000000..8c1b09041 --- /dev/null +++ b/cnn/fast-lstm.cc @@ -0,0 +1,173 @@ +#include "cnn/fast-lstm.h" + +#include +#include +#include +#include + +#include "cnn/nodes.h" + +using namespace std; +using namespace cnn::expr; + +namespace cnn { + +enum { X2I, H2I, C2I, BI, X2O, H2O, C2O, BO, X2C, H2C, BC }; + +/* +FastLSTM replaces the matrices from cell to other units, by diagonal matrices. +Namely: C2O, C2I. +*/ + +FastLSTMBuilder::FastLSTMBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model) : layers(layers) { + unsigned layer_input_dim = input_dim; + for (unsigned i = 0; i < layers; ++i) { + // i + Parameters* p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2i = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_c2i = model->add_parameters({hidden_dim, 1}); + Parameters* p_bi = model->add_parameters({hidden_dim}); + + // o + Parameters* p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2o = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_c2o = model->add_parameters({hidden_dim, 1}); + Parameters* p_bo = model->add_parameters({hidden_dim}); + + // c + Parameters* p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); + Parameters* p_h2c = model->add_parameters({hidden_dim, hidden_dim}); + Parameters* p_bc = model->add_parameters({hidden_dim}); + layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next + + vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; + params.push_back(ps); + } // layers +} + +void FastLSTMBuilder::new_graph_impl(ComputationGraph& cg){ + param_vars.clear(); + + for (unsigned i = 0; i < layers; ++i){ + auto& p = params[i]; + + //i + Expression i_x2i = parameter(cg,p[X2I]); + Expression i_h2i = parameter(cg,p[H2I]); + Expression i_c2i = parameter(cg,p[C2I]); + Expression i_bi = parameter(cg,p[BI]); + //o + Expression i_x2o = parameter(cg,p[X2O]); + Expression i_h2o = parameter(cg,p[H2O]); + Expression i_c2o = parameter(cg,p[C2O]); + Expression i_bo = parameter(cg,p[BO]); + //c + Expression i_x2c = parameter(cg,p[X2C]); + Expression i_h2c = parameter(cg,p[H2C]); + Expression i_bc = parameter(cg,p[BC]); + + vector vars = {i_x2i, i_h2i, i_c2i, i_bi, i_x2o, i_h2o, i_c2o, i_bo, i_x2c, i_h2c, i_bc}; + param_vars.push_back(vars); + } +} + +// layout: 0..layers = c +// layers+1..2*layers = h +void FastLSTMBuilder::start_new_sequence_impl(const vector& hinit) { + h.clear(); + c.clear(); + if (hinit.size() > 0) { + assert(layers*2 == hinit.size()); + h0.resize(layers); + c0.resize(layers); + for (unsigned i = 0; i < layers; ++i) { + c0[i] = hinit[i]; + h0[i] = hinit[i + layers]; + } + has_initial_state = true; + } else { + has_initial_state = false; + } +} + +Expression FastLSTMBuilder::add_input_impl(int prev, const Expression& x) { + h.push_back(vector(layers)); + c.push_back(vector(layers)); + vector& ht = h.back(); + vector& ct = c.back(); + Expression in = x; + for (unsigned i = 0; i < layers; ++i) { + const vector& vars = param_vars[i]; + Expression i_h_tm1, i_c_tm1; + bool has_prev_state = (prev >= 0 || has_initial_state); + if (prev < 0) { + if (has_initial_state) { + // intial value for h and c at timestep 0 in layer i + // defaults to zero matrix input if not set in add_parameter_edges + i_h_tm1 = h0[i]; + i_c_tm1 = c0[i]; + } + } else { // t > 0 + i_h_tm1 = h[prev][i]; + i_c_tm1 = c[prev][i]; + } + // input + Expression i_ait; + if (has_prev_state) { +// i_ait = vars[BI] + vars[X2I] * in + vars[H2I]*i_h_tm1 + cwise_multiply(vars[C2I], i_c_tm1); + i_ait = affine_transform({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1}) + + cwise_multiply(vars[C2I], i_c_tm1); + } else { +// i_ait = vars[BI] + vars[X2I] * in; + i_ait = affine_transform({vars[BI], vars[X2I], in}); + } + Expression i_it = logistic(i_ait); + // forget + Expression i_ft = 1.f - i_it; + // write memory cell + Expression i_awt; + if (has_prev_state) +// i_awt = vars[BC] + vars[X2C] * in + vars[H2C]*i_h_tm1; + i_awt = affine_transform({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); + else +// i_awt = vars[BC] + vars[X2C] * in; + i_awt = affine_transform({vars[BC], vars[X2C], in}); + Expression i_wt = tanh(i_awt); + // output + if (has_prev_state) { + Expression i_nwt = cwise_multiply(i_it,i_wt); + Expression i_crt = cwise_multiply(i_ft,i_c_tm1); + ct[i] = i_crt + i_nwt; + } else { + ct[i] = cwise_multiply(i_it,i_wt); + } + + Expression i_aot; + if (has_prev_state) { +// i_aot = vars[BO] + vars[X2O] * in + vars[H2O] * i_h_tm1 + cwise_multiply(vars[C2O], ct[i]); + i_aot = affine_transform({vars[BO], vars[X2O], in, vars[H2O], i_h_tm1}) + + cwise_multiply(vars[C2O], ct[i]); + } + else { +// i_aot = vars[BO] + vars[X2O] * in; + i_aot = affine_transform({vars[BO], vars[X2O], in}); + } + Expression i_ot = logistic(i_aot); + Expression ph_t = tanh(ct[i]); + in = ht[i] = cwise_multiply(i_ot,ph_t); + } + return ht.back(); +} + +void FastLSTMBuilder::copy(const RNNBuilder & rnn) { + const FastLSTMBuilder & rnn_lstm = (const FastLSTMBuilder&)rnn; + assert(params.size() == rnn_lstm.params.size()); + for(size_t i = 0; i < params.size(); ++i) + for(size_t j = 0; j < params[i].size(); ++j) + params[i][j]->copy(*rnn_lstm.params[i][j]); +} + +} // namespace cnn diff --git a/cnn/fast-lstm.h b/cnn/fast-lstm.h new file mode 100644 index 000000000..96a83a810 --- /dev/null +++ b/cnn/fast-lstm.h @@ -0,0 +1,66 @@ +#ifndef CNN_FAST_LSTM_H_ +#define CNN_FAST_LSTM_H_ + +#include "cnn/cnn.h" +#include "cnn/rnn.h" +#include "cnn/expr.h" + +using namespace cnn::expr; + +namespace cnn { + +class Model; + +/* +FastLSTM replaces the matrices from cell to other units, by diagonal matrices. +*/ +struct FastLSTMBuilder : public RNNBuilder { + FastLSTMBuilder() = default; + explicit FastLSTMBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model); + + Expression back() const override { return (cur == -1? h0.back() : h[cur].back()); } + std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } + std::vector final_s() const override { + std::vector ret = (c.size() == 0 ? c0 : c.back()); + for(auto my_h : final_h()) ret.push_back(my_h); + return ret; + } + unsigned num_h0_components() const override { return 2 * layers; } + + std::vector get_h(RNNPointer i) const { return (i == -1 ? h0 : h[i]); } + std::vector get_s(RNNPointer i) const { + std::vector ret = (i == -1 ? c0 : c[i]); + for(auto my_h : get_h(i)) ret.push_back(my_h); + return ret; + } + + void copy(const RNNBuilder & params) override; + protected: + void new_graph_impl(ComputationGraph& cg) override; + void start_new_sequence_impl(const std::vector& h0) override; + Expression add_input_impl(int prev, const Expression& x) override; + + public: + // first index is layer, then ... + std::vector> params; + + // first index is layer, then ... + std::vector> param_vars; + + // first index is time, second is layer + std::vector> h, c; + + // initial values of h and c at each layer + // - both default to zero matrix input + bool has_initial_state; // if this is false, treat h0 and c0 as 0 + std::vector h0; + std::vector c0; + unsigned layers; +}; + +} // namespace cnn + +#endif From 7ff6270f65444a2c24d09f7bfba507e7f48aa587 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 19 Nov 2015 14:25:17 -0500 Subject: [PATCH 312/965] Efficient batched matrix multiplies --- cnn/expr.cc | 2 + cnn/expr.h | 3 ++ cnn/grad-check.cc | 3 +- cnn/grad-check.h | 2 +- cnn/nodes-common.cc | 20 +++++++- cnn/nodes.cc | 101 ++++++++++++++++++++++++++++++++++------ cnn/nodes.h | 15 ++++++ cnn/tensor.h | 33 +++++++++++-- examples/rnnlm-batch.cc | 4 +- examples/rnnlm.cc | 4 +- examples/xor-batch.cc | 10 ++-- examples/xor.cc | 1 + 12 files changed, 167 insertions(+), 31 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index 0603c9730..e7ccf2b62 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -82,6 +82,8 @@ Expression pickneglogsoftmax(const Expression& x, const std::vector & Expression sum_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression sum_batches(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } + Expression kmh_ngram(const Expression& x, unsigned n) { return Expression(x.pg, x.pg->add_function({x.i}, n)); } } } diff --git a/cnn/expr.h b/cnn/expr.h index bca489b8a..db1af58a4 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -90,6 +90,9 @@ Expression fold_rows(const Expression& x, unsigned nrows=2); Expression sum_cols(const Expression& x); Expression kmh_ngram(const Expression& x, unsigned n); +// Sum the results of multiple batches +Expression sum_batches(const Expression& x); + // pick parts out of bigger objects Expression pick(const Expression& x, unsigned v); Expression pick(const Expression& x, unsigned* pv); diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc index 45bf58e59..f7c7f980a 100644 --- a/cnn/grad-check.cc +++ b/cnn/grad-check.cc @@ -11,7 +11,7 @@ using namespace std; namespace cnn { -void CheckGrad(Model& m, ComputationGraph& g) { +bool CheckGrad(Model& m, ComputationGraph& g) { float alpha = 5e-4; g.forward(); g.backward(); @@ -73,6 +73,7 @@ void CheckGrad(Model& m, ComputationGraph& g) { } else { cerr << "\nGRADIENT CHECK PASSED\n"; } + return !flag; } } diff --git a/cnn/grad-check.h b/cnn/grad-check.h index ce2966f56..0fa194595 100644 --- a/cnn/grad-check.h +++ b/cnn/grad-check.h @@ -6,7 +6,7 @@ namespace cnn { class Model; struct ComputationGraph; -void CheckGrad(Model& m, ComputationGraph& g); +bool CheckGrad(Model& m, ComputationGraph& g); } // namespace cnn diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 3fedecf3a..f7282e035 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -268,6 +268,17 @@ Dim Sum::dim_forward(const vector& xs) const { return d; } +string SumBatches::as_string(const vector& arg_names) const { + ostringstream s; + s << "sum_batches( " << arg_names[0] << " )"; + return s.str(); +} + +Dim SumBatches::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0].single_batch(); +} + string Average::as_string(const vector& arg_names) const { ostringstream s; s << "average(" << arg_names[0]; @@ -470,7 +481,14 @@ Dim SoftSign::dim_forward(const vector& xs) const { string PickNegLogSoftmax::as_string(const vector& arg_names) const { ostringstream s; - s << "log_softmax(" << arg_names[0] << ")_{" << *pval << '}'; + if(pval) { + s << "log_softmax(" << arg_names[0] << ")_{" << *pval << '}'; + } else { + s << "log_softmax(" << arg_names[0] << ")_{"; + string sep = ""; + for(auto v : *pvals) { s << sep << v; sep = ","; } + s << '}'; + } return s.str(); } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 44a6a2e82..1bf96e290 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -443,6 +443,42 @@ void Sum::backward_impl(const vector& xs, #endif } +void SumBatches::forward_impl(const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + unsigned num_args = xs[0]->d.bd; +#if HAVE_CUDA + TensorTools::Zero(fx); + for (unsigned i = 0; i < num_args; ++i) + CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v + i * xs[0]->d.batch_size(), 1, fx.v, 1)); +#else + auto res = *fx; + const unsigned remainder = num_args % 4; + switch (remainder) { + case 0: res.setZero(); break; + case 1: res = xs[0]->batch_matrix(0); break; + case 2: res = xs[0]->batch_matrix(0) + xs[0]->batch_matrix(1); break; + case 3: res = xs[0]->batch_matrix(0) + xs[0]->batch_matrix(1) + xs[0]->batch_matrix(2); break; + } + for (unsigned i = remainder; i < num_args; i += 4) + res += xs[0]->batch_matrix(i) + xs[0]->batch_matrix(i+1) + xs[0]->batch_matrix(i+2) + xs[0]->batch_matrix(i+3); +#endif +} + +void SumBatches::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i == 0); +#if HAVE_CUDA + for (unsigned i = 0; i < dEdxi.d.bd; ++i) + CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v + i * dEdxi.d.batch_size(), 1)); +#else + for (unsigned i = 0; i < dEdxi.d.bd; ++i) + dEdxi.batch_matrix(i) += *dEdf; +#endif +} + void Average::forward_impl(const vector& xs, Tensor& fx) const { const unsigned num_args = xs.size(); if (num_args == 1) { @@ -982,11 +1018,22 @@ void MatrixMultiply::forward_impl(const vector& xs, Tensor& fx) c assert(xs.size() == 2); #if HAVE_CUDA // fx = 0*fx + xs[0] * xs[1] + assert(xs[0]->d.bd == 1); + assert(xs[1]->d.bd == 1); CUDAMatrixMultiply(*xs[0], *xs[1], fx, kSCALAR_ZERO); #else - auto x1 = **xs[0]; - auto x2 = **xs[1]; - (*fx).noalias() = x1 * x2; + assert(fx.d.bd == max(xs[0]->d.bd, xs[1]->d.bd)); + if(xs[0]->d.bd == 1) { + // If the left side has one batch, multiply by columns + // [x, z, b] = [x, y] * [y, z, b] + // -> [x, z*b] = [x, y], [y, z*b] + fx.colbatch_matrix().noalias() = **xs[0] * xs[1]->colbatch_matrix(); + } else { + // Otherwise, loop over the batches + assert(xs[1]->d.bd == 1 || xs[1]->d.bd == xs[0]->d.bd); + for(int b = 0; b < xs[0]->d.bd; ++b) + fx.batch_matrix(b).noalias() = xs[0]->batch_matrix(b) * xs[1]->batch_matrix(b); + } #endif } @@ -1013,10 +1060,13 @@ void MatrixMultiply::backward_impl(const vector& xs, kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); } #else + int max_b = max(xs[0]->d.bd, xs[1]->d.bd); if (i == 0) { - (*dEdxi).noalias() += *dEdf * (**xs[1]).transpose(); + for(int b = 0; b < max_b; ++b) + dEdxi.batch_matrix(b).noalias() += dEdf.batch_matrix(b) * xs[1]->batch_matrix(b).transpose(); } else { - (*dEdxi).noalias() += (**xs[0]).transpose() * *dEdf; + for(int b = 0; b < max_b; ++b) + dEdxi.batch_matrix(b).noalias() += xs[0]->batch_matrix(b).transpose() * dEdf.batch_matrix(b); } #endif } @@ -1090,14 +1140,26 @@ void AffineTransform::forward_impl(const vector& xs, Tensor& fx) CUDAMatrixMultiply(*xs[i], *xs[i + 1], fx, (i == 1) ? kSCALAR_ZERO : kSCALAR_ONE); CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v, 1, fx.v, 1)); #else - if (xs.size() == 3) { - // size 3 is optimized in newer versions of eigen - (*fx).noalias() = **xs[0] + **xs[1] * **xs[2]; + assert(fx.d.bd == 1); + // Add, using broadcasting or not + if(fx.d.bd > 1 && xs[0]->d.bd == 1) { + fx.rowcol_matrix().colwise() = xs[0]->vec(); } else { - (*fx) = **xs[0]; - for (unsigned i = 1; i < xs.size(); i += 2) - (*fx).noalias() += (**xs[i]) * (**xs[i + 1]); + for(int b = 0; b < fx.d.bd; ++b) + fx.batch_matrix(b) = xs[0]->batch_matrix(b); + } + + // Multiply + for (unsigned i = 1; i < xs.size(); i += 2) { + if(xs[i]->d.bd == 1) { + fx.colbatch_matrix().noalias() += **xs[i] * xs[i+1]->colbatch_matrix(); + } else { + assert(xs[i+1]->d.bd == 1 || xs[i+1]->d.bd == xs[i]->d.bd); + for(int b = 0; b < xs[i]->d.bd; ++b) + fx.batch_matrix(b).noalias() += xs[i]->batch_matrix(b) * xs[i+1]->batch_matrix(b); + } } + #endif } } @@ -1112,9 +1174,17 @@ void AffineTransform::backward_impl(const vector& xs, #if HAVE_CUDA CUBLAS_CHECK(cublasSaxpy(cublas_handle, dEdxi.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); #else - *dEdxi += *dEdf; + assert(fx.d.bd == 1); + // Add, using broadcasting or not + if(dEdxi.d.bd > 1 && dEdf.d.bd == 1) { + dEdxi.rowcol_matrix().colwise() += dEdf.vec(); + } else { + for(int b = 0; b < dEdxi.d.bd; ++b) + dEdxi.batch_matrix(b) += dEdf.batch_matrix(b); + } #endif } else if (i % 2 == 1) { // left argument of matrix multiply + int max_b = max(dEdf.d.bd, xs[i+1]->d.bd); #if HAVE_CUDA CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), @@ -1123,9 +1193,11 @@ void AffineTransform::backward_impl(const vector& xs, xs[i+1]->v, xs[i+1]->d.rows(), kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); #else - (*dEdxi).noalias() += *dEdf * (**xs[i+1]).transpose(); + for(int b = 0; b < max_b; ++b) + dEdxi.batch_matrix(b).noalias() += dEdf.batch_matrix(b) * xs[i+1]->batch_matrix(b).transpose(); #endif } else { // right argument of matrix multiply + int max_b = max(xs[i-1]->d.bd, dEdf.d.bd); #if HAVE_CUDA CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols(), xs[i-1]->d.rows(), @@ -1134,7 +1206,8 @@ void AffineTransform::backward_impl(const vector& xs, dEdf.v, xs[i-1]->d.rows(), kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); #else - (*dEdxi).noalias() += (**xs[i-1]).transpose() * *dEdf; + for(int b = 0; b < max_b; ++b) + dEdxi.batch_matrix(b).noalias() += xs[i-1]->batch_matrix(b).transpose() * dEdf.batch_matrix(b); #endif } } diff --git a/cnn/nodes.h b/cnn/nodes.h index 1cce85e91..374041b4e 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -393,6 +393,7 @@ struct MatrixMultiply : public Node { explicit MatrixMultiply(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -511,6 +512,20 @@ struct Sum : public Node { Tensor& dEdxi) const override; }; +// y = \sum_i x_i +struct SumBatches : public Node { + template explicit SumBatches(const T& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = ( \sum_i x_i ) / |x| struct Average : public Node { template explicit Average(const T& a) : Node(a) {} diff --git a/cnn/tensor.h b/cnn/tensor.h index 5a0955698..90259f743 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -33,6 +33,7 @@ typedef float real; struct Tensor { Tensor() = default; Tensor(const Dim& d, float* v) : d(d), v(v) {} + // Get the data as a matrix const Eigen::Map operator*() const { assert(d.batch_elems() == 1); return Eigen::Map(v, d.rows(), d.cols()); @@ -41,13 +42,37 @@ struct Tensor { assert(d.batch_elems() == 1); return Eigen::Map(v, d.rows(), d.cols()); } + // Get the data as a vector + const Eigen::Map vec() const { + return Eigen::Map(v, d.size()); + } + Eigen::Map vec() { + return Eigen::Map(v, d.size()); + } + // Get the matrix for a particular batch, automatically broadcasting if the size is zero const Eigen::Map batch_matrix(unsigned bid) const { - assert(bid < d.batch_elems()); - return Eigen::Map(v + bid*d.batch_size(), d.rows(), d.cols()); + assert(d.bd == 1 || bid < d.bd); + return Eigen::Map(v + (bid%d.bd)*d.batch_size(), d.rows(), d.cols()); } Eigen::Map batch_matrix(unsigned bid) { - assert(bid < d.batch_elems()); - return Eigen::Map(v + bid*d.batch_size(), d.rows(), d.cols()); + assert(d.bd == 1 || bid < d.bd); + return Eigen::Map(v + (bid%d.bd)*d.batch_size(), d.rows(), d.cols()); + } + // Get the data as a matrix, where each "row" is the concatenation of rows and columns, + // and each "column" is batches + const Eigen::Map rowcol_matrix() const { + return Eigen::Map(v, d.rows()*d.cols(), d.batch_elems()); + } + Eigen::Map rowcol_matrix() { + return Eigen::Map(v, d.rows()*d.cols(), d.batch_elems()); + } + // Get the data as a matrix, where each "row" is the concatenation of rows, + // and each "column" is the concatenation of columns and batches + const Eigen::Map colbatch_matrix() const { + return Eigen::Map(v, d.rows(), d.cols()*d.batch_elems()); + } + Eigen::Map colbatch_matrix() { + return Eigen::Map(v, d.rows(), d.cols()*d.batch_elems()); } // this is very slow: use sparingly inline bool is_valid() const { diff --git a/examples/rnnlm-batch.cc b/examples/rnnlm-batch.cc index 0a7164f13..aa5234b2e 100644 --- a/examples/rnnlm-batch.cc +++ b/examples/rnnlm-batch.cc @@ -20,8 +20,8 @@ using namespace std; using namespace cnn; unsigned LAYERS = 2; -unsigned INPUT_DIM = 8; //256 -unsigned HIDDEN_DIM = 24; // 1024 +unsigned INPUT_DIM = 256; //256 +unsigned HIDDEN_DIM = 256; // 1024 unsigned BATCH_SIZE = 4; unsigned VOCAB_SIZE = 0; diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 13879f1e7..ee79a0964 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -19,8 +19,8 @@ using namespace std; using namespace cnn; unsigned LAYERS = 2; -unsigned INPUT_DIM = 8; //256 -unsigned HIDDEN_DIM = 24; // 1024 +unsigned INPUT_DIM = 256; //256 +unsigned HIDDEN_DIM = 256; // 1024 unsigned VOCAB_SIZE = 0; cnn::Dict d; diff --git a/examples/xor-batch.cc b/examples/xor-batch.cc index b34d12b44..47d427a65 100644 --- a/examples/xor-batch.cc +++ b/examples/xor-batch.cc @@ -39,9 +39,11 @@ int main(int argc, char** argv) { Expression y = input(cg, y_dim, &y_values); Expression h = tanh(W*x + b); + //Expression h = tanh(affine_transform({b, W, x})); //Expression h = softsign(W*x + b); Expression y_pred = V*h + a; Expression loss = squared_distance(y_pred, y); + Expression sum_loss = sum_batches(loss); cg.PrintGraphviz(); if (argc == 2) { @@ -52,15 +54,11 @@ int main(int argc, char** argv) { // train the parameters for (unsigned iter = 0; iter < ITERATIONS; ++iter) { - vector losses = as_vector(cg.forward()); + float my_loss = as_scalar(cg.forward()) / 4; cg.backward(); sgd.update(0.25); sgd.update_epoch(); - float loss = 0; - for(auto l : losses) - loss += l; - loss /= 4; - cerr << "E = " << loss << endl; + cerr << "E = " << my_loss << endl; } //boost::archive::text_oarchive oa(cout); //oa << m; diff --git a/examples/xor.cc b/examples/xor.cc index 8ba8a25bc..bccdeb4ed 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -36,6 +36,7 @@ int main(int argc, char** argv) { Expression y = input(cg, &y_value); Expression h = tanh(W*x + b); + //Expression h = tanh(affine_transform({b, W, x})); //Expression h = softsign(W*x + b); Expression y_pred = V*h + a; Expression loss = squared_distance(y_pred, y); From 238fb213f38f02f90eb549d6da13b927ffd3fd32 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 19 Nov 2015 21:25:51 -0500 Subject: [PATCH 313/965] Add matrix multiplies to backward step --- cnn/nodes.cc | 16 ++++++++++++---- examples/rnnlm-batch.cc | 4 ++-- examples/rnnlm.cc | 4 ++-- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 1bf96e290..d5bff5be9 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1065,8 +1065,12 @@ void MatrixMultiply::backward_impl(const vector& xs, for(int b = 0; b < max_b; ++b) dEdxi.batch_matrix(b).noalias() += dEdf.batch_matrix(b) * xs[1]->batch_matrix(b).transpose(); } else { - for(int b = 0; b < max_b; ++b) - dEdxi.batch_matrix(b).noalias() += xs[0]->batch_matrix(b).transpose() * dEdf.batch_matrix(b); + if(xs[0]->d.bd == 1) { + dEdxi.colbatch_matrix().noalias() += (**xs[0]).transpose() * dEdf.colbatch_matrix(); + } else { + for(int b = 0; b < max_b; ++b) + dEdxi.batch_matrix(b).noalias() += xs[0]->batch_matrix(b).transpose() * dEdf.batch_matrix(b); + } } #endif } @@ -1206,8 +1210,12 @@ void AffineTransform::backward_impl(const vector& xs, dEdf.v, xs[i-1]->d.rows(), kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); #else - for(int b = 0; b < max_b; ++b) - dEdxi.batch_matrix(b).noalias() += xs[i-1]->batch_matrix(b).transpose() * dEdf.batch_matrix(b); + if(xs[i-1]->d.bd == 1) { + dEdxi.colbatch_matrix().noalias() += (**xs[i-1]).transpose() * dEdf.colbatch_matrix(); + } else { + for(int b = 0; b < max_b; ++b) + dEdxi.batch_matrix(b).noalias() += xs[i-1]->batch_matrix(b).transpose() * dEdf.batch_matrix(b); + } #endif } } diff --git a/examples/rnnlm-batch.cc b/examples/rnnlm-batch.cc index aa5234b2e..0a7164f13 100644 --- a/examples/rnnlm-batch.cc +++ b/examples/rnnlm-batch.cc @@ -20,8 +20,8 @@ using namespace std; using namespace cnn; unsigned LAYERS = 2; -unsigned INPUT_DIM = 256; //256 -unsigned HIDDEN_DIM = 256; // 1024 +unsigned INPUT_DIM = 8; //256 +unsigned HIDDEN_DIM = 24; // 1024 unsigned BATCH_SIZE = 4; unsigned VOCAB_SIZE = 0; diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index ee79a0964..13879f1e7 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -19,8 +19,8 @@ using namespace std; using namespace cnn; unsigned LAYERS = 2; -unsigned INPUT_DIM = 256; //256 -unsigned HIDDEN_DIM = 256; // 1024 +unsigned INPUT_DIM = 8; //256 +unsigned HIDDEN_DIM = 24; // 1024 unsigned VOCAB_SIZE = 0; cnn::Dict d; From 30a4c6c3e693621398b6a4ba78f66b7e53ff4a1c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 21 Nov 2015 06:10:10 +0900 Subject: [PATCH 314/965] Made use of unsigned int in Dim consistent, fixed warnings --- cnn/cnn.cc | 4 ++-- cnn/conv.cc | 22 +++++++++---------- cnn/dim.h | 48 +++++++++++++++++++++--------------------- cnn/nodes-common.cc | 14 ++++++------ cnn/nodes.cc | 22 +++++++++---------- cnn/saxe-init.cc | 2 +- cnn/saxe-init.h | 2 +- cnn/tensor.h | 2 +- examples/encdec.cc | 14 ++++++------ examples/segrnn-sup.cc | 7 +++--- 10 files changed, 68 insertions(+), 69 deletions(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 5b8179e19..0e04ee16c 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -25,7 +25,7 @@ void Node::forward(const std::vector& xs, if(this->supports_multibatch() || fx.d.batch_elems() == 1) { forward_impl(xs, fx); } else { - for(int b = 0; b < fx.d.batch_elems(); ++b) { + for(unsigned b = 0; b < fx.d.batch_elems(); ++b) { std::vector xs_elems; std::vector xs_ptrs; for(size_t i = 0; i < xs.size(); ++i) xs_elems.push_back(xs[i]->batch_elem(b)); @@ -43,7 +43,7 @@ void Node::backward(const std::vector& xs, if(this->supports_multibatch() || fx.d.batch_elems() == 1) { backward_impl(xs, fx, dEdf, i, dEdxi); } else { - for(int b = 0; b < fx.d.batch_elems(); ++b) { + for(unsigned b = 0; b < fx.d.batch_elems(); ++b) { std::vector xs_elems; std::vector xs_ptrs; for(size_t i = 0; i < xs.size(); ++i) xs_elems.push_back(xs[i]->batch_elem(b)); diff --git a/cnn/conv.cc b/cnn/conv.cc index 9ae31f099..327cc69bd 100644 --- a/cnn/conv.cc +++ b/cnn/conv.cc @@ -56,7 +56,7 @@ string FoldRows::as_string(const vector& arg_names) const { } Dim FoldRows::dim_forward(const vector& xs) const { - int orows = xs[0].rows() / nrows; + unsigned orows = xs[0].rows() / nrows; if ((orows * nrows != xs[0].rows()) || xs.size() != 1 || xs[0].ndims() != 2) { cerr << "Bad input dimensions in FoldRows: " << xs << endl; throw std::invalid_argument("bad input dimensions in FoldRows"); @@ -67,8 +67,8 @@ Dim FoldRows::dim_forward(const vector& xs) const { void FoldRows::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; auto y = *fx; - int orows = y.rows(); - for (int i = 0; i < orows; ++i) { + unsigned orows = y.rows(); + for (unsigned i = 0; i < orows; ++i) { for (unsigned j = 0; j < nrows; ++j) { if (j) y.row(i) += x.row(i * nrows + j); @@ -83,10 +83,10 @@ void FoldRows::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - int orows = fx.d.rows(); + unsigned orows = fx.d.rows(); auto d = *dEdf; auto di = *dEdxi; - for (int i = 0; i < orows; ++i) + for (unsigned i = 0; i < orows; ++i) for (unsigned j = 0; j < nrows; ++j) di.row(i * nrows + j) += d.row(i); } @@ -102,7 +102,7 @@ Dim Conv1DNarrow::dim_forward(const vector& xs) const { cerr << "Conv1DNarrow requires two inputs: " << xs << endl; throw std::invalid_argument("Conv1DNarrow requires 2 dimensions"); } - int ocols = xs[0].cols() - xs[1].cols() + 1; + unsigned ocols = xs[0].cols() - xs[1].cols() + 1; if (xs[0].ndims() != 2 || xs[1].ndims() != 2 || xs[0].rows() != xs[1].rows() || ocols < 1) { @@ -172,7 +172,7 @@ Dim Conv1DWide::dim_forward(const vector& xs) const { cerr << "Conv1DWide requires two inputs: " << xs << endl; throw std::invalid_argument("Conv1DWide requires two inputs"); } - int ocols = xs[0].cols() + xs[1].cols() - 1; + unsigned ocols = xs[0].cols() + xs[1].cols() - 1; if (xs[0].ndims() != 2 || xs[1].ndims() != 2 || xs[0].rows() != xs[1].rows()) { cerr << "Bad input dimensions in Conv1DWide: " << xs << endl; @@ -257,7 +257,7 @@ void KMaxPooling::forward_impl(const vector& xs, Tensor& fx) cons auto y=*fx; float tmp[1024]; assert(x.cols() < 1024); - int mi = 0; + unsigned mi = 0; const unsigned rows = x.rows(); const unsigned xcols = x.cols(); int* maxmap = static_cast(aux_mem); @@ -267,7 +267,7 @@ void KMaxPooling::forward_impl(const vector& xs, Tensor& fx) cons tmp[j] = -x(i,j); nth_element(tmp, tmp + (k-1), tmp + xcols); const float c = -tmp[k-1]; // kth largest element in row i - int tt = 0; + unsigned tt = 0; for (unsigned j = 0; j < xcols; ++j) { const float xij = x(i,j); if (xij >= c) { @@ -293,13 +293,13 @@ void KMaxPooling::backward_impl(const vector& xs, const unsigned cols = dim.cols(); const int* maxmap = static_cast(aux_mem); for (unsigned i = 0; i < rows; ++i) { - int mi = 0; + unsigned mi = 0; for (unsigned j = 0; j < cols; ++j) { assert(mi < dim.size()); const int oj = maxmap[mi++]; if (oj > (*dEdxi).cols() || oj < 0) { cerr << dim << (*fx) << endl << (*dEdxi) << endl; - cerr << "MM:"; for (int k=0;k < dim.size(); ++k) cerr << ' ' << maxmap[k]; + cerr << "MM:"; for (unsigned k=0;k < dim.size(); ++k) cerr << ' ' << maxmap[k]; cerr << endl; cerr << "BAD: " << oj << endl; abort(); } diff --git a/cnn/dim.h b/cnn/dim.h index 66df9c088..a0a2114f8 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -17,40 +17,40 @@ namespace cnn { struct Dim { Dim() : nd(), bd(1) {} - // explicit Dim(int m) : nd(1), bd(1) { d[0] = m; } - // TODO: The constructors for dimensions w/ and w/o batches is not intuitive. + // explicit Dim(unsigned int m) : nd(1), bd(1) { d[0] = m; } + // TODO: The constructors for dimensions w/ and w/o batches is not unsigned intuitive. // can this be fixed in some way? - // Dim(int m, int n) : nd(2), bd(1) { d[0] = m; d[1] = n; } - Dim(std::initializer_list x) : nd(), bd(1) { + // Dim(unsigned int m, unsigned int n) : nd(2), bd(1) { d[0] = m; d[1] = n; } + Dim(std::initializer_list x) : nd(), bd(1) { for(auto v : x) d[nd++] = v; } - Dim(std::initializer_list x, int b) : nd(), bd(b) { + Dim(std::initializer_list x, unsigned int b) : nd(), bd(b) { for(auto v : x) d[nd++] = v; } // Dim(const std::vector & x) : nd(), bd(1) { // for(auto v : x) d[nd++] = v; // } - // Dim(const std::vector & x, int b) : nd(), bd(b) { + // Dim(const std::vector & x, unsigned int b) : nd(), bd(b) { // for(auto v : x) d[nd++] = v; // } - inline int size() const { + inline unsigned int size() const { return batch_size() * bd; } - inline int batch_size() const { - int p = 1; - for (unsigned i = 0; i < nd; ++i) p *= d[i]; + inline unsigned int batch_size() const { + unsigned int p = 1; + for (unsigned int i = 0; i < nd; ++i) p *= d[i]; return p; } - inline int sum_dims() const { - int p = 0; - for (unsigned i = 0; i < nd; ++i) p += d[i]; + inline unsigned int sum_dims() const { + unsigned int p = 0; + for (unsigned int i = 0; i < nd; ++i) p += d[i]; return p; } inline Dim truncate() const { Dim r = *this; - int m = 1; - int s = size(); - for (int i = 1; i < s; ++i) + unsigned int m = 1; + unsigned int s = size(); + for (unsigned int i = 1; i < s; ++i) if (size(i) > 1) m = i + 1; r.resize(m); return r; @@ -60,14 +60,14 @@ struct Dim { r.bd = 1; return r; } - inline void resize(unsigned i) { nd = i; } - inline int ndims() const { return nd; } - inline int rows() const { return d[0]; } - inline int cols() const { return nd > 1 ? d[1] : 1; } - inline int batch_elems() const { return bd; } - inline void set(unsigned i, unsigned s) { assert(i < nd); assert(s > 0); d[i] = s; } - inline int operator[](unsigned i) const { return i < nd ? d[i] : 1; } - inline int size(unsigned i) const { return (*this)[i]; } + inline void resize(unsigned int i) { nd = i; } + inline unsigned int ndims() const { return nd; } + inline unsigned int rows() const { return d[0]; } + inline unsigned int cols() const { return nd > 1 ? d[1] : 1; } + inline unsigned int batch_elems() const { return bd; } + inline void set(unsigned int i, unsigned int s) { assert(i < nd); assert(s > 0); d[i] = s; } + inline unsigned int operator[](unsigned int i) const { return i < nd ? d[i] : 1; } + inline unsigned int size(unsigned int i) const { return (*this)[i]; } inline Dim transpose() const { if (nd == 1) { return Dim({1, d[0]}, bd); } else if (nd == 2) { return Dim({d[1], d[0]}, bd); } diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index f7282e035..6a72d1f6f 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -11,7 +11,7 @@ namespace cnn { inline bool LooksLikeVector(const Dim& d) { if (d.ndims() == 1) return true; if (d.ndims() > 1) { - for (int i = 1; i < d.ndims(); ++i) + for (unsigned i = 1; i < d.ndims(); ++i) if (d[i] != 1) return false; } return true; @@ -138,7 +138,7 @@ string KMHNGram::as_string(const vector& arg_names) const { Dim KMHNGram::dim_forward(const vector& xs) const { assert(xs[0].ndims() == 2); - const int new_cols = xs[0].cols() - n + 1; + const unsigned new_cols = xs[0].cols() - n + 1; if (new_cols < 1) { cerr << "Bad input dimensions in KMHNGram: " << xs << endl; abort(); @@ -395,16 +395,16 @@ string ConcatenateColumns::as_string(const vector& arg_names) const { Dim ConcatenateColumns::dim_forward(const vector& xs) const { assert(xs.size() > 0); - int rows = xs[0][0]; - int new_cols = 0; - int bd = 1; + unsigned rows = xs[0][0]; + unsigned new_cols = 0; + unsigned bd = 1; for (auto& d : xs) { if (d[0] != rows) { cerr << "Bad input dimensions in ConcatenateColumns: " << xs << endl; abort(); } new_cols += d[1]; - bd = max(bd, (int)d.bd); + bd = max(bd, d.bd); } return Dim({rows, new_cols}, bd); } @@ -560,7 +560,7 @@ Dim PickRange::dim_forward(const vector& xs) const { cerr << "Bad input dimensions in PickElement: " << xs << endl; abort(); } - assert((int)end <= xs[0][0]); + assert(end <= xs[0][0]); return Dim({end - start}, xs[0].bd); } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index d5bff5be9..21cab57f3 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -222,9 +222,9 @@ void KMHNGram::backward_impl(const vector& xs, void InnerProduct3D_1D::forward_impl(const vector& xs, Tensor& fx) const { auto b = **xs[1]; auto y = *fx; - const int i = y.rows(); - const int j = y.cols(); - const int k = b.rows(); + const unsigned i = y.rows(); + const unsigned j = y.cols(); + const unsigned k = b.rows(); // the following reshape tensors into order 1 or 2 sizes // but they point to the same memory Tensor ta({i*j,k}, xs[0]->v); @@ -249,9 +249,9 @@ void InnerProduct3D_1D::backward_impl(const vector& xs, Tensor& dEdxi) const { auto b = **xs[1]; auto y = *fx; - const int si = y.rows(); - const int sj = y.cols(); - const int sk = b.rows(); + const unsigned si = y.rows(); + const unsigned sj = y.cols(); + const unsigned sk = b.rows(); Tensor tdEdf({si*sj}, dEdf.v); if (i == 0) { // 3-tensor Tensor tdEdxi({si*sj, sk}, dEdxi.v); @@ -385,7 +385,7 @@ void LogSumExp::forward_impl(const vector& xs, Tensor& fx) const } for (unsigned i = 0; i < xs.size(); ++i) static_cast(aux_mem)[i] = (**xs[i])(0,0); - Dim r = {(int)xs.size()}; + Dim r = {(unsigned int)xs.size()}; Tensor v(r, static_cast(aux_mem)); fx.v[0] = logsumexp(*v); } @@ -1031,7 +1031,7 @@ void MatrixMultiply::forward_impl(const vector& xs, Tensor& fx) c } else { // Otherwise, loop over the batches assert(xs[1]->d.bd == 1 || xs[1]->d.bd == xs[0]->d.bd); - for(int b = 0; b < xs[0]->d.bd; ++b) + for(unsigned b = 0; b < xs[0]->d.bd; ++b) fx.batch_matrix(b).noalias() = xs[0]->batch_matrix(b) * xs[1]->batch_matrix(b); } #endif @@ -1149,7 +1149,7 @@ void AffineTransform::forward_impl(const vector& xs, Tensor& fx) if(fx.d.bd > 1 && xs[0]->d.bd == 1) { fx.rowcol_matrix().colwise() = xs[0]->vec(); } else { - for(int b = 0; b < fx.d.bd; ++b) + for(unsigned b = 0; b < fx.d.bd; ++b) fx.batch_matrix(b) = xs[0]->batch_matrix(b); } @@ -1159,7 +1159,7 @@ void AffineTransform::forward_impl(const vector& xs, Tensor& fx) fx.colbatch_matrix().noalias() += **xs[i] * xs[i+1]->colbatch_matrix(); } else { assert(xs[i+1]->d.bd == 1 || xs[i+1]->d.bd == xs[i]->d.bd); - for(int b = 0; b < xs[i]->d.bd; ++b) + for(unsigned b = 0; b < xs[i]->d.bd; ++b) fx.batch_matrix(b).noalias() += xs[i]->batch_matrix(b) * xs[i+1]->batch_matrix(b); } } @@ -1183,7 +1183,7 @@ void AffineTransform::backward_impl(const vector& xs, if(dEdxi.d.bd > 1 && dEdf.d.bd == 1) { dEdxi.rowcol_matrix().colwise() += dEdf.vec(); } else { - for(int b = 0; b < dEdxi.d.bd; ++b) + for(unsigned b = 0; b < dEdxi.d.bd; ++b) dEdxi.batch_matrix(b) += dEdf.batch_matrix(b); } #endif diff --git a/cnn/saxe-init.cc b/cnn/saxe-init.cc index 568a74edb..5a5c2ea2c 100644 --- a/cnn/saxe-init.cc +++ b/cnn/saxe-init.cc @@ -10,7 +10,7 @@ using namespace std; namespace cnn { -void OrthonormalRandom(int dd, float g, Tensor& x) { +void OrthonormalRandom(unsigned dd, float g, Tensor& x) { Tensor t; t.d = Dim({dd, dd}); t.v = new float[dd * dd]; diff --git a/cnn/saxe-init.h b/cnn/saxe-init.h index a71a18763..7d59708e0 100644 --- a/cnn/saxe-init.h +++ b/cnn/saxe-init.h @@ -5,7 +5,7 @@ namespace cnn { struct Tensor; -void OrthonormalRandom(int dim, float g, Tensor& x); +void OrthonormalRandom(unsigned dim, float g, Tensor& x); } diff --git a/cnn/tensor.h b/cnn/tensor.h index 90259f743..62b767542 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -113,7 +113,7 @@ struct Tensor { unsigned bsize = d.batch_size(); Dim new_d = d; new_d.bd = 1; assert (d.batch_elems() >= 0); - for(int b = 0; b < d.batch_elems(); ++b) + for(unsigned b = 0; b < d.batch_elems(); ++b) bs[b] = Tensor(new_d, v + bsize * b); return bs; } diff --git a/examples/encdec.cc b/examples/encdec.cc index fa1f0b81c..4a5bd03ce 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -48,10 +48,10 @@ struct EncoderDecoder { fwd_enc_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { - p_ie2h = model.add_parameters({long(HIDDEN_DIM * LAYERS * 1.5), long(HIDDEN_DIM * LAYERS * 2)}); - p_bie = model.add_parameters({long(HIDDEN_DIM * LAYERS * 1.5)}); - p_h2oe = model.add_parameters({long(HIDDEN_DIM * LAYERS), long(HIDDEN_DIM * LAYERS * 1.5)}); - p_boe = model.add_parameters({long(HIDDEN_DIM * LAYERS)}); + p_ie2h = model.add_parameters({unsigned(HIDDEN_DIM * LAYERS * 1.5), unsigned(HIDDEN_DIM * LAYERS * 2)}); + p_bie = model.add_parameters({unsigned(HIDDEN_DIM * LAYERS * 1.5)}); + p_h2oe = model.add_parameters({unsigned(HIDDEN_DIM * LAYERS), unsigned(HIDDEN_DIM * LAYERS * 1.5)}); + p_boe = model.add_parameters({unsigned(HIDDEN_DIM * LAYERS)}); p_c = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {INPUT_DIM}); p_ec = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {INPUT_DIM}); p_R = model.add_parameters({OUTPUT_VOCAB_SIZE, HIDDEN_DIM}); @@ -91,12 +91,12 @@ struct EncoderDecoder { Expression i_nc = i_boe + i_h2oe * i_h; vector oein1, oein2, oein; - for (int i = 0; i < LAYERS; ++i) { + for (unsigned i = 0; i < LAYERS; ++i) { oein1.push_back(pickrange(i_nc, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM)); oein2.push_back(tanh(oein1[i])); } - for (int i = 0; i < LAYERS; ++i) oein.push_back(oein1[i]); - for (int i = 0; i < LAYERS; ++i) oein.push_back(oein2[i]); + for (unsigned i = 0; i < LAYERS; ++i) oein.push_back(oein1[i]); + for (unsigned i = 0; i < LAYERS; ++i) oein.push_back(oein2[i]); dec_builder.new_graph(cg); dec_builder.start_new_sequence(oein); diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index 21f2615fa..011ea8923 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -107,6 +107,7 @@ struct MLPDurationEmbedding : public DurationEmbedding { struct BinnedDurationEmbedding : public DurationEmbedding { BinnedDurationEmbedding(Model& m, unsigned dim, unsigned num_bins = 8) : max_bin(num_bins - 1) { + assert(num_bins > 0); p_e = m.add_lookup_parameters(num_bins, {dim}); } void new_graph(ComputationGraph& g) override { @@ -118,7 +119,7 @@ struct BinnedDurationEmbedding : public DurationEmbedding { return lookup(*cg, p_e, dur); } ComputationGraph* cg; - int max_bin; + unsigned max_bin; LookupParameters* p_e; }; @@ -539,7 +540,7 @@ double compute_f_score(vector>>& yz_preds, vector> gold; std::set> pred; @@ -585,8 +586,6 @@ int main(int argc, char** argv) { } vector,vector>>> training, dev; string line; - int tlc = 0; - int ttoks = 0; cerr << "Reading training data from " << argv[1] << "...\n"; { ifstream in(argv[1]); From 1155734abbc5d1d6deecfe122c032a2a3ddcff1b Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 21 Nov 2015 11:19:48 -0500 Subject: [PATCH 315/965] Fixed some compile errors on clang --- examples/read-write.cc | 4 ++-- examples/textcat.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/read-write.cc b/examples/read-write.cc index 902eabe26..0723d38f9 100644 --- a/examples/read-write.cc +++ b/examples/read-write.cc @@ -53,7 +53,7 @@ class XORModel { ComputationGraph cg; AddParamsToCG(&cg); - Expression x = cnn::expr::input(cg, {(long)input.size()}, &input); + Expression x = cnn::expr::input(cg, {(unsigned int)input.size()}, &input); Expression y = cnn::expr::input(cg, &gold_output); Expression h = tanh(W*x + b); @@ -69,7 +69,7 @@ class XORModel { ComputationGraph cg; AddParamsToCG(&cg); - Expression x = cnn::expr::input(cg, {(long)input.size()}, &input); + Expression x = cnn::expr::input(cg, {(unsigned int)input.size()}, &input); Expression h = tanh(W*x + b); Expression y_pred = V*h + a; return as_scalar(cg.forward()); diff --git a/examples/textcat.cc b/examples/textcat.cc index aa5380fb8..58790df69 100644 --- a/examples/textcat.cc +++ b/examples/textcat.cc @@ -76,8 +76,8 @@ struct ConvLayer { p_filts[i].resize(out_nfmaps); p_fbias[i].resize(out_nfmaps); for (int j = 0; j < out_nfmaps; ++j) { - p_filts[i][j] = m.add_parameters({in_rows, filter_width}, 0.01); - p_fbias[i][j] = m.add_parameters({in_rows}, 0.05); + p_filts[i][j] = m.add_parameters({(unsigned)in_rows, (unsigned)filter_width}, 0.01); + p_fbias[i][j] = m.add_parameters({(unsigned)in_rows}, 0.05); } } //for (int j = 0; j < out_nfmaps; ++j) From 1b0f5b149b5144ca1cf0774bde0ce3938b10e077 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 21 Nov 2015 13:28:47 -0500 Subject: [PATCH 316/965] command line options to configure cnn memory usage / random seed / etc --- cnn/cuda.cc | 16 ++++++++-------- cnn/init.cc | 46 +++++++++++++++++++++++++++++++++++++++++----- cnn/param-nodes.cc | 9 ++++++++- 3 files changed, 57 insertions(+), 14 deletions(-) diff --git a/cnn/cuda.cc b/cnn/cuda.cc index 35dcbbf85..5423c1dbd 100644 --- a/cnn/cuda.cc +++ b/cnn/cuda.cc @@ -13,7 +13,7 @@ void Initialize_GPU(int& argc, char**& argv) { int nDevices; CUDA_CHECK(cudaGetDeviceCount(&nDevices)); if (nDevices < 1) { - cerr << "No GPUs found, recompile without DENABLE_CUDA=1\n"; + cerr << "[cnn] No GPUs found, recompile without DENABLE_CUDA=1\n"; throw std::runtime_error("No GPUs found but CNN compiled with CUDA support."); } size_t free_bytes, total_bytes, max_free = 0; @@ -21,21 +21,21 @@ void Initialize_GPU(int& argc, char**& argv) { for (int i = 0; i < nDevices; i++) { cudaDeviceProp prop; CUDA_CHECK(cudaGetDeviceProperties(&prop, i)); - cerr << "Device Number: " << i << endl; - cerr << " Device name: " << prop.name << endl; - cerr << " Memory Clock Rate (KHz): " << prop.memoryClockRate << endl; - cerr << " Memory Bus Width (bits): " << prop.memoryBusWidth << endl; - cerr << " Peak Memory Bandwidth (GB/s): " << (2.0*prop.memoryClockRate*(prop.memoryBusWidth/8)/1.0e6) << endl << endl; + cerr << "[cnn] Device Number: " << i << endl; + cerr << "[cnn] Device name: " << prop.name << endl; + cerr << "[cnn] Memory Clock Rate (KHz): " << prop.memoryClockRate << endl; + cerr << "[cnn] Memory Bus Width (bits): " << prop.memoryBusWidth << endl; + cerr << "[cnn] Peak Memory Bandwidth (GB/s): " << (2.0*prop.memoryClockRate*(prop.memoryBusWidth/8)/1.0e6) << endl << endl; CUDA_CHECK(cudaSetDevice(i)); CUDA_CHECK(cudaMemGetInfo( &free_bytes, &total_bytes )); CUDA_CHECK(cudaDeviceReset()); - cerr << " Memory Free (MB): " << (int)free_bytes/1.0e6 << "/" << (int)total_bytes/1.0e6 << endl << endl; + cerr << "[cnn] Memory Free (MB): " << (int)free_bytes/1.0e6 << "/" << (int)total_bytes/1.0e6 << endl << endl; if(free_bytes > max_free) { max_free = free_bytes; selected = i; } } - cerr << "**USING DEVICE: " << selected << endl; + cerr << "[cnn] **USING DEVICE: " << selected << endl; CUDA_CHECK(cudaSetDevice(selected)); CUBLAS_CHECK(cublasCreate(&cublas_handle)); CUBLAS_CHECK(cublasSetPointerMode(cublas_handle, CUBLAS_POINTER_MODE_DEVICE)); diff --git a/cnn/init.cc b/cnn/init.cc index 1bb77ebef..1b99e8625 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -20,11 +20,19 @@ AlignedMemoryPool* fxs = nullptr; AlignedMemoryPool* dEdfs = nullptr; mt19937* rndeng = nullptr; +static void RemoveArgs(int& argc, char**& argv, int& argi, int n) { + for (int i = argi + n; i < argc; ++i) + argv[i - n] = argv[i]; + argc -= n; + assert(argc >= 0); +} + void Initialize(int& argc, char**& argv, unsigned random_seed) { - cerr << "Initializing...\n"; #if HAVE_CUDA + cerr << "[cnn] using GPU\n"; Initialize_GPU(argc, argv); #else + cerr << "[cnn] using CPU\n"; kSCALAR_MINUSONE = (float*) cnn_mm_malloc(sizeof(float), 256); *kSCALAR_MINUSONE = -1; kSCALAR_ONE = (float*) cnn_mm_malloc(sizeof(float), 256); @@ -32,15 +40,43 @@ void Initialize(int& argc, char**& argv, unsigned random_seed) { kSCALAR_ZERO = (float*) cnn_mm_malloc(sizeof(float), 256); *kSCALAR_ZERO = 0; #endif + unsigned long num_mb = 512UL; + int argi = 1; + while(argi < argc) { + string arg = argv[argi]; + if (arg == "--cnn-mem") { + if ((argi + 1) > argc) { + cerr << "[cnn] --cnn-mem expects an argument (the memory, in megabytes, to reserve)\n"; + abort(); + } else { + string a2 = argv[argi+1]; + istringstream c(a2); c >> num_mb; + RemoveArgs(argc, argv, argi, 2); + } + } else if (arg == "--cnn-seed") { + if ((argi + 1) > argc) { + cerr << "[cnn] --cnn-seed expects an argument (the random number seed)\n"; + abort(); + } else { + string a2 = argv[argi+1]; + istringstream c(a2); c >> random_seed; + RemoveArgs(argc, argv, argi, 2); + } + } else if (arg.find("--cnn") == 0) { + cerr << "[cnn] Bad command line argument: " << arg << endl; + abort(); + } else { break; } + } if (random_seed == 0) { random_device rd; random_seed = rd(); } + cerr << "[cnn] random seed: " << random_seed << endl; rndeng = new mt19937(random_seed); - cerr << "Allocating memory...\n"; - fxs = new AlignedMemoryPool(512UL*(1UL<<20)); - dEdfs = new AlignedMemoryPool(512UL*(1UL<<20)); - cerr << "Done.\n"; + cerr << "[cnn] allocating memory: " << num_mb << "MB\n"; + fxs = new AlignedMemoryPool(num_mb << 20); + dEdfs = new AlignedMemoryPool(num_mb << 20); + cerr << "[cnn] memory allocation done.\n"; } } // namespace cnn diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index 175aaa09d..30b244b3e 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -51,7 +51,14 @@ void InputNode::forward_impl(const vector& xs, Tensor& fx) const #if HAVE_CUDA cudaMemcpyAsync(fx.v, &pdata->front(), dim.size() * sizeof(float), cudaMemcpyHostToDevice); #else - memcpy(fx.v, &pdata->front(), dim.size() * sizeof(float)); + // TODO memcpy is only necessary if pdata->front() points to an unaligned location + // need to compute this value + bool is_input_address_aligned = false; + if (!is_input_address_aligned) { + memcpy(fx.v, &pdata->front(), dim.size() * sizeof(float)); + } else { + fx.v = const_cast(&pdata->front()); + } #endif } From 2868a4cfc2339932d35501623556a29ccfa48a27 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 22 Nov 2015 04:58:37 +0900 Subject: [PATCH 317/965] Made batch xor work with GPUs --- cnn/exec.cc | 6 +-- cnn/functors.h | 13 ++++--- cnn/nodes.cc | 92 +++++++++++++++++++++++++++++--------------- cnn/tensor.h | 11 +++++- tests/CMakeLists.txt | 7 +++- 5 files changed, 85 insertions(+), 44 deletions(-) diff --git a/cnn/exec.cc b/cnn/exec.cc index dc7ca6d92..eaffef87c 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -85,7 +85,7 @@ void SimpleExecutionEngine::backward() { void SimpleExecutionEngine::backward(VariableIndex from_where) { assert(from_where+1 <= nfxs.size()); assert(from_where+1 <= cg.nodes.size()); - if (nfxs[from_where].d.batch_size() != 1) { + if (nfxs[from_where].d.size() != 1) { cerr << "backward() called on non-scalar node.\n"; abort(); } @@ -101,9 +101,7 @@ void SimpleExecutionEngine::backward(VariableIndex from_where) { } dEdfs->zero_allocated_memory(); // initialize dE/dE = 1 - auto end = ndEdfs.back().v + nfxs.back().d.size(); - for(auto it = ndEdfs.back().v; it < end; ++it) - *it = 1; + ndEdfs.back().v = kSCALAR_ONE; // here we find constant paths to avoid doing extra work vector needs_derivative(num_nodes, false); diff --git a/cnn/functors.h b/cnn/functors.h index d2221479c..58e21dd8e 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -2,11 +2,14 @@ #define CNN_GPU_FUNCTORS_H #include +#include #if HAVE_CUDA # define CNN_DEVICE_FUNC __device__ +# define CNN_DEVICE_MIN -1.175494351e-38f #else # define CNN_DEVICE_FUNC +# define CNN_DEVICE_MIN CNN_DEVICE_MIN #endif // these functions are used both in CPU and in GPU computation @@ -243,16 +246,16 @@ struct FL2SGDUpdate { struct FBinaryLogLoss { CNN_DEVICE_FUNC inline float operator()(float x, float x_true) const { if (x_true == 1.f) { - if (x == 0.f) x = std::numeric_limits::min(); + if (x == 0.f) x = CNN_DEVICE_MIN; return -1.f * x_true * log(x); } else if (x_true == 0.f) { - if (x == 1.f) x = std::numeric_limits::min(); + if (x == 1.f) x = CNN_DEVICE_MIN; return (x_true - 1.f) * log1p(-x); } else { - if (x == 0.f) x = std::numeric_limits::min(); - if (x == 1.f) x = std::numeric_limits::min(); + if (x == 0.f) x = CNN_DEVICE_MIN; + if (x == 1.f) x = CNN_DEVICE_MIN; return -1.f * (x_true * log(x) + (1.f - x_true) * log1p(-x)); } } @@ -262,7 +265,7 @@ struct FBinaryLogLossBackward { explicit FBinaryLogLossBackward(float d) : d(d) {} CNN_DEVICE_FUNC inline float operator()(float x, float x_true) const { if (x == x_true) return 0; - if (x == 0.f) x = std::numeric_limits::min(); + if (x == 0.f) x = CNN_DEVICE_MIN; if (x == 1.f) x = 0.9999999f; if (x_true == 1.f) { return d * -x_true / x; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 21cab57f3..fe96728e8 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1000,16 +1000,38 @@ void PickRange::backward_impl(const vector& xs, #if HAVE_CUDA inline void CUDAMatrixMultiply(const Tensor& l, const Tensor& r, Tensor& y, const float* acc_scalar) { - if (r.d.ndims() == 1 || r.d.cols() == 1) { - CUBLAS_CHECK(cublasSgemv(cublas_handle, CUBLAS_OP_N, l.d.rows(), l.d.cols(), - kSCALAR_ONE, l.v, l.d.rows(), r.v, 1, acc_scalar, y.v, 1)); - } else { + // if (r.d.ndims() == 1 || r.d.cols() == 1) { + // CUBLAS_CHECK(cublasSgemv(cublas_handle, CUBLAS_OP_N, l.d.rows(), l.d.cols(), + // kSCALAR_ONE, l.v, l.d.rows(), r.v, 1, acc_scalar, y.v, 1)); + // } else { + // CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, + // y.d.rows(), y.d.cols(), l.d.cols(), + // kSCALAR_ONE, + // l.v, l.d.rows(), + // r.v, r.d.rows(), + // acc_scalar, y.v, y.d.rows())); + // } + if(l.d.bd == 1) { + // If the left side has one batch, multiply by columns + // [x, z, b] = [x, y] * [y, z, b] + // -> [x, z*b] = [x, y], [y, z*b] CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, - y.d.rows(), y.d.cols(), l.d.cols(), + y.d.rows(), y.d.cols() * y.d.batch_elems(), l.d.cols(), kSCALAR_ONE, l.v, l.d.rows(), r.v, r.d.rows(), acc_scalar, y.v, y.d.rows())); + } else { + // Otherwise, loop over the batches + assert(r.d.bd == 1 || r.d.bd == l.d.bd); + for(unsigned b = 0; b < l.d.bd; ++b) { + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, + y.d.rows(), y.d.cols(), l.d.cols(), + kSCALAR_ONE, + l.batch_ptr(b), l.d.rows(), + r.batch_ptr(b), r.d.rows(), + acc_scalar, y.batch_ptr(b), y.d.rows())); + } } } #endif @@ -1018,8 +1040,6 @@ void MatrixMultiply::forward_impl(const vector& xs, Tensor& fx) c assert(xs.size() == 2); #if HAVE_CUDA // fx = 0*fx + xs[0] * xs[1] - assert(xs[0]->d.bd == 1); - assert(xs[1]->d.bd == 1); CUDAMatrixMultiply(*xs[0], *xs[1], fx, kSCALAR_ZERO); #else assert(fx.d.bd == max(xs[0]->d.bd, xs[1]->d.bd)); @@ -1043,24 +1063,27 @@ void MatrixMultiply::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i < 2); + int max_b = max(xs[0]->d.bd, xs[1]->d.bd); #if HAVE_CUDA if (i == 0) { - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, - dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), - kSCALAR_ONE, - dEdf.v, dEdf.d.rows(), - xs[1]->v, xs[1]->d.rows(), - kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); + for(int b = 0; b < max_b; ++b) + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, + dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), + kSCALAR_ONE, + dEdf.batch_ptr(b), dEdf.d.rows(), + xs[1]->batch_ptr(b), xs[1]->d.rows(), + kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); } else { - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, - dEdxi.d.rows(), dEdxi.d.cols(), xs[0]->d.rows(), - kSCALAR_ONE, - xs[0]->v, xs[0]->d.rows(), - dEdf.v, xs[0]->d.rows(), - kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); + // TODO: Fix this to share + for(int b = 0; b < max_b; ++b) + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, + dEdxi.d.rows(), dEdxi.d.cols(), xs[0]->d.rows(), + kSCALAR_ONE, + xs[0]->batch_ptr(b), xs[0]->d.rows(), + dEdf.batch_ptr(b), xs[0]->d.rows(), + kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); } #else - int max_b = max(xs[0]->d.bd, xs[1]->d.bd); if (i == 0) { for(int b = 0; b < max_b; ++b) dEdxi.batch_matrix(b).noalias() += dEdf.batch_matrix(b) * xs[1]->batch_matrix(b).transpose(); @@ -1142,6 +1165,8 @@ void AffineTransform::forward_impl(const vector& xs, Tensor& fx) for (unsigned i = 1; i < xs.size(); i += 2) // fx = (acc_sclar)*fx + xs[0] * xs[1] CUDAMatrixMultiply(*xs[i], *xs[i + 1], fx, (i == 1) ? kSCALAR_ZERO : kSCALAR_ONE); + assert(fx.d.bd == 1); + assert(xs[0]->d.bd == 1); CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v, 1, fx.v, 1)); #else assert(fx.d.bd == 1); @@ -1190,12 +1215,13 @@ void AffineTransform::backward_impl(const vector& xs, } else if (i % 2 == 1) { // left argument of matrix multiply int max_b = max(dEdf.d.bd, xs[i+1]->d.bd); #if HAVE_CUDA - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, - dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), - kSCALAR_ONE, - dEdf.v, dEdf.d.rows(), - xs[i+1]->v, xs[i+1]->d.rows(), - kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); + for(int b = 0; b < max_b; ++b) + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, + dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), + kSCALAR_ONE, + dEdf.batch_ptr(b), dEdf.d.rows(), + xs[i+1]->batch_ptr(b), xs[i+1]->d.rows(), + kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); #else for(int b = 0; b < max_b; ++b) dEdxi.batch_matrix(b).noalias() += dEdf.batch_matrix(b) * xs[i+1]->batch_matrix(b).transpose(); @@ -1203,12 +1229,14 @@ void AffineTransform::backward_impl(const vector& xs, } else { // right argument of matrix multiply int max_b = max(xs[i-1]->d.bd, dEdf.d.bd); #if HAVE_CUDA - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, - dEdxi.d.rows(), dEdxi.d.cols(), xs[i-1]->d.rows(), - kSCALAR_ONE, - xs[i-1]->v, xs[i-1]->d.rows(), - dEdf.v, xs[i-1]->d.rows(), - kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); + // TODO: Add reverse + for(int b = 0; b < max_b; ++b) + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, + dEdxi.d.rows(), dEdxi.d.cols(), xs[i-1]->d.rows(), + kSCALAR_ONE, + xs[i-1]->batch_ptr(b), xs[i-1]->d.rows(), + dEdf.batch_ptr(b), xs[i-1]->d.rows(), + kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); #else if(xs[i-1]->d.bd == 1) { dEdxi.colbatch_matrix().noalias() += (**xs[i-1]).transpose() * dEdf.colbatch_matrix(); diff --git a/cnn/tensor.h b/cnn/tensor.h index 62b767542..329bd494b 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -49,13 +49,20 @@ struct Tensor { Eigen::Map vec() { return Eigen::Map(v, d.size()); } + // Get the pointer for a particular batch, automatically broadcasting if the size is zero + const float* batch_ptr(unsigned bid) const { + assert(d.bd == 1 || bid < d.bd); + return v + (bid%d.bd)*d.batch_size(); + } + float* batch_ptr(unsigned bid) { + assert(d.bd == 1 || bid < d.bd); + return v + (bid%d.bd)*d.batch_size(); + } // Get the matrix for a particular batch, automatically broadcasting if the size is zero const Eigen::Map batch_matrix(unsigned bid) const { - assert(d.bd == 1 || bid < d.bd); return Eigen::Map(v + (bid%d.bd)*d.batch_size(), d.rows(), d.cols()); } Eigen::Map batch_matrix(unsigned bid) { - assert(d.bd == 1 || bid < d.bd); return Eigen::Map(v + (bid%d.bd)*d.batch_size(), d.rows(), d.cols()); } // Get the data as a matrix, where each "row" is the concatenation of rows and columns, diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index c74ed33e7..37275da2e 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -6,9 +6,14 @@ include_directories (${TEST_SOURCE_DIR}/src add_definitions (-DBOOST_TEST_DYN_LINK) add_executable (test-cnn test-cnn.cc) - target_link_libraries (test-cnn cnn ${LIBS} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ) +if (WITH_CUDA_BACKEND) + add_dependencies(test-cnn cnncuda) + target_link_libraries(test-cnn cnncuda) + CUDA_ADD_CUBLAS_TO_TARGET(test-cnn) +endif (WITH_CUDA_BACKEND) + add_test(test-cnn test-cnn) From eec52683916d063a14e8d111ce21254f90bf9278 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 21 Nov 2015 16:29:40 -0500 Subject: [PATCH 318/965] fix warning --- cnn/fast-lstm.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/fast-lstm.h b/cnn/fast-lstm.h index 96a83a810..eb860d167 100644 --- a/cnn/fast-lstm.h +++ b/cnn/fast-lstm.h @@ -30,8 +30,8 @@ struct FastLSTMBuilder : public RNNBuilder { } unsigned num_h0_components() const override { return 2 * layers; } - std::vector get_h(RNNPointer i) const { return (i == -1 ? h0 : h[i]); } - std::vector get_s(RNNPointer i) const { + std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } + std::vector get_s(RNNPointer i) const override { std::vector ret = (i == -1 ? c0 : c[i]); for(auto my_h : get_h(i)) ret.push_back(my_h); return ret; From 205bbc4e3034033166cdd78f8abe79174621d5c7 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 21 Nov 2015 18:07:12 -0500 Subject: [PATCH 319/965] hierarchical softmax support (not tested yet) --- cnn/CMakeLists.txt | 2 ++ cnn/hsm-builder.cc | 90 ++++++++++++++++++++++++++++++++++++++++++++++ cnn/hsm-builder.h | 65 +++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+) create mode 100644 cnn/hsm-builder.cc create mode 100644 cnn/hsm-builder.h diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 7397c16d3..9069c1f16 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -12,6 +12,7 @@ set(cnn_library_SRCS grad-check.cc graph.cc gru.cc + hsm-builder.cc init.cc lstm.cc model.cc @@ -44,6 +45,7 @@ set(cnn_library_HDRS gpu-ops.h graph.h gru.h + hsm-builder.h init.h lstm.h model.h diff --git a/cnn/hsm-builder.cc b/cnn/hsm-builder.cc new file mode 100644 index 000000000..a139750a7 --- /dev/null +++ b/cnn/hsm-builder.cc @@ -0,0 +1,90 @@ +#include "cnn/hsm-builder.h" + +#include +#include + +using namespace std; + +namespace cnn { + +using namespace expr; + +HierarchicalSoftmaxBuilder::HierarchicalSoftmaxBuilder(unsigned rep_dim, + const std::string& cluster_file, + Dict* word_dict, + Model* model) { + ReadClusterFile(cluster_file, word_dict); + const unsigned num_clusters = cdict.size(); + p_r2c = model->add_parameters({num_clusters, rep_dim}); + p_cbias = model->add_parameters({num_clusters}); + p_rc2ws.resize(num_clusters); + p_rcwbiases.resize(num_clusters); + for (unsigned i = 0; i < num_clusters; ++i) { + auto& words = cidx2words[i]; // vector of word ids + const unsigned num_words_in_cluster = words.size(); + p_rc2ws[i] = model->add_parameters({num_words_in_cluster, rep_dim}); + p_rcwbiases[i] = model->add_parameters({num_words_in_cluster}); + } +} + +void HierarchicalSoftmaxBuilder::new_graph(ComputationGraph& cg) { + pcg = &cg; + const unsigned num_clusters = cdict.size(); + r2c = parameter(cg, p_r2c); + cbias = parameter(cg, p_cbias); + rc2ws.resize(num_clusters); + rc2biases.resize(num_clusters); +} + +Expression HierarchicalSoftmaxBuilder::neg_log_softmax(const Expression& rep, unsigned wordidx) { + int clusteridx = widx2cidx[wordidx]; + assert(clusteridx >= 0); // if this fails, wordid is missing from clusters + unsigned wordrow = widx2cwidx[wordidx]; + Expression cscores = affine_transform({cbias, r2c, rep}); + Expression cnlp = pickneglogsoftmax(cscores, clusteridx); + Expression& cwbias = get_rc2wbias(clusteridx); + Expression& r2cw = get_rc2w(clusteridx); + Expression wscores = affine_transform({cwbias, r2cw, rep}); + Expression wnlp = pickneglogsoftmax(wscores, wordrow); + return cnlp + wnlp; +} + +inline bool is_ws(char x) { return (x == ' ' || x == '\t'); } +inline bool not_ws(char x) { return (x != ' ' && x != '\t'); } + +void HierarchicalSoftmaxBuilder::ReadClusterFile(const std::string& cluster_file, Dict* word_dict) { + cerr << "Reading clusters from " << cluster_file << " ...\n"; + ifstream in(cluster_file); + assert(in); + int wc = 0; + string line; + while(getline(in, line)) { + ++wc; + const unsigned len = line.size(); + unsigned startc = 0; + while (is_ws(line[startc]) && startc < len) { ++startc; } + unsigned endc = startc; + while (not_ws(line[endc]) && endc < len) { ++endc; } + unsigned startw = endc; + while (is_ws(line[startw]) && startw < len) { ++startw; } + unsigned endw = startw; + while (not_ws(line[endw]) && endw < len) { ++endw; } + assert(endc > startc); + assert(startw > endc); + assert(endw > startw); + unsigned c = cdict.Convert(line.substr(startc, endc - startc)); + unsigned word = word_dict->Convert(line.substr(startw, endw - startw)); + if (word >= widx2cidx.size()) { + widx2cidx.resize(word + 1, -1); + widx2cwidx.resize(word + 1); + } + widx2cidx[word] = c; + if (c >= cidx2words.size()) cidx2words.resize(c + 1); + auto& clusterwords = cidx2words[c]; + widx2cwidx[word] = clusterwords.size(); + clusterwords.push_back(word); + } + cerr << "Read " << wc << " words in " << cdict.size() << " clusters\n"; +} + +} // namespace cnn diff --git a/cnn/hsm-builder.h b/cnn/hsm-builder.h new file mode 100644 index 000000000..0ce46bbc2 --- /dev/null +++ b/cnn/hsm-builder.h @@ -0,0 +1,65 @@ +#ifndef CNN_HSMBUILDER_H +#define CNN_HSMBUILDER_H + +#include +#include +#include "cnn/cnn.h" +#include "cnn/expr.h" +#include "cnn/dict.h" + +namespace cnn { + +struct Parameters; + +// helps with implementation of hierarchical softmax +// read a file with lines of the following format +// CLASSID word [freq] +class HierarchicalSoftmaxBuilder { + public: + HierarchicalSoftmaxBuilder(unsigned rep_dim, + const std::string& cluster_file, + Dict* word_dict, + Model* model); + + // call this once per ComputationGraph + void new_graph(ComputationGraph& cg); + + // -log(p(c | rep) * p(w | c, rep)) + expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx); + + private: + void ReadClusterFile(const std::string& cluster_file, Dict* word_dict); + Dict cdict; + std::vector widx2cidx; // will be -1 if not present + std::vector widx2cwidx; // word index to word index inside of cluster + std::vector> cidx2words; + + // parameters + Parameters* p_r2c; + Parameters* p_cbias; + std::vector p_rc2ws; // len = number of classes + std::vector p_rcwbiases; // len = number of classes + + // Expressions for current graph + inline expr::Expression& get_rc2w(unsigned cluster_idx) { + expr::Expression& e = rc2ws[cluster_idx]; + if (!e.pg) + e = expr::parameter(*pcg, p_rc2ws[cluster_idx]); + return e; + } + inline expr::Expression& get_rc2wbias(unsigned cluster_idx) { + expr::Expression& e = rc2biases[cluster_idx]; + if (!e.pg) + e = expr::parameter(*pcg, p_rcwbiases[cluster_idx]); + return e; + } + ComputationGraph* pcg; + expr::Expression r2c; + expr::Expression cbias; + std::vector rc2ws; + std::vector rc2biases; +}; + +} // namespace cnn + +#endif From a302533fc52067663845433f90bcf3ac8a17ca73 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 22 Nov 2015 00:44:39 -0500 Subject: [PATCH 320/965] hierarchical softmax --- cnn/hsm-builder.cc | 16 +- cnn/hsm-builder.h | 1 + examples/CMakeLists.txt | 2 +- examples/example-data/clusters-hsm.txt | 3120 ++++++++++++++++++++++++ examples/example-data/dev-hsm.txt | 10 + examples/example-data/train-hsm.txt | 1000 ++++++++ examples/rnnlm-hsm.cc | 230 ++ 7 files changed, 4376 insertions(+), 3 deletions(-) create mode 100644 examples/example-data/clusters-hsm.txt create mode 100644 examples/example-data/dev-hsm.txt create mode 100644 examples/example-data/train-hsm.txt create mode 100644 examples/rnnlm-hsm.cc diff --git a/cnn/hsm-builder.cc b/cnn/hsm-builder.cc index a139750a7..1fabd225b 100644 --- a/cnn/hsm-builder.cc +++ b/cnn/hsm-builder.cc @@ -32,6 +32,8 @@ void HierarchicalSoftmaxBuilder::new_graph(ComputationGraph& cg) { const unsigned num_clusters = cdict.size(); r2c = parameter(cg, p_r2c); cbias = parameter(cg, p_cbias); + rc2ws.clear(); + rc2biases.clear(); rc2ws.resize(num_clusters); rc2biases.resize(num_clusters); } @@ -39,9 +41,12 @@ void HierarchicalSoftmaxBuilder::new_graph(ComputationGraph& cg) { Expression HierarchicalSoftmaxBuilder::neg_log_softmax(const Expression& rep, unsigned wordidx) { int clusteridx = widx2cidx[wordidx]; assert(clusteridx >= 0); // if this fails, wordid is missing from clusters - unsigned wordrow = widx2cwidx[wordidx]; Expression cscores = affine_transform({cbias, r2c, rep}); Expression cnlp = pickneglogsoftmax(cscores, clusteridx); + if (singleton_cluster[clusteridx]) return cnlp; + // if there is only one word in the cluster, just return -log p(class | rep) + // otherwise predict word too + unsigned wordrow = widx2cwidx[wordidx]; Expression& cwbias = get_rc2wbias(clusteridx); Expression& r2cw = get_rc2w(clusteridx); Expression wscores = affine_transform({cwbias, r2cw, rep}); @@ -84,7 +89,14 @@ void HierarchicalSoftmaxBuilder::ReadClusterFile(const std::string& cluster_file widx2cwidx[word] = clusterwords.size(); clusterwords.push_back(word); } - cerr << "Read " << wc << " words in " << cdict.size() << " clusters\n"; + singleton_cluster.resize(cidx2words.size()); + int scs = 0; + for (unsigned i = 0; i < cidx2words.size(); ++i) { + bool sc = cidx2words[i].size() <= 1; + if (sc) scs++; + singleton_cluster[i] = sc; + } + cerr << "Read " << wc << " words in " << cdict.size() << " clusters (" << scs << " singleton clusters)\n"; } } // namespace cnn diff --git a/cnn/hsm-builder.h b/cnn/hsm-builder.h index 0ce46bbc2..c0eb4f420 100644 --- a/cnn/hsm-builder.h +++ b/cnn/hsm-builder.h @@ -33,6 +33,7 @@ class HierarchicalSoftmaxBuilder { std::vector widx2cidx; // will be -1 if not present std::vector widx2cwidx; // word index to word index inside of cluster std::vector> cidx2words; + std::vector singleton_cluster; // does cluster contain a single word type? // parameters Parameters* p_r2c; diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index fa56bb2a9..2c618b386 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-batch nlm textcat rnnlm2 mp read-write) +foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-hsm rnnlm-batch nlm textcat rnnlm2 mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) diff --git a/examples/example-data/clusters-hsm.txt b/examples/example-data/clusters-hsm.txt new file mode 100644 index 000000000..b55cbad90 --- /dev/null +++ b/examples/example-data/clusters-hsm.txt @@ -0,0 +1,3120 @@ +SPECIAL 1 +00000 stewardess 5 +00000 combination 5 +00000 sudden 5 +00000 poisonous 5 +00000 calendar 5 +00000 lag 5 +00000 fond 5 +00000 pickpocket 5 +00000 flush 5 +00000 instructor 5 +00000 sense 5 +00000 aware 5 +00000 brooch 5 +00000 carbonated 5 +00000 estimate 5 +00000 wise 5 +00000 specialist 6 +00000 pick- 6 +00000 sterling 6 +00000 english- 6 +00000 assortment 6 +00000 insect 6 +00000 carafe 7 +00000 drop- 7 +00000 hangover 7 +00000 nurse 7 +00000 manicure 7 +00000 aperitif 7 +00000 injection 7 +00000 loss 8 +00000 professional 8 +00000 robber 8 +00000 bite 8 +00000 station- 8 +00000 graduate 8 +00000 scratch 8 +00000 appetizer 9 +00000 ounce 9 +00000 cheeseburger 9 +00000 guidebook 9 +00000 travelers 10 +00000 napkin 10 +00000 severe 11 +00000 member 11 +00000 collection 11 +00000 figure 12 +00000 slight 13 +00000 favor 13 +00000 toothache 14 +00000 person- 15 +00000 token 15 +00000 slice 15 +00000 inch 16 +00000 long- 16 +00000 guarantee 16 +00000 choice 16 +00000 stranger 16 +00000 haircut 17 +00000 pillow 18 +00000 carton 19 +00000 couple 22 +00000 pot 22 +00000 quarter 25 +00000 pack 26 +00000 copy 27 +00000 piece 28 +00000 ambulance 28 +00000 roll 28 +00000 pound 30 +00000 wake- 33 +00000 worry 33 +00000 blanket 40 +00000 cup 45 +00000 collect 52 +00000 minute 55 +00000 bit 68 +00000 pair 70 +00000 bottle 76 +00000 glass 90 +00000 understand 91 +00000 few 112 +00000 lot 115 +00000 drink 124 +00000 mind 132 +00000 little 312 +00000 know 415 +00001 everywhere 5 +00001 wood 5 +00001 wheel 5 +00001 literature 5 +00001 cosmetic 5 +00001 left- 5 +00001 botanical 5 +00001 consumers 5 +00001 sweaters 5 +00001 languages 5 +00001 sweets 5 +00001 yogurt 5 +00001 buddhist 5 +00001 ikeda 5 +00001 passing 5 +00001 dent 5 +00001 alligator 5 +00001 carnegie 5 +00001 midtown 5 +00001 snacks 5 +00001 jumper 5 +00001 cat 5 +00001 coaster 5 +00001 drops 5 +00001 picnic 5 +00001 buildings 5 +00001 action 5 +00001 pickled 5 +00001 the- 5 +00001 oka 5 +00001 forks 5 +00001 coral 5 +00001 refunds 5 +00001 manufacturer 5 +00001 blossom 5 +00001 amusement 5 +00001 rings 5 +00001 cocktails 5 +00001 sites 5 +00001 cleansing 5 +00001 daylight 5 +00001 stockings 5 +00001 culture 5 +00001 handbags 5 +00001 artificial 5 +00001 scenic 5 +00001 cherries 5 +00001 peanuts 5 +00001 turbulence 5 +00001 bear 5 +00001 packed 5 +00001 surprise 5 +00001 pancakes 5 +00001 miso 5 +00001 official 5 +00001 gourmet 5 +00001 landmarks 5 +00001 older 5 +00001 t 5 +00001 chop 5 +00001 colour 5 +00001 indian 5 +00001 moon 5 +00001 trips 5 +00001 cleaning 5 +00001 performed 5 +00001 crab 5 +00001 basketball 5 +00001 hand- 5 +00001 artists 5 +00001 flakes 5 +00001 discounted 5 +00001 wild 5 +00001 death 5 +00001 pickles 5 +00001 graduation 5 +00001 garlic 5 +00001 tackle 5 +00001 shaving 5 +00001 port 5 +00001 brush 5 +00001 oysters 5 +00001 liability 5 +00001 pop 5 +00001 ink 5 +00001 yankees 5 +00001 pain- 5 +00001 darker 5 +00001 reduction 6 +00001 nylon 6 +00001 emperor 6 +00001 disease 6 +00001 cap 6 +00001 singapore 6 +00001 attack 6 +00001 weak 6 +00001 gear 6 +00001 excess 6 +00001 marketing 6 +00001 supplement 6 +00001 senior 6 +00001 junior 6 +00001 spray 6 +00001 similar 6 +00001 beers 6 +00001 r 6 +00001 entry 6 +00001 continental 6 +00001 nakamura 6 +00001 quartz 6 +00001 toothpaste 6 +00001 premium 6 +00001 support 6 +00001 canyon 6 +00001 packing 6 +00001 soft- 6 +00001 luck 6 +00001 story 6 +00001 wet 6 +00001 greeting 6 +00001 veal 6 +00001 bay 6 +00001 turkey 6 +00001 cookies 6 +00001 ramen 6 +00001 opener 6 +00001 dolls 6 +00001 buddhism 6 +00001 average 6 +00001 gloves 6 +00001 friendly 6 +00001 heel 6 +00001 western 6 +00001 historic 6 +00001 temple 6 +00001 rubber 6 +00001 st. 6 +00001 plugs 6 +00001 cities 6 +00001 narrow 6 +00001 plants 6 +00001 shaver 6 +00001 waste 6 +00001 attractive 6 +00001 higher 6 +00001 gum 6 +00001 vacancy 6 +00001 parlor 6 +00001 electronics 6 +00001 power 6 +00001 boats 6 +00001 shipping 6 +00001 pins 6 +00001 rich 6 +00001 cooked 6 +00001 plum 6 +00001 fancy 6 +00001 economic 6 +00001 enjoyable 6 +00001 closing 6 +00001 cubes 6 +00001 grapes 6 +00001 sunburn 6 +00001 monuments 6 +00001 tuition 6 +00001 bandage 6 +00001 candy 7 +00001 vitamins 7 +00001 springs 7 +00001 honey 7 +00001 smooth 7 +00001 fair 7 +00001 smoked 7 +00001 ogawa 7 +00001 deluxe 7 +00001 scarf 7 +00001 yoshida 7 +00001 tent 7 +00001 corn 7 +00001 weekly 7 +00001 indigestion 7 +00001 gray 7 +00001 changes 7 +00001 sunglasses 7 +00001 portable 7 +00001 envelopes 7 +00001 cases 7 +00001 genuine 7 +00001 permit 7 +00001 note 7 +00001 humid 7 +00001 dresses 7 +00001 toothbrush 7 +00001 tonic 7 +00001 camping 7 +00001 medication 7 +00001 priced 7 +00001 x 7 +00001 roller 7 +00001 presents 7 +00001 sisters 7 +00001 abbey 7 +00001 president 7 +00001 stronger 7 +00001 setting 7 +00001 checkout 7 +00001 sole 7 +00001 annual 7 +00001 gasoline 7 +00001 fall 7 +00001 cola 7 +00001 shrines 7 +00001 sandals 7 +00001 ancient 7 +00001 exact 7 +00001 all- 7 +00001 demand 7 +00001 s- 7 +00001 shadow 7 +00001 toys 7 +00001 taxis 7 +00001 breakable 7 +00001 drawing 7 +00001 bathing 7 +00001 necessities 7 +00001 cats 7 +00001 woman 7 +00001 domestic 7 +00001 income 7 +00001 cds 7 +00001 simple 7 +00001 strawberry 7 +00001 tobacco 7 +00001 example 7 +00001 commission 8 +00001 waterproof 8 +00001 socks 8 +00001 grill 8 +00001 unusual 8 +00001 vanilla 8 +00001 transmission 8 +00001 lamb 8 +00001 apples 8 +00001 sirloin 8 +00001 manual 8 +00001 stiff 8 +00001 excursion 8 +00001 thick 8 +00001 y 8 +00001 midnight 8 +00001 suitable 8 +00001 services 8 +00001 harada 8 +00001 appetizers 8 +00001 sherry 8 +00001 maintenance 8 +00001 chills 8 +00001 ale 8 +00001 memorial 8 +00001 pipe 8 +00001 fountain 8 +00001 diamond 8 +00001 living 8 +00001 mixed 8 +00001 okada 8 +00001 tap 8 +00001 captain 8 +00001 trading 8 +00001 cone 8 +00001 vegetable 8 +00001 temples 8 +00001 god 8 +00001 vacancies 8 +00001 valuable 8 +00001 tofu 8 +00001 voltage 8 +00001 plays 8 +00001 drier 8 +00001 coach 8 +00001 slide 8 +00001 lobster 8 +00001 relish 8 +00001 fruits 8 +00001 pamphlets 8 +00001 wrestling 8 +00001 advice 8 +00001 normal 8 +00001 custom 8 +00001 cologne 8 +00001 jewelry 9 +00001 legs 9 +00001 rough 9 +00001 messages 9 +00001 coverage 9 +00001 cakes 9 +00001 golden 9 +00001 reading 9 +00001 liquor 9 +00001 gin 9 +00001 ties 9 +00001 grey 9 +00001 landing 9 +00001 pencil 9 +00001 g 9 +00001 quick 9 +00001 noise 9 +00001 specials 9 +00001 flu 9 +00001 u 9 +00001 safe- 9 +00001 sausage 9 +00001 exercise 9 +00001 mild 9 +00001 assistance 9 +00001 banks 9 +00001 kobayashi 9 +00001 airsickness 9 +00001 difficulty 9 +00001 noodles 9 +00001 ferry 9 +00001 sliced 9 +00001 sherbet 9 +00001 low- 9 +00001 yamamoto 9 +00001 honest 9 +00001 chili 9 +00001 oranges 9 +00001 brandy 9 +00001 girls 10 +00001 champagne 10 +00001 schools 10 +00001 courts 10 +00001 lettuce 10 +00001 notice 10 +00001 thief 10 +00001 iron 10 +00001 historical 10 +00001 concerts 10 +00001 electronic 10 +00001 complete 10 +00001 grilled 10 +00001 bourbon 10 +00001 vegetarian 10 +00001 hair- 10 +00001 overnight 10 +00001 modern 10 +00001 alterations 10 +00001 jam 10 +00001 jack 10 +00001 cancellation 10 +00001 martini 10 +00001 usual 10 +00001 burger 10 +00001 funny 10 +00001 shave 10 +00001 sight 10 +00001 airways 10 +00001 blossoms 10 +00001 courses 11 +00001 upper 11 +00001 tourists 11 +00001 colorful 11 +00001 throbbing 11 +00001 king 11 +00001 empty 11 +00001 super 11 +00001 security 11 +00001 powder 11 +00001 prices 11 +00001 unique 11 +00001 writing 11 +00001 younger 11 +00001 identification 11 +00001 standing 11 +00001 practice 11 +00001 space 11 +00001 draft 11 +00001 research 11 +00001 kimura 11 +00001 shake 11 +00001 spicy 11 +00001 mori 11 +00001 soccer 11 +00001 second- 11 +00001 supper 11 +00001 filter 11 +00001 flowers 11 +00001 mile 12 +00001 medium- 12 +00001 thin 12 +00001 damage 12 +00001 kimono 12 +00001 sushi 12 +00001 skis 12 +00001 full- 12 +00001 casual 12 +00001 jeans 12 +00001 bell 12 +00001 diarrhea 12 +00001 heart 12 +00001 christmas 12 +00001 opening 12 +00001 massage 12 +00001 lovely 12 +00001 news 12 +00001 pork 12 +00001 ache 12 +00001 drinking 12 +00001 perm 12 +00001 stomachache 12 +00001 collision 12 +00001 typical 12 +00001 discounts 12 +00001 upset 13 +00001 serving 13 +00001 lessons 13 +00001 matinee 13 +00001 la 13 +00001 wedding 13 +00001 onion 13 +00001 cake 13 +00001 soda 13 +00001 stuff 13 +00001 shrimp 13 +00001 magazines 13 +00001 bargain 13 +00001 bone 13 +00001 further 13 +00001 aspirin 13 +00001 spare 13 +00001 fat 13 +00001 letters 14 +00001 daily 14 +00001 games 14 +00001 operation 14 +00001 yours 14 +00001 dull 14 +00001 electric 14 +00001 cotton 14 +00001 self- 14 +00001 dryer 14 +00001 trees 14 +00001 experience 14 +00001 lesson 14 +00001 rock 14 +00001 suits 14 +00001 following 14 +00001 orchestra 14 +00001 liberty 14 +00001 yellow 14 +00001 sized 14 +00001 baby 14 +00001 delta 14 +00001 pie 14 +00001 interest 15 +00001 sharp 15 +00001 comfortable 15 +00001 ray 15 +00001 fixed 15 +00001 private 15 +00001 tape 15 +00001 south 15 +00001 balcony 15 +00001 admission 15 +00001 pure 15 +00001 x- 15 +00001 poor 15 +00001 problems 15 +00001 events 15 +00001 jazz 15 +00001 lemon 15 +00001 lighter 15 +00001 plastic 15 +00001 alcohol 15 +00001 filling 15 +00001 formal 16 +00001 terrible 16 +00001 chips 16 +00001 particular 16 +00001 chocolate 16 +00001 beauty 16 +00001 urgent 16 +00001 language 16 +00001 butter 16 +00001 appetite 16 +00001 cigarette 16 +00001 traditional 16 +00001 garden 16 +00001 vegetables 16 +00001 mileage 16 +00001 computer 16 +00001 inexpensive 16 +00001 consulate 16 +00001 tall 16 +00001 spots 16 +00001 john 16 +00001 stamp 16 +00001 silk 16 +00001 girl 16 +00001 perfect 16 +00001 words 16 +00001 sandwiches 17 +00001 cherry 17 +00001 pump 17 +00001 vacant 17 +00001 natural 17 +00001 college 17 +00001 towels 17 +00001 treatment 17 +00001 changing 17 +00001 lens 17 +00001 baked 18 +00001 reasonable 18 +00001 id 18 +00001 winter 18 +00001 potato 18 +00001 lotion 18 +00001 scotch 18 +00001 wide 18 +00001 government 18 +00001 tables 18 +00001 sake 18 +00001 questions 18 +00001 waiter 18 +00001 clubs 19 +00001 lake 19 +00001 snack 19 +00001 shot 19 +00001 serious 19 +00001 pizza 19 +00001 parking 19 +00001 dog 19 +00001 pepper 19 +00001 chance 19 +00001 deal 19 +00001 cough 19 +00001 skiing 19 +00001 cover 20 +00001 egg 20 +00001 raw 20 +00001 nail 20 +00001 others 20 +00001 shirts 20 +00001 newspaper 20 +00001 pills 20 +00001 medical 21 +00001 lipstick 21 +00001 major 21 +00001 driving 21 +00001 economy 21 +00001 students 21 +00001 half- 21 +00001 boots 21 +00001 north 21 +00001 shorter 21 +00001 convenient 21 +00001 flat 21 +00001 strange 21 +00001 round- 21 +00001 wall 21 +00001 gold 21 +00001 t- 21 +00001 soft 21 +00001 hamburger 21 +00001 british 21 +00001 bacon 21 +00001 coke 22 +00001 fishing 22 +00001 general 22 +00001 rare 22 +00001 towel 22 +00001 important 22 +00001 passengers 22 +00001 potatoes 22 +00001 gifts 22 +00001 apple 23 +00001 chinese 23 +00001 snow 23 +00001 holidays 23 +00001 soap 23 +00001 permanent 23 +00001 ketchup 23 +00001 plate 23 +00001 sauce 23 +00001 ski 24 +00001 life 24 +00001 fresh 24 +00001 c 24 +00001 tax- 24 +00001 whiskey 24 +00001 whisky 24 +00001 holiday 24 +00001 products 24 +00001 compact 24 +00001 seafood 24 +00001 dark 25 +00001 women 25 +00001 fries 25 +00001 weight 25 +00001 swimming 25 +00001 oil 25 +00001 dressing 25 +00001 correct 25 +00001 sports 25 +00001 diet 25 +00001 land 25 +00001 taste 26 +00001 ocean 26 +00001 real 26 +00001 loose 26 +00001 bigger 26 +00001 souvenirs 26 +00001 earlier 27 +00001 italian 27 +00001 plans 27 +00001 sandwich 27 +00001 low 27 +00001 sweet 27 +00001 salt 27 +00001 boiled 27 +00001 duty 28 +00001 equipment 28 +00001 delivery 28 +00001 sato 29 +00001 embassy 29 +00001 boy 29 +00001 vacation 29 +00001 strong 29 +00001 toast 29 +00001 stock 29 +00001 student 29 +00001 rental 29 +00001 medium 29 +00001 colors 30 +00001 b 30 +00001 cheap 30 +00001 public 31 +00001 postage 31 +00001 rain 31 +00001 dishes 31 +00001 sleeping 31 +00001 buses 31 +00001 health 31 +00001 perfume 31 +00001 foreign 32 +00001 japanese- 32 +00001 grand 32 +00001 fun 32 +00001 eye 32 +00001 face 32 +00001 hotels 33 +00001 sales 33 +00001 rice 33 +00001 court 33 +00001 sugar 34 +00001 flights 34 +00001 quiet 34 +00001 ham 34 +00001 automatic 34 +00001 national 35 +00001 fever 35 +00001 tip 35 +00001 cars 36 +00001 direct 36 +00001 heavy 36 +00001 club 36 +00001 movies 37 +00001 young 37 +00001 mustard 37 +00001 idea 38 +00001 diving 38 +00001 bread 38 +00001 summer 38 +00001 headache 39 +00001 coins 39 +00001 yamada 39 +00001 fruit 39 +00001 baseball 39 +00001 wonderful 40 +00001 safety 41 +00001 drinks 41 +00001 fax 41 +00001 beef 42 +00001 present 42 +00001 goods 42 +00001 books 42 +00001 ladies 43 +00001 sea 43 +00001 famous 43 +00001 soup 43 +00001 less 43 +00001 overseas 44 +00001 regular 44 +00001 mine 44 +00001 milk 44 +00001 restaurants 45 +00001 items 45 +00001 meals 45 +00001 cigarettes 45 +00001 visa 46 +00001 travel 46 +00001 chicken 46 +00001 meat 46 +00001 short 47 +00001 tight 47 +00001 safe 47 +00001 tv 47 +00001 smaller 48 +00001 dessert 48 +00001 operator 48 +00001 dry 48 +00001 suzuki 49 +00001 avenue 49 +00001 shampoo 50 +00001 suit 51 +00001 interesting 51 +00001 hand 51 +00001 trouble 52 +00001 central 52 +00001 united 52 +00001 refund 52 +00001 personal 53 +00001 license 53 +00001 brown 53 +00001 double 53 +00001 customs 54 +00001 art 54 +00001 cheese 54 +00001 black 55 +00001 included 56 +00001 gas 56 +00001 leather 56 +00001 shower 56 +00001 music 57 +00001 mistake 58 +00001 golf 58 +00001 friends 58 +00001 eggs 59 +00001 problem 59 +00001 hard 60 +00001 view 60 +00001 tennis 61 +00001 blue 61 +00001 man 63 +00001 children 63 +00001 twin 65 +00001 deposit 66 +00001 school 66 +00001 bed 67 +00001 set 70 +00001 french 70 +00001 tours 70 +00001 traffic 70 +00001 international 71 +00001 accident 71 +00001 salad 71 +00001 rooms 72 +00001 high 73 +00001 lunch 73 +00001 coming 73 +00001 fifth 73 +00001 stamps 74 +00001 local 74 +00001 cheaper 74 +00001 beautiful 74 +00001 things 74 +00001 stomach 74 +00001 non- 75 +00001 tanaka 75 +00001 paper 75 +00001 enough 75 +00001 shopping 76 +00001 green 76 +00001 ice 76 +00001 american 79 +00001 beer 80 +00001 bad 83 +00001 single 84 +00001 fish 84 +00001 extra 86 +00001 different 87 +00001 white 87 +00001 large 88 +00001 business 89 +00001 tax 90 +00001 pain 91 +00001 red 91 +00001 sightseeing 93 +00001 speaking 94 +00001 cream 97 +00001 discount 97 +00001 bath 97 +00001 hair 99 +00001 shoes 99 +00001 half 99 +00001 big 103 +00001 tea 103 +00001 popular 107 +00001 insurance 107 +00001 breakfast 110 +00001 course 110 +00001 cold 113 +00001 park 113 +00001 air 115 +00001 person 120 +00001 most 121 +00001 special 123 +00001 watch 124 +00001 expensive 124 +00001 book 128 +00001 smoking 131 +00001 great 131 +00001 dinner 132 +00001 moment 135 +00001 hour 136 +00001 year 140 +00001 money 145 +00001 york 147 +00001 hot 148 +00001 cash 151 +00001 medicine 154 +00001 food 155 +00001 last 162 +00001 people 174 +00001 wine 179 +00001 small 186 +00001 free 187 +00001 place 198 +00001 other 201 +00001 seats 203 +00001 coffee 213 +00001 water 218 +00001 nice 220 +00001 night 242 +00001 charge 248 +00001 " 262 +00001 new 299 +00001 day 385 +00001 more 397 +00001 japanese 486 +00001 10289 +00001 good 597 +00010 width 5 +00010 fridge 5 +00010 overflowed 5 +00010 channels 5 +00010 aquarium 5 +00010 procedure 5 +00010 background 5 +00010 policy 5 +00010 greyhound 5 +00010 itemized 5 +00010 models 5 +00010 brighter 5 +00010 ingredients 5 +00010 signs 5 +00010 promotion 5 +00010 receiver 5 +00010 lane 5 +00010 knives 5 +00010 forms 5 +00010 display 5 +00010 bronx 5 +00010 facial 5 +00010 locker 5 +00010 kindness 5 +00010 guard 5 +00010 vat 5 +00010 lawyer 5 +00010 underground 5 +00010 crowd 5 +00010 washable 5 +00010 markets 5 +00010 convenience 5 +00010 quickest 5 +00010 speech 5 +00010 stereo 5 +00010 locals 5 +00010 shimada 5 +00010 tide 5 +00010 elegant 5 +00010 hawaiian 5 +00010 tripod 5 +00010 negatives 5 +00010 scene 5 +00010 sun 5 +00010 hairdresser 5 +00010 cinema 5 +00010 players 5 +00010 shortest 5 +00010 theatre 5 +00010 watson 5 +00010 embarkation 5 +00010 railpass 5 +00010 wound 5 +00010 basement 5 +00010 success 5 +00010 streetcar 5 +00010 mat 5 +00010 pacific 5 +00010 thermometer 5 +00010 journey 5 +00010 bedroom 5 +00010 brochures 6 +00010 bookstore 6 +00010 recorder 6 +00010 engagement 6 +00010 article 6 +00010 drug 6 +00010 replacement 6 +00010 technology 6 +00010 appliances 6 +00010 capital 6 +00010 warranty 6 +00010 ford 6 +00010 sky 6 +00010 pink 6 +00010 plated 6 +00010 industry 6 +00010 railroad 6 +00010 tray 6 +00010 curtain 6 +00010 basket 6 +00010 entree 6 +00010 previous 6 +00010 fuji 6 +00010 grocery 6 +00010 statement 6 +00010 employees 6 +00010 designs 6 +00010 piano 6 +00010 usa 6 +00010 frank 6 +00010 eurail 6 +00010 branches 6 +00010 royal 6 +00010 earphone 6 +00010 eighteenth 6 +00010 coleman 6 +00010 tube 6 +00010 savoy 6 +00010 gun 6 +00010 roommate 6 +00010 suggestion 6 +00010 empire 6 +00010 expenses 6 +00010 gallon 6 +00010 thirtieth 6 +00010 compartments 6 +00010 savings 6 +00010 bin 6 +00010 crew 6 +00010 directory 6 +00010 explanation 6 +00010 windshield 6 +00010 sitter 6 +00010 headset 6 +00010 forwarding 6 +00010 catalog 6 +00010 strap 6 +00010 base 6 +00010 buffet 6 +00010 electrical 6 +00010 remittance 6 +00010 mini- 7 +00010 racket 7 +00010 interpreter 7 +00010 kitchen 7 +00010 largest 7 +00010 barber 7 +00010 horse 7 +00010 ends 7 +00010 records 7 +00010 district 7 +00010 bangs 7 +00010 lead 7 +00010 waves 7 +00010 pullover 7 +00010 falls 7 +00010 pin 7 +00010 pattern 7 +00010 accessories 7 +00010 reception 7 +00010 financial 7 +00010 shell 7 +00010 northern 7 +00010 corporation 7 +00010 engineer 7 +00010 surfboard 7 +00010 cassette 7 +00010 dentist 7 +00010 gentleman 7 +00010 boutique 7 +00010 dream 7 +00010 robbery 7 +00010 production 7 +00010 neighborhood 7 +00010 tires 7 +00010 brake 7 +00010 booking 7 +00010 notebook 7 +00010 minimum 7 +00010 secretary 7 +00010 surcharge 7 +00010 sides 7 +00010 mask 7 +00010 screen 7 +00010 flower 7 +00010 flea 7 +00010 examination 7 +00010 ebert 7 +00010 hole 8 +00010 maid 8 +00010 fastest 8 +00010 branch 8 +00010 lounge 8 +00010 palace 8 +00010 shoulders 8 +00010 policeman 8 +00010 location 8 +00010 internet 8 +00010 thirteenth 8 +00010 fourteenth 8 +00010 sixteenth 8 +00010 chemist 8 +00010 bicycle 8 +00010 disembarkation 8 +00010 castle 8 +00010 wrist 8 +00010 islands 8 +00010 keys 8 +00010 sickness 8 +00010 articles 8 +00010 petrol 8 +00010 tow 8 +00010 upright 8 +00010 ballpoint 8 +00010 truck 8 +00010 figures 8 +00010 youth 8 +00010 ito 8 +00010 escalator 8 +00010 briefcase 8 +00010 exam 8 +00010 typhoon 8 +00010 complaint 8 +00010 highway 9 +00010 reliable 9 +00010 expiration 9 +00010 stationery 9 +00010 prime 9 +00010 law 9 +00010 nineteenth 9 +00010 seating 9 +00010 mailbox 9 +00010 rear 9 +00010 east 9 +00010 cafe 9 +00010 landmark 9 +00010 terrace 9 +00010 rash 9 +00010 mall 9 +00010 ribbon 9 +00010 discotheque 9 +00010 painting 9 +00010 shelf 9 +00010 earliest 9 +00010 artist 9 +00010 sleeper 9 +00010 nails 9 +00010 plant 9 +00010 in- 9 +00010 photos 10 +00010 test 10 +00010 h 10 +00010 sheraton 10 +00010 war 10 +00010 rainy 10 +00010 spoon 10 +00010 chest 10 +00010 leading 10 +00010 ears 10 +00010 cable 10 +00010 factory 10 +00010 cosmetics 10 +00010 clinic 10 +00010 umbrella 10 +00010 instructions 10 +00010 actor 10 +00010 teeth 10 +00010 pleasant 10 +00010 forecast 10 +00010 customer 10 +00010 guest 10 +00010 refrigerator 10 +00010 johnson 10 +00010 mirror 10 +00010 application 10 +00010 engine 10 +00010 guy 10 +00010 cheapest 10 +00010 airplane 10 +00010 wheelchair 10 +00010 cathedral 10 +00010 ear 10 +00010 compartment 10 +00010 freeway 10 +00010 village 10 +00010 library 10 +00010 slot 10 +00010 necklace 10 +00010 fire 10 +00010 mountains 10 +00010 stairs 10 +00010 bulb 11 +00010 chart 11 +00010 depot 11 +00010 eleventh 11 +00010 inn 11 +00010 watches 11 +00010 west 11 +00010 coupon 11 +00010 offices 11 +00010 opposite 11 +00010 television 11 +00010 cafeteria 11 +00010 teacher 11 +00010 shoulder 11 +00010 range 11 +00010 symptoms 11 +00010 fitting 11 +00010 deck 11 +00010 boss 11 +00010 star 11 +00010 conductor 11 +00010 brother 12 +00010 companion 12 +00010 state 12 +00010 additional 12 +00010 passenger 12 +00010 decision 12 +00010 skirt 12 +00010 alarm 12 +00010 casino 12 +00010 trade 12 +00010 clothing 12 +00010 countries 12 +00010 toy 12 +00010 directions 12 +00010 football 12 +00010 envelope 12 +00010 materials 12 +00010 slope 12 +00010 cd 13 +00010 boyfriend 13 +00010 spot 13 +00010 ground 13 +00010 current 13 +00010 cart 13 +00010 salmon 13 +00010 ashtray 13 +00010 switch 13 +00010 machines 13 +00010 conference 13 +00010 supermarket 13 +00010 position 13 +00010 pamphlet 13 +00010 pressure 14 +00010 bellboy 14 +00010 earrings 14 +00010 rocks 14 +00010 limit 14 +00010 overhead 14 +00010 chef 14 +00010 doll 14 +00010 church 14 +00010 first- 14 +00010 biggest 14 +00010 carry- 14 +00010 restroom 14 +00010 radio 14 +00010 announcement 15 +00010 jones 15 +00010 record 15 +00010 currency 15 +00010 birthday 15 +00010 immigration 15 +00010 signature 15 +00010 beginner 15 +00010 parents 15 +00010 apartment 15 +00010 sixth 15 +00010 cabin 15 +00010 rack 15 +00010 diego 16 +00010 husband 16 +00010 eighth 16 +00010 stage 16 +00010 finger 16 +00010 speed 16 +00010 mountain 16 +00010 coin 16 +00010 stadium 16 +00010 metropolitan 16 +00010 bathtub 16 +00010 limited 16 +00010 arrival 16 +00010 pants 16 +00010 sister 16 +00010 stain 17 +00010 agency 17 +00010 word 17 +00010 opinion 17 +00010 closest 17 +00010 project 17 +00010 shoe 17 +00010 video 17 +00010 mouth 17 +00010 plaza 18 +00010 gallery 18 +00010 waist 18 +00010 bottom 18 +00010 blouse 18 +00010 hat 18 +00010 air- 18 +00010 photo 18 +00010 registered 18 +00010 brochure 18 +00010 slip 18 +00010 group 19 +00010 design 19 +00010 tank 19 +00010 flash 19 +00010 chair 19 +00010 cruise 19 +00010 hands 19 +00010 lenses 19 +00010 shuttle 19 +00010 timetable 19 +00010 trunk 19 +00010 berth 19 +00010 elevator 19 +00010 ball 20 +00010 ninth 20 +00010 neck 20 +00010 twelfth 20 +00010 favorite 20 +00010 theft 20 +00010 belongings 20 +00010 body 20 +00010 blood 21 +00010 program 21 +00010 transit 21 +00010 island 21 +00010 pharmacy 21 +00010 pool 21 +00010 cashier 21 +00010 final 21 +00010 shops 21 +00010 magazine 21 +00010 drugstore 21 +00010 vending 21 +00010 lift 21 +00010 stores 21 +00010 tire 22 +00010 fifteenth 22 +00010 postcard 22 +00010 clock 22 +00010 lady 22 +00010 musical 23 +00010 cab 23 +00010 charges 23 +00010 bridge 23 +00010 registration 23 +00010 arm 23 +00010 shutter 23 +00010 question 23 +00010 period 23 +00010 son 23 +00010 cocktail 24 +00010 knife 24 +00010 weekend 24 +00010 destination 24 +00010 difference 24 +00010 throat 24 +00010 river 25 +00010 button 25 +00010 larger 25 +00010 handbag 25 +00010 meter 25 +00010 fault 25 +00010 bathroom 25 +00010 parcel 25 +00010 quality 26 +00010 pleasure 26 +00010 disco 26 +00010 zoo 26 +00010 telegram 26 +00010 tooth 26 +00010 university 27 +00010 head 27 +00010 master 27 +00010 whole 27 +00010 sweater 27 +00010 job 27 +00010 connecting 27 +00010 father 27 +00010 row 28 +00010 seventh 28 +00010 fork 28 +00010 temperature 28 +00010 contract 28 +00010 battery 29 +00010 pocket 29 +00010 states 29 +00010 concert 29 +00010 confirmation 29 +00010 connection 29 +00010 manager 30 +00010 mother 30 +00010 performance 30 +00010 middle 30 +00010 declaration 30 +00010 latest 31 +00010 emergency 31 +00010 eyes 31 +00010 tenth 31 +00010 airline 32 +00010 dining 32 +00010 porter 32 +00010 product 33 +00010 code 34 +00010 opera 34 +00010 tie 34 +00010 account 34 +00010 message 35 +00010 own 35 +00010 ring 35 +00010 child 35 +00010 tag 36 +00010 hall 36 +00010 route 36 +00010 wife 36 +00010 terminal 36 +00010 boat 37 +00010 shirt 37 +00010 family 37 +00010 package 37 +00010 belt 37 +00010 skin 37 +00010 purse 38 +00010 round 38 +00010 market 38 +00010 fourth 38 +00010 souvenir 39 +00010 total 39 +00010 cards 39 +00010 fee 39 +00010 smith 40 +00010 tourist 40 +00010 pen 41 +00010 toilet 41 +00010 jacket 41 +00010 world 43 +00010 limousine 43 +00010 beach 43 +00010 valuables 44 +00010 coat 44 +00010 lobby 46 +00010 theater 47 +00010 post 52 +00010 claim 53 +00010 driver 55 +00010 weather 56 +00010 machine 57 +00010 meeting 57 +00010 month 57 +00010 road 57 +00010 clothes 58 +00010 main 59 +00010 aisle 60 +00010 bar 61 +00010 desk 61 +00010 steak 61 +00010 laundry 64 +00010 prescription 65 +00010 francisco 66 +00010 letter 68 +00010 hospital 70 +00010 menu 71 +00010 hilton 71 +00010 police 71 +00010 bank 73 +00010 gift 73 +00010 wallet 74 +00010 dress 74 +00010 style 74 +00010 information 75 +00010 departure 77 +00010 receipt 77 +00010 airlines 78 +00010 fare 79 +00010 plane 81 +00010 building 83 +00010 company 84 +00010 movie 85 +00010 game 86 +00010 door 86 +00010 boarding 86 +00010 rest 87 +00010 party 87 +00010 appointment 90 +00010 department 92 +00010 suitcase 92 +00010 counter 93 +00010 town 93 +00010 subway 97 +00010 area 98 +00010 rate 99 +00010 country 100 +00010 guide 100 +00010 telephone 100 +00010 express 102 +00010 box 105 +00010 house 105 +00010 bags 106 +00010 luggage 108 +00010 form 110 +00010 class 111 +00010 museum 111 +00010 color 112 +00010 film 117 +00010 second 119 +00010 meal 119 +00010 third 120 +00010 trip 124 +00010 credit 126 +00010 picture 126 +00010 light 127 +00010 afternoon 128 +00010 key 128 +00010 doctor 129 +00010 week 130 +00010 passport 132 +00010 gate 132 +00010 camera 139 +00010 price 142 +00010 address 142 +00010 friend 143 +00010 same 143 +00010 evening 144 +00010 best 146 +00010 phone 147 +00010 office 149 +00010 nearest 150 +00010 map 156 +00010 bill 157 +00010 store 160 +00010 window 164 +00010 shop 172 +00010 size 178 +00010 wrong 180 +00010 service 182 +00010 city 188 +00010 restaurant 195 +00010 taxi 203 +00010 airport 207 +00010 street 214 +00010 table 246 +00010 tour 256 +00010 bag 257 +00010 station 266 +00010 first 267 +00010 baggage 301 +00010 card 307 +00010 next 323 +00010 ticket 344 +00010 train 356 +00010 car 414 +00010 reservation 447 +00010 seat 465 +00010 bus 532 +00010 flight 592 +00010 hotel 612 +00010 number 614 +00010 right 812 +00010 room 1136 +000110 excited 8 +000110 loud 8 +000110 deep 8 +000110 cute 11 +000110 printed 21 +000110 fast 31 +000110 often 58 +000110 far 86 +000110 old 107 +000110 soon 151 +000110 many 311 +000110 long 379 +000110 much 767 +000111 jobs 5 +000111 capacity 5 +000111 risk 5 +000111 customers 5 +000111 outfit 5 +000111 phones 5 +000111 orleans 5 +000111 houses 5 +000111 martin 5 +000111 remover 5 +000111 song 5 +000111 shape 5 +000111 ideas 5 +000111 brands 5 +000111 convention 5 +000111 understanding 5 +000111 closet 5 +000111 conversation 5 +000111 character 5 +000111 parties 5 +000111 kent 5 +000111 speciality 5 +000111 areas 5 +000111 drivers 5 +000111 proposals 5 +000111 spirits 5 +000111 regards 5 +000111 allowance 5 +000111 labels 5 +000111 designer 5 +000111 stars 5 +000111 attendants 5 +000111 lockers 5 +000111 architecture 5 +000111 groups 6 +000111 colleague 6 +000111 heater 6 +000111 documents 6 +000111 maps 6 +000111 gums 6 +000111 scenery 6 +000111 tub 6 +000111 situation 6 +000111 details 6 +000111 minister 6 +000111 growth 6 +000111 boys 6 +000111 wines 6 +000111 ceremony 6 +000111 desserts 6 +000111 measurements 6 +000111 styles 6 +000111 scale 6 +000111 education 6 +000111 network 6 +000111 calculation 6 +000111 lost- 6 +000111 reason 7 +000111 exhibition 7 +000111 coupons 7 +000111 ounces 7 +000111 edition 7 +000111 carousel 7 +000111 festival 7 +000111 paintings 7 +000111 possibility 7 +000111 event 7 +000111 degree 7 +000111 stations 7 +000111 steps 7 +000111 smell 7 +000111 sheets 7 +000111 delay 8 +000111 fees 8 +000111 pens 8 +000111 seventeenth 8 +000111 girlfriend 8 +000111 bowl 8 +000111 player 8 +000111 drain 8 +000111 brakes 8 +000111 agent 8 +000111 programs 8 +000111 fabric 8 +000111 wind 8 +000111 homework 8 +000111 atmosphere 8 +000111 beds 8 +000111 appreciation 8 +000111 team 8 +000111 boxes 8 +000111 names 8 +000111 foods 9 +000111 twentieth 9 +000111 members 9 +000111 furniture 9 +000111 phantom 9 +000111 samples 9 +000111 portion 9 +000111 shade 9 +000111 condition 9 +000111 films 9 +000111 signal 9 +000111 level 9 +000111 streets 10 +000111 facilities 10 +000111 rules 10 +000111 hobbies 10 +000111 terms 10 +000111 stone 10 +000111 dictionary 10 +000111 autumn 10 +000111 century 11 +000111 points 11 +000111 sheet 11 +000111 polish 11 +000111 field 11 +000111 calls 11 +000111 heels 11 +000111 beginning 11 +000111 conditioning 11 +000111 tags 11 +000111 plug 11 +000111 cameras 12 +000111 papers 12 +000111 lamp 12 +000111 sport 12 +000111 types 12 +000111 sound 13 +000111 lines 13 +000111 population 13 +000111 transportation 13 +000111 foundation 13 +000111 fan 13 +000111 selection 13 +000111 nose 13 +000111 companies 13 +000111 purpose 13 +000111 sort 14 +000111 lights 14 +000111 material 14 +000111 crossing 14 +000111 guests 15 +000111 earphones 15 +000111 sizes 15 +000111 staff 15 +000111 value 15 +000111 conditions 15 +000111 rates 15 +000111 effects 16 +000111 hobby 16 +000111 statue 16 +000111 channel 16 +000111 lock 16 +000111 contents 16 +000111 model 17 +000111 ankle 17 +000111 leg 17 +000111 age 17 +000111 postcards 17 +000111 numbers 17 +000111 intersection 18 +000111 daughter 18 +000111 history 19 +000111 direction 19 +000111 sights 19 +000111 sleeves 19 +000111 length 22 +000111 budget 22 +000111 certificate 23 +000111 works 24 +000111 system 24 +000111 brand 25 +000111 item 28 +000111 tower 29 +000111 conditioner 29 +000111 specialty 29 +000111 top 30 +000111 instead 32 +000111 amount 32 +000111 exit 37 +000111 season 38 +000111 entrance 39 +000111 kinds 39 +000111 schedule 40 +000111 track 42 +000111 matter 44 +000111 date 45 +000111 thing 46 +000111 platform 47 +000111 part 49 +000111 else 50 +000111 type 51 +000111 stops 52 +000111 list 56 +000111 places 57 +000111 end 59 +000111 dish 69 +000111 section 73 +000111 center 75 +000111 corner 85 +000111 case 87 +000111 side 94 +000111 floor 122 +000111 line 147 +000111 front 155 +000111 kind 217 +000111 morning 289 +000111 way 371 +000111 time 896 +000111 name 424 +00100 fifteen- 5 +00100 ba 5 +00100 australian 5 +00100 pier 5 +00100 equals 6 +00100 jl 6 +00100 asa 6 +00100 take- 8 +00100 adult 9 +00100 six- 9 +00100 dressed 11 +00100 ninety 11 +00100 hors 11 +00100 four- 11 +00100 e 12 +00100 seven- 13 +00100 ua 13 +00100 thirteen 14 +00100 eight- 14 +00100 several 16 +00100 two- 17 +00100 extension 17 +00100 five- 18 +00100 fourteen 19 +00100 sixteen 21 +00100 walking 22 +00100 ten- 22 +00100 three- 22 +00100 eighteen 23 +00100 seventeen 26 +00100 sixty- 27 +00100 eighty- 27 +00100 sixty 28 +00100 u.s. 29 +00100 seventy 31 +00100 nineteen 31 +00100 seventy- 32 +00100 d 35 +00100 least 39 +00100 eighty 43 +00100 fifty- 53 +00100 forty 57 +00100 one- 61 +00100 forty- 74 +00100 eleven 77 +00100 twelve 83 +00100 ninety- 94 +00100 thirty- 118 +00100 fifteen 120 +00100 fifty 179 +00100 twenty- 203 +00100 twenty 209 +00100 thirty 257 +00100 eight 342 +00100 six 366 +00100 nine 386 +00100 ten 388 +00100 four 415 +00100 seven 418 +00100 five 738 +00100 one 1733 +00100 two 1276 +00100 three 828 +00101 centimeter 5 +00101 pence 5 +00101 packs 5 +00101 bucks 6 +00101 quadruple 6 +00101 triple 6 +00101 gallons 6 +00101 carat 6 +00101 cokes 6 +00101 cartons 7 +00101 capsule 7 +00101 cups 7 +00101 tablet 7 +00101 slices 8 +00101 pairs 8 +00101 doors 9 +00101 degrees 9 +00101 fives 9 +00101 coffees 10 +00101 hamburgers 10 +00101 'oeuvres 10 +00101 pill 10 +00101 'hote 10 +00101 millimeter 10 +00101 exposures 13 +00101 inches 15 +00101 feet 17 +00101 a. 17 +00101 meters 17 +00101 exposure 18 +00101 rolls 19 +00101 tens 20 +00101 million 20 +00101 pieces 22 +00101 centimeters 24 +00101 twenties 27 +00101 cent 28 +00101 weeks 33 +00101 bottles 49 +00101 blocks 59 +00101 percent 72 +00101 a.m. 72 +00101 years 91 +00101 p.m. 100 +00101 thousand 122 +00101 dollar 145 +00101 zero 252 +00101 hundred 371 +00101 o 365 +00110 yourself 46 +00110 her 102 +00110 him 177 +00110 us 220 +00110 me 3172 +001110 mayonnaise 5 +001110 centre 5 +001110 australia 5 +001110 manchester 5 +001110 memphis 5 +001110 takeout 5 +001110 voice 5 +001110 durable 5 +001110 scotland 5 +001110 sooner 5 +001110 baltimore 5 +001110 klein 5 +001110 coast 5 +001110 management 5 +001110 spain 5 +001110 venice 5 +001110 hokkaido 5 +001110 individually 5 +001110 dallas 5 +001110 computers 5 +001110 attendant 5 +001110 portland 5 +001110 kyushu 5 +001110 vancouver 6 +001110 dates 6 +001110 frankfurt 6 +001110 fares 6 +001110 weekends 6 +001110 ourselves 6 +001110 denver 6 +001110 perfectly 6 +001110 anytime 6 +001110 italy 6 +001110 breathing 6 +001110 ages 7 +001110 regularly 7 +001110 issued 7 +001110 europe 7 +001110 detail 7 +001110 future 7 +001110 honolulu 7 +001110 manhattan 7 +001110 roulette 7 +001110 guides 7 +001110 bloom 7 +001110 chinatown 8 +001110 atlanta 8 +001110 hollywood 8 +001110 china 8 +001110 cooking 8 +001110 mexico 8 +001110 soho 8 +001110 george 8 +001110 huh 8 +001110 german 8 +001110 everyday 8 +001110 sydney 8 +001110 marks 8 +001110 shortly 9 +001110 victoria 9 +001110 yokohama 9 +001110 kong 9 +001110 site 9 +001110 aches 9 +001110 asthma 9 +001110 jim 9 +001110 canada 9 +001110 sundays 9 +001110 upstairs 9 +001110 wheat 9 +001110 onions 10 +001110 disneyland 10 +001110 control 10 +001110 france 10 +001110 surfing 11 +001110 silver 11 +001110 unleaded 11 +001110 abroad 11 +001110 england 11 +001110 fact 11 +001110 quarters 12 +001110 oxford 12 +001110 broadway 12 +001110 jane 12 +001110 reissued 12 +001110 d.c. 12 +001110 payment 12 +001110 detroit 12 +001110 rye 12 +001110 pressed 12 +001110 wool 13 +001110 california 13 +001110 developed 13 +001110 easily 13 +001110 booth 14 +001110 hawaii 14 +001110 beginners 14 +001110 osaka 15 +001110 officer 15 +001110 edinburgh 15 +001110 tuesday 16 +001110 valid 17 +001110 vegas 17 +001110 april 17 +001110 rome 17 +001110 fashion 17 +001110 thursday 18 +001110 spring 18 +001110 recently 18 +001110 dover 18 +001110 altogether 18 +001110 aid 18 +001110 monday 19 +001110 noon 20 +001110 advance 20 +001110 alone 21 +001110 kyoto 22 +001110 separately 25 +001110 crowded 25 +001110 narita 26 +001110 wednesday 26 +001110 quickly 27 +001110 miami 28 +001110 immediately 28 +001110 sale 28 +001110 slowly 29 +001110 bye 29 +001110 ship 29 +001110 saturday 31 +001110 seattle 33 +001110 washington 34 +001110 somewhere 36 +001110 sunday 37 +001110 surface 37 +001110 america 40 +001110 square 43 +001110 foot 46 +001110 downtown 47 +001110 paris 48 +001110 nearby 50 +001110 board 52 +001110 airmail 58 +001110 london 61 +001110 ones 63 +001110 yesterday 66 +001110 friday 67 +001110 myself 74 +001110 angeles 79 +001110 chicago 84 +001110 ago 86 +001110 home 91 +001110 boston 92 +001110 late 101 +001110 later 112 +001110 english 116 +001110 away 125 +001110 yet 130 +001110 tonight 197 +001110 tokyo 264 +001110 today 285 +001110 tomorrow 401 +001110 japan 582 +001110 here 1535 +001110 now 489 +001111 seasons 5 +001111 stalled 5 +001111 mugged 5 +001111 units 5 +001111 shots 5 +001111 appendicitis 5 +001111 subject 5 +001111 slower 5 +001111 salon 5 +001111 guaranteed 5 +001111 seconds 5 +001111 below 5 +001111 brothers 5 +001111 parcels 5 +001111 clearly 6 +001111 coughing 6 +001111 plates 6 +001111 dogs 6 +001111 performances 6 +001111 separated 7 +001111 tokens 7 +001111 obliged 7 +001111 copies 7 +001111 cloudy 7 +001111 rackets 7 +001111 louder 8 +001111 warmer 8 +001111 involved 8 +001111 prints 8 +001111 safely 8 +001111 arrangements 8 +001111 ill 10 +001111 carefully 10 +001111 properly 10 +001111 orders 10 +001111 flashy 11 +001111 notes 11 +001111 kilometers 11 +001111 sets 11 +001111 francs 11 +001111 faster 12 +001111 block 13 +001111 attention 13 +001111 tablets 14 +001111 robbed 14 +001111 lots 14 +001111 persons 14 +001111 adults 15 +001111 suitcases 15 +001111 directly 16 +001111 shows 16 +001111 married 16 +001111 tired 19 +001111 singles 21 +001111 changed 21 +001111 bound 23 +001111 served 24 +001111 months 26 +001111 forward 28 +001111 cleaned 28 +001111 worth 28 +001111 running 29 +001111 miles 29 +001111 glasses 33 +001111 delayed 34 +001111 trains 37 +001111 outside 38 +001111 reservations 39 +001111 pictures 42 +001111 pounds 47 +001111 distance 47 +001111 longer 49 +001111 early 52 +001111 inside 55 +001111 hurts 59 +001111 nights 68 +001111 times 72 +001111 bills 76 +001111 together 77 +001111 stolen 77 +001111 ahead 78 +001111 care 79 +001111 waiting 83 +001111 through 97 +001111 ready 104 +001111 cents 111 +001111 hours 113 +001111 straight 116 +001111 available 152 +001111 yen 171 +001111 tickets 200 +001111 again 209 +001111 'clock 217 +001111 days 235 +001111 down 249 +001111 minutes 257 +001111 them 277 +001111 over 303 +001111 off 325 +001111 back 434 +001111 up 615 +001111 out 635 +001111 dollars 728 +01000 snorkeling 6 +01000 suntan 6 +01000 rose 6 +01000 colored 6 +01000 mashed 6 +01000 soy 7 +01000 swiss 7 +01000 ginger 7 +01000 instant 9 +01000 iced 9 +01000 folk 9 +01000 chanel 11 +01000 plenty 12 +01000 scuba 14 +01000 roast 19 +01000 mineral 24 +01000 duty- 53 +01000 any 937 +01000 some 1289 +01001 unlimited 5 +01001 greasy 5 +01001 akira 5 +01001 hyde 6 +01001 jet 7 +01001 dr. 16 +01001 fried 26 +01001 another 242 +01001 a 9572 +01001 an 894 +01010 marine 5 +01010 f 5 +01010 hudson 5 +01010 santa 6 +01010 sea- 7 +01010 high- 7 +01010 lincoln 8 +01010 classical 8 +01010 mount 8 +01010 various 13 +01010 mrs. 16 +01010 a- 23 +01010 its 34 +01010 ms. 35 +01010 their 56 +01010 san 85 +01010 his 100 +01010 mr. 318 +01010 our 380 +01010 my 3154 +01010 your 1677 +01010 the 11454 +01011 harvard 5 +01011 kennedy 5 +01011 northwest 6 +01011 kodak 6 +01011 mr 6 +01011 sumo 7 +01011 yosemite 7 +01011 nara 7 +01011 saigon 7 +01011 november 8 +01011 sensitive 9 +01011 oily 9 +01011 december 10 +01011 february 12 +01011 january 15 +01011 september 27 +01011 october 28 +01011 june 28 +01011 march 31 +01011 august 36 +01011 july 37 +01011 abc 43 +01011 jal 47 +01011 those 68 +01011 each 86 +01011 these 362 +01011 this 4221 +01100 e- 11 +01100 to 8572 +0110100 overcharged 5 +0110100 joining 6 +0110100 becomes 6 +0110100 telling 6 +0110100 regarding 8 +0110100 gives 9 +0110100 kept 16 +0110100 twice 19 +0110100 fits 20 +0110100 makes 22 +0110100 told 23 +0110100 include 61 +0110100 without 67 +0110100 for 3866 +0110100 with 1331 +0110101 formally 5 +0110101 minus 5 +0110101 marked 5 +0110101 calvin 5 +0110101 towards 5 +0110101 beside 5 +0110101 via 5 +0110101 snatched 6 +0110101 enjoying 7 +0110101 beyond 8 +0110101 facing 10 +0110101 above 13 +0110101 sometime 14 +0110101 showing 20 +0110101 across 21 +0110101 good- 23 +0110101 against 23 +0110101 using 26 +0110101 within 35 +0110101 past 38 +0110101 during 40 +0110101 between 42 +0110101 behind 44 +0110101 along 52 +0110101 every 75 +0110101 under 75 +0110101 near 190 +0110101 into 196 +0110101 around 329 +0110101 by 742 +0110101 on 2073 +0110101 in 3437 +0110101 from 871 +0110101 at 1774 +0110110 wrapping 7 +0110110 de 8 +0110110 containing 10 +0110110 of 3042 +0110110 to- 26 +0110111 nor 5 +0110111 of- 5 +0110111 excluding 5 +0110111 u- 7 +0110111 except 8 +0110111 unless 9 +0110111 besides 10 +0110111 i- 13 +0110111 and- 13 +0110111 plus 15 +0110111 departing 15 +0110111 among 17 +0110111 o- 19 +0110111 says 25 +0110111 till 34 +0110111 including 37 +0110111 ' 52 +0110111 since 54 +0110111 once 54 +0110111 per 120 +0110111 until 122 +0110111 than 127 +0110111 before 199 +0110111 after 230 +0110111 as 518 +0110111 and 2640 +0110111 or 565 +0111000 appreciate 24 +0111000 love 59 +0111000 like 3793 +01110010 represent 5 +01110010 spilled 6 +01110010 prescribe 6 +01110010 add 14 +01110010 arrange 16 +01110010 received 18 +01110010 suggest 53 +01110010 accept 55 +01110010 sell 77 +01110010 prefer 90 +01110010 recommend 197 +01110010 have 4450 +01110010 had 253 +01110011 spent 5 +01110011 realize 5 +01110011 ought 8 +01110011 hate 8 +01110011 expect 10 +01110011 suppose 11 +01110011 liked 11 +01110011 tried 13 +01110011 requested 14 +01110011 met 21 +01110011 saw 22 +01110011 agree 26 +01110011 forgot 26 +01110011 believe 28 +01110011 wanted 28 +01110011 thought 29 +01110011 guess 40 +01110011 asked 40 +01110011 wish 45 +01110011 heard 45 +01110011 enjoyed 45 +01110011 seem 45 +01110011 ordered 56 +01110011 mean 62 +01110011 bought 69 +01110011 hope 96 +01110011 feel 156 +01110011 need 424 +01110011 think 450 +01110011 want 870 +0111010 loan 5 +0111010 teach 6 +0111010 inviting 8 +0111010 treat 10 +0111010 provide 13 +0111010 pardon 15 +0111010 measure 18 +0111010 lend 25 +0111010 gave 27 +0111010 connect 28 +0111010 wake 36 +0111010 help 206 +0111010 bring 291 +0111010 excuse 421 +0111010 show 430 +0111010 tell 451 +0111010 give 555 +0111010 let 518 +011101100 madison 5 +011101100 hong 7 +011101100 union 14 +011101100 las 17 +011101100 become 18 +011101100 be 1184 +011101100 los 79 +011101101 philadelphia 5 +011101101 wrapped 5 +011101101 chat 5 +011101101 apologize 5 +011101101 dry- 5 +011101101 shoot 6 +011101101 hostel 7 +011101101 afford 7 +011101101 step 7 +011101101 refrain 7 +011101101 breathe 8 +011101101 rip 8 +011101101 proceed 8 +011101101 prior 8 +011101101 according 8 +011101101 warm 11 +011101101 depart 12 +011101101 swim 13 +011101101 fell 17 +011101101 lie 17 +011101101 study 18 +011101101 happen 18 +011101101 decide 21 +011101101 smoke 21 +011101101 fly 22 +011101101 dive 23 +011101101 ride 24 +011101101 listen 25 +011101101 hang 31 +011101101 run 31 +011101101 went 34 +011101101 arrived 35 +011101101 plan 42 +011101101 live 47 +011101101 check- 48 +011101101 sleep 52 +011101101 stand 59 +011101101 came 60 +011101101 close 62 +011101101 move 62 +011101101 hurry 62 +011101101 talk 64 +011101101 transfer 65 +011101101 walk 73 +011101101 goes 75 +011101101 sit 75 +011101101 arrive 118 +011101101 speak 128 +011101101 work 178 +011101101 turn 186 +011101101 look 193 +011101101 stay 272 +011101101 stop 274 +011101101 go 1090 +011101101 come 537 +011101110 confiscate 5 +011101110 increase 5 +011101110 kill 6 +011101110 charter 6 +011101110 disturb 6 +011101110 reduce 6 +011101110 replace 7 +011101110 withdraw 7 +011101110 manage 7 +011101110 examine 8 +011101110 consider 8 +011101110 avoid 10 +011101110 receive 11 +011101110 extend 11 +011101110 lose 11 +011101110 recline 11 +011101110 continue 12 +011101110 bother 12 +011101110 weigh 12 +011101110 allow 12 +011101110 notify 13 +011101110 invite 13 +011101110 learn 14 +011101110 attend 14 +011101110 discuss 16 +011101110 forget 19 +011101110 confirm 21 +011101110 reach 22 +011101110 enter 24 +011101110 spend 25 +011101110 serve 27 +011101110 introduce 29 +011101110 remember 30 +011101110 follow 34 +011101110 hire 35 +011101110 draw 38 +011101110 read 39 +011101110 reconfirm 40 +011101110 borrow 41 +011101110 drop 44 +011101110 enjoy 54 +011101110 join 59 +011101110 hear 62 +011101110 catch 65 +011101110 wear 71 +011101110 meet 120 +011101110 pick 125 +011101110 eat 139 +011101110 rent 142 +011101110 reserve 172 +011101110 ask 175 +011101110 use 268 +011101110 buy 303 +011101110 find 309 +011101110 make 644 +011101110 get 1197 +011101110 see 828 +011101111 quit 5 +011101111 wipe 5 +011101111 purchased 5 +011101111 n- 5 +011101111 m- 5 +011101111 inquire 5 +011101111 settle 5 +011101111 enlarge 6 +011101111 describe 6 +011101111 recover 6 +011101111 count 6 +011101111 mend 6 +011101111 dine 6 +011101111 submit 6 +011101111 initial 6 +011101111 load 7 +011101111 import 8 +011101111 opened 8 +011101111 insert 8 +011101111 develop 8 +011101111 alter 8 +011101111 cause 9 +011101111 file 9 +011101111 mid- 10 +011101111 remove 11 +011101111 shut 11 +011101111 shorten 11 +011101111 carrying 11 +011101111 save 11 +011101111 handle 12 +011101111 rent- 12 +011101111 visited 12 +011101111 rush 12 +011101111 dance 13 +011101111 spell 13 +011101111 register 13 +011101111 prepare 13 +011101111 pull 14 +011101111 push 14 +011101111 page 14 +011101111 mark 14 +011101111 match 14 +011101111 visiting 15 +011101111 adjust 15 +011101111 insure 16 +011101111 print 16 +011101111 repeat 16 +011101111 purchase 17 +011101111 request 18 +011101111 fasten 19 +011101111 cross 19 +011101111 wash 20 +011101111 declare 20 +011101111 touch 21 +011101111 answer 21 +011101111 choose 22 +011101111 share 22 +011101111 trim 23 +011101111 apply 24 +011101111 issue 24 +011101111 offer 24 +011101111 hurt 25 +011101111 lower 26 +011101111 cook 26 +011101111 finish 28 +011101111 deliver 28 +011101111 bet 29 +011101111 clear 29 +011101111 begin 31 +011101111 reissue 32 +011101111 seeing 32 +011101111 hit 33 +011101111 drive 34 +011101111 repair 36 +011101111 fit 36 +011101111 dial 36 +011101111 clean 38 +011101111 press 43 +011101111 fix 46 +011101111 explain 50 +011101111 break 50 +011101111 point 53 +011101111 wrap 64 +011101111 carry 69 +011101111 cut 70 +011101111 cancel 70 +011101111 contact 77 +011101111 miss 79 +011101111 hold 80 +011101111 pass 83 +011101111 sign 85 +011101111 report 95 +011101111 write 98 +011101111 start 100 +011101111 visit 108 +011101111 return 110 +011101111 play 120 +011101111 exchange 142 +011101111 say 149 +011101111 mail 150 +011101111 fill 154 +011101111 wait 192 +011101111 order 200 +011101111 keep 201 +011101111 try 209 +011101111 open 212 +011101111 leave 278 +011101111 put 290 +011101111 pay 312 +011101111 send 379 +011101111 check 417 +011101111 change 530 +011101111 take 1344 +011101111 call 740 +01111000 originally 5 +01111000 mostly 5 +01111000 seldom 5 +01111000 sending 5 +01111000 monthly 6 +01111000 giving 6 +01111000 b. 6 +01111000 buying 6 +01111000 finally 6 +01111000 bringing 7 +01111000 kindly 7 +01111000 keeping 9 +01111000 especially 13 +01111000 probably 19 +01111000 almost 22 +01111000 making 24 +01111000 gonna 28 +01111000 usually 29 +01111000 being 39 +01111000 ever 42 +01111000 such 49 +01111000 always 50 +01111000 never 59 +01111000 having 60 +01111000 taking 61 +01111000 also 92 +01111000 still 95 +01111000 only 185 +01111000 about 744 +01111000 just 565 +01111001 opens 5 +01111001 so- 5 +01111001 felt 5 +01111001 became 5 +01111001 signed 5 +01111001 wants 5 +01111001 drove 5 +01111001 pulled 5 +01111001 faces 5 +01111001 prescribed 5 +01111001 highly 5 +01111001 twisted 6 +01111001 matches 6 +01111001 rented 6 +01111001 forgotten 6 +01111001 closes 6 +01111001 departs 6 +01111001 slipped 6 +01111001 stands 6 +01111001 deeply 6 +01111001 recommended 6 +01111001 worked 6 +01111001 attacked 7 +01111001 act 7 +01111001 stung 7 +01111001 band 7 +01111001 happens 7 +01111001 burned 8 +01111001 lives 8 +01111001 stayed 8 +01111001 looked 8 +01111001 m 8 +01111001 played 8 +01111001 gotten 8 +01111001 remain 8 +01111001 covered 9 +01111001 begins 9 +01111001 won 9 +01111001 feels 10 +01111001 repaired 10 +01111001 smells 11 +01111001 passed 11 +01111001 wishes 11 +01111001 written 12 +01111001 built 12 +01111001 dangerous 13 +01111001 picked 13 +01111001 washed 13 +01111001 arrives 14 +01111001 sprained 14 +01111001 tastes 14 +01111001 needs 15 +01111001 ran 16 +01111001 runs 17 +01111001 caught 17 +01111001 starting 17 +01111001 starts 17 +01111001 filled 18 +01111001 turned 18 +01111001 sitting 20 +01111001 means 21 +01111001 anywhere 22 +01111001 sent 23 +01111001 gets 24 +01111001 costs 25 +01111001 depends 26 +01111001 broke 27 +01111001 happened 30 +01111001 brought 30 +01111001 checked 30 +01111001 dropped 30 +01111001 started 31 +01111001 leaves 37 +01111001 missed 38 +01111001 took 39 +01111001 even 41 +01111001 used 44 +01111001 seems 58 +01111001 looks 63 +01111001 found 65 +01111001 reserved 66 +01111001 comes 71 +01111001 called 80 +01111001 cost 102 +01111001 lost 173 +01111001 made 213 +01111001 has 333 +01111001 was 677 +01111001 left 333 +01111010 expecting 5 +01111010 certain 5 +01111010 preparing 5 +01111010 worn 5 +01111010 agreed 5 +01111010 helpful 5 +01111010 pregnant 5 +01111010 headed 5 +01111010 spending 5 +01111010 stuck 5 +01111010 angry 6 +01111010 tough 6 +01111010 watching 6 +01111010 satisfied 6 +01111010 surprised 6 +01111010 listed 6 +01111010 thirsty 7 +01111010 eaten 7 +01111010 exhausted 7 +01111010 worried 7 +01111010 impressed 7 +01111010 invited 7 +01111010 added 7 +01111010 willing 7 +01111010 treated 8 +01111010 asking 8 +01111010 exciting 8 +01111010 responsible 8 +01111010 scheduled 8 +01111010 shown 9 +01111010 completed 9 +01111010 wearing 9 +01111010 hospitalized 9 +01111010 listening 9 +01111010 seated 9 +01111010 familiar 9 +01111010 returned 9 +01111010 concerned 9 +01111010 short- 9 +01111010 prepared 11 +01111010 delivered 11 +01111010 wondering 11 +01111010 born 11 +01111010 moved 11 +01111010 kidding 11 +01111010 pleased 12 +01111010 paying 12 +01111010 suffering 12 +01111010 hungry 13 +01111010 arriving 14 +01111010 known 14 +01111010 given 15 +01111010 returning 15 +01111010 studying 15 +01111010 expected 16 +01111010 planning 17 +01111010 flying 18 +01111010 decided 19 +01111010 lucky 19 +01111010 difficult 20 +01111010 held 20 +01111010 finished 21 +01111010 allergic 21 +01111010 talking 22 +01111010 due 22 +01111010 careful 24 +01111010 thinking 25 +01111010 trying 25 +01111010 doing 26 +01111010 locked 28 +01111010 supposed 29 +01111010 paid 29 +01111010 checking 29 +01111010 necessary 30 +01111010 seen 31 +01111010 allowed 32 +01111010 welcome 33 +01111010 closed 35 +01111010 sold 37 +01111010 booked 37 +01111010 said 42 +01111010 easy 43 +01111010 able 43 +01111010 taken 44 +01111010 glad 48 +01111010 getting 51 +01111010 calling 51 +01111010 done 52 +01111010 working 53 +01111010 happy 57 +01111010 interested 61 +01111010 leaving 78 +01111010 staying 83 +01111010 possible 123 +01111010 afraid 174 +01111010 looking 233 +01111010 sure 249 +01111010 got 285 +01111010 been 292 +01111010 going 345 +01111010 sorry 472 +01111011 fantastic 5 +01111011 moving 5 +01111011 yamashita 5 +01111011 aboard 5 +01111011 pineapple 5 +01111011 residence 5 +01111011 impossible 5 +01111011 melon 5 +01111011 anne 5 +01111011 amazing 5 +01111011 leaking 5 +01111011 madam 5 +01111011 romantic 5 +01111011 developing 5 +01111011 connected 5 +01111011 awfully 5 +01111011 jammed 6 +01111011 huge 6 +01111011 crazy 6 +01111011 dizzy 6 +01111011 dead 6 +01111011 standard 6 +01111011 tasty 6 +01111011 learning 6 +01111011 right- 7 +01111011 hayakawa 7 +01111011 ken 7 +01111011 slightly 7 +01111011 nauseous 7 +01111011 susan 7 +01111011 grapefruit 7 +01111011 collecting 7 +01111011 increasing 7 +01111011 poached 7 +01111011 airsick 7 +01111011 vomiting 8 +01111011 oda 8 +01111011 hard- 8 +01111011 miki 8 +01111011 dancing 8 +01111011 professor 8 +01111011 generally 8 +01111011 wharf 8 +01111011 drunk 8 +01111011 seriously 9 +01111011 absolutely 9 +01111011 cancelled 9 +01111011 labor 9 +01111011 damaged 10 +01111011 chilly 10 +01111011 prohibited 10 +01111011 bleeding 11 +01111011 kenji 11 +01111011 akiko 11 +01111011 swollen 11 +01111011 hiroshi 11 +01111011 scrambled 12 +01111011 watanabe 13 +01111011 terribly 13 +01111011 badly 13 +01111011 occupied 13 +01111011 suddenly 14 +01111011 plain 14 +01111011 cool 14 +01111011 reconfirmed 14 +01111011 well- 16 +01111011 dirty 16 +01111011 true 17 +01111011 taro 17 +01111011 completely 17 +01111011 ichiro 18 +01111011 stopped 18 +01111011 sore 18 +01111011 slow 18 +01111011 saying 18 +01111011 confirmed 19 +01111011 fully 19 +01111011 fragile 19 +01111011 exactly 19 +01111011 tomato 20 +01111011 separate 20 +01111011 traveling 21 +01111011 excellent 22 +01111011 feeling 22 +01111011 located 23 +01111011 injured 25 +01111011 eating 27 +01111011 noisy 30 +01111011 both 32 +01111011 pretty 33 +01111011 gone 36 +01111011 sick 38 +01111011 delicious 38 +01111011 rather 41 +01111011 busy 43 +01111011 missing 49 +01111011 orange 52 +01111011 playing 54 +01111011 quite 55 +01111011 already 65 +01111011 broken 78 +01111011 full 94 +01111011 checks 100 +01111011 fine 166 +01111011 better 181 +01111011 really 209 +01111011 too 512 +01111011 very 525 +01111011 not 570 +01111011 all 687 +0111110 serves 6 +0111110 understands 7 +0111110 sells 8 +0111110 stole 9 +0111110 includes 11 +0111110 speaks 40 +0111110 sounds 45 +0111110 's 3930 +0111110 takes 49 +01111110 guys 7 +01111110 were 103 +01111110 're 386 +01111110 are 1850 +01111111 painted 5 +01111111 does 825 +01111111 is 6154 +100 h- 6 +100 , 9989 +1010 . 30466 +1011 d. 5 +1011 ? 15080 +11000 'am 44 +11000 please 5413 +11000 sir 221 +110010 here- 5 +110010 otherwise 6 +110010 i. 7 +110010 perhaps 15 +110010 sometimes 17 +110010 either 20 +110010 though 25 +110010 ma 44 +110010 maybe 47 +110010 because 98 +110010 while 109 +110010 then 269 +110010 but 826 +110010 so 504 +110011 bob 5 +110011 showy 5 +110011 darn 5 +110011 gee 5 +110011 gosh 6 +110011 dear 6 +110011 however 7 +110011 um 8 +110011 hmm 9 +110011 surely 10 +110011 ha 12 +110011 ah 14 +110011 unfortunately 15 +110011 congratulations 17 +110011 gentlemen 20 +110011 wow 24 +110011 anyway 29 +110011 uh 29 +110011 hey 29 +110011 actually 30 +110011 hi 34 +110011 yeah 40 +110011 juice 94 +110011 certainly 96 +110011 thanks 119 +110011 hello 168 +110011 oh 318 +110011 okay 335 +110011 well 470 +110011 yes 861 +110011 no 691 +110100 produced 5 +110100 required 9 +110100 there 1949 +1101010 tempura 6 +1101010 everybody 12 +1101010 everyone 16 +1101010 somebody 20 +1101010 everything 53 +1101010 someone 134 +1101010 she 145 +1101010 it 5211 +1101010 he 391 +1101011 grape 5 +1101011 neither 5 +1101011 jr 5 +1101011 holder 5 +1101011 k- 6 +1101011 fisherman 7 +1101011 picasso 7 +1101011 nonsmoking 7 +1101011 anybody 8 +1101011 chopsticks 8 +1101011 tom 9 +1101011 traveller 9 +1101011 batteries 10 +1101011 whatever 10 +1101011 nobody 11 +1101011 k 12 +1101011 s 12 +1101011 mary 13 +1101011 whether 14 +1101011 someplace 15 +1101011 anyone 35 +1101011 men 38 +1101011 nothing 69 +1101011 traveler 90 +1101011 anything 202 +1101011 that 1705 +1101011 something 367 +110110 how 1812 +110110 year- 21 +110111 whom 9 +110111 sunny- 9 +110111 whose 11 +110111 why 160 +110111 who 223 +110111 which 514 +110111 when 634 +110111 where 1577 +110111 what 2034 +111000 i 15603 +111001 we 2093 +111001 they 410 +111010 you 9199 +111011 definitely 10 +111011 n't 2095 +111100 somehow 5 +111100 shall 122 +111100 may 750 +111100 can 3094 +111100 should 477 +1111010 will 1314 +1111010 would 1275 +11110110 do 3546 +11110110 did 340 +11110111 whenever 6 +11110111 thank 450 +11110111 if 660 +11110111 could 1338 +111110 'd 2934 +1111110 drank 8 +1111110 wonder 44 +1111110 am 206 +1111110 'm 1868 +1111110 've 508 +1111111 hardly 6 +1111111 gift- 11 +1111111 cannot 24 +1111111 might 54 +1111111 must 151 +1111111 'll 1623 diff --git a/examples/example-data/dev-hsm.txt b/examples/example-data/dev-hsm.txt new file mode 100644 index 000000000..ea99477be --- /dev/null +++ b/examples/example-data/dev-hsm.txt @@ -0,0 +1,10 @@ + i think this is wrong . can you check it ? + fine . + i went back to my hotel room and found a here . + it would be one hundred sixty- eight dollars per night for a twin , with tax and service charge . + i would like to sit down and take a rest for a little while . + i am . + number three . + who are you ? + which is the biggest department store in this city ? + can i see your ticket , sir ? diff --git a/examples/example-data/train-hsm.txt b/examples/example-data/train-hsm.txt new file mode 100644 index 000000000..b21c15245 --- /dev/null +++ b/examples/example-data/train-hsm.txt @@ -0,0 +1,1000 @@ + can i catch a bus that goes to the hilton hotel ? + is there a train that goes to the city ? + it 's just down the hall . + i 'll bring you some now . + if there is anything else you need , just let me know . + no worry about that . + i 'll take it and you need not wrap it up . + do you do alterations ? + the light was red . + we want to have a table near the window . + it 's over there , just in front of the tourist information . + i twisted it playing tennis . + it felt okay after the game but then it started and- blue . + is it serious ? + please your pin number . + this is my first time diving . + i 've never heard of this address around here . + i have a sore pain here . + go straight until you see a drugstore . + what 's the color in this season ? + of course . + in my case , it is usually on business , seldom for pleasure . + i 'll be staying two days . + i want to have a tight permanent . + i 'd like to reserve two twin rooms . + i do n't want it . + does this bus stop at avenue ? + are there any baseball games today ? + pickpocket . + pass the bread , please . + let me look at the receipt , then . + please open your mouth wide . + where 's the nearest ? + how much is the breakfast ? + how can i help you ? + can you on this button ? + let 's get a bite to eat . + go left at the third corner . + would you clean these clothes ? + which wine would go well with grilled salmon ? + i requested a non- smoking seat , but this is a smoking seat . + what kind of sport facilities do you have ? + i 'm at the airport right now . + we have a nice table by the window for you . + come this way , please . + i give you his telephone number and address . + i 've paid for meals and hotel charges in advance . + i 'm . + i 've made reservations for eight . + i 'm looking for a nice , quiet type restaurant . + would you point them out on this map ? + the japanese islands run to in the part of the pacific ocean . + you break it , you bought it . + could you keep this baggage ? + do you speak japanese ? + i 'd like some . + i 'll tell her to call you as soon as she . + it 's too heavy . + into french francs please . + please give us a seat up front . + would you like cream and sugar in your coffee ? + she 's seriously injured . + i 'd like a lighter . + does this hotel have conference facilities ? + the pleasure is all mine , mr. green . + i 've heard a lot about you from mr. smith . + mary is not so old as . + is it okay if we just have a light meal ? + i 'm calling from the airport . + i 'll be there around four . + this car goes to chicago , does n't it ? + how long is it ? + excuse me , i 'd like to go to c pier . + is it this way ? + from two hours before the departure . + and please come to the counter at least thirty minutes before flight time . + where do i transfer for chicago ? + how much is it to send a registered letter to france ? + could you cash my two hundred dollar check ? + help me , please . + call an ambulance , please . + which one is cheaper ? + what kind of bread would you like , white , rye or whole wheat ? + it 's really different driving on the right side of the street . + the actor is really . + i 'll pass this time . + these of problems are n't new . + we 've already them . + where 's your non- section ? + every three day , but not always . + if it should turn up , please call me . + i want to eat a mixed burger . + please write down your address here . + is this plated ? + could you please change my seat ? + is there a warranty ? + all right . + turn to your right at the third corner . + you 'll see it right in front of you . + is there a japanese restaurant around here ? + a bag of cookies and a lemon bar . + sorry , i 'll take care of the dog . + i would like two tickets for " cats " , for this thursday . + to the hotel , please . + where is the coffee shop ? + i 'd like a children 's sweater . + my suitcase is damaged . + i need a claim form , please . + your name again ? + is mr. brown there ? + okay . it costs eighty- five cents for regular mail and three dollars and zero cents extra for special delivery . + can i charter a boat for a day ? + at which window can i make a reservation ? + what 's that ? + do i have to dress up ? + could you tell me how to get to the opera ? + were n't you a bit too last night , honey ? + please follow the instructions from our staff . + this is it . + please stop here . + is there a department store near here ? + you can get it at the book store or souvenir shop . + full tank , please . + is there any cheaper room ? + i prefer an automatic car . + i 'm going to stay at the of harvard university . + what is today 's rate ? + three glasses of cherry juice , please . + i from asthma . + i have about three thousand dollars . + tonight ? i think tonight is already full , but i 'll check . + all right , sir . + it comes with a choice of french fries or rice . + how do i get to this place ? + what kind of story is it ? + it 's well . + three times . + which window sells stamps ? + after he attacked me , he drove away in a white . + are there any special sights ? + all right . + please keep this tag and present it when you come to pick it up . + i would buy this if i were you . + they were listening to his speech with open ears . + two hundred dollars . + how much for a night ? + where 's the nearest ? + how long is the carry over that ? + surely sir , but what happened to you ? + i want something that looks more natural . + should i avoid any types of food while taking this medicine ? + will i have any difficulty with the customs ? + do you have dress shoes ? + may i have some red wine ? + you 'll get it at the gate . + tell me when we get to the museum . + does this bus go to the sheraton hotel ? + what does that come to ? + it 's a little bit hot . + how many blocks from here ? + just a shower is okay . + my eyes are . + no . + may i suggest a twin for single use instead ? we have one . + my car is out of order . + i can n't guarantee that , but we will try our best . + i 'd like a tight perm , please . + the sea was seen far below . + she wants a beer . + you need an operation . + more eggs , please . + where is the bus stop for the central park ? + ? + do you have any tickets left for " miss saigon " tomorrow 's matinee ? + here 's your key , sir . + room fifty- six twelve . + how many tablets does it ? + i love your sweater . + go ahead . + here we are . + this is your hotel . + when 's the basketball game on ? + good morning . + i 'm afraid i will need to see some form of identification . + what was your ? + certainly . + i 'm taking flight twelve to tokyo . + i 'd like to make a long distance call , please . + five months . + it is slow . + can i get a beer , please ? i 'd like another beer . + i 'd like a voltage shaver , please . + to new york ? + what days of the week does it take place ? + what kind of dressing ? + this is rather cold . + my gums are very sore . + i 'd like some . + sorry , this space is already taken . + can we see a menu ? + my size is six . + i 'm all right . + thank you , that 's enough . + any taxi would not stop unless you wait for them at the taxi stand . + my budget is under fifty dollars for a night . + will you take a picture together with me ? + how much is the service charge ? + did the in north america by more than five percent ? + where is the women 's clothing department ? + who 's your best friend ? + you did n't happen to be around the corner of twelfth and g about eight thirty tonight , did you ? + did you know that one of the grand of sumo , a kind of traditional japanese- style wrestling , is an american ? + sports day october tenth is a national holiday to the health of the people . + is this for wall street ? + i 'd like to rent it from the fifth to the tenth of december . + i left my valuables in the safety deposit box in my room . + all right . + do you want me to check under the ? + hello , i 'd like to make a reservation for two in july from the twenty- seventh through the thirty- first . + do you want the collision damage and personal accident insurance ? + sugar ? + can i pay with master card ? + the keys go here . + is this the place to pick up the baggage for nine o seven ? + i 'll have this brand . + can you recommend a good ? + guess who i ran into yesterday ? + there is a very good indian restaurant near the subway station . + i 'd like a carafe of red wine , please . + i 'm so happy to have been able to come to this country . + my name and address are on it . + could you help me find my suitcase ? + what kind of stone is this ? + i 'd like to point out that our government is being to the so- called boat people . + i realize that japan is already much too to let in those guests . + but , on the other hand , many of our industry need manual labor . + from that mountain , you can see the whole city . + during this season , many different kinds of flowers are . + they are very beautiful . + more fruit , please . + do you have a ? + you can try on or hold them if you want . + follow me . + i think i left it near the cashier . + no , they to their children . + some japanese parents can n't say no to them . + i enjoyed my stay with you . + please tell him that yamada called . + how can i get to the twin by subway ? + okay . thank you . + please take your key with you when you go out , sir . + would you make arrangements in advance ? + i would like a reservation for two , please . + i 'd like a cigarette lighter . + all right , please fill out this information here . + which would you like , beef , chicken or fish ? + we 'd like to make a reservation for two for the tour . + is it possible to take different going and coming back ? + is there a snack bar here ? + excuse me , sir . + i 'd like to do some sightseeing in boston . + sorry to bother you , but will we make it before the game starts ? + can i listen to this cassette ? + do you have a menu in japanese ? + service . + recently my is dull and foundation does n't hold . + it 's five after one . + can you shorten the waist ? + this is not our order . + i think it 's for the next table . + i 'm being . + thank you . + i 'd like a pain- . + who is your favorite ? + i 'd like an one . + what sort of music do they play there ? + i do n't like the color . + show me another one , please . + where 's the nearest casino ? + are by far the most convenient for trips from tokyo to hokkaido , and kyushu . + please take me to the morning market . + to the ford museum , please . + the of my glasses is broken . + there are so many shopping . + from three o 'clock . + can i exchange the battery ? + great . + i have a window seat . + uh , if you 'd like to trade seats later , miss . + where is the closest hospital from here ? + i hope you 'll like it . + i enjoyed the sightseeing of new york yesterday . + i 'm interested in the blue handbag in the window . + it 's eight dollars a person . + contact your when you have any problems . + give me a shampoo and style it as it is now , please . + there 's no more soap . + when you get there , ask someone else , please . + mr. yes , a single room for two nights ? + please tell me the fastest way to go to san francisco . + what 's your opinion ? + can i send this box to japan ? + i had an accident . + may i have the key to room two fifteen ? + excuse me . + just write your room number and sign here . + i 'm up . + the color is all right , but the size is wrong . + we are waiting for you that day . + well then , i guess i 'll have to get it next time . + we have enough to last us for a couple of days . + i do n't understand this . + all right . + how can i get back to my destination ? + is this from tax ? + well , they have to play extra until the tie is broken . + i 'd like extension twenty- four , please . + could you spell it ? + is this a shorter way to the market ? + do n't make it too , please . + is there anything on sale ? + here are two dollars . keep the change . + when is dinner ? + i 'm afraid that 's too much for me . + where do i get off to go to union square ? + how much will it be without a cover ? + you can ask at the rental board stand over there . + well , last night there was a very good show on tv . + there 's so much to choose from . + hi , . + the doctor can see you now . + please wait until we call you . + i 'm interested in going to a sale . + i 'm on holiday . + period now . + no . i plan to visit paris on my way home . + will you take it with you or shall we send it ? + the flight number is one o three to tokyo , on the second of april . + recently there 's quite a gourmet , is n't there ? + it 's been about six hours now . + delta airlines flight one one two . + boarding is delayed . + could you give me a twin for tonight ? + would you write a statement about the robbery for my insurance company , please ? + as i 'm weak in camera , i think the to- shoot camera may be better for me . + is this the right platform to new york ? + have a nice vacation . + i left my bag in your theater . + we 'd better take an x- ray just to make sure . + is there a subway ? + please give me some . + i 'd like a baked potato with cream , please . + yes , every ten minutes . + one hamburger and one cheeseburger , please . + do i have to pay for to and from the airport ? + i want to have the same style as , please . + which has the better view , this road or this road ? + how much do you charge for ? + we each would like to pay for our own meals . + i 'd like some waterproof matches . + i 'm checking out tomorrow morning . + i 'm going there , too . + have a seat and make yourself at home . can i get you something to drink ? coffee , tea or a soda ? + that 's very nice of you to say that . + the location was on a chair in the lobby . + roast beef , please . + please wrap it up . + when will a table become available ? + yes , i know . + but i 'd like you to connect me with my friend , because i cannot in chinese . + can i still change my order ? i 'd like the dover sole instead of the rock oysters . + do you know the size of these shoes in centimeters ? + please change these yen into pounds . + i 'd like to buy some presents . + two adults for + what 's an ? + why do n't we settle this matter in a way ? + will you give me the with the details of medical treatment ? + take out , please . + i 'm going out . + here is my room key . + make it a little cheaper . + is there a police box a little way ahead ? + take me to this address . + i 'll give you an . + can i send a ? + i 'd like a sized dictionary , please . + , please . + no , not yet . + but it 's the very film that i want to see . + well , i do n't know . + congratulations , i understand you were to president . + the day after tomorrow evening . + i live in japan . + round trip ticket to chicago , please . + please wrap it . + would you like some bacon or ham with your eggs ? + is n't there a mistake in receipt ? i think it 's more expensive than it should be . + i 'm always . + for studying . + please be quick . + for two people at seven . + the name is watanabe . + excuse me , sir . + see you again . + i 'm sorry , i can n't speak english . + the air- conditioner does n't work . + it 's like this every monday . + please go to the international departure lobby . + have a nice flight . + do you have any tours to paris on the ? + my watch . + it was a . + i brought my doctor 's medical certificate from japan . + it will be our pleasure to serve you the drink of your choice , by dinner . + a complete guide of the drinks we offer on this flight is located in the information guide of our magazine . + the does n't work . + nothing more , thank you . + do you live around here ? + could you send it to japan ? + where 's the gift shop ? + please repeat that , slowly . + he is not what he seems to be . + he is a cold , man . + i will change flights if you give me five thousand miles . + can i get back to you with an answer this friday ? + well , let me check the lost and found . + i 'm very sorry , we 're preparing the room you wanted . + i 'd like to send this postcard by air mail . + oh , it shows subway stations and bus stops . + ah , i miss . + where does it start from ? + i 'm on highway one near bay . + she speaks english well , does n't she ? + i 'll have the ice cream . + yes , we have . + a half day course and a full day course . + i would recommend an earrings . + i 'd like an alarm clock , please . + i want to cancel my reservation , please . + two reserved seat tickets to washington d.c. at eight o 'clock , please . + what 's the refund system ? + please change this one hundred dollar into one fifty dollar bill and five ten dollar bills , please . + at what age is it allowed to play slot machines ? + the lights do n't work . + by the way , my name is hiroshi . + what kind of food is this ? + what 's the time difference between tokyo and here ? + this train stops at lake , does n't it ? + no , it 's for my personal use . + how much is it in all ? + thank you , sir . + go straight and turn right at the third corner . + for what time ? for how many ? may i have your name ? + i have a sharp pain in my stomach . + most japanese eat and . + i see . + i 'll be happy to take you to the record shop . + show me the wine list , please . + did you see that ? + it 's a present . + i 'd like coins of all sizes , please . + good afternoon , mrs. kent . + long time no see . + he 's got a gun . + can i have two second class tickets to chicago , please ? + the pleasure was mine . + can you make a reservation for me ? + i went to new york . + you can sit outside , too . + when does the train leave for manchester ? + i 'd like to change my reservation for flight two- five on october second . + what 's the flight number ? + take a . + do i pay for the gas ? + where is the delta 's check- in counter ? + is this a low meal ? + i 'd like half a bottle of red wine . + this item is not . + do we have to wait long ? + i think we can . + here 's your slip . + what do you take off last , before getting into bed ? + when does the bank open ? + yes . + i 'd like the breakfast on your menu , please . + do i have time to eat ? + can you keep my bag ? + no , i 'm going to get it during my stay . + is it ? + is this a specialty of this district ? + i 'd like some . + your boarding gate has been changed to gate seven . + one for new york , please . + are you sure you really can n't go tomorrow ? + twelve hundred dollars in traveler 's checks , three hundred dollars and fifty thousand yen in cash . + and mine are the best in chicago . + for about a few days . + the second to the left . + they are too small . + who is in charge of this section ? + i put all my things into that suitcase . + okay . + how difficult are the tours ? + do you have ladies ' sunglasses ? + i would like a seat near the window , please . + i can n't see things in the evening . + can i get on with a ? + how long does it take to reach japan ? + do you have road maps ? + oh , yes . + i read about him in the guidebook . + they 're on the basement . + i ordered three cups of tea . + but we only got two . + electric appliances are very cheap , but food and expenses are very high . + to take away . + we 'll be arriving at in a few minutes . + i usually take size twenty- two in japan . + when are the hours of the art museum ? + do you mind if i take some pictures through the window ? + please package carefully so that it will not be damaged . + i 'd like to change my reservation on jal four zero o two to tokyo on the fifth . + where should i pay ? + this card , okay ? + collect call to miss , phone number japan zero one two three four five six seven eight nine . + this is not what i ordered . + watch your ball carefully . + is this your first trip abroad ? + could you speak louder , please ? + which is the beginners ' course ? + thanks . + this country sure has many kinds of fruit . + i 'd like to check in this suitcase . + okay , in thirty minutes , we 'll have them ready . + are meals available at the ski of that slope ? + excuse me , i have locked myself out . + do you go through ? + exchange these u.s. dollars to japanese yen , please . + you are on the green . + it is hard to say good- bye . + is this the reception desk ? is there a clinic nearby ? + excuse me , may i ask you the name of your dish ? that looks delicious . + they . + ten dollars worth of gas , please . + which gate do i go to next ? + will ten dollars be enough by taxi ? + okay . + come this way , please . + i thought it was good and a great . + wow , thanks a lot . + i 'm not happy with this room . + it 's the latest style this summer . + take me to the center of town , please . + the bellboy is a little too friendly with me . + i 'll bet he 's after a tip . + do you have any special desserts ? + can i rent a car ? + this tastes strange . + i 'm looking for pants without any . + while i 'm out , please repair it . + he 's still a high school student . + do you have some snack ? + please speak slowly . + i 'm coming an hour late . + could you please do a over for me ? + i 'm ken . + yes . + wait , i 'll bring one for you . + waiter . + has it been all this week ? + tokyo . + area code zero three . + the number is one two three four five six seven . + mrs. tanaka . + half bottle , please . + do they have live performances ? + see you on wednesday . + i want plain in brown . + and ? + i want to stay under thirty dollars . + oh , i 'm sorry . + i 'll check on it right away . + can i see that briefcase ? + do you have anything else ? + you need rest . + please send it to this address . + what do you call that ? + please fill out this landing card and customs form . + it 's two dollars and fifty cents . + does this car go to seattle ? + do i pay part of the charge now ? + is it real or artificial ? + would you wait for me here ? + where 's the mail box ? + oh , thanks . + i was just looking for it . + just a moment , please . + i 'll connect you with the overseas operator . + is the price still ? + cash or charge ? + i 'm a total stranger to this place . + not really . + just something not expensive . + can it be machine or hand washed at home ? + i 'd like a box of water colors , please . + i 'm sorry . + i 'd like to change the date to may nineteenth . + please sign here , and here is your receipt for your records . + i 'd like some stockings . + i 'd like some lamb . + are you looking for something ? + i want to take a bus to station . + can you break this into four quarters please ? + four nights . + which do you want for dinner , beef or chicken ? + i need some socks . + my name is ichiro tanaka . + i 'll be right there . + we have a flight going to atlanta with a connection out of san francisco . + it 's very low in . + only thirty . + i want to reserve room . + where in japan are you from ? + it 's our understanding that you various types of shops in europe . + unfortunately , he 's very busy on that day . + in that case , i 'd recommend this one . + i find it difficult to understand the decision to the new plant in singapore . + room service . + attention , please . + can you make it cheaper because there are some ? + temple in kyoto is well- known for its rock garden . + do you have any stamps ? + this is room three seventeen . + could you get me to the station in fifteen minutes ? + we need a deposit for the car . + a man into me . + after that i my wallet was gone . + there are no vacancies in single rooms but we have a double room . + is this ticket valid only for the day ? + can i buy tickets for a sightseeing bus here ? + what time does it arrive at ? + do you have someone who speaks japanese ? + which channel is the popular music on ? + my baby takes the morning train . + delta airlines . + i 'd like a pot of coffee . + does it have a bath and a toilet ? + time is up . + can i use the room till four p.m. ? + i heard mr. yamada has two children . + which gate should i go ? + i 'd like to hire a boat . + can you find it ? + can you do the dishes later ? + i 'd like a gas . + i can issue it in three days . + can you change american dollars into sterling pound ? + i really like this , but i want to look at other items too . + the do n't work . + certainly , sir . + i never liked , either . + i am not formally dressed . + please just bring yourself next time . + three bottles of japanese sake . + i 'm not sure if i 've packed enough clothes for a three- week trip . + two dollars each . + they do n't have coffee shops like they do in japan . + who is in it ? + it is mine . + we 'll make sure the brochures are to you . + there 's something wrong with the brake lights . + will you help me ? + please show me some leather gloves . + the car broke down . please send someone for it . + could you recommend a picture book for a six- year- old ? + could you keep my valuables , please ? + hi , . + thank you for inviting us . + well , we 'd like to try a white wine . + certainly , ma 'am . + for dates , they go to movies . + is this guaranteed not to when washed ? + i had about one hundred dollars in it . + the waist needs taking in by three centimeters . + what about trying on these earrings ? + my mistake . + no , i 'm in a hurry . + i 'd like some . + here 's my business card . + any import cds ? + i 'm back . + a key for number eight o two , please . + i 'm going to study english conversation . + can i have more soup ? + have you read any good books recently ? + can you recommend a hotel which is not too expensive ? + i 'll stay with a friend in new york . + can i make an appointment for tomorrow ? + if anyone for me , tell them i 'll be in the coffee shop . + i 'm sure i had it in the inside pocket of my coat . + do you have somewhere where i can leave my luggage ? + i 've come here on business . + is this one two three four five six seven ? + do you know any good diving school ? + how much is the price with tax ? + give me some . + next door is too noisy . + well , dr. nobody without an appointment . + may i have the name and the number of the party you 're calling ? + a gift ? + will the airline pay for me to buy some personal necessities ? + it 's the airlines ' fault . + going to the grand hotel ? + there 's nobody here by that name . + where is the policeman , please ? + may i borrow some gum tape ? + can i return the car to any of your offices ? + i 'd like a room with bath . + excuse me , my suitcase is missing . + i came on abc flight zero zero seven . + nothing came out of the machine ? + is this guaranteed ? + i only have a dollar bill . + please keep the change . + what 's your ? + it 's at the end of the on the seventh floor . + take the elevator on your right , please . + do you have a sightseeing brochure for this town ? + no , actually , people call me . + we are at jones street station . + i never think of going to classical concerts when i 'm in japan . + there should be a restaurant called captain cook 's around here . + i heard the food is great . + oh , here it is . + has there been any work done on the engine ? + one dollar , please . + what would you have for dessert ? + let 's fly lower . + could you explain this dish to me ? + you were supposed to take flight eight two zero , which took off fifteen minutes ago . + all right . + i can arrange another flight for you . + here it is . + your seats are located around here . + at the sheraton . + he 's on a business trip until next friday . + my wife and i are very happy you 're coming to stay with us over the weekend to experience american life in the country . + it 's the next one to the right . + someone my parcel . + yes , please . my name 's . until when can you hold my ticket ? + if there 's anything i can do for you , please let me know . + where can i buy a lift ticket ? + it 's six hundred dollars a month plus one month 's deposit , and another month 's fee for our . + do you prefer a or a coat ? + oh , it 's nothing . + you 're here , anyway . + japan airlines , flight number one two three . + i need to buy shampoo . + i 'd like this style . + could you tell me when we get to the center ? + i 'll get back to you with the change . + no i do n't . + what nice . + do you have a nice jacket for about one hundred dollars ? + where 's the nearest ? + she is thirty , more or less . + all right . + by the look of it , you seem to have picked up some sort of . + can i get a receipt , please ? + there are three of us . + i see . + how ' joining me for a drink ? + what 's my room number ? + should i sign ? + can i have two second floor seats for this evening ? + i locked my key in my room . + does it include the tax ? + excuse me . + what time does the post office open ? + we 'd like to stay for four nights from august first . + as this bag is made of , it 's very strong and design as you may notice . + the food is very good , but i 've had enough . + thanks . + my wallet was in the subway . + i have to go to the japanese embassy . + what 's the name of that flower ? + could n't you give it to me for a little less ? + is this for chicago ? + i did n't know this was a drug at all . + i 'm leaving one day earlier . + please cash this traveller 's check . + mrs. suzuki in room twelve thirty- four . + i 've had a fever since the day before yesterday . + my throat hurts badly . + i can n't keep any food down . + it is a big from the season . + it 's over here , on the wall , and the switch for the air conditioner is here . + i 'd like a seat in the rear of the plane . + september fifteenth is the- day . + is there a night cruise ? + where is the tower ? + can i get there in time if i leave here right now ? + there is no soap in my room . + okay . but i hope it will n't take long . + where 's the air france counter ? + can you make out the form for me ? + my order has n't come yet . + i bought this bag a little while ago , but the was broken . + i was impressed by the beautiful view of the city at night . + you follow ? + please come back to the bus by three . + of people visit famous shrines for the year 's first . + show me your driver 's license , please . + the plane will take off one thirty . + if it 's possible , i 'd like a table by the window . + i must n't drink anything containing salt . + you caught the flu . + i 'd like an aisle seat , please . + please give me an estimate . + that 's fine , thanks . + is there anything i could take for this rash ? + can you change the to what you 've just said ? + what time shall we take it up to you ? + where can i get a map of this city ? + i 'm going to attend university of south california for a year . + i have two ten thousand yen notes . + i 'm sorry they are sold out . + are many to experience a party ? + what does it ? + i 'd like to send this picture postcard to japan . + no , you do not have to make a reservation . + just drop in . + thank you . + here 's your room key . + the porter will take your baggage . + i 'm afraid i 'm suffering from food . + can i pick this up ? + keep my baggage , please . + i 'd like to rent a middle size car with four doors . + could you fix the lamp ? + where can i buy ? + my shirt is . + will you transfer this call to the general section ? + how long will it take to order ? + i understand what you mean . + how much yen do you have , sir ? + hello . + i have a reservation . + pass the salt and pepper , please . + i made a reservation through the tokyo office . + i 'll be a little late checking in tonight . + let 's do the shopping in a hurry . + i requested a non- smoking seat when i checked in , but this is a smoking seat . + let 's go for a drink . + i suggest you have this kind of fish , a red . + i 'm much to be invited here . + would you change this for a second class one , please ? + would you speak a little louder , please ? + i can n't do that , but i 'll in a case for you . + is there a set time and place ? + thank you very much . + i 'd love to , but i 'm afraid i have a previous appointment . + how long is it going to be before it comes out ? + in america college football is all the . + i 'll give you a . + would you tell me when the train gets to oxford ? i 'm afraid i may ride past there . + oh , bill . + i like you , but that 's all . + you 're me . + i 'd like to make sure of the time it leaves . + does the one twenty train for dover run everyday ? + i do n't think i can be of much help to you . + where 's the sports ? + this size here , the one you call regular size , will do . + what floor is the shoes section on ? + include everything ? + cross the street there and go straight until you come to the second intersection . + k hotel is beyond the intersection . + i want something for a hangover . + low fat ? no way . + where will the tour end , and when ? + well , i do n't know if i care for that . + children receive new year 's gifts . + please post this envelope at the airport . + i 'd like something for . + we have some very good today . + the first one hundred miles are free , then you 'll have to pay ten cent per mile . + the bath is too hot for me to get in . + in spring the cherry trees blossom . + could you ask him to stop smoking , over there ? + this coming friday ? + i 'll call him again . + he 's not one to get into such a place . + i have a tooth . + i 'd prefer a cup of coffee , if you do n't mind . + okay . + may i have some toast ? + i 'm going to stay with my friend in los angeles . + will you bring me cream for my coffee ? + it 's out of stock . + do i need an express ticket ? + here are my phone number and e- mail address . + where are you from ? + how old is that church ? + could you get me a ticket for the opera ? + do you know this city very well ? + i have n't gotten my salad . + do you have any sightseeing bus tours of the city ? + i 'm sorry . + i 'm a stranger here myself . + it really is . + if you would like to borrow any of my books , please let me know . + i really do n't mind them to friends . + this is all i have . + what about ? do you the rooms when a in ? + i would like to return this . + i wish to do some work . + we are sorry , but poached eggs are n't available . + where can i get my baggage for flight jal five o one ? + how much tax refund will i get ? + i can n't find it . + can i have mashed potatoes without ? + it 's one kind of shell from the sea . + why are you visiting the united states ? + will you change the napkin ? + i can give you a ford seven years old for fifty dollars a week with unlimited mileage . + oh , yes . + here you are . + i would like to come back here again when i am in the states . + i have a dull pain here . + you 'll be given first aid . + i have completely my health . + please show me this one , the fourth from the right . + it 's best to close your eyes to them . + what 's your special for today ? + nice to meet you again . + is it clear ? + my wallet 's been stolen . + where should i change trains to get to edinburgh ? + this is against the gun and law . + the door does n't open with this key . + i 'd like it . + no problem . + shall we in at the first- class restaurant ? + how nice . + you must be looking forward to seeing them . + i would like to put this in a safety deposit box . + which tour is best for seeing ? + please call a porter . + could you tell me the time and date and the number of persons ? + where can i change my money ? + i 'm at a loss for words . + can you fix it and send it to japan , please ? + we only do . + we do n't do refunds . + right . + i have to report a theft . + you can just give me three dollars . + could i try this on ? + do you take any medicine on a regular ? + i still cannot find one of my bags that i checked at narita airport . + i believe i am . + a haircut , please . + what kind of treatment are you ? + i want to report a strange person at my window . + a light meal , please . + i had about two hundred dollars in cash and a visa card . + i believe it is at seven forty- five a.m. on friday , the sixteenth . + so , have you been driving taxis for a long time ? + now , we are going to take a picture of our whole group . + from seven to nine . + please come to the restaurant on the second floor . + i 'm going to stay at the holiday inn downtown till may fifth . + two second class tickets for venice , please . + what do they make to in the exam ? + you are almost there . + two for the bar , please . + all the passengers seated . + what bus do i take to the washington ? + my name is akiko tanaka . + could you issue a new one , please ? + do you have window tables ? + temple which is the building in the world is worth seeing . + i see . + well , thank you for taking so much time . + how about indian food ? have they had it before ? + i 'm glad . + oh , that 's my flight announcement . + please put your belongings under you seat . + yeah . + anytime . + they 're all welcome here . + the seats for two can be turned around . + so , you can sit face to face if you like . + i need to buy insurance . + when does it ? + may we leave our things , except valuables , in the bus ? + what is jr ? + break this into smaller bills , please . diff --git a/examples/rnnlm-hsm.cc b/examples/rnnlm-hsm.cc new file mode 100644 index 000000000..766cebc83 --- /dev/null +++ b/examples/rnnlm-hsm.cc @@ -0,0 +1,230 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/timing.h" +#include "cnn/rnn.h" +#include "cnn/gru.h" +#include "cnn/lstm.h" +#include "cnn/dict.h" +#include "cnn/expr.h" +#include "cnn/hsm-builder.h" + +#include +#include +#include + +#include +#include + +using namespace std; +using namespace cnn; + +unsigned LAYERS = 2; +unsigned INPUT_DIM = 256; //256 +unsigned HIDDEN_DIM = 256; // 1024 +unsigned VOCAB_SIZE = 0; + +cnn::Dict d; +int kSOS; +int kEOS; + +template +struct RNNLanguageModel { + LookupParameters* p_c; + Builder builder; + HierarchicalSoftmaxBuilder& hsm; + explicit RNNLanguageModel(Model& model, HierarchicalSoftmaxBuilder& h) : + p_c(model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), + builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), + hsm(h) {} + + // return Expression of total loss + Expression BuildLMGraph(const vector& sent, ComputationGraph& cg) { + const unsigned slen = sent.size() - 1; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + hsm.new_graph(cg); + //Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter + //Expression i_bias = parameter(cg, p_bias); // word bias + vector errs; + for (unsigned t = 0; t < slen; ++t) { + Expression i_x_t = lookup(cg, p_c, sent[t]); + // y_t = RNN(x_t) + Expression i_y_t = builder.add_input(i_x_t); + Expression i_err = hsm.neg_log_softmax(i_y_t, sent[t+1]); + errs.push_back(i_err); + } + Expression i_nerr = sum(errs); + return i_nerr; + } + + // return Expression for total loss + void RandomSample(int max_len = 150) { +#if 0 + cerr << endl; + ComputationGraph cg; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + vector errs; + int len = 0; + int cur = kSOS; + while(len < max_len && cur != kEOS) { + ++len; + Expression i_x_t = lookup(cg, p_c, cur); + // y_t = RNN(x_t) + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = affine_transform({i_bias, i_R, i_y_t}); + + Expression ydist = softmax(i_r_t); + + unsigned w = 0; + while (w == 0 || (int)w == kSOS) { + auto dist = as_vector(cg.incremental_forward()); + double p = rand01(); + for (; w < dist.size(); ++w) { + p -= dist[w]; + if (p < 0.0) { break; } + } + if (w == dist.size()) w = kEOS; + } + cerr << (len == 1 ? "" : " ") << d.Convert(w); + cur = w; + } + cerr << endl; +#endif + } +}; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + if (argc != 4 && argc != 5) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt clusters.txt [model.params]\n"; + return 1; + } + kSOS = d.Convert(""); + kEOS = d.Convert(""); + Model model; + HierarchicalSoftmaxBuilder hsm(HIDDEN_DIM, argv[3], &d, &model); + vector> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + training.push_back(ReadSentence(line, &d)); + ttoks += training.back().size(); + if (training.back().front() != kSOS && training.back().back() != kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + d.Freeze(); // no new word types allowed + VOCAB_SIZE = d.size(); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + ++dlc; + dev.push_back(ReadSentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() != kSOS && dev.back().back() != kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + ostringstream os; + os << "hsmlm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + bool use_momentum = false; + Trainer* sgd = nullptr; + //if (use_momentum) + // sgd = new MomentumSGDTrainer(&model); + //else + sgd = new SimpleSGDTrainer(&model); + + RNNLanguageModel lm(model, hsm); + //RNNLanguageModel lm(model, hsm); + if (argc == 5) { + string fname = argv[4]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 10; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& sent = training[order[si]]; + chars += sent.size() - 1; + ++si; + lm.BuildLMGraph(sent, cg); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(); + ++lines; + } + sgd->status(); + cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + lm.RandomSample(); + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + int dchars = 0; + for (auto& sent : dev) { + ComputationGraph cg; + lm.BuildLMGraph(sent, cg); + dloss += as_scalar(cg.forward()); + dchars += sent.size() - 1; + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } + } + delete sgd; +} + From 38d096821b267c6a8ba8ac70422465f462ceae6d Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 22 Nov 2015 02:19:14 -0500 Subject: [PATCH 321/965] only create necessary params --- cnn/hsm-builder.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cnn/hsm-builder.cc b/cnn/hsm-builder.cc index 1fabd225b..e3e13836b 100644 --- a/cnn/hsm-builder.cc +++ b/cnn/hsm-builder.cc @@ -22,8 +22,12 @@ HierarchicalSoftmaxBuilder::HierarchicalSoftmaxBuilder(unsigned rep_dim, for (unsigned i = 0; i < num_clusters; ++i) { auto& words = cidx2words[i]; // vector of word ids const unsigned num_words_in_cluster = words.size(); - p_rc2ws[i] = model->add_parameters({num_words_in_cluster, rep_dim}); - p_rcwbiases[i] = model->add_parameters({num_words_in_cluster}); + if (num_words_in_cluster > 1) { + // for singleton clusters, we don't need these parameters, so + // we don't create them + p_rc2ws[i] = model->add_parameters({num_words_in_cluster, rep_dim}); + p_rcwbiases[i] = model->add_parameters({num_words_in_cluster}); + } } } From 42b153f74e5a9664cb61a43ca0614ec19b1c2773 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 22 Nov 2015 18:50:20 -0500 Subject: [PATCH 322/965] sample from HSM --- cnn/hsm-builder.cc | 30 ++++++++++++++++++++++++++++++ cnn/hsm-builder.h | 3 +++ examples/rnnlm-hsm.cc | 21 +++------------------ 3 files changed, 36 insertions(+), 18 deletions(-) diff --git a/cnn/hsm-builder.cc b/cnn/hsm-builder.cc index e3e13836b..45dc4b908 100644 --- a/cnn/hsm-builder.cc +++ b/cnn/hsm-builder.cc @@ -43,6 +43,7 @@ void HierarchicalSoftmaxBuilder::new_graph(ComputationGraph& cg) { } Expression HierarchicalSoftmaxBuilder::neg_log_softmax(const Expression& rep, unsigned wordidx) { + // TODO assert that new_graph has been called int clusteridx = widx2cidx[wordidx]; assert(clusteridx >= 0); // if this fails, wordid is missing from clusters Expression cscores = affine_transform({cbias, r2c, rep}); @@ -58,6 +59,35 @@ Expression HierarchicalSoftmaxBuilder::neg_log_softmax(const Expression& rep, un return cnlp + wnlp; } +unsigned HierarchicalSoftmaxBuilder::sample(const expr::Expression& rep) { + // TODO assert that new_graph has been called + Expression cscores = affine_transform({cbias, r2c, rep}); + softmax(cscores); + auto cdist = as_vector(pcg->incremental_forward()); + unsigned c = 0; + double p = rand01(); + for (; c < cdist.size(); ++c) { + p -= cdist[c]; + if (p < 0.0) { break; } + } + if (c == cdist.size()) --c; + unsigned w = 0; + if (!singleton_cluster[c]) { + Expression& cwbias = get_rc2wbias(c); + Expression& r2cw = get_rc2w(c); + Expression wscores = affine_transform({cwbias, r2cw, rep}); + softmax(wscores); + auto wdist = as_vector(pcg->incremental_forward()); + p = rand01(); + for (; w < wdist.size(); ++w) { + p -= wdist[w]; + if (p < 0.0) { break; } + } + if (w == wdist.size()) --w; + } + return cidx2words[c][w]; +} + inline bool is_ws(char x) { return (x == ' ' || x == '\t'); } inline bool not_ws(char x) { return (x != ' ' && x != '\t'); } diff --git a/cnn/hsm-builder.h b/cnn/hsm-builder.h index c0eb4f420..ae4fcbe4a 100644 --- a/cnn/hsm-builder.h +++ b/cnn/hsm-builder.h @@ -27,6 +27,9 @@ class HierarchicalSoftmaxBuilder { // -log(p(c | rep) * p(w | c, rep)) expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx); + // samples a word from p(w,c | rep) + unsigned sample(const expr::Expression& rep); + private: void ReadClusterFile(const std::string& cluster_file, Dict* word_dict); Dict cdict; diff --git a/examples/rnnlm-hsm.cc b/examples/rnnlm-hsm.cc index 766cebc83..4925a9c5d 100644 --- a/examples/rnnlm-hsm.cc +++ b/examples/rnnlm-hsm.cc @@ -60,9 +60,9 @@ struct RNNLanguageModel { // return Expression for total loss void RandomSample(int max_len = 150) { -#if 0 cerr << endl; ComputationGraph cg; + hsm.new_graph(cg); builder.new_graph(cg); // reset RNN builder for new graph builder.start_new_sequence(); vector errs; @@ -73,25 +73,10 @@ struct RNNLanguageModel { Expression i_x_t = lookup(cg, p_c, cur); // y_t = RNN(x_t) Expression i_y_t = builder.add_input(i_x_t); - Expression i_r_t = affine_transform({i_bias, i_R, i_y_t}); - - Expression ydist = softmax(i_r_t); - - unsigned w = 0; - while (w == 0 || (int)w == kSOS) { - auto dist = as_vector(cg.incremental_forward()); - double p = rand01(); - for (; w < dist.size(); ++w) { - p -= dist[w]; - if (p < 0.0) { break; } - } - if (w == dist.size()) w = kEOS; - } - cerr << (len == 1 ? "" : " ") << d.Convert(w); - cur = w; + cur = hsm.sample(i_y_t); + cerr << (len == 1 ? "" : " ") << d.Convert(cur); } cerr << endl; -#endif } }; From 28341a5d7a86dbe92c2ddb872ef92ea7f0581a83 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 24 Nov 2015 01:44:43 -0500 Subject: [PATCH 323/965] rename HSM CFSM --- .gitignore | 1 + cnn/CMakeLists.txt | 4 ++-- cnn/{hsm-builder.cc => cfsm-builder.cc} | 12 ++++++------ cnn/{hsm-builder.h => cfsm-builder.h} | 10 +++++----- examples/{rnnlm-hsm.cc => rnnlm-cfsm.cc} | 0 5 files changed, 14 insertions(+), 13 deletions(-) rename cnn/{hsm-builder.cc => cfsm-builder.cc} (90%) rename cnn/{hsm-builder.h => cfsm-builder.h} (88%) rename examples/{rnnlm-hsm.cc => rnnlm-cfsm.cc} (100%) diff --git a/.gitignore b/.gitignore index 72f35b05d..5724586f1 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ Makefile CMakeCache.txt CMakeFiles cmake_install.cmake +pycnn/pycnn.cpp # binaries examples/embed-cl diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 9069c1f16..680d0a40c 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -1,6 +1,7 @@ # ########## cnn library ########## # Sources: set(cnn_library_SRCS + cfsm-builder.cc cnn.cc conv.cc deep-lstm.cc @@ -12,7 +13,6 @@ set(cnn_library_SRCS grad-check.cc graph.cc gru.cc - hsm-builder.cc init.cc lstm.cc model.cc @@ -31,6 +31,7 @@ set(cnn_library_SRCS # Headers: set(cnn_library_HDRS aligned-mem-pool.h + cfsm-builder.h c2w.h cnn.h conv.h @@ -45,7 +46,6 @@ set(cnn_library_HDRS gpu-ops.h graph.h gru.h - hsm-builder.h init.h lstm.h model.h diff --git a/cnn/hsm-builder.cc b/cnn/cfsm-builder.cc similarity index 90% rename from cnn/hsm-builder.cc rename to cnn/cfsm-builder.cc index 45dc4b908..191dfec78 100644 --- a/cnn/hsm-builder.cc +++ b/cnn/cfsm-builder.cc @@ -1,4 +1,4 @@ -#include "cnn/hsm-builder.h" +#include "cnn/cfsm-builder.h" #include #include @@ -9,7 +9,7 @@ namespace cnn { using namespace expr; -HierarchicalSoftmaxBuilder::HierarchicalSoftmaxBuilder(unsigned rep_dim, +ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, Dict* word_dict, Model* model) { @@ -31,7 +31,7 @@ HierarchicalSoftmaxBuilder::HierarchicalSoftmaxBuilder(unsigned rep_dim, } } -void HierarchicalSoftmaxBuilder::new_graph(ComputationGraph& cg) { +void ClassFactoredSoftmaxBuilder::new_graph(ComputationGraph& cg) { pcg = &cg; const unsigned num_clusters = cdict.size(); r2c = parameter(cg, p_r2c); @@ -42,7 +42,7 @@ void HierarchicalSoftmaxBuilder::new_graph(ComputationGraph& cg) { rc2biases.resize(num_clusters); } -Expression HierarchicalSoftmaxBuilder::neg_log_softmax(const Expression& rep, unsigned wordidx) { +Expression ClassFactoredSoftmaxBuilder::neg_log_softmax(const Expression& rep, unsigned wordidx) { // TODO assert that new_graph has been called int clusteridx = widx2cidx[wordidx]; assert(clusteridx >= 0); // if this fails, wordid is missing from clusters @@ -59,7 +59,7 @@ Expression HierarchicalSoftmaxBuilder::neg_log_softmax(const Expression& rep, un return cnlp + wnlp; } -unsigned HierarchicalSoftmaxBuilder::sample(const expr::Expression& rep) { +unsigned ClassFactoredSoftmaxBuilder::sample(const expr::Expression& rep) { // TODO assert that new_graph has been called Expression cscores = affine_transform({cbias, r2c, rep}); softmax(cscores); @@ -91,7 +91,7 @@ unsigned HierarchicalSoftmaxBuilder::sample(const expr::Expression& rep) { inline bool is_ws(char x) { return (x == ' ' || x == '\t'); } inline bool not_ws(char x) { return (x != ' ' && x != '\t'); } -void HierarchicalSoftmaxBuilder::ReadClusterFile(const std::string& cluster_file, Dict* word_dict) { +void ClassFactoredSoftmaxBuilder::ReadClusterFile(const std::string& cluster_file, Dict* word_dict) { cerr << "Reading clusters from " << cluster_file << " ...\n"; ifstream in(cluster_file); assert(in); diff --git a/cnn/hsm-builder.h b/cnn/cfsm-builder.h similarity index 88% rename from cnn/hsm-builder.h rename to cnn/cfsm-builder.h index ae4fcbe4a..55f6e3b2b 100644 --- a/cnn/hsm-builder.h +++ b/cnn/cfsm-builder.h @@ -14,12 +14,12 @@ struct Parameters; // helps with implementation of hierarchical softmax // read a file with lines of the following format // CLASSID word [freq] -class HierarchicalSoftmaxBuilder { +class ClassFactoredSoftmaxBuilder { public: - HierarchicalSoftmaxBuilder(unsigned rep_dim, - const std::string& cluster_file, - Dict* word_dict, - Model* model); + ClassFactoredSoftmaxBuilder(unsigned rep_dim, + const std::string& cluster_file, + Dict* word_dict, + Model* model); // call this once per ComputationGraph void new_graph(ComputationGraph& cg); diff --git a/examples/rnnlm-hsm.cc b/examples/rnnlm-cfsm.cc similarity index 100% rename from examples/rnnlm-hsm.cc rename to examples/rnnlm-cfsm.cc From 68008e717f3bf7f54a3db199797ff9f00e02bd8f Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 24 Nov 2015 01:58:07 -0500 Subject: [PATCH 324/965] class factored softmax fix --- examples/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 2c618b386..853069125 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-hsm rnnlm-batch nlm textcat rnnlm2 mp read-write) +foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm2 mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if (WITH_CUDA_BACKEND) From b8dfeb9164a243bbd5aa270c30946765ab69c1da Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 25 Nov 2015 07:55:33 +0900 Subject: [PATCH 325/965] Batching now works on GPUs --- cnn/nodes.cc | 26 +++++++++++++++++++++----- cnn/param-nodes.cc | 4 ++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index fe96728e8..e55120dd7 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -821,8 +821,15 @@ void PickNegLogSoftmax::forward_impl(const vector& xs, Tensor& fx if (xs[0]->d.cols() == 1) { logz = (float*)fxs->allocate(sizeof(float)*fx.d.batch_elems()); #if HAVE_CUDA - assert(fx.d.batch_elems() == 1); - gpu::pnlsoftmax(xs[0]->d.size(), *pval, xs[0]->v, fx.v, logz); + if(pval) { + gpu::pnlsoftmax(xs[0]->d.size(), *pval, xs[0]->v, fx.v, logz); + } else { + // TODO: It'd be nice to have a kernel that did all batches at once + assert(pvals); + assert(pvals->size() == fx.d.batch_elems()); + for(unsigned b = 0; b < pvals->size(); ++b) + gpu::pnlsoftmax(xs[0]->d.batch_size(), (*pvals)[b], xs[0]->batch_ptr(b), fx.v+b, logz+b); + } #else if(pval) { auto x = **xs[0]; @@ -851,9 +858,18 @@ void PickNegLogSoftmax::backward_impl(const vector& xs, Tensor& dEdxi) const { if (xs[0]->d.cols() == 1) { #if HAVE_CUDA - assert(fx.d.batch_elems() == 1); - const auto elem = *pval; - gpu::pnlsoftmax_backward(dEdxi.d.size(), elem, xs[0]->v, dEdf.v, logz, dEdxi.v); + if(pval) { + const auto elem = *pval; + gpu::pnlsoftmax_backward(dEdxi.d.size(), elem, xs[0]->v, dEdf.v, logz, dEdxi.v); + } else { + assert(pvals); + assert(pvals->size() == fx.d.batch_elems()); + // TODO: Again, it would be nice to do this with a single kernel + for(unsigned b = 0; b < pvals->size(); ++b) { + const auto elem = (*pvals)[b]; + gpu::pnlsoftmax_backward(dEdxi.d.batch_size(), elem, xs[0]->batch_ptr(b), dEdf.v+b, logz+b, dEdxi.batch_ptr(b)); + } + } #else if(pval) { const auto elem = *pval; diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index 175aaa09d..15268c923 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -115,7 +115,11 @@ void LookupNode::forward_impl(const vector& xs, Tensor& fx) const unsigned i = pindices->at(b); assert (i < params->values.size()); float* v = fx.v + fx.d.batch_size() * (b % fx.d.batch_elems()); +#if HAVE_CUDA + cudaMemcpyAsync(v, params->values[i].v, fx.d.batch_size() * sizeof(float), cudaMemcpyDeviceToDevice); +#else memcpy(v, params->values[i].v, fx.d.batch_size() * sizeof(float)); +#endif } } } From 47e52eb6fc0dc37f3f1c274a951c0983a2fa4515 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 25 Nov 2015 08:02:23 +0900 Subject: [PATCH 326/965] Fixed stale reference to HierarchicalSoftmax --- examples/rnnlm-cfsm.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/rnnlm-cfsm.cc b/examples/rnnlm-cfsm.cc index 4925a9c5d..772fc7acb 100644 --- a/examples/rnnlm-cfsm.cc +++ b/examples/rnnlm-cfsm.cc @@ -7,7 +7,7 @@ #include "cnn/lstm.h" #include "cnn/dict.h" #include "cnn/expr.h" -#include "cnn/hsm-builder.h" +#include "cnn/cfsm-builder.h" #include #include @@ -32,8 +32,8 @@ template struct RNNLanguageModel { LookupParameters* p_c; Builder builder; - HierarchicalSoftmaxBuilder& hsm; - explicit RNNLanguageModel(Model& model, HierarchicalSoftmaxBuilder& h) : + ClassFactoredSoftmaxBuilder& hsm; + explicit RNNLanguageModel(Model& model, ClassFactoredSoftmaxBuilder& h) : p_c(model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), hsm(h) {} @@ -89,7 +89,7 @@ int main(int argc, char** argv) { kSOS = d.Convert(""); kEOS = d.Convert(""); Model model; - HierarchicalSoftmaxBuilder hsm(HIDDEN_DIM, argv[3], &d, &model); + ClassFactoredSoftmaxBuilder hsm(HIDDEN_DIM, argv[3], &d, &model); vector> training, dev; string line; int tlc = 0; From 5c9191c4148b5b26f9e7c7d26a49d7438697e035 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 24 Nov 2015 19:02:35 -0500 Subject: [PATCH 327/965] Fixed a silly bug in functors on cpu --- cnn/functors.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/functors.h b/cnn/functors.h index 58e21dd8e..8dc93a6c8 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -9,7 +9,7 @@ # define CNN_DEVICE_MIN -1.175494351e-38f #else # define CNN_DEVICE_FUNC -# define CNN_DEVICE_MIN CNN_DEVICE_MIN +# define CNN_DEVICE_MIN std::numeric_limits::min() #endif // these functions are used both in CPU and in GPU computation From 7b0729a6315552e950a2f66726ca56bf406ff6cf Mon Sep 17 00:00:00 2001 From: austinma Date: Sat, 28 Nov 2015 22:24:27 -0500 Subject: [PATCH 328/965] Allow you to call new_graph() twice in a row --- cnn/rnn-state-machine.h | 1 + 1 file changed, 1 insertion(+) diff --git a/cnn/rnn-state-machine.h b/cnn/rnn-state-machine.h index 919072b6b..1d3db3ea1 100644 --- a/cnn/rnn-state-machine.h +++ b/cnn/rnn-state-machine.h @@ -24,6 +24,7 @@ class RNNStateMachine { if (op == RNNOp::new_graph) { q_ = RNNState::GRAPH_READY; break; } failure(op); case RNNState::GRAPH_READY: + if (op == RNNOp::new_graph) { break; } if (op == RNNOp::start_new_sequence) { q_ = RNNState::READING_INPUT; break; } failure(op); case RNNState::READING_INPUT: From cf186d994459ccd021ee9d6db3a9823d0251a471 Mon Sep 17 00:00:00 2001 From: austinma Date: Mon, 30 Nov 2015 07:44:26 -0500 Subject: [PATCH 329/965] Update renamed file in CMakeLists --- examples/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index b66a4a5e8..19f036cd3 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm2 mp read-write) +foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm2 rnnlm-mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS} rt pthread) if (WITH_CUDA_BACKEND) From f98c00d2279ffd4bca095f37298c8de4826a5746 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 2 Dec 2015 21:08:48 -0500 Subject: [PATCH 330/965] Updated pycnn to work with new version --- cnn/dim.h | 12 ++++++------ pycnn/makefile | 21 +++++++++++++++------ pycnn/pycnn.pxd | 10 +++++++--- pycnn/pycnn.pyx | 25 +++++++++++++++++-------- 4 files changed, 45 insertions(+), 23 deletions(-) diff --git a/cnn/dim.h b/cnn/dim.h index a0a2114f8..3c8a76736 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -27,12 +27,12 @@ struct Dim { Dim(std::initializer_list x, unsigned int b) : nd(), bd(b) { for(auto v : x) d[nd++] = v; } - // Dim(const std::vector & x) : nd(), bd(1) { - // for(auto v : x) d[nd++] = v; - // } - // Dim(const std::vector & x, unsigned int b) : nd(), bd(b) { - // for(auto v : x) d[nd++] = v; - // } + Dim(const std::vector & x) : nd(), bd(1) { + for(auto v : x) d[nd++] = v; + } + Dim(const std::vector & x, unsigned int b) : nd(), bd(b) { + for(auto v : x) d[nd++] = v; + } inline unsigned int size() const { return batch_size() * bd; } diff --git a/pycnn/makefile b/pycnn/makefile index ed59c93a9..e2c8d41ea 100644 --- a/pycnn/makefile +++ b/pycnn/makefile @@ -1,11 +1,20 @@ -pycnn.so: ../build/cnn/libcnn_shared.so pycnn.pyx pycnn.pxd setup.py - cp ../build/cnn/libcnn_shared.so . - python2 setup.py build_ext --inplace -install: pycnn.so - python2 setup.py install --user +PYTHON := python +UNAME := $(shell uname) +ifeq ($(UNAME),Darwin) + DYSUF := dylib +else + DYSUF := so +endif + +pycnn.${DYSUF}: ../build/cnn/libcnn_shared.${DYSUF} pycnn.pyx pycnn.pxd setup.py + cp ../build/cnn/libcnn_shared.${DYSUF} . + ${PYTHON} setup.py build_ext --inplace + +install: pycnn.${DYSUF} + ${PYTHON} setup.py install --user clean: - rm *.so *.cpp + rm *.${DYSUF} *.cpp diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index 1dcf0bb8e..2556d4c96 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -4,19 +4,23 @@ from libcpp.string cimport string ctypedef float real cdef extern from "cnn/init.h" namespace "cnn": - cdef void Initialize(int& argc, char **& argv) + cdef void Initialize(int& argc, char **& argv, unsigned random_seed) cdef extern from "cnn/dim.h" namespace "cnn": cdef cppclass CDim "cnn::Dim": CDim() except + - CDim(int m) except + - CDim(int m, int n) except + + #CDim(int m) except + + #CDim(int m, int n) except + + CDim(vector[long]& ds) except + #CDim(std::initializer_list[long] x) except + int size() int sum_dims() + CDim truncate() + void resize(unsigned i) int ndims() int rows() int cols() + void set(unsigned i, unsigned s) int size(unsigned i) CDim transpose() diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index d437ea42b..bf0143da2 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -30,25 +30,34 @@ import numpy as np from pycnn cimport * cimport pycnn -cdef init(): +cdef init(random_seed=None): cdef char** argv = [] cdef int argc = 0 - pycnn.Initialize(argc,argv) -init() + if random_seed is None: + pycnn.Initialize(argc,argv, 0) + else: + if random_seed == 0: random_seed = 1 + pycnn.Initialize(argc,argv, random_seed) +init() # TODO: allow different random seeds cdef CDim Dim(dim): """ dim: either a tuple or an int """ + cdef vector[long] cvec if isinstance(dim, tuple): - if len(dim) == 1: return CDim(dim[0]) - elif len(dim) == 2: return CDim(dim[0],dim[1]) - else: - raise "Unsupported dimension",dim + for d in dim: cvec.push_back(d) + #if len(dim) == 1: return CDim(dim[0]) + #elif len(dim) == 2: return CDim(dim[0],dim[1]) + #else: + # raise "Unsupported dimension",dim + return CDim(cvec) # hope it's a number. TODO: error checking / exception if isinstance(dim, (int, float)): - return CDim(dim) + cvec.push_back(dim) + #return CDim(dim) + return CDim(cvec) raise "Unsupported dimension",dim cdef c_tensor_as_np(CTensor &t): From cd95f66e4c323c9e8aef5ca0922d39a908f457ae Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 4 Dec 2015 18:57:16 -0500 Subject: [PATCH 331/965] how to include librt and libpthreads --- CMakeLists.txt | 3 +++ examples/CMakeLists.txt | 5 ++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 88fb4d29b..305f72ceb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,6 +84,9 @@ endif() find_package(Eigen3 REQUIRED) include_directories(${EIGEN3_INCLUDE_DIR}) +FIND_PACKAGE(Threads REQUIRED) +set(LIBS ${LIBS} ${CMAKE_THREAD_LIBS_INIT}) + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) include_directories(${CMAKE_CURRENT_BINARY_DIR}) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 19f036cd3..a2d21f9e0 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -2,7 +2,10 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm2 rnnlm-mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) - target_link_libraries(${TARGET} cnn ${LIBS} rt pthread) + target_link_libraries(${TARGET} cnn ${LIBS} pthread) + if(UNIX AND NOT APPLE) + target_link_libraries(${TARGET} rt) + endif() if (WITH_CUDA_BACKEND) add_dependencies(${TARGET} cnncuda) target_link_libraries(${TARGET} cnncuda) From 8dc3fe203fec4753242917ecaa55b39c71399af2 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 5 Dec 2015 00:42:20 -0500 Subject: [PATCH 332/965] add const_parameter --- cnn/cnn.cc | 8 ++++++++ cnn/cnn.h | 1 + cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/param-nodes.cc | 25 +++++++++++++++++++++++++ cnn/param-nodes.h | 15 +++++++++++++++ 6 files changed, 51 insertions(+) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 0e04ee16c..fa6db72bc 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -114,6 +114,14 @@ VariableIndex ComputationGraph::add_parameters(Parameters* p) { return new_node_index; } +VariableIndex ComputationGraph::add_const_parameters(Parameters* p) { + VariableIndex new_node_index(nodes.size()); + ConstParameterNode* new_node = new ConstParameterNode(p); + nodes.push_back(new_node); + set_dim_for_new_node(new_node_index); + return new_node_index; +} + VariableIndex ComputationGraph::add_lookup(LookupParameters* p, const unsigned* pindex) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, pindex); diff --git a/cnn/cnn.h b/cnn/cnn.h index 64a7d9ff1..408781256 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -60,6 +60,7 @@ struct ComputationGraph { // Torch where computational modules may have their own parameters, in CNN // parameters are just parameters VariableIndex add_parameters(Parameters* p); + VariableIndex add_const_parameters(Parameters* p); // use pindex to point to a memory location where the index will live // that the caller owns VariableIndex add_lookup(LookupParameters* p, const unsigned* pindex); diff --git a/cnn/expr.cc b/cnn/expr.cc index 924e8a79e..d8063a788 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -11,6 +11,7 @@ Expression input(ComputationGraph& g, real s) { return Expression(&g, g.add_inpu Expression input(ComputationGraph& g, const real *ps) { return Expression(&g, g.add_input(ps)); } Expression input(ComputationGraph& g, const Dim& d, const std::vector& data) { return Expression(&g, g.add_input(d, data)); } Expression input(ComputationGraph& g, const Dim& d, const std::vector* pdata) { return Expression(&g, g.add_input(d, pdata)); } +Expression const_parameter(ComputationGraph& g, Parameters* p) { return Expression(&g, g.add_const_parameters(p)); } Expression parameter(ComputationGraph& g, Parameters* p) { return Expression(&g, g.add_parameters(p)); } Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index) { return Expression(&g, g.add_lookup(p, index)); } Expression lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex) { return Expression(&g, g.add_lookup(p, pindex)); } diff --git a/cnn/expr.h b/cnn/expr.h index cda13cc96..d6b8ab370 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -20,6 +20,7 @@ Expression input(ComputationGraph& g, const real *ps); Expression input(ComputationGraph& g, const Dim& d, const std::vector& data); Expression input(ComputationGraph& g, const Dim& d, const std::vector* pdata); Expression parameter(ComputationGraph& g, Parameters* p); +Expression const_parameter(ComputationGraph& g, Parameters* p); Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index); Expression lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex); Expression const_lookup(ComputationGraph& g, LookupParameters* p, unsigned index); diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index ebb0096ee..c10a8f041 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -7,6 +7,31 @@ using namespace std; namespace cnn { +string ConstParameterNode::as_string(const vector& arg_names) const { + ostringstream s; + s << "const_parameters(" << dim << ", " << params << ')'; + return s.str(); +} + +Dim ConstParameterNode::dim_forward(const vector& xs) const { + assert(xs.size() == 0); + return dim; +} + +void ConstParameterNode::forward_impl(const vector& xs, Tensor& fx) const { + assert(xs.size() == 0); + fx.v = params->values.v; +} + +void ConstParameterNode::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + cerr << "called backward() on arity 0 node: i = " << i << endl; + abort(); +} + string ParameterNode::as_string(const vector& arg_names) const { ostringstream s; s << "parameters(" << dim << ", " << params << ')'; diff --git a/cnn/param-nodes.h b/cnn/param-nodes.h index 87175b9c8..61049dd2a 100644 --- a/cnn/param-nodes.h +++ b/cnn/param-nodes.h @@ -26,6 +26,21 @@ struct ParameterNode : public ParameterNodeBase { Parameters* params; }; +// represents optimizable parameters that are being held constant +struct ConstParameterNode : public Node { + explicit ConstParameterNode(Parameters* p) : dim(p->dim), params(p) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; + Dim dim; + Parameters* params; +}; + // represents specified (not learned) inputs to the network struct InputNode : public Node { explicit InputNode(const Dim& d, const std::vector& dat) : dim(d), data(dat), pdata(&data) {} From d2ef1d942c28ae00a2e07dd0595911c8813178ed Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Sun, 6 Dec 2015 17:56:24 +0200 Subject: [PATCH 333/965] added new functionality to pycnn interface --- pycnn/pycnn.pxd | 18 ++++++++++++++++-- pycnn/pycnn.pyx | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index 2556d4c96..0328ba5cb 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -143,15 +143,22 @@ cdef extern from "cnn/expr.h" namespace "cnn::expr": CExpression c_op_neg "cnn::expr::operator-" (CExpression& x) # CExpression c_op_add "cnn::expr::operator+" (CExpression& x, CExpression& y) # + CExpression c_op_scalar_add "cnn::expr::operator+" (CExpression& x, float y) # CExpression c_op_mul "cnn::expr::operator*" (CExpression& x, CExpression& y) # CExpression c_op_scalar_mul "cnn::expr::operator*" (CExpression& x, float y) # + CExpression c_op_scalar_div "cnn::expr::operator/" (CExpression& x, float y) # CExpression c_op_scalar_sub "cnn::expr::operator-" (float y, CExpression& x) # + CExpression c_bmax "cnn::expr::max" (CExpression& x, CExpression& y) # + CExpression c_bmin "cnn::expr::min" (CExpression& x, CExpression& y) # + CExpression c_cdiv "cnn::expr::cdiv" (CExpression& x, CExpression& y) # CExpression c_colwise_add "cnn::expr::colwise_add" (CExpression& x, CExpression& bias) # CExpression c_tanh "cnn::expr::tanh" (CExpression& x) # CExpression c_exp "cnn::expr::exp" (CExpression& x) # + CExpression c_square "cnn::expr::square" (CExpression& x) # + CExpression c_cube "cnn::expr::cube" (CExpression& x) # CExpression c_log "cnn::expr::log" (CExpression& x) # CExpression c_logistic "cnn::expr::logistic" (CExpression& x) # CExpression c_rectify "cnn::expr::rectify" (CExpression& x) # @@ -161,8 +168,11 @@ cdef extern from "cnn/expr.h" namespace "cnn::expr": CExpression c_log_softmax "cnn::expr::log_softmax" (CExpression& x, vector[unsigned]& restriction) #? CExpression c_softmax "cnn::expr::softmax" (CExpression& x) # CExpression c_softsign "cnn::expr::softsign" (CExpression& x) # + CExpression c_bmin "cnn::expr::min" (CExpression& x, CExpression& y) # + CExpression c_bmax "cnn::expr::max" (CExpression& x, CExpression& y) # CExpression c_noise "cnn::expr::noise" (CExpression& x, float stddev) # CExpression c_dropout "cnn::expr::dropout" (CExpression& x, float p) # + CExpression c_block_dropout "cnn::expr::block_dropout" (CExpression& x, float p) # CExpression c_reshape "cnn::expr::reshape" (CExpression& x, CDim& d) #? CExpression c_transpose "cnn::expr::transpose" (CExpression& x) # @@ -178,11 +188,16 @@ cdef extern from "cnn/expr.h" namespace "cnn::expr": CExpression c_l1_distance "cnn::expr::l1_distance" (CExpression& x, CExpression& y) # CExpression c_binary_log_loss "cnn::expr::binary_log_loss" (CExpression& x, CExpression& y) # CExpression c_pairwise_rank_loss "cnn::expr::pairwise_rank_loss" (CExpression& x, CExpression& y, float m) # + CExpression c_poisson_loss "cnn::expr::poisson_loss" (CExpression& x, unsigned y) CExpression c_conv1d_narrow "cnn::expr::conv1d_narrow" (CExpression& x, CExpression& f) # CExpression c_conv1d_wide "cnn::expr::conv1d_wide" (CExpression& x, CExpression& f) # CExpression c_kmax_pooling "cnn::expr::kmax_pooling" (CExpression& x, unsigned k) # CExpression c_fold_rows "cnn::expr::fold_rows" (CExpression& x, unsigned nrows) # + CExpression c_sum_cols "cnn::expr::sum_cols" (CExpression& x) # + CExpression c_kmh_ngram "cnn::expr::kmh_ngram" (CExpression& x, unsigned n) # + + CExpression c_sum_batches "cnn::expr::sum_batches" (CExpression& x) #CExpression c_pick "cnn::expr::pick" (CExpression& x, unsigned v) # CExpression c_pick "cnn::expr::pick" (CExpression& x, unsigned* pv) # @@ -196,9 +211,8 @@ cdef extern from "cnn/expr.h" namespace "cnn::expr": CExpression c_concat "cnn::expr::concatenate" (vector[CExpression]& xs) CExpression c_sum "cnn::expr::sum" (vector[CExpression]& xs) + CExpression c_max "cnn::expr::vmax" (vector[CExpression]& xs) - CExpression c_sum_cols "cnn::expr::sum_cols" (CExpression& x) # - CExpression c_kmh_ngram "cnn::expr::kmh_ngram" (CExpression& x, unsigned n) # #cdef extern from "cnn/model.h" namespace "cnn": # cdef cppclass Model: diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index bf0143da2..c1768606d 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -332,7 +332,9 @@ cdef _add(Expression a, Expression b): ensure_freshness(b); return Expression.fr cdef _mul(Expression a, Expression b): ensure_freshness(b); return Expression.from_cexpr(a.cg_version, c_op_mul(a.c(), b.c())) cdef _neg(Expression a): return Expression.from_cexpr(a.cg_version, c_op_neg(a.c())) cdef _scalarsub(float a, Expression b): ensure_freshness(b); return Expression.from_cexpr(b.cg_version, c_op_scalar_sub(a, b.c())) +cdef _cadd(Expression a, float b): return Expression.from_cexpr(a.cg_version, c_op_scalar_add(a.c(), b)) cdef _cmul(Expression a, float b): return Expression.from_cexpr(a.cg_version, c_op_scalar_mul(a.c(), b)) +cdef _cdiv(Expression a, float b): return Expression.from_cexpr(a.cg_version, c_op_scalar_div(a.c(), b)) cdef class Expression: #{{{ #cdef CComputationGraph *cg @@ -407,13 +409,22 @@ cdef class Expression: #{{{ if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") self.cg.backward(self.vindex) - def __add__(self, other): return _add(self,other) + def __add__(self, other): + if isinstance(self, Expression) and isinstance(other, Expression): + return _add(self,other) + elif isinstance(self, (int,float)) or isinstance(other, (int,float)): + return _cadd(self, other) + else: raise NotImplementedError() def __mul__(self, other): if isinstance(self, Expression) and isinstance(other, Expression): return _mul(self,other) elif isinstance(self, (int,float)) or isinstance(other, (int,float)): return _cmul(self, other) else: raise NotImplementedError() + def __div__(self, other): + if isinstance(self, Expression) and isinstance(other, (int,float)): + return _cdiv(self, other) + else: raise NotImplementedError() def __neg__(self): return _neg(self) def __sub__(self, other): if isinstance(self,Expression) and isinstance(other,Expression): @@ -544,6 +555,8 @@ cpdef Expression conv1d_wide(Expression x, Expression y): ensure_freshness(y); r # unary-exp cpdef Expression tanh(Expression x): return Expression.from_cexpr(x.cg_version, c_tanh(x.c())) cpdef Expression exp(Expression x): return Expression.from_cexpr(x.cg_version, c_exp(x.c())) +cpdef Expression square(Expression x): return Expression.from_cexpr(x.cg_version, c_square(x.c())) +cpdef Expression cube(Expression x): return Expression.from_cexpr(x.cg_version, c_cube(x.c())) cpdef Expression log(Expression x): return Expression.from_cexpr(x.cg_version, c_log(x.c())) cpdef Expression logistic(Expression x): return Expression.from_cexpr(x.cg_version, c_logistic(x.c())) cpdef Expression rectify(Expression x): return Expression.from_cexpr(x.cg_version, c_rectify(x.c())) @@ -554,8 +567,13 @@ cpdef Expression log_softmax(Expression x, list restrict=None): return Expression.from_cexpr(x.cg_version, c_log_softmax(x.c(), vec)) cpdef Expression softmax(Expression x): return Expression.from_cexpr(x.cg_version, c_softmax(x.c())) cpdef Expression softsign(Expression x): return Expression.from_cexpr(x.cg_version, c_softsign(x.c())) +cpdef Expression bmin(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_bmin(x.c(), y.c())) +cpdef Expression bmax(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_bmax(x.c(), y.c())) cpdef Expression transpose(Expression x): return Expression.from_cexpr(x.cg_version, c_transpose(x.c())) cpdef Expression sum_cols(Expression x): return Expression.from_cexpr(x.cg_version, c_sum_cols(x.c())) + +cpdef Expression sum_batches(Expression x): return Expression.from_cexpr(x.cg_version, c_sum_batches(x.c())) + #expr-opt cpdef Expression fold_rows(Expression x, unsigned nrows=2): return Expression.from_cexpr(x.cg_version, c_fold_rows(x.c(),nrows)) #expr-expr-opt @@ -563,6 +581,7 @@ cpdef Expression fold_rows(Expression x, unsigned nrows=2): return Expression.fr # y is scalar or row vector # res = max(0, m - x + y) cpdef Expression pairwise_rank_loss(Expression x, Expression y, float m=1.0): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_pairwise_rank_loss(x.c(), y.c(), m)) +cpdef Expression poisson_loss(Expression x, unsigned y): return Expression.from_cexpr(x.cg_version, c_poisson_loss(x.c(), y)) cpdef Expression huber_distance(Expression x, Expression y, float c=1.345): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_huber_distance(x.c(), y.c(), c)) #expr-unsigned cpdef Expression kmax_pooling(Expression x, unsigned k): return Expression.from_cexpr(x.cg_version, c_kmax_pooling(x.c(), k)) @@ -573,6 +592,7 @@ cpdef Expression pickrange(Expression x, unsigned v, unsigned u): return Express #expr-float cpdef Expression noise(Expression x, float stddev): return Expression.from_cexpr(x.cg_version, c_noise(x.c(), stddev)) cpdef Expression dropout(Expression x, float p): return Expression.from_cexpr(x.cg_version, c_dropout(x.c(), p)) +cpdef Expression block_dropout(Expression x, float p): return Expression.from_cexpr(x.cg_version, c_block_dropout(x.c(), p)) #expr-dim cpdef Expression reshape(Expression x, tuple d): return Expression.from_cexpr(x.cg_version, c_reshape(x.c(),Dim(d))) @@ -594,6 +614,17 @@ cpdef Expression average(list xs): cvec.push_back(x.c()) return Expression.from_cexpr(x.cg_version, c_average(cvec)) +cpdef Expression emax(list xs): + cdef Expression c + cdef Expression x + c = xs[0] + ensure_freshness(c) + for x in xs: + ensure_freshness(x) + c = Expression.from_cexpr(x.cg_version, c_bmax(x.c(),c.c())) + return c + #return Expression.from_cexpr(x.cg_version, c_max(cvec)) + cpdef Expression concatenate_cols(list xs): cdef vector[CExpression] cvec cdef Expression x From e1f5f3c97a55e7046d339ecadb752c28faf6c8b1 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 7 Dec 2015 23:36:40 -0500 Subject: [PATCH 334/965] gaussian error function --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/functors.h | 12 ++++++++++++ cnn/nodes-common.cc | 11 +++++++++++ cnn/nodes.cc | 14 ++++++++++++++ cnn/nodes.h | 13 +++++++++++++ 6 files changed, 52 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index d8063a788..1fc954e47 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -36,6 +36,7 @@ Expression colwise_add(const Expression& x, const Expression& bias) { return Exp Expression contract3d_1d(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b) { return Expression(x.pg, x.pg->add_function({x.i, y.i, b.i})); } +Expression erf(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression tanh(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression exp(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index d6b8ab370..6185bf900 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -50,6 +50,7 @@ Expression contract3d_1d(const Expression& x, const Expression& y); // z_ij = x_ijk * y_k + b_ij Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b); +Expression erf(const Expression& x); Expression tanh(const Expression& x); Expression exp(const Expression& x); Expression square(const Expression& x); diff --git a/cnn/functors.h b/cnn/functors.h index 8dc93a6c8..57eaa5f5c 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -84,6 +84,12 @@ struct FNegate { } }; +struct FErf { + CNN_DEVICE_FUNC inline float operator()(float x) const { + return erff(x); + } +}; + struct FTanh { CNN_DEVICE_FUNC inline float operator()(float x) const { #ifdef FAST_TANH @@ -103,6 +109,12 @@ struct FMaxBackwardInv { } }; +struct FErfBackward { + CNN_DEVICE_FUNC inline float operator()(float x, float d) const { + return 1.1283791670955125738961589f * expf(-x * x) * d; + } +}; + struct FTanhBackward { CNN_DEVICE_FUNC inline float operator()(float t, float d) const { return (1.f - t * t) * d; diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 6a72d1f6f..8c0cb1bd9 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -300,6 +300,17 @@ Dim Average::dim_forward(const vector& xs) const { return d; } +string Erf::as_string(const vector& arg_names) const { + ostringstream s; + s << "erf(" << arg_names[0] << ')'; + return s.str(); +} + +Dim Erf::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string Tanh::as_string(const vector& arg_names) const { ostringstream s; s << "tanh(" << arg_names[0] << ')'; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index e55120dd7..882ffc72c 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -506,6 +506,20 @@ void Average::backward_impl(const vector& xs, *dEdxi += (*dEdf / xs.size()); } +void Erf::forward_impl(const vector& xs, Tensor& fx) const { + auto x = **xs[0]; + (*fx) = x.unaryExpr(FErf()); +} + +void Erf::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + auto x = **xs[0]; + *dEdxi += x.binaryExpr(*dEdf, FErfBackward()); +} + void Tanh::forward_impl(const vector& xs, Tensor& fx) const { #if HAVE_CUDA gpu::vtanh(fx.d.size(), xs[0]->v, fx.v); diff --git a/cnn/nodes.h b/cnn/nodes.h index 374041b4e..7352060d2 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -226,6 +226,19 @@ struct ConstantMinusX : public Node { real c; }; +// y = erf x_1 +struct Erf : public Node { + explicit Erf(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = tanh x_1 struct Tanh : public Node { explicit Tanh(const std::initializer_list& a) : Node(a) {} From 1e2169bc293f2952e638115e835cb152c23524e5 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 8 Dec 2015 19:36:10 -0500 Subject: [PATCH 335/965] clean up --- examples/rnnlm-cfsm.cc | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/examples/rnnlm-cfsm.cc b/examples/rnnlm-cfsm.cc index 4925a9c5d..178f008ee 100644 --- a/examples/rnnlm-cfsm.cc +++ b/examples/rnnlm-cfsm.cc @@ -7,7 +7,7 @@ #include "cnn/lstm.h" #include "cnn/dict.h" #include "cnn/expr.h" -#include "cnn/hsm-builder.h" +#include "cnn/cfsm-builder.h" #include #include @@ -32,18 +32,18 @@ template struct RNNLanguageModel { LookupParameters* p_c; Builder builder; - HierarchicalSoftmaxBuilder& hsm; - explicit RNNLanguageModel(Model& model, HierarchicalSoftmaxBuilder& h) : + ClassFactoredSoftmaxBuilder& cfsm; + explicit RNNLanguageModel(Model& model, ClassFactoredSoftmaxBuilder& h) : p_c(model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), - hsm(h) {} + cfsm(h) {} // return Expression of total loss Expression BuildLMGraph(const vector& sent, ComputationGraph& cg) { const unsigned slen = sent.size() - 1; builder.new_graph(cg); // reset RNN builder for new graph builder.start_new_sequence(); - hsm.new_graph(cg); + cfsm.new_graph(cg); //Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter //Expression i_bias = parameter(cg, p_bias); // word bias vector errs; @@ -51,7 +51,7 @@ struct RNNLanguageModel { Expression i_x_t = lookup(cg, p_c, sent[t]); // y_t = RNN(x_t) Expression i_y_t = builder.add_input(i_x_t); - Expression i_err = hsm.neg_log_softmax(i_y_t, sent[t+1]); + Expression i_err = cfsm.neg_log_softmax(i_y_t, sent[t+1]); errs.push_back(i_err); } Expression i_nerr = sum(errs); @@ -62,7 +62,7 @@ struct RNNLanguageModel { void RandomSample(int max_len = 150) { cerr << endl; ComputationGraph cg; - hsm.new_graph(cg); + cfsm.new_graph(cg); builder.new_graph(cg); // reset RNN builder for new graph builder.start_new_sequence(); vector errs; @@ -73,7 +73,7 @@ struct RNNLanguageModel { Expression i_x_t = lookup(cg, p_c, cur); // y_t = RNN(x_t) Expression i_y_t = builder.add_input(i_x_t); - cur = hsm.sample(i_y_t); + cur = cfsm.sample(i_y_t); cerr << (len == 1 ? "" : " ") << d.Convert(cur); } cerr << endl; @@ -89,7 +89,7 @@ int main(int argc, char** argv) { kSOS = d.Convert(""); kEOS = d.Convert(""); Model model; - HierarchicalSoftmaxBuilder hsm(HIDDEN_DIM, argv[3], &d, &model); + ClassFactoredSoftmaxBuilder cfsm(HIDDEN_DIM, argv[3], &d, &model); vector> training, dev; string line; int tlc = 0; @@ -130,7 +130,7 @@ int main(int argc, char** argv) { cerr << dlc << " lines, " << dtoks << " tokens\n"; } ostringstream os; - os << "hsmlm" + os << "cfsmlm" << '_' << LAYERS << '_' << INPUT_DIM << '_' << HIDDEN_DIM @@ -146,9 +146,11 @@ int main(int argc, char** argv) { //else sgd = new SimpleSGDTrainer(&model); - RNNLanguageModel lm(model, hsm); - //RNNLanguageModel lm(model, hsm); + RNNLanguageModel lm(model, cfsm); + //RNNLanguageModel lm(model, cfsm); + bool has_loaded_model = false; if (argc == 5) { + has_loaded_model = true; string fname = argv[4]; ifstream in(fname); boost::archive::text_iarchive ia(in); @@ -167,6 +169,7 @@ int main(int argc, char** argv) { Timer iteration("completed in"); double loss = 0; unsigned chars = 0; +#if 1 for (unsigned i = 0; i < report_every_i; ++i) { if (si == training.size()) { si = 0; @@ -178,7 +181,7 @@ int main(int argc, char** argv) { // build graph for this instance ComputationGraph cg; auto& sent = training[order[si]]; - chars += sent.size() - 1; + chars += sent.size() - 2; ++si; lm.BuildLMGraph(sent, cg); loss += as_scalar(cg.forward()); @@ -193,22 +196,25 @@ int main(int argc, char** argv) { // show score on dev data? report++; if (report % dev_every_i_reports == 0) { +#endif double dloss = 0; int dchars = 0; for (auto& sent : dev) { ComputationGraph cg; lm.BuildLMGraph(sent, cg); dloss += as_scalar(cg.forward()); - dchars += sent.size() - 1; + dchars += sent.size() - 2; } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; +#if 1 if (dloss < best) { best = dloss; ofstream out(fname); boost::archive::text_oarchive oa(out); oa << model; } - cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; } +#endif } delete sgd; } From c85174ae61e90f93936628fa1483075e43eb2034 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 9 Dec 2015 13:20:19 -0500 Subject: [PATCH 336/965] remove old restriction on Eigen behavior --- cnn/tensor.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/cnn/tensor.h b/cnn/tensor.h index 329bd494b..87571c6f9 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -14,14 +14,10 @@ #include "cnn/cuda.h" #endif #include -// CNN manages its own memory. DO NOT remove the following line // Following line is commented out because it causes errors with large nets (Antonis) //#define EIGEN_NO_MALLOC -// This prevents Eigen from trying to allocate heap and crashing due to NO_MALLOC -#define EIGEN_STACK_ALLOCATION_LIMIT 1000000000 - #include namespace cnn { From 72c43143b7ea0e3d152eb3b050e80c43f0d2b176 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 11 Dec 2015 16:42:24 -0500 Subject: [PATCH 337/965] add support for dropout in LSTMs --- cnn/lstm.cc | 13 ++++--------- cnn/lstm.h | 5 +++++ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 4124375b1..9dd57a8db 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -66,8 +66,6 @@ void LSTMBuilder::new_graph_impl(ComputationGraph& cg){ vector vars = {i_x2i, i_h2i, i_c2i, i_bi, i_x2o, i_h2o, i_c2o, i_bo, i_x2c, i_h2c, i_bc}; param_vars.push_back(vars); - - } } @@ -111,13 +109,13 @@ Expression LSTMBuilder::add_input_impl(int prev, const Expression& x) { i_h_tm1 = h[prev][i]; i_c_tm1 = c[prev][i]; } + // apply dropout according to http://arxiv.org/pdf/1409.2329v5.pdf + if (dropout_rate) in = dropout(in, dropout_rate); // input Expression i_ait; if (has_prev_state) -// i_ait = vars[BI] + vars[X2I] * in + vars[H2I]*i_h_tm1 + vars[C2I] * i_c_tm1; i_ait = affine_transform({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1, vars[C2I], i_c_tm1}); else -// i_ait = vars[BI] + vars[X2I] * in; i_ait = affine_transform({vars[BI], vars[X2I], in}); Expression i_it = logistic(i_ait); // forget @@ -125,10 +123,8 @@ Expression LSTMBuilder::add_input_impl(int prev, const Expression& x) { // write memory cell Expression i_awt; if (has_prev_state) -// i_awt = vars[BC] + vars[X2C] * in + vars[H2C]*i_h_tm1; i_awt = affine_transform({vars[BC], vars[X2C], in, vars[H2C], i_h_tm1}); else -// i_awt = vars[BC] + vars[X2C] * in; i_awt = affine_transform({vars[BC], vars[X2C], in}); Expression i_wt = tanh(i_awt); // output @@ -142,16 +138,15 @@ Expression LSTMBuilder::add_input_impl(int prev, const Expression& x) { Expression i_aot; if (has_prev_state) -// i_aot = vars[BO] + vars[X2O] * in + vars[H2O] * i_h_tm1 + vars[C2O] * ct[i]; i_aot = affine_transform({vars[BO], vars[X2O], in, vars[H2O], i_h_tm1, vars[C2O], ct[i]}); else -// i_aot = vars[BO] + vars[X2O] * in; i_aot = affine_transform({vars[BO], vars[X2O], in}); Expression i_ot = logistic(i_aot); Expression ph_t = tanh(ct[i]); in = ht[i] = cwise_multiply(i_ot,ph_t); } - return ht.back(); + if (dropout_rate) return dropout(ht.back(), dropout_rate); + else return ht.back(); } void LSTMBuilder::copy(const RNNBuilder & rnn) { diff --git a/cnn/lstm.h b/cnn/lstm.h index f35ee195e..93ba83272 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -18,6 +18,10 @@ struct LSTMBuilder : public RNNBuilder { unsigned hidden_dim, Model* model); + void set_dropout(float d) { dropout_rate = d; } + // in general, you should disable dropout at test time + void disable_dropout() { dropout_rate = 0; } + Expression back() const override { return (cur == -1? h0.back() : h[cur].back()); } std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } std::vector final_s() const override { @@ -56,6 +60,7 @@ struct LSTMBuilder : public RNNBuilder { std::vector h0; std::vector c0; unsigned layers; + float dropout_rate; }; } // namespace cnn From 06bafb425a73627d37d7df7080b3c17307b7ef71 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 13 Dec 2015 12:26:31 -0500 Subject: [PATCH 338/965] add sqrt --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/functors.h | 6 ++++++ cnn/nodes-common.cc | 11 +++++++++++ cnn/nodes.cc | 13 +++++++++++++ cnn/nodes.h | 13 +++++++++++++ 6 files changed, 45 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index 1fc954e47..1df721caa 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -36,6 +36,7 @@ Expression colwise_add(const Expression& x, const Expression& bias) { return Exp Expression contract3d_1d(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b) { return Expression(x.pg, x.pg->add_function({x.i, y.i, b.i})); } +Expression sqrt(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression erf(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression tanh(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 6185bf900..f79a98da0 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -50,6 +50,7 @@ Expression contract3d_1d(const Expression& x, const Expression& y); // z_ij = x_ijk * y_k + b_ij Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b); +Expression sqrt(const Expression& x); Expression erf(const Expression& x); Expression tanh(const Expression& x); Expression exp(const Expression& x); diff --git a/cnn/functors.h b/cnn/functors.h index 57eaa5f5c..a9995934c 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -109,6 +109,12 @@ struct FMaxBackwardInv { } }; +struct FSqrtBackward { + CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + return d / (2.f * t); + } +}; + struct FErfBackward { CNN_DEVICE_FUNC inline float operator()(float x, float d) const { return 1.1283791670955125738961589f * expf(-x * x) * d; diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 8c0cb1bd9..c292c15c5 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -300,6 +300,17 @@ Dim Average::dim_forward(const vector& xs) const { return d; } +string Sqrt::as_string(const vector& arg_names) const { + ostringstream s; + s << "sqrt(" << arg_names[0] << ')'; + return s.str(); +} + +Dim Sqrt::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string Erf::as_string(const vector& arg_names) const { ostringstream s; s << "erf(" << arg_names[0] << ')'; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 882ffc72c..327bafae9 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -506,6 +506,19 @@ void Average::backward_impl(const vector& xs, *dEdxi += (*dEdf / xs.size()); } +void Sqrt::forward_impl(const vector& xs, Tensor& fx) const { + auto x = **xs[0]; + (*fx) = x.cwiseSqrt(); +} + +void Sqrt::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + *dEdxi += (*fx).binaryExpr(*dEdf, FSqrtBackward()); +} + void Erf::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; (*fx) = x.unaryExpr(FErf()); diff --git a/cnn/nodes.h b/cnn/nodes.h index 7352060d2..0b9c27e6c 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -226,6 +226,19 @@ struct ConstantMinusX : public Node { real c; }; +// y = sqrt x_1 +struct Sqrt : public Node { + explicit Sqrt(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = erf x_1 struct Erf : public Node { explicit Erf(const std::initializer_list& a) : Node(a) {} From b760090275e52d1a918370aaf428ea058a80d3ee Mon Sep 17 00:00:00 2001 From: armatthews Date: Fri, 18 Dec 2015 15:13:34 -0500 Subject: [PATCH 339/965] Added a new node type: Zeroes(d) that takes a dimension object and returns a vector/matrix/tensor of zeroes --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/nodes.cc | 28 ++++++++++++++++++++++++++++ cnn/nodes.h | 14 ++++++++++++++ 4 files changed, 44 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index 1df721caa..42594c74d 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -21,6 +21,7 @@ Expression const_lookup(ComputationGraph& g, LookupParameters* p, unsigned index Expression const_lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex) { return Expression(&g, g.add_const_lookup(p, pindex)); } Expression const_lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices) { return Expression(&g, g.add_const_lookup(p, indices)); } Expression const_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices) { return Expression(&g, g.add_const_lookup(p, pindices)); } +Expression zeroes(ComputationGraph& g, const Dim& d) { return Expression(&g, g.add_function(d)); } Expression operator-(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression operator+(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index f79a98da0..d91be69a9 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -30,6 +30,7 @@ Expression lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices); Expression const_lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices); Expression const_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices); +Expression zeroes(ComputationGraph& g, const Dim& d); Expression operator-(const Expression& x); Expression operator+(const Expression& x, const Expression& y); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 327bafae9..2403671dc 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1478,4 +1478,32 @@ void BinaryLogLoss::backward_impl(const vector& xs, *dEdxi += (**xs[i]).binaryExpr(**xs[1-i], FBinaryLogLossBackward(dEdf.v[0])); } +string Zeroes::as_string(const vector& arg_names) const { + ostringstream s; + s << "zeroes(" << dim << ')'; + return s.str(); +} + +Dim Zeroes::dim_forward(const vector& xs) const { + return dim; +} + +void Zeroes::forward_impl(const vector& xs, Tensor& fx) const { + assert(xs.size() == 0); +#if HAVE_CUDA + cudaMemsetAsync(fx.v, 0, dim.size() * sizeof(float), cudaMemcpyHostToDevice); +#else + memset(fx.v, 0, dim.size() * sizeof(float)); +#endif +} + +void Zeroes::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + cerr << "called backward() on arity 0 node\n"; + abort(); +} + } // namespace cnn diff --git a/cnn/nodes.h b/cnn/nodes.h index 0b9c27e6c..8cd6bfb3b 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -758,6 +758,20 @@ struct PickRange : public Node { unsigned end; }; +// represents a simple vector of 0s +struct Zeroes : public Node { + explicit Zeroes(const Dim& d) : dim(d) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; + Dim dim; +}; + } // namespace cnn #endif From 1c6d103347cb82bf7d698418804e7c03ae019807 Mon Sep 17 00:00:00 2001 From: austinma Date: Sat, 19 Dec 2015 02:13:05 -0500 Subject: [PATCH 340/965] Initialize dropout_rate to 0.0 in LSTM Builder by default. Previously it was uninitialized and could result in very strange behavior --- cnn/lstm.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 9dd57a8db..3d0775ed1 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -41,6 +41,7 @@ LSTMBuilder::LSTMBuilder(unsigned layers, vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; params.push_back(ps); } // layers + dropout_rate = 0.0f; } void LSTMBuilder::new_graph_impl(ComputationGraph& cg){ From 7d173397897c46cc6a724464e52c61bdafa47868 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 19 Dec 2015 19:34:24 -0500 Subject: [PATCH 341/965] use SIMD implementation of common neural net operations --- cnn/CMakeLists.txt | 1 + cnn/exec.cc | 23 ++++--- cnn/functors.h | 4 ++ cnn/nodes.cc | 9 ++- cnn/xfunctors.h | 146 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 171 insertions(+), 12 deletions(-) create mode 100644 cnn/xfunctors.h diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 6367a2c22..617e32e0b 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -60,6 +60,7 @@ set(cnn_library_HDRS tensor.h timing.h training.h + xfunctors.h ) if(WITH_CUDA_BACKEND) diff --git a/cnn/exec.cc b/cnn/exec.cc index eaffef87c..cc93189c5 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -9,7 +9,7 @@ namespace cnn { ExecutionEngine::~ExecutionEngine() {} void SimpleExecutionEngine::invalidate() { - num_nodes_evaluated = 0; + num_nodes_evaluated = 0; } const Tensor& SimpleExecutionEngine::forward() { @@ -23,11 +23,11 @@ const Tensor& SimpleExecutionEngine::forward(VariableIndex i) { } const Tensor& SimpleExecutionEngine::get_value(VariableIndex i) { - assert(i < cg.nodes.size()); - if (i >= num_nodes_evaluated) { - incremental_forward(); - } - return nfxs[i]; + assert(i < cg.nodes.size()); + if (i >= num_nodes_evaluated) { + incremental_forward(); + } + return nfxs[i]; } const Tensor& SimpleExecutionEngine::incremental_forward() { @@ -38,7 +38,7 @@ const Tensor& SimpleExecutionEngine::incremental_forward() { const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { assert(i < cg.nodes.size()); - // free any old memory if this is a new HG + // free any old memory if this is a new CG if (num_nodes_evaluated == 0) fxs->free(); if (i >= num_nodes_evaluated) { @@ -77,8 +77,8 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { } void SimpleExecutionEngine::backward() { - assert(nfxs.size() == cg.nodes.size()); - backward((VariableIndex)(cg.nodes.size()-1)); + assert(nfxs.size() == cg.nodes.size()); + backward((VariableIndex)(cg.nodes.size()-1)); } // TODO what is happening with parameter nodes if from_where > param_node_id ? @@ -104,6 +104,11 @@ void SimpleExecutionEngine::backward(VariableIndex from_where) { ndEdfs.back().v = kSCALAR_ONE; // here we find constant paths to avoid doing extra work + // by default, a node is constant unless + // 1) it is a parameter node + // 2) it depends on a non-constant node + // (thus, functions of constants and inputs end up being + // false in this computation) vector needs_derivative(num_nodes, false); for (auto i : cg.parameter_nodes) needs_derivative[i] = true; diff --git a/cnn/functors.h b/cnn/functors.h index a9995934c..6313def40 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -16,6 +16,10 @@ // this file may be compiled with NVCC or a standard C++ tool. // if you need a new elementwise (nullary, unary, binary...) // functor, this is the place for it +// +// note: also see xfunctors.h - functors implemented there can +// use Eigen's internal support for vectorized operations which +// can give faster performance on some hardware namespace cnn { diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 2403671dc..903cc9646 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -3,6 +3,7 @@ #include #include +#include "cnn/xfunctors.h" #include "cnn/functors.h" #if HAVE_CUDA #include "cnn/cuda.h" @@ -550,7 +551,7 @@ void Tanh::backward_impl(const vector& xs, #if HAVE_CUDA gpu::vtanh_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); #else - *dEdxi += (*fx).binaryExpr(*dEdf, FTanhBackward()); + *dEdxi += (*fx).binaryExpr(*dEdf, scalar_tanh_backward_op()); #endif } @@ -904,6 +905,7 @@ void PickNegLogSoftmax::backward_impl(const vector& xs, auto x = **xs[0]; // logz is computed in the forward pass and cached *dEdxi += x.unaryExpr(FNegLogSoftmaxBackward(*logz, err)); + //*dEdxi += x.unaryExpr(scalar_nlsoftmax_backward_op(*logz, err)); (*dEdxi)(elem) -= err; } else { assert(pvals); @@ -914,6 +916,7 @@ void PickNegLogSoftmax::backward_impl(const vector& xs, auto x = xs[0]->batch_matrix(b); auto dEdxi_mat = dEdxi.batch_matrix(b); dEdxi_mat += x.unaryExpr(FNegLogSoftmaxBackward(logz[b], err)); + //dEdxi_mat += x.unaryExpr(scalar_nlsoftmax_backward_op(logz[b], err)); dEdxi_mat(elem) -= err; } } @@ -1429,7 +1432,7 @@ void LogisticSigmoid::forward_impl(const vector& xs, Tensor& fx) gpu::vlogistic(fx.d.size(), xs[0]->v, fx.v); #else auto x = **xs[0]; - *fx = x.unaryExpr(FLogisticSigmoid()); + *fx = x.unaryExpr(scalar_logistic_sigmoid_op()); #endif } @@ -1441,7 +1444,7 @@ void LogisticSigmoid::backward_impl(const vector& xs, #if HAVE_CUDA gpu::vlogistic_backward(dEdf.d.size(), fx.v, dEdf.v, dEdxi.v); #else - *dEdxi += (*fx).binaryExpr(*dEdf, FLogisticSigmoidBackward()); + *dEdxi += (*fx).binaryExpr(*dEdf, scalar_logistic_sigmoid_backward_op()); #endif } diff --git a/cnn/xfunctors.h b/cnn/xfunctors.h new file mode 100644 index 000000000..873a2cbc1 --- /dev/null +++ b/cnn/xfunctors.h @@ -0,0 +1,146 @@ +#ifndef CNN_XFUNCTORS_H +#define CNN_XFUNCTORS_H + +#include + +#include "cnn/functors.h" + +// these functors are implemented to exploit Eigen's internal logic for doing +// vectorized arithmetic. I'm putting them in a separate file since, if Eigen +// breaks backward compatibility by changing an internal interface, I want +// the necessary changes to be localized. +// +// to implement your own functor, you need to +// 1) operator() implemented on the scalar data type +// 2) packetOp implemented using vector ("packet") type +// 3) the functor_traits specialization for your functor +// that tells the compiler whether your architecture +// has vectorized support for the operations you need + +namespace cnn { +template struct scalar_logistic_sigmoid_op { + EIGEN_EMPTY_STRUCT_CTOR(scalar_logistic_sigmoid_op) + CNN_DEVICE_FUNC inline const Scalar operator() (const Scalar& x) const { + using std::exp; + const Scalar one = Scalar(1); + return one / (one + exp(-x)); + } + template + CNN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const { + using namespace Eigen::internal; + const Packet one = pset1(1); + return pdiv(one, padd(one, pexp(pnegate(x)))); + } +}; +} + +namespace Eigen { namespace internal { +template +struct functor_traits > { + enum { + Cost = NumTraits::AddCost * 2 + NumTraits::MulCost * 6, + PacketAccess = packet_traits::HasAdd && packet_traits::HasDiv && + packet_traits::HasNegate && packet_traits::HasExp + }; +}; +} } + +namespace cnn { +template struct scalar_logistic_sigmoid_backward_op { + EIGEN_EMPTY_STRUCT_CTOR(scalar_logistic_sigmoid_backward_op) + CNN_DEVICE_FUNC inline const Scalar operator() (const Scalar& t, const Scalar& d) const { + const Scalar one = Scalar(1); + return (one - t) * t * d; + } + template + CNN_DEVICE_FUNC inline Packet packetOp(const Packet& t, const Packet& d) const { + using namespace Eigen::internal; + const Packet one = pset1(1); + return pmul(psub(one, t), pmul(t, d)); + } +}; +} + +namespace Eigen { namespace internal { +template +struct functor_traits > { + enum { + Cost = NumTraits::AddCost + NumTraits::MulCost * 2, + PacketAccess = packet_traits::HasSub && packet_traits::HasMul + }; +}; +} } + +namespace cnn { +template struct scalar_tanh_op { + EIGEN_EMPTY_STRUCT_CTOR(scalar_tanh_op) + CNN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::tanh; return tanh(a); } + template + CNN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return Eigen::internal::ptanh(a); } +}; +} + +namespace Eigen { namespace internal { +template +struct functor_traits > { + enum { + Cost = 5 * NumTraits::MulCost, + PacketAccess = packet_traits::HasTanh + }; +}; +} } + +namespace cnn { +template struct scalar_tanh_backward_op { + EIGEN_EMPTY_STRUCT_CTOR(scalar_tanh_backward_op) + CNN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& t, const Scalar& d) const { return (1 - t * t) * d; } + template + CNN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& t, const Packet& d) const { + using namespace Eigen::internal; + const Packet one = pset1(1); + return pmul(psub(one, pmul(t, t)), d); + } +}; +} + +namespace Eigen { namespace internal { +template +struct functor_traits > { + enum { + Cost = NumTraits::AddCost + 2 * NumTraits::MulCost, + PacketAccess = packet_traits::HasSub && packet_traits::HasMul + }; +}; +}} + +namespace cnn { +//this is slower than the dumb implementation, probably because of the pset operations +// which could be factored out into the constructor, but the Packet type isn't used +// then (and I think fixing this would be hard) +template struct scalar_nlsoftmax_backward_op { + scalar_nlsoftmax_backward_op(const Scalar& lz, const Scalar& err) : logz(lz), d(err) {} + CNN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& t) const { + return exp(t - logz) * d; + } + template + CNN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& t) const { + using namespace Eigen::internal; + const Packet lz = pset1(logz); + const Packet dd = pset1(d); + return pmul(pexp(psub(t, lz)), dd); + } + Scalar logz; + Scalar d; +};} + +namespace Eigen { namespace internal { +template +struct functor_traits > { + enum { + Cost = NumTraits::AddCost + 6 * NumTraits::MulCost, + PacketAccess = packet_traits::HasSub && packet_traits::HasExp + }; +}; +}} + +#endif From a1265c7212b8433f4192f0207f955f8f03a18580 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 20 Dec 2015 00:49:34 -0400 Subject: [PATCH 342/965] a bit more vectorized stuff --- cnn/nodes.cc | 8 ++--- cnn/xfunctors.h | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 903cc9646..2c730e70a 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -330,7 +330,7 @@ void BlockDropout::backward_impl(const vector& xs, void ConstantPlusX::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; - *fx = x.unaryExpr(FConstantPlus(c)); + *fx = x.unaryExpr(const_add_op(c)); } void ConstantPlusX::backward_impl(const vector& xs, @@ -346,7 +346,7 @@ void ConstantMinusX::forward_impl(const vector& xs, Tensor& fx) c gpu::vconstant_minusx(fx.d.size(), c, xs[0]->v, fx.v); #else auto x = **xs[0]; - *fx = x.unaryExpr(FConstantMinus(c)); + *fx = x.unaryExpr(const_minus_op(c)); #endif } @@ -522,7 +522,7 @@ void Sqrt::backward_impl(const vector& xs, void Erf::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; - (*fx) = x.unaryExpr(FErf()); + (*fx).array() = x.array().erf(); } void Erf::backward_impl(const vector& xs, @@ -531,7 +531,7 @@ void Erf::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { auto x = **xs[0]; - *dEdxi += x.binaryExpr(*dEdf, FErfBackward()); + *dEdxi += x.binaryExpr(*dEdf, scalar_erf_backward_op()); } void Tanh::forward_impl(const vector& xs, Tensor& fx) const { diff --git a/cnn/xfunctors.h b/cnn/xfunctors.h index 873a2cbc1..10bad448d 100644 --- a/cnn/xfunctors.h +++ b/cnn/xfunctors.h @@ -17,6 +17,56 @@ // that tells the compiler whether your architecture // has vectorized support for the operations you need +namespace cnn { +template struct const_add_op { + const_add_op(const Scalar& c) : c(c) {} + CNN_DEVICE_FUNC inline const Scalar operator() (const Scalar& x) const { + return c + x; + } + template + CNN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const { + using namespace Eigen::internal; + return padd(pset1(c), x); + } + Scalar c; +}; +} + +namespace Eigen { namespace internal { +template +struct functor_traits > { + enum { + Cost = NumTraits::AddCost * 2, + PacketAccess = packet_traits::HasAdd + }; +}; +} } + +namespace cnn { +template struct const_minus_op { + const_minus_op(const Scalar& c) : c(c) {} + CNN_DEVICE_FUNC inline const Scalar operator() (const Scalar& x) const { + return c - x; + } + template + CNN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const { + using namespace Eigen::internal; + return psub(pset1(c), x); + } + Scalar c; +}; +} + +namespace Eigen { namespace internal { +template +struct functor_traits > { + enum { + Cost = NumTraits::AddCost * 2, + PacketAccess = packet_traits::HasSub + }; +}; +} } + namespace cnn { template struct scalar_logistic_sigmoid_op { EIGEN_EMPTY_STRUCT_CTOR(scalar_logistic_sigmoid_op) @@ -45,6 +95,33 @@ struct functor_traits > { }; } } +namespace cnn { +template struct scalar_erf_backward_op { + EIGEN_EMPTY_STRUCT_CTOR(scalar_erf_backward_op) + CNN_DEVICE_FUNC inline const Scalar operator() (const Scalar& x, const Scalar& d) const { + using std::exp; + const Scalar sqrt_pi_over2(1.1283791670955125738961589); + return sqrt_pi_over2 * exp(-x * x) * d; + } + template + CNN_DEVICE_FUNC inline Packet packetOp(const Packet& x, const Packet& d) const { + using namespace Eigen::internal; + const Packet sqrt_pi_over2 = pset1(1.1283791670955125738961589); + return pmul(sqrt_pi_over2, pmul(pexp(pnegate(pmul(x, x))), d)); + } +}; +} + +namespace Eigen { namespace internal { +template +struct functor_traits > { + enum { + Cost = NumTraits::MulCost * 8, + PacketAccess = packet_traits::HasExp && packet_traits::HasMul && packet_traits::HasNegate + }; +}; +} } + namespace cnn { template struct scalar_logistic_sigmoid_backward_op { EIGEN_EMPTY_STRUCT_CTOR(scalar_logistic_sigmoid_backward_op) @@ -120,6 +197,7 @@ namespace cnn { template struct scalar_nlsoftmax_backward_op { scalar_nlsoftmax_backward_op(const Scalar& lz, const Scalar& err) : logz(lz), d(err) {} CNN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& t) const { + using std::exp; return exp(t - logz) * d; } template From 3f2ec2697c5c3f4f520cf1ed5a557a04c8be4bfe Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 20 Dec 2015 00:52:09 -0400 Subject: [PATCH 343/965] better name --- cnn/CMakeLists.txt | 2 +- cnn/nodes.cc | 2 +- cnn/{xfunctors.h => simd-functors.h} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename cnn/{xfunctors.h => simd-functors.h} (100%) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 617e32e0b..290fd9cf8 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -57,10 +57,10 @@ set(cnn_library_HDRS rnn.h saxe-init.h shadow-params.h + simd-functors.h tensor.h timing.h training.h - xfunctors.h ) if(WITH_CUDA_BACKEND) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 2c730e70a..05a863303 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -3,7 +3,7 @@ #include #include -#include "cnn/xfunctors.h" +#include "cnn/simd-functors.h" #include "cnn/functors.h" #if HAVE_CUDA #include "cnn/cuda.h" diff --git a/cnn/xfunctors.h b/cnn/simd-functors.h similarity index 100% rename from cnn/xfunctors.h rename to cnn/simd-functors.h From 5a9a99f3c20970f30cb2e9f9536899762ac3dda9 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 20 Dec 2015 00:55:41 -0400 Subject: [PATCH 344/965] typo --- cnn/simd-functors.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cnn/simd-functors.h b/cnn/simd-functors.h index 10bad448d..a971a4285 100644 --- a/cnn/simd-functors.h +++ b/cnn/simd-functors.h @@ -10,12 +10,13 @@ // breaks backward compatibility by changing an internal interface, I want // the necessary changes to be localized. // -// to implement your own functor, you need to +// to implement your own functor, you need to provide // 1) operator() implemented on the scalar data type // 2) packetOp implemented using vector ("packet") type // 3) the functor_traits specialization for your functor // that tells the compiler whether your architecture // has vectorized support for the operations you need +// and an estimate of the cost of the operation namespace cnn { template struct const_add_op { From 223ccee7dd49a52d9247a86521f9fd0823efffd9 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 20 Dec 2015 01:46:07 -0400 Subject: [PATCH 345/965] add scalar pow operation --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/nodes-common.cc | 16 ++++++++++++++++ cnn/nodes.cc | 24 ++++++++++++++++++++++++ cnn/nodes.h | 14 ++++++++++++++ 5 files changed, 56 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index 42594c74d..4efc9557c 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -52,6 +52,7 @@ Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_ Expression log_softmax(const Expression& x, const std::vector& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } Expression softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression softsign(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression pow(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression min(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression max(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression noise(const Expression& x, real stddev) { return Expression(x.pg, x.pg->add_function({x.i}, stddev)); } diff --git a/cnn/expr.h b/cnn/expr.h index d91be69a9..b44c4b638 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -66,6 +66,7 @@ Expression log_softmax(const Expression& x); Expression log_softmax(const Expression& x, const std::vector& restriction); Expression softmax(const Expression& x); Expression softsign(const Expression& x); +Expression pow(const Expression& x, const Expression& y); Expression min(const Expression& x, const Expression& y); Expression max(const Expression& x, const Expression& y); Expression noise(const Expression& x, real stddev); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index c292c15c5..003d165cc 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -619,6 +619,22 @@ Dim CwiseMultiply::dim_forward(const vector& xs) const { return d; } +string Pow::as_string(const vector& arg_names) const { + ostringstream s; + s << arg_names[0] << " ** " << arg_names[1]; + return s.str(); +} + +Dim Pow::dim_forward(const vector& xs) const { + assert(xs.size() == 2); + Dim d = xs[0].truncate(); + if (xs[1].truncate().single_batch().size() != 1) { + cerr << "Bad input dimensions in Pow: " << xs << endl; + abort(); + } + return d; +} + string CwiseQuotient::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0] << " / " << arg_names[1]; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 05a863303..8ef4985e5 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -34,6 +34,30 @@ using namespace std; namespace cnn { +void Pow::forward_impl(const vector& xs, Tensor& fx) const { + assert(xs.size() == 2); + auto x1 = **xs[0]; + auto x2 = xs[1]->v[0]; + (*fx).array() = x1.array().pow(x2); +} + +void Pow::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(xs.size() == 2); + auto x1 = **xs[0]; + auto x2 = xs[1]->v[0]; + if (i == 0) { + *dEdxi += (x2 * x1.array().pow(x2 - 1).matrix()).cwiseProduct(*dEdf); + } else { + // y = a^x + // dy/dx = a^x * log(a) + (*dEdxi).noalias() += (*fx).cwiseProduct(x1.array().log().matrix()).transpose() * (*dEdf); + } +} + size_t Min::aux_storage_size() const { return dim.size() * sizeof(float); } diff --git a/cnn/nodes.h b/cnn/nodes.h index 8cd6bfb3b..31848bc01 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -5,6 +5,20 @@ namespace cnn { +// y = pow(x_1, x_2) +// x_2 raise every element in x_1 to the power of scalar x_2 +struct Pow : public Node { + explicit Pow(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = min{x_1, x_2} struct Min : public Node { explicit Min(const std::initializer_list& a) : Node(a) {} From ac500531a43310bd32b881d18ec6b4d9adb05ad9 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 20 Dec 2015 02:03:52 -0400 Subject: [PATCH 346/965] vectorize logsumexp --- cnn/nodes.cc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 8ef4985e5..7f141a143 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -388,11 +388,18 @@ void ConstantMinusX::backward_impl(const vector& xs, template EIGEN_STRONG_INLINE float logsumexp(const T& x) { + using std::exp; + using std::log; const float m = x.maxCoeff(); +#if 1 + // these are equivalent, but this can use vectorized arithmetic + float z = x.unaryExpr(const_add_op(-m)).array().exp().matrix().sum(); +#else float z = 0; for (unsigned i = 0; i < x.rows(); ++i) - z += expf(x(i,0) - m); - return m + logf(z); + z += exp(x(i,0) - m); +#endif + return m + log(z); } // this i need to do something better, but this is a work-around From 31922b3f38f6185762221f9f80997d1cf24e47e0 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 20 Dec 2015 02:16:46 -0400 Subject: [PATCH 347/965] fix test failure --- tests/test-cnn.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test-cnn.cc b/tests/test-cnn.cc index 8cf68b294..248df3dce 100644 --- a/tests/test-cnn.cc +++ b/tests/test-cnn.cc @@ -5,10 +5,9 @@ struct ConfigureCNNTest { ConfigureCNNTest() { // set up some dummy arguments to cnn - for (auto x : {"ConfigureCNNTest", "--cnn.mem", "1MB"}) { + for (auto x : {"ConfigureCNNTest", "--cnn-mem", "10"}) { av.push_back(strdup(x)); } - av.push_back(nullptr); char **argv = &av[0]; int argc = av.size(); cnn::Initialize(argc, argv); From cde1508738c5619e66899766feba08f10038c9df Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 20 Dec 2015 19:43:47 -0500 Subject: [PATCH 348/965] better out of mem error --- cnn/aligned-mem-pool.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h index 0dba70a18..4525a2489 100644 --- a/cnn/aligned-mem-pool.h +++ b/cnn/aligned-mem-pool.h @@ -53,11 +53,12 @@ class AlignedMemoryPool { zero_all(); } - // returns nullptr if OOM void* allocate(size_t n) { auto rounded_n = round_up_align(n); - if (rounded_n + used > capacity) - return nullptr; + if (rounded_n + used > capacity) { + std::cerr << "cnn is out of memory, try increasing with --cnn_mem\n"; + abort(); + } void* res = static_cast(mem) + used; used += rounded_n; return res; From 994c38c394bb0bcf4029776b3d163ed3e24fdb35 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 20 Dec 2015 20:04:21 -0500 Subject: [PATCH 349/965] lgamma function --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/functors.h | 8 ++++++++ cnn/nodes-common.cc | 11 +++++++++++ cnn/nodes.cc | 14 ++++++++++++++ cnn/nodes.h | 13 +++++++++++++ 6 files changed, 48 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index 4efc9557c..e983088a4 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -40,6 +40,7 @@ Expression contract3d_1d(const Expression& x, const Expression& y, const Express Expression sqrt(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression erf(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression tanh(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression lgamma(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression exp(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression square(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index b44c4b638..91b1f2429 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -57,6 +57,7 @@ Expression tanh(const Expression& x); Expression exp(const Expression& x); Expression square(const Expression& x); Expression cube(const Expression& x); +Expression lgamma(const Expression& x); Expression log(const Expression& x); Expression logistic(const Expression& x); Expression rectify(const Expression& x); diff --git a/cnn/functors.h b/cnn/functors.h index 6313def40..41b4cf92f 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -4,6 +4,8 @@ #include #include +#include + #if HAVE_CUDA # define CNN_DEVICE_FUNC __device__ # define CNN_DEVICE_MIN -1.175494351e-38f @@ -168,6 +170,12 @@ struct FSoftmaxBackward { float off_diag_sum; }; +struct FLogGammaBackward { + CNN_DEVICE_FUNC inline float operator()(float x, float d) const { + return boost::math::digamma(x) * d; + } +}; + struct FNegLogSoftmaxBackward { FNegLogSoftmaxBackward(float lz, float err) : logz(lz), d(err) {} CNN_DEVICE_FUNC inline float operator()(float t) const { diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 003d165cc..646127172 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -366,6 +366,17 @@ Dim Exp::dim_forward(const vector& xs) const { return xs[0]; } +string LogGamma::as_string(const vector& arg_names) const { + ostringstream os; + os << "lgamma(" << arg_names[0] << ')'; + return os.str(); +} + +Dim LogGamma::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string Log::as_string(const vector& arg_names) const { ostringstream os; os << "log(" << arg_names[0] << ')'; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 7f141a143..37134862f 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -628,6 +628,20 @@ void Exp::backward_impl(const vector& xs, *dEdxi += (*dEdf).cwiseProduct(*fx); } +void LogGamma::forward_impl(const vector& xs, Tensor& fx) const { + auto x = **xs[0]; + *fx = x.array().lgamma(); +} + +void LogGamma::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + auto x = **xs[0]; + *dEdxi += x.binaryExpr(*dEdf, FLogGammaBackward()); +} + void Log::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; *fx = x.array().log(); diff --git a/cnn/nodes.h b/cnn/nodes.h index 31848bc01..4432233b7 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -318,6 +318,19 @@ struct Exp : public Node { Tensor& dEdxi) const override; }; +// y = lgamma x_1 +struct LogGamma : public Node { + explicit LogGamma(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = log x_1 (base e, i.e., natural log) struct Log : public Node { explicit Log(const std::initializer_list& a) : Node(a) {} From 278a1d4f38bded651bfd50b7e235dab1b21d11e7 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 22 Dec 2015 05:19:20 +0900 Subject: [PATCH 350/965] In options, allow for hyphen or underbar --- cnn/init.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/init.cc b/cnn/init.cc index 32672f091..ea10cfcb7 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -45,7 +45,7 @@ void Initialize(int& argc, char**& argv, unsigned random_seed, bool shared_param int argi = 1; while(argi < argc) { string arg = argv[argi]; - if (arg == "--cnn-mem") { + if (arg == "--cnn-mem" || arg == "--cnn_mem") { if ((argi + 1) > argc) { cerr << "[cnn] --cnn-mem expects an argument (the memory, in megabytes, to reserve)\n"; abort(); @@ -54,7 +54,7 @@ void Initialize(int& argc, char**& argv, unsigned random_seed, bool shared_param istringstream c(a2); c >> num_mb; RemoveArgs(argc, argv, argi, 2); } - } else if (arg == "--cnn-seed") { + } else if (arg == "--cnn-seed" || arg == "--cnn_seed") { if ((argi + 1) > argc) { cerr << "[cnn] --cnn-seed expects an argument (the random number seed)\n"; abort(); From 1e55c4c713588af4f9001005aab529af3697ef46 Mon Sep 17 00:00:00 2001 From: Austin Matthews Date: Thu, 24 Dec 2015 09:04:10 -0800 Subject: [PATCH 351/965] Fixed minor typo --- cnn/aligned-mem-pool.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h index 4525a2489..c4e50f8b6 100644 --- a/cnn/aligned-mem-pool.h +++ b/cnn/aligned-mem-pool.h @@ -56,7 +56,7 @@ class AlignedMemoryPool { void* allocate(size_t n) { auto rounded_n = round_up_align(n); if (rounded_n + used > capacity) { - std::cerr << "cnn is out of memory, try increasing with --cnn_mem\n"; + std::cerr << "cnn is out of memory, try increasing with --cnn-mem\n"; abort(); } void* res = static_cast(mem) + used; From 6e49f0ca34ecdd5ef9774783b9b1049b995d96dd Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Sat, 26 Dec 2015 00:18:27 +0200 Subject: [PATCH 352/965] pass cmdline args to pycnn init --- pycnn/pycnn.pyx | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index c1768606d..e6f64d40b 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -2,6 +2,7 @@ import sys from cython.operator cimport dereference as deref +from libc.stdlib cimport malloc, free import numpy as np # TODO: # - set random seed (in CNN) @@ -30,16 +31,25 @@ import numpy as np from pycnn cimport * cimport pycnn + + + cdef init(random_seed=None): - cdef char** argv = [] - cdef int argc = 0 + cdef int argc = len(sys.argv) + cdef char** c_argv + args = [bytes(x) for x in sys.argv] + c_argv = malloc(sizeof(char*) * len(args)) # TODO check failure? + for idx, s in enumerate(args): + c_argv[idx] = s + if random_seed is None: - pycnn.Initialize(argc,argv, 0) + pycnn.Initialize(argc,c_argv, 0) else: if random_seed == 0: random_seed = 1 - pycnn.Initialize(argc,argv, random_seed) -init() # TODO: allow different random seeds + pycnn.Initialize(argc,c_argv, random_seed) + free(c_argv) +init() # TODO: allow different random seeds cdef CDim Dim(dim): """ From 69309b19f91e55d5a8d0c0fa8f47eab92cf7a938 Mon Sep 17 00:00:00 2001 From: yogo Date: Sat, 26 Dec 2015 17:02:36 +0200 Subject: [PATCH 353/965] slightly better python packaging --- pycnn/setup.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pycnn/setup.py b/pycnn/setup.py index e7100d369..b82e01593 100644 --- a/pycnn/setup.py +++ b/pycnn/setup.py @@ -1,5 +1,5 @@ -from distutils.core import setup -from distutils.extension import Extension +from setuptools import setup +from setuptools.extension import Extension from Cython.Distutils import build_ext @@ -20,9 +20,9 @@ #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed extra_compile_args=["-std=c++11"], runtime_library_dirs=["$ORIGIN/./"], - ) setup(ext_modules = [ext], - cmdclass = {'build_ext': build_ext} + cmdclass = {'build_ext': build_ext}, + name="pyCNN", ) From fa690bf28e11eebd7cc4c63a1d02182509dda4f2 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 27 Dec 2015 02:09:40 -0500 Subject: [PATCH 354/965] stub for reference impl of rnnlm --- rnnlm/install-examples.sh | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100755 rnnlm/install-examples.sh diff --git a/rnnlm/install-examples.sh b/rnnlm/install-examples.sh new file mode 100755 index 000000000..6d37d5fb2 --- /dev/null +++ b/rnnlm/install-examples.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -e + +data_version=ptb-mikolov-01.tar.gz + +ROOTDIR=`dirname $0` +cd $ROOTDIR + +rm -f $data_version +rm -rf ptb-mikolov +curl -f http://demo.clab.cs.cmu.edu/cdyer/$data_version -o $data_version +tar xzf $data_version +rm -f $data_version + +echo SUCCESS. 1>&2 + From 8e724ccd78ff9eba4eef77fbbb2a8e0847380758 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 27 Dec 2015 02:11:01 -0500 Subject: [PATCH 355/965] ignore data --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 5724586f1..5356368f0 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,9 @@ examples/xor-xent examples/rnnlm examples/nlm +#data +rnnlm/ptb-mikolov/ + # Compiled Object files *.slo *.lo From d627bf195a6f02c4131350aaa33797a688243cca Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 27 Dec 2015 02:17:56 -0500 Subject: [PATCH 356/965] cleaned up LM code --- CMakeLists.txt | 1 + rnnlm/CMakeLists.txt | 15 +++ rnnlm/lm.cc | 298 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 314 insertions(+) create mode 100644 rnnlm/CMakeLists.txt create mode 100644 rnnlm/lm.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 168403890..2bd1b30e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -96,4 +96,5 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory(cnn) add_subdirectory(tests) add_subdirectory(examples) +add_subdirectory(rnnlm) enable_testing() diff --git a/rnnlm/CMakeLists.txt b/rnnlm/CMakeLists.txt new file mode 100644 index 000000000..f2176bba0 --- /dev/null +++ b/rnnlm/CMakeLists.txt @@ -0,0 +1,15 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.8) + +foreach(TARGET lm) + ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) + target_link_libraries(${TARGET} cnn ${LIBS} pthread) + if(UNIX AND NOT APPLE) + target_link_libraries(${TARGET} rt) + endif() + if (WITH_CUDA_BACKEND) + add_dependencies(${TARGET} cnncuda) + target_link_libraries(${TARGET} cnncuda) + CUDA_ADD_CUBLAS_TO_TARGET(${TARGET}) + endif (WITH_CUDA_BACKEND) +endforeach() + diff --git a/rnnlm/lm.cc b/rnnlm/lm.cc new file mode 100644 index 000000000..4e0c7d1cf --- /dev/null +++ b/rnnlm/lm.cc @@ -0,0 +1,298 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/timing.h" +#include "cnn/rnn.h" +#include "cnn/gru.h" +#include "cnn/lstm.h" +#include "cnn/dict.h" +#include "cnn/expr.h" +#include "cnn/cfsm-builder.h" + +#include +#include +#include + +#include +#include +#include + +using namespace std; +using namespace cnn; + +unsigned LAYERS = 0; +unsigned INPUT_DIM = 0; +unsigned HIDDEN_DIM = 0; +unsigned VOCAB_SIZE = 0; +float DROPOUT = 0; +ClassFactoredSoftmaxBuilder* cfsm = nullptr; + +cnn::Dict d; +int kSOS; +int kEOS; + +volatile bool INTERRUPTED = false; + +namespace po = boost::program_options; +void InitCommandLine(int argc, char** argv, po::variables_map* conf) { + po::options_description opts("Configuration options"); + opts.add_options() + ("train,t", po::value(), "training corpus") + ("dev,d", po::value(), "development (validation) corpus") + ("test,p", po::value(), "test corpus") + ("clusters,c", po::value(), "word cluster file for class factored softmax") + ("sample,s", "periodically generate random samples from model as it trains (recommended)") + ("model,m", po::value(), "load model from this file") + ("input_dim,i", po::value()->default_value(128), "input embedding dimension") + ("hidden_dim,h", po::value()->default_value(128), "hidden layer size") + ("layers,l", po::value()->default_value(2), "number of layers in RNN") + ("rnn_type,r", po::value()->default_value("lstm"), "RNN type, one of: LSTM, GRU, RNN") + ("dropout,D", po::value(), "dropout rate (recommended between 0.2 and 0.5)") + ("eta_decay_onset_epoch", po::value(), "start decaying eta every epoch after this epoch (try 8)") + ("eta_decay_rate", po::value(), "how much to decay eta by (recommended 0.5)") + ("help,h", "Help"); + po::options_description dcmdline_options; + dcmdline_options.add(opts); + po::store(parse_command_line(argc, argv, dcmdline_options), *conf); + if (conf->count("help")) { + cerr << dcmdline_options << endl; + exit(1); + } +} + +template +struct RNNLanguageModel { + LookupParameters* p_c; + Parameters* p_R; + Parameters* p_bias; + Builder builder; + explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({VOCAB_SIZE}); + } + + // return Expression of total loss + Expression BuildLMGraph(const vector& sent, ComputationGraph& cg, bool apply_dropout) { + const unsigned slen = sent.size(); + if (apply_dropout) { + builder.set_dropout(DROPOUT); + } else { + builder.disable_dropout(); + } + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + if (cfsm) cfsm->new_graph(cg); + Expression R = parameter(cg, p_R); // hidden -> word rep parameter + Expression bias = parameter(cg, p_bias); // word bias + vector errs(slen + 1); + Expression h_t = builder.add_input(lookup(cg, p_c, kSOS)); // read + for (unsigned t = 0; t < slen; ++t) { // h_t = RNN(x_0,...,x_t) + if (cfsm) { // class-factored softmax + errs[t] = cfsm->neg_log_softmax(h_t, sent[t]); + } else { // regular softmax + Expression u_t = affine_transform({bias, R, h_t}); + errs[t] = pickneglogsoftmax(u_t, sent[t]); + } + Expression x_t = lookup(cg, p_c, sent[t]); + h_t = builder.add_input(x_t); + } + // it reamins to deal predict + if (cfsm) { + errs.back() = cfsm->neg_log_softmax(h_t, kEOS); + } else { + Expression u_last = affine_transform({bias, R, h_t}); + errs.back() = pickneglogsoftmax(u_last, kEOS); // predict + } + return sum(errs); + } + + void RandomSample(int max_len = 150) { +#if 0 + return; + cerr << endl; + ComputationGraph cg; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + + Expression R = parameter(cg, p_R); + Expression bias = parameter(cg, p_bias); + vector errs; + int len = 0; + int cur = kSOS; + while(len < max_len && cur != kEOS) { + ++len; + Expression x_t = lookup(cg, p_c, cur); + // h_t = RNN(x_t) + Expression h_t = builder.add_input(x_t); + Expression u_t = affine_transform({bias, R, h_t}); + Expression ydist = softmax(i_u_t); + + unsigned w = 0; + while (w == 0 || (int)w == kSOS) { + auto dist = as_vector(cg.incremental_forward()); + double p = rand01(); + for (; w < dist.size(); ++w) { + p -= dist[w]; + if (p < 0.0) { break; } + } + if (w == dist.size()) w = kEOS; + } + cerr << (len == 1 ? "" : " ") << d.Convert(w); + cur = w; + } + cerr << endl; +#endif + } +}; + +int main(int argc, char** argv) { + cerr << "COMMAND LINE:"; + for (unsigned i = 0; i < static_cast(argc); ++i) cerr << ' ' << argv[i]; + cerr << endl; + cnn::Initialize(argc, argv); + po::variables_map conf; + InitCommandLine(argc, argv, &conf); + kSOS = d.Convert(""); + kEOS = d.Convert(""); + LAYERS = conf["layers"].as(); + INPUT_DIM = conf["input_dim"].as(); + HIDDEN_DIM = conf["hidden_dim"].as(); + if (conf.count("dropout")) + DROPOUT = conf["dropout"].as(); + Model model; + if (conf.count("clusters")) + cfsm = new ClassFactoredSoftmaxBuilder(HIDDEN_DIM, conf["clusters"].as(), &d, &model); + float eta_decay_rate = 1; + unsigned eta_decay_onset_epoch = 0; + if (conf.count("eta_decay_onset_epoch")) + eta_decay_onset_epoch = conf["eta_decay_onset_epoch"].as(); + if (conf.count("eta_decay_rate")) + eta_decay_rate = conf["eta_decay_rate"].as(); + vector> training, dev, test; + string line; + int tlc = 0; + int ttoks = 0; + { + string trainf = conf["train"].as(); + cerr << "Reading training data from " << trainf << " ...\n"; + ifstream in(trainf); + assert(in); + while(getline(in, line)) { + ++tlc; + training.push_back(ReadSentence(line, &d)); + ttoks += training.back().size(); + if (training.back().front() == kSOS || training.back().back() == kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " started with or ended with \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + d.Freeze(); // no new word types allowed + d.SetUnk(""); + VOCAB_SIZE = d.size(); + + int dlc = 0; + int dtoks = 0; + { + string devf = conf["dev"].as(); + cerr << "Reading dev data from " << devf << " ...\n"; + ifstream in(devf); + assert(in); + while(getline(in, line)) { + ++dlc; + dev.push_back(ReadSentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() == kSOS || dev.back().back() == kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " started with or ended with \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + ostringstream os; + os << "lm" + << '_' << DROPOUT + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Trainer* sgd = new SimpleSGDTrainer(&model); + RNNLanguageModel lm(model); + + bool has_model_to_load = conf.count("model"); + if (has_model_to_load) { + string fname = conf["model"].as(); + ifstream in(fname); + assert(in); + boost::archive::binary_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 100; + unsigned dev_every_i_reports = 25; + unsigned si = training.size(); + if (report_every_i > si) report_every_i = si; + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + double lines = 0; + int completed_epoch = -1; + while(!INTERRUPTED) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + completed_epoch++; + if (eta_decay_onset_epoch && completed_epoch >= (int)eta_decay_onset_epoch) + sgd->eta *= eta_decay_rate; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& sent = training[order[si]]; + chars += sent.size(); + ++si; + lm.BuildLMGraph(sent, cg, DROPOUT > 0.f); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(); + ++lines; + } + report++; + cerr << '#' << report << " [epoch=" << (lines / training.size()) << " eta=" << sgd->eta << "] E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + //lm.RandomSample(); + + // show score on dev data? + if (report % dev_every_i_reports == 0) { + double dloss = 0; + int dchars = 0; + for (auto& sent : dev) { + ComputationGraph cg; + lm.BuildLMGraph(sent, cg, false); + dloss += as_scalar(cg.forward()); + dchars += sent.size(); + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::binary_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } + } + delete sgd; +} + From acc3507e2f87f18d451d65fb5ed31f96fd49f833 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 27 Dec 2015 11:31:35 -0500 Subject: [PATCH 357/965] readme --- rnnlm/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 rnnlm/README.md diff --git a/rnnlm/README.md b/rnnlm/README.md new file mode 100644 index 000000000..42a860c60 --- /dev/null +++ b/rnnlm/README.md @@ -0,0 +1,8 @@ + + +### PTB Baselines + +| Model | dev | test | +| ----- | ---:| ----:| +| 5-gram KN | 188.0 | 178.9 | + From 26cce22a8ccd4de33ec6e134c9cec2c8697b7c06 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 27 Dec 2015 15:34:48 -0500 Subject: [PATCH 358/965] LM stuff --- rnnlm/README.md | 11 ++- rnnlm/lm.cc | 241 ++++++++++++++++++++++++++++-------------------- 2 files changed, 150 insertions(+), 102 deletions(-) diff --git a/rnnlm/README.md b/rnnlm/README.md index 42a860c60..e4f77f7ed 100644 --- a/rnnlm/README.md +++ b/rnnlm/README.md @@ -1,8 +1,17 @@ +### Training example + + ./rnnlm/lm -x -s -t ../rnnlm/ptb-mikolov/train.txt -d ../rnnlm/ptb-mikolov/valid.txt \ + -c ../rnnlm/ptb-mikolov/clusters-mkcls.txt -D 0.3 -H 256 --eta_decay_onset_epoch 10 --eta_decay_rate 0.5 + +### Evaluation example + + ./rnnlm/lm -t ../rnnlm/ptb-mikolov/train.txt -c ../rnnlm/ptb-mikolov/clusters-mkcls.txt \ + -m lm_0.3_2_128_256-pid7865.params -H 256 -p ../rnnlm/ptb-mikolov/test.txt ### PTB Baselines | Model | dev | test | | ----- | ---:| ----:| | 5-gram KN | 188.0 | 178.9 | - +| 2x128, dropout=0.3 | 164.4 | 157.7 | diff --git a/rnnlm/lm.cc b/rnnlm/lm.cc index 4e0c7d1cf..442653890 100644 --- a/rnnlm/lm.cc +++ b/rnnlm/lm.cc @@ -25,6 +25,7 @@ unsigned INPUT_DIM = 0; unsigned HIDDEN_DIM = 0; unsigned VOCAB_SIZE = 0; float DROPOUT = 0; +bool SAMPLE = false; ClassFactoredSoftmaxBuilder* cfsm = nullptr; cnn::Dict d; @@ -38,16 +39,17 @@ void InitCommandLine(int argc, char** argv, po::variables_map* conf) { po::options_description opts("Configuration options"); opts.add_options() ("train,t", po::value(), "training corpus") - ("dev,d", po::value(), "development (validation) corpus") + ("dev,d", po::value(), "development/validation corpus") ("test,p", po::value(), "test corpus") + ("learn,x", "set this to estimate the language model from the training data") ("clusters,c", po::value(), "word cluster file for class factored softmax") ("sample,s", "periodically generate random samples from model as it trains (recommended)") ("model,m", po::value(), "load model from this file") ("input_dim,i", po::value()->default_value(128), "input embedding dimension") - ("hidden_dim,h", po::value()->default_value(128), "hidden layer size") + ("hidden_dim,H", po::value()->default_value(128), "hidden layer size") ("layers,l", po::value()->default_value(2), "number of layers in RNN") - ("rnn_type,r", po::value()->default_value("lstm"), "RNN type, one of: LSTM, GRU, RNN") ("dropout,D", po::value(), "dropout rate (recommended between 0.2 and 0.5)") + ("eta0,e", po::value()->default_value(0.1f), "initial learning rate") ("eta_decay_onset_epoch", po::value(), "start decaying eta every epoch after this epoch (try 8)") ("eta_decay_rate", po::value(), "how much to decay eta by (recommended 0.5)") ("help,h", "Help"); @@ -58,6 +60,10 @@ void InitCommandLine(int argc, char** argv, po::variables_map* conf) { cerr << dcmdline_options << endl; exit(1); } + if (conf->count("train") == 0) { + cerr << "Training data must always be specified (it determines the vocab mapping) with --train\n"; + exit(1); + } } template @@ -107,42 +113,38 @@ struct RNNLanguageModel { return sum(errs); } - void RandomSample(int max_len = 150) { -#if 0 - return; - cerr << endl; + void RandomSample(int max_len = 200) { ComputationGraph cg; builder.new_graph(cg); // reset RNN builder for new graph builder.start_new_sequence(); - - Expression R = parameter(cg, p_R); - Expression bias = parameter(cg, p_bias); - vector errs; - int len = 0; + if (cfsm) cfsm->new_graph(cg); + Expression R = parameter(cg, p_R); // hidden -> word rep parameter + Expression bias = parameter(cg, p_bias); // word bias + Expression h_t = builder.add_input(lookup(cg, p_c, kSOS)); // read int cur = kSOS; - while(len < max_len && cur != kEOS) { - ++len; - Expression x_t = lookup(cg, p_c, cur); - // h_t = RNN(x_t) - Expression h_t = builder.add_input(x_t); - Expression u_t = affine_transform({bias, R, h_t}); - Expression ydist = softmax(i_u_t); - - unsigned w = 0; - while (w == 0 || (int)w == kSOS) { + int len = 0; + while(len < max_len) { + if (cfsm) { // class-factored softmax + cur = cfsm->sample(h_t); + } else { // regular softmax + Expression u_t = affine_transform({bias, R, h_t}); + softmax(u_t); auto dist = as_vector(cg.incremental_forward()); double p = rand01(); - for (; w < dist.size(); ++w) { - p -= dist[w]; + cur = 0; + for (; cur < dist.size(); ++cur) { + p -= dist[cur]; if (p < 0.0) { break; } } - if (w == dist.size()) w = kEOS; + if (cur == dist.size()) cur = kEOS; } - cerr << (len == 1 ? "" : " ") << d.Convert(w); - cur = w; + if (cur == kEOS) break; + ++len; + cerr << (len == 1 ? "" : " ") << d.Convert(cur); + Expression x_t = lookup(cg, p_c, cur); + h_t = builder.add_input(x_t); } cerr << endl; -#endif } }; @@ -158,6 +160,7 @@ int main(int argc, char** argv) { LAYERS = conf["layers"].as(); INPUT_DIM = conf["input_dim"].as(); HIDDEN_DIM = conf["hidden_dim"].as(); + SAMPLE = conf.count("sample"); if (conf.count("dropout")) DROPOUT = conf["dropout"].as(); Model model; @@ -193,105 +196,141 @@ int main(int argc, char** argv) { d.SetUnk(""); VOCAB_SIZE = d.size(); - int dlc = 0; - int dtoks = 0; - { - string devf = conf["dev"].as(); - cerr << "Reading dev data from " << devf << " ...\n"; - ifstream in(devf); + if (conf.count("test")) { + string testf = conf["test"].as(); + cerr << "Reading test data from " << testf << " ...\n"; + ifstream in(testf); assert(in); while(getline(in, line)) { - ++dlc; - dev.push_back(ReadSentence(line, &d)); - dtoks += dev.back().size(); - if (dev.back().front() == kSOS || dev.back().back() == kEOS) { - cerr << "Dev sentence in " << argv[2] << ":" << tlc << " started with or ended with \n"; + test.push_back(ReadSentence(line, &d)); + if (test.back().front() == kSOS || test.back().back() == kEOS) { + cerr << "Test sentence in " << argv[2] << ":" << tlc << " started with or ended with \n"; abort(); } } - cerr << dlc << " lines, " << dtoks << " tokens\n"; } - ostringstream os; - os << "lm" - << '_' << DROPOUT - << '_' << LAYERS - << '_' << INPUT_DIM - << '_' << HIDDEN_DIM - << "-pid" << getpid() << ".params"; - const string fname = os.str(); - cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; Trainer* sgd = new SimpleSGDTrainer(&model); + sgd->eta0 = sgd->eta = conf["eta0"].as(); RNNLanguageModel lm(model); bool has_model_to_load = conf.count("model"); if (has_model_to_load) { string fname = conf["model"].as(); + cerr << "Reading parameters from " << fname << "...\n"; ifstream in(fname); assert(in); boost::archive::binary_iarchive ia(in); ia >> model; } - unsigned report_every_i = 100; - unsigned dev_every_i_reports = 25; - unsigned si = training.size(); - if (report_every_i > si) report_every_i = si; - vector order(training.size()); - for (unsigned i = 0; i < order.size(); ++i) order[i] = i; - bool first = true; - int report = 0; - double lines = 0; - int completed_epoch = -1; - while(!INTERRUPTED) { - Timer iteration("completed in"); - double loss = 0; - unsigned chars = 0; - for (unsigned i = 0; i < report_every_i; ++i) { - if (si == training.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - completed_epoch++; - if (eta_decay_onset_epoch && completed_epoch >= (int)eta_decay_onset_epoch) - sgd->eta *= eta_decay_rate; - shuffle(order.begin(), order.end(), *rndeng); - } + bool LEARN = conf.count("learn"); - // build graph for this instance - ComputationGraph cg; - auto& sent = training[order[si]]; - chars += sent.size(); - ++si; - lm.BuildLMGraph(sent, cg, DROPOUT > 0.f); - loss += as_scalar(cg.forward()); - cg.backward(); - sgd->update(); - ++lines; + if (LEARN) { + int dlc = 0; + int dtoks = 0; + if (conf.count("dev") == 0) { + cerr << "You must specify a development set (--dev file.txt) with --learn" << endl; + abort(); + } else { + string devf = conf["dev"].as(); + cerr << "Reading dev data from " << devf << " ...\n"; + ifstream in(devf); + assert(in); + while(getline(in, line)) { + ++dlc; + dev.push_back(ReadSentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() == kSOS || dev.back().back() == kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " started with or ended with \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; } - report++; - cerr << '#' << report << " [epoch=" << (lines / training.size()) << " eta=" << sgd->eta << "] E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; - //lm.RandomSample(); + ostringstream os; + os << "lm" + << '_' << DROPOUT + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + unsigned report_every_i = 100; + unsigned dev_every_i_reports = 25; + unsigned si = training.size(); + if (report_every_i > si) report_every_i = si; + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + double lines = 0; + int completed_epoch = -1; + while(!INTERRUPTED) { + if (SAMPLE) lm.RandomSample(); + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + completed_epoch++; + if (eta_decay_onset_epoch && completed_epoch >= (int)eta_decay_onset_epoch) + sgd->eta *= eta_decay_rate; + shuffle(order.begin(), order.end(), *rndeng); + } - // show score on dev data? - if (report % dev_every_i_reports == 0) { - double dloss = 0; - int dchars = 0; - for (auto& sent : dev) { + // build graph for this instance ComputationGraph cg; - lm.BuildLMGraph(sent, cg, false); - dloss += as_scalar(cg.forward()); - dchars += sent.size(); + auto& sent = training[order[si]]; + chars += sent.size(); + ++si; + lm.BuildLMGraph(sent, cg, DROPOUT > 0.f); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(); + ++lines; } - if (dloss < best) { - best = dloss; - ofstream out(fname); - boost::archive::binary_oarchive oa(out); - oa << model; + report++; + cerr << '#' << report << " [epoch=" << (lines / training.size()) << " eta=" << sgd->eta << "] E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + + // show score on dev data? + if (report % dev_every_i_reports == 0) { + double dloss = 0; + int dchars = 0; + for (auto& sent : dev) { + ComputationGraph cg; + lm.BuildLMGraph(sent, cg, false); + dloss += as_scalar(cg.forward()); + dchars += sent.size(); + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::binary_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; } - cerr << "\n***DEV [epoch=" << (lines / training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; } + } // train? + if (conf.count("test")) { + cerr << "Evaluating test data...\n"; + double tloss = 0; + int tchars = 0; + for (auto& sent : test) { + ComputationGraph cg; + lm.BuildLMGraph(sent, cg, false); + tloss += as_scalar(cg.forward()); + tchars += sent.size(); + } + cerr << "TEST -LLH = " << tloss << endl; + cerr << "TEST CROSS ENTOPY (NATS) = " << (tloss / tchars) << endl; + cerr << "TEST PPL = " << exp(tloss / tchars) << endl; } delete sgd; } From c47daa49ccb4b78ca52dedbfa996faa97dc7832a Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 27 Dec 2015 15:37:32 -0500 Subject: [PATCH 359/965] clean up --- README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 89daddcf4..87a5f6b10 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,7 @@ C++ neural network library #### Getting started -You need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function properly. If you use the current stable release, you will get an error like the following: - - Assertion failed: (false && "heap allocation is forbidden (EIGEN_NO_MALLOC is defined)"), function check_that_malloc_is_allowed, file /Users/cdyer/software/eigen-eigen-10219c95fe65/Eigen/src/Core/util/Memory.h, line 188. - +You need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function. If you use the release version, you may get assertion failures or compile errors. #### Building From a426ed3b6fe9b860100a171db6255b09d074f071 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 27 Dec 2015 15:38:38 -0500 Subject: [PATCH 360/965] comment --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 87a5f6b10..0c4a89170 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # cnn C++ neural network library -#### Getting started +#### Important: Eigen version requirement -You need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function. If you use the release version, you may get assertion failures or compile errors. +You need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function. **If you use the release version rather than the development version, you may get assertion failures or compile errors.** #### Building From 47144b722a04ea1f71fa83c90372c6feb61aaf4b Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 27 Dec 2015 15:39:50 -0500 Subject: [PATCH 361/965] download data --- rnnlm/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rnnlm/README.md b/rnnlm/README.md index e4f77f7ed..5bcb9a0d1 100644 --- a/rnnlm/README.md +++ b/rnnlm/README.md @@ -1,3 +1,8 @@ +### Obtaining LM data + + ./install-examples.sh + +This downloads the data used in this tutorial. ### Training example From 2a7374078f0a7eb0ac078f624b2ee525cd36fc1e Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 27 Dec 2015 15:41:51 -0500 Subject: [PATCH 362/965] comments --- rnnlm/README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/rnnlm/README.md b/rnnlm/README.md index 5bcb9a0d1..c71d8f58b 100644 --- a/rnnlm/README.md +++ b/rnnlm/README.md @@ -6,11 +6,20 @@ This downloads the data used in this tutorial. ### Training example +Train an LSTM LM using a class-factor softmax: + ./rnnlm/lm -x -s -t ../rnnlm/ptb-mikolov/train.txt -d ../rnnlm/ptb-mikolov/valid.txt \ -c ../rnnlm/ptb-mikolov/clusters-mkcls.txt -D 0.3 -H 256 --eta_decay_onset_epoch 10 --eta_decay_rate 0.5 +Train an LSTM LM with a standard softmax: + + ./rnnlm/lm -x -s -t ../rnnlm/ptb-mikolov/train.txt -d ../rnnlm/ptb-mikolov/valid.txt \ + -D 0.3 -H 256 --eta_decay_onset_epoch 10 --eta_decay_rate 0.5 + ### Evaluation example +Evaluate a trained model: + ./rnnlm/lm -t ../rnnlm/ptb-mikolov/train.txt -c ../rnnlm/ptb-mikolov/clusters-mkcls.txt \ -m lm_0.3_2_128_256-pid7865.params -H 256 -p ../rnnlm/ptb-mikolov/test.txt @@ -19,4 +28,4 @@ This downloads the data used in this tutorial. | Model | dev | test | | ----- | ---:| ----:| | 5-gram KN | 188.0 | 178.9 | -| 2x128, dropout=0.3 | 164.4 | 157.7 | +| 2x128, dropout=0.3, class-factored softmax | 164.4 | 157.7 | From c20608ad21013d8fd16d717fd48b34d051164ef8 Mon Sep 17 00:00:00 2001 From: Lingpeng Kong Date: Sun, 27 Dec 2015 21:16:44 -0500 Subject: [PATCH 363/965] segrnn update --- examples/segrnn-sup.cc | 532 +++++++++++++++++++++++++++++------------ 1 file changed, 374 insertions(+), 158 deletions(-) diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index 011ea8923..edadbcb93 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -19,29 +19,26 @@ #include #include +#include +namespace po = boost::program_options; using namespace std; using namespace cnn; unsigned LAYERS = 1; unsigned INPUT_DIM = 64; -unsigned XCRIBE_DIM = 64; -unsigned SEG_DIM = 48; -unsigned H1DIM = 64; -unsigned H2DIM = 48; -unsigned TAG_DIM = 16; -unsigned TAG_SIZE = 0; -unsigned VOCAB_SIZE = 0; +unsigned XCRIBE_DIM = 32; +unsigned SEG_DIM = 16; +unsigned H1DIM = 32; +unsigned H2DIM = 32; +unsigned TAG_DIM = 32; unsigned DURATION_DIM = 4; -bool eval = false; -cnn::Dict d; -cnn::Dict td; -int kNONE; -int kSOS; -int kEOS; +unsigned int DATA_MAX_SEG_LEN = 0; bool use_pretrained_embeding = true; +bool ner_tagging = false; +string pretrained_embeding = ""; // returns embeddings of labels struct SymbolEmbedding { @@ -107,7 +104,6 @@ struct MLPDurationEmbedding : public DurationEmbedding { struct BinnedDurationEmbedding : public DurationEmbedding { BinnedDurationEmbedding(Model& m, unsigned dim, unsigned num_bins = 8) : max_bin(num_bins - 1) { - assert(num_bins > 0); p_e = m.add_lookup_parameters(num_bins, {dim}); } void new_graph(ComputationGraph& g) override { @@ -119,7 +115,7 @@ struct BinnedDurationEmbedding : public DurationEmbedding { return lookup(*cg, p_e, dur); } ComputationGraph* cg; - unsigned max_bin; + int max_bin; LookupParameters* p_e; }; @@ -134,8 +130,8 @@ struct BiTrans { explicit BiTrans(Model& model) : l2rbuilder(LAYERS, INPUT_DIM, XCRIBE_DIM, &model), r2lbuilder(LAYERS, INPUT_DIM, XCRIBE_DIM, &model) { - p_f2c = model.add_parameters({XCRIBE_DIM, INPUT_DIM}); - p_r2c = model.add_parameters({XCRIBE_DIM, INPUT_DIM}); + p_f2c = model.add_parameters({XCRIBE_DIM, XCRIBE_DIM}); + p_r2c = model.add_parameters({XCRIBE_DIM, XCRIBE_DIM}); p_cb = model.add_parameters({XCRIBE_DIM}); } @@ -239,18 +235,22 @@ struct SegEmbedBi { }; template -struct ZerothOrderSemiCRF { +struct SegmentalRNN { SymbolEmbedding* xe; SymbolEmbedding* ye; DurationEmbedding* de; BiTrans bt; SegEmbedBi seb; - explicit ZerothOrderSemiCRF(Model& model) : + cnn::Dict d; + cnn::Dict td; + explicit SegmentalRNN(Model& model, cnn::Dict& d_, cnn::Dict& td_) : bt(model), seb(model) { - xe = new SymbolEmbedding(model, VOCAB_SIZE, INPUT_DIM); + d = d_; + td = td_; + xe = new SymbolEmbedding(model, d.size(), INPUT_DIM); if (use_pretrained_embeding) { - ifstream fin("/usr1/corpora/LDC2011T13/vec-cwin.txt"); + ifstream fin(pretrained_embeding); string s; while( getline(fin,s) ) { @@ -270,7 +270,7 @@ struct ZerothOrderSemiCRF { } } - ye = new SymbolEmbedding(model, TAG_SIZE, TAG_DIM); + ye = new SymbolEmbedding(model, td.size(), TAG_DIM); de = new BinnedDurationEmbedding(model, DURATION_DIM); // potential lower layer @@ -287,6 +287,12 @@ struct ZerothOrderSemiCRF { // potential output layer p_h22o = model.add_parameters({1, H2DIM}); p_ob = model.add_parameters({1}); + + // context aware + p_c_start = model.add_parameters({XCRIBE_DIM}); + p_c_end = model.add_parameters({XCRIBE_DIM}); + p_cf2h1 = model.add_parameters({H1DIM, XCRIBE_DIM}); + p_ce2h1 = model.add_parameters({H1DIM, XCRIBE_DIM}); } // return Expression of total loss @@ -297,7 +303,7 @@ struct ZerothOrderSemiCRF { int len = x.size(); // is_ref[i][j][y] returns true iff, in the reference, span(i,j) is labeled y - vector>> is_ref(len, vector>(len+1, vector(TAG_SIZE, false))); + vector>> is_ref(len, vector>(len+1, vector(td.size(), false))); unsigned cur = 0; for (unsigned ri = 0; ri < yz.size(); ++ri) { assert(cur < len); @@ -315,6 +321,12 @@ struct ZerothOrderSemiCRF { } assert(cur == len); + // context aware + Expression c_start = parameter(cg, p_c_start); + Expression c_end = parameter(cg, p_c_end); + Expression cf2h1 = parameter(cg, p_cf2h1); + Expression ce2h1 = parameter(cg, p_ce2h1); + xe->new_graph(cg); ye->new_graph(cg); de->new_graph(cg); @@ -342,7 +354,7 @@ struct ZerothOrderSemiCRF { // ending (and including) the symbol at position j-1 f.clear(); // f stores all additive contributions to item [j] fr.clear(); - for (unsigned tag = 0; tag < TAG_SIZE; ++tag) { + for (unsigned tag = 0; tag < td.size(); ++tag) { Expression y = ye->embed(tag); const int i_start = max_seg_len ? max(0, j - max_seg_len) : 0; for (int i = i_start; i < j; ++i) { // i is the starting position @@ -350,7 +362,15 @@ struct ZerothOrderSemiCRF { auto seg_embedding_ij = seb(i, j-1); // pair Expression d = de->embed(j - i); // factor includes: fwd embedding, rev embedding, duration embedding, label embedding - Expression h1 = rectify(affine_transform({h1b, d2h1, d, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second})); + // Expression h1 = rectify(affine_transform({h1b, d2h1, d, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second})); + + // To be context aware, add c_{i-1} and c_{j} + Expression cf_embeding = (i == 0) ? c_start : c[i-1]; + Expression ce_embeding = (j == len) ? c_end : c[j]; + + // Expression h1 = rectify(affine_transform({h1b, d2h1, d, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second, cf2h1, cf_embeding, ce2h1, ce_embeding})); + Expression h1 = rectify(affine_transform({h1b, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second, cf2h1, cf_embeding, ce2h1, ce_embeding})); + Expression h2 = tanh(affine_transform({h2b, h12h2, h1})); //Expression p = exp(affine_transform({ob, h22o, h2})); Expression p = affine_transform({ob, h22o, h2}); @@ -389,6 +409,12 @@ struct ZerothOrderSemiCRF { yz_pred.clear(); int len = x.size(); + // context aware + Expression c_start = parameter(cg, p_c_start); + Expression c_end = parameter(cg, p_c_end); + Expression cf2h1 = parameter(cg, p_cf2h1); + Expression ce2h1 = parameter(cg, p_ce2h1); + xe->new_graph(cg); ye->new_graph(cg); de->new_graph(cg); @@ -418,14 +444,22 @@ struct ZerothOrderSemiCRF { f.clear(); // f stores all additive contributions to item [j] fr.clear(); ijt.clear(); - for (unsigned tag = 0; tag < TAG_SIZE; ++tag) { + for (unsigned tag = 0; tag < td.size(); ++tag) { Expression y = ye->embed(tag); const int i_start = max_seg_len ? max(0, j - max_seg_len) : 0; for (int i = i_start; i < j; ++i) { // i is the starting position auto seg_embedding_ij = seb(i, j-1); // pair Expression d = de->embed(j - i); // factor includes: fwd embedding, rev embedding, duration embedding, label embedding - Expression h1 = rectify(affine_transform({h1b, d2h1, d, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second})); + // Expression h1 = rectify(affine_transform({h1b, d2h1, d, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second})); + + // To be context aware, add c_{i-1} and c_{j} + Expression cf_embeding = (i == 0) ? c_start : c[i-1]; + Expression ce_embeding = (j == len) ? c_end : c[j]; + + Expression h1 = rectify(affine_transform({h1b, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second, cf2h1, cf_embeding, ce2h1, ce_embeding})); + + Expression h2 = tanh(affine_transform({h2b, h12h2, h1})); //Expression p = exp(affine_transform({ob, h22o, h2})); Expression p = affine_transform({ob, h22o, h2}); @@ -466,21 +500,21 @@ struct ZerothOrderSemiCRF { } std::reverse(pred.begin(),pred.end()); std::reverse(yz_pred.begin(),yz_pred.end()); - cout << "==pred==" << endl; + // cout << "==pred==" << endl; // for(auto e : pred){ // cout << std::get<0>(e) << "\t" << std::get<1>(e) << "\t" << std::get<2>(e) << endl; // } - for(auto e: yz_pred){ - cout << e.first << "," << e.second << "\t"; - } - cout << endl; + // for(auto e: yz_pred){ + // cout << e.first << "," << e.second << "\t"; + // } + // cout << endl; - cout << "==gold==" << endl; - for(auto e: yz_gold){ - cout << e.first << "," << e.second << "\t"; - } - cout << endl; + // cout << "==gold==" << endl; + // for(auto e: yz_gold){ + // cout << e.first << "," << e.second << "\t"; + // } + // cout << endl; // abort(); return fwd.back(); @@ -493,10 +527,13 @@ struct ZerothOrderSemiCRF { Parameters* p_d2h1, *p_y2h1, *p_fwd2h1, *p_rev2h1, *p_h1b; Parameters* p_h12h2, *p_h2b; Parameters* p_h22o, *p_ob; + // used in the context awareness + Parameters* p_c_start, *p_c_end; + Parameters* p_cf2h1, *p_ce2h1; }; // a a 0 1 a ||| O:1 O:1 N:2 O:1 -pair,vector>> ParseTrainingInstance(const std::string& line) { +pair,vector>> ParseTrainingInstance(const std::string& line, cnn::Dict& d, cnn::Dict& td, bool test_only = false) { std::istringstream in(line); std::string word; std::string sep = "|||"; @@ -504,20 +541,30 @@ pair,vector>> ParseTrainingInstance(const std::string& vector> yz; while(1) { in >> word; - if (word == sep) break; + if (!test_only){ + if (word == sep) break; + }else{ + if (word == sep) break; + if (!in) break; + } x.push_back(d.Convert(word)); } - while(1) { - in >> word; - if (!in) break; - size_t p = word.rfind(':'); - if (p == string::npos || p == 0 || p == (word.size() - 1)) { - cerr << "mal-formed label: " << word << endl; - abort(); + if(!test_only){ + while(1) { + in >> word; + if (!in) break; + size_t p = word.rfind(':'); + if (p == string::npos || p == 0 || p == (word.size() - 1)) { + cerr << "mal-formed label: " << word << endl; + abort(); + } + int y = td.Convert(word.substr(0, p)); + int z = atoi(word.substr(p+1).c_str()); + if (z > DATA_MAX_SEG_LEN){ + DATA_MAX_SEG_LEN = z; + } + yz.push_back(make_pair(y,z)); } - int y = td.Convert(word.substr(0, p)); - int z = atoi(word.substr(p+1).c_str()); - yz.push_back(make_pair(y,z)); } return make_pair(x, yz); } @@ -534,26 +581,47 @@ bool inline check_max_seg(const vector>& yz, int max_seg_len = 0){ return true; } -double compute_f_score(vector>>& yz_preds, vector>>& yz_golds){ +double evaluate(vector>>& yz_preds, + vector>>& yz_golds, + cnn::Dict& d, + cnn::Dict& td){ assert(yz_preds.size() == yz_golds.size()); int p_correct = 0; int r_correct = 0; + int p_w_t_correct = 0; + int r_w_t_correct = 0; int p_total = 0; int r_total = 0; - for (unsigned i = 0; i < yz_preds.size(); i++){ + int p_w_t_total = 0; + int r_w_t_total = 0; + int tag_o = ner_tagging ? td.Convert("O") : -1; + for (int i = 0; i < yz_preds.size(); i++){ // for sentence i std::set> gold; std::set> pred; + std::set> gold_w_tag; + std::set> pred_w_tag; vector>& yz_pred = yz_preds[i]; vector>& yz_gold = yz_golds[i]; int cur = 0; for(auto e : yz_pred){ - pred.insert(make_pair(cur, cur + e.second)); + + if (ner_tagging && (e.first == tag_o) ){ + + }else{ + pred.insert(make_pair(cur, cur + e.second)); + pred_w_tag.insert(make_tuple(e.first, cur, cur + e.second)); + } cur += e.second; } cur = 0; for(auto e : yz_gold){ - gold.insert(make_pair(cur, cur + e.second)); + if (ner_tagging && (e.first == tag_o) ){ + + }else{ + gold.insert(make_pair(cur, cur + e.second)); + gold_w_tag.insert(make_tuple(e.first, cur, cur + e.second)); + } cur += e.second; } @@ -569,148 +637,296 @@ double compute_f_score(vector>>& yz_preds, vector,vector>>>& train, + const vector,vector>>>& dev) +{ + +} + +void test_only(SegmentalRNN& crf, + vector,vector>>>& test_set, + int max_seg_len = 0) +{ + for (auto& sent : test_set) { + ComputationGraph cg; + vector> yz_pred; + crf.ViterbiDecode(sent.first, sent.second, cg, yz_pred, max_seg_len); + int i; + for(i = 0; i < yz_pred.size()-1; ++i){ + auto pred = yz_pred[i]; + cout << pred.first << ":" << pred.second << " "; + } + if(i >= 0 && (i == yz_pred.size()-1)){ + auto pred = yz_pred[i]; + cout << pred.first << ":" << pred.second; + } + cout << endl; } - vector,vector>>> training, dev; +} + +void read_file(string file_path, + cnn::Dict& d, + cnn::Dict& td, + vector,vector>>>& read_set, + bool test_only = false) +{ + read_set.clear(); string line; - cerr << "Reading training data from " << argv[1] << "...\n"; + cerr << "Reading data from " << file_path << "...\n"; { - ifstream in(argv[1]); + ifstream in(file_path); assert(in); while(getline(in, line)) { - training.push_back(ParseTrainingInstance(line)); + read_set.push_back(ParseTrainingInstance(line, d, td, test_only)); } } - d.Freeze(); // no new word types allowed - td.Freeze(); // no new tag types allowed + cerr << "Reading data from " << file_path << " finished \n"; +} - d.SetUnk(""); // set UNK to allow the unseen character in the dev and test set +void save_models(string model_file_prefix, + cnn::Dict& d, + cnn::Dict& td, + Model& model){ + cerr << "saving models..." << endl; - cerr << "Reading dev data from " << argv[2] << "...\n"; - { - ifstream in(argv[2]); - assert(in); - while(getline(in, line)) { - dev.push_back(ParseTrainingInstance(line)); - } - } - VOCAB_SIZE = d.size(); - TAG_SIZE = td.size(); - - cerr << "TAG_SIZE = " << td.size() << endl; - ostringstream os; - os << "0scrf" - << '_' << LAYERS - << '_' << INPUT_DIM - << '_' << XCRIBE_DIM - << "-pid" << getpid(); - const string fname = os.str() + ".params"; - cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; - - const string f_d_name = os.str() + ".dict"; + const string f_name = model_file_prefix + ".params"; + ofstream out(f_name); + boost::archive::text_oarchive oa(out); + oa << model; + out.close(); + + const string f_d_name = model_file_prefix + ".dict"; ofstream out_d(f_d_name); boost::archive::text_oarchive oa_d(out_d); oa_d << d; + out_d.close(); - const string f_td_name = os.str() + ".tdict"; + const string f_td_name = model_file_prefix + ".tdict"; ofstream out_td(f_td_name); boost::archive::text_oarchive oa_td(out_td); oa_td << td; + out_td.close(); + cerr << "saving models finished" << endl; +} + +void load_models(string model_file_prefix, + Model& model){ + cerr << "loading models..." << endl; - Model model; - auto sgd = new SimpleSGDTrainer(&model); - int max_seg_len = 10; + string fname = model_file_prefix + ".params"; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + in.close(); - ZerothOrderSemiCRF crf(model); - if (argc == 4) { - string fname = argv[3]; - ifstream in(fname); - boost::archive::text_iarchive ia(in); - ia >> model; + cerr << "loading models finished" << endl; +} + +void load_dicts(string model_file_prefix, + cnn::Dict& d, + cnn::Dict& td) +{ + cerr << "loading dicts..." << endl; + string f_d_name = model_file_prefix + ".dict"; + ifstream in_d(f_d_name); + boost::archive::text_iarchive ia_d(in_d); + ia_d >> d; + in_d.close(); + + string f_td_name = model_file_prefix + ".tdict"; + ifstream in_td(f_td_name); + boost::archive::text_iarchive ia_td(in_td); + ia_td >> td; + in_td.close(); + cerr << "loading dicts finished" << endl; +} + +double predict_and_evaluate(SegmentalRNN& crf, + const vector,vector>>>& input_set, + int max_seg_len = 0, + string set_name = "DEV" + ) +{ + double dloss = 0; + unsigned dtags = 0; + + vector>> yz_preds; + vector>> yz_golds; + for (auto& sent : input_set) { + ComputationGraph cg; + if(check_max_seg(sent.second, max_seg_len)){ + crf.SupervisedLoss(sent.first, sent.second, cg, max_seg_len); + dtags += sent.second.size(); + dloss += as_scalar(cg.forward()); + } + vector> yz_pred; + crf.ViterbiDecode(sent.first, sent.second, cg, yz_pred, max_seg_len); + yz_golds.push_back(sent.second); + yz_preds.push_back(yz_pred); } + double f = evaluate(yz_preds, yz_golds, crf.d, crf.td); - unsigned report_every_i = 10; - unsigned dev_every_i_reports = 100; - unsigned si = training.size(); - vector order(training.size()); - for (unsigned i = 0; i < order.size(); ++i) order[i] = i; - bool first = true; - int report = 0; - unsigned lines = 0; - while(1) { - Timer iteration("completed in"); - double loss = 0; - unsigned ttags = 0; - double correct = 0; - for (unsigned i = 0; i < report_every_i; ++i) { - if (si == training.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - // shuffle(order.begin(), order.end(), *rndeng); - } + cout << set_name << endl; + cerr << "\n***"<< set_name << " E = " << (dloss / dtags) << " ppl=" << exp(dloss / dtags) << ' '; + return f; +} - // build graph for this instance - ComputationGraph cg; - auto& sent = training[order[si]]; - ++si; - if(check_max_seg(sent.second, max_seg_len)){ - crf.SupervisedLoss(sent.first, sent.second, cg, max_seg_len); - ttags += sent.second.size(); - loss += as_scalar(cg.forward()); - cg.backward(); - sgd->update(1.0); - } - ++lines; +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + + po::options_description desc("Allowed options"); + desc.add_options() + ("help", "produce help message") + ("train", po::bool_switch()->default_value(false), "the training mode") + ("load_original_model", po::bool_switch()->default_value(false), "continuing the training by loading the model, only valid during training") + ("evaluate_test", po::bool_switch()->default_value(false), "evaluate test set every training iteration") + ("test", po::bool_switch()->default_value(false), "the test mode") + ("train_file", po::value(), "path of the train file") + ("dev_file", po::value(), "path of the dev file") + ("test_file", po::value(), "path of the test file") + ("model_file_prefix", po::value(), "prefix path of the model files (and dictionaries)") + ("upe", po::value(), "use pre-trained word embeding") + ; + + po::variables_map vm; + po::store(po::parse_command_line(argc, argv, desc), vm); + po::notify(vm); + + if (vm.count("help")) { + cerr << desc << "\n"; + return 1; + } + + if(vm["train"].as()){ + if (vm.count("upe")){ + cerr << "using pre-trained embeding from " << vm["upe"].as() << endl; + use_pretrained_embeding = true; + pretrained_embeding = vm["upe"].as(); + }else{ + use_pretrained_embeding = false; + cerr << "not using pre-trained embeding" << endl; + } + // create two dictionaries + cnn::Dict d; + cnn::Dict td; + vector,vector>>> training, dev, test; + read_file(vm["train_file"].as(), d, td, training); + + d.Freeze(); // no new word types allowed + td.Freeze(); // no new tag types allowed + d.SetUnk(""); // set UNK to allow the unseen character in the dev and test set + + read_file(vm["dev_file"].as(), d, td, dev); + if (vm["evaluate_test"].as()){ + read_file(vm["test_file"].as(), d, td, test); + } + + Model model; + // auto sgd = new SimpleSGDTrainer(&model); + auto sgd = new AdamTrainer(&model, 1e-6, 0.0005, 0.01, 0.9999, 1e-8); + int max_seg_len = DATA_MAX_SEG_LEN + 1; + + cerr << "set max_seg_len = " << max_seg_len << endl; + + SegmentalRNN crf(model, d, td); + + if(vm["load_original_model"].as()){ + load_models(vm["model_file_prefix"].as(), model); } - sgd->status(); - cerr << " E = " << (loss / ttags) << " ppl=" << exp(loss / ttags) << " (acc=" << (correct / ttags) << ") "; - report++; - if (report % dev_every_i_reports == 0) { - double dloss = 0; - unsigned dtags = 0; - double f_best = 0; - vector>> yz_preds; - vector>> yz_golds; - for (auto& sent : dev) { + + double f_best = 0; + unsigned report_every_i = 10; + unsigned dev_every_i_reports = 1000; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned ttags = 0; + double correct = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance ComputationGraph cg; + auto& sent = training[order[si]]; + ++si; if(check_max_seg(sent.second, max_seg_len)){ crf.SupervisedLoss(sent.first, sent.second, cg, max_seg_len); - dtags += sent.second.size(); - dloss += as_scalar(cg.forward()); + ttags += sent.second.size(); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(1.0); } - vector> yz_pred; - crf.ViterbiDecode(sent.first, sent.second, cg, yz_pred, max_seg_len); - yz_golds.push_back(sent.second); - yz_preds.push_back(yz_pred); + ++lines; } - cout << "iter_end" << endl; - - double f = compute_f_score(yz_preds, yz_golds); - - if (f > f_best) { - f_best = f; - ofstream out(fname); - boost::archive::text_oarchive oa(out); - oa << model; + sgd->status(); + cerr << " E = " << (loss / ttags) << " ppl=" << exp(loss / ttags) << " (acc=" << (correct / ttags) << ") "; + report++; + if (report % dev_every_i_reports == 0) { + double f = predict_and_evaluate(crf, dev, max_seg_len); + if (f > f_best) { + f_best = f; + save_models(vm["model_file_prefix"].as(), d, td, model); + } + if (vm["evaluate_test"].as()){ + predict_and_evaluate(crf, test, max_seg_len, "TEST"); + } } - cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dtags) << " ppl=" << exp(dloss / dtags) << ' '; } + delete sgd; + }else if(vm["test"].as()){ + Model model; + cnn::Dict d; + cnn::Dict td; + load_dicts(vm["model_file_prefix"].as(), d, td); + SegmentalRNN crf(model, d, td); + load_models(vm["model_file_prefix"].as(), model); + vector,vector>>> test; + read_file(vm["test_file"].as(), d, td, test, true); + + test_only(crf, test); } - delete sgd; + } + + From b7c6615a1539d9b880dfe41bd928eae5cdce2d37 Mon Sep 17 00:00:00 2001 From: Lingpeng Kong Date: Mon, 28 Dec 2015 02:28:49 -0500 Subject: [PATCH 364/965] segrnn update --- examples/segrnn-sup.cc | 269 +++++++++++++++++++++-------------------- 1 file changed, 141 insertions(+), 128 deletions(-) diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index edadbcb93..738c28254 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -20,11 +20,39 @@ #include #include -namespace po = boost::program_options; + using namespace std; using namespace cnn; +namespace po = boost::program_options; + +struct PKey { + PKey(int x1, int x2, unsigned x3) + : t(x1,x2,x3) {} + tuple t; +}; + +bool operator==(const PKey &a, const PKey &b) +{ + return std::get<0>(a.t) == std::get<0>(b.t) && + std::get<1>(a.t) == std::get<1>(b.t) && + std::get<2>(a.t) == std::get<2>(b.t); +} + +namespace std { + template <> + struct hash + { + std::size_t operator()(const PKey& e) const + { + return (std::get<0>(e.t)) | (std::get<1>(e.t) << 16) | (std::get<2>(e.t) << 24); + } + }; + +} + + unsigned LAYERS = 1; unsigned INPUT_DIM = 64; unsigned XCRIBE_DIM = 32; @@ -45,6 +73,25 @@ struct SymbolEmbedding { SymbolEmbedding(Model& m, unsigned n, unsigned dim) { p_labels = m.add_lookup_parameters(n, {dim}); } + void load_embedding(cnn::Dict& d, string pretrain_path){ + ifstream fin(pretrain_path); + string s; + while( getline(fin,s) ) + { + vector fields; + boost::algorithm::trim(s); + boost::algorithm::split( fields, s, boost::algorithm::is_any_of( " " ) ); + string word = fields[0]; + vector p_embeding; + for (int ind = 1; ind < fields.size(); ++ind){ + p_embeding.push_back(std::stod(fields[ind])); + } + if (d.Contains(word)){ + // cout << "init" << endl; + p_labels->Initialize(d.Convert(word), p_embeding); + } + } + } void new_graph(ComputationGraph& g) { cg = &g; } Expression embed(unsigned label_id) { return lookup(*cg, p_labels, label_id); @@ -248,28 +295,9 @@ struct SegmentalRNN { d = d_; td = td_; xe = new SymbolEmbedding(model, d.size(), INPUT_DIM); - if (use_pretrained_embeding) { - ifstream fin(pretrained_embeding); - string s; - while( getline(fin,s) ) - { - vector fields; - boost::algorithm::trim(s); - boost::algorithm::split( fields, s, boost::algorithm::is_any_of( " " ) ); - string word = fields[0]; - vector p_embeding; - for (int ind = 1; ind < fields.size(); ++ind){ - p_embeding.push_back(std::stod(fields[ind])); - } - if (d.Contains(word)){ - // cout << "init" << endl; - xe->p_labels->Initialize(d.Convert(word), p_embeding); - } - - } + xe->load_embedding(d, pretrained_embeding); } - ye = new SymbolEmbedding(model, td.size(), TAG_DIM); de = new BinnedDurationEmbedding(model, DURATION_DIM); @@ -295,31 +323,22 @@ struct SegmentalRNN { p_ce2h1 = model.add_parameters({H1DIM, XCRIBE_DIM}); } - // return Expression of total loss - Expression SupervisedLoss(const vector& x, - const vector>& yz, // .first = y, .second = duration (z) - ComputationGraph& cg, - int max_seg_len = 0) { - int len = x.size(); + // Adapted the ConstructInput to apply the SegmentRNNs to different inputs + vector ConstructInput(const vector& x, + ComputationGraph& cg){ + xe->new_graph(cg); + vector xins(x.size()); + for (int i = 0; i < x.size(); ++i) + xins[i] = xe->embed(x[i]); + return xins; + } - // is_ref[i][j][y] returns true iff, in the reference, span(i,j) is labeled y - vector>> is_ref(len, vector>(len+1, vector(td.size(), false))); - unsigned cur = 0; - for (unsigned ri = 0; ri < yz.size(); ++ri) { - assert(cur < len); - int y = yz[ri].first; - int dur = yz[ri].second; - if (max_seg_len && dur > max_seg_len) { - cerr << "max_seg_len=" << max_seg_len << " but reference duration is " << dur << endl; - abort(); - } - unsigned j = cur + dur; - assert(j <= len); - is_ref[cur][j][y] = true; - // cerr << "Span[" << cur << "," << j << ")=" << td.Convert(y) << endl; - cur = j; - } - assert(cur == len); + unordered_map ConstructSegmentMap(vector& xins, + ComputationGraph& cg, + int max_seg_len = 0) + { + unordered_map p_map; + int len = xins.size(); // context aware Expression c_start = parameter(cg, p_c_start); @@ -327,7 +346,6 @@ struct SegmentalRNN { Expression cf2h1 = parameter(cg, p_cf2h1); Expression ce2h1 = parameter(cg, p_ce2h1); - xe->new_graph(cg); ye->new_graph(cg); de->new_graph(cg); Expression d2h1 = parameter(cg, p_d2h1); @@ -339,47 +357,82 @@ struct SegmentalRNN { Expression h2b = parameter(cg, p_h2b); Expression h22o = parameter(cg, p_h22o); Expression ob = parameter(cg, p_ob); - vector xins(x.size()); - for (int i = 0; i < len; ++i) - xins[i] = xe->embed(x[i]); + vector c = bt.transcribe(cg, xins); seb.construct_chart(cg, c, max_seg_len); - vector fwd(len+1); // fwd trellis for model - vector ref_fwd(len+1); // fwd trellis for reference - vector f, fr; // careful: in the other algorithms spans are [i,j], here they are [i,j) for (int j = 1; j <= len; ++j) { - // fwd[j] is the total unnoramlized probability for all segmentations / labels - // ending (and including) the symbol at position j-1 - f.clear(); // f stores all additive contributions to item [j] - fr.clear(); for (unsigned tag = 0; tag < td.size(); ++tag) { Expression y = ye->embed(tag); const int i_start = max_seg_len ? max(0, j - max_seg_len) : 0; for (int i = i_start; i < j; ++i) { // i is the starting position - bool matches_ref = is_ref[i][j][tag]; + PKey key_tuple(i,j,tag); auto seg_embedding_ij = seb(i, j-1); // pair Expression d = de->embed(j - i); - // factor includes: fwd embedding, rev embedding, duration embedding, label embedding - // Expression h1 = rectify(affine_transform({h1b, d2h1, d, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second})); - // To be context aware, add c_{i-1} and c_{j} Expression cf_embeding = (i == 0) ? c_start : c[i-1]; Expression ce_embeding = (j == len) ? c_end : c[j]; - // Expression h1 = rectify(affine_transform({h1b, d2h1, d, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second, cf2h1, cf_embeding, ce2h1, ce_embeding})); - Expression h1 = rectify(affine_transform({h1b, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second, cf2h1, cf_embeding, ce2h1, ce_embeding})); - + Expression h1 = rectify(affine_transform({h1b, d2h1, d, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second, cf2h1, cf_embeding, ce2h1, ce_embeding})); Expression h2 = tanh(affine_transform({h2b, h12h2, h1})); //Expression p = exp(affine_transform({ob, h22o, h2})); Expression p = affine_transform({ob, h22o, h2}); + p_map[key_tuple] = p; + } + } + } + return p_map; + + } + + // return Expression of total loss + Expression SupervisedLoss(vector& xins, + const vector>& yz, // .first = y, .second = duration (z) + ComputationGraph& cg, + int max_seg_len = 0) { + int len = xins.size(); + unordered_map p_map = ConstructSegmentMap(xins, cg, max_seg_len); + // is_ref[i][j][y] returns true iff, in the reference, span(i,j) is labeled y + vector>> is_ref(len, vector>(len+1, vector(td.size(), false))); + unsigned cur = 0; + for (unsigned ri = 0; ri < yz.size(); ++ri) { + assert(cur < len); + int y = yz[ri].first; + int dur = yz[ri].second; + if (max_seg_len && dur > max_seg_len) { + cerr << "max_seg_len=" << max_seg_len << " but reference duration is " << dur << endl; + abort(); + } + unsigned j = cur + dur; + assert(j <= len); + is_ref[cur][j][y] = true; + // cerr << "Span[" << cur << "," << j << ")=" << td.Convert(y) << endl; + cur = j; + } + assert(cur == len); + + vector fwd(len+1); // fwd trellis for model + vector ref_fwd(len+1); // fwd trellis for reference + vector f, fr; + + // careful: in the other algorithms spans are [i,j], here they are [i,j) + for (int j = 1; j <= len; ++j) { + // fwd[j] is the total unnoramlized probability for all segmentations / labels + // ending (and including) the symbol at position j-1 + f.clear(); // f stores all additive contributions to item [j] + fr.clear(); + for (unsigned tag = 0; tag < td.size(); ++tag) { + const int i_start = max_seg_len ? max(0, j - max_seg_len) : 0; + for (int i = i_start; i < j; ++i) { // i is the starting position + bool matches_ref = is_ref[i][j][tag]; + PKey key_tuple(i,j,tag); + assert(p_map.find (key_tuple) != p_map.end()); + Expression p = p_map.at(key_tuple); if (i == 0) { // fwd[0] is the path up and including -1, so it's the empty set, i.e., its probability is 1 f.push_back(p); if (matches_ref) fr.push_back(p); } else { - // f.push_back(p * fwd[i]); - // if (matches_ref) fr.push_back(p * ref_fwd[i]); f.push_back(p + fwd[i]); if (matches_ref) fr.push_back(p + ref_fwd[i]); } @@ -401,41 +454,19 @@ struct SegmentalRNN { return fwd.back() - ref_fwd.back(); } - Expression ViterbiDecode(const vector& x, - const vector>& yz_gold, // .first = y, .second = duration (z) - ComputationGraph& cg, - vector> &yz_pred, - int max_seg_len = 0) { + Expression ViterbiDecode(vector& xins, + const vector>& yz_gold, // .first = y, .second = duration (z) + ComputationGraph& cg, + vector> &yz_pred, + int max_seg_len = 0) { yz_pred.clear(); - int len = x.size(); - - // context aware - Expression c_start = parameter(cg, p_c_start); - Expression c_end = parameter(cg, p_c_end); - Expression cf2h1 = parameter(cg, p_cf2h1); - Expression ce2h1 = parameter(cg, p_ce2h1); + int len = xins.size(); + unordered_map p_map = ConstructSegmentMap(xins, cg, max_seg_len); - xe->new_graph(cg); - ye->new_graph(cg); - de->new_graph(cg); - Expression d2h1 = parameter(cg, p_d2h1); - Expression y2h1 = parameter(cg, p_y2h1); - Expression fwd2h1 = parameter(cg, p_fwd2h1); - Expression rev2h1 = parameter(cg, p_rev2h1); - Expression h1b = parameter(cg, p_h1b); - Expression h12h2 = parameter(cg, p_h12h2); - Expression h2b = parameter(cg, p_h2b); - Expression h22o = parameter(cg, p_h22o); - Expression ob = parameter(cg, p_ob); - vector xins(x.size()); - for (int i = 0; i < len; ++i) - xins[i] = xe->embed(x[i]); - vector c = bt.transcribe(cg, xins); - seb.construct_chart(cg, c, max_seg_len); vector fwd(len+1); // fwd trellis for model vector f, fr; - vector> ijt; // ijt stores positions where we get the max (i.e. i, j and tag) - vector> it; // it stores positions where we get the max ending at j + vector> ijt; // ijt stores positions where we get the max (i.e. i, j and tag) + vector> it; // it stores positions where we get the max ending at j it.push_back(make_tuple(0,0,0)); // push one to make the index consistent, now it[j] means j rather than j+1 // careful: in the other algorithms spans are [i,j], here they are [i,j) for (int j = 1; j <= len; ++j) { @@ -445,31 +476,17 @@ struct SegmentalRNN { fr.clear(); ijt.clear(); for (unsigned tag = 0; tag < td.size(); ++tag) { - Expression y = ye->embed(tag); const int i_start = max_seg_len ? max(0, j - max_seg_len) : 0; for (int i = i_start; i < j; ++i) { // i is the starting position - auto seg_embedding_ij = seb(i, j-1); // pair - Expression d = de->embed(j - i); - // factor includes: fwd embedding, rev embedding, duration embedding, label embedding - // Expression h1 = rectify(affine_transform({h1b, d2h1, d, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second})); - - // To be context aware, add c_{i-1} and c_{j} - Expression cf_embeding = (i == 0) ? c_start : c[i-1]; - Expression ce_embeding = (j == len) ? c_end : c[j]; - - Expression h1 = rectify(affine_transform({h1b, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second, cf2h1, cf_embeding, ce2h1, ce_embeding})); - - - Expression h2 = tanh(affine_transform({h2b, h12h2, h1})); - //Expression p = exp(affine_transform({ob, h22o, h2})); - Expression p = affine_transform({ob, h22o, h2}); + PKey key_tuple(i,j,tag); + Expression p = p_map.at(key_tuple); if (i == 0) { // fwd[0] is the path up and including -1, so it's the empty set, i.e., its probability is 1 f.push_back(p); } else { f.push_back(p + fwd[i]); } - ijt.push_back(std::make_tuple(i, j, tag)); + ijt.push_back(make_tuple(i, j, tag)); } } // cerr << "size of vector f at j = " << j << " equals " << f.size() << endl; @@ -491,7 +508,7 @@ struct SegmentalRNN { // cerr << j << "\t" << std::get<0>(it[j]) << "\t" << std::get<1>(it[j]) << "\t" << std::get<2>(it[j]) << endl; // } auto cur_j = len; - vector> pred; + vector> pred; while(cur_j > 0){ auto cur_i = std::get<0>(it[cur_j]); pred.push_back(make_tuple(cur_i, cur_j, std::get<2>(it[cur_j]))); @@ -595,7 +612,7 @@ double evaluate(vector>>& yz_preds, int p_w_t_total = 0; int r_w_t_total = 0; int tag_o = ner_tagging ? td.Convert("O") : -1; - for (int i = 0; i < yz_preds.size(); i++){ + for (unsigned int i = 0; i < yz_preds.size(); i++){ // for sentence i std::set> gold; std::set> pred; @@ -664,14 +681,6 @@ double evaluate(vector>>& yz_preds, } -void train(string& save_model_file, - string& save_dict_file, - const vector,vector>>>& train, - const vector,vector>>>& dev) -{ - -} - void test_only(SegmentalRNN& crf, vector,vector>>>& test_set, int max_seg_len = 0) @@ -679,8 +688,9 @@ void test_only(SegmentalRNN& crf, for (auto& sent : test_set) { ComputationGraph cg; vector> yz_pred; - crf.ViterbiDecode(sent.first, sent.second, cg, yz_pred, max_seg_len); - int i; + vector xins = crf.ConstructInput(sent.first, cg); + crf.ViterbiDecode(xins, sent.second, cg, yz_pred, max_seg_len); + unsigned int i; for(i = 0; i < yz_pred.size()-1; ++i){ auto pred = yz_pred[i]; cout << pred.first << ":" << pred.second << " "; @@ -784,12 +794,14 @@ double predict_and_evaluate(SegmentalRNN& crf, for (auto& sent : input_set) { ComputationGraph cg; if(check_max_seg(sent.second, max_seg_len)){ - crf.SupervisedLoss(sent.first, sent.second, cg, max_seg_len); + vector xins = crf.ConstructInput(sent.first, cg); + crf.SupervisedLoss(xins, sent.second, cg, max_seg_len); dtags += sent.second.size(); dloss += as_scalar(cg.forward()); } vector> yz_pred; - crf.ViterbiDecode(sent.first, sent.second, cg, yz_pred, max_seg_len); + vector xins = crf.ConstructInput(sent.first, cg); + crf.ViterbiDecode(xins, sent.second, cg, yz_pred, max_seg_len); yz_golds.push_back(sent.second); yz_preds.push_back(yz_pred); } @@ -890,7 +902,8 @@ int main(int argc, char** argv) { auto& sent = training[order[si]]; ++si; if(check_max_seg(sent.second, max_seg_len)){ - crf.SupervisedLoss(sent.first, sent.second, cg, max_seg_len); + vector xins = crf.ConstructInput(sent.first, cg); + crf.SupervisedLoss(xins, sent.second, cg, max_seg_len); ttags += sent.second.size(); loss += as_scalar(cg.forward()); cg.backward(); From 54593386e9406f83a70e85f36d818fa6bcdfcff5 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 28 Dec 2015 18:22:02 -0500 Subject: [PATCH 365/965] more ppls --- rnnlm/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/rnnlm/README.md b/rnnlm/README.md index c71d8f58b..ff95effbe 100644 --- a/rnnlm/README.md +++ b/rnnlm/README.md @@ -29,3 +29,4 @@ Evaluate a trained model: | ----- | ---:| ----:| | 5-gram KN | 188.0 | 178.9 | | 2x128, dropout=0.3, class-factored softmax | 164.4 | 157.7 | +| 2x256, dropout=0.3, CFSM, decay 0.5@>10 | 129.7 | 125.4 | From 62ab03f6901957ba8f5d48d6c1357ccaa88b1e2e Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 31 Dec 2015 11:13:27 +0900 Subject: [PATCH 366/965] Fixed two compile errors on CUDA --- cnn/functors.h | 8 ++++++-- cnn/nodes.cc | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cnn/functors.h b/cnn/functors.h index 41b4cf92f..257b29c30 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -4,12 +4,11 @@ #include #include -#include - #if HAVE_CUDA # define CNN_DEVICE_FUNC __device__ # define CNN_DEVICE_MIN -1.175494351e-38f #else +# include # define CNN_DEVICE_FUNC # define CNN_DEVICE_MIN std::numeric_limits::min() #endif @@ -172,7 +171,12 @@ struct FSoftmaxBackward { struct FLogGammaBackward { CNN_DEVICE_FUNC inline float operator()(float x, float d) const { +#ifndef HAVE_CUDA return boost::math::digamma(x) * d; +#else + assert(false); // Not supported on GPUs? + return 0; +#endif } }; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 37134862f..86c62b6dd 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1539,7 +1539,7 @@ Dim Zeroes::dim_forward(const vector& xs) const { void Zeroes::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); #if HAVE_CUDA - cudaMemsetAsync(fx.v, 0, dim.size() * sizeof(float), cudaMemcpyHostToDevice); + cudaMemsetAsync(fx.v, 0, dim.size() * sizeof(float)); #else memset(fx.v, 0, dim.size() * sizeof(float)); #endif From 46a2b4d7b8ea16944ce231100000d985443c497e Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 31 Dec 2015 13:01:44 +0900 Subject: [PATCH 367/965] Added GPU gradient checking and log --- cnn/functors.h | 12 ++++++++++++ cnn/gpu-ops.cu | 10 ++++++++++ cnn/gpu-ops.h | 2 ++ cnn/grad-check.cc | 28 ++++++++++++++-------------- cnn/nodes.cc | 8 ++++++++ cnn/tensor.cc | 18 ++++++++++++++++++ cnn/tensor.h | 5 ++++- 7 files changed, 68 insertions(+), 15 deletions(-) diff --git a/cnn/functors.h b/cnn/functors.h index 257b29c30..2cb3e9dd7 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -108,6 +108,12 @@ struct FTanh { } }; +struct FLog { + CNN_DEVICE_FUNC inline float operator()(float x) const { + return logf(x); + } +}; + struct FMaxBackwardInv { CNN_DEVICE_FUNC inline float operator()(float u, float d) const { return (1.f - u) * d; @@ -132,6 +138,12 @@ struct FTanhBackward { } }; +struct FLogBackward { + CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + return (1.f / t) * d; + } +}; + struct FPairwiseRankLoss { FPairwiseRankLoss(float m) : margin(m) {} CNN_DEVICE_FUNC float operator()(float a, float b) const { diff --git a/cnn/gpu-ops.cu b/cnn/gpu-ops.cu index 73f92c5e5..a90f67c02 100644 --- a/cnn/gpu-ops.cu +++ b/cnn/gpu-ops.cu @@ -68,6 +68,16 @@ void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx) { accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FTanhBackward()); } +void vlog(int n, const float* x, float* y) { + auto tb = SizeToBlockThreadPair(n); + unaryExprKernel<<>>(n, x, y, FLog()); +} + +void vlog_backward(int n, const float* fx, const float* dEdf, float* dEdx) { + auto tb = SizeToBlockThreadPair(n); + accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FLogBackward()); +} + void vlogistic(int n, const float* x, float* y) { auto tb = SizeToBlockThreadPair(n); unaryExprKernel<<>>(n, x, y, FLogisticSigmoid()); diff --git a/cnn/gpu-ops.h b/cnn/gpu-ops.h index 207d9c4df..f34d67696 100644 --- a/cnn/gpu-ops.h +++ b/cnn/gpu-ops.h @@ -15,6 +15,8 @@ void vrelu(int n, const float* x, float* y); void vrelu_backward(int n, const float* fx, const float* dEdf, float* dEdx); void vtanh(int n, const float* x, float* y); void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx); +void vlog(int n, const float* x, float* y); +void vlog_backward(int n, const float* fx, const float* dEdf, float* dEdx); void vlogistic(int n, const float* x, float* y); void vlogistic_backward(int n, const float* fx, const float* dEdf, float* dEdx); void l2_norm_reducer(int n, const float* x0, float* y, bool square, bool accumulate); diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc index f7c7f980a..8e6b4e25b 100644 --- a/cnn/grad-check.cc +++ b/cnn/grad-check.cc @@ -23,20 +23,20 @@ bool CheckGrad(Model& m, ComputationGraph& g) { Parameters& p = *pp; size_t ts = p.dim.size(); for (size_t i = 0; i < ts; ++i) { - float old = p.values.v[i]; - p.values.v[i] = old - alpha; + float old = TensorTools::AccessElement(p.values, i); + TensorTools::SetElement(p.values, i, old - alpha); float E_left = as_scalar(g.forward()); - - p.values.v[i] = old + alpha; + TensorTools::SetElement(p.values, i, old + alpha); float E_right = as_scalar(g.forward()); float g = (E_right - E_left) / (2 * alpha); - float f = fabs(g - p.g.v[i]); - float m = max(fabs(g), fabs(p.g.v[i])); + float g_act = TensorTools::AccessElement(p.g, i); + float f = fabs(g - g_act); + float m = max(fabs(g), fabs(g_act)); if (f > 0.1) { if (m > 0.f) f /= m; if (f > 0.1) { flag = true; cerr << "***[" << f << "] "; } } - cerr << p.g.v[i] << ' ' << g << endl; + cerr << g_act << ' ' << g << endl; } } @@ -50,20 +50,20 @@ bool CheckGrad(Model& m, ComputationGraph& g) { Tensor& v = p.values[j]; Tensor& ag = p.grads[j]; for (size_t i = 0; i < ts; ++i) { - float old = v.v[i]; - v.v[i] = old - alpha; + float old = TensorTools::AccessElement(v, i); + TensorTools::SetElement(v, i, old - alpha); float E_left = as_scalar(g.forward()); - - v.v[i] = old + alpha; + TensorTools::SetElement(v, i, old + alpha); float E_right = as_scalar(g.forward()); float g = (E_right - E_left) / (2 * alpha); - float f = fabs(g - ag.v[i]); - float m = max(fabs(g), fabs(ag.v[i])); + float g_act = TensorTools::AccessElement(ag, i); + float f = fabs(g - g_act); + float m = max(fabs(g), fabs(g_act)); if (f > 0.1) { if (m > 0.f) f /= m; if (f > 0.1) { flag = true; cerr << "*** "; } } - cerr << ag.v[i] << ' ' << g << endl; + cerr << g_act << ' ' << g << endl; } } } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 86c62b6dd..f6575b9cb 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -643,8 +643,12 @@ void LogGamma::backward_impl(const vector& xs, } void Log::forward_impl(const vector& xs, Tensor& fx) const { +#if HAVE_CUDA + gpu::vlog(fx.d.size(), xs[0]->v, fx.v); +#else auto x = **xs[0]; *fx = x.array().log(); +#endif } void Log::backward_impl(const vector& xs, @@ -652,8 +656,12 @@ void Log::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#if HAVE_CUDA + gpu::vlog_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); +#else auto x = **xs[0]; *dEdxi += (*dEdf).cwiseQuotient(x); +#endif } void Concatenate::forward_impl(const vector& xs, Tensor& fx) const { diff --git a/cnn/tensor.cc b/cnn/tensor.cc index f7b44ff25..32e282116 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -44,6 +44,16 @@ vector as_vector(const Tensor& v) { return res; } +float TensorTools::AccessElement(const Tensor& v, int index) { +#if HAVE_CUDA + float ret; + cudaMemcpyAsync(&ret, v.v, sizeof(real), cudaMemcpyDeviceToHost); + return ret; +#else + return v.v[index]; +#endif +} + float TensorTools::AccessElement(const Tensor& v, const Dim& index) { #if HAVE_CUDA abort(); @@ -52,6 +62,14 @@ float TensorTools::AccessElement(const Tensor& v, const Dim& index) { #endif } +void TensorTools::SetElement(const Tensor& v, int index, float value) { +#if HAVE_CUDA + cudaMemcpyAsync(&v.v[index], &value, sizeof(real), cudaMemcpyHostToDevice); +#else + v.v[index] = value; +#endif +} + void TensorTools::SetElements(const Tensor& v, const vector& vec) { #if HAVE_CUDA cudaMemcpyAsync(v.v, &vec[0], sizeof(real) * vec.size(), cudaMemcpyHostToDevice); diff --git a/cnn/tensor.h b/cnn/tensor.h index 87571c6f9..375d5272d 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -168,8 +168,11 @@ struct TensorTools { // sample some bernoulli random variables and scale them by scale static void RandomBernoulli(Tensor& val, real p, real scale = 1.0); static void RandomizeNormal(real mean, real stddev, Tensor& val); - // AccessElement is very, very slow (potentially) - use appropriately + // AccessElement and SetElement are very, very slow (potentially) - use appropriately + static float AccessElement(const Tensor& v, int index); static float AccessElement(const Tensor& v, const Dim& index); + static void SetElement(const Tensor& v, int index, float value); + static void SetElements(const Tensor& v, const std::vector& vec); static void CopyElements(const Tensor& v, const Tensor& v_src); }; From 6d7955563415d21198f91283f7148c11fb6f5b61 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 30 Dec 2015 23:25:56 -0500 Subject: [PATCH 368/965] Made gradient checking clear the gradients first --- cnn/grad-check.cc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc index 8e6b4e25b..e3044de91 100644 --- a/cnn/grad-check.cc +++ b/cnn/grad-check.cc @@ -12,12 +12,21 @@ using namespace std; namespace cnn { bool CheckGrad(Model& m, ComputationGraph& g) { + // Clear the parameters first + const vector& params = m.parameters_list(); + const vector& lookup_params = m.lookup_parameters_list(); + for (auto pp : params) + pp->clear(); + for (auto pp : lookup_params) + pp->clear(); + + // Perform forward and backward steps float alpha = 5e-4; g.forward(); g.backward(); + // Check bool flag = false; - const vector& params = m.parameters_list(); for (auto pp : params) { cerr << "\nPARAMETERS " << pp << endl; Parameters& p = *pp; @@ -28,6 +37,7 @@ bool CheckGrad(Model& m, ComputationGraph& g) { float E_left = as_scalar(g.forward()); TensorTools::SetElement(p.values, i, old + alpha); float E_right = as_scalar(g.forward()); + TensorTools::SetElement(p.values, i, old); float g = (E_right - E_left) / (2 * alpha); float g_act = TensorTools::AccessElement(p.g, i); float f = fabs(g - g_act); @@ -40,7 +50,6 @@ bool CheckGrad(Model& m, ComputationGraph& g) { } } - const vector& lookup_params = m.lookup_parameters_list(); for (auto pp : lookup_params) { cerr << "\nLOOKUP PARAMETERS " << pp << endl; LookupParameters& p = *pp; @@ -55,6 +64,7 @@ bool CheckGrad(Model& m, ComputationGraph& g) { float E_left = as_scalar(g.forward()); TensorTools::SetElement(v, i, old + alpha); float E_right = as_scalar(g.forward()); + TensorTools::SetElement(v, i, old); float g = (E_right - E_left) / (2 * alpha); float g_act = TensorTools::AccessElement(ag, i); float f = fabs(g - g_act); From c43436591025bcc709439e567f2d323ec2968fbf Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 30 Dec 2015 23:54:49 -0500 Subject: [PATCH 369/965] Fixed the xor-batch-lookup example --- examples/xor-batch-lookup.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup.cc index 0d0b9300e..927c16e14 100644 --- a/examples/xor-batch-lookup.cc +++ b/examples/xor-batch-lookup.cc @@ -48,6 +48,7 @@ int main(int argc, char** argv) { //Expression h = softsign(W*x + b); Expression y_pred = V*h + a; Expression loss = squared_distance(y_pred, y); + Expression sum_loss = sum_batches(loss); cg.PrintGraphviz(); if (argc == 2) { From defff9d2313de722301a22f7edaa125781a8cd3b Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 31 Dec 2015 02:43:36 -0500 Subject: [PATCH 370/965] Added tests for many of the functions in nodes --- cnn/grad-check.cc | 35 +-- cnn/grad-check.h | 3 +- tests/CMakeLists.txt | 7 +- tests/test-nodes.cc | 515 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 545 insertions(+), 15 deletions(-) create mode 100644 tests/test-nodes.cc diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc index e3044de91..fbb79fc1d 100644 --- a/cnn/grad-check.cc +++ b/cnn/grad-check.cc @@ -11,7 +11,7 @@ using namespace std; namespace cnn { -bool CheckGrad(Model& m, ComputationGraph& g) { +bool CheckGrad(Model& m, ComputationGraph& g, int verbosity) { // Clear the parameters first const vector& params = m.parameters_list(); const vector& lookup_params = m.lookup_parameters_list(); @@ -26,9 +26,10 @@ bool CheckGrad(Model& m, ComputationGraph& g) { g.backward(); // Check - bool flag = false; + bool flag = false, curr_flag = false; for (auto pp : params) { - cerr << "\nPARAMETERS " << pp << endl; + if(verbosity > 1) + cerr << endl << "PARAMETERS " << pp << endl; Parameters& p = *pp; size_t ts = p.dim.size(); for (size_t i = 0; i < ts; ++i) { @@ -44,18 +45,23 @@ bool CheckGrad(Model& m, ComputationGraph& g) { float m = max(fabs(g), fabs(g_act)); if (f > 0.1) { if (m > 0.f) f /= m; - if (f > 0.1) { flag = true; cerr << "***[" << f << "] "; } + if (f > 0.1) { flag = true; if(verbosity > 0) { curr_flag = true; cerr << "***[" << f << "] "; } } + } + if(verbosity + (curr_flag ? 1 : 0) > 1) { + cerr << g_act << ' ' << g << endl; + curr_flag = false; } - cerr << g_act << ' ' << g << endl; } } for (auto pp : lookup_params) { - cerr << "\nLOOKUP PARAMETERS " << pp << endl; + if(verbosity > 1) + cerr << endl << "LOOKUP PARAMETERS " << pp << endl; LookupParameters& p = *pp; size_t ts = p.dim.size(); for (unsigned j : p.non_zero_grads) { - cerr << "OBJECT=" << j << endl; + if(verbosity > 1) + cerr << "OBJECT=" << j << endl; Tensor& v = p.values[j]; Tensor& ag = p.grads[j]; for (size_t i = 0; i < ts; ++i) { @@ -71,17 +77,20 @@ bool CheckGrad(Model& m, ComputationGraph& g) { float m = max(fabs(g), fabs(g_act)); if (f > 0.1) { if (m > 0.f) f /= m; - if (f > 0.1) { flag = true; cerr << "*** "; } + if (f > 0.1) { flag = true; if(verbosity > 0) { curr_flag = true; cerr << "***[" << f << "] "; } } + } + if(verbosity + (curr_flag ? 1 : 0) > 1) { + cerr << g_act << ' ' << g << endl; + curr_flag = false; } - cerr << g_act << ' ' << g << endl; } } } - if (flag) { - cerr << "\n*** GRADIENT CHECK FAILED ***\n"; - } else { - cerr << "\nGRADIENT CHECK PASSED\n"; + if (flag && verbosity > 1) { + cerr << endl << "*** GRADIENT CHECK FAILED ***" << endl; + } else if(verbosity > 0) { + cerr << endl << "GRADIENT CHECK PASSED" << endl; } return !flag; } diff --git a/cnn/grad-check.h b/cnn/grad-check.h index 0fa194595..b9ca33418 100644 --- a/cnn/grad-check.h +++ b/cnn/grad-check.h @@ -6,7 +6,8 @@ namespace cnn { class Model; struct ComputationGraph; -bool CheckGrad(Model& m, ComputationGraph& g); +// verbosity is zero for silence, one for only printing errors, two for everything +bool CheckGrad(Model& m, ComputationGraph& g, int verbosity = 1); } // namespace cnn diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 37275da2e..54e299e56 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -5,7 +5,12 @@ include_directories (${TEST_SOURCE_DIR}/src add_definitions (-DBOOST_TEST_DYN_LINK) -add_executable (test-cnn test-cnn.cc) +# Sources: +set(test_cnn_SRCS + test-nodes.cc +) + +add_executable (test-cnn test-cnn.cc ${test_cnn_SRCS}) target_link_libraries (test-cnn cnn ${LIBS} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ) diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc new file mode 100644 index 000000000..a7e17d6ff --- /dev/null +++ b/tests/test-nodes.cc @@ -0,0 +1,515 @@ +#include +// #define BOOST_TEST_MODULE CNNBasicTest +#include +#include +#include + +using namespace cnn; +using namespace cnn::expr; +using namespace std; + +struct NodeTest { + NodeTest() { + // set up some dummy arguments to cnn + for (auto x : {"NodeTest", "--cnn-mem", "10"}) { + av.push_back(strdup(x)); + } + char **argv = &av[0]; + int argc = av.size(); + cnn::Initialize(argc, argv); + // Create parameters + std::vector param1_vals = {1.1f,-2.2f,3.3f}; + std::vector param2_vals = {2.2f,3.4f,-1.2f}; + std::vector param_scalar1_vals = {2.2f}; + std::vector param_scalar2_vals = {1.1f}; + param1 = mod.add_parameters({3}); + TensorTools::SetElements(param1->values,param1_vals); + param2 = mod.add_parameters({3}); + TensorTools::SetElements(param2->values,param2_vals); + param_scalar1 = mod.add_parameters({1}); + TensorTools::SetElements(param_scalar1->values,param_scalar1_vals); + param_scalar2 = mod.add_parameters({1}); + TensorTools::SetElements(param_scalar2->values,param_scalar2_vals); + } + ~NodeTest() { + for (auto x : av) free(x); + } + std::vector av; + cnn::Model mod; + cnn::Parameters *param1, *param2, *param_scalar1, *param_scalar2; +}; + +// define the test suite +BOOST_FIXTURE_TEST_SUITE(node_test, NodeTest); + + +// Expression operator-(const Expression& x); +BOOST_AUTO_TEST_CASE( negate_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = -x1; + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression operator+(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( add_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + Expression y = x1+x2; + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression operator+(const Expression& x, real y); +BOOST_AUTO_TEST_CASE( addscalar_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = x1+2.0; + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression operator+(real x, const Expression& y); +BOOST_AUTO_TEST_CASE( scalaradd_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = 2.0+x1; + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression operator-(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( subtract_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + Expression y = x1+x2; + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression operator-(real x, const Expression& y); +BOOST_AUTO_TEST_CASE( scalarsubtract_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = 2.0-x1; + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression operator-(const Expression& x, real y); +BOOST_AUTO_TEST_CASE( subtractscalar_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = x1-2.0; + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression operator*(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( multiply_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + Expression y = x1*transpose(x2); + sum_cols( transpose( sum_cols( y ) ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression operator*(const Expression& x, float y); +BOOST_AUTO_TEST_CASE( multiplyscalar_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = x1*2.0; + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// inline Expression operator*(float y, const Expression& x) { return x * y; } +BOOST_AUTO_TEST_CASE( scalarmultiply_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = 2.0*x1; + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// inline Expression operator/(const Expression& x, float y) { return x * (1.f / y); } +BOOST_AUTO_TEST_CASE( dividescalar_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = x1/2.0; + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression cdiv(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( cdiv_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + Expression y = cdiv(x1, x2); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression colwise_add(const Expression& x, const Expression& bias); +BOOST_AUTO_TEST_CASE( colwise_add_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + Expression y = colwise_add(x1 * transpose(x2), x2); + sum_cols( transpose( sum_cols(y) ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression contract3d_1d(const Expression& x, const Expression& y); +// TODO + +// Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b); +// TODO + +// Expression sqrt(const Expression& x); +BOOST_AUTO_TEST_CASE( sqrt_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = sqrt(x1); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression erf(const Expression& x); +BOOST_AUTO_TEST_CASE( erf_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = erf(x1); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression tanh(const Expression& x); +BOOST_AUTO_TEST_CASE( tanh_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = tanh(x1); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression exp(const Expression& x); +BOOST_AUTO_TEST_CASE( exp_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = exp(x1); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression square(const Expression& x); +BOOST_AUTO_TEST_CASE( square_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = square(x1); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression cube(const Expression& x); +BOOST_AUTO_TEST_CASE( cube_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = cube(x1); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression lgamma(const Expression& x); +BOOST_AUTO_TEST_CASE( lgamma_gradient ) { + cnn::ComputationGraph cg; + Expression x2 = parameter(cg, param2); + Expression y = lgamma(x2); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression log(const Expression& x); +BOOST_AUTO_TEST_CASE( log_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = log(x1); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression logistic(const Expression& x); +BOOST_AUTO_TEST_CASE( logistic_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = logistic(x1); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression rectify(const Expression& x); +BOOST_AUTO_TEST_CASE( rectify_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = rectify(x1); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression hinge(const Expression& x, unsigned index, float m = 1.0); +BOOST_AUTO_TEST_CASE( hinge_gradient ) { + unsigned index = 0; + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = hinge(x1, index, 0.5); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0); +BOOST_AUTO_TEST_CASE( hingeptr_gradient ) { + unsigned index = 0; + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = hinge(x1, &index, 0.5); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression log_softmax(const Expression& x); +BOOST_AUTO_TEST_CASE( log_softmax_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = log_softmax(x1); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression log_softmax(const Expression& x, const std::vector& restriction); +BOOST_AUTO_TEST_CASE( restricted_log_softmax_gradient ) { + vector restriction = {1,2}; + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = log_softmax(x1, restriction); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression softmax(const Expression& x); +BOOST_AUTO_TEST_CASE( softmax_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = softmax(x1); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression softsign(const Expression& x); +BOOST_AUTO_TEST_CASE( softsign_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = softsign(x1); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression pow(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( pow_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x_scalar1 = parameter(cg, param_scalar1); + Expression y = pow(x1, x_scalar1); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression min(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( min_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + Expression y = min(x1, x2); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression max(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( max_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + Expression y = max(x1, x2); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression noise(const Expression& x, real stddev); +BOOST_AUTO_TEST_CASE( noise_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = noise(x1, 0.5); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression dropout(const Expression& x, real p); +BOOST_AUTO_TEST_CASE( dropout_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = dropout(x1, 0.5); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression block_dropout(const Expression& x, real p); +// TODO + +// Expression reshape(const Expression& x, const Dim& d); +BOOST_AUTO_TEST_CASE( reshape_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = reshape(x1, {1,3}); + sum_cols( y ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression transpose(const Expression& x); +BOOST_AUTO_TEST_CASE( transpose_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = softsign(x1); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression trace_of_product(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( trace_of_product_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + trace_of_product(x1, x2); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression cwise_multiply(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( cwise_multiply_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + Expression y = cwise_multiply(x1, x2); + sum_cols( transpose( y ) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression dot_product(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( dot_product_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + dot_product(x1, x2); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression squared_distance(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( squared_distance_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + squared_distance(x1, x2); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression huber_distance(const Expression& x, const Expression& y, float c = 1.345f); +BOOST_AUTO_TEST_CASE( huber_distance_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + huber_distance(x1, x2); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression l1_distance(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( l1_distance_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + l1_distance(x1, x2); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression binary_log_loss(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( binary_log_loss_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + binary_log_loss(x1, x2); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0); +BOOST_AUTO_TEST_CASE( pairwise_rank_loss_gradient ) { + cnn::ComputationGraph cg; + Expression x_scalar1 = parameter(cg, param_scalar1); + Expression x_scalar2 = parameter(cg, param_scalar2); + pairwise_rank_loss(x_scalar1, x_scalar2); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// TODO: These are all unimplemented +// Expression poisson_loss(const Expression& x, unsigned y); +// Expression poisson_loss(const Expression& x, const unsigned* py); +// +// Expression conv1d_narrow(const Expression& x, const Expression& f); +// Expression conv1d_wide(const Expression& x, const Expression& f); +// Expression kmax_pooling(const Expression& x, unsigned k); +// Expression fold_rows(const Expression& x, unsigned nrows=2); +// Expression sum_cols(const Expression& x); +// Expression kmh_ngram(const Expression& x, unsigned n); +// +// Expression sum_batches(const Expression& x); + +// Expression pick(const Expression& x, unsigned v); +BOOST_AUTO_TEST_CASE( pick_gradient ) { + unsigned idx = 1; + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + pick(x1, idx); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression pick(const Expression& x, unsigned* pv); +BOOST_AUTO_TEST_CASE( pickptr_gradient ) { + unsigned idx = 1; + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + pick(x1, &idx); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression pickrange(const Expression& x, unsigned v, unsigned u); +BOOST_AUTO_TEST_CASE( pickrange_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = pickrange(x1, 0, 1); + sum_cols( transpose(y) ); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression pickneglogsoftmax(const Expression& x, unsigned v); +BOOST_AUTO_TEST_CASE( pickneglogsoftmax_gradient ) { + unsigned idx = 1; + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + pickneglogsoftmax(x1, idx); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression pickneglogsoftmax(const Expression& x, const std::vector & v); +// TODO: Not covered yet + +BOOST_AUTO_TEST_SUITE_END() From 76679b41c20cf5f5c62903ff6350f95a1c1a0102 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 1 Jan 2016 02:26:47 +0900 Subject: [PATCH 371/965] Added descriptive errors for un-CUDAed functions --- cnn/conv.cc | 36 +++++++ cnn/nodes-common.cc | 122 +++++++++++----------- cnn/nodes.cc | 239 +++++++++++++++++++++++++++++++++++++++++--- tests/test-nodes.cc | 87 ++++++++-------- 4 files changed, 364 insertions(+), 120 deletions(-) diff --git a/cnn/conv.cc b/cnn/conv.cc index 327cc69bd..47df9e1a7 100644 --- a/cnn/conv.cc +++ b/cnn/conv.cc @@ -30,10 +30,14 @@ Dim AddVectorToAllColumns::dim_forward(const vector& xs) const { } void AddVectorToAllColumns::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("AddVectorToAllColumns::forward not implemented for CUDA"); +#else auto y = *fx; auto x = **xs[0]; auto b = **xs[1]; y = x.colwise() + b.col(0); +#endif } void AddVectorToAllColumns::backward_impl(const vector& xs, @@ -65,6 +69,9 @@ Dim FoldRows::dim_forward(const vector& xs) const { } void FoldRows::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("FoldRows::forward not implemented for CUDA"); +#else auto x = **xs[0]; auto y = *fx; unsigned orows = y.rows(); @@ -76,6 +83,7 @@ void FoldRows::forward_impl(const vector& xs, Tensor& fx) const { y.row(i) = x.row(i * nrows); } } +#endif } void FoldRows::backward_impl(const vector& xs, @@ -83,12 +91,16 @@ void FoldRows::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("AddVectorToAllColumns::backward not implemented for CUDA"); +#else unsigned orows = fx.d.rows(); auto d = *dEdf; auto di = *dEdxi; for (unsigned i = 0; i < orows; ++i) for (unsigned j = 0; j < nrows; ++j) di.row(i * nrows + j) += d.row(i); +#endif } string Conv1DNarrow::as_string(const vector& arg_names) const { @@ -113,6 +125,9 @@ Dim Conv1DNarrow::dim_forward(const vector& xs) const { } void Conv1DNarrow::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Conv1DNarrow::forward not implemented for CUDA"); +#else // TODO this is a bad implementation- rewrite to use unsupported Eigen tensor library auto x = **xs[0]; // input auto f = **xs[1]; // filter @@ -128,6 +143,7 @@ void Conv1DNarrow::forward_impl(const vector& xs, Tensor& fx) con y(i, j) = t; } } +#endif } void Conv1DNarrow::backward_impl(const vector& xs, @@ -135,6 +151,9 @@ void Conv1DNarrow::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Conv1DNarrow::backward not implemented for CUDA"); +#else // TODO this is a bad implementation- rewrite to use unsupported Eigen tensor library assert(i < 2); const unsigned rows = xs[0]->d.rows(); @@ -159,6 +178,7 @@ void Conv1DNarrow::backward_impl(const vector& xs, } } } +#endif } string Conv1DWide::as_string(const vector& arg_names) const { @@ -182,6 +202,9 @@ Dim Conv1DWide::dim_forward(const vector& xs) const { } void Conv1DWide::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Conv1DWide::forward not implemented for CUDA"); +#else TensorTools::Zero(fx); auto x = **xs[0]; // input auto f = **xs[1]; // filter @@ -196,6 +219,7 @@ void Conv1DWide::forward_impl(const vector& xs, Tensor& fx) const y(i, j + k) += f(i, k) * xij; } } +#endif } void Conv1DWide::backward_impl(const vector& xs, @@ -203,6 +227,9 @@ void Conv1DWide::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Conv1DWide::backward not implemented for CUDA"); +#else assert(i < 2); const unsigned rows = xs[0]->d.rows(); const unsigned xcols = xs[0]->d.cols(); @@ -227,6 +254,7 @@ void Conv1DWide::backward_impl(const vector& xs, } } } +#endif } string KMaxPooling::as_string(const vector& arg_names) const { @@ -253,6 +281,9 @@ size_t KMaxPooling::aux_storage_size() const { } void KMaxPooling::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("KMaxPooling::forward not implemented for CUDA"); +#else auto x=**xs[0]; auto y=*fx; float tmp[1024]; @@ -282,6 +313,7 @@ void KMaxPooling::forward_impl(const vector& xs, Tensor& fx) cons //cerr << endl; abort(); } assert(mi == dim.size()); +#endif } void KMaxPooling::backward_impl(const vector& xs, @@ -289,6 +321,9 @@ void KMaxPooling::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("KMaxPooling::backward not implemented for CUDA"); +#else const unsigned rows = dim.rows(); const unsigned cols = dim.cols(); const int* maxmap = static_cast(aux_mem); @@ -306,6 +341,7 @@ void KMaxPooling::backward_impl(const vector& xs, (*dEdxi)(i, oj) += (*dEdf)(i, j); } } +#endif } } // namespace cnn diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 646127172..281b0a432 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -140,8 +140,8 @@ Dim KMHNGram::dim_forward(const vector& xs) const { assert(xs[0].ndims() == 2); const unsigned new_cols = xs[0].cols() - n + 1; if (new_cols < 1) { - cerr << "Bad input dimensions in KMHNGram: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in KMHNGram: " << xs; + throw std::invalid_argument(s.str()); } return Dim({xs[0][0], new_cols}); } @@ -154,21 +154,19 @@ string InnerProduct3D_1D::as_string(const vector& arg_names) const { } Dim InnerProduct3D_1D::dim_forward(const vector& xs) const { - if (xs.size() != 2 && xs.size() != 3) { - cerr << "Expected two or three arguments in InnerProduct3D_1D\n"; - abort(); - } + if (xs.size() != 2 && xs.size() != 3) + throw std::invalid_argument("Expected two or three arguments in InnerProduct3D_1D"); if (xs[0].ndims() != 3 || xs[1].ndims() != 1 || xs[0].size(2) != xs[1].size(0)) { - cerr << "Bad input dimensions in InnerProduct3D_1D: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in InnerProduct3D_1D: " << xs; + throw std::invalid_argument(s.str()); } Dim d({xs[0].size(0), xs[0].size(1)}, max(xs[0].bd, xs[1].bd)); if(xs.size() == 3) d.bd = max(d.bd, xs[2].bd); if (xs.size() == 3 && xs[2] != d) { - cerr << "Bad input dimensions in InnerProduct3D_1D: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in InnerProduct3D_1D: " << xs; + throw std::invalid_argument(s.str()); } return d; } @@ -241,8 +239,8 @@ Dim LogSumExp::dim_forward(const vector& xs) const { Dim d = xs[0].truncate(); for (unsigned i = 1; i < xs.size(); ++i) { if (d.single_batch() != xs[i].truncate().single_batch()) { - cerr << "Mismatched input dimensions in LogSumExp: " << xs << endl; - abort(); + ostringstream s; s << "Mismatched input dimensions in LogSumExp: " << xs; + throw std::invalid_argument(s.str()); } d.bd = max(xs[i].bd, d.bd); } @@ -260,8 +258,8 @@ Dim Sum::dim_forward(const vector& xs) const { Dim d = xs[0].truncate(); for (unsigned i = 1; i < xs.size(); ++i) { if (d.single_batch() != xs[i].truncate().single_batch()) { - cerr << "Mismatched input dimensions in Sum: " << xs << endl; - abort(); + ostringstream s; s << "Mismatched input dimensions in Sum: " << xs; + throw std::invalid_argument(s.str()); } d.bd = max(xs[i].bd, d.bd); } @@ -292,8 +290,8 @@ Dim Average::dim_forward(const vector& xs) const { Dim d(xs[0]); for (unsigned i = 1; i < xs.size(); ++i) { if (xs[0].single_batch() != xs[1].single_batch()) { - cerr << "Mismatched input dimensions in Average: " << xs << endl; - abort(); + ostringstream s; s << "Mismatched input dimensions in Average: " << xs; + throw std::invalid_argument(s.str()); } d.bd = max(xs[i].bd, d.bd); } @@ -407,8 +405,8 @@ Dim Concatenate::dim_forward(const vector& xs) const { new_rows += c[0]; dr.set(0, c[0]); if (dr != c) { - cerr << "Bad input dimensions in Concatenate: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in Concatenate: " << xs; + throw std::invalid_argument(s.str()); } dr.bd = max(dr.bd, c.bd); } @@ -433,8 +431,8 @@ Dim ConcatenateColumns::dim_forward(const vector& xs) const { unsigned bd = 1; for (auto& d : xs) { if (d[0] != rows) { - cerr << "Bad input dimensions in ConcatenateColumns: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in ConcatenateColumns: " << xs; + throw std::invalid_argument(s.str()); } new_cols += d[1]; bd = max(bd, d.bd); @@ -453,8 +451,8 @@ Dim PairwiseRankLoss::dim_forward(const vector& xs) const { xs[0] != xs[1] || xs[0].rows() != 1 || (xs[0].ndims() != 1 && xs[0].ndims() != 2)) { - cerr << "Bad input dimensions in PairwiseRankLoss: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in PairwiseRankLoss: " << xs; + throw std::invalid_argument(s.str()); } return xs[0].bd >= xs[1].bd ? xs[0] : xs[1]; } @@ -467,8 +465,8 @@ string Hinge::as_string(const vector& arg_names) const { Dim Hinge::dim_forward(const vector& xs) const { if (xs.size() != 1 || !LooksLikeVector(xs[0])) { - cerr << "Bad input dimensions in Hinge: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in Hinge: " << xs; + throw std::invalid_argument(s.str()); } return Dim({1}, xs[0].bd); } @@ -491,8 +489,8 @@ string Softmax::as_string(const vector& arg_names) const { Dim Softmax::dim_forward(const vector& xs) const { assert(xs.size() == 1); if (!LooksLikeVector(xs[0])) { - cerr << "Bad input dimensions in Softmax: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in Softmax: " << xs; + throw std::invalid_argument(s.str()); } return xs[0]; } @@ -506,8 +504,8 @@ string SoftSign::as_string(const vector& arg_names) const { Dim SoftSign::dim_forward(const vector& xs) const { assert(xs.size() == 1); if (!LooksLikeVector(xs[0])) { - cerr << "Bad input dimensions in Softsign: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in SoftSign: " << xs; + throw std::invalid_argument(s.str()); } return xs[0]; } @@ -528,8 +526,8 @@ string PickNegLogSoftmax::as_string(const vector& arg_names) const { Dim PickNegLogSoftmax::dim_forward(const vector& xs) const { assert(xs.size() == 1); if (!LooksLikeVector(xs[0])) { - cerr << "Bad input dimensions in PickNegLogSoftmax: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in PickNegLogSoftmax: " << xs; + throw std::invalid_argument(s.str()); } return Dim({1}, xs[0].bd); } @@ -543,8 +541,8 @@ string LogSoftmax::as_string(const vector& arg_names) const { Dim LogSoftmax::dim_forward(const vector& xs) const { assert(xs.size() == 1); if (!LooksLikeVector(xs[0])) { - cerr << "Bad input dimensions in LogSoftmax: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in LogSoftmax: " << xs; + throw std::invalid_argument(s.str()); } return xs[0]; } @@ -558,8 +556,8 @@ string RestrictedLogSoftmax::as_string(const vector& arg_names) const { Dim RestrictedLogSoftmax::dim_forward(const vector& xs) const { assert(xs.size() == 1); if (!LooksLikeVector(xs[0])) { - cerr << "Bad input dimensions in RestrictedLogSoftmax: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in RestrictedLogSoftmax: " << xs; + throw std::invalid_argument(s.str()); } return xs[0]; } @@ -573,8 +571,8 @@ string PickElement::as_string(const vector& arg_names) const { Dim PickElement::dim_forward(const vector& xs) const { assert(xs.size() == 1); if (!LooksLikeVector(xs[0])) { - cerr << "Bad input dimensions in PickElement: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in PickElement: " << xs; + throw std::invalid_argument(s.str()); } return Dim({1}, xs[0].bd); } @@ -590,8 +588,8 @@ string PickRange::as_string(const vector& arg_names) const { Dim PickRange::dim_forward(const vector& xs) const { assert(xs.size() == 1); if (!LooksLikeVector(xs[0])) { - cerr << "Bad input dimensions in PickElement: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in PickElement: " << xs; + throw std::invalid_argument(s.str()); } assert(end <= xs[0][0]); return Dim({end - start}, xs[0].bd); @@ -606,8 +604,8 @@ string MatrixMultiply::as_string(const vector& arg_names) const { Dim MatrixMultiply::dim_forward(const vector& xs) const { assert(xs.size() == 2); if (xs[0].cols() != xs[1].rows()) { - cerr << "Mismatched input dimensions in MatrixMultiply: " << xs << endl; - abort(); + ostringstream s; s << "Mismatched input dimensions in MatrixMultiply: " << xs; + throw std::invalid_argument(s.str()); } if (xs[1].ndims() == 1) return Dim({xs[0].rows()}, max(xs[0].bd, xs[1].bd)); return Dim({xs[0].rows(), xs[1].cols()}, max(xs[0].bd, xs[1].bd)); @@ -623,8 +621,8 @@ Dim CwiseMultiply::dim_forward(const vector& xs) const { assert(xs.size() == 2); Dim d = xs[0].truncate(); if (d.single_batch() != xs[1].truncate().single_batch()) { - cerr << "Mismatched input dimensions in CwiseMultiply: " << xs << endl; - abort(); + ostringstream s; s << "Mismatched input dimensions in CwiseMultiply: " << xs; + throw std::invalid_argument(s.str()); } d.bd = max(xs[1].bd, d.bd); return d; @@ -640,8 +638,8 @@ Dim Pow::dim_forward(const vector& xs) const { assert(xs.size() == 2); Dim d = xs[0].truncate(); if (xs[1].truncate().single_batch().size() != 1) { - cerr << "Bad input dimensions in Pow: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in Pow: " << xs; + throw std::invalid_argument(s.str()); } return d; } @@ -656,8 +654,8 @@ Dim CwiseQuotient::dim_forward(const vector& xs) const { assert(xs.size() == 2); Dim d = xs[0].truncate(); if (d.single_batch() != xs[1].truncate().single_batch()) { - cerr << "Mismatched input dimensions in CwiseQuotient: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in CwiseQuotient: " << xs; + throw std::invalid_argument(s.str()); } d.bd = max(xs[1].bd, d.bd); return d; @@ -673,16 +671,16 @@ string AffineTransform::as_string(const vector& arg_names) const { Dim AffineTransform::dim_forward(const vector& xs) const { if ((xs.size() - 1) % 2 != 0) { - cerr << "Bad number of inputs for AffineTransform: " << xs << endl; - throw std::invalid_argument("Bad number of inputs to AffineTransform"); + ostringstream s; s << "Bad number of inputs in AffineTransform: " << xs; + throw std::invalid_argument(s.str()); } Dim d = xs[0]; for (unsigned i = 1; i < xs.size(); i += 2) { if (xs[i].cols() != xs[i+1].rows() || xs[0].rows() != xs[i].rows() || xs[0].cols() != xs[i+1].cols()) { - cerr << "Bad dimensions for AffineTransform: " << xs << endl; - throw std::invalid_argument("Bad dimensions to AffineTransform"); + ostringstream s; s << "Bad dimensions for AffineTransform: " << xs; + throw std::invalid_argument(s.str()); } d.bd = max(max(d.bd, xs[i].bd), xs[i+1].bd); } @@ -720,8 +718,8 @@ string HuberDistance::as_string(const vector& arg_names) const { Dim HuberDistance::dim_forward(const vector& xs) const { assert(xs.size() == 2); if (xs[0].single_batch() != xs[1].single_batch()) { - cerr << "Mismatched input dimensions in HuberDistance: " << xs << endl; - abort(); + ostringstream s; s << "Mismatched input dimensions in HuberDistance: " << xs; + throw std::invalid_argument(s.str()); } return Dim({1}, max(xs[0].bd, xs[1].bd)); } @@ -735,8 +733,8 @@ string L1Distance::as_string(const vector& arg_names) const { Dim L1Distance::dim_forward(const vector& xs) const { assert(xs.size() == 2); if (xs[0].single_batch() != xs[1].single_batch()) { - cerr << "Mismatched input dimensions in L1Distance: " << xs << endl; - abort(); + ostringstream s; s << "Mismatched input dimensions in L1Distance: " << xs; + throw std::invalid_argument(s.str()); } return Dim({1}, max(xs[0].bd, xs[1].bd)); } @@ -749,8 +747,8 @@ string PoissonRegressionLoss::as_string(const vector& arg_names) const { Dim PoissonRegressionLoss::dim_forward(const vector& xs) const { if (xs.size() != 1 || xs[0].size() != 1) { - cerr << "Bad input dimensions in PoissonRegressionLoss: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in PoissonRegressionLoss: " << xs; + throw std::invalid_argument(s.str()); } return xs[0]; } @@ -764,8 +762,8 @@ string SquaredEuclideanDistance::as_string(const vector& arg_names) cons Dim SquaredEuclideanDistance::dim_forward(const vector& xs) const { assert(xs.size() == 2); if (xs[0].single_batch() != xs[1].single_batch()) { - cerr << "Mismatched input dimensions in SquaredEuclideanDistance: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in SquaredEuclideanDistance: " << xs; + throw std::invalid_argument(s.str()); } return Dim({1}, max(xs[0].bd, xs[1].bd)); } @@ -790,12 +788,12 @@ string BinaryLogLoss::as_string(const vector& arg_names) const { Dim BinaryLogLoss::dim_forward(const vector& xs) const { assert(xs.size() == 2); if (xs[0].rows() != 2 && xs[0].ndims() != 1) { - cerr << "Bad input dimensions in BinaryLogLoss: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in BinaryLogLoss: " << xs; + throw std::invalid_argument(s.str()); } if (xs[1].rows() != 2 && xs[1].ndims() != 1) { - cerr << "Bad input dimensions in BinaryLogLoss: " << xs << endl; - abort(); + ostringstream s; s << "Bad input dimensions in BinaryLogLoss: " << xs; + throw std::invalid_argument(s.str()); } return Dim({1}, max(xs[0].bd, xs[1].bd)); } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index f6575b9cb..a7565f3dd 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -2,6 +2,7 @@ #include #include +#include #include "cnn/simd-functors.h" #include "cnn/functors.h" @@ -36,9 +37,13 @@ namespace cnn { void Pow::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); +#ifdef HAVE_CUDA + throw std::runtime_error("Pow not yet implemented for CUDA"); +#else auto x1 = **xs[0]; auto x2 = xs[1]->v[0]; (*fx).array() = x1.array().pow(x2); +#endif } void Pow::backward_impl(const vector& xs, @@ -47,6 +52,9 @@ void Pow::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(xs.size() == 2); +#ifdef HAVE_CUDA + throw std::runtime_error("Pow not yet implemented for CUDA"); +#else auto x1 = **xs[0]; auto x2 = xs[1]->v[0]; if (i == 0) { @@ -56,6 +64,7 @@ void Pow::backward_impl(const vector& xs, // dy/dx = a^x * log(a) (*dEdxi).noalias() += (*fx).cwiseProduct(x1.array().log().matrix()).transpose() * (*dEdf); } +#endif } size_t Min::aux_storage_size() const { @@ -63,6 +72,9 @@ size_t Min::aux_storage_size() const { } void Min::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Min not yet implemented for CUDA"); +#else auto y = *fx; auto x1 = **xs[0]; auto x2 = **xs[1]; @@ -70,6 +82,7 @@ void Min::forward_impl(const vector& xs, Tensor& fx) const { auto u = *t; u = (x1.array() < x2.array()).matrix().cast(); y = x1.cwiseMin(x2); +#endif } void Min::backward_impl(const vector& xs, @@ -78,12 +91,16 @@ void Min::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i < 2); +#ifdef HAVE_CUDA + throw std::runtime_error("Min not yet implemented for CUDA"); +#else const Tensor t(dEdxi.d, static_cast(aux_mem)); if (i == 0) { *dEdxi += (*t).cwiseProduct(*dEdf); } else { *dEdxi += (*t).binaryExpr(*dEdf, FMaxBackwardInv()); } +#endif } size_t Max::aux_storage_size() const { @@ -91,6 +108,9 @@ size_t Max::aux_storage_size() const { } void Max::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Max not yet implemented for CUDA"); +#else auto y = *fx; auto x1 = **xs[0]; auto x2 = **xs[1]; @@ -98,6 +118,7 @@ void Max::forward_impl(const vector& xs, Tensor& fx) const { auto u = *t; u = (x1.array() > x2.array()).matrix().cast(); y = x1.cwiseMax(x2); +#endif } void Max::backward_impl(const vector& xs, @@ -106,18 +127,26 @@ void Max::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i < 2); +#ifdef HAVE_CUDA + throw std::runtime_error("Max not yet implemented for CUDA"); +#else const Tensor t(dEdxi.d, static_cast(aux_mem)); if (i == 0) { *dEdxi += (*t).cwiseProduct(*dEdf); } else { *dEdxi += (*t).binaryExpr(*dEdf, FMaxBackwardInv()); } +#endif } void TraceOfProduct::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("TraceOfProduct not yet implemented for CUDA"); +#else auto x1 = **xs[0]; auto x2 = **xs[1]; fx.v[0] = (x1 * x2.transpose()).trace(); +#endif } void TraceOfProduct::backward_impl(const vector& xs, @@ -126,13 +155,21 @@ void TraceOfProduct::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i < 2); +#ifdef HAVE_CUDA + throw std::runtime_error("TraceOfProduct not yet implemented for CUDA"); +#else const float d = dEdf.v[0]; auto xother = **xs[1 - i]; *dEdxi += d * xother; +#endif } void ConstScalarMultiply::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("ConstantScalarMultiply not yet implemented for CUDA"); +#else *fx = (**xs[0]) * alpha; +#endif } void ConstScalarMultiply::backward_impl(const vector& xs, @@ -141,11 +178,19 @@ void ConstScalarMultiply::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i == 0); +#ifdef HAVE_CUDA + throw std::runtime_error("ScalarMultiply not yet implemented for CUDA"); +#else *dEdxi += *dEdf * alpha; +#endif } void DotProduct::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("DotProduct not yet implemented for CUDA"); +#else *fx = (**xs[0]).transpose() * (**xs[1]); +#endif } void DotProduct::backward_impl(const vector& xs, @@ -153,7 +198,11 @@ void DotProduct::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("DotProduct not yet implemented for CUDA"); +#else (*dEdxi) += (dEdf.v[0]) * (**xs[1 - i]); +#endif } void Transpose::forward_impl(const vector& xs, Tensor& fx) const { @@ -185,7 +234,11 @@ void Transpose::backward_impl(const vector& xs, void Reshape::forward_impl(const vector& xs, Tensor& fx) const { // just point to the input memory and change dimensions // dimensions are handled by forward_dim +#ifdef HAVE_CUDA + throw std::runtime_error("Reshape not yet implemented for CUDA"); +#else fx.v = xs[0]->v; +#endif } void Reshape::backward_impl(const vector& xs, @@ -193,8 +246,12 @@ void Reshape::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Reshape not yet implemented for CUDA"); +#else const Tensor reshaped(dEdxi.d, dEdf.v); *dEdxi += *reshaped; +#endif } void SumColumns::forward_impl(const vector& xs, Tensor& fx) const { @@ -294,9 +351,13 @@ size_t GaussianNoise::aux_storage_size() const { } void GaussianNoise::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("GaussianNoise not yet implemented for CUDA"); +#else Tensor m(dim, (float*)aux_mem); TensorTools::RandomizeNormal(0, stddev, m); (*fx) = **xs[0] + *m; +#endif } void GaussianNoise::backward_impl(const vector& xs, @@ -304,7 +365,11 @@ void GaussianNoise::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("GaussianNoise not yet implemented for CUDA"); +#else *dEdxi += *dEdf; +#endif } size_t Dropout::aux_storage_size() const { @@ -312,9 +377,13 @@ size_t Dropout::aux_storage_size() const { } void Dropout::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Dropout not yet implemented for CUDA"); +#else Tensor m(dim, (float*)aux_mem); TensorTools::RandomBernoulli(m, (1.f-p), 1.f / (1.f-p)); (*fx) = (**xs[0]).cwiseProduct(*m); +#endif } void Dropout::backward_impl(const vector& xs, @@ -322,8 +391,12 @@ void Dropout::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Pow not yet implemented for CUDA"); +#else Tensor m(dim, (float*)aux_mem); (*dEdxi) += (*dEdf).cwiseProduct(*m); +#endif } size_t BlockDropout::aux_storage_size() const { @@ -332,6 +405,9 @@ size_t BlockDropout::aux_storage_size() const { } void BlockDropout::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("BlockDropout not yet implemented for CUDA"); +#else bernoulli_distribution distribution(1.0 - dropout_probability); float block_multiplier = distribution(*rndeng)? 1.0 : 0.0; block_multiplier = @@ -341,6 +417,7 @@ void BlockDropout::forward_impl(const vector& xs, Tensor& fx) con } *(static_cast(aux_mem)) = block_multiplier; (*fx) = **xs[0] * block_multiplier; +#endif } void BlockDropout::backward_impl(const vector& xs, @@ -348,13 +425,21 @@ void BlockDropout::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("BlockDropout not yet implemented for CUDA"); +#else float block_multiplier = *(static_cast(aux_mem)); (*dEdxi) += (*dEdf) * block_multiplier; +#endif } void ConstantPlusX::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("ConstantPlusX not yet implemented for CUDA"); +#else auto x = **xs[0]; *fx = x.unaryExpr(const_add_op(c)); +#endif } void ConstantPlusX::backward_impl(const vector& xs, @@ -539,8 +624,12 @@ void Average::backward_impl(const vector& xs, } void Sqrt::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Sqrt not yet implemented for CUDA"); +#else auto x = **xs[0]; (*fx) = x.cwiseSqrt(); +#endif } void Sqrt::backward_impl(const vector& xs, @@ -548,12 +637,20 @@ void Sqrt::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Sqrt not yet implemented for CUDA"); +#else *dEdxi += (*fx).binaryExpr(*dEdf, FSqrtBackward()); +#endif } void Erf::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Erf not yet implemented for CUDA"); +#else auto x = **xs[0]; (*fx).array() = x.array().erf(); +#endif } void Erf::backward_impl(const vector& xs, @@ -561,8 +658,12 @@ void Erf::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Erf not yet implemented for CUDA"); +#else auto x = **xs[0]; *dEdxi += x.binaryExpr(*dEdf, scalar_erf_backward_op()); +#endif } void Tanh::forward_impl(const vector& xs, Tensor& fx) const { @@ -587,8 +688,12 @@ void Tanh::backward_impl(const vector& xs, } void Square::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Square not yet implemented for CUDA"); +#else auto x = **xs[0]; (*fx).array() = x.array().square(); +#endif } void Square::backward_impl(const vector& xs, @@ -596,13 +701,21 @@ void Square::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Square not yet implemented for CUDA"); +#else auto x = **xs[0]; *dEdxi += (*dEdf).cwiseProduct(x) * 2; +#endif } void Cube::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Square not yet implemented for CUDA"); +#else auto x = **xs[0]; (*fx).array() = x.array().cube(); +#endif } void Cube::backward_impl(const vector& xs, @@ -610,14 +723,22 @@ void Cube::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Cube not yet implemented for CUDA"); +#else auto x = **xs[0]; // *dEdxi += (*dEdf).cwiseProduct(x.cwiseProduct(x)) * 3; (*dEdxi).array() += (*dEdf).array() * x.array().square() * 3; +#endif } void Exp::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Exp not yet implemented for CUDA"); +#else auto x = **xs[0]; *fx = x.array().exp(); +#endif } void Exp::backward_impl(const vector& xs, @@ -625,12 +746,20 @@ void Exp::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("Exp not yet implemented for CUDA"); +#else *dEdxi += (*dEdf).cwiseProduct(*fx); +#endif } void LogGamma::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("LogGamma not yet implemented for CUDA"); +#else auto x = **xs[0]; *fx = x.array().lgamma(); +#endif } void LogGamma::backward_impl(const vector& xs, @@ -638,8 +767,12 @@ void LogGamma::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("LogGamma not yet implemented for CUDA"); +#else auto x = **xs[0]; *dEdxi += x.binaryExpr(*dEdf, FLogGammaBackward()); +#endif } void Log::forward_impl(const vector& xs, Tensor& fx) const { @@ -774,6 +907,9 @@ size_t Hinge::aux_storage_size() const { void Hinge::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); +#ifdef HAVE_CUDA + throw std::runtime_error("Hinge not yet implemented for CUDA"); +#else auto x = **xs[0]; const unsigned rows = x.rows(); float y = 0; @@ -788,6 +924,7 @@ void Hinge::forward_impl(const vector& xs, Tensor& fx) const { } } fx.v[0] = y; +#endif } void Hinge::backward_impl(const vector& xs, @@ -796,6 +933,9 @@ void Hinge::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i == 0); +#ifdef HAVE_CUDA + throw std::runtime_error("Hinge not yet implemented for CUDA"); +#else if (fx.v[0]) { // there was some loss const float d = dEdf.v[0]; const unsigned rows = dEdxi.d.rows(); @@ -808,6 +948,7 @@ void Hinge::backward_impl(const vector& xs, } (*dEdxi)(*pelement) -= d * tne; } +#endif } void Identity::forward_impl(const vector& xs, Tensor& fx) const { @@ -880,8 +1021,7 @@ void Softmax::forward_impl(const vector& xs, Tensor& fx) const { *fx = x.unaryExpr(FSoftmaxNormalize(logsumexp(x))); #endif } else { - cerr << "SoftmaxForward not implemented for multiple columns\n"; - abort(); + throw std::runtime_error("Softmax not yet implemented for multiple columns"); } } @@ -927,8 +1067,7 @@ void PickNegLogSoftmax::forward_impl(const vector& xs, Tensor& fx } #endif } else { - cerr << "PickNegLogSoftmax::forward not implemented for multiple columns\n"; - abort(); + throw std::runtime_error("PickNegLogSoftmax::forward not yet implemented for multiple columns"); } } @@ -975,19 +1114,21 @@ void PickNegLogSoftmax::backward_impl(const vector& xs, } #endif } else { - cerr << "PickNegLogSoftmax not implemented for multiple columns\n"; - abort(); + throw std::runtime_error("PickNegLogSoftmax::backward not yet implemented for multiple columns"); } } void LogSoftmax::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); if (xs[0]->d.cols() == 1) { +#if HAVE_CUDA + throw std::runtime_error("LogSoftmax::forward not yet implemented for CUDA"); +#else auto x = **xs[0]; *fx = x.unaryExpr(FLogSoftmaxNormalize(logsumexp(x))); +#endif } else { - cerr << "LogSoftmaxForward not implemented for multiple columns\n"; - abort(); + throw std::runtime_error("LogSoftmax::forward not yet implemented for multiple columns"); } } @@ -997,11 +1138,14 @@ void LogSoftmax::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { if (xs[0]->d.cols() == 1) { +#if HAVE_CUDA + throw std::runtime_error("LogSoftmax::backward not yet implemented for CUDA"); +#else float off_diag_sum = -(*fx).binaryExpr(*dEdf, FWeightedError()).sum(); *dEdxi += (*fx).binaryExpr(*dEdf, FLogSoftmaxBackward(off_diag_sum)); +#endif } else { - cerr << "LogSoftmaxBackward not implemented for multiple columns\n"; - abort(); + throw std::runtime_error("LogSoftmax::backward not yet implemented for multiple columns"); } } @@ -1019,6 +1163,9 @@ EIGEN_STRONG_INLINE real logsumexp(const T& x, const vector& denom) { } void RestrictedLogSoftmax::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("RestrictedLogSoftmax not yet implemented for CUDA"); +#else // TODO create auxiliary mask with -infty's // and do usual LogSoftmax stuff assert(xs.size() == 1); @@ -1030,6 +1177,7 @@ void RestrictedLogSoftmax::forward_impl(const vector& xs, Tensor& for (auto i : denom) (*fx)(i,0) = x(i,0) - logz; if (denom.size() == 1) (*fx)(denom.front(), 0) = 0; +#endif } void RestrictedLogSoftmax::backward_impl(const vector& xs, @@ -1038,19 +1186,27 @@ void RestrictedLogSoftmax::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i == 0); +#ifdef HAVE_CUDA + throw std::runtime_error("RestrictedLogSoftmax not yet implemented for CUDA"); +#else float z = 0; for (auto ind : denom) z += (*dEdf)(ind, 0); for (auto ind : denom) (*dEdxi)(ind, 0) += (*dEdf)(ind, 0) - expf((*fx)(ind, 0)) * z; +#endif } // x_1 is a vector // y = (x_1)_{*pval} void PickElement::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); +#ifdef HAVE_CUDA + throw std::runtime_error("PickElement not yet implemented for CUDA"); +#else auto x = **xs[0]; fx.v[0] = x(*pval); +#endif } // derivative is 0 in all dimensions except 1 for the selected element @@ -1060,7 +1216,11 @@ void PickElement::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i == 0); +#ifdef HAVE_CUDA + throw std::runtime_error("PickElement not yet implemented for CUDA"); +#else (*dEdxi)(*pval) += dEdf.v[0]; +#endif } // x_1 is a vector @@ -1199,9 +1359,13 @@ void MatrixMultiply::backward_impl(const vector& xs, void CwiseQuotient::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); +#ifdef HAVE_CUDA + throw std::runtime_error("CwiseQuotient::forward not yet implemented for CUDA"); +#else auto x1 = **xs[0]; auto x2 = **xs[1]; *fx = x1.cwiseQuotient(x2); +#endif } void CwiseQuotient::backward_impl(const vector& xs, @@ -1210,6 +1374,9 @@ void CwiseQuotient::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i < 2); +#ifdef HAVE_CUDA + throw std::runtime_error("CwiseQuotient::backward not yet implemented for CUDA"); +#else if (i == 0) { auto x2 = **xs[1]; *dEdxi += (*dEdf).cwiseQuotient(x2); @@ -1218,6 +1385,7 @@ void CwiseQuotient::backward_impl(const vector& xs, auto x2 = **xs[1]; *dEdxi -= (*dEdf).cwiseQuotient(x2.cwiseProduct(x2)).cwiseProduct(x1); } +#endif } void CwiseMultiply::forward_impl(const vector& xs, Tensor& fx) const { @@ -1394,6 +1562,9 @@ void Rectify::backward_impl(const vector& xs, void HuberDistance::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); +#ifdef HAVE_CUDA + throw std::runtime_error("HuberDistance not yet implemented for CUDA"); +#else auto x = *xs[0]; auto y = *xs[1]; const FHuberForward fhf(d); @@ -1402,6 +1573,7 @@ void HuberDistance::forward_impl(const vector& xs, Tensor& fx) co for (size_t i = 0; i < s; ++i) dist += fhf(x.v[i] - y.v[i]); fx.v[0] = dist; +#endif } void HuberDistance::backward_impl(const vector& xs, @@ -1410,16 +1582,24 @@ void HuberDistance::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i < 2); +#ifdef HAVE_CUDA + throw std::runtime_error("HuberDistance not yet implemented for CUDA"); +#else auto x = **xs[i]; auto y = **xs[1-i]; *dEdxi += (x - y).unaryExpr(FHuberBackward(d, dEdf.v[0])); +#endif } void L1Distance::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); +#ifdef HAVE_CUDA + throw std::runtime_error("L1Distance not yet implemented for CUDA"); +#else auto x = **xs[0]; auto y = **xs[1]; fx.v[0] = (x - y).lpNorm<1>(); +#endif } void L1Distance::backward_impl(const vector& xs, @@ -1428,16 +1608,24 @@ void L1Distance::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { assert(i < 2); +#ifdef HAVE_CUDA + throw std::runtime_error("L1Distance not yet implemented for CUDA"); +#else auto x = **xs[i]; auto y = **xs[1-i]; *dEdxi += (x - y).unaryExpr(FL1Backward(dEdf.v[0])); +#endif } void PoissonRegressionLoss::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("PoissonRegressionLoss not yet implemented for CUDA"); +#else const auto y = *pty; const auto z = lgamma(y + 1); const auto x = xs[0]->v[0]; fx.v[0] = expf(x) + z - y * x; +#endif } void PoissonRegressionLoss::backward_impl(const vector& xs, @@ -1445,10 +1633,14 @@ void PoissonRegressionLoss::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("PoissonRegressionLoss not yet implemented for CUDA"); +#else const auto x = xs[0]->v[0]; const auto y = *pty; auto& dEdx = dEdxi.v[0]; dEdx += expf(x) - y; +#endif } void SquaredEuclideanDistance::forward_impl(const vector& xs, Tensor& fx) const { @@ -1503,8 +1695,12 @@ void LogisticSigmoid::backward_impl(const vector& xs, void SoftSign::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); +#ifdef HAVE_CUDA + throw std::runtime_error("SoftSign not yet implemented for CUDA"); +#else auto x = **xs[0]; *fx = x.unaryExpr(FSoftSign()); +#endif } void SoftSign::backward_impl(const vector& xs, @@ -1512,10 +1708,17 @@ void SoftSign::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("SoftSign not yet implemented for CUDA"); +#else *dEdxi += (*fx).binaryExpr(*dEdf, FSoftSignBackward()); +#endif } void BinaryLogLoss::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("BinaryLogLoss not yet implemented for CUDA"); +#else auto x = *xs[0]; auto y = *xs[1]; FBinaryLogLoss bll; @@ -1524,6 +1727,7 @@ void BinaryLogLoss::forward_impl(const vector& xs, Tensor& fx) co for (size_t i = 0; i < s; ++i) dist += bll(x.v[i], y.v[i]); fx.v[0] = dist; +#endif } void BinaryLogLoss::backward_impl(const vector& xs, @@ -1531,7 +1735,11 @@ void BinaryLogLoss::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("BinaryLogLoss not yet implemented for CUDA"); +#else *dEdxi += (**xs[i]).binaryExpr(**xs[1-i], FBinaryLogLossBackward(dEdf.v[0])); +#endif } string Zeroes::as_string(const vector& arg_names) const { @@ -1554,12 +1762,11 @@ void Zeroes::forward_impl(const vector& xs, Tensor& fx) const { } void Zeroes::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - cerr << "called backward() on arity 0 node\n"; - abort(); + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + throw std::runtime_error("Called backward() on an arity 0 node"); } } // namespace cnn diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index a7e17d6ff..fea71a4b1 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -1,8 +1,8 @@ #include -// #define BOOST_TEST_MODULE CNNBasicTest #include #include #include +#include using namespace cnn; using namespace cnn::expr; @@ -17,6 +17,8 @@ struct NodeTest { char **argv = &av[0]; int argc = av.size(); cnn::Initialize(argc, argv); + ones3_vals = {1.f,1.f,1.f}; + ones2_vals = {1.f,1.f}; // Create parameters std::vector param1_vals = {1.1f,-2.2f,3.3f}; std::vector param2_vals = {2.2f,3.4f,-1.2f}; @@ -34,6 +36,7 @@ struct NodeTest { ~NodeTest() { for (auto x : av) free(x); } + std::vector ones3_vals, ones2_vals; std::vector av; cnn::Model mod; cnn::Parameters *param1, *param2, *param_scalar1, *param_scalar2; @@ -48,7 +51,7 @@ BOOST_AUTO_TEST_CASE( negate_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = -x1; - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -58,7 +61,7 @@ BOOST_AUTO_TEST_CASE( add_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = x1+x2; - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -67,7 +70,7 @@ BOOST_AUTO_TEST_CASE( addscalar_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = x1+2.0; - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -76,7 +79,7 @@ BOOST_AUTO_TEST_CASE( scalaradd_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = 2.0+x1; - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -86,7 +89,7 @@ BOOST_AUTO_TEST_CASE( subtract_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = x1+x2; - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -95,7 +98,7 @@ BOOST_AUTO_TEST_CASE( scalarsubtract_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = 2.0-x1; - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -104,7 +107,7 @@ BOOST_AUTO_TEST_CASE( subtractscalar_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = x1-2.0; - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -114,7 +117,8 @@ BOOST_AUTO_TEST_CASE( multiply_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = x1*transpose(x2); - sum_cols( transpose( sum_cols( y ) ) ); + Expression ones3 = input(cg, {1,3}, ones3_vals); + ones3 * y * transpose(ones3); BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -123,7 +127,7 @@ BOOST_AUTO_TEST_CASE( multiplyscalar_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = x1*2.0; - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -132,7 +136,7 @@ BOOST_AUTO_TEST_CASE( scalarmultiply_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = 2.0*x1; - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -141,7 +145,7 @@ BOOST_AUTO_TEST_CASE( dividescalar_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = x1/2.0; - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -151,7 +155,7 @@ BOOST_AUTO_TEST_CASE( cdiv_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = cdiv(x1, x2); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -161,7 +165,8 @@ BOOST_AUTO_TEST_CASE( colwise_add_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = colwise_add(x1 * transpose(x2), x2); - sum_cols( transpose( sum_cols(y) ) ); + Expression ones3 = input(cg, {1,3}, ones3_vals); + ones3 * y * transpose(ones3); BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -176,7 +181,7 @@ BOOST_AUTO_TEST_CASE( sqrt_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = sqrt(x1); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -185,7 +190,7 @@ BOOST_AUTO_TEST_CASE( erf_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = erf(x1); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -194,7 +199,7 @@ BOOST_AUTO_TEST_CASE( tanh_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = tanh(x1); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -203,7 +208,7 @@ BOOST_AUTO_TEST_CASE( exp_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = exp(x1); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -212,7 +217,7 @@ BOOST_AUTO_TEST_CASE( square_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = square(x1); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -221,7 +226,7 @@ BOOST_AUTO_TEST_CASE( cube_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = cube(x1); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -230,7 +235,7 @@ BOOST_AUTO_TEST_CASE( lgamma_gradient ) { cnn::ComputationGraph cg; Expression x2 = parameter(cg, param2); Expression y = lgamma(x2); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -239,7 +244,7 @@ BOOST_AUTO_TEST_CASE( log_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = log(x1); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -248,7 +253,7 @@ BOOST_AUTO_TEST_CASE( logistic_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = logistic(x1); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -257,7 +262,7 @@ BOOST_AUTO_TEST_CASE( rectify_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = rectify(x1); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -266,8 +271,7 @@ BOOST_AUTO_TEST_CASE( hinge_gradient ) { unsigned index = 0; cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); - Expression y = hinge(x1, index, 0.5); - sum_cols( transpose( y ) ); + hinge(x1, index, 0.5); BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -276,8 +280,7 @@ BOOST_AUTO_TEST_CASE( hingeptr_gradient ) { unsigned index = 0; cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); - Expression y = hinge(x1, &index, 0.5); - sum_cols( transpose( y ) ); + hinge(x1, &index, 0.5); BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -286,7 +289,7 @@ BOOST_AUTO_TEST_CASE( log_softmax_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = log_softmax(x1); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -296,7 +299,7 @@ BOOST_AUTO_TEST_CASE( restricted_log_softmax_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = log_softmax(x1, restriction); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -305,7 +308,7 @@ BOOST_AUTO_TEST_CASE( softmax_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = softmax(x1); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -314,7 +317,7 @@ BOOST_AUTO_TEST_CASE( softsign_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = softsign(x1); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -324,7 +327,7 @@ BOOST_AUTO_TEST_CASE( pow_gradient ) { Expression x1 = parameter(cg, param1); Expression x_scalar1 = parameter(cg, param_scalar1); Expression y = pow(x1, x_scalar1); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -334,7 +337,7 @@ BOOST_AUTO_TEST_CASE( min_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = min(x1, x2); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -344,7 +347,7 @@ BOOST_AUTO_TEST_CASE( max_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = max(x1, x2); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -353,7 +356,7 @@ BOOST_AUTO_TEST_CASE( noise_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = noise(x1, 0.5); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -362,7 +365,7 @@ BOOST_AUTO_TEST_CASE( dropout_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = dropout(x1, 0.5); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -374,7 +377,7 @@ BOOST_AUTO_TEST_CASE( reshape_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = reshape(x1, {1,3}); - sum_cols( y ); + y * input(cg, {3}, ones3_vals); BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -383,7 +386,7 @@ BOOST_AUTO_TEST_CASE( transpose_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = softsign(x1); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -402,7 +405,7 @@ BOOST_AUTO_TEST_CASE( cwise_multiply_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = cwise_multiply(x1, x2); - sum_cols( transpose( y ) ); + input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -495,8 +498,8 @@ BOOST_AUTO_TEST_CASE( pickptr_gradient ) { BOOST_AUTO_TEST_CASE( pickrange_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); - Expression y = pickrange(x1, 0, 1); - sum_cols( transpose(y) ); + Expression y = pickrange(x1, 0, 2); + input(cg, {1,2}, ones2_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } From a37c7b74079a4a9f3e42f0182c28d9e86bd723a9 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 1 Jan 2016 04:35:26 +0900 Subject: [PATCH 372/965] Fixed bugs in tests and GPU log function --- cnn/grad-check.cc | 12 ++++-------- cnn/nodes.cc | 4 ++-- cnn/tensor.cc | 2 +- tests/test-nodes.cc | 9 ++++++--- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc index fbb79fc1d..a2c26a9e9 100644 --- a/cnn/grad-check.cc +++ b/cnn/grad-check.cc @@ -43,10 +43,8 @@ bool CheckGrad(Model& m, ComputationGraph& g, int verbosity) { float g_act = TensorTools::AccessElement(p.g, i); float f = fabs(g - g_act); float m = max(fabs(g), fabs(g_act)); - if (f > 0.1) { - if (m > 0.f) f /= m; - if (f > 0.1) { flag = true; if(verbosity > 0) { curr_flag = true; cerr << "***[" << f << "] "; } } - } + if (f > 0.1 && m > 0.f) f /= m; + if (f > 0.1 || std::isnan(f)) { flag = true; if(verbosity > 0) { curr_flag = true; cerr << "***[" << f << "] "; } } if(verbosity + (curr_flag ? 1 : 0) > 1) { cerr << g_act << ' ' << g << endl; curr_flag = false; @@ -75,10 +73,8 @@ bool CheckGrad(Model& m, ComputationGraph& g, int verbosity) { float g_act = TensorTools::AccessElement(ag, i); float f = fabs(g - g_act); float m = max(fabs(g), fabs(g_act)); - if (f > 0.1) { - if (m > 0.f) f /= m; - if (f > 0.1) { flag = true; if(verbosity > 0) { curr_flag = true; cerr << "***[" << f << "] "; } } - } + if (f > 0.1 && m > 0.f) f /= m; + if (f > 0.1 || std::isnan(f)) { flag = true; if(verbosity > 0) { curr_flag = true; cerr << "***[" << f << "] "; } } if(verbosity + (curr_flag ? 1 : 0) > 1) { cerr << g_act << ' ' << g << endl; curr_flag = false; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index a7565f3dd..7a8f21535 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -790,7 +790,7 @@ void Log::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { #if HAVE_CUDA - gpu::vlog_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); + gpu::vlog_backward(fx.d.size(), xs[0]->v, dEdf.v, dEdxi.v); #else auto x = **xs[0]; *dEdxi += (*dEdf).cwiseQuotient(x); @@ -1339,7 +1339,7 @@ void MatrixMultiply::backward_impl(const vector& xs, dEdxi.d.rows(), dEdxi.d.cols(), xs[0]->d.rows(), kSCALAR_ONE, xs[0]->batch_ptr(b), xs[0]->d.rows(), - dEdf.batch_ptr(b), xs[0]->d.rows(), + dEdf.batch_ptr(b), dEdf.d.rows(), kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); } #else diff --git a/cnn/tensor.cc b/cnn/tensor.cc index 32e282116..ceda16071 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -47,7 +47,7 @@ vector as_vector(const Tensor& v) { float TensorTools::AccessElement(const Tensor& v, int index) { #if HAVE_CUDA float ret; - cudaMemcpyAsync(&ret, v.v, sizeof(real), cudaMemcpyDeviceToHost); + cudaMemcpyAsync(&ret, &v.v[index], sizeof(real), cudaMemcpyDeviceToHost); return ret; #else return v.v[index]; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index fea71a4b1..cb133f3a7 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -22,12 +22,15 @@ struct NodeTest { // Create parameters std::vector param1_vals = {1.1f,-2.2f,3.3f}; std::vector param2_vals = {2.2f,3.4f,-1.2f}; + std::vector param3_vals = {1.1f,2.2f,3.3f}; std::vector param_scalar1_vals = {2.2f}; std::vector param_scalar2_vals = {1.1f}; param1 = mod.add_parameters({3}); TensorTools::SetElements(param1->values,param1_vals); param2 = mod.add_parameters({3}); TensorTools::SetElements(param2->values,param2_vals); + param3 = mod.add_parameters({3}); + TensorTools::SetElements(param3->values,param3_vals); param_scalar1 = mod.add_parameters({1}); TensorTools::SetElements(param_scalar1->values,param_scalar1_vals); param_scalar2 = mod.add_parameters({1}); @@ -39,7 +42,7 @@ struct NodeTest { std::vector ones3_vals, ones2_vals; std::vector av; cnn::Model mod; - cnn::Parameters *param1, *param2, *param_scalar1, *param_scalar2; + cnn::Parameters *param1, *param2, *param3, *param_scalar1, *param_scalar2; }; // define the test suite @@ -242,8 +245,8 @@ BOOST_AUTO_TEST_CASE( lgamma_gradient ) { // Expression log(const Expression& x); BOOST_AUTO_TEST_CASE( log_gradient ) { cnn::ComputationGraph cg; - Expression x1 = parameter(cg, param1); - Expression y = log(x1); + Expression x3 = parameter(cg, param3); + Expression y = log(x3); input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } From e4f30a57da2ac8ff304e198f10e3487b6bc2af39 Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 1 Jan 2016 02:03:50 +0200 Subject: [PATCH 373/965] some more pycnn memory efficiency. - removed the cg from Expression and use the global singleton instead. - added a `transduce` method to RNNState, allowing to bypass the intermediate state creations. --- pycnn/pycnn.pyx | 106 +++++++++++++++++++++++--------- pyexamples/rnnlm_transduce.py | 106 ++++++++++++++++++++++++++++++++ pyexamples/tutorials/RNNs.ipynb | 71 ++++++++++++++++++++- 3 files changed, 252 insertions(+), 31 deletions(-) create mode 100644 pyexamples/rnnlm_transduce.py diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index e6f64d40b..22b7d8afd 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -347,23 +347,30 @@ cdef _cmul(Expression a, float b): return Expression.from_cexpr(a.cg_version, c_ cdef _cdiv(Expression a, float b): return Expression.from_cexpr(a.cg_version, c_op_scalar_div(a.c(), b)) cdef class Expression: #{{{ - #cdef CComputationGraph *cg - cdef CComputationGraph* cg + #cdef CComputationGraph* cg + # cg is a singleton, so there is no need to keep it inside the expression. + # not keeping cg() in the expression will preserve memory. + # if CNN comes to support multiple computation graphs, this will need to change. + cdef inline ComputationGraph cg(self): + return cg() + cdef inline CComputationGraph* cgp(self): + return cg().thisptr + cdef VariableIndex vindex cdef int cg_version def __cinit__(self): - self.cg = NULL + #self.cg = NULL self.vindex = 0 @staticmethod cdef Expression from_cexpr(int cgv, CExpression cexpr): if cgv != _cg._cg_version: raise ValueError("Attempt to use a stale expression, from a previous Computation Graph.") self = Expression() - self.cg = cexpr.pg + #self.cg = cexpr.pg self.vindex = cexpr.i self.cg_version = cgv return self cdef CExpression c(self): - return CExpression(self.cg, self.vindex) + return CExpression(self.cgp(), self.vindex) def __repr__(self): return str(self) @@ -378,20 +385,20 @@ cdef class Expression: #{{{ cpdef scalar_value(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") - if recalculate: self.cg.forward() - return c_as_scalar(self.cg.get_value(self.vindex)) + if recalculate: self.cg().forward() + return c_as_scalar(self.cgp().get_value(self.vindex)) cpdef vec_value(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") - if recalculate: self.cg.forward() - return c_as_vector(self.cg.get_value(self.vindex)) + if recalculate: self.cg().forward() + return c_as_vector(self.cgp().get_value(self.vindex)) cpdef npvalue(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") cdef CTensor t cdef CDim dim - if recalculate: self.cg.forward() - t = self.cg.get_value(self.vindex) + if recalculate: self.cg().forward() + t = self.cgp().get_value(self.vindex) dim = t.d arr = np.array(c_as_vector(t)) if dim.ndims() == 2: @@ -401,8 +408,8 @@ cdef class Expression: #{{{ cpdef value(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") cdef CTensor t - if recalculate: self.cg.forward() - t = self.cg.get_value(self.vindex) + if recalculate: self.cg().forward() + t = self.cgp().get_value(self.vindex) if t.d.ndims() == 2: return self.npvalue() vec = self.vec_value() @@ -412,12 +419,12 @@ cdef class Expression: #{{{ # TODO this runs incremental forward on the entire graph, may not be optimal in terms of efficiency. cpdef forward(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") - if recalculate: self.cg.forward() - else: self.cg.incremental_forward() + if recalculate: self.cg().forward() + else: self.cg().incremental_forward() cpdef backward(self): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") - self.cg.backward(self.vindex) + self.cgp().backward(self.vindex) def __add__(self, other): if isinstance(self, Expression) and isinstance(other, Expression): @@ -458,14 +465,14 @@ cdef class _inputExpression(Expression): cdef FloatValue val def __cinit__(self, ComputationGraph g, float s): self.val = FloatValue(s) - self.cg = g.thisptr + #self.cg = g.thisptr self.cg_version = g.version() cdef CExpression e - e = c_input(self.cg[0], self.val.addr()) + e = c_input(self.cgp()[0], self.val.addr()) self.vindex = e.i g._inputs.append(self) def set(self, float s): - self.cg.invalidate() + self.cg().invalidate() self.val.set(s) def scalarInput(float s): @@ -476,14 +483,14 @@ cdef class _vecInputExpression(Expression): def __cinit__(self, ComputationGraph g, vector[float] val, dim=None): self.val = FloatVectorValue(val) if dim is None: dim = self.val.size() - self.cg = g.thisptr + #self.cg = g.thisptr self.cg_version = g.version() cdef CExpression e - e = c_input(self.cg[0], Dim(dim), self.val.addr()) + e = c_input(self.cgp()[0], Dim(dim), self.val.addr()) self.vindex = e.i g._inputs.append(self) def set(self, vector[float] data): - self.cg.invalidate() + self.cg().invalidate() self.val.set(data) def vecInput(int dim): @@ -496,17 +503,17 @@ cdef class _lookupExpression(Expression): cdef UnsignedValue val def __cinit__(self, ComputationGraph g, LookupParameters p, unsigned index=0, update=True): self.val = UnsignedValue(index) - self.cg = g.thisptr + #self.cg = g.thisptr self.cg_version = g.version() cdef CExpression e if update: - e = c_lookup(self.cg[0], p.thisptr, self.val.addr()) + e = c_lookup(self.cgp()[0], p.thisptr, self.val.addr()) else: - e = c_const_lookup(self.cg[0], p.thisptr, self.val.addr()) + e = c_const_lookup(self.cgp()[0], p.thisptr, self.val.addr()) self.vindex = e.i g._inputs.append(self) def set(self,i): - self.cg.invalidate() + self.cg().invalidate() self.val.set(i) def lookup(LookupParameters p, unsigned index=0, update=True): @@ -516,14 +523,14 @@ cdef class _pickerExpression(Expression): cdef UnsignedValue val def __cinit__(self, ComputationGraph g, Expression e, unsigned index=0): self.val = UnsignedValue(index) - self.cg = e.cg + #self.cg = e.cg self.cg_version = g.version() cdef CExpression ce ce = c_pick(e.c(), self.val.addr()) self.vindex = ce.i g._inputs.append(self) def set_index(self,i): - self.cg.invalidate() + self.cg().invalidate() self.val.set(i) def pick(Expression e, unsigned index=0): @@ -533,14 +540,14 @@ cdef class _hingeExpression(Expression): cdef UnsignedValue val def __cinit__(self, ComputationGraph g, Expression x, unsigned index, float m=1.0): self.val = UnsignedValue(index) - self.cg = x.cg + #self.cg = x.cg self.cg_version = g.version() cdef CExpression e e = c_hinge(x.c(), self.val.addr(), m) self.vindex = e.i g._inputs.append(self) def set_index(self, unsigned i): - self.cg.invalidate() + self.cg().invalidate() self.val.set(i) def hinge(Expression x, unsigned index, float m=1.0): @@ -797,6 +804,18 @@ cdef class RNNState: # {{{ """ returns the list of states obtained by adding the given inputs to the current state, one by one. + + see also transduce(xs) + + .transduce(xs) is different from .add_inputs(xs) in the following way: + + .add_inputs(xs) returns a list of RNNState. RNNState objects can be + queried in various ways. In particular, they allow access to the previous + state, as well as to the state-vectors (h() and s() ) + + .transduce(xs) returns a list of Expression. These are just the output + expressions. For many cases, this suffices. + transduce is much more memory efficient than add_inputs. """ states = [] cur = self @@ -804,6 +823,33 @@ cdef class RNNState: # {{{ cur = cur.add_input(x) states.append(cur) return states + + cpdef transduce(self, xs): + """ + returns the list of output Expressions obtained by adding the given inputs + to the current state, one by one. + + see also add_inputs(xs) + + .transduce(xs) is different from .add_inputs(xs) in the following way: + + .add_inputs(xs) returns a list of RNNState. RNNState objects can be + queried in various ways. In particular, they allow access to the previous + state, as well as to the state-vectors (h() and s() ) + + .transduce(xs) returns a list of Expression. These are just the output + expressions. For many cases, this suffices. + transduce is much more memory efficient than add_inputs. + """ + cdef list exprs = [] + cdef Expression res + cdef Expression x + cdef int state_idx = self.state_idx + for x in xs: + res = self.builder.add_input_to_prev(CRNNPointer(state_idx), x) + state_idx = self.builder.thisptr.state() + exprs.append(res) + return exprs #cpdef int state(self): return self.state_idx diff --git a/pyexamples/rnnlm_transduce.py b/pyexamples/rnnlm_transduce.py new file mode 100644 index 000000000..f4c579c45 --- /dev/null +++ b/pyexamples/rnnlm_transduce.py @@ -0,0 +1,106 @@ +# a version rnnlm.py using the transduce() interface. +from pycnn import * +import time +import random + +LAYERS = 2 +INPUT_DIM = 50 #256 +HIDDEN_DIM = 50 #1024 +VOCAB_SIZE = 0 + +from collections import defaultdict +from itertools import count, izip +import sys +import util + +class RNNLanguageModel: + def __init__(self, model, LAYERS, INPUT_DIM, HIDDEN_DIM, VOCAB_SIZE, builder=SimpleRNNBuilder): + self.m = model + self.builder = builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) + + model.add_lookup_parameters("lookup", (VOCAB_SIZE, INPUT_DIM)) + model.add_parameters("R", (VOCAB_SIZE, HIDDEN_DIM)) + model.add_parameters("bias", (VOCAB_SIZE)) + + def BuildLMGraph(self, sent): + renew_cg() + init_state = self.builder.initial_state() + + R = parameter(self.m["R"]) + bias = parameter(self.m["bias"]) + errs = [] # will hold expressions + es=[] + state = init_state + lookup = self.m["lookup"] + inputs = [lookup[int(cw)] for cw in sent[:-1]] + expected_outputs = [int(nw) for nw in sent[1:]] + outputs = state.transduce(inputs) + r_ts = ((bias + (R * y_t)) for y_t in outputs) + errs = [pickneglogsoftmax(r_t, eo) for r_t, eo in izip(r_ts, expected_outputs)] + nerr = esum(errs) + return nerr + + def sample(self, first=1, nchars=0, stop=-1): + # sampling must use the regular incremental interface. + res = [first] + renew_cg() + state = self.builder.initial_state() + + R = parameter(self.m["R"]) + bias = parameter(self.m["bias"]) + cw = first + while True: + x_t = lookup(self.m["lookup"], cw) + state = state.add_input(x_t) + y_t = state.output() + r_t = bias + (R * y_t) + ydist = softmax(r_t) + dist = ydist.vec_value() + rnd = random.random() + for i,p in enumerate(dist): + rnd -= p + if rnd <= 0: break + res.append(i) + cw = i + if cw == stop: break + if nchars and len(res) > nchars: break + return res + +if __name__ == '__main__': + train = util.CharsCorpusReader(sys.argv[1],begin="") + vocab = util.Vocab.from_corpus(train) + + VOCAB_SIZE = vocab.size() + + model = Model() + sgd = SimpleSGDTrainer(model) + + #lm = RNNLanguageModel(model, builder=LSTMBuilder) + lm = RNNLanguageModel(model, LAYERS, INPUT_DIM, HIDDEN_DIM, VOCAB_SIZE, builder=SimpleRNNBuilder) + + train = list(train) + + chars = loss = 0.0 + for ITER in xrange(100): + random.shuffle(train) + for i,sent in enumerate(train): + _start = time.time() + if i % 50 == 0: + sgd.status() + if chars > 0: print loss / chars, + for _ in xrange(1): + samp = lm.sample(first=vocab.w2i[""],stop=vocab.w2i["\n"]) + print "".join([vocab.i2w[c] for c in samp]).strip() + loss = 0.0 + chars = 0.0 + + chars += len(sent)-1 + isent = [vocab.w2i[w] for w in sent] + errs = lm.BuildLMGraph(isent) + loss += errs.scalar_value() + errs.backward() + sgd.update(1.0) + #print "TM:",(time.time() - _start)/len(sent) + print "ITER",ITER,loss + sgd.status() + sgd.update_epoch(1.0) diff --git a/pyexamples/tutorials/RNNs.ipynb b/pyexamples/tutorials/RNNs.ipynb index c5e269819..771fa65ae 100644 --- a/pyexamples/tutorials/RNNs.ipynb +++ b/pyexamples/tutorials/RNNs.ipynb @@ -370,6 +370,75 @@ "s6.s()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Aside: memory efficient transduction\n", + "The `RNNState` interface is convenient, and allows for incremental input construction.\n", + "However, sometimes we know the sequence of inputs in advance, and care only about the sequence of\n", + "output expressions. In this case, we can use the `add_inputs(xs)` method, where `xs` is a list of Expression." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[exprssion 248/0, exprssion 254/0, exprssion 260/0] [(exprssion 246/0, exprssion 248/0), (exprssion 251/0, exprssion 254/0), (exprssion 257/0, exprssion 260/0)]\n" + ] + } + ], + "source": [ + "state = rnnbuilder.initial_state()\n", + "xs = [x1,x1,x1]\n", + "states = state.add_inputs(xs)\n", + "outputs = [s.output() for s in states]\n", + "hs = [s.h() for s in states]\n", + "print outputs, hs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is convenient.\n", + "\n", + "What if we do not care about `.s()` and `.h()`, and do not need to access the previous vectors? In such cases\n", + "we can use the `transduce(xs)` method instead of `add_inputs(xs)`.\n", + "`transduce` takes in a sequence of `Expression`s, and returns a sequence of `Expression`s.\n", + "As a consequence of not returning `RNNState`s, `trnasduce` is much more memory efficient than `add_inputs` or a series of calls to `add_input`. " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[exprssion 280/0, exprssion 286/0, exprssion 292/0]\n" + ] + } + ], + "source": [ + "state = rnnbuilder.initial_state()\n", + "xs = [x1,x1,x1]\n", + "outputs = state.transduce(xs)\n", + "print outputs" + ] + }, { "cell_type": "markdown", "metadata": { @@ -714,7 +783,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.10" + "version": "2.7.11" } }, "nbformat": 4, From 2434d3522e42ed6785ddaed7040cbec0a6f8408e Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 1 Jan 2016 15:04:38 +0200 Subject: [PATCH 374/965] skip nodes that do not participate in the computation. --- cnn/exec.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cnn/exec.cc b/cnn/exec.cc index cc93189c5..df842432d 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -121,12 +121,17 @@ void SimpleExecutionEngine::backward(VariableIndex from_where) { } // loop in reverse topological order + // consider only nodes that participate in the computation. + vector in_computation(num_nodes, false); + in_computation[num_nodes - 1] = true; vector xs; for (int i = num_nodes - 1; i >= 0; --i) { + if (!in_computation[i]) continue; const Node* node = cg.nodes[i]; xs.resize(node->arity()); unsigned ai = 0; for (VariableIndex arg : node->args) { + in_computation[arg] = true; xs[ai] = &nfxs[arg]; ++ai; } From 51b3590567a7c42759dbfadfb3e65da2d82d9762 Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 1 Jan 2016 18:35:31 +0200 Subject: [PATCH 375/965] fix pycnn cg bug --- pycnn/pycnn.pyx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 22b7d8afd..0d1e29c5f 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -472,7 +472,7 @@ cdef class _inputExpression(Expression): self.vindex = e.i g._inputs.append(self) def set(self, float s): - self.cg().invalidate() + self.cgp().invalidate() self.val.set(s) def scalarInput(float s): @@ -490,7 +490,7 @@ cdef class _vecInputExpression(Expression): self.vindex = e.i g._inputs.append(self) def set(self, vector[float] data): - self.cg().invalidate() + self.cgp().invalidate() self.val.set(data) def vecInput(int dim): @@ -513,7 +513,7 @@ cdef class _lookupExpression(Expression): self.vindex = e.i g._inputs.append(self) def set(self,i): - self.cg().invalidate() + self.cgp().invalidate() self.val.set(i) def lookup(LookupParameters p, unsigned index=0, update=True): @@ -530,7 +530,7 @@ cdef class _pickerExpression(Expression): self.vindex = ce.i g._inputs.append(self) def set_index(self,i): - self.cg().invalidate() + self.cgp().invalidate() self.val.set(i) def pick(Expression e, unsigned index=0): @@ -547,7 +547,7 @@ cdef class _hingeExpression(Expression): self.vindex = e.i g._inputs.append(self) def set_index(self, unsigned i): - self.cg().invalidate() + self.cgp().invalidate() self.val.set(i) def hinge(Expression x, unsigned index, float m=1.0): From e995fe5d20207e7d73d891f95b79c6db32a813d1 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 5 Jan 2016 22:55:29 -0500 Subject: [PATCH 376/965] Fixed illegal inputs in tests --- tests/test-nodes.cc | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index cb133f3a7..3de95c187 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -8,6 +8,7 @@ using namespace cnn; using namespace cnn::expr; using namespace std; + struct NodeTest { NodeTest() { // set up some dummy arguments to cnn @@ -18,6 +19,7 @@ struct NodeTest { int argc = av.size(); cnn::Initialize(argc, argv); ones3_vals = {1.f,1.f,1.f}; + first_one_vals = {1.f,0.f,0.f}; ones2_vals = {1.f,1.f}; // Create parameters std::vector param1_vals = {1.1f,-2.2f,3.3f}; @@ -39,7 +41,17 @@ struct NodeTest { ~NodeTest() { for (auto x : av) free(x); } - std::vector ones3_vals, ones2_vals; + + template + std::string print_vec(const std::vector vec) { + ostringstream oss; + if(vec.size()) oss << vec[0]; + for(size_t i = 1; i < vec.size(); i++) + oss << ' ' << vec[i]; + return oss.str(); + } + + std::vector ones3_vals, ones2_vals, first_one_vals; std::vector av; cnn::Model mod; cnn::Parameters *param1, *param2, *param3, *param_scalar1, *param_scalar2; @@ -182,8 +194,8 @@ BOOST_AUTO_TEST_CASE( colwise_add_gradient ) { // Expression sqrt(const Expression& x); BOOST_AUTO_TEST_CASE( sqrt_gradient ) { cnn::ComputationGraph cg; - Expression x1 = parameter(cg, param1); - Expression y = sqrt(x1); + Expression x3 = parameter(cg, param3); + Expression y = sqrt(x3); input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -292,17 +304,17 @@ BOOST_AUTO_TEST_CASE( log_softmax_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = log_softmax(x1); - input(cg, {1,3}, ones3_vals) * y; + input(cg, {1,3}, first_one_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } // Expression log_softmax(const Expression& x, const std::vector& restriction); BOOST_AUTO_TEST_CASE( restricted_log_softmax_gradient ) { - vector restriction = {1,2}; + vector restriction = {0,1}; cnn::ComputationGraph cg; - Expression x1 = parameter(cg, param1); - Expression y = log_softmax(x1, restriction); - input(cg, {1,3}, ones3_vals) * y; + Expression x3 = parameter(cg, param3); + Expression y = exp( log_softmax(x3, restriction) ); + input(cg, {1,3}, first_one_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -311,7 +323,7 @@ BOOST_AUTO_TEST_CASE( softmax_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = softmax(x1); - input(cg, {1,3}, ones3_vals) * y; + input(cg, {1,3}, first_one_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -327,9 +339,9 @@ BOOST_AUTO_TEST_CASE( softsign_gradient ) { // Expression pow(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( pow_gradient ) { cnn::ComputationGraph cg; - Expression x1 = parameter(cg, param1); + Expression x3 = parameter(cg, param3); Expression x_scalar1 = parameter(cg, param_scalar1); - Expression y = pow(x1, x_scalar1); + Expression y = pow(x3, x_scalar1); input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -451,8 +463,8 @@ BOOST_AUTO_TEST_CASE( l1_distance_gradient ) { // Expression binary_log_loss(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( binary_log_loss_gradient ) { cnn::ComputationGraph cg; - Expression x1 = parameter(cg, param1); - Expression x2 = parameter(cg, param2); + Expression x1 = logistic( parameter(cg, param1) ); + Expression x2 = input(cg, {3}, ones3_vals); binary_log_loss(x1, x2); BOOST_CHECK(CheckGrad(mod, cg, 0)); } From c6a85b0f44ff653b2c6aa0f9ce2bba19f4763a6b Mon Sep 17 00:00:00 2001 From: Lingpeng Kong Date: Thu, 7 Jan 2016 21:56:12 -0500 Subject: [PATCH 377/965] segrnn update --- examples/segrnn-sup.cc | 380 +++++++++++++++++++++++++++++++++-------- 1 file changed, 308 insertions(+), 72 deletions(-) diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index 738c28254..ef6a18225 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -52,7 +52,6 @@ namespace std { } - unsigned LAYERS = 1; unsigned INPUT_DIM = 64; unsigned XCRIBE_DIM = 32; @@ -64,7 +63,9 @@ unsigned DURATION_DIM = 4; unsigned int DATA_MAX_SEG_LEN = 0; -bool use_pretrained_embeding = true; +bool use_pretrained_embeding = false; +bool use_dropout = false; +float dropout_rate; bool ner_tagging = false; string pretrained_embeding = ""; @@ -184,8 +185,18 @@ struct BiTrans { vector transcribe(ComputationGraph& cg, const vector& x) { l2rbuilder.new_graph(cg); + if(use_dropout){ + l2rbuilder.set_dropout(dropout_rate); + }else{ + l2rbuilder.disable_dropout(); + } l2rbuilder.start_new_sequence(); r2lbuilder.new_graph(cg); + if(use_dropout){ + r2lbuilder.set_dropout(dropout_rate); + }else{ + r2lbuilder.disable_dropout(); + } r2lbuilder.start_new_sequence(); Expression f2c = parameter(cg, p_f2c); Expression r2c = parameter(cg, p_r2c); @@ -221,6 +232,11 @@ struct SegEmbedUni { h.resize(len); Expression h0 = parameter(cg, p_h0); builder.new_graph(cg); + if(use_dropout){ + builder.set_dropout(dropout_rate); + }else{ + builder.disable_dropout(); + } for (int i = 0; i < len; ++i) { int max_j = i + len; if (max_seg_len) max_j = i + max_seg_len; @@ -375,8 +391,12 @@ struct SegmentalRNN { Expression ce_embeding = (j == len) ? c_end : c[j]; Expression h1 = rectify(affine_transform({h1b, d2h1, d, y2h1, y, fwd2h1, seg_embedding_ij.first, rev2h1, seg_embedding_ij.second, cf2h1, cf_embeding, ce2h1, ce_embeding})); - Expression h2 = tanh(affine_transform({h2b, h12h2, h1})); - //Expression p = exp(affine_transform({ob, h22o, h2})); + Expression h2; + if(use_dropout){ + h2 = dropout(tanh(affine_transform({h2b, h12h2, h1})), dropout_rate); + }else{ + h2 = tanh(affine_transform({h2b, h12h2, h1})); + } Expression p = affine_transform({ob, h22o, h2}); p_map[key_tuple] = p; } @@ -385,9 +405,9 @@ struct SegmentalRNN { return p_map; } - + // return Expression of total loss - Expression SupervisedLoss(vector& xins, + Expression SupervisedCRFLoss(vector& xins, const vector>& yz, // .first = y, .second = duration (z) ComputationGraph& cg, int max_seg_len = 0) { @@ -454,31 +474,48 @@ struct SegmentalRNN { return fwd.back() - ref_fwd.back(); } - Expression ViterbiDecode(vector& xins, - const vector>& yz_gold, // .first = y, .second = duration (z) - ComputationGraph& cg, - vector> &yz_pred, - int max_seg_len = 0) { - yz_pred.clear(); + Expression PartiallySupervisedCRFLoss(vector& xins, + const vector>& yz, // .first = y, .second = duration (z) + ComputationGraph& cg, + int max_seg_len = 0) { + + // I keep the z here although I am not going to use it int len = xins.size(); unordered_map p_map = ConstructSegmentMap(xins, cg, max_seg_len); vector fwd(len+1); // fwd trellis for model - vector f, fr; - vector> ijt; // ijt stores positions where we get the max (i.e. i, j and tag) - vector> it; // it stores positions where we get the max ending at j - it.push_back(make_tuple(0,0,0)); // push one to make the index consistent, now it[j] means j rather than j+1 + vector f; + + vector> fwd_iq(len+1); + for (int ind = 0; ind < fwd_iq.size(); ++ind){ + // if yz.size() == 2, then we have end state q = 2 means already consume 2 labels + // therefore here, should resize to yz.size() + 1 so that fwd_iq[len][2] is the end state + fwd_iq[ind].resize(yz.size()+1); + } + + vector> fq; + // cg.forward(); + // cerr << "here" << endl; + // cerr << len << endl; + // careful: in the other algorithms spans are [i,j], here they are [i,j) for (int j = 1; j <= len; ++j) { + // cg.forward(); + // cerr << "j: " << j << endl; // fwd[j] is the total unnoramlized probability for all segmentations / labels // ending (and including) the symbol at position j-1 f.clear(); // f stores all additive contributions to item [j] - fr.clear(); - ijt.clear(); + fq.clear(); + fq.resize(yz.size() + 1); + for(auto e : fq){ + e.clear(); + } + for (unsigned tag = 0; tag < td.size(); ++tag) { const int i_start = max_seg_len ? max(0, j - max_seg_len) : 0; for (int i = i_start; i < j; ++i) { // i is the starting position PKey key_tuple(i,j,tag); + assert(p_map.find (key_tuple) != p_map.end()); Expression p = p_map.at(key_tuple); if (i == 0) { // fwd[0] is the path up and including -1, so it's the empty set, i.e., its probability is 1 @@ -486,21 +523,145 @@ struct SegmentalRNN { } else { f.push_back(p + fwd[i]); } + + for (int q = 0; (q < yz.size()+1 && q <= j) ; ++q){ + if (i == 0){ + if(tag == yz[q-1].first && q == 1){ + // q can be 0 now and must be 0 now + // cerr << "j: " << j << " i: " << i << " q: " << q << endl; + fq[q].push_back(p); + // cg.forward(); + } + } else { + if(tag == yz[q-1].first && q > 1 && q-1 <= i ) { + // if q == 0, it's not possible because i > 0, i already consume at least one lable + // how to default value 0 + // note fwd_iq[max_seg_len+1] can't only consume 1 tag + // basically, (i-1)/max_seg_len < q-1 + if ((i-1)/max_seg_len < q-1){ + fq[q].push_back(p + fwd_iq[i][q-1]); + } + // else this item got cut + } + } + } + } + } + fwd[j] = logsumexp(f); + for (int q = 0; q < yz.size()+1 && q <= j; ++q){ + if(fq[q].size() > 0){ + fwd_iq[j][q] = logsumexp(fq[q]); + } + } + } + + return fwd.back() - fwd_iq.back().back(); + } + + + Expression SumParts(int len, + const vector>& yz, + unordered_map& p_map, + ComputationGraph& cg, + int max_seg_len = 0 + ) { + vector useful_parts; + unsigned cur = 0; + for (unsigned ri = 0; ri < yz.size(); ++ri) { + assert(cur < len); + int y = yz[ri].first; + int dur = yz[ri].second; + if (max_seg_len && dur > max_seg_len) { + cerr << "max_seg_len=" << max_seg_len << " but reference duration is " << dur << endl; + abort(); + } + unsigned j = cur + dur; + assert(j <= len); + + PKey key_tuple(cur,j,y); + assert(p_map.find (key_tuple) != p_map.end()); + Expression p = p_map.at(key_tuple); + useful_parts.push_back(p); + cur = j; + } + assert(cur == len); + assert(useful_parts.size() > 0); + Expression s = sum(useful_parts); + return s; + } + + // return Expression of total loss + Expression SupervisedHingeLoss(vector& xins, + const vector>& yz, // .first = y, .second = duration (z) + ComputationGraph& cg, + int max_seg_len = 0) { + int len = xins.size(); + unordered_map p_map = ConstructSegmentMap(xins, cg, max_seg_len); + cg.forward(); + vector tempvec; + Expression gold_score = SumParts(len, yz, p_map, cg, max_seg_len); + tempvec.push_back(gold_score); + vector> yz_pred; + PureDecode(len, p_map, cg, yz_pred, max_seg_len); + Expression predict_score = SumParts(len, yz_pred, p_map, cg, max_seg_len); + tempvec.push_back(predict_score); + Expression loss = hinge(concatenate(tempvec), (unsigned)0, (float)10); + return loss; + } + + void PureDecode(int len, + unordered_map& p_map, + ComputationGraph& cg, + vector> &yz_pred, + int max_seg_len = 0){ + yz_pred.clear(); + // vector fwd(len+1); // fwd trellis for model + // vector f; + vector v_fwd(len+1); + vector v_f; + + vector> ijt; // ijt stores positions where we get the max (i.e. i, j and tag) + vector> it; // it stores positions where we get the max ending at j + it.push_back(make_tuple(0,0,0)); // push one to make the index consistent, now it[j] means j rather than j+1 + // careful: in the other algorithms spans are [i,j], here they are [i,j) + for (int j = 1; j <= len; ++j) { + // fwd[j] is the total unnoramlized probability for all segmentations / labels + // ending (and including) the symbol at position j-1 + // f.clear(); // f stores all additive contributions to item [j] + v_f.clear(); + ijt.clear(); + for (unsigned tag = 0; tag < td.size(); ++tag) { + const int i_start = max_seg_len ? max(0, j - max_seg_len) : 0; + for (int i = i_start; i < j; ++i) { // i is the starting position + PKey key_tuple(i,j,tag); + Expression p = p_map.at(key_tuple); + float v_p = as_scalar(cg.get_value(p.i)); + if (i == 0) { // fwd[0] is the path up and including -1, so it's the empty set, i.e., its probability is 1 + // f.push_back(p); + v_f.push_back(v_p); + } else { + // f.push_back(p + fwd[i]); + v_f.push_back(v_p + v_fwd[i]); + } ijt.push_back(make_tuple(i, j, tag)); } } // cerr << "size of vector f at j = " << j << " equals " << f.size() << endl; unsigned max_ind = 0; - auto max_val = as_scalar(cg.get_value(f[0].i)); - for(auto ind = 1; ind < f.size(); ++ind){ - auto val = as_scalar(cg.get_value(f[ind].i)); + // auto max_val = as_scalar(cg.get_value(f[0].i)); + auto max_val = v_f[0]; + // for(auto ind = 1; ind < f.size(); ++ind){ + for(auto ind = 1; ind < v_f.size(); ++ind){ + // auto val = as_scalar(cg.get_value(f[ind].i)); + auto val = v_f[ind]; // cerr << val << endl; if (max_val < val){ max_val = val; max_ind = ind; } } - fwd[j] = f[max_ind]; + // fwd[j] = f[max_ind]; + v_fwd[j] = v_f[max_ind]; it.push_back(ijt[max_ind]); // cerr << "max value = \t" << as_scalar(cg.get_value(fwd[j])) << endl; } @@ -517,29 +678,23 @@ struct SegmentalRNN { } std::reverse(pred.begin(),pred.end()); std::reverse(yz_pred.begin(),yz_pred.end()); - // cout << "==pred==" << endl; - // for(auto e : pred){ - // cout << std::get<0>(e) << "\t" << std::get<1>(e) << "\t" << std::get<2>(e) << endl; - // } + } - // for(auto e: yz_pred){ - // cout << e.first << "," << e.second << "\t"; - // } - // cout << endl; + void ViterbiDecode(vector& xins, + const vector>& yz_gold, // .first = y, .second = duration (z) + ComputationGraph& cg, + vector> &yz_pred, + int max_seg_len = 0) { + + int len = xins.size(); + unordered_map p_map = ConstructSegmentMap(xins, cg, max_seg_len); - // cout << "==gold==" << endl; - // for(auto e: yz_gold){ - // cout << e.first << "," << e.second << "\t"; - // } - // cout << endl; + // Compute everything at this step and use them later + cg.forward(); - // abort(); - return fwd.back(); + PureDecode(len, p_map, cg, yz_pred, max_seg_len); + return; } - - - - Parameters* p_d2h1, *p_y2h1, *p_fwd2h1, *p_rev2h1, *p_h1b; Parameters* p_h12h2, *p_h2b; @@ -681,15 +836,15 @@ double evaluate(vector>>& yz_preds, } -void test_only(SegmentalRNN& crf, +void test_only(SegmentalRNN& segrnn, vector,vector>>>& test_set, int max_seg_len = 0) { for (auto& sent : test_set) { ComputationGraph cg; vector> yz_pred; - vector xins = crf.ConstructInput(sent.first, cg); - crf.ViterbiDecode(xins, sent.second, cg, yz_pred, max_seg_len); + vector xins = segrnn.ConstructInput(sent.first, cg); + segrnn.ViterbiDecode(xins, sent.second, cg, yz_pred, max_seg_len); unsigned int i; for(i = 0; i < yz_pred.size()-1; ++i){ auto pred = yz_pred[i]; @@ -780,48 +935,99 @@ void load_dicts(string model_file_prefix, cerr << "loading dicts finished" << endl; } -double predict_and_evaluate(SegmentalRNN& crf, - const vector,vector>>>& input_set, - int max_seg_len = 0, - string set_name = "DEV" - ) +unsigned int edit_distance(const std::string& s1, const std::string& s2) { - double dloss = 0; - unsigned dtags = 0; + const std::size_t len1 = s1.size(), len2 = s2.size(); + std::vector> d(len1 + 1, std::vector(len2 + 1)); + + d[0][0] = 0; + for(unsigned int i = 1; i <= len1; ++i) d[i][0] = i; + for(unsigned int i = 1; i <= len2; ++i) d[0][i] = i; + for(unsigned int i = 1; i <= len1; ++i) + for(unsigned int j = 1; j <= len2; ++j) + d[i][j] = std::min({ d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + (s1[i - 1] == s2[j - 1] ? 0 : 1) }); + return d[len1][len2]; +} + +double evaluate_partial(vector>>& yz_preds, + vector>>& yz_golds, + cnn::Dict& d, + cnn::Dict& td){ + assert(yz_preds.size() == yz_golds.size()); + + int total_length_gold = 0; + int total_length_pred = 0; + int total_editing_distance = 0; + + for (int i = 0; i < yz_preds.size(); i++){ + // for sentence i + vector>& yz_pred = yz_preds[i]; + vector>& yz_gold = yz_golds[i]; + std::string pred_s = ""; + for (auto e : yz_pred){ + pred_s.append(td.Convert(e.first)); + total_length_pred++; + } + std::string gold_s = ""; + for (auto e : yz_gold){ + gold_s.append(td.Convert(e.first)); + total_length_gold++; + } + auto dis = edit_distance(pred_s, gold_s); + total_editing_distance += dis; + + } + cerr << "total_editing_distance: " << total_editing_distance << "\ttotal_length_gold: " << total_length_gold << "\ttotal_length_pred: " << total_length_pred << endl; + double score = (((float) total_editing_distance) * 2.0)/((float)(total_length_gold + total_length_pred)); + cerr << "score: " << score << endl; + return score; +} +double predict_and_evaluate(SegmentalRNN& segrnn, + const vector,vector>>>& input_set, + bool partial, + int max_seg_len, + string set_name = "DEV" + ){ vector>> yz_preds; vector>> yz_golds; for (auto& sent : input_set) { ComputationGraph cg; - if(check_max_seg(sent.second, max_seg_len)){ - vector xins = crf.ConstructInput(sent.first, cg); - crf.SupervisedLoss(xins, sent.second, cg, max_seg_len); - dtags += sent.second.size(); - dloss += as_scalar(cg.forward()); - } vector> yz_pred; - vector xins = crf.ConstructInput(sent.first, cg); - crf.ViterbiDecode(xins, sent.second, cg, yz_pred, max_seg_len); + vector xins = segrnn.ConstructInput(sent.first, cg); + segrnn.ViterbiDecode(xins, sent.second, cg, yz_pred, max_seg_len); yz_golds.push_back(sent.second); yz_preds.push_back(yz_pred); } - double f = evaluate(yz_preds, yz_golds, crf.d, crf.td); + + double f1 = evaluate(yz_preds, yz_golds, segrnn.d, segrnn.td); + double f2 = evaluate_partial(yz_preds, yz_golds, segrnn.d, segrnn.td); - cout << set_name << endl; - cerr << "\n***"<< set_name << " E = " << (dloss / dtags) << " ppl=" << exp(dloss / dtags) << ' '; + double f = partial ? f2 : f1; + cerr << set_name << endl; return f; } + int main(int argc, char** argv) { cnn::Initialize(argc, argv); - + int test_max_seg_len; + int max_consider_sentence_len; + unsigned dev_every_i_reports; po::options_description desc("Allowed options"); desc.add_options() ("help", "produce help message") ("train", po::bool_switch()->default_value(false), "the training mode") + ("hinge", po::bool_switch()->default_value(false), "training use the hinge loss") + ("partial", po::bool_switch()->default_value(false), "the partially supervised training mode, where we don't have z") + ("train_max_seg_len", po::value(), "in the partially supervised training mode, the max len we consider") ("load_original_model", po::bool_switch()->default_value(false), "continuing the training by loading the model, only valid during training") + ("max_consider_sentence_len", po::value(&max_consider_sentence_len)->default_value(1000)) + ("dropout_rate", po::value(), "dropout rate, also indicts using dropout during training") ("evaluate_test", po::bool_switch()->default_value(false), "evaluate test set every training iteration") ("test", po::bool_switch()->default_value(false), "the test mode") + ("test_max_seg_len", po::value(&test_max_seg_len)->default_value(30)) + ("dev_every_i_reports", po::value(&dev_every_i_reports)->default_value(1000)) ("train_file", po::value(), "path of the train file") ("dev_file", po::value(), "path of the dev file") ("test_file", po::value(), "path of the test file") @@ -847,6 +1053,15 @@ int main(int argc, char** argv) { use_pretrained_embeding = false; cerr << "not using pre-trained embeding" << endl; } + + if (vm.count("dropout_rate")){ + use_dropout = true; + dropout_rate = vm["dropout_rate"].as(); + cerr << "using dropout training, dropout rate: " << dropout_rate << endl; + }else{ + use_dropout = false; + } + // create two dictionaries cnn::Dict d; cnn::Dict td; @@ -866,10 +1081,13 @@ int main(int argc, char** argv) { // auto sgd = new SimpleSGDTrainer(&model); auto sgd = new AdamTrainer(&model, 1e-6, 0.0005, 0.01, 0.9999, 1e-8); int max_seg_len = DATA_MAX_SEG_LEN + 1; + if(vm.count("train_max_seg_len")){ + max_seg_len = vm["train_max_seg_len"].as(); + } cerr << "set max_seg_len = " << max_seg_len << endl; - SegmentalRNN crf(model, d, td); + SegmentalRNN segrnn(model, d, td); if(vm["load_original_model"].as()){ load_models(vm["model_file_prefix"].as(), model); @@ -877,7 +1095,7 @@ int main(int argc, char** argv) { double f_best = 0; unsigned report_every_i = 10; - unsigned dev_every_i_reports = 1000; + unsigned si = training.size(); vector order(training.size()); for (unsigned i = 0; i < order.size(); ++i) order[i] = i; @@ -902,8 +1120,25 @@ int main(int argc, char** argv) { auto& sent = training[order[si]]; ++si; if(check_max_seg(sent.second, max_seg_len)){ - vector xins = crf.ConstructInput(sent.first, cg); - crf.SupervisedLoss(xins, sent.second, cg, max_seg_len); + if (sent.first.size() > max_consider_sentence_len){ + cerr << "skip a sentence because its length " << sent.first.size() << " > " << max_consider_sentence_len << endl; + continue; + } + vector xins = segrnn.ConstructInput(sent.first, cg); + if(vm["partial"].as()){ + if(vm["hinge"].as()){ + cerr << "Hingle Loss for partially supervised setting is not avaiable at this moment." << endl; + abort(); + }else{ + segrnn.PartiallySupervisedCRFLoss(xins, sent.second, cg, max_seg_len); + } + }else{ + if(vm["hinge"].as()){ + segrnn.SupervisedHingeLoss(xins, sent.second, cg, max_seg_len); + }else{ + segrnn.SupervisedCRFLoss(xins, sent.second, cg, max_seg_len); + } + } ttags += sent.second.size(); loss += as_scalar(cg.forward()); cg.backward(); @@ -915,31 +1150,32 @@ int main(int argc, char** argv) { cerr << " E = " << (loss / ttags) << " ppl=" << exp(loss / ttags) << " (acc=" << (correct / ttags) << ") "; report++; if (report % dev_every_i_reports == 0) { - double f = predict_and_evaluate(crf, dev, max_seg_len); + double f = predict_and_evaluate(segrnn, dev, vm["partial"].as(), max_seg_len); if (f > f_best) { f_best = f; save_models(vm["model_file_prefix"].as(), d, td, model); } if (vm["evaluate_test"].as()){ - predict_and_evaluate(crf, test, max_seg_len, "TEST"); + predict_and_evaluate(segrnn, test, vm["partial"].as(), max_seg_len, "TEST"); } } } delete sgd; }else if(vm["test"].as()){ + use_pretrained_embeding = false; + use_dropout = false; Model model; cnn::Dict d; cnn::Dict td; load_dicts(vm["model_file_prefix"].as(), d, td); - SegmentalRNN crf(model, d, td); + SegmentalRNN segrnn(model, d, td); load_models(vm["model_file_prefix"].as(), model); vector,vector>>> test; read_file(vm["test_file"].as(), d, td, test, true); - test_only(crf, test); + test_only(segrnn, test); } } - From 3dcf789246bc7ce99669d19209580a98e64997e9 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 8 Jan 2016 15:23:10 -0500 Subject: [PATCH 378/965] Batching support for transpose and dropout --- cnn/dim.h | 2 +- cnn/nodes.cc | 20 ++++++++++++-------- cnn/nodes.h | 2 ++ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/cnn/dim.h b/cnn/dim.h index 3c8a76736..b6ce873ba 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -18,7 +18,7 @@ namespace cnn { struct Dim { Dim() : nd(), bd(1) {} // explicit Dim(unsigned int m) : nd(1), bd(1) { d[0] = m; } - // TODO: The constructors for dimensions w/ and w/o batches is not unsigned intuitive. + // TODO: The constructors for dimensions w/ and w/o batches is not intuitive. // can this be fixed in some way? // Dim(unsigned int m, unsigned int n) : nd(2), bd(1) { d[0] = m; d[1] = n; } Dim(std::initializer_list x) : nd(), bd(1) { diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 7a8f21535..901a99e27 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -210,10 +210,12 @@ void Transpose::forward_impl(const vector& xs, Tensor& fx) const fx.v = xs[0]->v; } else { #if HAVE_CUDA - CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, fx.d.rows(), fx.d.cols(), - kSCALAR_ONE, xs[0]->v, xs[0]->d.rows(), kSCALAR_ZERO, NULL, fx.d.rows(), fx.v, fx.d.rows())); + for(unsigned b = 0; b < l.d.bd; ++b) + CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, fx.d.rows(), fx.d.cols(), + kSCALAR_ONE, xs[0]->batch_ptr(b), xs[0]->d.rows(), kSCALAR_ZERO, NULL, fx.d.rows(), fx.batch_ptr(b), fx.d.rows())); #else - *fx = (**xs[0]).transpose(); + for(unsigned b = 0; b < xs[0]->d.bd; ++b) + fx.batch_matrix(b).noalias() = xs[0]->batch_matrix(b).transpose(); #endif } } @@ -224,10 +226,12 @@ void Transpose::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { #if HAVE_CUDA - CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols(), - kSCALAR_ONE, dEdf.v, dEdf.d.rows(), kSCALAR_ONE, dEdxi.v, dEdxi.d.rows(), dEdxi.v, dEdxi.d.rows())); + for(unsigned b = 0; b < l.d.bd; ++b) + CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols(), + kSCALAR_ONE, dEdf.batch_ptr(b), dEdf.d.rows(), kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows(), dEdxi.batch_ptr(b), dEdxi.d.rows())); #else - *dEdxi += (*dEdf).transpose(); + for(unsigned b = 0; b < xs[0]->d.bd; ++b) + dEdxi.batch_matrix(b) += dEdf.batch_matrix(b).transpose(); #endif } @@ -382,7 +386,7 @@ void Dropout::forward_impl(const vector& xs, Tensor& fx) const { #else Tensor m(dim, (float*)aux_mem); TensorTools::RandomBernoulli(m, (1.f-p), 1.f / (1.f-p)); - (*fx) = (**xs[0]).cwiseProduct(*m); + fx.vec() = xs[0]->vec().cwiseProduct(m.vec()); #endif } @@ -395,7 +399,7 @@ void Dropout::backward_impl(const vector& xs, throw std::runtime_error("Pow not yet implemented for CUDA"); #else Tensor m(dim, (float*)aux_mem); - (*dEdxi) += (*dEdf).cwiseProduct(*m); + dEdxi.vec() += dEdf.vec().cwiseProduct(m.vec()); #endif } diff --git a/cnn/nodes.h b/cnn/nodes.h index 4432233b7..8dea2ec9f 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -94,6 +94,7 @@ struct Transpose : public Node { explicit Transpose(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -186,6 +187,7 @@ struct Dropout : public Node { std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, From 999458e2b24a993ae29961958b22bbc51da8d628 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 9 Jan 2016 13:28:27 +0900 Subject: [PATCH 379/965] Fixed a compile error on CUDA --- cnn/nodes.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 901a99e27..46c63885b 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -210,7 +210,7 @@ void Transpose::forward_impl(const vector& xs, Tensor& fx) const fx.v = xs[0]->v; } else { #if HAVE_CUDA - for(unsigned b = 0; b < l.d.bd; ++b) + for(unsigned b = 0; b < xs[0]->d.bd; ++b) CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, fx.d.rows(), fx.d.cols(), kSCALAR_ONE, xs[0]->batch_ptr(b), xs[0]->d.rows(), kSCALAR_ZERO, NULL, fx.d.rows(), fx.batch_ptr(b), fx.d.rows())); #else @@ -226,7 +226,7 @@ void Transpose::backward_impl(const vector& xs, unsigned i, Tensor& dEdxi) const { #if HAVE_CUDA - for(unsigned b = 0; b < l.d.bd; ++b) + for(unsigned b = 0; b < xs[0]->d.bd; ++b) CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols(), kSCALAR_ONE, dEdf.batch_ptr(b), dEdf.d.rows(), kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows(), dEdxi.batch_ptr(b), dEdxi.d.rows())); #else From 990b8df2296c4a3c7154cb7330f0c5cc55f4c3f7 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 11 Jan 2016 12:50:47 -0500 Subject: [PATCH 380/965] clearer instructions --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0c4a89170..b49c624f2 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ C++ neural network library #### Important: Eigen version requirement -You need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function. **If you use the release version rather than the development version, you may get assertion failures or compile errors.** +You need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function. **If you use any of the released versions, you may get assertion failures or compile errors.** #### Building @@ -31,7 +31,7 @@ which will train a multilayer perceptron to predict the xor function. #### Building without Eigen installed If you don't have Eigen installed, the instructions below will fetch and compile -both `Eigen` and `cnn`. +both `Eigen` and `cnn`. Eigen does not have to be compiled, so “installing” it is easy. git clone https://github.com/clab/cnn.git hg clone https://bitbucket.org/eigen/eigen/ @@ -42,7 +42,7 @@ both `Eigen` and `cnn`. cmake .. -DEIGEN3_INCLUDE_DIR=../eigen make -j 2 -#### Debugging +#### Debugging build problems If you want to see the compile commands that are used, you can run From baa31b51e67eec219346c69494ae56377a01cec2 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 11 Jan 2016 22:39:02 -0500 Subject: [PATCH 381/965] better support for >2 order tensors --- cnn/expr.cc | 1 + cnn/expr.h | 2 + cnn/model.cc | 4 +- cnn/nodes-common.cc | 26 ++++++++++++ cnn/nodes.cc | 44 +++++++++++++++++-- cnn/nodes.h | 13 ++++++ cnn/tensor.h | 81 ++++++++++++++++++++++++++--------- cnn/training.cc | 100 ++++++++++++++++++++++---------------------- 8 files changed, 195 insertions(+), 76 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index e983088a4..adee88df4 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -34,6 +34,7 @@ Expression operator*(const Expression& x, const Expression& y) { return Expressi Expression operator*(const Expression& x, float y) { return Expression(x.pg, x.pg->add_function({x.i}, y)); } Expression cdiv(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression colwise_add(const Expression& x, const Expression& bias) { return Expression(x.pg, x.pg->add_function({x.i, bias.i})); } +Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z) { return Expression(x.pg, x.pg->add_function({x.i, y.i, z.i})); } Expression contract3d_1d(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b) { return Expression(x.pg, x.pg->add_function({x.i, y.i, b.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 91b1f2429..90e321359 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -48,6 +48,8 @@ Expression cdiv(const Expression& x, const Expression& y); Expression colwise_add(const Expression& x, const Expression& bias); // z_ij = x_ijk * y_k Expression contract3d_1d(const Expression& x, const Expression& y); +// z_ij = x_ijk * y_k * z_j +Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z); // z_ij = x_ijk * y_k + b_ij Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b); diff --git a/cnn/model.cc b/cnn/model.cc index a0645d617..e68c0df30 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -54,7 +54,7 @@ void Parameters::g_squared_l2norm(float* sqnorm) const { #if HAVE_CUDA gpu::l2_norm_reducer(g.d.size(), g.v, sqnorm, true, false); #else - *sqnorm = (*g).squaredNorm(); + *sqnorm = g.vec().squaredNorm(); #endif } @@ -67,7 +67,7 @@ void Parameters::accumulate_grad(const Tensor& d) { #if HAVE_CUDA CUBLAS_CHECK(cublasSaxpy(cublas_handle, g.d.size(), kSCALAR_ONE, d.v, 1, g.v, 1)); #else - *g += *d; + g.vec() += d.vec(); #endif } diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 281b0a432..c8547dfbc 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -171,6 +171,32 @@ Dim InnerProduct3D_1D::dim_forward(const vector& xs) const { return d; } +string InnerProduct3D_1D_1D::as_string(const vector& arg_names) const { + ostringstream s; + s << "dotdot(" << arg_names[0] << "," << arg_names[1] << "," << arg_names[2] << ')'; + if (arg_names.size() == 4) s << " + " << arg_names[3]; + return s.str(); +} + +Dim InnerProduct3D_1D_1D::dim_forward(const vector& xs) const { + if (xs.size() != 3 && xs.size() != 4) + throw std::invalid_argument("Expected three or four arguments in InnerProduct3D_1D"); + if (xs[0].ndims() != 3 || + xs[1].ndims() != 1 || + xs[2].ndims() != 1) { + // TODO fix add check + ostringstream s; s << "Bad input dimensions in InnerProduct3D_1D_1D: " << xs; + throw std::invalid_argument(s.str()); + } + Dim d({xs[0].size(0)}, max(max(xs[0].bd, xs[1].bd), xs[2].bd)); + if(xs.size() == 4) d.bd = max(d.bd, xs[3].bd); + if (xs.size() == 4 && xs[3] != d) { + ostringstream s; s << "Bad input dimensions in InnerProduct3D_1D_1D: " << xs; + throw std::invalid_argument(s.str()); + } + return d; +} + string GaussianNoise::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0] << " + N(0," << stddev << ')'; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 46c63885b..a58a420e6 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -306,13 +306,48 @@ void KMHNGram::backward_impl(const vector& xs, // Y_ij = A_ijk * B_k (+ C_ij) void InnerProduct3D_1D::forward_impl(const vector& xs, Tensor& fx) const { + auto A = xs[0]->t<3>(); + auto b = xs[1]->t<1>(); + typedef Eigen::Tensor::DimensionPair DimPair; + Eigen::array dims({{DimPair(2, 0)}}); + if (xs.size() == 2) { + fx.t<2>() = A.contract(b, dims); + } else { + auto C = xs[2]->t<2>(); + fx.t<2>() = A.contract(b, dims) + C; + } +} + +void InnerProduct3D_1D::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + auto tdEdf = dEdf.t<2>(); // 2 tensor + typedef Eigen::Tensor::DimensionPair DimPair; + if (i == 0) { // 3 tensor + // tensor product + auto b = xs[1]->t<1>(); + dEdxi.t<3>() += tdEdf.contract(b, Eigen::array{{}}); + } else if (i == 1) { + auto A = xs[0]->t<3>(); // A is 3 tensor + Eigen::array dims({{DimPair(0, 0), DimPair(1, 1)}}); + dEdxi.t<1>() += tdEdf.contract(A, dims); + } else if (i == 2) { + dEdxi.t<2>() += tdEdf; + } else { + cerr << "shouldn't happen\n"; abort(); + } +} + +// Y_ij = A_ijk * B_k * C_j (+ D_i) +void InnerProduct3D_1D_1D::forward_impl(const vector& xs, Tensor& fx) const { + abort(); // finish impl auto b = **xs[1]; auto y = *fx; const unsigned i = y.rows(); const unsigned j = y.cols(); const unsigned k = b.rows(); - // the following reshape tensors into order 1 or 2 sizes - // but they point to the same memory Tensor ta({i*j,k}, xs[0]->v); Tensor ty({i*j}, fx.v); auto A = *ta; @@ -328,11 +363,12 @@ void InnerProduct3D_1D::forward_impl(const vector& xs, Tensor& fx } } -void InnerProduct3D_1D::backward_impl(const vector& xs, +void InnerProduct3D_1D_1D::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { + abort(); // finish impl auto b = **xs[1]; auto y = *fx; const unsigned si = y.rows(); @@ -1548,7 +1584,7 @@ void Rectify::forward_impl(const vector& xs, Tensor& fx) const { gpu::vrelu(fx.d.size(), xs[0]->v, fx.v); #else auto x = **xs[0]; - *fx = x.unaryExpr(FRectify()); + *fx = x.cwiseMax(0.f); #endif } diff --git a/cnn/nodes.h b/cnn/nodes.h index 8dea2ec9f..8ccf0e1b1 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -165,6 +165,19 @@ struct InnerProduct3D_1D : public Node { Tensor& dEdxi) const override; }; +// Y_i = A_ijk * B_k * C_j +struct InnerProduct3D_1D_1D : public Node { + InnerProduct3D_1D_1D(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // n_{i,j} ~ N(0,stddev) // y = x + n struct GaussianNoise : public Node { diff --git a/cnn/tensor.h b/cnn/tensor.h index 375d5272d..4ed9fe584 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -19,6 +19,7 @@ //#define EIGEN_NO_MALLOC #include +#include namespace cnn { @@ -30,21 +31,27 @@ struct Tensor { Tensor() = default; Tensor(const Dim& d, float* v) : d(d), v(v) {} // Get the data as a matrix - const Eigen::Map operator*() const { + const Eigen::Map operator*() const { assert(d.batch_elems() == 1); - return Eigen::Map(v, d.rows(), d.cols()); + assert(d.ndims() < 3); + return Eigen::Map(v, d.rows(), d.cols()); } - Eigen::Map operator*() { + Eigen::Map operator*() { assert(d.batch_elems() == 1); - return Eigen::Map(v, d.rows(), d.cols()); + assert(d.ndims() < 3); + return Eigen::Map(v, d.rows(), d.cols()); } // Get the data as a vector - const Eigen::Map vec() const { - return Eigen::Map(v, d.size()); + // this returns the full tensor contents even if it has many dimensions + const Eigen::Map vec() const { + return Eigen::Map(v, d.size()); } - Eigen::Map vec() { - return Eigen::Map(v, d.size()); + Eigen::Map vec() { + return Eigen::Map(v, d.size()); } + // Get view as a Tensor (see specializations below-- this is to work Eigen's and CNNs compile-type vs. run-time differences) + template Eigen::TensorMap> t(); + template const Eigen::TensorMap> t() const; // Get the pointer for a particular batch, automatically broadcasting if the size is zero const float* batch_ptr(unsigned bid) const { assert(d.bd == 1 || bid < d.bd); @@ -55,27 +62,27 @@ struct Tensor { return v + (bid%d.bd)*d.batch_size(); } // Get the matrix for a particular batch, automatically broadcasting if the size is zero - const Eigen::Map batch_matrix(unsigned bid) const { - return Eigen::Map(v + (bid%d.bd)*d.batch_size(), d.rows(), d.cols()); + const Eigen::Map batch_matrix(unsigned bid) const { + return Eigen::Map(v + (bid%d.bd)*d.batch_size(), d.rows(), d.cols()); } - Eigen::Map batch_matrix(unsigned bid) { - return Eigen::Map(v + (bid%d.bd)*d.batch_size(), d.rows(), d.cols()); + Eigen::Map batch_matrix(unsigned bid) { + return Eigen::Map(v + (bid%d.bd)*d.batch_size(), d.rows(), d.cols()); } // Get the data as a matrix, where each "row" is the concatenation of rows and columns, // and each "column" is batches - const Eigen::Map rowcol_matrix() const { - return Eigen::Map(v, d.rows()*d.cols(), d.batch_elems()); + const Eigen::Map rowcol_matrix() const { + return Eigen::Map(v, d.rows()*d.cols(), d.batch_elems()); } - Eigen::Map rowcol_matrix() { - return Eigen::Map(v, d.rows()*d.cols(), d.batch_elems()); + Eigen::Map rowcol_matrix() { + return Eigen::Map(v, d.rows()*d.cols(), d.batch_elems()); } // Get the data as a matrix, where each "row" is the concatenation of rows, // and each "column" is the concatenation of columns and batches - const Eigen::Map colbatch_matrix() const { - return Eigen::Map(v, d.rows(), d.cols()*d.batch_elems()); + const Eigen::Map colbatch_matrix() const { + return Eigen::Map(v, d.rows(), d.cols()*d.batch_elems()); } - Eigen::Map colbatch_matrix() { - return Eigen::Map(v, d.rows(), d.cols()*d.batch_elems()); + Eigen::Map colbatch_matrix() { + return Eigen::Map(v, d.rows(), d.cols()*d.batch_elems()); } // this is very slow: use sparingly inline bool is_valid() const { @@ -156,6 +163,40 @@ struct Tensor { BOOST_SERIALIZATION_SPLIT_MEMBER() }; +template<> inline Eigen::TensorMap> Tensor::t<1>() { + assert(d.ndims() == 1); + return Eigen::TensorMap>(v, (int)d[0]); +} +template<> inline const Eigen::TensorMap> Tensor::t<1>() const { + assert(d.ndims() == 1); + return Eigen::TensorMap>(v, (int)d[0]); +} +template<> inline Eigen::TensorMap> Tensor::t<2>() { + assert(d.ndims() == 2); + return Eigen::TensorMap>(v, (int)d[0], (int)d[1]); +} +template<> inline const Eigen::TensorMap> Tensor::t<2>() const { + assert(d.ndims() == 2); + return Eigen::TensorMap>(v, (int)d[0], (int)d[1]); +} +template<> inline Eigen::TensorMap> Tensor::t<3>() { + assert(d.ndims() == 3); + return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2]); +} +template<> inline const Eigen::TensorMap> Tensor::t<3>() const { + assert(d.ndims() == 3); + return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2]); +} +template<> inline Eigen::TensorMap> Tensor::t<4>() { + assert(d.ndims() == 4); + return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3]); +} +template<> inline const Eigen::TensorMap> Tensor::t<4>() const { + assert(d.ndims() == 4); + return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3]); +} +// ... + std::ostream& operator<<(std::ostream& os, const Tensor& t); real as_scalar(const Tensor& t); std::vector as_vector(const Tensor& v); diff --git a/cnn/training.cc b/cnn/training.cc index d2ff59dff..af37e1e93 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -39,8 +39,8 @@ void SimpleSGDTrainer::update(const std::vector &lookup_param #if HAVE_CUDA gpu::sgd_update(p->values.d.size(), p->g.v, p->values.v, eta * scale * gscale, lambda); #else - auto reg = (*p->values) * lambda; - *p->values -= ((eta * scale * gscale) * *p->g + reg); + auto reg = (p->values.vec()) * lambda; + p->values.vec() -= ((eta * scale * gscale) * p->g.vec() + reg); #endif p->clear(); } @@ -49,8 +49,8 @@ void SimpleSGDTrainer::update(const std::vector &lookup_param #if HAVE_CUDA gpu::sgd_update(p->values[i].d.size(), p->grads[i].v, p->values[i].v, eta * scale * gscale, lambda); #else - auto reg = (*p->values[i]) * lambda; - *p->values[i] -= (*p->grads[i] * (eta * scale * gscale) + reg); + auto reg = (p->values[i].vec()) * lambda; + p->values[i].vec() -= (p->grads[i].vec() * (eta * scale * gscale) + reg); #endif } p->clear(); @@ -71,9 +71,9 @@ void MomentumSGDTrainer::update(real scale) { unsigned pi = 0; for (auto p : model->parameters_list()) { Tensor& v = vp[pi++].h; - auto reg = *p->values * lambda; - (*v) = momentum * (*v) - (eta * scale * gscale) * (*p->g); - *p->values += *v - reg; + auto reg = p->values.vec() * lambda; + v.vec() = momentum * v.vec() - (eta * scale * gscale) * (p->g.vec()); + p->values.vec() += v.vec() - reg; p->clear(); } pi = 0; @@ -81,9 +81,9 @@ void MomentumSGDTrainer::update(real scale) { vector& vx = vlp[pi++].h; for (auto i : p->non_zero_grads) { Tensor& v = vx[i]; - auto reg = (*p->values[i]) * lambda; - (*v) = momentum * (*v) - (eta * scale * gscale) * (*p->grads[i]); - *p->values[i] += *v - reg; + auto reg = (p->values[i].vec()) * lambda; + v.vec() = momentum * v.vec() - (eta * scale * gscale) * (p->grads[i].vec()); + p->values[i].vec() += v.vec() - reg; } p->clear(); } @@ -102,12 +102,12 @@ void AdagradTrainer::update(real scale) { const float gscale = clip_gradients(); for (auto p : model->parameters_list()) { Tensor& v = vp[pi++].h; - auto reg = (*p->values) * lambda; - auto g = scale * gscale * (*p->g); + auto reg = p->values.vec() * lambda; + auto g = scale * gscale * p->g.vec(); auto g2 = g.cwiseProduct(g); - (*v) += g2; - auto delta = -eta * g.cwiseQuotient(((*v).array() + epsilon).matrix().cwiseSqrt()); - *p->values += delta - reg; + v.vec() += g2; + auto delta = -eta * g.cwiseQuotient((v.vec().array() + epsilon).matrix().cwiseSqrt()); + p->values.vec() += delta - reg; p->clear(); } @@ -116,12 +116,12 @@ void AdagradTrainer::update(real scale) { vector& vx = vlp[pi++].h; for (auto i : p->non_zero_grads) { Tensor& v = vx[i]; - auto reg = (*p->values[i]) * lambda; - auto g = scale * gscale * (*p->grads[i]); + auto reg = p->values[i].vec() * lambda; + auto g = scale * gscale * p->grads[i].vec(); auto g2 = g.cwiseProduct(g); - (*v) += g2; - auto delta = -eta * g.cwiseQuotient(((*v).array() + epsilon).matrix().cwiseSqrt()); - *p->values[i] += delta - reg; + v.vec() += g2; + auto delta = -eta * g.cwiseQuotient((v.vec().array() + epsilon).matrix().cwiseSqrt()); + p->values[i].vec() += delta - reg; } p->clear(); } @@ -161,18 +161,18 @@ void AdadeltaTrainer::update(real scale) { const float gscale = clip_gradients(); pi = 0; for (auto p : model->parameters_list()) { - auto& g = (scale * gscale) * *p->g; + auto& g = (scale * gscale) * p->g.vec(); Tensor& hgv = hg[pi].h; Tensor& hdv = hd[pi].h; - auto reg = (*p->values) * lambda; + auto reg = p->values.vec() * lambda; auto g2 = g.cwiseProduct(g); - *hgv = rho * *hgv + (1.0 - rho) * g2; - auto num = -g.cwiseProduct(((*hdv).array() + epsilon).matrix().cwiseSqrt()); - auto den = ((*hgv).array() + epsilon).matrix().cwiseSqrt(); + hgv.vec() = rho * hgv.vec() + (1.0 - rho) * g2; + auto num = -g.cwiseProduct((hdv.vec().array() + epsilon).matrix().cwiseSqrt()); + auto den = (hgv.vec().array() + epsilon).matrix().cwiseSqrt(); auto delta = num.cwiseQuotient(den); auto d2 = delta.cwiseProduct(delta); - *hdv = rho * *hdv + (1.0 - rho) * d2; - *p->values += delta - reg; + hdv.vec() = rho * hdv.vec() + (1.0 - rho) * d2; + p->values.vec() += delta - reg; p->clear(); pi++; } @@ -184,16 +184,16 @@ void AdadeltaTrainer::update(real scale) { for (auto i : p->non_zero_grads) { Tensor& hgv = hgvx[i]; Tensor& hdv = hdvx[i]; - auto& g = scale * gscale * *p->grads[i]; - auto reg = (*p->values[i]) * lambda; + auto& g = scale * gscale * p->grads[i].vec(); + auto reg = p->values[i].vec() * lambda; auto g2 = g.cwiseProduct(g); - *hgv = rho * *hgv + (1.0 - rho) * g2; - auto num = -g.cwiseProduct(((*hdv).array() + epsilon).matrix().cwiseSqrt()); - auto den = ((*hgv).array() + epsilon).matrix().cwiseSqrt(); + hgv.vec() = rho * hgv.vec() + (1.0 - rho) * g2; + auto num = -g.cwiseProduct((hdv.vec().array() + epsilon).matrix().cwiseSqrt()); + auto den = (hgv.vec().array() + epsilon).matrix().cwiseSqrt(); auto delta = num.cwiseQuotient(den); auto d2 = delta.cwiseProduct(delta); - *hdv = rho * *hdv + (1.0 - rho) * d2; - *p->values[i] += delta - reg; + hdv.vec() = rho * hdv.vec() + (1.0 - rho) * d2; + p->values[i].vec() += delta - reg; } p->clear(); pi++; @@ -219,10 +219,10 @@ void RmsPropTrainer::update(real scale) { pi = 0; for (auto p : model->parameters_list()) { real& d2 = hg[pi++]; - auto reg = (*p->values) * lambda; - real g2 = (*p->g).squaredNorm(); + auto reg = p->values.vec() * lambda; + real g2 = p->g.vec().squaredNorm(); d2 = rho * d2 + (1.0 - rho) * g2; - *p->values -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * *p->g + reg); + p->values.vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->g.vec() + reg); p->clear(); } @@ -231,10 +231,10 @@ void RmsPropTrainer::update(real scale) { vector& hlgx = hlg[pi++]; for (auto i : p->non_zero_grads) { real& d2 = hlgx[i]; - auto reg = (*p->values[i]) * lambda; - real g2 = (*p->grads[i]).squaredNorm(); + auto reg = p->values[i].vec() * lambda; + real g2 = p->grads[i].vec().squaredNorm(); d2 = rho * d2 + (1.0 - rho) * g2; - *p->values[i] -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * *p->grads[i] + reg); + p->values[i].vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->grads[i].vec() + reg); } p->clear(); } @@ -256,10 +256,10 @@ void AdamTrainer::update(real scale) { static unsigned t = 0; for (auto p : model->parameters_list()) { ++t; - auto g_t = (scale * gscale) * *p->g; - auto m_t = *m[pi].h; - auto v_t = *v[pi].h; - auto reg = (*p->values) * lambda; + auto g_t = (scale * gscale) * p->g.vec(); + auto m_t = m[pi].h.vec(); + auto v_t = v[pi].h.vec(); + auto reg = p->values.vec() * lambda; m_t = beta_1 * m_t + (1 - beta_1) * g_t; auto g2 = g_t.cwiseProduct(g_t); v_t = beta_2 * v_t + (1 - beta_2) * g2; @@ -268,7 +268,7 @@ void AdamTrainer::update(real scale) { auto mhat = m_t / s1; auto vhat = v_t / s2; auto delta = (-eta * mhat).cwiseQuotient((vhat.array().sqrt() + eps).matrix()); - *p->values += delta - reg; + p->values.vec() += delta - reg; p->clear(); pi++; } @@ -278,11 +278,11 @@ void AdamTrainer::update(real scale) { vector& vm = lm[pi].h; vector& vv = lv[pi].h; for (auto i : p->non_zero_grads) { - auto m_t = *vm[i]; - auto v_t = *vv[i]; - auto g_t = scale * gscale * *p->grads[i]; + auto m_t = vm[i].vec(); + auto v_t = vv[i].vec(); + auto g_t = scale * gscale * p->grads[i].vec(); auto g2 = g_t.cwiseProduct(g_t); - auto reg = (*p->values[i]) * lambda; + auto reg = p->values[i].vec() * lambda; m_t = beta_1 * m_t + (1 - beta_1) * g_t; v_t = beta_2 * v_t + (1 - beta_2) * g2; float s1 = 1 - pow(beta_1, t); @@ -290,7 +290,7 @@ void AdamTrainer::update(real scale) { auto mhat = m_t / s1; auto vhat = v_t / s2; auto delta = (-eta * mhat).cwiseQuotient((vhat.array().sqrt() + eps).matrix()); - *p->values[i] += delta - reg; + p->values[i].vec() += delta - reg; } p->clear(); pi++; From 16e017b9bf14875bac65bff07274690df2fe17f2 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 11 Jan 2016 23:48:54 -0500 Subject: [PATCH 382/965] fix for incorrect error message in gradient check --- cnn/grad-check.cc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc index a2c26a9e9..4f4cc8ec9 100644 --- a/cnn/grad-check.cc +++ b/cnn/grad-check.cc @@ -83,10 +83,12 @@ bool CheckGrad(Model& m, ComputationGraph& g, int verbosity) { } } - if (flag && verbosity > 1) { - cerr << endl << "*** GRADIENT CHECK FAILED ***" << endl; - } else if(verbosity > 0) { - cerr << endl << "GRADIENT CHECK PASSED" << endl; + if (flag) { + if (verbosity > 1) + cerr << endl << "*** GRADIENT CHECK FAILED ***" << endl; + } else { + if (verbosity > 0) + cerr << endl << "GRADIENT CHECK PASSED" << endl; } return !flag; } From 412257debd88ffb92ee2b6cc678e837b142597f7 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 11 Jan 2016 23:49:27 -0500 Subject: [PATCH 383/965] support for 3d * 1d * 1d as a single operation. which is slow in the current version of Eigen --- cnn/expr.cc | 1 + cnn/expr.h | 3 ++- cnn/nodes.cc | 63 ++++++++++++++++++++++++++-------------------------- 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index adee88df4..635635d70 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -35,6 +35,7 @@ Expression operator*(const Expression& x, float y) { return Expression(x.pg, x.p Expression cdiv(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression colwise_add(const Expression& x, const Expression& bias) { return Expression(x.pg, x.pg->add_function({x.i, bias.i})); } Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z) { return Expression(x.pg, x.pg->add_function({x.i, y.i, z.i})); } +Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z, const Expression& b) { return Expression(x.pg, x.pg->add_function({x.i, y.i, z.i, b.i})); } Expression contract3d_1d(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b) { return Expression(x.pg, x.pg->add_function({x.i, y.i, b.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 90e321359..00f1d8d9e 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -48,8 +48,9 @@ Expression cdiv(const Expression& x, const Expression& y); Expression colwise_add(const Expression& x, const Expression& bias); // z_ij = x_ijk * y_k Expression contract3d_1d(const Expression& x, const Expression& y); -// z_ij = x_ijk * y_k * z_j +// z_i = x_ijk * y_k * z_j (+ b_i) Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z); +Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z, const Expression& b); // z_ij = x_ijk * y_k + b_ij Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index a58a420e6..79c1af139 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -342,24 +342,17 @@ void InnerProduct3D_1D::backward_impl(const vector& xs, // Y_ij = A_ijk * B_k * C_j (+ D_i) void InnerProduct3D_1D_1D::forward_impl(const vector& xs, Tensor& fx) const { - abort(); // finish impl - auto b = **xs[1]; - auto y = *fx; - const unsigned i = y.rows(); - const unsigned j = y.cols(); - const unsigned k = b.rows(); - Tensor ta({i*j,k}, xs[0]->v); - Tensor ty({i*j}, fx.v); - auto A = *ta; + auto A = xs[0]->t<3>(); + auto b = xs[1]->t<1>(); + auto c = xs[2]->t<1>(); + typedef Eigen::Tensor::DimensionPair DimPair; + Eigen::array dims({{DimPair(2, 0)}}); + Eigen::array dims2({{DimPair(1, 0)}}); if (xs.size() == 3) { - Tensor tc({i*j}, xs[2]->v); - auto c = *tc; - // want to do A * b + c, but it triggers memory allocation - (*ty) = c; - (*ty).noalias() += A * b; + fx.t<1>() = A.contract(b, dims).contract(c, dims2); } else { - assert(xs.size() == 2); - (*ty).noalias() = A * b; + auto d = xs[3]->t<1>(); + fx.t<1>() = A.contract(b, dims).contract(c, dims2) + d; } } @@ -368,21 +361,29 @@ void InnerProduct3D_1D_1D::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - abort(); // finish impl - auto b = **xs[1]; - auto y = *fx; - const unsigned si = y.rows(); - const unsigned sj = y.cols(); - const unsigned sk = b.rows(); - Tensor tdEdf({si*sj}, dEdf.v); - if (i == 0) { // 3-tensor - Tensor tdEdxi({si*sj, sk}, dEdxi.v); - (*tdEdxi).noalias() += *tdEdf * (**xs[1]).transpose(); - } else if (i == 1) { // vector - Tensor ta({si*sj,sk}, xs[0]->v); - (*dEdxi).noalias() += (*ta).transpose() * *tdEdf; - } else { // matrix bias - *dEdxi += *dEdf; + auto tdEdf = dEdf.t<1>(); // vector + typedef Eigen::Tensor::DimensionPair DimPair; + if (i == 0) { // 3 tensor + // tensor product + auto b = xs[1]->t<1>(); + auto c = xs[2]->t<1>(); + dEdxi.t<3>() += tdEdf.contract(c, Eigen::array{{}}).contract(b, Eigen::array{{}}); + } else if (i == 1) { // vector 1 + Eigen::array dims({{DimPair(1, 0)}}); + Eigen::array dims2({{DimPair(0, 0)}}); + auto A = xs[0]->t<3>(); + auto c = xs[2]->t<1>(); + dEdxi.t<1>() += A.contract(c, dims).contract(tdEdf, dims2); + } else if (i == 2) { // vector 2 + Eigen::array dims({{DimPair(2, 0)}}); + Eigen::array dims2({{DimPair(0, 0)}}); + auto A = xs[0]->t<3>(); + auto b = xs[1]->t<1>(); + dEdxi.t<1>() += A.contract(b, dims).contract(tdEdf, dims2); + } else if (i == 3) { // vector bias + dEdxi.t<1>() += tdEdf; + } else { + cerr << "shouldn't happen\n"; abort(); } } From bfaa61f89231614804b356fb5f0c9e88e465f521 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 11 Jan 2016 23:59:24 -0500 Subject: [PATCH 384/965] add comment about possible caching optimization --- cnn/nodes.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 79c1af139..afb696c6f 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -369,6 +369,10 @@ void InnerProduct3D_1D_1D::backward_impl(const vector& xs, auto c = xs[2]->t<1>(); dEdxi.t<3>() += tdEdf.contract(c, Eigen::array{{}}).contract(b, Eigen::array{{}}); } else if (i == 1) { // vector 1 + // TODO these should be reorganized so the contraction is first with tdEdf and then with c or b. + // in theory, that intermediate result could be cached (although CNN doesn't support this). the fact that it + // this part of the product is redone when i=1 and again when i=2 is probably why this is slower + // (or maybe it's the contract implementation?) Eigen::array dims({{DimPair(1, 0)}}); Eigen::array dims2({{DimPair(0, 0)}}); auto A = xs[0]->t<3>(); From 51db93a9c893b042103e7172f309a293791506d5 Mon Sep 17 00:00:00 2001 From: Lingpeng Kong Date: Tue, 12 Jan 2016 17:09:39 -0800 Subject: [PATCH 385/965] test only, output tag name --- examples/segrnn-sup.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index ef6a18225..72f5a2114 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -848,11 +848,11 @@ void test_only(SegmentalRNN& segrnn, unsigned int i; for(i = 0; i < yz_pred.size()-1; ++i){ auto pred = yz_pred[i]; - cout << pred.first << ":" << pred.second << " "; + cout << segrnn.td.Convert(pred.first) << ":" << pred.second << " "; } if(i >= 0 && (i == yz_pred.size()-1)){ auto pred = yz_pred[i]; - cout << pred.first << ":" << pred.second; + cout << segrnn.td.Convert(pred.first) << ":" << pred.second; } cout << endl; } From 1b66c69d5b6847d86b806f9ea5e008bd1a1e552b Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 17 Jan 2016 19:16:43 -0500 Subject: [PATCH 386/965] select_rows and select_cols --- cnn/expr.cc | 22 +++++++++++------ cnn/expr.h | 7 ++++++ cnn/nodes-common.cc | 31 +++++++++++++++++++++++ cnn/nodes.cc | 60 +++++++++++++++++++++++++++++++++++++++++++++ cnn/nodes.h | 34 +++++++++++++++++++++++++ 5 files changed, 146 insertions(+), 8 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index 635635d70..a3c06c9c8 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -7,20 +7,22 @@ namespace cnn { namespace expr { +using std::vector; + Expression input(ComputationGraph& g, real s) { return Expression(&g, g.add_input(s)); } Expression input(ComputationGraph& g, const real *ps) { return Expression(&g, g.add_input(ps)); } -Expression input(ComputationGraph& g, const Dim& d, const std::vector& data) { return Expression(&g, g.add_input(d, data)); } -Expression input(ComputationGraph& g, const Dim& d, const std::vector* pdata) { return Expression(&g, g.add_input(d, pdata)); } +Expression input(ComputationGraph& g, const Dim& d, const vector& data) { return Expression(&g, g.add_input(d, data)); } +Expression input(ComputationGraph& g, const Dim& d, const vector* pdata) { return Expression(&g, g.add_input(d, pdata)); } Expression const_parameter(ComputationGraph& g, Parameters* p) { return Expression(&g, g.add_const_parameters(p)); } Expression parameter(ComputationGraph& g, Parameters* p) { return Expression(&g, g.add_parameters(p)); } Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index) { return Expression(&g, g.add_lookup(p, index)); } Expression lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex) { return Expression(&g, g.add_lookup(p, pindex)); } -Expression lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices) { return Expression(&g, g.add_lookup(p, indices)); } -Expression lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices) { return Expression(&g, g.add_lookup(p, pindices)); } +Expression lookup(ComputationGraph& g, LookupParameters* p, const vector& indices) { return Expression(&g, g.add_lookup(p, indices)); } +Expression lookup(ComputationGraph& g, LookupParameters* p, const vector* pindices) { return Expression(&g, g.add_lookup(p, pindices)); } Expression const_lookup(ComputationGraph& g, LookupParameters* p, unsigned index) { return Expression(&g, g.add_const_lookup(p, index)); } Expression const_lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex) { return Expression(&g, g.add_const_lookup(p, pindex)); } -Expression const_lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices) { return Expression(&g, g.add_const_lookup(p, indices)); } -Expression const_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices) { return Expression(&g, g.add_const_lookup(p, pindices)); } +Expression const_lookup(ComputationGraph& g, LookupParameters* p, const vector& indices) { return Expression(&g, g.add_const_lookup(p, indices)); } +Expression const_lookup(ComputationGraph& g, LookupParameters* p, const vector* pindices) { return Expression(&g, g.add_const_lookup(p, pindices)); } Expression zeroes(ComputationGraph& g, const Dim& d) { return Expression(&g, g.add_function(d)); } Expression operator-(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } @@ -52,7 +54,7 @@ Expression rectify(const Expression& x) { return Expression(x.pg, x.pg->add_func Expression hinge(const Expression& x, unsigned index, float m) { return Expression(x.pg, x.pg->add_function({x.i}, index, m)); } Expression hinge(const Expression& x, const unsigned* pindex, float m) { return Expression(x.pg, x.pg->add_function({x.i}, pindex, m)); } Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } -Expression log_softmax(const Expression& x, const std::vector& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } +Expression log_softmax(const Expression& x, const vector& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } Expression softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression softsign(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression pow(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } @@ -64,6 +66,10 @@ Expression block_dropout(const Expression& x, real p) { return Expression(x.pg, Expression reshape(const Expression& x, const Dim& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } Expression transpose(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression select_rows(const Expression& x, const vector& rows) { return Expression(x.pg, x.pg->add_function({x.i}, rows)); } +Expression select_rows(const Expression& x, const vector* prows) { return Expression(x.pg, x.pg->add_function({x.i}, prows)); } +Expression select_cols(const Expression& x, const vector& cols) { return Expression(x.pg, x.pg->add_function({x.i}, cols)); } +Expression select_cols(const Expression& x, const vector* pcols) { return Expression(x.pg, x.pg->add_function({x.i}, pcols)); } Expression trace_of_product(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} @@ -87,7 +93,7 @@ Expression pick(const Expression& x, unsigned* pv) { return Expression(x.pg, x.p Expression pickrange(const Expression& x, unsigned v, unsigned u) { return Expression(x.pg, x.pg->add_function({x.i}, v, u)); } Expression pickneglogsoftmax(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } -Expression pickneglogsoftmax(const Expression& x, const std::vector & v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } +Expression pickneglogsoftmax(const Expression& x, const vector & v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } Expression sum_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 00f1d8d9e..2072553cf 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -77,8 +77,15 @@ Expression noise(const Expression& x, real stddev); Expression dropout(const Expression& x, real p); Expression block_dropout(const Expression& x, real p); +// reshape::forward is O(1), but backward is O(n) Expression reshape(const Expression& x, const Dim& d); +// transpose requires O(n) Expression transpose(const Expression& x); +Expression select_rows(const Expression& x, const std::vector& rows); +Expression select_rows(const Expression& x, const std::vector* prows); +// select_cols is more efficient than select_rows since Eigen uses column-major order +Expression select_cols(const Expression& x, const std::vector& cols); +Expression select_cols(const Expression& x, const std::vector* pcols); Expression trace_of_product(const Expression& x, const Expression& y); Expression cwise_multiply(const Expression& x, const Expression& y); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index c8547dfbc..ba378341f 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -17,6 +17,37 @@ inline bool LooksLikeVector(const Dim& d) { return true; } +string SelectRows::as_string(const vector& arg_names) const { + ostringstream s; + s << "select_rows(" << arg_names[0] << ", {rsize=" << prows->size() << "})"; + return s.str(); +} + +Dim SelectRows::dim_forward(const vector& xs) const { + if (xs.size() != 1 || xs[0].ndims() > 2) { + cerr << "Bad arguments in SelectRows: " << xs << endl; + throw std::invalid_argument("invalid arguments to SelectRows"); + } + unsigned nrows = prows->size(); + if (xs[0].ndims() == 1) return Dim({nrows}); + return Dim({nrows, xs[0].cols()}); +} + +string SelectCols::as_string(const vector& arg_names) const { + ostringstream s; + s << "select_cols(" << arg_names[0] << ", {csize=" << pcols->size() << "})"; + return s.str(); +} + +Dim SelectCols::dim_forward(const vector& xs) const { + if (xs.size() != 1 || xs[0].ndims() != 2) { + cerr << "Bad arguments in SelectCols: " << xs << endl; + throw std::invalid_argument("invalid arguments to SelectCols"); + } + unsigned ncols = pcols->size(); + return Dim({xs[0].rows(), ncols}); +} + string Min::as_string(const vector& arg_names) const { ostringstream s; s << "min{" << arg_names[0] << ", " << arg_names[1] << "}"; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index afb696c6f..9461e35b5 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -35,6 +35,66 @@ using namespace std; namespace cnn { +void SelectRows::forward_impl(const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); +#ifdef HAVE_CUDA + throw std::runtime_error("SelectRows not yet implemented for CUDA"); +#else + auto x = **xs[0]; + auto y = *fx; + auto& rm = *prows; + for (unsigned i = 0; i < rm.size(); ++i) + y.row(i) = x.row(rm[i]); +#endif +} + +void SelectRows::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(xs.size() == 1); +#ifdef HAVE_CUDA + throw std::runtime_error("SelectRows not yet implemented for CUDA"); +#else + auto dEdx = *dEdxi; + auto d = *dEdf; + auto& rm = *prows; + for (unsigned i = 0; i < rm.size(); ++i) + dEdx.row(rm[i]) += d.row(i); +#endif +} + +void SelectCols::forward_impl(const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); +#ifdef HAVE_CUDA + throw std::runtime_error("SelectCols not yet implemented for CUDA"); +#else + auto x = **xs[0]; + auto y = *fx; + auto& cm = *pcols; + for (unsigned i = 0; i < cm.size(); ++i) + y.col(i) = x.col(cm[i]); +#endif +} + +void SelectCols::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(xs.size() == 1); +#ifdef HAVE_CUDA + throw std::runtime_error("SelectCols not yet implemented for CUDA"); +#else + auto dEdx = *dEdxi; + auto d = *dEdf; + auto& cm = *pcols; + for (unsigned i = 0; i < cm.size(); ++i) + dEdx.col(cm[i]) += d.col(i); +#endif +} + void Pow::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); #ifdef HAVE_CUDA diff --git a/cnn/nodes.h b/cnn/nodes.h index 8ccf0e1b1..2fe7030da 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -5,6 +5,40 @@ namespace cnn { +// y = select_rows(x, rows) +// x = a matrix +struct SelectRows : public Node { + explicit SelectRows(const std::initializer_list& a, const std::vector& r) : Node(a), rows(r), prows(&rows) {} + explicit SelectRows(const std::initializer_list& a, const std::vector* pr) : Node(a), prows(pr) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; + std::vector rows; + const std::vector* prows; +}; + +// y = select_cols(x, cols) +// x = a matrix +struct SelectCols : public Node { + explicit SelectCols(const std::initializer_list& a, const std::vector& c) : Node(a), cols(c), pcols(&cols) {} + explicit SelectCols(const std::initializer_list& a, const std::vector* pc) : Node(a), pcols(pc) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; + std::vector cols; + const std::vector* pcols; +}; + // y = pow(x_1, x_2) // x_2 raise every element in x_1 to the power of scalar x_2 struct Pow : public Node { From 06124a6bdfcc677aea9f4b0c6783a768018e6ecf Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 18 Jan 2016 15:53:11 -0500 Subject: [PATCH 387/965] example of RNN that conditions on the set of words in the sentence --- examples/rnnlm-givenbag.cc | 253 +++++++++++++++++++++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 examples/rnnlm-givenbag.cc diff --git a/examples/rnnlm-givenbag.cc b/examples/rnnlm-givenbag.cc new file mode 100644 index 000000000..6e18310a4 --- /dev/null +++ b/examples/rnnlm-givenbag.cc @@ -0,0 +1,253 @@ +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/timing.h" +#include "cnn/rnn.h" +#include "cnn/gru.h" +#include "cnn/lstm.h" +#include "cnn/dict.h" +# include "cnn/expr.h" +#include "cnn/grad-check.h" + +#include +#include +#include + +#include +#include + +using namespace std; +using namespace cnn; + +unsigned LAYERS = 2; +unsigned INPUT_DIM = 8; //256 +unsigned HIDDEN_DIM = 24; // 1024 +unsigned VOCAB_SIZE = 0; + +cnn::Dict d; +int kSOS; +int kEOS; + +template +struct RNNLanguageModel { + LookupParameters* p_c; + Parameters* p_R; + Parameters* p_bias; + Builder builder; + explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({VOCAB_SIZE}); + } + + // return Expression of total loss + Expression BuildLMGraph(const vector& sent, ComputationGraph& cg, const vector* prows) { + const unsigned slen = sent.size() - 1; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter + i_R = select_rows(i_R, prows); // FILTER rows for bag (prows) + Expression i_bias = parameter(cg, p_bias); // word bias + i_bias = select_rows(i_bias, prows); // FILTER rows for bag + vector errs; + for (unsigned t = 0; t < slen; ++t) { + // lookup uses prows since sent[t] is the mapped row + Expression i_x_t = lookup(cg, p_c, (*prows)[sent[t]]); + // y_t = RNN(x_t) + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + + Expression lsm = log_softmax(i_r_t); + Expression err = -pick(lsm, sent[t+1]); + errs.push_back(err); + } + Expression i_nerr = sum(errs); + return i_nerr; + } + + // return Expression for total loss + void RandomSample(int max_len = 150) { + cerr << endl; + ComputationGraph cg; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + + Expression i_R = parameter(cg, p_R); + Expression i_bias = parameter(cg, p_bias); + vector errs; + int len = 0; + int cur = kSOS; + while(len < max_len && cur != kEOS) { + ++len; + Expression i_x_t = lookup(cg, p_c, cur); + // y_t = RNN(x_t) + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + + Expression ydist = softmax(i_r_t); + + unsigned w = 0; + while (w == 0 || (int)w == kSOS) { + auto dist = as_vector(cg.incremental_forward()); + double p = rand01(); + for (; w < dist.size(); ++w) { + p -= dist[w]; + if (p < 0.0) { break; } + } + if (w == dist.size()) w = kEOS; + } + cerr << (len == 1 ? "" : " ") << d.Convert(w); + cur = w; + } + cerr << endl; + } +}; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.Convert(""); + kEOS = d.Convert(""); + vector> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + training.push_back(ReadSentence(line, &d)); + ttoks += training.back().size(); + if (training.back().front() != kSOS && training.back().back() != kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + d.Freeze(); // no new word types allowed + VOCAB_SIZE = d.size(); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + ++dlc; + dev.push_back(ReadSentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() != kSOS && dev.back().back() != kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + ostringstream os; + os << "lm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + bool use_momentum = false; + Trainer* sgd = nullptr; + //if (use_momentum) + //else + //sgd = new SimpleSGDTrainer(&model); + sgd = new MomentumSGDTrainer(&model); + RNNLanguageModel lm(model); + //RNNLanguageModel lm(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 500; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + vector rows; + vector w2sl(VOCAB_SIZE, 0); + vector rmsent; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& sent = training[order[si]]; + int oi = 0; + int idx = 0; + rmsent.resize(sent.size()); + rows.resize(sent.size()); + for (auto w : sent) { + auto& rmw = w2sl[w]; + if (rmw == 0) { rows[idx] = w; rmw = idx; idx++; } + rmsent[oi] = rmw; + oi++; + } + rows.resize(idx); // in case of duplicates + chars += sent.size() - 1; + ++si; + lm.BuildLMGraph(rmsent, cg, &rows); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd->update(); + for (auto w : sent) { w2sl[w] = 0; } + ++lines; + } + sgd->status(); + cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; +#if 0 + lm.RandomSample(); + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + int dchars = 0; + for (auto& sent : dev) { + ComputationGraph cg; + lm.BuildLMGraph(sent, cg); + dloss += as_scalar(cg.forward()); + dchars += sent.size() - 1; + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } +#endif + } + delete sgd; +} + From 8d8b08d6ed55d1609edd31e05c825edb0259bd85 Mon Sep 17 00:00:00 2001 From: armatthews Date: Thu, 21 Jan 2016 17:20:53 -0500 Subject: [PATCH 388/965] Added hierarchical softmax builder, and abstractified the FactoredSoftmaxBuilder as an interface --- cnn/CMakeLists.txt | 2 + cnn/cfsm-builder.cc | 36 +++++- cnn/cfsm-builder.h | 37 ++++-- cnn/hsm-builder.cc | 289 ++++++++++++++++++++++++++++++++++++++++++++ cnn/hsm-builder.h | 82 +++++++++++++ rnnlm/lm.cc | 8 +- 6 files changed, 442 insertions(+), 12 deletions(-) create mode 100644 cnn/hsm-builder.cc create mode 100644 cnn/hsm-builder.h diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 290fd9cf8..2eb708bbc 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -13,6 +13,7 @@ set(cnn_library_SRCS grad-check.cc graph.cc gru.cc + hsm-builder.cc init.cc lstm.cc model.cc @@ -46,6 +47,7 @@ set(cnn_library_HDRS gpu-ops.h graph.h gru.h + hsm-builder.h init.h lstm.h model.h diff --git a/cnn/cfsm-builder.cc b/cnn/cfsm-builder.cc index 191dfec78..608bb6ccd 100644 --- a/cnn/cfsm-builder.cc +++ b/cnn/cfsm-builder.cc @@ -9,6 +9,39 @@ namespace cnn { using namespace expr; +inline bool is_ws(char x) { return (x == ' ' || x == '\t'); } +inline bool not_ws(char x) { return (x != ' ' && x != '\t'); } + +NonFactoredSoftmaxBuilder::NonFactoredSoftmaxBuilder(unsigned rep_dim, unsigned vocab_size, Model* model) { + p_w = model->add_parameters({vocab_size, rep_dim}); + p_b = model->add_parameters({vocab_size}); +} + +void NonFactoredSoftmaxBuilder::new_graph(ComputationGraph& cg) { + pcg = &cg; + w = parameter(cg, p_w); + b = parameter(cg, p_b); +} + +Expression NonFactoredSoftmaxBuilder::neg_log_softmax(const Expression& rep, unsigned wordidx) { + return pickneglogsoftmax(affine_transform({b, w, rep}), wordidx); +} + +unsigned NonFactoredSoftmaxBuilder::sample(const expr::Expression& rep) { + softmax(affine_transform({b, w, rep})); + vector dist = as_vector(pcg->incremental_forward()); + unsigned c = 0; + double p = rand01(); + for (; c < dist.size(); ++c) { + p -= dist[c]; + if (p < 0.0) { break; } + } + if (c == dist.size()) { + --c; + } + return c; +} + ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, Dict* word_dict, @@ -88,9 +121,6 @@ unsigned ClassFactoredSoftmaxBuilder::sample(const expr::Expression& rep) { return cidx2words[c][w]; } -inline bool is_ws(char x) { return (x == ' ' || x == '\t'); } -inline bool not_ws(char x) { return (x != ' ' && x != '\t'); } - void ClassFactoredSoftmaxBuilder::ReadClusterFile(const std::string& cluster_file, Dict* word_dict) { cerr << "Reading clusters from " << cluster_file << " ...\n"; ifstream in(cluster_file); diff --git a/cnn/cfsm-builder.h b/cnn/cfsm-builder.h index 55f6e3b2b..8583565e7 100644 --- a/cnn/cfsm-builder.h +++ b/cnn/cfsm-builder.h @@ -1,5 +1,5 @@ -#ifndef CNN_HSMBUILDER_H -#define CNN_HSMBUILDER_H +#ifndef CNN_CFSMBUILDER_H +#define CNN_CFSMBUILDER_H #include #include @@ -11,23 +11,44 @@ namespace cnn { struct Parameters; +class FactoredSoftmaxBuilder { +public: + // call this once per ComputationGraph + virtual void new_graph(ComputationGraph& cg) = 0; + + // -log(p(c | rep) * p(w | c, rep)) + virtual expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx) = 0; + + // samples a word from p(w,c | rep) + virtual unsigned sample(const expr::Expression& rep) = 0; +}; + +class NonFactoredSoftmaxBuilder : public FactoredSoftmaxBuilder { +public: + NonFactoredSoftmaxBuilder(unsigned rep_dim, unsigned vocab_size, Model* model); + void new_graph(ComputationGraph& cg); + expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx); + unsigned sample(const expr::Expression& rep); +private: + Parameters* p_w; + Parameters* p_b; + expr::Expression w; + expr::Expression b; + ComputationGraph* pcg; +}; + // helps with implementation of hierarchical softmax // read a file with lines of the following format // CLASSID word [freq] -class ClassFactoredSoftmaxBuilder { +class ClassFactoredSoftmaxBuilder : public FactoredSoftmaxBuilder { public: ClassFactoredSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, Dict* word_dict, Model* model); - // call this once per ComputationGraph void new_graph(ComputationGraph& cg); - - // -log(p(c | rep) * p(w | c, rep)) expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx); - - // samples a word from p(w,c | rep) unsigned sample(const expr::Expression& rep); private: diff --git a/cnn/hsm-builder.cc b/cnn/hsm-builder.cc new file mode 100644 index 000000000..4ce87d273 --- /dev/null +++ b/cnn/hsm-builder.cc @@ -0,0 +1,289 @@ +#include "cnn/hsm-builder.h" + +#include +#include +#include +#include + +#undef assert +#define assert(x) {} + +using namespace std; + +namespace cnn { + +using namespace expr; + +Cluster::Cluster() : initialized(false) {} +void Cluster::new_graph(ComputationGraph& cg) { + for (Cluster* child : children) { + child->new_graph(cg); + } + bias.pg = NULL; + weights.pg = NULL; +} + +Cluster* Cluster::add_child(unsigned sym) { + assert (!initialized); + assert (terminals.size() == 0); + auto it = word2ind.find(sym); + unsigned i; + if (it == word2ind.end()) { + Cluster* c = new Cluster(); + c->path = path; + c->path.push_back(sym); + i = children.size(); + word2ind.insert(make_pair(sym, i)); + children.push_back(c); + assert (c != NULL); + } + else { + i = it->second; + } + return children[i]; +} + +void Cluster::add_word(unsigned word) { + assert (!initialized); + assert (children.size() == 0); + word2ind[word] = terminals.size(); + terminals.push_back(word); +} + +void Cluster::initialize(unsigned rep_dim, Model* model) { + assert (!initialized); + output_size = (children.size() > 0) ? children.size() : terminals.size(); + assert (output_size > 0); + + if (output_size == 1) { + p_weights = NULL; + p_bias = NULL; + } + else if (output_size == 2) { + p_weights = model->add_parameters({1, rep_dim}); + p_bias = model->add_parameters({1}); + } + else { + p_weights = model->add_parameters({output_size, rep_dim}); + p_bias = model->add_parameters({output_size}); + } + + for (Cluster* child : children) { + child->initialize(rep_dim, model); + } +} + +unsigned Cluster::num_children() const { + return children.size(); +} + +const Cluster* Cluster::get_child(unsigned i) const { + assert (i < children.size()); + assert (children[i] != NULL); + return children[i]; +} + +const vector& Cluster::get_path() const { return path; } +unsigned Cluster::get_index(unsigned word) const { return word2ind.find(word)->second; } +unsigned Cluster::get_word(unsigned index) const { return terminals[index]; } + +Expression Cluster::predict(Expression h, ComputationGraph& cg) const { + if (output_size == 1) { + return input(cg, 1.0f); + } + else { + Expression b = get_bias(cg); + Expression w = get_weights(cg); + return affine_transform({b, w, h}); + } +} + +Expression Cluster::neg_log_softmax(Expression h, unsigned r, ComputationGraph& cg) const { + if (output_size == 1) { + return input(cg, 0.0f); + } + else if (output_size == 2) { + Expression p = logistic(predict(h, cg)); + assert (r == 0 || r == 1); + if (r == 1) { + p = 1 - p; + } + return -log(p); + } + else { + Expression dist = predict(h, cg); + return pickneglogsoftmax(dist, r); + } +} + +unsigned Cluster::sample(expr::Expression h, ComputationGraph& cg) const { + if (output_size == 1) { + return 0; + } + else if (output_size == 2) { + logistic(predict(h, cg)); + double prob0 = as_scalar(cg.incremental_forward()); + double p = rand01(); + if (p < prob0) { + return 0; + } + else { + return 1; + } + } + else { + softmax(predict(h, cg)); + vector dist = as_vector(cg.incremental_forward()); + unsigned c = 0; + double p = rand01(); + for (; c < dist.size(); ++c) { + p -= dist[c]; + if (p < 0.0) { break; } + } + if (c == dist.size()) { + --c; + } + return c; + } +} + +Expression Cluster::get_weights(ComputationGraph& cg) const { + if (weights.pg != &cg) { + weights = parameter(cg, p_weights); + } + return weights; +} + +Expression Cluster::get_bias(ComputationGraph& cg) const { + if (bias.pg != &cg) { + bias = parameter(cg, p_bias); + } + return bias; +} + +string Cluster::toString() const { + stringstream ss; + for (unsigned i = 0; i < path.size(); ++i) { + if (i != 0) { + ss << " "; + } + ss << path[i]; + } + return ss.str(); +} + +HierarchicalSoftmaxBuilder::HierarchicalSoftmaxBuilder(unsigned rep_dim, + const std::string& cluster_file, + Dict* word_dict, + Model* model) { + root = ReadClusterFile(cluster_file, word_dict); + root->initialize(rep_dim, model); +} + +HierarchicalSoftmaxBuilder::~HierarchicalSoftmaxBuilder() { +} + +void HierarchicalSoftmaxBuilder::new_graph(ComputationGraph& cg) { + pcg = &cg; + root->new_graph(cg); +} + +Expression HierarchicalSoftmaxBuilder::neg_log_softmax(const Expression& rep, unsigned wordidx) { + assert (pcg != NULL && "You must call new_graph before calling neg_log_softmax!"); + Cluster* path = widx2path[wordidx]; + + unsigned i = 0; + const Cluster* node = root; + assert (root != NULL); + vector log_probs; + Expression lp; + unsigned r; + while (node->num_children() > 0) { + r = node->get_index(path->get_path()[i]); + lp = node->neg_log_softmax(rep, r, *pcg); + log_probs.push_back(lp); + node = node->get_child(r); + assert (node != NULL); + i += 1; + } + + r = path->get_index(wordidx); + lp = node->neg_log_softmax(rep, r, *pcg); + log_probs.push_back(lp); + + return sum(log_probs); +} + +unsigned HierarchicalSoftmaxBuilder::sample(const expr::Expression& rep) { + assert (pcg != NULL && "You must call new_graph before calling sample!"); + + const Cluster* node = root; + vector dist; + unsigned c; + while (node->num_children() > 0) { + c = node->sample(rep, *pcg); + node = node->get_child(c); + } + + c = node->sample(rep, *pcg); + return node->get_word(c); +} + +inline bool is_ws(char x) { return (x == ' ' || x == '\t'); } +inline bool not_ws(char x) { return (x != ' ' && x != '\t'); } + +Cluster* HierarchicalSoftmaxBuilder::ReadClusterFile(const std::string& cluster_file, Dict* word_dict) { + cerr << "Reading clusters from " << cluster_file << " ...\n"; + ifstream in(cluster_file); + assert(in); + int wc = 0; + string line; + vector path; + Cluster* root = new Cluster(); + while(getline(in, line)) { + path.clear(); + ++wc; + const unsigned len = line.size(); + unsigned startp = 0; + unsigned endp = 0; + while (startp < len) { + while (is_ws(line[startp]) && startp < len) { ++startp; } + endp = startp; + while (not_ws(line[endp]) && endp < len) { ++endp; } + string symbol = line.substr(startp, endp - startp); + path.push_back(path_symbols.Convert(symbol)); + if (line[endp] == ' ') { + startp = endp + 1; + continue; + } + else { + break; + } + } + Cluster* node = root; + for (unsigned symbol : path) { + node = node->add_child(symbol); + } + + unsigned startw = endp; + while (is_ws(line[startw]) && startw < len) { ++startw; } + unsigned endw = startw; + while (not_ws(line[endw]) && endw < len) { ++endw; } + assert(endp > startp); + assert(startw > endp); + assert(endw > startw); + + string word = line.substr(startw, endw - startw); + unsigned widx = word_dict->Convert(word); + node->add_word(widx); + + if (widx2path.size() <= widx) { + widx2path.resize(widx + 1); + } + widx2path[widx] = node; + } + cerr << "Done reading clusters.\n"; + return root; +} + +} // namespace cnn diff --git a/cnn/hsm-builder.h b/cnn/hsm-builder.h new file mode 100644 index 000000000..f6cdc7b71 --- /dev/null +++ b/cnn/hsm-builder.h @@ -0,0 +1,82 @@ +#ifndef CNN_HSMBUILDER_H +#define CNN_HSMBUILDER_H + +#include +#include +#include +#include "cnn/cnn.h" +#include "cnn/expr.h" +#include "cnn/dict.h" +#include "cnn/cfsm-builder.h" + +namespace cnn { + +struct Parameters; + +class Cluster { +private: + std::vector children; + std::vector path; + std::vector terminals; + std::unordered_map word2ind; + Parameters* p_weights; + Parameters* p_bias; + mutable expr::Expression weights; + mutable expr::Expression bias; + bool initialized; + unsigned output_size; + + expr::Expression predict(expr::Expression h, ComputationGraph& cg) const; + +public: + Cluster(); + Cluster* add_child(unsigned sym); + void add_word(unsigned word); + void initialize(unsigned rep_dim, Model* model); + + void new_graph(ComputationGraph& cg); + unsigned sample(expr::Expression h, ComputationGraph& cg) const; + expr::Expression neg_log_softmax(expr::Expression h, unsigned r, ComputationGraph& cg) const; + + unsigned get_index(unsigned word) const; + unsigned get_word(unsigned index) const; + unsigned num_children() const; + const Cluster* get_child(unsigned i) const; + const std::vector& get_path() const; + expr::Expression get_weights(ComputationGraph& cg) const; + expr::Expression get_bias(ComputationGraph& cg) const; + + std::string toString() const; +}; + +// helps with implementation of hierarchical softmax +// read a file with lines of the following format +// CLASSID word [freq] +class HierarchicalSoftmaxBuilder : public FactoredSoftmaxBuilder { + public: + HierarchicalSoftmaxBuilder(unsigned rep_dim, + const std::string& cluster_file, + Dict* word_dict, + Model* model); + ~HierarchicalSoftmaxBuilder(); + // call this once per ComputationGraph + void new_graph(ComputationGraph& cg); + + // -log(p(c | rep) * p(w | c, rep)) + expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx); + + // samples a word from p(w,c | rep) + unsigned sample(const expr::Expression& rep); + + private: + Cluster* ReadClusterFile(const std::string& cluster_file, Dict* word_dict); + std::vector widx2path; // will be NULL if not found + Dict path_symbols; + + ComputationGraph* pcg; + Cluster* root; +}; + +} // namespace cnn + +#endif diff --git a/rnnlm/lm.cc b/rnnlm/lm.cc index 442653890..ddeb43dcf 100644 --- a/rnnlm/lm.cc +++ b/rnnlm/lm.cc @@ -8,6 +8,7 @@ #include "cnn/dict.h" #include "cnn/expr.h" #include "cnn/cfsm-builder.h" +#include "cnn/hsm-builder.h" #include #include @@ -26,7 +27,7 @@ unsigned HIDDEN_DIM = 0; unsigned VOCAB_SIZE = 0; float DROPOUT = 0; bool SAMPLE = false; -ClassFactoredSoftmaxBuilder* cfsm = nullptr; +FactoredSoftmaxBuilder* cfsm = nullptr; cnn::Dict d; int kSOS; @@ -43,6 +44,7 @@ void InitCommandLine(int argc, char** argv, po::variables_map* conf) { ("test,p", po::value(), "test corpus") ("learn,x", "set this to estimate the language model from the training data") ("clusters,c", po::value(), "word cluster file for class factored softmax") + ("paths,b", po::value(), "word paths file for hierarchical softmax") ("sample,s", "periodically generate random samples from model as it trains (recommended)") ("model,m", po::value(), "load model from this file") ("input_dim,i", po::value()->default_value(128), "input embedding dimension") @@ -166,6 +168,8 @@ int main(int argc, char** argv) { Model model; if (conf.count("clusters")) cfsm = new ClassFactoredSoftmaxBuilder(HIDDEN_DIM, conf["clusters"].as(), &d, &model); + else if (conf.count("paths")) + cfsm = new HierarchicalSoftmaxBuilder(HIDDEN_DIM, conf["paths"].as(), &d, &model); float eta_decay_rate = 1; unsigned eta_decay_onset_epoch = 0; if (conf.count("eta_decay_onset_epoch")) @@ -195,6 +199,8 @@ int main(int argc, char** argv) { d.Freeze(); // no new word types allowed d.SetUnk(""); VOCAB_SIZE = d.size(); + if (!cfsm) + cfsm = new NonFactoredSoftmaxBuilder(HIDDEN_DIM, VOCAB_SIZE, &model); if (conf.count("test")) { string testf = conf["test"].as(); From 7247f6d465934daa5b08517839db644bd0227f0f Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 22 Jan 2016 00:37:56 -0500 Subject: [PATCH 389/965] add explicit broadcasting addition and matrix inversion --- cnn/expr.cc | 2 ++ cnn/expr.h | 4 ++++ cnn/nodes-common.cc | 27 +++++++++++++++++++++ cnn/nodes.cc | 57 +++++++++++++++++++++++++++++++++++++++++++++ cnn/nodes.h | 28 ++++++++++++++++++++++ 5 files changed, 118 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index a3c06c9c8..8bdfc0aee 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -34,6 +34,7 @@ Expression operator-(real x, const Expression& y) { return Expression(y.pg, y.pg Expression operator-(const Expression& x, real y) { return -(y-x); } Expression operator*(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression operator*(const Expression& x, float y) { return Expression(x.pg, x.pg->add_function({x.i}, y)); } +Expression addmv(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression cdiv(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression colwise_add(const Expression& x, const Expression& bias) { return Expression(x.pg, x.pg->add_function({x.i, bias.i})); } Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z) { return Expression(x.pg, x.pg->add_function({x.i, y.i, z.i})); } @@ -70,6 +71,7 @@ Expression select_rows(const Expression& x, const vector& rows) { retu Expression select_rows(const Expression& x, const vector* prows) { return Expression(x.pg, x.pg->add_function({x.i}, prows)); } Expression select_cols(const Expression& x, const vector& cols) { return Expression(x.pg, x.pg->add_function({x.i}, cols)); } Expression select_cols(const Expression& x, const vector* pcols) { return Expression(x.pg, x.pg->add_function({x.i}, pcols)); } +Expression inverse(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression trace_of_product(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} diff --git a/cnn/expr.h b/cnn/expr.h index 2072553cf..01de3f7f9 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -43,6 +43,8 @@ Expression operator*(const Expression& x, const Expression& y); Expression operator*(const Expression& x, float y); inline Expression operator*(float y, const Expression& x) { return x * y; } inline Expression operator/(const Expression& x, float y) { return x * (1.f / y); } +// colwise addition +Expression addmv(const Expression& M, const Expression& v); // componentwise division Expression cdiv(const Expression& x, const Expression& y); Expression colwise_add(const Expression& x, const Expression& bias); @@ -86,6 +88,8 @@ Expression select_rows(const Expression& x, const std::vector* prows); // select_cols is more efficient than select_rows since Eigen uses column-major order Expression select_cols(const Expression& x, const std::vector& cols); Expression select_cols(const Expression& x, const std::vector* pcols); +// matrix inverse +Expression inverse(const Expression& x); Expression trace_of_product(const Expression& x, const Expression& y); Expression cwise_multiply(const Expression& x, const Expression& y); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index ba378341f..699acca9f 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -17,6 +17,33 @@ inline bool LooksLikeVector(const Dim& d) { return true; } +string MatrixInverse::as_string(const vector& arg_names) const { + ostringstream s; + s << "inverse(" << arg_names[0] << ")"; + return s.str(); +} + +Dim MatrixInverse::dim_forward(const vector& xs) const { + return xs[0]; +} + +string AddMv::as_string(const vector& arg_names) const { + ostringstream s; + s << "addmv(" << arg_names[0] << ", " << arg_names[1] << ")"; + return s.str(); +} + +Dim AddMv::dim_forward(const vector& xs) const { + if (xs.size() != 2 || + xs[0].ndims() > 2 || + xs[0].rows() != xs[1].rows() || + xs[1].ndims() != 1) { + cerr << "Bad arguments in AddMv: " << xs << endl; + throw std::invalid_argument("invalid arguments to AddMv"); + } + return xs[0]; +} + string SelectRows::as_string(const vector& arg_names) const { ostringstream s; s << "select_rows(" << arg_names[0] << ", {rsize=" << prows->size() << "})"; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 9461e35b5..73d38697b 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -35,6 +35,63 @@ using namespace std; namespace cnn { +void MatrixInverse::forward_impl(const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); +#ifdef HAVE_CUDA + throw std::runtime_error("MatrixInverse not yet implemented for CUDA"); +#else + auto x = **xs[0]; + auto y = *fx; + y = x.inverse(); +#endif +} + +void MatrixInverse::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(xs.size() == 1); +#ifdef HAVE_CUDA + throw std::runtime_error("MatrixInverse not yet implemented for CUDA"); +#else + auto d = *dEdf; + auto y = *fx; + (*dEdxi) -= y * d * y; +#endif +} + +void AddMv::forward_impl(const vector& xs, Tensor& fx) const { + assert(xs.size() == 2); +#ifdef HAVE_CUDA + throw std::runtime_error("AddMv not yet implemented for CUDA"); +#else + auto M = **xs[0]; + auto v = **xs[1]; + auto y = *fx; + y = M.colwise() + v.col(0); +#endif +} + +void AddMv::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(xs.size() == 2); +#ifdef HAVE_CUDA + throw std::runtime_error("AddMv not yet implemented for CUDA"); +#else + auto dEdx = *dEdxi; + auto d = *dEdf; + if (i == 0) { // Matrix + dEdx += d; + } else { // vector + dEdx += d.rowwise().sum(); + } +#endif +} + void SelectRows::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); #ifdef HAVE_CUDA diff --git a/cnn/nodes.h b/cnn/nodes.h index 2fe7030da..8342ea77c 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -5,6 +5,34 @@ namespace cnn { +// M = x_0, v = x_1 +// y = M + v (broadcasting over columns) +struct AddMv : public Node { + explicit AddMv(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + +// y = inv(x) +// x = an invertible matrix +struct MatrixInverse : public Node { + explicit MatrixInverse(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = select_rows(x, rows) // x = a matrix struct SelectRows : public Node { From 8c6171311f6ea9ec1f9a1584ca98f1d2e81933fb Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 22 Jan 2016 01:36:56 -0500 Subject: [PATCH 390/965] refactor weight decay --- cnn/CMakeLists.txt | 2 ++ cnn/param-nodes.cc | 24 +++++++++++++----- cnn/training.cc | 56 +++++++++++++++++++++--------------------- cnn/training.h | 31 ++++++++++++----------- examples/rnnlm-mp.cc | 2 +- examples/segrnn-sup.cc | 2 +- 6 files changed, 66 insertions(+), 51 deletions(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 2eb708bbc..b5d61f28c 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -27,6 +27,7 @@ set(cnn_library_SRCS shadow-params.cc tensor.cc training.cc + weight-decay.cc ) # Headers: @@ -63,6 +64,7 @@ set(cnn_library_HDRS tensor.h timing.h training.h + weight-decay.h ) if(WITH_CUDA_BACKEND) diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index c10a8f041..480ff2327 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -1,5 +1,6 @@ #include "cnn/param-nodes.h" #include "cnn/tensor.h" +#include "cnn/weight-decay.h" #include @@ -20,7 +21,7 @@ Dim ConstParameterNode::dim_forward(const vector& xs) const { void ConstParameterNode::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - fx.v = params->values.v; + *fx = *params->values * global_weight_decay.CurrentWeightDecay(); } void ConstParameterNode::backward_impl(const vector& xs, @@ -45,14 +46,24 @@ Dim ParameterNode::dim_forward(const vector& xs) const { void ParameterNode::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); +// TODO +// if (params->not_regularized) { +// fx.v = params->values.v; +// return; +// } +#if HAVE_CUDA fx.v = params->values.v; + cerr << "ParameterNode::forward_impl - implement * global_weight_scale for CUDA\n"; +#else + *fx = *params->values * global_weight_decay.CurrentWeightDecay(); +#endif } void ParameterNode::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { cerr << "called backward() on arity 0 node: i = " << i << endl; abort(); } @@ -139,7 +150,7 @@ void LookupNode::forward_impl(const vector& xs, Tensor& fx) const if(pindex) { assert(*pindex < params->values.size()); assert (fx.d.batch_elems() == 1); - fx.v = params->values[*pindex].v; + *fx = *params->values[*pindex] * global_weight_decay.CurrentWeightDecay(); } else { assert (pindices); assert (fx.d.batch_elems() == pindices->size()); @@ -152,6 +163,7 @@ void LookupNode::forward_impl(const vector& xs, Tensor& fx) const #else memcpy(v, params->values[i].v, fx.d.batch_size() * sizeof(float)); #endif + cerr << "TODO: implement * global_weight_scale\n"; } } } diff --git a/cnn/training.cc b/cnn/training.cc index af37e1e93..d171911e8 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -1,6 +1,8 @@ #include "cnn/training.h" #include "cnn/gpu-ops.h" +#include "cnn/param-nodes.h" +#include "cnn/weight-decay.h" namespace cnn { @@ -13,6 +15,13 @@ bool is_valid(const Eigen::MatrixBase& x) { Trainer::~Trainer() {} +void Trainer::rescale_and_reset_weight_decay() { + const float weight_decay = global_weight_decay.CurrentWeightDecay(); + for (auto p : model->parameters_list()) + p->scale_parameters(weight_decay); + global_weight_decay.ResetWeightDecay(); +} + float Trainer::clip_gradients() { float gscale = 1; if (clipping_enabled) { @@ -30,27 +39,28 @@ float Trainer::clip_gradients() { } void SimpleSGDTrainer::update(real scale) { - update(model->lookup_parameters_list(), model->parameters_list(), scale); + update(model->lookup_parameters_list(), model->parameters_list(), scale); + global_weight_decay.UpdateWeightDecay(); // update global weight scale + if (global_weight_decay.ParametersNeedRescaled()) + rescale_and_reset_weight_decay(); // if wdscale is getting to small multiply all weights by wdscale, and set wdscale to 1 } void SimpleSGDTrainer::update(const std::vector &lookup_params, const std::vector ¶ms, real scale) { const float gscale = clip_gradients(); for (auto p : params) { #if HAVE_CUDA - gpu::sgd_update(p->values.d.size(), p->g.v, p->values.v, eta * scale * gscale, lambda); + gpu::sgd_update(p->values.d.size(), p->g.v, p->values.v, eta * scale * gscale, 0); #else - auto reg = (p->values.vec()) * lambda; - p->values.vec() -= ((eta * scale * gscale) * p->g.vec() + reg); + p->values.vec() -= ((eta * scale * gscale) * p->g.vec()); #endif p->clear(); } for (auto p : lookup_params) { for (auto i : p->non_zero_grads) { #if HAVE_CUDA - gpu::sgd_update(p->values[i].d.size(), p->grads[i].v, p->values[i].v, eta * scale * gscale, lambda); + gpu::sgd_update(p->values[i].d.size(), p->grads[i].v, p->values[i].v, eta * scale * gscale, 0); #else - auto reg = (p->values[i].vec()) * lambda; - p->values[i].vec() -= (p->grads[i].vec() * (eta * scale * gscale) + reg); + p->values[i].vec() -= (p->grads[i].vec() * (eta * scale * gscale)); #endif } p->clear(); @@ -71,9 +81,8 @@ void MomentumSGDTrainer::update(real scale) { unsigned pi = 0; for (auto p : model->parameters_list()) { Tensor& v = vp[pi++].h; - auto reg = p->values.vec() * lambda; - v.vec() = momentum * v.vec() - (eta * scale * gscale) * (p->g.vec()); - p->values.vec() += v.vec() - reg; + v.vec() = momentum * v.vec() - (eta * scale * gscale) * p->g.vec(); + p->values.vec() += v.vec(); p->clear(); } pi = 0; @@ -81,9 +90,8 @@ void MomentumSGDTrainer::update(real scale) { vector& vx = vlp[pi++].h; for (auto i : p->non_zero_grads) { Tensor& v = vx[i]; - auto reg = (p->values[i].vec()) * lambda; v.vec() = momentum * v.vec() - (eta * scale * gscale) * (p->grads[i].vec()); - p->values[i].vec() += v.vec() - reg; + p->values[i].vec() += v.vec(); } p->clear(); } @@ -102,12 +110,11 @@ void AdagradTrainer::update(real scale) { const float gscale = clip_gradients(); for (auto p : model->parameters_list()) { Tensor& v = vp[pi++].h; - auto reg = p->values.vec() * lambda; auto g = scale * gscale * p->g.vec(); auto g2 = g.cwiseProduct(g); v.vec() += g2; auto delta = -eta * g.cwiseQuotient((v.vec().array() + epsilon).matrix().cwiseSqrt()); - p->values.vec() += delta - reg; + p->values.vec() += delta; p->clear(); } @@ -116,12 +123,11 @@ void AdagradTrainer::update(real scale) { vector& vx = vlp[pi++].h; for (auto i : p->non_zero_grads) { Tensor& v = vx[i]; - auto reg = p->values[i].vec() * lambda; auto g = scale * gscale * p->grads[i].vec(); auto g2 = g.cwiseProduct(g); v.vec() += g2; auto delta = -eta * g.cwiseQuotient((v.vec().array() + epsilon).matrix().cwiseSqrt()); - p->values[i].vec() += delta - reg; + p->values[i].vec() += delta; } p->clear(); } @@ -164,7 +170,6 @@ void AdadeltaTrainer::update(real scale) { auto& g = (scale * gscale) * p->g.vec(); Tensor& hgv = hg[pi].h; Tensor& hdv = hd[pi].h; - auto reg = p->values.vec() * lambda; auto g2 = g.cwiseProduct(g); hgv.vec() = rho * hgv.vec() + (1.0 - rho) * g2; auto num = -g.cwiseProduct((hdv.vec().array() + epsilon).matrix().cwiseSqrt()); @@ -172,7 +177,7 @@ void AdadeltaTrainer::update(real scale) { auto delta = num.cwiseQuotient(den); auto d2 = delta.cwiseProduct(delta); hdv.vec() = rho * hdv.vec() + (1.0 - rho) * d2; - p->values.vec() += delta - reg; + p->values.vec() += delta; p->clear(); pi++; } @@ -185,7 +190,6 @@ void AdadeltaTrainer::update(real scale) { Tensor& hgv = hgvx[i]; Tensor& hdv = hdvx[i]; auto& g = scale * gscale * p->grads[i].vec(); - auto reg = p->values[i].vec() * lambda; auto g2 = g.cwiseProduct(g); hgv.vec() = rho * hgv.vec() + (1.0 - rho) * g2; auto num = -g.cwiseProduct((hdv.vec().array() + epsilon).matrix().cwiseSqrt()); @@ -193,7 +197,7 @@ void AdadeltaTrainer::update(real scale) { auto delta = num.cwiseQuotient(den); auto d2 = delta.cwiseProduct(delta); hdv.vec() = rho * hdv.vec() + (1.0 - rho) * d2; - p->values[i].vec() += delta - reg; + p->values[i].vec() += delta; } p->clear(); pi++; @@ -219,10 +223,9 @@ void RmsPropTrainer::update(real scale) { pi = 0; for (auto p : model->parameters_list()) { real& d2 = hg[pi++]; - auto reg = p->values.vec() * lambda; real g2 = p->g.vec().squaredNorm(); d2 = rho * d2 + (1.0 - rho) * g2; - p->values.vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->g.vec() + reg); + p->values.vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->g.vec()); p->clear(); } @@ -231,10 +234,9 @@ void RmsPropTrainer::update(real scale) { vector& hlgx = hlg[pi++]; for (auto i : p->non_zero_grads) { real& d2 = hlgx[i]; - auto reg = p->values[i].vec() * lambda; real g2 = p->grads[i].vec().squaredNorm(); d2 = rho * d2 + (1.0 - rho) * g2; - p->values[i].vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->grads[i].vec() + reg); + p->values[i].vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->grads[i].vec()); } p->clear(); } @@ -259,7 +261,6 @@ void AdamTrainer::update(real scale) { auto g_t = (scale * gscale) * p->g.vec(); auto m_t = m[pi].h.vec(); auto v_t = v[pi].h.vec(); - auto reg = p->values.vec() * lambda; m_t = beta_1 * m_t + (1 - beta_1) * g_t; auto g2 = g_t.cwiseProduct(g_t); v_t = beta_2 * v_t + (1 - beta_2) * g2; @@ -268,7 +269,7 @@ void AdamTrainer::update(real scale) { auto mhat = m_t / s1; auto vhat = v_t / s2; auto delta = (-eta * mhat).cwiseQuotient((vhat.array().sqrt() + eps).matrix()); - p->values.vec() += delta - reg; + p->values.vec() += delta; p->clear(); pi++; } @@ -282,7 +283,6 @@ void AdamTrainer::update(real scale) { auto v_t = vv[i].vec(); auto g_t = scale * gscale * p->grads[i].vec(); auto g2 = g_t.cwiseProduct(g_t); - auto reg = p->values[i].vec() * lambda; m_t = beta_1 * m_t + (1 - beta_1) * g_t; v_t = beta_2 * v_t + (1 - beta_2) * g2; float s1 = 1 - pow(beta_1, t); @@ -290,7 +290,7 @@ void AdamTrainer::update(real scale) { auto mhat = m_t / s1; auto vhat = v_t / s2; auto delta = (-eta * mhat).cwiseQuotient((vhat.array().sqrt() + eps).matrix()); - p->values[i].vec() += delta - reg; + p->values[i].vec() += delta; } p->clear(); pi++; diff --git a/cnn/training.h b/cnn/training.h index d03ec427e..d70cb2486 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -8,8 +8,8 @@ namespace cnn { struct Trainer { - explicit Trainer(Model* m, real lam, real e0) : - eta0(e0), eta(e0), eta_decay(), epoch(), lambda(lam), clipping_enabled(true), clip_threshold(5), clips(), updates(), model(m) {} + explicit Trainer(Model* m, real e0) : + eta0(e0), eta(e0), eta_decay(), epoch(), clipping_enabled(true), clip_threshold(5), clips(), updates(), model(m) {} virtual ~Trainer(); virtual void update(real scale = 1.0) = 0; @@ -28,8 +28,6 @@ struct Trainer { real eta_decay; real epoch; - real lambda; // weight regularization (l2) - // clipping real clipping_enabled; real clip_threshold; @@ -42,17 +40,20 @@ struct Trainer { } Model* model; // parameters and gradients live here + + protected: + void rescale_and_reset_weight_decay(); }; struct SimpleSGDTrainer : public Trainer { - explicit SimpleSGDTrainer(Model* m, real lam = 1e-6, real e0 = 0.1) : Trainer(m, lam, e0) {} + explicit SimpleSGDTrainer(Model* m, real e0 = 0.1) : Trainer(m, e0) {} void update(real scale) override; void update(const std::vector &lookup_params, const std::vector ¶ms, real scale = 1); }; struct MomentumSGDTrainer : public Trainer { - explicit MomentumSGDTrainer(Model* m, real lam = 1e-6, real e0 = 0.01, real mom = 0.9) : - Trainer(m, lam, e0), momentum(mom), velocity_allocated(false) {} + explicit MomentumSGDTrainer(Model* m, real e0 = 0.01, real mom = 0.9) : + Trainer(m, e0), momentum(mom), velocity_allocated(false) {} void update(real scale) override; real momentum; @@ -67,8 +68,8 @@ struct MomentumSGDTrainer : public Trainer { }; struct AdagradTrainer : public Trainer { - explicit AdagradTrainer(Model* m, real lam = 1e-6, real e0 = 0.1, real eps = 1e-20) : - Trainer(m, lam, e0), epsilon(eps), shadow_params_allocated(false) {} + explicit AdagradTrainer(Model* m, real e0 = 0.1, real eps = 1e-20) : + Trainer(m, e0), epsilon(eps), shadow_params_allocated(false) {} void update(real scale) override; real epsilon; @@ -78,8 +79,8 @@ struct AdagradTrainer : public Trainer { }; struct AdadeltaTrainer : public Trainer { - explicit AdadeltaTrainer(Model* m, real lam = 1e-6, real eps = 1e-6, real rho = 0.95) : - Trainer(m, lam, 1.0), epsilon(eps), rho(rho), shadow_params_allocated(false) {} + explicit AdadeltaTrainer(Model* m, real eps = 1e-6, real rho = 0.95) : + Trainer(m, 1.0), epsilon(eps), rho(rho), shadow_params_allocated(false) {} void update(real scale) override; real epsilon; @@ -92,8 +93,8 @@ struct AdadeltaTrainer : public Trainer { }; struct RmsPropTrainer : public Trainer { - explicit RmsPropTrainer(Model* m, real lam = 1e-6, real e0 = 0.1, real eps = 1e-20, real rho = 0.95) : - Trainer(m, lam, e0), epsilon(eps), rho(rho), shadow_params_allocated(false) {} + explicit RmsPropTrainer(Model* m, real e0 = 0.1, real eps = 1e-20, real rho = 0.95) : + Trainer(m, e0), epsilon(eps), rho(rho), shadow_params_allocated(false) {} void update(real scale) override; real epsilon; @@ -104,8 +105,8 @@ struct RmsPropTrainer : public Trainer { }; struct AdamTrainer : public Trainer { - explicit AdamTrainer(Model* m, float lambda = 1e-6, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8) : - Trainer(m, lambda, alpha), beta_1(beta_1), beta_2(beta_2), eps(eps), shadow_params_allocated(false) {} + explicit AdamTrainer(Model* m, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8) : + Trainer(m, alpha), beta_1(beta_1), beta_2(beta_2), eps(eps), shadow_params_allocated(false) {} void update(real scale) override; diff --git a/examples/rnnlm-mp.cc b/examples/rnnlm-mp.cc index 1d77b2586..1a72023e4 100644 --- a/examples/rnnlm-mp.cc +++ b/examples/rnnlm-mp.cc @@ -77,7 +77,7 @@ int main(int argc, char** argv) { cnn::Initialize(argc, argv, 1, true); Model model; - SimpleSGDTrainer sgd(&model, 0.0, 0.2); + SimpleSGDTrainer sgd(&model, 0.2); //AdagradTrainer sgd(&model, 0.0); //AdamTrainer sgd(&model, 0.0); diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index 72f5a2114..b8437f5d5 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -1079,7 +1079,7 @@ int main(int argc, char** argv) { Model model; // auto sgd = new SimpleSGDTrainer(&model); - auto sgd = new AdamTrainer(&model, 1e-6, 0.0005, 0.01, 0.9999, 1e-8); + auto sgd = new AdamTrainer(&model, 0.0005, 0.01, 0.9999, 1e-8); int max_seg_len = DATA_MAX_SEG_LEN + 1; if(vm.count("train_max_seg_len")){ max_seg_len = vm["train_max_seg_len"].as(); From 962da42d0925696bc3a7a13acfe503cf45c22efd Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 22 Jan 2016 01:43:41 -0500 Subject: [PATCH 391/965] configure weight decay on command line --- cnn/init.cc | 16 ++++++++++++++++ cnn/weight-decay.cc | 7 +++++++ cnn/weight-decay.h | 41 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 cnn/weight-decay.cc create mode 100644 cnn/weight-decay.h diff --git a/cnn/init.cc b/cnn/init.cc index ea10cfcb7..0a5a47b02 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -1,6 +1,7 @@ #include "cnn/init.h" #include "cnn/aligned-mem-pool.h" #include "cnn/cnn.h" +#include "cnn/weight-decay.h" #include #include @@ -54,6 +55,21 @@ void Initialize(int& argc, char**& argv, unsigned random_seed, bool shared_param istringstream c(a2); c >> num_mb; RemoveArgs(argc, argv, argi, 2); } + } else if (arg == "--cnn-l2" || arg == "--cnn_l2") { + if ((argi + 1) > argc) { + cerr << "[cnn] --cnn-l2 requires an argument (the weight decay per update)\n"; + abort(); + } else { + string a2 = argv[argi+1]; + float decay = 0; + istringstream d(a2); d >> decay; + RemoveArgs(argc, argv, argi, 2); + if (decay < 0 || decay >= 1) { + cerr << "[cnn] weight decay parameter must be between 0 and 1 (probably very small like 1e-6)\n"; + abort(); + } + global_weight_decay.SetLambda(decay); + } } else if (arg == "--cnn-seed" || arg == "--cnn_seed") { if ((argi + 1) > argc) { cerr << "[cnn] --cnn-seed expects an argument (the random number seed)\n"; diff --git a/cnn/weight-decay.cc b/cnn/weight-decay.cc new file mode 100644 index 000000000..ea34e4384 --- /dev/null +++ b/cnn/weight-decay.cc @@ -0,0 +1,7 @@ +#include "cnn/weight-decay.h" + +namespace cnn { + +L2WeightDecay global_weight_decay; + +} // namespace cnn diff --git a/cnn/weight-decay.h b/cnn/weight-decay.h new file mode 100644 index 000000000..8f38dc526 --- /dev/null +++ b/cnn/weight-decay.h @@ -0,0 +1,41 @@ +#ifndef CNN_WEIGHT_DECAY_H +#define CNN_WEIGHT_DECAY_H + +#include +#include + +namespace cnn { + +// I don't bother with learning rates when computing how much the weight +// decay changes- those are hard to define in the adaptive update rules. +// So, we do something simple that works with everything. +// +// Note: you may want to discount lambda as you learn if your eta is on a +// decaying schedule. +struct L2WeightDecay { + explicit L2WeightDecay(float lambda = 1e-6) : weight_decay(1) { SetLambda(lambda); } + void SetLambda(float lam) { + if (lam < 0) throw std::domain_error("Bad value of lambda in SetLambda"); + lambda = lam; + } + void UpdateWeightDecay(unsigned num_updates = 1) { + if (num_updates == 0) return; + if (num_updates == 1) + weight_decay -= weight_decay * lambda; + else weight_decay = weight_decay * std::pow(1-lambda, num_updates); + } + float CurrentWeightDecay() const { return weight_decay; } + bool ParametersNeedRescaled() const { + return (weight_decay < 0.25f); + } + void ResetWeightDecay() { weight_decay = 1.0f; } + private: + float weight_decay; + float lambda; +}; + +extern L2WeightDecay global_weight_decay; + +} // namespace cnn + +#endif From 2ea626c9081bb1b7d3025c0f9668f1922dbd8422 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Fri, 22 Jan 2016 15:48:44 -0500 Subject: [PATCH 392/965] fix batch lookup with weight decay --- cnn/param-nodes.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index 480ff2327..ca762942f 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -150,7 +150,7 @@ void LookupNode::forward_impl(const vector& xs, Tensor& fx) const if(pindex) { assert(*pindex < params->values.size()); assert (fx.d.batch_elems() == 1); - *fx = *params->values[*pindex] * global_weight_decay.CurrentWeightDecay(); + fx.vec() = params->values[*pindex].vec() * global_weight_decay.CurrentWeightDecay(); } else { assert (pindices); assert (fx.d.batch_elems() == pindices->size()); @@ -161,10 +161,12 @@ void LookupNode::forward_impl(const vector& xs, Tensor& fx) const #if HAVE_CUDA cudaMemcpyAsync(v, params->values[i].v, fx.d.batch_size() * sizeof(float), cudaMemcpyDeviceToDevice); #else + // we should use colwise() instead of memcpy to get rid of the + // extra multiply by global_weight_decay.CurrentWeightDecay() memcpy(v, params->values[i].v, fx.d.batch_size() * sizeof(float)); #endif - cerr << "TODO: implement * global_weight_scale\n"; } + fx.vec() *= global_weight_decay.CurrentWeightDecay(); } } From d90f72fd20adece7c2b133b8cbd3c8db02819e6f Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 27 Jan 2016 08:59:47 +0900 Subject: [PATCH 393/965] GPU implementation of dropout --- cnn/nodes.cc | 10 +++++----- cnn/tensor.cc | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 73d38697b..58b4aa0d7 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -539,11 +539,11 @@ size_t Dropout::aux_storage_size() const { } void Dropout::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Dropout not yet implemented for CUDA"); -#else Tensor m(dim, (float*)aux_mem); TensorTools::RandomBernoulli(m, (1.f-p), 1.f / (1.f-p)); +#ifdef HAVE_CUDA + gpu::vcwise_product(fx.d.size(), xs[0]->v, m.v, fx.v); +#else fx.vec() = xs[0]->vec().cwiseProduct(m.vec()); #endif } @@ -553,10 +553,10 @@ void Dropout::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { + Tensor m(dim, (float*)aux_mem); #ifdef HAVE_CUDA - throw std::runtime_error("Pow not yet implemented for CUDA"); + gpu::vcwise_product(dEdf.d.size(), dEdf.v, m.v, fx.v); #else - Tensor m(dim, (float*)aux_mem); dEdxi.vec() += dEdf.vec().cwiseProduct(m.vec()); #endif } diff --git a/cnn/tensor.cc b/cnn/tensor.cc index ceda16071..53cda9b72 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -126,13 +126,27 @@ void TensorTools::Randomize(Tensor& d) { void TensorTools::RandomBernoulli(Tensor& val, real p, real scale) { bernoulli_distribution distribution(p); auto b = [&] {return distribution(*rndeng) * scale;}; +#if HAVE_CUDA + float* t = new float[val.d.size()]; + generate(t, t + val.d.size(), b); + CUDA_CHECK(cudaMemcpy(val.v, t, sizeof(real) * val.d.size(), cudaMemcpyHostToDevice)); + delete[] t; +#else generate(val.v, val.v + val.d.size(), b); +#endif } void TensorTools::RandomizeNormal(real mean, real stddev, Tensor& val) { normal_distribution distribution(mean, stddev); auto b = [&] {return distribution(*rndeng);}; +#if HAVE_CUDA + float* t = new float[val.d.size()]; + generate(t, t + val.d.size(), b); + CUDA_CHECK(cudaMemcpy(val.v, t, sizeof(real) * val.d.size(), cudaMemcpyHostToDevice)); + delete[] t; +#else generate(val.v, val.v + val.d.size(), b); +#endif } real rand01() { From 45335299b8ac63d82ffefbfbb72e157d32c946eb Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 26 Jan 2016 21:40:59 -0500 Subject: [PATCH 394/965] more informative error message --- cnn/nodes.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 58b4aa0d7..9f2e33e1a 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1362,7 +1362,11 @@ void RestrictedLogSoftmax::backward_impl(const vector& xs, // x_1 is a vector // y = (x_1)_{*pval} void PickElement::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); + if (*pval >= xs[0]->d.rows()) { + cerr << "PickElement::forward_impl requested element " << *pval + << "from a vector of length " << xs[0]->d.rows() << endl; + abort(); + } #ifdef HAVE_CUDA throw std::runtime_error("PickElement not yet implemented for CUDA"); #else From e10855819e85dacba289f499f9ea0d395f961107 Mon Sep 17 00:00:00 2001 From: Adhiguna Surya Kuncoro Date: Wed, 27 Jan 2016 16:12:45 -0500 Subject: [PATCH 395/965] Add log determinant operation --- cnn/expr.cc | 1 + cnn/expr.h | 2 ++ cnn/nodes-common.cc | 14 ++++++++++++++ cnn/nodes.cc | 42 ++++++++++++++++++++++++++++++++++++++++++ cnn/nodes.h | 13 +++++++++++++ 5 files changed, 72 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index 8bdfc0aee..2e2a59155 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -72,6 +72,7 @@ Expression select_rows(const Expression& x, const vector* prows) { ret Expression select_cols(const Expression& x, const vector& cols) { return Expression(x.pg, x.pg->add_function({x.i}, cols)); } Expression select_cols(const Expression& x, const vector* pcols) { return Expression(x.pg, x.pg->add_function({x.i}, pcols)); } Expression inverse(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression logdet(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression trace_of_product(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} diff --git a/cnn/expr.h b/cnn/expr.h index 01de3f7f9..ea9cfb37b 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -15,6 +15,7 @@ struct Expression { const Tensor& value() { return pg->get_value(i); } }; + Expression input(ComputationGraph& g, real s); Expression input(ComputationGraph& g, const real *ps); Expression input(ComputationGraph& g, const Dim& d, const std::vector& data); @@ -90,6 +91,7 @@ Expression select_cols(const Expression& x, const std::vector& cols); Expression select_cols(const Expression& x, const std::vector* pcols); // matrix inverse Expression inverse(const Expression& x); +Expression logdet(const Expression& x); Expression trace_of_product(const Expression& x, const Expression& y); Expression cwise_multiply(const Expression& x, const Expression& y); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 699acca9f..3564647f6 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -27,6 +27,20 @@ Dim MatrixInverse::dim_forward(const vector& xs) const { return xs[0]; } +Dim LogDet::dim_forward(const vector& xs) const { + if (xs[0].ndims() > 2 || (xs[0].rows() != xs[0].cols())) { + cerr << "Bad arguments in LogDet: " << xs << endl; + throw std::invalid_argument("invalid arguments to LogDet"); + } + return Dim({1}); +} + +string LogDet::as_string(const vector& arg_names) const { + ostringstream s; + s << "logdet(" << arg_names[0] << ")"; + return s.str(); +} + string AddMv::as_string(const vector& arg_names) const { ostringstream s; s << "addmv(" << arg_names[0] << ", " << arg_names[1] << ")"; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 73d38697b..b78b8b0b0 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -649,6 +649,34 @@ EIGEN_STRONG_INLINE float logsumexp(const T& x) { return m + log(z); } +// set use_cholesky if M is symmetric - it's faster and more stable +// for dep paring it won't be +template +inline typename MatrixType::Scalar logdet(const MatrixType& M, bool use_cholesky = false) { + using namespace Eigen; + using std::log; + typedef typename MatrixType::Scalar Scalar; + Scalar ld = 0; + if (use_cholesky) { + LLT> chol(M); + auto& U = chol.matrixL(); + for (unsigned i = 0; i < M.rows(); ++i) + ld += log(U(i,i)); + ld *= 2; + } else { + PartialPivLU> lu(M); + auto& LU = lu.matrixLU(); + Scalar c = lu.permutationP().determinant(); // -1 or 1 + for (unsigned i = 0; i < LU.rows(); ++i) { + const auto& lii = LU(i,i); + if (lii < Scalar(0)) c *= -1; + ld += log(abs(lii)); + } + ld += log(c); + } + return ld; +} + // this i need to do something better, but this is a work-around // if this is too small, just make it bigger #define MAX_LOG_SUM_EXP 65536 @@ -669,6 +697,11 @@ void LogSumExp::forward_impl(const vector& xs, Tensor& fx) const fx.v[0] = logsumexp(*v); } +void LogDet::forward_impl(const vector& xs, Tensor& fx) const { + const unsigned num_args = xs.size(); + fx.v[0] = logdet(**xs[0], false); +} + void LogSumExp::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, @@ -685,6 +718,15 @@ void LogSumExp::backward_impl(const vector& xs, d.array() += (**xs[i] - *fx).array().exp() * (*dEdf).array(); } +void LogDet::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + auto trans = (**xs[0]).transpose(); + (*dEdxi) += (dEdf.v[0]) * trans.inverse(); +} + void Sum::forward_impl(const vector& xs, Tensor& fx) const { const unsigned num_args = xs.size(); if (num_args == 1) { diff --git a/cnn/nodes.h b/cnn/nodes.h index 8342ea77c..b01c40810 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -629,6 +629,19 @@ struct LogSumExp : public Node { Tensor& dEdxi) const override; }; +struct LogDet : public Node { + template explicit LogDet(const T& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + //size_t aux_storage_size() const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = \sum_i x_i struct Sum : public Node { template explicit Sum(const T& a) : Node(a) {} From c139bc47f1fcf8ece0261285438c13d19fa0b248 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 28 Jan 2016 13:58:46 +0900 Subject: [PATCH 396/965] Backward batching on matrix multiply --- cnn/nodes.cc | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 9f2e33e1a..18004b5bf 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1499,14 +1499,24 @@ void MatrixMultiply::backward_impl(const vector& xs, xs[1]->batch_ptr(b), xs[1]->d.rows(), kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); } else { - // TODO: Fix this to share - for(int b = 0; b < max_b; ++b) + // Do a single multiply if xs[0] has one batch + if(xs[0]->d.bd == 1) { + // dEdxi.colbatch_matrix().noalias() += (**xs[0]).transpose() * dEdf.colbatch_matrix(); CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, - dEdxi.d.rows(), dEdxi.d.cols(), xs[0]->d.rows(), + dEdxi.d.rows(), dEdxi.d.cols()*dEdxi.d.batch_elems(), xs[0]->d.rows(), kSCALAR_ONE, - xs[0]->batch_ptr(b), xs[0]->d.rows(), - dEdf.batch_ptr(b), dEdf.d.rows(), - kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); + xs[0]->v, xs[0]->d.rows(), + dEdf.v, dEdf.d.rows(), + kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); + } else { + for(int b = 0; b < max_b; ++b) + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, + dEdxi.d.rows(), dEdxi.d.cols(), xs[0]->d.rows(), + kSCALAR_ONE, + xs[0]->batch_ptr(b), xs[0]->d.rows(), + dEdf.batch_ptr(b), dEdf.d.rows(), + kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); + } } #else if (i == 0) { From 6bf72904c8d3e103cf1c28942a3ef3ef3b62c8fb Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 28 Jan 2016 00:16:28 -0500 Subject: [PATCH 397/965] preliminary stub for multi-GPU support --- CMakeLists.txt | 2 +- cnn/CMakeLists.txt | 1 + cnn/cuda.cc | 119 ++++++++++++++++++++++++++++++++++++++++++--- cnn/devices.cc | 15 ++++++ cnn/devices.h | 41 ++++++++++++++++ cnn/init.cc | 3 +- 6 files changed, 172 insertions(+), 9 deletions(-) create mode 100644 cnn/devices.cc create mode 100644 cnn/devices.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 2bd1b30e5..8df977902 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -75,7 +75,7 @@ if (WITH_CUDA_BACKEND) set(CUDA_TOOLKIT_ROOT_DIR ${CUDA_ROOT}) include_directories(SYSTEM ${CUDA_INCLUDE_DIRS}) add_definitions(-DHAVE_CUDA) - list(APPEND CUDA_LIBRARIES /usr/lib64/libpthread.so) + #list(APPEND CUDA_LIBRARIES /usr/lib64/libpthread.so) MESSAGE("CUDA_LIBRARIES: ${CUDA_LIBRARIES}") list(REMOVE_ITEM CUDA_LIBRARIES -lpthread) set(LIBS ${LIBS} ${CUDA_LIBRARIES}) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 2eb708bbc..d81383ee4 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -5,6 +5,7 @@ set(cnn_library_SRCS cnn.cc conv.cc deep-lstm.cc + devices.cc dict.cc dim.cc exec.cc diff --git a/cnn/cuda.cc b/cnn/cuda.cc index 5423c1dbd..9eefddb81 100644 --- a/cnn/cuda.cc +++ b/cnn/cuda.cc @@ -1,4 +1,6 @@ #include +#include +#include #include "cnn/cnn.h" #include "cnn/cuda.h" @@ -9,6 +11,15 @@ namespace cnn { cublasHandle_t cublas_handle; +static void RemoveArgs(int& argc, char**& argv, int& argi, int n) { + for (int i = argi + n; i < argc; ++i) + argv[i - n] = argv[i]; + argc -= n; + assert(argc >= 0); +} + +#define MAX_GPUS 256 + void Initialize_GPU(int& argc, char**& argv) { int nDevices; CUDA_CHECK(cudaGetDeviceCount(&nDevices)); @@ -16,25 +27,121 @@ void Initialize_GPU(int& argc, char**& argv) { cerr << "[cnn] No GPUs found, recompile without DENABLE_CUDA=1\n"; throw std::runtime_error("No GPUs found but CNN compiled with CUDA support."); } + // logic: no flags, you get 1 GPU + // or you request a certain number of GPUs explicitly + // or you request the device ids + int requested_gpus = -1; + vector gpu_mask(MAX_GPUS); + int argi = 1; + bool ngpus_requested = false; + bool ids_requested = false; + while(argi < argc) { + string arg = argv[argi]; + if (arg == "--cnn_gpus" || arg == "--cnn-gpus") { + if ((argi + 1) > argc) { + cerr << "[cnn] --cnn-gpus expects an argument (number of GPUs to use)\n"; + abort(); + } else { + if (ngpus_requested) { + cerr << "Multiple instances of --cnn-gpus" << endl; abort(); + } + ngpus_requested = true; + string a2 = argv[argi+1]; + istringstream c(a2); c >> requested_gpus; + RemoveArgs(argc, argv, argi, 2); + } + } else if (arg == "--cnn_gpu_ids" || arg == "--cnn-gpu-ids") { + if ((argi + 1) > argc) { + cerr << "[cnn] --cnn-gpu-ids expects an argument (comma separated list of physical GPU ids to use)\n"; + abort(); + } else { + string a2 = argv[argi+1]; + if (ids_requested) { + cerr << "Multiple instances of --cnn-gpu-ids" << endl; abort(); + } + ids_requested = true; + if (a2.size() % 2 != 1) { + cerr << "Bad argument to --cnn-gpu-ids: " << a2 << endl; abort(); + } + for (unsigned i = 0; i < a2.size(); ++i) { + if ((i % 2 == 0 && (a2[i] < '0' || a2[i] > '9')) || + (i % 2 == 1 && a2[i] != ',')) { + cerr << "Bad argument to --cnn-gpu-ids: " << a2 << endl; abort(); + } + if (i % 2 == 0) { + int gpu_id = a2[i] - '0'; + if (gpu_id >= nDevices) { + cerr << "You requested GPU id " << gpu_id << " but system only reports up to " << nDevices << endl; + abort(); + } + if (gpu_id >= MAX_GPUS) { cerr << "Raise MAX_GPUS\n"; abort(); } + gpu_mask[gpu_id]++; + requested_gpus++; + if (gpu_mask[gpu_id] != 1) { + cerr << "Bad argument to --cnn-gpu-ids: " << a2 << endl; abort(); + } + } + } + RemoveArgs(argc, argv, argi, 2); + } + } + } + if (ids_requested && ngpus_requested) { + cerr << "Use only --cnn_gpus or --cnn_gpu_ids, not both\n"; + abort(); + } + if (ngpus_requested || requested_gpus == -1) { + if (requested_gpus == -1) requested_gpus = 1; + cerr << "Request for " << requested_gpus << " GPU" << (requested_gpus == 1 ? "" : "s") << " ...\n"; + for (int i = 0; i < MAX_GPUS; ++i) gpu_mask[i] = 1; + } else if (ids_requested) { + requested_gpus++; + cerr << "[cnn] Request for " << requested_gpus << " specific GPU" << (requested_gpus == 1 ? "" : "s") << " ...\n"; + } + + if (requested_gpus == 0) return; + if (requested_gpus > nDevices) { + cerr << "You requested " << requested_gpus << " GPUs but system only reports " << nDevices << endl; + abort(); + } + + // after all that, requested_gpus is the number of GPUs to reserve + // we now pick the ones that are both requested by the user or have + // the most memory free + + vector gpu_free_mem(MAX_GPUS, 0); + vector gpus(MAX_GPUS, 0); + for (int i = 0; i < MAX_GPUS; ++i) gpus[i] = i; size_t free_bytes, total_bytes, max_free = 0; int selected = 0; for (int i = 0; i < nDevices; i++) { + if (!gpu_mask[i]) continue; cudaDeviceProp prop; CUDA_CHECK(cudaGetDeviceProperties(&prop, i)); cerr << "[cnn] Device Number: " << i << endl; cerr << "[cnn] Device name: " << prop.name << endl; cerr << "[cnn] Memory Clock Rate (KHz): " << prop.memoryClockRate << endl; cerr << "[cnn] Memory Bus Width (bits): " << prop.memoryBusWidth << endl; - cerr << "[cnn] Peak Memory Bandwidth (GB/s): " << (2.0*prop.memoryClockRate*(prop.memoryBusWidth/8)/1.0e6) << endl << endl; + cerr << "[cnn] Peak Memory Bandwidth (GB/s): " << (2.0*prop.memoryClockRate*(prop.memoryBusWidth/8)/1.0e6) << endl; + if (!prop.unifiedAddressing) { + cerr << "[cnn] GPU does not support unified addressing.\n"; + abort(); + } CUDA_CHECK(cudaSetDevice(i)); CUDA_CHECK(cudaMemGetInfo( &free_bytes, &total_bytes )); CUDA_CHECK(cudaDeviceReset()); - cerr << "[cnn] Memory Free (MB): " << (int)free_bytes/1.0e6 << "/" << (int)total_bytes/1.0e6 << endl << endl; - if(free_bytes > max_free) { - max_free = free_bytes; - selected = i; - } + cerr << "[cnn] Memory Free (GB): " << free_bytes/1.0e9 << "/" << total_bytes/1.0e9 << endl; + cerr << "[cnn]" << endl; + gpu_free_mem[i] = free_bytes; + } + stable_sort(gpus.begin(), gpus.end(), [&](int a, int b) -> bool { return gpu_free_mem[a] > gpu_free_mem[b]; }); + gpus.resize(requested_gpus); + cerr << "[cnn] Device(s) selected:"; + for (int i = 0; i < requested_gpus; ++i) { + cerr << ' ' << gpus[i]; + //Device* d = new Device_GPU(gpus[i]); } + selected = gpus[0]; cerr << "[cnn] **USING DEVICE: " << selected << endl; CUDA_CHECK(cudaSetDevice(selected)); CUBLAS_CHECK(cublasCreate(&cublas_handle)); diff --git a/cnn/devices.cc b/cnn/devices.cc new file mode 100644 index 000000000..f13ce97f9 --- /dev/null +++ b/cnn/devices.cc @@ -0,0 +1,15 @@ +#include "cnn/devices.h" + +#include "cnn/cuda.h" + +namespace cnn { + +#if HAVE_CUDA +Device_GPU::Device_GPU(int device_id) : Device(DeviceType::GPU) { +} +#endif + +Device_CPU::Device_CPU() : Device(DeviceType::CPU) { +} + +} // namespace cnn diff --git a/cnn/devices.h b/cnn/devices.h new file mode 100644 index 000000000..90096e9e1 --- /dev/null +++ b/cnn/devices.h @@ -0,0 +1,41 @@ +#ifndef CNN_DEVICES_H +#define CNN_DEVICES_H + +#include +#include "cnn/aligned-mem-pool.h" + +namespace cnn { + +enum class DeviceType {CPU, GPU}; + +class Device { + protected: + Device(DeviceType t) : type(t) {} + virtual ~Device(); + public: + DeviceType type; + AlignedMemoryPool<6>* fxs; + AlignedMemoryPool<6>* dEdfs; + AlignedMemoryPool<6>* ps; + float* kSCALAR_MINUSONE; + float* kSCALAR_ONE; + float* kSCALAR_ZERO; + std::string name; +}; + +#if HAVE_CUDA +class Device_GPU : public Device { + public: + Device_GPU(int device_id); + int cuda_device_id; +}; +#endif + +class Device_CPU : public Device { + public: + Device_CPU(); +}; + +} // namespace cnn + +#endif diff --git a/cnn/init.cc b/cnn/init.cc index ea10cfcb7..154feade3 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -30,10 +30,9 @@ static void RemoveArgs(int& argc, char**& argv, int& argi, int n) { void Initialize(int& argc, char**& argv, unsigned random_seed, bool shared_parameters) { #if HAVE_CUDA - cerr << "[cnn] using GPU\n"; + cerr << "[cnn] initializing CUDA\n"; Initialize_GPU(argc, argv); #else - cerr << "[cnn] using CPU\n"; kSCALAR_MINUSONE = (float*) cnn_mm_malloc(sizeof(float), 256); *kSCALAR_MINUSONE = -1; kSCALAR_ONE = (float*) cnn_mm_malloc(sizeof(float), 256); From 782f9324e431cce3e1dc0dfb7a34f67bece0abf7 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 28 Jan 2016 00:25:28 -0500 Subject: [PATCH 398/965] fix link error --- cnn/devices.cc | 6 ++++++ cnn/devices.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/cnn/devices.cc b/cnn/devices.cc index f13ce97f9..8e927e9f9 100644 --- a/cnn/devices.cc +++ b/cnn/devices.cc @@ -4,12 +4,18 @@ namespace cnn { +Device::~Device() {} + #if HAVE_CUDA Device_GPU::Device_GPU(int device_id) : Device(DeviceType::GPU) { } + +Device_GPU::~Device_GPU() {} #endif Device_CPU::Device_CPU() : Device(DeviceType::CPU) { } +Device_CPU::~Device_CPU() {} + } // namespace cnn diff --git a/cnn/devices.h b/cnn/devices.h index 90096e9e1..692f877b6 100644 --- a/cnn/devices.h +++ b/cnn/devices.h @@ -27,6 +27,7 @@ class Device { class Device_GPU : public Device { public: Device_GPU(int device_id); + ~Device_GPU(); int cuda_device_id; }; #endif @@ -34,6 +35,7 @@ class Device_GPU : public Device { class Device_CPU : public Device { public: Device_CPU(); + ~Device_CPU(); }; } // namespace cnn From 18fa35e294cd890032ddb35069617e564fa8b9a8 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 28 Jan 2016 00:41:09 -0500 Subject: [PATCH 399/965] stub for multi-GPU support --- cnn/cnn.h | 9 +++++++++ cnn/devices.h | 2 ++ cnn/init.cc | 4 ++++ 3 files changed, 15 insertions(+) diff --git a/cnn/cnn.h b/cnn/cnn.h index 408781256..68013fdb9 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -12,6 +12,7 @@ #include "cnn/aligned-mem-pool.h" #include "cnn/tensor.h" #include "cnn/model.h" +#include "cnn/devices.h" // Computation graph where nodes represent forward and backward intermediate // values, and edges represent functions of multiple values. To represent the @@ -31,6 +32,14 @@ extern float* kSCALAR_MINUSONE; extern float* kSCALAR_ONE; extern float* kSCALAR_ZERO; +// devices provide information about GPUs and CPUs +// these include any API information that is required to make calls +// to the GPU as well as the memory pools for the device +// Device is not copyable, so you can use the pointer to uniquely +// identify the device +extern std::vector devices; // [0] is always the CPU +extern Device* default_device; // where parameters go by default + class ExecutionEngine; struct ParameterNodeBase; struct Node; diff --git a/cnn/devices.h b/cnn/devices.h index 692f877b6..52c5626be 100644 --- a/cnn/devices.h +++ b/cnn/devices.h @@ -11,6 +11,8 @@ enum class DeviceType {CPU, GPU}; class Device { protected: Device(DeviceType t) : type(t) {} + Device(const Device&) = delete; + Device& operator=(const Device&) = delete; virtual ~Device(); public: DeviceType type; diff --git a/cnn/init.cc b/cnn/init.cc index 154feade3..a517c2ff1 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -21,6 +21,10 @@ AlignedMemoryPool* dEdfs = nullptr; AlignedMemoryPool* ps = nullptr; mt19937* rndeng = nullptr; +// these should maybe live in a file called globals.cc or something +std::vector devices; +Device* default_device; + static void RemoveArgs(int& argc, char**& argv, int& argi, int n) { for (int i = argi + n; i < argc; ++i) argv[i - n] = argv[i]; From b70538596d877bb9f012ccb8b65d74828a8581a1 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 28 Jan 2016 15:02:52 +0900 Subject: [PATCH 400/965] Batching affine transform for speed improvements! --- cnn/nodes.cc | 33 +++++++++++++++++++++++---------- cnn/nodes.h | 1 + 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 18004b5bf..c57e8544f 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1608,9 +1608,13 @@ void AffineTransform::forward_impl(const vector& xs, Tensor& fx) for (unsigned i = 1; i < xs.size(); i += 2) // fx = (acc_sclar)*fx + xs[0] * xs[1] CUDAMatrixMultiply(*xs[i], *xs[i + 1], fx, (i == 1) ? kSCALAR_ZERO : kSCALAR_ONE); - assert(fx.d.bd == 1); - assert(xs[0]->d.bd == 1); - CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v, 1, fx.v, 1)); + if(fx.d.bd == xs[0]->d.bd) { + CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v, 1, fx.v, 1)); + } else { + // TODO: Any better way to do broadcasting? + for(unsigned b = 0; b < fx.d.bd; ++b) + CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.batch_size(), kSCALAR_ONE, xs[0]->batch_ptr(b), 1, fx.batch_ptr(b), 1)); + } #else assert(fx.d.bd == 1); // Add, using broadcasting or not @@ -1672,14 +1676,23 @@ void AffineTransform::backward_impl(const vector& xs, } else { // right argument of matrix multiply int max_b = max(xs[i-1]->d.bd, dEdf.d.bd); #if HAVE_CUDA - // TODO: Add reverse - for(int b = 0; b < max_b; ++b) - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, - dEdxi.d.rows(), dEdxi.d.cols(), xs[i-1]->d.rows(), + // Do a single multiply if xs[i-1] has one batch + if(xs[i-1]->d.bd == 1) { + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, + dEdxi.d.rows(), dEdxi.d.cols()*dEdxi.d.batch_elems(), xs[i-1]->d.rows(), kSCALAR_ONE, - xs[i-1]->batch_ptr(b), xs[i-1]->d.rows(), - dEdf.batch_ptr(b), xs[i-1]->d.rows(), - kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); + xs[i-1]->v, xs[i-1]->d.rows(), + dEdf.v, dEdf.d.rows(), + kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); + } else { + for(int b = 0; b < max_b; ++b) + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, + dEdxi.d.rows(), dEdxi.d.cols(), xs[i-1]->d.rows(), + kSCALAR_ONE, + xs[i-1]->batch_ptr(b), xs[i-1]->d.rows(), + dEdf.batch_ptr(b), dEdf.d.rows(), + kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); + } #else if(xs[i-1]->d.bd == 1) { dEdxi.colbatch_matrix().noalias() += (**xs[i-1]).transpose() * dEdf.colbatch_matrix(); diff --git a/cnn/nodes.h b/cnn/nodes.h index 8342ea77c..ebe3bde0f 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -563,6 +563,7 @@ struct AffineTransform : public Node { template explicit AffineTransform(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, From 6b4b841a481a459a10633e92ff0abe760ba79403 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 28 Jan 2016 08:55:14 -0500 Subject: [PATCH 401/965] Removed assertions in CPU AffineTransform --- cnn/nodes.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index c57e8544f..6d1d65a46 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1616,7 +1616,6 @@ void AffineTransform::forward_impl(const vector& xs, Tensor& fx) CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.batch_size(), kSCALAR_ONE, xs[0]->batch_ptr(b), 1, fx.batch_ptr(b), 1)); } #else - assert(fx.d.bd == 1); // Add, using broadcasting or not if(fx.d.bd > 1 && xs[0]->d.bd == 1) { fx.rowcol_matrix().colwise() = xs[0]->vec(); @@ -1650,7 +1649,6 @@ void AffineTransform::backward_impl(const vector& xs, #if HAVE_CUDA CUBLAS_CHECK(cublasSaxpy(cublas_handle, dEdxi.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); #else - assert(fx.d.bd == 1); // Add, using broadcasting or not if(dEdxi.d.bd > 1 && dEdf.d.bd == 1) { dEdxi.rowcol_matrix().colwise() += dEdf.vec(); From c2a30f6a0fa42ef70d1493ac0588d43bdbf4b85f Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 29 Jan 2016 12:51:12 -0500 Subject: [PATCH 402/965] Added squared norm --- cnn/expr.cc | 2 ++ cnn/expr.h | 1 + cnn/nodes-common.cc | 11 +++++++++++ cnn/nodes.cc | 23 +++++++++++++++++++++++ cnn/nodes.h | 13 +++++++++++++ 5 files changed, 50 insertions(+) diff --git a/cnn/expr.cc b/cnn/expr.cc index 8bdfc0aee..e95519822 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -76,6 +76,8 @@ Expression inverse(const Expression& x) { return Expression(x.pg, x.pg->add_func Expression trace_of_product(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} +Expression squared_norm(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } + Expression dot_product(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression squared_distance(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression huber_distance(const Expression& x, const Expression& y, real c) { return Expression(x.pg, x.pg->add_function({x.i, y.i}, c)); } diff --git a/cnn/expr.h b/cnn/expr.h index 01de3f7f9..d42a10cfd 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -94,6 +94,7 @@ Expression inverse(const Expression& x); Expression trace_of_product(const Expression& x, const Expression& y); Expression cwise_multiply(const Expression& x, const Expression& y); +Expression squared_norm(const Expression& x); Expression dot_product(const Expression& x, const Expression& y); Expression squared_distance(const Expression& x, const Expression& y); Expression huber_distance(const Expression& x, const Expression& y, float c = 1.345f); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 699acca9f..accd8dac1 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -837,6 +837,17 @@ Dim PoissonRegressionLoss::dim_forward(const vector& xs) const { return xs[0]; } +string SquaredNorm::as_string(const vector& arg_names) const { + ostringstream s; + s << "|| " << arg_names[0] << " ||^2"; + return s.str(); +} + +Dim SquaredNorm::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return Dim({1}, xs[0].bd); +} + string SquaredEuclideanDistance::as_string(const vector& arg_names) const { ostringstream s; s << "|| " << arg_names[0] << " - " << arg_names[1] << " ||^2"; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 6d1d65a46..9c3f1241d 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1830,6 +1830,29 @@ void PoissonRegressionLoss::backward_impl(const vector& xs, #endif } +void SquaredNorm::forward_impl(const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); +#if HAVE_CUDA + throw std::runtime_error("SquaredNorm not yet implemented for CUDA"); +#else + fx.v[0] = xs[0]->vec().squaredNorm(); +#endif +} + +void SquaredNorm::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 1); +#if HAVE_CUDA + throw std::runtime_error("SquaredNorm not yet implemented for CUDA"); +#else + real scale = dEdf.v[0] * 2; + dEdxi.vec().noalias() += scale * xs[0]->vec(); +#endif +} + void SquaredEuclideanDistance::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); #if HAVE_CUDA diff --git a/cnn/nodes.h b/cnn/nodes.h index ebe3bde0f..6e753cd33 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -693,6 +693,19 @@ struct PoissonRegressionLoss : public Node { const unsigned* pty; }; +// y = || x_1 ||^2 +struct SquaredNorm : public Node { + explicit SquaredNorm(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = || x_1 - x_2 ||^2 struct SquaredEuclideanDistance : public Node { explicit SquaredEuclideanDistance(const std::initializer_list& a) : Node(a) {} From d8e7295c454705ffaf3e9d52282a9a3125ec93d7 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 30 Jan 2016 04:12:43 +0900 Subject: [PATCH 403/965] Fixed infinite loop in gpu argument reading --- cnn/cuda.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/cuda.cc b/cnn/cuda.cc index 9eefddb81..3f1ff3584 100644 --- a/cnn/cuda.cc +++ b/cnn/cuda.cc @@ -35,7 +35,7 @@ void Initialize_GPU(int& argc, char**& argv) { int argi = 1; bool ngpus_requested = false; bool ids_requested = false; - while(argi < argc) { + for( ;argi < argc; ++argi) { string arg = argv[argi]; if (arg == "--cnn_gpus" || arg == "--cnn-gpus") { if ((argi + 1) > argc) { From ef2ac5f11be6978beb0f3b545cf0243fbb54948c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 29 Jan 2016 16:38:19 -0500 Subject: [PATCH 404/965] Improved batching support for simple functions --- cnn/nodes.cc | 187 +++++++++++++++++++++++---------------------------- cnn/nodes.h | 25 +++++++ 2 files changed, 111 insertions(+), 101 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 9c3f1241d..385f94b98 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -192,11 +192,11 @@ void Min::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("Min not yet implemented for CUDA"); #else - auto y = *fx; - auto x1 = **xs[0]; - auto x2 = **xs[1]; + auto y = fx.vec(); + auto x1 = xs[0]->vec(); + auto x2 = xs[1]->vec(); Tensor t(fx.d, static_cast(aux_mem)); - auto u = *t; + auto u = t.vec(); u = (x1.array() < x2.array()).matrix().cast(); y = x1.cwiseMin(x2); #endif @@ -213,9 +213,9 @@ void Min::backward_impl(const vector& xs, #else const Tensor t(dEdxi.d, static_cast(aux_mem)); if (i == 0) { - *dEdxi += (*t).cwiseProduct(*dEdf); + dEdxi.vec() += t.vec().cwiseProduct(dEdf.vec()); } else { - *dEdxi += (*t).binaryExpr(*dEdf, FMaxBackwardInv()); + dEdxi.vec() += t.vec().binaryExpr(dEdf.vec(), FMaxBackwardInv()); } #endif } @@ -228,11 +228,11 @@ void Max::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("Max not yet implemented for CUDA"); #else - auto y = *fx; - auto x1 = **xs[0]; - auto x2 = **xs[1]; + auto y = fx.vec(); + auto x1 = xs[0]->vec(); + auto x2 = xs[1]->vec(); Tensor t(fx.d, static_cast(aux_mem)); - auto u = *t; + auto u = t.vec(); u = (x1.array() > x2.array()).matrix().cast(); y = x1.cwiseMax(x2); #endif @@ -249,9 +249,9 @@ void Max::backward_impl(const vector& xs, #else const Tensor t(dEdxi.d, static_cast(aux_mem)); if (i == 0) { - *dEdxi += (*t).cwiseProduct(*dEdf); + dEdxi.vec() += t.vec().cwiseProduct(dEdf.vec()); } else { - *dEdxi += (*t).binaryExpr(*dEdf, FMaxBackwardInv()); + dEdxi.vec() += t.vec().binaryExpr(dEdf.vec(), FMaxBackwardInv()); } #endif } @@ -285,7 +285,7 @@ void ConstScalarMultiply::forward_impl(const vector& xs, Tensor& #ifdef HAVE_CUDA throw std::runtime_error("ConstantScalarMultiply not yet implemented for CUDA"); #else - *fx = (**xs[0]) * alpha; + fx.vec() = xs[0]->vec() * alpha; #endif } @@ -298,7 +298,7 @@ void ConstScalarMultiply::backward_impl(const vector& xs, #ifdef HAVE_CUDA throw std::runtime_error("ScalarMultiply not yet implemented for CUDA"); #else - *dEdxi += *dEdf * alpha; + dEdxi.vec() += dEdf.vec() * alpha; #endif } @@ -518,7 +518,7 @@ void GaussianNoise::forward_impl(const vector& xs, Tensor& fx) co #else Tensor m(dim, (float*)aux_mem); TensorTools::RandomizeNormal(0, stddev, m); - (*fx) = **xs[0] + *m; + fx.vec() = xs[0]->vec() + m.vec(); #endif } @@ -530,7 +530,7 @@ void GaussianNoise::backward_impl(const vector& xs, #ifdef HAVE_CUDA throw std::runtime_error("GaussianNoise not yet implemented for CUDA"); #else - *dEdxi += *dEdf; + dEdxi.vec() += dEdf.vec(); #endif } @@ -599,8 +599,7 @@ void ConstantPlusX::forward_impl(const vector& xs, Tensor& fx) co #ifdef HAVE_CUDA throw std::runtime_error("ConstantPlusX not yet implemented for CUDA"); #else - auto x = **xs[0]; - *fx = x.unaryExpr(const_add_op(c)); + fx.vec() = xs[0]->vec().unaryExpr(const_add_op(c)); #endif } @@ -609,15 +608,14 @@ void ConstantPlusX::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - *dEdxi += *dEdf; + dEdxi.vec() += dEdf.vec(); } void ConstantMinusX::forward_impl(const vector& xs, Tensor& fx) const { #if HAVE_CUDA gpu::vconstant_minusx(fx.d.size(), c, xs[0]->v, fx.v); #else - auto x = **xs[0]; - *fx = x.unaryExpr(const_minus_op(c)); + fx.vec() = xs[0]->vec().unaryExpr(const_minus_op(c)); #endif } @@ -629,7 +627,7 @@ void ConstantMinusX::backward_impl(const vector& xs, #if HAVE_CUDA gpu::vnegate_backward(dEdxi.d.size(), dEdf.v, dEdxi.v); #else - *dEdxi -= *dEdf; + dEdxi.vec() -= dEdf.vec(); #endif } @@ -696,16 +694,16 @@ void Sum::forward_impl(const vector& xs, Tensor& fx) const { for (unsigned i = 0; i < num_args; ++i) CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[i]->v, 1, fx.v, 1)); #else - auto res = *fx; + auto res = fx.vec(); const unsigned remainder = num_args % 4; switch (remainder) { case 0: res.setZero(); break; - case 1: res = **xs[0]; break; - case 2: res = **xs[0] + **xs[1]; break; - case 3: res = **xs[0] + **xs[1] + **xs[2]; break; + case 1: res = xs[0]->vec(); break; + case 2: res = xs[0]->vec() + xs[1]->vec(); break; + case 3: res = xs[0]->vec() + xs[1]->vec() + xs[2]->vec(); break; } for (unsigned i = remainder; i < num_args; i += 4) - res += **xs[i] + **xs[i+1] + **xs[i+2] + **xs[i+3]; + res += xs[i]->vec() + xs[i+1]->vec() + xs[i+2]->vec() + xs[i+3]->vec(); #endif } @@ -718,7 +716,7 @@ void Sum::backward_impl(const vector& xs, #if HAVE_CUDA CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); #else - *dEdxi += *dEdf; + dEdxi.vec() += dEdf.vec(); #endif } @@ -764,16 +762,16 @@ void Average::forward_impl(const vector& xs, Tensor& fx) const { fx.v = xs[0]->v; return; } - auto res = *fx; + auto res = fx.vec(); const unsigned remainder = num_args % 4; switch (remainder) { case 0: res.setZero(); break; - case 1: res = **xs[0]; break; - case 2: res = **xs[0] + **xs[1]; break; - case 3: res = **xs[0] + **xs[1] + **xs[2]; break; + case 1: res = xs[0]->vec(); break; + case 2: res = xs[0]->vec() + xs[1]->vec(); break; + case 3: res = xs[0]->vec() + xs[1]->vec() + xs[2]->vec(); break; } for (unsigned i = remainder; i < num_args; i += 4) - res += **xs[i] + **xs[i+1] + **xs[i+2] + **xs[i+3]; + res += xs[i]->vec() + xs[i+1]->vec() + xs[i+2]->vec() + xs[i+3]->vec(); res /= num_args; } @@ -782,15 +780,14 @@ void Average::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - *dEdxi += (*dEdf / xs.size()); + dEdxi.vec() += (dEdf.vec() / xs.size()); } void Sqrt::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("Sqrt not yet implemented for CUDA"); #else - auto x = **xs[0]; - (*fx) = x.cwiseSqrt(); + fx.vec() = xs[0]->vec().cwiseSqrt(); #endif } @@ -802,7 +799,7 @@ void Sqrt::backward_impl(const vector& xs, #ifdef HAVE_CUDA throw std::runtime_error("Sqrt not yet implemented for CUDA"); #else - *dEdxi += (*fx).binaryExpr(*dEdf, FSqrtBackward()); + dEdxi.vec() += fx.vec().binaryExpr(*dEdf, FSqrtBackward()); #endif } @@ -810,8 +807,7 @@ void Erf::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("Erf not yet implemented for CUDA"); #else - auto x = **xs[0]; - (*fx).array() = x.array().erf(); + fx.vec().array() = xs[0]->vec().array().erf(); #endif } @@ -823,8 +819,7 @@ void Erf::backward_impl(const vector& xs, #ifdef HAVE_CUDA throw std::runtime_error("Erf not yet implemented for CUDA"); #else - auto x = **xs[0]; - *dEdxi += x.binaryExpr(*dEdf, scalar_erf_backward_op()); + dEdxi.vec() += xs[0]->vec().binaryExpr(dEdf.vec(), scalar_erf_backward_op()); #endif } @@ -832,8 +827,7 @@ void Tanh::forward_impl(const vector& xs, Tensor& fx) const { #if HAVE_CUDA gpu::vtanh(fx.d.size(), xs[0]->v, fx.v); #else - auto x = **xs[0]; - (*fx).array() = x.array().tanh(); + fx.vec().array() = xs[0]->vec().array().tanh(); #endif } @@ -845,7 +839,7 @@ void Tanh::backward_impl(const vector& xs, #if HAVE_CUDA gpu::vtanh_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); #else - *dEdxi += (*fx).binaryExpr(*dEdf, scalar_tanh_backward_op()); + dEdxi.vec() += fx.vec().binaryExpr(dEdf.vec(), scalar_tanh_backward_op()); #endif } @@ -853,8 +847,7 @@ void Square::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("Square not yet implemented for CUDA"); #else - auto x = **xs[0]; - (*fx).array() = x.array().square(); + fx.vec().array() = xs[0]->vec().array().square(); #endif } @@ -866,8 +859,7 @@ void Square::backward_impl(const vector& xs, #ifdef HAVE_CUDA throw std::runtime_error("Square not yet implemented for CUDA"); #else - auto x = **xs[0]; - *dEdxi += (*dEdf).cwiseProduct(x) * 2; + dEdxi.vec() += dEdf.vec().cwiseProduct(xs[0]->vec()) * 2; #endif } @@ -875,8 +867,7 @@ void Cube::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("Square not yet implemented for CUDA"); #else - auto x = **xs[0]; - (*fx).array() = x.array().cube(); + fx.vec().array() = xs[0]->vec().array().cube(); #endif } @@ -888,9 +879,8 @@ void Cube::backward_impl(const vector& xs, #ifdef HAVE_CUDA throw std::runtime_error("Cube not yet implemented for CUDA"); #else - auto x = **xs[0]; // *dEdxi += (*dEdf).cwiseProduct(x.cwiseProduct(x)) * 3; - (*dEdxi).array() += (*dEdf).array() * x.array().square() * 3; + dEdxi.vec().array() += dEdf.vec().array() * xs[0]->vec().array().square() * 3; #endif } @@ -898,8 +888,7 @@ void Exp::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("Exp not yet implemented for CUDA"); #else - auto x = **xs[0]; - *fx = x.array().exp(); + fx.vec() = xs[0]->vec().array().exp(); #endif } @@ -911,7 +900,7 @@ void Exp::backward_impl(const vector& xs, #ifdef HAVE_CUDA throw std::runtime_error("Exp not yet implemented for CUDA"); #else - *dEdxi += (*dEdf).cwiseProduct(*fx); + dEdxi.vec() += dEdf.vec().cwiseProduct(fx.vec()); #endif } @@ -919,8 +908,7 @@ void LogGamma::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("LogGamma not yet implemented for CUDA"); #else - auto x = **xs[0]; - *fx = x.array().lgamma(); + fx.vec() = xs[0]->vec().array().lgamma(); #endif } @@ -932,8 +920,7 @@ void LogGamma::backward_impl(const vector& xs, #ifdef HAVE_CUDA throw std::runtime_error("LogGamma not yet implemented for CUDA"); #else - auto x = **xs[0]; - *dEdxi += x.binaryExpr(*dEdf, FLogGammaBackward()); + dEdxi.vec() += xs[0]->vec().binaryExpr(dEdf.vec(), FLogGammaBackward()); #endif } @@ -941,8 +928,7 @@ void Log::forward_impl(const vector& xs, Tensor& fx) const { #if HAVE_CUDA gpu::vlog(fx.d.size(), xs[0]->v, fx.v); #else - auto x = **xs[0]; - *fx = x.array().log(); + fx.vec() = xs[0]->vec().array().log(); #endif } @@ -954,8 +940,7 @@ void Log::backward_impl(const vector& xs, #if HAVE_CUDA gpu::vlog_backward(fx.d.size(), xs[0]->v, dEdf.v, dEdxi.v); #else - auto x = **xs[0]; - *dEdxi += (*dEdf).cwiseQuotient(x); + dEdxi.vec() += dEdf.vec().cwiseQuotient(xs[0]->vec()); #endif } @@ -1041,9 +1026,9 @@ void PairwiseRankLoss::forward_impl(const vector& xs, Tensor& fx) #if HAVE_CUDA gpu::vpairwise_rank_loss(fx.d.size(), margin, xs[0]->v, xs[1]->v, fx.v); #else - auto a = **xs[0]; - auto b = **xs[1]; - *fx = a.binaryExpr(b, FPairwiseRankLoss(margin)); + auto a = xs[0]->vec(); + auto b = xs[1]->vec(); + fx.vec() = a.binaryExpr(b, FPairwiseRankLoss(margin)); #endif } @@ -1056,9 +1041,9 @@ void PairwiseRankLoss::backward_impl(const vector& xs, gpu::vpairwise_rank_loss_backward(dEdf.d.size(), (i == 0), fx.v, dEdf.v, dEdxi.v); #else if (i == 0) { - *dEdxi -= (*fx).binaryExpr(*dEdf, FRectifyBackward()); + dEdxi.vec() -= fx.vec().binaryExpr(dEdf.vec(), FRectifyBackward()); } else { - *dEdxi += (*fx).binaryExpr(*dEdf, FRectifyBackward()); + dEdxi.vec() += fx.vec().binaryExpr(dEdf.vec(), FRectifyBackward()); } #endif } @@ -1123,7 +1108,7 @@ void Identity::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - *dEdxi += *dEdf; + dEdxi.vec() += dEdf.vec(); } void MaxPooling1D::forward_impl(const vector& xs, Tensor& fx) const { @@ -1538,9 +1523,9 @@ void CwiseQuotient::forward_impl(const vector& xs, Tensor& fx) co #ifdef HAVE_CUDA throw std::runtime_error("CwiseQuotient::forward not yet implemented for CUDA"); #else - auto x1 = **xs[0]; - auto x2 = **xs[1]; - *fx = x1.cwiseQuotient(x2); + auto x1 = xs[0]->vec(); + auto x2 = xs[1]->vec(); + fx.vec() = x1.cwiseQuotient(x2); #endif } @@ -1554,12 +1539,12 @@ void CwiseQuotient::backward_impl(const vector& xs, throw std::runtime_error("CwiseQuotient::backward not yet implemented for CUDA"); #else if (i == 0) { - auto x2 = **xs[1]; - *dEdxi += (*dEdf).cwiseQuotient(x2); + auto x2 = xs[1]->vec(); + dEdxi.vec() += dEdf.vec().cwiseQuotient(x2); } else { // i = 1 - auto x1 = **xs[0]; - auto x2 = **xs[1]; - *dEdxi -= (*dEdf).cwiseQuotient(x2.cwiseProduct(x2)).cwiseProduct(x1); + auto x1 = xs[0]->vec(); + auto x2 = xs[1]->vec(); + dEdxi.vec() -= dEdf.vec().cwiseQuotient(x2.cwiseProduct(x2)).cwiseProduct(x1); } #endif } @@ -1569,9 +1554,9 @@ void CwiseMultiply::forward_impl(const vector& xs, Tensor& fx) co #if HAVE_CUDA gpu::vcwise_product(fx.d.size(), xs[0]->v, xs[1]->v, fx.v); #else - auto x1 = **xs[0]; - auto x2 = **xs[1]; - *fx = x1.cwiseProduct(x2); + auto x1 = xs[0]->vec(); + auto x2 = xs[1]->vec(); + fx.vec() = x1.cwiseProduct(x2); #endif } @@ -1585,15 +1570,15 @@ void CwiseMultiply::backward_impl(const vector& xs, #if HAVE_CUDA gpu::vcwise_product_backward(fx.d.size(), dEdf.v, xs[1]->v, dEdxi.v); #else - auto x2 = **xs[1]; - *dEdxi += (*dEdf).cwiseProduct(x2); + auto x2 = xs[1]->vec(); + dEdxi.vec() += dEdf.vec().cwiseProduct(x2); #endif } else { #if HAVE_CUDA gpu::vcwise_product_backward(fx.d.size(), dEdf.v, xs[0]->v, dEdxi.v); #else - auto x1 = **xs[0]; - *dEdxi += (*dEdf).cwiseProduct(x1); + auto x1 = xs[0]->vec(); + dEdxi.vec() += dEdf.vec().cwiseProduct(x1); #endif } } @@ -1707,8 +1692,8 @@ void Negate::forward_impl(const vector& xs, Tensor& fx) const { #if HAVE_CUDA gpu::vnegate(fx.d.size(), xs[0]->v, fx.v); #else - auto x = **xs[0]; - *fx = -x; + auto x = xs[0]->vec(); + fx.vec() = -x; #endif } @@ -1721,7 +1706,7 @@ void Negate::backward_impl(const vector& xs, #if HAVE_CUDA gpu::vnegate_backward(fx.d.size(), dEdf.v, dEdxi.v); #else - *dEdxi -= *dEdf; + dEdxi.vec() -= dEdf.vec(); #endif } @@ -1730,8 +1715,8 @@ void Rectify::forward_impl(const vector& xs, Tensor& fx) const { #if HAVE_CUDA gpu::vrelu(fx.d.size(), xs[0]->v, fx.v); #else - auto x = **xs[0]; - *fx = x.cwiseMax(0.f); + auto x = xs[0]->vec(); + fx.vec() = x.cwiseMax(0.f); #endif } @@ -1743,7 +1728,7 @@ void Rectify::backward_impl(const vector& xs, #if HAVE_CUDA gpu::vrelu_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); #else - *dEdxi += (*fx).binaryExpr(*dEdf, FRectifyBackward()); + dEdxi.vec() += fx.vec().binaryExpr(dEdf.vec(), FRectifyBackward()); #endif } @@ -1783,8 +1768,8 @@ void L1Distance::forward_impl(const vector& xs, Tensor& fx) const #ifdef HAVE_CUDA throw std::runtime_error("L1Distance not yet implemented for CUDA"); #else - auto x = **xs[0]; - auto y = **xs[1]; + auto x = xs[0]->vec(); + auto y = xs[1]->vec(); fx.v[0] = (x - y).lpNorm<1>(); #endif } @@ -1798,9 +1783,9 @@ void L1Distance::backward_impl(const vector& xs, #ifdef HAVE_CUDA throw std::runtime_error("L1Distance not yet implemented for CUDA"); #else - auto x = **xs[i]; - auto y = **xs[1-i]; - *dEdxi += (x - y).unaryExpr(FL1Backward(dEdf.v[0])); + auto x = xs[i]->vec(); + auto y = xs[1-i]->vec(); + dEdxi.vec() += (x - y).unaryExpr(FL1Backward(dEdf.v[0])); #endif } @@ -1886,8 +1871,8 @@ void LogisticSigmoid::forward_impl(const vector& xs, Tensor& fx) #if HAVE_CUDA gpu::vlogistic(fx.d.size(), xs[0]->v, fx.v); #else - auto x = **xs[0]; - *fx = x.unaryExpr(scalar_logistic_sigmoid_op()); + auto x = xs[0]->vec(); + fx.vec() = x.unaryExpr(scalar_logistic_sigmoid_op()); #endif } @@ -1899,7 +1884,7 @@ void LogisticSigmoid::backward_impl(const vector& xs, #if HAVE_CUDA gpu::vlogistic_backward(dEdf.d.size(), fx.v, dEdf.v, dEdxi.v); #else - *dEdxi += (*fx).binaryExpr(*dEdf, scalar_logistic_sigmoid_backward_op()); + dEdxi.vec() += fx.vec().binaryExpr(dEdf.vec(), scalar_logistic_sigmoid_backward_op()); #endif } @@ -1908,8 +1893,8 @@ void SoftSign::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("SoftSign not yet implemented for CUDA"); #else - auto x = **xs[0]; - *fx = x.unaryExpr(FSoftSign()); + auto x = xs[0]->vec(); + fx.vec() = x.unaryExpr(FSoftSign()); #endif } @@ -1921,7 +1906,7 @@ void SoftSign::backward_impl(const vector& xs, #ifdef HAVE_CUDA throw std::runtime_error("SoftSign not yet implemented for CUDA"); #else - *dEdxi += (*fx).binaryExpr(*dEdf, FSoftSignBackward()); + dEdxi.vec() += fx.vec().binaryExpr(dEdf.vec(), FSoftSignBackward()); #endif } diff --git a/cnn/nodes.h b/cnn/nodes.h index 6e753cd33..738717eaa 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -86,6 +86,7 @@ struct Min : public Node { explicit Min(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, @@ -100,6 +101,7 @@ struct Max : public Node { template explicit Max(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, @@ -127,6 +129,7 @@ struct ConstScalarMultiply : public Node { explicit ConstScalarMultiply(const std::initializer_list& a, float alpha) : Node(a), alpha(alpha) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -246,6 +249,7 @@ struct GaussianNoise : public Node { explicit GaussianNoise(const std::initializer_list& a, real stddev) : Node(a), stddev(stddev) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, @@ -293,6 +297,7 @@ struct ConstantPlusX : public Node { explicit ConstantPlusX(const std::initializer_list& a, real o) : Node(a), c(o) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -308,6 +313,7 @@ struct ConstantMinusX : public Node { explicit ConstantMinusX(const std::initializer_list& a, real o) : Node(a), c(o) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -322,6 +328,7 @@ struct Sqrt : public Node { explicit Sqrt(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -335,6 +342,7 @@ struct Erf : public Node { explicit Erf(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -348,6 +356,7 @@ struct Tanh : public Node { explicit Tanh(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -361,6 +370,7 @@ struct Square : public Node { explicit Square(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -374,6 +384,7 @@ struct Cube : public Node { explicit Cube(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -387,6 +398,7 @@ struct Exp : public Node { explicit Exp(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -400,6 +412,7 @@ struct LogGamma : public Node { explicit LogGamma(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -413,6 +426,7 @@ struct Log : public Node { explicit Log(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -459,6 +473,7 @@ struct PairwiseRankLoss : public Node { explicit PairwiseRankLoss(const std::initializer_list& a, real m = 1.0) : Node(a), margin(m) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -492,6 +507,7 @@ struct Identity : public Node { explicit Identity(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -537,6 +553,7 @@ struct CwiseMultiply : public Node { explicit CwiseMultiply(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -550,6 +567,7 @@ struct CwiseQuotient : public Node { explicit CwiseQuotient(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -577,6 +595,7 @@ struct Negate : public Node { explicit Negate(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -590,6 +609,7 @@ struct Rectify : public Node { explicit Rectify(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -635,6 +655,7 @@ struct Sum : public Node { template explicit Sum(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -662,6 +683,7 @@ struct Average : public Node { template explicit Average(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -738,6 +760,7 @@ struct L1Distance : public Node { explicit L1Distance(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -751,6 +774,7 @@ struct LogisticSigmoid : public Node { explicit LogisticSigmoid(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -764,6 +788,7 @@ struct SoftSign : public Node { explicit SoftSign(const std::initializer_list& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, From 9ff790f06f00966b52239f63c56a75ffe5efca72 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 30 Jan 2016 22:23:39 -0500 Subject: [PATCH 405/965] Added batched version of pick --- cnn/expr.cc | 5 ++++ cnn/expr.h | 6 ++++- cnn/nodes.cc | 31 +++++++++++++++++------- cnn/nodes.h | 22 +++++++++++------ tests/test-nodes.cc | 58 ++++++++++++++++++++++++++++++--------------- 5 files changed, 87 insertions(+), 35 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index e95519822..d3b0cfdbb 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -93,11 +93,16 @@ Expression kmax_pooling(const Expression& x, unsigned k) { return Expression(x.p Expression fold_rows(const Expression& x, unsigned nrows) { return Expression(x.pg, x.pg->add_function({x.i}, nrows)); } Expression pick(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } +Expression pick(const Expression& x, const vector & v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } Expression pick(const Expression& x, unsigned* pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } +Expression pick(const Expression& x, const vector * pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } + Expression pickrange(const Expression& x, unsigned v, unsigned u) { return Expression(x.pg, x.pg->add_function({x.i}, v, u)); } Expression pickneglogsoftmax(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } Expression pickneglogsoftmax(const Expression& x, const vector & v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } +Expression pickneglogsoftmax(const Expression& x, unsigned* pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } +Expression pickneglogsoftmax(const Expression& x, const vector * pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } Expression sum_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index d42a10cfd..f993f1e01 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -117,10 +117,14 @@ Expression sum_batches(const Expression& x); // pick parts out of bigger objects Expression pick(const Expression& x, unsigned v); -Expression pick(const Expression& x, unsigned* pv); +Expression pick(const Expression& x, const std::vector & v); +Expression pick(const Expression& x, unsigned * pv); +Expression pick(const Expression& x, const std::vector * pv); Expression pickrange(const Expression& x, unsigned v, unsigned u); Expression pickneglogsoftmax(const Expression& x, unsigned v); Expression pickneglogsoftmax(const Expression& x, const std::vector & v); +Expression pickneglogsoftmax(const Expression& x, unsigned * pv); +Expression pickneglogsoftmax(const Expression& x, const std::vector * pv); namespace detail { template diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 385f94b98..7f6e577a3 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1347,16 +1347,25 @@ void RestrictedLogSoftmax::backward_impl(const vector& xs, // x_1 is a vector // y = (x_1)_{*pval} void PickElement::forward_impl(const vector& xs, Tensor& fx) const { - if (*pval >= xs[0]->d.rows()) { - cerr << "PickElement::forward_impl requested element " << *pval - << "from a vector of length " << xs[0]->d.rows() << endl; - abort(); - } #ifdef HAVE_CUDA throw std::runtime_error("PickElement not yet implemented for CUDA"); #else - auto x = **xs[0]; - fx.v[0] = x(*pval); + if(pval) { + if (*pval >= xs[0]->d.rows()) { + cerr << "PickElement::forward_impl requested element " << *pval + << "from a vector of length " << xs[0]->d.rows() << endl; + abort(); + } + auto x = **xs[0]; + fx.v[0] = x(*pval); + } else { + assert(pvals); + assert(pvals->size() == fx.d.batch_elems()); + for(unsigned b = 0; b < pvals->size(); ++b) { + auto x = xs[0]->batch_matrix(b); + fx.v[b] = x((*pvals)[b]); + } + } #endif } @@ -1370,7 +1379,13 @@ void PickElement::backward_impl(const vector& xs, #ifdef HAVE_CUDA throw std::runtime_error("PickElement not yet implemented for CUDA"); #else - (*dEdxi)(*pval) += dEdf.v[0]; + if(pval) { + (*dEdxi)(*pval) += dEdf.v[0]; + } else { + assert(pvals); + for(unsigned b = 0; b < pvals->size(); ++b) + dEdxi.batch_matrix(b)((*pvals)[b]) += dEdf.v[b]; + } #endif } diff --git a/cnn/nodes.h b/cnn/nodes.h index 738717eaa..4c3f7dc5d 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -655,7 +655,9 @@ struct Sum : public Node { template explicit Sum(const T& a) : Node(a) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; - virtual bool supports_multibatch() const override { return true; } + // TODO: Sum should be be implemented over the entire mini-batch, but this is not + // super-easy in the current implementation + // virtual bool supports_multibatch() const override { return true; } void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, const Tensor& fx, @@ -829,10 +831,10 @@ struct LogSoftmax : public Node { // y = (x_1)_element - \log z struct PickNegLogSoftmax : public Node { explicit PickNegLogSoftmax(const std::initializer_list& a, unsigned v) : Node(a), val(v), pval(&val), vals(), pvals() {} - // use this constructor if you want to change the value after the graph is constructed - explicit PickNegLogSoftmax(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv), vals(), pvals() {} + // use this constructor if you want to perform mini-batching explicit PickNegLogSoftmax(const std::initializer_list& a, const std::vector& v) : Node(a), val(), pval(), vals(v), pvals(&vals) {} - // use this constructor if you want to change the value after the graph is constructed + // use these constructors if you want to change the value after the graph is constructed + explicit PickNegLogSoftmax(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv), vals(), pvals() {} explicit PickNegLogSoftmax(const std::initializer_list& a, const std::vector* pv) : Node(a), val(), pval(), vals(), pvals(pv) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; @@ -869,9 +871,13 @@ struct RestrictedLogSoftmax : public Node { // y = (x_1)_{*pval} // this is used to implement cross-entropy training struct PickElement : public Node { - explicit PickElement(const std::initializer_list& a, unsigned v) : Node(a), val(v), pval(&val) {} - // use this constructor if you want to change the value after the graph is constructed - explicit PickElement(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv) {} + explicit PickElement(const std::initializer_list& a, unsigned v) : Node(a), val(v), pval(&val), vals(), pvals() {} + // use this constructor if you want to perform mini-batching + explicit PickElement(const std::initializer_list& a, const std::vector& v) : Node(a), val(), pval(), vals(v), pvals(&vals) {} + // use these constructors if you want to change the value after the graph is constructed + explicit PickElement(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv), vals(), pvals() {} + explicit PickElement(const std::initializer_list& a, const std::vector* pv) : Node(a), val(), pval(), vals(), pvals(pv) {} + virtual bool supports_multibatch() const override { return true; } std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward_impl(const std::vector& xs, Tensor& fx) const override; @@ -882,6 +888,8 @@ struct PickElement : public Node { Tensor& dEdxi) const override; unsigned val; const unsigned* pval; + std::vector vals; + const std::vector* pvals; }; // x_1 is a vector diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 3de95c187..9d1809a6b 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -21,6 +21,7 @@ struct NodeTest { ones3_vals = {1.f,1.f,1.f}; first_one_vals = {1.f,0.f,0.f}; ones2_vals = {1.f,1.f}; + batch_vals = {1.f,2.f,3.f,4.f,5.f,6.f}; // Create parameters std::vector param1_vals = {1.1f,-2.2f,3.3f}; std::vector param2_vals = {2.2f,3.4f,-1.2f}; @@ -51,7 +52,7 @@ struct NodeTest { return oss.str(); } - std::vector ones3_vals, ones2_vals, first_one_vals; + std::vector ones3_vals, ones2_vals, first_one_vals, batch_vals; std::vector av; cnn::Model mod; cnn::Parameters *param1, *param2, *param3, *param_scalar1, *param_scalar2; @@ -366,23 +367,25 @@ BOOST_AUTO_TEST_CASE( max_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } -// Expression noise(const Expression& x, real stddev); -BOOST_AUTO_TEST_CASE( noise_gradient ) { - cnn::ComputationGraph cg; - Expression x1 = parameter(cg, param1); - Expression y = noise(x1, 0.5); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); -} +// TODO: Noise is random, so it cannot be tested simply? +// // Expression noise(const Expression& x, real stddev); +// BOOST_AUTO_TEST_CASE( noise_gradient ) { +// cnn::ComputationGraph cg; +// Expression x1 = parameter(cg, param1); +// Expression y = noise(x1, 0.5); +// input(cg, {1,3}, ones3_vals) * y; +// BOOST_CHECK(CheckGrad(mod, cg, 0)); +// } -// Expression dropout(const Expression& x, real p); -BOOST_AUTO_TEST_CASE( dropout_gradient ) { - cnn::ComputationGraph cg; - Expression x1 = parameter(cg, param1); - Expression y = dropout(x1, 0.5); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); -} +// TODO: Dropout scales the gradients at training time, so they don't match. +// // Expression dropout(const Expression& x, real p); +// BOOST_AUTO_TEST_CASE( dropout_gradient ) { +// cnn::ComputationGraph cg; +// Expression x1 = parameter(cg, param1); +// Expression y = dropout(x1, 0.5); +// input(cg, {1,3}, ones3_vals) * y; +// BOOST_CHECK(CheckGrad(mod, cg, 0)); +// } // Expression block_dropout(const Expression& x, real p); // TODO @@ -509,6 +512,16 @@ BOOST_AUTO_TEST_CASE( pickptr_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression pickneglogsoftmax(const Expression& x, unsigned v); +BOOST_AUTO_TEST_CASE( pick_batch_gradient ) { + std::vector idx = {1,2}; + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = input(cg, Dim({3},2), batch_vals); + sum_batches(pick(x1+x2, idx)); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression pickrange(const Expression& x, unsigned v, unsigned u); BOOST_AUTO_TEST_CASE( pickrange_gradient ) { cnn::ComputationGraph cg; @@ -527,7 +540,14 @@ BOOST_AUTO_TEST_CASE( pickneglogsoftmax_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } -// Expression pickneglogsoftmax(const Expression& x, const std::vector & v); -// TODO: Not covered yet +// Expression pickneglogsoftmax(const Expression& x, unsigned v); +BOOST_AUTO_TEST_CASE( pickneglogsoftmax_batch_gradient ) { + std::vector idx = {1,2}; + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = input(cg, Dim({3},2), batch_vals); + sum_batches(pickneglogsoftmax(x1+x2, idx)); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} BOOST_AUTO_TEST_SUITE_END() From 39c7abb4dde7ef39a10027f267acaedf1e1a7d52 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 31 Jan 2016 09:47:53 -0500 Subject: [PATCH 406/965] Added const to expression value getter --- cnn/expr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/expr.h b/cnn/expr.h index f993f1e01..df7f9750e 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -12,7 +12,7 @@ struct Expression { Expression() : pg(nullptr) { } Expression(ComputationGraph *pg, VariableIndex i) : pg(pg), i(i) { } - const Tensor& value() { return pg->get_value(i); } + const Tensor& value() const { return pg->get_value(i); } }; Expression input(ComputationGraph& g, real s); From d8f21bb7d87be9a120f5192fc2bd5d9f600ac82a Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 31 Jan 2016 12:30:05 -0500 Subject: [PATCH 407/965] Fixed batching problem in concat --- cnn/nodes-common.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index accd8dac1..03da87e9c 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -488,7 +488,7 @@ Dim Concatenate::dim_forward(const vector& xs) const { if (LooksLikeVector(c)) c.resize(1); new_rows += c[0]; dr.set(0, c[0]); - if (dr != c) { + if (dr.single_batch() != c.single_batch()) { ostringstream s; s << "Bad input dimensions in Concatenate: " << xs; throw std::invalid_argument(s.str()); } From 99858e9bd7049ecf5591f05f8f86684eaa01b2c6 Mon Sep 17 00:00:00 2001 From: austinma Date: Mon, 1 Feb 2016 23:47:09 -0500 Subject: [PATCH 408/965] ParameterIndices --- cnn/c2w.h | 2 +- cnn/cfsm-builder.cc | 45 ++++++++++++++++----- cnn/cfsm-builder.h | 68 +++++++++++++++++++++++++------ cnn/cnn.cc | 20 ++++----- cnn/cnn.h | 20 ++++----- cnn/deep-lstm.cc | 24 +++++------ cnn/deep-lstm.h | 2 +- cnn/expr.cc | 20 ++++----- cnn/expr.h | 20 ++++----- cnn/fast-lstm.cc | 26 ++++++------ cnn/fast-lstm.h | 2 +- cnn/gru.cc | 22 +++++----- cnn/gru.h | 2 +- cnn/hsm-builder.cc | 24 +++++++---- cnn/hsm-builder.h | 35 ++++++++++++++-- cnn/init.cc | 3 +- cnn/init.h | 2 +- cnn/lstm.cc | 26 ++++++------ cnn/lstm.h | 2 +- cnn/model.cc | 70 ++++++++++++++++++++++++++++++-- cnn/model.h | 32 ++++++++++++++- cnn/mp.h | 74 ++++++++++++++++++++++++++++++++++ cnn/param-nodes.cc | 28 ++++++------- cnn/param-nodes.h | 18 ++++----- cnn/rnn.cc | 22 +++++----- cnn/rnn.h | 2 +- examples/embed-cl.cc | 4 +- examples/encdec.cc | 16 ++++---- examples/nlm.cc | 2 +- examples/poisson-regression.cc | 6 +-- examples/read-write.cc | 2 +- examples/rnnlm-aevb.cc | 22 +++++----- examples/rnnlm-batch.cc | 6 +-- examples/rnnlm-cfsm.cc | 2 +- examples/rnnlm-givenbag.cc | 6 +-- examples/rnnlm-mp.cc | 2 +- examples/rnnlm.cc | 6 +-- examples/rnnlm.h | 6 +-- examples/rnnlm2.cc | 6 +-- examples/segrnn-sup.cc | 34 ++++++++-------- examples/skiprnnlm.cc | 6 +-- examples/tag-bilstm.cc | 12 +++--- examples/textcat.cc | 24 +++++------ examples/tok-embed.cc | 26 ++++++------ examples/xor-batch-lookup.cc | 20 ++++----- rnnlm/lm.cc | 10 ++--- tests/test-nodes.cc | 12 +++--- 47 files changed, 554 insertions(+), 287 deletions(-) diff --git a/cnn/c2w.h b/cnn/c2w.h index 49c25629f..dcdb91eb9 100644 --- a/cnn/c2w.h +++ b/cnn/c2w.h @@ -15,7 +15,7 @@ namespace cnn { struct C2WBuilder { LSTMBuilder fc2w; LSTMBuilder rc2w; - LookupParameters* p_lookup; + LookupParameterIndex p_lookup; std::vector words; std::map wordid2vi; explicit C2WBuilder(int vocab_size, diff --git a/cnn/cfsm-builder.cc b/cnn/cfsm-builder.cc index 608bb6ccd..f33c0928a 100644 --- a/cnn/cfsm-builder.cc +++ b/cnn/cfsm-builder.cc @@ -3,6 +3,9 @@ #include #include +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::StandardSoftmaxBuilder) +//BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ClassFactoredSoftmaxBuilder) + using namespace std; namespace cnn { @@ -12,22 +15,36 @@ using namespace expr; inline bool is_ws(char x) { return (x == ' ' || x == '\t'); } inline bool not_ws(char x) { return (x != ' ' && x != '\t'); } -NonFactoredSoftmaxBuilder::NonFactoredSoftmaxBuilder(unsigned rep_dim, unsigned vocab_size, Model* model) { - p_w = model->add_parameters({vocab_size, rep_dim}); - p_b = model->add_parameters({vocab_size}); +SoftmaxBuilder::~SoftmaxBuilder() {} + +StandardSoftmaxBuilder::StandardSoftmaxBuilder() {} + +StandardSoftmaxBuilder::StandardSoftmaxBuilder(unsigned rep_dim, unsigned vocab_size, Model* model) : rep_dim(rep_dim), vocab_size(vocab_size) { + initialize(*model); +} + +void StandardSoftmaxBuilder::initialize(Model& model) { + std::cerr << "initializing StandardSoftmax builder:" << vocab_size << ", " << rep_dim << std::endl; + if (p_w.mp == nullptr) { + p_w = model.add_parameters({vocab_size, rep_dim}); + p_b = model.add_parameters({vocab_size}); + } + else { + std::cerr << "jk lol" << std::endl; + } } -void NonFactoredSoftmaxBuilder::new_graph(ComputationGraph& cg) { +void StandardSoftmaxBuilder::new_graph(ComputationGraph& cg) { pcg = &cg; w = parameter(cg, p_w); b = parameter(cg, p_b); } -Expression NonFactoredSoftmaxBuilder::neg_log_softmax(const Expression& rep, unsigned wordidx) { +Expression StandardSoftmaxBuilder::neg_log_softmax(const Expression& rep, unsigned wordidx) { return pickneglogsoftmax(affine_transform({b, w, rep}), wordidx); } -unsigned NonFactoredSoftmaxBuilder::sample(const expr::Expression& rep) { +unsigned StandardSoftmaxBuilder::sample(const expr::Expression& rep) { softmax(affine_transform({b, w, rep})); vector dist = as_vector(pcg->incremental_forward()); unsigned c = 0; @@ -42,14 +59,20 @@ unsigned NonFactoredSoftmaxBuilder::sample(const expr::Expression& rep) { return c; } +ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder() {} + ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, Dict* word_dict, - Model* model) { + Model* model) : rep_dim(rep_dim) { ReadClusterFile(cluster_file, word_dict); + initialize(*model); +} + +void ClassFactoredSoftmaxBuilder::initialize(Model& model) { const unsigned num_clusters = cdict.size(); - p_r2c = model->add_parameters({num_clusters, rep_dim}); - p_cbias = model->add_parameters({num_clusters}); + p_r2c = model.add_parameters({num_clusters, rep_dim}); + p_cbias = model.add_parameters({num_clusters}); p_rc2ws.resize(num_clusters); p_rcwbiases.resize(num_clusters); for (unsigned i = 0; i < num_clusters; ++i) { @@ -58,8 +81,8 @@ ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder(unsigned rep_dim, if (num_words_in_cluster > 1) { // for singleton clusters, we don't need these parameters, so // we don't create them - p_rc2ws[i] = model->add_parameters({num_words_in_cluster, rep_dim}); - p_rcwbiases[i] = model->add_parameters({num_words_in_cluster}); + p_rc2ws[i] = model.add_parameters({num_words_in_cluster, rep_dim}); + p_rcwbiases[i] = model.add_parameters({num_words_in_cluster}); } } } diff --git a/cnn/cfsm-builder.h b/cnn/cfsm-builder.h index 8583565e7..45126c2bf 100644 --- a/cnn/cfsm-builder.h +++ b/cnn/cfsm-builder.h @@ -3,16 +3,20 @@ #include #include +#include +#include +#include +#include #include "cnn/cnn.h" #include "cnn/expr.h" #include "cnn/dict.h" namespace cnn { -struct Parameters; - -class FactoredSoftmaxBuilder { +class SoftmaxBuilder { public: + virtual ~SoftmaxBuilder(); + // call this once per ComputationGraph virtual void new_graph(ComputationGraph& cg) = 0; @@ -21,26 +25,47 @@ class FactoredSoftmaxBuilder { // samples a word from p(w,c | rep) virtual unsigned sample(const expr::Expression& rep) = 0; + + // add parameters to a model. Usually called after deserializing. + virtual void initialize(Model& model) = 0; + +private: + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) {} }; -class NonFactoredSoftmaxBuilder : public FactoredSoftmaxBuilder { +class StandardSoftmaxBuilder : public SoftmaxBuilder { public: - NonFactoredSoftmaxBuilder(unsigned rep_dim, unsigned vocab_size, Model* model); + StandardSoftmaxBuilder(unsigned rep_dim, unsigned vocab_size, Model* model); void new_graph(ComputationGraph& cg); expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx); unsigned sample(const expr::Expression& rep); + void initialize(Model& model); + private: - Parameters* p_w; - Parameters* p_b; + StandardSoftmaxBuilder(); + unsigned rep_dim, vocab_size; + ParameterIndex p_w; + ParameterIndex p_b; expr::Expression w; expr::Expression b; ComputationGraph* pcg; + + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + boost::serialization::void_cast_register(); + std::cerr << "serializing standardsoftmaxbuilder" << std::endl; + ar & rep_dim; + ar & vocab_size; + } }; // helps with implementation of hierarchical softmax // read a file with lines of the following format // CLASSID word [freq] -class ClassFactoredSoftmaxBuilder : public FactoredSoftmaxBuilder { +class ClassFactoredSoftmaxBuilder : public SoftmaxBuilder { public: ClassFactoredSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, @@ -50,9 +75,13 @@ class ClassFactoredSoftmaxBuilder : public FactoredSoftmaxBuilder { void new_graph(ComputationGraph& cg); expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx); unsigned sample(const expr::Expression& rep); + void initialize(Model& model); private: + ClassFactoredSoftmaxBuilder(); void ReadClusterFile(const std::string& cluster_file, Dict* word_dict); + + unsigned rep_dim; Dict cdict; std::vector widx2cidx; // will be -1 if not present std::vector widx2cwidx; // word index to word index inside of cluster @@ -60,10 +89,10 @@ class ClassFactoredSoftmaxBuilder : public FactoredSoftmaxBuilder { std::vector singleton_cluster; // does cluster contain a single word type? // parameters - Parameters* p_r2c; - Parameters* p_cbias; - std::vector p_rc2ws; // len = number of classes - std::vector p_rcwbiases; // len = number of classes + ParameterIndex p_r2c; + ParameterIndex p_cbias; + std::vector p_rc2ws; // len = number of classes + std::vector p_rcwbiases; // len = number of classes // Expressions for current graph inline expr::Expression& get_rc2w(unsigned cluster_idx) { @@ -83,8 +112,21 @@ class ClassFactoredSoftmaxBuilder : public FactoredSoftmaxBuilder { expr::Expression cbias; std::vector rc2ws; std::vector rc2biases; -}; + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + boost::serialization::void_cast_register(); + ar & rep_dim; + ar & cdict; + ar & widx2cidx; + ar & widx2cwidx; + ar & cidx2words; + ar & singleton_cluster; + } +}; } // namespace cnn +BOOST_CLASS_EXPORT_KEY(cnn::StandardSoftmaxBuilder) +BOOST_CLASS_EXPORT_KEY(cnn::ClassFactoredSoftmaxBuilder) #endif diff --git a/cnn/cnn.cc b/cnn/cnn.cc index fa6db72bc..80758b195 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -105,7 +105,7 @@ VariableIndex ComputationGraph::add_input(const Dim& d, const vector* pm) return new_node_index; } -VariableIndex ComputationGraph::add_parameters(Parameters* p) { +VariableIndex ComputationGraph::add_parameters(ParameterIndex p) { VariableIndex new_node_index(nodes.size()); ParameterNode* new_node = new ParameterNode(p); nodes.push_back(new_node); @@ -114,7 +114,7 @@ VariableIndex ComputationGraph::add_parameters(Parameters* p) { return new_node_index; } -VariableIndex ComputationGraph::add_const_parameters(Parameters* p) { +VariableIndex ComputationGraph::add_const_parameters(ParameterIndex p) { VariableIndex new_node_index(nodes.size()); ConstParameterNode* new_node = new ConstParameterNode(p); nodes.push_back(new_node); @@ -122,7 +122,7 @@ VariableIndex ComputationGraph::add_const_parameters(Parameters* p) { return new_node_index; } -VariableIndex ComputationGraph::add_lookup(LookupParameters* p, const unsigned* pindex) { +VariableIndex ComputationGraph::add_lookup(LookupParameterIndex p, const unsigned* pindex) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, pindex); nodes.push_back(new_node); @@ -131,7 +131,7 @@ VariableIndex ComputationGraph::add_lookup(LookupParameters* p, const unsigned* return new_node_index; } -VariableIndex ComputationGraph::add_lookup(LookupParameters* p, unsigned index) { +VariableIndex ComputationGraph::add_lookup(LookupParameterIndex p, unsigned index) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, index); nodes.push_back(new_node); @@ -140,7 +140,7 @@ VariableIndex ComputationGraph::add_lookup(LookupParameters* p, unsigned index) return new_node_index; } -VariableIndex ComputationGraph::add_lookup(LookupParameters* p, const std::vector& indices) { +VariableIndex ComputationGraph::add_lookup(LookupParameterIndex p, const std::vector& indices) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, indices); nodes.push_back(new_node); @@ -149,7 +149,7 @@ VariableIndex ComputationGraph::add_lookup(LookupParameters* p, const std::vecto return new_node_index; } -VariableIndex ComputationGraph::add_lookup(LookupParameters* p, const std::vector* indices) { +VariableIndex ComputationGraph::add_lookup(LookupParameterIndex p, const std::vector* indices) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, indices); nodes.push_back(new_node); @@ -159,7 +159,7 @@ VariableIndex ComputationGraph::add_lookup(LookupParameters* p, const std::vecto } -VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, const unsigned* pindex) { +VariableIndex ComputationGraph::add_const_lookup(LookupParameterIndex p, const unsigned* pindex) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, pindex); // get rid of the following in favor of using parameter_nodes to see the needs_derivative @@ -169,7 +169,7 @@ VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, const unsi return new_node_index; } -VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, unsigned index) { +VariableIndex ComputationGraph::add_const_lookup(LookupParameterIndex p, unsigned index) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, index); nodes.push_back(new_node); @@ -177,7 +177,7 @@ VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, unsigned i return new_node_index; } -VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, const std::vector& indices) { +VariableIndex ComputationGraph::add_const_lookup(LookupParameterIndex p, const std::vector& indices) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, indices); nodes.push_back(new_node); @@ -185,7 +185,7 @@ VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, const std: return new_node_index; } -VariableIndex ComputationGraph::add_const_lookup(LookupParameters* p, const std::vector* indices) { +VariableIndex ComputationGraph::add_const_lookup(LookupParameterIndex p, const std::vector* indices) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, indices); nodes.push_back(new_node); diff --git a/cnn/cnn.h b/cnn/cnn.h index 68013fdb9..58511147d 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -68,19 +68,19 @@ struct ComputationGraph { // parameters are things that are optimized. in contrast to a system like // Torch where computational modules may have their own parameters, in CNN // parameters are just parameters - VariableIndex add_parameters(Parameters* p); - VariableIndex add_const_parameters(Parameters* p); + VariableIndex add_parameters(ParameterIndex p); + VariableIndex add_const_parameters(ParameterIndex p); // use pindex to point to a memory location where the index will live // that the caller owns - VariableIndex add_lookup(LookupParameters* p, const unsigned* pindex); - VariableIndex add_lookup(LookupParameters* p, unsigned index); - VariableIndex add_lookup(LookupParameters* p, const std::vector* pindices); - VariableIndex add_lookup(LookupParameters* p, const std::vector& indices); + VariableIndex add_lookup(LookupParameterIndex p, const unsigned* pindex); + VariableIndex add_lookup(LookupParameterIndex p, unsigned index); + VariableIndex add_lookup(LookupParameterIndex p, const std::vector* pindices); + VariableIndex add_lookup(LookupParameterIndex p, const std::vector& indices); // just like add_lookup, but don't optimize the lookup parameters - VariableIndex add_const_lookup(LookupParameters* p, const unsigned* pindex); - VariableIndex add_const_lookup(LookupParameters* p, unsigned index); - VariableIndex add_const_lookup(LookupParameters* p, const std::vector* pindices); - VariableIndex add_const_lookup(LookupParameters* p, const std::vector& indices); + VariableIndex add_const_lookup(LookupParameterIndex p, const unsigned* pindex); + VariableIndex add_const_lookup(LookupParameterIndex p, unsigned index); + VariableIndex add_const_lookup(LookupParameterIndex p, const std::vector* pindices); + VariableIndex add_const_lookup(LookupParameterIndex p, const std::vector& indices); // COMPUTATIONS template inline VariableIndex add_function(const std::initializer_list& arguments); diff --git a/cnn/deep-lstm.cc b/cnn/deep-lstm.cc index e3d6a2ff0..3af889fac 100644 --- a/cnn/deep-lstm.cc +++ b/cnn/deep-lstm.cc @@ -21,24 +21,24 @@ DeepLSTMBuilder::DeepLSTMBuilder(unsigned layers, unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // i - Parameters* p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2i = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_c2i = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bi = model->add_parameters({hidden_dim}); + ParameterIndex p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); + ParameterIndex p_h2i = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_c2i = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_bi = model->add_parameters({hidden_dim}); // o - Parameters* p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2o = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_c2o = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bo = model->add_parameters({hidden_dim}); + ParameterIndex p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); + ParameterIndex p_h2o = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_c2o = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_bo = model->add_parameters({hidden_dim}); // c - Parameters* p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2c = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bc = model->add_parameters({hidden_dim}); + ParameterIndex p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); + ParameterIndex p_h2c = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_bc = model->add_parameters({hidden_dim}); layer_input_dim = hidden_dim + input_dim; // output (hidden) from 1st layer is input to next - vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; + vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; params.push_back(ps); } // layers } diff --git a/cnn/deep-lstm.h b/cnn/deep-lstm.h index 6b49f7c86..ca4c26485 100644 --- a/cnn/deep-lstm.h +++ b/cnn/deep-lstm.h @@ -32,7 +32,7 @@ struct DeepLSTMBuilder : public RNNBuilder { public: // first index is layer, then ... - std::vector> params; + std::vector> params; // first index is layer, then ... std::vector> param_vars; diff --git a/cnn/expr.cc b/cnn/expr.cc index d3b0cfdbb..f0d5c1965 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -13,16 +13,16 @@ Expression input(ComputationGraph& g, real s) { return Expression(&g, g.add_inpu Expression input(ComputationGraph& g, const real *ps) { return Expression(&g, g.add_input(ps)); } Expression input(ComputationGraph& g, const Dim& d, const vector& data) { return Expression(&g, g.add_input(d, data)); } Expression input(ComputationGraph& g, const Dim& d, const vector* pdata) { return Expression(&g, g.add_input(d, pdata)); } -Expression const_parameter(ComputationGraph& g, Parameters* p) { return Expression(&g, g.add_const_parameters(p)); } -Expression parameter(ComputationGraph& g, Parameters* p) { return Expression(&g, g.add_parameters(p)); } -Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index) { return Expression(&g, g.add_lookup(p, index)); } -Expression lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex) { return Expression(&g, g.add_lookup(p, pindex)); } -Expression lookup(ComputationGraph& g, LookupParameters* p, const vector& indices) { return Expression(&g, g.add_lookup(p, indices)); } -Expression lookup(ComputationGraph& g, LookupParameters* p, const vector* pindices) { return Expression(&g, g.add_lookup(p, pindices)); } -Expression const_lookup(ComputationGraph& g, LookupParameters* p, unsigned index) { return Expression(&g, g.add_const_lookup(p, index)); } -Expression const_lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex) { return Expression(&g, g.add_const_lookup(p, pindex)); } -Expression const_lookup(ComputationGraph& g, LookupParameters* p, const vector& indices) { return Expression(&g, g.add_const_lookup(p, indices)); } -Expression const_lookup(ComputationGraph& g, LookupParameters* p, const vector* pindices) { return Expression(&g, g.add_const_lookup(p, pindices)); } +Expression const_parameter(ComputationGraph& g, ParameterIndex p) { return Expression(&g, g.add_const_parameters(p)); } +Expression parameter(ComputationGraph& g, ParameterIndex p) { return Expression(&g, g.add_parameters(p)); } +Expression lookup(ComputationGraph& g, LookupParameterIndex p, unsigned index) { return Expression(&g, g.add_lookup(p, index)); } +Expression lookup(ComputationGraph& g, LookupParameterIndex p, const unsigned* pindex) { return Expression(&g, g.add_lookup(p, pindex)); } +Expression lookup(ComputationGraph& g, LookupParameterIndex p, const vector& indices) { return Expression(&g, g.add_lookup(p, indices)); } +Expression lookup(ComputationGraph& g, LookupParameterIndex p, const vector* pindices) { return Expression(&g, g.add_lookup(p, pindices)); } +Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, unsigned index) { return Expression(&g, g.add_const_lookup(p, index)); } +Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, const unsigned* pindex) { return Expression(&g, g.add_const_lookup(p, pindex)); } +Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, const vector& indices) { return Expression(&g, g.add_const_lookup(p, indices)); } +Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, const vector* pindices) { return Expression(&g, g.add_const_lookup(p, pindices)); } Expression zeroes(ComputationGraph& g, const Dim& d) { return Expression(&g, g.add_function(d)); } Expression operator-(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index df7f9750e..437635b25 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -19,17 +19,17 @@ Expression input(ComputationGraph& g, real s); Expression input(ComputationGraph& g, const real *ps); Expression input(ComputationGraph& g, const Dim& d, const std::vector& data); Expression input(ComputationGraph& g, const Dim& d, const std::vector* pdata); -Expression parameter(ComputationGraph& g, Parameters* p); -Expression const_parameter(ComputationGraph& g, Parameters* p); -Expression lookup(ComputationGraph& g, LookupParameters* p, unsigned index); -Expression lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex); -Expression const_lookup(ComputationGraph& g, LookupParameters* p, unsigned index); -Expression const_lookup(ComputationGraph& g, LookupParameters* p, const unsigned* pindex); +Expression parameter(ComputationGraph& g, ParameterIndex p); +Expression const_parameter(ComputationGraph& g, ParameterIndex p); +Expression lookup(ComputationGraph& g, LookupParameterIndex p, unsigned index); +Expression lookup(ComputationGraph& g, LookupParameterIndex p, const unsigned* pindex); +Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, unsigned index); +Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, const unsigned* pindex); // Batched versions of lookup and const_lookup -Expression lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices); -Expression lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices); -Expression const_lookup(ComputationGraph& g, LookupParameters* p, const std::vector& indices); -Expression const_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices); +Expression lookup(ComputationGraph& g, LookupParameterIndex p, const std::vector& indices); +Expression lookup(ComputationGraph& g, LookupParameterIndex p, const std::vector* pindices); +Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, const std::vector& indices); +Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, const std::vector* pindices); Expression zeroes(ComputationGraph& g, const Dim& d); Expression operator-(const Expression& x); diff --git a/cnn/fast-lstm.cc b/cnn/fast-lstm.cc index 8c1b09041..deeb60bd4 100644 --- a/cnn/fast-lstm.cc +++ b/cnn/fast-lstm.cc @@ -26,24 +26,24 @@ FastLSTMBuilder::FastLSTMBuilder(unsigned layers, unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // i - Parameters* p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2i = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_c2i = model->add_parameters({hidden_dim, 1}); - Parameters* p_bi = model->add_parameters({hidden_dim}); + ParameterIndex p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); + ParameterIndex p_h2i = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_c2i = model->add_parameters({hidden_dim, 1}); + ParameterIndex p_bi = model->add_parameters({hidden_dim}); // o - Parameters* p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2o = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_c2o = model->add_parameters({hidden_dim, 1}); - Parameters* p_bo = model->add_parameters({hidden_dim}); + ParameterIndex p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); + ParameterIndex p_h2o = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_c2o = model->add_parameters({hidden_dim, 1}); + ParameterIndex p_bo = model->add_parameters({hidden_dim}); // c - Parameters* p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2c = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bc = model->add_parameters({hidden_dim}); + ParameterIndex p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); + ParameterIndex p_h2c = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_bc = model->add_parameters({hidden_dim}); layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; + vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; params.push_back(ps); } // layers } @@ -167,7 +167,7 @@ void FastLSTMBuilder::copy(const RNNBuilder & rnn) { assert(params.size() == rnn_lstm.params.size()); for(size_t i = 0; i < params.size(); ++i) for(size_t j = 0; j < params[i].size(); ++j) - params[i][j]->copy(*rnn_lstm.params[i][j]); + params[i][j] = rnn_lstm.params[i][j]; } } // namespace cnn diff --git a/cnn/fast-lstm.h b/cnn/fast-lstm.h index eb860d167..c6f27200e 100644 --- a/cnn/fast-lstm.h +++ b/cnn/fast-lstm.h @@ -45,7 +45,7 @@ struct FastLSTMBuilder : public RNNBuilder { public: // first index is layer, then ... - std::vector> params; + std::vector> params; // first index is layer, then ... std::vector> param_vars; diff --git a/cnn/gru.cc b/cnn/gru.cc index cb471213f..91aad4376 100644 --- a/cnn/gru.cc +++ b/cnn/gru.cc @@ -21,22 +21,22 @@ GRUBuilder::GRUBuilder(unsigned layers, unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // z - Parameters* p_x2z = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2z = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bz = model->add_parameters({hidden_dim}); + ParameterIndex p_x2z = model->add_parameters({hidden_dim, layer_input_dim}); + ParameterIndex p_h2z = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_bz = model->add_parameters({hidden_dim}); // r - Parameters* p_x2r = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2r = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_br = model->add_parameters({hidden_dim}); + ParameterIndex p_x2r = model->add_parameters({hidden_dim, layer_input_dim}); + ParameterIndex p_h2r = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_br = model->add_parameters({hidden_dim}); // h - Parameters* p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2h = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bh = model->add_parameters({hidden_dim}); + ParameterIndex p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); + ParameterIndex p_h2h = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_bh = model->add_parameters({hidden_dim}); layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - vector ps = {p_x2z, p_h2z, p_bz, p_x2r, p_h2r, p_br, p_x2h, p_h2h, p_bh}; + vector ps = {p_x2z, p_h2z, p_bz, p_x2r, p_h2r, p_br, p_x2h, p_h2h, p_bh}; params.push_back(ps); } // layers } @@ -128,7 +128,7 @@ void GRUBuilder::copy(const RNNBuilder & rnn) { assert(params.size() == rnn_gru.params.size()); for(size_t i = 0; i < params.size(); ++i) for(size_t j = 0; j < params[i].size(); ++j) - params[i][j]->copy(*rnn_gru.params[i][j]); + params[i][j] = rnn_gru.params[i][j]; } } // namespace cnn diff --git a/cnn/gru.h b/cnn/gru.h index ec852f09b..21647fdc2 100644 --- a/cnn/gru.h +++ b/cnn/gru.h @@ -28,7 +28,7 @@ struct GRUBuilder : public RNNBuilder { Expression add_input_impl(int prev, const Expression& x) override; // first index is layer, then ... - std::vector> params; + std::vector> params; // first index is layer, then ... std::vector> param_vars; diff --git a/cnn/hsm-builder.cc b/cnn/hsm-builder.cc index 4ce87d273..b69969c03 100644 --- a/cnn/hsm-builder.cc +++ b/cnn/hsm-builder.cc @@ -5,6 +5,8 @@ #include #include +//BOOST_CLASS_EXPORT_IMPLEMENT(cnn::HierarchicalSoftmaxBuilder) + #undef assert #define assert(x) {} @@ -30,6 +32,7 @@ Cluster* Cluster::add_child(unsigned sym) { unsigned i; if (it == word2ind.end()) { Cluster* c = new Cluster(); + c->rep_dim = rep_dim; c->path = path; c->path.push_back(sym); i = children.size(); @@ -51,25 +54,28 @@ void Cluster::add_word(unsigned word) { } void Cluster::initialize(unsigned rep_dim, Model* model) { + this->rep_dim = rep_dim; + initialize(*model); +} + +void Cluster::initialize(Model& model) { assert (!initialized); output_size = (children.size() > 0) ? children.size() : terminals.size(); assert (output_size > 0); if (output_size == 1) { - p_weights = NULL; - p_bias = NULL; } else if (output_size == 2) { - p_weights = model->add_parameters({1, rep_dim}); - p_bias = model->add_parameters({1}); + p_weights = model.add_parameters({1, rep_dim}); + p_bias = model.add_parameters({1}); } else { - p_weights = model->add_parameters({output_size, rep_dim}); - p_bias = model->add_parameters({output_size}); + p_weights = model.add_parameters({output_size, rep_dim}); + p_bias = model.add_parameters({output_size}); } for (Cluster* child : children) { - child->initialize(rep_dim, model); + child->initialize(model); } } @@ -183,6 +189,10 @@ HierarchicalSoftmaxBuilder::HierarchicalSoftmaxBuilder(unsigned rep_dim, HierarchicalSoftmaxBuilder::~HierarchicalSoftmaxBuilder() { } +void HierarchicalSoftmaxBuilder::initialize(Model& model) { + root->initialize(model); +} + void HierarchicalSoftmaxBuilder::new_graph(ComputationGraph& cg) { pcg = &cg; root->new_graph(cg); diff --git a/cnn/hsm-builder.h b/cnn/hsm-builder.h index f6cdc7b71..74aec78ab 100644 --- a/cnn/hsm-builder.h +++ b/cnn/hsm-builder.h @@ -4,6 +4,10 @@ #include #include #include +#include +#include +#include +#include #include "cnn/cnn.h" #include "cnn/expr.h" #include "cnn/dict.h" @@ -19,19 +23,30 @@ class Cluster { std::vector path; std::vector terminals; std::unordered_map word2ind; - Parameters* p_weights; - Parameters* p_bias; + ParameterIndex p_weights; + ParameterIndex p_bias; mutable expr::Expression weights; mutable expr::Expression bias; bool initialized; + unsigned rep_dim; unsigned output_size; expr::Expression predict(expr::Expression h, ComputationGraph& cg) const; + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & rep_dim; + ar & children; + ar & path; + ar & terminals; + ar & word2ind; + } public: Cluster(); Cluster* add_child(unsigned sym); void add_word(unsigned word); + void initialize(Model& model); void initialize(unsigned rep_dim, Model* model); void new_graph(ComputationGraph& cg); @@ -52,13 +67,16 @@ class Cluster { // helps with implementation of hierarchical softmax // read a file with lines of the following format // CLASSID word [freq] -class HierarchicalSoftmaxBuilder : public FactoredSoftmaxBuilder { +class HierarchicalSoftmaxBuilder : public SoftmaxBuilder { public: HierarchicalSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, Dict* word_dict, Model* model); ~HierarchicalSoftmaxBuilder(); + + void initialize(Model& model); + // call this once per ComputationGraph void new_graph(ComputationGraph& cg); @@ -75,8 +93,17 @@ class HierarchicalSoftmaxBuilder : public FactoredSoftmaxBuilder { ComputationGraph* pcg; Cluster* root; -}; + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + boost::serialization::void_cast_register(); + ar & widx2path; + ar & path_symbols; + ar & root; + } +}; } // namespace cnn +BOOST_CLASS_EXPORT_KEY(cnn::HierarchicalSoftmaxBuilder); #endif diff --git a/cnn/init.cc b/cnn/init.cc index a517c2ff1..8429c0b8e 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -32,7 +32,7 @@ static void RemoveArgs(int& argc, char**& argv, int& argi, int n) { assert(argc >= 0); } -void Initialize(int& argc, char**& argv, unsigned random_seed, bool shared_parameters) { +void Initialize(int& argc, char**& argv, bool shared_parameters) { #if HAVE_CUDA cerr << "[cnn] initializing CUDA\n"; Initialize_GPU(argc, argv); @@ -45,6 +45,7 @@ void Initialize(int& argc, char**& argv, unsigned random_seed, bool shared_param *kSCALAR_ZERO = 0; #endif unsigned long num_mb = 512UL; + unsigned random_seed = 0; int argi = 1; while(argi < argc) { string arg = argv[argi]; diff --git a/cnn/init.h b/cnn/init.h index e9e8fef60..ab7611d77 100644 --- a/cnn/init.h +++ b/cnn/init.h @@ -3,7 +3,7 @@ namespace cnn { -void Initialize(int& argc, char**& argv, unsigned random_seed = 0, bool shared_parameters = false); +void Initialize(int& argc, char**& argv, bool shared_parameters = false); void Cleanup(); } // namespace cnn diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 3d0775ed1..4525f8e61 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -21,24 +21,24 @@ LSTMBuilder::LSTMBuilder(unsigned layers, unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // i - Parameters* p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2i = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_c2i = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bi = model->add_parameters({hidden_dim}); + ParameterIndex p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); + ParameterIndex p_h2i = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_c2i = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_bi = model->add_parameters({hidden_dim}); // o - Parameters* p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2o = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_c2o = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bo = model->add_parameters({hidden_dim}); + ParameterIndex p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); + ParameterIndex p_h2o = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_c2o = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_bo = model->add_parameters({hidden_dim}); // c - Parameters* p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2c = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_bc = model->add_parameters({hidden_dim}); + ParameterIndex p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); + ParameterIndex p_h2c = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_bc = model->add_parameters({hidden_dim}); layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; + vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; params.push_back(ps); } // layers dropout_rate = 0.0f; @@ -155,7 +155,7 @@ void LSTMBuilder::copy(const RNNBuilder & rnn) { assert(params.size() == rnn_lstm.params.size()); for(size_t i = 0; i < params.size(); ++i) for(size_t j = 0; j < params[i].size(); ++j) - params[i][j]->copy(*rnn_lstm.params[i][j]); + params[i][j] = rnn_lstm.params[i][j]; } } // namespace cnn diff --git a/cnn/lstm.h b/cnn/lstm.h index 93ba83272..a9def312d 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -46,7 +46,7 @@ struct LSTMBuilder : public RNNBuilder { public: // first index is layer, then ... - std::vector> params; + std::vector> params; // first index is layer, then ... std::vector> param_vars; diff --git a/cnn/model.cc b/cnn/model.cc index e68c0df30..7761e8db1 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -159,6 +159,64 @@ void LookupParameters::clear() { non_zero_grads.clear(); } +ParameterIndex::ParameterIndex() { + mp = nullptr; + index = 0; +} + +ParameterIndex::ParameterIndex(const Model* mp, unsigned long index) : mp(mp), index(index) {} + +Parameters* ParameterIndex::get() const { + return mp->parameters_list()[index]; +} + +Dim& ParameterIndex::dim() const { + return get()->dim; +} + +Tensor& ParameterIndex::values() const { + return get()->values; +} + +void ParameterIndex::accumulate_grad(const Tensor& g) const { + get()->accumulate_grad(g); +} + +void ParameterIndex::scale_parameters(float a) { + get()->scale_parameters(a); +} + +LookupParameterIndex::LookupParameterIndex() { + mp = nullptr; + index = 0; +} + +LookupParameterIndex::LookupParameterIndex(const Model* mp, unsigned long index) : mp(mp), index(index) {} + +LookupParameters* LookupParameterIndex::get() const { + return mp->lookup_parameters_list()[index]; +} + +Dim& LookupParameterIndex::dim() const { + return get()->dim; +} + +vector& LookupParameterIndex::values() const { + return get()->values; +} + +void LookupParameterIndex::accumulate_grad(unsigned index, const Tensor& g) const { + get()->accumulate_grad(index, g); +} + +void LookupParameterIndex::Initialize(unsigned index, const std::vector& val) const { + get()->Initialize(index, val); +} + +void LookupParameterIndex::scale_parameters(float a) { + get()->scale_parameters(a); +} + Model::~Model() { for (auto p : all_params) delete p; } @@ -199,18 +257,22 @@ float Model::gradient_l2_norm() const { #endif } -Parameters* Model::add_parameters(const Dim& d, float scale) { +ParameterIndex Model::add_parameters(const Dim& d, float scale) { Parameters* p = new Parameters(d, scale); + ParameterIndex r(this, params.size()); + //cerr << "Adding parameters with dim " << d << endl; all_params.push_back(p); params.push_back(p); - return p; + return r; } -LookupParameters* Model::add_lookup_parameters(unsigned n, const Dim& d) { +LookupParameterIndex Model::add_lookup_parameters(unsigned n, const Dim& d) { LookupParameters* p = new LookupParameters(n,d); + LookupParameterIndex r(this, lookup_params.size()); + //cerr << "Adding lookup parameters with dim " << d << " and size " << n << endl; all_params.push_back(p); lookup_params.push_back(p); - return p; + return r; } void Model::reset_gradient() { diff --git a/cnn/model.h b/cnn/model.h index 2e76194eb..5e7a51d35 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -96,6 +96,34 @@ struct LookupParameters : public ParametersBase { BOOST_SERIALIZATION_SPLIT_MEMBER() }; +class Model; +struct ParameterIndex { + ParameterIndex(); + ParameterIndex(const Model* mp, unsigned long index); + Parameters* get() const; + Dim& dim() const; + Tensor& values() const; + void accumulate_grad(const Tensor& g) const; + void scale_parameters(float a); + + const Model* mp; + unsigned long index; +}; + +struct LookupParameterIndex { + LookupParameterIndex(); + LookupParameterIndex(const Model* mp, unsigned long index); + LookupParameters* get() const; + Dim& dim() const; + std::vector& values() const; + void accumulate_grad(unsigned index, const Tensor& g) const; + void Initialize(unsigned index, const std::vector& val) const; + void scale_parameters(float a); + + const Model* mp; + unsigned long index; +}; + // this is a collection of parameters // if you need a matrix of parameters, or a lookup table - ask an instance of this class // this knows how to serialize itself @@ -107,8 +135,8 @@ class Model { float gradient_l2_norm() const; void reset_gradient(); // set scale to use custom initialization - Parameters* add_parameters(const Dim& d, float scale = 0.0f); - LookupParameters* add_lookup_parameters(unsigned n, const Dim& d); + ParameterIndex add_parameters(const Dim& d, float scale = 0.0f); + LookupParameterIndex add_lookup_parameters(unsigned n, const Dim& d); // project weights so their L2 norm = radius void project_weights(float radius = 1.0f); diff --git a/cnn/mp.h b/cnn/mp.h index ec760b90c..c00a1abc7 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -292,5 +292,79 @@ namespace cnn { RunParent(train_data, dev_data, learner, workloads, num_iterations, dev_frequency, report_frequency); } } + + template + void RunSingleProcess(ILearner* learner, Trainer* trainer, const std::vector& train_data, + const std::vector& dev_data, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency) { + std::vector train_indices(train_data.size()); + std::iota(train_indices.begin(), train_indices.end(), 0); + + std::vector dev_indices(dev_data.size()); + std::iota(dev_indices.begin(), dev_indices.end(), 0); + + S best_dev_loss = S(); + bool first_dev_run = true; + std::mt19937 rndeng(42); + for (unsigned iter = 0; iter < num_iterations && !stop_requested; ++iter) { + // Shuffle the training data indices + //std::shuffle(train_indices.begin(), train_indices.end(), rndeng); + + S train_loss = S(); + + unsigned data_processed = 0; + unsigned data_until_report = report_frequency; + std::vector::iterator begin = train_indices.begin(); + while (begin != train_indices.end()) { + std::vector::iterator end = begin + dev_frequency; + if (end > train_indices.end()) { + end = train_indices.end(); + } + S batch_loss; + for (auto it = begin; it != end; ++it) { + unsigned i = *it; + assert (i < train_data.size()); + const D& datum = train_data[i]; + S datum_loss = learner->LearnFromDatum(datum, true); + batch_loss += datum_loss; + train_loss += datum_loss; + trainer->update(); + data_processed++; + + if (--data_until_report == 0) { + data_until_report = report_frequency; + double fractional_iter = iter + 1.0 * data_processed / train_indices.size(); + std::cerr << fractional_iter << "\t" << "loss = " << batch_loss << std::endl; + batch_loss = S(); + } + } + + if (stop_requested) { + break; + } + + S dev_loss; + for (auto it = dev_indices.begin(); it != dev_indices.end(); ++it) { + unsigned i = *it; + assert (i < dev_data.size()); + const D& datum = dev_data[i]; + S datum_loss = learner->LearnFromDatum(datum, false); + dev_loss += datum_loss; + } + bool new_best = (first_dev_run || dev_loss < best_dev_loss); + first_dev_run = false; + double fractional_iter = iter + 1.0 * data_processed / train_indices.size(); + std::cerr << fractional_iter << "\t" << "dev loss = " << dev_loss << (new_best ? " (New best!)" : "") << std::endl; + if (stop_requested) { + break; + } + if (new_best) { + learner->SaveModel(); + best_dev_loss = dev_loss; + } + + begin = end; + } + } + } } } diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index c10a8f041..e6fe24ea5 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -9,7 +9,7 @@ namespace cnn { string ConstParameterNode::as_string(const vector& arg_names) const { ostringstream s; - s << "const_parameters(" << dim << ", " << params << ')'; + s << "const_parameters(" << dim << ')'; return s.str(); } @@ -20,7 +20,7 @@ Dim ConstParameterNode::dim_forward(const vector& xs) const { void ConstParameterNode::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - fx.v = params->values.v; + fx.v = params.values().v; } void ConstParameterNode::backward_impl(const vector& xs, @@ -34,7 +34,7 @@ void ConstParameterNode::backward_impl(const vector& xs, string ParameterNode::as_string(const vector& arg_names) const { ostringstream s; - s << "parameters(" << dim << ", " << params << ')'; + s << "parameters(" << dim << ')'; return s.str(); } @@ -45,7 +45,7 @@ Dim ParameterNode::dim_forward(const vector& xs) const { void ParameterNode::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - fx.v = params->values.v; + fx.v = params.values().v; } void ParameterNode::backward_impl(const vector& xs, @@ -58,7 +58,7 @@ void ParameterNode::backward_impl(const vector& xs, } void ParameterNode::accumulate_grad(const Tensor& g) { - params->accumulate_grad(g); + params.accumulate_grad(g); } string InputNode::as_string(const vector& arg_names) const { @@ -126,7 +126,7 @@ void ScalarInputNode::backward_impl(const vector& xs, string LookupNode::as_string(const vector& arg_names) const { ostringstream s; - s << "lookup_parameters(|x|=" << params->values.size() << " --> " << dim << ')'; + s << "lookup_parameters(|x|=" << params.values().size() << " --> " << dim << ')'; return s.str(); } @@ -137,20 +137,20 @@ Dim LookupNode::dim_forward(const vector& xs) const { void LookupNode::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); if(pindex) { - assert(*pindex < params->values.size()); + assert(*pindex < params.values().size()); assert (fx.d.batch_elems() == 1); - fx.v = params->values[*pindex].v; + fx.v = params.values()[*pindex].v; } else { assert (pindices); assert (fx.d.batch_elems() == pindices->size()); for (unsigned b = 0; b < pindices->size(); ++b) { unsigned i = pindices->at(b); - assert (i < params->values.size()); + assert (i < params.values().size()); float* v = fx.v + fx.d.batch_size() * (b % fx.d.batch_elems()); #if HAVE_CUDA - cudaMemcpyAsync(v, params->values[i].v, fx.d.batch_size() * sizeof(float), cudaMemcpyDeviceToDevice); + cudaMemcpyAsync(v, params.values()[i].v, fx.d.batch_size() * sizeof(float), cudaMemcpyDeviceToDevice); #else - memcpy(v, params->values[i].v, fx.d.batch_size() * sizeof(float)); + memcpy(v, params.values()[i].v, fx.d.batch_size() * sizeof(float)); #endif } } @@ -167,14 +167,14 @@ void LookupNode::backward_impl(const vector& xs, void LookupNode::accumulate_grad(const Tensor& g) { if(pindex) { - params->accumulate_grad(*pindex, g); + params.accumulate_grad(*pindex, g); } else { assert (pindices); const vector& gb = g.batch_elems(); for (unsigned b = 0; b < pindices->size(); ++b) { unsigned i = pindices->at(b); - assert (i < params->values.size()); - params->accumulate_grad(i, gb[b]); + assert (i < params.values().size()); + params.accumulate_grad(i, gb[b]); } } } diff --git a/cnn/param-nodes.h b/cnn/param-nodes.h index 61049dd2a..fdc0c7216 100644 --- a/cnn/param-nodes.h +++ b/cnn/param-nodes.h @@ -12,7 +12,7 @@ struct ParameterNodeBase : public Node { // represents optimizable parameters struct ParameterNode : public ParameterNodeBase { - explicit ParameterNode(Parameters* p) : dim(p->dim), params(p) {} + explicit ParameterNode(ParameterIndex p) : dim(p.dim()), params(p) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward_impl(const std::vector& xs, Tensor& fx) const override; @@ -23,12 +23,12 @@ struct ParameterNode : public ParameterNodeBase { Tensor& dEdxi) const override; void accumulate_grad(const Tensor& g) override; Dim dim; - Parameters* params; + ParameterIndex params; }; // represents optimizable parameters that are being held constant struct ConstParameterNode : public Node { - explicit ConstParameterNode(Parameters* p) : dim(p->dim), params(p) {} + explicit ConstParameterNode(ParameterIndex p) : dim(p.dim()), params(p) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward_impl(const std::vector& xs, Tensor& fx) const override; @@ -38,7 +38,7 @@ struct ConstParameterNode : public Node { unsigned i, Tensor& dEdxi) const override; Dim dim; - Parameters* params; + ParameterIndex params; }; // represents specified (not learned) inputs to the network @@ -77,12 +77,12 @@ struct ScalarInputNode : public Node { // represents a matrix/vector embedding of an item of a discrete set (1-hot coding) struct LookupNode : public ParameterNodeBase { - LookupNode(LookupParameters* p, unsigned ind) : dim(p->dim), index(ind), pindex(&index), indices(), pindices(), params(p) {} - LookupNode(LookupParameters* p, const unsigned* pind) : dim(p->dim), index(), pindex(pind), indices(), pindices(), params(p) {} - LookupNode(LookupParameters* p, const std::vector& indices) : dim(p->dim), index(), pindex(), indices(indices), pindices(&this->indices), params(p) { + LookupNode(LookupParameterIndex p, unsigned ind) : dim(p.dim()), index(ind), pindex(&index), indices(), pindices(), params(p) {} + LookupNode(LookupParameterIndex p, const unsigned* pind) : dim(p.dim()), index(), pindex(pind), indices(), pindices(), params(p) {} + LookupNode(LookupParameterIndex p, const std::vector& indices) : dim(p.dim()), index(), pindex(), indices(indices), pindices(&this->indices), params(p) { dim.bd = pindices->size(); } - LookupNode(LookupParameters* p, const std::vector* pindices) : dim(p->dim), index(), pindex(), indices(), pindices(pindices), params(p) { + LookupNode(LookupParameterIndex p, const std::vector* pindices) : dim(p.dim()), index(), pindex(), indices(), pindices(pindices), params(p) { dim.bd = pindices->size(); } std::string as_string(const std::vector& arg_names) const override; @@ -100,7 +100,7 @@ struct LookupNode : public ParameterNodeBase { const unsigned* pindex; std::vector indices; const std::vector* pindices; - LookupParameters* params; + LookupParameterIndex params; }; } // namespace cnn diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 85d5de2b9..1eb1a6aac 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -25,10 +25,10 @@ SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, bool support_lags) : layers(layers), lagging(support_lags) { unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { - Parameters* p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); - Parameters* p_h2h = model->add_parameters({hidden_dim, hidden_dim}); - Parameters* p_hb = model->add_parameters({hidden_dim}); - vector ps = {p_x2h, p_h2h, p_hb}; + ParameterIndex p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); + ParameterIndex p_h2h = model->add_parameters({hidden_dim, hidden_dim}); + ParameterIndex p_hb = model->add_parameters({hidden_dim}); + vector ps = {p_x2h, p_h2h, p_hb}; if (lagging) ps.push_back(model->add_parameters({hidden_dim, hidden_dim})); params.push_back(ps); @@ -39,16 +39,16 @@ SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, void SimpleRNNBuilder::new_graph_impl(ComputationGraph& cg) { param_vars.clear(); for (unsigned i = 0; i < layers; ++i) { - Parameters* p_x2h = params[i][X2H]; - Parameters* p_h2h = params[i][H2H]; - Parameters* p_hb = params[i][HB]; + ParameterIndex p_x2h = params[i][X2H]; + ParameterIndex p_h2h = params[i][H2H]; + ParameterIndex p_hb = params[i][HB]; Expression i_x2h = parameter(cg,p_x2h); Expression i_h2h = parameter(cg,p_h2h); Expression i_hb = parameter(cg,p_hb); vector vars = {i_x2h, i_h2h, i_hb}; if (lagging) { - Parameters* p_l2h = params[i][L2H]; + ParameterIndex p_l2h = params[i][L2H]; Expression i_l2h = parameter(cg,p_l2h); vars.push_back(i_l2h); } @@ -113,9 +113,9 @@ void SimpleRNNBuilder::copy(const RNNBuilder & rnn) { const SimpleRNNBuilder & rnn_simple = (const SimpleRNNBuilder&)rnn; assert(params.size() == rnn_simple.params.size()); for(size_t i = 0; i < rnn_simple.params.size(); ++i) { - params[i][0]->copy(*rnn_simple.params[i][0]); - params[i][1]->copy(*rnn_simple.params[i][1]); - params[i][2]->copy(*rnn_simple.params[i][2]); + params[i][0] = rnn_simple.params[i][0]; + params[i][1] = rnn_simple.params[i][1]; + params[i][2] = rnn_simple.params[i][2]; } } diff --git a/cnn/rnn.h b/cnn/rnn.h index 6a05b47be..9592c775b 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -120,7 +120,7 @@ struct SimpleRNNBuilder : public RNNBuilder { private: // first index is layer, then x2h h2h hb - std::vector> params; + std::vector> params; // first index is layer, then x2h h2h hb std::vector> param_vars; diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index 155ff415d..9774189f7 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -25,8 +25,8 @@ int kTRG_SOS; int kTRG_EOS; struct Encoder { - LookupParameters* p_s; - LookupParameters* p_t; + LookupParameterIndex p_s; + LookupParameterIndex p_t; vector m; explicit Encoder(Model& model) { p_s = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {REP_DIM}); diff --git a/examples/encdec.cc b/examples/encdec.cc index 4a5bd03ce..7570f757c 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -31,14 +31,14 @@ int kEOS; template struct EncoderDecoder { - LookupParameters* p_c; - LookupParameters* p_ec; // map input to embedding (used in fwd and rev models) - Parameters* p_ie2h; - Parameters* p_bie; - Parameters* p_h2oe; - Parameters* p_boe; - Parameters* p_R; - Parameters* p_bias; + LookupParameterIndex p_c; + LookupParameterIndex p_ec; // map input to embedding (used in fwd and rev models) + ParameterIndex p_ie2h; + ParameterIndex p_bie; + ParameterIndex p_h2oe; + ParameterIndex p_boe; + ParameterIndex p_R; + ParameterIndex p_bias; Builder dec_builder; Builder rev_enc_builder; Builder fwd_enc_builder; diff --git a/examples/nlm.cc b/examples/nlm.cc index 13e51a18e..c32c1be38 100644 --- a/examples/nlm.cc +++ b/examples/nlm.cc @@ -23,7 +23,7 @@ int main(int argc, char** argv) { // parameters Model model; SimpleSGDTrainer sgd(&model); - LookupParameters* p_c = model.add_lookup_parameters(VOCAB_SIZE, {DIM}); + LookupParameterIndex p_c = model.add_lookup_parameters(VOCAB_SIZE, {DIM}); ComputationGraph cg; diff --git a/examples/poisson-regression.cc b/examples/poisson-regression.cc index 10575b29f..99dd7119c 100644 --- a/examples/poisson-regression.cc +++ b/examples/poisson-regression.cc @@ -31,9 +31,9 @@ int kEOS; template struct RNNLengthPredictor { - LookupParameters* p_c; - Parameters* p_R; - Parameters* p_bias; + LookupParameterIndex p_c; + ParameterIndex p_R; + ParameterIndex p_bias; Builder builder; explicit RNNLengthPredictor(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); diff --git a/examples/read-write.cc b/examples/read-write.cc index 0723d38f9..a750ebded 100644 --- a/examples/read-write.cc +++ b/examples/read-write.cc @@ -22,7 +22,7 @@ class XORModel { unsigned hidden_size; Expression W, b, V, a; - Parameters *pW, *pb, *pV, *pa; + ParameterIndex pW, pb, pV, pa; // It is important to have a null default constructor for the class, as // we would first need to read the class object from the file, followed by diff --git a/examples/rnnlm-aevb.cc b/examples/rnnlm-aevb.cc index 31dc7c1f0..ba0b16646 100644 --- a/examples/rnnlm-aevb.cc +++ b/examples/rnnlm-aevb.cc @@ -33,21 +33,21 @@ int kEOS; template struct RNNLanguageModel { - LookupParameters* p_c; // should we have two of these? + LookupParameterIndex p_c; // should we have two of these? Builder ebuilder; - Parameters* p_H; - Parameters* p_hb; - Parameters* p_h2m; - Parameters* p_mb; - Parameters* p_h2s; - Parameters* p_sb; + ParameterIndex p_H; + ParameterIndex p_hb; + ParameterIndex p_h2m; + ParameterIndex p_mb; + ParameterIndex p_h2s; + ParameterIndex p_sb; // DECODER Builder dbuilder; - Parameters* p_R; - Parameters* p_bias; - Parameters* p_z2h0; - Parameters* p_h0b; + ParameterIndex p_R; + ParameterIndex p_bias; + ParameterIndex p_z2h0; + ParameterIndex p_h0b; explicit RNNLanguageModel(Model& model) : ebuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), diff --git a/examples/rnnlm-batch.cc b/examples/rnnlm-batch.cc index 0a7164f13..4fe4b6a2d 100644 --- a/examples/rnnlm-batch.cc +++ b/examples/rnnlm-batch.cc @@ -31,9 +31,9 @@ int kEOS; template struct RNNLanguageModel { - LookupParameters* p_c; - Parameters* p_R; - Parameters* p_bias; + LookupParameterIndex p_c; + ParameterIndex p_R; + ParameterIndex p_bias; Builder builder; explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); diff --git a/examples/rnnlm-cfsm.cc b/examples/rnnlm-cfsm.cc index 178f008ee..9853ba72e 100644 --- a/examples/rnnlm-cfsm.cc +++ b/examples/rnnlm-cfsm.cc @@ -30,7 +30,7 @@ int kEOS; template struct RNNLanguageModel { - LookupParameters* p_c; + LookupParameterIndex p_c; Builder builder; ClassFactoredSoftmaxBuilder& cfsm; explicit RNNLanguageModel(Model& model, ClassFactoredSoftmaxBuilder& h) : diff --git a/examples/rnnlm-givenbag.cc b/examples/rnnlm-givenbag.cc index 6e18310a4..8aeb268c2 100644 --- a/examples/rnnlm-givenbag.cc +++ b/examples/rnnlm-givenbag.cc @@ -30,9 +30,9 @@ int kEOS; template struct RNNLanguageModel { - LookupParameters* p_c; - Parameters* p_R; - Parameters* p_bias; + LookupParameterIndex p_c; + ParameterIndex p_R; + ParameterIndex p_bias; Builder builder; explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); diff --git a/examples/rnnlm-mp.cc b/examples/rnnlm-mp.cc index 1d77b2586..46a4a6d79 100644 --- a/examples/rnnlm-mp.cc +++ b/examples/rnnlm-mp.cc @@ -74,7 +74,7 @@ int main(int argc, char** argv) { unsigned dev_frequency = 5000; unsigned report_frequency = 10; - cnn::Initialize(argc, argv, 1, true); + cnn::Initialize(argc, argv, true); Model model; SimpleSGDTrainer sgd(&model, 0.0, 0.2); diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 13879f1e7..f03cfec3f 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -29,9 +29,9 @@ int kEOS; template struct RNNLanguageModel { - LookupParameters* p_c; - Parameters* p_R; - Parameters* p_bias; + LookupParameterIndex p_c; + ParameterIndex p_R; + ParameterIndex p_bias; Builder builder; explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); diff --git a/examples/rnnlm.h b/examples/rnnlm.h index 9e1b367ab..137b08fed 100644 --- a/examples/rnnlm.h +++ b/examples/rnnlm.h @@ -20,9 +20,9 @@ int kEOS; template struct RNNLanguageModel { - LookupParameters* p_c; - Parameters* p_R; - Parameters* p_bias; + LookupParameterIndex p_c; + ParameterIndex p_R; + ParameterIndex p_bias; Builder builder; explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { kSOS = d.Convert(""); diff --git a/examples/rnnlm2.cc b/examples/rnnlm2.cc index 94ea63bc5..4a116bafa 100644 --- a/examples/rnnlm2.cc +++ b/examples/rnnlm2.cc @@ -29,9 +29,9 @@ int kEOS; template struct RNNLanguageModel { - LookupParameters* p_c; - Parameters* p_R; - Parameters* p_bias; + LookupParameterIndex p_c; + ParameterIndex p_R; + ParameterIndex p_bias; Builder builder; explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index 72f5a2114..624bc1929 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -89,7 +89,7 @@ struct SymbolEmbedding { } if (d.Contains(word)){ // cout << "init" << endl; - p_labels->Initialize(d.Convert(word), p_embeding); + p_labels.Initialize(d.Convert(word), p_embeding); } } } @@ -98,7 +98,7 @@ struct SymbolEmbedding { return lookup(*cg, p_labels, label_id); } ComputationGraph* cg; - LookupParameters* p_labels; + LookupParameterIndex p_labels; }; struct DurationEmbedding { @@ -143,11 +143,11 @@ struct MLPDurationEmbedding : public DurationEmbedding { ComputationGraph* cg; vector> dur_xs; Expression zero, d2h, hb, h2o, ob; - Parameters* p_zero; - Parameters* p_d2h; - Parameters* p_hb; - Parameters* p_h2o; - Parameters* p_ob; + ParameterIndex p_zero; + ParameterIndex p_d2h; + ParameterIndex p_hb; + ParameterIndex p_h2o; + ParameterIndex p_ob; }; struct BinnedDurationEmbedding : public DurationEmbedding { @@ -164,16 +164,16 @@ struct BinnedDurationEmbedding : public DurationEmbedding { } ComputationGraph* cg; int max_bin; - LookupParameters* p_e; + LookupParameterIndex p_e; }; template struct BiTrans { Builder l2rbuilder; Builder r2lbuilder; - Parameters* p_f2c; - Parameters* p_r2c; - Parameters* p_cb; + ParameterIndex p_f2c; + ParameterIndex p_r2c; + ParameterIndex p_cb; explicit BiTrans(Model& model) : l2rbuilder(LAYERS, INPUT_DIM, XCRIBE_DIM, &model), @@ -218,7 +218,7 @@ struct BiTrans { // first call construct_chart(sequence), then access the embeddings of the spans with operator()(i,j) template struct SegEmbedUni { - Parameters* p_h0; + ParameterIndex p_h0; int len; Builder builder; vector> h; // h[i][length of segment - 1] @@ -696,12 +696,12 @@ struct SegmentalRNN { return; } - Parameters* p_d2h1, *p_y2h1, *p_fwd2h1, *p_rev2h1, *p_h1b; - Parameters* p_h12h2, *p_h2b; - Parameters* p_h22o, *p_ob; + ParameterIndex p_d2h1, p_y2h1, p_fwd2h1, p_rev2h1, p_h1b; + ParameterIndex p_h12h2, p_h2b; + ParameterIndex p_h22o, p_ob; // used in the context awareness - Parameters* p_c_start, *p_c_end; - Parameters* p_cf2h1, *p_ce2h1; + ParameterIndex p_c_start, p_c_end; + ParameterIndex p_cf2h1, p_ce2h1; }; // a a 0 1 a ||| O:1 O:1 N:2 O:1 diff --git a/examples/skiprnnlm.cc b/examples/skiprnnlm.cc index caf7a529f..15274eebe 100644 --- a/examples/skiprnnlm.cc +++ b/examples/skiprnnlm.cc @@ -41,9 +41,9 @@ typedef vector Corpus; struct RNNSkipLM { - LookupParameters* p_c; - Parameters* p_R; - Parameters* p_bias; + LookupParameterIndex p_c; + ParameterIndex p_R; + ParameterIndex p_bias; SimpleRNNBuilder builder; explicit RNNSkipLM(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model, true) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); diff --git a/examples/tag-bilstm.cc b/examples/tag-bilstm.cc index c43a4997e..3c1420b24 100644 --- a/examples/tag-bilstm.cc +++ b/examples/tag-bilstm.cc @@ -36,13 +36,13 @@ int kEOS; template struct RNNLanguageModel { - LookupParameters* p_w; - Parameters* p_l2th; - Parameters* p_r2th; - Parameters* p_thbias; + LookupParameterIndex p_w; + ParameterIndex p_l2th; + ParameterIndex p_r2th; + ParameterIndex p_thbias; - Parameters* p_th2t; - Parameters* p_tbias; + ParameterIndex p_th2t; + ParameterIndex p_tbias; Builder l2rbuilder; Builder r2lbuilder; explicit RNNLanguageModel(Model& model) : diff --git a/examples/textcat.cc b/examples/textcat.cc index 58790df69..310e793bf 100644 --- a/examples/textcat.cc +++ b/examples/textcat.cc @@ -29,11 +29,11 @@ int kSOS; int kEOS; struct NeuralBagOfWords { - LookupParameters* p_w; - Parameters* p_c2h; - Parameters* p_hbias; - Parameters* p_h2o; - Parameters* p_obias; + LookupParameterIndex p_w; + ParameterIndex p_c2h; + ParameterIndex p_hbias; + ParameterIndex p_h2o; + ParameterIndex p_obias; explicit NeuralBagOfWords(Model& m) : p_w(m.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), @@ -108,17 +108,17 @@ struct ConvLayer { } return r; } - vector> p_filts; // [feature map index from][feature map index to] - vector> p_fbias; // [feature map index from][feature map index to] + vector> p_filts; // [feature map index from][feature map index to] + vector> p_fbias; // [feature map index from][feature map index to] int k_fold_rows; }; struct ConvNet { - LookupParameters* p_w; + LookupParameterIndex p_w; ConvLayer cl1; ConvLayer cl2; - Parameters* p_t2o; - Parameters* p_obias; + ParameterIndex p_t2o; + ParameterIndex p_obias; explicit ConvNet(Model& m) : p_w(m.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), @@ -290,7 +290,7 @@ int main(int argc, char** argv) { for (auto& sent : dev) { const auto& x = sent.first; const int y = sent.second; - nbow.p_t2o->scale_parameters(pdropout); + nbow.p_t2o.scale_parameters(pdropout); ComputationGraph cg; Expression y_pred = nbow.BuildClassifier(x, cg, false); if (IsCurrentPredictionCorrection(cg, y)) dcorr++; @@ -298,7 +298,7 @@ int main(int argc, char** argv) { HingeLoss(y_pred, y); //cerr << "DEVLINE: " << dtags << endl; dloss += as_scalar(cg.incremental_forward()); - nbow.p_t2o->scale_parameters(1.f/pdropout); + nbow.p_t2o.scale_parameters(1.f/pdropout); dtags++; } if (dloss < best) { diff --git a/examples/tok-embed.cc b/examples/tok-embed.cc index d977e4c4e..54b8ace12 100644 --- a/examples/tok-embed.cc +++ b/examples/tok-embed.cc @@ -53,8 +53,8 @@ inline unsigned int UTF8Len(unsigned char x) { struct PrefixNode { PrefixNode() : terminal(false), - bias(nullptr), pred(nullptr), zero_cond(nullptr), zero_child(nullptr), - one_cond(nullptr), one_child(nullptr) {} + bias(), pred(), zero_cond(), zero_child(nullptr), + one_cond(), one_child(nullptr) {} ~PrefixNode() { delete zero_child; @@ -62,11 +62,11 @@ struct PrefixNode { } bool terminal; - Parameters* bias; - Parameters* pred; - Parameters* zero_cond; + ParameterIndex bias; + ParameterIndex pred; + ParameterIndex zero_cond; PrefixNode* zero_child; - Parameters* one_cond; + ParameterIndex one_cond; PrefixNode* one_child; }; @@ -127,13 +127,13 @@ struct SymbolEmbedding { return lookup(*cg, p_labels, label_id); } ComputationGraph* cg; - LookupParameters* p_labels; + LookupParameterIndex p_labels; }; struct PrefixCodeDecoder { LSTMBuilder decoder; PrefixCode* pfc; - Parameters* p_start; + ParameterIndex p_start; explicit PrefixCodeDecoder(Model& model, PrefixCode* pc) : decoder(LAYERS, CHAR_DIM, EMBED_DIM, &model), pfc(pc) { p_start = model.add_parameters({EMBED_DIM}); @@ -171,11 +171,11 @@ template struct BiCharLSTM { Builder l2rbuilder; Builder r2lbuilder; - Parameters* p_f2c; - Parameters* p_r2c; - Parameters* p_cb; - Parameters* p_c2x; - Parameters* p_xb; + ParameterIndex p_f2c; + ParameterIndex p_r2c; + ParameterIndex p_cb; + ParameterIndex p_c2x; + ParameterIndex p_xb; SymbolEmbedding sym; explicit BiCharLSTM(Model& model) : diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup.cc index 927c16e14..fd01e7195 100644 --- a/examples/xor-batch-lookup.cc +++ b/examples/xor-batch-lookup.cc @@ -29,16 +29,16 @@ int main(int argc, char** argv) { Expression V = parameter(cg, m.add_parameters({1, HIDDEN_SIZE})); Expression a = parameter(cg, m.add_parameters({1})); - LookupParameters* x_values = m.add_lookup_parameters(4, {2}); - LookupParameters* y_values = m.add_lookup_parameters(4, {1}); - x_values->Initialize(0, {1.0, 1.0}); - x_values->Initialize(1, {-1.0, 1.0}); - x_values->Initialize(2, {1.0, -1.0}); - x_values->Initialize(3, {-1.0, -1.0}); - y_values->Initialize(0, {-1.0}); - y_values->Initialize(1, {1.0}); - y_values->Initialize(2, {1.0}); - y_values->Initialize(3, {-1.0}); + LookupParameterIndex x_values = m.add_lookup_parameters(4, {2}); + LookupParameterIndex y_values = m.add_lookup_parameters(4, {1}); + x_values.Initialize(0, {1.0, 1.0}); + x_values.Initialize(1, {-1.0, 1.0}); + x_values.Initialize(2, {1.0, -1.0}); + x_values.Initialize(3, {-1.0, -1.0}); + y_values.Initialize(0, {-1.0}); + y_values.Initialize(1, {1.0}); + y_values.Initialize(2, {1.0}); + y_values.Initialize(3, {-1.0}); Expression x = const_lookup(cg, x_values, {0, 1, 2, 3}); Expression y = const_lookup(cg, y_values, {0, 1, 2, 3}); diff --git a/rnnlm/lm.cc b/rnnlm/lm.cc index ddeb43dcf..9c41178f8 100644 --- a/rnnlm/lm.cc +++ b/rnnlm/lm.cc @@ -27,7 +27,7 @@ unsigned HIDDEN_DIM = 0; unsigned VOCAB_SIZE = 0; float DROPOUT = 0; bool SAMPLE = false; -FactoredSoftmaxBuilder* cfsm = nullptr; +SoftmaxBuilder* cfsm = nullptr; cnn::Dict d; int kSOS; @@ -70,9 +70,9 @@ void InitCommandLine(int argc, char** argv, po::variables_map* conf) { template struct RNNLanguageModel { - LookupParameters* p_c; - Parameters* p_R; - Parameters* p_bias; + LookupParameterIndex p_c; + ParameterIndex p_R; + ParameterIndex p_bias; Builder builder; explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); @@ -200,7 +200,7 @@ int main(int argc, char** argv) { d.SetUnk(""); VOCAB_SIZE = d.size(); if (!cfsm) - cfsm = new NonFactoredSoftmaxBuilder(HIDDEN_DIM, VOCAB_SIZE, &model); + cfsm = new StandardSoftmaxBuilder(HIDDEN_DIM, VOCAB_SIZE, &model); if (conf.count("test")) { string testf = conf["test"].as(); diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 9d1809a6b..bccd8c173 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -29,15 +29,15 @@ struct NodeTest { std::vector param_scalar1_vals = {2.2f}; std::vector param_scalar2_vals = {1.1f}; param1 = mod.add_parameters({3}); - TensorTools::SetElements(param1->values,param1_vals); + TensorTools::SetElements(param1.values(),param1_vals); param2 = mod.add_parameters({3}); - TensorTools::SetElements(param2->values,param2_vals); + TensorTools::SetElements(param2.values(),param2_vals); param3 = mod.add_parameters({3}); - TensorTools::SetElements(param3->values,param3_vals); + TensorTools::SetElements(param3.values(),param3_vals); param_scalar1 = mod.add_parameters({1}); - TensorTools::SetElements(param_scalar1->values,param_scalar1_vals); + TensorTools::SetElements(param_scalar1.values(),param_scalar1_vals); param_scalar2 = mod.add_parameters({1}); - TensorTools::SetElements(param_scalar2->values,param_scalar2_vals); + TensorTools::SetElements(param_scalar2.values(),param_scalar2_vals); } ~NodeTest() { for (auto x : av) free(x); @@ -55,7 +55,7 @@ struct NodeTest { std::vector ones3_vals, ones2_vals, first_one_vals, batch_vals; std::vector av; cnn::Model mod; - cnn::Parameters *param1, *param2, *param3, *param_scalar1, *param_scalar2; + cnn::ParameterIndex param1, param2, param3, param_scalar1, param_scalar2; }; // define the test suite From fbe13abb654c3bb64121470b93e4a6cf9b8ff621 Mon Sep 17 00:00:00 2001 From: austinma Date: Tue, 2 Feb 2016 00:03:33 -0500 Subject: [PATCH 409/965] removed unneeded crap --- cnn/cfsm-builder.cc | 33 ++++++++------------------------- cnn/cfsm-builder.h | 38 -------------------------------------- cnn/hsm-builder.h | 14 -------------- 3 files changed, 8 insertions(+), 77 deletions(-) diff --git a/cnn/cfsm-builder.cc b/cnn/cfsm-builder.cc index f33c0928a..c701cc10e 100644 --- a/cnn/cfsm-builder.cc +++ b/cnn/cfsm-builder.cc @@ -3,9 +3,6 @@ #include #include -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::StandardSoftmaxBuilder) -//BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ClassFactoredSoftmaxBuilder) - using namespace std; namespace cnn { @@ -19,19 +16,9 @@ SoftmaxBuilder::~SoftmaxBuilder() {} StandardSoftmaxBuilder::StandardSoftmaxBuilder() {} -StandardSoftmaxBuilder::StandardSoftmaxBuilder(unsigned rep_dim, unsigned vocab_size, Model* model) : rep_dim(rep_dim), vocab_size(vocab_size) { - initialize(*model); -} - -void StandardSoftmaxBuilder::initialize(Model& model) { - std::cerr << "initializing StandardSoftmax builder:" << vocab_size << ", " << rep_dim << std::endl; - if (p_w.mp == nullptr) { - p_w = model.add_parameters({vocab_size, rep_dim}); - p_b = model.add_parameters({vocab_size}); - } - else { - std::cerr << "jk lol" << std::endl; - } +StandardSoftmaxBuilder::StandardSoftmaxBuilder(unsigned rep_dim, unsigned vocab_size, Model* model) { + p_w = model->add_parameters({vocab_size, rep_dim}); + p_b = model->add_parameters({vocab_size}); } void StandardSoftmaxBuilder::new_graph(ComputationGraph& cg) { @@ -64,15 +51,11 @@ ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder() {} ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, Dict* word_dict, - Model* model) : rep_dim(rep_dim) { + Model* model) { ReadClusterFile(cluster_file, word_dict); - initialize(*model); -} - -void ClassFactoredSoftmaxBuilder::initialize(Model& model) { const unsigned num_clusters = cdict.size(); - p_r2c = model.add_parameters({num_clusters, rep_dim}); - p_cbias = model.add_parameters({num_clusters}); + p_r2c = model->add_parameters({num_clusters, rep_dim}); + p_cbias = model->add_parameters({num_clusters}); p_rc2ws.resize(num_clusters); p_rcwbiases.resize(num_clusters); for (unsigned i = 0; i < num_clusters; ++i) { @@ -81,8 +64,8 @@ void ClassFactoredSoftmaxBuilder::initialize(Model& model) { if (num_words_in_cluster > 1) { // for singleton clusters, we don't need these parameters, so // we don't create them - p_rc2ws[i] = model.add_parameters({num_words_in_cluster, rep_dim}); - p_rcwbiases[i] = model.add_parameters({num_words_in_cluster}); + p_rc2ws[i] = model->add_parameters({num_words_in_cluster, rep_dim}); + p_rcwbiases[i] = model->add_parameters({num_words_in_cluster}); } } } diff --git a/cnn/cfsm-builder.h b/cnn/cfsm-builder.h index 45126c2bf..9bd91d0bd 100644 --- a/cnn/cfsm-builder.h +++ b/cnn/cfsm-builder.h @@ -3,10 +3,6 @@ #include #include -#include -#include -#include -#include #include "cnn/cnn.h" #include "cnn/expr.h" #include "cnn/dict.h" @@ -25,14 +21,6 @@ class SoftmaxBuilder { // samples a word from p(w,c | rep) virtual unsigned sample(const expr::Expression& rep) = 0; - - // add parameters to a model. Usually called after deserializing. - virtual void initialize(Model& model) = 0; - -private: - friend class boost::serialization::access; - template - void serialize(Archive& ar, const unsigned int) {} }; class StandardSoftmaxBuilder : public SoftmaxBuilder { @@ -41,25 +29,14 @@ class StandardSoftmaxBuilder : public SoftmaxBuilder { void new_graph(ComputationGraph& cg); expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx); unsigned sample(const expr::Expression& rep); - void initialize(Model& model); private: StandardSoftmaxBuilder(); - unsigned rep_dim, vocab_size; ParameterIndex p_w; ParameterIndex p_b; expr::Expression w; expr::Expression b; ComputationGraph* pcg; - - friend class boost::serialization::access; - template - void serialize(Archive& ar, const unsigned int) { - boost::serialization::void_cast_register(); - std::cerr << "serializing standardsoftmaxbuilder" << std::endl; - ar & rep_dim; - ar & vocab_size; - } }; // helps with implementation of hierarchical softmax @@ -75,13 +52,11 @@ class ClassFactoredSoftmaxBuilder : public SoftmaxBuilder { void new_graph(ComputationGraph& cg); expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx); unsigned sample(const expr::Expression& rep); - void initialize(Model& model); private: ClassFactoredSoftmaxBuilder(); void ReadClusterFile(const std::string& cluster_file, Dict* word_dict); - unsigned rep_dim; Dict cdict; std::vector widx2cidx; // will be -1 if not present std::vector widx2cwidx; // word index to word index inside of cluster @@ -113,20 +88,7 @@ class ClassFactoredSoftmaxBuilder : public SoftmaxBuilder { std::vector rc2ws; std::vector rc2biases; - friend class boost::serialization::access; - template - void serialize(Archive& ar, const unsigned int) { - boost::serialization::void_cast_register(); - ar & rep_dim; - ar & cdict; - ar & widx2cidx; - ar & widx2cwidx; - ar & cidx2words; - ar & singleton_cluster; - } }; } // namespace cnn -BOOST_CLASS_EXPORT_KEY(cnn::StandardSoftmaxBuilder) -BOOST_CLASS_EXPORT_KEY(cnn::ClassFactoredSoftmaxBuilder) #endif diff --git a/cnn/hsm-builder.h b/cnn/hsm-builder.h index 74aec78ab..d526bb28e 100644 --- a/cnn/hsm-builder.h +++ b/cnn/hsm-builder.h @@ -4,10 +4,6 @@ #include #include #include -#include -#include -#include -#include #include "cnn/cnn.h" #include "cnn/expr.h" #include "cnn/dict.h" @@ -93,17 +89,7 @@ class HierarchicalSoftmaxBuilder : public SoftmaxBuilder { ComputationGraph* pcg; Cluster* root; - - friend class boost::serialization::access; - template - void serialize(Archive& ar, const unsigned int) { - boost::serialization::void_cast_register(); - ar & widx2path; - ar & path_symbols; - ar & root; - } }; } // namespace cnn -BOOST_CLASS_EXPORT_KEY(cnn::HierarchicalSoftmaxBuilder); #endif From 1849db6b825287d19754eab4b6320a37414b942a Mon Sep 17 00:00:00 2001 From: austinma Date: Tue, 2 Feb 2016 04:56:30 -0500 Subject: [PATCH 410/965] Examples showing new serialization --- cnn/model.cc | 3 ++ cnn/model.h | 81 +++++++++++++++++++++----------------------- examples/xor-xent.cc | 28 +++++++++------ examples/xor.cc | 27 +++++++++------ 4 files changed, 76 insertions(+), 63 deletions(-) diff --git a/cnn/model.cc b/cnn/model.cc index 7761e8db1..0eb9ab8f1 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -19,6 +19,9 @@ using namespace std; +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::Parameters) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::LookupParameters) + namespace cnn { ParametersBase::~ParametersBase() {} diff --git a/cnn/model.h b/cnn/model.h index 5e7a51d35..068eb6ce5 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -5,9 +5,12 @@ #include #include - -#include +#include #include +#include +#include +#include +#include #include "cnn/tensor.h" @@ -26,6 +29,9 @@ struct ParametersBase { virtual void g_squared_l2norm(float* sqnorm) const = 0; virtual size_t size() const = 0; virtual ~ParametersBase(); + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) {} }; // represents parameters (e.g., a weight matrix) that will be optimized @@ -48,9 +54,12 @@ struct Parameters : public ParametersBase { explicit Parameters(const Dim& d, float minmax); // initialize with ~U(-minmax,+minmax) // or Glorot initialization if minmax = 0 friend class boost::serialization::access; - template void serialize(Archive& ar, const unsigned int) { + template + void serialize(Archive& ar, const unsigned int) { + boost::serialization::base_object(*this); ar & dim; ar & values; + ar & g; } }; @@ -77,23 +86,12 @@ struct LookupParameters : public ParametersBase { LookupParameters(unsigned n, const Dim& d); friend class boost::serialization::access; template - void save(Archive& ar, const unsigned int) const { + void serialize(Archive& ar, const unsigned int) { + boost::serialization::base_object(*this); ar & dim; - int nv = values.size(); - ar & nv; - for (unsigned i = 0; i < values.size(); ++i) - ar & values[i]; - } - template - void load(Archive& ar, const unsigned int) { - ar & dim; - int nv; - ar & nv; - assert(nv == (int)values.size()); - for (unsigned i = 0; i < values.size(); ++i) - ar & values[i]; + ar & values; + ar & grads; } - BOOST_SERIALIZATION_SPLIT_MEMBER() }; class Model; @@ -108,6 +106,14 @@ struct ParameterIndex { const Model* mp; unsigned long index; + +private: + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & mp; + ar & index; + } }; struct LookupParameterIndex { @@ -122,6 +128,14 @@ struct LookupParameterIndex { const Model* mp; unsigned long index; + +private: + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & mp; + ar & index; + } }; // this is a collection of parameters @@ -147,32 +161,11 @@ class Model { private: friend class boost::serialization::access; template - void save(Archive& ar, const unsigned int) const { - int np = params.size(); - int nlp = lookup_params.size(); - ar & np; - ar & nlp; - for (unsigned i = 0; i < params.size(); ++i) - ar & *params[i]; - for (unsigned i = 0; i < lookup_params.size(); ++i) - ar & *lookup_params[i]; - } - template - void load(Archive& ar, const unsigned int) { - int np, nlp; - ar & np; - ar & nlp; - assert(np == (int)params.size()); - assert(nlp == (int)lookup_params.size()); - for (unsigned i = 0; i < params.size(); ++i) - ar & *params[i]; - for (unsigned i = 0; i < lookup_params.size(); ++i) - ar & *lookup_params[i]; - all_params.clear(); - for (auto p : params) all_params.push_back(p); - for (auto p : lookup_params) all_params.push_back(p); + void serialize(Archive& ar, const unsigned int) { + ar & all_params; + ar & params; + ar & lookup_params; } - BOOST_SERIALIZATION_SPLIT_MEMBER() std::vector all_params; std::vector params; @@ -184,5 +177,7 @@ void save_cnn_model(std::string filename, Model* model); void load_cnn_model(std::string filename, Model* model); } // namespace cnn +BOOST_CLASS_EXPORT_KEY(cnn::Parameters) +BOOST_CLASS_EXPORT_KEY(cnn::LookupParameters) #endif diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index bdf6422e3..5ceba2e98 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -24,10 +24,23 @@ int main(int argc, char** argv) { ComputationGraph cg; - Expression W = parameter(cg, m.add_parameters({HIDDEN_SIZE, 2})); - Expression b = parameter(cg, m.add_parameters({HIDDEN_SIZE})); - Expression V = parameter(cg, m.add_parameters({1, HIDDEN_SIZE})); - Expression a = parameter(cg, m.add_parameters({1})); + ParameterIndex p_W, p_b, p_V, p_a; + if (argc == 2) { + ifstream in(argv[1]); + boost::archive::text_iarchive ia(in); + ia >> m >> p_W >> p_b >> p_V >> p_a; + } + else { + p_W = m.add_parameters({HIDDEN_SIZE, 2}); + p_b = m.add_parameters({HIDDEN_SIZE}); + p_V = m.add_parameters({1, HIDDEN_SIZE}); + p_a = m.add_parameters({1}); + } + + Expression W = parameter(cg, p_W); + Expression b = parameter(cg, p_b); + Expression V = parameter(cg, p_V); + Expression a = parameter(cg, p_a); vector x_values(2); // set x_values to change the inputs to the network Expression x = input(cg, {2}, &x_values); @@ -39,11 +52,6 @@ int main(int argc, char** argv) { Expression loss = binary_log_loss(y_pred, y); cg.PrintGraphviz(); - //if (argc == 2) { - // ifstream in(argv[1]); - // boost::archive::text_iarchive ia(in); - // ia >> m; - //} // train the parameters for (unsigned iter = 0; iter < 2000; ++iter) { @@ -63,6 +71,6 @@ int main(int argc, char** argv) { cerr << "E = " << loss << endl; } boost::archive::text_oarchive oa(cout); - oa << m; + oa << m << p_W << p_b << p_V << p_a; } diff --git a/examples/xor.cc b/examples/xor.cc index bccdeb4ed..bec89c0d5 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -24,11 +24,23 @@ int main(int argc, char** argv) { //MomentumSGDTrainer sgd(&m); ComputationGraph cg; + ParameterIndex p_W, p_b, p_V, p_a; + if (argc == 2) { + ifstream in(argv[1]); + boost::archive::text_iarchive ia(in); + ia >> m >> p_W >> p_b >> p_V >> p_a; + } + else { + p_W = m.add_parameters({HIDDEN_SIZE, 2}); + p_b = m.add_parameters({HIDDEN_SIZE}); + p_V = m.add_parameters({1, HIDDEN_SIZE}); + p_a = m.add_parameters({1}); + } - Expression W = parameter(cg, m.add_parameters({HIDDEN_SIZE, 2})); - Expression b = parameter(cg, m.add_parameters({HIDDEN_SIZE})); - Expression V = parameter(cg, m.add_parameters({1, HIDDEN_SIZE})); - Expression a = parameter(cg, m.add_parameters({1})); + Expression W = parameter(cg, p_W); + Expression b = parameter(cg, p_b); + Expression V = parameter(cg, p_V); + Expression a = parameter(cg, p_a); vector x_values(2); // set x_values to change the inputs to the network Expression x = input(cg, {2}, &x_values); @@ -42,11 +54,6 @@ int main(int argc, char** argv) { Expression loss = squared_distance(y_pred, y); cg.PrintGraphviz(); - if (argc == 2) { - ifstream in(argv[1]); - boost::archive::text_iarchive ia(in); - ia >> m; - } // train the parameters for (unsigned iter = 0; iter < ITERATIONS; ++iter) { @@ -66,6 +73,6 @@ int main(int argc, char** argv) { cerr << "E = " << loss << endl; } boost::archive::text_oarchive oa(cout); - oa << m; + oa << m << p_W << p_b << p_V << p_a; } From 30d3cb4f1c91fb6555f15870bf09fb4eab607d22 Mon Sep 17 00:00:00 2001 From: austinma Date: Tue, 2 Feb 2016 16:09:26 -0500 Subject: [PATCH 411/965] So builders do need to be serializable... --- cnn/cfsm-builder.cc | 3 +++ cnn/cfsm-builder.h | 29 ++++++++++++++++++++++++++++- cnn/lstm.h | 10 ++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/cnn/cfsm-builder.cc b/cnn/cfsm-builder.cc index c701cc10e..c276a6dc1 100644 --- a/cnn/cfsm-builder.cc +++ b/cnn/cfsm-builder.cc @@ -5,6 +5,9 @@ using namespace std; +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::StandardSoftmaxBuilder) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ClassFactoredSoftmaxBuilder) + namespace cnn { using namespace expr; diff --git a/cnn/cfsm-builder.h b/cnn/cfsm-builder.h index 9bd91d0bd..2f469c666 100644 --- a/cnn/cfsm-builder.h +++ b/cnn/cfsm-builder.h @@ -21,6 +21,10 @@ class SoftmaxBuilder { // samples a word from p(w,c | rep) virtual unsigned sample(const expr::Expression& rep) = 0; + + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) {} }; class StandardSoftmaxBuilder : public SoftmaxBuilder { @@ -37,6 +41,14 @@ class StandardSoftmaxBuilder : public SoftmaxBuilder { expr::Expression w; expr::Expression b; ComputationGraph* pcg; + + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + boost::serialization::base_object(*this); + ar & p_w; + ar & p_b; + } }; // helps with implementation of hierarchical softmax @@ -88,7 +100,22 @@ class ClassFactoredSoftmaxBuilder : public SoftmaxBuilder { std::vector rc2ws; std::vector rc2biases; + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + boost::serialization::base_object(*this); + ar & cdict; + ar & widx2cidx; + ar & widx2cwidx; + ar & cidx2words; + ar & singleton_cluster; + ar & p_r2c; + ar & p_cbias; + ar & p_rc2ws; + ar & p_rcwbiases; + } }; } // namespace cnn - +BOOST_CLASS_EXPORT_KEY(cnn::StandardSoftmaxBuilder) +BOOST_CLASS_EXPORT_KEY(cnn::ClassFactoredSoftmaxBuilder) #endif diff --git a/cnn/lstm.h b/cnn/lstm.h index a9def312d..c023ef4e6 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -61,6 +61,16 @@ struct LSTMBuilder : public RNNBuilder { std::vector c0; unsigned layers; float dropout_rate; + +private: + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & params; + ar & layers; + ar & dropout_rate; + } + }; } // namespace cnn From 744ed4dc82f32b408d377877e1d91029a4f2fea6 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 3 Feb 2016 11:57:03 -0500 Subject: [PATCH 412/965] fix weight decay --- cnn/model.cc | 2 +- cnn/training.cc | 51 +++++++++++++++++++++++++--------------------- cnn/training.h | 24 ++++++++++++++-------- cnn/weight-decay.h | 6 +++++- 4 files changed, 50 insertions(+), 33 deletions(-) diff --git a/cnn/model.cc b/cnn/model.cc index e68c0df30..3602ed284 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -39,7 +39,7 @@ Parameters::Parameters(const Dim& d, float scale) : dim(d) { size_t Parameters::size() const { return dim.size(); } void Parameters::scale_parameters(float a) { - (*g) *= a; + values.vec() *= a; } void Parameters::squared_l2norm(float* sqnorm) const { diff --git a/cnn/training.cc b/cnn/training.cc index d171911e8..f9b064adb 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -38,29 +38,34 @@ float Trainer::clip_gradients() { return gscale; } -void SimpleSGDTrainer::update(real scale) { - update(model->lookup_parameters_list(), model->parameters_list(), scale); - global_weight_decay.UpdateWeightDecay(); // update global weight scale +// this calls the rule-specific +void Trainer::update(real scale) { + update_impl(scale); + global_weight_decay.UpdateWeightDecay(); // update global weight scale if (global_weight_decay.ParametersNeedRescaled()) rescale_and_reset_weight_decay(); // if wdscale is getting to small multiply all weights by wdscale, and set wdscale to 1 } -void SimpleSGDTrainer::update(const std::vector &lookup_params, const std::vector ¶ms, real scale) { +void SimpleSGDTrainer::update_impl(real scale) { + update_params(model->lookup_parameters_list(), model->parameters_list(), scale); +} + +void SimpleSGDTrainer::update_params(const std::vector &lookup_params, const std::vector ¶ms, real scale) { const float gscale = clip_gradients(); for (auto p : params) { #if HAVE_CUDA - gpu::sgd_update(p->values.d.size(), p->g.v, p->values.v, eta * scale * gscale, 0); + gpu::sgd_update(p->values.d.size(), p->g.v, p->values.v, eta * scale * gscale / global_weight_decay.CurrentWeightDecay(), 0); #else - p->values.vec() -= ((eta * scale * gscale) * p->g.vec()); + p->values.vec() -= ((eta * scale * gscale) * p->g.vec() / global_weight_decay.CurrentWeightDecay()); #endif p->clear(); } for (auto p : lookup_params) { for (auto i : p->non_zero_grads) { #if HAVE_CUDA - gpu::sgd_update(p->values[i].d.size(), p->grads[i].v, p->values[i].v, eta * scale * gscale, 0); + gpu::sgd_update(p->values[i].d.size(), p->grads[i].v, p->values[i].v, eta * scale * gscale / global_weight_decay.CurrentWeightDecay(), 0); #else - p->values[i].vec() -= (p->grads[i].vec() * (eta * scale * gscale)); + p->values[i].vec() -= (p->grads[i].vec() * (eta * scale * gscale) / global_weight_decay.CurrentWeightDecay()); #endif } p->clear(); @@ -68,7 +73,7 @@ void SimpleSGDTrainer::update(const std::vector &lookup_param ++updates; } -void MomentumSGDTrainer::update(real scale) { +void MomentumSGDTrainer::update_impl(real scale) { // executed on the first iteration to create vectors to // store the velocity if (!velocity_allocated) { @@ -82,7 +87,7 @@ void MomentumSGDTrainer::update(real scale) { for (auto p : model->parameters_list()) { Tensor& v = vp[pi++].h; v.vec() = momentum * v.vec() - (eta * scale * gscale) * p->g.vec(); - p->values.vec() += v.vec(); + p->values.vec() += v.vec() / global_weight_decay.CurrentWeightDecay(); p->clear(); } pi = 0; @@ -91,14 +96,14 @@ void MomentumSGDTrainer::update(real scale) { for (auto i : p->non_zero_grads) { Tensor& v = vx[i]; v.vec() = momentum * v.vec() - (eta * scale * gscale) * (p->grads[i].vec()); - p->values[i].vec() += v.vec(); + p->values[i].vec() += v.vec() / global_weight_decay.CurrentWeightDecay(); } p->clear(); } ++updates; } -void AdagradTrainer::update(real scale) { +void AdagradTrainer::update_impl(real scale) { unsigned pi; if (!shadow_params_allocated) { vp = AllocateShadowParameters(*model); @@ -114,7 +119,7 @@ void AdagradTrainer::update(real scale) { auto g2 = g.cwiseProduct(g); v.vec() += g2; auto delta = -eta * g.cwiseQuotient((v.vec().array() + epsilon).matrix().cwiseSqrt()); - p->values.vec() += delta; + p->values.vec() += delta / global_weight_decay.CurrentWeightDecay(); p->clear(); } @@ -127,7 +132,7 @@ void AdagradTrainer::update(real scale) { auto g2 = g.cwiseProduct(g); v.vec() += g2; auto delta = -eta * g.cwiseQuotient((v.vec().array() + epsilon).matrix().cwiseSqrt()); - p->values[i].vec() += delta; + p->values[i].vec() += delta / global_weight_decay.CurrentWeightDecay(); } p->clear(); } @@ -135,7 +140,7 @@ void AdagradTrainer::update(real scale) { ++updates; } -void AdadeltaTrainer::update(real scale) { +void AdadeltaTrainer::update_impl(real scale) { unsigned pi; if (!shadow_params_allocated) { hg = AllocateShadowParameters(*model); @@ -177,7 +182,7 @@ void AdadeltaTrainer::update(real scale) { auto delta = num.cwiseQuotient(den); auto d2 = delta.cwiseProduct(delta); hdv.vec() = rho * hdv.vec() + (1.0 - rho) * d2; - p->values.vec() += delta; + p->values.vec() += delta / global_weight_decay.CurrentWeightDecay(); p->clear(); pi++; } @@ -197,7 +202,7 @@ void AdadeltaTrainer::update(real scale) { auto delta = num.cwiseQuotient(den); auto d2 = delta.cwiseProduct(delta); hdv.vec() = rho * hdv.vec() + (1.0 - rho) * d2; - p->values[i].vec() += delta; + p->values[i].vec() += delta / global_weight_decay.CurrentWeightDecay(); } p->clear(); pi++; @@ -205,7 +210,7 @@ void AdadeltaTrainer::update(real scale) { ++updates; } -void RmsPropTrainer::update(real scale) { +void RmsPropTrainer::update_impl(real scale) { unsigned pi = 0; if (!shadow_params_allocated) { hg.resize(model->parameters_list().size()); @@ -225,7 +230,7 @@ void RmsPropTrainer::update(real scale) { real& d2 = hg[pi++]; real g2 = p->g.vec().squaredNorm(); d2 = rho * d2 + (1.0 - rho) * g2; - p->values.vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->g.vec()); + p->values.vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->g.vec()) / global_weight_decay.CurrentWeightDecay(); p->clear(); } @@ -236,14 +241,14 @@ void RmsPropTrainer::update(real scale) { real& d2 = hlgx[i]; real g2 = p->grads[i].vec().squaredNorm(); d2 = rho * d2 + (1.0 - rho) * g2; - p->values[i].vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->grads[i].vec()); + p->values[i].vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->grads[i].vec()) / global_weight_decay.CurrentWeightDecay(); } p->clear(); } ++updates; } -void AdamTrainer::update(real scale) { +void AdamTrainer::update_impl(real scale) { unsigned pi; if (!shadow_params_allocated) { m = AllocateShadowParameters(*model); @@ -269,7 +274,7 @@ void AdamTrainer::update(real scale) { auto mhat = m_t / s1; auto vhat = v_t / s2; auto delta = (-eta * mhat).cwiseQuotient((vhat.array().sqrt() + eps).matrix()); - p->values.vec() += delta; + p->values.vec() += delta / global_weight_decay.CurrentWeightDecay(); p->clear(); pi++; } @@ -290,7 +295,7 @@ void AdamTrainer::update(real scale) { auto mhat = m_t / s1; auto vhat = v_t / s2; auto delta = (-eta * mhat).cwiseQuotient((vhat.array().sqrt() + eps).matrix()); - p->values[i].vec() += delta; + p->values[i].vec() += delta / global_weight_decay.CurrentWeightDecay(); } p->clear(); pi++; diff --git a/cnn/training.h b/cnn/training.h index d70cb2486..81370e476 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -12,7 +12,8 @@ struct Trainer { eta0(e0), eta(e0), eta_decay(), epoch(), clipping_enabled(true), clip_threshold(5), clips(), updates(), model(m) {} virtual ~Trainer(); - virtual void update(real scale = 1.0) = 0; + void update(real scale = 1.0); + void update_epoch(real r = 1) { epoch += r; eta = eta0 / (1 + epoch * eta_decay); @@ -43,19 +44,22 @@ struct Trainer { protected: void rescale_and_reset_weight_decay(); + virtual void update_impl(real scale) = 0; }; struct SimpleSGDTrainer : public Trainer { explicit SimpleSGDTrainer(Model* m, real e0 = 0.1) : Trainer(m, e0) {} - void update(real scale) override; - void update(const std::vector &lookup_params, const std::vector ¶ms, real scale = 1); + protected: + void update_impl(real scale) override; + void update_params(const std::vector &lookup_params, const std::vector ¶ms, real scale = 1); }; struct MomentumSGDTrainer : public Trainer { explicit MomentumSGDTrainer(Model* m, real e0 = 0.01, real mom = 0.9) : Trainer(m, e0), momentum(mom), velocity_allocated(false) {} - void update(real scale) override; + protected: + void update_impl(real scale) override; real momentum; bool velocity_allocated; @@ -70,7 +74,8 @@ struct MomentumSGDTrainer : public Trainer { struct AdagradTrainer : public Trainer { explicit AdagradTrainer(Model* m, real e0 = 0.1, real eps = 1e-20) : Trainer(m, e0), epsilon(eps), shadow_params_allocated(false) {} - void update(real scale) override; + protected: + void update_impl(real scale) override; real epsilon; bool shadow_params_allocated; @@ -81,7 +86,8 @@ struct AdagradTrainer : public Trainer { struct AdadeltaTrainer : public Trainer { explicit AdadeltaTrainer(Model* m, real eps = 1e-6, real rho = 0.95) : Trainer(m, 1.0), epsilon(eps), rho(rho), shadow_params_allocated(false) {} - void update(real scale) override; + protected: + void update_impl(real scale) override; real epsilon; real rho; @@ -95,7 +101,8 @@ struct AdadeltaTrainer : public Trainer { struct RmsPropTrainer : public Trainer { explicit RmsPropTrainer(Model* m, real e0 = 0.1, real eps = 1e-20, real rho = 0.95) : Trainer(m, e0), epsilon(eps), rho(rho), shadow_params_allocated(false) {} - void update(real scale) override; + protected: + void update_impl(real scale) override; real epsilon; real rho; @@ -108,7 +115,8 @@ struct AdamTrainer : public Trainer { explicit AdamTrainer(Model* m, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8) : Trainer(m, alpha), beta_1(beta_1), beta_2(beta_2), eps(eps), shadow_params_allocated(false) {} - void update(real scale) override; + protected: + void update_impl(real scale) override; float beta_1; float beta_2; diff --git a/cnn/weight-decay.h b/cnn/weight-decay.h index 8f38dc526..c36f897b7 100644 --- a/cnn/weight-decay.h +++ b/cnn/weight-decay.h @@ -3,6 +3,7 @@ #include #include +#include namespace cnn { @@ -28,7 +29,10 @@ struct L2WeightDecay { bool ParametersNeedRescaled() const { return (weight_decay < 0.25f); } - void ResetWeightDecay() { weight_decay = 1.0f; } + void ResetWeightDecay() { + std::cerr << "RESCALE WEIGHT DECAY FROM " << weight_decay << " to 1.0\n"; + weight_decay = 1.0f; + } private: float weight_decay; float lambda; From 6ab3eadccf722aca0b48502162f2b735b4d0a259 Mon Sep 17 00:00:00 2001 From: roeeaharoni Date: Wed, 3 Feb 2016 22:33:27 +0200 Subject: [PATCH 413/965] Added documentation in API.ipynb for the support of learning rate and regularization parameters in SimpleSGDTrainer and for lookup parameter initialization from an existing array. --- pyexamples/tutorials/API.ipynb | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/pyexamples/tutorials/API.ipynb b/pyexamples/tutorials/API.ipynb index 1b35f7f9d..8ebeb941b 100644 --- a/pyexamples/tutorials/API.ipynb +++ b/pyexamples/tutorials/API.ipynb @@ -21,16 +21,17 @@ "\n", "## ==== Create a new computation graph\n", "# (it is a singleton, we have one at each stage.\n", - "# renew_cg() clears the current one and starts anew)\n", + "# renew_cg() clears the current one and starts anew)\n", "renew_cg()\n", "\n", "## ==== Creating Expressions from user input / constants.\n", "x = scalarInput(value)\n", "\n", - "v = vecIn(dimension)\n", + "v = vecInput(dimension)\n", "v.set([1,2,3])\n", "\n", "z = matInput(dim1, dim2)\n", + "\n", "# for example:\n", "z1 = matInput(2, 2)\n", "z1.set([1,2,3,4])\n", @@ -51,6 +52,7 @@ "m = Model() \n", "pW = m.add_parameters(\"W\", (8,8)) # an 8x8 matrix\n", "pb = m.add_parameters(\"b\", 8)\n", + "\n", "# then we create an Expression out of the model's parameters\n", "W = parameter(pW) # or W = parameter(m[\"W\"])\n", "b = parameter(pb)\n", @@ -61,6 +63,10 @@ "# These are used for embedding matrices.\n", "# for example, this will have VOCAB_SIZE rows, each of DIM dimensions.\n", "lp = m.add_lookup_parameters(\"lookup\", (VOCAB_SIZE, DIM))\n", + "\n", + "# lookup parameters can be initialized from an existing array, i.e:\n", + "# m[\"lookup\"].init_from_array(wv)\n", + "\n", "e5 = lookup(lp, 5) # create an Expression from row 5.\n", "e5c = lookup(lp, 5, update=False) # as before, but don't update when optimizing.\n", "e5.set(9) # now the e5 expression contains row 9\n", @@ -89,7 +95,7 @@ "e = log(e1)\n", "e = logistic(e1) # Sigmoid(x)\n", "e = rectify(e1) # Relu (= max(x,0))\n", - "e =softsign(e1) # x/(1+|x|)\n", + "e = softsign(e1) # x/(1+|x|)\n", "\n", "# softmaxes\n", "e = softmax(e1)\n", @@ -184,8 +190,10 @@ ], "source": [ "from pycnn import *\n", + "\n", "# create model\n", "m = Model()\n", + "\n", "# add parameters to model\n", "m.add_parameters(\"W\", (10,30))\n", "m.add_parameters(\"b\", 10)\n", @@ -195,6 +203,11 @@ "# create trainer \n", "trainer = SimpleSGDTrainer(m)\n", "\n", + "# L2 regularization and learning rate parameters can be passed to the trainer:\n", + "# alpha = 0.1 # learning rate\n", + "# lambda = 0.0001 # regularization\n", + "# trainer = SimpleSGDTrainer(m, lambda, alpha)\n", + "\n", "# function for graph creation\n", "def create_network_return_loss(model, inputs, expected_output):\n", " \"\"\"\n", @@ -271,7 +284,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.10" + "version": "2.7.11" } }, "nbformat": 4, From feab5a80b059b3976ef69ec8b0b57dfa8ffd874b Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Thu, 4 Feb 2016 00:00:26 -0500 Subject: [PATCH 414/965] multidevice support --- cnn/cnn.h | 3 +++ cnn/devices.h | 17 +++++++++++------ cnn/init.cc | 21 ++++++++++----------- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/cnn/cnn.h b/cnn/cnn.h index 408781256..573878f9f 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -12,6 +12,7 @@ #include "cnn/aligned-mem-pool.h" #include "cnn/tensor.h" #include "cnn/model.h" +#include "cnn/devices.h" // Computation graph where nodes represent forward and backward intermediate // values, and edges represent functions of multiple values. To represent the @@ -31,6 +32,8 @@ extern float* kSCALAR_MINUSONE; extern float* kSCALAR_ONE; extern float* kSCALAR_ZERO; +extern Device* default_device; + class ExecutionEngine; struct ParameterNodeBase; struct Node; diff --git a/cnn/devices.h b/cnn/devices.h index 692f877b6..c40c0604e 100644 --- a/cnn/devices.h +++ b/cnn/devices.h @@ -8,15 +8,17 @@ namespace cnn { enum class DeviceType {CPU, GPU}; +static const unsigned ALIGN = 6; class Device { protected: - Device(DeviceType t) : type(t) {} + Device(DeviceType t, MemAllocator* m) : type(t), mem(m) {} virtual ~Device(); public: DeviceType type; - AlignedMemoryPool<6>* fxs; - AlignedMemoryPool<6>* dEdfs; - AlignedMemoryPool<6>* ps; + MemAllocator* mem; + AlignedMemoryPool* fxs; + AlignedMemoryPool* dEdfs; + AlignedMemoryPool* ps; float* kSCALAR_MINUSONE; float* kSCALAR_ONE; float* kSCALAR_ZERO; @@ -26,16 +28,19 @@ class Device { #if HAVE_CUDA class Device_GPU : public Device { public: - Device_GPU(int device_id); + explicit Device_GPU(int mb, int device_id); ~Device_GPU(); int cuda_device_id; + GPUAllocator gpu_mem; }; #endif class Device_CPU : public Device { public: - Device_CPU(); + explicit Device_CPU(int mb, bool shared); ~Device_CPU(); + CPUAllocator cpu_mem; + MemAllocator* shmem; }; } // namespace cnn diff --git a/cnn/init.cc b/cnn/init.cc index 154feade3..38a6b1697 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -15,11 +15,11 @@ using namespace std; namespace cnn { -const unsigned ALIGN = 6; AlignedMemoryPool* fxs = nullptr; AlignedMemoryPool* dEdfs = nullptr; AlignedMemoryPool* ps = nullptr; mt19937* rndeng = nullptr; +Device* default_device = nullptr; static void RemoveArgs(int& argc, char**& argv, int& argi, int n) { for (int i = argi + n; i < argc; ++i) @@ -32,13 +32,6 @@ void Initialize(int& argc, char**& argv, unsigned random_seed, bool shared_param #if HAVE_CUDA cerr << "[cnn] initializing CUDA\n"; Initialize_GPU(argc, argv); -#else - kSCALAR_MINUSONE = (float*) cnn_mm_malloc(sizeof(float), 256); - *kSCALAR_MINUSONE = -1; - kSCALAR_ONE = (float*) cnn_mm_malloc(sizeof(float), 256); - *kSCALAR_ONE = 1; - kSCALAR_ZERO = (float*) cnn_mm_malloc(sizeof(float), 256); - *kSCALAR_ZERO = 0; #endif unsigned long num_mb = 512UL; int argi = 1; @@ -75,9 +68,15 @@ void Initialize(int& argc, char**& argv, unsigned random_seed, bool shared_param rndeng = new mt19937(random_seed); cerr << "[cnn] allocating memory: " << num_mb << "MB\n"; - fxs = new AlignedMemoryPool(num_mb << 20); // node values - dEdfs = new AlignedMemoryPool(num_mb << 20); // node gradients - ps = new AlignedMemoryPool(num_mb << 20, shared_parameters); // parameters + default_device = new Device_CPU(num_mb, shared_parameters); + + // TODO these should be accessed through the relevant device and removed here + fxs = default_device->fxs; + dEdfs = default_device->dEdfs; + ps = default_device->ps; + kSCALAR_MINUSONE = default_device->kSCALAR_MINUSONE; + kSCALAR_ONE = default_device->kSCALAR_ONE; + kSCALAR_ZERO = default_device->kSCALAR_ZERO; cerr << "[cnn] memory allocation done.\n"; } From a632e7b01349c5a5de5775b56f1ea3974f43a4e7 Mon Sep 17 00:00:00 2001 From: Roee Aharoni Date: Thu, 4 Feb 2016 14:33:52 +0200 Subject: [PATCH 415/965] Update API.ipynb now with named parameters in SimpleSGDTrainer example --- pyexamples/tutorials/API.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyexamples/tutorials/API.ipynb b/pyexamples/tutorials/API.ipynb index 8ebeb941b..11598645b 100644 --- a/pyexamples/tutorials/API.ipynb +++ b/pyexamples/tutorials/API.ipynb @@ -206,7 +206,7 @@ "# L2 regularization and learning rate parameters can be passed to the trainer:\n", "# alpha = 0.1 # learning rate\n", "# lambda = 0.0001 # regularization\n", - "# trainer = SimpleSGDTrainer(m, lambda, alpha)\n", + "# trainer = SimpleSGDTrainer(m, lam=lambda, e0=alpha)\n", "\n", "# function for graph creation\n", "def create_network_return_loss(model, inputs, expected_output):\n", From 5babbb98454f5e78c9206b451d1c95f0a39f9d93 Mon Sep 17 00:00:00 2001 From: austinma Date: Fri, 5 Feb 2016 16:30:26 -0500 Subject: [PATCH 416/965] moved definition of HIDDEN_SIZE to a more appropriate scope --- examples/xor.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/xor.cc b/examples/xor.cc index bec89c0d5..91d0719fa 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -17,7 +17,6 @@ int main(int argc, char** argv) { cnn::Initialize(argc, argv); // parameters - const unsigned HIDDEN_SIZE = 8; const unsigned ITERATIONS = 30; Model m; SimpleSGDTrainer sgd(&m); @@ -31,6 +30,7 @@ int main(int argc, char** argv) { ia >> m >> p_W >> p_b >> p_V >> p_a; } else { + const unsigned HIDDEN_SIZE = 8; p_W = m.add_parameters({HIDDEN_SIZE, 2}); p_b = m.add_parameters({HIDDEN_SIZE}); p_V = m.add_parameters({1, HIDDEN_SIZE}); From 5dcc72ffef814f002d944c572a44b43847e95177 Mon Sep 17 00:00:00 2001 From: austinma Date: Fri, 5 Feb 2016 16:40:49 -0500 Subject: [PATCH 417/965] Removed wrapper functionality from ParameterIndex. Use the get() method instead. --- cnn/model.cc | 32 -------------------------------- cnn/model.h | 8 -------- cnn/param-nodes.cc | 24 ++++++++++++------------ cnn/param-nodes.h | 12 ++++++------ examples/textcat.cc | 4 ++-- tests/test-nodes.cc | 10 +++++----- 6 files changed, 25 insertions(+), 65 deletions(-) diff --git a/cnn/model.cc b/cnn/model.cc index 0eb9ab8f1..f5ed5c26e 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -173,22 +173,6 @@ Parameters* ParameterIndex::get() const { return mp->parameters_list()[index]; } -Dim& ParameterIndex::dim() const { - return get()->dim; -} - -Tensor& ParameterIndex::values() const { - return get()->values; -} - -void ParameterIndex::accumulate_grad(const Tensor& g) const { - get()->accumulate_grad(g); -} - -void ParameterIndex::scale_parameters(float a) { - get()->scale_parameters(a); -} - LookupParameterIndex::LookupParameterIndex() { mp = nullptr; index = 0; @@ -200,26 +184,10 @@ LookupParameters* LookupParameterIndex::get() const { return mp->lookup_parameters_list()[index]; } -Dim& LookupParameterIndex::dim() const { - return get()->dim; -} - -vector& LookupParameterIndex::values() const { - return get()->values; -} - -void LookupParameterIndex::accumulate_grad(unsigned index, const Tensor& g) const { - get()->accumulate_grad(index, g); -} - void LookupParameterIndex::Initialize(unsigned index, const std::vector& val) const { get()->Initialize(index, val); } -void LookupParameterIndex::scale_parameters(float a) { - get()->scale_parameters(a); -} - Model::~Model() { for (auto p : all_params) delete p; } diff --git a/cnn/model.h b/cnn/model.h index 068eb6ce5..d0f897e26 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -99,10 +99,6 @@ struct ParameterIndex { ParameterIndex(); ParameterIndex(const Model* mp, unsigned long index); Parameters* get() const; - Dim& dim() const; - Tensor& values() const; - void accumulate_grad(const Tensor& g) const; - void scale_parameters(float a); const Model* mp; unsigned long index; @@ -120,11 +116,7 @@ struct LookupParameterIndex { LookupParameterIndex(); LookupParameterIndex(const Model* mp, unsigned long index); LookupParameters* get() const; - Dim& dim() const; - std::vector& values() const; - void accumulate_grad(unsigned index, const Tensor& g) const; void Initialize(unsigned index, const std::vector& val) const; - void scale_parameters(float a); const Model* mp; unsigned long index; diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index e6fe24ea5..feceb59f6 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -20,7 +20,7 @@ Dim ConstParameterNode::dim_forward(const vector& xs) const { void ConstParameterNode::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - fx.v = params.values().v; + fx.v = params.get()->values.v; } void ConstParameterNode::backward_impl(const vector& xs, @@ -45,7 +45,7 @@ Dim ParameterNode::dim_forward(const vector& xs) const { void ParameterNode::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - fx.v = params.values().v; + fx.v = params.get()->values.v; } void ParameterNode::backward_impl(const vector& xs, @@ -58,7 +58,7 @@ void ParameterNode::backward_impl(const vector& xs, } void ParameterNode::accumulate_grad(const Tensor& g) { - params.accumulate_grad(g); + params.get()->accumulate_grad(g); } string InputNode::as_string(const vector& arg_names) const { @@ -126,7 +126,7 @@ void ScalarInputNode::backward_impl(const vector& xs, string LookupNode::as_string(const vector& arg_names) const { ostringstream s; - s << "lookup_parameters(|x|=" << params.values().size() << " --> " << dim << ')'; + s << "lookup_parameters(|x|=" << params.get()->values.size() << " --> " << dim << ')'; return s.str(); } @@ -137,20 +137,20 @@ Dim LookupNode::dim_forward(const vector& xs) const { void LookupNode::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 0); if(pindex) { - assert(*pindex < params.values().size()); + assert(*pindex < params.get()->values.size()); assert (fx.d.batch_elems() == 1); - fx.v = params.values()[*pindex].v; + fx.v = params.get()->values[*pindex].v; } else { assert (pindices); assert (fx.d.batch_elems() == pindices->size()); for (unsigned b = 0; b < pindices->size(); ++b) { unsigned i = pindices->at(b); - assert (i < params.values().size()); + assert (i < params.get()->values.size()); float* v = fx.v + fx.d.batch_size() * (b % fx.d.batch_elems()); #if HAVE_CUDA - cudaMemcpyAsync(v, params.values()[i].v, fx.d.batch_size() * sizeof(float), cudaMemcpyDeviceToDevice); + cudaMemcpyAsync(v, params.get()->values[i].v, fx.d.batch_size() * sizeof(float), cudaMemcpyDeviceToDevice); #else - memcpy(v, params.values()[i].v, fx.d.batch_size() * sizeof(float)); + memcpy(v, params.get()->values[i].v, fx.d.batch_size() * sizeof(float)); #endif } } @@ -167,14 +167,14 @@ void LookupNode::backward_impl(const vector& xs, void LookupNode::accumulate_grad(const Tensor& g) { if(pindex) { - params.accumulate_grad(*pindex, g); + params.get()->accumulate_grad(*pindex, g); } else { assert (pindices); const vector& gb = g.batch_elems(); for (unsigned b = 0; b < pindices->size(); ++b) { unsigned i = pindices->at(b); - assert (i < params.values().size()); - params.accumulate_grad(i, gb[b]); + assert (i < params.get()->values.size()); + params.get()->accumulate_grad(i, gb[b]); } } } diff --git a/cnn/param-nodes.h b/cnn/param-nodes.h index fdc0c7216..9aa06a428 100644 --- a/cnn/param-nodes.h +++ b/cnn/param-nodes.h @@ -12,7 +12,7 @@ struct ParameterNodeBase : public Node { // represents optimizable parameters struct ParameterNode : public ParameterNodeBase { - explicit ParameterNode(ParameterIndex p) : dim(p.dim()), params(p) {} + explicit ParameterNode(ParameterIndex p) : dim(p.get()->dim), params(p) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward_impl(const std::vector& xs, Tensor& fx) const override; @@ -28,7 +28,7 @@ struct ParameterNode : public ParameterNodeBase { // represents optimizable parameters that are being held constant struct ConstParameterNode : public Node { - explicit ConstParameterNode(ParameterIndex p) : dim(p.dim()), params(p) {} + explicit ConstParameterNode(ParameterIndex p) : dim(p.get()->dim), params(p) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward_impl(const std::vector& xs, Tensor& fx) const override; @@ -77,12 +77,12 @@ struct ScalarInputNode : public Node { // represents a matrix/vector embedding of an item of a discrete set (1-hot coding) struct LookupNode : public ParameterNodeBase { - LookupNode(LookupParameterIndex p, unsigned ind) : dim(p.dim()), index(ind), pindex(&index), indices(), pindices(), params(p) {} - LookupNode(LookupParameterIndex p, const unsigned* pind) : dim(p.dim()), index(), pindex(pind), indices(), pindices(), params(p) {} - LookupNode(LookupParameterIndex p, const std::vector& indices) : dim(p.dim()), index(), pindex(), indices(indices), pindices(&this->indices), params(p) { + LookupNode(LookupParameterIndex p, unsigned ind) : dim(p.get()->dim), index(ind), pindex(&index), indices(), pindices(), params(p) {} + LookupNode(LookupParameterIndex p, const unsigned* pind) : dim(p.get()->dim), index(), pindex(pind), indices(), pindices(), params(p) {} + LookupNode(LookupParameterIndex p, const std::vector& indices) : dim(p.get()->dim), index(), pindex(), indices(indices), pindices(&this->indices), params(p) { dim.bd = pindices->size(); } - LookupNode(LookupParameterIndex p, const std::vector* pindices) : dim(p.dim()), index(), pindex(), indices(), pindices(pindices), params(p) { + LookupNode(LookupParameterIndex p, const std::vector* pindices) : dim(p.get()->dim), index(), pindex(), indices(), pindices(pindices), params(p) { dim.bd = pindices->size(); } std::string as_string(const std::vector& arg_names) const override; diff --git a/examples/textcat.cc b/examples/textcat.cc index 310e793bf..6c7e631a1 100644 --- a/examples/textcat.cc +++ b/examples/textcat.cc @@ -290,7 +290,7 @@ int main(int argc, char** argv) { for (auto& sent : dev) { const auto& x = sent.first; const int y = sent.second; - nbow.p_t2o.scale_parameters(pdropout); + nbow.p_t2o.get()->scale_parameters(pdropout); ComputationGraph cg; Expression y_pred = nbow.BuildClassifier(x, cg, false); if (IsCurrentPredictionCorrection(cg, y)) dcorr++; @@ -298,7 +298,7 @@ int main(int argc, char** argv) { HingeLoss(y_pred, y); //cerr << "DEVLINE: " << dtags << endl; dloss += as_scalar(cg.incremental_forward()); - nbow.p_t2o.scale_parameters(1.f/pdropout); + nbow.p_t2o.get()->scale_parameters(1.f/pdropout); dtags++; } if (dloss < best) { diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index bccd8c173..f4f78c9a5 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -29,15 +29,15 @@ struct NodeTest { std::vector param_scalar1_vals = {2.2f}; std::vector param_scalar2_vals = {1.1f}; param1 = mod.add_parameters({3}); - TensorTools::SetElements(param1.values(),param1_vals); + TensorTools::SetElements(param1.get()->values,param1_vals); param2 = mod.add_parameters({3}); - TensorTools::SetElements(param2.values(),param2_vals); + TensorTools::SetElements(param2.get()->values,param2_vals); param3 = mod.add_parameters({3}); - TensorTools::SetElements(param3.values(),param3_vals); + TensorTools::SetElements(param3.get()->values,param3_vals); param_scalar1 = mod.add_parameters({1}); - TensorTools::SetElements(param_scalar1.values(),param_scalar1_vals); + TensorTools::SetElements(param_scalar1.get()->values,param_scalar1_vals); param_scalar2 = mod.add_parameters({1}); - TensorTools::SetElements(param_scalar2.values(),param_scalar2_vals); + TensorTools::SetElements(param_scalar2.get()->values,param_scalar2_vals); } ~NodeTest() { for (auto x : av) free(x); From fa441f5ff56d0fe13f99fde903577748c4274f19 Mon Sep 17 00:00:00 2001 From: yoavg Date: Sat, 6 Feb 2016 02:13:21 +0200 Subject: [PATCH 418/965] pycnn: RNN inittial_state can now get input state vectors. --- pycnn/pycnn.pyx | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 0d1e29c5f..940841d0a 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -32,8 +32,6 @@ from pycnn cimport * cimport pycnn - - cdef init(random_seed=None): cdef int argc = len(sys.argv) cdef char** c_argv @@ -755,10 +753,18 @@ cdef class RNNBuilder: # {{{ res.append(Expression.from_cexpr(self.cg_version, cexp)) return res - cpdef RNNState initial_state(self): + cpdef RNNState initial_state(self,vecs=None): if self.cg_version != _cg.version(): self.new_graph() - self.start_new_sequence() + if vecs is not None: + es = [] + for v in vecs: + e = vecInput(len(v)) + e.set(v) + es.append(e) + self.start_new_sequence(es) + else: + self.start_new_sequence() self._init_state = RNNState(self, -1) return self._init_state #}}} From 817f5bbac26ca366acf7f0e910db75adf9b87392 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 6 Feb 2016 02:17:56 -0500 Subject: [PATCH 419/965] couldn't resist --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/nodes-common.cc | 14 ++++++++++ cnn/nodes.cc | 68 ++++++++++++++++++++++++++++++++++++++++++--- cnn/nodes.h | 15 ++++++++++ 5 files changed, 95 insertions(+), 4 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index e92185dfb..871120a78 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -56,6 +56,7 @@ Expression hinge(const Expression& x, unsigned index, float m) { return Expressi Expression hinge(const Expression& x, const unsigned* pindex, float m) { return Expression(x.pg, x.pg->add_function({x.i}, pindex, m)); } Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log_softmax(const Expression& x, const vector& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } +Expression sparsemax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression softsign(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression pow(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 3da72a64b..7574ce669 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -71,6 +71,7 @@ Expression hinge(const Expression& x, unsigned index, float m = 1.0); Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0); Expression log_softmax(const Expression& x); Expression log_softmax(const Expression& x, const std::vector& restriction); +Expression sparsemax(const Expression& x); Expression softmax(const Expression& x); Expression softsign(const Expression& x); Expression pow(const Expression& x, const Expression& y); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index b6dfc3be0..4118016e4 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -17,6 +17,20 @@ inline bool LooksLikeVector(const Dim& d) { return true; } +string Sparsemax::as_string(const vector& arg_names) const { + ostringstream s; + s << "sparsemax(" << arg_names[0] << ")"; + return s.str(); +} + +Dim Sparsemax::dim_forward(const vector& xs) const { + if (xs.size() != 1 || !LooksLikeVector(xs[0])) { + ostringstream s; s << "Bad input dimensions in Sparsemax: " << xs; + throw std::invalid_argument(s.str()); + } + return xs[0]; +} + string MatrixInverse::as_string(const vector& arg_names) const { ostringstream s; s << "inverse(" << arg_names[0] << ")"; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index b332fa2c0..e8920025b 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -35,6 +35,61 @@ using namespace std; namespace cnn { +size_t Sparsemax::aux_storage_size() const { + return (dim.size() + 1) * sizeof(float); +} + +void Sparsemax::forward_impl(const vector& xs, Tensor& fx) const { + if (xs[0]->d.cols() == 1) { +#if HAVE_CUDA + throw std::runtime_error("Sparsemax not implemented on GPU"); +#else + const unsigned rows = xs[0]->d.rows(); + float *zs = static_cast(aux_mem); + std::partial_sort_copy(xs[0]->v, xs[0]->v+rows, zs, zs + rows, std::greater()); + float sum = 0, maxsum = 0; + unsigned k = 0; + for (k = 0; k < rows; ++k) { + sum += zs[k]; + float t = 1 + (k + 1) * zs[k]; + if (t <= sum) break; + maxsum = sum; + } + float tau = (maxsum - 1) / k; + auto x = **xs[0]; + auto y = *fx; + y = (x - Eigen::MatrixXf::Ones(rows, 1)*tau).cwiseMax(0.f); + int c = 1; + int *cc = static_cast(aux_mem); + for (unsigned i = 0; i < rows; ++i) + if (y(i,0) > 0.f) cc[c++] = i; + cc[0] = c - 1; +#endif + } else { + throw std::runtime_error("Sparsemax not yet implemented for multiple columns"); + } +} + +void Sparsemax::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { +#if HAVE_CUDA + throw std::runtime_error("Sparsemax not implemented on GPU"); +#else + const int ssize = static_cast(aux_mem)[0]; + int *support = static_cast(aux_mem) + 1; + float dhat = 0; + auto& d = *dEdf; + for (int i = 0; i < ssize; ++i) + dhat += d(support[i], 0); + dhat /= ssize; + for (int i = 0; i < ssize; ++i) + (*dEdxi)(support[i], 0) += d(support[i], 0) - dhat; +#endif +} + void MatrixInverse::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); #ifdef HAVE_CUDA @@ -696,7 +751,6 @@ void LogSumExp::forward_impl(const vector& xs, Tensor& fx) const } void LogDet::forward_impl(const vector& xs, Tensor& fx) const { - const unsigned num_args = xs.size(); fx.v[0] = logdet(**xs[0], false); } @@ -1207,7 +1261,11 @@ void Softmax::forward_impl(const vector& xs, Tensor& fx) const { gpu::softmax(xs[0]->d.size(), xs[0]->v, fx.v); #else auto x = **xs[0]; - *fx = x.unaryExpr(FSoftmaxNormalize(logsumexp(x))); + if (x.rows() == 1) { + fx.v[0] = 1; + } else { + *fx = x.unaryExpr(FSoftmaxNormalize(logsumexp(x))); + } #endif } else { throw std::runtime_error("Softmax not yet implemented for multiple columns"); @@ -1222,8 +1280,10 @@ void Softmax::backward_impl(const vector& xs, #if HAVE_CUDA gpu::softmax_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); #else - float off_diag_sum = -(*fx).cwiseProduct(*dEdf).sum(); - *dEdxi += (*fx).binaryExpr(*dEdf, FSoftmaxBackward(off_diag_sum)); + auto y = *fx; + if (y.rows() == 1) { return; } // no error if softmax = 0 + float off_diag_sum = -y.cwiseProduct(*dEdf).sum(); + *dEdxi += y.binaryExpr(*dEdf, FSoftmaxBackward(off_diag_sum)); #endif } diff --git a/cnn/nodes.h b/cnn/nodes.h index cd8a6fbae..5065b32c6 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -5,6 +5,21 @@ namespace cnn { +// y = sparsemax(x) +// y = arg min_y ||y - x||^2 +struct Sparsemax : public Node { + explicit Sparsemax(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + size_t aux_storage_size() const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // M = x_0, v = x_1 // y = M + v (broadcasting over columns) struct AddMv : public Node { From 455ceb08efdd8bdaab0a189760782a64720acf52 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 6 Feb 2016 02:19:00 -0500 Subject: [PATCH 420/965] use track devices --- cnn/nodes.cc | 25 ++++++++++++++----------- cnn/tensor.h | 10 +++++----- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index b332fa2c0..fcf2e7e8c 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -195,7 +195,7 @@ void Min::forward_impl(const vector& xs, Tensor& fx) const { auto y = fx.vec(); auto x1 = xs[0]->vec(); auto x2 = xs[1]->vec(); - Tensor t(fx.d, static_cast(aux_mem)); + Tensor t(fx.d, static_cast(aux_mem), fx.device); auto u = t.vec(); u = (x1.array() < x2.array()).matrix().cast(); y = x1.cwiseMin(x2); @@ -211,7 +211,7 @@ void Min::backward_impl(const vector& xs, #ifdef HAVE_CUDA throw std::runtime_error("Min not yet implemented for CUDA"); #else - const Tensor t(dEdxi.d, static_cast(aux_mem)); + const Tensor t(dEdxi.d, static_cast(aux_mem), fx.device); if (i == 0) { dEdxi.vec() += t.vec().cwiseProduct(dEdf.vec()); } else { @@ -231,7 +231,7 @@ void Max::forward_impl(const vector& xs, Tensor& fx) const { auto y = fx.vec(); auto x1 = xs[0]->vec(); auto x2 = xs[1]->vec(); - Tensor t(fx.d, static_cast(aux_mem)); + Tensor t(fx.d, static_cast(aux_mem), fx.device); auto u = t.vec(); u = (x1.array() > x2.array()).matrix().cast(); y = x1.cwiseMax(x2); @@ -247,7 +247,7 @@ void Max::backward_impl(const vector& xs, #ifdef HAVE_CUDA throw std::runtime_error("Max not yet implemented for CUDA"); #else - const Tensor t(dEdxi.d, static_cast(aux_mem)); + const Tensor t(dEdxi.d, static_cast(aux_mem), fx.device); if (i == 0) { dEdxi.vec() += t.vec().cwiseProduct(dEdf.vec()); } else { @@ -370,7 +370,7 @@ void Reshape::backward_impl(const vector& xs, #ifdef HAVE_CUDA throw std::runtime_error("Reshape not yet implemented for CUDA"); #else - const Tensor reshaped(dEdxi.d, dEdf.v); + const Tensor reshaped(dEdxi.d, dEdf.v, dEdxi.device); *dEdxi += *reshaped; #endif } @@ -516,7 +516,7 @@ void GaussianNoise::forward_impl(const vector& xs, Tensor& fx) co #ifdef HAVE_CUDA throw std::runtime_error("GaussianNoise not yet implemented for CUDA"); #else - Tensor m(dim, (float*)aux_mem); + Tensor m(dim, (float*)aux_mem, fx.device); TensorTools::RandomizeNormal(0, stddev, m); fx.vec() = xs[0]->vec() + m.vec(); #endif @@ -539,7 +539,7 @@ size_t Dropout::aux_storage_size() const { } void Dropout::forward_impl(const vector& xs, Tensor& fx) const { - Tensor m(dim, (float*)aux_mem); + Tensor m(dim, (float*)aux_mem, fx.device); TensorTools::RandomBernoulli(m, (1.f-p), 1.f / (1.f-p)); #ifdef HAVE_CUDA gpu::vcwise_product(fx.d.size(), xs[0]->v, m.v, fx.v); @@ -553,7 +553,7 @@ void Dropout::backward_impl(const vector& xs, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - Tensor m(dim, (float*)aux_mem); + Tensor m(dim, (float*)aux_mem, fx.device); #ifdef HAVE_CUDA gpu::vcwise_product(dEdf.d.size(), dEdf.v, m.v, fx.v); #else @@ -691,12 +691,11 @@ void LogSumExp::forward_impl(const vector& xs, Tensor& fx) const for (unsigned i = 0; i < xs.size(); ++i) static_cast(aux_mem)[i] = (**xs[i])(0,0); Dim r = {(unsigned int)xs.size()}; - Tensor v(r, static_cast(aux_mem)); + Tensor v(r, static_cast(aux_mem), fx.device); fx.v[0] = logsumexp(*v); } void LogDet::forward_impl(const vector& xs, Tensor& fx) const { - const unsigned num_args = xs.size(); fx.v[0] = logdet(**xs[0], false); } @@ -1207,7 +1206,11 @@ void Softmax::forward_impl(const vector& xs, Tensor& fx) const { gpu::softmax(xs[0]->d.size(), xs[0]->v, fx.v); #else auto x = **xs[0]; - *fx = x.unaryExpr(FSoftmaxNormalize(logsumexp(x))); + if (x.rows() == 1) { + fx.v[0] = 1; + } else { + *fx = x.unaryExpr(FSoftmaxNormalize(logsumexp(x))); + } #endif } else { throw std::runtime_error("Softmax not yet implemented for multiple columns"); diff --git a/cnn/tensor.h b/cnn/tensor.h index 0516fe723..2013e37e4 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -7,6 +7,7 @@ #include "cnn/dim.h" #include "cnn/random.h" #include "cnn/aligned-mem-pool.h" +#include "cnn/devices.h" #if HAVE_CUDA #include @@ -29,7 +30,7 @@ typedef float real; struct Tensor { Tensor() = default; - Tensor(const Dim& d, float* v) : d(d), v(v) {} + Tensor(const Dim& d, float* v, Device* dev) : d(d), v(v), device(dev) {} // Get the data as a matrix const Eigen::Map operator*() const { assert(d.batch_elems() == 1); @@ -108,7 +109,7 @@ struct Tensor { assert(b < d.batch_elems()); const unsigned bsize = d.batch_size(); Dim new_d(d); new_d.bd = 1; - Tensor ret(new_d, v + bsize * b); + Tensor ret(new_d, v + bsize * b, device); // std::cerr << "Getting tensor for batch " << (b % d.batch_elems()) << " bsize: " << bsize << ", ptr=" << (long)ret.v << std::endl; return ret; } @@ -124,7 +125,7 @@ struct Tensor { Dim new_d = d; new_d.bd = 1; assert (d.batch_elems() >= 0); for(unsigned b = 0; b < d.batch_elems(); ++b) - bs[b] = Tensor(new_d, v + bsize * b); + bs[b] = Tensor(new_d, v + bsize * b, device); return bs; } } @@ -132,8 +133,7 @@ struct Tensor { Dim d; // shape of tensor float* v; // pointer to memory std::vector bs; - // TODO start using this - //Device* device; // which device does it live on? + Device* device; private: friend class boost::serialization::access; From 8a31670248de6774e7834f103b20fcba3225d62e Mon Sep 17 00:00:00 2001 From: yoavg Date: Sat, 6 Feb 2016 14:23:58 +0200 Subject: [PATCH 421/965] pycnn: lookup_batch, pick_batch, pickneglogsoftmax_batch --- pycnn/pycnn.pxd | 4 ++++ pycnn/pycnn.pyx | 60 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index 0328ba5cb..d42715010 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -138,8 +138,10 @@ cdef extern from "cnn/expr.h" namespace "cnn::expr": CExpression c_parameter "cnn::expr::parameter" (CComputationGraph& g, CParameters* p) # #CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters* p, unsigned* pindex) # + CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters* p, vector[unsigned]* pindices) # #CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, unsigned* pindex) # + CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, vector[unsigned]* pindices) # CExpression c_op_neg "cnn::expr::operator-" (CExpression& x) # CExpression c_op_add "cnn::expr::operator+" (CExpression& x, CExpression& y) # @@ -201,9 +203,11 @@ cdef extern from "cnn/expr.h" namespace "cnn::expr": #CExpression c_pick "cnn::expr::pick" (CExpression& x, unsigned v) # CExpression c_pick "cnn::expr::pick" (CExpression& x, unsigned* pv) # + CExpression c_pick "cnn::expr::pick" (CExpression& x, vector[unsigned]* pv) # CExpression c_pickrange "cnn::expr::pickrange" (CExpression& x, unsigned v, unsigned u) # CExpression c_pickneglogsoftmax "cnn::expr::pickneglogsoftmax" (CExpression& x, unsigned v) # + CExpression c_pickneglogsoftmax "cnn::expr::pickneglogsoftmax" (CExpression& x, vector[unsigned] vs) # # expecting a vector of CExpression CExpression c_average "cnn::expr::average" (vector[CExpression]& xs) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 940841d0a..ae07476ea 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -140,6 +140,9 @@ cdef class LookupParameters: def __getitem__(self, int i): return lookup(self, i) + cpdef batch(self, vector[unsigned] i): + return lookup_batch(self, i) + cpdef init_row(self, unsigned i, vector[float] row): self.thisptr.Initialize(i, row) @@ -223,6 +226,20 @@ cdef class FloatValue: def get(self): return self.val cdef float* addr(self): return &(self.val) +cdef class UnsignedVectorValue: + cdef vector[unsigned] *vals + def __cinit__(self, vals): + self.vals = new vector[unsigned]() + self.set(vals) + def __dealloc__(self): + del self.vals + def set(self, newval): + self.vals.clear() + for f in newval: self.vals.push_back(f) + def get(self): return deref(self.vals) + def size(self): return len(deref(self.vals)) + cdef vector[unsigned]* addr(self): return self.vals + cdef class FloatVectorValue: cdef vector[float] *vals def __cinit__(self, vals): @@ -326,9 +343,14 @@ cdef class ComputationGraph: return _vecInputExpression(self, vector[float](d1*d2), (d1,d2)) cdef lookup(self, LookupParameters p, unsigned v = 0, update=True): return _lookupExpression(self, p, v, update) - cdef outputPicker(self, Expression e, unsigned v = 0): + cdef lookup_batch(self, LookupParameters p, vector[unsigned] vs, update=True): + return _lookupBatchExpression(self, p, vs, update) + cdef outputPicker(self, Expression e, unsigned v=0): r = _pickerExpression(self, e, v) return r + cdef outputBatchPicker(self, Expression e, vector[unsigned] vs): + r = _pickerBatchExpression(self, e, vs) + return r # }}} @@ -514,9 +536,28 @@ cdef class _lookupExpression(Expression): self.cgp().invalidate() self.val.set(i) +cdef class _lookupBatchExpression(Expression): + cdef UnsignedVectorValue val + def __cinit__(self, ComputationGraph g, LookupParameters p, vector[unsigned] indices, update=True): + self.val = UnsignedVectorValue(indices) + self.cg_version = g.version() + cdef CExpression e + if update: + e = c_lookup(self.cgp()[0], p.thisptr, self.val.addr()) + else: + e = c_const_lookup(self.cgp()[0], p.thisptr, self.val.addr()) + self.vindex = e.i + g._inputs.append(self) + def set(self,i): + self.cgp().invalidate() + self.val.set(i) + def lookup(LookupParameters p, unsigned index=0, update=True): return _cg.lookup(p, index, update) +def lookup_batch(LookupParameters p, vector[unsigned] indices, update=True): + return _cg.lookup_batch(p, indices, update) + cdef class _pickerExpression(Expression): cdef UnsignedValue val def __cinit__(self, ComputationGraph g, Expression e, unsigned index=0): @@ -534,6 +575,22 @@ cdef class _pickerExpression(Expression): def pick(Expression e, unsigned index=0): return _cg.outputPicker(e, index) +cdef class _pickerBatchExpression(Expression): + cdef UnsignedVectorValue val + def __cinit__(self, ComputationGraph g, Expression e, vector[unsigned] indices): + self.val = UnsignedVectorValue(indices) + self.cg_version = g.version() + cdef CExpression ce + ce = c_pick(e.c(), self.val.addr()) + self.vindex = ce.i + g._inputs.append(self) + def set_index(self,i): + self.cgp().invalidate() + self.val.set(i) + +def pick_batch(Expression e, vector[unsigned] indices): + return _cg.outputBatchPicker(e, indices) + cdef class _hingeExpression(Expression): cdef UnsignedValue val def __cinit__(self, ComputationGraph g, Expression x, unsigned index, float m=1.0): @@ -601,6 +658,7 @@ cpdef Expression huber_distance(Expression x, Expression y, float c=1.345): ensu #expr-unsigned cpdef Expression kmax_pooling(Expression x, unsigned k): return Expression.from_cexpr(x.cg_version, c_kmax_pooling(x.c(), k)) cpdef Expression pickneglogsoftmax(Expression x, unsigned v): return Expression.from_cexpr(x.cg_version, c_pickneglogsoftmax(x.c(), v)) +cpdef Expression pickneglogsoftmax_batch(Expression x, vector[unsigned] vs): return Expression.from_cexpr(x.cg_version, c_pickneglogsoftmax(x.c(), vs)) cpdef Expression kmh_ngram(Expression x, unsigned v): return Expression.from_cexpr(x.cg_version, c_kmh_ngram(x.c(), v)) cpdef Expression pickrange(Expression x, unsigned v, unsigned u): return Expression.from_cexpr(x.cg_version, c_pickrange(x.c(), v, u)) From cda0f971e8c7dcea8f3cccba8b69bf94cffd1fda Mon Sep 17 00:00:00 2001 From: yoavg Date: Sat, 6 Feb 2016 14:36:32 +0200 Subject: [PATCH 422/965] pycnn: small minibatch usage example --- pyexamples/minibatch.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 pyexamples/minibatch.py diff --git a/pyexamples/minibatch.py b/pyexamples/minibatch.py new file mode 100644 index 000000000..1c7e52778 --- /dev/null +++ b/pyexamples/minibatch.py @@ -0,0 +1,35 @@ +from pycnn import * +import numpy as np + +m = Model() +lp = m.add_lookup_parameters("a",(100,10)) + +# regular lookup +a = lp[1].npvalue() +b = lp[2].npvalue() +c = lp[3].npvalue() + +# batch lookup instead of single elements. +# two ways of doing this. +abc1 = lookup_batch(lp, [1,2,3]) +print abc1.npvalue() + +abc2 = lp.batch([1,2,3]) +print abc2.npvalue() + +print np.hstack([a,b,c]) + + +# use pick and pickneglogsoftmax in batch mode +# (must be used in conjunction with lookup_batch): +print "\nPick" +W = parameter( m.add_parameters("W", (5, 10)) ) +h = W * lp.batch([1,2,3]) +print h.npvalue() +print pick_batch(h,[1,2,3]).npvalue() +print pick(W*lp[1],1).value(), pick(W*lp[2],2).value(), pick(W*lp[3],3).value() + +# using pickneglogsoftmax_batch +print "\nPick neg log softmax" +print (-log(softmax(h))).npvalue() +print pickneglogsoftmax_batch(h,[1,2,3]).npvalue() From bb8b3fa0e69db0ffc3b917dc87cd0dbbfc0ee99b Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 7 Feb 2016 23:48:17 +0900 Subject: [PATCH 423/965] Tests and fix for batched affine transform --- cnn/nodes.cc | 16 ++++++++-------- tests/test-nodes.cc | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index e8920025b..43af5474b 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1718,13 +1718,13 @@ void AffineTransform::forward_impl(const vector& xs, Tensor& fx) CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.batch_size(), kSCALAR_ONE, xs[0]->batch_ptr(b), 1, fx.batch_ptr(b), 1)); } #else - // Add, using broadcasting or not - if(fx.d.bd > 1 && xs[0]->d.bd == 1) { - fx.rowcol_matrix().colwise() = xs[0]->vec(); - } else { + // // Add, using broadcasting or not + // if(fx.d.bd > 1 && xs[0]->d.bd == 1) { + // fx.rowcol_matrix().colwise() = xs[0]->vec(); + // } else { for(unsigned b = 0; b < fx.d.bd; ++b) fx.batch_matrix(b) = xs[0]->batch_matrix(b); - } + // } // Multiply for (unsigned i = 1; i < xs.size(); i += 2) { @@ -1752,10 +1752,10 @@ void AffineTransform::backward_impl(const vector& xs, CUBLAS_CHECK(cublasSaxpy(cublas_handle, dEdxi.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); #else // Add, using broadcasting or not - if(dEdxi.d.bd > 1 && dEdf.d.bd == 1) { - dEdxi.rowcol_matrix().colwise() += dEdf.vec(); + if(dEdxi.d.bd == 1 && dEdf.d.bd > 1) { + (*dEdxi) += dEdf.rowcol_matrix().rowwise().sum(); } else { - for(unsigned b = 0; b < dEdxi.d.bd; ++b) + for(unsigned b = 0; b < dEdf.d.bd; ++b) dEdxi.batch_matrix(b) += dEdf.batch_matrix(b); } #endif diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 9d1809a6b..c42e6010a 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -138,6 +138,41 @@ BOOST_AUTO_TEST_CASE( multiply_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression operator*(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( multiply_batch_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = input(cg, Dim({3},2), batch_vals); + Expression y = x1*transpose(x2); + Expression ones3 = input(cg, {1,3}, ones3_vals); + sum_batches(ones3 * y * transpose(ones3)); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression operator*(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( affine_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression scalar = parameter(cg, param_scalar1); + Expression x2 = parameter(cg, param2); + Expression y = affine_transform({x1, x2, scalar}); + Expression ones3 = input(cg, {1,3}, ones3_vals); + ones3 * y; + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression operator*(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( affine_batch_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression scalar = parameter(cg, param_scalar1); + Expression x2 = input(cg, Dim({3},2), batch_vals); + Expression y = affine_transform({x1, x2, scalar}); + Expression ones3 = input(cg, {1,3}, ones3_vals); + sum_batches(ones3 * y); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression operator*(const Expression& x, float y); BOOST_AUTO_TEST_CASE( multiplyscalar_gradient ) { cnn::ComputationGraph cg; From 5427e244ffa17825a863fd29688e23ae56254e02 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 7 Feb 2016 21:59:48 -0500 Subject: [PATCH 424/965] sparsemax loss --- cnn/expr.cc | 2 ++ cnn/expr.h | 2 ++ cnn/nodes-common.cc | 14 ++++++++ cnn/nodes.cc | 78 ++++++++++++++++++++++++++++++++++++++++++++- cnn/nodes.h | 19 +++++++++++ 5 files changed, 114 insertions(+), 1 deletion(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index 871120a78..7f38b6fe4 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -57,6 +57,8 @@ Expression hinge(const Expression& x, const unsigned* pindex, float m) { return Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log_softmax(const Expression& x, const vector& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } Expression sparsemax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression sparsemax_loss(const Expression& x, const vector& target_support) { return Expression(x.pg, x.pg->add_function({x.i}, target_support)); } +Expression sparsemax_loss(const Expression& x, const vector* ptarget_support) { return Expression(x.pg, x.pg->add_function({x.i}, ptarget_support)); } Expression softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression softsign(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression pow(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 7574ce669..3e8a0b5d2 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -72,6 +72,8 @@ Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0); Expression log_softmax(const Expression& x); Expression log_softmax(const Expression& x, const std::vector& restriction); Expression sparsemax(const Expression& x); +Expression sparsemax_loss(const Expression& x, const std::vector& target_support); +Expression sparsemax_loss(const Expression& x, const std::vector* ptarget_support); Expression softmax(const Expression& x); Expression softsign(const Expression& x); Expression pow(const Expression& x, const Expression& y); diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 4118016e4..6a9650ad3 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -17,6 +17,20 @@ inline bool LooksLikeVector(const Dim& d) { return true; } +string SparsemaxLoss::as_string(const vector& arg_names) const { + ostringstream s; + s << "sparsemax(" << arg_names[0] << ", q)"; + return s.str(); +} + +Dim SparsemaxLoss::dim_forward(const vector& xs) const { + if (xs.size() != 1 || !LooksLikeVector(xs[0])) { + ostringstream s; s << "Bad input dimensions in SparsemaxLoss: " << xs; + throw std::invalid_argument(s.str()); + } + return Dim({1}); +} + string Sparsemax::as_string(const vector& arg_names) const { ostringstream s; s << "sparsemax(" << arg_names[0] << ")"; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 43af5474b..8a41bdbf1 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -35,8 +35,84 @@ using namespace std; namespace cnn { +#define MAX_SPARSEMAX_LOSS_ROWS 65536 + +size_t SparsemaxLoss::aux_storage_size() const { + // first dim.size dimensions is the sparsemax + const unsigned rows = MAX_SPARSEMAX_LOSS_ROWS; // this should be xs[0]->d.rows() + return rows * sizeof(float); +} + +void SparsemaxLoss::forward_impl(const vector& xs, Tensor& fx) const { + if (xs[0]->d.cols() == 1) { +#if HAVE_CUDA + throw std::runtime_error("SparsemaxLoss not implemented on GPU"); +#else + const int rows = xs[0]->d.rows(); + if (rows > MAX_SPARSEMAX_LOSS_ROWS) { + cerr << "MAX_SPARSEMAX_LOSS_ROWS is not sufficient. Recompile with larger value.\n"; + abort(); + } + float& y = fx.v[0]; // loss + const unsigned qsupport_size = pq->size(); + const float qprop = 1.f / qsupport_size; + + float *zs = static_cast(aux_mem); + std::partial_sort_copy(xs[0]->v, xs[0]->v+rows, zs, zs + rows, std::greater()); + float sum = 0, maxsum = 0; + unsigned k = 0; + for (k = 0; k < rows; ++k) { + sum += zs[k]; + float t = 1 + (k + 1) * zs[k]; + if (t <= sum) break; + maxsum = sum; + } + float tau = (maxsum - 1) / k; + Tensor tsm(xs[0]->d, (float*)aux_mem); + auto x = **xs[0]; + auto sm = *tsm; + sm = (x - Eigen::MatrixXf::Ones(rows, 1)*tau).cwiseMax(0.f); + y = 0; + float tau_sq = tau * tau; + for (unsigned i = 0; i < rows; ++i) { + if (sm(i, 0)) { + const float x_s = x(i, 0); + y += x_s * x_s - tau_sq; + } + } + y /= 2; + y += qprop * qprop * qsupport_size / 2; + for (unsigned i = 0; i < qsupport_size; ++i) + y -= qprop * x((*pq)[i], 0); +#endif + } else { + throw std::runtime_error("SparsemaxLoss not yet implemented for multiple columns"); + } +} + +void SparsemaxLoss::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { +#if HAVE_CUDA + throw std::runtime_error("SparsemaxLoss not implemented on GPU"); +#else + const float d = dEdf.v[0]; + float* psm = static_cast(aux_mem); + float dqprop = d / pq->size(); + Tensor tsm(xs[0]->d, psm); + auto sm = *tsm; // sparsemax(z) + *dEdxi += sm * d; + for (unsigned i = 0; i < pq->size(); ++i) + (*dEdxi)((*pq)[i], 0) -= dqprop; +#endif +} + size_t Sparsemax::aux_storage_size() const { - return (dim.size() + 1) * sizeof(float); + return (1 + dim.size()) * max(sizeof(int), sizeof(float)); + // first is the size of the support + // then comes the indices of the support } void Sparsemax::forward_impl(const vector& xs, Tensor& fx) const { diff --git a/cnn/nodes.h b/cnn/nodes.h index 5065b32c6..40411d52f 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -5,6 +5,25 @@ namespace cnn { +// y = L_sparsemax(x_0; q) +// where x_0 is a vector of "unnormalized" probabilities +// q are the vector of labels +struct SparsemaxLoss : public Node { + explicit SparsemaxLoss(const std::initializer_list& a, const std::vector& target) : Node(a), q(target), pq(&q) {} + explicit SparsemaxLoss(const std::initializer_list& a, const std::vector* ptarget) : Node(a), q(), pq(ptarget) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + size_t aux_storage_size() const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; + const std::vector q; + const std::vector* pq; +}; + // y = sparsemax(x) // y = arg min_y ||y - x||^2 struct Sparsemax : public Node { From 1584cdb31d24d0b90ff1a92b6f8eb56346250cc1 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 8 Feb 2016 14:39:40 +0900 Subject: [PATCH 425/965] Fixed batching of affine transform summed elements --- cnn/nodes.cc | 17 +++++++++-------- tests/test-nodes.cc | 12 ++++++++++++ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 43af5474b..34c861a9a 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1718,22 +1718,23 @@ void AffineTransform::forward_impl(const vector& xs, Tensor& fx) CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.batch_size(), kSCALAR_ONE, xs[0]->batch_ptr(b), 1, fx.batch_ptr(b), 1)); } #else - // // Add, using broadcasting or not - // if(fx.d.bd > 1 && xs[0]->d.bd == 1) { - // fx.rowcol_matrix().colwise() = xs[0]->vec(); - // } else { + // Add, using broadcasting or not + if(fx.d.bd > 1 && xs[0]->d.bd == 1) { + fx.rowcol_matrix().colwise() = xs[0]->vec(); + } else { for(unsigned b = 0; b < fx.d.bd; ++b) fx.batch_matrix(b) = xs[0]->batch_matrix(b); - // } + } // Multiply for (unsigned i = 1; i < xs.size(); i += 2) { - if(xs[i]->d.bd == 1) { + if(xs[i]->d.bd == 1 && xs[i+1]->d.bd == fx.d.bd) { fx.colbatch_matrix().noalias() += **xs[i] * xs[i+1]->colbatch_matrix(); } else { assert(xs[i+1]->d.bd == 1 || xs[i+1]->d.bd == xs[i]->d.bd); - for(unsigned b = 0; b < xs[i]->d.bd; ++b) + for(unsigned b = 0; b < fx.d.bd; ++b) { fx.batch_matrix(b).noalias() += xs[i]->batch_matrix(b) * xs[i+1]->batch_matrix(b); + } } } @@ -1794,7 +1795,7 @@ void AffineTransform::backward_impl(const vector& xs, kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); } #else - if(xs[i-1]->d.bd == 1) { + if(xs[i-1]->d.bd == 1 && dEdxi.d.bd == dEdf.d.bd) { dEdxi.colbatch_matrix().noalias() += (**xs[i-1]).transpose() * dEdf.colbatch_matrix(); } else { for(int b = 0; b < max_b; ++b) diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index c42e6010a..b527c1b9a 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -173,6 +173,18 @@ BOOST_AUTO_TEST_CASE( affine_batch_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression operator*(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( affine_batch2_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = input(cg, Dim({1,3},2), batch_vals); + Expression scalar = parameter(cg, param_scalar1); + Expression x2 = parameter(cg, param2); + Expression y = affine_transform({x1, scalar, transpose(x2) }); + Expression ones3 = input(cg, {3,1}, ones3_vals); + sum_batches(y * ones3); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression operator*(const Expression& x, float y); BOOST_AUTO_TEST_CASE( multiplyscalar_gradient ) { cnn::ComputationGraph cg; From 5f96b0704bd5b221ba78b66b411aa8c4bc5cf98f Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 9 Feb 2016 07:16:43 +0900 Subject: [PATCH 426/965] Added sum_batches to rnnlm-batch --- examples/rnnlm-batch.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/examples/rnnlm-batch.cc b/examples/rnnlm-batch.cc index 0a7164f13..e449e0872 100644 --- a/examples/rnnlm-batch.cc +++ b/examples/rnnlm-batch.cc @@ -67,7 +67,7 @@ struct RNNLanguageModel { errs.push_back(i_err); last_arr = next_arr; } - Expression i_nerr = sum(errs); + Expression i_nerr = sum_batches(sum(errs)); return i_nerr; } @@ -221,9 +221,7 @@ int main(int argc, char** argv) { ComputationGraph cg; unsigned bsize = std::min((unsigned)training.size()-order[si], BATCH_SIZE); // Batch size lm.BuildLMGraphs(training, order[si], bsize, chars, cg); - vector losses = as_vector(cg.forward()); - for(float l : losses) - loss += l; + loss += as_scalar(cg.forward()); cg.backward(); sgd->update(); lines += bsize; From 39c95211d5884acefb28f17cb2c1bce82b9b6ab9 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Tue, 9 Feb 2016 00:11:26 -0500 Subject: [PATCH 427/965] stub implementation of MLC with sparsemaxloss --- cnn/nodes.cc | 4 + examples/CMakeLists.txt | 2 +- examples/mlc.cc | 179 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 examples/mlc.cc diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 8a41bdbf1..ebc4b29ec 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -72,6 +72,9 @@ void SparsemaxLoss::forward_impl(const vector& xs, Tensor& fx) co auto x = **xs[0]; auto sm = *tsm; sm = (x - Eigen::MatrixXf::Ones(rows, 1)*tau).cwiseMax(0.f); + //cerr << "SpM: " << (sm).transpose() << " |||"; + //for (unsigned i = 0; i < pq->size(); ++i) cerr << ' ' << (*pq)[i]; + //cerr << endl; y = 0; float tau_sq = tau * tau; for (unsigned i = 0; i < rows; ++i) { @@ -84,6 +87,7 @@ void SparsemaxLoss::forward_impl(const vector& xs, Tensor& fx) co y += qprop * qprop * qsupport_size / 2; for (unsigned i = 0; i < qsupport_size; ++i) y -= qprop * x((*pq)[i], 0); + if (y < 0) y = 0; #endif } else { throw std::runtime_error("SparsemaxLoss not yet implemented for multiple columns"); diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index a2d21f9e0..de17d1651 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm2 rnnlm-mp read-write) +foreach(TARGET mlc tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm2 rnnlm-mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS} pthread) if(UNIX AND NOT APPLE) diff --git a/examples/mlc.cc b/examples/mlc.cc new file mode 100644 index 000000000..111ac7def --- /dev/null +++ b/examples/mlc.cc @@ -0,0 +1,179 @@ +#include "cnn/timing.h" +#include "cnn/nodes.h" +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/expr.h" +#include "cnn/grad-check.h" + +#include +#include +#include +#include +#include + +using namespace std; +using namespace cnn; +using namespace cnn::expr; + +struct TrainingInstance { + TrainingInstance() {} + TrainingInstance(const vector>& x, const vector& y) : feats(x), labels(y) {} + vector> feats; // sparse representation of x vector + vector labels; // labels +}; + +void swap(TrainingInstance& a, TrainingInstance& b) { + using std::swap; + swap(a.feats, b.feats); + swap(a.labels, b.labels); +} + +// X: 0 864:0.0497399 1523:0.0446641 1681:0.0673872 2293:0.0718105 2845:0.0657134 2867:0.0653402 3240:0.0795168 4125:0.0423215 4271:0.0691369 4665:0.0500863 5216:0.252185 5573:0.0672562 5699:0.0594998 5794:0.0737821 6222:0.124501 6592:0.101431 7227:0.194091 7975:0.0766401 +// Y: 0 35:1 60:1 94:1 95:1 103:1 +vector ReadFiles(const char* xfname, const char* yfname, unsigned& maxfeat, unsigned& maxlabel) { + maxfeat = 0; + maxlabel = 0; + vector d; + ifstream inx(xfname); + assert(inx); + ifstream iny(yfname); + assert(iny); + string linex, liney; + string tok; + while(getline(inx,linex)) { + getline(iny,liney); + + vector> v; + istringstream isx(linex); + isx >> tok; + assert(tok == "0"); + while (isx) { + isx >> tok; + if (!isx) break; + size_t pos = tok.find(':'); + assert(pos != string::npos); + tok[pos] = 0; + unsigned fi = atoi(&tok[0]); + if (fi > maxfeat) maxfeat = fi; + float fv = strtof(&tok[pos+1], 0); + v.emplace_back(make_pair(fi, fv)); + } + vector y; + istringstream isy(liney); + isy >> tok; + assert(tok == "0"); + while (isy) { + isy >> tok; + if (!isy) break; + size_t pos = tok.find(':'); + assert(pos != string::npos); + tok[pos] = 0; + unsigned yi = atoi(&tok[0]); + if (yi > maxlabel) maxlabel = yi; + y.push_back(yi); + } + d.emplace_back(v, y); + } + return d; +} + +struct MLCBuilder { + explicit MLCBuilder(Model& m, unsigned nfeats, unsigned labels) { + unsigned HIDDEN_SIZE = 200; + p_xe = m.add_lookup_parameters(nfeats, {HIDDEN_SIZE}); + p_bh = m.add_parameters({HIDDEN_SIZE}); + p_h2y = m.add_parameters({labels, HIDDEN_SIZE}); + p_by = m.add_parameters({labels}); + } + // output will be a vector of scores that can be 'softmaxed' or 'sparsemaxed' + // into a probability distribution, or it can be compared with a target + // distribution and a loss will be computed + Expression BuildPredictionScores(ComputationGraph& cg, const vector>& feats) const { + vector fe(feats.size() + 1); + unsigned fi = 0; + for (auto& xi : feats) { + fe[fi++] = lookup(cg, p_xe, xi.first) * xi.second; // xi.second is the input feature value + } + fe[fi] = parameter(cg, p_bh); // put bias term at the end + Expression h = tanh(sum(fe)); + Expression h2y = parameter(cg, p_h2y); + Expression by = parameter(cg, p_by); + return affine_transform({by, h2y, h}); + } + LookupParameters* p_xe; + Parameters* p_bh; + Parameters* p_h2y; + Parameters* p_by; +}; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + + if (argc != 5) { + cerr << "Usage: " << argv[0] << " x.train.txt y.train.txt x.dev.txt y.dev.txt\n"; + return 1; + } + vector train, dev; + unsigned max_xi, max_yi, dxi, dyi; + train = ReadFiles(argv[1], argv[2], max_xi, max_yi); + cerr << "Maximum feature index: " << max_xi << endl; + cerr << "Maximum label index: " << max_yi << endl; + dev = ReadFiles(argv[3], argv[4], dxi, dyi); + assert(dxi <= max_xi); + assert(dyi <= max_yi); + max_xi++; + max_yi++; + + // parameters + Model m; + MLCBuilder mlc(m, max_xi, max_yi); + + //AdadeltaTrainer sgd(&m); + SimpleSGDTrainer sgd(&m); + sgd.eta0 = 0.001; + sgd.eta = 0.001; + + unsigned report_every_i = 50; + unsigned si = train.size(); + bool first = true; + vector order(train.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + double ti = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned instances = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == train.size()) { + si = 0; + if (first) { first = false; } else { sgd.update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + // build graph for this instance + ComputationGraph cg; + auto& xy = train[order[si]]; + ++si; + ++instances; + ++ti; + Expression u = mlc.BuildPredictionScores(cg, xy.feats); + + if (rand01() < 0.004) { + sparsemax(u * 3.5); + vector p = as_vector(cg.incremental_forward()); + for (unsigned j = 0; j < p.size(); ++j) + if (p[j] > 0) cerr << j << ' '; + cerr << " |||"; + for (auto y : xy.labels) + cerr << ' ' << y; + cerr << endl; + } + sparsemax_loss(u, &xy.labels); + loss += as_scalar(cg.forward()); + cg.backward(); + sgd.update(1.0); + } + cerr << "[epoch=" << (ti / train.size()) << "] E=" << (loss / instances) << ' '; + } +} + From 1cd0f072818cba1a48af43d996dc6f4660d3e151 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 10 Feb 2016 08:19:03 +0900 Subject: [PATCH 428/965] Fixed sparsemax compile error --- cnn/nodes.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index e56da1bcc..af80ad3dc 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -68,7 +68,7 @@ void SparsemaxLoss::forward_impl(const vector& xs, Tensor& fx) co maxsum = sum; } float tau = (maxsum - 1) / k; - Tensor tsm(xs[0]->d, (float*)aux_mem); + Tensor tsm(xs[0]->d, (float*)aux_mem, xs[0]->device); auto x = **xs[0]; auto sm = *tsm; sm = (x - Eigen::MatrixXf::Ones(rows, 1)*tau).cwiseMax(0.f); @@ -105,7 +105,7 @@ void SparsemaxLoss::backward_impl(const vector& xs, const float d = dEdf.v[0]; float* psm = static_cast(aux_mem); float dqprop = d / pq->size(); - Tensor tsm(xs[0]->d, psm); + Tensor tsm(xs[0]->d, psm, xs[0]->device); auto sm = *tsm; // sparsemax(z) *dEdxi += sm * d; for (unsigned i = 0; i < pq->size(); ++i) From ae16bec3b08c433e6c136f7fda4dc9a80e22d7ca Mon Sep 17 00:00:00 2001 From: armatthews Date: Wed, 10 Feb 2016 11:14:21 -0500 Subject: [PATCH 429/965] Changed size_type to unsigned long to fix an issue with some compilers --- cnn/mp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/mp.h b/cnn/mp.h index ec760b90c..aed8c347e 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -214,7 +214,7 @@ namespace cnn { assert (cid >= 0 && cid < num_children); unsigned i; unsigned priority; - boost::interprocess::message_queue::size_type recvd_size; + unsigned long recvd_size; boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); while (true) { // Check if the parent wants us to exit From eb0b6a37443a1a1b8a5ef82157e1eb0ff46194b1 Mon Sep 17 00:00:00 2001 From: Michael Denkowski Date: Fri, 12 Feb 2016 12:56:27 -0500 Subject: [PATCH 430/965] Score cdec/Moses N-best lists with rnnlm --- CMakeLists.txt | 2 +- rnnlm/lm.cc | 56 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8df977902..25c577b60 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,7 @@ if(DEFINED ENV{BOOST_ROOT}) set(Boost_NO_SYSTEM_PATHS ON) endif() set(Boost_REALPATH ON) -find_package(Boost COMPONENTS program_options serialization REQUIRED) +find_package(Boost COMPONENTS program_options regex serialization REQUIRED) include_directories(${Boost_INCLUDE_DIR}) set(LIBS ${LIBS} ${Boost_LIBRARIES}) # trouble shooting: diff --git a/rnnlm/lm.cc b/rnnlm/lm.cc index ddeb43dcf..b163db079 100644 --- a/rnnlm/lm.cc +++ b/rnnlm/lm.cc @@ -12,11 +12,14 @@ #include #include +#include #include +#include #include #include #include +#include using namespace std; using namespace cnn; @@ -42,6 +45,7 @@ void InitCommandLine(int argc, char** argv, po::variables_map* conf) { ("train,t", po::value(), "training corpus") ("dev,d", po::value(), "development/validation corpus") ("test,p", po::value(), "test corpus") + ("nbest", po::value(), "N-best list to score (- for stdin)") ("learn,x", "set this to estimate the language model from the training data") ("clusters,c", po::value(), "word cluster file for class factored softmax") ("paths,b", po::value(), "word paths file for hierarchical softmax") @@ -338,6 +342,56 @@ int main(int argc, char** argv) { cerr << "TEST CROSS ENTOPY (NATS) = " << (tloss / tchars) << endl; cerr << "TEST PPL = " << exp(tloss / tchars) << endl; } + + // N-best scoring + if (conf.count("nbest")) { + // cdec: index ||| hypothesis ||| feature=val ... ||| ... + // Moses: index ||| hypothesis ||| feature= val(s) ... ||| ... + const int HYP_FIELD = 1; + const int FEAT_FIELD = 2; + const string FEAT_NAME = "RNNLM"; + // Input + string nbestf = conf["nbest"].as(); + cerr << "Scoring N-best list " << nbestf << " ..." << endl; + shared_ptr in; + if (nbestf == "-") { + in.reset(&cin, [](...){}); + } else { + in.reset(new ifstream(nbestf)); + } + // Split on |||, consume whitespace + boost::regex delim("\\s*\\|\\|\\|\\s*"); + boost::sregex_token_iterator end; + // Match spacing of input file + string sep = "="; + bool sep_detected = false; + // Input lines + while (getline(*in, line)) { + vector fields; + boost::sregex_token_iterator it(line.begin(), line.end(), delim, -1); + while (it != end) { + fields.push_back(*it++); + } + // Check sep if needed + if (!sep_detected) { + sep_detected = true; + int i = fields[FEAT_FIELD].find("="); + if (fields[FEAT_FIELD].substr(i + 1, 1) == " ") { + sep = "= "; + } + } + // Score hypothesis + ComputationGraph cg; + lm.BuildLMGraph(ReadSentence(fields[HYP_FIELD], &d), cg, false); + double loss = as_scalar(cg.forward()); + // Add score + ostringstream os; + os << fields[FEAT_FIELD] << " " << FEAT_NAME << sep << loss; + fields[FEAT_FIELD] = os.str(); + // Write augmented line + cout << boost::algorithm::join(fields, " ||| ") << endl; + } + } + delete sgd; } - From c5185cf3adae89101ce2336e702aae8f0649da09 Mon Sep 17 00:00:00 2001 From: austinma Date: Sat, 13 Feb 2016 12:40:21 -0500 Subject: [PATCH 431/965] Imported SparseMax from main branch. Moved AddVectorToAllColumns from conv into nodes. --- cnn/cnn.h | 4 +++ cnn/conv.cc | 38 ---------------------- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/mp.h | 3 +- cnn/nodes-common.cc | 36 ++++++++++++++++++--- cnn/nodes.cc | 78 +++++++++++++++++++++++++++++++++++++++++++++ cnn/nodes.h | 15 +++++++++ 8 files changed, 133 insertions(+), 43 deletions(-) diff --git a/cnn/cnn.h b/cnn/cnn.h index 58511147d..8fc157e3a 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -7,6 +7,10 @@ #include #include #include +#include +#include +#include +#include #include "cnn/init.h" #include "cnn/aligned-mem-pool.h" diff --git a/cnn/conv.cc b/cnn/conv.cc index 47df9e1a7..b6ea8142d 100644 --- a/cnn/conv.cc +++ b/cnn/conv.cc @@ -15,44 +15,6 @@ using namespace std; namespace cnn { -string AddVectorToAllColumns::as_string(const vector& arg_names) const { - ostringstream os; - os << "fold_rows(" << arg_names[0] << ", " << arg_names[1] << ')'; - return os.str(); -} - -Dim AddVectorToAllColumns::dim_forward(const vector& xs) const { - if (xs.size() != 2 || xs[0].rows() != xs[1].rows() || xs[0].ndims() != 2 || xs[1].ndims() != 1) { - cerr << "Bad input dimensions in AddVectorToAllColumns: " << xs << endl; - throw std::invalid_argument("bad input dimensions in AddVectorToAllColumns"); - } - return xs[0]; -} - -void AddVectorToAllColumns::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("AddVectorToAllColumns::forward not implemented for CUDA"); -#else - auto y = *fx; - auto x = **xs[0]; - auto b = **xs[1]; - y = x.colwise() + b.col(0); -#endif -} - -void AddVectorToAllColumns::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i < 2); - if (i == 0) { // x - (*dEdxi) += (*dEdf); - } else { // bias - (*dEdxi).col(0) += (*dEdf).rowwise().sum(); - } -} - string FoldRows::as_string(const vector& arg_names) const { ostringstream os; os << "fold_rows(" << arg_names[0] << ", nrows=" << nrows << ')'; diff --git a/cnn/expr.cc b/cnn/expr.cc index f0d5c1965..7f0172d78 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -55,6 +55,7 @@ Expression rectify(const Expression& x) { return Expression(x.pg, x.pg->add_func Expression hinge(const Expression& x, unsigned index, float m) { return Expression(x.pg, x.pg->add_function({x.i}, index, m)); } Expression hinge(const Expression& x, const unsigned* pindex, float m) { return Expression(x.pg, x.pg->add_function({x.i}, pindex, m)); } Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression sparsemax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log_softmax(const Expression& x, const vector& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } Expression softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression softsign(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 437635b25..93386241f 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -69,6 +69,7 @@ Expression rectify(const Expression& x); Expression hinge(const Expression& x, unsigned index, float m = 1.0); Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0); Expression log_softmax(const Expression& x); +Expression sparsemax(const Expression& x); Expression log_softmax(const Expression& x, const std::vector& restriction); Expression softmax(const Expression& x); Expression softsign(const Expression& x); diff --git a/cnn/mp.h b/cnn/mp.h index c00a1abc7..f1dd3743e 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -307,7 +307,7 @@ namespace cnn { std::mt19937 rndeng(42); for (unsigned iter = 0; iter < num_iterations && !stop_requested; ++iter) { // Shuffle the training data indices - //std::shuffle(train_indices.begin(), train_indices.end(), rndeng); + std::shuffle(train_indices.begin(), train_indices.end(), rndeng); S train_loss = S(); @@ -362,6 +362,7 @@ namespace cnn { best_dev_loss = dev_loss; } + trainer->update_epoch(); begin = end; } } diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 03da87e9c..bd992ce3e 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -17,6 +17,34 @@ inline bool LooksLikeVector(const Dim& d) { return true; } +string AddVectorToAllColumns::as_string(const vector& arg_names) const { + ostringstream os; + os << "fold_rows(" << arg_names[0] << ", " << arg_names[1] << ')'; + return os.str(); +} + +Dim AddVectorToAllColumns::dim_forward(const vector& xs) const { + if (xs.size() != 2 || xs[0].rows() != xs[1].rows() || xs[0].ndims() != 2 || (xs[1].ndims() != 1 && (xs[1].ndims() != 2 || xs[1].cols() != 1))) { + cerr << "Bad input dimensions in AddVectorToAllColumns: " << xs << endl; + throw std::invalid_argument("bad input dimensions in AddVectorToAllColumns"); + } + return xs[0]; +} + +string Sparsemax::as_string(const vector& arg_names) const { + ostringstream s; + s << "sparsemax(" << arg_names[0] << ")"; + return s.str(); +} + +Dim Sparsemax::dim_forward(const vector& xs) const { + if (xs.size() != 1 || !LooksLikeVector(xs[0])) { + ostringstream s; s << "Bad input dimensions in Sparsemax: " << xs; + throw std::invalid_argument(s.str()); + } + return xs[0]; +} + string MatrixInverse::as_string(const vector& arg_names) const { ostringstream s; s << "inverse(" << arg_names[0] << ")"; @@ -37,7 +65,7 @@ Dim AddMv::dim_forward(const vector& xs) const { if (xs.size() != 2 || xs[0].ndims() > 2 || xs[0].rows() != xs[1].rows() || - xs[1].ndims() != 1) { + !LooksLikeVector(xs[1])) { cerr << "Bad arguments in AddMv: " << xs << endl; throw std::invalid_argument("invalid arguments to AddMv"); } @@ -215,7 +243,7 @@ Dim InnerProduct3D_1D::dim_forward(const vector& xs) const { if (xs.size() != 2 && xs.size() != 3) throw std::invalid_argument("Expected two or three arguments in InnerProduct3D_1D"); if (xs[0].ndims() != 3 || - xs[1].ndims() != 1 || + !LooksLikeVector(xs[1]) || xs[0].size(2) != xs[1].size(0)) { ostringstream s; s << "Bad input dimensions in InnerProduct3D_1D: " << xs; throw std::invalid_argument(s.str()); @@ -240,8 +268,8 @@ Dim InnerProduct3D_1D_1D::dim_forward(const vector& xs) const { if (xs.size() != 3 && xs.size() != 4) throw std::invalid_argument("Expected three or four arguments in InnerProduct3D_1D"); if (xs[0].ndims() != 3 || - xs[1].ndims() != 1 || - xs[2].ndims() != 1) { + !LooksLikeVector(xs[1]) || + !LooksLikeVector(xs[2])) { // TODO fix add check ostringstream s; s << "Bad input dimensions in InnerProduct3D_1D_1D: " << xs; throw std::invalid_argument(s.str()); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 7f6e577a3..c36b9afaa 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -34,6 +34,84 @@ using namespace std; // namespace cnn { +void AddVectorToAllColumns::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("AddVectorToAllColumns::forward not implemented for CUDA"); +#else + auto y = *fx; + auto x = **xs[0]; + auto b = **xs[1]; + y = x.colwise() + b.col(0); +#endif +} + +void AddVectorToAllColumns::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + if (i == 0) { // x + (*dEdxi) += (*dEdf); + } else { // bias + (*dEdxi).col(0) += (*dEdf).rowwise().sum(); + } +} + +size_t Sparsemax::aux_storage_size() const { + return (dim.size() + 1) * sizeof(float); +} + +void Sparsemax::forward_impl(const vector& xs, Tensor& fx) const { + if (xs[0]->d.cols() == 1) { +#if HAVE_CUDA + throw std::runtime_error("Sparsemax not implemented on GPU"); +#else + const unsigned rows = xs[0]->d.rows(); + float *zs = static_cast(aux_mem); + std::partial_sort_copy(xs[0]->v, xs[0]->v+rows, zs, zs + rows, std::greater()); + float sum = 0, maxsum = 0; + unsigned k = 0; + for (k = 0; k < rows; ++k) { + sum += zs[k]; + float t = 1 + (k + 1) * zs[k]; + if (t <= sum) break; + maxsum = sum; + } + float tau = (maxsum - 1) / k; + auto x = **xs[0]; + auto y = *fx; + y = (x - Eigen::MatrixXf::Ones(rows, 1)*tau).cwiseMax(0.f); + int c = 1; + int *cc = static_cast(aux_mem); + for (unsigned i = 0; i < rows; ++i) + if (y(i,0) > 0.f) cc[c++] = i; + cc[0] = c - 1; +#endif + } else { + throw std::runtime_error("Sparsemax not yet implemented for multiple columns"); + } +} + +void Sparsemax::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { +#if HAVE_CUDA + throw std::runtime_error("Sparsemax not implemented on GPU"); +#else + const int ssize = static_cast(aux_mem)[0]; + int *support = static_cast(aux_mem) + 1; + float dhat = 0; + auto& d = *dEdf; + for (int i = 0; i < ssize; ++i) + dhat += d(support[i], 0); + dhat /= ssize; + for (int i = 0; i < ssize; ++i) + (*dEdxi)(support[i], 0) += d(support[i], 0) - dhat; +#endif +} void MatrixInverse::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 1); diff --git a/cnn/nodes.h b/cnn/nodes.h index 4c3f7dc5d..48e6fa4c2 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -5,6 +5,21 @@ namespace cnn { +// y = sparsemax(x) +// y = arg min_y ||y - x||^2 +struct Sparsemax : public Node { + explicit Sparsemax(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + size_t aux_storage_size() const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // M = x_0, v = x_1 // y = M + v (broadcasting over columns) struct AddMv : public Node { From b4c0771d9d09bf40c8fc32c9341fc5d9b6201ce9 Mon Sep 17 00:00:00 2001 From: austinma Date: Sat, 13 Feb 2016 13:36:58 -0500 Subject: [PATCH 432/965] Added a function that returns the total number of tuneable parameters in a model --- cnn/model.cc | 8 ++++++++ cnn/model.h | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/cnn/model.cc b/cnn/model.cc index 13d6cca1c..c8461e24f 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -250,6 +250,14 @@ void Model::reset_gradient() { for (auto p : lookup_params) { p->clear(); } } +size_t Model::parameter_count() const { + size_t r = 0; + for (const ParametersBase* param : all_params) { + r += param->size(); + } + return r; +} + void save_cnn_model(std::string filename, Model* model) { std::ofstream out(filename); boost::archive::text_oarchive oa(out); diff --git a/cnn/model.h b/cnn/model.h index d0f897e26..be32491c8 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -150,6 +150,10 @@ class Model { const std::vector& parameters_list() const { return params; } const std::vector& lookup_parameters_list() const { return lookup_params; } + // Returns the total number of tunable parameters (i. e. scalars) contained within this model. + // That is to say, a 2x2 matrix counts as four parameters. + size_t parameter_count() const; + private: friend class boost::serialization::access; template From 432dfd47c5914da124ca3fb07486619ab201a3f4 Mon Sep 17 00:00:00 2001 From: austinma Date: Sat, 13 Feb 2016 15:52:29 -0500 Subject: [PATCH 433/965] Renamed Parameters --> ParameterStorage, and ParameterIndex --> Parameter --- cnn/aligned-mem-pool.h | 4 -- cnn/c2w.h | 2 +- cnn/cfsm-builder.h | 12 +++--- cnn/cnn.cc | 20 +++++----- cnn/cnn.h | 20 +++++----- cnn/deep-lstm.cc | 24 ++++++------ cnn/deep-lstm.h | 2 +- cnn/expr.cc | 20 +++++----- cnn/expr.h | 20 +++++----- cnn/fast-lstm.cc | 24 ++++++------ cnn/fast-lstm.h | 2 +- cnn/grad-check.cc | 8 ++-- cnn/gru.cc | 20 +++++----- cnn/gru.h | 2 +- cnn/hsm-builder.h | 6 +-- cnn/lstm.cc | 24 ++++++------ cnn/lstm.h | 2 +- cnn/model.cc | 72 +++++++++++++++++----------------- cnn/model.h | 60 ++++++++++++++-------------- cnn/mp.h | 2 +- cnn/param-nodes.h | 18 ++++----- cnn/rnn.cc | 16 ++++---- cnn/rnn.h | 2 +- cnn/shadow-params.cc | 4 +- cnn/shadow-params.h | 8 ++-- cnn/training.cc | 2 +- cnn/training.h | 6 +-- examples/embed-cl.cc | 4 +- examples/encdec.cc | 16 ++++---- examples/mlc.cc | 8 ++-- examples/nlm.cc | 2 +- examples/poisson-regression.cc | 6 +-- examples/read-write.cc | 2 +- examples/rnnlm-aevb.cc | 22 +++++------ examples/rnnlm-batch.cc | 6 +-- examples/rnnlm-cfsm.cc | 2 +- examples/rnnlm-givenbag.cc | 6 +-- examples/rnnlm.cc | 6 +-- examples/rnnlm.h | 6 +-- examples/rnnlm2.cc | 6 +-- examples/segrnn-sup.cc | 32 +++++++-------- examples/skiprnnlm.cc | 6 +-- examples/tag-bilstm.cc | 12 +++--- examples/textcat.cc | 20 +++++----- examples/tok-embed.cc | 22 +++++------ examples/xor-batch-lookup.cc | 4 +- examples/xor-xent.cc | 2 +- examples/xor.cc | 2 +- rnnlm/lm.cc | 6 +-- tests/test-nodes.cc | 2 +- 50 files changed, 298 insertions(+), 304 deletions(-) diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h index 9a087b024..fad1c4270 100644 --- a/cnn/aligned-mem-pool.h +++ b/cnn/aligned-mem-pool.h @@ -33,9 +33,6 @@ class AlignedMemoryPool { a->zero(mem, used); } - bool is_shared() { - return shared; - } private: void sys_alloc(size_t cap) { capacity = a->round_up_align(cap); @@ -49,7 +46,6 @@ class AlignedMemoryPool { } size_t capacity; size_t used; - bool shared; MemAllocator* a; void* mem; }; diff --git a/cnn/c2w.h b/cnn/c2w.h index dcdb91eb9..e7b31c376 100644 --- a/cnn/c2w.h +++ b/cnn/c2w.h @@ -15,7 +15,7 @@ namespace cnn { struct C2WBuilder { LSTMBuilder fc2w; LSTMBuilder rc2w; - LookupParameterIndex p_lookup; + LookupParameter p_lookup; std::vector words; std::map wordid2vi; explicit C2WBuilder(int vocab_size, diff --git a/cnn/cfsm-builder.h b/cnn/cfsm-builder.h index 2f469c666..5a91513bd 100644 --- a/cnn/cfsm-builder.h +++ b/cnn/cfsm-builder.h @@ -36,8 +36,8 @@ class StandardSoftmaxBuilder : public SoftmaxBuilder { private: StandardSoftmaxBuilder(); - ParameterIndex p_w; - ParameterIndex p_b; + Parameter p_w; + Parameter p_b; expr::Expression w; expr::Expression b; ComputationGraph* pcg; @@ -76,10 +76,10 @@ class ClassFactoredSoftmaxBuilder : public SoftmaxBuilder { std::vector singleton_cluster; // does cluster contain a single word type? // parameters - ParameterIndex p_r2c; - ParameterIndex p_cbias; - std::vector p_rc2ws; // len = number of classes - std::vector p_rcwbiases; // len = number of classes + Parameter p_r2c; + Parameter p_cbias; + std::vector p_rc2ws; // len = number of classes + std::vector p_rcwbiases; // len = number of classes // Expressions for current graph inline expr::Expression& get_rc2w(unsigned cluster_idx) { diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 80758b195..ef33a4898 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -105,7 +105,7 @@ VariableIndex ComputationGraph::add_input(const Dim& d, const vector* pm) return new_node_index; } -VariableIndex ComputationGraph::add_parameters(ParameterIndex p) { +VariableIndex ComputationGraph::add_parameters(Parameter p) { VariableIndex new_node_index(nodes.size()); ParameterNode* new_node = new ParameterNode(p); nodes.push_back(new_node); @@ -114,7 +114,7 @@ VariableIndex ComputationGraph::add_parameters(ParameterIndex p) { return new_node_index; } -VariableIndex ComputationGraph::add_const_parameters(ParameterIndex p) { +VariableIndex ComputationGraph::add_const_parameters(Parameter p) { VariableIndex new_node_index(nodes.size()); ConstParameterNode* new_node = new ConstParameterNode(p); nodes.push_back(new_node); @@ -122,7 +122,7 @@ VariableIndex ComputationGraph::add_const_parameters(ParameterIndex p) { return new_node_index; } -VariableIndex ComputationGraph::add_lookup(LookupParameterIndex p, const unsigned* pindex) { +VariableIndex ComputationGraph::add_lookup(LookupParameter p, const unsigned* pindex) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, pindex); nodes.push_back(new_node); @@ -131,7 +131,7 @@ VariableIndex ComputationGraph::add_lookup(LookupParameterIndex p, const unsigne return new_node_index; } -VariableIndex ComputationGraph::add_lookup(LookupParameterIndex p, unsigned index) { +VariableIndex ComputationGraph::add_lookup(LookupParameter p, unsigned index) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, index); nodes.push_back(new_node); @@ -140,7 +140,7 @@ VariableIndex ComputationGraph::add_lookup(LookupParameterIndex p, unsigned inde return new_node_index; } -VariableIndex ComputationGraph::add_lookup(LookupParameterIndex p, const std::vector& indices) { +VariableIndex ComputationGraph::add_lookup(LookupParameter p, const std::vector& indices) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, indices); nodes.push_back(new_node); @@ -149,7 +149,7 @@ VariableIndex ComputationGraph::add_lookup(LookupParameterIndex p, const std::ve return new_node_index; } -VariableIndex ComputationGraph::add_lookup(LookupParameterIndex p, const std::vector* indices) { +VariableIndex ComputationGraph::add_lookup(LookupParameter p, const std::vector* indices) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, indices); nodes.push_back(new_node); @@ -159,7 +159,7 @@ VariableIndex ComputationGraph::add_lookup(LookupParameterIndex p, const std::ve } -VariableIndex ComputationGraph::add_const_lookup(LookupParameterIndex p, const unsigned* pindex) { +VariableIndex ComputationGraph::add_const_lookup(LookupParameter p, const unsigned* pindex) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, pindex); // get rid of the following in favor of using parameter_nodes to see the needs_derivative @@ -169,7 +169,7 @@ VariableIndex ComputationGraph::add_const_lookup(LookupParameterIndex p, const u return new_node_index; } -VariableIndex ComputationGraph::add_const_lookup(LookupParameterIndex p, unsigned index) { +VariableIndex ComputationGraph::add_const_lookup(LookupParameter p, unsigned index) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, index); nodes.push_back(new_node); @@ -177,7 +177,7 @@ VariableIndex ComputationGraph::add_const_lookup(LookupParameterIndex p, unsigne return new_node_index; } -VariableIndex ComputationGraph::add_const_lookup(LookupParameterIndex p, const std::vector& indices) { +VariableIndex ComputationGraph::add_const_lookup(LookupParameter p, const std::vector& indices) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, indices); nodes.push_back(new_node); @@ -185,7 +185,7 @@ VariableIndex ComputationGraph::add_const_lookup(LookupParameterIndex p, const s return new_node_index; } -VariableIndex ComputationGraph::add_const_lookup(LookupParameterIndex p, const std::vector* indices) { +VariableIndex ComputationGraph::add_const_lookup(LookupParameter p, const std::vector* indices) { VariableIndex new_node_index(nodes.size()); LookupNode* new_node = new LookupNode(p, indices); nodes.push_back(new_node); diff --git a/cnn/cnn.h b/cnn/cnn.h index 488aee0e4..3f6e4d1af 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -72,19 +72,19 @@ struct ComputationGraph { // parameters are things that are optimized. in contrast to a system like // Torch where computational modules may have their own parameters, in CNN // parameters are just parameters - VariableIndex add_parameters(ParameterIndex p); - VariableIndex add_const_parameters(ParameterIndex p); + VariableIndex add_parameters(Parameter p); + VariableIndex add_const_parameters(Parameter p); // use pindex to point to a memory location where the index will live // that the caller owns - VariableIndex add_lookup(LookupParameterIndex p, const unsigned* pindex); - VariableIndex add_lookup(LookupParameterIndex p, unsigned index); - VariableIndex add_lookup(LookupParameterIndex p, const std::vector* pindices); - VariableIndex add_lookup(LookupParameterIndex p, const std::vector& indices); + VariableIndex add_lookup(LookupParameter p, const unsigned* pindex); + VariableIndex add_lookup(LookupParameter p, unsigned index); + VariableIndex add_lookup(LookupParameter p, const std::vector* pindices); + VariableIndex add_lookup(LookupParameter p, const std::vector& indices); // just like add_lookup, but don't optimize the lookup parameters - VariableIndex add_const_lookup(LookupParameterIndex p, const unsigned* pindex); - VariableIndex add_const_lookup(LookupParameterIndex p, unsigned index); - VariableIndex add_const_lookup(LookupParameterIndex p, const std::vector* pindices); - VariableIndex add_const_lookup(LookupParameterIndex p, const std::vector& indices); + VariableIndex add_const_lookup(LookupParameter p, const unsigned* pindex); + VariableIndex add_const_lookup(LookupParameter p, unsigned index); + VariableIndex add_const_lookup(LookupParameter p, const std::vector* pindices); + VariableIndex add_const_lookup(LookupParameter p, const std::vector& indices); // COMPUTATIONS template inline VariableIndex add_function(const std::initializer_list& arguments); diff --git a/cnn/deep-lstm.cc b/cnn/deep-lstm.cc index 3af889fac..acc2ec0fb 100644 --- a/cnn/deep-lstm.cc +++ b/cnn/deep-lstm.cc @@ -21,24 +21,24 @@ DeepLSTMBuilder::DeepLSTMBuilder(unsigned layers, unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // i - ParameterIndex p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); - ParameterIndex p_h2i = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_c2i = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_bi = model->add_parameters({hidden_dim}); + Parameter p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2i = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_c2i = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_bi = model->add_parameters({hidden_dim}); // o - ParameterIndex p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); - ParameterIndex p_h2o = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_c2o = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_bo = model->add_parameters({hidden_dim}); + Parameter p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2o = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_c2o = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_bo = model->add_parameters({hidden_dim}); // c - ParameterIndex p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); - ParameterIndex p_h2c = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_bc = model->add_parameters({hidden_dim}); + Parameter p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2c = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_bc = model->add_parameters({hidden_dim}); layer_input_dim = hidden_dim + input_dim; // output (hidden) from 1st layer is input to next - vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; + vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; params.push_back(ps); } // layers } diff --git a/cnn/deep-lstm.h b/cnn/deep-lstm.h index ca4c26485..b15968bec 100644 --- a/cnn/deep-lstm.h +++ b/cnn/deep-lstm.h @@ -32,7 +32,7 @@ struct DeepLSTMBuilder : public RNNBuilder { public: // first index is layer, then ... - std::vector> params; + std::vector> params; // first index is layer, then ... std::vector> param_vars; diff --git a/cnn/expr.cc b/cnn/expr.cc index b0273aee8..22c28dc2f 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -13,16 +13,16 @@ Expression input(ComputationGraph& g, real s) { return Expression(&g, g.add_inpu Expression input(ComputationGraph& g, const real *ps) { return Expression(&g, g.add_input(ps)); } Expression input(ComputationGraph& g, const Dim& d, const vector& data) { return Expression(&g, g.add_input(d, data)); } Expression input(ComputationGraph& g, const Dim& d, const vector* pdata) { return Expression(&g, g.add_input(d, pdata)); } -Expression const_parameter(ComputationGraph& g, ParameterIndex p) { return Expression(&g, g.add_const_parameters(p)); } -Expression parameter(ComputationGraph& g, ParameterIndex p) { return Expression(&g, g.add_parameters(p)); } -Expression lookup(ComputationGraph& g, LookupParameterIndex p, unsigned index) { return Expression(&g, g.add_lookup(p, index)); } -Expression lookup(ComputationGraph& g, LookupParameterIndex p, const unsigned* pindex) { return Expression(&g, g.add_lookup(p, pindex)); } -Expression lookup(ComputationGraph& g, LookupParameterIndex p, const vector& indices) { return Expression(&g, g.add_lookup(p, indices)); } -Expression lookup(ComputationGraph& g, LookupParameterIndex p, const vector* pindices) { return Expression(&g, g.add_lookup(p, pindices)); } -Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, unsigned index) { return Expression(&g, g.add_const_lookup(p, index)); } -Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, const unsigned* pindex) { return Expression(&g, g.add_const_lookup(p, pindex)); } -Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, const vector& indices) { return Expression(&g, g.add_const_lookup(p, indices)); } -Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, const vector* pindices) { return Expression(&g, g.add_const_lookup(p, pindices)); } +Expression const_parameter(ComputationGraph& g, Parameter p) { return Expression(&g, g.add_const_parameters(p)); } +Expression parameter(ComputationGraph& g, Parameter p) { return Expression(&g, g.add_parameters(p)); } +Expression lookup(ComputationGraph& g, LookupParameter p, unsigned index) { return Expression(&g, g.add_lookup(p, index)); } +Expression lookup(ComputationGraph& g, LookupParameter p, const unsigned* pindex) { return Expression(&g, g.add_lookup(p, pindex)); } +Expression lookup(ComputationGraph& g, LookupParameter p, const vector& indices) { return Expression(&g, g.add_lookup(p, indices)); } +Expression lookup(ComputationGraph& g, LookupParameter p, const vector* pindices) { return Expression(&g, g.add_lookup(p, pindices)); } +Expression const_lookup(ComputationGraph& g, LookupParameter p, unsigned index) { return Expression(&g, g.add_const_lookup(p, index)); } +Expression const_lookup(ComputationGraph& g, LookupParameter p, const unsigned* pindex) { return Expression(&g, g.add_const_lookup(p, pindex)); } +Expression const_lookup(ComputationGraph& g, LookupParameter p, const vector& indices) { return Expression(&g, g.add_const_lookup(p, indices)); } +Expression const_lookup(ComputationGraph& g, LookupParameter p, const vector* pindices) { return Expression(&g, g.add_const_lookup(p, pindices)); } Expression zeroes(ComputationGraph& g, const Dim& d) { return Expression(&g, g.add_function(d)); } Expression operator-(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index e8d0085cb..1a844fc0f 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -20,17 +20,17 @@ Expression input(ComputationGraph& g, real s); Expression input(ComputationGraph& g, const real *ps); Expression input(ComputationGraph& g, const Dim& d, const std::vector& data); Expression input(ComputationGraph& g, const Dim& d, const std::vector* pdata); -Expression parameter(ComputationGraph& g, ParameterIndex p); -Expression const_parameter(ComputationGraph& g, ParameterIndex p); -Expression lookup(ComputationGraph& g, LookupParameterIndex p, unsigned index); -Expression lookup(ComputationGraph& g, LookupParameterIndex p, const unsigned* pindex); -Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, unsigned index); -Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, const unsigned* pindex); +Expression parameter(ComputationGraph& g, Parameter p); +Expression const_parameter(ComputationGraph& g, Parameter p); +Expression lookup(ComputationGraph& g, LookupParameter p, unsigned index); +Expression lookup(ComputationGraph& g, LookupParameter p, const unsigned* pindex); +Expression const_lookup(ComputationGraph& g, LookupParameter p, unsigned index); +Expression const_lookup(ComputationGraph& g, LookupParameter p, const unsigned* pindex); // Batched versions of lookup and const_lookup -Expression lookup(ComputationGraph& g, LookupParameterIndex p, const std::vector& indices); -Expression lookup(ComputationGraph& g, LookupParameterIndex p, const std::vector* pindices); -Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, const std::vector& indices); -Expression const_lookup(ComputationGraph& g, LookupParameterIndex p, const std::vector* pindices); +Expression lookup(ComputationGraph& g, LookupParameter p, const std::vector& indices); +Expression lookup(ComputationGraph& g, LookupParameter p, const std::vector* pindices); +Expression const_lookup(ComputationGraph& g, LookupParameter p, const std::vector& indices); +Expression const_lookup(ComputationGraph& g, LookupParameter p, const std::vector* pindices); Expression zeroes(ComputationGraph& g, const Dim& d); Expression operator-(const Expression& x); diff --git a/cnn/fast-lstm.cc b/cnn/fast-lstm.cc index deeb60bd4..99ec22e6f 100644 --- a/cnn/fast-lstm.cc +++ b/cnn/fast-lstm.cc @@ -26,24 +26,24 @@ FastLSTMBuilder::FastLSTMBuilder(unsigned layers, unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // i - ParameterIndex p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); - ParameterIndex p_h2i = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_c2i = model->add_parameters({hidden_dim, 1}); - ParameterIndex p_bi = model->add_parameters({hidden_dim}); + Parameter p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2i = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_c2i = model->add_parameters({hidden_dim, 1}); + Parameter p_bi = model->add_parameters({hidden_dim}); // o - ParameterIndex p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); - ParameterIndex p_h2o = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_c2o = model->add_parameters({hidden_dim, 1}); - ParameterIndex p_bo = model->add_parameters({hidden_dim}); + Parameter p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2o = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_c2o = model->add_parameters({hidden_dim, 1}); + Parameter p_bo = model->add_parameters({hidden_dim}); // c - ParameterIndex p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); - ParameterIndex p_h2c = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_bc = model->add_parameters({hidden_dim}); + Parameter p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2c = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_bc = model->add_parameters({hidden_dim}); layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; + vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; params.push_back(ps); } // layers } diff --git a/cnn/fast-lstm.h b/cnn/fast-lstm.h index c6f27200e..dc1156d62 100644 --- a/cnn/fast-lstm.h +++ b/cnn/fast-lstm.h @@ -45,7 +45,7 @@ struct FastLSTMBuilder : public RNNBuilder { public: // first index is layer, then ... - std::vector> params; + std::vector> params; // first index is layer, then ... std::vector> param_vars; diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc index 4f4cc8ec9..53ec87354 100644 --- a/cnn/grad-check.cc +++ b/cnn/grad-check.cc @@ -13,8 +13,8 @@ namespace cnn { bool CheckGrad(Model& m, ComputationGraph& g, int verbosity) { // Clear the parameters first - const vector& params = m.parameters_list(); - const vector& lookup_params = m.lookup_parameters_list(); + const vector& params = m.parameters_list(); + const vector& lookup_params = m.lookup_parameters_list(); for (auto pp : params) pp->clear(); for (auto pp : lookup_params) @@ -30,7 +30,7 @@ bool CheckGrad(Model& m, ComputationGraph& g, int verbosity) { for (auto pp : params) { if(verbosity > 1) cerr << endl << "PARAMETERS " << pp << endl; - Parameters& p = *pp; + ParameterStorage& p = *pp; size_t ts = p.dim.size(); for (size_t i = 0; i < ts; ++i) { float old = TensorTools::AccessElement(p.values, i); @@ -55,7 +55,7 @@ bool CheckGrad(Model& m, ComputationGraph& g, int verbosity) { for (auto pp : lookup_params) { if(verbosity > 1) cerr << endl << "LOOKUP PARAMETERS " << pp << endl; - LookupParameters& p = *pp; + LookupParameterStorage& p = *pp; size_t ts = p.dim.size(); for (unsigned j : p.non_zero_grads) { if(verbosity > 1) diff --git a/cnn/gru.cc b/cnn/gru.cc index 91aad4376..44a8a4d0f 100644 --- a/cnn/gru.cc +++ b/cnn/gru.cc @@ -21,22 +21,22 @@ GRUBuilder::GRUBuilder(unsigned layers, unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // z - ParameterIndex p_x2z = model->add_parameters({hidden_dim, layer_input_dim}); - ParameterIndex p_h2z = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_bz = model->add_parameters({hidden_dim}); + Parameter p_x2z = model->add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2z = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_bz = model->add_parameters({hidden_dim}); // r - ParameterIndex p_x2r = model->add_parameters({hidden_dim, layer_input_dim}); - ParameterIndex p_h2r = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_br = model->add_parameters({hidden_dim}); + Parameter p_x2r = model->add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2r = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_br = model->add_parameters({hidden_dim}); // h - ParameterIndex p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); - ParameterIndex p_h2h = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_bh = model->add_parameters({hidden_dim}); + Parameter p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2h = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_bh = model->add_parameters({hidden_dim}); layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - vector ps = {p_x2z, p_h2z, p_bz, p_x2r, p_h2r, p_br, p_x2h, p_h2h, p_bh}; + vector ps = {p_x2z, p_h2z, p_bz, p_x2r, p_h2r, p_br, p_x2h, p_h2h, p_bh}; params.push_back(ps); } // layers } diff --git a/cnn/gru.h b/cnn/gru.h index 21647fdc2..0a262de7a 100644 --- a/cnn/gru.h +++ b/cnn/gru.h @@ -28,7 +28,7 @@ struct GRUBuilder : public RNNBuilder { Expression add_input_impl(int prev, const Expression& x) override; // first index is layer, then ... - std::vector> params; + std::vector> params; // first index is layer, then ... std::vector> param_vars; diff --git a/cnn/hsm-builder.h b/cnn/hsm-builder.h index d526bb28e..fbf7048a3 100644 --- a/cnn/hsm-builder.h +++ b/cnn/hsm-builder.h @@ -11,16 +11,14 @@ namespace cnn { -struct Parameters; - class Cluster { private: std::vector children; std::vector path; std::vector terminals; std::unordered_map word2ind; - ParameterIndex p_weights; - ParameterIndex p_bias; + Parameter p_weights; + Parameter p_bias; mutable expr::Expression weights; mutable expr::Expression bias; bool initialized; diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 4525f8e61..1e3999427 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -21,24 +21,24 @@ LSTMBuilder::LSTMBuilder(unsigned layers, unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // i - ParameterIndex p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); - ParameterIndex p_h2i = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_c2i = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_bi = model->add_parameters({hidden_dim}); + Parameter p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2i = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_c2i = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_bi = model->add_parameters({hidden_dim}); // o - ParameterIndex p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); - ParameterIndex p_h2o = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_c2o = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_bo = model->add_parameters({hidden_dim}); + Parameter p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2o = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_c2o = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_bo = model->add_parameters({hidden_dim}); // c - ParameterIndex p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); - ParameterIndex p_h2c = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_bc = model->add_parameters({hidden_dim}); + Parameter p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2c = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_bc = model->add_parameters({hidden_dim}); layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next - vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; + vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; params.push_back(ps); } // layers dropout_rate = 0.0f; diff --git a/cnn/lstm.h b/cnn/lstm.h index c023ef4e6..7ca46cafe 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -46,7 +46,7 @@ struct LSTMBuilder : public RNNBuilder { public: // first index is layer, then ... - std::vector> params; + std::vector> params; // first index is layer, then ... std::vector> param_vars; diff --git a/cnn/model.cc b/cnn/model.cc index c8461e24f..376a3f2be 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -18,14 +18,14 @@ using namespace std; -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::Parameters) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::LookupParameters) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ParameterStorage) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::LookupParameterStorage) namespace cnn { -ParametersBase::~ParametersBase() {} +ParameterStorageBase::~ParameterStorageBase() {} -Parameters::Parameters(const Dim& d, float scale) : dim(d) { +ParameterStorage::ParameterStorage(const Dim& d, float scale) : dim(d) { values.d = g.d = d; values.v = static_cast(ps->allocate(d.size() * sizeof(float))); if (scale) { @@ -38,13 +38,13 @@ Parameters::Parameters(const Dim& d, float scale) : dim(d) { TensorTools::Zero(g); } -size_t Parameters::size() const { return dim.size(); } +size_t ParameterStorage::size() const { return dim.size(); } -void Parameters::scale_parameters(float a) { +void ParameterStorage::scale_parameters(float a) { values.vec() *= a; } -void Parameters::squared_l2norm(float* sqnorm) const { +void ParameterStorage::squared_l2norm(float* sqnorm) const { #if HAVE_CUDA gpu::l2_norm_reducer(values.d.size(), values.v, sqnorm, true, false); #else @@ -52,7 +52,7 @@ void Parameters::squared_l2norm(float* sqnorm) const { #endif } -void Parameters::g_squared_l2norm(float* sqnorm) const { +void ParameterStorage::g_squared_l2norm(float* sqnorm) const { #if HAVE_CUDA gpu::l2_norm_reducer(g.d.size(), g.v, sqnorm, true, false); #else @@ -60,12 +60,12 @@ void Parameters::g_squared_l2norm(float* sqnorm) const { #endif } -void Parameters::copy(const Parameters & param) { +void ParameterStorage::copy(const ParameterStorage & param) { assert(dim == param.dim); TensorTools::CopyElements(values, param.values); } -void Parameters::accumulate_grad(const Tensor& d) { +void ParameterStorage::accumulate_grad(const Tensor& d) { #if HAVE_CUDA CUBLAS_CHECK(cublasSaxpy(cublas_handle, g.d.size(), kSCALAR_ONE, d.v, 1, g.v, 1)); #else @@ -73,11 +73,11 @@ void Parameters::accumulate_grad(const Tensor& d) { #endif } -void Parameters::clear() { +void ParameterStorage::clear() { TensorTools::Zero(g); } -LookupParameters::LookupParameters(unsigned n, const Dim& d) : dim(d), values(n), grads(n) { +LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d), values(n), grads(n) { for (unsigned i = 0; i < n; ++i) { auto& v = values[i]; v.d = d; @@ -91,26 +91,26 @@ LookupParameters::LookupParameters(unsigned n, const Dim& d) : dim(d), values(n) } } -void LookupParameters::scale_parameters(float a) { +void LookupParameterStorage::scale_parameters(float a) { for (auto& p : values) (*p) *= a; } -void LookupParameters::Initialize(unsigned index, const vector& val) { +void LookupParameterStorage::Initialize(unsigned index, const vector& val) { assert(int(val.size()) == int(dim.size())); #if HAVE_CUDA - cerr << "implement LookupParameters::Initialize\n"; - throw cuda_not_implemented("LookupParameters::Initialize"); + cerr << "implement LookupParameterStorage::Initialize\n"; + throw cuda_not_implemented("LookupParameterStorage::Initialize"); #else memcpy(values[index].v, &val[0], val.size() * sizeof(float)); #endif } -size_t LookupParameters::size() const { +size_t LookupParameterStorage::size() const { return values.size() * dim.size(); } -void LookupParameters::g_squared_l2norm(float* sqnorm) const { +void LookupParameterStorage::g_squared_l2norm(float* sqnorm) const { #if HAVE_CUDA bool acc = false; for (auto i : non_zero_grads) { @@ -125,7 +125,7 @@ void LookupParameters::g_squared_l2norm(float* sqnorm) const { #endif } -void LookupParameters::squared_l2norm(float* sqnorm) const { +void LookupParameterStorage::squared_l2norm(float* sqnorm) const { #if HAVE_CUDA bool acc = false; for (unsigned i = 0; i < values.size(); ++i) { @@ -140,13 +140,13 @@ void LookupParameters::squared_l2norm(float* sqnorm) const { #endif } -void LookupParameters::copy(const LookupParameters & param) { +void LookupParameterStorage::copy(const LookupParameterStorage& param) { assert(dim == param.dim); for(size_t i = 0; i < param.values.size(); ++i) TensorTools::CopyElements(values[i], param.values[i]); } -void LookupParameters::accumulate_grad(unsigned index, const Tensor& d) { +void LookupParameterStorage::accumulate_grad(unsigned index, const Tensor& d) { non_zero_grads.insert(index); #if HAVE_CUDA CUBLAS_CHECK(cublasSaxpy(cublas_handle, d.d.size(), kSCALAR_ONE, d.v, 1, grads[index].v, 1)); @@ -155,35 +155,35 @@ void LookupParameters::accumulate_grad(unsigned index, const Tensor& d) { #endif } -void LookupParameters::clear() { +void LookupParameterStorage::clear() { for (auto i : non_zero_grads) TensorTools::Zero(grads[i]); non_zero_grads.clear(); } -ParameterIndex::ParameterIndex() { +Parameter::Parameter() { mp = nullptr; index = 0; } -ParameterIndex::ParameterIndex(const Model* mp, unsigned long index) : mp(mp), index(index) {} +Parameter::Parameter(const Model* mp, unsigned long index) : mp(mp), index(index) {} -Parameters* ParameterIndex::get() const { +ParameterStorage* Parameter::get() const { return mp->parameters_list()[index]; } -LookupParameterIndex::LookupParameterIndex() { +LookupParameter::LookupParameter() { mp = nullptr; index = 0; } -LookupParameterIndex::LookupParameterIndex(const Model* mp, unsigned long index) : mp(mp), index(index) {} +LookupParameter::LookupParameter(const Model* mp, unsigned long index) : mp(mp), index(index) {} -LookupParameters* LookupParameterIndex::get() const { +LookupParameterStorage* LookupParameter::get() const { return mp->lookup_parameters_list()[index]; } -void LookupParameterIndex::Initialize(unsigned index, const std::vector& val) const { +void LookupParameter::Initialize(unsigned index, const std::vector& val) const { get()->Initialize(index, val); } @@ -227,18 +227,18 @@ float Model::gradient_l2_norm() const { #endif } -ParameterIndex Model::add_parameters(const Dim& d, float scale) { - Parameters* p = new Parameters(d, scale); - ParameterIndex r(this, params.size()); +Parameter Model::add_parameters(const Dim& d, float scale) { + ParameterStorage* p = new ParameterStorage(d, scale); + Parameter r(this, params.size()); //cerr << "Adding parameters with dim " << d << endl; all_params.push_back(p); params.push_back(p); return r; } -LookupParameterIndex Model::add_lookup_parameters(unsigned n, const Dim& d) { - LookupParameters* p = new LookupParameters(n,d); - LookupParameterIndex r(this, lookup_params.size()); +LookupParameter Model::add_lookup_parameters(unsigned n, const Dim& d) { + LookupParameterStorage* p = new LookupParameterStorage(n,d); + LookupParameter r(this, lookup_params.size()); //cerr << "Adding lookup parameters with dim " << d << " and size " << n << endl; all_params.push_back(p); lookup_params.push_back(p); @@ -252,7 +252,7 @@ void Model::reset_gradient() { size_t Model::parameter_count() const { size_t r = 0; - for (const ParametersBase* param : all_params) { + for (const ParameterStorageBase* param : all_params) { r += param->size(); } return r; diff --git a/cnn/model.h b/cnn/model.h index be32491c8..41b60c253 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -22,27 +22,27 @@ namespace cnn { // * LookupParameters represents a table of vectors that are used to embed a // set of discrete objects. These are sparsely updated. -struct ParametersBase { +struct ParameterStorageBase { friend class Model; virtual void scale_parameters(float a) = 0; virtual void squared_l2norm(float* sqnorm) const = 0; virtual void g_squared_l2norm(float* sqnorm) const = 0; virtual size_t size() const = 0; - virtual ~ParametersBase(); + virtual ~ParameterStorageBase(); friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) {} }; // represents parameters (e.g., a weight matrix) that will be optimized -struct Parameters : public ParametersBase { +struct ParameterStorage : public ParameterStorageBase { friend class Model; void scale_parameters(float a) override; void squared_l2norm(float* sqnorm) const override; void g_squared_l2norm(float* sqnorm) const override; size_t size() const override; - void copy(const Parameters & val); + void copy(const ParameterStorage & val); void accumulate_grad(const Tensor& g); void clear(); @@ -50,13 +50,13 @@ struct Parameters : public ParametersBase { Tensor values; Tensor g; private: - Parameters() {} - explicit Parameters(const Dim& d, float minmax); // initialize with ~U(-minmax,+minmax) + ParameterStorage() {} + explicit ParameterStorage(const Dim& d, float minmax); // initialize with ~U(-minmax,+minmax) // or Glorot initialization if minmax = 0 friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { - boost::serialization::base_object(*this); + boost::serialization::base_object(*this); ar & dim; ar & values; ar & g; @@ -64,7 +64,7 @@ struct Parameters : public ParametersBase { }; // represents a matrix/vector embedding of a discrete set -struct LookupParameters : public ParametersBase { +struct LookupParameterStorage : public ParameterStorageBase { friend class Model; void scale_parameters(float a) override; void squared_l2norm(float* sqnorm) const override; @@ -72,7 +72,7 @@ struct LookupParameters : public ParametersBase { size_t size() const override; void Initialize(unsigned index, const std::vector& val); - void copy(const LookupParameters & val); + void copy(const LookupParameterStorage & val); void accumulate_grad(unsigned index, const Tensor& g); void clear(); @@ -82,12 +82,12 @@ struct LookupParameters : public ParametersBase { // gradients are sparse, so track which components are nonzero std::unordered_set non_zero_grads; private: - LookupParameters() {} - LookupParameters(unsigned n, const Dim& d); + LookupParameterStorage() {} + LookupParameterStorage(unsigned n, const Dim& d); friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { - boost::serialization::base_object(*this); + boost::serialization::base_object(*this); ar & dim; ar & values; ar & grads; @@ -95,10 +95,10 @@ struct LookupParameters : public ParametersBase { }; class Model; -struct ParameterIndex { - ParameterIndex(); - ParameterIndex(const Model* mp, unsigned long index); - Parameters* get() const; +struct Parameter { + Parameter(); + Parameter(const Model* mp, unsigned long index); + ParameterStorage* get() const; const Model* mp; unsigned long index; @@ -112,10 +112,10 @@ struct ParameterIndex { } }; -struct LookupParameterIndex { - LookupParameterIndex(); - LookupParameterIndex(const Model* mp, unsigned long index); - LookupParameters* get() const; +struct LookupParameter { + LookupParameter(); + LookupParameter(const Model* mp, unsigned long index); + LookupParameterStorage* get() const; void Initialize(unsigned index, const std::vector& val) const; const Model* mp; @@ -141,14 +141,14 @@ class Model { float gradient_l2_norm() const; void reset_gradient(); // set scale to use custom initialization - ParameterIndex add_parameters(const Dim& d, float scale = 0.0f); - LookupParameterIndex add_lookup_parameters(unsigned n, const Dim& d); + Parameter add_parameters(const Dim& d, float scale = 0.0f); + LookupParameter add_lookup_parameters(unsigned n, const Dim& d); // project weights so their L2 norm = radius void project_weights(float radius = 1.0f); - const std::vector& all_parameters_list() const { return all_params; } - const std::vector& parameters_list() const { return params; } - const std::vector& lookup_parameters_list() const { return lookup_params; } + const std::vector& all_parameters_list() const { return all_params; } + const std::vector& parameters_list() const { return params; } + const std::vector& lookup_parameters_list() const { return lookup_params; } // Returns the total number of tunable parameters (i. e. scalars) contained within this model. // That is to say, a 2x2 matrix counts as four parameters. @@ -163,9 +163,9 @@ class Model { ar & lookup_params; } - std::vector all_params; - std::vector params; - std::vector lookup_params; + std::vector all_params; + std::vector params; + std::vector lookup_params; mutable float* gradient_norm_scratch; }; @@ -173,7 +173,7 @@ void save_cnn_model(std::string filename, Model* model); void load_cnn_model(std::string filename, Model* model); } // namespace cnn -BOOST_CLASS_EXPORT_KEY(cnn::Parameters) -BOOST_CLASS_EXPORT_KEY(cnn::LookupParameters) +BOOST_CLASS_EXPORT_KEY(cnn::ParameterStorage) +BOOST_CLASS_EXPORT_KEY(cnn::LookupParameterStorage) #endif diff --git a/cnn/mp.h b/cnn/mp.h index f1dd3743e..73efea67b 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -277,7 +277,7 @@ namespace cnn { template void RunMultiProcess(unsigned num_children, ILearner* learner, Trainer* trainer, const std::vector& train_data, const std::vector& dev_data, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency) { - assert (cnn::ps->is_shared()); + //assert (cnn::ps->is_shared()); queue_name = GenerateQueueName(); boost::interprocess::message_queue::remove(queue_name.c_str()); boost::interprocess::message_queue::remove(queue_name.c_str()); diff --git a/cnn/param-nodes.h b/cnn/param-nodes.h index 9aa06a428..340a48d35 100644 --- a/cnn/param-nodes.h +++ b/cnn/param-nodes.h @@ -12,7 +12,7 @@ struct ParameterNodeBase : public Node { // represents optimizable parameters struct ParameterNode : public ParameterNodeBase { - explicit ParameterNode(ParameterIndex p) : dim(p.get()->dim), params(p) {} + explicit ParameterNode(Parameter p) : dim(p.get()->dim), params(p) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward_impl(const std::vector& xs, Tensor& fx) const override; @@ -23,12 +23,12 @@ struct ParameterNode : public ParameterNodeBase { Tensor& dEdxi) const override; void accumulate_grad(const Tensor& g) override; Dim dim; - ParameterIndex params; + Parameter params; }; // represents optimizable parameters that are being held constant struct ConstParameterNode : public Node { - explicit ConstParameterNode(ParameterIndex p) : dim(p.get()->dim), params(p) {} + explicit ConstParameterNode(Parameter p) : dim(p.get()->dim), params(p) {} std::string as_string(const std::vector& arg_names) const override; Dim dim_forward(const std::vector& xs) const override; void forward_impl(const std::vector& xs, Tensor& fx) const override; @@ -38,7 +38,7 @@ struct ConstParameterNode : public Node { unsigned i, Tensor& dEdxi) const override; Dim dim; - ParameterIndex params; + Parameter params; }; // represents specified (not learned) inputs to the network @@ -77,12 +77,12 @@ struct ScalarInputNode : public Node { // represents a matrix/vector embedding of an item of a discrete set (1-hot coding) struct LookupNode : public ParameterNodeBase { - LookupNode(LookupParameterIndex p, unsigned ind) : dim(p.get()->dim), index(ind), pindex(&index), indices(), pindices(), params(p) {} - LookupNode(LookupParameterIndex p, const unsigned* pind) : dim(p.get()->dim), index(), pindex(pind), indices(), pindices(), params(p) {} - LookupNode(LookupParameterIndex p, const std::vector& indices) : dim(p.get()->dim), index(), pindex(), indices(indices), pindices(&this->indices), params(p) { + LookupNode(LookupParameter p, unsigned ind) : dim(p.get()->dim), index(ind), pindex(&index), indices(), pindices(), params(p) {} + LookupNode(LookupParameter p, const unsigned* pind) : dim(p.get()->dim), index(), pindex(pind), indices(), pindices(), params(p) {} + LookupNode(LookupParameter p, const std::vector& indices) : dim(p.get()->dim), index(), pindex(), indices(indices), pindices(&this->indices), params(p) { dim.bd = pindices->size(); } - LookupNode(LookupParameterIndex p, const std::vector* pindices) : dim(p.get()->dim), index(), pindex(), indices(), pindices(pindices), params(p) { + LookupNode(LookupParameter p, const std::vector* pindices) : dim(p.get()->dim), index(), pindex(), indices(), pindices(pindices), params(p) { dim.bd = pindices->size(); } std::string as_string(const std::vector& arg_names) const override; @@ -100,7 +100,7 @@ struct LookupNode : public ParameterNodeBase { const unsigned* pindex; std::vector indices; const std::vector* pindices; - LookupParameterIndex params; + LookupParameter params; }; } // namespace cnn diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 1eb1a6aac..d1e861931 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -25,10 +25,10 @@ SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, bool support_lags) : layers(layers), lagging(support_lags) { unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { - ParameterIndex p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); - ParameterIndex p_h2h = model->add_parameters({hidden_dim, hidden_dim}); - ParameterIndex p_hb = model->add_parameters({hidden_dim}); - vector ps = {p_x2h, p_h2h, p_hb}; + Parameter p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2h = model->add_parameters({hidden_dim, hidden_dim}); + Parameter p_hb = model->add_parameters({hidden_dim}); + vector ps = {p_x2h, p_h2h, p_hb}; if (lagging) ps.push_back(model->add_parameters({hidden_dim, hidden_dim})); params.push_back(ps); @@ -39,16 +39,16 @@ SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, void SimpleRNNBuilder::new_graph_impl(ComputationGraph& cg) { param_vars.clear(); for (unsigned i = 0; i < layers; ++i) { - ParameterIndex p_x2h = params[i][X2H]; - ParameterIndex p_h2h = params[i][H2H]; - ParameterIndex p_hb = params[i][HB]; + Parameter p_x2h = params[i][X2H]; + Parameter p_h2h = params[i][H2H]; + Parameter p_hb = params[i][HB]; Expression i_x2h = parameter(cg,p_x2h); Expression i_h2h = parameter(cg,p_h2h); Expression i_hb = parameter(cg,p_hb); vector vars = {i_x2h, i_h2h, i_hb}; if (lagging) { - ParameterIndex p_l2h = params[i][L2H]; + Parameter p_l2h = params[i][L2H]; Expression i_l2h = parameter(cg,p_l2h); vars.push_back(i_l2h); } diff --git a/cnn/rnn.h b/cnn/rnn.h index 9592c775b..a562308cc 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -120,7 +120,7 @@ struct SimpleRNNBuilder : public RNNBuilder { private: // first index is layer, then x2h h2h hb - std::vector> params; + std::vector> params; // first index is layer, then x2h h2h hb std::vector> param_vars; diff --git a/cnn/shadow-params.cc b/cnn/shadow-params.cc index 0dfc377a3..9bb400c0a 100644 --- a/cnn/shadow-params.cc +++ b/cnn/shadow-params.cc @@ -8,12 +8,12 @@ using namespace std; namespace cnn { -ShadowParameters::ShadowParameters(const Parameters& p) : h(p.values) { +ShadowParameters::ShadowParameters(const ParameterStorage& p) : h(p.values) { h.v = (float*)default_device->mem->malloc(h.d.size() * sizeof(float)); TensorTools::Zero(h); } -ShadowLookupParameters::ShadowLookupParameters(const LookupParameters& lp) : h(lp.values) { +ShadowLookupParameters::ShadowLookupParameters(const LookupParameterStorage& lp) : h(lp.values) { for (auto& t : h) { t.v = (float*)default_device->mem->malloc(t.d.size() * sizeof(float)); TensorTools::Zero(t); diff --git a/cnn/shadow-params.h b/cnn/shadow-params.h index 45e5d8bee..11ad23b65 100644 --- a/cnn/shadow-params.h +++ b/cnn/shadow-params.h @@ -11,16 +11,16 @@ namespace cnn { class Model; -struct Parameters; -struct LookupParameters; +struct ParameterStorage; +struct LookupParameterStorage; struct ShadowParameters { - explicit ShadowParameters(const Parameters& p); + explicit ShadowParameters(const ParameterStorage& p); Tensor h; }; struct ShadowLookupParameters { - explicit ShadowLookupParameters(const LookupParameters& lp); + explicit ShadowLookupParameters(const LookupParameterStorage& lp); std::vector h; }; diff --git a/cnn/training.cc b/cnn/training.cc index f9b064adb..8c46a42aa 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -50,7 +50,7 @@ void SimpleSGDTrainer::update_impl(real scale) { update_params(model->lookup_parameters_list(), model->parameters_list(), scale); } -void SimpleSGDTrainer::update_params(const std::vector &lookup_params, const std::vector ¶ms, real scale) { +void SimpleSGDTrainer::update_params(const std::vector &lookup_params, const std::vector ¶ms, real scale) { const float gscale = clip_gradients(); for (auto p : params) { #if HAVE_CUDA diff --git a/cnn/training.h b/cnn/training.h index 81370e476..beab5739e 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -51,7 +51,7 @@ struct SimpleSGDTrainer : public Trainer { explicit SimpleSGDTrainer(Model* m, real e0 = 0.1) : Trainer(m, e0) {} protected: void update_impl(real scale) override; - void update_params(const std::vector &lookup_params, const std::vector ¶ms, real scale = 1); + void update_params(const std::vector &lookup_params, const std::vector ¶ms, real scale = 1); }; struct MomentumSGDTrainer : public Trainer { @@ -67,8 +67,8 @@ struct MomentumSGDTrainer : public Trainer { // the following represent the current velocity std::vector vp; std::vector vlp; - //std::unordered_map vp; - //std::unordered_map> vl; + //std::unordered_map vp; + //std::unordered_map> vl; }; struct AdagradTrainer : public Trainer { diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index 9774189f7..adee7717e 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -25,8 +25,8 @@ int kTRG_SOS; int kTRG_EOS; struct Encoder { - LookupParameterIndex p_s; - LookupParameterIndex p_t; + LookupParameter p_s; + LookupParameter p_t; vector m; explicit Encoder(Model& model) { p_s = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {REP_DIM}); diff --git a/examples/encdec.cc b/examples/encdec.cc index 7570f757c..16cdcd436 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -31,14 +31,14 @@ int kEOS; template struct EncoderDecoder { - LookupParameterIndex p_c; - LookupParameterIndex p_ec; // map input to embedding (used in fwd and rev models) - ParameterIndex p_ie2h; - ParameterIndex p_bie; - ParameterIndex p_h2oe; - ParameterIndex p_boe; - ParameterIndex p_R; - ParameterIndex p_bias; + LookupParameter p_c; + LookupParameter p_ec; // map input to embedding (used in fwd and rev models) + Parameter p_ie2h; + Parameter p_bie; + Parameter p_h2oe; + Parameter p_boe; + Parameter p_R; + Parameter p_bias; Builder dec_builder; Builder rev_enc_builder; Builder fwd_enc_builder; diff --git a/examples/mlc.cc b/examples/mlc.cc index 1f2841839..bae11f783 100644 --- a/examples/mlc.cc +++ b/examples/mlc.cc @@ -100,10 +100,10 @@ struct MLCBuilder { Expression by = parameter(cg, p_by); return affine_transform({by, h2y, h}); } - LookupParameterIndex p_xe; - ParameterIndex p_bh; - ParameterIndex p_h2y; - ParameterIndex p_by; + LookupParameter p_xe; + Parameter p_bh; + Parameter p_h2y; + Parameter p_by; }; int main(int argc, char** argv) { diff --git a/examples/nlm.cc b/examples/nlm.cc index c32c1be38..3ef13cd0a 100644 --- a/examples/nlm.cc +++ b/examples/nlm.cc @@ -23,7 +23,7 @@ int main(int argc, char** argv) { // parameters Model model; SimpleSGDTrainer sgd(&model); - LookupParameterIndex p_c = model.add_lookup_parameters(VOCAB_SIZE, {DIM}); + LookupParameter p_c = model.add_lookup_parameters(VOCAB_SIZE, {DIM}); ComputationGraph cg; diff --git a/examples/poisson-regression.cc b/examples/poisson-regression.cc index 99dd7119c..cc392c72a 100644 --- a/examples/poisson-regression.cc +++ b/examples/poisson-regression.cc @@ -31,9 +31,9 @@ int kEOS; template struct RNNLengthPredictor { - LookupParameterIndex p_c; - ParameterIndex p_R; - ParameterIndex p_bias; + LookupParameter p_c; + Parameter p_R; + Parameter p_bias; Builder builder; explicit RNNLengthPredictor(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); diff --git a/examples/read-write.cc b/examples/read-write.cc index a750ebded..db6d9acf8 100644 --- a/examples/read-write.cc +++ b/examples/read-write.cc @@ -22,7 +22,7 @@ class XORModel { unsigned hidden_size; Expression W, b, V, a; - ParameterIndex pW, pb, pV, pa; + Parameter pW, pb, pV, pa; // It is important to have a null default constructor for the class, as // we would first need to read the class object from the file, followed by diff --git a/examples/rnnlm-aevb.cc b/examples/rnnlm-aevb.cc index ba0b16646..b06efb9d0 100644 --- a/examples/rnnlm-aevb.cc +++ b/examples/rnnlm-aevb.cc @@ -33,21 +33,21 @@ int kEOS; template struct RNNLanguageModel { - LookupParameterIndex p_c; // should we have two of these? + LookupParameter p_c; // should we have two of these? Builder ebuilder; - ParameterIndex p_H; - ParameterIndex p_hb; - ParameterIndex p_h2m; - ParameterIndex p_mb; - ParameterIndex p_h2s; - ParameterIndex p_sb; + Parameter p_H; + Parameter p_hb; + Parameter p_h2m; + Parameter p_mb; + Parameter p_h2s; + Parameter p_sb; // DECODER Builder dbuilder; - ParameterIndex p_R; - ParameterIndex p_bias; - ParameterIndex p_z2h0; - ParameterIndex p_h0b; + Parameter p_R; + Parameter p_bias; + Parameter p_z2h0; + Parameter p_h0b; explicit RNNLanguageModel(Model& model) : ebuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), diff --git a/examples/rnnlm-batch.cc b/examples/rnnlm-batch.cc index ffbc899c6..c823f9b25 100644 --- a/examples/rnnlm-batch.cc +++ b/examples/rnnlm-batch.cc @@ -31,9 +31,9 @@ int kEOS; template struct RNNLanguageModel { - LookupParameterIndex p_c; - ParameterIndex p_R; - ParameterIndex p_bias; + LookupParameter p_c; + Parameter p_R; + Parameter p_bias; Builder builder; explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); diff --git a/examples/rnnlm-cfsm.cc b/examples/rnnlm-cfsm.cc index 9853ba72e..0c5b94086 100644 --- a/examples/rnnlm-cfsm.cc +++ b/examples/rnnlm-cfsm.cc @@ -30,7 +30,7 @@ int kEOS; template struct RNNLanguageModel { - LookupParameterIndex p_c; + LookupParameter p_c; Builder builder; ClassFactoredSoftmaxBuilder& cfsm; explicit RNNLanguageModel(Model& model, ClassFactoredSoftmaxBuilder& h) : diff --git a/examples/rnnlm-givenbag.cc b/examples/rnnlm-givenbag.cc index 8aeb268c2..e1ad3f9da 100644 --- a/examples/rnnlm-givenbag.cc +++ b/examples/rnnlm-givenbag.cc @@ -30,9 +30,9 @@ int kEOS; template struct RNNLanguageModel { - LookupParameterIndex p_c; - ParameterIndex p_R; - ParameterIndex p_bias; + LookupParameter p_c; + Parameter p_R; + Parameter p_bias; Builder builder; explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index f03cfec3f..38d66184e 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -29,9 +29,9 @@ int kEOS; template struct RNNLanguageModel { - LookupParameterIndex p_c; - ParameterIndex p_R; - ParameterIndex p_bias; + LookupParameter p_c; + Parameter p_R; + Parameter p_bias; Builder builder; explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); diff --git a/examples/rnnlm.h b/examples/rnnlm.h index 137b08fed..b255ce5ea 100644 --- a/examples/rnnlm.h +++ b/examples/rnnlm.h @@ -20,9 +20,9 @@ int kEOS; template struct RNNLanguageModel { - LookupParameterIndex p_c; - ParameterIndex p_R; - ParameterIndex p_bias; + LookupParameter p_c; + Parameter p_R; + Parameter p_bias; Builder builder; explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { kSOS = d.Convert(""); diff --git a/examples/rnnlm2.cc b/examples/rnnlm2.cc index 4a116bafa..7fb4701af 100644 --- a/examples/rnnlm2.cc +++ b/examples/rnnlm2.cc @@ -29,9 +29,9 @@ int kEOS; template struct RNNLanguageModel { - LookupParameterIndex p_c; - ParameterIndex p_R; - ParameterIndex p_bias; + LookupParameter p_c; + Parameter p_R; + Parameter p_bias; Builder builder; explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index 61941e9fc..ae43fa079 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -98,7 +98,7 @@ struct SymbolEmbedding { return lookup(*cg, p_labels, label_id); } ComputationGraph* cg; - LookupParameterIndex p_labels; + LookupParameter p_labels; }; struct DurationEmbedding { @@ -143,11 +143,11 @@ struct MLPDurationEmbedding : public DurationEmbedding { ComputationGraph* cg; vector> dur_xs; Expression zero, d2h, hb, h2o, ob; - ParameterIndex p_zero; - ParameterIndex p_d2h; - ParameterIndex p_hb; - ParameterIndex p_h2o; - ParameterIndex p_ob; + Parameter p_zero; + Parameter p_d2h; + Parameter p_hb; + Parameter p_h2o; + Parameter p_ob; }; struct BinnedDurationEmbedding : public DurationEmbedding { @@ -164,16 +164,16 @@ struct BinnedDurationEmbedding : public DurationEmbedding { } ComputationGraph* cg; int max_bin; - LookupParameterIndex p_e; + LookupParameter p_e; }; template struct BiTrans { Builder l2rbuilder; Builder r2lbuilder; - ParameterIndex p_f2c; - ParameterIndex p_r2c; - ParameterIndex p_cb; + Parameter p_f2c; + Parameter p_r2c; + Parameter p_cb; explicit BiTrans(Model& model) : l2rbuilder(LAYERS, INPUT_DIM, XCRIBE_DIM, &model), @@ -218,7 +218,7 @@ struct BiTrans { // first call construct_chart(sequence), then access the embeddings of the spans with operator()(i,j) template struct SegEmbedUni { - ParameterIndex p_h0; + Parameter p_h0; int len; Builder builder; vector> h; // h[i][length of segment - 1] @@ -696,12 +696,12 @@ struct SegmentalRNN { return; } - ParameterIndex p_d2h1, p_y2h1, p_fwd2h1, p_rev2h1, p_h1b; - ParameterIndex p_h12h2, p_h2b; - ParameterIndex p_h22o, p_ob; + Parameter p_d2h1, p_y2h1, p_fwd2h1, p_rev2h1, p_h1b; + Parameter p_h12h2, p_h2b; + Parameter p_h22o, p_ob; // used in the context awareness - ParameterIndex p_c_start, p_c_end; - ParameterIndex p_cf2h1, p_ce2h1; + Parameter p_c_start, p_c_end; + Parameter p_cf2h1, p_ce2h1; }; // a a 0 1 a ||| O:1 O:1 N:2 O:1 diff --git a/examples/skiprnnlm.cc b/examples/skiprnnlm.cc index 15274eebe..039967102 100644 --- a/examples/skiprnnlm.cc +++ b/examples/skiprnnlm.cc @@ -41,9 +41,9 @@ typedef vector Corpus; struct RNNSkipLM { - LookupParameterIndex p_c; - ParameterIndex p_R; - ParameterIndex p_bias; + LookupParameter p_c; + Parameter p_R; + Parameter p_bias; SimpleRNNBuilder builder; explicit RNNSkipLM(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model, true) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); diff --git a/examples/tag-bilstm.cc b/examples/tag-bilstm.cc index 3c1420b24..8f3e179cf 100644 --- a/examples/tag-bilstm.cc +++ b/examples/tag-bilstm.cc @@ -36,13 +36,13 @@ int kEOS; template struct RNNLanguageModel { - LookupParameterIndex p_w; - ParameterIndex p_l2th; - ParameterIndex p_r2th; - ParameterIndex p_thbias; + LookupParameter p_w; + Parameter p_l2th; + Parameter p_r2th; + Parameter p_thbias; - ParameterIndex p_th2t; - ParameterIndex p_tbias; + Parameter p_th2t; + Parameter p_tbias; Builder l2rbuilder; Builder r2lbuilder; explicit RNNLanguageModel(Model& model) : diff --git a/examples/textcat.cc b/examples/textcat.cc index 6c7e631a1..4e8ae308f 100644 --- a/examples/textcat.cc +++ b/examples/textcat.cc @@ -29,11 +29,11 @@ int kSOS; int kEOS; struct NeuralBagOfWords { - LookupParameterIndex p_w; - ParameterIndex p_c2h; - ParameterIndex p_hbias; - ParameterIndex p_h2o; - ParameterIndex p_obias; + LookupParameter p_w; + Parameter p_c2h; + Parameter p_hbias; + Parameter p_h2o; + Parameter p_obias; explicit NeuralBagOfWords(Model& m) : p_w(m.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), @@ -108,17 +108,17 @@ struct ConvLayer { } return r; } - vector> p_filts; // [feature map index from][feature map index to] - vector> p_fbias; // [feature map index from][feature map index to] + vector> p_filts; // [feature map index from][feature map index to] + vector> p_fbias; // [feature map index from][feature map index to] int k_fold_rows; }; struct ConvNet { - LookupParameterIndex p_w; + LookupParameter p_w; ConvLayer cl1; ConvLayer cl2; - ParameterIndex p_t2o; - ParameterIndex p_obias; + Parameter p_t2o; + Parameter p_obias; explicit ConvNet(Model& m) : p_w(m.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), diff --git a/examples/tok-embed.cc b/examples/tok-embed.cc index 54b8ace12..8b5532333 100644 --- a/examples/tok-embed.cc +++ b/examples/tok-embed.cc @@ -62,11 +62,11 @@ struct PrefixNode { } bool terminal; - ParameterIndex bias; - ParameterIndex pred; - ParameterIndex zero_cond; + Parameter bias; + Parameter pred; + Parameter zero_cond; PrefixNode* zero_child; - ParameterIndex one_cond; + Parameter one_cond; PrefixNode* one_child; }; @@ -127,13 +127,13 @@ struct SymbolEmbedding { return lookup(*cg, p_labels, label_id); } ComputationGraph* cg; - LookupParameterIndex p_labels; + LookupParameter p_labels; }; struct PrefixCodeDecoder { LSTMBuilder decoder; PrefixCode* pfc; - ParameterIndex p_start; + Parameter p_start; explicit PrefixCodeDecoder(Model& model, PrefixCode* pc) : decoder(LAYERS, CHAR_DIM, EMBED_DIM, &model), pfc(pc) { p_start = model.add_parameters({EMBED_DIM}); @@ -171,11 +171,11 @@ template struct BiCharLSTM { Builder l2rbuilder; Builder r2lbuilder; - ParameterIndex p_f2c; - ParameterIndex p_r2c; - ParameterIndex p_cb; - ParameterIndex p_c2x; - ParameterIndex p_xb; + Parameter p_f2c; + Parameter p_r2c; + Parameter p_cb; + Parameter p_c2x; + Parameter p_xb; SymbolEmbedding sym; explicit BiCharLSTM(Model& model) : diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup.cc index fd01e7195..304d854d9 100644 --- a/examples/xor-batch-lookup.cc +++ b/examples/xor-batch-lookup.cc @@ -29,8 +29,8 @@ int main(int argc, char** argv) { Expression V = parameter(cg, m.add_parameters({1, HIDDEN_SIZE})); Expression a = parameter(cg, m.add_parameters({1})); - LookupParameterIndex x_values = m.add_lookup_parameters(4, {2}); - LookupParameterIndex y_values = m.add_lookup_parameters(4, {1}); + LookupParameter x_values = m.add_lookup_parameters(4, {2}); + LookupParameter y_values = m.add_lookup_parameters(4, {1}); x_values.Initialize(0, {1.0, 1.0}); x_values.Initialize(1, {-1.0, 1.0}); x_values.Initialize(2, {1.0, -1.0}); diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index 5ceba2e98..048c1ca8a 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -24,7 +24,7 @@ int main(int argc, char** argv) { ComputationGraph cg; - ParameterIndex p_W, p_b, p_V, p_a; + Parameter p_W, p_b, p_V, p_a; if (argc == 2) { ifstream in(argv[1]); boost::archive::text_iarchive ia(in); diff --git a/examples/xor.cc b/examples/xor.cc index 91d0719fa..d95ef84c0 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -23,7 +23,7 @@ int main(int argc, char** argv) { //MomentumSGDTrainer sgd(&m); ComputationGraph cg; - ParameterIndex p_W, p_b, p_V, p_a; + Parameter p_W, p_b, p_V, p_a; if (argc == 2) { ifstream in(argv[1]); boost::archive::text_iarchive ia(in); diff --git a/rnnlm/lm.cc b/rnnlm/lm.cc index 9c41178f8..2478865d6 100644 --- a/rnnlm/lm.cc +++ b/rnnlm/lm.cc @@ -70,9 +70,9 @@ void InitCommandLine(int argc, char** argv, po::variables_map* conf) { template struct RNNLanguageModel { - LookupParameterIndex p_c; - ParameterIndex p_R; - ParameterIndex p_bias; + LookupParameter p_c; + Parameter p_R; + Parameter p_bias; Builder builder; explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 70fc0b374..70c27c8ca 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -55,7 +55,7 @@ struct NodeTest { std::vector ones3_vals, ones2_vals, first_one_vals, batch_vals; std::vector av; cnn::Model mod; - cnn::ParameterIndex param1, param2, param3, param_scalar1, param_scalar2; + cnn::Parameter param1, param2, param3, param_scalar1, param_scalar2; }; // define the test suite From 33da1283b72adf0ff3d0ba9e0686a905f616ed61 Mon Sep 17 00:00:00 2001 From: dhg Date: Sun, 14 Feb 2016 12:41:12 -0800 Subject: [PATCH 434/965] error message was on the wrong assert --- pycnn/pycnn.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index ae07476ea..594ba157d 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -179,8 +179,8 @@ cdef class Model: return pp def add_lookup_parameters(self, name, dim): - assert(isinstance(dim, tuple)), "name already registered" - assert(name not in self.named_params) + assert(isinstance(dim, tuple)) + assert(name not in self.named_params), "name already registered" cdef int nids = dim[0] rest = tuple(dim[1:]) cdef CLookupParameters* p From 6ffa5f6bf5c1b33cf3bff84d543db92478ee2da4 Mon Sep 17 00:00:00 2001 From: austinma Date: Mon, 22 Feb 2016 07:33:16 -0500 Subject: [PATCH 435/965] Made a bunch of RNN stuff serializable --- cnn/cfsm-builder.cc | 29 +++++++++++++++++++++++++++-- cnn/cfsm-builder.h | 10 ++++++++-- cnn/hsm-builder.cc | 4 ++++ cnn/hsm-builder.h | 2 ++ cnn/lstm.h | 1 + cnn/mp.h | 2 +- cnn/rnn-state-machine.h | 7 +++++++ cnn/rnn.cc | 2 ++ cnn/rnn.h | 31 +++++++++++++++++++++++++++++++ 9 files changed, 83 insertions(+), 5 deletions(-) diff --git a/cnn/cfsm-builder.cc b/cnn/cfsm-builder.cc index c276a6dc1..7d368d9e0 100644 --- a/cnn/cfsm-builder.cc +++ b/cnn/cfsm-builder.cc @@ -34,7 +34,7 @@ Expression StandardSoftmaxBuilder::neg_log_softmax(const Expression& rep, unsign return pickneglogsoftmax(affine_transform({b, w, rep}), wordidx); } -unsigned StandardSoftmaxBuilder::sample(const expr::Expression& rep) { +unsigned StandardSoftmaxBuilder::sample(const Expression& rep) { softmax(affine_transform({b, w, rep})); vector dist = as_vector(pcg->incremental_forward()); unsigned c = 0; @@ -49,6 +49,10 @@ unsigned StandardSoftmaxBuilder::sample(const expr::Expression& rep) { return c; } +Expression StandardSoftmaxBuilder::full_log_distribution(const Expression& rep) { + return log(softmax(affine_transform({b, w, rep}))); +} + ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder() {} ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder(unsigned rep_dim, @@ -101,7 +105,7 @@ Expression ClassFactoredSoftmaxBuilder::neg_log_softmax(const Expression& rep, u return cnlp + wnlp; } -unsigned ClassFactoredSoftmaxBuilder::sample(const expr::Expression& rep) { +unsigned ClassFactoredSoftmaxBuilder::sample(const Expression& rep) { // TODO assert that new_graph has been called Expression cscores = affine_transform({cbias, r2c, rep}); softmax(cscores); @@ -130,6 +134,27 @@ unsigned ClassFactoredSoftmaxBuilder::sample(const expr::Expression& rep) { return cidx2words[c][w]; } +Expression ClassFactoredSoftmaxBuilder::full_log_distribution(const Expression& rep) { + vector full_dist(widx2cidx.size()); + for (unsigned i = 0; i < widx2cidx.size(); ++i) { + assert (widx2cidx[i] != -1); + } + + for (unsigned c = 0; c < p_rc2ws.size(); ++c) { + Expression& cwbias = get_rc2wbias(c); + Expression& r2cw = get_rc2w(c); + Expression wscores = affine_transform({cwbias, r2cw, rep}); + Expression wdist = softmax(wscores); + + for (unsigned i = 0; i < cidx2words[c].size(); ++i) { + unsigned w = cidx2words[c][i]; + full_dist[w] = pick(wdist, i); + } + } + + return log(softmax(concatenate(full_dist))); +} + void ClassFactoredSoftmaxBuilder::ReadClusterFile(const std::string& cluster_file, Dict* word_dict) { cerr << "Reading clusters from " << cluster_file << " ...\n"; ifstream in(cluster_file); diff --git a/cnn/cfsm-builder.h b/cnn/cfsm-builder.h index 5a91513bd..15317e5bf 100644 --- a/cnn/cfsm-builder.h +++ b/cnn/cfsm-builder.h @@ -16,12 +16,16 @@ class SoftmaxBuilder { // call this once per ComputationGraph virtual void new_graph(ComputationGraph& cg) = 0; - // -log(p(c | rep) * p(w | c, rep)) + // -log(p(w | rep)) virtual expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx) = 0; - // samples a word from p(w,c | rep) + // samples a word from p(w | rep) virtual unsigned sample(const expr::Expression& rep) = 0; + // returns an Expression representing a vector the size of the vocabulary. + // The ith dimension gives log p(w_i | rep). This function may be SLOW. Avoid if possible. + virtual expr::Expression full_log_distribution(const expr::Expression& rep) = 0; + friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) {} @@ -33,6 +37,7 @@ class StandardSoftmaxBuilder : public SoftmaxBuilder { void new_graph(ComputationGraph& cg); expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx); unsigned sample(const expr::Expression& rep); + expr::Expression full_log_distribution(const expr::Expression& rep); private: StandardSoftmaxBuilder(); @@ -64,6 +69,7 @@ class ClassFactoredSoftmaxBuilder : public SoftmaxBuilder { void new_graph(ComputationGraph& cg); expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx); unsigned sample(const expr::Expression& rep); + expr::Expression full_log_distribution(const expr::Expression& rep); private: ClassFactoredSoftmaxBuilder(); diff --git a/cnn/hsm-builder.cc b/cnn/hsm-builder.cc index b69969c03..381e12ca3 100644 --- a/cnn/hsm-builder.cc +++ b/cnn/hsm-builder.cc @@ -239,6 +239,10 @@ unsigned HierarchicalSoftmaxBuilder::sample(const expr::Expression& rep) { return node->get_word(c); } +Expression HierarchicalSoftmaxBuilder::full_log_distribution(const Expression& rep) { + assert (false && "full_distribution not implemented for HierarchicalSoftmaxBuilder"); +} + inline bool is_ws(char x) { return (x == ' ' || x == '\t'); } inline bool not_ws(char x) { return (x != ' ' && x != '\t'); } diff --git a/cnn/hsm-builder.h b/cnn/hsm-builder.h index fbf7048a3..5bdb9f5bd 100644 --- a/cnn/hsm-builder.h +++ b/cnn/hsm-builder.h @@ -80,6 +80,8 @@ class HierarchicalSoftmaxBuilder : public SoftmaxBuilder { // samples a word from p(w,c | rep) unsigned sample(const expr::Expression& rep); + expr::Expression full_log_distribution(const expr::Expression& rep); + private: Cluster* ReadClusterFile(const std::string& cluster_file, Dict* word_dict); std::vector widx2path; // will be NULL if not found diff --git a/cnn/lstm.h b/cnn/lstm.h index 7ca46cafe..c1108da04 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -66,6 +66,7 @@ struct LSTMBuilder : public RNNBuilder { friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); ar & params; ar & layers; ar & dropout_rate; diff --git a/cnn/mp.h b/cnn/mp.h index 73efea67b..262d82166 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -265,7 +265,7 @@ namespace cnn { } } if (header.end_of_epoch) { - //trainer->update_epoch(); + trainer->update_epoch(); } // Let the parent know that we're done and return the loss value diff --git a/cnn/rnn-state-machine.h b/cnn/rnn-state-machine.h index 1d3db3ea1..def146bb4 100644 --- a/cnn/rnn-state-machine.h +++ b/cnn/rnn-state-machine.h @@ -1,5 +1,6 @@ #ifndef CNN_RNN_STATE_MACHINE_H_ #define CNN_RNN_STATE_MACHINE_H_ +#include namespace cnn { @@ -36,6 +37,12 @@ class RNNStateMachine { } private: RNNState q_; + + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & q_; + } }; } // namespace cnn diff --git a/cnn/rnn.cc b/cnn/rnn.cc index d1e861931..400b81a10 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -12,6 +12,8 @@ using namespace std; using namespace cnn::expr; using namespace cnn; +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::RNNBuilder) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::SimpleRNNBuilder) namespace cnn { enum { X2H=0, H2H, HB, L2H }; diff --git a/cnn/rnn.h b/cnn/rnn.h index a562308cc..e8dec4ae3 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -1,6 +1,7 @@ #ifndef CNN_RNN_H_ #define CNN_RNN_H_ +#include #include "cnn/cnn.h" #include "cnn/rnn-state-machine.h" #include "cnn/expr.h" @@ -90,6 +91,14 @@ struct RNNBuilder { // the state machine ensures that the caller is behaving RNNStateMachine sm; std::vector head; // head[i] returns the head position + + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & cur; + ar & head; + ar & sm; + } }; struct SimpleRNNBuilder : public RNNBuilder { @@ -134,8 +143,30 @@ struct SimpleRNNBuilder : public RNNBuilder { unsigned layers; bool lagging; + + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & params; + ar & layers; + ar & lagging; + } }; } // namespace cnn + +namespace boost { + namespace serialization { + template + void serialize(Archive& ar, cnn::RNNPointer& p, const unsigned int version) + { + ar & p.t; + } + } // namespace serialization +} // namespace boost + +BOOST_CLASS_EXPORT_KEY(cnn::RNNBuilder) +BOOST_CLASS_EXPORT_KEY(cnn::SimpleRNNBuilder) #endif From d8219f6ae62a730e0c09cb0747a09d78b2037573 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 24 Feb 2016 11:20:02 +0900 Subject: [PATCH 436/965] Added some accessors to Dict --- cnn/dict.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cnn/dict.h b/cnn/dict.h index c636c02c5..28ad0f025 100644 --- a/cnn/dict.h +++ b/cnn/dict.h @@ -71,6 +71,9 @@ typedef std::unordered_map Map; map_unk = true; } + + int GetUnkId() const { return unk_id; } + const std::vector & GetWords() const { return words_; } void clear() { words_.clear(); d_.clear(); } From 8469f65bacbe0c0b5b8d15665e8e803ef2ba4ab5 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 29 Feb 2016 08:11:45 +0900 Subject: [PATCH 437/965] More clear error for batch pick --- cnn/nodes.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 99c1785e4..fbbf11b38 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1525,7 +1525,7 @@ void PickElement::forward_impl(const vector& xs, Tensor& fx) cons if(pval) { if (*pval >= xs[0]->d.rows()) { cerr << "PickElement::forward_impl requested element " << *pval - << "from a vector of length " << xs[0]->d.rows() << endl; + << " from a vector of length " << xs[0]->d.rows() << endl; abort(); } auto x = **xs[0]; @@ -1534,6 +1534,11 @@ void PickElement::forward_impl(const vector& xs, Tensor& fx) cons assert(pvals); assert(pvals->size() == fx.d.batch_elems()); for(unsigned b = 0; b < pvals->size(); ++b) { + if ((*pvals)[b] >= xs[0]->d.rows()) { + cerr << "PickElement::forward_impl requested element " << (*pvals)[b] + << " from a vector of length " << xs[0]->d.rows() << endl; + abort(); + } auto x = xs[0]->batch_matrix(b); fx.v[b] = x((*pvals)[b]); } From e8ae9ea9555a52d4dd1a68906618af493a0566bc Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Tue, 8 Mar 2016 13:14:26 +0200 Subject: [PATCH 438/965] Update INSTALL.md --- INSTALL.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 0bf88d174..6e42c376a 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -5,19 +5,15 @@ First, get CNN and Eigen: ```bash mkdir cnn cd cnn -git clone https://github.com/yoavg/cnn.git +git clone https://github.com/clab/cnn.git hg clone https://bitbucket.org/eigen/eigen/ ``` Compile CNN. -Note that we are currently relying on the CNN code that is in the -`pycnn` branch (it has a few modifications needed for pyCNN to work), -but at some point this will be merged into cnn proper. (modify the code below to point to the correct boost location) ```bash cd cnn -git checkout pycnn # branch mkdir build cd build cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBOOST_ROOT=/home/yogo/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON From 36f86e6c41ba0ef8baacb5b4a01d7985644d7b3b Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Wed, 9 Mar 2016 16:54:53 +0000 Subject: [PATCH 439/965] add support for saving/loading LSTMs and word embeddings (partial serialization) --- cnn/CMakeLists.txt | 1 + cnn/lstm.cc | 41 +++++++++++++++++++++++++++++++ cnn/lstm.h | 3 +++ cnn/pretrain.cc | 61 ++++++++++++++++++++++++++++++++++++++++++++++ cnn/pretrain.h | 22 +++++++++++++++++ cnn/rnn.cc | 54 ++++++++++++++++++++++++++++++++++++++++ cnn/rnn.h | 12 +++++++++ 7 files changed, 194 insertions(+) create mode 100644 cnn/pretrain.cc create mode 100644 cnn/pretrain.h diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 58d7ed604..2a777b4ed 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -23,6 +23,7 @@ set(cnn_library_SRCS nodes.cc nodes-common.cc param-nodes.cc + pretrain.cc rnn.cc rnn-state-machine.cc saxe-init.cc diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 1e3999427..57de9445f 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -1,5 +1,6 @@ #include "cnn/lstm.h" +#include #include #include #include @@ -158,4 +159,44 @@ void LSTMBuilder::copy(const RNNBuilder & rnn) { params[i][j] = rnn_lstm.params[i][j]; } +void LSTMBuilder::save_parameters_pretraining(const string& fname) const { + cerr << "Writing LSTM parameters to " << fname << endl; + ofstream of(fname); + assert(of); + boost::archive::binary_oarchive oa(of); + std::string id = "LSTMBuilder:params"; + oa << id; + oa << layers; + for (unsigned i = 0; i < layers; ++i) { + for (auto p : params[i]) { + oa << p.get()->values; + } + } +} + +void LSTMBuilder::load_parameters_pretraining(const string& fname) { + cerr << "Loading LSTM parameters from " << fname << endl; + ifstream of(fname); + assert(of); + boost::archive::binary_iarchive ia(of); + std::string id; + ia >> id; + if (id != "LSTMBuilder:params") { + cerr << "Bad id read\n"; + abort(); + } + unsigned l = 0; + ia >> l; + if (l != layers) { + cerr << "Bad number of layers\n"; + abort(); + } + // TODO check other dimensions + for (unsigned i = 0; i < layers; ++i) { + for (auto p : params[i]) { + ia >> p.get()->values; + } + } +} + } // namespace cnn diff --git a/cnn/lstm.h b/cnn/lstm.h index c1108da04..f8e82ca0e 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -39,6 +39,9 @@ struct LSTMBuilder : public RNNBuilder { } void copy(const RNNBuilder & params) override; + + void save_parameters_pretraining(const std::string& fname) const override; + void load_parameters_pretraining(const std::string& fname) override; protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; diff --git a/cnn/pretrain.cc b/cnn/pretrain.cc new file mode 100644 index 000000000..9e90f48e5 --- /dev/null +++ b/cnn/pretrain.cc @@ -0,0 +1,61 @@ +#include "cnn/pretrain.h" + +#include +#include +#include +#include +#include +#include "cnn/dict.h" +#include "cnn/model.h" + +using namespace std; + +namespace cnn { + +void SavePretrainedEmbeddings(const std::string& fname, + const Dict& d, + const LookupParameter& lp) { + cerr << "Writing word vectors to " << fname << " ...\n"; + ofstream out(fname); + assert(out); + auto& m = *lp.get(); + for (unsigned i = 0; i < d.size(); ++i) { + out << d.Convert(i) << ' ' << (*m.values[i]).transpose() << endl; + } +} + +void ReadPretrainedEmbeddings(const std::string& fname, + Dict* d, + std::unordered_map>* vectors) { + int unk = -1; + if (d->is_frozen()) unk = d->GetUnkId(); + cerr << "Loading word vectors from " << fname << " ...\n"; + ifstream in(fname); + assert(in); + string line; + string word; + vector v; + getline(in, line); + istringstream lin(line); + lin >> word; + while(lin) { + float x; + lin >> x; + if (!lin) break; + v.push_back(x); + } + unsigned vec_size = v.size(); + int wid = d->Convert(word); + if (wid != unk) (*vectors)[wid] = v; + while(getline(in, line)) { + istringstream lin(line); + lin >> word; + int w = d->Convert(word); + if (w != unk) { + for (unsigned i = 0; i < vec_size; ++i) lin >> v[i]; + (*vectors)[w] = v; + } + } +} + +} // cnn diff --git a/cnn/pretrain.h b/cnn/pretrain.h new file mode 100644 index 000000000..9a674597e --- /dev/null +++ b/cnn/pretrain.h @@ -0,0 +1,22 @@ +#ifndef CNN_PRETRAIN_H +#define CNN_PRETRAIN_H + +#include +#include +#include +#include "cnn/dict.h" +#include "cnn/model.h" + +namespace cnn { + +void SavePretrainedEmbeddings(const std::string& fname, + const Dict& d, + const LookupParameter& lp); + +void ReadPretrainedEmbeddings(const std::string& fname, + Dict* d, + std::unordered_map>* vectors); + +} // namespace cnn + +#endif diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 400b81a10..20745ecb0 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -3,7 +3,10 @@ #include #include #include +#include #include +#include +#include #include "cnn/nodes.h" #include "cnn/expr.h" @@ -20,6 +23,16 @@ enum { X2H=0, H2H, HB, L2H }; RNNBuilder::~RNNBuilder() {} +void RNNBuilder::save_parameters_pretraining(const string& fname) const { + cerr << "RNNBuilder::save_parameters_pretraining not overridden.\n"; + abort(); +} + +void RNNBuilder::load_parameters_pretraining(const string& fname) { + cerr << "RNNBuilder::load_parameters_pretraining not overridden.\n"; + abort(); +} + SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, @@ -121,4 +134,45 @@ void SimpleRNNBuilder::copy(const RNNBuilder & rnn) { } } +void SimpleRNNBuilder::save_parameters_pretraining(const string& fname) const { + cerr << "Writing parameters to " << fname << endl; + ofstream of(fname); + assert(of); + boost::archive::binary_oarchive oa(of); + std::string id = "SimpleRNNBuilder:params"; + oa << id; + oa << layers; + for (unsigned i = 0; i < layers; ++i) { + for (auto p : params[i]) { + oa << p.get()->values; + } + } +} + +void SimpleRNNBuilder::load_parameters_pretraining(const string& fname) { + cerr << "Loading parameters from " << fname << endl; + ifstream of(fname); + assert(of); + boost::archive::binary_iarchive ia(of); + std::string id; + ia >> id; + if (id != "SimpleRNNBuilder:params") { + cerr << "Bad id read\n"; + abort(); + } + unsigned l = 0; + ia >> l; + if (l != layers) { + cerr << "Bad number of layers\n"; + abort(); + } + // TODO check other dimensions + for (unsigned i = 0; i < layers; ++i) { + for (auto p : params[i]) { + ia >> p.get()->values; + } + } +} + + } // namespace cnn diff --git a/cnn/rnn.h b/cnn/rnn.h index e8dec4ae3..c6709e340 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -82,6 +82,15 @@ struct RNNBuilder { virtual std::vector get_s(RNNPointer i) const = 0; // copy the parameters of another builder virtual void copy(const RNNBuilder & params) = 0; + + // the following functions save all the parameters associated with a particular + // RNNBuilder's derived class to a file. These should not be used to seralize + // models, they should only be used to load and save parameters for pretraining. + // If you are interested in serializing models, use the boost serialization + // API against your model class + virtual void save_parameters_pretraining(const std::string& fname) const; + virtual void load_parameters_pretraining(const std::string& fname); + protected: virtual void new_graph_impl(ComputationGraph& cg) = 0; virtual void start_new_sequence_impl(const std::vector& h_0) = 0; @@ -127,6 +136,9 @@ struct SimpleRNNBuilder : public RNNBuilder { unsigned num_h0_components() const override { return layers; } + void save_parameters_pretraining(const std::string& fname) const override; + void load_parameters_pretraining(const std::string& fname) override; + private: // first index is layer, then x2h h2h hb std::vector> params; From abcd2ee77efe56c45bdca18518fad15524440092 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Wed, 16 Mar 2016 15:53:10 +0200 Subject: [PATCH 440/965] Update INSTALL.md --- INSTALL.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/INSTALL.md b/INSTALL.md index 6e42c376a..0d762fed9 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -52,3 +52,8 @@ python2 xor.py python2 rnnlm.py rnnlm.py ``` +Alternatively, if the following script works for you, then your installation is likely to be working: +``` +from pycnn import * +model = Model() +``` From 0e0f166baf6ff50279b8f9b24b0a4a370db64669 Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 11:33:19 +0100 Subject: [PATCH 441/965] Update INSTALL.md --- INSTALL.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 0d762fed9..8f0b49c77 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -6,7 +6,9 @@ First, get CNN and Eigen: mkdir cnn cd cnn git clone https://github.com/clab/cnn.git -hg clone https://bitbucket.org/eigen/eigen/ +# hg clone https://bitbucket.org/eigen/eigen/ # Latest version (17.03.16) of Eigen fails to compile. +wget u.cs.biu.ac.il/~yogo/eigen.tgz +tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed. ``` Compile CNN. From 38487b634d21e1779b2fef80a41fdc55121f51e1 Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 11:50:04 +0100 Subject: [PATCH 442/965] Update INSTALL.md --- INSTALL.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 8f0b49c77..842ea1b78 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -3,9 +3,9 @@ First, get CNN and Eigen: ```bash -mkdir cnn -cd cnn +cd $HOME git clone https://github.com/clab/cnn.git +cd cnn # hg clone https://bitbucket.org/eigen/eigen/ # Latest version (17.03.16) of Eigen fails to compile. wget u.cs.biu.ac.il/~yogo/eigen.tgz tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed. @@ -15,10 +15,7 @@ Compile CNN. (modify the code below to point to the correct boost location) ```bash -cd cnn -mkdir build -cd build -cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBOOST_ROOT=/home/yogo/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON +cmake -DEIGEN3_INCLUDE_DIR=./eigen -DBOOST_ROOT=$HOME/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON make -j 2 ``` @@ -28,7 +25,7 @@ If you don't have cython, it can be installed with either `pip install cython` o ```bash pip2 install cython --user -cd ../pycnn +cd $HOME/cnn/pycnn make make install ``` @@ -41,7 +38,7 @@ Add the following line to your profile (`.zshrc` or `.bashrc`), change according to your installation location. ```bash -export LD_LIBRARY_PATH=/home/yogo/cnn/cnn/pycnn +export LD_LIBRARY_PATH=$HOME/cnn/pycnn ``` Now, check that everything works: From 598e1d9e980fc006e69802741d898da37b1b2505 Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 11:50:59 +0100 Subject: [PATCH 443/965] Update setup.py --- pycnn/setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pycnn/setup.py b/pycnn/setup.py index b82e01593..f950b015a 100644 --- a/pycnn/setup.py +++ b/pycnn/setup.py @@ -13,8 +13,8 @@ "pycnn", # name of extension ["pycnn.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source - include_dirs=["../../cnn/", - "../../eigen/"], + include_dirs=["../../cnn/", # this should be the parent directory of cnn + "../eigen/"], # this is the directory where eigen is saved. libraries=['cnn_shared'], # ditto library_dirs=["."], #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed From 69f7d1a12c997acb399eed9fa660e8a3e511433d Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 12:09:24 +0100 Subject: [PATCH 444/965] Update INSTALL.md --- INSTALL.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 842ea1b78..f4ccb019a 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -25,7 +25,10 @@ If you don't have cython, it can be installed with either `pip install cython` o ```bash pip2 install cython --user -cd $HOME/cnn/pycnn +cd $HOME/cnn +mkdir build/cnn +cp cnn/libcnn_shared.so build/cnn/ +cd pycnn make make install ``` From ba7fff970f8993d74d31be53d3bc5a260d701a49 Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 13:04:24 +0100 Subject: [PATCH 445/965] Update INSTALL.md --- INSTALL.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index f4ccb019a..f76095eca 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -15,6 +15,9 @@ Compile CNN. (modify the code below to point to the correct boost location) ```bash +cd $HOME/cnn/ +mkdir build +cd build cmake -DEIGEN3_INCLUDE_DIR=./eigen -DBOOST_ROOT=$HOME/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON make -j 2 ``` @@ -25,10 +28,7 @@ If you don't have cython, it can be installed with either `pip install cython` o ```bash pip2 install cython --user -cd $HOME/cnn -mkdir build/cnn -cp cnn/libcnn_shared.so build/cnn/ -cd pycnn +cd $HOME/cnn/pycnn make make install ``` From d70ec632ed4efb19cf37e3ccff265ff099aa0047 Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 13:07:24 +0100 Subject: [PATCH 446/965] Update INSTALL.md --- INSTALL.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/INSTALL.md b/INSTALL.md index f76095eca..80bec2e23 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -6,6 +6,8 @@ First, get CNN and Eigen: cd $HOME git clone https://github.com/clab/cnn.git cd cnn +git submodule init +git submodule update # hg clone https://bitbucket.org/eigen/eigen/ # Latest version (17.03.16) of Eigen fails to compile. wget u.cs.biu.ac.il/~yogo/eigen.tgz tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed. From 85a022f87578405b206c7394e2828cd9b38e4f8c Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 13:08:06 +0100 Subject: [PATCH 447/965] Update INSTALL.md --- INSTALL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 80bec2e23..ee94bad45 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -6,8 +6,8 @@ First, get CNN and Eigen: cd $HOME git clone https://github.com/clab/cnn.git cd cnn -git submodule init -git submodule update +git submodule init # To be consistent with CNN's installation instructions. +git submodule update # To be consistent with CNN's installation instructions. # hg clone https://bitbucket.org/eigen/eigen/ # Latest version (17.03.16) of Eigen fails to compile. wget u.cs.biu.ac.il/~yogo/eigen.tgz tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed. From 102bdec10f1a8eba07b98b62b400821f3835543c Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 13:10:22 +0100 Subject: [PATCH 448/965] Update INSTALL.md --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index ee94bad45..ff4c5d56a 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -20,7 +20,7 @@ Compile CNN. cd $HOME/cnn/ mkdir build cd build -cmake -DEIGEN3_INCLUDE_DIR=./eigen -DBOOST_ROOT=$HOME/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON +cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBOOST_ROOT=$HOME/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON make -j 2 ``` From 2e346769c9f0e076c7dcec1e23ff7af47b0ccea6 Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 13:11:21 +0100 Subject: [PATCH 449/965] Update INSTALL.md --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index ff4c5d56a..cea9f76fd 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -50,7 +50,7 @@ Now, check that everything works: ```bash # check that it works: -cd .. +cd $HOME/cnn cd pyexamples python2 xor.py python2 rnnlm.py rnnlm.py From 88e3f3fce6d8d65c2900bf6f44a4f495b6679a5e Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 13:42:51 +0100 Subject: [PATCH 450/965] Update INSTALL.md --- INSTALL.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index cea9f76fd..b7335b07a 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -13,14 +13,21 @@ wget u.cs.biu.ac.il/~yogo/eigen.tgz tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed. ``` +To simplify the following steps, we can set a bash variable to hold where we have saved the main directories of `cnn` and `eigen` (In case you have gotten `ccn` and `eigen` differently from the instructions above and saved them in different location(s)): + +```bash +PARENT_DIR_OF_CNN=$HOME +PATH_TO_EIGEN=$HOME/cnn/eigen +``` + Compile CNN. (modify the code below to point to the correct boost location) ```bash -cd $HOME/cnn/ +cd PARENT_DIR_OF_CNN/cnn mkdir build cd build -cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBOOST_ROOT=$HOME/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON +cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DBOOST_ROOT=$HOME/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON make -j 2 ``` @@ -30,7 +37,14 @@ If you don't have cython, it can be installed with either `pip install cython` o ```bash pip2 install cython --user +``` + +Customize the `setup.py` to include (i) the parent directory where the main `cnn` directory is saved and (ii) the path to the main `eigen` directy: + +```bash cd $HOME/cnn/pycnn +sed -i "s|..\/..\/cnn\/|$PARENT_DIR_OF_CNN|g" setup.py +sed -i "s|..\/..\/eigen\/|$PATH_TO_EIGEN|g" setup.py make make install ``` From 25edbb7e53a0e5643329ec9782da33da892d6059 Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 13:43:07 +0100 Subject: [PATCH 451/965] Update setup.py --- pycnn/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pycnn/setup.py b/pycnn/setup.py index f950b015a..a108830dc 100644 --- a/pycnn/setup.py +++ b/pycnn/setup.py @@ -14,7 +14,7 @@ ["pycnn.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source include_dirs=["../../cnn/", # this should be the parent directory of cnn - "../eigen/"], # this is the directory where eigen is saved. + "../../eigen/"], # this is the directory where eigen is saved. libraries=['cnn_shared'], # ditto library_dirs=["."], #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed From 6339c781e63174cb77d97cfc9ca7c0f9af05c15f Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 13:44:14 +0100 Subject: [PATCH 452/965] Update INSTALL.md --- INSTALL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index b7335b07a..44bf7f6f6 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -13,7 +13,7 @@ wget u.cs.biu.ac.il/~yogo/eigen.tgz tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed. ``` -To simplify the following steps, we can set a bash variable to hold where we have saved the main directories of `cnn` and `eigen` (In case you have gotten `ccn` and `eigen` differently from the instructions above and saved them in different location(s)): +To simplify the following steps, we can set a bash variable to hold where we have saved the main directories of `cnn` and `eigen`. In case you have gotten `ccn` and `eigen` differently from the instructions above and saved them in different location(s), these variables will be helpful: ```bash PARENT_DIR_OF_CNN=$HOME @@ -57,7 +57,7 @@ Add the following line to your profile (`.zshrc` or `.bashrc`), change according to your installation location. ```bash -export LD_LIBRARY_PATH=$HOME/cnn/pycnn +export LD_LIBRARY_PATH=$PARENT_DIR_OF_CNN/cnn/pycnn ``` Now, check that everything works: From b792bb869860dac3302420bf5f968959e2dd3181 Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 13:44:51 +0100 Subject: [PATCH 453/965] Update INSTALL.md --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 44bf7f6f6..3e1b31d3b 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -42,7 +42,7 @@ pip2 install cython --user Customize the `setup.py` to include (i) the parent directory where the main `cnn` directory is saved and (ii) the path to the main `eigen` directy: ```bash -cd $HOME/cnn/pycnn +cd $PARENT_DIR_OF_CNN/cnn/pycnn sed -i "s|..\/..\/cnn\/|$PARENT_DIR_OF_CNN|g" setup.py sed -i "s|..\/..\/eigen\/|$PATH_TO_EIGEN|g" setup.py make From 4dac3d85411d36c965cd621354140c4ca7f497eb Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 13:45:29 +0100 Subject: [PATCH 454/965] Update INSTALL.md --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 3e1b31d3b..006f2390c 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -10,7 +10,7 @@ git submodule init # To be consistent with CNN's installation instructions. git submodule update # To be consistent with CNN's installation instructions. # hg clone https://bitbucket.org/eigen/eigen/ # Latest version (17.03.16) of Eigen fails to compile. wget u.cs.biu.ac.il/~yogo/eigen.tgz -tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed. +tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed, e.g. with "sudo apt-get install dtrx" ``` To simplify the following steps, we can set a bash variable to hold where we have saved the main directories of `cnn` and `eigen`. In case you have gotten `ccn` and `eigen` differently from the instructions above and saved them in different location(s), these variables will be helpful: From a874d3a441563804326c17c0febadfc24435056b Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 13:45:43 +0100 Subject: [PATCH 455/965] Update INSTALL.md --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 006f2390c..3e1b31d3b 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -10,7 +10,7 @@ git submodule init # To be consistent with CNN's installation instructions. git submodule update # To be consistent with CNN's installation instructions. # hg clone https://bitbucket.org/eigen/eigen/ # Latest version (17.03.16) of Eigen fails to compile. wget u.cs.biu.ac.il/~yogo/eigen.tgz -tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed, e.g. with "sudo apt-get install dtrx" +tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed. ``` To simplify the following steps, we can set a bash variable to hold where we have saved the main directories of `cnn` and `eigen`. In case you have gotten `ccn` and `eigen` differently from the instructions above and saved them in different location(s), these variables will be helpful: From 5ffbb0bd4d6497815b9d31ed72d775573f51553b Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 15:12:56 +0100 Subject: [PATCH 456/965] Update INSTALL.md --- INSTALL.md | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 3e1b31d3b..6ae9fa1f4 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,6 +1,6 @@ # Installing the pyCNN module. -First, get CNN and Eigen: +First, get CNN: ```bash cd $HOME @@ -8,9 +8,16 @@ git clone https://github.com/clab/cnn.git cd cnn git submodule init # To be consistent with CNN's installation instructions. git submodule update # To be consistent with CNN's installation instructions. -# hg clone https://bitbucket.org/eigen/eigen/ # Latest version (17.03.16) of Eigen fails to compile. -wget u.cs.biu.ac.il/~yogo/eigen.tgz -tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed. +``` + +Then get Eigen: + +``` +cd $HOME +cd cnn +# Latest version (17.03.16) of Eigen fails to compile , so we revert "-r" to the latest stable version. +# Otherwise, we can use "hg clone https://bitbucket.org/eigen/eigen/" +hg clone https://bitbucket.org/eigen/eigen/ -r 47fa289dda2dc13e0eea70adfc8671e93627d466 ``` To simplify the following steps, we can set a bash variable to hold where we have saved the main directories of `cnn` and `eigen`. In case you have gotten `ccn` and `eigen` differently from the instructions above and saved them in different location(s), these variables will be helpful: @@ -31,6 +38,39 @@ cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DBOOST_ROOT=$HOME/.local/boost_1_5 make -j 2 ``` +If CNN fails to compile and throws an error like this: + +``` +$ make -j 2 +Scanning dependencies of target cnn +Scanning dependencies of target cnn_shared +[ 1%] [ 2%] Building CXX object cnn/CMakeFiles/cnn.dir/cfsm-builder.cc.o +Building CXX object cnn/CMakeFiles/cnn_shared.dir/cfsm-builder.cc.o +In file included from /home/user/cnn/cnn/cnn.h:13:0, + from /home/user/cnn/cnn/cfsm-builder.h:6, + from /home/user/cnn/cnn/cfsm-builder.cc:1: +/home/user/cnn/cnn/tensor.h:22:42: fatal error: unsupported/Eigen/CXX11/Tensor: No such file or directory + #include + ^ +compilation terminated. +``` + +Then, you can download a stable version of Eigen and re-build CNN as such: + +``` +cd PARENT_DIR_OF_CNN/cnn +wget u.cs.biu.ac.il/~yogo/eigen.tgz +tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed +mkdir build +cd build +cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DBOOST_ROOT=$HOME/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON +make -j 2 +``` + +# hg clone https://bitbucket.org/eigen/eigen/ # Latest version (17.03.16) of Eigen fails to compile. +wget u.cs.biu.ac.il/~yogo/eigen.tgz +tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed. + Now that CNN is compiled, we need to compile the pycnn module. This requires having cython installed. If you don't have cython, it can be installed with either `pip install cython` or better yet `conda install cython`. From f0ae46f6a003cfccf3aca0634cc10bc422183737 Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 15:14:18 +0100 Subject: [PATCH 457/965] Update INSTALL.md --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 6ae9fa1f4..d51306c8f 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -55,7 +55,7 @@ In file included from /home/user/cnn/cnn/cnn.h:13:0, compilation terminated. ``` -Then, you can download a stable version of Eigen and re-build CNN as such: +If CNN fails to compile with the error above, then you can download a stable version of Eigen and re-build CNN as such: ``` cd PARENT_DIR_OF_CNN/cnn From cb545268139ec9f5e730c3c7f5bb68e96c6df7e9 Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 15:15:29 +0100 Subject: [PATCH 458/965] Update INSTALL.md --- INSTALL.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index d51306c8f..887bc90b2 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,5 +1,6 @@ # Installing the pyCNN module. + First, get CNN: ```bash @@ -67,10 +68,6 @@ cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DBOOST_ROOT=$HOME/.local/boost_1_5 make -j 2 ``` -# hg clone https://bitbucket.org/eigen/eigen/ # Latest version (17.03.16) of Eigen fails to compile. -wget u.cs.biu.ac.il/~yogo/eigen.tgz -tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed. - Now that CNN is compiled, we need to compile the pycnn module. This requires having cython installed. If you don't have cython, it can be installed with either `pip install cython` or better yet `conda install cython`. From e25b3241a0d07d6050f1907838a5396f67b6de96 Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 15:17:06 +0100 Subject: [PATCH 459/965] Update INSTALL.md --- INSTALL.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 887bc90b2..fc164f41f 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -13,7 +13,7 @@ git submodule update # To be consistent with CNN's installation instructions. Then get Eigen: -``` +```bash cd $HOME cd cnn # Latest version (17.03.16) of Eigen fails to compile , so we revert "-r" to the latest stable version. @@ -41,7 +41,7 @@ make -j 2 If CNN fails to compile and throws an error like this: -``` +```bash $ make -j 2 Scanning dependencies of target cnn Scanning dependencies of target cnn_shared @@ -58,7 +58,7 @@ compilation terminated. If CNN fails to compile with the error above, then you can download a stable version of Eigen and re-build CNN as such: -``` +```bash cd PARENT_DIR_OF_CNN/cnn wget u.cs.biu.ac.il/~yogo/eigen.tgz tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed From 3b1b79f2d4fdf0c5d44a67a391b25205b4405c04 Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 15:30:58 +0100 Subject: [PATCH 460/965] Update INSTALL.md --- INSTALL.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index fc164f41f..176dccb3e 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -24,15 +24,15 @@ hg clone https://bitbucket.org/eigen/eigen/ -r 47fa289dda2dc13e0eea70adfc8671e93 To simplify the following steps, we can set a bash variable to hold where we have saved the main directories of `cnn` and `eigen`. In case you have gotten `ccn` and `eigen` differently from the instructions above and saved them in different location(s), these variables will be helpful: ```bash -PARENT_DIR_OF_CNN=$HOME -PATH_TO_EIGEN=$HOME/cnn/eigen +PATH_TO_CNN=$HOME/cnn/ +PATH_TO_EIGEN=$HOME/cnn/eigen/ ``` Compile CNN. (modify the code below to point to the correct boost location) ```bash -cd PARENT_DIR_OF_CNN/cnn +cd $PATH_TO_CNN mkdir build cd build cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DBOOST_ROOT=$HOME/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON @@ -59,7 +59,7 @@ compilation terminated. If CNN fails to compile with the error above, then you can download a stable version of Eigen and re-build CNN as such: ```bash -cd PARENT_DIR_OF_CNN/cnn +cd $PATH_TO_CNN wget u.cs.biu.ac.il/~yogo/eigen.tgz tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed mkdir build @@ -79,8 +79,8 @@ pip2 install cython --user Customize the `setup.py` to include (i) the parent directory where the main `cnn` directory is saved and (ii) the path to the main `eigen` directy: ```bash -cd $PARENT_DIR_OF_CNN/cnn/pycnn -sed -i "s|..\/..\/cnn\/|$PARENT_DIR_OF_CNN|g" setup.py +cd $PATH_TO_CNN/pycnn +sed -i "s|..\/..\/cnn\/|$PATH_TO_CNN|g" setup.py sed -i "s|..\/..\/eigen\/|$PATH_TO_EIGEN|g" setup.py make make install @@ -94,14 +94,14 @@ Add the following line to your profile (`.zshrc` or `.bashrc`), change according to your installation location. ```bash -export LD_LIBRARY_PATH=$PARENT_DIR_OF_CNN/cnn/pycnn +export LD_LIBRARY_PATH=$PATH_TO_CNN/pycnn ``` Now, check that everything works: ```bash # check that it works: -cd $HOME/cnn +cd $PATH_TO_CNN cd pyexamples python2 xor.py python2 rnnlm.py rnnlm.py From fabd9a7ab5d0fd51fda57c303e3323c7b66f47f8 Mon Sep 17 00:00:00 2001 From: alvations Date: Thu, 17 Mar 2016 15:31:48 +0100 Subject: [PATCH 461/965] Update setup.py --- pycnn/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pycnn/setup.py b/pycnn/setup.py index a108830dc..30b89b120 100644 --- a/pycnn/setup.py +++ b/pycnn/setup.py @@ -13,7 +13,7 @@ "pycnn", # name of extension ["pycnn.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source - include_dirs=["../../cnn/", # this should be the parent directory of cnn + include_dirs=["../../cnn/", # this is the location of the main cnn directory. "../../eigen/"], # this is the directory where eigen is saved. libraries=['cnn_shared'], # ditto library_dirs=["."], From 179b5eff745f065843d1d2cc1c8c0247755edf25 Mon Sep 17 00:00:00 2001 From: Kenton Lee Date: Tue, 22 Mar 2016 20:32:38 -0700 Subject: [PATCH 462/965] Fixes bug in scale_parameters, which was scaling gradients instead of values. --- cnn/model.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/model.cc b/cnn/model.cc index a211ebaae..4bd35d4bf 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -38,7 +38,7 @@ Parameters::Parameters(const Dim& d, float scale) : dim(d) { size_t Parameters::size() const { return dim.size(); } void Parameters::scale_parameters(float a) { - (*g) *= a; + (*values) *= a; } void Parameters::squared_l2norm(float* sqnorm) const { From 80bbbecb8746ed738465c6cc2385c828a5fc8edc Mon Sep 17 00:00:00 2001 From: armatthews Date: Sat, 26 Mar 2016 01:46:32 -0400 Subject: [PATCH 463/965] Fixed bug with RAM allocation --- cnn/devices.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/cnn/devices.cc b/cnn/devices.cc index 7d5d3749f..5aad7f70b 100644 --- a/cnn/devices.cc +++ b/cnn/devices.cc @@ -27,9 +27,10 @@ Device_GPU::Device_GPU(int mb, int device_id) : CUDA_CHECK(cudaMemcpyAsync(kSCALAR_ZERO, &zero, sizeof(float), cudaMemcpyHostToDevice)); // this is the big memory allocation - fxs = new AlignedMemoryPool(mb << 20, mem); // memory for node values - dEdfs = new AlignedMemoryPool(mb << 20, mem); // memory for node gradients - ps = new AlignedMemoryPool(mb << 20, mem); // memory for parameters + size_t byte_count = (size_t)mb << 20; + fxs = new AlignedMemoryPool(byte_count, mem); // memory for node values + dEdfs = new AlignedMemoryPool(byte_count, mem); // memory for node gradients + ps = new AlignedMemoryPool(byte_count, mem); // memory for parameters } Device_GPU::~Device_GPU() {} @@ -51,9 +52,10 @@ Device_CPU::Device_CPU(int mb, bool shared) : *kSCALAR_ZERO = 0; // this is the big memory allocation: the pools - fxs = new AlignedMemoryPool(mb << 20, mem); // memory for node values - dEdfs = new AlignedMemoryPool(mb << 20, mem); // memory for node gradients - ps = new AlignedMemoryPool(mb << 20, shmem); // memory for parameters + size_t byte_count = (size_t)mb << 20; + fxs = new AlignedMemoryPool(byte_count, mem); // memory for node values + dEdfs = new AlignedMemoryPool(byte_count, mem); // memory for node gradients + ps = new AlignedMemoryPool(byte_count, shmem); // memory for parameters } Device_CPU::~Device_CPU() {} From 70c43c17683753921328202cba83f50f9ee62763 Mon Sep 17 00:00:00 2001 From: Manaal Faruqui Date: Mon, 4 Apr 2016 23:29:38 -0400 Subject: [PATCH 464/965] added initialization support of rnnlm from list of expression --- pycnn/pycnn.pyx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 594ba157d..305d843ba 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -815,12 +815,7 @@ cdef class RNNBuilder: # {{{ if self.cg_version != _cg.version(): self.new_graph() if vecs is not None: - es = [] - for v in vecs: - e = vecInput(len(v)) - e.set(v) - es.append(e) - self.start_new_sequence(es) + self.start_new_sequence(vecs) else: self.start_new_sequence() self._init_state = RNNState(self, -1) From ec4df2f20bdd864347d588154275162e684047ba Mon Sep 17 00:00:00 2001 From: Manaal Faruqui Date: Tue, 5 Apr 2016 09:28:00 -0400 Subject: [PATCH 465/965] moved back my stupid change --- pycnn/pycnn.pyx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 305d843ba..594ba157d 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -815,7 +815,12 @@ cdef class RNNBuilder: # {{{ if self.cg_version != _cg.version(): self.new_graph() if vecs is not None: - self.start_new_sequence(vecs) + es = [] + for v in vecs: + e = vecInput(len(v)) + e.set(v) + es.append(e) + self.start_new_sequence(es) else: self.start_new_sequence() self._init_state = RNNState(self, -1) From 89204a71f8804713c309eb256bf404486b1239be Mon Sep 17 00:00:00 2001 From: Manaal Faruqui Date: Tue, 5 Apr 2016 11:10:31 -0400 Subject: [PATCH 466/965] Added functionality to initialize RNNs with list of expressions --- pycnn/pycnn.pyx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 594ba157d..ab5da2561 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -812,6 +812,16 @@ cdef class RNNBuilder: # {{{ return res cpdef RNNState initial_state(self,vecs=None): + if self.cg_version != _cg.version(): + self.new_graph() + if vecs is not None: + self.start_new_sequence(vecs) + else: + self.start_new_sequence() + self._init_state = RNNState(self, -1) + return self._init_state + + cpdef RNNState initial_state_from_raw_vectors(self,vecs=None): if self.cg_version != _cg.version(): self.new_graph() if vecs is not None: From cd116f0797185316189a0da9430fa6b678f8b0d0 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Thu, 14 Apr 2016 15:28:55 +0300 Subject: [PATCH 467/965] GPU in pycnn --- CMakeLists.txt | 2 +- cnn/CMakeLists.txt | 12 +++++++++--- pycnn/makefile | 10 ++++++++++ pycnn/setup.py | 2 +- pycnn/setup_gpu.py | 30 ++++++++++++++++++++++++++++++ 5 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 pycnn/setup_gpu.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 25c577b60..e8408b44e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,7 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # 3. try compiler options like -march=native or other architecture # flags (the compiler does not always make the best configuration # decisions without help) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -funroll-loops -Wall -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -march=native") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -funroll-loops -Wall -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -march=native") enable_testing() diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 74e180cf8..a8a7b71a8 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -96,15 +96,21 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) # actual target: add_library(cnn STATIC ${cnn_library_SRCS} ${cnn_library_HDRS}) -add_library(cnn_shared SHARED ${cnn_library_SRCS} ${cnn_library_HDRS}) target_link_libraries(cnn ${LIBS}) -target_link_libraries(cnn_shared ${LIBS}) +if(WITH_CUDA_BACKEND) + add_library(gcnn_shared SHARED ${cnn_library_SRCS} ${cnn_library_HDRS}) + target_link_libraries(gcnn_shared ${LIBS}) +else() + add_library(cnn_shared SHARED ${cnn_library_SRCS} ${cnn_library_HDRS}) + target_link_libraries(cnn_shared ${LIBS}) +endif(WITH_CUDA_BACKEND) #add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) - list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE") + list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-Xcompiler;-fpic") SET(CUDA_PROPAGATE_HOST_FLAGS OFF) cuda_add_library(cnncuda STATIC gpu-ops.cu) + cuda_add_library(cnncuda_shared SHARED gpu-ops.cu) endif(WITH_CUDA_BACKEND) install(FILES ${cnn_library_HDRS} DESTINATION include/cnn) diff --git a/pycnn/makefile b/pycnn/makefile index e2c8d41ea..0736e86c4 100644 --- a/pycnn/makefile +++ b/pycnn/makefile @@ -11,6 +11,16 @@ pycnn.${DYSUF}: ../build/cnn/libcnn_shared.${DYSUF} pycnn.pyx pycnn.pxd setup.py cp ../build/cnn/libcnn_shared.${DYSUF} . ${PYTHON} setup.py build_ext --inplace +gpycnn.${DYSUF}: ../build/cnn/libgcnn_shared.${DYSUF} pycnn.pyx pycnn.pxd setup_gpu.py + cp ../build/cnn/libgcnn_shared.${DYSUF} . + cp ../build/cnn/libcnncuda_shared.${DYSUF} . + cp pycnn.pyx gpycnn.pyx + cp pycnn.pxd gpycnn.pxd + ${PYTHON} setup_gpu.py build_ext --inplace + +ginstall: gpycnn.${DYSUF} + ${PYTHON} setup_gpu.py install --user + install: pycnn.${DYSUF} ${PYTHON} setup.py install --user diff --git a/pycnn/setup.py b/pycnn/setup.py index 30b89b120..a22d10ddf 100644 --- a/pycnn/setup.py +++ b/pycnn/setup.py @@ -25,4 +25,4 @@ setup(ext_modules = [ext], cmdclass = {'build_ext': build_ext}, name="pyCNN", - ) + ) diff --git a/pycnn/setup_gpu.py b/pycnn/setup_gpu.py new file mode 100644 index 000000000..5a2aaa7e5 --- /dev/null +++ b/pycnn/setup_gpu.py @@ -0,0 +1,30 @@ +from setuptools import setup +from setuptools.extension import Extension +from Cython.Distutils import build_ext + + +# Remove the "-Wstrict-prototypes" compiler option, which isn't valid for C++. +import distutils.sysconfig +cfg_vars = distutils.sysconfig.get_config_vars() +if "CFLAGS" in cfg_vars: + cfg_vars["CFLAGS"] = cfg_vars["CFLAGS"].replace("-Wstrict-prototypes", "") + +ext = Extension( + "gpycnn", # name of extension + ["gpycnn.pyx"], # filename of our Pyrex/Cython source + language="c++", # this causes Pyrex/Cython to create C++ source + include_dirs=["../../cnn/", # this is the location of the main cnn directory. + "../../eigen/"], # this is the directory where eigen is saved. + #libraries=['cnn','cnncuda'], #,'cnncuda_shared'], # ditto + libraries=['gcnn_shared','cnncuda_shared'], # ditto + library_dirs=["."], + #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed + extra_compile_args=["-std=c++11","-fPIC"],#,"-lcudart","-lcublas"], + extra_link_args=["-L/usr/local/cuda-7.5/lib64","-lcudart","-lcublas"], + #extra_objects=["libcnncuda.a"], + ) + +setup(ext_modules = [ext], + cmdclass = {'build_ext': build_ext}, + name="pyCNN", + ) From bc848c651697c0cedba8c5474ae08ef0d3643f0c Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Thu, 14 Apr 2016 15:38:28 +0300 Subject: [PATCH 468/965] pycnn gpu support --- pycnn/setup_gpu.py | 2 +- pyexamples/cpu_vs_gpu.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 pyexamples/cpu_vs_gpu.py diff --git a/pycnn/setup_gpu.py b/pycnn/setup_gpu.py index 5a2aaa7e5..a9d35b2db 100644 --- a/pycnn/setup_gpu.py +++ b/pycnn/setup_gpu.py @@ -26,5 +26,5 @@ setup(ext_modules = [ext], cmdclass = {'build_ext': build_ext}, - name="pyCNN", + name="gpyCNN", ) diff --git a/pyexamples/cpu_vs_gpu.py b/pyexamples/cpu_vs_gpu.py new file mode 100644 index 000000000..9564ec7f4 --- /dev/null +++ b/pyexamples/cpu_vs_gpu.py @@ -0,0 +1,38 @@ +import gpycnn as G +print +import pycnn as C + +cm = C.Model() +gm = G.Model() + +cpW = cm.add_parameters("W",(1000,1000)) +gpW = gm.add_parameters("W",(1000,1000)) + +def do_cpu(): + C.renew_cg() + W = C.parameter(cpW) + W = W*W*W*W*W*W*W + z = C.squared_distance(W,W) + z.value() + z.backward() + +def do_gpu(): + G.renew_cg() + W = G.parameter(gpW) + W = W*W*W*W*W*W*W + z = G.squared_distance(W,W) + z.value() + z.backward() + +import time +s = time.time() +do_cpu() +print "CPU time:",time.time() - s + +s = time.time() +do_gpu() +print "GPU time:",time.time() - s + + + + From dc20f927c94f8e1851a905a58846f004f9fb7d9e Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Thu, 14 Apr 2016 16:03:26 +0300 Subject: [PATCH 469/965] Updated instructions for compiling pycnn with GPU support --- INSTALL.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/INSTALL.md b/INSTALL.md index 176dccb3e..15e73011d 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,5 +1,6 @@ # Installing the pyCNN module. +(for instructions on installing on a computer with GPU, see below) First, get CNN: @@ -112,3 +113,50 @@ Alternatively, if the following script works for you, then your installation is from pycnn import * model = Model() ``` + +## Installing with GPU support + +For installing on a computer with GPU, first install CUDA. +Here, we assume CUDA is installed in `/usr/local/cuda-7.5` + +There are two modules, `pycnn` which is the regular CPU module, and `gpycnn` which is the GPU +module. You can import either of them, these are two independent modules. The GPU support +is incomplete: some operations (i.e. `hubber_distance`) are not available for the GPU. + +First step is to build the CNN modules. +Checkout and go to the `build` directory (same instructions as above). Then: + +To build a CPU version on a computer with CUDA: +```bash +cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBACKEND=eigen +make -j 4 +``` + +To build a GPU version on a computer with CUDA: +```bash +cmake .. -DBACKEND=cuda -DCUDA_TOOLKIT_ROOT_DIR=/use/local/cuda-7.5/ +make -j 4 +``` + +Now, build the python modules (as above, we assume cython is installed): + +The GPU module (gpycnn): +```bash +cd ../pycnn +make gpycnn +make ginstall +``` + +The CPU module (pycnn): +```bash +cd ../pycnn +make pycnn +make install +``` + +Add the following to your env: +`export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PATH_TO_CNN/pycnn` + +Once both the `pycnn` and `gpycnn` are installed, run `python ../pyexamples/cpu_vs_gpu.py` for a small timing example. + + From 734e137f9a8adaf217306f8910cc9440d19fc364 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Thu, 14 Apr 2016 16:05:36 +0300 Subject: [PATCH 470/965] Update INSTALL.md --- INSTALL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 15e73011d..5936d0143 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -143,14 +143,14 @@ Now, build the python modules (as above, we assume cython is installed): The GPU module (gpycnn): ```bash cd ../pycnn -make gpycnn +make gpycnn.so make ginstall ``` The CPU module (pycnn): ```bash cd ../pycnn -make pycnn +make pycnn.so make install ``` From 487d78693bd8302b5a0391c7b2f670b9c0067567 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Thu, 14 Apr 2016 16:22:38 +0300 Subject: [PATCH 471/965] fix in pycnn.pyx --- pycnn/pycnn.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index ab5da2561..735acacfc 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -440,7 +440,7 @@ cdef class Expression: #{{{ cpdef forward(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") if recalculate: self.cg().forward() - else: self.cg().incremental_forward() + else: self.cg().inc_forward() cpdef backward(self): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") From 42dd0f74236a80e951038c06d82b2cae2b4b36fe Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 15 Apr 2016 18:19:28 +0900 Subject: [PATCH 472/965] Fix batched affine transform with multi-col --- cnn/nodes-common.cc | 26 +++++++++++++++++++++++--- cnn/nodes.cc | 4 ++-- tests/test-nodes.cc | 12 ++++++++++++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 5d731ecd6..cdb226b7b 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -209,8 +209,16 @@ string Reshape::as_string(const vector& arg_names) const { Dim Reshape::dim_forward(const vector& xs) const { assert(xs.size() == 1); - assert(xs[0].size() == to.size()); - return to; + if(to.size() == xs[0].size()) { + return to; + } else if(to.batch_elems() == 1 && to.batch_size() == xs[0].batch_size()) { + Dim ret(to); + ret.bd = xs[0].batch_elems(); + return ret; + } else { + cerr << "Bad arguments to Reshape: " << to << ", " << xs[0] << endl; + throw std::invalid_argument("Bad arguments to Reshape"); + } } string SumColumns::as_string(const vector& arg_names) const { @@ -687,7 +695,19 @@ Dim RestrictedLogSoftmax::dim_forward(const vector& xs) const { string PickElement::as_string(const vector& arg_names) const { ostringstream s; - s << "pick(" << arg_names[0] << ',' << *pval << ')'; + s << "pick(" << arg_names[0] << ','; + if(pval) { + s << *pval << ')'; + } else { + assert(pvals); + s << '['; + if(pvals->size()) { + s << (*pvals)[0]; + for(size_t i = 1; i < pvals->size(); ++i) + s << ',' << (*pvals)[i]; + } + s << "])"; + } return s.str(); } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index fbbf11b38..1e54deb7d 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -496,7 +496,7 @@ void Reshape::backward_impl(const vector& xs, throw std::runtime_error("Reshape not yet implemented for CUDA"); #else const Tensor reshaped(dEdxi.d, dEdf.v, dEdxi.device); - *dEdxi += *reshaped; + dEdxi.vec() += reshaped.vec(); #endif } @@ -1829,7 +1829,7 @@ void AffineTransform::backward_impl(const vector& xs, #else // Add, using broadcasting or not if(dEdxi.d.bd == 1 && dEdf.d.bd > 1) { - (*dEdxi) += dEdf.rowcol_matrix().rowwise().sum(); + dEdxi.vec() += dEdf.rowcol_matrix().rowwise().sum(); } else { for(unsigned b = 0; b < dEdf.d.bd; ++b) dEdxi.batch_matrix(b) += dEdf.batch_matrix(b); diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 70c27c8ca..c158f1cde 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -173,6 +173,18 @@ BOOST_AUTO_TEST_CASE( affine_batch_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression operator*(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( affine_batch_col_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression scalar = parameter(cg, param_scalar1); + Expression x2 = input(cg, Dim({1,3},2), batch_vals); + Expression y = affine_transform({transpose(x1), scalar, x2}); + Expression ones3 = input(cg, {3,1}, ones3_vals); + sum_batches(y * ones3); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression operator*(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( affine_batch2_gradient ) { cnn::ComputationGraph cg; From 1a148c386a5db7627fc9c47b0613ba2b5998f0ba Mon Sep 17 00:00:00 2001 From: swabhs Date: Wed, 20 Apr 2016 10:42:21 -0700 Subject: [PATCH 473/965] added peephole variation to output gate of lstm, for the case where there is no previous state --- cnn/lstm.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 3d0775ed1..cd341b486 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -141,7 +141,7 @@ Expression LSTMBuilder::add_input_impl(int prev, const Expression& x) { if (has_prev_state) i_aot = affine_transform({vars[BO], vars[X2O], in, vars[H2O], i_h_tm1, vars[C2O], ct[i]}); else - i_aot = affine_transform({vars[BO], vars[X2O], in}); + i_aot = affine_transform({vars[BO], vars[X2O], in, vars[C2O], ct[i]}); Expression i_ot = logistic(i_aot); Expression ph_t = tanh(ct[i]); in = ht[i] = cwise_multiply(i_ot,ph_t); From a8560eac1c3760227dd99cbd0128c70119e4b27d Mon Sep 17 00:00:00 2001 From: Austin Matthews Date: Fri, 22 Apr 2016 12:36:40 -0400 Subject: [PATCH 474/965] Fix to cfsm::full_log_distribution --- cnn/cfsm-builder.cc | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/cnn/cfsm-builder.cc b/cnn/cfsm-builder.cc index 7d368d9e0..3645ce8b0 100644 --- a/cnn/cfsm-builder.cc +++ b/cnn/cfsm-builder.cc @@ -136,19 +136,26 @@ unsigned ClassFactoredSoftmaxBuilder::sample(const Expression& rep) { Expression ClassFactoredSoftmaxBuilder::full_log_distribution(const Expression& rep) { vector full_dist(widx2cidx.size()); - for (unsigned i = 0; i < widx2cidx.size(); ++i) { - assert (widx2cidx[i] != -1); - } + Expression cscores = log(softmax(affine_transform({cbias, r2c, rep}))); for (unsigned c = 0; c < p_rc2ws.size(); ++c) { - Expression& cwbias = get_rc2wbias(c); - Expression& r2cw = get_rc2w(c); - Expression wscores = affine_transform({cwbias, r2cw, rep}); - Expression wdist = softmax(wscores); - - for (unsigned i = 0; i < cidx2words[c].size(); ++i) { - unsigned w = cidx2words[c][i]; - full_dist[w] = pick(wdist, i); + Expression cscore = pick(cscores, c); + if (singleton_cluster[c]) { + for (unsigned i = 0; i < cidx2words[c].size(); ++i) { + unsigned w = cidx2words[c][i]; + full_dist[w] = cscore; + } + } + else { + Expression& cwbias = get_rc2wbias(c); + Expression& r2cw = get_rc2w(c); + Expression wscores = affine_transform({cwbias, r2cw, rep}); + Expression wdist = softmax(wscores); + + for (unsigned i = 0; i < cidx2words[c].size(); ++i) { + unsigned w = cidx2words[c][i]; + full_dist[w] = pick(wdist, i) + cscore; + } } } From 2d65b62562de11f12b0c2746746ab1b42e405f84 Mon Sep 17 00:00:00 2001 From: Austin Matthews Date: Fri, 22 Apr 2016 12:52:02 -0400 Subject: [PATCH 475/965] Handle case where some vocab items are missing from cluster map --- cnn/cfsm-builder.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/cnn/cfsm-builder.cc b/cnn/cfsm-builder.cc index 3645ce8b0..94be56b62 100644 --- a/cnn/cfsm-builder.cc +++ b/cnn/cfsm-builder.cc @@ -138,6 +138,13 @@ Expression ClassFactoredSoftmaxBuilder::full_log_distribution(const Expression& vector full_dist(widx2cidx.size()); Expression cscores = log(softmax(affine_transform({cbias, r2c, rep}))); + for (unsigned i = 0; i < widx2cidx.size(); ++i) { + if (widx2cidx[i] == -1) { + // XXX: Should be -inf + full_dist[i] = input(*pcg, -10000); + } + } + for (unsigned c = 0; c < p_rc2ws.size(); ++c) { Expression cscore = pick(cscores, c); if (singleton_cluster[c]) { From ab641ea969fbb26599e2240b64aa287fccd5432e Mon Sep 17 00:00:00 2001 From: Aria Haghighi Date: Fri, 22 Apr 2016 16:14:00 -0700 Subject: [PATCH 476/965] Add missing header files, so 'include' directory has all needed files. --- cnn/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index a8a7b71a8..bfa85d0c2 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -39,6 +39,7 @@ set(cnn_library_HDRS cnn.h conv.h cuda.h + devices.h dict.h dim.h exec.h @@ -52,6 +53,7 @@ set(cnn_library_HDRS hsm-builder.h init.h lstm.h + mem.h model.h mp.h nodes.h From 4ce94052f8fb81ef9766f2373f050b17bfe99b50 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 26 Apr 2016 15:56:31 +0900 Subject: [PATCH 477/965] Initial try at refactoring GPU code --- cnn/cnn.h | 10 +++++-- cnn/devices.cc | 7 +++++ cnn/devices.h | 9 ++++++ cnn/exec.cc | 10 +++++++ cnn/nodes.cc | 60 ++++++++++++++++++++++++++++---------- cnn/nodes.h | 79 ++++++++++++++++++++++++++++++++++++++++++-------- cnn/tensor.h | 8 +++++ 7 files changed, 152 insertions(+), 31 deletions(-) diff --git a/cnn/cnn.h b/cnn/cnn.h index 3f6e4d1af..d35e726fc 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -182,11 +182,15 @@ struct Node { // memory size Dim dim; // will be .size() = 0 initially filled in by forward() -- TODO fix this + // pointer to the node, or null to inherit device from first input, + // or default when there is no input + Device* device; + protected: - Node() : args() {} - explicit Node(const std::initializer_list& a) : args(a) {} + Node() : args(), device(nullptr) {} + explicit Node(const std::initializer_list& a) : args(a), device(nullptr) {} template - explicit Node(const T&c) : args(c.begin(), c.end()) {} + explicit Node(const T&c) : args(c.begin(), c.end()), device(nullptr) {} public: // auxiliary memory diff --git a/cnn/devices.cc b/cnn/devices.cc index 5aad7f70b..30b6e8ad2 100644 --- a/cnn/devices.cc +++ b/cnn/devices.cc @@ -1,6 +1,7 @@ #include "cnn/devices.h" #include +#include #include "cnn/cuda.h" @@ -26,6 +27,9 @@ Device_GPU::Device_GPU(int mb, int device_id) : float zero = 0; CUDA_CHECK(cudaMemcpyAsync(kSCALAR_ZERO, &zero, sizeof(float), cudaMemcpyHostToDevice)); + // Initialize the Eigen device + edevice = new Eigen::CudaStreamDevice(device); + // this is the big memory allocation size_t byte_count = (size_t)mb << 20; fxs = new AlignedMemoryPool(byte_count, mem); // memory for node values @@ -51,6 +55,9 @@ Device_CPU::Device_CPU(int mb, bool shared) : kSCALAR_ZERO = (float*) mem->malloc(sizeof(float)); *kSCALAR_ZERO = 0; + // Initialize the Eigen device + edevice = new Eigen::DefaultDevice; + // this is the big memory allocation: the pools size_t byte_count = (size_t)mb << 20; fxs = new AlignedMemoryPool(byte_count, mem); // memory for node values diff --git a/cnn/devices.h b/cnn/devices.h index d04d026f3..8c7cc0b59 100644 --- a/cnn/devices.h +++ b/cnn/devices.h @@ -5,6 +5,11 @@ #include "cnn/aligned-mem-pool.h" #include "cnn/cuda.h" +namespace Eigen { + struct DefaultDevice; + struct CudaStreamDevice; +} + namespace cnn { enum class DeviceType {CPU, GPU}; @@ -30,19 +35,23 @@ class Device { #if HAVE_CUDA class Device_GPU : public Device { public: + typedef Eigen::CudaStreamDevice EigenDevice; explicit Device_GPU(int mb, int device_id); ~Device_GPU(); int cuda_device_id; cublasHandle_t cublas_handle; + Eigen::CudaStreamDevice* edevice; GPUAllocator gpu_mem; }; #endif class Device_CPU : public Device { public: + typedef Eigen::DefaultDevice EigenDevice; explicit Device_CPU(int mb, bool shared); ~Device_CPU(); CPUAllocator cpu_mem; + Eigen::DefaultDevice* edevice; MemAllocator* shmem; }; diff --git a/cnn/exec.cc b/cnn/exec.cc index bc8b7999a..82c011338 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -55,6 +55,15 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { ++ai; } nfxs[num_nodes_evaluated].d = node->dim; + // Get the device + if(node->device != nullptr) { + nfxs[num_nodes_evaluated].device = node->device; + } else if(xs.size() > 0) { + nfxs[num_nodes_evaluated].device = xs[0]->device; + } else { + nfxs[num_nodes_evaluated].device = cnn::default_device; + } + // Get the memory nfxs[num_nodes_evaluated].v = static_cast(fxs->allocate(node->dim.size() * sizeof(float))); if (nfxs[num_nodes_evaluated].v == nullptr) { cerr << "out of memory\n"; @@ -70,6 +79,7 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { } } node->aux_mem = aux_mem; + node->forward(xs, nfxs[num_nodes_evaluated]); } } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 1e54deb7d..592ccf2e1 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -33,6 +33,36 @@ using namespace std; // 2) dEdxi must accummulate (see point 4 above!) // +// A macro to instantiate templated device functions +// If the implementation is the same for both devices use this, otherwise +// directly implement the templated functions +#ifdef HAVE_CUDA +#define CNN_NODE_INST_DEV_IMPL(MyNode) \ + template void MyNode::forward_dev_impl(const Device_CPU & dev, const vector& xs, Tensor& fx) const; \ + template void MyNode::backward_dev_impl(const Device_CPU & dev, \ + const vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const; \ + template void MyNode::forward_dev_impl(const Device_GPU & dev, const vector& xs, Tensor& fx) const; \ + template void MyNode::backward_dev_impl(const Device_GPU & dev, \ + const vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const; +#else +#define CNN_NODE_INST_DEV_IMPL(MyNode) \ + template void MyNode::forward_dev_impl(const Device_CPU & dev, const vector& xs, Tensor& fx) const; \ + template void MyNode::backward_dev_impl(const Device_CPU & dev, \ + const vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const; +#endif + namespace cnn { void AddVectorToAllColumns::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA @@ -989,25 +1019,23 @@ void Erf::backward_impl(const vector& xs, #endif } -void Tanh::forward_impl(const vector& xs, Tensor& fx) const { -#if HAVE_CUDA - gpu::vtanh(fx.d.size(), xs[0]->v, fx.v); -#else - fx.vec().array() = xs[0]->vec().array().tanh(); -#endif + +template +void Tanh::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + fx.tvec().device(*dev.edevice) = xs[0]->tvec().tanh(); } -void Tanh::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#if HAVE_CUDA - gpu::vtanh_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); -#else - dEdxi.vec() += fx.vec().binaryExpr(dEdf.vec(), scalar_tanh_backward_op()); -#endif +template +void Tanh::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), scalar_tanh_backward_op()); } +CNN_NODE_INST_DEV_IMPL(Tanh) + void Square::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA diff --git a/cnn/nodes.h b/cnn/nodes.h index bf63ecbad..8fd6e3d24 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -2,6 +2,68 @@ #define CNN_NODES_H_ #include "cnn/cnn.h" +#include "cnn/devices.h" + +// A macro to dispatch things to the appropriate device +#ifdef HAVE_CUDA +#define CNN_NODE_DEFINE_DEV_IMPL() \ + std::string as_string(const std::vector& arg_names) const override; \ + Dim dim_forward(const std::vector& xs) const override; \ + void forward_impl(const std::vector& xs, Tensor& fx) const override { \ + assert(fx.device); \ + if(fx.device == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ + else if(fx.device == DeviceType::GPU) { forward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx); } \ + else { abort(); } \ + } \ + template \ + void forward_dev_impl(const MyDevice & dev, const std::vector& xs, Tensor& fx) const; \ + void backward_impl(const std::vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const override { \ + assert(fx.device); \ + if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ + else if(fx.device->type == DeviceType::GPU) { backward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx,dEdf,i,dEdxi;) } \ + else { abort(); } \ + } \ + template \ + void backward_dev_impl( \ + const MyDevice & dev, \ + const std::vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const; +#else +#define CNN_NODE_DEFINE_DEV_IMPL() \ + std::string as_string(const std::vector& arg_names) const override; \ + Dim dim_forward(const std::vector& xs) const override; \ + void forward_impl(const std::vector& xs, Tensor& fx) const override { \ + assert(fx.device); \ + if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ + else { abort(); } \ + } \ + template \ + void forward_dev_impl(const MyDevice & dev, const std::vector& xs, Tensor& fx) const; \ + void backward_impl(const std::vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const override { \ + assert(fx.device); \ + if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ + else { abort(); } \ + } \ + template \ + void backward_dev_impl( \ + const MyDevice & dev, \ + const std::vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const; +#endif namespace cnn { // M = x_0, v = x_1 @@ -12,10 +74,10 @@ struct AddVectorToAllColumns : public Node { Dim dim_forward(const std::vector& xs) const override; void forward_impl(const std::vector& xs, Tensor& fx) const override; void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; }; // y = L_sparsemax(x_0; q) @@ -387,15 +449,8 @@ struct Erf : public Node { // y = tanh x_1 struct Tanh : public Node { explicit Tanh(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = x_1 \odot x_1 diff --git a/cnn/tensor.h b/cnn/tensor.h index 2013e37e4..fd5d9a91e 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -50,6 +50,14 @@ struct Tensor { Eigen::Map vec() { return Eigen::Map(v, d.size()); } + // this returns the full tensor contents as a one dimensional Eigen tensor + // which can be used for on-device processing where dimensions aren't important + const Eigen::TensorMap> tvec() const { + return Eigen::TensorMap>(v, d.size()); + } + Eigen::TensorMap> tvec() { + return Eigen::TensorMap>(v, d.size()); + } // Get view as a Tensor (see specializations below-- this is to work Eigen's and CNNs compile-type vs. run-time differences) template Eigen::TensorMap> t(); template const Eigen::TensorMap> t() const; From 634b43e026c3729553f07ae15a456ce89895bbce Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 26 Apr 2016 17:24:44 +0900 Subject: [PATCH 478/965] Fixed compile bugs --- cnn/devices.cc | 3 ++- cnn/devices.h | 4 +++- cnn/nodes.h | 6 +++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/cnn/devices.cc b/cnn/devices.cc index 30b6e8ad2..7b5b50bfa 100644 --- a/cnn/devices.cc +++ b/cnn/devices.cc @@ -28,7 +28,8 @@ Device_GPU::Device_GPU(int mb, int device_id) : CUDA_CHECK(cudaMemcpyAsync(kSCALAR_ZERO, &zero, sizeof(float), cudaMemcpyHostToDevice)); // Initialize the Eigen device - edevice = new Eigen::CudaStreamDevice(device); + estream = new Eigen::CudaStreamDevice(device_id); + edevice = new Eigen::GpuDevice(estream); // this is the big memory allocation size_t byte_count = (size_t)mb << 20; diff --git a/cnn/devices.h b/cnn/devices.h index 8c7cc0b59..91ea307bf 100644 --- a/cnn/devices.h +++ b/cnn/devices.h @@ -8,6 +8,7 @@ namespace Eigen { struct DefaultDevice; struct CudaStreamDevice; + struct GpuDevice; } namespace cnn { @@ -40,7 +41,8 @@ class Device_GPU : public Device { ~Device_GPU(); int cuda_device_id; cublasHandle_t cublas_handle; - Eigen::CudaStreamDevice* edevice; + Eigen::GpuDevice* edevice; + Eigen::CudaStreamDevice* estream; GPUAllocator gpu_mem; }; #endif diff --git a/cnn/nodes.h b/cnn/nodes.h index 8fd6e3d24..e7ac826d2 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -11,8 +11,8 @@ Dim dim_forward(const std::vector& xs) const override; \ void forward_impl(const std::vector& xs, Tensor& fx) const override { \ assert(fx.device); \ - if(fx.device == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ - else if(fx.device == DeviceType::GPU) { forward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx); } \ + if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ + else if(fx.device->type == DeviceType::GPU) { forward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx); } \ else { abort(); } \ } \ template \ @@ -24,7 +24,7 @@ Tensor& dEdxi) const override { \ assert(fx.device); \ if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ - else if(fx.device->type == DeviceType::GPU) { backward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx,dEdf,i,dEdxi;) } \ + else if(fx.device->type == DeviceType::GPU) { backward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ else { abort(); } \ } \ template \ From f755b7acd689b0b987c9c3d85e498201931e5d01 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 29 Apr 2016 17:02:35 +0900 Subject: [PATCH 479/965] Almost-working example for tanh --- CMakeLists.txt | 1 + cnn/CMakeLists.txt | 7 ++-- cnn/cnn.h | 3 -- cnn/cuda.cc | 2 +- cnn/exec.cc | 18 ++++++---- cnn/globals.cc | 10 ++++++ cnn/{random.h => globals.h} | 5 +++ cnn/gpu-nodes.cu | 3 ++ cnn/init.cc | 18 +++------- cnn/model.cc | 8 ++--- cnn/nodes.cc | 65 +++++++++++++++++++++---------------- cnn/tensor.h | 2 +- do-configure.sh | 6 ++++ tests/test-cnn.cc | 1 + tests/test-nodes.cc | 2 ++ 15 files changed, 91 insertions(+), 60 deletions(-) create mode 100644 cnn/globals.cc rename cnn/{random.h => globals.h} (59%) create mode 100644 cnn/gpu-nodes.cu create mode 100755 do-configure.sh diff --git a/CMakeLists.txt b/CMakeLists.txt index 25c577b60..d6b06e1c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,6 +79,7 @@ if (WITH_CUDA_BACKEND) MESSAGE("CUDA_LIBRARIES: ${CUDA_LIBRARIES}") list(REMOVE_ITEM CUDA_LIBRARIES -lpthread) set(LIBS ${LIBS} ${CUDA_LIBRARIES}) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_HAS_CUDA_FP16 -DEIGEN_USE_GPU") #find_cudnn() #include_directories(SYSTEM ${CUDNN_INCLUDE_DIRS}) endif() diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 2a777b4ed..83628fdee 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -11,6 +11,7 @@ set(cnn_library_SRCS exec.cc expr.cc fast-lstm.cc + globals.cc grad-check.cc graph.cc gru.cc @@ -47,6 +48,7 @@ set(cnn_library_HDRS expr.h fast-lstm.h functors.h + globals.h gpu-kernels.h gpu-ops.h graph.h @@ -58,7 +60,6 @@ set(cnn_library_HDRS mp.h nodes.h param-nodes.h - random.h rnn-state-machine.h rnn.h saxe-init.h @@ -105,9 +106,9 @@ target_link_libraries(cnn_shared ${LIBS}) #add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) - list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE") + list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU") SET(CUDA_PROPAGATE_HOST_FLAGS OFF) - cuda_add_library(cnncuda STATIC gpu-ops.cu) + cuda_add_library(cnncuda STATIC gpu-ops.cu gpu-nodes.cu) endif(WITH_CUDA_BACKEND) install(FILES ${cnn_library_HDRS} DESTINATION include/cnn) diff --git a/cnn/cnn.h b/cnn/cnn.h index d35e726fc..89487903a 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -29,9 +29,6 @@ namespace cnn { -extern AlignedMemoryPool* fxs; -extern AlignedMemoryPool* dEdfs; -extern AlignedMemoryPool* ps; extern float* kSCALAR_MINUSONE; extern float* kSCALAR_ONE; extern float* kSCALAR_ZERO; diff --git a/cnn/cuda.cc b/cnn/cuda.cc index 5936d1f82..ec0ae5ac3 100644 --- a/cnn/cuda.cc +++ b/cnn/cuda.cc @@ -31,7 +31,7 @@ vector Initialize_GPU(int& argc, char**& argv) { // or you request a certain number of GPUs explicitly // or you request the device ids int requested_gpus = -1; - vector gpu_mask(MAX_GPUS); + vector gpu_mask(MAX_GPUS,0); int argi = 1; bool ngpus_requested = false; bool ids_requested = false; diff --git a/cnn/exec.cc b/cnn/exec.cc index 82c011338..b2e7f676a 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -1,6 +1,7 @@ #include "cnn/exec.h" #include "cnn/param-nodes.h" +#include "cnn/globals.h" using namespace std; @@ -39,7 +40,9 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { assert(i < cg.nodes.size()); // free any old memory if this is a new CG - if (num_nodes_evaluated == 0) fxs->free(); + if (num_nodes_evaluated == 0) + for(Device* dev : cnn::devices) + dev->fxs->free(); if (i >= num_nodes_evaluated) { nfxs.resize(i + 1); @@ -64,7 +67,7 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { nfxs[num_nodes_evaluated].device = cnn::default_device; } // Get the memory - nfxs[num_nodes_evaluated].v = static_cast(fxs->allocate(node->dim.size() * sizeof(float))); + nfxs[num_nodes_evaluated].v = static_cast(nfxs[num_nodes_evaluated].device->fxs->allocate(node->dim.size() * sizeof(float))); if (nfxs[num_nodes_evaluated].v == nullptr) { cerr << "out of memory\n"; abort(); @@ -72,7 +75,7 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { void* aux_mem = nullptr; size_t aux_size = node->aux_storage_size(); if (aux_size) { - aux_mem = fxs->allocate(aux_size); + aux_mem = node->device->fxs->allocate(aux_size); if (!aux_mem) { cerr << "aux out of memory\n"; abort(); @@ -102,17 +105,20 @@ void SimpleExecutionEngine::backward(VariableIndex from_where) { const unsigned num_nodes = from_where+1; ndEdfs.resize(num_nodes); - dEdfs->free(); + for(Device* device : devices) + device->dEdfs->free(); for (unsigned i = 0; i < num_nodes; ++i) { const auto dim = nfxs[i].d; ndEdfs[i].d = dim; - ndEdfs[i].v = static_cast(dEdfs->allocate(dim.size() * sizeof(float))); + ndEdfs[i].device = nfxs[i].device; + ndEdfs[i].v = static_cast(ndEdfs[i].device->dEdfs->allocate(dim.size() * sizeof(float))); if (!ndEdfs[i].v) { cerr << "out of memory while attempting to allocate space for derivatives\n"; abort(); } } - dEdfs->zero_allocated_memory(); + for(Device* device : devices) + device->dEdfs->zero_allocated_memory(); // initialize dE/dE = 1 ndEdfs.back().v = kSCALAR_ONE; diff --git a/cnn/globals.cc b/cnn/globals.cc new file mode 100644 index 000000000..17362b034 --- /dev/null +++ b/cnn/globals.cc @@ -0,0 +1,10 @@ +#include "cnn/globals.h" +#include "cnn/devices.h" + +namespace cnn { + +std::mt19937* rndeng = nullptr; +std::vector devices; +Device* default_device = nullptr; + +} diff --git a/cnn/random.h b/cnn/globals.h similarity index 59% rename from cnn/random.h rename to cnn/globals.h index 3f37ad2d6..f67ee0db8 100644 --- a/cnn/random.h +++ b/cnn/globals.h @@ -2,10 +2,15 @@ #define CNN_EIGEN_RANDOM_H #include +#include namespace cnn { +class Device; + extern std::mt19937* rndeng; +extern std::vector devices; +extern Device* default_device; } // namespace cnn diff --git a/cnn/gpu-nodes.cu b/cnn/gpu-nodes.cu new file mode 100644 index 000000000..0f0efceed --- /dev/null +++ b/cnn/gpu-nodes.cu @@ -0,0 +1,3 @@ +// This is a dummy file that contains the same content as nodes.cc but compiled +// on CUDA +#include "nodes.cc" diff --git a/cnn/init.cc b/cnn/init.cc index ad3c1aef2..113446a59 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -16,14 +16,6 @@ using namespace std; namespace cnn { -// these should maybe live in a file called globals.cc or something -AlignedMemoryPool* fxs = nullptr; -AlignedMemoryPool* dEdfs = nullptr; -AlignedMemoryPool* ps = nullptr; -mt19937* rndeng = nullptr; -std::vector devices; -Device* default_device = nullptr; - static void RemoveArgs(int& argc, char**& argv, int& argi, int n) { for (int i = argi + n; i < argc; ++i) argv[i - n] = argv[i]; @@ -98,9 +90,6 @@ void Initialize(int& argc, char**& argv, bool shared_parameters) { default_device = devices[default_index]; // TODO these should be accessed through the relevant device and removed here - fxs = default_device->fxs; - dEdfs = default_device->dEdfs; - ps = default_device->ps; kSCALAR_MINUSONE = default_device->kSCALAR_MINUSONE; kSCALAR_ONE = default_device->kSCALAR_ONE; kSCALAR_ZERO = default_device->kSCALAR_ZERO; @@ -109,9 +98,10 @@ void Initialize(int& argc, char**& argv, bool shared_parameters) { void Cleanup() { delete rndeng; - delete fxs; - delete dEdfs; - delete ps; + // TODO: Devices cannot be deleted at the moment + // for(Device* device : devices) delete device; + devices.clear(); + default_device = nullptr; } } // namespace cnn diff --git a/cnn/model.cc b/cnn/model.cc index 376a3f2be..eae515e67 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -27,14 +27,14 @@ ParameterStorageBase::~ParameterStorageBase() {} ParameterStorage::ParameterStorage(const Dim& d, float scale) : dim(d) { values.d = g.d = d; - values.v = static_cast(ps->allocate(d.size() * sizeof(float))); + values.v = static_cast(default_device->ps->allocate(d.size() * sizeof(float))); if (scale) { TensorTools::Randomize(values, scale); } else { TensorTools::Randomize(values); } - g.v = static_cast(ps->allocate(d.size() * sizeof(float))); + g.v = static_cast(default_device->ps->allocate(d.size() * sizeof(float))); TensorTools::Zero(g); } @@ -81,12 +81,12 @@ LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d for (unsigned i = 0; i < n; ++i) { auto& v = values[i]; v.d = d; - v.v = static_cast(ps->allocate(d.size() * sizeof(float))); + v.v = static_cast(default_device->ps->allocate(d.size() * sizeof(float))); TensorTools::Randomize(v); auto& g = grads[i]; g.d = d; - g.v = static_cast(ps->allocate(d.size() * sizeof(float))); + g.v = static_cast(default_device->ps->allocate(d.size() * sizeof(float))); TensorTools::Zero(g); } } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 592ccf2e1..7245ee2ee 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -6,7 +6,8 @@ #include "cnn/simd-functors.h" #include "cnn/functors.h" -#if HAVE_CUDA + +#if defined(HAVE_CUDA) #include "cnn/cuda.h" #include "cnn/gpu-ops.h" #endif @@ -36,15 +37,8 @@ using namespace std; // A macro to instantiate templated device functions // If the implementation is the same for both devices use this, otherwise // directly implement the templated functions -#ifdef HAVE_CUDA +#if defined(__CUDACC__) #define CNN_NODE_INST_DEV_IMPL(MyNode) \ - template void MyNode::forward_dev_impl(const Device_CPU & dev, const vector& xs, Tensor& fx) const; \ - template void MyNode::backward_dev_impl(const Device_CPU & dev, \ - const vector& xs, \ - const Tensor& fx, \ - const Tensor& dEdf, \ - unsigned i, \ - Tensor& dEdxi) const; \ template void MyNode::forward_dev_impl(const Device_GPU & dev, const vector& xs, Tensor& fx) const; \ template void MyNode::backward_dev_impl(const Device_GPU & dev, \ const vector& xs, \ @@ -64,6 +58,10 @@ using namespace std; #endif namespace cnn { + +// ======= Functions to be compiled on only CPU +#if !defined(__CUDACC__) + void AddVectorToAllColumns::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("AddVectorToAllColumns::forward not implemented for CUDA"); @@ -1019,24 +1017,6 @@ void Erf::backward_impl(const vector& xs, #endif } - -template -void Tanh::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - fx.tvec().device(*dev.edevice) = xs[0]->tvec().tanh(); -} - -template -void Tanh::backward_dev_impl(const MyDevice & dev, - const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), scalar_tanh_backward_op()); -} -CNN_NODE_INST_DEV_IMPL(Tanh) - - void Square::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("Square not yet implemented for CUDA"); @@ -1387,7 +1367,7 @@ void Softmax::backward_impl(const vector& xs, void PickNegLogSoftmax::forward_impl(const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { - logz = (float*)fxs->allocate(sizeof(float)*fx.d.batch_elems()); + logz = (float*)device->fxs->allocate(sizeof(float)*fx.d.batch_elems()); #if HAVE_CUDA if(pval) { gpu::pnlsoftmax(xs[0]->d.size(), *pval, xs[0]->v, fx.v, logz); @@ -2185,4 +2165,33 @@ void Zeroes::backward_impl(const vector& xs, throw std::runtime_error("Called backward() on an arity 0 node"); } +#endif // Finish CPU only functions + +// ===== Functions to be compiled on both CPU and GPU + +inline string print_vec(const vector & flt) { + ostringstream oss; + if(flt.size()) oss << flt[0]; + for(size_t i = 1; i < flt.size(); i++) oss << ' ' << flt[i]; + return oss.str(); +} + +template +void Tanh::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + // fx.tvec().device(*dev.edevice) = xs[0]->tvec().tanh(); + gpu::vtanh(fx.d.size(), xs[0]->v, fx.v); +} + +template +void Tanh::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + // dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), scalar_tanh_backward_op()); + gpu::vtanh_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); +} +CNN_NODE_INST_DEV_IMPL(Tanh) + } // namespace cnn diff --git a/cnn/tensor.h b/cnn/tensor.h index fd5d9a91e..06c2197aa 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -5,7 +5,7 @@ #include #include "cnn/dim.h" -#include "cnn/random.h" +#include "cnn/globals.h" #include "cnn/aligned-mem-pool.h" #include "cnn/devices.h" diff --git a/do-configure.sh b/do-configure.sh new file mode 100755 index 000000000..be76e27f3 --- /dev/null +++ b/do-configure.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# BOOST_ROOT=/home/is/neubig/usr/local/boost_1_55_0 +# cmake .. -DEIGEN3_INCLUDE_DIR=$HOME/usr/local/eigen -DBACKEND=cuda -DCUDA_TOOLKIT_ROOT_DIR=/home/is/neubig/usr/local/cuda/toolkit7.0/toolkit -DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE -DBOOST_ROOT:PATHNAME=/home/is/neubig/usr/local/boost_1_55_0 -DBoost_LIBRARY_DIRS:FILEPATH=/home/is/neubig/usr/local/boost_1_55_0/lib +$HOME/usr/bin/cmake .. -DEIGEN3_INCLUDE_DIR=$HOME/usr/local/eigen -DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE -DBOOST_ROOT:PATHNAME=/home/is/neubig/usr/local/boost_1_58_0 -DBoost_LIBRARY_DIRS:FILEPATH=/home/is/neubig/usr/local/boost_1_58_0/lib -DBACKEND=cuda +make -j 24 diff --git a/tests/test-cnn.cc b/tests/test-cnn.cc index 1023ee147..08cf25ec2 100644 --- a/tests/test-cnn.cc +++ b/tests/test-cnn.cc @@ -14,6 +14,7 @@ struct ConfigureCNNTest { } ~ConfigureCNNTest() { for (auto x : av) free(x); + cnn::Cleanup(); } std::vector av; }; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index c158f1cde..a6402f27a 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -15,6 +15,7 @@ struct NodeTest { for (auto x : {"NodeTest", "--cnn-mem", "10"}) { av.push_back(strdup(x)); } + char **argv = &av[0]; int argc = av.size(); cnn::Initialize(argc, argv); @@ -41,6 +42,7 @@ struct NodeTest { } ~NodeTest() { for (auto x : av) free(x); + cnn::Cleanup(); } template From 9aceffe639f76da0cbf62234f14f6a149cc5d654 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 29 Apr 2016 19:17:27 +0900 Subject: [PATCH 480/965] Fixed error caused by freeing memory --- cnn/nodes.cc | 8 ++++---- do-configure.sh | 6 ------ tests/test-cnn.cc | 1 - tests/test-nodes.cc | 1 - 4 files changed, 4 insertions(+), 12 deletions(-) delete mode 100755 do-configure.sh diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 7245ee2ee..17022de6b 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -2178,8 +2178,8 @@ inline string print_vec(const vector & flt) { template void Tanh::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - // fx.tvec().device(*dev.edevice) = xs[0]->tvec().tanh(); - gpu::vtanh(fx.d.size(), xs[0]->v, fx.v); + fx.tvec().device(*dev.edevice) = xs[0]->tvec().tanh(); + // gpu::vtanh(fx.d.size(), xs[0]->v, fx.v); } template @@ -2189,8 +2189,8 @@ void Tanh::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - // dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), scalar_tanh_backward_op()); - gpu::vtanh_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); + dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), scalar_tanh_backward_op()); + // gpu::vtanh_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); } CNN_NODE_INST_DEV_IMPL(Tanh) diff --git a/do-configure.sh b/do-configure.sh deleted file mode 100755 index be76e27f3..000000000 --- a/do-configure.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -# BOOST_ROOT=/home/is/neubig/usr/local/boost_1_55_0 -# cmake .. -DEIGEN3_INCLUDE_DIR=$HOME/usr/local/eigen -DBACKEND=cuda -DCUDA_TOOLKIT_ROOT_DIR=/home/is/neubig/usr/local/cuda/toolkit7.0/toolkit -DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE -DBOOST_ROOT:PATHNAME=/home/is/neubig/usr/local/boost_1_55_0 -DBoost_LIBRARY_DIRS:FILEPATH=/home/is/neubig/usr/local/boost_1_55_0/lib -$HOME/usr/bin/cmake .. -DEIGEN3_INCLUDE_DIR=$HOME/usr/local/eigen -DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE -DBOOST_ROOT:PATHNAME=/home/is/neubig/usr/local/boost_1_58_0 -DBoost_LIBRARY_DIRS:FILEPATH=/home/is/neubig/usr/local/boost_1_58_0/lib -DBACKEND=cuda -make -j 24 diff --git a/tests/test-cnn.cc b/tests/test-cnn.cc index 08cf25ec2..1023ee147 100644 --- a/tests/test-cnn.cc +++ b/tests/test-cnn.cc @@ -14,7 +14,6 @@ struct ConfigureCNNTest { } ~ConfigureCNNTest() { for (auto x : av) free(x); - cnn::Cleanup(); } std::vector av; }; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index a6402f27a..b4f67c53d 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -42,7 +42,6 @@ struct NodeTest { } ~NodeTest() { for (auto x : av) free(x); - cnn::Cleanup(); } template From 1f7f68351eb9ead556fabfc3f98232f9f261e2ac Mon Sep 17 00:00:00 2001 From: austinma Date: Mon, 2 May 2016 23:34:58 -0400 Subject: [PATCH 481/965] Updated a bunch more examples to use v2-style serialization --- examples/embed-cl.cc | 34 +++-- examples/encdec.cc | 19 ++- examples/read-write.cc | 65 +++++---- examples/rnnlm-mp.cc | 2 - examples/rnnlm2.cc | 253 ----------------------------------- examples/tok-embed.cc | 3 - examples/xor-batch-lookup.cc | 56 +++++--- examples/xor-batch.cc | 39 ++++-- examples/xor-xent.cc | 3 + examples/xor.cc | 7 + 10 files changed, 149 insertions(+), 332 deletions(-) delete mode 100644 examples/rnnlm2.cc diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index adee7717e..f5a2dac60 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -8,6 +8,7 @@ #include #include #include +#include using namespace std; using namespace cnn; @@ -28,6 +29,9 @@ struct Encoder { LookupParameter p_s; LookupParameter p_t; vector m; + + Encoder() {} + explicit Encoder(Model& model) { p_s = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {REP_DIM}); p_t = model.add_lookup_parameters(OUTPUT_VOCAB_SIZE, {REP_DIM}); @@ -61,6 +65,13 @@ struct Encoder { return sum_cols(tanh(kmh_ngram(concatenate_cols(m), 2))); #endif } + + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & p_s; + ar & p_t; + } }; int main(int argc, char** argv) { @@ -123,6 +134,17 @@ int main(int argc, char** argv) { double best = 9e+99; #endif Model model; + Encoder emb; + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model >> emb; + } + else { + emb = Encoder(model); + } + bool use_momentum = false; Trainer* sgd = nullptr; if (use_momentum) @@ -130,16 +152,6 @@ int main(int argc, char** argv) { else sgd = new SimpleSGDTrainer(&model); - Encoder emb(model); -#if 0 - if (argc == 4) { - string fname = argv[3]; - ifstream in(fname); - boost::archive::text_iarchive ia(in); - ia >> model; - } -#endif - unsigned report_every_i = 100; unsigned dev_every_i_reports = 10; unsigned si = training.size(); @@ -207,7 +219,7 @@ int main(int argc, char** argv) { best = dloss; ofstream out(fname); boost::archive::text_oarchive oa(out); - oa << model; + oa << model << emb; } cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; } diff --git a/examples/encdec.cc b/examples/encdec.cc index 16cdcd436..cb8c7944e 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -42,6 +42,9 @@ struct EncoderDecoder { Builder dec_builder; Builder rev_enc_builder; Builder fwd_enc_builder; + + EncoderDecoder() {} + explicit EncoderDecoder(Model& model) : dec_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), rev_enc_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), @@ -117,6 +120,15 @@ struct EncoderDecoder { Expression i_nerr = sum(errs); return -i_nerr; } + +private: + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & p_c & p_ec; + ar & p_ie2h & p_bie & p_h2oe & p_boe & p_R & p_bias; + ar & dec_builder & rev_enc_builder & fwd_enc_builder; + } }; int main(int argc, char** argv) { @@ -189,13 +201,16 @@ int main(int argc, char** argv) { //RNNBuilder rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, &model); //EncoderDecoder lm(model); - EncoderDecoder lm(model); + EncoderDecoder lm; if (argc == 4) { string fname = argv[3]; ifstream in(fname); boost::archive::text_iarchive ia(in); ia >> model; } + else { + lm = EncoderDecoder(model); + } unsigned report_every_i = 50; unsigned dev_every_i_reports = 10; @@ -251,7 +266,7 @@ int main(int argc, char** argv) { best = dloss; ofstream out(fname); boost::archive::text_oarchive oa(out); - oa << model; + oa << model << lm; } cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; } diff --git a/examples/read-write.cc b/examples/read-write.cc index db6d9acf8..01f377b9d 100644 --- a/examples/read-write.cc +++ b/examples/read-write.cc @@ -29,29 +29,28 @@ class XORModel { // the cnn model which has saved parameters. XORModel() {} - XORModel(const unsigned& hidden_len, Model *m) { + XORModel(unsigned hidden_len, Model& m) { hidden_size = hidden_len; InitParams(m); } - void InitParams(Model *m) { - pW = m->add_parameters({hidden_size, 2}); - pb = m->add_parameters({hidden_size}); - pV = m->add_parameters({1, hidden_size}); - pa = m->add_parameters({1}); + void InitParams(Model& m) { + pW = m.add_parameters({hidden_size, 2}); + pb = m.add_parameters({hidden_size}); + pV = m.add_parameters({1, hidden_size}); + pa = m.add_parameters({1}); } - void AddParamsToCG(ComputationGraph *cg) { - W = parameter(*cg, pW); - b = parameter(*cg, pb); - V = parameter(*cg, pV); - a = parameter(*cg, pa); + void NewGraph(ComputationGraph& cg) { + W = parameter(cg, pW); + b = parameter(cg, pb); + V = parameter(cg, pV); + a = parameter(cg, pa); } - float Train(vector &input, cnn::real &gold_output, - SimpleSGDTrainer *sgd) { + float Train(const vector& input, cnn::real gold_output, SimpleSGDTrainer* sgd) { ComputationGraph cg; - AddParamsToCG(&cg); + NewGraph(cg); Expression x = cnn::expr::input(cg, {(unsigned int)input.size()}, &input); Expression y = cnn::expr::input(cg, &gold_output); @@ -59,15 +58,16 @@ class XORModel { Expression h = tanh(W*x + b); Expression y_pred = V*h + a; Expression loss = squared_distance(y_pred, y); + float return_loss = as_scalar(cg.forward()); cg.backward(); sgd->update(1.0); return return_loss; } - float Decode(vector &input) { + float Decode(vector& input) { ComputationGraph cg; - AddParamsToCG(&cg); + NewGraph(cg); Expression x = cnn::expr::input(cg, {(unsigned int)input.size()}, &input); Expression h = tanh(W*x + b); @@ -83,34 +83,45 @@ class XORModel { // This can either save or read the value of hidden_size from ar, // depending on whether its the output or input archive. ar & hidden_size; + + // We may save class data, such as the hidden size + // but we must be sure to save all Parameter objects + // that are members of this class. + ar & pW; + ar & pV; + ar & pa; + ar & pb; } }; -void WriteToFile(string& filename, XORModel &model, Model &cnn_model) { +void WriteToFile(string& filename, XORModel& model, Model& cnn_model) { ofstream outfile(filename); if (!outfile.is_open()) { cerr << "File opening failed" << endl; + exit(1); } + // Write out the CNN model and the XOR model. + // It's important to write the CNN model first. + // Since the XOR model uses the CNN model, + // saving in the opposite order will generate a + // boost archive "Pointer Conflict" exception. boost::archive::text_oarchive oa(outfile); - oa & model; // Write down your class object. oa & cnn_model; // Write down the cnn::Model object. + oa & model; // Write down your class object. outfile.close(); } -void ReadFromFile(string& filename, XORModel *model, Model *cnn_model) { +void ReadFromFile(string& filename, XORModel& model, Model& cnn_model) { ifstream infile(filename); if (!infile.is_open()) { cerr << "File opening failed" << endl; + exit(1); } boost::archive::text_iarchive ia(infile); - ia & *model; // Read your class object - - // Now determine structure of cnn::Model depending on the - // the structure of your class object - model->InitParams(cnn_model); - ia & *cnn_model; // Read the cnn::Model + ia & cnn_model; // Read the cnn::Model + ia & model; // Read your class object infile.close(); } @@ -123,7 +134,7 @@ int main(int argc, char** argv) { const unsigned ITERATIONS = 20; Model m; SimpleSGDTrainer sgd(&m); - XORModel model(HIDDEN, &m); + XORModel model(HIDDEN, m); vector x_values(2); // set x_values to change the inputs cnn::real y_value; // set y_value to change the target output @@ -152,7 +163,7 @@ int main(int argc, char** argv) { XORModel read_model; cerr << "Reading model from File: " << outfile << endl; - ReadFromFile(outfile, &read_model, &read_cnn_model); // Reading from file + ReadFromFile(outfile, read_model, read_cnn_model); // Reading from file cerr << "Output for the input: " << x_values[0] << " " << x_values[1] << endl; cerr << read_model.Decode(x_values); // Checking output for sanity } diff --git a/examples/rnnlm-mp.cc b/examples/rnnlm-mp.cc index 8f683fe12..0fed7d960 100644 --- a/examples/rnnlm-mp.cc +++ b/examples/rnnlm-mp.cc @@ -4,8 +4,6 @@ #include "cnn/lstm.h" #include "cnn/mp.h" #include "rnnlm.h" -#include -#include #include #include diff --git a/examples/rnnlm2.cc b/examples/rnnlm2.cc deleted file mode 100644 index 7fb4701af..000000000 --- a/examples/rnnlm2.cc +++ /dev/null @@ -1,253 +0,0 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -# include "cnn/expr.h" - -#include -#include -#include - -#include -#include - -using namespace std; -using namespace cnn; - -unsigned LAYERS = 2; -unsigned INPUT_DIM = 8; //256 -unsigned HIDDEN_DIM = 24; // 1024 -unsigned VOCAB_SIZE = 0; - -cnn::Dict d; -int kSOS; -int kEOS; - -template -struct RNNLanguageModel { - LookupParameter p_c; - Parameter p_R; - Parameter p_bias; - Builder builder; - explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { - p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); - p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); - p_bias = model.add_parameters({VOCAB_SIZE}); - } - - // return Expression of total loss - Expression BuildLMGraph(const vector& sent, ComputationGraph& cg) { - const unsigned slen = sent.size() - 1; - builder.new_graph(cg); // reset RNN builder for new graph - builder.start_new_sequence(); - Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter - Expression i_bias = parameter(cg, p_bias); // word bias - vector errs; - for (unsigned t = 0; t < slen; ++t) { - Expression i_x_t = lookup(cg, p_c, sent[t]); - // y_t = RNN(x_t) - Expression i_y_t = builder.add_input(i_x_t); - Expression i_r_t = i_bias + i_R * i_y_t; - - // we can easily look at intermidiate values - std::vector r_t = as_vector(i_r_t.value()); - for (float f : r_t) cout << f << " "; cout << endl; - cout << "[" << as_scalar(pick(i_r_t, sent[t+1]).value()) << "]" << endl; - - // LogSoftmax followed by PickElement can be written in one step - // using PickNegLogSoftmax -#if 0 - Expression i_ydist = logsoftmax(i_r_t); - errs.push_back(pick(i_ydist, sent[t+1])); -#if 0 - Expression i_ydist = softmax(i_r_t); - i_ydist = log(i_ydist) - errs.push_back(pick(i_ydist, sent[t+1])); -#endif -#else - Expression i_err = pickneglogsoftmax(i_r_t, sent[t+1]); - errs.push_back(i_err); -#endif - } - Expression i_nerr = sum(errs); -#if 0 - return -i_nerr; -#else - return i_nerr; -#endif - } - - // return Expression for total loss - void RandomSample(int max_len = 150) { - cerr << endl; - ComputationGraph cg; - builder.new_graph(cg); // reset RNN builder for new graph - builder.start_new_sequence(); - - Expression i_R = parameter(cg, p_R); - Expression i_bias = parameter(cg, p_bias); - vector errs; - int len = 0; - int cur = kSOS; - while(len < max_len && cur != kEOS) { - ++len; - Expression i_x_t = lookup(cg, p_c, cur); - // y_t = RNN(x_t) - Expression i_y_t = builder.add_input(i_x_t); - Expression i_r_t = i_bias + i_R * i_y_t; - - Expression ydist = softmax(i_r_t); - - unsigned w = 0; - while (w == 0 || (int)w == kSOS) { - auto dist = as_vector(cg.incremental_forward()); - double p = rand01(); - for (; w < dist.size(); ++w) { - p -= dist[w]; - if (p < 0.0) { break; } - } - if (w == dist.size()) w = kEOS; - } - cerr << (len == 1 ? "" : " ") << d.Convert(w); - cur = w; - } - cerr << endl; - } -}; - -int main(int argc, char** argv) { - cnn::Initialize(argc, argv); - if (argc != 3 && argc != 4) { - cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; - return 1; - } - kSOS = d.Convert(""); - kEOS = d.Convert(""); - vector> training, dev; - string line; - int tlc = 0; - int ttoks = 0; - cerr << "Reading training data from " << argv[1] << "...\n"; - { - ifstream in(argv[1]); - assert(in); - while(getline(in, line)) { - ++tlc; - training.push_back(ReadSentence(line, &d)); - ttoks += training.back().size(); - if (training.back().front() != kSOS && training.back().back() != kEOS) { - cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; - } - d.Freeze(); // no new word types allowed - VOCAB_SIZE = d.size(); - - int dlc = 0; - int dtoks = 0; - cerr << "Reading dev data from " << argv[2] << "...\n"; - { - ifstream in(argv[2]); - assert(in); - while(getline(in, line)) { - ++dlc; - dev.push_back(ReadSentence(line, &d)); - dtoks += dev.back().size(); - if (dev.back().front() != kSOS && dev.back().back() != kEOS) { - cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << dlc << " lines, " << dtoks << " tokens\n"; - } - ostringstream os; - os << "lm" - << '_' << LAYERS - << '_' << INPUT_DIM - << '_' << HIDDEN_DIM - << "-pid" << getpid() << ".params"; - const string fname = os.str(); - cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; - - Model model; - bool use_momentum = false; - Trainer* sgd = nullptr; - //if (use_momentum) - // sgd = new MomentumSGDTrainer(&model); - //else - sgd = new SimpleSGDTrainer(&model); - - RNNLanguageModel lm(model); - //RNNLanguageModel lm(model); - if (argc == 4) { - string fname = argv[3]; - ifstream in(fname); - boost::archive::text_iarchive ia(in); - ia >> model; - } - - unsigned report_every_i = 50; - unsigned dev_every_i_reports = 500; - unsigned si = training.size(); - vector order(training.size()); - for (unsigned i = 0; i < order.size(); ++i) order[i] = i; - bool first = true; - int report = 0; - unsigned lines = 0; - while(1) { - Timer iteration("completed in"); - double loss = 0; - unsigned chars = 0; - for (unsigned i = 0; i < report_every_i; ++i) { - if (si == training.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - shuffle(order.begin(), order.end(), *rndeng); - } - - // build graph for this instance - ComputationGraph cg; - auto& sent = training[order[si]]; - chars += sent.size() - 1; - ++si; - lm.BuildLMGraph(sent, cg); - loss += as_scalar(cg.forward()); - cg.backward(); - sgd->update(); - ++lines; - } - sgd->status(); - cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; - lm.RandomSample(); - - // show score on dev data? - report++; - if (report % dev_every_i_reports == 0) { - double dloss = 0; - int dchars = 0; - for (auto& sent : dev) { - ComputationGraph cg; - lm.BuildLMGraph(sent, cg); - dloss += as_scalar(cg.forward()); - dchars += sent.size() - 1; - } - if (dloss < best) { - best = dloss; - ofstream out(fname); - boost::archive::text_oarchive oa(out); - oa << model; - } - cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; - } - } - delete sgd; -} - diff --git a/examples/tok-embed.cc b/examples/tok-embed.cc index 8b5532333..e6ef8f29b 100644 --- a/examples/tok-embed.cc +++ b/examples/tok-embed.cc @@ -14,9 +14,6 @@ #include #include -#include -#include - using namespace std; using namespace cnn; diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup.cc index 304d854d9..3ca9608a1 100644 --- a/examples/xor-batch-lookup.cc +++ b/examples/xor-batch-lookup.cc @@ -23,22 +23,39 @@ int main(int argc, char** argv) { SimpleSGDTrainer sgd(&m); ComputationGraph cg; + Parameter p_W, p_b, p_V, p_a; + LookupParameter x_values, y_values; + if (argc == 2) { + // Load the model and parameters from + // file if given. + ifstream in(argv[1]); + boost::archive::text_iarchive ia(in); + ia >> m >> p_W >> p_b >> p_V >> p_a; + } + else { + // Otherwise, just create a new model. + const unsigned HIDDEN_SIZE = 8; + p_W = m.add_parameters({HIDDEN_SIZE, 2}); + p_b = m.add_parameters({HIDDEN_SIZE}); + p_V = m.add_parameters({1, HIDDEN_SIZE}); + p_a = m.add_parameters({1}); - Expression W = parameter(cg, m.add_parameters({HIDDEN_SIZE, 2})); - Expression b = parameter(cg, m.add_parameters({HIDDEN_SIZE})); - Expression V = parameter(cg, m.add_parameters({1, HIDDEN_SIZE})); - Expression a = parameter(cg, m.add_parameters({1})); + LookupParameter x_values = m.add_lookup_parameters(4, {2}); + LookupParameter y_values = m.add_lookup_parameters(4, {1}); + x_values.Initialize(0, {1.0, 1.0}); + x_values.Initialize(1, {-1.0, 1.0}); + x_values.Initialize(2, {1.0, -1.0}); + x_values.Initialize(3, {-1.0, -1.0}); + y_values.Initialize(0, {-1.0}); + y_values.Initialize(1, {1.0}); + y_values.Initialize(2, {1.0}); + y_values.Initialize(3, {-1.0}); + } - LookupParameter x_values = m.add_lookup_parameters(4, {2}); - LookupParameter y_values = m.add_lookup_parameters(4, {1}); - x_values.Initialize(0, {1.0, 1.0}); - x_values.Initialize(1, {-1.0, 1.0}); - x_values.Initialize(2, {1.0, -1.0}); - x_values.Initialize(3, {-1.0, -1.0}); - y_values.Initialize(0, {-1.0}); - y_values.Initialize(1, {1.0}); - y_values.Initialize(2, {1.0}); - y_values.Initialize(3, {-1.0}); + Expression W = parameter(cg, p_W); + Expression b = parameter(cg, p_b); + Expression V = parameter(cg, p_V); + Expression a = parameter(cg, p_a); Expression x = const_lookup(cg, x_values, {0, 1, 2, 3}); Expression y = const_lookup(cg, y_values, {0, 1, 2, 3}); @@ -51,11 +68,6 @@ int main(int argc, char** argv) { Expression sum_loss = sum_batches(loss); cg.PrintGraphviz(); - if (argc == 2) { - ifstream in(argv[1]); - boost::archive::text_iarchive ia(in); - ia >> m; - } // train the parameters for (unsigned iter = 0; iter < ITERATIONS; ++iter) { @@ -69,7 +81,9 @@ int main(int argc, char** argv) { loss /= 4; cerr << "E = " << loss << endl; } - //boost::archive::text_oarchive oa(cout); - //oa << m; + // Output the model and parameter objects + // to a cout. + boost::archive::text_oarchive oa(cout); + oa << m << p_W << p_b << p_V << p_a << x_values << y_values; } diff --git a/examples/xor-batch.cc b/examples/xor-batch.cc index 47d427a65..2a2980865 100644 --- a/examples/xor-batch.cc +++ b/examples/xor-batch.cc @@ -23,11 +23,28 @@ int main(int argc, char** argv) { SimpleSGDTrainer sgd(&m); ComputationGraph cg; + Parameter p_W, p_b, p_V, p_a; - Expression W = parameter(cg, m.add_parameters({HIDDEN_SIZE, 2})); - Expression b = parameter(cg, m.add_parameters({HIDDEN_SIZE})); - Expression V = parameter(cg, m.add_parameters({1, HIDDEN_SIZE})); - Expression a = parameter(cg, m.add_parameters({1})); + if (argc == 2) { + // Load the model and parameters from + // file if given. + ifstream in(argv[1]); + boost::archive::text_iarchive ia(in); + ia >> m >> p_W >> p_b >> p_V >> p_a; + } + else { + // Otherwise, just create a new model. + const unsigned HIDDEN_SIZE = 8; + p_W = m.add_parameters({HIDDEN_SIZE, 2}); + p_b = m.add_parameters({HIDDEN_SIZE}); + p_V = m.add_parameters({1, HIDDEN_SIZE}); + p_a = m.add_parameters({1}); + } + + Expression W = parameter(cg, p_W); + Expression b = parameter(cg, p_b); + Expression V = parameter(cg, p_V); + Expression a = parameter(cg, p_a); // set x_values to change the inputs to the network Dim x_dim({2}, 4), y_dim({1}, 4); @@ -45,13 +62,6 @@ int main(int argc, char** argv) { Expression loss = squared_distance(y_pred, y); Expression sum_loss = sum_batches(loss); - cg.PrintGraphviz(); - if (argc == 2) { - ifstream in(argv[1]); - boost::archive::text_iarchive ia(in); - ia >> m; - } - // train the parameters for (unsigned iter = 0; iter < ITERATIONS; ++iter) { float my_loss = as_scalar(cg.forward()) / 4; @@ -60,7 +70,10 @@ int main(int argc, char** argv) { sgd.update_epoch(); cerr << "E = " << my_loss << endl; } - //boost::archive::text_oarchive oa(cout); - //oa << m; + + // Output the model and parameter objects + // to a cout. + boost::archive::text_oarchive oa(cout); + oa << m << p_W << p_b << p_V << p_a; } diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index 048c1ca8a..b8dbf3596 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -70,6 +70,9 @@ int main(int argc, char** argv) { loss /= 4; cerr << "E = " << loss << endl; } + + // Output the model and parameter objects + // to a cout. boost::archive::text_oarchive oa(cout); oa << m << p_W << p_b << p_V << p_a; } diff --git a/examples/xor.cc b/examples/xor.cc index d95ef84c0..75d673b69 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -25,11 +25,14 @@ int main(int argc, char** argv) { ComputationGraph cg; Parameter p_W, p_b, p_V, p_a; if (argc == 2) { + // Load the model and parameters from + // file if given. ifstream in(argv[1]); boost::archive::text_iarchive ia(in); ia >> m >> p_W >> p_b >> p_V >> p_a; } else { + // Otherwise, just create a new model. const unsigned HIDDEN_SIZE = 8; p_W = m.add_parameters({HIDDEN_SIZE, 2}); p_b = m.add_parameters({HIDDEN_SIZE}); @@ -53,6 +56,7 @@ int main(int argc, char** argv) { Expression y_pred = V*h + a; Expression loss = squared_distance(y_pred, y); + // Show the computation graph, just for fun. cg.PrintGraphviz(); // train the parameters @@ -72,6 +76,9 @@ int main(int argc, char** argv) { loss /= 4; cerr << "E = " << loss << endl; } + + // Output the model and parameter objects + // to a cout. boost::archive::text_oarchive oa(cout); oa << m << p_W << p_b << p_V << p_a; } From 28c682059a7d5dd49fa9ec2d0a4b9fd0b5756354 Mon Sep 17 00:00:00 2001 From: austinma Date: Tue, 3 May 2016 00:06:54 -0400 Subject: [PATCH 482/965] Started porting theano tutorials to cnn --- CMakeLists.txt | 1 + examples/CMakeLists.txt | 2 +- tutorial/0_multiply.cc | 27 ++++++++++++++++++++ tutorial/1_linear_regression.cc | 44 +++++++++++++++++++++++++++++++++ tutorial/CMakeLists.txt | 15 +++++++++++ 5 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 tutorial/0_multiply.cc create mode 100644 tutorial/1_linear_regression.cc create mode 100644 tutorial/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 25c577b60..efab604c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -96,5 +96,6 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}) add_subdirectory(cnn) add_subdirectory(tests) add_subdirectory(examples) +add_subdirectory(tutorial) add_subdirectory(rnnlm) enable_testing() diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index de17d1651..5bb4474db 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET mlc tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm2 rnnlm-mp read-write) +foreach(TARGET mlc tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm-mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS} pthread) if(UNIX AND NOT APPLE) diff --git a/tutorial/0_multiply.cc b/tutorial/0_multiply.cc new file mode 100644 index 000000000..a18526a67 --- /dev/null +++ b/tutorial/0_multiply.cc @@ -0,0 +1,27 @@ +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/expr.h" + +#include + +using namespace std; +using namespace cnn; +using namespace cnn::expr; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + + ComputationGraph cg; + float ia, ib; + Expression a = input(cg, &ia); + Expression b = input(cg, &ib); + Expression y = a * b; + + ia = 1; + ib = 2; + cout << as_scalar(cg.forward()) << endl; // 2 + + ia = 3; + ib = 3; + cout << as_scalar(cg.forward()) << endl; // 9 +} diff --git a/tutorial/1_linear_regression.cc b/tutorial/1_linear_regression.cc new file mode 100644 index 000000000..a494e00d1 --- /dev/null +++ b/tutorial/1_linear_regression.cc @@ -0,0 +1,44 @@ +#include "cnn/cnn.h" +#include "cnn/training.h" +#include "cnn/expr.h" + +#include +#include + +using namespace std; +using namespace cnn; +using namespace cnn::expr; + +int main(int argc, char** argv) { + cnn::Initialize(argc, argv); + + default_random_engine rng(); + normal_distribution normal(0.0f, 1.0f); + + vector xs; + vector ys; + for (unsigned i = 0; i < 100; ++i) { + float x = -1 + 2.0 / 100; + float y = 2 * x + normal(rng) * 0.33f; + xs.push_back(x); + ys.push_back(y); + } + + Model model; + Parameter pW = model.add_parameters({1}); + + SimpleSGDTrainer trainer(&model, 0.1); + + ComputationGraph cg; + Expression W = parameter(cg, pW); + + for (unsigned i = 0; i < xs.size(); ++i) { + Expression pred = W * xs[i]; + Expression loss = square(pred - ys[i]); + cg.forward(); + cg.backward(); + trainer.update(); + } + + cout << as_scalar(W.value()) << endl; // something around 2 +} diff --git a/tutorial/CMakeLists.txt b/tutorial/CMakeLists.txt new file mode 100644 index 000000000..00c1a07b8 --- /dev/null +++ b/tutorial/CMakeLists.txt @@ -0,0 +1,15 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.8) + +foreach(TARGET 0_multiply 1_linear_regression) + ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) + target_link_libraries(${TARGET} cnn ${LIBS} pthread) + if(UNIX AND NOT APPLE) + target_link_libraries(${TARGET} rt) + endif() + if (WITH_CUDA_BACKEND) + add_dependencies(${TARGET} cnncuda) + target_link_libraries(${TARGET} cnncuda) + CUDA_ADD_CUBLAS_TO_TARGET(${TARGET}) + endif (WITH_CUDA_BACKEND) +endforeach() + From 613ca77a4954d050f648e2da69536ebed8e1dc5b Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 8 May 2016 00:37:28 +0900 Subject: [PATCH 483/965] Fixed segfault on devices --- cnn/exec.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/exec.cc b/cnn/exec.cc index b2e7f676a..77e5a9b78 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -75,7 +75,7 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { void* aux_mem = nullptr; size_t aux_size = node->aux_storage_size(); if (aux_size) { - aux_mem = node->device->fxs->allocate(aux_size); + aux_mem = nfxs[num_nodes_evaluated].device->fxs->allocate(aux_size); if (!aux_mem) { cerr << "aux out of memory\n"; abort(); From 1376bf21adaf12e7d71de324270c03f280cbca61 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 8 May 2016 01:06:33 -0400 Subject: [PATCH 484/965] Fixed duplicate initialization --- cnn/init.cc | 4 ++++ tests/test-nodes.cc | 14 ++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/cnn/init.cc b/cnn/init.cc index 113446a59..ea05106f0 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -24,6 +24,10 @@ static void RemoveArgs(int& argc, char**& argv, int& argi, int n) { } void Initialize(int& argc, char**& argv, bool shared_parameters) { + if(default_device != nullptr) { + cerr << "WARNING: Attempting to initialize cnn twice. Ignoring duplicate initialization." << endl; + return; + } vector gpudevices; #if HAVE_CUDA cerr << "[cnn] initializing CUDA\n"; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index b4f67c53d..0ab557c9c 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -11,14 +11,16 @@ using namespace std; struct NodeTest { NodeTest() { - // set up some dummy arguments to cnn - for (auto x : {"NodeTest", "--cnn-mem", "10"}) { - av.push_back(strdup(x)); + // Initialize if necessary + if(default_device == nullptr) { + for (auto x : {"NodeTest", "--cnn-mem", "10"}) { + av.push_back(strdup(x)); + } + char **argv = &av[0]; + int argc = av.size(); + cnn::Initialize(argc, argv); } - char **argv = &av[0]; - int argc = av.size(); - cnn::Initialize(argc, argv); ones3_vals = {1.f,1.f,1.f}; first_one_vals = {1.f,0.f,0.f}; ones2_vals = {1.f,1.f}; From 5f331eb94a1ff1d1f369f894b617b7dbf05198b2 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 11 May 2016 07:02:26 -0400 Subject: [PATCH 485/965] Made all nodes use defaultdevice at first --- cnn/cnn.h | 6 +++--- cnn/exec.cc | 9 ++------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/cnn/cnn.h b/cnn/cnn.h index 89487903a..e665fbc10 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -184,10 +184,10 @@ struct Node { Device* device; protected: - Node() : args(), device(nullptr) {} - explicit Node(const std::initializer_list& a) : args(a), device(nullptr) {} + Node() : args(), device(default_device) {} + explicit Node(const std::initializer_list& a) : args(a), device(default_device) {} template - explicit Node(const T&c) : args(c.begin(), c.end()), device(nullptr) {} + explicit Node(const T&c) : args(c.begin(), c.end()), device(default_device) {} public: // auxiliary memory diff --git a/cnn/exec.cc b/cnn/exec.cc index 77e5a9b78..984ec8256 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -59,13 +59,8 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { } nfxs[num_nodes_evaluated].d = node->dim; // Get the device - if(node->device != nullptr) { - nfxs[num_nodes_evaluated].device = node->device; - } else if(xs.size() > 0) { - nfxs[num_nodes_evaluated].device = xs[0]->device; - } else { - nfxs[num_nodes_evaluated].device = cnn::default_device; - } + assert(node->device != nullptr); + nfxs[num_nodes_evaluated].device = node->device; // Get the memory nfxs[num_nodes_evaluated].v = static_cast(nfxs[num_nodes_evaluated].device->fxs->allocate(node->dim.size() * sizeof(float))); if (nfxs[num_nodes_evaluated].v == nullptr) { From 344bd55df341ec69c22a2c8275a218483c9fccb1 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 11 May 2016 07:21:15 -0400 Subject: [PATCH 486/965] Fixed some warnings --- cnn/cuda.h | 2 +- cnn/devices.h | 2 +- cnn/gpu-ops.cu | 18 +++++++++--------- cnn/nodes.cc | 2 -- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/cnn/cuda.h b/cnn/cuda.h index 984f084e2..d0fa10965 100644 --- a/cnn/cuda.h +++ b/cnn/cuda.h @@ -32,7 +32,7 @@ namespace cnn { -struct Device; +class Device; inline std::pair SizeToBlockThreadPair(int n) { assert(n); diff --git a/cnn/devices.h b/cnn/devices.h index 91ea307bf..d41f2dbf9 100644 --- a/cnn/devices.h +++ b/cnn/devices.h @@ -7,7 +7,7 @@ namespace Eigen { struct DefaultDevice; - struct CudaStreamDevice; + class CudaStreamDevice; struct GpuDevice; } diff --git a/cnn/gpu-ops.cu b/cnn/gpu-ops.cu index a90f67c02..943ed75d1 100644 --- a/cnn/gpu-ops.cu +++ b/cnn/gpu-ops.cu @@ -58,15 +58,15 @@ void vrelu_backward(int n, const float* fx, const float* dEdf, float* dEdx) { accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FRectifyBackward()); } -void vtanh(int n, const float* x, float* y) { - auto tb = SizeToBlockThreadPair(n); - unaryExprKernel<<>>(n, x, y, FTanh()); -} - -void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx) { - auto tb = SizeToBlockThreadPair(n); - accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FTanhBackward()); -} +// void vtanh(int n, const float* x, float* y) { +// auto tb = SizeToBlockThreadPair(n); +// unaryExprKernel<<>>(n, x, y, FTanh()); +// } +// +// void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx) { +// auto tb = SizeToBlockThreadPair(n); +// accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FTanhBackward()); +// } void vlog(int n, const float* x, float* y) { auto tb = SizeToBlockThreadPair(n); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 17022de6b..7b30f43ee 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -2179,7 +2179,6 @@ inline string print_vec(const vector & flt) { template void Tanh::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { fx.tvec().device(*dev.edevice) = xs[0]->tvec().tanh(); - // gpu::vtanh(fx.d.size(), xs[0]->v, fx.v); } template @@ -2190,7 +2189,6 @@ void Tanh::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), scalar_tanh_backward_op()); - // gpu::vtanh_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); } CNN_NODE_INST_DEV_IMPL(Tanh) From eeadec3b1f0b3ae66b7590cb28f2f41d46629b02 Mon Sep 17 00:00:00 2001 From: dhg Date: Wed, 11 May 2016 15:40:08 -0700 Subject: [PATCH 487/965] Added FastLSTMBuilder interface to PyCNN --- pycnn/pycnn.pxd | 15 +++++++++++++++ pycnn/pycnn.pyx | 8 ++++++++ 2 files changed, 23 insertions(+) diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index d42715010..9d57703cf 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -271,3 +271,18 @@ cdef extern from "cnn/lstm.h" namespace "cnn": #vector[CExpression] get_s(CRNNPointer i) #CRNNPointer state() +cdef extern from "cnn/fast-lstm.h" namespace "cnn": + cdef cppclass CFastLSTMBuilder "cnn::FastLSTMBuilder" (CRNNBuilder): + CFastLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) + #void new_graph(CComputationGraph &cg) + #void start_new_sequence(vector[CExpression] ces) + #CExpression add_input(CExpression &x) + #CExpression add_input(CRNNPointer prev, CExpression &x) + #void rewind_one_step() + #CExpression back() + #vector[CExpression] final_h() + #vector[CExpression] final_s() + #vector[CExpression] get_h(CRNNPointer i) + #vector[CExpression] get_s(CRNNPointer i) + #CRNNPointer state() + diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 735acacfc..f3b9e1a54 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -853,6 +853,14 @@ cdef class LSTMBuilder(RNNBuilder): # {{{ def whoami(self): return "LSTMBuilder" # }}} +cdef class FastLSTMBuilder(RNNBuilder): # {{{ + def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): + self.thisptr = new CFastLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr) + self.cg_version = -1 + + def whoami(self): return "FastLSTMBuilder" +# }}} + cdef class RNNState: # {{{ """ This is the main class for working with RNNs / LSTMs / GRUs. From a08d2f2a63adb645711cfbd4ef87c847437a3fd9 Mon Sep 17 00:00:00 2001 From: dhg Date: Wed, 11 May 2016 16:10:14 -0700 Subject: [PATCH 488/965] Added `inputVector(vec)` to PyCNN (so a separate `set` is not required). Previously, to input a literal vector, it was necessary to call `v = vecInput(dim)` followed by a seprate call to `v.set(vec)`. Now this can be accomplished more smoothly by calling `v = inputVector(vec)` to create an expression represeting vector `vec`. --- pycnn/pycnn.pyx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 735acacfc..56a0d8fe4 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -339,6 +339,8 @@ cdef class ComputationGraph: return _inputExpression(self, v) cdef inputVector(self, int dim): return _vecInputExpression(self, vector[float](dim)) + cdef inputVectorLiteral(self, vector[float] v): + return _vecInputExpression(self, v) cdef inputMatrix(self, int d1, int d2): return _vecInputExpression(self, vector[float](d1*d2), (d1,d2)) cdef lookup(self, LookupParameters p, unsigned v = 0, update=True): @@ -516,6 +518,9 @@ cdef class _vecInputExpression(Expression): def vecInput(int dim): return _cg.inputVector(dim) +def inputVector(vector[float] v): + return _cg.inputVectorLiteral(v) + def matInput(int d1, int d2): return _cg.inputMatrix(d1, d2) From ebdf8f36ffa53a7dc5cfe8165fba7c4ba810fe27 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 12 May 2016 10:41:45 +0900 Subject: [PATCH 489/965] Tensorified componentwise operations --- cnn/nodes-common.cc | 10 + cnn/nodes.cc | 950 ++++++++++++++++++++------------------------ cnn/nodes.h | 200 ++-------- 3 files changed, 457 insertions(+), 703 deletions(-) diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index cdb226b7b..7e53bf3f8 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -952,4 +952,14 @@ Dim BinaryLogLoss::dim_forward(const vector& xs) const { return Dim({1}, max(xs[0].bd, xs[1].bd)); } +string Zeroes::as_string(const vector& arg_names) const { + ostringstream s; + s << "zeroes(" << dim << ')'; + return s.str(); +} + +Dim Zeroes::dim_forward(const vector& xs) const { + return dim; +} + } // namespace cnn diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 7b30f43ee..2cf8683d5 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -7,7 +7,7 @@ #include "cnn/simd-functors.h" #include "cnn/functors.h" -#if defined(HAVE_CUDA) +#ifdef HAVE_CUDA #include "cnn/cuda.h" #include "cnn/gpu-ops.h" #endif @@ -35,9 +35,12 @@ using namespace std; // // A macro to instantiate templated device functions -// If the implementation is the same for both devices use this, otherwise -// directly implement the templated functions -#if defined(__CUDACC__) +// If the implementation is the same for both devices (using Eigen Tensors), +// then this will instantiate both CPU and GPU implementations, and the +// code can be the same. +// If the implementation is different for both devices, use #ifdef __CUDACC__ +// within the function, and create alternative code paths for CPU and GPU implementations +#ifdef __CUDACC__ #define CNN_NODE_INST_DEV_IMPL(MyNode) \ template void MyNode::forward_dev_impl(const Device_GPU & dev, const vector& xs, Tensor& fx) const; \ template void MyNode::backward_dev_impl(const Device_GPU & dev, \ @@ -60,7 +63,7 @@ using namespace std; namespace cnn { // ======= Functions to be compiled on only CPU -#if !defined(__CUDACC__) +#ifndef __CUDACC__ void AddVectorToAllColumns::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA @@ -434,27 +437,6 @@ void TraceOfProduct::backward_impl(const vector& xs, #endif } -void ConstScalarMultiply::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("ConstantScalarMultiply not yet implemented for CUDA"); -#else - fx.vec() = xs[0]->vec() * alpha; -#endif -} - -void ConstScalarMultiply::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i == 0); -#ifdef HAVE_CUDA - throw std::runtime_error("ScalarMultiply not yet implemented for CUDA"); -#else - dEdxi.vec() += dEdf.vec() * alpha; -#endif -} - void DotProduct::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("DotProduct not yet implemented for CUDA"); @@ -661,129 +643,6 @@ void InnerProduct3D_1D_1D::backward_impl(const vector& xs, } } -size_t GaussianNoise::aux_storage_size() const { - return dim.size() * sizeof(float); -} - -void GaussianNoise::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("GaussianNoise not yet implemented for CUDA"); -#else - Tensor m(dim, (float*)aux_mem, fx.device); - TensorTools::RandomizeNormal(0, stddev, m); - fx.vec() = xs[0]->vec() + m.vec(); -#endif -} - -void GaussianNoise::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("GaussianNoise not yet implemented for CUDA"); -#else - dEdxi.vec() += dEdf.vec(); -#endif -} - -size_t Dropout::aux_storage_size() const { - return dim.size() * sizeof(float); -} - -void Dropout::forward_impl(const vector& xs, Tensor& fx) const { - Tensor m(dim, (float*)aux_mem, fx.device); - TensorTools::RandomBernoulli(m, (1.f-p), 1.f / (1.f-p)); -#ifdef HAVE_CUDA - gpu::vcwise_product(fx.d.size(), xs[0]->v, m.v, fx.v); -#else - fx.vec() = xs[0]->vec().cwiseProduct(m.vec()); -#endif -} - -void Dropout::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - Tensor m(dim, (float*)aux_mem, fx.device); -#ifdef HAVE_CUDA - gpu::vcwise_product(dEdf.d.size(), dEdf.v, m.v, fx.v); -#else - dEdxi.vec() += dEdf.vec().cwiseProduct(m.vec()); -#endif -} - -size_t BlockDropout::aux_storage_size() const { - // we just need to remember whether this entire block is turned on (1.0) or off (0.0) - return 1 * sizeof(float); -} - -void BlockDropout::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("BlockDropout not yet implemented for CUDA"); -#else - bernoulli_distribution distribution(1.0 - dropout_probability); - float block_multiplier = distribution(*rndeng)? 1.0 : 0.0; - block_multiplier = - dropout_probability == 1.0? 0.0 : block_multiplier / (1.0 - dropout_probability); - if (dropout_probability > 1.0 || dropout_probability < 0.0) { - assert(false && "dropout probability must be in the range [0, 1]"); - } - *(static_cast(aux_mem)) = block_multiplier; - (*fx) = **xs[0] * block_multiplier; -#endif -} - -void BlockDropout::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("BlockDropout not yet implemented for CUDA"); -#else - float block_multiplier = *(static_cast(aux_mem)); - (*dEdxi) += (*dEdf) * block_multiplier; -#endif -} - -void ConstantPlusX::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("ConstantPlusX not yet implemented for CUDA"); -#else - fx.vec() = xs[0]->vec().unaryExpr(const_add_op(c)); -#endif -} - -void ConstantPlusX::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - dEdxi.vec() += dEdf.vec(); -} - -void ConstantMinusX::forward_impl(const vector& xs, Tensor& fx) const { -#if HAVE_CUDA - gpu::vconstant_minusx(fx.d.size(), c, xs[0]->v, fx.v); -#else - fx.vec() = xs[0]->vec().unaryExpr(const_minus_op(c)); -#endif -} - -void ConstantMinusX::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#if HAVE_CUDA - gpu::vnegate_backward(dEdxi.d.size(), dEdf.v, dEdxi.v); -#else - dEdxi.vec() -= dEdf.vec(); -#endif -} - template EIGEN_STRONG_INLINE float logsumexp(const T& x) { using std::exp; @@ -977,147 +836,6 @@ void Average::backward_impl(const vector& xs, dEdxi.vec() += (dEdf.vec() / xs.size()); } -void Sqrt::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Sqrt not yet implemented for CUDA"); -#else - fx.vec() = xs[0]->vec().cwiseSqrt(); -#endif -} - -void Sqrt::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Sqrt not yet implemented for CUDA"); -#else - dEdxi.vec() += fx.vec().binaryExpr(*dEdf, FSqrtBackward()); -#endif -} - -void Erf::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Erf not yet implemented for CUDA"); -#else - fx.vec().array() = xs[0]->vec().array().erf(); -#endif -} - -void Erf::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Erf not yet implemented for CUDA"); -#else - dEdxi.vec() += xs[0]->vec().binaryExpr(dEdf.vec(), scalar_erf_backward_op()); -#endif -} - -void Square::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Square not yet implemented for CUDA"); -#else - fx.vec().array() = xs[0]->vec().array().square(); -#endif -} - -void Square::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Square not yet implemented for CUDA"); -#else - dEdxi.vec() += dEdf.vec().cwiseProduct(xs[0]->vec()) * 2; -#endif -} - -void Cube::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Square not yet implemented for CUDA"); -#else - fx.vec().array() = xs[0]->vec().array().cube(); -#endif -} - -void Cube::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Cube not yet implemented for CUDA"); -#else -// *dEdxi += (*dEdf).cwiseProduct(x.cwiseProduct(x)) * 3; - dEdxi.vec().array() += dEdf.vec().array() * xs[0]->vec().array().square() * 3; -#endif -} - -void Exp::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Exp not yet implemented for CUDA"); -#else - fx.vec() = xs[0]->vec().array().exp(); -#endif -} - -void Exp::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Exp not yet implemented for CUDA"); -#else - dEdxi.vec() += dEdf.vec().cwiseProduct(fx.vec()); -#endif -} - -void LogGamma::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("LogGamma not yet implemented for CUDA"); -#else - fx.vec() = xs[0]->vec().array().lgamma(); -#endif -} - -void LogGamma::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("LogGamma not yet implemented for CUDA"); -#else - dEdxi.vec() += xs[0]->vec().binaryExpr(dEdf.vec(), FLogGammaBackward()); -#endif -} - -void Log::forward_impl(const vector& xs, Tensor& fx) const { -#if HAVE_CUDA - gpu::vlog(fx.d.size(), xs[0]->v, fx.v); -#else - fx.vec() = xs[0]->vec().array().log(); -#endif -} - -void Log::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#if HAVE_CUDA - gpu::vlog_backward(fx.d.size(), xs[0]->v, dEdf.v, dEdxi.v); -#else - dEdxi.vec() += dEdf.vec().cwiseQuotient(xs[0]->vec()); -#endif -} - void Concatenate::forward_impl(const vector& xs, Tensor& fx) const { unsigned rows = 0; for (auto x : xs) rows += x->d.rows(); @@ -1196,32 +914,6 @@ void ConcatenateColumns::backward_impl(const vector& xs, #endif } -void PairwiseRankLoss::forward_impl(const vector& xs, Tensor& fx) const { -#if HAVE_CUDA - gpu::vpairwise_rank_loss(fx.d.size(), margin, xs[0]->v, xs[1]->v, fx.v); -#else - auto a = xs[0]->vec(); - auto b = xs[1]->vec(); - fx.vec() = a.binaryExpr(b, FPairwiseRankLoss(margin)); -#endif -} - -void PairwiseRankLoss::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#if HAVE_CUDA - gpu::vpairwise_rank_loss_backward(dEdf.d.size(), (i == 0), fx.v, dEdf.v, dEdxi.v); -#else - if (i == 0) { - dEdxi.vec() -= fx.vec().binaryExpr(dEdf.vec(), FRectifyBackward()); - } else { - dEdxi.vec() += fx.vec().binaryExpr(dEdf.vec(), FRectifyBackward()); - } -#endif -} - size_t Hinge::aux_storage_size() const { return dim.size() * sizeof(float); } @@ -1272,19 +964,6 @@ void Hinge::backward_impl(const vector& xs, #endif } -void Identity::forward_impl(const vector& xs, Tensor& fx) const { - fx.d = xs[0]->d; - fx.v = xs[0]->v; -} - -void Identity::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - dEdxi.vec() += dEdf.vec(); -} - void MaxPooling1D::forward_impl(const vector& xs, Tensor& fx) const { cerr << "FIX IMPL5\n"; abort(); #if 0 @@ -1718,88 +1397,23 @@ void MatrixMultiply::backward_impl(const vector& xs, #endif } -void CwiseQuotient::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 2); -#ifdef HAVE_CUDA - throw std::runtime_error("CwiseQuotient::forward not yet implemented for CUDA"); -#else - auto x1 = xs[0]->vec(); - auto x2 = xs[1]->vec(); - fx.vec() = x1.cwiseQuotient(x2); -#endif -} - -void CwiseQuotient::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i < 2); -#ifdef HAVE_CUDA - throw std::runtime_error("CwiseQuotient::backward not yet implemented for CUDA"); -#else - if (i == 0) { - auto x2 = xs[1]->vec(); - dEdxi.vec() += dEdf.vec().cwiseQuotient(x2); - } else { // i = 1 - auto x1 = xs[0]->vec(); - auto x2 = xs[1]->vec(); - dEdxi.vec() -= dEdf.vec().cwiseQuotient(x2.cwiseProduct(x2)).cwiseProduct(x1); - } -#endif -} - -void CwiseMultiply::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 2); -#if HAVE_CUDA - gpu::vcwise_product(fx.d.size(), xs[0]->v, xs[1]->v, fx.v); -#else - auto x1 = xs[0]->vec(); - auto x2 = xs[1]->vec(); - fx.vec() = x1.cwiseProduct(x2); -#endif -} - -void CwiseMultiply::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i < 2); - if (i == 0) { -#if HAVE_CUDA - gpu::vcwise_product_backward(fx.d.size(), dEdf.v, xs[1]->v, dEdxi.v); -#else - auto x2 = xs[1]->vec(); - dEdxi.vec() += dEdf.vec().cwiseProduct(x2); -#endif - } else { -#if HAVE_CUDA - gpu::vcwise_product_backward(fx.d.size(), dEdf.v, xs[0]->v, dEdxi.v); -#else - auto x1 = xs[0]->vec(); - dEdxi.vec() += dEdf.vec().cwiseProduct(x1); -#endif - } -} - -void AffineTransform::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() % 2 == 1); - if (xs.size() == 1) { - fx.v = xs[0]->v; - return; - } else { -#if HAVE_CUDA - for (unsigned i = 1; i < xs.size(); i += 2) - // fx = (acc_sclar)*fx + xs[0] * xs[1] - CUDAMatrixMultiply(*xs[i], *xs[i + 1], fx, (i == 1) ? kSCALAR_ZERO : kSCALAR_ONE); - if(fx.d.bd == xs[0]->d.bd) { - CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v, 1, fx.v, 1)); - } else { - // TODO: Any better way to do broadcasting? - for(unsigned b = 0; b < fx.d.bd; ++b) - CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.batch_size(), kSCALAR_ONE, xs[0]->batch_ptr(b), 1, fx.batch_ptr(b), 1)); - } +void AffineTransform::forward_impl(const vector& xs, Tensor& fx) const { + assert(xs.size() % 2 == 1); + if (xs.size() == 1) { + fx.v = xs[0]->v; + return; + } else { +#if HAVE_CUDA + for (unsigned i = 1; i < xs.size(); i += 2) + // fx = (acc_sclar)*fx + xs[0] * xs[1] + CUDAMatrixMultiply(*xs[i], *xs[i + 1], fx, (i == 1) ? kSCALAR_ZERO : kSCALAR_ONE); + if(fx.d.bd == xs[0]->d.bd) { + CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v, 1, fx.v, 1)); + } else { + // TODO: Any better way to do broadcasting? + for(unsigned b = 0; b < fx.d.bd; ++b) + CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.batch_size(), kSCALAR_ONE, xs[0]->batch_ptr(b), 1, fx.batch_ptr(b), 1)); + } #else // Add, using broadcasting or not if(fx.d.bd > 1 && xs[0]->d.bd == 1) { @@ -1888,51 +1502,6 @@ void AffineTransform::backward_impl(const vector& xs, } } -void Negate::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); -#if HAVE_CUDA - gpu::vnegate(fx.d.size(), xs[0]->v, fx.v); -#else - auto x = xs[0]->vec(); - fx.vec() = -x; -#endif -} - -void Negate::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i == 0); -#if HAVE_CUDA - gpu::vnegate_backward(fx.d.size(), dEdf.v, dEdxi.v); -#else - dEdxi.vec() -= dEdf.vec(); -#endif -} - -void Rectify::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); -#if HAVE_CUDA - gpu::vrelu(fx.d.size(), xs[0]->v, fx.v); -#else - auto x = xs[0]->vec(); - fx.vec() = x.cwiseMax(0.f); -#endif -} - -void Rectify::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#if HAVE_CUDA - gpu::vrelu_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); -#else - dEdxi.vec() += fx.vec().binaryExpr(dEdf.vec(), FRectifyBackward()); -#endif -} - void HuberDistance::forward_impl(const vector& xs, Tensor& fx) const { assert(xs.size() == 2); #ifdef HAVE_CUDA @@ -2067,50 +1636,6 @@ void SquaredEuclideanDistance::backward_impl(const vector& xs, #endif } -void LogisticSigmoid::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); -#if HAVE_CUDA - gpu::vlogistic(fx.d.size(), xs[0]->v, fx.v); -#else - auto x = xs[0]->vec(); - fx.vec() = x.unaryExpr(scalar_logistic_sigmoid_op()); -#endif -} - -void LogisticSigmoid::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#if HAVE_CUDA - gpu::vlogistic_backward(dEdf.d.size(), fx.v, dEdf.v, dEdxi.v); -#else - dEdxi.vec() += fx.vec().binaryExpr(dEdf.vec(), scalar_logistic_sigmoid_backward_op()); -#endif -} - -void SoftSign::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); -#ifdef HAVE_CUDA - throw std::runtime_error("SoftSign not yet implemented for CUDA"); -#else - auto x = xs[0]->vec(); - fx.vec() = x.unaryExpr(FSoftSign()); -#endif -} - -void SoftSign::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("SoftSign not yet implemented for CUDA"); -#else - dEdxi.vec() += fx.vec().binaryExpr(dEdf.vec(), FSoftSignBackward()); -#endif -} - void BinaryLogLoss::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("BinaryLogLoss not yet implemented for CUDA"); @@ -2138,44 +1663,396 @@ void BinaryLogLoss::backward_impl(const vector& xs, #endif } -string Zeroes::as_string(const vector& arg_names) const { - ostringstream s; - s << "zeroes(" << dim << ')'; - return s.str(); +#endif // Finish CPU only functions + +// ===== Functions to be compiled on both CPU and GPU + +size_t BlockDropout::aux_storage_size() const { + // we just need to remember whether this entire block is turned on (1.0) or off (0.0) + return 1 * sizeof(float); } -Dim Zeroes::dim_forward(const vector& xs) const { - return dim; +template +void BlockDropout::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + bernoulli_distribution distribution(1.0 - dropout_probability); + float block_multiplier = distribution(*rndeng)? 1.0 : 0.0; + block_multiplier = + dropout_probability == 1.0? 0.0 : block_multiplier / (1.0 - dropout_probability); + if (dropout_probability > 1.0 || dropout_probability < 0.0) { + assert(false && "dropout probability must be in the range [0, 1]"); + } + *(static_cast(aux_mem)) = block_multiplier; + fx.tvec() = xs[0]->tvec() * block_multiplier; } -void Zeroes::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 0); -#if HAVE_CUDA - cudaMemsetAsync(fx.v, 0, dim.size() * sizeof(float)); -#else - memset(fx.v, 0, dim.size() * sizeof(float)); -#endif +template +void BlockDropout::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + float block_multiplier = *(static_cast(aux_mem)); + dEdxi.tvec() += dEdf.tvec() * block_multiplier; } +CNN_NODE_INST_DEV_IMPL(BlockDropout) -void Zeroes::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - throw std::runtime_error("Called backward() on an arity 0 node"); +template +void ConstantMinusX::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + fx.tvec().device(*dev.edevice) = xs[0]->tvec().unaryExpr(const_minus_op(c)); } -#endif // Finish CPU only functions +template +void ConstantMinusX::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) -= dEdf.tvec(); +} +CNN_NODE_INST_DEV_IMPL(ConstantMinusX) -// ===== Functions to be compiled on both CPU and GPU +template +void ConstantPlusX::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + fx.tvec().device(*dev.edevice) = xs[0]->tvec().unaryExpr(const_add_op(c)); +} + +template +void ConstantPlusX::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); +} +CNN_NODE_INST_DEV_IMPL(ConstantPlusX) + +template +void ConstScalarMultiply::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + fx.tvec().device(*dev.edevice) = xs[0]->tvec() * alpha; +} + +template +void ConstScalarMultiply::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i == 0); + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * alpha; +} +CNN_NODE_INST_DEV_IMPL(ConstScalarMultiply) -inline string print_vec(const vector & flt) { - ostringstream oss; - if(flt.size()) oss << flt[0]; - for(size_t i = 1; i < flt.size(); i++) oss << ' ' << flt[i]; - return oss.str(); +template +void Cube::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + fx.tvec().device(*dev.edevice) = xs[0]->tvec().cube(); } +template +void Cube::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * xs[0]->tvec().square() * 3.f; +} +CNN_NODE_INST_DEV_IMPL(Cube) + +template +void CwiseQuotient::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 2); + fx.tvec().device(*dev.edevice) = xs[0]->tvec() / xs[1]->tvec(); +} + +template +void CwiseQuotient::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + if (i == 0) { + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() / xs[1]->tvec(); + } else { // i = 1 + dEdxi.tvec().device(*dev.edevice) -= dEdf.tvec() / xs[1]->tvec().square() * xs[0]->tvec(); + } +} +CNN_NODE_INST_DEV_IMPL(CwiseQuotient) + +template +void CwiseMultiply::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 2); + fx.tvec().device(*dev.edevice) = xs[0]->tvec() * xs[1]->tvec(); +} + +template +void CwiseMultiply::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + if (i == 0) { + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * xs[1]->tvec(); + } else { + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * xs[0]->tvec(); + } +} +CNN_NODE_INST_DEV_IMPL(CwiseMultiply) + +size_t Dropout::aux_storage_size() const { + return dim.size() * sizeof(float); +} + +template +void Dropout::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + Tensor m(dim, (float*)aux_mem, fx.device); + TensorTools::RandomBernoulli(m, (1.f-p), 1.f / (1.f-p)); + fx.tvec().device(*dev.edevice) = xs[0]->tvec() * m.tvec(); +} + +template +void Dropout::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + Tensor m(dim, (float*)aux_mem, fx.device); + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * m.tvec(); +} +CNN_NODE_INST_DEV_IMPL(Dropout) + +template +void Erf::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + fx.tvec().device(*dev.edevice) = xs[0]->tvec().erf(); +} + +template +void Erf::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += xs[0]->tvec().binaryExpr(dEdf.tvec(), scalar_erf_backward_op()); +} +CNN_NODE_INST_DEV_IMPL(Erf) + +template +void Exp::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + fx.tvec().device(*dev.edevice) = xs[0]->tvec().exp(); +} + +template +void Exp::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * fx.tvec(); +} +CNN_NODE_INST_DEV_IMPL(Exp) + +size_t GaussianNoise::aux_storage_size() const { + return dim.size() * sizeof(float); +} + +template +void GaussianNoise::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + Tensor m(dim, (float*)aux_mem, fx.device); + TensorTools::RandomizeNormal(0, stddev, m); + fx.tvec().device(*dev.edevice) = xs[0]->tvec() + m.tvec(); +} + +template +void GaussianNoise::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); +} +CNN_NODE_INST_DEV_IMPL(GaussianNoise) + +template +void Identity::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + fx.d = xs[0]->d; + fx.v = xs[0]->v; +} + +template +void Identity::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec() += dEdf.tvec(); +} +CNN_NODE_INST_DEV_IMPL(Identity) + +template +void Log::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + fx.tvec().device(*dev.edevice) = xs[0]->tvec().log(); +} + +template +void Log::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() / xs[0]->tvec(); +} +CNN_NODE_INST_DEV_IMPL(Log) + +template +void LogGamma::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + fx.tvec().device(*dev.edevice) = xs[0]->tvec().lgamma(); +} + +template +void LogGamma::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += xs[0]->tvec().binaryExpr(dEdf.tvec(), FLogGammaBackward()); +} +CNN_NODE_INST_DEV_IMPL(LogGamma) + +template +void LogisticSigmoid::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + fx.tvec().device(*dev.edevice) = xs[0]->tvec().unaryExpr(scalar_logistic_sigmoid_op()); +} + +template +void LogisticSigmoid::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec() += fx.tvec().binaryExpr(dEdf.tvec(), scalar_logistic_sigmoid_backward_op()); +} +CNN_NODE_INST_DEV_IMPL(LogisticSigmoid) + +template +void Negate::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + fx.tvec().device(*dev.edevice) = -xs[0]->tvec(); +} + +template +void Negate::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i == 0); + dEdxi.tvec().device(*dev.edevice) -= dEdf.tvec(); +} +CNN_NODE_INST_DEV_IMPL(Negate) + +template +void PairwiseRankLoss::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + fx.tvec().device(*dev.edevice) = xs[0]->tvec().binaryExpr(xs[1]->tvec(), FPairwiseRankLoss(margin)); +} + +template +void PairwiseRankLoss::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + if (i == 0) { + dEdxi.tvec().device(*dev.edevice) -= fx.tvec().binaryExpr(dEdf.tvec(), FRectifyBackward()); + } else { + dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), FRectifyBackward()); + } +} +CNN_NODE_INST_DEV_IMPL(PairwiseRankLoss) + +template +void Rectify::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + fx.tvec().device(*dev.edevice) = xs[0]->tvec().cwiseMax(0.f); +} + +template +void Rectify::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), FRectifyBackward()); +} +CNN_NODE_INST_DEV_IMPL(Rectify) + +template +void SoftSign::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + fx.tvec().device(*dev.edevice) = xs[0]->tvec().unaryExpr(FSoftSign()); +} + +template +void SoftSign::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), FSoftSignBackward()); +} +CNN_NODE_INST_DEV_IMPL(SoftSign) + +template +void Square::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + fx.tvec().device(*dev.edevice) = xs[0]->tvec().square(); +} + +template +void Square::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * xs[0]->tvec() * 2.f; +} +CNN_NODE_INST_DEV_IMPL(Square) + +template +void Sqrt::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + fx.tvec().device(*dev.edevice) = xs[0]->tvec().sqrt(); +} + +template +void Sqrt::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), FSqrtBackward()); +} +CNN_NODE_INST_DEV_IMPL(Sqrt) + template void Tanh::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { fx.tvec().device(*dev.edevice) = xs[0]->tvec().tanh(); @@ -2192,4 +2069,25 @@ void Tanh::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(Tanh) +template +void Zeroes::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 0); +#ifdef __CUDACC__ + cudaMemsetAsync(fx.v, 0, dim.size() * sizeof(float)); +#else + memset(fx.v, 0, dim.size() * sizeof(float)); +#endif +} + +template +void Zeroes::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + throw std::runtime_error("Called backward() on an arity 0 node"); +} +CNN_NODE_INST_DEV_IMPL(Zeroes) + } // namespace cnn diff --git a/cnn/nodes.h b/cnn/nodes.h index e7ac826d2..c62ac55bf 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -222,15 +222,8 @@ struct TraceOfProduct : public Node { // y = alpha * x_1 struct ConstScalarMultiply : public Node { explicit ConstScalarMultiply(const std::initializer_list& a, float alpha) : Node(a), alpha(alpha) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() float alpha; }; @@ -342,47 +335,26 @@ struct InnerProduct3D_1D_1D : public Node { // y = x + n struct GaussianNoise : public Node { explicit GaussianNoise(const std::initializer_list& a, real stddev) : Node(a), stddev(stddev) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() real stddev; }; // y = dropout(x,p) where p specifies the dropout probability struct Dropout : public Node { explicit Dropout(const std::initializer_list& a, real p) : Node(a), p(p) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() real p; }; // y = block_dropout(x,p) where p specifies the probability for dropping-out the entire block struct BlockDropout : public Node { explicit BlockDropout(const std::initializer_list& a, real p) : Node(a), dropout_probability(p) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() real dropout_probability; }; @@ -390,15 +362,8 @@ struct BlockDropout : public Node { // (c is a vector or matrix of the constant, usually 1, but can be configured) struct ConstantPlusX : public Node { explicit ConstantPlusX(const std::initializer_list& a, real o) : Node(a), c(o) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() real c; }; @@ -406,44 +371,23 @@ struct ConstantPlusX : public Node { // (c is a vector or matrix of the constant, usually 1, but can be configured) struct ConstantMinusX : public Node { explicit ConstantMinusX(const std::initializer_list& a, real o) : Node(a), c(o) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() real c; }; // y = sqrt x_1 struct Sqrt : public Node { explicit Sqrt(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = erf x_1 struct Erf : public Node { explicit Erf(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = tanh x_1 @@ -456,71 +400,36 @@ struct Tanh : public Node { // y = x_1 \odot x_1 struct Square : public Node { explicit Square(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = x_1 \odot x_1 \odot x_1 struct Cube : public Node { explicit Cube(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = exp x_1 struct Exp : public Node { explicit Exp(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = lgamma x_1 struct LogGamma : public Node { explicit LogGamma(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = log x_1 (base e, i.e., natural log) struct Log : public Node { explicit Log(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // concatenate rows @@ -559,15 +468,8 @@ struct ConcatenateColumns : public Node { // y = max(0, margin - x_1 + x_2) struct PairwiseRankLoss : public Node { explicit PairwiseRankLoss(const std::initializer_list& a, real m = 1.0) : Node(a), margin(m) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() real margin; }; @@ -593,15 +495,8 @@ struct Hinge : public Node { // y = x_1 struct Identity : public Node { explicit Identity(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // hyperparameter: width > 1 @@ -639,29 +534,15 @@ struct MatrixMultiply : public Node { // y = x_1 \cdot x_2 (Hadamard product) struct CwiseMultiply : public Node { explicit CwiseMultiply(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = x_1 / x_2 (cwiseQuotient) struct CwiseQuotient : public Node { explicit CwiseQuotient(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = x_1 \sum_{i=2, 4 ...} A_i * x_{i+1} @@ -681,29 +562,15 @@ struct AffineTransform : public Node { // y = -x_1 struct Negate : public Node { explicit Negate(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + virtual bool supports_multibatch() const override { return true; } + CNN_NODE_DEFINE_DEV_IMPL() }; // y = max(0,x) struct Rectify : public Node { explicit Rectify(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // you could do this with LogisticSigmoid, Softmax or a variety of other @@ -875,29 +742,15 @@ struct L1Distance : public Node { // y = \sigma(x_1) struct LogisticSigmoid : public Node { explicit LogisticSigmoid(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = x / (1 + |x|) struct SoftSign : public Node { explicit SoftSign(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // z = \sum_j \exp (x_i)_j @@ -1013,14 +866,7 @@ struct PickRange : public Node { // represents a simple vector of 0s struct Zeroes : public Node { explicit Zeroes(const Dim& d) : dim(d) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() Dim dim; }; From a061072e34e48775ad71a83a6e327843e9b5d37b Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 12 May 2016 17:35:21 +0900 Subject: [PATCH 490/965] Added device code for distances/norms --- cnn/nodes.cc | 368 ++++++++++++++++++++++----------------------------- cnn/nodes.h | 64 +-------- cnn/tensor.h | 8 ++ 3 files changed, 170 insertions(+), 270 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 2cf8683d5..3163344e1 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -340,78 +340,6 @@ void Pow::backward_impl(const vector& xs, #endif } -size_t Min::aux_storage_size() const { - return dim.size() * sizeof(float); -} - -void Min::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Min not yet implemented for CUDA"); -#else - auto y = fx.vec(); - auto x1 = xs[0]->vec(); - auto x2 = xs[1]->vec(); - Tensor t(fx.d, static_cast(aux_mem), fx.device); - auto u = t.vec(); - u = (x1.array() < x2.array()).matrix().cast(); - y = x1.cwiseMin(x2); -#endif -} - -void Min::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i < 2); -#ifdef HAVE_CUDA - throw std::runtime_error("Min not yet implemented for CUDA"); -#else - const Tensor t(dEdxi.d, static_cast(aux_mem), fx.device); - if (i == 0) { - dEdxi.vec() += t.vec().cwiseProduct(dEdf.vec()); - } else { - dEdxi.vec() += t.vec().binaryExpr(dEdf.vec(), FMaxBackwardInv()); - } -#endif -} - -size_t Max::aux_storage_size() const { - return dim.size() * sizeof(float); -} - -void Max::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Max not yet implemented for CUDA"); -#else - auto y = fx.vec(); - auto x1 = xs[0]->vec(); - auto x2 = xs[1]->vec(); - Tensor t(fx.d, static_cast(aux_mem), fx.device); - auto u = t.vec(); - u = (x1.array() > x2.array()).matrix().cast(); - y = x1.cwiseMax(x2); -#endif -} - -void Max::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i < 2); -#ifdef HAVE_CUDA - throw std::runtime_error("Max not yet implemented for CUDA"); -#else - const Tensor t(dEdxi.d, static_cast(aux_mem), fx.device); - if (i == 0) { - dEdxi.vec() += t.vec().cwiseProduct(dEdf.vec()); - } else { - dEdxi.vec() += t.vec().binaryExpr(dEdf.vec(), FMaxBackwardInv()); - } -#endif -} - void TraceOfProduct::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("TraceOfProduct not yet implemented for CUDA"); @@ -1502,70 +1430,13 @@ void AffineTransform::backward_impl(const vector& xs, } } -void HuberDistance::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 2); -#ifdef HAVE_CUDA - throw std::runtime_error("HuberDistance not yet implemented for CUDA"); -#else - auto x = *xs[0]; - auto y = *xs[1]; - const FHuberForward fhf(d); - const size_t s = x.d.size(); - float dist = 0; - for (size_t i = 0; i < s; ++i) - dist += fhf(x.v[i] - y.v[i]); - fx.v[0] = dist; -#endif -} - -void HuberDistance::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i < 2); -#ifdef HAVE_CUDA - throw std::runtime_error("HuberDistance not yet implemented for CUDA"); -#else - auto x = **xs[i]; - auto y = **xs[1-i]; - *dEdxi += (x - y).unaryExpr(FHuberBackward(d, dEdf.v[0])); -#endif -} - -void L1Distance::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 2); -#ifdef HAVE_CUDA - throw std::runtime_error("L1Distance not yet implemented for CUDA"); -#else - auto x = xs[0]->vec(); - auto y = xs[1]->vec(); - fx.v[0] = (x - y).lpNorm<1>(); -#endif -} - -void L1Distance::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i < 2); -#ifdef HAVE_CUDA - throw std::runtime_error("L1Distance not yet implemented for CUDA"); -#else - auto x = xs[i]->vec(); - auto y = xs[1-i]->vec(); - dEdxi.vec() += (x - y).unaryExpr(FL1Backward(dEdf.v[0])); -#endif -} - void PoissonRegressionLoss::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("PoissonRegressionLoss not yet implemented for CUDA"); #else const auto y = *pty; const auto z = lgamma(y + 1); - const auto x = xs[0]->v[0]; + const auto x = as_scalar(*xs[0]); fx.v[0] = expf(x) + z - y * x; #endif } @@ -1585,92 +1456,48 @@ void PoissonRegressionLoss::backward_impl(const vector& xs, #endif } -void SquaredNorm::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); -#if HAVE_CUDA - throw std::runtime_error("SquaredNorm not yet implemented for CUDA"); -#else - fx.v[0] = xs[0]->vec().squaredNorm(); -#endif -} +// ===== Auxiliary functions -void SquaredNorm::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i < 1); -#if HAVE_CUDA - throw std::runtime_error("SquaredNorm not yet implemented for CUDA"); -#else - real scale = dEdf.v[0] * 2; - dEdxi.vec().noalias() += scale * xs[0]->vec(); -#endif +size_t BlockDropout::aux_storage_size() const { + // we just need to remember whether this entire block is turned on (1.0) or off (0.0) + return 1 * sizeof(float); } -void SquaredEuclideanDistance::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 2); -#if HAVE_CUDA - gpu::sqeucdist(xs[0]->d.size(), xs[0]->v, xs[1]->v, fx.v); -#else - auto x1 = **xs[0]; - auto x2 = **xs[1]; - fx.v[0] = (x1 - x2).squaredNorm(); -#endif +size_t Dropout::aux_storage_size() const { + return dim.size() * sizeof(float); } -void SquaredEuclideanDistance::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i < 2); -#if HAVE_CUDA - gpu::sqeucdist_backward(xs[0]->d.size(), dEdf.v, xs[0]->v, xs[1]->v, dEdxi.v, i); -#else - auto x1 = **xs[0]; - auto x2 = **xs[1]; - real scale = dEdf.v[0] * 2; - if (i == 1) scale = -scale; - *dEdxi += scale * (x1 - x2); -#endif +size_t GaussianNoise::aux_storage_size() const { + return dim.size() * sizeof(float); } -void BinaryLogLoss::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("BinaryLogLoss not yet implemented for CUDA"); -#else - auto x = *xs[0]; - auto y = *xs[1]; - FBinaryLogLoss bll; - const size_t s = x.d.size(); - float dist = 0; - for (size_t i = 0; i < s; ++i) - dist += bll(x.v[i], y.v[i]); - fx.v[0] = dist; -#endif +size_t Max::aux_storage_size() const { + return dim.size() * sizeof(float); } -void BinaryLogLoss::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("BinaryLogLoss not yet implemented for CUDA"); -#else - *dEdxi += (**xs[i]).binaryExpr(**xs[1-i], FBinaryLogLossBackward(dEdf.v[0])); -#endif +size_t Min::aux_storage_size() const { + return dim.size() * sizeof(float); } #endif // Finish CPU only functions // ===== Functions to be compiled on both CPU and GPU -size_t BlockDropout::aux_storage_size() const { - // we just need to remember whether this entire block is turned on (1.0) or off (0.0) - return 1 * sizeof(float); +template +void BinaryLogLoss::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + fx.t<0>().device(*dev.edevice) = xs[0]->tvec().binaryExpr(xs[1]->tvec(), FBinaryLogLoss()).sum(); +} + +template +void BinaryLogLoss::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += xs[i]->tvec().binaryExpr(xs[1-i]->tvec(), FBinaryLogLossBackward(as_scalar(dEdf))); } +CNN_NODE_INST_DEV_IMPL(BinaryLogLoss) template void BlockDropout::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1679,10 +1506,10 @@ void BlockDropout::forward_dev_impl(const MyDevice & dev, const vector 1.0 || dropout_probability < 0.0) { - assert(false && "dropout probability must be in the range [0, 1]"); + throw std::runtime_error("Dropout probability must be in the range [0, 1]"); } *(static_cast(aux_mem)) = block_multiplier; - fx.tvec() = xs[0]->tvec() * block_multiplier; + fx.tvec().device(*dev.edevice) = xs[0]->tvec() * block_multiplier; } template @@ -1693,7 +1520,7 @@ void BlockDropout::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { float block_multiplier = *(static_cast(aux_mem)); - dEdxi.tvec() += dEdf.tvec() * block_multiplier; + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * block_multiplier; } CNN_NODE_INST_DEV_IMPL(BlockDropout) @@ -1806,10 +1633,6 @@ void CwiseMultiply::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(CwiseMultiply) -size_t Dropout::aux_storage_size() const { - return dim.size() * sizeof(float); -} - template void Dropout::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { Tensor m(dim, (float*)aux_mem, fx.device); @@ -1861,10 +1684,6 @@ void Exp::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(Exp) -size_t GaussianNoise::aux_storage_size() const { - return dim.size() * sizeof(float); -} - template void GaussianNoise::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { Tensor m(dim, (float*)aux_mem, fx.device); @@ -1883,6 +1702,24 @@ void GaussianNoise::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(GaussianNoise) +template +void HuberDistance::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 2); + fx.t<0>().device(*dev.edevice) = (xs[0]->tvec() - xs[1]->tvec()).unaryExpr(FHuberForward(d)).sum(); +} + +template +void HuberDistance::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + dEdxi.tvec().device(*dev.edevice) += (xs[i]->tvec() - xs[1-i]->tvec()).unaryExpr(FHuberBackward(d, as_scalar(dEdf))); +} +CNN_NODE_INST_DEV_IMPL(HuberDistance) + template void Identity::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { fx.d = xs[0]->d; @@ -1896,10 +1733,28 @@ void Identity::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - dEdxi.tvec() += dEdf.tvec(); + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); } CNN_NODE_INST_DEV_IMPL(Identity) +template +void L1Distance::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 2); + fx.t<0>().device(*dev.edevice) = (xs[0]->tvec() - xs[1]->tvec()).abs().sum(); +} + +template +void L1Distance::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + dEdxi.tvec().device(*dev.edevice) += (xs[i]->tvec() - xs[1-i]->tvec()).unaryExpr(FL1Backward(as_scalar(dEdf))); +} +CNN_NODE_INST_DEV_IMPL(L1Distance) + template void Log::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { fx.tvec().device(*dev.edevice) = xs[0]->tvec().log(); @@ -1945,10 +1800,58 @@ void LogisticSigmoid::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - dEdxi.tvec() += fx.tvec().binaryExpr(dEdf.tvec(), scalar_logistic_sigmoid_backward_op()); + dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), scalar_logistic_sigmoid_backward_op()); } CNN_NODE_INST_DEV_IMPL(LogisticSigmoid) +template +void Max::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + Tensor t(fx.d, static_cast(aux_mem), fx.device); + t.tvec().device(*dev.edevice) = (xs[0]->tvec() > xs[1]->tvec()).cast(); + fx.tvec().device(*dev.edevice) = xs[0]->tvec().cwiseMax(xs[1]->tvec()); +} + +template +void Max::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + const Tensor t(dEdxi.d, static_cast(aux_mem), fx.device); + if (i == 0) { + dEdxi.tvec().device(*dev.edevice) += t.tvec() * dEdf.tvec(); + } else { + dEdxi.tvec().device(*dev.edevice) += t.tvec().binaryExpr(dEdf.tvec(), FMaxBackwardInv()); + } +} +CNN_NODE_INST_DEV_IMPL(Max) + +template +void Min::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + Tensor t(fx.d, static_cast(aux_mem), fx.device); + t.tvec().device(*dev.edevice) = (xs[0]->tvec() < xs[1]->tvec()).cast(); + fx.tvec().device(*dev.edevice) = xs[0]->tvec().cwiseMin(xs[1]->tvec()); +} + +template +void Min::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + const Tensor t(dEdxi.d, static_cast(aux_mem), fx.device); + if (i == 0) { + dEdxi.tvec().device(*dev.edevice) += t.tvec() * dEdf.tvec(); + } else { + dEdxi.tvec().device(*dev.edevice) += t.tvec().binaryExpr(dEdf.tvec(), FMaxBackwardInv()); + } +} +CNN_NODE_INST_DEV_IMPL(Min) + template void Negate::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); @@ -2037,6 +1940,45 @@ void Square::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(Square) +template +void SquaredEuclideanDistance::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 2); + fx.t<0>().device(*dev.edevice) = (xs[0]->tvec() - xs[1]->tvec()).square().sum(); +} + +template +void SquaredEuclideanDistance::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + real scale = as_scalar(dEdf) * 2; + if (i == 1) scale = -scale; + dEdxi.tvec().device(*dev.edevice) += (xs[0]->tvec() - xs[1]->tvec()) * scale; +} +CNN_NODE_INST_DEV_IMPL(SquaredEuclideanDistance) + +template +void SquaredNorm::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + fx.t<0>().device(*dev.edevice) = xs[0]->tvec().square().sum(); +} + +template +void SquaredNorm::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 1); + real scale = as_scalar(dEdf) * 2; + dEdxi.tvec().device(*dev.edevice) += xs[0]->tvec() * scale; +} +CNN_NODE_INST_DEV_IMPL(SquaredNorm) + template void Sqrt::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { fx.tvec().device(*dev.edevice) = xs[0]->tvec().sqrt(); diff --git a/cnn/nodes.h b/cnn/nodes.h index c62ac55bf..20b910af7 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -179,31 +179,17 @@ struct Pow : public Node { // y = min{x_1, x_2} struct Min : public Node { explicit Min(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = max{x_1, x_2} struct Max : public Node { template explicit Max(const T& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = Tr(x_1 * x_2^T) @@ -580,14 +566,7 @@ struct Rectify : public Node { // y = ty * log(x_1) + (1 - ty) * log(x_1) struct BinaryLogLoss : public Node { BinaryLogLoss(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = \log \sum_i \exp x_i @@ -688,55 +667,26 @@ struct PoissonRegressionLoss : public Node { // y = || x_1 ||^2 struct SquaredNorm : public Node { explicit SquaredNorm(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = || x_1 - x_2 ||^2 struct SquaredEuclideanDistance : public Node { explicit SquaredEuclideanDistance(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = || x_1 - x_2 ||_H(d) struct HuberDistance : public Node { explicit HuberDistance(const std::initializer_list& a, float d = 1.345f) : Node(a), d(d) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() float d; }; // y = || x_1 - x_2 ||_1 struct L1Distance : public Node { explicit L1Distance(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = \sigma(x_1) diff --git a/cnn/tensor.h b/cnn/tensor.h index 06c2197aa..30b93d9b1 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -176,6 +176,14 @@ struct Tensor { BOOST_SERIALIZATION_SPLIT_MEMBER() }; +template<> inline Eigen::TensorMap> Tensor::t<0>() { + assert(d.size() == 1); + return Eigen::TensorMap>(v); +} +template<> inline const Eigen::TensorMap> Tensor::t<0>() const { + assert(d.size() == 1); + return Eigen::TensorMap>(v); +} template<> inline Eigen::TensorMap> Tensor::t<1>() { assert(d.ndims() == 1); return Eigen::TensorMap>(v, (int)d[0]); From fa7add8dc58a4186e1b8beb8dd13d192e3ba6d92 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 12 May 2016 17:55:09 +0900 Subject: [PATCH 491/965] Device implementations of Pow and DotProduct --- cnn/nodes.cc | 91 ++++++++++++++++++++++------------------------------ cnn/nodes.h | 27 ++-------------- 2 files changed, 42 insertions(+), 76 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 3163344e1..964fc9897 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -308,38 +308,6 @@ void SelectCols::backward_impl(const vector& xs, #endif } -void Pow::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 2); -#ifdef HAVE_CUDA - throw std::runtime_error("Pow not yet implemented for CUDA"); -#else - auto x1 = **xs[0]; - auto x2 = xs[1]->v[0]; - (*fx).array() = x1.array().pow(x2); -#endif -} - -void Pow::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(xs.size() == 2); -#ifdef HAVE_CUDA - throw std::runtime_error("Pow not yet implemented for CUDA"); -#else - auto x1 = **xs[0]; - auto x2 = xs[1]->v[0]; - if (i == 0) { - *dEdxi += (x2 * x1.array().pow(x2 - 1).matrix()).cwiseProduct(*dEdf); - } else { - // y = a^x - // dy/dx = a^x * log(a) - (*dEdxi).noalias() += (*fx).cwiseProduct(x1.array().log().matrix()).transpose() * (*dEdf); - } -#endif -} - void TraceOfProduct::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("TraceOfProduct not yet implemented for CUDA"); @@ -365,26 +333,6 @@ void TraceOfProduct::backward_impl(const vector& xs, #endif } -void DotProduct::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("DotProduct not yet implemented for CUDA"); -#else - *fx = (**xs[0]).transpose() * (**xs[1]); -#endif -} - -void DotProduct::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("DotProduct not yet implemented for CUDA"); -#else - (*dEdxi) += (dEdf.v[0]) * (**xs[1 - i]); -#endif -} - void Transpose::forward_impl(const vector& xs, Tensor& fx) const { if (dim.rows() == 1 || dim.cols() == 1) { fx.v = xs[0]->v; @@ -1633,6 +1581,20 @@ void CwiseMultiply::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(CwiseMultiply) + +void DotProduct::forward_impl(const vector& xs, Tensor& fx) const { + fx.t<0>().device(*dev.edevice) = (xs[0]->tvec() * xs[1]->tvec()).sum(); +} + +void DotProduct::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += xs[1 - i]->tvec() * as_scalar(dEdf); +} +CNN_NODE_INST_DEV_IMPL(DotProduct) + template void Dropout::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { Tensor m(dim, (float*)aux_mem, fx.device); @@ -1890,6 +1852,31 @@ void PairwiseRankLoss::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(PairwiseRankLoss) +template +void Pow::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 2); + fx->tvec().device(*dev.edevice) = xs[0]->tvec().pow(as_scalar(*xs[0])); +} + +template +void Pow::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(xs.size() == 2); + real x2 = as_scalar(*xs[1]); + if (i == 0) { + dEdxi.tvec().device(*dev.edevice) += (xs[0]->tvec().pow(x2 - 1) * x2) * dEdf.tvec(); + } else { + // y = a^x + // dy/dx = a^x * log(a) + dEdxi.t<0>().device(*dev.edevice) += (fx->tvec() * xs[0]->tvec().log() * dEdf.tvec()).sum(); + } +} +CNN_NODE_INST_DEV_IMPL(Pow) + template void Rectify::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); diff --git a/cnn/nodes.h b/cnn/nodes.h index 20b910af7..4c63158cb 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -166,14 +166,7 @@ struct SelectCols : public Node { // x_2 raise every element in x_1 to the power of scalar x_2 struct Pow : public Node { explicit Pow(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = min{x_1, x_2} @@ -216,14 +209,7 @@ struct ConstScalarMultiply : public Node { // y = x_1^T . x_2 struct DotProduct : public Node { explicit DotProduct(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = x_1^T @@ -464,15 +450,8 @@ struct PairwiseRankLoss : public Node { struct Hinge : public Node { explicit Hinge(const std::initializer_list& a, unsigned e, real m = 1.0) : Node(a), element(e), pelement(&element), margin(m) {} explicit Hinge(const std::initializer_list& a, const unsigned* pe, real m = 1.0) : Node(a), element(), pelement(pe), margin(m) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() unsigned element; const unsigned* pelement; real margin; From 39a0b351184cb1f37b9d6a2f063a00d14e776fb6 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 12 May 2016 18:14:50 +0900 Subject: [PATCH 492/965] Device implementations of MatrixMultiply and AffineTransform --- cnn/nodes.cc | 313 ++++++++++++++++++++++++++------------------------- cnn/nodes.h | 27 ++--- 2 files changed, 167 insertions(+), 173 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 964fc9897..f5123047a 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1163,19 +1163,61 @@ void PickRange::backward_impl(const vector& xs, #endif } -#if HAVE_CUDA +void PoissonRegressionLoss::forward_impl(const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("PoissonRegressionLoss not yet implemented for CUDA"); +#else + const auto y = *pty; + const auto z = lgamma(y + 1); + const auto x = as_scalar(*xs[0]); + fx.v[0] = expf(x) + z - y * x; +#endif +} + +void PoissonRegressionLoss::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { +#ifdef HAVE_CUDA + throw std::runtime_error("PoissonRegressionLoss not yet implemented for CUDA"); +#else + const auto x = xs[0]->v[0]; + const auto y = *pty; + auto& dEdx = dEdxi.v[0]; + dEdx += expf(x) - y; +#endif +} + +// ===== Auxiliary functions + +size_t BlockDropout::aux_storage_size() const { + // we just need to remember whether this entire block is turned on (1.0) or off (0.0) + return 1 * sizeof(float); +} + +size_t Dropout::aux_storage_size() const { + return dim.size() * sizeof(float); +} + +size_t GaussianNoise::aux_storage_size() const { + return dim.size() * sizeof(float); +} + +size_t Max::aux_storage_size() const { + return dim.size() * sizeof(float); +} + +size_t Min::aux_storage_size() const { + return dim.size() * sizeof(float); +} + +#endif // Finish CPU only functions + +// ===== Functions to be compiled on both CPU and GPU + +#ifdef __CUDACC__ inline void CUDAMatrixMultiply(const Tensor& l, const Tensor& r, Tensor& y, const float* acc_scalar) { - // if (r.d.ndims() == 1 || r.d.cols() == 1) { - // CUBLAS_CHECK(cublasSgemv(cublas_handle, CUBLAS_OP_N, l.d.rows(), l.d.cols(), - // kSCALAR_ONE, l.v, l.d.rows(), r.v, 1, acc_scalar, y.v, 1)); - // } else { - // CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, - // y.d.rows(), y.d.cols(), l.d.cols(), - // kSCALAR_ONE, - // l.v, l.d.rows(), - // r.v, r.d.rows(), - // acc_scalar, y.v, y.d.rows())); - // } if(l.d.bd == 1) { // If the left side has one batch, multiply by columns // [x, z, b] = [x, y] * [y, z, b] @@ -1201,85 +1243,16 @@ inline void CUDAMatrixMultiply(const Tensor& l, const Tensor& r, Tensor& y, cons } #endif -void MatrixMultiply::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 2); -#if HAVE_CUDA - // fx = 0*fx + xs[0] * xs[1] - CUDAMatrixMultiply(*xs[0], *xs[1], fx, kSCALAR_ZERO); -#else - assert(fx.d.bd == max(xs[0]->d.bd, xs[1]->d.bd)); - if(xs[0]->d.bd == 1) { - // If the left side has one batch, multiply by columns - // [x, z, b] = [x, y] * [y, z, b] - // -> [x, z*b] = [x, y], [y, z*b] - fx.colbatch_matrix().noalias() = **xs[0] * xs[1]->colbatch_matrix(); - } else { - // Otherwise, loop over the batches - assert(xs[1]->d.bd == 1 || xs[1]->d.bd == xs[0]->d.bd); - for(unsigned b = 0; b < xs[0]->d.bd; ++b) - fx.batch_matrix(b).noalias() = xs[0]->batch_matrix(b) * xs[1]->batch_matrix(b); - } -#endif -} - -void MatrixMultiply::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i < 2); - int max_b = max(xs[0]->d.bd, xs[1]->d.bd); -#if HAVE_CUDA - if (i == 0) { - for(int b = 0; b < max_b; ++b) - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, - dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), - kSCALAR_ONE, - dEdf.batch_ptr(b), dEdf.d.rows(), - xs[1]->batch_ptr(b), xs[1]->d.rows(), - kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); - } else { - // Do a single multiply if xs[0] has one batch - if(xs[0]->d.bd == 1) { - // dEdxi.colbatch_matrix().noalias() += (**xs[0]).transpose() * dEdf.colbatch_matrix(); - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, - dEdxi.d.rows(), dEdxi.d.cols()*dEdxi.d.batch_elems(), xs[0]->d.rows(), - kSCALAR_ONE, - xs[0]->v, xs[0]->d.rows(), - dEdf.v, dEdf.d.rows(), - kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); - } else { - for(int b = 0; b < max_b; ++b) - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, - dEdxi.d.rows(), dEdxi.d.cols(), xs[0]->d.rows(), - kSCALAR_ONE, - xs[0]->batch_ptr(b), xs[0]->d.rows(), - dEdf.batch_ptr(b), dEdf.d.rows(), - kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); - } - } -#else - if (i == 0) { - for(int b = 0; b < max_b; ++b) - dEdxi.batch_matrix(b).noalias() += dEdf.batch_matrix(b) * xs[1]->batch_matrix(b).transpose(); - } else { - if(xs[0]->d.bd == 1) { - dEdxi.colbatch_matrix().noalias() += (**xs[0]).transpose() * dEdf.colbatch_matrix(); - } else { - for(int b = 0; b < max_b; ++b) - dEdxi.batch_matrix(b).noalias() += xs[0]->batch_matrix(b).transpose() * dEdf.batch_matrix(b); - } - } -#endif -} - -void AffineTransform::forward_impl(const vector& xs, Tensor& fx) const { +// Affine transform uses different impleentations for CPU and GPU because this is +// much faster than using Eigen's tensor contractions (as of the writing) +template +void AffineTransform::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() % 2 == 1); if (xs.size() == 1) { fx.v = xs[0]->v; return; } else { -#if HAVE_CUDA +#ifdef __CUDACC__ for (unsigned i = 1; i < xs.size(); i += 2) // fx = (acc_sclar)*fx + xs[0] * xs[1] CUDAMatrixMultiply(*xs[i], *xs[i + 1], fx, (i == 1) ? kSCALAR_ZERO : kSCALAR_ONE); @@ -1310,19 +1283,20 @@ void AffineTransform::forward_impl(const vector& xs, Tensor& fx) } } } - #endif } } -void AffineTransform::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { +template +void AffineTransform::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { assert(i < xs.size()); if (i == 0) { // bias term -#if HAVE_CUDA +#if __CUDACC__ CUBLAS_CHECK(cublasSaxpy(cublas_handle, dEdxi.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); #else // Add, using broadcasting or not @@ -1335,7 +1309,7 @@ void AffineTransform::backward_impl(const vector& xs, #endif } else if (i % 2 == 1) { // left argument of matrix multiply int max_b = max(dEdf.d.bd, xs[i+1]->d.bd); -#if HAVE_CUDA +#if __CUDACC__ for(int b = 0; b < max_b; ++b) CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), @@ -1349,7 +1323,7 @@ void AffineTransform::backward_impl(const vector& xs, #endif } else { // right argument of matrix multiply int max_b = max(xs[i-1]->d.bd, dEdf.d.bd); -#if HAVE_CUDA +#if __CUDACC__ // Do a single multiply if xs[i-1] has one batch if(xs[i-1]->d.bd == 1) { CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, @@ -1377,59 +1351,7 @@ void AffineTransform::backward_impl(const vector& xs, #endif } } - -void PoissonRegressionLoss::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("PoissonRegressionLoss not yet implemented for CUDA"); -#else - const auto y = *pty; - const auto z = lgamma(y + 1); - const auto x = as_scalar(*xs[0]); - fx.v[0] = expf(x) + z - y * x; -#endif -} - -void PoissonRegressionLoss::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("PoissonRegressionLoss not yet implemented for CUDA"); -#else - const auto x = xs[0]->v[0]; - const auto y = *pty; - auto& dEdx = dEdxi.v[0]; - dEdx += expf(x) - y; -#endif -} - -// ===== Auxiliary functions - -size_t BlockDropout::aux_storage_size() const { - // we just need to remember whether this entire block is turned on (1.0) or off (0.0) - return 1 * sizeof(float); -} - -size_t Dropout::aux_storage_size() const { - return dim.size() * sizeof(float); -} - -size_t GaussianNoise::aux_storage_size() const { - return dim.size() * sizeof(float); -} - -size_t Max::aux_storage_size() const { - return dim.size() * sizeof(float); -} - -size_t Min::aux_storage_size() const { - return dim.size() * sizeof(float); -} - -#endif // Finish CPU only functions - -// ===== Functions to be compiled on both CPU and GPU +CNN_NODE_INST_DEV_IMPL(AffineTransform) template void BinaryLogLoss::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1582,15 +1504,18 @@ void CwiseMultiply::backward_dev_impl(const MyDevice & dev, CNN_NODE_INST_DEV_IMPL(CwiseMultiply) -void DotProduct::forward_impl(const vector& xs, Tensor& fx) const { +template +void DotProduct::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { fx.t<0>().device(*dev.edevice) = (xs[0]->tvec() * xs[1]->tvec()).sum(); } -void DotProduct::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { +template +void DotProduct::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += xs[1 - i]->tvec() * as_scalar(dEdf); } CNN_NODE_INST_DEV_IMPL(DotProduct) @@ -1766,6 +1691,82 @@ void LogisticSigmoid::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(LogisticSigmoid) +template +void MatrixMultiply::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 2); +#ifdef __CUDACC__ + // fx = 0*fx + xs[0] * xs[1] + CUDAMatrixMultiply(*xs[0], *xs[1], fx, kSCALAR_ZERO); +#else + assert(fx.d.bd == max(xs[0]->d.bd, xs[1]->d.bd)); + if(xs[0]->d.bd == 1) { + // If the left side has one batch, multiply by columns + // [x, z, b] = [x, y] * [y, z, b] + // -> [x, z*b] = [x, y], [y, z*b] + fx.colbatch_matrix().noalias() = **xs[0] * xs[1]->colbatch_matrix(); + } else { + // Otherwise, loop over the batches + assert(xs[1]->d.bd == 1 || xs[1]->d.bd == xs[0]->d.bd); + for(unsigned b = 0; b < xs[0]->d.bd; ++b) + fx.batch_matrix(b).noalias() = xs[0]->batch_matrix(b) * xs[1]->batch_matrix(b); + } +#endif +} + +template +void MatrixMultiply::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + int max_b = max(xs[0]->d.bd, xs[1]->d.bd); +#if __CUDACC__ + if (i == 0) { + for(int b = 0; b < max_b; ++b) + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, + dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), + kSCALAR_ONE, + dEdf.batch_ptr(b), dEdf.d.rows(), + xs[1]->batch_ptr(b), xs[1]->d.rows(), + kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); + } else { + // Do a single multiply if xs[0] has one batch + if(xs[0]->d.bd == 1) { + // dEdxi.colbatch_matrix().noalias() += (**xs[0]).transpose() * dEdf.colbatch_matrix(); + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, + dEdxi.d.rows(), dEdxi.d.cols()*dEdxi.d.batch_elems(), xs[0]->d.rows(), + kSCALAR_ONE, + xs[0]->v, xs[0]->d.rows(), + dEdf.v, dEdf.d.rows(), + kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); + } else { + for(int b = 0; b < max_b; ++b) + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, + dEdxi.d.rows(), dEdxi.d.cols(), xs[0]->d.rows(), + kSCALAR_ONE, + xs[0]->batch_ptr(b), xs[0]->d.rows(), + dEdf.batch_ptr(b), dEdf.d.rows(), + kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); + } + } +#else + if (i == 0) { + for(int b = 0; b < max_b; ++b) + dEdxi.batch_matrix(b).noalias() += dEdf.batch_matrix(b) * xs[1]->batch_matrix(b).transpose(); + } else { + if(xs[0]->d.bd == 1) { + dEdxi.colbatch_matrix().noalias() += (**xs[0]).transpose() * dEdf.colbatch_matrix(); + } else { + for(int b = 0; b < max_b; ++b) + dEdxi.batch_matrix(b).noalias() += xs[0]->batch_matrix(b).transpose() * dEdf.batch_matrix(b); + } + } +#endif +} +CNN_NODE_INST_DEV_IMPL(MatrixMultiply) + template void Max::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { Tensor t(fx.d, static_cast(aux_mem), fx.device); @@ -1855,7 +1856,7 @@ CNN_NODE_INST_DEV_IMPL(PairwiseRankLoss) template void Pow::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 2); - fx->tvec().device(*dev.edevice) = xs[0]->tvec().pow(as_scalar(*xs[0])); + fx.tvec().device(*dev.edevice) = xs[0]->tvec().pow(as_scalar(*xs[1])); } template @@ -1872,7 +1873,7 @@ void Pow::backward_dev_impl(const MyDevice & dev, } else { // y = a^x // dy/dx = a^x * log(a) - dEdxi.t<0>().device(*dev.edevice) += (fx->tvec() * xs[0]->tvec().log() * dEdf.tvec()).sum(); + dEdxi.t<0>().device(*dev.edevice) += (fx.tvec() * xs[0]->tvec().log() * dEdf.tvec()).sum(); } } CNN_NODE_INST_DEV_IMPL(Pow) diff --git a/cnn/nodes.h b/cnn/nodes.h index 4c63158cb..f85e81d15 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -451,7 +451,14 @@ struct Hinge : public Node { explicit Hinge(const std::initializer_list& a, unsigned e, real m = 1.0) : Node(a), element(e), pelement(&element), margin(m) {} explicit Hinge(const std::initializer_list& a, const unsigned* pe, real m = 1.0) : Node(a), element(), pelement(pe), margin(m) {} size_t aux_storage_size() const override; - CNN_NODE_DEFINE_DEV_IMPL() + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; unsigned element; const unsigned* pelement; real margin; @@ -485,15 +492,8 @@ struct MaxPooling1D : public Node { // y = x_1 * x_2 struct MatrixMultiply : public Node { explicit MatrixMultiply(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = x_1 \cdot x_2 (Hadamard product) @@ -513,15 +513,8 @@ struct CwiseQuotient : public Node { // y = x_1 \sum_{i=2, 4 ...} A_i * x_{i+1} struct AffineTransform : public Node { template explicit AffineTransform(const T& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = -x_1 From c63a248fe79afc1d9059196644c6da735f29af09 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 12 May 2016 19:30:15 +0900 Subject: [PATCH 493/965] Added device SelectRow and SelectCol operations --- cnn/nodes.cc | 108 +++++++++++++++++++++++---------------------------- cnn/nodes.h | 18 +-------- 2 files changed, 50 insertions(+), 76 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index f5123047a..6077ab3c0 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -248,66 +248,6 @@ void MatrixInverse::backward_impl(const vector& xs, #endif } -void SelectRows::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); -#ifdef HAVE_CUDA - throw std::runtime_error("SelectRows not yet implemented for CUDA"); -#else - auto x = **xs[0]; - auto y = *fx; - auto& rm = *prows; - for (unsigned i = 0; i < rm.size(); ++i) - y.row(i) = x.row(rm[i]); -#endif -} - -void SelectRows::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(xs.size() == 1); -#ifdef HAVE_CUDA - throw std::runtime_error("SelectRows not yet implemented for CUDA"); -#else - auto dEdx = *dEdxi; - auto d = *dEdf; - auto& rm = *prows; - for (unsigned i = 0; i < rm.size(); ++i) - dEdx.row(rm[i]) += d.row(i); -#endif -} - -void SelectCols::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); -#ifdef HAVE_CUDA - throw std::runtime_error("SelectCols not yet implemented for CUDA"); -#else - auto x = **xs[0]; - auto y = *fx; - auto& cm = *pcols; - for (unsigned i = 0; i < cm.size(); ++i) - y.col(i) = x.col(cm[i]); -#endif -} - -void SelectCols::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(xs.size() == 1); -#ifdef HAVE_CUDA - throw std::runtime_error("SelectCols not yet implemented for CUDA"); -#else - auto dEdx = *dEdxi; - auto d = *dEdf; - auto& cm = *pcols; - for (unsigned i = 0; i < cm.size(); ++i) - dEdx.col(cm[i]) += d.col(i); -#endif -} - void TraceOfProduct::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("TraceOfProduct not yet implemented for CUDA"); @@ -1895,6 +1835,54 @@ void Rectify::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(Rectify) +template +void SelectCols::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + auto& rm = *pcols; + for (unsigned i = 0; i < rm.size(); ++i) + fx.t<2>().chip<1>(i) = xs[0]->t<2>().chip<1>(rm[i]); + // fx.t<2>().device(*dev.edevice).chip<1>(i) = xs[0]->t<2>().chip<1>(rm[i]); +} + +template +void SelectCols::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(xs.size() == 1); + auto& rm = *pcols; + for (unsigned i = 0; i < rm.size(); ++i) + dEdxi.t<2>().chip<1>(rm[i]) = dEdf.t<2>().chip<1>(i); + // dEdxi.t<2>().device(*dev.edevice).chip<0>(rm[i]) = dEdf.t<2>().chip<0>(i); +} +CNN_NODE_INST_DEV_IMPL(SelectCols) + +template +void SelectRows::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + auto& rm = *prows; + for (unsigned i = 0; i < rm.size(); ++i) + fx.t<2>().chip<0>(i) = xs[0]->t<2>().chip<0>(rm[i]); + // fx.t<2>().device(*dev.edevice).chip<0>(i) = xs[0]->t<2>().chip<0>(rm[i]); +} + +template +void SelectRows::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(xs.size() == 1); + auto& rm = *prows; + for (unsigned i = 0; i < rm.size(); ++i) + dEdxi.t<2>().chip<0>(rm[i]) = dEdf.t<2>().chip<0>(i); + // dEdxi.t<2>().device(*dev.edevice).chip<0>(rm[i]) = dEdf.t<2>().chip<0>(i); +} +CNN_NODE_INST_DEV_IMPL(SelectRows) + template void SoftSign::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); diff --git a/cnn/nodes.h b/cnn/nodes.h index f85e81d15..c464e8dce 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -133,14 +133,7 @@ struct MatrixInverse : public Node { struct SelectRows : public Node { explicit SelectRows(const std::initializer_list& a, const std::vector& r) : Node(a), rows(r), prows(&rows) {} explicit SelectRows(const std::initializer_list& a, const std::vector* pr) : Node(a), prows(pr) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() std::vector rows; const std::vector* prows; }; @@ -150,14 +143,7 @@ struct SelectRows : public Node { struct SelectCols : public Node { explicit SelectCols(const std::initializer_list& a, const std::vector& c) : Node(a), cols(c), pcols(&cols) {} explicit SelectCols(const std::initializer_list& a, const std::vector* pc) : Node(a), pcols(pc) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() std::vector cols; const std::vector* pcols; }; From 80af622eaf5ec57fbd1e5eb5af3244379a96912f Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 12 May 2016 23:53:38 -0400 Subject: [PATCH 494/965] Fixed functors to work on CUDA --- cnn/functors.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cnn/functors.h b/cnn/functors.h index 2cb3e9dd7..aba196c80 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -33,14 +33,14 @@ struct FHuberForward { const float c; }; -template int sgn(T val) { - return (T(0) < val) - (val < T(0)); -} +// template int sgn(T val) { +// return ((T(0) < val) - (val < T(0))); +// } struct FL1Backward { FL1Backward(float d) : d(d) {} CNN_DEVICE_FUNC inline float operator()(float x) const { - return sgn(x) * d; + return ((0.f < x) - (x < 0.f)) * d; } const float d; }; @@ -49,7 +49,7 @@ struct FHuberBackward { FHuberBackward(float c, float dEdf) : c(c), d(dEdf) {} CNN_DEVICE_FUNC inline float operator()(float x) const { const float a = fabs(x); - return (2 * d) * ((a < c) ? x : c * sgn(x)); + return (2 * d) * ((a < c) ? x : c * ((0.f < x) - (x < 0.f))); } const float c; const float d; From 77a92d9f5f4fe811bd0a84d9bef33df4c3110ade Mon Sep 17 00:00:00 2001 From: dhg Date: Thu, 12 May 2016 23:43:54 -0700 Subject: [PATCH 495/965] Added error messages when empty lists are passed to PyCNN functions. Errors were previously more cryptic. --- pycnn/pycnn.pyx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index a8d3a3f33..5f5043aee 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -675,6 +675,7 @@ cpdef Expression block_dropout(Expression x, float p): return Expression.from_ce cpdef Expression reshape(Expression x, tuple d): return Expression.from_cexpr(x.cg_version, c_reshape(x.c(),Dim(d))) cpdef Expression esum(list xs): + assert xs, 'List is empty, nothing to esum.' cdef vector[CExpression] cvec cvec = vector[CExpression]() cdef Expression x @@ -685,6 +686,7 @@ cpdef Expression esum(list xs): return Expression.from_cexpr(x.cg_version, c_sum(cvec)) cpdef Expression average(list xs): + assert xs, 'List is empty, nothing to average.' cdef vector[CExpression] cvec cdef Expression x for x in xs: @@ -693,6 +695,7 @@ cpdef Expression average(list xs): return Expression.from_cexpr(x.cg_version, c_average(cvec)) cpdef Expression emax(list xs): + assert xs, 'List is empty, nothing to emax.' cdef Expression c cdef Expression x c = xs[0] @@ -704,6 +707,7 @@ cpdef Expression emax(list xs): #return Expression.from_cexpr(x.cg_version, c_max(cvec)) cpdef Expression concatenate_cols(list xs): + assert xs, 'List is empty, nothing to concatenate.' cdef vector[CExpression] cvec cdef Expression x for x in xs: @@ -712,6 +716,7 @@ cpdef Expression concatenate_cols(list xs): return Expression.from_cexpr(x.cg_version, c_concat_cols(cvec)) cpdef Expression concatenate(list xs): + assert xs, 'List is empty, nothing to concatenate.' cdef vector[CExpression] cvec cdef Expression x for x in xs: @@ -721,6 +726,7 @@ cpdef Expression concatenate(list xs): cpdef Expression affine_transform(list exprs): + assert xs, 'List input to affine_transform must not be empty.' cdef Expression e cdef vector[CExpression] ves for e in exprs: From de407e16afb3ab250973663131cb1bdecf1fc46c Mon Sep 17 00:00:00 2001 From: dhg Date: Fri, 13 May 2016 00:00:16 -0700 Subject: [PATCH 496/965] Minor fix to PyCNN's affine_transform error message. --- pycnn/pycnn.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 5f5043aee..ac9aba9ef 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -726,7 +726,7 @@ cpdef Expression concatenate(list xs): cpdef Expression affine_transform(list exprs): - assert xs, 'List input to affine_transform must not be empty.' + assert exprs, 'List input to affine_transform must not be empty.' cdef Expression e cdef vector[CExpression] ves for e in exprs: From 59aac83a3593648164927675adcb3a028543d626 Mon Sep 17 00:00:00 2001 From: Daniel Hershcovich Date: Tue, 24 May 2016 15:30:01 +0300 Subject: [PATCH 497/965] Fix typo in INSTALL.md --- INSTALL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/INSTALL.md b/INSTALL.md index 5936d0143..2f49a9828 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -134,7 +134,7 @@ make -j 4 To build a GPU version on a computer with CUDA: ```bash -cmake .. -DBACKEND=cuda -DCUDA_TOOLKIT_ROOT_DIR=/use/local/cuda-7.5/ +cmake .. -DBACKEND=cuda -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-7.5/ make -j 4 ``` From c9da75a175912e08afeabd1450c08cf109e6f276 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 27 May 2016 14:33:36 +0900 Subject: [PATCH 498/965] Generalize dropout to other RNNBuilders --- cnn/gru.cc | 3 +++ cnn/lstm.cc | 2 +- cnn/lstm.h | 5 ----- cnn/rnn.cc | 3 +++ cnn/rnn.h | 5 +++++ 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/cnn/gru.cc b/cnn/gru.cc index 44a8a4d0f..4fa9feab5 100644 --- a/cnn/gru.cc +++ b/cnn/gru.cc @@ -39,6 +39,7 @@ GRUBuilder::GRUBuilder(unsigned layers, vector ps = {p_x2z, p_h2z, p_bz, p_x2r, p_h2r, p_br, p_x2h, p_h2h, p_bh}; params.push_back(ps); } // layers + dropout_rate = 0.f; } void GRUBuilder::new_graph_impl(ComputationGraph& cg) { @@ -75,6 +76,8 @@ void GRUBuilder::start_new_sequence_impl(const std::vector& h_0) { } Expression GRUBuilder::add_input_impl(int prev, const Expression& x) { + if(dropout_rate != 0.f) + throw std::runtime_error("GRUBuilder doesn't support dropout yet"); const bool has_initial_state = (h0.size() > 0); h.push_back(vector(layers)); vector& ht = h.back(); diff --git a/cnn/lstm.cc b/cnn/lstm.cc index 57de9445f..eb5349515 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -42,7 +42,7 @@ LSTMBuilder::LSTMBuilder(unsigned layers, vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; params.push_back(ps); } // layers - dropout_rate = 0.0f; + dropout_rate = 0.f; } void LSTMBuilder::new_graph_impl(ComputationGraph& cg){ diff --git a/cnn/lstm.h b/cnn/lstm.h index f8e82ca0e..4f4ede5a0 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -18,10 +18,6 @@ struct LSTMBuilder : public RNNBuilder { unsigned hidden_dim, Model* model); - void set_dropout(float d) { dropout_rate = d; } - // in general, you should disable dropout at test time - void disable_dropout() { dropout_rate = 0; } - Expression back() const override { return (cur == -1? h0.back() : h[cur].back()); } std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } std::vector final_s() const override { @@ -63,7 +59,6 @@ struct LSTMBuilder : public RNNBuilder { std::vector h0; std::vector c0; unsigned layers; - float dropout_rate; private: friend class boost::serialization::access; diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 20745ecb0..cf1781c90 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -49,6 +49,7 @@ SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, params.push_back(ps); layer_input_dim = hidden_dim; } + dropout_rate = 0.f; } void SimpleRNNBuilder::new_graph_impl(ComputationGraph& cg) { @@ -79,6 +80,8 @@ void SimpleRNNBuilder::start_new_sequence_impl(const vector& h_0) { } Expression SimpleRNNBuilder::add_input_impl(int prev, const Expression &in) { + if(dropout_rate != 0.f) + throw std::runtime_error("SimpleRNNBuilder doesn't support dropout yet"); const unsigned t = h.size(); h.push_back(vector(layers)); diff --git a/cnn/rnn.h b/cnn/rnn.h index c6709e340..b85325a09 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -70,6 +70,10 @@ struct RNNBuilder { cur = head[cur]; } + // Set dropout. In general, you should disable dropout at test time + void set_dropout(float d) { dropout_rate = d; } + void disable_dropout() { dropout_rate = 0; } + // returns node (index) of most recent output virtual Expression back() const = 0; // access the final output of each hidden layer @@ -96,6 +100,7 @@ struct RNNBuilder { virtual void start_new_sequence_impl(const std::vector& h_0) = 0; virtual Expression add_input_impl(int prev, const Expression& x) = 0; RNNPointer cur; + float dropout_rate; private: // the state machine ensures that the caller is behaving RNNStateMachine sm; From 6461d8ea59862abea5d8e6718b846a632430afaf Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 28 May 2016 11:34:36 +0100 Subject: [PATCH 499/965] no backprop node --- cnn/expr.cc | 3 +++ cnn/expr.h | 4 ++++ cnn/nodes.cc | 13 +++++++++++++ cnn/nodes.h | 14 ++++++++++++++ examples/mlc.cc | 2 +- 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index 7f38b6fe4..8fa28d05d 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -25,6 +25,9 @@ Expression const_lookup(ComputationGraph& g, LookupParameters* p, const vector* pindices) { return Expression(&g, g.add_const_lookup(p, pindices)); } Expression zeroes(ComputationGraph& g, const Dim& d) { return Expression(&g, g.add_function(d)); } +// identity function, but derivative is not propagated through it +Expression nobackprop(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } + Expression operator-(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression operator+(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression operator+(real x, const Expression& y) { return Expression(y.pg, y.pg->add_function({y.i}, x)); } diff --git a/cnn/expr.h b/cnn/expr.h index 3e8a0b5d2..4ed6cc992 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -33,6 +33,10 @@ Expression const_lookup(ComputationGraph& g, LookupParameters* p, const std::vec Expression const_lookup(ComputationGraph& g, LookupParameters* p, const std::vector* pindices); Expression zeroes(ComputationGraph& g, const Dim& d); +// special functions for controlling flow of information in graph +Expression nobackprop(const Expression& x); + +// operators Expression operator-(const Expression& x); Expression operator+(const Expression& x, const Expression& y); Expression operator+(const Expression& x, real y); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 120d20f70..16f22b46c 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1287,6 +1287,19 @@ void Identity::backward_impl(const vector& xs, dEdxi.vec() += dEdf.vec(); } +void NoBackprop::forward_impl(const vector& xs, Tensor& fx) const { + fx.d = xs[0]->d; + fx.v = xs[0]->v; +} + +void NoBackprop::backward_impl(const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + // no op +} + void MaxPooling1D::forward_impl(const vector& xs, Tensor& fx) const { cerr << "FIX IMPL5\n"; abort(); #if 0 diff --git a/cnn/nodes.h b/cnn/nodes.h index 40411d52f..74edaf166 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -536,6 +536,20 @@ struct Hinge : public Node { real margin; }; +// y = x_1, but dy/dx is set to 0 +struct NoBackprop : public Node { + explicit NoBackprop(const std::initializer_list& a) : Node(a) {} + std::string as_string(const std::vector& arg_names) const override; + Dim dim_forward(const std::vector& xs) const override; + virtual bool supports_multibatch() const override { return true; } + void forward_impl(const std::vector& xs, Tensor& fx) const override; + void backward_impl(const std::vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const override; +}; + // y = x_1 struct Identity : public Node { explicit Identity(const std::initializer_list& a) : Node(a) {} diff --git a/examples/mlc.cc b/examples/mlc.cc index 111ac7def..9a3b3bde9 100644 --- a/examples/mlc.cc +++ b/examples/mlc.cc @@ -159,7 +159,7 @@ int main(int argc, char** argv) { Expression u = mlc.BuildPredictionScores(cg, xy.feats); if (rand01() < 0.004) { - sparsemax(u * 3.5); + sparsemax(u * 1.5); // this increases sparsity at test time, which Andre found the be useful vector p = as_vector(cg.incremental_forward()); for (unsigned j = 0; j < p.size(); ++j) if (p[j] > 0) cerr << j << ' '; From 781912fe4c5058f7695f82ce5ad479424285fde3 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sat, 28 May 2016 20:16:02 +0100 Subject: [PATCH 500/965] missing files --- cnn/nodes-common.cc | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 6a9650ad3..3f04fbf32 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -606,6 +606,17 @@ Dim Identity::dim_forward(const vector& xs) const { return xs[0]; } +string NoBackprop::as_string(const vector& arg_names) const { + ostringstream s; + s << "nobackprop(" << arg_names[0] << ')'; + return s.str(); +} + +Dim NoBackprop::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + return xs[0]; +} + string Softmax::as_string(const vector& arg_names) const { ostringstream s; s << "softmax(" << arg_names[0] << ')'; From 7b19adc684b69ac333729bd2dc7151b2dca52c65 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 29 May 2016 05:40:20 -0400 Subject: [PATCH 501/965] Made additional compilation macros for GPU --- cnn/functors.h | 15 +++++---------- cnn/nodes.cc | 22 ++++++++++++++++------ cnn/nodes.h | 44 +++++++++++++++++++++++++++++++++++++++----- 3 files changed, 60 insertions(+), 21 deletions(-) diff --git a/cnn/functors.h b/cnn/functors.h index aba196c80..d6018ea7c 100644 --- a/cnn/functors.h +++ b/cnn/functors.h @@ -181,16 +181,11 @@ struct FSoftmaxBackward { float off_diag_sum; }; -struct FLogGammaBackward { - CNN_DEVICE_FUNC inline float operator()(float x, float d) const { -#ifndef HAVE_CUDA - return boost::math::digamma(x) * d; -#else - assert(false); // Not supported on GPUs? - return 0; -#endif - } -}; +// struct FLogGammaBackward { +// CNN_DEVICE_FUNC inline float operator()(float x, float d) const { +// return boost::math::digamma(x) * d; +// } +// }; struct FNegLogSoftmaxBackward { FNegLogSoftmaxBackward(float lz, float err) : logz(lz), d(err) {} diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 6077ab3c0..d9e1c0b4f 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -41,6 +41,7 @@ using namespace std; // If the implementation is different for both devices, use #ifdef __CUDACC__ // within the function, and create alternative code paths for CPU and GPU implementations #ifdef __CUDACC__ +#define CNN_NODE_INST_NOGPU_IMPL(MyNode) #define CNN_NODE_INST_DEV_IMPL(MyNode) \ template void MyNode::forward_dev_impl(const Device_GPU & dev, const vector& xs, Tensor& fx) const; \ template void MyNode::backward_dev_impl(const Device_GPU & dev, \ @@ -50,6 +51,14 @@ using namespace std; unsigned i, \ Tensor& dEdxi) const; #else +#define CNN_NODE_INST_NOGPU_IMPL(MyNode) \ + template void MyNode::forward_dev_impl(const Device_CPU & dev, const vector& xs, Tensor& fx) const; \ + template void MyNode::backward_dev_impl(const Device_CPU & dev, \ + const vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const; #define CNN_NODE_INST_DEV_IMPL(MyNode) \ template void MyNode::forward_dev_impl(const Device_CPU & dev, const vector& xs, Tensor& fx) const; \ template void MyNode::backward_dev_impl(const Device_CPU & dev, \ @@ -1332,7 +1341,7 @@ void BlockDropout::backward_dev_impl(const MyDevice & dev, float block_multiplier = *(static_cast(aux_mem)); dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * block_multiplier; } -CNN_NODE_INST_DEV_IMPL(BlockDropout) +CNN_NODE_INST_NOGPU_IMPL(BlockDropout) template void ConstantMinusX::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1477,7 +1486,7 @@ void Dropout::backward_dev_impl(const MyDevice & dev, Tensor m(dim, (float*)aux_mem, fx.device); dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * m.tvec(); } -CNN_NODE_INST_DEV_IMPL(Dropout) +CNN_NODE_INST_NOGPU_IMPL(Dropout) template void Erf::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1527,7 +1536,7 @@ void GaussianNoise::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); } -CNN_NODE_INST_DEV_IMPL(GaussianNoise) +CNN_NODE_INST_NOGPU_IMPL(GaussianNoise) template void HuberDistance::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1610,7 +1619,8 @@ void LogGamma::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - dEdxi.tvec().device(*dev.edevice) += xs[0]->tvec().binaryExpr(dEdf.tvec(), FLogGammaBackward()); + // dEdxi.tvec().device(*dev.edevice) += xs[0]->tvec().binaryExpr(dEdf.tvec(), FLogGammaBackward()); + dEdxi.tvec().device(*dev.edevice) += xs[0]->tvec().digamma() * dEdf.tvec(); } CNN_NODE_INST_DEV_IMPL(LogGamma) @@ -1729,7 +1739,7 @@ void Max::backward_dev_impl(const MyDevice & dev, dEdxi.tvec().device(*dev.edevice) += t.tvec().binaryExpr(dEdf.tvec(), FMaxBackwardInv()); } } -CNN_NODE_INST_DEV_IMPL(Max) +CNN_NODE_INST_NOGPU_IMPL(Max) template void Min::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1753,7 +1763,7 @@ void Min::backward_dev_impl(const MyDevice & dev, dEdxi.tvec().device(*dev.edevice) += t.tvec().binaryExpr(dEdf.tvec(), FMaxBackwardInv()); } } -CNN_NODE_INST_DEV_IMPL(Min) +CNN_NODE_INST_NOGPU_IMPL(Min) template void Negate::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { diff --git a/cnn/nodes.h b/cnn/nodes.h index c464e8dce..8247a58a2 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -35,6 +35,34 @@ const Tensor& dEdf, \ unsigned i, \ Tensor& dEdxi) const; + +#define CNN_NODE_DEFINE_NOGPU_IMPL() \ + std::string as_string(const std::vector& arg_names) const override; \ + Dim dim_forward(const std::vector& xs) const override; \ + void forward_impl(const std::vector& xs, Tensor& fx) const override { \ + assert(fx.device); \ + if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ + else { throw std::runtime_error("No GPU implementation yet"); } \ + } \ + template \ + void forward_dev_impl(const MyDevice & dev, const std::vector& xs, Tensor& fx) const; \ + void backward_impl(const std::vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const override { \ + assert(fx.device); \ + if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ + else { throw std::runtime_error("No GPU implementation yet"); } \ + } \ + template \ + void backward_dev_impl( \ + const MyDevice & dev, \ + const std::vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const; #else #define CNN_NODE_DEFINE_DEV_IMPL() \ std::string as_string(const std::vector& arg_names) const override; \ @@ -63,6 +91,7 @@ const Tensor& dEdf, \ unsigned i, \ Tensor& dEdxi) const; +#define CNN_NODE_DEFINE_NOGPU_IMPL() CNN_NODE_DEFINE_DEV_IMPL() #endif namespace cnn { @@ -160,7 +189,8 @@ struct Min : public Node { explicit Min(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; - CNN_NODE_DEFINE_DEV_IMPL() + // TODO: GPU implementations confirmed to break, debug + CNN_NODE_DEFINE_NOGPU_IMPL() }; // y = max{x_1, x_2} @@ -168,7 +198,8 @@ struct Max : public Node { template explicit Max(const T& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; - CNN_NODE_DEFINE_DEV_IMPL() + // TODO: GPU implementations confirmed to break, debug + CNN_NODE_DEFINE_NOGPU_IMPL() }; // y = Tr(x_1 * x_2^T) @@ -295,7 +326,8 @@ struct GaussianNoise : public Node { explicit GaussianNoise(const std::initializer_list& a, real stddev) : Node(a), stddev(stddev) {} virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; - CNN_NODE_DEFINE_DEV_IMPL() + // TODO: GPU implementations confirmed to break, debug + CNN_NODE_DEFINE_NOGPU_IMPL() real stddev; }; @@ -304,7 +336,8 @@ struct Dropout : public Node { explicit Dropout(const std::initializer_list& a, real p) : Node(a), p(p) {} size_t aux_storage_size() const override; virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + // TODO: GPU implementations confirmed to break, debug + CNN_NODE_DEFINE_NOGPU_IMPL() real p; }; @@ -312,7 +345,8 @@ struct Dropout : public Node { struct BlockDropout : public Node { explicit BlockDropout(const std::initializer_list& a, real p) : Node(a), dropout_probability(p) {} size_t aux_storage_size() const override; - CNN_NODE_DEFINE_DEV_IMPL() + // TODO: GPU implementations probably will break + CNN_NODE_DEFINE_NOGPU_IMPL() real dropout_probability; }; From 73d3a430748f4d9a1d59d5098c4de19b0f5671df Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 30 May 2016 01:23:04 -0400 Subject: [PATCH 502/965] Fixed linker error caused by macro order --- cnn/nodes.cc | 10 +++++----- cnn/nodes.h | 17 ++++++----------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index d9e1c0b4f..93bcc2e87 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1341,7 +1341,7 @@ void BlockDropout::backward_dev_impl(const MyDevice & dev, float block_multiplier = *(static_cast(aux_mem)); dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * block_multiplier; } -CNN_NODE_INST_NOGPU_IMPL(BlockDropout) +CNN_NODE_INST_DEV_IMPL(BlockDropout) template void ConstantMinusX::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1486,7 +1486,7 @@ void Dropout::backward_dev_impl(const MyDevice & dev, Tensor m(dim, (float*)aux_mem, fx.device); dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * m.tvec(); } -CNN_NODE_INST_NOGPU_IMPL(Dropout) +CNN_NODE_INST_DEV_IMPL(Dropout) template void Erf::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1536,7 +1536,7 @@ void GaussianNoise::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); } -CNN_NODE_INST_NOGPU_IMPL(GaussianNoise) +CNN_NODE_INST_DEV_IMPL(GaussianNoise) template void HuberDistance::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1739,7 +1739,7 @@ void Max::backward_dev_impl(const MyDevice & dev, dEdxi.tvec().device(*dev.edevice) += t.tvec().binaryExpr(dEdf.tvec(), FMaxBackwardInv()); } } -CNN_NODE_INST_NOGPU_IMPL(Max) +CNN_NODE_INST_DEV_IMPL(Max) template void Min::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1763,7 +1763,7 @@ void Min::backward_dev_impl(const MyDevice & dev, dEdxi.tvec().device(*dev.edevice) += t.tvec().binaryExpr(dEdf.tvec(), FMaxBackwardInv()); } } -CNN_NODE_INST_NOGPU_IMPL(Min) +CNN_NODE_INST_DEV_IMPL(Min) template void Negate::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { diff --git a/cnn/nodes.h b/cnn/nodes.h index 8247a58a2..2937e15a7 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -187,19 +187,17 @@ struct Pow : public Node { // y = min{x_1, x_2} struct Min : public Node { explicit Min(const std::initializer_list& a) : Node(a) {} + CNN_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; - // TODO: GPU implementations confirmed to break, debug - CNN_NODE_DEFINE_NOGPU_IMPL() }; // y = max{x_1, x_2} struct Max : public Node { template explicit Max(const T& a) : Node(a) {} + CNN_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; - // TODO: GPU implementations confirmed to break, debug - CNN_NODE_DEFINE_NOGPU_IMPL() }; // y = Tr(x_1 * x_2^T) @@ -324,29 +322,26 @@ struct InnerProduct3D_1D_1D : public Node { // y = x + n struct GaussianNoise : public Node { explicit GaussianNoise(const std::initializer_list& a, real stddev) : Node(a), stddev(stddev) {} - virtual bool supports_multibatch() const override { return true; } + CNN_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; - // TODO: GPU implementations confirmed to break, debug - CNN_NODE_DEFINE_NOGPU_IMPL() + virtual bool supports_multibatch() const override { return true; } real stddev; }; // y = dropout(x,p) where p specifies the dropout probability struct Dropout : public Node { explicit Dropout(const std::initializer_list& a, real p) : Node(a), p(p) {} + CNN_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; virtual bool supports_multibatch() const override { return true; } - // TODO: GPU implementations confirmed to break, debug - CNN_NODE_DEFINE_NOGPU_IMPL() real p; }; // y = block_dropout(x,p) where p specifies the probability for dropping-out the entire block struct BlockDropout : public Node { explicit BlockDropout(const std::initializer_list& a, real p) : Node(a), dropout_probability(p) {} + CNN_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; - // TODO: GPU implementations probably will break - CNN_NODE_DEFINE_NOGPU_IMPL() real dropout_probability; }; From 6e86a860953ae0b2a99fbd088e7c884e3ea40966 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 30 May 2016 16:20:12 +0900 Subject: [PATCH 503/965] Added switches for sparsemax, inverse --- cnn/nodes.cc | 378 ++++++++++++++++++++++---------------------- cnn/nodes.h | 36 +---- tests/test-nodes.cc | 45 +++++- 3 files changed, 237 insertions(+), 222 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 93bcc2e87..7469440a9 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -98,165 +98,6 @@ void AddVectorToAllColumns::backward_impl(const vector& xs, } } -size_t Sparsemax::aux_storage_size() const { - return (dim.size() + 1) * sizeof(float); -} - -void Sparsemax::forward_impl(const vector& xs, Tensor& fx) const { - if (xs[0]->d.cols() == 1) { -#if HAVE_CUDA - throw std::runtime_error("Sparsemax not implemented on GPU"); -#else - const unsigned rows = xs[0]->d.rows(); - float *zs = static_cast(aux_mem); - std::partial_sort_copy(xs[0]->v, xs[0]->v+rows, zs, zs + rows, std::greater()); - float sum = 0, maxsum = 0; - unsigned k = 0; - for (k = 0; k < rows; ++k) { - sum += zs[k]; - float t = 1 + (k + 1) * zs[k]; - if (t <= sum) break; - maxsum = sum; - } - float tau = (maxsum - 1) / k; - auto x = **xs[0]; - auto y = *fx; - y = (x - Eigen::MatrixXf::Ones(rows, 1)*tau).cwiseMax(0.f); - int c = 1; - int *cc = static_cast(aux_mem); - for (unsigned i = 0; i < rows; ++i) - if (y(i,0) > 0.f) cc[c++] = i; - cc[0] = c - 1; -#endif - } else { - throw std::runtime_error("Sparsemax not yet implemented for multiple columns"); - } -} - -void Sparsemax::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#if HAVE_CUDA - throw std::runtime_error("Sparsemax not implemented on GPU"); -#else - const int ssize = static_cast(aux_mem)[0]; - int *support = static_cast(aux_mem) + 1; - float dhat = 0; - auto& d = *dEdf; - for (int i = 0; i < ssize; ++i) - dhat += d(support[i], 0); - dhat /= ssize; - for (int i = 0; i < ssize; ++i) - (*dEdxi)(support[i], 0) += d(support[i], 0) - dhat; -#endif -} - -#define MAX_SPARSEMAX_LOSS_ROWS 65536 - -size_t SparsemaxLoss::aux_storage_size() const { - // first dim.size dimensions is the sparsemax - const unsigned rows = MAX_SPARSEMAX_LOSS_ROWS; // this should be xs[0]->d.rows() - return rows * sizeof(float); -} - -void SparsemaxLoss::forward_impl(const vector& xs, Tensor& fx) const { - if (xs[0]->d.cols() == 1) { -#if HAVE_CUDA - throw std::runtime_error("SparsemaxLoss not implemented on GPU"); -#else - const int rows = xs[0]->d.rows(); - if (rows > MAX_SPARSEMAX_LOSS_ROWS) { - cerr << "MAX_SPARSEMAX_LOSS_ROWS is not sufficient. Recompile with larger value.\n"; - abort(); - } - float& y = fx.v[0]; // loss - const unsigned qsupport_size = pq->size(); - const float qprop = 1.f / qsupport_size; - - float *zs = static_cast(aux_mem); - std::partial_sort_copy(xs[0]->v, xs[0]->v+rows, zs, zs + rows, std::greater()); - float sum = 0, maxsum = 0; - unsigned k = 0; - for (k = 0; k < rows; ++k) { - sum += zs[k]; - float t = 1 + (k + 1) * zs[k]; - if (t <= sum) break; - maxsum = sum; - } - float tau = (maxsum - 1) / k; - Tensor tsm(xs[0]->d, (float*)aux_mem, xs[0]->device); - auto x = **xs[0]; - auto sm = *tsm; - sm = (x - Eigen::MatrixXf::Ones(rows, 1)*tau).cwiseMax(0.f); - //cerr << "SpM: " << (sm).transpose() << " |||"; - //for (unsigned i = 0; i < pq->size(); ++i) cerr << ' ' << (*pq)[i]; - //cerr << endl; - y = 0; - float tau_sq = tau * tau; - for (unsigned i = 0; i < rows; ++i) { - if (sm(i, 0)) { - const float x_s = x(i, 0); - y += x_s * x_s - tau_sq; - } - } - y /= 2; - y += qprop * qprop * qsupport_size / 2; - for (unsigned i = 0; i < qsupport_size; ++i) - y -= qprop * x((*pq)[i], 0); - if (y < 0) y = 0; -#endif - } else { - throw std::runtime_error("SparsemaxLoss not yet implemented for multiple columns"); - } -} - -void SparsemaxLoss::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#if HAVE_CUDA - throw std::runtime_error("SparsemaxLoss not implemented on GPU"); -#else - const float d = dEdf.v[0]; - float* psm = static_cast(aux_mem); - float dqprop = d / pq->size(); - Tensor tsm(xs[0]->d, psm, xs[0]->device); - auto sm = *tsm; // sparsemax(z) - *dEdxi += sm * d; - for (unsigned i = 0; i < pq->size(); ++i) - (*dEdxi)((*pq)[i], 0) -= dqprop; -#endif -} - -void MatrixInverse::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); -#ifdef HAVE_CUDA - throw std::runtime_error("MatrixInverse not yet implemented for CUDA"); -#else - auto x = **xs[0]; - auto y = *fx; - y = x.inverse(); -#endif -} - -void MatrixInverse::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(xs.size() == 1); -#ifdef HAVE_CUDA - throw std::runtime_error("MatrixInverse not yet implemented for CUDA"); -#else - auto d = *dEdf; - auto y = *fx; - (*dEdxi) -= y * d * y; -#endif -} - void TraceOfProduct::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("TraceOfProduct not yet implemented for CUDA"); @@ -1112,32 +953,6 @@ void PickRange::backward_impl(const vector& xs, #endif } -void PoissonRegressionLoss::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("PoissonRegressionLoss not yet implemented for CUDA"); -#else - const auto y = *pty; - const auto z = lgamma(y + 1); - const auto x = as_scalar(*xs[0]); - fx.v[0] = expf(x) + z - y * x; -#endif -} - -void PoissonRegressionLoss::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("PoissonRegressionLoss not yet implemented for CUDA"); -#else - const auto x = xs[0]->v[0]; - const auto y = *pty; - auto& dEdx = dEdxi.v[0]; - dEdx += expf(x) - y; -#endif -} - // ===== Auxiliary functions size_t BlockDropout::aux_storage_size() const { @@ -1161,6 +976,18 @@ size_t Min::aux_storage_size() const { return dim.size() * sizeof(float); } +size_t Sparsemax::aux_storage_size() const { + return (dim.size() + 1) * sizeof(float); +} + +#define MAX_SPARSEMAX_LOSS_ROWS 65536 + +size_t SparsemaxLoss::aux_storage_size() const { + // first dim.size dimensions is the sparsemax + const unsigned rows = MAX_SPARSEMAX_LOSS_ROWS; // this should be xs[0]->d.rows() + return rows * sizeof(float); +} + #endif // Finish CPU only functions // ===== Functions to be compiled on both CPU and GPU @@ -1641,6 +1468,38 @@ void LogisticSigmoid::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(LogisticSigmoid) +template +void MatrixInverse::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); +#ifdef __CUDACC__ + throw std::runtime_error("MatrixInverse not yet implemented for CUDA"); +#else + auto x = **xs[0]; + auto y = *fx; + y = x.inverse(); +#endif + // TODO: Change into tensors after resolving test errors + // fx.t<2>().device(*dev.edevice) = xs[0]->t<2>().inverse(); +} + +template +void MatrixInverse::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(xs.size() == 1); +#ifdef __CUDACC__ + throw std::runtime_error("MatrixInverse not yet implemented for CUDA"); +#else + auto d = *dEdf; + auto y = *fx; + (*dEdxi) -= y * d * y; +#endif +} +CNN_NODE_INST_DEV_IMPL(MatrixInverse) + template void MatrixMultiply::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 2); @@ -1803,6 +1662,26 @@ void PairwiseRankLoss::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(PairwiseRankLoss) +template +void PoissonRegressionLoss::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + const real y = *pty; + const auto z = lgamma(y + 1); + // const auto x = as_scalar(*xs[0]); + fx.t<0>().device(*dev.edevice) = xs[0]->t<0>().exp() + z - xs[0]->t<0>() * y; +} + +template +void PoissonRegressionLoss::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + const real y = *pty; + dEdxi.t<0>().device(*dev.edevice) += xs[0]->t<0>().exp() - y; +} +CNN_NODE_INST_DEV_IMPL(PoissonRegressionLoss) + template void Pow::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 2); @@ -1910,6 +1789,135 @@ void SoftSign::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(SoftSign) +template +void Sparsemax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + if (xs[0]->d.cols() == 1) { +#ifdef __CUDACC__ + throw std::runtime_error("Sparsemax not implemented on GPU"); +#else + const unsigned rows = xs[0]->d.rows(); + float *zs = static_cast(aux_mem); + std::partial_sort_copy(xs[0]->v, xs[0]->v+rows, zs, zs + rows, std::greater()); + float sum = 0, maxsum = 0; + unsigned k = 0; + for (k = 0; k < rows; ++k) { + sum += zs[k]; + float t = 1 + (k + 1) * zs[k]; + if (t <= sum) break; + maxsum = sum; + } + float tau = (maxsum - 1) / k; + auto x = **xs[0]; + auto y = *fx; + y = (x - Eigen::MatrixXf::Ones(rows, 1)*tau).cwiseMax(0.f); + int c = 1; + int *cc = static_cast(aux_mem); + for (unsigned i = 0; i < rows; ++i) + if (y(i,0) > 0.f) cc[c++] = i; + cc[0] = c - 1; +#endif + } else { + throw std::runtime_error("Sparsemax not yet implemented for multiple columns"); + } +} + +template +void Sparsemax::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { +#ifdef __CUDACC__ + throw std::runtime_error("Sparsemax not implemented on GPU"); +#else + const int ssize = static_cast(aux_mem)[0]; + int *support = static_cast(aux_mem) + 1; + float dhat = 0; + auto& d = *dEdf; + for (int i = 0; i < ssize; ++i) + dhat += d(support[i], 0); + dhat /= ssize; + for (int i = 0; i < ssize; ++i) + (*dEdxi)(support[i], 0) += d(support[i], 0) - dhat; +#endif +} +CNN_NODE_INST_DEV_IMPL(Sparsemax) + +template +void SparsemaxLoss::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + if (xs[0]->d.cols() == 1) { +#ifdef __CUDACC__ + throw std::runtime_error("SparsemaxLoss not implemented on GPU"); +#else + const int rows = xs[0]->d.rows(); + if (rows > MAX_SPARSEMAX_LOSS_ROWS) { + cerr << "MAX_SPARSEMAX_LOSS_ROWS is not sufficient. Recompile with larger value.\n"; + abort(); + } + float& y = fx.v[0]; // loss + const unsigned qsupport_size = pq->size(); + const float qprop = 1.f / qsupport_size; + + float *zs = static_cast(aux_mem); + std::partial_sort_copy(xs[0]->v, xs[0]->v+rows, zs, zs + rows, std::greater()); + float sum = 0, maxsum = 0; + unsigned k = 0; + for (k = 0; k < rows; ++k) { + sum += zs[k]; + float t = 1 + (k + 1) * zs[k]; + if (t <= sum) break; + maxsum = sum; + } + float tau = (maxsum - 1) / k; + Tensor tsm(xs[0]->d, (float*)aux_mem, xs[0]->device); + auto x = **xs[0]; + auto sm = *tsm; + sm = (x - Eigen::MatrixXf::Ones(rows, 1)*tau).cwiseMax(0.f); + //cerr << "SpM: " << (sm).transpose() << " |||"; + //for (unsigned i = 0; i < pq->size(); ++i) cerr << ' ' << (*pq)[i]; + //cerr << endl; + y = 0; + float tau_sq = tau * tau; + for (unsigned i = 0; i < rows; ++i) { + if (sm(i, 0)) { + const float x_s = x(i, 0); + y += x_s * x_s - tau_sq; + } + } + y /= 2; + y += qprop * qprop * qsupport_size / 2; + for (unsigned i = 0; i < qsupport_size; ++i) + y -= qprop * x((*pq)[i], 0); + if (y < 0) y = 0; +#endif + } else { + throw std::runtime_error("SparsemaxLoss not yet implemented for multiple columns"); + } +} + +template +void SparsemaxLoss::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { +#ifdef __CUDACC__ + throw std::runtime_error("SparsemaxLoss not implemented on GPU"); +#else + const float d = dEdf.v[0]; + float* psm = static_cast(aux_mem); + float dqprop = d / pq->size(); + Tensor tsm(xs[0]->d, psm, xs[0]->device); + auto sm = *tsm; // sparsemax(z) + *dEdxi += sm * d; + for (unsigned i = 0; i < pq->size(); ++i) + (*dEdxi)((*pq)[i], 0) -= dqprop; +#endif +} +CNN_NODE_INST_DEV_IMPL(SparsemaxLoss) + template void Square::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { fx.tvec().device(*dev.edevice) = xs[0]->tvec().square(); diff --git a/cnn/nodes.h b/cnn/nodes.h index 2937e15a7..b3c5604f9 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -115,15 +115,8 @@ struct AddVectorToAllColumns : public Node { struct SparsemaxLoss : public Node { explicit SparsemaxLoss(const std::initializer_list& a, const std::vector& target) : Node(a), q(target), pq(&q) {} explicit SparsemaxLoss(const std::initializer_list& a, const std::vector* ptarget) : Node(a), q(), pq(ptarget) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; + CNN_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; const std::vector q; const std::vector* pq; }; @@ -132,29 +125,15 @@ struct SparsemaxLoss : public Node { // y = arg min_y ||y - x||^2 struct Sparsemax : public Node { explicit Sparsemax(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; + CNN_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; }; // y = inv(x) // x = an invertible matrix struct MatrixInverse : public Node { explicit MatrixInverse(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = select_rows(x, rows) @@ -638,14 +617,7 @@ struct Average : public Node { struct PoissonRegressionLoss : public Node { explicit PoissonRegressionLoss(const std::initializer_list& a, unsigned true_y) : Node(a), ty(true_y), pty(&ty) {} explicit PoissonRegressionLoss(const std::initializer_list& a, const unsigned* ptrue_y) : Node(a), ty(), pty(ptrue_y) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() private: unsigned ty; const unsigned* pty; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 0ab557c9c..7d9817003 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -31,6 +31,7 @@ struct NodeTest { std::vector param3_vals = {1.1f,2.2f,3.3f}; std::vector param_scalar1_vals = {2.2f}; std::vector param_scalar2_vals = {1.1f}; + std::vector param_square1_vals = {1.1f,2.2f,3.3f,1.2f,2.2f,3.2f,1.3f,2.3f,3.3f}; param1 = mod.add_parameters({3}); TensorTools::SetElements(param1.get()->values,param1_vals); param2 = mod.add_parameters({3}); @@ -41,6 +42,8 @@ struct NodeTest { TensorTools::SetElements(param_scalar1.get()->values,param_scalar1_vals); param_scalar2 = mod.add_parameters({1}); TensorTools::SetElements(param_scalar2.get()->values,param_scalar2_vals); + param_square1 = mod.add_parameters({3,3}); + TensorTools::SetElements(param_square1.get()->values,param_square1_vals); } ~NodeTest() { for (auto x : av) free(x); @@ -58,7 +61,7 @@ struct NodeTest { std::vector ones3_vals, ones2_vals, first_one_vals, batch_vals; std::vector av; cnn::Model mod; - cnn::Parameter param1, param2, param3, param_scalar1, param_scalar2; + cnn::Parameter param1, param2, param3, param_scalar1, param_scalar2, param_square1; }; // define the test suite @@ -390,6 +393,24 @@ BOOST_AUTO_TEST_CASE( softmax_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression sparsemax(const Expression& x); +BOOST_AUTO_TEST_CASE( sparsemax_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression y = sparsemax(x1); + input(cg, {1,3}, first_one_vals) * y; + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression sparsemax_loss(const Expression& x); +BOOST_AUTO_TEST_CASE( sparsemax_loss_gradient ) { + std::vector idxs(2); idxs[0] = 1; idxs[1] = 2; + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + sparsemax_loss(x1, idxs); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression softsign(const Expression& x); BOOST_AUTO_TEST_CASE( softsign_gradient ) { cnn::ComputationGraph cg; @@ -449,8 +470,8 @@ BOOST_AUTO_TEST_CASE( max_gradient ) { // BOOST_CHECK(CheckGrad(mod, cg, 0)); // } +// TODO: Dropout scales the gradients at training time, so they don't match. // Expression block_dropout(const Expression& x, real p); -// TODO // Expression reshape(const Expression& x, const Dim& d); BOOST_AUTO_TEST_CASE( reshape_gradient ) { @@ -470,6 +491,15 @@ BOOST_AUTO_TEST_CASE( transpose_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression trace_of_product(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( inverse_gradient ) { + cnn::ComputationGraph cg; + Expression x = parameter(cg, param_square1); + Expression y = inverse(x); + input(cg, {1,3}, ones3_vals) * y * input(cg, {3,1}, ones3_vals); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression trace_of_product(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( trace_of_product_gradient ) { cnn::ComputationGraph cg; @@ -543,10 +573,15 @@ BOOST_AUTO_TEST_CASE( pairwise_rank_loss_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } -// TODO: These are all unimplemented // Expression poisson_loss(const Expression& x, unsigned y); -// Expression poisson_loss(const Expression& x, const unsigned* py); -// +BOOST_AUTO_TEST_CASE( possion_loss_gradient ) { + cnn::ComputationGraph cg; + Expression scalar = parameter(cg, param_scalar1); + poisson_loss(scalar, 3); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// TODO: These are all unimplemented // Expression conv1d_narrow(const Expression& x, const Expression& f); // Expression conv1d_wide(const Expression& x, const Expression& f); // Expression kmax_pooling(const Expression& x, unsigned k); From d73fbd9d4964d04feaecc48b1a0766d7ce029df7 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 30 May 2016 21:43:18 +0900 Subject: [PATCH 504/965] GPU-friendly implementations of several functions --- cnn/nodes.cc | 490 +++++++++++++++++++++++++++------------------------ cnn/nodes.h | 46 +---- 2 files changed, 260 insertions(+), 276 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 7469440a9..5a6d786c1 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -402,98 +402,6 @@ void LogDet::backward_impl(const vector& xs, (*dEdxi) += (dEdf.v[0]) * trans.inverse(); } -void Sum::forward_impl(const vector& xs, Tensor& fx) const { - const unsigned num_args = xs.size(); - if (num_args == 1) { - fx.v = xs[0]->v; - return; - } -#if HAVE_CUDA - TensorTools::Zero(fx); - for (unsigned i = 0; i < num_args; ++i) - CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[i]->v, 1, fx.v, 1)); -#else - auto res = fx.vec(); - const unsigned remainder = num_args % 4; - switch (remainder) { - case 0: res.setZero(); break; - case 1: res = xs[0]->vec(); break; - case 2: res = xs[0]->vec() + xs[1]->vec(); break; - case 3: res = xs[0]->vec() + xs[1]->vec() + xs[2]->vec(); break; - } - for (unsigned i = remainder; i < num_args; i += 4) - res += xs[i]->vec() + xs[i+1]->vec() + xs[i+2]->vec() + xs[i+3]->vec(); -#endif -} - -void Sum::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - -#if HAVE_CUDA - CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); -#else - dEdxi.vec() += dEdf.vec(); -#endif -} - -void SumBatches::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); - unsigned num_args = xs[0]->d.bd; -#if HAVE_CUDA - TensorTools::Zero(fx); - for (unsigned i = 0; i < num_args; ++i) - CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v + i * xs[0]->d.batch_size(), 1, fx.v, 1)); -#else - auto res = *fx; - const unsigned remainder = num_args % 4; - switch (remainder) { - case 0: res.setZero(); break; - case 1: res = xs[0]->batch_matrix(0); break; - case 2: res = xs[0]->batch_matrix(0) + xs[0]->batch_matrix(1); break; - case 3: res = xs[0]->batch_matrix(0) + xs[0]->batch_matrix(1) + xs[0]->batch_matrix(2); break; - } - for (unsigned i = remainder; i < num_args; i += 4) - res += xs[0]->batch_matrix(i) + xs[0]->batch_matrix(i+1) + xs[0]->batch_matrix(i+2) + xs[0]->batch_matrix(i+3); -#endif -} - -void SumBatches::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i == 0); -#if HAVE_CUDA - for (unsigned i = 0; i < dEdxi.d.bd; ++i) - CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v + i * dEdxi.d.batch_size(), 1)); -#else - for (unsigned i = 0; i < dEdxi.d.bd; ++i) - dEdxi.batch_matrix(i) += *dEdf; -#endif -} - -void Average::forward_impl(const vector& xs, Tensor& fx) const { - const unsigned num_args = xs.size(); - if (num_args == 1) { - fx.v = xs[0]->v; - return; - } - auto res = fx.vec(); - const unsigned remainder = num_args % 4; - switch (remainder) { - case 0: res.setZero(); break; - case 1: res = xs[0]->vec(); break; - case 2: res = xs[0]->vec() + xs[1]->vec(); break; - case 3: res = xs[0]->vec() + xs[1]->vec() + xs[2]->vec(); break; - } - for (unsigned i = remainder; i < num_args; i += 4) - res += xs[i]->vec() + xs[i+1]->vec() + xs[i+2]->vec() + xs[i+3]->vec(); - res /= num_args; -} - void Average::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, @@ -678,149 +586,6 @@ void MaxPooling1D::backward_impl(const vector& xs, #endif } -void Softmax::forward_impl(const vector& xs, Tensor& fx) const { - if (xs[0]->d.cols() == 1) { -#if HAVE_CUDA - gpu::softmax(xs[0]->d.size(), xs[0]->v, fx.v); -#else - auto x = **xs[0]; - if (x.rows() == 1) { - fx.v[0] = 1; - } else { - *fx = x.unaryExpr(FSoftmaxNormalize(logsumexp(x))); - } -#endif - } else { - throw std::runtime_error("Softmax not yet implemented for multiple columns"); - } -} - -void Softmax::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#if HAVE_CUDA - gpu::softmax_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); -#else - auto y = *fx; - if (y.rows() == 1) { return; } // no error if softmax = 0 - float off_diag_sum = -y.cwiseProduct(*dEdf).sum(); - *dEdxi += y.binaryExpr(*dEdf, FSoftmaxBackward(off_diag_sum)); -#endif -} - -void PickNegLogSoftmax::forward_impl(const vector& xs, Tensor& fx) const { - if (xs[0]->d.cols() == 1) { - logz = (float*)device->fxs->allocate(sizeof(float)*fx.d.batch_elems()); -#if HAVE_CUDA - if(pval) { - gpu::pnlsoftmax(xs[0]->d.size(), *pval, xs[0]->v, fx.v, logz); - } else { - // TODO: It'd be nice to have a kernel that did all batches at once - assert(pvals); - assert(pvals->size() == fx.d.batch_elems()); - for(unsigned b = 0; b < pvals->size(); ++b) - gpu::pnlsoftmax(xs[0]->d.batch_size(), (*pvals)[b], xs[0]->batch_ptr(b), fx.v+b, logz+b); - } -#else - if(pval) { - auto x = **xs[0]; - *logz = logsumexp(x); - fx.v[0] = *logz - x(*pval); - } else { - assert(pvals); - assert(pvals->size() == fx.d.batch_elems()); - for(unsigned b = 0; b < pvals->size(); ++b) { - auto x = xs[0]->batch_matrix(b); - logz[b] = logsumexp(x); - fx.v[b] = logz[b] - x((*pvals)[b]); - } - } -#endif - } else { - throw std::runtime_error("PickNegLogSoftmax::forward not yet implemented for multiple columns"); - } -} - -void PickNegLogSoftmax::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - if (xs[0]->d.cols() == 1) { -#if HAVE_CUDA - if(pval) { - const auto elem = *pval; - gpu::pnlsoftmax_backward(dEdxi.d.size(), elem, xs[0]->v, dEdf.v, logz, dEdxi.v); - } else { - assert(pvals); - assert(pvals->size() == fx.d.batch_elems()); - // TODO: Again, it would be nice to do this with a single kernel - for(unsigned b = 0; b < pvals->size(); ++b) { - const auto elem = (*pvals)[b]; - gpu::pnlsoftmax_backward(dEdxi.d.batch_size(), elem, xs[0]->batch_ptr(b), dEdf.v+b, logz+b, dEdxi.batch_ptr(b)); - } - } -#else - if(pval) { - const auto elem = *pval; - const float err = dEdf.v[0]; - auto x = **xs[0]; - // logz is computed in the forward pass and cached - *dEdxi += x.unaryExpr(FNegLogSoftmaxBackward(*logz, err)); - //*dEdxi += x.unaryExpr(scalar_nlsoftmax_backward_op(*logz, err)); - (*dEdxi)(elem) -= err; - } else { - assert(pvals); - assert(pvals->size() == fx.d.batch_elems()); - for(unsigned b = 0; b < pvals->size(); ++b) { - const auto elem = (*pvals)[b]; - const float err = dEdf.v[b]; - auto x = xs[0]->batch_matrix(b); - auto dEdxi_mat = dEdxi.batch_matrix(b); - dEdxi_mat += x.unaryExpr(FNegLogSoftmaxBackward(logz[b], err)); - //dEdxi_mat += x.unaryExpr(scalar_nlsoftmax_backward_op(logz[b], err)); - dEdxi_mat(elem) -= err; - } - } -#endif - } else { - throw std::runtime_error("PickNegLogSoftmax::backward not yet implemented for multiple columns"); - } -} - -void LogSoftmax::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); - if (xs[0]->d.cols() == 1) { -#if HAVE_CUDA - throw std::runtime_error("LogSoftmax::forward not yet implemented for CUDA"); -#else - auto x = **xs[0]; - *fx = x.unaryExpr(FLogSoftmaxNormalize(logsumexp(x))); -#endif - } else { - throw std::runtime_error("LogSoftmax::forward not yet implemented for multiple columns"); - } -} - -void LogSoftmax::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - if (xs[0]->d.cols() == 1) { -#if HAVE_CUDA - throw std::runtime_error("LogSoftmax::backward not yet implemented for CUDA"); -#else - float off_diag_sum = -(*fx).binaryExpr(*dEdf, FWeightedError()).sum(); - *dEdxi += (*fx).binaryExpr(*dEdf, FLogSoftmaxBackward(off_diag_sum)); -#endif - } else { - throw std::runtime_error("LogSoftmax::backward not yet implemented for multiple columns"); - } -} - template EIGEN_STRONG_INLINE real logsumexp(const T& x, const vector& denom) { real m = x(denom[0],0); @@ -1468,6 +1233,41 @@ void LogisticSigmoid::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(LogisticSigmoid) +template +void LogSoftmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + if (xs[0]->d.cols() == 1) { +#if __CUDACC__ + throw std::runtime_error("LogSoftmax::forward not yet implemented for CUDA"); +#else + auto x = **xs[0]; + *fx = x.unaryExpr(FLogSoftmaxNormalize(logsumexp(x))); +#endif + } else { + throw std::runtime_error("LogSoftmax::forward not yet implemented for multiple columns"); + } +} + +template +void LogSoftmax::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + if (xs[0]->d.cols() == 1) { +#if __CUDACC__ + throw std::runtime_error("LogSoftmax::backward not yet implemented for CUDA"); +#else + float off_diag_sum = -(*fx).binaryExpr(*dEdf, FWeightedError()).sum(); + *dEdxi += (*fx).binaryExpr(*dEdf, FLogSoftmaxBackward(off_diag_sum)); +#endif + } else { + throw std::runtime_error("LogSoftmax::backward not yet implemented for multiple columns"); + } +} +CNN_NODE_INST_DEV_IMPL(LogSoftmax) + template void MatrixInverse::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); @@ -1662,6 +1462,90 @@ void PairwiseRankLoss::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(PairwiseRankLoss) +template +void PickNegLogSoftmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + if (xs[0]->d.cols() == 1) { + logz = (float*)device->fxs->allocate(sizeof(float)*fx.d.batch_elems()); +#if __CUDACC__ + if(pval) { + gpu::pnlsoftmax(xs[0]->d.size(), *pval, xs[0]->v, fx.v, logz); + } else { + // TODO: It'd be nice to have a kernel that did all batches at once + assert(pvals); + assert(pvals->size() == fx.d.batch_elems()); + for(unsigned b = 0; b < pvals->size(); ++b) + gpu::pnlsoftmax(xs[0]->d.batch_size(), (*pvals)[b], xs[0]->batch_ptr(b), fx.v+b, logz+b); + } +#else + if(pval) { + auto x = **xs[0]; + *logz = logsumexp(x); + fx.v[0] = *logz - x(*pval); + } else { + assert(pvals); + assert(pvals->size() == fx.d.batch_elems()); + for(unsigned b = 0; b < pvals->size(); ++b) { + auto x = xs[0]->batch_matrix(b); + logz[b] = logsumexp(x); + fx.v[b] = logz[b] - x((*pvals)[b]); + } + } +#endif + } else { + throw std::runtime_error("PickNegLogSoftmax::forward not yet implemented for multiple columns"); + } +} + +template +void PickNegLogSoftmax::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + if (xs[0]->d.cols() == 1) { +#if __CUDACC__ + if(pval) { + const auto elem = *pval; + gpu::pnlsoftmax_backward(dEdxi.d.size(), elem, xs[0]->v, dEdf.v, logz, dEdxi.v); + } else { + assert(pvals); + assert(pvals->size() == fx.d.batch_elems()); + // TODO: Again, it would be nice to do this with a single kernel + for(unsigned b = 0; b < pvals->size(); ++b) { + const auto elem = (*pvals)[b]; + gpu::pnlsoftmax_backward(dEdxi.d.batch_size(), elem, xs[0]->batch_ptr(b), dEdf.v+b, logz+b, dEdxi.batch_ptr(b)); + } + } +#else + if(pval) { + const auto elem = *pval; + const float err = dEdf.v[0]; + auto x = **xs[0]; + // logz is computed in the forward pass and cached + *dEdxi += x.unaryExpr(FNegLogSoftmaxBackward(*logz, err)); + //*dEdxi += x.unaryExpr(scalar_nlsoftmax_backward_op(*logz, err)); + (*dEdxi)(elem) -= err; + } else { + assert(pvals); + assert(pvals->size() == fx.d.batch_elems()); + for(unsigned b = 0; b < pvals->size(); ++b) { + const auto elem = (*pvals)[b]; + const float err = dEdf.v[b]; + auto x = xs[0]->batch_matrix(b); + auto dEdxi_mat = dEdxi.batch_matrix(b); + dEdxi_mat += x.unaryExpr(FNegLogSoftmaxBackward(logz[b], err)); + //dEdxi_mat += x.unaryExpr(scalar_nlsoftmax_backward_op(logz[b], err)); + dEdxi_mat(elem) -= err; + } + } +#endif + } else { + throw std::runtime_error("PickNegLogSoftmax::backward not yet implemented for multiple columns"); + } +} +CNN_NODE_INST_DEV_IMPL(PickNegLogSoftmax) + template void PoissonRegressionLoss::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { const real y = *pty; @@ -1772,6 +1656,42 @@ void SelectRows::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(SelectRows) +template +void Softmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + if (xs[0]->d.cols() == 1) { +#if __CUDACC__ + gpu::softmax(xs[0]->d.size(), xs[0]->v, fx.v); +#else + auto x = **xs[0]; + if (x.rows() == 1) { + fx.v[0] = 1; + } else { + *fx = x.unaryExpr(FSoftmaxNormalize(logsumexp(x))); + } +#endif + } else { + throw std::runtime_error("Softmax not yet implemented for multiple columns"); + } +} + +template +void Softmax::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { +#if __CUDACC__ + gpu::softmax_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); +#else + auto y = *fx; + if (y.rows() == 1) { return; } // no error if softmax = 0 + float off_diag_sum = -y.cwiseProduct(*dEdf).sum(); + *dEdxi += y.binaryExpr(*dEdf, FSoftmaxBackward(off_diag_sum)); +#endif +} +CNN_NODE_INST_DEV_IMPL(Softmax) + template void SoftSign::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); @@ -1989,6 +1909,106 @@ void Sqrt::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(Sqrt) +template +void Sum::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + const unsigned num_args = xs.size(); + if (num_args == 1) { + fx.v = xs[0]->v; + return; + } +#if HAVE_CUDA + TensorTools::Zero(fx); + for (unsigned i = 0; i < num_args; ++i) + CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[i]->v, 1, fx.v, 1)); +#else + auto res = fx.vec(); + const unsigned remainder = num_args % 4; + switch (remainder) { + case 0: res.setZero(); break; + case 1: res = xs[0]->vec(); break; + case 2: res = xs[0]->vec() + xs[1]->vec(); break; + case 3: res = xs[0]->vec() + xs[1]->vec() + xs[2]->vec(); break; + } + for (unsigned i = remainder; i < num_args; i += 4) + res += xs[i]->vec() + xs[i+1]->vec() + xs[i+2]->vec() + xs[i+3]->vec(); +#endif +} + +template +void Sum::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + +#if HAVE_CUDA + CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); +#else + dEdxi.vec() += dEdf.vec(); +#endif +} +CNN_NODE_INST_DEV_IMPL(Sum) + +template +void SumBatches::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + unsigned num_args = xs[0]->d.bd; +#if HAVE_CUDA + TensorTools::Zero(fx); + for (unsigned i = 0; i < num_args; ++i) + CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v + i * xs[0]->d.batch_size(), 1, fx.v, 1)); +#else + auto res = *fx; + const unsigned remainder = num_args % 4; + switch (remainder) { + case 0: res.setZero(); break; + case 1: res = xs[0]->batch_matrix(0); break; + case 2: res = xs[0]->batch_matrix(0) + xs[0]->batch_matrix(1); break; + case 3: res = xs[0]->batch_matrix(0) + xs[0]->batch_matrix(1) + xs[0]->batch_matrix(2); break; + } + for (unsigned i = remainder; i < num_args; i += 4) + res += xs[0]->batch_matrix(i) + xs[0]->batch_matrix(i+1) + xs[0]->batch_matrix(i+2) + xs[0]->batch_matrix(i+3); +#endif +} + +template +void SumBatches::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i == 0); +#if HAVE_CUDA + for (unsigned i = 0; i < dEdxi.d.bd; ++i) + CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v + i * dEdxi.d.batch_size(), 1)); +#else + for (unsigned i = 0; i < dEdxi.d.bd; ++i) + dEdxi.batch_matrix(i) += *dEdf; +#endif +} +CNN_NODE_INST_DEV_IMPL(SumBatches) + +void Average::forward_impl(const vector& xs, Tensor& fx) const { + const unsigned num_args = xs.size(); + if (num_args == 1) { + fx.v = xs[0]->v; + return; + } + auto res = fx.vec(); + const unsigned remainder = num_args % 4; + switch (remainder) { + case 0: res.setZero(); break; + case 1: res = xs[0]->vec(); break; + case 2: res = xs[0]->vec() + xs[1]->vec(); break; + case 3: res = xs[0]->vec() + xs[1]->vec() + xs[2]->vec(); break; + } + for (unsigned i = remainder; i < num_args; i += 4) + res += xs[i]->vec() + xs[i+1]->vec() + xs[i+2]->vec() + xs[i+3]->vec(); + res /= num_args; +} + template void Tanh::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { fx.tvec().device(*dev.edevice) = xs[0]->tvec().tanh(); diff --git a/cnn/nodes.h b/cnn/nodes.h index b3c5604f9..ec70e8b2d 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -566,31 +566,16 @@ struct LogDet : public Node { // y = \sum_i x_i struct Sum : public Node { template explicit Sum(const T& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; + CNN_NODE_DEFINE_DEV_IMPL() // TODO: Sum should be be implemented over the entire mini-batch, but this is not // super-easy in the current implementation - // virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; }; // y = \sum_i x_i struct SumBatches : public Node { template explicit SumBatches(const T& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; + CNN_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; }; // y = ( \sum_i x_i ) / |x| @@ -666,28 +651,14 @@ struct SoftSign : public Node { // y_i = (x_1)_i / z struct Softmax : public Node { explicit Softmax(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // z = \sum_j \exp (x_i)_j // y_i = (x_1)_i - \log z struct LogSoftmax : public Node { explicit LogSoftmax(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // z = \sum_j \exp (x_i)_j @@ -699,15 +670,8 @@ struct PickNegLogSoftmax : public Node { // use these constructors if you want to change the value after the graph is constructed explicit PickNegLogSoftmax(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv), vals(), pvals() {} explicit PickNegLogSoftmax(const std::initializer_list& a, const std::vector* pv) : Node(a), val(), pval(), vals(), pvals(pv) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; + CNN_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; mutable float* logz; unsigned val; const unsigned* pval; From d6d0ef8011cb83b3e3dc92eefbaaf34be84dee76 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 30 May 2016 23:00:07 +0900 Subject: [PATCH 505/965] Added sum columns as tensors --- cnn/nodes.cc | 238 ++++++++++++++++++++++++++------------------------- cnn/nodes.h | 36 +------- cnn/tensor.h | 36 +++++--- 3 files changed, 150 insertions(+), 160 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 5a6d786c1..6aa8f3c2c 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -74,30 +74,6 @@ namespace cnn { // ======= Functions to be compiled on only CPU #ifndef __CUDACC__ -void AddVectorToAllColumns::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("AddVectorToAllColumns::forward not implemented for CUDA"); -#else - auto y = *fx; - auto x = **xs[0]; - auto b = **xs[1]; - y = x.colwise() + b.col(0); -#endif -} - -void AddVectorToAllColumns::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i < 2); - if (i == 0) { // x - (*dEdxi) += (*dEdf); - } else { // bias - (*dEdxi).col(0) += (*dEdf).rowwise().sum(); - } -} - void TraceOfProduct::forward_impl(const vector& xs, Tensor& fx) const { #ifdef HAVE_CUDA throw std::runtime_error("TraceOfProduct not yet implemented for CUDA"); @@ -123,81 +99,6 @@ void TraceOfProduct::backward_impl(const vector& xs, #endif } -void Transpose::forward_impl(const vector& xs, Tensor& fx) const { - if (dim.rows() == 1 || dim.cols() == 1) { - fx.v = xs[0]->v; - } else { -#if HAVE_CUDA - for(unsigned b = 0; b < xs[0]->d.bd; ++b) - CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, fx.d.rows(), fx.d.cols(), - kSCALAR_ONE, xs[0]->batch_ptr(b), xs[0]->d.rows(), kSCALAR_ZERO, NULL, fx.d.rows(), fx.batch_ptr(b), fx.d.rows())); -#else - for(unsigned b = 0; b < xs[0]->d.bd; ++b) - fx.batch_matrix(b).noalias() = xs[0]->batch_matrix(b).transpose(); -#endif - } -} - -void Transpose::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#if HAVE_CUDA - for(unsigned b = 0; b < xs[0]->d.bd; ++b) - CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols(), - kSCALAR_ONE, dEdf.batch_ptr(b), dEdf.d.rows(), kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows(), dEdxi.batch_ptr(b), dEdxi.d.rows())); -#else - for(unsigned b = 0; b < xs[0]->d.bd; ++b) - dEdxi.batch_matrix(b) += dEdf.batch_matrix(b).transpose(); -#endif -} - -void Reshape::forward_impl(const vector& xs, Tensor& fx) const { - // just point to the input memory and change dimensions - // dimensions are handled by forward_dim -#ifdef HAVE_CUDA - throw std::runtime_error("Reshape not yet implemented for CUDA"); -#else - fx.v = xs[0]->v; -#endif -} - -void Reshape::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Reshape not yet implemented for CUDA"); -#else - const Tensor reshaped(dEdxi.d, dEdf.v, dEdxi.device); - dEdxi.vec() += reshaped.vec(); -#endif -} - -void SumColumns::forward_impl(const vector& xs, Tensor& fx) const { - auto x = **xs[0]; - auto y = *fx; - if (xs.size() == 1) { - y = x.rowwise().sum(); - } else { - throw std::invalid_argument("two inputs in SumColumns::forward!"); - } -} - -void SumColumns::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - auto out = *dEdxi; - // this uses Eigen's broadcast capability - // the following doesn't compile, so i use the next line - //out.colwise() += *dEdf; - out.colwise() += (*dEdf).col(0); -} - void KMHNGram::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; const int new_cols = x.cols() - n + 1; @@ -402,6 +303,25 @@ void LogDet::backward_impl(const vector& xs, (*dEdxi) += (dEdf.v[0]) * trans.inverse(); } +void Average::forward_impl(const vector& xs, Tensor& fx) const { + const unsigned num_args = xs.size(); + if (num_args == 1) { + fx.v = xs[0]->v; + return; + } + auto res = fx.vec(); + const unsigned remainder = num_args % 4; + switch (remainder) { + case 0: res.setZero(); break; + case 1: res = xs[0]->vec(); break; + case 2: res = xs[0]->vec() + xs[1]->vec(); break; + case 3: res = xs[0]->vec() + xs[1]->vec() + xs[2]->vec(); break; + } + for (unsigned i = remainder; i < num_args; i += 4) + res += xs[i]->vec() + xs[i+1]->vec() + xs[i+2]->vec() + xs[i+3]->vec(); + res /= num_args; +} + void Average::backward_impl(const vector& xs, const Tensor& fx, const Tensor& dEdf, @@ -784,6 +704,32 @@ inline void CUDAMatrixMultiply(const Tensor& l, const Tensor& r, Tensor& y, cons } #endif +template +void AddVectorToAllColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + array broadcasts; + broadcasts[0] = 1; + broadcasts[1] = xs[0]->d[1]; + fx.t<2>().device(*dev.edevice) = xs[0]->t<2>() + xs[1]->t<2>().broadcast(broadcasts); +} + +template +void AddVectorToAllColumns::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + if (i == 0) { // x + dEdxi.tvec() += dEdf.tvec(); + } else { // bias + for(size_t i = 0; i < xs[0]->d[1]; i++) + dEdxi.t<1>() += dEdf.t<2>().chip<1>(i); + // TODO: This is not great. Can we use broadcasting similar to SumColumns? + } +} +CNN_NODE_INST_DEV_IMPL(AddVectorToAllColumns) + // Affine transform uses different impleentations for CPU and GPU because this is // much faster than using Eigen's tensor contractions (as of the writing) template @@ -1608,6 +1554,25 @@ void Rectify::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(Rectify) +template +void Reshape::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + // just point to the input memory and change dimensions + // dimensions are handled by forward_dim + fx.v = xs[0]->v; +} + +template +void Reshape::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + const Tensor reshaped(dEdxi.d, dEdf.v, dEdxi.device); + dEdxi.tvec() += reshaped.tvec(); +} +CNN_NODE_INST_DEV_IMPL(Reshape) + template void SelectCols::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); @@ -1990,25 +1955,32 @@ void SumBatches::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(SumBatches) -void Average::forward_impl(const vector& xs, Tensor& fx) const { - const unsigned num_args = xs.size(); - if (num_args == 1) { - fx.v = xs[0]->v; - return; - } - auto res = fx.vec(); - const unsigned remainder = num_args % 4; - switch (remainder) { - case 0: res.setZero(); break; - case 1: res = xs[0]->vec(); break; - case 2: res = xs[0]->vec() + xs[1]->vec(); break; - case 3: res = xs[0]->vec() + xs[1]->vec() + xs[2]->vec(); break; - } - for (unsigned i = remainder; i < num_args; i += 4) - res += xs[i]->vec() + xs[i+1]->vec() + xs[i+2]->vec() + xs[i+3]->vec(); - res /= num_args; +template +void SumColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + array reduction_axis; + reduction_axis[0] = 1; + fx.t<1>().device(*dev.edevice) += xs[0]->t<2>().sum(reduction_axis); } +template +void SumColumns::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + auto out = *dEdxi; + for(size_t i = 0; i < xs[0]->d[1]; i++) + dEdxi.t<1>() += dEdf.t<2>().chip<1>(i); + // TODO: This is not great. Can we use broadcasting similar to the following? + // array broadcasts; + // broadcasts[0] = 1; + // broadcasts[1] = xs[0]->d[1]; + // dEdxi.t<2>().broadcast(broadcasts) += dEdf.t<2>(); +} +CNN_NODE_INST_DEV_IMPL(SumColumns) + template void Tanh::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { fx.tvec().device(*dev.edevice) = xs[0]->tvec().tanh(); @@ -2025,6 +1997,40 @@ void Tanh::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(Tanh) +template +void Transpose::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + if (dim.rows() == 1 || dim.cols() == 1) { + fx.v = xs[0]->v; + } else { +#if HAVE_CUDA + for(unsigned b = 0; b < xs[0]->d.bd; ++b) + CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, fx.d.rows(), fx.d.cols(), + kSCALAR_ONE, xs[0]->batch_ptr(b), xs[0]->d.rows(), kSCALAR_ZERO, NULL, fx.d.rows(), fx.batch_ptr(b), fx.d.rows())); +#else + for(unsigned b = 0; b < xs[0]->d.bd; ++b) + fx.batch_matrix(b).noalias() = xs[0]->batch_matrix(b).transpose(); +#endif + } +} + +template +void Transpose::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { +#if HAVE_CUDA + for(unsigned b = 0; b < xs[0]->d.bd; ++b) + CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols(), + kSCALAR_ONE, dEdf.batch_ptr(b), dEdf.d.rows(), kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows(), dEdxi.batch_ptr(b), dEdxi.d.rows())); +#else + for(unsigned b = 0; b < xs[0]->d.bd; ++b) + dEdxi.batch_matrix(b) += dEdf.batch_matrix(b).transpose(); +#endif +} +CNN_NODE_INST_DEV_IMPL(Transpose) + template void Zeroes::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 0); diff --git a/cnn/nodes.h b/cnn/nodes.h index ec70e8b2d..409078da3 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -99,14 +99,7 @@ namespace cnn { // y = M + v (broadcasting over columns) struct AddVectorToAllColumns : public Node { explicit AddVectorToAllColumns(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = L_sparsemax(x_0; q) @@ -211,28 +204,14 @@ struct DotProduct : public Node { // if you have a matrix as input, the runtime is O(mn) - try to avoid using this struct Transpose : public Node { explicit Transpose(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; + CNN_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; }; // y = reshape(x_1, --> to) struct Reshape : public Node { explicit Reshape(const std::initializer_list& a, const Dim& to) : Node(a), to(to) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() Dim to; }; @@ -241,14 +220,7 @@ struct Reshape : public Node { // if you want to reweight the columns and then sum them, use MatrixMultiply struct SumColumns : public Node { template explicit SumColumns(const T& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y_i = \sum_{j=1}^n x_1:{i-1+j} diff --git a/cnn/tensor.h b/cnn/tensor.h index 30b93d9b1..048f329b3 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -193,28 +193,40 @@ template<> inline const Eigen::TensorMap> Tensor::t<1>() return Eigen::TensorMap>(v, (int)d[0]); } template<> inline Eigen::TensorMap> Tensor::t<2>() { - assert(d.ndims() == 2); - return Eigen::TensorMap>(v, (int)d[0], (int)d[1]); + assert(d.ndims() <= 2); + if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1]); + else return Eigen::TensorMap>(v, (int)d[0], (int)1); } template<> inline const Eigen::TensorMap> Tensor::t<2>() const { - assert(d.ndims() == 2); - return Eigen::TensorMap>(v, (int)d[0], (int)d[1]); + assert(d.ndims() <= 2); + if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1]); + else return Eigen::TensorMap>(v, (int)d[0], (int)1); } template<> inline Eigen::TensorMap> Tensor::t<3>() { - assert(d.ndims() == 3); - return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2]); + assert(d.ndims() <= 3); + if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2]); + else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1); } template<> inline const Eigen::TensorMap> Tensor::t<3>() const { - assert(d.ndims() == 3); - return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2]); + assert(d.ndims() <= 3); + if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2]); + else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1); } template<> inline Eigen::TensorMap> Tensor::t<4>() { - assert(d.ndims() == 4); - return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3]); + assert(d.ndims() <= 4); + if(d.ndims() == 4) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3]); + else if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)1); + else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, (int)1); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, (int)1); } template<> inline const Eigen::TensorMap> Tensor::t<4>() const { - assert(d.ndims() == 4); - return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3]); + assert(d.ndims() <= 4); + if(d.ndims() == 4) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3]); + else if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)1); + else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, (int)1); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, (int)1); } // ... From 558ce456a1b06bb1bdbcf00054bb361087b615f6 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 30 May 2016 23:58:19 +0900 Subject: [PATCH 506/965] Tensor implementation of Hinge --- cnn/nodes.cc | 136 +++++++++++++++++++++++---------------------------- cnn/nodes.h | 18 +------ 2 files changed, 63 insertions(+), 91 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 6aa8f3c2c..f5e19145e 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -74,31 +74,6 @@ namespace cnn { // ======= Functions to be compiled on only CPU #ifndef __CUDACC__ -void TraceOfProduct::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("TraceOfProduct not yet implemented for CUDA"); -#else - auto x1 = **xs[0]; - auto x2 = **xs[1]; - fx.v[0] = (x1 * x2.transpose()).trace(); -#endif -} - -void TraceOfProduct::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i < 2); -#ifdef HAVE_CUDA - throw std::runtime_error("TraceOfProduct not yet implemented for CUDA"); -#else - const float d = dEdf.v[0]; - auto xother = **xs[1 - i]; - *dEdxi += d * xother; -#endif -} - void KMHNGram::forward_impl(const vector& xs, Tensor& fx) const { auto x = **xs[0]; const int new_cols = x.cols() - n + 1; @@ -408,56 +383,6 @@ void ConcatenateColumns::backward_impl(const vector& xs, #endif } -size_t Hinge::aux_storage_size() const { - return dim.size() * sizeof(float); -} - -void Hinge::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); -#ifdef HAVE_CUDA - throw std::runtime_error("Hinge not yet implemented for CUDA"); -#else - auto x = **xs[0]; - const unsigned rows = x.rows(); - float y = 0; - float* eloss = static_cast(aux_mem); - const real mlystar = margin - x(*pelement); - for (unsigned i = 0; i < rows; ++i) { - if (*pelement != i) { - eloss[i] = max(0.f, mlystar + x(i)); - y += eloss[i]; - } else { - eloss[i] = 0; - } - } - fx.v[0] = y; -#endif -} - -void Hinge::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i == 0); -#ifdef HAVE_CUDA - throw std::runtime_error("Hinge not yet implemented for CUDA"); -#else - if (fx.v[0]) { // there was some loss - const float d = dEdf.v[0]; - const unsigned rows = dEdxi.d.rows(); - const float* eloss = static_cast(aux_mem); - unsigned tne = 0; // total number of errors - for (unsigned i = 0; i < rows; ++i) - if (eloss[i] > 0) { - (*dEdxi)(i) += d; - ++tne; - } - (*dEdxi)(*pelement) -= d * tne; - } -#endif -} - void MaxPooling1D::forward_impl(const vector& xs, Tensor& fx) const { cerr << "FIX IMPL5\n"; abort(); #if 0 @@ -653,6 +578,10 @@ size_t GaussianNoise::aux_storage_size() const { return dim.size() * sizeof(float); } +size_t Hinge::aux_storage_size() const { + return dim.size() * sizeof(float); +} + size_t Max::aux_storage_size() const { return dim.size() * sizeof(float); } @@ -1076,6 +1005,34 @@ void GaussianNoise::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(GaussianNoise) +template +void Hinge::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + Tensor eloss(xs[0]->d, static_cast(aux_mem), fx.device); + const real mlystar = margin - xs[0]->tvec()(*pelement); + eloss.tvec().device(*dev.edevice) = (xs[0]->tvec() + mlystar).cwiseMax(0.f); + eloss.tvec()(*pelement) = 0.f; + fx.t<0>() = eloss.tvec().sum(); +} + +template +void Hinge::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i == 0); + if(as_scalar(fx)) { // there was some loss + const float d = as_scalar(dEdf); + Tensor eloss(xs[0]->d, static_cast(aux_mem), fx.device); + // TODO: The > comparison should not be calculated twice. Keep it in auxiliary memory? + dEdxi.tvec() += (eloss.tvec() > 0.f).cast() * d; + dEdxi.tvec().chip<0>(*pelement) -= (eloss.tvec() > 0.f).cast().sum() * d; + } +} +CNN_NODE_INST_DEV_IMPL(Hinge) + template void HuberDistance::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 2); @@ -1981,6 +1938,35 @@ void SumColumns::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(SumColumns) +template +void TraceOfProduct::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { +#ifdef HAVE_CUDA + throw std::runtime_error("TraceOfProduct not yet implemented for CUDA"); +#else + auto x1 = **xs[0]; + auto x2 = **xs[1]; + fx.v[0] = (x1 * x2.transpose()).trace(); +#endif +} + +template +void TraceOfProduct::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); +#ifdef __CUDACC__ + throw std::runtime_error("TraceOfProduct not yet implemented for CUDA"); +#else + const float d = dEdf.v[0]; + auto xother = **xs[1 - i]; + *dEdxi += d * xother; +#endif +} +CNN_NODE_INST_DEV_IMPL(TraceOfProduct) + template void Tanh::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { fx.tvec().device(*dev.edevice) = xs[0]->tvec().tanh(); diff --git a/cnn/nodes.h b/cnn/nodes.h index 409078da3..4e9f7bee6 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -175,14 +175,7 @@ struct Max : public Node { // y = Tr(x_1 * x_2^T) struct TraceOfProduct : public Node { explicit TraceOfProduct(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = alpha * x_1 @@ -416,15 +409,8 @@ struct PairwiseRankLoss : public Node { struct Hinge : public Node { explicit Hinge(const std::initializer_list& a, unsigned e, real m = 1.0) : Node(a), element(e), pelement(&element), margin(m) {} explicit Hinge(const std::initializer_list& a, const unsigned* pe, real m = 1.0) : Node(a), element(), pelement(pe), margin(m) {} + CNN_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; unsigned element; const unsigned* pelement; real margin; From 8c808298fb2938430acf28d1087fb6ff6b3cb4c7 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 31 May 2016 15:28:40 +0900 Subject: [PATCH 507/965] GPUification of parameters and contractions --- cnn/CMakeLists.txt | 2 +- cnn/gpu-param-nodes.cu | 3 + cnn/node-macros.h | 91 +++++++++++++++++ cnn/nodes.cc | 218 ++++++++++++++++++----------------------- cnn/nodes.h | 110 +-------------------- cnn/param-nodes.cc | 205 ++++++++++++++++++++------------------ cnn/param-nodes.h | 46 ++------- tests/test-nodes.cc | 34 ++++++- 8 files changed, 343 insertions(+), 366 deletions(-) create mode 100644 cnn/gpu-param-nodes.cu create mode 100644 cnn/node-macros.h diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 83628fdee..ad3d58733 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -108,7 +108,7 @@ if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU") SET(CUDA_PROPAGATE_HOST_FLAGS OFF) - cuda_add_library(cnncuda STATIC gpu-ops.cu gpu-nodes.cu) + cuda_add_library(cnncuda STATIC gpu-ops.cu gpu-nodes.cu gpu-param-nodes.cu) endif(WITH_CUDA_BACKEND) install(FILES ${cnn_library_HDRS} DESTINATION include/cnn) diff --git a/cnn/gpu-param-nodes.cu b/cnn/gpu-param-nodes.cu new file mode 100644 index 000000000..09a640f22 --- /dev/null +++ b/cnn/gpu-param-nodes.cu @@ -0,0 +1,3 @@ +// This is a dummy file that contains the same content as param-nodes.cc but compiled +// on CUDA +#include "param-nodes.cc" diff --git a/cnn/node-macros.h b/cnn/node-macros.h new file mode 100644 index 000000000..4ce7d20e8 --- /dev/null +++ b/cnn/node-macros.h @@ -0,0 +1,91 @@ +#ifndef CNN_NODE_MACROS_H_ +#define CNN_NODE_MACROS_H_ + +// A macro to dispatch things to the appropriate device +#ifdef HAVE_CUDA +#define CNN_NODE_DEFINE_DEV_IMPL() \ + std::string as_string(const std::vector& arg_names) const override; \ + Dim dim_forward(const std::vector& xs) const override; \ + void forward_impl(const std::vector& xs, Tensor& fx) const override { \ + assert(fx.device); \ + if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ + else if(fx.device->type == DeviceType::GPU) { forward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx); } \ + else { abort(); } \ + } \ + template \ + void forward_dev_impl(const MyDevice & dev, const std::vector& xs, Tensor& fx) const; \ + void backward_impl(const std::vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const override { \ + assert(fx.device); \ + if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ + else if(fx.device->type == DeviceType::GPU) { backward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ + else { abort(); } \ + } \ + template \ + void backward_dev_impl( \ + const MyDevice & dev, \ + const std::vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const; +#else +#define CNN_NODE_DEFINE_DEV_IMPL() \ + std::string as_string(const std::vector& arg_names) const override; \ + Dim dim_forward(const std::vector& xs) const override; \ + void forward_impl(const std::vector& xs, Tensor& fx) const override { \ + assert(fx.device); \ + if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ + else { abort(); } \ + } \ + template \ + void forward_dev_impl(const MyDevice & dev, const std::vector& xs, Tensor& fx) const; \ + void backward_impl(const std::vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const override { \ + assert(fx.device); \ + if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ + else { abort(); } \ + } \ + template \ + void backward_dev_impl( \ + const MyDevice & dev, \ + const std::vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const; +#endif + +// A macro to instantiate templated device functions +// If the implementation is the same for both devices (using Eigen Tensors), +// then this will instantiate both CPU and GPU implementations, and the +// code can be the same. +// If the implementation is different for both devices, use #ifdef __CUDACC__ +// within the function, and create alternative code paths for CPU and GPU implementations +#ifdef __CUDACC__ +#define CNN_NODE_INST_DEV_IMPL(MyNode) \ + template void MyNode::forward_dev_impl(const Device_GPU & dev, const vector& xs, Tensor& fx) const; \ + template void MyNode::backward_dev_impl(const Device_GPU & dev, \ + const vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const; +#else +#define CNN_NODE_INST_DEV_IMPL(MyNode) \ + template void MyNode::forward_dev_impl(const Device_CPU & dev, const vector& xs, Tensor& fx) const; \ + template void MyNode::backward_dev_impl(const Device_CPU & dev, \ + const vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const; +#endif + +#endif diff --git a/cnn/nodes.cc b/cnn/nodes.cc index f5e19145e..320ae1d9f 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -6,6 +6,7 @@ #include "cnn/simd-functors.h" #include "cnn/functors.h" +#include "cnn/node-macros.h" #ifdef HAVE_CUDA #include "cnn/cuda.h" @@ -34,41 +35,6 @@ using namespace std; // 2) dEdxi must accummulate (see point 4 above!) // -// A macro to instantiate templated device functions -// If the implementation is the same for both devices (using Eigen Tensors), -// then this will instantiate both CPU and GPU implementations, and the -// code can be the same. -// If the implementation is different for both devices, use #ifdef __CUDACC__ -// within the function, and create alternative code paths for CPU and GPU implementations -#ifdef __CUDACC__ -#define CNN_NODE_INST_NOGPU_IMPL(MyNode) -#define CNN_NODE_INST_DEV_IMPL(MyNode) \ - template void MyNode::forward_dev_impl(const Device_GPU & dev, const vector& xs, Tensor& fx) const; \ - template void MyNode::backward_dev_impl(const Device_GPU & dev, \ - const vector& xs, \ - const Tensor& fx, \ - const Tensor& dEdf, \ - unsigned i, \ - Tensor& dEdxi) const; -#else -#define CNN_NODE_INST_NOGPU_IMPL(MyNode) \ - template void MyNode::forward_dev_impl(const Device_CPU & dev, const vector& xs, Tensor& fx) const; \ - template void MyNode::backward_dev_impl(const Device_CPU & dev, \ - const vector& xs, \ - const Tensor& fx, \ - const Tensor& dEdf, \ - unsigned i, \ - Tensor& dEdxi) const; -#define CNN_NODE_INST_DEV_IMPL(MyNode) \ - template void MyNode::forward_dev_impl(const Device_CPU & dev, const vector& xs, Tensor& fx) const; \ - template void MyNode::backward_dev_impl(const Device_CPU & dev, \ - const vector& xs, \ - const Tensor& fx, \ - const Tensor& dEdf, \ - unsigned i, \ - Tensor& dEdxi) const; -#endif - namespace cnn { // ======= Functions to be compiled on only CPU @@ -98,93 +64,6 @@ void KMHNGram::backward_impl(const vector& xs, (*dEdxi).col(j+k) += (*dEdf).col(j); } -// Y_ij = A_ijk * B_k (+ C_ij) -void InnerProduct3D_1D::forward_impl(const vector& xs, Tensor& fx) const { - auto A = xs[0]->t<3>(); - auto b = xs[1]->t<1>(); - typedef Eigen::Tensor::DimensionPair DimPair; - Eigen::array dims({{DimPair(2, 0)}}); - if (xs.size() == 2) { - fx.t<2>() = A.contract(b, dims); - } else { - auto C = xs[2]->t<2>(); - fx.t<2>() = A.contract(b, dims) + C; - } -} - -void InnerProduct3D_1D::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - auto tdEdf = dEdf.t<2>(); // 2 tensor - typedef Eigen::Tensor::DimensionPair DimPair; - if (i == 0) { // 3 tensor - // tensor product - auto b = xs[1]->t<1>(); - dEdxi.t<3>() += tdEdf.contract(b, Eigen::array{{}}); - } else if (i == 1) { - auto A = xs[0]->t<3>(); // A is 3 tensor - Eigen::array dims({{DimPair(0, 0), DimPair(1, 1)}}); - dEdxi.t<1>() += tdEdf.contract(A, dims); - } else if (i == 2) { - dEdxi.t<2>() += tdEdf; - } else { - cerr << "shouldn't happen\n"; abort(); - } -} - -// Y_ij = A_ijk * B_k * C_j (+ D_i) -void InnerProduct3D_1D_1D::forward_impl(const vector& xs, Tensor& fx) const { - auto A = xs[0]->t<3>(); - auto b = xs[1]->t<1>(); - auto c = xs[2]->t<1>(); - typedef Eigen::Tensor::DimensionPair DimPair; - Eigen::array dims({{DimPair(2, 0)}}); - Eigen::array dims2({{DimPair(1, 0)}}); - if (xs.size() == 3) { - fx.t<1>() = A.contract(b, dims).contract(c, dims2); - } else { - auto d = xs[3]->t<1>(); - fx.t<1>() = A.contract(b, dims).contract(c, dims2) + d; - } -} - -void InnerProduct3D_1D_1D::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - auto tdEdf = dEdf.t<1>(); // vector - typedef Eigen::Tensor::DimensionPair DimPair; - if (i == 0) { // 3 tensor - // tensor product - auto b = xs[1]->t<1>(); - auto c = xs[2]->t<1>(); - dEdxi.t<3>() += tdEdf.contract(c, Eigen::array{{}}).contract(b, Eigen::array{{}}); - } else if (i == 1) { // vector 1 - // TODO these should be reorganized so the contraction is first with tdEdf and then with c or b. - // in theory, that intermediate result could be cached (although CNN doesn't support this). the fact that it - // this part of the product is redone when i=1 and again when i=2 is probably why this is slower - // (or maybe it's the contract implementation?) - Eigen::array dims({{DimPair(1, 0)}}); - Eigen::array dims2({{DimPair(0, 0)}}); - auto A = xs[0]->t<3>(); - auto c = xs[2]->t<1>(); - dEdxi.t<1>() += A.contract(c, dims).contract(tdEdf, dims2); - } else if (i == 2) { // vector 2 - Eigen::array dims({{DimPair(2, 0)}}); - Eigen::array dims2({{DimPair(0, 0)}}); - auto A = xs[0]->t<3>(); - auto b = xs[1]->t<1>(); - dEdxi.t<1>() += A.contract(b, dims).contract(tdEdf, dims2); - } else if (i == 3) { // vector bias - dEdxi.t<1>() += tdEdf; - } else { - cerr << "shouldn't happen\n"; abort(); - } -} - template EIGEN_STRONG_INLINE float logsumexp(const T& x) { using std::exp; @@ -1068,6 +947,101 @@ void Identity::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(Identity) +// Y_ij = A_ijk * B_k (+ C_ij) +template +void InnerProduct3D_1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + auto A = xs[0]->t<3>(); + auto b = xs[1]->t<1>(); + typedef Eigen::Tensor::DimensionPair DimPair; + Eigen::array dims({{DimPair(2, 0)}}); + if (xs.size() == 2) { + fx.t<2>() = A.contract(b, dims); + } else { + auto C = xs[2]->t<2>(); + fx.t<2>() = A.contract(b, dims) + C; + } +} + +template +void InnerProduct3D_1D::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + auto tdEdf = dEdf.t<2>(); // 2 tensor + typedef Eigen::Tensor::DimensionPair DimPair; + if (i == 0) { // 3 tensor + // tensor product + auto b = xs[1]->t<1>(); + dEdxi.t<3>() += tdEdf.contract(b, Eigen::array{{}}); + } else if (i == 1) { + auto A = xs[0]->t<3>(); // A is 3 tensor + Eigen::array dims({{DimPair(0, 0), DimPair(1, 1)}}); + dEdxi.t<1>() += tdEdf.contract(A, dims); + } else if (i == 2) { + dEdxi.t<2>() += tdEdf; + } else { + cerr << "shouldn't happen\n"; abort(); + } +} +CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D) + +// Y_ij = A_ijk * B_k * C_j (+ D_i) +template +void InnerProduct3D_1D_1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + auto A = xs[0]->t<3>(); + auto b = xs[1]->t<1>(); + auto c = xs[2]->t<1>(); + typedef Eigen::Tensor::DimensionPair DimPair; + Eigen::array dims({{DimPair(2, 0)}}); + Eigen::array dims2({{DimPair(1, 0)}}); + if (xs.size() == 3) { + fx.t<1>() = A.contract(b, dims).contract(c, dims2); + } else { + auto d = xs[3]->t<1>(); + fx.t<1>() = A.contract(b, dims).contract(c, dims2) + d; + } +} + +template +void InnerProduct3D_1D_1D::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + auto tdEdf = dEdf.t<1>(); // vector + typedef Eigen::Tensor::DimensionPair DimPair; + if (i == 0) { // 3 tensor + // tensor product + auto b = xs[1]->t<1>(); + auto c = xs[2]->t<1>(); + dEdxi.t<3>() += tdEdf.contract(c, Eigen::array{{}}).contract(b, Eigen::array{{}}); + } else if (i == 1) { // vector 1 + // TODO these should be reorganized so the contraction is first with tdEdf and then with c or b. + // in theory, that intermediate result could be cached (although CNN doesn't support this). the fact that it + // this part of the product is redone when i=1 and again when i=2 is probably why this is slower + // (or maybe it's the contract implementation?) + Eigen::array dims({{DimPair(1, 0)}}); + Eigen::array dims2({{DimPair(0, 0)}}); + auto A = xs[0]->t<3>(); + auto c = xs[2]->t<1>(); + dEdxi.t<1>() += A.contract(c, dims).contract(tdEdf, dims2); + } else if (i == 2) { // vector 2 + Eigen::array dims({{DimPair(2, 0)}}); + Eigen::array dims2({{DimPair(0, 0)}}); + auto A = xs[0]->t<3>(); + auto b = xs[1]->t<1>(); + dEdxi.t<1>() += A.contract(b, dims).contract(tdEdf, dims2); + } else if (i == 3) { // vector bias + dEdxi.t<1>() += tdEdf; + } else { + cerr << "shouldn't happen\n"; abort(); + } +} +CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D_1D) + template void L1Distance::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 2); diff --git a/cnn/nodes.h b/cnn/nodes.h index 4e9f7bee6..ff5715afd 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -3,98 +3,12 @@ #include "cnn/cnn.h" #include "cnn/devices.h" +#include "cnn/node-macros.h" -// A macro to dispatch things to the appropriate device -#ifdef HAVE_CUDA -#define CNN_NODE_DEFINE_DEV_IMPL() \ - std::string as_string(const std::vector& arg_names) const override; \ - Dim dim_forward(const std::vector& xs) const override; \ - void forward_impl(const std::vector& xs, Tensor& fx) const override { \ - assert(fx.device); \ - if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ - else if(fx.device->type == DeviceType::GPU) { forward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx); } \ - else { abort(); } \ - } \ - template \ - void forward_dev_impl(const MyDevice & dev, const std::vector& xs, Tensor& fx) const; \ - void backward_impl(const std::vector& xs, \ - const Tensor& fx, \ - const Tensor& dEdf, \ - unsigned i, \ - Tensor& dEdxi) const override { \ - assert(fx.device); \ - if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ - else if(fx.device->type == DeviceType::GPU) { backward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ - else { abort(); } \ - } \ - template \ - void backward_dev_impl( \ - const MyDevice & dev, \ - const std::vector& xs, \ - const Tensor& fx, \ - const Tensor& dEdf, \ - unsigned i, \ - Tensor& dEdxi) const; - -#define CNN_NODE_DEFINE_NOGPU_IMPL() \ - std::string as_string(const std::vector& arg_names) const override; \ - Dim dim_forward(const std::vector& xs) const override; \ - void forward_impl(const std::vector& xs, Tensor& fx) const override { \ - assert(fx.device); \ - if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ - else { throw std::runtime_error("No GPU implementation yet"); } \ - } \ - template \ - void forward_dev_impl(const MyDevice & dev, const std::vector& xs, Tensor& fx) const; \ - void backward_impl(const std::vector& xs, \ - const Tensor& fx, \ - const Tensor& dEdf, \ - unsigned i, \ - Tensor& dEdxi) const override { \ - assert(fx.device); \ - if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ - else { throw std::runtime_error("No GPU implementation yet"); } \ - } \ - template \ - void backward_dev_impl( \ - const MyDevice & dev, \ - const std::vector& xs, \ - const Tensor& fx, \ - const Tensor& dEdf, \ - unsigned i, \ - Tensor& dEdxi) const; -#else -#define CNN_NODE_DEFINE_DEV_IMPL() \ - std::string as_string(const std::vector& arg_names) const override; \ - Dim dim_forward(const std::vector& xs) const override; \ - void forward_impl(const std::vector& xs, Tensor& fx) const override { \ - assert(fx.device); \ - if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ - else { abort(); } \ - } \ - template \ - void forward_dev_impl(const MyDevice & dev, const std::vector& xs, Tensor& fx) const; \ - void backward_impl(const std::vector& xs, \ - const Tensor& fx, \ - const Tensor& dEdf, \ - unsigned i, \ - Tensor& dEdxi) const override { \ - assert(fx.device); \ - if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ - else { abort(); } \ - } \ - template \ - void backward_dev_impl( \ - const MyDevice & dev, \ - const std::vector& xs, \ - const Tensor& fx, \ - const Tensor& dEdf, \ - unsigned i, \ - Tensor& dEdxi) const; -#define CNN_NODE_DEFINE_NOGPU_IMPL() CNN_NODE_DEFINE_DEV_IMPL() -#endif +// See node-macros.h for more details about CNN_NODE_DEFINE_DEV_IMPL. namespace cnn { + // M = x_0, v = x_1 // y = M + v (broadcasting over columns) struct AddVectorToAllColumns : public Node { @@ -239,27 +153,13 @@ struct KMHNGram : public Node { // (dE/dC)_ij = (dE/dY)_ij struct InnerProduct3D_1D : public Node { InnerProduct3D_1D(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // Y_i = A_ijk * B_k * C_j struct InnerProduct3D_1D_1D : public Node { InnerProduct3D_1D_1D(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // n_{i,j} ~ N(0,stddev) diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index e19688aa9..d076303e7 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -8,6 +8,8 @@ using namespace std; namespace cnn { +#ifndef __CUDACC__ + string ConstParameterNode::as_string(const vector& arg_names) const { ostringstream s; s << "const_parameters(" << dim << ')'; @@ -19,20 +21,6 @@ Dim ConstParameterNode::dim_forward(const vector& xs) const { return dim; } -void ConstParameterNode::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 0); - *fx.v = *params.get()->values.v * global_weight_decay.CurrentWeightDecay(); -} - -void ConstParameterNode::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - cerr << "called backward() on arity 0 node: i = " << i << endl; - abort(); -} - string ParameterNode::as_string(const vector& arg_names) const { ostringstream s; s << "parameters(" << dim << ')'; @@ -44,30 +32,6 @@ Dim ParameterNode::dim_forward(const vector& xs) const { return dim; } -void ParameterNode::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 0); -// TODO -// if (params->not_regularized) { -// fx.v = params->values.v; -// return; -// } -#if HAVE_CUDA - fx.v = params.get()->values.v; - cerr << "ParameterNode::forward_impl - implement * global_weight_scale for CUDA\n"; -#else - *fx = *params.get()->values * global_weight_decay.CurrentWeightDecay(); -#endif -} - -void ParameterNode::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - cerr << "called backward() on arity 0 node: i = " << i << endl; - abort(); -} - void ParameterNode::accumulate_grad(const Tensor& g) { params.get()->accumulate_grad(g); } @@ -82,9 +46,87 @@ Dim InputNode::dim_forward(const vector& xs) const { return dim; } -void InputNode::forward_impl(const vector& xs, Tensor& fx) const { +string ScalarInputNode::as_string(const vector& arg_names) const { + ostringstream s; + s << "scalar_constant(" << pdata << ')'; + return s.str(); +} + +Dim ScalarInputNode::dim_forward(const vector& xs) const { + return Dim({1}); +} + +string LookupNode::as_string(const vector& arg_names) const { + ostringstream s; + s << "lookup_parameters(|x|=" << params.get()->values.size() << " --> " << dim << ')'; + return s.str(); +} + +Dim LookupNode::dim_forward(const vector& xs) const { + return dim; +} + +void LookupNode::accumulate_grad(const Tensor& g) { + if(pindex) { + params.get()->accumulate_grad(*pindex, g); + } else { + assert (pindices); + const vector& gb = g.batch_elems(); + for (unsigned b = 0; b < pindices->size(); ++b) { + unsigned i = pindices->at(b); + assert (i < params.get()->values.size()); + params.get()->accumulate_grad(i, gb[b]); + } + } +} + +#endif + +template +void ConstParameterNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 0); + fx.tvec() = params.get()->values.tvec() * global_weight_decay.CurrentWeightDecay(); +} + +template +void ConstParameterNode::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + cerr << "called backward() on arity 0 node: i = " << i << endl; + abort(); +} +CNN_NODE_INST_DEV_IMPL(ConstParameterNode) + +template +void ParameterNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 0); +// TODO +// if (params->not_regularized) { +// fx.v = params->values.v; +// return; +// } + fx.tvec() = params.get()->values.tvec() * global_weight_decay.CurrentWeightDecay(); +} + +template +void ParameterNode::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + cerr << "called backward() on arity 0 node: i = " << i << endl; + abort(); +} +CNN_NODE_INST_DEV_IMPL(ParameterNode) + +template +void InputNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 0); -#if HAVE_CUDA +#if __CUDACC__ cudaMemcpyAsync(fx.v, &pdata->front(), dim.size() * sizeof(float), cudaMemcpyHostToDevice); #else // TODO memcpy is only necessary if pdata->front() points to an unaligned location @@ -98,54 +140,42 @@ void InputNode::forward_impl(const vector& xs, Tensor& fx) const #endif } -void InputNode::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { +template +void InputNode::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { cerr << "called backward() on arity 0 node\n"; abort(); } +CNN_NODE_INST_DEV_IMPL(InputNode) -string ScalarInputNode::as_string(const vector& arg_names) const { - ostringstream s; - s << "scalar_constant(" << pdata << ')'; - return s.str(); -} - -Dim ScalarInputNode::dim_forward(const vector& xs) const { - return Dim({1}); -} - -void ScalarInputNode::forward_impl(const vector& xs, Tensor& fx) const { +template +void ScalarInputNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 0); -#if HAVE_CUDA +#if __CUDACC__ cudaMemcpyAsync(fx.v, pdata, 1 * sizeof(float), cudaMemcpyHostToDevice); #else fx.v[0] = *pdata; #endif } -void ScalarInputNode::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { +template +void ScalarInputNode::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { cerr << "called backward() on arity 0 node\n"; abort(); } +CNN_NODE_INST_DEV_IMPL(ScalarInputNode) -string LookupNode::as_string(const vector& arg_names) const { - ostringstream s; - s << "lookup_parameters(|x|=" << params.get()->values.size() << " --> " << dim << ')'; - return s.str(); -} - -Dim LookupNode::dim_forward(const vector& xs) const { - return dim; -} - -void LookupNode::forward_impl(const vector& xs, Tensor& fx) const { +template +void LookupNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 0); if(pindex) { assert(*pindex < params.get()->values.size()); @@ -158,7 +188,7 @@ void LookupNode::forward_impl(const vector& xs, Tensor& fx) const unsigned i = pindices->at(b); assert (i < params.get()->values.size()); float* v = fx.v + fx.d.batch_size() * (b % fx.d.batch_elems()); -#if HAVE_CUDA +#if __CUDACC__ cudaMemcpyAsync(v, params.get()->values[i].v, fx.d.batch_size() * sizeof(float), cudaMemcpyDeviceToDevice); #else // we should use colwise() instead of memcpy to get rid of the @@ -171,27 +201,16 @@ void LookupNode::forward_impl(const vector& xs, Tensor& fx) const } } -void LookupNode::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { +template +void LookupNode::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { cerr << "called backward() on arity 0 node\n"; abort(); } - -void LookupNode::accumulate_grad(const Tensor& g) { - if(pindex) { - params.get()->accumulate_grad(*pindex, g); - } else { - assert (pindices); - const vector& gb = g.batch_elems(); - for (unsigned b = 0; b < pindices->size(); ++b) { - unsigned i = pindices->at(b); - assert (i < params.get()->values.size()); - params.get()->accumulate_grad(i, gb[b]); - } - } -} +CNN_NODE_INST_DEV_IMPL(LookupNode) } // namespace cnn diff --git a/cnn/param-nodes.h b/cnn/param-nodes.h index 340a48d35..de24faed5 100644 --- a/cnn/param-nodes.h +++ b/cnn/param-nodes.h @@ -3,6 +3,7 @@ #include "cnn/cnn.h" #include "cnn/model.h" +#include "cnn/node-macros.h" namespace cnn { @@ -13,14 +14,7 @@ struct ParameterNodeBase : public Node { // represents optimizable parameters struct ParameterNode : public ParameterNodeBase { explicit ParameterNode(Parameter p) : dim(p.get()->dim), params(p) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() void accumulate_grad(const Tensor& g) override; Dim dim; Parameter params; @@ -29,14 +23,7 @@ struct ParameterNode : public ParameterNodeBase { // represents optimizable parameters that are being held constant struct ConstParameterNode : public Node { explicit ConstParameterNode(Parameter p) : dim(p.get()->dim), params(p) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() Dim dim; Parameter params; }; @@ -45,15 +32,8 @@ struct ConstParameterNode : public Node { struct InputNode : public Node { explicit InputNode(const Dim& d, const std::vector& dat) : dim(d), data(dat), pdata(&data) {} explicit InputNode(const Dim& d, const std::vector* pdat) : dim(d), data(), pdata(pdat) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; + CNN_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; Dim dim; const std::vector data; const std::vector* pdata; @@ -63,14 +43,7 @@ struct InputNode : public Node { struct ScalarInputNode : public Node { explicit ScalarInputNode(real s) : data(s), pdata(&data) {} explicit ScalarInputNode(const real* ps) : data(), pdata(ps) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() const cnn::real data; const cnn::real* pdata; }; @@ -85,15 +58,8 @@ struct LookupNode : public ParameterNodeBase { LookupNode(LookupParameter p, const std::vector* pindices) : dim(p.get()->dim), index(), pindex(), indices(), pindices(pindices), params(p) { dim.bd = pindices->size(); } - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; + CNN_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; void accumulate_grad(const Tensor& g) override; Dim dim; unsigned index; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 7d9817003..54d05780b 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -32,6 +32,9 @@ struct NodeTest { std::vector param_scalar1_vals = {2.2f}; std::vector param_scalar2_vals = {1.1f}; std::vector param_square1_vals = {1.1f,2.2f,3.3f,1.2f,2.2f,3.2f,1.3f,2.3f,3.3f}; + std::vector param_cube1_vals = {1.1f,2.2f,3.3f,1.2f,2.2f,3.2f,1.3f,2.3f,3.3f, + 11.1f,12.2f,13.3f,11.2f,12.2f,13.2f,11.3f,12.3f,13.3f, + 21.1f,22.2f,23.3f,21.2f,22.2f,23.2f,21.3f,22.3f,23.3f}; param1 = mod.add_parameters({3}); TensorTools::SetElements(param1.get()->values,param1_vals); param2 = mod.add_parameters({3}); @@ -44,6 +47,8 @@ struct NodeTest { TensorTools::SetElements(param_scalar2.get()->values,param_scalar2_vals); param_square1 = mod.add_parameters({3,3}); TensorTools::SetElements(param_square1.get()->values,param_square1_vals); + param_cube1 = mod.add_parameters({3,3,3}); + TensorTools::SetElements(param_cube1.get()->values,param_cube1_vals); } ~NodeTest() { for (auto x : av) free(x); @@ -61,7 +66,7 @@ struct NodeTest { std::vector ones3_vals, ones2_vals, first_one_vals, batch_vals; std::vector av; cnn::Model mod; - cnn::Parameter param1, param2, param3, param_scalar1, param_scalar2, param_square1; + cnn::Parameter param1, param2, param3, param_scalar1, param_scalar2, param_square1, param_cube1; }; // define the test suite @@ -251,11 +256,30 @@ BOOST_AUTO_TEST_CASE( colwise_add_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } -// Expression contract3d_1d(const Expression& x, const Expression& y); -// TODO - // Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b); -// TODO +BOOST_AUTO_TEST_CASE( contract3d_1d_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression square1 = parameter(cg, param_square1); + Expression cube1 = parameter(cg, param_cube1); + Expression y = contract3d_1d(cube1, x1, square1); + Expression ones3 = input(cg, {1,3}, ones3_vals); + ones3 * y * transpose(ones3); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z, const Expression& b); +BOOST_AUTO_TEST_CASE( contract3d_1d_1d_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + Expression x3 = parameter(cg, param3); + Expression cube1 = parameter(cg, param_cube1); + Expression y = contract3d_1d_1d(cube1, x1, x2, x3); + Expression ones3 = input(cg, {1,3}, ones3_vals); + ones3 * y; + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} // Expression sqrt(const Expression& x); BOOST_AUTO_TEST_CASE( sqrt_gradient ) { From ebcb7a6ceed0dc20fa19a6229307bd4c912b9822 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 31 May 2016 15:29:59 +0900 Subject: [PATCH 508/965] Changed file name for convenience --- cnn/{node-macros.h => nodes-macros.h} | 0 cnn/nodes.cc | 2 +- cnn/nodes.h | 4 ++-- cnn/param-nodes.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename cnn/{node-macros.h => nodes-macros.h} (100%) diff --git a/cnn/node-macros.h b/cnn/nodes-macros.h similarity index 100% rename from cnn/node-macros.h rename to cnn/nodes-macros.h diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 320ae1d9f..7a2e866cc 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -6,7 +6,7 @@ #include "cnn/simd-functors.h" #include "cnn/functors.h" -#include "cnn/node-macros.h" +#include "cnn/nodes-macros.h" #ifdef HAVE_CUDA #include "cnn/cuda.h" diff --git a/cnn/nodes.h b/cnn/nodes.h index ff5715afd..147a48f35 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -3,9 +3,9 @@ #include "cnn/cnn.h" #include "cnn/devices.h" -#include "cnn/node-macros.h" +#include "cnn/nodes-macros.h" -// See node-macros.h for more details about CNN_NODE_DEFINE_DEV_IMPL. +// See nodes-macros.h for more details about CNN_NODE_DEFINE_DEV_IMPL. namespace cnn { diff --git a/cnn/param-nodes.h b/cnn/param-nodes.h index de24faed5..8c6935573 100644 --- a/cnn/param-nodes.h +++ b/cnn/param-nodes.h @@ -3,7 +3,7 @@ #include "cnn/cnn.h" #include "cnn/model.h" -#include "cnn/node-macros.h" +#include "cnn/nodes-macros.h" namespace cnn { From b8198213394ad66355e64ac44ff27248d285c061 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 31 May 2016 17:13:52 +0900 Subject: [PATCH 509/965] Tensorified concatenate and average --- cnn/nodes.cc | 405 ++++++++++++++++++++++++++++----------------------- cnn/nodes.h | 55 +------ 2 files changed, 232 insertions(+), 228 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 7a2e866cc..1dcdce73b 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -40,30 +40,6 @@ namespace cnn { // ======= Functions to be compiled on only CPU #ifndef __CUDACC__ -void KMHNGram::forward_impl(const vector& xs, Tensor& fx) const { - auto x = **xs[0]; - const int new_cols = x.cols() - n + 1; - assert(new_cols > 0); - auto res = *fx; - res.setZero(); - for (int j = 0; j < new_cols; ++j) { - auto c_j = res.col(j); - for (unsigned k = 0; k < n; ++k) - c_j += x.col(j + k); - } -} - -void KMHNGram::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - const int c = dEdf.d.cols(); - for (int j = 0; j < c; ++j) - for (unsigned k = 0; k < n; ++k) - (*dEdxi).col(j+k) += (*dEdf).col(j); -} - template EIGEN_STRONG_INLINE float logsumexp(const T& x) { using std::exp; @@ -108,160 +84,6 @@ inline typename MatrixType::Scalar logdet(const MatrixType& M, bool use_cholesky return ld; } -// this i need to do something better, but this is a work-around -// if this is too small, just make it bigger -#define MAX_LOG_SUM_EXP 65536 -size_t LogSumExp::aux_storage_size() const { - return MAX_LOG_SUM_EXP * sizeof(float); -} - -void LogSumExp::forward_impl(const vector& xs, Tensor& fx) const { - const unsigned num_args = xs.size(); - if (num_args == 1) { - fx.v = xs[0]->v; - return; - } - for (unsigned i = 0; i < xs.size(); ++i) - static_cast(aux_mem)[i] = (**xs[i])(0,0); - Dim r = {(unsigned int)xs.size()}; - Tensor v(r, static_cast(aux_mem), fx.device); - fx.v[0] = logsumexp(*v); -} - -void LogDet::forward_impl(const vector& xs, Tensor& fx) const { - fx.v[0] = logdet(**xs[0], false); -} - -void LogSumExp::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - if (xs.size() == 0) { - *dEdxi += *dEdf; - return; - } - // df/dx_i = 1/{sum_j exp(x_j)} * exp(x_i)} - // = 1/{exp f(x)} * exp(x_i) - // = exp(x_i - f(x)) - auto d = *dEdxi; - d.array() += (**xs[i] - *fx).array().exp() * (*dEdf).array(); -} - -void LogDet::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - auto trans = (**xs[0]).transpose(); - (*dEdxi) += (dEdf.v[0]) * trans.inverse(); -} - -void Average::forward_impl(const vector& xs, Tensor& fx) const { - const unsigned num_args = xs.size(); - if (num_args == 1) { - fx.v = xs[0]->v; - return; - } - auto res = fx.vec(); - const unsigned remainder = num_args % 4; - switch (remainder) { - case 0: res.setZero(); break; - case 1: res = xs[0]->vec(); break; - case 2: res = xs[0]->vec() + xs[1]->vec(); break; - case 3: res = xs[0]->vec() + xs[1]->vec() + xs[2]->vec(); break; - } - for (unsigned i = remainder; i < num_args; i += 4) - res += xs[i]->vec() + xs[i+1]->vec() + xs[i+2]->vec() + xs[i+3]->vec(); - res /= num_args; -} - -void Average::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - dEdxi.vec() += (dEdf.vec() / xs.size()); -} - -void Concatenate::forward_impl(const vector& xs, Tensor& fx) const { - unsigned rows = 0; - for (auto x : xs) rows += x->d.rows(); - // the following should use auxiliary memory - src_row_indices.resize(xs.size()); - unsigned ind = 0; - unsigned k = 0; - for (auto x : xs) { - src_row_indices[k++] = ind; - auto & xi = *x; - const unsigned rows = xi.d.rows(); -#if HAVE_CUDA - assert(xi.d.cols() == 1); // this can be relaxed to the same everywhere - CUDA_CHECK(cudaMemcpyAsync(&fx.v[ind], &xi.v[0], sizeof(float) * rows, cudaMemcpyDeviceToDevice)); -#else - (*fx).middleRows(ind, rows) = *xi; -#endif - ind += rows; - } -} - -void Concatenate::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i < src_row_indices.size()); - const unsigned rows = dEdxi.d.rows(); - const unsigned begin = src_row_indices[i]; -#if HAVE_CUDA - CUBLAS_CHECK(cublasSaxpy(cublas_handle, rows, kSCALAR_ONE, &dEdf.v[begin], 1, dEdxi.v, 1)); -#else - *dEdxi += (*dEdf).middleRows(begin, rows); -#endif -} - -#define MAX_CONCAT_COLS_ARGS 512 -size_t ConcatenateColumns::aux_storage_size() const { - return MAX_CONCAT_COLS_ARGS * sizeof(unsigned); -} - -void ConcatenateColumns::forward_impl(const vector& xs, Tensor& fx) const { - unsigned c = 0; - assert(xs.size() < MAX_CONCAT_COLS_ARGS); - for (unsigned i = 0; i < xs.size(); ++i) { - static_cast(aux_mem)[i] = c; -#if HAVE_CUDA - assert(xs[i]->d.cols() == 1); - // CUBLAS matricies are column-major, so just copy the memory - auto & xi = *xs[i]; - const unsigned rows = xi.d.rows(); - CUDA_CHECK(cudaMemcpyAsync(&fx.v[i*rows], &xi.v[0], sizeof(float) * rows, cudaMemcpyDeviceToDevice)); -#else - auto xi = **xs[i]; - int d = xi.cols(); - (*fx).middleCols(c, d) = xi; - c += d; -#endif - } -} - -void ConcatenateColumns::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#if HAVE_CUDA - const unsigned rows = dEdxi.d.rows(); - const unsigned begin = i*rows; - CUBLAS_CHECK(cublasSaxpy(cublas_handle, rows, kSCALAR_ONE, &dEdf.v[begin], 1, dEdxi.v, 1)); -#else - auto dEdx = *dEdxi; - int d = dEdx.cols(); - int c = static_cast(aux_mem)[i]; - dEdx += (*dEdf).middleCols(c, d); -#endif -} - void MaxPooling1D::forward_impl(const vector& xs, Tensor& fx) const { cerr << "FIX IMPL5\n"; abort(); #if 0 @@ -449,6 +271,11 @@ size_t BlockDropout::aux_storage_size() const { return 1 * sizeof(float); } +#define MAX_CONCAT_COLS_ARGS 512 +size_t ConcatenateColumns::aux_storage_size() const { + return MAX_CONCAT_COLS_ARGS * sizeof(unsigned); +} + size_t Dropout::aux_storage_size() const { return dim.size() * sizeof(float); } @@ -461,6 +288,13 @@ size_t Hinge::aux_storage_size() const { return dim.size() * sizeof(float); } +// this i need to do something better, but this is a work-around +// if this is too small, just make it bigger +#define MAX_LOG_SUM_EXP 65536 +size_t LogSumExp::aux_storage_size() const { + return MAX_LOG_SUM_EXP * sizeof(float); +} + size_t Max::aux_storage_size() const { return dim.size() * sizeof(float); } @@ -474,7 +308,6 @@ size_t Sparsemax::aux_storage_size() const { } #define MAX_SPARSEMAX_LOSS_ROWS 65536 - size_t SparsemaxLoss::aux_storage_size() const { // first dim.size dimensions is the sparsemax const unsigned rows = MAX_SPARSEMAX_LOSS_ROWS; // this should be xs[0]->d.rows() @@ -648,6 +481,118 @@ void AffineTransform::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(AffineTransform) +template +void Average::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + const unsigned num_args = xs.size(); + if (num_args == 1) { + fx.v = xs[0]->v; + return; + } + auto res = fx.tvec(); + const unsigned remainder = num_args % 4; + switch (remainder) { + case 0: res.setZero(); break; + case 1: res.device(*dev.edevice) = xs[0]->tvec(); break; + case 2: res.device(*dev.edevice) = xs[0]->tvec() + xs[1]->tvec(); break; + case 3: res.device(*dev.edevice) = xs[0]->tvec() + xs[1]->tvec() + xs[2]->tvec(); break; + } + for (unsigned i = remainder; i < num_args; i += 4) + res.device(*dev.edevice) += xs[i]->tvec() + xs[i+1]->tvec() + xs[i+2]->tvec() + xs[i+3]->tvec(); + res.device(*dev.edevice) = res / (float)num_args; +} + +template +void Average::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + dEdxi.tvec().device(*dev.edevice) += (dEdf.tvec() / (float)xs.size()); +} +CNN_NODE_INST_DEV_IMPL(Average) + +template +void Concatenate::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + unsigned rows = 0; + for (auto x : xs) rows += x->d.rows(); + // the following should use auxiliary memory + src_row_indices.resize(xs.size()); + unsigned ind = 0; + unsigned k = 0; + for (auto x : xs) { + src_row_indices[k++] = ind; + auto & xi = *x; + const unsigned rows = xi.d.rows(); +#if __CUDACC__ + assert(xi.d.cols() == 1); // this can be relaxed to the same everywhere + CUDA_CHECK(cudaMemcpyAsync(&fx.v[ind], &xi.v[0], sizeof(float) * rows, cudaMemcpyDeviceToDevice)); +#else + (*fx).middleRows(ind, rows) = *xi; +#endif + ind += rows; + } +} + +template +void Concatenate::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < src_row_indices.size()); + const unsigned rows = dEdxi.d.rows(); + const unsigned begin = src_row_indices[i]; +#if __CUDACC__ + CUBLAS_CHECK(cublasSaxpy(cublas_handle, rows, kSCALAR_ONE, &dEdf.v[begin], 1, dEdxi.v, 1)); +#else + *dEdxi += (*dEdf).middleRows(begin, rows); +#endif +} +CNN_NODE_INST_DEV_IMPL(Concatenate) + +template +void ConcatenateColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + unsigned c = 0; + assert(xs.size() < MAX_CONCAT_COLS_ARGS); + for (unsigned i = 0; i < xs.size(); ++i) { + static_cast(aux_mem)[i] = c; +#if __CUDACC__ + assert(xs[i]->d.cols() == 1); + // CUBLAS matricies are column-major, so just copy the memory + auto & xi = *xs[i]; + const unsigned rows = xi.d.rows(); + CUDA_CHECK(cudaMemcpyAsync(&fx.v[i*rows], &xi.v[0], sizeof(float) * rows, cudaMemcpyDeviceToDevice)); +#else + auto xi = **xs[i]; + int d = xi.cols(); + (*fx).middleCols(c, d) = xi; + c += d; +#endif + } +} + +template +void ConcatenateColumns::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { +#if __CUDACC__ + const unsigned rows = dEdxi.d.rows(); + const unsigned begin = i*rows; + CUBLAS_CHECK(cublasSaxpy(cublas_handle, rows, kSCALAR_ONE, &dEdf.v[begin], 1, dEdxi.v, 1)); +#else + auto dEdx = *dEdxi; + int d = dEdx.cols(); + int c = static_cast(aux_mem)[i]; + dEdx += (*dEdf).middleCols(c, d); +#endif +} +CNN_NODE_INST_DEV_IMPL(ConcatenateColumns) + template void BinaryLogLoss::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { fx.t<0>().device(*dev.edevice) = xs[0]->tvec().binaryExpr(xs[1]->tvec(), FBinaryLogLoss()).sum(); @@ -1042,6 +987,42 @@ void InnerProduct3D_1D_1D::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D_1D) +template +void KMHNGram::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { +#ifdef __CUDACC__ + throw std::runtime_error("KMHNGram not implemented on GPU"); +#else + auto x = **xs[0]; + const int new_cols = x.cols() - n + 1; + assert(new_cols > 0); + auto res = *fx; + res.setZero(); + for (int j = 0; j < new_cols; ++j) { + auto c_j = res.col(j); + for (unsigned k = 0; k < n; ++k) + c_j += x.col(j + k); + } +#endif +} + +template +void KMHNGram::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { +#ifdef __CUDACC__ + throw std::runtime_error("KMHNGram not implemented on GPU"); +#else + const int c = dEdf.d.cols(); + for (int j = 0; j < c; ++j) + for (unsigned k = 0; k < n; ++k) + (*dEdxi).col(j+k) += (*dEdf).col(j); +#endif +} +CNN_NODE_INST_DEV_IMPL(KMHNGram) + template void L1Distance::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 2); @@ -1076,6 +1057,31 @@ void Log::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(Log) +template +void LogDet::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { +#ifdef __CUDACC__ + throw std::runtime_error("LogDet not implemented on GPU"); +#else + fx.v[0] = logdet(**xs[0], false); +#endif +} + +template +void LogDet::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { +#ifdef __CUDACC__ + throw std::runtime_error("KMHNGram not implemented on GPU"); +#else + auto trans = (**xs[0]).transpose(); + (*dEdxi) += (dEdf.v[0]) * trans.inverse(); +#endif +} +CNN_NODE_INST_DEV_IMPL(LogDet) + template void LogGamma::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { fx.tvec().device(*dev.edevice) = xs[0]->tvec().lgamma(); @@ -1145,6 +1151,47 @@ void LogSoftmax::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(LogSoftmax) +template +void LogSumExp::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { +#ifdef __CUDACC__ + throw std::runtime_error("LogSumExp not implemented on GPU"); +#else + const unsigned num_args = xs.size(); + if (num_args == 1) { + fx.v = xs[0]->v; + return; + } + for (unsigned i = 0; i < xs.size(); ++i) + static_cast(aux_mem)[i] = (**xs[i])(0,0); + Dim r = {(unsigned int)xs.size()}; + Tensor v(r, static_cast(aux_mem), fx.device); + fx.v[0] = logsumexp(*v); +#endif +} + +template +void LogSumExp::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { +#ifdef __CUDACC__ + throw std::runtime_error("LogSumExp not implemented on GPU"); +#else + if (xs.size() == 0) { + *dEdxi += *dEdf; + return; + } + // df/dx_i = 1/{sum_j exp(x_j)} * exp(x_i)} + // = 1/{exp f(x)} * exp(x_i) + // = exp(x_i - f(x)) + auto d = *dEdxi; + d.array() += (**xs[i] - *fx).array().exp() * (*dEdf).array(); +#endif +} +CNN_NODE_INST_DEV_IMPL(LogSumExp) + template void MatrixInverse::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); diff --git a/cnn/nodes.h b/cnn/nodes.h index 147a48f35..ec60608ea 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -133,14 +133,7 @@ struct SumColumns : public Node { // y_i = \sum_{j=1}^n x_1:{i-1+j} struct KMHNGram : public Node { explicit KMHNGram(const std::initializer_list& a, unsigned n) : Node(a), n(n) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() unsigned n; // width, n=2 for Karl's paper }; @@ -266,14 +259,7 @@ struct Log : public Node { // concatenate rows struct Concatenate : public Node { template explicit Concatenate(const T& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() // src_row_indices[i] says what row in fx the ith x vector was assigned to // used to simplify backprop mutable std::vector src_row_indices; @@ -283,15 +269,8 @@ struct Concatenate : public Node { // x_i must be a column vector in R^n struct ConcatenateColumns : public Node { template explicit ConcatenateColumns(const T& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; + CNN_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; }; // x_1 is a scalar (or row vector) @@ -397,28 +376,13 @@ struct BinaryLogLoss : public Node { // done in log space carefully to avoid over/underflow issues struct LogSumExp : public Node { template explicit LogSumExp(const T& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; + CNN_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; }; struct LogDet : public Node { template explicit LogDet(const T& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - //size_t aux_storage_size() const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = \sum_i x_i @@ -439,15 +403,8 @@ struct SumBatches : public Node { // y = ( \sum_i x_i ) / |x| struct Average : public Node { template explicit Average(const T& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; + CNN_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; }; // this is used to implement poisson regression From 072a3e3775337b14434637b72dfe202035dedbe7 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 31 May 2016 17:28:06 +0900 Subject: [PATCH 510/965] Added final nodes with device-specific code --- cnn/nodes.cc | 350 +++++++++++++++++++++++++++------------------------ cnn/nodes.h | 36 +----- 2 files changed, 187 insertions(+), 199 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 1dcdce73b..3df146f4f 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -84,54 +84,6 @@ inline typename MatrixType::Scalar logdet(const MatrixType& M, bool use_cholesky return ld; } -void MaxPooling1D::forward_impl(const vector& xs, Tensor& fx) const { - cerr << "FIX IMPL5\n"; abort(); -#if 0 - assert(xs.size() == 1); - const Tensor& x = *xs.front(); - const unsigned x_rows = x.rows(); - assert(x.cols() == 1); - const unsigned fx_rows = x_rows / width; - ind.resize(fx_rows); - Tensor fx = Zero(Dim(fx_rows, 1)); - for (unsigned i = 0; i < fx_rows; ++i) { - unsigned from = i * width; - unsigned to = from + width; - if (to > x_rows) to = x_rows; - real best = x(from, 0); - unsigned bestr = from; - for (unsigned r = from + 1; r < to; ++r) { - if (x(r, 0) > best) { - best = x(r,0); - bestr = r; - } - } - ind[i] = bestr; - fx(i, 0) = best; - } - return fx; -#endif -} - -void MaxPooling1D::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - cerr << "FIX IMPL6\n"; abort(); -#if 0 - const Tensor& x = *xs.front(); - const unsigned x_rows = x.rows(); - Tensor dEdx = Zero(Dim(x_rows, 1)); - const unsigned fx_rows = x_rows / width; - assert(fx_rows == ind.size()); - assert(fx_rows == dEdf.rows()); - for (unsigned i = 0; i < fx_rows; ++i) - dEdx(ind[i], 0) = dEdf(i, 0); - return dEdx; -#endif -} - template EIGEN_STRONG_INLINE real logsumexp(const T& x, const vector& denom) { real m = x(denom[0],0); @@ -145,125 +97,6 @@ EIGEN_STRONG_INLINE real logsumexp(const T& x, const vector& denom) { return m + logf(z); } -void RestrictedLogSoftmax::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("RestrictedLogSoftmax not yet implemented for CUDA"); -#else - // TODO create auxiliary mask with -infty's - // and do usual LogSoftmax stuff - assert(xs.size() == 1); - assert(denom.size() > 0); - auto x = **xs[0]; - assert(x.cols() == 1); - const real logz = logsumexp(x, denom); - TensorTools::Constant(fx, -numeric_limits::infinity()); - for (auto i : denom) - (*fx)(i,0) = x(i,0) - logz; - if (denom.size() == 1) (*fx)(denom.front(), 0) = 0; -#endif -} - -void RestrictedLogSoftmax::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i == 0); -#ifdef HAVE_CUDA - throw std::runtime_error("RestrictedLogSoftmax not yet implemented for CUDA"); -#else - float z = 0; - for (auto ind : denom) - z += (*dEdf)(ind, 0); - for (auto ind : denom) - (*dEdxi)(ind, 0) += (*dEdf)(ind, 0) - expf((*fx)(ind, 0)) * z; -#endif -} - -// x_1 is a vector -// y = (x_1)_{*pval} -void PickElement::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("PickElement not yet implemented for CUDA"); -#else - if(pval) { - if (*pval >= xs[0]->d.rows()) { - cerr << "PickElement::forward_impl requested element " << *pval - << " from a vector of length " << xs[0]->d.rows() << endl; - abort(); - } - auto x = **xs[0]; - fx.v[0] = x(*pval); - } else { - assert(pvals); - assert(pvals->size() == fx.d.batch_elems()); - for(unsigned b = 0; b < pvals->size(); ++b) { - if ((*pvals)[b] >= xs[0]->d.rows()) { - cerr << "PickElement::forward_impl requested element " << (*pvals)[b] - << " from a vector of length " << xs[0]->d.rows() << endl; - abort(); - } - auto x = xs[0]->batch_matrix(b); - fx.v[b] = x((*pvals)[b]); - } - } -#endif -} - -// derivative is 0 in all dimensions except 1 for the selected element -void PickElement::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i == 0); -#ifdef HAVE_CUDA - throw std::runtime_error("PickElement not yet implemented for CUDA"); -#else - if(pval) { - (*dEdxi)(*pval) += dEdf.v[0]; - } else { - assert(pvals); - for(unsigned b = 0; b < pvals->size(); ++b) - dEdxi.batch_matrix(b)((*pvals)[b]) += dEdf.v[b]; - } -#endif -} - -// x_1 is a vector -// y = (x_1)[start:end] -// slice of vector from index start (inclusive) to index end (exclusive) -void PickRange::forward_impl(const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); - auto x = **xs[0]; - assert(x.cols() == 1); - assert(start >= 0); - assert(end <= x.rows()); - assert(start < end); - assert(int(fx.d.rows()) == int(end-start)); -#if HAVE_CUDA - CUDA_CHECK(cudaMemcpyAsync(&fx.v[0], &xs[0]->v[start], sizeof(float) * (end-start), cudaMemcpyDeviceToDevice)); -#else - (*fx) = x.block(start, 0, end-start, 1); -#endif -} - -// derivative is 0 in all dimensions except the slice range -void PickRange::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - assert(i == 0); - assert(int(dEdf.d.rows()) == int(end-start)); - assert(dEdf.d.cols() == 1); -#if HAVE_CUDA - CUBLAS_CHECK(cublasSaxpy(cublas_handle, end-start, kSCALAR_ONE, dEdf.v, 1, &dEdxi.v[start], 1)); -#else - (*dEdxi).block(start, 0, end-start, 1) += (*dEdf); -#endif -} - // ===== Auxiliary functions size_t BlockDropout::aux_storage_size() const { @@ -1324,6 +1157,58 @@ void Max::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(Max) +template +void MaxPooling1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + throw std::runtime_error("MaxPooling1D::forward_dev_impl not implemented yet"); +#if 0 + assert(xs.size() == 1); + const Tensor& x = *xs.front(); + const unsigned x_rows = x.rows(); + assert(x.cols() == 1); + const unsigned fx_rows = x_rows / width; + ind.resize(fx_rows); + Tensor fx = Zero(Dim(fx_rows, 1)); + for (unsigned i = 0; i < fx_rows; ++i) { + unsigned from = i * width; + unsigned to = from + width; + if (to > x_rows) to = x_rows; + real best = x(from, 0); + unsigned bestr = from; + for (unsigned r = from + 1; r < to; ++r) { + if (x(r, 0) > best) { + best = x(r,0); + bestr = r; + } + } + ind[i] = bestr; + fx(i, 0) = best; + } + return fx; +#endif +} + +template +void MaxPooling1D::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + throw std::runtime_error("MaxPooling1D::backward_dev_impl not implemented yet"); +#if 0 + const Tensor& x = *xs.front(); + const unsigned x_rows = x.rows(); + Tensor dEdx = Zero(Dim(x_rows, 1)); + const unsigned fx_rows = x_rows / width; + assert(fx_rows == ind.size()); + assert(fx_rows == dEdf.rows()); + for (unsigned i = 0; i < fx_rows; ++i) + dEdx(ind[i], 0) = dEdf(i, 0); + return dEdx; +#endif +} +CNN_NODE_INST_DEV_IMPL(MaxPooling1D) + template void Min::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { Tensor t(fx.d, static_cast(aux_mem), fx.device); @@ -1386,6 +1271,60 @@ void PairwiseRankLoss::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(PairwiseRankLoss) +// x_1 is a vector +// y = (x_1)_{*pval} +template +void PickElement::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { +#ifdef __CUDACC__ + throw std::runtime_error("PickElement not yet implemented for CUDA"); +#else + if(pval) { + if (*pval >= xs[0]->d.rows()) { + cerr << "PickElement::forward_impl requested element " << *pval + << " from a vector of length " << xs[0]->d.rows() << endl; + abort(); + } + auto x = **xs[0]; + fx.v[0] = x(*pval); + } else { + assert(pvals); + assert(pvals->size() == fx.d.batch_elems()); + for(unsigned b = 0; b < pvals->size(); ++b) { + if ((*pvals)[b] >= xs[0]->d.rows()) { + cerr << "PickElement::forward_impl requested element " << (*pvals)[b] + << " from a vector of length " << xs[0]->d.rows() << endl; + abort(); + } + auto x = xs[0]->batch_matrix(b); + fx.v[b] = x((*pvals)[b]); + } + } +#endif +} + +// derivative is 0 in all dimensions except 1 for the selected element +template +void PickElement::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i == 0); +#ifdef __CUDACC__ + throw std::runtime_error("PickElement not yet implemented for CUDA"); +#else + if(pval) { + (*dEdxi)(*pval) += dEdf.v[0]; + } else { + assert(pvals); + for(unsigned b = 0; b < pvals->size(); ++b) + dEdxi.batch_matrix(b)((*pvals)[b]) += dEdf.v[b]; + } +#endif +} +CNN_NODE_INST_DEV_IMPL(PickElement) + template void PickNegLogSoftmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { @@ -1470,6 +1409,44 @@ void PickNegLogSoftmax::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(PickNegLogSoftmax) +// x_1 is a vector +// y = (x_1)[start:end] +// slice of vector from index start (inclusive) to index end (exclusive) +template +void PickRange::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + auto x = **xs[0]; + assert(x.cols() == 1); + assert(start >= 0); + assert(end <= x.rows()); + assert(start < end); + assert(int(fx.d.rows()) == int(end-start)); +#if __CUDACC__ + CUDA_CHECK(cudaMemcpyAsync(&fx.v[0], &xs[0]->v[start], sizeof(float) * (end-start), cudaMemcpyDeviceToDevice)); +#else + (*fx) = x.block(start, 0, end-start, 1); +#endif +} + +// derivative is 0 in all dimensions except the slice range +template +void PickRange::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i == 0); + assert(int(dEdf.d.rows()) == int(end-start)); + assert(dEdf.d.cols() == 1); +#if __CUDACC__ + CUBLAS_CHECK(cublasSaxpy(cublas_handle, end-start, kSCALAR_ONE, dEdf.v, 1, &dEdxi.v[start], 1)); +#else + (*dEdxi).block(start, 0, end-start, 1) += (*dEdf); +#endif +} +CNN_NODE_INST_DEV_IMPL(PickRange) + template void PoissonRegressionLoss::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { const real y = *pty; @@ -1551,6 +1528,45 @@ void Reshape::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(Reshape) +template +void RestrictedLogSoftmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { +#ifdef __CUDACC__ + throw std::runtime_error("RestrictedLogSoftmax not yet implemented for CUDA"); +#else + // TODO create auxiliary mask with -infty's + // and do usual LogSoftmax stuff + assert(xs.size() == 1); + assert(denom.size() > 0); + auto x = **xs[0]; + assert(x.cols() == 1); + const real logz = logsumexp(x, denom); + TensorTools::Constant(fx, -numeric_limits::infinity()); + for (auto i : denom) + (*fx)(i,0) = x(i,0) - logz; + if (denom.size() == 1) (*fx)(denom.front(), 0) = 0; +#endif +} + +template +void RestrictedLogSoftmax::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i == 0); +#ifdef __CUDACC__ + throw std::runtime_error("RestrictedLogSoftmax not yet implemented for CUDA"); +#else + float z = 0; + for (auto ind : denom) + z += (*dEdf)(ind, 0); + for (auto ind : denom) + (*dEdxi)(ind, 0) += (*dEdf)(ind, 0) - expf((*fx)(ind, 0)) * z; +#endif +} +CNN_NODE_INST_DEV_IMPL(RestrictedLogSoftmax) + template void SelectCols::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); diff --git a/cnn/nodes.h b/cnn/nodes.h index ec60608ea..7605605ff 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -308,14 +308,7 @@ struct Identity : public Node { // y_i = max_{x_{i * width - width + 1}, ..., x_{i * width}} struct MaxPooling1D : public Node { MaxPooling1D(const std::initializer_list& a, unsigned w) : Node(a), width(w) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() unsigned width; mutable std::vector ind; }; @@ -498,14 +491,7 @@ struct PickNegLogSoftmax : public Node { // y_i = (x_1)_i - \log z struct RestrictedLogSoftmax : public Node { explicit RestrictedLogSoftmax(const std::initializer_list& a, const std::vector& d) : Node(a), denom(d) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() std::vector denom; }; @@ -519,15 +505,8 @@ struct PickElement : public Node { // use these constructors if you want to change the value after the graph is constructed explicit PickElement(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv), vals(), pvals() {} explicit PickElement(const std::initializer_list& a, const std::vector* pv) : Node(a), val(), pval(), vals(), pvals(pv) {} + CNN_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; unsigned val; const unsigned* pval; std::vector vals; @@ -539,14 +518,7 @@ struct PickElement : public Node { // (start inclusive, end exclusive) struct PickRange : public Node { explicit PickRange(const std::initializer_list& a, unsigned start, unsigned end) : Node(a), start(start), end(end) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() unsigned start; unsigned end; }; From 983ab772fdb4947ea33f34a1be01ccd6b8d786d3 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 31 May 2016 06:06:22 -0400 Subject: [PATCH 511/965] Small bug fixes for gpu --- cnn/CMakeLists.txt | 2 +- cnn/nodes.cc | 65 ++++++++++++++++++++++++++++++---------------- cnn/tensor.h | 1 - 3 files changed, 43 insertions(+), 25 deletions(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index ad3d58733..ae9cae1d1 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -106,7 +106,7 @@ target_link_libraries(cnn_shared ${LIBS}) #add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) - list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_20,code=sm_20;-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU") + list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU") SET(CUDA_PROPAGATE_HOST_FLAGS OFF) cuda_add_library(cnncuda STATIC gpu-ops.cu gpu-nodes.cu gpu-param-nodes.cu) endif(WITH_CUDA_BACKEND) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 3df146f4f..dfbcdf1a2 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -37,6 +37,11 @@ using namespace std; namespace cnn { +// ======= Shared definitions +#define MAX_CONCAT_COLS_ARGS 512 +#define MAX_LOG_SUM_EXP 65536 +#define MAX_SPARSEMAX_LOSS_ROWS 65536 + // ======= Functions to be compiled on only CPU #ifndef __CUDACC__ @@ -104,7 +109,6 @@ size_t BlockDropout::aux_storage_size() const { return 1 * sizeof(float); } -#define MAX_CONCAT_COLS_ARGS 512 size_t ConcatenateColumns::aux_storage_size() const { return MAX_CONCAT_COLS_ARGS * sizeof(unsigned); } @@ -123,7 +127,6 @@ size_t Hinge::aux_storage_size() const { // this i need to do something better, but this is a work-around // if this is too small, just make it bigger -#define MAX_LOG_SUM_EXP 65536 size_t LogSumExp::aux_storage_size() const { return MAX_LOG_SUM_EXP * sizeof(float); } @@ -140,7 +143,6 @@ size_t Sparsemax::aux_storage_size() const { return (dim.size() + 1) * sizeof(float); } -#define MAX_SPARSEMAX_LOSS_ROWS 65536 size_t SparsemaxLoss::aux_storage_size() const { // first dim.size dimensions is the sparsemax const unsigned rows = MAX_SPARSEMAX_LOSS_ROWS; // this should be xs[0]->d.rows() @@ -728,6 +730,10 @@ CNN_NODE_INST_DEV_IMPL(Identity) // Y_ij = A_ijk * B_k (+ C_ij) template void InnerProduct3D_1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { +#if __CUDACC__ + // TODO: this is giving a compile error + throw std::runtime_error("InnerProduct3D_1D::forward_dev_impl not implemented on CUDA"); +#else auto A = xs[0]->t<3>(); auto b = xs[1]->t<1>(); typedef Eigen::Tensor::DimensionPair DimPair; @@ -738,6 +744,7 @@ void InnerProduct3D_1D::forward_dev_impl(const MyDevice & dev, const vectort<2>(); fx.t<2>() = A.contract(b, dims) + C; } +#endif } template @@ -747,6 +754,10 @@ void InnerProduct3D_1D::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#if __CUDACC__ + // TODO: this is giving a compile error + throw std::runtime_error("InnerProduct3D_1D::forward_dev_impl not implemented on CUDA"); +#else auto tdEdf = dEdf.t<2>(); // 2 tensor typedef Eigen::Tensor::DimensionPair DimPair; if (i == 0) { // 3 tensor @@ -762,12 +773,17 @@ void InnerProduct3D_1D::backward_dev_impl(const MyDevice & dev, } else { cerr << "shouldn't happen\n"; abort(); } +#endif } CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D) // Y_ij = A_ijk * B_k * C_j (+ D_i) template void InnerProduct3D_1D_1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { +#if __CUDACC__ + // TODO: this is giving a compile error + throw std::runtime_error("InnerProduct3D_1D::forward_dev_impl not implemented on CUDA"); +#else auto A = xs[0]->t<3>(); auto b = xs[1]->t<1>(); auto c = xs[2]->t<1>(); @@ -780,6 +796,7 @@ void InnerProduct3D_1D_1D::forward_dev_impl(const MyDevice & dev, const vectort<1>(); fx.t<1>() = A.contract(b, dims).contract(c, dims2) + d; } +#endif } template @@ -789,6 +806,10 @@ void InnerProduct3D_1D_1D::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#if __CUDACC__ + // TODO: this is giving a compile error + throw std::runtime_error("InnerProduct3D_1D::forward_dev_impl not implemented on CUDA"); +#else auto tdEdf = dEdf.t<1>(); // vector typedef Eigen::Tensor::DimensionPair DimPair; if (i == 0) { // 3 tensor @@ -817,6 +838,7 @@ void InnerProduct3D_1D_1D::backward_dev_impl(const MyDevice & dev, } else { cerr << "shouldn't happen\n"; abort(); } +#endif } CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D_1D) @@ -1417,7 +1439,6 @@ void PickRange::forward_dev_impl(const MyDevice & dev, const vector= 0); assert(end <= x.rows()); assert(start < end); assert(int(fx.d.rows()) == int(end-start)); @@ -1450,7 +1471,7 @@ CNN_NODE_INST_DEV_IMPL(PickRange) template void PoissonRegressionLoss::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { const real y = *pty; - const auto z = lgamma(y + 1); + const auto z = std::lgamma(y + 1); // const auto x = as_scalar(*xs[0]); fx.t<0>().device(*dev.edevice) = xs[0]->t<0>().exp() + z - xs[0]->t<0>() * y; } @@ -1875,7 +1896,7 @@ void Sum::forward_dev_impl(const MyDevice & dev, const vector& xs fx.v = xs[0]->v; return; } -#if HAVE_CUDA +#if __CUDACC__ TensorTools::Zero(fx); for (unsigned i = 0; i < num_args; ++i) CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[i]->v, 1, fx.v, 1)); @@ -1901,7 +1922,7 @@ void Sum::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { -#if HAVE_CUDA +#if __CUDACC__ CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); #else dEdxi.vec() += dEdf.vec(); @@ -1913,7 +1934,7 @@ template void SumBatches::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); unsigned num_args = xs[0]->d.bd; -#if HAVE_CUDA +#if __CUDACC__ TensorTools::Zero(fx); for (unsigned i = 0; i < num_args; ++i) CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v + i * xs[0]->d.batch_size(), 1, fx.v, 1)); @@ -1939,7 +1960,7 @@ void SumBatches::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { assert(i == 0); -#if HAVE_CUDA +#if __CUDACC__ for (unsigned i = 0; i < dEdxi.d.bd; ++i) CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v + i * dEdxi.d.batch_size(), 1)); #else @@ -1952,9 +1973,10 @@ CNN_NODE_INST_DEV_IMPL(SumBatches) template void SumColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - array reduction_axis; - reduction_axis[0] = 1; - fx.t<1>().device(*dev.edevice) += xs[0]->t<2>().sum(reduction_axis); + throw std::runtime_error("SumColumns not implemented yet"); + // array reduction_axis; + // reduction_axis[0] = 1; + // fx.t<1>().device(*dev.edevice) += xs[0]->t<2>().sum(reduction_axis); } template @@ -1964,9 +1986,10 @@ void SumColumns::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - auto out = *dEdxi; - for(size_t i = 0; i < xs[0]->d[1]; i++) - dEdxi.t<1>() += dEdf.t<2>().chip<1>(i); + throw std::runtime_error("SumColumns not implemented yet"); + // TODO: This causes a compile error + // for(size_t i = 0; i < xs[0]->d[1]; i++) + // dEdxi.t<1>().device(*dev.edevice) += dEdf.t<2>().chip<1>(i); // TODO: This is not great. Can we use broadcasting similar to the following? // array broadcasts; // broadcasts[0] = 1; @@ -1977,7 +2000,7 @@ CNN_NODE_INST_DEV_IMPL(SumColumns) template void TraceOfProduct::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA +#ifdef __CUDACC__ throw std::runtime_error("TraceOfProduct not yet implemented for CUDA"); #else auto x1 = **xs[0]; @@ -2025,7 +2048,7 @@ void Transpose::forward_dev_impl(const MyDevice & dev, const vectorv; } else { -#if HAVE_CUDA +#if __CUDACC__ for(unsigned b = 0; b < xs[0]->d.bd; ++b) CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, fx.d.rows(), fx.d.cols(), kSCALAR_ONE, xs[0]->batch_ptr(b), xs[0]->d.rows(), kSCALAR_ZERO, NULL, fx.d.rows(), fx.batch_ptr(b), fx.d.rows())); @@ -2043,7 +2066,7 @@ void Transpose::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { -#if HAVE_CUDA +#if __CUDACC__ for(unsigned b = 0; b < xs[0]->d.bd; ++b) CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols(), kSCALAR_ONE, dEdf.batch_ptr(b), dEdf.d.rows(), kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows(), dEdxi.batch_ptr(b), dEdxi.d.rows())); @@ -2057,11 +2080,7 @@ CNN_NODE_INST_DEV_IMPL(Transpose) template void Zeroes::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 0); -#ifdef __CUDACC__ - cudaMemsetAsync(fx.v, 0, dim.size() * sizeof(float)); -#else - memset(fx.v, 0, dim.size() * sizeof(float)); -#endif + TensorTools::Zero(fx); } template diff --git a/cnn/tensor.h b/cnn/tensor.h index 048f329b3..33cded5e3 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -131,7 +131,6 @@ struct Tensor { std::vector bs(d.batch_elems()); unsigned bsize = d.batch_size(); Dim new_d = d; new_d.bd = 1; - assert (d.batch_elems() >= 0); for(unsigned b = 0; b < d.batch_elems(); ++b) bs[b] = Tensor(new_d, v + bsize * b, device); return bs; From 7f247753df53a624b945cdb5745b787c16c90da4 Mon Sep 17 00:00:00 2001 From: Daniel Hershcovich Date: Fri, 3 Jun 2016 22:20:25 +0300 Subject: [PATCH 512/965] Fix typos in PyCNN tutorial --- pyexamples/tutorials/tutorial-1-xor.ipynb | 28 +++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pyexamples/tutorials/tutorial-1-xor.ipynb b/pyexamples/tutorials/tutorial-1-xor.ipynb index 904e28657..d1a51617a 100644 --- a/pyexamples/tutorials/tutorial-1-xor.ipynb +++ b/pyexamples/tutorials/tutorial-1-xor.ipynb @@ -24,7 +24,7 @@ "There are two modes of operation:\n", "\n", "* __Static networks__, in which a network is built and then being fed with different inputs/outputs. Most NN packages work this way.\n", - "* __Dynamic networks__, in which a new network is built for each training example (sharing parameters with the networks of other trianing examples). This approach is what makes pyCNN unique, and where most of it power comes from.\n", + "* __Dynamic networks__, in which a new network is built for each training example (sharing parameters with the networks of other training examples). This approach is what makes pyCNN unique, and where most of its power comes from.\n", "\n", "We will describe both of these modes." ] @@ -33,9 +33,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Package Fundementals\n", + "## Package Fundamentals\n", "\n", - "The main piece of pyCNN is the `ComputationGraph`, which is what essentially defined a neural network.\n", + "The main piece of pyCNN is the `ComputationGraph`, which is what essentially defines a neural network.\n", "The `ComputationGraph` is composed of expressions, which relate to the inputs and outputs of the network,\n", "as well as the `Parameters` of the network. The parameters are the things in the network that are optimized over time, and all of the parameters sit inside a `Model`. There are `trainers` (for example `SimpleSGDTrainer`) that are in charge of setting the parameter values.\n", "\n", @@ -52,18 +52,18 @@ "\n", "The life-cycle of a pyCNN program is:\n", "1. Create a `Model`, and populate it with `Parameters`.\n", - "2. Renew the computation graph, and create `Expression` representing the network.\n", - " (the network will include the `Expression`s for the `Parameters` defined in the model)\n", + "2. Renew the computation graph, and create `Expression` representing the network\n", + " (the network will include the `Expression`s for the `Parameters` defined in the model).\n", "3. Optimize the model for the objective of the network.\n", "\n", "As an example, consider a model for solving the \"xor\" problem. The network has two inputs, which can be 0 or 1, and a single output which should be the xor of the two inputs.\n", "We will model this as a multi-layer perceptron with a single hidden node.\n", "\n", - "Let $x = x_1, x_2$ be our input. We will have a hidden-layer of 8 nodes, and an output layer of a single node. The activation on the hidden layer will be a $tanh$. Our network will then be:\n", + "Let $x = x_1, x_2$ be our input. We will have a hidden layer of 8 nodes, and an output layer of a single node. The activation on the hidden layer will be a $\\tanh$. Our network will then be:\n", "\n", - "$\\sigma(V(tanh(Wx+b)))$\n", + "$\\sigma(V(\\tanh(Wx+b)))$\n", "\n", - "Where $W$ is a $8 \\times 2$ matrix, and $V$ is an $8 \\times 1$ matrix, and $b$ is an 8-dim vector.\n", + "Where $W$ is a $8 \\times 2$ matrix, $V$ is an $8 \\times 1$ matrix, and $b$ is an 8-dim vector.\n", "\n", "We want the output to be either 0 or 1, so we take the output layer to be the logistic-sigmoid function, $\\sigma(x)$, that takes values between $-\\infty$ and $+\\infty$ and returns numbers in $[0,1]$.\n", "\n", @@ -130,7 +130,7 @@ "The second block creates a computation graph and adds the parameters to it, transforming them into `Expression`s.\n", "The need to distinguish model parameters from \"expressions\" will become clearer later.\n", "\n", - "We now make use of the W and V expressions, in order to created the complete expression for the network." + "We now make use of the W and V expressions, in order to create the complete expression for the network." ] }, { @@ -212,7 +212,7 @@ "metadata": {}, "source": [ "## Training\n", - "We now want to set the parameters weights such that the loss is minimized. \n", + "We now want to set the parameter weights such that the loss is minimized. \n", "\n", "For this, we will use a trainer object. A trainer is constructed with respect to the parameters of a given model." ] @@ -233,7 +233,7 @@ "metadata": {}, "source": [ "To use the trainer, we need to:\n", - "* **call the `forward_scalar`** method of `ComputationGraph`. This will run a forward pass through the network, calculating all the intermediate values until the last one (`loss`, in our case), and then convert the value to a scalar. (The final output of our network **must** be a single scalar value. However, if we do not care about the value, we can just use `cg.forward()` instead of `cg.forward_sclar()`.\n", + "* **call the `forward_scalar`** method of `ComputationGraph`. This will run a forward pass through the network, calculating all the intermediate values until the last one (`loss`, in our case), and then convert the value to a scalar. The final output of our network **must** be a single scalar value. However, if we do not care about the value, we can just use `cg.forward()` instead of `cg.forward_sclar()`.\n", "* **call the `backward`** method of `ComputationGraph`. This will run a backward pass from the last node, calculating the gradients with respect to minimizing the last expression (in our case we want to minimize the loss). The gradients are stored in the model, and we can now let the `trainer` take care of the optimization step.\n", "* **call `trainer.update()`** to optimize the values with respect to the latest gradients." ] @@ -265,7 +265,7 @@ "trainer.update()\n", "\n", "# see how it affected the loss:\n", - "loss_value = loss.value(recalculate=True) # recalucate=True means \"don't use precomputed value\"\n", + "loss_value = loss.value(recalculate=True) # recalculate=True means \"don't use precomputed value\"\n", "print \"the loss after step is:\",loss_value\n" ] }, @@ -420,7 +420,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "our network is now trained, let's verify that it indeed learned the xor function:" + "Our network is now trained. Let's verify that it indeed learned the xor function:" ] }, { @@ -805,7 +805,7 @@ } ], "source": [ - "# create training instances, this is as before\n", + "# create training instances, as before\n", "def create_xor_instances(num_rounds=2000):\n", " questions = []\n", " answers = []\n", From b3b32821aed55993279bec703e79990a4308dafb Mon Sep 17 00:00:00 2001 From: Daniel Hershcovich Date: Sun, 5 Jun 2016 14:59:57 +0300 Subject: [PATCH 513/965] Add libboost-regex-dev, without which Travis tests fail --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ae45102dc..2edc1dfff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ addons: before_script: - sudo apt-get update -qq - - sudo apt-get install libboost-filesystem-dev libboost-program-options-dev libboost-serialization-dev libboost-test-dev + - sudo apt-get install libboost-filesystem-dev libboost-program-options-dev libboost-serialization-dev libboost-test-dev libboost-regex-dev - hg clone https://bitbucket.org/eigen/eigen - mkdir build - cd build From f3dd26933303308f4cadc19a65dd9631b90c428a Mon Sep 17 00:00:00 2001 From: talbaumel Date: Mon, 6 Jun 2016 18:24:18 +0300 Subject: [PATCH 514/965] Attention mechanism example --- pyexamples/attention.py | 149 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 pyexamples/attention.py diff --git a/pyexamples/attention.py b/pyexamples/attention.py new file mode 100644 index 000000000..599e27794 --- /dev/null +++ b/pyexamples/attention.py @@ -0,0 +1,149 @@ +import pycnn as pc +import random + +EOS = "" +characters = list("abcdefghijklmnopqrstuvwxyz ") +characters.append(EOS) + +int2char = list(characters) +char2int = {c:i for i,c in enumerate(characters)} + +VOCAB_SIZE = len(characters) + +LSTM_NUM_OF_LAYERS = 2 +EMBEDDINGS_SIZE = 16 +STATE_SIZE = 32 + +model = pc.Model() + +model.add_lookup_parameters("lookup", (VOCAB_SIZE, EMBEDDINGS_SIZE)) + +enc_fwd_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, EMBEDDINGS_SIZE, STATE_SIZE, model) + +enc_bwd_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, EMBEDDINGS_SIZE, STATE_SIZE, model) + +model.add_parameters("attention_w", (1, STATE_SIZE*2+STATE_SIZE*LSTM_NUM_OF_LAYERS*2)) + +dec_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, STATE_SIZE*2, STATE_SIZE, model) + +model.add_parameters("decoder_w", (VOCAB_SIZE, STATE_SIZE)) +model.add_parameters("decoder_b", (VOCAB_SIZE)) + + +def embedd_sentence(model, sentence): + sentence = [EOS] + list(sentence) + [EOS] + sentence = [char2int[c] for c in sentence] + + pc.renew_cg() + + lookup = model["lookup"] + + return [lookup[char] for char in sentence] + + +def run_lstm(model, init_state, input_vecs): + s = init_state + + out_vectors = [] + for vector in input_vecs: + s = s.add_input(vector) + out_vector = s.output() + out_vectors.append(out_vector) + return out_vectors + + +def encode_sentence(model, enc_fwd_lstm, enc_bwd_lstm, sentence): + sentence_rev = [sentence[i] for i in range(len(sentence)-1, -1, -1)] + + fwd_vectors = run_lstm(model, enc_fwd_lstm.initial_state(), sentence) + bwd_vectors = run_lstm(model, enc_bwd_lstm.initial_state(), sentence_rev) + bwd_vectors = [bwd_vectors[i] for i in range(len(bwd_vectors)-1, -1, -1)] + vectors = [pc.concatenate(list(p)) for p in zip(fwd_vectors, bwd_vectors)] + + return vectors + + +def attend(model, vectors, state): + w = pc.parameter(model['attention_w']) + attention_weights = [] + for vector in vectors: + attention_input = pc.concatenate([vector, pc.concatenate(list(state.s()))]) + attention_weight = pc.tanh(w * attention_input) + attention_weights.append(attention_weight) + attention_weights = pc.concatenate(attention_weights) + vectors = pc.softmax(pc.esum([vector*attention_weight for vector, attention_weight in zip(vectors, attention_weights)])) + return vectors + + +def decode(model, dec_lstm, vectors, output): + output = [EOS] + list(output) + [EOS] + output = [char2int[c] for c in output] + + w = pc.parameter(model["decoder_w"]) + b = pc.parameter(model["decoder_b"]) + + + s = dec_lstm.initial_state().add_input(pc.vecInput(STATE_SIZE*2)) + + loss = [] + for char in output: + vector = attend(model, vectors, s) + + s = s.add_input(vector) + out_vector = w * s.output() + b + probs = pc.softmax(out_vector) + loss.append(-pc.log(pc.pick(probs, char))) + loss = pc.esum(loss) + return loss + + +def generate(model, input, enc_fwd_lstm, enc_bwd_lstm, dec_lstm): + def sample(probs): + rnd = random.random() + for i, p in enumerate(probs): + rnd -= p + if rnd <= 0: break + return i + embedded = embedd_sentence(model, input) + encoded = encode_sentence(model, enc_fwd_lstm, enc_bwd_lstm, embedded) + + w = pc.parameter(model["decoder_w"]) + b = pc.parameter(model["decoder_b"]) + + s = dec_lstm.initial_state().add_input(pc.vecInput(STATE_SIZE * 2)) + out = '' + count_EOS = 0 + for i in range(len(input)*2): + if count_EOS == 2: break + vector = attend(model, encoded, s) + + s = s.add_input(vector) + out_vector = w * s.output() + b + probs = pc.softmax(out_vector) + probs = probs.vec_value() + next_char = sample(probs) + if int2char[next_char] == EOS: + count_EOS += 1 + continue + + out += int2char[next_char] + return out + + +def train(model, sentence): + trainer = pc.SimpleSGDTrainer(model) + for i in xrange(400): + embedded = embedd_sentence(model, sentence) + encoded = encode_sentence(model, enc_fwd_lstm, enc_bwd_lstm, embedded) + loss = decode(model, dec_lstm, encoded, sentence) + loss_value = loss.value() + loss.backward() + trainer.update() + if i % 20 == 0: + print loss_value + print generate(model, sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm) + + +train(model, "it is working") + + From 874e73597cbfc7e70add2eb953b6b22b243652ee Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 7 Jun 2016 01:44:27 -0400 Subject: [PATCH 515/965] Fixed linker error caused by double-compiled GPU code --- cnn/nodes-macros.h | 94 +++++++++++++++++++++++++--------------------- cnn/nodes.h | 2 +- cnn/param-nodes.cc | 31 +++++++++++---- cnn/param-nodes.h | 8 +--- 4 files changed, 78 insertions(+), 57 deletions(-) diff --git a/cnn/nodes-macros.h b/cnn/nodes-macros.h index 4ce7d20e8..e7ff7db25 100644 --- a/cnn/nodes-macros.h +++ b/cnn/nodes-macros.h @@ -2,28 +2,17 @@ #define CNN_NODE_MACROS_H_ // A macro to dispatch things to the appropriate device -#ifdef HAVE_CUDA #define CNN_NODE_DEFINE_DEV_IMPL() \ std::string as_string(const std::vector& arg_names) const override; \ Dim dim_forward(const std::vector& xs) const override; \ - void forward_impl(const std::vector& xs, Tensor& fx) const override { \ - assert(fx.device); \ - if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ - else if(fx.device->type == DeviceType::GPU) { forward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx); } \ - else { abort(); } \ - } \ + void forward_impl(const std::vector& xs, Tensor& fx) const override; \ template \ void forward_dev_impl(const MyDevice & dev, const std::vector& xs, Tensor& fx) const; \ void backward_impl(const std::vector& xs, \ const Tensor& fx, \ const Tensor& dEdf, \ unsigned i, \ - Tensor& dEdxi) const override { \ - assert(fx.device); \ - if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ - else if(fx.device->type == DeviceType::GPU) { backward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ - else { abort(); } \ - } \ + Tensor& dEdxi) const override; \ template \ void backward_dev_impl( \ const MyDevice & dev, \ @@ -32,35 +21,6 @@ const Tensor& dEdf, \ unsigned i, \ Tensor& dEdxi) const; -#else -#define CNN_NODE_DEFINE_DEV_IMPL() \ - std::string as_string(const std::vector& arg_names) const override; \ - Dim dim_forward(const std::vector& xs) const override; \ - void forward_impl(const std::vector& xs, Tensor& fx) const override { \ - assert(fx.device); \ - if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ - else { abort(); } \ - } \ - template \ - void forward_dev_impl(const MyDevice & dev, const std::vector& xs, Tensor& fx) const; \ - void backward_impl(const std::vector& xs, \ - const Tensor& fx, \ - const Tensor& dEdf, \ - unsigned i, \ - Tensor& dEdxi) const override { \ - assert(fx.device); \ - if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ - else { abort(); } \ - } \ - template \ - void backward_dev_impl( \ - const MyDevice & dev, \ - const std::vector& xs, \ - const Tensor& fx, \ - const Tensor& dEdf, \ - unsigned i, \ - Tensor& dEdxi) const; -#endif // A macro to instantiate templated device functions // If the implementation is the same for both devices (using Eigen Tensors), @@ -77,6 +37,40 @@ const Tensor& dEdf, \ unsigned i, \ Tensor& dEdxi) const; +#elif HAVE_CUDA +// When we have CUDA, make sure we extern the GPU code to make sure that it is only +// generated by CUDACC +#define CNN_NODE_INST_DEV_IMPL(MyNode) \ + extern template void MyNode::forward_dev_impl(const Device_GPU & dev, const vector& xs, Tensor& fx) const; \ + extern template void MyNode::backward_dev_impl(const Device_GPU & dev, \ + const vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const; \ + template void MyNode::forward_dev_impl(const Device_CPU & dev, const vector& xs, Tensor& fx) const; \ + template void MyNode::backward_dev_impl(const Device_CPU & dev, \ + const vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const; \ + void MyNode::forward_impl(const std::vector& xs, Tensor& fx) const { \ + assert(fx.device); \ + if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ + else if(fx.device->type == DeviceType::GPU) { forward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx); } \ + else { abort(); } \ + } \ + void MyNode::backward_impl(const std::vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const { \ + assert(fx.device); \ + if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ + else if(fx.device->type == DeviceType::GPU) { backward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ + else { abort(); } \ + } #else #define CNN_NODE_INST_DEV_IMPL(MyNode) \ template void MyNode::forward_dev_impl(const Device_CPU & dev, const vector& xs, Tensor& fx) const; \ @@ -85,7 +79,21 @@ const Tensor& fx, \ const Tensor& dEdf, \ unsigned i, \ - Tensor& dEdxi) const; + Tensor& dEdxi) const; \ + void MyNode::forward_impl(const std::vector& xs, Tensor& fx) const { \ + assert(fx.device); \ + if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ + else { abort(); } \ + } \ + void MyNode::backward_impl(const std::vector& xs, \ + const Tensor& fx, \ + const Tensor& dEdf, \ + unsigned i, \ + Tensor& dEdxi) const { \ + assert(fx.device); \ + if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ + else { abort(); } \ + } #endif #endif diff --git a/cnn/nodes.h b/cnn/nodes.h index 7605605ff..ee90e1f02 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -5,7 +5,7 @@ #include "cnn/devices.h" #include "cnn/nodes-macros.h" -// See nodes-macros.h for more details about CNN_NODE_DEFINE_DEV_IMPL. +// See nodes-macros.h for more details about CNN_NODE_DEFINE_DEV_IMPL(). namespace cnn { diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index d076303e7..cd381bfb1 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -1,8 +1,25 @@ #include "cnn/param-nodes.h" -#include "cnn/tensor.h" -#include "cnn/weight-decay.h" -#include +#include +#include +#include + +#include "cnn/simd-functors.h" +#include "cnn/functors.h" +#include "cnn/nodes-macros.h" + +#ifdef HAVE_CUDA +#include "cnn/cuda.h" +#include "cnn/gpu-ops.h" +#endif + +// #include "cnn/param-nodes.h" +// #include "cnn/tensor.h" +#include "cnn/weight-decay.h" +// // DEBUG +// #include "cnn/simd-functors.h" +// +// #include using namespace std; @@ -85,7 +102,7 @@ void LookupNode::accumulate_grad(const Tensor& g) { template void ConstParameterNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - fx.tvec() = params.get()->values.tvec() * global_weight_decay.CurrentWeightDecay(); + fx.tvec().device(*dev.edevice) = params.get()->values.tvec() * global_weight_decay.CurrentWeightDecay(); } template @@ -108,7 +125,7 @@ void ParameterNode::forward_dev_impl(const MyDevice & dev, const vectorvalues.v; // return; // } - fx.tvec() = params.get()->values.tvec() * global_weight_decay.CurrentWeightDecay(); + fx.tvec().device(*dev.edevice) = params.get()->values.tvec() * global_weight_decay.CurrentWeightDecay(); } template @@ -180,7 +197,7 @@ void LookupNode::forward_dev_impl(const MyDevice & dev, const vectorvalues.size()); assert (fx.d.batch_elems() == 1); - fx.vec() = params.get()->values[*pindex].vec() * global_weight_decay.CurrentWeightDecay(); + fx.tvec().device(*dev.edevice) = params.get()->values[*pindex].tvec() * global_weight_decay.CurrentWeightDecay(); } else { assert (pindices); assert (fx.d.batch_elems() == pindices->size()); @@ -197,7 +214,7 @@ void LookupNode::forward_dev_impl(const MyDevice & dev, const vectordim), index(ind), pindex(&index), indices(), pindices(), params(p) {} LookupNode(LookupParameter p, const unsigned* pind) : dim(p.get()->dim), index(), pindex(pind), indices(), pindices(), params(p) {} - LookupNode(LookupParameter p, const std::vector& indices) : dim(p.get()->dim), index(), pindex(), indices(indices), pindices(&this->indices), params(p) { - dim.bd = pindices->size(); - } - LookupNode(LookupParameter p, const std::vector* pindices) : dim(p.get()->dim), index(), pindex(), indices(), pindices(pindices), params(p) { - dim.bd = pindices->size(); - } + LookupNode(LookupParameter p, const std::vector& indices) : dim(p.get()->dim), index(), pindex(), indices(indices), pindices(&this->indices), params(p) { dim.bd = pindices->size(); } + LookupNode(LookupParameter p, const std::vector* pindices) : dim(p.get()->dim), index(), pindex(), indices(), pindices(pindices), params(p) { dim.bd = pindices->size(); } CNN_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } void accumulate_grad(const Tensor& g) override; From f9f6a22e2f6d8a17f123b34bea47142605501ae1 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 7 Jun 2016 04:10:43 -0400 Subject: [PATCH 516/965] Fixed memory access problems --- cnn/nodes.cc | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index dfbcdf1a2..da176479c 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -197,10 +197,10 @@ void AddVectorToAllColumns::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { assert(i < 2); if (i == 0) { // x - dEdxi.tvec() += dEdf.tvec(); + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); } else { // bias for(size_t i = 0; i < xs[0]->d[1]; i++) - dEdxi.t<1>() += dEdf.t<2>().chip<1>(i); + dEdxi.t<1>().device(*dev.edevice) += dEdf.t<2>().chip<1>(i); // TODO: This is not great. Can we use broadcasting similar to SumColumns? } } @@ -668,10 +668,11 @@ template void Hinge::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); Tensor eloss(xs[0]->d, static_cast(aux_mem), fx.device); - const real mlystar = margin - xs[0]->tvec()(*pelement); + // TODO: Can we do this on device? + const real mlystar = margin - TensorTools::AccessElement(*xs[0], *pelement); eloss.tvec().device(*dev.edevice) = (xs[0]->tvec() + mlystar).cwiseMax(0.f); - eloss.tvec()(*pelement) = 0.f; - fx.t<0>() = eloss.tvec().sum(); + TensorTools::SetElement(eloss, *pelement, 0.f); + fx.t<0>().device(*dev.edevice) = eloss.tvec().sum(); } template @@ -686,8 +687,8 @@ void Hinge::backward_dev_impl(const MyDevice & dev, const float d = as_scalar(dEdf); Tensor eloss(xs[0]->d, static_cast(aux_mem), fx.device); // TODO: The > comparison should not be calculated twice. Keep it in auxiliary memory? - dEdxi.tvec() += (eloss.tvec() > 0.f).cast() * d; - dEdxi.tvec().chip<0>(*pelement) -= (eloss.tvec() > 0.f).cast().sum() * d; + dEdxi.tvec().device(*dev.edevice) += (eloss.tvec() > 0.f).cast() * d; + dEdxi.tvec().chip<0>(*pelement).device(*dev.edevice) -= (eloss.tvec() > 0.f).cast().sum() * d; } } CNN_NODE_INST_DEV_IMPL(Hinge) @@ -845,7 +846,7 @@ CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D_1D) template void KMHNGram::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { #ifdef __CUDACC__ - throw std::runtime_error("KMHNGram not implemented on GPU"); + throw std::runtime_error("KMHNGram not implemented for CUDA"); #else auto x = **xs[0]; const int new_cols = x.cols() - n + 1; @@ -868,7 +869,7 @@ void KMHNGram::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { #ifdef __CUDACC__ - throw std::runtime_error("KMHNGram not implemented on GPU"); + throw std::runtime_error("KMHNGram not implemented for CUDA"); #else const int c = dEdf.d.cols(); for (int j = 0; j < c; ++j) @@ -915,7 +916,7 @@ CNN_NODE_INST_DEV_IMPL(Log) template void LogDet::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { #ifdef __CUDACC__ - throw std::runtime_error("LogDet not implemented on GPU"); + throw std::runtime_error("LogDet not implemented for CUDA"); #else fx.v[0] = logdet(**xs[0], false); #endif @@ -929,7 +930,7 @@ void LogDet::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { #ifdef __CUDACC__ - throw std::runtime_error("KMHNGram not implemented on GPU"); + throw std::runtime_error("KMHNGram not implemented for CUDA"); #else auto trans = (**xs[0]).transpose(); (*dEdxi) += (dEdf.v[0]) * trans.inverse(); @@ -1009,7 +1010,7 @@ CNN_NODE_INST_DEV_IMPL(LogSoftmax) template void LogSumExp::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { #ifdef __CUDACC__ - throw std::runtime_error("LogSumExp not implemented on GPU"); + throw std::runtime_error("LogSumExp not implemented for CUDA"); #else const unsigned num_args = xs.size(); if (num_args == 1) { @@ -1032,7 +1033,7 @@ void LogSumExp::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { #ifdef __CUDACC__ - throw std::runtime_error("LogSumExp not implemented on GPU"); + throw std::runtime_error("LogSumExp not implemented for CUDA"); #else if (xs.size() == 0) { *dEdxi += *dEdf; @@ -1545,7 +1546,7 @@ void Reshape::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { const Tensor reshaped(dEdxi.d, dEdf.v, dEdxi.device); - dEdxi.tvec() += reshaped.tvec(); + dEdxi.tvec().device(*dev.edevice) += reshaped.tvec(); } CNN_NODE_INST_DEV_IMPL(Reshape) @@ -1693,7 +1694,7 @@ template void Sparsemax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { #ifdef __CUDACC__ - throw std::runtime_error("Sparsemax not implemented on GPU"); + throw std::runtime_error("Sparsemax not implemented for CUDA"); #else const unsigned rows = xs[0]->d.rows(); float *zs = static_cast(aux_mem); @@ -1729,7 +1730,7 @@ void Sparsemax::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { #ifdef __CUDACC__ - throw std::runtime_error("Sparsemax not implemented on GPU"); + throw std::runtime_error("Sparsemax not implemented for CUDA"); #else const int ssize = static_cast(aux_mem)[0]; int *support = static_cast(aux_mem) + 1; @@ -1748,7 +1749,7 @@ template void SparsemaxLoss::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { #ifdef __CUDACC__ - throw std::runtime_error("SparsemaxLoss not implemented on GPU"); + throw std::runtime_error("SparsemaxLoss not implemented for CUDA"); #else const int rows = xs[0]->d.rows(); if (rows > MAX_SPARSEMAX_LOSS_ROWS) { @@ -1804,7 +1805,7 @@ void SparsemaxLoss::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { #ifdef __CUDACC__ - throw std::runtime_error("SparsemaxLoss not implemented on GPU"); + throw std::runtime_error("SparsemaxLoss not implemented for CUDA"); #else const float d = dEdf.v[0]; float* psm = static_cast(aux_mem); From 7d4bb7a004a83a13bc54df4ddbbc9c78484c56b1 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 7 Jun 2016 04:50:24 -0400 Subject: [PATCH 517/965] Fixed bug in batched affine transform on CUDA --- cnn/nodes.cc | 14 ++++++++++---- cnn/param-nodes.cc | 14 -------------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index da176479c..c594d7cb6 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -155,7 +155,7 @@ size_t SparsemaxLoss::aux_storage_size() const { #ifdef __CUDACC__ inline void CUDAMatrixMultiply(const Tensor& l, const Tensor& r, Tensor& y, const float* acc_scalar) { - if(l.d.bd == 1) { + if(l.d.bd == 1 && r.d.bd == y.d.bd) { // If the left side has one batch, multiply by columns // [x, z, b] = [x, y] * [y, z, b] // -> [x, z*b] = [x, y], [y, z*b] @@ -168,7 +168,7 @@ inline void CUDAMatrixMultiply(const Tensor& l, const Tensor& r, Tensor& y, cons } else { // Otherwise, loop over the batches assert(r.d.bd == 1 || r.d.bd == l.d.bd); - for(unsigned b = 0; b < l.d.bd; ++b) { + for(unsigned b = 0; b < y.d.bd; ++b) { CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, y.d.rows(), y.d.cols(), l.d.cols(), kSCALAR_ONE, @@ -260,7 +260,13 @@ void AffineTransform::backward_dev_impl(const MyDevice & dev, assert(i < xs.size()); if (i == 0) { // bias term #if __CUDACC__ - CUBLAS_CHECK(cublasSaxpy(cublas_handle, dEdxi.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); + if(fx.d.bd == xs[0]->d.bd) { + CUBLAS_CHECK(cublasSaxpy(cublas_handle, dEdxi.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); + } else { + // TODO: Can we use broadcasting? + for(unsigned b = 0; b < dEdf.d.bd; ++b) + CUBLAS_CHECK(cublasSaxpy(cublas_handle, dEdxi.d.batch_size(), kSCALAR_ONE, dEdf.batch_ptr(b), 1, dEdxi.batch_ptr(b), 1)); + } #else // Add, using broadcasting or not if(dEdxi.d.bd == 1 && dEdf.d.bd > 1) { @@ -288,7 +294,7 @@ void AffineTransform::backward_dev_impl(const MyDevice & dev, int max_b = max(xs[i-1]->d.bd, dEdf.d.bd); #if __CUDACC__ // Do a single multiply if xs[i-1] has one batch - if(xs[i-1]->d.bd == 1) { + if(xs[i-1]->d.bd == 1 && dEdxi.d.bd == dEdf.d.bd) { CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols()*dEdxi.d.batch_elems(), xs[i-1]->d.rows(), kSCALAR_ONE, diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index cd381bfb1..005843675 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -4,22 +4,8 @@ #include #include -#include "cnn/simd-functors.h" -#include "cnn/functors.h" #include "cnn/nodes-macros.h" - -#ifdef HAVE_CUDA -#include "cnn/cuda.h" -#include "cnn/gpu-ops.h" -#endif - -// #include "cnn/param-nodes.h" -// #include "cnn/tensor.h" #include "cnn/weight-decay.h" -// // DEBUG -// #include "cnn/simd-functors.h" -// -// #include using namespace std; From a47467e074f091dfa02531cf9cd26fa6f395783a Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 7 Jun 2016 18:35:18 +0900 Subject: [PATCH 518/965] Device-portable implementation of pick --- cnn/nodes.cc | 21 ++++++++++----------- cnn/tensor.cc | 8 ++++++++ cnn/tensor.h | 1 + 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index c594d7cb6..28a1ccedb 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1304,31 +1304,26 @@ CNN_NODE_INST_DEV_IMPL(PairwiseRankLoss) // y = (x_1)_{*pval} template void PickElement::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { -#ifdef __CUDACC__ - throw std::runtime_error("PickElement not yet implemented for CUDA"); -#else if(pval) { if (*pval >= xs[0]->d.rows()) { cerr << "PickElement::forward_impl requested element " << *pval << " from a vector of length " << xs[0]->d.rows() << endl; abort(); } - auto x = **xs[0]; - fx.v[0] = x(*pval); + TensorTools::CopyElement(*xs[0], *pval, fx, 0); } else { assert(pvals); assert(pvals->size() == fx.d.batch_elems()); + int batch_size = xs[0]->d.batch_size(); for(unsigned b = 0; b < pvals->size(); ++b) { if ((*pvals)[b] >= xs[0]->d.rows()) { cerr << "PickElement::forward_impl requested element " << (*pvals)[b] << " from a vector of length " << xs[0]->d.rows() << endl; abort(); } - auto x = xs[0]->batch_matrix(b); - fx.v[b] = x((*pvals)[b]); + TensorTools::CopyElement(*xs[0], b*batch_size + (*pvals)[b], fx, b); } } -#endif } // derivative is 0 in all dimensions except 1 for the selected element @@ -1340,17 +1335,21 @@ void PickElement::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { assert(i == 0); + if(pval) { #ifdef __CUDACC__ - throw std::runtime_error("PickElement not yet implemented for CUDA"); + CUBLAS_CHECK(cublasSaxpy(cublas_handle, 1, kSCALAR_ONE, dEdf.v, 1, dEdxi.v + *pval, 1)); #else - if(pval) { (*dEdxi)(*pval) += dEdf.v[0]; +#endif } else { assert(pvals); for(unsigned b = 0; b < pvals->size(); ++b) +#ifdef __CUDACC__ + CUBLAS_CHECK(cublasSaxpy(cublas_handle, 1, kSCALAR_ONE, dEdf.v + b, 1, dEdxi.batch_ptr(b)(*pvals)[b], 1)); +#else dEdxi.batch_matrix(b)((*pvals)[b]) += dEdf.v[b]; - } #endif + } } CNN_NODE_INST_DEV_IMPL(PickElement) diff --git a/cnn/tensor.cc b/cnn/tensor.cc index 53cda9b72..c16a169fb 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -70,6 +70,14 @@ void TensorTools::SetElement(const Tensor& v, int index, float value) { #endif } +void TensorTools::CopyElement(const Tensor& l, int lindex, Tensor& r, int rindex) { +#if HAVE_CUDA + cudaMemcpyAsync(&r.v[rindex], &l.v[lindex], sizeof(real), cudaMemcpyDeviceToDevice); +#else + r.v[rindex] = l.v[lindex]; +#endif +} + void TensorTools::SetElements(const Tensor& v, const vector& vec) { #if HAVE_CUDA cudaMemcpyAsync(v.v, &vec[0], sizeof(real) * vec.size(), cudaMemcpyHostToDevice); diff --git a/cnn/tensor.h b/cnn/tensor.h index 33cded5e3..5d8f74ec0 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -245,6 +245,7 @@ struct TensorTools { static float AccessElement(const Tensor& v, int index); static float AccessElement(const Tensor& v, const Dim& index); static void SetElement(const Tensor& v, int index, float value); + static void CopyElement(const Tensor& l, int lindex, Tensor& r, int rindex); static void SetElements(const Tensor& v, const std::vector& vec); static void CopyElements(const Tensor& v, const Tensor& v_src); From 0fc223e5ff660416e015cfa4705518528332e21c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 7 Jun 2016 11:50:25 -0400 Subject: [PATCH 519/965] Fixes to CUDA implementation of pick --- cnn/nodes.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 28a1ccedb..381d676eb 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1345,7 +1345,7 @@ void PickElement::backward_dev_impl(const MyDevice & dev, assert(pvals); for(unsigned b = 0; b < pvals->size(); ++b) #ifdef __CUDACC__ - CUBLAS_CHECK(cublasSaxpy(cublas_handle, 1, kSCALAR_ONE, dEdf.v + b, 1, dEdxi.batch_ptr(b)(*pvals)[b], 1)); + CUBLAS_CHECK(cublasSaxpy(cublas_handle, 1, kSCALAR_ONE, dEdf.v + b, 1, dEdxi.batch_ptr(b) + (*pvals)[b], 1)); #else dEdxi.batch_matrix(b)((*pvals)[b]) += dEdf.v[b]; #endif From 79cd0bb113a076757c98af595b72f86bbfa0f939 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 7 Jun 2016 21:59:14 -0400 Subject: [PATCH 520/965] Added contractions on GPU --- cnn/CMakeLists.txt | 4 +- cnn/expr.h | 1 + cnn/gpu-nodes-contract.cu | 3 + cnn/nodes-common.cc | 62 +------------- cnn/nodes-contract.cc | 164 ++++++++++++++++++++++++++++++++++++++ cnn/nodes-contract.h | 32 ++++++++ cnn/nodes-macros.h | 15 ++++ cnn/nodes.cc | 115 -------------------------- cnn/nodes.h | 18 ----- 9 files changed, 220 insertions(+), 194 deletions(-) create mode 100644 cnn/gpu-nodes-contract.cu create mode 100644 cnn/nodes-contract.cc create mode 100644 cnn/nodes-contract.h diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index ae9cae1d1..95afca828 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -23,6 +23,7 @@ set(cnn_library_SRCS mp.cc nodes.cc nodes-common.cc + nodes-contract.cc param-nodes.cc pretrain.cc rnn.cc @@ -59,6 +60,7 @@ set(cnn_library_HDRS model.h mp.h nodes.h + nodes-contract.h param-nodes.h rnn-state-machine.h rnn.h @@ -108,7 +110,7 @@ if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU") SET(CUDA_PROPAGATE_HOST_FLAGS OFF) - cuda_add_library(cnncuda STATIC gpu-ops.cu gpu-nodes.cu gpu-param-nodes.cu) + cuda_add_library(cnncuda STATIC gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-param-nodes.cu) endif(WITH_CUDA_BACKEND) install(FILES ${cnn_library_HDRS} DESTINATION include/cnn) diff --git a/cnn/expr.h b/cnn/expr.h index 1a844fc0f..51d6f74de 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -3,6 +3,7 @@ #include "cnn/cnn.h" #include "cnn/nodes.h" +#include "cnn/nodes-contract.h" namespace cnn { namespace expr { diff --git a/cnn/gpu-nodes-contract.cu b/cnn/gpu-nodes-contract.cu new file mode 100644 index 000000000..14f28e337 --- /dev/null +++ b/cnn/gpu-nodes-contract.cu @@ -0,0 +1,3 @@ +// This is a dummy file that contains the same content as nodes.cc but compiled +// on CUDA +#include "nodes-contract.cc" diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index 7e53bf3f8..3374da911 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -4,19 +4,12 @@ #include #include +#include "cnn/nodes-macros.h" + using namespace std; namespace cnn { -inline bool LooksLikeVector(const Dim& d) { - if (d.ndims() == 1) return true; - if (d.ndims() > 1) { - for (unsigned i = 1; i < d.ndims(); ++i) - if (d[i] != 1) return false; - } - return true; -} - string AddVectorToAllColumns::as_string(const vector& arg_names) const { ostringstream os; os << "fold_rows(" << arg_names[0] << ", " << arg_names[1] << ')'; @@ -251,57 +244,6 @@ Dim KMHNGram::dim_forward(const vector& xs) const { return Dim({xs[0][0], new_cols}); } -string InnerProduct3D_1D::as_string(const vector& arg_names) const { - ostringstream s; - s << "dot(" << arg_names[0] << "," << arg_names[1] << ')'; - if (arg_names.size() == 3) s << " + " << arg_names[2]; - return s.str(); -} - -Dim InnerProduct3D_1D::dim_forward(const vector& xs) const { - if (xs.size() != 2 && xs.size() != 3) - throw std::invalid_argument("Expected two or three arguments in InnerProduct3D_1D"); - if (xs[0].ndims() != 3 || - !LooksLikeVector(xs[1]) || - xs[0].size(2) != xs[1].size(0)) { - ostringstream s; s << "Bad input dimensions in InnerProduct3D_1D: " << xs; - throw std::invalid_argument(s.str()); - } - Dim d({xs[0].size(0), xs[0].size(1)}, max(xs[0].bd, xs[1].bd)); - if(xs.size() == 3) d.bd = max(d.bd, xs[2].bd); - if (xs.size() == 3 && xs[2] != d) { - ostringstream s; s << "Bad input dimensions in InnerProduct3D_1D: " << xs; - throw std::invalid_argument(s.str()); - } - return d; -} - -string InnerProduct3D_1D_1D::as_string(const vector& arg_names) const { - ostringstream s; - s << "dotdot(" << arg_names[0] << "," << arg_names[1] << "," << arg_names[2] << ')'; - if (arg_names.size() == 4) s << " + " << arg_names[3]; - return s.str(); -} - -Dim InnerProduct3D_1D_1D::dim_forward(const vector& xs) const { - if (xs.size() != 3 && xs.size() != 4) - throw std::invalid_argument("Expected three or four arguments in InnerProduct3D_1D"); - if (xs[0].ndims() != 3 || - !LooksLikeVector(xs[1]) || - !LooksLikeVector(xs[2])) { - // TODO fix add check - ostringstream s; s << "Bad input dimensions in InnerProduct3D_1D_1D: " << xs; - throw std::invalid_argument(s.str()); - } - Dim d({xs[0].size(0)}, max(max(xs[0].bd, xs[1].bd), xs[2].bd)); - if(xs.size() == 4) d.bd = max(d.bd, xs[3].bd); - if (xs.size() == 4 && xs[3] != d) { - ostringstream s; s << "Bad input dimensions in InnerProduct3D_1D_1D: " << xs; - throw std::invalid_argument(s.str()); - } - return d; -} - string GaussianNoise::as_string(const vector& arg_names) const { ostringstream s; s << arg_names[0] << " + N(0," << stddev << ')'; diff --git a/cnn/nodes-contract.cc b/cnn/nodes-contract.cc new file mode 100644 index 000000000..9ee164179 --- /dev/null +++ b/cnn/nodes-contract.cc @@ -0,0 +1,164 @@ +#include "cnn/nodes-contract.h" + +#include +#include +#include + +#include "cnn/nodes-macros.h" + +using namespace std; + +namespace cnn { + +#ifndef __CUDACC__ + +string InnerProduct3D_1D::as_string(const vector& arg_names) const { + ostringstream s; + s << "dot(" << arg_names[0] << "," << arg_names[1] << ')'; + if (arg_names.size() == 3) s << " + " << arg_names[2]; + return s.str(); +} + +Dim InnerProduct3D_1D::dim_forward(const vector& xs) const { + if (xs.size() != 2 && xs.size() != 3) + throw std::invalid_argument("Expected two or three arguments in InnerProduct3D_1D"); + if (xs[0].ndims() != 3 || + !LooksLikeVector(xs[1]) || + xs[0].size(2) != xs[1].size(0)) { + ostringstream s; s << "Bad input dimensions in InnerProduct3D_1D: " << xs; + throw std::invalid_argument(s.str()); + } + Dim d({xs[0].size(0), xs[0].size(1)}, max(xs[0].bd, xs[1].bd)); + if(xs.size() == 3) d.bd = max(d.bd, xs[2].bd); + if (xs.size() == 3 && xs[2] != d) { + ostringstream s; s << "Bad input dimensions in InnerProduct3D_1D: " << xs; + throw std::invalid_argument(s.str()); + } + return d; +} + +string InnerProduct3D_1D_1D::as_string(const vector& arg_names) const { + ostringstream s; + s << "dotdot(" << arg_names[0] << "," << arg_names[1] << "," << arg_names[2] << ')'; + if (arg_names.size() == 4) s << " + " << arg_names[3]; + return s.str(); +} + +Dim InnerProduct3D_1D_1D::dim_forward(const vector& xs) const { + if (xs.size() != 3 && xs.size() != 4) + throw std::invalid_argument("Expected three or four arguments in InnerProduct3D_1D"); + if (xs[0].ndims() != 3 || + !LooksLikeVector(xs[1]) || + !LooksLikeVector(xs[2])) { + // TODO fix add check + ostringstream s; s << "Bad input dimensions in InnerProduct3D_1D_1D: " << xs; + throw std::invalid_argument(s.str()); + } + Dim d({xs[0].size(0)}, max(max(xs[0].bd, xs[1].bd), xs[2].bd)); + if(xs.size() == 4) d.bd = max(d.bd, xs[3].bd); + if (xs.size() == 4 && xs[3] != d) { + ostringstream s; s << "Bad input dimensions in InnerProduct3D_1D_1D: " << xs; + throw std::invalid_argument(s.str()); + } + return d; +} + +#endif + +// Y_ij = A_ijk * B_k (+ C_ij) +template +void InnerProduct3D_1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + auto A = xs[0]->t<3>(); + auto b = xs[1]->t<1>(); + typedef Eigen::Tensor::DimensionPair DimPair; + Eigen::array dims({{DimPair(2, 0)}}); + if (xs.size() == 2) { + fx.t<2>().device(*dev.edevice) = A.contract(b, dims); + } else { + auto C = xs[2]->t<2>(); + fx.t<2>().device(*dev.edevice) = A.contract(b, dims) + C; + } +} + +template +void InnerProduct3D_1D::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + auto tdEdf = dEdf.t<2>(); // 2 tensor + typedef Eigen::Tensor::DimensionPair DimPair; + if (i == 0) { // 3 tensor + // tensor product + auto b = xs[1]->t<1>(); + dEdxi.t<3>().device(*dev.edevice) += tdEdf.contract(b, Eigen::array{{}}); + } else if (i == 1) { + auto A = xs[0]->t<3>(); // A is 3 tensor + Eigen::array dims({{DimPair(0, 0), DimPair(1, 1)}}); + dEdxi.t<1>().device(*dev.edevice) += tdEdf.contract(A, dims); + } else if (i == 2) { + dEdxi.t<2>().device(*dev.edevice) += tdEdf; + } else { + cerr << "shouldn't happen\n"; abort(); + } +} +CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D) + +// Y_ij = A_ijk * B_k * C_j (+ D_i) +template +void InnerProduct3D_1D_1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + auto A = xs[0]->t<3>(); + auto b = xs[1]->t<1>(); + auto c = xs[2]->t<1>(); + typedef Eigen::Tensor::DimensionPair DimPair; + Eigen::array dims({{DimPair(2, 0)}}); + Eigen::array dims2({{DimPair(1, 0)}}); + if (xs.size() == 3) { + fx.t<1>().device(*dev.edevice) = A.contract(b, dims).contract(c, dims2); + } else { + auto d = xs[3]->t<1>(); + fx.t<1>().device(*dev.edevice) = A.contract(b, dims).contract(c, dims2) + d; + } +} + +template +void InnerProduct3D_1D_1D::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + auto tdEdf = dEdf.t<1>(); // vector + typedef Eigen::Tensor::DimensionPair DimPair; + if (i == 0) { // 3 tensor + // tensor product + auto b = xs[1]->t<1>(); + auto c = xs[2]->t<1>(); + dEdxi.t<3>().device(*dev.edevice) += tdEdf.contract(c, Eigen::array{{}}).contract(b, Eigen::array{{}}); + } else if (i == 1) { // vector 1 + // TODO these should be reorganized so the contraction is first with tdEdf and then with c or b. + // in theory, that intermediate result could be cached (although CNN doesn't support this). the fact that it + // this part of the product is redone when i=1 and again when i=2 is probably why this is slower + // (or maybe it's the contract implementation?) + Eigen::array dims({{DimPair(1, 0)}}); + Eigen::array dims2({{DimPair(0, 0)}}); + auto A = xs[0]->t<3>(); + auto c = xs[2]->t<1>(); + dEdxi.t<1>().device(*dev.edevice) += A.contract(c, dims).contract(tdEdf, dims2); + } else if (i == 2) { // vector 2 + Eigen::array dims({{DimPair(2, 0)}}); + Eigen::array dims2({{DimPair(0, 0)}}); + auto A = xs[0]->t<3>(); + auto b = xs[1]->t<1>(); + dEdxi.t<1>().device(*dev.edevice) += A.contract(b, dims).contract(tdEdf, dims2); + } else if (i == 3) { // vector bias + dEdxi.t<1>().device(*dev.edevice) += tdEdf; + } else { + cerr << "shouldn't happen\n"; abort(); + } +} +CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D_1D) + + +} // namespace cnn diff --git a/cnn/nodes-contract.h b/cnn/nodes-contract.h new file mode 100644 index 000000000..c18aa64b1 --- /dev/null +++ b/cnn/nodes-contract.h @@ -0,0 +1,32 @@ +#ifndef CNN_NODES_CONTRACT_H_ +#define CNN_NODES_CONTRACT_H_ + +#include "cnn/cnn.h" +#include "cnn/devices.h" +#include "cnn/nodes-macros.h" + +// See nodes-macros.h for more details about CNN_NODE_DEFINE_DEV_IMPL(). + +namespace cnn { + +// Forward: +// Y_ij = A_ijk * B_k + C_ij +// +// Backward: +// (dE/dA)_ijk = (dE/dY)_ij * L_k +// (dE/dB)_k = (dE/dY)_ij * A_ijk +// (dE/dC)_ij = (dE/dY)_ij +struct InnerProduct3D_1D : public Node { + InnerProduct3D_1D(const std::initializer_list& a) : Node(a) {} + CNN_NODE_DEFINE_DEV_IMPL() +}; + +// Y_i = A_ijk * B_k * C_j +struct InnerProduct3D_1D_1D : public Node { + InnerProduct3D_1D_1D(const std::initializer_list& a) : Node(a) {} + CNN_NODE_DEFINE_DEV_IMPL() +}; + +} // namespace cnn + +#endif diff --git a/cnn/nodes-macros.h b/cnn/nodes-macros.h index e7ff7db25..ce30eb30b 100644 --- a/cnn/nodes-macros.h +++ b/cnn/nodes-macros.h @@ -1,6 +1,21 @@ #ifndef CNN_NODE_MACROS_H_ #define CNN_NODE_MACROS_H_ +#include "cnn/dim.h" + +namespace cnn { + +inline bool LooksLikeVector(const Dim& d) { + if (d.ndims() == 1) return true; + if (d.ndims() > 1) { + for (unsigned i = 1; i < d.ndims(); ++i) + if (d[i] != 1) return false; + } + return true; +} + +} + // A macro to dispatch things to the appropriate device #define CNN_NODE_DEFINE_DEV_IMPL() \ std::string as_string(const std::vector& arg_names) const override; \ diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 381d676eb..63c1bd943 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -734,121 +734,6 @@ void Identity::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(Identity) -// Y_ij = A_ijk * B_k (+ C_ij) -template -void InnerProduct3D_1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { -#if __CUDACC__ - // TODO: this is giving a compile error - throw std::runtime_error("InnerProduct3D_1D::forward_dev_impl not implemented on CUDA"); -#else - auto A = xs[0]->t<3>(); - auto b = xs[1]->t<1>(); - typedef Eigen::Tensor::DimensionPair DimPair; - Eigen::array dims({{DimPair(2, 0)}}); - if (xs.size() == 2) { - fx.t<2>() = A.contract(b, dims); - } else { - auto C = xs[2]->t<2>(); - fx.t<2>() = A.contract(b, dims) + C; - } -#endif -} - -template -void InnerProduct3D_1D::backward_dev_impl(const MyDevice & dev, - const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#if __CUDACC__ - // TODO: this is giving a compile error - throw std::runtime_error("InnerProduct3D_1D::forward_dev_impl not implemented on CUDA"); -#else - auto tdEdf = dEdf.t<2>(); // 2 tensor - typedef Eigen::Tensor::DimensionPair DimPair; - if (i == 0) { // 3 tensor - // tensor product - auto b = xs[1]->t<1>(); - dEdxi.t<3>() += tdEdf.contract(b, Eigen::array{{}}); - } else if (i == 1) { - auto A = xs[0]->t<3>(); // A is 3 tensor - Eigen::array dims({{DimPair(0, 0), DimPair(1, 1)}}); - dEdxi.t<1>() += tdEdf.contract(A, dims); - } else if (i == 2) { - dEdxi.t<2>() += tdEdf; - } else { - cerr << "shouldn't happen\n"; abort(); - } -#endif -} -CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D) - -// Y_ij = A_ijk * B_k * C_j (+ D_i) -template -void InnerProduct3D_1D_1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { -#if __CUDACC__ - // TODO: this is giving a compile error - throw std::runtime_error("InnerProduct3D_1D::forward_dev_impl not implemented on CUDA"); -#else - auto A = xs[0]->t<3>(); - auto b = xs[1]->t<1>(); - auto c = xs[2]->t<1>(); - typedef Eigen::Tensor::DimensionPair DimPair; - Eigen::array dims({{DimPair(2, 0)}}); - Eigen::array dims2({{DimPair(1, 0)}}); - if (xs.size() == 3) { - fx.t<1>() = A.contract(b, dims).contract(c, dims2); - } else { - auto d = xs[3]->t<1>(); - fx.t<1>() = A.contract(b, dims).contract(c, dims2) + d; - } -#endif -} - -template -void InnerProduct3D_1D_1D::backward_dev_impl(const MyDevice & dev, - const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#if __CUDACC__ - // TODO: this is giving a compile error - throw std::runtime_error("InnerProduct3D_1D::forward_dev_impl not implemented on CUDA"); -#else - auto tdEdf = dEdf.t<1>(); // vector - typedef Eigen::Tensor::DimensionPair DimPair; - if (i == 0) { // 3 tensor - // tensor product - auto b = xs[1]->t<1>(); - auto c = xs[2]->t<1>(); - dEdxi.t<3>() += tdEdf.contract(c, Eigen::array{{}}).contract(b, Eigen::array{{}}); - } else if (i == 1) { // vector 1 - // TODO these should be reorganized so the contraction is first with tdEdf and then with c or b. - // in theory, that intermediate result could be cached (although CNN doesn't support this). the fact that it - // this part of the product is redone when i=1 and again when i=2 is probably why this is slower - // (or maybe it's the contract implementation?) - Eigen::array dims({{DimPair(1, 0)}}); - Eigen::array dims2({{DimPair(0, 0)}}); - auto A = xs[0]->t<3>(); - auto c = xs[2]->t<1>(); - dEdxi.t<1>() += A.contract(c, dims).contract(tdEdf, dims2); - } else if (i == 2) { // vector 2 - Eigen::array dims({{DimPair(2, 0)}}); - Eigen::array dims2({{DimPair(0, 0)}}); - auto A = xs[0]->t<3>(); - auto b = xs[1]->t<1>(); - dEdxi.t<1>() += A.contract(b, dims).contract(tdEdf, dims2); - } else if (i == 3) { // vector bias - dEdxi.t<1>() += tdEdf; - } else { - cerr << "shouldn't happen\n"; abort(); - } -#endif -} -CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D_1D) - template void KMHNGram::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { #ifdef __CUDACC__ diff --git a/cnn/nodes.h b/cnn/nodes.h index ee90e1f02..c09c1d8d1 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -137,24 +137,6 @@ struct KMHNGram : public Node { unsigned n; // width, n=2 for Karl's paper }; -// Forward: -// Y_ij = A_ijk * B_k + C_ij -// -// Backward: -// (dE/dA)_ijk = (dE/dY)_ij * L_k -// (dE/dB)_k = (dE/dY)_ij * A_ijk -// (dE/dC)_ij = (dE/dY)_ij -struct InnerProduct3D_1D : public Node { - InnerProduct3D_1D(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() -}; - -// Y_i = A_ijk * B_k * C_j -struct InnerProduct3D_1D_1D : public Node { - InnerProduct3D_1D_1D(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() -}; - // n_{i,j} ~ N(0,stddev) // y = x + n struct GaussianNoise : public Node { From c05b6dd626a33a127feebabf8d61a1730c60acb7 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 8 Jun 2016 12:06:53 +0900 Subject: [PATCH 521/965] Added test for logsumexp --- tests/test-nodes.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 54d05780b..50a9ce95c 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -92,6 +92,15 @@ BOOST_AUTO_TEST_CASE( add_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression logsumexp(const std::initializer_list& xs); +BOOST_AUTO_TEST_CASE( logsumexp_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param_scalar1); + Expression x2 = parameter(cg, param_scalar2); + logsumexp({x1, x2}); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression operator+(const Expression& x, real y); BOOST_AUTO_TEST_CASE( addscalar_gradient ) { cnn::ComputationGraph cg; From aa7183ebebc135fe852bd2eba8cece74f2912d0a Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 8 Jun 2016 12:21:04 +0900 Subject: [PATCH 522/965] Made inverse test use a non-singular matrix --- tests/test-nodes.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 50a9ce95c..47b297a23 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -31,7 +31,7 @@ struct NodeTest { std::vector param3_vals = {1.1f,2.2f,3.3f}; std::vector param_scalar1_vals = {2.2f}; std::vector param_scalar2_vals = {1.1f}; - std::vector param_square1_vals = {1.1f,2.2f,3.3f,1.2f,2.2f,3.2f,1.3f,2.3f,3.3f}; + std::vector param_square1_vals = {1.1f,2.2f,3.3f,1.2f,2.5f,3.2f,5.3f,2.3f,3.3f}; std::vector param_cube1_vals = {1.1f,2.2f,3.3f,1.2f,2.2f,3.2f,1.3f,2.3f,3.3f, 11.1f,12.2f,13.3f,11.2f,12.2f,13.2f,11.3f,12.3f,13.3f, 21.1f,22.2f,23.3f,21.2f,22.2f,23.2f,21.3f,22.3f,23.3f}; From d612412095063e02fcfff9aa645f58270b8d1e82 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 8 Jun 2016 21:21:36 +0900 Subject: [PATCH 523/965] Device portable implementations of softmaxes --- cnn/nodes.cc | 196 ++++++++++++++++++-------------------------- cnn/nodes.h | 2 + cnn/tensor.h | 77 ++++++++++++++--- tests/test-nodes.cc | 2 +- 4 files changed, 151 insertions(+), 126 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 63c1bd943..638f930ce 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -45,20 +45,23 @@ namespace cnn { // ======= Functions to be compiled on only CPU #ifndef __CUDACC__ -template -EIGEN_STRONG_INLINE float logsumexp(const T& x) { - using std::exp; - using std::log; - const float m = x.maxCoeff(); -#if 1 - // these are equivalent, but this can use vectorized arithmetic - float z = x.unaryExpr(const_add_op(-m)).array().exp().matrix().sum(); -#else - float z = 0; - for (unsigned i = 0; i < x.rows(); ++i) - z += exp(x(i,0) - m); -#endif - return m + log(z); +template +EIGEN_STRONG_INLINE void logsumexp(const MyDevice & dev, const Tensor& x, Tensor& z) { + if(x.d.bd == 1) { + z.t<0>().device(*dev.edevice) = x.t<1>().maximum(); + float m = TensorTools::AccessElement(z, 0); + z.t<0>().device(*dev.edevice) += (x.t<1>() - m).exp().sum().log(); + } else { + // Calculate the max for all batches at once + array reduction_axis; + reduction_axis[0] = 0; + z.tb<0>().device(*dev.edevice) = x.tb<1>().maximum(reduction_axis); + // Broadcast + array broadcasts; + broadcasts[0] = x.d.rows(); + broadcasts[1] = 1; + z.tb<0>().device(*dev.edevice) += (x.tb<1>() - z.tb<1>().broadcast(broadcasts)).exp().sum(reduction_axis).log(); + } } // set use_cholesky if M is symmetric - it's faster and more stable @@ -125,6 +128,10 @@ size_t Hinge::aux_storage_size() const { return dim.size() * sizeof(float); } +size_t LogSoftmax::aux_storage_size() const { + return dim.batch_elems() * sizeof(float); +} + // this i need to do something better, but this is a work-around // if this is too small, just make it bigger size_t LogSumExp::aux_storage_size() const { @@ -139,6 +146,10 @@ size_t Min::aux_storage_size() const { return dim.size() * sizeof(float); } +size_t Softmax::aux_storage_size() const { + return dim.batch_elems() * sizeof(float); +} + size_t Sparsemax::aux_storage_size() const { return (dim.size() + 1) * sizeof(float); } @@ -867,12 +878,10 @@ template void LogSoftmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); if (xs[0]->d.cols() == 1) { -#if __CUDACC__ - throw std::runtime_error("LogSoftmax::forward not yet implemented for CUDA"); -#else - auto x = **xs[0]; - *fx = x.unaryExpr(FLogSoftmaxNormalize(logsumexp(x))); -#endif + Tensor z({1}, (float*)aux_mem, fx.device); + logsumexp(dev, *xs[0], z); + // TODO: Can this stay on the device? + fx.t<1>().device(*dev.edevice) = xs[0]->t<1>() - TensorTools::AccessElement(z, 0); } else { throw std::runtime_error("LogSoftmax::forward not yet implemented for multiple columns"); } @@ -885,13 +894,11 @@ void LogSoftmax::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - if (xs[0]->d.cols() == 1) { -#if __CUDACC__ - throw std::runtime_error("LogSoftmax::backward not yet implemented for CUDA"); -#else - float off_diag_sum = -(*fx).binaryExpr(*dEdf, FWeightedError()).sum(); - *dEdxi += (*fx).binaryExpr(*dEdf, FLogSoftmaxBackward(off_diag_sum)); -#endif + if (xs[0]->d.cols() == 1) { + Tensor z({1}, (float*)aux_mem, fx.device); + z.t<0>().device(*dev.edevice) = -fx.t<1>().binaryExpr(dEdf.t<1>(), FWeightedError()).sum(); + float off_diag_sum = TensorTools::AccessElement(z, 0); + dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().binaryExpr(dEdf.t<1>(), FLogSoftmaxBackward(off_diag_sum)); } else { throw std::runtime_error("LogSoftmax::backward not yet implemented for multiple columns"); } @@ -900,20 +907,16 @@ CNN_NODE_INST_DEV_IMPL(LogSoftmax) template void LogSumExp::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { -#ifdef __CUDACC__ - throw std::runtime_error("LogSumExp not implemented for CUDA"); -#else const unsigned num_args = xs.size(); if (num_args == 1) { fx.v = xs[0]->v; - return; + } else { + Dim r = {(unsigned int)xs.size()}; + Tensor v(r, static_cast(aux_mem), fx.device); + for (unsigned i = 0; i < xs.size(); ++i) + TensorTools::CopyElement(*xs[i], 0, v, i); + logsumexp(dev, v, fx); } - for (unsigned i = 0; i < xs.size(); ++i) - static_cast(aux_mem)[i] = (**xs[i])(0,0); - Dim r = {(unsigned int)xs.size()}; - Tensor v(r, static_cast(aux_mem), fx.device); - fx.v[0] = logsumexp(*v); -#endif } template @@ -923,19 +926,14 @@ void LogSumExp::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { -#ifdef __CUDACC__ - throw std::runtime_error("LogSumExp not implemented for CUDA"); -#else if (xs.size() == 0) { - *dEdxi += *dEdf; - return; + dEdxi.t<0>().device(*dev.edevice) += dEdf.t<0>(); + } else { + // df/dx_i = 1/{sum_j exp(x_j)} * exp(x_i)} + // = 1/{exp f(x)} * exp(x_i) + // = exp(x_i - f(x)) + dEdxi.t<1>().device(*dev.edevice) += (xs[i]->t<1>() - fx.t<1>()).exp() * dEdf.t<1>(); } - // df/dx_i = 1/{sum_j exp(x_j)} * exp(x_i)} - // = 1/{exp f(x)} * exp(x_i) - // = exp(x_i - f(x)) - auto d = *dEdxi; - d.array() += (**xs[i] - *fx).array().exp() * (*dEdf).array(); -#endif } CNN_NODE_INST_DEV_IMPL(LogSumExp) @@ -1242,31 +1240,19 @@ template void PickNegLogSoftmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { logz = (float*)device->fxs->allocate(sizeof(float)*fx.d.batch_elems()); -#if __CUDACC__ + Tensor z(Dim({1},fx.d.batch_elems()), (float*)logz, fx.device); if(pval) { - gpu::pnlsoftmax(xs[0]->d.size(), *pval, xs[0]->v, fx.v, logz); + logsumexp(dev, *xs[0], z); + fx.t<0>().device(*dev.edevice) = z.t<0>() - xs[0]->t<1>().chip<0>(*pval); } else { - // TODO: It'd be nice to have a kernel that did all batches at once assert(pvals); assert(pvals->size() == fx.d.batch_elems()); + logsumexp(dev, *xs[0], z); + int batch_size = xs[0]->d.batch_size(); for(unsigned b = 0; b < pvals->size(); ++b) - gpu::pnlsoftmax(xs[0]->d.batch_size(), (*pvals)[b], xs[0]->batch_ptr(b), fx.v+b, logz+b); - } -#else - if(pval) { - auto x = **xs[0]; - *logz = logsumexp(x); - fx.v[0] = *logz - x(*pval); - } else { - assert(pvals); - assert(pvals->size() == fx.d.batch_elems()); - for(unsigned b = 0; b < pvals->size(); ++b) { - auto x = xs[0]->batch_matrix(b); - logz[b] = logsumexp(x); - fx.v[b] = logz[b] - x((*pvals)[b]); - } + TensorTools::CopyElement(*xs[0], batch_size * b + (*pvals)[b], fx, b); + fx.tvec().device(*dev.edevice) = z.tvec() - fx.tvec(); } -#endif } else { throw std::runtime_error("PickNegLogSoftmax::forward not yet implemented for multiple columns"); } @@ -1280,42 +1266,30 @@ void PickNegLogSoftmax::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { if (xs[0]->d.cols() == 1) { -#if __CUDACC__ - if(pval) { - const auto elem = *pval; - gpu::pnlsoftmax_backward(dEdxi.d.size(), elem, xs[0]->v, dEdf.v, logz, dEdxi.v); - } else { - assert(pvals); - assert(pvals->size() == fx.d.batch_elems()); - // TODO: Again, it would be nice to do this with a single kernel - for(unsigned b = 0; b < pvals->size(); ++b) { - const auto elem = (*pvals)[b]; - gpu::pnlsoftmax_backward(dEdxi.d.batch_size(), elem, xs[0]->batch_ptr(b), dEdf.v+b, logz+b, dEdxi.batch_ptr(b)); - } - } -#else + Tensor z(Dim({1},fx.d.batch_elems()), (float*)logz, fx.device); if(pval) { const auto elem = *pval; - const float err = dEdf.v[0]; - auto x = **xs[0]; + const float err_val = TensorTools::AccessElement(dEdf, 0); + const float logz_val = TensorTools::AccessElement(z, 0); // logz is computed in the forward pass and cached - *dEdxi += x.unaryExpr(FNegLogSoftmaxBackward(*logz, err)); + dEdxi.t<1>().device(*dev.edevice) += (xs[0]->t<1>() - logz_val).exp() * err_val; //*dEdxi += x.unaryExpr(scalar_nlsoftmax_backward_op(*logz, err)); - (*dEdxi)(elem) -= err; + auto my_chip = dEdxi.t<1>().chip<0>(elem); + my_chip.device(*dev.edevice) = my_chip - err_val; } else { assert(pvals); assert(pvals->size() == fx.d.batch_elems()); + // Add and do broadcasting + array broadcasts; + broadcasts[0] = xs[0]->d.rows(); + broadcasts[1] = 1; + dEdxi.tb<1>().device(*dev.edevice) += (xs[0]->tb<1>() - z.tb<1>().broadcast(broadcasts)).exp() * dEdf.tb<1>().broadcast(broadcasts); + // TODO: It'd be better if we didn't need this loop for(unsigned b = 0; b < pvals->size(); ++b) { - const auto elem = (*pvals)[b]; - const float err = dEdf.v[b]; - auto x = xs[0]->batch_matrix(b); - auto dEdxi_mat = dEdxi.batch_matrix(b); - dEdxi_mat += x.unaryExpr(FNegLogSoftmaxBackward(logz[b], err)); - //dEdxi_mat += x.unaryExpr(scalar_nlsoftmax_backward_op(logz[b], err)); - dEdxi_mat(elem) -= err; + auto my_chip = dEdxi.tb<1>().chip<1>(b).chip<0>((*pvals)[b]); + my_chip.device(*dev.edevice) = my_chip - dEdf.tb<0>().chip<0>(b); } } -#endif } else { throw std::runtime_error("PickNegLogSoftmax::backward not yet implemented for multiple columns"); } @@ -1484,8 +1458,7 @@ void SelectCols::forward_dev_impl(const MyDevice & dev, const vector().chip<1>(i) = xs[0]->t<2>().chip<1>(rm[i]); - // fx.t<2>().device(*dev.edevice).chip<1>(i) = xs[0]->t<2>().chip<1>(rm[i]); + fx.t<2>().chip<1>(i).device(*dev.edevice) = xs[0]->t<2>().chip<1>(rm[i]); } template @@ -1498,8 +1471,7 @@ void SelectCols::backward_dev_impl(const MyDevice & dev, assert(xs.size() == 1); auto& rm = *pcols; for (unsigned i = 0; i < rm.size(); ++i) - dEdxi.t<2>().chip<1>(rm[i]) = dEdf.t<2>().chip<1>(i); - // dEdxi.t<2>().device(*dev.edevice).chip<0>(rm[i]) = dEdf.t<2>().chip<0>(i); + dEdxi.t<2>().chip<1>(rm[i]).device(*dev.edevice) = dEdf.t<2>().chip<1>(i); } CNN_NODE_INST_DEV_IMPL(SelectCols) @@ -1530,16 +1502,10 @@ CNN_NODE_INST_DEV_IMPL(SelectRows) template void Softmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { -#if __CUDACC__ - gpu::softmax(xs[0]->d.size(), xs[0]->v, fx.v); -#else - auto x = **xs[0]; - if (x.rows() == 1) { - fx.v[0] = 1; - } else { - *fx = x.unaryExpr(FSoftmaxNormalize(logsumexp(x))); - } -#endif + Tensor z({1}, (float*)aux_mem, fx.device); + logsumexp(dev, *xs[0], z); + // TODO: Can this stay on the device? + fx.t<1>().device(*dev.edevice) = (xs[0]->t<1>() - TensorTools::AccessElement(z, 0)).exp(); } else { throw std::runtime_error("Softmax not yet implemented for multiple columns"); } @@ -1552,14 +1518,14 @@ void Softmax::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { -#if __CUDACC__ - gpu::softmax_backward(fx.d.size(), fx.v, dEdf.v, dEdxi.v); -#else - auto y = *fx; - if (y.rows() == 1) { return; } // no error if softmax = 0 - float off_diag_sum = -y.cwiseProduct(*dEdf).sum(); - *dEdxi += y.binaryExpr(*dEdf, FSoftmaxBackward(off_diag_sum)); -#endif + if (xs[0]->d.cols() == 1) { + Tensor z({1}, (float*)aux_mem, fx.device); + z.t<0>().device(*dev.edevice) = -(fx.t<1>() * dEdf.t<1>()).sum(); + float off_diag_sum = TensorTools::AccessElement(z, 0); + dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().binaryExpr(dEdf.t<1>(), FSoftmaxBackward(off_diag_sum)); + } else { + throw std::runtime_error("Softmax::backward not yet implemented for multiple columns"); + } } CNN_NODE_INST_DEV_IMPL(Softmax) diff --git a/cnn/nodes.h b/cnn/nodes.h index c09c1d8d1..6c7e094ae 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -441,6 +441,7 @@ struct SoftSign : public Node { // y_i = (x_1)_i / z struct Softmax : public Node { explicit Softmax(const std::initializer_list& a) : Node(a) {} + size_t aux_storage_size() const override; CNN_NODE_DEFINE_DEV_IMPL() }; @@ -448,6 +449,7 @@ struct Softmax : public Node { // y_i = (x_1)_i - \log z struct LogSoftmax : public Node { explicit LogSoftmax(const std::initializer_list& a) : Node(a) {} + size_t aux_storage_size() const override; CNN_NODE_DEFINE_DEV_IMPL() }; diff --git a/cnn/tensor.h b/cnn/tensor.h index 5d8f74ec0..4444a68e6 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -61,6 +61,9 @@ struct Tensor { // Get view as a Tensor (see specializations below-- this is to work Eigen's and CNNs compile-type vs. run-time differences) template Eigen::TensorMap> t(); template const Eigen::TensorMap> t() const; + // Get view as a Tensor where the final dimension is the various batches + template Eigen::TensorMap> tb(); + template const Eigen::TensorMap> tb() const; // Get the pointer for a particular batch, automatically broadcasting if the size is zero const float* batch_ptr(unsigned bid) const { assert(d.bd == 1 || bid < d.bd); @@ -176,52 +179,52 @@ struct Tensor { }; template<> inline Eigen::TensorMap> Tensor::t<0>() { - assert(d.size() == 1); + assert(d.size() == 1 && d.batch_elems() == 1); return Eigen::TensorMap>(v); } template<> inline const Eigen::TensorMap> Tensor::t<0>() const { - assert(d.size() == 1); + assert(d.size() == 1 && d.batch_elems() == 1); return Eigen::TensorMap>(v); } template<> inline Eigen::TensorMap> Tensor::t<1>() { - assert(d.ndims() == 1); + assert(d.ndims() == 1 && d.batch_elems() == 1); return Eigen::TensorMap>(v, (int)d[0]); } template<> inline const Eigen::TensorMap> Tensor::t<1>() const { - assert(d.ndims() == 1); + assert(d.ndims() == 1 && d.batch_elems() == 1); return Eigen::TensorMap>(v, (int)d[0]); } template<> inline Eigen::TensorMap> Tensor::t<2>() { - assert(d.ndims() <= 2); + assert(d.ndims() <= 2 && d.batch_elems() == 1); if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1]); else return Eigen::TensorMap>(v, (int)d[0], (int)1); } template<> inline const Eigen::TensorMap> Tensor::t<2>() const { - assert(d.ndims() <= 2); + assert(d.ndims() <= 2 && d.batch_elems() == 1); if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1]); else return Eigen::TensorMap>(v, (int)d[0], (int)1); } template<> inline Eigen::TensorMap> Tensor::t<3>() { - assert(d.ndims() <= 3); + assert(d.ndims() <= 3 && d.batch_elems() == 1); if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2]); else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1); else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1); } template<> inline const Eigen::TensorMap> Tensor::t<3>() const { - assert(d.ndims() <= 3); + assert(d.ndims() <= 3 && d.batch_elems() == 1); if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2]); else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1); else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1); } template<> inline Eigen::TensorMap> Tensor::t<4>() { - assert(d.ndims() <= 4); + assert(d.ndims() <= 4 && d.batch_elems() == 1); if(d.ndims() == 4) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3]); else if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)1); else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, (int)1); else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, (int)1); } template<> inline const Eigen::TensorMap> Tensor::t<4>() const { - assert(d.ndims() <= 4); + assert(d.ndims() <= 4 && d.batch_elems() == 1); if(d.ndims() == 4) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3]); else if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)1); else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, (int)1); @@ -229,6 +232,60 @@ template<> inline const Eigen::TensorMap> Tensor::t<4>() } // ... +template<> inline Eigen::TensorMap> Tensor::tb<0>() { + assert(d.batch_size() == 1); + return Eigen::TensorMap>(v, d.bd); +} +template<> inline const Eigen::TensorMap> Tensor::tb<0>() const { + assert(d.batch_size() == 1); + return Eigen::TensorMap>(v, d.bd); +} +template<> inline Eigen::TensorMap> Tensor::tb<1>() { + assert(d.ndims() == 1); + return Eigen::TensorMap>(v, (int)d[0], d.bd); +} +template<> inline const Eigen::TensorMap> Tensor::tb<1>() const { + assert(d.ndims() == 1); + return Eigen::TensorMap>(v, (int)d[0], d.bd); +} +template<> inline Eigen::TensorMap> Tensor::tb<2>() { + assert(d.ndims() <= 2); + if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], d.bd); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, d.bd); +} +template<> inline const Eigen::TensorMap> Tensor::tb<2>() const { + assert(d.ndims() <= 2); + if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], d.bd); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, d.bd); +} +template<> inline Eigen::TensorMap> Tensor::tb<3>() { + assert(d.ndims() <= 3); + if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], d.bd); + else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, d.bd); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, d.bd); +} +template<> inline const Eigen::TensorMap> Tensor::tb<3>() const { + assert(d.ndims() <= 3); + if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], d.bd); + else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, d.bd); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, d.bd); +} +template<> inline Eigen::TensorMap> Tensor::tb<4>() { + assert(d.ndims() <= 4); + if(d.ndims() == 4) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3], d.bd); + else if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)1, d.bd); + else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, (int)1, d.bd); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, (int)1, d.bd); +} +template<> inline const Eigen::TensorMap> Tensor::tb<4>() const { + assert(d.ndims() <= 4); + if(d.ndims() == 4) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3], d.bd); + else if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)1, d.bd); + else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, (int)1, d.bd); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, (int)1, d.bd); +} +// ... + std::ostream& operator<<(std::ostream& os, const Tensor& t); real as_scalar(const Tensor& t); std::vector as_vector(const Tensor& v); diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 47b297a23..05bb695d1 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -642,7 +642,7 @@ BOOST_AUTO_TEST_CASE( pickptr_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } -// Expression pickneglogsoftmax(const Expression& x, unsigned v); +// Expression pick(const Expression& x, unsigned v); BOOST_AUTO_TEST_CASE( pick_batch_gradient ) { std::vector idx = {1,2}; cnn::ComputationGraph cg; From 89fad381beb1fa6c7392f2d0a1ac1c965134410c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 8 Jun 2016 10:44:51 -0400 Subject: [PATCH 524/965] Fixed some CUDA problems on softmaxes --- cnn/nodes-contract.cc | 19 +++++++++++++++ cnn/nodes.cc | 56 ++++++++++++++++++++++++------------------- 2 files changed, 51 insertions(+), 24 deletions(-) diff --git a/cnn/nodes-contract.cc b/cnn/nodes-contract.cc index 9ee164179..d513a9fdc 100644 --- a/cnn/nodes-contract.cc +++ b/cnn/nodes-contract.cc @@ -6,6 +6,9 @@ #include "cnn/nodes-macros.h" +// This file takes a long time to compile on GPU. Uncomment this line to skip it. +// #define CNN_SKIP_CUDA_CONTRACTIONS + using namespace std; namespace cnn { @@ -68,6 +71,9 @@ Dim InnerProduct3D_1D_1D::dim_forward(const vector& xs) const { // Y_ij = A_ijk * B_k (+ C_ij) template void InnerProduct3D_1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { +#if defined(__CUDACC__) && defined(CNN_SKIP_CUDA_CONTRACTIONS) + throw std::runtime_error("InnerProduct3D_1D::forward_dev_impl disabled on CUDA"); +#else auto A = xs[0]->t<3>(); auto b = xs[1]->t<1>(); typedef Eigen::Tensor::DimensionPair DimPair; @@ -78,6 +84,7 @@ void InnerProduct3D_1D::forward_dev_impl(const MyDevice & dev, const vectort<2>(); fx.t<2>().device(*dev.edevice) = A.contract(b, dims) + C; } +#endif } template @@ -87,6 +94,9 @@ void InnerProduct3D_1D::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#if defined(__CUDACC__) && defined(CNN_SKIP_CUDA_CONTRACTIONS) + throw std::runtime_error("InnerProduct3D_1D::backward_dev_impl disabled on CUDA"); +#else auto tdEdf = dEdf.t<2>(); // 2 tensor typedef Eigen::Tensor::DimensionPair DimPair; if (i == 0) { // 3 tensor @@ -102,12 +112,16 @@ void InnerProduct3D_1D::backward_dev_impl(const MyDevice & dev, } else { cerr << "shouldn't happen\n"; abort(); } +#endif } CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D) // Y_ij = A_ijk * B_k * C_j (+ D_i) template void InnerProduct3D_1D_1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { +#if defined(__CUDACC__) && defined(CNN_SKIP_CUDA_CONTRACTIONS) + throw std::runtime_error("InnerProduct3D_1D_1D::forward_dev_impl disabled on CUDA"); +#else auto A = xs[0]->t<3>(); auto b = xs[1]->t<1>(); auto c = xs[2]->t<1>(); @@ -120,6 +134,7 @@ void InnerProduct3D_1D_1D::forward_dev_impl(const MyDevice & dev, const vectort<1>(); fx.t<1>().device(*dev.edevice) = A.contract(b, dims).contract(c, dims2) + d; } +#endif } template @@ -129,6 +144,9 @@ void InnerProduct3D_1D_1D::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#if defined(__CUDACC__) && defined(CNN_SKIP_CUDA_CONTRACTIONS) + throw std::runtime_error("InnerProduct3D_1D_1D::backward_dev_impl disabled on CUDA"); +#else auto tdEdf = dEdf.t<1>(); // vector typedef Eigen::Tensor::DimensionPair DimPair; if (i == 0) { // 3 tensor @@ -157,6 +175,7 @@ void InnerProduct3D_1D_1D::backward_dev_impl(const MyDevice & dev, } else { cerr << "shouldn't happen\n"; abort(); } +#endif } CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D_1D) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 638f930ce..435cf347e 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -45,25 +45,6 @@ namespace cnn { // ======= Functions to be compiled on only CPU #ifndef __CUDACC__ -template -EIGEN_STRONG_INLINE void logsumexp(const MyDevice & dev, const Tensor& x, Tensor& z) { - if(x.d.bd == 1) { - z.t<0>().device(*dev.edevice) = x.t<1>().maximum(); - float m = TensorTools::AccessElement(z, 0); - z.t<0>().device(*dev.edevice) += (x.t<1>() - m).exp().sum().log(); - } else { - // Calculate the max for all batches at once - array reduction_axis; - reduction_axis[0] = 0; - z.tb<0>().device(*dev.edevice) = x.tb<1>().maximum(reduction_axis); - // Broadcast - array broadcasts; - broadcasts[0] = x.d.rows(); - broadcasts[1] = 1; - z.tb<0>().device(*dev.edevice) += (x.tb<1>() - z.tb<1>().broadcast(broadcasts)).exp().sum(reduction_axis).log(); - } -} - // set use_cholesky if M is symmetric - it's faster and more stable // for dep paring it won't be template @@ -162,6 +143,36 @@ size_t SparsemaxLoss::aux_storage_size() const { #endif // Finish CPU only functions +// ===== Auxiliary functions for both CPU and GPU + +template +EIGEN_STRONG_INLINE void logsumexp(const MyDevice & dev, const Tensor& x, Tensor& z) { + if(x.d.bd == 1) { + z.t<0>().device(*dev.edevice) = x.t<1>().maximum(); + float m = TensorTools::AccessElement(z, 0); + z.t<0>().device(*dev.edevice) += (x.t<1>() - m).exp().sum().log(); + } else { +#ifdef __CUDACC__ + // nvcc doesn't work with the following reductions, so do something simpler + for(size_t b = 0; b < x.d.bd; b++) { + z.tb<0>().chip<0>(b).device(*dev.edevice) = x.tb<1>().chip<1>(b).maximum(); + float m = TensorTools::AccessElement(z, b); + z.tb<0>().chip<0>(b).device(*dev.edevice) += (x.tb<1>().chip<1>(b) - m).exp().sum().log(); + } +#else + // Calculate the max for all batches at once. This dies for nvcc + array reduction_axis; + reduction_axis[0] = 0; + z.tb<0>().device(*dev.edevice) = x.tb<1>().maximum(reduction_axis); + // Broadcast + array broadcasts; + broadcasts[0] = x.d.rows(); + broadcasts[1] = 1; + z.tb<0>().device(*dev.edevice) += (x.tb<1>() - z.tb<1>().broadcast(broadcasts)).exp().sum(reduction_axis).log(); +#endif + } +} + // ===== Functions to be compiled on both CPU and GPU #ifdef __CUDACC__ @@ -1273,9 +1284,7 @@ void PickNegLogSoftmax::backward_dev_impl(const MyDevice & dev, const float logz_val = TensorTools::AccessElement(z, 0); // logz is computed in the forward pass and cached dEdxi.t<1>().device(*dev.edevice) += (xs[0]->t<1>() - logz_val).exp() * err_val; - //*dEdxi += x.unaryExpr(scalar_nlsoftmax_backward_op(*logz, err)); - auto my_chip = dEdxi.t<1>().chip<0>(elem); - my_chip.device(*dev.edevice) = my_chip - err_val; + dEdxi.t<1>().chip<0>(elem).device(*dev.edevice) = dEdxi.t<1>().chip<0>(elem) - err_val; } else { assert(pvals); assert(pvals->size() == fx.d.batch_elems()); @@ -1286,8 +1295,7 @@ void PickNegLogSoftmax::backward_dev_impl(const MyDevice & dev, dEdxi.tb<1>().device(*dev.edevice) += (xs[0]->tb<1>() - z.tb<1>().broadcast(broadcasts)).exp() * dEdf.tb<1>().broadcast(broadcasts); // TODO: It'd be better if we didn't need this loop for(unsigned b = 0; b < pvals->size(); ++b) { - auto my_chip = dEdxi.tb<1>().chip<1>(b).chip<0>((*pvals)[b]); - my_chip.device(*dev.edevice) = my_chip - dEdf.tb<0>().chip<0>(b); + dEdxi.tb<1>().chip<1>(b).chip<0>((*pvals)[b]).device(*dev.edevice) = dEdxi.tb<1>().chip<1>(b).chip<0>((*pvals)[b]) - dEdf.tb<0>().chip<0>(b); } } } else { From 96a64c98b36b284fa0aa8ae7f50febaad3cc527a Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 9 Jun 2016 12:33:22 +0900 Subject: [PATCH 525/965] Fixed and added tests for concatenate --- cnn/nodes.cc | 66 +++++++++++++++++++-------------------------- cnn/nodes.h | 2 +- tests/test-nodes.cc | 22 +++++++++++++++ 3 files changed, 50 insertions(+), 40 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 435cf347e..111b83fd1 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -38,7 +38,6 @@ using namespace std; namespace cnn { // ======= Shared definitions -#define MAX_CONCAT_COLS_ARGS 512 #define MAX_LOG_SUM_EXP 65536 #define MAX_SPARSEMAX_LOSS_ROWS 65536 @@ -93,10 +92,6 @@ size_t BlockDropout::aux_storage_size() const { return 1 * sizeof(float); } -size_t ConcatenateColumns::aux_storage_size() const { - return MAX_CONCAT_COLS_ARGS * sizeof(unsigned); -} - size_t Dropout::aux_storage_size() const { return dim.size() * sizeof(float); } @@ -377,23 +372,20 @@ CNN_NODE_INST_DEV_IMPL(Average) template void Concatenate::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - unsigned rows = 0; - for (auto x : xs) rows += x->d.rows(); - // the following should use auxiliary memory + unsigned curr_row = 0; src_row_indices.resize(xs.size()); - unsigned ind = 0; - unsigned k = 0; - for (auto x : xs) { - src_row_indices[k++] = ind; - auto & xi = *x; - const unsigned rows = xi.d.rows(); + for (unsigned i = 0; i < xs.size(); ++i) { + src_row_indices[i] = curr_row; + const unsigned row_size = xs[i]->d.rows(); #if __CUDACC__ - assert(xi.d.cols() == 1); // this can be relaxed to the same everywhere - CUDA_CHECK(cudaMemcpyAsync(&fx.v[ind], &xi.v[0], sizeof(float) * rows, cudaMemcpyDeviceToDevice)); + // CUBLAS matricies are col major, so this is non-trivial + if(row_size != 1) throw std::runtime_error("Concatenating matricies with multiple cols on CUDA not supported yet"); + const unsigned cols = xs[i]->d.cols(); + CUDA_CHECK(cudaMemcpyAsync(fx.v + curr_row*cols, xs[i]->v, sizeof(float) * cols * row_size, cudaMemcpyDeviceToDevice)); #else - (*fx).middleRows(ind, rows) = *xi; + (*fx).middleRows(curr_row, row_size) = **xs[i]; #endif - ind += rows; + curr_row += row_size; } } @@ -405,34 +397,32 @@ void Concatenate::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { assert(i < src_row_indices.size()); - const unsigned rows = dEdxi.d.rows(); - const unsigned begin = src_row_indices[i]; + const unsigned row_size = dEdxi.d.rows(); + const unsigned curr_row = src_row_indices[i]; #if __CUDACC__ - CUBLAS_CHECK(cublasSaxpy(cublas_handle, rows, kSCALAR_ONE, &dEdf.v[begin], 1, dEdxi.v, 1)); + const unsigned cols = dEdxi.d.cols(); + CUBLAS_CHECK(cublasSaxpy(cublas_handle, row_size*cols, kSCALAR_ONE, dEdf.v + curr_row*cols, 1, dEdxi.v, 1)); #else - *dEdxi += (*dEdf).middleRows(begin, rows); + *dEdxi += (*dEdf).middleRows(curr_row, row_size); #endif } CNN_NODE_INST_DEV_IMPL(Concatenate) template void ConcatenateColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - unsigned c = 0; - assert(xs.size() < MAX_CONCAT_COLS_ARGS); + unsigned curr_col = 0; + src_col_indices.resize(xs.size()); for (unsigned i = 0; i < xs.size(); ++i) { - static_cast(aux_mem)[i] = c; + src_col_indices[i] = curr_col; + const unsigned col_size = xs[i]->d.cols(); #if __CUDACC__ - assert(xs[i]->d.cols() == 1); // CUBLAS matricies are column-major, so just copy the memory - auto & xi = *xs[i]; - const unsigned rows = xi.d.rows(); - CUDA_CHECK(cudaMemcpyAsync(&fx.v[i*rows], &xi.v[0], sizeof(float) * rows, cudaMemcpyDeviceToDevice)); + const unsigned rows = xs[i]->d.rows(); + CUDA_CHECK(cudaMemcpyAsync(fx.v + curr_col*rows, xs[i]->v, sizeof(float) * rows * col_size, cudaMemcpyDeviceToDevice)); #else - auto xi = **xs[i]; - int d = xi.cols(); - (*fx).middleCols(c, d) = xi; - c += d; + (*fx).middleCols(curr_col, col_size) = **xs[i]; #endif + curr_col += col_size; } } @@ -443,15 +433,13 @@ void ConcatenateColumns::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { + const unsigned col_size = dEdxi.d.cols(); + const unsigned curr_col = src_col_indices[i]; #if __CUDACC__ const unsigned rows = dEdxi.d.rows(); - const unsigned begin = i*rows; - CUBLAS_CHECK(cublasSaxpy(cublas_handle, rows, kSCALAR_ONE, &dEdf.v[begin], 1, dEdxi.v, 1)); + CUBLAS_CHECK(cublasSaxpy(cublas_handle, col_size*rows, kSCALAR_ONE, dEdf.v + curr_col*rows, 1, dEdxi.v, 1)); #else - auto dEdx = *dEdxi; - int d = dEdx.cols(); - int c = static_cast(aux_mem)[i]; - dEdx += (*dEdf).middleCols(c, d); + *dEdxi += (*dEdf).middleCols(curr_col, col_size); #endif } CNN_NODE_INST_DEV_IMPL(ConcatenateColumns) diff --git a/cnn/nodes.h b/cnn/nodes.h index 6c7e094ae..d3174b7e1 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -252,7 +252,7 @@ struct Concatenate : public Node { struct ConcatenateColumns : public Node { template explicit ConcatenateColumns(const T& a) : Node(a) {} CNN_NODE_DEFINE_DEV_IMPL() - size_t aux_storage_size() const override; + mutable std::vector src_col_indices; }; // x_1 is a scalar (or row vector) diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 05bb695d1..a8c550cd8 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -265,6 +265,28 @@ BOOST_AUTO_TEST_CASE( colwise_add_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression concatenate_cols(const std::initializer_list& xs); +BOOST_AUTO_TEST_CASE( concatenate_cols_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + Expression y = concatenate_cols({x1, x2, x1}); + Expression ones3 = input(cg, {1,3}, ones3_vals); + ones3 * y * transpose(ones3); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression concatenate(const std::initializer_list& xs); +BOOST_AUTO_TEST_CASE( concatenate_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = transpose(parameter(cg, param1)); + Expression x2 = transpose(parameter(cg, param2)); + Expression y = concatenate({x1, x2, x1}); + Expression ones3 = input(cg, {1,3}, ones3_vals); + ones3 * y * transpose(ones3); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b); BOOST_AUTO_TEST_CASE( contract3d_1d_gradient ) { cnn::ComputationGraph cg; From 97644a58cb9767d40b36ac127c7071bc1d269c75 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 9 Jun 2016 14:14:44 +0900 Subject: [PATCH 526/965] Batched softmax/log softmax --- cnn/nodes.cc | 79 ++++++++++++++++++++++++++++++++++----------- cnn/nodes.h | 6 ++-- cnn/tensor.h | 24 +++++++------- tests/test-nodes.cc | 20 ++++++++++++ 4 files changed, 97 insertions(+), 32 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 111b83fd1..1bd36c6af 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -379,8 +379,8 @@ void Concatenate::forward_dev_impl(const MyDevice & dev, const vectord.rows(); #if __CUDACC__ // CUBLAS matricies are col major, so this is non-trivial - if(row_size != 1) throw std::runtime_error("Concatenating matricies with multiple cols on CUDA not supported yet"); const unsigned cols = xs[i]->d.cols(); + if(cols != 1 && row_size != 1) throw std::runtime_error("Concatenating matricies with more than one column and row on CUDA not supported yet"); CUDA_CHECK(cudaMemcpyAsync(fx.v + curr_row*cols, xs[i]->v, sizeof(float) * cols * row_size, cudaMemcpyDeviceToDevice)); #else (*fx).middleRows(curr_row, row_size) = **xs[i]; @@ -876,13 +876,17 @@ CNN_NODE_INST_DEV_IMPL(LogisticSigmoid) template void LogSoftmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - if (xs[0]->d.cols() == 1) { - Tensor z({1}, (float*)aux_mem, fx.device); - logsumexp(dev, *xs[0], z); - // TODO: Can this stay on the device? + if (xs[0]->d.cols() != 1) + throw std::runtime_error("LogSoftmax::forward not yet implemented for multiple columns"); + Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); + logsumexp(dev, *xs[0], z); + if(fx.d.bd == 1) { fx.t<1>().device(*dev.edevice) = xs[0]->t<1>() - TensorTools::AccessElement(z, 0); } else { - throw std::runtime_error("LogSoftmax::forward not yet implemented for multiple columns"); + array broadcasts; + broadcasts[0] = xs[0]->d.rows(); + broadcasts[1] = 1; + fx.tb<1>().device(*dev.edevice) = xs[0]->tb<1>() - z.tb<1>().broadcast(broadcasts); } } @@ -893,13 +897,30 @@ void LogSoftmax::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - if (xs[0]->d.cols() == 1) { - Tensor z({1}, (float*)aux_mem, fx.device); + if (xs[0]->d.cols() != 1) + throw std::runtime_error("LogSoftmax::backward not yet implemented for multiple columns"); + Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); + if(fx.d.bd == 1) { z.t<0>().device(*dev.edevice) = -fx.t<1>().binaryExpr(dEdf.t<1>(), FWeightedError()).sum(); float off_diag_sum = TensorTools::AccessElement(z, 0); - dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().binaryExpr(dEdf.t<1>(), FLogSoftmaxBackward(off_diag_sum)); + dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().exp() * off_diag_sum + dEdf.t<1>(); } else { - throw std::runtime_error("LogSoftmax::backward not yet implemented for multiple columns"); +#ifdef __CUDACC__ + // nvcc doesn't work with the following reductions, so do something simpler + for(size_t b = 0; b < fx.d.bd; b++) { + z.tb<0>().chip<0>(b).device(*dev.edevice) = -fx.tb<1>().chip<1>(b).binaryExpr(dEdf.tb<1>().chip<1>(b), FWeightedError()).sum(); + float off_diag_sum = TensorTools::AccessElement(z, b); + dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += fx.tb<1>().chip<1>(b).exp() * off_diag_sum + dEdf.tb<1>().chip<1>(b); + } +#else + array reduction_axis; + reduction_axis[0] = 0; + z.tb<0>().device(*dev.edevice) = -fx.tb<1>().binaryExpr(dEdf.tb<1>(), FWeightedError()).sum(reduction_axis); + array broadcasts; + broadcasts[0] = xs[0]->d.rows(); + broadcasts[1] = 1; + dEdxi.tb<1>().device(*dev.edevice) += fx.tb<1>().exp() * z.tb<1>().broadcast(broadcasts) + dEdf.tb<1>(); +#endif } } CNN_NODE_INST_DEV_IMPL(LogSoftmax) @@ -1497,13 +1518,17 @@ CNN_NODE_INST_DEV_IMPL(SelectRows) template void Softmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - if (xs[0]->d.cols() == 1) { - Tensor z({1}, (float*)aux_mem, fx.device); - logsumexp(dev, *xs[0], z); - // TODO: Can this stay on the device? + if (xs[0]->d.cols() != 1) + throw std::runtime_error("Softmax not yet implemented for multiple columns"); + Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); + logsumexp(dev, *xs[0], z); + if(fx.d.bd == 1) { fx.t<1>().device(*dev.edevice) = (xs[0]->t<1>() - TensorTools::AccessElement(z, 0)).exp(); } else { - throw std::runtime_error("Softmax not yet implemented for multiple columns"); + array broadcasts; + broadcasts[0] = xs[0]->d.rows(); + broadcasts[1] = 1; + fx.tb<1>().device(*dev.edevice) = (xs[0]->tb<1>() - z.tb<1>().broadcast(broadcasts)).exp(); } } @@ -1514,13 +1539,31 @@ void Softmax::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - if (xs[0]->d.cols() == 1) { - Tensor z({1}, (float*)aux_mem, fx.device); + if (xs[0]->d.cols() != 1) + throw std::runtime_error("Softmax::backward not yet implemented for multiple columns"); + + Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); + if(fx.d.bd == 1) { z.t<0>().device(*dev.edevice) = -(fx.t<1>() * dEdf.t<1>()).sum(); float off_diag_sum = TensorTools::AccessElement(z, 0); dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().binaryExpr(dEdf.t<1>(), FSoftmaxBackward(off_diag_sum)); } else { - throw std::runtime_error("Softmax::backward not yet implemented for multiple columns"); +#ifdef __CUDACC__ + // nvcc doesn't work with the following reductions, so do something simpler + for(size_t b = 0; b < fx.d.bd; b++) { + z.tb<0>().chip<0>(b).device(*dev.edevice) = -(fx.tb<1>().chip<1>(b) * dEdf.tb<1>().chip<1>(b)).sum(); + float off_diag_sum = TensorTools::AccessElement(z, b); + dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += fx.tb<1>().chip<1>(b).binaryExpr(dEdf.tb<1>().chip<1>(b), FSoftmaxBackward(off_diag_sum)); + } +#else + array reduction_axis; + reduction_axis[0] = 0; + z.tb<0>().device(*dev.edevice) = -(fx.tb<1>() * dEdf.tb<1>()).sum(reduction_axis); + array broadcasts; + broadcasts[0] = xs[0]->d.rows(); + broadcasts[1] = 1; + dEdxi.tb<1>().device(*dev.edevice) += (fx.tb<1>() + z.tb<1>().broadcast(broadcasts)) * dEdf.tb<1>(); +#endif } } CNN_NODE_INST_DEV_IMPL(Softmax) diff --git a/cnn/nodes.h b/cnn/nodes.h index d3174b7e1..101ac5d85 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -441,16 +441,18 @@ struct SoftSign : public Node { // y_i = (x_1)_i / z struct Softmax : public Node { explicit Softmax(const std::initializer_list& a) : Node(a) {} - size_t aux_storage_size() const override; CNN_NODE_DEFINE_DEV_IMPL() + size_t aux_storage_size() const override; + virtual bool supports_multibatch() const override { return true; } }; // z = \sum_j \exp (x_i)_j // y_i = (x_1)_i - \log z struct LogSoftmax : public Node { explicit LogSoftmax(const std::initializer_list& a) : Node(a) {} - size_t aux_storage_size() const override; CNN_NODE_DEFINE_DEV_IMPL() + size_t aux_storage_size() const override; + virtual bool supports_multibatch() const override { return true; } }; // z = \sum_j \exp (x_i)_j diff --git a/cnn/tensor.h b/cnn/tensor.h index 4444a68e6..d2011e5a5 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -179,52 +179,52 @@ struct Tensor { }; template<> inline Eigen::TensorMap> Tensor::t<0>() { - assert(d.size() == 1 && d.batch_elems() == 1); + assert(d.batch_elems() == 1 && d.size() == 1); return Eigen::TensorMap>(v); } template<> inline const Eigen::TensorMap> Tensor::t<0>() const { - assert(d.size() == 1 && d.batch_elems() == 1); + assert(d.batch_elems() == 1 && d.size() == 1); return Eigen::TensorMap>(v); } template<> inline Eigen::TensorMap> Tensor::t<1>() { - assert(d.ndims() == 1 && d.batch_elems() == 1); + assert(d.batch_elems() == 1 && (d.ndims() == 1 || d.size() == d.rows())); return Eigen::TensorMap>(v, (int)d[0]); } template<> inline const Eigen::TensorMap> Tensor::t<1>() const { - assert(d.ndims() == 1 && d.batch_elems() == 1); + assert(d.batch_elems() == 1 && (d.ndims() == 1 || d.size() == d.rows())); return Eigen::TensorMap>(v, (int)d[0]); } template<> inline Eigen::TensorMap> Tensor::t<2>() { - assert(d.ndims() <= 2 && d.batch_elems() == 1); + assert(d.batch_elems() == 1 && d.ndims() <= 2); if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1]); else return Eigen::TensorMap>(v, (int)d[0], (int)1); } template<> inline const Eigen::TensorMap> Tensor::t<2>() const { - assert(d.ndims() <= 2 && d.batch_elems() == 1); + assert(d.batch_elems() == 1 && d.ndims() <= 2); if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1]); else return Eigen::TensorMap>(v, (int)d[0], (int)1); } template<> inline Eigen::TensorMap> Tensor::t<3>() { - assert(d.ndims() <= 3 && d.batch_elems() == 1); + assert(d.batch_elems() == 1 && d.ndims() <= 3); if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2]); else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1); else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1); } template<> inline const Eigen::TensorMap> Tensor::t<3>() const { - assert(d.ndims() <= 3 && d.batch_elems() == 1); + assert(d.batch_elems() == 1 && d.ndims() <= 3); if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2]); else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1); else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1); } template<> inline Eigen::TensorMap> Tensor::t<4>() { - assert(d.ndims() <= 4 && d.batch_elems() == 1); + assert(d.batch_elems() == 1 && d.ndims() <= 4); if(d.ndims() == 4) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3]); else if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)1); else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, (int)1); else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, (int)1); } template<> inline const Eigen::TensorMap> Tensor::t<4>() const { - assert(d.ndims() <= 4 && d.batch_elems() == 1); + assert(d.batch_elems() == 1 && d.ndims() <= 4); if(d.ndims() == 4) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3]); else if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)1); else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, (int)1); @@ -241,11 +241,11 @@ template<> inline const Eigen::TensorMap> Tensor::tb<0>() return Eigen::TensorMap>(v, d.bd); } template<> inline Eigen::TensorMap> Tensor::tb<1>() { - assert(d.ndims() == 1); + assert(d.ndims() == 1 || d.batch_size() == d.rows()); return Eigen::TensorMap>(v, (int)d[0], d.bd); } template<> inline const Eigen::TensorMap> Tensor::tb<1>() const { - assert(d.ndims() == 1); + assert(d.ndims() == 1 || d.batch_size() == d.rows()); return Eigen::TensorMap>(v, (int)d[0], d.bd); } template<> inline Eigen::TensorMap> Tensor::tb<2>() { diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index a8c550cd8..1b9079880 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -429,6 +429,16 @@ BOOST_AUTO_TEST_CASE( log_softmax_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression log_softmax(const Expression& x, unsigned v); +BOOST_AUTO_TEST_CASE( log_softmax_batch_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = input(cg, Dim({3},2), batch_vals); + Expression y = log_softmax(x1+x2); + sum_batches(input(cg, {1,3}, first_one_vals) * y); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression log_softmax(const Expression& x, const std::vector& restriction); BOOST_AUTO_TEST_CASE( restricted_log_softmax_gradient ) { vector restriction = {0,1}; @@ -448,6 +458,16 @@ BOOST_AUTO_TEST_CASE( softmax_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression softmax(const Expression& x, unsigned v); +BOOST_AUTO_TEST_CASE( softmax_batch_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = input(cg, Dim({3},2), batch_vals); + Expression y = softmax(x1+x2); + sum_batches(input(cg, {1,3}, first_one_vals) * y); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression sparsemax(const Expression& x); BOOST_AUTO_TEST_CASE( sparsemax_gradient ) { cnn::ComputationGraph cg; From 8f1cfc21d7a310f747479331d7f62b71a4bb389c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 9 Jun 2016 15:09:59 +0900 Subject: [PATCH 527/965] Fixed batched softmax nodes for cnn --- cnn/nodes.cc | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 1bd36c6af..7dbeb26de 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -905,22 +905,23 @@ void LogSoftmax::backward_dev_impl(const MyDevice & dev, float off_diag_sum = TensorTools::AccessElement(z, 0); dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().exp() * off_diag_sum + dEdf.t<1>(); } else { -#ifdef __CUDACC__ +// #ifdef __CUDACC__ // nvcc doesn't work with the following reductions, so do something simpler for(size_t b = 0; b < fx.d.bd; b++) { z.tb<0>().chip<0>(b).device(*dev.edevice) = -fx.tb<1>().chip<1>(b).binaryExpr(dEdf.tb<1>().chip<1>(b), FWeightedError()).sum(); float off_diag_sum = TensorTools::AccessElement(z, b); dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += fx.tb<1>().chip<1>(b).exp() * off_diag_sum + dEdf.tb<1>().chip<1>(b); } -#else - array reduction_axis; - reduction_axis[0] = 0; - z.tb<0>().device(*dev.edevice) = -fx.tb<1>().binaryExpr(dEdf.tb<1>(), FWeightedError()).sum(reduction_axis); - array broadcasts; - broadcasts[0] = xs[0]->d.rows(); - broadcasts[1] = 1; - dEdxi.tb<1>().device(*dev.edevice) += fx.tb<1>().exp() * z.tb<1>().broadcast(broadcasts) + dEdf.tb<1>(); -#endif + // TODO: These should work, but are unstable and giving NaNs. Figure out why. +// #else +// array reduction_axis; +// reduction_axis[0] = 0; +// z.tb<0>().device(*dev.edevice) = -fx.tb<1>().binaryExpr(dEdf.tb<1>(), FWeightedError()).sum(reduction_axis); +// array broadcasts; +// broadcasts[0] = xs[0]->d.rows(); +// broadcasts[1] = 1; +// dEdxi.tb<1>().device(*dev.edevice) += fx.tb<1>().exp() * z.tb<1>().broadcast(broadcasts) + dEdf.tb<1>(); +// #endif } } CNN_NODE_INST_DEV_IMPL(LogSoftmax) @@ -1548,22 +1549,23 @@ void Softmax::backward_dev_impl(const MyDevice & dev, float off_diag_sum = TensorTools::AccessElement(z, 0); dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().binaryExpr(dEdf.t<1>(), FSoftmaxBackward(off_diag_sum)); } else { -#ifdef __CUDACC__ +// #ifdef __CUDACC__ // nvcc doesn't work with the following reductions, so do something simpler for(size_t b = 0; b < fx.d.bd; b++) { z.tb<0>().chip<0>(b).device(*dev.edevice) = -(fx.tb<1>().chip<1>(b) * dEdf.tb<1>().chip<1>(b)).sum(); float off_diag_sum = TensorTools::AccessElement(z, b); dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += fx.tb<1>().chip<1>(b).binaryExpr(dEdf.tb<1>().chip<1>(b), FSoftmaxBackward(off_diag_sum)); } -#else - array reduction_axis; - reduction_axis[0] = 0; - z.tb<0>().device(*dev.edevice) = -(fx.tb<1>() * dEdf.tb<1>()).sum(reduction_axis); - array broadcasts; - broadcasts[0] = xs[0]->d.rows(); - broadcasts[1] = 1; - dEdxi.tb<1>().device(*dev.edevice) += (fx.tb<1>() + z.tb<1>().broadcast(broadcasts)) * dEdf.tb<1>(); -#endif + // TODO: These should work, but are unstable and giving NaNs. Figure out why. +// #else +// array reduction_axis; +// reduction_axis[0] = 0; +// z.tb<0>().device(*dev.edevice) = -(fx.tb<1>() * dEdf.tb<1>()).sum(reduction_axis); +// array broadcasts; +// broadcasts[0] = xs[0]->d.rows(); +// broadcasts[1] = 1; +// dEdxi.tb<1>().device(*dev.edevice) += (fx.tb<1>() + z.tb<1>().broadcast(broadcasts)) * dEdf.tb<1>(); +// #endif } } CNN_NODE_INST_DEV_IMPL(Softmax) From f2446188066daa5ecb8cacd0ce1fdf007e7b4236 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 9 Jun 2016 17:27:22 +0900 Subject: [PATCH 528/965] Disabled broadcasting for efficiency --- cnn/nodes.cc | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 7dbeb26de..6f311ae72 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -147,24 +147,24 @@ EIGEN_STRONG_INLINE void logsumexp(const MyDevice & dev, const Tensor& x, Tensor float m = TensorTools::AccessElement(z, 0); z.t<0>().device(*dev.edevice) += (x.t<1>() - m).exp().sum().log(); } else { -#ifdef __CUDACC__ +// #ifdef __CUDACC__ // nvcc doesn't work with the following reductions, so do something simpler for(size_t b = 0; b < x.d.bd; b++) { z.tb<0>().chip<0>(b).device(*dev.edevice) = x.tb<1>().chip<1>(b).maximum(); float m = TensorTools::AccessElement(z, b); z.tb<0>().chip<0>(b).device(*dev.edevice) += (x.tb<1>().chip<1>(b) - m).exp().sum().log(); } -#else - // Calculate the max for all batches at once. This dies for nvcc - array reduction_axis; - reduction_axis[0] = 0; - z.tb<0>().device(*dev.edevice) = x.tb<1>().maximum(reduction_axis); - // Broadcast - array broadcasts; - broadcasts[0] = x.d.rows(); - broadcasts[1] = 1; - z.tb<0>().device(*dev.edevice) += (x.tb<1>() - z.tb<1>().broadcast(broadcasts)).exp().sum(reduction_axis).log(); -#endif +// #else +// // Calculate the max for all batches at once. This dies for nvcc +// array reduction_axis; +// reduction_axis[0] = 0; +// z.tb<0>().device(*dev.edevice) = x.tb<1>().maximum(reduction_axis); +// // Broadcast +// array broadcasts; +// broadcasts[0] = x.d.rows(); +// broadcasts[1] = 1; +// z.tb<0>().device(*dev.edevice) += (x.tb<1>() - z.tb<1>().broadcast(broadcasts)).exp().sum(reduction_axis).log(); +// #endif } } @@ -1298,14 +1298,17 @@ void PickNegLogSoftmax::backward_dev_impl(const MyDevice & dev, } else { assert(pvals); assert(pvals->size() == fx.d.batch_elems()); - // Add and do broadcasting - array broadcasts; - broadcasts[0] = xs[0]->d.rows(); - broadcasts[1] = 1; - dEdxi.tb<1>().device(*dev.edevice) += (xs[0]->tb<1>() - z.tb<1>().broadcast(broadcasts)).exp() * dEdf.tb<1>().broadcast(broadcasts); - // TODO: It'd be better if we didn't need this loop + // // Add and do broadcasting. TODO: But broadcasting is slow, so we use a loop instead. + // array broadcasts; + // broadcasts[0] = xs[0]->d.rows(); + // broadcasts[1] = 1; + // dEdxi.tb<1>().device(*dev.edevice) += (xs[0]->tb<1>() - z.tb<1>().broadcast(broadcasts)).exp() * dEdf.tb<1>().broadcast(broadcasts); for(unsigned b = 0; b < pvals->size(); ++b) { - dEdxi.tb<1>().chip<1>(b).chip<0>((*pvals)[b]).device(*dev.edevice) = dEdxi.tb<1>().chip<1>(b).chip<0>((*pvals)[b]) - dEdf.tb<0>().chip<0>(b); + const auto elem = (*pvals)[b]; + const float err_val = TensorTools::AccessElement(dEdf, b); + const float logz_val = TensorTools::AccessElement(z, b); + dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += (xs[0]->tb<1>().chip<1>(b) - logz_val).exp() * err_val; + dEdxi.tb<1>().chip<1>(b).chip<0>(elem).device(*dev.edevice) = dEdxi.tb<1>().chip<1>(b).chip<0>((*pvals)[b]) - dEdf.tb<0>().chip<0>(b); } } } else { From 1ba854027a9dd0ff7a2a2ae0e112a81ea54b04e1 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 9 Jun 2016 17:44:48 +0900 Subject: [PATCH 529/965] Disabled contractions on cuda by default because they take too long to compile --- cnn/nodes-contract.cc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cnn/nodes-contract.cc b/cnn/nodes-contract.cc index d513a9fdc..0398418dc 100644 --- a/cnn/nodes-contract.cc +++ b/cnn/nodes-contract.cc @@ -7,7 +7,7 @@ #include "cnn/nodes-macros.h" // This file takes a long time to compile on GPU. Uncomment this line to skip it. -// #define CNN_SKIP_CUDA_CONTRACTIONS +#define CNN_SKIP_CUDA_CONTRACTIONS using namespace std; @@ -72,7 +72,7 @@ Dim InnerProduct3D_1D_1D::dim_forward(const vector& xs) const { template void InnerProduct3D_1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { #if defined(__CUDACC__) && defined(CNN_SKIP_CUDA_CONTRACTIONS) - throw std::runtime_error("InnerProduct3D_1D::forward_dev_impl disabled on CUDA"); + throw std::runtime_error("InnerProduct3D_1D::forward_dev_impl disabled on CUDA. Comment out CNN_SKIP_CUDA_CONTRACTIONS in nodes-contract.cc to enable this function."); #else auto A = xs[0]->t<3>(); auto b = xs[1]->t<1>(); @@ -95,7 +95,7 @@ void InnerProduct3D_1D::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { #if defined(__CUDACC__) && defined(CNN_SKIP_CUDA_CONTRACTIONS) - throw std::runtime_error("InnerProduct3D_1D::backward_dev_impl disabled on CUDA"); + throw std::runtime_error("InnerProduct3D_1D::backward_dev_impl disabled on CUDA. Comment out CNN_SKIP_CUDA_CONTRACTIONS in nodes-contract.cc to enable this function."); #else auto tdEdf = dEdf.t<2>(); // 2 tensor typedef Eigen::Tensor::DimensionPair DimPair; @@ -120,7 +120,7 @@ CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D) template void InnerProduct3D_1D_1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { #if defined(__CUDACC__) && defined(CNN_SKIP_CUDA_CONTRACTIONS) - throw std::runtime_error("InnerProduct3D_1D_1D::forward_dev_impl disabled on CUDA"); + throw std::runtime_error("InnerProduct3D_1D_1D::forward_dev_impl disabled on CUDA. Comment out CNN_SKIP_CUDA_CONTRACTIONS in nodes-contract.cc to enable this function."); #else auto A = xs[0]->t<3>(); auto b = xs[1]->t<1>(); @@ -145,7 +145,7 @@ void InnerProduct3D_1D_1D::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { #if defined(__CUDACC__) && defined(CNN_SKIP_CUDA_CONTRACTIONS) - throw std::runtime_error("InnerProduct3D_1D_1D::backward_dev_impl disabled on CUDA"); + throw std::runtime_error("InnerProduct3D_1D_1D::backward_dev_impl disabled on CUDA. Comment out CNN_SKIP_CUDA_CONTRACTIONS in nodes-contract.cc to enable this function."); #else auto tdEdf = dEdf.t<1>(); // vector typedef Eigen::Tensor::DimensionPair DimPair; From b0c593fc214fdb28fc4c63f85b4a24f822cdfec9 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 9 Jun 2016 18:11:35 +0900 Subject: [PATCH 530/965] Added info about compiling on GPUs to README --- README.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b49c624f2..5e7a3d6e8 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # cnn C++ neural network library -#### Important: Eigen version requirement +### Important: Eigen version requirement You need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function. **If you use any of the released versions, you may get assertion failures or compile errors.** -#### Building +### Building First you need to fetch the dependent libraries @@ -42,13 +42,22 @@ both `Eigen` and `cnn`. Eigen does not have to be compiled, so “installing” cmake .. -DEIGEN3_INCLUDE_DIR=../eigen make -j 2 +#### Building with GPU Support + +`cnn` supports running programs on GPUs with CUDA. If you have CUDA installed, you +can build cnn to be run on GPUs by adding `-DBACKEND=cuda` to your cmake options +as follows: + + cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen -DBACKEND=cuda + #### Debugging build problems If you want to see the compile commands that are used, you can run make VERBOSE=1 -#### Training Models + +### Training Models An illustation of how models are trained (for a simple logistic regression model) is below: From 35283abf8fa2d73ea456b35a492e983a560e6c90 Mon Sep 17 00:00:00 2001 From: talbaumel Date: Fri, 10 Jun 2016 01:56:32 +0300 Subject: [PATCH 531/965] Update attention.py --- pyexamples/attention.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/pyexamples/attention.py b/pyexamples/attention.py index 599e27794..fda8881d7 100644 --- a/pyexamples/attention.py +++ b/pyexamples/attention.py @@ -16,16 +16,13 @@ model = pc.Model() -model.add_lookup_parameters("lookup", (VOCAB_SIZE, EMBEDDINGS_SIZE)) - enc_fwd_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, EMBEDDINGS_SIZE, STATE_SIZE, model) - enc_bwd_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, EMBEDDINGS_SIZE, STATE_SIZE, model) -model.add_parameters("attention_w", (1, STATE_SIZE*2+STATE_SIZE*LSTM_NUM_OF_LAYERS*2)) - dec_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, STATE_SIZE*2, STATE_SIZE, model) +model.add_lookup_parameters("lookup", (VOCAB_SIZE, EMBEDDINGS_SIZE)) +model.add_parameters("attention_w", (1, STATE_SIZE*2+STATE_SIZE*LSTM_NUM_OF_LAYERS*2)) model.add_parameters("decoder_w", (VOCAB_SIZE, STATE_SIZE)) model.add_parameters("decoder_b", (VOCAB_SIZE)) @@ -34,8 +31,6 @@ def embedd_sentence(model, sentence): sentence = [EOS] + list(sentence) + [EOS] sentence = [char2int[c] for c in sentence] - pc.renew_cg() - lookup = model["lookup"] return [lookup[char] for char in sentence] @@ -67,11 +62,14 @@ def attend(model, vectors, state): w = pc.parameter(model['attention_w']) attention_weights = [] for vector in vectors: + #concatenate each encoded vector with the current decoder state attention_input = pc.concatenate([vector, pc.concatenate(list(state.s()))]) - attention_weight = pc.tanh(w * attention_input) - attention_weights.append(attention_weight) - attention_weights = pc.concatenate(attention_weights) - vectors = pc.softmax(pc.esum([vector*attention_weight for vector, attention_weight in zip(vectors, attention_weights)])) + #get the attention wieght for the decoded vector + attention_weights.append(w * attention_input) + #normalize the weights + attention_weights = pc.softmax(pc.concatenate(attention_weights)) + #apply the weights + vectors = pc.esum([vector*attention_weight for vector, attention_weight in zip(vectors, attention_weights)]) return vectors @@ -104,6 +102,7 @@ def sample(probs): rnd -= p if rnd <= 0: break return i + embedded = embedd_sentence(model, input) encoded = encode_sentence(model, enc_fwd_lstm, enc_bwd_lstm, embedded) @@ -130,12 +129,17 @@ def sample(probs): return out +def get_loss(model, input_sentence, output_sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm): + pc.renew_cg() + embedded = embedd_sentence(model, input_sentence) + encoded = encode_sentence(model, enc_fwd_lstm, enc_bwd_lstm, embedded) + return decode(model, dec_lstm, encoded, output_sentence) + + def train(model, sentence): trainer = pc.SimpleSGDTrainer(model) for i in xrange(400): - embedded = embedd_sentence(model, sentence) - encoded = encode_sentence(model, enc_fwd_lstm, enc_bwd_lstm, embedded) - loss = decode(model, dec_lstm, encoded, sentence) + loss = get_loss(model, sentence, sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm) loss_value = loss.value() loss.backward() trainer.update() From b087caea3284810bf012735b0f5dd6c9144092f9 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 10 Jun 2016 08:43:41 +0900 Subject: [PATCH 532/965] Fixed compile error in tutorial --- tutorial/1_linear_regression.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/1_linear_regression.cc b/tutorial/1_linear_regression.cc index a494e00d1..664b6f63b 100644 --- a/tutorial/1_linear_regression.cc +++ b/tutorial/1_linear_regression.cc @@ -12,7 +12,7 @@ using namespace cnn::expr; int main(int argc, char** argv) { cnn::Initialize(argc, argv); - default_random_engine rng(); + default_random_engine rng; normal_distribution normal(0.0f, 1.0f); vector xs; From 4546166a6f8dd3d0ebe20aeb43e7e3729675f53d Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 10 Jun 2016 22:13:12 +0900 Subject: [PATCH 533/965] Added batched hinge loss --- cnn/expr.cc | 2 ++ cnn/expr.h | 2 ++ cnn/nodes.cc | 43 ++++++++++++++++++++++++++++++++++--------- cnn/nodes.h | 4 ++++ tests/test-nodes.cc | 10 ++++++++++ 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index 5331da0ca..25df12fbd 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -56,6 +56,8 @@ Expression logistic(const Expression& x) { return Expression(x.pg, x.pg->add_fun Expression rectify(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression hinge(const Expression& x, unsigned index, float m) { return Expression(x.pg, x.pg->add_function({x.i}, index, m)); } Expression hinge(const Expression& x, const unsigned* pindex, float m) { return Expression(x.pg, x.pg->add_function({x.i}, pindex, m)); } +Expression hinge(const Expression& x, const std::vector & indices, float m) { return Expression(x.pg, x.pg->add_function({x.i}, indices, m)); } +Expression hinge(const Expression& x, const std::vector * pindices, float m) { return Expression(x.pg, x.pg->add_function({x.i}, pindices, m)); } Expression log_softmax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression log_softmax(const Expression& x, const vector& d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } Expression sparsemax(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 8afac042e..57cdc9f26 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -73,7 +73,9 @@ Expression log(const Expression& x); Expression logistic(const Expression& x); Expression rectify(const Expression& x); Expression hinge(const Expression& x, unsigned index, float m = 1.0); +Expression hinge(const Expression& x, const std::vector & indices, float m = 1.0); Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0); +Expression hinge(const Expression& x, const std::vector * pindices, float m = 1.0); Expression log_softmax(const Expression& x); Expression sparsemax(const Expression& x); Expression log_softmax(const Expression& x, const std::vector& restriction); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 0743d84a0..8f088d4a3 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -685,10 +685,21 @@ void Hinge::forward_dev_impl(const MyDevice & dev, const vector& assert(xs.size() == 1); Tensor eloss(xs[0]->d, static_cast(aux_mem), fx.device); // TODO: Can we do this on device? - const real mlystar = margin - TensorTools::AccessElement(*xs[0], *pelement); - eloss.tvec().device(*dev.edevice) = (xs[0]->tvec() + mlystar).cwiseMax(0.f); - TensorTools::SetElement(eloss, *pelement, 0.f); - fx.t<0>().device(*dev.edevice) = eloss.tvec().sum(); + if(pelement != nullptr) { + const real mlystar = margin - TensorTools::AccessElement(*xs[0], *pelement); + eloss.tvec().device(*dev.edevice) = (xs[0]->tvec() + mlystar).cwiseMax(0.f); + TensorTools::SetElement(eloss, *pelement, 0.f); + fx.t<0>().device(*dev.edevice) = eloss.tvec().sum(); + } else { + assert(pelements != nullptr); + size_t batch_size = fx.d.batch_size(); + for(size_t b = 0; b < fx.d.bd; b++) { + const real mlystar = margin - TensorTools::AccessElement(*xs[0], b*batch_size + (*pelements)[b]); + eloss.tb<1>().chip<1>(b).device(*dev.edevice) = (xs[0]->tb<1>().chip<1>(b) + mlystar).cwiseMax(0.f); + TensorTools::SetElement(eloss, b*batch_size + (*pelements)[b], 0.f); + fx.tb<0>().chip<0>(b).device(*dev.edevice) = eloss.tb<1>().chip<1>(b).sum(); + } + } } template @@ -699,12 +710,26 @@ void Hinge::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { assert(i == 0); - if(as_scalar(fx)) { // there was some loss - const float d = as_scalar(dEdf); + if(pelement != nullptr) { + if(as_scalar(fx)) { // there was some loss + const float d = as_scalar(dEdf); + Tensor eloss(xs[0]->d, static_cast(aux_mem), fx.device); + // TODO: The > comparison should not be calculated twice. Keep it in auxiliary memory? + dEdxi.tvec().device(*dev.edevice) += (eloss.tvec() > 0.f).cast() * d; + dEdxi.tvec().chip<0>(*pelement).device(*dev.edevice) -= (eloss.tvec() > 0.f).cast().sum() * d; + } + } else { + assert(pelements != nullptr); + vector fx_vec = as_vector(fx); + vector d_vec = as_vector(dEdf); Tensor eloss(xs[0]->d, static_cast(aux_mem), fx.device); - // TODO: The > comparison should not be calculated twice. Keep it in auxiliary memory? - dEdxi.tvec().device(*dev.edevice) += (eloss.tvec() > 0.f).cast() * d; - dEdxi.tvec().chip<0>(*pelement).device(*dev.edevice) -= (eloss.tvec() > 0.f).cast().sum() * d; + for(size_t b = 0; b < fx.d.bd; b++) { + if(fx_vec[b]) { // there was some loss + // TODO: The > comparison should not be calculated twice. Keep it in auxiliary memory? + dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += (eloss.tb<1>().chip<1>(b) > 0.f).cast() * d_vec[b]; + dEdxi.tb<1>().chip<1>(b).chip<0>((*pelements)[b]).device(*dev.edevice) -= (eloss.tb<1>().chip<1>(b) > 0.f).cast().sum() * d_vec[b]; + } + } } } CNN_NODE_INST_DEV_IMPL(Hinge) diff --git a/cnn/nodes.h b/cnn/nodes.h index 83f9fc840..5919b4bb1 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -270,10 +270,14 @@ struct PairwiseRankLoss : public Node { struct Hinge : public Node { explicit Hinge(const std::initializer_list& a, unsigned e, real m = 1.0) : Node(a), element(e), pelement(&element), margin(m) {} explicit Hinge(const std::initializer_list& a, const unsigned* pe, real m = 1.0) : Node(a), element(), pelement(pe), margin(m) {} + explicit Hinge(const std::initializer_list& a, const std::vector& e, real m = 1.0) : Node(a), element(), pelement(), elements(e), pelements(&elements) {} + explicit Hinge(const std::initializer_list& a, const std::vector* pe, real m = 1.0) : Node(a), element(), pelement(), elements(), pelements(pe) {} CNN_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; unsigned element; const unsigned* pelement; + std::vector elements; + const std::vector* pelements; real margin; }; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 1b9079880..4b4bb569f 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -411,6 +411,16 @@ BOOST_AUTO_TEST_CASE( hinge_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression hinge(const Expression& x, unsigned index, float m = 1.0); +BOOST_AUTO_TEST_CASE( hinge_batch_gradient ) { + std::vector idx = {1,2}; + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = input(cg, Dim({3},2), batch_vals); + sum_batches(hinge(x1+x2, idx, 2.f)); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0); BOOST_AUTO_TEST_CASE( hingeptr_gradient ) { unsigned index = 0; From 737deb7f8e083f6cba6e0d3fdde8f91faa0cbf7c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 11 Jun 2016 19:36:19 +0900 Subject: [PATCH 534/965] Fixed missing initialization in hinge loss --- cnn/nodes.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/nodes.h b/cnn/nodes.h index 5919b4bb1..8848f6752 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -270,8 +270,8 @@ struct PairwiseRankLoss : public Node { struct Hinge : public Node { explicit Hinge(const std::initializer_list& a, unsigned e, real m = 1.0) : Node(a), element(e), pelement(&element), margin(m) {} explicit Hinge(const std::initializer_list& a, const unsigned* pe, real m = 1.0) : Node(a), element(), pelement(pe), margin(m) {} - explicit Hinge(const std::initializer_list& a, const std::vector& e, real m = 1.0) : Node(a), element(), pelement(), elements(e), pelements(&elements) {} - explicit Hinge(const std::initializer_list& a, const std::vector* pe, real m = 1.0) : Node(a), element(), pelement(), elements(), pelements(pe) {} + explicit Hinge(const std::initializer_list& a, const std::vector& e, real m = 1.0) : Node(a), element(), pelement(), elements(e), pelements(&elements), margin(m) {} + explicit Hinge(const std::initializer_list& a, const std::vector* pe, real m = 1.0) : Node(a), element(), pelement(), elements(), pelements(pe), margin(m) {} CNN_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; unsigned element; From 072096c2ad1d284e40bff46643629418592276cf Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 12 Jun 2016 03:02:18 +0900 Subject: [PATCH 535/965] Device implementation of optimizers --- cnn/training.cc | 428 ++++++++++++++++++++++-------------------------- cnn/training.h | 53 +++--- 2 files changed, 225 insertions(+), 256 deletions(-) diff --git a/cnn/training.cc b/cnn/training.cc index 8c46a42aa..89b326fc9 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -1,9 +1,31 @@ #include "cnn/training.h" -#include "cnn/gpu-ops.h" +// #include "cnn/gpu-ops.h" #include "cnn/param-nodes.h" #include "cnn/weight-decay.h" +// Macros for defining parameter update functions +#ifdef __CUDACC__ +#define CNN_TRAINER_INST_DEV_IMPL(MyTrainer) \ + template void MyTrainer::update_rule_dev(const Device_GPU & dev, real scale, real gscale, const std::vector & values); +#elif defined(HAVE_GPU) +#define CNN_TRAINER_INST_DEV_IMPL(MyTrainer) \ + extern template void MyTrainer::update_rule_dev(const Device_GPU & dev, real scale, real gscale, const std::vector & values); \ + template void MyTrainer::update_rule_dev(const Device_CPU & dev, real scale, real gscale, const std::vector & values); \ + void MyTrainer::update_rule(real scale, real gscale, const std::vector & values) { \ + if(values[0]->device->type == DeviceType::CPU) { update_rule_dev(*(Device_CPU*)values[0]->device,scale,gscale,values); } \ + else if(values[0]->device->type == DeviceType::GPU) { update_rule_dev(*(Device_GPU*)values[0]->device,scale,gscale,values); } \ + else { abort(); } \ + } +#else +#define CNN_TRAINER_INST_DEV_IMPL(MyTrainer) \ + template void MyTrainer::update_rule_dev(const Device_CPU & dev, real scale, real gscale, const std::vector & values); \ + void MyTrainer::update_rule(real scale, real gscale, const std::vector & values) { \ + if(values[0]->device->type == DeviceType::CPU) { update_rule_dev(*(Device_CPU*)values[0]->device,scale,gscale,values); } \ + else { abort(); } \ + } +#endif + namespace cnn { using namespace std; @@ -13,6 +35,11 @@ bool is_valid(const Eigen::MatrixBase& x) { return ((x - x).array() == (x - x).array()).all(); } +// --- The actual update code for each operation, implemented on various devices + +// Trainer base class is run on CPUs +#ifndef __CUDACC__ + Trainer::~Trainer() {} void Trainer::rescale_and_reset_weight_decay() { @@ -40,267 +67,198 @@ float Trainer::clip_gradients() { // this calls the rule-specific void Trainer::update(real scale) { - update_impl(scale); + // Allocate if necessary + if(!aux_allocated) { + alloc_impl(); + aux_allocated = true; + } + + // Perform gradient clipping and cycle through parameters + const float gscale = clip_gradients(); + const auto & params = model->parameters_list(); + for(size_t i = 0; i < params.size(); ++i) + update_params(scale, gscale, i); + const auto & lookup_params = model->lookup_parameters_list(); + for(size_t i = 0; i < lookup_params.size(); ++i) + for (auto j : lookup_params[i]->non_zero_grads) + update_lookup_params(scale, gscale, i, j); + ++updates; + global_weight_decay.UpdateWeightDecay(); // update global weight scale if (global_weight_decay.ParametersNeedRescaled()) rescale_and_reset_weight_decay(); // if wdscale is getting to small multiply all weights by wdscale, and set wdscale to 1 } -void SimpleSGDTrainer::update_impl(real scale) { - update_params(model->lookup_parameters_list(), model->parameters_list(), scale); -} - -void SimpleSGDTrainer::update_params(const std::vector &lookup_params, const std::vector ¶ms, real scale) { - const float gscale = clip_gradients(); - for (auto p : params) { -#if HAVE_CUDA - gpu::sgd_update(p->values.d.size(), p->g.v, p->values.v, eta * scale * gscale / global_weight_decay.CurrentWeightDecay(), 0); -#else - p->values.vec() -= ((eta * scale * gscale) * p->g.vec() / global_weight_decay.CurrentWeightDecay()); #endif - p->clear(); - } - for (auto p : lookup_params) { - for (auto i : p->non_zero_grads) { -#if HAVE_CUDA - gpu::sgd_update(p->values[i].d.size(), p->grads[i].v, p->values[i].v, eta * scale * gscale / global_weight_decay.CurrentWeightDecay(), 0); -#else - p->values[i].vec() -= (p->grads[i].vec() * (eta * scale * gscale) / global_weight_decay.CurrentWeightDecay()); -#endif - } - p->clear(); - } - ++updates; -} -void MomentumSGDTrainer::update_impl(real scale) { - // executed on the first iteration to create vectors to - // store the velocity - if (!velocity_allocated) { - vp = AllocateShadowParameters(*model); - vlp = AllocateShadowLookupParameters(*model); - velocity_allocated = true; - } +// --- SimpleSGDTrainer - const float gscale = clip_gradients(); - unsigned pi = 0; - for (auto p : model->parameters_list()) { - Tensor& v = vp[pi++].h; - v.vec() = momentum * v.vec() - (eta * scale * gscale) * p->g.vec(); - p->values.vec() += v.vec() / global_weight_decay.CurrentWeightDecay(); - p->clear(); - } - pi = 0; - for (auto p : model->lookup_parameters_list()) { - vector& vx = vlp[pi++].h; - for (auto i : p->non_zero_grads) { - Tensor& v = vx[i]; - v.vec() = momentum * v.vec() - (eta * scale * gscale) * (p->grads[i].vec()); - p->values[i].vec() += v.vec() / global_weight_decay.CurrentWeightDecay(); - } - p->clear(); - } - ++updates; +// Perform update of ts[0]=parameters, ts[1]=gradients +template +void SimpleSGDTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { + ts[0]->tvec().device(*dev.edevice) -= ts[1]->tvec() * (eta * scale * gscale / global_weight_decay.CurrentWeightDecay()); } +CNN_TRAINER_INST_DEV_IMPL(SimpleSGDTrainer) -void AdagradTrainer::update_impl(real scale) { - unsigned pi; - if (!shadow_params_allocated) { - vp = AllocateShadowParameters(*model); - vlp = AllocateShadowLookupParameters(*model); - shadow_params_allocated = true; - } - - pi = 0; - const float gscale = clip_gradients(); - for (auto p : model->parameters_list()) { - Tensor& v = vp[pi++].h; - auto g = scale * gscale * p->g.vec(); - auto g2 = g.cwiseProduct(g); - v.vec() += g2; - auto delta = -eta * g.cwiseQuotient((v.vec().array() + epsilon).matrix().cwiseSqrt()); - p->values.vec() += delta / global_weight_decay.CurrentWeightDecay(); - p->clear(); - } +#ifndef __CUDACC__ +void SimpleSGDTrainer::update_params(real scale, real gscale, size_t idx) { + auto & p = model->parameters_list()[idx]; + update_rule(scale, gscale, {&p->values, &p->g}); +} +void SimpleSGDTrainer::update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) { + auto & p = model->lookup_parameters_list()[idx]; + update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx]}); +} +#endif - pi = 0; - for (auto p : model->lookup_parameters_list()) { - vector& vx = vlp[pi++].h; - for (auto i : p->non_zero_grads) { - Tensor& v = vx[i]; - auto g = scale * gscale * p->grads[i].vec(); - auto g2 = g.cwiseProduct(g); - v.vec() += g2; - auto delta = -eta * g.cwiseQuotient((v.vec().array() + epsilon).matrix().cwiseSqrt()); - p->values[i].vec() += delta / global_weight_decay.CurrentWeightDecay(); - } - p->clear(); - } +// --- MomentumSGDTrainer - ++updates; +// Perform update of ts[0]=parameters, ts[1]=gradients, ts[2]=momentum +template +void MomentumSGDTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { + ts[2]->tvec().device(*dev.edevice) = ts[2]->tvec() * momentum - ts[1]->tvec() * (eta * scale * gscale); + ts[0]->tvec().device(*dev.edevice) += ts[2]->tvec() / global_weight_decay.CurrentWeightDecay(); } +CNN_TRAINER_INST_DEV_IMPL(MomentumSGDTrainer) -void AdadeltaTrainer::update_impl(real scale) { - unsigned pi; - if (!shadow_params_allocated) { - hg = AllocateShadowParameters(*model); - hlg = AllocateShadowLookupParameters(*model); - hd = AllocateShadowParameters(*model); - hld = AllocateShadowLookupParameters(*model); - - /*pi = 0; - for (auto p : model->parameters_list()) { - TensorTools::Constant(hg[pi].h, epsilon); - TensorTools::Constant(hd[pi].h, epsilon); - ++pi; - } +#ifndef __CUDACC__ +void MomentumSGDTrainer::update_params(real scale, real gscale, size_t idx) { + auto & p = model->parameters_list()[idx]; + update_rule(scale, gscale, {&p->values, &p->g, &vp[idx].h}); +} +void MomentumSGDTrainer::update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) { + auto & p = model->lookup_parameters_list()[idx]; + update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx], &vlp[idx].h[lidx]}); +} +void MomentumSGDTrainer::alloc_impl() { + vp = AllocateShadowParameters(*model); + vlp = AllocateShadowLookupParameters(*model); +} +#endif - pi = 0; - for (auto p : model->lookup_parameters_list()) { - vector& hgx = hlg[pi].h; - vector& hdx = hld[pi].h; - for (unsigned i = 0; i < hgx.size(); ++i) { - TensorTools::Constant(hgx[i], epsilon); - TensorTools::Constant(hdx[i], epsilon); - } - ++pi; - }*/ - - shadow_params_allocated = true; - } +// --- AdagradTrainer - const float gscale = clip_gradients(); - pi = 0; - for (auto p : model->parameters_list()) { - auto& g = (scale * gscale) * p->g.vec(); - Tensor& hgv = hg[pi].h; - Tensor& hdv = hd[pi].h; - auto g2 = g.cwiseProduct(g); - hgv.vec() = rho * hgv.vec() + (1.0 - rho) * g2; - auto num = -g.cwiseProduct((hdv.vec().array() + epsilon).matrix().cwiseSqrt()); - auto den = (hgv.vec().array() + epsilon).matrix().cwiseSqrt(); - auto delta = num.cwiseQuotient(den); - auto d2 = delta.cwiseProduct(delta); - hdv.vec() = rho * hdv.vec() + (1.0 - rho) * d2; - p->values.vec() += delta / global_weight_decay.CurrentWeightDecay(); - p->clear(); - pi++; - } +// Perform update of ts[0]=parameters, ts[1]=gradients, ts[2]=stddev +template +void AdagradTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { + ts[1]->tvec().device(*dev.edevice) = ts[1]->tvec() * (scale * gscale); + ts[2]->tvec().device(*dev.edevice) += ts[1]->tvec().square(); + ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() * (ts[2]->tvec() + epsilon).sqrt() * (-eta / global_weight_decay.CurrentWeightDecay()); +} +CNN_TRAINER_INST_DEV_IMPL(AdagradTrainer) - pi = 0; - for (auto p : model->lookup_parameters_list()) { - vector& hgvx = hlg[pi].h; - vector& hdvx = hld[pi].h; - for (auto i : p->non_zero_grads) { - Tensor& hgv = hgvx[i]; - Tensor& hdv = hdvx[i]; - auto& g = scale * gscale * p->grads[i].vec(); - auto g2 = g.cwiseProduct(g); - hgv.vec() = rho * hgv.vec() + (1.0 - rho) * g2; - auto num = -g.cwiseProduct((hdv.vec().array() + epsilon).matrix().cwiseSqrt()); - auto den = (hgv.vec().array() + epsilon).matrix().cwiseSqrt(); - auto delta = num.cwiseQuotient(den); - auto d2 = delta.cwiseProduct(delta); - hdv.vec() = rho * hdv.vec() + (1.0 - rho) * d2; - p->values[i].vec() += delta / global_weight_decay.CurrentWeightDecay(); - } - p->clear(); - pi++; - } - ++updates; +#ifndef __CUDACC__ +void AdagradTrainer::update_params(real scale, real gscale, size_t idx) { + auto & p = model->parameters_list()[idx]; + update_rule(scale, gscale, {&p->values, &p->g, &vp[idx].h}); } +void AdagradTrainer::update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) { + auto & p = model->lookup_parameters_list()[idx]; + update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx], &vlp[idx].h[lidx]}); +} +void AdagradTrainer::alloc_impl() { + vp = AllocateShadowParameters(*model); + vlp = AllocateShadowLookupParameters(*model); +} +#endif -void RmsPropTrainer::update_impl(real scale) { - unsigned pi = 0; - if (!shadow_params_allocated) { - hg.resize(model->parameters_list().size()); +// --- AdadeltaTrainer - pi = 0; - hlg.resize(model->lookup_parameters_list().size()); - for (auto p : model->lookup_parameters_list()) { - hlg[pi++].resize(p->size()); - } +// Perform update of ts[0]=parameters, ts[1]=gradients, ts[2]=hg, ts[3]=hd +template +void AdadeltaTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { + ts[1]->tvec().device(*dev.edevice) = ts[1]->tvec() * (scale * gscale); + ts[2]->tvec().device(*dev.edevice) = ts[2]->tvec() * rho + ts[1]->tvec().square() * (1.f - rho); + ts[1]->tvec().device(*dev.edevice) = - ts[1]->tvec() * (ts[3]->tvec() + epsilon).sqrt() * (ts[2]->tvec() + epsilon).sqrt(); + ts[3]->tvec().device(*dev.edevice) = ts[3]->tvec() * rho + ts[1]->tvec().square() * (1.f - rho); + ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() / global_weight_decay.CurrentWeightDecay(); +} +CNN_TRAINER_INST_DEV_IMPL(AdadeltaTrainer) - shadow_params_allocated = true; - } +#ifndef __CUDACC__ +void AdadeltaTrainer::update_params(real scale, real gscale, size_t idx) { + auto & p = model->parameters_list()[idx]; + update_rule(scale, gscale, {&p->values, &p->g, &hg[idx].h, &hd[idx].h}); +} +void AdadeltaTrainer::update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) { + auto & p = model->lookup_parameters_list()[idx]; + update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx], &hlg[idx].h[lidx], &hld[idx].h[lidx]}); +} +void AdadeltaTrainer::alloc_impl() { + hg = AllocateShadowParameters(*model); + hlg = AllocateShadowLookupParameters(*model); + hd = AllocateShadowParameters(*model); + hld = AllocateShadowLookupParameters(*model); +} +#endif - const float gscale = clip_gradients(); - pi = 0; - for (auto p : model->parameters_list()) { - real& d2 = hg[pi++]; - real g2 = p->g.vec().squaredNorm(); - d2 = rho * d2 + (1.0 - rho) * g2; - p->values.vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->g.vec()) / global_weight_decay.CurrentWeightDecay(); - p->clear(); - } +// --- RmsPropTrainer +// TODO: This is not finished yet, because it memorizes a scalar for each set of parameters, not each parameter itself. +// We could implement this with one tensor for each scalar, but this is pretty wasteful - pi = 0; - for (auto p : model->lookup_parameters_list()) { - vector& hlgx = hlg[pi++]; - for (auto i : p->non_zero_grads) { - real& d2 = hlgx[i]; - real g2 = p->grads[i].vec().squaredNorm(); - d2 = rho * d2 + (1.0 - rho) * g2; - p->values[i].vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->grads[i].vec()) / global_weight_decay.CurrentWeightDecay(); - } - p->clear(); - } - ++updates; +// Perform update of ts[0]=parameters, ts[1]=gradients +template +void RmsPropTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { + throw std::runtime_error("RMSProp optimization not implemented yet."); + // real& d2 = hg[pi++]; + // real g2 = p->g.vec().squaredNorm(); + // d2 = rho * d2 + (1.f - rho) * g2; + // p->values.vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->g.vec()) / global_weight_decay.CurrentWeightDecay(); } +CNN_TRAINER_INST_DEV_IMPL(RmsPropTrainer) -void AdamTrainer::update_impl(real scale) { - unsigned pi; - if (!shadow_params_allocated) { - m = AllocateShadowParameters(*model); - lm = AllocateShadowLookupParameters(*model); - v = AllocateShadowParameters(*model); - lv = AllocateShadowLookupParameters(*model); - shadow_params_allocated = true; - } +#ifndef __CUDACC__ +void RmsPropTrainer::update_params(real scale, real gscale, size_t idx) { + throw std::runtime_error("RMSProp optimization not implemented yet."); + // auto & p = model->parameters_list()[idx]; + // update_rule(scale, gscale, {&p->values, &p->g, &hg[idx].h, &hd[idx].h}); +} +void RmsPropTrainer::update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) { + throw std::runtime_error("RMSProp optimization not implemented yet."); + // auto & p = model->lookup_parameters_list()[idx]; + // update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx], &hlg[idx].h[lidx], &hld[idx].h[lidx]}); +} +void RmsPropTrainer::alloc_impl() { + throw std::runtime_error("RMSProp optimization not implemented yet."); + // hg.resize(model->parameters_list().size()); + // unsigned pi = 0; + // hlg.resize(model->lookup_parameters_list().size()); + // for (auto p : model->lookup_parameters_list()) { + // hlg[pi++].resize(p->size()); + // } +} +#endif - const float gscale = clip_gradients(); - pi = 0; - static unsigned t = 0; - for (auto p : model->parameters_list()) { - ++t; - auto g_t = (scale * gscale) * p->g.vec(); - auto m_t = m[pi].h.vec(); - auto v_t = v[pi].h.vec(); - m_t = beta_1 * m_t + (1 - beta_1) * g_t; - auto g2 = g_t.cwiseProduct(g_t); - v_t = beta_2 * v_t + (1 - beta_2) * g2; - float s1 = 1 - pow(beta_1, t); - float s2 = 1 - pow(beta_2, t); - auto mhat = m_t / s1; - auto vhat = v_t / s2; - auto delta = (-eta * mhat).cwiseQuotient((vhat.array().sqrt() + eps).matrix()); - p->values.vec() += delta / global_weight_decay.CurrentWeightDecay(); - p->clear(); - pi++; - } +// --- AdamTrainer - pi = 0; - for (auto p : model->lookup_parameters_list()) { - vector& vm = lm[pi].h; - vector& vv = lv[pi].h; - for (auto i : p->non_zero_grads) { - auto m_t = vm[i].vec(); - auto v_t = vv[i].vec(); - auto g_t = scale * gscale * p->grads[i].vec(); - auto g2 = g_t.cwiseProduct(g_t); - m_t = beta_1 * m_t + (1 - beta_1) * g_t; - v_t = beta_2 * v_t + (1 - beta_2) * g2; - float s1 = 1 - pow(beta_1, t); - float s2 = 1 - pow(beta_2, t); - auto mhat = m_t / s1; - auto vhat = v_t / s2; - auto delta = (-eta * mhat).cwiseQuotient((vhat.array().sqrt() + eps).matrix()); - p->values[i].vec() += delta / global_weight_decay.CurrentWeightDecay(); - } - p->clear(); - pi++; - } - ++updates; +// Perform update of ts[0]=parameters, ts[1]=gradients, ts[2]=mean, ts[3]=variance +template +void AdamTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { + ts[1]->tvec().device(*dev.edevice) = ts[1]->tvec() * (scale * gscale); + ts[2]->tvec().device(*dev.edevice) = ts[2]->tvec() * beta_1 + ts[1]->tvec() * (1 - beta_1); + ts[3]->tvec().device(*dev.edevice) = ts[3]->tvec() * beta_2 + ts[1]->tvec().square() * (1 - beta_2); + // TODO: Is updates really appropriate here? + float s1 = 1 - pow(beta_1, updates); + float s2 = 1 - pow(beta_2, updates); + ts[0]->tvec() += ts[2]->tvec() * ((ts[3]->tvec() / s2).sqrt() + epsilon) * (-eta / s1 / global_weight_decay.CurrentWeightDecay()); } +CNN_TRAINER_INST_DEV_IMPL(AdamTrainer) + +#ifndef __CUDACC__ +void AdamTrainer::update_params(real scale, real gscale, size_t idx) { + auto & p = model->parameters_list()[idx]; + update_rule(scale, gscale, {&p->values, &p->g, &m[idx].h, &v[idx].h}); +} +void AdamTrainer::update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) { + auto & p = model->lookup_parameters_list()[idx]; + update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx], &lm[idx].h[lidx], &lv[idx].h[lidx]}); +} +void AdamTrainer::alloc_impl() { + m = AllocateShadowParameters(*model); + lm = AllocateShadowLookupParameters(*model); + v = AllocateShadowParameters(*model); + lv = AllocateShadowLookupParameters(*model); +} +#endif } // namespace cnn diff --git a/cnn/training.h b/cnn/training.h index beab5739e..ff7fcd641 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -5,11 +5,18 @@ #include "cnn/model.h" #include "cnn/shadow-params.h" +#define CNN_TRAINER_DEFINE_DEV_IMPL() \ + void update_params(real scale, real gscale, size_t idx) override; \ + void update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) override; \ + template \ + void update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & values); \ + void update_rule(real scale, real gscale, const std::vector & values) override; + namespace cnn { struct Trainer { explicit Trainer(Model* m, real e0) : - eta0(e0), eta(e0), eta_decay(), epoch(), clipping_enabled(true), clip_threshold(5), clips(), updates(), model(m) {} + eta0(e0), eta(e0), eta_decay(), epoch(), clipping_enabled(true), clip_threshold(5), clips(), updates(), aux_allocated(false), model(m) {} virtual ~Trainer(); void update(real scale = 1.0); @@ -35,6 +42,8 @@ struct Trainer { real clips; real updates; + bool aux_allocated; + void status() { std::cerr << "[epoch=" << epoch << " eta=" << eta << " clips=" << clips << " updates=" << updates << "] "; updates = clips = 0; @@ -44,25 +53,27 @@ struct Trainer { protected: void rescale_and_reset_weight_decay(); - virtual void update_impl(real scale) = 0; + virtual void alloc_impl() { } + virtual void update_rule(real scale, real gscale, const std::vector & values) = 0; + virtual void update_params(real scale, real gscale, size_t idx) = 0; + virtual void update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) = 0; }; struct SimpleSGDTrainer : public Trainer { explicit SimpleSGDTrainer(Model* m, real e0 = 0.1) : Trainer(m, e0) {} protected: - void update_impl(real scale) override; - void update_params(const std::vector &lookup_params, const std::vector ¶ms, real scale = 1); + CNN_TRAINER_DEFINE_DEV_IMPL() }; struct MomentumSGDTrainer : public Trainer { explicit MomentumSGDTrainer(Model* m, real e0 = 0.01, real mom = 0.9) : - Trainer(m, e0), momentum(mom), velocity_allocated(false) {} + Trainer(m, e0), momentum(mom) {} protected: - void update_impl(real scale) override; - real momentum; + CNN_TRAINER_DEFINE_DEV_IMPL() + virtual void alloc_impl() override; - bool velocity_allocated; + real momentum; // the following represent the current velocity std::vector vp; @@ -73,25 +84,25 @@ struct MomentumSGDTrainer : public Trainer { struct AdagradTrainer : public Trainer { explicit AdagradTrainer(Model* m, real e0 = 0.1, real eps = 1e-20) : - Trainer(m, e0), epsilon(eps), shadow_params_allocated(false) {} + Trainer(m, e0), epsilon(eps) {} protected: - void update_impl(real scale) override; + CNN_TRAINER_DEFINE_DEV_IMPL() + virtual void alloc_impl() override; real epsilon; - bool shadow_params_allocated; std::vector vp; std::vector vlp; }; struct AdadeltaTrainer : public Trainer { explicit AdadeltaTrainer(Model* m, real eps = 1e-6, real rho = 0.95) : - Trainer(m, 1.0), epsilon(eps), rho(rho), shadow_params_allocated(false) {} + Trainer(m, 1.0), epsilon(eps), rho(rho) {} protected: - void update_impl(real scale) override; + CNN_TRAINER_DEFINE_DEV_IMPL() + virtual void alloc_impl() override; real epsilon; real rho; - bool shadow_params_allocated; std::vector hg; // History of gradients std::vector hlg; std::vector hd; // History of deltas @@ -100,28 +111,28 @@ struct AdadeltaTrainer : public Trainer { struct RmsPropTrainer : public Trainer { explicit RmsPropTrainer(Model* m, real e0 = 0.1, real eps = 1e-20, real rho = 0.95) : - Trainer(m, e0), epsilon(eps), rho(rho), shadow_params_allocated(false) {} + Trainer(m, e0), epsilon(eps), rho(rho) {} protected: - void update_impl(real scale) override; + CNN_TRAINER_DEFINE_DEV_IMPL() + virtual void alloc_impl() override; real epsilon; real rho; - bool shadow_params_allocated; std::vector hg; // History of gradients std::vector > hlg; }; struct AdamTrainer : public Trainer { explicit AdamTrainer(Model* m, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8) : - Trainer(m, alpha), beta_1(beta_1), beta_2(beta_2), eps(eps), shadow_params_allocated(false) {} + Trainer(m, alpha), beta_1(beta_1), beta_2(beta_2), epsilon(eps) {} protected: - void update_impl(real scale) override; + CNN_TRAINER_DEFINE_DEV_IMPL() + virtual void alloc_impl() override; float beta_1; float beta_2; - float eps; - bool shadow_params_allocated; + float epsilon; std::vector m; // History of gradients std::vector lm; std::vector v; // History of deltas From f1b58e5bea342bc83c4572feb9708cf33166cf37 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 14 Jun 2016 02:51:25 -0700 Subject: [PATCH 536/965] Updated trainer and added tests --- cnn/model.cc | 1 + cnn/nodes.h | 2 +- tests/CMakeLists.txt | 1 + tests/test-trainers.cc | 127 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 tests/test-trainers.cc diff --git a/cnn/model.cc b/cnn/model.cc index eae515e67..6d5b4a1b0 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -28,6 +28,7 @@ ParameterStorageBase::~ParameterStorageBase() {} ParameterStorage::ParameterStorage(const Dim& d, float scale) : dim(d) { values.d = g.d = d; values.v = static_cast(default_device->ps->allocate(d.size() * sizeof(float))); + values.device = default_device; if (scale) { TensorTools::Randomize(values, scale); } diff --git a/cnn/nodes.h b/cnn/nodes.h index 8848f6752..3823a4d00 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -514,7 +514,7 @@ struct PickElement : public Node { // y = x_1[start:end] // (start inclusive, end exclusive) struct PickRange : public Node { - explicit PickRange(const std::initializer_list& a, unsigned start, unsigned end) : Node(a), start(start), end(end) {} + explicit PickRange(const std::initializer_list& a, unsigned s, unsigned e) : Node(a), start(s), end(e) {} CNN_NODE_DEFINE_DEV_IMPL() unsigned start; unsigned end; diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 54e299e56..ad987bbcd 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -8,6 +8,7 @@ add_definitions (-DBOOST_TEST_DYN_LINK) # Sources: set(test_cnn_SRCS test-nodes.cc + test-trainers.cc ) add_executable (test-cnn test-cnn.cc ${test_cnn_SRCS}) diff --git a/tests/test-trainers.cc b/tests/test-trainers.cc new file mode 100644 index 000000000..9ae0656a6 --- /dev/null +++ b/tests/test-trainers.cc @@ -0,0 +1,127 @@ +#include +#include +#include +#include +#include +#include + +using namespace cnn; +using namespace cnn::expr; +using namespace std; + + +struct TrainerTest { + TrainerTest() { + // Initialize if necessary + if(default_device == nullptr) { + for (auto x : {"TrainerTest", "--cnn-mem", "10"}) { + av.push_back(strdup(x)); + } + char **argv = &av[0]; + int argc = av.size(); + cnn::Initialize(argc, argv); + } + ones_vals = {1.f,1.f,1.f}; + param_vals = {1.1f,-2.2f,3.3f}; + } + ~TrainerTest() { + for (auto x : av) free(x); + } + + template + std::string print_vec(const std::vector vec) { + ostringstream oss; + if(vec.size()) oss << vec[0]; + for(size_t i = 1; i < vec.size(); i++) + oss << ' ' << vec[i]; + return oss.str(); + } + + std::vector ones_vals, param_vals; + std::vector av; +}; + +// define the test suite +BOOST_FIXTURE_TEST_SUITE(trainer_test, TrainerTest); + +BOOST_AUTO_TEST_CASE( simple_sgd_direction ) { + cnn::Model mod; + cnn::Parameter param = mod.add_parameters({3}); + TensorTools::SetElements(param.get()->values,param_vals); + SimpleSGDTrainer trainer(&mod); + cnn::ComputationGraph cg; + Expression x = parameter(cg, param); + Expression y = input(cg, {1,3}, ones_vals); + y*x; + float before = as_scalar(cg.forward()); + cg.backward(); + trainer.update(0.1); + float after = as_scalar(cg.forward()); + BOOST_CHECK_LT(after, before); +} + +BOOST_AUTO_TEST_CASE( momentum_sgd_direction ) { + cnn::Model mod; + cnn::Parameter param = mod.add_parameters({3}); + TensorTools::SetElements(param.get()->values,param_vals); + MomentumSGDTrainer trainer(&mod); + cnn::ComputationGraph cg; + Expression x = parameter(cg, param); + Expression y = input(cg, {1,3}, ones_vals); + y*x; + float before = as_scalar(cg.forward()); + cg.backward(); + trainer.update(0.1); + float after = as_scalar(cg.forward()); + BOOST_CHECK_LT(after, before); +} + +BOOST_AUTO_TEST_CASE( adagrad_direction ) { + cnn::Model mod; + cnn::Parameter param = mod.add_parameters({3}); + TensorTools::SetElements(param.get()->values,param_vals); + AdagradTrainer trainer(&mod); + cnn::ComputationGraph cg; + Expression x = parameter(cg, param); + Expression y = input(cg, {1,3}, ones_vals); + y*x; + float before = as_scalar(cg.forward()); + cg.backward(); + trainer.update(0.1); + float after = as_scalar(cg.forward()); + BOOST_CHECK_LT(after, before); +} + +BOOST_AUTO_TEST_CASE( adadelta_direction ) { + cnn::Model mod; + cnn::Parameter param = mod.add_parameters({3}); + TensorTools::SetElements(param.get()->values,param_vals); + AdadeltaTrainer trainer(&mod); + cnn::ComputationGraph cg; + Expression x = parameter(cg, param); + Expression y = input(cg, {1,3}, ones_vals); + y*x; + float before = as_scalar(cg.forward()); + cg.backward(); + trainer.update(0.1); + float after = as_scalar(cg.forward()); + BOOST_CHECK_LT(after, before); +} + +BOOST_AUTO_TEST_CASE( adam_direction ) { + cnn::Model mod; + cnn::Parameter param = mod.add_parameters({3}); + TensorTools::SetElements(param.get()->values,param_vals); + AdamTrainer trainer(&mod); + cnn::ComputationGraph cg; + Expression x = parameter(cg, param); + Expression y = input(cg, {1,3}, ones_vals); + y*x; + float before = as_scalar(cg.forward()); + cg.backward(); + trainer.update(0.1); + float after = as_scalar(cg.forward()); + BOOST_CHECK_LT(after, before); +} + +BOOST_AUTO_TEST_SUITE_END() From c1c3f2f663e9a6c502d842b4c1b67f2435e18a6c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 14 Jun 2016 04:21:15 -0700 Subject: [PATCH 537/965] Fixed segfault in trainers --- cnn/model.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cnn/model.cc b/cnn/model.cc index 6d5b4a1b0..d635c8398 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -28,7 +28,7 @@ ParameterStorageBase::~ParameterStorageBase() {} ParameterStorage::ParameterStorage(const Dim& d, float scale) : dim(d) { values.d = g.d = d; values.v = static_cast(default_device->ps->allocate(d.size() * sizeof(float))); - values.device = default_device; + values.device = g.device = default_device; if (scale) { TensorTools::Randomize(values, scale); } @@ -83,11 +83,13 @@ LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d auto& v = values[i]; v.d = d; v.v = static_cast(default_device->ps->allocate(d.size() * sizeof(float))); + v.device = default_device; TensorTools::Randomize(v); auto& g = grads[i]; g.d = d; g.v = static_cast(default_device->ps->allocate(d.size() * sizeof(float))); + g.device = default_device; TensorTools::Zero(g); } } From e449f707d53803f344d8d88c5401036065345cdd Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 14 Jun 2016 04:58:36 -0700 Subject: [PATCH 538/965] Fixed parameter clearing bug in training --- cnn/training.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cnn/training.cc b/cnn/training.cc index 89b326fc9..9a035f8c8 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -76,12 +76,16 @@ void Trainer::update(real scale) { // Perform gradient clipping and cycle through parameters const float gscale = clip_gradients(); const auto & params = model->parameters_list(); - for(size_t i = 0; i < params.size(); ++i) + for(size_t i = 0; i < params.size(); ++i) { update_params(scale, gscale, i); + params[i]->clear(); + } const auto & lookup_params = model->lookup_parameters_list(); - for(size_t i = 0; i < lookup_params.size(); ++i) + for(size_t i = 0; i < lookup_params.size(); ++i) { for (auto j : lookup_params[i]->non_zero_grads) update_lookup_params(scale, gscale, i, j); + lookup_params[i]->clear(); + } ++updates; global_weight_decay.UpdateWeightDecay(); // update global weight scale From 657a4afbb1778c9369642c832ad55dd9b4da29be Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 14 Jun 2016 11:58:22 -0700 Subject: [PATCH 539/965] Fixes to Adam --- cnn/training.cc | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/cnn/training.cc b/cnn/training.cc index 9a035f8c8..2b0febbbc 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -147,7 +147,7 @@ template void AdagradTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { ts[1]->tvec().device(*dev.edevice) = ts[1]->tvec() * (scale * gscale); ts[2]->tvec().device(*dev.edevice) += ts[1]->tvec().square(); - ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() * (ts[2]->tvec() + epsilon).sqrt() * (-eta / global_weight_decay.CurrentWeightDecay()); + ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() / (ts[2]->tvec() + epsilon).sqrt() * (-eta / global_weight_decay.CurrentWeightDecay()); } CNN_TRAINER_INST_DEV_IMPL(AdagradTrainer) @@ -173,7 +173,7 @@ template void AdadeltaTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { ts[1]->tvec().device(*dev.edevice) = ts[1]->tvec() * (scale * gscale); ts[2]->tvec().device(*dev.edevice) = ts[2]->tvec() * rho + ts[1]->tvec().square() * (1.f - rho); - ts[1]->tvec().device(*dev.edevice) = - ts[1]->tvec() * (ts[3]->tvec() + epsilon).sqrt() * (ts[2]->tvec() + epsilon).sqrt(); + ts[1]->tvec().device(*dev.edevice) = - ts[1]->tvec() * (ts[3]->tvec() + epsilon).sqrt() / (ts[2]->tvec() + epsilon).sqrt(); ts[3]->tvec().device(*dev.edevice) = ts[3]->tvec() * rho + ts[1]->tvec().square() * (1.f - rho); ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() / global_weight_decay.CurrentWeightDecay(); } @@ -239,12 +239,11 @@ void RmsPropTrainer::alloc_impl() { template void AdamTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { ts[1]->tvec().device(*dev.edevice) = ts[1]->tvec() * (scale * gscale); - ts[2]->tvec().device(*dev.edevice) = ts[2]->tvec() * beta_1 + ts[1]->tvec() * (1 - beta_1); - ts[3]->tvec().device(*dev.edevice) = ts[3]->tvec() * beta_2 + ts[1]->tvec().square() * (1 - beta_2); - // TODO: Is updates really appropriate here? - float s1 = 1 - pow(beta_1, updates); - float s2 = 1 - pow(beta_2, updates); - ts[0]->tvec() += ts[2]->tvec() * ((ts[3]->tvec() / s2).sqrt() + epsilon) * (-eta / s1 / global_weight_decay.CurrentWeightDecay()); + ts[2]->tvec().device(*dev.edevice) = ts[2]->tvec() * beta_1 + ts[1]->tvec() * (1.f - beta_1); + ts[3]->tvec().device(*dev.edevice) = ts[3]->tvec() * beta_2 + ts[1]->tvec().square() * (1.f - beta_2); + float s1 = 1 - pow(beta_1, updates+1); + float s2 = 1 - pow(beta_2, updates+1); + ts[0]->tvec() += ts[2]->tvec() / ((ts[3]->tvec() / s2).sqrt() + epsilon) * (-eta / s1 / global_weight_decay.CurrentWeightDecay()); } CNN_TRAINER_INST_DEV_IMPL(AdamTrainer) From d3d4a2ba468f6148b15e1a340c0cf985986343b7 Mon Sep 17 00:00:00 2001 From: dhg Date: Wed, 15 Jun 2016 09:46:10 -0700 Subject: [PATCH 540/965] Added `inputMatrix(v, (d1,d2))` to PyCNN (so separate `set` not req'd) --- pycnn/pycnn.pyx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index ac9aba9ef..89bed005e 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -343,6 +343,8 @@ cdef class ComputationGraph: return _vecInputExpression(self, v) cdef inputMatrix(self, int d1, int d2): return _vecInputExpression(self, vector[float](d1*d2), (d1,d2)) + def inputMatrixLiteral(self, vector[float] v, tuple d): + return _vecInputExpression(self, v, d) cdef lookup(self, LookupParameters p, unsigned v = 0, update=True): return _lookupExpression(self, p, v, update) cdef lookup_batch(self, LookupParameters p, vector[unsigned] vs, update=True): @@ -524,6 +526,9 @@ def inputVector(vector[float] v): def matInput(int d1, int d2): return _cg.inputMatrix(d1, d2) +def inputMatrix(vector[float] v, tuple d): + return _cg.inputMatrixLiteral(v, d) + cdef class _lookupExpression(Expression): cdef UnsignedValue val def __cinit__(self, ComputationGraph g, LookupParameters p, unsigned index=0, update=True): From 0871f51bc7da391d119017ed20438a215b6e462e Mon Sep 17 00:00:00 2001 From: dhg Date: Wed, 15 Jun 2016 11:22:24 -0700 Subject: [PATCH 541/965] Added nobackprop expression type to PyCNN --- pycnn/pycnn.pxd | 3 +++ pycnn/pycnn.pyx | 1 + 2 files changed, 4 insertions(+) diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index 9d57703cf..3e78789d2 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -143,6 +143,9 @@ cdef extern from "cnn/expr.h" namespace "cnn::expr": CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, unsigned* pindex) # CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, vector[unsigned]* pindices) # + # identity function, but derivative is not propagated through it + CExpression c_nobackprop "cnn::expr::nobackprop" (CExpression& x) # + CExpression c_op_neg "cnn::expr::operator-" (CExpression& x) # CExpression c_op_add "cnn::expr::operator+" (CExpression& x, CExpression& y) # CExpression c_op_scalar_add "cnn::expr::operator+" (CExpression& x, float y) # diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index ac9aba9ef..84c6c3fa9 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -615,6 +615,7 @@ def hinge(Expression x, unsigned index, float m=1.0): # }}} +cpdef Expression nobackprop(Expression x): return Expression.from_cexpr(x.cg_version, c_nobackprop(x.c())) # binary-exp cpdef Expression cdiv(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_cdiv(x.c(), y.c())) From bd676a51b6acfb079e0c6d8891029c1e9306fbc3 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 16 Jun 2016 07:36:43 +0900 Subject: [PATCH 542/965] Fixed a couple bugs in training on GPU --- cnn/CMakeLists.txt | 4 ++-- cnn/training.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 193d3c681..782d33dae 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -117,8 +117,8 @@ if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU") SET(CUDA_PROPAGATE_HOST_FLAGS OFF) - cuda_add_library(cnncuda STATIC gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-param-nodes.cu) - cuda_add_library(cnncuda_shared SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-param-nodes.cu) + cuda_add_library(cnncuda STATIC gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-param-nodes.cu gpu-training.cu) + cuda_add_library(cnncuda_shared SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-param-nodes.cu gpu-training.cu) endif(WITH_CUDA_BACKEND) install(FILES ${cnn_library_HDRS} DESTINATION include/cnn) diff --git a/cnn/training.cc b/cnn/training.cc index 2b0febbbc..0eceda221 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -8,7 +8,7 @@ #ifdef __CUDACC__ #define CNN_TRAINER_INST_DEV_IMPL(MyTrainer) \ template void MyTrainer::update_rule_dev(const Device_GPU & dev, real scale, real gscale, const std::vector & values); -#elif defined(HAVE_GPU) +#elif defined(HAVE_CUDA) #define CNN_TRAINER_INST_DEV_IMPL(MyTrainer) \ extern template void MyTrainer::update_rule_dev(const Device_GPU & dev, real scale, real gscale, const std::vector & values); \ template void MyTrainer::update_rule_dev(const Device_CPU & dev, real scale, real gscale, const std::vector & values); \ @@ -243,7 +243,7 @@ void AdamTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, ts[3]->tvec().device(*dev.edevice) = ts[3]->tvec() * beta_2 + ts[1]->tvec().square() * (1.f - beta_2); float s1 = 1 - pow(beta_1, updates+1); float s2 = 1 - pow(beta_2, updates+1); - ts[0]->tvec() += ts[2]->tvec() / ((ts[3]->tvec() / s2).sqrt() + epsilon) * (-eta / s1 / global_weight_decay.CurrentWeightDecay()); + ts[0]->tvec().device(*dev.edevice) += ts[2]->tvec() / ((ts[3]->tvec() / s2).sqrt() + epsilon) * (-eta / s1 / global_weight_decay.CurrentWeightDecay()); } CNN_TRAINER_INST_DEV_IMPL(AdamTrainer) From f01219eee612450e0278d0f4b856ac1cd5a39dd5 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 16 Jun 2016 08:23:42 +0900 Subject: [PATCH 543/965] Added GPU file for training --- cnn/gpu-training.cu | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 cnn/gpu-training.cu diff --git a/cnn/gpu-training.cu b/cnn/gpu-training.cu new file mode 100644 index 000000000..7ad69abcb --- /dev/null +++ b/cnn/gpu-training.cu @@ -0,0 +1,3 @@ +// This is a dummy file that contains the same content as training.cc but compiled +// on CUDA +#include "training.cc" From 7ddcf3166f38259ee4fd57494386812147cb8b18 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 17 Jun 2016 18:00:34 +0900 Subject: [PATCH 544/965] Made it possible to specify memory on GPU --- cnn/cuda.cc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/cnn/cuda.cc b/cnn/cuda.cc index ec0ae5ac3..ee60f52a3 100644 --- a/cnn/cuda.cc +++ b/cnn/cuda.cc @@ -33,11 +33,21 @@ vector Initialize_GPU(int& argc, char**& argv) { int requested_gpus = -1; vector gpu_mask(MAX_GPUS,0); int argi = 1; + int num_mb = 512; bool ngpus_requested = false; bool ids_requested = false; for( ;argi < argc; ++argi) { string arg = argv[argi]; - if (arg == "--cnn_gpus" || arg == "--cnn-gpus") { + if (arg == "--cnn-mem" || arg == "--cnn_mem") { + if ((argi + 1) > argc) { + cerr << "[cnn] --cnn-mem expects an argument (the memory, in megabytes, to reserve)\n"; + abort(); + } else { + string a2 = argv[argi+1]; + istringstream c(a2); c >> num_mb; + RemoveArgs(argc, argv, argi, 2); + } + } else if (arg == "--cnn_gpus" || arg == "--cnn-gpus") { if ((argi + 1) > argc) { cerr << "[cnn] --cnn-gpus expects an argument (number of GPUs to use)\n"; abort(); @@ -140,8 +150,7 @@ vector Initialize_GPU(int& argc, char**& argv) { cerr << "[cnn] Device(s) selected:"; for (int i = 0; i < requested_gpus; ++i) { cerr << ' ' << gpus[i]; - int mb = 512; - Device* d = new Device_GPU(mb, gpus[i]); + Device* d = new Device_GPU(num_mb, gpus[i]); gpudevices.push_back(d); } cerr << endl; From 24a103831879956dcd2716ea1646f435bd1454ad Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 17 Jun 2016 11:40:07 -0700 Subject: [PATCH 545/965] Moved conv to nodes-conve --- cnn/CMakeLists.txt | 4 ++-- cnn/expr.cc | 2 +- cnn/{conv.cc => nodes-conv.cc} | 2 +- cnn/{conv.h => nodes-conv.h} | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) rename cnn/{conv.cc => nodes-conv.cc} (99%) rename cnn/{conv.h => nodes-conv.h} (98%) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 782d33dae..fbb51fc8e 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -3,7 +3,6 @@ set(cnn_library_SRCS cfsm-builder.cc cnn.cc - conv.cc deep-lstm.cc devices.cc dict.cc @@ -24,6 +23,7 @@ set(cnn_library_SRCS nodes.cc nodes-common.cc nodes-contract.cc + nodes-conv.cc param-nodes.cc pretrain.cc rnn.cc @@ -41,7 +41,6 @@ set(cnn_library_HDRS cfsm-builder.h c2w.h cnn.h - conv.h cuda.h devices.h dict.h @@ -63,6 +62,7 @@ set(cnn_library_HDRS mp.h nodes.h nodes-contract.h + nodes-conv.h param-nodes.h rnn-state-machine.h rnn.h diff --git a/cnn/expr.cc b/cnn/expr.cc index 25df12fbd..ec8ddfc06 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -3,7 +3,7 @@ #include #include "cnn/nodes.h" -#include "cnn/conv.h" +#include "cnn/nodes-conv.h" namespace cnn { namespace expr { diff --git a/cnn/conv.cc b/cnn/nodes-conv.cc similarity index 99% rename from cnn/conv.cc rename to cnn/nodes-conv.cc index 78f0e6f05..13c85af96 100644 --- a/cnn/conv.cc +++ b/cnn/nodes-conv.cc @@ -1,4 +1,4 @@ -#include "cnn/conv.h" +#include "cnn/nodes-conv.h" #include #include diff --git a/cnn/conv.h b/cnn/nodes-conv.h similarity index 98% rename from cnn/conv.h rename to cnn/nodes-conv.h index 3519cce80..0f9e01634 100644 --- a/cnn/conv.h +++ b/cnn/nodes-conv.h @@ -1,5 +1,5 @@ -#ifndef CNN_CONV_H_ -#define CNN_CONV_H_ +#ifndef CNN_NODES_CONV_H_ +#define CNN_NODES_CONV_H_ #include "cnn/cnn.h" From 4cc2385a400e75ad901150f156e789e58926cd62 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 17 Jun 2016 11:56:56 -0700 Subject: [PATCH 546/965] Templated convolutional nodes --- cnn/nodes-conv.cc | 231 +++++++++++++++++++++----------------------- cnn/nodes-conv.h | 37 +------ tests/test-nodes.cc | 3 +- 3 files changed, 117 insertions(+), 154 deletions(-) diff --git a/cnn/nodes-conv.cc b/cnn/nodes-conv.cc index 13c85af96..efc714db9 100644 --- a/cnn/nodes-conv.cc +++ b/cnn/nodes-conv.cc @@ -6,6 +6,8 @@ #include #include "cnn/functors.h" +#include "cnn/nodes-macros.h" + #if HAVE_CUDA #include "cnn/cuda.h" #include "cnn/gpu-ops.h" @@ -15,6 +17,8 @@ using namespace std; namespace cnn { +#ifndef __CUDACC__ + string FoldRows::as_string(const vector& arg_names) const { ostringstream os; os << "fold_rows(" << arg_names[0] << ", nrows=" << nrows << ')'; @@ -30,41 +34,6 @@ Dim FoldRows::dim_forward(const vector& xs) const { return Dim({orows, xs[0].cols()}); } -void FoldRows::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("FoldRows::forward not implemented for CUDA"); -#else - auto x = **xs[0]; - auto y = *fx; - unsigned orows = y.rows(); - for (unsigned i = 0; i < orows; ++i) { - for (unsigned j = 0; j < nrows; ++j) { - if (j) - y.row(i) += x.row(i * nrows + j); - else // j = 0 - y.row(i) = x.row(i * nrows); - } - } -#endif -} - -void FoldRows::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("FoldRows::backward not implemented for CUDA"); -#else - unsigned orows = fx.d.rows(); - auto d = *dEdf; - auto di = *dEdxi; - for (unsigned i = 0; i < orows; ++i) - for (unsigned j = 0; j < nrows; ++j) - di.row(i * nrows + j) += d.row(i); -#endif -} - string Conv1DNarrow::as_string(const vector& arg_names) const { ostringstream os; os << "conv1d_narrow(" << arg_names[0] << ", f=" << arg_names[1] << ')'; @@ -86,10 +55,84 @@ Dim Conv1DNarrow::dim_forward(const vector& xs) const { return Dim({xs[0].rows(), ocols}); } -void Conv1DNarrow::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Conv1DNarrow::forward not implemented for CUDA"); -#else +string Conv1DWide::as_string(const vector& arg_names) const { + ostringstream os; + os << "conv1d_wide(" << arg_names[0] << ", f=" << arg_names[1] << ')'; + return os.str(); +} + +Dim Conv1DWide::dim_forward(const vector& xs) const { + if (xs.size() != 2) { + cerr << "Conv1DWide requires two inputs: " << xs << endl; + throw std::invalid_argument("Conv1DWide requires two inputs"); + } + unsigned ocols = xs[0].cols() + xs[1].cols() - 1; + if (xs[0].ndims() != 2 || xs[1].ndims() != 2 || + xs[0].rows() != xs[1].rows()) { + cerr << "Bad input dimensions in Conv1DWide: " << xs << endl; + throw std::invalid_argument("bad input dimensions in Conv1DWide"); + } + return Dim({xs[0].rows(), ocols}); +} + +string KMaxPooling::as_string(const vector& arg_names) const { + ostringstream os; + os << "kmaxpool(" << arg_names[0] << ", k=" << k << ')'; + return os.str(); +} + +Dim KMaxPooling::dim_forward(const vector& xs) const { + if (k < 1) { + cerr << "Bad bad k in KMaxPooling: " << k << endl; + throw std::invalid_argument("bad k in KMaxPooling"); + } + if (xs[0].ndims() != 2 || (xs[0].cols() < k)) { + cerr << "Bad input dimensions in KMaxPooling: " << xs << endl; + throw std::invalid_argument("bad input dimensions in KMaxPooling"); + } + return Dim({xs[0].rows(), k}); +} + +size_t KMaxPooling::aux_storage_size() const { + // map of where the entries in f(x) go to entries in x + return sizeof(int) * dim.size(); +} + +#endif + +template +void FoldRows::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + auto x = **xs[0]; + auto y = *fx; + unsigned orows = y.rows(); + for (unsigned i = 0; i < orows; ++i) { + for (unsigned j = 0; j < nrows; ++j) { + if (j) + y.row(i) += x.row(i * nrows + j); + else // j = 0 + y.row(i) = x.row(i * nrows); + } + } +} + +template +void FoldRows::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + unsigned orows = fx.d.rows(); + auto d = *dEdf; + auto di = *dEdxi; + for (unsigned i = 0; i < orows; ++i) + for (unsigned j = 0; j < nrows; ++j) + di.row(i * nrows + j) += d.row(i); +} +CNN_NODE_INST_DEV_IMPL(FoldRows) + +template +void Conv1DNarrow::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { // TODO this is a bad implementation- rewrite to use unsupported Eigen tensor library auto x = **xs[0]; // input auto f = **xs[1]; // filter @@ -105,17 +148,15 @@ void Conv1DNarrow::forward_impl(const vector& xs, Tensor& fx) con y(i, j) = t; } } -#endif } -void Conv1DNarrow::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Conv1DNarrow::backward not implemented for CUDA"); -#else +template +void Conv1DNarrow::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { // TODO this is a bad implementation- rewrite to use unsupported Eigen tensor library assert(i < 2); const unsigned rows = xs[0]->d.rows(); @@ -140,33 +181,11 @@ void Conv1DNarrow::backward_impl(const vector& xs, } } } -#endif -} - -string Conv1DWide::as_string(const vector& arg_names) const { - ostringstream os; - os << "conv1d_wide(" << arg_names[0] << ", f=" << arg_names[1] << ')'; - return os.str(); -} - -Dim Conv1DWide::dim_forward(const vector& xs) const { - if (xs.size() != 2) { - cerr << "Conv1DWide requires two inputs: " << xs << endl; - throw std::invalid_argument("Conv1DWide requires two inputs"); - } - unsigned ocols = xs[0].cols() + xs[1].cols() - 1; - if (xs[0].ndims() != 2 || xs[1].ndims() != 2 || - xs[0].rows() != xs[1].rows()) { - cerr << "Bad input dimensions in Conv1DWide: " << xs << endl; - throw std::invalid_argument("bad input dimensions in Conv1DWide"); - } - return Dim({xs[0].rows(), ocols}); } +CNN_NODE_INST_DEV_IMPL(Conv1DNarrow) -void Conv1DWide::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Conv1DWide::forward not implemented for CUDA"); -#else +template +void Conv1DWide::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { TensorTools::Zero(fx); auto x = **xs[0]; // input auto f = **xs[1]; // filter @@ -181,17 +200,16 @@ void Conv1DWide::forward_impl(const vector& xs, Tensor& fx) const y(i, j + k) += f(i, k) * xij; } } -#endif } -void Conv1DWide::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("Conv1DWide::backward not implemented for CUDA"); -#else + +template +void Conv1DWide::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { assert(i < 2); const unsigned rows = xs[0]->d.rows(); const unsigned xcols = xs[0]->d.cols(); @@ -216,36 +234,11 @@ void Conv1DWide::backward_impl(const vector& xs, } } } -#endif } +CNN_NODE_INST_DEV_IMPL(Conv1DWide) -string KMaxPooling::as_string(const vector& arg_names) const { - ostringstream os; - os << "kmaxpool(" << arg_names[0] << ", k=" << k << ')'; - return os.str(); -} - -Dim KMaxPooling::dim_forward(const vector& xs) const { - if (k < 1) { - cerr << "Bad bad k in KMaxPooling: " << k << endl; - throw std::invalid_argument("bad k in KMaxPooling"); - } - if (xs[0].ndims() != 2 || (xs[0].cols() < k)) { - cerr << "Bad input dimensions in KMaxPooling: " << xs << endl; - throw std::invalid_argument("bad input dimensions in KMaxPooling"); - } - return Dim({xs[0].rows(), k}); -} - -size_t KMaxPooling::aux_storage_size() const { - // map of where the entries in f(x) go to entries in x - return sizeof(int) * dim.size(); -} - -void KMaxPooling::forward_impl(const vector& xs, Tensor& fx) const { -#ifdef HAVE_CUDA - throw std::runtime_error("KMaxPooling::forward not implemented for CUDA"); -#else +template +void KMaxPooling::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { auto x=**xs[0]; auto y=*fx; float tmp[1024]; @@ -275,17 +268,15 @@ void KMaxPooling::forward_impl(const vector& xs, Tensor& fx) cons //cerr << endl; abort(); } assert(mi == dim.size()); -#endif } -void KMaxPooling::backward_impl(const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { -#ifdef HAVE_CUDA - throw std::runtime_error("KMaxPooling::backward not implemented for CUDA"); -#else +template +void KMaxPooling::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { const unsigned rows = dim.rows(); const unsigned cols = dim.cols(); const int* maxmap = static_cast(aux_mem); @@ -303,7 +294,7 @@ void KMaxPooling::backward_impl(const vector& xs, (*dEdxi)(i, oj) += (*dEdf)(i, j); } } -#endif } +CNN_NODE_INST_DEV_IMPL(KMaxPooling) } // namespace cnn diff --git a/cnn/nodes-conv.h b/cnn/nodes-conv.h index 0f9e01634..b5c4f7096 100644 --- a/cnn/nodes-conv.h +++ b/cnn/nodes-conv.h @@ -2,33 +2,20 @@ #define CNN_NODES_CONV_H_ #include "cnn/cnn.h" +#include "cnn/nodes-macros.h" namespace cnn { struct KMaxPooling : public Node { explicit KMaxPooling(const std::initializer_list& a, unsigned k = 1) : Node(a), k(k) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; size_t aux_storage_size() const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() unsigned k; }; struct FoldRows : public Node { explicit FoldRows(const std::initializer_list& a, unsigned nrows) : Node(a), nrows(nrows) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() unsigned nrows; }; @@ -37,14 +24,7 @@ struct FoldRows : public Node { // x_2 \in R^{d x m} (filter) struct Conv1DNarrow : public Node { explicit Conv1DNarrow(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; // y = x_1 *conv x_2 @@ -52,14 +32,7 @@ struct Conv1DNarrow : public Node { // x_2 \in R^{d x m} (filter) struct Conv1DWide : public Node { explicit Conv1DWide(const std::initializer_list& a) : Node(a) {} - std::string as_string(const std::vector& arg_names) const override; - Dim dim_forward(const std::vector& xs) const override; - void forward_impl(const std::vector& xs, Tensor& fx) const override; - void backward_impl(const std::vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const override; + CNN_NODE_DEFINE_DEV_IMPL() }; } // namespace cnn diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 4b4bb569f..f0343f53c 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -667,14 +667,13 @@ BOOST_AUTO_TEST_CASE( possion_loss_gradient ) { } // TODO: These are all unimplemented + // Expression conv1d_narrow(const Expression& x, const Expression& f); // Expression conv1d_wide(const Expression& x, const Expression& f); // Expression kmax_pooling(const Expression& x, unsigned k); // Expression fold_rows(const Expression& x, unsigned nrows=2); // Expression sum_cols(const Expression& x); // Expression kmh_ngram(const Expression& x, unsigned n); -// -// Expression sum_batches(const Expression& x); // Expression pick(const Expression& x, unsigned v); BOOST_AUTO_TEST_CASE( pick_gradient ) { From 14c09a643c1c8843ce820b4d7b19b1b1702d87bd Mon Sep 17 00:00:00 2001 From: dhg Date: Fri, 17 Jun 2016 13:26:28 -0700 Subject: [PATCH 547/965] Fixed typo in PyCNN's RNNBuilder definition: `__cinit_` => `__cinit__` --- pycnn/pycnn.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 84c6c3fa9..0c77a6f4b 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -745,7 +745,7 @@ cdef class RNNBuilder: # {{{ cdef CRNNBuilder *thisptr cdef RNNState _init_state cdef int cg_version - def __cinit_(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): + def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): # TODO disable calling this directly. raise RuntimeError("Cannot instantiate RNNBuilder directly.") #def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): From fc2e943ffb69d992039b44861597d23ecd8d75a4 Mon Sep 17 00:00:00 2001 From: dhg Date: Sat, 18 Jun 2016 13:21:13 -0700 Subject: [PATCH 548/965] Commented out PyCNN RNNBuilder.__cinit__ b/c it's called by subtypes. --- pycnn/pycnn.pyx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 0c77a6f4b..264da205b 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -745,9 +745,9 @@ cdef class RNNBuilder: # {{{ cdef CRNNBuilder *thisptr cdef RNNState _init_state cdef int cg_version - def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): - # TODO disable calling this directly. - raise RuntimeError("Cannot instantiate RNNBuilder directly.") + #def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): + # # TODO disable calling this directly. + # raise RuntimeError("Cannot instantiate RNNBuilder directly.") #def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): # self.thisptr = 0 #new CSimpleRNNBuilder(layers, input_dim, hidden_dim, model.thisptr) # self.cg_version = -1 From 197a05a0171f2a9aa77d214a2d6c305947a2cce7 Mon Sep 17 00:00:00 2001 From: dhg Date: Sat, 18 Jun 2016 14:52:48 -0700 Subject: [PATCH 549/965] Renamed PyCNN RNNBuilder to _RNNBuilder so users won't use it directly. --- pycnn/pycnn.pyx | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 264da205b..290331cfb 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -741,16 +741,10 @@ cpdef Expression affine_transform(list exprs): # {{{ RNNS / Builders # TODO: unify these with inheritance -cdef class RNNBuilder: # {{{ +cdef class _RNNBuilder: # {{{ cdef CRNNBuilder *thisptr cdef RNNState _init_state cdef int cg_version - #def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): - # # TODO disable calling this directly. - # raise RuntimeError("Cannot instantiate RNNBuilder directly.") - #def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): - # self.thisptr = 0 #new CSimpleRNNBuilder(layers, input_dim, hidden_dim, model.thisptr) - # self.cg_version = -1 def __dealloc__(self): del self.thisptr @@ -849,7 +843,7 @@ cdef class RNNBuilder: # {{{ return self._init_state #}}} -cdef class SimpleRNNBuilder(RNNBuilder): # {{{ +cdef class SimpleRNNBuilder(_RNNBuilder): # {{{ def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): self.thisptr = new CSimpleRNNBuilder(layers, input_dim, hidden_dim, model.thisptr) self.cg_version = -1 @@ -857,7 +851,7 @@ cdef class SimpleRNNBuilder(RNNBuilder): # {{{ def whoami(self): return "SimpleRNNBuilder" #}}} -cdef class LSTMBuilder(RNNBuilder): # {{{ +cdef class LSTMBuilder(_RNNBuilder): # {{{ def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): self.thisptr = new CLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr) self.cg_version = -1 @@ -865,7 +859,7 @@ cdef class LSTMBuilder(RNNBuilder): # {{{ def whoami(self): return "LSTMBuilder" # }}} -cdef class FastLSTMBuilder(RNNBuilder): # {{{ +cdef class FastLSTMBuilder(_RNNBuilder): # {{{ def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): self.thisptr = new CFastLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr) self.cg_version = -1 @@ -878,12 +872,12 @@ cdef class RNNState: # {{{ This is the main class for working with RNNs / LSTMs / GRUs. Request an RNNState initial_state() from a builder, and then progress from there. """ - cdef RNNBuilder builder + cdef _RNNBuilder builder cdef int state_idx cdef RNNState _prev cdef Expression _out # TODO: should be callable only from C - def __cinit__(self, RNNBuilder builder, int state_idx=-1, RNNState prev_state=None, Expression out=None): + def __cinit__(self, _RNNBuilder builder, int state_idx=-1, RNNState prev_state=None, Expression out=None): self.builder = builder self.state_idx=state_idx self._prev = prev_state From e0b487e62cde8869ef9583933c97905a9b871153 Mon Sep 17 00:00:00 2001 From: dhg Date: Sat, 18 Jun 2016 15:02:15 -0700 Subject: [PATCH 550/965] Added BiRNNBuilder to PyCNN --- pycnn/pycnn.pyx | 86 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 53a744f8b..2d42623b0 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -872,6 +872,92 @@ cdef class FastLSTMBuilder(_RNNBuilder): # {{{ def whoami(self): return "FastLSTMBuilder" # }}} +class BiRNNBuilder(object): + """ + Builder for BiRNNs that delegates to regular RNNs and wires them together. + + builder = BiRNNBuilder(1, 128, 100, model, LSTMBuilder) + [o1,o2,o3] = builder.transduce([i1,i2,i3]) + """ + def __init__(self, num_layers, input_dim, hidden_dim, model, rnn_builder_factory): + """ + @param num_layers: depth of the BiRNN + @param input_dim: size of the inputs + @param hidden_dim: size of the outputs (and intermediate layer representations) + @param model + @param rnn_builder_factory: RNNBuilder subclass, e.g. LSTMBuilder + """ + assert num_layers > 0 + assert hidden_dim % 2 == 0 + self.builder_layers = [] + f = rnn_builder_factory(1, input_dim, hidden_dim/2, model) + b = rnn_builder_factory(1, input_dim, hidden_dim/2, model) + self.builder_layers.append((f,b)) + for _ in xrange(num_layers-1): + f = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) + b = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) + self.builder_layers.append((f,b)) + + def whoami(self): return "BiRNNBuilder" + + def add_inputs(self, es): + """ + returns the list of state pairs (stateF, stateB) obtained by adding + inputs to both forward (stateF) and backward (stateB) RNNs. + + @param es: a list of Expression + + see also transduce(xs) + + .transduce(xs) is different from .add_inputs(xs) in the following way: + + .add_inputs(xs) returns a list of RNNState pairs. RNNState objects can be + queried in various ways. In particular, they allow access to the previous + state, as well as to the state-vectors (h() and s() ) + + .transduce(xs) returns a list of Expression. These are just the output + expressions. For many cases, this suffices. + transduce is much more memory efficient than add_inputs. + """ + for e in es: + ensure_freshness(e) + for (fb,bb) in self.builder_layers[:-1]: + fs = fb.initial_state().transduce(es) + bs = bb.initial_state().transduce(reversed(es)) + es = [concatenate([f,b]) for f,b in zip(fs, reversed(bs))] + (fb,bb) = self.builder_layers[-1] + fs = fb.initial_state().add_inputs(es) + bs = bb.initial_state().add_inputs(reversed(es)) + return [(f,b) for f,b in zip(fs, reversed(bs))] + + def transduce(self, es): + """ + returns the list of output Expressions obtained by adding the given inputs + to the current state, one by one, to both the forward and backward RNNs, + and concatenating. + + @param es: a list of Expression + + see also add_inputs(xs) + + .transduce(xs) is different from .add_inputs(xs) in the following way: + + .add_inputs(xs) returns a list of RNNState pairs. RNNState objects can be + queried in various ways. In particular, they allow access to the previous + state, as well as to the state-vectors (h() and s() ) + + .transduce(xs) returns a list of Expression. These are just the output + expressions. For many cases, this suffices. + transduce is much more memory efficient than add_inputs. + """ + for e in es: + ensure_freshness(e) + for (fb,bb) in self.builder_layers: + fs = fb.initial_state().transduce(es) + bs = bb.initial_state().transduce(reversed(es)) + es = [concatenate([f,b]) for f,b in zip(fs, reversed(bs))] + return es + cdef class RNNState: # {{{ """ This is the main class for working with RNNs / LSTMs / GRUs. From e33a0dcd82e48239d5ce43db46f425448c844f59 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 18 Jun 2016 16:20:40 -0700 Subject: [PATCH 551/965] Tensor impl of wide/narrow convolutions --- cnn/nodes-conv.cc | 131 +++++++++++++++++--------------------------- tests/test-nodes.cc | 38 ++++++++++++- 2 files changed, 85 insertions(+), 84 deletions(-) diff --git a/cnn/nodes-conv.cc b/cnn/nodes-conv.cc index efc714db9..3076f1d45 100644 --- a/cnn/nodes-conv.cc +++ b/cnn/nodes-conv.cc @@ -27,7 +27,7 @@ string FoldRows::as_string(const vector& arg_names) const { Dim FoldRows::dim_forward(const vector& xs) const { unsigned orows = xs[0].rows() / nrows; - if ((orows * nrows != xs[0].rows()) || xs.size() != 1 || xs[0].ndims() != 2) { + if ((orows * nrows != xs[0].rows()) || xs.size() != 1 || xs[0].ndims() > 2) { cerr << "Bad input dimensions in FoldRows: " << xs << endl; throw std::invalid_argument("bad input dimensions in FoldRows"); } @@ -45,14 +45,14 @@ Dim Conv1DNarrow::dim_forward(const vector& xs) const { cerr << "Conv1DNarrow requires two inputs: " << xs << endl; throw std::invalid_argument("Conv1DNarrow requires 2 dimensions"); } - unsigned ocols = xs[0].cols() - xs[1].cols() + 1; + int ocols = xs[0].cols() - xs[1].cols() + 1; if (xs[0].ndims() != 2 || xs[1].ndims() != 2 || xs[0].rows() != xs[1].rows() || ocols < 1) { cerr << "Bad input dimensions in Conv1DNarrow: " << xs << endl; throw std::invalid_argument("bad input dimensions in Conv1DNarrow"); } - return Dim({xs[0].rows(), ocols}); + return Dim({xs[0].rows(), (unsigned)ocols}); } string Conv1DWide::as_string(const vector& arg_names) const { @@ -102,17 +102,15 @@ size_t KMaxPooling::aux_storage_size() const { template void FoldRows::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - auto x = **xs[0]; - auto y = *fx; - unsigned orows = y.rows(); + unsigned orows = fx.d.rows(); for (unsigned i = 0; i < orows; ++i) { - for (unsigned j = 0; j < nrows; ++j) { - if (j) - y.row(i) += x.row(i * nrows + j); - else // j = 0 - y.row(i) = x.row(i * nrows); - } + fx.tb<2>().chip<0>(i).device(*dev.edevice) = xs[0]->tb<2>().chip<0>(i * nrows); + for (unsigned j = 1; j < nrows; ++j) + fx.tb<2>().chip<0>(i).device(*dev.edevice) += xs[0]->tb<2>().chip<0>(i * nrows + j); } + // TODO: This broadcasting should work? + // array broadcasts; broadcasts[0] = nrows; + // fx.tvec().broadcast(broadcasts).device(*dev.edevice) += xs[0]->tvec(); } template @@ -122,32 +120,27 @@ void FoldRows::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - unsigned orows = fx.d.rows(); - auto d = *dEdf; - auto di = *dEdxi; - for (unsigned i = 0; i < orows; ++i) - for (unsigned j = 0; j < nrows; ++j) - di.row(i * nrows + j) += d.row(i); + array broadcasts; broadcasts[0] = nrows; + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec().broadcast(broadcasts); + // unsigned orows = fx.d.rows(); + // for (unsigned i = 0; i < orows; ++i) + // for (unsigned j = 0; j < nrows; ++j) + // dEdxi.tb<2>().chip<0>(i * nrows + j) += d.tb<2>().chip<0>(i); } CNN_NODE_INST_DEV_IMPL(FoldRows) template void Conv1DNarrow::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - // TODO this is a bad implementation- rewrite to use unsupported Eigen tensor library - auto x = **xs[0]; // input - auto f = **xs[1]; // filter - auto y = *fx; - const unsigned rows = x.rows(); const unsigned ycols = dim.cols(); - const unsigned fcols = f.cols(); - for (unsigned i = 0; i < rows; ++i) { - for (unsigned j = 0; j < ycols; ++j) { - float t = 0; - for (unsigned k = 0; k < fcols; ++k) - t += f(i, k) * x(i, j + k); - y(i, j) = t; - } + const unsigned fcols = xs[1]->d.cols(); + for (unsigned j = 0; j < ycols; ++j) { + fx.t<2>().chip<1>(j).device(*dev.edevice) = xs[0]->t<2>().chip<1>(j) * xs[1]->t<2>().chip<1>(0); + for (unsigned k = 1; k < fcols; ++k) + fx.t<2>().chip<1>(j).device(*dev.edevice) += xs[0]->t<2>().chip<1>(j+k) * xs[1]->t<2>().chip<1>(k); } + // TODO: This following version without chip is better, but for some reason dimensions don't match. + // Eigen::array dims; dims[0] = 1; + // fx.t<2>().device(*dev.edevice) = xs[0]->t<2>().convolve(xs[1]->t<2>(), dims); } template @@ -157,29 +150,18 @@ void Conv1DNarrow::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - // TODO this is a bad implementation- rewrite to use unsupported Eigen tensor library assert(i < 2); - const unsigned rows = xs[0]->d.rows(); const unsigned ycols = dim.cols(); const unsigned fcols = xs[1]->d.cols(); - auto d = *dEdf; - auto di = *dEdxi; + // TODO: Can this be done with a kernel and without using chip? if (i == 0) { // derivative wrt input x - auto f = **xs[1]; - for (unsigned i = 0; i < rows; ++i) { - for (unsigned j = 0; j < ycols; ++j) { - for (unsigned k = 0; k < fcols; ++k) - di(i, j + k) += f(i, k) * d(i, j); - } - } + for (unsigned j = 0; j < ycols; ++j) + for (unsigned k = 0; k < fcols; ++k) + dEdxi.t<2>().chip<1>(j+k).device(*dev.edevice) += xs[1]->t<2>().chip<1>(k) * dEdf.t<2>().chip<1>(j); } else { // derivative wrt filter f - auto x = **xs[0]; - for (unsigned i = 0; i < rows; ++i) { - for (unsigned j = 0; j < ycols; ++j) { - for (unsigned k = 0; k < fcols; ++k) - di(i, k) += x(i, j + k) * d(i, j); - } - } + for (unsigned j = 0; j < ycols; ++j) + for (unsigned k = 0; k < fcols; ++k) + dEdxi.t<2>().chip<1>(k).device(*dev.edevice) += xs[0]->t<2>().chip<1>(j+k) * dEdf.t<2>().chip<1>(j); } } CNN_NODE_INST_DEV_IMPL(Conv1DNarrow) @@ -187,19 +169,11 @@ CNN_NODE_INST_DEV_IMPL(Conv1DNarrow) template void Conv1DWide::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { TensorTools::Zero(fx); - auto x = **xs[0]; // input - auto f = **xs[1]; // filter - auto y = *fx; - const unsigned rows = x.rows(); - const unsigned xcols = x.cols(); - const unsigned fcols = f.cols(); - for (unsigned i = 0; i < rows; ++i) { - for (unsigned j = 0; j < xcols; ++j) { - const float xij = x(i, j); - for (unsigned k = 0; k < fcols; ++k) - y(i, j + k) += f(i, k) * xij; - } - } + const unsigned xcols = xs[0]->d.cols(); + const unsigned fcols = xs[1]->d.cols(); + for (unsigned j = 0; j < xcols; ++j) + for (unsigned k = 0; k < fcols; ++k) + fx.t<2>().chip<1>(j+k).device(*dev.edevice) += xs[1]->t<2>().chip<1>(k) * xs[0]->t<2>().chip<1>(j); } @@ -210,35 +184,25 @@ void Conv1DWide::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - assert(i < 2); - const unsigned rows = xs[0]->d.rows(); const unsigned xcols = xs[0]->d.cols(); const unsigned fcols = xs[1]->d.cols(); - auto d = *dEdf; - auto di = *dEdxi; if (i == 0) { // derivative wrt input x - auto f = **xs[1]; - for (unsigned i = 0; i < rows; ++i) { - for (unsigned j = 0; j < xcols; ++j) { - for (unsigned k = 0; k < fcols; ++k) - di(i, j) += f(i, k) * d(i, j + k); - } - } + for (unsigned j = 0; j < xcols; ++j) + for (unsigned k = 0; k < fcols; ++k) + dEdxi.t<2>().chip<1>(j).device(*dev.edevice) += xs[1]->t<2>().chip<1>(k) * dEdf.t<2>().chip<1>(j + k); } else { // derivative wrt filter f - auto x = **xs[0]; - for (unsigned i = 0; i < rows; ++i) { - for (unsigned j = 0; j < xcols; ++j) { - const float xij = x(i, j); - for (unsigned k = 0; k < fcols; ++k) - di(i, k) += xij * d(i, j + k); - } - } + for (unsigned j = 0; j < xcols; ++j) + for (unsigned k = 0; k < fcols; ++k) + dEdxi.t<2>().chip<1>(k).device(*dev.edevice) += xs[0]->t<2>().chip<1>(j) * dEdf.t<2>().chip<1>(j + k); } } CNN_NODE_INST_DEV_IMPL(Conv1DWide) template void KMaxPooling::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { +#ifdef __CUDACC__ + throw std::runtime_error("KMaxPooling::forward_dev_impl not working on CUDA yet"); +#else auto x=**xs[0]; auto y=*fx; float tmp[1024]; @@ -268,6 +232,7 @@ void KMaxPooling::forward_dev_impl(const MyDevice & dev, const vector @@ -277,6 +242,9 @@ void KMaxPooling::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { +#ifdef __CUDACC__ + throw std::runtime_error("Conv1DWide::backward_dev_impl not working on CUDA yet"); +#else const unsigned rows = dim.rows(); const unsigned cols = dim.cols(); const int* maxmap = static_cast(aux_mem); @@ -294,6 +262,7 @@ void KMaxPooling::backward_dev_impl(const MyDevice & dev, (*dEdxi)(i, oj) += (*dEdf)(i, j); } } +#endif } CNN_NODE_INST_DEV_IMPL(KMaxPooling) diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index f0343f53c..9d0eb7d58 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -29,8 +29,10 @@ struct NodeTest { std::vector param1_vals = {1.1f,-2.2f,3.3f}; std::vector param2_vals = {2.2f,3.4f,-1.2f}; std::vector param3_vals = {1.1f,2.2f,3.3f}; + std::vector param4_vals = {1.1f,2.2f,3.3f,-1.2f,2.1f,3.4f}; std::vector param_scalar1_vals = {2.2f}; std::vector param_scalar2_vals = {1.1f}; + std::vector param_kernel1_vals = {1.1f, 2.2f,-1.0f,1.2f,-3.4f,-0.2f}; std::vector param_square1_vals = {1.1f,2.2f,3.3f,1.2f,2.5f,3.2f,5.3f,2.3f,3.3f}; std::vector param_cube1_vals = {1.1f,2.2f,3.3f,1.2f,2.2f,3.2f,1.3f,2.3f,3.3f, 11.1f,12.2f,13.3f,11.2f,12.2f,13.2f,11.3f,12.3f,13.3f, @@ -41,10 +43,14 @@ struct NodeTest { TensorTools::SetElements(param2.get()->values,param2_vals); param3 = mod.add_parameters({3}); TensorTools::SetElements(param3.get()->values,param3_vals); + param4 = mod.add_parameters({6}); + TensorTools::SetElements(param4.get()->values,param4_vals); param_scalar1 = mod.add_parameters({1}); TensorTools::SetElements(param_scalar1.get()->values,param_scalar1_vals); param_scalar2 = mod.add_parameters({1}); TensorTools::SetElements(param_scalar2.get()->values,param_scalar2_vals); + param_kernel1 = mod.add_parameters({3,2}); + TensorTools::SetElements(param_kernel1.get()->values,param_kernel1_vals); param_square1 = mod.add_parameters({3,3}); TensorTools::SetElements(param_square1.get()->values,param_square1_vals); param_cube1 = mod.add_parameters({3,3,3}); @@ -66,7 +72,7 @@ struct NodeTest { std::vector ones3_vals, ones2_vals, first_one_vals, batch_vals; std::vector av; cnn::Model mod; - cnn::Parameter param1, param2, param3, param_scalar1, param_scalar2, param_square1, param_cube1; + cnn::Parameter param1, param2, param3, param4, param_scalar1, param_scalar2, param_kernel1, param_square1, param_cube1; }; // define the test suite @@ -666,12 +672,38 @@ BOOST_AUTO_TEST_CASE( possion_loss_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } -// TODO: These are all unimplemented - // Expression conv1d_narrow(const Expression& x, const Expression& f); +BOOST_AUTO_TEST_CASE( conv1d_narrow_gradient ) { + cnn::ComputationGraph cg; + Expression xsquare = parameter(cg, param_square1); + Expression xkernel = parameter(cg, param_kernel1); + Expression y = conv1d_narrow(xsquare, xkernel); + input(cg, {1,3}, ones3_vals) * y * input(cg, {2,1}, ones2_vals); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression conv1d_wide(const Expression& x, const Expression& f); +BOOST_AUTO_TEST_CASE( conv1d_wide_gradient ) { + cnn::ComputationGraph cg; + Expression xkernel = parameter(cg, param_kernel1); + Expression y = conv1d_wide(xkernel, xkernel); + input(cg, {1,3}, ones3_vals) * y * input(cg, {3,1}, ones3_vals); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// TODO: These are all unimplemented // Expression kmax_pooling(const Expression& x, unsigned k); + // Expression fold_rows(const Expression& x, unsigned nrows=2); +BOOST_AUTO_TEST_CASE( fold_rows_gradient ) { + cnn::ComputationGraph cg; + Expression x4 = parameter(cg, param4); + Expression y = fold_rows(x4, 2); + input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// TODO: These are all unimplemented // Expression sum_cols(const Expression& x); // Expression kmh_ngram(const Expression& x, unsigned n); From dae1ae35f12c87651da58cbae83ef38a7070fffd Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 18 Jun 2016 22:17:15 -0700 Subject: [PATCH 552/965] Some work on convolution --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/nodes-common.cc | 14 ---- cnn/nodes-conv.cc | 193 +++++++++++++++++++++++++++++--------------- cnn/nodes-conv.h | 35 +++++--- cnn/nodes.cc | 28 ------- cnn/nodes.h | 8 -- tests/test-nodes.cc | 39 ++++++++- 8 files changed, 191 insertions(+), 128 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index ec8ddfc06..a923629de 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -112,6 +112,7 @@ Expression pickneglogsoftmax(const Expression& x, const vector & v) { Expression pickneglogsoftmax(const Expression& x, unsigned* pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } Expression pickneglogsoftmax(const Expression& x, const vector * pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } +Expression average_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression sum_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression sum_batches(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/cnn/expr.h b/cnn/expr.h index 57cdc9f26..7710c82cb 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -123,6 +123,7 @@ Expression conv1d_wide(const Expression& x, const Expression& f); Expression kmax_pooling(const Expression& x, unsigned k); Expression fold_rows(const Expression& x, unsigned nrows=2); Expression sum_cols(const Expression& x); +Expression average_cols(const Expression& x); Expression kmh_ngram(const Expression& x, unsigned n); // Sum the results of multiple batches diff --git a/cnn/nodes-common.cc b/cnn/nodes-common.cc index fc0a47528..15b1359b1 100644 --- a/cnn/nodes-common.cc +++ b/cnn/nodes-common.cc @@ -214,20 +214,6 @@ Dim Reshape::dim_forward(const vector& xs) const { } } -string SumColumns::as_string(const vector& arg_names) const { - ostringstream s; - s << "sum_cols(matrix=" << arg_names[0]; - if (arg_names.size() == 2) s << ", col_weighting=" << arg_names[1]; - s << ')'; - return s.str(); -} - -Dim SumColumns::dim_forward(const vector& xs) const { - assert(xs.size() == 1 || xs.size() == 2); - int bd = (xs.size() == 1 ? xs[0].bd : max(xs[0].bd, xs[1].bd)); - return Dim({xs[0].rows()}, bd); -} - string KMHNGram::as_string(const vector& arg_names) const { ostringstream s; s << "kmh-ngram(" << arg_names[0] << ')'; diff --git a/cnn/nodes-conv.cc b/cnn/nodes-conv.cc index 3076f1d45..a2615aa71 100644 --- a/cnn/nodes-conv.cc +++ b/cnn/nodes-conv.cc @@ -19,6 +19,18 @@ namespace cnn { #ifndef __CUDACC__ +string AverageColumns::as_string(const vector& arg_names) const { + ostringstream s; + s << "average_cols(matrix=" << arg_names[0] << ')'; + return s.str(); +} + +Dim AverageColumns::dim_forward(const vector& xs) const { + assert(xs.size() == 1 || xs.size() == 2); + int bd = (xs.size() == 1 ? xs[0].bd : max(xs[0].bd, xs[1].bd)); + return Dim({xs[0].rows()}, bd); +} + string FoldRows::as_string(const vector& arg_names) const { ostringstream os; os << "fold_rows(" << arg_names[0] << ", nrows=" << nrows << ')'; @@ -95,39 +107,44 @@ Dim KMaxPooling::dim_forward(const vector& xs) const { size_t KMaxPooling::aux_storage_size() const { // map of where the entries in f(x) go to entries in x - return sizeof(int) * dim.size(); + return sizeof(Eigen::DenseIndex) * dim.size(); +} + +string SumColumns::as_string(const vector& arg_names) const { + ostringstream s; + s << "sum_cols(matrix=" << arg_names[0]; + if (arg_names.size() == 2) s << ", col_weighting=" << arg_names[1]; + s << ')'; + return s.str(); +} + +Dim SumColumns::dim_forward(const vector& xs) const { + assert(xs.size() == 1 || xs.size() == 2); + int bd = (xs.size() == 1 ? xs[0].bd : max(xs[0].bd, xs[1].bd)); + return Dim({xs[0].rows()}, bd); } #endif template -void FoldRows::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - unsigned orows = fx.d.rows(); - for (unsigned i = 0; i < orows; ++i) { - fx.tb<2>().chip<0>(i).device(*dev.edevice) = xs[0]->tb<2>().chip<0>(i * nrows); - for (unsigned j = 1; j < nrows; ++j) - fx.tb<2>().chip<0>(i).device(*dev.edevice) += xs[0]->tb<2>().chip<0>(i * nrows + j); - } - // TODO: This broadcasting should work? - // array broadcasts; broadcasts[0] = nrows; - // fx.tvec().broadcast(broadcasts).device(*dev.edevice) += xs[0]->tvec(); +void AverageColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + // throw std::runtime_error("AverageColumns not implemented yet"); + array reduction_axis; reduction_axis[0] = 1; + fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().sum(reduction_axis) / (float)xs[0]->d[1]; } template -void FoldRows::backward_dev_impl(const MyDevice & dev, +void AverageColumns::backward_dev_impl(const MyDevice & dev, const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - array broadcasts; broadcasts[0] = nrows; - dEdxi.tvec().device(*dev.edevice) += dEdf.tvec().broadcast(broadcasts); - // unsigned orows = fx.d.rows(); - // for (unsigned i = 0; i < orows; ++i) - // for (unsigned j = 0; j < nrows; ++j) - // dEdxi.tb<2>().chip<0>(i * nrows + j) += d.tb<2>().chip<0>(i); + array broadcasts; broadcasts[0] = 1; broadcasts[1] = xs[0]->d[1]; + dEdxi.t<2>().device(*dev.edevice) += (dEdf.t<2>() / (float)xs[0]->d[1]).broadcast(broadcasts); } -CNN_NODE_INST_DEV_IMPL(FoldRows) +CNN_NODE_INST_DEV_IMPL(AverageColumns) template void Conv1DNarrow::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -198,41 +215,75 @@ void Conv1DWide::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(Conv1DWide) +template +void FoldRows::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + unsigned orows = fx.d.rows(); + for (unsigned i = 0; i < orows; ++i) { + fx.tb<2>().chip<0>(i).device(*dev.edevice) = xs[0]->tb<2>().chip<0>(i * nrows); + for (unsigned j = 1; j < nrows; ++j) + fx.tb<2>().chip<0>(i).device(*dev.edevice) += xs[0]->tb<2>().chip<0>(i * nrows + j); + } + // TODO: This broadcasting should work? + // array broadcasts; broadcasts[0] = nrows; + // fx.tvec().broadcast(broadcasts).device(*dev.edevice) += xs[0]->tvec(); +} + +template +void FoldRows::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + array broadcasts; broadcasts[0] = nrows; + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec().broadcast(broadcasts); + // unsigned orows = fx.d.rows(); + // for (unsigned i = 0; i < orows; ++i) + // for (unsigned j = 0; j < nrows; ++j) + // dEdxi.tb<2>().chip<0>(i * nrows + j) += d.tb<2>().chip<0>(i); +} +CNN_NODE_INST_DEV_IMPL(FoldRows) + template void KMaxPooling::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + Eigen::DenseIndex* maxmap = static_cast(aux_mem); + if(k == 1) { + Eigen::TensorMap> locs(maxmap, dim.size()); + locs.device(*dev.edevice) = xs[0]->t<2>().argmax(1); + array reduction_axis; reduction_axis[0] = 1; + fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().maximum(reduction_axis); + } else { #ifdef __CUDACC__ - throw std::runtime_error("KMaxPooling::forward_dev_impl not working on CUDA yet"); + // TODO: Can this be done by CUDNN? + throw std::runtime_error("KMaxPooling::forward_dev_impl for k>1 not working on CUDA yet"); #else - auto x=**xs[0]; - auto y=*fx; - float tmp[1024]; - assert(x.cols() < 1024); - unsigned mi = 0; - const unsigned rows = x.rows(); - const unsigned xcols = x.cols(); - int* maxmap = static_cast(aux_mem); - for (unsigned i=0; i < rows; ++i) { - //cerr << "row(" << i << ")=" << x.row(i) << endl; - for (unsigned j=0; j < xcols; ++j) - tmp[j] = -x(i,j); - nth_element(tmp, tmp + (k-1), tmp + xcols); - const float c = -tmp[k-1]; // kth largest element in row i - unsigned tt = 0; - for (unsigned j = 0; j < xcols; ++j) { - const float xij = x(i,j); - if (xij >= c) { - //cerr << xij << ' '; - y(i,tt) = xij; - //assert(mi < dim.size()); - maxmap[mi++] = j; - ++tt; - if (tt == k) break; // could happen in case of ties + auto x=**xs[0]; + auto y=*fx; + float tmp[1024]; + assert(x.cols() < 1024); + unsigned mi = 0; + const unsigned rows = x.rows(); + const unsigned xcols = x.cols(); + for (unsigned i=0; i < rows; ++i) { + for (unsigned j=0; j < xcols; ++j) + tmp[j] = -x(i,j); + nth_element(tmp, tmp + (k-1), tmp + xcols); + const float c = -tmp[k-1]; // kth largest element in row i + unsigned tt = 0; + for (unsigned j = 0; j < xcols; ++j) { + const float xij = x(i,j); + if (xij >= c) { + y(i,tt) = xij; + //assert(mi < dim.size()); + maxmap[mi++] = j; + ++tt; + if (tt == k) break; // could happen in case of ties + } } } - //cerr << endl; abort(); - } - assert(mi == dim.size()); + assert(mi == dim.size()); #endif + } } template @@ -242,28 +293,40 @@ void KMaxPooling::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { + // TODO: This is not at all efficient on GPU. Switch to CUDNN? #ifdef __CUDACC__ - throw std::runtime_error("Conv1DWide::backward_dev_impl not working on CUDA yet"); + vector indices(dim.size()); + const Eigen::DenseIndex* maxmap = &indices[0]; + CUDA_CHECK(cudaMemcpyAsync(maxmap, aux_mem, sizeof(DenseIndex) * dim.size(), cudaMemcpyDeviceToHost)); #else - const unsigned rows = dim.rows(); - const unsigned cols = dim.cols(); - const int* maxmap = static_cast(aux_mem); - for (unsigned i = 0; i < rows; ++i) { - unsigned mi = 0; - for (unsigned j = 0; j < cols; ++j) { - assert(mi < dim.size()); - const int oj = maxmap[mi++]; - if (oj > (*dEdxi).cols() || oj < 0) { - cerr << dim << (*fx) << endl << (*dEdxi) << endl; - cerr << "MM:"; for (unsigned k=0;k < dim.size(); ++k) cerr << ' ' << maxmap[k]; - cerr << endl; - cerr << "BAD: " << oj << endl; abort(); - } - (*dEdxi)(i, oj) += (*dEdf)(i, j); - } - } + const Eigen::DenseIndex* maxmap = static_cast(aux_mem); #endif + const unsigned rows = dim.rows(); + for(unsigned i = 0; i < rows; ++i) + for(unsigned j = 0; j < k; ++j, ++maxmap) + dEdxi.t<2>().chip<1>(*maxmap).chip<0>(i).device(*dev.edevice) += dEdf.t<2>().chip<1>(j).chip<0>(i); } CNN_NODE_INST_DEV_IMPL(KMaxPooling) +template +void SumColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 1); + // throw std::runtime_error("SumColumns not implemented yet"); + array reduction_axis; reduction_axis[0] = 1; + fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().sum(reduction_axis); +} + +template +void SumColumns::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + array broadcasts; broadcasts[0] = 1; broadcasts[1] = xs[0]->d[1]; + dEdxi.t<2>().device(*dev.edevice) += dEdf.t<2>().broadcast(broadcasts); +} +CNN_NODE_INST_DEV_IMPL(SumColumns) + + } // namespace cnn diff --git a/cnn/nodes-conv.h b/cnn/nodes-conv.h index b5c4f7096..cbac1ecb3 100644 --- a/cnn/nodes-conv.h +++ b/cnn/nodes-conv.h @@ -6,17 +6,11 @@ namespace cnn { -struct KMaxPooling : public Node { - explicit KMaxPooling(const std::initializer_list& a, unsigned k = 1) : Node(a), k(k) {} - size_t aux_storage_size() const override; +// with a single argument x \in R^{n x m} +// y_i = \sum_j x_i,j / m +struct AverageColumns : public Node { + template explicit AverageColumns(const T& a) : Node(a) {} CNN_NODE_DEFINE_DEV_IMPL() - unsigned k; -}; - -struct FoldRows : public Node { - explicit FoldRows(const std::initializer_list& a, unsigned nrows) : Node(a), nrows(nrows) {} - CNN_NODE_DEFINE_DEV_IMPL() - unsigned nrows; }; // y = x_1 *conv x_2 @@ -35,6 +29,27 @@ struct Conv1DWide : public Node { CNN_NODE_DEFINE_DEV_IMPL() }; +struct FoldRows : public Node { + explicit FoldRows(const std::initializer_list& a, unsigned nrows) : Node(a), nrows(nrows) {} + CNN_NODE_DEFINE_DEV_IMPL() + unsigned nrows; +}; + +struct KMaxPooling : public Node { + explicit KMaxPooling(const std::initializer_list& a, unsigned k = 1) : Node(a), k(k) {} + size_t aux_storage_size() const override; + CNN_NODE_DEFINE_DEV_IMPL() + unsigned k; +}; + +// with a single argument x \in R^{n x m} +// y_i = \sum_j x_i,j +// if you want to reweight the columns and then sum them, use MatrixMultiply +struct SumColumns : public Node { + template explicit SumColumns(const T& a) : Node(a) {} + CNN_NODE_DEFINE_DEV_IMPL() +}; + } // namespace cnn #endif diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 8f088d4a3..fa2500937 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1913,34 +1913,6 @@ void SumBatches::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(SumBatches) -template -void SumColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); - throw std::runtime_error("SumColumns not implemented yet"); - // array reduction_axis; - // reduction_axis[0] = 1; - // fx.t<1>().device(*dev.edevice) += xs[0]->t<2>().sum(reduction_axis); -} - -template -void SumColumns::backward_dev_impl(const MyDevice & dev, - const vector& xs, - const Tensor& fx, - const Tensor& dEdf, - unsigned i, - Tensor& dEdxi) const { - throw std::runtime_error("SumColumns not implemented yet"); - // TODO: This causes a compile error - // for(size_t i = 0; i < xs[0]->d[1]; i++) - // dEdxi.t<1>().device(*dev.edevice) += dEdf.t<2>().chip<1>(i); - // TODO: This is not great. Can we use broadcasting similar to the following? - // array broadcasts; - // broadcasts[0] = 1; - // broadcasts[1] = xs[0]->d[1]; - // dEdxi.t<2>().broadcast(broadcasts) += dEdf.t<2>(); -} -CNN_NODE_INST_DEV_IMPL(SumColumns) - template void TraceOfProduct::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { #ifdef __CUDACC__ diff --git a/cnn/nodes.h b/cnn/nodes.h index 3823a4d00..68a8e4fc8 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -122,14 +122,6 @@ struct Reshape : public Node { Dim to; }; -// with a single argument x \in R^{n x m} -// y_i = \sum_j x_i,j -// if you want to reweight the columns and then sum them, use MatrixMultiply -struct SumColumns : public Node { - template explicit SumColumns(const T& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() -}; - // y_i = \sum_{j=1}^n x_1:{i-1+j} struct KMHNGram : public Node { explicit KMHNGram(const std::initializer_list& a, unsigned n) : Node(a), n(n) {} diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 9d0eb7d58..0f0c40492 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -33,7 +33,7 @@ struct NodeTest { std::vector param_scalar1_vals = {2.2f}; std::vector param_scalar2_vals = {1.1f}; std::vector param_kernel1_vals = {1.1f, 2.2f,-1.0f,1.2f,-3.4f,-0.2f}; - std::vector param_square1_vals = {1.1f,2.2f,3.3f,1.2f,2.5f,3.2f,5.3f,2.3f,3.3f}; + std::vector param_square1_vals = {1.1f,2.2f,3.4f,1.2f,2.5f,3.2f,5.3f,2.3f,3.3f}; std::vector param_cube1_vals = {1.1f,2.2f,3.3f,1.2f,2.2f,3.2f,1.3f,2.3f,3.3f, 11.1f,12.2f,13.3f,11.2f,12.2f,13.2f,11.3f,12.3f,13.3f, 21.1f,22.2f,23.3f,21.2f,22.2f,23.2f,21.3f,22.3f,23.3f}; @@ -691,8 +691,23 @@ BOOST_AUTO_TEST_CASE( conv1d_wide_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } -// TODO: These are all unimplemented // Expression kmax_pooling(const Expression& x, unsigned k); +BOOST_AUTO_TEST_CASE( kmax_pooling_keq1_gradient ) { + cnn::ComputationGraph cg; + Expression xsquare = parameter(cg, param_square1); + Expression y = tanh(kmax_pooling(xsquare, 1)); + input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + +// Expression kmax_pooling(const Expression& x, unsigned k); +BOOST_AUTO_TEST_CASE( kmax_pooling_keq2_gradient ) { + cnn::ComputationGraph cg; + Expression xsquare = parameter(cg, param_square1); + Expression y = tanh(kmax_pooling(xsquare, 2)); + input(cg, {1,3}, ones3_vals) * y * input(cg, {2,1}, ones2_vals); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} // Expression fold_rows(const Expression& x, unsigned nrows=2); BOOST_AUTO_TEST_CASE( fold_rows_gradient ) { @@ -703,8 +718,26 @@ BOOST_AUTO_TEST_CASE( fold_rows_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } -// TODO: These are all unimplemented +// Expression average_cols(const Expression& x); +BOOST_AUTO_TEST_CASE( average_cols_gradient ) { + cnn::ComputationGraph cg; + Expression xsquare = parameter(cg, param_square1); + Expression y = tanh(average_cols(xsquare)); + input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression sum_cols(const Expression& x); +BOOST_AUTO_TEST_CASE( sum_cols_gradient ) { + cnn::ComputationGraph cg; + Expression xsquare = parameter(cg, param_square1); + Expression y = tanh(sum_cols(xsquare)); + input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + + +// TODO: These are all unimplemented // Expression kmh_ngram(const Expression& x, unsigned n); // Expression pick(const Expression& x, unsigned v); From 544ffc9cdf181020a974ed28b919430372ae0c30 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 20 Jun 2016 11:19:35 +0900 Subject: [PATCH 553/965] Added a method for convolutional filters --- cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/nodes-conv.cc | 80 +++++++++++++++++++++++++++++++++++++++++++++ cnn/nodes-conv.h | 8 +++++ tests/test-nodes.cc | 18 ++++++++-- 5 files changed, 106 insertions(+), 2 deletions(-) diff --git a/cnn/expr.cc b/cnn/expr.cc index a923629de..71b3db172 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -97,6 +97,7 @@ Expression poisson_loss(const Expression& x, const unsigned* py) { return Expres Expression conv1d_narrow(const Expression& x, const Expression& f) { return Expression(x.pg, x.pg->add_function({x.i, f.i})); } Expression conv1d_wide(const Expression& x, const Expression& f) { return Expression(x.pg, x.pg->add_function({x.i, f.i})); } +Expression filter1d_narrow(const Expression& x, const Expression& f) { return Expression(x.pg, x.pg->add_function({x.i, f.i})); } Expression kmax_pooling(const Expression& x, unsigned k) { return Expression(x.pg, x.pg->add_function({x.i}, k)); } Expression fold_rows(const Expression& x, unsigned nrows) { return Expression(x.pg, x.pg->add_function({x.i}, nrows)); } diff --git a/cnn/expr.h b/cnn/expr.h index 7710c82cb..6b3a92661 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -120,6 +120,7 @@ Expression poisson_loss(const Expression& x, const unsigned* py); // various convolutiony things Expression conv1d_narrow(const Expression& x, const Expression& f); Expression conv1d_wide(const Expression& x, const Expression& f); +Expression filter1d_narrow(const Expression& x, const Expression& f); Expression kmax_pooling(const Expression& x, unsigned k); Expression fold_rows(const Expression& x, unsigned nrows=2); Expression sum_cols(const Expression& x); diff --git a/cnn/nodes-conv.cc b/cnn/nodes-conv.cc index a2615aa71..cac24b5fb 100644 --- a/cnn/nodes-conv.cc +++ b/cnn/nodes-conv.cc @@ -87,6 +87,28 @@ Dim Conv1DWide::dim_forward(const vector& xs) const { return Dim({xs[0].rows(), ocols}); } +string Filter1DNarrow::as_string(const vector& arg_names) const { + ostringstream os; + os << "conv1d_narrow(" << arg_names[0] << ", f=" << arg_names[1] << ')'; + return os.str(); +} + +Dim Filter1DNarrow::dim_forward(const vector& xs) const { + if (xs.size() != 2) { + cerr << "Filter1DNarrow requires two inputs: " << xs << endl; + throw std::invalid_argument("Filter1DNarrow requires 2 dimensions"); + } + int ocols = xs[0].cols() - xs[1].cols() + 1; + if (xs[0].ndims() != 2 || xs[1].ndims() < 2 || + xs[0].rows() != xs[1].rows() || + ocols < 1) { + cerr << "Bad input dimensions in Filter1DNarrow: " << xs << endl; + throw std::invalid_argument("bad input dimensions in Filter1DNarrow"); + } + const unsigned fids = (xs[1].ndims() > 2 ? xs[1][2] : 1); + return Dim({fids, (unsigned)ocols}); +} + string KMaxPooling::as_string(const vector& arg_names) const { ostringstream os; os << "kmaxpool(" << arg_names[0] << ", k=" << k << ')'; @@ -215,6 +237,64 @@ void Conv1DWide::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(Conv1DWide) + +template +void Filter1DNarrow::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + Eigen::array dims; dims[0] = 0; dims[1] = 1; + if(xs[1]->d.ndims() == 2) { + fx.t<2>().device(*dev.edevice) = xs[0]->t<2>().convolve(xs[1]->t<2>(), dims); + } else { + assert(xs[1]->d.ndims() > 2); + const unsigned fids = xs[1]->d[2]; + const unsigned ycols = dim.cols(); + Eigen::DSizes indices(0,0); + Eigen::DSizes sizes(1,ycols); + for(unsigned fid = 0; fid < fids; ++fid) { + indices[0] = fid; + fx.t<2>().slice(indices, sizes).device(*dev.edevice) = xs[0]->t<2>().convolve(xs[1]->t<3>().chip<2>(fid), dims); + } + } +} + +template +void Filter1DNarrow::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + assert(i < 2); + const unsigned rows = xs[1]->d.rows(); + const unsigned ycols = dim.cols(); + const unsigned fcols = xs[1]->d.cols(); + const unsigned fids = (xs[1]->d.ndims() > 2 ? xs[1]->d[2] : 1); + Eigen::DSizes sizes(rows,fcols); + Eigen::DSizes indices(0,0); + if(i == 0) { + for(unsigned i = 0; i < ycols; i++) { + indices[1] = i; + if(fids == 1) { + dEdxi.t<2>().slice(indices, sizes).device(*dev.edevice) += xs[1]->t<2>() * dEdf.t<2>()(0, i); + } else { + for(unsigned fid = 0; fid < fids; fid++) + dEdxi.t<2>().slice(indices, sizes).device(*dev.edevice) += xs[1]->t<3>().chip<2>(fid) * dEdf.t<2>()(fid, i); + } + } + } else { + for(unsigned i = 0; i < ycols; i++) { + indices[1] = i; + if(fids == 1) { + dEdxi.t<2>().device(*dev.edevice) += xs[0]->t<2>().slice(indices, sizes) * dEdf.t<2>()(0, i); + } else { + for(unsigned fid = 0; fid < fids; fid++) + dEdxi.t<3>().chip<2>(fid).device(*dev.edevice) += xs[0]->t<2>().slice(indices, sizes) * dEdf.t<2>()(fid, i); + } + } + } +} +CNN_NODE_INST_DEV_IMPL(Filter1DNarrow) + + template void FoldRows::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { unsigned orows = fx.d.rows(); diff --git a/cnn/nodes-conv.h b/cnn/nodes-conv.h index cbac1ecb3..f5efe9c13 100644 --- a/cnn/nodes-conv.h +++ b/cnn/nodes-conv.h @@ -29,6 +29,14 @@ struct Conv1DWide : public Node { CNN_NODE_DEFINE_DEV_IMPL() }; +// y = x_1 *filter x_2 +// x_1 \in R^{d x s} (input) +// x_2 \in R^{d x m} (filter) +struct Filter1DNarrow : public Node { + explicit Filter1DNarrow(const std::initializer_list& a) : Node(a) {} + CNN_NODE_DEFINE_DEV_IMPL() +}; + struct FoldRows : public Node { explicit FoldRows(const std::initializer_list& a, unsigned nrows) : Node(a), nrows(nrows) {} CNN_NODE_DEFINE_DEV_IMPL() diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 0f0c40492..531cb41a9 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -32,7 +32,9 @@ struct NodeTest { std::vector param4_vals = {1.1f,2.2f,3.3f,-1.2f,2.1f,3.4f}; std::vector param_scalar1_vals = {2.2f}; std::vector param_scalar2_vals = {1.1f}; - std::vector param_kernel1_vals = {1.1f, 2.2f,-1.0f,1.2f,-3.4f,-0.2f}; + std::vector param_kernel1_vals = {1.1f,2.2f,-1.0f,1.2f,-3.4f,-0.2f}; + std::vector param_filter1_vals = {1.1f,2.2f,-1.0f,1.2f,-3.4f,-0.2f, + 11.1f,12.2f,13.3f,11.2f,12.2f,13.2f}; std::vector param_square1_vals = {1.1f,2.2f,3.4f,1.2f,2.5f,3.2f,5.3f,2.3f,3.3f}; std::vector param_cube1_vals = {1.1f,2.2f,3.3f,1.2f,2.2f,3.2f,1.3f,2.3f,3.3f, 11.1f,12.2f,13.3f,11.2f,12.2f,13.2f,11.3f,12.3f,13.3f, @@ -51,6 +53,8 @@ struct NodeTest { TensorTools::SetElements(param_scalar2.get()->values,param_scalar2_vals); param_kernel1 = mod.add_parameters({3,2}); TensorTools::SetElements(param_kernel1.get()->values,param_kernel1_vals); + param_filter1 = mod.add_parameters({3,2,2}); + TensorTools::SetElements(param_filter1.get()->values,param_filter1_vals); param_square1 = mod.add_parameters({3,3}); TensorTools::SetElements(param_square1.get()->values,param_square1_vals); param_cube1 = mod.add_parameters({3,3,3}); @@ -72,7 +76,7 @@ struct NodeTest { std::vector ones3_vals, ones2_vals, first_one_vals, batch_vals; std::vector av; cnn::Model mod; - cnn::Parameter param1, param2, param3, param4, param_scalar1, param_scalar2, param_kernel1, param_square1, param_cube1; + cnn::Parameter param1, param2, param3, param4, param_scalar1, param_scalar2, param_kernel1, param_filter1, param_square1, param_cube1; }; // define the test suite @@ -691,6 +695,16 @@ BOOST_AUTO_TEST_CASE( conv1d_wide_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression filter1d_narrow(const Expression& x, const Expression& f); +BOOST_AUTO_TEST_CASE( filter1d_narrow_gradient ) { + cnn::ComputationGraph cg; + Expression xsquare = parameter(cg, param_square1); + Expression xfilter = parameter(cg, param_filter1); + Expression y = filter1d_narrow(xsquare, xfilter); + input(cg, {1,2}, ones3_vals) * y * input(cg, {2,1}, ones2_vals); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression kmax_pooling(const Expression& x, unsigned k); BOOST_AUTO_TEST_CASE( kmax_pooling_keq1_gradient ) { cnn::ComputationGraph cg; From c8bcf7778ebab0fe7ed9390efd617afaa33248a4 Mon Sep 17 00:00:00 2001 From: talbaumel Date: Mon, 20 Jun 2016 15:19:16 +0300 Subject: [PATCH 554/965] Changed attention function This version is more similar to the implementation found in TensorFlow and converges faster --- pyexamples/attention.py | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/pyexamples/attention.py b/pyexamples/attention.py index fda8881d7..fc8774963 100644 --- a/pyexamples/attention.py +++ b/pyexamples/attention.py @@ -11,8 +11,9 @@ VOCAB_SIZE = len(characters) LSTM_NUM_OF_LAYERS = 2 -EMBEDDINGS_SIZE = 16 +EMBEDDINGS_SIZE = 32 STATE_SIZE = 32 +ATTENTION_SIZE = 32 model = pc.Model() @@ -22,7 +23,9 @@ dec_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, STATE_SIZE*2, STATE_SIZE, model) model.add_lookup_parameters("lookup", (VOCAB_SIZE, EMBEDDINGS_SIZE)) -model.add_parameters("attention_w", (1, STATE_SIZE*2+STATE_SIZE*LSTM_NUM_OF_LAYERS*2)) +model.add_parameters("attention_w1", (ATTENTION_SIZE, STATE_SIZE*2)) +model.add_parameters("attention_w2", (ATTENTION_SIZE, STATE_SIZE*LSTM_NUM_OF_LAYERS*2)) +model.add_parameters("attention_v", (1, ATTENTION_SIZE)) model.add_parameters("decoder_w", (VOCAB_SIZE, STATE_SIZE)) model.add_parameters("decoder_b", (VOCAB_SIZE)) @@ -58,19 +61,19 @@ def encode_sentence(model, enc_fwd_lstm, enc_bwd_lstm, sentence): return vectors -def attend(model, vectors, state): - w = pc.parameter(model['attention_w']) +def attend(model, input_vectors, state): + w1 = pc.parameter(model['attention_w1']) + w2 = pc.parameter(model['attention_w2']) + v = pc.parameter(model['attention_v']) attention_weights = [] - for vector in vectors: - #concatenate each encoded vector with the current decoder state - attention_input = pc.concatenate([vector, pc.concatenate(list(state.s()))]) - #get the attention wieght for the decoded vector - attention_weights.append(w * attention_input) - #normalize the weights + + w2dt = w2*pc.concatenate(list(state.s())) + for input_vector in input_vectors: + attention_weight = v*pc.tanh(w1*input_vector + w2dt) + attention_weights.append(attention_weight) attention_weights = pc.softmax(pc.concatenate(attention_weights)) - #apply the weights - vectors = pc.esum([vector*attention_weight for vector, attention_weight in zip(vectors, attention_weights)]) - return vectors + output_vectors = pc.esum([vector*attention_weight for vector, attention_weight in zip(input_vectors, attention_weights)]) + return output_vectors def decode(model, dec_lstm, vectors, output): @@ -80,7 +83,6 @@ def decode(model, dec_lstm, vectors, output): w = pc.parameter(model["decoder_w"]) b = pc.parameter(model["decoder_b"]) - s = dec_lstm.initial_state().add_input(pc.vecInput(STATE_SIZE*2)) loss = [] @@ -138,7 +140,7 @@ def get_loss(model, input_sentence, output_sentence, enc_fwd_lstm, enc_bwd_lstm, def train(model, sentence): trainer = pc.SimpleSGDTrainer(model) - for i in xrange(400): + for i in xrange(600): loss = get_loss(model, sentence, sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm) loss_value = loss.value() loss.backward() From dbb50e54ea12fa6dfc414e52428620d7d56dd2e7 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 21 Jun 2016 06:15:04 +0900 Subject: [PATCH 555/965] Fixed errors for CUDA convolutions --- cnn/gpu-nodes-conv.cu | 3 +++ cnn/nodes-conv.cc | 38 ++++++++++++++++++++++++++++++-------- 2 files changed, 33 insertions(+), 8 deletions(-) create mode 100644 cnn/gpu-nodes-conv.cu diff --git a/cnn/gpu-nodes-conv.cu b/cnn/gpu-nodes-conv.cu new file mode 100644 index 000000000..451f71b36 --- /dev/null +++ b/cnn/gpu-nodes-conv.cu @@ -0,0 +1,3 @@ +// This is a dummy file that contains the same content as nodes-conv.cc but compiled +// on CUDA +#include "nodes-conv.cc" diff --git a/cnn/nodes-conv.cc b/cnn/nodes-conv.cc index cac24b5fb..579939dea 100644 --- a/cnn/nodes-conv.cc +++ b/cnn/nodes-conv.cc @@ -151,9 +151,17 @@ Dim SumColumns::dim_forward(const vector& xs) const { template void AverageColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - // throw std::runtime_error("AverageColumns not implemented yet"); + unsigned cols = xs[0]->d.cols(); +#ifdef __CUDACC__ + // The reduction used on CPU is better, but not implemented in GPU + fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().chip<1>(0); + for(unsigned i = 1; i < cols; ++i) + fx.t<1>().device(*dev.edevice) += xs[0]->t<2>().chip<1>(i); + fx.t<1>().device(*dev.edevice) = fx.t<1>() / (float)cols; +#else array reduction_axis; reduction_axis[0] = 1; - fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().sum(reduction_axis) / (float)xs[0]->d[1]; + fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().sum(reduction_axis) / (float)cols; +#endif } template @@ -270,24 +278,26 @@ void Filter1DNarrow::backward_dev_impl(const MyDevice & dev, const unsigned fids = (xs[1]->d.ndims() > 2 ? xs[1]->d[2] : 1); Eigen::DSizes sizes(rows,fcols); Eigen::DSizes indices(0,0); + // TODO: This implementation is by no means optimized. Is there a better way to do it? + vector dEdf_vec = as_vector(dEdf); if(i == 0) { for(unsigned i = 0; i < ycols; i++) { indices[1] = i; if(fids == 1) { - dEdxi.t<2>().slice(indices, sizes).device(*dev.edevice) += xs[1]->t<2>() * dEdf.t<2>()(0, i); + dEdxi.t<2>().slice(indices, sizes).device(*dev.edevice) += xs[1]->t<2>() * dEdf_vec[i]; } else { for(unsigned fid = 0; fid < fids; fid++) - dEdxi.t<2>().slice(indices, sizes).device(*dev.edevice) += xs[1]->t<3>().chip<2>(fid) * dEdf.t<2>()(fid, i); + dEdxi.t<2>().slice(indices, sizes).device(*dev.edevice) += xs[1]->t<3>().chip<2>(fid) * dEdf_vec[fid + i * fids]; } } } else { for(unsigned i = 0; i < ycols; i++) { indices[1] = i; if(fids == 1) { - dEdxi.t<2>().device(*dev.edevice) += xs[0]->t<2>().slice(indices, sizes) * dEdf.t<2>()(0, i); + dEdxi.t<2>().device(*dev.edevice) += xs[0]->t<2>().slice(indices, sizes) * dEdf_vec[i]; } else { for(unsigned fid = 0; fid < fids; fid++) - dEdxi.t<3>().chip<2>(fid).device(*dev.edevice) += xs[0]->t<2>().slice(indices, sizes) * dEdf.t<2>()(fid, i); + dEdxi.t<3>().chip<2>(fid).device(*dev.edevice) += xs[0]->t<2>().slice(indices, sizes) * dEdf_vec[fid + i * fids]; } } } @@ -331,7 +341,12 @@ void KMaxPooling::forward_dev_impl(const MyDevice & dev, const vector> locs(maxmap, dim.size()); locs.device(*dev.edevice) = xs[0]->t<2>().argmax(1); array reduction_axis; reduction_axis[0] = 1; +#ifdef __CUDACC__ + // TODO: The code that works on CPU does not compile on CUDA + throw std::runtime_error("KMaxPooling::forward_dev_impl not working on CUDA yet"); +#else fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().maximum(reduction_axis); +#endif } else { #ifdef __CUDACC__ // TODO: Can this be done by CUDNN? @@ -377,7 +392,7 @@ void KMaxPooling::backward_dev_impl(const MyDevice & dev, #ifdef __CUDACC__ vector indices(dim.size()); const Eigen::DenseIndex* maxmap = &indices[0]; - CUDA_CHECK(cudaMemcpyAsync(maxmap, aux_mem, sizeof(DenseIndex) * dim.size(), cudaMemcpyDeviceToHost)); + CUDA_CHECK(cudaMemcpyAsync((void*)maxmap, aux_mem, sizeof(Eigen::DenseIndex) * dim.size(), cudaMemcpyDeviceToHost)); #else const Eigen::DenseIndex* maxmap = static_cast(aux_mem); #endif @@ -391,9 +406,16 @@ CNN_NODE_INST_DEV_IMPL(KMaxPooling) template void SumColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - // throw std::runtime_error("SumColumns not implemented yet"); +#ifdef __CUDACC__ + // The reduction used on CPU is better, but not implemented in GPU + unsigned cols = xs[0]->d.cols(); + fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().chip<1>(0); + for(unsigned i = 1; i < cols; ++i) + fx.t<1>().device(*dev.edevice) += xs[0]->t<2>().chip<1>(i); +#else array reduction_axis; reduction_axis[0] = 1; fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().sum(reduction_axis); +#endif } template From a475955c7763bf7daa4da1f570a855a2c0985444 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 21 Jun 2016 06:53:16 +0900 Subject: [PATCH 556/965] Added some documentation to the README --- README.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5e7a3d6e8..a658cc433 100644 --- a/README.md +++ b/README.md @@ -56,8 +56,22 @@ If you want to see the compile commands that are used, you can run make VERBOSE=1 - -### Training Models +### Command line options + +All programs using cnn have a few command line options. These must be specified at the +very beginning of the command line, before other options. + +* `--cnn-mem NUMBER`: cnn runs by default with 512MB of memory each for the forward and + backward steps, as well as parameter storage. You will often want to increase this amount. + By setting NUMBER here, cnn will allocate more memory. Note that it will allocate 3 times + more memory than the number specified here, so if you want to use 3GB, specify "1024". +* `--cnn-l2 NUMBER`: Specifies the level of l2 regularization to use. +* `--cnn-gpus NUMBER`: Specify how many GPUs you want to use, if cnn is compiled with CUDA. + Currently, only one GPU is supported. +* `--cnn-gpu-ids X,Y,Z`: Specify the GPUs that you want to use by device ID. Currently only + one GPU is supported, but if you use this command you can select which one to use. + +### Creating your own models An illustation of how models are trained (for a simple logistic regression model) is below: From d0ffc3abdd81405badb5e9f5e702760fd790b4da Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 22 Jun 2016 10:17:48 +0900 Subject: [PATCH 557/965] Added info about boost to the readme --- README.md | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a658cc433..91223bed0 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,9 @@ To see that things have built properly, you can run which will train a multilayer perceptron to predict the xor function. -#### Building without Eigen installed +#### Build options + +##### Building without Eigen installed If you don't have Eigen installed, the instructions below will fetch and compile both `Eigen` and `cnn`. Eigen does not have to be compiled, so “installing” it is easy. @@ -42,13 +44,22 @@ both `Eigen` and `cnn`. Eigen does not have to be compiled, so “installing” cmake .. -DEIGEN3_INCLUDE_DIR=../eigen make -j 2 -#### Building with GPU Support +##### GPU (CUDA) support `cnn` supports running programs on GPUs with CUDA. If you have CUDA installed, you -can build cnn to be run on GPUs by adding `-DBACKEND=cuda` to your cmake options -as follows: +can build cnn to be run on GPUs by adding `-DBACKEND=cuda` to your cmake options. + +##### Non-standard Boost location + +`cnn` supports boost, and will find it if it is in the standard location. If boost is +in a non-standard location, say `$HOME/boost`, you can specify the location by adding +the following to your cmake options: + + -DBOOST_ROOT:PATHNAME=$HOME/boost -DBoost_LIBRARY_DIRS:FILEPATH=$HOME/boost/lib + -DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE - cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen -DBACKEND=cuda +Note that you will also have to set your `LD_LIBRARY_PATH` to point to the `boost/lib` +directory. #### Debugging build problems From 091816578fa56e8bea5d25207684cd6fc2633f69 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 22 Jun 2016 11:10:55 +0900 Subject: [PATCH 558/965] Added exceptions for memory allocation in nodes functions --- cnn/CMakeLists.txt | 2 +- cnn/nodes-conv.cc | 3 +++ cnn/nodes.cc | 18 ++++++++++++++++-- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index fbb51fc8e..95416dcab 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -117,7 +117,7 @@ if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU") SET(CUDA_PROPAGATE_HOST_FLAGS OFF) - cuda_add_library(cnncuda STATIC gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-param-nodes.cu gpu-training.cu) + cuda_add_library(cnncuda STATIC gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu) cuda_add_library(cnncuda_shared SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-param-nodes.cu gpu-training.cu) endif(WITH_CUDA_BACKEND) diff --git a/cnn/nodes-conv.cc b/cnn/nodes-conv.cc index 579939dea..b6ab7c30f 100644 --- a/cnn/nodes-conv.cc +++ b/cnn/nodes-conv.cc @@ -259,6 +259,9 @@ void Filter1DNarrow::forward_dev_impl(const MyDevice & dev, const vector sizes(1,ycols); for(unsigned fid = 0; fid < fids; ++fid) { indices[0] = fid; +#if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) + throw std::runtime_error("CUDA memory allocation in Filter1DNarrow"); +#endif fx.t<2>().slice(indices, sizes).device(*dev.edevice) = xs[0]->t<2>().convolve(xs[1]->t<3>().chip<2>(fid), dims); } } diff --git a/cnn/nodes.cc b/cnn/nodes.cc index fa2500937..dbd88852c 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -145,13 +145,18 @@ EIGEN_STRONG_INLINE void logsumexp(const MyDevice & dev, const Tensor& x, Tensor if(x.d.bd == 1) { z.t<0>().device(*dev.edevice) = x.t<1>().maximum(); float m = TensorTools::AccessElement(z, 0); +#if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) + throw std::runtime_error("CUDA memory allocation in logsumexp"); +#endif z.t<0>().device(*dev.edevice) += (x.t<1>() - m).exp().sum().log(); } else { // #ifdef __CUDACC__ - // nvcc doesn't work with the following reductions, so do something simpler for(size_t b = 0; b < x.d.bd; b++) { z.tb<0>().chip<0>(b).device(*dev.edevice) = x.tb<1>().chip<1>(b).maximum(); float m = TensorTools::AccessElement(z, b); +#if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) + throw std::runtime_error("CUDA memory allocation in logsumexp"); +#endif z.tb<0>().chip<0>(b).device(*dev.edevice) += (x.tb<1>().chip<1>(b) - m).exp().sum().log(); } // #else @@ -716,6 +721,9 @@ void Hinge::backward_dev_impl(const MyDevice & dev, Tensor eloss(xs[0]->d, static_cast(aux_mem), fx.device); // TODO: The > comparison should not be calculated twice. Keep it in auxiliary memory? dEdxi.tvec().device(*dev.edevice) += (eloss.tvec() > 0.f).cast() * d; +#if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) + throw std::runtime_error("CUDA memory allocation in hinge"); +#endif dEdxi.tvec().chip<0>(*pelement).device(*dev.edevice) -= (eloss.tvec() > 0.f).cast().sum() * d; } } else { @@ -727,6 +735,9 @@ void Hinge::backward_dev_impl(const MyDevice & dev, if(fx_vec[b]) { // there was some loss // TODO: The > comparison should not be calculated twice. Keep it in auxiliary memory? dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += (eloss.tb<1>().chip<1>(b) > 0.f).cast() * d_vec[b]; +#if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) + throw std::runtime_error("CUDA memory allocation in hinge"); +#endif dEdxi.tb<1>().chip<1>(b).chip<0>((*pelements)[b]).device(*dev.edevice) -= (eloss.tb<1>().chip<1>(b) > 0.f).cast().sum() * d_vec[b]; } } @@ -1432,8 +1443,11 @@ void Pow::backward_dev_impl(const MyDevice & dev, assert(xs.size() == 2); real x2 = as_scalar(*xs[1]); if (i == 0) { - dEdxi.tvec().device(*dev.edevice) += (xs[0]->tvec().pow(x2 - 1) * x2) * dEdf.tvec(); + dEdxi.tvec().device(*dev.edevice) += xs[0]->tvec().pow(x2 - 1) * dEdf.tvec() * x2; } else { +#if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) + throw std::runtime_error("CUDA memory allocation in Pow"); +#endif // y = a^x // dy/dx = a^x * log(a) dEdxi.t<0>().device(*dev.edevice) += (fx.tvec() * xs[0]->tvec().log() * dEdf.tvec()).sum(); From dc0ac9dcf5a09978935ee31db271974c73ba8a4d Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 22 Jun 2016 13:32:59 +0900 Subject: [PATCH 559/965] Fixed unnecessary allocs for softmax --- cnn/nodes.cc | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index dbd88852c..abccaed0f 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -145,19 +145,17 @@ EIGEN_STRONG_INLINE void logsumexp(const MyDevice & dev, const Tensor& x, Tensor if(x.d.bd == 1) { z.t<0>().device(*dev.edevice) = x.t<1>().maximum(); float m = TensorTools::AccessElement(z, 0); -#if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) - throw std::runtime_error("CUDA memory allocation in logsumexp"); -#endif - z.t<0>().device(*dev.edevice) += (x.t<1>() - m).exp().sum().log(); + // This needs to be split into two lines to prevent memory allocation + z.t<0>().device(*dev.edevice) = (x.t<1>() - m).exp().sum(); + z.t<0>().device(*dev.edevice) = z.t<0>().log() + m; } else { // #ifdef __CUDACC__ for(size_t b = 0; b < x.d.bd; b++) { z.tb<0>().chip<0>(b).device(*dev.edevice) = x.tb<1>().chip<1>(b).maximum(); float m = TensorTools::AccessElement(z, b); -#if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) - throw std::runtime_error("CUDA memory allocation in logsumexp"); -#endif - z.tb<0>().chip<0>(b).device(*dev.edevice) += (x.tb<1>().chip<1>(b) - m).exp().sum().log(); + // This needs to be split into two lines to prevent memory allocation + z.tb<0>().chip<0>(b).device(*dev.edevice) = (x.tb<1>().chip<1>(b) - m).exp().sum(); + z.tb<0>().chip<0>(b).device(*dev.edevice) = z.tb<0>().chip<0>(b).log() + m; } // #else // // Calculate the max for all batches at once. This dies for nvcc @@ -937,15 +935,15 @@ void LogSoftmax::backward_dev_impl(const MyDevice & dev, throw std::runtime_error("LogSoftmax::backward not yet implemented for multiple columns"); Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); if(fx.d.bd == 1) { - z.t<0>().device(*dev.edevice) = -fx.t<1>().binaryExpr(dEdf.t<1>(), FWeightedError()).sum(); - float off_diag_sum = TensorTools::AccessElement(z, 0); + z.t<0>().device(*dev.edevice) = fx.t<1>().binaryExpr(dEdf.t<1>(), FWeightedError()).sum(); + float off_diag_sum = - TensorTools::AccessElement(z, 0); dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().exp() * off_diag_sum + dEdf.t<1>(); } else { // #ifdef __CUDACC__ // nvcc doesn't work with the following reductions, so do something simpler for(size_t b = 0; b < fx.d.bd; b++) { - z.tb<0>().chip<0>(b).device(*dev.edevice) = -fx.tb<1>().chip<1>(b).binaryExpr(dEdf.tb<1>().chip<1>(b), FWeightedError()).sum(); - float off_diag_sum = TensorTools::AccessElement(z, b); + z.tb<0>().chip<0>(b).device(*dev.edevice) = fx.tb<1>().chip<1>(b).binaryExpr(dEdf.tb<1>().chip<1>(b), FWeightedError()).sum(); + float off_diag_sum = - TensorTools::AccessElement(z, b); dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += fx.tb<1>().chip<1>(b).exp() * off_diag_sum + dEdf.tb<1>().chip<1>(b); } // TODO: These should work, but are unstable and giving NaNs. Figure out why. @@ -1604,15 +1602,15 @@ void Softmax::backward_dev_impl(const MyDevice & dev, Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); if(fx.d.bd == 1) { - z.t<0>().device(*dev.edevice) = -(fx.t<1>() * dEdf.t<1>()).sum(); - float off_diag_sum = TensorTools::AccessElement(z, 0); + z.t<0>().device(*dev.edevice) = (fx.t<1>() * dEdf.t<1>()).sum(); + float off_diag_sum = - TensorTools::AccessElement(z, 0); dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().binaryExpr(dEdf.t<1>(), FSoftmaxBackward(off_diag_sum)); } else { // #ifdef __CUDACC__ // nvcc doesn't work with the following reductions, so do something simpler for(size_t b = 0; b < fx.d.bd; b++) { - z.tb<0>().chip<0>(b).device(*dev.edevice) = -(fx.tb<1>().chip<1>(b) * dEdf.tb<1>().chip<1>(b)).sum(); - float off_diag_sum = TensorTools::AccessElement(z, b); + z.tb<0>().chip<0>(b).device(*dev.edevice) = (fx.tb<1>().chip<1>(b) * dEdf.tb<1>().chip<1>(b)).sum(); + float off_diag_sum = - TensorTools::AccessElement(z, b); dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += fx.tb<1>().chip<1>(b).binaryExpr(dEdf.tb<1>().chip<1>(b), FSoftmaxBackward(off_diag_sum)); } // TODO: These should work, but are unstable and giving NaNs. Figure out why. From 1530ec355fdc0614b7fa2b086ea72c0b80df3901 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 23 Jun 2016 12:20:18 +0900 Subject: [PATCH 560/965] Some optimizations for softmax --- cnn/grad-check.cc | 8 +- cnn/nodes.cc | 180 ++++++++++++++++++-------------------------- cnn/nodes.h | 3 +- tests/test-nodes.cc | 4 +- 4 files changed, 82 insertions(+), 113 deletions(-) diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc index 53ec87354..cf74d2b12 100644 --- a/cnn/grad-check.cc +++ b/cnn/grad-check.cc @@ -43,8 +43,8 @@ bool CheckGrad(Model& m, ComputationGraph& g, int verbosity) { float g_act = TensorTools::AccessElement(p.g, i); float f = fabs(g - g_act); float m = max(fabs(g), fabs(g_act)); - if (f > 0.1 && m > 0.f) f /= m; - if (f > 0.1 || std::isnan(f)) { flag = true; if(verbosity > 0) { curr_flag = true; cerr << "***[" << f << "] "; } } + if (f > 0.01 && m > 0.f) f /= m; + if (f > 0.01 || std::isnan(f)) { flag = true; if(verbosity > 0) { curr_flag = true; cerr << "***[" << f << "] "; } } if(verbosity + (curr_flag ? 1 : 0) > 1) { cerr << g_act << ' ' << g << endl; curr_flag = false; @@ -73,8 +73,8 @@ bool CheckGrad(Model& m, ComputationGraph& g, int verbosity) { float g_act = TensorTools::AccessElement(ag, i); float f = fabs(g - g_act); float m = max(fabs(g), fabs(g_act)); - if (f > 0.1 && m > 0.f) f /= m; - if (f > 0.1 || std::isnan(f)) { flag = true; if(verbosity > 0) { curr_flag = true; cerr << "***[" << f << "] "; } } + if (f > 0.01 && m > 0.f) f /= m; + if (f > 0.01 || std::isnan(f)) { flag = true; if(verbosity > 0) { curr_flag = true; cerr << "***[" << f << "] "; } } if(verbosity + (curr_flag ? 1 : 0) > 1) { cerr << g_act << ' ' << g << endl; curr_flag = false; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index abccaed0f..d6436e0ad 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -105,13 +105,17 @@ size_t Hinge::aux_storage_size() const { } size_t LogSoftmax::aux_storage_size() const { - return dim.batch_elems() * sizeof(float); + return 2 * dim.batch_elems() * sizeof(float); +} + +size_t PickNegLogSoftmax::aux_storage_size() const { + return 2 * dim.batch_elems() * sizeof(float); } // this i need to do something better, but this is a work-around // if this is too small, just make it bigger size_t LogSumExp::aux_storage_size() const { - return MAX_LOG_SUM_EXP * sizeof(float); + return (MAX_LOG_SUM_EXP + 1) * sizeof(float); } size_t Max::aux_storage_size() const { @@ -123,7 +127,7 @@ size_t Min::aux_storage_size() const { } size_t Softmax::aux_storage_size() const { - return dim.batch_elems() * sizeof(float); + return 2 * dim.batch_elems() * sizeof(float); } size_t Sparsemax::aux_storage_size() const { @@ -141,33 +145,28 @@ size_t SparsemaxLoss::aux_storage_size() const { // ===== Auxiliary functions for both CPU and GPU template -EIGEN_STRONG_INLINE void logsumexp(const MyDevice & dev, const Tensor& x, Tensor& z) { +EIGEN_STRONG_INLINE void logsumexp(const MyDevice & dev, const Tensor& x, Tensor & m, Tensor& z) { + if(x.d.bd == 1) { - z.t<0>().device(*dev.edevice) = x.t<1>().maximum(); - float m = TensorTools::AccessElement(z, 0); + m.t<0>().device(*dev.edevice) = x.t<1>().maximum(); + float mval = as_scalar(m); // This needs to be split into two lines to prevent memory allocation - z.t<0>().device(*dev.edevice) = (x.t<1>() - m).exp().sum(); - z.t<0>().device(*dev.edevice) = z.t<0>().log() + m; + z.t<0>().device(*dev.edevice) = (x.t<1>() - mval).exp().sum(); + z.t<0>().device(*dev.edevice) = z.t<0>().log() + mval; } else { -// #ifdef __CUDACC__ + Eigen::array red_axis({0}); + m.tb<0>().device(*dev.edevice) = x.tb<1>().maximum(red_axis); + // TODO: We want to do this in a single command, but this is causing incorrect results. + // Eigen::array bcast({(int)x.d.rows(), 1}); + // z.tb<0>().device(*dev.edevice) = (x.tb<1>() - m.tb<1>().broadcast(bcast)).exp().sum(); + // z.tb<0>().device(*dev.edevice) = z.tb<0>().log() + m.tb<0>(); + // Do the following instead + vector mvals = as_vector(m); for(size_t b = 0; b < x.d.bd; b++) { - z.tb<0>().chip<0>(b).device(*dev.edevice) = x.tb<1>().chip<1>(b).maximum(); - float m = TensorTools::AccessElement(z, b); // This needs to be split into two lines to prevent memory allocation - z.tb<0>().chip<0>(b).device(*dev.edevice) = (x.tb<1>().chip<1>(b) - m).exp().sum(); - z.tb<0>().chip<0>(b).device(*dev.edevice) = z.tb<0>().chip<0>(b).log() + m; + z.tb<0>().chip<0>(b).device(*dev.edevice) = (x.tb<1>().chip<1>(b) - mvals[b]).exp().sum(); + z.tb<0>().chip<0>(b).device(*dev.edevice) = z.tb<0>().chip<0>(b).log() + mvals[b]; } -// #else -// // Calculate the max for all batches at once. This dies for nvcc -// array reduction_axis; -// reduction_axis[0] = 0; -// z.tb<0>().device(*dev.edevice) = x.tb<1>().maximum(reduction_axis); -// // Broadcast -// array broadcasts; -// broadcasts[0] = x.d.rows(); -// broadcasts[1] = 1; -// z.tb<0>().device(*dev.edevice) += (x.tb<1>() - z.tb<1>().broadcast(broadcasts)).exp().sum(reduction_axis).log(); -// #endif } } @@ -377,17 +376,13 @@ template void Concatenate::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { unsigned curr_row = 0; src_row_indices.resize(xs.size()); + Eigen::DSizes indices(0,0,0); + Eigen::DSizes sizes(0,fx.d.cols(),fx.d.bd); for (unsigned i = 0; i < xs.size(); ++i) { - src_row_indices[i] = curr_row; + indices[0] = src_row_indices[i] = curr_row; const unsigned row_size = xs[i]->d.rows(); -#if __CUDACC__ - // CUBLAS matricies are col major, so this is non-trivial - const unsigned cols = xs[i]->d.cols(); - if(cols != 1 && row_size != 1) throw std::runtime_error("Concatenating matricies with more than one column and row on CUDA not supported yet"); - CUDA_CHECK(cudaMemcpyAsync(fx.v + curr_row*cols, xs[i]->v, sizeof(float) * cols * row_size, cudaMemcpyDeviceToDevice)); -#else - (*fx).middleRows(curr_row, row_size) = **xs[i]; -#endif + sizes[0] = row_size; + fx.tb<2>().slice(indices, sizes).device(*dev.edevice) = xs[i]->tb<2>(); curr_row += row_size; } } @@ -400,14 +395,9 @@ void Concatenate::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { assert(i < src_row_indices.size()); - const unsigned row_size = dEdxi.d.rows(); - const unsigned curr_row = src_row_indices[i]; -#if __CUDACC__ - const unsigned cols = dEdxi.d.cols(); - CUBLAS_CHECK(cublasSaxpy(cublas_handle, row_size*cols, kSCALAR_ONE, dEdf.v + curr_row*cols, 1, dEdxi.v, 1)); -#else - *dEdxi += (*dEdf).middleRows(curr_row, row_size); -#endif + Eigen::DSizes indices(src_row_indices[i],0,0); + Eigen::DSizes sizes(dEdxi.d.rows(),fx.d.cols(),fx.d.bd); + dEdxi.tb<2>().device(*dev.edevice) += dEdf.tb<2>().slice(indices, sizes); } CNN_NODE_INST_DEV_IMPL(Concatenate) @@ -913,9 +903,10 @@ void LogSoftmax::forward_dev_impl(const MyDevice & dev, const vectord.cols() != 1) throw std::runtime_error("LogSoftmax::forward not yet implemented for multiple columns"); Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); - logsumexp(dev, *xs[0], z); + Tensor m(Dim({1},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device); + logsumexp(dev, *xs[0], m, z); if(fx.d.bd == 1) { - fx.t<1>().device(*dev.edevice) = xs[0]->t<1>() - TensorTools::AccessElement(z, 0); + fx.t<1>().device(*dev.edevice) = xs[0]->t<1>() - as_scalar(z); } else { array broadcasts; broadcasts[0] = xs[0]->d.rows(); @@ -936,26 +927,13 @@ void LogSoftmax::backward_dev_impl(const MyDevice & dev, Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); if(fx.d.bd == 1) { z.t<0>().device(*dev.edevice) = fx.t<1>().binaryExpr(dEdf.t<1>(), FWeightedError()).sum(); - float off_diag_sum = - TensorTools::AccessElement(z, 0); - dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().exp() * off_diag_sum + dEdf.t<1>(); + Eigen::array bcast({(int)fx.d.rows()}); + dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().exp() * -z.t<1>().broadcast(bcast) + dEdf.t<1>(); } else { -// #ifdef __CUDACC__ - // nvcc doesn't work with the following reductions, so do something simpler - for(size_t b = 0; b < fx.d.bd; b++) { - z.tb<0>().chip<0>(b).device(*dev.edevice) = fx.tb<1>().chip<1>(b).binaryExpr(dEdf.tb<1>().chip<1>(b), FWeightedError()).sum(); - float off_diag_sum = - TensorTools::AccessElement(z, b); - dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += fx.tb<1>().chip<1>(b).exp() * off_diag_sum + dEdf.tb<1>().chip<1>(b); - } - // TODO: These should work, but are unstable and giving NaNs. Figure out why. -// #else -// array reduction_axis; -// reduction_axis[0] = 0; -// z.tb<0>().device(*dev.edevice) = -fx.tb<1>().binaryExpr(dEdf.tb<1>(), FWeightedError()).sum(reduction_axis); -// array broadcasts; -// broadcasts[0] = xs[0]->d.rows(); -// broadcasts[1] = 1; -// dEdxi.tb<1>().device(*dev.edevice) += fx.tb<1>().exp() * z.tb<1>().broadcast(broadcasts) + dEdf.tb<1>(); -// #endif + Eigen::array red_axis({0}); + z.tb<0>().device(*dev.edevice) = (fx.tb<1>().binaryExpr(dEdf.tb<1>(), FWeightedError())).sum(red_axis); + Eigen::array bcast({(int)fx.d.rows(), 1}); + dEdxi.tb<1>().device(*dev.edevice) += fx.tb<1>().exp() * -z.tb<1>().broadcast(bcast) + dEdf.tb<1>(); } } CNN_NODE_INST_DEV_IMPL(LogSoftmax) @@ -966,11 +944,11 @@ void LogSumExp::forward_dev_impl(const MyDevice & dev, const vectorv; } else { - Dim r = {(unsigned int)xs.size()}; - Tensor v(r, static_cast(aux_mem), fx.device); + Tensor v(Dim({(unsigned int)xs.size()}), static_cast(aux_mem), fx.device); + Tensor m(Dim({1}), static_cast(aux_mem) + xs.size(), fx.device); for (unsigned i = 0; i < xs.size(); ++i) TensorTools::CopyElement(*xs[i], 0, v, i); - logsumexp(dev, v, fx); + logsumexp(dev, v, m, fx); } } @@ -1311,15 +1289,14 @@ CNN_NODE_INST_DEV_IMPL(PickElement) template void PickNegLogSoftmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { - logz = (float*)device->fxs->allocate(sizeof(float)*fx.d.batch_elems()); - Tensor z(Dim({1},fx.d.batch_elems()), (float*)logz, fx.device); + Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); + Tensor m(Dim({1},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device); + logsumexp(dev, *xs[0], m, z); if(pval) { - logsumexp(dev, *xs[0], z); fx.t<0>().device(*dev.edevice) = z.t<0>() - xs[0]->t<1>().chip<0>(*pval); } else { assert(pvals); assert(pvals->size() == fx.d.batch_elems()); - logsumexp(dev, *xs[0], z); int batch_size = xs[0]->d.batch_size(); for(unsigned b = 0; b < pvals->size(); ++b) TensorTools::CopyElement(*xs[0], batch_size * b + (*pvals)[b], fx, b); @@ -1338,28 +1315,25 @@ void PickNegLogSoftmax::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { if (xs[0]->d.cols() == 1) { - Tensor z(Dim({1},fx.d.batch_elems()), (float*)logz, fx.device); + Tensor z(Dim({1},fx.d.batch_elems()), (float*)aux_mem, fx.device); if(pval) { - const auto elem = *pval; - const float err_val = TensorTools::AccessElement(dEdf, 0); - const float logz_val = TensorTools::AccessElement(z, 0); + const float err_val = as_scalar(dEdf); + const float logz_val = as_scalar(z); // logz is computed in the forward pass and cached dEdxi.t<1>().device(*dev.edevice) += (xs[0]->t<1>() - logz_val).exp() * err_val; - dEdxi.t<1>().chip<0>(elem).device(*dev.edevice) = dEdxi.t<1>().chip<0>(elem) - err_val; + dEdxi.t<1>().chip<0>(*pval).device(*dev.edevice) = dEdxi.t<1>().chip<0>(*pval) - err_val; } else { assert(pvals); assert(pvals->size() == fx.d.batch_elems()); - // // Add and do broadcasting. TODO: But broadcasting is slow, so we use a loop instead. - // array broadcasts; - // broadcasts[0] = xs[0]->d.rows(); - // broadcasts[1] = 1; - // dEdxi.tb<1>().device(*dev.edevice) += (xs[0]->tb<1>() - z.tb<1>().broadcast(broadcasts)).exp() * dEdf.tb<1>().broadcast(broadcasts); + // TODO: We want to do this, but it's not working + // Eigen::array bcast({(int)fx.d.rows(), 1}); + // dEdxi.tb<1>().device(*dev.edevice) += (xs[0]->tb<1>() - z.tb<1>().broadcast(bcast)).exp() * dEdf.tb<1>().broadcast(bcast); + // So we do this instead: + vector zs = as_vector(z); + vector errs = as_vector(dEdf); for(unsigned b = 0; b < pvals->size(); ++b) { - const auto elem = (*pvals)[b]; - const float err_val = TensorTools::AccessElement(dEdf, b); - const float logz_val = TensorTools::AccessElement(z, b); - dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += (xs[0]->tb<1>().chip<1>(b) - logz_val).exp() * err_val; - dEdxi.tb<1>().chip<1>(b).chip<0>(elem).device(*dev.edevice) = dEdxi.tb<1>().chip<1>(b).chip<0>((*pvals)[b]) - dEdf.tb<0>().chip<0>(b); + dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += (xs[0]->tb<1>().chip<1>(b) - zs[b]).exp() * errs[b]; + dEdxi.tb<1>().chip<1>(b).chip<0>((*pvals)[b]).device(*dev.edevice) = dEdxi.tb<1>().chip<1>(b).chip<0>((*pvals)[b]) - errs[b]; } } } else { @@ -1579,14 +1553,13 @@ void Softmax::forward_dev_impl(const MyDevice & dev, const vector if (xs[0]->d.cols() != 1) throw std::runtime_error("Softmax not yet implemented for multiple columns"); Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); - logsumexp(dev, *xs[0], z); + Tensor m(Dim({1},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device); + logsumexp(dev, *xs[0], m, z); if(fx.d.bd == 1) { - fx.t<1>().device(*dev.edevice) = (xs[0]->t<1>() - TensorTools::AccessElement(z, 0)).exp(); + fx.t<1>().device(*dev.edevice) = (xs[0]->t<1>() - as_scalar(z)).exp(); } else { - array broadcasts; - broadcasts[0] = xs[0]->d.rows(); - broadcasts[1] = 1; - fx.tb<1>().device(*dev.edevice) = (xs[0]->tb<1>() - z.tb<1>().broadcast(broadcasts)).exp(); + Eigen::array bcast({(int)xs[0]->d.rows(), 1}); + fx.tb<1>().device(*dev.edevice) = (xs[0]->tb<1>() - z.tb<1>().broadcast(bcast)).exp(); } } @@ -1597,32 +1570,27 @@ void Softmax::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - if (xs[0]->d.cols() != 1) - throw std::runtime_error("Softmax::backward not yet implemented for multiple columns"); - Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); if(fx.d.bd == 1) { + // TODO: This requires no transfer between host/device, but is not working? + // z.t<0>().device(*dev.edevice) = (fx.t<1>() * dEdf.t<1>()).sum(); + // Eigen::array bcast({(int)fx.d.rows()}); + // dEdxi.t<1>().device(*dev.edevice) += (fx.t<1>() - z.t<1>().broadcast(bcast)) * dEdf.t<1>(); + // So we use this instead. z.t<0>().device(*dev.edevice) = (fx.t<1>() * dEdf.t<1>()).sum(); - float off_diag_sum = - TensorTools::AccessElement(z, 0); + float off_diag_sum = -TensorTools::AccessElement(z, 0); dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().binaryExpr(dEdf.t<1>(), FSoftmaxBackward(off_diag_sum)); } else { -// #ifdef __CUDACC__ - // nvcc doesn't work with the following reductions, so do something simpler + // TODO: This requires no transfer between host/device, but is not working? + // Eigen::array red_axis({0}); + // z.tb<0>().device(*dev.edevice) = (fx.tb<1>() * dEdf.tb<1>()).sum(red_axis); + // Eigen::array bcast({(int)fx.d.rows(), 1}); + // dEdxi.tb<1>().device(*dev.edevice) += (fx.tb<1>() - z.tb<1>().broadcast(bcast)) * dEdf.tb<1>(); for(size_t b = 0; b < fx.d.bd; b++) { z.tb<0>().chip<0>(b).device(*dev.edevice) = (fx.tb<1>().chip<1>(b) * dEdf.tb<1>().chip<1>(b)).sum(); float off_diag_sum = - TensorTools::AccessElement(z, b); dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += fx.tb<1>().chip<1>(b).binaryExpr(dEdf.tb<1>().chip<1>(b), FSoftmaxBackward(off_diag_sum)); } - // TODO: These should work, but are unstable and giving NaNs. Figure out why. -// #else -// array reduction_axis; -// reduction_axis[0] = 0; -// z.tb<0>().device(*dev.edevice) = -(fx.tb<1>() * dEdf.tb<1>()).sum(reduction_axis); -// array broadcasts; -// broadcasts[0] = xs[0]->d.rows(); -// broadcasts[1] = 1; -// dEdxi.tb<1>().device(*dev.edevice) += (fx.tb<1>() + z.tb<1>().broadcast(broadcasts)) * dEdf.tb<1>(); -// #endif } } CNN_NODE_INST_DEV_IMPL(Softmax) diff --git a/cnn/nodes.h b/cnn/nodes.h index 68a8e4fc8..ff6050745 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -233,6 +233,7 @@ struct Log : public Node { // concatenate rows struct Concatenate : public Node { template explicit Concatenate(const T& a) : Node(a) {} + virtual bool supports_multibatch() const override { return true; } CNN_NODE_DEFINE_DEV_IMPL() // src_row_indices[i] says what row in fx the ith x vector was assigned to // used to simplify backprop @@ -469,7 +470,7 @@ struct PickNegLogSoftmax : public Node { explicit PickNegLogSoftmax(const std::initializer_list& a, const std::vector* pv) : Node(a), val(), pval(), vals(), pvals(pv) {} CNN_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } - mutable float* logz; + size_t aux_storage_size() const override; unsigned val; const unsigned* pval; std::vector vals; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 531cb41a9..50ba37181 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -473,7 +473,7 @@ BOOST_AUTO_TEST_CASE( restricted_log_softmax_gradient ) { BOOST_AUTO_TEST_CASE( softmax_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); - Expression y = softmax(x1); + Expression y = log(softmax(x1)); input(cg, {1,3}, first_one_vals) * y; BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -483,7 +483,7 @@ BOOST_AUTO_TEST_CASE( softmax_batch_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); - Expression y = softmax(x1+x2); + Expression y = log(softmax(x1+x2)); sum_batches(input(cg, {1,3}, first_one_vals) * y); BOOST_CHECK(CheckGrad(mod, cg, 0)); } From 93eaab3e08ab7d938857446e7c5bfa7507737308 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 23 Jun 2016 12:48:30 +0900 Subject: [PATCH 561/965] Fix of concatenate when only some of the inputs are batched --- cnn/nodes.cc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index d6436e0ad..b0c95514c 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -382,7 +382,12 @@ void Concatenate::forward_dev_impl(const MyDevice & dev, const vectord.rows(); sizes[0] = row_size; - fx.tb<2>().slice(indices, sizes).device(*dev.edevice) = xs[i]->tb<2>(); + if(fx.d.bd == xs[i]->d.bd) { + fx.tb<2>().slice(indices, sizes).device(*dev.edevice) = xs[i]->tb<2>(); + } else { + Eigen::array bcast({1,1,(int)fx.d.bd}); + fx.tb<2>().slice(indices, sizes).device(*dev.edevice) = xs[i]->tb<2>().broadcast(bcast); + } curr_row += row_size; } } @@ -397,7 +402,12 @@ void Concatenate::backward_dev_impl(const MyDevice & dev, assert(i < src_row_indices.size()); Eigen::DSizes indices(src_row_indices[i],0,0); Eigen::DSizes sizes(dEdxi.d.rows(),fx.d.cols(),fx.d.bd); - dEdxi.tb<2>().device(*dev.edevice) += dEdf.tb<2>().slice(indices, sizes); + if(dEdxi.d.bd == dEdf.d.bd) { + dEdxi.tb<2>().device(*dev.edevice) += dEdf.tb<2>().slice(indices, sizes); + } else { + for(unsigned b = 0; b < dEdf.d.bd; ++b) + dEdxi.t<2>().device(*dev.edevice) += dEdf.tb<2>().chip<2>(b).slice(indices, sizes); + } } CNN_NODE_INST_DEV_IMPL(Concatenate) From 17c8bdf9cc5d5b8fd20ff372d9004765df06f8dc Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 23 Jun 2016 13:54:44 +0900 Subject: [PATCH 562/965] BIG improvements in matrix mult backprop speed --- cnn/nodes.cc | 90 ++++++++++++++++++++++++++++++++++------------------ cnn/nodes.h | 3 +- 2 files changed, 61 insertions(+), 32 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index b0c95514c..0246a249c 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -225,7 +225,7 @@ void AddVectorToAllColumns::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(AddVectorToAllColumns) -// Affine transform uses different impleentations for CPU and GPU because this is +// Affine transform uses different implementations for CPU and GPU because this is // much faster than using Eigen's tensor contractions (as of the writing) template void AffineTransform::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -277,37 +277,52 @@ void AffineTransform::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { assert(i < xs.size()); + // In the common case that dEdxi has a single batch, and the output has + // multiple batches, cache the sum + Tensor dEdf_sum; + if(dEdxi.d.bd == 1 && dEdf.d.bd != 1 && dEdf_mem == nullptr) { + dEdf_mem = (float*)device->mem->malloc(sizeof(float) * dEdf.d.batch_size()); + Dim dEdf_dim = dEdf.d; dEdf_dim.bd = 1; + dEdf_sum = Tensor(dEdf_dim, dEdf_mem, device); + Eigen::array red_axis({2}); + dEdf_sum.t<2>().device(*dev.edevice) = dEdf.tb<2>().sum(red_axis); + } + + // Bias term if (i == 0) { // bias term -#if __CUDACC__ - if(fx.d.bd == xs[0]->d.bd) { - CUBLAS_CHECK(cublasSaxpy(cublas_handle, dEdxi.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); - } else { - // TODO: Can we use broadcasting? - for(unsigned b = 0; b < dEdf.d.bd; ++b) - CUBLAS_CHECK(cublasSaxpy(cublas_handle, dEdxi.d.batch_size(), kSCALAR_ONE, dEdf.batch_ptr(b), 1, dEdxi.batch_ptr(b), 1)); - } -#else - // Add, using broadcasting or not - if(dEdxi.d.bd == 1 && dEdf.d.bd > 1) { - dEdxi.vec() += dEdf.rowcol_matrix().rowwise().sum(); + if(dEdxi.d.bd == dEdf.d.bd) { + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); } else { - for(unsigned b = 0; b < dEdf.d.bd; ++b) - dEdxi.batch_matrix(b) += dEdf.batch_matrix(b); + dEdxi.tvec().device(*dev.edevice) += dEdf_sum.tvec(); } -#endif - } else if (i % 2 == 1) { // left argument of matrix multiply + + // Left argument of matrix multiply + } else if (i % 2 == 1) { int max_b = max(dEdf.d.bd, xs[i+1]->d.bd); #if __CUDACC__ - for(int b = 0; b < max_b; ++b) + if(dEdxi.d.bd == 1 && (dEdf.d.bd == xs[i+1]->d.bd)) { CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, - dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), + dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols() * dEdf.d.batch_elems(), kSCALAR_ONE, - dEdf.batch_ptr(b), dEdf.d.rows(), - xs[i+1]->batch_ptr(b), xs[i+1]->d.rows(), - kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); + dEdf.v, dEdf.d.rows(), + xs[i+1]->v, xs[i+1]->d.rows(), + kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); + } else { + for(int b = 0; b < max_b; ++b) + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, + dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), + kSCALAR_ONE, + dEdf.batch_ptr(b), dEdf.d.rows(), + xs[i+1]->batch_ptr(b), xs[i+1]->d.rows(), + kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); + } #else - for(int b = 0; b < max_b; ++b) - dEdxi.batch_matrix(b).noalias() += dEdf.batch_matrix(b) * xs[i+1]->batch_matrix(b).transpose(); + if(dEdxi.d.bd == 1 && (dEdf.d.bd == xs[i+1]->d.bd)) { + (*dEdxi).noalias() += dEdf.colbatch_matrix() * xs[i+1]->colbatch_matrix().transpose(); + } else { + for(int b = 0; b < max_b; ++b) + dEdxi.batch_matrix(b).noalias() += dEdf.batch_matrix(b) * xs[i+1]->batch_matrix(b).transpose(); + } #endif } else { // right argument of matrix multiply int max_b = max(xs[i-1]->d.bd, dEdf.d.bd); @@ -1045,13 +1060,22 @@ void MatrixMultiply::backward_dev_impl(const MyDevice & dev, int max_b = max(xs[0]->d.bd, xs[1]->d.bd); #if __CUDACC__ if (i == 0) { - for(int b = 0; b < max_b; ++b) + if(dEdxi.d.bd == 1 && (dEdf.d.bd == xs[1]->d.bd)) { CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, - dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), + dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols() * dEdf.d.batch_elems(), kSCALAR_ONE, - dEdf.batch_ptr(b), dEdf.d.rows(), - xs[1]->batch_ptr(b), xs[1]->d.rows(), - kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); + dEdf.v, dEdf.d.rows(), + xs[1]->v, xs[1]->d.rows(), + kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); + } else { + for(int b = 0; b < max_b; ++b) + CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, + dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), + kSCALAR_ONE, + dEdf.batch_ptr(b), dEdf.d.rows(), + xs[1]->batch_ptr(b), xs[1]->d.rows(), + kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows())); + } } else { // Do a single multiply if xs[0] has one batch if(xs[0]->d.bd == 1) { @@ -1074,8 +1098,12 @@ void MatrixMultiply::backward_dev_impl(const MyDevice & dev, } #else if (i == 0) { - for(int b = 0; b < max_b; ++b) - dEdxi.batch_matrix(b).noalias() += dEdf.batch_matrix(b) * xs[1]->batch_matrix(b).transpose(); + if(dEdxi.d.bd == 1 && (dEdf.d.bd == xs[1]->d.bd)) { + (*dEdxi).noalias() += dEdf.colbatch_matrix() * xs[1]->colbatch_matrix().transpose(); + } else { + for(int b = 0; b < max_b; ++b) + dEdxi.batch_matrix(b).noalias() += dEdf.batch_matrix(b) * xs[1]->batch_matrix(b).transpose(); + } } else { if(xs[0]->d.bd == 1) { dEdxi.colbatch_matrix().noalias() += (**xs[0]).transpose() * dEdf.colbatch_matrix(); diff --git a/cnn/nodes.h b/cnn/nodes.h index ff6050745..df58c5be8 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -322,9 +322,10 @@ struct CwiseQuotient : public Node { // y = x_1 \sum_{i=2, 4 ...} A_i * x_{i+1} struct AffineTransform : public Node { - template explicit AffineTransform(const T& a) : Node(a) {} + template explicit AffineTransform(const T& a) : Node(a), dEdf_mem(nullptr) {} virtual bool supports_multibatch() const override { return true; } CNN_NODE_DEFINE_DEV_IMPL() + mutable float* dEdf_mem; }; // y = -x_1 From 8da2dfaa5f6d0d76b1b0fab554c62efc7e101d52 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 23 Jun 2016 14:29:02 +0900 Subject: [PATCH 563/965] Fixed mistake in allocate --- cnn/nodes.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 0246a249c..6695bb089 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -281,7 +281,7 @@ void AffineTransform::backward_dev_impl(const MyDevice & dev, // multiple batches, cache the sum Tensor dEdf_sum; if(dEdxi.d.bd == 1 && dEdf.d.bd != 1 && dEdf_mem == nullptr) { - dEdf_mem = (float*)device->mem->malloc(sizeof(float) * dEdf.d.batch_size()); + dEdf_mem = (float*)device->fxs->allocate(sizeof(float) * dEdf.d.batch_size()); Dim dEdf_dim = dEdf.d; dEdf_dim.bd = 1; dEdf_sum = Tensor(dEdf_dim, dEdf_mem, device); Eigen::array red_axis({2}); From 280a77e846f35af22e09a50376273ea00b4b3708 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 23 Jun 2016 17:22:39 +0900 Subject: [PATCH 564/965] Batched dot product --- cnn/nodes.cc | 28 ++++++++++++++++++++++++++-- cnn/nodes.h | 1 + tests/test-nodes.cc | 9 +++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 6695bb089..ed7837ffb 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -615,7 +615,17 @@ CNN_NODE_INST_DEV_IMPL(CwiseMultiply) template void DotProduct::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - fx.t<0>().device(*dev.edevice) = (xs[0]->tvec() * xs[1]->tvec()).sum(); + Eigen::array red_axis({0}); + Eigen::array bcast({1, (int)fx.d.bd}); + if(fx.d.bd == 1) { + fx.t<0>().device(*dev.edevice) = (xs[0]->t<1>() * xs[1]->t<1>()).sum(); + } else if(xs[0]->d.bd == xs[1]->d.bd) { + fx.tb<0>().device(*dev.edevice) = (xs[0]->tb<1>() * xs[1]->tb<1>()).sum(red_axis); + } else if(xs[0]->d.bd == 1) { + fx.tb<0>().device(*dev.edevice) = (xs[0]->tb<1>().broadcast(bcast) * xs[1]->tb<1>()).sum(red_axis); + } else { + fx.tb<0>().device(*dev.edevice) = (xs[0]->tb<1>() * xs[1]->tb<1>().broadcast(bcast)).sum(red_axis); + } } template @@ -625,7 +635,21 @@ void DotProduct::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - dEdxi.tvec().device(*dev.edevice) += xs[1 - i]->tvec() * as_scalar(dEdf); + if(fx.d.bd == 1) { + Eigen::array bcast({(int)xs[i]->d.rows()}); + dEdxi.t<1>().device(*dev.edevice) += xs[1-i]->t<1>() * dEdf.t<1>().broadcast(bcast); + } else { + Eigen::array bcast({(int)xs[i]->d.rows(), 1}); + if(xs[0]->d.bd == xs[1]->d.bd) { + dEdxi.tb<1>().device(*dev.edevice) += xs[1-i]->tb<1>() * dEdf.tb<1>().broadcast(bcast); + } else if(dEdxi.d.bd == 1) { + Eigen::array red_axis({1}); + dEdxi.t<1>().device(*dev.edevice) += (xs[1-i]->tb<1>() * dEdf.tb<1>().broadcast(bcast)).sum(red_axis); + } else { + Eigen::array batchcast({1, (int)fx.d.bd}); + dEdxi.tb<1>().device(*dev.edevice) += (xs[1-i]->tb<1>().broadcast(batchcast) * dEdf.tb<1>().broadcast(bcast)); + } + } } CNN_NODE_INST_DEV_IMPL(DotProduct) diff --git a/cnn/nodes.h b/cnn/nodes.h index df58c5be8..7e5a78b9e 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -103,6 +103,7 @@ struct ConstScalarMultiply : public Node { // y = x_1^T . x_2 struct DotProduct : public Node { explicit DotProduct(const std::initializer_list& a) : Node(a) {} + virtual bool supports_multibatch() const override { return true; } CNN_NODE_DEFINE_DEV_IMPL() }; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 50ba37181..70668a246 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -623,6 +623,15 @@ BOOST_AUTO_TEST_CASE( dot_product_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression dot_product(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( dot_product_batch_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = input(cg, Dim({3},2), batch_vals); + sum_batches(dot_product(x1, x2) + dot_product(x2, x1) * 2); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression squared_distance(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( squared_distance_gradient ) { cnn::ComputationGraph cg; From e1409bd7457ed33ffa5f96b0c9981eb620e01ad3 Mon Sep 17 00:00:00 2001 From: dhg Date: Thu, 23 Jun 2016 14:29:02 -0700 Subject: [PATCH 565/965] Initial version of PyCNN network visualizer Import pycnn_viz instead of pycnn and call PrintGraphviz(). Key features: * See parameter names * Optionally show the dimensions of each node * Distinguish explicitly-provided dimensions ({{}}) from inferred dimension labels ({}) * Dimensions are computed and checked, and any errors are highlighted in the graph * Verbose and compact modes * Optionally see names of lookups instead of indices (like seeing the actual word of a word embedding) * Collapse RNN states into single boxes * Optionally detect and collapse BiRNNs * Optionally assign labels to individual expressions --- pycnn/pycnn_viz.py | 1104 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1104 insertions(+) create mode 100644 pycnn/pycnn_viz.py diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py new file mode 100644 index 000000000..cc0ff3c63 --- /dev/null +++ b/pycnn/pycnn_viz.py @@ -0,0 +1,1104 @@ +import re +from collections import defaultdict + +graphviz_items = [] + +vindex_count = -1 +def new_index(): + global vindex_count + vindex_count += 1 + return vindex_count + +def init(random_seed=None): pass + +class SimpleConcreteDim(object): + def __init__(self, nrows, ncols, inferred): + self.nrows = nrows + self.ncols = ncols + self.inferred = inferred + def __getitem__(self, key): return [self.nrows, self.ncols][key] + def __iter__(self): return iter([self.nrows, self.ncols]) + def __str__(self): return 'Dim(%s,%s)' % (self.nrows, self.ncols) + def __eq__(self, other): return isinstance(other, SimpleConcreteDim) and self.nrows==other.nrows and self.ncols==other.ncols + def __ne__(self, other): return not self==other + def __hash__(self): return hash((self.nrows, self.ncols)) + def isvalid(self): return True + def invalid(self): return False + +class InvalidConcreteDim(object): + def __init__(self, a_dim=None, b_dim=None): + self.a_dim = a_dim + self.b_dim = b_dim + def __getitem__(self, key): return None + def __repr__(self): + if self.a_dim is None and self.b_dim is None: + return 'InvalidDim' + else: + return 'InvalidDim(%s, %s)' % (self.a_dim, self.b_dim) + def __str__(self): return repr(self) + def isvalid(self): return False + def invalid(self): return True + +InvalidDim = InvalidConcreteDim() + +def make_dim(a, b=None, inferred=False): + if isinstance(a, InvalidConcreteDim): + assert b is None + return a + elif isinstance(a, SimpleConcreteDim): + assert b is None + return SimpleConcreteDim(a.nrows, a.ncols, inferred) + elif isinstance(a, tuple): + assert b is None + (nrows, ncols) = a + return SimpleConcreteDim(nrows, ncols, inferred) + elif b is None: + assert isinstance(a, int) + return SimpleConcreteDim(a, 1, inferred) + else: + assert isinstance(a, int) + assert isinstance(b, int) + return SimpleConcreteDim(a, b, inferred) + + + +def ensure_freshness(a): + if a.cg_version != _cg.version(): raise ValueError("Attempt to use a stale expression.") + + +def copy_dim(a): + if a.dim.isvalid(): + return make_dim(a.dim, inferred=True) + else: + return InvalidDim +def ensure_same_dim(a,b): + if a.dim.invalid() or b.dim.invalid(): + return InvalidDim + elif a.dim==b.dim: + return copy_dim(a) + else: + return InvalidConcreteDim(a.dim,b.dim) +def ensure_mul_dim(a,b): + if a.dim.invalid() or b.dim.invalid(): + return InvalidDim + elif a.dim[1]==b.dim[0]: + return make_dim(a.dim[0], b.dim[1], inferred=True) + else: + return InvalidConcreteDim(a.dim,b.dim) +def ensure_all_same_dim(xs): + for x in xs: + if x.dim.invalid(): + return InvalidDim + dim0 = xs[0].dim + for x in xs[1:]: + if dim0 != x.dim: + return InvalidConcreteDim(dim0, x.dim) + return copy_dim(xs[0]) + + +def _add(a, b): return GVExpr('add', [a,b], ensure_same_dim(a,b)) +def _mul(a, b): return GVExpr('mul', [a,b], ensure_mul_dim(a,b)) +def _neg(a): return GVExpr('neg', [a], copy_dim(a)) +def _scalarsub(a, b): return GVExpr('scalarsub', [a,b], copy_dim(b)) +def _cadd(a, b): return GVExpr('cadd', [a,b], copy_dim(a)) +def _cmul(a, b): return GVExpr('cmul', [a,b], copy_dim(a)) +def _cdiv(a, b): return GVExpr('cdiv', [a,b], copy_dim(a)) + +class Expression(object): #{{{ + def __init__(self, name, args, dim): + self.name = name + self.args = args + self.dim = dim + self.vindex = new_index() + self.cg_version = cg().version() + + def cg(self): return cg() + def get_cg_version(self): return self.cg_version + def get_vindex(self): return self.vindex + + def __repr__(self): return str(self) + def __str__(self): return '%s([%s], %s, %s/%s)' % (self.name, ', '.join(map(str,self.args)), self.dim, self.vindex, self.cg_version) #"expression %s/%s" % (self.vindex, self.cg_version) + def __getitem__(self, i): return None + def __getslice__(self, i, j): return None + def scalar_value(self, recalculate=False): return 0.0 + def vec_value(self, recalculate=False): return [] + def npvalue(self, recalculate=False): return None + def value(self, recalculate=False): return None + def forward(self, recalculate=False): return None + def set(self, x): pass + + def backward(self): pass + + def __add__(self, other): + if isinstance(self, Expression) and isinstance(other, Expression): + return _add(self,other) + elif isinstance(self, (int,float)) or isinstance(other, (int,float)): + return _cadd(self, other) + else: raise NotImplementedError('self=%s, other=%s' % (self, other)) + def __mul__(self, other): + if isinstance(self, Expression) and isinstance(other, Expression): + return _mul(self,other) + elif isinstance(self, (int,float)) or isinstance(other, (int,float)): + return _cmul(self, other) + else: raise NotImplementedError('self=%s, other=%s' % (self, other)) + def __div__(self, other): + if isinstance(self, Expression) and isinstance(other, (int,float)): + return _cdiv(self, other) + else: raise NotImplementedError() + def __neg__(self): return _neg(self) + def __sub__(self, other): + if isinstance(self,Expression) and isinstance(other,Expression): + return self+(-other) + elif isinstance(self,(int,float)) and isinstance(other,Expression): + return _scalarsub(self, other) + elif isinstance(self,Expression) and isinstance(other,(int, float)): + return _neg(_scalarsub(other, self)) + else: raise NotImplementedError() + def init_row(self, i, row): pass + + +def GVExpr(name, args, dim): + e = Expression(name, args, dim) + graphviz_items.append(e) + return e + +# class Parameters(Expression): +# def __init__(self, name, args, dim): +# super(LookupParameters, self).__init__(name, args, dim) +# graphviz_items.append(self) +# def shape(self): +# if self.thisptr.dim.ndims() == 1: return (self.thisptr.dim.rows()) +# return (self.thisptr.dim.rows(), self.thisptr.dim.cols()) +# def as_array(self): return None +# def load_array(self, arr): pass +# +# class LookupParameters(Expression): +# def __init__(self, name, args, dim): +# super(LookupParameters, self).__init__(name, args, dim) +# graphviz_items.append(self) +# def init_from_array(self, arr): pass +# def shape(self): +# if self.thisptr.dim.cols() != 1: +# return (self.thisptr.values.size(), self.thisptr.dim.rows(), self.thisptr.dim.cols()) +# return (self.thisptr.values.size(), self.thisptr.dim.rows()) +# def __getitem__(self, i): return lookup(self, i) +# def batch(self, i): return lookup_batch(self, i) +# def init_row(self, i, row): pass +# def as_array(self): return None + + +class Model(object): + def __init__(self): + self.named_params = {} + self.lookups = [] + self.regular = [] + + def add_parameters(self, name, dim, scale=0): + assert(name not in self.named_params), "name already registered" + pp = Expression('parameters', [name, dim], make_dim(dim)) + self.named_params[name] = pp + self.regular.append(name) + return pp + + def add_lookup_parameters(self, name, dim): + assert(isinstance(dim, tuple)) + assert(name not in self.named_params), "name already registered" + pp = Expression('lookup_parameters', [name, dim], make_dim(dim[1])) + self.named_params[name] = pp + self.lookups.append(name) + return pp + + def __getitem__(self, name): return self.named_params[name] + def __contains__(self, name): return name in self.named_params + def save(self, fname): pass + def load(self, fname): pass + + +SECRET = 923148 +#_cg = ComputationGraph(SECRET) + +def cg_version(): return _cg._cg_version +def renew_cg(): return _cg.renew() + +def cg(): + global _cg + return _cg + +class ComputationGraph(object): + def __init__(self, guard=0): + if guard != SECRET: raise RuntimeError("Do not instantiate ComputationGraph directly. Use pycnn.cg()") + self._cg_version = 0 + + def renew(self): + vindex_count = -1 + del graphviz_items[:] + return self + + def version(self): return self._cg_version + + def parameters(self, params): + graphviz_items.append(params) + return params + + def forward_scalar(self): return 0.0 + def inc_forward_scalar(self): return 0.0 + def forward_vec(self): return [] + def inc_forward_vec(self): return [] + def forward(self): return None + def inc_forward(self): return None + def backward(self): return None +_cg = ComputationGraph(SECRET) +# }}} + + + +def parameter(p): + graphviz_items.append(p) + return p + +def scalarInput(s): return GVExpr('scalarInput', [s], make_dim(1, inferred=True)) +def vecInput(dim): return GVExpr('vecInput', [dim], make_dim(dim)) +def inputVector(v): return GVExpr('inputVector', [v], make_dim(len(v), inferred=True)) +def matInput(d1, d2): return GVExpr('matInput', [d1, d2], make_dim(d1, d2)) +def inputMatrix(v, d): return GVExpr('inputMatrix', [v, d], make_dim(d, inferred=True)) +def lookup(p, index=0, update=True): return GVExpr('lookup', [p, index, update], p.dim) +def lookup_batch(p, indices, update=True): return GVExpr('lookup_batch', [p, indices, update], p.dim) +def pick(a, index=0): return GVExpr('pick', [a, index], copy_dim(a)) +def pick_batch(a, indices): return GVExpr('pick_batch', [a, indices], copy_dim(a)) +def hinge(x, index, m=1.0): return GVExpr('hinge', [x, index, m], copy_dim(x)) + +def nobackprop(x): return GVExpr('nobackprop', [x], copy_dim(x)) + +# binary-exp +def cdiv(x, y): return GVExpr('cdiv', [x,y], ensure_same_dim(x,y)) +def colwise_add(x, y): + if x.dim.invalid() or y.dim.invalid(): + d = InvalidDim + elif x.dim[0] == y.dim[0] and y.dim[1] == 1: + d = copy_dim(x) + else: + d = InvalidConcreteDim(x.dim, y.dim) + return GVExpr('colwise_add', [x,y], d) + +def trace_of_product(x, y): return GVExpr('trace_of_product', [x,y], ensure_same_dim(x,y)) +def cwise_multiply(x, y): return GVExpr('cwise_multiply', [x,y], ensure_same_dim(x,y)) +def dot_product(x, y): return GVExpr('dot_product', [x,y], ensure_same_dim(x,y)) +def squared_distance(x, y): return GVExpr('squared_distance', [x,y], ensure_same_dim(x,y)) +def l1_distance(x, y): return GVExpr('l1_distance', [x,y], ensure_same_dim(x,y)) +def binary_log_loss(x, y): return GVExpr('binary_log_loss', [x,y], ensure_same_dim(x,y)) +def conv1d_narrow(x, y): + if x.dim.invalid() or y.dim.invalid(): + d = InvalidDim + elif x.dim[0] != y.dim[0]: + d = InvalidConcreteDim(x.dim, y.dim) + else: + d = make_dim(x.dim[0], x.dim[1] - y.dim[1] + 1) + return GVExpr('conv1d_narrow', [x,y], d) +def conv1d_wide(x, y): + if x.dim.invalid() or y.dim.invalid(): + d = InvalidDim + elif x.dim[0] != y.dim[0]: + d = InvalidConcreteDim(x.dim, y.dim) + else: + d = make_dim(x.dim[0], x.dim[1] + y.dim[1] - 1) + return GVExpr('conv1d_wide', [x,y], d) + +# unary-exp +def tanh(x): return GVExpr('tanh', [x], copy_dim(x)) +def exp(x): return GVExpr('exp', [x], copy_dim(x)) +def square(x): return GVExpr('square', [x], copy_dim(x)) +def cube(x): return GVExpr('cube', [x], copy_dim(x)) +def log(x): return GVExpr('log', [x], copy_dim(x)) +def logistic(x): return GVExpr('logistic', [x], copy_dim(x)) +def rectify(x): return GVExpr('rectify', [x], copy_dim(x)) +def log_softmax(x, restrict=None): return GVExpr('log_softmax', [x,restrict], copy_dim(x)) +def softmax(x): return GVExpr('softmax', [x], copy_dim(x)) +def softsign(x): return GVExpr('softsign', [x], copy_dim(x)) +def bmin(x, y): return GVExpr('bmin', [x,y], ensure_same_dim(x,y)) +def bmax(x, y): return GVExpr('bmax', [x,y], ensure_same_dim(x,y)) +def transpose(x): return GVExpr('transpose', [x], x.dim[::-1] if x.dim.isvalid() else InvalidDim) +def sum_cols(x): return GVExpr('sum_cols', [x], make_dim(x.dim[0],1) if x.dim.isvalid() else InvalidDim) + +def sum_batches(x): return GVExpr('sum_batches', [x], copy_dim(x)) + +#expr-opt +def fold_rows(x, nrows=2): + if x.dim.invalid(): + d = InvalidDim + elif x.dim[0] != nrows: + d = InvalidConcreteDim(x.dim, nrows) + else: + d = make_dim(1, x.dim[1]) + return GVExpr('fold_rows', [x,nrows], d) +def pairwise_rank_loss(x, y, m=1.0): return GVExpr('pairwise_rank_loss', [x,y,m], ensure_same_dim(x,y)) +def poisson_loss(x, y): return GVExpr('poisson_loss', [x,y], copy_dim(x)) +def huber_distance(x, y, c=1.345): return GVExpr('huber_distance', [x,y,c], ensure_same_dim(x,y)) +#expr-unsigned +def kmax_pooling(x, k): return GVExpr('kmax_pooling', [x,k], make_dim(x.dim[0], k) if x.dim.isvalid() else InvalidDim) +def pickneglogsoftmax(x, v): return GVExpr('pickneglogsoftmax', [x,v], copy_dim(x)) +def pickneglogsoftmax_batch(x, vs): return GVExpr('pickneglogsoftmax_batch', [x,vs], make_dim(len(vs))) + +def kmh_ngram(x, n): return GVExpr('kmh_ngram', [x,n], make_dim(x.dim[0], x.dim[1]-n+1) if x.dim.isvalid() else InvalidDim) +def pickrange(x, v, u): return GVExpr('pickrange', [x,v,u], make_dim(u-v, x.dim[1]) if x.dim.isvalid() else InvalidDim) +#expr-float +def noise(x, stddev): return GVExpr('noise', [x,stddev], copy_dim(x)) +def dropout(x, p): return GVExpr('dropout', [x,p], copy_dim(x)) +def block_dropout(x, p): return GVExpr('block_dropout', [x,p], copy_dim(x)) +#expr-dim +def reshape(x, d): return GVExpr('reshape', [x,d], make_dim(d)) +def esum(xs): return GVExpr('esum', xs, ensure_all_same_dim(xs)) +def average(xs): return GVExpr('average', xs, ensure_all_same_dim(xs)) +def emax(xs): return GVExpr('emax', xs, ensure_all_same_dim(xs)) +def concatenate_cols(xs): + if any(x.dim.invalid() for x in xs): + dim = InvalidDim + else: + nrows = xs[0].dim[0] + ncols = xs[0].dim[1] + for x in xs: + ncols += x.dim[1] + nrows = nrows if nrows == x.dim[0] else -1 + dim = make_dim(nrows, ncols) if nrows >= 0 else InvalidDim + return GVExpr('concatenate_cols', xs, dim) +def concatenate(xs): + if any(x.dim.invalid() for x in xs): + dim = InvalidDim + else: + nrows = xs[0].dim[0] + ncols = xs[0].dim[1] + for x in xs[1:]: + nrows += x.dim[0] + ncols = ncols if ncols == x.dim[1] else -1 + dim = make_dim(nrows, ncols) if ncols >= 0 else InvalidDim + return GVExpr('concatenate', xs, dim) + +def affine_transform(xs): + if any(x.dim.invalid() for x in xs): + dim = InvalidDim + elif all(ensure_mul_dim(a,b)==xs[0].dim for a,b in zip(xs[1::2],xs[2::2])): + dim = xs[0].dim + else: + dim = InvalidDim + return GVExpr('affine_transform', xs, dim) + + + + + + + + + + +builder_num = -1 +def new_builder_num(): + global builder_num + builder_num += 1 + return builder_num + +class RNNBuilder(object): + def __init__(self, layers, input_dim, hidden_dim, model): + raise RuntimeError("Cannot instantiate RNNBuilder directly.") + + def new_graph(self): + self.cg_version = _cg.version() + self.builder_version = new_builder_num() + + def start_new_sequence(self, es=None): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + + def add_input(self, e): + ensure_freshness(e) + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + return Expression.from_cexpr(self.cg_version, self.thisptr.add_input(e.c())) + + def add_input_to_prev(self, prev, e): + ensure_freshness(e) + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + return Expression.from_cexpr(self.cg_version, self.thisptr.add_input(prev, e.c())) + + def rewind_one_step(self): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + self.thisptr.rewind_one_step() + + def back(self): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + return Expression.from_cexpr(self.cg_version, self.thisptr.back()) + + def final_h(self): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + res = [] + #def CExpression cexp + cexps = self.thisptr.final_h() + for cexp in cexps: + res.append(Expression.from_cexpr(self.cg_version, cexp)) + return res + + def final_s(self): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + res = [] + #def CExpression cexp + cexps = self.thisptr.final_s() + for cexp in cexps: + res.append(Expression.from_cexpr(self.cg_version, cexp)) + return res + + def get_h(self, i): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + res = [] + #def CExpression cexp + cexps = self.thisptr.get_h(i) + for cexp in cexps: + res.append(Expression.from_cexpr(self.cg_version, cexp)) + return res + + def get_s(self, i): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + res = [] + #def CExpression cexp + cexps = self.thisptr.get_s(i) + for cexp in cexps: + res.append(Expression.from_cexpr(self.cg_version, cexp)) + return res + + def initial_state(self,vecs=None): + if self._init_state is None or self.cg_version != _cg.version(): + self.new_graph() + if vecs is not None: + self.start_new_sequence(vecs) + else: + self.start_new_sequence() + self._init_state = RNNState(self, -1) + return self._init_state + + def initial_state_from_raw_vectors(self,vecs=None): + if self._init_state is None or self.cg_version != _cg.version(): + self.new_graph() + if vecs is not None: + es = [] + for v in vecs: + e = vecInput(len(v)) + e.set(v) + es.append(e) + self.start_new_sequence(es) + else: + self.start_new_sequence() + self._init_state = RNNState(self, -1) + return self._init_state + +class SimpleRNNBuilder(RNNBuilder): + def __init__(self, layers, input_dim, hidden_dim, model): + self.cg_version = -1 + self.layers = layers + self.input_dim = input_dim + self.hidden_dim = hidden_dim + self.model = model + self._init_state = None + self.builder_version = new_builder_num() + def whoami(self): return "SimpleRNNBuilder" +class LSTMBuilder(RNNBuilder): + def __init__(self, layers, input_dim, hidden_dim, model): + self.cg_version = -1 + self.layers = layers + self.input_dim = input_dim + self.hidden_dim = hidden_dim + self.model = model + self._init_state = None + self.builder_version = new_builder_num() + def whoami(self): return "LSTMBuilder" +class FastLSTMBuilder(RNNBuilder): + def __init__(self, layers, input_dim, hidden_dim, model): + self.cg_version = -1 + self.layers = layers + self.input_dim = input_dim + self.hidden_dim = hidden_dim + self.model = model + self._init_state = None + self.builder_version = new_builder_num() + def whoami(self): return "FastLSTMBuilder" + +class BiRNNBuilder(object): + """ + Builder for BiRNNs that delegates to regular RNNs and wires them together. + + builder = BiRNNBuilder(1, 128, 100, model, LSTMBuilder) + [o1,o2,o3] = builder.transduce([i1,i2,i3]) + """ + def __init__(self, num_layers, input_dim, hidden_dim, model, rnn_builder_factory): + """ + @param num_layers: depth of the BiRNN + @param input_dim: size of the inputs + @param hidden_dim: size of the outputs (and intermediate layer representations) + @param model + @param rnn_builder_factory: RNNBuilder subclass, e.g. LSTMBuilder + """ + assert num_layers > 0 + assert hidden_dim % 2 == 0 + self.builder_layers = [] + f = rnn_builder_factory(1, input_dim, hidden_dim/2, model) + b = rnn_builder_factory(1, input_dim, hidden_dim/2, model) + self.builder_layers.append((f,b)) + for _ in xrange(num_layers-1): + f = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) + b = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) + self.builder_layers.append((f,b)) + + def whoami(self): return "BiRNNBuilder" + + def add_inputs(self, es): + """ + returns the list of state pairs (stateF, stateB) obtained by adding + inputs to both forward (stateF) and backward (stateB) RNNs. + + @param es: a list of Expression + + see also transduce(xs) + + .transduce(xs) is different from .add_inputs(xs) in the following way: + + .add_inputs(xs) returns a list of RNNState pairs. RNNState objects can be + queried in various ways. In particular, they allow access to the previous + state, as well as to the state-vectors (h() and s() ) + + .transduce(xs) returns a list of Expression. These are just the output + expressions. For many cases, this suffices. + transduce is much more memory efficient than add_inputs. + """ + for e in es: + ensure_freshness(e) + for (fb,bb) in self.builder_layers[:-1]: + fs = fb.initial_state().transduce(es) + bs = bb.initial_state().transduce(reversed(es)) + es = [concatenate([f,b]) for f,b in zip(fs, reversed(bs))] + (fb,bb) = self.builder_layers[-1] + fs = fb.initial_state().add_inputs(es) + bs = bb.initial_state().add_inputs(reversed(es)) + return [(f,b) for f,b in zip(fs, reversed(bs))] + + def transduce(self, es): + """ + returns the list of output Expressions obtained by adding the given inputs + to the current state, one by one, to both the forward and backward RNNs, + and concatenating. + + @param es: a list of Expression + + see also add_inputs(xs) + + .transduce(xs) is different from .add_inputs(xs) in the following way: + + .add_inputs(xs) returns a list of RNNState pairs. RNNState objects can be + queried in various ways. In particular, they allow access to the previous + state, as well as to the state-vectors (h() and s() ) + + .transduce(xs) returns a list of Expression. These are just the output + expressions. For many cases, this suffices. + transduce is much more memory efficient than add_inputs. + """ + for e in es: + ensure_freshness(e) + for (fb,bb) in self.builder_layers: + fs = fb.initial_state().transduce(es) + bs = bb.initial_state().transduce(reversed(es)) + es = [concatenate([f,b]) for f,b in zip(fs, reversed(bs))] + return es + +class RNNState(object): # {{{ + def __init__(self, builder, state_idx=-1, prev_state=None, out=None): + self.builder = builder + self.state_idx=state_idx + self._prev = prev_state + self._out = out + + def add_input(self, x): # x: Expression + input_dim = make_dim(self.builder.input_dim) + input_dim = x.dim if x.dim==input_dim else InvalidConcreteDim(x.dim, input_dim) + rnn_type = self.builder.whoami() + if rnn_type.endswith("Builder"): rnn_type = rnn_type[:-len("Builder")] + output_e = GVExpr('RNNState', [x, input_dim, rnn_type, self.builder.builder_version, self.state_idx+1], dim=make_dim(self.builder.hidden_dim)) + new_state = RNNState(self.builder, self.state_idx+1, self, output_e) + return new_state + + def add_inputs(self, xs): + if self._prev is None: + self.builder.builder_version = new_builder_num() + states = [] + cur = self + for x in xs: + cur = cur.add_input(x) + states.append(cur) + return states + + def transduce(self, xs): + return [x.output() for x in self.add_inputs(xs)] + + def output(self): return self._out + +# def h(self): +# """ +# tuple of expressions representing the output of each hidden layer +# of the current step. +# the actual output of the network is at h()[-1]. +# """ +# return tuple(self.builder.get_h(CRNNPointer(self.state_idx))) +# +# def s(self): +# """ +# tuple of expressions representing the hidden state of the current +# step. +# +# For SimpleRNN, s() is the same as h() +# For LSTM, s() is a series of of memory vectors, followed the series +# followed by the series returned by h(). +# """ +# return tuple(self.builder.get_s(CRNNPointer(self.state_idx))) + + def prev(self): return self._prev + def b(self): return self.builder + def get_state_idx(self): return self.state_idx + +# StackedRNNState TODO: do at least minimal testing for this #{{{ +class StackedRNNState(object): + #def list states + #def StackedRNNState prev + def __init__(self, states, prev=None): + self.states = states + self.prev = prev + + def add_input(self, x): + #def next_states + next_states = [] + for s in self.states: + next_states.append(s.add_input(x)) + x = next_states[-1].output() + return StackedRNNState(next_states, self) + + def output(self): return self.states[-1].output() + + def prev(self): return self.prev + def h(self): return [s.h() for s in self.states] + def s(self): return [s.s() for s in self.states] + + def add_inputs(self, xs): + """ + returns the list of states obtained by adding the given inputs + to the current state, one by one. + """ + states = [] + cur = self + for x in xs: + cur = cur.add_input(x) + states.append(cur) + return states + + +class Trainer(object): + def update(self, s=1.0): pass + def update_epoch(self, r = 1.0): pass + def status(self): pass +class SimpleSGDTrainer(Trainer): + def __init__(self, m, lam = 1e-6, e0 = 0.1): pass +class MomentumSGDTrainer(Trainer): + def __init__(self, m, lam = 1e-6, e0 = 0.01, mom = 0.9): pass +class AdagradTrainer(Trainer): + def __init__(self, m, lam = 1e-6, e0 = 0.1, eps = 1e-20): pass +class AdadeltaTrainer(Trainer): + def __init__(self, m, lam = 1e-6, eps = 1e-6, rho = 0.95): pass +class AdamTrainer(Trainer): + def __init__(self, m, lam = 1e-6, alpha = 0.001, beta_1 = 0.9, beta_2 = 0.999, eps = 1e-8 ): pass + + + + + + + + + + + + + + + + + +def shape_str(e_dim): + if e_dim.invalid(): + #return '{??}' + return str(e_dim) + elif e_dim.inferred: + if e_dim[1] == 1: + return '{%s}' % (e_dim[0]) + else: + return '{%s,%s}' % (e_dim[0],e_dim[1]) + else: + if e_dim[1] == 1: + return '{{%s}}' % (e_dim[0]) + else: + return '{{%s,%s}}' % (e_dim[0],e_dim[1]) + +class GVNode(object): + def __init__(self, name, input_dim, label, output_dim, children, features, node_type): + self.name = name + self.input_dim = input_dim + self.label = label + self.output_dim = output_dim + self.children = children + self.features = features + self.node_type = node_type + def __iter__(self): return iter([self.name, self.input_dim, self.label, self.output_dim, self.children, self.features, self.node_type]) + def __repr__(self): return 'GVNode(%s)' % ', '.join(map(str, self)) + def __str__(self): return repr(self) + +def make_network_graph(compact, lookup_names_lookups, expression_names_lookups): + """ + Make a network graph, represented as of nodes and a set of edges. + The nodes are represented as tuples: (name: string, input_dim: Dim, label: string, output_dim: Dim, children: set[name], features: string) +# The edges are represented as dict of children to sets of parents: (child: string) -> [(parent: string, features: string)] + """ + nodes = set() +# edges = defaultdict(set) # parent -> (child, extra) + + var_name_dict = dict() # parameters get named + rnn_bldr_name = defaultdict(lambda: chr(len(rnn_bldr_name)+ord('A'))) + def vidx2str(vidx): return '%s%s' % ('N', vidx) + + for e in graphviz_items: # e: Expression + vidx = e.vindex + f_name = e.name + args = e.args + output_dim = e.dim + input_dim = None # basically just RNNStates use this since everything else has input_dim==output_dim + children = set() + node_type = '2_regular' + + if f_name == 'vecInput': + [_dim] = args + arg_strs = [] + elif f_name == 'inputVector': + [_v] = args + arg_strs = [] + elif f_name == 'matInput': + [_d1, _d2] = args + arg_strs = [] + elif f_name == 'inputMatrix': + [_v, _d] = args + arg_strs = [] + elif f_name == 'parameters': + [name, _dim] = args + var_name_dict[vidx] = name + arg_strs = [] + if compact: + f_name = var_name_dict[vidx] + node_type = '1_param' + elif f_name == 'lookup_parameters': + [name, _dim] = args + var_name_dict[vidx] = name + arg_strs = [] + if compact: + f_name = var_name_dict[vidx] + node_type = '1_param' + elif f_name == 'lookup': + [p, idx, update] = args + [name, _dim] = p.args + item_name = ('\\"%s\\"' % (lookup_names_lookups[name][idx],)) if (lookup_names_lookups and (name in lookup_names_lookups)) else None + if compact: + f_name = item_name if item_name is not None else ('%s[%s]' % (name, idx)) + arg_strs = [] + else: + arg_strs = [var_name_dict.get(p.vindex, 'v%d' % (p.vindex))] + if item_name is not None: + arg_strs.append(item_name) + vocab_size = _dim[0] + arg_strs.extend(['%s' % (vocab_size), 'update' if update else 'fixed']) + #children.add(vidx2str(p.vindex)) + #node_type = '1_param' + elif f_name == 'RNNState': + [arg, input_dim, bldr_type, bldr_num, state_idx] = args # arg==input_e + rnn_name = rnn_bldr_name[bldr_num] + if bldr_type.endswith('Builder'): + bldr_type[:-len('Builder')] + f_name = '%s-%s-%s' % (bldr_type, rnn_name, state_idx) + if not compact: + i = arg.vindex + s = var_name_dict.get(i, 'v%d' % (i)) + arg_strs = [s] + else: + arg_strs = [] + children.add(vidx2str(arg.vindex)) + node_type = '3_rnn_state' + else: + arg_strs = [] + for arg in args: + if isinstance(arg, Expression): + if not compact: + i = arg.vindex + s = var_name_dict.get(i, 'v%d' % (i)) + arg_strs.append(s) + children.add(vidx2str(arg.vindex)) + elif isinstance(arg, float) and compact: + s = re.sub('0+$', '', '%.3f' % (arg)) + if s == '0.': + s = str(arg) + arg_strs.append(s) + else: + arg_strs.append(str(arg)) + +# f_name = { , +# }.get(f_name, f_name) + + if compact: + f_name = { 'add': '+', + 'sub': '-', + 'mul': '*', + 'div': '/', + 'cadd': '+', + 'cmul': '*', + 'cdiv': '/', + 'scalarsub': '-', + 'concatenate': 'cat', + 'esum': 'sum', + 'emax': 'max', + 'emin': 'min', + }.get(f_name, f_name) + if arg_strs: + str_repr = '%s(%s)' % (f_name, ', '.join(arg_strs)) + else: + str_repr = f_name + elif f_name == 'add': + [a,b] = arg_strs + str_repr = '%s + %s' % (a,b) + elif f_name == 'sub': + [a,b] = arg_strs + str_repr = '%s - %s' % (a,b) + elif f_name == 'mul': + [a,b] = arg_strs + str_repr = '%s * %s' % (a,b) + elif f_name == 'div': + [a,b] = arg_strs + str_repr = '%s / %s' % (a,b) + elif f_name == 'neg': + [a,] = arg_strs + str_repr = '-%s' % (a) + elif f_name == 'affine_transform': + str_repr = arg_strs[0] + for i in xrange(1, len(arg_strs), 2): + str_repr += ' + %s*%s' % tuple(arg_strs[i:i+2]) + else: + if arg_strs is not None: + str_repr = '%s(%s)' % (f_name, ', '.join(arg_strs)) + else: + str_repr = f_name + + name = vidx2str(vidx) + var_name = '%s' % (var_name_dict.get(vidx, 'v%d' % (vidx))) if not compact else '' +# if show_dims: +# str_repr = '%s\\n%s' % (shape_str(e.dim), str_repr) + if expression_names_lookups and (e in expression_names_lookups): + str_repr = '%s\\n%s' % (str_repr, expression_names_lookups[e]) + label = str_repr + if not compact: + label = '%s = %s' % (var_name, label) + features = '' +# if output_dim.invalid(): +# features += " [color=red,style=filled,fillcolor=red]" +# node_def_lines.append(' %s [label="%s%s"] %s;' % (vidx2str(vidx), label_prefix, str_repr, '')) + nodes.add(GVNode(name, input_dim, label, output_dim, frozenset(children), features, node_type)) + + return nodes + +def parents_of(n, nodes): + ps = [] + for n in nodes: + for c in n.children: + if n in c.children: + ps.append + return ps + +def collapse_birnn_states(nodes, compact): + node_info = {n.name:n for n in nodes} + new_nodes = [] + children_forwards = dict() # if `n.children` is pointing to K, return V instead + rnn_state_nodes = [] + rnn_parents = defaultdict(set) # rnn_state_node -> [parent_expression] + rnn_children = {} # rnn_state_node -> [child_expression] + shared_rnn_states = defaultdict(set) # (input name, output name) -> [(rnn state name)] + rnn_groups = dict() # these nodes (keys) are being replaced by the new group nodes (values) + nodes_to_delete = set() + for n in nodes: + for c in n.children: + if node_info[c].node_type == '3_rnn_state': + rnn_parents[node_info[c].name].add(n.name) + if n.node_type == '3_rnn_state': + rnn_state_nodes.append(n) + rnn_children[n.name] = set(node_info[c].name for c in n.children) + for n in rnn_state_nodes: + in_e, = rnn_children[n.name] + out_e, = rnn_parents[n.name] + shared_rnn_states[(in_e, out_e)].add(n) + for ((in_e, out_e), ns) in shared_rnn_states.iteritems(): + input_dims = set(n.input_dim for n in ns) + output_dims = set(n.output_dim for n in ns) + if len(ns) > 1 and len(input_dims)==1 and len(output_dims)==1: + input_dim, = input_dims + output_dim, = output_dims + new_rnn_group_state_name = ''.join(n.name for n in sorted(ns)) + new_rnn_group_state_label = '\\n'.join(n.label for n in sorted(ns)) + if not compact: + new_rnn_group_state_label = '%s\\n%s' % (node_info[out_e].label, new_rnn_group_state_label) + cat_output_dim = make_dim(output_dim[0]*2, output_dim[1]) + new_rnn_group_state = GVNode(new_rnn_group_state_name, input_dim, new_rnn_group_state_label, cat_output_dim, frozenset([in_e]), '', '3_rnn_state') + for n in ns: + rnn_groups[n.name] = new_rnn_group_state.name +# children_forwards[n.name] = new_rnn_group_state.name + nodes_to_delete.add(n.name) + children_forwards[out_e] = new_rnn_group_state.name + nodes.add(new_rnn_group_state) + nodes_to_delete.add(out_e) + # TODO: WHEN WE DELETE A CAT NODE, MAKE SURE WE FORWARD TO THE **NEW GROPU STATE NODE** + for (name, input_dim, label, output_dim, children, features, node_type) in nodes: + if name not in nodes_to_delete: + new_children = [] + for c in children: + while c in children_forwards: + c = children_forwards[c] + new_children.append(c) + new_nodes.append(GVNode(name, input_dim, label, output_dim, new_children, features, node_type)) + return (new_nodes, rnn_groups) + +def PrintGraphviz(compact=False, show_dims=True, lookup_names_lookups=None, expression_names_lookups=None, collapse_birnns=False): + original_nodes = make_network_graph(compact, lookup_names_lookups, expression_names_lookups) + nodes = original_nodes + collapse_to = dict() + if collapse_birnns: + (nodes, birnn_collapse_to) = collapse_birnn_states(nodes, compact) + collapse_to.update(birnn_collapse_to) + + print 'digraph G {' + print ' rankdir=BT;' + if not compact: print ' nodesep=.05;' + + node_types = defaultdict(set) + for n in nodes: + node_types[n.node_type].add(n.name) + for node_type in sorted(node_types): + style = { + '1_param': '[shape=ellipse]', + '2_regular': '[shape=rect]', + '3_rnn_state': '[shape=rect, peripheries=2]', + }[node_type] + print ' node %s; ' % (style), ' '.join(node_types[node_type]) + +# all_nodes = set(line.strip().split()[0] for line in node_def_lines) + for n in nodes: + label = n.label + if show_dims: + label = '%s\\n%s' % (shape_str(n.output_dim), n.label) + if n.input_dim is not None: + label = '%s\\n%s' % (label, shape_str(n.input_dim)) + if n.output_dim.invalid() or (n.input_dim is not None and n.input_dim.invalid()): + n.features += " [color=red,style=filled,fillcolor=red]" + print ' %s [label="%s"] %s;' % (n.name, label, n.features) + for c in n.children: + print ' %s -> %s;' % (c, n.name) + + rnn_states = [] # (name, rnn_name, state_idx) + rnn_state_re = re.compile("[^-]+-(.)-(\\d+)") + for n in original_nodes: + if n.node_type == '3_rnn_state': + m = rnn_state_re.search(n.label) + assert m is not None, 'rnn_state_re.search(%s); %s' % (n.label, n) + (rnn_name, state_idx) = m.groups() + rnn_states.append((rnn_name, int(state_idx), n.name)) + rnn_states = sorted(rnn_states) + edges = set() + for ((rnn_name_p, state_idx_p, name_p), (rnn_name_n, state_idx_n, name_n)) in zip(rnn_states,rnn_states[1:]): + if rnn_name_p == rnn_name_n: + if state_idx_p+1 == state_idx_n: + group_name_p = collapse_to.get(name_p, name_p) + group_name_n = collapse_to.get(name_n, name_n) + edges.add((group_name_p, group_name_n)) + for (name_p, name_n) in edges: + print ' %s -> %s [style=dotted];' % (name_p, name_n) # ,dir=both + + print '}' + + + + + + + + + + + +class BiRNNBuilder(object): + def __init__(self, num_layers, input_dim, hidden_dim, model, rnn_builder_factory): + assert num_layers > 0 + assert hidden_dim % 2 == 0 + self.builder_layers = [] + f = rnn_builder_factory(1, input_dim, hidden_dim/2, model) + b = rnn_builder_factory(1, input_dim, hidden_dim/2, model) + self.builder_layers.append((f,b)) + for _ in xrange(num_layers-1): + f = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) + b = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) + self.builder_layers.append((f,b)) + + def whoami(self): return "BiRNNBuilder" + + def add_inputs(self, es): + """ + returns the list of state pairs (stateF, stateB) obtained by adding + inputs to both forward (stateF) and backward (stateB) RNNs. + + see also transduce(xs) + + .transduce(xs) is different from .add_inputs(xs) in the following way: + + .add_inputs(xs) returns a list of RNNState pairs. RNNState objects can be + queried in various ways. In particular, they allow access to the previous + state, as well as to the state-vectors (h() and s() ) + + .transduce(xs) returns a list of Expression. These are just the output + expressions. For many cases, this suffices. + transduce is much more memory efficient than add_inputs. + """ + for e in es: + ensure_freshness(e) + for (fb,bb) in self.builder_layers[:-1]: + fs = fb.initial_state().transduce(es) + bs = bb.initial_state().transduce(reversed(es)) + es = [concatenate([f,b]) for f,b in zip(fs, reversed(bs))] + (fb,bb) = self.builder_layers[-1] + fs = fb.initial_state().add_inputs(es) + bs = bb.initial_state().add_inputs(reversed(es)) + return [(f,b) for f,b in zip(fs, reversed(bs))] + + def transduce(self, es): + """ + returns the list of output Expressions obtained by adding the given inputs + to the current state, one by one, to both the forward and backward RNNs, + and concatenating. + + see also add_inputs(xs) + + .transduce(xs) is different from .add_inputs(xs) in the following way: + + .add_inputs(xs) returns a list of RNNState pairs. RNNState objects can be + queried in various ways. In particular, they allow access to the previous + state, as well as to the state-vectors (h() and s() ) + + .transduce(xs) returns a list of Expression. These are just the output + expressions. For many cases, this suffices. + transduce is much more memory efficient than add_inputs. + """ + for e in es: + ensure_freshness(e) + for (fb,bb) in self.builder_layers: + fs = fb.initial_state().transduce(es) + bs = bb.initial_state().transduce(reversed(es)) + es = [concatenate([f,b]) for f,b in zip(fs, reversed(bs))] + return es From 8298d5e859a5b55dc71c39c5b2d750c0826f5e18 Mon Sep 17 00:00:00 2001 From: dhg Date: Fri, 24 Jun 2016 08:11:58 -0700 Subject: [PATCH 566/965] pycnn_viz: fixed dim of pick nodes --- pycnn/pycnn_viz.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py index cc0ff3c63..b54049e2e 100644 --- a/pycnn/pycnn_viz.py +++ b/pycnn/pycnn_viz.py @@ -263,8 +263,8 @@ def matInput(d1, d2): return GVExpr('matInput', [d1, d2], make_dim(d1, d2)) def inputMatrix(v, d): return GVExpr('inputMatrix', [v, d], make_dim(d, inferred=True)) def lookup(p, index=0, update=True): return GVExpr('lookup', [p, index, update], p.dim) def lookup_batch(p, indices, update=True): return GVExpr('lookup_batch', [p, indices, update], p.dim) -def pick(a, index=0): return GVExpr('pick', [a, index], copy_dim(a)) -def pick_batch(a, indices): return GVExpr('pick_batch', [a, indices], copy_dim(a)) +def pick(a, index=0): return GVExpr('pick', [a, index], make_dim(1, inferred=True)) +def pick_batch(a, indices): return GVExpr('pick_batch', [a, indices], make_dim(len(indices), inferred=True)) def hinge(x, index, m=1.0): return GVExpr('hinge', [x, index, m], copy_dim(x)) def nobackprop(x): return GVExpr('nobackprop', [x], copy_dim(x)) @@ -335,8 +335,8 @@ def poisson_loss(x, y): return GVExpr('poisson_loss', [x,y], copy_dim(x)) def huber_distance(x, y, c=1.345): return GVExpr('huber_distance', [x,y,c], ensure_same_dim(x,y)) #expr-unsigned def kmax_pooling(x, k): return GVExpr('kmax_pooling', [x,k], make_dim(x.dim[0], k) if x.dim.isvalid() else InvalidDim) -def pickneglogsoftmax(x, v): return GVExpr('pickneglogsoftmax', [x,v], copy_dim(x)) -def pickneglogsoftmax_batch(x, vs): return GVExpr('pickneglogsoftmax_batch', [x,vs], make_dim(len(vs))) +def pickneglogsoftmax(x, v): return GVExpr('pickneglogsoftmax', [x,v], make_dim(1, inferred=True)) +def pickneglogsoftmax_batch(x, vs): return GVExpr('pickneglogsoftmax_batch', [x,vs], make_dim(len(vs), inferred=True)) def kmh_ngram(x, n): return GVExpr('kmh_ngram', [x,n], make_dim(x.dim[0], x.dim[1]-n+1) if x.dim.isvalid() else InvalidDim) def pickrange(x, v, u): return GVExpr('pickrange', [x,v,u], make_dim(u-v, x.dim[1]) if x.dim.isvalid() else InvalidDim) From 80a4497dd30233d114603428048261db5f607cff Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 27 Jun 2016 11:22:27 +0900 Subject: [PATCH 567/965] Added ability to zero parameters --- cnn/model.cc | 19 +++++++++++++++++++ cnn/model.h | 9 +++++++++ 2 files changed, 28 insertions(+) diff --git a/cnn/model.cc b/cnn/model.cc index d635c8398..210eb06a0 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -45,6 +45,11 @@ void ParameterStorage::scale_parameters(float a) { values.vec() *= a; } +void ParameterStorage::zero() { + TensorTools::Zero(values); + clear(); +} + void ParameterStorage::squared_l2norm(float* sqnorm) const { #if HAVE_CUDA gpu::l2_norm_reducer(values.d.size(), values.v, sqnorm, true, false); @@ -99,6 +104,12 @@ void LookupParameterStorage::scale_parameters(float a) { (*p) *= a; } +void LookupParameterStorage::zero() { + for (auto& p : values) + TensorTools::Zero(p); + clear(); +} + void LookupParameterStorage::Initialize(unsigned index, const vector& val) { assert(int(val.size()) == int(dim.size())); #if HAVE_CUDA @@ -175,6 +186,10 @@ ParameterStorage* Parameter::get() const { return mp->parameters_list()[index]; } +void Parameter::zero() { + return mp->parameters_list()[index]->zero(); +} + LookupParameter::LookupParameter() { mp = nullptr; index = 0; @@ -186,6 +201,10 @@ LookupParameterStorage* LookupParameter::get() const { return mp->lookup_parameters_list()[index]; } +void LookupParameter::zero() { + return mp->lookup_parameters_list()[index]->zero(); +} + void LookupParameter::Initialize(unsigned index, const std::vector& val) const { get()->Initialize(index, val); } diff --git a/cnn/model.h b/cnn/model.h index 41b60c253..9912dcddb 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -25,6 +25,7 @@ namespace cnn { struct ParameterStorageBase { friend class Model; virtual void scale_parameters(float a) = 0; + virtual void zero() = 0; virtual void squared_l2norm(float* sqnorm) const = 0; virtual void g_squared_l2norm(float* sqnorm) const = 0; virtual size_t size() const = 0; @@ -38,6 +39,7 @@ struct ParameterStorageBase { struct ParameterStorage : public ParameterStorageBase { friend class Model; void scale_parameters(float a) override; + void zero() override; void squared_l2norm(float* sqnorm) const override; void g_squared_l2norm(float* sqnorm) const override; size_t size() const override; @@ -67,6 +69,7 @@ struct ParameterStorage : public ParameterStorageBase { struct LookupParameterStorage : public ParameterStorageBase { friend class Model; void scale_parameters(float a) override; + void zero() override; void squared_l2norm(float* sqnorm) const override; void g_squared_l2norm(float* sqnorm) const override; size_t size() const override; @@ -100,6 +103,9 @@ struct Parameter { Parameter(const Model* mp, unsigned long index); ParameterStorage* get() const; + // Zero the parameters + void zero(); + const Model* mp; unsigned long index; @@ -118,6 +124,9 @@ struct LookupParameter { LookupParameterStorage* get() const; void Initialize(unsigned index, const std::vector& val) const; + // Zero the parameters + void zero(); + const Model* mp; unsigned long index; From 50b48a3051c85abf71fe4583a8d3d27ec3dcf143 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 28 Jun 2016 11:25:25 +0900 Subject: [PATCH 568/965] Fixed some valgrind errors --- cnn/dim.h | 10 ++++---- cnn/model.cc | 2 ++ cnn/model.h | 2 +- cnn/nodes.cc | 55 +++++++++++--------------------------------- cnn/nodes.h | 1 + cnn/shadow-params.cc | 9 ++++++++ cnn/shadow-params.h | 2 ++ 7 files changed, 34 insertions(+), 47 deletions(-) diff --git a/cnn/dim.h b/cnn/dim.h index b6ce873ba..2ceae8ff4 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -16,21 +16,21 @@ namespace boost { namespace serialization { class access; } } namespace cnn { struct Dim { - Dim() : nd(), bd(1) {} + Dim() : nd(0), bd(1) {} // explicit Dim(unsigned int m) : nd(1), bd(1) { d[0] = m; } // TODO: The constructors for dimensions w/ and w/o batches is not intuitive. // can this be fixed in some way? // Dim(unsigned int m, unsigned int n) : nd(2), bd(1) { d[0] = m; d[1] = n; } - Dim(std::initializer_list x) : nd(), bd(1) { + Dim(std::initializer_list x) : nd(0), bd(1) { for(auto v : x) d[nd++] = v; } - Dim(std::initializer_list x, unsigned int b) : nd(), bd(b) { + Dim(std::initializer_list x, unsigned int b) : nd(0), bd(b) { for(auto v : x) d[nd++] = v; } - Dim(const std::vector & x) : nd(), bd(1) { + Dim(const std::vector & x) : nd(0), bd(1) { for(auto v : x) d[nd++] = v; } - Dim(const std::vector & x, unsigned int b) : nd(), bd(b) { + Dim(const std::vector & x, unsigned int b) : nd(0), bd(b) { for(auto v : x) d[nd++] = v; } inline unsigned int size() const { diff --git a/cnn/model.cc b/cnn/model.cc index 210eb06a0..dd859b636 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -211,6 +211,8 @@ void LookupParameter::Initialize(unsigned index, const std::vector& val) Model::~Model() { for (auto p : all_params) delete p; + if(gradient_norm_scratch) + default_device->mem->free(gradient_norm_scratch); } void Model::project_weights(float radius) { diff --git a/cnn/model.h b/cnn/model.h index 9912dcddb..6a9a7027a 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -145,7 +145,7 @@ struct LookupParameter { // parameters know how to track their gradients, but any extra information (like velocity) will live here class Model { public: - Model() : gradient_norm_scratch() {} + Model() : gradient_norm_scratch(nullptr) {} ~Model(); float gradient_l2_norm() const; void reset_gradient(); diff --git a/cnn/nodes.cc b/cnn/nodes.cc index ed7837ffb..76134d288 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -1404,22 +1404,14 @@ void PickNegLogSoftmax::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(PickNegLogSoftmax) -// x_1 is a vector +// x_1 is a matrix // y = (x_1)[start:end] -// slice of vector from index start (inclusive) to index end (exclusive) +// slice of matrix from index start (inclusive) to index end (exclusive) template void PickRange::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - assert(xs.size() == 1); - auto x = **xs[0]; - assert(x.cols() == 1); - assert(end <= x.rows()); - assert(start < end); - assert(int(fx.d.rows()) == int(end-start)); -#if __CUDACC__ - CUDA_CHECK(cudaMemcpyAsync(&fx.v[0], &xs[0]->v[start], sizeof(float) * (end-start), cudaMemcpyDeviceToDevice)); -#else - (*fx) = x.block(start, 0, end-start, 1); -#endif + Eigen::DSizes indices(start,0,0); + Eigen::DSizes sizes(end-start,fx.d.cols(),fx.d.bd); + fx.tb<2>().device(*dev.edevice) = xs[0]->tb<2>().slice(indices, sizes); } // derivative is 0 in all dimensions except the slice range @@ -1430,14 +1422,9 @@ void PickRange::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - assert(i == 0); - assert(int(dEdf.d.rows()) == int(end-start)); - assert(dEdf.d.cols() == 1); -#if __CUDACC__ - CUBLAS_CHECK(cublasSaxpy(cublas_handle, end-start, kSCALAR_ONE, dEdf.v, 1, &dEdxi.v[start], 1)); -#else - (*dEdxi).block(start, 0, end-start, 1) += (*dEdf); -#endif + Eigen::DSizes indices(start,0,0); + Eigen::DSizes sizes(end-start,fx.d.cols(),fx.d.bd); + dEdxi.tb<2>().slice(indices, sizes).device(*dev.edevice) += dEdf.tb<2>(); } CNN_NODE_INST_DEV_IMPL(PickRange) @@ -1694,7 +1681,7 @@ void Sparsemax::forward_dev_impl(const MyDevice & dev, const vectortvec() - tau).cwiseMax(0.f); int c = 1; int *cc = static_cast(aux_mem); for (unsigned i = 0; i < rows; ++i) @@ -1740,7 +1727,6 @@ void SparsemaxLoss::forward_dev_impl(const MyDevice & dev, const vectorsize(); const float qprop = 1.f / qsupport_size; @@ -1756,25 +1742,12 @@ void SparsemaxLoss::forward_dev_impl(const MyDevice & dev, const vectord, (float*)aux_mem, xs[0]->device); - auto x = **xs[0]; - auto sm = *tsm; - sm = (x - Eigen::MatrixXf::Ones(rows, 1)*tau).cwiseMax(0.f); - //cerr << "SpM: " << (sm).transpose() << " |||"; - //for (unsigned i = 0; i < pq->size(); ++i) cerr << ' ' << (*pq)[i]; - //cerr << endl; - y = 0; - float tau_sq = tau * tau; - for (unsigned i = 0; i < rows; ++i) { - if (sm(i, 0)) { - const float x_s = x(i, 0); - y += x_s * x_s - tau_sq; - } - } - y /= 2; - y += qprop * qprop * qsupport_size / 2; + tsm.t<1>() = (xs[0]->t<1>() - tau).cwiseMax(0.f); + fx.t<0>() = ( (tsm.t<1>() != 0.f).cast() * (xs[0]->t<1>().square() - (tau * tau)) ).sum(); + fx.t<0>() = ( fx.t<0>() + qprop * qprop * qsupport_size ) / 2.f; for (unsigned i = 0; i < qsupport_size; ++i) - y -= qprop * x((*pq)[i], 0); - if (y < 0) y = 0; + fx.t<0>() = fx.t<0>() - xs[0]->t<1>().chip<0>((*pq)[i]) * qprop; + fx.t<0>() = fx.t<0>().cwiseMax(0.f); #endif } else { throw std::runtime_error("SparsemaxLoss not yet implemented for multiple columns"); diff --git a/cnn/nodes.h b/cnn/nodes.h index 7e5a78b9e..4cc19c439 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -511,6 +511,7 @@ struct PickElement : public Node { struct PickRange : public Node { explicit PickRange(const std::initializer_list& a, unsigned s, unsigned e) : Node(a), start(s), end(e) {} CNN_NODE_DEFINE_DEV_IMPL() + virtual bool supports_multibatch() const override { return true; } unsigned start; unsigned end; }; diff --git a/cnn/shadow-params.cc b/cnn/shadow-params.cc index 9bb400c0a..b1c0028e2 100644 --- a/cnn/shadow-params.cc +++ b/cnn/shadow-params.cc @@ -13,6 +13,10 @@ ShadowParameters::ShadowParameters(const ParameterStorage& p) : h(p.values) { TensorTools::Zero(h); } +ShadowParameters::~ShadowParameters() { + default_device->mem->free(h.v); +} + ShadowLookupParameters::ShadowLookupParameters(const LookupParameterStorage& lp) : h(lp.values) { for (auto& t : h) { t.v = (float*)default_device->mem->malloc(t.d.size() * sizeof(float)); @@ -20,6 +24,11 @@ ShadowLookupParameters::ShadowLookupParameters(const LookupParameterStorage& lp) } } +ShadowLookupParameters::~ShadowLookupParameters() { + for (auto& t : h) + default_device->mem->free(t.v); +} + vector AllocateShadowParameters(const Model& m) { vector v; v.reserve(m.parameters_list().size()); diff --git a/cnn/shadow-params.h b/cnn/shadow-params.h index 11ad23b65..ecf92d887 100644 --- a/cnn/shadow-params.h +++ b/cnn/shadow-params.h @@ -16,11 +16,13 @@ struct LookupParameterStorage; struct ShadowParameters { explicit ShadowParameters(const ParameterStorage& p); + ~ShadowParameters(); Tensor h; }; struct ShadowLookupParameters { explicit ShadowLookupParameters(const LookupParameterStorage& lp); + ~ShadowLookupParameters(); std::vector h; }; From aea8e113fc45e3540ab8b733bd8610756c1a2a0e Mon Sep 17 00:00:00 2001 From: dhg Date: Tue, 28 Jun 2016 12:05:32 -0700 Subject: [PATCH 569/965] Changed PyCNN's PrintGraphviz parameter names --- pycnn/pycnn_viz.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py index b54049e2e..64cae63f1 100644 --- a/pycnn/pycnn_viz.py +++ b/pycnn/pycnn_viz.py @@ -751,7 +751,7 @@ def __iter__(self): return iter([self.name, self.input_dim, self.label, self.out def __repr__(self): return 'GVNode(%s)' % ', '.join(map(str, self)) def __str__(self): return repr(self) -def make_network_graph(compact, lookup_names_lookups, expression_names_lookups): +def make_network_graph(compact, expression_names, lookup_names): """ Make a network graph, represented as of nodes and a set of edges. The nodes are represented as tuples: (name: string, input_dim: Dim, label: string, output_dim: Dim, children: set[name], features: string) @@ -802,7 +802,7 @@ def vidx2str(vidx): return '%s%s' % ('N', vidx) elif f_name == 'lookup': [p, idx, update] = args [name, _dim] = p.args - item_name = ('\\"%s\\"' % (lookup_names_lookups[name][idx],)) if (lookup_names_lookups and (name in lookup_names_lookups)) else None + item_name = ('\\"%s\\"' % (lookup_names[name][idx],)) if (lookup_names and (name in lookup_names)) else None if compact: f_name = item_name if item_name is not None else ('%s[%s]' % (name, idx)) arg_strs = [] @@ -895,8 +895,8 @@ def vidx2str(vidx): return '%s%s' % ('N', vidx) var_name = '%s' % (var_name_dict.get(vidx, 'v%d' % (vidx))) if not compact else '' # if show_dims: # str_repr = '%s\\n%s' % (shape_str(e.dim), str_repr) - if expression_names_lookups and (e in expression_names_lookups): - str_repr = '%s\\n%s' % (str_repr, expression_names_lookups[e]) + if expression_names and (e in expression_names): + str_repr = '%s\\n%s' % (str_repr, expression_names[e]) label = str_repr if not compact: label = '%s = %s' % (var_name, label) @@ -967,8 +967,8 @@ def collapse_birnn_states(nodes, compact): new_nodes.append(GVNode(name, input_dim, label, output_dim, new_children, features, node_type)) return (new_nodes, rnn_groups) -def PrintGraphviz(compact=False, show_dims=True, lookup_names_lookups=None, expression_names_lookups=None, collapse_birnns=False): - original_nodes = make_network_graph(compact, lookup_names_lookups, expression_names_lookups) +def PrintGraphviz(compact=False, show_dims=True, expression_names=None, lookup_names=None, collapse_birnns=False): + original_nodes = make_network_graph(compact, expression_names, lookup_names) nodes = original_nodes collapse_to = dict() if collapse_birnns: From 6c61d0e44e065119f8251ac2f7133e16cfe7290b Mon Sep 17 00:00:00 2001 From: dhg Date: Tue, 28 Jun 2016 15:12:52 -0700 Subject: [PATCH 570/965] pycnn_viz: propagate expression names to parent nodes --- pycnn/pycnn_viz.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py index 64cae63f1..a1c8c2741 100644 --- a/pycnn/pycnn_viz.py +++ b/pycnn/pycnn_viz.py @@ -760,7 +760,7 @@ def make_network_graph(compact, expression_names, lookup_names): nodes = set() # edges = defaultdict(set) # parent -> (child, extra) - var_name_dict = dict() # parameters get named + var_name_dict = {e.vindex: expression_names[e] for e in graphviz_items if e in expression_names} rnn_bldr_name = defaultdict(lambda: chr(len(rnn_bldr_name)+ord('A'))) def vidx2str(vidx): return '%s%s' % ('N', vidx) From 8b2cff202bfed4ccd070f33140ad1daaa3e71c3d Mon Sep 17 00:00:00 2001 From: yoavg Date: Wed, 29 Jun 2016 02:01:32 +0300 Subject: [PATCH 571/965] changed model to support new save and load. --- cnn/CMakeLists.txt | 1 + cnn/model.h | 6 ++ pycnn/pycnn.pxd | 77 +++++++++++-------- pycnn/pycnn.pyx | 181 ++++++++++++++++++++++++++++++--------------- 4 files changed, 178 insertions(+), 87 deletions(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 95416dcab..88435d7c7 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -64,6 +64,7 @@ set(cnn_library_HDRS nodes-contract.h nodes-conv.h param-nodes.h + pybridge.h rnn-state-machine.h rnn.h saxe-init.h diff --git a/cnn/model.h b/cnn/model.h index 41b60c253..2fd548dd0 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -103,6 +103,9 @@ struct Parameter { const Model* mp; unsigned long index; + Dim dim() { return get()->dim; } + Tensor* values() { return &(get()->values); } + private: friend class boost::serialization::access; template @@ -121,6 +124,9 @@ struct LookupParameter { const Model* mp; unsigned long index; + Dim dim() { return get()->dim; } + std::vector* values() { return &(get()->values); } + private: friend class boost::serialization::access; template diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index 3e78789d2..dd340aca0 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -33,27 +33,23 @@ cdef extern from "cnn/tensor.h" namespace "cnn": vector[float] c_as_vector "cnn::as_vector" (CTensor& t) cdef extern from "cnn/model.h" namespace "cnn": - cdef cppclass CParameters "cnn::Parameters": - CParameters() + cdef cppclass CParameterStorage "cnn::ParameterStorage": + CParameterStorage() CTensor values - #void scale_parameters(float a) # override; - #void squared_l2norm(float* sqnorm) const # override; - #void g_squared_l2norm(float* sqnorm) const # override; - #size_t size() const # override; - #void accumulate_grad(const Tensor& g) - #void clear() CDim dim - pass - cdef cppclass CLookupParameters "cnn::LookupParameters": - CLookupParameters() + cdef cppclass CLookupParameterStorage "cnn::LookupParameterStorage": + CLookupParameterStorage() vector[CTensor] values - #void scale_parameters(float a) # override; - #void squared_l2norm(float* sqnorm) const # override; - #void g_squared_l2norm(float* sqnorm) const # override; - #size_t size() const # override; - #void accumulate_grad(const Tensor& g) - #void clear() + CDim dim + + cdef cppclass CParameters "cnn::Parameter": + CParameters() + CParameterStorage *get() + + cdef cppclass CLookupParameters "cnn::LookupParameter": + CLookupParameters() + CLookupParameterStorage *get() CDim dim void Initialize(unsigned index, const vector[float]& val) pass @@ -61,8 +57,9 @@ cdef extern from "cnn/model.h" namespace "cnn": cdef cppclass CModel "cnn::Model": CModel() #float gradient_l2_norm() const - CParameters* add_parameters(CDim& d, float scale = 0.0) - CLookupParameters* add_lookup_parameters(unsigned n, const CDim& d) + CParameters add_parameters(CDim& d, float scale = 0.0) + CLookupParameters add_lookup_parameters(unsigned n, const CDim& d) + vector[CParameterStorage] parameters_list() #void save(string fname) #void load(string fname) @@ -96,31 +93,35 @@ cdef extern from "cnn/cnn.h" namespace "cnn": cdef extern from "cnn/training.h" namespace "cnn": cdef cppclass CSimpleSGDTrainer "cnn::SimpleSGDTrainer": - CSimpleSGDTrainer(CModel* m, float lam, float e0) + #CSimpleSGDTrainer(CModel* m, float lam, float e0) + CSimpleSGDTrainer(CModel* m, float e0) # TODO removed lam, update docs. void update(float s) void update_epoch(float r) void status() cdef cppclass CMomentumSGDTrainer "cnn::MomentumSGDTrainer": - CMomentumSGDTrainer(CModel* m, float lam, float e0, float mom) + CMomentumSGDTrainer(CModel* m, float e0, float mom) # TODO removed lam, update docs void update(float s) void update_epoch(float r) void status() cdef cppclass CAdagradTrainer "cnn::AdagradTrainer": - CAdagradTrainer(CModel* m, float lam, float e0, float eps) + CAdagradTrainer(CModel* m, float e0, float eps) # TODO removed lam, update docs + void update(float s) void update_epoch(float r) void status() cdef cppclass CAdadeltaTrainer "cnn::AdadeltaTrainer": - CAdadeltaTrainer(CModel* m, float lam, float eps, float rho) + CAdadeltaTrainer(CModel* m, float eps, float rho) # TODO removed lam, update docs + void update(float s) void update_epoch(float r) void status() cdef cppclass CAdamTrainer "cnn::AdamTrainer": - CAdamTrainer(CModel* m, float lam, float alpha, float beta_1, float beta_2, float eps) + CAdamTrainer(CModel* m, float alpha, float beta_1, float beta_2, float eps) # TODO removed lam, update docs + void update(float s) void update_epoch(float r) void status() @@ -135,13 +136,13 @@ cdef extern from "cnn/expr.h" namespace "cnn::expr": #CExpression c_input "cnn::expr::input" (CComputationGraph& g, float s) # CExpression c_input "cnn::expr::input" (CComputationGraph& g, float *ps) # CExpression c_input "cnn::expr::input" (CComputationGraph& g, CDim& d, vector[float]* pdata) - CExpression c_parameter "cnn::expr::parameter" (CComputationGraph& g, CParameters* p) # + CExpression c_parameter "cnn::expr::parameter" (CComputationGraph& g, CParameters p) # #CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # - CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters* p, unsigned* pindex) # - CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters* p, vector[unsigned]* pindices) # + CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters p, unsigned* pindex) # + CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters p, vector[unsigned]* pindices) # #CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # - CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, unsigned* pindex) # - CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, vector[unsigned]* pindices) # + CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters p, unsigned* pindex) # + CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters p, vector[unsigned]* pindices) # # identity function, but derivative is not propagated through it CExpression c_nobackprop "cnn::expr::nobackprop" (CExpression& x) # @@ -246,6 +247,7 @@ cdef extern from "cnn/rnn.h" namespace "cnn": cdef extern from "cnn/rnn.h" namespace "cnn": #cdef cppclass RNNBuilder "cnn::RNNBuilder": cdef cppclass CSimpleRNNBuilder "cnn::SimpleRNNBuilder" (CRNNBuilder): + CSimpleRNNBuilder() CSimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) #void new_graph(CComputationGraph &cg) #void start_new_sequence(vector[CExpression] ces) @@ -261,6 +263,7 @@ cdef extern from "cnn/rnn.h" namespace "cnn": cdef extern from "cnn/lstm.h" namespace "cnn": cdef cppclass CLSTMBuilder "cnn::LSTMBuilder" (CRNNBuilder): + CLSTMBuilder() CLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) #void new_graph(CComputationGraph &cg) #void start_new_sequence(vector[CExpression] ces) @@ -289,3 +292,19 @@ cdef extern from "cnn/fast-lstm.h" namespace "cnn": #vector[CExpression] get_s(CRNNPointer i) #CRNNPointer state() +cdef extern from "cnn/pybridge.h" namespace "pycnn": + cdef cppclass CModelSaver "pycnn::ModelSaver": + CModelSaver(string filename, CModel *model) + CModelSaver add_parameter(CParameters p) + CModelSaver add_lookup_parameter(CLookupParameters lp) + CModelSaver add_lstm_builder(CLSTMBuilder b) + CModelSaver add_srnn_builder(CSimpleRNNBuilder b) + void done() + + cdef cppclass CModelLoader "pycnn::ModelLoader": + CModelLoader(string filename, CModel *model) + CModelSaver fill_parameter(CParameters p) + CModelSaver fill_lookup_parameter(CLookupParameters lp) + CModelSaver fill_lstm_builder(CLSTMBuilder lp) + CModelSaver fill_srnn_builder(CSimpleRNNBuilder lp) + void done() diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 2d42623b0..196889881 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -76,31 +76,32 @@ cdef c_tensor_as_np(CTensor &t): # {{{ Model / Parameters cdef class Parameters: - cdef CParameters *thisptr + cdef CParameters thisptr # TODO -- no longer pointer def __cinit__(self): - self.thisptr = NULL + #self.thisptr = p + pass @staticmethod - cdef wrap_ptr(CParameters* ptr): + cdef wrap_ptr(CParameters ptr): self = Parameters() self.thisptr = ptr return self cpdef shape(self): - if self.thisptr.dim.ndims() == 1: return (self.thisptr.dim.rows()) - return (self.thisptr.dim.rows(), self.thisptr.dim.cols()) + if self.thisptr.get().dim.ndims() == 1: return (self.thisptr.get().dim.rows()) + return (self.thisptr.get().dim.rows(), self.thisptr.get().dim.cols()) cpdef as_array(self): """ Return as a numpy array. """ cdef CTensor t - return c_tensor_as_np(self.thisptr.values) + return c_tensor_as_np(self.thisptr.get().values) # TODO: make more efficient cpdef load_array(self, arr): cdef CTensor t cdef float* vals - t = self.thisptr.values + t = self.thisptr.get().values shape = arr.shape if len(shape) == 1: assert(t.d.ndims() == 1) @@ -114,28 +115,28 @@ cdef class Parameters: cdef class LookupParameters: - cdef CLookupParameters *thisptr + cdef CLookupParameters thisptr # TODO -- no longer pointer def __cinit__(self): - self.thisptr = NULL + pass @staticmethod - cdef wrap_ptr(CLookupParameters* ptr): + cdef wrap_ptr(CLookupParameters ptr): self = LookupParameters() self.thisptr = ptr return self cpdef init_from_array(self, arr): - if len(arr) > self.thisptr.values.size(): + if len(arr) > self.thisptr.get().values.size(): raise Exception("too many rows") - if arr.shape[1] != self.thisptr.values[0].d.rows(): + if arr.shape[1] != self.thisptr.get().values[0].d.rows(): raise Exception("dim mismatch") cdef vector[float] r for i,row in enumerate(arr): self.init_row(i, row) cpdef shape(self): - if self.thisptr.dim.cols() != 1: - return (self.thisptr.values.size(), self.thisptr.dim.rows(), self.thisptr.dim.cols()) - return (self.thisptr.values.size(), self.thisptr.dim.rows()) + if self.thisptr.get().dim.cols() != 1: + return (self.thisptr.get().values.size(), self.thisptr.get().dim.rows(), self.thisptr.get().dim.cols()) + return (self.thisptr.get().values.size(), self.thisptr.get().dim.rows()) def __getitem__(self, int i): return lookup(self, i) @@ -151,61 +152,119 @@ cdef class LookupParameters: Return as a numpy array. """ cdef vector[CTensor] vals - vals = self.thisptr.values + vals = self.thisptr.get().values return np.vstack([c_tensor_as_np(t).reshape(1,-1,order='F') for t in vals]) cdef class Model: cdef CModel *thisptr - cdef object named_params - cdef object lookups - cdef object regular def __cinit__(self): self.thisptr = new CModel() def __init__(self): - self.named_params = {} - self.lookups = [] - self.regular = [] + pass def __dealloc__(self): del self.thisptr - def add_parameters(self, name, dim, scale=0): - cdef CParameters* p - assert(name not in self.named_params), "name already registered" - p = self.thisptr.add_parameters(Dim(dim)) + # TODO: for debug, remove + cpdef pl(self): return self.thisptr.parameters_list().size() + + cpdef add_parameters(self, dim, scale=0): + assert(isinstance(dim,(tuple,int))) + cdef CParameters p = self.thisptr.add_parameters(Dim(dim)) cdef Parameters pp = Parameters.wrap_ptr(p) - self.named_params[name] = pp - self.regular.append(name) + #self.regular.append(pp) # TODO do we even need regular? return pp - def add_lookup_parameters(self, name, dim): + cpdef add_lookup_parameters(self, dim): assert(isinstance(dim, tuple)) - assert(name not in self.named_params), "name already registered" cdef int nids = dim[0] rest = tuple(dim[1:]) - cdef CLookupParameters* p - p = self.thisptr.add_lookup_parameters(nids, Dim(rest)) + cdef CLookupParameters p = self.thisptr.add_lookup_parameters(nids, Dim(rest)) cdef LookupParameters pp = LookupParameters.wrap_ptr(p) - self.named_params[name] = pp - self.lookups.append(name) return pp - def __getitem__(self, name): - return self.named_params[name] - - def __contains__(self, name): - return name in self.named_params - - #def parameters(self): return self.named_params.keys() - #def lookup_parameters(self): return list(self.lookups) - #def regular_parameters(self): return list(self.regular) - - def save(self, string fname): + def save_all(self, string fname): save_cnn_model(fname, self.thisptr) - def load(self, string fname): + def load_all(self, string fname): load_cnn_model(fname, self.thisptr) + # TODO support python "components", e.g. MLP + def save(self, string fname, components=None): + if not components: + self.save_all(fname) + return + fh = file(fname+".pym","w") + cdef CModelSaver *saver = new CModelSaver(fname, self.thisptr) + if isinstance(components,dict): + components = components.iteritems() + elif isinstance(components,list): + components = [('',c) for c in components] + else: + raise TypeError("The components parameter must be list or dict.") + for n,c in components: + # would be nicer to have polymorphism/dispatch-by-type + # but we cannot because we need to bind to the c-type. + if isinstance(c, Parameters): + saver.add_parameter((c).thisptr) + fh.write("param|%s " % n) + elif isinstance(c, LookupParameters): + saver.add_lookup_parameter((c).thisptr) + fh.write("lookup|%s " % n) + elif isinstance(c, LSTMBuilder): + saver.add_lstm_builder(((c).thisptr)[0]) + fh.write("lstm_builder|%s " % n) + elif isinstance(c, SimpleRNNBuilder): + saver.add_srnn_builder(((c).thisptr)[0]) + fh.write("srnn_builder|%s " % n) + else: + raise TypeError("Cannot save model component of type " + type(c)) + saver.done() + fh.close() + del saver + + # TODO support python "components", e.g. MLP + cpdef load(self, string fname): + #TODO if fails, just run the load_all + with file(fname+".pym","r") as fh: + types = fh.read().strip().split() + print self.pl() + cdef CModelLoader *loader = new CModelLoader(fname, self.thisptr) + print self.pl() + cdef CParameters p + cdef CLookupParameters lp + cdef LSTMBuilder lb_ + cdef SimpleRNNBuilder sb_ + params = [] + names = [] + for tp_name in types: + tp,name = tp_name.split("|",1) + if name: names.append(name) + if tp == "param": + loader.fill_parameter(p) + params.append(Parameters.wrap_ptr(p)) + elif tp == "lookup": + loader.fill_lookup_parameter(lp) + params.append(LookupParameters.wrap_ptr(lp)) + elif tp == "lstm_builder": + lb_ = LSTMBuilder(0,0,0,self) # empty builder + loader.fill_lstm_builder((lb_.thisptr)[0]) + params.append(lb_) + elif tp == "srnn_builder": + sb_ = SimpleRNNBuilder(0,0,0,self) # empty builder + loader.fill_srnn_builder((sb_.thisptr)[0]) + params.append(sb_) + else: + assert(False,"unsupported type " + tp) + loader.done() + del loader + if names: + assert(len(names)==len(params)) + return dict(zip(names,params)) + else: + return params + + # }}} # {{{ Computation Graph @@ -850,7 +909,10 @@ cdef class _RNNBuilder: # {{{ cdef class SimpleRNNBuilder(_RNNBuilder): # {{{ def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): - self.thisptr = new CSimpleRNNBuilder(layers, input_dim, hidden_dim, model.thisptr) + if layers > 0: + self.thisptr = new CSimpleRNNBuilder(layers, input_dim, hidden_dim, model.thisptr) + else: + self.thisptr = new CSimpleRNNBuilder() self.cg_version = -1 def whoami(self): return "SimpleRNNBuilder" @@ -858,7 +920,10 @@ cdef class SimpleRNNBuilder(_RNNBuilder): # {{{ cdef class LSTMBuilder(_RNNBuilder): # {{{ def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): - self.thisptr = new CLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr) + if layers > 0: + self.thisptr = new CLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr) + else: + self.thisptr = new CLSTMBuilder() self.cg_version = -1 def whoami(self): return "LSTMBuilder" @@ -1098,8 +1163,8 @@ cdef class StackedRNNState: # {{{ Training cdef class SimpleSGDTrainer: cdef CSimpleSGDTrainer *thisptr - def __cinit__(self, Model m, float lam = 1e-6, float e0 = 0.1): - self.thisptr = new CSimpleSGDTrainer(m.thisptr, lam, e0) + def __cinit__(self, Model m, float e0 = 0.1): + self.thisptr = new CSimpleSGDTrainer(m.thisptr, e0) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): @@ -1111,8 +1176,8 @@ cdef class SimpleSGDTrainer: cdef class MomentumSGDTrainer: cdef CMomentumSGDTrainer *thisptr - def __cinit__(self, Model m, float lam = 1e-6, float e0 = 0.01, float mom = 0.9): - self.thisptr = new CMomentumSGDTrainer(m.thisptr, lam, e0, mom) + def __cinit__(self, Model m, float e0 = 0.01, float mom = 0.9): + self.thisptr = new CMomentumSGDTrainer(m.thisptr, e0, mom) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): @@ -1124,8 +1189,8 @@ cdef class MomentumSGDTrainer: cdef class AdagradTrainer: cdef CAdagradTrainer *thisptr - def __cinit__(self, Model m, float lam = 1e-6, float e0 = 0.1, float eps = 1e-20): - self.thisptr = new CAdagradTrainer(m.thisptr, lam, e0, eps) + def __cinit__(self, Model m, float e0 = 0.1, float eps = 1e-20): + self.thisptr = new CAdagradTrainer(m.thisptr, e0, eps) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): @@ -1137,8 +1202,8 @@ cdef class AdagradTrainer: cdef class AdadeltaTrainer: cdef CAdadeltaTrainer *thisptr - def __cinit__(self, Model m, float lam = 1e-6, float eps = 1e-6, float rho = 0.95): - self.thisptr = new CAdadeltaTrainer(m.thisptr, lam, eps, rho) + def __cinit__(self, Model m, float eps = 1e-6, float rho = 0.95): + self.thisptr = new CAdadeltaTrainer(m.thisptr, eps, rho) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): @@ -1150,8 +1215,8 @@ cdef class AdadeltaTrainer: cdef class AdamTrainer: cdef CAdamTrainer *thisptr - def __cinit__(self, Model m, float lam = 1e-6, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, eps = 1e-8 ): - self.thisptr = new CAdamTrainer(m.thisptr, lam, alpha, beta_1, beta_2, eps) + def __cinit__(self, Model m, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, eps = 1e-8 ): + self.thisptr = new CAdamTrainer(m.thisptr, alpha, beta_1, beta_2, eps) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): From dff8e9ea73554bfb411e57a8422f2b3fe5667818 Mon Sep 17 00:00:00 2001 From: yoavg Date: Wed, 29 Jun 2016 21:15:57 +0300 Subject: [PATCH 572/965] support saving user types --- pycnn/pycnn.pyx | 152 ++++++++++++++++++++++++++++++------------------ 1 file changed, 96 insertions(+), 56 deletions(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 196889881..b6b2f524e 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -4,6 +4,7 @@ import sys from cython.operator cimport dereference as deref from libc.stdlib cimport malloc, free import numpy as np +import cPickle as pickle # TODO: # - set random seed (in CNN) # - better input / output support @@ -155,6 +156,28 @@ cdef class LookupParameters: vals = self.thisptr.get().values return np.vstack([c_tensor_as_np(t).reshape(1,-1,order='F') for t in vals]) +# TODO document this +class Saveable(object): + def __init__(self): + pass + + def __getstate__(self): + odict = self.__dict__.copy() # copy the dict since we change it + params = self.get_components() + for k,v in odict.items(): # remove unpicklable things which we save otherwise + if v in params: + del odict[k] + return odict + + def get_components(self): + """ + List of parameter-containing components that are + members of this object and are created by it. + """ + return NotImplemented + + def restore_components(self, components): + return NotImplemented cdef class Model: cdef CModel *thisptr @@ -189,81 +212,98 @@ cdef class Model: def load_all(self, string fname): load_cnn_model(fname, self.thisptr) + cdef _save_one(self, component, CModelSaver *saver, fh, pfh): + # would be nicer to have polymorphism/dispatch-by-type + # but we cannot because we need to bind to the c-type. + c = component + if isinstance(c, Parameters): + fh.write("param ") + saver.add_parameter((c).thisptr) + elif isinstance(c, LookupParameters): + fh.write("lookup ") + saver.add_lookup_parameter((c).thisptr) + elif isinstance(c, LSTMBuilder): + fh.write("lstm_builder ") + saver.add_lstm_builder(((c).thisptr)[0]) + elif isinstance(c, SimpleRNNBuilder): + saver.add_srnn_builder(((c).thisptr)[0]) + fh.write("srnn_builder ") + elif isinstance(c, Saveable): + cs = c.get_components() + fh.write("user~%s " % len(cs)) + pickle.dump(c,pfh) + for subc in cs: + self._save_one(subc,saver,fh,pfh) + else: + raise TypeError("Cannot save model component of type %s" % type(c)) + # TODO support python "components", e.g. MLP def save(self, string fname, components=None): if not components: self.save_all(fname) return fh = file(fname+".pym","w") + pfh = file(fname+".pyk","w") cdef CModelSaver *saver = new CModelSaver(fname, self.thisptr) - if isinstance(components,dict): - components = components.iteritems() - elif isinstance(components,list): - components = [('',c) for c in components] - else: - raise TypeError("The components parameter must be list or dict.") - for n,c in components: - # would be nicer to have polymorphism/dispatch-by-type - # but we cannot because we need to bind to the c-type. - if isinstance(c, Parameters): - saver.add_parameter((c).thisptr) - fh.write("param|%s " % n) - elif isinstance(c, LookupParameters): - saver.add_lookup_parameter((c).thisptr) - fh.write("lookup|%s " % n) - elif isinstance(c, LSTMBuilder): - saver.add_lstm_builder(((c).thisptr)[0]) - fh.write("lstm_builder|%s " % n) - elif isinstance(c, SimpleRNNBuilder): - saver.add_srnn_builder(((c).thisptr)[0]) - fh.write("srnn_builder|%s " % n) - else: - raise TypeError("Cannot save model component of type " + type(c)) + for c in components: + self._save_one(c,saver,fh,pfh) saver.done() fh.close() + pfh.close() del saver + cdef _load_one(self, itypes, CModelLoader *loader, pfh): + cdef CParameters p + cdef CLookupParameters lp + cdef LSTMBuilder lb_ + cdef SimpleRNNBuilder sb_ + tp = itypes.next() + print "Loading:",tp + if tp == "param": + loader.fill_parameter(p) + param = Parameters.wrap_ptr(p) + return param + elif tp == "lookup": + loader.fill_lookup_parameter(lp) + param = LookupParameters.wrap_ptr(lp) + return param + elif tp == "lstm_builder": + lb_ = LSTMBuilder(0,0,0,self) # empty builder + loader.fill_lstm_builder((lb_.thisptr)[0]) + return lb_ + elif tp == "srnn_builder": + sb_ = SimpleRNNBuilder(0,0,0,self) # empty builder + loader.fill_srnn_builder((sb_.thisptr)[0]) + return sb_ + elif tp.startswith("user~"): + # user defiend type + tp,num = tp.split("~",1) + saveable = pickle.load(pfh) + num = int(num) + items = [self._load_one(itypes, loader, pfh) for _ in xrange(num)] + saveable.restore_components(items) + return saveable + else: + print "Huh?" + assert False,"unsupported type " + tp + # TODO support python "components", e.g. MLP cpdef load(self, string fname): #TODO if fails, just run the load_all with file(fname+".pym","r") as fh: types = fh.read().strip().split() - print self.pl() cdef CModelLoader *loader = new CModelLoader(fname, self.thisptr) - print self.pl() - cdef CParameters p - cdef CLookupParameters lp - cdef LSTMBuilder lb_ - cdef SimpleRNNBuilder sb_ - params = [] - names = [] - for tp_name in types: - tp,name = tp_name.split("|",1) - if name: names.append(name) - if tp == "param": - loader.fill_parameter(p) - params.append(Parameters.wrap_ptr(p)) - elif tp == "lookup": - loader.fill_lookup_parameter(lp) - params.append(LookupParameters.wrap_ptr(lp)) - elif tp == "lstm_builder": - lb_ = LSTMBuilder(0,0,0,self) # empty builder - loader.fill_lstm_builder((lb_.thisptr)[0]) - params.append(lb_) - elif tp == "srnn_builder": - sb_ = SimpleRNNBuilder(0,0,0,self) # empty builder - loader.fill_srnn_builder((sb_.thisptr)[0]) - params.append(sb_) - else: - assert(False,"unsupported type " + tp) + with file(fname+".pyk","r") as pfh: + params = [] + itypes = iter(types) + while True: # until iterator is done + try: + param = self._load_one(itypes,loader,pfh) + except StopIteration: break + params.append(param) loader.done() del loader - if names: - assert(len(names)==len(params)) - return dict(zip(names,params)) - else: - return params - + return params # }}} From cbf765719d3c8837bce9d2c31a088b6abdb6c8d2 Mon Sep 17 00:00:00 2001 From: yoavg Date: Wed, 29 Jun 2016 23:51:37 +0300 Subject: [PATCH 573/965] model saving and loading tests, added the pybridge --- pycnn/model_test.py | 191 ++++++++++++++++++++++++++++++++++++++++++++ pycnn/pybridge.h | 134 +++++++++++++++++++++++++++++++ pycnn/pycnn.pxd | 2 +- pycnn/pycnn.pyx | 10 ++- 4 files changed, 333 insertions(+), 4 deletions(-) create mode 100644 pycnn/model_test.py create mode 100644 pycnn/pybridge.h diff --git a/pycnn/model_test.py b/pycnn/model_test.py new file mode 100644 index 000000000..a0f14df2c --- /dev/null +++ b/pycnn/model_test.py @@ -0,0 +1,191 @@ +""" +Tests for model saving and loading, including for user-defined models. +""" +from pycnn import * +import numpy +import os + +# first, define three user-defined classes + +class Transfer(Saveable): + def __init__(self, nin, nout, act, model): + self.act = act + self.W = model.add_parameters((nout, nin)) + self.b = model.add_parameters(nout) + self.nin = nin + self.nout = nout + + def __call__(self, x): + W,b=map(parameter, [self.W, self.b]) + return self.act(W*x+b) + + def get_components(self): + return [self.W, self.b] + + def restore_components(self, components): + self.W, self.b = components + +class MultiTransfer(Saveable): + def __init__(self, sizes, act, model): + self.transfers = [] + for nin,nout in zip(sizes,sizes[1:]): + self.transfers.append(Transfer(nin,nout,act,model)) + + def __call__(self, x): + for t in self.transfers: + x = t(x) + return x + + def get_components(self): + return self.transfers + + def restore_components(self, components): + self.transfers = components + +class NoParameters(Saveable): + def __init__(self, act): + self.act = act + def __call__(self, in_expr): + return self.act(cwise_multiply(in_expr)) + def get_components(self): return [] + def restore_components(self,components):pass + +def old_style_save_and_load(): + # create a model and add parameters. + m = Model() + a = m.add_parameters((100,100)) + b = m.add_lookup_parameters((20,2)) + t1 = Transfer(5,6,softmax, m) + t2 = Transfer(7,8,softmax, m) + tt = MultiTransfer([10,10,10,10],tanh, m) + c = m.add_parameters((100)) + lb = LSTMBuilder(1,2,3,m) + lb2 = LSTMBuilder(2,4,4,m) + # save + m.save("test1") + + # create new model (same parameters): + m2 = Model() + a2 = m2.add_parameters((100,100)) + b2 = m2.add_lookup_parameters((20,2)) + t12 = Transfer(5,6,softmax, m2) + t22 = Transfer(7,8,softmax, m2) + tt2 = MultiTransfer([10,10,10,10],tanh, m2) + c2 = m2.add_parameters((100)) + lb2 = LSTMBuilder(1,2,3,m2) + lb22 = LSTMBuilder(2,4,4,m2) + + # parameters should be different + for p1,p2 in [(a,a2),(b,b2),(c,c2),(t1.W,t12.W),(tt.transfers[0].W,tt2.transfers[0].W)]: + assert(not numpy.array_equal(p1.as_array(), p2.as_array())) + + m2.load("test1") + + # parameters should be same + for p1,p2 in [(a,a2),(b,b2),(c,c2),(t1.W,t12.W),(tt.transfers[0].W,tt2.transfers[0].W)]: + assert(numpy.array_equal(p1.as_array(), p2.as_array())) + + + os.remove("test1") + +old_style_save_and_load() + +def new_style_save_and_load(): + # create a model and add parameters. + m = Model() + a = m.add_parameters((100,100)) + b = m.add_lookup_parameters((20,2)) + t1 = Transfer(5,6,softmax, m) + t2 = Transfer(7,8,softmax, m) + tt = MultiTransfer([10,10,10,10],tanh, m) + c = m.add_parameters((100)) + lb = LSTMBuilder(1,2,3,m) + lb2 = LSTMBuilder(2,4,4,m) + np = NoParameters(tanh) + # save + m.save("test_new",[a,b,t1,t2,tt,c,lb,lb2,np]) + m.save("test_new_r",[np,lb2,lb,c,tt,t2,t1,b,a]) + + # create new model and load: + m2 = Model() + [xa,xb,xt1,xt2,xtt,xc,xlb,xlb2,xnp] = m2.load("test_new") + m3 = Model() + [rnp,rlb2,rlb,rc,rtt,rt2,rt1,rb,ra] = m3.load("test_new_r") + + # partial save and load: + m.save("test_new_partial", [a,tt,lb2]) + m4 = Model() + [pa,ptt,plb2] = m4.load("test_new_partial") + + # types + params = [a,xa,ra,pa,c,xc,rc] + for p1 in params: + assert(isinstance(p1,Parameters)) + for p1 in [b,xb,rb]: + assert(isinstance(p1,LookupParameters)) + for p1 in [lb,lb2,xlb,xlb2,rlb,rlb2,plb2]: + assert(isinstance(p1,LSTMBuilder)) + for p1 in [t1,t2,xt1,xt2,rt1,rt2]: + assert(isinstance(p1,Transfer)) + for p1 in [tt,xtt,rtt,ptt]: + assert(isinstance(p1,MultiTransfer)) + for p1 in [np,xnp,rnp]: + assert(isinstance(p1,NoParameters)) + + # param equalities + for p1 in [a,xa,ra,pa]: + for p2 in [a,xa,ra,pa]: + assert(numpy.array_equal(p1.as_array(),p2.as_array())) + for p1 in [c,xc,rc]: + for p2 in [c,xc,rc]: + assert(numpy.array_equal(p1.as_array(),p2.as_array())) + for p1 in [b,xb,rb]: + for p2 in [b,xb,rb]: + assert(numpy.array_equal(p1.as_array(),p2.as_array())) + v1 = b[4] + v2 = xb[4] + v3 = rb[4] + assert(numpy.array_equal(v1.value(), v2.value())) + assert(numpy.array_equal(v1.value(), v3.value())) + # lstm builders equalities + s1 = lb.initial_state() + s2 = xlb.initial_state() + s3 = rlb.initial_state() + y1 = s1.add_input(v1).output().value() + y2 = s2.add_input(v1).output().value() + y3 = s3.add_input(v1).output().value() + for y in [y2,y3]: + assert(numpy.array_equal(y1,y)) + + # Transfer equalities + for p1 in [t1,xt1,rt1]: + for p2 in [t1,xt1,rt1]: + assert(numpy.array_equal(p1.W.as_array(),p2.W.as_array())) + assert(numpy.array_equal(p1.b.as_array(),p2.b.as_array())) + assert(p1.nin == p2.nin) + + # MultiTransfer equalities + for p1 in [tt,xtt,rtt]: + for p2 in [tt,xtt,rtt]: + assert(numpy.array_equal(p1.transfers[0].W.as_array(),p2.transfers[0].W.as_array())) + assert(numpy.array_equal(p1.transfers[0].b.as_array(),p2.transfers[0].b.as_array())) + assert(numpy.array_equal(p1.transfers[-1].W.as_array(),p2.transfers[-1].W.as_array())) + assert(numpy.array_equal(p1.transfers[-1].b.as_array(),p2.transfers[-1].b.as_array())) + assert(p1.transfers[0].nin == p2.transfers[0].nin) + assert(p1.transfers[-1].nin == p2.transfers[-1].nin) + + # NoParameter equalities + for p1 in [np,xnp,rnp]: + assert(p1.act == tanh) + + for suf in ['','.pyk','.pym']: + os.remove("test_new"+suf) + os.remove("test_new_r"+suf) + os.remove("test_new_partial"+suf) + +new_style_save_and_load() + +print "Model saving tests passed." + + + diff --git a/pycnn/pybridge.h b/pycnn/pybridge.h new file mode 100644 index 000000000..794682fc8 --- /dev/null +++ b/pycnn/pybridge.h @@ -0,0 +1,134 @@ +#include "cnn/model.h" +#include "cnn/cfsm-builder.h" +#include "cnn/deep-lstm.h" +#include "cnn/fast-lstm.h" +#include "cnn/fast-lstm.h" +#include "cnn/gru.h" +#include "cnn/hsm-builder.h" +#include "cnn/lstm.h" +#include +#include + +#include +#include + +namespace pycnn { + +// Wrappers for the templated boost interface so that it is accessible +// form cython. Needs to add a method for every type we would like to +// load / save. +struct ModelSaver { + ModelSaver(std::string filename, cnn::Model *model) : + ofs(filename), + oa(ofs) + { + oa << *model; + }; + + ModelSaver* add_parameter(cnn::Parameter &p) { + oa << p; return this; + } + + ModelSaver* add_lookup_parameter(cnn::LookupParameter &p) { + oa << p; return this; + } + + ModelSaver* add_lstm_builder(cnn::LSTMBuilder &p) { + oa << p; return this; + } + + ModelSaver* add_srnn_builder(cnn::SimpleRNNBuilder &p) { + oa << p; return this; + } + + ModelSaver* add_gru_builder(cnn::GRUBuilder &p) { + oa << p; return this; + } + + ModelSaver* add_hsm_builder(cnn::HierarchicalSoftmaxBuilder &p) { + oa << p; return this; + } + + + ModelSaver* add_fast_lstm_builder(cnn::FastLSTMBuilder &p) { + oa << p; return this; + } + + // TODO what is this? + ModelSaver* add_deep_lstm_builder(cnn::DeepLSTMBuilder &p) { + oa << p; return this; + } + + ModelSaver* add_cfsm_builder(cnn::ClassFactoredSoftmaxBuilder &p) { + oa << p; return this; + } + + ModelSaver* add_sm_builder(cnn::StandardSoftmaxBuilder &p) { + oa << p; return this; + } + + void done() { ofs.close(); } + + + private: + std::ofstream ofs; + boost::archive::text_oarchive oa; + +}; + +struct ModelLoader { + ModelLoader(std::string filename, cnn::Model *model) : + ifs(filename), + ia(ifs) + { + printf("loading model\n"); + ia >> *model; + printf("done %d\n", model->parameters_list().size()); + }; + + ModelLoader* fill_parameter(cnn::Parameter &p) { + ia >> p; return this; + } + + ModelLoader* fill_lookup_parameter(cnn::LookupParameter &p) { + ia >> p; return this; + } + + ModelLoader* fill_lstm_builder(cnn::LSTMBuilder &p) { + ia >> p; return this; + } + + ModelLoader* fill_srnn_builder(cnn::SimpleRNNBuilder &p) { + ia >> p; return this; + } + + ModelLoader* fill_hsm_builder(cnn::HierarchicalSoftmaxBuilder &p) { + ia >> p; return this; + } + + ModelLoader* fill_fast_lstm_builder(cnn::FastLSTMBuilder &p) { + ia >> p; return this; + } + + // TODO what is this? + ModelLoader* fill_deep_lstm_builder(cnn::DeepLSTMBuilder &p) { + ia >> p; return this; + } + + ModelLoader* fill_cfsm_builder(cnn::ClassFactoredSoftmaxBuilder &p) { + ia >> p; return this; + } + + ModelLoader* fill_sm_builder(cnn::StandardSoftmaxBuilder &p) { + ia >> p; return this; + } + + void done() { ifs.close(); } + + private: + std::ifstream ifs; + boost::archive::text_iarchive ia; + +}; +} + diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index dd340aca0..96262bb3f 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -292,7 +292,7 @@ cdef extern from "cnn/fast-lstm.h" namespace "cnn": #vector[CExpression] get_s(CRNNPointer i) #CRNNPointer state() -cdef extern from "cnn/pybridge.h" namespace "pycnn": +cdef extern from "pybridge.h" namespace "pycnn": cdef cppclass CModelSaver "pycnn::ModelSaver": CModelSaver(string filename, CModel *model) CModelSaver add_parameter(CParameters p) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index b6b2f524e..f74a4a36d 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -5,6 +5,7 @@ from cython.operator cimport dereference as deref from libc.stdlib cimport malloc, free import numpy as np import cPickle as pickle +import os.path # TODO: # - set random seed (in CNN) # - better input / output support @@ -179,7 +180,7 @@ class Saveable(object): def restore_components(self, components): return NotImplemented -cdef class Model: +cdef class Model: # {{{ cdef CModel *thisptr def __cinit__(self): self.thisptr = new CModel() @@ -258,7 +259,6 @@ cdef class Model: cdef LSTMBuilder lb_ cdef SimpleRNNBuilder sb_ tp = itypes.next() - print "Loading:",tp if tp == "param": loader.fill_parameter(p) param = Parameters.wrap_ptr(p) @@ -289,9 +289,12 @@ cdef class Model: # TODO support python "components", e.g. MLP cpdef load(self, string fname): - #TODO if fails, just run the load_all + if not os.path.isfile(fname+".pym"): + self.load_all(fname) + return with file(fname+".pym","r") as fh: types = fh.read().strip().split() + cdef CModelLoader *loader = new CModelLoader(fname, self.thisptr) with file(fname+".pyk","r") as pfh: params = [] @@ -304,6 +307,7 @@ cdef class Model: loader.done() del loader return params + #}}} # }}} From 9060429c6e9f35e603991e363e922c94ddf679ea Mon Sep 17 00:00:00 2001 From: yoavg Date: Wed, 29 Jun 2016 23:52:06 +0300 Subject: [PATCH 574/965] clear --- cnn/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 88435d7c7..95416dcab 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -64,7 +64,6 @@ set(cnn_library_HDRS nodes-contract.h nodes-conv.h param-nodes.h - pybridge.h rnn-state-machine.h rnn.h saxe-init.h From 5655d0b80f9141c6353590f74e79571e98da7f0c Mon Sep 17 00:00:00 2001 From: yoavg Date: Thu, 30 Jun 2016 01:17:25 +0300 Subject: [PATCH 575/965] added zero(), filter1d_narrow --- pycnn/pycnn.pxd | 6 +++--- pycnn/pycnn.pyx | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index 96262bb3f..dbcdc2a8a 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -46,13 +46,14 @@ cdef extern from "cnn/model.h" namespace "cnn": cdef cppclass CParameters "cnn::Parameter": CParameters() CParameterStorage *get() + void zero() cdef cppclass CLookupParameters "cnn::LookupParameter": CLookupParameters() CLookupParameterStorage *get() CDim dim void Initialize(unsigned index, const vector[float]& val) - pass + void zero() cdef cppclass CModel "cnn::Model": CModel() @@ -60,8 +61,6 @@ cdef extern from "cnn/model.h" namespace "cnn": CParameters add_parameters(CDim& d, float scale = 0.0) CLookupParameters add_lookup_parameters(unsigned n, const CDim& d) vector[CParameterStorage] parameters_list() - #void save(string fname) - #void load(string fname) void load_cnn_model "cnn::load_cnn_model" (string filename, CModel *model) void save_cnn_model "cnn::save_cnn_model" (string filename, CModel *model) @@ -198,6 +197,7 @@ cdef extern from "cnn/expr.h" namespace "cnn::expr": CExpression c_conv1d_narrow "cnn::expr::conv1d_narrow" (CExpression& x, CExpression& f) # CExpression c_conv1d_wide "cnn::expr::conv1d_wide" (CExpression& x, CExpression& f) # + CExpression c_filter1d_narrow "cnn::expr::filter1d_narrow" (CExpression& x, CExpression& f) # CExpression c_kmax_pooling "cnn::expr::kmax_pooling" (CExpression& x, unsigned k) # CExpression c_fold_rows "cnn::expr::fold_rows" (CExpression& x, unsigned nrows) # CExpression c_sum_cols "cnn::expr::sum_cols" (CExpression& x) # diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index f74a4a36d..6613c8a12 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -115,6 +115,9 @@ cdef class Parameters: for i in xrange(arr.size): vals[i] = arr[i] + cpdef zero(self): self.thisptr.zero() + + cdef class LookupParameters: cdef CLookupParameters thisptr # TODO -- no longer pointer @@ -157,6 +160,8 @@ cdef class LookupParameters: vals = self.thisptr.get().values return np.vstack([c_tensor_as_np(t).reshape(1,-1,order='F') for t in vals]) + cpdef zero(self): self.thisptr.zero() + # TODO document this class Saveable(object): def __init__(self): @@ -737,6 +742,7 @@ cpdef Expression l1_distance(Expression x, Expression y): ensure_freshness(y); r cpdef Expression binary_log_loss(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_binary_log_loss(x.c(), y.c())) cpdef Expression conv1d_narrow(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_conv1d_narrow(x.c(), y.c())) cpdef Expression conv1d_wide(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_conv1d_wide(x.c(), y.c())) +cpdef Expression filter1d_narrow(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_filter1d_narrow(x.c(), y.c())) # unary-exp cpdef Expression tanh(Expression x): return Expression.from_cexpr(x.cg_version, c_tanh(x.c())) From 506d2fef732bfda98329f17dc0080d59d5735e1e Mon Sep 17 00:00:00 2001 From: yoavg Date: Thu, 30 Jun 2016 01:18:01 +0300 Subject: [PATCH 576/965] updated pycnn tutorials to v2 --- pyexamples/tutorials/API.ipynb | 248 +++++++-- pyexamples/tutorials/RNNs.ipynb | 295 +++++----- pyexamples/tutorials/tutorial-1-xor.ipynb | 632 +++++++++++----------- 3 files changed, 680 insertions(+), 495 deletions(-) diff --git a/pyexamples/tutorials/API.ipynb b/pyexamples/tutorials/API.ipynb index 11598645b..0ba32b070 100644 --- a/pyexamples/tutorials/API.ipynb +++ b/pyexamples/tutorials/API.ipynb @@ -50,11 +50,11 @@ "\n", "# First we create a model and add the parameters to it.\n", "m = Model() \n", - "pW = m.add_parameters(\"W\", (8,8)) # an 8x8 matrix\n", - "pb = m.add_parameters(\"b\", 8)\n", + "pW = m.add_parameters((8,8)) # an 8x8 matrix\n", + "pb = m.add_parameters(8)\n", "\n", "# then we create an Expression out of the model's parameters\n", - "W = parameter(pW) # or W = parameter(m[\"W\"])\n", + "W = parameter(pW)\n", "b = parameter(pb)\n", "\n", "## ===== Lookup parameters\n", @@ -62,7 +62,7 @@ "# that maps numbers to vectors.\n", "# These are used for embedding matrices.\n", "# for example, this will have VOCAB_SIZE rows, each of DIM dimensions.\n", - "lp = m.add_lookup_parameters(\"lookup\", (VOCAB_SIZE, DIM))\n", + "lp = m.add_lookup_parameters((VOCAB_SIZE, DIM))\n", "\n", "# lookup parameters can be initialized from an existing array, i.e:\n", "# m[\"lookup\"].init_from_array(wv)\n", @@ -145,9 +145,13 @@ "# e = max(0, m - (e1 - e2))\n", "e = pairwise_rank_loss(e1, e2, m=1.0) \n", "\n", - "# Convolutions TODO\n", - "e = conv1d_narrow(e1, e2) #\n", - "e = conv1d_wide(e1, e2) #\n", + "# Convolutions\n", + "# e1 \\in R^{d x s} (input)\n", + "# e2 \\in R^{d x m} (filter)\n", + "e = conv1d_narrow(e1, e2) # e = e1 *conv e2\n", + "e = conv1d_wide(e1, e2) # e = e1 *conv e2\n", + "e = filter1d_narrow(e1, e2) # e = e1 *filter e2\n", + "\n", "e = kmax_pooling(e1, k) # kmax-pooling operation (Kalchbrenner et al 2014)\n", "e = kmh_ngram(e1, k) # \n", "e = fold_rows(e1, nrows=2) #\n", @@ -170,7 +174,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 6, "metadata": { "collapsed": false }, @@ -181,10 +185,26 @@ "text": [ "added\n", "[1, 2, 3] 1\n", - "3.28097844124\n", + "2.71492385864\n", + "[3, 2, 4] 2\n", + "2.48228144646\n", + "[1, 2, 3] 1\n", + "2.00279903412\n", "[3, 2, 4] 2\n", - "1.66672432423\n", - "0\n" + "1.82602763176\n", + "[1, 2, 3] 1\n", + "1.44809651375\n", + "[3, 2, 4] 2\n", + "1.34181213379\n", + "[1, 2, 3] 1\n", + "1.03570735455\n", + "[3, 2, 4] 2\n", + "0.988352060318\n", + "[1, 2, 3] 1\n", + "0.744616270065\n", + "[3, 2, 4] 2\n", + "0.732948303223\n", + "1\n" ] } ], @@ -195,28 +215,27 @@ "m = Model()\n", "\n", "# add parameters to model\n", - "m.add_parameters(\"W\", (10,30))\n", - "m.add_parameters(\"b\", 10)\n", - "m.add_lookup_parameters(\"lookup\", (500, 10))\n", + "pW = m.add_parameters((10,30))\n", + "pB = m.add_parameters(10)\n", + "lookup = m.add_lookup_parameters((500, 10))\n", "print \"added\"\n", "\n", "# create trainer \n", "trainer = SimpleSGDTrainer(m)\n", "\n", - "# L2 regularization and learning rate parameters can be passed to the trainer:\n", + "# Regularization is set via the --cnn-l2 commandline flag.\n", + "# Learning rate parameters can be passed to the trainer:\n", "# alpha = 0.1 # learning rate\n", - "# lambda = 0.0001 # regularization\n", - "# trainer = SimpleSGDTrainer(m, lam=lambda, e0=alpha)\n", + "# trainer = SimpleSGDTrainer(m, e0=alpha)\n", "\n", "# function for graph creation\n", - "def create_network_return_loss(model, inputs, expected_output):\n", + "def create_network_return_loss(inputs, expected_output):\n", " \"\"\"\n", " inputs is a list of numbers\n", " \"\"\"\n", " renew_cg()\n", - " W = parameter(model[\"W\"])\n", - " b = parameter(model[\"b\"])\n", - " lookup = model[\"lookup\"]\n", + " W = parameter(pW) # from parameters to expressions\n", + " b = parameter(pB)\n", " emb_vectors = [lookup[i] for i in inputs]\n", " net_input = concatenate(emb_vectors)\n", " net_output = softmax( (W*net_input) + b)\n", @@ -224,39 +243,194 @@ " return loss\n", "\n", "# function for prediction\n", - "def create_network_return_best(model, inputs):\n", + "def create_network_return_best(inputs):\n", " \"\"\"\n", " inputs is a list of numbers\n", " \"\"\"\n", " renew_cg()\n", - " W = parameter(model[\"W\"])\n", - " b = parameter(model[\"b\"])\n", - " lookup = model[\"lookup\"]\n", + " W = parameter(pW)\n", + " b = parameter(pB)\n", " emb_vectors = [lookup[i] for i in inputs]\n", " net_input = concatenate(emb_vectors)\n", " net_output = softmax( (W*net_input) + b)\n", - " return np.argmax(net_output)\n", + " return np.argmax(net_output.npvalue())\n", "\n", "\n", "# train network\n", - "for inp,lbl in ( ([1,2,3],1), ([3,2,4],2) ):\n", - " print inp, lbl\n", - " loss = create_network_return_loss(m, inp, lbl)\n", - " print loss.value() # need to run loss.value() for the forward prop\n", - " loss.backward()\n", - " trainer.update()\n", - "\n", - "print create_network_return_best(m, [1,2,3])\n" + "for epoch in xrange(5):\n", + " for inp,lbl in ( ([1,2,3],1), ([3,2,4],2) ):\n", + " print inp, lbl\n", + " loss = create_network_return_loss(inp, lbl)\n", + " print loss.value() # need to run loss.value() for the forward prop\n", + " loss.backward()\n", + " trainer.update()\n", + "\n", + "print create_network_return_best([1,2,3])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "# Recipe (using classes)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3] 1\n", + "2.5900914669\n", + "[3, 2, 4] 2\n", + "2.00347089767\n", + "[1, 2, 3] 1\n", + "1.98409461975\n", + "[3, 2, 4] 2\n", + "1.50869822502\n", + "[1, 2, 3] 1\n", + "1.50195622444\n", + "[3, 2, 4] 2\n", + "1.12316584587\n", + "[1, 2, 3] 1\n", + "1.12293696404\n", + "[3, 2, 4] 2\n", + "0.831095397472\n", + "[1, 2, 3] 1\n", + "0.833912611008\n", + "[3, 2, 4] 2\n", + "0.61754822731\n", + "\n", + "1\n" + ] + } + ], + "source": [ + "from pycnn import *\n", + "# create model\n", + "m = Model()\n", + "\n", + "# create a class encapsulating the network\n", + "class OurNetwork(object):\n", + " # The init method adds parameters to the model.\n", + " def __init__(self, model):\n", + " self.pW = model.add_parameters((10,30))\n", + " self.pB = model.add_parameters(10)\n", + " self.lookup = model.add_lookup_parameters((500,10))\n", + " \n", + " # the __call__ method applies the network to an input\n", + " def __call__(self, inputs):\n", + " W = parameter(self.pW)\n", + " b = parameter(self.pB)\n", + " lookup = self.lookup\n", + " emb_vectors = [lookup[i] for i in inputs]\n", + " net_input = concatenate(emb_vectors)\n", + " net_output = softmax( (W*net_input) + b)\n", + " return net_output\n", + " \n", + " def create_network_return_loss(self, inputs, expected_output):\n", + " renew_cg()\n", + " out = self(inputs)\n", + " loss = -log(pick(out, expected_output))\n", + " return loss\n", + " \n", + " def create_network_return_best(self, inputs):\n", + " renew_cg()\n", + " out = self(inputs)\n", + " return np.argmax(out.npvalue())\n", + " \n", + " \n", + "# create network\n", + "network = OurNetwork(m)\n", + "\n", + "# create trainer \n", + "trainer = SimpleSGDTrainer(m)\n", + " \n", + "# train network\n", + "for epoch in xrange(5):\n", + " for inp,lbl in ( ([1,2,3],1), ([3,2,4],2) ):\n", + " print inp, lbl\n", + " loss = network.create_network_return_loss(inp, lbl)\n", + " print loss.value() # need to run loss.value() for the forward prop\n", + " loss.backward()\n", + " trainer.update()\n", + "\n", + "print\n", + "print network.create_network_return_best([1,2,3])\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## or, alternatively, have the training outside of the network class" ] }, { "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true + "collapsed": false }, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[1, 2, 3] 1\n", + "3.63615298271\n", + "[3, 2, 4] 2\n", + "3.29473733902\n", + "[1, 2, 3] 1\n", + "2.81605744362\n", + "[3, 2, 4] 2\n", + "2.46070289612\n", + "[1, 2, 3] 1\n", + "2.13946056366\n", + "[3, 2, 4] 2\n", + "1.77259361744\n", + "[1, 2, 3] 1\n", + "1.57904195786\n", + "[3, 2, 4] 2\n", + "1.2269589901\n", + "[1, 2, 3] 1\n", + "1.13014268875\n", + "[3, 2, 4] 2\n", + "0.830479979515\n", + "\n", + "1\n" + ] + } + ], + "source": [ + "# create network\n", + "network = OurNetwork(m)\n", + "\n", + "# create trainer \n", + "trainer = SimpleSGDTrainer(m)\n", + " \n", + "# train network\n", + "for epoch in xrange(5):\n", + " for inp,lbl in ( ([1,2,3],1), ([3,2,4],2) ):\n", + " print inp, lbl\n", + " renew_cg()\n", + " out = network(inp)\n", + " loss = -log(pick(out, lbl))\n", + " print loss.value() # need to run loss.value() for the forward prop\n", + " loss.backward()\n", + " trainer.update()\n", + "\n", + "print\n", + "print np.argmax(network([1,2,3]).npvalue())" + ] }, { "cell_type": "code", diff --git a/pyexamples/tutorials/RNNs.ipynb b/pyexamples/tutorials/RNNs.ipynb index 771fa65ae..f79836c0f 100644 --- a/pyexamples/tutorials/RNNs.ipynb +++ b/pyexamples/tutorials/RNNs.ipynb @@ -382,7 +382,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 15, "metadata": { "collapsed": false, "scrolled": true @@ -392,7 +392,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[exprssion 248/0, exprssion 254/0, exprssion 260/0] [(exprssion 246/0, exprssion 248/0), (exprssion 251/0, exprssion 254/0), (exprssion 257/0, exprssion 260/0)]\n" + "[exprssion 200/0, exprssion 206/0, exprssion 212/0] [(exprssion 198/0, exprssion 200/0), (exprssion 203/0, exprssion 206/0), (exprssion 209/0, exprssion 212/0)]\n" ] } ], @@ -419,7 +419,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -428,7 +428,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[exprssion 280/0, exprssion 286/0, exprssion 292/0]\n" + "[exprssion 216/0, exprssion 222/0, exprssion 228/0]\n" ] } ], @@ -453,7 +453,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -480,7 +480,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -492,9 +492,10 @@ "srnn = SimpleRNNBuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, model)\n", "lstm = LSTMBuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, model)\n", "\n", - "model.add_lookup_parameters(\"lookup\", (VOCAB_SIZE, INPUT_DIM))\n", - "model.add_parameters(\"R\", (VOCAB_SIZE, HIDDEN_DIM))\n", - "model.add_parameters(\"bias\", (VOCAB_SIZE))\n", + "params = {}\n", + "params[\"lookup\"] = model.add_lookup_parameters((VOCAB_SIZE, INPUT_DIM))\n", + "params[\"R\"] = model.add_parameters((VOCAB_SIZE, HIDDEN_DIM))\n", + "params[\"bias\"] = model.add_parameters((VOCAB_SIZE))\n", "\n", "# return compute loss of RNN for one sentence\n", "def do_one_sentence(rnn, sentence):\n", @@ -503,9 +504,9 @@ " s0 = rnn.initial_state()\n", " \n", " \n", - " R = parameter(model[\"R\"])\n", - " bias = parameter(model[\"bias\"])\n", - " lookup = model[\"lookup\"]\n", + " R = parameter(params[\"R\"])\n", + " bias = parameter(params[\"bias\"])\n", + " lookup = params[\"lookup\"]\n", " sentence = [\"\"] + list(sentence) + [\"\"]\n", " sentence = [char2int[c] for c in sentence]\n", " s = s0\n", @@ -531,9 +532,9 @@ " renew_cg()\n", " s0 = rnn.initial_state()\n", " \n", - " R = parameter(model[\"R\"])\n", - " bias = parameter(model[\"bias\"])\n", - " lookup = model[\"lookup\"]\n", + " R = parameter(params[\"R\"])\n", + " bias = parameter(params[\"bias\"])\n", + " lookup = params[\"lookup\"]\n", " \n", " s = s0.add_input(lookup[char2int[\"\"]])\n", " out=[]\n", @@ -574,7 +575,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "metadata": { "collapsed": false }, @@ -583,46 +584,46 @@ "name": "stdout", "output_type": "stream", "text": [ - "148.033477783 uloocopmczrrjnai funpgrh gn\n", - "91.8539962769 nonfg rujw ogil rz bfagqome doouqarbayv nkfkq fa ryeafeoi\n", - "54.739528656 fie qmek tgs uzv\n", - "30.164937973 z ouwu ol ruiheb \n", - "10.7598457336 a fuic\n", - "3.2049407959 a quico bgow ary dufox oumped over the lazy dog\n", - "1.03240394592 a quick brown fox jumped over the lazy dog\n", - "0.650553286076 a quick brown fox jumped over the lazy dog\n", - "0.47541359067 a qukck brown fox jumped over the lazy dog\n", - "0.374430119991 a quick brown fox jumped over the lazy dog\n", - "0.308728694916 a quick brown fox jumped over the lazy dog\n", - "0.262536674738 a quick brown fox jumped over the lazy dog\n", - "0.22830298543 a quick brown fox jumped over the lazy dog\n", - "0.201896265149 a quick brown fox jumped over the lazy dog\n", - "0.180914476514 a quick brown fox jumped over the lazy dog\n", - "0.1638764292 a quick brown fox jumped over the lazy dog\n", - "0.149730876088 a quick brown fox jumped over the lazy dog\n", - "0.137800350785 a quick brown fox jumped over the lazy dog\n", - "0.127627104521 a quick brown fox jumped over the lazy dog\n", - "0.118834555149 a quick brown fox jumped over the lazy dog\n", - "0.111203595996 a quick brown fox jumped over the lazy dog\n", - "0.104423552752 a quick brown fox jumped over the lazy dog\n", - "0.0984442383051 a quick brown fox jumped over the lazy dog\n", - "0.0930855795741 a quick brown fox jumped over the lazy dog\n", - "0.0882897824049 a quick brown fox jumped over the lazy dog\n", - "0.0839573442936 a quick brown fox jumped over the lazy dog\n", - "0.0800611972809 a quick brown fox jumped over the lazy dog\n", - "0.0764751881361 a quick brown fox jumped over the lazy dog\n", - "0.0732067674398 a quick brown fox jumped over the lazy dog\n", - "0.0701641961932 a quick brown fox jumped over the lazy dog\n", - "0.0673855319619 a quick brown fox jumped over the lazy dog\n", - "0.0648249685764 a quick brown fox jumped over the lazy dog\n", - "0.0623983256519 a quick brown fox jumped over the lazy dog\n", - "0.060231667012 a quick brown fox jumped over the lazy dog\n", - "0.0581797286868 a quick brown fox jumped over the lazy dog\n", - "0.0562158599496 a quick brown fox jumped over the lazy dog\n", - "0.0544277988374 a quick brown fox jumped over the lazy dog\n", - "0.0527582615614 a quick brown fox jumped over the lazy dog\n", - "0.0511232204735 a quick brown fox jumped over the lazy dog\n", - "0.0496219098568 a quick brown fox jumped over the lazy dog\n" + "142.737915039 lvawhaevbxulc yxg esuh vkyb gymj dzcnwgq dcjzzk\n", + "84.1147460938 woifoa odp jpt gxjofkaattj\n", + "44.212223053 a q io uoopr ouxducmwi jfxa j\n", + "23.4485988617 p tctflr\n", + "9.73490333557 w\n", + "3.23773050308 yaqzteu pux oa rntd bxumu yyvvfalejuyhed over the lazy dog\n", + "1.06309330463 a quick browe fow jumped over the lazy dog\n", + "0.671298980713 a quick broyn ox jumped over the lazy dog\n", + "0.490513861179 a quick brown fox jumped over the lazy dog\n", + "0.386095941067 a quick brown fox jumped over the lazy dog\n", + "0.318082690239 a quick brown fox jumped over the lazy dog\n", + "0.270276993513 a quick brown fox jumped over the lazy dog\n", + "0.234851941466 a quick brown foz jumped over the lazy dog\n", + "0.207555636764 a quick brown fox jumped over the lazy dog\n", + "0.185884565115 a quick brown fox jumped over the lazy dog\n", + "0.168265148997 a quiuk brown fox jumped over jhe lazy dog\n", + "0.153665527701 a quick brown fox jumped over the lazy dog\n", + "0.141367897391 a quick brown fox jumped over the lazy dog\n", + "0.130873680115 a quick brown fox jumped over the lazy dog\n", + "0.121810980141 a quick brown fox jumped over the lazy dog\n", + "0.113908931613 a quick brown fox jumped over the lazy dog\n", + "0.106958284974 a quick brown fox jumped over the lazy dog\n", + "0.100796818733 a quick brown fox jumped over the lazy dog\n", + "0.0953008085489 a quick brown fox jumped over the lazy dog\n", + "0.090367347002 a zuick brown for jumped over the lazy dog\n", + "0.0859087407589 a quick brown fox jumped over the lazy dog\n", + "0.0818664133549 a quick brown fox jumped over the lazy dog\n", + "0.0781841799617 a quick brown fox jumped over the lazy dog\n", + "0.0748091414571 a quick brown fox jumped over the lazy dog\n", + "0.0717144161463 a quick brown fox jumped over the lazy dog\n", + "0.0688648074865 a quick brown fox jumped over the lazy dog\n", + "0.0662328600883 a quick brown fox jumped over the lazy dog\n", + "0.0637853741646 a quick brown fox jumped over the lazy dog\n", + "0.0615109689534 a quick brown fox jumped over the lazy dog\n", + "0.0593910999596 a quick brown fox jumped over the lazy dog\n", + "0.0574130378664 a quick brown fox jumped over the lazy dog\n", + "0.0555621087551 a quick brown fox jumped over the lazy dog\n", + "0.0538215488195 a quick brown fox jumped over the lazy dog\n", + "0.0521896965802 a quick brown fox jumped over the lazy dog\n", + "0.0506477579474 a quick brown fox jumped over the lazy dog\n" ] } ], @@ -633,7 +634,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "metadata": { "collapsed": false }, @@ -642,46 +643,46 @@ "name": "stdout", "output_type": "stream", "text": [ - "137.304412842 prmnuxlwid d ux udn o axez da lxojhfu dp z\n", - "129.910614014 skedaeip m vn eji ru w \n", - "124.140289307 y ogzi d uj ch oaoag p ivo c ft ghd rl od vqo p rm pottx e ehrto odou pky ojmoxurootff r mhe u\n", - "111.025337219 r ktue wkxu\n", - "98.0487518311 ckx roxy oinad juee reee yrhs wddt cr hej qvpn to ah jplfee h cejte yh\n", - "81.2529830933 d roqo cbn uotx uojp dncfooar gdpbooguy \n", - "68.0369262695 lu gu zupn oxe ex ghd fhx jzr dom eahpfm\n", - "54.3006706238 jc cg uupkbkoogvwo no\n", - "42.3075561523 uqci jufk def rw ummtl uik born uuuii bkrn dokn rfow lup\n", - "31.4120750427 br dtojej\n", - "22.4915180206 aa quick brown oox fumpfeer over the ol\n", - "15.6982011795 qxic bbrwn fox jumpjoer ooe laz doe\n", - "10.5527915955 d gbrown fox jumped overat\n", - "6.46443843842 l qumpd dog\n", - "3.84945011139 a quick brown fox ee lzt jmmped over the lazy dog\n", - "2.08847999573 a quick brown fox jumped over the lazy dog\n", - "1.49571335316 a quick brown fox jumped over the lazy dog\n", - "1.15657103062 a quicb brown fox jumped over the lazy dog\n", - "0.938805937767 a quick brown fox jumped over tan fover the lazy dog\n", - "0.788115262985 a quick brown fox jumped over ohe lazy dog\n", - "0.678014576435 a quick brown fox jumped over the lazy dog\n", - "0.594275057316 a quick brown fox jumped over the lazy dog\n", - "0.52849572897 a quicqk brown fox jumped over the lazy dog\n", - "0.4755628407 a quick brown fox jumped over the lazy dog\n", - "0.432055711746 x quick brown fox jumped over the lazy dog\n", - "0.39562445879 a quick broon fox jumped over the lazy dog\n", - "0.364839941263 a quick brown fox jumped over the lazed over the lazy dog\n", - "0.338363438845 a quick brown fox jumped over the lazy dog\n", - "0.315368592739 a quick brown fox jumped over the lazy dog\n", - "0.295288294554 a quik brown fox jumped over the lazy dog\n", - "0.277546137571 a quick brown fox jumped over the lazy dog\n", - "0.261784315109 a quick brown fox jumped over the lazy dog\n", - "0.2476875633 a quick brown fox jumpeef over the lazy dog\n", - "0.234950631857 a quick brown fox jumped over the lazy dog\n", - "0.223440438509 a quick brown fox jumped over the lazy dog\n", - "0.21306720376 a quick buown fox jumped over the lazy dog\n", - "0.2035497576 a quick brown fox jumped over the lazed overr the lazy dog\n", - "0.194814369082 a kuickk qown fox jumped over the lazy dog\n", - "0.18677970767 a quick brown fox jumped over the lazy dog\n", - "0.179387688637 aa quick brown fox jumped over the lazy dog\n" + "141.891098022 aoyekppy mocalmz xk atc jlg oaddk\n", + "128.925964355 hempeyud ki\n", + "121.445785522 qpveti fyobec ztmr eioknnueh ehecdvabxmc ydpmdm\n", + "110.670722961 z buws lmy vvrw\n", + "93.5055999756 vueoa cprlnkrd o ocazk nb olegiep o fftr t\n", + "82.1586227417 zj rvsr oej c toz bnarreow fffj\n", + "67.430847168 rzfik qoyc ohe hqe oea uitet ou udjkpme oak kdk oe fbu kcz fox dfoprl too o rxat luurnfowrrtj rbtram to url xlj okrr ooe otm hcy roab llsg doy ifzw rrbow rbowwb oke jxpee\n", + "54.9477920532 ba uiy doge she ueeze oejv\n", + "43.3301696777 qquc crgibbroej oxne ove rr\n", + "34.4687461853 uqckk owrbfo og uouk doge l\n", + "25.5408306122 reuk lfr own fox juamd ov\n", + "18.9417610168 qojn doo broww boan jover txe zacy moen crlw numk fox joge overwa trez quqk browx ox ruor oro fow j uoez kon fror bowe luccmd ogwr foy jodmoed ox\n", + "13.1646575928 qucy dov\n", + "9.46595668793 wiuuik brttxl laed over tre lazy dog\n", + "5.6522898674 rukc irown fox juaped over the lazy dov\n", + "3.38144731522 a quick brown fox jumver the lazy dog\n", + "1.80010521412 a bfoin fox jumped ovk fox luick brown fox jumped over the lazy dog\n", + "1.30616080761 a quic brownn fox jumped over the lazy dog\n", + "1.02201879025 a quick brown fox jumped over the lazy dog\n", + "0.83735615015 qucck brown fox jcmped over the lazy dog\n", + "0.708056390285 a quickz brown fox jumped over the lazy dog\n", + "0.612650871277 a quick brown fox jumped over the lazy dog\n", + "0.539469838142 a quick brown fox jumped over thel lazy dog\n", + "0.481610894203 va quick brown fox jumped over the lazy dog\n", + "0.434762001038 a quuck dovtbown fox jumped over the lazy dog\n", + "0.396079242229 a quick brown fox jumped over the lazy dog\n", + "0.363606244326 a quick brown fox jumped over the laza dog\n", + "0.335973978043 a quick brown fox jumped over the lazy dog\n", + "0.312186658382 a quick brown fox jumped over the lazy dog\n", + "0.291498303413 a quick brown fox qu\n", + "0.273335546255 a quick brown fox jumped ove\n", + "0.257278442383 a quick brown fox jumped over the lazy dog\n", + "0.242971763015 a quick brown fox jumped over the lazy dog\n", + "0.230153128505 a quick brown fox jumped over the lazy dog\n", + "0.218599274755 a quick brown fox jumped over the lazy dog\n", + "0.208135351539 a quick brown fox jumped over the lazy dog\n", + "0.198613137007 a quick brown fox jumped over tie lazy dog\n", + "0.189909905195 a quick brown fox jumped over the lazy dog\n", + "0.181928783655 a quick brown fox jumped over the lazy dog\n", + "0.174587100744 a quick brown fox jumped over the lazy dog\n" ] } ], @@ -710,7 +711,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "metadata": { "collapsed": false }, @@ -719,52 +720,70 @@ "name": "stdout", "output_type": "stream", "text": [ - "316.059265137 a quick brown fox jumped over the lazy dog\n", - "97.8145599365 a quick brown fox jumped over the lazy dog\n", - "52.8635063171 a quickxbrown fox jumped over therntz\n", - "24.4791564941 a quick brown fox jumped over thirn vr the n pritu\n", - "4.01108551025 thece prejzels are muking mre n the laz oakd gretzels are mupte\n", - "1.92300200462 these pretzels are making me thirsty\n", - "0.39481985569 these pretzels are making me thirsty\n", - "0.135318264365 these pretzels are making me thirsty\n", - "0.101885713637 these pretzels are making me thirsty\n", - "0.0829276740551 these pretzels are making me thirsty\n", - "0.0703410431743 these pretzels are making me thirsty\n", - "0.0612589642406 these pretzels are making me thirsty\n", - "0.054374050349 these pretzels are making me thirsty\n", - "0.0489393435419 these pretzels are making me thirsty\n", - "0.0445105880499 these pretzels are making me thirsty\n", - "0.0409039668739 these pretzels are making me thirsty\n", - "0.0377906225622 these pretzels are making me thirsty\n", - "0.0351626649499 these pretzels are making me thirsty\n", - "0.0328748859465 these pretzels are making me thirsty\n", - "0.0309081021696 these pretzels are making me thirsty\n", - "0.0291361920536 these pretzels are making me thirsty\n", - "0.0275705922395 these pretzels are making me thirsty\n", - "0.0261883735657 these pretzels are making me thirsty\n", - "0.0249245800078 these pretzels are making me thirsty\n", - "0.0237868223339 these pretzels are making me thirsty\n", - "0.0227445568889 these pretzels are making me thirsty\n", - "0.0217939633876 these pretzels are making me thirsty\n", - "0.020915934816 these pretzels are making me thirsty\n", - "0.0200990028679 these pretzels are making me thirsty\n", - "0.0193889811635 these pretzels are making me thirsty\n", - "0.0187018848956 these pretzels are making me thirsty\n", - "0.0180453378707 these pretzels are making me thirsty\n", - "0.017415529117 these pretzels are making me thirsty\n", - "0.016888782382 these pretzels are making me thirsty\n", - "0.0163544174284 these pretzels are making me thirsty\n", - "0.0158963911235 these pretzels are making me thirsty\n", - "0.0153925828636 these pretzels are making me thirsty\n", - "0.0149803832173 these pretzels are making me thirsty\n", - "0.0145872598514 these pretzels are making me thirsty\n", - "0.0141636235639 these pretzels are making me thirsty\n" + "332.651580811 a quick brown fox jumped over the lazy dog\n", + "133.209350586 a quick brown fox jumped over the lazy doe hu yum xd the\n", + "65.0720596313 azquick brown fox jumped over ohe iog\n", + "31.5592880249 a quick brown fox jumpedrovtretpede pretzelz are makink ma tui idmilt\n", + "13.2322559357 theve prwtumpede mhxtjaypny mreticv\n", + "1.87829053402 thele pretzelb mre laki loet dre za tuiri mtoina ma qui irwt ere sa taetsdaca qamtuioe ma ick mrolnn mhetsirstyyza qa luijuoethetsepsaaya quirk brmtze ehersjlyaa aumu orkrbtoeqz lrea quijk jrowza quiquihi sakiny mr tui ss thels theqetursy famtzi maethehe iretza lamqzd zretsels area qhirk browna yhetza quirkt rxkwn mox ja isi mq thirsty\n", + "0.680327475071 these pretzels are makind me thirsty\n", + "0.176128521562 these pretzels are making me thirsty\n", + "0.126334354281 these pretzels are making me thirsty\n", + "0.10075186193 these pretzels are making me thirsty\n", + "0.0846510156989 these pretzels are making me thirsty\n", + "0.0734022557735 these pretzels are making me thirsty\n", + "0.0650328546762 these pretzels are making me thirsty\n", + "0.0585154108703 these pretzels are making me thirsty\n", + "0.0532807298005 these pretzels are making me thirsty\n", + "0.0489665567875 these pretzels are making me thirsty\n", + "0.0453444086015 these pretzels are making me thirsty\n", + "0.0422535128891 these pretzels are making me thirsty\n", + "0.0395833179355 these pretzels are making me thirsty\n", + "0.0372485220432 these mretzels are making me thirsty\n", + "0.0351839251816 these pretzels are making me thirsty\n", + "0.0333509668708 these pretzels are making me thirsty\n", + "0.0317104011774 these pretzels are making me thirsty\n", + "0.0302277039737 these pretzels are making me thirsty\n", + "0.0288887582719 these pretzels are making me thirsty\n", + "0.0276643745601 these pretzels are making me thirsty\n", + "0.0265435613692 these pretzels are making me thirsty\n", + "0.0255212895572 these pretzels are making me thirsty\n", + "0.0245705824345 these pretzels are making me thirsty\n", + "0.0236932244152 these pretzels are making me thirsty\n", + "0.0228785891086 these pretzels are making me thirsty\n", + "0.0221205893904 these pretzels are making me thirsty\n", + "0.0214090794325 these pretzels are making me thirsty\n", + "0.0207556784153 these pretzels are making me thirsty\n", + "0.0201329570264 these pretzels are making me thirsty\n", + "0.0195484217256 these pretzels are making me thirsty\n", + "0.0190003421158 these pretzels are making me thirsty\n", + "0.0184785164893 these pretzels are making me thirsty\n", + "0.0179911740124 these pretzels are making me thirsty\n", + "0.0175334792584 these pretzels are making me thirsty\n" ] } ], "source": [ "train(srnn, \"these pretzels are making me thirsty\")" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/pyexamples/tutorials/tutorial-1-xor.ipynb b/pyexamples/tutorials/tutorial-1-xor.ipynb index d1a51617a..fb95ba07e 100644 --- a/pyexamples/tutorials/tutorial-1-xor.ipynb +++ b/pyexamples/tutorials/tutorial-1-xor.ipynb @@ -80,16 +80,16 @@ "source": [ "# create a model and add the parameters.\n", "m = Model()\n", - "m.add_parameters(\"W\", (8,2))\n", - "m.add_parameters(\"V\", (1,8))\n", - "m.add_parameters(\"b\", (8))\n", + "pW = m.add_parameters((8,2))\n", + "pV = m.add_parameters((1,8))\n", + "pb = m.add_parameters((8))\n", "\n", "renew_cg() # new computation graph. not strictly needed here, but good practice.\n", "\n", "# associate the parameters with cg Expressions\n", - "W = parameter(m[\"W\"])\n", - "V = parameter(m[\"V\"])\n", - "b = parameter(m[\"b\"])" + "W = parameter(pW)\n", + "V = parameter(pV)\n", + "b = parameter(pb)" ] }, { @@ -102,14 +102,14 @@ { "data": { "text/plain": [ - "[-0.391936719417572,\n", - " 0.4916459918022156,\n", - " -0.471852570772171,\n", - " 0.8333062529563904,\n", - " -0.6168352961540222,\n", - " -0.2860015630722046,\n", - " 0.13444989919662476,\n", - " -0.7587275505065918]" + "[-0.5920619964599609,\n", + " -0.4818088114261627,\n", + " -0.011437613517045975,\n", + " -0.7547096610069275,\n", + " 0.2887613773345947,\n", + " -0.39806437492370605,\n", + " -0.8494511246681213,\n", + " 0.295582115650177]" ] }, "execution_count": 3, @@ -155,7 +155,7 @@ { "data": { "text/plain": [ - "0.46759992837905884" + "0.706532895565033" ] }, "execution_count": 5, @@ -193,8 +193,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "-0.510900914669\n", - "0.916177868843\n" + "1.25551486015\n", + "0.335373580456\n" ] } ], @@ -240,7 +240,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 9, "metadata": { "collapsed": false }, @@ -249,8 +249,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "the loss before step is: 0.237541377544\n", - "the loss after step is: 0.215936839581\n" + "the loss before step is: 0.335373580456\n", + "the loss after step is: 0.296859383583\n" ] } ], @@ -281,7 +281,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 10, "metadata": { "collapsed": true }, @@ -310,7 +310,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 11, "metadata": { "collapsed": false }, @@ -319,86 +319,86 @@ "name": "stdout", "output_type": "stream", "text": [ - "average loss is: -0.0736760540307\n", - "average loss is: -0.0431773296744\n", - "average loss is: -0.0329923908412\n", - "average loss is: -0.0265793037787\n", - "average loss is: -0.0219315118343\n", - "average loss is: -0.0185768032136\n", - "average loss is: -0.0160888710139\n", - "average loss is: -0.0141828030394\n", - "average loss is: -0.0126798275403\n", - "average loss is: -0.0114656574577\n", - "average loss is: -0.0104649186862\n", - "average loss is: -0.00962608709466\n", - "average loss is: -0.0089128920701\n", - "average loss is: -0.00829910863324\n", - "average loss is: -0.00776528354424\n", - "average loss is: -0.00729674054834\n", - "average loss is: -0.00688219008419\n", - "average loss is: -0.00651278639471\n", - "average loss is: -0.00618152223086\n", - "average loss is: -0.00588276661444\n", - "average loss is: -0.00561194644775\n", - "average loss is: -0.00536530932623\n", - "average loss is: -0.00513974289653\n", - "average loss is: -0.00493264887171\n", - "average loss is: -0.00474184197951\n", - "average loss is: -0.00456546585523\n", - "average loss is: -0.00440193738926\n", - "average loss is: -0.00424990062352\n", - "average loss is: -0.00410817924357\n", - "average loss is: -0.00397575346412\n", - "average loss is: -0.00385173368884\n", - "average loss is: -0.0037353409997\n", - "average loss is: -0.00362589035656\n", - "average loss is: -0.00352277747492\n", - "average loss is: -0.0034254647359\n", - "average loss is: -0.00333347332166\n", - "average loss is: -0.0032463763395\n", - "average loss is: -0.00316379235218\n", - "average loss is: -0.00308537749233\n", - "average loss is: -0.00301082218514\n", - "average loss is: -0.00293984767561\n", - "average loss is: -0.00287220093921\n", - "average loss is: -0.0028076520279\n", - "average loss is: -0.00274599160401\n", - "average loss is: -0.00268702900767\n", - "average loss is: -0.00263059020554\n", - "average loss is: -0.00257651594453\n", - "average loss is: -0.00252466075627\n", - "average loss is: -0.00247489001897\n", - "average loss is: -0.00242707972354\n", - "average loss is: -0.00238111569624\n", - "average loss is: -0.00233689236173\n", - "average loss is: -0.00229431213741\n", - "average loss is: -0.00225328474719\n", - "average loss is: -0.00221372625837\n", - "average loss is: -0.00217555890941\n", - "average loss is: -0.00213871019562\n", - "average loss is: -0.00210311289732\n", - "average loss is: -0.00206870423375\n", - "average loss is: -0.00203542506477\n", - "average loss is: -0.00200322053556\n", - "average loss is: -0.00197203894936\n", - "average loss is: -0.00194183212189\n", - "average loss is: -0.00191255454974\n", - "average loss is: -0.00188416398736\n", - "average loss is: -0.00185662054628\n", - "average loss is: -0.00182988676211\n", - "average loss is: -0.00180392725441\n", - "average loss is: -0.00177870851088\n", - "average loss is: -0.00175419908922\n", - "average loss is: -0.00173036946333\n", - "average loss is: -0.00170719160213\n", - "average loss is: -0.00168463913631\n", - "average loss is: -0.00166268690267\n", - "average loss is: -0.0016413110688\n", - "average loss is: -0.00162048917527\n", - "average loss is: -0.00160019980025\n", - "average loss is: -0.00158042266556\n", - "average loss is: -0.0015611385186\n", - "average loss is: -0.00154232902762\n" + "average loss is: 0.730996069312\n", + "average loss is: 0.686455376148\n", + "average loss is: 0.614968097508\n", + "average loss is: 0.529396591447\n", + "average loss is: 0.454356552631\n", + "average loss is: 0.39492503399\n", + "average loss is: 0.348310606687\n", + "average loss is: 0.311234809482\n", + "average loss is: 0.281200638587\n", + "average loss is: 0.256437818106\n", + "average loss is: 0.235696636033\n", + "average loss is: 0.218082525641\n", + "average loss is: 0.202943060785\n", + "average loss is: 0.189793206944\n", + "average loss is: 0.178265773896\n", + "average loss is: 0.168078109015\n", + "average loss is: 0.15900931143\n", + "average loss is: 0.150884356805\n", + "average loss is: 0.143562835396\n", + "average loss is: 0.136930837112\n", + "average loss is: 0.130894997159\n", + "average loss is: 0.125378077089\n", + "average loss is: 0.120315633187\n", + "average loss is: 0.115653475622\n", + "average loss is: 0.111345707807\n", + "average loss is: 0.107353201057\n", + "average loss is: 0.103642390902\n", + "average loss is: 0.100184321725\n", + "average loss is: 0.0969538828368\n", + "average loss is: 0.0939291894056\n", + "average loss is: 0.0910910811149\n", + "average loss is: 0.0884227104994\n", + "average loss is: 0.0859092032744\n", + "average loss is: 0.0835373785728\n", + "average loss is: 0.0812955136038\n", + "average loss is: 0.0791731475857\n", + "average loss is: 0.0771609158713\n", + "average loss is: 0.0752504101568\n", + "average loss is: 0.0734340592178\n", + "average loss is: 0.0717050271845\n", + "average loss is: 0.0700571256665\n", + "average loss is: 0.0684847396141\n", + "average loss is: 0.0669827620572\n", + "average loss is: 0.0655465372522\n", + "average loss is: 0.0641718128339\n", + "average loss is: 0.0628546962203\n", + "average loss is: 0.0615916178524\n", + "average loss is: 0.0603792975615\n", + "average loss is: 0.0592147165184\n", + "average loss is: 0.0580950913344\n", + "average loss is: 0.0570178513814\n", + "average loss is: 0.0559806190546\n", + "average loss is: 0.0549811920022\n", + "average loss is: 0.0540175269391\n", + "average loss is: 0.0530877257938\n", + "average loss is: 0.0521900229302\n", + "average loss is: 0.0513227736969\n", + "average loss is: 0.0504844442235\n", + "average loss is: 0.0496736022536\n", + "average loss is: 0.0488889090025\n", + "average loss is: 0.0481291114653\n", + "average loss is: 0.0473930355647\n", + "average loss is: 0.0466795804093\n", + "average loss is: 0.0459877123818\n", + "average loss is: 0.0453164599289\n", + "average loss is: 0.0446649091876\n", + "average loss is: 0.0440321997496\n", + "average loss is: 0.0434175205679\n", + "average loss is: 0.0428201068594\n", + "average loss is: 0.042239236579\n", + "average loss is: 0.041674227424\n", + "average loss is: 0.0411244342562\n", + "average loss is: 0.0405892467939\n", + "average loss is: 0.0400680867989\n", + "average loss is: 0.0395604063634\n", + "average loss is: 0.0390656857708\n", + "average loss is: 0.0385834318376\n", + "average loss is: 0.0381131761705\n", + "average loss is: 0.037654473684\n", + "average loss is: 0.0372069010154\n" ] } ], @@ -425,7 +425,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -434,10 +434,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "0,1 0.998457551003\n", - "1,0 0.998303294182\n", - "0,0 0.00132494198624\n", - "1,1 0.00213180552237\n" + "0,1 0.998090803623\n", + "1,0 0.998076915741\n", + "0,0 0.00135990511626\n", + "1,1 0.00213058013469\n" ] } ], @@ -464,7 +464,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -472,17 +472,17 @@ { "data": { "text/plain": [ - "array([[ 1.90704894, 1.75941706],\n", - " [-0.51026875, -0.73472238],\n", - " [ 1.00825202, 0.86155057],\n", - " [-1.68297076, -1.80956674],\n", - " [-1.2174753 , -1.15852094],\n", - " [-3.23514462, 2.84460068],\n", - " [ 1.63482118, 1.50156498],\n", - " [ 2.60078287, -3.01065731]])" + "array([[ 1.26847982, 1.25287616],\n", + " [ 0.91610891, 0.80253637],\n", + " [ 3.18741179, -2.58643913],\n", + " [-0.82472938, -0.68830448],\n", + " [-2.74162889, 3.30151606],\n", + " [ 0.2677069 , 0.46926948],\n", + " [-2.60197234, -2.61786079],\n", + " [ 0.89582258, -0.44721049]])" ] }, - "execution_count": 22, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -493,7 +493,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -501,11 +501,11 @@ { "data": { "text/plain": [ - "array([[ 2.06817722, 0.85734618, 0.69402838, 3.06676149, -1.10298848,\n", - " 5.04940414, 1.77656221, 4.74531031]])" + "array([[-2.33788562, -1.54022419, -4.58266163, -0.91096258, -4.88002253,\n", + " -0.70912606, -4.09791088, -0.61150461]])" ] }, - "execution_count": 23, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -516,7 +516,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 15, "metadata": { "collapsed": false }, @@ -524,17 +524,17 @@ { "data": { "text/plain": [ - "[-0.5166335701942444,\n", - " 0.8676984906196594,\n", - " 0.008914745412766933,\n", - " 2.637610912322998,\n", - " 0.019709745422005653,\n", - " -1.4869117736816406,\n", - " -0.33558133244514465,\n", - " -1.3341320753097534]" + "[-1.9798537492752075,\n", + " -1.3854612112045288,\n", + " 1.2350027561187744,\n", + " -0.8094932436943054,\n", + " 1.3227168321609497,\n", + " -0.5688062906265259,\n", + " 0.9074684381484985,\n", + " 0.21831640601158142]" ] }, - "execution_count": 24, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -553,7 +553,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -562,103 +562,103 @@ "name": "stdout", "output_type": "stream", "text": [ - "average loss is: 0.000710777640343\n", - "average loss is: 0.00538051903248\n", - "average loss is: 0.008753751417\n", - "average loss is: 0.00962603349239\n", - "average loss is: 0.00916970175505\n", - "average loss is: 0.00848576014241\n", - "average loss is: 0.00780005061201\n", - "average loss is: 0.0071754240524\n", - "average loss is: 0.0066243140565\n", - "average loss is: 0.00614239533804\n", - "average loss is: 0.00572097523307\n", - "average loss is: 0.00535109124146\n", - "average loss is: 0.00502474307441\n", - "average loss is: 0.00473515995978\n", - "average loss is: 0.00447674103267\n", - "average loss is: 0.00424488715769\n", - "average loss is: 0.00403580133858\n", - "average loss is: 0.00384634935659\n", - "average loss is: 0.00367392660486\n", - "average loss is: 0.00351635961281\n", - "average loss is: 0.00337182009371\n", - "average loss is: 0.00323876434577\n", - "average loss is: 0.00311587982183\n", - "average loss is: 0.00300204546501\n", - "average loss is: 0.0028963002421\n", - "average loss is: 0.00279780962182\n", - "average loss is: 0.00270585036854\n", - "average loss is: 0.00261979493978\n", - "average loss is: 0.00253909190298\n", - "average loss is: 0.00246325349792\n", - "average loss is: 0.00239185206555\n", - "average loss is: 0.0023245080647\n", - "average loss is: 0.00226088441619\n", - "average loss is: 0.00220067988526\n", - "average loss is: 0.00214362350718\n", - "average loss is: 0.00208947365366\n", - "average loss is: 0.0020380129623\n", - "average loss is: 0.00198904496207\n", - "average loss is: 0.00194239226152\n", - "average loss is: 0.00189789384627\n", - "average loss is: 0.00185540357037\n", - "average loss is: 0.00181478771642\n", - "average loss is: 0.00177592387499\n", - "average loss is: 0.00173870052693\n", - "average loss is: 0.0017030151133\n", - "average loss is: 0.00166877407409\n", - "average loss is: 0.00163589137076\n", - "average loss is: 0.00160428755732\n", - "average loss is: 0.00157388916344\n", - "average loss is: 0.00154462760519\n", - "average loss is: 0.00151644010562\n", - "average loss is: 0.00148926836801\n", - "average loss is: 0.00146305795107\n", - "average loss is: 0.00143775891996\n", - "average loss is: 0.00141332406345\n", - "average loss is: 0.00138970975105\n", - "average loss is: 0.00136687505267\n", - "average loss is: 0.00134478173209\n", - "average loss is: 0.00132339411352\n", - "average loss is: 0.00130267874258\n", - "average loss is: 0.00128260426256\n", - "average loss is: 0.00126314118082\n", - "average loss is: 0.0012442619527\n", - "average loss is: 0.00122594058595\n", - "average loss is: 0.00120815254805\n", - "average loss is: 0.00119087479342\n", - "average loss is: 0.00117408560255\n", - "average loss is: 0.00115776436539\n", - "average loss is: 0.00114189174765\n", - "average loss is: 0.00112644939362\n", - "average loss is: 0.00111142013773\n", - "average loss is: 0.00109678746174\n", - "average loss is: 0.00108253585497\n", - "average loss is: 0.0010686503392\n", - "average loss is: 0.00105511702904\n", - "average loss is: 0.00104192272314\n", - "average loss is: 0.00102905462018\n", - "average loss is: 0.00101650077129\n", - "average loss is: 0.0010042497123\n", - "average loss is: 0.000992290693015\n" + "average loss is: 0.725458401442\n", + "average loss is: 0.656036808193\n", + "average loss is: 0.563800293456\n", + "average loss is: 0.473188629244\n", + "average loss is: 0.401578919515\n", + "average loss is: 0.347210133697\n", + "average loss is: 0.30537398648\n", + "average loss is: 0.27243115149\n", + "average loss is: 0.245902155418\n", + "average loss is: 0.22411154042\n", + "average loss is: 0.205906257995\n", + "average loss is: 0.190473453378\n", + "average loss is: 0.177226172269\n", + "average loss is: 0.165731058566\n", + "average loss is: 0.155661680364\n", + "average loss is: 0.146767699362\n", + "average loss is: 0.138854031509\n", + "average loss is: 0.131766459678\n", + "average loss is: 0.125381493949\n", + "average loss is: 0.119599098227\n", + "average loss is: 0.114337381247\n", + "average loss is: 0.109528665657\n", + "average loss is: 0.105116533384\n", + "average loss is: 0.101053577985\n", + "average loss is: 0.0972996741069\n", + "average loss is: 0.093820632044\n", + "average loss is: 0.0905871372991\n", + "average loss is: 0.0875739114509\n", + "average loss is: 0.0847590394488\n", + "average loss is: 0.0821234288742\n", + "average loss is: 0.079650368163\n", + "average loss is: 0.0773251660003\n", + "average loss is: 0.0751348558335\n", + "average loss is: 0.0730679483965\n", + "average loss is: 0.0711142273374\n", + "average loss is: 0.0692645774255\n", + "average loss is: 0.0675108397355\n", + "average loss is: 0.0658456894337\n", + "average loss is: 0.0642625315812\n", + "average loss is: 0.0627554119665\n", + "average loss is: 0.0613189413034\n", + "average loss is: 0.059948229676\n", + "average loss is: 0.0586388300699\n", + "average loss is: 0.05738668844\n", + "average loss is: 0.0561881021362\n", + "average loss is: 0.0550396820511\n", + "average loss is: 0.0539383201534\n", + "average loss is: 0.0528811609025\n", + "average loss is: 0.0518655761557\n", + "average loss is: 0.0508891425877\n", + "average loss is: 0.0499496224367\n", + "average loss is: 0.0490449456893\n", + "average loss is: 0.0481731953563\n", + "average loss is: 0.0473325925335\n", + "average loss is: 0.0465214848134\n", + "average loss is: 0.0457383351514\n", + "average loss is: 0.0449817118815\n", + "average loss is: 0.0442502796927\n", + "average loss is: 0.0435427918518\n", + "average loss is: 0.0428580828441\n", + "average loss is: 0.0421950617608\n", + "average loss is: 0.0415527067172\n", + "average loss is: 0.0409300591527\n", + "average loss is: 0.0403262192239\n", + "average loss is: 0.0397403411381\n", + "average loss is: 0.0391716292271\n", + "average loss is: 0.0386193343495\n", + "average loss is: 0.0380827505725\n", + "average loss is: 0.0375612118193\n", + "average loss is: 0.0370540894219\n", + "average loss is: 0.0365607894682\n", + "average loss is: 0.0360807502221\n", + "average loss is: 0.0356134402267\n", + "average loss is: 0.0351583559568\n", + "average loss is: 0.0347150203697\n", + "average loss is: 0.0342829808685\n", + "average loss is: 0.0338618080745\n", + "average loss is: 0.0334510939502\n", + "average loss is: 0.0330504509121\n", + "average loss is: 0.0326595103741\n" ] } ], "source": [ "# define the parameters\n", "m = Model()\n", - "m.add_parameters(\"W\", (8,2))\n", - "m.add_parameters(\"V\", (1,8))\n", - "m.add_parameters(\"b\", (8))\n", + "pW = m.add_parameters((8,2))\n", + "pV = m.add_parameters((1,8))\n", + "pb = m.add_parameters((8))\n", "\n", "# renew the computation graph\n", "renew_cg()\n", "\n", "# add the parameters to the graph\n", - "W = parameter(m[\"W\"])\n", - "V = parameter(m[\"V\"])\n", - "b = parameter(m[\"b\"])\n", + "W = parameter(pW)\n", + "V = parameter(pV)\n", + "b = parameter(pb)\n", "\n", "# create the network\n", "x = vecInput(2) # an input vector of size 2.\n", @@ -712,7 +712,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -721,90 +721,91 @@ "name": "stdout", "output_type": "stream", "text": [ - "average loss is: -0.0434117043018\n", - "average loss is: -0.030382682085\n", - "average loss is: -0.0260350414117\n", - "average loss is: -0.0245157124847\n", - "average loss is: -0.0215704288483\n", - "average loss is: -0.0178998744239\n", - "average loss is: -0.0148817687695\n", - "average loss is: -0.0126448741369\n", - "average loss is: -0.0109926707587\n", - "average loss is: -0.00973503550515\n", - "average loss is: -0.00874631876634\n", - "average loss is: -0.00794731451975\n", - "average loss is: -0.00728702781435\n", - "average loss is: -0.00673133983875\n", - "average loss is: -0.00625665952327\n", - "average loss is: -0.00584609933663\n", - "average loss is: -0.00548723993439\n", - "average loss is: -0.00517074972184\n", - "average loss is: -0.00488942034788\n", - "average loss is: -0.00463762690453\n", - "average loss is: -0.00441089029069\n", - "average loss is: -0.00420562038346\n", - "average loss is: -0.00401886963711\n", - "average loss is: -0.00384821915689\n", - "average loss is: -0.00369165667389\n", - "average loss is: -0.00354749959141\n", - "average loss is: -0.00341432033779\n", - "average loss is: -0.00329090173223\n", - "average loss is: -0.00317620157505\n", - "average loss is: -0.00306932546338\n", - "average loss is: -0.00296949436062\n", - "average loss is: -0.00287602832846\n", - "average loss is: -0.00278833741689\n", - "average loss is: -0.00270589900306\n", - "average loss is: -0.00262825351767\n", - "average loss is: -0.00255499271922\n", - "average loss is: -0.00248575425367\n", - "average loss is: -0.00242021449964\n", - "average loss is: -0.00235808361865\n", - "average loss is: -0.00229910133278\n", - "average loss is: -0.00224303434427\n", - "average loss is: -0.00218967100073\n", - "average loss is: -0.00213881912322\n", - "average loss is: -0.00209030493051\n", - "average loss is: -0.00204397013002\n", - "average loss is: -0.00199967051132\n", - "average loss is: -0.00195727446959\n", - "average loss is: -0.00191666179603\n", - "average loss is: -0.00187772191776\n", - "average loss is: -0.0018403530397\n", - "average loss is: -0.00180446159583\n", - "average loss is: -0.0017699615956\n", - "average loss is: -0.00173677365427\n", - "average loss is: -0.00170482409213\n", - "average loss is: -0.00167404436261\n", - "average loss is: -0.00164437123308\n", - "average loss is: -0.00161574586736\n", - "average loss is: -0.00158811347559\n", - "average loss is: -0.0015614229679\n", - "average loss is: -0.00153562722582\n", - "average loss is: -0.00151068181977\n", - "average loss is: -0.00148654521539\n", - "average loss is: -0.00146317849714\n", - "average loss is: -0.00144054521572\n", - "average loss is: -0.00141861138174\n", - "average loss is: -0.0013973448718\n", - "average loss is: -0.00137671559425\n", - "average loss is: -0.00135669496189\n", - "average loss is: -0.00133725664821\n", - "average loss is: -0.00131837574296\n", - "average loss is: -0.00130002835688\n", - "average loss is: -0.00128219219668\n", - "average loss is: -0.00126484589098\n", - "average loss is: -0.00124796962008\n", - "average loss is: -0.00123154441345\n", - "average loss is: -0.00121555239431\n", - "average loss is: -0.00119997651854\n", - "average loss is: -0.00118480070451\n", - "average loss is: -0.00117000979887\n", - "average loss is: -0.00115558931208\n" + "average loss is: 0.736730417013\n", + "average loss is: 0.725369692743\n", + "average loss is: 0.715208243926\n", + "average loss is: 0.698906037733\n", + "average loss is: 0.667973376453\n", + "average loss is: 0.620016210104\n", + "average loss is: 0.564173455558\n", + "average loss is: 0.511108190748\n", + "average loss is: 0.464656613212\n", + "average loss is: 0.424903827408\n", + "average loss is: 0.390944672838\n", + "average loss is: 0.361782596097\n", + "average loss is: 0.336552875967\n", + "average loss is: 0.314552738269\n", + "average loss is: 0.295221981726\n", + "average loss is: 0.27811523865\n", + "average loss is: 0.262876965393\n", + "average loss is: 0.249221329002\n", + "average loss is: 0.236916671552\n", + "average loss is: 0.225773662324\n", + "average loss is: 0.215636288271\n", + "average loss is: 0.206374970573\n", + "average loss is: 0.197881278039\n", + "average loss is: 0.190063834667\n", + "average loss is: 0.182845127269\n", + "average loss is: 0.176158992879\n", + "average loss is: 0.16994863152\n", + "average loss is: 0.164165015582\n", + "average loss is: 0.158765610311\n", + "average loss is: 0.153713339384\n", + "average loss is: 0.148975738776\n", + "average loss is: 0.14452426397\n", + "average loss is: 0.140333718062\n", + "average loss is: 0.13638177571\n", + "average loss is: 0.132648585576\n", + "average loss is: 0.129116437846\n", + "average loss is: 0.125769484215\n", + "average loss is: 0.122593499324\n", + "average loss is: 0.119575678358\n", + "average loss is: 0.116704463887\n", + "average loss is: 0.113969398874\n", + "average loss is: 0.111360997359\n", + "average loss is: 0.108870635643\n", + "average loss is: 0.106490455879\n", + "average loss is: 0.104213282756\n", + "average loss is: 0.102032551605\n", + "average loss is: 0.0999422444205\n", + "average loss is: 0.0979368338955\n", + "average loss is: 0.0960112348951\n", + "average loss is: 0.094160760665\n", + "average loss is: 0.0923810851444\n", + "average loss is: 0.0906682085468\n", + "average loss is: 0.0890184267577\n", + "average loss is: 0.0874283051604\n", + "average loss is: 0.0858946543594\n", + "average loss is: 0.0844145084265\n", + "average loss is: 0.0829851059784\n", + "average loss is: 0.0816038727351\n", + "average loss is: 0.0802684055211\n", + "average loss is: 0.0789764590814\n", + "average loss is: 0.0777259325812\n", + "average loss is: 0.0765148587798\n", + "average loss is: 0.0753413928689\n", + "average loss is: 0.0742038039022\n", + "average loss is: 0.073100465403\n", + "average loss is: 0.072029847966\n", + "average loss is: 0.0709905121502\n", + "average loss is: 0.0699811016467\n", + "average loss is: 0.0690003377412\n", + "average loss is: 0.0680470136383\n", + "average loss is: 0.0671199895066\n", + "average loss is: 0.0662181878878\n", + "average loss is: 0.0653405894968\n", + "average loss is: 0.0644862291951\n", + "average loss is: 0.0636541927901\n", + "average loss is: 0.0628436133573\n", + "average loss is: 0.062053668331\n", + "average loss is: 0.0612835769022\n", + "average loss is: 0.0605325971122\n", + "average loss is: 0.0598000235481\n" ] } ], "source": [ + "from pycnn import *\n", "# create training instances, as before\n", "def create_xor_instances(num_rounds=2000):\n", " questions = []\n", @@ -820,11 +821,11 @@ "questions, answers = create_xor_instances()\n", "\n", "# create a network for the xor problem given input and output\n", - "def create_xor_network(model, inputs, expected_answer):\n", - " renew_cg()\n", - " W = parameter(model[\"W\"])\n", - " V = parameter(model[\"V\"])\n", - " b = parameter(model[\"b\"])\n", + "def create_xor_network(pW, pV, pb, inputs, expected_answer):\n", + " renew_cg() # new computation graph\n", + " W = parameter(pW) # add parameters to graph as expressions\n", + " V = parameter(pV)\n", + " b = parameter(pb)\n", " x = vecInput(len(inputs))\n", " x.set(inputs)\n", " y = scalarInput(expected_answer)\n", @@ -832,16 +833,16 @@ " loss = binary_log_loss(output, y)\n", " return loss\n", "\n", - "m = Model()\n", - "m.add_parameters(\"W\", (8,2))\n", - "m.add_parameters(\"V\", (1,8))\n", - "m.add_parameters(\"b\", (8))\n", - "trainer = SimpleSGDTrainer(m)\n", + "m2 = Model()\n", + "pW = m2.add_parameters((8,2))\n", + "pV = m2.add_parameters((1,8))\n", + "pb = m2.add_parameters((8))\n", + "trainer = SimpleSGDTrainer(m2)\n", "\n", "seen_instances = 0\n", "total_loss = 0\n", "for question, answer in zip(questions, answers):\n", - " loss = create_xor_network(m, question, answer)\n", + " loss = create_xor_network(pW, pV, pb, question, answer)\n", " seen_instances += 1\n", " total_loss += loss.value()\n", " loss.backward()\n", @@ -850,15 +851,6 @@ " print \"average loss is:\",total_loss / seen_instances\n", "\n" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] } ], "metadata": { @@ -877,7 +869,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.10" + "version": "2.7.11" } }, "nbformat": 4, From 20b753e1409930429e0e53c3701fdbaf5a040e67 Mon Sep 17 00:00:00 2001 From: yoavg Date: Thu, 30 Jun 2016 01:42:03 +0300 Subject: [PATCH 577/965] update pyexamples to v2 --- pyexamples/attention.py | 61 ++++++++++++++++++----------------- pyexamples/bilstmtagger.py | 26 +++++++-------- pyexamples/cpu_vs_gpu.py | 4 +-- pyexamples/minibatch.py | 4 +-- pyexamples/rnnlm.py | 23 +++++++------ pyexamples/rnnlm_transduce.py | 23 +++++++------ pyexamples/xor.py | 27 +++++++--------- 7 files changed, 82 insertions(+), 86 deletions(-) diff --git a/pyexamples/attention.py b/pyexamples/attention.py index fda8881d7..7547d3d27 100644 --- a/pyexamples/attention.py +++ b/pyexamples/attention.py @@ -21,22 +21,22 @@ dec_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, STATE_SIZE*2, STATE_SIZE, model) -model.add_lookup_parameters("lookup", (VOCAB_SIZE, EMBEDDINGS_SIZE)) -model.add_parameters("attention_w", (1, STATE_SIZE*2+STATE_SIZE*LSTM_NUM_OF_LAYERS*2)) -model.add_parameters("decoder_w", (VOCAB_SIZE, STATE_SIZE)) -model.add_parameters("decoder_b", (VOCAB_SIZE)) +lookup = model.add_lookup_parameters( (VOCAB_SIZE, EMBEDDINGS_SIZE)) +attention_w = model.add_parameters( (1, STATE_SIZE*2+STATE_SIZE*LSTM_NUM_OF_LAYERS*2)) +decoder_w = model.add_parameters( (VOCAB_SIZE, STATE_SIZE)) +decoder_b = model.add_parameters( (VOCAB_SIZE)) -def embedd_sentence(model, sentence): +def embed_sentence(sentence): sentence = [EOS] + list(sentence) + [EOS] sentence = [char2int[c] for c in sentence] - lookup = model["lookup"] + global lookup return [lookup[char] for char in sentence] -def run_lstm(model, init_state, input_vecs): +def run_lstm(init_state, input_vecs): s = init_state out_vectors = [] @@ -47,19 +47,20 @@ def run_lstm(model, init_state, input_vecs): return out_vectors -def encode_sentence(model, enc_fwd_lstm, enc_bwd_lstm, sentence): - sentence_rev = [sentence[i] for i in range(len(sentence)-1, -1, -1)] +def encode_sentence(enc_fwd_lstm, enc_bwd_lstm, sentence): + sentence_rev = list(reversed(sentence)) - fwd_vectors = run_lstm(model, enc_fwd_lstm.initial_state(), sentence) - bwd_vectors = run_lstm(model, enc_bwd_lstm.initial_state(), sentence_rev) - bwd_vectors = [bwd_vectors[i] for i in range(len(bwd_vectors)-1, -1, -1)] + fwd_vectors = run_lstm(enc_fwd_lstm.initial_state(), sentence) + bwd_vectors = run_lstm(enc_bwd_lstm.initial_state(), sentence_rev) + bwd_vectors = list(reversed(bwd_vectors)) vectors = [pc.concatenate(list(p)) for p in zip(fwd_vectors, bwd_vectors)] return vectors -def attend(model, vectors, state): - w = pc.parameter(model['attention_w']) +def attend(vectors, state): + global attention_w + w = pc.parameter(attention_w) attention_weights = [] for vector in vectors: #concatenate each encoded vector with the current decoder state @@ -73,19 +74,19 @@ def attend(model, vectors, state): return vectors -def decode(model, dec_lstm, vectors, output): +def decode(dec_lstm, vectors, output): output = [EOS] + list(output) + [EOS] output = [char2int[c] for c in output] - w = pc.parameter(model["decoder_w"]) - b = pc.parameter(model["decoder_b"]) + w = pc.parameter(decoder_w) + b = pc.parameter(decoder_b) s = dec_lstm.initial_state().add_input(pc.vecInput(STATE_SIZE*2)) loss = [] for char in output: - vector = attend(model, vectors, s) + vector = attend(vectors, s) s = s.add_input(vector) out_vector = w * s.output() + b @@ -95,7 +96,7 @@ def decode(model, dec_lstm, vectors, output): return loss -def generate(model, input, enc_fwd_lstm, enc_bwd_lstm, dec_lstm): +def generate(input, enc_fwd_lstm, enc_bwd_lstm, dec_lstm): def sample(probs): rnd = random.random() for i, p in enumerate(probs): @@ -103,18 +104,18 @@ def sample(probs): if rnd <= 0: break return i - embedded = embedd_sentence(model, input) - encoded = encode_sentence(model, enc_fwd_lstm, enc_bwd_lstm, embedded) + embedded = embed_sentence(input) + encoded = encode_sentence(enc_fwd_lstm, enc_bwd_lstm, embedded) - w = pc.parameter(model["decoder_w"]) - b = pc.parameter(model["decoder_b"]) + w = pc.parameter(decoder_w) + b = pc.parameter(decoder_b) s = dec_lstm.initial_state().add_input(pc.vecInput(STATE_SIZE * 2)) out = '' count_EOS = 0 for i in range(len(input)*2): if count_EOS == 2: break - vector = attend(model, encoded, s) + vector = attend(encoded, s) s = s.add_input(vector) out_vector = w * s.output() + b @@ -129,23 +130,23 @@ def sample(probs): return out -def get_loss(model, input_sentence, output_sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm): +def get_loss(input_sentence, output_sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm): pc.renew_cg() - embedded = embedd_sentence(model, input_sentence) - encoded = encode_sentence(model, enc_fwd_lstm, enc_bwd_lstm, embedded) - return decode(model, dec_lstm, encoded, output_sentence) + embedded = embed_sentence(input_sentence) + encoded = encode_sentence(enc_fwd_lstm, enc_bwd_lstm, embedded) + return decode(dec_lstm, encoded, output_sentence) def train(model, sentence): trainer = pc.SimpleSGDTrainer(model) for i in xrange(400): - loss = get_loss(model, sentence, sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm) + loss = get_loss(sentence, sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm) loss_value = loss.value() loss.backward() trainer.update() if i % 20 == 0: print loss_value - print generate(model, sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm) + print generate(sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm) train(model, "it is working") diff --git a/pyexamples/bilstmtagger.py b/pyexamples/bilstmtagger.py index 4a64d6955..f7e01346b 100644 --- a/pyexamples/bilstmtagger.py +++ b/pyexamples/bilstmtagger.py @@ -5,8 +5,8 @@ import util # format of files: each line is "wordtag", blank line is new sentence. -train_file="/home/yogo/Vork/Research/corpora/pos/WSJ.TRAIN" -test_file="/home/yogo/Vork/Research/corpora/pos/WSJ.TEST" +train_file="/Users/yogo/Vork/Research/corpora/pos/WSJ.TRAIN" +test_file="/Users/yogo/Vork/Research/corpora/pos/WSJ.TEST" MLP=True @@ -50,24 +50,24 @@ def read(fname): model = Model() sgd = SimpleSGDTrainer(model) -model.add_lookup_parameters("lookup", (nwords, 128)) -model.add_lookup_parameters("tl", (ntags, 30)) +E = model.add_lookup_parameters((nwords, 128)) +p_t1 = model.add_lookup_parameters((ntags, 30)) if MLP: - pH = model.add_parameters("HID", (32, 50*2)) - pO = model.add_parameters("OUT", (ntags, 32)) + pH = model.add_parameters((32, 50*2)) + pO = model.add_parameters((ntags, 32)) else: - pO = model.add_parameters("OUT", (ntags, 50*2)) + pO = model.add_parameters((ntags, 50*2)) builders=[ LSTMBuilder(1, 128, 50, model), LSTMBuilder(1, 128, 50, model), ] -def build_tagging_graph(words, tags, model, builders): +def build_tagging_graph(words, tags, builders): renew_cg() f_init, b_init = [b.initial_state() for b in builders] - wembs = [lookup(model["lookup"], w) for w in words] + wembs = [E[w] for w in words] wembs = [noise(we,0.1) for we in wembs] fw = [x.output() for x in f_init.add_inputs(wembs)] @@ -89,10 +89,10 @@ def build_tagging_graph(words, tags, model, builders): errs.append(err) return esum(errs) -def tag_sent(sent, model, builders): +def tag_sent(sent, builders): renew_cg() f_init, b_init = [b.initial_state() for b in builders] - wembs = [lookup(model["lookup"], vw.w2i.get(w, UNK)) for w,t in sent] + wembs = [E[vw.w2i.get(w, UNK)] for w,t in sent] fw = [x.output() for x in f_init.add_inputs(wembs)] bw = [x.output() for x in b_init.add_inputs(reversed(wembs))] @@ -126,7 +126,7 @@ def tag_sent(sent, model, builders): if i % 10000 == 0: good = bad = 0.0 for sent in test: - tags = tag_sent(sent, model, builders) + tags = tag_sent(sent, builders) golds = [t for w,t in sent] for go,gu in zip(golds,tags): if go == gu: good +=1 @@ -134,7 +134,7 @@ def tag_sent(sent, model, builders): print good/(good+bad) ws = [vw.w2i.get(w, UNK) for w,p in s] ps = [vt.w2i[p] for w,p in s] - sum_errs = build_tagging_graph(ws,ps,model,builders) + sum_errs = build_tagging_graph(ws,ps,builders) squared = -sum_errs# * sum_errs loss += sum_errs.scalar_value() tagged += len(ps) diff --git a/pyexamples/cpu_vs_gpu.py b/pyexamples/cpu_vs_gpu.py index 9564ec7f4..527921578 100644 --- a/pyexamples/cpu_vs_gpu.py +++ b/pyexamples/cpu_vs_gpu.py @@ -5,8 +5,8 @@ cm = C.Model() gm = G.Model() -cpW = cm.add_parameters("W",(1000,1000)) -gpW = gm.add_parameters("W",(1000,1000)) +cpW = cm.add_parameters((1000,1000)) +gpW = gm.add_parameters((1000,1000)) def do_cpu(): C.renew_cg() diff --git a/pyexamples/minibatch.py b/pyexamples/minibatch.py index 1c7e52778..796c408d9 100644 --- a/pyexamples/minibatch.py +++ b/pyexamples/minibatch.py @@ -2,7 +2,7 @@ import numpy as np m = Model() -lp = m.add_lookup_parameters("a",(100,10)) +lp = m.add_lookup_parameters((100,10)) # regular lookup a = lp[1].npvalue() @@ -23,7 +23,7 @@ # use pick and pickneglogsoftmax in batch mode # (must be used in conjunction with lookup_batch): print "\nPick" -W = parameter( m.add_parameters("W", (5, 10)) ) +W = parameter( m.add_parameters((5, 10)) ) h = W * lp.batch([1,2,3]) print h.npvalue() print pick_batch(h,[1,2,3]).npvalue() diff --git a/pyexamples/rnnlm.py b/pyexamples/rnnlm.py index 8b906079c..9fc3acc10 100644 --- a/pyexamples/rnnlm.py +++ b/pyexamples/rnnlm.py @@ -14,25 +14,24 @@ class RNNLanguageModel: def __init__(self, model, LAYERS, INPUT_DIM, HIDDEN_DIM, VOCAB_SIZE, builder=SimpleRNNBuilder): - self.m = model self.builder = builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) - model.add_lookup_parameters("lookup", (VOCAB_SIZE, INPUT_DIM)) - model.add_parameters("R", (VOCAB_SIZE, HIDDEN_DIM)) - model.add_parameters("bias", (VOCAB_SIZE)) + self.lookup = model.add_lookup_parameters((VOCAB_SIZE, INPUT_DIM)) + self.R = model.add_parameters((VOCAB_SIZE, HIDDEN_DIM)) + self.bias = model.add_parameters((VOCAB_SIZE)) def BuildLMGraph(self, sent): renew_cg() init_state = self.builder.initial_state() - R = parameter(self.m["R"]) - bias = parameter(self.m["bias"]) + R = parameter(self.R) + bias = parameter(self.bias) errs = [] # will hold expressions es=[] state = init_state for (cw,nw) in zip(sent,sent[1:]): # assume word is already a word-id - x_t = lookup(self.m["lookup"], int(cw)) + x_t = lookup(self.lookup, int(cw)) state = state.add_input(x_t) y_t = state.output() r_t = bias + (R * y_t) @@ -46,11 +45,11 @@ def sample(self, first=1, nchars=0, stop=-1): renew_cg() state = self.builder.initial_state() - R = parameter(self.m["R"]) - bias = parameter(self.m["bias"]) + R = parameter(self.R) + bias = parameter(self.bias) cw = first while True: - x_t = lookup(self.m["lookup"], cw) + x_t = lookup(self.lookup, cw) state = state.add_input(x_t) y_t = state.output() r_t = bias + (R * y_t) @@ -75,8 +74,8 @@ def sample(self, first=1, nchars=0, stop=-1): model = Model() sgd = SimpleSGDTrainer(model) - #lm = RNNLanguageModel(model, builder=LSTMBuilder) - lm = RNNLanguageModel(model, LAYERS, INPUT_DIM, HIDDEN_DIM, VOCAB_SIZE, builder=SimpleRNNBuilder) + #lm = RNNLanguageModel(model, LAYERS, INPUT_DIM, HIDDEN_DIM, VOCAB_SIZE, builder=SimpleRNNBuilder) + lm = RNNLanguageModel(model, LAYERS, INPUT_DIM, HIDDEN_DIM, VOCAB_SIZE, builder=LSTMBuilder) train = list(train) diff --git a/pyexamples/rnnlm_transduce.py b/pyexamples/rnnlm_transduce.py index f4c579c45..7c2e99bc5 100644 --- a/pyexamples/rnnlm_transduce.py +++ b/pyexamples/rnnlm_transduce.py @@ -15,23 +15,22 @@ class RNNLanguageModel: def __init__(self, model, LAYERS, INPUT_DIM, HIDDEN_DIM, VOCAB_SIZE, builder=SimpleRNNBuilder): - self.m = model self.builder = builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) - model.add_lookup_parameters("lookup", (VOCAB_SIZE, INPUT_DIM)) - model.add_parameters("R", (VOCAB_SIZE, HIDDEN_DIM)) - model.add_parameters("bias", (VOCAB_SIZE)) + self.lookup = model.add_lookup_parameters((VOCAB_SIZE, INPUT_DIM)) + self.R = model.add_parameters((VOCAB_SIZE, HIDDEN_DIM)) + self.bias = model.add_parameters((VOCAB_SIZE)) def BuildLMGraph(self, sent): renew_cg() init_state = self.builder.initial_state() - R = parameter(self.m["R"]) - bias = parameter(self.m["bias"]) + R = parameter(self.R) + bias = parameter(self.bias) errs = [] # will hold expressions es=[] state = init_state - lookup = self.m["lookup"] + lookup = self.lookup inputs = [lookup[int(cw)] for cw in sent[:-1]] expected_outputs = [int(nw) for nw in sent[1:]] outputs = state.transduce(inputs) @@ -46,11 +45,11 @@ def sample(self, first=1, nchars=0, stop=-1): renew_cg() state = self.builder.initial_state() - R = parameter(self.m["R"]) - bias = parameter(self.m["bias"]) + R = parameter(self.R) + bias = parameter(self.bias) cw = first while True: - x_t = lookup(self.m["lookup"], cw) + x_t = lookup(self.lookup, cw) state = state.add_input(x_t) y_t = state.output() r_t = bias + (R * y_t) @@ -75,8 +74,8 @@ def sample(self, first=1, nchars=0, stop=-1): model = Model() sgd = SimpleSGDTrainer(model) - #lm = RNNLanguageModel(model, builder=LSTMBuilder) - lm = RNNLanguageModel(model, LAYERS, INPUT_DIM, HIDDEN_DIM, VOCAB_SIZE, builder=SimpleRNNBuilder) + #lm = RNNLanguageModel(model, LAYERS, INPUT_DIM, HIDDEN_DIM, VOCAB_SIZE, builder=SimpleRNNBuilder) + lm = RNNLanguageModel(model, LAYERS, INPUT_DIM, HIDDEN_DIM, VOCAB_SIZE, builder=LSTMBuilder) train = list(train) diff --git a/pyexamples/xor.py b/pyexamples/xor.py index 452017342..1cd6a69ba 100644 --- a/pyexamples/xor.py +++ b/pyexamples/xor.py @@ -9,15 +9,15 @@ m = Model() sgd = SimpleSGDTrainer(m) -m.add_parameters("W",(HIDDEN_SIZE, 2)) -m.add_parameters("b",HIDDEN_SIZE) -m.add_parameters("V",(1, HIDDEN_SIZE)) -m.add_parameters("a",1) +pW = m.add_parameters((HIDDEN_SIZE, 2)) +pb = m.add_parameters(HIDDEN_SIZE) +pV = m.add_parameters((1, HIDDEN_SIZE)) +pa = m.add_parameters(1) -W = parameter(m["W"]) -b = parameter(m["b"]) -V = parameter(m["V"]) -a = parameter(m["a"]) +W = parameter(pW) +b = parameter(pb) +V = parameter(pV) +a = parameter(pa) x = vecInput(2) y = scalarInput(0) @@ -41,9 +41,7 @@ x2 = (mi / 2) % 2 x.set([T if x1 else F, T if x2 else F]) y.set(T if x1 != x2 else F) - #mloss += cg().forward_scalar() mloss += loss.scalar_value() - #cg().backward() loss.backward() sgd.update(1.0) sgd.update_epoch(); @@ -53,13 +51,12 @@ x.set([F,T]) z = -(-y_pred) print z.scalar_value() -#print y_pred.scalar() renew_cg() -W = parameter(m["W"]) -b = parameter(m["b"]) -V = parameter(m["V"]) -a = parameter(m["a"]) +W = parameter(pW) +b = parameter(pb) +V = parameter(pV) +a = parameter(pa) x = vecInput(2) y = scalarInput(0) From 961b8ccfb4eb1f77ef8536eb23352ed62e8cec0f Mon Sep 17 00:00:00 2001 From: yoavg Date: Thu, 30 Jun 2016 01:56:23 +0300 Subject: [PATCH 578/965] set_dropout for RNNBuilders --- pycnn/pycnn.pxd | 2 ++ pycnn/pycnn.pyx | 3 +++ 2 files changed, 5 insertions(+) diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index dbcdc2a8a..a14ea3df5 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -242,6 +242,8 @@ cdef extern from "cnn/rnn.h" namespace "cnn": vector[CExpression] get_h(CRNNPointer i) vector[CExpression] get_s(CRNNPointer i) CRNNPointer state() + void set_dropout(float f) + void disable_dropout() # TODO unify with LSTMBuilder using inheritance cdef extern from "cnn/rnn.h" namespace "cnn": diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 6613c8a12..5f126fc5b 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -863,6 +863,9 @@ cdef class _RNNBuilder: # {{{ def __dealloc__(self): del self.thisptr + cpdef set_dropout(self, float f): self.thisptr.set_dropout(f) + cpdef disable_dropout(self): self.thisptr.disable_dropout() + cdef new_graph(self): self.thisptr.new_graph(_cg.thisptr[0]) self.cg_version = _cg.version() From 248d71ffadbb5f6b926d205ee15729faad08bb30 Mon Sep 17 00:00:00 2001 From: yoavg Date: Thu, 30 Jun 2016 02:22:54 +0300 Subject: [PATCH 579/965] some docs for pycnn changes. --- pycnn/CHANGES.md | 154 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 pycnn/CHANGES.md diff --git a/pycnn/CHANGES.md b/pycnn/CHANGES.md new file mode 100644 index 000000000..f5c4bd5e2 --- /dev/null +++ b/pycnn/CHANGES.md @@ -0,0 +1,154 @@ +# pycnn API changes for v2 + +## Model no longer holds named parameters + +The major API change in v2 of pycnn is in the `Model` class. +This change breaks backward compatibility, but is easy to adapt to. + +The `Model` class no longer holds named parameters. This is done in order +to be more compatible to the C++ API, as well as to simplify the design of +the Model class. If a string-to-parameter mapping is desired, it can be achieved +externally to the model class. + +Old API: +```python +m = Model() +m.add_parameters("w",(100,100)) +m.add_lookup_parameters("lp",(100,100)) + +p_w = m["w"] +lp = m["lp"] +``` + +New API: +```python +m = Model() +p_w = m.add_parameters((100,100)) +lp = m.add_lookup_parameters((100,100)) + +# OR +params = {} +params["w"] = m.add_parameters((100,100)) +params["lp"] = m.add_lookup_parameters((100,100)) + +p_w = params["w"] +lp = params["lp"] +``` + + +## New model-saving mechanism + +There are now two model-saving mechaisms, "old" and "new", both work. + +### The old mechanism + +In the "old" mechanism (which still works) the user can load and save models using +a single call, provided that they added (either directly and indirectly) the exact same parameters +to the model prior to calling save and load. +For example: + +```python + +# saving: +from pycnn import * +m = Model() +W = m.add_parameters((100,100)) +lb = LSTMBuilder(1, 100, 100, m) # this also adds parameters to the model +b = m.add_parameters((30)) +m.save("filename") + +# loading +m = Model() +W = m.add_parameters((100,100)) +lb = LSTMBuilder(1, 100, 100, m) +b = m.add_parameters((30)) +m.load("filename") +``` + +Notice how the exact same parameters (same sizes and order) were added before calling "load". +This may be either a blessing or a curse. + +## The new mechanism + +In the new mechanism, the user instead tells the model, at save time, which are the components it is +interested in saving. They then need to specify the same components, in the same order, at load time. +Notice however that there is no need to specify the sizes etc, as this is handled by the save/load mechanism: + +```python +# saving: +from pycnn import * +m = Model() +W = m.add_parameters((100,100)) +lb = LSTMBuilder(1, 100, 100, m) # this also adds parameters to the model +b = m.add_parameters((30)) +m.save("filename", [W,b,lb]) + +# loading +m = Model() +(W, b, lb) = m.load("filename") +``` + +Some may view this form of loading to be much more convenient. + +In order to make use of "the new way", the items that are being passed in the list must adhere to at least one of the following: + +* be of type `Parameters` or `LookupParameters` (the return types of `add_parameters` or `add_lookup_parameters`). +* be of a built-in "complex" builders such as `LSTMBuilder` or `GRUBuilder` that add parameters to the model. +* user defied classes that extend to the new `pycnn.Saveable` class and implement the required interface. + + +The `Saveable` class is used for easy creation of user-defined "sub networks" that can be saved and loaded as part of the model saving mechanism. + +```python +class OneLayerMLP(Saveable): + def __init__(self, model, num_input, num_hidde, num_out, act=tanh): + self.W1 = model.add_parameters("W1", (num_hidden, num_input)) + self.W2 = model.add_parameters("W2", (num_out, num_hidden)) + self.b1 = model.add_parameters("b1", (num_hidden)) + self.b2 = model.add_parameters("b2", (num_out)) + self.act = act + self.shape = (num_input, num_out) + + def __call__(self, input_exp): + W1 = parameter(self.W1) + W2 = parameter(self.W2) + b1 = parameter(self.b1) + b2 = parameter(self.b2) + g = self.act + return softmax(W2*g(W1*input_exp + b1)+b2) + + # the Saveable interface requires the implementation + # of the two following methods, specifying all the + # Parameters / LookupParameters / LSTMBuilder / Saveables / etc + # that are directly created by this Saveable. + def get_components(self): + return (self.W1, self.W2, self.b1, self.b2) + + def restore_components(self, components): + self.W1, self.W2, self.b1, self.b2 = components + +``` + +And for the usage: +```python + +m = Model() +# create an embedding table. +E = m.add_lookup_parameters((1000,10)) +# create an MLP from 10 to 4 with a hidden layer of 20. +mlp = OneLayerMLP(m, 10, 20, 4, rectify) + +# use them together. +output = mlp(E[3]) + +# now save the model: +m.save("filename",[mlp, E]) + +# now load: +m2 = Model() +mlp2, E2 = m.load("filename") + +output2 = mlp2(E2[3]) + +assert(numpy.array_equal(output2.npvalue(), output.npvalue())) +``` From a7433d54445494c5c808643113dc1ed1f25cc6f1 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 29 Jun 2016 20:25:18 -0400 Subject: [PATCH 580/965] Added default L2 regularization to README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 91223bed0..413804e2e 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ very beginning of the command line, before other options. backward steps, as well as parameter storage. You will often want to increase this amount. By setting NUMBER here, cnn will allocate more memory. Note that it will allocate 3 times more memory than the number specified here, so if you want to use 3GB, specify "1024". -* `--cnn-l2 NUMBER`: Specifies the level of l2 regularization to use. +* `--cnn-l2 NUMBER`: Specifies the level of l2 regularization to use (default 1e-6). * `--cnn-gpus NUMBER`: Specify how many GPUs you want to use, if cnn is compiled with CUDA. Currently, only one GPU is supported. * `--cnn-gpu-ids X,Y,Z`: Specify the GPUs that you want to use by device ID. Currently only From a03e2587975eecdbed1ed4233f6e157b24bf4495 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 30 Jun 2016 21:54:39 +0900 Subject: [PATCH 581/965] Fixed some compile errors on older versions of gcc --- cnn/nodes.cc | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 76134d288..6eeb1f5d6 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -154,7 +154,7 @@ EIGEN_STRONG_INLINE void logsumexp(const MyDevice & dev, const Tensor& x, Tensor z.t<0>().device(*dev.edevice) = (x.t<1>() - mval).exp().sum(); z.t<0>().device(*dev.edevice) = z.t<0>().log() + mval; } else { - Eigen::array red_axis({0}); + Eigen::array red_axis; red_axis[0] = 0; m.tb<0>().device(*dev.edevice) = x.tb<1>().maximum(red_axis); // TODO: We want to do this in a single command, but this is causing incorrect results. // Eigen::array bcast({(int)x.d.rows(), 1}); @@ -201,10 +201,8 @@ inline void CUDAMatrixMultiply(const Tensor& l, const Tensor& r, Tensor& y, cons template void AddVectorToAllColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - array broadcasts; - broadcasts[0] = 1; - broadcasts[1] = xs[0]->d[1]; - fx.t<2>().device(*dev.edevice) = xs[0]->t<2>() + xs[1]->t<2>().broadcast(broadcasts); + Eigen::array bcasts; bcasts[0] = 1; bcasts[1] = xs[0]->d[1]; + fx.t<2>().device(*dev.edevice) = xs[0]->t<2>() + xs[1]->t<2>().broadcast(bcasts); } template @@ -284,7 +282,7 @@ void AffineTransform::backward_dev_impl(const MyDevice & dev, dEdf_mem = (float*)device->fxs->allocate(sizeof(float) * dEdf.d.batch_size()); Dim dEdf_dim = dEdf.d; dEdf_dim.bd = 1; dEdf_sum = Tensor(dEdf_dim, dEdf_mem, device); - Eigen::array red_axis({2}); + Eigen::array red_axis; red_axis[0] = 2; dEdf_sum.t<2>().device(*dev.edevice) = dEdf.tb<2>().sum(red_axis); } @@ -400,7 +398,7 @@ void Concatenate::forward_dev_impl(const MyDevice & dev, const vectord.bd) { fx.tb<2>().slice(indices, sizes).device(*dev.edevice) = xs[i]->tb<2>(); } else { - Eigen::array bcast({1,1,(int)fx.d.bd}); + Eigen::array bcast; bcast[0] = bcast[1] = 1; bcast[2] = fx.d.bd; fx.tb<2>().slice(indices, sizes).device(*dev.edevice) = xs[i]->tb<2>().broadcast(bcast); } curr_row += row_size; @@ -615,8 +613,8 @@ CNN_NODE_INST_DEV_IMPL(CwiseMultiply) template void DotProduct::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - Eigen::array red_axis({0}); - Eigen::array bcast({1, (int)fx.d.bd}); + Eigen::array red_axis; red_axis[0] = 0; + Eigen::array bcast; bcast[0] = 1; bcast[1] = fx.d.bd; if(fx.d.bd == 1) { fx.t<0>().device(*dev.edevice) = (xs[0]->t<1>() * xs[1]->t<1>()).sum(); } else if(xs[0]->d.bd == xs[1]->d.bd) { @@ -636,17 +634,17 @@ void DotProduct::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { if(fx.d.bd == 1) { - Eigen::array bcast({(int)xs[i]->d.rows()}); + Eigen::array bcast; bcast[0] = xs[i]->d.rows(); dEdxi.t<1>().device(*dev.edevice) += xs[1-i]->t<1>() * dEdf.t<1>().broadcast(bcast); } else { - Eigen::array bcast({(int)xs[i]->d.rows(), 1}); + Eigen::array bcast; bcast[0] =xs[i]->d.rows(); bcast[1] = 1; if(xs[0]->d.bd == xs[1]->d.bd) { dEdxi.tb<1>().device(*dev.edevice) += xs[1-i]->tb<1>() * dEdf.tb<1>().broadcast(bcast); } else if(dEdxi.d.bd == 1) { - Eigen::array red_axis({1}); + Eigen::array red_axis; red_axis[0] = 1; dEdxi.t<1>().device(*dev.edevice) += (xs[1-i]->tb<1>() * dEdf.tb<1>().broadcast(bcast)).sum(red_axis); } else { - Eigen::array batchcast({1, (int)fx.d.bd}); + Eigen::array batchcast; batchcast[0] = 1; batchcast[1] = fx.d.bd; dEdxi.tb<1>().device(*dev.edevice) += (xs[1-i]->tb<1>().broadcast(batchcast) * dEdf.tb<1>().broadcast(bcast)); } } @@ -957,10 +955,8 @@ void LogSoftmax::forward_dev_impl(const MyDevice & dev, const vector().device(*dev.edevice) = xs[0]->t<1>() - as_scalar(z); } else { - array broadcasts; - broadcasts[0] = xs[0]->d.rows(); - broadcasts[1] = 1; - fx.tb<1>().device(*dev.edevice) = xs[0]->tb<1>() - z.tb<1>().broadcast(broadcasts); + Eigen::array bcasts; bcasts[0] = xs[0]->d.rows(); bcasts[1] = 1; + fx.tb<1>().device(*dev.edevice) = xs[0]->tb<1>() - z.tb<1>().broadcast(bcasts); } } @@ -976,12 +972,12 @@ void LogSoftmax::backward_dev_impl(const MyDevice & dev, Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); if(fx.d.bd == 1) { z.t<0>().device(*dev.edevice) = fx.t<1>().binaryExpr(dEdf.t<1>(), FWeightedError()).sum(); - Eigen::array bcast({(int)fx.d.rows()}); + Eigen::array bcast; bcast[0] = fx.d.rows(); dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().exp() * -z.t<1>().broadcast(bcast) + dEdf.t<1>(); } else { - Eigen::array red_axis({0}); + Eigen::array red_axis; red_axis[0] = 0; z.tb<0>().device(*dev.edevice) = (fx.tb<1>().binaryExpr(dEdf.tb<1>(), FWeightedError())).sum(red_axis); - Eigen::array bcast({(int)fx.d.rows(), 1}); + Eigen::array bcast; bcast[0] = fx.d.rows(); bcast[1] = 1; dEdxi.tb<1>().device(*dev.edevice) += fx.tb<1>().exp() * -z.tb<1>().broadcast(bcast) + dEdf.tb<1>(); } } @@ -1607,7 +1603,7 @@ void Softmax::forward_dev_impl(const MyDevice & dev, const vector if(fx.d.bd == 1) { fx.t<1>().device(*dev.edevice) = (xs[0]->t<1>() - as_scalar(z)).exp(); } else { - Eigen::array bcast({(int)xs[0]->d.rows(), 1}); + Eigen::array bcast; bcast[0] = xs[0]->d.rows(); bcast[1] = 1; fx.tb<1>().device(*dev.edevice) = (xs[0]->tb<1>() - z.tb<1>().broadcast(bcast)).exp(); } } From d148e01c69c9f873818597c1ebbd4680b414f43f Mon Sep 17 00:00:00 2001 From: dhg Date: Thu, 30 Jun 2016 07:23:25 -0700 Subject: [PATCH 582/965] pycnn_viz: avoid duplicating expression_name inside node --- pycnn/pycnn_viz.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py index a1c8c2741..b0950a6e5 100644 --- a/pycnn/pycnn_viz.py +++ b/pycnn/pycnn_viz.py @@ -760,7 +760,14 @@ def make_network_graph(compact, expression_names, lookup_names): nodes = set() # edges = defaultdict(set) # parent -> (child, extra) - var_name_dict = {e.vindex: expression_names[e] for e in graphviz_items if e in expression_names} + var_name_dict = dict() + for e in graphviz_items: # e: Expression + if e in expression_names: + var_name_dict[e.vindex] = expression_names[e] + elif e.name == 'parameters' or e.name == 'lookup_parameters': + [name, _dim] = e.args + var_name_dict[e.vindex] = name + rnn_bldr_name = defaultdict(lambda: chr(len(rnn_bldr_name)+ord('A'))) def vidx2str(vidx): return '%s%s' % ('N', vidx) @@ -787,14 +794,12 @@ def vidx2str(vidx): return '%s%s' % ('N', vidx) arg_strs = [] elif f_name == 'parameters': [name, _dim] = args - var_name_dict[vidx] = name arg_strs = [] if compact: f_name = var_name_dict[vidx] node_type = '1_param' elif f_name == 'lookup_parameters': [name, _dim] = args - var_name_dict[vidx] = name arg_strs = [] if compact: f_name = var_name_dict[vidx] @@ -895,7 +900,7 @@ def vidx2str(vidx): return '%s%s' % ('N', vidx) var_name = '%s' % (var_name_dict.get(vidx, 'v%d' % (vidx))) if not compact else '' # if show_dims: # str_repr = '%s\\n%s' % (shape_str(e.dim), str_repr) - if expression_names and (e in expression_names): + if compact and expression_names and (e in expression_names) and (expression_names[e] != f_name): str_repr = '%s\\n%s' % (str_repr, expression_names[e]) label = str_repr if not compact: From 0a4ba7165de2382664761dddc0c78e631652edf9 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 30 Jun 2016 23:36:21 +0900 Subject: [PATCH 583/965] (Temporarily?) unprotected rescale_and_reset_weight_decay --- cnn/training.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cnn/training.h b/cnn/training.h index ff7fcd641..b9d7cd191 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -30,6 +30,11 @@ struct Trainer { // scale the gradient by (otherwise 1) float clip_gradients(); + // TODO: This is unprotected temporarily until there is a better solution + // for serializing the weight decay when saving models + // Rescale all the parameters handled by this model + void rescale_and_reset_weight_decay(); + // learning rates real eta0; real eta; @@ -52,7 +57,6 @@ struct Trainer { Model* model; // parameters and gradients live here protected: - void rescale_and_reset_weight_decay(); virtual void alloc_impl() { } virtual void update_rule(real scale, real gscale, const std::vector & values) = 0; virtual void update_params(real scale, real gscale, size_t idx) = 0; From addd934eccd4d44e78cffeb86885556a44038e54 Mon Sep 17 00:00:00 2001 From: dhg Date: Thu, 30 Jun 2016 09:26:09 -0700 Subject: [PATCH 584/965] pycnn_viz: birnn output expression_names appear in collapsed state boxes --- pycnn/pycnn_viz.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py index b0950a6e5..89c27b448 100644 --- a/pycnn/pycnn_viz.py +++ b/pycnn/pycnn_viz.py @@ -739,15 +739,16 @@ def shape_str(e_dim): return '{{%s,%s}}' % (e_dim[0],e_dim[1]) class GVNode(object): - def __init__(self, name, input_dim, label, output_dim, children, features, node_type): + def __init__(self, name, input_dim, label, output_dim, children, features, node_type, expr_name): self.name = name self.input_dim = input_dim self.label = label self.output_dim = output_dim self.children = children self.features = features - self.node_type = node_type - def __iter__(self): return iter([self.name, self.input_dim, self.label, self.output_dim, self.children, self.features, self.node_type]) + self.node_type = node_type + self.expr_name = expr_name + def __iter__(self): return iter([self.name, self.input_dim, self.label, self.output_dim, self.children, self.features, self.node_type, self.expr_name]) def __repr__(self): return 'GVNode(%s)' % ', '.join(map(str, self)) def __str__(self): return repr(self) @@ -900,8 +901,6 @@ def vidx2str(vidx): return '%s%s' % ('N', vidx) var_name = '%s' % (var_name_dict.get(vidx, 'v%d' % (vidx))) if not compact else '' # if show_dims: # str_repr = '%s\\n%s' % (shape_str(e.dim), str_repr) - if compact and expression_names and (e in expression_names) and (expression_names[e] != f_name): - str_repr = '%s\\n%s' % (str_repr, expression_names[e]) label = str_repr if not compact: label = '%s = %s' % (var_name, label) @@ -909,7 +908,8 @@ def vidx2str(vidx): return '%s%s' % ('N', vidx) # if output_dim.invalid(): # features += " [color=red,style=filled,fillcolor=red]" # node_def_lines.append(' %s [label="%s%s"] %s;' % (vidx2str(vidx), label_prefix, str_repr, '')) - nodes.add(GVNode(name, input_dim, label, output_dim, frozenset(children), features, node_type)) + expr_name = expression_names[e] if compact and expression_names and (e in expression_names) and (expression_names[e] != f_name) else None + nodes.add(GVNode(name, input_dim, label, output_dim, frozenset(children), features, node_type, expr_name)) return nodes @@ -953,7 +953,7 @@ def collapse_birnn_states(nodes, compact): if not compact: new_rnn_group_state_label = '%s\\n%s' % (node_info[out_e].label, new_rnn_group_state_label) cat_output_dim = make_dim(output_dim[0]*2, output_dim[1]) - new_rnn_group_state = GVNode(new_rnn_group_state_name, input_dim, new_rnn_group_state_label, cat_output_dim, frozenset([in_e]), '', '3_rnn_state') + new_rnn_group_state = GVNode(new_rnn_group_state_name, input_dim, new_rnn_group_state_label, cat_output_dim, frozenset([in_e]), '', '3_rnn_state', node_info[out_e].expr_name) for n in ns: rnn_groups[n.name] = new_rnn_group_state.name # children_forwards[n.name] = new_rnn_group_state.name @@ -962,14 +962,14 @@ def collapse_birnn_states(nodes, compact): nodes.add(new_rnn_group_state) nodes_to_delete.add(out_e) # TODO: WHEN WE DELETE A CAT NODE, MAKE SURE WE FORWARD TO THE **NEW GROPU STATE NODE** - for (name, input_dim, label, output_dim, children, features, node_type) in nodes: + for (name, input_dim, label, output_dim, children, features, node_type, expr_name) in nodes: if name not in nodes_to_delete: new_children = [] for c in children: while c in children_forwards: c = children_forwards[c] new_children.append(c) - new_nodes.append(GVNode(name, input_dim, label, output_dim, new_children, features, node_type)) + new_nodes.append(GVNode(name, input_dim, label, output_dim, new_children, features, node_type, expr_name)) return (new_nodes, rnn_groups) def PrintGraphviz(compact=False, show_dims=True, expression_names=None, lookup_names=None, collapse_birnns=False): @@ -1000,6 +1000,8 @@ def PrintGraphviz(compact=False, show_dims=True, expression_names=None, lookup_n label = n.label if show_dims: label = '%s\\n%s' % (shape_str(n.output_dim), n.label) + if n.expr_name is not None: + label = '%s\\n%s' % (label, n.expr_name) if n.input_dim is not None: label = '%s\\n%s' % (label, shape_str(n.input_dim)) if n.output_dim.invalid() or (n.input_dim is not None and n.input_dim.invalid()): From b4512b27a802374ea491df51c988b27124860c64 Mon Sep 17 00:00:00 2001 From: dhg Date: Thu, 30 Jun 2016 09:34:26 -0700 Subject: [PATCH 585/965] pycnn_viz: put expression_name at the top of the node label --- pycnn/pycnn_viz.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py index 89c27b448..cb755bed7 100644 --- a/pycnn/pycnn_viz.py +++ b/pycnn/pycnn_viz.py @@ -999,9 +999,10 @@ def PrintGraphviz(compact=False, show_dims=True, expression_names=None, lookup_n for n in nodes: label = n.label if show_dims: - label = '%s\\n%s' % (shape_str(n.output_dim), n.label) + label = n.label if n.expr_name is not None: - label = '%s\\n%s' % (label, n.expr_name) + label = '%s\\n%s' % (n.expr_name, label) + label = '%s\\n%s' % (shape_str(n.output_dim), label) if n.input_dim is not None: label = '%s\\n%s' % (label, shape_str(n.input_dim)) if n.output_dim.invalid() or (n.input_dim is not None and n.input_dim.invalid()): From 20ad1e88dec7f269378d4e2c331b5cff714078ee Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 1 Jul 2016 06:15:19 +0900 Subject: [PATCH 586/965] Fixed batching of componentwise operations --- cnn/nodes.cc | 54 +++++++++++++++++++++++++++++++++++++-------- tests/test-nodes.cc | 20 +++++++++++++++++ 2 files changed, 65 insertions(+), 9 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 6eeb1f5d6..24e8d32c5 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -569,7 +569,15 @@ CNN_NODE_INST_DEV_IMPL(Cube) template void CwiseQuotient::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 2); - fx.tvec().device(*dev.edevice) = xs[0]->tvec() / xs[1]->tvec(); + if(xs[0]->d.bd == xs[1]->d.bd) { + fx.tvec().device(*dev.edevice) = xs[0]->tvec() / xs[1]->tvec(); + } else if(xs[0]->d.bd == 1) { + Eigen::array bcast; bcast[0] = 1; bcast[1] = fx.d.bd; + fx.tb<1>().device(*dev.edevice) = xs[0]->tb<1>().broadcast(bcast) / xs[1]->tb<1>(); + } else { + Eigen::array bcast; bcast[0] = 1; bcast[1] = fx.d.bd; + fx.tb<1>().device(*dev.edevice) = xs[0]->tb<1>() / xs[1]->tb<1>().broadcast(bcast); + } } template @@ -581,9 +589,26 @@ void CwiseQuotient::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { assert(i < 2); if (i == 0) { - dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() / xs[1]->tvec(); + if(xs[0]->d.bd == xs[1]->d.bd) { + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() / xs[1]->tvec(); + } else if(xs[1]->d.bd == 1) { + Eigen::array bcast; bcast[0] = 1; bcast[1] = fx.d.bd; + dEdxi.tb<1>().device(*dev.edevice) += dEdf.tb<1>() / xs[1]->tb<1>().broadcast(bcast); + } else { + Eigen::array red_axis; red_axis[0] = 1; + dEdxi.t<1>().device(*dev.edevice) += (dEdf.tb<1>() / xs[1]->tb<1>()).sum(red_axis); + } } else { // i = 1 - dEdxi.tvec().device(*dev.edevice) -= dEdf.tvec() / xs[1]->tvec().square() * xs[0]->tvec(); + if(xs[0]->d.bd == xs[1]->d.bd) { + dEdxi.tvec().device(*dev.edevice) -= dEdf.tvec() / xs[1]->tvec().square() * xs[0]->tvec(); + } else if(xs[1]->d.bd == 1) { + Eigen::array bcast; bcast[0] = 1; bcast[1] = fx.d.bd; + Eigen::array red_axis; red_axis[0] = 1; + dEdxi.t<1>().device(*dev.edevice) -= (dEdf.tb<1>() / xs[1]->tb<1>().square().broadcast(bcast) * xs[0]->tb<1>()).sum(red_axis); + } else { + Eigen::array bcast; bcast[0] = 1; bcast[1] = fx.d.bd; + dEdxi.tb<1>().device(*dev.edevice) -= dEdf.tb<1>() / xs[1]->tb<1>().square() * xs[0]->tb<1>().broadcast(bcast); + } } } CNN_NODE_INST_DEV_IMPL(CwiseQuotient) @@ -591,7 +616,15 @@ CNN_NODE_INST_DEV_IMPL(CwiseQuotient) template void CwiseMultiply::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 2); - fx.tvec().device(*dev.edevice) = xs[0]->tvec() * xs[1]->tvec(); + if(xs[0]->d.bd == xs[1]->d.bd) { + fx.tvec().device(*dev.edevice) = xs[0]->tvec() * xs[1]->tvec(); + } else { + Eigen::array bcast; bcast[0] = 1; bcast[1] = fx.d.bd; + if(xs[0]->d.bd == 1) + fx.tb<1>().device(*dev.edevice) = xs[0]->tb<1>().broadcast(bcast) * xs[1]->tb<1>(); + else + fx.tb<1>().device(*dev.edevice) = xs[0]->tb<1>() * xs[1]->tb<1>().broadcast(bcast); + } } template @@ -602,10 +635,14 @@ void CwiseMultiply::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { assert(i < 2); - if (i == 0) { - dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * xs[1]->tvec(); + if(xs[0]->d.bd == xs[1]->d.bd) { + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * xs[1-i]->tvec(); + } else if(xs[1-i]->d.bd == 1) { + Eigen::array bcast; bcast[0] = 1; bcast[1] = fx.d.bd; + dEdxi.tb<1>().device(*dev.edevice) += dEdf.tb<1>() * xs[1-i]->tb<1>().broadcast(bcast); } else { - dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * xs[0]->tvec(); + Eigen::array red_axis; red_axis[0] = 1; + dEdxi.t<1>().device(*dev.edevice) += (dEdf.tb<1>() * xs[1-i]->tb<1>()).sum(red_axis); } } CNN_NODE_INST_DEV_IMPL(CwiseMultiply) @@ -1675,7 +1712,6 @@ void Sparsemax::forward_dev_impl(const MyDevice & dev, const vectortvec() - tau).cwiseMax(0.f); int c = 1; @@ -1729,7 +1765,7 @@ void SparsemaxLoss::forward_dev_impl(const MyDevice & dev, const vector(aux_mem); std::partial_sort_copy(xs[0]->v, xs[0]->v+rows, zs, zs + rows, std::greater()); float sum = 0, maxsum = 0; - unsigned k = 0; + int k = 0; for (k = 0; k < rows; ++k) { sum += zs[k]; float t = 1 + (k + 1) * zs[k]; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 70668a246..ca153f7e0 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -264,6 +264,16 @@ BOOST_AUTO_TEST_CASE( cdiv_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression cdiv(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( cdiv_batch_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = input(cg, Dim({3},2), batch_vals); + Expression y = cdiv(x1, x2) + cdiv(x2, x1); + sum_batches(input(cg, {1,3}, ones3_vals) * y); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression colwise_add(const Expression& x, const Expression& bias); BOOST_AUTO_TEST_CASE( colwise_add_gradient ) { cnn::ComputationGraph cg; @@ -614,6 +624,16 @@ BOOST_AUTO_TEST_CASE( cwise_multiply_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression cwise_multiply(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( cwise_multiply_batch_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = input(cg, Dim({3},2), batch_vals); + Expression y = cwise_multiply(x1, x2) + cwise_multiply(x2, x1); + sum_batches(input(cg, {1,3}, ones3_vals) * y); + BOOST_CHECK(CheckGrad(mod, cg, 0)); +} + // Expression dot_product(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( dot_product_gradient ) { cnn::ComputationGraph cg; From 1687f853b9648ec336c6e744570b1468b106e6d4 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 1 Jul 2016 17:57:57 +0900 Subject: [PATCH 587/965] Temporary fix of segfaults when training loaded models --- cnn/training.cc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/cnn/training.cc b/cnn/training.cc index 0eceda221..0520af593 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -9,19 +9,23 @@ #define CNN_TRAINER_INST_DEV_IMPL(MyTrainer) \ template void MyTrainer::update_rule_dev(const Device_GPU & dev, real scale, real gscale, const std::vector & values); #elif defined(HAVE_CUDA) +// This is correct, but dying when models are read and written. +// if(values[0]->device->type == DeviceType::CPU) { update_rule_dev(*(Device_CPU*)values[0]->device,scale,gscale,values); } +// else if(values[0]->device->type == DeviceType::GPU) { update_rule_dev(*(Device_GPU*)values[0]->device,scale,gscale,values); } +// else { abort(); } #define CNN_TRAINER_INST_DEV_IMPL(MyTrainer) \ extern template void MyTrainer::update_rule_dev(const Device_GPU & dev, real scale, real gscale, const std::vector & values); \ template void MyTrainer::update_rule_dev(const Device_CPU & dev, real scale, real gscale, const std::vector & values); \ void MyTrainer::update_rule(real scale, real gscale, const std::vector & values) { \ - if(values[0]->device->type == DeviceType::CPU) { update_rule_dev(*(Device_CPU*)values[0]->device,scale,gscale,values); } \ - else if(values[0]->device->type == DeviceType::GPU) { update_rule_dev(*(Device_GPU*)values[0]->device,scale,gscale,values); } \ + if(default_device->type == DeviceType::CPU) { update_rule_dev(*(Device_CPU*)default_device,scale,gscale,values); } \ + else if(default_device->type == DeviceType::GPU) { update_rule_dev(*(Device_GPU*)default_device,scale,gscale,values); } \ else { abort(); } \ } #else #define CNN_TRAINER_INST_DEV_IMPL(MyTrainer) \ template void MyTrainer::update_rule_dev(const Device_CPU & dev, real scale, real gscale, const std::vector & values); \ void MyTrainer::update_rule(real scale, real gscale, const std::vector & values) { \ - if(values[0]->device->type == DeviceType::CPU) { update_rule_dev(*(Device_CPU*)values[0]->device,scale,gscale,values); } \ + if(default_device->type == DeviceType::CPU) { update_rule_dev(*(Device_CPU*)default_device,scale,gscale,values); } \ else { abort(); } \ } #endif From 26b8be140112bc288d2208bd1c01923b13d6d504 Mon Sep 17 00:00:00 2001 From: austinma Date: Fri, 1 Jul 2016 09:38:37 -0400 Subject: [PATCH 588/965] Weight decay is now a property of a model and gets serialized correctly with the model. --- cnn/CMakeLists.txt | 1 - cnn/globals.cc | 1 + cnn/init.cc | 2 +- cnn/init.h | 2 ++ cnn/model.cc | 4 ++++ cnn/model.h | 5 ++++- cnn/param-nodes.cc | 10 +++++----- cnn/training.cc | 20 ++++++++++---------- cnn/weight-decay.cc | 7 ------- cnn/weight-decay.h | 9 +++++++-- 10 files changed, 34 insertions(+), 27 deletions(-) delete mode 100644 cnn/weight-decay.cc diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 95416dcab..9f09837f1 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -32,7 +32,6 @@ set(cnn_library_SRCS shadow-params.cc tensor.cc training.cc - weight-decay.cc ) # Headers: diff --git a/cnn/globals.cc b/cnn/globals.cc index 17362b034..d38e25e2b 100644 --- a/cnn/globals.cc +++ b/cnn/globals.cc @@ -6,5 +6,6 @@ namespace cnn { std::mt19937* rndeng = nullptr; std::vector devices; Device* default_device = nullptr; +float weight_decay_lambda; } diff --git a/cnn/init.cc b/cnn/init.cc index ea05106f0..b89cda8d3 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -60,7 +60,7 @@ void Initialize(int& argc, char**& argv, bool shared_parameters) { cerr << "[cnn] weight decay parameter must be between 0 and 1 (probably very small like 1e-6)\n"; abort(); } - global_weight_decay.SetLambda(decay); + weight_decay_lambda = decay; } } else if (arg == "--cnn-seed" || arg == "--cnn_seed") { if ((argi + 1) > argc) { diff --git a/cnn/init.h b/cnn/init.h index ab7611d77..6d6bdc2c4 100644 --- a/cnn/init.h +++ b/cnn/init.h @@ -3,6 +3,8 @@ namespace cnn { +extern float weight_decay_lambda; + void Initialize(int& argc, char**& argv, bool shared_parameters = false); void Cleanup(); diff --git a/cnn/model.cc b/cnn/model.cc index dd859b636..23f9f2058 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -209,6 +209,10 @@ void LookupParameter::Initialize(unsigned index, const std::vector& val) get()->Initialize(index, val); } +Model::Model() : gradient_norm_scratch(nullptr) { + weight_decay.SetLambda(weight_decay_lambda); +} + Model::~Model() { for (auto p : all_params) delete p; if(gradient_norm_scratch) diff --git a/cnn/model.h b/cnn/model.h index c954ccbd1..c11a5d64b 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -13,6 +13,7 @@ #include #include "cnn/tensor.h" +#include "cnn/weight-decay.h" namespace cnn { @@ -151,7 +152,7 @@ struct LookupParameter { // parameters know how to track their gradients, but any extra information (like velocity) will live here class Model { public: - Model() : gradient_norm_scratch(nullptr) {} + Model(); ~Model(); float gradient_l2_norm() const; void reset_gradient(); @@ -169,6 +170,7 @@ class Model { // That is to say, a 2x2 matrix counts as four parameters. size_t parameter_count() const; + L2WeightDecay weight_decay; private: friend class boost::serialization::access; template @@ -176,6 +178,7 @@ class Model { ar & all_params; ar & params; ar & lookup_params; + ar & weight_decay; } std::vector all_params; diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index 005843675..d7feece21 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -88,7 +88,7 @@ void LookupNode::accumulate_grad(const Tensor& g) { template void ConstParameterNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - fx.tvec().device(*dev.edevice) = params.get()->values.tvec() * global_weight_decay.CurrentWeightDecay(); + fx.tvec().device(*dev.edevice) = params.get()->values.tvec() * params.mp->weight_decay.CurrentWeightDecay(); } template @@ -111,7 +111,7 @@ void ParameterNode::forward_dev_impl(const MyDevice & dev, const vectorvalues.v; // return; // } - fx.tvec().device(*dev.edevice) = params.get()->values.tvec() * global_weight_decay.CurrentWeightDecay(); + fx.tvec().device(*dev.edevice) = params.get()->values.tvec() * params.mp->weight_decay.CurrentWeightDecay(); } template @@ -183,7 +183,7 @@ void LookupNode::forward_dev_impl(const MyDevice & dev, const vectorvalues.size()); assert (fx.d.batch_elems() == 1); - fx.tvec().device(*dev.edevice) = params.get()->values[*pindex].tvec() * global_weight_decay.CurrentWeightDecay(); + fx.tvec().device(*dev.edevice) = params.get()->values[*pindex].tvec() * params.mp->weight_decay.CurrentWeightDecay(); } else { assert (pindices); assert (fx.d.batch_elems() == pindices->size()); @@ -195,12 +195,12 @@ void LookupNode::forward_dev_impl(const MyDevice & dev, const vectorvalues[i].v, fx.d.batch_size() * sizeof(float), cudaMemcpyDeviceToDevice); #else // we should use colwise() instead of memcpy to get rid of the - // extra multiply by global_weight_decay.CurrentWeightDecay() + // extra multiply by params.mp->weight_decay.CurrentWeightDecay() memcpy(v, params.get()->values[i].v, fx.d.batch_size() * sizeof(float)); #endif } - fx.tvec().device(*dev.edevice) = fx.tvec() * global_weight_decay.CurrentWeightDecay(); + fx.tvec().device(*dev.edevice) = fx.tvec() * params.mp->weight_decay.CurrentWeightDecay(); } } diff --git a/cnn/training.cc b/cnn/training.cc index 0520af593..61b377209 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -47,10 +47,10 @@ bool is_valid(const Eigen::MatrixBase& x) { Trainer::~Trainer() {} void Trainer::rescale_and_reset_weight_decay() { - const float weight_decay = global_weight_decay.CurrentWeightDecay(); + const float weight_decay = model->weight_decay.CurrentWeightDecay(); for (auto p : model->parameters_list()) p->scale_parameters(weight_decay); - global_weight_decay.ResetWeightDecay(); + model->weight_decay.ResetWeightDecay(); } float Trainer::clip_gradients() { @@ -92,8 +92,8 @@ void Trainer::update(real scale) { } ++updates; - global_weight_decay.UpdateWeightDecay(); // update global weight scale - if (global_weight_decay.ParametersNeedRescaled()) + model->weight_decay.UpdateWeightDecay(); // update global weight scale + if (model->weight_decay.ParametersNeedRescaled()) rescale_and_reset_weight_decay(); // if wdscale is getting to small multiply all weights by wdscale, and set wdscale to 1 } @@ -104,7 +104,7 @@ void Trainer::update(real scale) { // Perform update of ts[0]=parameters, ts[1]=gradients template void SimpleSGDTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { - ts[0]->tvec().device(*dev.edevice) -= ts[1]->tvec() * (eta * scale * gscale / global_weight_decay.CurrentWeightDecay()); + ts[0]->tvec().device(*dev.edevice) -= ts[1]->tvec() * (eta * scale * gscale / model->weight_decay.CurrentWeightDecay()); } CNN_TRAINER_INST_DEV_IMPL(SimpleSGDTrainer) @@ -125,7 +125,7 @@ void SimpleSGDTrainer::update_lookup_params(real scale, real gscale, size_t idx, template void MomentumSGDTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { ts[2]->tvec().device(*dev.edevice) = ts[2]->tvec() * momentum - ts[1]->tvec() * (eta * scale * gscale); - ts[0]->tvec().device(*dev.edevice) += ts[2]->tvec() / global_weight_decay.CurrentWeightDecay(); + ts[0]->tvec().device(*dev.edevice) += ts[2]->tvec() / model->weight_decay.CurrentWeightDecay(); } CNN_TRAINER_INST_DEV_IMPL(MomentumSGDTrainer) @@ -151,7 +151,7 @@ template void AdagradTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { ts[1]->tvec().device(*dev.edevice) = ts[1]->tvec() * (scale * gscale); ts[2]->tvec().device(*dev.edevice) += ts[1]->tvec().square(); - ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() / (ts[2]->tvec() + epsilon).sqrt() * (-eta / global_weight_decay.CurrentWeightDecay()); + ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() / (ts[2]->tvec() + epsilon).sqrt() * (-eta / model->weight_decay.CurrentWeightDecay()); } CNN_TRAINER_INST_DEV_IMPL(AdagradTrainer) @@ -179,7 +179,7 @@ void AdadeltaTrainer::update_rule_dev(const MyDevice & dev, real scale, real gsc ts[2]->tvec().device(*dev.edevice) = ts[2]->tvec() * rho + ts[1]->tvec().square() * (1.f - rho); ts[1]->tvec().device(*dev.edevice) = - ts[1]->tvec() * (ts[3]->tvec() + epsilon).sqrt() / (ts[2]->tvec() + epsilon).sqrt(); ts[3]->tvec().device(*dev.edevice) = ts[3]->tvec() * rho + ts[1]->tvec().square() * (1.f - rho); - ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() / global_weight_decay.CurrentWeightDecay(); + ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() / model->weight_decay.CurrentWeightDecay(); } CNN_TRAINER_INST_DEV_IMPL(AdadeltaTrainer) @@ -211,7 +211,7 @@ void RmsPropTrainer::update_rule_dev(const MyDevice & dev, real scale, real gsca // real& d2 = hg[pi++]; // real g2 = p->g.vec().squaredNorm(); // d2 = rho * d2 + (1.f - rho) * g2; - // p->values.vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->g.vec()) / global_weight_decay.CurrentWeightDecay(); + // p->values.vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->g.vec()) / model->weight_decay.CurrentWeightDecay(); } CNN_TRAINER_INST_DEV_IMPL(RmsPropTrainer) @@ -247,7 +247,7 @@ void AdamTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, ts[3]->tvec().device(*dev.edevice) = ts[3]->tvec() * beta_2 + ts[1]->tvec().square() * (1.f - beta_2); float s1 = 1 - pow(beta_1, updates+1); float s2 = 1 - pow(beta_2, updates+1); - ts[0]->tvec().device(*dev.edevice) += ts[2]->tvec() / ((ts[3]->tvec() / s2).sqrt() + epsilon) * (-eta / s1 / global_weight_decay.CurrentWeightDecay()); + ts[0]->tvec().device(*dev.edevice) += ts[2]->tvec() / ((ts[3]->tvec() / s2).sqrt() + epsilon) * (-eta / s1 / model->weight_decay.CurrentWeightDecay()); } CNN_TRAINER_INST_DEV_IMPL(AdamTrainer) diff --git a/cnn/weight-decay.cc b/cnn/weight-decay.cc deleted file mode 100644 index ea34e4384..000000000 --- a/cnn/weight-decay.cc +++ /dev/null @@ -1,7 +0,0 @@ -#include "cnn/weight-decay.h" - -namespace cnn { - -L2WeightDecay global_weight_decay; - -} // namespace cnn diff --git a/cnn/weight-decay.h b/cnn/weight-decay.h index c36f897b7..914587118 100644 --- a/cnn/weight-decay.h +++ b/cnn/weight-decay.h @@ -34,12 +34,17 @@ struct L2WeightDecay { weight_decay = 1.0f; } private: + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & weight_decay; + ar & lambda; + } + float weight_decay; float lambda; }; -extern L2WeightDecay global_weight_decay; - } // namespace cnn #endif From f3a5574f6d174cd91998b5aeea1ba00755672d4e Mon Sep 17 00:00:00 2001 From: dhg Date: Fri, 1 Jul 2016 07:04:44 -0700 Subject: [PATCH 589/965] pycnn_viz: fix for when expression_names=None, and some other cleanup --- pycnn/pycnn_viz.py | 135 ++------------------------------------------- 1 file changed, 5 insertions(+), 130 deletions(-) diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py index cb755bed7..faff99225 100644 --- a/pycnn/pycnn_viz.py +++ b/pycnn/pycnn_viz.py @@ -162,30 +162,6 @@ def GVExpr(name, args, dim): graphviz_items.append(e) return e -# class Parameters(Expression): -# def __init__(self, name, args, dim): -# super(LookupParameters, self).__init__(name, args, dim) -# graphviz_items.append(self) -# def shape(self): -# if self.thisptr.dim.ndims() == 1: return (self.thisptr.dim.rows()) -# return (self.thisptr.dim.rows(), self.thisptr.dim.cols()) -# def as_array(self): return None -# def load_array(self, arr): pass -# -# class LookupParameters(Expression): -# def __init__(self, name, args, dim): -# super(LookupParameters, self).__init__(name, args, dim) -# graphviz_items.append(self) -# def init_from_array(self, arr): pass -# def shape(self): -# if self.thisptr.dim.cols() != 1: -# return (self.thisptr.values.size(), self.thisptr.dim.rows(), self.thisptr.dim.cols()) -# return (self.thisptr.values.size(), self.thisptr.dim.rows()) -# def __getitem__(self, i): return lookup(self, i) -# def batch(self, i): return lookup_batch(self, i) -# def init_row(self, i, row): pass -# def as_array(self): return None - class Model(object): def __init__(self): @@ -396,10 +372,7 @@ def new_builder_num(): builder_num += 1 return builder_num -class RNNBuilder(object): - def __init__(self, layers, input_dim, hidden_dim, model): - raise RuntimeError("Cannot instantiate RNNBuilder directly.") - +class _RNNBuilder(object): def new_graph(self): self.cg_version = _cg.version() self.builder_version = new_builder_num() @@ -486,7 +459,7 @@ def initial_state_from_raw_vectors(self,vecs=None): self._init_state = RNNState(self, -1) return self._init_state -class SimpleRNNBuilder(RNNBuilder): +class SimpleRNNBuilder(_RNNBuilder): def __init__(self, layers, input_dim, hidden_dim, model): self.cg_version = -1 self.layers = layers @@ -496,7 +469,7 @@ def __init__(self, layers, input_dim, hidden_dim, model): self._init_state = None self.builder_version = new_builder_num() def whoami(self): return "SimpleRNNBuilder" -class LSTMBuilder(RNNBuilder): +class LSTMBuilder(_RNNBuilder): def __init__(self, layers, input_dim, hidden_dim, model): self.cg_version = -1 self.layers = layers @@ -506,7 +479,7 @@ def __init__(self, layers, input_dim, hidden_dim, model): self._init_state = None self.builder_version = new_builder_num() def whoami(self): return "LSTMBuilder" -class FastLSTMBuilder(RNNBuilder): +class FastLSTMBuilder(_RNNBuilder): def __init__(self, layers, input_dim, hidden_dim, model): self.cg_version = -1 self.layers = layers @@ -634,25 +607,6 @@ def transduce(self, xs): def output(self): return self._out -# def h(self): -# """ -# tuple of expressions representing the output of each hidden layer -# of the current step. -# the actual output of the network is at h()[-1]. -# """ -# return tuple(self.builder.get_h(CRNNPointer(self.state_idx))) -# -# def s(self): -# """ -# tuple of expressions representing the hidden state of the current -# step. -# -# For SimpleRNN, s() is the same as h() -# For LSTM, s() is a series of of memory vectors, followed the series -# followed by the series returned by h(). -# """ -# return tuple(self.builder.get_s(CRNNPointer(self.state_idx))) - def prev(self): return self._prev def b(self): return self.builder def get_state_idx(self): return self.state_idx @@ -763,7 +717,7 @@ def make_network_graph(compact, expression_names, lookup_names): var_name_dict = dict() for e in graphviz_items: # e: Expression - if e in expression_names: + if expression_names and (e in expression_names): var_name_dict[e.vindex] = expression_names[e] elif e.name == 'parameters' or e.name == 'lookup_parameters': [name, _dim] = e.args @@ -1031,82 +985,3 @@ def PrintGraphviz(compact=False, show_dims=True, expression_names=None, lookup_n print ' %s -> %s [style=dotted];' % (name_p, name_n) # ,dir=both print '}' - - - - - - - - - - - -class BiRNNBuilder(object): - def __init__(self, num_layers, input_dim, hidden_dim, model, rnn_builder_factory): - assert num_layers > 0 - assert hidden_dim % 2 == 0 - self.builder_layers = [] - f = rnn_builder_factory(1, input_dim, hidden_dim/2, model) - b = rnn_builder_factory(1, input_dim, hidden_dim/2, model) - self.builder_layers.append((f,b)) - for _ in xrange(num_layers-1): - f = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) - b = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) - self.builder_layers.append((f,b)) - - def whoami(self): return "BiRNNBuilder" - - def add_inputs(self, es): - """ - returns the list of state pairs (stateF, stateB) obtained by adding - inputs to both forward (stateF) and backward (stateB) RNNs. - - see also transduce(xs) - - .transduce(xs) is different from .add_inputs(xs) in the following way: - - .add_inputs(xs) returns a list of RNNState pairs. RNNState objects can be - queried in various ways. In particular, they allow access to the previous - state, as well as to the state-vectors (h() and s() ) - - .transduce(xs) returns a list of Expression. These are just the output - expressions. For many cases, this suffices. - transduce is much more memory efficient than add_inputs. - """ - for e in es: - ensure_freshness(e) - for (fb,bb) in self.builder_layers[:-1]: - fs = fb.initial_state().transduce(es) - bs = bb.initial_state().transduce(reversed(es)) - es = [concatenate([f,b]) for f,b in zip(fs, reversed(bs))] - (fb,bb) = self.builder_layers[-1] - fs = fb.initial_state().add_inputs(es) - bs = bb.initial_state().add_inputs(reversed(es)) - return [(f,b) for f,b in zip(fs, reversed(bs))] - - def transduce(self, es): - """ - returns the list of output Expressions obtained by adding the given inputs - to the current state, one by one, to both the forward and backward RNNs, - and concatenating. - - see also add_inputs(xs) - - .transduce(xs) is different from .add_inputs(xs) in the following way: - - .add_inputs(xs) returns a list of RNNState pairs. RNNState objects can be - queried in various ways. In particular, they allow access to the previous - state, as well as to the state-vectors (h() and s() ) - - .transduce(xs) returns a list of Expression. These are just the output - expressions. For many cases, this suffices. - transduce is much more memory efficient than add_inputs. - """ - for e in es: - ensure_freshness(e) - for (fb,bb) in self.builder_layers: - fs = fb.initial_state().transduce(es) - bs = bb.initial_state().transduce(reversed(es)) - es = [concatenate([f,b]) for f,b in zip(fs, reversed(bs))] - return es From b0e74200babd7a1ac755e202592e1bbf78291dd8 Mon Sep 17 00:00:00 2001 From: Dan Garrette Date: Fri, 1 Jul 2016 14:20:02 -0500 Subject: [PATCH 590/965] update pycnn_viz for v2 --- pycnn/pycnn_viz.py | 73 +++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py index faff99225..ff1b121d8 100644 --- a/pycnn/pycnn_viz.py +++ b/pycnn/pycnn_viz.py @@ -118,7 +118,7 @@ def get_vindex(self): return self.vindex def __repr__(self): return str(self) def __str__(self): return '%s([%s], %s, %s/%s)' % (self.name, ', '.join(map(str,self.args)), self.dim, self.vindex, self.cg_version) #"expression %s/%s" % (self.vindex, self.cg_version) - def __getitem__(self, i): return None + def __getitem__(self, i): return lookup(self, i) def __getslice__(self, i, j): return None def scalar_value(self, recalculate=False): return 0.0 def vec_value(self, recalculate=False): return [] @@ -126,6 +126,7 @@ def npvalue(self, recalculate=False): return None def value(self, recalculate=False): return None def forward(self, recalculate=False): return None def set(self, x): pass + def batch(self, i): return lookup_batch(self, i) def backward(self): pass @@ -164,28 +165,18 @@ def GVExpr(name, args, dim): class Model(object): - def __init__(self): - self.named_params = {} - self.lookups = [] - self.regular = [] - - def add_parameters(self, name, dim, scale=0): - assert(name not in self.named_params), "name already registered" - pp = Expression('parameters', [name, dim], make_dim(dim)) - self.named_params[name] = pp - self.regular.append(name) + def add_parameters(self, dim, scale=0): + assert(isinstance(dim,(tuple,int))) + pp = Expression('parameters', [dim], make_dim(dim)) return pp - def add_lookup_parameters(self, name, dim): + def add_lookup_parameters(self, dim): assert(isinstance(dim, tuple)) - assert(name not in self.named_params), "name already registered" - pp = Expression('lookup_parameters', [name, dim], make_dim(dim[1])) - self.named_params[name] = pp - self.lookups.append(name) + pp = Expression('lookup_parameters', [dim], make_dim(dim[1])) return pp - def __getitem__(self, name): return self.named_params[name] - def __contains__(self, name): return name in self.named_params + def save_all(self, fname): pass + def load_all(self, fname): pass def save(self, fname): pass def load(self, fname): pass @@ -651,15 +642,15 @@ def update(self, s=1.0): pass def update_epoch(self, r = 1.0): pass def status(self): pass class SimpleSGDTrainer(Trainer): - def __init__(self, m, lam = 1e-6, e0 = 0.1): pass + def __init__(self, m, e0 = 0.1): pass class MomentumSGDTrainer(Trainer): - def __init__(self, m, lam = 1e-6, e0 = 0.01, mom = 0.9): pass + def __init__(self, m, e0 = 0.01, mom = 0.9): pass class AdagradTrainer(Trainer): - def __init__(self, m, lam = 1e-6, e0 = 0.1, eps = 1e-20): pass + def __init__(self, m, e0 = 0.1, eps = 1e-20): pass class AdadeltaTrainer(Trainer): - def __init__(self, m, lam = 1e-6, eps = 1e-6, rho = 0.95): pass + def __init__(self, m, eps = 1e-6, rho = 0.95): pass class AdamTrainer(Trainer): - def __init__(self, m, lam = 1e-6, alpha = 0.001, beta_1 = 0.9, beta_2 = 0.999, eps = 1e-8 ): pass + def __init__(self, m, alpha = 0.001, beta_1 = 0.9, beta_2 = 0.999, eps = 1e-8 ): pass @@ -716,12 +707,10 @@ def make_network_graph(compact, expression_names, lookup_names): # edges = defaultdict(set) # parent -> (child, extra) var_name_dict = dict() - for e in graphviz_items: # e: Expression - if expression_names and (e in expression_names): - var_name_dict[e.vindex] = expression_names[e] - elif e.name == 'parameters' or e.name == 'lookup_parameters': - [name, _dim] = e.args - var_name_dict[e.vindex] = name + if expression_names: + for e in graphviz_items: # e: Expression + if e in expression_names: + var_name_dict[e.vindex] = expression_names[e] rnn_bldr_name = defaultdict(lambda: chr(len(rnn_bldr_name)+ord('A'))) def vidx2str(vidx): return '%s%s' % ('N', vidx) @@ -748,23 +737,35 @@ def vidx2str(vidx): return '%s%s' % ('N', vidx) [_v, _d] = args arg_strs = [] elif f_name == 'parameters': - [name, _dim] = args + [_dim] = args arg_strs = [] if compact: - f_name = var_name_dict[vidx] + if vidx in var_name_dict: + f_name = var_name_dict[vidx] node_type = '1_param' elif f_name == 'lookup_parameters': - [name, _dim] = args + [_dim] = args arg_strs = [] if compact: - f_name = var_name_dict[vidx] + if vidx in var_name_dict: + f_name = var_name_dict[vidx] node_type = '1_param' elif f_name == 'lookup': [p, idx, update] = args - [name, _dim] = p.args - item_name = ('\\"%s\\"' % (lookup_names[name][idx],)) if (lookup_names and (name in lookup_names)) else None + [_dim] = p.args + if vidx in var_name_dict: + name = var_name_dict[vidx] + item_name = ('\\"%s\\"' % (lookup_names[name][idx],)) if (lookup_names and (name in lookup_names)) else None + else: + name = None + item_name = None if compact: - f_name = item_name if item_name is not None else ('%s[%s]' % (name, idx)) + if item_name is not None: + f_name = item_name + elif name is not None: + f_name = '%s[%s]' % (name, idx) + else: + f_name = 'lookup(%s)' % (idx) arg_strs = [] else: arg_strs = [var_name_dict.get(p.vindex, 'v%d' % (p.vindex))] From 75b3110582e7f3436fbd7ffc410a269e10614667 Mon Sep 17 00:00:00 2001 From: dhg Date: Fri, 1 Jul 2016 13:24:13 -0700 Subject: [PATCH 591/965] updated pycnn_viz for recent additions to pycnn.pyx --- pycnn/pycnn_viz.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py index ff1b121d8..599e77ba6 100644 --- a/pycnn/pycnn_viz.py +++ b/pycnn/pycnn_viz.py @@ -269,6 +269,14 @@ def conv1d_wide(x, y): else: d = make_dim(x.dim[0], x.dim[1] + y.dim[1] - 1) return GVExpr('conv1d_wide', [x,y], d) +def filter1d_narrow(x, y): + if x.dim.invalid() or y.dim.invalid(): + d = InvalidDim + elif x.dim[0] != y.dim[0]: + d = InvalidConcreteDim(x.dim, y.dim) + else: + d = make_dim(x.dim[0], x.dim[1] - y.dim[1] + 1) + return GVExpr('filter1d_narrow', [x,y], d) # unary-exp def tanh(x): return GVExpr('tanh', [x], copy_dim(x)) @@ -364,6 +372,9 @@ def new_builder_num(): return builder_num class _RNNBuilder(object): + def set_dropout(self, f): pass + def disable_dropout(self): pass + def new_graph(self): self.cg_version = _cg.version() self.builder_version = new_builder_num() From 05db140a44491b143b9607b0687e02ef219a0103 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 6 Jul 2016 15:17:51 +0900 Subject: [PATCH 592/965] Wrote device-specific code for GPUs --- cnn/hsm-builder.cc | 1 + cnn/model.cc | 277 ++++++++++++++++++++++------------- cnn/model.h | 20 ++- examples/segrnn-sup.cc | 2 +- examples/xor-batch-lookup.cc | 16 +- 5 files changed, 206 insertions(+), 110 deletions(-) diff --git a/cnn/hsm-builder.cc b/cnn/hsm-builder.cc index 381e12ca3..a141a437f 100644 --- a/cnn/hsm-builder.cc +++ b/cnn/hsm-builder.cc @@ -241,6 +241,7 @@ unsigned HierarchicalSoftmaxBuilder::sample(const expr::Expression& rep) { Expression HierarchicalSoftmaxBuilder::full_log_distribution(const Expression& rep) { assert (false && "full_distribution not implemented for HierarchicalSoftmaxBuilder"); + return cnn::expr::Expression(); } inline bool is_ws(char x) { return (x == ' ' || x == '\t'); } diff --git a/cnn/model.cc b/cnn/model.cc index 23f9f2058..75ebd5d07 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -11,9 +11,27 @@ #include #include -#if HAVE_CUDA -#include "cnn/gpu-ops.h" -#include "cnn/cuda.h" +// Macros for defining functions over parameters +// NOTE: This only works on the default device, as parameters are currently defined over default devices +#ifdef __CUDACC__ +#define CNN_PARAMNORM_INST_DEV_IMPL(MyParam, regular_func, dev_func) \ + template void MyParam::dev_func(Device_GPU & dev, float *sqnorm) const; +#elif defined(HAVE_CUDA) +#define CNN_PARAMNORM_INST_DEV_IMPL(MyParam, regular_func, dev_func) \ + extern template void MyParam::dev_func(Device_GPU & dev, float *sqnorm) const; \ + template void MyParam::dev_func(Device_CPU & dev, float *sqnorm) const; \ + void MyParam::regular_func(float *sqnorm) const { \ + if(default_device->type == DeviceType::CPU) { dev_func(*(Device_CPU*)default_device,sqnorm); } \ + else if(default_device->type == DeviceType::GPU) { dev_func(*(Device_GPU*)default_device,sqnorm); } \ + else { abort(); } \ + } +#else +#define CNN_PARAMNORM_INST_DEV_IMPL(MyParam, regular_func, dev_func) \ + template void MyParam::dev_func(Device_CPU & dev, float *sqnorm) const; \ + void MyParam::regular_func(float *sqnorm) const { \ + if(default_device->type == DeviceType::CPU) { dev_func(*(Device_CPU*)default_device,sqnorm); } \ + else { abort(); } \ + } #endif using namespace std; @@ -23,6 +41,9 @@ BOOST_CLASS_EXPORT_IMPLEMENT(cnn::LookupParameterStorage) namespace cnn { +// CPU only functions +#ifndef __CUDACC__ + ParameterStorageBase::~ParameterStorageBase() {} ParameterStorage::ParameterStorage(const Dim& d, float scale) : dim(d) { @@ -50,35 +71,11 @@ void ParameterStorage::zero() { clear(); } -void ParameterStorage::squared_l2norm(float* sqnorm) const { -#if HAVE_CUDA - gpu::l2_norm_reducer(values.d.size(), values.v, sqnorm, true, false); -#else - *sqnorm = (*values).squaredNorm(); -#endif -} - -void ParameterStorage::g_squared_l2norm(float* sqnorm) const { -#if HAVE_CUDA - gpu::l2_norm_reducer(g.d.size(), g.v, sqnorm, true, false); -#else - *sqnorm = g.vec().squaredNorm(); -#endif -} - void ParameterStorage::copy(const ParameterStorage & param) { assert(dim == param.dim); TensorTools::CopyElements(values, param.values); } -void ParameterStorage::accumulate_grad(const Tensor& d) { -#if HAVE_CUDA - CUBLAS_CHECK(cublasSaxpy(cublas_handle, g.d.size(), kSCALAR_ONE, d.v, 1, g.v, 1)); -#else - g.vec() += d.vec(); -#endif -} - void ParameterStorage::clear() { TensorTools::Zero(g); } @@ -110,65 +107,16 @@ void LookupParameterStorage::zero() { clear(); } -void LookupParameterStorage::Initialize(unsigned index, const vector& val) { - assert(int(val.size()) == int(dim.size())); -#if HAVE_CUDA - cerr << "implement LookupParameterStorage::Initialize\n"; - throw cuda_not_implemented("LookupParameterStorage::Initialize"); -#else - memcpy(values[index].v, &val[0], val.size() * sizeof(float)); -#endif -} - size_t LookupParameterStorage::size() const { return values.size() * dim.size(); } -void LookupParameterStorage::g_squared_l2norm(float* sqnorm) const { -#if HAVE_CUDA - bool acc = false; - for (auto i : non_zero_grads) { - gpu::l2_norm_reducer(grads[i].d.size(), grads[i].v, sqnorm, true, acc); - acc = true; - } -#else - real a = 0; - for (auto i : non_zero_grads) - a += (*grads[i]).squaredNorm(); - *sqnorm = a; -#endif -} - -void LookupParameterStorage::squared_l2norm(float* sqnorm) const { -#if HAVE_CUDA - bool acc = false; - for (unsigned i = 0; i < values.size(); ++i) { - gpu::l2_norm_reducer(values[i].d.size(), values[i].v, sqnorm, true, acc); - acc = true; - } -#else - float a = 0; - for (unsigned i = 0; i < values.size(); ++i) - a += (*values[i]).squaredNorm(); - *sqnorm = a; -#endif -} - void LookupParameterStorage::copy(const LookupParameterStorage& param) { assert(dim == param.dim); for(size_t i = 0; i < param.values.size(); ++i) TensorTools::CopyElements(values[i], param.values[i]); } -void LookupParameterStorage::accumulate_grad(unsigned index, const Tensor& d) { - non_zero_grads.insert(index); -#if HAVE_CUDA - CUBLAS_CHECK(cublasSaxpy(cublas_handle, d.d.size(), kSCALAR_ONE, d.v, 1, grads[index].v, 1)); -#else - *grads[index] += *d; -#endif -} - void LookupParameterStorage::clear() { for (auto i : non_zero_grads) TensorTools::Zero(grads[i]); @@ -205,8 +153,8 @@ void LookupParameter::zero() { return mp->lookup_parameters_list()[index]->zero(); } -void LookupParameter::Initialize(unsigned index, const std::vector& val) const { - get()->Initialize(index, val); +void LookupParameter::initialize(unsigned index, const std::vector& val) const { + get()->initialize(index, val); } Model::Model() : gradient_norm_scratch(nullptr) { @@ -234,27 +182,6 @@ void Model::project_weights(float radius) { cerr << "NORM: " << sqrt(gg) << endl; } -float Model::gradient_l2_norm() const { - if (!gradient_norm_scratch) - gradient_norm_scratch = (float*)default_device->mem->malloc(all_params.size() * sizeof(float)); - int pi = 0; - for (auto p : all_params) { - p->g_squared_l2norm(&gradient_norm_scratch[pi]); - ++pi; - } -#if HAVE_CUDA - float res = 0; - gpu::l2_norm_reducer(all_params.size(), gradient_norm_scratch, gradient_norm_scratch, false, false); - cudaMemcpy(&res, gradient_norm_scratch, sizeof(float), cudaMemcpyDeviceToHost); - return sqrt(res); -#else - double gg = 0; - for (int i = 0; i < pi; ++i) - gg += gradient_norm_scratch[i]; - return sqrt(gg); -#endif -} - Parameter Model::add_parameters(const Dim& d, float scale) { ParameterStorage* p = new ParameterStorage(d, scale); Parameter r(this, params.size()); @@ -298,4 +225,156 @@ void load_cnn_model(std::string filename, Model* model) { ia >> (*model); }; +#endif + +// CPU/GPU code +// TODO: It's a bit annoying to re-implement the CPU/GPU control code for each +// function, but it's not clear how to handle heterogeneous functions w/ +// macros + +// Take the squared norm +template +void ParameterStorage::squared_l2norm_dev(MyDevice & dev, float* sqnorm) const { + Tensor sqnorm_t({1}, sqnorm, &dev); + sqnorm_t.t<0>().device(*dev.edevice) = values.tvec().square().sum(); +} +CNN_PARAMNORM_INST_DEV_IMPL(ParameterStorage, squared_l2norm, squared_l2norm_dev) + +// Take the squared norm of the gradient +template +void ParameterStorage::g_squared_l2norm_dev(MyDevice & dev, float* sqnorm) const { + Tensor sqnorm_t({1}, sqnorm, &dev); + sqnorm_t.t<0>().device(*dev.edevice) = g.tvec().square().sum(); +} +CNN_PARAMNORM_INST_DEV_IMPL(ParameterStorage, g_squared_l2norm, g_squared_l2norm_dev) + +template +void ParameterStorage::accumulate_grad_dev(MyDevice & dev, const Tensor& d) { + g.tvec().device(*dev.edevice) += d.tvec(); +} +#ifdef __CUDACC__ + template void ParameterStorage::accumulate_grad_dev(Device_GPU & dev, const Tensor& d) const; +#elif defined(HAVE_CUDA) + extern template void ParameterStorage::accumulate_grad_dev(Device_GPU & dev, const Tensor& d) const; + template void ParameterStorage::accumulate_grad_dev(Device_CPU & dev, const Tensor& d) const; + void ParameterStorage::accumulate_grad(const Tensor& d) { + if(values.device->type == DeviceType::CPU) { accumulate_grad_dev(*(Device_CPU*)values.device,d); } + else if(values.device->type == DeviceType::GPU) { accumulate_grad_dev(*(Device_GPU*)values.device,d); } + else { abort(); } + } +#else + template void ParameterStorage::accumulate_grad_dev(Device_CPU & dev, const Tensor& d); + void ParameterStorage::accumulate_grad(const Tensor& d) { + if(default_device->type == DeviceType::CPU) { accumulate_grad_dev(*(Device_CPU*)default_device,d); } + else { abort(); } + } +#endif + +template +void LookupParameterStorage::initialize_dev(MyDevice & dev, unsigned index, const vector& val) { + assert(int(val.size()) == int(dim.size())); +#ifdef __CUDACC__ + cudaMemcpyAsync(values[index].v, &val[0], val.size() * sizeof(float), cudaMemcpyHostToDevice); +#else + memcpy(values[index].v, &val[0], val.size() * sizeof(float)); +#endif +} +#ifdef __CUDACC__ + template void LookupParameterStorage::initialize_dev(Device_GPU & dev, unsigned index, const vector& val) const; +#elif defined(HAVE_CUDA) + extern template void LookupParameterStorage::initialize_dev(Device_GPU & dev, unsigned index, const vector& val) const; + template void LookupParameterStorage::initialize_dev(Device_CPU & dev, unsigned index, const vector& val) const; + void LookupParameterStorage::initialize(const Tensor& d) { + if(values.device->type == DeviceType::CPU) { initialize_dev(*(Device_CPU*)values.device,index,val); } + else if(values.device->type == DeviceType::GPU) { initialize_dev(*(Device_GPU*)values.device,index,val); } + else { abort(); } + } +#else + template void LookupParameterStorage::initialize_dev(Device_CPU & dev, unsigned index, const vector& val); + void LookupParameterStorage::initialize(unsigned index, const vector& val) { + if(default_device->type == DeviceType::CPU) { initialize_dev(*(Device_CPU*)default_device,index,val); } + else { abort(); } + } +#endif + +template +void LookupParameterStorage::squared_l2norm_dev(MyDevice & dev, float* sqnorm) const { + Tensor sqnorm_t({1}, sqnorm, &dev); + sqnorm_t.t<0>().device(*dev.edevice) = values[0].tvec().square().sum(); + for (unsigned i = 1; i < values.size(); ++i) + sqnorm_t.t<0>().device(*dev.edevice) += values[i].tvec().square().sum(); +} +CNN_PARAMNORM_INST_DEV_IMPL(LookupParameterStorage, squared_l2norm, squared_l2norm_dev) + +template +void LookupParameterStorage::g_squared_l2norm_dev(MyDevice & dev, float* sqnorm) const { + Tensor sqnorm_t({1}, sqnorm, &dev); + auto it = non_zero_grads.begin(); + assert(it != non_zero_grads.end()); + sqnorm_t.t<0>().device(*dev.edevice) = grads[*(it++)].tvec().square().sum(); + while(it != non_zero_grads.end()) + sqnorm_t.t<0>().device(*dev.edevice) += grads[*(it++)].tvec().square().sum(); +} +CNN_PARAMNORM_INST_DEV_IMPL(LookupParameterStorage, g_squared_l2norm, g_squared_l2norm_dev) + +template +void LookupParameterStorage::accumulate_grad_dev(MyDevice & dev, unsigned index, const Tensor& d) { + non_zero_grads.insert(index); + grads[index].tvec().device(*dev.edevice) += d.tvec(); +} +#ifdef __CUDACC__ + template void LookupParameterStorage::accumulate_grad_dev(Device_GPU & dev, unsigned index, const Tensor& d); +#elif defined(HAVE_CUDA) + extern template void LookupParameterStorage::accumulate_grad_dev(Device_GPU & dev, unsigned index, const Tensor& d); + template void LookupParameterStorage::accumulate_grad_dev(Device_CPU & dev, unsigned index, const Tensor& d); + void LookupParameterStorage::accumulate_grad(unsigned index, const Tensor& d) { + if(values.device->type == DeviceType::CPU) { accumulate_grad_dev(*(Device_CPU*)values.device,index,d); } + else if(values.device->type == DeviceType::GPU) { accumulate_grad_dev(*(Device_GPU*)values.device,index,d); } + else { abort(); } + } +#else + template void LookupParameterStorage::accumulate_grad_dev(Device_CPU & dev, unsigned index, const Tensor& d); + void LookupParameterStorage::accumulate_grad(unsigned index, const Tensor& d) { + if(default_device->type == DeviceType::CPU) { accumulate_grad_dev(*(Device_CPU*)default_device,index,d); } + else { abort(); } + } +#endif + +template +float Model::gradient_l2_norm_dev(MyDevice & dev) const { + if (!gradient_norm_scratch) + gradient_norm_scratch = (float*)default_device->mem->malloc((all_params.size()+1) * sizeof(float)); + size_t pi; + for(pi = 0; pi < all_params.size(); ++pi) + all_params[pi]->g_squared_l2norm(&gradient_norm_scratch[pi]); + Tensor scratch_t({(unsigned int)all_params.size()}, gradient_norm_scratch, &dev); + Tensor sum_t({1}, gradient_norm_scratch+pi, &dev); + sum_t.t<0>().device(*dev.edevice) = scratch_t.t<1>().sum().sqrt(); +#ifdef __CUDACC__ + float res = 0; + cudaMemcpy(&res, gradient_norm_scratch, sizeof(float), cudaMemcpyDeviceToHost); + return res; +#else + return gradient_norm_scratch[pi]; +#endif +} +#ifdef __CUDACC__ + template float Model::gradient_l2_norm_dev(Device_GPU & dev) const; +#elif defined(HAVE_CUDA) + extern template float Model::gradient_l2_norm_dev(Device_GPU & dev) const; + template float Model::gradient_l2_norm_dev(Device_CPU & dev) const; + float Model::gradient_l2_norm() const { + if(values.device->type == DeviceType::CPU) { return gradient_l2_norm_dev(*(Device_CPU*)values.device); } + else if(values.device->type == DeviceType::GPU) { return gradient_l2_norm_dev(*(Device_GPU*)values.device); } + else { abort(); } + } +#else + template float Model::gradient_l2_norm_dev(Device_CPU & dev) const; + float Model::gradient_l2_norm() const { + if(default_device->type == DeviceType::CPU) { return gradient_l2_norm_dev(*(Device_CPU*)default_device); } + else { abort(); } + } +#endif + + } // namespace cnn diff --git a/cnn/model.h b/cnn/model.h index c11a5d64b..1bb2adaf7 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -41,11 +41,17 @@ struct ParameterStorage : public ParameterStorageBase { friend class Model; void scale_parameters(float a) override; void zero() override; + template + void squared_l2norm_dev(MyDevice & dev, float* sqnorm) const; void squared_l2norm(float* sqnorm) const override; + template + void g_squared_l2norm_dev(MyDevice & dev, float* sqnorm) const; void g_squared_l2norm(float* sqnorm) const override; size_t size() const override; void copy(const ParameterStorage & val); + template + void accumulate_grad_dev(MyDevice & dev, const Tensor& g); void accumulate_grad(const Tensor& g); void clear(); @@ -71,12 +77,20 @@ struct LookupParameterStorage : public ParameterStorageBase { friend class Model; void scale_parameters(float a) override; void zero() override; + template + void squared_l2norm_dev(MyDevice & dev, float* sqnorm) const; void squared_l2norm(float* sqnorm) const override; + template + void g_squared_l2norm_dev(MyDevice & dev, float* sqnorm) const; void g_squared_l2norm(float* sqnorm) const override; size_t size() const override; - void Initialize(unsigned index, const std::vector& val); + template + void initialize_dev(MyDevice & dev, unsigned index, const std::vector& val); + void initialize(unsigned index, const std::vector& val); void copy(const LookupParameterStorage & val); + template + void accumulate_grad_dev(MyDevice & dev, unsigned index, const Tensor& g); void accumulate_grad(unsigned index, const Tensor& g); void clear(); @@ -126,7 +140,7 @@ struct LookupParameter { LookupParameter(); LookupParameter(const Model* mp, unsigned long index); LookupParameterStorage* get() const; - void Initialize(unsigned index, const std::vector& val) const; + void initialize(unsigned index, const std::vector& val) const; // Zero the parameters void zero(); @@ -154,6 +168,8 @@ class Model { public: Model(); ~Model(); + template + float gradient_l2_norm_dev(MyDevice & dev) const; float gradient_l2_norm() const; void reset_gradient(); // set scale to use custom initialization diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index ae43fa079..0dccacd3a 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -89,7 +89,7 @@ struct SymbolEmbedding { } if (d.Contains(word)){ // cout << "init" << endl; - p_labels.Initialize(d.Convert(word), p_embeding); + p_labels.initialize(d.Convert(word), p_embeding); } } } diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup.cc index 3ca9608a1..0a123a4cd 100644 --- a/examples/xor-batch-lookup.cc +++ b/examples/xor-batch-lookup.cc @@ -42,14 +42,14 @@ int main(int argc, char** argv) { LookupParameter x_values = m.add_lookup_parameters(4, {2}); LookupParameter y_values = m.add_lookup_parameters(4, {1}); - x_values.Initialize(0, {1.0, 1.0}); - x_values.Initialize(1, {-1.0, 1.0}); - x_values.Initialize(2, {1.0, -1.0}); - x_values.Initialize(3, {-1.0, -1.0}); - y_values.Initialize(0, {-1.0}); - y_values.Initialize(1, {1.0}); - y_values.Initialize(2, {1.0}); - y_values.Initialize(3, {-1.0}); + x_values.initialize(0, {1.0, 1.0}); + x_values.initialize(1, {-1.0, 1.0}); + x_values.initialize(2, {1.0, -1.0}); + x_values.initialize(3, {-1.0, -1.0}); + y_values.initialize(0, {-1.0}); + y_values.initialize(1, {1.0}); + y_values.initialize(2, {1.0}); + y_values.initialize(3, {-1.0}); } Expression W = parameter(cg, p_W); From 87e310a36bea8a6ab8ce3490b86761bc09de1ecb Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 7 Jul 2016 01:26:12 +0900 Subject: [PATCH 593/965] Fixed parameters and cublas on GPU --- cnn/cuda.cc | 6 ------ cnn/cuda.h | 1 - cnn/gpu-model.cu | 3 +++ cnn/model.cc | 31 ++++++++++++++++++------------- cnn/nodes.cc | 48 ++++++++++++++++++++++++------------------------ 5 files changed, 45 insertions(+), 44 deletions(-) create mode 100644 cnn/gpu-model.cu diff --git a/cnn/cuda.cc b/cnn/cuda.cc index ee60f52a3..0456084e9 100644 --- a/cnn/cuda.cc +++ b/cnn/cuda.cc @@ -9,8 +9,6 @@ using namespace std; namespace cnn { -cublasHandle_t cublas_handle; - static void RemoveArgs(int& argc, char**& argv, int& argi, int n) { for (int i = argi + n; i < argc; ++i) argv[i - n] = argv[i]; @@ -155,10 +153,6 @@ vector Initialize_GPU(int& argc, char**& argv) { } cerr << endl; - // eventually kill the global handle - CUDA_CHECK(cudaSetDevice(gpus[0])); - CUBLAS_CHECK(cublasCreate(&cublas_handle)); - CUBLAS_CHECK(cublasSetPointerMode(cublas_handle, CUBLAS_POINTER_MODE_DEVICE)); return gpudevices; } diff --git a/cnn/cuda.h b/cnn/cuda.h index d0fa10965..457b18ed4 100644 --- a/cnn/cuda.h +++ b/cnn/cuda.h @@ -49,7 +49,6 @@ inline std::pair SizeToBlockThreadPair(int n) { } std::vector Initialize_GPU(int& argc, char**& argv); -extern cublasHandle_t cublas_handle; } // namespace cnn diff --git a/cnn/gpu-model.cu b/cnn/gpu-model.cu new file mode 100644 index 000000000..73638f402 --- /dev/null +++ b/cnn/gpu-model.cu @@ -0,0 +1,3 @@ +// This is a dummy file that contains the same content as model.cc but compiled +// on CUDA +#include "model.cc" diff --git a/cnn/model.cc b/cnn/model.cc index 75ebd5d07..8ea0c9e98 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -8,8 +8,11 @@ #include #include + +#ifndef __CUDACC__ #include #include +#endif // Macros for defining functions over parameters // NOTE: This only works on the default device, as parameters are currently defined over default devices @@ -36,8 +39,10 @@ using namespace std; +#ifndef __CUDACC__ BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ParameterStorage) BOOST_CLASS_EXPORT_IMPLEMENT(cnn::LookupParameterStorage) +#endif namespace cnn { @@ -253,10 +258,10 @@ void ParameterStorage::accumulate_grad_dev(MyDevice & dev, const Tensor& d) { g.tvec().device(*dev.edevice) += d.tvec(); } #ifdef __CUDACC__ - template void ParameterStorage::accumulate_grad_dev(Device_GPU & dev, const Tensor& d) const; + template void ParameterStorage::accumulate_grad_dev(Device_GPU & dev, const Tensor& d); #elif defined(HAVE_CUDA) - extern template void ParameterStorage::accumulate_grad_dev(Device_GPU & dev, const Tensor& d) const; - template void ParameterStorage::accumulate_grad_dev(Device_CPU & dev, const Tensor& d) const; + extern template void ParameterStorage::accumulate_grad_dev(Device_GPU & dev, const Tensor& d); + template void ParameterStorage::accumulate_grad_dev(Device_CPU & dev, const Tensor& d); void ParameterStorage::accumulate_grad(const Tensor& d) { if(values.device->type == DeviceType::CPU) { accumulate_grad_dev(*(Device_CPU*)values.device,d); } else if(values.device->type == DeviceType::GPU) { accumulate_grad_dev(*(Device_GPU*)values.device,d); } @@ -280,13 +285,13 @@ void LookupParameterStorage::initialize_dev(MyDevice & dev, unsigned index, cons #endif } #ifdef __CUDACC__ - template void LookupParameterStorage::initialize_dev(Device_GPU & dev, unsigned index, const vector& val) const; + template void LookupParameterStorage::initialize_dev(Device_GPU & dev, unsigned index, const vector& val); #elif defined(HAVE_CUDA) - extern template void LookupParameterStorage::initialize_dev(Device_GPU & dev, unsigned index, const vector& val) const; - template void LookupParameterStorage::initialize_dev(Device_CPU & dev, unsigned index, const vector& val) const; - void LookupParameterStorage::initialize(const Tensor& d) { - if(values.device->type == DeviceType::CPU) { initialize_dev(*(Device_CPU*)values.device,index,val); } - else if(values.device->type == DeviceType::GPU) { initialize_dev(*(Device_GPU*)values.device,index,val); } + extern template void LookupParameterStorage::initialize_dev(Device_GPU & dev, unsigned index, const vector& val); + template void LookupParameterStorage::initialize_dev(Device_CPU & dev, unsigned index, const vector& val); + void LookupParameterStorage::initialize(unsigned index, const vector& val) { + if(values[index].device->type == DeviceType::CPU) { initialize_dev(*(Device_CPU*)values[index].device,index,val); } + else if(values[index].device->type == DeviceType::GPU) { initialize_dev(*(Device_GPU*)values[index].device,index,val); } else { abort(); } } #else @@ -328,8 +333,8 @@ void LookupParameterStorage::accumulate_grad_dev(MyDevice & dev, unsigned index, extern template void LookupParameterStorage::accumulate_grad_dev(Device_GPU & dev, unsigned index, const Tensor& d); template void LookupParameterStorage::accumulate_grad_dev(Device_CPU & dev, unsigned index, const Tensor& d); void LookupParameterStorage::accumulate_grad(unsigned index, const Tensor& d) { - if(values.device->type == DeviceType::CPU) { accumulate_grad_dev(*(Device_CPU*)values.device,index,d); } - else if(values.device->type == DeviceType::GPU) { accumulate_grad_dev(*(Device_GPU*)values.device,index,d); } + if(values[index].device->type == DeviceType::CPU) { accumulate_grad_dev(*(Device_CPU*)values[index].device,index,d); } + else if(values[index].device->type == DeviceType::GPU) { accumulate_grad_dev(*(Device_GPU*)values[index].device,index,d); } else { abort(); } } #else @@ -364,8 +369,8 @@ float Model::gradient_l2_norm_dev(MyDevice & dev) const { extern template float Model::gradient_l2_norm_dev(Device_GPU & dev) const; template float Model::gradient_l2_norm_dev(Device_CPU & dev) const; float Model::gradient_l2_norm() const { - if(values.device->type == DeviceType::CPU) { return gradient_l2_norm_dev(*(Device_CPU*)values.device); } - else if(values.device->type == DeviceType::GPU) { return gradient_l2_norm_dev(*(Device_GPU*)values.device); } + if(default_device->type == DeviceType::CPU) { return gradient_l2_norm_dev(*(Device_CPU*)default_device); } + else if(default_device->type == DeviceType::GPU) { return gradient_l2_norm_dev(*(Device_GPU*)default_device); } else { abort(); } } #else diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 24e8d32c5..62fa4c0be 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -173,12 +173,12 @@ EIGEN_STRONG_INLINE void logsumexp(const MyDevice & dev, const Tensor& x, Tensor // ===== Functions to be compiled on both CPU and GPU #ifdef __CUDACC__ -inline void CUDAMatrixMultiply(const Tensor& l, const Tensor& r, Tensor& y, const float* acc_scalar) { +inline void CUDAMatrixMultiply(const Device_GPU & dev, const Tensor& l, const Tensor& r, Tensor& y, const float* acc_scalar) { if(l.d.bd == 1 && r.d.bd == y.d.bd) { // If the left side has one batch, multiply by columns // [x, z, b] = [x, y] * [y, z, b] // -> [x, z*b] = [x, y], [y, z*b] - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, + CUBLAS_CHECK(cublasSgemm(dev.cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, y.d.rows(), y.d.cols() * y.d.batch_elems(), l.d.cols(), kSCALAR_ONE, l.v, l.d.rows(), @@ -188,7 +188,7 @@ inline void CUDAMatrixMultiply(const Tensor& l, const Tensor& r, Tensor& y, cons // Otherwise, loop over the batches assert(r.d.bd == 1 || r.d.bd == l.d.bd); for(unsigned b = 0; b < y.d.bd; ++b) { - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, + CUBLAS_CHECK(cublasSgemm(dev.cublas_handle, CUBLAS_OP_N, CUBLAS_OP_N, y.d.rows(), y.d.cols(), l.d.cols(), kSCALAR_ONE, l.batch_ptr(b), l.d.rows(), @@ -235,13 +235,13 @@ void AffineTransform::forward_dev_impl(const MyDevice & dev, const vectord.bd) { - CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v, 1, fx.v, 1)); + CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v, 1, fx.v, 1)); } else { // TODO: Any better way to do broadcasting? for(unsigned b = 0; b < fx.d.bd; ++b) - CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.batch_size(), kSCALAR_ONE, xs[0]->batch_ptr(b), 1, fx.batch_ptr(b), 1)); + CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, fx.d.batch_size(), kSCALAR_ONE, xs[0]->batch_ptr(b), 1, fx.batch_ptr(b), 1)); } #else // Add, using broadcasting or not @@ -299,7 +299,7 @@ void AffineTransform::backward_dev_impl(const MyDevice & dev, int max_b = max(dEdf.d.bd, xs[i+1]->d.bd); #if __CUDACC__ if(dEdxi.d.bd == 1 && (dEdf.d.bd == xs[i+1]->d.bd)) { - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, + CUBLAS_CHECK(cublasSgemm(dev.cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols() * dEdf.d.batch_elems(), kSCALAR_ONE, dEdf.v, dEdf.d.rows(), @@ -307,7 +307,7 @@ void AffineTransform::backward_dev_impl(const MyDevice & dev, kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); } else { for(int b = 0; b < max_b; ++b) - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, + CUBLAS_CHECK(cublasSgemm(dev.cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), kSCALAR_ONE, dEdf.batch_ptr(b), dEdf.d.rows(), @@ -327,7 +327,7 @@ void AffineTransform::backward_dev_impl(const MyDevice & dev, #if __CUDACC__ // Do a single multiply if xs[i-1] has one batch if(xs[i-1]->d.bd == 1 && dEdxi.d.bd == dEdf.d.bd) { - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, + CUBLAS_CHECK(cublasSgemm(dev.cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols()*dEdxi.d.batch_elems(), xs[i-1]->d.rows(), kSCALAR_ONE, xs[i-1]->v, xs[i-1]->d.rows(), @@ -335,7 +335,7 @@ void AffineTransform::backward_dev_impl(const MyDevice & dev, kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); } else { for(int b = 0; b < max_b; ++b) - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, + CUBLAS_CHECK(cublasSgemm(dev.cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols(), xs[i-1]->d.rows(), kSCALAR_ONE, xs[i-1]->batch_ptr(b), xs[i-1]->d.rows(), @@ -453,7 +453,7 @@ void ConcatenateColumns::backward_dev_impl(const MyDevice & dev, const unsigned curr_col = src_col_indices[i]; #if __CUDACC__ const unsigned rows = dEdxi.d.rows(); - CUBLAS_CHECK(cublasSaxpy(cublas_handle, col_size*rows, kSCALAR_ONE, dEdf.v + curr_col*rows, 1, dEdxi.v, 1)); + CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, col_size*rows, kSCALAR_ONE, dEdf.v + curr_col*rows, 1, dEdxi.v, 1)); #else *dEdxi += (*dEdf).middleCols(curr_col, col_size); #endif @@ -1089,7 +1089,7 @@ void MatrixMultiply::forward_dev_impl(const MyDevice & dev, const vectord.bd, xs[1]->d.bd)); if(xs[0]->d.bd == 1) { @@ -1118,7 +1118,7 @@ void MatrixMultiply::backward_dev_impl(const MyDevice & dev, #if __CUDACC__ if (i == 0) { if(dEdxi.d.bd == 1 && (dEdf.d.bd == xs[1]->d.bd)) { - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, + CUBLAS_CHECK(cublasSgemm(dev.cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols() * dEdf.d.batch_elems(), kSCALAR_ONE, dEdf.v, dEdf.d.rows(), @@ -1126,7 +1126,7 @@ void MatrixMultiply::backward_dev_impl(const MyDevice & dev, kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); } else { for(int b = 0; b < max_b; ++b) - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, + CUBLAS_CHECK(cublasSgemm(dev.cublas_handle, CUBLAS_OP_N, CUBLAS_OP_T, dEdxi.d.rows(), dEdxi.d.cols(), dEdf.d.cols(), kSCALAR_ONE, dEdf.batch_ptr(b), dEdf.d.rows(), @@ -1137,7 +1137,7 @@ void MatrixMultiply::backward_dev_impl(const MyDevice & dev, // Do a single multiply if xs[0] has one batch if(xs[0]->d.bd == 1) { // dEdxi.colbatch_matrix().noalias() += (**xs[0]).transpose() * dEdf.colbatch_matrix(); - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, + CUBLAS_CHECK(cublasSgemm(dev.cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols()*dEdxi.d.batch_elems(), xs[0]->d.rows(), kSCALAR_ONE, xs[0]->v, xs[0]->d.rows(), @@ -1145,7 +1145,7 @@ void MatrixMultiply::backward_dev_impl(const MyDevice & dev, kSCALAR_ONE, dEdxi.v, dEdxi.d.rows())); } else { for(int b = 0; b < max_b; ++b) - CUBLAS_CHECK(cublasSgemm(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, + CUBLAS_CHECK(cublasSgemm(dev.cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols(), xs[0]->d.rows(), kSCALAR_ONE, xs[0]->batch_ptr(b), xs[0]->d.rows(), @@ -1365,7 +1365,7 @@ void PickElement::backward_dev_impl(const MyDevice & dev, assert(i == 0); if(pval) { #ifdef __CUDACC__ - CUBLAS_CHECK(cublasSaxpy(cublas_handle, 1, kSCALAR_ONE, dEdf.v, 1, dEdxi.v + *pval, 1)); + CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, 1, kSCALAR_ONE, dEdf.v, 1, dEdxi.v + *pval, 1)); #else (*dEdxi)(*pval) += dEdf.v[0]; #endif @@ -1373,7 +1373,7 @@ void PickElement::backward_dev_impl(const MyDevice & dev, assert(pvals); for(unsigned b = 0; b < pvals->size(); ++b) #ifdef __CUDACC__ - CUBLAS_CHECK(cublasSaxpy(cublas_handle, 1, kSCALAR_ONE, dEdf.v + b, 1, dEdxi.batch_ptr(b) + (*pvals)[b], 1)); + CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, 1, kSCALAR_ONE, dEdf.v + b, 1, dEdxi.batch_ptr(b) + (*pvals)[b], 1)); #else dEdxi.batch_matrix(b)((*pvals)[b]) += dEdf.v[b]; #endif @@ -1889,7 +1889,7 @@ void Sum::forward_dev_impl(const MyDevice & dev, const vector& xs #if __CUDACC__ TensorTools::Zero(fx); for (unsigned i = 0; i < num_args; ++i) - CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, xs[i]->v, 1, fx.v, 1)); + CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, fx.d.size(), kSCALAR_ONE, xs[i]->v, 1, fx.v, 1)); #else auto res = fx.vec(); const unsigned remainder = num_args % 4; @@ -1913,7 +1913,7 @@ void Sum::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { #if __CUDACC__ - CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); + CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); #else dEdxi.vec() += dEdf.vec(); #endif @@ -1927,7 +1927,7 @@ void SumBatches::forward_dev_impl(const MyDevice & dev, const vectorv + i * xs[0]->d.batch_size(), 1, fx.v, 1)); + CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v + i * xs[0]->d.batch_size(), 1, fx.v, 1)); #else auto res = *fx; const unsigned remainder = num_args % 4; @@ -1952,7 +1952,7 @@ void SumBatches::backward_dev_impl(const MyDevice & dev, assert(i == 0); #if __CUDACC__ for (unsigned i = 0; i < dEdxi.d.bd; ++i) - CUBLAS_CHECK(cublasSaxpy(cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v + i * dEdxi.d.batch_size(), 1)); + CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v + i * dEdxi.d.batch_size(), 1)); #else for (unsigned i = 0; i < dEdxi.d.bd; ++i) dEdxi.batch_matrix(i) += *dEdf; @@ -2012,7 +2012,7 @@ void Transpose::forward_dev_impl(const MyDevice & dev, const vectord.bd; ++b) - CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, fx.d.rows(), fx.d.cols(), + CUBLAS_CHECK(cublasSgeam(dev.cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, fx.d.rows(), fx.d.cols(), kSCALAR_ONE, xs[0]->batch_ptr(b), xs[0]->d.rows(), kSCALAR_ZERO, NULL, fx.d.rows(), fx.batch_ptr(b), fx.d.rows())); #else for(unsigned b = 0; b < xs[0]->d.bd; ++b) @@ -2030,7 +2030,7 @@ void Transpose::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { #if __CUDACC__ for(unsigned b = 0; b < xs[0]->d.bd; ++b) - CUBLAS_CHECK(cublasSgeam(cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols(), + CUBLAS_CHECK(cublasSgeam(dev.cublas_handle, CUBLAS_OP_T, CUBLAS_OP_N, dEdxi.d.rows(), dEdxi.d.cols(), kSCALAR_ONE, dEdf.batch_ptr(b), dEdf.d.rows(), kSCALAR_ONE, dEdxi.batch_ptr(b), dEdxi.d.rows(), dEdxi.batch_ptr(b), dEdxi.d.rows())); #else for(unsigned b = 0; b < xs[0]->d.bd; ++b) From 7d3968725a9ccaf80a8f12e13ae905212aee861c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 7 Jul 2016 14:35:37 +0900 Subject: [PATCH 594/965] Added sparse input nodes --- cnn/cnn.cc | 7 ++ cnn/cnn.h | 1 + cnn/expr.cc | 1 + cnn/expr.h | 1 + cnn/gpu-ops.cu | 287 +++----------------------------------------- cnn/gpu-ops.h | 48 ++++---- cnn/nodes.cc | 2 +- cnn/param-nodes.cc | 43 +++++++ cnn/param-nodes.h | 17 +++ cnn/tensor.cc | 2 +- tests/test-nodes.cc | 12 ++ 11 files changed, 129 insertions(+), 292 deletions(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index ef33a4898..75404ad1b 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -105,6 +105,13 @@ VariableIndex ComputationGraph::add_input(const Dim& d, const vector* pm) return new_node_index; } +VariableIndex ComputationGraph::add_input(const Dim& d, const vector& ids, const vector& data, float defdata) { + VariableIndex new_node_index(nodes.size()); + nodes.push_back(new SparseInputNode(d, ids, data, defdata)); + set_dim_for_new_node(new_node_index); + return new_node_index; +} + VariableIndex ComputationGraph::add_parameters(Parameter p) { VariableIndex new_node_index(nodes.size()); ParameterNode* new_node = new ParameterNode(p); diff --git a/cnn/cnn.h b/cnn/cnn.h index e665fbc10..4c12a8fc2 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -64,6 +64,7 @@ struct ComputationGraph { VariableIndex add_input(const real* ps); // add pointer to scalar VariableIndex add_input(const Dim& d, const std::vector& data); VariableIndex add_input(const Dim& d, const std::vector* pdata); + VariableIndex add_input(const Dim& d, const std::vector& ids, const std::vector& data, float defdata = 0.f); // PARAMETERS // parameters are things that are optimized. in contrast to a system like diff --git a/cnn/expr.cc b/cnn/expr.cc index 71b3db172..50379f11f 100644 --- a/cnn/expr.cc +++ b/cnn/expr.cc @@ -13,6 +13,7 @@ Expression input(ComputationGraph& g, real s) { return Expression(&g, g.add_inpu Expression input(ComputationGraph& g, const real *ps) { return Expression(&g, g.add_input(ps)); } Expression input(ComputationGraph& g, const Dim& d, const vector& data) { return Expression(&g, g.add_input(d, data)); } Expression input(ComputationGraph& g, const Dim& d, const vector* pdata) { return Expression(&g, g.add_input(d, pdata)); } +Expression input(ComputationGraph& g, const Dim& d, const vector& ids, const vector& data, float defdata) { return Expression(&g, g.add_input(d, ids, data, defdata)); } Expression const_parameter(ComputationGraph& g, Parameter p) { return Expression(&g, g.add_const_parameters(p)); } Expression parameter(ComputationGraph& g, Parameter p) { return Expression(&g, g.add_parameters(p)); } Expression lookup(ComputationGraph& g, LookupParameter p, unsigned index) { return Expression(&g, g.add_lookup(p, index)); } diff --git a/cnn/expr.h b/cnn/expr.h index 6b3a92661..efbb1fa59 100644 --- a/cnn/expr.h +++ b/cnn/expr.h @@ -21,6 +21,7 @@ Expression input(ComputationGraph& g, real s); Expression input(ComputationGraph& g, const real *ps); Expression input(ComputationGraph& g, const Dim& d, const std::vector& data); Expression input(ComputationGraph& g, const Dim& d, const std::vector* pdata); +Expression input(ComputationGraph& g, const Dim& d, const std::vector& ids, const std::vector& data, float defdata = 0.f); Expression parameter(ComputationGraph& g, Parameter p); Expression const_parameter(ComputationGraph& g, Parameter p); Expression lookup(ComputationGraph& g, LookupParameter p, unsigned index); diff --git a/cnn/gpu-ops.cu b/cnn/gpu-ops.cu index 943ed75d1..656c85bb2 100644 --- a/cnn/gpu-ops.cu +++ b/cnn/gpu-ops.cu @@ -6,273 +6,26 @@ namespace cnn { namespace gpu { -// this wraps kernel dispatches for various operations (preventing us from -// having to compile a version of nodes.cc with NVCC) - -void vpairwise_rank_loss(int n, float margin, const float* xgood, const float* xbad, float* y) { - auto tb = SizeToBlockThreadPair(n); - binaryExprKernel<<>>(n, xgood, xbad, y, FPairwiseRankLoss(margin)); -} - -void vpairwise_rank_loss_backward(int n, bool d_wrt_correct, const float* fx, const float* dEdf, float* dEdx) { - auto tb = SizeToBlockThreadPair(n); - if (d_wrt_correct) { - accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FRectifyNegateBackward()); - } else { - accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FRectifyBackward()); - } -} - -void vcwise_product(int n, const float* x0, const float* x1, float* y) { - auto tb = SizeToBlockThreadPair(n); - binaryExprKernel<<>>(n, x0, x1, y, FProduct()); -} - -void vcwise_product_backward(int n, const float* dEdy, const float* x_other, float* dEdx) { - auto tb = SizeToBlockThreadPair(n); - accBinaryExprKernel<<>>(n, dEdy, x_other, dEdx, FProduct()); -} - -void vconstant_minusx(int n, float c, const float* x, float* y) { - auto tb = SizeToBlockThreadPair(n); - unaryExprKernel<<>>(n, x, y, FConstantMinus(c)); -} - -void vnegate(int n, const float* x, float* y) { - auto tb = SizeToBlockThreadPair(n); - unaryExprKernel<<>>(n, x, y, FNegate()); -} - -void vnegate_backward(int n, const float* dEdf, float* dEdx) { - auto tb = SizeToBlockThreadPair(n); - accUnaryExprKernel<<>>(n, dEdf, dEdx, FNegate()); -} - -void vrelu(int n, const float* x, float* y) { - auto tb = SizeToBlockThreadPair(n); - unaryExprKernel<<>>(n, x, y, FRectify()); -} - -void vrelu_backward(int n, const float* fx, const float* dEdf, float* dEdx) { - auto tb = SizeToBlockThreadPair(n); - accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FRectifyBackward()); -} - -// void vtanh(int n, const float* x, float* y) { -// auto tb = SizeToBlockThreadPair(n); -// unaryExprKernel<<>>(n, x, y, FTanh()); -// } -// -// void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx) { -// auto tb = SizeToBlockThreadPair(n); -// accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FTanhBackward()); -// } - -void vlog(int n, const float* x, float* y) { - auto tb = SizeToBlockThreadPair(n); - unaryExprKernel<<>>(n, x, y, FLog()); -} - -void vlog_backward(int n, const float* fx, const float* dEdf, float* dEdx) { - auto tb = SizeToBlockThreadPair(n); - accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FLogBackward()); -} - -void vlogistic(int n, const float* x, float* y) { - auto tb = SizeToBlockThreadPair(n); - unaryExprKernel<<>>(n, x, y, FLogisticSigmoid()); -} - -void vlogistic_backward(int n, const float* fx, const float* dEdf, float* dEdx) { - auto tb = SizeToBlockThreadPair(n); - accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FLogisticSigmoidBackward()); -} - -void sqeucdist_backward(int n, const float* dEdy, const float* x0, const float* x1, float* dEdx, int i) { - auto tb = SizeToBlockThreadPair(n); - accBinaryExprKernel<<>>(n, x0, x1, dEdx, FEuclideanBackward(i, dEdy)); -} - -void sgd_update(int n, const float* g, float* x, float scale, float lambda) { - auto tb = SizeToBlockThreadPair(n); - accBinaryExprKernel<<>>(n, x, g, x, FL2SGDUpdate(lambda, scale)); -} - -// adapted from NVIDIA example -__global__ void ker_sqeucdist(int n, const float *x0, const float *x1, float* res) { - __shared__ float buf[256]; - for (int i = threadIdx.x; i < 256; i += blockDim.x) { - float sum = 0; - for (int pos = i; pos < n; pos += 256) { - const float d = x0[pos] - x1[pos]; - sum += d * d; - } - buf[i] = sum; - } - for (int stride = 128; stride > 0; stride >>= 1) { - __syncthreads(); - for (int i = threadIdx.x; i < stride; i += blockDim.x) - buf[i] += buf[stride + i]; - } - __syncthreads(); - if (threadIdx.x == 0) res[0] = buf[0]; -} - -void sqeucdist(int n, const float* x0, const float *x1, float* y) { - auto tb = SizeToBlockThreadPair(n); - ker_sqeucdist<<>>(n, x0, x1, y); -} - -// adapted from NVIDIA example -__global__ void ker_l2_norm_reducer(int n, const float *x0, float* res, bool sq, bool acc) { - __shared__ float buf[256]; - for (int i = threadIdx.x; i < 256; i += blockDim.x) { - float sum = 0; - for (int pos = i; pos < n; pos += 256) { - const float d = x0[pos]; - sum += sq ? d * d : d; - } - buf[i] = sum; - } - for (int stride = 128; stride > 0; stride >>= 1) { - __syncthreads(); - for (int i = threadIdx.x; i < stride; i += blockDim.x) - buf[i] += buf[stride + i]; - } - __syncthreads(); - if (threadIdx.x == 0) { - if (acc) res[0] += buf[0]; else res[0] = buf[0]; - } -} - -void l2_norm_reducer(int n, const float* x0, float* y, bool square, bool accumulate) { - auto tb = SizeToBlockThreadPair(n); - ker_l2_norm_reducer<<>>(n, x0, y, square, accumulate); -} - -// adapted from NVIDIA example -__global__ void ker_softmax(int n, const float *x0, float* res) { - __shared__ float buf[256]; - for (int i = threadIdx.x; i < 256; i += blockDim.x) { - float me = __int_as_float(0xff800000); - for (int pos = i; pos < n; pos += 256) { - const float d = x0[pos]; - me = d > me ? d : me; - } - buf[i] = me; - } - for (int stride = 128; stride > 0; stride >>= 1) { - __syncthreads(); - for (int i = threadIdx.x; i < stride; i += blockDim.x) - buf[i] = buf[i] > buf[stride + i] ? buf[i] : buf[stride + i]; - } - __syncthreads(); - const float max_elem = buf[0]; - for (int i = threadIdx.x; i < 256; i += blockDim.x) { - float sum = 0; - for (int pos = i; pos < n; pos += 256) - sum += expf(x0[pos] - max_elem); - buf[i] = sum; - } - for (int stride = 128; stride > 0; stride >>= 1) { - __syncthreads(); - for (int i = threadIdx.x; i < stride; i += blockDim.x) - buf[i] += buf[stride + i]; - } - __syncthreads(); - float lz = log(buf[0]) + max_elem; - int i = threadIdx.x + blockIdx.x * blockDim.x; - while (i < n) { - res[i] = exp(x0[i] - lz); - i += gridDim.x * blockDim.x; - } -} - -void softmax(int n, const float* x0, float* y) { - auto tb = SizeToBlockThreadPair(n); - ker_softmax<<>>(n, x0, y); -} - -// A kernel to calculate the dot product between two arrays -__global__ void ker_dotproduct(int n, const float* x, const float* y, float* z) { - __shared__ float buf[256]; - for (int i = threadIdx.x; i < 256; i += blockDim.x) { - float sum = 0; - for (int pos = i; pos < n; pos += 256) - sum += x[pos] * y[pos]; - buf[i] = sum; - } - for (int stride = 128; stride > 0; stride >>= 1) { - __syncthreads(); - for (int i = threadIdx.x; i < stride; i += blockDim.x) - buf[i] += buf[stride + i]; - } - __syncthreads(); - if (threadIdx.x == 0) - z[0] = buf[0]; -} - -void softmax_backward(int n, const float* fx, const float* dEdf, float* dEdx) { - auto tb = SizeToBlockThreadPair(n); - float* gpu_ods; - float ods; - cudaMalloc((void **)&gpu_ods, sizeof(float)); - ker_dotproduct<<>>(n, fx, dEdf, gpu_ods); - cudaMemcpy(&ods, gpu_ods, sizeof(float), cudaMemcpyDeviceToHost); - cudaFree(gpu_ods); - accBinaryExprKernel<<>>(n, fx, dEdf, dEdx, FSoftmaxBackward(-ods)); -} - -// adapted from NVIDIA example -__global__ void ker_pnlsoftmax(int n, int elem_idx, const float *x0, float* res, float* logz) { - __shared__ float buf[256]; - for (int i = threadIdx.x; i < 256; i += blockDim.x) { - float me = __int_as_float(0xff800000); - for (int pos = i; pos < n; pos += 256) { - const float d = x0[pos]; - me = d > me ? d : me; - } - buf[i] = me; - } - for (int stride = 128; stride > 0; stride >>= 1) { - __syncthreads(); - for (int i = threadIdx.x; i < stride; i += blockDim.x) - buf[i] = buf[i] > buf[stride + i] ? buf[i] : buf[stride + i]; - } - __syncthreads(); - const float max_elem = buf[0]; - for (int i = threadIdx.x; i < 256; i += blockDim.x) { - float sum = 0; - for (int pos = i; pos < n; pos += 256) - sum += expf(x0[pos] - max_elem); - buf[i] = sum; - } - for (int stride = 128; stride > 0; stride >>= 1) { - __syncthreads(); - for (int i = threadIdx.x; i < stride; i += blockDim.x) - buf[i] += buf[stride + i]; - } - __syncthreads(); - if (threadIdx.x == 0) { - float lz = log(buf[0]) + max_elem; - logz[0] = lz; - res[0] = lz - x0[elem_idx]; - } -} - -void pnlsoftmax(int n, int elem_idx, const float* x0, float* y, float* logz) { - auto tb = SizeToBlockThreadPair(n); - ker_pnlsoftmax<<>>(n, elem_idx, x0, y, logz); -} - -__global__ void fixup_pnl(const float* dEdf, float* dEdxi, int i) { - if (threadIdx.x == 0) dEdxi[i] -= dEdf[0]; -} - -void pnlsoftmax_backward(int n, int elem_idx, const float* x0, const float* dEdf, const float* logz, float* dEdx) { - auto tb = SizeToBlockThreadPair(n); - accUnaryExprKernel<<>>(n, x0, dEdx, FPtrNegLogSoftmaxBackward(logz, dEdf)); - fixup_pnl<<<1,1>>>(dEdf, dEdx, elem_idx); +// CUDA kernel. Each thread takes care of one element of c +__global__ void sparse_assign(int n, unsigned int *idx, float *src, float *trg) +{ + // Get our global thread ID + int id = blockIdx.x*blockDim.x+threadIdx.x; + + // Make sure we do not go out of bounds + if (id < n) + trg[idx[id]] = src[id]; +} + +// CUDA kernel. Each thread takes care of one element of c +__global__ void const_init(int n, float val, float *trg) +{ + // Get our global thread ID + int id = blockIdx.x*blockDim.x+threadIdx.x; + + // Make sure we do not go out of bounds + if (id < n) + trg[id] = val; } } // namespace gpu diff --git a/cnn/gpu-ops.h b/cnn/gpu-ops.h index f34d67696..94a63ccfc 100644 --- a/cnn/gpu-ops.h +++ b/cnn/gpu-ops.h @@ -4,30 +4,32 @@ namespace cnn { namespace gpu { -void vpairwise_rank_loss(int n, float margin, const float* xgood, const float* xbad, float* y); -void vpairwise_rank_loss_backward(int n, bool d_wrt_correct, const float* fx, const float* dEdf, float* dEdx); -void vcwise_product(int n, const float* x0, const float* x1, float* y); -void vcwise_product_backward(int n, const float* dEdy, const float* x_other, float* dEdx); -void vconstant_minusx(int n, float c, const float* x, float* y); -void vnegate(int n, const float* x, float* y); -void vnegate_backward(int n, const float* dEdf, float* dEdx); -void vrelu(int n, const float* x, float* y); -void vrelu_backward(int n, const float* fx, const float* dEdf, float* dEdx); -void vtanh(int n, const float* x, float* y); -void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx); -void vlog(int n, const float* x, float* y); -void vlog_backward(int n, const float* fx, const float* dEdf, float* dEdx); -void vlogistic(int n, const float* x, float* y); -void vlogistic_backward(int n, const float* fx, const float* dEdf, float* dEdx); -void l2_norm_reducer(int n, const float* x0, float* y, bool square, bool accumulate); -void sqeucdist(int n, const float* x0, const float *x1, float* y); -void sqeucdist_backward(int n, const float* dEdy, const float* x0, const float* x1, float* dEdx, int i); -void softmax(int n, const float* x0, float* y); -void softmax_backward(int n, const float* x0, const float* dEdf, float* dEdx); -void pnlsoftmax(int n, int elem_idx, const float* x0, float* y, float* logz); -void pnlsoftmax_backward(int n, int elem_idx, const float* x0, const float* dEdf, const float* logz, float* dEdx); +// void vpairwise_rank_loss(int n, float margin, const float* xgood, const float* xbad, float* y); +// void vpairwise_rank_loss_backward(int n, bool d_wrt_correct, const float* fx, const float* dEdf, float* dEdx); +// void vcwise_product(int n, const float* x0, const float* x1, float* y); +// void vcwise_product_backward(int n, const float* dEdy, const float* x_other, float* dEdx); +// void vconstant_minusx(int n, float c, const float* x, float* y); +// void vnegate(int n, const float* x, float* y); +// void vnegate_backward(int n, const float* dEdf, float* dEdx); +// void vrelu(int n, const float* x, float* y); +// void vrelu_backward(int n, const float* fx, const float* dEdf, float* dEdx); +// void vtanh(int n, const float* x, float* y); +// void vtanh_backward(int n, const float* fx, const float* dEdf, float* dEdx); +// void vlog(int n, const float* x, float* y); +// void vlog_backward(int n, const float* fx, const float* dEdf, float* dEdx); +// void vlogistic(int n, const float* x, float* y); +// void vlogistic_backward(int n, const float* fx, const float* dEdf, float* dEdx); +// void l2_norm_reducer(int n, const float* x0, float* y, bool square, bool accumulate); +// void sqeucdist(int n, const float* x0, const float *x1, float* y); +// void sqeucdist_backward(int n, const float* dEdy, const float* x0, const float* x1, float* dEdx, int i); +// void softmax(int n, const float* x0, float* y); +// void softmax_backward(int n, const float* x0, const float* dEdf, float* dEdx); +// void pnlsoftmax(int n, int elem_idx, const float* x0, float* y, float* logz); +// void pnlsoftmax_backward(int n, int elem_idx, const float* x0, const float* dEdf, const float* logz, float* dEdx); +// void sgd_update(int n, const float* g, float* x, float scale, float lambda); -void sgd_update(int n, const float* g, float* x, float scale, float lambda); +void sparse_assign(int n, unsigned int* ids, float* src, float* trg); +void const_init(int n, float val, float* trg); } // namespace gpu } // namespace cnn diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 24e8d32c5..5c771b811 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -28,7 +28,7 @@ using namespace std; // EIGEN_NO_MALLOC option. If you get an error about Eigen attempting to allocate // memory, it is (probably) because of an implicit creation of a temporary variable. // To tell Eigen this is not necessary, the noalias() method is available. If you really -// do need a temporary variable, its capacity must be requested by Node::aux_storage_space +// do need a temporary variable, its capacity must be requested by Node::aux_storage_size // // notes on debugging problems with differentiable components // 1) fx is uninitialized when forward is called- are you relying on it being 0? diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index d7feece21..999eed7f6 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -49,6 +49,21 @@ Dim InputNode::dim_forward(const vector& xs) const { return dim; } +string SparseInputNode::as_string(const vector& arg_names) const { + ostringstream s; + s << "sparse_constant(" << dim << ')'; + return s.str(); +} + +Dim SparseInputNode::dim_forward(const vector& xs) const { + assert(ids.size() == data.size()); + return dim; +} + +size_t SparseInputNode::aux_storage_size() const { + return ids.size() * (sizeof(float) + sizeof(unsigned int)); +} + string ScalarInputNode::as_string(const vector& arg_names) const { ostringstream s; s << "scalar_constant(" << pdata << ')'; @@ -155,6 +170,34 @@ void InputNode::backward_dev_impl(const MyDevice & dev, } CNN_NODE_INST_DEV_IMPL(InputNode) +template +void SparseInputNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 0); +#if __CUDACC__ + size_t id_bytes = ids.size() * sizeof(unsigned int); + cudaMemcpyAsync(aux_mem, &ids->front(), id_bytes, cudaMemcpyHostToDevice); + cudaMemcpyAsync(aux_mem+id_bytes, &data->front(), data.size() * sizeof(float), cudaMemcpyHostToDevice); + cnn::gpu::const_init(dim.size(), defdata, fx.v); + cnn::gpu::sparse_assign(ids.size(), (unsigned int*)aux_mem, (float*)aux_mem+id_bytes, fx.v); +#else + std::fill(fx.v, fx.v + dim.size(), defdata); + for(size_t i = 0; i < ids.size(); ++i) + fx.v[ids[i]] = data[i]; +#endif +} + +template +void SparseInputNode::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + cerr << "called backward() on arity 0 node\n"; + abort(); +} +CNN_NODE_INST_DEV_IMPL(SparseInputNode) + template void ScalarInputNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 0); diff --git a/cnn/param-nodes.h b/cnn/param-nodes.h index 554e4fe3e..43d8c1370 100644 --- a/cnn/param-nodes.h +++ b/cnn/param-nodes.h @@ -39,6 +39,23 @@ struct InputNode : public Node { const std::vector* pdata; }; +// Represents specified (not learned) inputs to the network in sparse array format, +// with an optional default value. Note that indexes refer to where the memory is actually +// indexed in column-major format. When multiple batches are used they will also be +// consecutive in memory. This doesn't support pointer input, because this would require +// dynamic changing of the size of auxiliary memory on GPUs, although this could possibly +// be fixed in the future. +struct SparseInputNode : public Node { + explicit SparseInputNode(const Dim& d, const std::vector& id, const std::vector& dat, float defdat = 0.f) : dim(d), ids(id), data(dat), defdata(defdat) {} + CNN_NODE_DEFINE_DEV_IMPL() + virtual bool supports_multibatch() const override { return true; } + size_t aux_storage_size() const override; + Dim dim; + const std::vector ids; + const std::vector data; + float defdata; +}; + // represents specified (not learned) scalar inputs to the network struct ScalarInputNode : public Node { explicit ScalarInputNode(real s) : data(s), pdata(&data) {} diff --git a/cnn/tensor.cc b/cnn/tensor.cc index c16a169fb..d566a70e5 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -99,7 +99,7 @@ void TensorTools::Constant(Tensor& d, float c) { if (!c) { CUDA_CHECK(cudaMemsetAsync(d.v, 0, d.d.size() * sizeof(float))); } else { - fill(d.v, d.v + d.d.size(), c); + cnn::gpu::const_init(d.d.size(), c, d.v); } #else if (!c) { diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index ca153f7e0..c957dbae4 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -839,4 +839,16 @@ BOOST_AUTO_TEST_CASE( pickneglogsoftmax_batch_gradient ) { BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression sparse_input(vector& ids, vector& src, float def); +BOOST_AUTO_TEST_CASE( sparse_input_test ) { + cnn::ComputationGraph cg; + std::vector ids = {0, 4}; + input(cg, Dim({3},2), ids, ones2_vals, 0.5); + std::vector exp = {1.0f, 0.5f, 0.5f, 0.5f, 1.0f, 0.5f}; + std::vector act = as_vector(cg.forward()); + assert(exp.size() == act.size()); + for(size_t i = 0; i < exp.size(); ++i) + BOOST_CHECK_CLOSE(exp[i], act[i], 0.001); +} + BOOST_AUTO_TEST_SUITE_END() From 3822b5ba58cf59d29fb1317f681d476f9ad1f7e4 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 7 Jul 2016 17:10:15 +0900 Subject: [PATCH 595/965] Fixed sparse input on GPU --- cnn/gpu-ops.cu | 16 ++++++++++++---- cnn/param-nodes.cc | 13 +++++++++---- cnn/tensor.cc | 1 + 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/cnn/gpu-ops.cu b/cnn/gpu-ops.cu index 656c85bb2..a537a7975 100644 --- a/cnn/gpu-ops.cu +++ b/cnn/gpu-ops.cu @@ -7,8 +7,7 @@ namespace cnn { namespace gpu { // CUDA kernel. Each thread takes care of one element of c -__global__ void sparse_assign(int n, unsigned int *idx, float *src, float *trg) -{ +__global__ void ker_sparse_assign(int n, unsigned int *idx, float *src, float *trg) { // Get our global thread ID int id = blockIdx.x*blockDim.x+threadIdx.x; @@ -17,9 +16,13 @@ __global__ void sparse_assign(int n, unsigned int *idx, float *src, float *trg) trg[idx[id]] = src[id]; } +void sparse_assign(int n, unsigned int *idx, float *src, float *trg) { + auto tb = SizeToBlockThreadPair(n); + ker_sparse_assign<<>>(n, idx, src, trg); +} + // CUDA kernel. Each thread takes care of one element of c -__global__ void const_init(int n, float val, float *trg) -{ +__global__ void ker_const_init(int n, float val, float *trg) { // Get our global thread ID int id = blockIdx.x*blockDim.x+threadIdx.x; @@ -28,5 +31,10 @@ __global__ void const_init(int n, float val, float *trg) trg[id] = val; } +void const_init(int n, float val, float *trg) { + auto tb = SizeToBlockThreadPair(n); + ker_const_init<<>>(n, val, trg); +} + } // namespace gpu } // namespace cnn diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index 999eed7f6..235aa83ae 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -7,6 +7,10 @@ #include "cnn/nodes-macros.h" #include "cnn/weight-decay.h" +#ifdef HAVE_CUDA +#include "cnn/gpu-ops.h" +#endif + using namespace std; namespace cnn { @@ -174,11 +178,12 @@ template void SparseInputNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 0); #if __CUDACC__ - size_t id_bytes = ids.size() * sizeof(unsigned int); - cudaMemcpyAsync(aux_mem, &ids->front(), id_bytes, cudaMemcpyHostToDevice); - cudaMemcpyAsync(aux_mem+id_bytes, &data->front(), data.size() * sizeof(float), cudaMemcpyHostToDevice); + unsigned int* ids_ptr = (unsigned int*)aux_mem; + float* data_ptr = (float*)(ids_ptr + ids.size()); + cudaMemcpyAsync(ids_ptr, &ids[0], ids.size() * sizeof(unsigned int), cudaMemcpyHostToDevice); + cudaMemcpyAsync(data_ptr, &data[0], data.size() * sizeof(float), cudaMemcpyHostToDevice); cnn::gpu::const_init(dim.size(), defdata, fx.v); - cnn::gpu::sparse_assign(ids.size(), (unsigned int*)aux_mem, (float*)aux_mem+id_bytes, fx.v); + cnn::gpu::sparse_assign(ids.size(), ids_ptr, data_ptr, fx.v); #else std::fill(fx.v, fx.v + dim.size(), defdata); for(size_t i = 0; i < ids.size(); ++i) diff --git a/cnn/tensor.cc b/cnn/tensor.cc index d566a70e5..c70bebe94 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -5,6 +5,7 @@ #include #if HAVE_CUDA +#include "cnn/gpu-ops.h" #include "cnn/cuda.h" #endif From 1a5393fc51676a7413f73218364d16900bab61ae Mon Sep 17 00:00:00 2001 From: yoavg Date: Thu, 7 Jul 2016 11:56:16 +0300 Subject: [PATCH 596/965] initial attempt at checkpoint/revert functionality. --- cnn/cnn.cc | 19 +++++++++++++++++++ cnn/cnn.h | 9 +++++++++ cnn/exec.cc | 2 +- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index ef33a4898..7a05a364a 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -77,6 +77,25 @@ void ComputationGraph::clear() { nodes.clear(); } +CGCheckpoint ComputationGraph::get_checkpoint() { + CGCheckpoint p; + p.node_idx = nodes.size(); + p.par_node_idx = parameter_nodes.size(); + return p; +} + +void ComputationGraph::revert(CGCheckpoint p) { + // clear all nodes at position >= p.node_idx + if (nodes.size() > p.node_idx) { + nodes.resize(p.node_idx); // TODO verify deletion of nodes. + } + // clear all parameter nodes at position >= p.par_node_idx + if (parameter_nodes.size() > p.par_node_idx) { + parameter_nodes.resize(p.par_node_idx); + } +} + + VariableIndex ComputationGraph::add_input(real s) { VariableIndex new_node_index(nodes.size()); nodes.push_back(new ScalarInputNode(s)); diff --git a/cnn/cnn.h b/cnn/cnn.h index e665fbc10..9c8d79284 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -47,6 +47,12 @@ struct Node; namespace expr { struct Expression; } BOOST_STRONG_TYPEDEF(unsigned, VariableIndex) + +struct CGCheckpoint { + int node_idx; + int par_node_idx; +}; + inline void swap(VariableIndex& i1, VariableIndex& i2) { VariableIndex t = i1; i1 = i2; @@ -92,6 +98,9 @@ struct ComputationGraph { // reset ComputationGraph to a newly created state void clear(); + CGCheckpoint get_checkpoint(); + void revert(CGCheckpoint checkpoint); + // perform computations diff --git a/cnn/exec.cc b/cnn/exec.cc index 984ec8256..4bf363ad3 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -85,7 +85,7 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { } void SimpleExecutionEngine::backward() { - assert(nfxs.size() == cg.nodes.size()); + assert(nfxs.size() >= cg.nodes.size()); backward((VariableIndex)(cg.nodes.size()-1)); } From cf718e093f84bd278e2234aec49dafd27c1acb0a Mon Sep 17 00:00:00 2001 From: yoavg Date: Thu, 7 Jul 2016 22:01:46 +0300 Subject: [PATCH 597/965] added memory management to checkpointing mechanism --- cnn/aligned-mem-pool.h | 2 +- cnn/cnn.cc | 2 ++ cnn/cnn.h | 7 +++++++ cnn/devices.cc | 20 ++++++++++++++++++++ cnn/devices.h | 5 +++++ 5 files changed, 35 insertions(+), 1 deletion(-) diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h index fad1c4270..4174c6933 100644 --- a/cnn/aligned-mem-pool.h +++ b/cnn/aligned-mem-pool.h @@ -33,6 +33,7 @@ class AlignedMemoryPool { a->zero(mem, used); } + size_t used; private: void sys_alloc(size_t cap) { capacity = a->round_up_align(cap); @@ -45,7 +46,6 @@ class AlignedMemoryPool { a->zero(mem, capacity); } size_t capacity; - size_t used; MemAllocator* a; void* mem; }; diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 7a05a364a..eac53a101 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -79,12 +79,14 @@ void ComputationGraph::clear() { CGCheckpoint ComputationGraph::get_checkpoint() { CGCheckpoint p; + p.device_mem_checkpoint = default_device->mark(this); p.node_idx = nodes.size(); p.par_node_idx = parameter_nodes.size(); return p; } void ComputationGraph::revert(CGCheckpoint p) { + default_device->revert(p.device_mem_checkpoint); // clear all nodes at position >= p.node_idx if (nodes.size() > p.node_idx) { nodes.resize(p.node_idx); // TODO verify deletion of nodes. diff --git a/cnn/cnn.h b/cnn/cnn.h index 9c8d79284..445ab6719 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -48,9 +48,16 @@ namespace expr { struct Expression; } BOOST_STRONG_TYPEDEF(unsigned, VariableIndex) +struct DeviceMemCheckpoint { + size_t fxs_used; + size_t dEdfs_used; + size_t ps_used; +}; + struct CGCheckpoint { int node_idx; int par_node_idx; + DeviceMemCheckpoint device_mem_checkpoint; }; inline void swap(VariableIndex& i1, VariableIndex& i2) { diff --git a/cnn/devices.cc b/cnn/devices.cc index 7b5b50bfa..2ee48559c 100644 --- a/cnn/devices.cc +++ b/cnn/devices.cc @@ -4,6 +4,7 @@ #include #include "cnn/cuda.h" +#include "cnn/cnn.h" using namespace std; @@ -11,6 +12,25 @@ namespace cnn { Device::~Device() {} +DeviceMemCheckpoint Device::mark(ComputationGraph *cg) { + cg->incremental_forward(); // needed so that we actually allocate the needed memory + // for all existing nodes. + DeviceMemCheckpoint cp; + cp.fxs_used = fxs->used; + cp.dEdfs_used = dEdfs->used; + cp.ps_used = ps->used; + return cp; +} + +void Device::revert(DeviceMemCheckpoint cp) { + assert(cp.fxs_used <= fxs->used); + assert(cp.dEdfs_used <= dEdfs->used); + assert(cp.ps_used <= ps->used); + fxs->used = cp.fxs_used; + dEdfs->used = cp.dEdfs_used; + ps->used = cp.ps_used; +} + #if HAVE_CUDA Device_GPU::Device_GPU(int mb, int device_id) : Device(DeviceType::GPU, &gpu_mem), cuda_device_id(device_id), gpu_mem(device_id) { diff --git a/cnn/devices.h b/cnn/devices.h index d41f2dbf9..9f659a91d 100644 --- a/cnn/devices.h +++ b/cnn/devices.h @@ -15,6 +15,9 @@ namespace cnn { enum class DeviceType {CPU, GPU}; +struct ComputationGraph; // TODO is there a nicer way to resolve this cyclic dependency? +struct DeviceMemCheckpoint; + class Device { protected: Device(DeviceType t, MemAllocator* m) : type(t), mem(m) {} @@ -31,6 +34,8 @@ class Device { float* kSCALAR_ONE; float* kSCALAR_ZERO; std::string name; + virtual DeviceMemCheckpoint mark(ComputationGraph *cg); + virtual void revert(DeviceMemCheckpoint cp); }; #if HAVE_CUDA From 8b896058a493fa484c399e520ec59a4cd7f95c86 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 8 Jul 2016 16:36:32 +0900 Subject: [PATCH 598/965] Fixed segmentation fault when parameters adjusted --- cnn/model.cc | 61 +++++++++++++++++++++++++++++++++++++++++----------- cnn/model.h | 4 ++++ 2 files changed, 52 insertions(+), 13 deletions(-) diff --git a/cnn/model.cc b/cnn/model.cc index 8ea0c9e98..f54e95d87 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -67,10 +67,6 @@ ParameterStorage::ParameterStorage(const Dim& d, float scale) : dim(d) { size_t ParameterStorage::size() const { return dim.size(); } -void ParameterStorage::scale_parameters(float a) { - values.vec() *= a; -} - void ParameterStorage::zero() { TensorTools::Zero(values); clear(); @@ -101,11 +97,6 @@ LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d } } -void LookupParameterStorage::scale_parameters(float a) { - for (auto& p : values) - (*p) *= a; -} - void LookupParameterStorage::zero() { for (auto& p : values) TensorTools::Zero(p); @@ -270,7 +261,29 @@ void ParameterStorage::accumulate_grad_dev(MyDevice & dev, const Tensor& d) { #else template void ParameterStorage::accumulate_grad_dev(Device_CPU & dev, const Tensor& d); void ParameterStorage::accumulate_grad(const Tensor& d) { - if(default_device->type == DeviceType::CPU) { accumulate_grad_dev(*(Device_CPU*)default_device,d); } + if(values.device->type == DeviceType::CPU) { accumulate_grad_dev(*(Device_CPU*)values.device,d); } + else { abort(); } + } +#endif + +template +void ParameterStorage::scale_parameters_dev(MyDevice & dev, float a) { + values.tvec().device(*dev.edevice) = values.tvec() * a; +} +#ifdef __CUDACC__ + template void ParameterStorage::scale_parameters_dev(Device_GPU & dev, float a); +#elif defined(HAVE_CUDA) + extern template void ParameterStorage::scale_parameters_dev(Device_GPU & dev, float a); + template void ParameterStorage::scale_parameters_dev(Device_CPU & dev, float a); + void ParameterStorage::scale_parameters(float a) { + if(values.device->type == DeviceType::CPU) { scale_parameters_dev(*(Device_CPU*)values.device,a); } + else if(values.device->type == DeviceType::GPU) { scale_parameters_dev(*(Device_GPU*)values.device,a); } + else { abort(); } + } +#else + template void ParameterStorage::scale_parameters_dev(Device_CPU & dev, float a); + void ParameterStorage::scale_parameters(float a) { + if(values.device->type == DeviceType::CPU) { scale_parameters_dev(*(Device_CPU*)values.device,a); } else { abort(); } } #endif @@ -297,7 +310,7 @@ void LookupParameterStorage::initialize_dev(MyDevice & dev, unsigned index, cons #else template void LookupParameterStorage::initialize_dev(Device_CPU & dev, unsigned index, const vector& val); void LookupParameterStorage::initialize(unsigned index, const vector& val) { - if(default_device->type == DeviceType::CPU) { initialize_dev(*(Device_CPU*)default_device,index,val); } + if(values[index].device->type == DeviceType::CPU) { initialize_dev(*(Device_CPU*)values[index].device,index,val); } else { abort(); } } #endif @@ -340,7 +353,30 @@ void LookupParameterStorage::accumulate_grad_dev(MyDevice & dev, unsigned index, #else template void LookupParameterStorage::accumulate_grad_dev(Device_CPU & dev, unsigned index, const Tensor& d); void LookupParameterStorage::accumulate_grad(unsigned index, const Tensor& d) { - if(default_device->type == DeviceType::CPU) { accumulate_grad_dev(*(Device_CPU*)default_device,index,d); } + if(values[index].device->type == DeviceType::CPU) { accumulate_grad_dev(*(Device_CPU*)values[index].device,index,d); } + else { abort(); } + } +#endif + +template +void LookupParameterStorage::scale_parameters_dev(MyDevice & dev, float a) { + for (auto& p : values) + p.tvec().device(*dev.edevice) = p.tvec() * a; +} +#ifdef __CUDACC__ + template void LookupParameterStorage::scale_parameters_dev(Device_GPU & dev, float a); +#elif defined(HAVE_CUDA) + extern template void LookupParameterStorage::scale_parameters_dev(Device_GPU & dev, float a); + template void LookupParameterStorage::scale_parameters_dev(Device_CPU & dev, float a); + void LookupParameterStorage::scale_parameters(float a) { + if(values[0].device->type == DeviceType::CPU) { scale_parameters_dev(*(Device_CPU*)values[0].device,a); } + else if(values[0].device->type == DeviceType::GPU) { scale_parameters_dev(*(Device_GPU*)values[0].device,a); } + else { abort(); } + } +#else + template void LookupParameterStorage::scale_parameters_dev(Device_CPU & dev, float a); + void LookupParameterStorage::scale_parameters(float a) { + if(values[0].device->type == DeviceType::CPU) { scale_parameters_dev(*(Device_CPU*)values[0].device,a); } else { abort(); } } #endif @@ -381,5 +417,4 @@ float Model::gradient_l2_norm_dev(MyDevice & dev) const { } #endif - } // namespace cnn diff --git a/cnn/model.h b/cnn/model.h index 1bb2adaf7..9fd530ea5 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -39,6 +39,8 @@ struct ParameterStorageBase { // represents parameters (e.g., a weight matrix) that will be optimized struct ParameterStorage : public ParameterStorageBase { friend class Model; + template + void scale_parameters_dev(MyDevice & dev, float a); void scale_parameters(float a) override; void zero() override; template @@ -75,6 +77,8 @@ struct ParameterStorage : public ParameterStorageBase { // represents a matrix/vector embedding of a discrete set struct LookupParameterStorage : public ParameterStorageBase { friend class Model; + template + void scale_parameters_dev(MyDevice & dev, float a); void scale_parameters(float a) override; void zero() override; template From 017def5ccf0892b144cbe0eb9372b1917996468d Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 8 Jul 2016 18:34:03 +0900 Subject: [PATCH 599/965] Fixed termination on sending a zero-length sparse input --- cnn/gpu-ops.cu | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cnn/gpu-ops.cu b/cnn/gpu-ops.cu index a537a7975..99d210002 100644 --- a/cnn/gpu-ops.cu +++ b/cnn/gpu-ops.cu @@ -17,8 +17,10 @@ __global__ void ker_sparse_assign(int n, unsigned int *idx, float *src, float *t } void sparse_assign(int n, unsigned int *idx, float *src, float *trg) { - auto tb = SizeToBlockThreadPair(n); - ker_sparse_assign<<>>(n, idx, src, trg); + if(n > 0) { + auto tb = SizeToBlockThreadPair(n); + ker_sparse_assign<<>>(n, idx, src, trg); + } } // CUDA kernel. Each thread takes care of one element of c From 753da6723e82a38c6ced762e7a74760b396b9a7f Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 8 Jul 2016 13:25:38 +0300 Subject: [PATCH 600/965] adapt py to API change in cnn --- pycnn/model_test.py | 5 +++-- pycnn/pycnn.pxd | 2 +- pycnn/pycnn.pyx | 12 ++++++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/pycnn/model_test.py b/pycnn/model_test.py index a0f14df2c..00b4e43d4 100644 --- a/pycnn/model_test.py +++ b/pycnn/model_test.py @@ -109,8 +109,9 @@ def new_style_save_and_load(): # create new model and load: m2 = Model() [xa,xb,xt1,xt2,xtt,xc,xlb,xlb2,xnp] = m2.load("test_new") - m3 = Model() - [rnp,rlb2,rlb,rc,rtt,rt2,rt1,rb,ra] = m3.load("test_new_r") + #m3 = Model() + #[rnp,rlb2,rlb,rc,rtt,rt2,rt1,rb,ra] = m3.load("test_new_r") + m3,[rnp,rlb2,rlb,rc,rtt,rt2,rt1,rb,ra] = Model.from_file("test_new_r") # partial save and load: m.save("test_new_partial", [a,tt,lb2]) diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index a14ea3df5..5170babdd 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -52,7 +52,7 @@ cdef extern from "cnn/model.h" namespace "cnn": CLookupParameters() CLookupParameterStorage *get() CDim dim - void Initialize(unsigned index, const vector[float]& val) + void initialize(unsigned index, const vector[float]& val) void zero() cdef cppclass CModel "cnn::Model": diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 5f126fc5b..3d337c72b 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -150,7 +150,7 @@ cdef class LookupParameters: return lookup_batch(self, i) cpdef init_row(self, unsigned i, vector[float] row): - self.thisptr.Initialize(i, row) + self.thisptr.initialize(i, row) cpdef as_array(self): """ @@ -194,6 +194,12 @@ cdef class Model: # {{{ def __dealloc__(self): del self.thisptr + @staticmethod + def from_file(fname): + model = Model() + res = model.load(fname) + return model, res + # TODO: for debug, remove cpdef pl(self): return self.thisptr.parameters_list().size() @@ -215,7 +221,7 @@ cdef class Model: # {{{ def save_all(self, string fname): save_cnn_model(fname, self.thisptr) - def load_all(self, string fname): + cdef load_all(self, string fname): load_cnn_model(fname, self.thisptr) cdef _save_one(self, component, CModelSaver *saver, fh, pfh): @@ -243,7 +249,6 @@ cdef class Model: # {{{ else: raise TypeError("Cannot save model component of type %s" % type(c)) - # TODO support python "components", e.g. MLP def save(self, string fname, components=None): if not components: self.save_all(fname) @@ -292,7 +297,6 @@ cdef class Model: # {{{ print "Huh?" assert False,"unsupported type " + tp - # TODO support python "components", e.g. MLP cpdef load(self, string fname): if not os.path.isfile(fname+".pym"): self.load_all(fname) From 03331a8736909001b573d859a98f21198326f6c9 Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 8 Jul 2016 14:31:58 +0300 Subject: [PATCH 601/965] bugfix in revert + python binding --- cnn/cnn.cc | 1 + cnn/exec.cc | 4 ++++ cnn/exec.h | 2 ++ pycnn/pycnn.pxd | 7 +++++++ pycnn/pycnn.pyx | 14 ++++++++++++++ 5 files changed, 28 insertions(+) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 07b8cb74c..16f770920 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -90,6 +90,7 @@ void ComputationGraph::revert(CGCheckpoint p) { // clear all nodes at position >= p.node_idx if (nodes.size() > p.node_idx) { nodes.resize(p.node_idx); // TODO verify deletion of nodes. + ee->invalidate(p.node_idx-1); // clear precomputed forward values } // clear all parameter nodes at position >= p.par_node_idx if (parameter_nodes.size() > p.par_node_idx) { diff --git a/cnn/exec.cc b/cnn/exec.cc index 4bf363ad3..e77850414 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -13,6 +13,10 @@ void SimpleExecutionEngine::invalidate() { num_nodes_evaluated = 0; } +void SimpleExecutionEngine::invalidate(unsigned i) { + num_nodes_evaluated = i; +} + const Tensor& SimpleExecutionEngine::forward() { const VariableIndex node_max_index = (VariableIndex)(cg.nodes.size() - 1); return forward(node_max_index); diff --git a/cnn/exec.h b/cnn/exec.h index ecb97e2c9..82d2715a7 100644 --- a/cnn/exec.h +++ b/cnn/exec.h @@ -9,6 +9,7 @@ class ExecutionEngine { public: virtual ~ExecutionEngine(); virtual void invalidate() = 0; + virtual void invalidate(unsigned) = 0; virtual const Tensor& forward() = 0; virtual const Tensor& forward(VariableIndex i) = 0; virtual const Tensor& incremental_forward() = 0; // if you want to add nodes and evaluate just the new parts @@ -25,6 +26,7 @@ class SimpleExecutionEngine : public ExecutionEngine { public: explicit SimpleExecutionEngine(const ComputationGraph& cg) : ExecutionEngine(cg) {} void invalidate() override; + void invalidate(unsigned i) override; const Tensor& forward() override; const Tensor& forward(VariableIndex i) override; const Tensor& incremental_forward() override; // if you want to add nodes and evaluate just the new parts diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index 5170babdd..9f1eaa157 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -67,6 +67,9 @@ cdef extern from "cnn/model.h" namespace "cnn": cdef extern from "cnn/cnn.h" namespace "cnn": ctypedef unsigned VariableIndex + cdef cppclass C_CGCheckpoint "cnn::CGCheckpoint": + pass + cdef cppclass CComputationGraph "cnn::ComputationGraph": CComputationGraph() except + # Inputs @@ -88,6 +91,10 @@ cdef extern from "cnn/cnn.h" namespace "cnn": void backward() void backward(VariableIndex i) + # checkpointing + C_CGCheckpoint get_checkpoint() + void revert(C_CGCheckpoint cp) + void PrintGraphviz() const cdef extern from "cnn/training.h" namespace "cnn": diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 3d337c72b..a97f15668 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -373,6 +373,8 @@ cdef ComputationGraph _cg = ComputationGraph(SECRET) def cg_version(): return _cg._cg_version def renew_cg(): return _cg.renew() +def cg_checkpoint(): return _cg.get_checkpoint() +def cg_revert(int cp): return _cg.revert(cp) cpdef ComputationGraph cg(): global _cg @@ -382,6 +384,7 @@ cdef class ComputationGraph: cdef CComputationGraph *thisptr, cdef list _inputs cdef int _cg_version + cdef vector[C_CGCheckpoint] checkpoints def __cinit__(self, int guard=0): if guard != SECRET: raise RuntimeError("Do not instantiate ComputationGraph directly. Use pycnn.cg()") self.thisptr = new CComputationGraph() @@ -433,6 +436,17 @@ cdef class ComputationGraph: cpdef PrintGraphviz(self): self.thisptr.PrintGraphviz() + cpdef get_checkpoint(self): + cdef C_CGCheckpoint cp + cp = self.thisptr.get_checkpoint() + self.checkpoints.push_back(cp) + return self.checkpoints.size() - 1 + + cpdef void revert(self, int checkpoint): + self.thisptr.revert(self.checkpoints[checkpoint]) + + + # CNN handles changing inputs keeping pointers to memoty locations. # Because of python's memory management, objects that wrap such pointers # must be registered in a central location. This location would be the From 8fefd2e24607a4bb7d82e7c24ed5a94f0ab70a1e Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 8 Jul 2016 15:35:31 +0300 Subject: [PATCH 602/965] checkpoint/revert as stack --- cnn/cnn.cc | 14 ++++++++++++-- cnn/cnn.h | 8 ++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 16f770920..ea96ab6a0 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -77,7 +77,7 @@ void ComputationGraph::clear() { nodes.clear(); } -CGCheckpoint ComputationGraph::get_checkpoint() { +CGCheckpoint ComputationGraph::_get_checkpoint() { CGCheckpoint p; p.device_mem_checkpoint = default_device->mark(this); p.node_idx = nodes.size(); @@ -85,7 +85,7 @@ CGCheckpoint ComputationGraph::get_checkpoint() { return p; } -void ComputationGraph::revert(CGCheckpoint p) { +void ComputationGraph::_revert(CGCheckpoint p) { default_device->revert(p.device_mem_checkpoint); // clear all nodes at position >= p.node_idx if (nodes.size() > p.node_idx) { @@ -98,6 +98,16 @@ void ComputationGraph::revert(CGCheckpoint p) { } } +void ComputationGraph::checkpoint() { + checkpoints.push_back(_get_checkpoint()); +} + +void ComputationGraph::revert() { + if (checkpoints.size() == 0) return; + _revert(checkpoints.back()); + checkpoints.pop_back(); +} + VariableIndex ComputationGraph::add_input(real s) { VariableIndex new_node_index(nodes.size()); diff --git a/cnn/cnn.h b/cnn/cnn.h index 8d2ac94fd..e36c817a2 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -106,8 +106,8 @@ struct ComputationGraph { // reset ComputationGraph to a newly created state void clear(); - CGCheckpoint get_checkpoint(); - void revert(CGCheckpoint checkpoint); + void checkpoint(); + void revert(); // perform computations @@ -139,6 +139,10 @@ struct ComputationGraph { ExecutionEngine* ee; // handles the execution private: void set_dim_for_new_node(const VariableIndex& i); + + std::vector checkpoints; + CGCheckpoint _get_checkpoint(); + void _revert(CGCheckpoint checkpoint); }; // represents an SSA variable From bf07772c3af8a77d99dc09faac3ed0c92e768003 Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 8 Jul 2016 15:43:23 +0300 Subject: [PATCH 603/965] check/revert as stack -- python --- pycnn/pycnn.pxd | 6 ++---- pycnn/pycnn.pyx | 18 ++++++------------ 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index 9f1eaa157..17dafd09a 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -67,8 +67,6 @@ cdef extern from "cnn/model.h" namespace "cnn": cdef extern from "cnn/cnn.h" namespace "cnn": ctypedef unsigned VariableIndex - cdef cppclass C_CGCheckpoint "cnn::CGCheckpoint": - pass cdef cppclass CComputationGraph "cnn::ComputationGraph": CComputationGraph() except + @@ -92,8 +90,8 @@ cdef extern from "cnn/cnn.h" namespace "cnn": void backward(VariableIndex i) # checkpointing - C_CGCheckpoint get_checkpoint() - void revert(C_CGCheckpoint cp) + void checkpoint() + void revert() void PrintGraphviz() const diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index a97f15668..57bd0a12e 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -373,8 +373,8 @@ cdef ComputationGraph _cg = ComputationGraph(SECRET) def cg_version(): return _cg._cg_version def renew_cg(): return _cg.renew() -def cg_checkpoint(): return _cg.get_checkpoint() -def cg_revert(int cp): return _cg.revert(cp) +def cg_checkpoint(): _cg.checkpoint() +def cg_revert(): _cg.revert() cpdef ComputationGraph cg(): global _cg @@ -384,7 +384,6 @@ cdef class ComputationGraph: cdef CComputationGraph *thisptr, cdef list _inputs cdef int _cg_version - cdef vector[C_CGCheckpoint] checkpoints def __cinit__(self, int guard=0): if guard != SECRET: raise RuntimeError("Do not instantiate ComputationGraph directly. Use pycnn.cg()") self.thisptr = new CComputationGraph() @@ -436,16 +435,11 @@ cdef class ComputationGraph: cpdef PrintGraphviz(self): self.thisptr.PrintGraphviz() - cpdef get_checkpoint(self): - cdef C_CGCheckpoint cp - cp = self.thisptr.get_checkpoint() - self.checkpoints.push_back(cp) - return self.checkpoints.size() - 1 - - cpdef void revert(self, int checkpoint): - self.thisptr.revert(self.checkpoints[checkpoint]) - + cpdef void checkpoint(self): + self.thisptr.checkpoint() + cpdef void revert(self): + self.thisptr.revert() # CNN handles changing inputs keeping pointers to memoty locations. # Because of python's memory management, objects that wrap such pointers From d6c1ccbf8317363216c224d1c5547f93019fa5f8 Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 8 Jul 2016 17:15:08 +0300 Subject: [PATCH 604/965] --pycnn-viz option --- pycnn/CHANGES.md | 39 +++++++++++++++++++++++++++++++++++++++ pycnn/pycnn.py | 7 +++++++ pycnn/setup.py | 14 +++++++++++--- 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 pycnn/pycnn.py diff --git a/pycnn/CHANGES.md b/pycnn/CHANGES.md index f5c4bd5e2..37f68f1e4 100644 --- a/pycnn/CHANGES.md +++ b/pycnn/CHANGES.md @@ -1,5 +1,8 @@ # pycnn API changes for v2 +* Model no longer holds named parameters +* checkpoint / revert mechanism for computation graph (useful for beam search etc) + ## Model no longer holds named parameters The major API change in v2 of pycnn is in the `Model` class. @@ -152,3 +155,39 @@ output2 = mlp2(E2[3]) assert(numpy.array_equal(output2.npvalue(), output.npvalue())) ``` + +## Checkpoint / revert mechanism for computation graph + +When doing beam search, we often do multiple calculations and then discard most of them. +If the calculations are done with the compuation graph, the computation graph can grow very +large (and hence become slow and memory consuming) as the expressions resulting from the discarded +computation are not discarded from the graph. + +The new checkpointing mechanism deals with this problem by allowing to mark certain points in the graph lifestage, and then returning back to them (deleting everything that was created after the checkpoint). + +The API is using `cg_checkpoint()` to mark a checkpoint, and `cg_revert()` to return to the last checkpoint. +The checkpoints are treated as a stack, so you can create several checkpoints and then return to them +in reverse order. + +Be careful with this feature, as expressions that were created after the checkpoint will be invaludated after the revert, but this is not enforced in code so accessing them _may work_, but result in wrong computations. + +Example usage: +```python + +m = Model(); +px = m.add_parameters((10,10)) +x = parameter(px) +y = x*x +cg_checkpoint() +z = y+y +w = z+y +print w.npvalue() +cg_revert() +# at this point x and y are still alive, but z and w are deleted, +# they are not part of the computation graph anymore and the c-level memory +# for them is freed. + +``` + + + diff --git a/pycnn/pycnn.py b/pycnn/pycnn.py new file mode 100644 index 000000000..630a8f004 --- /dev/null +++ b/pycnn/pycnn.py @@ -0,0 +1,7 @@ +import sys +if '--pycnn-viz' in sys.argv: + from pycnn_viz import * +else: + def PrintGraphviz(**kwarge): + print "Run with --pycnn-viz to get the visualization behavior." + from _pycnn import * diff --git a/pycnn/setup.py b/pycnn/setup.py index a22d10ddf..85553100f 100644 --- a/pycnn/setup.py +++ b/pycnn/setup.py @@ -9,8 +9,15 @@ if "CFLAGS" in cfg_vars: cfg_vars["CFLAGS"] = cfg_vars["CFLAGS"].replace("-Wstrict-prototypes", "") +COMPILER_ARGS=["-std=c++11"] +import platform + +# in some OSX systems, the following extra flags are needed: +if platform.system() == 'Darwin': + COMPILER_ARGS.extend(["-stdlib=libc++","-mmacosx-version-min=10.7"]) + ext = Extension( - "pycnn", # name of extension + "_pycnn", # name of extension ["pycnn.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source include_dirs=["../../cnn/", # this is the location of the main cnn directory. @@ -18,11 +25,12 @@ libraries=['cnn_shared'], # ditto library_dirs=["."], #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed - extra_compile_args=["-std=c++11"], + extra_compile_args=COMPILER_ARGS, runtime_library_dirs=["$ORIGIN/./"], ) setup(ext_modules = [ext], cmdclass = {'build_ext': build_ext}, name="pyCNN", - ) + py_modules = ['pycnn','pycnn_viz'], +) From f7e886096cf09cdaeee4e868fab104057f18377e Mon Sep 17 00:00:00 2001 From: dhg Date: Fri, 8 Jul 2016 11:12:54 -0700 Subject: [PATCH 605/965] gitignore pycnn build outputs --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 5356368f0..d1afdf328 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ CMakeCache.txt CMakeFiles cmake_install.cmake pycnn/pycnn.cpp +pycnn/dist/ +pycnn/pyCNN.egg-info/ # binaries examples/embed-cl From 9973e70845083960c7f4924ee54e1904e7f2ea1b Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 11 Jul 2016 23:47:52 +0900 Subject: [PATCH 606/965] Fixed bizarre bug in cnn sparse input --- cnn/param-nodes.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index 235aa83ae..4bb2c05c5 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -177,15 +177,14 @@ CNN_NODE_INST_DEV_IMPL(InputNode) template void SparseInputNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 0); + fx.tvec().device(*dev.edevice) = fx.tvec().constant(defdata); #if __CUDACC__ unsigned int* ids_ptr = (unsigned int*)aux_mem; float* data_ptr = (float*)(ids_ptr + ids.size()); cudaMemcpyAsync(ids_ptr, &ids[0], ids.size() * sizeof(unsigned int), cudaMemcpyHostToDevice); cudaMemcpyAsync(data_ptr, &data[0], data.size() * sizeof(float), cudaMemcpyHostToDevice); - cnn::gpu::const_init(dim.size(), defdata, fx.v); cnn::gpu::sparse_assign(ids.size(), ids_ptr, data_ptr, fx.v); #else - std::fill(fx.v, fx.v + dim.size(), defdata); for(size_t i = 0; i < ids.size(); ++i) fx.v[ids[i]] = data[i]; #endif From b31cf4a4d2aa8b2de04419707d4dc57040c9123b Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 12 Jul 2016 14:16:09 +0900 Subject: [PATCH 607/965] Added another test for affine transform --- tests/test-nodes.cc | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index c957dbae4..c139f355e 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -187,7 +187,7 @@ BOOST_AUTO_TEST_CASE( affine_gradient ) { Expression x2 = parameter(cg, param2); Expression y = affine_transform({x1, x2, scalar}); Expression ones3 = input(cg, {1,3}, ones3_vals); - ones3 * y; + ones3 * sqrt(y); BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -199,7 +199,7 @@ BOOST_AUTO_TEST_CASE( affine_batch_gradient ) { Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = affine_transform({x1, x2, scalar}); Expression ones3 = input(cg, {1,3}, ones3_vals); - sum_batches(ones3 * y); + sum_batches(ones3 * sqrt(y)); BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -211,7 +211,7 @@ BOOST_AUTO_TEST_CASE( affine_batch_col_gradient ) { Expression x2 = input(cg, Dim({1,3},2), batch_vals); Expression y = affine_transform({transpose(x1), scalar, x2}); Expression ones3 = input(cg, {3,1}, ones3_vals); - sum_batches(y * ones3); + sum_batches(sqrt(y) * ones3); BOOST_CHECK(CheckGrad(mod, cg, 0)); } @@ -223,10 +223,22 @@ BOOST_AUTO_TEST_CASE( affine_batch2_gradient ) { Expression x2 = parameter(cg, param2); Expression y = affine_transform({x1, scalar, transpose(x2) }); Expression ones3 = input(cg, {3,1}, ones3_vals); - sum_batches(y * ones3); + sum_batches(sqrt(y) * ones3); BOOST_CHECK(CheckGrad(mod, cg, 0)); } +// Expression operator*(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( affine_batch3_gradient ) { + cnn::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param_square1); + Expression inp = input(cg, Dim({3},2), batch_vals); + Expression y = affine_transform({x1, x2, inp }); + Expression ones3 = input(cg, {1,3}, ones3_vals); + sum_batches(ones3 * sqrt(y)); + BOOST_CHECK(CheckGrad(mod, cg, 2)); +} + // Expression operator*(const Expression& x, float y); BOOST_AUTO_TEST_CASE( multiplyscalar_gradient ) { cnn::ComputationGraph cg; From 7404438d4b00423cad6c5b8a6ea3223e1dd375c0 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 12 Jul 2016 14:18:16 +0900 Subject: [PATCH 608/965] Removed extra error output in tests --- tests/test-nodes.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index c139f355e..640310f46 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -236,7 +236,7 @@ BOOST_AUTO_TEST_CASE( affine_batch3_gradient ) { Expression y = affine_transform({x1, x2, inp }); Expression ones3 = input(cg, {1,3}, ones3_vals); sum_batches(ones3 * sqrt(y)); - BOOST_CHECK(CheckGrad(mod, cg, 2)); + BOOST_CHECK(CheckGrad(mod, cg, 0)); } // Expression operator*(const Expression& x, float y); From 89872b3d72f7e353e176a036383829edd821eb15 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 12 Jul 2016 19:14:04 +0900 Subject: [PATCH 609/965] Fixed error in cuda ops when using very large blocks --- cnn/cuda.h | 2 +- cnn/gpu-ops.cu | 32 ++++++++++++++++++++------------ cnn/nodes.cc | 15 +++------------ cnn/nodes.h | 2 +- cnn/param-nodes.cc | 6 +++--- 5 files changed, 28 insertions(+), 29 deletions(-) diff --git a/cnn/cuda.h b/cnn/cuda.h index 457b18ed4..bb2c89125 100644 --- a/cnn/cuda.h +++ b/cnn/cuda.h @@ -44,7 +44,7 @@ inline std::pair SizeToBlockThreadPair(int n) { ++logn; int threads = 1 << logn; int blocks = (n + threads - 1) >> logn; - blocks = blocks > 128 ? 128 : blocks; + blocks = blocks > 65535 ? 65535 : blocks; return std::make_pair(blocks, threads); } diff --git a/cnn/gpu-ops.cu b/cnn/gpu-ops.cu index 99d210002..23cfd21dd 100644 --- a/cnn/gpu-ops.cu +++ b/cnn/gpu-ops.cu @@ -8,34 +8,42 @@ namespace gpu { // CUDA kernel. Each thread takes care of one element of c __global__ void ker_sparse_assign(int n, unsigned int *idx, float *src, float *trg) { - // Get our global thread ID - int id = blockIdx.x*blockDim.x+threadIdx.x; + // Get our global thread ID + int id = blockIdx.x*blockDim.x+threadIdx.x; - // Make sure we do not go out of bounds - if (id < n) - trg[idx[id]] = src[id]; + // Make sure we do not go out of bounds + if (id < n) + trg[idx[id]] = src[id]; + + __syncthreads(); } void sparse_assign(int n, unsigned int *idx, float *src, float *trg) { if(n > 0) { auto tb = SizeToBlockThreadPair(n); - ker_sparse_assign<<>>(n, idx, src, trg); + int total_size = tb.first*tb.second; + for(int curr_pos = 0; curr_pos < n; curr_pos += total_size) + ker_sparse_assign<<>>(min(total_size, n-curr_pos), idx+curr_pos, src+curr_pos, trg); } } // CUDA kernel. Each thread takes care of one element of c __global__ void ker_const_init(int n, float val, float *trg) { - // Get our global thread ID - int id = blockIdx.x*blockDim.x+threadIdx.x; + // Get our global thread ID + int id = blockIdx.x*blockDim.x+threadIdx.x; - // Make sure we do not go out of bounds - if (id < n) - trg[id] = val; + // Make sure we do not go out of bounds + if (id < n) + trg[id] = val; + + __syncthreads(); } void const_init(int n, float val, float *trg) { auto tb = SizeToBlockThreadPair(n); - ker_const_init<<>>(n, val, trg); + int total_size = tb.first*tb.second; + for(int curr_pos = 0; curr_pos < n; curr_pos += total_size) + ker_const_init<<>>(min(total_size, n-curr_pos), val, trg+curr_pos); } } // namespace gpu diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 68b04fac8..3842e7e3a 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -275,23 +275,14 @@ void AffineTransform::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { assert(i < xs.size()); - // In the common case that dEdxi has a single batch, and the output has - // multiple batches, cache the sum - Tensor dEdf_sum; - if(dEdxi.d.bd == 1 && dEdf.d.bd != 1 && dEdf_mem == nullptr) { - dEdf_mem = (float*)device->fxs->allocate(sizeof(float) * dEdf.d.batch_size()); - Dim dEdf_dim = dEdf.d; dEdf_dim.bd = 1; - dEdf_sum = Tensor(dEdf_dim, dEdf_mem, device); - Eigen::array red_axis; red_axis[0] = 2; - dEdf_sum.t<2>().device(*dev.edevice) = dEdf.tb<2>().sum(red_axis); - } - // Bias term if (i == 0) { // bias term if(dEdxi.d.bd == dEdf.d.bd) { dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); } else { - dEdxi.tvec().device(*dev.edevice) += dEdf_sum.tvec(); + assert(dEdxi.d.bd == 1 && dEdf.d.bd != 1); + Eigen::array red_axis; red_axis[0] = 2; + dEdxi.t<2>().device(*dev.edevice) += dEdf.tb<2>().sum(red_axis); } // Left argument of matrix multiply diff --git a/cnn/nodes.h b/cnn/nodes.h index 4cc19c439..95bdf0f02 100644 --- a/cnn/nodes.h +++ b/cnn/nodes.h @@ -323,7 +323,7 @@ struct CwiseQuotient : public Node { // y = x_1 \sum_{i=2, 4 ...} A_i * x_{i+1} struct AffineTransform : public Node { - template explicit AffineTransform(const T& a) : Node(a), dEdf_mem(nullptr) {} + template explicit AffineTransform(const T& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } CNN_NODE_DEFINE_DEV_IMPL() mutable float* dEdf_mem; diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index 4bb2c05c5..a5e15c2f0 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -19,7 +19,7 @@ namespace cnn { string ConstParameterNode::as_string(const vector& arg_names) const { ostringstream s; - s << "const_parameters(" << dim << ')'; + s << "const_parameters(" << dim << ") @ " << params.get(); return s.str(); } @@ -30,7 +30,7 @@ Dim ConstParameterNode::dim_forward(const vector& xs) const { string ParameterNode::as_string(const vector& arg_names) const { ostringstream s; - s << "parameters(" << dim << ')'; + s << "parameters(" << dim << ") @ " << params.get(); return s.str(); } @@ -80,7 +80,7 @@ Dim ScalarInputNode::dim_forward(const vector& xs) const { string LookupNode::as_string(const vector& arg_names) const { ostringstream s; - s << "lookup_parameters(|x|=" << params.get()->values.size() << " --> " << dim << ')'; + s << "lookup_parameters(|x|=" << params.get()->values.size() << " --> " << dim << ") @ " << params.get(); return s.str(); } From 99a7fc970918e25003aad7166ac93143ab30b82a Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 13 Jul 2016 15:48:45 +0900 Subject: [PATCH 610/965] Made broadcasting of affine transform more efficient --- cnn/nodes.cc | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/cnn/nodes.cc b/cnn/nodes.cc index 3842e7e3a..a809acc0a 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -232,26 +232,21 @@ void AffineTransform::forward_dev_impl(const MyDevice & dev, const vectorv; return; } else { -#ifdef __CUDACC__ - for (unsigned i = 1; i < xs.size(); i += 2) - // fx = (acc_sclar)*fx + xs[0] * xs[1] - CUDAMatrixMultiply(dev, *xs[i], *xs[i + 1], fx, (i == 1) ? kSCALAR_ZERO : kSCALAR_ONE); + // Add the first matrix if(fx.d.bd == xs[0]->d.bd) { - CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v, 1, fx.v, 1)); - } else { - // TODO: Any better way to do broadcasting? - for(unsigned b = 0; b < fx.d.bd; ++b) - CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, fx.d.batch_size(), kSCALAR_ONE, xs[0]->batch_ptr(b), 1, fx.batch_ptr(b), 1)); - } -#else - // Add, using broadcasting or not - if(fx.d.bd > 1 && xs[0]->d.bd == 1) { - fx.rowcol_matrix().colwise() = xs[0]->vec(); + fx.tvec().device(*dev.edevice) = xs[0]->tvec(); } else { - for(unsigned b = 0; b < fx.d.bd; ++b) - fx.batch_matrix(b) = xs[0]->batch_matrix(b); + assert(xs[0]->d.bd == 1 && fx.d.bd != 1); + Eigen::array bcast; bcast[0] = bcast[1] = 1; bcast[2] = fx.d.bd; + fx.tb<2>().device(*dev.edevice) = xs[0]->tb<2>().broadcast(bcast); } + // Perform multiplication +#ifdef __CUDACC__ + for (unsigned i = 1; i < xs.size(); i += 2) + // fx = (acc_sclar)*fx + xs[0] * xs[1] + CUDAMatrixMultiply(dev, *xs[i], *xs[i + 1], fx, kSCALAR_ONE); +#else // Multiply for (unsigned i = 1; i < xs.size(); i += 2) { if(xs[i]->d.bd == 1 && xs[i+1]->d.bd == fx.d.bd) { From f83fd368fdaa23a520c509251625a87427c0e836 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 13 Jul 2016 18:21:19 +0900 Subject: [PATCH 611/965] Added method to set model decay --- cnn/model.cc | 4 ++++ cnn/model.h | 1 + 2 files changed, 5 insertions(+) diff --git a/cnn/model.cc b/cnn/model.cc index f54e95d87..24bc551cf 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -163,6 +163,10 @@ Model::~Model() { default_device->mem->free(gradient_norm_scratch); } +void Model::set_weight_decay_lambda(float lambda) { + weight_decay.SetLambda(lambda); +} + void Model::project_weights(float radius) { static float* project_scratch = 0; if (!project_scratch) diff --git a/cnn/model.h b/cnn/model.h index 9fd530ea5..cf0ded0ff 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -181,6 +181,7 @@ class Model { LookupParameter add_lookup_parameters(unsigned n, const Dim& d); // project weights so their L2 norm = radius void project_weights(float radius = 1.0f); + void set_weight_decay_lambda(float lambda); const std::vector& all_parameters_list() const { return all_params; } const std::vector& parameters_list() const { return params; } From 1cc1bdfdf554a6c9e9db4ecfdf18d1709e1d5f74 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 20 Jul 2016 12:02:14 +0900 Subject: [PATCH 612/965] Made serialization of devices possible --- cnn/cnn.h | 11 +++++---- cnn/cuda.cc | 2 +- cnn/devices.cc | 55 +++++++++++++++++++++++---------------------- cnn/devices.h | 14 +++++++----- cnn/exec.cc | 12 +++++----- cnn/init.cc | 2 +- cnn/model.cc | 20 ++++++++--------- cnn/nodes.cc | 48 +++++++++++++++++++-------------------- cnn/tensor.h | 61 ++++++++++++++++++++++++++++++++++---------------- 9 files changed, 125 insertions(+), 100 deletions(-) diff --git a/cnn/cnn.h b/cnn/cnn.h index e36c817a2..f2e192387 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -49,15 +49,14 @@ namespace expr { struct Expression; } BOOST_STRONG_TYPEDEF(unsigned, VariableIndex) struct DeviceMemCheckpoint { - size_t fxs_used; - size_t dEdfs_used; - size_t ps_used; + std::vector used; + DeviceMemCheckpoint() : used(3) { } }; struct CGCheckpoint { - int node_idx; - int par_node_idx; - DeviceMemCheckpoint device_mem_checkpoint; + int node_idx; + int par_node_idx; + DeviceMemCheckpoint device_mem_checkpoint; }; inline void swap(VariableIndex& i1, VariableIndex& i2) { diff --git a/cnn/cuda.cc b/cnn/cuda.cc index 0456084e9..aa7621575 100644 --- a/cnn/cuda.cc +++ b/cnn/cuda.cc @@ -148,7 +148,7 @@ vector Initialize_GPU(int& argc, char**& argv) { cerr << "[cnn] Device(s) selected:"; for (int i = 0; i < requested_gpus; ++i) { cerr << ' ' << gpus[i]; - Device* d = new Device_GPU(num_mb, gpus[i]); + Device* d = new Device_GPU(gpudevices.size(), num_mb, gpus[i]); gpudevices.push_back(d); } cerr << endl; diff --git a/cnn/devices.cc b/cnn/devices.cc index 2ee48559c..eafbe57f6 100644 --- a/cnn/devices.cc +++ b/cnn/devices.cc @@ -13,27 +13,30 @@ namespace cnn { Device::~Device() {} DeviceMemCheckpoint Device::mark(ComputationGraph *cg) { - cg->incremental_forward(); // needed so that we actually allocate the needed memory - // for all existing nodes. - DeviceMemCheckpoint cp; - cp.fxs_used = fxs->used; - cp.dEdfs_used = dEdfs->used; - cp.ps_used = ps->used; - return cp; + cg->incremental_forward(); // needed so that we actually allocate the needed memory + // for all existing nodes. + DeviceMemCheckpoint cp; + for(size_t i = 0; i < 3; ++i) + cp.used[i] = pools[i]->used; + return cp; } void Device::revert(DeviceMemCheckpoint cp) { - assert(cp.fxs_used <= fxs->used); - assert(cp.dEdfs_used <= dEdfs->used); - assert(cp.ps_used <= ps->used); - fxs->used = cp.fxs_used; - dEdfs->used = cp.dEdfs_used; - ps->used = cp.ps_used; + for(size_t i = 0; i < 3; ++i) { + assert(cp.used[i] <= pools[i]->used); + pools[i]->used = cp.used[i]; + } +} + +void Device::allocate_tensor(DeviceMempool mp, Tensor & tens) { + assert(mp != DeviceMempool::NONE); + tens.v = (float*)pools[(int)mp]->allocate(tens.d.size()); + tens.mem_pool = mp; } #if HAVE_CUDA -Device_GPU::Device_GPU(int mb, int device_id) : - Device(DeviceType::GPU, &gpu_mem), cuda_device_id(device_id), gpu_mem(device_id) { +Device_GPU::Device_GPU(int my_id, int mb, int device_id) : + Device(my_id, DeviceType::GPU, &gpu_mem), cuda_device_id(device_id), gpu_mem(device_id) { CUDA_CHECK(cudaSetDevice(device_id)); CUBLAS_CHECK(cublasCreate(&cublas_handle)); CUBLAS_CHECK(cublasSetPointerMode(cublas_handle, CUBLAS_POINTER_MODE_DEVICE)); @@ -51,11 +54,10 @@ Device_GPU::Device_GPU(int mb, int device_id) : estream = new Eigen::CudaStreamDevice(device_id); edevice = new Eigen::GpuDevice(estream); - // this is the big memory allocation - size_t byte_count = (size_t)mb << 20; - fxs = new AlignedMemoryPool(byte_count, mem); // memory for node values - dEdfs = new AlignedMemoryPool(byte_count, mem); // memory for node gradients - ps = new AlignedMemoryPool(byte_count, mem); // memory for parameters + // this is the big memory allocation. Do it in stages to make sure things are aligned. + size_t byte_count = (size_t)((mb << 10)/3) << 10; + for(size_t i = 0; i < 3; ++i) + pools[i] = new AlignedMemoryPool(byte_count, mem); } Device_GPU::~Device_GPU() {} @@ -66,8 +68,8 @@ Device_GPU::~Device_GPU() {} // CPU -- 0 params // -- 50mb fxs // -- 50mb dEdfx -Device_CPU::Device_CPU(int mb, bool shared) : - Device(DeviceType::CPU, &cpu_mem), shmem(mem) { +Device_CPU::Device_CPU(int my_id, int mb, bool shared) : + Device(my_id, DeviceType::CPU, &cpu_mem), shmem(mem) { if (shared) shmem = new SharedAllocator(); kSCALAR_MINUSONE = (float*) mem->malloc(sizeof(float)); *kSCALAR_MINUSONE = -1; @@ -79,11 +81,10 @@ Device_CPU::Device_CPU(int mb, bool shared) : // Initialize the Eigen device edevice = new Eigen::DefaultDevice; - // this is the big memory allocation: the pools - size_t byte_count = (size_t)mb << 20; - fxs = new AlignedMemoryPool(byte_count, mem); // memory for node values - dEdfs = new AlignedMemoryPool(byte_count, mem); // memory for node gradients - ps = new AlignedMemoryPool(byte_count, shmem); // memory for parameters + // this is the big memory allocation. Do it in stages to make sure things are aligned. + size_t byte_count = (size_t)((mb << 10)/3) << 10; + for(size_t i = 0; i < 3; ++i) + pools[i] = new AlignedMemoryPool(byte_count, mem); } Device_CPU::~Device_CPU() {} diff --git a/cnn/devices.h b/cnn/devices.h index 9f659a91d..0d32ad4a7 100644 --- a/cnn/devices.h +++ b/cnn/devices.h @@ -14,35 +14,37 @@ namespace Eigen { namespace cnn { enum class DeviceType {CPU, GPU}; +enum class DeviceMempool {FXS = 0, DEDFS = 1, PS = 2, NONE = 3}; struct ComputationGraph; // TODO is there a nicer way to resolve this cyclic dependency? struct DeviceMemCheckpoint; +struct Tensor; class Device { protected: - Device(DeviceType t, MemAllocator* m) : type(t), mem(m) {} + Device(int i, DeviceType t, MemAllocator* m) : device_id(i), type(t), mem(m), pools(3, nullptr) {} Device(const Device&) = delete; Device& operator=(const Device&) = delete; virtual ~Device(); public: + int device_id; DeviceType type; MemAllocator* mem; - AlignedMemoryPool* fxs; - AlignedMemoryPool* dEdfs; - AlignedMemoryPool* ps; float* kSCALAR_MINUSONE; float* kSCALAR_ONE; float* kSCALAR_ZERO; std::string name; virtual DeviceMemCheckpoint mark(ComputationGraph *cg); virtual void revert(DeviceMemCheckpoint cp); + void allocate_tensor(DeviceMempool mem_pool, Tensor & tensor); + std::vector pools; }; #if HAVE_CUDA class Device_GPU : public Device { public: typedef Eigen::CudaStreamDevice EigenDevice; - explicit Device_GPU(int mb, int device_id); + explicit Device_GPU(int my_id, int mb, int device_id); ~Device_GPU(); int cuda_device_id; cublasHandle_t cublas_handle; @@ -55,7 +57,7 @@ class Device_GPU : public Device { class Device_CPU : public Device { public: typedef Eigen::DefaultDevice EigenDevice; - explicit Device_CPU(int mb, bool shared); + explicit Device_CPU(int my_id, int mb, bool shared); ~Device_CPU(); CPUAllocator cpu_mem; Eigen::DefaultDevice* edevice; diff --git a/cnn/exec.cc b/cnn/exec.cc index e77850414..4abdb49c3 100644 --- a/cnn/exec.cc +++ b/cnn/exec.cc @@ -46,7 +46,7 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { // free any old memory if this is a new CG if (num_nodes_evaluated == 0) for(Device* dev : cnn::devices) - dev->fxs->free(); + dev->pools[(int)DeviceMempool::FXS]->free(); if (i >= num_nodes_evaluated) { nfxs.resize(i + 1); @@ -66,7 +66,7 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { assert(node->device != nullptr); nfxs[num_nodes_evaluated].device = node->device; // Get the memory - nfxs[num_nodes_evaluated].v = static_cast(nfxs[num_nodes_evaluated].device->fxs->allocate(node->dim.size() * sizeof(float))); + nfxs[num_nodes_evaluated].v = static_cast(nfxs[num_nodes_evaluated].device->pools[(int)DeviceMempool::FXS]->allocate(node->dim.size() * sizeof(float))); if (nfxs[num_nodes_evaluated].v == nullptr) { cerr << "out of memory\n"; abort(); @@ -74,7 +74,7 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { void* aux_mem = nullptr; size_t aux_size = node->aux_storage_size(); if (aux_size) { - aux_mem = nfxs[num_nodes_evaluated].device->fxs->allocate(aux_size); + aux_mem = nfxs[num_nodes_evaluated].device->pools[(int)DeviceMempool::FXS]->allocate(aux_size); if (!aux_mem) { cerr << "aux out of memory\n"; abort(); @@ -105,19 +105,19 @@ void SimpleExecutionEngine::backward(VariableIndex from_where) { const unsigned num_nodes = from_where+1; ndEdfs.resize(num_nodes); for(Device* device : devices) - device->dEdfs->free(); + device->pools[(int)DeviceMempool::DEDFS]->free(); for (unsigned i = 0; i < num_nodes; ++i) { const auto dim = nfxs[i].d; ndEdfs[i].d = dim; ndEdfs[i].device = nfxs[i].device; - ndEdfs[i].v = static_cast(ndEdfs[i].device->dEdfs->allocate(dim.size() * sizeof(float))); + ndEdfs[i].v = static_cast(ndEdfs[i].device->pools[(int)DeviceMempool::DEDFS]->allocate(dim.size() * sizeof(float))); if (!ndEdfs[i].v) { cerr << "out of memory while attempting to allocate space for derivatives\n"; abort(); } } for(Device* device : devices) - device->dEdfs->zero_allocated_memory(); + device->pools[(int)DeviceMempool::DEDFS]->zero_allocated_memory(); // initialize dE/dE = 1 ndEdfs.back().v = kSCALAR_ONE; diff --git a/cnn/init.cc b/cnn/init.cc index b89cda8d3..f1094cc17 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -84,7 +84,7 @@ void Initialize(int& argc, char**& argv, bool shared_parameters) { rndeng = new mt19937(random_seed); cerr << "[cnn] allocating memory: " << num_mb << "MB\n"; - devices.push_back(new Device_CPU(num_mb, shared_parameters)); + devices.push_back(new Device_CPU(devices.size(), num_mb, shared_parameters)); int default_index = 0; if (gpudevices.size() > 0) { for (auto gpu : gpudevices) diff --git a/cnn/model.cc b/cnn/model.cc index 24bc551cf..6a5234d3b 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -53,7 +53,7 @@ ParameterStorageBase::~ParameterStorageBase() {} ParameterStorage::ParameterStorage(const Dim& d, float scale) : dim(d) { values.d = g.d = d; - values.v = static_cast(default_device->ps->allocate(d.size() * sizeof(float))); + values.v = static_cast(default_device->pools[(int)DeviceMempool::PS]->allocate(d.size() * sizeof(float))); values.device = g.device = default_device; if (scale) { TensorTools::Randomize(values, scale); @@ -61,7 +61,7 @@ ParameterStorage::ParameterStorage(const Dim& d, float scale) : dim(d) { else { TensorTools::Randomize(values); } - g.v = static_cast(default_device->ps->allocate(d.size() * sizeof(float))); + g.v = static_cast(default_device->pools[(int)DeviceMempool::PS]->allocate(d.size() * sizeof(float))); TensorTools::Zero(g); } @@ -85,13 +85,13 @@ LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d for (unsigned i = 0; i < n; ++i) { auto& v = values[i]; v.d = d; - v.v = static_cast(default_device->ps->allocate(d.size() * sizeof(float))); + v.v = static_cast(default_device->pools[(int)DeviceMempool::PS]->allocate(d.size() * sizeof(float))); v.device = default_device; TensorTools::Randomize(v); auto& g = grads[i]; g.d = d; - g.v = static_cast(default_device->ps->allocate(d.size() * sizeof(float))); + g.v = static_cast(default_device->pools[(int)DeviceMempool::PS]->allocate(d.size() * sizeof(float))); g.device = default_device; TensorTools::Zero(g); } @@ -235,7 +235,7 @@ void load_cnn_model(std::string filename, Model* model) { // Take the squared norm template void ParameterStorage::squared_l2norm_dev(MyDevice & dev, float* sqnorm) const { - Tensor sqnorm_t({1}, sqnorm, &dev); + Tensor sqnorm_t({1}, sqnorm, &dev, DeviceMempool::NONE); sqnorm_t.t<0>().device(*dev.edevice) = values.tvec().square().sum(); } CNN_PARAMNORM_INST_DEV_IMPL(ParameterStorage, squared_l2norm, squared_l2norm_dev) @@ -243,7 +243,7 @@ CNN_PARAMNORM_INST_DEV_IMPL(ParameterStorage, squared_l2norm, squared_l2norm_dev // Take the squared norm of the gradient template void ParameterStorage::g_squared_l2norm_dev(MyDevice & dev, float* sqnorm) const { - Tensor sqnorm_t({1}, sqnorm, &dev); + Tensor sqnorm_t({1}, sqnorm, &dev, DeviceMempool::NONE); sqnorm_t.t<0>().device(*dev.edevice) = g.tvec().square().sum(); } CNN_PARAMNORM_INST_DEV_IMPL(ParameterStorage, g_squared_l2norm, g_squared_l2norm_dev) @@ -321,7 +321,7 @@ void LookupParameterStorage::initialize_dev(MyDevice & dev, unsigned index, cons template void LookupParameterStorage::squared_l2norm_dev(MyDevice & dev, float* sqnorm) const { - Tensor sqnorm_t({1}, sqnorm, &dev); + Tensor sqnorm_t({1}, sqnorm, &dev, DeviceMempool::NONE); sqnorm_t.t<0>().device(*dev.edevice) = values[0].tvec().square().sum(); for (unsigned i = 1; i < values.size(); ++i) sqnorm_t.t<0>().device(*dev.edevice) += values[i].tvec().square().sum(); @@ -330,7 +330,7 @@ CNN_PARAMNORM_INST_DEV_IMPL(LookupParameterStorage, squared_l2norm, squared_l2no template void LookupParameterStorage::g_squared_l2norm_dev(MyDevice & dev, float* sqnorm) const { - Tensor sqnorm_t({1}, sqnorm, &dev); + Tensor sqnorm_t({1}, sqnorm, &dev, DeviceMempool::NONE); auto it = non_zero_grads.begin(); assert(it != non_zero_grads.end()); sqnorm_t.t<0>().device(*dev.edevice) = grads[*(it++)].tvec().square().sum(); @@ -392,8 +392,8 @@ float Model::gradient_l2_norm_dev(MyDevice & dev) const { size_t pi; for(pi = 0; pi < all_params.size(); ++pi) all_params[pi]->g_squared_l2norm(&gradient_norm_scratch[pi]); - Tensor scratch_t({(unsigned int)all_params.size()}, gradient_norm_scratch, &dev); - Tensor sum_t({1}, gradient_norm_scratch+pi, &dev); + Tensor scratch_t({(unsigned int)all_params.size()}, gradient_norm_scratch, &dev, DeviceMempool::NONE); + Tensor sum_t({1}, gradient_norm_scratch+pi, &dev, DeviceMempool::NONE); sum_t.t<0>().device(*dev.edevice) = scratch_t.t<1>().sum().sqrt(); #ifdef __CUDACC__ float res = 0; diff --git a/cnn/nodes.cc b/cnn/nodes.cc index a809acc0a..4dba691f2 100644 --- a/cnn/nodes.cc +++ b/cnn/nodes.cc @@ -676,7 +676,7 @@ CNN_NODE_INST_DEV_IMPL(DotProduct) template void Dropout::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - Tensor m(dim, (float*)aux_mem, fx.device); + Tensor m(dim, (float*)aux_mem, fx.device, DeviceMempool::FXS); TensorTools::RandomBernoulli(m, (1.f-p), 1.f / (1.f-p)); fx.tvec().device(*dev.edevice) = xs[0]->tvec() * m.tvec(); } @@ -688,7 +688,7 @@ void Dropout::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - Tensor m(dim, (float*)aux_mem, fx.device); + Tensor m(dim, (float*)aux_mem, fx.device, DeviceMempool::FXS); dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * m.tvec(); } CNN_NODE_INST_DEV_IMPL(Dropout) @@ -727,7 +727,7 @@ CNN_NODE_INST_DEV_IMPL(Exp) template void GaussianNoise::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - Tensor m(dim, (float*)aux_mem, fx.device); + Tensor m(dim, (float*)aux_mem, fx.device, DeviceMempool::FXS); TensorTools::RandomizeNormal(0, stddev, m); fx.tvec().device(*dev.edevice) = xs[0]->tvec() + m.tvec(); } @@ -746,7 +746,7 @@ CNN_NODE_INST_DEV_IMPL(GaussianNoise) template void Hinge::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - Tensor eloss(xs[0]->d, static_cast(aux_mem), fx.device); + Tensor eloss(xs[0]->d, static_cast(aux_mem), fx.device, DeviceMempool::FXS); // TODO: Can we do this on device? if(pelement != nullptr) { const real mlystar = margin - TensorTools::AccessElement(*xs[0], *pelement); @@ -776,7 +776,7 @@ void Hinge::backward_dev_impl(const MyDevice & dev, if(pelement != nullptr) { if(as_scalar(fx)) { // there was some loss const float d = as_scalar(dEdf); - Tensor eloss(xs[0]->d, static_cast(aux_mem), fx.device); + Tensor eloss(xs[0]->d, static_cast(aux_mem), fx.device, DeviceMempool::FXS); // TODO: The > comparison should not be calculated twice. Keep it in auxiliary memory? dEdxi.tvec().device(*dev.edevice) += (eloss.tvec() > 0.f).cast() * d; #if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) @@ -788,7 +788,7 @@ void Hinge::backward_dev_impl(const MyDevice & dev, assert(pelements != nullptr); vector fx_vec = as_vector(fx); vector d_vec = as_vector(dEdf); - Tensor eloss(xs[0]->d, static_cast(aux_mem), fx.device); + Tensor eloss(xs[0]->d, static_cast(aux_mem), fx.device, DeviceMempool::FXS); for(size_t b = 0; b < fx.d.bd; b++) { if(fx_vec[b]) { // there was some loss // TODO: The > comparison should not be calculated twice. Keep it in auxiliary memory? @@ -972,8 +972,8 @@ void LogSoftmax::forward_dev_impl(const MyDevice & dev, const vectord.cols() != 1) throw std::runtime_error("LogSoftmax::forward not yet implemented for multiple columns"); - Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); - Tensor m(Dim({1},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device); + Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); + Tensor m(Dim({1},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device, DeviceMempool::FXS); logsumexp(dev, *xs[0], m, z); if(fx.d.bd == 1) { fx.t<1>().device(*dev.edevice) = xs[0]->t<1>() - as_scalar(z); @@ -992,7 +992,7 @@ void LogSoftmax::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { if (xs[0]->d.cols() != 1) throw std::runtime_error("LogSoftmax::backward not yet implemented for multiple columns"); - Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); + Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); if(fx.d.bd == 1) { z.t<0>().device(*dev.edevice) = fx.t<1>().binaryExpr(dEdf.t<1>(), FWeightedError()).sum(); Eigen::array bcast; bcast[0] = fx.d.rows(); @@ -1012,8 +1012,8 @@ void LogSumExp::forward_dev_impl(const MyDevice & dev, const vectorv; } else { - Tensor v(Dim({(unsigned int)xs.size()}), static_cast(aux_mem), fx.device); - Tensor m(Dim({1}), static_cast(aux_mem) + xs.size(), fx.device); + Tensor v(Dim({(unsigned int)xs.size()}), static_cast(aux_mem), fx.device, DeviceMempool::FXS); + Tensor m(Dim({1}), static_cast(aux_mem) + xs.size(), fx.device, DeviceMempool::FXS); for (unsigned i = 0; i < xs.size(); ++i) TensorTools::CopyElement(*xs[i], 0, v, i); logsumexp(dev, v, m, fx); @@ -1161,7 +1161,7 @@ CNN_NODE_INST_DEV_IMPL(MatrixMultiply) template void Max::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - Tensor t(fx.d, static_cast(aux_mem), fx.device); + Tensor t(fx.d, static_cast(aux_mem), fx.device, DeviceMempool::FXS); t.tvec().device(*dev.edevice) = (xs[0]->tvec() > xs[1]->tvec()).cast(); fx.tvec().device(*dev.edevice) = xs[0]->tvec().cwiseMax(xs[1]->tvec()); } @@ -1174,7 +1174,7 @@ void Max::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { assert(i < 2); - const Tensor t(dEdxi.d, static_cast(aux_mem), fx.device); + const Tensor t(dEdxi.d, static_cast(aux_mem), fx.device, DeviceMempool::FXS); if (i == 0) { dEdxi.tvec().device(*dev.edevice) += t.tvec() * dEdf.tvec(); } else { @@ -1254,7 +1254,7 @@ CNN_NODE_INST_DEV_IMPL(MaxPooling1D) template void Min::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - Tensor t(fx.d, static_cast(aux_mem), fx.device); + Tensor t(fx.d, static_cast(aux_mem), fx.device, DeviceMempool::FXS); t.tvec().device(*dev.edevice) = (xs[0]->tvec() < xs[1]->tvec()).cast(); fx.tvec().device(*dev.edevice) = xs[0]->tvec().cwiseMin(xs[1]->tvec()); } @@ -1267,7 +1267,7 @@ void Min::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { assert(i < 2); - const Tensor t(dEdxi.d, static_cast(aux_mem), fx.device); + const Tensor t(dEdxi.d, static_cast(aux_mem), fx.device, DeviceMempool::FXS); if (i == 0) { dEdxi.tvec().device(*dev.edevice) += t.tvec() * dEdf.tvec(); } else { @@ -1370,8 +1370,8 @@ CNN_NODE_INST_DEV_IMPL(PickElement) template void PickNegLogSoftmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() == 1) { - Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); - Tensor m(Dim({1},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device); + Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); + Tensor m(Dim({1},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device, DeviceMempool::FXS); logsumexp(dev, *xs[0], m, z); if(pval) { fx.t<0>().device(*dev.edevice) = z.t<0>() - xs[0]->t<1>().chip<0>(*pval); @@ -1396,7 +1396,7 @@ void PickNegLogSoftmax::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { if (xs[0]->d.cols() == 1) { - Tensor z(Dim({1},fx.d.batch_elems()), (float*)aux_mem, fx.device); + Tensor z(Dim({1},fx.d.batch_elems()), (float*)aux_mem, fx.device, DeviceMempool::FXS); if(pval) { const float err_val = as_scalar(dEdf); const float logz_val = as_scalar(z); @@ -1526,7 +1526,7 @@ void Reshape::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - const Tensor reshaped(dEdxi.d, dEdf.v, dEdxi.device); + const Tensor reshaped(dEdxi.d, dEdf.v, dEdxi.device, dEdf.mem_pool); dEdxi.tvec().device(*dev.edevice) += reshaped.tvec(); } CNN_NODE_INST_DEV_IMPL(Reshape) @@ -1620,8 +1620,8 @@ template void Softmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { if (xs[0]->d.cols() != 1) throw std::runtime_error("Softmax not yet implemented for multiple columns"); - Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); - Tensor m(Dim({1},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device); + Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); + Tensor m(Dim({1},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device, DeviceMempool::FXS); logsumexp(dev, *xs[0], m, z); if(fx.d.bd == 1) { fx.t<1>().device(*dev.edevice) = (xs[0]->t<1>() - as_scalar(z)).exp(); @@ -1638,7 +1638,7 @@ void Softmax::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device); + Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); if(fx.d.bd == 1) { // TODO: This requires no transfer between host/device, but is not working? // z.t<0>().device(*dev.edevice) = (fx.t<1>() * dEdf.t<1>()).sum(); @@ -1759,7 +1759,7 @@ void SparsemaxLoss::forward_dev_impl(const MyDevice & dev, const vectord, (float*)aux_mem, xs[0]->device); + Tensor tsm(xs[0]->d, (float*)aux_mem, xs[0]->device, DeviceMempool::FXS); tsm.t<1>() = (xs[0]->t<1>() - tau).cwiseMax(0.f); fx.t<0>() = ( (tsm.t<1>() != 0.f).cast() * (xs[0]->t<1>().square() - (tau * tau)) ).sum(); fx.t<0>() = ( fx.t<0>() + qprop * qprop * qsupport_size ) / 2.f; @@ -1785,7 +1785,7 @@ void SparsemaxLoss::backward_dev_impl(const MyDevice & dev, const float d = dEdf.v[0]; float* psm = static_cast(aux_mem); float dqprop = d / pq->size(); - Tensor tsm(xs[0]->d, psm, xs[0]->device); + Tensor tsm(xs[0]->d, psm, xs[0]->device, DeviceMempool::FXS); auto sm = *tsm; // sparsemax(z) *dEdxi += sm * d; for (unsigned i = 0; i < pq->size(); ++i) diff --git a/cnn/tensor.h b/cnn/tensor.h index d2011e5a5..7d41a9c6b 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -15,6 +15,7 @@ #include "cnn/cuda.h" #endif #include +#include // Following line is commented out because it causes errors with large nets (Antonis) //#define EIGEN_NO_MALLOC @@ -30,7 +31,7 @@ typedef float real; struct Tensor { Tensor() = default; - Tensor(const Dim& d, float* v, Device* dev) : d(d), v(v), device(dev) {} + Tensor(const Dim& d, float* v, Device* dev, DeviceMempool mem) : d(d), v(v), device(dev), mem_pool(mem) {} // Get the data as a matrix const Eigen::Map operator*() const { assert(d.batch_elems() == 1); @@ -120,7 +121,7 @@ struct Tensor { assert(b < d.batch_elems()); const unsigned bsize = d.batch_size(); Dim new_d(d); new_d.bd = 1; - Tensor ret(new_d, v + bsize * b, device); + Tensor ret(new_d, v + bsize * b, device, mem_pool); // std::cerr << "Getting tensor for batch " << (b % d.batch_elems()) << " bsize: " << bsize << ", ptr=" << (long)ret.v << std::endl; return ret; } @@ -135,7 +136,7 @@ struct Tensor { unsigned bsize = d.batch_size(); Dim new_d = d; new_d.bd = 1; for(unsigned b = 0; b < d.batch_elems(); ++b) - bs[b] = Tensor(new_d, v + bsize * b, device); + bs[b] = Tensor(new_d, v + bsize * b, device, mem_pool); return bs; } } @@ -144,34 +145,54 @@ struct Tensor { float* v; // pointer to memory std::vector bs; Device* device; + DeviceMempool mem_pool; private: friend class boost::serialization::access; template - void save(Archive& ar, const unsigned int) const { + void save(Archive& ar, const unsigned int ver) const { ar & d; - // TODO(mem) save device -#if HAVE_CUDA - float* vc = (float*)malloc(d.size() * sizeof(float)); - CUDA_CHECK(cudaMemcpy(vc, v, d.size() * sizeof(float), cudaMemcpyDeviceToHost)); - ar & boost::serialization::make_array(vc, d.size()); - free(vc); + ar & ((device == default_device) ? (int)-1 : device->device_id); + ar & mem_pool; +#ifdef HAVE_CUDA + if(device->type == DeviceType::GPU) { + float* vc = static_cast(std::malloc(d.size() * sizeof(float))); + CUDA_CHECK(cudaMemcpyAsync(vc, v, d.size() * sizeof(float), cudaMemcpyDeviceToHost)); + ar & boost::serialization::make_array(vc, mem.size()); + free(vc); + } else { + ar & boost::serialization::make_array(v, d.size()); + } #else ar & boost::serialization::make_array(v, d.size()); #endif } template - void load(Archive& ar, const unsigned int) { + void load(Archive& ar, const unsigned int ver) { ar & d; - // TODO(mem) - load device and use it to create memory allocator - // Devices should probably know how to load and save data to disk -#if HAVE_CUDA - CUDA_CHECK(cudaMalloc(&v, d.size() * sizeof(float))); - float* vc = static_cast(std::malloc(d.size() * sizeof(float))); - ar & boost::serialization::make_array(vc, d.size()); - CUDA_CHECK(cudaMemcpyAsync(v, vc, d.size() * sizeof(float), cudaMemcpyHostToDevice)); + int dev_id = -1; + mem_pool = DeviceMempool::PS; + if(ver > 0) { + ar & dev_id; + ar & mem_pool; + } + if(dev_id == -1) { + device = default_device; + } else { + assert(dev_id > 0 && dev_id < (int)devices.size()); + device = devices[dev_id]; + } + device->allocate_tensor(mem_pool, *this); +#ifdef HAVE_CUDA + if(device->type == DeviceType::GPU) { + float* vc = static_cast(std::malloc(d.size() * sizeof(float))); + ar & boost::serialization::make_array(vc, d.size()); + CUDA_CHECK(cudaMemcpyAsync(v, vc, d.size() * sizeof(float), cudaMemcpyHostToDevice)); + free(vc); + } else { + ar & boost::serialization::make_array(v, d.size()); + } #else - v = static_cast(_mm_malloc(d.size() * sizeof(float), 32)); ar & boost::serialization::make_array(v, d.size()); #endif } @@ -313,4 +334,6 @@ real rand_normal(); } // namespace cnn +BOOST_CLASS_VERSION(cnn::Tensor, 1) + #endif From 879c116b4c34d803adaba3477bca2a7c094a9695 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 20 Jul 2016 13:17:54 +0900 Subject: [PATCH 613/965] Fixed compile errors on GPU --- cnn/tensor.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cnn/tensor.h b/cnn/tensor.h index 7d41a9c6b..214199db7 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -152,13 +152,14 @@ struct Tensor { template void save(Archive& ar, const unsigned int ver) const { ar & d; - ar & ((device == default_device) ? (int)-1 : device->device_id); + int dev_id = ((device == default_device) ? (int)-1 : device->device_id); + ar & dev_id; ar & mem_pool; #ifdef HAVE_CUDA if(device->type == DeviceType::GPU) { float* vc = static_cast(std::malloc(d.size() * sizeof(float))); CUDA_CHECK(cudaMemcpyAsync(vc, v, d.size() * sizeof(float), cudaMemcpyDeviceToHost)); - ar & boost::serialization::make_array(vc, mem.size()); + ar & boost::serialization::make_array(vc, d.size()); free(vc); } else { ar & boost::serialization::make_array(v, d.size()); From 5af4b0b190209c2d39e8a8d292a6a7d1a6128b6d Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 20 Jul 2016 15:16:48 +0900 Subject: [PATCH 614/965] Fixed some bugs on GPU --- cnn/devices.cc | 1 + cnn/model.cc | 8 ++++---- cnn/tensor.h | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/cnn/devices.cc b/cnn/devices.cc index eafbe57f6..145549930 100644 --- a/cnn/devices.cc +++ b/cnn/devices.cc @@ -30,6 +30,7 @@ void Device::revert(DeviceMemCheckpoint cp) { void Device::allocate_tensor(DeviceMempool mp, Tensor & tens) { assert(mp != DeviceMempool::NONE); + assert(pools[(int)mp] != nullptr); tens.v = (float*)pools[(int)mp]->allocate(tens.d.size()); tens.mem_pool = mp; } diff --git a/cnn/model.cc b/cnn/model.cc index 6a5234d3b..4b1deec41 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -53,15 +53,15 @@ ParameterStorageBase::~ParameterStorageBase() {} ParameterStorage::ParameterStorage(const Dim& d, float scale) : dim(d) { values.d = g.d = d; - values.v = static_cast(default_device->pools[(int)DeviceMempool::PS]->allocate(d.size() * sizeof(float))); values.device = g.device = default_device; + default_device->allocate_tensor(DeviceMempool::PS, values); if (scale) { TensorTools::Randomize(values, scale); } else { TensorTools::Randomize(values); } - g.v = static_cast(default_device->pools[(int)DeviceMempool::PS]->allocate(d.size() * sizeof(float))); + default_device->allocate_tensor(DeviceMempool::PS, g); TensorTools::Zero(g); } @@ -85,14 +85,14 @@ LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d for (unsigned i = 0; i < n; ++i) { auto& v = values[i]; v.d = d; - v.v = static_cast(default_device->pools[(int)DeviceMempool::PS]->allocate(d.size() * sizeof(float))); v.device = default_device; + default_device->allocate_tensor(DeviceMempool::PS, v); TensorTools::Randomize(v); auto& g = grads[i]; g.d = d; - g.v = static_cast(default_device->pools[(int)DeviceMempool::PS]->allocate(d.size() * sizeof(float))); g.device = default_device; + default_device->allocate_tensor(DeviceMempool::PS, g); TensorTools::Zero(g); } } diff --git a/cnn/tensor.h b/cnn/tensor.h index 214199db7..c6a6d1427 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -30,7 +30,7 @@ namespace cnn { typedef float real; struct Tensor { - Tensor() = default; + Tensor() : d(Dim()), v(nullptr), device(nullptr), mem_pool(DeviceMempool::NONE) { } Tensor(const Dim& d, float* v, Device* dev, DeviceMempool mem) : d(d), v(v), device(dev), mem_pool(mem) {} // Get the data as a matrix const Eigen::Map operator*() const { From a7f8482feba1eead8418a24536d380748da5a000 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 21 Jul 2016 00:23:48 +0900 Subject: [PATCH 615/965] Fixed bug forgetting to multiply by float size --- cnn/devices.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/devices.cc b/cnn/devices.cc index 145549930..4822d07af 100644 --- a/cnn/devices.cc +++ b/cnn/devices.cc @@ -31,7 +31,7 @@ void Device::revert(DeviceMemCheckpoint cp) { void Device::allocate_tensor(DeviceMempool mp, Tensor & tens) { assert(mp != DeviceMempool::NONE); assert(pools[(int)mp] != nullptr); - tens.v = (float*)pools[(int)mp]->allocate(tens.d.size()); + tens.v = (float*)pools[(int)mp]->allocate(tens.d.size() * sizeof(float)); tens.mem_pool = mp; } From c03faf18de8d4beab53b6766d0e4dc66cf6735ed Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 21 Jul 2016 01:42:50 +0900 Subject: [PATCH 616/965] Remove separate malloc for shadow params --- cnn/shadow-params.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/shadow-params.cc b/cnn/shadow-params.cc index b1c0028e2..b65330aba 100644 --- a/cnn/shadow-params.cc +++ b/cnn/shadow-params.cc @@ -9,7 +9,7 @@ using namespace std; namespace cnn { ShadowParameters::ShadowParameters(const ParameterStorage& p) : h(p.values) { - h.v = (float*)default_device->mem->malloc(h.d.size() * sizeof(float)); + default_device->allocate_tensor(DeviceMempool::PS, h); TensorTools::Zero(h); } @@ -19,7 +19,7 @@ ShadowParameters::~ShadowParameters() { ShadowLookupParameters::ShadowLookupParameters(const LookupParameterStorage& lp) : h(lp.values) { for (auto& t : h) { - t.v = (float*)default_device->mem->malloc(t.d.size() * sizeof(float)); + default_device->allocate_tensor(DeviceMempool::PS, t); TensorTools::Zero(t); } } From cc089c634c0e15e1f9e57f11400982180dd922d1 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 21 Jul 2016 10:59:46 +0900 Subject: [PATCH 617/965] Added some comments and fixed error freeing shadow parameters --- cnn/cnn.h | 5 ----- cnn/devices.h | 8 +++++++- cnn/model.cc | 3 +++ cnn/shadow-params.cc | 9 --------- cnn/shadow-params.h | 2 -- cnn/tensor.h | 2 ++ 6 files changed, 12 insertions(+), 17 deletions(-) diff --git a/cnn/cnn.h b/cnn/cnn.h index f2e192387..5e32cfbd1 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -48,11 +48,6 @@ namespace expr { struct Expression; } BOOST_STRONG_TYPEDEF(unsigned, VariableIndex) -struct DeviceMemCheckpoint { - std::vector used; - DeviceMemCheckpoint() : used(3) { } -}; - struct CGCheckpoint { int node_idx; int par_node_idx; diff --git a/cnn/devices.h b/cnn/devices.h index 0d32ad4a7..8755027e5 100644 --- a/cnn/devices.h +++ b/cnn/devices.h @@ -17,9 +17,15 @@ enum class DeviceType {CPU, GPU}; enum class DeviceMempool {FXS = 0, DEDFS = 1, PS = 2, NONE = 3}; struct ComputationGraph; // TODO is there a nicer way to resolve this cyclic dependency? -struct DeviceMemCheckpoint; struct Tensor; +struct DeviceMemCheckpoint { + std::vector used; + // The three devices are those defined in DeviceMempool + DeviceMemCheckpoint() : used(3) { } +}; + + class Device { protected: Device(int i, DeviceType t, MemAllocator* m) : device_id(i), type(t), mem(m), pools(3, nullptr) {} diff --git a/cnn/model.cc b/cnn/model.cc index 4b1deec41..ef3ceeac8 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -232,6 +232,9 @@ void load_cnn_model(std::string filename, Model* model) { // function, but it's not clear how to handle heterogeneous functions w/ // macros +// Note: Using DeviceMempool::NONE here because these tensors are not persistent +// and won't be saved so it doesn't matter which mempool they belong to. + // Take the squared norm template void ParameterStorage::squared_l2norm_dev(MyDevice & dev, float* sqnorm) const { diff --git a/cnn/shadow-params.cc b/cnn/shadow-params.cc index b65330aba..6c5815ac2 100644 --- a/cnn/shadow-params.cc +++ b/cnn/shadow-params.cc @@ -13,10 +13,6 @@ ShadowParameters::ShadowParameters(const ParameterStorage& p) : h(p.values) { TensorTools::Zero(h); } -ShadowParameters::~ShadowParameters() { - default_device->mem->free(h.v); -} - ShadowLookupParameters::ShadowLookupParameters(const LookupParameterStorage& lp) : h(lp.values) { for (auto& t : h) { default_device->allocate_tensor(DeviceMempool::PS, t); @@ -24,11 +20,6 @@ ShadowLookupParameters::ShadowLookupParameters(const LookupParameterStorage& lp) } } -ShadowLookupParameters::~ShadowLookupParameters() { - for (auto& t : h) - default_device->mem->free(t.v); -} - vector AllocateShadowParameters(const Model& m) { vector v; v.reserve(m.parameters_list().size()); diff --git a/cnn/shadow-params.h b/cnn/shadow-params.h index ecf92d887..11ad23b65 100644 --- a/cnn/shadow-params.h +++ b/cnn/shadow-params.h @@ -16,13 +16,11 @@ struct LookupParameterStorage; struct ShadowParameters { explicit ShadowParameters(const ParameterStorage& p); - ~ShadowParameters(); Tensor h; }; struct ShadowLookupParameters { explicit ShadowLookupParameters(const LookupParameterStorage& lp); - ~ShadowLookupParameters(); std::vector h; }; diff --git a/cnn/tensor.h b/cnn/tensor.h index c6a6d1427..dfb52e912 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -172,6 +172,8 @@ struct Tensor { void load(Archive& ar, const unsigned int ver) { ar & d; int dev_id = -1; + // This default value is for backward compatibility with models that were + // saved without information about what mempool a tensor belongs to. mem_pool = DeviceMempool::PS; if(ver > 0) { ar & dev_id; From 8cbcfbcb74445dcd51e5ca44f4e4c1bb89c85ebe Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 21 Jul 2016 18:10:26 +0900 Subject: [PATCH 618/965] Allocate different amounts of memory --- cnn/aligned-mem-pool.h | 2 +- cnn/cnn.h | 2 +- cnn/cuda.cc | 7 ++--- cnn/devices.cc | 69 ++++++++++++++++++++++++++++-------------- cnn/devices.h | 18 ++++++----- cnn/init.cc | 9 +++--- 6 files changed, 65 insertions(+), 42 deletions(-) diff --git a/cnn/aligned-mem-pool.h b/cnn/aligned-mem-pool.h index 4174c6933..fad285742 100644 --- a/cnn/aligned-mem-pool.h +++ b/cnn/aligned-mem-pool.h @@ -16,7 +16,7 @@ class AlignedMemoryPool { void* allocate(size_t n) { auto rounded_n = a->round_up_align(n); if (rounded_n + used > capacity) { - std::cerr << "cnn is out of memory, try increasing with --cnn-mem\n"; + std::cerr << "cnn is out of memory, try increasing with --cnn-mem (current capacity: " << capacity << ")\n"; abort(); } void* res = static_cast(mem) + used; diff --git a/cnn/cnn.h b/cnn/cnn.h index 5e32cfbd1..340875e19 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -51,7 +51,7 @@ BOOST_STRONG_TYPEDEF(unsigned, VariableIndex) struct CGCheckpoint { int node_idx; int par_node_idx; - DeviceMemCheckpoint device_mem_checkpoint; + DeviceMempoolSizes device_mem_checkpoint; }; inline void swap(VariableIndex& i1, VariableIndex& i2) { diff --git a/cnn/cuda.cc b/cnn/cuda.cc index aa7621575..96aacd086 100644 --- a/cnn/cuda.cc +++ b/cnn/cuda.cc @@ -31,7 +31,7 @@ vector Initialize_GPU(int& argc, char**& argv) { int requested_gpus = -1; vector gpu_mask(MAX_GPUS,0); int argi = 1; - int num_mb = 512; + string mem_descriptor = "512"; bool ngpus_requested = false; bool ids_requested = false; for( ;argi < argc; ++argi) { @@ -41,8 +41,7 @@ vector Initialize_GPU(int& argc, char**& argv) { cerr << "[cnn] --cnn-mem expects an argument (the memory, in megabytes, to reserve)\n"; abort(); } else { - string a2 = argv[argi+1]; - istringstream c(a2); c >> num_mb; + mem_descriptor = argv[argi+1]; RemoveArgs(argc, argv, argi, 2); } } else if (arg == "--cnn_gpus" || arg == "--cnn-gpus") { @@ -148,7 +147,7 @@ vector Initialize_GPU(int& argc, char**& argv) { cerr << "[cnn] Device(s) selected:"; for (int i = 0; i < requested_gpus; ++i) { cerr << ' ' << gpus[i]; - Device* d = new Device_GPU(gpudevices.size(), num_mb, gpus[i]); + Device* d = new Device_GPU(gpudevices.size(), mem_descriptor, gpus[i]); gpudevices.push_back(d); } cerr << endl; diff --git a/cnn/devices.cc b/cnn/devices.cc index 4822d07af..bfb51af02 100644 --- a/cnn/devices.cc +++ b/cnn/devices.cc @@ -1,5 +1,6 @@ #include "cnn/devices.h" +#include #include #include @@ -10,22 +11,51 @@ using namespace std; namespace cnn { +DeviceMempoolSizes::DeviceMempoolSizes(size_t total_size) { + used[0] = total_size/3; + used[1] = total_size/3; + used[2] = total_size/3; +} + +DeviceMempoolSizes::DeviceMempoolSizes(size_t fx_s, size_t dEdfs_s, size_t ps_s) { + used[0] = fx_s; + used[1] = dEdfs_s; + used[2] = ps_s; +} + +DeviceMempoolSizes::DeviceMempoolSizes(const std::string & descriptor) { + vector strs; + boost::algorithm::split(strs, descriptor, boost::is_any_of(",")); + if(strs.size() == 1) { + size_t total_size = stoi(strs[0]); + used[0] = total_size/3; + used[1] = total_size/3; + used[2] = total_size/3; + } else if(strs.size() == 3) { + used[0] = stoi(strs[0]); + used[1] = stoi(strs[1]); + used[2] = stoi(strs[2]); + } + cerr << "used[0] == " << used[0] << endl; + cerr << "used[1] == " << used[1] << endl; + cerr << "used[2] == " << used[2] << endl; +} + Device::~Device() {} -DeviceMemCheckpoint Device::mark(ComputationGraph *cg) { +DeviceMempoolSizes Device::mark(ComputationGraph *cg) { cg->incremental_forward(); // needed so that we actually allocate the needed memory // for all existing nodes. - DeviceMemCheckpoint cp; - for(size_t i = 0; i < 3; ++i) - cp.used[i] = pools[i]->used; - return cp; + return DeviceMempoolSizes(pools[0]->used, pools[1]->used, pools[2]->used); } -void Device::revert(DeviceMemCheckpoint cp) { - for(size_t i = 0; i < 3; ++i) { - assert(cp.used[i] <= pools[i]->used); - pools[i]->used = cp.used[i]; - } +void Device::revert(const DeviceMempoolSizes & cp) { + assert(cp.used[0] <= pools[0]->used); + pools[0]->used = cp.used[0]; + assert(cp.used[1] <= pools[1]->used); + pools[1]->used = cp.used[1]; + assert(cp.used[2] <= pools[2]->used); + pools[2]->used = cp.used[2]; } void Device::allocate_tensor(DeviceMempool mp, Tensor & tens) { @@ -36,7 +66,7 @@ void Device::allocate_tensor(DeviceMempool mp, Tensor & tens) { } #if HAVE_CUDA -Device_GPU::Device_GPU(int my_id, int mb, int device_id) : +Device_GPU::Device_GPU(int my_id, const DeviceMempoolSizes & mbs, int device_id) : Device(my_id, DeviceType::GPU, &gpu_mem), cuda_device_id(device_id), gpu_mem(device_id) { CUDA_CHECK(cudaSetDevice(device_id)); CUBLAS_CHECK(cublasCreate(&cublas_handle)); @@ -55,21 +85,15 @@ Device_GPU::Device_GPU(int my_id, int mb, int device_id) : estream = new Eigen::CudaStreamDevice(device_id); edevice = new Eigen::GpuDevice(estream); - // this is the big memory allocation. Do it in stages to make sure things are aligned. - size_t byte_count = (size_t)((mb << 10)/3) << 10; + // this is the big memory allocation. for(size_t i = 0; i < 3; ++i) - pools[i] = new AlignedMemoryPool(byte_count, mem); + pools[i] = new AlignedMemoryPool((mbs.used[i] << 20), &gpu_mem); } Device_GPU::~Device_GPU() {} #endif -// TODO we should be able to configure this carefully with a configuration -// script -// CPU -- 0 params -// -- 50mb fxs -// -- 50mb dEdfx -Device_CPU::Device_CPU(int my_id, int mb, bool shared) : +Device_CPU::Device_CPU(int my_id, const DeviceMempoolSizes & mbs, bool shared) : Device(my_id, DeviceType::CPU, &cpu_mem), shmem(mem) { if (shared) shmem = new SharedAllocator(); kSCALAR_MINUSONE = (float*) mem->malloc(sizeof(float)); @@ -82,10 +106,9 @@ Device_CPU::Device_CPU(int my_id, int mb, bool shared) : // Initialize the Eigen device edevice = new Eigen::DefaultDevice; - // this is the big memory allocation. Do it in stages to make sure things are aligned. - size_t byte_count = (size_t)((mb << 10)/3) << 10; + // this is the big memory allocation. for(size_t i = 0; i < 3; ++i) - pools[i] = new AlignedMemoryPool(byte_count, mem); + pools[i] = new AlignedMemoryPool((mbs.used[i] << 20), &cpu_mem); } Device_CPU::~Device_CPU() {} diff --git a/cnn/devices.h b/cnn/devices.h index 8755027e5..9a48fcecf 100644 --- a/cnn/devices.h +++ b/cnn/devices.h @@ -19,10 +19,12 @@ enum class DeviceMempool {FXS = 0, DEDFS = 1, PS = 2, NONE = 3}; struct ComputationGraph; // TODO is there a nicer way to resolve this cyclic dependency? struct Tensor; -struct DeviceMemCheckpoint { - std::vector used; - // The three devices are those defined in DeviceMempool - DeviceMemCheckpoint() : used(3) { } +struct DeviceMempoolSizes { + size_t used[3]; + DeviceMempoolSizes() = default; + DeviceMempoolSizes(size_t total_s); + DeviceMempoolSizes(size_t fxs_s, size_t dEdfs_s, size_t ps_s); + DeviceMempoolSizes(const std::string & descriptor); }; @@ -40,8 +42,8 @@ class Device { float* kSCALAR_ONE; float* kSCALAR_ZERO; std::string name; - virtual DeviceMemCheckpoint mark(ComputationGraph *cg); - virtual void revert(DeviceMemCheckpoint cp); + virtual DeviceMempoolSizes mark(ComputationGraph *cg); + virtual void revert(const DeviceMempoolSizes & cp); void allocate_tensor(DeviceMempool mem_pool, Tensor & tensor); std::vector pools; }; @@ -50,7 +52,7 @@ class Device { class Device_GPU : public Device { public: typedef Eigen::CudaStreamDevice EigenDevice; - explicit Device_GPU(int my_id, int mb, int device_id); + explicit Device_GPU(int my_id, const DeviceMempoolSizes & mb, int device_id); ~Device_GPU(); int cuda_device_id; cublasHandle_t cublas_handle; @@ -63,7 +65,7 @@ class Device_GPU : public Device { class Device_CPU : public Device { public: typedef Eigen::DefaultDevice EigenDevice; - explicit Device_CPU(int my_id, int mb, bool shared); + explicit Device_CPU(int my_id, const DeviceMempoolSizes & mb, bool shared); ~Device_CPU(); CPUAllocator cpu_mem; Eigen::DefaultDevice* edevice; diff --git a/cnn/init.cc b/cnn/init.cc index f1094cc17..45c38a810 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -33,9 +33,9 @@ void Initialize(int& argc, char**& argv, bool shared_parameters) { cerr << "[cnn] initializing CUDA\n"; gpudevices = Initialize_GPU(argc, argv); #endif - unsigned long num_mb = 512UL; unsigned random_seed = 0; int argi = 1; + string mem_descriptor = "512"; while(argi < argc) { string arg = argv[argi]; if (arg == "--cnn-mem" || arg == "--cnn_mem") { @@ -43,8 +43,7 @@ void Initialize(int& argc, char**& argv, bool shared_parameters) { cerr << "[cnn] --cnn-mem expects an argument (the memory, in megabytes, to reserve)\n"; abort(); } else { - string a2 = argv[argi+1]; - istringstream c(a2); c >> num_mb; + mem_descriptor = argv[argi+1]; RemoveArgs(argc, argv, argi, 2); } } else if (arg == "--cnn-l2" || arg == "--cnn_l2") { @@ -83,8 +82,8 @@ void Initialize(int& argc, char**& argv, bool shared_parameters) { cerr << "[cnn] random seed: " << random_seed << endl; rndeng = new mt19937(random_seed); - cerr << "[cnn] allocating memory: " << num_mb << "MB\n"; - devices.push_back(new Device_CPU(devices.size(), num_mb, shared_parameters)); + cerr << "[cnn] allocating memory: " << mem_descriptor << "MB\n"; + devices.push_back(new Device_CPU(devices.size(), mem_descriptor, shared_parameters)); int default_index = 0; if (gpudevices.size() > 0) { for (auto gpu : gpudevices) From cd9caa6316ebaecccdde85c2dc03a402ee474949 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 21 Jul 2016 19:00:32 +0900 Subject: [PATCH 619/965] Removed rougue debugging message --- cnn/devices.cc | 3 --- 1 file changed, 3 deletions(-) diff --git a/cnn/devices.cc b/cnn/devices.cc index bfb51af02..2cbc5603a 100644 --- a/cnn/devices.cc +++ b/cnn/devices.cc @@ -36,9 +36,6 @@ DeviceMempoolSizes::DeviceMempoolSizes(const std::string & descriptor) { used[1] = stoi(strs[1]); used[2] = stoi(strs[2]); } - cerr << "used[0] == " << used[0] << endl; - cerr << "used[1] == " << used[1] << endl; - cerr << "used[2] == " << used[2] << endl; } Device::~Device() {} From fd8995a8f0cd5a4ad8b47534026828295a53139f Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 21 Jul 2016 21:30:37 +0900 Subject: [PATCH 620/965] Lazy allocation of parameter gradients --- cnn/model.cc | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/cnn/model.cc b/cnn/model.cc index ef3ceeac8..6be531035 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -57,12 +57,9 @@ ParameterStorage::ParameterStorage(const Dim& d, float scale) : dim(d) { default_device->allocate_tensor(DeviceMempool::PS, values); if (scale) { TensorTools::Randomize(values, scale); - } - else { + } else { TensorTools::Randomize(values); } - default_device->allocate_tensor(DeviceMempool::PS, g); - TensorTools::Zero(g); } size_t ParameterStorage::size() const { return dim.size(); } @@ -92,8 +89,6 @@ LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d auto& g = grads[i]; g.d = d; g.device = default_device; - default_device->allocate_tensor(DeviceMempool::PS, g); - TensorTools::Zero(g); } } @@ -246,6 +241,7 @@ CNN_PARAMNORM_INST_DEV_IMPL(ParameterStorage, squared_l2norm, squared_l2norm_dev // Take the squared norm of the gradient template void ParameterStorage::g_squared_l2norm_dev(MyDevice & dev, float* sqnorm) const { + assert(g.v != nullptr); Tensor sqnorm_t({1}, sqnorm, &dev, DeviceMempool::NONE); sqnorm_t.t<0>().device(*dev.edevice) = g.tvec().square().sum(); } @@ -253,6 +249,10 @@ CNN_PARAMNORM_INST_DEV_IMPL(ParameterStorage, g_squared_l2norm, g_squared_l2norm template void ParameterStorage::accumulate_grad_dev(MyDevice & dev, const Tensor& d) { + if(g.v == nullptr) { + default_device->allocate_tensor(DeviceMempool::PS, g); + TensorTools::Zero(g); + } g.tvec().device(*dev.edevice) += d.tvec(); } #ifdef __CUDACC__ @@ -344,6 +344,10 @@ CNN_PARAMNORM_INST_DEV_IMPL(LookupParameterStorage, g_squared_l2norm, g_squared_ template void LookupParameterStorage::accumulate_grad_dev(MyDevice & dev, unsigned index, const Tensor& d) { + if(grads[index].v == nullptr) { + default_device->allocate_tensor(DeviceMempool::PS, grads[index]); + TensorTools::Zero(grads[index]); + } non_zero_grads.insert(index); grads[index].tvec().device(*dev.edevice) += d.tvec(); } From 10e75be2c04278c3e66d0630f2205313da6908c9 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 21 Jul 2016 22:34:19 +0900 Subject: [PATCH 621/965] More comprehensive lazy grad allocation --- cnn/grad-check.cc | 1 + cnn/model.cc | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc index cf74d2b12..9dc4ff501 100644 --- a/cnn/grad-check.cc +++ b/cnn/grad-check.cc @@ -31,6 +31,7 @@ bool CheckGrad(Model& m, ComputationGraph& g, int verbosity) { if(verbosity > 1) cerr << endl << "PARAMETERS " << pp << endl; ParameterStorage& p = *pp; + if(p.g.v == nullptr) continue; size_t ts = p.dim.size(); for (size_t i = 0; i < ts; ++i) { float old = TensorTools::AccessElement(p.values, i); diff --git a/cnn/model.cc b/cnn/model.cc index 6be531035..df171359a 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -75,7 +75,8 @@ void ParameterStorage::copy(const ParameterStorage & param) { } void ParameterStorage::clear() { - TensorTools::Zero(g); + if(g.v != nullptr) + TensorTools::Zero(g); } LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d), values(n), grads(n) { From f46b39cf1c3ee5e95a112467c3e083cb024a312e Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 21 Jul 2016 22:39:16 +0900 Subject: [PATCH 622/965] Updated description of memory in the README --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 413804e2e..4ff82c07b 100644 --- a/README.md +++ b/README.md @@ -74,8 +74,11 @@ very beginning of the command line, before other options. * `--cnn-mem NUMBER`: cnn runs by default with 512MB of memory each for the forward and backward steps, as well as parameter storage. You will often want to increase this amount. - By setting NUMBER here, cnn will allocate more memory. Note that it will allocate 3 times - more memory than the number specified here, so if you want to use 3GB, specify "1024". + By setting NUMBER here, cnn will allocate more memory. Note that you can also individually + set the amount of memory for forward calculation, backward calculation, and parameters + by using comma separated variables `--cnn-mem FOR,BACK,PARAM`. This is useful if, for + example, you are performing testing and don't need to allocate any memory for backward + calculation. * `--cnn-l2 NUMBER`: Specifies the level of l2 regularization to use (default 1e-6). * `--cnn-gpus NUMBER`: Specify how many GPUs you want to use, if cnn is compiled with CUDA. Currently, only one GPU is supported. From 2e78fc72c119e055f4ae5de9726bbbca589b7e6e Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 22 Jul 2016 18:01:44 +0900 Subject: [PATCH 623/965] Made lookupparameters contiguous --- cnn/model.cc | 59 ++++++++++++++++++++++++++++------------------------ cnn/model.h | 28 ++++++++++++++++++++----- 2 files changed, 55 insertions(+), 32 deletions(-) diff --git a/cnn/model.cc b/cnn/model.cc index df171359a..c819a386e 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -79,34 +79,25 @@ void ParameterStorage::clear() { TensorTools::Zero(g); } -LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d), values(n), grads(n) { - for (unsigned i = 0; i < n; ++i) { - auto& v = values[i]; - v.d = d; - v.device = default_device; - default_device->allocate_tensor(DeviceMempool::PS, v); - TensorTools::Randomize(v); - - auto& g = grads[i]; - g.d = d; - g.device = default_device; - } +LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d) { + all_dim = dim; all_dim.d[all_dim.nd++] = n; + all_grads.d = all_values.d = all_dim; + all_grads.device = all_values.device = default_device; + default_device->allocate_tensor(DeviceMempool::PS, all_values); + initialize_lookups(); } void LookupParameterStorage::zero() { - for (auto& p : values) - TensorTools::Zero(p); - clear(); + TensorTools::Zero(all_values); } size_t LookupParameterStorage::size() const { - return values.size() * dim.size(); + return all_dim.size(); } void LookupParameterStorage::copy(const LookupParameterStorage& param) { - assert(dim == param.dim); - for(size_t i = 0; i < param.values.size(); ++i) - TensorTools::CopyElements(values[i], param.values[i]); + assert(all_dim == param.all_dim); + TensorTools::CopyElements(all_values, param.all_values); } void LookupParameterStorage::clear() { @@ -326,9 +317,7 @@ void LookupParameterStorage::initialize_dev(MyDevice & dev, unsigned index, cons template void LookupParameterStorage::squared_l2norm_dev(MyDevice & dev, float* sqnorm) const { Tensor sqnorm_t({1}, sqnorm, &dev, DeviceMempool::NONE); - sqnorm_t.t<0>().device(*dev.edevice) = values[0].tvec().square().sum(); - for (unsigned i = 1; i < values.size(); ++i) - sqnorm_t.t<0>().device(*dev.edevice) += values[i].tvec().square().sum(); + sqnorm_t.t<0>().device(*dev.edevice) = all_values.tvec().square().sum(); } CNN_PARAMNORM_INST_DEV_IMPL(LookupParameterStorage, squared_l2norm, squared_l2norm_dev) @@ -343,11 +332,28 @@ void LookupParameterStorage::g_squared_l2norm_dev(MyDevice & dev, float* sqnorm) } CNN_PARAMNORM_INST_DEV_IMPL(LookupParameterStorage, g_squared_l2norm, g_squared_l2norm_dev) +void LookupParameterStorage::initialize_lookups() { + int num = all_dim[all_dim.nd-1]; + dim = all_dim; dim.nd--; + int dim_size = dim.size(); + if(values.size() == 0) { + values.resize(num); + for(int i = 0; i < num; ++i) + values[i] = Tensor(dim, all_values.v + i*dim_size, all_values.device, all_values.mem_pool); + } + if(grads.size() == 0 && all_grads.v != nullptr) { + grads.resize(num); + for(int i = 0; i < num; ++i) + grads[i] = Tensor(dim, all_grads.v + i*dim_size, all_grads.device, all_grads.mem_pool); + } +} + template void LookupParameterStorage::accumulate_grad_dev(MyDevice & dev, unsigned index, const Tensor& d) { - if(grads[index].v == nullptr) { - default_device->allocate_tensor(DeviceMempool::PS, grads[index]); - TensorTools::Zero(grads[index]); + if(all_grads.v == nullptr) { + default_device->allocate_tensor(DeviceMempool::PS, all_grads); + TensorTools::Zero(all_grads); + initialize_lookups(); } non_zero_grads.insert(index); grads[index].tvec().device(*dev.edevice) += d.tvec(); @@ -372,8 +378,7 @@ void LookupParameterStorage::accumulate_grad_dev(MyDevice & dev, unsigned index, template void LookupParameterStorage::scale_parameters_dev(MyDevice & dev, float a) { - for (auto& p : values) - p.tvec().device(*dev.edevice) = p.tvec() * a; + all_values.tvec().device(*dev.edevice) = all_values.tvec() * a; } #ifdef __CUDACC__ template void LookupParameterStorage::scale_parameters_dev(Device_GPU & dev, float a); diff --git a/cnn/model.h b/cnn/model.h index cf0ded0ff..df1df177c 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -98,6 +99,14 @@ struct LookupParameterStorage : public ParameterStorageBase { void accumulate_grad(unsigned index, const Tensor& g); void clear(); + // Initialize each individual lookup from the overall tensors + void initialize_lookups(); + + // Tensors for all dimensions at once + Dim all_dim; + Tensor all_values; + Tensor all_grads; + // Tensors for each individual lookup Dim dim; std::vector values; std::vector grads; @@ -108,12 +117,21 @@ struct LookupParameterStorage : public ParameterStorageBase { LookupParameterStorage(unsigned n, const Dim& d); friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - boost::serialization::base_object(*this); - ar & dim; - ar & values; - ar & grads; + void save(Archive& ar, const unsigned int) const { + ar << boost::serialization::base_object(*this); + ar << all_dim; + ar << all_values; + ar << all_grads; + } + template + void load(Archive& ar, const unsigned int) { + ar >> boost::serialization::base_object(*this); + ar >> all_dim; + ar >> all_values; + ar >> all_grads; + initialize_lookups(); } + BOOST_SERIALIZATION_SPLIT_MEMBER() }; class Model; From ae14cc685fa6b30ebc2f080bc9b5d1774fa98ce9 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 22 Jul 2016 20:13:42 +0900 Subject: [PATCH 624/965] Reverted some allocations stuff --- cnn/model.cc | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/cnn/model.cc b/cnn/model.cc index df171359a..91021bcfa 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -55,11 +55,13 @@ ParameterStorage::ParameterStorage(const Dim& d, float scale) : dim(d) { values.d = g.d = d; values.device = g.device = default_device; default_device->allocate_tensor(DeviceMempool::PS, values); + default_device->allocate_tensor(DeviceMempool::PS, g); if (scale) { TensorTools::Randomize(values, scale); } else { TensorTools::Randomize(values); } + TensorTools::Zero(g); } size_t ParameterStorage::size() const { return dim.size(); } @@ -90,6 +92,8 @@ LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d auto& g = grads[i]; g.d = d; g.device = default_device; + default_device->allocate_tensor(DeviceMempool::PS, g); + TensorTools::Zero(g); } } @@ -250,10 +254,6 @@ CNN_PARAMNORM_INST_DEV_IMPL(ParameterStorage, g_squared_l2norm, g_squared_l2norm template void ParameterStorage::accumulate_grad_dev(MyDevice & dev, const Tensor& d) { - if(g.v == nullptr) { - default_device->allocate_tensor(DeviceMempool::PS, g); - TensorTools::Zero(g); - } g.tvec().device(*dev.edevice) += d.tvec(); } #ifdef __CUDACC__ @@ -345,10 +345,6 @@ CNN_PARAMNORM_INST_DEV_IMPL(LookupParameterStorage, g_squared_l2norm, g_squared_ template void LookupParameterStorage::accumulate_grad_dev(MyDevice & dev, unsigned index, const Tensor& d) { - if(grads[index].v == nullptr) { - default_device->allocate_tensor(DeviceMempool::PS, grads[index]); - TensorTools::Zero(grads[index]); - } non_zero_grads.insert(index); grads[index].tvec().device(*dev.edevice) += d.tvec(); } From 2da5e7ab4911648145e8f9294fc77d048596f8a7 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 22 Jul 2016 20:21:47 +0900 Subject: [PATCH 625/965] Added a file to cmakelists --- cnn/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 9f09837f1..41b01b5b9 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -116,8 +116,8 @@ if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU") SET(CUDA_PROPAGATE_HOST_FLAGS OFF) - cuda_add_library(cnncuda STATIC gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu) - cuda_add_library(cnncuda_shared SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-param-nodes.cu gpu-training.cu) + cuda_add_library(cnncuda STATIC gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu) + cuda_add_library(cnncuda_shared SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu) endif(WITH_CUDA_BACKEND) install(FILES ${cnn_library_HDRS} DESTINATION include/cnn) From f0c94a71bcb557cdbfae788add650bd78bb01d0c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 22 Jul 2016 20:45:14 +0900 Subject: [PATCH 626/965] Compile intialization only on cpu --- cnn/model.cc | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/cnn/model.cc b/cnn/model.cc index b62ec10c3..48c0ba516 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -90,6 +90,22 @@ LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d initialize_lookups(); } +void LookupParameterStorage::initialize_lookups() { + int num = all_dim[all_dim.nd-1]; + dim = all_dim; dim.nd--; + int dim_size = dim.size(); + if(values.size() == 0) { + values.resize(num); + for(int i = 0; i < num; ++i) + values[i] = Tensor(dim, all_values.v + i*dim_size, all_values.device, all_values.mem_pool); + } + if(grads.size() == 0 && all_grads.v != nullptr) { + grads.resize(num); + for(int i = 0; i < num; ++i) + grads[i] = Tensor(dim, all_grads.v + i*dim_size, all_grads.device, all_grads.mem_pool); + } +} + void LookupParameterStorage::zero() { TensorTools::Zero(all_values); } @@ -331,22 +347,6 @@ void LookupParameterStorage::g_squared_l2norm_dev(MyDevice & dev, float* sqnorm) } CNN_PARAMNORM_INST_DEV_IMPL(LookupParameterStorage, g_squared_l2norm, g_squared_l2norm_dev) -void LookupParameterStorage::initialize_lookups() { - int num = all_dim[all_dim.nd-1]; - dim = all_dim; dim.nd--; - int dim_size = dim.size(); - if(values.size() == 0) { - values.resize(num); - for(int i = 0; i < num; ++i) - values[i] = Tensor(dim, all_values.v + i*dim_size, all_values.device, all_values.mem_pool); - } - if(grads.size() == 0 && all_grads.v != nullptr) { - grads.resize(num); - for(int i = 0; i < num; ++i) - grads[i] = Tensor(dim, all_grads.v + i*dim_size, all_grads.device, all_grads.mem_pool); - } -} - template void LookupParameterStorage::accumulate_grad_dev(MyDevice & dev, unsigned index, const Tensor& d) { non_zero_grads.insert(index); From 696d7efe9240d924ab6680d80fe794ee5a5d1ab0 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 23 Jul 2016 00:27:50 +0900 Subject: [PATCH 627/965] Updated README with link to mailing list --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4ff82c07b..6ddb93c4d 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ # cnn C++ neural network library -### Important: Eigen version requirement - -You need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function. **If you use any of the released versions, you may get assertion failures or compile errors.** +cnn is a neural network library that is written in C++ (with bindings in Python). It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. Read the instructions below to get started, and feel free to contact the [cnn-users group](https://groups.google.com/forum/#!forum/cnn-users) group or [github page](http://github.com/clab/cnn) with any questions, issues, or contributions. ### Building +Before compiling cnn, you need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function. **If you use any of the released versions, you may get assertion failures or compile errors.** + First you need to fetch the dependent libraries git submodule init From 7f82a1260471bc2ae6548321bf66b9f22538dd44 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 25 Jul 2016 10:23:34 +0900 Subject: [PATCH 628/965] Initial conversion of all functions to snake_case --- README.md | 2 +- cnn/cfsm-builder.cc | 8 +- cnn/cfsm-builder.h | 2 +- cnn/cnn.cc | 2 +- cnn/cnn.h | 2 +- cnn/cuda.cc | 10 +- cnn/cuda.h | 2 +- cnn/dict.cc | 8 +- cnn/dict.h | 22 ++--- cnn/grad-check.cc | 2 +- cnn/grad-check.h | 2 +- cnn/graph.cc | 2 +- cnn/graph.h | 2 +- cnn/hsm-builder.cc | 8 +- cnn/hsm-builder.h | 2 +- cnn/init.cc | 14 +-- cnn/init.h | 4 +- cnn/model.cc | 4 +- cnn/mp.cc | 16 ++-- cnn/mp.h | 66 ++++++------- cnn/param-nodes.cc | 10 +- cnn/pretrain.cc | 12 +-- cnn/pretrain.h | 4 +- cnn/saxe-init.cc | 2 +- cnn/saxe-init.h | 2 +- cnn/shadow-params.cc | 4 +- cnn/shadow-params.h | 4 +- cnn/training.cc | 44 ++++----- cnn/weight-decay.h | 14 +-- examples/embed-cl.cc | 18 ++-- examples/encdec.cc | 14 +-- examples/mlc.cc | 2 +- examples/nlm.cc | 4 +- examples/poisson-regression.cc | 16 ++-- examples/read-write.cc | 2 +- examples/rnnlm-aevb.cc | 14 +-- examples/rnnlm-batch.cc | 14 +-- examples/rnnlm-cfsm.cc | 14 +-- examples/rnnlm-givenbag.cc | 14 +-- examples/rnnlm-mp.cc | 6 +- examples/rnnlm.cc | 14 +-- examples/rnnlm.h | 6 +- examples/segrnn-sup.cc | 28 +++--- examples/skiprnnlm.cc | 10 +- examples/tag-bilstm.cc | 16 ++-- examples/textcat.cc | 14 +-- examples/tok-embed.cc | 8 +- examples/xor-batch-lookup.cc | 4 +- examples/xor-batch.cc | 2 +- examples/xor-xent.cc | 4 +- examples/xor.cc | 4 +- rnnlm/lm.cc | 20 ++-- tests/test-cnn.cc | 2 +- tests/test-nodes.cc | 162 ++++++++++++++++---------------- tests/test-trainers.cc | 4 +- tutorial/0_multiply.cc | 2 +- tutorial/1_linear_regression.cc | 2 +- 57 files changed, 348 insertions(+), 348 deletions(-) diff --git a/README.md b/README.md index 6ddb93c4d..41a64a435 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,7 @@ Expression y_pred = logistic(W*x); // to minimize the value of the final function in the computation graph. Expression l = binary_log_loss(y_pred, y); // We are now done setting up the graph, and we can print out its structure: -cg.PrintGraphviz(); +cg.print_graphviz(); // *** Now, we perform a parameter update for a single example. // Set the input/output to the values specified by the training data: diff --git a/cnn/cfsm-builder.cc b/cnn/cfsm-builder.cc index 94be56b62..513e3715a 100644 --- a/cnn/cfsm-builder.cc +++ b/cnn/cfsm-builder.cc @@ -59,7 +59,7 @@ ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, Dict* word_dict, Model* model) { - ReadClusterFile(cluster_file, word_dict); + read_cluster_file(cluster_file, word_dict); const unsigned num_clusters = cdict.size(); p_r2c = model->add_parameters({num_clusters, rep_dim}); p_cbias = model->add_parameters({num_clusters}); @@ -169,7 +169,7 @@ Expression ClassFactoredSoftmaxBuilder::full_log_distribution(const Expression& return log(softmax(concatenate(full_dist))); } -void ClassFactoredSoftmaxBuilder::ReadClusterFile(const std::string& cluster_file, Dict* word_dict) { +void ClassFactoredSoftmaxBuilder::read_cluster_file(const std::string& cluster_file, Dict* word_dict) { cerr << "Reading clusters from " << cluster_file << " ...\n"; ifstream in(cluster_file); assert(in); @@ -189,8 +189,8 @@ void ClassFactoredSoftmaxBuilder::ReadClusterFile(const std::string& cluster_fil assert(endc > startc); assert(startw > endc); assert(endw > startw); - unsigned c = cdict.Convert(line.substr(startc, endc - startc)); - unsigned word = word_dict->Convert(line.substr(startw, endw - startw)); + unsigned c = cdict.convert(line.substr(startc, endc - startc)); + unsigned word = word_dict->convert(line.substr(startw, endw - startw)); if (word >= widx2cidx.size()) { widx2cidx.resize(word + 1, -1); widx2cwidx.resize(word + 1); diff --git a/cnn/cfsm-builder.h b/cnn/cfsm-builder.h index 15317e5bf..e4beced5d 100644 --- a/cnn/cfsm-builder.h +++ b/cnn/cfsm-builder.h @@ -73,7 +73,7 @@ class ClassFactoredSoftmaxBuilder : public SoftmaxBuilder { private: ClassFactoredSoftmaxBuilder(); - void ReadClusterFile(const std::string& cluster_file, Dict* word_dict); + void read_cluster_file(const std::string& cluster_file, Dict* word_dict); Dict cdict; std::vector widx2cidx; // will be -1 if not present diff --git a/cnn/cnn.cc b/cnn/cnn.cc index ea96ab6a0..3850c68f1 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -253,7 +253,7 @@ void ComputationGraph::invalidate() { ee->invalidate(); } void ComputationGraph::backward() { ee->backward(); } void ComputationGraph::backward(VariableIndex i) { ee->backward(i); } -void ComputationGraph::PrintGraphviz() const { +void ComputationGraph::print_graphviz() const { cerr << "digraph G {\n rankdir=LR;\n nodesep=.05;\n"; unsigned nc = 0; for (auto node : nodes) { diff --git a/cnn/cnn.h b/cnn/cnn.h index 340875e19..fa9096a11 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -124,7 +124,7 @@ struct ComputationGraph { void backward(VariableIndex i); // debugging - void PrintGraphviz() const; + void print_graphviz() const; // data std::vector nodes; // **stored in topological order** diff --git a/cnn/cuda.cc b/cnn/cuda.cc index 96aacd086..a34670dec 100644 --- a/cnn/cuda.cc +++ b/cnn/cuda.cc @@ -9,7 +9,7 @@ using namespace std; namespace cnn { -static void RemoveArgs(int& argc, char**& argv, int& argi, int n) { +static void remove_args(int& argc, char**& argv, int& argi, int n) { for (int i = argi + n; i < argc; ++i) argv[i - n] = argv[i]; argc -= n; @@ -18,7 +18,7 @@ static void RemoveArgs(int& argc, char**& argv, int& argi, int n) { #define MAX_GPUS 256 -vector Initialize_GPU(int& argc, char**& argv) { +vector initialize_gpu(int& argc, char**& argv) { int nDevices; CUDA_CHECK(cudaGetDeviceCount(&nDevices)); if (nDevices < 1) { @@ -42,7 +42,7 @@ vector Initialize_GPU(int& argc, char**& argv) { abort(); } else { mem_descriptor = argv[argi+1]; - RemoveArgs(argc, argv, argi, 2); + remove_args(argc, argv, argi, 2); } } else if (arg == "--cnn_gpus" || arg == "--cnn-gpus") { if ((argi + 1) > argc) { @@ -55,7 +55,7 @@ vector Initialize_GPU(int& argc, char**& argv) { ngpus_requested = true; string a2 = argv[argi+1]; istringstream c(a2); c >> requested_gpus; - RemoveArgs(argc, argv, argi, 2); + remove_args(argc, argv, argi, 2); } } else if (arg == "--cnn_gpu_ids" || arg == "--cnn-gpu-ids") { if ((argi + 1) > argc) { @@ -89,7 +89,7 @@ vector Initialize_GPU(int& argc, char**& argv) { } } } - RemoveArgs(argc, argv, argi, 2); + remove_args(argc, argv, argi, 2); } } } diff --git a/cnn/cuda.h b/cnn/cuda.h index bb2c89125..00f0785ab 100644 --- a/cnn/cuda.h +++ b/cnn/cuda.h @@ -48,7 +48,7 @@ inline std::pair SizeToBlockThreadPair(int n) { return std::make_pair(blocks, threads); } -std::vector Initialize_GPU(int& argc, char**& argv); +std::vector initialize_gpu(int& argc, char**& argv); } // namespace cnn diff --git a/cnn/dict.cc b/cnn/dict.cc index 37e5bfd2e..a0961bdee 100644 --- a/cnn/dict.cc +++ b/cnn/dict.cc @@ -8,19 +8,19 @@ using namespace std; namespace cnn { -std::vector ReadSentence(const std::string& line, Dict* sd) { +std::vector read_sentence(const std::string& line, Dict* sd) { std::istringstream in(line); std::string word; std::vector res; while(in) { in >> word; if (!in || word.empty()) break; - res.push_back(sd->Convert(word)); + res.push_back(sd->convert(word)); } return res; } -void ReadSentencePair(const std::string& line, std::vector* s, Dict* sd, std::vector* t, Dict* td) { +void read_sentence_pair(const std::string& line, std::vector* s, Dict* sd, std::vector* t, Dict* td) { std::istringstream in(line); std::string word; std::string sep = "|||"; @@ -30,7 +30,7 @@ void ReadSentencePair(const std::string& line, std::vector* s, Dict* sd, st in >> word; if (!in) break; if (word == sep) { d = td; v = t; continue; } - v->push_back(d->Convert(word)); + v->push_back(d->convert(word)); } } diff --git a/cnn/dict.h b/cnn/dict.h index 28ad0f025..bf1bfec4a 100644 --- a/cnn/dict.h +++ b/cnn/dict.h @@ -26,14 +26,14 @@ typedef std::unordered_map Map; inline unsigned size() const { return words_.size(); } - inline bool Contains(const std::string& words) { + inline bool contains(const std::string& words) { return !(d_.find(words) == d_.end()); } - void Freeze() { frozen = true; } + void freeze() { frozen = true; } bool is_frozen() { return frozen; } - inline int Convert(const std::string& word) { + inline int convert(const std::string& word) { auto i = d_.find(word); if (i == d_.end()) { if (frozen) { @@ -53,27 +53,27 @@ typedef std::unordered_map Map; } } - inline const std::string& Convert(const int& id) const { + inline const std::string& convert(const int& id) const { assert(id < (int)words_.size()); return words_[id]; } - void SetUnk(const std::string& word) { + void set_unk(const std::string& word) { if (!frozen) - throw std::runtime_error("Please call SetUnk() only after dictionary is frozen"); + throw std::runtime_error("Please call set_unk() only after dictionary is frozen"); if (map_unk) throw std::runtime_error("Set UNK more than one time"); // temporarily unfrozen the dictionary to allow the add of the UNK frozen = false; - unk_id = Convert(word); + unk_id = convert(word); frozen = true; map_unk = true; } - int GetUnkId() const { return unk_id; } - const std::vector & GetWords() const { return words_; } + int get_unk_id() const { return unk_id; } + const std::vector & get_words() const { return words_; } void clear() { words_.clear(); d_.clear(); } @@ -100,8 +100,8 @@ typedef std::unordered_map Map; #endif }; -std::vector ReadSentence(const std::string& line, Dict* sd); -void ReadSentencePair(const std::string& line, std::vector* s, Dict* sd, std::vector* t, Dict* td); +std::vector read_sentence(const std::string& line, Dict* sd); +void read_sentence_pair(const std::string& line, std::vector* s, Dict* sd, std::vector* t, Dict* td); } // namespace cnn diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc index 9dc4ff501..2005ac005 100644 --- a/cnn/grad-check.cc +++ b/cnn/grad-check.cc @@ -11,7 +11,7 @@ using namespace std; namespace cnn { -bool CheckGrad(Model& m, ComputationGraph& g, int verbosity) { +bool check_grad(Model& m, ComputationGraph& g, int verbosity) { // Clear the parameters first const vector& params = m.parameters_list(); const vector& lookup_params = m.lookup_parameters_list(); diff --git a/cnn/grad-check.h b/cnn/grad-check.h index b9ca33418..6ff1485e4 100644 --- a/cnn/grad-check.h +++ b/cnn/grad-check.h @@ -7,7 +7,7 @@ class Model; struct ComputationGraph; // verbosity is zero for silence, one for only printing errors, two for everything -bool CheckGrad(Model& m, ComputationGraph& g, int verbosity = 1); +bool check_grad(Model& m, ComputationGraph& g, int verbosity = 1); } // namespace cnn diff --git a/cnn/graph.cc b/cnn/graph.cc index 5e2c9f3bd..8a7361a22 100644 --- a/cnn/graph.cc +++ b/cnn/graph.cc @@ -7,7 +7,7 @@ using namespace std; namespace cnn { -void GraphOptimize(ComputationGraph* cg) { +void graph_optimize(ComputationGraph* cg) { // topo sort vector& nodes = cg->nodes; vector longest_paths(nodes.size()); diff --git a/cnn/graph.h b/cnn/graph.h index 227a6d00a..53902629d 100644 --- a/cnn/graph.h +++ b/cnn/graph.h @@ -3,7 +3,7 @@ namespace cnn { struct ComputationGraph; -void GraphOptimize(ComputationGraph* cg); +void graph_optimize(ComputationGraph* cg); } // namespace cnn #endif diff --git a/cnn/hsm-builder.cc b/cnn/hsm-builder.cc index a141a437f..40d1ec7c6 100644 --- a/cnn/hsm-builder.cc +++ b/cnn/hsm-builder.cc @@ -182,7 +182,7 @@ HierarchicalSoftmaxBuilder::HierarchicalSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, Dict* word_dict, Model* model) { - root = ReadClusterFile(cluster_file, word_dict); + root = read_cluster_file(cluster_file, word_dict); root->initialize(rep_dim, model); } @@ -247,7 +247,7 @@ Expression HierarchicalSoftmaxBuilder::full_log_distribution(const Expression& r inline bool is_ws(char x) { return (x == ' ' || x == '\t'); } inline bool not_ws(char x) { return (x != ' ' && x != '\t'); } -Cluster* HierarchicalSoftmaxBuilder::ReadClusterFile(const std::string& cluster_file, Dict* word_dict) { +Cluster* HierarchicalSoftmaxBuilder::read_cluster_file(const std::string& cluster_file, Dict* word_dict) { cerr << "Reading clusters from " << cluster_file << " ...\n"; ifstream in(cluster_file); assert(in); @@ -266,7 +266,7 @@ Cluster* HierarchicalSoftmaxBuilder::ReadClusterFile(const std::string& cluster_ endp = startp; while (not_ws(line[endp]) && endp < len) { ++endp; } string symbol = line.substr(startp, endp - startp); - path.push_back(path_symbols.Convert(symbol)); + path.push_back(path_symbols.convert(symbol)); if (line[endp] == ' ') { startp = endp + 1; continue; @@ -289,7 +289,7 @@ Cluster* HierarchicalSoftmaxBuilder::ReadClusterFile(const std::string& cluster_ assert(endw > startw); string word = line.substr(startw, endw - startw); - unsigned widx = word_dict->Convert(word); + unsigned widx = word_dict->convert(word); node->add_word(widx); if (widx2path.size() <= widx) { diff --git a/cnn/hsm-builder.h b/cnn/hsm-builder.h index 5bdb9f5bd..ff85af721 100644 --- a/cnn/hsm-builder.h +++ b/cnn/hsm-builder.h @@ -83,7 +83,7 @@ class HierarchicalSoftmaxBuilder : public SoftmaxBuilder { expr::Expression full_log_distribution(const expr::Expression& rep); private: - Cluster* ReadClusterFile(const std::string& cluster_file, Dict* word_dict); + Cluster* read_cluster_file(const std::string& cluster_file, Dict* word_dict); std::vector widx2path; // will be NULL if not found Dict path_symbols; diff --git a/cnn/init.cc b/cnn/init.cc index 45c38a810..9e01045fc 100644 --- a/cnn/init.cc +++ b/cnn/init.cc @@ -16,14 +16,14 @@ using namespace std; namespace cnn { -static void RemoveArgs(int& argc, char**& argv, int& argi, int n) { +static void remove_args(int& argc, char**& argv, int& argi, int n) { for (int i = argi + n; i < argc; ++i) argv[i - n] = argv[i]; argc -= n; assert(argc >= 0); } -void Initialize(int& argc, char**& argv, bool shared_parameters) { +void initialize(int& argc, char**& argv, bool shared_parameters) { if(default_device != nullptr) { cerr << "WARNING: Attempting to initialize cnn twice. Ignoring duplicate initialization." << endl; return; @@ -31,7 +31,7 @@ void Initialize(int& argc, char**& argv, bool shared_parameters) { vector gpudevices; #if HAVE_CUDA cerr << "[cnn] initializing CUDA\n"; - gpudevices = Initialize_GPU(argc, argv); + gpudevices = initialize_gpu(argc, argv); #endif unsigned random_seed = 0; int argi = 1; @@ -44,7 +44,7 @@ void Initialize(int& argc, char**& argv, bool shared_parameters) { abort(); } else { mem_descriptor = argv[argi+1]; - RemoveArgs(argc, argv, argi, 2); + remove_args(argc, argv, argi, 2); } } else if (arg == "--cnn-l2" || arg == "--cnn_l2") { if ((argi + 1) > argc) { @@ -54,7 +54,7 @@ void Initialize(int& argc, char**& argv, bool shared_parameters) { string a2 = argv[argi+1]; float decay = 0; istringstream d(a2); d >> decay; - RemoveArgs(argc, argv, argi, 2); + remove_args(argc, argv, argi, 2); if (decay < 0 || decay >= 1) { cerr << "[cnn] weight decay parameter must be between 0 and 1 (probably very small like 1e-6)\n"; abort(); @@ -68,7 +68,7 @@ void Initialize(int& argc, char**& argv, bool shared_parameters) { } else { string a2 = argv[argi+1]; istringstream c(a2); c >> random_seed; - RemoveArgs(argc, argv, argi, 2); + remove_args(argc, argv, argi, 2); } } else if (arg.find("--cnn") == 0) { cerr << "[cnn] Bad command line argument: " << arg << endl; @@ -99,7 +99,7 @@ void Initialize(int& argc, char**& argv, bool shared_parameters) { cerr << "[cnn] memory allocation done.\n"; } -void Cleanup() { +void cleanup() { delete rndeng; // TODO: Devices cannot be deleted at the moment // for(Device* device : devices) delete device; diff --git a/cnn/init.h b/cnn/init.h index 6d6bdc2c4..04c7642b2 100644 --- a/cnn/init.h +++ b/cnn/init.h @@ -5,8 +5,8 @@ namespace cnn { extern float weight_decay_lambda; -void Initialize(int& argc, char**& argv, bool shared_parameters = false); -void Cleanup(); +void initialize(int& argc, char**& argv, bool shared_parameters = false); +void cleanup(); } // namespace cnn diff --git a/cnn/model.cc b/cnn/model.cc index 48c0ba516..a55292ea2 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -160,7 +160,7 @@ void LookupParameter::initialize(unsigned index, const std::vector& val) } Model::Model() : gradient_norm_scratch(nullptr) { - weight_decay.SetLambda(weight_decay_lambda); + weight_decay.set_lambda(weight_decay_lambda); } Model::~Model() { @@ -170,7 +170,7 @@ Model::~Model() { } void Model::set_weight_decay_lambda(float lambda) { - weight_decay.SetLambda(lambda); + weight_decay.set_lambda(lambda); } void Model::project_weights(float radius) { diff --git a/cnn/mp.cc b/cnn/mp.cc index bb8d84116..7ab882e58 100644 --- a/cnn/mp.cc +++ b/cnn/mp.cc @@ -11,29 +11,29 @@ namespace cnn { bool stop_requested = false; SharedObject* shared_object = nullptr; - std::string GenerateQueueName() { + std::string generate_queue_name() { std::ostringstream ss; ss << "cnn_mp_work_queue"; ss << rand(); return ss.str(); } - std::string GenerateSharedMemoryName() { + std::string generate_shared_memory_name() { std::ostringstream ss; ss << "cnn_mp_shared_memory"; ss << rand(); return ss.str(); } - cnn::real SumValues(const std::vector& values) { + cnn::real sum_values(const std::vector& values) { return accumulate(values.begin(), values.end(), 0.0); } - cnn::real Mean(const std::vector& values) { - return SumValues(values) / values.size(); + cnn::real mean(const std::vector& values) { + return sum_values(values) / values.size(); } - std::string ElapsedTimeString(const timespec& start, const timespec& end) { + std::string elapsed_time_string(const timespec& start, const timespec& end) { std::ostringstream ss; time_t secs = end.tv_sec - start.tv_sec; long nsec = end.tv_nsec - start.tv_nsec; @@ -41,7 +41,7 @@ namespace cnn { return ss.str(); } - unsigned SpawnChildren(std::vector& workloads) { + unsigned spawn_children(std::vector& workloads) { const unsigned num_children = workloads.size(); assert (workloads.size() == num_children); pid_t pid; @@ -61,7 +61,7 @@ namespace cnn { return cid; } - std::vector CreateWorkloads(unsigned num_children) { + std::vector create_workloads(unsigned num_children) { int err; std::vector workloads(num_children); for (unsigned cid = 0; cid < num_children; cid++) { diff --git a/cnn/mp.h b/cnn/mp.h index 8426ec326..5cbb1235b 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -67,7 +67,7 @@ namespace cnn { /// XXX: We never delete these objects template - T* GetSharedMemory() { + T* get_shared_memory() { /*std::cerr << "Creating shared memory named " << shared_memory_name << std::endl; auto shm = new boost::interprocess::shared_memory_object(boost::interprocess::create_only, shared_memory_name.c_str(), boost::interprocess::read_write); shm->truncate(sizeof(T)); @@ -82,41 +82,41 @@ namespace cnn { // These are used to send data from child processes // to the parent process or vice/versa. template - T Read(int pipe) { + T read_data(int pipe) { T v; - int err = read(pipe, &v, sizeof(T)); + int err = read(pipe, (void*)&v, sizeof(T)); assert (err != -1); return v; } template - void Write(int pipe, const T& v) { - int err = write(pipe, &v, sizeof(T)); + void write_data(int pipe, const T& v) { + int err = write(pipe, (void*)&v, sizeof(T)); assert (err != -1); } - std::string GenerateQueueName(); - std::string GenerateSharedMemoryName(); + std::string generate_queue_name(); + std::string generate_shared_memory_name(); - cnn::real SumValues(const std::vector& values); - cnn::real Mean(const std::vector& values); + cnn::real sum_values(const std::vector& values); + cnn::real mean(const std::vector& values); - std::string ElapsedTimeString(const timespec& start, const timespec& end); + std::string elapsed_time_string(const timespec& start, const timespec& end); - unsigned SpawnChildren(std::vector& workloads); - std::vector CreateWorkloads(unsigned num_children); + unsigned spawn_children(std::vector& workloads); + std::vector create_workloads(unsigned num_children); // Called by the parent to process a chunk of data template - S RunDataSet(std::vector::iterator begin, std::vector::iterator end, const std::vector& workloads, + S run_data_set(std::vector::iterator begin, std::vector::iterator end, const std::vector& workloads, boost::interprocess::message_queue& mq, const WorkloadHeader& header) { const unsigned num_children = workloads.size(); // Tell all the children to start up for (unsigned cid = 0; cid < num_children; ++cid) { bool cont = true; - Write(workloads[cid].p2c[1], cont); - Write(workloads[cid].p2c[1], header); + write_data(workloads[cid].p2c[1], cont); + write_data(workloads[cid].p2c[1], header); } // Write all the indices to the queue for the children to process @@ -137,7 +137,7 @@ namespace cnn { // Wait for each child to finish training its load std::vector losses(num_children); for(unsigned cid = 0; cid < num_children; ++cid) { - losses[cid] = Read(workloads[cid].c2p[0]); + losses[cid] = read_data(workloads[cid].c2p[0]); } S total_loss = S(); @@ -148,7 +148,7 @@ namespace cnn { } template - void RunParent(const std::vector& train_data, const std::vector& dev_data, ILearner* learner, + void run_parent(const std::vector& train_data, const std::vector& dev_data, ILearner* learner, std::vector& workloads, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency) { const unsigned num_children = workloads.size(); boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); @@ -174,7 +174,7 @@ namespace cnn { end = train_indices.end(); } double fractional_iter = iter + 1.0 * distance(train_indices.begin(), end) / train_indices.size(); - S batch_loss = RunDataSet(begin, end, workloads, mq, {false, end == train_indices.end(), report_frequency}); + S batch_loss = run_data_set(begin, end, workloads, mq, {false, end == train_indices.end(), report_frequency}); train_loss += batch_loss; std::cerr << fractional_iter << "\t" << "loss = " << batch_loss << std::endl; @@ -182,7 +182,7 @@ namespace cnn { break; } - S dev_loss = RunDataSet(dev_indices.begin(), dev_indices.end(), workloads, mq, {true, false, report_frequency}); + S dev_loss = run_data_set(dev_indices.begin(), dev_indices.end(), workloads, mq, {true, false, report_frequency}); bool new_best = (first_dev_run || dev_loss < best_dev_loss); first_dev_run = false; std::cerr << fractional_iter << "\t" << "dev loss = " << dev_loss << (new_best ? " (New best!)" : "") << std::endl; @@ -201,13 +201,13 @@ namespace cnn { // Kill all children one by one and wait for them to exit for (unsigned cid = 0; cid < num_children; ++cid) { bool cont = false; - Write(workloads[cid].p2c[1], cont); + write_data(workloads[cid].p2c[1], cont); wait(NULL); } } template - int RunChild(unsigned cid, ILearner* learner, Trainer* trainer, + int run_child(unsigned cid, ILearner* learner, Trainer* trainer, std::vector& workloads, const std::vector& train_data, const std::vector& dev_data) { const unsigned num_children = workloads.size(); @@ -218,13 +218,13 @@ namespace cnn { boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); while (true) { // Check if the parent wants us to exit - bool cont = Read(workloads[cid].p2c[0]); + bool cont = read_data(workloads[cid].p2c[0]); if (cont == 0) { break; } // Check if we're running on the training data or the dev data - WorkloadHeader header = Read(workloads[cid].p2c[0]); + WorkloadHeader header = read_data(workloads[cid].p2c[0]); // Run the actual training loop S total_loss = S(); @@ -269,32 +269,32 @@ namespace cnn { } // Let the parent know that we're done and return the loss value - Write(workloads[cid].c2p[1], total_loss); + write_data(workloads[cid].c2p[1], total_loss); } return 0; } template - void RunMultiProcess(unsigned num_children, ILearner* learner, Trainer* trainer, const std::vector& train_data, + void run_multi_process(unsigned num_children, ILearner* learner, Trainer* trainer, const std::vector& train_data, const std::vector& dev_data, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency) { //assert (cnn::ps->is_shared()); - queue_name = GenerateQueueName(); + queue_name = generate_queue_name(); boost::interprocess::message_queue::remove(queue_name.c_str()); boost::interprocess::message_queue::remove(queue_name.c_str()); - shared_memory_name = GenerateSharedMemoryName(); - shared_object = GetSharedMemory(); - std::vector workloads = CreateWorkloads(num_children); - unsigned cid = SpawnChildren(workloads); + shared_memory_name = generate_shared_memory_name(); + shared_object = get_shared_memory(); + std::vector workloads = create_workloads(num_children); + unsigned cid = spawn_children(workloads); if (cid < num_children) { - RunChild(cid, learner, trainer, workloads, train_data, dev_data); + run_child(cid, learner, trainer, workloads, train_data, dev_data); } else { - RunParent(train_data, dev_data, learner, workloads, num_iterations, dev_frequency, report_frequency); + run_parent(train_data, dev_data, learner, workloads, num_iterations, dev_frequency, report_frequency); } } template - void RunSingleProcess(ILearner* learner, Trainer* trainer, const std::vector& train_data, + void run_single_process(ILearner* learner, Trainer* trainer, const std::vector& train_data, const std::vector& dev_data, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency) { std::vector train_indices(train_data.size()); std::iota(train_indices.begin(), train_indices.end(), 0); diff --git a/cnn/param-nodes.cc b/cnn/param-nodes.cc index a5e15c2f0..de6c19f38 100644 --- a/cnn/param-nodes.cc +++ b/cnn/param-nodes.cc @@ -107,7 +107,7 @@ void LookupNode::accumulate_grad(const Tensor& g) { template void ConstParameterNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - fx.tvec().device(*dev.edevice) = params.get()->values.tvec() * params.mp->weight_decay.CurrentWeightDecay(); + fx.tvec().device(*dev.edevice) = params.get()->values.tvec() * params.mp->weight_decay.current_weight_decay(); } template @@ -130,7 +130,7 @@ void ParameterNode::forward_dev_impl(const MyDevice & dev, const vectorvalues.v; // return; // } - fx.tvec().device(*dev.edevice) = params.get()->values.tvec() * params.mp->weight_decay.CurrentWeightDecay(); + fx.tvec().device(*dev.edevice) = params.get()->values.tvec() * params.mp->weight_decay.current_weight_decay(); } template @@ -230,7 +230,7 @@ void LookupNode::forward_dev_impl(const MyDevice & dev, const vectorvalues.size()); assert (fx.d.batch_elems() == 1); - fx.tvec().device(*dev.edevice) = params.get()->values[*pindex].tvec() * params.mp->weight_decay.CurrentWeightDecay(); + fx.tvec().device(*dev.edevice) = params.get()->values[*pindex].tvec() * params.mp->weight_decay.current_weight_decay(); } else { assert (pindices); assert (fx.d.batch_elems() == pindices->size()); @@ -242,12 +242,12 @@ void LookupNode::forward_dev_impl(const MyDevice & dev, const vectorvalues[i].v, fx.d.batch_size() * sizeof(float), cudaMemcpyDeviceToDevice); #else // we should use colwise() instead of memcpy to get rid of the - // extra multiply by params.mp->weight_decay.CurrentWeightDecay() + // extra multiply by params.mp->weight_decay.current_weight_decay() memcpy(v, params.get()->values[i].v, fx.d.batch_size() * sizeof(float)); #endif } - fx.tvec().device(*dev.edevice) = fx.tvec() * params.mp->weight_decay.CurrentWeightDecay(); + fx.tvec().device(*dev.edevice) = fx.tvec() * params.mp->weight_decay.current_weight_decay(); } } diff --git a/cnn/pretrain.cc b/cnn/pretrain.cc index 9e90f48e5..d08077b5f 100644 --- a/cnn/pretrain.cc +++ b/cnn/pretrain.cc @@ -12,7 +12,7 @@ using namespace std; namespace cnn { -void SavePretrainedEmbeddings(const std::string& fname, +void save_pretrained_embeddings(const std::string& fname, const Dict& d, const LookupParameter& lp) { cerr << "Writing word vectors to " << fname << " ...\n"; @@ -20,15 +20,15 @@ void SavePretrainedEmbeddings(const std::string& fname, assert(out); auto& m = *lp.get(); for (unsigned i = 0; i < d.size(); ++i) { - out << d.Convert(i) << ' ' << (*m.values[i]).transpose() << endl; + out << d.convert(i) << ' ' << (*m.values[i]).transpose() << endl; } } -void ReadPretrainedEmbeddings(const std::string& fname, +void read_pretrained_embeddings(const std::string& fname, Dict* d, std::unordered_map>* vectors) { int unk = -1; - if (d->is_frozen()) unk = d->GetUnkId(); + if (d->is_frozen()) unk = d->get_unk_id(); cerr << "Loading word vectors from " << fname << " ...\n"; ifstream in(fname); assert(in); @@ -45,12 +45,12 @@ void ReadPretrainedEmbeddings(const std::string& fname, v.push_back(x); } unsigned vec_size = v.size(); - int wid = d->Convert(word); + int wid = d->convert(word); if (wid != unk) (*vectors)[wid] = v; while(getline(in, line)) { istringstream lin(line); lin >> word; - int w = d->Convert(word); + int w = d->convert(word); if (w != unk) { for (unsigned i = 0; i < vec_size; ++i) lin >> v[i]; (*vectors)[w] = v; diff --git a/cnn/pretrain.h b/cnn/pretrain.h index 9a674597e..02363cf3c 100644 --- a/cnn/pretrain.h +++ b/cnn/pretrain.h @@ -9,11 +9,11 @@ namespace cnn { -void SavePretrainedEmbeddings(const std::string& fname, +void save_pretrained_embeddings(const std::string& fname, const Dict& d, const LookupParameter& lp); -void ReadPretrainedEmbeddings(const std::string& fname, +void read_pretrained_embeddings(const std::string& fname, Dict* d, std::unordered_map>* vectors); diff --git a/cnn/saxe-init.cc b/cnn/saxe-init.cc index 5a5c2ea2c..b6e88970f 100644 --- a/cnn/saxe-init.cc +++ b/cnn/saxe-init.cc @@ -10,7 +10,7 @@ using namespace std; namespace cnn { -void OrthonormalRandom(unsigned dd, float g, Tensor& x) { +void orthonormal_random(unsigned dd, float g, Tensor& x) { Tensor t; t.d = Dim({dd, dd}); t.v = new float[dd * dd]; diff --git a/cnn/saxe-init.h b/cnn/saxe-init.h index 7d59708e0..95ad9bc50 100644 --- a/cnn/saxe-init.h +++ b/cnn/saxe-init.h @@ -5,7 +5,7 @@ namespace cnn { struct Tensor; -void OrthonormalRandom(unsigned dim, float g, Tensor& x); +void orthonormal_random(unsigned dim, float g, Tensor& x); } diff --git a/cnn/shadow-params.cc b/cnn/shadow-params.cc index 6c5815ac2..733243cf4 100644 --- a/cnn/shadow-params.cc +++ b/cnn/shadow-params.cc @@ -20,7 +20,7 @@ ShadowLookupParameters::ShadowLookupParameters(const LookupParameterStorage& lp) } } -vector AllocateShadowParameters(const Model& m) { +vector allocate_shadow_parameters(const Model& m) { vector v; v.reserve(m.parameters_list().size()); for (auto& p : m.parameters_list()) @@ -28,7 +28,7 @@ vector AllocateShadowParameters(const Model& m) { return v; } -vector AllocateShadowLookupParameters(const Model& m) { +vector allocate_shadow_lookup_parameters(const Model& m) { vector v; v.reserve(m.lookup_parameters_list().size()); for (auto& p : m.lookup_parameters_list()) diff --git a/cnn/shadow-params.h b/cnn/shadow-params.h index 11ad23b65..19d184b5c 100644 --- a/cnn/shadow-params.h +++ b/cnn/shadow-params.h @@ -25,9 +25,9 @@ struct ShadowLookupParameters { }; // one per element in model.parameters_list -std::vector AllocateShadowParameters(const Model& model); +std::vector allocate_shadow_parameters(const Model& model); // one per element in model.lookup_parameters_list -std::vector AllocateShadowLookupParameters(const Model& model); +std::vector allocate_shadow_lookup_parameters(const Model& model); } // namespace cnn diff --git a/cnn/training.cc b/cnn/training.cc index 61b377209..2786444b8 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -47,10 +47,10 @@ bool is_valid(const Eigen::MatrixBase& x) { Trainer::~Trainer() {} void Trainer::rescale_and_reset_weight_decay() { - const float weight_decay = model->weight_decay.CurrentWeightDecay(); + const float weight_decay = model->weight_decay.current_weight_decay(); for (auto p : model->parameters_list()) p->scale_parameters(weight_decay); - model->weight_decay.ResetWeightDecay(); + model->weight_decay.reset_weight_decay(); } float Trainer::clip_gradients() { @@ -92,8 +92,8 @@ void Trainer::update(real scale) { } ++updates; - model->weight_decay.UpdateWeightDecay(); // update global weight scale - if (model->weight_decay.ParametersNeedRescaled()) + model->weight_decay.update_weight_decay(); // update global weight scale + if (model->weight_decay.parameters_need_rescaled()) rescale_and_reset_weight_decay(); // if wdscale is getting to small multiply all weights by wdscale, and set wdscale to 1 } @@ -104,7 +104,7 @@ void Trainer::update(real scale) { // Perform update of ts[0]=parameters, ts[1]=gradients template void SimpleSGDTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { - ts[0]->tvec().device(*dev.edevice) -= ts[1]->tvec() * (eta * scale * gscale / model->weight_decay.CurrentWeightDecay()); + ts[0]->tvec().device(*dev.edevice) -= ts[1]->tvec() * (eta * scale * gscale / model->weight_decay.current_weight_decay()); } CNN_TRAINER_INST_DEV_IMPL(SimpleSGDTrainer) @@ -125,7 +125,7 @@ void SimpleSGDTrainer::update_lookup_params(real scale, real gscale, size_t idx, template void MomentumSGDTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { ts[2]->tvec().device(*dev.edevice) = ts[2]->tvec() * momentum - ts[1]->tvec() * (eta * scale * gscale); - ts[0]->tvec().device(*dev.edevice) += ts[2]->tvec() / model->weight_decay.CurrentWeightDecay(); + ts[0]->tvec().device(*dev.edevice) += ts[2]->tvec() / model->weight_decay.current_weight_decay(); } CNN_TRAINER_INST_DEV_IMPL(MomentumSGDTrainer) @@ -139,8 +139,8 @@ void MomentumSGDTrainer::update_lookup_params(real scale, real gscale, size_t id update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx], &vlp[idx].h[lidx]}); } void MomentumSGDTrainer::alloc_impl() { - vp = AllocateShadowParameters(*model); - vlp = AllocateShadowLookupParameters(*model); + vp = allocate_shadow_parameters(*model); + vlp = allocate_shadow_lookup_parameters(*model); } #endif @@ -151,7 +151,7 @@ template void AdagradTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { ts[1]->tvec().device(*dev.edevice) = ts[1]->tvec() * (scale * gscale); ts[2]->tvec().device(*dev.edevice) += ts[1]->tvec().square(); - ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() / (ts[2]->tvec() + epsilon).sqrt() * (-eta / model->weight_decay.CurrentWeightDecay()); + ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() / (ts[2]->tvec() + epsilon).sqrt() * (-eta / model->weight_decay.current_weight_decay()); } CNN_TRAINER_INST_DEV_IMPL(AdagradTrainer) @@ -165,8 +165,8 @@ void AdagradTrainer::update_lookup_params(real scale, real gscale, size_t idx, s update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx], &vlp[idx].h[lidx]}); } void AdagradTrainer::alloc_impl() { - vp = AllocateShadowParameters(*model); - vlp = AllocateShadowLookupParameters(*model); + vp = allocate_shadow_parameters(*model); + vlp = allocate_shadow_lookup_parameters(*model); } #endif @@ -179,7 +179,7 @@ void AdadeltaTrainer::update_rule_dev(const MyDevice & dev, real scale, real gsc ts[2]->tvec().device(*dev.edevice) = ts[2]->tvec() * rho + ts[1]->tvec().square() * (1.f - rho); ts[1]->tvec().device(*dev.edevice) = - ts[1]->tvec() * (ts[3]->tvec() + epsilon).sqrt() / (ts[2]->tvec() + epsilon).sqrt(); ts[3]->tvec().device(*dev.edevice) = ts[3]->tvec() * rho + ts[1]->tvec().square() * (1.f - rho); - ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() / model->weight_decay.CurrentWeightDecay(); + ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() / model->weight_decay.current_weight_decay(); } CNN_TRAINER_INST_DEV_IMPL(AdadeltaTrainer) @@ -193,10 +193,10 @@ void AdadeltaTrainer::update_lookup_params(real scale, real gscale, size_t idx, update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx], &hlg[idx].h[lidx], &hld[idx].h[lidx]}); } void AdadeltaTrainer::alloc_impl() { - hg = AllocateShadowParameters(*model); - hlg = AllocateShadowLookupParameters(*model); - hd = AllocateShadowParameters(*model); - hld = AllocateShadowLookupParameters(*model); + hg = allocate_shadow_parameters(*model); + hlg = allocate_shadow_lookup_parameters(*model); + hd = allocate_shadow_parameters(*model); + hld = allocate_shadow_lookup_parameters(*model); } #endif @@ -211,7 +211,7 @@ void RmsPropTrainer::update_rule_dev(const MyDevice & dev, real scale, real gsca // real& d2 = hg[pi++]; // real g2 = p->g.vec().squaredNorm(); // d2 = rho * d2 + (1.f - rho) * g2; - // p->values.vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->g.vec()) / model->weight_decay.CurrentWeightDecay(); + // p->values.vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->g.vec()) / model->weight_decay.current_weight_decay(); } CNN_TRAINER_INST_DEV_IMPL(RmsPropTrainer) @@ -247,7 +247,7 @@ void AdamTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, ts[3]->tvec().device(*dev.edevice) = ts[3]->tvec() * beta_2 + ts[1]->tvec().square() * (1.f - beta_2); float s1 = 1 - pow(beta_1, updates+1); float s2 = 1 - pow(beta_2, updates+1); - ts[0]->tvec().device(*dev.edevice) += ts[2]->tvec() / ((ts[3]->tvec() / s2).sqrt() + epsilon) * (-eta / s1 / model->weight_decay.CurrentWeightDecay()); + ts[0]->tvec().device(*dev.edevice) += ts[2]->tvec() / ((ts[3]->tvec() / s2).sqrt() + epsilon) * (-eta / s1 / model->weight_decay.current_weight_decay()); } CNN_TRAINER_INST_DEV_IMPL(AdamTrainer) @@ -261,10 +261,10 @@ void AdamTrainer::update_lookup_params(real scale, real gscale, size_t idx, size update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx], &lm[idx].h[lidx], &lv[idx].h[lidx]}); } void AdamTrainer::alloc_impl() { - m = AllocateShadowParameters(*model); - lm = AllocateShadowLookupParameters(*model); - v = AllocateShadowParameters(*model); - lv = AllocateShadowLookupParameters(*model); + m = allocate_shadow_parameters(*model); + lm = allocate_shadow_lookup_parameters(*model); + v = allocate_shadow_parameters(*model); + lv = allocate_shadow_lookup_parameters(*model); } #endif diff --git a/cnn/weight-decay.h b/cnn/weight-decay.h index 914587118..5249e3409 100644 --- a/cnn/weight-decay.h +++ b/cnn/weight-decay.h @@ -14,22 +14,22 @@ namespace cnn { // Note: you may want to discount lambda as you learn if your eta is on a // decaying schedule. struct L2WeightDecay { - explicit L2WeightDecay(float lambda = 1e-6) : weight_decay(1) { SetLambda(lambda); } - void SetLambda(float lam) { - if (lam < 0) throw std::domain_error("Bad value of lambda in SetLambda"); + explicit L2WeightDecay(float lambda = 1e-6) : weight_decay(1) { set_lambda(lambda); } + void set_lambda(float lam) { + if (lam < 0) throw std::domain_error("Bad value of lambda in set_lambda"); lambda = lam; } - void UpdateWeightDecay(unsigned num_updates = 1) { + void update_weight_decay(unsigned num_updates = 1) { if (num_updates == 0) return; if (num_updates == 1) weight_decay -= weight_decay * lambda; else weight_decay = weight_decay * std::pow(1-lambda, num_updates); } - float CurrentWeightDecay() const { return weight_decay; } - bool ParametersNeedRescaled() const { + float current_weight_decay() const { return weight_decay; } + bool parameters_need_rescaled() const { return (weight_decay < 0.25f); } - void ResetWeightDecay() { + void reset_weight_decay() { std::cerr << "RESCALE WEIGHT DECAY FROM " << weight_decay << " to 1.0\n"; weight_decay = 1.0f; } diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index f5a2dac60..e2b0e35d7 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -75,17 +75,17 @@ struct Encoder { }; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; } vector, vector>> training, dev; string line; - kSRC_SOS = sd.Convert(""); - kSRC_EOS = sd.Convert(""); - kTRG_SOS = td.Convert(""); - kTRG_EOS = td.Convert(""); + kSRC_SOS = sd.convert(""); + kSRC_EOS = sd.convert(""); + kTRG_SOS = td.convert(""); + kTRG_EOS = td.convert(""); int tlc = 0; int ttoks = 0; cerr << "Reading training data from " << argv[1] << "...\n"; @@ -95,13 +95,13 @@ int main(int argc, char** argv) { while(getline(in, line)) { ++tlc; vector src, trg; - ReadSentencePair(line, &src, &sd, &trg, &td); + read_sentence_pair(line, &src, &sd, &trg, &td); training.push_back(make_pair(src, trg)); } cerr << tlc << " lines, " << sd.size() << " source types, " << td.size() << " target types\n"; } - sd.Freeze(); // no new word types allowed - td.Freeze(); // no new word types allowed + sd.freeze(); // no new word types allowed + td.freeze(); // no new word types allowed INPUT_VOCAB_SIZE = sd.size(); OUTPUT_VOCAB_SIZE = td.size(); #if 0 @@ -114,7 +114,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++dlc; - dev.push_back(ReadSentence(line, &d)); + dev.push_back(read_sentence(line, &d)); dtoks += dev.back().size(); if (dev.back().front() != kSOS && dev.back().back() != kEOS) { cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; diff --git a/examples/encdec.cc b/examples/encdec.cc index cb8c7944e..774639ef7 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -132,13 +132,13 @@ struct EncoderDecoder { }; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; } - kSOS = d.Convert(""); - kEOS = d.Convert(""); + kSOS = d.convert(""); + kEOS = d.convert(""); vector> training, dev; string line; int tlc = 0; @@ -149,7 +149,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++tlc; - training.push_back(ReadSentence(line, &d)); + training.push_back(read_sentence(line, &d)); ttoks += training.back().size(); if (training.back().front() != kSOS && training.back().back() != kEOS) { cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; @@ -158,7 +158,7 @@ int main(int argc, char** argv) { } cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; } - d.Freeze(); // no new word types allowed + d.freeze(); // no new word types allowed INPUT_VOCAB_SIZE = d.size(); OUTPUT_VOCAB_SIZE = d.size(); @@ -170,7 +170,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++dlc; - dev.push_back(ReadSentence(line, &devd)); + dev.push_back(read_sentence(line, &devd)); dtoks += dev.back().size(); if (dev.back().front() != kSOS && dev.back().back() != kEOS) { cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; @@ -238,7 +238,7 @@ int main(int argc, char** argv) { chars += sent.size() - 1; ++si; lm.BuildGraph(sent, sent, cg); - //cg.PrintGraphviz(); + //cg.print_graphviz(); loss += as_scalar(cg.forward()); cg.backward(); sgd->update(); diff --git a/examples/mlc.cc b/examples/mlc.cc index e4795552d..1a6f983e4 100644 --- a/examples/mlc.cc +++ b/examples/mlc.cc @@ -107,7 +107,7 @@ struct MLCBuilder { }; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); if (argc != 5) { cerr << "Usage: " << argv[0] << " x.train.txt y.train.txt x.dev.txt y.dev.txt\n"; diff --git a/examples/nlm.cc b/examples/nlm.cc index 3ef13cd0a..39cc4554b 100644 --- a/examples/nlm.cc +++ b/examples/nlm.cc @@ -14,7 +14,7 @@ using namespace cnn; using namespace cnn::expr; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); unsigned CONTEXT = 3; unsigned DIM = 100; @@ -44,7 +44,7 @@ int main(int argc, char** argv) { Expression o2 = bias + R * nl; Expression ydist = log_softmax(o2); Expression nerr = -pick(ydist, &ytrue); - cg.PrintGraphviz(); + cg.print_graphviz(); // load some training data if (argc != 2) { diff --git a/examples/poisson-regression.cc b/examples/poisson-regression.cc index cc392c72a..d4fd3ab0f 100644 --- a/examples/poisson-regression.cc +++ b/examples/poisson-regression.cc @@ -64,13 +64,13 @@ struct RNNLengthPredictor { }; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; } - kSOS = d.Convert(""); - kEOS = d.Convert(""); + kSOS = d.convert(""); + kEOS = d.convert(""); vector,unsigned>> training, dev; string line; int tlc = 0; @@ -83,9 +83,9 @@ int main(int argc, char** argv) { while(getline(in, line)) { ++tlc; vector x, ty; - ReadSentencePair(line, &x, &d, &ty, &td); + read_sentence_pair(line, &x, &d, &ty, &td); assert(ty.size() == 1); - const string& v = td.Convert(ty[0]); + const string& v = td.convert(ty[0]); for(auto c : v) { assert(c >= '0' && c <= '9'); } unsigned y = atoi(v.c_str()); training.push_back(make_pair(x,y)); @@ -97,7 +97,7 @@ int main(int argc, char** argv) { } cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; } - d.Freeze(); // no new word types allowed + d.freeze(); // no new word types allowed VOCAB_SIZE = d.size(); int dlc = 0; @@ -110,9 +110,9 @@ int main(int argc, char** argv) { while(getline(in, line)) { ++dlc; vector x, ty; - ReadSentencePair(line, &x, &d, &ty, &td); + read_sentence_pair(line, &x, &d, &ty, &td); assert(ty.size() == 1); - const string& v = td.Convert(ty[0]); + const string& v = td.convert(ty[0]); for(auto c : v) { assert(c >= '0' && c <= '9'); } unsigned y = atoi(v.c_str()); dev.push_back(make_pair(x,y)); diff --git a/examples/read-write.cc b/examples/read-write.cc index 01f377b9d..652c1384f 100644 --- a/examples/read-write.cc +++ b/examples/read-write.cc @@ -128,7 +128,7 @@ void ReadFromFile(string& filename, XORModel& model, Model& cnn_model) { int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); const unsigned HIDDEN = 8; const unsigned ITERATIONS = 20; diff --git a/examples/rnnlm-aevb.cc b/examples/rnnlm-aevb.cc index b06efb9d0..29fdd2e16 100644 --- a/examples/rnnlm-aevb.cc +++ b/examples/rnnlm-aevb.cc @@ -86,7 +86,7 @@ struct RNNLanguageModel { Expression mu = parameter(cg, p_h2m) * h + parameter(cg, p_mb); if (flag) { vector v = as_vector(cg.get_value(mu.i)); - for (unsigned i = 0; i < (slen-2); ++i) cout << d.Convert(sent[i+1]); + for (unsigned i = 0; i < (slen-2); ++i) cout << d.convert(sent[i+1]); cout << " |||"; for (auto& x : v) cout << ' ' << x; cout << endl; @@ -119,13 +119,13 @@ struct RNNLanguageModel { }; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; } - kSOS = d.Convert(""); - kEOS = d.Convert(""); + kSOS = d.convert(""); + kEOS = d.convert(""); vector> training, dev; string line; int tlc = 0; @@ -136,7 +136,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++tlc; - training.push_back(ReadSentence(line, &d)); + training.push_back(read_sentence(line, &d)); ttoks += training.back().size(); if (training.back().front() != kSOS && training.back().back() != kEOS) { cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; @@ -145,7 +145,7 @@ int main(int argc, char** argv) { } cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; } - d.Freeze(); // no new word types allowed + d.freeze(); // no new word types allowed VOCAB_SIZE = d.size(); int dlc = 0; @@ -156,7 +156,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++dlc; - dev.push_back(ReadSentence(line, &d)); + dev.push_back(read_sentence(line, &d)); dtoks += dev.back().size(); if (dev.back().front() != kSOS && dev.back().back() != kEOS) { cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; diff --git a/examples/rnnlm-batch.cc b/examples/rnnlm-batch.cc index c823f9b25..715b9586b 100644 --- a/examples/rnnlm-batch.cc +++ b/examples/rnnlm-batch.cc @@ -102,7 +102,7 @@ struct RNNLanguageModel { } if (w == dist.size()) w = kEOS; } - cerr << (len == 1 ? "" : " ") << d.Convert(w); + cerr << (len == 1 ? "" : " ") << d.convert(w); cur = w; } cerr << endl; @@ -117,13 +117,13 @@ struct CompareLen { }; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; } - kSOS = d.Convert(""); - kEOS = d.Convert(""); + kSOS = d.convert(""); + kEOS = d.convert(""); vector> training, dev; string line; int tlc = 0; @@ -134,7 +134,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++tlc; - training.push_back(ReadSentence(line, &d)); + training.push_back(read_sentence(line, &d)); ttoks += training.back().size(); if (training.back().front() != kSOS && training.back().back() != kEOS) { cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; @@ -143,7 +143,7 @@ int main(int argc, char** argv) { } cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; } - d.Freeze(); // no new word types allowed + d.freeze(); // no new word types allowed VOCAB_SIZE = d.size(); // Sort the training sentences in descending order of length @@ -165,7 +165,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++dlc; - dev.push_back(ReadSentence(line, &d)); + dev.push_back(read_sentence(line, &d)); dtoks += dev.back().size(); if (dev.back().front() != kSOS && dev.back().back() != kEOS) { cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; diff --git a/examples/rnnlm-cfsm.cc b/examples/rnnlm-cfsm.cc index 0c5b94086..0029c3b31 100644 --- a/examples/rnnlm-cfsm.cc +++ b/examples/rnnlm-cfsm.cc @@ -74,20 +74,20 @@ struct RNNLanguageModel { // y_t = RNN(x_t) Expression i_y_t = builder.add_input(i_x_t); cur = cfsm.sample(i_y_t); - cerr << (len == 1 ? "" : " ") << d.Convert(cur); + cerr << (len == 1 ? "" : " ") << d.convert(cur); } cerr << endl; } }; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); if (argc != 4 && argc != 5) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt clusters.txt [model.params]\n"; return 1; } - kSOS = d.Convert(""); - kEOS = d.Convert(""); + kSOS = d.convert(""); + kEOS = d.convert(""); Model model; ClassFactoredSoftmaxBuilder cfsm(HIDDEN_DIM, argv[3], &d, &model); vector> training, dev; @@ -100,7 +100,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++tlc; - training.push_back(ReadSentence(line, &d)); + training.push_back(read_sentence(line, &d)); ttoks += training.back().size(); if (training.back().front() != kSOS && training.back().back() != kEOS) { cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; @@ -109,7 +109,7 @@ int main(int argc, char** argv) { } cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; } - d.Freeze(); // no new word types allowed + d.freeze(); // no new word types allowed VOCAB_SIZE = d.size(); int dlc = 0; @@ -120,7 +120,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++dlc; - dev.push_back(ReadSentence(line, &d)); + dev.push_back(read_sentence(line, &d)); dtoks += dev.back().size(); if (dev.back().front() != kSOS && dev.back().back() != kEOS) { cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; diff --git a/examples/rnnlm-givenbag.cc b/examples/rnnlm-givenbag.cc index e1ad3f9da..6fa85fa7d 100644 --- a/examples/rnnlm-givenbag.cc +++ b/examples/rnnlm-givenbag.cc @@ -96,7 +96,7 @@ struct RNNLanguageModel { } if (w == dist.size()) w = kEOS; } - cerr << (len == 1 ? "" : " ") << d.Convert(w); + cerr << (len == 1 ? "" : " ") << d.convert(w); cur = w; } cerr << endl; @@ -104,13 +104,13 @@ struct RNNLanguageModel { }; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; } - kSOS = d.Convert(""); - kEOS = d.Convert(""); + kSOS = d.convert(""); + kEOS = d.convert(""); vector> training, dev; string line; int tlc = 0; @@ -121,7 +121,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++tlc; - training.push_back(ReadSentence(line, &d)); + training.push_back(read_sentence(line, &d)); ttoks += training.back().size(); if (training.back().front() != kSOS && training.back().back() != kEOS) { cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; @@ -130,7 +130,7 @@ int main(int argc, char** argv) { } cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; } - d.Freeze(); // no new word types allowed + d.freeze(); // no new word types allowed VOCAB_SIZE = d.size(); int dlc = 0; @@ -141,7 +141,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++dlc; - dev.push_back(ReadSentence(line, &d)); + dev.push_back(read_sentence(line, &d)); dtoks += dev.back().size(); if (dev.back().front() != kSOS && dev.back().back() != kEOS) { cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; diff --git a/examples/rnnlm-mp.cc b/examples/rnnlm-mp.cc index 0fed7d960..c3d6831c0 100644 --- a/examples/rnnlm-mp.cc +++ b/examples/rnnlm-mp.cc @@ -31,7 +31,7 @@ vector ReadData(string filename) { } string line; while (getline(fs, line)) { - data.push_back(ReadSentence(line, &d)); + data.push_back(read_sentence(line, &d)); } return data; } @@ -72,7 +72,7 @@ int main(int argc, char** argv) { unsigned dev_frequency = 5000; unsigned report_frequency = 10; - cnn::Initialize(argc, argv, true); + cnn::initialize(argc, argv, true); Model model; SimpleSGDTrainer sgd(&model, 0.2); @@ -82,5 +82,5 @@ int main(int argc, char** argv) { RNNLanguageModel rnnlm(model); Learner learner(rnnlm, data.size()); - RunMultiProcess(num_children, &learner, &sgd, data, dev_data, num_iterations, dev_frequency, report_frequency); + run_multi_process(num_children, &learner, &sgd, data, dev_data, num_iterations, dev_frequency, report_frequency); } diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 38d66184e..7aa6bb10b 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -107,7 +107,7 @@ struct RNNLanguageModel { } if (w == dist.size()) w = kEOS; } - cerr << (len == 1 ? "" : " ") << d.Convert(w); + cerr << (len == 1 ? "" : " ") << d.convert(w); cur = w; } cerr << endl; @@ -115,13 +115,13 @@ struct RNNLanguageModel { }; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; } - kSOS = d.Convert(""); - kEOS = d.Convert(""); + kSOS = d.convert(""); + kEOS = d.convert(""); vector> training, dev; string line; int tlc = 0; @@ -132,7 +132,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++tlc; - training.push_back(ReadSentence(line, &d)); + training.push_back(read_sentence(line, &d)); ttoks += training.back().size(); if (training.back().front() != kSOS && training.back().back() != kEOS) { cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; @@ -141,7 +141,7 @@ int main(int argc, char** argv) { } cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; } - d.Freeze(); // no new word types allowed + d.freeze(); // no new word types allowed VOCAB_SIZE = d.size(); int dlc = 0; @@ -152,7 +152,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++dlc; - dev.push_back(ReadSentence(line, &d)); + dev.push_back(read_sentence(line, &d)); dtoks += dev.back().size(); if (dev.back().front() != kSOS && dev.back().back() != kEOS) { cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; diff --git a/examples/rnnlm.h b/examples/rnnlm.h index b255ce5ea..e9c2a1d03 100644 --- a/examples/rnnlm.h +++ b/examples/rnnlm.h @@ -25,8 +25,8 @@ struct RNNLanguageModel { Parameter p_bias; Builder builder; explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { - kSOS = d.Convert(""); - kEOS = d.Convert(""); + kSOS = d.convert(""); + kEOS = d.convert(""); p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); p_bias = model.add_parameters({VOCAB_SIZE}); @@ -86,7 +86,7 @@ struct RNNLanguageModel { } if (w == dist.size()) w = kEOS; } - cerr << (len == 1 ? "" : " ") << d.Convert(w); + cerr << (len == 1 ? "" : " ") << d.convert(w); cur = w; } cerr << endl; diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index 0dccacd3a..eb4a9ec43 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -87,9 +87,9 @@ struct SymbolEmbedding { for (int ind = 1; ind < fields.size(); ++ind){ p_embeding.push_back(std::stod(fields[ind])); } - if (d.Contains(word)){ + if (d.contains(word)){ // cout << "init" << endl; - p_labels.initialize(d.Convert(word), p_embeding); + p_labels.initialize(d.convert(word), p_embeding); } } } @@ -427,7 +427,7 @@ struct SegmentalRNN { unsigned j = cur + dur; assert(j <= len); is_ref[cur][j][y] = true; - // cerr << "Span[" << cur << "," << j << ")=" << td.Convert(y) << endl; + // cerr << "Span[" << cur << "," << j << ")=" << td.convert(y) << endl; cur = j; } assert(cur == len); @@ -719,7 +719,7 @@ pair,vector>> ParseTrainingInstance(const std::string& if (word == sep) break; if (!in) break; } - x.push_back(d.Convert(word)); + x.push_back(d.convert(word)); } if(!test_only){ while(1) { @@ -730,7 +730,7 @@ pair,vector>> ParseTrainingInstance(const std::string& cerr << "mal-formed label: " << word << endl; abort(); } - int y = td.Convert(word.substr(0, p)); + int y = td.convert(word.substr(0, p)); int z = atoi(word.substr(p+1).c_str()); if (z > DATA_MAX_SEG_LEN){ DATA_MAX_SEG_LEN = z; @@ -766,7 +766,7 @@ double evaluate(vector>>& yz_preds, int r_total = 0; int p_w_t_total = 0; int r_w_t_total = 0; - int tag_o = ner_tagging ? td.Convert("O") : -1; + int tag_o = ner_tagging ? td.convert("O") : -1; for (unsigned int i = 0; i < yz_preds.size(); i++){ // for sentence i std::set> gold; @@ -848,11 +848,11 @@ void test_only(SegmentalRNN& segrnn, unsigned int i; for(i = 0; i < yz_pred.size()-1; ++i){ auto pred = yz_pred[i]; - cout << segrnn.td.Convert(pred.first) << ":" << pred.second << " "; + cout << segrnn.td.convert(pred.first) << ":" << pred.second << " "; } if(i >= 0 && (i == yz_pred.size()-1)){ auto pred = yz_pred[i]; - cout << segrnn.td.Convert(pred.first) << ":" << pred.second; + cout << segrnn.td.convert(pred.first) << ":" << pred.second; } cout << endl; } @@ -965,12 +965,12 @@ double evaluate_partial(vector>>& yz_preds, vector>& yz_gold = yz_golds[i]; std::string pred_s = ""; for (auto e : yz_pred){ - pred_s.append(td.Convert(e.first)); + pred_s.append(td.convert(e.first)); total_length_pred++; } std::string gold_s = ""; for (auto e : yz_gold){ - gold_s.append(td.Convert(e.first)); + gold_s.append(td.convert(e.first)); total_length_gold++; } auto dis = edit_distance(pred_s, gold_s); @@ -1010,7 +1010,7 @@ double predict_and_evaluate(SegmentalRNN& segrnn, int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); int test_max_seg_len; int max_consider_sentence_len; unsigned dev_every_i_reports; @@ -1068,9 +1068,9 @@ int main(int argc, char** argv) { vector,vector>>> training, dev, test; read_file(vm["train_file"].as(), d, td, training); - d.Freeze(); // no new word types allowed - td.Freeze(); // no new tag types allowed - d.SetUnk(""); // set UNK to allow the unseen character in the dev and test set + d.freeze(); // no new word types allowed + td.freeze(); // no new tag types allowed + d.set_unk(""); // set UNK to allow the unseen character in the dev and test set read_file(vm["dev_file"].as(), d, td, dev); if (vm["evaluate_test"].as()){ diff --git a/examples/skiprnnlm.cc b/examples/skiprnnlm.cc index 039967102..cea859625 100644 --- a/examples/skiprnnlm.cc +++ b/examples/skiprnnlm.cc @@ -99,19 +99,19 @@ int main(int argc, char** argv) { defaultConf.set(el::Level::Info, el::ConfigurationType::Format, "%datetime{%h:%m:%s} %level %msg"); el::Loggers::reconfigureLogger("default", defaultConf); - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); if (argc != 3 && argc != 4) { LOG(INFO) << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; } - kSOS = d.Convert(""); - kEOS = d.Convert(""); + kSOS = d.convert(""); + kEOS = d.convert(""); // load the corpora Corpus training, dev; LOG(INFO) << "Reading training data from " << argv[1] << "...\n"; read_documents(argv[1], training); - d.Freeze(); // no new word types allowed + d.freeze(); // no new word types allowed VOCAB_SIZE = d.size(); LOG(INFO) << "Reading dev data from " << argv[2] << "...\n"; read_documents(argv[2], dev); @@ -213,7 +213,7 @@ void read_documents(const std::string &filename, Corpus &corpus) { Document doc; while(std::getline(in, line)) { ++lno; - auto sentence = ReadSentence(line, &d); + auto sentence = read_sentence(line, &d); if (sentence.empty()) { // empty lines separate documents corpus.push_back(doc); diff --git a/examples/tag-bilstm.cc b/examples/tag-bilstm.cc index 8f3e179cf..6b11bf5f2 100644 --- a/examples/tag-bilstm.cc +++ b/examples/tag-bilstm.cc @@ -113,14 +113,14 @@ struct RNNLanguageModel { }; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; } - kNONE = td.Convert("*"); - kSOS = d.Convert(""); - kEOS = d.Convert(""); + kNONE = td.convert("*"); + kSOS = d.convert(""); + kEOS = d.convert(""); vector,vector>> training, dev; string line; int tlc = 0; @@ -133,7 +133,7 @@ int main(int argc, char** argv) { ++tlc; int nc = 0; vector x,y; - ReadSentencePair(line, &x, &d, &y, &td); + read_sentence_pair(line, &x, &d, &y, &td); assert(x.size() == y.size()); if (x.size() == 0) { cerr << line << endl; abort(); } training.push_back(make_pair(x,y)); @@ -149,8 +149,8 @@ int main(int argc, char** argv) { cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; cerr << "Tags: " << td.size() << endl; } - d.Freeze(); // no new word types allowed - td.Freeze(); // no new tag types allowed + d.freeze(); // no new word types allowed + td.freeze(); // no new tag types allowed VOCAB_SIZE = d.size(); TAG_SIZE = td.size(); @@ -163,7 +163,7 @@ int main(int argc, char** argv) { while(getline(in, line)) { ++dlc; vector x,y; - ReadSentencePair(line, &x, &d, &y, &td); + read_sentence_pair(line, &x, &d, &y, &td); assert(x.size() == y.size()); dev.push_back(make_pair(x,y)); dtoks += x.size(); diff --git a/examples/textcat.cc b/examples/textcat.cc index 4e8ae308f..7a4b81836 100644 --- a/examples/textcat.cc +++ b/examples/textcat.cc @@ -175,13 +175,13 @@ Expression HingeLoss(const Expression& y_pred, int y_true) { } int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; } - kSOS = d.Convert(""); - kEOS = d.Convert(""); + kSOS = d.convert(""); + kEOS = d.convert(""); vector,int>> training, dev; string line; int tlc = 0; @@ -193,7 +193,7 @@ int main(int argc, char** argv) { while(getline(in, line)) { ++tlc; vector x,y; - ReadSentencePair(line, &x, &d, &y, &ld); + read_sentence_pair(line, &x, &d, &y, &ld); if (x.size() == 0 || y.size() != 1) { cerr << line << endl; abort(); } training.push_back(make_pair(x,y[0])); ttoks += x.size(); @@ -202,8 +202,8 @@ int main(int argc, char** argv) { cerr << "Labels: " << ld.size() << endl; } LABEL_SIZE = ld.size(); - //d.Freeze(); // no new word types allowed - ld.Freeze(); // no new tag types allowed + //d.freeze(); // no new word types allowed + ld.freeze(); // no new tag types allowed int dlc = 0; int dtoks = 0; @@ -214,7 +214,7 @@ int main(int argc, char** argv) { while(getline(in, line)) { ++dlc; vector x,y; - ReadSentencePair(line, &x, &d, &y, &ld); + read_sentence_pair(line, &x, &d, &y, &ld); assert(y.size() == 1); dev.push_back(make_pair(x,y[0])); dtoks += x.size(); diff --git a/examples/tok-embed.cc b/examples/tok-embed.cc index e6ef8f29b..653077cdd 100644 --- a/examples/tok-embed.cc +++ b/examples/tok-embed.cc @@ -216,7 +216,7 @@ struct BiCharLSTM { }; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; @@ -225,8 +225,8 @@ int main(int argc, char** argv) { Trainer* sgd = nullptr; sgd = new SimpleSGDTrainer(&model); vector>> training; - kSOW = d.Convert(""); - kEOW = d.Convert(""); + kSOW = d.convert(""); + kEOW = d.convert(""); PrefixCode pc; { cerr << "Reading training data from " << argv[1] << " ...\n"; @@ -247,7 +247,7 @@ int main(int argc, char** argv) { chars.clear(); while(cur < line.size()) { size_t len = UTF8Len(line[cur]); - chars.push_back(d.Convert(line.substr(cur, len))); + chars.push_back(d.convert(line.substr(cur, len))); cur += len; } training.push_back(make_pair(code, chars)); diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup.cc index 0a123a4cd..6eedc39b3 100644 --- a/examples/xor-batch-lookup.cc +++ b/examples/xor-batch-lookup.cc @@ -14,7 +14,7 @@ using namespace cnn; using namespace cnn::expr; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); // parameters const unsigned HIDDEN_SIZE = 8; @@ -67,7 +67,7 @@ int main(int argc, char** argv) { Expression loss = squared_distance(y_pred, y); Expression sum_loss = sum_batches(loss); - cg.PrintGraphviz(); + cg.print_graphviz(); // train the parameters for (unsigned iter = 0; iter < ITERATIONS; ++iter) { diff --git a/examples/xor-batch.cc b/examples/xor-batch.cc index 2a2980865..3b2da1cc1 100644 --- a/examples/xor-batch.cc +++ b/examples/xor-batch.cc @@ -14,7 +14,7 @@ using namespace cnn; using namespace cnn::expr; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); // parameters const unsigned HIDDEN_SIZE = 8; diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index b8dbf3596..ae860718e 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -14,7 +14,7 @@ using namespace cnn; using namespace cnn::expr; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); // parameters const unsigned HIDDEN_SIZE = 8; @@ -51,7 +51,7 @@ int main(int argc, char** argv) { Expression y_pred = logistic(V*h + a); Expression loss = binary_log_loss(y_pred, y); - cg.PrintGraphviz(); + cg.print_graphviz(); // train the parameters for (unsigned iter = 0; iter < 2000; ++iter) { diff --git a/examples/xor.cc b/examples/xor.cc index 75d673b69..c83f5af00 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -14,7 +14,7 @@ using namespace cnn; using namespace cnn::expr; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); // parameters const unsigned ITERATIONS = 30; @@ -57,7 +57,7 @@ int main(int argc, char** argv) { Expression loss = squared_distance(y_pred, y); // Show the computation graph, just for fun. - cg.PrintGraphviz(); + cg.print_graphviz(); // train the parameters for (unsigned iter = 0; iter < ITERATIONS; ++iter) { diff --git a/rnnlm/lm.cc b/rnnlm/lm.cc index 27dffc63e..4419dd7c4 100644 --- a/rnnlm/lm.cc +++ b/rnnlm/lm.cc @@ -146,7 +146,7 @@ struct RNNLanguageModel { } if (cur == kEOS) break; ++len; - cerr << (len == 1 ? "" : " ") << d.Convert(cur); + cerr << (len == 1 ? "" : " ") << d.convert(cur); Expression x_t = lookup(cg, p_c, cur); h_t = builder.add_input(x_t); } @@ -158,11 +158,11 @@ int main(int argc, char** argv) { cerr << "COMMAND LINE:"; for (unsigned i = 0; i < static_cast(argc); ++i) cerr << ' ' << argv[i]; cerr << endl; - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); po::variables_map conf; InitCommandLine(argc, argv, &conf); - kSOS = d.Convert(""); - kEOS = d.Convert(""); + kSOS = d.convert(""); + kEOS = d.convert(""); LAYERS = conf["layers"].as(); INPUT_DIM = conf["input_dim"].as(); HIDDEN_DIM = conf["hidden_dim"].as(); @@ -191,7 +191,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++tlc; - training.push_back(ReadSentence(line, &d)); + training.push_back(read_sentence(line, &d)); ttoks += training.back().size(); if (training.back().front() == kSOS || training.back().back() == kEOS) { cerr << "Training sentence in " << argv[1] << ":" << tlc << " started with or ended with \n"; @@ -200,8 +200,8 @@ int main(int argc, char** argv) { } cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; } - d.Freeze(); // no new word types allowed - d.SetUnk(""); + d.freeze(); // no new word types allowed + d.set_unk(""); VOCAB_SIZE = d.size(); if (!cfsm) cfsm = new StandardSoftmaxBuilder(HIDDEN_DIM, VOCAB_SIZE, &model); @@ -212,7 +212,7 @@ int main(int argc, char** argv) { ifstream in(testf); assert(in); while(getline(in, line)) { - test.push_back(ReadSentence(line, &d)); + test.push_back(read_sentence(line, &d)); if (test.back().front() == kSOS || test.back().back() == kEOS) { cerr << "Test sentence in " << argv[2] << ":" << tlc << " started with or ended with \n"; abort(); @@ -249,7 +249,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++dlc; - dev.push_back(ReadSentence(line, &d)); + dev.push_back(read_sentence(line, &d)); dtoks += dev.back().size(); if (dev.back().front() == kSOS || dev.back().back() == kEOS) { cerr << "Dev sentence in " << argv[2] << ":" << tlc << " started with or ended with \n"; @@ -382,7 +382,7 @@ int main(int argc, char** argv) { } // Score hypothesis ComputationGraph cg; - lm.BuildLMGraph(ReadSentence(fields[HYP_FIELD], &d), cg, false); + lm.BuildLMGraph(read_sentence(fields[HYP_FIELD], &d), cg, false); double loss = as_scalar(cg.forward()); // Add score ostringstream os; diff --git a/tests/test-cnn.cc b/tests/test-cnn.cc index 1023ee147..6243ebaaa 100644 --- a/tests/test-cnn.cc +++ b/tests/test-cnn.cc @@ -10,7 +10,7 @@ struct ConfigureCNNTest { } char **argv = &av[0]; int argc = av.size(); - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); } ~ConfigureCNNTest() { for (auto x : av) free(x); diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 640310f46..672b297a7 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -11,14 +11,14 @@ using namespace std; struct NodeTest { NodeTest() { - // Initialize if necessary + // initialize if necessary if(default_device == nullptr) { for (auto x : {"NodeTest", "--cnn-mem", "10"}) { av.push_back(strdup(x)); } char **argv = &av[0]; int argc = av.size(); - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); } ones3_vals = {1.f,1.f,1.f}; @@ -89,7 +89,7 @@ BOOST_AUTO_TEST_CASE( negate_gradient ) { Expression x1 = parameter(cg, param1); Expression y = -x1; input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression operator+(const Expression& x, const Expression& y); @@ -99,7 +99,7 @@ BOOST_AUTO_TEST_CASE( add_gradient ) { Expression x2 = parameter(cg, param2); Expression y = x1+x2; input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression logsumexp(const std::initializer_list& xs); @@ -108,7 +108,7 @@ BOOST_AUTO_TEST_CASE( logsumexp_gradient ) { Expression x1 = parameter(cg, param_scalar1); Expression x2 = parameter(cg, param_scalar2); logsumexp({x1, x2}); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression operator+(const Expression& x, real y); @@ -117,7 +117,7 @@ BOOST_AUTO_TEST_CASE( addscalar_gradient ) { Expression x1 = parameter(cg, param1); Expression y = x1+2.0; input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression operator+(real x, const Expression& y); @@ -126,7 +126,7 @@ BOOST_AUTO_TEST_CASE( scalaradd_gradient ) { Expression x1 = parameter(cg, param1); Expression y = 2.0+x1; input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression operator-(const Expression& x, const Expression& y); @@ -136,7 +136,7 @@ BOOST_AUTO_TEST_CASE( subtract_gradient ) { Expression x2 = parameter(cg, param2); Expression y = x1+x2; input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression operator-(real x, const Expression& y); @@ -145,7 +145,7 @@ BOOST_AUTO_TEST_CASE( scalarsubtract_gradient ) { Expression x1 = parameter(cg, param1); Expression y = 2.0-x1; input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression operator-(const Expression& x, real y); @@ -154,7 +154,7 @@ BOOST_AUTO_TEST_CASE( subtractscalar_gradient ) { Expression x1 = parameter(cg, param1); Expression y = x1-2.0; input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression operator*(const Expression& x, const Expression& y); @@ -165,7 +165,7 @@ BOOST_AUTO_TEST_CASE( multiply_gradient ) { Expression y = x1*transpose(x2); Expression ones3 = input(cg, {1,3}, ones3_vals); ones3 * y * transpose(ones3); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression operator*(const Expression& x, const Expression& y); @@ -176,7 +176,7 @@ BOOST_AUTO_TEST_CASE( multiply_batch_gradient ) { Expression y = x1*transpose(x2); Expression ones3 = input(cg, {1,3}, ones3_vals); sum_batches(ones3 * y * transpose(ones3)); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression operator*(const Expression& x, const Expression& y); @@ -188,7 +188,7 @@ BOOST_AUTO_TEST_CASE( affine_gradient ) { Expression y = affine_transform({x1, x2, scalar}); Expression ones3 = input(cg, {1,3}, ones3_vals); ones3 * sqrt(y); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression operator*(const Expression& x, const Expression& y); @@ -200,7 +200,7 @@ BOOST_AUTO_TEST_CASE( affine_batch_gradient ) { Expression y = affine_transform({x1, x2, scalar}); Expression ones3 = input(cg, {1,3}, ones3_vals); sum_batches(ones3 * sqrt(y)); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression operator*(const Expression& x, const Expression& y); @@ -212,7 +212,7 @@ BOOST_AUTO_TEST_CASE( affine_batch_col_gradient ) { Expression y = affine_transform({transpose(x1), scalar, x2}); Expression ones3 = input(cg, {3,1}, ones3_vals); sum_batches(sqrt(y) * ones3); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression operator*(const Expression& x, const Expression& y); @@ -224,7 +224,7 @@ BOOST_AUTO_TEST_CASE( affine_batch2_gradient ) { Expression y = affine_transform({x1, scalar, transpose(x2) }); Expression ones3 = input(cg, {3,1}, ones3_vals); sum_batches(sqrt(y) * ones3); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression operator*(const Expression& x, const Expression& y); @@ -236,7 +236,7 @@ BOOST_AUTO_TEST_CASE( affine_batch3_gradient ) { Expression y = affine_transform({x1, x2, inp }); Expression ones3 = input(cg, {1,3}, ones3_vals); sum_batches(ones3 * sqrt(y)); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression operator*(const Expression& x, float y); @@ -245,7 +245,7 @@ BOOST_AUTO_TEST_CASE( multiplyscalar_gradient ) { Expression x1 = parameter(cg, param1); Expression y = x1*2.0; input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // inline Expression operator*(float y, const Expression& x) { return x * y; } @@ -254,7 +254,7 @@ BOOST_AUTO_TEST_CASE( scalarmultiply_gradient ) { Expression x1 = parameter(cg, param1); Expression y = 2.0*x1; input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // inline Expression operator/(const Expression& x, float y) { return x * (1.f / y); } @@ -263,7 +263,7 @@ BOOST_AUTO_TEST_CASE( dividescalar_gradient ) { Expression x1 = parameter(cg, param1); Expression y = x1/2.0; input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression cdiv(const Expression& x, const Expression& y); @@ -273,7 +273,7 @@ BOOST_AUTO_TEST_CASE( cdiv_gradient ) { Expression x2 = parameter(cg, param2); Expression y = cdiv(x1, x2); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression cdiv(const Expression& x, const Expression& y); @@ -283,7 +283,7 @@ BOOST_AUTO_TEST_CASE( cdiv_batch_gradient ) { Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = cdiv(x1, x2) + cdiv(x2, x1); sum_batches(input(cg, {1,3}, ones3_vals) * y); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression colwise_add(const Expression& x, const Expression& bias); @@ -294,7 +294,7 @@ BOOST_AUTO_TEST_CASE( colwise_add_gradient ) { Expression y = colwise_add(x1 * transpose(x2), x2); Expression ones3 = input(cg, {1,3}, ones3_vals); ones3 * y * transpose(ones3); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression concatenate_cols(const std::initializer_list& xs); @@ -305,7 +305,7 @@ BOOST_AUTO_TEST_CASE( concatenate_cols_gradient ) { Expression y = concatenate_cols({x1, x2, x1}); Expression ones3 = input(cg, {1,3}, ones3_vals); ones3 * y * transpose(ones3); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression concatenate(const std::initializer_list& xs); @@ -316,7 +316,7 @@ BOOST_AUTO_TEST_CASE( concatenate_gradient ) { Expression y = concatenate({x1, x2, x1}); Expression ones3 = input(cg, {1,3}, ones3_vals); ones3 * y * transpose(ones3); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b); @@ -328,7 +328,7 @@ BOOST_AUTO_TEST_CASE( contract3d_1d_gradient ) { Expression y = contract3d_1d(cube1, x1, square1); Expression ones3 = input(cg, {1,3}, ones3_vals); ones3 * y * transpose(ones3); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z, const Expression& b); @@ -341,7 +341,7 @@ BOOST_AUTO_TEST_CASE( contract3d_1d_1d_gradient ) { Expression y = contract3d_1d_1d(cube1, x1, x2, x3); Expression ones3 = input(cg, {1,3}, ones3_vals); ones3 * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression sqrt(const Expression& x); @@ -350,7 +350,7 @@ BOOST_AUTO_TEST_CASE( sqrt_gradient ) { Expression x3 = parameter(cg, param3); Expression y = sqrt(x3); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression erf(const Expression& x); @@ -359,7 +359,7 @@ BOOST_AUTO_TEST_CASE( erf_gradient ) { Expression x1 = parameter(cg, param1); Expression y = erf(x1); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression tanh(const Expression& x); @@ -368,7 +368,7 @@ BOOST_AUTO_TEST_CASE( tanh_gradient ) { Expression x1 = parameter(cg, param1); Expression y = tanh(x1); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression exp(const Expression& x); @@ -377,7 +377,7 @@ BOOST_AUTO_TEST_CASE( exp_gradient ) { Expression x1 = parameter(cg, param1); Expression y = exp(x1); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression square(const Expression& x); @@ -386,7 +386,7 @@ BOOST_AUTO_TEST_CASE( square_gradient ) { Expression x1 = parameter(cg, param1); Expression y = square(x1); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression cube(const Expression& x); @@ -395,7 +395,7 @@ BOOST_AUTO_TEST_CASE( cube_gradient ) { Expression x1 = parameter(cg, param1); Expression y = cube(x1); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression lgamma(const Expression& x); @@ -404,7 +404,7 @@ BOOST_AUTO_TEST_CASE( lgamma_gradient ) { Expression x2 = parameter(cg, param2); Expression y = lgamma(x2); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression log(const Expression& x); @@ -413,7 +413,7 @@ BOOST_AUTO_TEST_CASE( log_gradient ) { Expression x3 = parameter(cg, param3); Expression y = log(x3); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression logistic(const Expression& x); @@ -422,7 +422,7 @@ BOOST_AUTO_TEST_CASE( logistic_gradient ) { Expression x1 = parameter(cg, param1); Expression y = logistic(x1); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression rectify(const Expression& x); @@ -431,7 +431,7 @@ BOOST_AUTO_TEST_CASE( rectify_gradient ) { Expression x1 = parameter(cg, param1); Expression y = rectify(x1); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression hinge(const Expression& x, unsigned index, float m = 1.0); @@ -440,7 +440,7 @@ BOOST_AUTO_TEST_CASE( hinge_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); hinge(x1, index, 0.5); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression hinge(const Expression& x, unsigned index, float m = 1.0); @@ -450,7 +450,7 @@ BOOST_AUTO_TEST_CASE( hinge_batch_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); sum_batches(hinge(x1+x2, idx, 2.f)); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0); @@ -459,7 +459,7 @@ BOOST_AUTO_TEST_CASE( hingeptr_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); hinge(x1, &index, 0.5); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression log_softmax(const Expression& x); @@ -468,7 +468,7 @@ BOOST_AUTO_TEST_CASE( log_softmax_gradient ) { Expression x1 = parameter(cg, param1); Expression y = log_softmax(x1); input(cg, {1,3}, first_one_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression log_softmax(const Expression& x, unsigned v); @@ -478,7 +478,7 @@ BOOST_AUTO_TEST_CASE( log_softmax_batch_gradient ) { Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = log_softmax(x1+x2); sum_batches(input(cg, {1,3}, first_one_vals) * y); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression log_softmax(const Expression& x, const std::vector& restriction); @@ -488,7 +488,7 @@ BOOST_AUTO_TEST_CASE( restricted_log_softmax_gradient ) { Expression x3 = parameter(cg, param3); Expression y = exp( log_softmax(x3, restriction) ); input(cg, {1,3}, first_one_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression softmax(const Expression& x); @@ -497,7 +497,7 @@ BOOST_AUTO_TEST_CASE( softmax_gradient ) { Expression x1 = parameter(cg, param1); Expression y = log(softmax(x1)); input(cg, {1,3}, first_one_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression softmax(const Expression& x, unsigned v); @@ -507,7 +507,7 @@ BOOST_AUTO_TEST_CASE( softmax_batch_gradient ) { Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = log(softmax(x1+x2)); sum_batches(input(cg, {1,3}, first_one_vals) * y); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression sparsemax(const Expression& x); @@ -516,7 +516,7 @@ BOOST_AUTO_TEST_CASE( sparsemax_gradient ) { Expression x1 = parameter(cg, param1); Expression y = sparsemax(x1); input(cg, {1,3}, first_one_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression sparsemax_loss(const Expression& x); @@ -525,7 +525,7 @@ BOOST_AUTO_TEST_CASE( sparsemax_loss_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); sparsemax_loss(x1, idxs); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression softsign(const Expression& x); @@ -534,7 +534,7 @@ BOOST_AUTO_TEST_CASE( softsign_gradient ) { Expression x1 = parameter(cg, param1); Expression y = softsign(x1); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression pow(const Expression& x, const Expression& y); @@ -544,7 +544,7 @@ BOOST_AUTO_TEST_CASE( pow_gradient ) { Expression x_scalar1 = parameter(cg, param_scalar1); Expression y = pow(x3, x_scalar1); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression min(const Expression& x, const Expression& y); @@ -554,7 +554,7 @@ BOOST_AUTO_TEST_CASE( min_gradient ) { Expression x2 = parameter(cg, param2); Expression y = min(x1, x2); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression max(const Expression& x, const Expression& y); @@ -564,7 +564,7 @@ BOOST_AUTO_TEST_CASE( max_gradient ) { Expression x2 = parameter(cg, param2); Expression y = max(x1, x2); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // TODO: Noise is random, so it cannot be tested simply? @@ -574,7 +574,7 @@ BOOST_AUTO_TEST_CASE( max_gradient ) { // Expression x1 = parameter(cg, param1); // Expression y = noise(x1, 0.5); // input(cg, {1,3}, ones3_vals) * y; -// BOOST_CHECK(CheckGrad(mod, cg, 0)); +// BOOST_CHECK(check_grad(mod, cg, 0)); // } // TODO: Dropout scales the gradients at training time, so they don't match. @@ -584,7 +584,7 @@ BOOST_AUTO_TEST_CASE( max_gradient ) { // Expression x1 = parameter(cg, param1); // Expression y = dropout(x1, 0.5); // input(cg, {1,3}, ones3_vals) * y; -// BOOST_CHECK(CheckGrad(mod, cg, 0)); +// BOOST_CHECK(check_grad(mod, cg, 0)); // } // TODO: Dropout scales the gradients at training time, so they don't match. @@ -596,7 +596,7 @@ BOOST_AUTO_TEST_CASE( reshape_gradient ) { Expression x1 = parameter(cg, param1); Expression y = reshape(x1, {1,3}); y * input(cg, {3}, ones3_vals); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression transpose(const Expression& x); @@ -605,7 +605,7 @@ BOOST_AUTO_TEST_CASE( transpose_gradient ) { Expression x1 = parameter(cg, param1); Expression y = softsign(x1); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression trace_of_product(const Expression& x, const Expression& y); @@ -614,7 +614,7 @@ BOOST_AUTO_TEST_CASE( inverse_gradient ) { Expression x = parameter(cg, param_square1); Expression y = inverse(x); input(cg, {1,3}, ones3_vals) * y * input(cg, {3,1}, ones3_vals); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression trace_of_product(const Expression& x, const Expression& y); @@ -623,7 +623,7 @@ BOOST_AUTO_TEST_CASE( trace_of_product_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); trace_of_product(x1, x2); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression cwise_multiply(const Expression& x, const Expression& y); @@ -633,7 +633,7 @@ BOOST_AUTO_TEST_CASE( cwise_multiply_gradient ) { Expression x2 = parameter(cg, param2); Expression y = cwise_multiply(x1, x2); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression cwise_multiply(const Expression& x, const Expression& y); @@ -643,7 +643,7 @@ BOOST_AUTO_TEST_CASE( cwise_multiply_batch_gradient ) { Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = cwise_multiply(x1, x2) + cwise_multiply(x2, x1); sum_batches(input(cg, {1,3}, ones3_vals) * y); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression dot_product(const Expression& x, const Expression& y); @@ -652,7 +652,7 @@ BOOST_AUTO_TEST_CASE( dot_product_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); dot_product(x1, x2); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression dot_product(const Expression& x, const Expression& y); @@ -661,7 +661,7 @@ BOOST_AUTO_TEST_CASE( dot_product_batch_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); sum_batches(dot_product(x1, x2) + dot_product(x2, x1) * 2); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression squared_distance(const Expression& x, const Expression& y); @@ -670,7 +670,7 @@ BOOST_AUTO_TEST_CASE( squared_distance_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); squared_distance(x1, x2); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression huber_distance(const Expression& x, const Expression& y, float c = 1.345f); @@ -679,7 +679,7 @@ BOOST_AUTO_TEST_CASE( huber_distance_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); huber_distance(x1, x2); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression l1_distance(const Expression& x, const Expression& y); @@ -688,7 +688,7 @@ BOOST_AUTO_TEST_CASE( l1_distance_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); l1_distance(x1, x2); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression binary_log_loss(const Expression& x, const Expression& y); @@ -697,7 +697,7 @@ BOOST_AUTO_TEST_CASE( binary_log_loss_gradient ) { Expression x1 = logistic( parameter(cg, param1) ); Expression x2 = input(cg, {3}, ones3_vals); binary_log_loss(x1, x2); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0); @@ -706,7 +706,7 @@ BOOST_AUTO_TEST_CASE( pairwise_rank_loss_gradient ) { Expression x_scalar1 = parameter(cg, param_scalar1); Expression x_scalar2 = parameter(cg, param_scalar2); pairwise_rank_loss(x_scalar1, x_scalar2); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression poisson_loss(const Expression& x, unsigned y); @@ -714,7 +714,7 @@ BOOST_AUTO_TEST_CASE( possion_loss_gradient ) { cnn::ComputationGraph cg; Expression scalar = parameter(cg, param_scalar1); poisson_loss(scalar, 3); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression conv1d_narrow(const Expression& x, const Expression& f); @@ -724,7 +724,7 @@ BOOST_AUTO_TEST_CASE( conv1d_narrow_gradient ) { Expression xkernel = parameter(cg, param_kernel1); Expression y = conv1d_narrow(xsquare, xkernel); input(cg, {1,3}, ones3_vals) * y * input(cg, {2,1}, ones2_vals); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression conv1d_wide(const Expression& x, const Expression& f); @@ -733,7 +733,7 @@ BOOST_AUTO_TEST_CASE( conv1d_wide_gradient ) { Expression xkernel = parameter(cg, param_kernel1); Expression y = conv1d_wide(xkernel, xkernel); input(cg, {1,3}, ones3_vals) * y * input(cg, {3,1}, ones3_vals); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression filter1d_narrow(const Expression& x, const Expression& f); @@ -743,7 +743,7 @@ BOOST_AUTO_TEST_CASE( filter1d_narrow_gradient ) { Expression xfilter = parameter(cg, param_filter1); Expression y = filter1d_narrow(xsquare, xfilter); input(cg, {1,2}, ones3_vals) * y * input(cg, {2,1}, ones2_vals); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression kmax_pooling(const Expression& x, unsigned k); @@ -752,7 +752,7 @@ BOOST_AUTO_TEST_CASE( kmax_pooling_keq1_gradient ) { Expression xsquare = parameter(cg, param_square1); Expression y = tanh(kmax_pooling(xsquare, 1)); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression kmax_pooling(const Expression& x, unsigned k); @@ -761,7 +761,7 @@ BOOST_AUTO_TEST_CASE( kmax_pooling_keq2_gradient ) { Expression xsquare = parameter(cg, param_square1); Expression y = tanh(kmax_pooling(xsquare, 2)); input(cg, {1,3}, ones3_vals) * y * input(cg, {2,1}, ones2_vals); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression fold_rows(const Expression& x, unsigned nrows=2); @@ -770,7 +770,7 @@ BOOST_AUTO_TEST_CASE( fold_rows_gradient ) { Expression x4 = parameter(cg, param4); Expression y = fold_rows(x4, 2); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression average_cols(const Expression& x); @@ -779,7 +779,7 @@ BOOST_AUTO_TEST_CASE( average_cols_gradient ) { Expression xsquare = parameter(cg, param_square1); Expression y = tanh(average_cols(xsquare)); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression sum_cols(const Expression& x); @@ -788,7 +788,7 @@ BOOST_AUTO_TEST_CASE( sum_cols_gradient ) { Expression xsquare = parameter(cg, param_square1); Expression y = tanh(sum_cols(xsquare)); input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } @@ -801,7 +801,7 @@ BOOST_AUTO_TEST_CASE( pick_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); pick(x1, idx); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression pick(const Expression& x, unsigned* pv); @@ -810,7 +810,7 @@ BOOST_AUTO_TEST_CASE( pickptr_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); pick(x1, &idx); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression pick(const Expression& x, unsigned v); @@ -820,7 +820,7 @@ BOOST_AUTO_TEST_CASE( pick_batch_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); sum_batches(pick(x1+x2, idx)); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression pickrange(const Expression& x, unsigned v, unsigned u); @@ -829,7 +829,7 @@ BOOST_AUTO_TEST_CASE( pickrange_gradient ) { Expression x1 = parameter(cg, param1); Expression y = pickrange(x1, 0, 2); input(cg, {1,2}, ones2_vals) * y; - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression pickneglogsoftmax(const Expression& x, unsigned v); @@ -838,7 +838,7 @@ BOOST_AUTO_TEST_CASE( pickneglogsoftmax_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); pickneglogsoftmax(x1, idx); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression pickneglogsoftmax(const Expression& x, unsigned v); @@ -848,7 +848,7 @@ BOOST_AUTO_TEST_CASE( pickneglogsoftmax_batch_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); sum_batches(pickneglogsoftmax(x1+x2, idx)); - BOOST_CHECK(CheckGrad(mod, cg, 0)); + BOOST_CHECK(check_grad(mod, cg, 0)); } // Expression sparse_input(vector& ids, vector& src, float def); diff --git a/tests/test-trainers.cc b/tests/test-trainers.cc index 9ae0656a6..78d3b1869 100644 --- a/tests/test-trainers.cc +++ b/tests/test-trainers.cc @@ -12,14 +12,14 @@ using namespace std; struct TrainerTest { TrainerTest() { - // Initialize if necessary + // initialize if necessary if(default_device == nullptr) { for (auto x : {"TrainerTest", "--cnn-mem", "10"}) { av.push_back(strdup(x)); } char **argv = &av[0]; int argc = av.size(); - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); } ones_vals = {1.f,1.f,1.f}; param_vals = {1.1f,-2.2f,3.3f}; diff --git a/tutorial/0_multiply.cc b/tutorial/0_multiply.cc index a18526a67..6935cb294 100644 --- a/tutorial/0_multiply.cc +++ b/tutorial/0_multiply.cc @@ -9,7 +9,7 @@ using namespace cnn; using namespace cnn::expr; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); ComputationGraph cg; float ia, ib; diff --git a/tutorial/1_linear_regression.cc b/tutorial/1_linear_regression.cc index 664b6f63b..4d2242613 100644 --- a/tutorial/1_linear_regression.cc +++ b/tutorial/1_linear_regression.cc @@ -10,7 +10,7 @@ using namespace cnn; using namespace cnn::expr; int main(int argc, char** argv) { - cnn::Initialize(argc, argv); + cnn::initialize(argc, argv); default_random_engine rng; normal_distribution normal(0.0f, 1.0f); From 5fe5edf62bc390dab4590c3779905e88b5689370 Mon Sep 17 00:00:00 2001 From: dhg Date: Mon, 25 Jul 2016 14:40:39 -0700 Subject: [PATCH 629/965] Updated pycnn to match conversion of function names to snake_case --- pycnn/pycnn.pxd | 4 ++-- pycnn/pycnn.py | 2 +- pycnn/pycnn.pyx | 8 ++++---- pycnn/pycnn_viz.py | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index 17dafd09a..cfef45ae1 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -4,7 +4,7 @@ from libcpp.string cimport string ctypedef float real cdef extern from "cnn/init.h" namespace "cnn": - cdef void Initialize(int& argc, char **& argv, unsigned random_seed) + cdef void initialize(int& argc, char **& argv, unsigned random_seed) cdef extern from "cnn/dim.h" namespace "cnn": cdef cppclass CDim "cnn::Dim": @@ -93,7 +93,7 @@ cdef extern from "cnn/cnn.h" namespace "cnn": void checkpoint() void revert() - void PrintGraphviz() const + void print_graphviz() const cdef extern from "cnn/training.h" namespace "cnn": cdef cppclass CSimpleSGDTrainer "cnn::SimpleSGDTrainer": diff --git a/pycnn/pycnn.py b/pycnn/pycnn.py index 630a8f004..40f427c71 100644 --- a/pycnn/pycnn.py +++ b/pycnn/pycnn.py @@ -2,6 +2,6 @@ if '--pycnn-viz' in sys.argv: from pycnn_viz import * else: - def PrintGraphviz(**kwarge): + def print_graphviz(**kwarge): print "Run with --pycnn-viz to get the visualization behavior." from _pycnn import * diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 57bd0a12e..271094f3d 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -43,10 +43,10 @@ cdef init(random_seed=None): c_argv[idx] = s if random_seed is None: - pycnn.Initialize(argc,c_argv, 0) + pycnn.initialize(argc,c_argv, 0) else: if random_seed == 0: random_seed = 1 - pycnn.Initialize(argc,c_argv, random_seed) + pycnn.initialize(argc,c_argv, random_seed) free(c_argv) init() # TODO: allow different random seeds @@ -432,8 +432,8 @@ cdef class ComputationGraph: cpdef backward(self): self.thisptr.backward() - cpdef PrintGraphviz(self): - self.thisptr.PrintGraphviz() + cpdef print_graphviz(self): + self.thisptr.print_graphviz() cpdef void checkpoint(self): self.thisptr.checkpoint() diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py index 599e77ba6..6f2a8b704 100644 --- a/pycnn/pycnn_viz.py +++ b/pycnn/pycnn_viz.py @@ -938,7 +938,7 @@ def collapse_birnn_states(nodes, compact): new_nodes.append(GVNode(name, input_dim, label, output_dim, new_children, features, node_type, expr_name)) return (new_nodes, rnn_groups) -def PrintGraphviz(compact=False, show_dims=True, expression_names=None, lookup_names=None, collapse_birnns=False): +def print_graphviz(compact=False, show_dims=True, expression_names=None, lookup_names=None, collapse_birnns=False): original_nodes = make_network_graph(compact, expression_names, lookup_names) nodes = original_nodes collapse_to = dict() From 3f89652d83024306dc5241690b78b2cae537549f Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 26 Jul 2016 17:23:36 +0900 Subject: [PATCH 630/965] Made it possible to recover from overloaded GPUs --- cnn/cuda.cc | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cnn/cuda.cc b/cnn/cuda.cc index a34670dec..b5b77c2dd 100644 --- a/cnn/cuda.cc +++ b/cnn/cuda.cc @@ -136,11 +136,17 @@ vector initialize_gpu(int& argc, char**& argv) { abort(); } CUDA_CHECK(cudaSetDevice(i)); - CUDA_CHECK(cudaMemGetInfo( &free_bytes, &total_bytes )); + try { + CUDA_CHECK(cudaMemGetInfo( &free_bytes, &total_bytes )); + cerr << "[cnn] Memory Free (GB): " << free_bytes/1.0e9 << "/" << total_bytes/1.0e9 << endl; + cerr << "[cnn]" << endl; + gpu_free_mem[i] = free_bytes; + } catch(cnn::cuda_exception e) { + cerr << "[cnn] FAILED to get free memory" << endl; + gpu_free_mem[i] = 0; + cudaGetLastError(); + } CUDA_CHECK(cudaDeviceReset()); - cerr << "[cnn] Memory Free (GB): " << free_bytes/1.0e9 << "/" << total_bytes/1.0e9 << endl; - cerr << "[cnn]" << endl; - gpu_free_mem[i] = free_bytes; } stable_sort(gpus.begin(), gpus.end(), [&](int a, int b) -> bool { return gpu_free_mem[a] > gpu_free_mem[b]; }); gpus.resize(requested_gpus); From 4d87c4188126659b69b426b6014728a202cbcfd8 Mon Sep 17 00:00:00 2001 From: armatthews Date: Wed, 27 Jul 2016 22:56:26 -0400 Subject: [PATCH 631/965] Allow batch size in run_single_process --- cnn/mp.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cnn/mp.h b/cnn/mp.h index 5cbb1235b..aed0a07c8 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -295,7 +295,7 @@ namespace cnn { template void run_single_process(ILearner* learner, Trainer* trainer, const std::vector& train_data, - const std::vector& dev_data, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency) { + const std::vector& dev_data, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency, unsigned batch_size) { std::vector train_indices(train_data.size()); std::iota(train_indices.begin(), train_indices.end(), 0); @@ -305,6 +305,7 @@ namespace cnn { S best_dev_loss = S(); bool first_dev_run = true; std::mt19937 rndeng(42); + unsigned batch_counter = 0; for (unsigned iter = 0; iter < num_iterations && !stop_requested; ++iter) { // Shuffle the training data indices std::shuffle(train_indices.begin(), train_indices.end(), rndeng); @@ -327,7 +328,10 @@ namespace cnn { S datum_loss = learner->LearnFromDatum(datum, true); batch_loss += datum_loss; train_loss += datum_loss; - trainer->update(); + if (++batch_counter == batch_size) { + trainer->update(1.0 / batch_size); + batch_counter = 0; + } data_processed++; if (--data_until_report == 0) { From 04f9a08a636efe2e1c468f0a8c5c233cb3ac1898 Mon Sep 17 00:00:00 2001 From: armatthews Date: Thu, 28 Jul 2016 07:49:23 -0400 Subject: [PATCH 632/965] Fixed accidental removal of support for shared memory parameters --- cnn/devices.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cnn/devices.cc b/cnn/devices.cc index 2cbc5603a..0c6042346 100644 --- a/cnn/devices.cc +++ b/cnn/devices.cc @@ -104,8 +104,9 @@ Device_CPU::Device_CPU(int my_id, const DeviceMempoolSizes & mbs, bool shared) : edevice = new Eigen::DefaultDevice; // this is the big memory allocation. - for(size_t i = 0; i < 3; ++i) + for(size_t i = 0; i < 2; ++i) pools[i] = new AlignedMemoryPool((mbs.used[i] << 20), &cpu_mem); + pools[2] = new AlignedMemoryPool((mbs.used[2] << 20), shmem); } Device_CPU::~Device_CPU() {} From 68fff529281324e9755a29f9817f7a04515d11a3 Mon Sep 17 00:00:00 2001 From: dhg Date: Sat, 30 Jul 2016 12:13:48 -0700 Subject: [PATCH 633/965] Added GRUBuilder to PyCNN --- pycnn/pybridge.h | 4 ++++ pycnn/pycnn.pxd | 18 ++++++++++++++++++ pycnn/pycnn.pyx | 20 +++++++++++++++++++- pycnn/pycnn_viz.py | 11 ++++++++++- 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/pycnn/pybridge.h b/pycnn/pybridge.h index 794682fc8..a07a14b2d 100644 --- a/pycnn/pybridge.h +++ b/pycnn/pybridge.h @@ -102,6 +102,10 @@ struct ModelLoader { ia >> p; return this; } + ModelLoader* fill_gru_builder(cnn::GRUBuilder &p) { + ia >> p; return this; + } + ModelLoader* fill_hsm_builder(cnn::HierarchicalSoftmaxBuilder &p) { ia >> p; return this; } diff --git a/pycnn/pycnn.pxd b/pycnn/pycnn.pxd index cfef45ae1..26ffb1dfb 100644 --- a/pycnn/pycnn.pxd +++ b/pycnn/pycnn.pxd @@ -268,6 +268,22 @@ cdef extern from "cnn/rnn.h" namespace "cnn": #vector[CExpression] get_s(CRNNPointer i) #CRNNPointer state() +cdef extern from "cnn/gru.h" namespace "cnn": + cdef cppclass CGRUBuilder "cnn::GRUBuilder" (CRNNBuilder): + CGRUBuilder() + CGRUBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) + #void new_graph(CComputationGraph &cg) + #void start_new_sequence(vector[CExpression] ces) + #CExpression add_input(CExpression &x) + #CExpression add_input(CRNNPointer prev, CExpression &x) + #void rewind_one_step() + #CExpression back() + #vector[CExpression] final_h() + #vector[CExpression] final_s() + #vector[CExpression] get_h(CRNNPointer i) + #vector[CExpression] get_s(CRNNPointer i) + #CRNNPointer state() + cdef extern from "cnn/lstm.h" namespace "cnn": cdef cppclass CLSTMBuilder "cnn::LSTMBuilder" (CRNNBuilder): CLSTMBuilder() @@ -304,6 +320,7 @@ cdef extern from "pybridge.h" namespace "pycnn": CModelSaver(string filename, CModel *model) CModelSaver add_parameter(CParameters p) CModelSaver add_lookup_parameter(CLookupParameters lp) + CModelSaver add_gru_builder(CGRUBuilder b) CModelSaver add_lstm_builder(CLSTMBuilder b) CModelSaver add_srnn_builder(CSimpleRNNBuilder b) void done() @@ -312,6 +329,7 @@ cdef extern from "pybridge.h" namespace "pycnn": CModelLoader(string filename, CModel *model) CModelSaver fill_parameter(CParameters p) CModelSaver fill_lookup_parameter(CLookupParameters lp) + CModelSaver fill_gru_builder(CGRUBuilder lp) CModelSaver fill_lstm_builder(CLSTMBuilder lp) CModelSaver fill_srnn_builder(CSimpleRNNBuilder lp) void done() diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 271094f3d..8a5c15bcf 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -17,7 +17,6 @@ import os.path # TODO: # c2w.h (build a word-from-letters encoder) # dict.h -- do we even need it? -# gru.h -- it is not the same as lstm/rnn for some reason. but should be trivial to add # Examples: # V xor @@ -234,6 +233,9 @@ cdef class Model: # {{{ elif isinstance(c, LookupParameters): fh.write("lookup ") saver.add_lookup_parameter((c).thisptr) + elif isinstance(c, GRUBuilder): + fh.write("gru_builder ") + saver.add_gru_builder(((c).thisptr)[0]) elif isinstance(c, LSTMBuilder): fh.write("lstm_builder ") saver.add_lstm_builder(((c).thisptr)[0]) @@ -266,6 +268,7 @@ cdef class Model: # {{{ cdef _load_one(self, itypes, CModelLoader *loader, pfh): cdef CParameters p cdef CLookupParameters lp + cdef GRUBuilder gb_ cdef LSTMBuilder lb_ cdef SimpleRNNBuilder sb_ tp = itypes.next() @@ -277,6 +280,10 @@ cdef class Model: # {{{ loader.fill_lookup_parameter(lp) param = LookupParameters.wrap_ptr(lp) return param + elif tp == "gru_builder": + gb_ = GRUBuilder(0,0,0,self) # empty builder + loader.fill_gru_builder((gb_.thisptr)[0]) + return gb_ elif tp == "lstm_builder": lb_ = LSTMBuilder(0,0,0,self) # empty builder loader.fill_lstm_builder((lb_.thisptr)[0]) @@ -983,6 +990,17 @@ cdef class SimpleRNNBuilder(_RNNBuilder): # {{{ def whoami(self): return "SimpleRNNBuilder" #}}} +cdef class GRUBuilder(_RNNBuilder): # {{{ + def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): + if layers > 0: + self.thisptr = new CGRUBuilder(layers, input_dim, hidden_dim, model.thisptr) + else: + self.thisptr = new CGRUBuilder() + self.cg_version = -1 + + def whoami(self): return "GRUBuilder" +# }}} + cdef class LSTMBuilder(_RNNBuilder): # {{{ def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): if layers > 0: diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py index 6f2a8b704..f37f2c8e3 100644 --- a/pycnn/pycnn_viz.py +++ b/pycnn/pycnn_viz.py @@ -471,6 +471,16 @@ def __init__(self, layers, input_dim, hidden_dim, model): self._init_state = None self.builder_version = new_builder_num() def whoami(self): return "SimpleRNNBuilder" +class GRUBuilder(_RNNBuilder): + def __init__(self, layers, input_dim, hidden_dim, model): + self.cg_version = -1 + self.layers = layers + self.input_dim = input_dim + self.hidden_dim = hidden_dim + self.model = model + self._init_state = None + self.builder_version = new_builder_num() + def whoami(self): return "GRUBuilder" class LSTMBuilder(_RNNBuilder): def __init__(self, layers, input_dim, hidden_dim, model): self.cg_version = -1 @@ -965,7 +975,6 @@ def print_graphviz(compact=False, show_dims=True, expression_names=None, lookup_ for n in nodes: label = n.label if show_dims: - label = n.label if n.expr_name is not None: label = '%s\\n%s' % (n.expr_name, label) label = '%s\\n%s' % (shape_str(n.output_dim), label) From 0f455ca1b9cc5a5cab13b5756db45bac03bcc23c Mon Sep 17 00:00:00 2001 From: dhg Date: Sat, 30 Jul 2016 16:56:16 -0700 Subject: [PATCH 634/965] pycnn_viz: add zero() --- pycnn/pycnn_viz.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py index f37f2c8e3..910313d16 100644 --- a/pycnn/pycnn_viz.py +++ b/pycnn/pycnn_viz.py @@ -127,6 +127,7 @@ def value(self, recalculate=False): return None def forward(self, recalculate=False): return None def set(self, x): pass def batch(self, i): return lookup_batch(self, i) + def zero(self): return self def backward(self): pass From 5efb03572b6ddaf033fe463204a8bd9ab9735f8d Mon Sep 17 00:00:00 2001 From: dhg Date: Sat, 30 Jul 2016 17:48:59 -0700 Subject: [PATCH 635/965] pycnn_viz: fixed lookup_names bug --- pycnn/pycnn_viz.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py index 910313d16..2f8bbc997 100644 --- a/pycnn/pycnn_viz.py +++ b/pycnn/pycnn_viz.py @@ -777,10 +777,13 @@ def vidx2str(vidx): return '%s%s' % ('N', vidx) [_dim] = p.args if vidx in var_name_dict: name = var_name_dict[vidx] - item_name = ('\\"%s\\"' % (lookup_names[name][idx],)) if (lookup_names and (name in lookup_names)) else None else: name = None - item_name = None + item_name = None + if lookup_names and p in expression_names: + param_name = expression_names[p] + if param_name in lookup_names: + item_name = '\\"%s\\"' % (lookup_names[param_name][idx],) if compact: if item_name is not None: f_name = item_name From b618638516fc90afe5b6f75f7744c43dd5b0e54e Mon Sep 17 00:00:00 2001 From: armatthews Date: Mon, 1 Aug 2016 07:28:30 -0400 Subject: [PATCH 636/965] Made trainers serializable. This means saving/loading to resume training can now be 100% lossless --- cnn/shadow-params.h | 14 +++++++++ cnn/training.cc | 8 ++++++ cnn/training.h | 70 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 91 insertions(+), 1 deletion(-) diff --git a/cnn/shadow-params.h b/cnn/shadow-params.h index 19d184b5c..8b2f3c538 100644 --- a/cnn/shadow-params.h +++ b/cnn/shadow-params.h @@ -17,11 +17,25 @@ struct LookupParameterStorage; struct ShadowParameters { explicit ShadowParameters(const ParameterStorage& p); Tensor h; + private: + ShadowParameters() {} + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & h; + } }; struct ShadowLookupParameters { explicit ShadowLookupParameters(const LookupParameterStorage& lp); std::vector h; + private: + ShadowLookupParameters() {} + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & h; + } }; // one per element in model.parameters_list diff --git a/cnn/training.cc b/cnn/training.cc index 2786444b8..714faad33 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -29,6 +29,14 @@ else { abort(); } \ } #endif +#ifndef __CUDACC__ +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::SimpleSGDTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::MomentumSGDTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdagradTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdadeltaTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::RmsPropTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdamTrainer) +#endif namespace cnn { diff --git a/cnn/training.h b/cnn/training.h index b9d7cd191..4b8fbdec5 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -57,16 +57,34 @@ struct Trainer { Model* model; // parameters and gradients live here protected: + Trainer() {} virtual void alloc_impl() { } virtual void update_rule(real scale, real gscale, const std::vector & values) = 0; virtual void update_params(real scale, real gscale, size_t idx) = 0; virtual void update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) = 0; + + private: + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & eta0 & eta & eta_decay & epoch; + ar & clipping_enabled & clip_threshold & clips & updates; + ar & aux_allocated; + ar & model; + } }; struct SimpleSGDTrainer : public Trainer { explicit SimpleSGDTrainer(Model* m, real e0 = 0.1) : Trainer(m, e0) {} protected: CNN_TRAINER_DEFINE_DEV_IMPL() + private: + SimpleSGDTrainer() {} + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + } }; struct MomentumSGDTrainer : public Trainer { @@ -84,6 +102,15 @@ struct MomentumSGDTrainer : public Trainer { std::vector vlp; //std::unordered_map vp; //std::unordered_map> vl; + private: + MomentumSGDTrainer() {} + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & momentum; + ar & vp & vlp; + } }; struct AdagradTrainer : public Trainer { @@ -96,6 +123,15 @@ struct AdagradTrainer : public Trainer { real epsilon; std::vector vp; std::vector vlp; + private: + AdagradTrainer() {} + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & epsilon; + ar & vp & vlp; + } }; struct AdadeltaTrainer : public Trainer { @@ -111,6 +147,15 @@ struct AdadeltaTrainer : public Trainer { std::vector hlg; std::vector hd; // History of deltas std::vector hld; + private: + AdadeltaTrainer() {} + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & epsilon & rho; + ar & hg & hlg & hd & hld; + } }; struct RmsPropTrainer : public Trainer { @@ -124,6 +169,15 @@ struct RmsPropTrainer : public Trainer { real rho; std::vector hg; // History of gradients std::vector > hlg; + private: + RmsPropTrainer() {} + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & epsilon & rho; + ar & hg & hlg; + } }; struct AdamTrainer : public Trainer { @@ -141,8 +195,22 @@ struct AdamTrainer : public Trainer { std::vector lm; std::vector v; // History of deltas std::vector lv; + private: + AdamTrainer() {} + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & beta_1 & beta_2 & epsilon; + ar & m & lm & v & lv; + } }; } // namespace cnn - +BOOST_CLASS_EXPORT_KEY(cnn::SimpleSGDTrainer) +BOOST_CLASS_EXPORT_KEY(cnn::MomentumSGDTrainer) +BOOST_CLASS_EXPORT_KEY(cnn::AdagradTrainer) +BOOST_CLASS_EXPORT_KEY(cnn::AdadeltaTrainer) +BOOST_CLASS_EXPORT_KEY(cnn::RmsPropTrainer) +BOOST_CLASS_EXPORT_KEY(cnn::AdamTrainer) #endif From de551e29d8a8e095051085e7de4c936f76d21199 Mon Sep 17 00:00:00 2001 From: armatthews Date: Mon, 1 Aug 2016 23:13:46 -0400 Subject: [PATCH 637/965] Changed mp.h to use the same rndeng as the rest of cnn --- cnn/mp.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cnn/mp.h b/cnn/mp.h index aed0a07c8..aafc1cb9b 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -1,4 +1,5 @@ #pragma once +#include "cnn/globals.h" #include "cnn/cnn.h" #include "cnn/training.h" #include "cnn/expr.h" @@ -160,10 +161,9 @@ namespace cnn { S best_dev_loss = S(); bool first_dev_run = true; - std::mt19937 rndeng(42); for (unsigned iter = 0; iter < num_iterations && !stop_requested; ++iter) { // Shuffle the training data indices - std::shuffle(train_indices.begin(), train_indices.end(), rndeng); + std::shuffle(train_indices.begin(), train_indices.end(), *rndeng); S train_loss = S(); @@ -304,11 +304,10 @@ namespace cnn { S best_dev_loss = S(); bool first_dev_run = true; - std::mt19937 rndeng(42); unsigned batch_counter = 0; for (unsigned iter = 0; iter < num_iterations && !stop_requested; ++iter) { // Shuffle the training data indices - std::shuffle(train_indices.begin(), train_indices.end(), rndeng); + std::shuffle(train_indices.begin(), train_indices.end(), *rndeng); S train_loss = S(); @@ -361,12 +360,12 @@ namespace cnn { if (stop_requested) { break; } + trainer->update_epoch(); if (new_best) { learner->SaveModel(); best_dev_loss = dev_loss; } - trainer->update_epoch(); begin = end; } } From 87816213260faec853d8c6dd574211fb470f878a Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 4 Aug 2016 00:05:12 +0900 Subject: [PATCH 638/965] Added pycnn cmake stuff --- CMakeLists.txt | 1 + pycnn/CMakeLists.txt | 21 +++++++++++++++++++++ pycnn/{setup.py => setup.py.in} | 4 ++-- 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 pycnn/CMakeLists.txt rename pycnn/{setup.py => setup.py.in} (86%) diff --git a/CMakeLists.txt b/CMakeLists.txt index dc2cfb950..3bb5eb4d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,4 +99,5 @@ add_subdirectory(tests) add_subdirectory(examples) add_subdirectory(tutorial) add_subdirectory(rnnlm) +add_subdirectory(pycnn) enable_testing() diff --git a/pycnn/CMakeLists.txt b/pycnn/CMakeLists.txt new file mode 100644 index 000000000..3d5382c04 --- /dev/null +++ b/pycnn/CMakeLists.txt @@ -0,0 +1,21 @@ +find_program(PYTHON "python") + +if(PYTHON) + set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py") + set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in") + set(DEPS "${CMAKE_CURRENT_SOURCE_DIR}/pycnn.py") + + configure_file(${SETUP_PY_IN} ${SETUP_PY}) + + add_custom_command( + OUTPUT ${OUTPUT}/timestamp + COMMAND ${PYTHON} + ARGS setup.py build + COMMAND ${CMAKE_COMMAND} -E touch ${OUTPUT}/timestamp + DEPENDS ${DEPS}) + + add_custom_target(target ALL DEPENDS ${OUTPUT}/timestamp) + + install(CODE "execute_process(COMMAND ${PYTHON} ${SETUP_PY})") + +endif() diff --git a/pycnn/setup.py b/pycnn/setup.py.in similarity index 86% rename from pycnn/setup.py rename to pycnn/setup.py.in index 85553100f..cd2596a31 100644 --- a/pycnn/setup.py +++ b/pycnn/setup.py.in @@ -20,8 +20,8 @@ "_pycnn", # name of extension ["pycnn.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source - include_dirs=["../../cnn/", # this is the location of the main cnn directory. - "../../eigen/"], # this is the directory where eigen is saved. + include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main cnn directory. + "${EIGEN3_INCLUDE_DIR}"], # this is the directory where eigen is saved. libraries=['cnn_shared'], # ditto library_dirs=["."], #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed From b7fb487be284e044baf9ee2989df2b8aff0c6d00 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 5 Aug 2016 15:35:25 +0900 Subject: [PATCH 639/965] Made shadowparameter constructor public to prevent compile errors --- cnn/shadow-params.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnn/shadow-params.h b/cnn/shadow-params.h index 8b2f3c538..6b2c44007 100644 --- a/cnn/shadow-params.h +++ b/cnn/shadow-params.h @@ -15,10 +15,10 @@ struct ParameterStorage; struct LookupParameterStorage; struct ShadowParameters { + ShadowParameters() {} explicit ShadowParameters(const ParameterStorage& p); Tensor h; private: - ShadowParameters() {} friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { @@ -27,10 +27,10 @@ struct ShadowParameters { }; struct ShadowLookupParameters { + ShadowLookupParameters() {} explicit ShadowLookupParameters(const LookupParameterStorage& lp); std::vector h; private: - ShadowLookupParameters() {} friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { From b39e16e2879df7f8043b192caaaf71b8d58cd78e Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 9 Sep 2016 16:29:14 -0400 Subject: [PATCH 640/965] Fix to fPIC error on CUDA --- cnn/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 41b01b5b9..3165ffdad 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -117,7 +117,7 @@ if(WITH_CUDA_BACKEND) list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU") SET(CUDA_PROPAGATE_HOST_FLAGS OFF) cuda_add_library(cnncuda STATIC gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu) - cuda_add_library(cnncuda_shared SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu) + cuda_add_library(cnncuda_shared SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu OPTIONS --compiler-options "-fPIC") endif(WITH_CUDA_BACKEND) install(FILES ${cnn_library_HDRS} DESTINATION include/cnn) From 38f3e28e76e2fa9f64fbc34b96576cb2d4f9392c Mon Sep 17 00:00:00 2001 From: talbaumel Date: Mon, 19 Sep 2016 18:52:07 +0300 Subject: [PATCH 641/965] Fix memory allocation limit to 2000 The credit belong to Yoav Goldberg Worked on my Mac --- cnn/devices.cc | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/cnn/devices.cc b/cnn/devices.cc index 7d5d3749f..3cecf3337 100644 --- a/cnn/devices.cc +++ b/cnn/devices.cc @@ -27,9 +27,15 @@ Device_GPU::Device_GPU(int mb, int device_id) : CUDA_CHECK(cudaMemcpyAsync(kSCALAR_ZERO, &zero, sizeof(float), cudaMemcpyHostToDevice)); // this is the big memory allocation - fxs = new AlignedMemoryPool(mb << 20, mem); // memory for node values - dEdfs = new AlignedMemoryPool(mb << 20, mem); // memory for node gradients - ps = new AlignedMemoryPool(mb << 20, mem); // memory for parameters + + size_t byte_count = (size_t)mb << 20; + fxs = new AlignedMemoryPool(byte_count, mem); // memory for node values + dEdfs = new AlignedMemoryPool(byte_count, mem); // memory for node gradients + ps = new AlignedMemoryPool(byte_count, mem); // memory for parameters + + //fxs = new AlignedMemoryPool(mb << 20, mem); // memory for node values + //dEdfs = new AlignedMemoryPool(mb << 20, mem); // memory for node gradients + //ps = new AlignedMemoryPool(mb << 20, mem); // memory for parameters } Device_GPU::~Device_GPU() {} @@ -51,9 +57,14 @@ Device_CPU::Device_CPU(int mb, bool shared) : *kSCALAR_ZERO = 0; // this is the big memory allocation: the pools - fxs = new AlignedMemoryPool(mb << 20, mem); // memory for node values - dEdfs = new AlignedMemoryPool(mb << 20, mem); // memory for node gradients - ps = new AlignedMemoryPool(mb << 20, shmem); // memory for parameters + + size_t byte_count = (size_t)mb << 20; + fxs = new AlignedMemoryPool(byte_count, mem); // memory for node values + dEdfs = new AlignedMemoryPool(byte_count, mem); // memory for node gradients + ps = new AlignedMemoryPool(byte_count, mem); // memory for parameters + //fxs = new AlignedMemoryPool(mb << 20, mem); // memory for node values + //dEdfs = new AlignedMemoryPool(mb << 20, mem); // memory for node gradients + //ps = new AlignedMemoryPool(mb << 20, shmem); // memory for parameters } Device_CPU::~Device_CPU() {} From 5c7d7844984a5fb58c88aa194640210a2242f109 Mon Sep 17 00:00:00 2001 From: talbaumel Date: Mon, 19 Sep 2016 20:24:40 +0300 Subject: [PATCH 642/965] Removed commented out lines --- devices.cc | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 devices.cc diff --git a/devices.cc b/devices.cc new file mode 100644 index 000000000..8b8e1d047 --- /dev/null +++ b/devices.cc @@ -0,0 +1,67 @@ +#include "cnn/devices.h" + +#include + +#include "cnn/cuda.h" + +using namespace std; + +namespace cnn { + +Device::~Device() {} + +#if HAVE_CUDA +Device_GPU::Device_GPU(int mb, int device_id) : + Device(DeviceType::GPU, &gpu_mem), cuda_device_id(device_id), gpu_mem(device_id) { + CUDA_CHECK(cudaSetDevice(device_id)); + CUBLAS_CHECK(cublasCreate(&cublas_handle)); + CUBLAS_CHECK(cublasSetPointerMode(cublas_handle, CUBLAS_POINTER_MODE_DEVICE)); + kSCALAR_MINUSONE = (float*)gpu_mem.malloc(sizeof(float)); + kSCALAR_ONE = (float*)gpu_mem.malloc(sizeof(float)); + kSCALAR_ZERO = (float*)gpu_mem.malloc(sizeof(float)); + float minusone = -1; + CUDA_CHECK(cudaMemcpyAsync(kSCALAR_MINUSONE, &minusone, sizeof(float), cudaMemcpyHostToDevice)); + float one = 1; + CUDA_CHECK(cudaMemcpyAsync(kSCALAR_ONE, &one, sizeof(float), cudaMemcpyHostToDevice)); + float zero = 0; + CUDA_CHECK(cudaMemcpyAsync(kSCALAR_ZERO, &zero, sizeof(float), cudaMemcpyHostToDevice)); + + // this is the big memory allocation + + size_t byte_count = (size_t)mb << 20; + fxs = new AlignedMemoryPool(byte_count, mem); // memory for node values + dEdfs = new AlignedMemoryPool(byte_count, mem); // memory for node gradients + ps = new AlignedMemoryPool(byte_count, mem); // memory for parameters + +} + +Device_GPU::~Device_GPU() {} +#endif + +// TODO we should be able to configure this carefully with a configuration +// script +// CPU -- 0 params +// -- 50mb fxs +// -- 50mb dEdfx +Device_CPU::Device_CPU(int mb, bool shared) : + Device(DeviceType::CPU, &cpu_mem), shmem(mem) { + if (shared) shmem = new SharedAllocator(); + kSCALAR_MINUSONE = (float*) mem->malloc(sizeof(float)); + *kSCALAR_MINUSONE = -1; + kSCALAR_ONE = (float*) mem->malloc(sizeof(float)); + *kSCALAR_ONE = 1; + kSCALAR_ZERO = (float*) mem->malloc(sizeof(float)); + *kSCALAR_ZERO = 0; + + // this is the big memory allocation: the pools + + size_t byte_count = (size_t)mb << 20; + fxs = new AlignedMemoryPool(byte_count, mem); // memory for node values + dEdfs = new AlignedMemoryPool(byte_count, mem); // memory for node gradients + ps = new AlignedMemoryPool(byte_count, mem); // memory for parameters + +} + +Device_CPU::~Device_CPU() {} + +} // namespace cnn From 968a9ab9e46d04d3352590300c9d12b47f50b490 Mon Sep 17 00:00:00 2001 From: talbaumel Date: Mon, 19 Sep 2016 20:25:34 +0300 Subject: [PATCH 643/965] Removed commented out lines --- cnn/devices.cc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/cnn/devices.cc b/cnn/devices.cc index 3cecf3337..8b8e1d047 100644 --- a/cnn/devices.cc +++ b/cnn/devices.cc @@ -33,9 +33,6 @@ Device_GPU::Device_GPU(int mb, int device_id) : dEdfs = new AlignedMemoryPool(byte_count, mem); // memory for node gradients ps = new AlignedMemoryPool(byte_count, mem); // memory for parameters - //fxs = new AlignedMemoryPool(mb << 20, mem); // memory for node values - //dEdfs = new AlignedMemoryPool(mb << 20, mem); // memory for node gradients - //ps = new AlignedMemoryPool(mb << 20, mem); // memory for parameters } Device_GPU::~Device_GPU() {} @@ -62,9 +59,7 @@ Device_CPU::Device_CPU(int mb, bool shared) : fxs = new AlignedMemoryPool(byte_count, mem); // memory for node values dEdfs = new AlignedMemoryPool(byte_count, mem); // memory for node gradients ps = new AlignedMemoryPool(byte_count, mem); // memory for parameters - //fxs = new AlignedMemoryPool(mb << 20, mem); // memory for node values - //dEdfs = new AlignedMemoryPool(mb << 20, mem); // memory for node gradients - //ps = new AlignedMemoryPool(mb << 20, shmem); // memory for parameters + } Device_CPU::~Device_CPU() {} From 99142ae9619a2abd60397cc7049465e05d9ca62c Mon Sep 17 00:00:00 2001 From: talbaumel Date: Mon, 19 Sep 2016 20:58:10 +0300 Subject: [PATCH 644/965] Deleted extra file --- devices.cc | 67 ------------------------------------------------------ 1 file changed, 67 deletions(-) delete mode 100644 devices.cc diff --git a/devices.cc b/devices.cc deleted file mode 100644 index 8b8e1d047..000000000 --- a/devices.cc +++ /dev/null @@ -1,67 +0,0 @@ -#include "cnn/devices.h" - -#include - -#include "cnn/cuda.h" - -using namespace std; - -namespace cnn { - -Device::~Device() {} - -#if HAVE_CUDA -Device_GPU::Device_GPU(int mb, int device_id) : - Device(DeviceType::GPU, &gpu_mem), cuda_device_id(device_id), gpu_mem(device_id) { - CUDA_CHECK(cudaSetDevice(device_id)); - CUBLAS_CHECK(cublasCreate(&cublas_handle)); - CUBLAS_CHECK(cublasSetPointerMode(cublas_handle, CUBLAS_POINTER_MODE_DEVICE)); - kSCALAR_MINUSONE = (float*)gpu_mem.malloc(sizeof(float)); - kSCALAR_ONE = (float*)gpu_mem.malloc(sizeof(float)); - kSCALAR_ZERO = (float*)gpu_mem.malloc(sizeof(float)); - float minusone = -1; - CUDA_CHECK(cudaMemcpyAsync(kSCALAR_MINUSONE, &minusone, sizeof(float), cudaMemcpyHostToDevice)); - float one = 1; - CUDA_CHECK(cudaMemcpyAsync(kSCALAR_ONE, &one, sizeof(float), cudaMemcpyHostToDevice)); - float zero = 0; - CUDA_CHECK(cudaMemcpyAsync(kSCALAR_ZERO, &zero, sizeof(float), cudaMemcpyHostToDevice)); - - // this is the big memory allocation - - size_t byte_count = (size_t)mb << 20; - fxs = new AlignedMemoryPool(byte_count, mem); // memory for node values - dEdfs = new AlignedMemoryPool(byte_count, mem); // memory for node gradients - ps = new AlignedMemoryPool(byte_count, mem); // memory for parameters - -} - -Device_GPU::~Device_GPU() {} -#endif - -// TODO we should be able to configure this carefully with a configuration -// script -// CPU -- 0 params -// -- 50mb fxs -// -- 50mb dEdfx -Device_CPU::Device_CPU(int mb, bool shared) : - Device(DeviceType::CPU, &cpu_mem), shmem(mem) { - if (shared) shmem = new SharedAllocator(); - kSCALAR_MINUSONE = (float*) mem->malloc(sizeof(float)); - *kSCALAR_MINUSONE = -1; - kSCALAR_ONE = (float*) mem->malloc(sizeof(float)); - *kSCALAR_ONE = 1; - kSCALAR_ZERO = (float*) mem->malloc(sizeof(float)); - *kSCALAR_ZERO = 0; - - // this is the big memory allocation: the pools - - size_t byte_count = (size_t)mb << 20; - fxs = new AlignedMemoryPool(byte_count, mem); // memory for node values - dEdfs = new AlignedMemoryPool(byte_count, mem); // memory for node gradients - ps = new AlignedMemoryPool(byte_count, mem); // memory for parameters - -} - -Device_CPU::~Device_CPU() {} - -} // namespace cnn From f54976c38cdaf66b695f1b621faaf493e7297a5d Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Wed, 14 Sep 2016 16:13:03 -0700 Subject: [PATCH 645/965] Changes to allow compilation in Microsoft Visual Studio 2015. Added #if _WINDOWS for conditional compilation in windows environment. Currently the mp.h/cc is not supported in windows, nor is the shared memory allocator. Also removed the link to pthreads for now. Would be nice to depend on C++11 standard or boost cross-platform standard threading libraries. --- CMakeLists.txt | 3 ++- cnn/mem.cc | 12 +++++++++++- cnn/mp.cc | 2 ++ cnn/mp.h | 2 ++ examples/CMakeLists.txt | 2 +- examples/encdec.cc | 3 +++ examples/poisson-regression.cc | 3 +++ examples/rnnlm-aevb.cc | 3 +++ examples/rnnlm-batch.cc | 3 +++ examples/rnnlm-cfsm.cc | 3 +++ examples/rnnlm-givenbag.cc | 3 +++ examples/rnnlm.cc | 3 +++ examples/tag-bilstm.cc | 3 +++ examples/textcat.cc | 3 +++ rnnlm/CMakeLists.txt | 2 +- rnnlm/lm.cc | 3 +++ 16 files changed, 49 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dc2cfb950..d67330223 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,7 +10,8 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # 3. try compiler options like -march=native or other architecture # flags (the compiler does not always make the best configuration # decisions without help) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -funroll-loops -Wall -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -march=native") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W1 -std=c++11 -DEIGEN_FAST_MATH -DNOMINMAX -DEIGEN_HAS_C99_MATH /MP") +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LIBPATH:${BOOST_LIBRARYDIR}") enable_testing() diff --git a/cnn/mem.cc b/cnn/mem.cc index 546818336..577d00bcc 100644 --- a/cnn/mem.cc +++ b/cnn/mem.cc @@ -3,10 +3,15 @@ #include #include #include +#if !_WINDOWS #include #include +#endif + #include -#include +#if !_WINDOWS + #include +#endif #include "cnn/except.h" #if HAVE_CUDA #include "cnn/cuda.h" @@ -38,12 +43,17 @@ void CPUAllocator::zero(void* p, size_t n) { } void* SharedAllocator::malloc(size_t n) { +#if _WINDOWS + cerr << "Shared memory not supported in Windows" << endl; + throw cnn::out_of_memory("Shared memory allocation failed"); +#else void* ptr = mmap(NULL, n, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0); if (!ptr) { cerr << "Shared memory allocation failed n=" << n << endl; throw cnn::out_of_memory("Shared memory allocation failed"); } return ptr; +#endif } void SharedAllocator::free(void* mem) { diff --git a/cnn/mp.cc b/cnn/mp.cc index 7ab882e58..ce3aa1a7d 100644 --- a/cnn/mp.cc +++ b/cnn/mp.cc @@ -1,3 +1,4 @@ +#if !_WINDOWS #include "mp.h" using namespace std; using namespace boost::interprocess; @@ -75,3 +76,4 @@ namespace cnn { } } +#endif \ No newline at end of file diff --git a/cnn/mp.h b/cnn/mp.h index aafc1cb9b..17c6635ac 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -1,4 +1,5 @@ #pragma once +#if !_WINDOWS #include "cnn/globals.h" #include "cnn/cnn.h" #include "cnn/training.h" @@ -372,3 +373,4 @@ namespace cnn { } } } +#endif // !_WINDOWS \ No newline at end of file diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 5bb4474db..39f286a94 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -2,7 +2,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET mlc tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm-mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) - target_link_libraries(${TARGET} cnn ${LIBS} pthread) + target_link_libraries(${TARGET} cnn ${LIBS}) if(UNIX AND NOT APPLE) target_link_libraries(${TARGET} rt) endif() diff --git a/examples/encdec.cc b/examples/encdec.cc index 774639ef7..b704fdd0f 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -10,6 +10,9 @@ #include #include #include +#if _WINDOWS + #include // Just for getpid() +#endif #include #include diff --git a/examples/poisson-regression.cc b/examples/poisson-regression.cc index d4fd3ab0f..48994ae7c 100644 --- a/examples/poisson-regression.cc +++ b/examples/poisson-regression.cc @@ -13,6 +13,9 @@ #include #include #include +#if _WINDOWS + #include // Just for getpid() +#endif #include #include diff --git a/examples/rnnlm-aevb.cc b/examples/rnnlm-aevb.cc index 29fdd2e16..aa1eef3ec 100644 --- a/examples/rnnlm-aevb.cc +++ b/examples/rnnlm-aevb.cc @@ -11,6 +11,9 @@ #include #include #include +#if _WINDOWS + #include // Just for getpid() +#endif #include #include diff --git a/examples/rnnlm-batch.cc b/examples/rnnlm-batch.cc index 715b9586b..500317792 100644 --- a/examples/rnnlm-batch.cc +++ b/examples/rnnlm-batch.cc @@ -12,6 +12,9 @@ #include #include #include +#if _WINDOWS + #include // Just for getpid() +#endif #include #include diff --git a/examples/rnnlm-cfsm.cc b/examples/rnnlm-cfsm.cc index 0029c3b31..f23c6ec98 100644 --- a/examples/rnnlm-cfsm.cc +++ b/examples/rnnlm-cfsm.cc @@ -12,6 +12,9 @@ #include #include #include +#if _WINDOWS + #include // Just for getpid() +#endif #include #include diff --git a/examples/rnnlm-givenbag.cc b/examples/rnnlm-givenbag.cc index 6fa85fa7d..b7206681a 100644 --- a/examples/rnnlm-givenbag.cc +++ b/examples/rnnlm-givenbag.cc @@ -12,6 +12,9 @@ #include #include #include +#if _WINDOWS + #include // Just for getpid() +#endif #include #include diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 7aa6bb10b..adecc4170 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -11,6 +11,9 @@ #include #include #include +#if _WINDOWS + #include // Just for getpid() +#endif #include #include diff --git a/examples/tag-bilstm.cc b/examples/tag-bilstm.cc index 6b11bf5f2..c9d4d8a4d 100644 --- a/examples/tag-bilstm.cc +++ b/examples/tag-bilstm.cc @@ -11,6 +11,9 @@ #include #include #include +#if _WINDOWS + #include // Just for getpid() +#endif #include #include diff --git a/examples/textcat.cc b/examples/textcat.cc index 7a4b81836..e13963f6e 100644 --- a/examples/textcat.cc +++ b/examples/textcat.cc @@ -10,6 +10,9 @@ #include #include +#if _WINDOWS + #include // Just for getpid() +#endif #include #include diff --git a/rnnlm/CMakeLists.txt b/rnnlm/CMakeLists.txt index f2176bba0..b4a743264 100644 --- a/rnnlm/CMakeLists.txt +++ b/rnnlm/CMakeLists.txt @@ -2,7 +2,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET lm) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) - target_link_libraries(${TARGET} cnn ${LIBS} pthread) + target_link_libraries(${TARGET} cnn ${LIBS}) if(UNIX AND NOT APPLE) target_link_libraries(${TARGET} rt) endif() diff --git a/rnnlm/lm.cc b/rnnlm/lm.cc index 4419dd7c4..0c433b5f5 100644 --- a/rnnlm/lm.cc +++ b/rnnlm/lm.cc @@ -14,6 +14,9 @@ #include #include #include +#if _WINDOWS + #include // Just for getpid() +#endif #include #include From 7acb881f18ba5d218514ca604e912537da671f68 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Wed, 14 Sep 2016 16:54:10 -0700 Subject: [PATCH 646/965] Fix for CNN_shared (DLL) library --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index d67330223..d553603be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,7 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # decisions without help) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W1 -std=c++11 -DEIGEN_FAST_MATH -DNOMINMAX -DEIGEN_HAS_C99_MATH /MP") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LIBPATH:${BOOST_LIBRARYDIR}") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LIBPATH:${BOOST_LIBRARYDIR}") enable_testing() From a63d9d9f2e9492597c8150a33fcecf292889ebb9 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Wed, 14 Sep 2016 17:03:25 -0700 Subject: [PATCH 647/965] Fixing cast for 64-bit systems. --- tests/test-cnn.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test-cnn.cc b/tests/test-cnn.cc index 6243ebaaa..ca4e72365 100644 --- a/tests/test-cnn.cc +++ b/tests/test-cnn.cc @@ -24,7 +24,7 @@ BOOST_GLOBAL_FIXTURE(ConfigureCNNTest); BOOST_AUTO_TEST_CASE( aligned_allocator ) { cnn::CPUAllocator a; void* mem = a.malloc(1024); - BOOST_CHECK_EQUAL(((unsigned long)(mem) & 0x1f), 0); + BOOST_CHECK_EQUAL(((uintptr_t)(mem) & 0x1f), 0); ((char*)mem)[0] = 99; a.zero(mem, 1024); BOOST_CHECK_EQUAL(((char*)mem)[0], 0); From 29081757dbcd6dc6228bb814674090822d8fa7ea Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Tue, 20 Sep 2016 15:11:34 -0700 Subject: [PATCH 648/965] Fixing boost for MSVC. It does auto-linking in MSVC (could be disabled with BOOST_ALL_NO_LIB) so MSVC needs the library paths but not the list of libs. Also made the windows-specific flags options to only occur when compiling in Windows. --- CMakeLists.txt | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d553603be..07d5fcb96 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,9 +10,13 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # 3. try compiler options like -march=native or other architecture # flags (the compiler does not always make the best configuration # decisions without help) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W1 -std=c++11 -DEIGEN_FAST_MATH -DNOMINMAX -DEIGEN_HAS_C99_MATH /MP") -set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LIBPATH:${BOOST_LIBRARYDIR}") -set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LIBPATH:${BOOST_LIBRARYDIR}") + +if(WIN32) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W1 -DEIGEN_FAST_MATH -DNOMINMAX -DEIGEN_HAS_C99_MATH /MP") +else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -funroll-loops -Wall -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -march=native") +endif() + enable_testing() @@ -46,7 +50,13 @@ endif() set(Boost_REALPATH ON) find_package(Boost COMPONENTS program_options regex serialization REQUIRED) include_directories(${Boost_INCLUDE_DIR}) -set(LIBS ${LIBS} ${Boost_LIBRARIES}) +if(MSVC) + # Boost does auto-linking when using a compiler like Microsoft Visual C++, we just need to help it find the libraries + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LIBPATH:${Boost_LIBRARY_DIRS}") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LIBPATH:${Boost_LIBRARY_DIRS}") +else() + set(LIBS ${LIBS} ${Boost_LIBRARIES}) +endif() # trouble shooting: # if boost library cannot be found, in addition to install boost library # check if environment variables are set From 0dea7d6cd2b48cea4386af8022874c8e5fcf8f82 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Tue, 20 Sep 2016 18:58:13 -0700 Subject: [PATCH 649/965] Made it clear which options are due to being windows, and which are due to being msvc. Added windows TODO items. Added "building for windows" section to README.md --- CMakeLists.txt | 14 +++++++++++--- README.md | 16 ++++++++++++++++ TODO.cnn | 8 ++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 07d5fcb96..92afd9db2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,12 +11,20 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # flags (the compiler does not always make the best configuration # decisions without help) +# Cross-compiler, cross-platform options +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_FAST_MATH") + +# Platform-specific options if(WIN32) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W1 -DEIGEN_FAST_MATH -DNOMINMAX -DEIGEN_HAS_C99_MATH /MP") -else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -funroll-loops -Wall -std=c++11 -Ofast -g -DEIGEN_FAST_MATH -march=native") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNOMINMAX") # Disable min/max macros in windef.h endif() +# Compiler-specific options +if(MSVC) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W1 -DEIGEN_HAS_C99_MATH /MP") # -Wall produces 20k warnings +else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -funroll-loops -Wall -std=c++11 -Ofast -g -march=native") +endif() enable_testing() diff --git a/README.md b/README.md index 41a64a435..35c94e6e4 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,22 @@ the following to your cmake options: Note that you will also have to set your `LD_LIBRARY_PATH` to point to the `boost/lib` directory. +#### Building for Windows + +CNN has been tested to build in Windows using Microsoft Visual Studio 2015. You may be able to build with MSVC 2013 by slightly modifying the instructions below. + +First, install Eigen following the above instructions. + +Second, install [Boost](http://www.boost.org/) for your compiler and platform. Follow the instructions for compiling Boost or just download the already-compiled binaries. + +To generate the MSVC solution and project files, run [cmake](http://www.cmake.org), pointing it to the location you installed Eigen and Boost (for example, at c:\libs\Eigen and c:\libs\boost_1_61_0): + + mkdir build + cd build + cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64" + +This will generate cnn.sln and a variety of *.vcxproj files (one for the CNN library, and one per example). You should be able to just open cnn.sln and build all. + #### Debugging build problems If you want to see the compile commands that are used, you can run diff --git a/TODO.cnn b/TODO.cnn index 6ac8b5ee2..2b0308092 100644 --- a/TODO.cnn +++ b/TODO.cnn @@ -36,3 +36,11 @@ cnn/examples/rnnlm.cc * add real program options to do something nontrivial * give elegant example of beam search implementation +cnn/mp.h + * Multi-process is currently disabled for Windows because it uses sys/wait.h and sys/shm.h. Fix this to use boost instead. + +cnn/mem.cc + * SharedAllocator is disabled for Windows (depends on mm_malloc.h). Fix this to use boost instead. + + + From 6f9a50fde7ce5e9512f9a8c9a48af74d7029d879 Mon Sep 17 00:00:00 2001 From: Matt Richardson Date: Tue, 20 Sep 2016 19:08:44 -0700 Subject: [PATCH 650/965] Added note that rnnlm-mp doesn't currently compile in Windows --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 35c94e6e4..37be888ba 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ To generate the MSVC solution and project files, run [cmake](http://www.cmake.or cd build cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64" -This will generate cnn.sln and a variety of *.vcxproj files (one for the CNN library, and one per example). You should be able to just open cnn.sln and build all. +This will generate cnn.sln and a bunch of \*.vcxproj files (one for the CNN library, and one per example). You should be able to just open cnn.sln and build all. **Note: multi-process functionality is currently not supported in Windows, so you will not be able to build rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to this project** #### Debugging build problems From 8d801add4487ecca175c8ac0fe25ea04e6107732 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Thu, 22 Sep 2016 10:34:11 -0700 Subject: [PATCH 651/965] Move conditional include of process.h for windows into its own header --- examples/encdec.cc | 4 +--- examples/getpid.h | 7 +++++++ examples/poisson-regression.cc | 6 ++---- examples/rnnlm-aevb.cc | 6 ++---- examples/rnnlm-batch.cc | 6 ++---- examples/rnnlm-cfsm.cc | 4 +--- examples/rnnlm-givenbag.cc | 4 +--- examples/rnnlm.cc | 6 ++---- examples/tag-bilstm.cc | 6 ++---- examples/textcat.cc | 4 +--- rnnlm/lm.cc | 4 +--- 11 files changed, 22 insertions(+), 35 deletions(-) create mode 100644 examples/getpid.h diff --git a/examples/encdec.cc b/examples/encdec.cc index b704fdd0f..1399606b9 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -6,13 +6,11 @@ #include "cnn/lstm.h" #include "cnn/dict.h" #include "cnn/expr.h" +#include "getpid.h" #include #include #include -#if _WINDOWS - #include // Just for getpid() -#endif #include #include diff --git a/examples/getpid.h b/examples/getpid.h new file mode 100644 index 000000000..3ce955141 --- /dev/null +++ b/examples/getpid.h @@ -0,0 +1,7 @@ +// Platform-independent header to allow calls to getpid() +// +#if _WINDOWS + #include +#endif + + diff --git a/examples/poisson-regression.cc b/examples/poisson-regression.cc index 48994ae7c..619f2708e 100644 --- a/examples/poisson-regression.cc +++ b/examples/poisson-regression.cc @@ -8,14 +8,12 @@ #include "cnn/deep-lstm.h" #include "cnn/lstm.h" #include "cnn/dict.h" -# include "cnn/expr.h" +#include "cnn/expr.h" +#include "getpid.h" #include #include #include -#if _WINDOWS - #include // Just for getpid() -#endif #include #include diff --git a/examples/rnnlm-aevb.cc b/examples/rnnlm-aevb.cc index aa1eef3ec..5bce0ff52 100644 --- a/examples/rnnlm-aevb.cc +++ b/examples/rnnlm-aevb.cc @@ -6,14 +6,12 @@ #include "cnn/gru.h" #include "cnn/lstm.h" #include "cnn/dict.h" -# include "cnn/expr.h" +#include "cnn/expr.h" +#include "getpid.h" #include #include #include -#if _WINDOWS - #include // Just for getpid() -#endif #include #include diff --git a/examples/rnnlm-batch.cc b/examples/rnnlm-batch.cc index 500317792..02d8b7537 100644 --- a/examples/rnnlm-batch.cc +++ b/examples/rnnlm-batch.cc @@ -6,15 +6,13 @@ #include "cnn/gru.h" #include "cnn/lstm.h" #include "cnn/dict.h" -# include "cnn/expr.h" +#include "cnn/expr.h" +#include "getpid.h" #include #include #include #include -#if _WINDOWS - #include // Just for getpid() -#endif #include #include diff --git a/examples/rnnlm-cfsm.cc b/examples/rnnlm-cfsm.cc index f23c6ec98..327fbeb1b 100644 --- a/examples/rnnlm-cfsm.cc +++ b/examples/rnnlm-cfsm.cc @@ -8,13 +8,11 @@ #include "cnn/dict.h" #include "cnn/expr.h" #include "cnn/cfsm-builder.h" +#include "getpid.h" #include #include #include -#if _WINDOWS - #include // Just for getpid() -#endif #include #include diff --git a/examples/rnnlm-givenbag.cc b/examples/rnnlm-givenbag.cc index b7206681a..b8583ade2 100644 --- a/examples/rnnlm-givenbag.cc +++ b/examples/rnnlm-givenbag.cc @@ -8,13 +8,11 @@ #include "cnn/dict.h" # include "cnn/expr.h" #include "cnn/grad-check.h" +#include "getpid.h" #include #include #include -#if _WINDOWS - #include // Just for getpid() -#endif #include #include diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index adecc4170..d22ba8a5b 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -6,14 +6,12 @@ #include "cnn/gru.h" #include "cnn/lstm.h" #include "cnn/dict.h" -# include "cnn/expr.h" +#include "cnn/expr.h" +#include "getpid.h" #include #include #include -#if _WINDOWS - #include // Just for getpid() -#endif #include #include diff --git a/examples/tag-bilstm.cc b/examples/tag-bilstm.cc index c9d4d8a4d..3f88810a4 100644 --- a/examples/tag-bilstm.cc +++ b/examples/tag-bilstm.cc @@ -6,14 +6,12 @@ #include "cnn/gru.h" #include "cnn/lstm.h" #include "cnn/dict.h" -# include "cnn/expr.h" +#include "cnn/expr.h" +#include "getpid.h" #include #include #include -#if _WINDOWS - #include // Just for getpid() -#endif #include #include diff --git a/examples/textcat.cc b/examples/textcat.cc index e13963f6e..71afb580d 100644 --- a/examples/textcat.cc +++ b/examples/textcat.cc @@ -7,12 +7,10 @@ #include "cnn/lstm.h" #include "cnn/dict.h" #include "cnn/expr.h" +#include "getpid.h" #include #include -#if _WINDOWS - #include // Just for getpid() -#endif #include #include diff --git a/rnnlm/lm.cc b/rnnlm/lm.cc index 0c433b5f5..faa96c538 100644 --- a/rnnlm/lm.cc +++ b/rnnlm/lm.cc @@ -9,14 +9,12 @@ #include "cnn/expr.h" #include "cnn/cfsm-builder.h" #include "cnn/hsm-builder.h" +#include "../examples/getpid.h" #include #include #include #include -#if _WINDOWS - #include // Just for getpid() -#endif #include #include From 97f8ccaa06ff50cfc660b3b44c4ae18b2458ee28 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Thu, 22 Sep 2016 12:42:24 -0700 Subject: [PATCH 652/965] removing pthread from tutorial cmakelists. Not being used. --- tutorial/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutorial/CMakeLists.txt b/tutorial/CMakeLists.txt index 00c1a07b8..7a2fc2153 100644 --- a/tutorial/CMakeLists.txt +++ b/tutorial/CMakeLists.txt @@ -2,7 +2,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET 0_multiply 1_linear_regression) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) - target_link_libraries(${TARGET} cnn ${LIBS} pthread) + target_link_libraries(${TARGET} cnn ${LIBS}) if(UNIX AND NOT APPLE) target_link_libraries(${TARGET} rt) endif() From 98ddbbbd3ca89bb3197e08cd9dddf0025a3b2694 Mon Sep 17 00:00:00 2001 From: dhg Date: Wed, 28 Sep 2016 05:51:51 -0700 Subject: [PATCH 653/965] add set/disable dropout methods for BiRNNBuilder --- pycnn/pycnn.pyx | 9 +++++++++ pycnn/pycnn_viz.py | 13 +++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/pycnn/pycnn.pyx b/pycnn/pycnn.pyx index 8a5c15bcf..ddd3bb93b 100644 --- a/pycnn/pycnn.pyx +++ b/pycnn/pycnn.pyx @@ -1048,6 +1048,15 @@ class BiRNNBuilder(object): def whoami(self): return "BiRNNBuilder" + def set_dropout(self, p): + for (fb,bb) in self.builder_layers: + fb.set_dropout(p) + bb.set_dropout(p) + def disable_dropout(self): + for (fb,bb) in self.builder_layers: + fb.disable_dropout() + bb.disable_dropout() + def add_inputs(self, es): """ returns the list of state pairs (stateF, stateB) obtained by adding diff --git a/pycnn/pycnn_viz.py b/pycnn/pycnn_viz.py index 2f8bbc997..9b25f6e04 100644 --- a/pycnn/pycnn_viz.py +++ b/pycnn/pycnn_viz.py @@ -531,6 +531,15 @@ def __init__(self, num_layers, input_dim, hidden_dim, model, rnn_builder_factory def whoami(self): return "BiRNNBuilder" + def set_dropout(self, p): + for (fb,bb) in self.builder_layers: + fb.set_dropout(p) + bb.set_dropout(p) + def disable_dropout(self): + for (fb,bb) in self.builder_layers: + fb.disable_dropout() + bb.disable_dropout() + def add_inputs(self, es): """ returns the list of state pairs (stateF, stateB) obtained by adding @@ -797,7 +806,7 @@ def vidx2str(vidx): return '%s%s' % ('N', vidx) if item_name is not None: arg_strs.append(item_name) vocab_size = _dim[0] - arg_strs.extend(['%s' % (vocab_size), 'update' if update else 'fixed']) + arg_strs.extend(['%s' % (idx), '%s' % (vocab_size), 'update' if update else 'fixed']) #children.add(vidx2str(p.vindex)) #node_type = '1_param' elif f_name == 'RNNState': @@ -941,7 +950,7 @@ def collapse_birnn_states(nodes, compact): children_forwards[out_e] = new_rnn_group_state.name nodes.add(new_rnn_group_state) nodes_to_delete.add(out_e) - # TODO: WHEN WE DELETE A CAT NODE, MAKE SURE WE FORWARD TO THE **NEW GROPU STATE NODE** + # TODO: WHEN WE DELETE A CAT NODE, MAKE SURE WE FORWARD TO THE **NEW GROUP STATE NODE** for (name, input_dim, label, output_dim, children, features, node_type, expr_name) in nodes: if name not in nodes_to_delete: new_children = [] From ec75eb85932f964e5c3ad79515b4b2c45c84f9a3 Mon Sep 17 00:00:00 2001 From: dhg Date: Wed, 28 Sep 2016 06:54:27 -0700 Subject: [PATCH 654/965] Added pycnn_viz example --- pyexamples/pycnn_viz_birnn.py | 59 +++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 pyexamples/pycnn_viz_birnn.py diff --git a/pyexamples/pycnn_viz_birnn.py b/pyexamples/pycnn_viz_birnn.py new file mode 100644 index 000000000..cb1ae5d6a --- /dev/null +++ b/pyexamples/pycnn_viz_birnn.py @@ -0,0 +1,59 @@ +from pycnn import * + +train_sentence = [('the','D'), ('dog','N'), ('walks','V')] + +i2w = dict(enumerate(set(w for w,t in train_sentence))) +w2i = dict((w,i) for i,w in i2w.iteritems()) +t2i = dict((t,i) for i,t in enumerate(set(t for w,t in train_sentence))) +num_words = len(w2i) +num_tags = len(t2i) + +model = Model() +sgd = SimpleSGDTrainer(model) + +WEMB_DIM = 128 +RNN_HIDDEN_DIM = 64 +HIDDEN_DIM = 32 + +pWembs = model.add_lookup_parameters((num_words, WEMB_DIM)) +pH = model.add_parameters((HIDDEN_DIM, RNN_HIDDEN_DIM)) +pHb = model.add_parameters(HIDDEN_DIM) +pO = model.add_parameters((num_tags, HIDDEN_DIM)) +pOb = model.add_parameters(num_tags) + +rnn_builder = BiRNNBuilder(1, WEMB_DIM, RNN_HIDDEN_DIM, model, LSTMBuilder) + + +renew_cg() + +H = parameter(pH) +Hb = parameter(pHb) +O = parameter(pO) +Ob = parameter(pOb) + +indexed_words, indexed_gold_tags = zip(*[(w2i[w], t2i[t]) for w,t in train_sentence]) + +wembs = [pWembs[wi] for wi in indexed_words] +noised_wembs = [noise(we, 0.1) for we in wembs] + +rnn_outputs = rnn_builder.transduce(noised_wembs) + +errs = [] +for rnn_output, gold_tag in zip(rnn_outputs, indexed_gold_tags): + hidden = tanh(affine_transform([Hb, H, rnn_output])) + model_tag = affine_transform([Ob, O, hidden]) + err = pickneglogsoftmax(model_tag, gold_tag) + errs.append(err) +sum_errs = esum(errs) + +print_graphviz(compact=False, + show_dims=True, + expression_names={ pWembs: "word_emb", + H: "H", Hb: "Hb", + O: "O", Ob: "Ob", + wembs[0]: "first word"}, + lookup_names={"word_emb": i2w}, + collapse_birnns=True) + +# Alternatively: +# expression_names = dict((v,k) for (k,v) in dict(globals().items()+locals().items()).iteritems() if isinstance(v,Expression)) From af2f1acb827900011ddd70e42a189e03808e101b Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 3 Oct 2016 14:46:12 -0400 Subject: [PATCH 655/965] Initial compile working --- pycnn/CMakeLists.txt | 36 +++++++++++++++++++++++++++++------- pycnn/setup.py.in | 5 +++-- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/pycnn/CMakeLists.txt b/pycnn/CMakeLists.txt index 3d5382c04..d23596f3b 100644 --- a/pycnn/CMakeLists.txt +++ b/pycnn/CMakeLists.txt @@ -1,20 +1,42 @@ -find_program(PYTHON "python") + + +if(!PYTHON) + find_program(PYTHON "python") +endif() if(PYTHON) + # Things to copy the files + file(GLOB DepFiles ${CMAKE_CURRENT_SOURCE_DIR}/pycnn.py + ${CMAKE_CURRENT_SOURCE_DIR}/pycnn.pyx + ${CMAKE_CURRENT_SOURCE_DIR}/pycnn.pxd + ${CMAKE_CURRENT_SOURCE_DIR}/pycnn_viz.py + ${CMAKE_CURRENT_SOURCE_DIR}/pybridge.h + ) + + add_custom_target(copy) + foreach(DepFile ${DepFiles}) + add_custom_command(TARGET copy PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E + copy ${DepFile} ${CMAKE_CURRENT_BINARY_DIR}) + endforeach() + # TODO: We should add a dependency, but this isn&t working + # add_dependencies(copy ${DepFiles}) + + # Things to perform setup set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py") set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in") - set(DEPS "${CMAKE_CURRENT_SOURCE_DIR}/pycnn.py") configure_file(${SETUP_PY_IN} ${SETUP_PY}) - + add_custom_command( - OUTPUT ${OUTPUT}/timestamp + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/timestamp COMMAND ${PYTHON} ARGS setup.py build - COMMAND ${CMAKE_COMMAND} -E touch ${OUTPUT}/timestamp - DEPENDS ${DEPS}) + COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/timestamp + DEPENDS ${DepFiles}) - add_custom_target(target ALL DEPENDS ${OUTPUT}/timestamp) + add_custom_target(target ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/timestamp) + add_dependencies(target copy) install(CODE "execute_process(COMMAND ${PYTHON} ${SETUP_PY})") diff --git a/pycnn/setup.py.in b/pycnn/setup.py.in index cd2596a31..49804168f 100644 --- a/pycnn/setup.py.in +++ b/pycnn/setup.py.in @@ -21,12 +21,13 @@ ext = Extension( ["pycnn.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main cnn directory. - "${EIGEN3_INCLUDE_DIR}"], # this is the directory where eigen is saved. + "${EIGEN3_INCLUDE_DIR}", # this is the directory where eigen is saved. + "${Boost_INCLUDE_DIR}"], # this is the directory where boost is. libraries=['cnn_shared'], # ditto library_dirs=["."], #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed extra_compile_args=COMPILER_ARGS, - runtime_library_dirs=["$ORIGIN/./"], + runtime_library_dirs=["${PROJECT_BINARY_DIR}/cnn/"], ) setup(ext_modules = [ext], From 0515a8a16a5f3d26d872f4f25720cede6ae25f8c Mon Sep 17 00:00:00 2001 From: yoavg Date: Tue, 4 Oct 2016 23:19:12 +0300 Subject: [PATCH 656/965] Updated pycnn installation instructions. --- INSTALL.md => PYINSTALL.md | 85 +++++++++++++++----------------------- README.md | 2 + pycnn/INSTALL | 2 +- pycnn/pycnn.py | 2 + 4 files changed, 38 insertions(+), 53 deletions(-) rename INSTALL.md => PYINSTALL.md (50%) diff --git a/INSTALL.md b/PYINSTALL.md similarity index 50% rename from INSTALL.md rename to PYINSTALL.md index 2f49a9828..f7f548f21 100644 --- a/INSTALL.md +++ b/PYINSTALL.md @@ -2,6 +2,8 @@ (for instructions on installing on a computer with GPU, see below) +pyCNN is currently only supported under python 2. + First, get CNN: ```bash @@ -17,9 +19,13 @@ Then get Eigen: ```bash cd $HOME cd cnn -# Latest version (17.03.16) of Eigen fails to compile , so we revert "-r" to the latest stable version. -# Otherwise, we can use "hg clone https://bitbucket.org/eigen/eigen/" -hg clone https://bitbucket.org/eigen/eigen/ -r 47fa289dda2dc13e0eea70adfc8671e93627d466 +hg clone https://bitbucket.org/eigen/eigen/ +``` + +We also need to make sure the `chython` module is installed. +(you can replace `pip` with your favorite package manager, such as `conda`, or install within a virtual environment) +```bash +pip install cython ``` To simplify the following steps, we can set a bash variable to hold where we have saved the main directories of `cnn` and `eigen`. In case you have gotten `ccn` and `eigen` differently from the instructions above and saved them in different location(s), these variables will be helpful: @@ -30,73 +36,47 @@ PATH_TO_EIGEN=$HOME/cnn/eigen/ ``` Compile CNN. -(modify the code below to point to the correct boost location) +(modify the code below to point to the correct boost location. Note the addition of the -DPYTHON flag.) ```bash cd $PATH_TO_CNN +PATH_TO_PYTHON=`which python` mkdir build cd build -cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DBOOST_ROOT=$HOME/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON +cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DBOOST_ROOT=$HOME/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON -DPYTHON=$PATH_TO_PYTHON make -j 2 ``` -If CNN fails to compile and throws an error like this: +Assuming that the `cmake` command found all the needed libraries and didn't fail, the `make` command will take a while, and compile cnn as well as the python bindings. -```bash -$ make -j 2 -Scanning dependencies of target cnn -Scanning dependencies of target cnn_shared -[ 1%] [ 2%] Building CXX object cnn/CMakeFiles/cnn.dir/cfsm-builder.cc.o -Building CXX object cnn/CMakeFiles/cnn_shared.dir/cfsm-builder.cc.o -In file included from /home/user/cnn/cnn/cnn.h:13:0, - from /home/user/cnn/cnn/cfsm-builder.h:6, - from /home/user/cnn/cnn/cfsm-builder.cc:1: -/home/user/cnn/cnn/tensor.h:22:42: fatal error: unsupported/Eigen/CXX11/Tensor: No such file or directory - #include - ^ -compilation terminated. -``` - -If CNN fails to compile with the error above, then you can download a stable version of Eigen and re-build CNN as such: +You now have a working python binding inside of `build/pycnn`. +To verify this is working: ```bash -cd $PATH_TO_CNN -wget u.cs.biu.ac.il/~yogo/eigen.tgz -tar zxvf eigen.tgz # or "dtrx eigen.tgz" if you have dtrx installed -mkdir build -cd build -cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DBOOST_ROOT=$HOME/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON -make -j 2 +cd $PATH_TO_CNN/build/pycnn +python ``` - -Now that CNN is compiled, we need to compile the pycnn module. -This requires having cython installed. -If you don't have cython, it can be installed with either `pip install cython` or better yet `conda install cython`. - +then, within python: ```bash -pip2 install cython --user +import pycnn as pc +print pc.__version__ +model = pc.Model() ``` -Customize the `setup.py` to include (i) the parent directory where the main `cnn` directory is saved and (ii) the path to the main `eigen` directy: - +In order to install the module so that it is accessible from everywhere, run the following: ```bash -cd $PATH_TO_CNN/pycnn -sed -i "s|..\/..\/cnn\/|$PATH_TO_CNN|g" setup.py -sed -i "s|..\/..\/eigen\/|$PATH_TO_EIGEN|g" setup.py -make -make install +cd $PATH_TO_CNN/build/pycnn +python setup.py install --user ``` -We are almost there. -We need to tell the environment where to find the compiled cnn shared library. -The pyCNN's `make` fetched a copy of `libcnn_shared.so` and put it in the `pycnn` lib. +(the `--user` switch will install the module in your local site-packages, and works without root privilages. + To install the module to the system site-packages (for all users), run `python setup.py install` without this switch) -Add the following line to your profile (`.zshrc` or `.bashrc`), change -according to your installation location. -```bash -export LD_LIBRARY_PATH=$PATH_TO_CNN/pycnn -``` +You should now have a working python binding (the pycnn module). + +Note however that the installation relies on the compiled cnn library being in `$PATH_TO_CNN/build/cnn`, +so make sure not to move it from there. Now, check that everything works: @@ -104,8 +84,8 @@ Now, check that everything works: # check that it works: cd $PATH_TO_CNN cd pyexamples -python2 xor.py -python2 rnnlm.py rnnlm.py +python xor.py +python rnnlm.py rnnlm.py ``` Alternatively, if the following script works for you, then your installation is likely to be working: @@ -115,6 +95,7 @@ model = Model() ``` ## Installing with GPU support +## Currently unsuperted. The GPU support instructions need some revisions. For installing on a computer with GPU, first install CUDA. Here, we assume CUDA is installed in `/usr/local/cuda-7.5` diff --git a/README.md b/README.md index 37be888ba..786449906 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ cnn is a neural network library that is written in C++ (with bindings in Python) ### Building +(for building the python bindings (pycnn), see `PYINSTALL.md`) + Before compiling cnn, you need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function. **If you use any of the released versions, you may get assertion failures or compile errors.** First you need to fetch the dependent libraries diff --git a/pycnn/INSTALL b/pycnn/INSTALL index 6aacc2fad..622d311a0 100644 --- a/pycnn/INSTALL +++ b/pycnn/INSTALL @@ -1 +1 @@ -See installation instruction in ../INSTALL.md +See installation instruction in ../PYINSTALL.md diff --git a/pycnn/pycnn.py b/pycnn/pycnn.py index 40f427c71..fbf2d7003 100644 --- a/pycnn/pycnn.py +++ b/pycnn/pycnn.py @@ -5,3 +5,5 @@ def print_graphviz(**kwarge): print "Run with --pycnn-viz to get the visualization behavior." from _pycnn import * + +__version__ = 2.0 From 0891893d9c7fa70c0707445a19d3d9761a7e962c Mon Sep 17 00:00:00 2001 From: yoavg Date: Tue, 4 Oct 2016 23:21:32 +0300 Subject: [PATCH 657/965] Added note on absolute paths. --- PYINSTALL.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/PYINSTALL.md b/PYINSTALL.md index f7f548f21..46e3453bb 100644 --- a/PYINSTALL.md +++ b/PYINSTALL.md @@ -8,6 +8,7 @@ First, get CNN: ```bash cd $HOME +mkdir cnn git clone https://github.com/clab/cnn.git cd cnn git submodule init # To be consistent with CNN's installation instructions. @@ -31,10 +32,12 @@ pip install cython To simplify the following steps, we can set a bash variable to hold where we have saved the main directories of `cnn` and `eigen`. In case you have gotten `ccn` and `eigen` differently from the instructions above and saved them in different location(s), these variables will be helpful: ```bash -PATH_TO_CNN=$HOME/cnn/ +PATH_TO_CNN=$HOME/cnn/cnn/ PATH_TO_EIGEN=$HOME/cnn/eigen/ ``` +Note that we currently require the paths to cnn and eigen to be absolute, and not relative. + Compile CNN. (modify the code below to point to the correct boost location. Note the addition of the -DPYTHON flag.) From 71ef470945f4e9973d4f06f804414e41b57c8201 Mon Sep 17 00:00:00 2001 From: yoavg Date: Tue, 4 Oct 2016 23:48:46 +0300 Subject: [PATCH 658/965] convert eigen and boost paths in cmake to absolute --- CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index e34107177..62da93dd4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,11 @@ project(cnn) cmake_minimum_required(VERSION 2.8 FATAL_ERROR) +get_filename_component(EIGEN3_INCLUDE_DIR "${EIGEN3_INCLUDE_DIR}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") +get_filename_component(Boost_INCLUDE_DIR "${Boost_INCLUDE_DIR}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") +message("Eigen dir is " ${EIGEN3_INCLUDE_DIR}) +message("Boost dir is " ${Boost_INCLUDE_DIR}) + set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # CNN uses Eigen which exploits modern CPU architectures. To get the From ba638d2983aca14708946fe75d713cf284a0de51 Mon Sep 17 00:00:00 2001 From: yoavg Date: Tue, 4 Oct 2016 23:49:28 +0300 Subject: [PATCH 659/965] convert eigen and boost paths in cmake to absolute (doc) --- PYINSTALL.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/PYINSTALL.md b/PYINSTALL.md index 46e3453bb..8f6dd0fad 100644 --- a/PYINSTALL.md +++ b/PYINSTALL.md @@ -36,8 +36,6 @@ PATH_TO_CNN=$HOME/cnn/cnn/ PATH_TO_EIGEN=$HOME/cnn/eigen/ ``` -Note that we currently require the paths to cnn and eigen to be absolute, and not relative. - Compile CNN. (modify the code below to point to the correct boost location. Note the addition of the -DPYTHON flag.) From 8d4a208d737315c6a08b01794485e0ad440cdfbf Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 5 Oct 2016 00:12:15 -0400 Subject: [PATCH 660/965] Fixed everything to be dynamic linking --- CMakeLists.txt | 9 ++++----- cnn/CMakeLists.txt | 13 +++++-------- pycnn/setup.py.in | 2 +- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 62da93dd4..3fe92e3ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,11 +1,6 @@ project(cnn) cmake_minimum_required(VERSION 2.8 FATAL_ERROR) -get_filename_component(EIGEN3_INCLUDE_DIR "${EIGEN3_INCLUDE_DIR}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") -get_filename_component(Boost_INCLUDE_DIR "${Boost_INCLUDE_DIR}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") -message("Eigen dir is " ${EIGEN3_INCLUDE_DIR}) -message("Boost dir is " ${Boost_INCLUDE_DIR}) - set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # CNN uses Eigen which exploits modern CPU architectures. To get the @@ -59,8 +54,10 @@ endfunction() # look for Boost if(DEFINED ENV{BOOST_ROOT}) set(Boost_NO_SYSTEM_PATHS ON) + get_filename_component(Boost_INCLUDE_DIR "${Boost_INCLUDE_DIR}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") endif() set(Boost_REALPATH ON) +message("-- Boost dir is " ${EIGEN3_INCLUDE_DIR}) find_package(Boost COMPONENTS program_options regex serialization REQUIRED) include_directories(${Boost_INCLUDE_DIR}) if(MSVC) @@ -111,6 +108,8 @@ endif() # look for Eigen find_package(Eigen3 REQUIRED) +get_filename_component(EIGEN3_INCLUDE_DIR "${EIGEN3_INCLUDE_DIR}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") +message("-- Eigen dir is " ${EIGEN3_INCLUDE_DIR}) include_directories(${EIGEN3_INCLUDE_DIR}) FIND_PACKAGE(Threads REQUIRED) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index 3165ffdad..dc8242108 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -102,22 +102,19 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) #endforeach(test_src) # actual target: -add_library(cnn STATIC ${cnn_library_SRCS} ${cnn_library_HDRS}) -target_link_libraries(cnn ${LIBS}) if(WITH_CUDA_BACKEND) - add_library(gcnn_shared SHARED ${cnn_library_SRCS} ${cnn_library_HDRS}) - target_link_libraries(gcnn_shared ${LIBS}) + add_library(gcnn SHARED ${cnn_library_SRCS} ${cnn_library_HDRS}) + target_link_libraries(gcnn ${LIBS}) else() - add_library(cnn_shared SHARED ${cnn_library_SRCS} ${cnn_library_HDRS}) - target_link_libraries(cnn_shared ${LIBS}) + add_library(cnn SHARED ${cnn_library_SRCS} ${cnn_library_HDRS}) + target_link_libraries(cnn ${LIBS}) endif(WITH_CUDA_BACKEND) #add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) if(WITH_CUDA_BACKEND) set(CUDA_SEPARABLE_COMPILATION ON) list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU") SET(CUDA_PROPAGATE_HOST_FLAGS OFF) - cuda_add_library(cnncuda STATIC gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu) - cuda_add_library(cnncuda_shared SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu OPTIONS --compiler-options "-fPIC") + cuda_add_library(cnncuda SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu) endif(WITH_CUDA_BACKEND) install(FILES ${cnn_library_HDRS} DESTINATION include/cnn) diff --git a/pycnn/setup.py.in b/pycnn/setup.py.in index 49804168f..8aadf22ac 100644 --- a/pycnn/setup.py.in +++ b/pycnn/setup.py.in @@ -23,7 +23,7 @@ ext = Extension( include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main cnn directory. "${EIGEN3_INCLUDE_DIR}", # this is the directory where eigen is saved. "${Boost_INCLUDE_DIR}"], # this is the directory where boost is. - libraries=['cnn_shared'], # ditto + libraries=['cnn'], # ditto library_dirs=["."], #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed extra_compile_args=COMPILER_ARGS, From de997e01dc585f559bac203e0b1c84ff9b9c1bb9 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 5 Oct 2016 06:09:09 -0400 Subject: [PATCH 661/965] Fixed bug on empty lookup parameters --- cnn/model.cc | 3 +-- examples/xor-batch-lookup.cc | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/cnn/model.cc b/cnn/model.cc index a55292ea2..ffc979eee 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -340,8 +340,7 @@ template void LookupParameterStorage::g_squared_l2norm_dev(MyDevice & dev, float* sqnorm) const { Tensor sqnorm_t({1}, sqnorm, &dev, DeviceMempool::NONE); auto it = non_zero_grads.begin(); - assert(it != non_zero_grads.end()); - sqnorm_t.t<0>().device(*dev.edevice) = grads[*(it++)].tvec().square().sum(); + TensorTools::Zero(sqnorm_t); while(it != non_zero_grads.end()) sqnorm_t.t<0>().device(*dev.edevice) += grads[*(it++)].tvec().square().sum(); } diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup.cc index 6eedc39b3..708d0845b 100644 --- a/examples/xor-batch-lookup.cc +++ b/examples/xor-batch-lookup.cc @@ -40,8 +40,8 @@ int main(int argc, char** argv) { p_V = m.add_parameters({1, HIDDEN_SIZE}); p_a = m.add_parameters({1}); - LookupParameter x_values = m.add_lookup_parameters(4, {2}); - LookupParameter y_values = m.add_lookup_parameters(4, {1}); + x_values = m.add_lookup_parameters(4, {2}); + y_values = m.add_lookup_parameters(4, {1}); x_values.initialize(0, {1.0, 1.0}); x_values.initialize(1, {-1.0, 1.0}); x_values.initialize(2, {1.0, -1.0}); From 4d7cba3f44baba8785ba97eccbb862cee51fe72e Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Wed, 5 Oct 2016 13:20:26 +0300 Subject: [PATCH 662/965] fix python build --- pycnn/setup.py.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pycnn/setup.py.in b/pycnn/setup.py.in index 8aadf22ac..a293e96c6 100644 --- a/pycnn/setup.py.in +++ b/pycnn/setup.py.in @@ -24,7 +24,7 @@ ext = Extension( "${EIGEN3_INCLUDE_DIR}", # this is the directory where eigen is saved. "${Boost_INCLUDE_DIR}"], # this is the directory where boost is. libraries=['cnn'], # ditto - library_dirs=["."], + library_dirs=[".","${PROJECT_BINARY_DIR}/cnn/"], #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed extra_compile_args=COMPILER_ARGS, runtime_library_dirs=["${PROJECT_BINARY_DIR}/cnn/"], From 8281249337bf7254e80129730061a2a07c6c2991 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 5 Oct 2016 06:59:14 -0400 Subject: [PATCH 663/965] Create libcnn.so for cpu and libgcnn.so for gpu --- CMakeLists.txt | 1 - cnn/CMakeLists.txt | 27 +++++++++++++-------------- examples/CMakeLists.txt | 10 ++++++---- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3fe92e3ed..9ff7229f5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -96,7 +96,6 @@ if (WITH_CUDA_BACKEND) find_package(CUDA REQUIRED) set(CUDA_TOOLKIT_ROOT_DIR ${CUDA_ROOT}) include_directories(SYSTEM ${CUDA_INCLUDE_DIRS}) - add_definitions(-DHAVE_CUDA) #list(APPEND CUDA_LIBRARIES /usr/lib64/libpthread.so) MESSAGE("CUDA_LIBRARIES: ${CUDA_LIBRARIES}") list(REMOVE_ITEM CUDA_LIBRARIES -lpthread) diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index dc8242108..e87b20898 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -74,11 +74,6 @@ set(cnn_library_HDRS weight-decay.h ) -if(WITH_CUDA_BACKEND) - list(APPEND cnn_library_SRCS - cuda.cc) -endif(WITH_CUDA_BACKEND) - file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) #foreach(test_src ${TEST_SRCS}) @@ -101,24 +96,28 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) # COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tests.bin/${testName} ) #endforeach(test_src) -# actual target: +# Build cpu library +add_library(cnn SHARED ${cnn_library_SRCS} ${cnn_library_HDRS}) +target_link_libraries(cnn ${LIBS}) if(WITH_CUDA_BACKEND) + # Build main gpu library + list(APPEND cnn_library_SRCS cuda.cc) add_library(gcnn SHARED ${cnn_library_SRCS} ${cnn_library_HDRS}) target_link_libraries(gcnn ${LIBS}) -else() - add_library(cnn SHARED ${cnn_library_SRCS} ${cnn_library_HDRS}) - target_link_libraries(cnn ${LIBS}) -endif(WITH_CUDA_BACKEND) -#add_library(cnn ${cnn_library_SRCS} ${cnn_library_HDRS} ${LIBS}) -if(WITH_CUDA_BACKEND) + set_target_properties(gcnn PROPERTIES + COMPILE_DEFINITIONS HAVE_CUDA) + # Build nvcc-compiled gpu library set(CUDA_SEPARABLE_COMPILATION ON) - list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU") + list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU;-DHAVE_CUDA") SET(CUDA_PROPAGATE_HOST_FLAGS OFF) - cuda_add_library(cnncuda SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu) + cuda_add_library(cnncuda SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu OPTIONS --compiler-options "-fPIC") endif(WITH_CUDA_BACKEND) install(FILES ${cnn_library_HDRS} DESTINATION include/cnn) install(TARGETS cnn DESTINATION lib) +if(WITH_CUDA_BACKEND) + install(TARGETS gcnn DESTINATION lib) +endif(WITH_CUDA_BACKEND) # target_compile_features(cnn PRIVATE cxx_range_for) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 39f286a94..ca4eed9e6 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -2,14 +2,16 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET mlc tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm-mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) - target_link_libraries(${TARGET} cnn ${LIBS}) - if(UNIX AND NOT APPLE) - target_link_libraries(${TARGET} rt) - endif() if (WITH_CUDA_BACKEND) + target_link_libraries(${TARGET} gcnn ${LIBS}) add_dependencies(${TARGET} cnncuda) target_link_libraries(${TARGET} cnncuda) CUDA_ADD_CUBLAS_TO_TARGET(${TARGET}) + else() + target_link_libraries(${TARGET} cnn ${LIBS}) endif (WITH_CUDA_BACKEND) + if(UNIX AND NOT APPLE) + target_link_libraries(${TARGET} rt) + endif() endforeach() From 5a6c00eeef74391d075f7b23c9adf48e96ecd4ab Mon Sep 17 00:00:00 2001 From: armatthews Date: Wed, 5 Oct 2016 11:20:11 -0400 Subject: [PATCH 664/965] forward now takes an expr parameter --- cnn/cfsm-builder.cc | 12 +- cnn/cnn.cc | 4 +- cnn/cnn.h | 4 +- cnn/devices.cc | 3 +- cnn/grad-check.cc | 14 +- cnn/grad-check.h | 4 +- cnn/hsm-builder.cc | 8 +- examples/CMakeLists.txt | 3 +- examples/embed-cl.cc | 2 +- examples/encdec.cc | 10 +- examples/mlc.cc | 8 +- examples/nlm.cc | 2 +- examples/poisson-regression.cc | 10 +- examples/read-write.cc | 4 +- examples/rnnlm-aevb.cc | 8 +- examples/rnnlm-batch.cc | 10 +- examples/rnnlm-cfsm.cc | 8 +- examples/rnnlm-givenbag.cc | 6 +- examples/rnnlm-mp.cc | 4 +- examples/rnnlm.cc | 10 +- examples/rnnlm.h | 2 +- examples/skiprnnlm.cc | 8 +- examples/tag-bilstm.cc | 10 +- examples/textcat.cc | 19 +- examples/tok-embed.cc | 4 +- examples/xor-batch-lookup.cc | 2 +- examples/xor-batch.cc | 2 +- examples/xor-xent.cc | 4 +- examples/xor.cc | 4 +- rnnlm/lm.cc | 20 +- tests/test-nodes.cc | 312 ++++++++++++++++---------------- tests/test-trainers.cc | 30 +-- tutorial/0_multiply.cc | 4 +- tutorial/1_linear_regression.cc | 2 +- 34 files changed, 282 insertions(+), 275 deletions(-) diff --git a/cnn/cfsm-builder.cc b/cnn/cfsm-builder.cc index 513e3715a..51981b988 100644 --- a/cnn/cfsm-builder.cc +++ b/cnn/cfsm-builder.cc @@ -35,8 +35,8 @@ Expression StandardSoftmaxBuilder::neg_log_softmax(const Expression& rep, unsign } unsigned StandardSoftmaxBuilder::sample(const Expression& rep) { - softmax(affine_transform({b, w, rep})); - vector dist = as_vector(pcg->incremental_forward()); + Expression dist_expr = softmax(affine_transform({b, w, rep})); + vector dist = as_vector(pcg->incremental_forward(dist_expr)); unsigned c = 0; double p = rand01(); for (; c < dist.size(); ++c) { @@ -108,8 +108,8 @@ Expression ClassFactoredSoftmaxBuilder::neg_log_softmax(const Expression& rep, u unsigned ClassFactoredSoftmaxBuilder::sample(const Expression& rep) { // TODO assert that new_graph has been called Expression cscores = affine_transform({cbias, r2c, rep}); - softmax(cscores); - auto cdist = as_vector(pcg->incremental_forward()); + Expression cdist_expr = softmax(cscores); + auto cdist = as_vector(pcg->incremental_forward(cdist_expr)); unsigned c = 0; double p = rand01(); for (; c < cdist.size(); ++c) { @@ -122,8 +122,8 @@ unsigned ClassFactoredSoftmaxBuilder::sample(const Expression& rep) { Expression& cwbias = get_rc2wbias(c); Expression& r2cw = get_rc2w(c); Expression wscores = affine_transform({cwbias, r2cw, rep}); - softmax(wscores); - auto wdist = as_vector(pcg->incremental_forward()); + Expression wdist_expr = softmax(wscores); + auto wdist = as_vector(pcg->incremental_forward(wdist_expr)); p = rand01(); for (; w < wdist.size(); ++w) { p -= wdist[w]; diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 3850c68f1..bced2a978 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -245,8 +245,8 @@ void ComputationGraph::set_dim_for_new_node(const VariableIndex& i) { node->dim = node->dim_forward(xds); } -const Tensor& ComputationGraph::incremental_forward() { return ee->incremental_forward(); } -const Tensor& ComputationGraph::forward() { return ee->forward(); } +const Tensor& ComputationGraph::incremental_forward(const expr::Expression& last) { return ee->incremental_forward(last.i); } +const Tensor& ComputationGraph::forward(const expr::Expression& last) { return ee->forward(last.i); } const Tensor& ComputationGraph::get_value(VariableIndex i) { return ee->get_value(i); } const Tensor& ComputationGraph::get_value(const expr::Expression& e) { return this->get_value(e.i); } void ComputationGraph::invalidate() { ee->invalidate(); } diff --git a/cnn/cnn.h b/cnn/cnn.h index fa9096a11..c82f7aab3 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -107,10 +107,10 @@ struct ComputationGraph { // perform computations // run complete forward pass from first node to last existing one, ignoring all precomputed values. - const Tensor& forward(); + const Tensor& forward(const expr::Expression& last); // run forward pass from the last computed node to last existing. // useful if you want to add nodes and evaluate just the new parts. - const Tensor& incremental_forward(); + const Tensor& incremental_forward(const expr::Expression& last); // get forward value for node at index i. used cached values if available, // performs forward evaluation if note available (may compute more than strictly // what is needed). diff --git a/cnn/devices.cc b/cnn/devices.cc index 0c6042346..5bdf512dc 100644 --- a/cnn/devices.cc +++ b/cnn/devices.cc @@ -6,6 +6,7 @@ #include "cnn/cuda.h" #include "cnn/cnn.h" +#include "cnn/expr.h" using namespace std; @@ -41,7 +42,7 @@ DeviceMempoolSizes::DeviceMempoolSizes(const std::string & descriptor) { Device::~Device() {} DeviceMempoolSizes Device::mark(ComputationGraph *cg) { - cg->incremental_forward(); // needed so that we actually allocate the needed memory + cg->incremental_forward({cg, (VariableIndex)(cg->nodes.size() - 1)}); // needed so that we actually allocate the needed memory // for all existing nodes. return DeviceMempoolSizes(pools[0]->used, pools[1]->used, pools[2]->used); } diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc index 2005ac005..44a7d062a 100644 --- a/cnn/grad-check.cc +++ b/cnn/grad-check.cc @@ -6,12 +6,14 @@ #include "cnn/model.h" #include "cnn/cnn.h" #include "cnn/tensor.h" +#include "cnn/expr.h" using namespace std; namespace cnn { -bool check_grad(Model& m, ComputationGraph& g, int verbosity) { +bool check_grad(Model& m, expr::Expression& expr, int verbosity) { + ComputationGraph& g = *expr.pg; // Clear the parameters first const vector& params = m.parameters_list(); const vector& lookup_params = m.lookup_parameters_list(); @@ -22,7 +24,7 @@ bool check_grad(Model& m, ComputationGraph& g, int verbosity) { // Perform forward and backward steps float alpha = 5e-4; - g.forward(); + g.forward(expr); g.backward(); // Check @@ -36,9 +38,9 @@ bool check_grad(Model& m, ComputationGraph& g, int verbosity) { for (size_t i = 0; i < ts; ++i) { float old = TensorTools::AccessElement(p.values, i); TensorTools::SetElement(p.values, i, old - alpha); - float E_left = as_scalar(g.forward()); + float E_left = as_scalar(g.forward(expr)); TensorTools::SetElement(p.values, i, old + alpha); - float E_right = as_scalar(g.forward()); + float E_right = as_scalar(g.forward(expr)); TensorTools::SetElement(p.values, i, old); float g = (E_right - E_left) / (2 * alpha); float g_act = TensorTools::AccessElement(p.g, i); @@ -66,9 +68,9 @@ bool check_grad(Model& m, ComputationGraph& g, int verbosity) { for (size_t i = 0; i < ts; ++i) { float old = TensorTools::AccessElement(v, i); TensorTools::SetElement(v, i, old - alpha); - float E_left = as_scalar(g.forward()); + float E_left = as_scalar(g.forward(expr)); TensorTools::SetElement(v, i, old + alpha); - float E_right = as_scalar(g.forward()); + float E_right = as_scalar(g.forward(expr)); TensorTools::SetElement(v, i, old); float g = (E_right - E_left) / (2 * alpha); float g_act = TensorTools::AccessElement(ag, i); diff --git a/cnn/grad-check.h b/cnn/grad-check.h index 6ff1485e4..081ef6132 100644 --- a/cnn/grad-check.h +++ b/cnn/grad-check.h @@ -1,13 +1,15 @@ #ifndef CNN_GRAD_CHECK_H #define CNN_GRAD_CHECK_H +#include "cnn/expr.h" + namespace cnn { class Model; struct ComputationGraph; // verbosity is zero for silence, one for only printing errors, two for everything -bool check_grad(Model& m, ComputationGraph& g, int verbosity = 1); +bool check_grad(Model& m, expr::Expression& expr, int verbosity = 1); } // namespace cnn diff --git a/cnn/hsm-builder.cc b/cnn/hsm-builder.cc index 40d1ec7c6..96fc79907 100644 --- a/cnn/hsm-builder.cc +++ b/cnn/hsm-builder.cc @@ -127,8 +127,8 @@ unsigned Cluster::sample(expr::Expression h, ComputationGraph& cg) const { return 0; } else if (output_size == 2) { - logistic(predict(h, cg)); - double prob0 = as_scalar(cg.incremental_forward()); + expr::Expression prob0_expr = logistic(predict(h, cg)); + double prob0 = as_scalar(cg.incremental_forward(prob0_expr)); double p = rand01(); if (p < prob0) { return 0; @@ -138,8 +138,8 @@ unsigned Cluster::sample(expr::Expression h, ComputationGraph& cg) const { } } else { - softmax(predict(h, cg)); - vector dist = as_vector(cg.incremental_forward()); + expr::Expression dist_expr = softmax(predict(h, cg)); + vector dist = as_vector(cg.incremental_forward(dist_expr)); unsigned c = 0; double p = rand01(); for (; c < dist.size(); ++c) { diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 39f286a94..6eb4e9dcf 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -foreach(TARGET mlc tok-embed segrnn-sup poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm-mp read-write) +# segrnn-sup +foreach(TARGET mlc tok-embed poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm-mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) target_link_libraries(${TARGET} cnn ${LIBS}) if(UNIX AND NOT APPLE) diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index e2b0e35d7..71581b5a0 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -188,7 +188,7 @@ int main(int argc, char** argv) { noise[j] = pairwise_rank_loss(sim, sim_n, margin); } Expression l = sum(noise); - auto iloss = as_scalar(cg.forward()); + auto iloss = as_scalar(cg.forward(l)); assert(iloss >= 0); if (iloss > 0) { loss += iloss; diff --git a/examples/encdec.cc b/examples/encdec.cc index 1399606b9..c8987649c 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -88,7 +88,7 @@ struct EncoderDecoder { Expression i_ie2h = parameter(cg, p_ie2h); Expression i_bie = parameter(cg, p_bie); Expression i_t = i_bie + i_ie2h * i_combined; - cg.incremental_forward(); + cg.incremental_forward(i_t); Expression i_h = rectify(i_t); Expression i_h2oe = parameter(cg,p_h2oe); Expression i_boe = parameter(cg,p_boe); @@ -238,9 +238,9 @@ int main(int argc, char** argv) { auto& sent = training[order[si]]; chars += sent.size() - 1; ++si; - lm.BuildGraph(sent, sent, cg); + Expression loss_expr = lm.BuildGraph(sent, sent, cg); //cg.print_graphviz(); - loss += as_scalar(cg.forward()); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd->update(); ++lines; @@ -259,8 +259,8 @@ int main(int argc, char** argv) { int dchars = 0; for (auto& sent : dev) { ComputationGraph cg; - lm.BuildGraph(sent, sent, cg); - dloss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildGraph(sent, sent, cg); + dloss += as_scalar(cg.forward(loss_expr)); dchars += sent.size() - 1; } if (dloss < best) { diff --git a/examples/mlc.cc b/examples/mlc.cc index 1a6f983e4..dec8ace76 100644 --- a/examples/mlc.cc +++ b/examples/mlc.cc @@ -159,8 +159,8 @@ int main(int argc, char** argv) { Expression u = mlc.BuildPredictionScores(cg, xy.feats); if (rand01() < 0.004) { - sparsemax(u * 1.5); // this increases sparsity at test time, which Andre found the be useful - vector p = as_vector(cg.incremental_forward()); + Expression p_expr = sparsemax(u * 1.5); // this increases sparsity at test time, which Andre found the be useful + vector p = as_vector(cg.incremental_forward(p_expr)); for (unsigned j = 0; j < p.size(); ++j) if (p[j] > 0) cerr << j << ' '; cerr << " |||"; @@ -168,8 +168,8 @@ int main(int argc, char** argv) { cerr << ' ' << y; cerr << endl; } - sparsemax_loss(u, &xy.labels); - loss += as_scalar(cg.forward()); + Expression loss_expr = sparsemax_loss(u, &xy.labels); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd.update(1.0); } diff --git a/examples/nlm.cc b/examples/nlm.cc index 39cc4554b..5ffc389d2 100644 --- a/examples/nlm.cc +++ b/examples/nlm.cc @@ -73,7 +73,7 @@ int main(int argc, char** argv) { for (auto& ci : corpus) { copy(ci.begin(), ci.begin()+CONTEXT, in_c.begin()); ytrue = ci.back(); - loss += as_scalar(cg.forward()); + loss += as_scalar(cg.forward(nerr)); cg.backward(); ++n; sgd.update(1.0); diff --git a/examples/poisson-regression.cc b/examples/poisson-regression.cc index 619f2708e..a3ed426d9 100644 --- a/examples/poisson-regression.cc +++ b/examples/poisson-regression.cc @@ -57,7 +57,7 @@ struct RNNLengthPredictor { } Expression pred = affine_transform({bias, R, builder.back()}); if (flag) { - unsigned x = exp(as_scalar(cg.incremental_forward())); + unsigned x = exp(as_scalar(cg.incremental_forward(pred))); cerr << "PRED=" << x << " TRUE=" << len << "\t(DIFF=" << ((int)x - (int)len) << ")" << endl; } return poisson_loss(pred, len); @@ -171,8 +171,8 @@ int main(int argc, char** argv) { ComputationGraph cg; auto& sent = training[order[si]]; ++si; - lm.BuildLMGraph(sent.first, sent.second, cg); - loss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(sent.first, sent.second, cg); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd->update(); ++lines; @@ -188,8 +188,8 @@ int main(int argc, char** argv) { int dchars = 0; for (auto& sent : dev) { ComputationGraph cg; - lm.BuildLMGraph(sent.first, sent.second, cg, true); - dloss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(sent.first, sent.second, cg, true); + dloss += as_scalar(cg.forward(loss_expr)); dchars++; } if (dloss < best) { diff --git a/examples/read-write.cc b/examples/read-write.cc index 652c1384f..7f8dc191d 100644 --- a/examples/read-write.cc +++ b/examples/read-write.cc @@ -59,7 +59,7 @@ class XORModel { Expression y_pred = V*h + a; Expression loss = squared_distance(y_pred, y); - float return_loss = as_scalar(cg.forward()); + float return_loss = as_scalar(cg.forward(loss)); cg.backward(); sgd->update(1.0); return return_loss; @@ -72,7 +72,7 @@ class XORModel { Expression x = cnn::expr::input(cg, {(unsigned int)input.size()}, &input); Expression h = tanh(W*x + b); Expression y_pred = V*h + a; - return as_scalar(cg.forward()); + return as_scalar(cg.forward(y_pred)); } // This function should save all those variables in the archive, which diff --git a/examples/rnnlm-aevb.cc b/examples/rnnlm-aevb.cc index 5bce0ff52..9665680ed 100644 --- a/examples/rnnlm-aevb.cc +++ b/examples/rnnlm-aevb.cc @@ -218,8 +218,8 @@ int main(int argc, char** argv) { auto& sent = training[order[si]]; chars += sent.size() - 1; ++si; - lm.BuildLMGraph(sent, cg); - loss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(sent, cg); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd->update(); ++lines; @@ -235,8 +235,8 @@ int main(int argc, char** argv) { int dchars = 0; for (auto& sent : dev) { ComputationGraph cg; - lm.BuildLMGraph(sent, cg, true); - dloss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(sent, cg, true); + dloss += as_scalar(cg.forward(loss_expr)); dchars += sent.size() - 1; } if (dloss < best) { diff --git a/examples/rnnlm-batch.cc b/examples/rnnlm-batch.cc index 02d8b7537..a079721ee 100644 --- a/examples/rnnlm-batch.cc +++ b/examples/rnnlm-batch.cc @@ -95,7 +95,7 @@ struct RNNLanguageModel { unsigned w = 0; while (w == 0 || (int)w == kSOS) { - auto dist = as_vector(cg.incremental_forward()); + auto dist = as_vector(cg.incremental_forward(ydist)); double p = rand01(); for (; w < dist.size(); ++w) { p -= dist[w]; @@ -221,8 +221,8 @@ int main(int argc, char** argv) { // build graph for this instance ComputationGraph cg; unsigned bsize = std::min((unsigned)training.size()-order[si], BATCH_SIZE); // Batch size - lm.BuildLMGraphs(training, order[si], bsize, chars, cg); - loss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraphs(training, order[si], bsize, chars, cg); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd->update(); lines += bsize; @@ -238,8 +238,8 @@ int main(int argc, char** argv) { unsigned dchars = 0; for (unsigned i = 0; i < dev.size(); ++i) { ComputationGraph cg; - lm.BuildLMGraphs(dev, i, 1, dchars, cg); - dloss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraphs(dev, i, 1, dchars, cg); + dloss += as_scalar(cg.forward(loss_expr)); } if (dloss < best) { best = dloss; diff --git a/examples/rnnlm-cfsm.cc b/examples/rnnlm-cfsm.cc index 327fbeb1b..5bb6f9310 100644 --- a/examples/rnnlm-cfsm.cc +++ b/examples/rnnlm-cfsm.cc @@ -184,8 +184,8 @@ int main(int argc, char** argv) { auto& sent = training[order[si]]; chars += sent.size() - 2; ++si; - lm.BuildLMGraph(sent, cg); - loss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(sent, cg); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd->update(); ++lines; @@ -202,8 +202,8 @@ int main(int argc, char** argv) { int dchars = 0; for (auto& sent : dev) { ComputationGraph cg; - lm.BuildLMGraph(sent, cg); - dloss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(sent, cg); + dloss += as_scalar(cg.forward(loss_expr)); dchars += sent.size() - 2; } cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; diff --git a/examples/rnnlm-givenbag.cc b/examples/rnnlm-givenbag.cc index b8583ade2..a0391614f 100644 --- a/examples/rnnlm-givenbag.cc +++ b/examples/rnnlm-givenbag.cc @@ -89,7 +89,7 @@ struct RNNLanguageModel { unsigned w = 0; while (w == 0 || (int)w == kSOS) { - auto dist = as_vector(cg.incremental_forward()); + auto dist = as_vector(cg.incremental_forward(ydist)); double p = rand01(); for (; w < dist.size(); ++w) { p -= dist[w]; @@ -216,8 +216,8 @@ int main(int argc, char** argv) { rows.resize(idx); // in case of duplicates chars += sent.size() - 1; ++si; - lm.BuildLMGraph(rmsent, cg, &rows); - loss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(rmsent, cg, &rows); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd->update(); for (auto w : sent) { w2sl[w] = 0; } diff --git a/examples/rnnlm-mp.cc b/examples/rnnlm-mp.cc index c3d6831c0..283da56c7 100644 --- a/examples/rnnlm-mp.cc +++ b/examples/rnnlm-mp.cc @@ -44,8 +44,8 @@ class Learner : public ILearner { cnn::real LearnFromDatum(const D& datum, bool learn) { ComputationGraph cg; - rnnlm.BuildLMGraph(datum, cg); - cnn::real loss = as_scalar(cg.forward()); + Expression loss_expr = rnnlm.BuildLMGraph(datum, cg); + cnn::real loss = as_scalar(cg.forward(loss_expr)); if (learn) { cg.backward(); } diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index d22ba8a5b..fb31d09a1 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -100,7 +100,7 @@ struct RNNLanguageModel { unsigned w = 0; while (w == 0 || (int)w == kSOS) { - auto dist = as_vector(cg.incremental_forward()); + auto dist = as_vector(cg.incremental_forward(ydist)); double p = rand01(); for (; w < dist.size(); ++w) { p -= dist[w]; @@ -214,8 +214,8 @@ int main(int argc, char** argv) { auto& sent = training[order[si]]; chars += sent.size() - 1; ++si; - lm.BuildLMGraph(sent, cg); - loss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(sent, cg); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd->update(); ++lines; @@ -231,8 +231,8 @@ int main(int argc, char** argv) { int dchars = 0; for (auto& sent : dev) { ComputationGraph cg; - lm.BuildLMGraph(sent, cg); - dloss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(sent, cg); + dloss += as_scalar(cg.forward(loss_expr)); dchars += sent.size() - 1; } if (dloss < best) { diff --git a/examples/rnnlm.h b/examples/rnnlm.h index e9c2a1d03..3b6cf0baa 100644 --- a/examples/rnnlm.h +++ b/examples/rnnlm.h @@ -78,7 +78,7 @@ struct RNNLanguageModel { unsigned w = 0; while (w == 0 || (int)w == kSOS) { - auto dist = as_vector(cg.incremental_forward()); + auto dist = as_vector(cg.incremental_forward(ydist)); double p = rand01(); for (; w < dist.size(); ++w) { p -= dist[w]; diff --git a/examples/skiprnnlm.cc b/examples/skiprnnlm.cc index cea859625..582e77ec7 100644 --- a/examples/skiprnnlm.cc +++ b/examples/skiprnnlm.cc @@ -169,8 +169,8 @@ int main(int argc, char** argv) { chars += sent.size() - 1; ++si; //LOG(INFO) << "sent length " << sent.size(); - lm.BuildLMGraph(doc, cg); - loss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(doc, cg); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd->update(); ++lines; @@ -188,8 +188,8 @@ int main(int argc, char** argv) { for (int i = 0; i < dev.size(); ++i) { const auto& doc = dev[i]; ComputationGraph cg; - lm.BuildLMGraph(doc, cg); - dloss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(doc, cg); + dloss += as_scalar(cg.forward(loss_expr)); for (auto &sent: doc) dchars += sent.size() - 1; } diff --git a/examples/tag-bilstm.cc b/examples/tag-bilstm.cc index 3f88810a4..5aa071253 100644 --- a/examples/tag-bilstm.cc +++ b/examples/tag-bilstm.cc @@ -95,7 +95,7 @@ struct RNNLanguageModel { //if (!eval) { i_th = dropout(i_th, pdrop); } Expression i_t = affine_transform({i_tbias, i_th2t, i_th}); if (cor) { - vector dist = as_vector(cg.incremental_forward()); + vector dist = as_vector(cg.incremental_forward(i_t)); double best = -9e99; int besti = -1; for (int i = 0; i < dist.size(); ++i) { @@ -223,8 +223,8 @@ int main(int argc, char** argv) { ComputationGraph cg; auto& sent = training[order[si]]; ++si; - lm.BuildTaggingGraph(sent.first, sent.second, cg, &correct, &ttags); - loss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildTaggingGraph(sent.first, sent.second, cg, &correct, &ttags); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd->update(1.0); ++lines; @@ -242,8 +242,8 @@ int main(int argc, char** argv) { //lm.p_th2t->scale_parameters(pdrop); for (auto& sent : dev) { ComputationGraph cg; - lm.BuildTaggingGraph(sent.first, sent.second, cg, &dcorr, &dtags); - dloss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildTaggingGraph(sent.first, sent.second, cg, &dcorr, &dtags); + dloss += as_scalar(cg.forward(loss_expr)); } //lm.p_th2t->scale_parameters(1/pdrop); eval = false; diff --git a/examples/textcat.cc b/examples/textcat.cc index 71afb580d..ea57450ea 100644 --- a/examples/textcat.cc +++ b/examples/textcat.cc @@ -154,8 +154,9 @@ struct ConvNet { } }; -bool IsCurrentPredictionCorrection(ComputationGraph& cg, int y_true) { - auto v = as_vector(cg.incremental_forward()); +bool IsCurrentPredictionCorrection(Expression y_pred, int y_true) { + ComputationGraph& cg = *y_pred.pg; + auto v = as_vector(cg.incremental_forward(y_pred)); assert(v.size() > 1); int besti = 0; float best = v[0]; @@ -270,9 +271,9 @@ int main(int argc, char** argv) { ++si; //cerr << "LINE: " << order[si] << endl; Expression y_pred = nbow.BuildClassifier(x, cg, true); - //CrossEntropyLoss(y_pred, y); - HingeLoss(y_pred, y); - loss += as_scalar(cg.forward()); + //Expression loss_expr = CrossEntropyLoss(y_pred, y); + Expression loss_expr = HingeLoss(y_pred, y); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd->update(2.0); ++lines; @@ -294,11 +295,11 @@ int main(int argc, char** argv) { nbow.p_t2o.get()->scale_parameters(pdropout); ComputationGraph cg; Expression y_pred = nbow.BuildClassifier(x, cg, false); - if (IsCurrentPredictionCorrection(cg, y)) dcorr++; - //CrossEntropyLoss(y_pred, y); - HingeLoss(y_pred, y); + if (IsCurrentPredictionCorrection(y_pred, y)) dcorr++; + //Expression loss_expr = CrossEntropyLoss(y_pred, y); + Expression loss_expr = HingeLoss(y_pred, y); //cerr << "DEVLINE: " << dtags << endl; - dloss += as_scalar(cg.incremental_forward()); + dloss += as_scalar(cg.incremental_forward(loss_expr)); nbow.p_t2o.get()->scale_parameters(1.f/pdropout); dtags++; } diff --git a/examples/tok-embed.cc b/examples/tok-embed.cc index 653077cdd..7f917bc2c 100644 --- a/examples/tok-embed.cc +++ b/examples/tok-embed.cc @@ -283,9 +283,9 @@ int main(int argc, char** argv) { auto& sent = training[order[si]]; ++si; Expression w = bclm.embed(cg, sent.second); - d.loss(cg, w, sent.first); + Expression loss_expr = d.loss(cg, w, sent.first); ttags += 1; - loss += as_scalar(cg.forward()); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd->update(1.0); ++lines; diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup.cc index 708d0845b..f66103328 100644 --- a/examples/xor-batch-lookup.cc +++ b/examples/xor-batch-lookup.cc @@ -71,7 +71,7 @@ int main(int argc, char** argv) { // train the parameters for (unsigned iter = 0; iter < ITERATIONS; ++iter) { - vector losses = as_vector(cg.forward()); + vector losses = as_vector(cg.forward(sum_loss)); cg.backward(); sgd.update(0.25); sgd.update_epoch(); diff --git a/examples/xor-batch.cc b/examples/xor-batch.cc index 3b2da1cc1..56ebc275b 100644 --- a/examples/xor-batch.cc +++ b/examples/xor-batch.cc @@ -64,7 +64,7 @@ int main(int argc, char** argv) { // train the parameters for (unsigned iter = 0; iter < ITERATIONS; ++iter) { - float my_loss = as_scalar(cg.forward()) / 4; + float my_loss = as_scalar(cg.forward(sum_loss)) / 4; cg.backward(); sgd.update(0.25); sgd.update_epoch(); diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index ae860718e..26bc54144 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -49,7 +49,7 @@ int main(int argc, char** argv) { Expression h = tanh(W*x + b); Expression y_pred = logistic(V*h + a); - Expression loss = binary_log_loss(y_pred, y); + Expression loss_expr = binary_log_loss(y_pred, y); cg.print_graphviz(); @@ -62,7 +62,7 @@ int main(int argc, char** argv) { x_values[0] = x1 ? 1 : 0; x_values[1] = x2 ? 1 : 0; y_value = (x1 != x2) ? 1 : 0; - loss += as_scalar(cg.forward()); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd.update(1.0); } diff --git a/examples/xor.cc b/examples/xor.cc index c83f5af00..fa28c3162 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -54,7 +54,7 @@ int main(int argc, char** argv) { //Expression h = tanh(affine_transform({b, W, x})); //Expression h = softsign(W*x + b); Expression y_pred = V*h + a; - Expression loss = squared_distance(y_pred, y); + Expression loss_expr = squared_distance(y_pred, y); // Show the computation graph, just for fun. cg.print_graphviz(); @@ -68,7 +68,7 @@ int main(int argc, char** argv) { x_values[0] = x1 ? 1 : -1; x_values[1] = x2 ? 1 : -1; y_value = (x1 != x2) ? 1 : -1; - loss += as_scalar(cg.forward()); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd.update(1.0); } diff --git a/rnnlm/lm.cc b/rnnlm/lm.cc index faa96c538..97fb790a9 100644 --- a/rnnlm/lm.cc +++ b/rnnlm/lm.cc @@ -135,8 +135,8 @@ struct RNNLanguageModel { cur = cfsm->sample(h_t); } else { // regular softmax Expression u_t = affine_transform({bias, R, h_t}); - softmax(u_t); - auto dist = as_vector(cg.incremental_forward()); + Expression dist_expr = softmax(u_t); + auto dist = as_vector(cg.incremental_forward(dist_expr)); double p = rand01(); cur = 0; for (; cur < dist.size(); ++cur) { @@ -300,8 +300,8 @@ int main(int argc, char** argv) { auto& sent = training[order[si]]; chars += sent.size(); ++si; - lm.BuildLMGraph(sent, cg, DROPOUT > 0.f); - loss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(sent, cg, DROPOUT > 0.f); + loss += as_scalar(cg.forward(loss_expr)); cg.backward(); sgd->update(); ++lines; @@ -315,8 +315,8 @@ int main(int argc, char** argv) { int dchars = 0; for (auto& sent : dev) { ComputationGraph cg; - lm.BuildLMGraph(sent, cg, false); - dloss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(sent, cg, false); + dloss += as_scalar(cg.forward(loss_expr)); dchars += sent.size(); } if (dloss < best) { @@ -335,8 +335,8 @@ int main(int argc, char** argv) { int tchars = 0; for (auto& sent : test) { ComputationGraph cg; - lm.BuildLMGraph(sent, cg, false); - tloss += as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(sent, cg, false); + tloss += as_scalar(cg.forward(loss_expr)); tchars += sent.size(); } cerr << "TEST -LLH = " << tloss << endl; @@ -383,8 +383,8 @@ int main(int argc, char** argv) { } // Score hypothesis ComputationGraph cg; - lm.BuildLMGraph(read_sentence(fields[HYP_FIELD], &d), cg, false); - double loss = as_scalar(cg.forward()); + Expression loss_expr = lm.BuildLMGraph(read_sentence(fields[HYP_FIELD], &d), cg, false); + double loss = as_scalar(cg.forward(loss_expr)); // Add score ostringstream os; os << fields[FEAT_FIELD] << " " << FEAT_NAME << sep << loss; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 672b297a7..fabb4ab89 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -88,8 +88,8 @@ BOOST_AUTO_TEST_CASE( negate_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = -x1; - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression operator+(const Expression& x, const Expression& y); @@ -98,8 +98,8 @@ BOOST_AUTO_TEST_CASE( add_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = x1+x2; - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression logsumexp(const std::initializer_list& xs); @@ -107,8 +107,8 @@ BOOST_AUTO_TEST_CASE( logsumexp_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param_scalar1); Expression x2 = parameter(cg, param_scalar2); - logsumexp({x1, x2}); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = logsumexp({x1, x2}); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression operator+(const Expression& x, real y); @@ -116,8 +116,8 @@ BOOST_AUTO_TEST_CASE( addscalar_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = x1+2.0; - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression operator+(real x, const Expression& y); @@ -125,8 +125,8 @@ BOOST_AUTO_TEST_CASE( scalaradd_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = 2.0+x1; - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z =input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression operator-(const Expression& x, const Expression& y); @@ -135,8 +135,8 @@ BOOST_AUTO_TEST_CASE( subtract_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = x1+x2; - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression operator-(real x, const Expression& y); @@ -144,8 +144,8 @@ BOOST_AUTO_TEST_CASE( scalarsubtract_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = 2.0-x1; - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression operator-(const Expression& x, real y); @@ -153,8 +153,8 @@ BOOST_AUTO_TEST_CASE( subtractscalar_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = x1-2.0; - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression operator*(const Expression& x, const Expression& y); @@ -164,8 +164,8 @@ BOOST_AUTO_TEST_CASE( multiply_gradient ) { Expression x2 = parameter(cg, param2); Expression y = x1*transpose(x2); Expression ones3 = input(cg, {1,3}, ones3_vals); - ones3 * y * transpose(ones3); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = ones3 * y * transpose(ones3); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression operator*(const Expression& x, const Expression& y); @@ -175,8 +175,8 @@ BOOST_AUTO_TEST_CASE( multiply_batch_gradient ) { Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = x1*transpose(x2); Expression ones3 = input(cg, {1,3}, ones3_vals); - sum_batches(ones3 * y * transpose(ones3)); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = sum_batches(ones3 * y * transpose(ones3)); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression operator*(const Expression& x, const Expression& y); @@ -187,8 +187,8 @@ BOOST_AUTO_TEST_CASE( affine_gradient ) { Expression x2 = parameter(cg, param2); Expression y = affine_transform({x1, x2, scalar}); Expression ones3 = input(cg, {1,3}, ones3_vals); - ones3 * sqrt(y); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = ones3 * sqrt(y); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression operator*(const Expression& x, const Expression& y); @@ -199,8 +199,8 @@ BOOST_AUTO_TEST_CASE( affine_batch_gradient ) { Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = affine_transform({x1, x2, scalar}); Expression ones3 = input(cg, {1,3}, ones3_vals); - sum_batches(ones3 * sqrt(y)); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = sum_batches(ones3 * sqrt(y)); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression operator*(const Expression& x, const Expression& y); @@ -211,8 +211,8 @@ BOOST_AUTO_TEST_CASE( affine_batch_col_gradient ) { Expression x2 = input(cg, Dim({1,3},2), batch_vals); Expression y = affine_transform({transpose(x1), scalar, x2}); Expression ones3 = input(cg, {3,1}, ones3_vals); - sum_batches(sqrt(y) * ones3); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = sum_batches(sqrt(y) * ones3); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression operator*(const Expression& x, const Expression& y); @@ -223,8 +223,8 @@ BOOST_AUTO_TEST_CASE( affine_batch2_gradient ) { Expression x2 = parameter(cg, param2); Expression y = affine_transform({x1, scalar, transpose(x2) }); Expression ones3 = input(cg, {3,1}, ones3_vals); - sum_batches(sqrt(y) * ones3); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = sum_batches(sqrt(y) * ones3); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression operator*(const Expression& x, const Expression& y); @@ -235,8 +235,8 @@ BOOST_AUTO_TEST_CASE( affine_batch3_gradient ) { Expression inp = input(cg, Dim({3},2), batch_vals); Expression y = affine_transform({x1, x2, inp }); Expression ones3 = input(cg, {1,3}, ones3_vals); - sum_batches(ones3 * sqrt(y)); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = sum_batches(ones3 * sqrt(y)); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression operator*(const Expression& x, float y); @@ -244,8 +244,8 @@ BOOST_AUTO_TEST_CASE( multiplyscalar_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = x1*2.0; - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // inline Expression operator*(float y, const Expression& x) { return x * y; } @@ -253,8 +253,8 @@ BOOST_AUTO_TEST_CASE( scalarmultiply_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = 2.0*x1; - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // inline Expression operator/(const Expression& x, float y) { return x * (1.f / y); } @@ -262,8 +262,8 @@ BOOST_AUTO_TEST_CASE( dividescalar_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = x1/2.0; - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression cdiv(const Expression& x, const Expression& y); @@ -272,8 +272,8 @@ BOOST_AUTO_TEST_CASE( cdiv_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = cdiv(x1, x2); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression cdiv(const Expression& x, const Expression& y); @@ -282,8 +282,8 @@ BOOST_AUTO_TEST_CASE( cdiv_batch_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = cdiv(x1, x2) + cdiv(x2, x1); - sum_batches(input(cg, {1,3}, ones3_vals) * y); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = sum_batches(input(cg, {1,3}, ones3_vals) * y); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression colwise_add(const Expression& x, const Expression& bias); @@ -293,8 +293,8 @@ BOOST_AUTO_TEST_CASE( colwise_add_gradient ) { Expression x2 = parameter(cg, param2); Expression y = colwise_add(x1 * transpose(x2), x2); Expression ones3 = input(cg, {1,3}, ones3_vals); - ones3 * y * transpose(ones3); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = ones3 * y * transpose(ones3); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression concatenate_cols(const std::initializer_list& xs); @@ -304,8 +304,8 @@ BOOST_AUTO_TEST_CASE( concatenate_cols_gradient ) { Expression x2 = parameter(cg, param2); Expression y = concatenate_cols({x1, x2, x1}); Expression ones3 = input(cg, {1,3}, ones3_vals); - ones3 * y * transpose(ones3); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = ones3 * y * transpose(ones3); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression concatenate(const std::initializer_list& xs); @@ -315,8 +315,8 @@ BOOST_AUTO_TEST_CASE( concatenate_gradient ) { Expression x2 = transpose(parameter(cg, param2)); Expression y = concatenate({x1, x2, x1}); Expression ones3 = input(cg, {1,3}, ones3_vals); - ones3 * y * transpose(ones3); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = ones3 * y * transpose(ones3); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b); @@ -327,8 +327,8 @@ BOOST_AUTO_TEST_CASE( contract3d_1d_gradient ) { Expression cube1 = parameter(cg, param_cube1); Expression y = contract3d_1d(cube1, x1, square1); Expression ones3 = input(cg, {1,3}, ones3_vals); - ones3 * y * transpose(ones3); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = ones3 * y * transpose(ones3); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z, const Expression& b); @@ -340,8 +340,8 @@ BOOST_AUTO_TEST_CASE( contract3d_1d_1d_gradient ) { Expression cube1 = parameter(cg, param_cube1); Expression y = contract3d_1d_1d(cube1, x1, x2, x3); Expression ones3 = input(cg, {1,3}, ones3_vals); - ones3 * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = ones3 * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression sqrt(const Expression& x); @@ -349,8 +349,8 @@ BOOST_AUTO_TEST_CASE( sqrt_gradient ) { cnn::ComputationGraph cg; Expression x3 = parameter(cg, param3); Expression y = sqrt(x3); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression erf(const Expression& x); @@ -358,8 +358,8 @@ BOOST_AUTO_TEST_CASE( erf_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = erf(x1); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression tanh(const Expression& x); @@ -367,8 +367,8 @@ BOOST_AUTO_TEST_CASE( tanh_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = tanh(x1); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression exp(const Expression& x); @@ -376,8 +376,8 @@ BOOST_AUTO_TEST_CASE( exp_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = exp(x1); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression square(const Expression& x); @@ -385,8 +385,8 @@ BOOST_AUTO_TEST_CASE( square_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = square(x1); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression cube(const Expression& x); @@ -394,8 +394,8 @@ BOOST_AUTO_TEST_CASE( cube_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = cube(x1); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression lgamma(const Expression& x); @@ -403,8 +403,8 @@ BOOST_AUTO_TEST_CASE( lgamma_gradient ) { cnn::ComputationGraph cg; Expression x2 = parameter(cg, param2); Expression y = lgamma(x2); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression log(const Expression& x); @@ -412,8 +412,8 @@ BOOST_AUTO_TEST_CASE( log_gradient ) { cnn::ComputationGraph cg; Expression x3 = parameter(cg, param3); Expression y = log(x3); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression logistic(const Expression& x); @@ -421,8 +421,8 @@ BOOST_AUTO_TEST_CASE( logistic_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = logistic(x1); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression rectify(const Expression& x); @@ -430,8 +430,8 @@ BOOST_AUTO_TEST_CASE( rectify_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = rectify(x1); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression hinge(const Expression& x, unsigned index, float m = 1.0); @@ -439,8 +439,8 @@ BOOST_AUTO_TEST_CASE( hinge_gradient ) { unsigned index = 0; cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); - hinge(x1, index, 0.5); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = hinge(x1, index, 0.5); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression hinge(const Expression& x, unsigned index, float m = 1.0); @@ -449,8 +449,8 @@ BOOST_AUTO_TEST_CASE( hinge_batch_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); - sum_batches(hinge(x1+x2, idx, 2.f)); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = sum_batches(hinge(x1+x2, idx, 2.f)); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0); @@ -458,8 +458,8 @@ BOOST_AUTO_TEST_CASE( hingeptr_gradient ) { unsigned index = 0; cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); - hinge(x1, &index, 0.5); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = hinge(x1, &index, 0.5); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression log_softmax(const Expression& x); @@ -467,8 +467,8 @@ BOOST_AUTO_TEST_CASE( log_softmax_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = log_softmax(x1); - input(cg, {1,3}, first_one_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, first_one_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression log_softmax(const Expression& x, unsigned v); @@ -477,8 +477,8 @@ BOOST_AUTO_TEST_CASE( log_softmax_batch_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = log_softmax(x1+x2); - sum_batches(input(cg, {1,3}, first_one_vals) * y); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = sum_batches(input(cg, {1,3}, first_one_vals) * y); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression log_softmax(const Expression& x, const std::vector& restriction); @@ -487,8 +487,8 @@ BOOST_AUTO_TEST_CASE( restricted_log_softmax_gradient ) { cnn::ComputationGraph cg; Expression x3 = parameter(cg, param3); Expression y = exp( log_softmax(x3, restriction) ); - input(cg, {1,3}, first_one_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, first_one_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression softmax(const Expression& x); @@ -496,8 +496,8 @@ BOOST_AUTO_TEST_CASE( softmax_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = log(softmax(x1)); - input(cg, {1,3}, first_one_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, first_one_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression softmax(const Expression& x, unsigned v); @@ -506,8 +506,8 @@ BOOST_AUTO_TEST_CASE( softmax_batch_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = log(softmax(x1+x2)); - sum_batches(input(cg, {1,3}, first_one_vals) * y); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = sum_batches(input(cg, {1,3}, first_one_vals) * y); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression sparsemax(const Expression& x); @@ -515,8 +515,8 @@ BOOST_AUTO_TEST_CASE( sparsemax_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = sparsemax(x1); - input(cg, {1,3}, first_one_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, first_one_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression sparsemax_loss(const Expression& x); @@ -524,8 +524,8 @@ BOOST_AUTO_TEST_CASE( sparsemax_loss_gradient ) { std::vector idxs(2); idxs[0] = 1; idxs[1] = 2; cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); - sparsemax_loss(x1, idxs); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = sparsemax_loss(x1, idxs); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression softsign(const Expression& x); @@ -533,8 +533,8 @@ BOOST_AUTO_TEST_CASE( softsign_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = softsign(x1); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression pow(const Expression& x, const Expression& y); @@ -543,8 +543,8 @@ BOOST_AUTO_TEST_CASE( pow_gradient ) { Expression x3 = parameter(cg, param3); Expression x_scalar1 = parameter(cg, param_scalar1); Expression y = pow(x3, x_scalar1); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression min(const Expression& x, const Expression& y); @@ -553,8 +553,8 @@ BOOST_AUTO_TEST_CASE( min_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = min(x1, x2); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression max(const Expression& x, const Expression& y); @@ -563,8 +563,8 @@ BOOST_AUTO_TEST_CASE( max_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = max(x1, x2); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // TODO: Noise is random, so it cannot be tested simply? @@ -595,8 +595,8 @@ BOOST_AUTO_TEST_CASE( reshape_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = reshape(x1, {1,3}); - y * input(cg, {3}, ones3_vals); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = y * input(cg, {3}, ones3_vals); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression transpose(const Expression& x); @@ -604,8 +604,8 @@ BOOST_AUTO_TEST_CASE( transpose_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = softsign(x1); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression trace_of_product(const Expression& x, const Expression& y); @@ -613,8 +613,8 @@ BOOST_AUTO_TEST_CASE( inverse_gradient ) { cnn::ComputationGraph cg; Expression x = parameter(cg, param_square1); Expression y = inverse(x); - input(cg, {1,3}, ones3_vals) * y * input(cg, {3,1}, ones3_vals); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y * input(cg, {3,1}, ones3_vals); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression trace_of_product(const Expression& x, const Expression& y); @@ -622,8 +622,8 @@ BOOST_AUTO_TEST_CASE( trace_of_product_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); - trace_of_product(x1, x2); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = trace_of_product(x1, x2); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression cwise_multiply(const Expression& x, const Expression& y); @@ -632,8 +632,8 @@ BOOST_AUTO_TEST_CASE( cwise_multiply_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = cwise_multiply(x1, x2); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression cwise_multiply(const Expression& x, const Expression& y); @@ -642,8 +642,8 @@ BOOST_AUTO_TEST_CASE( cwise_multiply_batch_gradient ) { Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = cwise_multiply(x1, x2) + cwise_multiply(x2, x1); - sum_batches(input(cg, {1,3}, ones3_vals) * y); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = sum_batches(input(cg, {1,3}, ones3_vals) * y); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression dot_product(const Expression& x, const Expression& y); @@ -651,8 +651,8 @@ BOOST_AUTO_TEST_CASE( dot_product_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); - dot_product(x1, x2); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = dot_product(x1, x2); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression dot_product(const Expression& x, const Expression& y); @@ -660,8 +660,8 @@ BOOST_AUTO_TEST_CASE( dot_product_batch_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); - sum_batches(dot_product(x1, x2) + dot_product(x2, x1) * 2); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = sum_batches(dot_product(x1, x2) + dot_product(x2, x1) * 2); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression squared_distance(const Expression& x, const Expression& y); @@ -669,8 +669,8 @@ BOOST_AUTO_TEST_CASE( squared_distance_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); - squared_distance(x1, x2); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = squared_distance(x1, x2); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression huber_distance(const Expression& x, const Expression& y, float c = 1.345f); @@ -678,8 +678,8 @@ BOOST_AUTO_TEST_CASE( huber_distance_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); - huber_distance(x1, x2); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = huber_distance(x1, x2); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression l1_distance(const Expression& x, const Expression& y); @@ -687,8 +687,8 @@ BOOST_AUTO_TEST_CASE( l1_distance_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); - l1_distance(x1, x2); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = l1_distance(x1, x2); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression binary_log_loss(const Expression& x, const Expression& y); @@ -696,8 +696,8 @@ BOOST_AUTO_TEST_CASE( binary_log_loss_gradient ) { cnn::ComputationGraph cg; Expression x1 = logistic( parameter(cg, param1) ); Expression x2 = input(cg, {3}, ones3_vals); - binary_log_loss(x1, x2); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = binary_log_loss(x1, x2); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0); @@ -705,16 +705,16 @@ BOOST_AUTO_TEST_CASE( pairwise_rank_loss_gradient ) { cnn::ComputationGraph cg; Expression x_scalar1 = parameter(cg, param_scalar1); Expression x_scalar2 = parameter(cg, param_scalar2); - pairwise_rank_loss(x_scalar1, x_scalar2); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = pairwise_rank_loss(x_scalar1, x_scalar2); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression poisson_loss(const Expression& x, unsigned y); BOOST_AUTO_TEST_CASE( possion_loss_gradient ) { cnn::ComputationGraph cg; Expression scalar = parameter(cg, param_scalar1); - poisson_loss(scalar, 3); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = poisson_loss(scalar, 3); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression conv1d_narrow(const Expression& x, const Expression& f); @@ -723,8 +723,8 @@ BOOST_AUTO_TEST_CASE( conv1d_narrow_gradient ) { Expression xsquare = parameter(cg, param_square1); Expression xkernel = parameter(cg, param_kernel1); Expression y = conv1d_narrow(xsquare, xkernel); - input(cg, {1,3}, ones3_vals) * y * input(cg, {2,1}, ones2_vals); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y * input(cg, {2,1}, ones2_vals); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression conv1d_wide(const Expression& x, const Expression& f); @@ -732,8 +732,8 @@ BOOST_AUTO_TEST_CASE( conv1d_wide_gradient ) { cnn::ComputationGraph cg; Expression xkernel = parameter(cg, param_kernel1); Expression y = conv1d_wide(xkernel, xkernel); - input(cg, {1,3}, ones3_vals) * y * input(cg, {3,1}, ones3_vals); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y * input(cg, {3,1}, ones3_vals); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression filter1d_narrow(const Expression& x, const Expression& f); @@ -742,8 +742,8 @@ BOOST_AUTO_TEST_CASE( filter1d_narrow_gradient ) { Expression xsquare = parameter(cg, param_square1); Expression xfilter = parameter(cg, param_filter1); Expression y = filter1d_narrow(xsquare, xfilter); - input(cg, {1,2}, ones3_vals) * y * input(cg, {2,1}, ones2_vals); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,2}, ones3_vals) * y * input(cg, {2,1}, ones2_vals); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression kmax_pooling(const Expression& x, unsigned k); @@ -751,8 +751,8 @@ BOOST_AUTO_TEST_CASE( kmax_pooling_keq1_gradient ) { cnn::ComputationGraph cg; Expression xsquare = parameter(cg, param_square1); Expression y = tanh(kmax_pooling(xsquare, 1)); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression kmax_pooling(const Expression& x, unsigned k); @@ -760,8 +760,8 @@ BOOST_AUTO_TEST_CASE( kmax_pooling_keq2_gradient ) { cnn::ComputationGraph cg; Expression xsquare = parameter(cg, param_square1); Expression y = tanh(kmax_pooling(xsquare, 2)); - input(cg, {1,3}, ones3_vals) * y * input(cg, {2,1}, ones2_vals); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y * input(cg, {2,1}, ones2_vals); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression fold_rows(const Expression& x, unsigned nrows=2); @@ -769,8 +769,8 @@ BOOST_AUTO_TEST_CASE( fold_rows_gradient ) { cnn::ComputationGraph cg; Expression x4 = parameter(cg, param4); Expression y = fold_rows(x4, 2); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression average_cols(const Expression& x); @@ -778,8 +778,8 @@ BOOST_AUTO_TEST_CASE( average_cols_gradient ) { cnn::ComputationGraph cg; Expression xsquare = parameter(cg, param_square1); Expression y = tanh(average_cols(xsquare)); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression sum_cols(const Expression& x); @@ -787,8 +787,8 @@ BOOST_AUTO_TEST_CASE( sum_cols_gradient ) { cnn::ComputationGraph cg; Expression xsquare = parameter(cg, param_square1); Expression y = tanh(sum_cols(xsquare)); - input(cg, {1,3}, ones3_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } @@ -800,8 +800,8 @@ BOOST_AUTO_TEST_CASE( pick_gradient ) { unsigned idx = 1; cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); - pick(x1, idx); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = pick(x1, idx); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression pick(const Expression& x, unsigned* pv); @@ -809,8 +809,8 @@ BOOST_AUTO_TEST_CASE( pickptr_gradient ) { unsigned idx = 1; cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); - pick(x1, &idx); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = pick(x1, &idx); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression pick(const Expression& x, unsigned v); @@ -819,8 +819,8 @@ BOOST_AUTO_TEST_CASE( pick_batch_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); - sum_batches(pick(x1+x2, idx)); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = sum_batches(pick(x1+x2, idx)); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression pickrange(const Expression& x, unsigned v, unsigned u); @@ -828,8 +828,8 @@ BOOST_AUTO_TEST_CASE( pickrange_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = pickrange(x1, 0, 2); - input(cg, {1,2}, ones2_vals) * y; - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = input(cg, {1,2}, ones2_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression pickneglogsoftmax(const Expression& x, unsigned v); @@ -837,8 +837,8 @@ BOOST_AUTO_TEST_CASE( pickneglogsoftmax_gradient ) { unsigned idx = 1; cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); - pickneglogsoftmax(x1, idx); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = pickneglogsoftmax(x1, idx); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression pickneglogsoftmax(const Expression& x, unsigned v); @@ -847,17 +847,17 @@ BOOST_AUTO_TEST_CASE( pickneglogsoftmax_batch_gradient ) { cnn::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); - sum_batches(pickneglogsoftmax(x1+x2, idx)); - BOOST_CHECK(check_grad(mod, cg, 0)); + Expression z = sum_batches(pickneglogsoftmax(x1+x2, idx)); + BOOST_CHECK(check_grad(mod, z, 0)); } // Expression sparse_input(vector& ids, vector& src, float def); BOOST_AUTO_TEST_CASE( sparse_input_test ) { cnn::ComputationGraph cg; std::vector ids = {0, 4}; - input(cg, Dim({3},2), ids, ones2_vals, 0.5); + Expression z = input(cg, Dim({3},2), ids, ones2_vals, 0.5); std::vector exp = {1.0f, 0.5f, 0.5f, 0.5f, 1.0f, 0.5f}; - std::vector act = as_vector(cg.forward()); + std::vector act = as_vector(cg.forward(z)); assert(exp.size() == act.size()); for(size_t i = 0; i < exp.size(); ++i) BOOST_CHECK_CLOSE(exp[i], act[i], 0.001); diff --git a/tests/test-trainers.cc b/tests/test-trainers.cc index 78d3b1869..2705fe736 100644 --- a/tests/test-trainers.cc +++ b/tests/test-trainers.cc @@ -52,11 +52,11 @@ BOOST_AUTO_TEST_CASE( simple_sgd_direction ) { cnn::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); - y*x; - float before = as_scalar(cg.forward()); + Expression z = y*x; + float before = as_scalar(cg.forward(z)); cg.backward(); trainer.update(0.1); - float after = as_scalar(cg.forward()); + float after = as_scalar(cg.forward(z)); BOOST_CHECK_LT(after, before); } @@ -68,11 +68,11 @@ BOOST_AUTO_TEST_CASE( momentum_sgd_direction ) { cnn::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); - y*x; - float before = as_scalar(cg.forward()); + Expression z = y*x; + float before = as_scalar(cg.forward(z)); cg.backward(); trainer.update(0.1); - float after = as_scalar(cg.forward()); + float after = as_scalar(cg.forward(z)); BOOST_CHECK_LT(after, before); } @@ -84,11 +84,11 @@ BOOST_AUTO_TEST_CASE( adagrad_direction ) { cnn::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); - y*x; - float before = as_scalar(cg.forward()); + Expression z = y*x; + float before = as_scalar(cg.forward(z)); cg.backward(); trainer.update(0.1); - float after = as_scalar(cg.forward()); + float after = as_scalar(cg.forward(z)); BOOST_CHECK_LT(after, before); } @@ -100,11 +100,11 @@ BOOST_AUTO_TEST_CASE( adadelta_direction ) { cnn::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); - y*x; - float before = as_scalar(cg.forward()); + Expression z = y*x; + float before = as_scalar(cg.forward(z)); cg.backward(); trainer.update(0.1); - float after = as_scalar(cg.forward()); + float after = as_scalar(cg.forward(z)); BOOST_CHECK_LT(after, before); } @@ -116,11 +116,11 @@ BOOST_AUTO_TEST_CASE( adam_direction ) { cnn::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); - y*x; - float before = as_scalar(cg.forward()); + Expression z = y*x; + float before = as_scalar(cg.forward(z)); cg.backward(); trainer.update(0.1); - float after = as_scalar(cg.forward()); + float after = as_scalar(cg.forward(z)); BOOST_CHECK_LT(after, before); } diff --git a/tutorial/0_multiply.cc b/tutorial/0_multiply.cc index 6935cb294..6b469d1ca 100644 --- a/tutorial/0_multiply.cc +++ b/tutorial/0_multiply.cc @@ -19,9 +19,9 @@ int main(int argc, char** argv) { ia = 1; ib = 2; - cout << as_scalar(cg.forward()) << endl; // 2 + cout << as_scalar(cg.forward(y)) << endl; // 2 ia = 3; ib = 3; - cout << as_scalar(cg.forward()) << endl; // 9 + cout << as_scalar(cg.forward(y)) << endl; // 9 } diff --git a/tutorial/1_linear_regression.cc b/tutorial/1_linear_regression.cc index 4d2242613..936bf5ffa 100644 --- a/tutorial/1_linear_regression.cc +++ b/tutorial/1_linear_regression.cc @@ -35,7 +35,7 @@ int main(int argc, char** argv) { for (unsigned i = 0; i < xs.size(); ++i) { Expression pred = W * xs[i]; Expression loss = square(pred - ys[i]); - cg.forward(); + cg.forward(loss); cg.backward(); trainer.update(); } From 7d52cf250cfc455b9f85259695fb77291ffbc2c1 Mon Sep 17 00:00:00 2001 From: armatthews Date: Wed, 5 Oct 2016 11:50:32 -0400 Subject: [PATCH 665/965] made backward() take an expression to differentiate w.r.t. --- cnn/cnn.cc | 2 +- cnn/cnn.h | 2 +- cnn/grad-check.cc | 2 +- examples/embed-cl.cc | 2 +- examples/encdec.cc | 2 +- examples/mlc.cc | 2 +- examples/nlm.cc | 2 +- examples/poisson-regression.cc | 2 +- examples/read-write.cc | 2 +- examples/rnnlm-aevb.cc | 2 +- examples/rnnlm-batch.cc | 2 +- examples/rnnlm-cfsm.cc | 2 +- examples/rnnlm-givenbag.cc | 2 +- examples/rnnlm-mp.cc | 2 +- examples/rnnlm.cc | 2 +- examples/skiprnnlm.cc | 2 +- examples/tag-bilstm.cc | 2 +- examples/textcat.cc | 2 +- examples/tok-embed.cc | 2 +- examples/xor-batch-lookup.cc | 2 +- examples/xor-batch.cc | 2 +- examples/xor-xent.cc | 2 +- examples/xor.cc | 2 +- rnnlm/lm.cc | 2 +- tests/test-trainers.cc | 10 +++++----- tutorial/1_linear_regression.cc | 2 +- 26 files changed, 30 insertions(+), 30 deletions(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index bced2a978..47ac788a4 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -250,7 +250,7 @@ const Tensor& ComputationGraph::forward(const expr::Expression& last) { return e const Tensor& ComputationGraph::get_value(VariableIndex i) { return ee->get_value(i); } const Tensor& ComputationGraph::get_value(const expr::Expression& e) { return this->get_value(e.i); } void ComputationGraph::invalidate() { ee->invalidate(); } -void ComputationGraph::backward() { ee->backward(); } +void ComputationGraph::backward(const expr::Expression& last) { ee->backward(last.i); } void ComputationGraph::backward(VariableIndex i) { ee->backward(i); } void ComputationGraph::print_graphviz() const { diff --git a/cnn/cnn.h b/cnn/cnn.h index c82f7aab3..28bc710b5 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -119,7 +119,7 @@ struct ComputationGraph { // clears forward caches (for get_value etc). void invalidate(); // computes backward gradients from the front-most evaluated node. - void backward(); + void backward(const expr::Expression& last); // computes backward gradients from node i (assuming it already been evaluated). void backward(VariableIndex i); diff --git a/cnn/grad-check.cc b/cnn/grad-check.cc index 44a7d062a..2c4901889 100644 --- a/cnn/grad-check.cc +++ b/cnn/grad-check.cc @@ -25,7 +25,7 @@ bool check_grad(Model& m, expr::Expression& expr, int verbosity) { // Perform forward and backward steps float alpha = 5e-4; g.forward(expr); - g.backward(); + g.backward(expr); // Check bool flag = false, curr_flag = false; diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index 71581b5a0..95f16cfd6 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -192,7 +192,7 @@ int main(int argc, char** argv) { assert(iloss >= 0); if (iloss > 0) { loss += iloss; - cg.backward(); + cg.backward(l); sgd->update(); } ++lines; diff --git a/examples/encdec.cc b/examples/encdec.cc index c8987649c..3d434bc03 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -241,7 +241,7 @@ int main(int argc, char** argv) { Expression loss_expr = lm.BuildGraph(sent, sent, cg); //cg.print_graphviz(); loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd->update(); ++lines; } diff --git a/examples/mlc.cc b/examples/mlc.cc index dec8ace76..1c96d34b2 100644 --- a/examples/mlc.cc +++ b/examples/mlc.cc @@ -170,7 +170,7 @@ int main(int argc, char** argv) { } Expression loss_expr = sparsemax_loss(u, &xy.labels); loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd.update(1.0); } cerr << "[epoch=" << (ti / train.size()) << "] E=" << (loss / instances) << ' '; diff --git a/examples/nlm.cc b/examples/nlm.cc index 5ffc389d2..0cd748628 100644 --- a/examples/nlm.cc +++ b/examples/nlm.cc @@ -74,7 +74,7 @@ int main(int argc, char** argv) { copy(ci.begin(), ci.begin()+CONTEXT, in_c.begin()); ytrue = ci.back(); loss += as_scalar(cg.forward(nerr)); - cg.backward(); + cg.backward(nerr); ++n; sgd.update(1.0); if (n == 2500) break; diff --git a/examples/poisson-regression.cc b/examples/poisson-regression.cc index a3ed426d9..32acb0d5d 100644 --- a/examples/poisson-regression.cc +++ b/examples/poisson-regression.cc @@ -173,7 +173,7 @@ int main(int argc, char** argv) { ++si; Expression loss_expr = lm.BuildLMGraph(sent.first, sent.second, cg); loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd->update(); ++lines; ++chars; diff --git a/examples/read-write.cc b/examples/read-write.cc index 7f8dc191d..559b126d3 100644 --- a/examples/read-write.cc +++ b/examples/read-write.cc @@ -60,7 +60,7 @@ class XORModel { Expression loss = squared_distance(y_pred, y); float return_loss = as_scalar(cg.forward(loss)); - cg.backward(); + cg.backward(loss); sgd->update(1.0); return return_loss; } diff --git a/examples/rnnlm-aevb.cc b/examples/rnnlm-aevb.cc index 9665680ed..33bdc7e59 100644 --- a/examples/rnnlm-aevb.cc +++ b/examples/rnnlm-aevb.cc @@ -220,7 +220,7 @@ int main(int argc, char** argv) { ++si; Expression loss_expr = lm.BuildLMGraph(sent, cg); loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd->update(); ++lines; } diff --git a/examples/rnnlm-batch.cc b/examples/rnnlm-batch.cc index a079721ee..7e5def104 100644 --- a/examples/rnnlm-batch.cc +++ b/examples/rnnlm-batch.cc @@ -223,7 +223,7 @@ int main(int argc, char** argv) { unsigned bsize = std::min((unsigned)training.size()-order[si], BATCH_SIZE); // Batch size Expression loss_expr = lm.BuildLMGraphs(training, order[si], bsize, chars, cg); loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd->update(); lines += bsize; } diff --git a/examples/rnnlm-cfsm.cc b/examples/rnnlm-cfsm.cc index 5bb6f9310..537ea270d 100644 --- a/examples/rnnlm-cfsm.cc +++ b/examples/rnnlm-cfsm.cc @@ -186,7 +186,7 @@ int main(int argc, char** argv) { ++si; Expression loss_expr = lm.BuildLMGraph(sent, cg); loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd->update(); ++lines; } diff --git a/examples/rnnlm-givenbag.cc b/examples/rnnlm-givenbag.cc index a0391614f..768784258 100644 --- a/examples/rnnlm-givenbag.cc +++ b/examples/rnnlm-givenbag.cc @@ -218,7 +218,7 @@ int main(int argc, char** argv) { ++si; Expression loss_expr = lm.BuildLMGraph(rmsent, cg, &rows); loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd->update(); for (auto w : sent) { w2sl[w] = 0; } ++lines; diff --git a/examples/rnnlm-mp.cc b/examples/rnnlm-mp.cc index 283da56c7..931dab27f 100644 --- a/examples/rnnlm-mp.cc +++ b/examples/rnnlm-mp.cc @@ -47,7 +47,7 @@ class Learner : public ILearner { Expression loss_expr = rnnlm.BuildLMGraph(datum, cg); cnn::real loss = as_scalar(cg.forward(loss_expr)); if (learn) { - cg.backward(); + cg.backward(loss_expr); } return loss; } diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index fb31d09a1..9c46ca78d 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -216,7 +216,7 @@ int main(int argc, char** argv) { ++si; Expression loss_expr = lm.BuildLMGraph(sent, cg); loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd->update(); ++lines; } diff --git a/examples/skiprnnlm.cc b/examples/skiprnnlm.cc index 582e77ec7..a2403dc25 100644 --- a/examples/skiprnnlm.cc +++ b/examples/skiprnnlm.cc @@ -171,7 +171,7 @@ int main(int argc, char** argv) { //LOG(INFO) << "sent length " << sent.size(); Expression loss_expr = lm.BuildLMGraph(doc, cg); loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd->update(); ++lines; } diff --git a/examples/tag-bilstm.cc b/examples/tag-bilstm.cc index 5aa071253..1e56f2478 100644 --- a/examples/tag-bilstm.cc +++ b/examples/tag-bilstm.cc @@ -225,7 +225,7 @@ int main(int argc, char** argv) { ++si; Expression loss_expr = lm.BuildTaggingGraph(sent.first, sent.second, cg, &correct, &ttags); loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd->update(1.0); ++lines; } diff --git a/examples/textcat.cc b/examples/textcat.cc index ea57450ea..3e8110c51 100644 --- a/examples/textcat.cc +++ b/examples/textcat.cc @@ -274,7 +274,7 @@ int main(int argc, char** argv) { //Expression loss_expr = CrossEntropyLoss(y_pred, y); Expression loss_expr = HingeLoss(y_pred, y); loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd->update(2.0); ++lines; ++ttags; diff --git a/examples/tok-embed.cc b/examples/tok-embed.cc index 7f917bc2c..f7a83d85b 100644 --- a/examples/tok-embed.cc +++ b/examples/tok-embed.cc @@ -286,7 +286,7 @@ int main(int argc, char** argv) { Expression loss_expr = d.loss(cg, w, sent.first); ttags += 1; loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd->update(1.0); ++lines; } diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup.cc index f66103328..74bb33c2f 100644 --- a/examples/xor-batch-lookup.cc +++ b/examples/xor-batch-lookup.cc @@ -72,7 +72,7 @@ int main(int argc, char** argv) { // train the parameters for (unsigned iter = 0; iter < ITERATIONS; ++iter) { vector losses = as_vector(cg.forward(sum_loss)); - cg.backward(); + cg.backward(sum_loss); sgd.update(0.25); sgd.update_epoch(); float loss = 0; diff --git a/examples/xor-batch.cc b/examples/xor-batch.cc index 56ebc275b..b90188b89 100644 --- a/examples/xor-batch.cc +++ b/examples/xor-batch.cc @@ -65,7 +65,7 @@ int main(int argc, char** argv) { // train the parameters for (unsigned iter = 0; iter < ITERATIONS; ++iter) { float my_loss = as_scalar(cg.forward(sum_loss)) / 4; - cg.backward(); + cg.backward(sum_loss); sgd.update(0.25); sgd.update_epoch(); cerr << "E = " << my_loss << endl; diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index 26bc54144..6cf28b263 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -63,7 +63,7 @@ int main(int argc, char** argv) { x_values[1] = x2 ? 1 : 0; y_value = (x1 != x2) ? 1 : 0; loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd.update(1.0); } sgd.update_epoch(); diff --git a/examples/xor.cc b/examples/xor.cc index fa28c3162..12b9cb03e 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -69,7 +69,7 @@ int main(int argc, char** argv) { x_values[1] = x2 ? 1 : -1; y_value = (x1 != x2) ? 1 : -1; loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd.update(1.0); } sgd.update_epoch(); diff --git a/rnnlm/lm.cc b/rnnlm/lm.cc index 97fb790a9..401ae8665 100644 --- a/rnnlm/lm.cc +++ b/rnnlm/lm.cc @@ -302,7 +302,7 @@ int main(int argc, char** argv) { ++si; Expression loss_expr = lm.BuildLMGraph(sent, cg, DROPOUT > 0.f); loss += as_scalar(cg.forward(loss_expr)); - cg.backward(); + cg.backward(loss_expr); sgd->update(); ++lines; } diff --git a/tests/test-trainers.cc b/tests/test-trainers.cc index 2705fe736..d9d67cee2 100644 --- a/tests/test-trainers.cc +++ b/tests/test-trainers.cc @@ -54,7 +54,7 @@ BOOST_AUTO_TEST_CASE( simple_sgd_direction ) { Expression y = input(cg, {1,3}, ones_vals); Expression z = y*x; float before = as_scalar(cg.forward(z)); - cg.backward(); + cg.backward(z); trainer.update(0.1); float after = as_scalar(cg.forward(z)); BOOST_CHECK_LT(after, before); @@ -70,7 +70,7 @@ BOOST_AUTO_TEST_CASE( momentum_sgd_direction ) { Expression y = input(cg, {1,3}, ones_vals); Expression z = y*x; float before = as_scalar(cg.forward(z)); - cg.backward(); + cg.backward(z); trainer.update(0.1); float after = as_scalar(cg.forward(z)); BOOST_CHECK_LT(after, before); @@ -86,7 +86,7 @@ BOOST_AUTO_TEST_CASE( adagrad_direction ) { Expression y = input(cg, {1,3}, ones_vals); Expression z = y*x; float before = as_scalar(cg.forward(z)); - cg.backward(); + cg.backward(z); trainer.update(0.1); float after = as_scalar(cg.forward(z)); BOOST_CHECK_LT(after, before); @@ -102,7 +102,7 @@ BOOST_AUTO_TEST_CASE( adadelta_direction ) { Expression y = input(cg, {1,3}, ones_vals); Expression z = y*x; float before = as_scalar(cg.forward(z)); - cg.backward(); + cg.backward(z); trainer.update(0.1); float after = as_scalar(cg.forward(z)); BOOST_CHECK_LT(after, before); @@ -118,7 +118,7 @@ BOOST_AUTO_TEST_CASE( adam_direction ) { Expression y = input(cg, {1,3}, ones_vals); Expression z = y*x; float before = as_scalar(cg.forward(z)); - cg.backward(); + cg.backward(z); trainer.update(0.1); float after = as_scalar(cg.forward(z)); BOOST_CHECK_LT(after, before); diff --git a/tutorial/1_linear_regression.cc b/tutorial/1_linear_regression.cc index 936bf5ffa..5bfca8772 100644 --- a/tutorial/1_linear_regression.cc +++ b/tutorial/1_linear_regression.cc @@ -36,7 +36,7 @@ int main(int argc, char** argv) { Expression pred = W * xs[i]; Expression loss = square(pred - ys[i]); cg.forward(loss); - cg.backward(); + cg.backward(loss); trainer.update(); } From 83ecb2a03a429faf2cf9728d2744204d12496d09 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 5 Oct 2016 11:50:49 -0400 Subject: [PATCH 666/965] Changed tests to run on GPU when compiling with --- tests/CMakeLists.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ad987bbcd..dac3a4376 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -12,13 +12,18 @@ set(test_cnn_SRCS ) add_executable (test-cnn test-cnn.cc ${test_cnn_SRCS}) -target_link_libraries (test-cnn cnn ${LIBS} - ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} - ) + if (WITH_CUDA_BACKEND) + target_link_libraries (test-cnn gcnn ${LIBS} + ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} + ) add_dependencies(test-cnn cnncuda) target_link_libraries(test-cnn cnncuda) CUDA_ADD_CUBLAS_TO_TARGET(test-cnn) +else() + target_link_libraries (test-cnn cnn ${LIBS} + ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} + ) endif (WITH_CUDA_BACKEND) add_test(test-cnn test-cnn) From 05f31b7b4de27d598555e3e6cd35c3f068893947 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Wed, 5 Oct 2016 20:00:37 +0300 Subject: [PATCH 667/965] gpu support for pycnn. --- pycnn/CMakeLists.txt | 16 +++++++++++++++- pycnn/pycnn.py | 4 ++++ pycnn/setup.py.in | 24 ++++++++++++++++++++++-- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/pycnn/CMakeLists.txt b/pycnn/CMakeLists.txt index d23596f3b..a6003b429 100644 --- a/pycnn/CMakeLists.txt +++ b/pycnn/CMakeLists.txt @@ -13,6 +13,11 @@ if(PYTHON) ${CMAKE_CURRENT_SOURCE_DIR}/pybridge.h ) +if (WITH_CUDA_BACKEND) + message("--- CUDA:" ${CUDA_CUBLAS_LIBRARIES}) + get_filename_component(CUDA_CUBLAS_LIB ${CUDA_CUBLAS_LIBRARIES} PATH) +endif() + add_custom_target(copy) foreach(DepFile ${DepFiles}) add_custom_command(TARGET copy PRE_BUILD @@ -22,6 +27,11 @@ if(PYTHON) # TODO: We should add a dependency, but this isn&t working # add_dependencies(copy ${DepFiles}) + add_custom_command(TARGET copy PRE_BUILD + COMMAND ${CMAKE_COMMAND} -E + copy ${CMAKE_CURRENT_SOURCE_DIR}/pycnn.pyx ${CMAKE_CURRENT_BINARY_DIR}/gpycnn.pyx) + + # Things to perform setup set(SETUP_PY "${CMAKE_CURRENT_BINARY_DIR}/setup.py") set(SETUP_PY_IN "${CMAKE_CURRENT_SOURCE_DIR}/setup.py.in") @@ -31,12 +41,16 @@ if(PYTHON) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/timestamp COMMAND ${PYTHON} - ARGS setup.py build + ARGS setup.py build_ext --inplace COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/timestamp DEPENDS ${DepFiles}) add_custom_target(target ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/timestamp) add_dependencies(target copy) + add_dependencies(copy cnn) + if (WITH_CUDA_BACKEND) + add_dependencies(copy gcnn) + endif() install(CODE "execute_process(COMMAND ${PYTHON} ${SETUP_PY})") diff --git a/pycnn/pycnn.py b/pycnn/pycnn.py index fbf2d7003..8dc3b750d 100644 --- a/pycnn/pycnn.py +++ b/pycnn/pycnn.py @@ -1,6 +1,10 @@ import sys if '--pycnn-viz' in sys.argv: from pycnn_viz import * +elif '--pycnn-gpu' in sys.argv: + def print_graphviz(**kwarge): + print "Run with --pycnn-viz to get the visualization behavior." + from _gpycnn import * else: def print_graphviz(**kwarge): print "Run with --pycnn-viz to get the visualization behavior." diff --git a/pycnn/setup.py.in b/pycnn/setup.py.in index a293e96c6..002885f22 100644 --- a/pycnn/setup.py.in +++ b/pycnn/setup.py.in @@ -16,7 +16,8 @@ import platform if platform.system() == 'Darwin': COMPILER_ARGS.extend(["-stdlib=libc++","-mmacosx-version-min=10.7"]) -ext = Extension( + +ext_cpu = Extension( "_pycnn", # name of extension ["pycnn.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source @@ -30,7 +31,26 @@ ext = Extension( runtime_library_dirs=["${PROJECT_BINARY_DIR}/cnn/"], ) -setup(ext_modules = [ext], +ext_gpu = Extension( + "_gpycnn", # name of extension + ["gpycnn.pyx"], # filename of our Pyrex/Cython source + language="c++", # this causes Pyrex/Cython to create C++ source + include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main cnn directory. + "${EIGEN3_INCLUDE_DIR}", # this is the directory where eigen is saved. + "${Boost_INCLUDE_DIR}"], # this is the directory where boost is. + libraries=['gcnn','cnncuda','cublas'], # ditto + library_dirs=[".","${PROJECT_BINARY_DIR}/cnn/","${CUDA_CUBLAS_LIB}"], + #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed + extra_compile_args=COMPILER_ARGS, + runtime_library_dirs=["${PROJECT_BINARY_DIR}/cnn/"], + ) + +TARGET = [ext_cpu] + +if "${WITH_CUDA_BACKEND}"=="1": # if cuda requested + TARGET.append(ext_gpu) + +setup(ext_modules = TARGET, cmdclass = {'build_ext': build_ext}, name="pyCNN", py_modules = ['pycnn','pycnn_viz'], From a6d937dcd820ed871c8e91d40fb35b740eecdf3c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 5 Oct 2016 23:43:44 -0400 Subject: [PATCH 668/965] Moved some serialization from .h to .cc --- cnn/CMakeLists.txt | 1 + cnn/cfsm-builder.cc | 29 +++++++++++++++-- cnn/cfsm-builder.h | 23 +++----------- cnn/cnn.cc | 1 + cnn/cnn.h | 5 +-- cnn/io-macros.h | 21 +++++++++++++ cnn/lstm.cc | 15 +++++++++ cnn/lstm.h | 7 +---- cnn/model.cc | 69 ++++++++++++++++++++++++++++++++++++++-- cnn/model.h | 51 +++++------------------------- cnn/mp.h | 4 +-- cnn/rnn.cc | 22 +++++++++++-- cnn/rnn.h | 19 +++-------- cnn/tensor.cc | 59 ++++++++++++++++++++++++++++++++++ cnn/tensor.h | 56 +++------------------------------ cnn/training.cc | 75 +++++++++++++++++++++++++++++++++++++++----- cnn/training.h | 48 +++++----------------------- cnn/weight-decay.cc | 13 ++++++++ cnn/weight-decay.h | 7 ++--- examples/embed-cl.cc | 2 ++ 20 files changed, 328 insertions(+), 199 deletions(-) create mode 100644 cnn/io-macros.h create mode 100644 cnn/weight-decay.cc diff --git a/cnn/CMakeLists.txt b/cnn/CMakeLists.txt index e87b20898..952852cc8 100644 --- a/cnn/CMakeLists.txt +++ b/cnn/CMakeLists.txt @@ -32,6 +32,7 @@ set(cnn_library_SRCS shadow-params.cc tensor.cc training.cc + weight-decay.cc ) # Headers: diff --git a/cnn/cfsm-builder.cc b/cnn/cfsm-builder.cc index 513e3715a..78e7556b0 100644 --- a/cnn/cfsm-builder.cc +++ b/cnn/cfsm-builder.cc @@ -3,10 +3,12 @@ #include #include +#include "cnn/io-macros.h" + using namespace std; -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::StandardSoftmaxBuilder) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ClassFactoredSoftmaxBuilder) +// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::StandardSoftmaxBuilder) +// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ClassFactoredSoftmaxBuilder) namespace cnn { @@ -53,6 +55,14 @@ Expression StandardSoftmaxBuilder::full_log_distribution(const Expression& rep) return log(softmax(affine_transform({b, w, rep}))); } +template +void StandardSoftmaxBuilder::serialize(Archive& ar, const unsigned int) { + boost::serialization::base_object(*this); + ar & p_w; + ar & p_b; +} +CNN_SERIALIZE_IMPL(StandardSoftmaxBuilder) + ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder() {} ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder(unsigned rep_dim, @@ -211,4 +221,19 @@ void ClassFactoredSoftmaxBuilder::read_cluster_file(const std::string& cluster_f cerr << "Read " << wc << " words in " << cdict.size() << " clusters (" << scs << " singleton clusters)\n"; } +template +void ClassFactoredSoftmaxBuilder::serialize(Archive& ar, const unsigned int) { + boost::serialization::base_object(*this); + ar & cdict; + ar & widx2cidx; + ar & widx2cwidx; + ar & cidx2words; + ar & singleton_cluster; + ar & p_r2c; + ar & p_cbias; + ar & p_rc2ws; + ar & p_rcwbiases; +} +CNN_SERIALIZE_IMPL(ClassFactoredSoftmaxBuilder) + } // namespace cnn diff --git a/cnn/cfsm-builder.h b/cnn/cfsm-builder.h index e4beced5d..e3e57ebde 100644 --- a/cnn/cfsm-builder.h +++ b/cnn/cfsm-builder.h @@ -49,11 +49,7 @@ class StandardSoftmaxBuilder : public SoftmaxBuilder { friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - boost::serialization::base_object(*this); - ar & p_w; - ar & p_b; - } + void serialize(Archive& ar, const unsigned int); }; // helps with implementation of hierarchical softmax @@ -108,20 +104,9 @@ class ClassFactoredSoftmaxBuilder : public SoftmaxBuilder { friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - boost::serialization::base_object(*this); - ar & cdict; - ar & widx2cidx; - ar & widx2cwidx; - ar & cidx2words; - ar & singleton_cluster; - ar & p_r2c; - ar & p_cbias; - ar & p_rc2ws; - ar & p_rcwbiases; - } + void serialize(Archive& ar, const unsigned int); }; } // namespace cnn -BOOST_CLASS_EXPORT_KEY(cnn::StandardSoftmaxBuilder) -BOOST_CLASS_EXPORT_KEY(cnn::ClassFactoredSoftmaxBuilder) +//BOOST_CLASS_EXPORT_KEY(cnn::StandardSoftmaxBuilder) +//BOOST_CLASS_EXPORT_KEY(cnn::ClassFactoredSoftmaxBuilder) #endif diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 3850c68f1..a66bee2c7 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -1,4 +1,5 @@ #include "cnn/cnn.h" + #include "cnn/exec.h" #include "cnn/nodes.h" #include "cnn/param-nodes.h" diff --git a/cnn/cnn.h b/cnn/cnn.h index fa9096a11..8c45d69a4 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -6,11 +6,8 @@ #include #include #include + #include -#include -#include -#include -#include #include "cnn/init.h" #include "cnn/aligned-mem-pool.h" diff --git a/cnn/io-macros.h b/cnn/io-macros.h new file mode 100644 index 000000000..8c3ff9b5e --- /dev/null +++ b/cnn/io-macros.h @@ -0,0 +1,21 @@ +#ifndef CNN_IO_MACROS__ +#define CNN_IO_MACROS__ + +#include +#include +#include +#include + +#define CNN_SERIALIZE_IMPL(MyClass) \ + template void MyClass::serialize(boost::archive::text_oarchive &ar, const unsigned int); \ + template void MyClass::serialize(boost::archive::text_iarchive &ar, const unsigned int); \ + template void MyClass::serialize(boost::archive::binary_oarchive &ar, const unsigned int); \ + template void MyClass::serialize(boost::archive::binary_iarchive &ar, const unsigned int); + +#define CNN_SAVELOAD_IMPL(MyClass) \ + template void MyClass::save(boost::archive::text_oarchive &ar, const unsigned int) const; \ + template void MyClass::load(boost::archive::text_iarchive &ar, const unsigned int); \ + template void MyClass::save(boost::archive::binary_oarchive &ar, const unsigned int) const; \ + template void MyClass::load(boost::archive::binary_iarchive &ar, const unsigned int); + +#endif diff --git a/cnn/lstm.cc b/cnn/lstm.cc index f42157eb9..19d5c0178 100644 --- a/cnn/lstm.cc +++ b/cnn/lstm.cc @@ -6,7 +6,13 @@ #include #include +#include +#include +#include +#include + #include "cnn/nodes.h" +#include "cnn/io-macros.h" using namespace std; using namespace cnn::expr; @@ -199,4 +205,13 @@ void LSTMBuilder::load_parameters_pretraining(const string& fname) { } } +template +void LSTMBuilder::serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & params; + ar & layers; + ar & dropout_rate; +} +CNN_SERIALIZE_IMPL(LSTMBuilder); + } // namespace cnn diff --git a/cnn/lstm.h b/cnn/lstm.h index 4f4ede5a0..3be8bb68c 100644 --- a/cnn/lstm.h +++ b/cnn/lstm.h @@ -63,12 +63,7 @@ struct LSTMBuilder : public RNNBuilder { private: friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & boost::serialization::base_object(*this); - ar & params; - ar & layers; - ar & dropout_rate; - } + void serialize(Archive& ar, const unsigned int); }; diff --git a/cnn/model.cc b/cnn/model.cc index a55292ea2..85530f0aa 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -2,6 +2,7 @@ #include "cnn/tensor.h" #include "cnn/aligned-mem-pool.h" #include "cnn/cnn.h" +#include "cnn/io-macros.h" #include #include @@ -12,6 +13,11 @@ #ifndef __CUDACC__ #include #include +#include +#include +#include +#include +#include #endif // Macros for defining functions over parameters @@ -40,8 +46,8 @@ using namespace std; #ifndef __CUDACC__ -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ParameterStorage) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::LookupParameterStorage) +// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ParameterStorage) +// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::LookupParameterStorage) #endif namespace cnn { @@ -81,6 +87,17 @@ void ParameterStorage::clear() { TensorTools::Zero(g); } +#ifndef __CUDACC__ +template +void ParameterStorage::serialize(Archive& ar, const unsigned int) { + boost::serialization::base_object(*this); + ar & dim; + ar & values; + ar & g; +} +CNN_SERIALIZE_IMPL(ParameterStorage) +#endif + LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d) { all_dim = dim; all_dim.d[all_dim.nd++] = n; all_grads.d = all_values.d = all_dim; @@ -125,6 +142,25 @@ void LookupParameterStorage::clear() { non_zero_grads.clear(); } +#ifndef __CUDACC__ +template +void LookupParameterStorage::save(Archive& ar, const unsigned int) const { + ar << boost::serialization::base_object(*this); + ar << all_dim; + ar << all_values; + ar << all_grads; +} +template +void LookupParameterStorage::load(Archive& ar, const unsigned int) { + ar >> boost::serialization::base_object(*this); + ar >> all_dim; + ar >> all_values; + ar >> all_grads; + initialize_lookups(); +} +CNN_SAVELOAD_IMPL(LookupParameterStorage) +#endif + Parameter::Parameter() { mp = nullptr; index = 0; @@ -140,6 +176,15 @@ void Parameter::zero() { return mp->parameters_list()[index]->zero(); } +#ifndef __CUDACC__ +template +void Parameter::serialize(Archive& ar, const unsigned int) { + ar & mp; + ar & index; +} +CNN_SERIALIZE_IMPL(Parameter) +#endif + LookupParameter::LookupParameter() { mp = nullptr; index = 0; @@ -159,6 +204,15 @@ void LookupParameter::initialize(unsigned index, const std::vector& val) get()->initialize(index, val); } +#ifndef __CUDACC__ +template +void LookupParameter::serialize(Archive& ar, const unsigned int) { + ar & mp; + ar & index; +} +CNN_SERIALIZE_IMPL(LookupParameter) +#endif + Model::Model() : gradient_norm_scratch(nullptr) { weight_decay.set_lambda(weight_decay_lambda); } @@ -219,6 +273,17 @@ size_t Model::parameter_count() const { return r; } +#ifndef __CUDACC__ +template +void Model::serialize(Archive& ar, const unsigned int) { + ar & all_params; + ar & params; + ar & lookup_params; + ar & weight_decay; +} +CNN_SERIALIZE_IMPL(Model) +#endif + void save_cnn_model(std::string filename, Model* model) { std::ofstream out(filename); boost::archive::text_oarchive oa(out); diff --git a/cnn/model.h b/cnn/model.h index df1df177c..371a84f54 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -5,14 +5,6 @@ #include #include -#include -#include -#include -#include -#include -#include -#include - #include "cnn/tensor.h" #include "cnn/weight-decay.h" @@ -67,12 +59,7 @@ struct ParameterStorage : public ParameterStorageBase { // or Glorot initialization if minmax = 0 friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - boost::serialization::base_object(*this); - ar & dim; - ar & values; - ar & g; - } + void serialize(Archive& ar, const unsigned int); }; // represents a matrix/vector embedding of a discrete set @@ -117,20 +104,9 @@ struct LookupParameterStorage : public ParameterStorageBase { LookupParameterStorage(unsigned n, const Dim& d); friend class boost::serialization::access; template - void save(Archive& ar, const unsigned int) const { - ar << boost::serialization::base_object(*this); - ar << all_dim; - ar << all_values; - ar << all_grads; - } + void save(Archive& ar, const unsigned int) const; template - void load(Archive& ar, const unsigned int) { - ar >> boost::serialization::base_object(*this); - ar >> all_dim; - ar >> all_values; - ar >> all_grads; - initialize_lookups(); - } + void load(Archive& ar, const unsigned int); BOOST_SERIALIZATION_SPLIT_MEMBER() }; @@ -152,10 +128,7 @@ struct Parameter { private: friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & mp; - ar & index; - } + void serialize(Archive& ar, const unsigned int); }; struct LookupParameter { @@ -176,10 +149,7 @@ struct LookupParameter { private: friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & mp; - ar & index; - } + void serialize(Archive& ar, const unsigned int); }; // this is a collection of parameters @@ -213,12 +183,7 @@ class Model { private: friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & all_params; - ar & params; - ar & lookup_params; - ar & weight_decay; - } + void serialize(Archive& ar, const unsigned int); std::vector all_params; std::vector params; @@ -230,7 +195,7 @@ void save_cnn_model(std::string filename, Model* model); void load_cnn_model(std::string filename, Model* model); } // namespace cnn -BOOST_CLASS_EXPORT_KEY(cnn::ParameterStorage) -BOOST_CLASS_EXPORT_KEY(cnn::LookupParameterStorage) +// BOOST_CLASS_EXPORT_KEY(cnn::ParameterStorage) +// BOOST_CLASS_EXPORT_KEY(cnn::LookupParameterStorage) #endif diff --git a/cnn/mp.h b/cnn/mp.h index 17c6635ac..4e962539c 100644 --- a/cnn/mp.h +++ b/cnn/mp.h @@ -6,8 +6,6 @@ #include "cnn/expr.h" #include "cnn/dict.h" #include "cnn/lstm.h" -#include -#include #include #include #include @@ -373,4 +371,4 @@ namespace cnn { } } } -#endif // !_WINDOWS \ No newline at end of file +#endif // !_WINDOWS diff --git a/cnn/rnn.cc b/cnn/rnn.cc index cf1781c90..9e475de50 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -1,4 +1,5 @@ #include "cnn/rnn.h" +#include "cnn/io-macros.h" #include #include @@ -7,6 +8,9 @@ #include #include #include +#include +#include + #include "cnn/nodes.h" #include "cnn/expr.h" @@ -15,8 +19,6 @@ using namespace std; using namespace cnn::expr; using namespace cnn; -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::RNNBuilder) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::SimpleRNNBuilder) namespace cnn { enum { X2H=0, H2H, HB, L2H }; @@ -33,6 +35,14 @@ void RNNBuilder::load_parameters_pretraining(const string& fname) { abort(); } +template +void RNNBuilder::serialize(Archive& ar, const unsigned int) { + ar & cur; + ar & head; + ar & sm; +} +CNN_SERIALIZE_IMPL(RNNBuilder) + SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, @@ -177,5 +187,13 @@ void SimpleRNNBuilder::load_parameters_pretraining(const string& fname) { } } +template +void SimpleRNNBuilder::serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & params; + ar & layers; + ar & lagging; +} +CNN_SERIALIZE_IMPL(SimpleRNNBuilder) } // namespace cnn diff --git a/cnn/rnn.h b/cnn/rnn.h index b85325a09..cb3cd3f58 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -1,7 +1,6 @@ #ifndef CNN_RNN_H_ #define CNN_RNN_H_ -#include #include "cnn/cnn.h" #include "cnn/rnn-state-machine.h" #include "cnn/expr.h" @@ -108,11 +107,7 @@ struct RNNBuilder { friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & cur; - ar & head; - ar & sm; - } + void serialize(Archive& ar, const unsigned int); }; struct SimpleRNNBuilder : public RNNBuilder { @@ -163,12 +158,8 @@ struct SimpleRNNBuilder : public RNNBuilder { friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & boost::serialization::base_object(*this); - ar & params; - ar & layers; - ar & lagging; - } + void serialize(Archive& ar, const unsigned int); + }; } // namespace cnn @@ -184,6 +175,6 @@ namespace boost { } // namespace serialization } // namespace boost -BOOST_CLASS_EXPORT_KEY(cnn::RNNBuilder) -BOOST_CLASS_EXPORT_KEY(cnn::SimpleRNNBuilder) +// BOOST_CLASS_EXPORT_KEY(cnn::RNNBuilder) +// BOOST_CLASS_EXPORT_KEY(cnn::SimpleRNNBuilder) #endif diff --git a/cnn/tensor.cc b/cnn/tensor.cc index c70bebe94..02595cfe7 100644 --- a/cnn/tensor.cc +++ b/cnn/tensor.cc @@ -4,13 +4,19 @@ #include #include +#include +#include + #if HAVE_CUDA #include "cnn/gpu-ops.h" #include "cnn/cuda.h" #endif +#include "cnn/io-macros.h" using namespace std; +BOOST_CLASS_VERSION(cnn::Tensor, 1) + namespace cnn { ostream& operator<<(ostream& os, const Tensor& t) { @@ -158,6 +164,58 @@ void TensorTools::RandomizeNormal(real mean, real stddev, Tensor& val) { #endif } +template +void Tensor::save(Archive& ar, const unsigned int ver) const { + ar & d; + int dev_id = ((device == default_device) ? (int)-1 : device->device_id); + ar & dev_id; + ar & mem_pool; +#ifdef HAVE_CUDA + if(device->type == DeviceType::GPU) { + float* vc = static_cast(std::malloc(d.size() * sizeof(float))); + CUDA_CHECK(cudaMemcpyAsync(vc, v, d.size() * sizeof(float), cudaMemcpyDeviceToHost)); + ar & boost::serialization::make_array(vc, d.size()); + free(vc); + } else { + ar & boost::serialization::make_array(v, d.size()); + } +#else + ar & boost::serialization::make_array(v, d.size()); +#endif +} +template +void Tensor::load(Archive& ar, const unsigned int ver) { + ar & d; + int dev_id = -1; + // This default value is for backward compatibility with models that were + // saved without information about what mempool a tensor belongs to. + mem_pool = DeviceMempool::PS; + if(ver > 0) { + ar & dev_id; + ar & mem_pool; + } + if(dev_id == -1) { + device = default_device; + } else { + assert(dev_id > 0 && dev_id < (int)devices.size()); + device = devices[dev_id]; + } + device->allocate_tensor(mem_pool, *this); +#ifdef HAVE_CUDA + if(device->type == DeviceType::GPU) { + float* vc = static_cast(std::malloc(d.size() * sizeof(float))); + ar & boost::serialization::make_array(vc, d.size()); + CUDA_CHECK(cudaMemcpyAsync(v, vc, d.size() * sizeof(float), cudaMemcpyHostToDevice)); + free(vc); + } else { + ar & boost::serialization::make_array(v, d.size()); + } +#else + ar & boost::serialization::make_array(v, d.size()); +#endif +} +CNN_SAVELOAD_IMPL(Tensor) + real rand01() { uniform_real_distribution distribution(0, 1); return distribution(*rndeng); @@ -176,3 +234,4 @@ real rand_normal() { } } // namespace cnn + diff --git a/cnn/tensor.h b/cnn/tensor.h index dfb52e912..598941fca 100644 --- a/cnn/tensor.h +++ b/cnn/tensor.h @@ -4,6 +4,8 @@ #include #include +#include + #include "cnn/dim.h" #include "cnn/globals.h" #include "cnn/aligned-mem-pool.h" @@ -14,8 +16,6 @@ #include #include "cnn/cuda.h" #endif -#include -#include // Following line is commented out because it causes errors with large nets (Antonis) //#define EIGEN_NO_MALLOC @@ -150,55 +150,9 @@ struct Tensor { private: friend class boost::serialization::access; template - void save(Archive& ar, const unsigned int ver) const { - ar & d; - int dev_id = ((device == default_device) ? (int)-1 : device->device_id); - ar & dev_id; - ar & mem_pool; -#ifdef HAVE_CUDA - if(device->type == DeviceType::GPU) { - float* vc = static_cast(std::malloc(d.size() * sizeof(float))); - CUDA_CHECK(cudaMemcpyAsync(vc, v, d.size() * sizeof(float), cudaMemcpyDeviceToHost)); - ar & boost::serialization::make_array(vc, d.size()); - free(vc); - } else { - ar & boost::serialization::make_array(v, d.size()); - } -#else - ar & boost::serialization::make_array(v, d.size()); -#endif - } + void save(Archive& ar, const unsigned int ver) const; template - void load(Archive& ar, const unsigned int ver) { - ar & d; - int dev_id = -1; - // This default value is for backward compatibility with models that were - // saved without information about what mempool a tensor belongs to. - mem_pool = DeviceMempool::PS; - if(ver > 0) { - ar & dev_id; - ar & mem_pool; - } - if(dev_id == -1) { - device = default_device; - } else { - assert(dev_id > 0 && dev_id < (int)devices.size()); - device = devices[dev_id]; - } - device->allocate_tensor(mem_pool, *this); -#ifdef HAVE_CUDA - if(device->type == DeviceType::GPU) { - float* vc = static_cast(std::malloc(d.size() * sizeof(float))); - ar & boost::serialization::make_array(vc, d.size()); - CUDA_CHECK(cudaMemcpyAsync(v, vc, d.size() * sizeof(float), cudaMemcpyHostToDevice)); - free(vc); - } else { - ar & boost::serialization::make_array(v, d.size()); - } -#else - ar & boost::serialization::make_array(v, d.size()); -#endif - } + void load(Archive& ar, const unsigned int ver); BOOST_SERIALIZATION_SPLIT_MEMBER() }; @@ -337,6 +291,4 @@ real rand_normal(); } // namespace cnn -BOOST_CLASS_VERSION(cnn::Tensor, 1) - #endif diff --git a/cnn/training.cc b/cnn/training.cc index 714faad33..8589b1276 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -1,8 +1,11 @@ #include "cnn/training.h" +#include + // #include "cnn/gpu-ops.h" #include "cnn/param-nodes.h" #include "cnn/weight-decay.h" +#include "cnn/io-macros.h" // Macros for defining parameter update functions #ifdef __CUDACC__ @@ -29,14 +32,6 @@ else { abort(); } \ } #endif -#ifndef __CUDACC__ -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::SimpleSGDTrainer) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::MomentumSGDTrainer) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdagradTrainer) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdadeltaTrainer) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::RmsPropTrainer) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdamTrainer) -#endif namespace cnn { @@ -276,4 +271,68 @@ void AdamTrainer::alloc_impl() { } #endif +#ifndef __CUDACC__ +// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::SimpleSGDTrainer) +// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::MomentumSGDTrainer) +// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdagradTrainer) +// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdadeltaTrainer) +// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::RmsPropTrainer) +// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdamTrainer) + +template +void Trainer::serialize(Archive& ar, const unsigned int) { + ar & eta0 & eta & eta_decay & epoch; + ar & clipping_enabled & clip_threshold & clips & updates; + ar & aux_allocated; + ar & model; +} +CNN_SERIALIZE_IMPL(Trainer) + +template +void SimpleSGDTrainer::serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); +} +CNN_SERIALIZE_IMPL(SimpleSGDTrainer) + +template +void MomentumSGDTrainer::serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & momentum; + ar & vp & vlp; +} +CNN_SERIALIZE_IMPL(MomentumSGDTrainer) + +template +void AdagradTrainer::serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & epsilon; + ar & vp & vlp; +} +CNN_SERIALIZE_IMPL(AdagradTrainer) + +template +void AdadeltaTrainer::serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & epsilon & rho; + ar & hg & hlg & hd & hld; +} +CNN_SERIALIZE_IMPL(AdadeltaTrainer) + +template +void RmsPropTrainer::serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & epsilon & rho; + ar & hg & hlg; +} +CNN_SERIALIZE_IMPL(RmsPropTrainer) + +template +void AdamTrainer::serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & beta_1 & beta_2 & epsilon; + ar & m & lm & v & lv; +} +CNN_SERIALIZE_IMPL(AdamTrainer) +#endif + } // namespace cnn diff --git a/cnn/training.h b/cnn/training.h index 4b8fbdec5..4e173f410 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -66,12 +66,7 @@ struct Trainer { private: friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & eta0 & eta & eta_decay & epoch; - ar & clipping_enabled & clip_threshold & clips & updates; - ar & aux_allocated; - ar & model; - } + void serialize(Archive& ar, const unsigned int); }; struct SimpleSGDTrainer : public Trainer { @@ -82,9 +77,7 @@ struct SimpleSGDTrainer : public Trainer { SimpleSGDTrainer() {} friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & boost::serialization::base_object(*this); - } + void serialize(Archive& ar, const unsigned int); }; struct MomentumSGDTrainer : public Trainer { @@ -106,11 +99,7 @@ struct MomentumSGDTrainer : public Trainer { MomentumSGDTrainer() {} friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & boost::serialization::base_object(*this); - ar & momentum; - ar & vp & vlp; - } + void serialize(Archive& ar, const unsigned int); }; struct AdagradTrainer : public Trainer { @@ -127,11 +116,7 @@ struct AdagradTrainer : public Trainer { AdagradTrainer() {} friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & boost::serialization::base_object(*this); - ar & epsilon; - ar & vp & vlp; - } + void serialize(Archive& ar, const unsigned int); }; struct AdadeltaTrainer : public Trainer { @@ -151,11 +136,7 @@ struct AdadeltaTrainer : public Trainer { AdadeltaTrainer() {} friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & boost::serialization::base_object(*this); - ar & epsilon & rho; - ar & hg & hlg & hd & hld; - } + void serialize(Archive& ar, const unsigned int); }; struct RmsPropTrainer : public Trainer { @@ -173,11 +154,7 @@ struct RmsPropTrainer : public Trainer { RmsPropTrainer() {} friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & boost::serialization::base_object(*this); - ar & epsilon & rho; - ar & hg & hlg; - } + void serialize(Archive& ar, const unsigned int); }; struct AdamTrainer : public Trainer { @@ -199,18 +176,9 @@ struct AdamTrainer : public Trainer { AdamTrainer() {} friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & boost::serialization::base_object(*this); - ar & beta_1 & beta_2 & epsilon; - ar & m & lm & v & lv; - } + void serialize(Archive& ar, const unsigned int); }; } // namespace cnn -BOOST_CLASS_EXPORT_KEY(cnn::SimpleSGDTrainer) -BOOST_CLASS_EXPORT_KEY(cnn::MomentumSGDTrainer) -BOOST_CLASS_EXPORT_KEY(cnn::AdagradTrainer) -BOOST_CLASS_EXPORT_KEY(cnn::AdadeltaTrainer) -BOOST_CLASS_EXPORT_KEY(cnn::RmsPropTrainer) -BOOST_CLASS_EXPORT_KEY(cnn::AdamTrainer) + #endif diff --git a/cnn/weight-decay.cc b/cnn/weight-decay.cc new file mode 100644 index 000000000..87a24008d --- /dev/null +++ b/cnn/weight-decay.cc @@ -0,0 +1,13 @@ +#include "cnn/weight-decay.h" +#include "cnn/io-macros.h" + +namespace cnn { + +template +void L2WeightDecay::serialize(Archive& ar, const unsigned int) { + ar & weight_decay; + ar & lambda; +} +CNN_SERIALIZE_IMPL(L2WeightDecay) + +} diff --git a/cnn/weight-decay.h b/cnn/weight-decay.h index 5249e3409..0231b805b 100644 --- a/cnn/weight-decay.h +++ b/cnn/weight-decay.h @@ -5,6 +5,8 @@ #include #include +namespace boost { namespace serialization { class access; } } + namespace cnn { // I don't bother with learning rates when computing how much the weight @@ -36,10 +38,7 @@ struct L2WeightDecay { private: friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & weight_decay; - ar & lambda; - } + void serialize(Archive& ar, const unsigned int); float weight_decay; float lambda; diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index e2b0e35d7..8699eaf32 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include using namespace std; From b066e2865665d97adb7081873fb4751b9f92bd2a Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 6 Oct 2016 00:03:04 -0400 Subject: [PATCH 669/965] Fixed class exports for serialization --- cnn/cfsm-builder.cc | 3 +++ cnn/cfsm-builder.h | 9 +++++++-- cnn/model.cc | 3 +++ cnn/model.h | 7 +++++-- cnn/rnn.cc | 3 +++ cnn/rnn.h | 7 +++++-- cnn/training.cc | 9 +++++++++ cnn/training.h | 10 ++++++++++ 8 files changed, 45 insertions(+), 6 deletions(-) diff --git a/cnn/cfsm-builder.cc b/cnn/cfsm-builder.cc index 78e7556b0..431450616 100644 --- a/cnn/cfsm-builder.cc +++ b/cnn/cfsm-builder.cc @@ -237,3 +237,6 @@ void ClassFactoredSoftmaxBuilder::serialize(Archive& ar, const unsigned int) { CNN_SERIALIZE_IMPL(ClassFactoredSoftmaxBuilder) } // namespace cnn + +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::StandardSoftmaxBuilder) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ClassFactoredSoftmaxBuilder) diff --git a/cnn/cfsm-builder.h b/cnn/cfsm-builder.h index e3e57ebde..065e74665 100644 --- a/cnn/cfsm-builder.h +++ b/cnn/cfsm-builder.h @@ -3,6 +3,9 @@ #include #include + +#include + #include "cnn/cnn.h" #include "cnn/expr.h" #include "cnn/dict.h" @@ -107,6 +110,8 @@ class ClassFactoredSoftmaxBuilder : public SoftmaxBuilder { void serialize(Archive& ar, const unsigned int); }; } // namespace cnn -//BOOST_CLASS_EXPORT_KEY(cnn::StandardSoftmaxBuilder) -//BOOST_CLASS_EXPORT_KEY(cnn::ClassFactoredSoftmaxBuilder) + +BOOST_CLASS_EXPORT_KEY(cnn::StandardSoftmaxBuilder) +BOOST_CLASS_EXPORT_KEY(cnn::ClassFactoredSoftmaxBuilder) + #endif diff --git a/cnn/model.cc b/cnn/model.cc index 85530f0aa..9241eb166 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -494,3 +494,6 @@ float Model::gradient_l2_norm_dev(MyDevice & dev) const { #endif } // namespace cnn + +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ParameterStorage) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::LookupParameterStorage) diff --git a/cnn/model.h b/cnn/model.h index 371a84f54..c39ef7c97 100644 --- a/cnn/model.h +++ b/cnn/model.h @@ -5,6 +5,8 @@ #include #include +#include + #include "cnn/tensor.h" #include "cnn/weight-decay.h" @@ -195,7 +197,8 @@ void save_cnn_model(std::string filename, Model* model); void load_cnn_model(std::string filename, Model* model); } // namespace cnn -// BOOST_CLASS_EXPORT_KEY(cnn::ParameterStorage) -// BOOST_CLASS_EXPORT_KEY(cnn::LookupParameterStorage) + +BOOST_CLASS_EXPORT_KEY(cnn::ParameterStorage) +BOOST_CLASS_EXPORT_KEY(cnn::LookupParameterStorage) #endif diff --git a/cnn/rnn.cc b/cnn/rnn.cc index 9e475de50..7b4c77726 100644 --- a/cnn/rnn.cc +++ b/cnn/rnn.cc @@ -197,3 +197,6 @@ void SimpleRNNBuilder::serialize(Archive& ar, const unsigned int) { CNN_SERIALIZE_IMPL(SimpleRNNBuilder) } // namespace cnn + +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::RNNBuilder) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::SimpleRNNBuilder) diff --git a/cnn/rnn.h b/cnn/rnn.h index cb3cd3f58..37fd6c367 100644 --- a/cnn/rnn.h +++ b/cnn/rnn.h @@ -1,6 +1,8 @@ #ifndef CNN_RNN_H_ #define CNN_RNN_H_ +#include + #include "cnn/cnn.h" #include "cnn/rnn-state-machine.h" #include "cnn/expr.h" @@ -175,6 +177,7 @@ namespace boost { } // namespace serialization } // namespace boost -// BOOST_CLASS_EXPORT_KEY(cnn::RNNBuilder) -// BOOST_CLASS_EXPORT_KEY(cnn::SimpleRNNBuilder) +BOOST_CLASS_EXPORT_KEY(cnn::RNNBuilder) +BOOST_CLASS_EXPORT_KEY(cnn::SimpleRNNBuilder) + #endif diff --git a/cnn/training.cc b/cnn/training.cc index 8589b1276..4daccd986 100644 --- a/cnn/training.cc +++ b/cnn/training.cc @@ -1,6 +1,7 @@ #include "cnn/training.h" #include +#include // #include "cnn/gpu-ops.h" #include "cnn/param-nodes.h" @@ -333,6 +334,14 @@ void AdamTrainer::serialize(Archive& ar, const unsigned int) { ar & m & lm & v & lv; } CNN_SERIALIZE_IMPL(AdamTrainer) + #endif } // namespace cnn + +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::SimpleSGDTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::MomentumSGDTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdagradTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdadeltaTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::RmsPropTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdamTrainer) diff --git a/cnn/training.h b/cnn/training.h index 4e173f410..f38a7275c 100644 --- a/cnn/training.h +++ b/cnn/training.h @@ -2,6 +2,9 @@ #define CNN_TRAINING_H_ #include + +#include + #include "cnn/model.h" #include "cnn/shadow-params.h" @@ -181,4 +184,11 @@ struct AdamTrainer : public Trainer { } // namespace cnn +BOOST_CLASS_EXPORT_KEY(cnn::SimpleSGDTrainer) +BOOST_CLASS_EXPORT_KEY(cnn::MomentumSGDTrainer) +BOOST_CLASS_EXPORT_KEY(cnn::AdagradTrainer) +BOOST_CLASS_EXPORT_KEY(cnn::AdadeltaTrainer) +BOOST_CLASS_EXPORT_KEY(cnn::RmsPropTrainer) +BOOST_CLASS_EXPORT_KEY(cnn::AdamTrainer) + #endif From 01a51b952d070c04e1d63698634fd3daf8b3c299 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 6 Oct 2016 09:40:33 -0400 Subject: [PATCH 670/965] Finixed moving serialization code to .cc files --- cnn/cfsm-builder.cc | 5 ++--- cnn/cfsm-builder.h | 2 -- cnn/dict.cc | 23 +++++++++++++++++++++++ cnn/dict.h | 24 ++++-------------------- cnn/dim.cc | 9 +++++++++ cnn/dim.h | 5 +---- cnn/hsm-builder.cc | 21 ++++++++++++++++++++- cnn/hsm-builder.h | 8 +------- cnn/rnn-state-machine.cc | 8 ++++++++ cnn/rnn-state-machine.h | 7 +++---- cnn/shadow-params.cc | 16 ++++++++++++++++ cnn/shadow-params.h | 9 +++------ 12 files changed, 90 insertions(+), 47 deletions(-) diff --git a/cnn/cfsm-builder.cc b/cnn/cfsm-builder.cc index 431450616..2219d99b6 100644 --- a/cnn/cfsm-builder.cc +++ b/cnn/cfsm-builder.cc @@ -3,13 +3,12 @@ #include #include +#include + #include "cnn/io-macros.h" using namespace std; -// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::StandardSoftmaxBuilder) -// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ClassFactoredSoftmaxBuilder) - namespace cnn { using namespace expr; diff --git a/cnn/cfsm-builder.h b/cnn/cfsm-builder.h index 065e74665..a0401ec38 100644 --- a/cnn/cfsm-builder.h +++ b/cnn/cfsm-builder.h @@ -4,8 +4,6 @@ #include #include -#include - #include "cnn/cnn.h" #include "cnn/expr.h" #include "cnn/dict.h" diff --git a/cnn/dict.cc b/cnn/dict.cc index a0961bdee..959a5236d 100644 --- a/cnn/dict.cc +++ b/cnn/dict.cc @@ -4,6 +4,16 @@ #include #include +#include +#include +#include +#if BOOST_VERSION >= 105600 +#include +#endif + +#include "cnn/io-macros.h" + + using namespace std; namespace cnn { @@ -34,5 +44,18 @@ void read_sentence_pair(const std::string& line, std::vector* s, Dict* sd, } } +template void Dict::serialize(Archive& ar, const unsigned int) { +#if BOOST_VERSION >= 105600 + ar & frozen; + ar & map_unk; + ar & unk_id; + ar & words_; + ar & d_; +#else + throw std::invalid_argument("Serializing dictionaries is only supported on versions of boost 1.56 or higher"); +#endif +} +CNN_SERIALIZE_IMPL(Dict) + } // namespace cnn diff --git a/cnn/dict.h b/cnn/dict.h index bf1bfec4a..86fef6b8b 100644 --- a/cnn/dict.h +++ b/cnn/dict.h @@ -8,13 +8,7 @@ #include #include -#include -#include -#include -#if BOOST_VERSION >= 105600 -#include -#include -#endif +namespace boost { namespace serialization { class access; } } namespace cnn { @@ -85,19 +79,9 @@ typedef std::unordered_map Map; Map d_; friend class boost::serialization::access; -#if BOOST_VERSION >= 105600 - template void serialize(Archive& ar, const unsigned int) { - ar & frozen; - ar & map_unk; - ar & unk_id; - ar & words_; - ar & d_; - } -#else - template void serialize(Archive& ar, const unsigned int) { - throw std::invalid_argument("Serializing dictionaries is only supported on versions of boost 1.56 or higher"); - } -#endif + template + void serialize(Archive& ar, const unsigned int); + }; std::vector read_sentence(const std::string& line, Dict* sd); diff --git a/cnn/dim.cc b/cnn/dim.cc index 85b5739dc..71bd0ee85 100644 --- a/cnn/dim.cc +++ b/cnn/dim.cc @@ -2,6 +2,8 @@ #include +#include "cnn/io-macros.h" + using namespace std; namespace cnn { @@ -23,5 +25,12 @@ ostream& operator<<(ostream& os, const vector& ds) { return os << ']'; } +template +void Dim::serialize(Archive& ar, const unsigned int) { + ar & nd; + ar & d; +} +CNN_SERIALIZE_IMPL(Dim) + } // namespace cnn diff --git a/cnn/dim.h b/cnn/dim.h index 2ceae8ff4..15a583f55 100644 --- a/cnn/dim.h +++ b/cnn/dim.h @@ -78,10 +78,7 @@ struct Dim { unsigned int bd; private: friend class boost::serialization::access; - template void serialize(Archive& ar, const unsigned int) { - ar & nd; - ar & d; - } + template void serialize(Archive& ar, const unsigned int); }; //static_assert(std::is_trivially_copyable::value, "Dim must be trivially copyable"); diff --git a/cnn/hsm-builder.cc b/cnn/hsm-builder.cc index 40d1ec7c6..4c24eaded 100644 --- a/cnn/hsm-builder.cc +++ b/cnn/hsm-builder.cc @@ -5,7 +5,12 @@ #include #include -//BOOST_CLASS_EXPORT_IMPLEMENT(cnn::HierarchicalSoftmaxBuilder) +#include +#if BOOST_VERSION >= 105600 +#include +#endif + +#include "cnn/io-macros.h" #undef assert #define assert(x) {} @@ -178,6 +183,20 @@ string Cluster::toString() const { return ss.str(); } +template +void Cluster::serialize(Archive& ar, const unsigned int) { +#if BOOST_VERSION >= 105600 + ar & rep_dim; + ar & children; + ar & path; + ar & terminals; + ar & word2ind; +#else + throw std::invalid_argument("Serializing clusters is only supported on versions of boost 1.56 or higher"); +#endif +} +CNN_SERIALIZE_IMPL(Cluster) + HierarchicalSoftmaxBuilder::HierarchicalSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, Dict* word_dict, diff --git a/cnn/hsm-builder.h b/cnn/hsm-builder.h index ff85af721..7e828c780 100644 --- a/cnn/hsm-builder.h +++ b/cnn/hsm-builder.h @@ -28,13 +28,7 @@ class Cluster { expr::Expression predict(expr::Expression h, ComputationGraph& cg) const; friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & rep_dim; - ar & children; - ar & path; - ar & terminals; - ar & word2ind; - } + void serialize(Archive& ar, const unsigned int); public: Cluster(); diff --git a/cnn/rnn-state-machine.cc b/cnn/rnn-state-machine.cc index 745175206..52d05950c 100644 --- a/cnn/rnn-state-machine.cc +++ b/cnn/rnn-state-machine.cc @@ -1,7 +1,9 @@ #include "cnn/rnn-state-machine.h" #include + #include "cnn/cnn.h" +#include "cnn/io-macros.h" using namespace std; @@ -12,5 +14,11 @@ void RNNStateMachine::failure(RNNOp op) { abort(); } +template +void RNNStateMachine::serialize(Archive& ar, const unsigned int) { + ar & q_; +} +CNN_SERIALIZE_IMPL(RNNStateMachine) + } // namespace cnn diff --git a/cnn/rnn-state-machine.h b/cnn/rnn-state-machine.h index def146bb4..0bff4ce5d 100644 --- a/cnn/rnn-state-machine.h +++ b/cnn/rnn-state-machine.h @@ -1,6 +1,7 @@ #ifndef CNN_RNN_STATE_MACHINE_H_ #define CNN_RNN_STATE_MACHINE_H_ -#include + +namespace boost { namespace serialization { class access; } } namespace cnn { @@ -40,9 +41,7 @@ class RNNStateMachine { friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & q_; - } + void serialize(Archive& ar, const unsigned int); }; } // namespace cnn diff --git a/cnn/shadow-params.cc b/cnn/shadow-params.cc index 733243cf4..ad81d523b 100644 --- a/cnn/shadow-params.cc +++ b/cnn/shadow-params.cc @@ -1,8 +1,12 @@ #include "cnn/cnn.h" + +#include + #include "cnn/shadow-params.h" #include "cnn/tensor.h" #include "cnn/aligned-mem-pool.h" #include "cnn/model.h" +#include "cnn/io-macros.h" using namespace std; @@ -36,5 +40,17 @@ vector allocate_shadow_lookup_parameters(const Model& m) return v; } +template +void ShadowParameters::serialize(Archive& ar, const unsigned int) { + ar & h; +} +CNN_SERIALIZE_IMPL(ShadowParameters) + +template +void ShadowLookupParameters::serialize(Archive& ar, const unsigned int) { + ar & h; +} +CNN_SERIALIZE_IMPL(ShadowLookupParameters) + } // namespace cnn diff --git a/cnn/shadow-params.h b/cnn/shadow-params.h index 6b2c44007..295afd659 100644 --- a/cnn/shadow-params.h +++ b/cnn/shadow-params.h @@ -21,9 +21,7 @@ struct ShadowParameters { private: friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & h; - } + void serialize(Archive& ar, const unsigned int); }; struct ShadowLookupParameters { @@ -33,9 +31,8 @@ struct ShadowLookupParameters { private: friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) { - ar & h; - } + void serialize(Archive& ar, const unsigned int); + }; // one per element in model.parameters_list From 0a9b2e732e7db62df7542f90e3ed9cd793433794 Mon Sep 17 00:00:00 2001 From: armatthews Date: Fri, 7 Oct 2016 11:31:15 -0400 Subject: [PATCH 671/965] allow forward() and incremental_forward() to take VariableIndex or Expression --- cnn/cnn.cc | 2 ++ cnn/cnn.h | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/cnn/cnn.cc b/cnn/cnn.cc index 47ac788a4..7d7f820af 100644 --- a/cnn/cnn.cc +++ b/cnn/cnn.cc @@ -247,6 +247,8 @@ void ComputationGraph::set_dim_for_new_node(const VariableIndex& i) { const Tensor& ComputationGraph::incremental_forward(const expr::Expression& last) { return ee->incremental_forward(last.i); } const Tensor& ComputationGraph::forward(const expr::Expression& last) { return ee->forward(last.i); } +const Tensor& ComputationGraph::incremental_forward(VariableIndex last) { return ee->incremental_forward(last); } +const Tensor& ComputationGraph::forward(VariableIndex last) { return ee->forward(last); } const Tensor& ComputationGraph::get_value(VariableIndex i) { return ee->get_value(i); } const Tensor& ComputationGraph::get_value(const expr::Expression& e) { return this->get_value(e.i); } void ComputationGraph::invalidate() { ee->invalidate(); } diff --git a/cnn/cnn.h b/cnn/cnn.h index 28bc710b5..f185702a6 100644 --- a/cnn/cnn.h +++ b/cnn/cnn.h @@ -106,11 +106,13 @@ struct ComputationGraph { // perform computations - // run complete forward pass from first node to last existing one, ignoring all precomputed values. + // run complete forward pass from first node to given one, ignoring all precomputed values. const Tensor& forward(const expr::Expression& last); - // run forward pass from the last computed node to last existing. + const Tensor& forward(VariableIndex i); + // run forward pass from the last computed node to given one. // useful if you want to add nodes and evaluate just the new parts. const Tensor& incremental_forward(const expr::Expression& last); + const Tensor& incremental_forward(VariableIndex i); // get forward value for node at index i. used cached values if available, // performs forward evaluation if note available (may compute more than strictly // what is needed). From fcba671722b8fb8a2b7cae1142e7678333d4a79d Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 7 Oct 2016 12:41:42 -0400 Subject: [PATCH 672/965] Fixed bug with gradient normalization on GPU --- cnn/model.cc | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/cnn/model.cc b/cnn/model.cc index 9241eb166..ed35a83b0 100644 --- a/cnn/model.cc +++ b/cnn/model.cc @@ -45,11 +45,6 @@ using namespace std; -#ifndef __CUDACC__ -// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ParameterStorage) -// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::LookupParameterStorage) -#endif - namespace cnn { // CPU only functions @@ -469,7 +464,7 @@ float Model::gradient_l2_norm_dev(MyDevice & dev) const { sum_t.t<0>().device(*dev.edevice) = scratch_t.t<1>().sum().sqrt(); #ifdef __CUDACC__ float res = 0; - cudaMemcpy(&res, gradient_norm_scratch, sizeof(float), cudaMemcpyDeviceToHost); + cudaMemcpy(&res, gradient_norm_scratch+pi, sizeof(float), cudaMemcpyDeviceToHost); return res; #else return gradient_norm_scratch[pi]; From 5f19bb3055901c94c1c455e1f72ed0b61c756aa7 Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 7 Oct 2016 20:11:30 +0300 Subject: [PATCH 673/965] pycnn -> dynet --- pycnn/CMakeLists.txt | 10 +- pycnn/{pycnn.pxd => dynet.pxd} | 0 pycnn/{pycnn.py => dynet.py} | 0 pycnn/{pycnn.pyx => dynet.pyx} | 0 pycnn/{pycnn_viz.py => dynet_viz.py} | 0 pycnn/pynet.pxd | 335 +++++++++++++++++++++++++++ pycnn/setup.py.in | 14 +- 7 files changed, 347 insertions(+), 12 deletions(-) rename pycnn/{pycnn.pxd => dynet.pxd} (100%) rename pycnn/{pycnn.py => dynet.py} (100%) rename pycnn/{pycnn.pyx => dynet.pyx} (100%) rename pycnn/{pycnn_viz.py => dynet_viz.py} (100%) create mode 100644 pycnn/pynet.pxd diff --git a/pycnn/CMakeLists.txt b/pycnn/CMakeLists.txt index a6003b429..1d44fabaa 100644 --- a/pycnn/CMakeLists.txt +++ b/pycnn/CMakeLists.txt @@ -6,10 +6,10 @@ endif() if(PYTHON) # Things to copy the files - file(GLOB DepFiles ${CMAKE_CURRENT_SOURCE_DIR}/pycnn.py - ${CMAKE_CURRENT_SOURCE_DIR}/pycnn.pyx - ${CMAKE_CURRENT_SOURCE_DIR}/pycnn.pxd - ${CMAKE_CURRENT_SOURCE_DIR}/pycnn_viz.py + file(GLOB DepFiles ${CMAKE_CURRENT_SOURCE_DIR}/dynet.py + ${CMAKE_CURRENT_SOURCE_DIR}/dynet.pyx + ${CMAKE_CURRENT_SOURCE_DIR}/dynet.pxd + ${CMAKE_CURRENT_SOURCE_DIR}/dynet_viz.py ${CMAKE_CURRENT_SOURCE_DIR}/pybridge.h ) @@ -29,7 +29,7 @@ endif() add_custom_command(TARGET copy PRE_BUILD COMMAND ${CMAKE_COMMAND} -E - copy ${CMAKE_CURRENT_SOURCE_DIR}/pycnn.pyx ${CMAKE_CURRENT_BINARY_DIR}/gpycnn.pyx) + copy ${CMAKE_CURRENT_SOURCE_DIR}/dynet.pyx ${CMAKE_CURRENT_BINARY_DIR}/gdynet.pyx) # Things to perform setup diff --git a/pycnn/pycnn.pxd b/pycnn/dynet.pxd similarity index 100% rename from pycnn/pycnn.pxd rename to pycnn/dynet.pxd diff --git a/pycnn/pycnn.py b/pycnn/dynet.py similarity index 100% rename from pycnn/pycnn.py rename to pycnn/dynet.py diff --git a/pycnn/pycnn.pyx b/pycnn/dynet.pyx similarity index 100% rename from pycnn/pycnn.pyx rename to pycnn/dynet.pyx diff --git a/pycnn/pycnn_viz.py b/pycnn/dynet_viz.py similarity index 100% rename from pycnn/pycnn_viz.py rename to pycnn/dynet_viz.py diff --git a/pycnn/pynet.pxd b/pycnn/pynet.pxd new file mode 100644 index 000000000..26ffb1dfb --- /dev/null +++ b/pycnn/pynet.pxd @@ -0,0 +1,335 @@ +from libcpp.vector cimport vector +from libcpp.string cimport string + +ctypedef float real + +cdef extern from "cnn/init.h" namespace "cnn": + cdef void initialize(int& argc, char **& argv, unsigned random_seed) + +cdef extern from "cnn/dim.h" namespace "cnn": + cdef cppclass CDim "cnn::Dim": + CDim() except + + #CDim(int m) except + + #CDim(int m, int n) except + + CDim(vector[long]& ds) except + + #CDim(std::initializer_list[long] x) except + + int size() + int sum_dims() + CDim truncate() + void resize(unsigned i) + int ndims() + int rows() + int cols() + void set(unsigned i, unsigned s) + int size(unsigned i) + CDim transpose() + +cdef extern from "cnn/tensor.h" namespace "cnn": + cdef cppclass CTensor "cnn::Tensor": + CDim d + float* v + pass + float c_as_scalar "cnn::as_scalar" (CTensor& t) + vector[float] c_as_vector "cnn::as_vector" (CTensor& t) + +cdef extern from "cnn/model.h" namespace "cnn": + cdef cppclass CParameterStorage "cnn::ParameterStorage": + CParameterStorage() + CTensor values + CDim dim + + cdef cppclass CLookupParameterStorage "cnn::LookupParameterStorage": + CLookupParameterStorage() + vector[CTensor] values + CDim dim + + cdef cppclass CParameters "cnn::Parameter": + CParameters() + CParameterStorage *get() + void zero() + + cdef cppclass CLookupParameters "cnn::LookupParameter": + CLookupParameters() + CLookupParameterStorage *get() + CDim dim + void initialize(unsigned index, const vector[float]& val) + void zero() + + cdef cppclass CModel "cnn::Model": + CModel() + #float gradient_l2_norm() const + CParameters add_parameters(CDim& d, float scale = 0.0) + CLookupParameters add_lookup_parameters(unsigned n, const CDim& d) + vector[CParameterStorage] parameters_list() + + void load_cnn_model "cnn::load_cnn_model" (string filename, CModel *model) + void save_cnn_model "cnn::save_cnn_model" (string filename, CModel *model) + +cdef extern from "cnn/cnn.h" namespace "cnn": + ctypedef unsigned VariableIndex + + cdef cppclass CComputationGraph "cnn::ComputationGraph": + CComputationGraph() except + + # Inputs + VariableIndex add_input(real s) + VariableIndex add_input(const real* ps) + VariableIndex add_input(const CDim& d, const vector[float]* pdata) + + # Parameters + VariableIndex add_parameters(CParameters* p) + VariableIndex add_lookup(CLookupParameters* p, const unsigned* pindex) + VariableIndex add_lookup(CLookupParameters* p, unsigned index) + VariableIndex add_const_lookup(CLookupParameters* p, const unsigned* pindex) + VariableIndex add_const_lookup(CLookupParameters* p, unsigned index) + + const CTensor& forward() + const CTensor& incremental_forward() + const CTensor& get_value(VariableIndex i) + void invalidate() + void backward() + void backward(VariableIndex i) + + # checkpointing + void checkpoint() + void revert() + + void print_graphviz() const + +cdef extern from "cnn/training.h" namespace "cnn": + cdef cppclass CSimpleSGDTrainer "cnn::SimpleSGDTrainer": + #CSimpleSGDTrainer(CModel* m, float lam, float e0) + CSimpleSGDTrainer(CModel* m, float e0) # TODO removed lam, update docs. + void update(float s) + void update_epoch(float r) + void status() + + cdef cppclass CMomentumSGDTrainer "cnn::MomentumSGDTrainer": + CMomentumSGDTrainer(CModel* m, float e0, float mom) # TODO removed lam, update docs + void update(float s) + void update_epoch(float r) + void status() + + cdef cppclass CAdagradTrainer "cnn::AdagradTrainer": + CAdagradTrainer(CModel* m, float e0, float eps) # TODO removed lam, update docs + + void update(float s) + void update_epoch(float r) + void status() + + cdef cppclass CAdadeltaTrainer "cnn::AdadeltaTrainer": + CAdadeltaTrainer(CModel* m, float eps, float rho) # TODO removed lam, update docs + + void update(float s) + void update_epoch(float r) + void status() + + cdef cppclass CAdamTrainer "cnn::AdamTrainer": + CAdamTrainer(CModel* m, float alpha, float beta_1, float beta_2, float eps) # TODO removed lam, update docs + + void update(float s) + void update_epoch(float r) + void status() + + +cdef extern from "cnn/expr.h" namespace "cnn::expr": + cdef cppclass CExpression "cnn::expr::Expression": + CExpression() + CExpression(CComputationGraph *pg, VariableIndex i) + CComputationGraph *pg + long i + #CExpression c_input "cnn::expr::input" (CComputationGraph& g, float s) # + CExpression c_input "cnn::expr::input" (CComputationGraph& g, float *ps) # + CExpression c_input "cnn::expr::input" (CComputationGraph& g, CDim& d, vector[float]* pdata) + CExpression c_parameter "cnn::expr::parameter" (CComputationGraph& g, CParameters p) # + #CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # + CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters p, unsigned* pindex) # + CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters p, vector[unsigned]* pindices) # + #CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # + CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters p, unsigned* pindex) # + CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters p, vector[unsigned]* pindices) # + + # identity function, but derivative is not propagated through it + CExpression c_nobackprop "cnn::expr::nobackprop" (CExpression& x) # + + CExpression c_op_neg "cnn::expr::operator-" (CExpression& x) # + CExpression c_op_add "cnn::expr::operator+" (CExpression& x, CExpression& y) # + CExpression c_op_scalar_add "cnn::expr::operator+" (CExpression& x, float y) # + CExpression c_op_mul "cnn::expr::operator*" (CExpression& x, CExpression& y) # + CExpression c_op_scalar_mul "cnn::expr::operator*" (CExpression& x, float y) # + CExpression c_op_scalar_div "cnn::expr::operator/" (CExpression& x, float y) # + CExpression c_op_scalar_sub "cnn::expr::operator-" (float y, CExpression& x) # + + CExpression c_bmax "cnn::expr::max" (CExpression& x, CExpression& y) # + CExpression c_bmin "cnn::expr::min" (CExpression& x, CExpression& y) # + + CExpression c_cdiv "cnn::expr::cdiv" (CExpression& x, CExpression& y) # + CExpression c_colwise_add "cnn::expr::colwise_add" (CExpression& x, CExpression& bias) # + + CExpression c_tanh "cnn::expr::tanh" (CExpression& x) # + CExpression c_exp "cnn::expr::exp" (CExpression& x) # + CExpression c_square "cnn::expr::square" (CExpression& x) # + CExpression c_cube "cnn::expr::cube" (CExpression& x) # + CExpression c_log "cnn::expr::log" (CExpression& x) # + CExpression c_logistic "cnn::expr::logistic" (CExpression& x) # + CExpression c_rectify "cnn::expr::rectify" (CExpression& x) # + #CExpression c_hinge "cnn::expr::hinge" (CExpression& x, unsigned index, float m=?) # + CExpression c_hinge "cnn::expr::hinge" (CExpression& x, unsigned* pindex, float m) # + CExpression c_log_softmax "cnn::expr::log_softmax" (CExpression& x) # + CExpression c_log_softmax "cnn::expr::log_softmax" (CExpression& x, vector[unsigned]& restriction) #? + CExpression c_softmax "cnn::expr::softmax" (CExpression& x) # + CExpression c_softsign "cnn::expr::softsign" (CExpression& x) # + CExpression c_bmin "cnn::expr::min" (CExpression& x, CExpression& y) # + CExpression c_bmax "cnn::expr::max" (CExpression& x, CExpression& y) # + CExpression c_noise "cnn::expr::noise" (CExpression& x, float stddev) # + CExpression c_dropout "cnn::expr::dropout" (CExpression& x, float p) # + CExpression c_block_dropout "cnn::expr::block_dropout" (CExpression& x, float p) # + + CExpression c_reshape "cnn::expr::reshape" (CExpression& x, CDim& d) #? + CExpression c_transpose "cnn::expr::transpose" (CExpression& x) # + + CExpression c_affine_transform "cnn::expr::affine_transform" (const vector[CExpression]& xs) + + CExpression c_trace_of_product "cnn::expr::trace_of_product" (CExpression& x, CExpression& y); + CExpression c_cwise_multiply "cnn::expr::cwise_multiply" (CExpression& x, CExpression& y) # + + CExpression c_dot_product "cnn::expr::dot_product" (CExpression& x, CExpression& y) # + CExpression c_squared_distance "cnn::expr::squared_distance" (CExpression& x, CExpression& y) # + CExpression c_huber_distance "cnn::expr::huber_distance" (CExpression& x, CExpression& y, float c) # + CExpression c_l1_distance "cnn::expr::l1_distance" (CExpression& x, CExpression& y) # + CExpression c_binary_log_loss "cnn::expr::binary_log_loss" (CExpression& x, CExpression& y) # + CExpression c_pairwise_rank_loss "cnn::expr::pairwise_rank_loss" (CExpression& x, CExpression& y, float m) # + CExpression c_poisson_loss "cnn::expr::poisson_loss" (CExpression& x, unsigned y) + + CExpression c_conv1d_narrow "cnn::expr::conv1d_narrow" (CExpression& x, CExpression& f) # + CExpression c_conv1d_wide "cnn::expr::conv1d_wide" (CExpression& x, CExpression& f) # + CExpression c_filter1d_narrow "cnn::expr::filter1d_narrow" (CExpression& x, CExpression& f) # + CExpression c_kmax_pooling "cnn::expr::kmax_pooling" (CExpression& x, unsigned k) # + CExpression c_fold_rows "cnn::expr::fold_rows" (CExpression& x, unsigned nrows) # + CExpression c_sum_cols "cnn::expr::sum_cols" (CExpression& x) # + CExpression c_kmh_ngram "cnn::expr::kmh_ngram" (CExpression& x, unsigned n) # + + CExpression c_sum_batches "cnn::expr::sum_batches" (CExpression& x) + + #CExpression c_pick "cnn::expr::pick" (CExpression& x, unsigned v) # + CExpression c_pick "cnn::expr::pick" (CExpression& x, unsigned* pv) # + CExpression c_pick "cnn::expr::pick" (CExpression& x, vector[unsigned]* pv) # + CExpression c_pickrange "cnn::expr::pickrange" (CExpression& x, unsigned v, unsigned u) # + + CExpression c_pickneglogsoftmax "cnn::expr::pickneglogsoftmax" (CExpression& x, unsigned v) # + CExpression c_pickneglogsoftmax "cnn::expr::pickneglogsoftmax" (CExpression& x, vector[unsigned] vs) # + + # expecting a vector of CExpression + CExpression c_average "cnn::expr::average" (vector[CExpression]& xs) + CExpression c_concat_cols "cnn::expr::concatenate_cols" (vector[CExpression]& xs) + CExpression c_concat "cnn::expr::concatenate" (vector[CExpression]& xs) + + CExpression c_sum "cnn::expr::sum" (vector[CExpression]& xs) + CExpression c_max "cnn::expr::vmax" (vector[CExpression]& xs) + + +#cdef extern from "cnn/model.h" namespace "cnn": +# cdef cppclass Model: + +cdef extern from "cnn/rnn.h" namespace "cnn": + cdef cppclass CRNNPointer "cnn::RNNPointer": + CRNNPointer() + CRNNPointer(int i) + + cdef cppclass CRNNBuilder "cnn::RNNBuilder": + void new_graph(CComputationGraph &cg) + void start_new_sequence(vector[CExpression] ces) + CExpression add_input(CExpression &x) + CExpression add_input(CRNNPointer prev, CExpression &x) + void rewind_one_step() + CExpression back() + vector[CExpression] final_h() + vector[CExpression] final_s() + vector[CExpression] get_h(CRNNPointer i) + vector[CExpression] get_s(CRNNPointer i) + CRNNPointer state() + void set_dropout(float f) + void disable_dropout() + +# TODO unify with LSTMBuilder using inheritance +cdef extern from "cnn/rnn.h" namespace "cnn": + #cdef cppclass RNNBuilder "cnn::RNNBuilder": + cdef cppclass CSimpleRNNBuilder "cnn::SimpleRNNBuilder" (CRNNBuilder): + CSimpleRNNBuilder() + CSimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) + #void new_graph(CComputationGraph &cg) + #void start_new_sequence(vector[CExpression] ces) + #CExpression add_input(CExpression &x) + #CExpression add_input(CRNNPointer prev, CExpression &x) + #void rewind_one_step() + #CExpression back() + #vector[CExpression] final_h() + #vector[CExpression] final_s() + #vector[CExpression] get_h(CRNNPointer i) + #vector[CExpression] get_s(CRNNPointer i) + #CRNNPointer state() + +cdef extern from "cnn/gru.h" namespace "cnn": + cdef cppclass CGRUBuilder "cnn::GRUBuilder" (CRNNBuilder): + CGRUBuilder() + CGRUBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) + #void new_graph(CComputationGraph &cg) + #void start_new_sequence(vector[CExpression] ces) + #CExpression add_input(CExpression &x) + #CExpression add_input(CRNNPointer prev, CExpression &x) + #void rewind_one_step() + #CExpression back() + #vector[CExpression] final_h() + #vector[CExpression] final_s() + #vector[CExpression] get_h(CRNNPointer i) + #vector[CExpression] get_s(CRNNPointer i) + #CRNNPointer state() + +cdef extern from "cnn/lstm.h" namespace "cnn": + cdef cppclass CLSTMBuilder "cnn::LSTMBuilder" (CRNNBuilder): + CLSTMBuilder() + CLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) + #void new_graph(CComputationGraph &cg) + #void start_new_sequence(vector[CExpression] ces) + #CExpression add_input(CExpression &x) + #CExpression add_input(CRNNPointer prev, CExpression &x) + #void rewind_one_step() + #CExpression back() + #vector[CExpression] final_h() + #vector[CExpression] final_s() + #vector[CExpression] get_h(CRNNPointer i) + #vector[CExpression] get_s(CRNNPointer i) + #CRNNPointer state() + +cdef extern from "cnn/fast-lstm.h" namespace "cnn": + cdef cppclass CFastLSTMBuilder "cnn::FastLSTMBuilder" (CRNNBuilder): + CFastLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) + #void new_graph(CComputationGraph &cg) + #void start_new_sequence(vector[CExpression] ces) + #CExpression add_input(CExpression &x) + #CExpression add_input(CRNNPointer prev, CExpression &x) + #void rewind_one_step() + #CExpression back() + #vector[CExpression] final_h() + #vector[CExpression] final_s() + #vector[CExpression] get_h(CRNNPointer i) + #vector[CExpression] get_s(CRNNPointer i) + #CRNNPointer state() + +cdef extern from "pybridge.h" namespace "pycnn": + cdef cppclass CModelSaver "pycnn::ModelSaver": + CModelSaver(string filename, CModel *model) + CModelSaver add_parameter(CParameters p) + CModelSaver add_lookup_parameter(CLookupParameters lp) + CModelSaver add_gru_builder(CGRUBuilder b) + CModelSaver add_lstm_builder(CLSTMBuilder b) + CModelSaver add_srnn_builder(CSimpleRNNBuilder b) + void done() + + cdef cppclass CModelLoader "pycnn::ModelLoader": + CModelLoader(string filename, CModel *model) + CModelSaver fill_parameter(CParameters p) + CModelSaver fill_lookup_parameter(CLookupParameters lp) + CModelSaver fill_gru_builder(CGRUBuilder lp) + CModelSaver fill_lstm_builder(CLSTMBuilder lp) + CModelSaver fill_srnn_builder(CSimpleRNNBuilder lp) + void done() diff --git a/pycnn/setup.py.in b/pycnn/setup.py.in index 002885f22..3b55d92de 100644 --- a/pycnn/setup.py.in +++ b/pycnn/setup.py.in @@ -18,8 +18,8 @@ if platform.system() == 'Darwin': ext_cpu = Extension( - "_pycnn", # name of extension - ["pycnn.pyx"], # filename of our Pyrex/Cython source + "_dynet", # name of extension + ["dynet.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main cnn directory. "${EIGEN3_INCLUDE_DIR}", # this is the directory where eigen is saved. @@ -28,12 +28,12 @@ ext_cpu = Extension( library_dirs=[".","${PROJECT_BINARY_DIR}/cnn/"], #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed extra_compile_args=COMPILER_ARGS, - runtime_library_dirs=["${PROJECT_BINARY_DIR}/cnn/"], + runtime_library_dirs=["${PROJECT_BINARY_DIR}/dynet/"], ) ext_gpu = Extension( - "_gpycnn", # name of extension - ["gpycnn.pyx"], # filename of our Pyrex/Cython source + "_gdynet", # name of extension + ["gdynet.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main cnn directory. "${EIGEN3_INCLUDE_DIR}", # this is the directory where eigen is saved. @@ -52,6 +52,6 @@ if "${WITH_CUDA_BACKEND}"=="1": # if cuda requested setup(ext_modules = TARGET, cmdclass = {'build_ext': build_ext}, - name="pyCNN", - py_modules = ['pycnn','pycnn_viz'], + name="dyNET", + py_modules = ['dynet','dynet_viz'], ) From cc7b757d57affd233409a8ff1e6cb2af8801c714 Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 7 Oct 2016 20:13:15 +0300 Subject: [PATCH 674/965] remove extra file --- pycnn/pynet.pxd | 335 ------------------------------------------------ 1 file changed, 335 deletions(-) delete mode 100644 pycnn/pynet.pxd diff --git a/pycnn/pynet.pxd b/pycnn/pynet.pxd deleted file mode 100644 index 26ffb1dfb..000000000 --- a/pycnn/pynet.pxd +++ /dev/null @@ -1,335 +0,0 @@ -from libcpp.vector cimport vector -from libcpp.string cimport string - -ctypedef float real - -cdef extern from "cnn/init.h" namespace "cnn": - cdef void initialize(int& argc, char **& argv, unsigned random_seed) - -cdef extern from "cnn/dim.h" namespace "cnn": - cdef cppclass CDim "cnn::Dim": - CDim() except + - #CDim(int m) except + - #CDim(int m, int n) except + - CDim(vector[long]& ds) except + - #CDim(std::initializer_list[long] x) except + - int size() - int sum_dims() - CDim truncate() - void resize(unsigned i) - int ndims() - int rows() - int cols() - void set(unsigned i, unsigned s) - int size(unsigned i) - CDim transpose() - -cdef extern from "cnn/tensor.h" namespace "cnn": - cdef cppclass CTensor "cnn::Tensor": - CDim d - float* v - pass - float c_as_scalar "cnn::as_scalar" (CTensor& t) - vector[float] c_as_vector "cnn::as_vector" (CTensor& t) - -cdef extern from "cnn/model.h" namespace "cnn": - cdef cppclass CParameterStorage "cnn::ParameterStorage": - CParameterStorage() - CTensor values - CDim dim - - cdef cppclass CLookupParameterStorage "cnn::LookupParameterStorage": - CLookupParameterStorage() - vector[CTensor] values - CDim dim - - cdef cppclass CParameters "cnn::Parameter": - CParameters() - CParameterStorage *get() - void zero() - - cdef cppclass CLookupParameters "cnn::LookupParameter": - CLookupParameters() - CLookupParameterStorage *get() - CDim dim - void initialize(unsigned index, const vector[float]& val) - void zero() - - cdef cppclass CModel "cnn::Model": - CModel() - #float gradient_l2_norm() const - CParameters add_parameters(CDim& d, float scale = 0.0) - CLookupParameters add_lookup_parameters(unsigned n, const CDim& d) - vector[CParameterStorage] parameters_list() - - void load_cnn_model "cnn::load_cnn_model" (string filename, CModel *model) - void save_cnn_model "cnn::save_cnn_model" (string filename, CModel *model) - -cdef extern from "cnn/cnn.h" namespace "cnn": - ctypedef unsigned VariableIndex - - cdef cppclass CComputationGraph "cnn::ComputationGraph": - CComputationGraph() except + - # Inputs - VariableIndex add_input(real s) - VariableIndex add_input(const real* ps) - VariableIndex add_input(const CDim& d, const vector[float]* pdata) - - # Parameters - VariableIndex add_parameters(CParameters* p) - VariableIndex add_lookup(CLookupParameters* p, const unsigned* pindex) - VariableIndex add_lookup(CLookupParameters* p, unsigned index) - VariableIndex add_const_lookup(CLookupParameters* p, const unsigned* pindex) - VariableIndex add_const_lookup(CLookupParameters* p, unsigned index) - - const CTensor& forward() - const CTensor& incremental_forward() - const CTensor& get_value(VariableIndex i) - void invalidate() - void backward() - void backward(VariableIndex i) - - # checkpointing - void checkpoint() - void revert() - - void print_graphviz() const - -cdef extern from "cnn/training.h" namespace "cnn": - cdef cppclass CSimpleSGDTrainer "cnn::SimpleSGDTrainer": - #CSimpleSGDTrainer(CModel* m, float lam, float e0) - CSimpleSGDTrainer(CModel* m, float e0) # TODO removed lam, update docs. - void update(float s) - void update_epoch(float r) - void status() - - cdef cppclass CMomentumSGDTrainer "cnn::MomentumSGDTrainer": - CMomentumSGDTrainer(CModel* m, float e0, float mom) # TODO removed lam, update docs - void update(float s) - void update_epoch(float r) - void status() - - cdef cppclass CAdagradTrainer "cnn::AdagradTrainer": - CAdagradTrainer(CModel* m, float e0, float eps) # TODO removed lam, update docs - - void update(float s) - void update_epoch(float r) - void status() - - cdef cppclass CAdadeltaTrainer "cnn::AdadeltaTrainer": - CAdadeltaTrainer(CModel* m, float eps, float rho) # TODO removed lam, update docs - - void update(float s) - void update_epoch(float r) - void status() - - cdef cppclass CAdamTrainer "cnn::AdamTrainer": - CAdamTrainer(CModel* m, float alpha, float beta_1, float beta_2, float eps) # TODO removed lam, update docs - - void update(float s) - void update_epoch(float r) - void status() - - -cdef extern from "cnn/expr.h" namespace "cnn::expr": - cdef cppclass CExpression "cnn::expr::Expression": - CExpression() - CExpression(CComputationGraph *pg, VariableIndex i) - CComputationGraph *pg - long i - #CExpression c_input "cnn::expr::input" (CComputationGraph& g, float s) # - CExpression c_input "cnn::expr::input" (CComputationGraph& g, float *ps) # - CExpression c_input "cnn::expr::input" (CComputationGraph& g, CDim& d, vector[float]* pdata) - CExpression c_parameter "cnn::expr::parameter" (CComputationGraph& g, CParameters p) # - #CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # - CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters p, unsigned* pindex) # - CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters p, vector[unsigned]* pindices) # - #CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # - CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters p, unsigned* pindex) # - CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters p, vector[unsigned]* pindices) # - - # identity function, but derivative is not propagated through it - CExpression c_nobackprop "cnn::expr::nobackprop" (CExpression& x) # - - CExpression c_op_neg "cnn::expr::operator-" (CExpression& x) # - CExpression c_op_add "cnn::expr::operator+" (CExpression& x, CExpression& y) # - CExpression c_op_scalar_add "cnn::expr::operator+" (CExpression& x, float y) # - CExpression c_op_mul "cnn::expr::operator*" (CExpression& x, CExpression& y) # - CExpression c_op_scalar_mul "cnn::expr::operator*" (CExpression& x, float y) # - CExpression c_op_scalar_div "cnn::expr::operator/" (CExpression& x, float y) # - CExpression c_op_scalar_sub "cnn::expr::operator-" (float y, CExpression& x) # - - CExpression c_bmax "cnn::expr::max" (CExpression& x, CExpression& y) # - CExpression c_bmin "cnn::expr::min" (CExpression& x, CExpression& y) # - - CExpression c_cdiv "cnn::expr::cdiv" (CExpression& x, CExpression& y) # - CExpression c_colwise_add "cnn::expr::colwise_add" (CExpression& x, CExpression& bias) # - - CExpression c_tanh "cnn::expr::tanh" (CExpression& x) # - CExpression c_exp "cnn::expr::exp" (CExpression& x) # - CExpression c_square "cnn::expr::square" (CExpression& x) # - CExpression c_cube "cnn::expr::cube" (CExpression& x) # - CExpression c_log "cnn::expr::log" (CExpression& x) # - CExpression c_logistic "cnn::expr::logistic" (CExpression& x) # - CExpression c_rectify "cnn::expr::rectify" (CExpression& x) # - #CExpression c_hinge "cnn::expr::hinge" (CExpression& x, unsigned index, float m=?) # - CExpression c_hinge "cnn::expr::hinge" (CExpression& x, unsigned* pindex, float m) # - CExpression c_log_softmax "cnn::expr::log_softmax" (CExpression& x) # - CExpression c_log_softmax "cnn::expr::log_softmax" (CExpression& x, vector[unsigned]& restriction) #? - CExpression c_softmax "cnn::expr::softmax" (CExpression& x) # - CExpression c_softsign "cnn::expr::softsign" (CExpression& x) # - CExpression c_bmin "cnn::expr::min" (CExpression& x, CExpression& y) # - CExpression c_bmax "cnn::expr::max" (CExpression& x, CExpression& y) # - CExpression c_noise "cnn::expr::noise" (CExpression& x, float stddev) # - CExpression c_dropout "cnn::expr::dropout" (CExpression& x, float p) # - CExpression c_block_dropout "cnn::expr::block_dropout" (CExpression& x, float p) # - - CExpression c_reshape "cnn::expr::reshape" (CExpression& x, CDim& d) #? - CExpression c_transpose "cnn::expr::transpose" (CExpression& x) # - - CExpression c_affine_transform "cnn::expr::affine_transform" (const vector[CExpression]& xs) - - CExpression c_trace_of_product "cnn::expr::trace_of_product" (CExpression& x, CExpression& y); - CExpression c_cwise_multiply "cnn::expr::cwise_multiply" (CExpression& x, CExpression& y) # - - CExpression c_dot_product "cnn::expr::dot_product" (CExpression& x, CExpression& y) # - CExpression c_squared_distance "cnn::expr::squared_distance" (CExpression& x, CExpression& y) # - CExpression c_huber_distance "cnn::expr::huber_distance" (CExpression& x, CExpression& y, float c) # - CExpression c_l1_distance "cnn::expr::l1_distance" (CExpression& x, CExpression& y) # - CExpression c_binary_log_loss "cnn::expr::binary_log_loss" (CExpression& x, CExpression& y) # - CExpression c_pairwise_rank_loss "cnn::expr::pairwise_rank_loss" (CExpression& x, CExpression& y, float m) # - CExpression c_poisson_loss "cnn::expr::poisson_loss" (CExpression& x, unsigned y) - - CExpression c_conv1d_narrow "cnn::expr::conv1d_narrow" (CExpression& x, CExpression& f) # - CExpression c_conv1d_wide "cnn::expr::conv1d_wide" (CExpression& x, CExpression& f) # - CExpression c_filter1d_narrow "cnn::expr::filter1d_narrow" (CExpression& x, CExpression& f) # - CExpression c_kmax_pooling "cnn::expr::kmax_pooling" (CExpression& x, unsigned k) # - CExpression c_fold_rows "cnn::expr::fold_rows" (CExpression& x, unsigned nrows) # - CExpression c_sum_cols "cnn::expr::sum_cols" (CExpression& x) # - CExpression c_kmh_ngram "cnn::expr::kmh_ngram" (CExpression& x, unsigned n) # - - CExpression c_sum_batches "cnn::expr::sum_batches" (CExpression& x) - - #CExpression c_pick "cnn::expr::pick" (CExpression& x, unsigned v) # - CExpression c_pick "cnn::expr::pick" (CExpression& x, unsigned* pv) # - CExpression c_pick "cnn::expr::pick" (CExpression& x, vector[unsigned]* pv) # - CExpression c_pickrange "cnn::expr::pickrange" (CExpression& x, unsigned v, unsigned u) # - - CExpression c_pickneglogsoftmax "cnn::expr::pickneglogsoftmax" (CExpression& x, unsigned v) # - CExpression c_pickneglogsoftmax "cnn::expr::pickneglogsoftmax" (CExpression& x, vector[unsigned] vs) # - - # expecting a vector of CExpression - CExpression c_average "cnn::expr::average" (vector[CExpression]& xs) - CExpression c_concat_cols "cnn::expr::concatenate_cols" (vector[CExpression]& xs) - CExpression c_concat "cnn::expr::concatenate" (vector[CExpression]& xs) - - CExpression c_sum "cnn::expr::sum" (vector[CExpression]& xs) - CExpression c_max "cnn::expr::vmax" (vector[CExpression]& xs) - - -#cdef extern from "cnn/model.h" namespace "cnn": -# cdef cppclass Model: - -cdef extern from "cnn/rnn.h" namespace "cnn": - cdef cppclass CRNNPointer "cnn::RNNPointer": - CRNNPointer() - CRNNPointer(int i) - - cdef cppclass CRNNBuilder "cnn::RNNBuilder": - void new_graph(CComputationGraph &cg) - void start_new_sequence(vector[CExpression] ces) - CExpression add_input(CExpression &x) - CExpression add_input(CRNNPointer prev, CExpression &x) - void rewind_one_step() - CExpression back() - vector[CExpression] final_h() - vector[CExpression] final_s() - vector[CExpression] get_h(CRNNPointer i) - vector[CExpression] get_s(CRNNPointer i) - CRNNPointer state() - void set_dropout(float f) - void disable_dropout() - -# TODO unify with LSTMBuilder using inheritance -cdef extern from "cnn/rnn.h" namespace "cnn": - #cdef cppclass RNNBuilder "cnn::RNNBuilder": - cdef cppclass CSimpleRNNBuilder "cnn::SimpleRNNBuilder" (CRNNBuilder): - CSimpleRNNBuilder() - CSimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) - #void new_graph(CComputationGraph &cg) - #void start_new_sequence(vector[CExpression] ces) - #CExpression add_input(CExpression &x) - #CExpression add_input(CRNNPointer prev, CExpression &x) - #void rewind_one_step() - #CExpression back() - #vector[CExpression] final_h() - #vector[CExpression] final_s() - #vector[CExpression] get_h(CRNNPointer i) - #vector[CExpression] get_s(CRNNPointer i) - #CRNNPointer state() - -cdef extern from "cnn/gru.h" namespace "cnn": - cdef cppclass CGRUBuilder "cnn::GRUBuilder" (CRNNBuilder): - CGRUBuilder() - CGRUBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) - #void new_graph(CComputationGraph &cg) - #void start_new_sequence(vector[CExpression] ces) - #CExpression add_input(CExpression &x) - #CExpression add_input(CRNNPointer prev, CExpression &x) - #void rewind_one_step() - #CExpression back() - #vector[CExpression] final_h() - #vector[CExpression] final_s() - #vector[CExpression] get_h(CRNNPointer i) - #vector[CExpression] get_s(CRNNPointer i) - #CRNNPointer state() - -cdef extern from "cnn/lstm.h" namespace "cnn": - cdef cppclass CLSTMBuilder "cnn::LSTMBuilder" (CRNNBuilder): - CLSTMBuilder() - CLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) - #void new_graph(CComputationGraph &cg) - #void start_new_sequence(vector[CExpression] ces) - #CExpression add_input(CExpression &x) - #CExpression add_input(CRNNPointer prev, CExpression &x) - #void rewind_one_step() - #CExpression back() - #vector[CExpression] final_h() - #vector[CExpression] final_s() - #vector[CExpression] get_h(CRNNPointer i) - #vector[CExpression] get_s(CRNNPointer i) - #CRNNPointer state() - -cdef extern from "cnn/fast-lstm.h" namespace "cnn": - cdef cppclass CFastLSTMBuilder "cnn::FastLSTMBuilder" (CRNNBuilder): - CFastLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) - #void new_graph(CComputationGraph &cg) - #void start_new_sequence(vector[CExpression] ces) - #CExpression add_input(CExpression &x) - #CExpression add_input(CRNNPointer prev, CExpression &x) - #void rewind_one_step() - #CExpression back() - #vector[CExpression] final_h() - #vector[CExpression] final_s() - #vector[CExpression] get_h(CRNNPointer i) - #vector[CExpression] get_s(CRNNPointer i) - #CRNNPointer state() - -cdef extern from "pybridge.h" namespace "pycnn": - cdef cppclass CModelSaver "pycnn::ModelSaver": - CModelSaver(string filename, CModel *model) - CModelSaver add_parameter(CParameters p) - CModelSaver add_lookup_parameter(CLookupParameters lp) - CModelSaver add_gru_builder(CGRUBuilder b) - CModelSaver add_lstm_builder(CLSTMBuilder b) - CModelSaver add_srnn_builder(CSimpleRNNBuilder b) - void done() - - cdef cppclass CModelLoader "pycnn::ModelLoader": - CModelLoader(string filename, CModel *model) - CModelSaver fill_parameter(CParameters p) - CModelSaver fill_lookup_parameter(CLookupParameters lp) - CModelSaver fill_gru_builder(CGRUBuilder lp) - CModelSaver fill_lstm_builder(CLSTMBuilder lp) - CModelSaver fill_srnn_builder(CSimpleRNNBuilder lp) - void done() From 5500de5ae8578c23ac2ec347912daa4e19cb1b4a Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 7 Oct 2016 20:17:09 +0300 Subject: [PATCH 675/965] pycnn -> dynet --- pycnn/dynet.py | 14 +++++++------- pycnn/dynet.pyx | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/pycnn/dynet.py b/pycnn/dynet.py index 8dc3b750d..0983e6ff6 100644 --- a/pycnn/dynet.py +++ b/pycnn/dynet.py @@ -1,13 +1,13 @@ import sys -if '--pycnn-viz' in sys.argv: - from pycnn_viz import * -elif '--pycnn-gpu' in sys.argv: +if '--dynet-viz' in sys.argv: + from dynet_viz import * +elif '--dynet-gpu' in sys.argv: def print_graphviz(**kwarge): - print "Run with --pycnn-viz to get the visualization behavior." - from _gpycnn import * + print "Run with --dynet-viz to get the visualization behavior." + from _gdynet import * else: def print_graphviz(**kwarge): - print "Run with --pycnn-viz to get the visualization behavior." - from _pycnn import * + print "Run with --dynet-viz to get the visualization behavior." + from _dynet import * __version__ = 2.0 diff --git a/pycnn/dynet.pyx b/pycnn/dynet.pyx index ddd3bb93b..abcbef393 100644 --- a/pycnn/dynet.pyx +++ b/pycnn/dynet.pyx @@ -29,8 +29,8 @@ import os.path # - embedcl # - embed/nlm -- negative sampling? -from pycnn cimport * -cimport pycnn +from dynet cimport * +cimport dynet cdef init(random_seed=None): @@ -42,10 +42,10 @@ cdef init(random_seed=None): c_argv[idx] = s if random_seed is None: - pycnn.initialize(argc,c_argv, 0) + dynet.initialize(argc,c_argv, 0) else: if random_seed == 0: random_seed = 1 - pycnn.initialize(argc,c_argv, random_seed) + dynet.initialize(argc,c_argv, random_seed) free(c_argv) init() # TODO: allow different random seeds @@ -392,7 +392,7 @@ cdef class ComputationGraph: cdef list _inputs cdef int _cg_version def __cinit__(self, int guard=0): - if guard != SECRET: raise RuntimeError("Do not instantiate ComputationGraph directly. Use pycnn.cg()") + if guard != SECRET: raise RuntimeError("Do not instantiate ComputationGraph directly. Use dynet.renew_cg()") self.thisptr = new CComputationGraph() self._inputs = [] self._cg_version = 0 From ec31842f714725677c9b3b2095ddb03ef07a6980 Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 7 Oct 2016 20:23:59 +0300 Subject: [PATCH 676/965] pycnn dir -> python --- pycnn/setup_gpu.py | 30 ------------------------------ {pycnn => python}/CHANGES.md | 0 {pycnn => python}/CMakeLists.txt | 0 {pycnn => python}/INSTALL | 0 {pycnn => python}/dynet.pxd | 0 {pycnn => python}/dynet.py | 0 {pycnn => python}/dynet.pyx | 0 {pycnn => python}/dynet_viz.py | 0 {pycnn => python}/makefile | 0 {pycnn => python}/model_test.py | 0 {pycnn => python}/pybridge.h | 0 {pycnn => python}/setup.py.in | 2 +- 12 files changed, 1 insertion(+), 31 deletions(-) delete mode 100644 pycnn/setup_gpu.py rename {pycnn => python}/CHANGES.md (100%) rename {pycnn => python}/CMakeLists.txt (100%) rename {pycnn => python}/INSTALL (100%) rename {pycnn => python}/dynet.pxd (100%) rename {pycnn => python}/dynet.py (100%) rename {pycnn => python}/dynet.pyx (100%) rename {pycnn => python}/dynet_viz.py (100%) rename {pycnn => python}/makefile (100%) rename {pycnn => python}/model_test.py (100%) rename {pycnn => python}/pybridge.h (100%) rename {pycnn => python}/setup.py.in (97%) diff --git a/pycnn/setup_gpu.py b/pycnn/setup_gpu.py deleted file mode 100644 index a9d35b2db..000000000 --- a/pycnn/setup_gpu.py +++ /dev/null @@ -1,30 +0,0 @@ -from setuptools import setup -from setuptools.extension import Extension -from Cython.Distutils import build_ext - - -# Remove the "-Wstrict-prototypes" compiler option, which isn't valid for C++. -import distutils.sysconfig -cfg_vars = distutils.sysconfig.get_config_vars() -if "CFLAGS" in cfg_vars: - cfg_vars["CFLAGS"] = cfg_vars["CFLAGS"].replace("-Wstrict-prototypes", "") - -ext = Extension( - "gpycnn", # name of extension - ["gpycnn.pyx"], # filename of our Pyrex/Cython source - language="c++", # this causes Pyrex/Cython to create C++ source - include_dirs=["../../cnn/", # this is the location of the main cnn directory. - "../../eigen/"], # this is the directory where eigen is saved. - #libraries=['cnn','cnncuda'], #,'cnncuda_shared'], # ditto - libraries=['gcnn_shared','cnncuda_shared'], # ditto - library_dirs=["."], - #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed - extra_compile_args=["-std=c++11","-fPIC"],#,"-lcudart","-lcublas"], - extra_link_args=["-L/usr/local/cuda-7.5/lib64","-lcudart","-lcublas"], - #extra_objects=["libcnncuda.a"], - ) - -setup(ext_modules = [ext], - cmdclass = {'build_ext': build_ext}, - name="gpyCNN", - ) diff --git a/pycnn/CHANGES.md b/python/CHANGES.md similarity index 100% rename from pycnn/CHANGES.md rename to python/CHANGES.md diff --git a/pycnn/CMakeLists.txt b/python/CMakeLists.txt similarity index 100% rename from pycnn/CMakeLists.txt rename to python/CMakeLists.txt diff --git a/pycnn/INSTALL b/python/INSTALL similarity index 100% rename from pycnn/INSTALL rename to python/INSTALL diff --git a/pycnn/dynet.pxd b/python/dynet.pxd similarity index 100% rename from pycnn/dynet.pxd rename to python/dynet.pxd diff --git a/pycnn/dynet.py b/python/dynet.py similarity index 100% rename from pycnn/dynet.py rename to python/dynet.py diff --git a/pycnn/dynet.pyx b/python/dynet.pyx similarity index 100% rename from pycnn/dynet.pyx rename to python/dynet.pyx diff --git a/pycnn/dynet_viz.py b/python/dynet_viz.py similarity index 100% rename from pycnn/dynet_viz.py rename to python/dynet_viz.py diff --git a/pycnn/makefile b/python/makefile similarity index 100% rename from pycnn/makefile rename to python/makefile diff --git a/pycnn/model_test.py b/python/model_test.py similarity index 100% rename from pycnn/model_test.py rename to python/model_test.py diff --git a/pycnn/pybridge.h b/python/pybridge.h similarity index 100% rename from pycnn/pybridge.h rename to python/pybridge.h diff --git a/pycnn/setup.py.in b/python/setup.py.in similarity index 97% rename from pycnn/setup.py.in rename to python/setup.py.in index 3b55d92de..acebb3cef 100644 --- a/pycnn/setup.py.in +++ b/python/setup.py.in @@ -28,7 +28,7 @@ ext_cpu = Extension( library_dirs=[".","${PROJECT_BINARY_DIR}/cnn/"], #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed extra_compile_args=COMPILER_ARGS, - runtime_library_dirs=["${PROJECT_BINARY_DIR}/dynet/"], + runtime_library_dirs=["${PROJECT_BINARY_DIR}/cnn/"], ) ext_gpu = Extension( From 3f5f644700bf59013a0ad14b384594a153a3c08e Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 7 Oct 2016 20:29:45 +0300 Subject: [PATCH 677/965] pycnn -> dynet in examples and tutorials --- pyexamples/attention.py | 2 +- pyexamples/bilstmtagger.py | 2 +- pyexamples/cpu_vs_gpu.py | 4 ++-- pyexamples/minibatch.py | 2 +- pyexamples/pycnn_viz_birnn.py | 2 +- pyexamples/rnnlm.py | 6 +++--- pyexamples/rnnlm_transduce.py | 2 +- pyexamples/tutorials/API.ipynb | 8 ++++---- pyexamples/tutorials/RNNs.ipynb | 6 +++--- pyexamples/tutorials/tutorial-1-xor.ipynb | 20 ++++++++++---------- pyexamples/xor.py | 2 +- 11 files changed, 28 insertions(+), 28 deletions(-) diff --git a/pyexamples/attention.py b/pyexamples/attention.py index ea5da2770..90d7c642c 100644 --- a/pyexamples/attention.py +++ b/pyexamples/attention.py @@ -1,4 +1,4 @@ -import pycnn as pc +import dynet as pc import random EOS = "" diff --git a/pyexamples/bilstmtagger.py b/pyexamples/bilstmtagger.py index f7e01346b..597a209f4 100644 --- a/pyexamples/bilstmtagger.py +++ b/pyexamples/bilstmtagger.py @@ -1,4 +1,4 @@ -from pycnn import * +from dynet import * from collections import Counter import random diff --git a/pyexamples/cpu_vs_gpu.py b/pyexamples/cpu_vs_gpu.py index 527921578..1b2456695 100644 --- a/pyexamples/cpu_vs_gpu.py +++ b/pyexamples/cpu_vs_gpu.py @@ -1,6 +1,6 @@ -import gpycnn as G +import _gdynet as G print -import pycnn as C +import _dynet as C cm = C.Model() gm = G.Model() diff --git a/pyexamples/minibatch.py b/pyexamples/minibatch.py index 796c408d9..6950b91b5 100644 --- a/pyexamples/minibatch.py +++ b/pyexamples/minibatch.py @@ -1,4 +1,4 @@ -from pycnn import * +from dynet import * import numpy as np m = Model() diff --git a/pyexamples/pycnn_viz_birnn.py b/pyexamples/pycnn_viz_birnn.py index cb1ae5d6a..477ea229d 100644 --- a/pyexamples/pycnn_viz_birnn.py +++ b/pyexamples/pycnn_viz_birnn.py @@ -1,4 +1,4 @@ -from pycnn import * +from dynet import * train_sentence = [('the','D'), ('dog','N'), ('walks','V')] diff --git a/pyexamples/rnnlm.py b/pyexamples/rnnlm.py index 9fc3acc10..39a778333 100644 --- a/pyexamples/rnnlm.py +++ b/pyexamples/rnnlm.py @@ -1,10 +1,10 @@ -from pycnn import * +from dynet import * import time import random LAYERS = 2 -INPUT_DIM = 50 #256 -HIDDEN_DIM = 50 #1024 +INPUT_DIM = 256 #50 #256 +HIDDEN_DIM = 256 # 50 #1024 VOCAB_SIZE = 0 from collections import defaultdict diff --git a/pyexamples/rnnlm_transduce.py b/pyexamples/rnnlm_transduce.py index 7c2e99bc5..634d4f5c9 100644 --- a/pyexamples/rnnlm_transduce.py +++ b/pyexamples/rnnlm_transduce.py @@ -1,5 +1,5 @@ # a version rnnlm.py using the transduce() interface. -from pycnn import * +from dynet import * import time import random diff --git a/pyexamples/tutorials/API.ipynb b/pyexamples/tutorials/API.ipynb index 0ba32b070..1d08637d8 100644 --- a/pyexamples/tutorials/API.ipynb +++ b/pyexamples/tutorials/API.ipynb @@ -17,7 +17,7 @@ }, "outputs": [], "source": [ - "from pycnn import *\n", + "from dynet import *\n", "\n", "## ==== Create a new computation graph\n", "# (it is a singleton, we have one at each stage.\n", @@ -209,7 +209,7 @@ } ], "source": [ - "from pycnn import *\n", + "from dynet import *\n", "\n", "# create model\n", "m = Model()\n", @@ -223,7 +223,7 @@ "# create trainer \n", "trainer = SimpleSGDTrainer(m)\n", "\n", - "# Regularization is set via the --cnn-l2 commandline flag.\n", + "# Regularization is set via the --dynet-l2 commandline flag.\n", "# Learning rate parameters can be passed to the trainer:\n", "# alpha = 0.1 # learning rate\n", "# trainer = SimpleSGDTrainer(m, e0=alpha)\n", @@ -314,7 +314,7 @@ } ], "source": [ - "from pycnn import *\n", + "from dynet import *\n", "# create model\n", "m = Model()\n", "\n", diff --git a/pyexamples/tutorials/RNNs.ipynb b/pyexamples/tutorials/RNNs.ipynb index f79836c0f..8db789100 100644 --- a/pyexamples/tutorials/RNNs.ipynb +++ b/pyexamples/tutorials/RNNs.ipynb @@ -8,9 +8,9 @@ }, "outputs": [], "source": [ - "# we assume that we have the pycnn module in your path.\n", - "# we also assume that LD_LIBRARY_PATH includes a pointer to where libcnn_shared.so is.\n", - "from pycnn import *" + "# we assume that we have the dynet module in your path.\n", + "# OUTDATED: we also assume that LD_LIBRARY_PATH includes a pointer to where libcnn_shared.so is.\n", + "from dynet import *" ] }, { diff --git a/pyexamples/tutorials/tutorial-1-xor.ipynb b/pyexamples/tutorials/tutorial-1-xor.ipynb index fb95ba07e..dbeb2c4d5 100644 --- a/pyexamples/tutorials/tutorial-1-xor.ipynb +++ b/pyexamples/tutorials/tutorial-1-xor.ipynb @@ -8,23 +8,23 @@ }, "outputs": [], "source": [ - "# we assume that we have the pycnn module in your path.\n", - "# we also assume that LD_LIBRARY_PATH includes a pointer to where libcnn_shared.so is.\n", - "from pycnn import *" + "# we assume that we have the dynet module in your path.\n", + "# OUTDATED: we also assume that LD_LIBRARY_PATH includes a pointer to where libcnn_shared.so is.\n", + "from dynet import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Working with the pyCNN package\n", + "# Working with the python dyNET package\n", "\n", - "The pyCNN package is intended for neural-network processing on the CPU, and is particularly suited for NLP applications. It is a python-wrapper for the CNN package written by Chris Dyer.\n", + "The dyNET package is intended for neural-network processing on the CPU, and is particularly suited for NLP applications. It is a python-wrapper for the dyNET C++ package written by Chris Dyer.\n", "\n", "There are two modes of operation:\n", "\n", "* __Static networks__, in which a network is built and then being fed with different inputs/outputs. Most NN packages work this way.\n", - "* __Dynamic networks__, in which a new network is built for each training example (sharing parameters with the networks of other training examples). This approach is what makes pyCNN unique, and where most of its power comes from.\n", + "* __Dynamic networks__, in which a new network is built for each training example (sharing parameters with the networks of other training examples). This approach is what makes dyNET unique, and where most of its power comes from.\n", "\n", "We will describe both of these modes." ] @@ -35,12 +35,12 @@ "source": [ "## Package Fundamentals\n", "\n", - "The main piece of pyCNN is the `ComputationGraph`, which is what essentially defines a neural network.\n", + "The main piece of dyNET is the `ComputationGraph`, which is what essentially defines a neural network.\n", "The `ComputationGraph` is composed of expressions, which relate to the inputs and outputs of the network,\n", "as well as the `Parameters` of the network. The parameters are the things in the network that are optimized over time, and all of the parameters sit inside a `Model`. There are `trainers` (for example `SimpleSGDTrainer`) that are in charge of setting the parameter values.\n", "\n", "We will not be using the `ComputationGraph` directly, but it is there in the background, as a singleton object.\n", - "When `pycnn` is imported, a new `ComputationGraph` is created. We can then reset the computation graph to a new state\n", + "When `dynet` is imported, a new `ComputationGraph` is created. We can then reset the computation graph to a new state\n", "by calling `renew_cg()`.\n" ] }, @@ -50,7 +50,7 @@ "source": [ "## Static Networks\n", "\n", - "The life-cycle of a pyCNN program is:\n", + "The life-cycle of a dyNET program is:\n", "1. Create a `Model`, and populate it with `Parameters`.\n", "2. Renew the computation graph, and create `Expression` representing the network\n", " (the network will include the `Expression`s for the `Parameters` defined in the model).\n", @@ -805,7 +805,7 @@ } ], "source": [ - "from pycnn import *\n", + "from dynet import *\n", "# create training instances, as before\n", "def create_xor_instances(num_rounds=2000):\n", " questions = []\n", diff --git a/pyexamples/xor.py b/pyexamples/xor.py index 1cd6a69ba..cce24ece1 100644 --- a/pyexamples/xor.py +++ b/pyexamples/xor.py @@ -1,4 +1,4 @@ -from pycnn import * +from dynet import * #xsent = True xsent = False From 74f79e58b26bde903f199f28a9a3de4344f1310d Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 7 Oct 2016 20:34:07 +0300 Subject: [PATCH 678/965] pycnn -> python dir din CMakeList --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9ff7229f5..11a129dfe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -122,5 +122,5 @@ add_subdirectory(tests) add_subdirectory(examples) add_subdirectory(tutorial) add_subdirectory(rnnlm) -add_subdirectory(pycnn) +add_subdirectory(python) enable_testing() From b44219ad0d56427ea2cad75a0288869905e25ef8 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 7 Oct 2016 15:32:05 -0400 Subject: [PATCH 679/965] Made a few small changes to the README --- PYINSTALL.md | 4 ++-- README.md | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/PYINSTALL.md b/PYINSTALL.md index 8f6dd0fad..e54240907 100644 --- a/PYINSTALL.md +++ b/PYINSTALL.md @@ -23,7 +23,7 @@ cd cnn hg clone https://bitbucket.org/eigen/eigen/ ``` -We also need to make sure the `chython` module is installed. +We also need to make sure the `cython` module is installed. (you can replace `pip` with your favorite package manager, such as `conda`, or install within a virtual environment) ```bash pip install cython @@ -96,7 +96,7 @@ model = Model() ``` ## Installing with GPU support -## Currently unsuperted. The GPU support instructions need some revisions. +## Currently unsupported. The GPU support instructions need some revisions. For installing on a computer with GPU, first install CUDA. Here, we assume CUDA is installed in `/usr/local/cuda-7.5` diff --git a/README.md b/README.md index 786449906..51d793efd 100644 --- a/README.md +++ b/README.md @@ -5,22 +5,17 @@ cnn is a neural network library that is written in C++ (with bindings in Python) ### Building -(for building the python bindings (pycnn), see `PYINSTALL.md`) +(for how to use the python bindings, see `PYINSTALL.md`) Before compiling cnn, you need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function. **If you use any of the released versions, you may get assertion failures or compile errors.** -First you need to fetch the dependent libraries - - git submodule init - git submodule update - In `src`, you need to first use [`cmake`](http://www.cmake.org/) to generate the makefiles mkdir build cd build cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen -Then to compile, run +Then compile, where "2" can be replaced by the number of cores on your machine make -j 2 @@ -49,7 +44,12 @@ both `Eigen` and `cnn`. Eigen does not have to be compiled, so “installing” ##### GPU (CUDA) support `cnn` supports running programs on GPUs with CUDA. If you have CUDA installed, you -can build cnn to be run on GPUs by adding `-DBACKEND=cuda` to your cmake options. +can build cnn with GPU support by adding `-DBACKEND=cuda` to your cmake options. +This will result in two libraries named "libcnn" and "libgcnn" being created. When +you want to run a program on CPU, you can link to the "libcnn" library, and when +you want to run a program on GPU, you can link to the "libgcnn" library. (Eventually +you will be able to use a single library to run on either CPU or GPU, but this is +not fully implemented yet.) ##### Non-standard Boost location From d7dbc42158357d32914e66bbc28f65205cc9d1ad Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 7 Oct 2016 22:41:56 +0300 Subject: [PATCH 680/965] adapt pydynet to use indexed forward API --- python/dynet.pxd | 5 ++--- python/dynet.pyx | 36 ++++++++++++++++++------------------ 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/python/dynet.pxd b/python/dynet.pxd index 26ffb1dfb..4cf6cdd55 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -82,11 +82,10 @@ cdef extern from "cnn/cnn.h" namespace "cnn": VariableIndex add_const_lookup(CLookupParameters* p, const unsigned* pindex) VariableIndex add_const_lookup(CLookupParameters* p, unsigned index) - const CTensor& forward() - const CTensor& incremental_forward() + const CTensor& forward(VariableIndex index) + const CTensor& incremental_forward(VariableIndex index) const CTensor& get_value(VariableIndex i) void invalidate() - void backward() void backward(VariableIndex i) # checkpointing diff --git a/python/dynet.pyx b/python/dynet.pyx index abcbef393..4de36e6cb 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -421,23 +421,23 @@ cdef class ComputationGraph: # results[name] = self.lookup(model[name]) # return results - cpdef forward_scalar(self): - return c_as_scalar(self.thisptr.forward()) + cpdef forward_scalar(self, VariableIndex index): + return c_as_scalar(self.thisptr.forward(index)) - cpdef inc_forward_scalar(self): - return c_as_scalar(self.thisptr.incremental_forward()) + cpdef inc_forward_scalar(self, VariableIndex index): + return c_as_scalar(self.thisptr.incremental_forward(index)) - cpdef forward_vec(self): - return c_as_vector(self.thisptr.forward()) + cpdef forward_vec(self, VariableIndex index): + return c_as_vector(self.thisptr.forward(index)) - cpdef inc_forward_vec(self): - return c_as_vector(self.thisptr.incremental_forward()) + cpdef inc_forward_vec(self, VariableIndex index): + return c_as_vector(self.thisptr.incremental_forward(index)) - cpdef forward(self): self.thisptr.forward() - cpdef inc_forward(self): self.thisptr.incremental_forward() + cpdef forward(self, VariableIndex index): self.thisptr.forward(index) + cpdef inc_forward(self, VariableIndex index): self.thisptr.incremental_forward(index) - cpdef backward(self): - self.thisptr.backward() + cpdef backward(self, VariableIndex index): + self.thisptr.backward(index) cpdef print_graphviz(self): self.thisptr.print_graphviz() @@ -536,19 +536,19 @@ cdef class Expression: #{{{ cpdef scalar_value(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") - if recalculate: self.cg().forward() + if recalculate: self.cg().forward(self.vindex) # TODO: make recalculate run on the entire graph, not only up to here? return c_as_scalar(self.cgp().get_value(self.vindex)) cpdef vec_value(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") - if recalculate: self.cg().forward() + if recalculate: self.cg().forward(self.vindex) return c_as_vector(self.cgp().get_value(self.vindex)) cpdef npvalue(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") cdef CTensor t cdef CDim dim - if recalculate: self.cg().forward() + if recalculate: self.cg().forward(self.vindex) t = self.cgp().get_value(self.vindex) dim = t.d arr = np.array(c_as_vector(t)) @@ -559,7 +559,7 @@ cdef class Expression: #{{{ cpdef value(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") cdef CTensor t - if recalculate: self.cg().forward() + if recalculate: self.cg().forward(self.vindex) t = self.cgp().get_value(self.vindex) if t.d.ndims() == 2: return self.npvalue() @@ -570,8 +570,8 @@ cdef class Expression: #{{{ # TODO this runs incremental forward on the entire graph, may not be optimal in terms of efficiency. cpdef forward(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") - if recalculate: self.cg().forward() - else: self.cg().inc_forward() + if recalculate: self.cg().forward(self.vindex) + else: self.cg().inc_forward(self.vindex) cpdef backward(self): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") From 923a6a8aee6c16615529a554848755afe26983f6 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 7 Oct 2016 17:39:04 -0400 Subject: [PATCH 681/965] Updated name to DyNet --- .gitignore | 10 +- CMakeLists.txt | 6 +- MEM.notes | 2 +- PYINSTALL.md | 66 ++--- README.md | 52 ++-- TODO.cnn | 46 --- cmake/{FindCNN.cmake => FindDyNet.cmake} | 0 cnn/graph.h | 9 - cnn/tests/test_edges.cc | 342 ----------------------- cnn/tests/test_init.cc | 63 ----- cnn/tests/test_utils.h | 79 ------ config.h.cmake | 4 +- {cnn => dynet}/CMakeLists.txt | 34 +-- {cnn => dynet}/aligned-mem-pool.cc | 0 {cnn => dynet}/aligned-mem-pool.h | 12 +- {cnn => dynet}/c2w.h | 14 +- {cnn => dynet}/cfsm-builder.cc | 16 +- {cnn => dynet}/cfsm-builder.h | 18 +- {cnn => dynet}/cuda.cc | 60 ++-- {cnn => dynet}/cuda.h | 14 +- {cnn => dynet}/deep-lstm.cc | 10 +- {cnn => dynet}/deep-lstm.h | 16 +- {cnn => dynet}/devices.cc | 12 +- {cnn => dynet}/devices.h | 12 +- {cnn => dynet}/dict.cc | 8 +- {cnn => dynet}/dict.h | 8 +- {cnn => dynet}/dim.cc | 10 +- {cnn => dynet}/dim.h | 12 +- cnn/cnn-helper.h => dynet/dynet-helper.h | 8 +- cnn/cnn.cc => dynet/dynet.cc | 18 +- cnn/cnn.h => dynet/dynet.h | 20 +- {cnn => dynet}/except.h | 10 +- {cnn => dynet}/exec.cc | 12 +- {cnn => dynet}/exec.h | 10 +- {cnn => dynet}/expr.cc | 8 +- {cnn => dynet}/expr.h | 12 +- {cnn => dynet}/fast-lstm.cc | 10 +- {cnn => dynet}/fast-lstm.h | 16 +- {cnn => dynet}/functors.h | 98 +++---- {cnn => dynet}/globals.cc | 6 +- {cnn => dynet}/globals.h | 8 +- {cnn => dynet}/gpu-kernels.h | 10 +- {cnn => dynet}/gpu-model.cu | 0 {cnn => dynet}/gpu-nodes-contract.cu | 0 {cnn => dynet}/gpu-nodes-conv.cu | 0 {cnn => dynet}/gpu-nodes.cu | 0 {cnn => dynet}/gpu-ops.cu | 12 +- {cnn => dynet}/gpu-ops.h | 8 +- {cnn => dynet}/gpu-param-nodes.cu | 0 {cnn => dynet}/gpu-training.cu | 0 {cnn => dynet}/grad-check.cc | 12 +- {cnn => dynet}/grad-check.h | 10 +- {cnn => dynet}/graph.cc | 10 +- dynet/graph.h | 9 + {cnn => dynet}/gru.cc | 10 +- {cnn => dynet}/gru.h | 12 +- {cnn => dynet}/hsm-builder.cc | 12 +- {cnn => dynet}/hsm-builder.h | 16 +- {cnn => dynet}/init.cc | 42 +-- {cnn => dynet}/init.h | 8 +- {cnn => dynet}/io-macros.h | 8 +- {cnn => dynet}/lstm.cc | 14 +- {cnn => dynet}/lstm.h | 16 +- {cnn => dynet}/mem.cc | 18 +- {cnn => dynet}/mem.h | 8 +- {cnn => dynet}/model.cc | 46 +-- {cnn => dynet}/model.h | 20 +- {cnn => dynet}/mp.cc | 16 +- {cnn => dynet}/mp.h | 20 +- {cnn => dynet}/nodes-common.cc | 8 +- {cnn => dynet}/nodes-contract.cc | 32 +-- {cnn => dynet}/nodes-contract.h | 20 +- {cnn => dynet}/nodes-conv.cc | 28 +- {cnn => dynet}/nodes-conv.h | 26 +- {cnn => dynet}/nodes-macros.h | 28 +- {cnn => dynet}/nodes.cc | 140 +++++----- {cnn => dynet}/nodes.h | 138 ++++----- {cnn => dynet}/param-nodes.cc | 26 +- {cnn => dynet}/param-nodes.h | 30 +- {cnn => dynet}/pretrain.cc | 10 +- {cnn => dynet}/pretrain.h | 12 +- {cnn => dynet}/rnn-state-machine.cc | 12 +- {cnn => dynet}/rnn-state-machine.h | 8 +- {cnn => dynet}/rnn.cc | 24 +- {cnn => dynet}/rnn.h | 22 +- {cnn => dynet}/saxe-init.cc | 6 +- {cnn => dynet}/saxe-init.h | 6 +- {cnn => dynet}/shadow-params.cc | 20 +- {cnn => dynet}/shadow-params.h | 10 +- {cnn => dynet}/simd-functors.h | 70 ++--- {cnn => dynet}/tensor.cc | 18 +- {cnn => dynet}/tensor.h | 20 +- {cnn => dynet}/timing.h | 4 +- {cnn => dynet}/training.cc | 70 ++--- {cnn => dynet}/training.h | 38 +-- {cnn => dynet}/weight-decay.cc | 8 +- {cnn => dynet}/weight-decay.h | 8 +- examples/CMakeLists.txt | 8 +- examples/embed-cl.cc | 22 +- examples/encdec.cc | 24 +- examples/mlc.cc | 18 +- examples/nlm.cc | 16 +- examples/poisson-regression.cc | 28 +- examples/read-write.cc | 50 ++-- examples/rnnlm-aevb.cc | 24 +- examples/rnnlm-batch.cc | 24 +- examples/rnnlm-cfsm.cc | 26 +- examples/rnnlm-givenbag.cc | 26 +- examples/rnnlm-mp.cc | 24 +- examples/rnnlm.cc | 24 +- examples/rnnlm.h | 14 +- examples/segrnn-sup.cc | 60 ++-- examples/skiprnnlm.cc | 24 +- examples/tag-bilstm.cc | 26 +- examples/textcat.cc | 26 +- examples/tok-embed.cc | 24 +- examples/xor-batch-lookup.cc | 16 +- examples/xor-batch.cc | 20 +- examples/xor-xent.cc | 16 +- examples/xor.cc | 20 +- python/CHANGES.md | 10 +- python/CMakeLists.txt | 4 +- python/dynet.pxd | 248 ++++++++-------- python/dynet.pyx | 10 +- python/dynet_viz.py | 2 +- python/model_test.py | 2 +- python/pybridge.h | 62 ++-- python/setup.py.in | 20 +- rnnlm/CMakeLists.txt | 6 +- rnnlm/lm.cc | 28 +- tests/CMakeLists.txt | 16 +- tests/README.md | 2 +- tests/{test-cnn.cc => test-dynet.cc} | 22 +- tests/test-nodes.cc | 178 ++++++------ tests/test-trainers.cc | 46 +-- tutorial/0_multiply.cc | 12 +- tutorial/1_linear_regression.cc | 12 +- tutorial/CMakeLists.txt | 6 +- 138 files changed, 1533 insertions(+), 2063 deletions(-) delete mode 100644 TODO.cnn rename cmake/{FindCNN.cmake => FindDyNet.cmake} (100%) delete mode 100644 cnn/graph.h delete mode 100644 cnn/tests/test_edges.cc delete mode 100644 cnn/tests/test_init.cc delete mode 100644 cnn/tests/test_utils.h rename {cnn => dynet}/CMakeLists.txt (73%) rename {cnn => dynet}/aligned-mem-pool.cc (100%) rename {cnn => dynet}/aligned-mem-pool.h (80%) rename {cnn => dynet}/c2w.h (91%) rename {cnn => dynet}/cfsm-builder.cc (95%) rename {cnn => dynet}/cfsm-builder.h (92%) rename {cnn => dynet}/cuda.cc (66%) rename {cnn => dynet}/cuda.h (85%) rename {cnn => dynet}/deep-lstm.cc (97%) rename {cnn => dynet}/deep-lstm.h (87%) rename {cnn => dynet}/devices.cc (96%) rename {cnn => dynet}/devices.h (92%) rename {cnn => dynet}/dict.cc (92%) rename {cnn => dynet}/dict.h (96%) rename {cnn => dynet}/dim.cc (81%) rename {cnn => dynet}/dim.h (95%) rename cnn/cnn-helper.h => dynet/dynet-helper.h (76%) rename cnn/cnn.cc => dynet/dynet.cc (97%) rename cnn/cnn.h => dynet/dynet.h (97%) rename {cnn => dynet}/except.h (84%) rename {cnn => dynet}/exec.cc (97%) rename {cnn => dynet}/exec.h (92%) rename {cnn => dynet}/expr.cc (99%) rename {cnn => dynet}/expr.h (98%) rename {cnn => dynet}/fast-lstm.cc (97%) rename {cnn => dynet}/fast-lstm.h (90%) rename {cnn => dynet}/functors.h (63%) rename {cnn => dynet}/globals.cc (64%) rename {cnn => dynet}/globals.h (62%) rename {cnn => dynet}/gpu-kernels.h (91%) rename {cnn => dynet}/gpu-model.cu (100%) rename {cnn => dynet}/gpu-nodes-contract.cu (100%) rename {cnn => dynet}/gpu-nodes-conv.cu (100%) rename {cnn => dynet}/gpu-nodes.cu (100%) rename {cnn => dynet}/gpu-ops.cu (89%) rename {cnn => dynet}/gpu-ops.h (95%) rename {cnn => dynet}/gpu-param-nodes.cu (100%) rename {cnn => dynet}/gpu-training.cu (100%) rename {cnn => dynet}/grad-check.cc (95%) rename {cnn => dynet}/grad-check.h (63%) rename {cnn => dynet}/graph.cc (86%) create mode 100644 dynet/graph.h rename {cnn => dynet}/gru.cc (97%) rename {cnn => dynet}/gru.h (91%) rename {cnn => dynet}/hsm-builder.cc (97%) rename {cnn => dynet}/hsm-builder.h (92%) rename {cnn => dynet}/init.cc (64%) rename {cnn => dynet}/init.h (59%) rename {cnn => dynet}/io-macros.h (90%) rename {cnn => dynet}/lstm.cc (97%) rename {cnn => dynet}/lstm.h (91%) rename {cnn => dynet}/mem.cc (80%) rename {cnn => dynet}/mem.h (94%) rename {cnn => dynet}/model.cc (93%) rename {cnn => dynet}/model.h (94%) rename {cnn => dynet}/mp.cc (84%) rename {cnn => dynet}/mp.h (97%) rename {cnn => dynet}/nodes-common.cc (99%) rename {cnn => dynet}/nodes-contract.cc (87%) rename {cnn => dynet}/nodes-contract.h (58%) rename {cnn => dynet}/nodes-conv.cc (97%) rename {cnn => dynet}/nodes-conv.h (79%) rename {cnn => dynet}/nodes-macros.h (84%) rename {cnn => dynet}/nodes.cc (96%) rename {cnn => dynet}/nodes.h (89%) rename {cnn => dynet}/param-nodes.cc (94%) rename {cnn => dynet}/param-nodes.h (88%) rename {cnn => dynet}/pretrain.cc (92%) rename {cnn => dynet}/pretrain.h (69%) rename {cnn => dynet}/rnn-state-machine.cc (65%) rename {cnn => dynet}/rnn-state-machine.h (92%) rename {cnn => dynet}/rnn.cc (93%) rename {cnn => dynet}/rnn.h (94%) rename {cnn => dynet}/saxe-init.cc (86%) rename {cnn => dynet}/saxe-init.h (55%) rename {cnn => dynet}/shadow-params.cc (79%) rename {cnn => dynet}/shadow-params.h (89%) rename {cnn => dynet}/simd-functors.h (71%) rename {cnn => dynet}/tensor.cc (95%) rename {cnn => dynet}/tensor.h (97%) rename {cnn => dynet}/timing.h (92%) rename {cnn => dynet}/training.cc (89%) rename {cnn => dynet}/training.h (88%) rename {cnn => dynet}/weight-decay.cc (53%) rename {cnn => dynet}/weight-decay.h (93%) rename tests/{test-cnn.cc => test-dynet.cc} (53%) diff --git a/.gitignore b/.gitignore index d1afdf328..b1235a423 100644 --- a/.gitignore +++ b/.gitignore @@ -1,17 +1,17 @@ # cmake stuff build/ Testing/ -cnn/Testing/ -cnn/tests.bin/ +dynet/Testing/ +dynet/tests.bin/ CTestTestfile.cmake config.h Makefile CMakeCache.txt CMakeFiles cmake_install.cmake -pycnn/pycnn.cpp -pycnn/dist/ -pycnn/pyCNN.egg-info/ +pydynet/pydynet.cpp +pydynet/dist/ +pydynet/pyCNN.egg-info/ # binaries examples/embed-cl diff --git a/CMakeLists.txt b/CMakeLists.txt index 11a129dfe..69f20f2d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,9 +1,9 @@ -project(cnn) +project(dynet) cmake_minimum_required(VERSION 2.8 FATAL_ERROR) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) -# CNN uses Eigen which exploits modern CPU architectures. To get the +# DYNET uses Eigen which exploits modern CPU architectures. To get the # best possible performance, the following are recommended: # 1. use very recent versions of gcc or Clang to build # 2. use very recent versions of Eigen (ideally the dev version) @@ -117,7 +117,7 @@ set(LIBS ${LIBS} ${CMAKE_THREAD_LIBS_INIT}) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) include_directories(${CMAKE_CURRENT_BINARY_DIR}) -add_subdirectory(cnn) +add_subdirectory(dynet) add_subdirectory(tests) add_subdirectory(examples) add_subdirectory(tutorial) diff --git a/MEM.notes b/MEM.notes index e05d571a9..80d197a35 100644 --- a/MEM.notes +++ b/MEM.notes @@ -1,5 +1,5 @@ The code that computes the l2 norm of the gradient is going to need -scratch space on every device that CNN is using that has a parameter. +scratch space on every device that DYNET is using that has a parameter. 1) devices should know whether they have parameters/gradients alignment code is hidden away. it's all hard coded, but it looks like diff --git a/PYINSTALL.md b/PYINSTALL.md index e54240907..1fe12a3cf 100644 --- a/PYINSTALL.md +++ b/PYINSTALL.md @@ -1,25 +1,25 @@ -# Installing the pyCNN module. +# Installing the Python DyNet module. (for instructions on installing on a computer with GPU, see below) -pyCNN is currently only supported under python 2. +Python bindings to DyNet are currently only supported under python 2. -First, get CNN: +First, get DYNET: ```bash cd $HOME -mkdir cnn -git clone https://github.com/clab/cnn.git -cd cnn -git submodule init # To be consistent with CNN's installation instructions. -git submodule update # To be consistent with CNN's installation instructions. +mkdir dynet +git clone https://github.com/clab/dynet.git +cd dynet +git submodule init # To be consistent with DyNet's installation instructions. +git submodule update # To be consistent with DyNet's installation instructions. ``` Then get Eigen: ```bash cd $HOME -cd cnn +cd dynet hg clone https://bitbucket.org/eigen/eigen/ ``` @@ -29,18 +29,18 @@ We also need to make sure the `cython` module is installed. pip install cython ``` -To simplify the following steps, we can set a bash variable to hold where we have saved the main directories of `cnn` and `eigen`. In case you have gotten `ccn` and `eigen` differently from the instructions above and saved them in different location(s), these variables will be helpful: +To simplify the following steps, we can set a bash variable to hold where we have saved the main directories of DyNet and Eigen. In case you have gotten DyNet and Eigen differently from the instructions above and saved them in different location(s), these variables will be helpful: ```bash -PATH_TO_CNN=$HOME/cnn/cnn/ -PATH_TO_EIGEN=$HOME/cnn/eigen/ +PATH_TO_DYNET=$HOME/dynet/dynet/ +PATH_TO_EIGEN=$HOME/dynet/eigen/ ``` -Compile CNN. +Compile DyNet. (modify the code below to point to the correct boost location. Note the addition of the -DPYTHON flag.) ```bash -cd $PATH_TO_CNN +cd $PATH_TO_DYNET PATH_TO_PYTHON=`which python` mkdir build cd build @@ -48,25 +48,25 @@ cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DBOOST_ROOT=$HOME/.local/boost_1_5 make -j 2 ``` -Assuming that the `cmake` command found all the needed libraries and didn't fail, the `make` command will take a while, and compile cnn as well as the python bindings. +Assuming that the `cmake` command found all the needed libraries and didn't fail, the `make` command will take a while, and compile dynet as well as the python bindings. -You now have a working python binding inside of `build/pycnn`. +You now have a working python binding inside of `build/dynet`. To verify this is working: ```bash -cd $PATH_TO_CNN/build/pycnn +cd $PATH_TO_DYNET/build/dynet python ``` then, within python: ```bash -import pycnn as pc +import dynet as pc print pc.__version__ model = pc.Model() ``` In order to install the module so that it is accessible from everywhere, run the following: ```bash -cd $PATH_TO_CNN/build/pycnn +cd $PATH_TO_DYNET/build/dynet python setup.py install --user ``` @@ -74,16 +74,16 @@ python setup.py install --user To install the module to the system site-packages (for all users), run `python setup.py install` without this switch) -You should now have a working python binding (the pycnn module). +You should now have a working python binding (the dynet module). -Note however that the installation relies on the compiled cnn library being in `$PATH_TO_CNN/build/cnn`, +Note however that the installation relies on the compiled dynet library being in `$PATH_TO_DYNET/build/dynet`, so make sure not to move it from there. Now, check that everything works: ```bash # check that it works: -cd $PATH_TO_CNN +cd $PATH_TO_DYNET cd pyexamples python xor.py python rnnlm.py rnnlm.py @@ -91,7 +91,7 @@ python rnnlm.py rnnlm.py Alternatively, if the following script works for you, then your installation is likely to be working: ``` -from pycnn import * +from dynet import * model = Model() ``` @@ -101,11 +101,11 @@ model = Model() For installing on a computer with GPU, first install CUDA. Here, we assume CUDA is installed in `/usr/local/cuda-7.5` -There are two modules, `pycnn` which is the regular CPU module, and `gpycnn` which is the GPU +There are two modules, `dynet` which is the regular CPU module, and `gdynet` which is the GPU module. You can import either of them, these are two independent modules. The GPU support is incomplete: some operations (i.e. `hubber_distance`) are not available for the GPU. -First step is to build the CNN modules. +First step is to build the DyNet modules. Checkout and go to the `build` directory (same instructions as above). Then: To build a CPU version on a computer with CUDA: @@ -122,23 +122,23 @@ make -j 4 Now, build the python modules (as above, we assume cython is installed): -The GPU module (gpycnn): +The GPU module (gdynet): ```bash -cd ../pycnn -make gpycnn.so +cd ../dynet +make gdynet.so make ginstall ``` -The CPU module (pycnn): +The CPU module (dynet): ```bash -cd ../pycnn -make pycnn.so +cd ../dynet +make dynet.so make install ``` Add the following to your env: -`export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PATH_TO_CNN/pycnn` +`export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PATH_TO_DYNET/dynet` -Once both the `pycnn` and `gpycnn` are installed, run `python ../pyexamples/cpu_vs_gpu.py` for a small timing example. +Once both the `dynet` and `gdynet` are installed, run `python ../pyexamples/cpu_vs_gpu.py` for a small timing example. diff --git a/README.md b/README.md index 51d793efd..4bea9ca41 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ -# cnn -C++ neural network library +# DyNet +Dynamic neural network library -cnn is a neural network library that is written in C++ (with bindings in Python). It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. Read the instructions below to get started, and feel free to contact the [cnn-users group](https://groups.google.com/forum/#!forum/cnn-users) group or [github page](http://github.com/clab/cnn) with any questions, issues, or contributions. +DyNet is a neural network library that is written in C++ (with bindings in Python). It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. Read the instructions below to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. ### Building (for how to use the python bindings, see `PYINSTALL.md`) -Before compiling cnn, you need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function. **If you use any of the released versions, you may get assertion failures or compile errors.** +Before compiling DyNet, you need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function. **If you use any of the released versions, you may get assertion failures or compile errors.** In `src`, you need to first use [`cmake`](http://www.cmake.org/) to generate the makefiles @@ -30,12 +30,12 @@ which will train a multilayer perceptron to predict the xor function. ##### Building without Eigen installed If you don't have Eigen installed, the instructions below will fetch and compile -both `Eigen` and `cnn`. Eigen does not have to be compiled, so “installing” it is easy. +both Eigen and DyNet. Eigen does not have to be compiled, so “installing” it is easy. - git clone https://github.com/clab/cnn.git + git clone https://github.com/clab/dynet.git hg clone https://bitbucket.org/eigen/eigen/ - cd cnn/ + cd dynet/ mkdir build cd build cmake .. -DEIGEN3_INCLUDE_DIR=../eigen @@ -43,17 +43,17 @@ both `Eigen` and `cnn`. Eigen does not have to be compiled, so “installing” ##### GPU (CUDA) support -`cnn` supports running programs on GPUs with CUDA. If you have CUDA installed, you -can build cnn with GPU support by adding `-DBACKEND=cuda` to your cmake options. -This will result in two libraries named "libcnn" and "libgcnn" being created. When -you want to run a program on CPU, you can link to the "libcnn" library, and when -you want to run a program on GPU, you can link to the "libgcnn" library. (Eventually +`dynet` supports running programs on GPUs with CUDA. If you have CUDA installed, you +can build DyNet with GPU support by adding `-DBACKEND=cuda` to your cmake options. +This will result in two libraries named "libdynet" and "libgdynet" being created. When +you want to run a program on CPU, you can link to the "libdynet" library, and when +you want to run a program on GPU, you can link to the "libgdynet" library. (Eventually you will be able to use a single library to run on either CPU or GPU, but this is not fully implemented yet.) ##### Non-standard Boost location -`cnn` supports boost, and will find it if it is in the standard location. If boost is +`dynet` supports boost, and will find it if it is in the standard location. If boost is in a non-standard location, say `$HOME/boost`, you can specify the location by adding the following to your cmake options: @@ -65,7 +65,7 @@ directory. #### Building for Windows -CNN has been tested to build in Windows using Microsoft Visual Studio 2015. You may be able to build with MSVC 2013 by slightly modifying the instructions below. +DYNET has been tested to build in Windows using Microsoft Visual Studio 2015. You may be able to build with MSVC 2013 by slightly modifying the instructions below. First, install Eigen following the above instructions. @@ -77,7 +77,7 @@ To generate the MSVC solution and project files, run [cmake](http://www.cmake.or cd build cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64" -This will generate cnn.sln and a bunch of \*.vcxproj files (one for the CNN library, and one per example). You should be able to just open cnn.sln and build all. **Note: multi-process functionality is currently not supported in Windows, so you will not be able to build rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to this project** +This will generate dynet.sln and a bunch of \*.vcxproj files (one for the DYNET library, and one per example). You should be able to just open dynet.sln and build all. **Note: multi-process functionality is currently not supported in Windows, so you will not be able to build rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to this project** #### Debugging build problems @@ -87,20 +87,20 @@ If you want to see the compile commands that are used, you can run ### Command line options -All programs using cnn have a few command line options. These must be specified at the +All programs using DyNet have a few command line options. These must be specified at the very beginning of the command line, before other options. -* `--cnn-mem NUMBER`: cnn runs by default with 512MB of memory each for the forward and +* `--dynet-mem NUMBER`: DyNet runs by default with 512MB of memory each for the forward and backward steps, as well as parameter storage. You will often want to increase this amount. - By setting NUMBER here, cnn will allocate more memory. Note that you can also individually + By setting NUMBER here, DyNet will allocate more memory. Note that you can also individually set the amount of memory for forward calculation, backward calculation, and parameters - by using comma separated variables `--cnn-mem FOR,BACK,PARAM`. This is useful if, for + by using comma separated variables `--dynet-mem FOR,BACK,PARAM`. This is useful if, for example, you are performing testing and don't need to allocate any memory for backward calculation. -* `--cnn-l2 NUMBER`: Specifies the level of l2 regularization to use (default 1e-6). -* `--cnn-gpus NUMBER`: Specify how many GPUs you want to use, if cnn is compiled with CUDA. +* `--dynet-l2 NUMBER`: Specifies the level of l2 regularization to use (default 1e-6). +* `--dynet-gpus NUMBER`: Specify how many GPUs you want to use, if DyNet is compiled with CUDA. Currently, only one GPU is supported. -* `--cnn-gpu-ids X,Y,Z`: Specify the GPUs that you want to use by device ID. Currently only +* `--dynet-gpu-ids X,Y,Z`: Specify the GPUs that you want to use by device ID. Currently only one GPU is supported, but if you use this command you can select which one to use. ### Creating your own models @@ -119,9 +119,9 @@ ComputationGraph cg; Expression W = parameter(cg, mod.add_parameters({1, 3})); // Create variables defining the input and output of the regression, and load them // into the computation graph. Note that we don't need to set concrete values yet. -vector x_values(3); +vector x_values(3); Expression x = input(cg, {3}, &x_values); -cnn::real y_value; +dynet::real y_value; Expression y = input(cg, &y_value); // Next, set up the structure to multiply the input by the weight vector, then run // the output of this through a logistic sigmoid function (logistic regression). @@ -138,7 +138,7 @@ x_values = {0.5, 0.3, 0.7}; y_value = 1.0; // "forward" propagates values forward through the computation graph, and returns // the loss. -cnn::real loss = as_scalar(cg.forward()); +dynet::real loss = as_scalar(cg.forward()); // "backward" performs back-propagation, and accumulates the gradients of the // parameters within the "Model" data structure. cg.backward(); @@ -147,4 +147,4 @@ cg.backward(); sgd.update(1.0); ``` -Note that this very simple example that doesn't cover things like memory initialization, reading/writing models, recurrent/LSTM networks, or adding biases to functions. The best way to get an idea of how to use cnn for real is to look in the `example` directory, particularly starting with the simplest `xor` example. +Note that this very simple example that doesn't cover things like memory initialization, reading/writing models, recurrent/LSTM networks, or adding biases to functions. The best way to get an idea of how to use DyNet for real is to look in the `example` directory, particularly starting with the simplest `xor` example. diff --git a/TODO.cnn b/TODO.cnn deleted file mode 100644 index 2b0308092..000000000 --- a/TODO.cnn +++ /dev/null @@ -1,46 +0,0 @@ -PRIORITIES: - -Multiprocessor/single memory version has to get merged with good, clear examples [cdyer needs to try it out, then work with Austin] - -throughout: instead of aborting, throw a proper exception type (this make's life easier -for Yoav's Python wrapper) [volunteer!!!] - -cnn/init.cc [volunteer!!!] - * This is an unlovely place that every CNN code calls as its first thing - * it should read (and remove) any cnn specific arguments from argc, argv - * add a --help argument - * what should the other arguments do? - - configure memory limits - - possibly enable things like initialization strategies for random variables (this - is not trivial, but worth doing0 - - set rnd seed behavior - - configure GPU nonsense - - configure multiproc/multithread - -tests/ [volunteer!!!] - * speaks for itself - * we need to report very clear, detailed runtime on lots of things. in PARTICULAR: big M-v and M-M products, but also softmax. these should be as close to the "user expr.h API" as possible since we want the these tests to be stable. - * we should have a separate mechanism for testing nodes in isolation, make sure fx can deal with non-zero numbers, make sure dEdxi does the right thing with non-zero numbers (different than fx!). - * we should have one example that calls the fin diff gradient checker on a non-trivial example - * TODO(wammar): test the basic functionality of LSTMs. - -cnn/tensor.* [volunteer!!!] - * big change: start using the CNN multidim tensor library when it makes sense - * almost as big: make it so memory lives in GPU and CPU, and the scheduler will try to do smart things with CPU memory. This will mean the behavior of where memory lives will not be #if CUDA but rather a runtime property of the tensor. this affect all nodes. - -cnn/exec.cc - * parallel execution of nodes (we've got the whole FSCKING graph). problem is, i don't know anything about how to elegantly put work like we've got into a threadpool or whatever it is the low-overhead kids are doing these days. I'd rather not pollute the Node code with this AT ALL. - * more importantly, auto-batching - -cnn/examples/rnnlm.cc - * add real program options to do something nontrivial - * give elegant example of beam search implementation - -cnn/mp.h - * Multi-process is currently disabled for Windows because it uses sys/wait.h and sys/shm.h. Fix this to use boost instead. - -cnn/mem.cc - * SharedAllocator is disabled for Windows (depends on mm_malloc.h). Fix this to use boost instead. - - - diff --git a/cmake/FindCNN.cmake b/cmake/FindDyNet.cmake similarity index 100% rename from cmake/FindCNN.cmake rename to cmake/FindDyNet.cmake diff --git a/cnn/graph.h b/cnn/graph.h deleted file mode 100644 index 53902629d..000000000 --- a/cnn/graph.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef CNN_GRAPH_H -#define CNN_GRAPH_H - -namespace cnn { -struct ComputationGraph; -void graph_optimize(ComputationGraph* cg); -} // namespace cnn - -#endif diff --git a/cnn/tests/test_edges.cc b/cnn/tests/test_edges.cc deleted file mode 100644 index e1b46cfa3..000000000 --- a/cnn/tests/test_edges.cc +++ /dev/null @@ -1,342 +0,0 @@ -#define BOOST_TEST_DYN_LINK -#define BOOST_TEST_MODULE "CNNEdges" -#include - -#include - -#include "cnn/tests/test_utils.h" -#include "cnn/tensor.h" -#include "cnn/edges.h" -#include "cnn/c2w.h" - -using namespace std; -using namespace cnn; - -BOOST_GLOBAL_FIXTURE(TestTensorSetup) - -Dim size(const Tensor& t) { - if (t.cols() > 1) - return Dim(t.rows(), t.cols()); - return Dim(t.rows()); -} - -BOOST_AUTO_TEST_CASE(ESqrL2) -{ - auto U = Ccm({2}, {4,5}); - auto V = Ccm({2}, {1,1}); - cerr << str(U) << endl; - SquaredEuclideanDistance e; - vector xs = {&U, &V}; - Tensor W = e.forward(xs); - cerr << "Norm^2:" << str(W) << endl; - double eps = 1e-5; - BOOST_CHECK_CLOSE(t(W,0),25., eps); - Tensor dEdf = Ccm({1}, {1}); - Tensor d1 = e.backward(xs, W, dEdf, 0); - Tensor d2 = e.backward(xs, W, dEdf, 1); - cerr << d1 << endl; - cerr << d2 << endl; - BOOST_CHECK_CLOSE(t(d1,0), 6., eps); - BOOST_CHECK_CLOSE(t(d1,1), 8., eps); - BOOST_CHECK_CLOSE(t(d2,0), -6., eps); - BOOST_CHECK_CLOSE(t(d2,1), -8., eps); -} - -BOOST_AUTO_TEST_CASE(EMatrixMultiply) { - Tensor U = Ccm({2,3}, {1,2,3,4,5,6}); - Tensor V = Ccm({3,2}, {7,8,9,10,11,12}); - MatrixMultiply mm; - vector xs = {&U, &V}; - Tensor W = mm.forward(xs); - BOOST_REQUIRE_EQUAL(Dim({2,2}),size(W)); - double eps = 1e-5; - BOOST_CHECK_CLOSE(t(W,0,0), 76., eps); - BOOST_CHECK_CLOSE(t(W,1,0), 100., eps); - BOOST_CHECK_CLOSE(t(W,0,1), 103., eps); - BOOST_CHECK_CLOSE(t(W,1,1), 136., eps); - Tensor dEdf = Ccm({2,2}, {-1,0.5,1,2}); - Tensor dEdx0 = mm.backward(xs, W, dEdf, 0); - cerr << str(dEdx0) << endl; - BOOST_CHECK_CLOSE(t(dEdx0,0,0),3.,eps); - BOOST_CHECK_CLOSE(t(dEdx0,0,1),3.,eps); - BOOST_CHECK_CLOSE(t(dEdx0,0,2),3.,eps); - BOOST_CHECK_CLOSE(t(dEdx0,1,0),23.5,eps); - BOOST_CHECK_CLOSE(t(dEdx0,1,1),26.,eps); - BOOST_CHECK_CLOSE(t(dEdx0,1,2),28.5,eps); - Tensor dEdx1 = mm.backward(xs, W, dEdf, 1); - cerr << str(dEdx1) << endl; - BOOST_CHECK_CLOSE(t(dEdx1,0,0),0.,eps); - BOOST_CHECK_CLOSE(t(dEdx1,1,0),-1.,eps); - BOOST_CHECK_CLOSE(t(dEdx1,2,0),-2.,eps); - BOOST_CHECK_CLOSE(t(dEdx1,0,1),5.,eps); - BOOST_CHECK_CLOSE(t(dEdx1,1,1),11.,eps); - BOOST_CHECK_CLOSE(t(dEdx1,2,1),17.,eps); -} - -BOOST_AUTO_TEST_CASE(EColumnConcat) -{ - Tensor u1 = Ccm({2}, {1, 2}); - Tensor u2 = Ccm({2}, {3, 4}); - Tensor u3 = Ccm({2}, {5, 6}); - cerr << u1 << endl; - cerr << u2 << endl; - cerr << u3 << endl; - vector xs = {&u1, &u2, &u3}; - ConcatenateColumns cc; - Tensor U = cc.forward(xs); - cerr << U << endl; - Tensor V = Ccm({3,2}, {7,8,9,10,11,12}); - MatrixMultiply mm; - vector xs2 = {&U, &V}; - Tensor W = mm.forward(xs2); - cerr << W << endl; - cerr << str(W) << endl; - BOOST_REQUIRE_EQUAL(Dim({2,2}),size(W)); - double eps = 1e-5; - BOOST_CHECK_CLOSE(t(W,0,0), 76., eps); - BOOST_CHECK_CLOSE(t(W,1,0), 100., eps); - BOOST_CHECK_CLOSE(t(W,0,1), 103., eps); - BOOST_CHECK_CLOSE(t(W,1,1), 136., eps); - Tensor b1 = cc.backward(xs, U, U, 0); - Tensor b2 = cc.backward(xs, U, U, 1); - Tensor b3 = cc.backward(xs, U, U, 2); - cerr << str(b1) << endl; - cerr << str(b2) << endl; - cerr << str(b3) << endl; - BOOST_CHECK_EQUAL(t(u1,0), t(b1,0)); - BOOST_CHECK_EQUAL(t(u1,1), t(b1,1)); - BOOST_CHECK_EQUAL(t(u2,0), t(b2,0)); - BOOST_CHECK_EQUAL(t(u2,1), t(b2,1)); - BOOST_CHECK_EQUAL(t(u3,0), t(b3,0)); - BOOST_CHECK_EQUAL(t(u3,1), t(b3,1)); -} - -BOOST_AUTO_TEST_CASE(ERowConcat) -{ - Tensor u1 = Ccm({2}, {1, 4}); - Tensor u2 = Ccm({2}, {2, 5}); - Tensor u3 = Ccm({3}, {3, 6, 7}); - cerr << str(u1) << endl; - cerr << str(u2) << endl; - cerr << str(u3) << endl; - vector xs = {&u1, &u2, &u3}; - Concatenate cr; - Tensor U = cr.forward(xs); - cerr << str(U) << endl; - //BOOST_REQUIRE_EQUAL(Dim({7}),size(U)); - double eps = 1e-5; - BOOST_CHECK_CLOSE(t(U,0), 1., eps); - BOOST_CHECK_CLOSE(t(U,1), 4., eps); - BOOST_CHECK_CLOSE(t(U,2), 2., eps); - BOOST_CHECK_CLOSE(t(U,3), 5., eps); - BOOST_CHECK_CLOSE(t(U,4), 3., eps); - BOOST_CHECK_CLOSE(t(U,5), 6., eps); - - Tensor b1 = cr.backward(xs, U, U, 0); - Tensor b2 = cr.backward(xs, U, U, 1); - Tensor b3 = cr.backward(xs, U, U, 2); - cerr << str(b1) << endl; - cerr << str(b2) << endl; - cerr << str(b3) << endl; - BOOST_CHECK_EQUAL(t(u1,0), t(b1,0)); - BOOST_CHECK_EQUAL(t(u1,1), t(b1,1)); - BOOST_CHECK_EQUAL(t(u2,0), t(b2,0)); - BOOST_CHECK_EQUAL(t(u2,1), t(b2,1)); - BOOST_CHECK_EQUAL(t(u3,0), t(b3,0)); - BOOST_CHECK_EQUAL(t(u3,1), t(b3,1)); - BOOST_CHECK_EQUAL(t(u3,2), t(b3,2)); -} - -BOOST_AUTO_TEST_CASE(EMultilinear) { - Tensor b = Ccm({3},{1,2,3}); - Tensor W = Ccm({3,2},{2,4,6,3,5,7}); - Tensor x = Ccm({2},{-1,1}); - Multilinear ml; - vector mlxs = {&b, &W, &x}; - Tensor r1 = ml.forward(mlxs); - Sum se; - MatrixMultiply mm; - Tensor p = mm.forward(vector({&W, &x})); - Tensor r2 = se.forward(vector({&p, &b})); - BOOST_REQUIRE(size(r1) == size(r2)); - double eps = 1e-5; - cerr << r1 << endl; - cerr << r2 << endl; - BOOST_CHECK_CLOSE(t(r1,0), 2., eps); - BOOST_CHECK_CLOSE(t(r1,1), 3., eps); - BOOST_CHECK_CLOSE(t(r1,2), 4., eps); - BOOST_CHECK_CLOSE(t(r2,0), 2., eps); - BOOST_CHECK_CLOSE(t(r2,1), 3., eps); - BOOST_CHECK_CLOSE(t(r2,2), 4., eps); - cerr << "Multilinear forward complete\n"; - Tensor dEdf = Ccm({3}, {1., 0.5, 0.25}); - Tensor dEdx = ml.backward(mlxs, r1, dEdf, 0); - cerr << "BACK 0:\n"; - BOOST_CHECK(size(dEdx) == size(b)); - cerr << str(dEdx) << endl; - BOOST_CHECK_CLOSE(t(dEdx,0), 1., eps); - BOOST_CHECK_CLOSE(t(dEdx,1), 0.5, eps); - BOOST_CHECK_CLOSE(t(dEdx,2), 0.25, eps); - dEdx = ml.backward(mlxs, r1, dEdf, 1); - cerr << "BACK 1:\n"; - BOOST_CHECK(size(dEdx) == size(W)); - cerr << str(dEdx) << endl; - BOOST_CHECK_CLOSE(t(dEdx,0,0), -1., eps); - BOOST_CHECK_CLOSE(t(dEdx,1,0), -0.5, eps); - BOOST_CHECK_CLOSE(t(dEdx,2,0), -0.25, eps); - BOOST_CHECK_CLOSE(t(dEdx,0,1), 1., eps); - BOOST_CHECK_CLOSE(t(dEdx,1,1), 0.5, eps); - BOOST_CHECK_CLOSE(t(dEdx,2,1), 0.25, eps); - dEdx = ml.backward(mlxs, r1, dEdf, 2); - cerr << "BACK 2:\n"; - BOOST_CHECK(size(dEdx) == size(x)); - cerr << str(dEdx) << endl; - BOOST_CHECK_CLOSE(t(dEdx,0), 5.5, eps); - BOOST_CHECK_CLOSE(t(dEdx,1), 7.25, eps); -} - -BOOST_AUTO_TEST_CASE(ELogisticSigmoid) { - Tensor x = Ccm({5,1},{-6.f,-logf(3),0.f,logf(3),6.f}); - LogisticSigmoid ls; - vector xs = {&x}; - Tensor r = ls.forward(xs); - BOOST_REQUIRE_EQUAL(size(r), size(x)); - double eps = 1e-2; - BOOST_CHECK_CLOSE(t(r,0,0), 1. /(1. + exp(6.)), eps); - BOOST_CHECK_CLOSE(t(r,1,0), 0.25, eps); - BOOST_CHECK_CLOSE(t(r,2,0), 0.5, eps); - BOOST_CHECK_CLOSE(t(r,3,0), 0.75, eps); - BOOST_CHECK_CLOSE(t(r,4,0), 1. - t(r,0,0), eps); - cerr << "HERE\n"; - cerr << str(r) << endl; - Tensor dEdf = Ccm({5,1},{1.,1.,1.,1.,1.}); - Tensor dEdx = ls.backward(xs, r, dEdf, 0); - BOOST_CHECK_CLOSE(t(dEdx,1,0), 0.1875, eps); - BOOST_CHECK_CLOSE(t(dEdx,2,0), 0.25, eps); - BOOST_CHECK_CLOSE(t(dEdx,3,0), t(dEdx,1,0), eps); - BOOST_CHECK_CLOSE(t(dEdx,4,0), t(dEdx,0,0), eps); -} - -BOOST_AUTO_TEST_CASE(ETanh) { - Tensor x = Ccm({5,1},{-6.f,-logf(3),0.f,logf(3),6.f}); - Tanh th; - vector xs = {&x}; - Tensor r = th.forward(xs); - BOOST_REQUIRE(size(r) == size(x)); - double eps = 1e-2; - BOOST_CHECK_CLOSE(t(r,1,0), -0.8, eps); - BOOST_CHECK_CLOSE(t(r,2,0), 0, eps); - BOOST_CHECK_CLOSE(t(r,3,0), 0.8, eps); - BOOST_CHECK_CLOSE(t(r,4,0), -t(r,0,0), eps); - Tensor dEdf = Ccm({5,1},{1.,1.,1.,1.,1.}); - cerr << "Tanh complete forward\n"; - Tensor dEdx = th.backward(xs, r, dEdf, 0); - BOOST_CHECK_CLOSE(t(dEdx,1,0), 0.36, eps); - BOOST_CHECK_CLOSE(t(dEdx,2,0), 1.0, eps); - BOOST_CHECK_CLOSE(t(dEdx,3,0), t(dEdx,1,0), eps); - BOOST_CHECK_CLOSE(t(dEdx,4,0), t(dEdx,0,0), eps); -} - -BOOST_AUTO_TEST_CASE(MatrixVector) { - cerr << "Matrix-Vector\n"; - Tensor W = Ccm({3,2},{2,4,6,3,5,7}); - Tensor x = Ccm({2},{-1,1}); - MatrixMultiply mm; - vector xs = {&W, &x}; - Tensor fx = mm.forward(xs); - cerr << str(fx) << endl; - Tensor dEdf = Ccm({3},{-.5,0.25,5}); - Tensor M = mm.backward(xs, fx, dEdf, 0); - cerr << "Diff with respect to W:\n"; - cerr << str(M) << endl; - double eps = 1e-5; - BOOST_CHECK_CLOSE(t(M,0,0), 0.5, eps); - BOOST_CHECK_CLOSE(t(M,1,0), -0.25, eps); - BOOST_CHECK_CLOSE(t(M,2,0), -5, eps); - BOOST_CHECK_CLOSE(t(M,0,1), -0.5, eps); - BOOST_CHECK_CLOSE(t(M,1,1), 0.25, eps); - BOOST_CHECK_CLOSE(t(M,2,1), 5, eps); - Tensor vv = mm.backward(xs, fx, dEdf, 1); - cerr << "Diff with respect to x:\n"; - cerr << str(vv) << endl; - BOOST_CHECK_CLOSE(t(vv,0), 30., eps); - BOOST_CHECK_CLOSE(t(vv,1), 34.75, eps); -} - -BOOST_AUTO_TEST_CASE(EConstantMinus) { - Tensor W = Ccm({2,2},{1,2,3,-4}); - ConstantMinusX om(1); - vector xs(1, &W); - Tensor O = om.forward(xs); - cerr << str(W) << endl; - cerr << str(O) << endl; - double eps = 1e-6; - BOOST_CHECK_CLOSE(10 + 1 - t(W,0,0), 10 + t(O,0,0), eps); - BOOST_CHECK_CLOSE(10 + 1 - t(W,0,1), 10 + t(O,0,1), eps); - BOOST_CHECK_CLOSE(10 + 1 - t(W,1,0), 10 + t(O,1,0), eps); - BOOST_CHECK_CLOSE(10 + 1 - t(W,1,1), 10 + t(O,1,1), eps); - Tensor V = -W; - cerr << str(W) << endl; - cerr << str(V) << endl; -} - -BOOST_AUTO_TEST_CASE(ESoftmaxUnif) { - for (float v = -12.; v < 12.; v += 1.) { - Tensor u = Ccm({4}, {v, v, v, v}); - Softmax sm; - vector xs = {&u}; - Tensor m = sm.forward(xs); - BOOST_REQUIRE_EQUAL(Dim({4}),size(m)); - double eps = 1e-5; - for (unsigned i = 0; i < 4; ++i) - BOOST_CHECK_CLOSE(t(m, i), 0.25, eps); - Tensor dEdf = Ccm({4}, {1., 0., 0., 0.}); - Tensor d = sm.backward(xs, m, dEdf, 0); - BOOST_CHECK_CLOSE(t(d,0), 0.1875, eps); - BOOST_CHECK_CLOSE(t(d,1), -0.0625, eps); - BOOST_CHECK_CLOSE(t(d,2), -0.0625, eps); - BOOST_CHECK_CLOSE(t(d,3), -0.0625, eps); -// cerr << d << endl; - - LogSoftmax lsm; - Tensor lm = lsm.forward(xs); - BOOST_REQUIRE_EQUAL(Dim({4}),size(lm)); - for (unsigned i = 0; i < 4; ++i) - BOOST_CHECK_CLOSE(log(t(m, i)), t(lm, i), eps); - Tensor b = lsm.backward(xs, lm, dEdf, 0); - BOOST_CHECK_CLOSE(t(b, 0), 0.75, eps); - BOOST_CHECK_CLOSE(t(b, 1), -0.25, eps); - BOOST_CHECK_CLOSE(t(b, 2), -0.25, eps); - BOOST_CHECK_CLOSE(t(b, 3), -0.25, eps); - } -} - -#ifdef WITH_THPP_BACKEND -BOOST_AUTO_TEST_CASE(TensorInner3D_1D) { - Tensor A = Ccm({24}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23}); - A.reshape(A, {2,3,4}); - Tensor v = Ccm({4}, {-0.5, 1, 1.5, 2}); - Tensor B = Ccm({2,3}, {1, 2, 3, 4, 5, 6}); - vector xs = {&A, &v, &B}; - InnerProduct3D_1D e; - Tensor Y = e.forward(xs); - cerr << str(Y) << endl; - double eps = 1e-5; - BOOST_CHECK_CLOSE(t(Y, 0, 0), 11, eps); - BOOST_CHECK_CLOSE(t(Y, 1, 0), 60, eps); - BOOST_CHECK_CLOSE(t(Y, 0, 1), 29, eps); - BOOST_CHECK_CLOSE(t(Y, 1, 1), 78, eps); - BOOST_CHECK_CLOSE(t(Y, 0, 2), 47, eps); - BOOST_CHECK_CLOSE(t(Y, 1, 2), 96, eps); - Tensor dEdY = Ccm({2,3}, {1, 0.1, -1, 1.2, 2, -0.25}); - Tensor dEdx3 = e.backward(xs, Y, dEdY, 2); - cerr << str(dEdY) << endl; - cerr << str(dEdx3) << endl; - Tensor dEdx1 = e.backward(xs, Y, dEdY, 0); - cerr << dEdx1 << endl; - //cerr << str(dEdx1) << endl; - Tensor dEdx2 = e.backward(xs, Y, dEdY, 1); - cerr << str(dEdx2) << endl; -} -#endif - diff --git a/cnn/tests/test_init.cc b/cnn/tests/test_init.cc deleted file mode 100644 index 1a436af84..000000000 --- a/cnn/tests/test_init.cc +++ /dev/null @@ -1,63 +0,0 @@ -#define BOOST_TEST_DYN_LINK -#define BOOST_TEST_MODULE "CNNInit" -#include - -#include - -#include "cnn/tests/test_utils.h" -#include "cnn/tensor.h" -#include "cnn/saxe-init.h" - -using namespace std; -using namespace cnn; - -BOOST_GLOBAL_FIXTURE(TestTensorSetup) - -BOOST_AUTO_TEST_CASE(EOrthonormalRandom) -{ - for (int d = 4; d < 128; d += 2) { - Tensor Q = OrthonormalRandom(d, 1.0); -// BOOST_REQUIRE_EQUAL(size(Q), Dim({d,d})); - - // check that this is actually returning orthogonal matrices -#if MINERVA_BACKEND - Tensor I = Q.Trans() * Q; -#endif -#if THPP_BACKEND - Tensor QT = Q; - QT.transpose(); - //cerr << str(Q) << endl << str(QT) << endl; - Tensor I = Zero({d,d}); - I.addmm(0, 1, Q, QT); - //cerr << str(I) << endl; -#endif -#if EIGEN_BACKEND - Tensor I = Q.transpose() * Q; -#endif - double eps = 1e-1; - for (int i = 0; i < d; ++i) - for (int j = 0; j < d; ++j) - BOOST_CHECK_CLOSE(t(I,i,j) + 1., (i == j ? 2. : 1.), eps); - } - cerr << "Finished\n"; -} - -BOOST_AUTO_TEST_CASE(BernoulliInit) { - Tensor r = RandomBernoulli(Dim({1000,1000}), 0.5f); - int tot = 0; - for (int i = 0; i < 1000; ++i) - for (int j = 0; j < 1000; ++j) - if (t(r,i,j)) ++tot; - BOOST_CHECK_GT(tot, 490000); - BOOST_CHECK_LT(tot, 510000); -} - -BOOST_AUTO_TEST_CASE(Rand01) { - cnn::real tot = 0; - for (unsigned i = 0; i < 1000000; ++i) - tot += cnn::rand01(); - BOOST_CHECK_GT(tot, 490000.); - BOOST_CHECK_LT(tot, 510000.); -} - - diff --git a/cnn/tests/test_utils.h b/cnn/tests/test_utils.h deleted file mode 100644 index 2fdbce9d7..000000000 --- a/cnn/tests/test_utils.h +++ /dev/null @@ -1,79 +0,0 @@ -#ifndef CNN_TEST_UTILS_H_ -#define CNN_TEST_UTILS_H_ - -#include "cnn/tensor.h" - -namespace cnn { - -#if WITH_MINERVA_BACKEND - -struct TestTensorSetup { - TestTensorSetup() { - int argc = 1; - char* foo = "foo"; - char** argv = {&foo}; - minerva::MinervaSystem::Initialize(&argc, &argv); -#if HAS_CUDA - minerva::MinervaSystem::Instance().device_manager().CreateGpuDevice(0); -#else - minerva::MinervaSystem::Instance().device_manager().CreateCpuDevice(); -#endif - } -}; - -double t(const Tensor& T, unsigned i, unsigned j) { - int m = T.Size(0); - return T.Get().get()[j * m + i]; -} - -std::ostream& operator<<(std::ostream& os, const Tensor& T) { - if (T.Size().NumDims() == 2) { - int m = T.Size(0); - int n = T.Size(1); - for (int i = 0; i < m; ++i) { - for (int j = 0; j < n; ++j) { - os << '\t' << t(T,i,j); - } - os << std::endl; - } - return os; - } else { - os << T.Size() << ": "; - minerva::FileFormat ff; ff.binary = false; - T.ToStream(os, ff); - return os; - } -} - -#else - -struct TestTensorSetup { - TestTensorSetup() { - int argc = 1; - char* p = "foo"; - char** argv = {&p}; - cnn::Initialize(argc, argv); - } -}; - -double t(const Tensor& T, unsigned i, unsigned j) { -#if WITH_THPP_BACKEND - return T.at({i,j}); -#else - return T(i, j); -#endif -} - -double t(const Tensor& T, unsigned i) { -#if WITH_THPP_BACKEND - return T.at({i}); -#else - return T(i, 0); -#endif -} - -#endif - -} // namespace cnn - -#endif diff --git a/config.h.cmake b/config.h.cmake index 2fa96e11d..3b73020b2 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -1,5 +1,5 @@ -#ifndef CNN_CONFIG_H_ -#define CNN_CONFIG_H_ +#ifndef DYNET_CONFIG_H_ +#define DYNET_CONFIG_H_ #cmakedefine WITH_MINERVA_BACKEND @WITH_MINERVA_BACKEND@ #cmakedefine WITH_THPP_BACKEND @WITH_THPP_BACKEND@ diff --git a/cnn/CMakeLists.txt b/dynet/CMakeLists.txt similarity index 73% rename from cnn/CMakeLists.txt rename to dynet/CMakeLists.txt index 952852cc8..1887e32a5 100644 --- a/cnn/CMakeLists.txt +++ b/dynet/CMakeLists.txt @@ -1,8 +1,8 @@ -# ########## cnn library ########## +# ########## dynet library ########## # Sources: -set(cnn_library_SRCS +set(dynet_library_SRCS cfsm-builder.cc - cnn.cc + dynet.cc deep-lstm.cc devices.cc dict.cc @@ -36,11 +36,11 @@ set(cnn_library_SRCS ) # Headers: -set(cnn_library_HDRS +set(dynet_library_HDRS aligned-mem-pool.h cfsm-builder.h c2w.h - cnn.h + dynet.h cuda.h devices.h dict.h @@ -85,7 +85,7 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) # add_executable(${testName} ${test_src}) #link to Boost libraries AND your targets and dependencies -# target_link_libraries(${testName} cnn ${LIBS}) +# target_link_libraries(${testName} dynet ${LIBS}) # set_target_properties(${testName} PROPERTIES # RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests.bin) @@ -98,27 +98,27 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) #endforeach(test_src) # Build cpu library -add_library(cnn SHARED ${cnn_library_SRCS} ${cnn_library_HDRS}) -target_link_libraries(cnn ${LIBS}) +add_library(dynet SHARED ${dynet_library_SRCS} ${dynet_library_HDRS}) +target_link_libraries(dynet ${LIBS}) if(WITH_CUDA_BACKEND) # Build main gpu library - list(APPEND cnn_library_SRCS cuda.cc) - add_library(gcnn SHARED ${cnn_library_SRCS} ${cnn_library_HDRS}) - target_link_libraries(gcnn ${LIBS}) - set_target_properties(gcnn PROPERTIES + list(APPEND dynet_library_SRCS cuda.cc) + add_library(gdynet SHARED ${dynet_library_SRCS} ${dynet_library_HDRS}) + target_link_libraries(gdynet ${LIBS}) + set_target_properties(gdynet PROPERTIES COMPILE_DEFINITIONS HAVE_CUDA) # Build nvcc-compiled gpu library set(CUDA_SEPARABLE_COMPILATION ON) list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU;-DHAVE_CUDA") SET(CUDA_PROPAGATE_HOST_FLAGS OFF) - cuda_add_library(cnncuda SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu OPTIONS --compiler-options "-fPIC") + cuda_add_library(dynetcuda SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu OPTIONS --compiler-options "-fPIC") endif(WITH_CUDA_BACKEND) -install(FILES ${cnn_library_HDRS} DESTINATION include/cnn) -install(TARGETS cnn DESTINATION lib) +install(FILES ${dynet_library_HDRS} DESTINATION include/dynet) +install(TARGETS dynet DESTINATION lib) if(WITH_CUDA_BACKEND) - install(TARGETS gcnn DESTINATION lib) + install(TARGETS gdynet DESTINATION lib) endif(WITH_CUDA_BACKEND) -# target_compile_features(cnn PRIVATE cxx_range_for) +# target_compile_features(dynet PRIVATE cxx_range_for) diff --git a/cnn/aligned-mem-pool.cc b/dynet/aligned-mem-pool.cc similarity index 100% rename from cnn/aligned-mem-pool.cc rename to dynet/aligned-mem-pool.cc diff --git a/cnn/aligned-mem-pool.h b/dynet/aligned-mem-pool.h similarity index 80% rename from cnn/aligned-mem-pool.h rename to dynet/aligned-mem-pool.h index fad285742..4388f0897 100644 --- a/cnn/aligned-mem-pool.h +++ b/dynet/aligned-mem-pool.h @@ -1,10 +1,10 @@ -#ifndef CNN_ALIGNED_MEM_POOL_H -#define CNN_ALIGNED_MEM_POOL_H +#ifndef DYNET_ALIGNED_MEM_POOL_H +#define DYNET_ALIGNED_MEM_POOL_H #include -#include "cnn/mem.h" +#include "dynet/mem.h" -namespace cnn { +namespace dynet { class AlignedMemoryPool { public: @@ -16,7 +16,7 @@ class AlignedMemoryPool { void* allocate(size_t n) { auto rounded_n = a->round_up_align(n); if (rounded_n + used > capacity) { - std::cerr << "cnn is out of memory, try increasing with --cnn-mem (current capacity: " << capacity << ")\n"; + std::cerr << "dynet is out of memory, try increasing with --dynet-mem (current capacity: " << capacity << ")\n"; abort(); } void* res = static_cast(mem) + used; @@ -50,6 +50,6 @@ class AlignedMemoryPool { void* mem; }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/c2w.h b/dynet/c2w.h similarity index 91% rename from cnn/c2w.h rename to dynet/c2w.h index e7b31c376..8eab5afb7 100644 --- a/cnn/c2w.h +++ b/dynet/c2w.h @@ -1,14 +1,14 @@ -#ifndef CNN_C2W_H_ -#define CNN_C2W_H_ +#ifndef DYNET_C2W_H_ +#define DYNET_C2W_H_ #include #include -#include "cnn/cnn.h" -#include "cnn/model.h" -#include "cnn/lstm.h" +#include "dynet/dynet.h" +#include "dynet/model.h" +#include "dynet/lstm.h" -namespace cnn { +namespace dynet { // computes a representation of a word by reading characters // one at a time @@ -56,6 +56,6 @@ struct C2WBuilder { } }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/cfsm-builder.cc b/dynet/cfsm-builder.cc similarity index 95% rename from cnn/cfsm-builder.cc rename to dynet/cfsm-builder.cc index 15512d2af..ef8058750 100644 --- a/cnn/cfsm-builder.cc +++ b/dynet/cfsm-builder.cc @@ -1,15 +1,15 @@ -#include "cnn/cfsm-builder.h" +#include "dynet/cfsm-builder.h" #include #include #include -#include "cnn/io-macros.h" +#include "dynet/io-macros.h" using namespace std; -namespace cnn { +namespace dynet { using namespace expr; @@ -60,7 +60,7 @@ void StandardSoftmaxBuilder::serialize(Archive& ar, const unsigned int) { ar & p_w; ar & p_b; } -CNN_SERIALIZE_IMPL(StandardSoftmaxBuilder) +DYNET_SERIALIZE_IMPL(StandardSoftmaxBuilder) ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder() {} @@ -233,9 +233,9 @@ void ClassFactoredSoftmaxBuilder::serialize(Archive& ar, const unsigned int) { ar & p_rc2ws; ar & p_rcwbiases; } -CNN_SERIALIZE_IMPL(ClassFactoredSoftmaxBuilder) +DYNET_SERIALIZE_IMPL(ClassFactoredSoftmaxBuilder) -} // namespace cnn +} // namespace dynet -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::StandardSoftmaxBuilder) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ClassFactoredSoftmaxBuilder) +BOOST_CLASS_EXPORT_IMPLEMENT(dynet::StandardSoftmaxBuilder) +BOOST_CLASS_EXPORT_IMPLEMENT(dynet::ClassFactoredSoftmaxBuilder) diff --git a/cnn/cfsm-builder.h b/dynet/cfsm-builder.h similarity index 92% rename from cnn/cfsm-builder.h rename to dynet/cfsm-builder.h index a0401ec38..90cd85994 100644 --- a/cnn/cfsm-builder.h +++ b/dynet/cfsm-builder.h @@ -1,14 +1,14 @@ -#ifndef CNN_CFSMBUILDER_H -#define CNN_CFSMBUILDER_H +#ifndef DYNET_CFSMBUILDER_H +#define DYNET_CFSMBUILDER_H #include #include -#include "cnn/cnn.h" -#include "cnn/expr.h" -#include "cnn/dict.h" +#include "dynet/dynet.h" +#include "dynet/expr.h" +#include "dynet/dict.h" -namespace cnn { +namespace dynet { class SoftmaxBuilder { public: @@ -107,9 +107,9 @@ class ClassFactoredSoftmaxBuilder : public SoftmaxBuilder { template void serialize(Archive& ar, const unsigned int); }; -} // namespace cnn +} // namespace dynet -BOOST_CLASS_EXPORT_KEY(cnn::StandardSoftmaxBuilder) -BOOST_CLASS_EXPORT_KEY(cnn::ClassFactoredSoftmaxBuilder) +BOOST_CLASS_EXPORT_KEY(dynet::StandardSoftmaxBuilder) +BOOST_CLASS_EXPORT_KEY(dynet::ClassFactoredSoftmaxBuilder) #endif diff --git a/cnn/cuda.cc b/dynet/cuda.cc similarity index 66% rename from cnn/cuda.cc rename to dynet/cuda.cc index b5b77c2dd..c29c5c329 100644 --- a/cnn/cuda.cc +++ b/dynet/cuda.cc @@ -2,12 +2,12 @@ #include #include -#include "cnn/cnn.h" -#include "cnn/cuda.h" +#include "dynet/dynet.h" +#include "dynet/cuda.h" using namespace std; -namespace cnn { +namespace dynet { static void remove_args(int& argc, char**& argv, int& argi, int n) { for (int i = argi + n; i < argc; ++i) @@ -22,8 +22,8 @@ vector initialize_gpu(int& argc, char**& argv) { int nDevices; CUDA_CHECK(cudaGetDeviceCount(&nDevices)); if (nDevices < 1) { - cerr << "[cnn] No GPUs found, recompile without DENABLE_CUDA=1\n"; - throw std::runtime_error("No GPUs found but CNN compiled with CUDA support."); + cerr << "[dynet] No GPUs found, recompile without DENABLE_CUDA=1\n"; + throw std::runtime_error("No GPUs found but DYNET compiled with CUDA support."); } // logic: no flags, you get 1 GPU // or you request a certain number of GPUs explicitly @@ -36,44 +36,44 @@ vector initialize_gpu(int& argc, char**& argv) { bool ids_requested = false; for( ;argi < argc; ++argi) { string arg = argv[argi]; - if (arg == "--cnn-mem" || arg == "--cnn_mem") { + if (arg == "--dynet-mem" || arg == "--dynet_mem") { if ((argi + 1) > argc) { - cerr << "[cnn] --cnn-mem expects an argument (the memory, in megabytes, to reserve)\n"; + cerr << "[dynet] --dynet-mem expects an argument (the memory, in megabytes, to reserve)\n"; abort(); } else { mem_descriptor = argv[argi+1]; remove_args(argc, argv, argi, 2); } - } else if (arg == "--cnn_gpus" || arg == "--cnn-gpus") { + } else if (arg == "--dynet_gpus" || arg == "--dynet-gpus") { if ((argi + 1) > argc) { - cerr << "[cnn] --cnn-gpus expects an argument (number of GPUs to use)\n"; + cerr << "[dynet] --dynet-gpus expects an argument (number of GPUs to use)\n"; abort(); } else { if (ngpus_requested) { - cerr << "Multiple instances of --cnn-gpus" << endl; abort(); + cerr << "Multiple instances of --dynet-gpus" << endl; abort(); } ngpus_requested = true; string a2 = argv[argi+1]; istringstream c(a2); c >> requested_gpus; remove_args(argc, argv, argi, 2); } - } else if (arg == "--cnn_gpu_ids" || arg == "--cnn-gpu-ids") { + } else if (arg == "--dynet_gpu_ids" || arg == "--dynet-gpu-ids") { if ((argi + 1) > argc) { - cerr << "[cnn] --cnn-gpu-ids expects an argument (comma separated list of physical GPU ids to use)\n"; + cerr << "[dynet] --dynet-gpu-ids expects an argument (comma separated list of physical GPU ids to use)\n"; abort(); } else { string a2 = argv[argi+1]; if (ids_requested) { - cerr << "Multiple instances of --cnn-gpu-ids" << endl; abort(); + cerr << "Multiple instances of --dynet-gpu-ids" << endl; abort(); } ids_requested = true; if (a2.size() % 2 != 1) { - cerr << "Bad argument to --cnn-gpu-ids: " << a2 << endl; abort(); + cerr << "Bad argument to --dynet-gpu-ids: " << a2 << endl; abort(); } for (unsigned i = 0; i < a2.size(); ++i) { if ((i % 2 == 0 && (a2[i] < '0' || a2[i] > '9')) || (i % 2 == 1 && a2[i] != ',')) { - cerr << "Bad argument to --cnn-gpu-ids: " << a2 << endl; abort(); + cerr << "Bad argument to --dynet-gpu-ids: " << a2 << endl; abort(); } if (i % 2 == 0) { int gpu_id = a2[i] - '0'; @@ -85,7 +85,7 @@ vector initialize_gpu(int& argc, char**& argv) { gpu_mask[gpu_id]++; requested_gpus++; if (gpu_mask[gpu_id] != 1) { - cerr << "Bad argument to --cnn-gpu-ids: " << a2 << endl; abort(); + cerr << "Bad argument to --dynet-gpu-ids: " << a2 << endl; abort(); } } } @@ -94,7 +94,7 @@ vector initialize_gpu(int& argc, char**& argv) { } } if (ids_requested && ngpus_requested) { - cerr << "Use only --cnn_gpus or --cnn_gpu_ids, not both\n"; + cerr << "Use only --dynet_gpus or --dynet_gpu_ids, not both\n"; abort(); } if (ngpus_requested || requested_gpus == -1) { @@ -103,7 +103,7 @@ vector initialize_gpu(int& argc, char**& argv) { for (int i = 0; i < MAX_GPUS; ++i) gpu_mask[i] = 1; } else if (ids_requested) { requested_gpus++; - cerr << "[cnn] Request for " << requested_gpus << " specific GPU" << (requested_gpus == 1 ? "" : "s") << " ...\n"; + cerr << "[dynet] Request for " << requested_gpus << " specific GPU" << (requested_gpus == 1 ? "" : "s") << " ...\n"; } vector gpudevices; @@ -126,23 +126,23 @@ vector initialize_gpu(int& argc, char**& argv) { if (!gpu_mask[i]) continue; cudaDeviceProp prop; CUDA_CHECK(cudaGetDeviceProperties(&prop, i)); - cerr << "[cnn] Device Number: " << i << endl; - cerr << "[cnn] Device name: " << prop.name << endl; - cerr << "[cnn] Memory Clock Rate (KHz): " << prop.memoryClockRate << endl; - cerr << "[cnn] Memory Bus Width (bits): " << prop.memoryBusWidth << endl; - cerr << "[cnn] Peak Memory Bandwidth (GB/s): " << (2.0*prop.memoryClockRate*(prop.memoryBusWidth/8)/1.0e6) << endl; + cerr << "[dynet] Device Number: " << i << endl; + cerr << "[dynet] Device name: " << prop.name << endl; + cerr << "[dynet] Memory Clock Rate (KHz): " << prop.memoryClockRate << endl; + cerr << "[dynet] Memory Bus Width (bits): " << prop.memoryBusWidth << endl; + cerr << "[dynet] Peak Memory Bandwidth (GB/s): " << (2.0*prop.memoryClockRate*(prop.memoryBusWidth/8)/1.0e6) << endl; if (!prop.unifiedAddressing) { - cerr << "[cnn] GPU does not support unified addressing.\n"; + cerr << "[dynet] GPU does not support unified addressing.\n"; abort(); } CUDA_CHECK(cudaSetDevice(i)); try { CUDA_CHECK(cudaMemGetInfo( &free_bytes, &total_bytes )); - cerr << "[cnn] Memory Free (GB): " << free_bytes/1.0e9 << "/" << total_bytes/1.0e9 << endl; - cerr << "[cnn]" << endl; + cerr << "[dynet] Memory Free (GB): " << free_bytes/1.0e9 << "/" << total_bytes/1.0e9 << endl; + cerr << "[dynet]" << endl; gpu_free_mem[i] = free_bytes; - } catch(cnn::cuda_exception e) { - cerr << "[cnn] FAILED to get free memory" << endl; + } catch(dynet::cuda_exception e) { + cerr << "[dynet] FAILED to get free memory" << endl; gpu_free_mem[i] = 0; cudaGetLastError(); } @@ -150,7 +150,7 @@ vector initialize_gpu(int& argc, char**& argv) { } stable_sort(gpus.begin(), gpus.end(), [&](int a, int b) -> bool { return gpu_free_mem[a] > gpu_free_mem[b]; }); gpus.resize(requested_gpus); - cerr << "[cnn] Device(s) selected:"; + cerr << "[dynet] Device(s) selected:"; for (int i = 0; i < requested_gpus; ++i) { cerr << ' ' << gpus[i]; Device* d = new Device_GPU(gpudevices.size(), mem_descriptor, gpus[i]); @@ -161,4 +161,4 @@ vector initialize_gpu(int& argc, char**& argv) { return gpudevices; } -} // namespace cnn +} // namespace dynet diff --git a/cnn/cuda.h b/dynet/cuda.h similarity index 85% rename from cnn/cuda.h rename to dynet/cuda.h index 00f0785ab..b554ae124 100644 --- a/cnn/cuda.h +++ b/dynet/cuda.h @@ -1,5 +1,5 @@ -#ifndef CNN_CUDA_H -#define CNN_CUDA_H +#ifndef DYNET_CUDA_H +#define DYNET_CUDA_H #if HAVE_CUDA #include @@ -10,14 +10,14 @@ #include #include -#include "cnn/except.h" +#include "dynet/except.h" #define CUDA_CHECK(stmt) do { \ cudaError_t err = stmt; \ if (err != cudaSuccess) { \ std::cerr << "CUDA failure in " << #stmt << std::endl\ << cudaGetErrorString(err) << std::endl; \ - throw cnn::cuda_exception(#stmt); \ + throw dynet::cuda_exception(#stmt); \ } \ } while(0) @@ -26,11 +26,11 @@ if (stat != CUBLAS_STATUS_SUCCESS) { \ std::cerr << "CUBLAS failure in " << #stmt \ << std::endl << stat << std::endl; \ - throw cnn::cuda_exception(#stmt); \ + throw dynet::cuda_exception(#stmt); \ } \ } while(0) -namespace cnn { +namespace dynet { class Device; @@ -50,7 +50,7 @@ inline std::pair SizeToBlockThreadPair(int n) { std::vector initialize_gpu(int& argc, char**& argv); -} // namespace cnn +} // namespace dynet #endif #endif diff --git a/cnn/deep-lstm.cc b/dynet/deep-lstm.cc similarity index 97% rename from cnn/deep-lstm.cc rename to dynet/deep-lstm.cc index acc2ec0fb..49d610656 100644 --- a/cnn/deep-lstm.cc +++ b/dynet/deep-lstm.cc @@ -1,16 +1,16 @@ -#include "cnn/deep-lstm.h" +#include "dynet/deep-lstm.h" #include #include #include #include -#include "cnn/nodes.h" +#include "dynet/nodes.h" using namespace std; -using namespace cnn::expr; +using namespace dynet::expr; -namespace cnn { +namespace dynet { enum { X2I, H2I, C2I, BI, X2O, H2O, C2O, BO, X2C, H2C, BC }; @@ -159,4 +159,4 @@ Expression DeepLSTMBuilder::add_input_impl(int prev, const Expression& x) { return ot; } -} // namespace cnn +} // namespace dynet diff --git a/cnn/deep-lstm.h b/dynet/deep-lstm.h similarity index 87% rename from cnn/deep-lstm.h rename to dynet/deep-lstm.h index b15968bec..3851f4082 100644 --- a/cnn/deep-lstm.h +++ b/dynet/deep-lstm.h @@ -1,13 +1,13 @@ -#ifndef CNN_DEEP_LSTM_H_ -#define CNN_DEEP_LSTM_H_ +#ifndef DYNET_DEEP_LSTM_H_ +#define DYNET_DEEP_LSTM_H_ -#include "cnn/cnn.h" -#include "cnn/rnn.h" -#include "cnn/expr.h" +#include "dynet/dynet.h" +#include "dynet/rnn.h" +#include "dynet/expr.h" -using namespace cnn::expr; +using namespace dynet::expr; -namespace cnn { +namespace dynet { class Model; @@ -49,6 +49,6 @@ struct DeepLSTMBuilder : public RNNBuilder { unsigned layers; }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/devices.cc b/dynet/devices.cc similarity index 96% rename from cnn/devices.cc rename to dynet/devices.cc index 5bdf512dc..8d7f6e9ff 100644 --- a/cnn/devices.cc +++ b/dynet/devices.cc @@ -1,16 +1,16 @@ -#include "cnn/devices.h" +#include "dynet/devices.h" #include #include #include -#include "cnn/cuda.h" -#include "cnn/cnn.h" -#include "cnn/expr.h" +#include "dynet/cuda.h" +#include "dynet/dynet.h" +#include "dynet/expr.h" using namespace std; -namespace cnn { +namespace dynet { DeviceMempoolSizes::DeviceMempoolSizes(size_t total_size) { used[0] = total_size/3; @@ -112,4 +112,4 @@ Device_CPU::Device_CPU(int my_id, const DeviceMempoolSizes & mbs, bool shared) : Device_CPU::~Device_CPU() {} -} // namespace cnn +} // namespace dynet diff --git a/cnn/devices.h b/dynet/devices.h similarity index 92% rename from cnn/devices.h rename to dynet/devices.h index 9a48fcecf..9a83f6a40 100644 --- a/cnn/devices.h +++ b/dynet/devices.h @@ -1,9 +1,9 @@ -#ifndef CNN_DEVICES_H -#define CNN_DEVICES_H +#ifndef DYNET_DEVICES_H +#define DYNET_DEVICES_H #include -#include "cnn/aligned-mem-pool.h" -#include "cnn/cuda.h" +#include "dynet/aligned-mem-pool.h" +#include "dynet/cuda.h" namespace Eigen { struct DefaultDevice; @@ -11,7 +11,7 @@ namespace Eigen { struct GpuDevice; } -namespace cnn { +namespace dynet { enum class DeviceType {CPU, GPU}; enum class DeviceMempool {FXS = 0, DEDFS = 1, PS = 2, NONE = 3}; @@ -72,6 +72,6 @@ class Device_CPU : public Device { MemAllocator* shmem; }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/dict.cc b/dynet/dict.cc similarity index 92% rename from cnn/dict.cc rename to dynet/dict.cc index 959a5236d..975b849e8 100644 --- a/cnn/dict.cc +++ b/dynet/dict.cc @@ -11,12 +11,12 @@ #include #endif -#include "cnn/io-macros.h" +#include "dynet/io-macros.h" using namespace std; -namespace cnn { +namespace dynet { std::vector read_sentence(const std::string& line, Dict* sd) { std::istringstream in(line); @@ -55,7 +55,7 @@ template void Dict::serialize(Archive& ar, const unsigned int) { throw std::invalid_argument("Serializing dictionaries is only supported on versions of boost 1.56 or higher"); #endif } -CNN_SERIALIZE_IMPL(Dict) +DYNET_SERIALIZE_IMPL(Dict) -} // namespace cnn +} // namespace dynet diff --git a/cnn/dict.h b/dynet/dict.h similarity index 96% rename from cnn/dict.h rename to dynet/dict.h index 86fef6b8b..0e998a171 100644 --- a/cnn/dict.h +++ b/dynet/dict.h @@ -1,5 +1,5 @@ -#ifndef CNN_DICT_H_ -#define CNN_DICT_H_ +#ifndef DYNET_DICT_H_ +#define DYNET_DICT_H_ #include #include @@ -10,7 +10,7 @@ namespace boost { namespace serialization { class access; } } -namespace cnn { +namespace dynet { class Dict { typedef std::unordered_map Map; @@ -87,6 +87,6 @@ typedef std::unordered_map Map; std::vector read_sentence(const std::string& line, Dict* sd); void read_sentence_pair(const std::string& line, std::vector* s, Dict* sd, std::vector* t, Dict* td); -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/dim.cc b/dynet/dim.cc similarity index 81% rename from cnn/dim.cc rename to dynet/dim.cc index 71bd0ee85..a7d8b7be7 100644 --- a/cnn/dim.cc +++ b/dynet/dim.cc @@ -1,12 +1,12 @@ -#include "cnn/dim.h" +#include "dynet/dim.h" #include -#include "cnn/io-macros.h" +#include "dynet/io-macros.h" using namespace std; -namespace cnn { +namespace dynet { ostream& operator<<(ostream& os, const Dim& d) { os << '{'; @@ -30,7 +30,7 @@ void Dim::serialize(Archive& ar, const unsigned int) { ar & nd; ar & d; } -CNN_SERIALIZE_IMPL(Dim) +DYNET_SERIALIZE_IMPL(Dim) -} // namespace cnn +} // namespace dynet diff --git a/cnn/dim.h b/dynet/dim.h similarity index 95% rename from cnn/dim.h rename to dynet/dim.h index 15a583f55..919071760 100644 --- a/cnn/dim.h +++ b/dynet/dim.h @@ -1,5 +1,5 @@ -#ifndef CNN_DIM_H -#define CNN_DIM_H +#ifndef DYNET_DIM_H +#define DYNET_DIM_H #include #include @@ -9,11 +9,11 @@ #include #include -#define CNN_MAX_TENSOR_DIM 7 +#define DYNET_MAX_TENSOR_DIM 7 namespace boost { namespace serialization { class access; } } -namespace cnn { +namespace dynet { struct Dim { Dim() : nd(0), bd(1) {} @@ -73,7 +73,7 @@ struct Dim { else if (nd == 2) { return Dim({d[1], d[0]}, bd); } throw std::invalid_argument("Cannot transpose Dim object with more than 2 dimensions"); } - unsigned int d[CNN_MAX_TENSOR_DIM]; + unsigned int d[DYNET_MAX_TENSOR_DIM]; unsigned int nd; unsigned int bd; private: @@ -93,6 +93,6 @@ inline bool operator!=(const Dim& a, const Dim& b) { return !(a == b); } std::ostream& operator<<(std::ostream& os, const Dim& d); std::ostream& operator<<(std::ostream& os, const std::vector& ds); -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/cnn-helper.h b/dynet/dynet-helper.h similarity index 76% rename from cnn/cnn-helper.h rename to dynet/dynet-helper.h index 4fa7aeab6..b98e05d00 100644 --- a/cnn/cnn-helper.h +++ b/dynet/dynet-helper.h @@ -1,11 +1,11 @@ -#ifndef CNN_HELPER_H_ -#define CNN_HELPER_H_ +#ifndef DYNET_HELPER_H_ +#define DYNET_HELPER_H_ #include /// helper functions -namespace cnn { +namespace dynet { /** this fix a compilation problem in cygwin @@ -20,6 +20,6 @@ namespace cnn { } #endif -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/cnn.cc b/dynet/dynet.cc similarity index 97% rename from cnn/cnn.cc rename to dynet/dynet.cc index b3d3cba67..d5bfe51ac 100644 --- a/cnn/cnn.cc +++ b/dynet/dynet.cc @@ -1,15 +1,15 @@ -#include "cnn/cnn.h" +#include "dynet/dynet.h" -#include "cnn/exec.h" -#include "cnn/nodes.h" -#include "cnn/param-nodes.h" -#include "cnn/aligned-mem-pool.h" -#include "cnn/cnn-helper.h" -#include "cnn/expr.h" +#include "dynet/exec.h" +#include "dynet/nodes.h" +#include "dynet/param-nodes.h" +#include "dynet/aligned-mem-pool.h" +#include "dynet/dynet-helper.h" +#include "dynet/expr.h" using namespace std; -namespace cnn { +namespace dynet { float* kSCALAR_MINUSONE; float* kSCALAR_ONE; @@ -272,5 +272,5 @@ void ComputationGraph::print_graphviz() const { cerr << "}\n"; } -} // namespace cnn +} // namespace dynet diff --git a/cnn/cnn.h b/dynet/dynet.h similarity index 97% rename from cnn/cnn.h rename to dynet/dynet.h index c3200e521..449b4dd42 100644 --- a/cnn/cnn.h +++ b/dynet/dynet.h @@ -1,5 +1,5 @@ -#ifndef CNN_CNN_H_ -#define CNN_CNN_H_ +#ifndef DYNET_DYNET_H_ +#define DYNET_DYNET_H_ #include #include @@ -9,11 +9,11 @@ #include -#include "cnn/init.h" -#include "cnn/aligned-mem-pool.h" -#include "cnn/tensor.h" -#include "cnn/model.h" -#include "cnn/devices.h" +#include "dynet/init.h" +#include "dynet/aligned-mem-pool.h" +#include "dynet/tensor.h" +#include "dynet/model.h" +#include "dynet/devices.h" // Computation graph where nodes represent forward and backward intermediate // values, and edges represent functions of multiple values. To represent the @@ -24,7 +24,7 @@ // is an edge representing f with which points to the z node (i.e., its head), // and x and y are the tails of the edge. -namespace cnn { +namespace dynet { extern float* kSCALAR_MINUSONE; extern float* kSCALAR_ONE; @@ -72,7 +72,7 @@ struct ComputationGraph { // PARAMETERS // parameters are things that are optimized. in contrast to a system like - // Torch where computational modules may have their own parameters, in CNN + // Torch where computational modules may have their own parameters, in DYNET // parameters are just parameters VariableIndex add_parameters(Parameter p); VariableIndex add_const_parameters(Parameter p); @@ -238,6 +238,6 @@ inline VariableIndex ComputationGraph::add_function(const T& arguments) { return new_node_index; } -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/except.h b/dynet/except.h similarity index 84% rename from cnn/except.h rename to dynet/except.h index 8c0df02f5..ecbc2defa 100644 --- a/cnn/except.h +++ b/dynet/except.h @@ -1,11 +1,11 @@ -#ifndef CNN_EXCEPT_H_ -#define CNN_EXCEPT_H_ +#ifndef DYNET_EXCEPT_H_ +#define DYNET_EXCEPT_H_ #include -namespace cnn { +namespace dynet { -// if CNN exhausts its memory pool +// if DYNET exhausts its memory pool class out_of_memory : public std::runtime_error { public: out_of_memory(const std::string& what_arg) : runtime_error(what_arg) {} @@ -25,6 +25,6 @@ class cuda_exception : public std::runtime_error { cuda_exception(const std::string& what_arg) : runtime_error(what_arg) {} }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/exec.cc b/dynet/exec.cc similarity index 97% rename from cnn/exec.cc rename to dynet/exec.cc index 4abdb49c3..ad2ef49d9 100644 --- a/cnn/exec.cc +++ b/dynet/exec.cc @@ -1,11 +1,11 @@ -#include "cnn/exec.h" +#include "dynet/exec.h" -#include "cnn/param-nodes.h" -#include "cnn/globals.h" +#include "dynet/param-nodes.h" +#include "dynet/globals.h" using namespace std; -namespace cnn { +namespace dynet { ExecutionEngine::~ExecutionEngine() {} @@ -45,7 +45,7 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { // free any old memory if this is a new CG if (num_nodes_evaluated == 0) - for(Device* dev : cnn::devices) + for(Device* dev : dynet::devices) dev->pools[(int)DeviceMempool::FXS]->free(); if (i >= num_nodes_evaluated) { @@ -170,4 +170,4 @@ void SimpleExecutionEngine::backward(VariableIndex from_where) { static_cast(cg.nodes[i])->accumulate_grad(ndEdfs[i]); } -} // namespace cnn +} // namespace dynet diff --git a/cnn/exec.h b/dynet/exec.h similarity index 92% rename from cnn/exec.h rename to dynet/exec.h index 82d2715a7..1c86dbbd7 100644 --- a/cnn/exec.h +++ b/dynet/exec.h @@ -1,9 +1,9 @@ -#ifndef CNN_EXEC_H -#define CNN_EXEC_H +#ifndef DYNET_EXEC_H +#define DYNET_EXEC_H -#include "cnn/cnn.h" +#include "dynet/dynet.h" -namespace cnn { +namespace dynet { class ExecutionEngine { public: @@ -40,6 +40,6 @@ class SimpleExecutionEngine : public ExecutionEngine { VariableIndex num_nodes_evaluated; }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/expr.cc b/dynet/expr.cc similarity index 99% rename from cnn/expr.cc rename to dynet/expr.cc index 50379f11f..984d87f41 100644 --- a/cnn/expr.cc +++ b/dynet/expr.cc @@ -1,11 +1,11 @@ -#include "cnn/expr.h" +#include "dynet/expr.h" #include -#include "cnn/nodes.h" -#include "cnn/nodes-conv.h" +#include "dynet/nodes.h" +#include "dynet/nodes-conv.h" -namespace cnn { namespace expr { +namespace dynet { namespace expr { using std::vector; diff --git a/cnn/expr.h b/dynet/expr.h similarity index 98% rename from cnn/expr.h rename to dynet/expr.h index efbb1fa59..ec954c798 100644 --- a/cnn/expr.h +++ b/dynet/expr.h @@ -1,11 +1,11 @@ -#ifndef CNN_EXPR_H -#define CNN_EXPR_H +#ifndef DYNET_EXPR_H +#define DYNET_EXPR_H -#include "cnn/cnn.h" -#include "cnn/nodes.h" -#include "cnn/nodes-contract.h" +#include "dynet/dynet.h" +#include "dynet/nodes.h" +#include "dynet/nodes-contract.h" -namespace cnn { namespace expr { +namespace dynet { namespace expr { struct Expression { ComputationGraph *pg; diff --git a/cnn/fast-lstm.cc b/dynet/fast-lstm.cc similarity index 97% rename from cnn/fast-lstm.cc rename to dynet/fast-lstm.cc index 99ec22e6f..411c569db 100644 --- a/cnn/fast-lstm.cc +++ b/dynet/fast-lstm.cc @@ -1,16 +1,16 @@ -#include "cnn/fast-lstm.h" +#include "dynet/fast-lstm.h" #include #include #include #include -#include "cnn/nodes.h" +#include "dynet/nodes.h" using namespace std; -using namespace cnn::expr; +using namespace dynet::expr; -namespace cnn { +namespace dynet { enum { X2I, H2I, C2I, BI, X2O, H2O, C2O, BO, X2C, H2C, BC }; @@ -170,4 +170,4 @@ void FastLSTMBuilder::copy(const RNNBuilder & rnn) { params[i][j] = rnn_lstm.params[i][j]; } -} // namespace cnn +} // namespace dynet diff --git a/cnn/fast-lstm.h b/dynet/fast-lstm.h similarity index 90% rename from cnn/fast-lstm.h rename to dynet/fast-lstm.h index dc1156d62..9d04f0ee1 100644 --- a/cnn/fast-lstm.h +++ b/dynet/fast-lstm.h @@ -1,13 +1,13 @@ -#ifndef CNN_FAST_LSTM_H_ -#define CNN_FAST_LSTM_H_ +#ifndef DYNET_FAST_LSTM_H_ +#define DYNET_FAST_LSTM_H_ -#include "cnn/cnn.h" -#include "cnn/rnn.h" -#include "cnn/expr.h" +#include "dynet/dynet.h" +#include "dynet/rnn.h" +#include "dynet/expr.h" -using namespace cnn::expr; +using namespace dynet::expr; -namespace cnn { +namespace dynet { class Model; @@ -61,6 +61,6 @@ struct FastLSTMBuilder : public RNNBuilder { unsigned layers; }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/functors.h b/dynet/functors.h similarity index 63% rename from cnn/functors.h rename to dynet/functors.h index d6018ea7c..adc100f8a 100644 --- a/cnn/functors.h +++ b/dynet/functors.h @@ -1,16 +1,16 @@ -#ifndef CNN_GPU_FUNCTORS_H -#define CNN_GPU_FUNCTORS_H +#ifndef DYNET_GPU_FUNCTORS_H +#define DYNET_GPU_FUNCTORS_H #include #include #if HAVE_CUDA -# define CNN_DEVICE_FUNC __device__ -# define CNN_DEVICE_MIN -1.175494351e-38f +# define DYNET_DEVICE_FUNC __device__ +# define DYNET_DEVICE_MIN -1.175494351e-38f #else # include -# define CNN_DEVICE_FUNC -# define CNN_DEVICE_MIN std::numeric_limits::min() +# define DYNET_DEVICE_FUNC +# define DYNET_DEVICE_MIN std::numeric_limits::min() #endif // these functions are used both in CPU and in GPU computation @@ -22,11 +22,11 @@ // use Eigen's internal support for vectorized operations which // can give faster performance on some hardware -namespace cnn { +namespace dynet { struct FHuberForward { FHuberForward(float c) : c(c) {} - CNN_DEVICE_FUNC inline float operator()(float x) const { + DYNET_DEVICE_FUNC inline float operator()(float x) const { const float a = fabs(x); return (a < c) ? x*x : c*(2*a - c); } @@ -39,7 +39,7 @@ struct FHuberForward { struct FL1Backward { FL1Backward(float d) : d(d) {} - CNN_DEVICE_FUNC inline float operator()(float x) const { + DYNET_DEVICE_FUNC inline float operator()(float x) const { return ((0.f < x) - (x < 0.f)) * d; } const float d; @@ -47,7 +47,7 @@ struct FL1Backward { struct FHuberBackward { FHuberBackward(float c, float dEdf) : c(c), d(dEdf) {} - CNN_DEVICE_FUNC inline float operator()(float x) const { + DYNET_DEVICE_FUNC inline float operator()(float x) const { const float a = fabs(x); return (2 * d) * ((a < c) ? x : c * ((0.f < x) - (x < 0.f))); } @@ -56,20 +56,20 @@ struct FHuberBackward { }; struct FProduct { - CNN_DEVICE_FUNC inline float operator()(float a, float b) const { + DYNET_DEVICE_FUNC inline float operator()(float a, float b) const { return a * b; } }; struct FQuotient { - CNN_DEVICE_FUNC inline float operator()(float a, float b) const { + DYNET_DEVICE_FUNC inline float operator()(float a, float b) const { return a / b; } }; struct FConstantPlus { FConstantPlus(float c) : c(c) {} - CNN_DEVICE_FUNC inline float operator()(float x) const { + DYNET_DEVICE_FUNC inline float operator()(float x) const { return c + x; } float c; @@ -77,26 +77,26 @@ struct FConstantPlus { struct FConstantMinus { FConstantMinus(float c) : c(c) {} - CNN_DEVICE_FUNC inline float operator()(float x) const { + DYNET_DEVICE_FUNC inline float operator()(float x) const { return c - x; } float c; }; struct FNegate { - CNN_DEVICE_FUNC inline float operator()(float x) const { + DYNET_DEVICE_FUNC inline float operator()(float x) const { return -x; } }; struct FErf { - CNN_DEVICE_FUNC inline float operator()(float x) const { + DYNET_DEVICE_FUNC inline float operator()(float x) const { return erff(x); } }; struct FTanh { - CNN_DEVICE_FUNC inline float operator()(float x) const { + DYNET_DEVICE_FUNC inline float operator()(float x) const { #ifdef FAST_TANH float x2 = x * x; float a = x * (135135.0f + x2 * (17325.0f + x2 * (378.0f + x2))); @@ -109,44 +109,44 @@ struct FTanh { }; struct FLog { - CNN_DEVICE_FUNC inline float operator()(float x) const { + DYNET_DEVICE_FUNC inline float operator()(float x) const { return logf(x); } }; struct FMaxBackwardInv { - CNN_DEVICE_FUNC inline float operator()(float u, float d) const { + DYNET_DEVICE_FUNC inline float operator()(float u, float d) const { return (1.f - u) * d; } }; struct FSqrtBackward { - CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + DYNET_DEVICE_FUNC inline float operator()(float t, float d) const { return d / (2.f * t); } }; struct FErfBackward { - CNN_DEVICE_FUNC inline float operator()(float x, float d) const { + DYNET_DEVICE_FUNC inline float operator()(float x, float d) const { return 1.1283791670955125738961589f * expf(-x * x) * d; } }; struct FTanhBackward { - CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + DYNET_DEVICE_FUNC inline float operator()(float t, float d) const { return (1.f - t * t) * d; } }; struct FLogBackward { - CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + DYNET_DEVICE_FUNC inline float operator()(float t, float d) const { return (1.f / t) * d; } }; struct FPairwiseRankLoss { FPairwiseRankLoss(float m) : margin(m) {} - CNN_DEVICE_FUNC float operator()(float a, float b) const { + DYNET_DEVICE_FUNC float operator()(float a, float b) const { float d = margin - a + b; return d > 0.f ? d : 0.f; } @@ -154,20 +154,20 @@ struct FPairwiseRankLoss { }; struct FRectifyBackward { - CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + DYNET_DEVICE_FUNC inline float operator()(float t, float d) const { return (t) ? d : 0.f; } }; struct FRectifyNegateBackward { - CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + DYNET_DEVICE_FUNC inline float operator()(float t, float d) const { return (t) ? -d : 0.f; } }; struct FSoftmaxNormalize { explicit FSoftmaxNormalize(float logz) : logz(logz) {} - CNN_DEVICE_FUNC inline float operator()(float x) const { + DYNET_DEVICE_FUNC inline float operator()(float x) const { return expf(x - logz); } float logz; @@ -175,21 +175,21 @@ struct FSoftmaxNormalize { struct FSoftmaxBackward { explicit FSoftmaxBackward(float off_diag_sum) : off_diag_sum(off_diag_sum) {} - CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + DYNET_DEVICE_FUNC inline float operator()(float t, float d) const { return (off_diag_sum + d) * t; } float off_diag_sum; }; // struct FLogGammaBackward { -// CNN_DEVICE_FUNC inline float operator()(float x, float d) const { +// DYNET_DEVICE_FUNC inline float operator()(float x, float d) const { // return boost::math::digamma(x) * d; // } // }; struct FNegLogSoftmaxBackward { FNegLogSoftmaxBackward(float lz, float err) : logz(lz), d(err) {} - CNN_DEVICE_FUNC inline float operator()(float t) const { + DYNET_DEVICE_FUNC inline float operator()(float t) const { return expf(t - logz) * d; } float logz; @@ -198,7 +198,7 @@ struct FNegLogSoftmaxBackward { struct FPtrNegLogSoftmaxBackward { FPtrNegLogSoftmaxBackward(const float* lz, const float* err) : logz(lz), d(err) {} - CNN_DEVICE_FUNC inline float operator()(float t) const { + DYNET_DEVICE_FUNC inline float operator()(float t) const { return expf(t - *logz) * *d; } const float* logz; @@ -207,7 +207,7 @@ struct FPtrNegLogSoftmaxBackward { struct FLogSoftmaxNormalize { explicit FLogSoftmaxNormalize(float logz) : logz(logz) {} - CNN_DEVICE_FUNC inline float operator()(float x) const { + DYNET_DEVICE_FUNC inline float operator()(float x) const { return x - logz; } float logz; @@ -221,7 +221,7 @@ struct FWeightedError { struct FLogSoftmaxBackward { explicit FLogSoftmaxBackward(float off_diag_sum) : off_diag_sum(off_diag_sum) {} - CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + DYNET_DEVICE_FUNC inline float operator()(float t, float d) const { return off_diag_sum * expf(t) + d; //return (off_diag_sum + d) * t; } @@ -229,38 +229,38 @@ struct FLogSoftmaxBackward { }; struct FRectify { - CNN_DEVICE_FUNC inline float operator()(float x) const { + DYNET_DEVICE_FUNC inline float operator()(float x) const { return (x > 0.f) ? x : 0.f; } }; struct FSoftSign { - CNN_DEVICE_FUNC inline float operator()(float x) const { + DYNET_DEVICE_FUNC inline float operator()(float x) const { return x / (1.f + (x < 0.f ? -x : x)); } }; struct FSoftSignBackward { - CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + DYNET_DEVICE_FUNC inline float operator()(float t, float d) const { float a = 1.f - (t < 0.f ? -t : t); return a * a * d; } }; struct FLogisticSigmoid { - CNN_DEVICE_FUNC inline float operator()(float x) const { + DYNET_DEVICE_FUNC inline float operator()(float x) const { return 1.f / (1.f + expf(-x)); } }; struct FLogisticSigmoidBackward { - CNN_DEVICE_FUNC inline float operator()(float t, float d) const { + DYNET_DEVICE_FUNC inline float operator()(float t, float d) const { return (1.f - t) * t * d; } }; struct FSqDist { - CNN_DEVICE_FUNC inline float operator()(float a, float b) const { + DYNET_DEVICE_FUNC inline float operator()(float a, float b) const { float d = a - b; return d * d; } @@ -268,7 +268,7 @@ struct FSqDist { struct FEuclideanBackward { FEuclideanBackward(int i, const float* s) : i(i), scalar(s) {} - CNN_DEVICE_FUNC inline float operator()(float a, float b) const { + DYNET_DEVICE_FUNC inline float operator()(float a, float b) const { return (i == 0 ? 2.f : -2.f) * (*scalar) * (a - b); } int i; @@ -277,7 +277,7 @@ struct FEuclideanBackward { struct FL2SGDUpdate { FL2SGDUpdate(float l, float s) : lambda(l), scale(-s) {} - CNN_DEVICE_FUNC inline float operator()(float x, float g) const { + DYNET_DEVICE_FUNC inline float operator()(float x, float g) const { return scale * g - x * lambda; } float lambda; @@ -285,18 +285,18 @@ struct FL2SGDUpdate { }; struct FBinaryLogLoss { - CNN_DEVICE_FUNC inline float operator()(float x, float x_true) const { + DYNET_DEVICE_FUNC inline float operator()(float x, float x_true) const { if (x_true == 1.f) { - if (x == 0.f) x = CNN_DEVICE_MIN; + if (x == 0.f) x = DYNET_DEVICE_MIN; return -1.f * x_true * log(x); } else if (x_true == 0.f) { - if (x == 1.f) x = CNN_DEVICE_MIN; + if (x == 1.f) x = DYNET_DEVICE_MIN; return (x_true - 1.f) * log1p(-x); } else { - if (x == 0.f) x = CNN_DEVICE_MIN; - if (x == 1.f) x = CNN_DEVICE_MIN; + if (x == 0.f) x = DYNET_DEVICE_MIN; + if (x == 1.f) x = DYNET_DEVICE_MIN; return -1.f * (x_true * log(x) + (1.f - x_true) * log1p(-x)); } } @@ -304,9 +304,9 @@ struct FBinaryLogLoss { struct FBinaryLogLossBackward { explicit FBinaryLogLossBackward(float d) : d(d) {} - CNN_DEVICE_FUNC inline float operator()(float x, float x_true) const { + DYNET_DEVICE_FUNC inline float operator()(float x, float x_true) const { if (x == x_true) return 0; - if (x == 0.f) x = CNN_DEVICE_MIN; + if (x == 0.f) x = DYNET_DEVICE_MIN; if (x == 1.f) x = 0.9999999f; if (x_true == 1.f) { return d * -x_true / x; @@ -318,6 +318,6 @@ struct FBinaryLogLossBackward { float d; }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/globals.cc b/dynet/globals.cc similarity index 64% rename from cnn/globals.cc rename to dynet/globals.cc index d38e25e2b..c9bd6ccad 100644 --- a/cnn/globals.cc +++ b/dynet/globals.cc @@ -1,7 +1,7 @@ -#include "cnn/globals.h" -#include "cnn/devices.h" +#include "dynet/globals.h" +#include "dynet/devices.h" -namespace cnn { +namespace dynet { std::mt19937* rndeng = nullptr; std::vector devices; diff --git a/cnn/globals.h b/dynet/globals.h similarity index 62% rename from cnn/globals.h rename to dynet/globals.h index f67ee0db8..d286ac8d2 100644 --- a/cnn/globals.h +++ b/dynet/globals.h @@ -1,10 +1,10 @@ -#ifndef CNN_EIGEN_RANDOM_H -#define CNN_EIGEN_RANDOM_H +#ifndef DYNET_EIGEN_RANDOM_H +#define DYNET_EIGEN_RANDOM_H #include #include -namespace cnn { +namespace dynet { class Device; @@ -12,6 +12,6 @@ extern std::mt19937* rndeng; extern std::vector devices; extern Device* default_device; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/gpu-kernels.h b/dynet/gpu-kernels.h similarity index 91% rename from cnn/gpu-kernels.h rename to dynet/gpu-kernels.h index 30c08bb61..9c39c965d 100644 --- a/cnn/gpu-kernels.h +++ b/dynet/gpu-kernels.h @@ -1,9 +1,9 @@ -#ifndef CNN_GPU_KERNELS_H -#define CNN_GPU_KERNELS_H +#ifndef DYNET_GPU_KERNELS_H +#define DYNET_GPU_KERNELS_H -#include "cnn/cuda.h" +#include "dynet/cuda.h" -namespace cnn { +namespace dynet { namespace gpu { template @@ -52,6 +52,6 @@ __global__ void slowReduceKernel(int n, const float* x0, const float* x1, float* } } // namespace gpu -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/gpu-model.cu b/dynet/gpu-model.cu similarity index 100% rename from cnn/gpu-model.cu rename to dynet/gpu-model.cu diff --git a/cnn/gpu-nodes-contract.cu b/dynet/gpu-nodes-contract.cu similarity index 100% rename from cnn/gpu-nodes-contract.cu rename to dynet/gpu-nodes-contract.cu diff --git a/cnn/gpu-nodes-conv.cu b/dynet/gpu-nodes-conv.cu similarity index 100% rename from cnn/gpu-nodes-conv.cu rename to dynet/gpu-nodes-conv.cu diff --git a/cnn/gpu-nodes.cu b/dynet/gpu-nodes.cu similarity index 100% rename from cnn/gpu-nodes.cu rename to dynet/gpu-nodes.cu diff --git a/cnn/gpu-ops.cu b/dynet/gpu-ops.cu similarity index 89% rename from cnn/gpu-ops.cu rename to dynet/gpu-ops.cu index 23cfd21dd..4cea45192 100644 --- a/cnn/gpu-ops.cu +++ b/dynet/gpu-ops.cu @@ -1,9 +1,9 @@ -#include "cnn/cuda.h" -#include "cnn/gpu-ops.h" -#include "cnn/gpu-kernels.h" -#include "cnn/functors.h" +#include "dynet/cuda.h" +#include "dynet/gpu-ops.h" +#include "dynet/gpu-kernels.h" +#include "dynet/functors.h" -namespace cnn { +namespace dynet { namespace gpu { // CUDA kernel. Each thread takes care of one element of c @@ -47,4 +47,4 @@ void const_init(int n, float val, float *trg) { } } // namespace gpu -} // namespace cnn +} // namespace dynet diff --git a/cnn/gpu-ops.h b/dynet/gpu-ops.h similarity index 95% rename from cnn/gpu-ops.h rename to dynet/gpu-ops.h index 94a63ccfc..ee1d10ee9 100644 --- a/cnn/gpu-ops.h +++ b/dynet/gpu-ops.h @@ -1,7 +1,7 @@ -#ifndef CNN_GPU_OPS_H -#define CNN_GPU_OPS_H +#ifndef DYNET_GPU_OPS_H +#define DYNET_GPU_OPS_H -namespace cnn { +namespace dynet { namespace gpu { // void vpairwise_rank_loss(int n, float margin, const float* xgood, const float* xbad, float* y); @@ -32,6 +32,6 @@ void sparse_assign(int n, unsigned int* ids, float* src, float* trg); void const_init(int n, float val, float* trg); } // namespace gpu -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/gpu-param-nodes.cu b/dynet/gpu-param-nodes.cu similarity index 100% rename from cnn/gpu-param-nodes.cu rename to dynet/gpu-param-nodes.cu diff --git a/cnn/gpu-training.cu b/dynet/gpu-training.cu similarity index 100% rename from cnn/gpu-training.cu rename to dynet/gpu-training.cu diff --git a/cnn/grad-check.cc b/dynet/grad-check.cc similarity index 95% rename from cnn/grad-check.cc rename to dynet/grad-check.cc index 2c4901889..c761ce709 100644 --- a/cnn/grad-check.cc +++ b/dynet/grad-check.cc @@ -1,16 +1,16 @@ -#include "cnn/grad-check.h" +#include "dynet/grad-check.h" #include #include -#include "cnn/model.h" -#include "cnn/cnn.h" -#include "cnn/tensor.h" -#include "cnn/expr.h" +#include "dynet/model.h" +#include "dynet/dynet.h" +#include "dynet/tensor.h" +#include "dynet/expr.h" using namespace std; -namespace cnn { +namespace dynet { bool check_grad(Model& m, expr::Expression& expr, int verbosity) { ComputationGraph& g = *expr.pg; diff --git a/cnn/grad-check.h b/dynet/grad-check.h similarity index 63% rename from cnn/grad-check.h rename to dynet/grad-check.h index 081ef6132..517a778cf 100644 --- a/cnn/grad-check.h +++ b/dynet/grad-check.h @@ -1,9 +1,9 @@ -#ifndef CNN_GRAD_CHECK_H -#define CNN_GRAD_CHECK_H +#ifndef DYNET_GRAD_CHECK_H +#define DYNET_GRAD_CHECK_H -#include "cnn/expr.h" +#include "dynet/expr.h" -namespace cnn { +namespace dynet { class Model; struct ComputationGraph; @@ -11,6 +11,6 @@ struct ComputationGraph; // verbosity is zero for silence, one for only printing errors, two for everything bool check_grad(Model& m, expr::Expression& expr, int verbosity = 1); -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/graph.cc b/dynet/graph.cc similarity index 86% rename from cnn/graph.cc rename to dynet/graph.cc index 8a7361a22..6f3587dc7 100644 --- a/cnn/graph.cc +++ b/dynet/graph.cc @@ -1,11 +1,11 @@ -#include "cnn/graph.h" -#include "cnn/cnn.h" +#include "dynet/graph.h" +#include "dynet/dynet.h" #include -#include "cnn/cnn-helper.h" +#include "dynet/dynet-helper.h" using namespace std; -namespace cnn { +namespace dynet { void graph_optimize(ComputationGraph* cg) { // topo sort @@ -31,4 +31,4 @@ void graph_optimize(ComputationGraph* cg) { abort();// DEBUGGING } -} // namespaiice cnn +} // namespaiice dynet diff --git a/dynet/graph.h b/dynet/graph.h new file mode 100644 index 000000000..bcbbf8f62 --- /dev/null +++ b/dynet/graph.h @@ -0,0 +1,9 @@ +#ifndef DYNET_GRAPH_H +#define DYNET_GRAPH_H + +namespace dynet { +struct ComputationGraph; +void graph_optimize(ComputationGraph* cg); +} // namespace dynet + +#endif diff --git a/cnn/gru.cc b/dynet/gru.cc similarity index 97% rename from cnn/gru.cc rename to dynet/gru.cc index 4fa9feab5..aee5ca8d8 100644 --- a/cnn/gru.cc +++ b/dynet/gru.cc @@ -1,16 +1,16 @@ -#include "cnn/gru.h" +#include "dynet/gru.h" #include #include #include #include -#include "cnn/nodes.h" -#include "cnn/training.h" +#include "dynet/nodes.h" +#include "dynet/training.h" using namespace std; -namespace cnn { +namespace dynet { enum { X2Z, H2Z, BZ, X2R, H2R, BR, X2H, H2H, BH }; @@ -134,4 +134,4 @@ void GRUBuilder::copy(const RNNBuilder & rnn) { params[i][j] = rnn_gru.params[i][j]; } -} // namespace cnn +} // namespace dynet diff --git a/cnn/gru.h b/dynet/gru.h similarity index 91% rename from cnn/gru.h rename to dynet/gru.h index 0a262de7a..79eac6e68 100644 --- a/cnn/gru.h +++ b/dynet/gru.h @@ -1,10 +1,10 @@ -#ifndef CNN_GRU_H_ -#define CNN_GRU_H_ +#ifndef DYNET_GRU_H_ +#define DYNET_GRU_H_ -#include "cnn/cnn.h" -#include "cnn/rnn.h" +#include "dynet/dynet.h" +#include "dynet/rnn.h" -namespace cnn { +namespace dynet { class Model; @@ -44,6 +44,6 @@ struct GRUBuilder : public RNNBuilder { unsigned layers; }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/hsm-builder.cc b/dynet/hsm-builder.cc similarity index 97% rename from cnn/hsm-builder.cc rename to dynet/hsm-builder.cc index 30d819a15..8f3170667 100644 --- a/cnn/hsm-builder.cc +++ b/dynet/hsm-builder.cc @@ -1,4 +1,4 @@ -#include "cnn/hsm-builder.h" +#include "dynet/hsm-builder.h" #include #include @@ -10,14 +10,14 @@ #include #endif -#include "cnn/io-macros.h" +#include "dynet/io-macros.h" #undef assert #define assert(x) {} using namespace std; -namespace cnn { +namespace dynet { using namespace expr; @@ -195,7 +195,7 @@ void Cluster::serialize(Archive& ar, const unsigned int) { throw std::invalid_argument("Serializing clusters is only supported on versions of boost 1.56 or higher"); #endif } -CNN_SERIALIZE_IMPL(Cluster) +DYNET_SERIALIZE_IMPL(Cluster) HierarchicalSoftmaxBuilder::HierarchicalSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, @@ -260,7 +260,7 @@ unsigned HierarchicalSoftmaxBuilder::sample(const expr::Expression& rep) { Expression HierarchicalSoftmaxBuilder::full_log_distribution(const Expression& rep) { assert (false && "full_distribution not implemented for HierarchicalSoftmaxBuilder"); - return cnn::expr::Expression(); + return dynet::expr::Expression(); } inline bool is_ws(char x) { return (x == ' ' || x == '\t'); } @@ -320,4 +320,4 @@ Cluster* HierarchicalSoftmaxBuilder::read_cluster_file(const std::string& cluste return root; } -} // namespace cnn +} // namespace dynet diff --git a/cnn/hsm-builder.h b/dynet/hsm-builder.h similarity index 92% rename from cnn/hsm-builder.h rename to dynet/hsm-builder.h index 7e828c780..cbae999de 100644 --- a/cnn/hsm-builder.h +++ b/dynet/hsm-builder.h @@ -1,15 +1,15 @@ -#ifndef CNN_HSMBUILDER_H -#define CNN_HSMBUILDER_H +#ifndef DYNET_HSMBUILDER_H +#define DYNET_HSMBUILDER_H #include #include #include -#include "cnn/cnn.h" -#include "cnn/expr.h" -#include "cnn/dict.h" -#include "cnn/cfsm-builder.h" +#include "dynet/dynet.h" +#include "dynet/expr.h" +#include "dynet/dict.h" +#include "dynet/cfsm-builder.h" -namespace cnn { +namespace dynet { class Cluster { private: @@ -84,6 +84,6 @@ class HierarchicalSoftmaxBuilder : public SoftmaxBuilder { ComputationGraph* pcg; Cluster* root; }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/init.cc b/dynet/init.cc similarity index 64% rename from cnn/init.cc rename to dynet/init.cc index 9e01045fc..a918c7cd0 100644 --- a/cnn/init.cc +++ b/dynet/init.cc @@ -1,20 +1,20 @@ -#include "cnn/init.h" -#include "cnn/aligned-mem-pool.h" -#include "cnn/cnn.h" -#include "cnn/weight-decay.h" +#include "dynet/init.h" +#include "dynet/aligned-mem-pool.h" +#include "dynet/dynet.h" +#include "dynet/weight-decay.h" #include #include #include #if HAVE_CUDA -#include "cnn/cuda.h" +#include "dynet/cuda.h" #include #endif using namespace std; -namespace cnn { +namespace dynet { static void remove_args(int& argc, char**& argv, int& argi, int n) { for (int i = argi + n; i < argc; ++i) @@ -25,12 +25,12 @@ static void remove_args(int& argc, char**& argv, int& argi, int n) { void initialize(int& argc, char**& argv, bool shared_parameters) { if(default_device != nullptr) { - cerr << "WARNING: Attempting to initialize cnn twice. Ignoring duplicate initialization." << endl; + cerr << "WARNING: Attempting to initialize dynet twice. Ignoring duplicate initialization." << endl; return; } vector gpudevices; #if HAVE_CUDA - cerr << "[cnn] initializing CUDA\n"; + cerr << "[dynet] initializing CUDA\n"; gpudevices = initialize_gpu(argc, argv); #endif unsigned random_seed = 0; @@ -38,17 +38,17 @@ void initialize(int& argc, char**& argv, bool shared_parameters) { string mem_descriptor = "512"; while(argi < argc) { string arg = argv[argi]; - if (arg == "--cnn-mem" || arg == "--cnn_mem") { + if (arg == "--dynet-mem" || arg == "--dynet_mem") { if ((argi + 1) > argc) { - cerr << "[cnn] --cnn-mem expects an argument (the memory, in megabytes, to reserve)\n"; + cerr << "[dynet] --dynet-mem expects an argument (the memory, in megabytes, to reserve)\n"; abort(); } else { mem_descriptor = argv[argi+1]; remove_args(argc, argv, argi, 2); } - } else if (arg == "--cnn-l2" || arg == "--cnn_l2") { + } else if (arg == "--dynet-l2" || arg == "--dynet_l2") { if ((argi + 1) > argc) { - cerr << "[cnn] --cnn-l2 requires an argument (the weight decay per update)\n"; + cerr << "[dynet] --dynet-l2 requires an argument (the weight decay per update)\n"; abort(); } else { string a2 = argv[argi+1]; @@ -56,22 +56,22 @@ void initialize(int& argc, char**& argv, bool shared_parameters) { istringstream d(a2); d >> decay; remove_args(argc, argv, argi, 2); if (decay < 0 || decay >= 1) { - cerr << "[cnn] weight decay parameter must be between 0 and 1 (probably very small like 1e-6)\n"; + cerr << "[dynet] weight decay parameter must be between 0 and 1 (probably very small like 1e-6)\n"; abort(); } weight_decay_lambda = decay; } - } else if (arg == "--cnn-seed" || arg == "--cnn_seed") { + } else if (arg == "--dynet-seed" || arg == "--dynet_seed") { if ((argi + 1) > argc) { - cerr << "[cnn] --cnn-seed expects an argument (the random number seed)\n"; + cerr << "[dynet] --dynet-seed expects an argument (the random number seed)\n"; abort(); } else { string a2 = argv[argi+1]; istringstream c(a2); c >> random_seed; remove_args(argc, argv, argi, 2); } - } else if (arg.find("--cnn") == 0) { - cerr << "[cnn] Bad command line argument: " << arg << endl; + } else if (arg.find("--dynet") == 0) { + cerr << "[dynet] Bad command line argument: " << arg << endl; abort(); } else { break; } } @@ -79,10 +79,10 @@ void initialize(int& argc, char**& argv, bool shared_parameters) { random_device rd; random_seed = rd(); } - cerr << "[cnn] random seed: " << random_seed << endl; + cerr << "[dynet] random seed: " << random_seed << endl; rndeng = new mt19937(random_seed); - cerr << "[cnn] allocating memory: " << mem_descriptor << "MB\n"; + cerr << "[dynet] allocating memory: " << mem_descriptor << "MB\n"; devices.push_back(new Device_CPU(devices.size(), mem_descriptor, shared_parameters)); int default_index = 0; if (gpudevices.size() > 0) { @@ -96,7 +96,7 @@ void initialize(int& argc, char**& argv, bool shared_parameters) { kSCALAR_MINUSONE = default_device->kSCALAR_MINUSONE; kSCALAR_ONE = default_device->kSCALAR_ONE; kSCALAR_ZERO = default_device->kSCALAR_ZERO; - cerr << "[cnn] memory allocation done.\n"; + cerr << "[dynet] memory allocation done.\n"; } void cleanup() { @@ -107,5 +107,5 @@ void cleanup() { default_device = nullptr; } -} // namespace cnn +} // namespace dynet diff --git a/cnn/init.h b/dynet/init.h similarity index 59% rename from cnn/init.h rename to dynet/init.h index 04c7642b2..66c081636 100644 --- a/cnn/init.h +++ b/dynet/init.h @@ -1,13 +1,13 @@ -#ifndef CNN_EIGEN_INIT_H -#define CNN_EIGEN_INIT_H +#ifndef DYNET_EIGEN_INIT_H +#define DYNET_EIGEN_INIT_H -namespace cnn { +namespace dynet { extern float weight_decay_lambda; void initialize(int& argc, char**& argv, bool shared_parameters = false); void cleanup(); -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/io-macros.h b/dynet/io-macros.h similarity index 90% rename from cnn/io-macros.h rename to dynet/io-macros.h index 8c3ff9b5e..a84f3f68e 100644 --- a/cnn/io-macros.h +++ b/dynet/io-macros.h @@ -1,18 +1,18 @@ -#ifndef CNN_IO_MACROS__ -#define CNN_IO_MACROS__ +#ifndef DYNET_IO_MACROS__ +#define DYNET_IO_MACROS__ #include #include #include #include -#define CNN_SERIALIZE_IMPL(MyClass) \ +#define DYNET_SERIALIZE_IMPL(MyClass) \ template void MyClass::serialize(boost::archive::text_oarchive &ar, const unsigned int); \ template void MyClass::serialize(boost::archive::text_iarchive &ar, const unsigned int); \ template void MyClass::serialize(boost::archive::binary_oarchive &ar, const unsigned int); \ template void MyClass::serialize(boost::archive::binary_iarchive &ar, const unsigned int); -#define CNN_SAVELOAD_IMPL(MyClass) \ +#define DYNET_SAVELOAD_IMPL(MyClass) \ template void MyClass::save(boost::archive::text_oarchive &ar, const unsigned int) const; \ template void MyClass::load(boost::archive::text_iarchive &ar, const unsigned int); \ template void MyClass::save(boost::archive::binary_oarchive &ar, const unsigned int) const; \ diff --git a/cnn/lstm.cc b/dynet/lstm.cc similarity index 97% rename from cnn/lstm.cc rename to dynet/lstm.cc index 19d5c0178..7200a7e69 100644 --- a/cnn/lstm.cc +++ b/dynet/lstm.cc @@ -1,4 +1,4 @@ -#include "cnn/lstm.h" +#include "dynet/lstm.h" #include #include @@ -11,13 +11,13 @@ #include #include -#include "cnn/nodes.h" -#include "cnn/io-macros.h" +#include "dynet/nodes.h" +#include "dynet/io-macros.h" using namespace std; -using namespace cnn::expr; +using namespace dynet::expr; -namespace cnn { +namespace dynet { enum { X2I, H2I, C2I, BI, X2O, H2O, C2O, BO, X2C, H2C, BC }; @@ -212,6 +212,6 @@ void LSTMBuilder::serialize(Archive& ar, const unsigned int) { ar & layers; ar & dropout_rate; } -CNN_SERIALIZE_IMPL(LSTMBuilder); +DYNET_SERIALIZE_IMPL(LSTMBuilder); -} // namespace cnn +} // namespace dynet diff --git a/cnn/lstm.h b/dynet/lstm.h similarity index 91% rename from cnn/lstm.h rename to dynet/lstm.h index 3be8bb68c..a0b147d3f 100644 --- a/cnn/lstm.h +++ b/dynet/lstm.h @@ -1,13 +1,13 @@ -#ifndef CNN_LSTM_H_ -#define CNN_LSTM_H_ +#ifndef DYNET_LSTM_H_ +#define DYNET_LSTM_H_ -#include "cnn/cnn.h" -#include "cnn/rnn.h" -#include "cnn/expr.h" +#include "dynet/dynet.h" +#include "dynet/rnn.h" +#include "dynet/expr.h" -using namespace cnn::expr; +using namespace dynet::expr; -namespace cnn { +namespace dynet { class Model; @@ -67,6 +67,6 @@ struct LSTMBuilder : public RNNBuilder { }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/mem.cc b/dynet/mem.cc similarity index 80% rename from cnn/mem.cc rename to dynet/mem.cc index 577d00bcc..26c95550c 100644 --- a/cnn/mem.cc +++ b/dynet/mem.cc @@ -1,4 +1,4 @@ -#include "cnn/mem.h" +#include "dynet/mem.h" #include #include @@ -12,16 +12,16 @@ #if !_WINDOWS #include #endif -#include "cnn/except.h" +#include "dynet/except.h" #if HAVE_CUDA -#include "cnn/cuda.h" +#include "dynet/cuda.h" #include #include #endif using namespace std; -namespace cnn { +namespace dynet { MemAllocator::~MemAllocator() {} @@ -29,7 +29,7 @@ void* CPUAllocator::malloc(size_t n) { void* ptr = _mm_malloc(n, align); if (!ptr) { cerr << "CPU memory allocation failed n=" << n << " align=" << align << endl; - throw cnn::out_of_memory("CPU memory allocation failed"); + throw dynet::out_of_memory("CPU memory allocation failed"); } return ptr; } @@ -45,12 +45,12 @@ void CPUAllocator::zero(void* p, size_t n) { void* SharedAllocator::malloc(size_t n) { #if _WINDOWS cerr << "Shared memory not supported in Windows" << endl; - throw cnn::out_of_memory("Shared memory allocation failed"); + throw dynet::out_of_memory("Shared memory allocation failed"); #else void* ptr = mmap(NULL, n, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0); if (!ptr) { cerr << "Shared memory allocation failed n=" << n << endl; - throw cnn::out_of_memory("Shared memory allocation failed"); + throw dynet::out_of_memory("Shared memory allocation failed"); } return ptr; #endif @@ -71,7 +71,7 @@ void* GPUAllocator::malloc(size_t n) { CUDA_CHECK(cudaMalloc(&ptr, n)); if (!ptr) { cerr << "GPU memory allocation failed n=" << n << endl; - throw cnn::out_of_memory("GPU memory allocation failed"); + throw dynet::out_of_memory("GPU memory allocation failed"); } return ptr; } @@ -87,4 +87,4 @@ void GPUAllocator::zero(void* p, size_t n) { #endif -} // namespace cnn +} // namespace dynet diff --git a/cnn/mem.h b/dynet/mem.h similarity index 94% rename from cnn/mem.h rename to dynet/mem.h index cf146eedb..c8a0d70fb 100644 --- a/cnn/mem.h +++ b/dynet/mem.h @@ -1,9 +1,9 @@ -#ifndef CNN_MEM_H -#define CNN_MEM_H +#ifndef DYNET_MEM_H +#define DYNET_MEM_H #include -namespace cnn { +namespace dynet { // allocates memory from the device (CPU, GPU) // only used to create the memory pools @@ -47,6 +47,6 @@ struct GPUAllocator : public MemAllocator { }; #endif -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/model.cc b/dynet/model.cc similarity index 93% rename from cnn/model.cc rename to dynet/model.cc index 8b327f988..99c6fe81e 100644 --- a/cnn/model.cc +++ b/dynet/model.cc @@ -1,8 +1,8 @@ -#include "cnn/model.h" -#include "cnn/tensor.h" -#include "cnn/aligned-mem-pool.h" -#include "cnn/cnn.h" -#include "cnn/io-macros.h" +#include "dynet/model.h" +#include "dynet/tensor.h" +#include "dynet/aligned-mem-pool.h" +#include "dynet/dynet.h" +#include "dynet/io-macros.h" #include #include @@ -23,10 +23,10 @@ // Macros for defining functions over parameters // NOTE: This only works on the default device, as parameters are currently defined over default devices #ifdef __CUDACC__ -#define CNN_PARAMNORM_INST_DEV_IMPL(MyParam, regular_func, dev_func) \ +#define DYNET_PARAMNORM_INST_DEV_IMPL(MyParam, regular_func, dev_func) \ template void MyParam::dev_func(Device_GPU & dev, float *sqnorm) const; #elif defined(HAVE_CUDA) -#define CNN_PARAMNORM_INST_DEV_IMPL(MyParam, regular_func, dev_func) \ +#define DYNET_PARAMNORM_INST_DEV_IMPL(MyParam, regular_func, dev_func) \ extern template void MyParam::dev_func(Device_GPU & dev, float *sqnorm) const; \ template void MyParam::dev_func(Device_CPU & dev, float *sqnorm) const; \ void MyParam::regular_func(float *sqnorm) const { \ @@ -35,7 +35,7 @@ else { abort(); } \ } #else -#define CNN_PARAMNORM_INST_DEV_IMPL(MyParam, regular_func, dev_func) \ +#define DYNET_PARAMNORM_INST_DEV_IMPL(MyParam, regular_func, dev_func) \ template void MyParam::dev_func(Device_CPU & dev, float *sqnorm) const; \ void MyParam::regular_func(float *sqnorm) const { \ if(default_device->type == DeviceType::CPU) { dev_func(*(Device_CPU*)default_device,sqnorm); } \ @@ -45,7 +45,7 @@ using namespace std; -namespace cnn { +namespace dynet { // CPU only functions #ifndef __CUDACC__ @@ -90,7 +90,7 @@ void ParameterStorage::serialize(Archive& ar, const unsigned int) { ar & values; ar & g; } -CNN_SERIALIZE_IMPL(ParameterStorage) +DYNET_SERIALIZE_IMPL(ParameterStorage) #endif LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d) { @@ -153,7 +153,7 @@ void LookupParameterStorage::load(Archive& ar, const unsigned int) { ar >> all_grads; initialize_lookups(); } -CNN_SAVELOAD_IMPL(LookupParameterStorage) +DYNET_SAVELOAD_IMPL(LookupParameterStorage) #endif Parameter::Parameter() { @@ -177,7 +177,7 @@ void Parameter::serialize(Archive& ar, const unsigned int) { ar & mp; ar & index; } -CNN_SERIALIZE_IMPL(Parameter) +DYNET_SERIALIZE_IMPL(Parameter) #endif LookupParameter::LookupParameter() { @@ -205,7 +205,7 @@ void LookupParameter::serialize(Archive& ar, const unsigned int) { ar & mp; ar & index; } -CNN_SERIALIZE_IMPL(LookupParameter) +DYNET_SERIALIZE_IMPL(LookupParameter) #endif Model::Model() : gradient_norm_scratch(nullptr) { @@ -276,16 +276,16 @@ void Model::serialize(Archive& ar, const unsigned int) { ar & lookup_params; ar & weight_decay; } -CNN_SERIALIZE_IMPL(Model) +DYNET_SERIALIZE_IMPL(Model) #endif -void save_cnn_model(std::string filename, Model* model) { +void save_dynet_model(std::string filename, Model* model) { std::ofstream out(filename); boost::archive::text_oarchive oa(out); oa << (*model); }; -void load_cnn_model(std::string filename, Model* model) { +void load_dynet_model(std::string filename, Model* model) { std::ifstream in(filename); boost::archive::text_iarchive ia(in); ia >> (*model); @@ -307,7 +307,7 @@ void ParameterStorage::squared_l2norm_dev(MyDevice & dev, float* sqnorm) const { Tensor sqnorm_t({1}, sqnorm, &dev, DeviceMempool::NONE); sqnorm_t.t<0>().device(*dev.edevice) = values.tvec().square().sum(); } -CNN_PARAMNORM_INST_DEV_IMPL(ParameterStorage, squared_l2norm, squared_l2norm_dev) +DYNET_PARAMNORM_INST_DEV_IMPL(ParameterStorage, squared_l2norm, squared_l2norm_dev) // Take the squared norm of the gradient template @@ -316,7 +316,7 @@ void ParameterStorage::g_squared_l2norm_dev(MyDevice & dev, float* sqnorm) const Tensor sqnorm_t({1}, sqnorm, &dev, DeviceMempool::NONE); sqnorm_t.t<0>().device(*dev.edevice) = g.tvec().square().sum(); } -CNN_PARAMNORM_INST_DEV_IMPL(ParameterStorage, g_squared_l2norm, g_squared_l2norm_dev) +DYNET_PARAMNORM_INST_DEV_IMPL(ParameterStorage, g_squared_l2norm, g_squared_l2norm_dev) template void ParameterStorage::accumulate_grad_dev(MyDevice & dev, const Tensor& d) { @@ -394,7 +394,7 @@ void LookupParameterStorage::squared_l2norm_dev(MyDevice & dev, float* sqnorm) c Tensor sqnorm_t({1}, sqnorm, &dev, DeviceMempool::NONE); sqnorm_t.t<0>().device(*dev.edevice) = all_values.tvec().square().sum(); } -CNN_PARAMNORM_INST_DEV_IMPL(LookupParameterStorage, squared_l2norm, squared_l2norm_dev) +DYNET_PARAMNORM_INST_DEV_IMPL(LookupParameterStorage, squared_l2norm, squared_l2norm_dev) template void LookupParameterStorage::g_squared_l2norm_dev(MyDevice & dev, float* sqnorm) const { @@ -404,7 +404,7 @@ void LookupParameterStorage::g_squared_l2norm_dev(MyDevice & dev, float* sqnorm) while(it != non_zero_grads.end()) sqnorm_t.t<0>().device(*dev.edevice) += grads[*(it++)].tvec().square().sum(); } -CNN_PARAMNORM_INST_DEV_IMPL(LookupParameterStorage, g_squared_l2norm, g_squared_l2norm_dev) +DYNET_PARAMNORM_INST_DEV_IMPL(LookupParameterStorage, g_squared_l2norm, g_squared_l2norm_dev) template void LookupParameterStorage::accumulate_grad_dev(MyDevice & dev, unsigned index, const Tensor& d) { @@ -487,7 +487,7 @@ float Model::gradient_l2_norm_dev(MyDevice & dev) const { } #endif -} // namespace cnn +} // namespace dynet -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::ParameterStorage) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::LookupParameterStorage) +BOOST_CLASS_EXPORT_IMPLEMENT(dynet::ParameterStorage) +BOOST_CLASS_EXPORT_IMPLEMENT(dynet::LookupParameterStorage) diff --git a/cnn/model.h b/dynet/model.h similarity index 94% rename from cnn/model.h rename to dynet/model.h index c39ef7c97..ca803164d 100644 --- a/cnn/model.h +++ b/dynet/model.h @@ -1,5 +1,5 @@ -#ifndef CNN_PARAMS_H_ -#define CNN_PARAMS_H_ +#ifndef DYNET_PARAMS_H_ +#define DYNET_PARAMS_H_ #include #include @@ -7,10 +7,10 @@ #include -#include "cnn/tensor.h" -#include "cnn/weight-decay.h" +#include "dynet/tensor.h" +#include "dynet/weight-decay.h" -namespace cnn { +namespace dynet { // to deal with sparse updates, there are two parameter classes: // * Parameters represents a vector, matrix, (eventually higher order tensors) @@ -193,12 +193,12 @@ class Model { mutable float* gradient_norm_scratch; }; -void save_cnn_model(std::string filename, Model* model); -void load_cnn_model(std::string filename, Model* model); +void save_dynet_model(std::string filename, Model* model); +void load_dynet_model(std::string filename, Model* model); -} // namespace cnn +} // namespace dynet -BOOST_CLASS_EXPORT_KEY(cnn::ParameterStorage) -BOOST_CLASS_EXPORT_KEY(cnn::LookupParameterStorage) +BOOST_CLASS_EXPORT_KEY(dynet::ParameterStorage) +BOOST_CLASS_EXPORT_KEY(dynet::LookupParameterStorage) #endif diff --git a/cnn/mp.cc b/dynet/mp.cc similarity index 84% rename from cnn/mp.cc rename to dynet/mp.cc index ce3aa1a7d..5976c1474 100644 --- a/cnn/mp.cc +++ b/dynet/mp.cc @@ -3,34 +3,34 @@ using namespace std; using namespace boost::interprocess; -namespace cnn { +namespace dynet { namespace mp { // TODO: Pass these around instead of having them be global - std::string queue_name = "cnn_mp_work_queue"; - std::string shared_memory_name = "cnn_mp_shared_memory"; + std::string queue_name = "dynet_mp_work_queue"; + std::string shared_memory_name = "dynet_mp_shared_memory"; timespec start_time; bool stop_requested = false; SharedObject* shared_object = nullptr; std::string generate_queue_name() { std::ostringstream ss; - ss << "cnn_mp_work_queue"; + ss << "dynet_mp_work_queue"; ss << rand(); return ss.str(); } std::string generate_shared_memory_name() { std::ostringstream ss; - ss << "cnn_mp_shared_memory"; + ss << "dynet_mp_shared_memory"; ss << rand(); return ss.str(); } - cnn::real sum_values(const std::vector& values) { + dynet::real sum_values(const std::vector& values) { return accumulate(values.begin(), values.end(), 0.0); } - cnn::real mean(const std::vector& values) { + dynet::real mean(const std::vector& values) { return sum_values(values) / values.size(); } @@ -76,4 +76,4 @@ namespace cnn { } } -#endif \ No newline at end of file +#endif diff --git a/cnn/mp.h b/dynet/mp.h similarity index 97% rename from cnn/mp.h rename to dynet/mp.h index 4e962539c..3256f8c5b 100644 --- a/cnn/mp.h +++ b/dynet/mp.h @@ -1,11 +1,11 @@ #pragma once #if !_WINDOWS -#include "cnn/globals.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/expr.h" -#include "cnn/dict.h" -#include "cnn/lstm.h" +#include "dynet/globals.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/expr.h" +#include "dynet/dict.h" +#include "dynet/lstm.h" #include #include #include @@ -25,7 +25,7 @@ #include #include -namespace cnn { +namespace dynet { namespace mp { // TODO: Pass these around instead of having them be global extern std::string queue_name; @@ -98,8 +98,8 @@ namespace cnn { std::string generate_queue_name(); std::string generate_shared_memory_name(); - cnn::real sum_values(const std::vector& values); - cnn::real mean(const std::vector& values); + dynet::real sum_values(const std::vector& values); + dynet::real mean(const std::vector& values); std::string elapsed_time_string(const timespec& start, const timespec& end); @@ -276,7 +276,7 @@ namespace cnn { template void run_multi_process(unsigned num_children, ILearner* learner, Trainer* trainer, const std::vector& train_data, const std::vector& dev_data, unsigned num_iterations, unsigned dev_frequency, unsigned report_frequency) { - //assert (cnn::ps->is_shared()); + //assert (dynet::ps->is_shared()); queue_name = generate_queue_name(); boost::interprocess::message_queue::remove(queue_name.c_str()); boost::interprocess::message_queue::remove(queue_name.c_str()); diff --git a/cnn/nodes-common.cc b/dynet/nodes-common.cc similarity index 99% rename from cnn/nodes-common.cc rename to dynet/nodes-common.cc index 15b1359b1..7b0b0479b 100644 --- a/cnn/nodes-common.cc +++ b/dynet/nodes-common.cc @@ -1,14 +1,14 @@ -#include "cnn/nodes.h" +#include "dynet/nodes.h" #include #include #include -#include "cnn/nodes-macros.h" +#include "dynet/nodes-macros.h" using namespace std; -namespace cnn { +namespace dynet { string AddVectorToAllColumns::as_string(const vector& arg_names) const { ostringstream os; @@ -901,4 +901,4 @@ Dim Zeroes::dim_forward(const vector& xs) const { return dim; } -} // namespace cnn +} // namespace dynet diff --git a/cnn/nodes-contract.cc b/dynet/nodes-contract.cc similarity index 87% rename from cnn/nodes-contract.cc rename to dynet/nodes-contract.cc index 0398418dc..f7a7a30fc 100644 --- a/cnn/nodes-contract.cc +++ b/dynet/nodes-contract.cc @@ -1,17 +1,17 @@ -#include "cnn/nodes-contract.h" +#include "dynet/nodes-contract.h" #include #include #include -#include "cnn/nodes-macros.h" +#include "dynet/nodes-macros.h" // This file takes a long time to compile on GPU. Uncomment this line to skip it. -#define CNN_SKIP_CUDA_CONTRACTIONS +#define DYNET_SKIP_CUDA_CONTRACTIONS using namespace std; -namespace cnn { +namespace dynet { #ifndef __CUDACC__ @@ -71,8 +71,8 @@ Dim InnerProduct3D_1D_1D::dim_forward(const vector& xs) const { // Y_ij = A_ijk * B_k (+ C_ij) template void InnerProduct3D_1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { -#if defined(__CUDACC__) && defined(CNN_SKIP_CUDA_CONTRACTIONS) - throw std::runtime_error("InnerProduct3D_1D::forward_dev_impl disabled on CUDA. Comment out CNN_SKIP_CUDA_CONTRACTIONS in nodes-contract.cc to enable this function."); +#if defined(__CUDACC__) && defined(DYNET_SKIP_CUDA_CONTRACTIONS) + throw std::runtime_error("InnerProduct3D_1D::forward_dev_impl disabled on CUDA. Comment out DYNET_SKIP_CUDA_CONTRACTIONS in nodes-contract.cc to enable this function."); #else auto A = xs[0]->t<3>(); auto b = xs[1]->t<1>(); @@ -94,8 +94,8 @@ void InnerProduct3D_1D::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { -#if defined(__CUDACC__) && defined(CNN_SKIP_CUDA_CONTRACTIONS) - throw std::runtime_error("InnerProduct3D_1D::backward_dev_impl disabled on CUDA. Comment out CNN_SKIP_CUDA_CONTRACTIONS in nodes-contract.cc to enable this function."); +#if defined(__CUDACC__) && defined(DYNET_SKIP_CUDA_CONTRACTIONS) + throw std::runtime_error("InnerProduct3D_1D::backward_dev_impl disabled on CUDA. Comment out DYNET_SKIP_CUDA_CONTRACTIONS in nodes-contract.cc to enable this function."); #else auto tdEdf = dEdf.t<2>(); // 2 tensor typedef Eigen::Tensor::DimensionPair DimPair; @@ -114,13 +114,13 @@ void InnerProduct3D_1D::backward_dev_impl(const MyDevice & dev, } #endif } -CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D) +DYNET_NODE_INST_DEV_IMPL(InnerProduct3D_1D) // Y_ij = A_ijk * B_k * C_j (+ D_i) template void InnerProduct3D_1D_1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { -#if defined(__CUDACC__) && defined(CNN_SKIP_CUDA_CONTRACTIONS) - throw std::runtime_error("InnerProduct3D_1D_1D::forward_dev_impl disabled on CUDA. Comment out CNN_SKIP_CUDA_CONTRACTIONS in nodes-contract.cc to enable this function."); +#if defined(__CUDACC__) && defined(DYNET_SKIP_CUDA_CONTRACTIONS) + throw std::runtime_error("InnerProduct3D_1D_1D::forward_dev_impl disabled on CUDA. Comment out DYNET_SKIP_CUDA_CONTRACTIONS in nodes-contract.cc to enable this function."); #else auto A = xs[0]->t<3>(); auto b = xs[1]->t<1>(); @@ -144,8 +144,8 @@ void InnerProduct3D_1D_1D::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { -#if defined(__CUDACC__) && defined(CNN_SKIP_CUDA_CONTRACTIONS) - throw std::runtime_error("InnerProduct3D_1D_1D::backward_dev_impl disabled on CUDA. Comment out CNN_SKIP_CUDA_CONTRACTIONS in nodes-contract.cc to enable this function."); +#if defined(__CUDACC__) && defined(DYNET_SKIP_CUDA_CONTRACTIONS) + throw std::runtime_error("InnerProduct3D_1D_1D::backward_dev_impl disabled on CUDA. Comment out DYNET_SKIP_CUDA_CONTRACTIONS in nodes-contract.cc to enable this function."); #else auto tdEdf = dEdf.t<1>(); // vector typedef Eigen::Tensor::DimensionPair DimPair; @@ -156,7 +156,7 @@ void InnerProduct3D_1D_1D::backward_dev_impl(const MyDevice & dev, dEdxi.t<3>().device(*dev.edevice) += tdEdf.contract(c, Eigen::array{{}}).contract(b, Eigen::array{{}}); } else if (i == 1) { // vector 1 // TODO these should be reorganized so the contraction is first with tdEdf and then with c or b. - // in theory, that intermediate result could be cached (although CNN doesn't support this). the fact that it + // in theory, that intermediate result could be cached (although DYNET doesn't support this). the fact that it // this part of the product is redone when i=1 and again when i=2 is probably why this is slower // (or maybe it's the contract implementation?) Eigen::array dims({{DimPair(1, 0)}}); @@ -177,7 +177,7 @@ void InnerProduct3D_1D_1D::backward_dev_impl(const MyDevice & dev, } #endif } -CNN_NODE_INST_DEV_IMPL(InnerProduct3D_1D_1D) +DYNET_NODE_INST_DEV_IMPL(InnerProduct3D_1D_1D) -} // namespace cnn +} // namespace dynet diff --git a/cnn/nodes-contract.h b/dynet/nodes-contract.h similarity index 58% rename from cnn/nodes-contract.h rename to dynet/nodes-contract.h index c18aa64b1..03d09ed4c 100644 --- a/cnn/nodes-contract.h +++ b/dynet/nodes-contract.h @@ -1,13 +1,13 @@ -#ifndef CNN_NODES_CONTRACT_H_ -#define CNN_NODES_CONTRACT_H_ +#ifndef DYNET_NODES_CONTRACT_H_ +#define DYNET_NODES_CONTRACT_H_ -#include "cnn/cnn.h" -#include "cnn/devices.h" -#include "cnn/nodes-macros.h" +#include "dynet/dynet.h" +#include "dynet/devices.h" +#include "dynet/nodes-macros.h" -// See nodes-macros.h for more details about CNN_NODE_DEFINE_DEV_IMPL(). +// See nodes-macros.h for more details about DYNET_NODE_DEFINE_DEV_IMPL(). -namespace cnn { +namespace dynet { // Forward: // Y_ij = A_ijk * B_k + C_ij @@ -18,15 +18,15 @@ namespace cnn { // (dE/dC)_ij = (dE/dY)_ij struct InnerProduct3D_1D : public Node { InnerProduct3D_1D(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // Y_i = A_ijk * B_k * C_j struct InnerProduct3D_1D_1D : public Node { InnerProduct3D_1D_1D(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/nodes-conv.cc b/dynet/nodes-conv.cc similarity index 97% rename from cnn/nodes-conv.cc rename to dynet/nodes-conv.cc index b6ab7c30f..4990d13bc 100644 --- a/cnn/nodes-conv.cc +++ b/dynet/nodes-conv.cc @@ -1,21 +1,21 @@ -#include "cnn/nodes-conv.h" +#include "dynet/nodes-conv.h" #include #include #include #include -#include "cnn/functors.h" -#include "cnn/nodes-macros.h" +#include "dynet/functors.h" +#include "dynet/nodes-macros.h" #if HAVE_CUDA -#include "cnn/cuda.h" -#include "cnn/gpu-ops.h" +#include "dynet/cuda.h" +#include "dynet/gpu-ops.h" #endif using namespace std; -namespace cnn { +namespace dynet { #ifndef __CUDACC__ @@ -174,7 +174,7 @@ void AverageColumns::backward_dev_impl(const MyDevice & dev, array broadcasts; broadcasts[0] = 1; broadcasts[1] = xs[0]->d[1]; dEdxi.t<2>().device(*dev.edevice) += (dEdf.t<2>() / (float)xs[0]->d[1]).broadcast(broadcasts); } -CNN_NODE_INST_DEV_IMPL(AverageColumns) +DYNET_NODE_INST_DEV_IMPL(AverageColumns) template void Conv1DNarrow::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -211,7 +211,7 @@ void Conv1DNarrow::backward_dev_impl(const MyDevice & dev, dEdxi.t<2>().chip<1>(k).device(*dev.edevice) += xs[0]->t<2>().chip<1>(j+k) * dEdf.t<2>().chip<1>(j); } } -CNN_NODE_INST_DEV_IMPL(Conv1DNarrow) +DYNET_NODE_INST_DEV_IMPL(Conv1DNarrow) template void Conv1DWide::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -243,7 +243,7 @@ void Conv1DWide::backward_dev_impl(const MyDevice & dev, dEdxi.t<2>().chip<1>(k).device(*dev.edevice) += xs[0]->t<2>().chip<1>(j) * dEdf.t<2>().chip<1>(j + k); } } -CNN_NODE_INST_DEV_IMPL(Conv1DWide) +DYNET_NODE_INST_DEV_IMPL(Conv1DWide) template @@ -305,7 +305,7 @@ void Filter1DNarrow::backward_dev_impl(const MyDevice & dev, } } } -CNN_NODE_INST_DEV_IMPL(Filter1DNarrow) +DYNET_NODE_INST_DEV_IMPL(Filter1DNarrow) template @@ -335,7 +335,7 @@ void FoldRows::backward_dev_impl(const MyDevice & dev, // for (unsigned j = 0; j < nrows; ++j) // dEdxi.tb<2>().chip<0>(i * nrows + j) += d.tb<2>().chip<0>(i); } -CNN_NODE_INST_DEV_IMPL(FoldRows) +DYNET_NODE_INST_DEV_IMPL(FoldRows) template void KMaxPooling::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -404,7 +404,7 @@ void KMaxPooling::backward_dev_impl(const MyDevice & dev, for(unsigned j = 0; j < k; ++j, ++maxmap) dEdxi.t<2>().chip<1>(*maxmap).chip<0>(i).device(*dev.edevice) += dEdf.t<2>().chip<1>(j).chip<0>(i); } -CNN_NODE_INST_DEV_IMPL(KMaxPooling) +DYNET_NODE_INST_DEV_IMPL(KMaxPooling) template void SumColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -431,7 +431,7 @@ void SumColumns::backward_dev_impl(const MyDevice & dev, array broadcasts; broadcasts[0] = 1; broadcasts[1] = xs[0]->d[1]; dEdxi.t<2>().device(*dev.edevice) += dEdf.t<2>().broadcast(broadcasts); } -CNN_NODE_INST_DEV_IMPL(SumColumns) +DYNET_NODE_INST_DEV_IMPL(SumColumns) -} // namespace cnn +} // namespace dynet diff --git a/cnn/nodes-conv.h b/dynet/nodes-conv.h similarity index 79% rename from cnn/nodes-conv.h rename to dynet/nodes-conv.h index f5efe9c13..6277d8aeb 100644 --- a/cnn/nodes-conv.h +++ b/dynet/nodes-conv.h @@ -1,16 +1,16 @@ -#ifndef CNN_NODES_CONV_H_ -#define CNN_NODES_CONV_H_ +#ifndef DYNET_NODES_CONV_H_ +#define DYNET_NODES_CONV_H_ -#include "cnn/cnn.h" -#include "cnn/nodes-macros.h" +#include "dynet/dynet.h" +#include "dynet/nodes-macros.h" -namespace cnn { +namespace dynet { // with a single argument x \in R^{n x m} // y_i = \sum_j x_i,j / m struct AverageColumns : public Node { template explicit AverageColumns(const T& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = x_1 *conv x_2 @@ -18,7 +18,7 @@ struct AverageColumns : public Node { // x_2 \in R^{d x m} (filter) struct Conv1DNarrow : public Node { explicit Conv1DNarrow(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = x_1 *conv x_2 @@ -26,7 +26,7 @@ struct Conv1DNarrow : public Node { // x_2 \in R^{d x m} (filter) struct Conv1DWide : public Node { explicit Conv1DWide(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = x_1 *filter x_2 @@ -34,19 +34,19 @@ struct Conv1DWide : public Node { // x_2 \in R^{d x m} (filter) struct Filter1DNarrow : public Node { explicit Filter1DNarrow(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; struct FoldRows : public Node { explicit FoldRows(const std::initializer_list& a, unsigned nrows) : Node(a), nrows(nrows) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() unsigned nrows; }; struct KMaxPooling : public Node { explicit KMaxPooling(const std::initializer_list& a, unsigned k = 1) : Node(a), k(k) {} size_t aux_storage_size() const override; - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() unsigned k; }; @@ -55,9 +55,9 @@ struct KMaxPooling : public Node { // if you want to reweight the columns and then sum them, use MatrixMultiply struct SumColumns : public Node { template explicit SumColumns(const T& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/nodes-macros.h b/dynet/nodes-macros.h similarity index 84% rename from cnn/nodes-macros.h rename to dynet/nodes-macros.h index ce30eb30b..03d9e94a3 100644 --- a/cnn/nodes-macros.h +++ b/dynet/nodes-macros.h @@ -1,9 +1,9 @@ -#ifndef CNN_NODE_MACROS_H_ -#define CNN_NODE_MACROS_H_ +#ifndef DYNET_NODE_MACROS_H_ +#define DYNET_NODE_MACROS_H_ -#include "cnn/dim.h" +#include "dynet/dim.h" -namespace cnn { +namespace dynet { inline bool LooksLikeVector(const Dim& d) { if (d.ndims() == 1) return true; @@ -17,7 +17,7 @@ inline bool LooksLikeVector(const Dim& d) { } // A macro to dispatch things to the appropriate device -#define CNN_NODE_DEFINE_DEV_IMPL() \ +#define DYNET_NODE_DEFINE_DEV_IMPL() \ std::string as_string(const std::vector& arg_names) const override; \ Dim dim_forward(const std::vector& xs) const override; \ void forward_impl(const std::vector& xs, Tensor& fx) const override; \ @@ -44,7 +44,7 @@ inline bool LooksLikeVector(const Dim& d) { // If the implementation is different for both devices, use #ifdef __CUDACC__ // within the function, and create alternative code paths for CPU and GPU implementations #ifdef __CUDACC__ -#define CNN_NODE_INST_DEV_IMPL(MyNode) \ +#define DYNET_NODE_INST_DEV_IMPL(MyNode) \ template void MyNode::forward_dev_impl(const Device_GPU & dev, const vector& xs, Tensor& fx) const; \ template void MyNode::backward_dev_impl(const Device_GPU & dev, \ const vector& xs, \ @@ -55,7 +55,7 @@ inline bool LooksLikeVector(const Dim& d) { #elif HAVE_CUDA // When we have CUDA, make sure we extern the GPU code to make sure that it is only // generated by CUDACC -#define CNN_NODE_INST_DEV_IMPL(MyNode) \ +#define DYNET_NODE_INST_DEV_IMPL(MyNode) \ extern template void MyNode::forward_dev_impl(const Device_GPU & dev, const vector& xs, Tensor& fx) const; \ extern template void MyNode::backward_dev_impl(const Device_GPU & dev, \ const vector& xs, \ @@ -72,8 +72,8 @@ inline bool LooksLikeVector(const Dim& d) { Tensor& dEdxi) const; \ void MyNode::forward_impl(const std::vector& xs, Tensor& fx) const { \ assert(fx.device); \ - if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ - else if(fx.device->type == DeviceType::GPU) { forward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx); } \ + if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(dynet::Device_CPU*)fx.device,xs,fx); } \ + else if(fx.device->type == DeviceType::GPU) { forward_dev_impl(*(dynet::Device_GPU*)fx.device,xs,fx); } \ else { abort(); } \ } \ void MyNode::backward_impl(const std::vector& xs, \ @@ -82,12 +82,12 @@ inline bool LooksLikeVector(const Dim& d) { unsigned i, \ Tensor& dEdxi) const { \ assert(fx.device); \ - if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ - else if(fx.device->type == DeviceType::GPU) { backward_dev_impl(*(cnn::Device_GPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ + if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(dynet::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ + else if(fx.device->type == DeviceType::GPU) { backward_dev_impl(*(dynet::Device_GPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ else { abort(); } \ } #else -#define CNN_NODE_INST_DEV_IMPL(MyNode) \ +#define DYNET_NODE_INST_DEV_IMPL(MyNode) \ template void MyNode::forward_dev_impl(const Device_CPU & dev, const vector& xs, Tensor& fx) const; \ template void MyNode::backward_dev_impl(const Device_CPU & dev, \ const vector& xs, \ @@ -97,7 +97,7 @@ inline bool LooksLikeVector(const Dim& d) { Tensor& dEdxi) const; \ void MyNode::forward_impl(const std::vector& xs, Tensor& fx) const { \ assert(fx.device); \ - if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx); } \ + if(fx.device->type == DeviceType::CPU) { forward_dev_impl(*(dynet::Device_CPU*)fx.device,xs,fx); } \ else { abort(); } \ } \ void MyNode::backward_impl(const std::vector& xs, \ @@ -106,7 +106,7 @@ inline bool LooksLikeVector(const Dim& d) { unsigned i, \ Tensor& dEdxi) const { \ assert(fx.device); \ - if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(cnn::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ + if(fx.device->type == DeviceType::CPU) { backward_dev_impl(*(dynet::Device_CPU*)fx.device,xs,fx,dEdf,i,dEdxi); } \ else { abort(); } \ } #endif diff --git a/cnn/nodes.cc b/dynet/nodes.cc similarity index 96% rename from cnn/nodes.cc rename to dynet/nodes.cc index 4dba691f2..58424e1b6 100644 --- a/cnn/nodes.cc +++ b/dynet/nodes.cc @@ -1,16 +1,16 @@ -#include "cnn/nodes.h" +#include "dynet/nodes.h" #include #include #include -#include "cnn/simd-functors.h" -#include "cnn/functors.h" -#include "cnn/nodes-macros.h" +#include "dynet/simd-functors.h" +#include "dynet/functors.h" +#include "dynet/nodes-macros.h" #ifdef HAVE_CUDA -#include "cnn/cuda.h" -#include "cnn/gpu-ops.h" +#include "dynet/cuda.h" +#include "dynet/gpu-ops.h" #endif using namespace std; @@ -24,7 +24,7 @@ using namespace std; // the same x_i. Even, e.g., Identity must be implemented as // dEdx1 += dEdf. THIS IS EXTREMELY IMPORTANT // 5) scalars results of forward are placed in fx.v[0] -// 6) CNN manages its own memory, not Eigen, and it is configured with the +// 6) DYNET manages its own memory, not Eigen, and it is configured with the // EIGEN_NO_MALLOC option. If you get an error about Eigen attempting to allocate // memory, it is (probably) because of an implicit creation of a temporary variable. // To tell Eigen this is not necessary, the noalias() method is available. If you really @@ -35,7 +35,7 @@ using namespace std; // 2) dEdxi must accummulate (see point 4 above!) // -namespace cnn { +namespace dynet { // ======= Shared definitions #define MAX_LOG_SUM_EXP 65536 @@ -221,7 +221,7 @@ void AddVectorToAllColumns::backward_dev_impl(const MyDevice & dev, // TODO: This is not great. Can we use broadcasting similar to SumColumns? } } -CNN_NODE_INST_DEV_IMPL(AddVectorToAllColumns) +DYNET_NODE_INST_DEV_IMPL(AddVectorToAllColumns) // Affine transform uses different implementations for CPU and GPU because this is // much faster than using Eigen's tensor contractions (as of the writing) @@ -338,7 +338,7 @@ void AffineTransform::backward_dev_impl(const MyDevice & dev, #endif } } -CNN_NODE_INST_DEV_IMPL(AffineTransform) +DYNET_NODE_INST_DEV_IMPL(AffineTransform) template void Average::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -369,7 +369,7 @@ void Average::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += (dEdf.tvec() / (float)xs.size()); } -CNN_NODE_INST_DEV_IMPL(Average) +DYNET_NODE_INST_DEV_IMPL(Average) template void Concatenate::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -408,7 +408,7 @@ void Concatenate::backward_dev_impl(const MyDevice & dev, dEdxi.t<2>().device(*dev.edevice) += dEdf.tb<2>().chip<2>(b).slice(indices, sizes); } } -CNN_NODE_INST_DEV_IMPL(Concatenate) +DYNET_NODE_INST_DEV_IMPL(Concatenate) template void ConcatenateColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -444,7 +444,7 @@ void ConcatenateColumns::backward_dev_impl(const MyDevice & dev, *dEdxi += (*dEdf).middleCols(curr_col, col_size); #endif } -CNN_NODE_INST_DEV_IMPL(ConcatenateColumns) +DYNET_NODE_INST_DEV_IMPL(ConcatenateColumns) template void BinaryLogLoss::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -460,7 +460,7 @@ void BinaryLogLoss::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += xs[i]->tvec().binaryExpr(xs[1-i]->tvec(), FBinaryLogLossBackward(as_scalar(dEdf))); } -CNN_NODE_INST_DEV_IMPL(BinaryLogLoss) +DYNET_NODE_INST_DEV_IMPL(BinaryLogLoss) template void BlockDropout::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -485,7 +485,7 @@ void BlockDropout::backward_dev_impl(const MyDevice & dev, float block_multiplier = *(static_cast(aux_mem)); dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * block_multiplier; } -CNN_NODE_INST_DEV_IMPL(BlockDropout) +DYNET_NODE_INST_DEV_IMPL(BlockDropout) template void ConstantMinusX::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -501,7 +501,7 @@ void ConstantMinusX::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) -= dEdf.tvec(); } -CNN_NODE_INST_DEV_IMPL(ConstantMinusX) +DYNET_NODE_INST_DEV_IMPL(ConstantMinusX) template void ConstantPlusX::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -517,7 +517,7 @@ void ConstantPlusX::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); } -CNN_NODE_INST_DEV_IMPL(ConstantPlusX) +DYNET_NODE_INST_DEV_IMPL(ConstantPlusX) template void ConstScalarMultiply::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -534,7 +534,7 @@ void ConstScalarMultiply::backward_dev_impl(const MyDevice & dev, assert(i == 0); dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * alpha; } -CNN_NODE_INST_DEV_IMPL(ConstScalarMultiply) +DYNET_NODE_INST_DEV_IMPL(ConstScalarMultiply) template void Cube::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -550,7 +550,7 @@ void Cube::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * xs[0]->tvec().square() * 3.f; } -CNN_NODE_INST_DEV_IMPL(Cube) +DYNET_NODE_INST_DEV_IMPL(Cube) template void CwiseQuotient::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -597,7 +597,7 @@ void CwiseQuotient::backward_dev_impl(const MyDevice & dev, } } } -CNN_NODE_INST_DEV_IMPL(CwiseQuotient) +DYNET_NODE_INST_DEV_IMPL(CwiseQuotient) template void CwiseMultiply::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -631,7 +631,7 @@ void CwiseMultiply::backward_dev_impl(const MyDevice & dev, dEdxi.t<1>().device(*dev.edevice) += (dEdf.tb<1>() * xs[1-i]->tb<1>()).sum(red_axis); } } -CNN_NODE_INST_DEV_IMPL(CwiseMultiply) +DYNET_NODE_INST_DEV_IMPL(CwiseMultiply) template @@ -672,7 +672,7 @@ void DotProduct::backward_dev_impl(const MyDevice & dev, } } } -CNN_NODE_INST_DEV_IMPL(DotProduct) +DYNET_NODE_INST_DEV_IMPL(DotProduct) template void Dropout::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -691,7 +691,7 @@ void Dropout::backward_dev_impl(const MyDevice & dev, Tensor m(dim, (float*)aux_mem, fx.device, DeviceMempool::FXS); dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * m.tvec(); } -CNN_NODE_INST_DEV_IMPL(Dropout) +DYNET_NODE_INST_DEV_IMPL(Dropout) template void Erf::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -707,7 +707,7 @@ void Erf::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += xs[0]->tvec().binaryExpr(dEdf.tvec(), scalar_erf_backward_op()); } -CNN_NODE_INST_DEV_IMPL(Erf) +DYNET_NODE_INST_DEV_IMPL(Erf) template void Exp::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -723,7 +723,7 @@ void Exp::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * fx.tvec(); } -CNN_NODE_INST_DEV_IMPL(Exp) +DYNET_NODE_INST_DEV_IMPL(Exp) template void GaussianNoise::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -741,7 +741,7 @@ void GaussianNoise::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); } -CNN_NODE_INST_DEV_IMPL(GaussianNoise) +DYNET_NODE_INST_DEV_IMPL(GaussianNoise) template void Hinge::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -801,7 +801,7 @@ void Hinge::backward_dev_impl(const MyDevice & dev, } } } -CNN_NODE_INST_DEV_IMPL(Hinge) +DYNET_NODE_INST_DEV_IMPL(Hinge) template void HuberDistance::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -819,7 +819,7 @@ void HuberDistance::backward_dev_impl(const MyDevice & dev, assert(i < 2); dEdxi.tvec().device(*dev.edevice) += (xs[i]->tvec() - xs[1-i]->tvec()).unaryExpr(FHuberBackward(d, as_scalar(dEdf))); } -CNN_NODE_INST_DEV_IMPL(HuberDistance) +DYNET_NODE_INST_DEV_IMPL(HuberDistance) template void Identity::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -836,7 +836,7 @@ void Identity::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); } -CNN_NODE_INST_DEV_IMPL(Identity) +DYNET_NODE_INST_DEV_IMPL(Identity) template void KMHNGram::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -872,7 +872,7 @@ void KMHNGram::backward_dev_impl(const MyDevice & dev, (*dEdxi).col(j+k) += (*dEdf).col(j); #endif } -CNN_NODE_INST_DEV_IMPL(KMHNGram) +DYNET_NODE_INST_DEV_IMPL(KMHNGram) template void L1Distance::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -890,7 +890,7 @@ void L1Distance::backward_dev_impl(const MyDevice & dev, assert(i < 2); dEdxi.tvec().device(*dev.edevice) += (xs[i]->tvec() - xs[1-i]->tvec()).unaryExpr(FL1Backward(as_scalar(dEdf))); } -CNN_NODE_INST_DEV_IMPL(L1Distance) +DYNET_NODE_INST_DEV_IMPL(L1Distance) template void Log::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -906,7 +906,7 @@ void Log::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() / xs[0]->tvec(); } -CNN_NODE_INST_DEV_IMPL(Log) +DYNET_NODE_INST_DEV_IMPL(Log) template void LogDet::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -931,7 +931,7 @@ void LogDet::backward_dev_impl(const MyDevice & dev, (*dEdxi) += (dEdf.v[0]) * trans.inverse(); #endif } -CNN_NODE_INST_DEV_IMPL(LogDet) +DYNET_NODE_INST_DEV_IMPL(LogDet) template void LogGamma::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -948,7 +948,7 @@ void LogGamma::backward_dev_impl(const MyDevice & dev, // dEdxi.tvec().device(*dev.edevice) += xs[0]->tvec().binaryExpr(dEdf.tvec(), FLogGammaBackward()); dEdxi.tvec().device(*dev.edevice) += xs[0]->tvec().digamma() * dEdf.tvec(); } -CNN_NODE_INST_DEV_IMPL(LogGamma) +DYNET_NODE_INST_DEV_IMPL(LogGamma) template void LogisticSigmoid::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -965,7 +965,7 @@ void LogisticSigmoid::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), scalar_logistic_sigmoid_backward_op()); } -CNN_NODE_INST_DEV_IMPL(LogisticSigmoid) +DYNET_NODE_INST_DEV_IMPL(LogisticSigmoid) template void LogSoftmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1004,7 +1004,7 @@ void LogSoftmax::backward_dev_impl(const MyDevice & dev, dEdxi.tb<1>().device(*dev.edevice) += fx.tb<1>().exp() * -z.tb<1>().broadcast(bcast) + dEdf.tb<1>(); } } -CNN_NODE_INST_DEV_IMPL(LogSoftmax) +DYNET_NODE_INST_DEV_IMPL(LogSoftmax) template void LogSumExp::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1036,7 +1036,7 @@ void LogSumExp::backward_dev_impl(const MyDevice & dev, dEdxi.t<1>().device(*dev.edevice) += (xs[i]->t<1>() - fx.t<1>()).exp() * dEdf.t<1>(); } } -CNN_NODE_INST_DEV_IMPL(LogSumExp) +DYNET_NODE_INST_DEV_IMPL(LogSumExp) template void MatrixInverse::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1068,7 +1068,7 @@ void MatrixInverse::backward_dev_impl(const MyDevice & dev, (*dEdxi) -= y * d * y; #endif } -CNN_NODE_INST_DEV_IMPL(MatrixInverse) +DYNET_NODE_INST_DEV_IMPL(MatrixInverse) template void MatrixMultiply::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1157,7 +1157,7 @@ void MatrixMultiply::backward_dev_impl(const MyDevice & dev, } #endif } -CNN_NODE_INST_DEV_IMPL(MatrixMultiply) +DYNET_NODE_INST_DEV_IMPL(MatrixMultiply) template void Max::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1181,7 +1181,7 @@ void Max::backward_dev_impl(const MyDevice & dev, dEdxi.tvec().device(*dev.edevice) += t.tvec().binaryExpr(dEdf.tvec(), FMaxBackwardInv()); } } -CNN_NODE_INST_DEV_IMPL(Max) +DYNET_NODE_INST_DEV_IMPL(Max) template void NoBackprop::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1198,7 +1198,7 @@ void NoBackprop::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { // no op } -CNN_NODE_INST_DEV_IMPL(NoBackprop) +DYNET_NODE_INST_DEV_IMPL(NoBackprop) template void MaxPooling1D::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1250,7 +1250,7 @@ void MaxPooling1D::backward_dev_impl(const MyDevice & dev, return dEdx; #endif } -CNN_NODE_INST_DEV_IMPL(MaxPooling1D) +DYNET_NODE_INST_DEV_IMPL(MaxPooling1D) template void Min::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1274,7 +1274,7 @@ void Min::backward_dev_impl(const MyDevice & dev, dEdxi.tvec().device(*dev.edevice) += t.tvec().binaryExpr(dEdf.tvec(), FMaxBackwardInv()); } } -CNN_NODE_INST_DEV_IMPL(Min) +DYNET_NODE_INST_DEV_IMPL(Min) template void Negate::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1292,7 +1292,7 @@ void Negate::backward_dev_impl(const MyDevice & dev, assert(i == 0); dEdxi.tvec().device(*dev.edevice) -= dEdf.tvec(); } -CNN_NODE_INST_DEV_IMPL(Negate) +DYNET_NODE_INST_DEV_IMPL(Negate) template void PairwiseRankLoss::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1312,7 +1312,7 @@ void PairwiseRankLoss::backward_dev_impl(const MyDevice & dev, dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), FRectifyBackward()); } } -CNN_NODE_INST_DEV_IMPL(PairwiseRankLoss) +DYNET_NODE_INST_DEV_IMPL(PairwiseRankLoss) // x_1 is a vector // y = (x_1)_{*pval} @@ -1365,7 +1365,7 @@ void PickElement::backward_dev_impl(const MyDevice & dev, #endif } } -CNN_NODE_INST_DEV_IMPL(PickElement) +DYNET_NODE_INST_DEV_IMPL(PickElement) template void PickNegLogSoftmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1421,7 +1421,7 @@ void PickNegLogSoftmax::backward_dev_impl(const MyDevice & dev, throw std::runtime_error("PickNegLogSoftmax::backward not yet implemented for multiple columns"); } } -CNN_NODE_INST_DEV_IMPL(PickNegLogSoftmax) +DYNET_NODE_INST_DEV_IMPL(PickNegLogSoftmax) // x_1 is a matrix // y = (x_1)[start:end] @@ -1445,7 +1445,7 @@ void PickRange::backward_dev_impl(const MyDevice & dev, Eigen::DSizes sizes(end-start,fx.d.cols(),fx.d.bd); dEdxi.tb<2>().slice(indices, sizes).device(*dev.edevice) += dEdf.tb<2>(); } -CNN_NODE_INST_DEV_IMPL(PickRange) +DYNET_NODE_INST_DEV_IMPL(PickRange) template void PoissonRegressionLoss::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1465,7 +1465,7 @@ void PoissonRegressionLoss::backward_dev_impl(const MyDevice & dev, const real y = *pty; dEdxi.t<0>().device(*dev.edevice) += xs[0]->t<0>().exp() - y; } -CNN_NODE_INST_DEV_IMPL(PoissonRegressionLoss) +DYNET_NODE_INST_DEV_IMPL(PoissonRegressionLoss) template void Pow::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1493,7 +1493,7 @@ void Pow::backward_dev_impl(const MyDevice & dev, dEdxi.t<0>().device(*dev.edevice) += (fx.tvec() * xs[0]->tvec().log() * dEdf.tvec()).sum(); } } -CNN_NODE_INST_DEV_IMPL(Pow) +DYNET_NODE_INST_DEV_IMPL(Pow) template void Rectify::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1510,7 +1510,7 @@ void Rectify::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), FRectifyBackward()); } -CNN_NODE_INST_DEV_IMPL(Rectify) +DYNET_NODE_INST_DEV_IMPL(Rectify) template void Reshape::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1529,7 +1529,7 @@ void Reshape::backward_dev_impl(const MyDevice & dev, const Tensor reshaped(dEdxi.d, dEdf.v, dEdxi.device, dEdf.mem_pool); dEdxi.tvec().device(*dev.edevice) += reshaped.tvec(); } -CNN_NODE_INST_DEV_IMPL(Reshape) +DYNET_NODE_INST_DEV_IMPL(Reshape) template void RestrictedLogSoftmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1568,7 +1568,7 @@ void RestrictedLogSoftmax::backward_dev_impl(const MyDevice & dev, (*dEdxi)(ind, 0) += (*dEdf)(ind, 0) - expf((*fx)(ind, 0)) * z; #endif } -CNN_NODE_INST_DEV_IMPL(RestrictedLogSoftmax) +DYNET_NODE_INST_DEV_IMPL(RestrictedLogSoftmax) template void SelectCols::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1590,7 +1590,7 @@ void SelectCols::backward_dev_impl(const MyDevice & dev, for (unsigned i = 0; i < rm.size(); ++i) dEdxi.t<2>().chip<1>(rm[i]).device(*dev.edevice) = dEdf.t<2>().chip<1>(i); } -CNN_NODE_INST_DEV_IMPL(SelectCols) +DYNET_NODE_INST_DEV_IMPL(SelectCols) template void SelectRows::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1614,7 +1614,7 @@ void SelectRows::backward_dev_impl(const MyDevice & dev, dEdxi.t<2>().chip<0>(rm[i]) = dEdf.t<2>().chip<0>(i); // dEdxi.t<2>().device(*dev.edevice).chip<0>(rm[i]) = dEdf.t<2>().chip<0>(i); } -CNN_NODE_INST_DEV_IMPL(SelectRows) +DYNET_NODE_INST_DEV_IMPL(SelectRows) template void Softmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1661,7 +1661,7 @@ void Softmax::backward_dev_impl(const MyDevice & dev, } } } -CNN_NODE_INST_DEV_IMPL(Softmax) +DYNET_NODE_INST_DEV_IMPL(Softmax) template void SoftSign::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1678,7 +1678,7 @@ void SoftSign::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), FSoftSignBackward()); } -CNN_NODE_INST_DEV_IMPL(SoftSign) +DYNET_NODE_INST_DEV_IMPL(SoftSign) template void Sparsemax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1732,7 +1732,7 @@ void Sparsemax::backward_dev_impl(const MyDevice & dev, (*dEdxi)(support[i], 0) += d(support[i], 0) - dhat; #endif } -CNN_NODE_INST_DEV_IMPL(Sparsemax) +DYNET_NODE_INST_DEV_IMPL(Sparsemax) template void SparsemaxLoss::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1792,7 +1792,7 @@ void SparsemaxLoss::backward_dev_impl(const MyDevice & dev, (*dEdxi)((*pq)[i], 0) -= dqprop; #endif } -CNN_NODE_INST_DEV_IMPL(SparsemaxLoss) +DYNET_NODE_INST_DEV_IMPL(SparsemaxLoss) template void Square::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1808,7 +1808,7 @@ void Square::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * xs[0]->tvec() * 2.f; } -CNN_NODE_INST_DEV_IMPL(Square) +DYNET_NODE_INST_DEV_IMPL(Square) template void SquaredEuclideanDistance::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1828,7 +1828,7 @@ void SquaredEuclideanDistance::backward_dev_impl(const MyDevice & dev, if (i == 1) scale = -scale; dEdxi.tvec().device(*dev.edevice) += (xs[0]->tvec() - xs[1]->tvec()) * scale; } -CNN_NODE_INST_DEV_IMPL(SquaredEuclideanDistance) +DYNET_NODE_INST_DEV_IMPL(SquaredEuclideanDistance) template void SquaredNorm::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1847,7 +1847,7 @@ void SquaredNorm::backward_dev_impl(const MyDevice & dev, real scale = as_scalar(dEdf) * 2; dEdxi.tvec().device(*dev.edevice) += xs[0]->tvec() * scale; } -CNN_NODE_INST_DEV_IMPL(SquaredNorm) +DYNET_NODE_INST_DEV_IMPL(SquaredNorm) template void Sqrt::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1863,7 +1863,7 @@ void Sqrt::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), FSqrtBackward()); } -CNN_NODE_INST_DEV_IMPL(Sqrt) +DYNET_NODE_INST_DEV_IMPL(Sqrt) template void Sum::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1904,7 +1904,7 @@ void Sum::backward_dev_impl(const MyDevice & dev, dEdxi.vec() += dEdf.vec(); #endif } -CNN_NODE_INST_DEV_IMPL(Sum) +DYNET_NODE_INST_DEV_IMPL(Sum) template void SumBatches::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1944,7 +1944,7 @@ void SumBatches::backward_dev_impl(const MyDevice & dev, dEdxi.batch_matrix(i) += *dEdf; #endif } -CNN_NODE_INST_DEV_IMPL(SumBatches) +DYNET_NODE_INST_DEV_IMPL(SumBatches) template void TraceOfProduct::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1973,7 +1973,7 @@ void TraceOfProduct::backward_dev_impl(const MyDevice & dev, *dEdxi += d * xother; #endif } -CNN_NODE_INST_DEV_IMPL(TraceOfProduct) +DYNET_NODE_INST_DEV_IMPL(TraceOfProduct) template void Tanh::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -1989,7 +1989,7 @@ void Tanh::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { dEdxi.tvec().device(*dev.edevice) += fx.tvec().binaryExpr(dEdf.tvec(), scalar_tanh_backward_op()); } -CNN_NODE_INST_DEV_IMPL(Tanh) +DYNET_NODE_INST_DEV_IMPL(Tanh) template void Transpose::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -2023,7 +2023,7 @@ void Transpose::backward_dev_impl(const MyDevice & dev, dEdxi.batch_matrix(b) += dEdf.batch_matrix(b).transpose(); #endif } -CNN_NODE_INST_DEV_IMPL(Transpose) +DYNET_NODE_INST_DEV_IMPL(Transpose) template void Zeroes::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -2040,6 +2040,6 @@ void Zeroes::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { throw std::runtime_error("Called backward() on an arity 0 node"); } -CNN_NODE_INST_DEV_IMPL(Zeroes) +DYNET_NODE_INST_DEV_IMPL(Zeroes) -} // namespace cnn +} // namespace dynet diff --git a/cnn/nodes.h b/dynet/nodes.h similarity index 89% rename from cnn/nodes.h rename to dynet/nodes.h index 95bdf0f02..35da8170a 100644 --- a/cnn/nodes.h +++ b/dynet/nodes.h @@ -1,19 +1,19 @@ -#ifndef CNN_NODES_H_ -#define CNN_NODES_H_ +#ifndef DYNET_NODES_H_ +#define DYNET_NODES_H_ -#include "cnn/cnn.h" -#include "cnn/devices.h" -#include "cnn/nodes-macros.h" +#include "dynet/dynet.h" +#include "dynet/devices.h" +#include "dynet/nodes-macros.h" -// See nodes-macros.h for more details about CNN_NODE_DEFINE_DEV_IMPL(). +// See nodes-macros.h for more details about DYNET_NODE_DEFINE_DEV_IMPL(). -namespace cnn { +namespace dynet { // M = x_0, v = x_1 // y = M + v (broadcasting over columns) struct AddVectorToAllColumns : public Node { explicit AddVectorToAllColumns(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = L_sparsemax(x_0; q) @@ -22,7 +22,7 @@ struct AddVectorToAllColumns : public Node { struct SparsemaxLoss : public Node { explicit SparsemaxLoss(const std::initializer_list& a, const std::vector& target) : Node(a), q(target), pq(&q) {} explicit SparsemaxLoss(const std::initializer_list& a, const std::vector* ptarget) : Node(a), q(), pq(ptarget) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; const std::vector q; const std::vector* pq; @@ -32,7 +32,7 @@ struct SparsemaxLoss : public Node { // y = arg min_y ||y - x||^2 struct Sparsemax : public Node { explicit Sparsemax(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; }; @@ -40,7 +40,7 @@ struct Sparsemax : public Node { // x = an invertible matrix struct MatrixInverse : public Node { explicit MatrixInverse(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = select_rows(x, rows) @@ -48,7 +48,7 @@ struct MatrixInverse : public Node { struct SelectRows : public Node { explicit SelectRows(const std::initializer_list& a, const std::vector& r) : Node(a), rows(r), prows(&rows) {} explicit SelectRows(const std::initializer_list& a, const std::vector* pr) : Node(a), prows(pr) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() std::vector rows; const std::vector* prows; }; @@ -58,7 +58,7 @@ struct SelectRows : public Node { struct SelectCols : public Node { explicit SelectCols(const std::initializer_list& a, const std::vector& c) : Node(a), cols(c), pcols(&cols) {} explicit SelectCols(const std::initializer_list& a, const std::vector* pc) : Node(a), pcols(pc) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() std::vector cols; const std::vector* pcols; }; @@ -67,13 +67,13 @@ struct SelectCols : public Node { // x_2 raise every element in x_1 to the power of scalar x_2 struct Pow : public Node { explicit Pow(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = min{x_1, x_2} struct Min : public Node { explicit Min(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; }; @@ -81,7 +81,7 @@ struct Min : public Node { // y = max{x_1, x_2} struct Max : public Node { template explicit Max(const T& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; }; @@ -89,14 +89,14 @@ struct Max : public Node { // y = Tr(x_1 * x_2^T) struct TraceOfProduct : public Node { explicit TraceOfProduct(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = alpha * x_1 struct ConstScalarMultiply : public Node { explicit ConstScalarMultiply(const std::initializer_list& a, float alpha) : Node(a), alpha(alpha) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() float alpha; }; @@ -104,7 +104,7 @@ struct ConstScalarMultiply : public Node { struct DotProduct : public Node { explicit DotProduct(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = x_1^T @@ -112,21 +112,21 @@ struct DotProduct : public Node { // if you have a matrix as input, the runtime is O(mn) - try to avoid using this struct Transpose : public Node { explicit Transpose(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } }; // y = reshape(x_1, --> to) struct Reshape : public Node { explicit Reshape(const std::initializer_list& a, const Dim& to) : Node(a), to(to) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() Dim to; }; // y_i = \sum_{j=1}^n x_1:{i-1+j} struct KMHNGram : public Node { explicit KMHNGram(const std::initializer_list& a, unsigned n) : Node(a), n(n) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() unsigned n; // width, n=2 for Karl's paper }; @@ -134,7 +134,7 @@ struct KMHNGram : public Node { // y = x + n struct GaussianNoise : public Node { explicit GaussianNoise(const std::initializer_list& a, real stddev) : Node(a), stddev(stddev) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; virtual bool supports_multibatch() const override { return true; } real stddev; @@ -143,7 +143,7 @@ struct GaussianNoise : public Node { // y = dropout(x,p) where p specifies the dropout probability struct Dropout : public Node { explicit Dropout(const std::initializer_list& a, real p) : Node(a), p(p) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; virtual bool supports_multibatch() const override { return true; } real p; @@ -152,7 +152,7 @@ struct Dropout : public Node { // y = block_dropout(x,p) where p specifies the probability for dropping-out the entire block struct BlockDropout : public Node { explicit BlockDropout(const std::initializer_list& a, real p) : Node(a), dropout_probability(p) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; real dropout_probability; }; @@ -162,7 +162,7 @@ struct BlockDropout : public Node { struct ConstantPlusX : public Node { explicit ConstantPlusX(const std::initializer_list& a, real o) : Node(a), c(o) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() real c; }; @@ -171,7 +171,7 @@ struct ConstantPlusX : public Node { struct ConstantMinusX : public Node { explicit ConstantMinusX(const std::initializer_list& a, real o) : Node(a), c(o) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() real c; }; @@ -179,63 +179,63 @@ struct ConstantMinusX : public Node { struct Sqrt : public Node { explicit Sqrt(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = erf x_1 struct Erf : public Node { explicit Erf(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = tanh x_1 struct Tanh : public Node { explicit Tanh(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = x_1 \odot x_1 struct Square : public Node { explicit Square(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = x_1 \odot x_1 \odot x_1 struct Cube : public Node { explicit Cube(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = exp x_1 struct Exp : public Node { explicit Exp(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = lgamma x_1 struct LogGamma : public Node { explicit LogGamma(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = log x_1 (base e, i.e., natural log) struct Log : public Node { explicit Log(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // concatenate rows struct Concatenate : public Node { template explicit Concatenate(const T& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() // src_row_indices[i] says what row in fx the ith x vector was assigned to // used to simplify backprop mutable std::vector src_row_indices; @@ -245,7 +245,7 @@ struct Concatenate : public Node { // x_i must be a column vector in R^n struct ConcatenateColumns : public Node { template explicit ConcatenateColumns(const T& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() mutable std::vector src_col_indices; }; @@ -255,7 +255,7 @@ struct ConcatenateColumns : public Node { struct PairwiseRankLoss : public Node { explicit PairwiseRankLoss(const std::initializer_list& a, real m = 1.0) : Node(a), margin(m) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() real margin; }; @@ -266,7 +266,7 @@ struct Hinge : public Node { explicit Hinge(const std::initializer_list& a, const unsigned* pe, real m = 1.0) : Node(a), element(), pelement(pe), margin(m) {} explicit Hinge(const std::initializer_list& a, const std::vector& e, real m = 1.0) : Node(a), element(), pelement(), elements(e), pelements(&elements), margin(m) {} explicit Hinge(const std::initializer_list& a, const std::vector* pe, real m = 1.0) : Node(a), element(), pelement(), elements(), pelements(pe), margin(m) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; unsigned element; const unsigned* pelement; @@ -279,14 +279,14 @@ struct Hinge : public Node { struct NoBackprop : public Node { explicit NoBackprop(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = x_1 struct Identity : public Node { explicit Identity(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // hyperparameter: width > 1 @@ -295,7 +295,7 @@ struct Identity : public Node { // y_i = max_{x_{i * width - width + 1}, ..., x_{i * width}} struct MaxPooling1D : public Node { MaxPooling1D(const std::initializer_list& a, unsigned w) : Node(a), width(w) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() unsigned width; mutable std::vector ind; }; @@ -304,28 +304,28 @@ struct MaxPooling1D : public Node { struct MatrixMultiply : public Node { explicit MatrixMultiply(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = x_1 \cdot x_2 (Hadamard product) struct CwiseMultiply : public Node { explicit CwiseMultiply(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = x_1 / x_2 (cwiseQuotient) struct CwiseQuotient : public Node { explicit CwiseQuotient(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = x_1 \sum_{i=2, 4 ...} A_i * x_{i+1} struct AffineTransform : public Node { template explicit AffineTransform(const T& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() mutable float* dEdf_mem; }; @@ -333,14 +333,14 @@ struct AffineTransform : public Node { struct Negate : public Node { explicit Negate(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = max(0,x) struct Rectify : public Node { explicit Rectify(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // you could do this with LogisticSigmoid, Softmax or a variety of other @@ -350,26 +350,26 @@ struct Rectify : public Node { // y = ty * log(x_1) + (1 - ty) * log(x_1) struct BinaryLogLoss : public Node { BinaryLogLoss(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = \log \sum_i \exp x_i // done in log space carefully to avoid over/underflow issues struct LogSumExp : public Node { template explicit LogSumExp(const T& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; }; struct LogDet : public Node { template explicit LogDet(const T& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = \sum_i x_i struct Sum : public Node { template explicit Sum(const T& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() // TODO: Sum should be be implemented over the entire mini-batch, but this is not // super-easy in the current implementation }; @@ -377,14 +377,14 @@ struct Sum : public Node { // y = \sum_i x_i struct SumBatches : public Node { template explicit SumBatches(const T& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } }; // y = ( \sum_i x_i ) / |x| struct Average : public Node { template explicit Average(const T& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } }; @@ -398,7 +398,7 @@ struct Average : public Node { struct PoissonRegressionLoss : public Node { explicit PoissonRegressionLoss(const std::initializer_list& a, unsigned true_y) : Node(a), ty(true_y), pty(&ty) {} explicit PoissonRegressionLoss(const std::initializer_list& a, const unsigned* ptrue_y) : Node(a), ty(), pty(ptrue_y) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() private: unsigned ty; const unsigned* pty; @@ -407,47 +407,47 @@ struct PoissonRegressionLoss : public Node { // y = || x_1 ||^2 struct SquaredNorm : public Node { explicit SquaredNorm(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = || x_1 - x_2 ||^2 struct SquaredEuclideanDistance : public Node { explicit SquaredEuclideanDistance(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = || x_1 - x_2 ||_H(d) struct HuberDistance : public Node { explicit HuberDistance(const std::initializer_list& a, float d = 1.345f) : Node(a), d(d) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() float d; }; // y = || x_1 - x_2 ||_1 struct L1Distance : public Node { explicit L1Distance(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = \sigma(x_1) struct LogisticSigmoid : public Node { explicit LogisticSigmoid(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // y = x / (1 + |x|) struct SoftSign : public Node { explicit SoftSign(const std::initializer_list& a) : Node(a) {} virtual bool supports_multibatch() const override { return true; } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() }; // z = \sum_j \exp (x_i)_j // y_i = (x_1)_i / z struct Softmax : public Node { explicit Softmax(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; virtual bool supports_multibatch() const override { return true; } }; @@ -456,7 +456,7 @@ struct Softmax : public Node { // y_i = (x_1)_i - \log z struct LogSoftmax : public Node { explicit LogSoftmax(const std::initializer_list& a) : Node(a) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() size_t aux_storage_size() const override; virtual bool supports_multibatch() const override { return true; } }; @@ -470,7 +470,7 @@ struct PickNegLogSoftmax : public Node { // use these constructors if you want to change the value after the graph is constructed explicit PickNegLogSoftmax(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv), vals(), pvals() {} explicit PickNegLogSoftmax(const std::initializer_list& a, const std::vector* pv) : Node(a), val(), pval(), vals(), pvals(pv) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; unsigned val; @@ -483,7 +483,7 @@ struct PickNegLogSoftmax : public Node { // y_i = (x_1)_i - \log z struct RestrictedLogSoftmax : public Node { explicit RestrictedLogSoftmax(const std::initializer_list& a, const std::vector& d) : Node(a), denom(d) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() std::vector denom; }; @@ -497,7 +497,7 @@ struct PickElement : public Node { // use these constructors if you want to change the value after the graph is constructed explicit PickElement(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv), vals(), pvals() {} explicit PickElement(const std::initializer_list& a, const std::vector* pv) : Node(a), val(), pval(), vals(), pvals(pv) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } unsigned val; const unsigned* pval; @@ -510,7 +510,7 @@ struct PickElement : public Node { // (start inclusive, end exclusive) struct PickRange : public Node { explicit PickRange(const std::initializer_list& a, unsigned s, unsigned e) : Node(a), start(s), end(e) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } unsigned start; unsigned end; @@ -519,10 +519,10 @@ struct PickRange : public Node { // represents a simple vector of 0s struct Zeroes : public Node { explicit Zeroes(const Dim& d) : dim(d) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() Dim dim; }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/param-nodes.cc b/dynet/param-nodes.cc similarity index 94% rename from cnn/param-nodes.cc rename to dynet/param-nodes.cc index de6c19f38..4ef4ea813 100644 --- a/cnn/param-nodes.cc +++ b/dynet/param-nodes.cc @@ -1,19 +1,19 @@ -#include "cnn/param-nodes.h" +#include "dynet/param-nodes.h" #include #include #include -#include "cnn/nodes-macros.h" -#include "cnn/weight-decay.h" +#include "dynet/nodes-macros.h" +#include "dynet/weight-decay.h" #ifdef HAVE_CUDA -#include "cnn/gpu-ops.h" +#include "dynet/gpu-ops.h" #endif using namespace std; -namespace cnn { +namespace dynet { #ifndef __CUDACC__ @@ -120,7 +120,7 @@ void ConstParameterNode::backward_dev_impl(const MyDevice & dev, cerr << "called backward() on arity 0 node: i = " << i << endl; abort(); } -CNN_NODE_INST_DEV_IMPL(ConstParameterNode) +DYNET_NODE_INST_DEV_IMPL(ConstParameterNode) template void ParameterNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -143,7 +143,7 @@ void ParameterNode::backward_dev_impl(const MyDevice & dev, cerr << "called backward() on arity 0 node: i = " << i << endl; abort(); } -CNN_NODE_INST_DEV_IMPL(ParameterNode) +DYNET_NODE_INST_DEV_IMPL(ParameterNode) template void InputNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -172,7 +172,7 @@ void InputNode::backward_dev_impl(const MyDevice & dev, cerr << "called backward() on arity 0 node\n"; abort(); } -CNN_NODE_INST_DEV_IMPL(InputNode) +DYNET_NODE_INST_DEV_IMPL(InputNode) template void SparseInputNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -183,7 +183,7 @@ void SparseInputNode::forward_dev_impl(const MyDevice & dev, const vector void ScalarInputNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -222,7 +222,7 @@ void ScalarInputNode::backward_dev_impl(const MyDevice & dev, cerr << "called backward() on arity 0 node\n"; abort(); } -CNN_NODE_INST_DEV_IMPL(ScalarInputNode) +DYNET_NODE_INST_DEV_IMPL(ScalarInputNode) template void LookupNode::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { @@ -261,6 +261,6 @@ void LookupNode::backward_dev_impl(const MyDevice & dev, cerr << "called backward() on arity 0 node\n"; abort(); } -CNN_NODE_INST_DEV_IMPL(LookupNode) +DYNET_NODE_INST_DEV_IMPL(LookupNode) -} // namespace cnn +} // namespace dynet diff --git a/cnn/param-nodes.h b/dynet/param-nodes.h similarity index 88% rename from cnn/param-nodes.h rename to dynet/param-nodes.h index 43d8c1370..5fce14d4f 100644 --- a/cnn/param-nodes.h +++ b/dynet/param-nodes.h @@ -1,11 +1,11 @@ -#ifndef CNN_PARAM_NODES_H_ -#define CNN_PARAM_NODES_H_ +#ifndef DYNET_PARAM_NODES_H_ +#define DYNET_PARAM_NODES_H_ -#include "cnn/cnn.h" -#include "cnn/model.h" -#include "cnn/nodes-macros.h" +#include "dynet/dynet.h" +#include "dynet/model.h" +#include "dynet/nodes-macros.h" -namespace cnn { +namespace dynet { struct ParameterNodeBase : public Node { virtual void accumulate_grad(const Tensor& g) = 0; @@ -14,7 +14,7 @@ struct ParameterNodeBase : public Node { // represents optimizable parameters struct ParameterNode : public ParameterNodeBase { explicit ParameterNode(Parameter p) : dim(p.get()->dim), params(p) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() void accumulate_grad(const Tensor& g) override; Dim dim; Parameter params; @@ -23,7 +23,7 @@ struct ParameterNode : public ParameterNodeBase { // represents optimizable parameters that are being held constant struct ConstParameterNode : public Node { explicit ConstParameterNode(Parameter p) : dim(p.get()->dim), params(p) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() Dim dim; Parameter params; }; @@ -32,7 +32,7 @@ struct ConstParameterNode : public Node { struct InputNode : public Node { explicit InputNode(const Dim& d, const std::vector& dat) : dim(d), data(dat), pdata(&data) {} explicit InputNode(const Dim& d, const std::vector* pdat) : dim(d), data(), pdata(pdat) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } Dim dim; const std::vector data; @@ -47,7 +47,7 @@ struct InputNode : public Node { // be fixed in the future. struct SparseInputNode : public Node { explicit SparseInputNode(const Dim& d, const std::vector& id, const std::vector& dat, float defdat = 0.f) : dim(d), ids(id), data(dat), defdata(defdat) {} - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } size_t aux_storage_size() const override; Dim dim; @@ -60,9 +60,9 @@ struct SparseInputNode : public Node { struct ScalarInputNode : public Node { explicit ScalarInputNode(real s) : data(s), pdata(&data) {} explicit ScalarInputNode(const real* ps) : data(), pdata(ps) {} - CNN_NODE_DEFINE_DEV_IMPL() - const cnn::real data; - const cnn::real* pdata; + DYNET_NODE_DEFINE_DEV_IMPL() + const dynet::real data; + const dynet::real* pdata; }; // represents a matrix/vector embedding of an item of a discrete set (1-hot coding) @@ -71,7 +71,7 @@ struct LookupNode : public ParameterNodeBase { LookupNode(LookupParameter p, const unsigned* pind) : dim(p.get()->dim), index(), pindex(pind), indices(), pindices(), params(p) {} LookupNode(LookupParameter p, const std::vector& indices) : dim(p.get()->dim), index(), pindex(), indices(indices), pindices(&this->indices), params(p) { dim.bd = pindices->size(); } LookupNode(LookupParameter p, const std::vector* pindices) : dim(p.get()->dim), index(), pindex(), indices(), pindices(pindices), params(p) { dim.bd = pindices->size(); } - CNN_NODE_DEFINE_DEV_IMPL() + DYNET_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } void accumulate_grad(const Tensor& g) override; Dim dim; @@ -82,6 +82,6 @@ struct LookupNode : public ParameterNodeBase { LookupParameter params; }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/pretrain.cc b/dynet/pretrain.cc similarity index 92% rename from cnn/pretrain.cc rename to dynet/pretrain.cc index d08077b5f..53681964f 100644 --- a/cnn/pretrain.cc +++ b/dynet/pretrain.cc @@ -1,16 +1,16 @@ -#include "cnn/pretrain.h" +#include "dynet/pretrain.h" #include #include #include #include #include -#include "cnn/dict.h" -#include "cnn/model.h" +#include "dynet/dict.h" +#include "dynet/model.h" using namespace std; -namespace cnn { +namespace dynet { void save_pretrained_embeddings(const std::string& fname, const Dict& d, @@ -58,4 +58,4 @@ void read_pretrained_embeddings(const std::string& fname, } } -} // cnn +} // dynet diff --git a/cnn/pretrain.h b/dynet/pretrain.h similarity index 69% rename from cnn/pretrain.h rename to dynet/pretrain.h index 02363cf3c..7ec2189ee 100644 --- a/cnn/pretrain.h +++ b/dynet/pretrain.h @@ -1,13 +1,13 @@ -#ifndef CNN_PRETRAIN_H -#define CNN_PRETRAIN_H +#ifndef DYNET_PRETRAIN_H +#define DYNET_PRETRAIN_H #include #include #include -#include "cnn/dict.h" -#include "cnn/model.h" +#include "dynet/dict.h" +#include "dynet/model.h" -namespace cnn { +namespace dynet { void save_pretrained_embeddings(const std::string& fname, const Dict& d, @@ -17,6 +17,6 @@ void read_pretrained_embeddings(const std::string& fname, Dict* d, std::unordered_map>* vectors); -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/rnn-state-machine.cc b/dynet/rnn-state-machine.cc similarity index 65% rename from cnn/rnn-state-machine.cc rename to dynet/rnn-state-machine.cc index 52d05950c..2b62100f4 100644 --- a/cnn/rnn-state-machine.cc +++ b/dynet/rnn-state-machine.cc @@ -1,13 +1,13 @@ -#include "cnn/rnn-state-machine.h" +#include "dynet/rnn-state-machine.h" #include -#include "cnn/cnn.h" -#include "cnn/io-macros.h" +#include "dynet/dynet.h" +#include "dynet/io-macros.h" using namespace std; -namespace cnn { +namespace dynet { void RNNStateMachine::failure(RNNOp op) { cerr << "State transition error: currently in state " << q_ << " but received operation " << op << endl; @@ -18,7 +18,7 @@ template void RNNStateMachine::serialize(Archive& ar, const unsigned int) { ar & q_; } -CNN_SERIALIZE_IMPL(RNNStateMachine) +DYNET_SERIALIZE_IMPL(RNNStateMachine) -} // namespace cnn +} // namespace dynet diff --git a/cnn/rnn-state-machine.h b/dynet/rnn-state-machine.h similarity index 92% rename from cnn/rnn-state-machine.h rename to dynet/rnn-state-machine.h index 0bff4ce5d..55744f4de 100644 --- a/cnn/rnn-state-machine.h +++ b/dynet/rnn-state-machine.h @@ -1,9 +1,9 @@ -#ifndef CNN_RNN_STATE_MACHINE_H_ -#define CNN_RNN_STATE_MACHINE_H_ +#ifndef DYNET_RNN_STATE_MACHINE_H_ +#define DYNET_RNN_STATE_MACHINE_H_ namespace boost { namespace serialization { class access; } } -namespace cnn { +namespace dynet { // CURRENT STATE | ACTION | NEXT STATE // --------------+---------------------+----------------- @@ -44,6 +44,6 @@ class RNNStateMachine { void serialize(Archive& ar, const unsigned int); }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/rnn.cc b/dynet/rnn.cc similarity index 93% rename from cnn/rnn.cc rename to dynet/rnn.cc index 7b4c77726..d69115504 100644 --- a/cnn/rnn.cc +++ b/dynet/rnn.cc @@ -1,5 +1,5 @@ -#include "cnn/rnn.h" -#include "cnn/io-macros.h" +#include "dynet/rnn.h" +#include "dynet/io-macros.h" #include #include @@ -12,14 +12,14 @@ #include -#include "cnn/nodes.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/expr.h" using namespace std; -using namespace cnn::expr; -using namespace cnn; +using namespace dynet::expr; +using namespace dynet; -namespace cnn { +namespace dynet { enum { X2H=0, H2H, HB, L2H }; @@ -41,7 +41,7 @@ void RNNBuilder::serialize(Archive& ar, const unsigned int) { ar & head; ar & sm; } -CNN_SERIALIZE_IMPL(RNNBuilder) +DYNET_SERIALIZE_IMPL(RNNBuilder) SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, unsigned input_dim, @@ -194,9 +194,9 @@ void SimpleRNNBuilder::serialize(Archive& ar, const unsigned int) { ar & layers; ar & lagging; } -CNN_SERIALIZE_IMPL(SimpleRNNBuilder) +DYNET_SERIALIZE_IMPL(SimpleRNNBuilder) -} // namespace cnn +} // namespace dynet -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::RNNBuilder) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::SimpleRNNBuilder) +BOOST_CLASS_EXPORT_IMPLEMENT(dynet::RNNBuilder) +BOOST_CLASS_EXPORT_IMPLEMENT(dynet::SimpleRNNBuilder) diff --git a/cnn/rnn.h b/dynet/rnn.h similarity index 94% rename from cnn/rnn.h rename to dynet/rnn.h index 37fd6c367..ed56e43ca 100644 --- a/cnn/rnn.h +++ b/dynet/rnn.h @@ -1,15 +1,15 @@ -#ifndef CNN_RNN_H_ -#define CNN_RNN_H_ +#ifndef DYNET_RNN_H_ +#define DYNET_RNN_H_ #include -#include "cnn/cnn.h" -#include "cnn/rnn-state-machine.h" -#include "cnn/expr.h" +#include "dynet/dynet.h" +#include "dynet/rnn-state-machine.h" +#include "dynet/expr.h" -using namespace cnn::expr; +using namespace dynet::expr; -namespace cnn { +namespace dynet { class Model; @@ -164,20 +164,20 @@ struct SimpleRNNBuilder : public RNNBuilder { }; -} // namespace cnn +} // namespace dynet namespace boost { namespace serialization { template - void serialize(Archive& ar, cnn::RNNPointer& p, const unsigned int version) + void serialize(Archive& ar, dynet::RNNPointer& p, const unsigned int version) { ar & p.t; } } // namespace serialization } // namespace boost -BOOST_CLASS_EXPORT_KEY(cnn::RNNBuilder) -BOOST_CLASS_EXPORT_KEY(cnn::SimpleRNNBuilder) +BOOST_CLASS_EXPORT_KEY(dynet::RNNBuilder) +BOOST_CLASS_EXPORT_KEY(dynet::SimpleRNNBuilder) #endif diff --git a/cnn/saxe-init.cc b/dynet/saxe-init.cc similarity index 86% rename from cnn/saxe-init.cc rename to dynet/saxe-init.cc index b6e88970f..5e025a5d4 100644 --- a/cnn/saxe-init.cc +++ b/dynet/saxe-init.cc @@ -1,5 +1,5 @@ -#include "cnn/saxe-init.h" -#include "cnn/tensor.h" +#include "dynet/saxe-init.h" +#include "dynet/tensor.h" #include #include @@ -8,7 +8,7 @@ using namespace std; -namespace cnn { +namespace dynet { void orthonormal_random(unsigned dd, float g, Tensor& x) { Tensor t; diff --git a/cnn/saxe-init.h b/dynet/saxe-init.h similarity index 55% rename from cnn/saxe-init.h rename to dynet/saxe-init.h index 95ad9bc50..47beea271 100644 --- a/cnn/saxe-init.h +++ b/dynet/saxe-init.h @@ -1,7 +1,7 @@ -#ifndef CNN_SAXE_INIT_H_ -#define CNN_SAXE_INIT_H_ +#ifndef DYNET_SAXE_INIT_H_ +#define DYNET_SAXE_INIT_H_ -namespace cnn { +namespace dynet { struct Tensor; diff --git a/cnn/shadow-params.cc b/dynet/shadow-params.cc similarity index 79% rename from cnn/shadow-params.cc rename to dynet/shadow-params.cc index ad81d523b..c45657eb6 100644 --- a/cnn/shadow-params.cc +++ b/dynet/shadow-params.cc @@ -1,16 +1,16 @@ -#include "cnn/cnn.h" +#include "dynet/dynet.h" #include -#include "cnn/shadow-params.h" -#include "cnn/tensor.h" -#include "cnn/aligned-mem-pool.h" -#include "cnn/model.h" -#include "cnn/io-macros.h" +#include "dynet/shadow-params.h" +#include "dynet/tensor.h" +#include "dynet/aligned-mem-pool.h" +#include "dynet/model.h" +#include "dynet/io-macros.h" using namespace std; -namespace cnn { +namespace dynet { ShadowParameters::ShadowParameters(const ParameterStorage& p) : h(p.values) { default_device->allocate_tensor(DeviceMempool::PS, h); @@ -44,13 +44,13 @@ template void ShadowParameters::serialize(Archive& ar, const unsigned int) { ar & h; } -CNN_SERIALIZE_IMPL(ShadowParameters) +DYNET_SERIALIZE_IMPL(ShadowParameters) template void ShadowLookupParameters::serialize(Archive& ar, const unsigned int) { ar & h; } -CNN_SERIALIZE_IMPL(ShadowLookupParameters) +DYNET_SERIALIZE_IMPL(ShadowLookupParameters) -} // namespace cnn +} // namespace dynet diff --git a/cnn/shadow-params.h b/dynet/shadow-params.h similarity index 89% rename from cnn/shadow-params.h rename to dynet/shadow-params.h index 295afd659..2c20ac7fd 100644 --- a/cnn/shadow-params.h +++ b/dynet/shadow-params.h @@ -1,14 +1,14 @@ -#ifndef CNN_SHADOW_PARAMS_H -#define CNN_SHADOW_PARAMS_H +#ifndef DYNET_SHADOW_PARAMS_H +#define DYNET_SHADOW_PARAMS_H #include -#include "cnn/tensor.h" +#include "dynet/tensor.h" // if your learner needs to keep track of an extra set of values (one per // parameter), use the Shadow classes. this can be used to implement, e.g., // momentum or adagrad -namespace cnn { +namespace dynet { class Model; struct ParameterStorage; @@ -40,6 +40,6 @@ std::vector allocate_shadow_parameters(const Model& model); // one per element in model.lookup_parameters_list std::vector allocate_shadow_lookup_parameters(const Model& model); -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/simd-functors.h b/dynet/simd-functors.h similarity index 71% rename from cnn/simd-functors.h rename to dynet/simd-functors.h index a971a4285..68634cb21 100644 --- a/cnn/simd-functors.h +++ b/dynet/simd-functors.h @@ -1,9 +1,9 @@ -#ifndef CNN_XFUNCTORS_H -#define CNN_XFUNCTORS_H +#ifndef DYNET_XFUNCTORS_H +#define DYNET_XFUNCTORS_H #include -#include "cnn/functors.h" +#include "dynet/functors.h" // these functors are implemented to exploit Eigen's internal logic for doing // vectorized arithmetic. I'm putting them in a separate file since, if Eigen @@ -18,14 +18,14 @@ // has vectorized support for the operations you need // and an estimate of the cost of the operation -namespace cnn { +namespace dynet { template struct const_add_op { const_add_op(const Scalar& c) : c(c) {} - CNN_DEVICE_FUNC inline const Scalar operator() (const Scalar& x) const { + DYNET_DEVICE_FUNC inline const Scalar operator() (const Scalar& x) const { return c + x; } template - CNN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const { + DYNET_DEVICE_FUNC inline Packet packetOp(const Packet& x) const { using namespace Eigen::internal; return padd(pset1(c), x); } @@ -35,7 +35,7 @@ template struct const_add_op { namespace Eigen { namespace internal { template -struct functor_traits > { +struct functor_traits > { enum { Cost = NumTraits::AddCost * 2, PacketAccess = packet_traits::HasAdd @@ -43,14 +43,14 @@ struct functor_traits > { }; } } -namespace cnn { +namespace dynet { template struct const_minus_op { const_minus_op(const Scalar& c) : c(c) {} - CNN_DEVICE_FUNC inline const Scalar operator() (const Scalar& x) const { + DYNET_DEVICE_FUNC inline const Scalar operator() (const Scalar& x) const { return c - x; } template - CNN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const { + DYNET_DEVICE_FUNC inline Packet packetOp(const Packet& x) const { using namespace Eigen::internal; return psub(pset1(c), x); } @@ -60,7 +60,7 @@ template struct const_minus_op { namespace Eigen { namespace internal { template -struct functor_traits > { +struct functor_traits > { enum { Cost = NumTraits::AddCost * 2, PacketAccess = packet_traits::HasSub @@ -68,16 +68,16 @@ struct functor_traits > { }; } } -namespace cnn { +namespace dynet { template struct scalar_logistic_sigmoid_op { EIGEN_EMPTY_STRUCT_CTOR(scalar_logistic_sigmoid_op) - CNN_DEVICE_FUNC inline const Scalar operator() (const Scalar& x) const { + DYNET_DEVICE_FUNC inline const Scalar operator() (const Scalar& x) const { using std::exp; const Scalar one = Scalar(1); return one / (one + exp(-x)); } template - CNN_DEVICE_FUNC inline Packet packetOp(const Packet& x) const { + DYNET_DEVICE_FUNC inline Packet packetOp(const Packet& x) const { using namespace Eigen::internal; const Packet one = pset1(1); return pdiv(one, padd(one, pexp(pnegate(x)))); @@ -87,7 +87,7 @@ template struct scalar_logistic_sigmoid_op { namespace Eigen { namespace internal { template -struct functor_traits > { +struct functor_traits > { enum { Cost = NumTraits::AddCost * 2 + NumTraits::MulCost * 6, PacketAccess = packet_traits::HasAdd && packet_traits::HasDiv && @@ -96,16 +96,16 @@ struct functor_traits > { }; } } -namespace cnn { +namespace dynet { template struct scalar_erf_backward_op { EIGEN_EMPTY_STRUCT_CTOR(scalar_erf_backward_op) - CNN_DEVICE_FUNC inline const Scalar operator() (const Scalar& x, const Scalar& d) const { + DYNET_DEVICE_FUNC inline const Scalar operator() (const Scalar& x, const Scalar& d) const { using std::exp; const Scalar sqrt_pi_over2(1.1283791670955125738961589); return sqrt_pi_over2 * exp(-x * x) * d; } template - CNN_DEVICE_FUNC inline Packet packetOp(const Packet& x, const Packet& d) const { + DYNET_DEVICE_FUNC inline Packet packetOp(const Packet& x, const Packet& d) const { using namespace Eigen::internal; const Packet sqrt_pi_over2 = pset1(1.1283791670955125738961589); return pmul(sqrt_pi_over2, pmul(pexp(pnegate(pmul(x, x))), d)); @@ -115,7 +115,7 @@ template struct scalar_erf_backward_op { namespace Eigen { namespace internal { template -struct functor_traits > { +struct functor_traits > { enum { Cost = NumTraits::MulCost * 8, PacketAccess = packet_traits::HasExp && packet_traits::HasMul && packet_traits::HasNegate @@ -123,15 +123,15 @@ struct functor_traits > { }; } } -namespace cnn { +namespace dynet { template struct scalar_logistic_sigmoid_backward_op { EIGEN_EMPTY_STRUCT_CTOR(scalar_logistic_sigmoid_backward_op) - CNN_DEVICE_FUNC inline const Scalar operator() (const Scalar& t, const Scalar& d) const { + DYNET_DEVICE_FUNC inline const Scalar operator() (const Scalar& t, const Scalar& d) const { const Scalar one = Scalar(1); return (one - t) * t * d; } template - CNN_DEVICE_FUNC inline Packet packetOp(const Packet& t, const Packet& d) const { + DYNET_DEVICE_FUNC inline Packet packetOp(const Packet& t, const Packet& d) const { using namespace Eigen::internal; const Packet one = pset1(1); return pmul(psub(one, t), pmul(t, d)); @@ -141,7 +141,7 @@ template struct scalar_logistic_sigmoid_backward_op { namespace Eigen { namespace internal { template -struct functor_traits > { +struct functor_traits > { enum { Cost = NumTraits::AddCost + NumTraits::MulCost * 2, PacketAccess = packet_traits::HasSub && packet_traits::HasMul @@ -149,18 +149,18 @@ struct functor_traits > { }; } } -namespace cnn { +namespace dynet { template struct scalar_tanh_op { EIGEN_EMPTY_STRUCT_CTOR(scalar_tanh_op) - CNN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::tanh; return tanh(a); } + DYNET_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { using std::tanh; return tanh(a); } template - CNN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return Eigen::internal::ptanh(a); } + DYNET_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return Eigen::internal::ptanh(a); } }; } namespace Eigen { namespace internal { template -struct functor_traits > { +struct functor_traits > { enum { Cost = 5 * NumTraits::MulCost, PacketAccess = packet_traits::HasTanh @@ -168,12 +168,12 @@ struct functor_traits > { }; } } -namespace cnn { +namespace dynet { template struct scalar_tanh_backward_op { EIGEN_EMPTY_STRUCT_CTOR(scalar_tanh_backward_op) - CNN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& t, const Scalar& d) const { return (1 - t * t) * d; } + DYNET_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator() (const Scalar& t, const Scalar& d) const { return (1 - t * t) * d; } template - CNN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& t, const Packet& d) const { + DYNET_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& t, const Packet& d) const { using namespace Eigen::internal; const Packet one = pset1(1); return pmul(psub(one, pmul(t, t)), d); @@ -183,7 +183,7 @@ template struct scalar_tanh_backward_op { namespace Eigen { namespace internal { template -struct functor_traits > { +struct functor_traits > { enum { Cost = NumTraits::AddCost + 2 * NumTraits::MulCost, PacketAccess = packet_traits::HasSub && packet_traits::HasMul @@ -191,18 +191,18 @@ struct functor_traits > { }; }} -namespace cnn { +namespace dynet { //this is slower than the dumb implementation, probably because of the pset operations // which could be factored out into the constructor, but the Packet type isn't used // then (and I think fixing this would be hard) template struct scalar_nlsoftmax_backward_op { scalar_nlsoftmax_backward_op(const Scalar& lz, const Scalar& err) : logz(lz), d(err) {} - CNN_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& t) const { + DYNET_DEVICE_FUNC EIGEN_STRONG_INLINE const Scalar operator()(const Scalar& t) const { using std::exp; return exp(t - logz) * d; } template - CNN_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& t) const { + DYNET_DEVICE_FUNC EIGEN_STRONG_INLINE const Packet packetOp(const Packet& t) const { using namespace Eigen::internal; const Packet lz = pset1(logz); const Packet dd = pset1(d); @@ -214,7 +214,7 @@ template struct scalar_nlsoftmax_backward_op { namespace Eigen { namespace internal { template -struct functor_traits > { +struct functor_traits > { enum { Cost = NumTraits::AddCost + 6 * NumTraits::MulCost, PacketAccess = packet_traits::HasSub && packet_traits::HasExp diff --git a/cnn/tensor.cc b/dynet/tensor.cc similarity index 95% rename from cnn/tensor.cc rename to dynet/tensor.cc index 02595cfe7..dae6d2a56 100644 --- a/cnn/tensor.cc +++ b/dynet/tensor.cc @@ -1,4 +1,4 @@ -#include "cnn/tensor.h" +#include "dynet/tensor.h" #include #include @@ -8,16 +8,16 @@ #include #if HAVE_CUDA -#include "cnn/gpu-ops.h" -#include "cnn/cuda.h" +#include "dynet/gpu-ops.h" +#include "dynet/cuda.h" #endif -#include "cnn/io-macros.h" +#include "dynet/io-macros.h" using namespace std; -BOOST_CLASS_VERSION(cnn::Tensor, 1) +BOOST_CLASS_VERSION(dynet::Tensor, 1) -namespace cnn { +namespace dynet { ostream& operator<<(ostream& os, const Tensor& t) { #if HAVE_CUDA @@ -106,7 +106,7 @@ void TensorTools::Constant(Tensor& d, float c) { if (!c) { CUDA_CHECK(cudaMemsetAsync(d.v, 0, d.d.size() * sizeof(float))); } else { - cnn::gpu::const_init(d.d.size(), c, d.v); + dynet::gpu::const_init(d.d.size(), c, d.v); } #else if (!c) { @@ -214,7 +214,7 @@ void Tensor::load(Archive& ar, const unsigned int ver) { ar & boost::serialization::make_array(v, d.size()); #endif } -CNN_SAVELOAD_IMPL(Tensor) +DYNET_SAVELOAD_IMPL(Tensor) real rand01() { uniform_real_distribution distribution(0, 1); @@ -233,5 +233,5 @@ real rand_normal() { return distribution(*rndeng); } -} // namespace cnn +} // namespace dynet diff --git a/cnn/tensor.h b/dynet/tensor.h similarity index 97% rename from cnn/tensor.h rename to dynet/tensor.h index 598941fca..f96604688 100644 --- a/cnn/tensor.h +++ b/dynet/tensor.h @@ -1,20 +1,20 @@ -#ifndef CNN_EIGEN_TENSOR_H -#define CNN_EIGEN_TENSOR_H +#ifndef DYNET_EIGEN_TENSOR_H +#define DYNET_EIGEN_TENSOR_H #include #include #include -#include "cnn/dim.h" -#include "cnn/globals.h" -#include "cnn/aligned-mem-pool.h" -#include "cnn/devices.h" +#include "dynet/dim.h" +#include "dynet/globals.h" +#include "dynet/aligned-mem-pool.h" +#include "dynet/devices.h" #if HAVE_CUDA #include #include -#include "cnn/cuda.h" +#include "dynet/cuda.h" #endif // Following line is commented out because it causes errors with large nets (Antonis) @@ -23,7 +23,7 @@ #include #include -namespace cnn { +namespace dynet { #define EIGEN_BACKEND 1 @@ -59,7 +59,7 @@ struct Tensor { Eigen::TensorMap> tvec() { return Eigen::TensorMap>(v, d.size()); } - // Get view as a Tensor (see specializations below-- this is to work Eigen's and CNNs compile-type vs. run-time differences) + // Get view as a Tensor (see specializations below-- this is to work Eigen's and DYNETs compile-type vs. run-time differences) template Eigen::TensorMap> t(); template const Eigen::TensorMap> t() const; // Get view as a Tensor where the final dimension is the various batches @@ -289,6 +289,6 @@ real rand01(); int rand0n(int n); real rand_normal(); -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/timing.h b/dynet/timing.h similarity index 92% rename from cnn/timing.h rename to dynet/timing.h index 634b9e1bf..6f99334b4 100644 --- a/cnn/timing.h +++ b/dynet/timing.h @@ -5,7 +5,7 @@ #include #include -namespace cnn { +namespace dynet { struct Timer { Timer(const std::string& msg) : msg(msg), start(std::chrono::high_resolution_clock::now()) {} @@ -17,6 +17,6 @@ struct Timer { std::chrono::high_resolution_clock::time_point start; }; -} // namespace cnn +} // namespace dynet #endif diff --git a/cnn/training.cc b/dynet/training.cc similarity index 89% rename from cnn/training.cc rename to dynet/training.cc index 4daccd986..36a2c6190 100644 --- a/cnn/training.cc +++ b/dynet/training.cc @@ -1,23 +1,23 @@ -#include "cnn/training.h" +#include "dynet/training.h" #include #include -// #include "cnn/gpu-ops.h" -#include "cnn/param-nodes.h" -#include "cnn/weight-decay.h" -#include "cnn/io-macros.h" +// #include "dynet/gpu-ops.h" +#include "dynet/param-nodes.h" +#include "dynet/weight-decay.h" +#include "dynet/io-macros.h" // Macros for defining parameter update functions #ifdef __CUDACC__ -#define CNN_TRAINER_INST_DEV_IMPL(MyTrainer) \ +#define DYNET_TRAINER_INST_DEV_IMPL(MyTrainer) \ template void MyTrainer::update_rule_dev(const Device_GPU & dev, real scale, real gscale, const std::vector & values); #elif defined(HAVE_CUDA) // This is correct, but dying when models are read and written. // if(values[0]->device->type == DeviceType::CPU) { update_rule_dev(*(Device_CPU*)values[0]->device,scale,gscale,values); } // else if(values[0]->device->type == DeviceType::GPU) { update_rule_dev(*(Device_GPU*)values[0]->device,scale,gscale,values); } // else { abort(); } -#define CNN_TRAINER_INST_DEV_IMPL(MyTrainer) \ +#define DYNET_TRAINER_INST_DEV_IMPL(MyTrainer) \ extern template void MyTrainer::update_rule_dev(const Device_GPU & dev, real scale, real gscale, const std::vector & values); \ template void MyTrainer::update_rule_dev(const Device_CPU & dev, real scale, real gscale, const std::vector & values); \ void MyTrainer::update_rule(real scale, real gscale, const std::vector & values) { \ @@ -26,7 +26,7 @@ else { abort(); } \ } #else -#define CNN_TRAINER_INST_DEV_IMPL(MyTrainer) \ +#define DYNET_TRAINER_INST_DEV_IMPL(MyTrainer) \ template void MyTrainer::update_rule_dev(const Device_CPU & dev, real scale, real gscale, const std::vector & values); \ void MyTrainer::update_rule(real scale, real gscale, const std::vector & values) { \ if(default_device->type == DeviceType::CPU) { update_rule_dev(*(Device_CPU*)default_device,scale,gscale,values); } \ @@ -34,7 +34,7 @@ } #endif -namespace cnn { +namespace dynet { using namespace std; @@ -110,7 +110,7 @@ template void SimpleSGDTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & ts) { ts[0]->tvec().device(*dev.edevice) -= ts[1]->tvec() * (eta * scale * gscale / model->weight_decay.current_weight_decay()); } -CNN_TRAINER_INST_DEV_IMPL(SimpleSGDTrainer) +DYNET_TRAINER_INST_DEV_IMPL(SimpleSGDTrainer) #ifndef __CUDACC__ void SimpleSGDTrainer::update_params(real scale, real gscale, size_t idx) { @@ -131,7 +131,7 @@ void MomentumSGDTrainer::update_rule_dev(const MyDevice & dev, real scale, real ts[2]->tvec().device(*dev.edevice) = ts[2]->tvec() * momentum - ts[1]->tvec() * (eta * scale * gscale); ts[0]->tvec().device(*dev.edevice) += ts[2]->tvec() / model->weight_decay.current_weight_decay(); } -CNN_TRAINER_INST_DEV_IMPL(MomentumSGDTrainer) +DYNET_TRAINER_INST_DEV_IMPL(MomentumSGDTrainer) #ifndef __CUDACC__ void MomentumSGDTrainer::update_params(real scale, real gscale, size_t idx) { @@ -157,7 +157,7 @@ void AdagradTrainer::update_rule_dev(const MyDevice & dev, real scale, real gsca ts[2]->tvec().device(*dev.edevice) += ts[1]->tvec().square(); ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() / (ts[2]->tvec() + epsilon).sqrt() * (-eta / model->weight_decay.current_weight_decay()); } -CNN_TRAINER_INST_DEV_IMPL(AdagradTrainer) +DYNET_TRAINER_INST_DEV_IMPL(AdagradTrainer) #ifndef __CUDACC__ void AdagradTrainer::update_params(real scale, real gscale, size_t idx) { @@ -185,7 +185,7 @@ void AdadeltaTrainer::update_rule_dev(const MyDevice & dev, real scale, real gsc ts[3]->tvec().device(*dev.edevice) = ts[3]->tvec() * rho + ts[1]->tvec().square() * (1.f - rho); ts[0]->tvec().device(*dev.edevice) += ts[1]->tvec() / model->weight_decay.current_weight_decay(); } -CNN_TRAINER_INST_DEV_IMPL(AdadeltaTrainer) +DYNET_TRAINER_INST_DEV_IMPL(AdadeltaTrainer) #ifndef __CUDACC__ void AdadeltaTrainer::update_params(real scale, real gscale, size_t idx) { @@ -217,7 +217,7 @@ void RmsPropTrainer::update_rule_dev(const MyDevice & dev, real scale, real gsca // d2 = rho * d2 + (1.f - rho) * g2; // p->values.vec() -= ((eta * scale * gscale / sqrt(d2 + epsilon)) * p->g.vec()) / model->weight_decay.current_weight_decay(); } -CNN_TRAINER_INST_DEV_IMPL(RmsPropTrainer) +DYNET_TRAINER_INST_DEV_IMPL(RmsPropTrainer) #ifndef __CUDACC__ void RmsPropTrainer::update_params(real scale, real gscale, size_t idx) { @@ -253,7 +253,7 @@ void AdamTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, float s2 = 1 - pow(beta_2, updates+1); ts[0]->tvec().device(*dev.edevice) += ts[2]->tvec() / ((ts[3]->tvec() / s2).sqrt() + epsilon) * (-eta / s1 / model->weight_decay.current_weight_decay()); } -CNN_TRAINER_INST_DEV_IMPL(AdamTrainer) +DYNET_TRAINER_INST_DEV_IMPL(AdamTrainer) #ifndef __CUDACC__ void AdamTrainer::update_params(real scale, real gscale, size_t idx) { @@ -273,12 +273,12 @@ void AdamTrainer::alloc_impl() { #endif #ifndef __CUDACC__ -// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::SimpleSGDTrainer) -// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::MomentumSGDTrainer) -// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdagradTrainer) -// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdadeltaTrainer) -// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::RmsPropTrainer) -// BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdamTrainer) +// BOOST_CLASS_EXPORT_IMPLEMENT(dynet::SimpleSGDTrainer) +// BOOST_CLASS_EXPORT_IMPLEMENT(dynet::MomentumSGDTrainer) +// BOOST_CLASS_EXPORT_IMPLEMENT(dynet::AdagradTrainer) +// BOOST_CLASS_EXPORT_IMPLEMENT(dynet::AdadeltaTrainer) +// BOOST_CLASS_EXPORT_IMPLEMENT(dynet::RmsPropTrainer) +// BOOST_CLASS_EXPORT_IMPLEMENT(dynet::AdamTrainer) template void Trainer::serialize(Archive& ar, const unsigned int) { @@ -287,13 +287,13 @@ void Trainer::serialize(Archive& ar, const unsigned int) { ar & aux_allocated; ar & model; } -CNN_SERIALIZE_IMPL(Trainer) +DYNET_SERIALIZE_IMPL(Trainer) template void SimpleSGDTrainer::serialize(Archive& ar, const unsigned int) { ar & boost::serialization::base_object(*this); } -CNN_SERIALIZE_IMPL(SimpleSGDTrainer) +DYNET_SERIALIZE_IMPL(SimpleSGDTrainer) template void MomentumSGDTrainer::serialize(Archive& ar, const unsigned int) { @@ -301,7 +301,7 @@ void MomentumSGDTrainer::serialize(Archive& ar, const unsigned int) { ar & momentum; ar & vp & vlp; } -CNN_SERIALIZE_IMPL(MomentumSGDTrainer) +DYNET_SERIALIZE_IMPL(MomentumSGDTrainer) template void AdagradTrainer::serialize(Archive& ar, const unsigned int) { @@ -309,7 +309,7 @@ void AdagradTrainer::serialize(Archive& ar, const unsigned int) { ar & epsilon; ar & vp & vlp; } -CNN_SERIALIZE_IMPL(AdagradTrainer) +DYNET_SERIALIZE_IMPL(AdagradTrainer) template void AdadeltaTrainer::serialize(Archive& ar, const unsigned int) { @@ -317,7 +317,7 @@ void AdadeltaTrainer::serialize(Archive& ar, const unsigned int) { ar & epsilon & rho; ar & hg & hlg & hd & hld; } -CNN_SERIALIZE_IMPL(AdadeltaTrainer) +DYNET_SERIALIZE_IMPL(AdadeltaTrainer) template void RmsPropTrainer::serialize(Archive& ar, const unsigned int) { @@ -325,7 +325,7 @@ void RmsPropTrainer::serialize(Archive& ar, const unsigned int) { ar & epsilon & rho; ar & hg & hlg; } -CNN_SERIALIZE_IMPL(RmsPropTrainer) +DYNET_SERIALIZE_IMPL(RmsPropTrainer) template void AdamTrainer::serialize(Archive& ar, const unsigned int) { @@ -333,15 +333,15 @@ void AdamTrainer::serialize(Archive& ar, const unsigned int) { ar & beta_1 & beta_2 & epsilon; ar & m & lm & v & lv; } -CNN_SERIALIZE_IMPL(AdamTrainer) +DYNET_SERIALIZE_IMPL(AdamTrainer) #endif -} // namespace cnn +} // namespace dynet -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::SimpleSGDTrainer) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::MomentumSGDTrainer) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdagradTrainer) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdadeltaTrainer) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::RmsPropTrainer) -BOOST_CLASS_EXPORT_IMPLEMENT(cnn::AdamTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(dynet::SimpleSGDTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(dynet::MomentumSGDTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(dynet::AdagradTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(dynet::AdadeltaTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(dynet::RmsPropTrainer) +BOOST_CLASS_EXPORT_IMPLEMENT(dynet::AdamTrainer) diff --git a/cnn/training.h b/dynet/training.h similarity index 88% rename from cnn/training.h rename to dynet/training.h index f38a7275c..39722abbe 100644 --- a/cnn/training.h +++ b/dynet/training.h @@ -1,21 +1,21 @@ -#ifndef CNN_TRAINING_H_ -#define CNN_TRAINING_H_ +#ifndef DYNET_TRAINING_H_ +#define DYNET_TRAINING_H_ #include #include -#include "cnn/model.h" -#include "cnn/shadow-params.h" +#include "dynet/model.h" +#include "dynet/shadow-params.h" -#define CNN_TRAINER_DEFINE_DEV_IMPL() \ +#define DYNET_TRAINER_DEFINE_DEV_IMPL() \ void update_params(real scale, real gscale, size_t idx) override; \ void update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) override; \ template \ void update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & values); \ void update_rule(real scale, real gscale, const std::vector & values) override; -namespace cnn { +namespace dynet { struct Trainer { explicit Trainer(Model* m, real e0) : @@ -75,7 +75,7 @@ struct Trainer { struct SimpleSGDTrainer : public Trainer { explicit SimpleSGDTrainer(Model* m, real e0 = 0.1) : Trainer(m, e0) {} protected: - CNN_TRAINER_DEFINE_DEV_IMPL() + DYNET_TRAINER_DEFINE_DEV_IMPL() private: SimpleSGDTrainer() {} friend class boost::serialization::access; @@ -88,7 +88,7 @@ struct MomentumSGDTrainer : public Trainer { Trainer(m, e0), momentum(mom) {} protected: - CNN_TRAINER_DEFINE_DEV_IMPL() + DYNET_TRAINER_DEFINE_DEV_IMPL() virtual void alloc_impl() override; real momentum; @@ -109,7 +109,7 @@ struct AdagradTrainer : public Trainer { explicit AdagradTrainer(Model* m, real e0 = 0.1, real eps = 1e-20) : Trainer(m, e0), epsilon(eps) {} protected: - CNN_TRAINER_DEFINE_DEV_IMPL() + DYNET_TRAINER_DEFINE_DEV_IMPL() virtual void alloc_impl() override; real epsilon; @@ -126,7 +126,7 @@ struct AdadeltaTrainer : public Trainer { explicit AdadeltaTrainer(Model* m, real eps = 1e-6, real rho = 0.95) : Trainer(m, 1.0), epsilon(eps), rho(rho) {} protected: - CNN_TRAINER_DEFINE_DEV_IMPL() + DYNET_TRAINER_DEFINE_DEV_IMPL() virtual void alloc_impl() override; real epsilon; @@ -146,7 +146,7 @@ struct RmsPropTrainer : public Trainer { explicit RmsPropTrainer(Model* m, real e0 = 0.1, real eps = 1e-20, real rho = 0.95) : Trainer(m, e0), epsilon(eps), rho(rho) {} protected: - CNN_TRAINER_DEFINE_DEV_IMPL() + DYNET_TRAINER_DEFINE_DEV_IMPL() virtual void alloc_impl() override; real epsilon; @@ -165,7 +165,7 @@ struct AdamTrainer : public Trainer { Trainer(m, alpha), beta_1(beta_1), beta_2(beta_2), epsilon(eps) {} protected: - CNN_TRAINER_DEFINE_DEV_IMPL() + DYNET_TRAINER_DEFINE_DEV_IMPL() virtual void alloc_impl() override; float beta_1; @@ -182,13 +182,13 @@ struct AdamTrainer : public Trainer { void serialize(Archive& ar, const unsigned int); }; -} // namespace cnn +} // namespace dynet -BOOST_CLASS_EXPORT_KEY(cnn::SimpleSGDTrainer) -BOOST_CLASS_EXPORT_KEY(cnn::MomentumSGDTrainer) -BOOST_CLASS_EXPORT_KEY(cnn::AdagradTrainer) -BOOST_CLASS_EXPORT_KEY(cnn::AdadeltaTrainer) -BOOST_CLASS_EXPORT_KEY(cnn::RmsPropTrainer) -BOOST_CLASS_EXPORT_KEY(cnn::AdamTrainer) +BOOST_CLASS_EXPORT_KEY(dynet::SimpleSGDTrainer) +BOOST_CLASS_EXPORT_KEY(dynet::MomentumSGDTrainer) +BOOST_CLASS_EXPORT_KEY(dynet::AdagradTrainer) +BOOST_CLASS_EXPORT_KEY(dynet::AdadeltaTrainer) +BOOST_CLASS_EXPORT_KEY(dynet::RmsPropTrainer) +BOOST_CLASS_EXPORT_KEY(dynet::AdamTrainer) #endif diff --git a/cnn/weight-decay.cc b/dynet/weight-decay.cc similarity index 53% rename from cnn/weight-decay.cc rename to dynet/weight-decay.cc index 87a24008d..6f774cc70 100644 --- a/cnn/weight-decay.cc +++ b/dynet/weight-decay.cc @@ -1,13 +1,13 @@ -#include "cnn/weight-decay.h" -#include "cnn/io-macros.h" +#include "dynet/weight-decay.h" +#include "dynet/io-macros.h" -namespace cnn { +namespace dynet { template void L2WeightDecay::serialize(Archive& ar, const unsigned int) { ar & weight_decay; ar & lambda; } -CNN_SERIALIZE_IMPL(L2WeightDecay) +DYNET_SERIALIZE_IMPL(L2WeightDecay) } diff --git a/cnn/weight-decay.h b/dynet/weight-decay.h similarity index 93% rename from cnn/weight-decay.h rename to dynet/weight-decay.h index 0231b805b..d0f79c663 100644 --- a/cnn/weight-decay.h +++ b/dynet/weight-decay.h @@ -1,5 +1,5 @@ -#ifndef CNN_WEIGHT_DECAY_H -#define CNN_WEIGHT_DECAY_H +#ifndef DYNET_WEIGHT_DECAY_H +#define DYNET_WEIGHT_DECAY_H #include #include @@ -7,7 +7,7 @@ namespace boost { namespace serialization { class access; } } -namespace cnn { +namespace dynet { // I don't bother with learning rates when computing how much the weight // decay changes- those are hard to define in the adaptive update rules. @@ -44,6 +44,6 @@ struct L2WeightDecay { float lambda; }; -} // namespace cnn +} // namespace dynet #endif diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index d9441341f..0ee556e7d 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -4,12 +4,12 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET mlc tok-embed poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm-mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) if (WITH_CUDA_BACKEND) - target_link_libraries(${TARGET} gcnn ${LIBS}) - add_dependencies(${TARGET} cnncuda) - target_link_libraries(${TARGET} cnncuda) + target_link_libraries(${TARGET} gdynet ${LIBS}) + add_dependencies(${TARGET} dynetcuda) + target_link_libraries(${TARGET} dynetcuda) CUDA_ADD_CUBLAS_TO_TARGET(${TARGET}) else() - target_link_libraries(${TARGET} cnn ${LIBS}) + target_link_libraries(${TARGET} dynet ${LIBS}) endif (WITH_CUDA_BACKEND) if(UNIX AND NOT APPLE) target_link_libraries(${TARGET} rt) diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index 08727a7f4..fcf8ba1fb 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -1,9 +1,9 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/dict.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/dict.h" +#include "dynet/expr.h" #include #include @@ -13,15 +13,15 @@ #include using namespace std; -using namespace cnn; -using namespace cnn::expr; +using namespace dynet; +using namespace dynet::expr; unsigned REP_DIM = 128; unsigned INPUT_VOCAB_SIZE = 0; unsigned OUTPUT_VOCAB_SIZE = 0; -cnn::Dict sd; -cnn::Dict td; +dynet::Dict sd; +dynet::Dict td; int kSRC_SOS; int kSRC_EOS; int kTRG_SOS; @@ -77,7 +77,7 @@ struct Encoder { }; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; diff --git a/examples/encdec.cc b/examples/encdec.cc index 3d434bc03..89e6ef2d5 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -1,11 +1,11 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" #include "getpid.h" #include @@ -16,8 +16,8 @@ #include using namespace std; -using namespace cnn; -using namespace cnn::expr; +using namespace dynet; +using namespace dynet::expr; //parameters unsigned LAYERS = 3; @@ -26,7 +26,7 @@ unsigned HIDDEN_DIM = 500; unsigned INPUT_VOCAB_SIZE = 0; unsigned OUTPUT_VOCAB_SIZE = 0; -cnn::Dict d, devd; +dynet::Dict d, devd; int kSOS; int kEOS; @@ -133,7 +133,7 @@ struct EncoderDecoder { }; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; diff --git a/examples/mlc.cc b/examples/mlc.cc index 1c96d34b2..adf33a98d 100644 --- a/examples/mlc.cc +++ b/examples/mlc.cc @@ -1,9 +1,9 @@ -#include "cnn/timing.h" -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/expr.h" -#include "cnn/grad-check.h" +#include "dynet/timing.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/expr.h" +#include "dynet/grad-check.h" #include #include @@ -12,8 +12,8 @@ #include using namespace std; -using namespace cnn; -using namespace cnn::expr; +using namespace dynet; +using namespace dynet::expr; struct TrainingInstance { TrainingInstance() {} @@ -107,7 +107,7 @@ struct MLCBuilder { }; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); if (argc != 5) { cerr << "Usage: " << argv[0] << " x.train.txt y.train.txt x.dev.txt y.dev.txt\n"; diff --git a/examples/nlm.cc b/examples/nlm.cc index 0cd748628..5eb1779e1 100644 --- a/examples/nlm.cc +++ b/examples/nlm.cc @@ -1,8 +1,8 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/expr.h" #include #include @@ -10,11 +10,11 @@ #include using namespace std; -using namespace cnn; -using namespace cnn::expr; +using namespace dynet; +using namespace dynet::expr; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); unsigned CONTEXT = 3; unsigned DIM = 100; diff --git a/examples/poisson-regression.cc b/examples/poisson-regression.cc index 32acb0d5d..f4389bc87 100644 --- a/examples/poisson-regression.cc +++ b/examples/poisson-regression.cc @@ -1,14 +1,14 @@ -#include "cnn/grad-check.h" -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/deep-lstm.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -#include "cnn/expr.h" +#include "dynet/grad-check.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/deep-lstm.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" #include "getpid.h" #include @@ -19,14 +19,14 @@ #include using namespace std; -using namespace cnn; +using namespace dynet; unsigned LAYERS = 2; unsigned INPUT_DIM = 16; //256 unsigned HIDDEN_DIM = 32; // 1024 unsigned VOCAB_SIZE = 0; -cnn::Dict d; +dynet::Dict d; int kSOS; int kEOS; @@ -65,7 +65,7 @@ struct RNNLengthPredictor { }; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; diff --git a/examples/read-write.cc b/examples/read-write.cc index 559b126d3..3982e2865 100644 --- a/examples/read-write.cc +++ b/examples/read-write.cc @@ -1,8 +1,8 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/gpu-ops.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/gpu-ops.h" +#include "dynet/expr.h" #include #include @@ -10,8 +10,8 @@ #include using namespace std; -using namespace cnn; -using namespace cnn::expr; +using namespace dynet; +using namespace dynet::expr; // This is a sample class which implements the xor model from xor.cc @@ -26,7 +26,7 @@ class XORModel { // It is important to have a null default constructor for the class, as // we would first need to read the class object from the file, followed by - // the cnn model which has saved parameters. + // the dynet model which has saved parameters. XORModel() {} XORModel(unsigned hidden_len, Model& m) { @@ -48,12 +48,12 @@ class XORModel { a = parameter(cg, pa); } - float Train(const vector& input, cnn::real gold_output, SimpleSGDTrainer* sgd) { + float Train(const vector& input, dynet::real gold_output, SimpleSGDTrainer* sgd) { ComputationGraph cg; NewGraph(cg); - Expression x = cnn::expr::input(cg, {(unsigned int)input.size()}, &input); - Expression y = cnn::expr::input(cg, &gold_output); + Expression x = dynet::expr::input(cg, {(unsigned int)input.size()}, &input); + Expression y = dynet::expr::input(cg, &gold_output); Expression h = tanh(W*x + b); Expression y_pred = V*h + a; @@ -65,11 +65,11 @@ class XORModel { return return_loss; } - float Decode(vector& input) { + float Decode(vector& input) { ComputationGraph cg; NewGraph(cg); - Expression x = cnn::expr::input(cg, {(unsigned int)input.size()}, &input); + Expression x = dynet::expr::input(cg, {(unsigned int)input.size()}, &input); Expression h = tanh(W*x + b); Expression y_pred = V*h + a; return as_scalar(cg.forward(y_pred)); @@ -94,25 +94,25 @@ class XORModel { } }; -void WriteToFile(string& filename, XORModel& model, Model& cnn_model) { +void WriteToFile(string& filename, XORModel& model, Model& dynet_model) { ofstream outfile(filename); if (!outfile.is_open()) { cerr << "File opening failed" << endl; exit(1); } - // Write out the CNN model and the XOR model. - // It's important to write the CNN model first. - // Since the XOR model uses the CNN model, + // Write out the DYNET model and the XOR model. + // It's important to write the DYNET model first. + // Since the XOR model uses the DYNET model, // saving in the opposite order will generate a // boost archive "Pointer Conflict" exception. boost::archive::text_oarchive oa(outfile); - oa & cnn_model; // Write down the cnn::Model object. + oa & dynet_model; // Write down the dynet::Model object. oa & model; // Write down your class object. outfile.close(); } -void ReadFromFile(string& filename, XORModel& model, Model& cnn_model) { +void ReadFromFile(string& filename, XORModel& model, Model& dynet_model) { ifstream infile(filename); if (!infile.is_open()) { cerr << "File opening failed" << endl; @@ -120,7 +120,7 @@ void ReadFromFile(string& filename, XORModel& model, Model& cnn_model) { } boost::archive::text_iarchive ia(infile); - ia & cnn_model; // Read the cnn::Model + ia & dynet_model; // Read the dynet::Model ia & model; // Read your class object infile.close(); @@ -128,7 +128,7 @@ void ReadFromFile(string& filename, XORModel& model, Model& cnn_model) { int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); const unsigned HIDDEN = 8; const unsigned ITERATIONS = 20; @@ -136,8 +136,8 @@ int main(int argc, char** argv) { SimpleSGDTrainer sgd(&m); XORModel model(HIDDEN, m); - vector x_values(2); // set x_values to change the inputs - cnn::real y_value; // set y_value to change the target output + vector x_values(2); // set x_values to change the inputs + dynet::real y_value; // set y_value to change the target output // Train the model for (unsigned iter = 0; iter < ITERATIONS; ++iter) { @@ -159,11 +159,11 @@ int main(int argc, char** argv) { WriteToFile(outfile, model, m); // Writing objects to file // New objects in which the written archive will be read - Model read_cnn_model; + Model read_dynet_model; XORModel read_model; cerr << "Reading model from File: " << outfile << endl; - ReadFromFile(outfile, read_model, read_cnn_model); // Reading from file + ReadFromFile(outfile, read_model, read_dynet_model); // Reading from file cerr << "Output for the input: " << x_values[0] << " " << x_values[1] << endl; cerr << read_model.Decode(x_values); // Checking output for sanity } diff --git a/examples/rnnlm-aevb.cc b/examples/rnnlm-aevb.cc index 33bdc7e59..76cbbb7ff 100644 --- a/examples/rnnlm-aevb.cc +++ b/examples/rnnlm-aevb.cc @@ -1,12 +1,12 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" #include "getpid.h" #include @@ -17,7 +17,7 @@ #include using namespace std; -using namespace cnn; +using namespace dynet; unsigned LAYERS = 2; unsigned INPUT_DIM = 32; //256 @@ -28,7 +28,7 @@ unsigned LATENT_DIM = 2; unsigned L = 10; vector> eps(L, vector(LATENT_DIM)); -cnn::Dict d; +dynet::Dict d; int kSOS; int kEOS; @@ -120,7 +120,7 @@ struct RNNLanguageModel { }; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; diff --git a/examples/rnnlm-batch.cc b/examples/rnnlm-batch.cc index 7e5def104..7d93f2f45 100644 --- a/examples/rnnlm-batch.cc +++ b/examples/rnnlm-batch.cc @@ -1,12 +1,12 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" #include "getpid.h" #include @@ -18,7 +18,7 @@ #include using namespace std; -using namespace cnn; +using namespace dynet; unsigned LAYERS = 2; unsigned INPUT_DIM = 8; //256 @@ -26,7 +26,7 @@ unsigned HIDDEN_DIM = 24; // 1024 unsigned BATCH_SIZE = 4; unsigned VOCAB_SIZE = 0; -cnn::Dict d; +dynet::Dict d; int kSOS; int kEOS; @@ -118,7 +118,7 @@ struct CompareLen { }; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; diff --git a/examples/rnnlm-cfsm.cc b/examples/rnnlm-cfsm.cc index 537ea270d..075280adc 100644 --- a/examples/rnnlm-cfsm.cc +++ b/examples/rnnlm-cfsm.cc @@ -1,13 +1,13 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -#include "cnn/expr.h" -#include "cnn/cfsm-builder.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" +#include "dynet/cfsm-builder.h" #include "getpid.h" #include @@ -18,14 +18,14 @@ #include using namespace std; -using namespace cnn; +using namespace dynet; unsigned LAYERS = 2; unsigned INPUT_DIM = 256; //256 unsigned HIDDEN_DIM = 256; // 1024 unsigned VOCAB_SIZE = 0; -cnn::Dict d; +dynet::Dict d; int kSOS; int kEOS; @@ -82,7 +82,7 @@ struct RNNLanguageModel { }; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); if (argc != 4 && argc != 5) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt clusters.txt [model.params]\n"; return 1; diff --git a/examples/rnnlm-givenbag.cc b/examples/rnnlm-givenbag.cc index 768784258..e28d6e89d 100644 --- a/examples/rnnlm-givenbag.cc +++ b/examples/rnnlm-givenbag.cc @@ -1,13 +1,13 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -# include "cnn/expr.h" -#include "cnn/grad-check.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +# include "dynet/expr.h" +#include "dynet/grad-check.h" #include "getpid.h" #include @@ -18,14 +18,14 @@ #include using namespace std; -using namespace cnn; +using namespace dynet; unsigned LAYERS = 2; unsigned INPUT_DIM = 8; //256 unsigned HIDDEN_DIM = 24; // 1024 unsigned VOCAB_SIZE = 0; -cnn::Dict d; +dynet::Dict d; int kSOS; int kEOS; @@ -105,7 +105,7 @@ struct RNNLanguageModel { }; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; diff --git a/examples/rnnlm-mp.cc b/examples/rnnlm-mp.cc index 931dab27f..5b1f74e92 100644 --- a/examples/rnnlm-mp.cc +++ b/examples/rnnlm-mp.cc @@ -1,8 +1,8 @@ -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/expr.h" -#include "cnn/lstm.h" -#include "cnn/mp.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/expr.h" +#include "dynet/lstm.h" +#include "dynet/mp.h" #include "rnnlm.h" #include @@ -15,9 +15,9 @@ */ using namespace std; -using namespace cnn; -using namespace cnn::expr; -using namespace cnn::mp; +using namespace dynet; +using namespace dynet::expr; +using namespace dynet::mp; using namespace boost::interprocess; typedef vector Datum; @@ -37,15 +37,15 @@ vector ReadData(string filename) { } template -class Learner : public ILearner { +class Learner : public ILearner { public: explicit Learner(RNNLanguageModel& rnnlm, unsigned data_size) : rnnlm(rnnlm) {} ~Learner() {} - cnn::real LearnFromDatum(const D& datum, bool learn) { + dynet::real LearnFromDatum(const D& datum, bool learn) { ComputationGraph cg; Expression loss_expr = rnnlm.BuildLMGraph(datum, cg); - cnn::real loss = as_scalar(cg.forward(loss_expr)); + dynet::real loss = as_scalar(cg.forward(loss_expr)); if (learn) { cg.backward(loss_expr); } @@ -72,7 +72,7 @@ int main(int argc, char** argv) { unsigned dev_frequency = 5000; unsigned report_frequency = 10; - cnn::initialize(argc, argv, true); + dynet::initialize(argc, argv, true); Model model; SimpleSGDTrainer sgd(&model, 0.2); diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 9c46ca78d..175a99347 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -1,12 +1,12 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" #include "getpid.h" #include @@ -17,14 +17,14 @@ #include using namespace std; -using namespace cnn; +using namespace dynet; unsigned LAYERS = 2; unsigned INPUT_DIM = 8; //256 unsigned HIDDEN_DIM = 24; // 1024 unsigned VOCAB_SIZE = 0; -cnn::Dict d; +dynet::Dict d; int kSOS; int kEOS; @@ -116,7 +116,7 @@ struct RNNLanguageModel { }; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; diff --git a/examples/rnnlm.h b/examples/rnnlm.h index 3b6cf0baa..45a92ffea 100644 --- a/examples/rnnlm.h +++ b/examples/rnnlm.h @@ -1,20 +1,20 @@ -#include "cnn/cnn.h" -#include "cnn/expr.h" -#include "cnn/dict.h" -#include "cnn/lstm.h" +#include "dynet/dynet.h" +#include "dynet/expr.h" +#include "dynet/dict.h" +#include "dynet/lstm.h" #include using namespace std; -using namespace cnn; -using namespace cnn::expr; +using namespace dynet; +using namespace dynet::expr; unsigned LAYERS = 2; unsigned INPUT_DIM = 8; //256 unsigned HIDDEN_DIM = 24; // 1024 unsigned VOCAB_SIZE = 5500; -cnn::Dict d; +dynet::Dict d; int kSOS; int kEOS; diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index eb4a9ec43..fabfa9023 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -1,12 +1,12 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" #include #include @@ -23,7 +23,7 @@ using namespace std; -using namespace cnn; +using namespace dynet; namespace po = boost::program_options; @@ -74,7 +74,7 @@ struct SymbolEmbedding { SymbolEmbedding(Model& m, unsigned n, unsigned dim) { p_labels = m.add_lookup_parameters(n, {dim}); } - void load_embedding(cnn::Dict& d, string pretrain_path){ + void load_embedding(dynet::Dict& d, string pretrain_path){ ifstream fin(pretrain_path); string s; while( getline(fin,s) ) @@ -304,9 +304,9 @@ struct SegmentalRNN { DurationEmbedding* de; BiTrans bt; SegEmbedBi seb; - cnn::Dict d; - cnn::Dict td; - explicit SegmentalRNN(Model& model, cnn::Dict& d_, cnn::Dict& td_) : + dynet::Dict d; + dynet::Dict td; + explicit SegmentalRNN(Model& model, dynet::Dict& d_, dynet::Dict& td_) : bt(model), seb(model) { d = d_; td = td_; @@ -705,7 +705,7 @@ struct SegmentalRNN { }; // a a 0 1 a ||| O:1 O:1 N:2 O:1 -pair,vector>> ParseTrainingInstance(const std::string& line, cnn::Dict& d, cnn::Dict& td, bool test_only = false) { +pair,vector>> ParseTrainingInstance(const std::string& line, dynet::Dict& d, dynet::Dict& td, bool test_only = false) { std::istringstream in(line); std::string word; std::string sep = "|||"; @@ -755,8 +755,8 @@ bool inline check_max_seg(const vector>& yz, int max_seg_len = 0){ double evaluate(vector>>& yz_preds, vector>>& yz_golds, - cnn::Dict& d, - cnn::Dict& td){ + dynet::Dict& d, + dynet::Dict& td){ assert(yz_preds.size() == yz_golds.size()); int p_correct = 0; int r_correct = 0; @@ -859,8 +859,8 @@ void test_only(SegmentalRNN& segrnn, } void read_file(string file_path, - cnn::Dict& d, - cnn::Dict& td, + dynet::Dict& d, + dynet::Dict& td, vector,vector>>>& read_set, bool test_only = false) { @@ -878,8 +878,8 @@ void read_file(string file_path, } void save_models(string model_file_prefix, - cnn::Dict& d, - cnn::Dict& td, + dynet::Dict& d, + dynet::Dict& td, Model& model){ cerr << "saving models..." << endl; @@ -917,8 +917,8 @@ void load_models(string model_file_prefix, } void load_dicts(string model_file_prefix, - cnn::Dict& d, - cnn::Dict& td) + dynet::Dict& d, + dynet::Dict& td) { cerr << "loading dicts..." << endl; string f_d_name = model_file_prefix + ".dict"; @@ -951,8 +951,8 @@ unsigned int edit_distance(const std::string& s1, const std::string& s2) double evaluate_partial(vector>>& yz_preds, vector>>& yz_golds, - cnn::Dict& d, - cnn::Dict& td){ + dynet::Dict& d, + dynet::Dict& td){ assert(yz_preds.size() == yz_golds.size()); int total_length_gold = 0; @@ -1010,7 +1010,7 @@ double predict_and_evaluate(SegmentalRNN& segrnn, int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); int test_max_seg_len; int max_consider_sentence_len; unsigned dev_every_i_reports; @@ -1063,8 +1063,8 @@ int main(int argc, char** argv) { } // create two dictionaries - cnn::Dict d; - cnn::Dict td; + dynet::Dict d; + dynet::Dict td; vector,vector>>> training, dev, test; read_file(vm["train_file"].as(), d, td, training); @@ -1165,8 +1165,8 @@ int main(int argc, char** argv) { use_pretrained_embeding = false; use_dropout = false; Model model; - cnn::Dict d; - cnn::Dict td; + dynet::Dict d; + dynet::Dict td; load_dicts(vm["model_file_prefix"].as(), d, td); SegmentalRNN segrnn(model, d, td); load_models(vm["model_file_prefix"].as(), model); diff --git a/examples/skiprnnlm.cc b/examples/skiprnnlm.cc index a2403dc25..2c43acada 100644 --- a/examples/skiprnnlm.cc +++ b/examples/skiprnnlm.cc @@ -1,12 +1,12 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" #include "easylogging++.h" @@ -19,7 +19,7 @@ #include using namespace std; -using namespace cnn; +using namespace dynet; INITIALIZE_EASYLOGGINGPP @@ -28,7 +28,7 @@ unsigned INPUT_DIM = 8; //256 unsigned HIDDEN_DIM = 24; // 1024 unsigned VOCAB_SIZE = 0; -cnn::Dict d; +dynet::Dict d; int kSOS; int kEOS; @@ -99,7 +99,7 @@ int main(int argc, char** argv) { defaultConf.set(el::Level::Info, el::ConfigurationType::Format, "%datetime{%h:%m:%s} %level %msg"); el::Loggers::reconfigureLogger("default", defaultConf); - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); if (argc != 3 && argc != 4) { LOG(INFO) << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; diff --git a/examples/tag-bilstm.cc b/examples/tag-bilstm.cc index 1e56f2478..33ab18538 100644 --- a/examples/tag-bilstm.cc +++ b/examples/tag-bilstm.cc @@ -1,12 +1,12 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" #include "getpid.h" #include @@ -17,7 +17,7 @@ #include using namespace std; -using namespace cnn; +using namespace dynet; float pdrop = 0.5; unsigned LAYERS = 1; @@ -29,8 +29,8 @@ unsigned TAG_SIZE = 0; unsigned VOCAB_SIZE = 0; bool eval = false; -cnn::Dict d; -cnn::Dict td; +dynet::Dict d; +dynet::Dict td; int kNONE; int kSOS; int kEOS; @@ -114,7 +114,7 @@ struct RNNLanguageModel { }; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; diff --git a/examples/textcat.cc b/examples/textcat.cc index 3e8110c51..c3adad526 100644 --- a/examples/textcat.cc +++ b/examples/textcat.cc @@ -1,12 +1,12 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" #include "getpid.h" #include @@ -16,7 +16,7 @@ #include using namespace std; -using namespace cnn; +using namespace dynet; unsigned INPUT_DIM = 36; unsigned OUTPUT_DIM = 36; @@ -24,8 +24,8 @@ unsigned VOCAB_SIZE = 0; unsigned LABEL_SIZE = 0; float pdropout = 0.5; -cnn::Dict d; -cnn::Dict ld; +dynet::Dict d; +dynet::Dict ld; int kSOS; int kEOS; @@ -177,7 +177,7 @@ Expression HingeLoss(const Expression& y_pred, int y_true) { } int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; diff --git a/examples/tok-embed.cc b/examples/tok-embed.cc index f7a83d85b..29118c642 100644 --- a/examples/tok-embed.cc +++ b/examples/tok-embed.cc @@ -1,12 +1,12 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" #include #include @@ -15,7 +15,7 @@ #include using namespace std; -using namespace cnn; +using namespace dynet; unsigned LAYERS = 1; unsigned CODE_DIM = 64; @@ -30,7 +30,7 @@ unsigned VOCAB_SIZE = 0; unsigned DURATION_DIM = 8; bool eval = false; -cnn::Dict d; +dynet::Dict d; int kNONE; int kSOW; int kEOW; @@ -216,7 +216,7 @@ struct BiCharLSTM { }; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); if (argc != 3 && argc != 4) { cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; return 1; diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup.cc index 74bb33c2f..52299891b 100644 --- a/examples/xor-batch-lookup.cc +++ b/examples/xor-batch-lookup.cc @@ -1,8 +1,8 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/gpu-ops.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/gpu-ops.h" +#include "dynet/expr.h" #include #include @@ -10,11 +10,11 @@ #include using namespace std; -using namespace cnn; -using namespace cnn::expr; +using namespace dynet; +using namespace dynet::expr; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); // parameters const unsigned HIDDEN_SIZE = 8; diff --git a/examples/xor-batch.cc b/examples/xor-batch.cc index b90188b89..c1a1fc148 100644 --- a/examples/xor-batch.cc +++ b/examples/xor-batch.cc @@ -1,8 +1,8 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/gpu-ops.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/gpu-ops.h" +#include "dynet/expr.h" #include #include @@ -10,11 +10,11 @@ #include using namespace std; -using namespace cnn; -using namespace cnn::expr; +using namespace dynet; +using namespace dynet::expr; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); // parameters const unsigned HIDDEN_SIZE = 8; @@ -49,10 +49,10 @@ int main(int argc, char** argv) { // set x_values to change the inputs to the network Dim x_dim({2}, 4), y_dim({1}, 4); cerr << "x_dim=" << x_dim << ", y_dim=" << y_dim << endl; - vector x_values = {1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0}; + vector x_values = {1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0}; Expression x = input(cg, x_dim, &x_values); // set y_values expressing the output - vector y_values = {-1.0, 1.0, 1.0, -1.0}; + vector y_values = {-1.0, 1.0, 1.0, -1.0}; Expression y = input(cg, y_dim, &y_values); Expression h = tanh(W*x + b); diff --git a/examples/xor-xent.cc b/examples/xor-xent.cc index 6cf28b263..a8a73b586 100644 --- a/examples/xor-xent.cc +++ b/examples/xor-xent.cc @@ -1,7 +1,7 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/expr.h" #include #include @@ -10,11 +10,11 @@ #include using namespace std; -using namespace cnn; -using namespace cnn::expr; +using namespace dynet; +using namespace dynet::expr; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); // parameters const unsigned HIDDEN_SIZE = 8; @@ -44,7 +44,7 @@ int main(int argc, char** argv) { vector x_values(2); // set x_values to change the inputs to the network Expression x = input(cg, {2}, &x_values); - cnn::real y_value; // set y_value to change the target output + dynet::real y_value; // set y_value to change the target output Expression y = input(cg, &y_value); Expression h = tanh(W*x + b); diff --git a/examples/xor.cc b/examples/xor.cc index 12b9cb03e..37cf93ff3 100644 --- a/examples/xor.cc +++ b/examples/xor.cc @@ -1,8 +1,8 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/gpu-ops.h" -#include "cnn/expr.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/gpu-ops.h" +#include "dynet/expr.h" #include #include @@ -10,11 +10,11 @@ #include using namespace std; -using namespace cnn; -using namespace cnn::expr; +using namespace dynet; +using namespace dynet::expr; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); // parameters const unsigned ITERATIONS = 30; @@ -45,9 +45,9 @@ int main(int argc, char** argv) { Expression V = parameter(cg, p_V); Expression a = parameter(cg, p_a); - vector x_values(2); // set x_values to change the inputs to the network + vector x_values(2); // set x_values to change the inputs to the network Expression x = input(cg, {2}, &x_values); - cnn::real y_value; // set y_value to change the target output + dynet::real y_value; // set y_value to change the target output Expression y = input(cg, &y_value); Expression h = tanh(W*x + b); diff --git a/python/CHANGES.md b/python/CHANGES.md index 37f68f1e4..d8bac41c6 100644 --- a/python/CHANGES.md +++ b/python/CHANGES.md @@ -1,11 +1,11 @@ -# pycnn API changes for v2 +# pydynet API changes for v2 * Model no longer holds named parameters * checkpoint / revert mechanism for computation graph (useful for beam search etc) ## Model no longer holds named parameters -The major API change in v2 of pycnn is in the `Model` class. +The major API change in v2 of pydynet is in the `Model` class. This change breaks backward compatibility, but is easy to adapt to. The `Model` class no longer holds named parameters. This is done in order @@ -53,7 +53,7 @@ For example: ```python # saving: -from pycnn import * +from pydynet import * m = Model() W = m.add_parameters((100,100)) lb = LSTMBuilder(1, 100, 100, m) # this also adds parameters to the model @@ -79,7 +79,7 @@ Notice however that there is no need to specify the sizes etc, as this is handle ```python # saving: -from pycnn import * +from pydynet import * m = Model() W = m.add_parameters((100,100)) lb = LSTMBuilder(1, 100, 100, m) # this also adds parameters to the model @@ -97,7 +97,7 @@ In order to make use of "the new way", the items that are being passed in the li * be of type `Parameters` or `LookupParameters` (the return types of `add_parameters` or `add_lookup_parameters`). * be of a built-in "complex" builders such as `LSTMBuilder` or `GRUBuilder` that add parameters to the model. -* user defied classes that extend to the new `pycnn.Saveable` class and implement the required interface. +* user defied classes that extend to the new `pydynet.Saveable` class and implement the required interface. The `Saveable` class is used for easy creation of user-defined "sub networks" that can be saved and loaded as part of the model saving mechanism. diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 1d44fabaa..27c18e663 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -47,9 +47,9 @@ endif() add_custom_target(target ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/timestamp) add_dependencies(target copy) - add_dependencies(copy cnn) + add_dependencies(copy dynet) if (WITH_CUDA_BACKEND) - add_dependencies(copy gcnn) + add_dependencies(copy gdynet) endif() install(CODE "execute_process(COMMAND ${PYTHON} ${SETUP_PY})") diff --git a/python/dynet.pxd b/python/dynet.pxd index 4cf6cdd55..f265e2370 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -3,11 +3,11 @@ from libcpp.string cimport string ctypedef float real -cdef extern from "cnn/init.h" namespace "cnn": +cdef extern from "dynet/init.h" namespace "dynet": cdef void initialize(int& argc, char **& argv, unsigned random_seed) -cdef extern from "cnn/dim.h" namespace "cnn": - cdef cppclass CDim "cnn::Dim": +cdef extern from "dynet/dim.h" namespace "dynet": + cdef cppclass CDim "dynet::Dim": CDim() except + #CDim(int m) except + #CDim(int m, int n) except + @@ -24,51 +24,51 @@ cdef extern from "cnn/dim.h" namespace "cnn": int size(unsigned i) CDim transpose() -cdef extern from "cnn/tensor.h" namespace "cnn": - cdef cppclass CTensor "cnn::Tensor": +cdef extern from "dynet/tensor.h" namespace "dynet": + cdef cppclass CTensor "dynet::Tensor": CDim d float* v pass - float c_as_scalar "cnn::as_scalar" (CTensor& t) - vector[float] c_as_vector "cnn::as_vector" (CTensor& t) + float c_as_scalar "dynet::as_scalar" (CTensor& t) + vector[float] c_as_vector "dynet::as_vector" (CTensor& t) -cdef extern from "cnn/model.h" namespace "cnn": - cdef cppclass CParameterStorage "cnn::ParameterStorage": +cdef extern from "dynet/model.h" namespace "dynet": + cdef cppclass CParameterStorage "dynet::ParameterStorage": CParameterStorage() CTensor values CDim dim - cdef cppclass CLookupParameterStorage "cnn::LookupParameterStorage": + cdef cppclass CLookupParameterStorage "dynet::LookupParameterStorage": CLookupParameterStorage() vector[CTensor] values CDim dim - cdef cppclass CParameters "cnn::Parameter": + cdef cppclass CParameters "dynet::Parameter": CParameters() CParameterStorage *get() void zero() - cdef cppclass CLookupParameters "cnn::LookupParameter": + cdef cppclass CLookupParameters "dynet::LookupParameter": CLookupParameters() CLookupParameterStorage *get() CDim dim void initialize(unsigned index, const vector[float]& val) void zero() - cdef cppclass CModel "cnn::Model": + cdef cppclass CModel "dynet::Model": CModel() #float gradient_l2_norm() const CParameters add_parameters(CDim& d, float scale = 0.0) CLookupParameters add_lookup_parameters(unsigned n, const CDim& d) vector[CParameterStorage] parameters_list() - void load_cnn_model "cnn::load_cnn_model" (string filename, CModel *model) - void save_cnn_model "cnn::save_cnn_model" (string filename, CModel *model) + void load_dynet_model "dynet::load_dynet_model" (string filename, CModel *model) + void save_dynet_model "dynet::save_dynet_model" (string filename, CModel *model) -cdef extern from "cnn/cnn.h" namespace "cnn": +cdef extern from "dynet/dynet.h" namespace "dynet": ctypedef unsigned VariableIndex - cdef cppclass CComputationGraph "cnn::ComputationGraph": + cdef cppclass CComputationGraph "dynet::ComputationGraph": CComputationGraph() except + # Inputs VariableIndex add_input(real s) @@ -94,35 +94,35 @@ cdef extern from "cnn/cnn.h" namespace "cnn": void print_graphviz() const -cdef extern from "cnn/training.h" namespace "cnn": - cdef cppclass CSimpleSGDTrainer "cnn::SimpleSGDTrainer": +cdef extern from "dynet/training.h" namespace "dynet": + cdef cppclass CSimpleSGDTrainer "dynet::SimpleSGDTrainer": #CSimpleSGDTrainer(CModel* m, float lam, float e0) CSimpleSGDTrainer(CModel* m, float e0) # TODO removed lam, update docs. void update(float s) void update_epoch(float r) void status() - cdef cppclass CMomentumSGDTrainer "cnn::MomentumSGDTrainer": + cdef cppclass CMomentumSGDTrainer "dynet::MomentumSGDTrainer": CMomentumSGDTrainer(CModel* m, float e0, float mom) # TODO removed lam, update docs void update(float s) void update_epoch(float r) void status() - cdef cppclass CAdagradTrainer "cnn::AdagradTrainer": + cdef cppclass CAdagradTrainer "dynet::AdagradTrainer": CAdagradTrainer(CModel* m, float e0, float eps) # TODO removed lam, update docs void update(float s) void update_epoch(float r) void status() - cdef cppclass CAdadeltaTrainer "cnn::AdadeltaTrainer": + cdef cppclass CAdadeltaTrainer "dynet::AdadeltaTrainer": CAdadeltaTrainer(CModel* m, float eps, float rho) # TODO removed lam, update docs void update(float s) void update_epoch(float r) void status() - cdef cppclass CAdamTrainer "cnn::AdamTrainer": + cdef cppclass CAdamTrainer "dynet::AdamTrainer": CAdamTrainer(CModel* m, float alpha, float beta_1, float beta_2, float eps) # TODO removed lam, update docs void update(float s) @@ -130,111 +130,111 @@ cdef extern from "cnn/training.h" namespace "cnn": void status() -cdef extern from "cnn/expr.h" namespace "cnn::expr": - cdef cppclass CExpression "cnn::expr::Expression": +cdef extern from "dynet/expr.h" namespace "dynet::expr": + cdef cppclass CExpression "dynet::expr::Expression": CExpression() CExpression(CComputationGraph *pg, VariableIndex i) CComputationGraph *pg long i - #CExpression c_input "cnn::expr::input" (CComputationGraph& g, float s) # - CExpression c_input "cnn::expr::input" (CComputationGraph& g, float *ps) # - CExpression c_input "cnn::expr::input" (CComputationGraph& g, CDim& d, vector[float]* pdata) - CExpression c_parameter "cnn::expr::parameter" (CComputationGraph& g, CParameters p) # - #CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # - CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters p, unsigned* pindex) # - CExpression c_lookup "cnn::expr::lookup" (CComputationGraph& g, CLookupParameters p, vector[unsigned]* pindices) # - #CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # - CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters p, unsigned* pindex) # - CExpression c_const_lookup "cnn::expr::const_lookup" (CComputationGraph& g, CLookupParameters p, vector[unsigned]* pindices) # + #CExpression c_input "dynet::expr::input" (CComputationGraph& g, float s) # + CExpression c_input "dynet::expr::input" (CComputationGraph& g, float *ps) # + CExpression c_input "dynet::expr::input" (CComputationGraph& g, CDim& d, vector[float]* pdata) + CExpression c_parameter "dynet::expr::parameter" (CComputationGraph& g, CParameters p) # + #CExpression c_lookup "dynet::expr::lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # + CExpression c_lookup "dynet::expr::lookup" (CComputationGraph& g, CLookupParameters p, unsigned* pindex) # + CExpression c_lookup "dynet::expr::lookup" (CComputationGraph& g, CLookupParameters p, vector[unsigned]* pindices) # + #CExpression c_const_lookup "dynet::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # + CExpression c_const_lookup "dynet::expr::const_lookup" (CComputationGraph& g, CLookupParameters p, unsigned* pindex) # + CExpression c_const_lookup "dynet::expr::const_lookup" (CComputationGraph& g, CLookupParameters p, vector[unsigned]* pindices) # # identity function, but derivative is not propagated through it - CExpression c_nobackprop "cnn::expr::nobackprop" (CExpression& x) # - - CExpression c_op_neg "cnn::expr::operator-" (CExpression& x) # - CExpression c_op_add "cnn::expr::operator+" (CExpression& x, CExpression& y) # - CExpression c_op_scalar_add "cnn::expr::operator+" (CExpression& x, float y) # - CExpression c_op_mul "cnn::expr::operator*" (CExpression& x, CExpression& y) # - CExpression c_op_scalar_mul "cnn::expr::operator*" (CExpression& x, float y) # - CExpression c_op_scalar_div "cnn::expr::operator/" (CExpression& x, float y) # - CExpression c_op_scalar_sub "cnn::expr::operator-" (float y, CExpression& x) # - - CExpression c_bmax "cnn::expr::max" (CExpression& x, CExpression& y) # - CExpression c_bmin "cnn::expr::min" (CExpression& x, CExpression& y) # - - CExpression c_cdiv "cnn::expr::cdiv" (CExpression& x, CExpression& y) # - CExpression c_colwise_add "cnn::expr::colwise_add" (CExpression& x, CExpression& bias) # - - CExpression c_tanh "cnn::expr::tanh" (CExpression& x) # - CExpression c_exp "cnn::expr::exp" (CExpression& x) # - CExpression c_square "cnn::expr::square" (CExpression& x) # - CExpression c_cube "cnn::expr::cube" (CExpression& x) # - CExpression c_log "cnn::expr::log" (CExpression& x) # - CExpression c_logistic "cnn::expr::logistic" (CExpression& x) # - CExpression c_rectify "cnn::expr::rectify" (CExpression& x) # - #CExpression c_hinge "cnn::expr::hinge" (CExpression& x, unsigned index, float m=?) # - CExpression c_hinge "cnn::expr::hinge" (CExpression& x, unsigned* pindex, float m) # - CExpression c_log_softmax "cnn::expr::log_softmax" (CExpression& x) # - CExpression c_log_softmax "cnn::expr::log_softmax" (CExpression& x, vector[unsigned]& restriction) #? - CExpression c_softmax "cnn::expr::softmax" (CExpression& x) # - CExpression c_softsign "cnn::expr::softsign" (CExpression& x) # - CExpression c_bmin "cnn::expr::min" (CExpression& x, CExpression& y) # - CExpression c_bmax "cnn::expr::max" (CExpression& x, CExpression& y) # - CExpression c_noise "cnn::expr::noise" (CExpression& x, float stddev) # - CExpression c_dropout "cnn::expr::dropout" (CExpression& x, float p) # - CExpression c_block_dropout "cnn::expr::block_dropout" (CExpression& x, float p) # - - CExpression c_reshape "cnn::expr::reshape" (CExpression& x, CDim& d) #? - CExpression c_transpose "cnn::expr::transpose" (CExpression& x) # - - CExpression c_affine_transform "cnn::expr::affine_transform" (const vector[CExpression]& xs) - - CExpression c_trace_of_product "cnn::expr::trace_of_product" (CExpression& x, CExpression& y); - CExpression c_cwise_multiply "cnn::expr::cwise_multiply" (CExpression& x, CExpression& y) # - - CExpression c_dot_product "cnn::expr::dot_product" (CExpression& x, CExpression& y) # - CExpression c_squared_distance "cnn::expr::squared_distance" (CExpression& x, CExpression& y) # - CExpression c_huber_distance "cnn::expr::huber_distance" (CExpression& x, CExpression& y, float c) # - CExpression c_l1_distance "cnn::expr::l1_distance" (CExpression& x, CExpression& y) # - CExpression c_binary_log_loss "cnn::expr::binary_log_loss" (CExpression& x, CExpression& y) # - CExpression c_pairwise_rank_loss "cnn::expr::pairwise_rank_loss" (CExpression& x, CExpression& y, float m) # - CExpression c_poisson_loss "cnn::expr::poisson_loss" (CExpression& x, unsigned y) - - CExpression c_conv1d_narrow "cnn::expr::conv1d_narrow" (CExpression& x, CExpression& f) # - CExpression c_conv1d_wide "cnn::expr::conv1d_wide" (CExpression& x, CExpression& f) # - CExpression c_filter1d_narrow "cnn::expr::filter1d_narrow" (CExpression& x, CExpression& f) # - CExpression c_kmax_pooling "cnn::expr::kmax_pooling" (CExpression& x, unsigned k) # - CExpression c_fold_rows "cnn::expr::fold_rows" (CExpression& x, unsigned nrows) # - CExpression c_sum_cols "cnn::expr::sum_cols" (CExpression& x) # - CExpression c_kmh_ngram "cnn::expr::kmh_ngram" (CExpression& x, unsigned n) # - - CExpression c_sum_batches "cnn::expr::sum_batches" (CExpression& x) - - #CExpression c_pick "cnn::expr::pick" (CExpression& x, unsigned v) # - CExpression c_pick "cnn::expr::pick" (CExpression& x, unsigned* pv) # - CExpression c_pick "cnn::expr::pick" (CExpression& x, vector[unsigned]* pv) # - CExpression c_pickrange "cnn::expr::pickrange" (CExpression& x, unsigned v, unsigned u) # - - CExpression c_pickneglogsoftmax "cnn::expr::pickneglogsoftmax" (CExpression& x, unsigned v) # - CExpression c_pickneglogsoftmax "cnn::expr::pickneglogsoftmax" (CExpression& x, vector[unsigned] vs) # + CExpression c_nobackprop "dynet::expr::nobackprop" (CExpression& x) # + + CExpression c_op_neg "dynet::expr::operator-" (CExpression& x) # + CExpression c_op_add "dynet::expr::operator+" (CExpression& x, CExpression& y) # + CExpression c_op_scalar_add "dynet::expr::operator+" (CExpression& x, float y) # + CExpression c_op_mul "dynet::expr::operator*" (CExpression& x, CExpression& y) # + CExpression c_op_scalar_mul "dynet::expr::operator*" (CExpression& x, float y) # + CExpression c_op_scalar_div "dynet::expr::operator/" (CExpression& x, float y) # + CExpression c_op_scalar_sub "dynet::expr::operator-" (float y, CExpression& x) # + + CExpression c_bmax "dynet::expr::max" (CExpression& x, CExpression& y) # + CExpression c_bmin "dynet::expr::min" (CExpression& x, CExpression& y) # + + CExpression c_cdiv "dynet::expr::cdiv" (CExpression& x, CExpression& y) # + CExpression c_colwise_add "dynet::expr::colwise_add" (CExpression& x, CExpression& bias) # + + CExpression c_tanh "dynet::expr::tanh" (CExpression& x) # + CExpression c_exp "dynet::expr::exp" (CExpression& x) # + CExpression c_square "dynet::expr::square" (CExpression& x) # + CExpression c_cube "dynet::expr::cube" (CExpression& x) # + CExpression c_log "dynet::expr::log" (CExpression& x) # + CExpression c_logistic "dynet::expr::logistic" (CExpression& x) # + CExpression c_rectify "dynet::expr::rectify" (CExpression& x) # + #CExpression c_hinge "dynet::expr::hinge" (CExpression& x, unsigned index, float m=?) # + CExpression c_hinge "dynet::expr::hinge" (CExpression& x, unsigned* pindex, float m) # + CExpression c_log_softmax "dynet::expr::log_softmax" (CExpression& x) # + CExpression c_log_softmax "dynet::expr::log_softmax" (CExpression& x, vector[unsigned]& restriction) #? + CExpression c_softmax "dynet::expr::softmax" (CExpression& x) # + CExpression c_softsign "dynet::expr::softsign" (CExpression& x) # + CExpression c_bmin "dynet::expr::min" (CExpression& x, CExpression& y) # + CExpression c_bmax "dynet::expr::max" (CExpression& x, CExpression& y) # + CExpression c_noise "dynet::expr::noise" (CExpression& x, float stddev) # + CExpression c_dropout "dynet::expr::dropout" (CExpression& x, float p) # + CExpression c_block_dropout "dynet::expr::block_dropout" (CExpression& x, float p) # + + CExpression c_reshape "dynet::expr::reshape" (CExpression& x, CDim& d) #? + CExpression c_transpose "dynet::expr::transpose" (CExpression& x) # + + CExpression c_affine_transform "dynet::expr::affine_transform" (const vector[CExpression]& xs) + + CExpression c_trace_of_product "dynet::expr::trace_of_product" (CExpression& x, CExpression& y); + CExpression c_cwise_multiply "dynet::expr::cwise_multiply" (CExpression& x, CExpression& y) # + + CExpression c_dot_product "dynet::expr::dot_product" (CExpression& x, CExpression& y) # + CExpression c_squared_distance "dynet::expr::squared_distance" (CExpression& x, CExpression& y) # + CExpression c_huber_distance "dynet::expr::huber_distance" (CExpression& x, CExpression& y, float c) # + CExpression c_l1_distance "dynet::expr::l1_distance" (CExpression& x, CExpression& y) # + CExpression c_binary_log_loss "dynet::expr::binary_log_loss" (CExpression& x, CExpression& y) # + CExpression c_pairwise_rank_loss "dynet::expr::pairwise_rank_loss" (CExpression& x, CExpression& y, float m) # + CExpression c_poisson_loss "dynet::expr::poisson_loss" (CExpression& x, unsigned y) + + CExpression c_conv1d_narrow "dynet::expr::conv1d_narrow" (CExpression& x, CExpression& f) # + CExpression c_conv1d_wide "dynet::expr::conv1d_wide" (CExpression& x, CExpression& f) # + CExpression c_filter1d_narrow "dynet::expr::filter1d_narrow" (CExpression& x, CExpression& f) # + CExpression c_kmax_pooling "dynet::expr::kmax_pooling" (CExpression& x, unsigned k) # + CExpression c_fold_rows "dynet::expr::fold_rows" (CExpression& x, unsigned nrows) # + CExpression c_sum_cols "dynet::expr::sum_cols" (CExpression& x) # + CExpression c_kmh_ngram "dynet::expr::kmh_ngram" (CExpression& x, unsigned n) # + + CExpression c_sum_batches "dynet::expr::sum_batches" (CExpression& x) + + #CExpression c_pick "dynet::expr::pick" (CExpression& x, unsigned v) # + CExpression c_pick "dynet::expr::pick" (CExpression& x, unsigned* pv) # + CExpression c_pick "dynet::expr::pick" (CExpression& x, vector[unsigned]* pv) # + CExpression c_pickrange "dynet::expr::pickrange" (CExpression& x, unsigned v, unsigned u) # + + CExpression c_pickneglogsoftmax "dynet::expr::pickneglogsoftmax" (CExpression& x, unsigned v) # + CExpression c_pickneglogsoftmax "dynet::expr::pickneglogsoftmax" (CExpression& x, vector[unsigned] vs) # # expecting a vector of CExpression - CExpression c_average "cnn::expr::average" (vector[CExpression]& xs) - CExpression c_concat_cols "cnn::expr::concatenate_cols" (vector[CExpression]& xs) - CExpression c_concat "cnn::expr::concatenate" (vector[CExpression]& xs) + CExpression c_average "dynet::expr::average" (vector[CExpression]& xs) + CExpression c_concat_cols "dynet::expr::concatenate_cols" (vector[CExpression]& xs) + CExpression c_concat "dynet::expr::concatenate" (vector[CExpression]& xs) - CExpression c_sum "cnn::expr::sum" (vector[CExpression]& xs) - CExpression c_max "cnn::expr::vmax" (vector[CExpression]& xs) + CExpression c_sum "dynet::expr::sum" (vector[CExpression]& xs) + CExpression c_max "dynet::expr::vmax" (vector[CExpression]& xs) -#cdef extern from "cnn/model.h" namespace "cnn": +#cdef extern from "dynet/model.h" namespace "dynet": # cdef cppclass Model: -cdef extern from "cnn/rnn.h" namespace "cnn": - cdef cppclass CRNNPointer "cnn::RNNPointer": +cdef extern from "dynet/rnn.h" namespace "dynet": + cdef cppclass CRNNPointer "dynet::RNNPointer": CRNNPointer() CRNNPointer(int i) - cdef cppclass CRNNBuilder "cnn::RNNBuilder": + cdef cppclass CRNNBuilder "dynet::RNNBuilder": void new_graph(CComputationGraph &cg) void start_new_sequence(vector[CExpression] ces) CExpression add_input(CExpression &x) @@ -250,9 +250,9 @@ cdef extern from "cnn/rnn.h" namespace "cnn": void disable_dropout() # TODO unify with LSTMBuilder using inheritance -cdef extern from "cnn/rnn.h" namespace "cnn": - #cdef cppclass RNNBuilder "cnn::RNNBuilder": - cdef cppclass CSimpleRNNBuilder "cnn::SimpleRNNBuilder" (CRNNBuilder): +cdef extern from "dynet/rnn.h" namespace "dynet": + #cdef cppclass RNNBuilder "dynet::RNNBuilder": + cdef cppclass CSimpleRNNBuilder "dynet::SimpleRNNBuilder" (CRNNBuilder): CSimpleRNNBuilder() CSimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) #void new_graph(CComputationGraph &cg) @@ -267,8 +267,8 @@ cdef extern from "cnn/rnn.h" namespace "cnn": #vector[CExpression] get_s(CRNNPointer i) #CRNNPointer state() -cdef extern from "cnn/gru.h" namespace "cnn": - cdef cppclass CGRUBuilder "cnn::GRUBuilder" (CRNNBuilder): +cdef extern from "dynet/gru.h" namespace "dynet": + cdef cppclass CGRUBuilder "dynet::GRUBuilder" (CRNNBuilder): CGRUBuilder() CGRUBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) #void new_graph(CComputationGraph &cg) @@ -283,8 +283,8 @@ cdef extern from "cnn/gru.h" namespace "cnn": #vector[CExpression] get_s(CRNNPointer i) #CRNNPointer state() -cdef extern from "cnn/lstm.h" namespace "cnn": - cdef cppclass CLSTMBuilder "cnn::LSTMBuilder" (CRNNBuilder): +cdef extern from "dynet/lstm.h" namespace "dynet": + cdef cppclass CLSTMBuilder "dynet::LSTMBuilder" (CRNNBuilder): CLSTMBuilder() CLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) #void new_graph(CComputationGraph &cg) @@ -299,8 +299,8 @@ cdef extern from "cnn/lstm.h" namespace "cnn": #vector[CExpression] get_s(CRNNPointer i) #CRNNPointer state() -cdef extern from "cnn/fast-lstm.h" namespace "cnn": - cdef cppclass CFastLSTMBuilder "cnn::FastLSTMBuilder" (CRNNBuilder): +cdef extern from "dynet/fast-lstm.h" namespace "dynet": + cdef cppclass CFastLSTMBuilder "dynet::FastLSTMBuilder" (CRNNBuilder): CFastLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) #void new_graph(CComputationGraph &cg) #void start_new_sequence(vector[CExpression] ces) @@ -314,8 +314,8 @@ cdef extern from "cnn/fast-lstm.h" namespace "cnn": #vector[CExpression] get_s(CRNNPointer i) #CRNNPointer state() -cdef extern from "pybridge.h" namespace "pycnn": - cdef cppclass CModelSaver "pycnn::ModelSaver": +cdef extern from "pybridge.h" namespace "pydynet": + cdef cppclass CModelSaver "pydynet::ModelSaver": CModelSaver(string filename, CModel *model) CModelSaver add_parameter(CParameters p) CModelSaver add_lookup_parameter(CLookupParameters lp) @@ -324,7 +324,7 @@ cdef extern from "pybridge.h" namespace "pycnn": CModelSaver add_srnn_builder(CSimpleRNNBuilder b) void done() - cdef cppclass CModelLoader "pycnn::ModelLoader": + cdef cppclass CModelLoader "pydynet::ModelLoader": CModelLoader(string filename, CModel *model) CModelSaver fill_parameter(CParameters p) CModelSaver fill_lookup_parameter(CLookupParameters lp) diff --git a/python/dynet.pyx b/python/dynet.pyx index 4de36e6cb..bc60e1942 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -7,7 +7,7 @@ import numpy as np import cPickle as pickle import os.path # TODO: -# - set random seed (in CNN) +# - set random seed (in DYNET) # - better input / output support # WORKS, but need to be unified? for example, why "pick" takes a pointer to int, and "squared_distance" takes an expression? # - load embeddings file @@ -218,10 +218,10 @@ cdef class Model: # {{{ return pp def save_all(self, string fname): - save_cnn_model(fname, self.thisptr) + save_dynet_model(fname, self.thisptr) cdef load_all(self, string fname): - load_cnn_model(fname, self.thisptr) + load_dynet_model(fname, self.thisptr) cdef _save_one(self, component, CModelSaver *saver, fh, pfh): # would be nicer to have polymorphism/dispatch-by-type @@ -448,7 +448,7 @@ cdef class ComputationGraph: cpdef void revert(self): self.thisptr.revert() - # CNN handles changing inputs keeping pointers to memoty locations. + # DYNET handles changing inputs keeping pointers to memoty locations. # Because of python's memory management, objects that wrap such pointers # must be registered in a central location. This location would be the # computation graph. @@ -501,7 +501,7 @@ cdef class Expression: #{{{ #cdef CComputationGraph* cg # cg is a singleton, so there is no need to keep it inside the expression. # not keeping cg() in the expression will preserve memory. - # if CNN comes to support multiple computation graphs, this will need to change. + # if DYNET comes to support multiple computation graphs, this will need to change. cdef inline ComputationGraph cg(self): return cg() cdef inline CComputationGraph* cgp(self): diff --git a/python/dynet_viz.py b/python/dynet_viz.py index 9b25f6e04..6f902c842 100644 --- a/python/dynet_viz.py +++ b/python/dynet_viz.py @@ -194,7 +194,7 @@ def cg(): class ComputationGraph(object): def __init__(self, guard=0): - if guard != SECRET: raise RuntimeError("Do not instantiate ComputationGraph directly. Use pycnn.cg()") + if guard != SECRET: raise RuntimeError("Do not instantiate ComputationGraph directly. Use pydynet.cg()") self._cg_version = 0 def renew(self): diff --git a/python/model_test.py b/python/model_test.py index 00b4e43d4..d8e963da3 100644 --- a/python/model_test.py +++ b/python/model_test.py @@ -1,7 +1,7 @@ """ Tests for model saving and loading, including for user-defined models. """ -from pycnn import * +from pydynet import * import numpy import os diff --git a/python/pybridge.h b/python/pybridge.h index a07a14b2d..25aba013f 100644 --- a/python/pybridge.h +++ b/python/pybridge.h @@ -1,69 +1,69 @@ -#include "cnn/model.h" -#include "cnn/cfsm-builder.h" -#include "cnn/deep-lstm.h" -#include "cnn/fast-lstm.h" -#include "cnn/fast-lstm.h" -#include "cnn/gru.h" -#include "cnn/hsm-builder.h" -#include "cnn/lstm.h" +#include "dynet/model.h" +#include "dynet/cfsm-builder.h" +#include "dynet/deep-lstm.h" +#include "dynet/fast-lstm.h" +#include "dynet/fast-lstm.h" +#include "dynet/gru.h" +#include "dynet/hsm-builder.h" +#include "dynet/lstm.h" #include #include #include #include -namespace pycnn { +namespace pydynet { // Wrappers for the templated boost interface so that it is accessible // form cython. Needs to add a method for every type we would like to // load / save. struct ModelSaver { - ModelSaver(std::string filename, cnn::Model *model) : + ModelSaver(std::string filename, dynet::Model *model) : ofs(filename), oa(ofs) { oa << *model; }; - ModelSaver* add_parameter(cnn::Parameter &p) { + ModelSaver* add_parameter(dynet::Parameter &p) { oa << p; return this; } - ModelSaver* add_lookup_parameter(cnn::LookupParameter &p) { + ModelSaver* add_lookup_parameter(dynet::LookupParameter &p) { oa << p; return this; } - ModelSaver* add_lstm_builder(cnn::LSTMBuilder &p) { + ModelSaver* add_lstm_builder(dynet::LSTMBuilder &p) { oa << p; return this; } - ModelSaver* add_srnn_builder(cnn::SimpleRNNBuilder &p) { + ModelSaver* add_srnn_builder(dynet::SimpleRNNBuilder &p) { oa << p; return this; } - ModelSaver* add_gru_builder(cnn::GRUBuilder &p) { + ModelSaver* add_gru_builder(dynet::GRUBuilder &p) { oa << p; return this; } - ModelSaver* add_hsm_builder(cnn::HierarchicalSoftmaxBuilder &p) { + ModelSaver* add_hsm_builder(dynet::HierarchicalSoftmaxBuilder &p) { oa << p; return this; } - ModelSaver* add_fast_lstm_builder(cnn::FastLSTMBuilder &p) { + ModelSaver* add_fast_lstm_builder(dynet::FastLSTMBuilder &p) { oa << p; return this; } // TODO what is this? - ModelSaver* add_deep_lstm_builder(cnn::DeepLSTMBuilder &p) { + ModelSaver* add_deep_lstm_builder(dynet::DeepLSTMBuilder &p) { oa << p; return this; } - ModelSaver* add_cfsm_builder(cnn::ClassFactoredSoftmaxBuilder &p) { + ModelSaver* add_cfsm_builder(dynet::ClassFactoredSoftmaxBuilder &p) { oa << p; return this; } - ModelSaver* add_sm_builder(cnn::StandardSoftmaxBuilder &p) { + ModelSaver* add_sm_builder(dynet::StandardSoftmaxBuilder &p) { oa << p; return this; } @@ -77,7 +77,7 @@ struct ModelSaver { }; struct ModelLoader { - ModelLoader(std::string filename, cnn::Model *model) : + ModelLoader(std::string filename, dynet::Model *model) : ifs(filename), ia(ifs) { @@ -86,44 +86,44 @@ struct ModelLoader { printf("done %d\n", model->parameters_list().size()); }; - ModelLoader* fill_parameter(cnn::Parameter &p) { + ModelLoader* fill_parameter(dynet::Parameter &p) { ia >> p; return this; } - ModelLoader* fill_lookup_parameter(cnn::LookupParameter &p) { + ModelLoader* fill_lookup_parameter(dynet::LookupParameter &p) { ia >> p; return this; } - ModelLoader* fill_lstm_builder(cnn::LSTMBuilder &p) { + ModelLoader* fill_lstm_builder(dynet::LSTMBuilder &p) { ia >> p; return this; } - ModelLoader* fill_srnn_builder(cnn::SimpleRNNBuilder &p) { + ModelLoader* fill_srnn_builder(dynet::SimpleRNNBuilder &p) { ia >> p; return this; } - ModelLoader* fill_gru_builder(cnn::GRUBuilder &p) { + ModelLoader* fill_gru_builder(dynet::GRUBuilder &p) { ia >> p; return this; } - ModelLoader* fill_hsm_builder(cnn::HierarchicalSoftmaxBuilder &p) { + ModelLoader* fill_hsm_builder(dynet::HierarchicalSoftmaxBuilder &p) { ia >> p; return this; } - ModelLoader* fill_fast_lstm_builder(cnn::FastLSTMBuilder &p) { + ModelLoader* fill_fast_lstm_builder(dynet::FastLSTMBuilder &p) { ia >> p; return this; } // TODO what is this? - ModelLoader* fill_deep_lstm_builder(cnn::DeepLSTMBuilder &p) { + ModelLoader* fill_deep_lstm_builder(dynet::DeepLSTMBuilder &p) { ia >> p; return this; } - ModelLoader* fill_cfsm_builder(cnn::ClassFactoredSoftmaxBuilder &p) { + ModelLoader* fill_cfsm_builder(dynet::ClassFactoredSoftmaxBuilder &p) { ia >> p; return this; } - ModelLoader* fill_sm_builder(cnn::StandardSoftmaxBuilder &p) { + ModelLoader* fill_sm_builder(dynet::StandardSoftmaxBuilder &p) { ia >> p; return this; } diff --git a/python/setup.py.in b/python/setup.py.in index acebb3cef..f0abc3656 100644 --- a/python/setup.py.in +++ b/python/setup.py.in @@ -21,28 +21,28 @@ ext_cpu = Extension( "_dynet", # name of extension ["dynet.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source - include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main cnn directory. + include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main dynet directory. "${EIGEN3_INCLUDE_DIR}", # this is the directory where eigen is saved. "${Boost_INCLUDE_DIR}"], # this is the directory where boost is. - libraries=['cnn'], # ditto - library_dirs=[".","${PROJECT_BINARY_DIR}/cnn/"], - #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed + libraries=['dynet'], # ditto + library_dirs=[".","${PROJECT_BINARY_DIR}/dynet/"], + #extra_link_args=["-L/home/yogo/Vork/Research/dynet/dynet/build/dynet"], # if needed extra_compile_args=COMPILER_ARGS, - runtime_library_dirs=["${PROJECT_BINARY_DIR}/cnn/"], + runtime_library_dirs=["${PROJECT_BINARY_DIR}/dynet/"], ) ext_gpu = Extension( "_gdynet", # name of extension ["gdynet.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source - include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main cnn directory. + include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main dynet directory. "${EIGEN3_INCLUDE_DIR}", # this is the directory where eigen is saved. "${Boost_INCLUDE_DIR}"], # this is the directory where boost is. - libraries=['gcnn','cnncuda','cublas'], # ditto - library_dirs=[".","${PROJECT_BINARY_DIR}/cnn/","${CUDA_CUBLAS_LIB}"], - #extra_link_args=["-L/home/yogo/Vork/Research/cnn/cnn/build/cnn"], # if needed + libraries=['gdynet','dynetcuda','cublas'], # ditto + library_dirs=[".","${PROJECT_BINARY_DIR}/dynet/","${CUDA_CUBLAS_LIB}"], + #extra_link_args=["-L/home/yogo/Vork/Research/dynet/dynet/build/dynet"], # if needed extra_compile_args=COMPILER_ARGS, - runtime_library_dirs=["${PROJECT_BINARY_DIR}/cnn/"], + runtime_library_dirs=["${PROJECT_BINARY_DIR}/dynet/"], ) TARGET = [ext_cpu] diff --git a/rnnlm/CMakeLists.txt b/rnnlm/CMakeLists.txt index b4a743264..5c112d681 100644 --- a/rnnlm/CMakeLists.txt +++ b/rnnlm/CMakeLists.txt @@ -2,13 +2,13 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET lm) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) - target_link_libraries(${TARGET} cnn ${LIBS}) + target_link_libraries(${TARGET} dynet ${LIBS}) if(UNIX AND NOT APPLE) target_link_libraries(${TARGET} rt) endif() if (WITH_CUDA_BACKEND) - add_dependencies(${TARGET} cnncuda) - target_link_libraries(${TARGET} cnncuda) + add_dependencies(${TARGET} dynetcuda) + target_link_libraries(${TARGET} dynetcuda) CUDA_ADD_CUBLAS_TO_TARGET(${TARGET}) endif (WITH_CUDA_BACKEND) endforeach() diff --git a/rnnlm/lm.cc b/rnnlm/lm.cc index 401ae8665..3e5426c25 100644 --- a/rnnlm/lm.cc +++ b/rnnlm/lm.cc @@ -1,14 +1,14 @@ -#include "cnn/nodes.h" -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/timing.h" -#include "cnn/rnn.h" -#include "cnn/gru.h" -#include "cnn/lstm.h" -#include "cnn/dict.h" -#include "cnn/expr.h" -#include "cnn/cfsm-builder.h" -#include "cnn/hsm-builder.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" +#include "dynet/cfsm-builder.h" +#include "dynet/hsm-builder.h" #include "../examples/getpid.h" #include @@ -23,7 +23,7 @@ #include using namespace std; -using namespace cnn; +using namespace dynet; unsigned LAYERS = 0; unsigned INPUT_DIM = 0; @@ -33,7 +33,7 @@ float DROPOUT = 0; bool SAMPLE = false; SoftmaxBuilder* cfsm = nullptr; -cnn::Dict d; +dynet::Dict d; int kSOS; int kEOS; @@ -159,7 +159,7 @@ int main(int argc, char** argv) { cerr << "COMMAND LINE:"; for (unsigned i = 0; i < static_cast(argc); ++i) cerr << ' ' << argv[i]; cerr << endl; - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); po::variables_map conf; InitCommandLine(argc, argv, &conf); kSOS = d.convert(""); diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index dac3a4376..34a90a2f5 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -6,25 +6,25 @@ include_directories (${TEST_SOURCE_DIR}/src add_definitions (-DBOOST_TEST_DYN_LINK) # Sources: -set(test_cnn_SRCS +set(test_dynet_SRCS test-nodes.cc test-trainers.cc ) -add_executable (test-cnn test-cnn.cc ${test_cnn_SRCS}) +add_executable (test-dynet test-dynet.cc ${test_dynet_SRCS}) if (WITH_CUDA_BACKEND) - target_link_libraries (test-cnn gcnn ${LIBS} + target_link_libraries (test-dynet gdynet ${LIBS} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ) - add_dependencies(test-cnn cnncuda) - target_link_libraries(test-cnn cnncuda) - CUDA_ADD_CUBLAS_TO_TARGET(test-cnn) + add_dependencies(test-dynet dynetcuda) + target_link_libraries(test-dynet dynetcuda) + CUDA_ADD_CUBLAS_TO_TARGET(test-dynet) else() - target_link_libraries (test-cnn cnn ${LIBS} + target_link_libraries (test-dynet dynet ${LIBS} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ) endif (WITH_CUDA_BACKEND) -add_test(test-cnn test-cnn) +add_test(test-dynet test-dynet) diff --git a/tests/README.md b/tests/README.md index cc4630528..cb6e84e1b 100644 --- a/tests/README.md +++ b/tests/README.md @@ -1 +1 @@ -Use `test-cnn.cc` as a reference for how to set up subsequent tests. +Use `test-dynet.cc` as a reference for how to set up subsequent tests. diff --git a/tests/test-cnn.cc b/tests/test-dynet.cc similarity index 53% rename from tests/test-cnn.cc rename to tests/test-dynet.cc index ca4e72365..d486098ae 100644 --- a/tests/test-cnn.cc +++ b/tests/test-dynet.cc @@ -1,28 +1,28 @@ -#include -#define BOOST_TEST_MODULE CNNBasicTest +#include +#define BOOST_TEST_MODULE DYNETBasicTest #include -struct ConfigureCNNTest { - ConfigureCNNTest() { - // set up some dummy arguments to cnn - for (auto x : {"ConfigureCNNTest", "--cnn-mem", "10"}) { +struct ConfigureDYNETTest { + ConfigureDYNETTest() { + // set up some dummy arguments to dynet + for (auto x : {"ConfigureDYNETTest", "--dynet-mem", "10"}) { av.push_back(strdup(x)); } char **argv = &av[0]; int argc = av.size(); - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); } - ~ConfigureCNNTest() { + ~ConfigureDYNETTest() { for (auto x : av) free(x); } std::vector av; }; -// configure CNN -BOOST_GLOBAL_FIXTURE(ConfigureCNNTest); +// configure DYNET +BOOST_GLOBAL_FIXTURE(ConfigureDYNETTest); BOOST_AUTO_TEST_CASE( aligned_allocator ) { - cnn::CPUAllocator a; + dynet::CPUAllocator a; void* mem = a.malloc(1024); BOOST_CHECK_EQUAL(((uintptr_t)(mem) & 0x1f), 0); ((char*)mem)[0] = 99; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index fabb4ab89..2534e8d8d 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -1,11 +1,11 @@ -#include -#include -#include +#include +#include +#include #include #include -using namespace cnn; -using namespace cnn::expr; +using namespace dynet; +using namespace dynet::expr; using namespace std; @@ -13,12 +13,12 @@ struct NodeTest { NodeTest() { // initialize if necessary if(default_device == nullptr) { - for (auto x : {"NodeTest", "--cnn-mem", "10"}) { + for (auto x : {"NodeTest", "--dynet-mem", "10"}) { av.push_back(strdup(x)); } char **argv = &av[0]; int argc = av.size(); - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); } ones3_vals = {1.f,1.f,1.f}; @@ -75,8 +75,8 @@ struct NodeTest { std::vector ones3_vals, ones2_vals, first_one_vals, batch_vals; std::vector av; - cnn::Model mod; - cnn::Parameter param1, param2, param3, param4, param_scalar1, param_scalar2, param_kernel1, param_filter1, param_square1, param_cube1; + dynet::Model mod; + dynet::Parameter param1, param2, param3, param4, param_scalar1, param_scalar2, param_kernel1, param_filter1, param_square1, param_cube1; }; // define the test suite @@ -85,7 +85,7 @@ BOOST_FIXTURE_TEST_SUITE(node_test, NodeTest); // Expression operator-(const Expression& x); BOOST_AUTO_TEST_CASE( negate_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = -x1; Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -94,7 +94,7 @@ BOOST_AUTO_TEST_CASE( negate_gradient ) { // Expression operator+(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( add_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = x1+x2; @@ -104,7 +104,7 @@ BOOST_AUTO_TEST_CASE( add_gradient ) { // Expression logsumexp(const std::initializer_list& xs); BOOST_AUTO_TEST_CASE( logsumexp_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param_scalar1); Expression x2 = parameter(cg, param_scalar2); Expression z = logsumexp({x1, x2}); @@ -113,7 +113,7 @@ BOOST_AUTO_TEST_CASE( logsumexp_gradient ) { // Expression operator+(const Expression& x, real y); BOOST_AUTO_TEST_CASE( addscalar_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = x1+2.0; Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -122,7 +122,7 @@ BOOST_AUTO_TEST_CASE( addscalar_gradient ) { // Expression operator+(real x, const Expression& y); BOOST_AUTO_TEST_CASE( scalaradd_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = 2.0+x1; Expression z =input(cg, {1,3}, ones3_vals) * y; @@ -131,7 +131,7 @@ BOOST_AUTO_TEST_CASE( scalaradd_gradient ) { // Expression operator-(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( subtract_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = x1+x2; @@ -141,7 +141,7 @@ BOOST_AUTO_TEST_CASE( subtract_gradient ) { // Expression operator-(real x, const Expression& y); BOOST_AUTO_TEST_CASE( scalarsubtract_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = 2.0-x1; Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -150,7 +150,7 @@ BOOST_AUTO_TEST_CASE( scalarsubtract_gradient ) { // Expression operator-(const Expression& x, real y); BOOST_AUTO_TEST_CASE( subtractscalar_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = x1-2.0; Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -159,7 +159,7 @@ BOOST_AUTO_TEST_CASE( subtractscalar_gradient ) { // Expression operator*(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( multiply_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = x1*transpose(x2); @@ -170,7 +170,7 @@ BOOST_AUTO_TEST_CASE( multiply_gradient ) { // Expression operator*(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( multiply_batch_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = x1*transpose(x2); @@ -181,7 +181,7 @@ BOOST_AUTO_TEST_CASE( multiply_batch_gradient ) { // Expression operator*(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( affine_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression scalar = parameter(cg, param_scalar1); Expression x2 = parameter(cg, param2); @@ -193,7 +193,7 @@ BOOST_AUTO_TEST_CASE( affine_gradient ) { // Expression operator*(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( affine_batch_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression scalar = parameter(cg, param_scalar1); Expression x2 = input(cg, Dim({3},2), batch_vals); @@ -205,7 +205,7 @@ BOOST_AUTO_TEST_CASE( affine_batch_gradient ) { // Expression operator*(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( affine_batch_col_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression scalar = parameter(cg, param_scalar1); Expression x2 = input(cg, Dim({1,3},2), batch_vals); @@ -217,7 +217,7 @@ BOOST_AUTO_TEST_CASE( affine_batch_col_gradient ) { // Expression operator*(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( affine_batch2_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = input(cg, Dim({1,3},2), batch_vals); Expression scalar = parameter(cg, param_scalar1); Expression x2 = parameter(cg, param2); @@ -229,7 +229,7 @@ BOOST_AUTO_TEST_CASE( affine_batch2_gradient ) { // Expression operator*(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( affine_batch3_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param_square1); Expression inp = input(cg, Dim({3},2), batch_vals); @@ -241,7 +241,7 @@ BOOST_AUTO_TEST_CASE( affine_batch3_gradient ) { // Expression operator*(const Expression& x, float y); BOOST_AUTO_TEST_CASE( multiplyscalar_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = x1*2.0; Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -250,7 +250,7 @@ BOOST_AUTO_TEST_CASE( multiplyscalar_gradient ) { // inline Expression operator*(float y, const Expression& x) { return x * y; } BOOST_AUTO_TEST_CASE( scalarmultiply_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = 2.0*x1; Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -259,7 +259,7 @@ BOOST_AUTO_TEST_CASE( scalarmultiply_gradient ) { // inline Expression operator/(const Expression& x, float y) { return x * (1.f / y); } BOOST_AUTO_TEST_CASE( dividescalar_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = x1/2.0; Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -268,7 +268,7 @@ BOOST_AUTO_TEST_CASE( dividescalar_gradient ) { // Expression cdiv(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( cdiv_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = cdiv(x1, x2); @@ -278,7 +278,7 @@ BOOST_AUTO_TEST_CASE( cdiv_gradient ) { // Expression cdiv(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( cdiv_batch_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = cdiv(x1, x2) + cdiv(x2, x1); @@ -288,7 +288,7 @@ BOOST_AUTO_TEST_CASE( cdiv_batch_gradient ) { // Expression colwise_add(const Expression& x, const Expression& bias); BOOST_AUTO_TEST_CASE( colwise_add_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = colwise_add(x1 * transpose(x2), x2); @@ -299,7 +299,7 @@ BOOST_AUTO_TEST_CASE( colwise_add_gradient ) { // Expression concatenate_cols(const std::initializer_list& xs); BOOST_AUTO_TEST_CASE( concatenate_cols_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = concatenate_cols({x1, x2, x1}); @@ -310,7 +310,7 @@ BOOST_AUTO_TEST_CASE( concatenate_cols_gradient ) { // Expression concatenate(const std::initializer_list& xs); BOOST_AUTO_TEST_CASE( concatenate_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = transpose(parameter(cg, param1)); Expression x2 = transpose(parameter(cg, param2)); Expression y = concatenate({x1, x2, x1}); @@ -321,7 +321,7 @@ BOOST_AUTO_TEST_CASE( concatenate_gradient ) { // Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b); BOOST_AUTO_TEST_CASE( contract3d_1d_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression square1 = parameter(cg, param_square1); Expression cube1 = parameter(cg, param_cube1); @@ -333,7 +333,7 @@ BOOST_AUTO_TEST_CASE( contract3d_1d_gradient ) { // Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z, const Expression& b); BOOST_AUTO_TEST_CASE( contract3d_1d_1d_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression x3 = parameter(cg, param3); @@ -346,7 +346,7 @@ BOOST_AUTO_TEST_CASE( contract3d_1d_1d_gradient ) { // Expression sqrt(const Expression& x); BOOST_AUTO_TEST_CASE( sqrt_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x3 = parameter(cg, param3); Expression y = sqrt(x3); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -355,7 +355,7 @@ BOOST_AUTO_TEST_CASE( sqrt_gradient ) { // Expression erf(const Expression& x); BOOST_AUTO_TEST_CASE( erf_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = erf(x1); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -364,7 +364,7 @@ BOOST_AUTO_TEST_CASE( erf_gradient ) { // Expression tanh(const Expression& x); BOOST_AUTO_TEST_CASE( tanh_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = tanh(x1); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -373,7 +373,7 @@ BOOST_AUTO_TEST_CASE( tanh_gradient ) { // Expression exp(const Expression& x); BOOST_AUTO_TEST_CASE( exp_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = exp(x1); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -382,7 +382,7 @@ BOOST_AUTO_TEST_CASE( exp_gradient ) { // Expression square(const Expression& x); BOOST_AUTO_TEST_CASE( square_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = square(x1); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -391,7 +391,7 @@ BOOST_AUTO_TEST_CASE( square_gradient ) { // Expression cube(const Expression& x); BOOST_AUTO_TEST_CASE( cube_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = cube(x1); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -400,7 +400,7 @@ BOOST_AUTO_TEST_CASE( cube_gradient ) { // Expression lgamma(const Expression& x); BOOST_AUTO_TEST_CASE( lgamma_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x2 = parameter(cg, param2); Expression y = lgamma(x2); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -409,7 +409,7 @@ BOOST_AUTO_TEST_CASE( lgamma_gradient ) { // Expression log(const Expression& x); BOOST_AUTO_TEST_CASE( log_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x3 = parameter(cg, param3); Expression y = log(x3); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -418,7 +418,7 @@ BOOST_AUTO_TEST_CASE( log_gradient ) { // Expression logistic(const Expression& x); BOOST_AUTO_TEST_CASE( logistic_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = logistic(x1); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -427,7 +427,7 @@ BOOST_AUTO_TEST_CASE( logistic_gradient ) { // Expression rectify(const Expression& x); BOOST_AUTO_TEST_CASE( rectify_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = rectify(x1); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -437,7 +437,7 @@ BOOST_AUTO_TEST_CASE( rectify_gradient ) { // Expression hinge(const Expression& x, unsigned index, float m = 1.0); BOOST_AUTO_TEST_CASE( hinge_gradient ) { unsigned index = 0; - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression z = hinge(x1, index, 0.5); BOOST_CHECK(check_grad(mod, z, 0)); @@ -446,7 +446,7 @@ BOOST_AUTO_TEST_CASE( hinge_gradient ) { // Expression hinge(const Expression& x, unsigned index, float m = 1.0); BOOST_AUTO_TEST_CASE( hinge_batch_gradient ) { std::vector idx = {1,2}; - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); Expression z = sum_batches(hinge(x1+x2, idx, 2.f)); @@ -456,7 +456,7 @@ BOOST_AUTO_TEST_CASE( hinge_batch_gradient ) { // Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0); BOOST_AUTO_TEST_CASE( hingeptr_gradient ) { unsigned index = 0; - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression z = hinge(x1, &index, 0.5); BOOST_CHECK(check_grad(mod, z, 0)); @@ -464,7 +464,7 @@ BOOST_AUTO_TEST_CASE( hingeptr_gradient ) { // Expression log_softmax(const Expression& x); BOOST_AUTO_TEST_CASE( log_softmax_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = log_softmax(x1); Expression z = input(cg, {1,3}, first_one_vals) * y; @@ -473,7 +473,7 @@ BOOST_AUTO_TEST_CASE( log_softmax_gradient ) { // Expression log_softmax(const Expression& x, unsigned v); BOOST_AUTO_TEST_CASE( log_softmax_batch_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = log_softmax(x1+x2); @@ -484,7 +484,7 @@ BOOST_AUTO_TEST_CASE( log_softmax_batch_gradient ) { // Expression log_softmax(const Expression& x, const std::vector& restriction); BOOST_AUTO_TEST_CASE( restricted_log_softmax_gradient ) { vector restriction = {0,1}; - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x3 = parameter(cg, param3); Expression y = exp( log_softmax(x3, restriction) ); Expression z = input(cg, {1,3}, first_one_vals) * y; @@ -493,7 +493,7 @@ BOOST_AUTO_TEST_CASE( restricted_log_softmax_gradient ) { // Expression softmax(const Expression& x); BOOST_AUTO_TEST_CASE( softmax_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = log(softmax(x1)); Expression z = input(cg, {1,3}, first_one_vals) * y; @@ -502,7 +502,7 @@ BOOST_AUTO_TEST_CASE( softmax_gradient ) { // Expression softmax(const Expression& x, unsigned v); BOOST_AUTO_TEST_CASE( softmax_batch_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = log(softmax(x1+x2)); @@ -512,7 +512,7 @@ BOOST_AUTO_TEST_CASE( softmax_batch_gradient ) { // Expression sparsemax(const Expression& x); BOOST_AUTO_TEST_CASE( sparsemax_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = sparsemax(x1); Expression z = input(cg, {1,3}, first_one_vals) * y; @@ -522,7 +522,7 @@ BOOST_AUTO_TEST_CASE( sparsemax_gradient ) { // Expression sparsemax_loss(const Expression& x); BOOST_AUTO_TEST_CASE( sparsemax_loss_gradient ) { std::vector idxs(2); idxs[0] = 1; idxs[1] = 2; - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression z = sparsemax_loss(x1, idxs); BOOST_CHECK(check_grad(mod, z, 0)); @@ -530,7 +530,7 @@ BOOST_AUTO_TEST_CASE( sparsemax_loss_gradient ) { // Expression softsign(const Expression& x); BOOST_AUTO_TEST_CASE( softsign_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = softsign(x1); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -539,7 +539,7 @@ BOOST_AUTO_TEST_CASE( softsign_gradient ) { // Expression pow(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( pow_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x3 = parameter(cg, param3); Expression x_scalar1 = parameter(cg, param_scalar1); Expression y = pow(x3, x_scalar1); @@ -549,7 +549,7 @@ BOOST_AUTO_TEST_CASE( pow_gradient ) { // Expression min(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( min_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = min(x1, x2); @@ -559,7 +559,7 @@ BOOST_AUTO_TEST_CASE( min_gradient ) { // Expression max(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( max_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = max(x1, x2); @@ -570,7 +570,7 @@ BOOST_AUTO_TEST_CASE( max_gradient ) { // TODO: Noise is random, so it cannot be tested simply? // // Expression noise(const Expression& x, real stddev); // BOOST_AUTO_TEST_CASE( noise_gradient ) { -// cnn::ComputationGraph cg; +// dynet::ComputationGraph cg; // Expression x1 = parameter(cg, param1); // Expression y = noise(x1, 0.5); // input(cg, {1,3}, ones3_vals) * y; @@ -580,7 +580,7 @@ BOOST_AUTO_TEST_CASE( max_gradient ) { // TODO: Dropout scales the gradients at training time, so they don't match. // // Expression dropout(const Expression& x, real p); // BOOST_AUTO_TEST_CASE( dropout_gradient ) { -// cnn::ComputationGraph cg; +// dynet::ComputationGraph cg; // Expression x1 = parameter(cg, param1); // Expression y = dropout(x1, 0.5); // input(cg, {1,3}, ones3_vals) * y; @@ -592,7 +592,7 @@ BOOST_AUTO_TEST_CASE( max_gradient ) { // Expression reshape(const Expression& x, const Dim& d); BOOST_AUTO_TEST_CASE( reshape_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = reshape(x1, {1,3}); Expression z = y * input(cg, {3}, ones3_vals); @@ -601,7 +601,7 @@ BOOST_AUTO_TEST_CASE( reshape_gradient ) { // Expression transpose(const Expression& x); BOOST_AUTO_TEST_CASE( transpose_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = softsign(x1); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -610,7 +610,7 @@ BOOST_AUTO_TEST_CASE( transpose_gradient ) { // Expression trace_of_product(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( inverse_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x = parameter(cg, param_square1); Expression y = inverse(x); Expression z = input(cg, {1,3}, ones3_vals) * y * input(cg, {3,1}, ones3_vals); @@ -619,7 +619,7 @@ BOOST_AUTO_TEST_CASE( inverse_gradient ) { // Expression trace_of_product(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( trace_of_product_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression z = trace_of_product(x1, x2); @@ -628,7 +628,7 @@ BOOST_AUTO_TEST_CASE( trace_of_product_gradient ) { // Expression cwise_multiply(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( cwise_multiply_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression y = cwise_multiply(x1, x2); @@ -638,7 +638,7 @@ BOOST_AUTO_TEST_CASE( cwise_multiply_gradient ) { // Expression cwise_multiply(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( cwise_multiply_batch_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); Expression y = cwise_multiply(x1, x2) + cwise_multiply(x2, x1); @@ -648,7 +648,7 @@ BOOST_AUTO_TEST_CASE( cwise_multiply_batch_gradient ) { // Expression dot_product(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( dot_product_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression z = dot_product(x1, x2); @@ -657,7 +657,7 @@ BOOST_AUTO_TEST_CASE( dot_product_gradient ) { // Expression dot_product(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( dot_product_batch_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); Expression z = sum_batches(dot_product(x1, x2) + dot_product(x2, x1) * 2); @@ -666,7 +666,7 @@ BOOST_AUTO_TEST_CASE( dot_product_batch_gradient ) { // Expression squared_distance(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( squared_distance_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression z = squared_distance(x1, x2); @@ -675,7 +675,7 @@ BOOST_AUTO_TEST_CASE( squared_distance_gradient ) { // Expression huber_distance(const Expression& x, const Expression& y, float c = 1.345f); BOOST_AUTO_TEST_CASE( huber_distance_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression z = huber_distance(x1, x2); @@ -684,7 +684,7 @@ BOOST_AUTO_TEST_CASE( huber_distance_gradient ) { // Expression l1_distance(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( l1_distance_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); Expression z = l1_distance(x1, x2); @@ -693,7 +693,7 @@ BOOST_AUTO_TEST_CASE( l1_distance_gradient ) { // Expression binary_log_loss(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( binary_log_loss_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = logistic( parameter(cg, param1) ); Expression x2 = input(cg, {3}, ones3_vals); Expression z = binary_log_loss(x1, x2); @@ -702,7 +702,7 @@ BOOST_AUTO_TEST_CASE( binary_log_loss_gradient ) { // Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0); BOOST_AUTO_TEST_CASE( pairwise_rank_loss_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x_scalar1 = parameter(cg, param_scalar1); Expression x_scalar2 = parameter(cg, param_scalar2); Expression z = pairwise_rank_loss(x_scalar1, x_scalar2); @@ -711,7 +711,7 @@ BOOST_AUTO_TEST_CASE( pairwise_rank_loss_gradient ) { // Expression poisson_loss(const Expression& x, unsigned y); BOOST_AUTO_TEST_CASE( possion_loss_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression scalar = parameter(cg, param_scalar1); Expression z = poisson_loss(scalar, 3); BOOST_CHECK(check_grad(mod, z, 0)); @@ -719,7 +719,7 @@ BOOST_AUTO_TEST_CASE( possion_loss_gradient ) { // Expression conv1d_narrow(const Expression& x, const Expression& f); BOOST_AUTO_TEST_CASE( conv1d_narrow_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression xsquare = parameter(cg, param_square1); Expression xkernel = parameter(cg, param_kernel1); Expression y = conv1d_narrow(xsquare, xkernel); @@ -729,7 +729,7 @@ BOOST_AUTO_TEST_CASE( conv1d_narrow_gradient ) { // Expression conv1d_wide(const Expression& x, const Expression& f); BOOST_AUTO_TEST_CASE( conv1d_wide_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression xkernel = parameter(cg, param_kernel1); Expression y = conv1d_wide(xkernel, xkernel); Expression z = input(cg, {1,3}, ones3_vals) * y * input(cg, {3,1}, ones3_vals); @@ -738,7 +738,7 @@ BOOST_AUTO_TEST_CASE( conv1d_wide_gradient ) { // Expression filter1d_narrow(const Expression& x, const Expression& f); BOOST_AUTO_TEST_CASE( filter1d_narrow_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression xsquare = parameter(cg, param_square1); Expression xfilter = parameter(cg, param_filter1); Expression y = filter1d_narrow(xsquare, xfilter); @@ -748,7 +748,7 @@ BOOST_AUTO_TEST_CASE( filter1d_narrow_gradient ) { // Expression kmax_pooling(const Expression& x, unsigned k); BOOST_AUTO_TEST_CASE( kmax_pooling_keq1_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression xsquare = parameter(cg, param_square1); Expression y = tanh(kmax_pooling(xsquare, 1)); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -757,7 +757,7 @@ BOOST_AUTO_TEST_CASE( kmax_pooling_keq1_gradient ) { // Expression kmax_pooling(const Expression& x, unsigned k); BOOST_AUTO_TEST_CASE( kmax_pooling_keq2_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression xsquare = parameter(cg, param_square1); Expression y = tanh(kmax_pooling(xsquare, 2)); Expression z = input(cg, {1,3}, ones3_vals) * y * input(cg, {2,1}, ones2_vals); @@ -766,7 +766,7 @@ BOOST_AUTO_TEST_CASE( kmax_pooling_keq2_gradient ) { // Expression fold_rows(const Expression& x, unsigned nrows=2); BOOST_AUTO_TEST_CASE( fold_rows_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x4 = parameter(cg, param4); Expression y = fold_rows(x4, 2); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -775,7 +775,7 @@ BOOST_AUTO_TEST_CASE( fold_rows_gradient ) { // Expression average_cols(const Expression& x); BOOST_AUTO_TEST_CASE( average_cols_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression xsquare = parameter(cg, param_square1); Expression y = tanh(average_cols(xsquare)); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -784,7 +784,7 @@ BOOST_AUTO_TEST_CASE( average_cols_gradient ) { // Expression sum_cols(const Expression& x); BOOST_AUTO_TEST_CASE( sum_cols_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression xsquare = parameter(cg, param_square1); Expression y = tanh(sum_cols(xsquare)); Expression z = input(cg, {1,3}, ones3_vals) * y; @@ -798,7 +798,7 @@ BOOST_AUTO_TEST_CASE( sum_cols_gradient ) { // Expression pick(const Expression& x, unsigned v); BOOST_AUTO_TEST_CASE( pick_gradient ) { unsigned idx = 1; - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression z = pick(x1, idx); BOOST_CHECK(check_grad(mod, z, 0)); @@ -807,7 +807,7 @@ BOOST_AUTO_TEST_CASE( pick_gradient ) { // Expression pick(const Expression& x, unsigned* pv); BOOST_AUTO_TEST_CASE( pickptr_gradient ) { unsigned idx = 1; - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression z = pick(x1, &idx); BOOST_CHECK(check_grad(mod, z, 0)); @@ -816,7 +816,7 @@ BOOST_AUTO_TEST_CASE( pickptr_gradient ) { // Expression pick(const Expression& x, unsigned v); BOOST_AUTO_TEST_CASE( pick_batch_gradient ) { std::vector idx = {1,2}; - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); Expression z = sum_batches(pick(x1+x2, idx)); @@ -825,7 +825,7 @@ BOOST_AUTO_TEST_CASE( pick_batch_gradient ) { // Expression pickrange(const Expression& x, unsigned v, unsigned u); BOOST_AUTO_TEST_CASE( pickrange_gradient ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression y = pickrange(x1, 0, 2); Expression z = input(cg, {1,2}, ones2_vals) * y; @@ -835,7 +835,7 @@ BOOST_AUTO_TEST_CASE( pickrange_gradient ) { // Expression pickneglogsoftmax(const Expression& x, unsigned v); BOOST_AUTO_TEST_CASE( pickneglogsoftmax_gradient ) { unsigned idx = 1; - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression z = pickneglogsoftmax(x1, idx); BOOST_CHECK(check_grad(mod, z, 0)); @@ -844,7 +844,7 @@ BOOST_AUTO_TEST_CASE( pickneglogsoftmax_gradient ) { // Expression pickneglogsoftmax(const Expression& x, unsigned v); BOOST_AUTO_TEST_CASE( pickneglogsoftmax_batch_gradient ) { std::vector idx = {1,2}; - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); Expression z = sum_batches(pickneglogsoftmax(x1+x2, idx)); @@ -853,7 +853,7 @@ BOOST_AUTO_TEST_CASE( pickneglogsoftmax_batch_gradient ) { // Expression sparse_input(vector& ids, vector& src, float def); BOOST_AUTO_TEST_CASE( sparse_input_test ) { - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; std::vector ids = {0, 4}; Expression z = input(cg, Dim({3},2), ids, ones2_vals, 0.5); std::vector exp = {1.0f, 0.5f, 0.5f, 0.5f, 1.0f, 0.5f}; diff --git a/tests/test-trainers.cc b/tests/test-trainers.cc index d9d67cee2..bad0656cb 100644 --- a/tests/test-trainers.cc +++ b/tests/test-trainers.cc @@ -1,12 +1,12 @@ -#include -#include -#include -#include +#include +#include +#include +#include #include #include -using namespace cnn; -using namespace cnn::expr; +using namespace dynet; +using namespace dynet::expr; using namespace std; @@ -14,12 +14,12 @@ struct TrainerTest { TrainerTest() { // initialize if necessary if(default_device == nullptr) { - for (auto x : {"TrainerTest", "--cnn-mem", "10"}) { + for (auto x : {"TrainerTest", "--dynet-mem", "10"}) { av.push_back(strdup(x)); } char **argv = &av[0]; int argc = av.size(); - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); } ones_vals = {1.f,1.f,1.f}; param_vals = {1.1f,-2.2f,3.3f}; @@ -45,11 +45,11 @@ struct TrainerTest { BOOST_FIXTURE_TEST_SUITE(trainer_test, TrainerTest); BOOST_AUTO_TEST_CASE( simple_sgd_direction ) { - cnn::Model mod; - cnn::Parameter param = mod.add_parameters({3}); + dynet::Model mod; + dynet::Parameter param = mod.add_parameters({3}); TensorTools::SetElements(param.get()->values,param_vals); SimpleSGDTrainer trainer(&mod); - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); Expression z = y*x; @@ -61,11 +61,11 @@ BOOST_AUTO_TEST_CASE( simple_sgd_direction ) { } BOOST_AUTO_TEST_CASE( momentum_sgd_direction ) { - cnn::Model mod; - cnn::Parameter param = mod.add_parameters({3}); + dynet::Model mod; + dynet::Parameter param = mod.add_parameters({3}); TensorTools::SetElements(param.get()->values,param_vals); MomentumSGDTrainer trainer(&mod); - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); Expression z = y*x; @@ -77,11 +77,11 @@ BOOST_AUTO_TEST_CASE( momentum_sgd_direction ) { } BOOST_AUTO_TEST_CASE( adagrad_direction ) { - cnn::Model mod; - cnn::Parameter param = mod.add_parameters({3}); + dynet::Model mod; + dynet::Parameter param = mod.add_parameters({3}); TensorTools::SetElements(param.get()->values,param_vals); AdagradTrainer trainer(&mod); - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); Expression z = y*x; @@ -93,11 +93,11 @@ BOOST_AUTO_TEST_CASE( adagrad_direction ) { } BOOST_AUTO_TEST_CASE( adadelta_direction ) { - cnn::Model mod; - cnn::Parameter param = mod.add_parameters({3}); + dynet::Model mod; + dynet::Parameter param = mod.add_parameters({3}); TensorTools::SetElements(param.get()->values,param_vals); AdadeltaTrainer trainer(&mod); - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); Expression z = y*x; @@ -109,11 +109,11 @@ BOOST_AUTO_TEST_CASE( adadelta_direction ) { } BOOST_AUTO_TEST_CASE( adam_direction ) { - cnn::Model mod; - cnn::Parameter param = mod.add_parameters({3}); + dynet::Model mod; + dynet::Parameter param = mod.add_parameters({3}); TensorTools::SetElements(param.get()->values,param_vals); AdamTrainer trainer(&mod); - cnn::ComputationGraph cg; + dynet::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); Expression z = y*x; diff --git a/tutorial/0_multiply.cc b/tutorial/0_multiply.cc index 6b469d1ca..dc021fa3d 100644 --- a/tutorial/0_multiply.cc +++ b/tutorial/0_multiply.cc @@ -1,15 +1,15 @@ -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/expr.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/expr.h" #include using namespace std; -using namespace cnn; -using namespace cnn::expr; +using namespace dynet; +using namespace dynet::expr; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); ComputationGraph cg; float ia, ib; diff --git a/tutorial/1_linear_regression.cc b/tutorial/1_linear_regression.cc index 5bfca8772..e62818e6b 100644 --- a/tutorial/1_linear_regression.cc +++ b/tutorial/1_linear_regression.cc @@ -1,16 +1,16 @@ -#include "cnn/cnn.h" -#include "cnn/training.h" -#include "cnn/expr.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/expr.h" #include #include using namespace std; -using namespace cnn; -using namespace cnn::expr; +using namespace dynet; +using namespace dynet::expr; int main(int argc, char** argv) { - cnn::initialize(argc, argv); + dynet::initialize(argc, argv); default_random_engine rng; normal_distribution normal(0.0f, 1.0f); diff --git a/tutorial/CMakeLists.txt b/tutorial/CMakeLists.txt index 7a2fc2153..c938ffcd7 100644 --- a/tutorial/CMakeLists.txt +++ b/tutorial/CMakeLists.txt @@ -2,13 +2,13 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET 0_multiply 1_linear_regression) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) - target_link_libraries(${TARGET} cnn ${LIBS}) + target_link_libraries(${TARGET} dynet ${LIBS}) if(UNIX AND NOT APPLE) target_link_libraries(${TARGET} rt) endif() if (WITH_CUDA_BACKEND) - add_dependencies(${TARGET} cnncuda) - target_link_libraries(${TARGET} cnncuda) + add_dependencies(${TARGET} dynetcuda) + target_link_libraries(${TARGET} dynetcuda) CUDA_ADD_CUBLAS_TO_TARGET(${TARGET}) endif (WITH_CUDA_BACKEND) endforeach() From 6806395e9a19201478190bd9c8e43d67448ef3b1 Mon Sep 17 00:00:00 2001 From: yoavg Date: Sat, 8 Oct 2016 11:46:54 +0300 Subject: [PATCH 682/965] small gitignore fix --- .gitignore | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index b1235a423..1c0583842 100644 --- a/.gitignore +++ b/.gitignore @@ -9,9 +9,9 @@ Makefile CMakeCache.txt CMakeFiles cmake_install.cmake -pydynet/pydynet.cpp -pydynet/dist/ -pydynet/pyCNN.egg-info/ +python/dynet.cpp +python/dist/ +python/dyNET.egg-info/ # binaries examples/embed-cl From 172bcec05cf4062c462c420ef249db610a9744b0 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Sat, 8 Oct 2016 12:20:48 +0300 Subject: [PATCH 683/965] fixed gpu import in pydynet --- python/dynet.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/python/dynet.py b/python/dynet.py index 0983e6ff6..755f537ab 100644 --- a/python/dynet.py +++ b/python/dynet.py @@ -1,7 +1,13 @@ import sys if '--dynet-viz' in sys.argv: + sys.argv.remove('--dynet-viz') from dynet_viz import * -elif '--dynet-gpu' in sys.argv: +elif '--dynet-gpu' in sys.argv: # the python gpu switch. + sys.argv.remove('--dynet-gpu') + def print_graphviz(**kwarge): + print "Run with --dynet-viz to get the visualization behavior." + from _gdynet import * +elif '--dynet-gpus' in sys.argv or '--dynet-gpu-ids' in sys.argv: # but using the c++ gpu switches suffices to trigger gpu. def print_graphviz(**kwarge): print "Run with --dynet-viz to get the visualization behavior." from _gdynet import * From 9a20e554b08fbbc2b81cbd1eb8d5d2cd290524dd Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 8 Oct 2016 23:56:05 -0400 Subject: [PATCH 684/965] Added link to cnn --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4bea9ca41..aa35310ec 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # DyNet Dynamic neural network library -DyNet is a neural network library that is written in C++ (with bindings in Python). It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. Read the instructions below to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. +DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. Read the instructions below to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. ### Building From 005c10b131689b900f916e11969109fcf577c8d5 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 9 Oct 2016 09:06:18 -0400 Subject: [PATCH 685/965] Made it possible to custom-initialize parameters --- dynet/model.cc | 44 +++++++++++++++++++++++++++++++++++++++----- dynet/model.h | 38 +++++++++++++++++++++++++++++++++++++- dynet/nodes.cc | 2 +- dynet/tensor.cc | 24 ++++++++++++------------ dynet/tensor.h | 7 +++---- 5 files changed, 92 insertions(+), 23 deletions(-) diff --git a/dynet/model.cc b/dynet/model.cc index 99c6fe81e..3c186b196 100644 --- a/dynet/model.cc +++ b/dynet/model.cc @@ -57,12 +57,18 @@ ParameterStorage::ParameterStorage(const Dim& d, float scale) : dim(d) { values.device = g.device = default_device; default_device->allocate_tensor(DeviceMempool::PS, values); default_device->allocate_tensor(DeviceMempool::PS, g); - if (scale) { - TensorTools::Randomize(values, scale); - } else { - TensorTools::Randomize(values); - } TensorTools::Zero(g); + ParameterInitUniform init(scale); + init.initialize_params(values); +} + +ParameterStorage::ParameterStorage(const Dim& d, ParameterInit & init) : dim(d) { + values.d = g.d = d; + values.device = g.device = default_device; + default_device->allocate_tensor(DeviceMempool::PS, values); + default_device->allocate_tensor(DeviceMempool::PS, g); + TensorTools::Zero(g); + init.initialize_params(values); } size_t ParameterStorage::size() const { return dim.size(); } @@ -99,6 +105,17 @@ LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d all_grads.device = all_values.device = default_device; default_device->allocate_tensor(DeviceMempool::PS, all_values); default_device->allocate_tensor(DeviceMempool::PS, all_grads); + TensorTools::Zero(all_values); + initialize_lookups(); +} + +LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d, ParameterInit & init) : dim(d) { + all_dim = dim; all_dim.d[all_dim.nd++] = n; + all_grads.d = all_values.d = all_dim; + all_grads.device = all_values.device = default_device; + default_device->allocate_tensor(DeviceMempool::PS, all_values); + default_device->allocate_tensor(DeviceMempool::PS, all_grads); + init.initialize_params(all_values); initialize_lookups(); } @@ -156,6 +173,23 @@ void LookupParameterStorage::load(Archive& ar, const unsigned int) { DYNET_SAVELOAD_IMPL(LookupParameterStorage) #endif +void ParameterInitNormal::initialize_params(Tensor & values) { + TensorTools::RandomizeNormal(values, mean, sqrt(var)); +} + +void ParameterInitUniform::initialize_params(Tensor & values) { + if(left == right) { + float my_scale = sqrt(6) / sqrt(values.d.sum_dims()); + TensorTools::RandomizeUniform(values, -my_scale, my_scale); + } else { + TensorTools::RandomizeUniform(values, left, right); + } +} + +void ParameterInitConst::initialize_params(Tensor & values) { + TensorTools::Constant(values, cnst); +} + Parameter::Parameter() { mp = nullptr; index = 0; diff --git a/dynet/model.h b/dynet/model.h index ca803164d..6a0e06ff8 100644 --- a/dynet/model.h +++ b/dynet/model.h @@ -18,6 +18,8 @@ namespace dynet { // * LookupParameters represents a table of vectors that are used to embed a // set of discrete objects. These are sparsely updated. +struct ParameterInit; + struct ParameterStorageBase { friend class Model; virtual void scale_parameters(float a) = 0; @@ -55,10 +57,12 @@ struct ParameterStorage : public ParameterStorageBase { Dim dim; Tensor values; Tensor g; + private: ParameterStorage() {} explicit ParameterStorage(const Dim& d, float minmax); // initialize with ~U(-minmax,+minmax) - // or Glorot initialization if minmax = 0 + // or Glorot initialization if minmax = 0 + explicit ParameterStorage(const Dim& d, ParameterInit & init); // initialize with custom initializer friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int); @@ -104,6 +108,7 @@ struct LookupParameterStorage : public ParameterStorageBase { private: LookupParameterStorage() {} LookupParameterStorage(unsigned n, const Dim& d); + LookupParameterStorage(unsigned n, const Dim& d, ParameterInit & init); friend class boost::serialization::access; template void save(Archive& ar, const unsigned int) const; @@ -154,6 +159,35 @@ struct LookupParameter { void serialize(Archive& ar, const unsigned int); }; +// Initilizers for parameters +struct ParameterInit { + ParameterInit() {} + virtual void initialize_params(Tensor & values) = 0; +}; + +struct ParameterInitNormal : public ParameterInit { + ParameterInitNormal(float m = 0.0f, float v = 1.0f) : mean(m), var(v) {} + virtual void initialize_params(Tensor & values) override; +private: + float mean, var; +}; + +struct ParameterInitUniform : public ParameterInit { + ParameterInitUniform(float mean, float scale = 0.0f) : + left(scale==0.0f?0.0f:-scale), right(scale) {} + ParameterInitUniform(float mean, float l, float r) : left(l), right(r) {} + virtual void initialize_params(Tensor & values) override; +private: + float left, right; +}; + +struct ParameterInitConst : public ParameterInit { + ParameterInitConst(float c) : cnst(c) {} + virtual void initialize_params(Tensor & values) override; +private: + float cnst; +}; + // this is a collection of parameters // if you need a matrix of parameters, or a lookup table - ask an instance of this class // this knows how to serialize itself @@ -168,7 +202,9 @@ class Model { void reset_gradient(); // set scale to use custom initialization Parameter add_parameters(const Dim& d, float scale = 0.0f); + Parameter add_parameters(const Dim& d, ParameterInit & init); LookupParameter add_lookup_parameters(unsigned n, const Dim& d); + LookupParameter add_lookup_parameters(unsigned n, const Dim& d, ParameterInit & init); // project weights so their L2 norm = radius void project_weights(float radius = 1.0f); void set_weight_decay_lambda(float lambda); diff --git a/dynet/nodes.cc b/dynet/nodes.cc index 58424e1b6..af78c187e 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -728,7 +728,7 @@ DYNET_NODE_INST_DEV_IMPL(Exp) template void GaussianNoise::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { Tensor m(dim, (float*)aux_mem, fx.device, DeviceMempool::FXS); - TensorTools::RandomizeNormal(0, stddev, m); + TensorTools::RandomizeNormal(m, 0, stddev); fx.tvec().device(*dev.edevice) = xs[0]->tvec() + m.tvec(); } diff --git a/dynet/tensor.cc b/dynet/tensor.cc index dae6d2a56..97e64753d 100644 --- a/dynet/tensor.cc +++ b/dynet/tensor.cc @@ -121,9 +121,9 @@ void TensorTools::Zero(Tensor& d) { Constant(d, 0); } -void TensorTools::Randomize(Tensor& val, real scale) { - uniform_real_distribution distribution(-scale,scale); - auto b = [&] {return distribution(*rndeng);}; +void TensorTools::RandomBernoulli(Tensor& val, real p, real scale) { + bernoulli_distribution distribution(p); + auto b = [&] {return distribution(*rndeng) * scale;}; #if HAVE_CUDA float* t = new float[val.d.size()]; generate(t, t + val.d.size(), b); @@ -134,13 +134,9 @@ void TensorTools::Randomize(Tensor& val, real scale) { #endif } -void TensorTools::Randomize(Tensor& d) { - Randomize(d, sqrt(6) / sqrt(d.d.sum_dims())); -} - -void TensorTools::RandomBernoulli(Tensor& val, real p, real scale) { - bernoulli_distribution distribution(p); - auto b = [&] {return distribution(*rndeng) * scale;}; +void TensorTools::RandomizeNormal(Tensor& val, real mean, real stddev) { + normal_distribution distribution(mean, stddev); + auto b = [&] {return distribution(*rndeng);}; #if HAVE_CUDA float* t = new float[val.d.size()]; generate(t, t + val.d.size(), b); @@ -151,8 +147,8 @@ void TensorTools::RandomBernoulli(Tensor& val, real p, real scale) { #endif } -void TensorTools::RandomizeNormal(real mean, real stddev, Tensor& val) { - normal_distribution distribution(mean, stddev); +void TensorTools::RandomizeUniform(Tensor& val, real left, real right) { + uniform_real_distribution distribution(left, right); auto b = [&] {return distribution(*rndeng);}; #if HAVE_CUDA float* t = new float[val.d.size()]; @@ -164,6 +160,10 @@ void TensorTools::RandomizeNormal(real mean, real stddev, Tensor& val) { #endif } +// void TensorTools::Randomize(Tensor& d) { +// Randomize(d, sqrt(6) / sqrt(d.d.sum_dims())); +// } + template void Tensor::save(Archive& ar, const unsigned int ver) const { ar & d; diff --git a/dynet/tensor.h b/dynet/tensor.h index f96604688..48c6d4564 100644 --- a/dynet/tensor.h +++ b/dynet/tensor.h @@ -271,11 +271,10 @@ std::vector as_vector(const Tensor& v); struct TensorTools { static void Constant(Tensor& d, float c); static void Zero(Tensor& d); - static void Randomize(Tensor& val, real scale); - static void Randomize(Tensor& d); // sample some bernoulli random variables and scale them by scale - static void RandomBernoulli(Tensor& val, real p, real scale = 1.0); - static void RandomizeNormal(real mean, real stddev, Tensor& val); + static void RandomBernoulli(Tensor& val, real p, real scale = 1.0f); + static void RandomizeNormal(Tensor& val, real mean = 0.0f, real stddev = 1.0f); + static void RandomizeUniform(Tensor& val, real left = 0.0f, real right = 0.0f); // AccessElement and SetElement are very, very slow (potentially) - use appropriately static float AccessElement(const Tensor& v, int index); static float AccessElement(const Tensor& v, const Dim& index); From 11d0921ba05ad8986f2dc4f0f81cd70965d6c250 Mon Sep 17 00:00:00 2001 From: yoavg Date: Mon, 10 Oct 2016 02:01:25 +0300 Subject: [PATCH 686/965] no-update controls in dynet --- dynet/model.cc | 67 +++++++++++++++++++++++++++++++++++++++++++++-- dynet/model.h | 32 ++++++++++++++++++---- dynet/training.cc | 12 ++++++--- 3 files changed, 100 insertions(+), 11 deletions(-) diff --git a/dynet/model.cc b/dynet/model.cc index 99c6fe81e..f960c100c 100644 --- a/dynet/model.cc +++ b/dynet/model.cc @@ -161,7 +161,7 @@ Parameter::Parameter() { index = 0; } -Parameter::Parameter(const Model* mp, unsigned long index) : mp(mp), index(index) {} +Parameter::Parameter(Model* mp, unsigned long index) : mp(mp), index(index) {} ParameterStorage* Parameter::get() const { return mp->parameters_list()[index]; @@ -171,6 +171,15 @@ void Parameter::zero() { return mp->parameters_list()[index]->zero(); } +void Parameter::set_update(bool b) { + mp->set_updateable_param(this, b); +} + +bool Parameter::is_updateable() { + return mp->is_updateable_param(this); +} + + #ifndef __CUDACC__ template void Parameter::serialize(Archive& ar, const unsigned int) { @@ -185,7 +194,7 @@ LookupParameter::LookupParameter() { index = 0; } -LookupParameter::LookupParameter(const Model* mp, unsigned long index) : mp(mp), index(index) {} +LookupParameter::LookupParameter(Model* mp, unsigned long index) : mp(mp), index(index) {} LookupParameterStorage* LookupParameter::get() const { return mp->lookup_parameters_list()[index]; @@ -199,6 +208,13 @@ void LookupParameter::initialize(unsigned index, const std::vector& val) get()->initialize(index, val); } +void LookupParameter::set_update(bool b) { + mp->set_updateable_lookup_param(this, b); +} +bool LookupParameter::is_updateable() { + return mp->is_updateable_lookup_param(this); +} + #ifndef __CUDACC__ template void LookupParameter::serialize(Archive& ar, const unsigned int) { @@ -243,6 +259,7 @@ Parameter Model::add_parameters(const Dim& d, float scale) { //cerr << "Adding parameters with dim " << d << endl; all_params.push_back(p); params.push_back(p); + updateable_params.push_back(r.index); return r; } @@ -252,9 +269,44 @@ LookupParameter Model::add_lookup_parameters(unsigned n, const Dim& d) { //cerr << "Adding lookup parameters with dim " << d << " and size " << n << endl; all_params.push_back(p); lookup_params.push_back(p); + updateable_lookup_params.push_back(r.index); return r; } +void Model::set_updateable_param(const Parameter *p, bool status) { + unsigned idx = p->index; + assert(idx < params.size()); + + std::vector::iterator position = std::find(updateable_params.begin(), updateable_params.end(), idx); + if (position == updateable_params.end()) { + if (status) updateable_params.push_back(idx); + } else { + if (!status) updateable_params.erase(position); + } +} + +void Model::set_updateable_lookup_param(const LookupParameter *p, bool status) { + unsigned idx = p->index; + assert(idx < lookup_params.size()); + + std::vector::iterator position = std::find(updateable_lookup_params.begin(), updateable_lookup_params.end(), idx); + if (position == updateable_lookup_params.end()) { + if (status) updateable_lookup_params.push_back(idx); + } else { + if (!status) updateable_lookup_params.erase(position); + } +} + +bool Model::is_updateable_param(const Parameter* p) { + std::vector::iterator position = std::find(updateable_params.begin(), updateable_params.end(), p->index); + return position != updateable_params.end(); +} + +bool Model::is_updateable_lookup_param(const LookupParameter* p) { + std::vector::iterator position = std::find(updateable_lookup_params.begin(), updateable_lookup_params.end(), p->index); + return position != updateable_lookup_params.end(); +} + void Model::reset_gradient() { for (auto p : params) { p->clear(); } for (auto p : lookup_params) { p->clear(); } @@ -268,6 +320,17 @@ size_t Model::parameter_count() const { return r; } +size_t Model::updateable_parameter_count() const { + size_t r = 0; + for (const unsigned idx : updateable_params) { + r += params[idx]->size(); + } + for (const unsigned idx : updateable_lookup_params) { + r += lookup_params[idx]->size(); + } + return r; +} + #ifndef __CUDACC__ template void Model::serialize(Archive& ar, const unsigned int) { diff --git a/dynet/model.h b/dynet/model.h index ca803164d..152f1a512 100644 --- a/dynet/model.h +++ b/dynet/model.h @@ -115,18 +115,21 @@ struct LookupParameterStorage : public ParameterStorageBase { class Model; struct Parameter { Parameter(); - Parameter(const Model* mp, unsigned long index); + Parameter(Model* mp, unsigned long index); ParameterStorage* get() const; // Zero the parameters void zero(); - const Model* mp; + Model* mp; unsigned long index; Dim dim() { return get()->dim; } Tensor* values() { return &(get()->values); } + void set_update(bool b); + bool is_updateable(); + private: friend class boost::serialization::access; template @@ -135,19 +138,22 @@ struct Parameter { struct LookupParameter { LookupParameter(); - LookupParameter(const Model* mp, unsigned long index); + LookupParameter(Model* mp, unsigned long index); LookupParameterStorage* get() const; void initialize(unsigned index, const std::vector& val) const; // Zero the parameters void zero(); - const Model* mp; + Model* mp; unsigned long index; Dim dim() { return get()->dim; } std::vector* values() { return &(get()->values); } + void set_update(bool b); + bool is_updateable(); + private: friend class boost::serialization::access; template @@ -173,13 +179,23 @@ class Model { void project_weights(float radius = 1.0f); void set_weight_decay_lambda(float lambda); - const std::vector& all_parameters_list() const { return all_params; } + //const std::vector& all_parameters_list() const { return all_params; } const std::vector& parameters_list() const { return params; } const std::vector& lookup_parameters_list() const { return lookup_params; } + // indexes into params and lookup_params + const std::vector& updateable_parameters_list() const { return updateable_params; } + const std::vector& updateable_lookup_parameters_list() const { return updateable_lookup_params; } + // Returns the total number of tunable parameters (i. e. scalars) contained within this model. // That is to say, a 2x2 matrix counts as four parameters. size_t parameter_count() const; + size_t updateable_parameter_count() const; + + void set_updateable_param(const Parameter *p, bool status); + void set_updateable_lookup_param(const LookupParameter *p, bool status); + bool is_updateable_param(const Parameter *p); + bool is_updateable_lookup_param(const LookupParameter *p); L2WeightDecay weight_decay; private: @@ -190,6 +206,12 @@ class Model { std::vector all_params; std::vector params; std::vector lookup_params; + + // these are a subset of the parameters that are used when model is updated. + // kept as indices into params and lookup_params. + std::vector updateable_params; + std::vector updateable_lookup_params; + mutable float* gradient_norm_scratch; }; diff --git a/dynet/training.cc b/dynet/training.cc index 36a2c6190..7b917be90 100644 --- a/dynet/training.cc +++ b/dynet/training.cc @@ -52,14 +52,16 @@ Trainer::~Trainer() {} void Trainer::rescale_and_reset_weight_decay() { const float weight_decay = model->weight_decay.current_weight_decay(); - for (auto p : model->parameters_list()) - p->scale_parameters(weight_decay); + const auto params = model->parameters_list(); + for (auto p : model->updateable_parameters_list()) + params[p]->scale_parameters(weight_decay); model->weight_decay.reset_weight_decay(); } float Trainer::clip_gradients() { float gscale = 1; if (clipping_enabled) { + // TODO should I handle updatebale differently? float gg = model->gradient_l2_norm(); if (isnan(gg) || isinf(gg)) { cerr << "Magnitude of gradient is bad: " << gg << endl; @@ -84,12 +86,14 @@ void Trainer::update(real scale) { // Perform gradient clipping and cycle through parameters const float gscale = clip_gradients(); const auto & params = model->parameters_list(); - for(size_t i = 0; i < params.size(); ++i) { + const auto & upd_params = model->updateable_parameters_list(); + for(auto i : upd_params) { update_params(scale, gscale, i); params[i]->clear(); } const auto & lookup_params = model->lookup_parameters_list(); - for(size_t i = 0; i < lookup_params.size(); ++i) { + const auto & upd_lookup_params = model->updateable_lookup_parameters_list(); + for(auto i : upd_lookup_params) { for (auto j : lookup_params[i]->non_zero_grads) update_lookup_params(scale, gscale, i, j); lookup_params[i]->clear(); From a5c9ed2de902fcb801b9ee049dae8a5225730a65 Mon Sep 17 00:00:00 2001 From: yoavg Date: Mon, 10 Oct 2016 02:09:50 +0300 Subject: [PATCH 687/965] python no-update support --- python/dynet.pxd | 5 +++++ python/dynet.pyx | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/python/dynet.pxd b/python/dynet.pxd index f265e2370..9549aee67 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -1,5 +1,6 @@ from libcpp.vector cimport vector from libcpp.string cimport string +from libcpp cimport bool ctypedef float real @@ -47,6 +48,8 @@ cdef extern from "dynet/model.h" namespace "dynet": CParameters() CParameterStorage *get() void zero() + void set_update(bool b) + bool is_updateable() cdef cppclass CLookupParameters "dynet::LookupParameter": CLookupParameters() @@ -54,6 +57,8 @@ cdef extern from "dynet/model.h" namespace "dynet": CDim dim void initialize(unsigned index, const vector[float]& val) void zero() + void set_update(bool b) + bool is_updateable() cdef cppclass CModel "dynet::Model": CModel() diff --git a/python/dynet.pyx b/python/dynet.pyx index bc60e1942..d4b7a09ea 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -116,6 +116,9 @@ cdef class Parameters: cpdef zero(self): self.thisptr.zero() + cpdef bool is_updateable(self): return self.thisptr.is_updateable() + cpdef set_update(self, bool b): self.thisptr.set_update(b) + cdef class LookupParameters: @@ -161,6 +164,9 @@ cdef class LookupParameters: cpdef zero(self): self.thisptr.zero() + cpdef bool is_updateable(self): return self.thisptr.is_updateable() + cpdef set_update(self, bool b): self.thisptr.set_update(b) + # TODO document this class Saveable(object): def __init__(self): From 76753b5634a17458c6e1db87e9b59a383f3f5e0c Mon Sep 17 00:00:00 2001 From: yoavg Date: Mon, 10 Oct 2016 02:45:22 +0300 Subject: [PATCH 688/965] fix typo --- dynet/model.cc | 54 +++++++++++++++++++++++------------------------ dynet/model.h | 22 +++++++++---------- dynet/training.cc | 6 +++--- python/dynet.pxd | 4 ++-- python/dynet.pyx | 4 ++-- 5 files changed, 45 insertions(+), 45 deletions(-) diff --git a/dynet/model.cc b/dynet/model.cc index f960c100c..fee991549 100644 --- a/dynet/model.cc +++ b/dynet/model.cc @@ -172,11 +172,11 @@ void Parameter::zero() { } void Parameter::set_update(bool b) { - mp->set_updateable_param(this, b); + mp->set_updatable_param(this, b); } -bool Parameter::is_updateable() { - return mp->is_updateable_param(this); +bool Parameter::is_updatable() { + return mp->is_updatable_param(this); } @@ -209,10 +209,10 @@ void LookupParameter::initialize(unsigned index, const std::vector& val) } void LookupParameter::set_update(bool b) { - mp->set_updateable_lookup_param(this, b); + mp->set_updatable_lookup_param(this, b); } -bool LookupParameter::is_updateable() { - return mp->is_updateable_lookup_param(this); +bool LookupParameter::is_updatable() { + return mp->is_updatable_lookup_param(this); } #ifndef __CUDACC__ @@ -259,7 +259,7 @@ Parameter Model::add_parameters(const Dim& d, float scale) { //cerr << "Adding parameters with dim " << d << endl; all_params.push_back(p); params.push_back(p); - updateable_params.push_back(r.index); + updatable_params.push_back(r.index); return r; } @@ -269,42 +269,42 @@ LookupParameter Model::add_lookup_parameters(unsigned n, const Dim& d) { //cerr << "Adding lookup parameters with dim " << d << " and size " << n << endl; all_params.push_back(p); lookup_params.push_back(p); - updateable_lookup_params.push_back(r.index); + updatable_lookup_params.push_back(r.index); return r; } -void Model::set_updateable_param(const Parameter *p, bool status) { +void Model::set_updatable_param(const Parameter *p, bool status) { unsigned idx = p->index; assert(idx < params.size()); - std::vector::iterator position = std::find(updateable_params.begin(), updateable_params.end(), idx); - if (position == updateable_params.end()) { - if (status) updateable_params.push_back(idx); + std::vector::iterator position = std::find(updatable_params.begin(), updatable_params.end(), idx); + if (position == updatable_params.end()) { + if (status) updatable_params.push_back(idx); } else { - if (!status) updateable_params.erase(position); + if (!status) updatable_params.erase(position); } } -void Model::set_updateable_lookup_param(const LookupParameter *p, bool status) { +void Model::set_updatable_lookup_param(const LookupParameter *p, bool status) { unsigned idx = p->index; assert(idx < lookup_params.size()); - std::vector::iterator position = std::find(updateable_lookup_params.begin(), updateable_lookup_params.end(), idx); - if (position == updateable_lookup_params.end()) { - if (status) updateable_lookup_params.push_back(idx); + std::vector::iterator position = std::find(updatable_lookup_params.begin(), updatable_lookup_params.end(), idx); + if (position == updatable_lookup_params.end()) { + if (status) updatable_lookup_params.push_back(idx); } else { - if (!status) updateable_lookup_params.erase(position); + if (!status) updatable_lookup_params.erase(position); } } -bool Model::is_updateable_param(const Parameter* p) { - std::vector::iterator position = std::find(updateable_params.begin(), updateable_params.end(), p->index); - return position != updateable_params.end(); +bool Model::is_updatable_param(const Parameter* p) { + std::vector::iterator position = std::find(updatable_params.begin(), updatable_params.end(), p->index); + return position != updatable_params.end(); } -bool Model::is_updateable_lookup_param(const LookupParameter* p) { - std::vector::iterator position = std::find(updateable_lookup_params.begin(), updateable_lookup_params.end(), p->index); - return position != updateable_lookup_params.end(); +bool Model::is_updatable_lookup_param(const LookupParameter* p) { + std::vector::iterator position = std::find(updatable_lookup_params.begin(), updatable_lookup_params.end(), p->index); + return position != updatable_lookup_params.end(); } void Model::reset_gradient() { @@ -320,12 +320,12 @@ size_t Model::parameter_count() const { return r; } -size_t Model::updateable_parameter_count() const { +size_t Model::updatable_parameter_count() const { size_t r = 0; - for (const unsigned idx : updateable_params) { + for (const unsigned idx : updatable_params) { r += params[idx]->size(); } - for (const unsigned idx : updateable_lookup_params) { + for (const unsigned idx : updatable_lookup_params) { r += lookup_params[idx]->size(); } return r; diff --git a/dynet/model.h b/dynet/model.h index 152f1a512..32f07c46d 100644 --- a/dynet/model.h +++ b/dynet/model.h @@ -128,7 +128,7 @@ struct Parameter { Tensor* values() { return &(get()->values); } void set_update(bool b); - bool is_updateable(); + bool is_updatable(); private: friend class boost::serialization::access; @@ -152,7 +152,7 @@ struct LookupParameter { std::vector* values() { return &(get()->values); } void set_update(bool b); - bool is_updateable(); + bool is_updatable(); private: friend class boost::serialization::access; @@ -184,18 +184,18 @@ class Model { const std::vector& lookup_parameters_list() const { return lookup_params; } // indexes into params and lookup_params - const std::vector& updateable_parameters_list() const { return updateable_params; } - const std::vector& updateable_lookup_parameters_list() const { return updateable_lookup_params; } + const std::vector& updatable_parameters_list() const { return updatable_params; } + const std::vector& updatable_lookup_parameters_list() const { return updatable_lookup_params; } // Returns the total number of tunable parameters (i. e. scalars) contained within this model. // That is to say, a 2x2 matrix counts as four parameters. size_t parameter_count() const; - size_t updateable_parameter_count() const; + size_t updatable_parameter_count() const; - void set_updateable_param(const Parameter *p, bool status); - void set_updateable_lookup_param(const LookupParameter *p, bool status); - bool is_updateable_param(const Parameter *p); - bool is_updateable_lookup_param(const LookupParameter *p); + void set_updatable_param(const Parameter *p, bool status); + void set_updatable_lookup_param(const LookupParameter *p, bool status); + bool is_updatable_param(const Parameter *p); + bool is_updatable_lookup_param(const LookupParameter *p); L2WeightDecay weight_decay; private: @@ -209,8 +209,8 @@ class Model { // these are a subset of the parameters that are used when model is updated. // kept as indices into params and lookup_params. - std::vector updateable_params; - std::vector updateable_lookup_params; + std::vector updatable_params; + std::vector updatable_lookup_params; mutable float* gradient_norm_scratch; }; diff --git a/dynet/training.cc b/dynet/training.cc index 7b917be90..d131c39dc 100644 --- a/dynet/training.cc +++ b/dynet/training.cc @@ -53,7 +53,7 @@ Trainer::~Trainer() {} void Trainer::rescale_and_reset_weight_decay() { const float weight_decay = model->weight_decay.current_weight_decay(); const auto params = model->parameters_list(); - for (auto p : model->updateable_parameters_list()) + for (auto p : model->updatable_parameters_list()) params[p]->scale_parameters(weight_decay); model->weight_decay.reset_weight_decay(); } @@ -86,13 +86,13 @@ void Trainer::update(real scale) { // Perform gradient clipping and cycle through parameters const float gscale = clip_gradients(); const auto & params = model->parameters_list(); - const auto & upd_params = model->updateable_parameters_list(); + const auto & upd_params = model->updatable_parameters_list(); for(auto i : upd_params) { update_params(scale, gscale, i); params[i]->clear(); } const auto & lookup_params = model->lookup_parameters_list(); - const auto & upd_lookup_params = model->updateable_lookup_parameters_list(); + const auto & upd_lookup_params = model->updatable_lookup_parameters_list(); for(auto i : upd_lookup_params) { for (auto j : lookup_params[i]->non_zero_grads) update_lookup_params(scale, gscale, i, j); diff --git a/python/dynet.pxd b/python/dynet.pxd index 9549aee67..eda82c7b5 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -49,7 +49,7 @@ cdef extern from "dynet/model.h" namespace "dynet": CParameterStorage *get() void zero() void set_update(bool b) - bool is_updateable() + bool is_updatable() cdef cppclass CLookupParameters "dynet::LookupParameter": CLookupParameters() @@ -58,7 +58,7 @@ cdef extern from "dynet/model.h" namespace "dynet": void initialize(unsigned index, const vector[float]& val) void zero() void set_update(bool b) - bool is_updateable() + bool is_updatable() cdef cppclass CModel "dynet::Model": CModel() diff --git a/python/dynet.pyx b/python/dynet.pyx index d4b7a09ea..fc806014c 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -116,7 +116,7 @@ cdef class Parameters: cpdef zero(self): self.thisptr.zero() - cpdef bool is_updateable(self): return self.thisptr.is_updateable() + cpdef bool is_updatable(self): return self.thisptr.is_updatable() cpdef set_update(self, bool b): self.thisptr.set_update(b) @@ -164,7 +164,7 @@ cdef class LookupParameters: cpdef zero(self): self.thisptr.zero() - cpdef bool is_updateable(self): return self.thisptr.is_updateable() + cpdef bool is_updatable(self): return self.thisptr.is_updatable() cpdef set_update(self, bool b): self.thisptr.set_update(b) # TODO document this From 7fa86db698081a64e387360c45c8e04b2a73e9f3 Mon Sep 17 00:00:00 2001 From: yoavg Date: Mon, 10 Oct 2016 02:45:53 +0300 Subject: [PATCH 689/965] simple python test for no-update --- python_tests/test_no_update.py | 94 ++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 python_tests/test_no_update.py diff --git a/python_tests/test_no_update.py b/python_tests/test_no_update.py new file mode 100644 index 000000000..93b12b44e --- /dev/null +++ b/python_tests/test_no_update.py @@ -0,0 +1,94 @@ +## TODO: make into a proper test. +## TODO: test saving and loading. +import dynet as dy + +m = dy.Model() +trainer = dy.AdamTrainer(m) +trainer = dy.SimpleSGDTrainer(m) + +p1 = m.add_parameters((10,10)) +p2 = m.add_parameters((10,10)) +lp1 = m.add_lookup_parameters((10,10)) +lp2 = m.add_lookup_parameters((10,10)) + + +assert( p1.is_updatable() ) +assert( p2.is_updatable() ) +assert( lp1.is_updatable() ) +assert( lp2.is_updatable() ) + +p2.set_update(False) +lp1.set_update(False) + +assert (p1.is_updatable()) +assert (not p2.is_updatable()) +assert (not lp1.is_updatable()) +assert ( lp2.is_updatable() ) + +p1.set_update(True) +p2.set_update(False) +lp1.set_update(False) +lp2.set_update(True) + +assert (p1.is_updatable()) +assert (not p2.is_updatable()) +assert (not lp1.is_updatable()) +assert ( lp2.is_updatable() ) + +p1.set_update(False) +p2.set_update(True) +lp1.set_update(True) +lp2.set_update(False) + +assert (not p1.is_updatable()) +assert (p2.is_updatable()) +assert (lp1.is_updatable()) +assert (not lp2.is_updatable() ) + +import numpy as np +x = np.ones((10,10)) + +p1.load_array(x) +p2.load_array(x) +lp1.init_from_array(x) +lp2.init_from_array(x) + + +pp1 = dy.parameter(p1) +pp2 = dy.parameter(p2) + +a = pp1 * lp1[1] +b = pp2 * lp2[1] +l = dy.dot_product(a,b) +l.npvalue() +l.backward() +trainer.update() + +print p1.as_array() # ones, no updates occured. +print p2.as_array() # 0.99, updates did occur +print lp1.as_array() # 0.99, update did occur +print lp2.as_array() # 1.0, not update occured + +dy.renew_cg() +p1.set_update(True) +p2.set_update(True) +lp1.set_update(True) +lp2.set_update(True) + +pp1 = dy.parameter(p1) +pp2 = dy.parameter(p2) + +a = pp1 * lp1[1] +b = pp2 * lp2[1] +l = dy.dot_product(a,b) +l.npvalue() +l.backward() +trainer.update() + +print +print p1.as_array() # 0.99 +print p2.as_array() # below 0.99, updates did occur +print lp1.as_array() # below 0.99, update did occur +print lp2.as_array() # 0.99 + + From 650345b0890cdf511b40d6c6f433c8b88c2c37f7 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 10 Oct 2016 08:11:20 -0400 Subject: [PATCH 690/965] Made some fixes to initialization --- dynet/model.cc | 31 ++++++++++++++++++------------- dynet/model.h | 34 ++++++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/dynet/model.cc b/dynet/model.cc index 3c186b196..f29245f7c 100644 --- a/dynet/model.cc +++ b/dynet/model.cc @@ -58,11 +58,16 @@ ParameterStorage::ParameterStorage(const Dim& d, float scale) : dim(d) { default_device->allocate_tensor(DeviceMempool::PS, values); default_device->allocate_tensor(DeviceMempool::PS, g); TensorTools::Zero(g); - ParameterInitUniform init(scale); - init.initialize_params(values); + if(scale == 0.0f) { + ParameterInitGlorot init; + init.initialize_params(values); + } else { + ParameterInitUniform init(scale); + init.initialize_params(values); + } } -ParameterStorage::ParameterStorage(const Dim& d, ParameterInit & init) : dim(d) { +ParameterStorage::ParameterStorage(const Dim& d, const ParameterInit & init) : dim(d) { values.d = g.d = d; values.device = g.device = default_device; default_device->allocate_tensor(DeviceMempool::PS, values); @@ -109,7 +114,7 @@ LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d initialize_lookups(); } -LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d, ParameterInit & init) : dim(d) { +LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d, const ParameterInit & init) : dim(d) { all_dim = dim; all_dim.d[all_dim.nd++] = n; all_grads.d = all_values.d = all_dim; all_grads.device = all_values.device = default_device; @@ -173,23 +178,23 @@ void LookupParameterStorage::load(Archive& ar, const unsigned int) { DYNET_SAVELOAD_IMPL(LookupParameterStorage) #endif -void ParameterInitNormal::initialize_params(Tensor & values) { +void ParameterInitNormal::initialize_params(Tensor & values) const { TensorTools::RandomizeNormal(values, mean, sqrt(var)); } -void ParameterInitUniform::initialize_params(Tensor & values) { - if(left == right) { - float my_scale = sqrt(6) / sqrt(values.d.sum_dims()); - TensorTools::RandomizeUniform(values, -my_scale, my_scale); - } else { - TensorTools::RandomizeUniform(values, left, right); - } +void ParameterInitUniform::initialize_params(Tensor & values) const { + TensorTools::RandomizeUniform(values, left, right); } -void ParameterInitConst::initialize_params(Tensor & values) { +void ParameterInitConst::initialize_params(Tensor & values) const { TensorTools::Constant(values, cnst); } +void ParameterInitGlorot::initialize_params(Tensor & values) const { + float my_scale = sqrt(6) / sqrt(values.d.sum_dims()); + TensorTools::RandomizeUniform(values, -my_scale, my_scale); +} + Parameter::Parameter() { mp = nullptr; index = 0; diff --git a/dynet/model.h b/dynet/model.h index 6a0e06ff8..bb4336d72 100644 --- a/dynet/model.h +++ b/dynet/model.h @@ -62,7 +62,7 @@ struct ParameterStorage : public ParameterStorageBase { ParameterStorage() {} explicit ParameterStorage(const Dim& d, float minmax); // initialize with ~U(-minmax,+minmax) // or Glorot initialization if minmax = 0 - explicit ParameterStorage(const Dim& d, ParameterInit & init); // initialize with custom initializer + explicit ParameterStorage(const Dim& d, const ParameterInit & init); // initialize with custom initializer friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int); @@ -108,7 +108,7 @@ struct LookupParameterStorage : public ParameterStorageBase { private: LookupParameterStorage() {} LookupParameterStorage(unsigned n, const Dim& d); - LookupParameterStorage(unsigned n, const Dim& d, ParameterInit & init); + LookupParameterStorage(unsigned n, const Dim& d, const ParameterInit & init); friend class boost::serialization::access; template void save(Archive& ar, const unsigned int) const; @@ -162,28 +162,42 @@ struct LookupParameter { // Initilizers for parameters struct ParameterInit { ParameterInit() {} - virtual void initialize_params(Tensor & values) = 0; + virtual void initialize_params(Tensor & values) const = 0; }; struct ParameterInitNormal : public ParameterInit { ParameterInitNormal(float m = 0.0f, float v = 1.0f) : mean(m), var(v) {} - virtual void initialize_params(Tensor & values) override; + virtual void initialize_params(Tensor & values) const override; private: float mean, var; }; struct ParameterInitUniform : public ParameterInit { - ParameterInitUniform(float mean, float scale = 0.0f) : - left(scale==0.0f?0.0f:-scale), right(scale) {} - ParameterInitUniform(float mean, float l, float r) : left(l), right(r) {} - virtual void initialize_params(Tensor & values) override; + ParameterInitUniform(float scale) : + left(-scale), right(scale) { assert(scale != 0.0f); } + ParameterInitUniform(float l, float r) : left(l), right(r) { assert(l != r); } + virtual void initialize_params(Tensor & values) const override; private: float left, right; }; struct ParameterInitConst : public ParameterInit { ParameterInitConst(float c) : cnst(c) {} - virtual void initialize_params(Tensor & values) override; + virtual void initialize_params(Tensor & values) const override; +private: + float cnst; +}; + +struct ParameterInitGlorot : public ParameterInit { + ParameterInitGlorot() {} + virtual void initialize_params(Tensor & values) const override; +private: + float cnst; +}; + +struct ParameterInitSaxe : public ParameterInit { + ParameterInitSaxe() {} + virtual void initialize_params(Tensor & values) const override; private: float cnst; }; @@ -204,7 +218,7 @@ class Model { Parameter add_parameters(const Dim& d, float scale = 0.0f); Parameter add_parameters(const Dim& d, ParameterInit & init); LookupParameter add_lookup_parameters(unsigned n, const Dim& d); - LookupParameter add_lookup_parameters(unsigned n, const Dim& d, ParameterInit & init); + LookupParameter add_lookup_parameters(unsigned n, const Dim& d, const ParameterInit & init); // project weights so their L2 norm = radius void project_weights(float radius = 1.0f); void set_weight_decay_lambda(float lambda); From 8630a0fab95471009fe83cdc09e5daa538e6fe98 Mon Sep 17 00:00:00 2001 From: yoavg Date: Tue, 11 Oct 2016 01:32:27 +0300 Subject: [PATCH 691/965] chris's comments (sort of) --- dynet/model.cc | 58 +++++++++++++-------------- dynet/model.h | 27 +++++++------ dynet/training.cc | 6 +-- python/dynet.pxd | 8 ++-- python/dynet.pyx | 8 ++-- python_tests/test_no_update.py | 72 +++++++++++++++++----------------- 6 files changed, 90 insertions(+), 89 deletions(-) diff --git a/dynet/model.cc b/dynet/model.cc index fee991549..dfee09876 100644 --- a/dynet/model.cc +++ b/dynet/model.cc @@ -171,12 +171,12 @@ void Parameter::zero() { return mp->parameters_list()[index]->zero(); } -void Parameter::set_update(bool b) { - mp->set_updatable_param(this, b); +void Parameter::set_updated(bool b) { + mp->set_updated_param(this, b); } -bool Parameter::is_updatable() { - return mp->is_updatable_param(this); +bool Parameter::is_updated() { + return mp->is_updated_param(this); } @@ -208,11 +208,11 @@ void LookupParameter::initialize(unsigned index, const std::vector& val) get()->initialize(index, val); } -void LookupParameter::set_update(bool b) { - mp->set_updatable_lookup_param(this, b); +void LookupParameter::set_updated(bool b) { + mp->set_updated_lookup_param(this, b); } -bool LookupParameter::is_updatable() { - return mp->is_updatable_lookup_param(this); +bool LookupParameter::is_updated() { + return mp->is_updated_lookup_param(this); } #ifndef __CUDACC__ @@ -259,7 +259,7 @@ Parameter Model::add_parameters(const Dim& d, float scale) { //cerr << "Adding parameters with dim " << d << endl; all_params.push_back(p); params.push_back(p); - updatable_params.push_back(r.index); + updated_params.insert(r.index); return r; } @@ -269,42 +269,42 @@ LookupParameter Model::add_lookup_parameters(unsigned n, const Dim& d) { //cerr << "Adding lookup parameters with dim " << d << " and size " << n << endl; all_params.push_back(p); lookup_params.push_back(p); - updatable_lookup_params.push_back(r.index); + updated_lookup_params.insert(r.index); return r; } -void Model::set_updatable_param(const Parameter *p, bool status) { +void Model::set_updated_param(const Parameter *p, bool status) { unsigned idx = p->index; assert(idx < params.size()); - std::vector::iterator position = std::find(updatable_params.begin(), updatable_params.end(), idx); - if (position == updatable_params.end()) { - if (status) updatable_params.push_back(idx); + auto position = std::find(updated_params.begin(), updated_params.end(), idx); + if (position == updated_params.end()) { + if (status) updated_params.insert(idx); } else { - if (!status) updatable_params.erase(position); + if (!status) updated_params.erase(position); } } -void Model::set_updatable_lookup_param(const LookupParameter *p, bool status) { +void Model::set_updated_lookup_param(const LookupParameter *p, bool status) { unsigned idx = p->index; assert(idx < lookup_params.size()); - std::vector::iterator position = std::find(updatable_lookup_params.begin(), updatable_lookup_params.end(), idx); - if (position == updatable_lookup_params.end()) { - if (status) updatable_lookup_params.push_back(idx); + auto position = std::find(updated_lookup_params.begin(), updated_lookup_params.end(), idx); + if (position == updated_lookup_params.end()) { + if (status) updated_lookup_params.insert(idx); } else { - if (!status) updatable_lookup_params.erase(position); + if (!status) updated_lookup_params.erase(position); } } -bool Model::is_updatable_param(const Parameter* p) { - std::vector::iterator position = std::find(updatable_params.begin(), updatable_params.end(), p->index); - return position != updatable_params.end(); +bool Model::is_updated_param(const Parameter* p) { + auto position = std::find(updated_params.begin(), updated_params.end(), p->index); + return position != updated_params.end(); } -bool Model::is_updatable_lookup_param(const LookupParameter* p) { - std::vector::iterator position = std::find(updatable_lookup_params.begin(), updatable_lookup_params.end(), p->index); - return position != updatable_lookup_params.end(); +bool Model::is_updated_lookup_param(const LookupParameter* p) { + auto position = std::find(updated_lookup_params.begin(), updated_lookup_params.end(), p->index); + return position != updated_lookup_params.end(); } void Model::reset_gradient() { @@ -320,12 +320,12 @@ size_t Model::parameter_count() const { return r; } -size_t Model::updatable_parameter_count() const { +size_t Model::updated_parameter_count() const { size_t r = 0; - for (const unsigned idx : updatable_params) { + for (const unsigned idx : updated_params) { r += params[idx]->size(); } - for (const unsigned idx : updatable_lookup_params) { + for (const unsigned idx : updated_lookup_params) { r += lookup_params[idx]->size(); } return r; diff --git a/dynet/model.h b/dynet/model.h index 32f07c46d..337c4b24c 100644 --- a/dynet/model.h +++ b/dynet/model.h @@ -2,6 +2,7 @@ #define DYNET_PARAMS_H_ #include +#include #include #include @@ -127,8 +128,8 @@ struct Parameter { Dim dim() { return get()->dim; } Tensor* values() { return &(get()->values); } - void set_update(bool b); - bool is_updatable(); + void set_updated(bool b); + bool is_updated(); private: friend class boost::serialization::access; @@ -151,8 +152,8 @@ struct LookupParameter { Dim dim() { return get()->dim; } std::vector* values() { return &(get()->values); } - void set_update(bool b); - bool is_updatable(); + void set_updated(bool b); + bool is_updated(); private: friend class boost::serialization::access; @@ -184,18 +185,18 @@ class Model { const std::vector& lookup_parameters_list() const { return lookup_params; } // indexes into params and lookup_params - const std::vector& updatable_parameters_list() const { return updatable_params; } - const std::vector& updatable_lookup_parameters_list() const { return updatable_lookup_params; } + const std::set& updated_parameters_list() const { return updated_params; } + const std::set& updated_lookup_parameters_list() const { return updated_lookup_params; } // Returns the total number of tunable parameters (i. e. scalars) contained within this model. // That is to say, a 2x2 matrix counts as four parameters. size_t parameter_count() const; - size_t updatable_parameter_count() const; + size_t updated_parameter_count() const; - void set_updatable_param(const Parameter *p, bool status); - void set_updatable_lookup_param(const LookupParameter *p, bool status); - bool is_updatable_param(const Parameter *p); - bool is_updatable_lookup_param(const LookupParameter *p); + void set_updated_param(const Parameter *p, bool status); + void set_updated_lookup_param(const LookupParameter *p, bool status); + bool is_updated_param(const Parameter *p); + bool is_updated_lookup_param(const LookupParameter *p); L2WeightDecay weight_decay; private: @@ -209,8 +210,8 @@ class Model { // these are a subset of the parameters that are used when model is updated. // kept as indices into params and lookup_params. - std::vector updatable_params; - std::vector updatable_lookup_params; + std::set updated_params; + std::set updated_lookup_params; mutable float* gradient_norm_scratch; }; diff --git a/dynet/training.cc b/dynet/training.cc index d131c39dc..24d2a5b9e 100644 --- a/dynet/training.cc +++ b/dynet/training.cc @@ -53,7 +53,7 @@ Trainer::~Trainer() {} void Trainer::rescale_and_reset_weight_decay() { const float weight_decay = model->weight_decay.current_weight_decay(); const auto params = model->parameters_list(); - for (auto p : model->updatable_parameters_list()) + for (auto p : model->updated_parameters_list()) params[p]->scale_parameters(weight_decay); model->weight_decay.reset_weight_decay(); } @@ -86,13 +86,13 @@ void Trainer::update(real scale) { // Perform gradient clipping and cycle through parameters const float gscale = clip_gradients(); const auto & params = model->parameters_list(); - const auto & upd_params = model->updatable_parameters_list(); + const auto & upd_params = model->updated_parameters_list(); for(auto i : upd_params) { update_params(scale, gscale, i); params[i]->clear(); } const auto & lookup_params = model->lookup_parameters_list(); - const auto & upd_lookup_params = model->updatable_lookup_parameters_list(); + const auto & upd_lookup_params = model->updated_lookup_parameters_list(); for(auto i : upd_lookup_params) { for (auto j : lookup_params[i]->non_zero_grads) update_lookup_params(scale, gscale, i, j); diff --git a/python/dynet.pxd b/python/dynet.pxd index eda82c7b5..3e002a2c7 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -48,8 +48,8 @@ cdef extern from "dynet/model.h" namespace "dynet": CParameters() CParameterStorage *get() void zero() - void set_update(bool b) - bool is_updatable() + void set_updated(bool b) + bool is_updated() cdef cppclass CLookupParameters "dynet::LookupParameter": CLookupParameters() @@ -57,8 +57,8 @@ cdef extern from "dynet/model.h" namespace "dynet": CDim dim void initialize(unsigned index, const vector[float]& val) void zero() - void set_update(bool b) - bool is_updatable() + void set_updated(bool b) + bool is_updated() cdef cppclass CModel "dynet::Model": CModel() diff --git a/python/dynet.pyx b/python/dynet.pyx index fc806014c..cb5bfb9ff 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -116,8 +116,8 @@ cdef class Parameters: cpdef zero(self): self.thisptr.zero() - cpdef bool is_updatable(self): return self.thisptr.is_updatable() - cpdef set_update(self, bool b): self.thisptr.set_update(b) + cpdef bool is_updated(self): return self.thisptr.is_updated() + cpdef set_updated(self, bool b): self.thisptr.set_updated(b) @@ -164,8 +164,8 @@ cdef class LookupParameters: cpdef zero(self): self.thisptr.zero() - cpdef bool is_updatable(self): return self.thisptr.is_updatable() - cpdef set_update(self, bool b): self.thisptr.set_update(b) + cpdef bool is_updated(self): return self.thisptr.is_updated() + cpdef set_updated(self, bool b): self.thisptr.set_updated(b) # TODO document this class Saveable(object): diff --git a/python_tests/test_no_update.py b/python_tests/test_no_update.py index 93b12b44e..76110ce8e 100644 --- a/python_tests/test_no_update.py +++ b/python_tests/test_no_update.py @@ -12,38 +12,38 @@ lp2 = m.add_lookup_parameters((10,10)) -assert( p1.is_updatable() ) -assert( p2.is_updatable() ) -assert( lp1.is_updatable() ) -assert( lp2.is_updatable() ) - -p2.set_update(False) -lp1.set_update(False) - -assert (p1.is_updatable()) -assert (not p2.is_updatable()) -assert (not lp1.is_updatable()) -assert ( lp2.is_updatable() ) - -p1.set_update(True) -p2.set_update(False) -lp1.set_update(False) -lp2.set_update(True) - -assert (p1.is_updatable()) -assert (not p2.is_updatable()) -assert (not lp1.is_updatable()) -assert ( lp2.is_updatable() ) - -p1.set_update(False) -p2.set_update(True) -lp1.set_update(True) -lp2.set_update(False) - -assert (not p1.is_updatable()) -assert (p2.is_updatable()) -assert (lp1.is_updatable()) -assert (not lp2.is_updatable() ) +assert( p1.is_updated() ) +assert( p2.is_updated() ) +assert( lp1.is_updated() ) +assert( lp2.is_updated() ) + +p2.set_updated(False) +lp1.set_updated(False) + +assert (p1.is_updated()) +assert (not p2.is_updated()) +assert (not lp1.is_updated()) +assert ( lp2.is_updated() ) + +p1.set_updated(True) +p2.set_updated(False) +lp1.set_updated(False) +lp2.set_updated(True) + +assert (p1.is_updated()) +assert (not p2.is_updated()) +assert (not lp1.is_updated()) +assert ( lp2.is_updated() ) + +p1.set_updated(False) +p2.set_updated(True) +lp1.set_updated(True) +lp2.set_updated(False) + +assert (not p1.is_updated()) +assert (p2.is_updated()) +assert (lp1.is_updated()) +assert (not lp2.is_updated() ) import numpy as np x = np.ones((10,10)) @@ -70,10 +70,10 @@ print lp2.as_array() # 1.0, not update occured dy.renew_cg() -p1.set_update(True) -p2.set_update(True) -lp1.set_update(True) -lp2.set_update(True) +p1.set_updated(True) +p2.set_updated(True) +lp1.set_updated(True) +lp2.set_updated(True) pp1 = dy.parameter(p1) pp2 = dy.parameter(p2) From f1bf9652594bf9f5d355774662ccd2cd0e07aaff Mon Sep 17 00:00:00 2001 From: yoavg Date: Tue, 11 Oct 2016 01:44:20 +0300 Subject: [PATCH 692/965] save update-status of parameters --- dynet/model.cc | 11 +++++++---- dynet/model.h | 8 ++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/dynet/model.cc b/dynet/model.cc index dfee09876..fd1098037 100644 --- a/dynet/model.cc +++ b/dynet/model.cc @@ -259,7 +259,7 @@ Parameter Model::add_parameters(const Dim& d, float scale) { //cerr << "Adding parameters with dim " << d << endl; all_params.push_back(p); params.push_back(p); - updated_params.insert(r.index); + updated_params.push_back(r.index); return r; } @@ -269,7 +269,7 @@ LookupParameter Model::add_lookup_parameters(unsigned n, const Dim& d) { //cerr << "Adding lookup parameters with dim " << d << " and size " << n << endl; all_params.push_back(p); lookup_params.push_back(p); - updated_lookup_params.insert(r.index); + updated_lookup_params.push_back(r.index); return r; } @@ -279,7 +279,7 @@ void Model::set_updated_param(const Parameter *p, bool status) { auto position = std::find(updated_params.begin(), updated_params.end(), idx); if (position == updated_params.end()) { - if (status) updated_params.insert(idx); + if (status) updated_params.push_back(idx); } else { if (!status) updated_params.erase(position); } @@ -291,7 +291,7 @@ void Model::set_updated_lookup_param(const LookupParameter *p, bool status) { auto position = std::find(updated_lookup_params.begin(), updated_lookup_params.end(), idx); if (position == updated_lookup_params.end()) { - if (status) updated_lookup_params.insert(idx); + if (status) updated_lookup_params.push_back(idx); } else { if (!status) updated_lookup_params.erase(position); } @@ -338,6 +338,9 @@ void Model::serialize(Archive& ar, const unsigned int) { ar & params; ar & lookup_params; ar & weight_decay; + // TODO do we want to save these or not? + ar & updated_params; + ar & updated_lookup_params; } DYNET_SERIALIZE_IMPL(Model) #endif diff --git a/dynet/model.h b/dynet/model.h index 337c4b24c..2762279be 100644 --- a/dynet/model.h +++ b/dynet/model.h @@ -185,8 +185,8 @@ class Model { const std::vector& lookup_parameters_list() const { return lookup_params; } // indexes into params and lookup_params - const std::set& updated_parameters_list() const { return updated_params; } - const std::set& updated_lookup_parameters_list() const { return updated_lookup_params; } + const std::vector& updated_parameters_list() const { return updated_params; } + const std::vector& updated_lookup_parameters_list() const { return updated_lookup_params; } // Returns the total number of tunable parameters (i. e. scalars) contained within this model. // That is to say, a 2x2 matrix counts as four parameters. @@ -210,8 +210,8 @@ class Model { // these are a subset of the parameters that are used when model is updated. // kept as indices into params and lookup_params. - std::set updated_params; - std::set updated_lookup_params; + std::vector updated_params; + std::vector updated_lookup_params; mutable float* gradient_norm_scratch; }; From f2c60e8d5ffd609c84bd8c02b767b33f9830a6fe Mon Sep 17 00:00:00 2001 From: armatthews Date: Mon, 10 Oct 2016 20:35:22 -0400 Subject: [PATCH 693/965] Fixed read-write bug related to boost versioning of tensor class --- dynet/cfsm-builder.cc | 4 ++-- dynet/model.cc | 3 ++- dynet/tensor.cc | 2 -- dynet/tensor.h | 2 ++ 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dynet/cfsm-builder.cc b/dynet/cfsm-builder.cc index ef8058750..34147033c 100644 --- a/dynet/cfsm-builder.cc +++ b/dynet/cfsm-builder.cc @@ -56,7 +56,7 @@ Expression StandardSoftmaxBuilder::full_log_distribution(const Expression& rep) template void StandardSoftmaxBuilder::serialize(Archive& ar, const unsigned int) { - boost::serialization::base_object(*this); + ar & boost::serialization::base_object(*this); ar & p_w; ar & p_b; } @@ -222,7 +222,7 @@ void ClassFactoredSoftmaxBuilder::read_cluster_file(const std::string& cluster_f template void ClassFactoredSoftmaxBuilder::serialize(Archive& ar, const unsigned int) { - boost::serialization::base_object(*this); + ar & boost::serialization::base_object(*this); ar & cdict; ar & widx2cidx; ar & widx2cwidx; diff --git a/dynet/model.cc b/dynet/model.cc index f29245f7c..7e47a8bf9 100644 --- a/dynet/model.cc +++ b/dynet/model.cc @@ -51,6 +51,7 @@ namespace dynet { #ifndef __CUDACC__ ParameterStorageBase::~ParameterStorageBase() {} +DYNET_SERIALIZE_IMPL(ParameterStorageBase) ParameterStorage::ParameterStorage(const Dim& d, float scale) : dim(d) { values.d = g.d = d; @@ -96,7 +97,7 @@ void ParameterStorage::clear() { #ifndef __CUDACC__ template void ParameterStorage::serialize(Archive& ar, const unsigned int) { - boost::serialization::base_object(*this); + ar & boost::serialization::base_object(*this); ar & dim; ar & values; ar & g; diff --git a/dynet/tensor.cc b/dynet/tensor.cc index 97e64753d..da6769d44 100644 --- a/dynet/tensor.cc +++ b/dynet/tensor.cc @@ -15,8 +15,6 @@ using namespace std; -BOOST_CLASS_VERSION(dynet::Tensor, 1) - namespace dynet { ostream& operator<<(ostream& os, const Tensor& t) { diff --git a/dynet/tensor.h b/dynet/tensor.h index 48c6d4564..e1ee679c5 100644 --- a/dynet/tensor.h +++ b/dynet/tensor.h @@ -5,6 +5,7 @@ #include #include +#include #include "dynet/dim.h" #include "dynet/globals.h" @@ -290,4 +291,5 @@ real rand_normal(); } // namespace dynet +BOOST_CLASS_VERSION(dynet::Tensor, 1) #endif From b91f4eaf1462228c579b959672b89b52a69cfbd7 Mon Sep 17 00:00:00 2001 From: Daniel Hershcovich Date: Tue, 11 Oct 2016 14:59:24 +0300 Subject: [PATCH 694/965] Fix compilation error on 32 bit machines --- dynet/mp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynet/mp.h b/dynet/mp.h index 3256f8c5b..73098f218 100644 --- a/dynet/mp.h +++ b/dynet/mp.h @@ -213,7 +213,7 @@ namespace dynet { assert (cid >= 0 && cid < num_children); unsigned i; unsigned priority; - unsigned long recvd_size; + boost::interprocess::message_queue::size_type recvd_size; boost::interprocess::message_queue mq(boost::interprocess::open_or_create, queue_name.c_str(), 10000, sizeof(unsigned)); while (true) { // Check if the parent wants us to exit From cff8534b3741210e3602a570c8b87843e1ccae97 Mon Sep 17 00:00:00 2001 From: Daniel Hershcovich Date: Tue, 11 Oct 2016 15:18:19 +0300 Subject: [PATCH 695/965] Use ppa:boost-latest for latest Boost version --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2edc1dfff..2760b0e0b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,8 +13,9 @@ addons: - g++-4.8 before_script: + - sudo add-apt-repository -y ppa:boost-latest/ppa - sudo apt-get update -qq - - sudo apt-get install libboost-filesystem-dev libboost-program-options-dev libboost-serialization-dev libboost-test-dev libboost-regex-dev + - sudo apt-get install libboost-filesystem1.55-dev libboost-program-options1.55-dev libboost-serialization1.55-dev libboost-test1.55-dev libboost-regex1.55-dev - hg clone https://bitbucket.org/eigen/eigen - mkdir build - cd build From 7fbde7c63452deff265969477adb0e7b2c5f4047 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 11 Oct 2016 09:37:52 -0400 Subject: [PATCH 696/965] Added some missing casts --- dynet/tensor.h | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/dynet/tensor.h b/dynet/tensor.h index e1ee679c5..eb499d9f0 100644 --- a/dynet/tensor.h +++ b/dynet/tensor.h @@ -213,55 +213,55 @@ template<> inline const Eigen::TensorMap> Tensor::t<4>() template<> inline Eigen::TensorMap> Tensor::tb<0>() { assert(d.batch_size() == 1); - return Eigen::TensorMap>(v, d.bd); + return Eigen::TensorMap>(v, (int)d.bd); } template<> inline const Eigen::TensorMap> Tensor::tb<0>() const { assert(d.batch_size() == 1); - return Eigen::TensorMap>(v, d.bd); + return Eigen::TensorMap>(v, (int)d.bd); } template<> inline Eigen::TensorMap> Tensor::tb<1>() { assert(d.ndims() == 1 || d.batch_size() == d.rows()); - return Eigen::TensorMap>(v, (int)d[0], d.bd); + return Eigen::TensorMap>(v, (int)d[0], (int)d.bd); } template<> inline const Eigen::TensorMap> Tensor::tb<1>() const { assert(d.ndims() == 1 || d.batch_size() == d.rows()); - return Eigen::TensorMap>(v, (int)d[0], d.bd); + return Eigen::TensorMap>(v, (int)d[0], (int)d.bd); } template<> inline Eigen::TensorMap> Tensor::tb<2>() { assert(d.ndims() <= 2); - if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], d.bd); - else return Eigen::TensorMap>(v, (int)d[0], (int)1, d.bd); + if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d.bd); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)d.bd); } template<> inline const Eigen::TensorMap> Tensor::tb<2>() const { assert(d.ndims() <= 2); - if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], d.bd); - else return Eigen::TensorMap>(v, (int)d[0], (int)1, d.bd); + if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d.bd); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)d.bd); } template<> inline Eigen::TensorMap> Tensor::tb<3>() { assert(d.ndims() <= 3); - if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], d.bd); - else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, d.bd); - else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, d.bd); + if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d.bd); + else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, (int)d.bd); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, (int)d.bd); } template<> inline const Eigen::TensorMap> Tensor::tb<3>() const { assert(d.ndims() <= 3); - if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], d.bd); - else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, d.bd); - else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, d.bd); + if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d.bd); + else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, (int)d.bd); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, (int)d.bd); } template<> inline Eigen::TensorMap> Tensor::tb<4>() { assert(d.ndims() <= 4); - if(d.ndims() == 4) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3], d.bd); - else if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)1, d.bd); - else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, (int)1, d.bd); - else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, (int)1, d.bd); + if(d.ndims() == 4) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3], (int)d.bd); + else if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)1, (int)d.bd); + else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, (int)1, (int)d.bd); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, (int)1, (int)d.bd); } template<> inline const Eigen::TensorMap> Tensor::tb<4>() const { assert(d.ndims() <= 4); - if(d.ndims() == 4) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3], d.bd); - else if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)1, d.bd); - else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, (int)1, d.bd); - else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, (int)1, d.bd); + if(d.ndims() == 4) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)d[3], (int)d.bd); + else if(d.ndims() == 3) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)d[2], (int)1, (int)d.bd); + else if(d.ndims() == 2) return Eigen::TensorMap>(v, (int)d[0], (int)d[1], (int)1, (int)1, (int)d.bd); + else return Eigen::TensorMap>(v, (int)d[0], (int)1, (int)1, (int)1, (int)d.bd); } // ... From 003db19d679c04865dc5732581426528ce4b2d4e Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 11 Oct 2016 09:48:20 -0400 Subject: [PATCH 697/965] Updated README to new API --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index aa35310ec..48294be59 100644 --- a/README.md +++ b/README.md @@ -138,10 +138,10 @@ x_values = {0.5, 0.3, 0.7}; y_value = 1.0; // "forward" propagates values forward through the computation graph, and returns // the loss. -dynet::real loss = as_scalar(cg.forward()); +dynet::real loss = as_scalar(cg.forward(l)); // "backward" performs back-propagation, and accumulates the gradients of the // parameters within the "Model" data structure. -cg.backward(); +cg.backward(l); // "sgd.update" updates parameters of the model that was passed to its constructor. // Here 1.0 is the scaling factor that allows us to control the size of the update. sgd.update(1.0); From bdacbcd9ccf903970178f5373c7aad40fbb62012 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 11 Oct 2016 12:38:19 -0400 Subject: [PATCH 698/965] Fixed a bunch of warnings --- dynet/cuda.cc | 3 +-- dynet/dynet.cc | 4 ++-- examples/embed-cl.cc | 5 ++--- examples/nlm.cc | 2 +- examples/rnnlm-aevb.cc | 8 ++++---- examples/rnnlm-cfsm.cc | 10 ++++------ examples/rnnlm.cc | 8 ++++---- examples/textcat.cc | 4 ++-- examples/tok-embed.cc | 2 +- examples/xor-batch-lookup.cc | 1 - examples/xor-batch.cc | 1 - 11 files changed, 21 insertions(+), 27 deletions(-) diff --git a/dynet/cuda.cc b/dynet/cuda.cc index c29c5c329..87ca1ccd1 100644 --- a/dynet/cuda.cc +++ b/dynet/cuda.cc @@ -120,8 +120,7 @@ vector initialize_gpu(int& argc, char**& argv) { vector gpu_free_mem(MAX_GPUS, 0); vector gpus(MAX_GPUS, 0); for (int i = 0; i < MAX_GPUS; ++i) gpus[i] = i; - size_t free_bytes, total_bytes, max_free = 0; - int selected = 0; + size_t free_bytes, total_bytes; for (int i = 0; i < nDevices; i++) { if (!gpu_mask[i]) continue; cudaDeviceProp prop; diff --git a/dynet/dynet.cc b/dynet/dynet.cc index d5bfe51ac..7e2af2973 100644 --- a/dynet/dynet.cc +++ b/dynet/dynet.cc @@ -89,12 +89,12 @@ CGCheckpoint ComputationGraph::_get_checkpoint() { void ComputationGraph::_revert(CGCheckpoint p) { default_device->revert(p.device_mem_checkpoint); // clear all nodes at position >= p.node_idx - if (nodes.size() > p.node_idx) { + if ((int)nodes.size() > p.node_idx) { nodes.resize(p.node_idx); // TODO verify deletion of nodes. ee->invalidate(p.node_idx-1); // clear precomputed forward values } // clear all parameter nodes at position >= p.par_node_idx - if (parameter_nodes.size() > p.par_node_idx) { + if ((int)parameter_nodes.size() > p.par_node_idx) { parameter_nodes.resize(p.par_node_idx); } } diff --git a/examples/embed-cl.cc b/examples/embed-cl.cc index fcf8ba1fb..52b84ef6c 100644 --- a/examples/embed-cl.cc +++ b/examples/embed-cl.cc @@ -89,7 +89,6 @@ int main(int argc, char** argv) { kTRG_SOS = td.convert(""); kTRG_EOS = td.convert(""); int tlc = 0; - int ttoks = 0; cerr << "Reading training data from " << argv[1] << "...\n"; { ifstream in(argv[1]); @@ -155,12 +154,12 @@ int main(int argc, char** argv) { sgd = new SimpleSGDTrainer(&model); unsigned report_every_i = 100; - unsigned dev_every_i_reports = 10; unsigned si = training.size(); vector order(training.size()); for (unsigned i = 0; i < order.size(); ++i) order[i] = i; bool first = true; - int report = 0; + // int report = 0; + // unsigned dev_every_i_reports = 10; unsigned lines = 0; while(1) { Timer iteration("completed in"); diff --git a/examples/nlm.cc b/examples/nlm.cc index 5eb1779e1..d98680fe4 100644 --- a/examples/nlm.cc +++ b/examples/nlm.cc @@ -29,7 +29,7 @@ int main(int argc, char** argv) { vector in_c(CONTEXT); // set these to set the context words vector c(CONTEXT); - for (int i=0; i lm(model); diff --git a/examples/rnnlm-cfsm.cc b/examples/rnnlm-cfsm.cc index 075280adc..c48f13b95 100644 --- a/examples/rnnlm-cfsm.cc +++ b/examples/rnnlm-cfsm.cc @@ -140,18 +140,16 @@ int main(int argc, char** argv) { cerr << "Parameters will be written to: " << fname << endl; double best = 9e+99; - bool use_momentum = false; Trainer* sgd = nullptr; - //if (use_momentum) - // sgd = new MomentumSGDTrainer(&model); - //else + // bool use_momentum = false; + // if (use_momentum) + // sgd = new MomentumSGDTrainer(&model); + // else sgd = new SimpleSGDTrainer(&model); RNNLanguageModel lm(model, cfsm); //RNNLanguageModel lm(model, cfsm); - bool has_loaded_model = false; if (argc == 5) { - has_loaded_model = true; string fname = argv[4]; ifstream in(fname); boost::archive::text_iarchive ia(in); diff --git a/examples/rnnlm.cc b/examples/rnnlm.cc index 175a99347..29be8e4bb 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm.cc @@ -173,11 +173,11 @@ int main(int argc, char** argv) { double best = 9e+99; Model model; - bool use_momentum = false; Trainer* sgd = nullptr; - //if (use_momentum) - // sgd = new MomentumSGDTrainer(&model); - //else + // bool use_momentum = false; + // if (use_momentum) + // sgd = new MomentumSGDTrainer(&model); + // else sgd = new SimpleSGDTrainer(&model); RNNLanguageModel lm(model); diff --git a/examples/textcat.cc b/examples/textcat.cc index c3adad526..b36a09ebc 100644 --- a/examples/textcat.cc +++ b/examples/textcat.cc @@ -95,8 +95,8 @@ struct ConvLayer { vector r(out_nfmaps); vector tmp(in_nfmaps); - for (int fj = 0; fj < out_nfmaps; ++fj) { - for (int fi = 0; fi < in_nfmaps; ++fi) { + for (unsigned fj = 0; fj < out_nfmaps; ++fj) { + for (unsigned fi = 0; fi < in_nfmaps; ++fi) { Expression t = conv1d_wide(inlayer[fi], parameter(cg, p_filts[fi][fj])); t = colwise_add(t, parameter(cg, p_fbias[fi][fj])); tmp[fi] = t; diff --git a/examples/tok-embed.cc b/examples/tok-embed.cc index 29118c642..589bb6d25 100644 --- a/examples/tok-embed.cc +++ b/examples/tok-embed.cc @@ -261,7 +261,7 @@ int main(int argc, char** argv) { vector order(training.size()); for (unsigned i = 0; i < order.size(); ++i) order[i] = i; bool first = true; - int report = 0; + // int report = 0; unsigned lines = 0; unsigned report_every_i = 50; unsigned si = training.size(); diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup.cc index 52299891b..d2a8f7fb7 100644 --- a/examples/xor-batch-lookup.cc +++ b/examples/xor-batch-lookup.cc @@ -34,7 +34,6 @@ int main(int argc, char** argv) { } else { // Otherwise, just create a new model. - const unsigned HIDDEN_SIZE = 8; p_W = m.add_parameters({HIDDEN_SIZE, 2}); p_b = m.add_parameters({HIDDEN_SIZE}); p_V = m.add_parameters({1, HIDDEN_SIZE}); diff --git a/examples/xor-batch.cc b/examples/xor-batch.cc index c1a1fc148..3ec51d92e 100644 --- a/examples/xor-batch.cc +++ b/examples/xor-batch.cc @@ -34,7 +34,6 @@ int main(int argc, char** argv) { } else { // Otherwise, just create a new model. - const unsigned HIDDEN_SIZE = 8; p_W = m.add_parameters({HIDDEN_SIZE, 2}); p_b = m.add_parameters({HIDDEN_SIZE}); p_V = m.add_parameters({1, HIDDEN_SIZE}); From 0061b8b62def54f83420a8798dee6208e8dfba4a Mon Sep 17 00:00:00 2001 From: dhg Date: Tue, 11 Oct 2016 11:44:52 -0700 Subject: [PATCH 699/965] pyexamples/{pycnn_viz_birnn -> viz_birnn} --- pyexamples/{pycnn_viz_birnn.py => viz_birnn.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename pyexamples/{pycnn_viz_birnn.py => viz_birnn.py} (100%) diff --git a/pyexamples/pycnn_viz_birnn.py b/pyexamples/viz_birnn.py similarity index 100% rename from pyexamples/pycnn_viz_birnn.py rename to pyexamples/viz_birnn.py From 413995b5398679e0ffe5f42bf2c0c1bfc4ada058 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 11 Oct 2016 18:04:02 -0400 Subject: [PATCH 700/965] Fixed some documentation and library copy commands --- README.md | 75 ++++++++++++++++++++++++++++---------------- dynet/CMakeLists.txt | 1 + 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 48294be59..a07fe3e1d 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,26 @@ DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural netwo ### Building -(for how to use the python bindings, see `PYINSTALL.md`) +(for how to use the python bindings, perform the following build process, then see `PYINSTALL.md`) -Before compiling DyNet, you need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen) for this software to function. **If you use any of the released versions, you may get assertion failures or compile errors.** +#### Prerequisites -In `src`, you need to first use [`cmake`](http://www.cmake.org/) to generate the makefiles +DyNet relies on a number of external libraries including Boost, cmake, Eigen, and mercurial (to install Eigen). +Boost, cmake, and mercurial can be installed from standard repositories, for example on Ubuntu linux: + + sudo apt-get install libboost-all-dev cmake mercurial + +To compile DyNet you also need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen). **If you use any of the released versions, you may get assertion failures or compile errors.** If you don't have Eigen installed already, you can get it easily using the following command: + + hg clone https://bitbucket.org/eigen/eigen/ + +#### Building + +To get and build DyNet, clone the repository + + git clone https://github.com/clab/dynet.git + +then use [`cmake`](http://www.cmake.org/) to generate the makefiles mkdir build cd build @@ -25,30 +40,42 @@ To see that things have built properly, you can run which will train a multilayer perceptron to predict the xor function. -#### Build options +#### Compiling/linking External Programs -##### Building without Eigen installed +When you want to use DyNet in an external program, you will need to add the `dynet` +directory to the compile path: -If you don't have Eigen installed, the instructions below will fetch and compile -both Eigen and DyNet. Eigen does not have to be compiled, so “installing” it is easy. - - git clone https://github.com/clab/dynet.git - hg clone https://bitbucket.org/eigen/eigen/ + -I/path/to/dynet - cd dynet/ - mkdir build - cd build - cmake .. -DEIGEN3_INCLUDE_DIR=../eigen - make -j 2 +and link with the dynet library: + + -L/path/to/dynet/build/dynet -ldynet + +#### Debugging build problems + +If you have a build problem and want to debug, please run + + make clean + make VERBOSE=1 &> make.log + +then examine the commands in the `make.log` file to see if anything looks fishy. If +you would like help, send this `make.log` file via the "Issues" tab on github, or to +the dynet-users mailing list. + +#### Build options ##### GPU (CUDA) support `dynet` supports running programs on GPUs with CUDA. If you have CUDA installed, you can build DyNet with GPU support by adding `-DBACKEND=cuda` to your cmake options. -This will result in two libraries named "libdynet" and "libgdynet" being created. When -you want to run a program on CPU, you can link to the "libdynet" library, and when -you want to run a program on GPU, you can link to the "libgdynet" library. (Eventually -you will be able to use a single library to run on either CPU or GPU, but this is +This will result in three libraries named "libdynet," "libgdynet," and "libdynetcuda" being +created. When you want to run a program on CPU, you can link to the "libdynet" library as +shown above. When you want to run a program on GPU, you can link to the "libgdynet" and +"libdynetcuda" libraries. + + -L/path/to/dynet/build/dynet -lgdynet -ldynetcuda + +(Eventually you will be able to use a single library to run on either CPU or GPU, but this is not fully implemented yet.) ##### Non-standard Boost location @@ -63,7 +90,7 @@ the following to your cmake options: Note that you will also have to set your `LD_LIBRARY_PATH` to point to the `boost/lib` directory. -#### Building for Windows +##### Building for Windows DYNET has been tested to build in Windows using Microsoft Visual Studio 2015. You may be able to build with MSVC 2013 by slightly modifying the instructions below. @@ -79,12 +106,6 @@ To generate the MSVC solution and project files, run [cmake](http://www.cmake.or This will generate dynet.sln and a bunch of \*.vcxproj files (one for the DYNET library, and one per example). You should be able to just open dynet.sln and build all. **Note: multi-process functionality is currently not supported in Windows, so you will not be able to build rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to this project** -#### Debugging build problems - -If you want to see the compile commands that are used, you can run - - make VERBOSE=1 - ### Command line options All programs using DyNet have a few command line options. These must be specified at the @@ -105,7 +126,7 @@ very beginning of the command line, before other options. ### Creating your own models -An illustation of how models are trained (for a simple logistic regression model) is below: +An illustration of how models are trained (for a simple logistic regression model) is below: ```c++ // *** First, we set up the structure of the model diff --git a/dynet/CMakeLists.txt b/dynet/CMakeLists.txt index 1887e32a5..adcd09a0b 100644 --- a/dynet/CMakeLists.txt +++ b/dynet/CMakeLists.txt @@ -118,6 +118,7 @@ install(FILES ${dynet_library_HDRS} DESTINATION include/dynet) install(TARGETS dynet DESTINATION lib) if(WITH_CUDA_BACKEND) install(TARGETS gdynet DESTINATION lib) + install(TARGETS dynetcuda DESTINATION lib) endif(WITH_CUDA_BACKEND) # target_compile_features(dynet PRIVATE cxx_range_for) From 9b1c7c17399054f076051eb6bec34b0485de99ac Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 11 Oct 2016 18:05:27 -0400 Subject: [PATCH 701/965] Add missing cd --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a07fe3e1d..63831d812 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,9 @@ To get and build DyNet, clone the repository git clone https://github.com/clab/dynet.git -then use [`cmake`](http://www.cmake.org/) to generate the makefiles +then enter the directory and use [`cmake`](http://www.cmake.org/) to generate the makefiles + cd dynet mkdir build cd build cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen From 3313a2c8b554e5fbcc2818ba0545c0ab03436144 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 11 Oct 2016 18:06:57 -0400 Subject: [PATCH 702/965] Fixed hierarchy level of README --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 63831d812..623853158 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,11 @@ Dynamic neural network library DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. Read the instructions below to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. -### Building +## Building (for how to use the python bindings, perform the following build process, then see `PYINSTALL.md`) -#### Prerequisites +### Prerequisites DyNet relies on a number of external libraries including Boost, cmake, Eigen, and mercurial (to install Eigen). Boost, cmake, and mercurial can be installed from standard repositories, for example on Ubuntu linux: @@ -18,7 +18,7 @@ To compile DyNet you also need the [development version of the Eigen library](ht hg clone https://bitbucket.org/eigen/eigen/ -#### Building +### Building To get and build DyNet, clone the repository @@ -41,7 +41,7 @@ To see that things have built properly, you can run which will train a multilayer perceptron to predict the xor function. -#### Compiling/linking External Programs +### Compiling/linking External Programs When you want to use DyNet in an external program, you will need to add the `dynet` directory to the compile path: @@ -52,7 +52,7 @@ and link with the dynet library: -L/path/to/dynet/build/dynet -ldynet -#### Debugging build problems +### Debugging build problems If you have a build problem and want to debug, please run @@ -63,9 +63,9 @@ then examine the commands in the `make.log` file to see if anything looks fishy. you would like help, send this `make.log` file via the "Issues" tab on github, or to the dynet-users mailing list. -#### Build options +### Build options -##### GPU (CUDA) support +#### GPU (CUDA) support `dynet` supports running programs on GPUs with CUDA. If you have CUDA installed, you can build DyNet with GPU support by adding `-DBACKEND=cuda` to your cmake options. @@ -79,7 +79,7 @@ shown above. When you want to run a program on GPU, you can link to the "libgdyn (Eventually you will be able to use a single library to run on either CPU or GPU, but this is not fully implemented yet.) -##### Non-standard Boost location +#### Non-standard Boost location `dynet` supports boost, and will find it if it is in the standard location. If boost is in a non-standard location, say `$HOME/boost`, you can specify the location by adding @@ -91,7 +91,7 @@ the following to your cmake options: Note that you will also have to set your `LD_LIBRARY_PATH` to point to the `boost/lib` directory. -##### Building for Windows +#### Building for Windows DYNET has been tested to build in Windows using Microsoft Visual Studio 2015. You may be able to build with MSVC 2013 by slightly modifying the instructions below. @@ -107,7 +107,7 @@ To generate the MSVC solution and project files, run [cmake](http://www.cmake.or This will generate dynet.sln and a bunch of \*.vcxproj files (one for the DYNET library, and one per example). You should be able to just open dynet.sln and build all. **Note: multi-process functionality is currently not supported in Windows, so you will not be able to build rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to this project** -### Command line options +## Command line options All programs using DyNet have a few command line options. These must be specified at the very beginning of the command line, before other options. @@ -125,7 +125,7 @@ very beginning of the command line, before other options. * `--dynet-gpu-ids X,Y,Z`: Specify the GPUs that you want to use by device ID. Currently only one GPU is supported, but if you use this command you can select which one to use. -### Creating your own models +## Creating your own models An illustration of how models are trained (for a simple logistic regression model) is below: From d08be8aa01764ad384a1cf116c5fc8847917544e Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 11 Oct 2016 18:28:41 -0400 Subject: [PATCH 703/965] Fixed tests for contract --- tests/test-nodes.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 2534e8d8d..1b4fc0ca5 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -36,9 +36,9 @@ struct NodeTest { std::vector param_filter1_vals = {1.1f,2.2f,-1.0f,1.2f,-3.4f,-0.2f, 11.1f,12.2f,13.3f,11.2f,12.2f,13.2f}; std::vector param_square1_vals = {1.1f,2.2f,3.4f,1.2f,2.5f,3.2f,5.3f,2.3f,3.3f}; - std::vector param_cube1_vals = {1.1f,2.2f,3.3f,1.2f,2.2f,3.2f,1.3f,2.3f,3.3f, - 11.1f,12.2f,13.3f,11.2f,12.2f,13.2f,11.3f,12.3f,13.3f, - 21.1f,22.2f,23.3f,21.2f,22.2f,23.2f,21.3f,22.3f,23.3f}; + std::vector param_cube1_vals = {.011f,.022f,.033f,.012f,.022f,.032f,.013f,.023f,.033f, + .111f,-.122f,-.033f,-.112f,-.022f,-.132f,-.113f,-.123f,-.133f, + .211f,.222f,.233f,.212f,.222f,.232f,.213f,.223f,.233f}; param1 = mod.add_parameters({3}); TensorTools::SetElements(param1.get()->values,param1_vals); param2 = mod.add_parameters({3}); From 25b5490a77fceca159337cc2b0ad66efc2092c6d Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 11 Oct 2016 19:00:07 -0400 Subject: [PATCH 704/965] Commented out inverse test for stability --- tests/test-nodes.cc | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 1b4fc0ca5..ebd532265 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -608,14 +608,15 @@ BOOST_AUTO_TEST_CASE( transpose_gradient ) { BOOST_CHECK(check_grad(mod, z, 0)); } -// Expression trace_of_product(const Expression& x, const Expression& y); -BOOST_AUTO_TEST_CASE( inverse_gradient ) { - dynet::ComputationGraph cg; - Expression x = parameter(cg, param_square1); - Expression y = inverse(x); - Expression z = input(cg, {1,3}, ones3_vals) * y * input(cg, {3,1}, ones3_vals); - BOOST_CHECK(check_grad(mod, z, 0)); -} +// inverse is too numerically unstable to test appropriately +// // Expression inverse(const Expression& x); +// BOOST_AUTO_TEST_CASE( inverse_gradient ) { +// dynet::ComputationGraph cg; +// Expression x = parameter(cg, param_square1); +// Expression y = inverse(x); +// Expression z = input(cg, {1,3}, ones3_vals) * y * input(cg, {3,1}, ones3_vals); +// BOOST_CHECK(check_grad(mod, z, 0)); +// } // Expression trace_of_product(const Expression& x, const Expression& y); BOOST_AUTO_TEST_CASE( trace_of_product_gradient ) { From b0041d78bd593f7956cefed0bf41d1fecc402334 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 11 Oct 2016 19:21:28 -0400 Subject: [PATCH 705/965] Updated dynet to use initialization --- dynet/model.cc | 7 +++++-- dynet/model.h | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/dynet/model.cc b/dynet/model.cc index 11f34cdd4..bc2d71b6c 100644 --- a/dynet/model.cc +++ b/dynet/model.cc @@ -111,7 +111,8 @@ LookupParameterStorage::LookupParameterStorage(unsigned n, const Dim& d) : dim(d all_grads.device = all_values.device = default_device; default_device->allocate_tensor(DeviceMempool::PS, all_values); default_device->allocate_tensor(DeviceMempool::PS, all_grads); - TensorTools::Zero(all_values); + ParameterInitGlorot init(true); + init.initialize_params(all_values); initialize_lookups(); } @@ -192,7 +193,9 @@ void ParameterInitConst::initialize_params(Tensor & values) const { } void ParameterInitGlorot::initialize_params(Tensor & values) const { - float my_scale = sqrt(6) / sqrt(values.d.sum_dims()); + int dims = 0, dim_len = values.d.nd-(lookup?1:0); + for(int i = 0; i < dim_len; ++i) dims += values.d[i]; + float my_scale = sqrt(6) / sqrt(dims); TensorTools::RandomizeUniform(values, -my_scale, my_scale); } diff --git a/dynet/model.h b/dynet/model.h index f932a1c29..0c6287fdd 100644 --- a/dynet/model.h +++ b/dynet/model.h @@ -196,10 +196,10 @@ struct ParameterInitConst : public ParameterInit { }; struct ParameterInitGlorot : public ParameterInit { - ParameterInitGlorot() {} + ParameterInitGlorot(bool is_lookup = false) : lookup(is_lookup) {} virtual void initialize_params(Tensor & values) const override; private: - float cnst; + bool lookup; }; struct ParameterInitSaxe : public ParameterInit { From 9357838c3e06e39146ace3b66e742e7bc51b6116 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 12 Oct 2016 09:11:17 -0400 Subject: [PATCH 706/965] Added release information --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 623853158..bb858c6f6 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,9 @@ Dynamic neural network library DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. Read the instructions below to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. +* **Latest Code:** Can be found on the github page master/ branch. +* **Latest Release:** [v1.0-rc1](https://github.com/clab/dynet/releases/tag/v1.0-rc1) + ## Building (for how to use the python bindings, perform the following build process, then see `PYINSTALL.md`) From 880fa9fa9e132fb2beed7ae617db7cfe1bcd572c Mon Sep 17 00:00:00 2001 From: yoavg Date: Wed, 12 Oct 2016 19:38:21 +0300 Subject: [PATCH 707/965] batch size support in python reshape --- python/dynet.pxd | 2 ++ python/dynet.pyx | 28 +++++++++++++++++----------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/python/dynet.pxd b/python/dynet.pxd index 3e002a2c7..9ca2dc02f 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -13,8 +13,10 @@ cdef extern from "dynet/dim.h" namespace "dynet": #CDim(int m) except + #CDim(int m, int n) except + CDim(vector[long]& ds) except + + CDim(vector[long]& ds, unsigned int bs) except + #CDim(std::initializer_list[long] x) except + int size() + unsigned int batch_elems() int sum_dims() CDim truncate() void resize(unsigned i) diff --git a/python/dynet.pyx b/python/dynet.pyx index cb5bfb9ff..be2ea901a 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -50,24 +50,22 @@ cdef init(random_seed=None): init() # TODO: allow different random seeds -cdef CDim Dim(dim): +cdef CDim Dim(dim, unsigned int batch_size=1): """ dim: either a tuple or an int """ cdef vector[long] cvec if isinstance(dim, tuple): for d in dim: cvec.push_back(d) - #if len(dim) == 1: return CDim(dim[0]) - #elif len(dim) == 2: return CDim(dim[0],dim[1]) - #else: - # raise "Unsupported dimension",dim - return CDim(cvec) - # hope it's a number. TODO: error checking / exception - if isinstance(dim, (int, float)): + elif isinstance(dim, (int, float)): cvec.push_back(dim) - #return CDim(dim) + else: + raise "Unsupported dimension",dim + + if batch_size > 1: + return CDim(cvec, batch_size) + else: return CDim(cvec) - raise "Unsupported dimension",dim cdef c_tensor_as_np(CTensor &t): # TODO: make more efficient, with less copy @@ -558,6 +556,14 @@ cdef class Expression: #{{{ t = self.cgp().get_value(self.vindex) dim = t.d arr = np.array(c_as_vector(t)) + if dim.batch_elems() > 1: + if dim.ndims() == 1: + arr = arr.reshape(dim.rows(), dim.batch_elems(),order='F') + elif dim.ndims() == 2: + arr = arr.reshape(dim.rows(), dim.cols(), dim.batch_elems(),order='F') + else: + assert(False) + return arr if dim.ndims() == 2: arr = arr.reshape(dim.rows(), dim.cols(),order='F') return arr @@ -812,7 +818,7 @@ cpdef Expression noise(Expression x, float stddev): return Expression.from_cexpr cpdef Expression dropout(Expression x, float p): return Expression.from_cexpr(x.cg_version, c_dropout(x.c(), p)) cpdef Expression block_dropout(Expression x, float p): return Expression.from_cexpr(x.cg_version, c_block_dropout(x.c(), p)) #expr-dim -cpdef Expression reshape(Expression x, tuple d): return Expression.from_cexpr(x.cg_version, c_reshape(x.c(),Dim(d))) +cpdef Expression reshape(Expression x, tuple d, unsigned int batch_size=1): return Expression.from_cexpr(x.cg_version, c_reshape(x.c(),Dim(d, batch_size))) cpdef Expression esum(list xs): assert xs, 'List is empty, nothing to esum.' From a66ab2bbd584422423238dc786013baf19789572 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Thu, 13 Oct 2016 11:53:42 +0300 Subject: [PATCH 708/965] Update PYINSTALL.md --- PYINSTALL.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/PYINSTALL.md b/PYINSTALL.md index 1fe12a3cf..aaa913a4b 100644 --- a/PYINSTALL.md +++ b/PYINSTALL.md @@ -54,8 +54,7 @@ You now have a working python binding inside of `build/dynet`. To verify this is working: ```bash -cd $PATH_TO_DYNET/build/dynet -python +cd $PATH_TO_DYNET/build/python ``` then, within python: ```bash @@ -66,7 +65,7 @@ model = pc.Model() In order to install the module so that it is accessible from everywhere, run the following: ```bash -cd $PATH_TO_DYNET/build/dynet +cd $PATH_TO_DYNET/build/python python setup.py install --user ``` From 4f2373b74911c4042ca29c552ca437e3d7044724 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 13 Oct 2016 11:11:05 -0400 Subject: [PATCH 709/965] Added templates for documentation --- README.md | 50 +++--------------------------------------- doc/builders.md | 4 ++++ doc/index.md | 10 +++++++++ doc/minibatch.md | 2 ++ doc/multiprocessing.md | 4 ++++ doc/operations.md | 4 ++++ doc/optimizers.md | 4 ++++ doc/tutorial.md | 45 +++++++++++++++++++++++++++++++++++++ 8 files changed, 76 insertions(+), 47 deletions(-) create mode 100644 doc/builders.md create mode 100644 doc/index.md create mode 100644 doc/minibatch.md create mode 100644 doc/multiprocessing.md create mode 100644 doc/operations.md create mode 100644 doc/optimizers.md create mode 100644 doc/tutorial.md diff --git a/README.md b/README.md index bb858c6f6..265e88434 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,11 @@ Dynamic neural network library DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. Read the instructions below to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. -* **Latest Code:** Can be found on the github page master/ branch. +* **Latest Code:** Can be found on the github page master branch. * **Latest Release:** [v1.0-rc1](https://github.com/clab/dynet/releases/tag/v1.0-rc1) +**Documentation** can be found in the [doc](doc/index.md) directory. + ## Building (for how to use the python bindings, perform the following build process, then see `PYINSTALL.md`) @@ -127,49 +129,3 @@ very beginning of the command line, before other options. Currently, only one GPU is supported. * `--dynet-gpu-ids X,Y,Z`: Specify the GPUs that you want to use by device ID. Currently only one GPU is supported, but if you use this command you can select which one to use. - -## Creating your own models - -An illustration of how models are trained (for a simple logistic regression model) is below: - -```c++ -// *** First, we set up the structure of the model -// Create a model, and an SGD trainer to update its parameters. -Model mod; -SimpleSGDTrainer sgd(&mod); -// Create a "computation graph," which will define the flow of information. -ComputationGraph cg; -// Initialize a 1x3 parameter vector, and add the parameters to be part of the -// computation graph. -Expression W = parameter(cg, mod.add_parameters({1, 3})); -// Create variables defining the input and output of the regression, and load them -// into the computation graph. Note that we don't need to set concrete values yet. -vector x_values(3); -Expression x = input(cg, {3}, &x_values); -dynet::real y_value; -Expression y = input(cg, &y_value); -// Next, set up the structure to multiply the input by the weight vector, then run -// the output of this through a logistic sigmoid function (logistic regression). -Expression y_pred = logistic(W*x); -// Finally, we create a function to calculate the loss. The model will be optimized -// to minimize the value of the final function in the computation graph. -Expression l = binary_log_loss(y_pred, y); -// We are now done setting up the graph, and we can print out its structure: -cg.print_graphviz(); - -// *** Now, we perform a parameter update for a single example. -// Set the input/output to the values specified by the training data: -x_values = {0.5, 0.3, 0.7}; -y_value = 1.0; -// "forward" propagates values forward through the computation graph, and returns -// the loss. -dynet::real loss = as_scalar(cg.forward(l)); -// "backward" performs back-propagation, and accumulates the gradients of the -// parameters within the "Model" data structure. -cg.backward(l); -// "sgd.update" updates parameters of the model that was passed to its constructor. -// Here 1.0 is the scaling factor that allows us to control the size of the update. -sgd.update(1.0); -``` - -Note that this very simple example that doesn't cover things like memory initialization, reading/writing models, recurrent/LSTM networks, or adding biases to functions. The best way to get an idea of how to use DyNet for real is to look in the `example` directory, particularly starting with the simplest `xor` example. diff --git a/doc/builders.md b/doc/builders.md new file mode 100644 index 000000000..84c3152d1 --- /dev/null +++ b/doc/builders.md @@ -0,0 +1,4 @@ +# DyNet Builders +Builders combine together various operations to implement more complicated things such as recurrent and LSTM networks + +TODO: Create documentation diff --git a/doc/index.md b/doc/index.md new file mode 100644 index 000000000..f1d51fa8d --- /dev/null +++ b/doc/index.md @@ -0,0 +1,10 @@ +# DyNet Documentation +Dynamic neural network library documentation + +You can find more information about various aspects of DyNet below: +* [Tutorial](tutorial.md): How to build a simple model +* [Operations](operations.md): The various operations that you can use in building a DyNet graph +* [Builders](builders.md): Builders combine together various operations to implement more complicated things such as recurrent and LSTM networks +* [Optimizers](optimizers.md): The various optimizers that you can use to tune your parameters +* [Minibatching](minibatch.md): How to perform minibatching +* [Multiprocessing](multiprocessing.md): How to perform processing on multiple threads diff --git a/doc/minibatch.md b/doc/minibatch.md new file mode 100644 index 000000000..4e11d1196 --- /dev/null +++ b/doc/minibatch.md @@ -0,0 +1,2 @@ +# Mini-batching in DyNet +How to perform minibatching to improve efficiency diff --git a/doc/multiprocessing.md b/doc/multiprocessing.md new file mode 100644 index 000000000..1b9eb629c --- /dev/null +++ b/doc/multiprocessing.md @@ -0,0 +1,4 @@ +# Multi-processing in DyNet +How to perform processing on multiple threads + +(TODO: create doc) diff --git a/doc/operations.md b/doc/operations.md new file mode 100644 index 000000000..77b66be0a --- /dev/null +++ b/doc/operations.md @@ -0,0 +1,4 @@ +# DyNet Operations +The various operations that you can use in building a DyNet graph + +TODO: Create documentation diff --git a/doc/optimizers.md b/doc/optimizers.md new file mode 100644 index 000000000..f8a72a296 --- /dev/null +++ b/doc/optimizers.md @@ -0,0 +1,4 @@ +# DyNet Optimizers +The various optimizers that you can use to tune your parameters + +TODO: create documentation diff --git a/doc/tutorial.md b/doc/tutorial.md new file mode 100644 index 000000000..f7a29890d --- /dev/null +++ b/doc/tutorial.md @@ -0,0 +1,45 @@ +# DyNet Tutorial + +An illustration of how models are trained (for a simple logistic regression model) is below: + +```c++ +// *** First, we set up the structure of the model +// Create a model, and an SGD trainer to update its parameters. +Model mod; +SimpleSGDTrainer sgd(&mod); +// Create a "computation graph," which will define the flow of information. +ComputationGraph cg; +// Initialize a 1x3 parameter vector, and add the parameters to be part of the +// computation graph. +Expression W = parameter(cg, mod.add_parameters({1, 3})); +// Create variables defining the input and output of the regression, and load them +// into the computation graph. Note that we don't need to set concrete values yet. +vector x_values(3); +Expression x = input(cg, {3}, &x_values); +dynet::real y_value; +Expression y = input(cg, &y_value); +// Next, set up the structure to multiply the input by the weight vector, then run +// the output of this through a logistic sigmoid function (logistic regression). +Expression y_pred = logistic(W*x); +// Finally, we create a function to calculate the loss. The model will be optimized +// to minimize the value of the final function in the computation graph. +Expression l = binary_log_loss(y_pred, y); +// We are now done setting up the graph, and we can print out its structure: +cg.print_graphviz(); + +// *** Now, we perform a parameter update for a single example. +// Set the input/output to the values specified by the training data: +x_values = {0.5, 0.3, 0.7}; +y_value = 1.0; +// "forward" propagates values forward through the computation graph, and returns +// the loss. +dynet::real loss = as_scalar(cg.forward(l)); +// "backward" performs back-propagation, and accumulates the gradients of the +// parameters within the "Model" data structure. +cg.backward(l); +// "sgd.update" updates parameters of the model that was passed to its constructor. +// Here 1.0 is the scaling factor that allows us to control the size of the update. +sgd.update(1.0); +``` + +Note that this very simple example that doesn't cover things like memory initialization, reading/writing models, recurrent/LSTM networks, or adding biases to functions. The best way to get an idea of how to use DyNet for real is to look in the `example` directory, particularly starting with the simplest `xor` example. From e2740945530e78919e60c1911c90b9d827aefaf8 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 13 Oct 2016 11:31:12 -0400 Subject: [PATCH 710/965] Moved documentation around a bit more --- README.md | 122 ---------------------------------- doc/commandline.md | 17 +++++ doc/index.md | 9 ++- doc/install.md | 102 ++++++++++++++++++++++++++++ PYINSTALL.md => doc/python.md | 0 5 files changed, 126 insertions(+), 124 deletions(-) create mode 100644 doc/commandline.md create mode 100644 doc/install.md rename PYINSTALL.md => doc/python.md (100%) diff --git a/README.md b/README.md index 265e88434..1a3b78416 100644 --- a/README.md +++ b/README.md @@ -7,125 +7,3 @@ DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural netwo * **Latest Release:** [v1.0-rc1](https://github.com/clab/dynet/releases/tag/v1.0-rc1) **Documentation** can be found in the [doc](doc/index.md) directory. - -## Building - -(for how to use the python bindings, perform the following build process, then see `PYINSTALL.md`) - -### Prerequisites - -DyNet relies on a number of external libraries including Boost, cmake, Eigen, and mercurial (to install Eigen). -Boost, cmake, and mercurial can be installed from standard repositories, for example on Ubuntu linux: - - sudo apt-get install libboost-all-dev cmake mercurial - -To compile DyNet you also need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen). **If you use any of the released versions, you may get assertion failures or compile errors.** If you don't have Eigen installed already, you can get it easily using the following command: - - hg clone https://bitbucket.org/eigen/eigen/ - -### Building - -To get and build DyNet, clone the repository - - git clone https://github.com/clab/dynet.git - -then enter the directory and use [`cmake`](http://www.cmake.org/) to generate the makefiles - - cd dynet - mkdir build - cd build - cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen - -Then compile, where "2" can be replaced by the number of cores on your machine - - make -j 2 - -To see that things have built properly, you can run - - ./examples/xor - -which will train a multilayer perceptron to predict the xor function. - -### Compiling/linking External Programs - -When you want to use DyNet in an external program, you will need to add the `dynet` -directory to the compile path: - - -I/path/to/dynet - -and link with the dynet library: - - -L/path/to/dynet/build/dynet -ldynet - -### Debugging build problems - -If you have a build problem and want to debug, please run - - make clean - make VERBOSE=1 &> make.log - -then examine the commands in the `make.log` file to see if anything looks fishy. If -you would like help, send this `make.log` file via the "Issues" tab on github, or to -the dynet-users mailing list. - -### Build options - -#### GPU (CUDA) support - -`dynet` supports running programs on GPUs with CUDA. If you have CUDA installed, you -can build DyNet with GPU support by adding `-DBACKEND=cuda` to your cmake options. -This will result in three libraries named "libdynet," "libgdynet," and "libdynetcuda" being -created. When you want to run a program on CPU, you can link to the "libdynet" library as -shown above. When you want to run a program on GPU, you can link to the "libgdynet" and -"libdynetcuda" libraries. - - -L/path/to/dynet/build/dynet -lgdynet -ldynetcuda - -(Eventually you will be able to use a single library to run on either CPU or GPU, but this is -not fully implemented yet.) - -#### Non-standard Boost location - -`dynet` supports boost, and will find it if it is in the standard location. If boost is -in a non-standard location, say `$HOME/boost`, you can specify the location by adding -the following to your cmake options: - - -DBOOST_ROOT:PATHNAME=$HOME/boost -DBoost_LIBRARY_DIRS:FILEPATH=$HOME/boost/lib - -DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE - -Note that you will also have to set your `LD_LIBRARY_PATH` to point to the `boost/lib` -directory. - -#### Building for Windows - -DYNET has been tested to build in Windows using Microsoft Visual Studio 2015. You may be able to build with MSVC 2013 by slightly modifying the instructions below. - -First, install Eigen following the above instructions. - -Second, install [Boost](http://www.boost.org/) for your compiler and platform. Follow the instructions for compiling Boost or just download the already-compiled binaries. - -To generate the MSVC solution and project files, run [cmake](http://www.cmake.org), pointing it to the location you installed Eigen and Boost (for example, at c:\libs\Eigen and c:\libs\boost_1_61_0): - - mkdir build - cd build - cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64" - -This will generate dynet.sln and a bunch of \*.vcxproj files (one for the DYNET library, and one per example). You should be able to just open dynet.sln and build all. **Note: multi-process functionality is currently not supported in Windows, so you will not be able to build rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to this project** - -## Command line options - -All programs using DyNet have a few command line options. These must be specified at the -very beginning of the command line, before other options. - -* `--dynet-mem NUMBER`: DyNet runs by default with 512MB of memory each for the forward and - backward steps, as well as parameter storage. You will often want to increase this amount. - By setting NUMBER here, DyNet will allocate more memory. Note that you can also individually - set the amount of memory for forward calculation, backward calculation, and parameters - by using comma separated variables `--dynet-mem FOR,BACK,PARAM`. This is useful if, for - example, you are performing testing and don't need to allocate any memory for backward - calculation. -* `--dynet-l2 NUMBER`: Specifies the level of l2 regularization to use (default 1e-6). -* `--dynet-gpus NUMBER`: Specify how many GPUs you want to use, if DyNet is compiled with CUDA. - Currently, only one GPU is supported. -* `--dynet-gpu-ids X,Y,Z`: Specify the GPUs that you want to use by device ID. Currently only - one GPU is supported, but if you use this command you can select which one to use. diff --git a/doc/commandline.md b/doc/commandline.md new file mode 100644 index 000000000..7469cfb49 --- /dev/null +++ b/doc/commandline.md @@ -0,0 +1,17 @@ +# DyNet Command Line Options + +All programs using DyNet have a few command line options. These must be specified at the +very beginning of the command line, before other options. + +* `--dynet-mem NUMBER`: DyNet runs by default with 512MB of memory each for the forward and + backward steps, as well as parameter storage. You will often want to increase this amount. + By setting NUMBER here, DyNet will allocate more memory. Note that you can also individually + set the amount of memory for forward calculation, backward calculation, and parameters + by using comma separated variables `--dynet-mem FOR,BACK,PARAM`. This is useful if, for + example, you are performing testing and don't need to allocate any memory for backward + calculation. +* `--dynet-l2 NUMBER`: Specifies the level of l2 regularization to use (default 1e-6). +* `--dynet-gpus NUMBER`: Specify how many GPUs you want to use, if DyNet is compiled with CUDA. + Currently, only one GPU is supported. +* `--dynet-gpu-ids X,Y,Z`: Specify the GPUs that you want to use by device ID. Currently only + one GPU is supported, but if you use this command you can select which one to use. diff --git a/doc/index.md b/doc/index.md index f1d51fa8d..12aaa60e5 100644 --- a/doc/index.md +++ b/doc/index.md @@ -1,8 +1,13 @@ # DyNet Documentation Dynamic neural network library documentation -You can find more information about various aspects of DyNet below: -* [Tutorial](tutorial.md): How to build a simple model +You can find information about how to install/use DyNet in general below: +* [Installing](install.md): How to compile the code for DyNet +* [Python](python.md): How to set up the Python bindings +* [Command Line Options](commandline.md): DyNet has several options that allow you to specify behavior +* [Tutorial](tutorial.md): How to code and train a simple model + +The following can be referenced when implementing your models in DyNet: * [Operations](operations.md): The various operations that you can use in building a DyNet graph * [Builders](builders.md): Builders combine together various operations to implement more complicated things such as recurrent and LSTM networks * [Optimizers](optimizers.md): The various optimizers that you can use to tune your parameters diff --git a/doc/install.md b/doc/install.md new file mode 100644 index 000000000..48af50e56 --- /dev/null +++ b/doc/install.md @@ -0,0 +1,102 @@ +# Building/Installing +How to build DyNet and link it with your programs + +## Prerequisites + +DyNet relies on a number of external libraries including Boost, cmake, Eigen, and mercurial (to install Eigen). +Boost, cmake, and mercurial can be installed from standard repositories, for example on Ubuntu linux: + + sudo apt-get install libboost-all-dev cmake mercurial + +To compile DyNet you also need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen). **If you use any of the released versions, you may get assertion failures or compile errors.** If you don't have Eigen installed already, you can get it easily using the following command: + + hg clone https://bitbucket.org/eigen/eigen/ + +## Building + +To get and build DyNet, clone the repository + + git clone https://github.com/clab/dynet.git + +then enter the directory and use [`cmake`](http://www.cmake.org/) to generate the makefiles + + cd dynet + mkdir build + cd build + cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen + +Then compile, where "2" can be replaced by the number of cores on your machine + + make -j 2 + +To see that things have built properly, you can run + + ./examples/xor + +which will train a multilayer perceptron to predict the xor function. + +## Compiling/linking External Programs + +When you want to use DyNet in an external program, you will need to add the `dynet` +directory to the compile path: + + -I/path/to/dynet + +and link with the dynet library: + + -L/path/to/dynet/build/dynet -ldynet + +## Debugging build problems + +If you have a build problem and want to debug, please run + + make clean + make VERBOSE=1 &> make.log + +then examine the commands in the `make.log` file to see if anything looks fishy. If +you would like help, send this `make.log` file via the "Issues" tab on github, or to +the dynet-users mailing list. + +## Build options + +### GPU (CUDA) support + +`dynet` supports running programs on GPUs with CUDA. If you have CUDA installed, you +can build DyNet with GPU support by adding `-DBACKEND=cuda` to your cmake options. +This will result in three libraries named "libdynet," "libgdynet," and "libdynetcuda" being +created. When you want to run a program on CPU, you can link to the "libdynet" library as +shown above. When you want to run a program on GPU, you can link to the "libgdynet" and +"libdynetcuda" libraries. + + -L/path/to/dynet/build/dynet -lgdynet -ldynetcuda + +(Eventually you will be able to use a single library to run on either CPU or GPU, but this is +not fully implemented yet.) + +### Non-standard Boost location + +`dynet` supports boost, and will find it if it is in the standard location. If boost is +in a non-standard location, say `$HOME/boost`, you can specify the location by adding +the following to your cmake options: + + -DBOOST_ROOT:PATHNAME=$HOME/boost -DBoost_LIBRARY_DIRS:FILEPATH=$HOME/boost/lib + -DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE + +Note that you will also have to set your `LD_LIBRARY_PATH` to point to the `boost/lib` +directory. + +### Building for Windows + +DYNET has been tested to build in Windows using Microsoft Visual Studio 2015. You may be able to build with MSVC 2013 by slightly modifying the instructions below. + +First, install Eigen following the above instructions. + +Second, install [Boost](http://www.boost.org/) for your compiler and platform. Follow the instructions for compiling Boost or just download the already-compiled binaries. + +To generate the MSVC solution and project files, run [cmake](http://www.cmake.org), pointing it to the location you installed Eigen and Boost (for example, at c:\libs\Eigen and c:\libs\boost_1_61_0): + + mkdir build + cd build + cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64" + +This will generate dynet.sln and a bunch of \*.vcxproj files (one for the DYNET library, and one per example). You should be able to just open dynet.sln and build all. **Note: multi-process functionality is currently not supported in Windows, so you will not be able to build rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to this project** diff --git a/PYINSTALL.md b/doc/python.md similarity index 100% rename from PYINSTALL.md rename to doc/python.md From 51ee76fc97926934c1c0dd797db23f70e1cc1a63 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 13 Oct 2016 11:32:32 -0400 Subject: [PATCH 711/965] Made the front page more concise --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 1a3b78416..ec42c1744 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,7 @@ # DyNet Dynamic neural network library -DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. Read the instructions below to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. +DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. Read the [documentation](doc/index.md) to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. * **Latest Code:** Can be found on the github page master branch. * **Latest Release:** [v1.0-rc1](https://github.com/clab/dynet/releases/tag/v1.0-rc1) - -**Documentation** can be found in the [doc](doc/index.md) directory. From f227ecf68ad1eaf0c4339a3beb8cd7185995b8cd Mon Sep 17 00:00:00 2001 From: jbuckman Date: Thu, 13 Oct 2016 12:39:58 -0400 Subject: [PATCH 712/965] added set_h --- .idea/dynet.iml | 8 ++++++++ .idea/encodings.xml | 6 ++++++ .idea/misc.xml | 14 ++++++++++++++ .idea/modules.xml | 8 ++++++++ .idea/workspace.xml | 40 ++++++++++++++++++++++++++++++++++++++++ PYINSTALL.md | 4 ++-- dynet/fast-lstm.cc | 12 ++++++++++++ dynet/fast-lstm.h | 1 + dynet/gru.cc | 11 +++++++++++ dynet/gru.h | 1 + dynet/lstm.cc | 12 ++++++++++++ dynet/lstm.h | 1 + dynet/rnn.cc | 11 +++++++++++ dynet/rnn.h | 10 ++++++++++ pyexamples/util.pyc | Bin 0 -> 2607 bytes python/dynet.pxd | 1 + python/dynet.pyx | 15 +++++++++++++++ 17 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 .idea/dynet.iml create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/workspace.xml create mode 100644 pyexamples/util.pyc diff --git a/.idea/dynet.iml b/.idea/dynet.iml new file mode 100644 index 000000000..d0876a78d --- /dev/null +++ b/.idea/dynet.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 000000000..97626ba45 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 000000000..cd9d35be3 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..36fb4b31c --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 000000000..d399b4e9a --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + 1476320559710 + + + + + + + + + + \ No newline at end of file diff --git a/PYINSTALL.md b/PYINSTALL.md index 1fe12a3cf..a196b7464 100644 --- a/PYINSTALL.md +++ b/PYINSTALL.md @@ -54,7 +54,7 @@ You now have a working python binding inside of `build/dynet`. To verify this is working: ```bash -cd $PATH_TO_DYNET/build/dynet +cd $PATH_TO_DYNET/build/python python ``` then, within python: @@ -66,7 +66,7 @@ model = pc.Model() In order to install the module so that it is accessible from everywhere, run the following: ```bash -cd $PATH_TO_DYNET/build/dynet +cd $PATH_TO_DYNET/build/python python setup.py install --user ``` diff --git a/dynet/fast-lstm.cc b/dynet/fast-lstm.cc index 411c569db..abc55e4a4 100644 --- a/dynet/fast-lstm.cc +++ b/dynet/fast-lstm.cc @@ -93,6 +93,18 @@ void FastLSTMBuilder::start_new_sequence_impl(const vector& hinit) { } } +// TO DO - Make this correct +Expression FastLSTMBuilder::set_h_impl(int prev, const vector& h_new) { + if (h_new.size()) { assert(h_new.size() == layers); } + const unsigned t = h.size(); + h.push_back(vector(layers)); + for (unsigned i = 0; i < layers; ++i) { + Expression y = h_new[i]; + h[t][i] = y; + } + return h[t].back(); +} + Expression FastLSTMBuilder::add_input_impl(int prev, const Expression& x) { h.push_back(vector(layers)); c.push_back(vector(layers)); diff --git a/dynet/fast-lstm.h b/dynet/fast-lstm.h index 9d04f0ee1..891b46021 100644 --- a/dynet/fast-lstm.h +++ b/dynet/fast-lstm.h @@ -42,6 +42,7 @@ struct FastLSTMBuilder : public RNNBuilder { void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; Expression add_input_impl(int prev, const Expression& x) override; + Expression set_h_impl(int prev, const std::vector& h_new) override; public: // first index is layer, then ... diff --git a/dynet/gru.cc b/dynet/gru.cc index aee5ca8d8..6f4ded7ca 100644 --- a/dynet/gru.cc +++ b/dynet/gru.cc @@ -75,6 +75,17 @@ void GRUBuilder::start_new_sequence_impl(const std::vector& h_0) { } } +Expression GRUBuilder::set_h_impl(int prev, const vector& h_new) { + if (h_new.size()) { assert(h_new.size() == layers); } + const unsigned t = h.size(); + h.push_back(vector(layers)); + for (unsigned i = 0; i < layers; ++i) { + Expression y = h_new[i]; + h[t][i] = y; + } + return h[t].back(); +} + Expression GRUBuilder::add_input_impl(int prev, const Expression& x) { if(dropout_rate != 0.f) throw std::runtime_error("GRUBuilder doesn't support dropout yet"); diff --git a/dynet/gru.h b/dynet/gru.h index 79eac6e68..3d3e15012 100644 --- a/dynet/gru.h +++ b/dynet/gru.h @@ -26,6 +26,7 @@ struct GRUBuilder : public RNNBuilder { void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; Expression add_input_impl(int prev, const Expression& x) override; + Expression set_h_impl(int prev, const std::vector& h_new) override; // first index is layer, then ... std::vector> params; diff --git a/dynet/lstm.cc b/dynet/lstm.cc index 7200a7e69..a64ce8231 100644 --- a/dynet/lstm.cc +++ b/dynet/lstm.cc @@ -96,6 +96,18 @@ void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { } } +// TO DO - Make this correct +Expression LSTMBuilder::set_h_impl(int prev, const vector& h_new) { + if (h_new.size()) { assert(h_new.size() == layers); } + const unsigned t = h.size(); + h.push_back(vector(layers)); + for (unsigned i = 0; i < layers; ++i) { + Expression y = h_new[i]; + h[t][i] = y; + } + return h[t].back(); +} + Expression LSTMBuilder::add_input_impl(int prev, const Expression& x) { h.push_back(vector(layers)); c.push_back(vector(layers)); diff --git a/dynet/lstm.h b/dynet/lstm.h index a0b147d3f..64a9c647c 100644 --- a/dynet/lstm.h +++ b/dynet/lstm.h @@ -42,6 +42,7 @@ struct LSTMBuilder : public RNNBuilder { void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; Expression add_input_impl(int prev, const Expression& x) override; + Expression set_h_impl(int prev, const std::vector& h_new) override; public: // first index is layer, then ... diff --git a/dynet/rnn.cc b/dynet/rnn.cc index d69115504..b59d7f311 100644 --- a/dynet/rnn.cc +++ b/dynet/rnn.cc @@ -89,6 +89,17 @@ void SimpleRNNBuilder::start_new_sequence_impl(const vector& h_0) { if (h0.size()) { assert(h0.size() == layers); } } +Expression SimpleRNNBuilder::set_h_impl(int prev, const vector& h_new) { + if (h_new.size()) { assert(h_new.size() == layers); } + const unsigned t = h.size(); + h.push_back(vector(layers)); + for (unsigned i = 0; i < layers; ++i) { + Expression y = h_new[i]; + h[t][i] = y; + } + return h[t].back(); +} + Expression SimpleRNNBuilder::add_input_impl(int prev, const Expression &in) { if(dropout_rate != 0.f) throw std::runtime_error("SimpleRNNBuilder doesn't support dropout yet"); diff --git a/dynet/rnn.h b/dynet/rnn.h index ed56e43ca..2cfe31352 100644 --- a/dynet/rnn.h +++ b/dynet/rnn.h @@ -43,6 +43,14 @@ struct RNNBuilder { start_new_sequence_impl(h_0); } + // explicitly set the output state of a node + Expression set_h(const RNNPointer& prev, const std::vector& h_new={}) { + sm.transition(RNNOp::add_input); + head.push_back(prev); + cur = head.size() - 1; + return set_h_impl(prev, h_new); + } + // add another timestep by reading in the variable x // return the hidden representation of the deepest layer Expression add_input(const Expression& x) { @@ -100,6 +108,7 @@ struct RNNBuilder { virtual void new_graph_impl(ComputationGraph& cg) = 0; virtual void start_new_sequence_impl(const std::vector& h_0) = 0; virtual Expression add_input_impl(int prev, const Expression& x) = 0; + virtual Expression set_h_impl(int prev, const std::vector& h_new) = 0; RNNPointer cur; float dropout_rate; private: @@ -124,6 +133,7 @@ struct SimpleRNNBuilder : public RNNBuilder { void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h_0) override; Expression add_input_impl(int prev, const Expression& x) override; + Expression set_h_impl(int prev, const std::vector& h_new) override; public: Expression add_auxiliary_input(const Expression& x, const Expression &aux); diff --git a/pyexamples/util.pyc b/pyexamples/util.pyc new file mode 100644 index 0000000000000000000000000000000000000000..450ea3918ff7edb7e04940a8f82d2f75ea62bab9 GIT binary patch literal 2607 zcmb_dT~8!M6us3wJ2335;3BN3>+U8#%tmF*CcbTm0&gb7G|3W)*crMDXy}h&swRMe z2ebPR{1yH_-_>(&&rBQj1#mKTyXtmz)j9W`x)uKZXyKRN{@6=o@(c0&2F)G7r1%@j zMG7PPMhwS+Kn54oW|8jN$FW{Izz58zCyap^sKZ>nT)ID;C%vx(-ufU!b^1SIkfXhX38 zV{}gpfg)gkzb(;juZ0g1e$Gb5TWIckm}{&dayBoc&%_(?0oQnICg9rFf&3cCc^ltj ziqwXm0*}c0S3o9mp*Cw~xX%%LzfcdW(>!d1%8*>;ruHTW~JRYD4=v8SWJSEZ`(N)?@ukZM!C#s8AneX74c{@TY zoO-iY7di0R6QX3=OmsS&m`k67@q9F3|Xt~X#L>Tm=r=8<`3RBTKcVQDy) z(Lp#Mwo^zIoN#1Gi<5R#rV2c_WrOz2UOAl*busH6a5Y`o&vp^ZI5h0YpiNR*4hkE` zo^p)iqDsd(h7rRTu|{ZRNb-Smh4m*@8a?Kl6_^H*_HKIsG-njB<6dpkZ7t4uGTo}P zW(TPqB^c|Ef!aiKAHht@4QdT)iWUiWLKYWBd{$g$;U^KEY*5s?It{!YE6V1GQP7Vy z*b#SW_}!Ws_hX#&L`$s)f>Ctze+_fF-beys*gkm58U&cNK3Mc*;(24vmt-$xNvjpZ zl&X@CvfL_KEz!=8vSHmD=9zB@>D)Xk?cGUDD*(z&9DhI(%$t~1^Ejx_self.builder.thisptr.state() + return RNNState(self.builder, state_idx, self, res) + cpdef RNNState add_input(self, Expression x): cdef Expression res = self.builder.add_input_to_prev(CRNNPointer(self.state_idx), x) cdef int state_idx = self.builder.thisptr.state() From 4ecb8a0e53ee9383dfea6caa82d355f22b27fd2f Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Thu, 13 Oct 2016 19:47:59 +0300 Subject: [PATCH 713/965] Update python.md --- doc/python.md | 96 ++++++++++++++++++++++++++++----------------------- 1 file changed, 53 insertions(+), 43 deletions(-) diff --git a/doc/python.md b/doc/python.md index aaa913a4b..6fc806a22 100644 --- a/doc/python.md +++ b/doc/python.md @@ -4,11 +4,38 @@ Python bindings to DyNet are currently only supported under python 2. -First, get DYNET: +## TL;DR +(see below for the details) + +```bash +# Installing python DyNet on a machine with python 2.7: + +pip install cython # if you don't have it already. +mkdir dynet-base +cd dynet-base +# getting dynet and eigen +git clone https://github.com/clab/dynet.git +hg clone https://bitbucket.org/eigen/eigen +cd dynet +mkdir build +cd build +# without GPU support: +cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` +# or with GPU support: +cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` -DBACKEND=cuda + +make -j 2 # replace 2 with the number of available cores +cd python +python setup.py install # or `python setup.py install --user` for a user-local install. +``` + +## Detailed Instructions: +First, get DyNet: ```bash cd $HOME -mkdir dynet +mkdir dynet-base +cd dynet-base git clone https://github.com/clab/dynet.git cd dynet git submodule init # To be consistent with DyNet's installation instructions. @@ -19,7 +46,7 @@ Then get Eigen: ```bash cd $HOME -cd dynet +cd dynet-base hg clone https://bitbucket.org/eigen/eigen/ ``` @@ -32,23 +59,28 @@ pip install cython To simplify the following steps, we can set a bash variable to hold where we have saved the main directories of DyNet and Eigen. In case you have gotten DyNet and Eigen differently from the instructions above and saved them in different location(s), these variables will be helpful: ```bash -PATH_TO_DYNET=$HOME/dynet/dynet/ -PATH_TO_EIGEN=$HOME/dynet/eigen/ +PATH_TO_DYNET=$HOME/dynet-base/dynet/ +PATH_TO_EIGEN=$HOME/dynet-base/eigen/ ``` Compile DyNet. -(modify the code below to point to the correct boost location. Note the addition of the -DPYTHON flag.) + +This is pretty much the same process as compiling DyNet, with the addition of the `-DPYTHON=` flag, pointing to the location of your python interpreter. + +If boost is installed in a non-standard location, you should add the corresponding flags to the `cmake` commandline, +see the [DyNet installation instructions page](install.md). ```bash cd $PATH_TO_DYNET PATH_TO_PYTHON=`which python` mkdir build cd build -cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DBOOST_ROOT=$HOME/.local/boost_1_58_0 -DBoost_NO_BOOST_CMAKE=ON -DPYTHON=$PATH_TO_PYTHON +cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON make -j 2 ``` Assuming that the `cmake` command found all the needed libraries and didn't fail, the `make` command will take a while, and compile dynet as well as the python bindings. +You can change `make -j 2` to a higher number, depending on the available cores you want to use while compiling. You now have a working python binding inside of `build/dynet`. To verify this is working: @@ -58,12 +90,12 @@ cd $PATH_TO_DYNET/build/python ``` then, within python: ```bash -import dynet as pc -print pc.__version__ -model = pc.Model() +import dynet as dy +print dy.__version__ +model = dy.Model() ``` -In order to install the module so that it is accessible from everywhere, run the following: +In order to install the module so that it is accessible from everywhere in the system, run the following: ```bash cd $PATH_TO_DYNET/build/python python setup.py install --user @@ -95,49 +127,27 @@ model = Model() ``` ## Installing with GPU support -## Currently unsupported. The GPU support instructions need some revisions. For installing on a computer with GPU, first install CUDA. -Here, we assume CUDA is installed in `/usr/local/cuda-7.5` - -There are two modules, `dynet` which is the regular CPU module, and `gdynet` which is the GPU -module. You can import either of them, these are two independent modules. The GPU support -is incomplete: some operations (i.e. `hubber_distance`) are not available for the GPU. +The following instructions assume CUDA is installed. -First step is to build the DyNet modules. -Checkout and go to the `build` directory (same instructions as above). Then: +The installation process is pretty much the same, while adding the `-DBACKEND=cuda` flag to the `cmake` stage: -To build a CPU version on a computer with CUDA: ```bash -cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DBACKEND=eigen -make -j 4 +cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON -DBACKEND=cuda ``` -To build a GPU version on a computer with CUDA: -```bash -cmake .. -DBACKEND=cuda -DCUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda-7.5/ -make -j 4 -``` +(if CUDA is installed in a non-standard location and `cmake` cannot find it, you can specify also `-DCUDA_TOOLKIT_ROOT_DIR=/path/to/cuda`.) Now, build the python modules (as above, we assume cython is installed): -The GPU module (gdynet): -```bash -cd ../dynet -make gdynet.so -make ginstall -``` - -The CPU module (dynet): -```bash -cd ../dynet -make dynet.so -make install -``` +After running `make -j 2`, you should have the files `_dynet.so` and `_gdynet.so` in the `build/python` folder. -Add the following to your env: -`export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PATH_TO_DYNET/dynet` +As before, `cd build/python` followed by `python setup.py install --user` will install the module. -Once both the `dynet` and `gdynet` are installed, run `python ../pyexamples/cpu_vs_gpu.py` for a small timing example. +# Using the GPU: +In order to use the GPU support, you can either: +* Use `import _gdynet as dy` instead of `import dynet as dy` +* Or use the commandline switch `--dynet-gpu` or the GPU switches detailed [here](commandline.md) when invoking the program. From 49b29d54fdd0284cece3a4c21e21f10969f7894e Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Thu, 13 Oct 2016 19:50:18 +0300 Subject: [PATCH 714/965] Update python.md --- doc/python.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/python.md b/doc/python.md index 6fc806a22..cffc865a7 100644 --- a/doc/python.md +++ b/doc/python.md @@ -150,4 +150,4 @@ As before, `cd build/python` followed by `python setup.py install --user` will i In order to use the GPU support, you can either: * Use `import _gdynet as dy` instead of `import dynet as dy` -* Or use the commandline switch `--dynet-gpu` or the GPU switches detailed [here](commandline.md) when invoking the program. +* Or, (preferred), `import dynet` as usual, but use the commandline switch `--dynet-gpu` or the GPU switches detailed [here](commandline.md) when invoking the program. This option lets the same code work with either the GPU or the CPU version depending on how it is invoked. From 8999b775d67c62cbc0ca3aa82ce42f61790b338b Mon Sep 17 00:00:00 2001 From: jbuckman Date: Thu, 13 Oct 2016 13:02:48 -0400 Subject: [PATCH 715/965] got rid of idea files --- .idea/dynet.iml | 8 -------- .idea/encodings.xml | 6 ------ .idea/misc.xml | 14 -------------- .idea/modules.xml | 8 -------- .idea/workspace.xml | 40 ---------------------------------------- 5 files changed, 76 deletions(-) delete mode 100644 .idea/dynet.iml delete mode 100644 .idea/encodings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/workspace.xml diff --git a/.idea/dynet.iml b/.idea/dynet.iml deleted file mode 100644 index d0876a78d..000000000 --- a/.idea/dynet.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml deleted file mode 100644 index 97626ba45..000000000 --- a/.idea/encodings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index cd9d35be3..000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 36fb4b31c..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml deleted file mode 100644 index d399b4e9a..000000000 --- a/.idea/workspace.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - 1476320559710 - - - - - - - - - - \ No newline at end of file From 9fdcadb7220a6d74f0af190b974e17a768f0e2c0 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Wed, 12 Oct 2016 17:50:57 -0700 Subject: [PATCH 716/965] Fix spacing in cmakelists (change tabs to spaces) --- CMakeLists.txt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 69f20f2d8..26e0d96a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,16 +14,16 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # Cross-compiler, cross-platform options set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_FAST_MATH") -# Platform-specific options +######## Platform-specific options if(WIN32) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNOMINMAX") # Disable min/max macros in windef.h + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DNOMINMAX") # Disable min/max macros in windef.h endif() -# Compiler-specific options +######## Compiler-specific options if(MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W1 -DEIGEN_HAS_C99_MATH /MP") # -Wall produces 20k warnings + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W1 -DEIGEN_HAS_C99_MATH /MP") # -Wall produces 20k warnings else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -funroll-loops -Wall -std=c++11 -Ofast -g -march=native") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -funroll-loops -Wall -std=c++11 -Ofast -g -march=native") endif() enable_testing() @@ -61,11 +61,11 @@ message("-- Boost dir is " ${EIGEN3_INCLUDE_DIR}) find_package(Boost COMPONENTS program_options regex serialization REQUIRED) include_directories(${Boost_INCLUDE_DIR}) if(MSVC) - # Boost does auto-linking when using a compiler like Microsoft Visual C++, we just need to help it find the libraries - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LIBPATH:${Boost_LIBRARY_DIRS}") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LIBPATH:${Boost_LIBRARY_DIRS}") + # Boost does auto-linking when using a compiler like Microsoft Visual C++, we just need to help it find the libraries + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LIBPATH:${Boost_LIBRARY_DIRS}") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LIBPATH:${Boost_LIBRARY_DIRS}") else() - set(LIBS ${LIBS} ${Boost_LIBRARIES}) + set(LIBS ${LIBS} ${Boost_LIBRARIES}) endif() # trouble shooting: # if boost library cannot be found, in addition to install boost library From e752184479a2ab1e1d3f053659a51633f404c7f1 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Wed, 12 Oct 2016 17:53:33 -0700 Subject: [PATCH 717/965] CUDA support for Windows. Changes to nodes.cc shouldn't change the generated code, but fix a problem with nvcc using MSVC. --- dynet/CMakeLists.txt | 8 ++++++++ dynet/cuda.h | 5 +++++ dynet/nodes.cc | 8 +++++--- dynet/simd-functors.h | 2 ++ dynet/tensor.h | 3 +++ 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/dynet/CMakeLists.txt b/dynet/CMakeLists.txt index adcd09a0b..6b040831c 100644 --- a/dynet/CMakeLists.txt +++ b/dynet/CMakeLists.txt @@ -110,6 +110,14 @@ if(WITH_CUDA_BACKEND) # Build nvcc-compiled gpu library set(CUDA_SEPARABLE_COMPILATION ON) list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU;-DHAVE_CUDA") + if(MSVC) + # If MSVC, we need the C99 math flag as in other compilations, and we need the boost flag because nvcc doesn't + # properly parse part of the boost template definitions + list(APPEND CUDA_NVCC_FLAGS "-DEIGEN_HAS_C99_MATH;-DBOOST_NO_CXX11_ALLOCATOR") + list(APPEND CUDA_NVCC_FLAGS_DEBUG "--compiler-options \"/MDd\"") + list(APPEND CUDA_NVCC_FLAGS_RELEASE "--compiler-options \"/MD\"") + endif() + SET(CUDA_PROPAGATE_HOST_FLAGS OFF) cuda_add_library(dynetcuda SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu OPTIONS --compiler-options "-fPIC") endif(WITH_CUDA_BACKEND) diff --git a/dynet/cuda.h b/dynet/cuda.h index b554ae124..b45691289 100644 --- a/dynet/cuda.h +++ b/dynet/cuda.h @@ -37,9 +37,14 @@ class Device; inline std::pair SizeToBlockThreadPair(int n) { assert(n); int logn; +#ifdef _WIN32 + // TODO: Write assembly for MSVC, remove the following line: + logn = log2(n); +#else asm("\tbsr %1, %0\n" : "=r"(logn) : "r" (n-1)); +#endif logn = logn > 9 ? 9 : (logn < 4 ? 4 : logn); ++logn; int threads = 1 << logn; diff --git a/dynet/nodes.cc b/dynet/nodes.cc index af78c187e..b3900bfc7 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -780,9 +780,10 @@ void Hinge::backward_dev_impl(const MyDevice & dev, // TODO: The > comparison should not be calculated twice. Keep it in auxiliary memory? dEdxi.tvec().device(*dev.edevice) += (eloss.tvec() > 0.f).cast() * d; #if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) - throw std::runtime_error("CUDA memory allocation in hinge"); + throw std::runtime_error("CUDA memory allocation in hinge"); #endif - dEdxi.tvec().chip<0>(*pelement).device(*dev.edevice) -= (eloss.tvec() > 0.f).cast().sum() * d; + auto&& hinge_sum = (eloss.tvec() > 0.f).cast().sum() * d; + dEdxi.tvec().chip<0>(*pelement).device(*dev.edevice) -= hinge_sum; } } else { assert(pelements != nullptr); @@ -796,7 +797,8 @@ void Hinge::backward_dev_impl(const MyDevice & dev, #if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) throw std::runtime_error("CUDA memory allocation in hinge"); #endif - dEdxi.tb<1>().chip<1>(b).chip<0>((*pelements)[b]).device(*dev.edevice) -= (eloss.tb<1>().chip<1>(b) > 0.f).cast().sum() * d_vec[b]; + auto&& hinge_sum = (eloss.tb<1>().chip<1>(b) > 0.f).cast().sum() * d_vec[b]; + dEdxi.tb<1>().chip<1>(b).chip<0>((*pelements)[b]).device(*dev.edevice) -= hinge_sum; } } } diff --git a/dynet/simd-functors.h b/dynet/simd-functors.h index 68634cb21..ae11feae2 100644 --- a/dynet/simd-functors.h +++ b/dynet/simd-functors.h @@ -1,7 +1,9 @@ #ifndef DYNET_XFUNCTORS_H #define DYNET_XFUNCTORS_H +#ifndef __NVCC__ #include +#endif #include "dynet/functors.h" diff --git a/dynet/tensor.h b/dynet/tensor.h index eb499d9f0..56d923151 100644 --- a/dynet/tensor.h +++ b/dynet/tensor.h @@ -21,7 +21,10 @@ // Following line is commented out because it causes errors with large nets (Antonis) //#define EIGEN_NO_MALLOC +#ifndef __NVCC__ #include +#endif + #include namespace dynet { From 590c2b3120de5f24aa75e8a8065a572b858aa649 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Wed, 12 Oct 2016 18:50:21 -0700 Subject: [PATCH 718/965] MKL support. use cmake -DMKL_ROOT= and it will use MKL. I get 3x speedup on encdec example. MKL_LIBS must come before the cnn library when linking, hence the new variable MKL_LIBS. --- CMakeLists.txt | 29 ++++++++++++++++++++++++++++- examples/CMakeLists.txt | 4 ++-- rnnlm/CMakeLists.txt | 2 +- tests/CMakeLists.txt | 4 ++-- tutorial/CMakeLists.txt | 2 +- 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 26e0d96a7..69ef20f13 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,8 +11,35 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # flags (the compiler does not always make the best configuration # decisions without help) -# Cross-compiler, cross-platform options +function(find_mkl) + set(MKL_ARCH intel64) + find_path(MKL_INCLUDE_DIR mkl.h + PATHS ${MKL_ROOT} ${MKL_ROOT}/include) + find_library(MKL_CORE_LIB NAMES mkl_intel_lp64.lib mkl_intel_thread.lib mkl_core.lib + PATHS ${MKL_ROOT} ${MKL_ROOT}/lib/${MKL_ARCH} + DOC "MKL core library path") + find_library(MKL_COMPILER_LIB NAMES libiomp5md.lib + PATHS ${MKL_ROOT} ${MKL_ROOT}/../compiler/lib/${MKL_ARCH} + DOC "MKL compiler lib (for threaded MKL)") + if(MKL_INCLUDE_DIR AND MKL_CORE_LIB AND MKL_COMPILER_LIB) + get_filename_component(MKL_CORE_LIB_DIR ${MKL_CORE_LIB} DIRECTORY) + get_filename_component(MKL_COMPILER_LIB_DIR ${MKL_COMPILER_LIB} DIRECTORY) + message(STATUS "Found MKL\n * include: ${MKL_INCLUDE_DIR},\n * core library dir: ${MKL_CORE_LIB_DIR},\n * compiler library dir: ${MKL_COMPILER_LIB_DIR}") + set(MKL_LIBS mkl_intel_lp64.lib mkl_intel_thread.lib mkl_core.lib libiomp5md.lib PARENT_SCOPE) + include_directories(${MKL_INCLUDE_DIR}) + link_directories(${MKL_CORE_LIB_DIR} ${MKL_COMPILER_LIB_DIR}) + else() + message(FATAL_ERROR "Failed to find MKL in path: ${MKL_ROOT} (Did you set MKL_ROOT properly?)") + endif() +endfunction() + +######## Cross-compiler, cross-platform options set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_FAST_MATH") +if (MKL OR MKL_ROOT) + find_mkl() # sets include/lib directories and sets ${MKL_LIBS} needed for linking + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_USE_MKL_ALL") +endif() + ######## Platform-specific options if(WIN32) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 0ee556e7d..2974627f6 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -4,12 +4,12 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET mlc tok-embed poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm-mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) if (WITH_CUDA_BACKEND) - target_link_libraries(${TARGET} gdynet ${LIBS}) + target_link_libraries(${TARGET} ${MKL_LIBS} gdynet ${LIBS}) add_dependencies(${TARGET} dynetcuda) target_link_libraries(${TARGET} dynetcuda) CUDA_ADD_CUBLAS_TO_TARGET(${TARGET}) else() - target_link_libraries(${TARGET} dynet ${LIBS}) + target_link_libraries(${TARGET} ${MKL_LIBS} dynet ${LIBS}) endif (WITH_CUDA_BACKEND) if(UNIX AND NOT APPLE) target_link_libraries(${TARGET} rt) diff --git a/rnnlm/CMakeLists.txt b/rnnlm/CMakeLists.txt index 5c112d681..15969a980 100644 --- a/rnnlm/CMakeLists.txt +++ b/rnnlm/CMakeLists.txt @@ -2,7 +2,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET lm) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) - target_link_libraries(${TARGET} dynet ${LIBS}) + target_link_libraries(${TARGET} ${MKL_LIBS} dynet ${LIBS}) if(UNIX AND NOT APPLE) target_link_libraries(${TARGET} rt) endif() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 34a90a2f5..63eded729 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -14,14 +14,14 @@ set(test_dynet_SRCS add_executable (test-dynet test-dynet.cc ${test_dynet_SRCS}) if (WITH_CUDA_BACKEND) - target_link_libraries (test-dynet gdynet ${LIBS} + target_link_libraries (test-dynet ${MKL_LIBS} gdynet ${LIBS} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ) add_dependencies(test-dynet dynetcuda) target_link_libraries(test-dynet dynetcuda) CUDA_ADD_CUBLAS_TO_TARGET(test-dynet) else() - target_link_libraries (test-dynet dynet ${LIBS} + target_link_libraries (test-dynet ${MKL_LIBS} dynet ${LIBS} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ) endif (WITH_CUDA_BACKEND) diff --git a/tutorial/CMakeLists.txt b/tutorial/CMakeLists.txt index c938ffcd7..9e94fc762 100644 --- a/tutorial/CMakeLists.txt +++ b/tutorial/CMakeLists.txt @@ -2,7 +2,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET 0_multiply 1_linear_regression) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) - target_link_libraries(${TARGET} dynet ${LIBS}) + target_link_libraries(${TARGET} ${MKL_LIBS} dynet ${LIBS}) if(UNIX AND NOT APPLE) target_link_libraries(${TARGET} rt) endif() From 0e7faeffc426c2e16aa99a95e17bbd7f7b25c69e Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Thu, 13 Oct 2016 16:32:13 -0700 Subject: [PATCH 719/965] Removing .lib extension in findMKL --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 69ef20f13..8a1fb20ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -15,10 +15,10 @@ function(find_mkl) set(MKL_ARCH intel64) find_path(MKL_INCLUDE_DIR mkl.h PATHS ${MKL_ROOT} ${MKL_ROOT}/include) - find_library(MKL_CORE_LIB NAMES mkl_intel_lp64.lib mkl_intel_thread.lib mkl_core.lib + find_library(MKL_CORE_LIB NAMES mkl_intel_lp64 mkl_intel_thread mkl_core PATHS ${MKL_ROOT} ${MKL_ROOT}/lib/${MKL_ARCH} DOC "MKL core library path") - find_library(MKL_COMPILER_LIB NAMES libiomp5md.lib + find_library(MKL_COMPILER_LIB NAMES libiomp5md PATHS ${MKL_ROOT} ${MKL_ROOT}/../compiler/lib/${MKL_ARCH} DOC "MKL compiler lib (for threaded MKL)") if(MKL_INCLUDE_DIR AND MKL_CORE_LIB AND MKL_COMPILER_LIB) From 06e4e0ff3374f92496ffc79a51c26ef9d2be9080 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Thu, 13 Oct 2016 16:34:32 -0700 Subject: [PATCH 720/965] Changing WIndows/MSVC compile to create static libraries, and removing unused -fPIC flag for MSVC. MSVC DLLs export nothing by default, so getting all of the symbols to export will requiring adding __declspec(dllexport) on every class/function. Or, I tried using CMake's CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS but this only seems to export half the symbols. So for now at least we'll do static linking on Windows. --- dynet/CMakeLists.txt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dynet/CMakeLists.txt b/dynet/CMakeLists.txt index 6b040831c..4bc69b2b5 100644 --- a/dynet/CMakeLists.txt +++ b/dynet/CMakeLists.txt @@ -76,6 +76,9 @@ set(dynet_library_HDRS ) file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) +if (NOT MSVC) + set(BUILD_SHARED_LIBS ON) +endif() #foreach(test_src ${TEST_SRCS}) #Extract the filename without an extension (NAME_WE) @@ -98,12 +101,12 @@ file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) #endforeach(test_src) # Build cpu library -add_library(dynet SHARED ${dynet_library_SRCS} ${dynet_library_HDRS}) +add_library(dynet ${dynet_library_SRCS} ${dynet_library_HDRS}) target_link_libraries(dynet ${LIBS}) if(WITH_CUDA_BACKEND) # Build main gpu library list(APPEND dynet_library_SRCS cuda.cc) - add_library(gdynet SHARED ${dynet_library_SRCS} ${dynet_library_HDRS}) + add_library(gdynet ${dynet_library_SRCS} ${dynet_library_HDRS}) target_link_libraries(gdynet ${LIBS}) set_target_properties(gdynet PROPERTIES COMPILE_DEFINITIONS HAVE_CUDA) @@ -116,10 +119,12 @@ if(WITH_CUDA_BACKEND) list(APPEND CUDA_NVCC_FLAGS "-DEIGEN_HAS_C99_MATH;-DBOOST_NO_CXX11_ALLOCATOR") list(APPEND CUDA_NVCC_FLAGS_DEBUG "--compiler-options \"/MDd\"") list(APPEND CUDA_NVCC_FLAGS_RELEASE "--compiler-options \"/MD\"") + else() + list(APPEND CUDA_NVCC_FLAGS "--compiler-optons \"-fPIC\"") endif() SET(CUDA_PROPAGATE_HOST_FLAGS OFF) - cuda_add_library(dynetcuda SHARED gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu OPTIONS --compiler-options "-fPIC") + cuda_add_library(dynetcuda gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu) endif(WITH_CUDA_BACKEND) install(FILES ${dynet_library_HDRS} DESTINATION include/dynet) From 8d9ec6aa614db4b9a05372b1f1a61177ef60d1ba Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Thu, 13 Oct 2016 16:45:06 -0700 Subject: [PATCH 721/965] Changing __NVCC__ to __CUDACC__ to be consistent with the rest of the library. --- dynet/simd-functors.h | 2 +- dynet/tensor.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dynet/simd-functors.h b/dynet/simd-functors.h index ae11feae2..2f48ebdeb 100644 --- a/dynet/simd-functors.h +++ b/dynet/simd-functors.h @@ -1,7 +1,7 @@ #ifndef DYNET_XFUNCTORS_H #define DYNET_XFUNCTORS_H -#ifndef __NVCC__ +#ifndef __CUDACC__ #include #endif diff --git a/dynet/tensor.h b/dynet/tensor.h index 56d923151..9d73b6956 100644 --- a/dynet/tensor.h +++ b/dynet/tensor.h @@ -21,7 +21,7 @@ // Following line is commented out because it causes errors with large nets (Antonis) //#define EIGEN_NO_MALLOC -#ifndef __NVCC__ +#ifndef __CUDACC__ #include #endif From b6ee8747d877b4c76a76f108135756728ec5c701 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Thu, 13 Oct 2016 17:44:50 -0700 Subject: [PATCH 722/965] Fixing compilation errors with CUDA/nvcc (Windows). --- dynet/model.cc | 2 ++ dynet/nodes-conv.cc | 1 + dynet/training.cc | 2 ++ 3 files changed, 5 insertions(+) diff --git a/dynet/model.cc b/dynet/model.cc index bc2d71b6c..b6ab7e6ca 100644 --- a/dynet/model.cc +++ b/dynet/model.cc @@ -598,5 +598,7 @@ float Model::gradient_l2_norm_dev(MyDevice & dev) const { } // namespace dynet +#ifndef __CUDACC__ BOOST_CLASS_EXPORT_IMPLEMENT(dynet::ParameterStorage) BOOST_CLASS_EXPORT_IMPLEMENT(dynet::LookupParameterStorage) +#endif diff --git a/dynet/nodes-conv.cc b/dynet/nodes-conv.cc index 4990d13bc..492f27995 100644 --- a/dynet/nodes-conv.cc +++ b/dynet/nodes-conv.cc @@ -4,6 +4,7 @@ #include #include #include +#include #include "dynet/functors.h" #include "dynet/nodes-macros.h" diff --git a/dynet/training.cc b/dynet/training.cc index 24d2a5b9e..0f2e92268 100644 --- a/dynet/training.cc +++ b/dynet/training.cc @@ -343,9 +343,11 @@ DYNET_SERIALIZE_IMPL(AdamTrainer) } // namespace dynet +#ifndef __CUDACC__ BOOST_CLASS_EXPORT_IMPLEMENT(dynet::SimpleSGDTrainer) BOOST_CLASS_EXPORT_IMPLEMENT(dynet::MomentumSGDTrainer) BOOST_CLASS_EXPORT_IMPLEMENT(dynet::AdagradTrainer) BOOST_CLASS_EXPORT_IMPLEMENT(dynet::AdadeltaTrainer) BOOST_CLASS_EXPORT_IMPLEMENT(dynet::RmsPropTrainer) BOOST_CLASS_EXPORT_IMPLEMENT(dynet::AdamTrainer) +#endif From f2dbc8fd684508382717489e27017e7daf3261c4 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Thu, 13 Oct 2016 18:15:55 -0700 Subject: [PATCH 723/965] Added instructions for new MKL and Windows-CUDA support --- doc/install.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/doc/install.md b/doc/install.md index 48af50e56..ac8e5269f 100644 --- a/doc/install.md +++ b/doc/install.md @@ -99,4 +99,26 @@ To generate the MSVC solution and project files, run [cmake](http://www.cmake.or cd build cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64" -This will generate dynet.sln and a bunch of \*.vcxproj files (one for the DYNET library, and one per example). You should be able to just open dynet.sln and build all. **Note: multi-process functionality is currently not supported in Windows, so you will not be able to build rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to this project** +This will generate dynet.sln and a bunch of \*.vcxproj files (one for the DYNET library, and one per example). You should be able to just open dynet.sln and build all. **Note: multi-process functionality is currently not supported in Windows, so you will not be able to build rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to this project**. + +The Windows build also supports CUDA. The latest (development) version of Eigen has some code that causes problems with the CUDA compiler. These issue change as Eigen is developed. Currently, the following three changes are needed in Eigen when compiling with CUDA support: + +- block.h: add `#ifndef __CUDACC__` / `#endif` around `EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Block)` +- ref.h: add `#ifndef __CUDACC__ / #endif` around `EIGEN_INHERIT_ASSIGNMENT_OPERATORS(RefBase)` +- TensorRandom.h: Change `uint` to `unsigned int` and `SYSTEMTIME st` to immediately above `GetSystemTime(&st)` +- TensorDeviceCuda.h: Change `sleep(1)` to `Sleep(1000)` + +### MKL support + +DyNet can leverage Intel's MKL library to speed up computation on the CPU. As an example, we've seen 3x speedup in seq2seq training when using MKL. To use MKL, include the following cmake option: + + -DMKL + +If cmake is unable to find MKL automatically, try setting `MKL_ROOT`, such as + + -DMKL_ROOT="/path/to/MKL" + +If either MKL or MKL_ROOT are set, CMake will look for MKL. Note, MKL has only been tested in Windows. + + + From 72862800f99ec8449872fe7c40851d7d677572fd Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 14 Oct 2016 12:23:07 -0400 Subject: [PATCH 724/965] Reduced overhead in batch dispatch code --- dynet/dynet.cc | 56 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/dynet/dynet.cc b/dynet/dynet.cc index 7e2af2973..5b37d3fbe 100644 --- a/dynet/dynet.cc +++ b/dynet/dynet.cc @@ -26,12 +26,21 @@ void Node::forward(const std::vector& xs, if(this->supports_multibatch() || fx.d.batch_elems() == 1) { forward_impl(xs, fx); } else { - for(unsigned b = 0; b < fx.d.batch_elems(); ++b) { - std::vector xs_elems; - std::vector xs_ptrs; - for(size_t i = 0; i < xs.size(); ++i) xs_elems.push_back(xs[i]->batch_elem(b)); - for(size_t i = 0; i < xs.size(); ++i) xs_ptrs.push_back(&xs_elems[i]); - Tensor fx_elem(fx.batch_elem(b)); + size_t i; + std::vector xs_elems(xs.size()); + std::vector xs_ptrs(xs.size()); + std::vector xs_sizes(xs.size()); + for(i = 0; i < xs.size(); ++i) { + xs_elems[i] = xs[i]->batch_elem(0); + xs_ptrs[i] = &xs_elems[i]; + xs_sizes[i] = xs_elems[i].d.size(); + } + Tensor fx_elem(fx.batch_elem(0)); + size_t fx_size = fx_elem.d.size(); + forward_impl(xs_ptrs, fx_elem); + for(unsigned b = 1; b < fx.d.batch_elems(); ++b) { + for(i = 0; i < xs.size(); ++i) xs_elems[i].v += xs_sizes[i]; + fx_elem.v += fx_size; forward_impl(xs_ptrs, fx_elem); } } @@ -39,20 +48,33 @@ void Node::forward(const std::vector& xs, void Node::backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, - unsigned i, + unsigned xs_i, Tensor& dEdxi) const { if(this->supports_multibatch() || fx.d.batch_elems() == 1) { - backward_impl(xs, fx, dEdf, i, dEdxi); + backward_impl(xs, fx, dEdf, xs_i, dEdxi); } else { - for(unsigned b = 0; b < fx.d.batch_elems(); ++b) { - std::vector xs_elems; - std::vector xs_ptrs; - for(size_t i = 0; i < xs.size(); ++i) xs_elems.push_back(xs[i]->batch_elem(b)); - for(size_t i = 0; i < xs.size(); ++i) xs_ptrs.push_back(&xs_elems[i]); - Tensor fx_elem(fx.batch_elem(b)); - Tensor dEdf_elem(dEdf.batch_elem(b)); - Tensor dEdxi_elem(dEdxi.batch_elem(b)); - backward_impl(xs_ptrs, fx_elem, dEdf_elem, i, dEdxi_elem); + size_t i; + std::vector xs_elems(xs.size()); + std::vector xs_ptrs(xs.size()); + std::vector xs_sizes(xs.size()); + for(i = 0; i < xs.size(); ++i) { + xs_elems[i] = xs[i]->batch_elem(0); + xs_ptrs[i] = &xs_elems[i]; + xs_sizes[i] = xs_elems[i].d.size(); + } + Tensor fx_elem(fx.batch_elem(0)); + size_t fx_size = fx_elem.d.size(); + Tensor dEdf_elem(dEdf.batch_elem(0)); + size_t dEdf_size = dEdf_elem.d.size(); + Tensor dEdxi_elem(dEdxi.batch_elem(0)); + size_t dEdxi_size = dEdxi_elem.d.size(); + backward_impl(xs_ptrs, fx_elem, dEdf_elem, xs_i, dEdxi_elem); + for(unsigned b = 1; b < fx.d.batch_elems(); ++b) { + for(i = 0; i < xs.size(); ++i) xs_elems[i].v += xs_sizes[i]; + fx_elem.v += fx_size; + dEdf_elem.v += dEdf_size; + dEdxi_elem.v += dEdxi_size; + backward_impl(xs_ptrs, fx_elem, dEdf_elem, xs_i, dEdxi_elem); } } } From 9f40394c21de1ce3005836a975895739286fbb2a Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 14 Oct 2016 12:31:28 -0400 Subject: [PATCH 725/965] Fixed compile error on Linux w/ CUDA --- dynet/CMakeLists.txt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/dynet/CMakeLists.txt b/dynet/CMakeLists.txt index 4bc69b2b5..372f7ec3b 100644 --- a/dynet/CMakeLists.txt +++ b/dynet/CMakeLists.txt @@ -117,14 +117,15 @@ if(WITH_CUDA_BACKEND) # If MSVC, we need the C99 math flag as in other compilations, and we need the boost flag because nvcc doesn't # properly parse part of the boost template definitions list(APPEND CUDA_NVCC_FLAGS "-DEIGEN_HAS_C99_MATH;-DBOOST_NO_CXX11_ALLOCATOR") - list(APPEND CUDA_NVCC_FLAGS_DEBUG "--compiler-options \"/MDd\"") + list(APPEND CUDA_NVCC_FLAGS_DEBUG "--compiler-options \"/MDd\"") list(APPEND CUDA_NVCC_FLAGS_RELEASE "--compiler-options \"/MD\"") + SET(CUDA_PROPAGATE_HOST_FLAGS OFF) + cuda_add_library(dynetcuda gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu) else() - list(APPEND CUDA_NVCC_FLAGS "--compiler-optons \"-fPIC\"") + SET(CUDA_PROPAGATE_HOST_FLAGS OFF) + cuda_add_library(dynetcuda gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu OPTIONS --compiler-options "-fPIC") endif() - - SET(CUDA_PROPAGATE_HOST_FLAGS OFF) - cuda_add_library(dynetcuda gpu-ops.cu gpu-nodes.cu gpu-nodes-contract.cu gpu-nodes-conv.cu gpu-param-nodes.cu gpu-training.cu gpu-model.cu) + endif(WITH_CUDA_BACKEND) install(FILES ${dynet_library_HDRS} DESTINATION include/dynet) From ccb264d406be60af7f3e63c6797937fcbf763ec2 Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 14 Oct 2016 13:18:56 -0400 Subject: [PATCH 726/965] First shot at documentation using doxygen + breathe + sphinx --- doc/Makefile | 177 + doc/build/doctrees/builders.doctree | Bin 0 -> 2891 bytes doc/build/doctrees/commandline.doctree | Bin 0 -> 7906 bytes doc/build/doctrees/environment.pickle | Bin 0 -> 16199 bytes doc/build/doctrees/index.doctree | Bin 0 -> 6136 bytes doc/build/doctrees/install.doctree | Bin 0 -> 21271 bytes doc/build/doctrees/minibatch.doctree | Bin 0 -> 2640 bytes doc/build/doctrees/multiprocessing.doctree | Bin 0 -> 2784 bytes doc/build/doctrees/operations.doctree | Bin 0 -> 2799 bytes doc/build/doctrees/optimizers.doctree | Bin 0 -> 6199 bytes doc/build/doctrees/python.doctree | Bin 0 -> 35157 bytes doc/build/doctrees/tutorial.doctree | Bin 0 -> 28576 bytes doc/build/html/.buildinfo | 4 + doc/build/html/_sources/builders.txt | 7 + doc/build/html/_sources/commandline.txt | 23 + doc/build/html/_sources/index.txt | 37 + doc/build/html/_sources/install.txt | 156 + doc/build/html/_sources/minibatch.txt | 4 + doc/build/html/_sources/multiprocessing.txt | 6 + doc/build/html/_sources/operations.txt | 6 + doc/build/html/_sources/optimizers.txt | 8 + doc/build/html/_sources/python.txt | 189 + doc/build/html/_sources/tutorial.txt | 51 + doc/build/html/_static/ajax-loader.gif | Bin 0 -> 673 bytes doc/build/html/_static/basic.css | 537 + doc/build/html/_static/comment-bright.png | Bin 0 -> 3500 bytes doc/build/html/_static/comment-close.png | Bin 0 -> 3578 bytes doc/build/html/_static/comment.png | Bin 0 -> 3445 bytes doc/build/html/_static/default.css | 256 + doc/build/html/_static/doctools.js | 238 + doc/build/html/_static/down-pressed.png | Bin 0 -> 368 bytes doc/build/html/_static/down.png | Bin 0 -> 363 bytes doc/build/html/_static/file.png | Bin 0 -> 392 bytes doc/build/html/_static/jquery.js | 9404 +++++++++++++++++ doc/build/html/_static/minus.png | Bin 0 -> 199 bytes doc/build/html/_static/plus.png | Bin 0 -> 199 bytes doc/build/html/_static/pygments.css | 65 + doc/build/html/_static/searchtools.js | 622 ++ doc/build/html/_static/sidebar.js | 159 + doc/build/html/_static/underscore.js | 1415 +++ doc/build/html/_static/up-pressed.png | Bin 0 -> 372 bytes doc/build/html/_static/up.png | Bin 0 -> 363 bytes doc/build/html/_static/websupport.js | 808 ++ doc/build/html/builders.html | 114 + doc/build/html/commandline.html | 132 + doc/build/html/genindex.html | 110 + doc/build/html/index.html | 149 + doc/build/html/install.html | 249 + doc/build/html/minibatch.html | 112 + doc/build/html/multiprocessing.html | 103 + doc/build/html/objects.inv | 8 + doc/build/html/operations.html | 113 + doc/build/html/optimizers.html | 124 + doc/build/html/python.html | 272 + doc/build/html/search.html | 100 + doc/build/html/searchindex.js | 1 + doc/build/html/tutorial.html | 157 + doc/build/text/builders.txt | 8 + doc/build/text/commandline.txt | 27 + doc/build/text/index.txt | 55 + doc/build/text/install.txt | 141 + doc/build/text/minibatch.txt | 5 + doc/build/text/multiprocessing.txt | 7 + doc/build/text/operations.txt | 7 + doc/build/text/optimizers.txt | 13 + doc/build/text/python.txt | 172 + doc/build/text/tutorial.txt | 50 + doc/build_doc.sh | 7 + doc/doxygen/config | 2384 +++++ doc/doxygen/html/annotated.html | 111 + doc/doxygen/html/arrowdown.png | Bin 0 -> 246 bytes doc/doxygen/html/arrowright.png | Bin 0 -> 229 bytes doc/doxygen/html/bc_s.png | Bin 0 -> 676 bytes doc/doxygen/html/bdwn.png | Bin 0 -> 147 bytes doc/doxygen/html/classes.html | 114 + doc/doxygen/html/closed.png | Bin 0 -> 132 bytes .../dir_2997b6d9ddf8b2f83e82c6988822a05f.html | 109 + ...r_2997b6d9ddf8b2f83e82c6988822a05f_dep.map | 3 + ...r_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 | 1 + ...r_2997b6d9ddf8b2f83e82c6988822a05f_dep.png | Bin 0 -> 1087 bytes doc/doxygen/html/doc.png | Bin 0 -> 746 bytes doc/doxygen/html/doxygen.css | 1449 +++ doc/doxygen/html/doxygen.png | Bin 0 -> 3779 bytes doc/doxygen/html/dynsections.js | 97 + doc/doxygen/html/expr_8h_source.html | 287 + doc/doxygen/html/files.html | 102 + doc/doxygen/html/folderclosed.png | Bin 0 -> 616 bytes doc/doxygen/html/folderopen.png | Bin 0 -> 597 bytes doc/doxygen/html/functions.html | 105 + doc/doxygen/html/functions_func.html | 105 + doc/doxygen/html/graph_legend.html | 153 + doc/doxygen/html/graph_legend.md5 | 1 + doc/doxygen/html/graph_legend.png | Bin 0 -> 18538 bytes doc/doxygen/html/hierarchy.html | 111 + doc/doxygen/html/index.html | 90 + doc/doxygen/html/inherit_graph_0.map | 3 + doc/doxygen/html/inherit_graph_0.md5 | 1 + doc/doxygen/html/inherit_graph_0.png | Bin 0 -> 1853 bytes doc/doxygen/html/inherit_graph_1.map | 9 + doc/doxygen/html/inherit_graph_1.md5 | 1 + doc/doxygen/html/inherit_graph_1.png | Bin 0 -> 22543 bytes doc/doxygen/html/inherits.html | 109 + doc/doxygen/html/jquery.js | 68 + doc/doxygen/html/nav_f.png | Bin 0 -> 153 bytes doc/doxygen/html/nav_g.png | Bin 0 -> 95 bytes doc/doxygen/html/nav_h.png | Bin 0 -> 98 bytes doc/doxygen/html/open.png | Bin 0 -> 123 bytes doc/doxygen/html/search/all_0.html | 26 + doc/doxygen/html/search/all_0.js | 6 + doc/doxygen/html/search/all_1.html | 26 + doc/doxygen/html/search/all_1.js | 4 + doc/doxygen/html/search/all_2.html | 26 + doc/doxygen/html/search/all_2.js | 4 + doc/doxygen/html/search/all_3.html | 26 + doc/doxygen/html/search/all_3.js | 4 + doc/doxygen/html/search/all_4.html | 26 + doc/doxygen/html/search/all_4.js | 4 + doc/doxygen/html/search/all_5.html | 26 + doc/doxygen/html/search/all_5.js | 4 + doc/doxygen/html/search/all_6.html | 26 + doc/doxygen/html/search/all_6.js | 4 + doc/doxygen/html/search/classes_0.html | 26 + doc/doxygen/html/search/classes_0.js | 6 + doc/doxygen/html/search/classes_1.html | 26 + doc/doxygen/html/search/classes_1.js | 4 + doc/doxygen/html/search/classes_2.html | 26 + doc/doxygen/html/search/classes_2.js | 4 + doc/doxygen/html/search/classes_3.html | 26 + doc/doxygen/html/search/classes_3.js | 4 + doc/doxygen/html/search/classes_4.html | 26 + doc/doxygen/html/search/classes_4.js | 4 + doc/doxygen/html/search/classes_5.html | 26 + doc/doxygen/html/search/classes_5.js | 4 + doc/doxygen/html/search/close.png | Bin 0 -> 273 bytes doc/doxygen/html/search/functions_0.html | 26 + doc/doxygen/html/search/functions_0.js | 4 + doc/doxygen/html/search/mag_sel.png | Bin 0 -> 563 bytes doc/doxygen/html/search/nomatches.html | 12 + doc/doxygen/html/search/search.css | 271 + doc/doxygen/html/search/search.js | 791 ++ doc/doxygen/html/search/search_l.png | Bin 0 -> 604 bytes doc/doxygen/html/search/search_m.png | Bin 0 -> 158 bytes doc/doxygen/html/search/search_r.png | Bin 0 -> 612 bytes doc/doxygen/html/search/searchdata.js | 18 + doc/doxygen/html/splitbar.png | Bin 0 -> 314 bytes ...tructdynet_1_1AdadeltaTrainer-members.html | 134 + .../html/structdynet_1_1AdadeltaTrainer.html | 227 + ...tdynet_1_1AdadeltaTrainer__coll__graph.map | 3 + ...tdynet_1_1AdadeltaTrainer__coll__graph.md5 | 1 + ...tdynet_1_1AdadeltaTrainer__coll__graph.png | Bin 0 -> 3093 bytes ...net_1_1AdadeltaTrainer__inherit__graph.map | 3 + ...net_1_1AdadeltaTrainer__inherit__graph.md5 | 1 + ...net_1_1AdadeltaTrainer__inherit__graph.png | Bin 0 -> 3093 bytes ...structdynet_1_1AdagradTrainer-members.html | 131 + .../html/structdynet_1_1AdagradTrainer.html | 218 + ...ctdynet_1_1AdagradTrainer__coll__graph.map | 3 + ...ctdynet_1_1AdagradTrainer__coll__graph.md5 | 1 + ...ctdynet_1_1AdagradTrainer__coll__graph.png | Bin 0 -> 3343 bytes ...ynet_1_1AdagradTrainer__inherit__graph.map | 3 + ...ynet_1_1AdagradTrainer__inherit__graph.md5 | 1 + ...ynet_1_1AdagradTrainer__inherit__graph.png | Bin 0 -> 3343 bytes .../structdynet_1_1AdamTrainer-members.html | 135 + .../html/structdynet_1_1AdamTrainer.html | 230 + ...tructdynet_1_1AdamTrainer__coll__graph.map | 3 + ...tructdynet_1_1AdamTrainer__coll__graph.md5 | 1 + ...tructdynet_1_1AdamTrainer__coll__graph.png | Bin 0 -> 3496 bytes ...ctdynet_1_1AdamTrainer__inherit__graph.map | 3 + ...ctdynet_1_1AdamTrainer__inherit__graph.md5 | 1 + ...ctdynet_1_1AdamTrainer__inherit__graph.png | Bin 0 -> 3496 bytes ...ctdynet_1_1MomentumSGDTrainer-members.html | 131 + .../structdynet_1_1MomentumSGDTrainer.html | 218 + ...net_1_1MomentumSGDTrainer__coll__graph.map | 3 + ...net_1_1MomentumSGDTrainer__coll__graph.md5 | 1 + ...net_1_1MomentumSGDTrainer__coll__graph.png | Bin 0 -> 4453 bytes ..._1_1MomentumSGDTrainer__inherit__graph.map | 3 + ..._1_1MomentumSGDTrainer__inherit__graph.md5 | 1 + ..._1_1MomentumSGDTrainer__inherit__graph.png | Bin 0 -> 4453 bytes ...structdynet_1_1RmsPropTrainer-members.html | 132 + .../html/structdynet_1_1RmsPropTrainer.html | 221 + ...ctdynet_1_1RmsPropTrainer__coll__graph.map | 3 + ...ctdynet_1_1RmsPropTrainer__coll__graph.md5 | 1 + ...ctdynet_1_1RmsPropTrainer__coll__graph.png | Bin 0 -> 3625 bytes ...ynet_1_1RmsPropTrainer__inherit__graph.map | 3 + ...ynet_1_1RmsPropTrainer__inherit__graph.md5 | 1 + ...ynet_1_1RmsPropTrainer__inherit__graph.png | Bin 0 -> 3625 bytes ...ructdynet_1_1SimpleSGDTrainer-members.html | 128 + .../html/structdynet_1_1SimpleSGDTrainer.html | 201 + ...dynet_1_1SimpleSGDTrainer__coll__graph.map | 3 + ...dynet_1_1SimpleSGDTrainer__coll__graph.md5 | 1 + ...dynet_1_1SimpleSGDTrainer__coll__graph.png | Bin 0 -> 3804 bytes ...et_1_1SimpleSGDTrainer__inherit__graph.map | 3 + ...et_1_1SimpleSGDTrainer__inherit__graph.md5 | 1 + ...et_1_1SimpleSGDTrainer__inherit__graph.png | Bin 0 -> 3804 bytes .../html/structdynet_1_1Trainer-members.html | 127 + doc/doxygen/html/structdynet_1_1Trainer.html | 193 + ...structdynet_1_1Trainer__inherit__graph.map | 8 + ...structdynet_1_1Trainer__inherit__graph.md5 | 1 + ...structdynet_1_1Trainer__inherit__graph.png | Bin 0 -> 22599 bytes ...ctdynet_1_1expr_1_1Expression-members.html | 109 + .../structdynet_1_1expr_1_1Expression.html | 127 + doc/doxygen/html/sync_off.png | Bin 0 -> 853 bytes doc/doxygen/html/sync_on.png | Bin 0 -> 845 bytes doc/doxygen/html/tab_a.png | Bin 0 -> 142 bytes doc/doxygen/html/tab_b.png | Bin 0 -> 169 bytes doc/doxygen/html/tab_h.png | Bin 0 -> 177 bytes doc/doxygen/html/tab_s.png | Bin 0 -> 184 bytes doc/doxygen/html/tabs.css | 60 + doc/doxygen/html/training_8h_source.html | 301 + doc/doxygen/latex/Makefile | 21 + doc/doxygen/latex/annotated.tex | 11 + .../dir_2997b6d9ddf8b2f83e82c6988822a05f.tex | 16 + ...r_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 | 1 + ...r_2997b6d9ddf8b2f83e82c6988822a05f_dep.pdf | Bin 0 -> 10418 bytes doc/doxygen/latex/doxygen.sty | 480 + doc/doxygen/latex/hierarchy.tex | 13 + doc/doxygen/latex/refman.tex | 164 + .../latex/structdynet_1_1AdadeltaTrainer.tex | 65 + ...tdynet_1_1AdadeltaTrainer__coll__graph.md5 | 1 + ...tdynet_1_1AdadeltaTrainer__coll__graph.pdf | Bin 0 -> 11677 bytes ...net_1_1AdadeltaTrainer__inherit__graph.md5 | 1 + ...net_1_1AdadeltaTrainer__inherit__graph.pdf | Bin 0 -> 11677 bytes .../latex/structdynet_1_1AdagradTrainer.tex | 56 + ...ctdynet_1_1AdagradTrainer__coll__graph.md5 | 1 + ...ctdynet_1_1AdagradTrainer__coll__graph.pdf | Bin 0 -> 11929 bytes ...ynet_1_1AdagradTrainer__inherit__graph.md5 | 1 + ...ynet_1_1AdagradTrainer__inherit__graph.pdf | Bin 0 -> 11929 bytes .../latex/structdynet_1_1AdamTrainer.tex | 68 + ...tructdynet_1_1AdamTrainer__coll__graph.md5 | 1 + ...tructdynet_1_1AdamTrainer__coll__graph.pdf | Bin 0 -> 11791 bytes ...ctdynet_1_1AdamTrainer__inherit__graph.md5 | 1 + ...ctdynet_1_1AdamTrainer__inherit__graph.pdf | Bin 0 -> 11791 bytes .../structdynet_1_1MomentumSGDTrainer.tex | 56 + ...net_1_1MomentumSGDTrainer__coll__graph.md5 | 1 + ...net_1_1MomentumSGDTrainer__coll__graph.pdf | Bin 0 -> 12827 bytes ..._1_1MomentumSGDTrainer__inherit__graph.md5 | 1 + ..._1_1MomentumSGDTrainer__inherit__graph.pdf | Bin 0 -> 12827 bytes .../latex/structdynet_1_1RmsPropTrainer.tex | 59 + ...ctdynet_1_1RmsPropTrainer__coll__graph.md5 | 1 + ...ctdynet_1_1RmsPropTrainer__coll__graph.pdf | Bin 0 -> 12731 bytes ...ynet_1_1RmsPropTrainer__inherit__graph.md5 | 1 + ...ynet_1_1RmsPropTrainer__inherit__graph.pdf | Bin 0 -> 12731 bytes .../latex/structdynet_1_1SimpleSGDTrainer.tex | 38 + ...dynet_1_1SimpleSGDTrainer__coll__graph.md5 | 1 + ...dynet_1_1SimpleSGDTrainer__coll__graph.pdf | Bin 0 -> 12710 bytes ...et_1_1SimpleSGDTrainer__inherit__graph.md5 | 1 + ...et_1_1SimpleSGDTrainer__inherit__graph.pdf | Bin 0 -> 12710 bytes doc/doxygen/latex/structdynet_1_1Trainer.tex | 91 + ...structdynet_1_1Trainer__inherit__graph.md5 | 1 + ...structdynet_1_1Trainer__inherit__graph.pdf | Bin 0 -> 14861 bytes .../structdynet_1_1expr_1_1Expression.tex | 25 + doc/doxygen/xml/combine.xslt | 15 + doc/doxygen/xml/compound.xsd | 1113 ++ .../dir_2997b6d9ddf8b2f83e82c6988822a05f.xml | 13 + doc/doxygen/xml/expr_8h.xml | 227 + doc/doxygen/xml/index.xml | 227 + doc/doxygen/xml/index.xsd | 66 + doc/doxygen/xml/namespacedynet.xml | 19 + doc/doxygen/xml/namespacedynet_1_1expr.xml | 2379 +++++ .../xml/namespacedynet_1_1expr_1_1detail.xml | 38 + .../xml/structdynet_1_1AdadeltaTrainer.xml | 251 + .../xml/structdynet_1_1AdagradTrainer.xml | 209 + .../xml/structdynet_1_1AdamTrainer.xml | 275 + .../xml/structdynet_1_1MomentumSGDTrainer.xml | 209 + .../xml/structdynet_1_1RmsPropTrainer.xml | 228 + .../xml/structdynet_1_1SimpleSGDTrainer.xml | 144 + doc/doxygen/xml/structdynet_1_1Trainer.xml | 483 + .../xml/structdynet_1_1expr_1_1Expression.xml | 95 + doc/doxygen/xml/training_8h.xml | 263 + doc/install.md | 24 +- doc/make.bat | 242 + doc/source/builders.rst | 7 + doc/source/commandline.rst | 23 + doc/source/conf.py | 263 + doc/source/index.rst | 37 + doc/source/install.rst | 156 + doc/source/minibatch.rst | 4 + doc/source/multiprocessing.rst | 6 + doc/source/operations.rst | 6 + doc/source/optimizers.rst | 8 + doc/source/python.rst | 189 + doc/source/tutorial.rst | 51 + 281 files changed, 34841 insertions(+), 23 deletions(-) create mode 100644 doc/Makefile create mode 100644 doc/build/doctrees/builders.doctree create mode 100644 doc/build/doctrees/commandline.doctree create mode 100644 doc/build/doctrees/environment.pickle create mode 100644 doc/build/doctrees/index.doctree create mode 100644 doc/build/doctrees/install.doctree create mode 100644 doc/build/doctrees/minibatch.doctree create mode 100644 doc/build/doctrees/multiprocessing.doctree create mode 100644 doc/build/doctrees/operations.doctree create mode 100644 doc/build/doctrees/optimizers.doctree create mode 100644 doc/build/doctrees/python.doctree create mode 100644 doc/build/doctrees/tutorial.doctree create mode 100644 doc/build/html/.buildinfo create mode 100644 doc/build/html/_sources/builders.txt create mode 100644 doc/build/html/_sources/commandline.txt create mode 100644 doc/build/html/_sources/index.txt create mode 100644 doc/build/html/_sources/install.txt create mode 100644 doc/build/html/_sources/minibatch.txt create mode 100644 doc/build/html/_sources/multiprocessing.txt create mode 100644 doc/build/html/_sources/operations.txt create mode 100644 doc/build/html/_sources/optimizers.txt create mode 100644 doc/build/html/_sources/python.txt create mode 100644 doc/build/html/_sources/tutorial.txt create mode 100644 doc/build/html/_static/ajax-loader.gif create mode 100644 doc/build/html/_static/basic.css create mode 100644 doc/build/html/_static/comment-bright.png create mode 100644 doc/build/html/_static/comment-close.png create mode 100644 doc/build/html/_static/comment.png create mode 100644 doc/build/html/_static/default.css create mode 100644 doc/build/html/_static/doctools.js create mode 100644 doc/build/html/_static/down-pressed.png create mode 100644 doc/build/html/_static/down.png create mode 100644 doc/build/html/_static/file.png create mode 100644 doc/build/html/_static/jquery.js create mode 100644 doc/build/html/_static/minus.png create mode 100644 doc/build/html/_static/plus.png create mode 100644 doc/build/html/_static/pygments.css create mode 100644 doc/build/html/_static/searchtools.js create mode 100644 doc/build/html/_static/sidebar.js create mode 100644 doc/build/html/_static/underscore.js create mode 100644 doc/build/html/_static/up-pressed.png create mode 100644 doc/build/html/_static/up.png create mode 100644 doc/build/html/_static/websupport.js create mode 100644 doc/build/html/builders.html create mode 100644 doc/build/html/commandline.html create mode 100644 doc/build/html/genindex.html create mode 100644 doc/build/html/index.html create mode 100644 doc/build/html/install.html create mode 100644 doc/build/html/minibatch.html create mode 100644 doc/build/html/multiprocessing.html create mode 100644 doc/build/html/objects.inv create mode 100644 doc/build/html/operations.html create mode 100644 doc/build/html/optimizers.html create mode 100644 doc/build/html/python.html create mode 100644 doc/build/html/search.html create mode 100644 doc/build/html/searchindex.js create mode 100644 doc/build/html/tutorial.html create mode 100644 doc/build/text/builders.txt create mode 100644 doc/build/text/commandline.txt create mode 100644 doc/build/text/index.txt create mode 100644 doc/build/text/install.txt create mode 100644 doc/build/text/minibatch.txt create mode 100644 doc/build/text/multiprocessing.txt create mode 100644 doc/build/text/operations.txt create mode 100644 doc/build/text/optimizers.txt create mode 100644 doc/build/text/python.txt create mode 100644 doc/build/text/tutorial.txt create mode 100644 doc/build_doc.sh create mode 100644 doc/doxygen/config create mode 100644 doc/doxygen/html/annotated.html create mode 100644 doc/doxygen/html/arrowdown.png create mode 100644 doc/doxygen/html/arrowright.png create mode 100644 doc/doxygen/html/bc_s.png create mode 100644 doc/doxygen/html/bdwn.png create mode 100644 doc/doxygen/html/classes.html create mode 100644 doc/doxygen/html/closed.png create mode 100644 doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f.html create mode 100644 doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.map create mode 100644 doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 create mode 100644 doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.png create mode 100644 doc/doxygen/html/doc.png create mode 100644 doc/doxygen/html/doxygen.css create mode 100644 doc/doxygen/html/doxygen.png create mode 100644 doc/doxygen/html/dynsections.js create mode 100644 doc/doxygen/html/expr_8h_source.html create mode 100644 doc/doxygen/html/files.html create mode 100644 doc/doxygen/html/folderclosed.png create mode 100644 doc/doxygen/html/folderopen.png create mode 100644 doc/doxygen/html/functions.html create mode 100644 doc/doxygen/html/functions_func.html create mode 100644 doc/doxygen/html/graph_legend.html create mode 100644 doc/doxygen/html/graph_legend.md5 create mode 100644 doc/doxygen/html/graph_legend.png create mode 100644 doc/doxygen/html/hierarchy.html create mode 100644 doc/doxygen/html/index.html create mode 100644 doc/doxygen/html/inherit_graph_0.map create mode 100644 doc/doxygen/html/inherit_graph_0.md5 create mode 100644 doc/doxygen/html/inherit_graph_0.png create mode 100644 doc/doxygen/html/inherit_graph_1.map create mode 100644 doc/doxygen/html/inherit_graph_1.md5 create mode 100644 doc/doxygen/html/inherit_graph_1.png create mode 100644 doc/doxygen/html/inherits.html create mode 100644 doc/doxygen/html/jquery.js create mode 100644 doc/doxygen/html/nav_f.png create mode 100644 doc/doxygen/html/nav_g.png create mode 100644 doc/doxygen/html/nav_h.png create mode 100644 doc/doxygen/html/open.png create mode 100644 doc/doxygen/html/search/all_0.html create mode 100644 doc/doxygen/html/search/all_0.js create mode 100644 doc/doxygen/html/search/all_1.html create mode 100644 doc/doxygen/html/search/all_1.js create mode 100644 doc/doxygen/html/search/all_2.html create mode 100644 doc/doxygen/html/search/all_2.js create mode 100644 doc/doxygen/html/search/all_3.html create mode 100644 doc/doxygen/html/search/all_3.js create mode 100644 doc/doxygen/html/search/all_4.html create mode 100644 doc/doxygen/html/search/all_4.js create mode 100644 doc/doxygen/html/search/all_5.html create mode 100644 doc/doxygen/html/search/all_5.js create mode 100644 doc/doxygen/html/search/all_6.html create mode 100644 doc/doxygen/html/search/all_6.js create mode 100644 doc/doxygen/html/search/classes_0.html create mode 100644 doc/doxygen/html/search/classes_0.js create mode 100644 doc/doxygen/html/search/classes_1.html create mode 100644 doc/doxygen/html/search/classes_1.js create mode 100644 doc/doxygen/html/search/classes_2.html create mode 100644 doc/doxygen/html/search/classes_2.js create mode 100644 doc/doxygen/html/search/classes_3.html create mode 100644 doc/doxygen/html/search/classes_3.js create mode 100644 doc/doxygen/html/search/classes_4.html create mode 100644 doc/doxygen/html/search/classes_4.js create mode 100644 doc/doxygen/html/search/classes_5.html create mode 100644 doc/doxygen/html/search/classes_5.js create mode 100644 doc/doxygen/html/search/close.png create mode 100644 doc/doxygen/html/search/functions_0.html create mode 100644 doc/doxygen/html/search/functions_0.js create mode 100644 doc/doxygen/html/search/mag_sel.png create mode 100644 doc/doxygen/html/search/nomatches.html create mode 100644 doc/doxygen/html/search/search.css create mode 100644 doc/doxygen/html/search/search.js create mode 100644 doc/doxygen/html/search/search_l.png create mode 100644 doc/doxygen/html/search/search_m.png create mode 100644 doc/doxygen/html/search/search_r.png create mode 100644 doc/doxygen/html/search/searchdata.js create mode 100644 doc/doxygen/html/splitbar.png create mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer-members.html create mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer.html create mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer__coll__graph.map create mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer__coll__graph.md5 create mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer__coll__graph.png create mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer__inherit__graph.map create mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer__inherit__graph.md5 create mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer__inherit__graph.png create mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer-members.html create mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer.html create mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer__coll__graph.map create mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer__coll__graph.md5 create mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer__coll__graph.png create mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer__inherit__graph.map create mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer__inherit__graph.md5 create mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer__inherit__graph.png create mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer-members.html create mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer.html create mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer__coll__graph.map create mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer__coll__graph.md5 create mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer__coll__graph.png create mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer__inherit__graph.map create mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer__inherit__graph.md5 create mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer__inherit__graph.png create mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer-members.html create mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer.html create mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__coll__graph.map create mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__coll__graph.md5 create mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__coll__graph.png create mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.map create mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.md5 create mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.png create mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer-members.html create mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer.html create mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.map create mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.md5 create mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.png create mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.map create mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.md5 create mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.png create mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer-members.html create mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer.html create mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.map create mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 create mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.png create mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.map create mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.md5 create mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.png create mode 100644 doc/doxygen/html/structdynet_1_1Trainer-members.html create mode 100644 doc/doxygen/html/structdynet_1_1Trainer.html create mode 100644 doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.map create mode 100644 doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.md5 create mode 100644 doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.png create mode 100644 doc/doxygen/html/structdynet_1_1expr_1_1Expression-members.html create mode 100644 doc/doxygen/html/structdynet_1_1expr_1_1Expression.html create mode 100644 doc/doxygen/html/sync_off.png create mode 100644 doc/doxygen/html/sync_on.png create mode 100644 doc/doxygen/html/tab_a.png create mode 100644 doc/doxygen/html/tab_b.png create mode 100644 doc/doxygen/html/tab_h.png create mode 100644 doc/doxygen/html/tab_s.png create mode 100644 doc/doxygen/html/tabs.css create mode 100644 doc/doxygen/html/training_8h_source.html create mode 100644 doc/doxygen/latex/Makefile create mode 100644 doc/doxygen/latex/annotated.tex create mode 100644 doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f.tex create mode 100644 doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 create mode 100644 doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.pdf create mode 100644 doc/doxygen/latex/doxygen.sty create mode 100644 doc/doxygen/latex/hierarchy.tex create mode 100644 doc/doxygen/latex/refman.tex create mode 100644 doc/doxygen/latex/structdynet_1_1AdadeltaTrainer.tex create mode 100644 doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__coll__graph.md5 create mode 100644 doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__coll__graph.pdf create mode 100644 doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__inherit__graph.md5 create mode 100644 doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__inherit__graph.pdf create mode 100644 doc/doxygen/latex/structdynet_1_1AdagradTrainer.tex create mode 100644 doc/doxygen/latex/structdynet_1_1AdagradTrainer__coll__graph.md5 create mode 100644 doc/doxygen/latex/structdynet_1_1AdagradTrainer__coll__graph.pdf create mode 100644 doc/doxygen/latex/structdynet_1_1AdagradTrainer__inherit__graph.md5 create mode 100644 doc/doxygen/latex/structdynet_1_1AdagradTrainer__inherit__graph.pdf create mode 100644 doc/doxygen/latex/structdynet_1_1AdamTrainer.tex create mode 100644 doc/doxygen/latex/structdynet_1_1AdamTrainer__coll__graph.md5 create mode 100644 doc/doxygen/latex/structdynet_1_1AdamTrainer__coll__graph.pdf create mode 100644 doc/doxygen/latex/structdynet_1_1AdamTrainer__inherit__graph.md5 create mode 100644 doc/doxygen/latex/structdynet_1_1AdamTrainer__inherit__graph.pdf create mode 100644 doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer.tex create mode 100644 doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__coll__graph.md5 create mode 100644 doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__coll__graph.pdf create mode 100644 doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__inherit__graph.md5 create mode 100644 doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__inherit__graph.pdf create mode 100644 doc/doxygen/latex/structdynet_1_1RmsPropTrainer.tex create mode 100644 doc/doxygen/latex/structdynet_1_1RmsPropTrainer__coll__graph.md5 create mode 100644 doc/doxygen/latex/structdynet_1_1RmsPropTrainer__coll__graph.pdf create mode 100644 doc/doxygen/latex/structdynet_1_1RmsPropTrainer__inherit__graph.md5 create mode 100644 doc/doxygen/latex/structdynet_1_1RmsPropTrainer__inherit__graph.pdf create mode 100644 doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer.tex create mode 100644 doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 create mode 100644 doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__coll__graph.pdf create mode 100644 doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__inherit__graph.md5 create mode 100644 doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__inherit__graph.pdf create mode 100644 doc/doxygen/latex/structdynet_1_1Trainer.tex create mode 100644 doc/doxygen/latex/structdynet_1_1Trainer__inherit__graph.md5 create mode 100644 doc/doxygen/latex/structdynet_1_1Trainer__inherit__graph.pdf create mode 100644 doc/doxygen/latex/structdynet_1_1expr_1_1Expression.tex create mode 100644 doc/doxygen/xml/combine.xslt create mode 100644 doc/doxygen/xml/compound.xsd create mode 100644 doc/doxygen/xml/dir_2997b6d9ddf8b2f83e82c6988822a05f.xml create mode 100644 doc/doxygen/xml/expr_8h.xml create mode 100644 doc/doxygen/xml/index.xml create mode 100644 doc/doxygen/xml/index.xsd create mode 100644 doc/doxygen/xml/namespacedynet.xml create mode 100644 doc/doxygen/xml/namespacedynet_1_1expr.xml create mode 100644 doc/doxygen/xml/namespacedynet_1_1expr_1_1detail.xml create mode 100644 doc/doxygen/xml/structdynet_1_1AdadeltaTrainer.xml create mode 100644 doc/doxygen/xml/structdynet_1_1AdagradTrainer.xml create mode 100644 doc/doxygen/xml/structdynet_1_1AdamTrainer.xml create mode 100644 doc/doxygen/xml/structdynet_1_1MomentumSGDTrainer.xml create mode 100644 doc/doxygen/xml/structdynet_1_1RmsPropTrainer.xml create mode 100644 doc/doxygen/xml/structdynet_1_1SimpleSGDTrainer.xml create mode 100644 doc/doxygen/xml/structdynet_1_1Trainer.xml create mode 100644 doc/doxygen/xml/structdynet_1_1expr_1_1Expression.xml create mode 100644 doc/doxygen/xml/training_8h.xml create mode 100644 doc/make.bat create mode 100644 doc/source/builders.rst create mode 100644 doc/source/commandline.rst create mode 100644 doc/source/conf.py create mode 100644 doc/source/index.rst create mode 100644 doc/source/install.rst create mode 100644 doc/source/minibatch.rst create mode 100644 doc/source/multiprocessing.rst create mode 100644 doc/source/operations.rst create mode 100644 doc/source/optimizers.rst create mode 100644 doc/source/python.rst create mode 100644 doc/source/tutorial.rst diff --git a/doc/Makefile b/doc/Makefile new file mode 100644 index 000000000..e0d42bc90 --- /dev/null +++ b/doc/Makefile @@ -0,0 +1,177 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Dynet.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Dynet.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Dynet" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Dynet" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/doc/build/doctrees/builders.doctree b/doc/build/doctrees/builders.doctree new file mode 100644 index 0000000000000000000000000000000000000000..50ddf76e938d777e01441191e5e02d20ccbbabe0 GIT binary patch literal 2891 zcmc&$`Fk8k5mjXC*tI0fj_t%(JRt;Ru(SaT1VcCy6AmS7AgW-FVd$Od-5xwMJ=NW# z0~itmNhI$3zVGvYVB&5uU@@+RWDD+iH<9mW_GR6iL_n+F_(qw z@&i}z@^sC|R;W{mT)Lf7T0UO$%hx$Kpq%6f_1>@}f#;H)=3)tjJLGuH8WnsZ|0 z;qnEVYs2zI>I&yfI;b4TxK#7y6`D_~(x0>ZNJw*WCalHZS3;T}i1?22R0bg(^I1O{ z^6S*HpqcUc$3lL+niUlt&(cEjP+W|}K}O#$%gih3keS3(tp>d{a=7FG&zRU2*XXs`{r z4LSAh7vYIl?($n|ek%YdAMI*25Y^!51E_`=8BwY(zYU15*Zg*mxI#T9Sc6#S0}v26 zJ(5mI6Ko2T>dFSXlw(a5p7nMtqjAlF8AajVSISU8ykPNl`j2DXY-AZ%b{tI$9c zN$}hY8_x$&{FXL%EWhIrF`a#M{7z5KllLR%_=KEysowt)_YKhf?wa4@>GnBXZ|GK@ z)Te5GuP5~aNZq(~^VW^v86&|WXZsrjbI z7Qn~3%i%4PeH;$ zW4t%)(~^bXl@Yqlx1Qw@>gco&F+rnf2H%(+PH8a{#i+uh!1+Y-7ibzjeup{<)QBmN zmz;To4YyGyH)X~-TyFtcVEPneofa4;N@T7*px0+;u?5kZYuQ)V`gBPeqfG>)Isu{4 z_@hG0XQ&&~vWIAKMIm5@EZNXZA_vuoZJ(B9K9IhyJDIdfO2=-GF6+vbmHTgRR+uPY zBX+zANGNSl<K@R#Y7+)gobq3X)E+|=M^HrB;39r0J%T0wA|sZE_W z{1RS{GcE2!G8btUi3EeS8BZ_o(q&|l?>E{()gxPauI}#9FXW=j-S)cI^EYriEe@B6ze%0uO~@6ilxJd4oZr@6_B^8{UbnY z1aLsfk0ExOWBG}=!Xjk(CwsKuOTFKpKcy>ee{OAUt(7}Y>7waRzoFoy?eWjNDHcv_ zM=Bku3_p&4j+H?dBmMR9ELK1?3fNUorQG5=LCpdv)wRbyrvv_ZJ-_ES0 zGg(N0fDHjcD53XWL+`y4dhfmW-rGO3d#6(|@O?mHzR%xhOS;?HH?REvn>X)W-CJ|R zTB1B(jt8O3WkG*z@<0`6+16{QH>KsHY$$M=T(u%D>6n!I_HF6u>2X^DS5_@-Hl4t= zd@tZu7%49dB=wgiTPu^QRGxz9FtA--mo$*lAX^OX)NqZ>T~Awz`(YG4`}& zn8Y&=>`fXZSX6u|ph4nC0L8!Pbl@lvkHMxupXw5uV((07fh<>)ks5O?W zHKx@XYpXRZ*giT(GoWw7=e7a=RD8ZMdY*i`ONGmiROGTU6fN~mId)mSV@}228R&bPx zy=tQ1o8wbDVU!KJNu<|FI0j-3`nA{487Z9!#f08@Yf^QR>Ox@%l+%cvNEGOfu;i?i&eoRPfKW~Nz7@qGo;IbG zNH1tunQ_9I=9XjC`OK2I9=G-iF1giAq_V2KAR}J$>K=D3M_Ed6YnsO`JZN}9poNBY z^KCapig;WPV^9U_<3f(iaXP2VgF_wF=}y{<=Pu>NW7=N4vnU;@Mr}i&?vm17b)d9? zXDu11YU2A`*}f+c{JSAk=cROayuy0Ae6pfz72QL7Wnz@|XJ69xeajHlF%2;QEkj&} zwZXQRb}T}<-p}?FZx(1LHa$P33p74PdwY7OrpCsyG}7cvtIT$7KY!2E)V3TXaS}+Y z+Om++Kz3!#cuH7jpK<1{?KP4+nfzLY4$cOpbCM0bu;xWE&YGNX{YBw2W z+%PyzSpf%&;n|LZoS;?6{9`O!%9wHB^SnIk4Rzo|7ix6ga|zCt+hDv%=!|r6N|Q$s zcNB4LO8%ROJ3m95Fh|2BOTcV$P#^2NmPmL=EskHHGQhVxrAsyVHX(7&Cs;e(X%ydU zvG@^ju@=7vr_MT^bQdK`x(r!=Z%VA4!gnLu_prpQfLr=@)=kX$ z66k)2zMaxko1j-3f{KinSK-}T^GqcN+Er7kX=mKp%4G53rfe0uN_11=TCvOLMae(2 zt4O>ozZ6J=DW6YsUA`36YZbKUd1_K6dWEgi@1h^|`Qr)S%f)4HtRnO07-12QcAS`{}qWqkw~gtD4I@bMoYhTo_88iA{XJP zWr=XcLWiYgU3e*zrkHKt0)U<(%H2YCcSQw^8ancP6td<@vV-lM7`Jw0jTOIDw88*& ze28m1BFGmJhkr3YyX zMh+hZjnb|w47^z()C>^?Ft}07$AB`N)N>b2B#0~#%a)n(_1FMbS?CGSV|Aq z2H*1Ag8>KTG2mcIhqNj;E%f~ux>(k};uXa!^@Tg5a?4~=1OLt?wTlC|i=$UK?bWz- z(atWwA0F>$!XygJF>KN~SYM+H?KVyOMk2Y7cAzyQJY3~9ZE!ur;zeY6#A1NVk>!zw zEZ3#F+HWsR(0C(rU(7hl%B>0@n_b1etJsJV8gQ2tcJebUMcCB6?zt1JFl5< z-hOt4p2IdQSZ3_SC?1w_k`MK}W;6`NE4T^kS`+ zIqG71Ntq3LZazSGDFz6ux^|?8PCGt_m`^utNX2hu8^WqM}3{PUeR(!httxif)EV2yKuw?O6?Q`Upa@#!Z@$ z-GP*(kHS|NpLjt%%$I!(%T}YEtK0q98%^0JeZ0&zYQNV}is_))=rKcI#px4l5D&&q zJ^d_~KFQYdSq}p*pgNJcZ$1Uz^w+|m?ltJsd8`1qX-|6S2-9aEx#ow?ew#NP&$k^H zlPog~`s_h=0xW5Eh&C5>TSnSfpF6~s^I)1jU(W4{Bu`w}(e&vH+I_Q82#|SzZ5*Ke zOJ4+?v`;X`GZUTM;x8RyE3%0eI`+YS`ZCni5bZ+QSFptb$J19?U!v+`=hD|$A%9)t z`RjPw3%Wx@-(W*#<(PyMzRA|ut|xUP7!Wjm`Bs??fxreKDPG)Z2dhp(4H@TUua^+*saWr=>OlVYHpSzCAw z;p4xepJ6~31`YZ-JAS@57Lec<;%2s5=PP^81HWXwo=d-ivLS|-nB3)o`t>1pTt+k0 zF^22#krH-$e)t=JIrpi7s-)jm=yz5-agC{AB$a6t0YW@ga?u<7ZMG{|8~<_k#cc literal 0 HcmV?d00001 diff --git a/doc/build/doctrees/environment.pickle b/doc/build/doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..2d51abcc90e36405dcd3740b74d469cf3489b60b GIT binary patch literal 16199 zcmcIrd4L>6)!!Vuo1G+^0|-};SrTAEnB62oNP-_BWJ3~{Y?4iytbuXtnd#l?$y`<4 zLv}Hx1k5HuQSk)46+G}ni#9I_aE>ZCo@Zcthe!utn*qPaxWb^6w$Mmb~z2B?f ztFErDslIGtEbWwpT^Q=L3YXZbSjbxiH*#Lt&SlnA6vzohIZ?|=F{3q;8?bYhBPR!n zW!KI{&PQ3n%v(mmmfd#RjmYK&yJbr{nM}c!YZsEqh-0C+HL<5pPDvS)%u-3V^%~Qa zr7Sa(G;=%6VMj&;H<)U)xVB3$)3lr(>yI=wH5E&iGF`h^aAbQrQ%n=C(^)8HEGNQ^ zBXR~XXKFbsX0$1Dr&BDev?XU7O-96YU1g`rE-W6Q<&iOCN~T;QhaGuT!e~wBOvgcb zPQqyRN{>z$lkAKmk4YF)Qf7LGvIZP^Y@%#TNehsptb#l)A&;+hWUDoVPR{M035UCf zdo4G*an$V-_Ux7~)AGcam|ed?)MzQ0Fzw0?F|(X9jaJtjB!A>dMl<(O&MT+-n_=88 zWUL`MUr?7%*76kCG@1nZc4|x4pCL!RmfTJ-nxBm$CsQ{mdJqk3_DHp)4 z)3jVjZZ&Fiy66xm!y|E$AP-t#sx<71VnN2)g-$KILKha*bzw1Fmg6D)i~Rx<0LjPjjHU0jhDs1nBjn(5*0Fd*eWEX5>CCw}i-B z>mnOKrt!(M6Z+pZI+EmtfZwKNKfyO@^D6kzH|hg*pC+e_r5w4Pow!KLi$f<8b)9&1 zRrlEy(oX{aHCme0-4Cl%fWBxHdIq5LWlW1DRZLrsgU-k_dyvu63OyL8>%kyAI2Hyr zkb(H9h0)<4;Eb(hmYg|w%N_75GwPQ&&AN8pzLYwZW0&$;7DAVbl{06lV&;^U^Q7`8 zPbZvCU2hsH!}rRmF@(AVF7MQGh+MAQU>Kg}+0$SqytJGu8<9*gZ(=SqT~oeR%Uv;J zlH-Cz9mAYoC>C;N%E~!fz7Bq4a`9%(*Bety!|@<%G>sT7j%6y`ke3B16!xD2k~71Y zFCABv(=I2Ii<65t6lv}(=eMlw-l_m@DY;wZ#O{&)`3*F-*!fbX+Fw3mOc}Ha zo=aDVD*#zGS^|gP5EHd-1`pg^F>U6oND|-$C&zR6CRH37j>tVVP4dHomh18(X~dYe zfhX7KdVX^39oa4Si4n1PkK8|!+AG)ru}6#;&0d2m(cq0}aOEEPCTeh*xC{>%YA|&R zlNH@$4qEamGm?XEcuLE+_B0u-#Z=ZxyNC zA2nKFc)%W%9}5PXmyfLG;)wh>dh-b_Z;To3rQt!kRh*>b4(BZSNnr6}Q+~>rCER>Y zSh-R%Wjefcl%F=HbkpsI{umLePGWt4wa;g;=(GmVdslweh~!PjwNw&~N}ZZV=8u@0aGMHK7Kw6b|TM~eedjBXn0oyPPHwv)DUIkR9D%Z~h#D{nW! zf3Y;I>_OqmFY{`4$)d$ePmhvWW2QBf&XqG(vV>KtrLeyJNm{tyv z$H-SFnl-I%Ri4nmZXBBALapb)T`LmcYJ9w=bay#?rVAdRx zKQ~%^@8o@!(W(G~u_u2a?l7A1a#AkI`+LhNJSZ&JKMGg~LyMHsKg;}5|J*15pxZ9J3az2SJC>v!DYxzqU>X{(s_e>P=o@TKW z>6Q4c!*6p>o7fJS#xK`1p=`{8ZVK;3nbB$E5pRC@l@S>zmJ1mQiX(rGLiw99uSbto zydnIya;^Tm{@PXX@B6D)q<`>VwZaGUANwoUYJcjlS~dN-zurpbFWe|xSw3drjqh$iHj(4>3O>pNv)c`&4D`pB~fuXR1AYw)Q>qx$5pdUrWvl zHS8Uz%g2kBW3U_IhV8CWX^W*Ci(9LyH(SKrY5Z> z;2JE$)I`pVea};qP*H1;EG2C?5K)s+4U5eXTD7nd@3m32a;DZ|N0z|x0;#4z1{1!S z$#}2bc)u!{X&1M$G6$7e5)svgc0h z)i68*LaUj$hK6TRhL(G2QB=GM(L}Gn{PJtGz(iTu7;OAXY)r8WG{>5`ePz*+B{vCs zHp%LxX|UO#jzHa>-RejPt&YMKz#ZMbwuOGGIbq?fG3=u40eia%_vPeMkk zd931(l=+;g1@6ca6zQJ~nf0S}3esAg${N0Uj53Fc*8IBBB4-F;0m+8@8R|4tBVY?5 zv^pJE3K%vpvg8d1EE`5C>xG0#j=aRpQH|&=fzayZ zY|Cfi49XZ&f_WZG<>~%hChQDmy8XdU5C#A?s3y}Ia=$;Mz1=PcFE_*ceV$tV2Tekq zNrrpHQzL3AQoZ8o5p@O@g%NcgCk~9L)tq>7M0F$4xZ7(`8xzlo=fw-+fOxTS$Fp94EpbxTyGbeK z-NnIecRp-swU#aV9IWHa*r62McI#0e+;y*H^`1)g3mT{s65SIUAcMQE7iq0FvWAbo zi857p-4XM!cDAwm5XTN#+%;3!Z5=yp*1r+SKLXuMa&G@@ERgZiNXDWt7WIs&KGfnq z+ybH1R$Or(HfW1+MNZehIkD;J(>qEz77a8n8f^PQ&$f5VZsSZX&v3S%DuMvLiWRq4 zDqd7qu_H?u)Y*%vK8R2P8LeK;Dn7+Y&eQ^TWC@D&UjrFL$V6JJ6l?hEY06YZsLoR? zUUyz3X9yufa@?D&%0hF*X8=O0L0oB`#4c)neI;6BIt z`AYpl1AT&`o)sYj>Ptv#C0WDgPH|=|JRy;~0~t{7BCS=KHGK6;C{sm!%RDz1BY zL;V1dON6tN zcg>lx9S?YW9qI$#UeD^6RjTi9piW5CpUWWw-mXAet2eNQ&)Xi#RPi=vUIy<@_%A3E zr|n(ZHlug4@$yJ667C2|Z^ygaw})-3QF|-YUbFzQ`yjO1k1G*NTi^BDgK6@Ayi8xo zX5Z+U^_YGWXBsno73u?~-^}W7sZ@V!19d{89$yU^F#R^9wR$^i_)NcpGF42^#q=Hg zj}qT$yCObVD#x92sZ><%c=;wr3H_ZU=k_1Z^LSu2N>-z5HyKgis(Kfif%JDnXmt&) zMEW6=z&!QmP|T0c>|-CM*D~I99-bGC_i$!xG=jPMy{HeO@jh06f2H~d8mJQz@$o^( zAQ~S+TB{GUh98ZOP^Kyx?eogCi66)A3&ml){F7^hcRfk(Zxw^=@E>DfeucULHK6>X z5L$frs0nXKJa1lb=LIFcp1@^*&vx_nEqS z9a(~)K7JN52+8M=*6JqK@HzcFXKGDRU_PSJvg9oFRnokv!Pnoa*~%0q%bQq16v@CGPR3W|kZ}4DQ!4_djAY zKlaRc+~32QS`y&fPf!tX|5Mhxw^HwCb@e*31VLTR_kk^bY50qIX5t<_&y!&m7g>85N+s83Nm*1dFHbm}Uq8d09UMW0&o%Y;B5X&FfJcXT}l|@EJjUz~@v} zpH`_py@5I*QUBT@13qUUjr~&A@cEoYnJPZp=J7v?Sb2r{8z++J#5O^G`A780Hw}Cn# zQLj#b3F;4L?yoj92 znZ^-`p+1Pn0#-k*Qhi|qbwVO8PKOL45=UCAPS)@v(nXo7h#ZSI(NuYGkRri@o5FxS zuJMO~yd>yFBwHR%{{SpXl^x{g~A4~&;Q#Zy-_!(^YOwX`K z_)^X^Cj2a_4;Wv@`pYZzS2WNkDC+jvkOAYbKpI=Rtl=|$4rQtsZ}%pVxPQcByfX>8 zMtCbpdXqBG6H(ueIu{k-b`^wH=iwSm%2mxkD0x|*P<}41W&_=x0guBqoEghuz`^-c zA3PV=vi`bC{q+s>35xpkO2{AtJxFVH0c-diZs5#VctRreUdSK>8d)uo9YOYy^mcUV%|Eu<=w7uT+yK~uT7+UNgjNQw6bjn?9orW1 zAeZaMW9&onLN>Y0GwB7VpEG0G3CMjF>H~7Ov-(Aq>K8XqCnV}=0x}@?)ktfVWDTF( z*HEU4+`02`o-B^t5u7$tnRu#LblfxUw_-nLe~vWks??L1kz>_yr0!i&l!oT-fpI<^xP!6Y@rdc&1^ zm)6z8)-%e9m)AlD(cFc!R+=^ZaJ-H)wXhvoLL&9oLk7{j3~8-)vxcvJIc2J%S!ZKr zd)@aWa)uDDAX)ix%HhK)L-hvKAY^+Wv>L$`Arm-jn2W$B1@1)G3I8WE*oSY$qcac2AIb-#1Gy?tCKxlO>u0%hM6lck&!=OLM^k2tj z-s73^=zlL~N(mtoLM4Qg5Z*ar^*&St^uM3=K2WLm!Mb`KS%RS6eF!q3|HDXY^%2(a z`MaJowXhvoLL&7WAOre8iZpg+S;JTVIAyBo509bbs1xXlXWYf1>8kT6KG;o8M?-7R9JmwfQa17e+* zeB$Cq#b&?s##6+0FM0pNw~Mrwd}!fzk>lizk34=poWMatd=53}s4uY-x04gbQR!UK z+>x|!mOYom@hXLn0xV~raRQDH=92@(qFX4sRx%80(!seaYd?<3;@D*}XI*0DdYWem_o^;wWLpJAvy6%X0S{(@K_i>^50eIpaj(x}_CeT|0N~?DW3r z=`5;2K52}0PM7*JTr}Eo;IPVW`%Y8g@cJMu@oANRHPQwHYv7qz(e zhqw&Pz&?N5av$| zv*GYzYT}ByB42s${J9qLFCpY(47vV4hOC5pycX_>5bm%4SGZ~-X+osI%Y^=I6wbR* z{vN{pgW;APe(!iG$JU<=t^4EgsnGh_NAaq~Q-o~E)F!mnbFH%`^Sk^+R7pSZ?ESrK9zTCh8)+E+U-YHy1wV@OrZzK!0Te8zTlJ;Ps bhy_Z7)abKxH5DnNEg3E^rXi2zMd$wlxI-h@ literal 0 HcmV?d00001 diff --git a/doc/build/doctrees/index.doctree b/doc/build/doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..d15e57ee42135dd7e1e84e29c2ea394e7bc02473 GIT binary patch literal 6136 zcmds5d6*nk5l=SRYm(h08xj%{pvlD~WOs8wfCc0VM_3rHJlvqeq-Xl=z9v20Q?I+T zyI>0uS+k0_c;bZzDx#v|i3ci*c#Db$ig@4megEop_hzs7`3HabeY^8@SJ$goRlllw z_3Fl^niJIG$o0Y=KX7DN;McnJqXNy{cz~J`npYIjMBp-c-zXD!wmdQ`$7)-_2BOQPV&TAH9Q$f zZ`6tcYZP9yJa?b#4{f%pab&rX6{;Zi9LtU@PePYME$}1T^&vxA8h*6)MnNsoQtq`J zSIb)D?w38H1?T_=TB({uOJ?Lz0~=vvuL|n2w_(R#uOs*O8ZY<4%e^UAFT5*9dUP1k zD$yF*LyQZp7Oj~B>1a`~qe#0@52zoL(6R93NZsoT8#WNPL|a44Q0o1XjuZ13(KTh! zR<&#UG{??byf|@#rG~Vw47r{ihIn3I7R@PjLpc`nJ=d3Xe19{zv)HDhYEr;<<8)|u z%Mk?rrvEbt>4cjP(B_1?i)w|KqgJZran+8i(~S=q@xU)o58}Evp)EOklR8SRQUEUF zpsfmEZ7ZsEWwpMn)|S$|Zs?5nJ%}5}W08bWZ2evsmp;NGp zDJZk#44n#Xd$aAE%{uDi%}<-MIrg2h<>_kEVI`gcUpyh9GqI~;=_k+X3&gxVr0s?( z&{3`lCWw8f zKo`L){Rv$ReiKqTNNqU_UBYIRGBfB>u_!Ap-NW!}Lu$IrPD3X}uaw(%c`Yr7J+|Yd zM^d)1Kv!VXD-+tCZ`z*+X2wB+_q?ho+Wfd)m0CLV#Qr&=!}V)k>`3K04vPA~xLP^T zoE}qhg!YJn39K;iy-~V)T+AQxf+{^}98t{*ra`^|^#xT>yQnWuE>pQ!8fY~l49s-R z7*$FGEub_;BZZT2?-<#ofdwFNwZr*hs!(-|YNdfTP;m$b+O<7$#z;!hlIb=$E*56m z@;MRGP?_MEYt&v^zfH>&zz;33j* z2AC70iZU+;;TFG!lV?~--*WlP;M0tG%$ZR~7vO~)ttM>y$U79J%7kWpw$NOf!{;M3 zAJ6Rr1ZE>4l!ObCq@ z6#_?bq^LdW>TxwA8We)yIs`!ho(>SrrUZm^{TMwZ1-Kfchmbm?WQ?Ag^F?mmy^e`D zjM0syfp#peyS`hsqne@vWAwDrz#^u_UgS1(fF3FYFm%%xJzc87afN8Oxu~vJiMl}@ zP&Xl>(2|OG3|v z9Mje9n%UJo2mTq$9B1nCbEk;U>hgrp=OH$@Kb%F<^8xb<5_%yvQ!MqCS?fUwRUa~{Z!ZeFX?FI~tDyU>Sy^hISVymBHC{7|b0*5(YfS>*p3v*q z1uW*a%&{ivUO&rPsEj7&4KwOxLjoy(s4@cG3iL*3d`CiW%EjKEX}54P8@-tod`nTZ zVhwlt1M^@Uo(*Bx);`^N5N$3#+ImPv^j1^Fa=XnJC#a*FGz-JXp}SHaiv?IDM;e}6 zbEEM?)wBg<^keikwI}sHOnLkCmPFPY$`0MIK<|JRcPI4D)C%bOuFN6y?xL8_meM`y zE>n}Sc{jhmM@~9lR;oMLS?@&za{0{_r}rW5-k;D1AlIB@cO&l5>a^uM(+5o;qFutD zV)XA#=tJP1gg#1UhW>{Sp|1?&ADIQV3CKTcAipo6kFiy}_TI^me|(m;{cG8ZPbdcU z{)9f6FT5{XXkh%*Oc>Rj2UQALuIy}(J@8*4QyEl7g-i0l@M79F89_9FIc!X{E5#Tta5B(Tm{3M~D zLY@KRv6*1tu;D*u5DOx0`yn^O={YoqjN9)zV ztK^&^{klxQ5lg0A>&@!lmg#rmh-vH<^Xd0x`h#dkX~_=YKbGlFT*$@3e12dWuRmj4 zFrne0NyA^t^jB7^5olb^>2D>`<~rFZ;qMqFbWGMIq<@s@pQ0n*ELGrN3H@6vM*f={ zb0sa0p`L?drmW}USG0vP;{GbsO?aJjxD0Asz)`CUSJ_^S(Tkpk?}46=-$XYvujtC1 zQ{ihbOxYLe7JPwjOL0RFw1YVc7jpD;Xiar1zLms6Jy^p6%v56S={C^BDiuYIzTVy_ z2r%k#Wi;3m=%HQ})xBQb&K&LVPfeQJbph`OF_w`HwlQrOL%qPr?hMfcH!9g3KGX{h zwF4daBo#YYU^Dm2qq>uyJ3QMTiZR{6LUcuonARkHy_g@`9gITIN7oyA3Eo+MgGj}b z`=zJ5K=`27mV?Nba604=wfv&($T&;&H z>8s+-9FNPvCKj{tAr>m^@4*@RNG3NsvKkNR6)Z_Cmbh4Oh>W5;S5iiLCFtYgXx#l8 zadbHON3oz5Rt*D|Rs7PymuXy6DkGdUdNpVOb&(U-8MfqJ|<=E z4u_yFnJsaWvR{itgd(LMDons5h15 z`jbJ{TbQlgEa?v6uC4sOsN%RGPdyRq#);d^+ICbH%(DjF5xt$+IOFVUW!QBhrB4K< zzfE*b4N`p)Gd7Fe=R>6({M?$2L-omcQ>(-x^kNZ)R-BI*nnn5)(9x)&zu`LxusRil zlIS#Xb;yf-hPp7UV`y5T7z5N$p9UJPpBz3Dwc~Wq#IafJ7#<$(Nw2r2cJRy(%wexS zgSk-7F-{z*D0fJC_>c4xm^|ML{2_fNKdzqYy=f_U7Fez|snN+*w{pl`XY=AF*U{(j zLnm@!GVJGqI4)MDX)n{;YzVhTs*()^^-i!Li84G)a)kOk5X<^}7P;J{3r03lo6)rN z89ql}fR6{!z}mye>y&gMNPI9De@+zkU7(iYs#rGtj6!bdNMFQ@=9m$t?#FYYFUD_C zEx~N7OO3^%YszHYoRRtx!&t(vT8$I!m_%P{7GWM?1{3)(7Na=~;ds*7o*x#Wz6`8o XeK~#wH`MQV)=qvFXS9|^g7X&vQ literal 0 HcmV?d00001 diff --git a/doc/build/doctrees/install.doctree b/doc/build/doctrees/install.doctree new file mode 100644 index 0000000000000000000000000000000000000000..16125ad9110761bd6b323752fc2448cfa24d3dc7 GIT binary patch literal 21271 zcmeHPcYGYh^*06=oh>&?02^40k!0gL*|-D@Mz{!LY|D3tGkuAm;fd+)vX_WQm!yL)?*j14j2mwfVvw0kpeUY~hyW@qNQ zsriDNulvQam#Ml1+e`7!ie2?n>ZqmHtEquHy2EU#S{2(LtJ$79CQ#ElvNNYlnKDo> zmJ7w|kec3;JrTbP_CS4T2nB}J7&USS%67$5GkUVE5xn8n{Gwa+)J$DiBb#hhFM35E z$Xj}{$3~Dq)LE>0zEv(WkyKCixI~pP=#nu~tQOo6PtEGdEji76;niz3 zmwYw5Cwm5J@@}P8WHg=lH_R;BqrOd5tIS*ukp(VWd$J1wT6L>w5Umz0Di{N<>-k36 z&0Ea0n$uG^=X>=5&oBB=nOn^j>_Jb>4b(hyPR%0E&Q)yBvxXqb{64k7oRhB;L6K0*(W(O%~o9&srqE6#cXX>^g<_P9vfjyC)B*inPnaqS3t?>NXe%- zv(0%>ahf%pjud>V(`ud(t2Z60Hyx>$`O@k=&6#5^Oe!}m%1y`0HR|TfyaShl!qn+~ zYVml-^z1zAJf+TnUoHvMnea=pMncuLnN!T^umQBK+MTK9^su}mdlszP>9`fUvu4%H zodtVeXJM>r`Px$ws8)rLTA1S<}c zJhwhz)d$97fmtkgLCs02P2hcVpt_m&l`zc3?ug;L;fS$$tjG2Z^gV<9$SC^g;l5*x zq4PBQ=|u_2T4Ky<3rlzLWYQfINw?MMdXO|PftcF@wVlOe`kO^ehaGW8pn6bjPHC{^ zoW;ECY~n@jau!-pw|bP*VzJI=L|pCeaM+-G0@ce(;gNDz)1YVq^A2rFM{Ia$6Xwu{ zF}}+nb>O1!IuhiV=^^WY=6o4VM{NF5$o)wJNo;&3u~!^{QWIH>!`WQ+){yil1CH znFd=Ti{zle|6XPE!xOAP4X`J$Vy>LD%a#$3$tvdtFg_2bR33g(2$ao!vIc(Q)eEj+ z)%^4jI&5TA_=O(R5wg=5X0nkX1}r^t=`m|=WUUgc^`Kc&!_Y=KP!$L!UAWNb7u7(yEbq#rrcCK|4ISicLw6C3 zNrqMST%&5kGkwQ4`XRAhc59qF8T)MV5UaS`aGkh&O81*F<9x^WYu>uf&ViyoP|pwB ze#WJtPMbT8{(nJ#E|)QuE!#TCgP&3NZ1jz>5L*h})3!X24XMEW8LDE98Eg)YLd22M z7_^GzI+SQ2SBluTiCpqB%a)}=KOabF_25N#7a|-sSg0@RB)9s)U^P= zE>PFA0(H^kI`@2X;WX;8Q1}gjdK|-F1r!ghue17Zoalj}ZXORYt^f}YU2ju2K|T8e zbs*B_4O*MiwK~)jM3tS&)H9tECCPi1GhLFrMG;HS)=AzSfqD+BfTzz<)~=ol32#g0ch74=8s>K~ zs^>$xruHuY>n{w{i-6c+Tz3fT4ySf^2I|F3Z#n2;XqD)I>{{k`I*=h{6FcxI9%ocz z>Lm%DWc+^VWIUZ3iFX%xdcZX92H!6W)XSM~rgx|2n_cCeK)r(bW-AUM;57RRN}T#Y z2BD@CbFKkBo6B%%Ly_Vt_a4ku7DtS~GIW&(Kt#O?e7`zSuK|OSGThV9_kDqSE%V(E zzM;{ofm{H|Gb^`HB+Or38j~!SBYJ;-zog6k{W>E+LNGEil94h=2sjH!A!$ZhfLzSC z1rI0KgT=D#C4?0Vy>2oKEr|quJx5rMActg2y#eyQF;H(}K@O`0IJs|PbPY4SlzKA^ z`j$YwmGPy(K|^jHmftp!ZJ^_j^>%PPo#90z>K$O~oq>8+r1rN!?FdLSLOSZ*aX2#0 zSMLGvdjs`8rpe(58WtuU4)pI2)CaiYcvSHCGePm{gUs27I-=m~d~lMmDm;D|JRTg) zN5I8L1NE_p<@XEAjt-osg8KbiSbZGrKM|-;GP8#U*Ahmf?WY3uX>NB3$m9!#tazj< z!*E00{ZlBEaUdn?H8L3^y}5hqmhPTaxvf2$wws%~bDOvBUXMi+-|6&SotP$^PI}m9 z4%Wk#MvnJcXz0lDpgsq+d_GWLh}8P2MhE<2puWUX_dx1i?to$1yWALYkn0(X&t7bB zB8zz?M!Pa58qmU+bgafi7wdC+_R9+osfvYFDXh_aIU&1rxUWp~+%?-Wk=$Q}+z$a4 zUxVyl57ajxq{AG2QOnMQ<~IZNEtb6nvhyfmq)W!x38uwh-#(bZRz-||2aGqNP~Qd3 z?*;1nk-op#(Dx4l^+Tq)iuLUpp3Q@l<>MbF1D>8$u$TF~ep9oloR~~dy{dkc;7^qL zTiIuXEI;1bd>sUmZ++ z=SD348Z1u4qkaSGzYWyyA|3vsp~K$?>JLo48`MXfV&1{3SGjEXWEFV137 z9DxG!c8xP=UNgh=xKPZqu5AOX8iVz!ERbf@9}{egR{u1aR?mxA{xeuUa>V}vN&gzC zzp87?Q6}~GK>Z`qK~pC6&n6aW3MSpoX`D>aQT*B}`P2m=%QO{bl2Xypcnjzl z`K{-Jn^9-(Xz&=%Q}#$7>@?IW{7lrxg^>~F2tZeM`w?cC<^nM^ zHxG}1<_nd!BTmI>FR|W{H6THu1w!lCkQR@BvD#P{$4SL_U1$u*Rp@xs!!@R%ohX}5 zKmkN}1RepMD6J)1EHNQi-dX18gyl3eIfP;8B#rE3LAFpM%N|C`*6a3Wy>?2jrKc)Jx;&|_)6#x&U2ls7$N&fe94-y&1U!UT zfk!~Rlo^h`CFWTq2#01mTR>JdK%x&wGS#KkQjt(CtwD)%l8n)7`E`bj(LE8TkCX=Z zwn69MEueGdcbj}G-h7a6#k7tQwU?NeqG^SMFS{o`H_7^va`JOb(x zjBTZmAhX!;#tQ{xg9gc-3wwrZL$XY2g%fBDz5Ib&CUns_E#GCA8~6-?6j*&xFX5L*^k! z6*(}{$xFL;Z``@3d;LnI?E)+|58IitJJc+h3>lXQj>+A)H z5m1ki(BlX*-mu(Gso$mRvmb#N7&$mxS`{SmQPAThYW{j9zx(?mVGtsDYR&PMGuh%G zOgkp2Y^v&03x2BY1XxP(W6AriC%PBr03lNkevG8k0xjj zprPbmJOVPMX>twVewusZUeAN~q>E)$Ea^(5$+Cp<{(~CR5#j)E!)P zdDM?rT>)iKosCC8gMvV-j>#oew>4JX5pY-<(qtVWThwH;N0daYJVdc5kd=houqHR* z!#tIxBB4L3pu{;@0$G(`XG$R38}%Vq8gL-1;VmE~zxAj3jlB0F+SEkEt=mh?Kr(uH z(jY-Gj9xJXpBw1U_RR?EsDRz};Stb?plK_GRG1k(@SOqHMg?R{gRsy^E_g!%T`hG9 zF6hxHaZVMvui@9(B6lv5JCFt}_haxD(6#crP4-%C*<~6Xo6OA{;=NXM9iwP3F(XOg zua{N{vZ3%Xna6U2u7hE{0kzP;I=s*@uBW1tm?2Jt4@>?&I#V*1<;8aZtLMpUGL?EhvC4!q{ygW4x7fV!vVgJVPMHTe@MN z+ffhu@bX)8x1(pG28MbT9sxaD(CGNbq?3l?X~F-xD6c&6GI?SEIQ%Y3cR+_w_H*zE z=(+fhUXlHuVvoewr#nrwobx=<@bg0r^LENZEIa5>5v@P)*xEdv%KYsGf^YKq+i*0d zz7Rm@Y7dGgy$FrrAa~*s(2Iqf?u{%^BcQ)T>R+nsWxVR>-iI%$b?h%2)2pMrP>ydo z7UtpHYh|O9!P}DXJKAoAat?C{ZZXBD?O99dE^yJTD~UaK3v=T~q&3?rk)B@0?YbUj=3fpbpznL|2~-ZFu5a z1>|iSB>M#kP?B{apNpfq?0wXmUL}tk#OVay!;EDF{vWS5L_1iqrjVC&0FrS^>ktaN zZj)Mx;IP1eEq?v|OD^8Iqq|cY^!G1MMT50hv-8D4{V_9Y(nv*RsiUz^uPF;ng;^** z0VI_z9{zR_dZMzu$hhwi0M4%7DO!40sHF*O=qJ}nIErDCPv8;ICk2NdxtVCvBslmgkWHeJ-T8A7UZ3+_`g4Z*KR_oxSUJZRowYXTy%}^$9IuBZUlPx$Rpw?%uHb za^6R=XWd0xw|6si5)#Le22v4p&(54iylKaVZQbj8cbnZYCe-b@d{1xpjvS-dBbCja zRYLdYh0V!B_tjB{{Q`hs+W$|Y&=$5hD(Su`C z7}~JqK)#l8J|Nq&W%7Qf2SMD0Ga@bMZoY9C0xIk27k~ECQZ2hD0K-r=uaqd zPLYJ`&-^+|60Ykb=lhE^;Dqb1cnj!n^1Dq=P|5-$FM;t1%FFZ#O8Pq^X)iG=$xQ1X z(k?+b%(P-c|KtW;2gf@FoA02^qwol5D*hvcmqKF9TBBrKeLK8RrKDCWua+(F;CwCG`uVC?a6Hpxw$y<+8>jB$B* zLLxC+(0F9^ZpWTWHyHq2#R-#FE)F?9rU4bVfP{*5#b0iC6_Dz(#fDkJfrkuD1Ha9B zlhI+ih%r%bH$(=S!R@;KW5k>Zc45XAJg}8Tgu_-AmZ81GhHIE{mVnIGAlbDr<3&Xr zs$3qOD$z$_5(h@0S-pNJ5RrZ})T*&3JW@0}M=(#+>`jqo=W@HQe}(cqV1Tgm@d#*v z&}%D&?67zZVUHD%<1|S2UI@DfhkL77CXS9o^-Chqw7*wIns|S&^g;`~m5gzb9IcV;y~zQ&_v$9>pPCGcN_8Aq#-ZqH*|qfcpYRY*I>e9tj>W2+-s7+~ zUcJYQEECmxAX4uM0-*PLj2D(3fl6rZL_7jINg&%~SIBrsP-fjBNMS!Noh5d6FTk^m~$gm@bD5(hSAR&-*Uo{ zh(DU>-qXQdD%|{uX*^CHtmDf3y1luTdvj~?w_+*JkjM9#HW6xKpSd~eGwlMPPboeq zsi^}P;EhZ1z)mDVr_W(ND0Gm4%@Ov#vjpk#5UByn97@UD`O*xZ=zL-YbUwbLVX{5- zlk`32f%{&DpSte}7V1O+q+Njrwk+X))c2UxWZ&ZhQxA#7b1PwQHaDHEd08dAtk%3_ zt%r*4I8W17ie{o~gom{u51#`M4`Mq%ycx3_Z?Bw4<>_TSm0cfI$$%MZAchF1vV0<7 zGB`%Mc6GYq?aQZEuFkATPF$0d+MPW{dduRb{LEOnnlrC8oXxFWy|}r9$*lH~BJ$+3 z+FPSeb`F5xMgOg8p>rW0I>kCX0y$Ag1u^S(j<8wr^beZwW zyptHGe34LBvFjXXmG>^o?8}exxT^Bv7XPTop~<5PVaZ;dqeWLN+sUZZsC{@*5$oac%urk zb6&0w7hf?iXiNvNOe&w)_1AQUN-!b>Q&g>%E9putV{Ac)2xk=O3pTmc!QxO|-_By} zu&TJpMe;F&6=dg!C7cYnqd4_F%HaiS!Mbi3r

+9!5*ih2R;!xB-uVHi`gk*}EU001v0H!BE^$5CL%xnKp?Wn?pI?3pxH9d=Wvq zTSOY~d|GynyceM!W9B;{@qc*Vqb(2xE_pE?0c{nz_3+5X)j0zWS?g67{omq*-kgPF zHdT+OTDTbD62SJDt?_kCe1i{d6O`NW-<*j8xxa^YNMR2b&hy4918zANwen~uiu-66 zSI%#`-bwI1N@{m=?Q!Fp<^*7m0Q53IOTOsKCnAqbDZLc`dE_u>M>k916TMBBp%`~b z#j?cLP!XSg#BNIbXYTn2EA zETA0M%)MEQs_NZT)SzI|2tFN4kdo+NbiR+ATlMBABVxD`cRmNu66y;Ix zQUU)1vKiJ~5a~0=cPa5k1dj$$13r(%Nm>Bo@+}0E0xodC#vmF(U5`1N2J>iui@54k zCI@Ba!Z026T^Dzp6>Wb|Cf|-dv%y}$;hlWmgDw0OHc$(~Hr%}da&a-h55PQrRA3nBi zNQm+S<|%I7uhsp7;lG*@@jVAPsz#6IAFX_)7EW8{M!DP3H7J8o=N9UfS}yirj{=mV zGvZdPVs+3BfghuR=Zsjy+xWl@wzgI1T7f;D&BhzJ+4wo%#z%apm##x4E|alq=`&ZX zF3|P-bG|)V#I0=TTy-zh;$s>0G;=x@aF7Jh4T4f^p7(S6_<}l@=y6hdJkFzA!#SIG zXXmif4?Fg7@fY2Q%Khdk5VaDI1`RjL$-Or8cmN$RkG8A(=q5p?1+RHFuGGol{u|ma z#q;b@+;3#(Fq@T&>O49iNDV;mc zVstZ#&1rRiFntc)!tbdN6?dX1YfQyz(#Z4_25XTfX%FgpD*v9FD-=E6iveF3B|c5s zwqT&aVa37XDBa3n+~cf)+(@zDJM?svY@2D$X?9Y&jRB{by%&L{XYl)s@D4q?9lxBV z=3ERmKC&?GkGL?%r)Q#kzu6Kdxv!jy06e2*?w?=agmW^fUn4ZVQ$KYaxA$mT) zE^5}^xGwktfRvN~mc zE;@QKK+uUodr0T-=p`uZGf$A7f;B~bSrGa!TdqJaMeTlb7H-yyi|#@Z#|KemJf`2x zxa$Mv@#CWyx)u5KGHx_QZoi|K<2|5z@V~=35tm(@hLeU1ajDrUdNJi>y;u2Ey|wcs zefr1H-`o~COX}u=rb`!f2!4g&ychqm?|&_?NxV|p9FK7I5Lm#~cKLWZB|8cj({{br+(Te~8 literal 0 HcmV?d00001 diff --git a/doc/build/doctrees/minibatch.doctree b/doc/build/doctrees/minibatch.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8308f94cb30bc60c5e2f326b09714b0bb21abd83 GIT binary patch literal 2640 zcmbVO>wg6#aAZ_Lfj<=W`&f$)jaX0)lzW;!;~^J3r8Iadvw*B-}O z6Q^?Mc&X-PS}R29WSmRq#0Y0~BJR>!Qk5m*#m-h`BKb_8x~WWTDZ*}E>C<^pc{{Y$ z8|!84yeK`d?mj?E0hLZ2uho23Ez-t)khZniofq9rdz0XJW!r8X{Kp|0@0)Pu@{m8&&h+oI*PD#AL)k3_VTWWqW8z8=x?KqPm{ z!0Bd0r$YLVM*Nss7ql>0|9Hf2QH!FY)0sAspV*zpVQo?Qt!iF@g12qWa)5GWvdddw z;6}}F-%=Y*m0y~z@^j-ps{9W1kh-8AR+rReT4=WNlM2AMx6~t%x*n;`NIe><$D>Li zzG|cH%m%$B51_N&|BCd~Yj^qSn%@aPDnz|e4Ma7VJqYCyqf!*A%kM%4H*0=($lz%d z=taA~>Fs7A%b_jv&Et9m)#87h7p2{kn{qhRiIyfA^LtJt*Ev3!-y0Hq=07EPdYa(- zRPXYWn=~c9RnXrVUkc+w015r2X@iS|u1I({+YPljY^W!klk z#y*86Jw|x1zjq`4bbwXZ(gXKPeOlIO+rWJ^@ajn{jz1IeXK8gBYy#lrnmPP< zU_6MUZJENT3haXfG&=1|eOf7p36{dKsxsp*(-q}?@ocZ>t%X}^>4!VE9QBmXvmSqi zI$$7?;b@Ky;dQbIDM(%oIKDNI8b%vT5c+EvzS;j z)Fa+&YX!mWX{Ws{c^@YynH6_pnG2o8BE>XmEcxJ&t|62BxY6!aJ$6OlYJ5beq}k(d z^xM1&C#w{BJ|TR7X$u&9q}P8(5)8``iPdM^ZiHa5}id8dw7571yJPq$A{Dz zNh2}zLH17otr5UIN?wQ9U5?2gbA?-g<2R0IC6xNOKYvQs+y30&-`^?5URl%hXBf*^ z>3aOLV2Z|zgIMX2%JA|0bBsxAM*Iu9dOsU8P4G))Xf60ve2;-&(Y#Li*8ppAfx!H1 z3-y~Lx-w}qnaQTt!I4+-bc+8LVs1HYr0V#05p6W0)yB!Pxi(1?s89L#hja#)5j4`| z`47Q38+MNE?~nazKo@5Xd~#9x)9&2lmhk7A|Dx8_1qW@Nyq--)#$Rjxo4O2Z$Bg@X pGvhG6alvRWI~epB>KNzLnVP8Me?qCFIST|5Xik{tZb*&h`KR literal 0 HcmV?d00001 diff --git a/doc/build/doctrees/multiprocessing.doctree b/doc/build/doctrees/multiprocessing.doctree new file mode 100644 index 0000000000000000000000000000000000000000..a65ae07a0ca8030d424594e4307435676582e215 GIT binary patch literal 2784 zcmbVO`F9*g5msdD*tI0fj_pJ~;te4nL!=GFKrjRXm?R*w=5Pgb3`6fs@AlxC?y2b> z9l(&75Rf>NaFc_C`~DmGdUjTl_c@RE_(6JFZFSXGUsZio&rL_MiAtBGc3qoT+P43g zN$uKv*QHxLUGb4sYH5*4x06fDM=PGWu`)F^m6fSW*7Cwc(%M81JBjYZJ6bxP?O8fu z%f5AqgJ+||SPm@DRXk5ixhSj*GrSQ)xN8O6rlqJX3WN-;DT_$*u^zQ!8JR-(*Syf9 zlcIEHV2sno$--lRduGW_|tc&_|=^rD*kSDk2zDdKerR7ftyg?^!o9p`ZX99kjPEDAH^;f-suTd*XT&)Y1KO6Ap zd^WT&7LdBjKM%dwM|dDLUkLcRhn1Vc0XOw%K8YJGc?Mdtco>W2F9v*r7RSLx0KQc5 zmuWfCaZ*4mLdeiiI?G=P_^UK;rE}0h%fX?68Wcu5spIxDA}yh={58X2#a~~glVd7E zKg0lj)3N}JyW!dtF*GyBJE@}tv)=E~LNSP73h^w9lp{K)oXf9tyUrMBcOuUlHN7TUC6G?eF_r#1-<4$kCrS{CJ!T%d9}AZL>-;+A;xGF&ET72hZ9;% zg&vkrY}m(=zd_Rw(VNtY(R@(jEa%iCtho(SxhYf5pfwA~0$V_jbX-H$l}KGsLYTHaF+_2|4T3R8qYYGM!?jy@`(;}mscTJ{hvo?t@r6j^dXGqLQKL$*CymRVo= zy6&XXDhYLRdvw8+E-&3%`79ylU?Xz82}mfdF0*jkH#l#hB*)`2%ftPavb+thFmj0= zn8s`eW=mV5&>k>+Ns;k4dvx0KK1kBKXrYrC@H)xgqIrC=_Ta;pWBxXsklP7%AG*4< z4L23InT?DdBt!mAQ!6ywW?~a(3Vs%zqtu9-q0B^*h9bsRtCzxayL17WWc!15Q1#H} zo~v7XbVTY+{%)_yE4Q+Ykw=#D^Pax#+@Q%4v~8h9YWaH@C(j8sdM)iu#xLyAvC(!5 zee?470n@kWp)UIYLQD|PyEId}!P=v|NA2dh@8=)lb)pZKh<`+_+H%c;gdfxKFix!K zgUW`NpY*7O0nQOH+2)@@ms(Er!>uHCihs6&TjTaV;umR#u0Mg$FVWoi)OcB~&~Xg0 z!|L&~0E!&{e3x27sU_|Yko^lls~g~el3$|PZH6NxyeMiXwnLQ+Rf-?Szr~_9ddR<{^S84xF$AxuOfSX=-g<`WGd@f2S-kY<2&N_Xy%5~x>YT|5%8OIrf%CrTUpdM zoYbEDnE$X#$8Z*5lt!Qb=%usfXI}vS)GPaRdQ!qiSKFUArbd^_Un>5qT2`kly6f<* zI9eKitN8EgEW{mK_8;{c!~K9Gr#ZWDY2d2BJwdIpj9UI@!2hCI-ws&Y|E~ByWqh z*Ezq>!7D^ROJQ9YNRIobdMQ}ZNxV|@3gY0Z@zo?yr$S!FaiZWrhF6b^t$Axtw(Hc| z)61>BMr;$C#dfhnj6q-i5*`!;d172#=7>Fxs5)Y=BlbC|pvcbh{U{N2Zu1pJFon=X&QoTZ!RU??G zwpCj7n5?FnR|8pXq@;{MwyLb!sWlIYH?AnNw3G>NvZWrmRH^H_rQR%R{}YCzM8ho^ z-fC&Ecn;?@2wUv23~#f=j@e>QpFDlEdLrS>@M^cw`5@x$%TfX%CpyZKLb2Tw!E3rt}^4?6getqO*^#*)v%!{j4N z2$wDB5eKI&tXL(6a6=si1HbT?GvqPDE3s&N)WNeb+)dU2@K}bALnV-YkdT|WWKS(_ zG(O?rlQ5{cF(fgK&Wf>XCQ2GE{qh+WrewDGltMSdr^jJqmkQU8Isu>2$Oy(J3at{K zyfmiwxby;Yghm~PlBP#T$yC!ML=ScfW8$N=no)|ZJm97|sghPrm?*5F4<%y2<2E$% z1+rrv+Y&e#oJaARbr{j)MX~Ft$eO>#7WL66o1%+GKp*{*v@w9;kjYj`PEO~2j?X|Z zx$F#-d{QI1bQEJ~5$4>wA)ngI7^VIwK9#|c`I<7qn3>NX%xFllF~R&T+s{$vZ;z=Z8|nG#}a7) zQ!LIRe6|i-Ebq-A%$w#K9uZ!{@i`czA13x6I_%@~uz}A9bSILkQ(bVA5jXvwlFgun zFBH8Z!OaFbFe}L90-)m(gNEO9-tWQ0m&K#y=eV6Z)+jXkGd%!@twUO literal 0 HcmV?d00001 diff --git a/doc/build/doctrees/optimizers.doctree b/doc/build/doctrees/optimizers.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8a69aea902f238cbbd8f23b40b7a92a82d536430 GIT binary patch literal 6199 zcmb_g2Y4LC6_#bSJ4>=`Y%th{!v&u)mN3b{-Z_iNkrq^6Fk;dPln5bCHL8d+7+2?{^3*D-Fz0?8aha#~gh(?0Y4PmSAS&keHXi-evqPJ%2Kw4E91ojvV z>?u*N=q*QD!z?TCBVCrXcu3?OS@yNfv#D=LEVZN1ANBpv^FwI`p{+w&GPpo=va4Jt zprtV#Ra71L>%?Cd{&M)si$3Fv&2{LOMWU;$+=_!0X?cl`ZVX8v%e-u!jzL6L#B?ko zqV4e%+i{{rbifF}rIo5xbfn{}hWp`*0fqPs)a z&d?rX8|Zk^nJ!Exh`b$!+8v2Pc&HH5iAB-nL^YNRXiZ6UmMeA;;CXFHbdA{M1DgH2 zt|S(+E7q6jB(=;I?TP$`5*1b6jzn7p=|UR^TcIq?IyzakD)?YivC#<#T}9^U6u4k> zO#MZ5oQd`J$srjQ_RPk5K&@0O)GD=F9WUC=Bsx_A@|L1nQ&MY7YF$aKFR2ZsNMU7_ zu6J7Fa{J{3O5pV7Yn*Z8Av!arvj9TzdYhvWI~r+Jftc81+ODZQoek7mV>*XXUx=ve zSF&)>)~+7~b$MC{l^qr){ism3y+RboLg*L5$df##3#<=i$O*lz&dA)%I&>}@dR{X_ z+cHDXSEv795L^HkTo}_u>;gu!HE}^uQ?57BZ#z!HCa&kmi9B5l`!9*!I1p5%j z$9$&k4EwSohXuh&qO<`?g^bp&3`(@4h^%(Kv5KUf!)vn&pHBdV;-#B56-+K}R5{TS z(&aY7Jd_%b5H;ch0trN8-L~;nv-0-uLo) zvr1@~O?U)5m>#KecDIqb^tfqo=tjI9Lu^gj&V% z>;MhoJK4P6$ecW+vg))^b>!gxIu{%!CYJ4iSPk3eNn*9pn8w%zorr$2rxajty6$3Q z@9Y#(48WZOAgTB)73ezDL7gr-fPAjRRLv|JZJy7`Ldb4ZVxBwz^JA)Iz|t)-0cIGe zyM6)@!_rM)&H6k@aiyv#1g0PR-I~JBD3H-4Y?dH}M|&ywtKZl`_T8hh;B_>4lkPHzQi8 z-R^p8=ta>8;)hKQzlz!W#WB4kn}O{W)vgR}zw`*S{j#FkIlMlzv)NH`4q}%k{TN5r-hC5$t zxbt<4MoN5czaB5%rM`U_{*^3o8}}Vy;*e`R(uQopTmlZN$-xB z-pXj}hziJ3b%x{KHb-3p$Gtt}l9Vs$9fkboP#VmGbOz+NCnq@Jp#4M%^ zZ@s6paMFj4xa^0q zY;!&I5g_z??J^em)slE7m_h>$roq2MEy@Ra$g;dsE5ZO_c4Rq!wmAJ<_z*> zApS~BU(FET3(q1;>N$hSgU@7ut3W?bt)VjM&@1GP(6YOuwGd_?!6&wNl;B!oNjmcB6nU z$L^wG%7H?%uN2mp3T)U^8qWZ03T{xq0jmICN!%RE(&?w)A*{cT=?__0A4tM_uK7>& z&NZL@h%{vnJQ&lTX7K*`;d`Jf@qkKf|BJExp_u+Uqw8`5EX17%k~m{ED6| z4NYq5g&2!<8-MA;jl$Kq-djoZ0^M$=b@0coK!zdC7lH1?Yh60xgu*8%Cx4AyiO{mq zUHIa=$3hOU!6b=<|vh#HFmTo$q~<`Y3+xso36FgvJaeI#Ms=u~zBn<@}Iy zZ1f{SyIRvnLtNkdfMd9J}pTLSb7+N{h1%Bz_ri>R=tqCSoeImvX)WuFztywcn z7U(q?2iu~r;(DWgD!euk?j5(a#|KyFm3CFHGqTG$Y@=?)1m6PF!4%~BdVCaJ__lfd zsb@I)Bz|2YCtUQ#z^ze`dT|4*ZWkRmwU4@Ex@c6Im?OClx`7+|T5mL?%gYttK43}Q zpeq(S1sbh4q~OW;I3-rY)anfN&!&+T)Y!3`AT%u&O7EaP#VAV*uLUx4U}d$UH=E%; z9FTqFv5P{{o?QuazZqZ3-a{wQG=@^I3>ck@l7^VYwW3co!o6G$b&0&ij4p17m_7}| zqCE;nH*eLa^K(8`#YJ>RqRI8@gRIYFv7DK*8Fzhs7QZjH95=8>5P;N)XPdb>5KRpz z+zGvv#kk_^5o_FaLZ#2a$Y7V~otvb38w<9J{W}2ZTz>9MJDK`Cys6bxjI2h2EuoSj?FSI8t<&LQe{)PHd9&W4n-k9FbkE`Z-&zf6; zmqFw@QyRU@z}Bq0cJSm@*U>xqp%=AKANI>JI4xEtWiKnz&=TAlDl6?~>Rk{)5vB1k z#S!S;7%YjSO{KVAAhl^IOOGSx=s|p)!WGRPM@c6`S73+z6!tGP`(ZAWJ`6a+tE%IYMELQiKTOT+vX^x_nJvp;}=J>lW~XE t`-}p#*G$JM>l0@OlSt&UJtNTjAzIP`zoLUv&k6K3c!~A3_>D&T{{t8mJ_Y~) literal 0 HcmV?d00001 diff --git a/doc/build/doctrees/python.doctree b/doc/build/doctrees/python.doctree new file mode 100644 index 0000000000000000000000000000000000000000..20084d6754ae02b1a60dd0653f0d710d6eb59133 GIT binary patch literal 35157 zcmeHw2Xq|O)xR;W3oaN;Gsue#SO!Z1Qv?D7#x`JtWiVb?ide0*Bkjto-JLtTmIVx< zV@M$o5(uP_gg_EP0tpaEA-$4bNGH9L-b32|ckg{~W_ETZ+ZgiyzH`2Fqxl??1YHNDx zq)C&i#S?PmPU}g}Mx^EyN<+zN-boHsYF+O1p7a8w7D`?`5=KC&08TW7T}Ql+2BloN98UoU0X`b~n*e zOYPy+`n_tQ3PsALOwJkf+}(V4_tfl4mOLjj;&@(m2-45$b!Vq$57daDVa6-hXuxsj z^rR9wXP``3#&+lSq~>L7)$(AuTrHKWP6j$a-aWc^Nlj-v6mp(B&v*B1%}+~Btrpv0 zguU|9Q?tYbZ4k2!YP$3DGg1pe{o7c7&Ss@^85 zx2fvxzO~ehfqbEugEsDdz3%?4@xt^RF=)bFfU-QmcMn8aQg+lR-jbS>ng$EO7Vg6Q z$vQ9F56_n_4DYIcZ?<1R`~H%#5d zsYJF~r9ywL3ez9#yN9%~@fItlj(sDGsIE^p1Z zh+nM@9h3d)Z1t~e?UH&KPbNl<;-;4qw~<>nAZHEz4;}*`PSb2(%$^x zy|p}q$r}-ljTga2XAA05=XSF_?z*eo<9)XaqUKqIBWwNHT7R4>N-aA?*-Ad)o&eoW z^xYM#+o>qG*1)utq>Oz2G<%O(fPBNY@2X}vuC?9{TP=QzoJr&u0c>Yfx)eP+PQ zJ(<-%rJ4FutokeSozIsLr@|1ce0Mb)f(1HJ43TGb*ZA&ftnM19Ys#*_P|Bg5@sibY zQp*v3oisJQI0mipFm(^DO|6uJ^6J9LwLEd$*D;Z`4)3Atgn;LJv+Zw7Ov=?lb@Dlf1GJ0-O!q6=RenXH?qaJ z;of-G39C1_DNtOe?wuFEKCh0V@#}!j`Or8-PDA1geD^|@m&<163vM`t& zE7y{_a%o95na^%^l7(tATO=o&8*5LDY|0f#yR)|btmh;Ka?#l0A6D#h%8gLh%eURkP*^rJl}4<@slF&xSE7twZ<3Bw_1uce$Yh3z@j zTBW@*7L+w8LW92XvfJ8foO}g^h4~zJ-8Izjonh;4 zM&%#%-7Sz`TFWvjKYH$Is-HVn>j#Iupjfkt>Rt-$%Y658)_y!76jTmW*igRjUcsPA zG1SDBoDK3KYmh4=2DvIQ$kj~@at*}Y9`f$B5dAvez1}MBi{g1zcn=8J(8{ASCD{_)I+h`0Oh9SpKR@W*d6S@c(1(eI3u!(Bl+yrzlp zuZ8dv6Lwz*F<6D$7$@`;%G9^ZX4a|^xUUTf0( ztT((R^oF-KG3eVuZ@3@wzuk8qu!g%QYPdZEZ>Z~z+;;%!oxb}Zi!lyNMBs;f_g(b@ zzuOA@uod``P~bhN<;K#uGao>Hf75Jg3z|&b^?JC{(0r364`vGPhNskEjgztWk zbN3Oa<({aaXJwE5kd^ks5s&>y;ISWVBJal_?*vrck3+Uk`0gjI5>G^xI1u7Y*rU6j z0{W+Y_cJW~HlZU5Kk2)lWt?5WVFj!9Ijh>|Q!~mHjLE8Ha=(ym>>Iuag#-(nzvR1L zwt_zy6`b3#hQWsW6`*|8cfZDrn?ghce9CvfUMJu;tbpH)2>7ig0)9Ip;CFoYyH>!b zLIJtgc-nWrXBqUd1-@??`~Zb(`hNF^C|t~%OGECDbXHs~3~X|L+@zp?V%YMy_ou%5 zGt2hrkZq^5o6!-M`*T45!gqhkl5nFM&5T&%8Q=X?ov^>Q!u}>A>~8~Me-{z<_f3TT zLqym=`tF~su+Kz=|?%z0F-Mi_)k?s0-E9$e6O7oAP()_cD zc>jWU6Hs;k4XOU)(`x+6AcBT}6`-__V9i*^vrFQv`FW!9*a{h^9$` z3<7C7-a}ud8HhHzE6qf5=&_VQ)TiC>G@1=Fr>JsGYYy!WC@3^b&}S?9wkjFT5$L%F z8i6XYha{*H^Y9)~VoyYyD6tokBTCFi)Th1iv`R3iPzlsO+DBmaRTybexE9iWlAyfz z=l7s4(gH-ShtmNZk##Drk#r!UjgCYuNDf_{79#3X5>G1^OA*S|SV8F^0Kl$`1aq-s zPEb?nU;#YD03w(qY8@&Gs@4*I57lZ#G*D|PM?$p@L$rxnha)+n)-ptWYQxj2#ZpAo zNtVurPDcvZas!4yz2qoKP?e6xd&EnQL9~gN9E;?LmvkcP z({XrOv6)j;Y+lT+pEA<%0DFjp~Bvq$D8M2;^xBDSn@f2z$EZo?&u3 zfU|>BWL9mhpsQ+U@_R7vqi#fP(@SR|(nPg&NQP?9fjRX66*{g*;M3W7T5GUgp*6Vv zpCd3E6eb+P(z%kN!f)hvoz_qa@4?WJ&O@w;=;tFDqU(T|*t(GB0t7x?h^Li?d56+; zrVrw>+1APeT?8zUyBL8_y?BD$_Mt`!_!7a+80?d!fOl@i0tMbD0(k}Dod1aM`B||jR zp(t%aN`4<+U!@|y&XgtAgUy->jR*o(S*e6KpUM(%k?pP3c6*B#6@%?9sxX;_!z@W; z36@;JjIcJ#HvubRgwBa5dw_s7stA0l3B8tK!;Zy+L0|?fqSIyp8C4MJw@)izGiMnu zI_eU77i~dqy_~#MOJjo6DCeQpB$qN?=Qu5j~}?V_u!s$wHich|5!heg)K$&F>~ieNFYT*ahx)ymnoH-h04p7%7hrO8q1^0c65v2-D>cHH4J)%q^PR5 z@w-v=m3R+TeHCKORlOZKp{jQv2322;z^6O$w5l@usH(i)8C~z%5vQfQl*?;`%WIX3 zte`$uiuI;?ozQ)~p&Od&Zb?y7y@B72sose9&{S_ithuS~K~89@HzNj9-HX7d`|z}; zV)ju}@d}(O7OPiMOX)32=dD8LZAwR0?Z(HcSNDFwe7nIs0o-b-ofu- z|M*TsgZ}YBM4DUbA>_bPJ1Gmj3uIv8cO&rWVLYvgS>>pS=R;}sz_0~0Z5BPEBpwwK z?@-+dUwCnp34ea^>M4H?63FN@8J0}W#5L95+ z4eYq^M_nh2Krf z^i{lvEz{Q!tM?05p8Kn(I1Ku$uOkNIeFK3{-^A0FFS8HI7x1#WtNj&yOOd`UNZ(PU zC;)82+)QuuT>*RAfQ3!$_asFX`98lJMSg(yP>~-Z)?ASvAtzMi$B03ZpCIt*r+8XL zn0-`{PIzUs@7RH|rk^R3p9_;;D3kO~5DW}uE6^{6@-v3=qY(9c2m9z=IazXWoCAkG zWQW(Q;m`+f==SyL7JOfyIVYAZ1cNmv*Pd+UUHO4*DPcE*`}(kd4`|sEMkXZ(vzyC= zvjRzMyl%qjF>oj$Ae@w`VgEYoF_UsBm+k9YmcV?<9I+7!1wLc5xj@w#HhP^B-pVE3 z1YKHRE2N75N|b7>;$7DDe=Pu=>6UG3O}_ys3j4PReEOZ>wQL6-q+$a%9y2m)(h2%K zvQhW`AcX&D2=nqyXlQPo|0FqaU6eZ4u|Fdpt~m{eT0Zm_q(I`oBJk;Nf-d{F!^}$D zGh8J3yCeaB3GlbGT@p#^{GOAno>{iFqsAeOc#1H z4856R08j=-l`f~_vVjABOMgNfT;+i13uo+G5^ zDrq^~xcxK&^|>kH&TS)*~6Q|LM|2`Ml}PI{RL@(LE0Z)hxx8o7^xHsgJaT?4wj2J z6Uc{kcL9gh#(n8SKF+9V^Pb{xL~eb3=@QwhNzDpxV_jst?u;2_wPsyNs; zNaYdXz>Tn-f+w^6WgNJ|si{OD!U&q_5Hraqarn@0tG9F+jvZ|gqQ7GDeF;S|CDS$87qE`*if#z_P|9V9kw88#+oH&v(Q z8n{S67Ar`)8#VCkl^f5HfjVoj{rYGQJ*lNx$CoGg4Q)`6MlW_F~ELHbl z;S{gBhe&Fq>K=*&TXnl_*)I_&9=EpQ&8MXjZ%NOJOU+H^VUj7HM2GXc8Tl>4duoRD zOlm{4e(1**;r_Lq!_G$H)PW2b_Xq?&9f_yyXjm#~W97gQ%eh=&j#8L3d{*~fj+O+K z?HIgA_Fj%fv~KTZ*viw19LOU?!2UQyeL5ab%buBq>~-~LyyBxS0E5a2LghrIBC9{+ zVW2Eo5;NXjA$TVlyl4T4LvR6{ESak0Dg15nnCGHlqeIMCg6g%=9QMGBI>6T)rG^Q6H` z;>2aOI+h&aVLx|c9zI||VtD|cmGC?OCmf*!cahSWp^M~?T>zQL=5ht@U$~=V%)Y+x z7%Yy27PCXkl9h6yB!_&_doqmelNg65BKF`Zpd4aR9KxB===efxbg>BDXrmr$qh0~% zOmBEWG^0yE9)`{!!0wRnYI%WpL3=K&TE88VXN76MVaheT&d^-52P89Y9wo#rXAb%B zARf&IMMMq~q0=A&Y%K`|9hovisWsv7oY(1gqC_dLyb8i=Sb53f-%bz>3}q|eCZS$5 z)E|M!YX_74<+4|;n;-KaDVr>nOKte}2{T;E1zx#K&a-M#1D8Gw%~ke)~x7q`pk1nfs53 zPVw?>>)v49za#*i>AwGh(o_aBI8FtDPp)uo`LA$BiE|l;Rf9wX&xl|qYrIy{Cx=9; zk`XtX65(o5Lq4j7Ox75SHX{L=jUw=Ai(qS&U`DYj!Qb~aFLoMJGM5UO%an|4Yc_`u z)QW!xg)hc<4lv*(=yFg&@97K4D-6kFAVS}B@iA^QUc^Ln1du)$gmkJhv9G44L8KZL z=t>~V0hiEsqv!QyXE(I-Re*+_11{UB5p*@+Q4H50@abASZGX<{OEKU>KWiJhP7*<% z2V(8OyI$~aP&`cyOl;@5TLtDu19KZNc~RJop=G2UjHsJ`+Mx%}V_%U>c(`;$Kwm~p zI6q`42k9CQzvqD1@tO8bB657V{$fdu4A)6#I_PI6(}Bsy$o+Y-7N9wGV{wN zMQRM)!tZ8?cq`t+)!A1dRzE^yb8?Nkjl*D>`IU&FJYI#sr`z$g<;d)%9L+)gxv+oS z`gDh4zgn>GRP1y!NLY#an}P6M0{o{iM$jmUw{Z$jYHJ$PE3S*}oLE`&D=%)JT|4u$WN1QqTrc#jN)-->AcP}my& zZOAcIU>uR!aEbCEM6m}Y=XdE{90^a> zy&KWywt5&jMzlVN_6VXrJ&LCljRgrsYjS4rJpcgaV}kj(Vm3K581;hp3hes~EVm4z z-1{X#mHPm{hsr&HXrSB&IT9-OAw-)i_hIBjl=}#xK7ABVs~igwRgTARbw~c`V}O8m z9~ab5D5^|y>%i)r{F4IwDFci^zh0qFON#3E8Gbj8{UqMQ`ukbLnyd3UxX!csP!X6o2&I>F9r7*gPVkUD?P6^!UOASK3g@@$k?D7Ul-zwW^9NRC7<`i zu;f}S^b?k5vChhCpt(YhKSCYE_l>gFiOHyr1MQGY7d)%{HD@-7uL6n~rvs6*WsWW% zp(Zfj9d*D5ArIiqXOH&t>-OXYy0MlV$Y)C!x+{|;e|m{I0H(OvWWF$j_2Gmbc3p-q zf-852?%xa29}H5%i2IL{5f@E~@c7_Q$cIOUBkn&V0kZrB zflq%GY#nhkBXP}e61sw088gv(PCh|@Q*M73ZqF*W^iGp)Fw#GS{yz=<84%lgBM(0Q zCF$ea=-`4q}f%ZnWEC9 zUvRb!CY~z%ry2gbD8kk5nT{6eF^9K>4g@wOq;mXu5Tgvm_Q-t z@Zw%ypG=K(ccQPa9Y;+Qn;p`PH(hx&G`he&GRu+mzCDCC1G+!vSJSR$!oGleLk9!NreGExH3Kg>hJLbNU9am0CaU;1O^5K}f0Xt$t z+8@b~dI18T4iFmZn#?rjng;-PB9qgBN~}eQEmUIZZD9rK+F5i`&<`@`hk$9rEV@Hg zsQVb8zQAP{YLU>0Piq%TYGhh_FcR#vwrG9f5P{+u)uDLvX^F(6)7n-^5sTAOemBG7 z!|)ysiw{Svept-8SaK|oGa5IM1koq1fIrN^{* z2$ma5RPe1Rr?h7>Xgxf>04tNg8Fr_bT*1lf__Z~5@<=>tg%FN=)Jc*W@u-uLU_Gj8 zl{`hDI@7JN-u4PbD}e;fPetItw>_5+Z5(JvCfiwz(KS(D&kkiAz@RQ5~o9+5qRXmi>7kYk#T)}@q1 z45IWSz^)CRRs-f4XkdHcoPaqBmM%aL93LqYU+#oqhgo`+Sp`ZF*Tp4qVo;`0IOvQn zHaoz3cm=-hMUId-s6k_LdIbxxg656k*vrVWB-Jz?9Ea(mL2zx-J`9O4jqO9tR-HWK zb^e!yEr2P^I*h=lO(J5;u+e~x7&baZ0U1#c8TxNmkHrUq>MzF8n{VnZB<)T~Xvf=~ zvZO}ZoeC0cyK}iUo-0t?lM&v0@+2PZ$*Pi~K3L;-Q}s9FJ?zOw5v#BHtT)&EEgS|t z*%)H5+ocG6x(rY2j?6xAN5ISeU$EdI%j3;@vhmDBmn$P*7+s-^c9tk?&sv2&-;0F$ zm4^CHx!&@O8@r`?OHp6a!`?Nvxn*M1r23#%@Se162Nn|^j>oo{8^217&{$1<>uFaDfOY|5CAtPF@P%s;;Dag2)*IC%8^&hy zh9lkU1?~m|r-x;&ow>2xDmifplnOiIjmU>%@nKm-qnnTd0bY#2r_(ejYi;^w0q9Jh^FruF_kudCd>;az-Xg48UKm#JCoZV4t$wTUe4F9PUs_CTWv;XL z3v}FCN}1d5w<8}8xIc)EUtshAprG_S5cu>?A*t1tMT%A1r69H4mc!h(PdcccLp}8Z_5Z8Eec#!h5}vm2%wwP-$#W=+RY1K;Ew)vMjqeDnI50DmUN!SYK>< z7o@W#i_`JA8Pc@FTgrsnAZ?6FrQ!(R4ryQNHJ9P<2ZVQg`1^#UMuxv1M1mdu-eQgN zA%WuI?}zc`(?=w3FGPxzL#PM4>PH1kj7=Zo_wcL9k0TmPN+FE_UWma%ite zYRZQ`1rU_MrxEz{89eP!nMD;(4$c@qDKMW^7_*nka(+%yRL;-yyBWKG0q^11{fme- zm-0)`phl3ol`N(ZkaD6=egSg;tlZrqi?-wK6T zlVmO*x!u~~cL0JNwv!9}9^la84+wnvBc9epS!hv#9by5RvOfvPpF@!P3t9dm8Ib~_ zzak~Sw_M2bH-4QV7qZ-C1^v4q@P#bT;?1XjNL;U^UK`&0E~m63mk!fEnbyK#7AJZu z%fAFY!rvGs;P-Dv(CeuuBL5$N!61{cZHZkuKQ! zrrfoTcZd5R-{4}$mdRDA)hjXOj#ee9D&YrGe6qk1xVrPd?KB0v>rEkbWvYnOXo}Zb z(@$f(&i^kWPX}w5cLoA{geZcx3>!VzprLsa0`P}7x6PO?(QN`qjB%H#+@Yq zo#|E2kHj<^^kA_$2z;6=#9N*(;?R%H9FDN}5H9l!mw8a3(PG?B?kNy)D=0M{i0p-Y zco?56tT#B#M-J548-Y*z2pJtoGi#K7eo?qO!rS3>i4dg~Ez_=H=2V>#-qgmmJT|EqiBfHUBQ19k4{9Pg}V|@*^ zN@`^IyA%m__ujw0BnI(|C|L5*4|e2>?TRzNhfDa{4C$_z2fmtJe^&R}jhPMW*Kd?xY`{sh2M%;+Nr<9OudG6$( z1KT<5j?NRh=Nq~W?KT&exkNZ}fKZ8Wb-n=kb?x?rNPxH(A@J#9!Pa)08O7S|Lt&Kd zD<$exvX=I5QRSZ0m z9mK%b17JpGneAQ~V_H66jFh2BlG#7Ehr86!JSfHm5&8vdyiuu&RE?&4z?!Zm06O-o z7n?RC3l8RKwm{enj0wV}2BGO8$;%`&E|wDFrr>hqqd>U{2@gs7 zNQ69BAi#HILP7nS8OHpY&y-DMYPwR1T_wb>R$_7zZ6d4&Rj(2BYYn=p8Yx4r-q%Uy z_^Muye4}cBNjD%7s%}N#(~UwwRb_@TRe78%&O$dS){6z}C5k1(V99O}{-px2H?Y@uhz`@*zEM#D<fB7QG!=5bOa2KD|Te zXgMoTU^8G^L z14==DRBEzW7nF;lpOB1*?({*V0lzSsa+y zj1fK~AWtfY9Qs}xIa9}9;BfmFSvU=+7!J<;IMhX-Rk{)JWrgc=LbFl)N3DfE&v<%d zeTR8|0k}}`iwJN%q;P5(HiEE9qG0^{@%~z|=u|UB-0hs8F9QmN^A(}+Ri(hi9w~;@ zZV?Rn8eq5RrMQ;6Bmc&$l&ms6q8 z)55Qzpn|(ZzQ=Gpp8P&uumL6DEyIR3%WS+>iv5R@-9QbtKuh=|$<&W|ST*`F5>Spm zL4Z&3Bv)t8oD0dBW!NJBOu&9_!1(g$@od9-{X*d4k|<3U=9kEa|M8LVW(KBbkPq2@ zg}|p@3o&h^Sd3UBB|lgeDG&OMBL7y9f2YXOjYmtZLBZb(_#X^7U#So%sM|c4vgF3} zHith7)cETC3HeZu7hfBFgZ_+MDEAix_|Qy9sd6krR5>(}Xe)+|hyG3A|E}=qeX!`V z9(QE6;-(s0%|Mtd@sJ?Oj^_&=j`QJe%w_nfwJIO=ag$;`T$A4;H0KccWTL3aznu(3 zY=Z=ikDOG*RK)&>a-vVJojWl?##|VJ)p}eYS14^R%NIFJ0So;2{oE1W9>K(}T#;LP z&=hzH&XpT}_}3I=_fU>L;g>g&6S6mwtin%Wnq&9jmy8MQ&)~!l|JJ9>8o?Krj@H$> zVO!On6~o2LtSzW&|3JP}wSS78|Mh=%-VQsnPexmye~Z-`jNJV=SNi`*rv6$%gX_{H z%vn$?c0u6NWIVYY<{w0A07dz78HH`ru7Weg;OKb2z9Mj&G*$BBvMDVVZyNGZX}LLx zBGYuFL$DbLu-_#_w7N3eXmtfLUz@r8m5vfhdN(1xyOQ2P8V$ynCB$YMV*1@zUEO9| z%#rNzZ7~=5P=~+!ir~^7NQNoqA;1Qb&`?t_)0ioEC^~U7LVGE>`9f}QB_~7JiSa^} zFUL|9I>&v4z`lk64_e1cRj4VQb*&k$JBTIo6 zAP(akfB^eZ%tL=6b(qCd<6H-MG5G6DU(d$*AJJG+i;BHa#7?T%|AXWU3R^ovGjU+c zrgp1Rw&Y#xpeo3GxH?bg(2I!ijUev623A zF=MejIuyyhw1hMF$kwW5o1^qvC3h+3?iE8-fWrjfa0Zw;P^ikOQ;(KOY8#$BC{68d zek~oN;SyHpkld4+7wD21!Iv_8h@UzH?Fc+sdj1{_dLAj@GYYv3_8X~6%MtJ1B{eH5 ztVc%)>d}lk%gUh=9)mQWj^&)W{8R3HM{EX^@MAO{bqd;XoH+w0{`s~%kB&z)GJwXx z7hI5sb;$Fw#Tt(1Q5W*dbON3}oyf4Md4bjXaiur3+~m;;<_+pT=knzt1Y- zYK0og0*F{kJ&n^QJ0&`uUuN>}%%BWLDs%?oEWeadrii1NMOurrZj?1N^vluRabWiF4lz5pkuv3{2Kx8zE8y|8-ysiUSYA!3_ z0Woi`Sf?INo|<#|YeTf2DW&E*_}Ojtm@zCV=N+d?XCwW_)PeYZqf)DmNBMH&iqPOdgm$pjwk(MF`BGUmzyh0q?9?FdvgIFy5QoxizIbEe$G9+DdXUZI04B8~9-^o+_xCB*UvrRJcqsXAM#Tp#gOQ6J!*`_=@sCTbIeAL4TpFUy{CYsW^Gsx^^GJKJjn`&vBni_rOD z^mUz3!q9VRFLr#|OIwm+6;D`4JMduFu@jPfkDii`JzEmNIQ#rK{Zw{65<6yUWmCy?W)kN?s*dsaDFWkSY58 zrU$9Tf@*V6DF7>!OX-}~68QbKKOi-BrWMy1*yJZtL$g(-z>^NjRh9Mp zLDN%-oR=-D44v%{o}LW zCe>H`S84KB&G*YxQ+e1t;;XT zjk;OabTsNr+o)^gm&%XKFP&c|zig^6pW@f&A$VL}e#NHzN=^A>Q-0;9{3=b=Jb3el zt)V;FOs^B&snNwS{-FK*3EE#10`kN*rrMmTHg~@OS|ih{GVS?XNVcIb7lR~PF^LicCYP*hDXU~A85G*ui(ax=ZY`j%W)sS5 zRp^-L4|39&WFbg4d&P3cB!8Vq{Rh@W`0G*()^o+6kB!0l`Nn_0yh#Y&WbJQ2!6T__ zIfGX$R6La_rkji9?A(OEAp$r>`x{XJC-+B(ZcL6HJ2tsR0UfqJ+2JJv^nhx6vXX~c zQPpgviXbAa1aMdrIAyBxG8GTuWTZZsDdq4#Ib+MsOuSXHQpRO+#pN(QaDy3r^aGdV^xDqC)AuU2?&NOD)GAC>IL7qa044qN@iP`VCzz$g6XTUC)H&_=fqHFavo-hvNBc6 z<@nlREvS0U9=TUca7b?tl?{o_JKJslnw8uzynbD_wVq*}+OntC6l~c-F+A8+p5J%p}p7@30t#d zI=n(_zEW#!awsKLwM3z!C`BWSiJ_8Lv>6HkQvzXSG8J8FL?L@m_|4Y@V;PT1x4lc@SL zs?B){>`d*aD6oAISnkbK)tzlsXQle^=6;t<&&vG`m8+fQ?+Uuzw7^BdgW73jtIFrHqJyW+)L}9>O4=`5j(o@=l}x~)UHiUeN<=EDv>y;Y z9F^?8D9kDI6Y=_1h z<1j}E4mXWa2aY4Of28F&B+hY^_K&t4qlx1f%W-UKKpD$v26Lo;oP*$aLogZyCusjf zOK?=2;3VyzOazfmdy1tv)x_*H$K_8qaY9G;&j7`l+CR%uoD`=xTl?n_MQ^kVW@A+1 zT+47?JW%I5h%Nw;oatW(o{O}9vE?~CG``Z7& z621`J~!QG7O20_{+E{eBNz2o+W*>8 zL|3l{f~xzL(u=E{huxUH!k{LwEwH6iPHb3{oe^6h=!KxszJzVH5jSkoBBXQ7b38a>u$l~-%vd>cD!?mZ|yJ~3$gnb#<@!Bs7#35oiz^3-~ zpkE$YtyVy4>4_|)uMG*cB73eRp4|tAN^sQ5UmQ+p>8$6P-o6p zqmhNk)p5|O4yhGMbfHMEN?eWX?v ziHOUZ#6FY7hkIV#e3G&OBO+x(*zvGT0pd`!5nw2y{#!R+ZHydLY=VPUnHY zD*J3EKHN4FNW|t0h=?u7PW3k*&()U5ruvntZOxuiTT!MzZaaCc$Zd^W&s9rp1K70L z1jw3(tXA71wX#S=T-J8%GhKXG77wfK84y`Jz>ddeM<9;a>;%}*)3BO>tX4CTT6!W2 z>BC`_V$Yq$lSM>kT{VkK3C4A}bRtFWZw!dUUC9n3w;Qsx$n8#X zq2fTmW*}|=?t_rk>R_ano0#I|5OE|9S{;SdiXh6kh@;u(81dodVbUa0a4aLD;5gWk2po^BL&XVzp@LQzd`ER6 za*%Km4qBaz)Jh=2xP(*K=T!0GiG;r4A`z!CCL&IUZNhK{OoxCo0Yd=IM05dl7V?mA zHV#^ygVahO!nlNU+2=g*;chU6_|IoR_%DDR3BrZQIy77a*mQ#_;Jz4Htu8@oxrr&{ z4wsTk+4C~-WChWs>(!juj`4ehrgB=btfMdnqoO_;8R>5zC0U`UK!L|qFEa<9Wd ztLu?kxkMbwrGa|```jo#ER=WiH!&a@ZiXFSJ8l8uka88yN zgMIE4AExI;^)3d4{%*3vMfDzJYm4f=l&LMM_aWz)c<%>nWYMDf0J2&=h}6m=5ph`$ zvCqTe!(%{})JGT*U5~eKA` zjCgX0q6_M?T>6|TjeowT&h$K&h~gJuo6htiOo!B$07Gj0GU{cZko*b`TD^+YN+$B| zl9TX!jXhr%PnI0*{cmvTn~~B^Qu-DHqV#RpM(H~+9ZKH?Y#J3es?~eQYV|%+tBqJ( z+CE^<55=>Gw!d@fN0Czce6K!cK(u`VJ2G>8imXH5XMl}9eAZW=BdgUHNUc6%a_Re$ zJ--sq9{RrK(r-*DEfM@xENT3fLDBdfY!kolVLJ5v02umeS5Q9!fY6_C(CTNTRwz-1 zLTS$Ug?)Y%AC|~-#%~OWfZt)q2ge^k96J64Y~n<7MlXyKtrkIQ>4_{(-K`kx&x+#1;&@VDi2@rvQ}rGI`QF#*W7Yr7!h4#VaLO=1`tPB>H(YX zqwCc;y>s!kaT9BDR1XZ?G+aIJ9g9*fbbc;jNK_ifwSvY8q0j zf;dAJ;VQf>du}J5++fjFcsiGEZ%S)BcZ%2!42swtVVj8U1k<5%24JYHT|vzR0HG-y zwAvY|6-tz$P-?kZ>_c&a4~I+k{(oac6zmE+(rtD_)}dl|z$RAM`!^v6347q6RT`<4 zK!kA#v)LyjKDDhog`t@-5s`&$!jOaM5a0oZfZE=_1$jtl#X+k)QY(Q7LkZ#dDzN7q z@$50a=5lG#l;Rhiz05CBFwQ7kg^)?9sLN z=F)vkX?$l$;o6r=MC*RAO}O@l=@5AUV2F%gMjZ$gk`KZGpR$o!$wb~=auS}0u;&8t z?9sdnx%ALTX%{Iyi~&)4IBcWz2$&9~M*=qC>;mIa$ZB;oQmc(vT-uId&tt{2hqmLm z^!P|AZ!k|_K(w6*J2FO3Le`=0WWYurZ7@$kR;yEyT7AUi(svqro-Up}^qs+_XPVO5 z_K@Ot7K5VkY}h7#=fHI6I~OqY)vln<0|24t91s;tHg&VQrTc$&4}<{1KR}PT9^*v z>i~loDQz&X#}V{5;GorwNG&~)#p!QipPR*pYtP%1TNn`bTVcm*e;W{oh}!|1+S3N} z4rH~u6RD*qvXDNUK<{GDyT!9dFS&HZF~wVUqmBIEd&@E%}< z^}nXd>U{`C%YT4_Rv#j@El+J2wmc1lzq8Lr;?r$OrO`frD0GBDHdeJd_j88(*>K*W%e@-uQ+~zcr zgJ3!&4h9T~(Tk`dz#w-h4q6REYUL7fD3?0oaQ0bDd{`(i*CQAZ4U5B$&x0d@IHW8A z*hGt#>m`xZYAK|ap2*_#OS8{1;=}axb0D=W146$XY!iazVLEtM0Bm^i(;&4XvRbW# z)bbKboHxlnD~k{FjwRkv3<&Qkup>QWRb(C9s{uCLW5GQdS*=z_YPpFi&RxeoW5kEK z`5x+6284SJ*rv|)Fde+(02^MqhuVNF?p`3Zyu=dc9nU@!#3!=mt;vWGPlO$B>$QM5 z_}2yuesq7jF}@CRP_Zr!TCIoFsvyo#MY!gz&z_USlVcEF^ColY2B!23aA3{*>;9<_ z^_&e^tORii+2LBZ5wf+lZewH|YuzS*5zfDSRn?{tik6;=gI1d%wJl9;7Pd4^Et|8? z7UI)waiWlI$t4o9tzerDzcoxphua1)BGhe-n+6new#7lK?T}hIL>|fs*SP8IxxILD z$BTZwu>+Ux7%Am1KX+n4l+J){l+J|dP?`d4hGr4kc1BjKSxBumVsUAs-)rGVDdO2f z+pb)?Tcng1wcQyIZB4KvQ`R2HI`pLh8-28>%|=$M3{tC)m|Xgr*)uDiJ@nG@QgD)~gNihi{N$q(7`&=kK+!AsR=psg>Y8S&c9qAI7j)uGxuxUu# z1G)@3&|i)NZb2cn^h6e?zmk2f5+80t{t4~X3<&!*u;abyS|AP)*8w)YnSMfhJ+fNe zfYj0xS)Bex_PI%X_;;`IzbB?fzL`r!%Pp`?ByNT25OEt|h@hX)#xJFAM+s!zfdg($ zA+@qdL|oQg>~pvH&`Q?}f7nb~?qNu@+zUG%m-~P?B;5}fl91A6)B`Y}<3Sv>dI+i2 zL9C$;8J3BJdRY7)VgES(#!7|$Z0)K{0QG0?_Nz|SsI~=A@AzK@! zPb1?Prq2LI{Qf$1QqMvWn(#Rs@XHsZwh5^f!X~8g{Q~>EC_b@oC@C^8F)opL8Mf)$ zufTM4q*nnW5V5a0Ujqgyuj8QA8%V7bA`Yd5%i5dl`IdP0Sk~U=(sv@Iym5P%0nzy$ z?8wILePkV4KL8A^_HM+7$ZGX>q*fm>x%7R+o*#>64}G6->8FuW{>8y(42ZtZVaLbi z7eE{mzXWU~(k~9aLRPD4_|)4+FR?doCxQJp#Bqm#$z+C4ltMBefz! zB620N!vH3ctp#vp%9sF-g6#<4Du8PNTvx4%ECRS14*2N{Qd8iyQIG~j@nM@X#-;tW+t9P!ueYCL;R5KoR{ zbiG`YODCGr$Tu?-%e5F5xog8V)ABkn9Xi(q44si{sPzCr!umL9H3_K|OSIj^CgC}m zJvR`~9*w>smrjY4@~pfO10r){*pXRz6J#AyHwA1uC4HQpiY)GoAhr64$)#^|_S`}| zd+6JeOSdwm)G6^04hrPf42i;R$PPQ@G-PX?a$CxnPPrXyN2i<)*mO!wLJ@*&S9y7-QTza4>#R15ieh;x7l_W&V4GN;4%4CW48YJByNWs!AOd<8 z4qBa!)Cwl*P%sU_bJ*ux@nNZa5A!?*M8x^9RM9J!-%86(1fIcyVzD_}Z^uLKNY8hE&)ausr*zZwUvu0d+)i7ZZkE&E(2 zK3sdgqjEh1!hQqnc{or0rMLFxY8dW3Hj@1_UAZ;GosLNUac}jSIPteeM^ZuopbQfJk@{c03Lb z0dXjK7;vN)Jc6uNk0Q17L>8xijC~##AExJTN1k9n=%0jbBJdPU2k+B>4KIB=@(i+C zJ&V-x5=)%-Ire#8eE370`77BM7!u|eVaF@}5)g-gmjOcn?Wk}W^$N1k@hT2ly@u54 zAl6Vvxa)YGJ>L*djzV+~{3e&aWlHw}3GF)U^WX3&y#Msm=ctdq&2l78?~ontO5R1b zwkvrL8ON^VeZYv=U!XGT14uz@eTV~YeIT{1MR5;Xi>Azv*ym&MiOgA_Fe1VD6t?NE zpTTtWmd^pB?q<&V0y)rsiGx;OA+_{G7N`H3eZCQ&aL)Rc0b&0RcD&1e55ytj2f${` z(46%nvReIw)Y21Koc?F_`9*yA_Ll8~)FFOlTvYr9+r;2^m=5|s0E3?Hk=cu=KY>9? zFYM*;H$OCHZiicdIe^-_#KFH5VDM8n#GJJ>a!|1h4*0DMQmcYELlxniwH$jcFP=T-tQEL)MN@jQnX|&j zKmK(eQAvGyCDtwROp+Z=ZYv{Oo7_er(N)ww+0lzPr2 zMn%J9*d_!Uz;uvr2pHt_?Ymq;O#uQK8{weU#z?IUB8|(~gnc#@pKuPG%77@?40b#U zn*(tO*#fYM0?mP2BCFL_NG&~)#p$W+s>G|9iB&C=_sqYC@8B0o?k?+&4mo!mOxMNwNKzQ&%|!_0zAq*gC~8L zldX8#GafTt$axuht}neL0BAMv67tdmeEJ{_MSfav84uPj&&89W`B}iTXPc_co}J7U zAPA4f#1p#lv@*Ov08d6%#jXUuo`S^C^N-CFgy~7s5HNdoXIbG?`|N2vS=78#A;iVnS(x?o4%_GfY1_iaL{Tl zpU=-voeL`SiM|wI(rUw_%l5=+(^Erg@5-U~#i;pw#l4WG1_0o<#VF0--UJR0 zy4sq{#k4&uQ2PLGQu|WjVzGDc@b&iN(*3D)WVch(>~H`(97qlWvjurqN1zU3^kAek zouvlb*Z$DM%he%(@uHtvU25+LQVaOBg-A(#ds*StA?i?eA5h52+kn(z$m4}TL!x2> zbvU1T1f4p>>JWuT0>f|LsAPDdBvW}B?-jz@5U8X1v}34n0N!>%i%_7BMKMnWBj^0GP}Dekb6Z)${%XPQ15qLy<5bs|cjb8##kWtGF5k=k($uaqr# zfjS9g(^G?0OBN^KElE{XR3`&VEtjuU+9x$OR?20(oT=bdS{ll#wJ~35D>kZA$YUVl zmi356or?SdylBa5r<&ry_oXbZeHveTD4vR6XiuAGvIpvPMu$|&#Aqd+K^N?cXSS;@ zbtc(EikVVt74K`pi8)W5MObgIq|PQ|AidWGOI};MItO{u&ux@0dh@)ZIu{t;Lo^sQ z#XELNyuz#V*fEjM6f4Htu}tGoVtdxi+P;|yfO=e zs~VUnUQ3tmo9c(R7qk>w)pdMHZu4vU z$qgu6kXiv%ZL7@&VK++i`wP^Ka9WsJ)GN(XH}S=!;_ZP~&7qcUMRha7!@bV-GWsz+ zR#D;AB7wSv@evfgpxVr@kup)am9IHSUY(Vuv7&Bc=bOOL#5tnIBcNB7XOUL~{rs3UY@lL89AjiI`nOi{8gJkzNFE~>VA(vk!H4KwY z1uv_i@rV~gRMf-37o-NZdYBLCq3h}q0MqeSGwN4i6dz@DaL|TbXWFmgO+A5n4A{cd zVCp`#x#MwQsg=y!(b3V-(B4(amrFc%&>PF(95kvY$O|h#sgmhT=kW@hBE1GjJxOq% zV!70+o+5Mkc=Wmr!KdLehlj>cnt{_{xSpYtdlz!*Su%!VEJU0AIe-gO%gM0!iXOcx zB0yLx`LucSnR*^B7(}K$cyI*j1%OSdC3&P2N_dq9zh}-XQOo7jizr=?8iW_Qp|u5i z2@tIh9Ln09{xV&=+MHUV`zpqJc=ZaM)QjJ>re1}Oo8Uyit literal 0 HcmV?d00001 diff --git a/doc/build/html/.buildinfo b/doc/build/html/.buildinfo new file mode 100644 index 000000000..1e9f8c054 --- /dev/null +++ b/doc/build/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 791935c112817244a57f17b4b8757410 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/doc/build/html/_sources/builders.txt b/doc/build/html/_sources/builders.txt new file mode 100644 index 000000000..d6139ae1a --- /dev/null +++ b/doc/build/html/_sources/builders.txt @@ -0,0 +1,7 @@ +DyNet Builders +============== + +Builders combine together various operations to implement more +complicated things such as recurrent and LSTM networks + +TODO: Create documentation diff --git a/doc/build/html/_sources/commandline.txt b/doc/build/html/_sources/commandline.txt new file mode 100644 index 000000000..476a8e19c --- /dev/null +++ b/doc/build/html/_sources/commandline.txt @@ -0,0 +1,23 @@ +DyNet Command Line Options +========================== + +All programs using DyNet have a few command line options. These must be +specified at the very beginning of the command line, before other +options. + +- ``--dynet-mem NUMBER``: DyNet runs by default with 512MB of memory + each for the forward and backward steps, as well as parameter + storage. You will often want to increase this amount. By setting + NUMBER here, DyNet will allocate more memory. Note that you can also + individually set the amount of memory for forward calculation, + backward calculation, and parameters by using comma separated + variables ``--dynet-mem FOR,BACK,PARAM``. This is useful if, for + example, you are performing testing and don't need to allocate any + memory for backward calculation. +- ``--dynet-l2 NUMBER``: Specifies the level of l2 regularization to + use (default 1e-6). +- ``--dynet-gpus NUMBER``: Specify how many GPUs you want to use, if + DyNet is compiled with CUDA. Currently, only one GPU is supported. +- ``--dynet-gpu-ids X,Y,Z``: Specify the GPUs that you want to use by + device ID. Currently only one GPU is supported, but if you use this + command you can select which one to use. diff --git a/doc/build/html/_sources/index.txt b/doc/build/html/_sources/index.txt new file mode 100644 index 000000000..18a26d54e --- /dev/null +++ b/doc/build/html/_sources/index.txt @@ -0,0 +1,37 @@ +.. Dynet documentation master file, created by + sphinx-quickstart on Thu Oct 13 16:13:12 2016. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Dynet documentation +================================= + +You can find information about how to install/use DyNet in general below: + +.. toctree:: + :maxdepth: 2 + + install + python + commandline + tutorial + +The following can be referenced when implementing your models in DyNet: + +.. toctree:: + :maxdepth: 2 + + operations + builders + optimizers + minibatch + multiprocessing + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/doc/build/html/_sources/install.txt b/doc/build/html/_sources/install.txt new file mode 100644 index 000000000..fa23a2470 --- /dev/null +++ b/doc/build/html/_sources/install.txt @@ -0,0 +1,156 @@ +Building/Installing +=================== + +How to build DyNet and link it with your programs + +Prerequisites +------------- + +DyNet relies on a number of external libraries including Boost, cmake, +Eigen, and mercurial (to install Eigen). Boost, cmake, and mercurial can +be installed from standard repositories, for example on Ubuntu linux: + +:: + + sudo apt-get install libboost-all-dev cmake mercurial + +To compile DyNet you also need the `development version of the Eigen +library `__. **If you use any of the +released versions, you may get assertion failures or compile errors.** +If you don't have Eigen installed already, you can get it easily using +the following command: + +:: + + hg clone https://bitbucket.org/eigen/eigen/ + +Building +-------- + +To get and build DyNet, clone the repository + +:: + + git clone https://github.com/clab/dynet.git + +then enter the directory and use ```cmake`` `__ +to generate the makefiles + +:: + + cd dynet + mkdir build + cd build + cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen + +Then compile, where "2" can be replaced by the number of cores on your +machine + +:: + + make -j 2 + +To see that things have built properly, you can run + +:: + + ./examples/xor + +which will train a multilayer perceptron to predict the xor function. + +Compiling/linking External Programs +----------------------------------- + +When you want to use DyNet in an external program, you will need to add +the ``dynet`` directory to the compile path: + +:: + + -I/path/to/dynet + +and link with the dynet library: + +:: + + -L/path/to/dynet/build/dynet -ldynet + +Debugging build problems +------------------------ + +If you have a build problem and want to debug, please run + +:: + + make clean + make VERBOSE=1 &> make.log + +then examine the commands in the ``make.log`` file to see if anything +looks fishy. If you would like help, send this ``make.log`` file via the +"Issues" tab on github, or to the dynet-users mailing list. + +Build options +------------- + +GPU (CUDA) support +~~~~~~~~~~~~~~~~~~ + +``dynet`` supports running programs on GPUs with CUDA. If you have CUDA +installed, you can build DyNet with GPU support by adding +``-DBACKEND=cuda`` to your cmake options. This will result in three +libraries named "libdynet," "libgdynet," and "libdynetcuda" being +created. When you want to run a program on CPU, you can link to the +"libdynet" library as shown above. When you want to run a program on +GPU, you can link to the "libgdynet" and "libdynetcuda" libraries. + +:: + + -L/path/to/dynet/build/dynet -lgdynet -ldynetcuda + +(Eventually you will be able to use a single library to run on either +CPU or GPU, but this is not fully implemented yet.) + +Non-standard Boost location +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``dynet`` supports boost, and will find it if it is in the standard +location. If boost is in a non-standard location, say ``$HOME/boost``, +you can specify the location by adding the following to your cmake +options: + +:: + + -DBOOST_ROOT:PATHNAME=$HOME/boost -DBoost_LIBRARY_DIRS:FILEPATH=$HOME/boost/lib + -DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE + +Note that you will also have to set your ``LD_LIBRARY_PATH`` to point to +the ``boost/lib`` directory. + +Building for Windows +~~~~~~~~~~~~~~~~~~~~ + +DYNET has been tested to build in Windows using Microsoft Visual Studio +2015. You may be able to build with MSVC 2013 by slightly modifying the +instructions below. + +First, install Eigen following the above instructions. + +Second, install `Boost `__ for your compiler and +platform. Follow the instructions for compiling Boost or just download +the already-compiled binaries. + +To generate the MSVC solution and project files, run +`cmake `__, pointing it to the location you +installed Eigen and Boost (for example, at c:and c:\_1\_61\_0): + +:: + + mkdir build + cd build + cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64" + +This will generate dynet.sln and a bunch of \*.vcxproj files (one for +the DYNET library, and one per example). You should be able to just open +dynet.sln and build all. **Note: multi-process functionality is +currently not supported in Windows, so you will not be able to build +rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to +this project** diff --git a/doc/build/html/_sources/minibatch.txt b/doc/build/html/_sources/minibatch.txt new file mode 100644 index 000000000..77d03a8e6 --- /dev/null +++ b/doc/build/html/_sources/minibatch.txt @@ -0,0 +1,4 @@ +Mini-batching in DyNet +====================== + +How to perform minibatching to improve efficiency diff --git a/doc/build/html/_sources/multiprocessing.txt b/doc/build/html/_sources/multiprocessing.txt new file mode 100644 index 000000000..cac087f60 --- /dev/null +++ b/doc/build/html/_sources/multiprocessing.txt @@ -0,0 +1,6 @@ +Multi-processing in DyNet +========================= + +How to perform processing on multiple threads + +(TODO: create doc) diff --git a/doc/build/html/_sources/operations.txt b/doc/build/html/_sources/operations.txt new file mode 100644 index 000000000..f1937ba70 --- /dev/null +++ b/doc/build/html/_sources/operations.txt @@ -0,0 +1,6 @@ +DyNet Operations +================ + +The various operations that you can use in building a DyNet graph + +TODO: Create documentation diff --git a/doc/build/html/_sources/optimizers.txt b/doc/build/html/_sources/optimizers.txt new file mode 100644 index 000000000..bcb2c05d9 --- /dev/null +++ b/doc/build/html/_sources/optimizers.txt @@ -0,0 +1,8 @@ +DyNet Optimizers +================ + +The various optimizers that you can use to tune your parameters + +.. doxygenstruct:: dynet::SimpleSGDTrainer + +.. doxygenstruct:: dynet::MomentumSGDTrainer \ No newline at end of file diff --git a/doc/build/html/_sources/python.txt b/doc/build/html/_sources/python.txt new file mode 100644 index 000000000..0cdb0206d --- /dev/null +++ b/doc/build/html/_sources/python.txt @@ -0,0 +1,189 @@ +Installing the Python DyNet module. +=================================== + +(for instructions on installing on a computer with GPU, see below) + +Python bindings to DyNet are currently only supported under python 2. + +TL;DR +----- + +(see below for the details) + +.. code:: bash + + # Installing python DyNet on a machine with python 2.7: + + pip install cython # if you don't have it already. + mkdir dynet-base + cd dynet-base + # getting dynet and eigen + git clone https://github.com/clab/dynet.git + hg clone https://bitbucket.org/eigen/eigen + cd dynet + mkdir build + cd build + # without GPU support: + cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` + # or with GPU support: + cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` -DBACKEND=cuda + + make -j 2 # replace 2 with the number of available cores + cd python + python setup.py install # or `python setup.py install --user` for a user-local install. + +Detailed Instructions: +---------------------- + +First, get DyNet: + +.. code:: bash + + cd $HOME + mkdir dynet-base + cd dynet-base + git clone https://github.com/clab/dynet.git + cd dynet + git submodule init # To be consistent with DyNet's installation instructions. + git submodule update # To be consistent with DyNet's installation instructions. + +Then get Eigen: + +.. code:: bash + + cd $HOME + cd dynet-base + hg clone https://bitbucket.org/eigen/eigen/ + +We also need to make sure the ``cython`` module is installed. (you can +replace ``pip`` with your favorite package manager, such as ``conda``, +or install within a virtual environment) + +.. code:: bash + + pip install cython + +To simplify the following steps, we can set a bash variable to hold +where we have saved the main directories of DyNet and Eigen. In case you +have gotten DyNet and Eigen differently from the instructions above and +saved them in different location(s), these variables will be helpful: + +.. code:: bash + + PATH_TO_DYNET=$HOME/dynet-base/dynet/ + PATH_TO_EIGEN=$HOME/dynet-base/eigen/ + +Compile DyNet. + +This is pretty much the same process as compiling DyNet, with the +addition of the ``-DPYTHON=`` flag, pointing to the location of your +python interpreter. + +If boost is installed in a non-standard location, you should add the +corresponding flags to the ``cmake`` commandline, see the `DyNet +installation instructions page `__. + +.. code:: bash + + cd $PATH_TO_DYNET + PATH_TO_PYTHON=`which python` + mkdir build + cd build + cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON + make -j 2 + +Assuming that the ``cmake`` command found all the needed libraries and +didn't fail, the ``make`` command will take a while, and compile dynet +as well as the python bindings. You can change ``make -j 2`` to a higher +number, depending on the available cores you want to use while +compiling. + +You now have a working python binding inside of ``build/dynet``. To +verify this is working: + +.. code:: bash + + cd $PATH_TO_DYNET/build/python + python + +then, within python: + +.. code:: bash + + import dynet as dy + print dy.__version__ + model = dy.Model() + +In order to install the module so that it is accessible from everywhere +in the system, run the following: + +.. code:: bash + + cd $PATH_TO_DYNET/build/python + python setup.py install --user + +(the ``--user`` switch will install the module in your local +site-packages, and works without root privilages. To install the module +to the system site-packages (for all users), run +``python setup.py install`` without this switch) + +You should now have a working python binding (the dynet module). + +Note however that the installation relies on the compiled dynet library +being in ``$PATH_TO_DYNET/build/dynet``, so make sure not to move it +from there. + +Now, check that everything works: + +.. code:: bash + + # check that it works: + cd $PATH_TO_DYNET + cd pyexamples + python xor.py + python rnnlm.py rnnlm.py + +Alternatively, if the following script works for you, then your +installation is likely to be working: + +:: + + from dynet import * + model = Model() + +Installing with GPU support +--------------------------- + +For installing on a computer with GPU, first install CUDA. The following +instructions assume CUDA is installed. + +The installation process is pretty much the same, while adding the +``-DBACKEND=cuda`` flag to the ``cmake`` stage: + +.. code:: bash + + cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON -DBACKEND=cuda + +(if CUDA is installed in a non-standard location and ``cmake`` cannot +find it, you can specify also +``-DCUDA_TOOLKIT_ROOT_DIR=/path/to/cuda``.) + +Now, build the python modules (as above, we assume cython is installed): + +After running ``make -j 2``, you should have the files ``_dynet.so`` and +``_gdynet.so`` in the ``build/python`` folder. + +As before, ``cd build/python`` followed by +``python setup.py install --user`` will install the module. + +Using the GPU: +============== + +In order to use the GPU support, you can either: + +- Use ``import _gdynet as dy`` instead of ``import dynet as dy`` +- Or, (preferred), ``import dynet`` as usual, but use the commandline + switch ``--dynet-gpu`` or the GPU switches detailed + `here `__ when invoking the program. This option lets + the same code work with either the GPU or the CPU version depending + on how it is invoked. diff --git a/doc/build/html/_sources/tutorial.txt b/doc/build/html/_sources/tutorial.txt new file mode 100644 index 000000000..920cbf17f --- /dev/null +++ b/doc/build/html/_sources/tutorial.txt @@ -0,0 +1,51 @@ +DyNet Tutorial +============== + +An illustration of how models are trained (for a simple logistic +regression model) is below: + +.. code:: cpp + + // *** First, we set up the structure of the model + // Create a model, and an SGD trainer to update its parameters. + Model mod; + SimpleSGDTrainer sgd(&mod); + // Create a "computation graph," which will define the flow of information. + ComputationGraph cg; + // Initialize a 1x3 parameter vector, and add the parameters to be part of the + // computation graph. + Expression W = parameter(cg, mod.add_parameters({1, 3})); + // Create variables defining the input and output of the regression, and load them + // into the computation graph. Note that we don't need to set concrete values yet. + vector x_values(3); + Expression x = input(cg, {3}, &x_values); + dynet::real y_value; + Expression y = input(cg, &y_value); + // Next, set up the structure to multiply the input by the weight vector, then run + // the output of this through a logistic sigmoid function (logistic regression). + Expression y_pred = logistic(W*x); + // Finally, we create a function to calculate the loss. The model will be optimized + // to minimize the value of the final function in the computation graph. + Expression l = binary_log_loss(y_pred, y); + // We are now done setting up the graph, and we can print out its structure: + cg.print_graphviz(); + + // *** Now, we perform a parameter update for a single example. + // Set the input/output to the values specified by the training data: + x_values = {0.5, 0.3, 0.7}; + y_value = 1.0; + // "forward" propagates values forward through the computation graph, and returns + // the loss. + dynet::real loss = as_scalar(cg.forward(l)); + // "backward" performs back-propagation, and accumulates the gradients of the + // parameters within the "Model" data structure. + cg.backward(l); + // "sgd.update" updates parameters of the model that was passed to its constructor. + // Here 1.0 is the scaling factor that allows us to control the size of the update. + sgd.update(1.0); + +Note that this very simple example that doesn't cover things like memory +initialization, reading/writing models, recurrent/LSTM networks, or +adding biases to functions. The best way to get an idea of how to use +DyNet for real is to look in the ``example`` directory, particularly +starting with the simplest ``xor`` example. diff --git a/doc/build/html/_static/ajax-loader.gif b/doc/build/html/_static/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..61faf8cab23993bd3e1560bff0668bd628642330 GIT binary patch literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nno%(3)e{?)x>&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW zW@Cw{|b%Y*pl8F?4B9 zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN literal 0 HcmV?d00001 diff --git a/doc/build/html/_static/basic.css b/doc/build/html/_static/basic.css new file mode 100644 index 000000000..967e36ce0 --- /dev/null +++ b/doc/build/html/_static/basic.css @@ -0,0 +1,537 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox input[type="text"] { + width: 170px; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + width: 30px; +} + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable dl, table.indextable dd { + margin-top: 0; + margin-bottom: 0; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- general body styles --------------------------------------------------- */ + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.field-list ul { + padding-left: 1em; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.field-list td, table.field-list th { + border: 0 !important; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, .highlighted { + background-color: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.optional { + font-size: 1.3em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +tt.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +tt.descclassname { + background-color: transparent; +} + +tt.xref, a tt { + background-color: transparent; + font-weight: bold; +} + +h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/doc/build/html/_static/comment-bright.png b/doc/build/html/_static/comment-bright.png new file mode 100644 index 0000000000000000000000000000000000000000..551517b8c83b76f734ff791f847829a760ad1903 GIT binary patch literal 3500 zcmV;d4O8-oP)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RV2niQ93PPz|JOBU!-bqA3 zR5;6pl1pe^WfX zkSdl!omi0~*ntl;2q{jA^;J@WT8O!=A(Gck8fa>hn{#u{`Tyg)!KXI6l>4dj==iVKK6+%4zaRizy(5eryC3d2 z+5Y_D$4}k5v2=Siw{=O)SWY2HJwR3xX1*M*9G^XQ*TCNXF$Vj(kbMJXK0DaS_Sa^1 z?CEa!cFWDhcwxy%a?i@DN|G6-M#uuWU>lss@I>;$xmQ|`u3f;MQ|pYuHxxvMeq4TW;>|7Z2*AsqT=`-1O~nTm6O&pNEK?^cf9CX= zkq5|qAoE7un3V z^yy=@%6zqN^x`#qW+;e7j>th{6GV}sf*}g7{(R#T)yg-AZh0C&U;WA`AL$qz8()5^ zGFi2`g&L7!c?x+A2oOaG0c*Bg&YZt8cJ{jq_W{uTdA-<;`@iP$$=$H?gYIYc_q^*$ z#k(Key`d40R3?+GmgK8hHJcwiQ~r4By@w9*PuzR>x3#(F?YW_W5pPc(t(@-Y{psOt zz2!UE_5S)bLF)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RV2oe()A>y0J-2easEJ;K` zR5;6Jl3z%jbr{D#&+mQTbB>-f&3W<<%ayjKi&ZjBc2N<@)`~{dMXWB0(ajbV85_gJ zf(EU`iek}4Bt%55ix|sVMm1u8KvB#hnmU~_r<Ogd(A5vg_omvd-#L!=(BMVklxVqhdT zofSj`QA^|)G*lu58>#vhvA)%0Or&dIsb%b)st*LV8`ANnOipDbh%_*c7`d6# z21*z~Xd?ovgf>zq(o0?Et~9ti+pljZC~#_KvJhA>u91WRaq|uqBBKP6V0?p-NL59w zrK0w($_m#SDPQ!Z$nhd^JO|f+7k5xca94d2OLJ&sSxlB7F%NtrF@@O7WWlkHSDtor zzD?u;b&KN$*MnHx;JDy9P~G<{4}9__s&MATBV4R+MuA8TjlZ3ye&qZMCUe8ihBnHI zhMSu zSERHwrmBb$SWVr+)Yk2k^FgTMR6mP;@FY2{}BeV|SUo=mNk<-XSOHNErw>s{^rR-bu$@aN7= zj~-qXcS2!BA*(Q**BOOl{FggkyHdCJi_Fy>?_K+G+DYwIn8`29DYPg&s4$}7D`fv? zuyJ2sMfJX(I^yrf6u!(~9anf(AqAk&ke}uL0SIb-H!SaDQvd(}07*qoM6N<$g1Ha7 A2LJ#7 literal 0 HcmV?d00001 diff --git a/doc/build/html/_static/comment.png b/doc/build/html/_static/comment.png new file mode 100644 index 0000000000000000000000000000000000000000..92feb52b8824c6b0f59b658b1196c61de9162a95 GIT binary patch literal 3445 zcmV-*4T|!KP)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RV2nzr)JMUJvzW@LNr%6OX zR5;6Zk;`k`RTRfR-*ac2G}PGmXsUu>6ce?Lsn$m^3Q`48f|TwQ+_-Qh=t8Ra7nE)y zf@08(pjZ@22^EVjG*%30TJRMkBUC$WqZ73uoiv&J=APqX;!v%AH}`Vx`999MVjXwy z{f1-vh8P<=plv&cZ>p5jjX~Vt&W0e)wpw1RFRuRdDkwlKb01tp5 zP=trFN0gH^|L4jJkB{6sCV;Q!ewpg-D&4cza%GQ*b>R*=34#dW;ek`FEiB(vnw+U# zpOX5UMJBhIN&;D1!yQoIAySC!9zqJmmfoJqmQp}p&h*HTfMh~u9rKic2oz3sNM^#F zBIq*MRLbsMt%y{EHj8}LeqUUvoxf0=kqji62>ne+U`d#%J)abyK&Y`=eD%oA!36<)baZyK zXJh5im6umkS|_CSGXips$nI)oBHXojzBzyY_M5K*uvb0_9viuBVyV%5VtJ*Am1ag# zczbv4B?u8j68iOz<+)nDu^oWnL+$_G{PZOCcOGQ?!1VCefves~rfpaEZs-PdVYMiV z98ElaJ2}7f;htSXFY#Zv?__sQeckE^HV{ItO=)2hMQs=(_ Xn!ZpXD%P(H00000NkvXXu0mjf= 0 && !jQuery(node.parentNode).hasClass(className)) { + var span = document.createElement("span"); + span.className = className; + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this); + }); + } + } + return this.each(function() { + highlight(this); + }); +}; + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated == 'undefined') + return string; + return (typeof translated == 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated == 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('

') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) == 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this == '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); diff --git a/doc/build/html/_static/down-pressed.png b/doc/build/html/_static/down-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..6f7ad782782e4f8e39b0c6e15c7344700cdd2527 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yM+OLB!qm#z$3ZNi+iKnkC`z>}Z23@f-Ava~9&<9T!#}JFtXD=!G zGdl{fK6ro2OGiOl+hKvH6i=D3%%Y^j`yIkRn!8O>@bG)IQR0{Kf+mxNd=_WScA8u_ z3;8(7x2){m9`nt+U(Nab&1G)!{`SPVpDX$w8McLTzAJ39wprG3p4XLq$06M`%}2Yk zRPPsbES*dnYm1wkGL;iioAUB*Or2kz6(-M_r_#Me-`{mj$Z%( literal 0 HcmV?d00001 diff --git a/doc/build/html/_static/down.png b/doc/build/html/_static/down.png new file mode 100644 index 0000000000000000000000000000000000000000..3003a88770de3977d47a2ba69893436a2860f9e7 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yM+OLB!qm#z$3ZNi+iKnkC`z>}xaV3tUZ$qnrLa#kt978NlpS`ru z&)HFc^}^>{UOEce+71h5nn>6&w6A!ieNbu1wh)UGh{8~et^#oZ1# z>T7oM=FZ~xXWnTo{qnXm$ZLOlqGswI_m2{XwVK)IJmBjW{J3-B3x@C=M{ShWt#fYS9M?R;8K$~YwlIqwf>VA7q=YKcwf2DS4Zj5inDKXXB1zl=(YO3ST6~rDq)&z z*o>z)=hxrfG-cDBW0G$!?6{M<$@{_4{m1o%Ub!naEtn|@^frU1tDnm{r-UW|!^@B8 literal 0 HcmV?d00001 diff --git a/doc/build/html/_static/file.png b/doc/build/html/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..d18082e397e7e54f20721af768c4c2983258f1b4 GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$HyOL$D9)yc9|lc|nKf<9@eUiWd>3GuTC!a5vdfWYEazjncPj5ZQX%+1 zt8B*4=d)!cdDz4wr^#OMYfqGz$1LDFF>|#>*O?AGil(WEs?wLLy{Gj2J_@opDm%`dlax3yA*@*N$G&*ukFv>P8+2CBWO(qz zD0k1@kN>hhb1_6`&wrCswzINE(evt-5C1B^STi2@PmdKI;Vst0PQB6!2kdN literal 0 HcmV?d00001 diff --git a/doc/build/html/_static/jquery.js b/doc/build/html/_static/jquery.js new file mode 100644 index 000000000..f2e82ed9d --- /dev/null +++ b/doc/build/html/_static/jquery.js @@ -0,0 +1,9404 @@ +/*! + * jQuery JavaScript Library v1.7.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Wed Jul 30 14:06:55 UTC 2014 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = ( context ? context.ownerDocument || context : document ); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.7.2", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.add( fn ); + + return this; + }, + + eq: function( i ) { + i = +i; + return i === -1 ? + this.slice( i ) : + this.slice( i, i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.fireWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).off( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery.Callbacks( "once memory" ); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array, i ) { + var len; + + if ( array ) { + if ( indexOf ) { + return indexOf.call( array, elem, i ); + } + + len = array.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in array && array[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, fn, key, value, chainable, emptyGet, pass ) { + var exec, + bulk = key == null, + i = 0, + length = elems.length; + + // Sets many values + if ( key && typeof key === "object" ) { + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); + } + chainable = 1; + + // Sets one value + } else if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = pass === undefined && jQuery.isFunction( value ); + + if ( bulk ) { + // Bulk operations only iterate when executing function values + if ( exec ) { + exec = fn; + fn = function( elem, key, value ) { + return exec.call( jQuery( elem ), value ); + }; + + // Otherwise they run against the entire set + } else { + fn.call( elems, value ); + fn = null; + } + } + + if ( fn ) { + for (; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + } + + chainable = 1; + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +return jQuery; + +})(); + + +// String to Object flags format cache +var flagsCache = {}; + +// Convert String-formatted flags into Object-formatted ones and store in cache +function createFlags( flags ) { + var object = flagsCache[ flags ] = {}, + i, length; + flags = flags.split( /\s+/ ); + for ( i = 0, length = flags.length; i < length; i++ ) { + object[ flags[i] ] = true; + } + return object; +} + +/* + * Create a callback list using the following parameters: + * + * flags: an optional list of space-separated flags that will change how + * the callback list behaves + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible flags: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( flags ) { + + // Convert flags from String-formatted to Object-formatted + // (we check in cache first) + flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; + + var // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = [], + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Add one or several callbacks to the list + add = function( args ) { + var i, + length, + elem, + type, + actual; + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + // Inspect recursively + add( elem ); + } else if ( type === "function" ) { + // Add if not in unique mode and callback is not in + if ( !flags.unique || !self.has( elem ) ) { + list.push( elem ); + } + } + } + }, + // Fire callbacks + fire = function( context, args ) { + args = args || []; + memory = !flags.memory || [ context, args ]; + fired = true; + firing = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { + memory = true; // Mark as halted + break; + } + } + firing = false; + if ( list ) { + if ( !flags.once ) { + if ( stack && stack.length ) { + memory = stack.shift(); + self.fireWith( memory[ 0 ], memory[ 1 ] ); + } + } else if ( memory === true ) { + self.disable(); + } else { + list = []; + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + var length = list.length; + add( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away, unless previous + // firing was halted (stopOnFalse) + } else if ( memory && memory !== true ) { + firingStart = length; + fire( memory[ 0 ], memory[ 1 ] ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + var args = arguments, + argIndex = 0, + argLength = args.length; + for ( ; argIndex < argLength ; argIndex++ ) { + for ( var i = 0; i < list.length; i++ ) { + if ( args[ argIndex ] === list[ i ] ) { + // Handle firingIndex and firingLength + if ( firing ) { + if ( i <= firingLength ) { + firingLength--; + if ( i <= firingIndex ) { + firingIndex--; + } + } + } + // Remove the element + list.splice( i--, 1 ); + // If we have some unicity property then + // we only need to do this once + if ( flags.unique ) { + break; + } + } + } + } + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + if ( list ) { + var i = 0, + length = list.length; + for ( ; i < length; i++ ) { + if ( fn === list[ i ] ) { + return true; + } + } + } + return false; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory || memory === true ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( stack ) { + if ( firing ) { + if ( !flags.once ) { + stack.push( [ context, args ] ); + } + } else if ( !( flags.once && memory ) ) { + fire( context, args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + + + +var // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + + Deferred: function( func ) { + var doneList = jQuery.Callbacks( "once memory" ), + failList = jQuery.Callbacks( "once memory" ), + progressList = jQuery.Callbacks( "memory" ), + state = "pending", + lists = { + resolve: doneList, + reject: failList, + notify: progressList + }, + promise = { + done: doneList.add, + fail: failList.add, + progress: progressList.add, + + state: function() { + return state; + }, + + // Deprecated + isResolved: doneList.fired, + isRejected: failList.fired, + + then: function( doneCallbacks, failCallbacks, progressCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); + return this; + }, + always: function() { + deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); + return this; + }, + pipe: function( fnDone, fnFail, fnProgress ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ], + progress: [ fnProgress, "notify" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + obj = promise; + } else { + for ( var key in promise ) { + obj[ key ] = promise[ key ]; + } + } + return obj; + } + }, + deferred = promise.promise({}), + key; + + for ( key in lists ) { + deferred[ key ] = lists[ key ].fire; + deferred[ key + "With" ] = lists[ key ].fireWith; + } + + // Handle state + deferred.done( function() { + state = "resolved"; + }, failList.disable, progressList.lock ).fail( function() { + state = "rejected"; + }, doneList.disable, progressList.lock ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = sliceDeferred.call( arguments, 0 ), + i = 0, + length = args.length, + pValues = new Array( length ), + count = length, + pCount = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(), + promise = deferred.promise(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( deferred, args ); + } + }; + } + function progressFunc( i ) { + return function( value ) { + pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + deferred.notifyWith( promise, pValues ); + }; + } + if ( length > 1 ) { + for ( ; i < length; i++ ) { + if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return promise; + } +}); + + + + +jQuery.support = (function() { + + var support, + all, + a, + select, + opt, + input, + fragment, + tds, + events, + eventName, + i, + isSupported, + div = document.createElement( "div" ), + documentElement = document.documentElement; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
a"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute("href") === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form(#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true, + pixelMargin: true + }; + + // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead + jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat"); + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + + // #11217 - WebKit loses check when the name is after the checked attribute + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.lastChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + fragment.removeChild( input ); + fragment.appendChild( div ); + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for ( i in { + submit: 1, + change: 1, + focusin: 1 + }) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + fragment.removeChild( div ); + + // Null elements to avoid leaks in IE + fragment = select = opt = div = input = null; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, outer, inner, table, td, offsetSupport, + marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight, + paddingMarginBorderVisibility, paddingMarginBorder, + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + conMarginTop = 1; + paddingMarginBorder = "padding:0;margin:0;border:"; + positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;"; + paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;"; + style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;"; + html = "
" + + "" + + "
"; + + container = document.createElement("div"); + container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; + body.insertBefore( container, body.firstChild ); + + // Construct the test element + div = document.createElement("div"); + container.appendChild( div ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "
t
"; + tds = div.getElementsByTagName( "td" ); + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( window.getComputedStyle ) { + div.innerHTML = ""; + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.style.width = "2px"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + if ( typeof div.style.zoom !== "undefined" ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.innerHTML = ""; + div.style.width = div.style.padding = "1px"; + div.style.border = 0; + div.style.overflow = "hidden"; + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = "block"; + div.style.overflow = "visible"; + div.innerHTML = "
"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); + } + + div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility; + div.innerHTML = html; + + outer = div.firstChild; + inner = outer.firstChild; + td = outer.nextSibling.firstChild.firstChild; + + offsetSupport = { + doesNotAddBorder: ( inner.offsetTop !== 5 ), + doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) + }; + + inner.style.position = "fixed"; + inner.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); + inner.style.position = inner.style.top = ""; + + outer.style.overflow = "hidden"; + outer.style.position = "relative"; + + offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); + offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); + + if ( window.getComputedStyle ) { + div.style.marginTop = "1%"; + support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%"; + } + + if ( typeof container.style.zoom !== "undefined" ) { + container.style.zoom = 1; + } + + body.removeChild( container ); + marginDiv = div = container = null; + + jQuery.extend( support, offsetSupport ); + }); + + return support; +})(); + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var privateCache, thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, + isEvents = name === "events"; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = ++jQuery.uuid; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + privateCache = thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Users should not attempt to inspect the internal events object using jQuery.data, + // it is undocumented and subject to change. But does anyone listen? No. + if ( isEvents && !thisCache[ name ] ) { + return privateCache.events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ internalKey ] : internalKey; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the cache and need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ internalKey ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( internalKey ); + } else { + elem[ internalKey ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var parts, part, attr, name, l, + elem = this[0], + i = 0, + data = null; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + attr = elem.attributes; + for ( l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( elem, name, data[ name ] ); + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split( ".", 2 ); + parts[1] = parts[1] ? "." + parts[1] : ""; + part = parts[1] + "!"; + + return jQuery.access( this, function( value ) { + + if ( value === undefined ) { + data = this.triggerHandler( "getData" + part, [ parts[0] ] ); + + // Try to fetch any internally stored data first + if ( data === undefined && elem ) { + data = jQuery.data( elem, key ); + data = dataAttr( elem, key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } + + parts[1] = value; + this.each(function() { + var self = jQuery( this ); + + self.triggerHandler( "setData" + part, parts ); + jQuery.data( this, key, value ); + self.triggerHandler( "changeData" + part, parts ); + }); + }, null, value, arguments.length > 1, null, false ); + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + jQuery.isNumeric( data ) ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery._data( elem, deferDataKey ); + if ( defer && + ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && + ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery._data( elem, queueDataKey ) && + !jQuery._data( elem, markDataKey ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.fire(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = ( type || "fx" ) + "mark"; + jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); + if ( count ) { + jQuery._data( elem, key, count ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + var q; + if ( elem ) { + type = ( type || "fx" ) + "queue"; + q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + hooks = {}; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + jQuery._data( elem, type + ".run", hooks ); + fn.call( elem, function() { + jQuery.dequeue( elem, type ); + }, hooks ); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue " + type + ".run", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { + count++; + tmp.add( resolve ); + } + } + resolve(); + return defer.promise( object ); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + nodeHook, boolHook, fixSpecified; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = ( value || "" ).split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, i, max, option, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + i = one ? index : 0; + max = one ? index + 1 : options.length; + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, l, isBool, + i = 0; + + if ( value && elem.nodeType === 1 ) { + attrNames = value.toLowerCase().split( rspace ); + l = attrNames.length; + + for ( ; i < l; i++ ) { + name = attrNames[ i ]; + + if ( name ) { + propName = jQuery.propFix[ name ] || name; + isBool = rboolean.test( name ); + + // See #9699 for explanation of this approach (setting first, then removal) + // Do not do this for boolean attributes (see #10870) + if ( !isBool ) { + jQuery.attr( elem, name, "" ); + } + elem.removeAttribute( getSetAttribute ? name : propName ); + + // Set corresponding property to false for boolean attributes + if ( isBool && propName in elem ) { + elem[ propName ] = false; + } + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) +jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + fixSpecified = { + name: true, + id: true, + coords: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return ( ret.nodeValue = value + "" ); + } + }; + + // Apply the nodeHook to tabindex + jQuery.attrHooks.tabindex.set = nodeHook.set; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = "" + value ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); +}); + + + + +var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, + rhoverHack = /(?:^|\s)hover(\.\S+)?\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, + quickParse = function( selector ) { + var quick = rquickIs.exec( selector ); + if ( quick ) { + // 0 1 2 3 + // [ _, tag, id, class ] + quick[1] = ( quick[1] || "" ).toLowerCase(); + quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); + } + return quick; + }, + quickIs = function( elem, m ) { + var attrs = elem.attributes || {}; + return ( + (!m[1] || elem.nodeName.toLowerCase() === m[1]) && + (!m[2] || (attrs.id || {}).value === m[2]) && + (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) + ); + }, + hoverHack = function( events ) { + return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); + }; + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, quick, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim( hoverHack(types) ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = ( tns[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + quick: selector && quickParse( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + t, tns, type, origType, namespaces, origCount, + j, events, special, handle, eventType, handleObj; + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim( hoverHack( types || "" ) ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = origType = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + + // Remove matching events + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, [ "events", "handle" ], true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var type = event.type || event, + namespaces = [], + cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; + old = null; + for ( ; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old && old === elem.ownerDocument ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = [].slice.call( arguments, 0 ), + run_all = !event.exclusive && !event.namespace, + special = jQuery.event.special[ event.type ] || {}, + handlerQueue = [], + i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers that should run if there are delegated events + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !(event.button && event.type === "click") ) { + + // Pregenerate a single jQuery object for reuse with .is() + jqcur = jQuery(this); + jqcur.context = this.ownerDocument || this; + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + + // Don't process events on disabled elements (#6911, #8165) + if ( cur.disabled !== true ) { + selMatch = {}; + matches = []; + jqcur[0] = cur; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + + if ( selMatch[ sel ] === undefined ) { + selMatch[ sel ] = ( + handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) + ); + } + if ( selMatch[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( handlers.length > delegateCount ) { + handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); + } + + // Run delegates first; they may want to stop propagation beneath us + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + event.currentTarget = matched.elem; + + for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = matched.matches[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) + if ( event.metaKey === undefined ) { + event.metaKey = event.ctrlKey; + } + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady + }, + + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +// Some plugins are using, but it's undocumented/deprecated and will be removed. +// The 1.7 special event interface should provide all the hooks needed now. +jQuery.event.handle = jQuery.event.dispatch; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector, + ret; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !form._submit_attached ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + form._submit_attached = true; + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + jQuery.event.simulate( "change", this, event, true ); + } + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + elem._change_attached = true; + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { // && selector != null + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + var handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( var type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + expando = "sizcache" + (Math.random() + '').replace('.', ''), + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rReturn = /\r\n/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context, seed ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set, seed ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set, i, len, match, type, left; + + if ( !expr ) { + return []; + } + + for ( i = 0, len = Expr.order.length; i < len; i++ ) { + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + type, found, item, filter, left, + i, pass, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + filter = Expr.filter[ type ]; + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + pass = not ^ found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Utility function for retreiving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +var getText = Sizzle.getText = function( elem ) { + var i, node, + nodeType = elem.nodeType, + ret = ""; + + if ( nodeType ) { + if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent || innerText for elements + if ( typeof elem.textContent === 'string' ) { + return elem.textContent; + } else if ( typeof elem.innerText === 'string' ) { + // Replace IE's carriage returns + return elem.innerText.replace( rReturn, '' ); + } else { + // Traverse it's children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + } else { + + // If no nodeType, this is expected to be an array + for ( i = 0; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + if ( node.nodeType !== 8 ) { + ret += getText( node ); + } + } + } + return ret; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var first, last, + doneName, parent, cache, + count, diff, + type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + /* falls through */ + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + first = match[2]; + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + doneName = match[0]; + parent = elem.parentNode; + + if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { + count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent[ expando ] = doneName; + } + + diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Sizzle.attr ? + Sizzle.attr( elem, name ) : + Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + !type && Sizzle.attr ? + result != null : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} +// Expose origPOS +// "global" as in regardless of relation to brackets/parens +Expr.match.globalPOS = origPOS; + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context, seed ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet, seed ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +Sizzle.selectors.attrMap = {}; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.globalPOS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + POS.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array (deprecated as of jQuery 1.7) + if ( jQuery.isArray( selectors ) ) { + var level = 1; + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( i = 0; i < selectors.length; i++ ) { + + if ( jQuery( cur ).is( selectors[ i ] ) ) { + ret.push({ selector: selectors[ i ], elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call( arguments ).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); +} + + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /]", "i"), + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /\/(java|ecma)script/i, + rcleanScript = /^\s*", "" ], + legend: [ 1, "
", "
" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + col: [ 2, "", "
" ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and + + + + + + + + + + + +
+
+
+
+ +
+

DyNet Builders

+

Builders combine together various operations to implement more +complicated things such as recurrent and LSTM networks

+

TODO: Create documentation

+
+ + +
+
+
+
+
+

Previous topic

+

DyNet Operations

+

Next topic

+

DyNet Optimizers

+

This Page

+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/doc/build/html/commandline.html b/doc/build/html/commandline.html new file mode 100644 index 000000000..a84fc0835 --- /dev/null +++ b/doc/build/html/commandline.html @@ -0,0 +1,132 @@ + + + + + + + + DyNet Command Line Options — Dynet 1.0 documentation + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

DyNet Command Line Options

+

All programs using DyNet have a few command line options. These must be +specified at the very beginning of the command line, before other +options.

+
    +
  • --dynet-mem NUMBER: DyNet runs by default with 512MB of memory +each for the forward and backward steps, as well as parameter +storage. You will often want to increase this amount. By setting +NUMBER here, DyNet will allocate more memory. Note that you can also +individually set the amount of memory for forward calculation, +backward calculation, and parameters by using comma separated +variables --dynet-mem FOR,BACK,PARAM. This is useful if, for +example, you are performing testing and don’t need to allocate any +memory for backward calculation.
  • +
  • --dynet-l2 NUMBER: Specifies the level of l2 regularization to +use (default 1e-6).
  • +
  • --dynet-gpus NUMBER: Specify how many GPUs you want to use, if +DyNet is compiled with CUDA. Currently, only one GPU is supported.
  • +
  • --dynet-gpu-ids X,Y,Z: Specify the GPUs that you want to use by +device ID. Currently only one GPU is supported, but if you use this +command you can select which one to use.
  • +
+
+ + +
+
+
+
+
+

Previous topic

+

Installing the Python DyNet module.

+

Next topic

+

DyNet Tutorial

+

This Page

+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/doc/build/html/genindex.html b/doc/build/html/genindex.html new file mode 100644 index 000000000..112fa04be --- /dev/null +++ b/doc/build/html/genindex.html @@ -0,0 +1,110 @@ + + + + + + + + + Index — Dynet 1.0 documentation + + + + + + + + + + + + + + +
+
+
+
+ + +

Index

+ +
+ D + +
+

D

+ + + +
+ +
dynet::MomentumSGDTrainer (C++ class) +
+ +
+ +
dynet::SimpleSGDTrainer (C++ class) +
+ +
+ + + +
+
+
+
+
+ + + + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/doc/build/html/index.html b/doc/build/html/index.html new file mode 100644 index 000000000..0194d3870 --- /dev/null +++ b/doc/build/html/index.html @@ -0,0 +1,149 @@ + + + + + + + + Dynet documentation — Dynet 1.0 documentation + + + + + + + + + + + + + + + +
+
+
+
+ + +
+

Indices and tables

+ +
+ + +
+
+
+
+
+

Table Of Contents

+ + +

Next topic

+

Building/Installing

+

This Page

+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/doc/build/html/install.html b/doc/build/html/install.html new file mode 100644 index 000000000..23ba4577d --- /dev/null +++ b/doc/build/html/install.html @@ -0,0 +1,249 @@ + + + + + + + + Building/Installing — Dynet 1.0 documentation + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Building/Installing

+

How to build DyNet and link it with your programs

+
+

Prerequisites

+

DyNet relies on a number of external libraries including Boost, cmake, +Eigen, and mercurial (to install Eigen). Boost, cmake, and mercurial can +be installed from standard repositories, for example on Ubuntu linux:

+
sudo apt-get install libboost-all-dev cmake mercurial
+
+
+

To compile DyNet you also need the development version of the Eigen +library. If you use any of the +released versions, you may get assertion failures or compile errors. +If you don’t have Eigen installed already, you can get it easily using +the following command:

+
hg clone https://bitbucket.org/eigen/eigen/
+
+
+
+
+

Building

+

To get and build DyNet, clone the repository

+
git clone https://github.com/clab/dynet.git
+
+
+

then enter the directory and use `cmake <http://www.cmake.org/>`__ +to generate the makefiles

+
cd dynet
+mkdir build
+cd build
+cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen
+
+
+

Then compile, where “2” can be replaced by the number of cores on your +machine

+
make -j 2
+
+
+

To see that things have built properly, you can run

+
./examples/xor
+
+
+

which will train a multilayer perceptron to predict the xor function.

+
+
+

Compiling/linking External Programs

+

When you want to use DyNet in an external program, you will need to add +the dynet directory to the compile path:

+
-I/path/to/dynet
+
+
+

and link with the dynet library:

+
-L/path/to/dynet/build/dynet -ldynet
+
+
+
+
+

Debugging build problems

+

If you have a build problem and want to debug, please run

+
make clean
+make VERBOSE=1 &> make.log
+
+
+

then examine the commands in the make.log file to see if anything +looks fishy. If you would like help, send this make.log file via the +“Issues” tab on github, or to the dynet-users mailing list.

+
+
+

Build options

+
+

GPU (CUDA) support

+

dynet supports running programs on GPUs with CUDA. If you have CUDA +installed, you can build DyNet with GPU support by adding +-DBACKEND=cuda to your cmake options. This will result in three +libraries named “libdynet,” “libgdynet,” and “libdynetcuda” being +created. When you want to run a program on CPU, you can link to the +“libdynet” library as shown above. When you want to run a program on +GPU, you can link to the “libgdynet” and “libdynetcuda” libraries.

+
-L/path/to/dynet/build/dynet -lgdynet -ldynetcuda
+
+
+

(Eventually you will be able to use a single library to run on either +CPU or GPU, but this is not fully implemented yet.)

+
+
+

Non-standard Boost location

+

dynet supports boost, and will find it if it is in the standard +location. If boost is in a non-standard location, say $HOME/boost, +you can specify the location by adding the following to your cmake +options:

+
-DBOOST_ROOT:PATHNAME=$HOME/boost -DBoost_LIBRARY_DIRS:FILEPATH=$HOME/boost/lib
+-DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE
+
+
+

Note that you will also have to set your LD_LIBRARY_PATH to point to +the boost/lib directory.

+
+
+

Building for Windows

+

DYNET has been tested to build in Windows using Microsoft Visual Studio +2015. You may be able to build with MSVC 2013 by slightly modifying the +instructions below.

+

First, install Eigen following the above instructions.

+

Second, install Boost for your compiler and +platform. Follow the instructions for compiling Boost or just download +the already-compiled binaries.

+

To generate the MSVC solution and project files, run +cmake, pointing it to the location you +installed Eigen and Boost (for example, at c:and c:_1_61_0):

+
mkdir build
+cd build
+cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64"
+
+
+

This will generate dynet.sln and a bunch of *.vcxproj files (one for +the DYNET library, and one per example). You should be able to just open +dynet.sln and build all. Note: multi-process functionality is +currently not supported in Windows, so you will not be able to build +rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to +this project

+
+
+
+ + +
+
+
+
+
+

Table Of Contents

+ + +

Previous topic

+

Dynet documentation

+

Next topic

+

Installing the Python DyNet module.

+

This Page

+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/doc/build/html/minibatch.html b/doc/build/html/minibatch.html new file mode 100644 index 000000000..a49eca31a --- /dev/null +++ b/doc/build/html/minibatch.html @@ -0,0 +1,112 @@ + + + + + + + + Mini-batching in DyNet — Dynet 1.0 documentation + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Mini-batching in DyNet

+

How to perform minibatching to improve efficiency

+
+ + +
+
+
+
+
+

Previous topic

+

DyNet Optimizers

+

Next topic

+

Multi-processing in DyNet

+

This Page

+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/doc/build/html/multiprocessing.html b/doc/build/html/multiprocessing.html new file mode 100644 index 000000000..3f81da5e0 --- /dev/null +++ b/doc/build/html/multiprocessing.html @@ -0,0 +1,103 @@ + + + + + + + + Multi-processing in DyNet — Dynet 1.0 documentation + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Multi-processing in DyNet

+

How to perform processing on multiple threads

+

(TODO: create doc)

+
+ + +
+
+
+
+
+

Previous topic

+

Mini-batching in DyNet

+

This Page

+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/doc/build/html/objects.inv b/doc/build/html/objects.inv new file mode 100644 index 000000000..6f9e7e436 --- /dev/null +++ b/doc/build/html/objects.inv @@ -0,0 +1,8 @@ +# Sphinx inventory version 2 +# Project: Dynet +# Version: 1.0 +# The remainder of this file is compressed using zlib. +xڕ�� +�0 ��{��^'�ڳ ¼�چ�д�Ma��E;áx ��O�k�4N�X +oh�n �5-���dw�z�-��U� �.FAʨ�5X�� +p�VzvȉcV���oZO�8Sw:^�4��6d�S)�C��� +�nb��PV�_͏���Y�� \ No newline at end of file diff --git a/doc/build/html/operations.html b/doc/build/html/operations.html new file mode 100644 index 000000000..364f097f9 --- /dev/null +++ b/doc/build/html/operations.html @@ -0,0 +1,113 @@ + + + + + + + + DyNet Operations — Dynet 1.0 documentation + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

DyNet Operations

+

The various operations that you can use in building a DyNet graph

+

TODO: Create documentation

+
+ + +
+
+
+
+
+

Previous topic

+

DyNet Tutorial

+

Next topic

+

DyNet Builders

+

This Page

+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/doc/build/html/optimizers.html b/doc/build/html/optimizers.html new file mode 100644 index 000000000..5cc1aa569 --- /dev/null +++ b/doc/build/html/optimizers.html @@ -0,0 +1,124 @@ + + + + + + + + DyNet Optimizers — Dynet 1.0 documentation + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

DyNet Optimizers

+

The various optimizers that you can use to tune your parameters

+
+
+struct dynet::SimpleSGDTrainer
+

Inherits from dynet::Trainer

+
+ +
+
+struct dynet::MomentumSGDTrainer
+

Inherits from dynet::Trainer

+
+ +
+ + +
+
+
+
+
+

Previous topic

+

DyNet Builders

+

Next topic

+

Mini-batching in DyNet

+

This Page

+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/doc/build/html/python.html b/doc/build/html/python.html new file mode 100644 index 000000000..46b59531c --- /dev/null +++ b/doc/build/html/python.html @@ -0,0 +1,272 @@ + + + + + + + + Installing the Python DyNet module. — Dynet 1.0 documentation + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

Installing the Python DyNet module.

+

(for instructions on installing on a computer with GPU, see below)

+

Python bindings to DyNet are currently only supported under python 2.

+
+

TL;DR

+

(see below for the details)

+
# Installing python DyNet on a machine with python 2.7:
+
+pip install cython # if you don't have it already.
+mkdir dynet-base
+cd dynet-base
+# getting dynet and eigen
+git clone https://github.com/clab/dynet.git
+hg clone https://bitbucket.org/eigen/eigen
+cd dynet
+mkdir build
+cd build
+# without GPU support:
+cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python`
+# or with GPU support:
+cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` -DBACKEND=cuda
+
+make -j 2 # replace 2 with the number of available cores
+cd python
+python setup.py install  # or `python setup.py install --user` for a user-local install.
+
+
+
+
+

Detailed Instructions:

+

First, get DyNet:

+
cd $HOME
+mkdir dynet-base
+cd dynet-base
+git clone https://github.com/clab/dynet.git
+cd dynet
+git submodule init # To be consistent with DyNet's installation instructions.
+git submodule update # To be consistent with DyNet's installation instructions.
+
+
+

Then get Eigen:

+
cd $HOME
+cd dynet-base
+hg clone https://bitbucket.org/eigen/eigen/
+
+
+

We also need to make sure the cython module is installed. (you can +replace pip with your favorite package manager, such as conda, +or install within a virtual environment)

+
pip install cython
+
+
+

To simplify the following steps, we can set a bash variable to hold +where we have saved the main directories of DyNet and Eigen. In case you +have gotten DyNet and Eigen differently from the instructions above and +saved them in different location(s), these variables will be helpful:

+
PATH_TO_DYNET=$HOME/dynet-base/dynet/
+PATH_TO_EIGEN=$HOME/dynet-base/eigen/
+
+
+

Compile DyNet.

+

This is pretty much the same process as compiling DyNet, with the +addition of the -DPYTHON= flag, pointing to the location of your +python interpreter.

+

If boost is installed in a non-standard location, you should add the +corresponding flags to the cmake commandline, see the DyNet +installation instructions page.

+
cd $PATH_TO_DYNET
+PATH_TO_PYTHON=`which python`
+mkdir build
+cd build
+cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON
+make -j 2
+
+
+

Assuming that the cmake command found all the needed libraries and +didn’t fail, the make command will take a while, and compile dynet +as well as the python bindings. You can change make -j 2 to a higher +number, depending on the available cores you want to use while +compiling.

+

You now have a working python binding inside of build/dynet. To +verify this is working:

+
cd $PATH_TO_DYNET/build/python
+python
+
+
+

then, within python:

+
import dynet as dy
+print dy.__version__
+model = dy.Model()
+
+
+

In order to install the module so that it is accessible from everywhere +in the system, run the following:

+
cd $PATH_TO_DYNET/build/python
+python setup.py install --user
+
+
+

(the --user switch will install the module in your local +site-packages, and works without root privilages. To install the module +to the system site-packages (for all users), run +python setup.py install without this switch)

+

You should now have a working python binding (the dynet module).

+

Note however that the installation relies on the compiled dynet library +being in $PATH_TO_DYNET/build/dynet, so make sure not to move it +from there.

+

Now, check that everything works:

+
# check that it works:
+cd $PATH_TO_DYNET
+cd pyexamples
+python xor.py
+python rnnlm.py rnnlm.py
+
+
+

Alternatively, if the following script works for you, then your +installation is likely to be working:

+
from dynet import *
+model = Model()
+
+
+
+
+

Installing with GPU support

+

For installing on a computer with GPU, first install CUDA. The following +instructions assume CUDA is installed.

+

The installation process is pretty much the same, while adding the +-DBACKEND=cuda flag to the cmake stage:

+
cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON -DBACKEND=cuda
+
+
+

(if CUDA is installed in a non-standard location and cmake cannot +find it, you can specify also +-DCUDA_TOOLKIT_ROOT_DIR=/path/to/cuda.)

+

Now, build the python modules (as above, we assume cython is installed):

+

After running make -j 2, you should have the files _dynet.so and +_gdynet.so in the build/python folder.

+

As before, cd build/python followed by +python setup.py install --user will install the module.

+
+
+
+

Using the GPU:

+

In order to use the GPU support, you can either:

+
    +
  • Use import _gdynet as dy instead of import dynet as dy
  • +
  • Or, (preferred), import dynet as usual, but use the commandline +switch --dynet-gpu or the GPU switches detailed +here when invoking the program. This option lets +the same code work with either the GPU or the CPU version depending +on how it is invoked.
  • +
+
+ + +
+
+
+
+
+

Table Of Contents

+ + +

Previous topic

+

Building/Installing

+

Next topic

+

DyNet Command Line Options

+

This Page

+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/doc/build/html/search.html b/doc/build/html/search.html new file mode 100644 index 000000000..86002ae1e --- /dev/null +++ b/doc/build/html/search.html @@ -0,0 +1,100 @@ + + + + + + + + Search — Dynet 1.0 documentation + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +

Search

+
+ +

+ Please activate JavaScript to enable the search + functionality. +

+
+

+ From here you can search these documents. Enter your search + words into the box below and click "search". Note that the search + function will automatically search for all of the words. Pages + containing fewer words won't appear in the result list. +

+
+ + + +
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+ + + + \ No newline at end of file diff --git a/doc/build/html/searchindex.js b/doc/build/html/searchindex.js new file mode 100644 index 000000000..f4332bba8 --- /dev/null +++ b/doc/build/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({envversion:42,terms:{all:[2,3,6],code:2,illustr:9,path_to_python:2,per:6,follow:[2,1,6],cython:2,privat:[],depend:2,graph:[0,9],send:6,init:2,concret:9,dboost_librarydir:6,breathe_project:[],sourc:[],"void":[],failur:6,veri:[3,9],vlp:[],y_valu:9,level:3,list:6,vector:9,adamtrain:[],path:[2,6],pleas:6,doxygenclass:[],libgdynet:6,second:6,pass:9,download:6,x_valu:9,index:1,xor:[2,6,9],abl:6,sln:6,add_paramet:9,current:[2,3,6],version:[2,6],rmsproptrain:[],"public":[],can:[0,1,2,3,5,6,9],mem:3,gener:[1,6],here:[2,3,9],let:2,ubuntu:6,"const":[],modifi:6,interpret:2,box:6,search:1,amount:3,dynet_trainer_define_dev_impl:[],implement:[1,7,6],trainer:[5,9],via:6,modul:[],prefer:2,submodul:2,apt:6,perceptron:6,sgd:9,select:3,from:[2,5,6],would:6,memori:[3,9],next:[6,9],few:3,more:[3,7],path_to_dynet:2,under:2,flag:2,train:[6,9],examin:6,rescale_and_reset_weight_decai:[],hold:2,must:3,beta_1:[],beta_2:[],setup:2,work:2,ldynet:6,dev:6,archiv:[],libboost:6,root:2,path_to_eigen:2,control:9,doxygenfil:[],want:[2,3,6],predict:6,sudo:6,templat:[],tab:6,msvc:6,serial:[],unsign:[],uncheck:6,multipl:8,filepath:6,write:9,how:[1,2,3,4,6,8,9],verifi:2,simpl:9,dboost_no_system_path:6,updat:[2,9],everywher:2,doxygenstruct:[],referenc:1,clone:[2,6],after:2,invok:2,befor:[2,3],lidx:[],clipping_en:[],mai:6,data:9,alloc:3,github:[2,6],bind:2,favorit:2,correspond:2,issu:6,inform:[1,9],"switch":2,combin:7,allow:9,enter:6,order:2,eigen:[2,6],sigmoid:9,move:2,libdynetcuda:6,through:9,lgdynet:6,bunch:6,adagradtrain:[],platform:6,mail:6,main:2,them:[2,9],within:[2,9],"return":9,binary_log_loss:9,initi:9,instead:2,now:[2,9],multiprocess:[],eventu:6,name:6,anyth:6,didn:2,separ:3,update_lookup_param:[],each:3,fulli:6,weight:9,replac:[2,6],individu:3,idea:9,procedur:[],hlg:[],hld:[],todo:[0,7,8],eta_decai:[],out:9,variabl:[2,3,9],shown:6,network:[7,9],gradient:9,content:[],y_pred:9,print:[2,9],lib64:6,insid:2,base:2,dictionari:[],releas:6,org:[2,6],bash:2,eta0:[],thread:8,thing:[7,6,9],unabl:[],regress:9,first:[2,6,9],oper:[],pyexampl:2,number:[2,3,6],instruct:[],alreadi:[2,6],done:9,open:6,size:9,differ:2,script:2,mkdir:[2,6],system:2,mercuri:6,simplesgdtrain:[5,9],"final":9,friend:[],namespac:[],specifi:[2,3,6,9],part:9,logist:9,computationgraph:9,std:[],gotten:2,structur:9,project:6,clip_threshold:[],sai:6,comput:[2,9],clip:[],ani:[3,6],myproject:[],packag:2,have:[2,3,6],need:[2,3,6,9],seem:[],built:6,lib:6,note:[2,3,6,9],also:[2,3,6],exampl:[3,6,9],dbackend:[2,6],take:2,which:[2,3,6,9],environ:2,singl:[6,9],simplifi:2,begin:3,sure:2,boost_1_61_0:6,multipli:9,regular:3,rho:[],alpha:[],model:[2,1,9],dynet_1_1simplesgdtrain:[],don:[2,3,6,9],privilag:2,doc:8,cover:9,doe:[],minibatch:4,clean:6,microsoft:6,verbos:6,particularli:9,lstm:[7,9],find:[2,1,6],help:[2,6],xml:[],access:2,onli:[2,3],clip_gradi:[],pretti:2,configur:6,solut:6,should:[2,6],factor:9,folder:2,local:2,alloc_impl:[],variou:[0,7,5],get:[2,6,9],express:9,rnnlm:[2,6],cannot:2,increas:3,dboost_no_boost_cmak:6,"_gdynet":2,print_graphviz:9,comma:3,where:[2,6],as_scalar:9,set:[2,3,6,9],commandlin:2,size_t:[],see:[2,6],result:6,fail:2,best:9,statu:[],tensor:[],dpython:2,simplest:9,"import":2,paramet:[3,5,9],attribut:[],altern:2,kei:[],structdynet_1_1adadeltatrain:[],multilay:6,conda:2,dboost_root:6,addit:2,protect:[],doxygen:[],howev:2,eta:[],mani:3,com:[2,6],ld_library_path:6,load:9,point:[2,6],"1_1simplesgdtrain":[],linux:6,assum:2,devic:3,three:6,been:6,accumul:9,much:2,valu:9,deigen3_include_dir:[2,6],assert:6,"_1_61_0":6,input:9,"case":2,update_rul:[],multi:[],look:[6,9],defin:9,calcul:[3,9],abov:[2,6],error:6,propag:9,site:2,bias:9,develop:6,minim:9,perform:[3,4,9,8],make:[2,6],same:2,"while":2,member:[],binari:6,epoch:[],libdynet:6,"__version__":2,higher:2,http:[2,6],optim:[],user:[2,6],improv:4,chang:2,tune:5,well:[2,3],inherit:5,without:2,command:[],adadeltatrain:[],thi:[2,3,6,9],everyth:2,usual:2,update_param:[],just:6,dboost_library_dir:6,paul:[],yet:[6,9],structdynet_1_1rmsproptrain:[],adagrad:[],struct:5,makefil:6,param:3,add:[2,6,9],valid:[],shadowparamet:[],save:2,momentum:[],real:9,read:9,breathe_default_project:[],mom:[],recurr:[7,9],mod:9,loss:9,like:[2,6,9],dcuda_toolkit_root_dir:2,clab:[2,6],either:[2,6],output:9,shadowlookupparamet:[],www:6,often:3,back:[3,9],toctre:[],home:[2,6],librari:[2,6],scale:9,easili:6,"512mb":3,subclass:[],complic:7,refer:[],machin:[2,6],core:[2,6],process:[],run:[2,3,6,9],win64:6,step:[2,3],repositori:6,found:2,vcxproj:6,stage:2,about:1,idx:[],slightli:6,page:[2,1],constructor:9,effici:4,"float":[],storag:3,your:[2,1,5,6],manag:[2,6],git:[2,6],log:6,wai:9,"class":[],avail:2,start:9,reli:[2,6],includ:6,forward:[3,9],dynet_1_1:[],"function":[6,9],properli:6,fishi:6,epsilon:[],"1x3":9,"true":6,consist:2,"default":3,below:[2,1,6,9],creat:[0,7,6,9,8],"int":[],flow:9,doesn:9,ldynetcuda:6,file:[2,6],pip:2,check:2,cmake:[2,6],when:[2,1,6],virtual:2,other:3,bool:[],update_epoch:[],test:[3,6],you:[0,1,2,3,6,5],"_dynet":2,gscale:[],aux_alloc:[],bitbucket:[2,6],studio:6,directori:[2,6,9],visual:6,momentumsgdtrain:5,pathnam:6,maxdepth:[],backward:[3,9],cpu:[2,6],togeth:7},objtypes:{"0":"cpp:class"},objnames:{"0":["cpp","class","C++ class"]},filenames:["operations","index","python","commandline","minibatch","optimizers","install","builders","multiprocessing","tutorial"],titles:["DyNet Operations","Dynet documentation","Installing the Python DyNet module.","DyNet Command Line Options","Mini-batching in DyNet","DyNet Optimizers","Building/Installing","DyNet Builders","Multi-processing in DyNet","DyNet Tutorial"],objects:{"":{"dynet::MomentumSGDTrainer":[5,0,1,""],"dynet::SimpleSGDTrainer":[5,0,1,""]}},titleterms:{compil:6,mini:4,process:8,modul:2,indic:1,instruct:2,tabl:1,instal:[2,6],dynet:[0,1,2,3,4,5,7,8,9],locat:6,welcom:[],support:[2,6],detail:2,python:2,window:6,program:6,build:6,gpu:[2,6],document:1,boost:6,non:6,option:[3,6],optim:5,standard:6,link:6,prerequisit:6,extern:6,line:3,oper:0,multi:8,builder:7,batch:4,tutori:9,command:3,cuda:6,debug:6,problem:6}}) \ No newline at end of file diff --git a/doc/build/html/tutorial.html b/doc/build/html/tutorial.html new file mode 100644 index 000000000..9a3ab6039 --- /dev/null +++ b/doc/build/html/tutorial.html @@ -0,0 +1,157 @@ + + + + + + + + DyNet Tutorial — Dynet 1.0 documentation + + + + + + + + + + + + + + + + +
+
+
+
+ +
+

DyNet Tutorial

+

An illustration of how models are trained (for a simple logistic +regression model) is below:

+
// *** First, we set up the structure of the model
+// Create a model, and an SGD trainer to update its parameters.
+Model mod;
+SimpleSGDTrainer sgd(&mod);
+// Create a "computation graph," which will define the flow of information.
+ComputationGraph cg;
+// Initialize a 1x3 parameter vector, and add the parameters to be part of the
+// computation graph.
+Expression W = parameter(cg, mod.add_parameters({1, 3}));
+// Create variables defining the input and output of the regression, and load them
+// into the computation graph. Note that we don't need to set concrete values yet.
+vector<dynet::real> x_values(3);
+Expression x = input(cg, {3}, &x_values);
+dynet::real y_value;
+Expression y = input(cg, &y_value);
+// Next, set up the structure to multiply the input by the weight vector,  then run
+// the output of this through a logistic sigmoid function (logistic regression).
+Expression y_pred = logistic(W*x);
+// Finally, we create a function to calculate the loss. The model will be optimized
+// to minimize the value of the final function in the computation graph.
+Expression l = binary_log_loss(y_pred, y);
+// We are now done setting up the graph, and we can print out its structure:
+cg.print_graphviz();
+
+// *** Now, we perform a parameter update for a single example.
+// Set the input/output to the values specified by the training data:
+x_values = {0.5, 0.3, 0.7};
+y_value = 1.0;
+// "forward" propagates values forward through the computation graph, and returns
+// the loss.
+dynet::real loss = as_scalar(cg.forward(l));
+// "backward" performs back-propagation, and accumulates the gradients of the
+// parameters within the "Model" data structure.
+cg.backward(l);
+// "sgd.update" updates parameters of the model that was passed to its constructor.
+// Here 1.0 is the scaling factor that allows us to control the size of the update.
+sgd.update(1.0);
+
+
+

Note that this very simple example that doesn’t cover things like memory +initialization, reading/writing models, recurrent/LSTM networks, or +adding biases to functions. The best way to get an idea of how to use +DyNet for real is to look in the example directory, particularly +starting with the simplest xor example.

+
+ + +
+
+
+
+
+

Previous topic

+

DyNet Command Line Options

+

Next topic

+

DyNet Operations

+

This Page

+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/doc/build/text/builders.txt b/doc/build/text/builders.txt new file mode 100644 index 000000000..b020e75af --- /dev/null +++ b/doc/build/text/builders.txt @@ -0,0 +1,8 @@ + +DyNet Builders +************** + +Builders combine together various operations to implement more +complicated things such as recurrent and LSTM networks + +TODO: Create documentation diff --git a/doc/build/text/commandline.txt b/doc/build/text/commandline.txt new file mode 100644 index 000000000..d07e1f855 --- /dev/null +++ b/doc/build/text/commandline.txt @@ -0,0 +1,27 @@ + +DyNet Command Line Options +************************** + +All programs using DyNet have a few command line options. These must +be specified at the very beginning of the command line, before other +options. + +* "--dynet-mem NUMBER": DyNet runs by default with 512MB of memory + each for the forward and backward steps, as well as parameter + storage. You will often want to increase this amount. By setting + NUMBER here, DyNet will allocate more memory. Note that you can also + individually set the amount of memory for forward calculation, + backward calculation, and parameters by using comma separated + variables "--dynet-mem FOR,BACK,PARAM". This is useful if, for + example, you are performing testing and don't need to allocate any + memory for backward calculation. + +* "--dynet-l2 NUMBER": Specifies the level of l2 regularization to + use (default 1e-6). + +* "--dynet-gpus NUMBER": Specify how many GPUs you want to use, if + DyNet is compiled with CUDA. Currently, only one GPU is supported. + +* "--dynet-gpu-ids X,Y,Z": Specify the GPUs that you want to use by + device ID. Currently only one GPU is supported, but if you use this + command you can select which one to use. diff --git a/doc/build/text/index.txt b/doc/build/text/index.txt new file mode 100644 index 000000000..2e118587a --- /dev/null +++ b/doc/build/text/index.txt @@ -0,0 +1,55 @@ + +Dynet documentation +******************* + +You can find information about how to install/use DyNet in general +below: + +* Building/Installing + + * Prerequisites + + * Building + + * Compiling/linking External Programs + + * Debugging build problems + + * Build options + +* Installing the Python DyNet module. + + * TL;DR + + * Detailed Instructions: + + * Installing with GPU support + +* Using the GPU: + +* DyNet Command Line Options + +* DyNet Tutorial + +The following can be referenced when implementing your models in +DyNet: + +* DyNet Operations + +* DyNet Builders + +* DyNet Optimizers + +* Mini-batching in DyNet + +* Multi-processing in DyNet + + +Indices and tables +****************** + +* *Index* + +* *Module Index* + +* *Search Page* diff --git a/doc/build/text/install.txt b/doc/build/text/install.txt new file mode 100644 index 000000000..dddff1394 --- /dev/null +++ b/doc/build/text/install.txt @@ -0,0 +1,141 @@ + +Building/Installing +******************* + +How to build DyNet and link it with your programs + + +Prerequisites +============= + +DyNet relies on a number of external libraries including Boost, cmake, +Eigen, and mercurial (to install Eigen). Boost, cmake, and mercurial +can be installed from standard repositories, for example on Ubuntu +linux: + + sudo apt-get install libboost-all-dev cmake mercurial + +To compile DyNet you also need the development version of the Eigen +library. **If you use any of the released versions, you may get +assertion failures or compile errors.** If you don't have Eigen +installed already, you can get it easily using the following command: + + hg clone https://bitbucket.org/eigen/eigen/ + + +Building +======== + +To get and build DyNet, clone the repository + + git clone https://github.com/clab/dynet.git + +then enter the directory and use "`cmake" `__ +to generate the makefiles + + cd dynet + mkdir build + cd build + cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen + +Then compile, where "2" can be replaced by the number of cores on your +machine + + make -j 2 + +To see that things have built properly, you can run + + ./examples/xor + +which will train a multilayer perceptron to predict the xor function. + + +Compiling/linking External Programs +=================================== + +When you want to use DyNet in an external program, you will need to +add the "dynet" directory to the compile path: + + -I/path/to/dynet + +and link with the dynet library: + + -L/path/to/dynet/build/dynet -ldynet + + +Debugging build problems +======================== + +If you have a build problem and want to debug, please run + + make clean + make VERBOSE=1 &> make.log + +then examine the commands in the "make.log" file to see if anything +looks fishy. If you would like help, send this "make.log" file via the +"Issues" tab on github, or to the dynet-users mailing list. + + +Build options +============= + + +GPU (CUDA) support +------------------ + +"dynet" supports running programs on GPUs with CUDA. If you have CUDA +installed, you can build DyNet with GPU support by adding +"-DBACKEND=cuda" to your cmake options. This will result in three +libraries named "libdynet," "libgdynet," and "libdynetcuda" being +created. When you want to run a program on CPU, you can link to the +"libdynet" library as shown above. When you want to run a program on +GPU, you can link to the "libgdynet" and "libdynetcuda" libraries. + + -L/path/to/dynet/build/dynet -lgdynet -ldynetcuda + +(Eventually you will be able to use a single library to run on either +CPU or GPU, but this is not fully implemented yet.) + + +Non-standard Boost location +--------------------------- + +"dynet" supports boost, and will find it if it is in the standard +location. If boost is in a non-standard location, say "$HOME/boost", +you can specify the location by adding the following to your cmake +options: + + -DBOOST_ROOT:PATHNAME=$HOME/boost -DBoost_LIBRARY_DIRS:FILEPATH=$HOME/boost/lib + -DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE + +Note that you will also have to set your "LD_LIBRARY_PATH" to point to +the "boost/lib" directory. + + +Building for Windows +-------------------- + +DYNET has been tested to build in Windows using Microsoft Visual +Studio 2015. You may be able to build with MSVC 2013 by slightly +modifying the instructions below. + +First, install Eigen following the above instructions. + +Second, install Boost for your compiler and platform. Follow the +instructions for compiling Boost or just download the already-compiled +binaries. + +To generate the MSVC solution and project files, run cmake, pointing +it to the location you installed Eigen and Boost (for example, at +c:and c:_1_61_0): + + mkdir build + cd build + cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64" + +This will generate dynet.sln and a bunch of *.vcxproj files (one for +the DYNET library, and one per example). You should be able to just +open dynet.sln and build all. **Note: multi-process functionality is +currently not supported in Windows, so you will not be able to build +rnnlm-mp. Go to build->Configuration Manager and uncheck the box next +to this project** diff --git a/doc/build/text/minibatch.txt b/doc/build/text/minibatch.txt new file mode 100644 index 000000000..f5f6a6201 --- /dev/null +++ b/doc/build/text/minibatch.txt @@ -0,0 +1,5 @@ + +Mini-batching in DyNet +********************** + +How to perform minibatching to improve efficiency diff --git a/doc/build/text/multiprocessing.txt b/doc/build/text/multiprocessing.txt new file mode 100644 index 000000000..1bea34782 --- /dev/null +++ b/doc/build/text/multiprocessing.txt @@ -0,0 +1,7 @@ + +Multi-processing in DyNet +************************* + +How to perform processing on multiple threads + +(TODO: create doc) diff --git a/doc/build/text/operations.txt b/doc/build/text/operations.txt new file mode 100644 index 000000000..11846efd6 --- /dev/null +++ b/doc/build/text/operations.txt @@ -0,0 +1,7 @@ + +DyNet Operations +**************** + +The various operations that you can use in building a DyNet graph + +TODO: Create documentation diff --git a/doc/build/text/optimizers.txt b/doc/build/text/optimizers.txt new file mode 100644 index 000000000..f8249b996 --- /dev/null +++ b/doc/build/text/optimizers.txt @@ -0,0 +1,13 @@ + +DyNet Optimizers +**************** + +The various optimizers that you can use to tune your parameters + +class struct dynet::SimpleSGDTrainer + + Inherits from dynet::Trainer + +class struct dynet::MomentumSGDTrainer + + Inherits from dynet::Trainer diff --git a/doc/build/text/python.txt b/doc/build/text/python.txt new file mode 100644 index 000000000..d8e81de15 --- /dev/null +++ b/doc/build/text/python.txt @@ -0,0 +1,172 @@ + +Installing the Python DyNet module. +*********************************** + +(for instructions on installing on a computer with GPU, see below) + +Python bindings to DyNet are currently only supported under python 2. + + +TL;DR +===== + +(see below for the details) + + # Installing python DyNet on a machine with python 2.7: + + pip install cython # if you don't have it already. + mkdir dynet-base + cd dynet-base + # getting dynet and eigen + git clone https://github.com/clab/dynet.git + hg clone https://bitbucket.org/eigen/eigen + cd dynet + mkdir build + cd build + # without GPU support: + cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` + # or with GPU support: + cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` -DBACKEND=cuda + + make -j 2 # replace 2 with the number of available cores + cd python + python setup.py install # or `python setup.py install --user` for a user-local install. + + +Detailed Instructions: +====================== + +First, get DyNet: + + cd $HOME + mkdir dynet-base + cd dynet-base + git clone https://github.com/clab/dynet.git + cd dynet + git submodule init # To be consistent with DyNet's installation instructions. + git submodule update # To be consistent with DyNet's installation instructions. + +Then get Eigen: + + cd $HOME + cd dynet-base + hg clone https://bitbucket.org/eigen/eigen/ + +We also need to make sure the "cython" module is installed. (you can +replace "pip" with your favorite package manager, such as "conda", or +install within a virtual environment) + + pip install cython + +To simplify the following steps, we can set a bash variable to hold +where we have saved the main directories of DyNet and Eigen. In case +you have gotten DyNet and Eigen differently from the instructions +above and saved them in different location(s), these variables will be +helpful: + + PATH_TO_DYNET=$HOME/dynet-base/dynet/ + PATH_TO_EIGEN=$HOME/dynet-base/eigen/ + +Compile DyNet. + +This is pretty much the same process as compiling DyNet, with the +addition of the "-DPYTHON=" flag, pointing to the location of your +python interpreter. + +If boost is installed in a non-standard location, you should add the +corresponding flags to the "cmake" commandline, see the DyNet +installation instructions page. + + cd $PATH_TO_DYNET + PATH_TO_PYTHON=`which python` + mkdir build + cd build + cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON + make -j 2 + +Assuming that the "cmake" command found all the needed libraries and +didn't fail, the "make" command will take a while, and compile dynet +as well as the python bindings. You can change "make -j 2" to a higher +number, depending on the available cores you want to use while +compiling. + +You now have a working python binding inside of "build/dynet". To +verify this is working: + + cd $PATH_TO_DYNET/build/python + python + +then, within python: + + import dynet as dy + print dy.__version__ + model = dy.Model() + +In order to install the module so that it is accessible from +everywhere in the system, run the following: + + cd $PATH_TO_DYNET/build/python + python setup.py install --user + +(the "--user" switch will install the module in your local site- +packages, and works without root privilages. To install the module to +the system site-packages (for all users), run "python setup.py +install" without this switch) + +You should now have a working python binding (the dynet module). + +Note however that the installation relies on the compiled dynet +library being in "$PATH_TO_DYNET/build/dynet", so make sure not to +move it from there. + +Now, check that everything works: + + # check that it works: + cd $PATH_TO_DYNET + cd pyexamples + python xor.py + python rnnlm.py rnnlm.py + +Alternatively, if the following script works for you, then your +installation is likely to be working: + + from dynet import * + model = Model() + + +Installing with GPU support +=========================== + +For installing on a computer with GPU, first install CUDA. The +following instructions assume CUDA is installed. + +The installation process is pretty much the same, while adding the +"-DBACKEND=cuda" flag to the "cmake" stage: + + cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON -DBACKEND=cuda + +(if CUDA is installed in a non-standard location and "cmake" cannot +find it, you can specify also +"-DCUDA_TOOLKIT_ROOT_DIR=/path/to/cuda".) + +Now, build the python modules (as above, we assume cython is +installed): + +After running "make -j 2", you should have the files "_dynet.so" and +"_gdynet.so" in the "build/python" folder. + +As before, "cd build/python" followed by "python setup.py install +--user" will install the module. + + +Using the GPU: +************** + +In order to use the GPU support, you can either: + +* Use "import _gdynet as dy" instead of "import dynet as dy" + +* Or, (preferred), "import dynet" as usual, but use the commandline + switch "--dynet-gpu" or the GPU switches detailed here when invoking + the program. This option lets the same code work with either the GPU + or the CPU version depending on how it is invoked. diff --git a/doc/build/text/tutorial.txt b/doc/build/text/tutorial.txt new file mode 100644 index 000000000..6960b5134 --- /dev/null +++ b/doc/build/text/tutorial.txt @@ -0,0 +1,50 @@ + +DyNet Tutorial +************** + +An illustration of how models are trained (for a simple logistic +regression model) is below: + + // *** First, we set up the structure of the model + // Create a model, and an SGD trainer to update its parameters. + Model mod; + SimpleSGDTrainer sgd(&mod); + // Create a "computation graph," which will define the flow of information. + ComputationGraph cg; + // Initialize a 1x3 parameter vector, and add the parameters to be part of the + // computation graph. + Expression W = parameter(cg, mod.add_parameters({1, 3})); + // Create variables defining the input and output of the regression, and load them + // into the computation graph. Note that we don't need to set concrete values yet. + vector x_values(3); + Expression x = input(cg, {3}, &x_values); + dynet::real y_value; + Expression y = input(cg, &y_value); + // Next, set up the structure to multiply the input by the weight vector, then run + // the output of this through a logistic sigmoid function (logistic regression). + Expression y_pred = logistic(W*x); + // Finally, we create a function to calculate the loss. The model will be optimized + // to minimize the value of the final function in the computation graph. + Expression l = binary_log_loss(y_pred, y); + // We are now done setting up the graph, and we can print out its structure: + cg.print_graphviz(); + + // *** Now, we perform a parameter update for a single example. + // Set the input/output to the values specified by the training data: + x_values = {0.5, 0.3, 0.7}; + y_value = 1.0; + // "forward" propagates values forward through the computation graph, and returns + // the loss. + dynet::real loss = as_scalar(cg.forward(l)); + // "backward" performs back-propagation, and accumulates the gradients of the + // parameters within the "Model" data structure. + cg.backward(l); + // "sgd.update" updates parameters of the model that was passed to its constructor. + // Here 1.0 is the scaling factor that allows us to control the size of the update. + sgd.update(1.0); + +Note that this very simple example that doesn't cover things like +memory initialization, reading/writing models, recurrent/LSTM +networks, or adding biases to functions. The best way to get an idea +of how to use DyNet for real is to look in the "example" directory, +particularly starting with the simplest "xor" example. diff --git a/doc/build_doc.sh b/doc/build_doc.sh new file mode 100644 index 000000000..243005d49 --- /dev/null +++ b/doc/build_doc.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +# Run Doxygen +doxygen doxygen/config + +# Run sphinx to generate text and html doc +make html text diff --git a/doc/doxygen/config b/doc/doxygen/config new file mode 100644 index 000000000..b2ebe93f4 --- /dev/null +++ b/doc/doxygen/config @@ -0,0 +1,2384 @@ +# Doxyfile 1.8.9.1 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME = "Dynet" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER = + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "A dynamic neural network library written in C++" + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY = doxygen + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF = + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT = YES + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT = NO + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL = NO + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE = NO + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if ... \endif and \cond +# ... \endcond blocks. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. +# Note: If this tag is empty the current directory is searched. + +INPUT =../dynet/expr.h ../dynet/training.h + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank the +# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, +# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, +# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, +# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, +# *.qsf, *.as and *.js. + +FILE_PATTERNS = + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE = NO + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE = + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS = + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# +# +# where is the value of the INPUT_FILTER tag, and is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = YES + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS = YES + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# compiled with the --with-libclang option. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to YES can help to show when doxygen was last run and thus if the +# documentation is up to date. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS = NO + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE = + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX = NO + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE = 4 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH = 250 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use + S +# (what the is depends on the OS and browser, but it is typically +# , /
diff --git a/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.md5 b/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.md5 new file mode 100644 index 000000000..68f5e357b --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.md5 @@ -0,0 +1 @@ +204581a0e2b22d8faf32d4eebcea65ac \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.png b/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2370fccb42f11982551d90eb2c9cfcaa4feec1e0 GIT binary patch literal 4453 zcmcgwg?b5-|x3hlHq-AN-|b52!beebu^5@I1IjC zq{QI2k^SZ+7>Molv^Aj1KcB+Z(o6`VW!2SCeGr(xH5X(^@61Vp7h@^Y5bWbktfhEz z<9(q;t(B&om#`ZN_2-%~RqVLnQMnuSm9nqV4qHO= zJTU4)8(JU59nR-rlsD6bkvwP0QrEr>)-->DALWI;9wZA+ksww}EO~ZVi-2)sgvhA5 z6^#N(7n3^GNeu{4%pTcfhSx;BmH^2y0vYiw+s z7LDQ0NKcPEI}1f+kCuT666ltGPUM?6H&NNDRwFnZ&j0GGD(hE4q(LwE6=U%li`=n% z|NShhhOpDRAqr1=I=aHr($c-%)q;rfR#C(>X1izxfx9~Iu}{wiq@|_hz`#I??oGNL7Kh#4 z-Oagx1t*`ze2E?wNCrKxXl7~o#ooc;8gz8_+ZQaEsY5x~+S+a|b|qB4dzYBXq4e@S zqB)C^nYkuQEXdT9F*!BWRBlfH+sDEE5`%&vQJaQ#4IWx4adBjSmWTr{FR!q&@@p8< z;I*P_ZK(E7^t>$!^?n*74Q1uzyz@VuR54DY8vbC{Wnp8J-`PS)LM0CA3%-yP5)$&i zI12(6NIe=rTGx9nPs5PRVz!Pc5))HXeb9#=KkUI|R|2&&Pe!79$kC>yjN2IhTbQA_ z^`d~FpgmYOGScoj-}1%H-91%BQ8aYs&W5gaBaB^kLWczsuaRCeZD8CMoQMQ~0`OpxuTq^2q~hYsNv zyI>G8F>%A=4W_g6b0e_H&d#ec*-O?D`$xe|97-$IwY8ddc7JuYu*rIQ-36%x zN=;Q&7|)FxGd54r=OSGbCWmYID?~)xw{J7>8NAl8w7hn|KsohrW72oHxuHQt@P+;U z${>Ds*C?dbcXgS{tsI@IA3De>R2e5(kd52U!2jsg8ImcI?T~RzE1t_PxD5 zh8|*7Rn>u!k#tjYb0Oj6>>g5)(u#_TTnt8RW8u?XDJdxj7z|cfRrM6)os8?(n~xkF zKZ{KI2p758j7{XMIxQ|P4vdXGZ#|r_7M7HJCSvt>qNSCUAp5?HRfKkr$6CAthf+_| zFnT!mZiF)A_cKEGcqI?*b$JnXUEc2`8?H?*I+G+!@@2|mav6#-@0kt5;o!Q-1`LsOI6pYv-2#huRuObm^T{sQ;PZA{=IM{I`T$;frk9FR{ zo%3v44>F$l!23=A>w=Ym+zl6(bT6E7+4WL`huR243{wRU)-cdd{~lI)ZA0kdr$CZM zd`b$NU>4W3+Ttkp__)1I%dzYmd?8(nzlZTdz87@P6( zM7x5VNX#K+@#i=RO;Wk7-M=TE`7laaZtM>Av$!`cMXtqrJ~ltxs0={EDl0E8g-}kC za;&UxXvioTrbpk)H^pq1PZ*VzMey*iLHG0`#{2~|3-WK@zUgz(h(iY>KZ?yUvX%wPM^=~^4y25XjEF-gi-Yd_i(6$nH=`d2 zcE?k)St)Dkr0s*+(r|_{HF(R_M%m_6~oV1I3vy^L~UE9 z7%L`o^77a`JUqPc-&NPv*98>o9}Tkpv$}diS(yVo(W?BzMpC!^=k9K91qC)nM#c{x zK14P*D`W{<5)cv+Rv~nCuln!Irvhjy1nd~N`YPc2#zr!?db}5Ec6OFwLJ8RprCgVz z>*(kZmym!#HVs}d>pBl3O9KxNVSoYUW?N1Eiqad;@P51*ILB6EY@pv zh&@iWvZRDKE-vmBf(IS?3(ihUOUo}N*1Iy8XJ=;@l|aqO!^1-$EiFxY^(qWf4BER= z5OE=Q%iwhi9`6OUuj5K->FA>S`gB^(k7j01fT@)3?(TidK8nEyqyhp0q@<+n7w4yT zj*hWO^n5(Lym2#_<^F7695jM?c(>MFR#LLFNHbY}$!YBY22l?e%`R?gvRYc657|+2 zeDp|gpgHunq*f~HxbBO`*B8P}df)10f8W`m1}L4Alhgj?%T;b}?!GTy7NdR6%9L`Pi?y?c(;gJ#<8F@dDQQkbE>qd4zkUS74C+9$p1Yv)+Snpt-EDXAP zen4M`UKpxnOzy_x@haZl5|Jgi%SPYT4}R;$fx*E%+}u&_LND&ova_ek`K};`^5qhr zK8**7Uh)y2uF7=WjlCp3>a+u}j<|0$P_dkC8DDH%1i1V+lt(|ImEc9sb zB@r5p*3i`atGYU)LRLwMT`ya-d-Ge3_c0!X))6^cq?sevV}_Xd{vA0`aF-J`io?Z}mhu6HnD&_Tc}PY^ z_5s;JVDl-Q9f&>ruU`oX2_!8oEe-90GiZ1ko72q3JE{aeUS6W4q@+Ka+Yv*uxU>|r zw&nu01AI=;%p}a!Cx*b5L;>s7CfC2d)%(L`Ae(9F>0@5LWQE#Ci?zAwl4!tR&hTRx z5fRbxa`r=-YuBzqclZyRh3q2e+7c7M#KPS@CBzHIXu2MmTRaI1AZO$FBrI%?e*&^Q&WItOa&14aZ4r3 zM<5NQ%T01YxTK{S0r`4)dq?HwUYn1&4BKWVX-dWC?2kr4(By;4YU#gzzzejI$Q z#HOXCb&T(#hDC7s&9DM+)90+Elk39MgIj3D#T#YzGU+G zBI<#wcjV;-4_e$)u|L`r zY%b)5whuY1m`20PtcL;Vrsw1&g6MXDT5=xB@A%Q3>!8$I%`d7*|DFzM% zHy0N)G&Hm}iQzojnn_4crvci$z)Ze?W!9{2YeVfKp`9sT`!cDBGjg$F>J2mu`fyL}v9Wd>u4eA!-o1Nc^6IS~`0pJy ztw0P>w)bv!CT{D6?;pvlCv-VDImIaiZ1dY-TOux%f7JlnIy*a&?(XE;+S(Qt z7W~2sA0y@lrlwdx_i!WNcSBtr699Ae@^KKx!^6Xd@N@Yp+tz8pzVp*x32kl4Kz;`} zl>yZsQha;V_PqSa`dY4jylrdnBG@X{N!aZ;QDI?<7!v9g<+X!@19AUNi?gE{^z6af zXmLhXR=jD2nSd~6h!^N0C0qxkBy(enN(vJ6%|cPP1OtvlG~nd zO&+f>Ujhg+yKi5ebJ_?hu=M^bW4XD?#tkM84k{87l5IglsVEglR#sL+Lqp{z-Qs*} z$W%R=v*iA(a{sxX6AM`@VN#Nk1Q39!!nQWs;_8up3Q9@|)bwqS>A$ZA1qIP0X@H)O zxTvV;`}X!w?dbu|AR{9qDkq0!wl##g9=*^5>MuPjYvN~NMR~cJrY6yArI7f}PPIzw zdMcibcXQ7O-y3I znYf)m2>E+&8Nas|U0*NTcDk*=!piysGy^MhwK9^DYF=LA;70f_dTp-t$!1%;p2V zuRT3li5fg_N=uiD)0BT=;k0|$$F6~(ElX-|SJ5v}MwGUF;d>+Hx88~ZGF`*X&CT31 zn&y4b);8*fhPmPYyhHdS=!}Cpkhl^!<|CDw-&YXY2g;Lzic3AIU7c~{jh9*~ItGvI v>^kNe=Zq^9C`h^8)~CU+KJ + + + + + +Dynet: Member List + + + + + + + + + + +
+
+ + + + + + +
+
Dynet +
+
A dynamic neural network library written in C++
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
dynet::RmsPropTrainer Member List
+
+
+ +

This is the complete list of members for dynet::RmsPropTrainer, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
alloc_impl() override (defined in dynet::RmsPropTrainer)dynet::RmsPropTrainerprotectedvirtual
aux_allocated (defined in dynet::Trainer)dynet::Trainer
boost::serialization::access (defined in dynet::RmsPropTrainer)dynet::RmsPropTrainerfriend
clip_gradients() (defined in dynet::Trainer)dynet::Trainer
clip_threshold (defined in dynet::Trainer)dynet::Trainer
clipping_enabled (defined in dynet::Trainer)dynet::Trainer
clips (defined in dynet::Trainer)dynet::Trainer
epoch (defined in dynet::Trainer)dynet::Trainer
epsilon (defined in dynet::RmsPropTrainer)dynet::RmsPropTrainerprotected
eta (defined in dynet::Trainer)dynet::Trainer
eta0 (defined in dynet::Trainer)dynet::Trainer
eta_decay (defined in dynet::Trainer)dynet::Trainer
hg (defined in dynet::RmsPropTrainer)dynet::RmsPropTrainerprotected
hlg (defined in dynet::RmsPropTrainer)dynet::RmsPropTrainerprotected
model (defined in dynet::Trainer)dynet::Trainer
rescale_and_reset_weight_decay() (defined in dynet::Trainer)dynet::Trainer
rho (defined in dynet::RmsPropTrainer)dynet::RmsPropTrainerprotected
RmsPropTrainer(Model *m, real e0=0.1, real eps=1e-20, real rho=0.95) (defined in dynet::RmsPropTrainer)dynet::RmsPropTrainerinlineexplicit
status() (defined in dynet::Trainer)dynet::Trainerinline
Trainer(Model *m, real e0) (defined in dynet::Trainer)dynet::Trainerinlineexplicit
Trainer() (defined in dynet::Trainer)dynet::Trainerinlineprotected
update(real scale=1.0) (defined in dynet::Trainer)dynet::Trainer
update_epoch(real r=1) (defined in dynet::Trainer)dynet::Trainerinline
update_lookup_params(real scale, real gscale, size_t idx, size_t lidx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_params(real scale, real gscale, size_t idx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_rule(real scale, real gscale, const std::vector< Tensor * > &values)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
updates (defined in dynet::Trainer)dynet::Trainer
~Trainer() (defined in dynet::Trainer)dynet::Trainervirtual
+ + + + diff --git a/doc/doxygen/html/structdynet_1_1RmsPropTrainer.html b/doc/doxygen/html/structdynet_1_1RmsPropTrainer.html new file mode 100644 index 000000000..3a31e861f --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1RmsPropTrainer.html @@ -0,0 +1,221 @@ + + + + + + +Dynet: dynet::RmsPropTrainer Struct Reference + + + + + + + + + + +
+
+ + + + + + +
+
Dynet +
+
A dynamic neural network library written in C++
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
dynet::RmsPropTrainer Struct Reference
+
+
+
+Inheritance diagram for dynet::RmsPropTrainer:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for dynet::RmsPropTrainer:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

RmsPropTrainer (Model *m, real e0=0.1, real eps=1e-20, real rho=0.95)
 
- Public Member Functions inherited from dynet::Trainer
Trainer (Model *m, real e0)
 
+void update (real scale=1.0)
 
+void update_epoch (real r=1)
 
+float clip_gradients ()
 
+void rescale_and_reset_weight_decay ()
 
+void status ()
 
+ + + + + + + + + + +

+Protected Member Functions

+virtual void alloc_impl () override
 
- Protected Member Functions inherited from dynet::Trainer
+virtual void update_rule (real scale, real gscale, const std::vector< Tensor * > &values)=0
 
+virtual void update_params (real scale, real gscale, size_t idx)=0
 
+virtual void update_lookup_params (real scale, real gscale, size_t idx, size_t lidx)=0
 
+ + + + + + + + + +

+Protected Attributes

+real epsilon
 
+real rho
 
+std::vector< real > hg
 
+std::vector< std::vector< real > > hlg
 
+ + + +

+Friends

+class boost::serialization::access
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from dynet::Trainer
+real eta0
 
+real eta
 
+real eta_decay
 
+real epoch
 
+real clipping_enabled
 
+real clip_threshold
 
+real clips
 
+real updates
 
+bool aux_allocated
 
+Model * model
 
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.map b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.map new file mode 100644 index 000000000..1e32ce6f9 --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.md5 b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.md5 new file mode 100644 index 000000000..3e1122ad2 --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.md5 @@ -0,0 +1 @@ +94a47912a64a87e1820234064f7d40ea \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.png b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..83deee80854a6bf7070d56ecdf3199a5f4174ad7 GIT binary patch literal 3625 zcmcIn^;=Zy7T$*egpp7wC6)9L!U3dVlm_V%kOoCyh(nI_B}C~Sa6rV790m?GNQZ>v zfTVPT#2_s(a5v}N=ehSExNASN*AMgU_|{r)?6-P4YSd6>C;$M|8tTdhU@ioI9uy?t znM}DP7fj@KPt=rw%d6uWQUN0eug2=&$5)vlb(RM?B)Jr}yT+z6s+Yi&vt{8zVt- zT3Mu9rU%tF!v@?5@at`1f=G_F;0u}K={1G5+O_&)xwZEJ3l-|gq~zx|!)yRVUZl+) z$|aY7mAWRVw`Lpb8yjaPuzjLg+1X;EqOp^ty%UxGj4{=A9Z)7FCNxeIm8i~5O--%Z zJjEGD1*E2?-mXvkuB@TaExz8ijL@=;=%QEsJEh*?J9lp;cG{Ka=jJXh+Ks(DKi|iT zaVw(j4$ctfpF=L2YHE&Qm*--y`&au>lwm;VHCpzDy&i!=Dj-lH1imIAA+ghZd0`Z( z$y8~Gz?w`A4~yaAYOg{X`05}EczAe-4Ay36Tbi3s(y6M;9?%{#$E~gpp$Pc@DpwIZD5i>H zk#sA;VtFXSdRN@$ni|0>1A81Q$^+p3j2`PuvokZq&9dfv3EgZN zGQhcdvb8lgKmRqiMo7qIRh4+pRJF^vdNM0JJ9#J$Cy~sJ6f{%3K`Q#$|FF2Apx}MF zy;$*2At51d4gR#Au`!cOt^A>v;7;PrN9bmMA`PJ+1S{Mv|U^_`4XJFlX-xa70(dj;rQpz zQkhz-D=QC+^A>jR=7^D=dY!jLUPqx&Mg0NCgj_{a(}|k7;AiIMb^eFWj*gB!q5WeC z-vN6HH(59jyJ*cY?zMf8-%??sH9UGctAdnc01V0>Rsp)!@K* ztNnq>%zY{sUj9E={gE*Z*0C?_sY!m^?`EFtOz6wUkufp7edkY@+3^ryd5^IUa)%5o z|666d5#HDb=Y7iPA%8?51t28Efy$WA*zu5a1PaUCH#bv`54$%vr`F>m*+m$dN=mv% zM%qV4K9y|I%#;s8;@bq$Hlm|nq-mlJocQ_QMZGriR#S#ZL9H!=baVASRw(8cV_owk z+09$@e^pfQN=%WaX=|Ax;*TaMVIm?%;41Xc2kmO}fWr;>BJVe|h4~y?5oIL}7!wyC z7jfq8kP9zlDPo;Oc0t(c{Lf|4#mMWhZ?~x8=6M2j6Sh|SC9p@K5YZfX!WXKa!~7TcMrxRx>Uo~?lYLlxoicVbc@2LlLfjpsP;Gm{-PqrM3+qe2 zppguBOIPQ<-MIBoX|7g`oJjQK<70_i4WYCuGJ=F=e!ui@X^)th6ZZSFJWr_U2ib6e z7m%3f0R{H1A|C}K^}Wox2+yatAblwpI|J1eIz6bMph>e||)7+cSOgyJ8)=t-Gv@bUI; zI9WxFms+BdUv_qmk0bfLYAqxsYy9Sd{6HiauB3D=y+R4Yv+gn-!J0qEVQzpoCV zt-|5r6B2TiV^UtUNn2q?8JU>W)YQ(-&UU72E32y+0G%wUr1$URspz4RkM6#7ae)BV z)^i~5Wn^S%qa+xZn7AO-=GiC|3;k83qEHwU%v|u9D?mX*qe>3a;Rr>^v#~Gj?GaxV zOifKcXoHvc^z?w2x3siWI^s=?ja5`t$w^7+85udlQIhVRot>vAC!mHH8ym;XvcV;Q zm*UJLZia@22*j_MdcWtQW}p&+VhZlb)6?^HR8-RApr9acZ*M)l!MAjLM#Wvhom%)Q z?6aE1#YIw*$Li`|zgIdQ>I}E&4DU;qdYn4S3_%`PHJBP0+~VK}S?$XN*>QT>0x+%j zbqxxVKW)!!!pZKd4r0dCmwSnxctgK(Z5ap(Un`79p zu(0;_b}`2R^}KJnxw)XrXlZ$LfYH{~Af$suq;_WnmegTWXREX$DH6(CwqIYWDlxDNj|=U@N2Yn zwY3Zk3_QHN(H)DR&dNVglF=4c{KBBDW%{cZDSSOrk%NOnAqS)fPw_|cm*@K+Sn~47 zfMN`Wcz#~kz;gRGC>SS`E@i&~%yrTaohK6Qj+%7UYU5Mf^pjld4YHVnbV%2eV-Im>HSOPn>u~Fwbg~L28;|yy|G0!@ET{F~`f9N~RmFW?`Lm-T0 zf2gagBLPtTN4vX47>t*XPa`N<@8tvTL%^Z~gF#2bqoWMBZYjDN*jL}9XJC+)mi{f& zpa|TjmaZ%fPy zGF{B*0O*j6Wu&Ej{QS@rm6c-8HH;N#mgBxGRMpgQ$ogvK>d6r_A2tjp;x$BU7uZ-? zgD;84Dlv??{ZX_WAKU7DHfcB%8ax)-p7*Brqa+h5IHXrVz$*lwOKrGhYK=|FX6`6v zWM)#5hJoHKnVULuR3J?gYl2En{%C@6adxI*mD01a(xLv50P!JC*Lr=2OFX`Tm)oZT zynTH+ZGjJsjcmjNo?DbTc*%B@L6MfmRhZR!=4s{?mz1zNIUx$PPn|X*qE127uPiT* zjE^559nCfcq29@WA(dY7l7<6`&hD4(M#p%dHTU%Q} z#}F&HX=`hH57}FU?tI;0_g48M*ofBF$7z}!3m%2J!4^`i@nvN@PpyMgZnT553wCp? z%sRpM`HL66-rncn;Db(uMFK9;j?&CCz>KoeI3f_Y^PFof6bSkWn^hWOwhIslgo~3C zOJqd~QuBDESj>hBJfEY$0O?7q9WSipPcOIr5 z9v_1ZfjgKbyxL#gMaV&RAhi~R3*y=S-X3UX@j0-N^}%}&kS>Fi5TK>hvVLo8E8@y} z`Jb#HYusj{H^$4Xn;r4*mzN#f-Q9~l;etX!baZsI917=S&)lV@q#8~)FlR^GEXRdO z*)I@3(R*dODXHn{AVzfkiT7c!W(;OCoK^wRmT@7RaZ!!qYaJi2`Si)5H(ki6f23rT zmX?-|RNu_(Q2(-f6ZHH*elt w*xtrI3*S+T{3EJ+H=~Ur;rG~|f2T{bXM;qw_Yquf;I|*3p`xQ)s%R7TZ$n)b-T(jq literal 0 HcmV?d00001 diff --git a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.map b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.map new file mode 100644 index 000000000..1e32ce6f9 --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.md5 b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.md5 new file mode 100644 index 000000000..3e1122ad2 --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.md5 @@ -0,0 +1 @@ +94a47912a64a87e1820234064f7d40ea \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.png b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..83deee80854a6bf7070d56ecdf3199a5f4174ad7 GIT binary patch literal 3625 zcmcIn^;=Zy7T$*egpp7wC6)9L!U3dVlm_V%kOoCyh(nI_B}C~Sa6rV790m?GNQZ>v zfTVPT#2_s(a5v}N=ehSExNASN*AMgU_|{r)?6-P4YSd6>C;$M|8tTdhU@ioI9uy?t znM}DP7fj@KPt=rw%d6uWQUN0eug2=&$5)vlb(RM?B)Jr}yT+z6s+Yi&vt{8zVt- zT3Mu9rU%tF!v@?5@at`1f=G_F;0u}K={1G5+O_&)xwZEJ3l-|gq~zx|!)yRVUZl+) z$|aY7mAWRVw`Lpb8yjaPuzjLg+1X;EqOp^ty%UxGj4{=A9Z)7FCNxeIm8i~5O--%Z zJjEGD1*E2?-mXvkuB@TaExz8ijL@=;=%QEsJEh*?J9lp;cG{Ka=jJXh+Ks(DKi|iT zaVw(j4$ctfpF=L2YHE&Qm*--y`&au>lwm;VHCpzDy&i!=Dj-lH1imIAA+ghZd0`Z( z$y8~Gz?w`A4~yaAYOg{X`05}EczAe-4Ay36Tbi3s(y6M;9?%{#$E~gpp$Pc@DpwIZD5i>H zk#sA;VtFXSdRN@$ni|0>1A81Q$^+p3j2`PuvokZq&9dfv3EgZN zGQhcdvb8lgKmRqiMo7qIRh4+pRJF^vdNM0JJ9#J$Cy~sJ6f{%3K`Q#$|FF2Apx}MF zy;$*2At51d4gR#Au`!cOt^A>v;7;PrN9bmMA`PJ+1S{Mv|U^_`4XJFlX-xa70(dj;rQpz zQkhz-D=QC+^A>jR=7^D=dY!jLUPqx&Mg0NCgj_{a(}|k7;AiIMb^eFWj*gB!q5WeC z-vN6HH(59jyJ*cY?zMf8-%??sH9UGctAdnc01V0>Rsp)!@K* ztNnq>%zY{sUj9E={gE*Z*0C?_sY!m^?`EFtOz6wUkufp7edkY@+3^ryd5^IUa)%5o z|666d5#HDb=Y7iPA%8?51t28Efy$WA*zu5a1PaUCH#bv`54$%vr`F>m*+m$dN=mv% zM%qV4K9y|I%#;s8;@bq$Hlm|nq-mlJocQ_QMZGriR#S#ZL9H!=baVASRw(8cV_owk z+09$@e^pfQN=%WaX=|Ax;*TaMVIm?%;41Xc2kmO}fWr;>BJVe|h4~y?5oIL}7!wyC z7jfq8kP9zlDPo;Oc0t(c{Lf|4#mMWhZ?~x8=6M2j6Sh|SC9p@K5YZfX!WXKa!~7TcMrxRx>Uo~?lYLlxoicVbc@2LlLfjpsP;Gm{-PqrM3+qe2 zppguBOIPQ<-MIBoX|7g`oJjQK<70_i4WYCuGJ=F=e!ui@X^)th6ZZSFJWr_U2ib6e z7m%3f0R{H1A|C}K^}Wox2+yatAblwpI|J1eIz6bMph>e||)7+cSOgyJ8)=t-Gv@bUI; zI9WxFms+BdUv_qmk0bfLYAqxsYy9Sd{6HiauB3D=y+R4Yv+gn-!J0qEVQzpoCV zt-|5r6B2TiV^UtUNn2q?8JU>W)YQ(-&UU72E32y+0G%wUr1$URspz4RkM6#7ae)BV z)^i~5Wn^S%qa+xZn7AO-=GiC|3;k83qEHwU%v|u9D?mX*qe>3a;Rr>^v#~Gj?GaxV zOifKcXoHvc^z?w2x3siWI^s=?ja5`t$w^7+85udlQIhVRot>vAC!mHH8ym;XvcV;Q zm*UJLZia@22*j_MdcWtQW}p&+VhZlb)6?^HR8-RApr9acZ*M)l!MAjLM#Wvhom%)Q z?6aE1#YIw*$Li`|zgIdQ>I}E&4DU;qdYn4S3_%`PHJBP0+~VK}S?$XN*>QT>0x+%j zbqxxVKW)!!!pZKd4r0dCmwSnxctgK(Z5ap(Un`79p zu(0;_b}`2R^}KJnxw)XrXlZ$LfYH{~Af$suq;_WnmegTWXREX$DH6(CwqIYWDlxDNj|=U@N2Yn zwY3Zk3_QHN(H)DR&dNVglF=4c{KBBDW%{cZDSSOrk%NOnAqS)fPw_|cm*@K+Sn~47 zfMN`Wcz#~kz;gRGC>SS`E@i&~%yrTaohK6Qj+%7UYU5Mf^pjld4YHVnbV%2eV-Im>HSOPn>u~Fwbg~L28;|yy|G0!@ET{F~`f9N~RmFW?`Lm-T0 zf2gagBLPtTN4vX47>t*XPa`N<@8tvTL%^Z~gF#2bqoWMBZYjDN*jL}9XJC+)mi{f& zpa|TjmaZ%fPy zGF{B*0O*j6Wu&Ej{QS@rm6c-8HH;N#mgBxGRMpgQ$ogvK>d6r_A2tjp;x$BU7uZ-? zgD;84Dlv??{ZX_WAKU7DHfcB%8ax)-p7*Brqa+h5IHXrVz$*lwOKrGhYK=|FX6`6v zWM)#5hJoHKnVULuR3J?gYl2En{%C@6adxI*mD01a(xLv50P!JC*Lr=2OFX`Tm)oZT zynTH+ZGjJsjcmjNo?DbTc*%B@L6MfmRhZR!=4s{?mz1zNIUx$PPn|X*qE127uPiT* zjE^559nCfcq29@WA(dY7l7<6`&hD4(M#p%dHTU%Q} z#}F&HX=`hH57}FU?tI;0_g48M*ofBF$7z}!3m%2J!4^`i@nvN@PpyMgZnT553wCp? z%sRpM`HL66-rncn;Db(uMFK9;j?&CCz>KoeI3f_Y^PFof6bSkWn^hWOwhIslgo~3C zOJqd~QuBDESj>hBJfEY$0O?7q9WSipPcOIr5 z9v_1ZfjgKbyxL#gMaV&RAhi~R3*y=S-X3UX@j0-N^}%}&kS>Fi5TK>hvVLo8E8@y} z`Jb#HYusj{H^$4Xn;r4*mzN#f-Q9~l;etX!baZsI917=S&)lV@q#8~)FlR^GEXRdO z*)I@3(R*dODXHn{AVzfkiT7c!W(;OCoK^wRmT@7RaZ!!qYaJi2`Si)5H(ki6f23rT zmX?-|RNu_(Q2(-f6ZHH*elt w*xtrI3*S+T{3EJ+H=~Ur;rG~|f2T{bXM;qw_Yquf;I|*3p`xQ)s%R7TZ$n)b-T(jq literal 0 HcmV?d00001 diff --git a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer-members.html b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer-members.html new file mode 100644 index 000000000..33151791f --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer-members.html @@ -0,0 +1,128 @@ + + + + + + +Dynet: Member List + + + + + + + + + + +
+
+ + + + + + +
+
Dynet +
+
A dynamic neural network library written in C++
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
dynet::SimpleSGDTrainer Member List
+
+
+ +

This is the complete list of members for dynet::SimpleSGDTrainer, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
alloc_impl() (defined in dynet::Trainer)dynet::Trainerinlineprotectedvirtual
aux_allocated (defined in dynet::Trainer)dynet::Trainer
boost::serialization::access (defined in dynet::SimpleSGDTrainer)dynet::SimpleSGDTrainerfriend
clip_gradients() (defined in dynet::Trainer)dynet::Trainer
clip_threshold (defined in dynet::Trainer)dynet::Trainer
clipping_enabled (defined in dynet::Trainer)dynet::Trainer
clips (defined in dynet::Trainer)dynet::Trainer
epoch (defined in dynet::Trainer)dynet::Trainer
eta (defined in dynet::Trainer)dynet::Trainer
eta0 (defined in dynet::Trainer)dynet::Trainer
eta_decay (defined in dynet::Trainer)dynet::Trainer
model (defined in dynet::Trainer)dynet::Trainer
rescale_and_reset_weight_decay() (defined in dynet::Trainer)dynet::Trainer
SimpleSGDTrainer(Model *m, real e0=0.1) (defined in dynet::SimpleSGDTrainer)dynet::SimpleSGDTrainerinlineexplicit
status() (defined in dynet::Trainer)dynet::Trainerinline
Trainer(Model *m, real e0) (defined in dynet::Trainer)dynet::Trainerinlineexplicit
Trainer() (defined in dynet::Trainer)dynet::Trainerinlineprotected
update(real scale=1.0) (defined in dynet::Trainer)dynet::Trainer
update_epoch(real r=1) (defined in dynet::Trainer)dynet::Trainerinline
update_lookup_params(real scale, real gscale, size_t idx, size_t lidx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_params(real scale, real gscale, size_t idx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_rule(real scale, real gscale, const std::vector< Tensor * > &values)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
updates (defined in dynet::Trainer)dynet::Trainer
~Trainer() (defined in dynet::Trainer)dynet::Trainervirtual
+ + + + diff --git a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer.html b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer.html new file mode 100644 index 000000000..772a059ea --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer.html @@ -0,0 +1,201 @@ + + + + + + +Dynet: dynet::SimpleSGDTrainer Struct Reference + + + + + + + + + + +
+
+ + + + + + +
+
Dynet +
+
A dynamic neural network library written in C++
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
dynet::SimpleSGDTrainer Struct Reference
+
+
+
+Inheritance diagram for dynet::SimpleSGDTrainer:
+
+
Inheritance graph
+ + +
[legend]
+
+Collaboration diagram for dynet::SimpleSGDTrainer:
+
+
Collaboration graph
+ + +
[legend]
+ + + + + + + + + + + + + + + + + +

+Public Member Functions

SimpleSGDTrainer (Model *m, real e0=0.1)
 
- Public Member Functions inherited from dynet::Trainer
Trainer (Model *m, real e0)
 
+void update (real scale=1.0)
 
+void update_epoch (real r=1)
 
+float clip_gradients ()
 
+void rescale_and_reset_weight_decay ()
 
+void status ()
 
+ + + +

+Friends

+class boost::serialization::access
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from dynet::Trainer
+real eta0
 
+real eta
 
+real eta_decay
 
+real epoch
 
+real clipping_enabled
 
+real clip_threshold
 
+real clips
 
+real updates
 
+bool aux_allocated
 
+Model * model
 
- Protected Member Functions inherited from dynet::Trainer
+virtual void alloc_impl ()
 
+virtual void update_rule (real scale, real gscale, const std::vector< Tensor * > &values)=0
 
+virtual void update_params (real scale, real gscale, size_t idx)=0
 
+virtual void update_lookup_params (real scale, real gscale, size_t idx, size_t lidx)=0
 
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.map b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.map new file mode 100644 index 000000000..9ffc60dcc --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.map @@ -0,0 +1,3 @@ + + + diff --git a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 new file mode 100644 index 000000000..2ea81c69c --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 @@ -0,0 +1 @@ +2ab1be7e9def8b7164392754c4dcfb78 \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.png b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e669a15870b9fe3b756fcc13c7806f807c35ba96 GIT binary patch literal 3804 zcmc(ii91yP+s98SmAxz>%a~*fNn|G?Gg6iivSn+?mVF|F60&bo%JOBhO_ppEvQ`*m zEE!v&%rN%s3}!sX_j;b|`CZRH@OhU zO~GR=7(S5B5M#~}p-xl;?y z3{NaP=}^PJ#LmL>KY`u5hpVk!o@%j|%D`%E#dq`_4WnMTVn1q#NOW;=Dbe~HU)a!~ zs-$$Eh6K+hlgVU+)Rv)h4_b!5D~=+}%QgBRaqX+{&dLPFSi&8ao{^!)mo$Ysw7t!R zBs<(`e20QRVM+A8D=1s9>eM-u}8mZIXIFBd4fD~sYrGZ>0SGn}qA!jlI z7Ke$$!^dyv>V6|+t91c+#;~FvsQqOn;2&cN3L(21hjW$B6u+AVVfg0w#MznrC5m~> zBhcCTy`{9>=Rg?=0pIqs4+jS#SR^iAzIN@}htg7MDXFSYpNf9W3$R7kL^-lbEtp{a ztbcm%L5A)I25!GcIypIkmk0|Bd-RAh)ARbgjP(g%W@bj3=e9Ht=ZTceOzPfZMUS(5 zBm`(38QB@Y=&K8{15ZOj&P48R|MY$q8oDyoGBr9{=R4E=Y=679rbc3R`R`xKTCh`( zs6iWfx+CF&_pdq;j?)N*@kBwj-Ow;sS1~|6c=g8BFoUOf)hHd225tPiMXchge|`bo z66axMZT&X%s)mLjAbKt~HWqGW#iz~j?z*RH*nu)t68P1KOoPM>44422H#d>fj@0#; z;}PL3bz!uI?Ck785&diBTKpF-oQdS+<8$-!;$ez1Evad2%=%tTW+!eX2i$#Cc#v1H zk+i)XsHUby%`YpH0p=DKz$sBEl%M0{Xf#?(T)c+?&*n>MB8Sbu+Vao+nGv8 zNLX1}c|^z(8A&@Y2CVL`kdA%JUYS^8D$Y*}PbQ>)yDth9?iH~C*1=MJ%r-cf_ zgF^?;b&6^Giz+HAbUM8+d*?$%v-{)6YC$W%HnD@gc*_35q3H`W!Kl+EIJmC5`kJER z79|%oT!S8qL=&_+3UIhUBGz0jaLFey@aXIp!v(GD9;5vuBSmi9)p40aD2E~T?Nf{= z|2v{OW{dc#ik;sJnwp+5dlGFsAL!d*2-09{%w@TIAIh zdcgf3zBMP8l8Sycj;Sjv9|z2^g!Z_tw`h!v14{kUm5Lk#;xQmr_vwrQ2Bv^@)3ZLd zeF|tz6UU5{)AXT8)n#736q^>heXqgbxsO@^U|_H!L4Zqg8Q4u$@DE`$98ds2o}pne z8-0K6-7*@9Ha!?P z*H@+8M+iox^nU;Jy!k{SUMVQVPY~cGV;j7V`*VwZ$Mvo08w*(NN#?XbLNuP%m#IBZSBsT zJASj@k;}CsIPWPhH#c|~d3qXJ;r!=I)Mbm()6C3Ha=d^KsUrcSpOo0!PFh3D+U`N! zi_VwT{RFiWlmSo!Ua-Z*#VxL^X!??4Dl6B(swYiPGoCti5ej8tVL5*MxLrq|;X7#SHC zhs%0;dM@s0sHvB+3LNJvOg zQ88xr68Cilh28!Asd~R6kUx}_M<*sGIy<9lvIhy+!A64sXjPI+HysZyIDs(hTMw$U zwzf7L4hKFy{Q44$l`1h~0>G68ZAUZ4!ong)#ZL@WQxz4Yj}HeRYf}f|IGvi7*0R6y z`Q^)(xnX;fA|l6t^^J|LJG?9%=j}tU;spLRli!Pr7x?%xv$MhbYm|T4+uQs0O;`4H z4`~hi;X_}J#swZ8bV`bdR_n==C#OO;dMlkeK|SW~+j>$fvi_=lnn1Yg=jZ2Z0{XBn zls^H77|4&c?i(7asjl`LyhZ5h8vEouHQgS^E~JidammQcoszfE1G`#xbC6%ywGJGdocy*Hh^?)y zRaI4$Of(v8-oN49y9>YxM#jN;|Dd2C0P>C<`10k8;hj5WWo1Fj;{mk2fOgML;&qeB zh=^m6klEgM`d**m5hXb6IUCs#(9-D#)JJ_e2{AFC*LhsO0D#M!4mJ0-tGZin&7HY^ zu=(d}^eayA!I**mfq^If{-wpmA3uI9uBe#$98{s+ipQS@xT1;W<+8%U!qj}wRi%*8 z(b3)$4Kqti9w1S8dJ1xJf%8VEr;`^Juw3w>A2WR1J-*;Gc131pj(v@0=hou?z?$;9 z%Xtu?pqXowlTKD_|NZ-)=;%(}kT%N3*`_!Fknv2f=k{p@ETqFk-_AAOZ$fsd7Iml7 z9y&U%gU;D~<UK{&#I7nR9MJdwp1)$p0_fy@tf(-` zXgs0)?c29EnVBgo?~Nrs+^?X|ytXgI3In^Lnr@3AFY&}h4Zpp+p3l5tOqB>#|vnN?ymm%%Erd#SXozB7wqwVp?5#jXtqebIXF02 zR7}jm+YilzM3g+kMojVg-2L@6)NdZAYpK!QadU~J$Brobg&su?- zry-PDWol())Ysc9qpI3aSa=J?h7MB=K3;{_-cV2T@a3H=LX|6>#iuzexd!`beS-45Xx`73Afuo1O;P*w}!4)To2Z z>~#f!mA*?#l1eNBKtSW*;o;%r#DLS}k!~Qny z6c*^jqvbT{2rnbEM`~=C@6ClvSmp-ouA~YRtAwAIkBD zY%dLfU%aqTN3|hj{ + +
diff --git a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.md5 b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.md5 new file mode 100644 index 000000000..2ea81c69c --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.md5 @@ -0,0 +1 @@ +2ab1be7e9def8b7164392754c4dcfb78 \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.png b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e669a15870b9fe3b756fcc13c7806f807c35ba96 GIT binary patch literal 3804 zcmc(ii91yP+s98SmAxz>%a~*fNn|G?Gg6iivSn+?mVF|F60&bo%JOBhO_ppEvQ`*m zEE!v&%rN%s3}!sX_j;b|`CZRH@OhU zO~GR=7(S5B5M#~}p-xl;?y z3{NaP=}^PJ#LmL>KY`u5hpVk!o@%j|%D`%E#dq`_4WnMTVn1q#NOW;=Dbe~HU)a!~ zs-$$Eh6K+hlgVU+)Rv)h4_b!5D~=+}%QgBRaqX+{&dLPFSi&8ao{^!)mo$Ysw7t!R zBs<(`e20QRVM+A8D=1s9>eM-u}8mZIXIFBd4fD~sYrGZ>0SGn}qA!jlI z7Ke$$!^dyv>V6|+t91c+#;~FvsQqOn;2&cN3L(21hjW$B6u+AVVfg0w#MznrC5m~> zBhcCTy`{9>=Rg?=0pIqs4+jS#SR^iAzIN@}htg7MDXFSYpNf9W3$R7kL^-lbEtp{a ztbcm%L5A)I25!GcIypIkmk0|Bd-RAh)ARbgjP(g%W@bj3=e9Ht=ZTceOzPfZMUS(5 zBm`(38QB@Y=&K8{15ZOj&P48R|MY$q8oDyoGBr9{=R4E=Y=679rbc3R`R`xKTCh`( zs6iWfx+CF&_pdq;j?)N*@kBwj-Ow;sS1~|6c=g8BFoUOf)hHd225tPiMXchge|`bo z66axMZT&X%s)mLjAbKt~HWqGW#iz~j?z*RH*nu)t68P1KOoPM>44422H#d>fj@0#; z;}PL3bz!uI?Ck785&diBTKpF-oQdS+<8$-!;$ez1Evad2%=%tTW+!eX2i$#Cc#v1H zk+i)XsHUby%`YpH0p=DKz$sBEl%M0{Xf#?(T)c+?&*n>MB8Sbu+Vao+nGv8 zNLX1}c|^z(8A&@Y2CVL`kdA%JUYS^8D$Y*}PbQ>)yDth9?iH~C*1=MJ%r-cf_ zgF^?;b&6^Giz+HAbUM8+d*?$%v-{)6YC$W%HnD@gc*_35q3H`W!Kl+EIJmC5`kJER z79|%oT!S8qL=&_+3UIhUBGz0jaLFey@aXIp!v(GD9;5vuBSmi9)p40aD2E~T?Nf{= z|2v{OW{dc#ik;sJnwp+5dlGFsAL!d*2-09{%w@TIAIh zdcgf3zBMP8l8Sycj;Sjv9|z2^g!Z_tw`h!v14{kUm5Lk#;xQmr_vwrQ2Bv^@)3ZLd zeF|tz6UU5{)AXT8)n#736q^>heXqgbxsO@^U|_H!L4Zqg8Q4u$@DE`$98ds2o}pne z8-0K6-7*@9Ha!?P z*H@+8M+iox^nU;Jy!k{SUMVQVPY~cGV;j7V`*VwZ$Mvo08w*(NN#?XbLNuP%m#IBZSBsT zJASj@k;}CsIPWPhH#c|~d3qXJ;r!=I)Mbm()6C3Ha=d^KsUrcSpOo0!PFh3D+U`N! zi_VwT{RFiWlmSo!Ua-Z*#VxL^X!??4Dl6B(swYiPGoCti5ej8tVL5*MxLrq|;X7#SHC zhs%0;dM@s0sHvB+3LNJvOg zQ88xr68Cilh28!Asd~R6kUx}_M<*sGIy<9lvIhy+!A64sXjPI+HysZyIDs(hTMw$U zwzf7L4hKFy{Q44$l`1h~0>G68ZAUZ4!ong)#ZL@WQxz4Yj}HeRYf}f|IGvi7*0R6y z`Q^)(xnX;fA|l6t^^J|LJG?9%=j}tU;spLRli!Pr7x?%xv$MhbYm|T4+uQs0O;`4H z4`~hi;X_}J#swZ8bV`bdR_n==C#OO;dMlkeK|SW~+j>$fvi_=lnn1Yg=jZ2Z0{XBn zls^H77|4&c?i(7asjl`LyhZ5h8vEouHQgS^E~JidammQcoszfE1G`#xbC6%ywGJGdocy*Hh^?)y zRaI4$Of(v8-oN49y9>YxM#jN;|Dd2C0P>C<`10k8;hj5WWo1Fj;{mk2fOgML;&qeB zh=^m6klEgM`d**m5hXb6IUCs#(9-D#)JJ_e2{AFC*LhsO0D#M!4mJ0-tGZin&7HY^ zu=(d}^eayA!I**mfq^If{-wpmA3uI9uBe#$98{s+ipQS@xT1;W<+8%U!qj}wRi%*8 z(b3)$4Kqti9w1S8dJ1xJf%8VEr;`^Juw3w>A2WR1J-*;Gc131pj(v@0=hou?z?$;9 z%Xtu?pqXowlTKD_|NZ-)=;%(}kT%N3*`_!Fknv2f=k{p@ETqFk-_AAOZ$fsd7Iml7 z9y&U%gU;D~<UK{&#I7nR9MJdwp1)$p0_fy@tf(-` zXgs0)?c29EnVBgo?~Nrs+^?X|ytXgI3In^Lnr@3AFY&}h4Zpp+p3l5tOqB>#|vnN?ymm%%Erd#SXozB7wqwVp?5#jXtqebIXF02 zR7}jm+YilzM3g+kMojVg-2L@6)NdZAYpK!QadU~J$Brobg&su?- zry-PDWol())Ysc9qpI3aSa=J?h7MB=K3;{_-cV2T@a3H=LX|6>#iuzexd!`beS-45Xx`73Afuo1O;P*w}!4)To2Z z>~#f!mA*?#l1eNBKtSW*;o;%r#DLS}k!~Qny z6c*^jqvbT{2rnbEM`~=C@6ClvSmp-ouA~YRtAwAIkBD zY%dLfU%aqTN3|hj{ + + + + + +Dynet: Member List + + + + + + + + + + +
+
+ + + + + + +
+
Dynet +
+
A dynamic neural network library written in C++
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
dynet::Trainer Member List
+
+
+ +

This is the complete list of members for dynet::Trainer, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + +
alloc_impl() (defined in dynet::Trainer)dynet::Trainerinlineprotectedvirtual
aux_allocated (defined in dynet::Trainer)dynet::Trainer
boost::serialization::access (defined in dynet::Trainer)dynet::Trainerfriend
clip_gradients() (defined in dynet::Trainer)dynet::Trainer
clip_threshold (defined in dynet::Trainer)dynet::Trainer
clipping_enabled (defined in dynet::Trainer)dynet::Trainer
clips (defined in dynet::Trainer)dynet::Trainer
epoch (defined in dynet::Trainer)dynet::Trainer
eta (defined in dynet::Trainer)dynet::Trainer
eta0 (defined in dynet::Trainer)dynet::Trainer
eta_decay (defined in dynet::Trainer)dynet::Trainer
model (defined in dynet::Trainer)dynet::Trainer
rescale_and_reset_weight_decay() (defined in dynet::Trainer)dynet::Trainer
status() (defined in dynet::Trainer)dynet::Trainerinline
Trainer(Model *m, real e0) (defined in dynet::Trainer)dynet::Trainerinlineexplicit
Trainer() (defined in dynet::Trainer)dynet::Trainerinlineprotected
update(real scale=1.0) (defined in dynet::Trainer)dynet::Trainer
update_epoch(real r=1) (defined in dynet::Trainer)dynet::Trainerinline
update_lookup_params(real scale, real gscale, size_t idx, size_t lidx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_params(real scale, real gscale, size_t idx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_rule(real scale, real gscale, const std::vector< Tensor * > &values)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
updates (defined in dynet::Trainer)dynet::Trainer
~Trainer() (defined in dynet::Trainer)dynet::Trainervirtual
+ + + + diff --git a/doc/doxygen/html/structdynet_1_1Trainer.html b/doc/doxygen/html/structdynet_1_1Trainer.html new file mode 100644 index 000000000..c0dc7cdaf --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1Trainer.html @@ -0,0 +1,193 @@ + + + + + + +Dynet: dynet::Trainer Struct Reference + + + + + + + + + + +
+
+ + + + + + +
+
Dynet +
+
A dynamic neural network library written in C++
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
dynet::Trainer Struct Referenceabstract
+
+
+
+Inheritance diagram for dynet::Trainer:
+
+
Inheritance graph
+ + +
[legend]
+ + + + + + + + + + + + + + +

+Public Member Functions

Trainer (Model *m, real e0)
 
+void update (real scale=1.0)
 
+void update_epoch (real r=1)
 
+float clip_gradients ()
 
+void rescale_and_reset_weight_decay ()
 
+void status ()
 
+ + + + + + + + + + + + + + + + + + + + + +

+Public Attributes

+real eta0
 
+real eta
 
+real eta_decay
 
+real epoch
 
+real clipping_enabled
 
+real clip_threshold
 
+real clips
 
+real updates
 
+bool aux_allocated
 
+Model * model
 
+ + + + + + + + + +

+Protected Member Functions

+virtual void alloc_impl ()
 
+virtual void update_rule (real scale, real gscale, const std::vector< Tensor * > &values)=0
 
+virtual void update_params (real scale, real gscale, size_t idx)=0
 
+virtual void update_lookup_params (real scale, real gscale, size_t idx, size_t lidx)=0
 
+ + + +

+Friends

+class boost::serialization::access
 
+
The documentation for this struct was generated from the following file: +
+ + + + diff --git a/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.map b/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.map new file mode 100644 index 000000000..59bf6fdd0 --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.map @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.md5 b/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.md5 new file mode 100644 index 000000000..40dccaa27 --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.md5 @@ -0,0 +1 @@ +b4c574a7839d3e03e0f6b9a8f080d868 \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.png b/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..82f8933928999689aafb0f675c4fd8ecbe5f23a2 GIT binary patch literal 22599 zcmbrm1yoh*8}7S61q7r^S_A=UM7pHAQ$R{oI;2yiTN+eKN;;I5kQ7kq?(S|xyzly- zy64_=#yEG}vE5^DS!*)uo8R|7&+~g{n3{_09ZYge1OjnKUQS8_fk3fA6*9zzd!UXt<)3l**Tho z1o1a-#8E%?9WBRx_~`Z9%Pwy0!|OefWJ#%;!KP#~%nrmYgE zZJY{$3>NSy!>7V^1lg)lPHwL0N>3tQm{d4UkY%fume&4Kj96<=PvPv8nOBcew(H5J zc3@Btvmka}7#0>*+encvMGjka{!gCU`1ttYIR2Kc{FEvIRUN1Qi=DK_akp_s5}3-T zTApfXXpkR^M}KSjckSiCPkDZEp>0rI?ep$s)Y^WSgi85oR7 z20qq|zkX$9C84QFh-g_mLP0!u@Sw_StffV~)EHYCWlHnKd*WERn|^+N@cnFy-lX-Z z8je!KI#k5|!GV8ra&iu9Mqfx$5{cdHx7(S^h9mv`YU7iW5~`}W6udU?5{NNw?w_0l zRa9_AMn=wWZDIL~zj@Z^iSkZGX2mbO_tKJ@ge3U-?;mqGr1FZ2*hz!ZLRsj8kALvCNLCk8I@DV-T-S_A|ootN_ogXYQi-@EV5E2%6o$Y=#>%de{Q7OeU ze)fzSzNuZ$N)l1v^XHU^j7&~Ssz|4VPDn_o?($tmhU(_#CeO>?ls!Lx=Dd4{hbrEe zAy(!j;_*kVNld#+H>r3>?Q*)@v~7KR;!FF|!NZcGtINH^X9?9^Yey^B(}+wskGkGw ztfYignUXyDiOI?Lu6wg=C)4R7UKohmK@!|tTv?A^{>H-}*k5St?(0+4z(J%5xkZPD zhDSu)Mldik65_{3Mcp}Y7nYwG%2$og&d&b%Tq~`%mS00#J9m5AhK{b@aS072bE?K( zcPgaDeh!8x!NG+$L6{T~1qDmkm%@|f9m$Jpt&wN?+6*i0?d?`uafu1mf8Z!}3GbvP zOr&rR6+eIeyk%fOeNzA(9UZ|C|2vX`4<|M@*1^F+TuBKV^~R0dp7*J#D2U8FbMiF*6^ z;1d%Ez3fY0Xb&SizuYQgC~K=xz^Y}jjRJKh*tDRrB!b=0eKVxSiDjcjk1s%>a6 z?@eNh8&m8PMZD21du9s5lRKHiu=dSbUxxYSa6$jTK&)_{QtI2~<>&PD^jZ_hyYs2G zmJ9|J6Dw;w-<F~0pnvTO%lwY<-I-C zG(i_STU*=BnFhX&jt=<|F28HUPCnx1D@_MSrD>e3<-dDS3H$xxBNZ zTxQ(-z+YVa_wV01+1dB?%dXB}O{{nvtq#1qC;70Q4Mx3rSM*o!i$kkFczAf?o}Ql1 zO--M`?33Fa&ln#Yt6sIGJsMJZ(7mZ@v6HAhlH#PFIKp79RF}6WZQFU)J36Ok-t*Cq z;(3Y;GaVf&A)|_vk#D4K$*3DD=h>3|8 zHiq&saBw6O7_)=0wImh z@E!B6rkHdQp*Ov@)O?fA-;*F8|FsOibkn_AMSk~vLD-7RMo%}A<{yfok!@yP-lz3_ zveh&=2_DRj4vCM#9_aV(B|9FNaVse~b6F^;{`|Osed7ida=$JxXk`j4EE*-$`aQPi z{BC*s;!jU+bNYDF)Yj^KS-71iZzi9ru7FD;+BI6T=CI!H^3|>+O#jPAE)ORTGKv}v z=U3R8Ww1CU^rQ)??l=GY8`KuEG*E3z;qGzL_SLd+;L|Oku@p;cfoo z6HsMk67b342!%(G#xHDI1%!qMIk@f?ua}d_n8M~n zi{0^tSBJfp+f$_IusNmRF|+5{?q}rZ3-CF)mffzk&5S3`lP4AB<^65dwvYA)WM^6y z%1tqYQO03n62FOxk9y-@Ygu!rxS}Fe1SxLEa(829Vb6ny&r>SL)44VG*o}Qd6IpQS z?k_Qj{&mJ%{q;I1DXIQbn;BVddmOi>{odd;GPUeZSGO^e{;k(q-B1BXqZ9JGTXj~pLtO$^>O~x41405^I`LR9|CYqci z566ixCBFl=Rq!4Oq3bq3u2{2qc?DNTcf6vh^%Q6P+eb>8FhGxfb8|m48~F6M*7Gs( z(dwO+N{hB}qW9REitwweWTY_eM76<=zqd-@c15#EjFs9FBX?|t{4_4{1T(|0i6)ty z!F-|BU$3$~ZHMZS5|xR3YC*-Lm%9rQ9H)}Hx`gWL8ExI&8Uy#Zl;Xd$=bJ4*APPSi zQf1_Py^4cPW)cw3m|PzClhY+~hxw6H_s^dlZ*Mg(UHee`UVC6ZP&ya?&xXhgRbt*{ zXWAX-@YOm$1~$r+M3+%?NbcUfduNpT14DEyGs_n7>hGC=KW7kZ%2jLkW2CqrrzG(UM?+i*&5Yr^7ilvDohyPmwt4g zD7?aH<;nIOO^9}pjM?|MDB(B--GmVxKf1dM4m@F*k%1yWB~9=aA0HobB_16eJ;5`b zfdwNlFYf{3P2buLgp!h#8%d16zrSHK!Fz)0{OQPV9-5I8U)<*R7bq}r(uZsaE9L0l zHaCkEmy`@tS|}dxOp)rA8loW1&(B+Wdlfa3`qm^B6|wm2XK$)G#VWjd#bje^o0Xp* za)*Lft_Slb>iOkm>-adCjEoGjcoe4;;zWxddZ+YyOzd!mz zHO>C)o1Ue}NR@Ho`>&e54Z|<~^jfJF;197buQuhy-uJs_FvYPkS*0Z%qPd1pb9b*b zw77wa`s2rsP`dl~H((WV-X7iwpUx*SpgKbaW5d*^}rW(a}**P%Iv}$5rO5W;~FUl}!yR5Oj2O z%qc8Xn3$N5l5$?^yn`wZBdxR=*M6=kHz$XF@#un{AdHEZSBD_Ku~8%_I9QQ;jGVOUoT z&3!H|{N3H%@k)z`<&(ij_=tIs$>SB~AwO5JNZIFMl%@!}Jal$;rjKFP%tIFAw{PFp zK3#wZl!=`^7%nd+7S_QpzBvQ}6BBd4n=!*=qS68>Rh^ui98S0Oi}kp1h@L48d2zbSsBsD5XNW$-+H%q%9> zEFqL@p0bjBbaZ5Sx;-(Rr%W+8HpXagZ}0i{^6~APs7|h~52&c9x;Sc+uRZJCNP5=C_Ng(^D}tn2?;Kgu%>hx&GQqST1Ad)gbn#K=o)AdBbo zdwL5G?~9dW9*dp?!6H?CN)gWl0s?}ZbRqYBS^+`9hfH)Ud7(K!gE`*6V>9?|GEyjc ze%KpRZZ#qcPp|sJhYuxSDtsFdz~#1Uh@8hj$8y&KA#6xhXI6>_G{J^I=kj3@SOujDmK3(xMA2P4AXRY?l%55oJGsILH*`v*V ze&4(=GzLtEDYUhnV^j`3N1tq<*fgORZ!^s7KMKRdYSp!?+G%V&x$83j|nMp&>KBZ z-UbCpM~x9<3jFA`Mu`o*VZOw7f=4x^XYu?wEjv5Tozw>t=}!061%tikTOMzZe{>WYD`sENB-lNEeiY}A~Rq2M;!P4j@DMxMlZf?<~$qKx>&s$cJis3 zjJ71UAx49v~+dh=Wux}(%wGZ5kY#Z z{OfSYhYwU}cPgdf7zRE`FQqiaS~lrv=$K7ar?r7rsW1&d&r`8TR_TpP`_)zVT0S(a zF67J0cr`seY_C7n4zF46#;s3Q*?wt|78$Co$SKZ&TMdV-#_}3dh|S?zSiD-_(RNJ=4%SGeiCR_h^5=2_pfQ@(slvh1JCl^b}q;49)!0)_RvE zVyb8f5#Nu&4j+(lu=9@>#6tLq(D33d% z|K1Vta&3vG`jS;R=^dx~Y?eYwdZzt*z?kEb40&Xf%K<1Aq+03Emi_bMB7<>sh6)Jia8p6AKad)!XHhcZuCK3L^;YtX`?Yc;@e@apjB!y&ryFNBE zf>cHg)!NSP*x6rU^t`)65xum(;J!U^#I?Qii44kGnf6hD{9LifJ ztCl!jZQNd2gBlGkz=7SB+Z$8z+DAVTZ=tWPpJWpJDCqe2^8QV9zx|Q^}!A$ zm~xb|TXBvbm%}LJv>uIq;8^v{u>wyvn%-pX_ff42%Z-_OeUsInO=ORIZa;mxi98u{ zhNJ`vH8V4`&X~EkS&};kTVNLVTVBH#lB_Ehd3UH$-*CB= z^G=jc(PpYR?b~EsPE4#@{0=6j+44W6rBNyQ9q#!1``u$>qp-7c4UN1aYV>r`0&zZ+ zQ;}oXr&AU!WoGsO3J(8@iqcPQ1vry}nqxTWuo{Aa)%ZQebKQGi3mMDF4isr;QbRXt+Gb z5O;9sHK+Ia12DyI`};piJRGhG40N`cr39(DH{W=sv_J7OfXgYzJpN-E8ynl5u~H*V zXR=6wt$}Rx;^JZ=Dl|k=!WL!5Ka%^h*Vv$iq@*vzH8tzlKOt2zC`@UkpCZm1W@z?% z*DwVCJ`nM^TJDa=Cn3pO=Okm`wH&11o@+K9Fh!V{_qZsqKJY&5eujKN4wfPkAKo)= zd>CkkIa zIGba3aIEO8FgFJCRU?aw3;VuUQo@|Nj*h74wL9tMnIA5TPNbS1WXcVVPSNwG?4 zCEzOlaA9R&kY>gW_x-<#R~w_Vd*I+w;^Ys?N=Uq&c46K+)xHTw@%?O$<_VlX>W!DY z=N%--3f+E|I+F6@k<;rrT48ULPoKQUpL~;H`rpV|Z3+=j9(Q4C_`_~ge-jaB0a*vq zSl_amsehcrVf@TEi}#_;`KP34%DS-3Og%7)63`mcG(nAv{qx3z$+Ew(f#G!fg3QkD z(C_^2%6*cE*!XzOr4zfkrYH~`9|c`7?dY44 zY@fbFDLNR-*VotO)zva!@eb738yiCLgqUAiy1~K0A+Il*feRyh`kM!YE#PjFlVgIu zTHn|(Z415=SBdJ6fFhogmp3>z79X7Ddw3ZAMYGEXGujn@C=3+!IUl9_MVr?}x%EmnF z|K{QK1Ip66x{IL#O*hcCV_pr)VId*t9`5cxj70yBvlf-Zbj1Icpe66nxZ~S5VbBDH z&ibq*ntx7rm^nG$g@)>sJe78Jb#*$qCnlCLJThVlzHdTms{Fls_inyP7xQD^XoCkI ziu?@M?eQlFcwpl}J|nk9sJXgUYkjM{{Ga0&+Zu>pDybBwmX0o*8s{GW^&aL+N?^gK z_Dw7`QcUzzVI_&LIkVfGJYiWpINYrI3v0uAF9&X1?h3)?*q*GQ>o$pEXO-3vM_N_Y z_KGa@XMLa;^P>FKHV z=@TO(DyXAcrt4mRUps=qtCe+~#Acvyl6B>z435r^89V)|ndsb|$2!{|*d@V9#>4Eu z3&Wt`OK%Ch-MlbdAhdrZ6r9K+n`zv9w)sujUpx@j-}NasD&Ol1o)|+OqiM(kHY0`OD48DemON{dt-6 zq0{Tv_@tz|OXpH__>j5c5TB95b$k&Zw>wv43v-0#$8qZ{1ifUF(QI z^*;JV<9?J^+vAk4Iu}&5y!Fe= zJ_oRRy#Jnz#f=#m8qyMB9?ZDSnO+`mIE@L}P4gEU))B3l(M`|HR9N(qbZ_Op z6Vq7cj2V=lCm4N9If?nxom2!udmBdYvw6EfinkTS-9N>VW7I9AvWZ2;3_PB zux~;^+6}{Y0o?_qlO=XSyq=g;!s-$dS)sFD_P0{s``$a@AHi_%3g4sc)U(+tcLRLY;0}C*VORA zF5lloMG+7ZijR(te%^R!UTl%P_UnVJWH5FCUJZBy(Nsc%hbz5BJCfq!h>eYnSn!{1 zXX+ClsHQ7{$2fBOWVEu_oyDuP($yl0dCXa8^o32j+(l=?gm=%1Vbc}fQrAD7jje|d z4adh*XqjH|78gIy*ykV!h5QT^q}G67WvQr4 zrn39(W^8^wBVu@CI1OTA30QF@Bqg_sRb;p}myQnD!J8F;G2jmqcy3vQl-YDcSKD|+ zBIE8z(Z80u*9^DsGTlYhZ{Q^teny?d7SWRVo#2y@I}UET%tyB$lK0@Y0dCZ)=cG_9UQvQ4)g|i3L@n=2OSxPZtRORC@01`Y42La$ zVz=?I*(8^My!dv@U)+-~xp!s04OhtIXtjXzQM^w?{_--bQU>+$o=1G*Sl@y}`3q&D zVC;&JV6>@Ymx5Zo(4RjIbMn_{MgFcd|4X{IMR@(Okq-I6>13L^U_3G5P5(d?MJ)~t z3GJ2@)TXAka+B{Z3Tq0!VEo5Fu$5GgMbO38_VBiwp~fVKqzUyQV-=T~pa)T*``Z&m z+_!ZF4_;U_zST24oZZ;8`aYC+pJ_WC7@I;Ae|YR{DTl1*lR zQC{^pUVz#tBVF`YK&(1TZmpI9EgnR#!m09S2TPRSJWpgabaZtU#m7{gizlpE+cfoe=zT1uFvW|epnrYMJp(UMHXzE|psMJ&!P z=qQL#Om)MLce3^cZoVbO!+cFk)O1sQW)Gj^=~oOC6qJ!9MHuIuQH*$0K3HPc{3wrJ z92XqvJ@+`-jQSb)Aw4}HGBR015<6FZ?8j$fC8ekGr>;V7yuo>So@pIC9*55X-Wk#N zQ5t&mKdS$C75P7x4q)bF7|Z1&_3$wJYGr}Jenwc=1M9JqQ~Rr-U~qMuQHFP;u^v0l zx1cuDdpb)np10tqoJ8GrjKnAZ>OWvH0&Vh&cy}zqO>WTuBlGv04XY%WV zIUcp|EyGgGPz(rj5tKQ(-F`(`i)Q!Szv*&^kPQx2#%35ZF&m8F1q219OW4t~L?k8> z{}*Z0_9F=FaHqlU+UH6J^bduOrHD@xtRJ(Z$e8rw9 zEtyV5sGK*Py7f-UTwlCkf1olQ3|G_rkY3m6G$b#tetDS7+L{oXdivJR+8RgRj%tx>%^(`LE>un^<*Z)^iuW7MElFYP{0_(+e`0XP}ws zZr!ropZDh~HEza6j67JX1Rv=8z(8e_ggIGW^l)!?x@x-c_cthqb6MG_;`A<^{oi-dU{j*}fgR=}cVXl@ zsjjZ>l(+|s5)PFhy*^l8Vu`Fb#EWzejekO>9{_m580)-XPU$tt>Z(U*s2(=d4&Xl2 zdOV`yvloSXWGScYgHn-_Sz3yk^^TS#+3@t&ic@U*?-#u0DV>=E3>Fo7k-$#W^;*Ar zB`%r0{6^c$vfTP^tZa^si;EEUAme>y zZrGe2yw-Pgk0`ulsZqnB9lPzvQd$THkVvhqtw?trn?{r}!}pRoE-ns%XuiH=;k6m3 zWj4^$!*FwRqi1Bifk4A1dy|qv_Vc3vVYWYj36OkE|h-5;ptew$R5n!#u+-|ne z8ib&A;S#?v4SJ9LC?P2d0s`Pv9RHl!8a8>~g{2~>p+TrKh9(9mrtabz-h*DNveH-9 z)|qa5(R#HGw65DJQGtQ>j$5N{pd;A7HU1gX7s75E&Tv!d0oPXoB8YE|jTLTt&y+Gm zsi1m5SL42SKIiw3O@Q{~Y|gK3c$f$Xl(=HQgGFhZiOO3?tG^^oOfr{$SEJ)n-;C*k zztF;C#R#6XISBr^sW@2~8HLSPNTtVa^mL@?ey8CR5P%m= zLd(R2;o;%IJyv9SwKBB@)nwFSF|%Y_5}3NnT71C#%?UBC+?S0uxxTt^aC8K}P}K8u zoB1LPOnzLL?dcyRDW#D?{d!L_SZ)T*@@EPcpf}(9vm{Z(xp^F~&Kb)iEJ2;WCVeDnSLbk(yes`+ap z3ER_QCY4~*_tkFHn!X2%LBr`B2

F6!C792c)E=P(M&p2|Bk#QSgDqNl;LUhQ^?2 z4slt?;r7I%NE)$cn*z4BJ8pMsG=O=FBVy$OLGqaVcz4ffY-@4xZDuCza|?@mAo4*9x6$}r-ScQXR>I7D{%QfT zp+xqvKylhPYD|HJg%1H)V_0gjpZ!+w;@A6*K2GfWy>REa%satLlOG4bBu^zR9QH{C zMeKDM3OniF%agVbeD?ii#$t6_Cx?e`0YF^+ofaV-L6QYgMGBuiwUUxjf0eavL6$#A zNSo=}iouol$h!+82O^HAaIbGbl1aw%3J;`*PPXU6h~_LJQY?I$e`Mdkla{|4@RgFC zvnsE?8(h$c89yy6C1tYM9>xzzO4{Q}D5QnGPO*)BPPEfTCMbRW?9_1b@Bn%iIDBNr zb&r7o>-O!ta&qpG)?*DrgQk`mV5j@{mszXW#s{82>9iWAsyiS_82YD{lo?Ga*#HYE@9RPF(w zQ?JqUu}l>CEm_&FOPfM{CZ>LAt3u|FA4lJ`Er=^CugryQD~5L5tf*b2mqzu+ARz&w zLCIXLOui0iEqw{Xu=w+3AiAyHy{ZX7;7klX*xiz*{V=6RMf@Du*LzG|jarV4n zSdsbB(Lv6r%KkkF3wQtTnXKcQ%1F1qZp|&767n#xQFHQ}+h-b79j?x8mzVb$EFz-} zyt2w16ZX@b(>Yt>O!mb#vgDMDI$@<*TjjmK4VUtg);bUBgu{P~BU zSKef;*BQH^kr9heBac7^Kw7@OeslsCcVWh7WwUl$4Js`qp``o@wvGD2<1DpEMpY+Z z=(y=M1bN~Tj)@pmre$1D{Uq-P2eX-47K9|R-NM5x8+k|)Y#A;rEIhxkaPP!0DCcS+ zgvJaWn8)@13^d=pw+h_0(bRjonr&+!%KxztH+^Nrl2&8}VZqU;u1osFzyLu-h4QsZ zk(%u(hPrO^Huys<-~3k``6+7~+&cQRPWgSWc)`z&m~9l&sZ+6qVx7UOqY}w_z^!}! z{9D4dWd^?^w(zXQ@vf00Q;_NV5538XyH)zvLPiVWO{-QN;Wy6zo+-{d34l$HJyrcn zyenEpyY!3o*e&mq5z~a3K#1K63k@-X=s5^fD^x)5 zUwhq@P+GiDdar&M^GLT29mf!WDQf?aE)sA-#$MZ#1zQ&DX8|$MxWK5yf>Mjc$o^zgos9P<3QSPiqZ~xxv_whRw>{jCKR2}84Yt%kZe3sh5IDTt z-(3uJ({=G--vj>Q6FBLwdK$8$H~;0mgM&k&rdcG&Ra98mGIAmU3C6JHHmDgYR_5e| zUAve=$!$13`&o=~?+X;A_h0Ym>l5!`mSkmxH+qQ$7g%mRJcFs=e3gP%lcJ3?5o#`M zKE4Kp-wCvM`0PfW7%$go@b7wLON8;-e#OVHK(HBDiA(32F+l1I6+C)|vDTSC-+g9g zW(Ail%#gMxuy(Rsy~II)+js;13P2Jnoi)F=C=E~y(oj7>5Eu44O=t;p{}c7t}$hf!0PQLHx*MdV1HJ}VBT;^!czPaCHCWOT(%W&d9K5zxg)Y@$m zd3}Yg(WmRPGlheE@}M$*eK7Mr)n{rtH!}_zgZqjUd@vi+es11N&6hhN=vrkc8!zVwModV32)i5GZ$?7Tf) z2QZsDkV1(G-9LVaXNdZk*x5ycRk8^DcKO$@fe{f{z_2iC&*ds6w=5mJOHB=f^$^TM znwbW-s%4jH$OjNpojW^so|l6BzyH^M3a9khk(@rU<(#O6L5m+)?RKPs{??rm!oG| zS`c6hyOa}eLc+F!O=ZPV=UppIOw10GDhV6;+jn?-3R`5twOCF6e7Bp$@)0oq{Y>A% zo^S3BthW8&Z#_nxrJ6xgZfC@Ec(l?GS1y1bCbfTd76R7i(`uWrCZ9ixJ&7y`1Pu+1 zyN8E-&*6nPko*g)zdj%oe9=OJgIh;ONuXdJFE6cQ zQeuOnPDW1N+Si8*$o_vubx{$EOMGb0Vp-wb${!u0W-9_!Fk#98K`qFcgAzj6_e!tQ z8<-~G)3nB2DfsN#7ds-njJk8X~%X+YuYp9jfhmjuu}8C@D8*LOz;s;ptfM?sT_N%BaCty1LqU(7w4t zO+7ZVv_8ujCi5R{ZIZi(pnL(WmjaOf_;^DT++{LgzVH#@QBe#&K0X8(3e~!Dau~o< z#pQZN1s^>sKz+T&Us#0s>M}Utx5Ri}?!Y=I3j|2yoe(P17mXd(z$At#!>3 zo185Bu2+L|U*@hF)9zCB#}FBf^nNqJGgl zV}S?E&CQkH1T2M)Jz23YT_j#uS51xfglWodQZRE-P5vZMXx^E$gJ>-u?PX zqTZK2rx`;%rw*WS-4=dWyYq>aRn-dQ8Tyt=xgUqSQ(1{NCn8JxY%UORJhNnvVL zjZ=s;m%$%D!g`iA=qYxwO!yRdfBeKN^o7;c2PdA6j$8$wKlg)1px*+&Q6pa^jeccu zX(@M+t=Z7%O8caNS6+YCJv1~>;vPWy18#FZvfz~GeEK8-HM^A5@p3mIs@lDaB%g%2 z^p%kZ%#06`wy_(1{v?4y4DDNsm!tm#zPUn8Z-cj;!c@Gj#T+`X_q{e)CGjw%VEt9o zTr!)fKj3#Xh_?d>8peb~$VfI&Yxm z=?3C>dx8)uex#QTM2})O)x0tk^`E4%KmsdP$x69j9OfDxK&y+Qt&qp~c!D7=sP<^k zl`S(fRC~?;M4@HIXvMSY?{q@-S*e~z63m_iXlQJvrdc6NUCAb+#Z9kfo?=ba^tC6l z6r5kIX`T$0hJ~^7+U&PaeCai{wSDVxblNiXnu37v(PplQ#Y+nd?S> z`iQ(n+vqCs#DFBLd^yPs{Ez}iN^yCoG;Rw_h%MPXqT3dr+|G)tuQOyvyF(uM@9&-; z@hC2CnQspYU2C=N6sK8xD0zp@do7^R7B)6+!(56~)mx(_+NHWveagz$gvFJA1q*V+ z7Mui-L*aLtK{UJ3Px?L~0sX}(`!18AJWc-BtIvoZfBT@47Kum3PZ)yh7u?!vhD}j@ z`)F+sasr*ks)ES>pNyc3=)Y!5S>r~}AOPvK>J1f;fl^mY*Ef%&eW+nuf5>@q1MB=) z=_5bBsHi9mCH&p#x`48#%fi-KAES2T#KER2yBTuC{-3?(`>=|`idgDMiO2+l=kB8y z|IukMWol?@!jNWQHL53yXH-o}0Kr3bx;qmAD<&1TXOaLv+4?YJSqLmdFaZosJHL?LB z2*#`24YXp$*GJOF-Hcuv3vFvBvvxk8H&QBLUV(Nx=<^}8w6@mVn{8xfXIHVpb^wnu3=#EZ6l@G#fByVh-p`@&A2>_Rto}QlVx5G~35zorYYLLFj6y0Te93q2H zg_KhzR{BgtgYO?(|M>phAJE9|o}O^X*x5G>3ZMgu9Q1LO)kwIFjm`Q|pBN(qk2Ccy z@r5*mdO>FLz^dV2l9pjsX-cf%51l~OG*mv@9!5ZiZ>-k{ZRh}2h^I`+HZmRgJ-4_l{ZGp)X)`hSjQn7%mu^X zKdm>qV<-Cuw@aKz8uAK1f5w1k4cRyZHW4%qwGH1*O0X`lo#KVZzMJ3sTqgI?j}dhC z+k-=v}8f_J;KV6WxZ zFC0-(yYtN=x$&tFZD4DDpJZ45y}N4!WaYv5*A1e}lRx-`jJ}~A5h1PZQZ?Vr)B~Y^ zsnqv)$1JgyCyDBa4 zF~dSkQ{39(4uuw-1Te5ahUt{>Ac+mIgIMUJ2baCCuM~<6_^7$K&ieEF1OdXV9qf)L z3sx6pWghbfs{@dz2|2}HyYd@;iRzk~-=S{@Iq|a^i&Dx)PfN`;Z6VjuAHP?1jZxY- zF+1X%s5Zt2F#i3SQ<9SIfZ60rI1W17)6d_h8pPO*uQ4M??mW>OCqCZ35YZ_Ujm%d) zBBG)Ov0{RLxvAFdyJre23Z642=gsHGdsLOgU`$bAk>a#>(VR(2wLiYPI%2-M{xgSc zlFIPg4UVRYDlE&v0pe0C#Vf`1eRgCdHVj}b@2t+`EY6X`lRNpp(~^f8y;O;*6mEe{ z9v)h&z|JoAuI_^FJ=gtEyBP)hch#h9Pqh}p*-lMjR zpu__qRRzlkWUwBTqLeW(U$^uY(d4P@jL^RJ;>6Z`%dp~k3SoSTkQ?7_nZ2!07C$%uKv1lLlaX> zN{ZJjFn^G|B@CymqM}@AOUsitk*`A`CLw8SGiQ0$3G!^ z-RWM;jpW|%KnEjRq?~tcir4$e^3*}+`mZeSb2%+@yc&|hLdW$TT<^1ihDQnabM2eA zI*`p_$edv)?kvgT~rm{aIOxj~%RDRwIiCYp^QH_+vG z{rn2`|z)SPBtdSh#rwI1469`}JR42cU_CJ>sy?(Xo_L_E7-Toc)aJ z&aGsGBw!)xH$~n{3CXqZ6LnwU$aKxP{(3!~XOohd75DYM2ho4vZ9>tOQ2d$9+>u&b zZ|8^i-z;H<40^X z8D|SgVPVuiY~tWpbiiP9zLjzfR7m!zCsyK<99O15k?Au7@Hzz0GAI~Zr zfgoK*z88R#$0p3Qt$r~(ralW=Vw4w&B!UaTr&Cy6=^X=-kI$iw5;_3ozhtDciHM-* ztITx3FRJwwxl>>N9w}61qMZYaitY$?L|ZxmYbt@fb?XBkOieP8jfMTAqiW7_3P@fO z&@g0>7#4OH1{MV}IR)kz*-4q*R!ul`j)avpG>uJuru+i`qz&TrpkTCyE?fN=nzi}y z3Il$hOZHM@RT#5RGDOojpNCRG10}Kn5}77fwZ>HvG=MkxKxsUjTBNxA^%~`=W+Q=z zhrPo>>y3}1KBREuPXNZ8tQzW?|L#gAP)Q+ro+%;}A7IG?hwbFHD+~se&hhRHKJbzH zW~E@lx32Uu!yRKcGuuTrD#GA0n-@2LM>Eq{Z0m)XN*@z|N)-MSe1n`GhpzB*ldaLa z+sEbPatfZ|Ks+x@*U?Yc#-h<>8t`Gk$4DOvAQbbLuQ?Thz@Y^TUrQ;KAQWI`Q)sx` zUUO$dI(+c^95%JOIb|UvM8-j?87dC1zqGwU;pOCeX+98XR*^FudUZ19^YeWbVS2hq zxo;yn|Hsu2DabZvDETFrh(_yih>49}z0$k>^9ns{pSbdi8@s+sPz6wo#FA`&@Spk%%m?jJ$Rq$8887A>7@0O6oq}4W?Rn6$nFA+M%2jho;G2 zRqPH_9Xif(-~!{rMJoW1y4*UM6fm7A2p+ZZ+=AK8thAIN>|(iF=zKB4$0jD# z^gWQL6m`I;x222FES(=rAz2=HN|5b-KZRhPyN$##n|zMoPK%{*TL?j&Rpe9h7uU@juqn3@rj9UBVCXK70|dX7^S*_HZ`k-hc8FI04;>-|(%ND+ zxX!N;7V8)p9tQD;V>I(`SEB8IZv;g^XOdzMwTLGX4i3&MXjm3>UVj5|m(E0bxI%ZJ zu0)m^!QB6#Bk4FepuzLkTj<9E*gXR5!%v?-%W3dFe2BT%ct#D<7|_mu8v7y|h4>K_ z;I%$}{Fs@Wdkg3{c*95c^ouGFdw4U2*5>1tN0{-6iK;iy?Pz7Y?AK=-8Idc;h_kA| z|1m!KpI22RZc{0zaQXwI#>~XD{%>c-OHK2v8eXX4E+sC7FGVCxcHivep|)VnSK9O} zjp5T*KJ&C@ShFNnEJ`9y-rBk82inCop0dMliOMp~ibxD%JX!UIJ=^ruH7hjVV!TC* zKn)(>m(x4L4e`N1VZc)gJW1_VI-PCqn)K>Dtnr(exQ9R*LUeS#YLmr&z zn{NPwk}uF21m^2DLd1Rljn+frlZ~Me=*g1A40?OIGbIbdE=Qx__)_y>BD|qR3XI(c zpl#_c&px|?Go270FZnPr97sL5B2fR;OT*znkS_}YPhtWxm4~dX^aWZ91Yv=|xH+5I zZ`FR?mCaIn2VmIe&rA_NeCQb8NnL&^BcuIeWI^_*W26Mc@+9osaxU|PhqNFf}J2)X{0|59miV<5LYw3VH~>6mY9%$ z418PDZffSM>`T1FfPwzE3Ir%=o8c*nA*N<0rcJ3f*{r-u5eaa>iP04Hn{uUDl2WgUQ z6nU;@*-G_G%UxMklI-$wJRp8kcq|D92M5!imVH^vs}pH-rU8idKv|`I)Iye5MH!`OMCzpLUv(cPp0ep_!+RLO#!Q3 zTr@MCDlw>;2lI~=?(2dNI8N_4?`+7H=-lVwAp&OfM_-?;hQ^@gmdok%SCz%pxA9IK zKxF$Xe^@p9dzq^DWt9mU3ubL=^iqp}^8g>`J_`$^v&2w>@PNE#w86!|cq5bjJ@^g< z9zOoSf-Ag&BucwTC+q81BJNadxGv*W*2(2Yxf-|kXhb{%6A}_!lcyHv=if|DK238K zRG=rg2e6=Q40Vu3fs~}=4d~T21tQkLpe3H37v2%l-r2bb4<7^#Xrh0QHPed1;nguj z@B$71DIs)r$+s&jDl3zPEg{7mwt75TW{ivYTvGD*bK1)^iZ3H2@%MjjQ;L3+Z42SZ zjuBJIzr2*u3>mTv{>^O7Lyk0*!=xmDI$;nK6N^*G6|{vH%)BcpVPj5INUMM4vZdE+ z0W$$N!}~q@!6hnymjqq?{o6e|`|R_Wr|8#`i-FOa&z4nBog5sH@3L`Y zN+0co1&RlH$>x=gjLuCjwfj0au`g6wl*(KK;7dTH&JTE-`}_Xb@9%kk^Ul2Q^W4vU-PggyB+1Y(_DPI(=G8^x;*xHis9E9Ca%;>OhhHd2 zO*~0gvR-j+LG{?%nzkd5P35lQB-P?%_(7>}oEM-??Tb{bHQ zNy(bIDi|#Ai-`^DQ*2dG1(L9sAnbgz{AFZ2#ekmkwsi2v$S6U^myyR!-Q7|({>wto zu4$eQFOx+f6Z%IboT=vGAoGmBwW$ftvCeYA5}VhhgDHka^DRyBow;T)CdI|h>3LC2 zFBGVjnB1f8+=QaUCFv6*G$f=6PBaG@>r0L1JU#8nEpFKSt2T*9&^;rhxw*f9T9Tgq zvw3B!B#B#AjYMedDhoci@_mJ2zM|GV5FD3$Td#S_&o5PqN7YYd9bXhL%_(MehrSH8yMbrG}@;x?v2_B!}H2k790~iQt-_ zqC75l9C`cFr#(H_KyLY4U#`(s)1k5|0t zy0zIK4gv1U?6{1}rsfdMysC>Nfm?Y{Ddf~PL6tSxqoAd=MnX$WQR{@d+1F7=50BZ2 z5j!%=)j+LAP(g8GAY#?Z!eicruXZ=Xju?1(eWMy_Fr%cM+F0`L)x%9!lvh&BR{|TK z6|mO{NC$nmEIGc{K#de{8a1o>eg2*U#zSj5J6(k3%+neI8M)~vo&5{KXReF!@{Tk; zeMP_7Fy)qnxT;^TpJhU- zfSTE&2LII5npIzfBC*L}zp829k zcb>sc*CYK}u3}-|78y7Y&KJMd5Sm%TTodYa$3c1t{_Kg6l}92Qx5r)zZdm4aq5T41 zQkd?k_XL-umfXI#rK|@%Eh(XpqHC&e$wH3A21TW1-+)%=SMJ~)j)xzktifPjV}8Pr zM_b#SzW=j$xx>e86pvJ@G9L8(^!91;Tc+Ghb==U|h6agVdSuFUkUxDr=d*{QWn!Eg z*VP@Wo9pGGdl||=0_h+lPWJyfLytstp~d3Im|w4*RS?&T{vjm9<*R}X{Uv^rgMCQ= zgWVj7-kfx!DmJyF!yQxOICeT|{0`niO~e4c@VRL%5Ousr<}7 z{t~3v?ceX7o*hm^*hPF!&Xzx(er{nT#=ajJdG>;>>o3N+%1&j=uBdM-?Dw5p;6h@I zwwCBdRB2mSe2*`D$MQbPxumlEkKNHw0DYUe-R>|PB$99`mN!YkAo;`b3>t3@R zm8y^4;^@}%<{BgY{ZiYu4GSl0Tz9=Teg27Lx1XP1B9qDd=Q^x47Rv$YOnF9P%znz~ z6Cy`&$+V>{9rR>Ml9ci@rO2#QEcR4g62p$F%Ve#?0xrR!MeV6?Q_tc<5K|KPLS%hl zF1DHO(;y3<0pWqF_pbhEx9F#63L*ItFfcL#b-o^LHv>cvrR{>HVnGhfM$pkEw6)n6 zv0&erYr7K-2EWpCzB?Z;l%4?v85@~qdkWB^D}oWgxz+-@?IuzrI3hGNGg*Sp!A1hz z<5saTL*G7{gJsUY^gisu#zGA#FU>zc zt2M=aIS1T0diK_#p`qNOKXo=CcTPe^#t{i_DDEl+q0^5RwKNaZ+IpWTd4pXJ#fqNx(M_e?%%;t8MKmmK=A%AA-bA;lgLjMV|n`1 z?qCz)RtbSd6bc-n)5ttPFOmdVCX_vzld{IUo(Fg?n?_jMO{P*rC3T#K;XJ@u+yR~j zQ0mO7Pos7l(37sZJ~-%w%!pzp(^^r{e)nz~F5oLMC2WOk@7JoTau9Q?cOc+ulVUOY zvn~|s_t3j+%4j_bZC`EZSlc$6a1c+K`T2uWp8x}ai_nvhIY_`9YgEYHmRt@>VbP_oWY*W!ZPwIuJTe4gftL`lbwenH z@^{K#o>`1hP~UAUS|Q}VMB?6EyW*WJKF-gpBw8qBLb0jwbz$Muw@}ZL&daXqWk}%Z zK+pH2tLq9(Ul(pnmgW~0R*Sli`+;_Rk0q7D|6z})$JhN<3QTF5m&i7#4)y01?D}xTRsHm^yk-h3l_A%DMfpceL(Gb? zztOX~y1A8iKL>$ZRWrE6gGF1Ca~fKi;FHd76|PXuDs&y)%6Nc%bKqgPCcq7G?||KX zzeC4^@87?McJA&^4Y36vtY-TIgX4@u3f+EF2HnawKc9_8$0#!s)-&4-6~`{mmD{@sBGKK588mV`!kdRRQz-@RC6TU#Z+zd@@2rA#g z;v)H#&JgYKevjJachKhu-1icU(z~#eLeU3SZTd(gifeeBMe*3@f#jB%KduIce<=Df zD7}4*v53VXAYU@Bx884bI-+E_r-tiOus7>IKQsOvO+U$8IB<7Nj44o`ym(5H+i$lZS0U^O3aZ>W zX)>Olm${cY@Yha{De64B8J5OPBD`~x138dj*s5oJ@N#4R4=mKj_Fq-mqn?Gyf*tH% zqobpia?vxZOkJ5@+k^*iy7B$w5YtJo(1ZuXoGn*jN+% zhk)3aH(tbK!ia~5$I`~;s*!*{mkG9+#owJhTKRj(U;4YNUrSnzrk$B9#V%z@lKm4h z^vJ1HqElO{uD>;UC(Z}jmvn0U5g1wf&O)cR0Opc}cg_(NGD`npc-+HSXQ!1_Vny@8 z3F?9GuXei6*#33QW25~0JGT% + + + + + +Dynet: Member List + + + + + + + + + + +

+
+ + + + + + +
+
Dynet +
+
A dynamic neural network library written in C++
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
dynet::expr::Expression Member List
+
+
+ +

This is the complete list of members for dynet::expr::Expression, including all inherited members.

+ + + + + + +
Expression() (defined in dynet::expr::Expression)dynet::expr::Expressioninline
Expression(ComputationGraph *pg, VariableIndex i) (defined in dynet::expr::Expression)dynet::expr::Expressioninline
i (defined in dynet::expr::Expression)dynet::expr::Expression
pg (defined in dynet::expr::Expression)dynet::expr::Expression
value() const (defined in dynet::expr::Expression)dynet::expr::Expressioninline
+ + + + diff --git a/doc/doxygen/html/structdynet_1_1expr_1_1Expression.html b/doc/doxygen/html/structdynet_1_1expr_1_1Expression.html new file mode 100644 index 000000000..f6a62704c --- /dev/null +++ b/doc/doxygen/html/structdynet_1_1expr_1_1Expression.html @@ -0,0 +1,127 @@ + + + + + + +Dynet: dynet::expr::Expression Struct Reference + + + + + + + + + + +
+
+ + + + + + +
+
Dynet +
+
A dynamic neural network library written in C++
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
dynet::expr::Expression Struct Reference
+
+
+ + + + + + +

+Public Member Functions

Expression (ComputationGraph *pg, VariableIndex i)
 
+const Tensor & value () const
 
+ + + + + +

+Public Attributes

+ComputationGraph * pg
 
+VariableIndex i
 
+
The documentation for this struct was generated from the following file:
    +
  • /home/paul/dev/dynet/dynet/expr.h
  • +
+
+ + + + diff --git a/doc/doxygen/html/sync_off.png b/doc/doxygen/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/doc/doxygen/html/sync_on.png b/doc/doxygen/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/doc/doxygen/html/tab_a.png b/doc/doxygen/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/doc/doxygen/html/tab_b.png b/doc/doxygen/html/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..e2b4a8638cb3496a016eaed9e16ffc12846dea18 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/doc/doxygen/html/tabs.css b/doc/doxygen/html/tabs.css new file mode 100644 index 000000000..9cf578f23 --- /dev/null +++ b/doc/doxygen/html/tabs.css @@ -0,0 +1,60 @@ +.tabs, .tabs2, .tabs3 { + background-image: url('tab_b.png'); + width: 100%; + z-index: 101; + font-size: 13px; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +} + +.tabs2 { + font-size: 10px; +} +.tabs3 { + font-size: 9px; +} + +.tablist { + margin: 0; + padding: 0; + display: table; +} + +.tablist li { + float: left; + display: table-cell; + background-image: url('tab_b.png'); + line-height: 36px; + list-style: none; +} + +.tablist a { + display: block; + padding: 0 20px; + font-weight: bold; + background-image:url('tab_s.png'); + background-repeat:no-repeat; + background-position:right; + color: #283A5D; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; + outline: none; +} + +.tabs3 .tablist a { + padding: 0 10px; +} + +.tablist a:hover { + background-image: url('tab_h.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); + text-decoration: none; +} + +.tablist li.current a { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} diff --git a/doc/doxygen/html/training_8h_source.html b/doc/doxygen/html/training_8h_source.html new file mode 100644 index 000000000..535beb8c0 --- /dev/null +++ b/doc/doxygen/html/training_8h_source.html @@ -0,0 +1,301 @@ + + + + + + +Dynet: /home/paul/dev/dynet/dynet/training.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
Dynet +
+
A dynamic neural network library written in C++
+
+
+ + + + + + +
+
+ + +
+ +
+ + +
+
+
+
training.h
+
+
+
1 #ifndef DYNET_TRAINING_H_
+
2 #define DYNET_TRAINING_H_
+
3 
+
4 #include <vector>
+
5 
+
6 #include <boost/serialization/export.hpp>
+
7 
+
8 #include "dynet/model.h"
+
9 #include "dynet/shadow-params.h"
+
10 
+
11 #define DYNET_TRAINER_DEFINE_DEV_IMPL() \
+
12  void update_params(real scale, real gscale, size_t idx) override; \
+
13  void update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) override; \
+
14  template <class MyDevice> \
+
15  void update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector<Tensor*> & values); \
+
16  void update_rule(real scale, real gscale, const std::vector<Tensor*> & values) override;
+
17 
+
18 namespace dynet {
+
19 
+
20 struct Trainer {
+
21  explicit Trainer(Model* m, real e0) :
+
22  eta0(e0), eta(e0), eta_decay(), epoch(), clipping_enabled(true), clip_threshold(5), clips(), updates(), aux_allocated(false), model(m) {}
+
23  virtual ~Trainer();
+
24 
+
25  void update(real scale = 1.0);
+
26 
+
27  void update_epoch(real r = 1) {
+
28  epoch += r;
+
29  eta = eta0 / (1 + epoch * eta_decay);
+
30  }
+
31 
+
32  // if clipping is enabled and the gradient is too big, return the amount to
+
33  // scale the gradient by (otherwise 1)
+
34  float clip_gradients();
+
35 
+
36  // TODO: This is unprotected temporarily until there is a better solution
+
37  // for serializing the weight decay when saving models
+
38  // Rescale all the parameters handled by this model
+
39  void rescale_and_reset_weight_decay();
+
40 
+
41  // learning rates
+
42  real eta0;
+
43  real eta;
+
44  real eta_decay;
+
45  real epoch;
+
46 
+
47  // clipping
+
48  real clipping_enabled;
+
49  real clip_threshold;
+
50  real clips;
+
51  real updates;
+
52 
+
53  bool aux_allocated;
+
54 
+
55  void status() {
+
56  std::cerr << "[epoch=" << epoch << " eta=" << eta << " clips=" << clips << " updates=" << updates << "] ";
+
57  updates = clips = 0;
+
58  }
+
59 
+
60  Model* model; // parameters and gradients live here
+
61 
+
62  protected:
+
63  Trainer() {}
+
64  virtual void alloc_impl() { }
+
65  virtual void update_rule(real scale, real gscale, const std::vector<Tensor*> & values) = 0;
+
66  virtual void update_params(real scale, real gscale, size_t idx) = 0;
+
67  virtual void update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) = 0;
+
68 
+
69  private:
+
70  friend class boost::serialization::access;
+
71  template<class Archive>
+
72  void serialize(Archive& ar, const unsigned int);
+
73 };
+
74 
+
75 struct SimpleSGDTrainer : public Trainer {
+
76  explicit SimpleSGDTrainer(Model* m, real e0 = 0.1) : Trainer(m, e0) {}
+
77  protected:
+
78  DYNET_TRAINER_DEFINE_DEV_IMPL()
+
79  private:
+
80  SimpleSGDTrainer() {}
+
81  friend class boost::serialization::access;
+
82  template<class Archive>
+
83  void serialize(Archive& ar, const unsigned int);
+
84 };
+
85 
+
86 struct MomentumSGDTrainer : public Trainer {
+
87  explicit MomentumSGDTrainer(Model* m, real e0 = 0.01, real mom = 0.9) :
+
88  Trainer(m, e0), momentum(mom) {}
+
89 
+
90  protected:
+
91  DYNET_TRAINER_DEFINE_DEV_IMPL()
+
92  virtual void alloc_impl() override;
+
93 
+
94  real momentum;
+
95 
+
96  // the following represent the current velocity
+
97  std::vector<ShadowParameters> vp;
+
98  std::vector<ShadowLookupParameters> vlp;
+
99  //std::unordered_map<ParameterStorage*, Tensor> vp;
+
100  //std::unordered_map<LookupParameterStorage*, std::unordered_map<unsigned, Tensor>> vl;
+
101  private:
+
102  MomentumSGDTrainer() {}
+
103  friend class boost::serialization::access;
+
104  template<class Archive>
+
105  void serialize(Archive& ar, const unsigned int);
+
106 };
+
107 
+
108 struct AdagradTrainer : public Trainer {
+
109  explicit AdagradTrainer(Model* m, real e0 = 0.1, real eps = 1e-20) :
+
110  Trainer(m, e0), epsilon(eps) {}
+
111  protected:
+
112  DYNET_TRAINER_DEFINE_DEV_IMPL()
+
113  virtual void alloc_impl() override;
+
114 
+
115  real epsilon;
+
116  std::vector<ShadowParameters> vp;
+
117  std::vector<ShadowLookupParameters> vlp;
+
118  private:
+
119  AdagradTrainer() {}
+
120  friend class boost::serialization::access;
+
121  template<class Archive>
+
122  void serialize(Archive& ar, const unsigned int);
+
123 };
+
124 
+
125 struct AdadeltaTrainer : public Trainer {
+
126  explicit AdadeltaTrainer(Model* m, real eps = 1e-6, real rho = 0.95) :
+
127  Trainer(m, 1.0), epsilon(eps), rho(rho) {}
+
128  protected:
+
129  DYNET_TRAINER_DEFINE_DEV_IMPL()
+
130  virtual void alloc_impl() override;
+
131 
+
132  real epsilon;
+
133  real rho;
+
134  std::vector<ShadowParameters> hg; // History of gradients
+
135  std::vector<ShadowLookupParameters> hlg;
+
136  std::vector<ShadowParameters> hd; // History of deltas
+
137  std::vector<ShadowLookupParameters> hld;
+
138  private:
+
139  AdadeltaTrainer() {}
+
140  friend class boost::serialization::access;
+
141  template<class Archive>
+
142  void serialize(Archive& ar, const unsigned int);
+
143 };
+
144 
+
145 struct RmsPropTrainer : public Trainer {
+
146  explicit RmsPropTrainer(Model* m, real e0 = 0.1, real eps = 1e-20, real rho = 0.95) :
+
147  Trainer(m, e0), epsilon(eps), rho(rho) {}
+
148  protected:
+
149  DYNET_TRAINER_DEFINE_DEV_IMPL()
+
150  virtual void alloc_impl() override;
+
151 
+
152  real epsilon;
+
153  real rho;
+
154  std::vector<real> hg; // History of gradients
+
155  std::vector<std::vector<real> > hlg;
+
156  private:
+
157  RmsPropTrainer() {}
+
158  friend class boost::serialization::access;
+
159  template<class Archive>
+
160  void serialize(Archive& ar, const unsigned int);
+
161 };
+
162 
+
163 struct AdamTrainer : public Trainer {
+
164  explicit AdamTrainer(Model* m, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8) :
+
165  Trainer(m, alpha), beta_1(beta_1), beta_2(beta_2), epsilon(eps) {}
+
166 
+
167  protected:
+
168  DYNET_TRAINER_DEFINE_DEV_IMPL()
+
169  virtual void alloc_impl() override;
+
170 
+
171  float beta_1;
+
172  float beta_2;
+
173  float epsilon;
+
174  std::vector<ShadowParameters> m; // History of gradients
+
175  std::vector<ShadowLookupParameters> lm;
+
176  std::vector<ShadowParameters> v; // History of deltas
+
177  std::vector<ShadowLookupParameters> lv;
+
178  private:
+
179  AdamTrainer() {}
+
180  friend class boost::serialization::access;
+
181  template<class Archive>
+
182  void serialize(Archive& ar, const unsigned int);
+
183 };
+
184 
+
185 } // namespace dynet
+
186 
+
187 BOOST_CLASS_EXPORT_KEY(dynet::SimpleSGDTrainer)
+
188 BOOST_CLASS_EXPORT_KEY(dynet::MomentumSGDTrainer)
+
189 BOOST_CLASS_EXPORT_KEY(dynet::AdagradTrainer)
+
190 BOOST_CLASS_EXPORT_KEY(dynet::AdadeltaTrainer)
+
191 BOOST_CLASS_EXPORT_KEY(dynet::RmsPropTrainer)
+
192 BOOST_CLASS_EXPORT_KEY(dynet::AdamTrainer)
+
193 
+
194 #endif
+
Definition: expr.h:8
+
Definition: training.h:145
+
Definition: training.h:20
+
Definition: training.h:75
+
Definition: training.h:86
+
Definition: training.h:125
+
Definition: training.h:108
+
Definition: training.h:163
+
+ + + + diff --git a/doc/doxygen/latex/Makefile b/doc/doxygen/latex/Makefile new file mode 100644 index 000000000..8cc3866f4 --- /dev/null +++ b/doc/doxygen/latex/Makefile @@ -0,0 +1,21 @@ +all: refman.pdf + +pdf: refman.pdf + +refman.pdf: clean refman.tex + pdflatex refman + makeindex refman.idx + pdflatex refman + latex_count=8 ; \ + while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\ + do \ + echo "Rerunning latex...." ;\ + pdflatex refman ;\ + latex_count=`expr $$latex_count - 1` ;\ + done + makeindex refman.idx + pdflatex refman + + +clean: + rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf diff --git a/doc/doxygen/latex/annotated.tex b/doc/doxygen/latex/annotated.tex new file mode 100644 index 000000000..7ed909d21 --- /dev/null +++ b/doc/doxygen/latex/annotated.tex @@ -0,0 +1,11 @@ +\section{Class List} +Here are the classes, structs, unions and interfaces with brief descriptions\+:\begin{DoxyCompactList} +\item\contentsline{section}{\hyperlink{structdynet_1_1AdadeltaTrainer}{dynet\+::\+Adadelta\+Trainer} }{\pageref{structdynet_1_1AdadeltaTrainer}}{} +\item\contentsline{section}{\hyperlink{structdynet_1_1AdagradTrainer}{dynet\+::\+Adagrad\+Trainer} }{\pageref{structdynet_1_1AdagradTrainer}}{} +\item\contentsline{section}{\hyperlink{structdynet_1_1AdamTrainer}{dynet\+::\+Adam\+Trainer} }{\pageref{structdynet_1_1AdamTrainer}}{} +\item\contentsline{section}{\hyperlink{structdynet_1_1expr_1_1Expression}{dynet\+::expr\+::\+Expression} }{\pageref{structdynet_1_1expr_1_1Expression}}{} +\item\contentsline{section}{\hyperlink{structdynet_1_1MomentumSGDTrainer}{dynet\+::\+Momentum\+S\+G\+D\+Trainer} }{\pageref{structdynet_1_1MomentumSGDTrainer}}{} +\item\contentsline{section}{\hyperlink{structdynet_1_1RmsPropTrainer}{dynet\+::\+Rms\+Prop\+Trainer} }{\pageref{structdynet_1_1RmsPropTrainer}}{} +\item\contentsline{section}{\hyperlink{structdynet_1_1SimpleSGDTrainer}{dynet\+::\+Simple\+S\+G\+D\+Trainer} }{\pageref{structdynet_1_1SimpleSGDTrainer}}{} +\item\contentsline{section}{\hyperlink{structdynet_1_1Trainer}{dynet\+::\+Trainer} }{\pageref{structdynet_1_1Trainer}}{} +\end{DoxyCompactList} diff --git a/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f.tex b/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f.tex new file mode 100644 index 000000000..fbdf0cf6f --- /dev/null +++ b/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f.tex @@ -0,0 +1,16 @@ +\hypertarget{dir_2997b6d9ddf8b2f83e82c6988822a05f}{}\section{/home/paul/dev/dynet/dynet Directory Reference} +\label{dir_2997b6d9ddf8b2f83e82c6988822a05f}\index{/home/paul/dev/dynet/dynet Directory Reference@{/home/paul/dev/dynet/dynet Directory Reference}} +Directory dependency graph for dynet\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=134pt]{dir_2997b6d9ddf8b2f83e82c6988822a05f_dep} +\end{center} +\end{figure} +\subsection*{Files} +\begin{DoxyCompactItemize} +\item +file {\bfseries expr.\+h} +\item +file {\bfseries training.\+h} +\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 b/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 new file mode 100644 index 000000000..97ea7dc67 --- /dev/null +++ b/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 @@ -0,0 +1 @@ +2ff0d418dc0fde0b1f848ddc09d9ddb0 \ No newline at end of file diff --git a/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.pdf b/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5c4d92c8c36462d2cea321b1b367b1ed811c2647 GIT binary patch literal 10418 zcmc(lWmp_p)AzBU!Gqi21f9WMgG-Pg!QCx`yG!suaCdhI?gV#t*I*%7@CTCJy?5_@ zuJ?Mrz1=h2eg0E*>QtTTPxGUceyxC22mk<>#LO)1jlfTLOFes|H%10FhDM0|{D^k;U?V*%MCTMf*+E1 z(*?=3Zdg)6dznTy8<}g+{@CV7xn8R!FIa#wokLraFUV%_uERlX1z=8~CV~OO3_9kA zonp?puRFWQvoY2r`ZWtR^0UREAo&i?E@pGMO5j3~7V^DFk~P%zkeg2EqTDSRJ7zFV z0MB-eUe^t&%oL@FI#xdiTP{T;O|QgB4Jrc>wALQnOIX@=L?dg%KUVql^qk*wQqT9N zv_NcZ&%Zy9nE%TDSH7ao_TozRPq_kkd7p)+gGmqgGypJ(2mwFr(}ue)xT5 z60@gFnztleyQF@9B z*0Z*=eU4?|@~12bum?N*TE%m=B2QLtj2z7jj1YWR|9eWwXFZGfu6(s?lcep#0up6mC|p48NdNz=J=by0$^ih`$x+ixhlUSJeXl1 zHieh7ef}aGqb)5HnC^+;o8lwM*}_|s!Z;zIrRYNX20c9-W7ESl7@pXT@ZSpTwl3W| z_Lkyj7tN#`B-hRqU0*1%OqhMMm00A|@WD#agGV8jvqsP0p6VZ1mW6{++8%>lY=9;a z6oMenW_+~{|A30!UVs|dB$TR0_Ba$1;3pIeCy3(jEHN8U51qSw*9)NX@Q8>PCjIs)Ss;n;C=S@+I;{lou}u z4XuWY5{@^D~xLb5^1YIc;n68GbUt#0*0UKu-`vGyLkJ+*YnJc?yi1p6Nexs&On~Rhpd5G z6w>o*GQTMJmNY}i0AT*NzdjbQu9Fmj?r7ZG4 zM;VEGt|H~UHHp1$@cVu&&X%;d9oQA}kY~)S!42LGCgd$aEup5l*Pq_0c0GhY##=p( zrrc;qU)D|NVBbd~Vl5F7Jtj~NrfWm-C-fs1Al_L~i=*8MoC(Rvi=RAJZ3r+Uw|gBA zKc+@wK%I~Iu?~%#ru)Hyg_d7sXzLQl(sbhgK&^g|-0QGxw-u*(S+ai!dw<^qxwVGA zcAcKX2xEQ(0o~NV_wyPRnF+#b;%N~tWIIPcb*9`s6sd>`=^g-KwcVcmR6Aq8}ZNOO;D6z^%|!qc(ubA7v) za<2U-Fz&zjR>kNg;lTndH3{D{t5@d~Ou9P-ZM*1#J1VaBLrQvmCG31LQjsIj@XBW9 zyEp|gy~AP_?dl>S_wVN=)Wt?X+Zg+;KSTrOkAZ9Pag;JUG32o!q$iW4Y2if|oJ+eH zVQU;>rSdh0SdX@vmyEWXu_v+i816+o-Y>Wdb=ja@s1%H4zj@Z|iOQ>8Q4GhDgf@j< zSN8S*%1dFzdS37`%FI$7p4`>fv}!%XwYIz&t5t%Oz0}PolEnurm(5!TCsfq(Ht1*E zKWJ(tsKD3zZVoptX1nYp2oOH)G4lG2U{)5x!) zWlq`PtlRb6&&E=~_l~;*T1aIjJ1Hf-H`Xy%M+?HMDY2(q)%}`y<)COVF+ev=FVZ+U zYQV~Qv97z&O*j3f)BvG+rn8}oVbd)^JRfbM#oyrs88{x)YwKp&r(%8e11q-cRL)AQ ztmY1T*|$?=V`;IpVyeAz+;jHrxHK!)fZ0uWVKT3Bb%p7B#zg8yI#tMIf<}Mx+J>WnxJS`dbgFMWI z$|e^5Xp_xk+kgt0cH8!{mNa)@yyeJ~o&X+5-pVA1aUak1C`F8rQlCnm+wM|mG5iqs zl6<2Fi~7`$iaY|&F)307X7#UmEd6@=- zCWGZgd5Vde(Z?c&{~F*v^|(Bta%UEfN%wefJWgGXaDVVgsTn~Wt2K1I1#_y0X;F^p z1U<)`Fgj3>S-e0b>+Y@7at{(LRHEg#A1yKH+m|zd4+IegA#Ma-AC^Jmcg-_`RE%I_1 zY0$fN#+*scEZ8(z0mT;i7(~PM;ojx*odH9Z97ixQFq)851N=flib6N7+drm4krhkA z@vgXyWz@1Rg(cr&xNRQMNq7^I)2;O5x79T&G^nT3OiH>16eY$a<*l9E~KxI;gKsRO@eseYC+3$47U96DIqfGr0f3=^#)fs6xHgrkS^sW1K z{i}dWlHTmm%95%qR@?Z>SBToj8_+<%8YxvJ@q>I)1+H2)`?lzXnwFLE)$els0;1$3 zT6sNnqrq<@lB1TZ`^ih#n5i%ncH)%B-z;J3Pzc3Mjn~xHAP?mIEmrQG5=53`F zp7Rg?I*0kGCMn4)bVBN|@#3}Gov#GtfZDRA*L;jvHJXAj^i&&aXO4fQeQ~O_V-%Ez z?2-M-S(!rVP|$Q7&U@e~9zjZ41yG09tR?z120q)q56PBI5JQqamKk}rDTnxc;qE5* zc0@v{mQVY z{<4E991RrxIw1!qbao8p2S_=aPhNTWR^RD2`({!LBN5V~Jm0up{KRbcr+3&x+jPu7 zzGPrmfOj3~Rh;s@!IoSms1KTJz{MvEyV< zs7|p18ZZLe6n+*qWF6}=P-`NKFkNKz(VG)D^7qoCtEIXL=mIT1`AH>LK7^eg7;cvX zP;ZqsN8h&eZB(m$o<;Ic=6{tXpl$B8^d${QE2y8QZT%hgD7m@LYdz+g*+qrNfRyZK zX-V72=q}+&Km_WQsvn1vk`hE z@=`0#@n)Om7-EMKWc4>hDMqvW*nRrt1_nkd2YZ?KHTOj>w_nax0E`?I0v1127-rtJ zEWTlEWIk&?>V`=py>EW?%7~uhB%UhP;-S8VBsanc%1JTAc!4?ht+#F8K-?lTtPnj| zYl*mMROOUgqS6-Ap>*9UClnfG+NG^ukpUBu4-36KvwgB&gi_9EXod*J6FeG!>{sY- zh2pBrq(N?fH{H6vF24Fvgpsqkfs#6Wh6DccP#yom3qmaL;&dp&UxEAEJU9N}tGfCG z7lNxLZUoBI;niY3PjT=AcgeCEbPv(Tgh+H|E3R~4kjVZ zt27?(R9j6WFz}@oqJ!QNc1-tVI1TJZfL|awcpixz$jV)) zlK@~1RDWo^QTW2C~iBf?K1Ina7Jy#W;p&rKjz=m&ype4&|_l~9_eo_y?G|E-d z9w!VkJco$8f)T>)FBweD$8TD6CvP@iNj4!|y;HAxc)^vMHNzm$q!OXz7 zxNC5@Ecg&`A)e4a9XYdhOHVL&7QA<0)Pk*75F zy-E!M#W;3K#mG{e3uWMo>D{r)FWbT?$8Q_!FT>8Ze8RaY>hEp23Ya&}Y%uVq6V5M& z)IaFM$WMfS`ZBgpv9(W)8WhA3UHrYTqc02sFUK5LCWAx4Sd$)o|%0e7ZSTp(L)jJLD6|UKZI7lRu zJ>&Wo8$TylLY;I59u>Rk%!j@{6bh^a4?)y5L6UAo!}^-N3%FSs^1SemD06>rM>UpkWd%=qbh$L2125ksocBo_jujjNe(zU2e9@lOdfMqfvXds!Qai|FXtWiZ8Q zNu2o-J%4P-ZW@pz#|j_T$aGMP&8@#IZtt-QA>GKG5mQQNEjDujf&=}> zGtt)0$NGJ(MBWiu%w>(#u>sd+ z-jWj=e1@+xJG>2xJq0;Ye@QCfg3qv5VO@qBh~C*GUx_Otc$<(M1a+|$%dl_ydQ`QD z7C@h3b^U==M)0+p)x2b|4XMqsJpBF4CV1|yrV}q!;@%+>0YM&w_3=fmV*hHH#nm(% zLC{;W@6sO#MjWxsF>|1}{A;#RJwwp=J?6vbhPAhuIBxBUk}fZo!slwpafkWe-X4CL zc~9<>*>?P1X%KLbhC(du`~|M=(=t;4R$1eOFzPyF+x?>z{ytfNBlPeGC zu3cv=d_VeV;DNi_c~{?q42C|31hwTQL{?{19G~~2?E9jejVM6y4ey~W^tuAs1kb*O zMn_y@`uk1t6>*$J+h#v%&t2&E>^{7axH6fsn849ZNna)6OIUHji$11xr!|3V9y;&e zMMIoj95Ap~X*G|Y(m%~{8q2S-B3f$<%ifbFumvl&9zPz}F5mTW(_NQ=N=zOtLW44>`X#STiGWnCmDXts4 zoSvvO!QmlV3x4t7^8WgYCM4q~YgI$WvT4J%ZqiQ_Cowb_D&8RTF?l8$~cL`$| z5K*U8!-6{PH!fu47a0OH z0beCnXRi-$uq0cKTa2~NTNje0gd2N0mOjRRsPY!aoWJoe{K}jbJFN9?yr^N5D9e!o zH-72^`sPD=(X~sH`ruFAutsF0E&w5kYMMU#-x{*#mTL1mi=PB#YD$4FcLV~lUb0o;xn`L^#*o3 z(v`rscPC2>I}~KojvO^THf)!;vnZ!3lOaC(pwvnEnmfFL8Vg`RWtxm(y|qQ%Q#ew% zEA+->6LRVjS1Zh8dT|BbgiKn;Tgr8_#zq@avtQU_{5$K1DA5I^YA;N2_q;rNR(sAd zfFZS0dK?zl@WNGBKe}^GU_I8A?EX*kLxvxgAC9lbNENnw$`GIYNd7XsGVJM+7g9%U4Sgukes5oX?cQ;JBb!5 z7rSu}=OmWPEH#?(^B^6Inl47U%9@WHTsPbITV(E7A30 z9dx+WnWBnH2-6y6P+3gSv?O{oTbG*q%cP}lpVda(-m7Z+% zRYvL6eQJ5|gnCbC=>wMMsJVl)Eg)@!Q|OeM1(8}(2QFsveUZ{Q#YD~kcw&BYY~o7f zWJ=DBe{-+GJmj_bums~Emo3k?UF5u4vj?EQ5P8E*7Fb4%J18inn%JZCCYtJ8jVB0I zU29)QwhwoKin^^JrhP=HnvZp{{u^S|MbA2)h7X!#cC)}ad0AMVsv$qnuG4B(PK71*{EOdy!Q>jFk)A77(}1Pf8cMQ@pjvb!fMV$}`p1d=qI z@(jWee9<4u=19<1+q(IhR-G`*`K^ZV+80AjfgYK9LL99}jq$b?ai}iqlXTSzmtCRG zpl^sxx$4PEZS2R1ete43#hTBji(TmmiA{*&wBglm=bl`hVkeVSuJlc_1~RnvmRSDV zMX$;6G7qA0&py5>Ns8t-x^A)==22jSrlZH(6bw4Y`zRP~%G23fkwR8&C?Xd)yTKCM zfkMJlx!QW`$R40zDD0yJRwHwa1m^GBt3-)&j9Bs{%2sH;M^%;{^<<@gO^;A6b-)g^ z%kyNA#>H6f_54gcNj^teXg-<;$KV+hXK)}CrQ^}KzzT1xIsTzNb~H=lmH5!-B6p`0 z95|f)0!w{ivTg2s{gRo9)it`eR{kfOl8$-ddlBVH#s-Qfq1KlQjYWpko)hF+XFFW0ivw{l;aEH{A55<~hk2T)6efAbHX?d-zz;LwF z-0IUHzsj*meV%%NXai9@sDQ2^0I?jTIUz%-L+~wzkd=tD7{l-|eqn=ks4b3x#~F_^ zWN9Z47Yiij-!bY|JFngR^*eWsX64G}Sin(!hWXgGVfw<-%gAe(wz8#x`0nL=hfYQ7 z9P~&sE;YPR#5YTBTw}2R8XU^HY{@tc=d`C$$=)=&XDNX8=0z@I?B4rJ z&($-o@GTY^(hn~bE1Z-lK8w>D?`8^MuVFLxu$Gx(bR)8_U>GBrt+DL`N)>5_SF6h? z9%#0RJVB*ik6eDpEd5$Ey9E?1)Qk+Q0e&nu1|w7<-M#gnZhq*22tfn(uUdfLIBJN7 zG;sB1-x^@Tt*+F`D6G(WS}!n$YDl#V<8DYedSheok_f&9Ew>aeym%?Pz89l+Y{x%i zdOhL%IdxpY0ltlO0X7id;dI5uo-@J**{T=Y)h4%3<0o_4>DhtakXZStgC^Y1G|i8W z8;Id%AxEzfqspf(U%Hq(=tpjcASBv}5+>cl1Wv=fyPVj@MqJ&rGd;I&j8}r&m?6B- zu5&Pl(NkM{pka}`42|!4yA5^bL91jA<)S=Lp4iVej{+aSQ_ZCGsGlfzV;XpQ?5yTn zw(qf|afKMRDK3UNF2F40e=`BN)PBc^DII{fnab~e$uS&F9BkD*wPdDD);D(~JN_l& zw5eUks5p|8b<5B}`P??1WhvD=PRb~e`n2OalbIt&^28E6o1ha+cGLjHHjzu2am&0j zFQV>numjXrNe13~x>?=guUblkQNY{JEnz=;!&#d?zidmpBM-G+Q4INhyj~TD3lP=m zbJ(1GJKB#)g~UJVz3%Ce6WMj7!$3B>R#D_<=6}``dK;(d>plizf)`1RD|a6mV-8V8 zytQD6)G2nf=w8UdA$JkI=Jt?%Wg6U&k)f6S9`R$y0{LO|cu7gd4WTUl_2xlc4XUcx zt{Lgd01Z@A&Cu*lw~o)~lFjPfMy9I7L`eAhUj6s|(0APLrgn)Xyp)Zx@!7&T`MZvH zzRZ{5Bbll!7Y-(>Am>@;8EHhMrx+}HNwp~}7(RB~x_pKyXfv`+@<0k{!FrI>IAA<^ z=k+34v(hA=qTlCp_T1N3flY~+@+l=WB#S(BD^thqoKhX`dD zB!7Jk*YW#z3;e?;vj-@792?MY|ybScN~>Pk=1!6?1z(WwyR z0%t@KM0=|{^Oh!CwG6@{Ig@TGA1Bd@700);ncm?$aoC+F`^s^50qQpgfwlGb?G5E@!0-<=W}o|TmZFtrNRU!PC=bYpiO+Ddcr z&@=C2n~U_^Ff2O2(L^Uvh*p-hbGjpV*OgSIwz~p-#s<&SlWUiT zIWP209$LPLF$v4|1*dWkjG3j|c~+DNUK*NW>iqV=5|@fH$%I^pYC>DHL{zkEe+sMo zyQZLXEq9xh?&IF8f{;k6|XUXkZjlM%kkgGqIV`A#rT^ zZ`JEixNw&(RpmOQ*Ppf_C`Hn(X1}eSNi%TJQMw9} zBXH4Cm@wII59G$vhI038AK|L^mo43Ci5<@c!~;62{d9Z=)Zqs8B}MB9V?DkI;odDK z?}-^$EwSdy8SnakKf#UOR?HvVawb)_L{cV0n1>?paekOOWII2MBBKXKx@}sdL?1~_ zhGWVYa$rZ*rzgg28arZp*xqWImcI9I?hO?!=de|z3N;I=Iz8P)TDaDs!8_%qYnlzM zDu9jC7AE|-ssqt#I5#5|!g4cUQ zQr>=LsgJ1O5+)VKC*P+{7%$06pwL!>j6PtPKG9LmvFO|Fb?S?cY|Ka}!T)_!s=lT%Jmb|P@7vN>f8J)W&DwbKTWs*Oc@)2c_hv~d01Y`^;gEu_a*6OI>v?Pyr`q9-P z^_jHSQL1eFYPKpg6>w%hI8-NF823X}1ku}!QmML*pVeGI+A zMi~GpQl2GopJ(e~3V~7_q?odkKEOPKz4JD04XkX1Rc7YXpMpbqneE+^b{($@B5EV> z>agk(m9Ag?I9&YPOqsrEty2n$J_A?lb0ycJoR}c<8!EfB*||FB{JXTj3id~BnOWKY zEG_6675Njp_zinJlPGVD>)?}UHNujHU_|BI)2E(GY8B&=s=^b5`Te`an5wzC&8)dK@qn16Z6=>0JU zG5?nR5CYJp}p>f%OC*Jz-@}tqY(r&@%(u06>f&Rz_w3jj6r8EjQB>d-Wumfc0!m z%?#`qZNMh4U;m0D54JIMFnGe${_k%8VX{Df=ih$6MB!*Wc{y z!Fo^cF!&c$sAT49^jxcF?n}|e=4t=`gRMzg8$a#yUr3pqy&l;9S9L)^AR7pgl2Y`o H7~=l`ianHz literal 0 HcmV?d00001 diff --git a/doc/doxygen/latex/doxygen.sty b/doc/doxygen/latex/doxygen.sty new file mode 100644 index 000000000..acd68e4be --- /dev/null +++ b/doc/doxygen/latex/doxygen.sty @@ -0,0 +1,480 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{doxygen} + +% Packages used by this style file +\RequirePackage{alltt} +\RequirePackage{array} +\RequirePackage{calc} +\RequirePackage{float} +\RequirePackage{ifthen} +\RequirePackage{verbatim} +\RequirePackage[table]{xcolor} +\RequirePackage{xtab} + +%---------- Internal commands used in this style file ---------------- + +\newcommand{\ensurespace}[1]{% + \begingroup% + \setlength{\dimen@}{#1}% + \vskip\z@\@plus\dimen@% + \penalty -100\vskip\z@\@plus -\dimen@% + \vskip\dimen@% + \penalty 9999% + \vskip -\dimen@% + \vskip\z@skip% hide the previous |\vskip| from |\addvspace| + \endgroup% +} + +\newcommand{\DoxyLabelFont}{} +\newcommand{\entrylabel}[1]{% + {% + \parbox[b]{\labelwidth-4pt}{% + \makebox[0pt][l]{\DoxyLabelFont#1}% + \vspace{1.5\baselineskip}% + }% + }% +} + +\newenvironment{DoxyDesc}[1]{% + \ensurespace{4\baselineskip}% + \begin{list}{}{% + \settowidth{\labelwidth}{20pt}% + \setlength{\parsep}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}% + \renewcommand{\makelabel}{\entrylabel}% + }% + \item[#1]% +}{% + \end{list}% +} + +\newsavebox{\xrefbox} +\newlength{\xreflength} +\newcommand{\xreflabel}[1]{% + \sbox{\xrefbox}{#1}% + \setlength{\xreflength}{\wd\xrefbox}% + \ifthenelse{\xreflength>\labelwidth}{% + \begin{minipage}{\textwidth}% + \setlength{\parindent}{0pt}% + \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}% + \end{minipage}% + }{% + \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}% + }% +} + +%---------- Commands used by doxygen LaTeX output generator ---------- + +% Used by
 ... 
+\newenvironment{DoxyPre}{% + \small% + \begin{alltt}% +}{% + \end{alltt}% + \normalsize% +} + +% Used by @code ... @endcode +\newenvironment{DoxyCode}{% + \par% + \scriptsize% + \begin{alltt}% +}{% + \end{alltt}% + \normalsize% +} + +% Used by @example, @include, @includelineno and @dontinclude +\newenvironment{DoxyCodeInclude}{% + \DoxyCode% +}{% + \endDoxyCode% +} + +% Used by @verbatim ... @endverbatim +\newenvironment{DoxyVerb}{% + \footnotesize% + \verbatim% +}{% + \endverbatim% + \normalsize% +} + +% Used by @verbinclude +\newenvironment{DoxyVerbInclude}{% + \DoxyVerb% +}{% + \endDoxyVerb% +} + +% Used by numbered lists (using '-#' or
    ...
) +\newenvironment{DoxyEnumerate}{% + \enumerate% +}{% + \endenumerate% +} + +% Used by bullet lists (using '-', @li, @arg, or
    ...
) +\newenvironment{DoxyItemize}{% + \itemize% +}{% + \enditemize% +} + +% Used by description lists (using
...
) +\newenvironment{DoxyDescription}{% + \description% +}{% + \enddescription% +} + +% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc +% (only if caption is specified) +\newenvironment{DoxyImage}{% + \begin{figure}[H]% + \begin{center}% +}{% + \end{center}% + \end{figure}% +} + +% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc +% (only if no caption is specified) +\newenvironment{DoxyImageNoCaption}{% + \begin{center}% +}{% + \end{center}% +} + +% Used by @attention +\newenvironment{DoxyAttention}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @author and @authors +\newenvironment{DoxyAuthor}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @date +\newenvironment{DoxyDate}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @invariant +\newenvironment{DoxyInvariant}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @note +\newenvironment{DoxyNote}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @post +\newenvironment{DoxyPostcond}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @pre +\newenvironment{DoxyPrecond}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @copyright +\newenvironment{DoxyCopyright}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @remark +\newenvironment{DoxyRemark}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @return and @returns +\newenvironment{DoxyReturn}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @since +\newenvironment{DoxySince}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @see +\newenvironment{DoxySeeAlso}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @version +\newenvironment{DoxyVersion}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @warning +\newenvironment{DoxyWarning}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @internal +\newenvironment{DoxyInternal}[1]{% + \paragraph*{#1}% +}{% +} + +% Used by @par and @paragraph +\newenvironment{DoxyParagraph}[1]{% + \begin{list}{}{% + \settowidth{\labelwidth}{40pt}% + \setlength{\leftmargin}{\labelwidth}% + \setlength{\parsep}{0pt}% + \setlength{\itemsep}{-4pt}% + \renewcommand{\makelabel}{\entrylabel}% + }% + \item[#1]% +}{% + \end{list}% +} + +% Used by parameter lists +\newenvironment{DoxyParams}[2][]{% + \par% + \tabletail{\hline}% + \tablelasttail{\hline}% + \tablefirsthead{}% + \tablehead{}% + \ifthenelse{\equal{#1}{}}% + {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}% + \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% + p{0.805\textwidth}|}}% + {\ifthenelse{\equal{#1}{1}}% + {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}% + \begin{xtabular}{|>{\centering}p{0.10\textwidth}|% + >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% + p{0.678\textwidth}|}}% + {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}% + \begin{xtabular}{|>{\centering}p{0.10\textwidth}|% + >{\centering\hspace{0pt}}p{0.15\textwidth}|% + >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% + p{0.501\textwidth}|}}% + }\hline% +}{% + \end{xtabular}% + \tablefirsthead{}% + \vspace{6pt}% +} + +% Used for fields of simple structs +\newenvironment{DoxyFields}[1]{% + \par% + \tabletail{\hline}% + \tablelasttail{\hline}% + \tablehead{}% + \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}% + \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% + p{0.15\textwidth}|% + p{0.63\textwidth}|}% + \hline% +}{% + \end{xtabular}% + \tablefirsthead{}% + \vspace{6pt}% +} + +% Used for parameters within a detailed function description +\newenvironment{DoxyParamCaption}{% + \renewcommand{\item}[2][]{##1 {\em ##2}}% +}{% +} + +% Used by return value lists +\newenvironment{DoxyRetVals}[1]{% + \par% + \tabletail{\hline}% + \tablelasttail{\hline}% + \tablehead{}% + \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}% + \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|% + p{0.705\textwidth}|}% + \hline% +}{% + \end{xtabular}% + \tablefirsthead{}% + \vspace{6pt}% +} + +% Used by exception lists +\newenvironment{DoxyExceptions}[1]{% + \par% + \tabletail{\hline}% + \tablelasttail{\hline}% + \tablehead{}% + \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}% + \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|% + p{0.705\textwidth}|}% + \hline% +}{% + \end{xtabular}% + \tablefirsthead{}% + \vspace{6pt}% +} + +% Used by template parameter lists +\newenvironment{DoxyTemplParams}[1]{% + \par% + \tabletail{\hline}% + \tablelasttail{\hline}% + \tablehead{}% + \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}% + \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|% + p{0.705\textwidth}|}% + \hline% +}{% + \end{xtabular}% + \tablefirsthead{}% + \vspace{6pt}% +} + +% Used for member lists +\newenvironment{DoxyCompactItemize}{% + \begin{itemize}% + \setlength{\itemsep}{-3pt}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + \setlength{\partopsep}{0pt}% +}{% + \end{itemize}% +} + +% Used for member descriptions +\newenvironment{DoxyCompactList}{% + \begin{list}{}{% + \setlength{\leftmargin}{0.5cm}% + \setlength{\itemsep}{0pt}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + \renewcommand{\makelabel}{\hfill}% + }% +}{% + \end{list}% +} + +% Used for reference lists (@bug, @deprecated, @todo, etc.) +\newenvironment{DoxyRefList}{% + \begin{list}{}{% + \setlength{\labelwidth}{10pt}% + \setlength{\leftmargin}{\labelwidth}% + \addtolength{\leftmargin}{\labelsep}% + \renewcommand{\makelabel}{\xreflabel}% + }% +}{% + \end{list}% +} + +% Used by @bug, @deprecated, @todo, etc. +\newenvironment{DoxyRefDesc}[1]{% + \begin{list}{}{% + \renewcommand\makelabel[1]{\textbf{##1}}% + \settowidth\labelwidth{\makelabel{#1}}% + \setlength\leftmargin{\labelwidth+\labelsep}% + }% +}{% + \end{list}% +} + +% Used by parameter lists and simple sections +\newenvironment{Desc} +{\begin{list}{}{% + \settowidth{\labelwidth}{40pt}% + \setlength{\leftmargin}{\labelwidth}% + \setlength{\parsep}{0pt}% + \setlength{\itemsep}{-4pt}% + \renewcommand{\makelabel}{\entrylabel}% + } +}{% + \end{list}% +} + +% Used by tables +\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}% +\newlength{\tmplength}% +\newenvironment{TabularC}[1]% +{% +\setlength{\tmplength}% + {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}% + \par\begin{xtabular*}{\linewidth}% + {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}% +}% +{\end{xtabular*}\par}% + +% Used by nested tables +\newenvironment{TabularNC}[1]% +{% +\setlength{\tmplength}% + {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}% + \par\begin{tabular*}{\linewidth}% + {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}% +}% +{\end{tabular*}\par}% + +% Used for member group headers +\newenvironment{Indent}{% + \begin{list}{}{% + \setlength{\leftmargin}{0.5cm}% + }% + \item[]\ignorespaces% +}{% + \unskip% + \end{list}% +} + +% Used when hyperlinks are turned off +\newcommand{\doxyref}[3]{% + \textbf{#1} (\textnormal{#2}\,\pageref{#3})% +} + +% Used by @addindex +\newcommand{\lcurly}{\{} +\newcommand{\rcurly}{\}} + +% Used for syntax highlighting +\definecolor{comment}{rgb}{0.5,0.0,0.0} +\definecolor{keyword}{rgb}{0.0,0.5,0.0} +\definecolor{keywordtype}{rgb}{0.38,0.25,0.125} +\definecolor{keywordflow}{rgb}{0.88,0.5,0.0} +\definecolor{preprocessor}{rgb}{0.5,0.38,0.125} +\definecolor{stringliteral}{rgb}{0.0,0.125,0.25} +\definecolor{charliteral}{rgb}{0.0,0.5,0.5} +\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0} +\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43} +\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0} +\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0} diff --git a/doc/doxygen/latex/hierarchy.tex b/doc/doxygen/latex/hierarchy.tex new file mode 100644 index 000000000..4962f4d4a --- /dev/null +++ b/doc/doxygen/latex/hierarchy.tex @@ -0,0 +1,13 @@ +\section{Class Hierarchy} +This inheritance list is sorted roughly, but not completely, alphabetically\+:\begin{DoxyCompactList} +\item \contentsline{section}{dynet\+:\+:expr\+:\+:Expression}{\pageref{structdynet_1_1expr_1_1Expression}}{} +\item \contentsline{section}{dynet\+:\+:Trainer}{\pageref{structdynet_1_1Trainer}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{dynet\+:\+:Adadelta\+Trainer}{\pageref{structdynet_1_1AdadeltaTrainer}}{} +\item \contentsline{section}{dynet\+:\+:Adagrad\+Trainer}{\pageref{structdynet_1_1AdagradTrainer}}{} +\item \contentsline{section}{dynet\+:\+:Adam\+Trainer}{\pageref{structdynet_1_1AdamTrainer}}{} +\item \contentsline{section}{dynet\+:\+:Momentum\+S\+G\+D\+Trainer}{\pageref{structdynet_1_1MomentumSGDTrainer}}{} +\item \contentsline{section}{dynet\+:\+:Rms\+Prop\+Trainer}{\pageref{structdynet_1_1RmsPropTrainer}}{} +\item \contentsline{section}{dynet\+:\+:Simple\+S\+G\+D\+Trainer}{\pageref{structdynet_1_1SimpleSGDTrainer}}{} +\end{DoxyCompactList} +\end{DoxyCompactList} diff --git a/doc/doxygen/latex/refman.tex b/doc/doxygen/latex/refman.tex new file mode 100644 index 000000000..643cf53b8 --- /dev/null +++ b/doc/doxygen/latex/refman.tex @@ -0,0 +1,164 @@ +\documentclass[twoside]{book} + +% Packages required by doxygen +\usepackage{fixltx2e} +\usepackage{calc} +\usepackage{doxygen} +\usepackage[export]{adjustbox} % also loads graphicx +\usepackage{graphicx} +\usepackage[utf8]{inputenc} +\usepackage{makeidx} +\usepackage{multicol} +\usepackage{multirow} +\PassOptionsToPackage{warn}{textcomp} +\usepackage{textcomp} +\usepackage[nointegrals]{wasysym} +\usepackage[table]{xcolor} + +% Font selection +\usepackage[T1]{fontenc} +\usepackage[scaled=.90]{helvet} +\usepackage{courier} +\usepackage{amssymb} +\usepackage{sectsty} +\renewcommand{\familydefault}{\sfdefault} +\allsectionsfont{% + \fontseries{bc}\selectfont% + \color{darkgray}% +} +\renewcommand{\DoxyLabelFont}{% + \fontseries{bc}\selectfont% + \color{darkgray}% +} +\newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}} + +% Page & text layout +\usepackage{geometry} +\geometry{% + a4paper,% + top=2.5cm,% + bottom=2.5cm,% + left=2.5cm,% + right=2.5cm% +} +\tolerance=750 +\hfuzz=15pt +\hbadness=750 +\setlength{\emergencystretch}{15pt} +\setlength{\parindent}{0cm} +\setlength{\parskip}{0.2cm} +\makeatletter +\renewcommand{\paragraph}{% + \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{% + \normalfont\normalsize\bfseries\SS@parafont% + }% +} +\renewcommand{\subparagraph}{% + \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{% + \normalfont\normalsize\bfseries\SS@subparafont% + }% +} +\makeatother + +% Headers & footers +\usepackage{fancyhdr} +\pagestyle{fancyplain} +\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}} +\fancyhead[CE]{\fancyplain{}{}} +\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}} +\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}} +\fancyhead[CO]{\fancyplain{}{}} +\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}} +\fancyfoot[LE]{\fancyplain{}{}} +\fancyfoot[CE]{\fancyplain{}{}} +\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize Generated on Fri Oct 14 2016 13\+:15\+:22 for Dynet by Doxygen }} +\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize Generated on Fri Oct 14 2016 13\+:15\+:22 for Dynet by Doxygen }} +\fancyfoot[CO]{\fancyplain{}{}} +\fancyfoot[RO]{\fancyplain{}{}} +\renewcommand{\footrulewidth}{0.4pt} +\renewcommand{\chaptermark}[1]{% + \markboth{#1}{}% +} +\renewcommand{\sectionmark}[1]{% + \markright{\thesection\ #1}% +} + +% Indices & bibliography +\usepackage{natbib} +\usepackage[titles]{tocloft} +\setcounter{tocdepth}{3} +\setcounter{secnumdepth}{5} +\makeindex + +% Hyperlinks (required, but should be loaded last) +\usepackage{ifpdf} +\ifpdf + \usepackage[pdftex,pagebackref=true]{hyperref} +\else + \usepackage[ps2pdf,pagebackref=true]{hyperref} +\fi +\hypersetup{% + colorlinks=true,% + linkcolor=blue,% + citecolor=blue,% + unicode% +} + +% Custom commands +\newcommand{\clearemptydoublepage}{% + \newpage{\pagestyle{empty}\cleardoublepage}% +} + + +%===== C O N T E N T S ===== + +\begin{document} + +% Titlepage & ToC +\hypersetup{pageanchor=false, + bookmarks=true, + bookmarksnumbered=true, + pdfencoding=unicode + } +\pagenumbering{roman} +\begin{titlepage} +\vspace*{7cm} +\begin{center}% +{\Large Dynet }\\ +\vspace*{1cm} +{\large Generated by Doxygen 1.8.9.1}\\ +\vspace*{0.5cm} +{\small Fri Oct 14 2016 13:15:22}\\ +\end{center} +\end{titlepage} +\clearemptydoublepage +\tableofcontents +\clearemptydoublepage +\pagenumbering{arabic} +\hypersetup{pageanchor=true} + +%--- Begin generated contents --- +\chapter{Hierarchical Index} +\input{hierarchy} +\chapter{Class Index} +\input{annotated} +\chapter{Class Documentation} +\input{structdynet_1_1AdadeltaTrainer} +\input{structdynet_1_1AdagradTrainer} +\input{structdynet_1_1AdamTrainer} +\input{structdynet_1_1expr_1_1Expression} +\input{structdynet_1_1MomentumSGDTrainer} +\input{structdynet_1_1RmsPropTrainer} +\input{structdynet_1_1SimpleSGDTrainer} +\input{structdynet_1_1Trainer} +%--- End generated contents --- + +% Index +\backmatter +\newpage +\phantomsection +\clearemptydoublepage +\addcontentsline{toc}{chapter}{Index} +\printindex + +\end{document} diff --git a/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer.tex b/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer.tex new file mode 100644 index 000000000..3c2b04349 --- /dev/null +++ b/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer.tex @@ -0,0 +1,65 @@ +\hypertarget{structdynet_1_1AdadeltaTrainer}{}\section{dynet\+:\+:Adadelta\+Trainer Struct Reference} +\label{structdynet_1_1AdadeltaTrainer}\index{dynet\+::\+Adadelta\+Trainer@{dynet\+::\+Adadelta\+Trainer}} + + +Inheritance diagram for dynet\+:\+:Adadelta\+Trainer\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=195pt]{structdynet_1_1AdadeltaTrainer__inherit__graph} +\end{center} +\end{figure} + + +Collaboration diagram for dynet\+:\+:Adadelta\+Trainer\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=195pt]{structdynet_1_1AdadeltaTrainer__coll__graph} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1AdadeltaTrainer_aaed979b129d3a4642321b8d414efea0c}{}{\bfseries Adadelta\+Trainer} (Model $\ast$m, real eps=1e-\/6, real rho=0.\+95)\label{structdynet_1_1AdadeltaTrainer_aaed979b129d3a4642321b8d414efea0c} + +\end{DoxyCompactItemize} +\subsection*{Protected Member Functions} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1AdadeltaTrainer_a98d5d3abe044d455df1a0fb3c35fbf44}{}virtual void {\bfseries alloc\+\_\+impl} () override\label{structdynet_1_1AdadeltaTrainer_a98d5d3abe044d455df1a0fb3c35fbf44} + +\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1AdadeltaTrainer_a65675903e5b9d77c7adde456d85d7b8c}{}real {\bfseries epsilon}\label{structdynet_1_1AdadeltaTrainer_a65675903e5b9d77c7adde456d85d7b8c} + +\item +\hypertarget{structdynet_1_1AdadeltaTrainer_a41208d6c68aa6478a661aac929b335e6}{}real {\bfseries rho}\label{structdynet_1_1AdadeltaTrainer_a41208d6c68aa6478a661aac929b335e6} + +\item +\hypertarget{structdynet_1_1AdadeltaTrainer_a51fb513277530881e6cbe16222adfff8}{}std\+::vector$<$ Shadow\+Parameters $>$ {\bfseries hg}\label{structdynet_1_1AdadeltaTrainer_a51fb513277530881e6cbe16222adfff8} + +\item +\hypertarget{structdynet_1_1AdadeltaTrainer_a3150eb1db93079ca53e470265c0a81df}{}std\+::vector$<$ Shadow\+Lookup\+Parameters $>$ {\bfseries hlg}\label{structdynet_1_1AdadeltaTrainer_a3150eb1db93079ca53e470265c0a81df} + +\item +\hypertarget{structdynet_1_1AdadeltaTrainer_a835052dcc3f77e01016afb8de0a9c4b0}{}std\+::vector$<$ Shadow\+Parameters $>$ {\bfseries hd}\label{structdynet_1_1AdadeltaTrainer_a835052dcc3f77e01016afb8de0a9c4b0} + +\item +\hypertarget{structdynet_1_1AdadeltaTrainer_a1dbae7cb54caba3e863f5a7c97934fe6}{}std\+::vector$<$ Shadow\+Lookup\+Parameters $>$ {\bfseries hld}\label{structdynet_1_1AdadeltaTrainer_a1dbae7cb54caba3e863f5a7c97934fe6} + +\end{DoxyCompactItemize} +\subsection*{Friends} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1AdadeltaTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c}{}class {\bfseries boost\+::serialization\+::access}\label{structdynet_1_1AdadeltaTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c} + +\end{DoxyCompactItemize} +\subsection*{Additional Inherited Members} + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +/home/paul/dev/dynet/dynet/training.\+h\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__coll__graph.md5 b/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__coll__graph.md5 new file mode 100644 index 000000000..85322028c --- /dev/null +++ b/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__coll__graph.md5 @@ -0,0 +1 @@ +4e3894942c8095aa3e726826de10d42f \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__coll__graph.pdf b/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__coll__graph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8283b9b2921a0d764ccc0927cc3db126f640effb GIT binary patch literal 11677 zcmb8V1yEeu68DP+_W&V47=k;46Wrb1b#Na%xCMf{1$TlZxCM8&;O-8=od?M|_nv$2 zSMPmqZ)*0e|L)bRS9h#x_-%1kdcBGK>o3~UZM?_Kgm2QJ(sttr7m5e4t`paF3^LgRty>ZaT(fg2j6^S75|zhwC3`J7`WPPUi#FC(UZmEw2u zMO+=llpLQE58&p05uPsw1IFh8fI&zA00b}?89aYJm*e@xpHBu+TN}rJSewu>(lG*9 z|1RgV(evM5i?RJ{F#vD#0UU# zvI2mtYyh3#)#^U}a(bkN!V&S5YR=nx;c1@M~nV@$J^}d*yPK zZ=PwN(hUWJfZ9gr*9eDZBLL;QLN5RvkO?UmB{h800&YI@e)6opI*ia_6;&BxolgH) zt^!tTVZlnvM=hwT4#gI3>%trE>*%6Gl>hWW!>w-L=ZgwwHF3>5pPozrIaVzF>m&FZ zG@MuoA}H{u29D528abR-kZnZJ4uET;hO#s`{<#huh!xnAlh9LyU_^Lm*ZTUv$M_v6 zEZCV=?GnahV;yZzeR(aeI?9!DF^I3}HIVplJ(Vpa-0$DNhoH&u210NKb4^a+wcexo z_7qZdj&=P+SVP8z?&S?4B+SzHDb0!en#KiTY>o2$u`~k%P0AHNa2eg(;ga}0fdyy$G_{LA6;A@Uo_5=ebmzch!sY(;FjYStS8|lZf*!m$~UOr{AL8xfKRI4 z$U;_+ofZHNj|ux*~C24^>)t+X$2b{#z&tq3XS|K2gMB*2BMkUr{@s**P{^} zgpc+x{Yeiogc@2M-->;?;iK1K>HlSmp9OlIj-N} zkT1QJ_?w9J2Q$heF~*w@71I*)yGKGF6b1Cne{xeq2-knjJ}~%V zYTr$2ra`F3JXeuxHtF#(a@EP$q0e>ZqYRtAKq044NIR;3XvEK5g6wz1NHa3A^I#Vl z$Q`}!She9#{E1SzsVkv~m9wUuH09z+bfjXGxMKIBaNcZ1Y%3>Gk$e%;nAHMf&g$+* zbw^4Y!!&%9o20#&TRxBTklU$Rp(Ui^DKOuyJraBe25Y7IM%xR> zg-%o>1bv*Fu4z#<8FPt8XtAa%LUbvJ-zz zK`;Hie>s^As$*wCzpK=JFyGOFno3eIHm;BExFb-clf9yLEZP~qL2{ABS*|Vi!s~m7 z-DxU}9EZlHkA;H)B;%oGOBsAZb!vCHn!5@#zT?DZzb|u_op9v{_lWKATg~-xo(j2# zg&#pn`m5uI={ID9m11vJ1u(f?k;Kn8f%hL+El6DKE>ikeja!JB^)$UAZA1(h?5Qjn zXjvJ{ZlyI(wlSSoVig{3OREVU@9;eua0t6FF<4kdW>%()IwqXPh6(H+GlNIm!6DSu zPFUq-jT*i2Vej`MY8TX~P{;S^+j;ksLp8${5Z@PFso}~m#eP%KIU(&89h<694ri;EpNhkM=dGcP#XST1=JAxZHls;=u-PRl&_sWylEPlh2GD$xXEbSUzi$@*rEzP9KGXvXFTDkktIZgM+ zpJmUM>V*lS1EkkEE4VI231z0u%a!cnBdSqR*OVNGh}~3PHx=a3Q)Bh4O%{gSRO8X( zL`~G{h5K18gp6D*wZ{)001jWLy-|cE9^?@blozZ(0g@3e*(-PUBkT)0g=FD6zzBoBHCI9I@SDk|}`mH66T53F|v8BQL5F(vP zUEfxuKFBV4YA3FWP{+;uInP1T`54*x`Rx++`nojaltm}6OxZX;AqA^tUcv|H4r&TX zXj4L=tes8BcjWF-sy8Nk#uH6C%DNp~4SEu3b4#|nwr<-Scu{>6(?!1ynAc<1O^ne> zk>KBkg&~N<*Mn48R?&nLC7dnydgnCfUSWehw3VoCJ4Y7YWauWgmUiSD9w3BpNe}Uf znUh^E-r$sa`4wQA*c{ok5Qyh!giz){?(o56DYbXs{Ty~~lz=46ulc~*q@|2MV1N=& zhBN5V{mQhUgjP*bvmA6!)#2(^HWE{rvhks7qGqu_nMl*Yf_%s#Gs_!;+ZsRv3U z8=GV2#ExUTAO4=#{~->FUr1gOfjqDIHc6CZh6InaN`Rtze=JI!aA;t^jgv6{?fn_? zc}k(>BuE@7mfXK;J&wm~g=;=&rGj3HfFz6S0uOI_gH<6$JEyW(d0A#Jln3rtV`ldq zyro348l2x7Y1hr3(^{}!Cp-SWiA?mlE4x+h}(UZiuy9*2}d@t-p^JJbfh`z#vr`7fsZ~U_U zq(CxG3l}B95>u3sG^6yy7|*3mr#2~1Q+_7Yw;(}wc(doQe%XAE;He_S?1wMl8q_W~ zgyIDE?TdICvt&KHh;!fFSSryD2r5;ImE=_@j+>krb8SYn?4ars;%OBh^JD9Z3{FNz zagz?|xTap%sblHB`L=U=F2r{?_dJ1Dr>1ThYF(rQ*r!%C-R%M2xMtNp@C9;M2FNvg z&m&)EFYae7pumI!9jLe|a(B~LdSViltMJu~1ut3%BYvS3&3>>i6QdqDDH`n_BMqKO z^n?CHsBK(37i#>y<~w7>zTy-o>#eZGqOO$UtJGc*HPfdZZdPBA zBvQP8cGzaZ!$kUaDjyw@sD*J_Te7Dtvu!dHDLpj{tjm&h3XHM4}o}XBxGrUtjsqHqm`L;(<|=y)w@k z73bRvn)SibNqzio?Lx5O*|0{qU8s^y3Mqi`{T=PtD~4h`_0hf zT!-1*Av&O&B`fwWE3Qj_&TeTk-t^AO(=FZCD}5 z@j-FN+e$yMrX!&f^%afvnAlRF;3J|>Tn{Z>N&ImAML29t?V^|pyv02byA@xt!a9p9 zPy_ew-;6IYIn?g&-Uo^kz}tq1Nsn02bf$!_?_V_Abb?O3`m8r5B- z*!te@hgc@xD$i_*qW8JRk1*?7Iw?AT;Goq*&u2MnCBfTZZp$p8u;r383(n8~! z=N-E@xBZk5ZS9CWRuKkX$G!}r9+t!XKc_D4yrz=06@(?St*1rJD5x-UC@c8capTqx zF?Vu}V4R#rh9VU=;sc1_hcyoX#N-*ra5xF+IliCIUbFNsm=n@g7(M{{hF1ct6NV2g z?U4(43s7fX!Smg*?eDQM4k<96pe!@BQrfj?6@Df!Tr|h3#^ocWOj>T!s1po9y~)$cTIUO@jbM zQW!OaswOOHmCkEw+Aq8q9zpQbR;S*Cd+_hT6HTjo))Q_;7I=%eSRV+-?0pMBu1rk+ z<^a_`$=3l*_0pJjen7gRNOWe6BKH&SEHUe&D1n~g{*Q44us>;#i^_yeK6I47PfHWx z-e@2>{7PxgpGcyN#LwccvJ2EQ3lmghM36tbY+#BIrO;^K10LWtwt6$f2y@N>Ie+x} z-tqLHN6+prR#a0dpwxjfz3+4!Nk1rx>{b>4>1>vNVymWZhrExEY?9cL&^4~&zNlWJ z?3NtBAqBQ07Ff)8Nvhr=m$3M}aiIX5&hea+X1aX#AK*Khq5N^d8 zON5TPpH@Sw*!r2-{DCLyyFlwM-Y>V0yD}&aXb};Vph6sH#nFN(D4X>CbcgKCZ8Fg= z8J3OOUttV|-9L$Q;wb}f53H=-WAN7G%u8_R1l{?;4y|HhinY9L%8L(1)Lder--N?q zHOz->nSIzW|DM@V_rrw1Ka_yK%V-qXn7_b-U1(ZvElx4uMqX$EIlOwXFPD=B8|P3v zl@@TLikQ%hl(XQb8=jn@QlE)l+(N}h{E9OF{WsnsRd>+5%Spr1T$b8vXEKAKpLv4T ze)6Pni8b8Y1@NmAiHjkNgvyVOcj0AP6HDohu%XTb7e5#}q7IkXv`7Kx)6iNLfr~YX z{@ZWMhQ@S^34bLO=BDfyoJH)_eh%03nDCnUnbtCKCWfBDg;4G)7iIhIyU_k1JGZtT z!jBM?4}Iq|{1QeSI?SJ;JiaZWSaeG$Bx|)^0#JKWNFqEL@SJqk^9Rhu5-Mg}-yr;K zZQW%Y6C)NyHEQ-c<*hE2C-3ca_2f4*C$Lv73ZU3-gXmD`VK{4*+Z)QhLS`nZtylz- z3^>UB^aFya>6a1=i7!95*C>_KwUZIv{>XulOc~>G3_dio3D~-zAR`20*7;9#U=by- zMklC!GGPCjOcaE5c+2-~F{;@||LJ~hr%!vrRNOstRIAVThH1VwipwLJ8@xzT&rquE z>eM{f`ZoJz+lW@kWzZ-(X zd+B@;Ztbx~$Gi7u_9Z5t$Xc)@f5iyTsxWTCv?P5c1R2KF-M{HT*E;1+(in-Mo%+$+ z(xn)OYX? zNLladE~Gygk646FkvZ?@MiGy~RndgGNsWsZE3S+61n|h#o(dm@6|+KFI$NG5hD$iF zl-dG=f)+Y|a$OCZ#53&d$hfBGa{ra9NNXyFRO#B}_397lNnI&rHgRs{>AV=y(ONdd zMO7?k6sdOisjMBbucB#G+wMXQA4pJ;p@2`~J1t z-3RJx?(ka_-ATfj@hpjAts^9Aa-kR5r~+DIbwCJvOm{lqoP$2XM3~}8Yw!5Vn@ zHp--NXmpW?>G;@vVH7eQdif3fRQiN@K(w-NSaMdHBu8}R4{0zDSWqAUcLH+qvd~jn z$Vtz0g+3s`D~WoS?#v68ijfTILZzd!GqPlSX{V!c1{3MHpF*ey3PteptYxf%IN$eS zPcD);_Bi;19aDe7*tg4GFj-xqkXRSs6Yy(7_-V}%d@k;^Ci8JvNFxZLtU|#AExkz# zu~V(#NrCR8Y1xu!l>&Hp?rdH6S4p~juZdE994EGmC`~&t}_r(oe*7Hd^iUu1bQn+ynKyPGoW?ufn=n_lp`0p=^dL=M33fiv6kD+L6QA9 z$0BWww7xys5R=q;OlpD;$RXIpT)H)l(|dipmNv3jW-3Muh^Nu*K*S|}9puAZ%QRV= zHuOB9s(FOa!d$_R8Q8bfx?0qa{E|YicKiKr{b%prX!x8C%|shqav0{8!E&ATPVT$( zUtp(ly~i9M4(<=-q@5NhR*y3RtL++WgÐ?d+>H)&|OSa*0h;C;wofrpTkq^P@_B z``p>(M>0DK~=rBD{oVLBgSx_`}4N`Z*EM3Bg0A3Oed#wHCP%-4j z?AK2elIpI+kDX(VnxKywWeg18J|h|#M%l!xzLRA47v5fdO?PNT5+f`tpmPw`$J^PK z$&vSY!8N=NF-2f(v-JS)3R+8JNO`=`W~*QX5C2!8k}unKrW?8K2Hhfx42<~?gx3pN zcNfiXP&l|4Mn2(ZWf^QaDh(l<9VpI72+aS2hRXl2uoK^hxzey4=;fra-u@+*dNl%J z`=NcCrQi363`@)^8+J$^V&w1y4=tupfGsFyQbUFQfF_SxHt>Ru&u{>D%H8r(@q8WG z(H7a^L9txq9N)@Gb68M7B8+lsOKI1LD_=eHK^5CQL46~oL~coOPgq2LcX4RzVSX49 z_(8)z*LuGO(d*+3vjLbrT0GAjb)-$MN1ak=EI}yXsT25Be>u~ zGV<5zpyh#1qLr<4ZF4A6{P`@4-Fh=4#rKNe=Bm7)nQ`~nD`1Gnga~?e zfzW=Qip7@)?xW+iy>4vj*MUx^sij0fLUu<2yAAM;D%lFsCbb?xA{l_}19jt$bF>2w z7^teXi|5)8=2~60%X1&^b}C?(0gn~6gdCzOG!$)+U+zVhjrcFSkQ59PFVS=+CSrJd z3d;GPjF+DW9^{RTgAl-_zi-}hdf!J!giFSEezglAjAGC(umV%;S#RiR|yhEc<+M!E~o8{X&h=rtCT zJ4GMnq8}Izl|qtP-S})XGA|Ni6^U&5X<7kY^+wMOhOFy+rTG#9%z~(uf&73!trT7(N7qxIyjZ<#peCvZ znI-DkgvPZPG4U}+&nVRMQgMUsK8gPN=0YAfr}nzR7V2KMyvyA#pn#H-d=od6d&S-Y`P@}m5pJ!C>s{0C!5F+?bt`8%qr_!o zVuuv0;I%tVoTk9i&r>ZEhf+3@_Ema<{mB;f?bx}YsO9u9iSg>GPLP{&R(dAhkZ^{n zKm2)~0D-@p4|xJ2Qum#ZD*@hd9`~xAz0%pX3c_Ljk&RUI-kTPbdzJ4ulMz8*O1>w& z+j94M89V=G3vrSh3e@yh%EEG~6IdGwh@fX>L{p9ufF%SPMJjPHv7N+6DRMM)L@tO^SWZ3Gz?u)$W06(pL?BXMXw3wCa5h3K zb7W(f9``w-gywhPm&L?pp=ilv?2CG_aXq!9K+z$%PGaS?HX^^{!MCa=*6)c_IZe56 zvmqtA+BAn>8+!=#SM^#gx-5>dO|KFygf<0Nc&hrl;>PMC5B}n2X=8_wsNXZW_|({3 zSUTa5vtXmLQPE^;)+sn(g5YUm*b*Cq)YtL8MfV0A3lq`&XkPJS^j4{@hvizFSx7x#su>&GvT zWz?>>(t7NO;IZsUvJz~JZvmVIDrLP|S2SzVo*6@O#94y(t=c-cNMbd*xBV$uEJt}K z)P!xarSj>M8o+ZNUQoU0Y`rO-ZCb=fvuPDE4@(B8&+rZ=t?@U^*c5V$pToL>IsK|_ zj#c#J-rJqv4}70IpLc_DpHi8L&Yiv2hpxMW#X%4Xc?G8tQy54L`D=O$@fYz&{X3rmp8b+&|t6S%4~&}>RM=qiTYWtbcVRt z(rmLJvmL;o9-5P~04&GQWKt8aL;zz^)~X8r_%hdp1TRqqRbRcwagiFy&9ziqQn9zD zrg=i&Ych?W0vHIxhODp0>Knd#PO!{6#zve^xs-U(TiBZyvX!>SB*+Y1moa5{$|6%^ z?hX$X;#ve3)w9-o?Z}|m7SCPigy;M$iCc$~bad_hN&@w2&0CVbGgC5V?CGH)%fr`x z0RqX|ZxhleB-|q`AmL0qjk5aFhDEXe5UpVxkI$&`&QMpyfN2bSIA0o%O7iN=67vnw z(gO2F7g7>W)&zz(R?^$|)|Z-5)NJ;Ci&V(`)m6my1_0qywZbkSao8liH*)|6QL$vC za98_K(waQrzU+Jn2L$1n_}-26Uc`J}-_`6I%i~(S?Rs7Y`+mxR-Z_d+P|_cCqQoaQ zsF0N!)vb?Vi%I9_q)RZZ*}h zF<)aFuJ*193o`7)77JX6qX=*1wj8I592O2G7gyTEMjF0JFsty>@kbbRseXaQ5znS6 zaX@v;mz|}pwLCErC!&C{p1_6SV9SW!&A#Cgb9TF{5~to#_i#<53-L}BqB_VBVH*Hmbe!8?+nQPL)ztW_hdZLyWLojR6yxHGou zURvLqZfRB`nX7H48dKN2Jua4LlA+VofaFH-v*>WyC1dKI(s@nJY}AWsym2dYiS z54C*kX`-5Ity8u56h?k6L(Nv8dx~Dqbag_?uXkf*uhVRd{$}-EyFn3c!-phW*_>zq zOojFu-qcPO-}ZG#dfME_+f#5<)fY&@BN(K~S|4s!_S_>5S@o^+zyOSlx~tV-S{*Xr z{eEBl)LH7?JLuchrT*Cfg;3Zz_I!|QIJqH%If_}5u!OIhKrOy6me66*VOp}=eGEvH z%tzE%Fww^HASn)wVT`WDEH}R2d&!V>8Y)}TkZhSw>}DzA_{{U;0}WXDlk*L9xufW= z$D5Ac_)m>Ycw#xc%RQgyWOWGPnp?}ya>S6NnKQt9gWcH{gYR?q$pZFtyM$DW9Snm^ z@mio~8<^T>nKm~mnO4r(xiegd8?kBCkI;PW& z9ibv`tzndm2d$7GGhAucKd|Z=gPgHo-r2gSzcKF-a^zUQ9^)2>V$vn6gsyJIJGH^j zNI(d;+hREV4)_w}6_NW&A%4JPnxbw!fMQ7NKwq!QtMSg1)x)w6$_#Ajk z|F903y|9<{!)k(;Upp;rkS(P{?$~ft;(Wkd&R=f0PU?ovpo4Sx;=4gKii zd0=x5fkCBhvsN{)<)bgp_(c@?l?94)@AF*xPjP5NzOo!azwj>h>~y?Pk&4n+7Ug#q zi82!{q{*mngYVvDuYZW^6aCoFpgt?gC9b%5l;L4{{N;F?i2x^ULVrLk1k=V038qWb zG-_@sVv=l9De5X%01j8Yeaqq4(cL0lg{@(AU1+kAFF)|o`Plw#5ELgK`=`E(UX6R< zpNVgM%4{15wE}Kh2#5pF?%wGS_G7)LsV|yO^8e)~@pUpLt#alo8?t4|m@e#r_6X{z zq)nvwM>+GywZ|52#;2CnCoCv^F?je_F7{Au1dN^r=q`0g2Up&ejKC*c%mbpW|0S_r z=%BwyEKVRZ$KP}m=l^mSCjE6QM5a3$qW^cSgXR$lF9@|DeS zfhiFmu^(jy;Z@j<;Y2*KYI$ZKU+blcnVmILkw_HS{Sq`pcNXm4Z-6Uv8W}D2=DCfx zsyB1P_WiZ)o9iUgdc8{phAK8HGFsDF)fs>NK($LGvIP@Hlro4Qu6GRtYt)f0VcRAi zTMTeokH>vP7;mlZ8{eT?|48nD;=9(177Z3hcoTY6dpb;^_UHv!)DTklzuEtt)4xGD z4&dL}2fm zMw(6$Wa{+C$jZPJ4ERHFy-X1NgR#*8*;xQ|OdQW38zU1FfRmN^FPcrl(ZI^wNWjL_ z3It&M?Lh!+^g_cuoBSTW1o1L{nfzN2GO!Z|nVXvZ+eFC`WUUI|_%r=wApZB@C4y%P z4Fq`M)c(n>y)b(JyW!vdm7EM6fAe`Si2(kV1P#ET7gzu9J2!U#I|`W@H~^TLe$SFN z_-hPg`s3!s#lLe3_?`7X4K8ByjCz{em;xBo%xwg0z~+Aoza6QW8#|hT|AGNuPR0M9 zn~DA9$o>0fV|&TP|M$)IJG}q19qTiU`10oE`S*850Mm0}U(`R(f9uT5FQno><6vcE z{8RpCDA88M#{7kI1-$$O{If*=+mkQAB=~nmq|A+9^6?Ud;=iy+rx%9uA8aD<-+bpY z+W1V+J~uLe(#XKv!4?3d2eQyJ0VvHJ9qm3aJd>TzqN#&{ote22nBLaGl#1&2I`R&- z#!g1hMDG9nw0{$yz<;8?e@>NZWb0Bo$R z%&Y(tz#k0=WMq2=T3;@J&0iWLBg@O#{x6LY_}u6Jr7?3n_rrf^FYf-=jurS^kpHk_ zWMqG-iGsWMt;}@A!a>ER6r{4+sP@{r9@h66HwpX>jU^FL=w!p7ve&i?{d!HxzFj=!@D1Tq5|5y{9z#x_-%1kdcBGK>o3~UZM?_Kgm2QJ(sttr7m5e4t`paF3^LgRty>ZaT(fg2j6^S75|zhwC3`J7`WPPUi#FC(UZmEw2u zMO+=llpLQE58&p05uPsw1IFh8fI&zA00b}?89aYJm*e@xpHBu+TN}rJSewu>(lG*9 z|1RgV(evM5i?RJ{F#vD#0UU# zvI2mtYyh3#)#^U}a(bkN!V&S5YR=nx;c1@M~nV@$J^}d*yPK zZ=PwN(hUWJfZ9gr*9eDZBLL;QLN5RvkO?UmB{h800&YI@e)6opI*ia_6;&BxolgH) zt^!tTVZlnvM=hwT4#gI3>%trE>*%6Gl>hWW!>w-L=ZgwwHF3>5pPozrIaVzF>m&FZ zG@MuoA}H{u29D528abR-kZnZJ4uET;hO#s`{<#huh!xnAlh9LyU_^Lm*ZTUv$M_v6 zEZCV=?GnahV;yZzeR(aeI?9!DF^I3}HIVplJ(Vpa-0$DNhoH&u210NKb4^a+wcexo z_7qZdj&=P+SVP8z?&S?4B+SzHDb0!en#KiTY>o2$u`~k%P0AHNa2eg(;ga}0fdyy$G_{LA6;A@Uo_5=ebmzch!sY(;FjYStS8|lZf*!m$~UOr{AL8xfKRI4 z$U;_+ofZHNj|ux*~C24^>)t+X$2b{#z&tq3XS|K2gMB*2BMkUr{@s**P{^} zgpc+x{Yeiogc@2M-->;?;iK1K>HlSmp9OlIj-N} zkT1QJ_?w9J2Q$heF~*w@71I*)yGKGF6b1Cne{xeq2-knjJ}~%V zYTr$2ra`F3JXeuxHtF#(a@EP$q0e>ZqYRtAKq044NIR;3XvEK5g6wz1NHa3A^I#Vl z$Q`}!She9#{E1SzsVkv~m9wUuH09z+bfjXGxMKIBaNcZ1Y%3>Gk$e%;nAHMf&g$+* zbw^4Y!!&%9o20#&TRxBTklU$Rp(Ui^DKOuyJraBe25Y7IM%xR> zg-%o>1bv*Fu4z#<8FPt8XtAa%LUbvJ-zz zK`;Hie>s^As$*wCzpK=JFyGOFno3eIHm;BExFb-clf9yLEZP~qL2{ABS*|Vi!s~m7 z-DxU}9EZlHkA;H)B;%oGOBsAZb!vCHn!5@#zT?DZzb|u_op9v{_lWKATg~-xo(j2# zg&#pn`m5uI={ID9m11vJ1u(f?k;Kn8f%hL+El6DKE>ikeja!JB^)$UAZA1(h?5Qjn zXjvJ{ZlyI(wlSSoVig{3OREVU@9;eua0t6FF<4kdW>%()IwqXPh6(H+GlNIm!6DSu zPFUq-jT*i2Vej`MY8TX~P{;S^+j;ksLp8${5Z@PFso}~m#eP%KIU(&89h<694ri;EpNhkM=dGcP#XST1=JAxZHls;=u-PRl&_sWylEPlh2GD$xXEbSUzi$@*rEzP9KGXvXFTDkktIZgM+ zpJmUM>V*lS1EkkEE4VI231z0u%a!cnBdSqR*OVNGh}~3PHx=a3Q)Bh4O%{gSRO8X( zL`~G{h5K18gp6D*wZ{)001jWLy-|cE9^?@blozZ(0g@3e*(-PUBkT)0g=FD6zzBoBHCI9I@SDk|}`mH66T53F|v8BQL5F(vP zUEfxuKFBV4YA3FWP{+;uInP1T`54*x`Rx++`nojaltm}6OxZX;AqA^tUcv|H4r&TX zXj4L=tes8BcjWF-sy8Nk#uH6C%DNp~4SEu3b4#|nwr<-Scu{>6(?!1ynAc<1O^ne> zk>KBkg&~N<*Mn48R?&nLC7dnydgnCfUSWehw3VoCJ4Y7YWauWgmUiSD9w3BpNe}Uf znUh^E-r$sa`4wQA*c{ok5Qyh!giz){?(o56DYbXs{Ty~~lz=46ulc~*q@|2MV1N=& zhBN5V{mQhUgjP*bvmA6!)#2(^HWE{rvhks7qGqu_nMl*Yf_%s#Gs_!;+ZsRv3U z8=GV2#ExUTAO4=#{~->FUr1gOfjqDIHc6CZh6InaN`Rtze=JI!aA;t^jgv6{?fn_? zc}k(>BuE@7mfXK;J&wm~g=;=&rGj3HfFz6S0uOI_gH<6$JEyW(d0A#Jln3rtV`ldq zyro348l2x7Y1hr3(^{}!Cp-SWiA?mlE4x+h}(UZiuy9*2}d@t-p^JJbfh`z#vr`7fsZ~U_U zq(CxG3l}B95>u3sG^6yy7|*3mr#2~1Q+_7Yw;(}wc(doQe%XAE;He_S?1wMl8q_W~ zgyIDE?TdICvt&KHh;!fFSSryD2r5;ImE=_@j+>krb8SYn?4ars;%OBh^JD9Z3{FNz zagz?|xTap%sblHB`L=U=F2r{?_dJ1Dr>1ThYF(rQ*r!%C-R%M2xMtNp@C9;M2FNvg z&m&)EFYae7pumI!9jLe|a(B~LdSViltMJu~1ut3%BYvS3&3>>i6QdqDDH`n_BMqKO z^n?CHsBK(37i#>y<~w7>zTy-o>#eZGqOO$UtJGc*HPfdZZdPBA zBvQP8cGzaZ!$kUaDjyw@sD*J_Te7Dtvu!dHDLpj{tjm&h3XHM4}o}XBxGrUtjsqHqm`L;(<|=y)w@k z73bRvn)SibNqzio?Lx5O*|0{qU8s^y3Mqi`{T=PtD~4h`_0hf zT!-1*Av&O&B`fwWE3Qj_&TeTk-t^AO(=FZCD}5 z@j-FN+e$yMrX!&f^%afvnAlRF;3J|>Tn{Z>N&ImAML29t?V^|pyv02byA@xt!a9p9 zPy_ew-;6IYIn?g&-Uo^kz}tq1Nsn02bf$!_?_V_Abb?O3`m8r5B- z*!te@hgc@xD$i_*qW8JRk1*?7Iw?AT;Goq*&u2MnCBfTZZp$p8u;r383(n8~! z=N-E@xBZk5ZS9CWRuKkX$G!}r9+t!XKc_D4yrz=06@(?St*1rJD5x-UC@c8capTqx zF?Vu}V4R#rh9VU=;sc1_hcyoX#N-*ra5xF+IliCIUbFNsm=n@g7(M{{hF1ct6NV2g z?U4(43s7fX!Smg*?eDQM4k<96pe!@BQrfj?6@Df!Tr|h3#^ocWOj>T!s1po9y~)$cTIUO@jbM zQW!OaswOOHmCkEw+Aq8q9zpQbR;S*Cd+_hT6HTjo))Q_;7I=%eSRV+-?0pMBu1rk+ z<^a_`$=3l*_0pJjen7gRNOWe6BKH&SEHUe&D1n~g{*Q44us>;#i^_yeK6I47PfHWx z-e@2>{7PxgpGcyN#LwccvJ2EQ3lmghM36tbY+#BIrO;^K10LWtwt6$f2y@N>Ie+x} z-tqLHN6+prR#a0dpwxjfz3+4!Nk1rx>{b>4>1>vNVymWZhrExEY?9cL&^4~&zNlWJ z?3NtBAqBQ07Ff)8Nvhr=m$3M}aiIX5&hea+X1aX#AK*Khq5N^d8 zON5TPpH@Sw*!r2-{DCLyyFlwM-Y>V0yD}&aXb};Vph6sH#nFN(D4X>CbcgKCZ8Fg= z8J3OOUttV|-9L$Q;wb}f53H=-WAN7G%u8_R1l{?;4y|HhinY9L%8L(1)Lder--N?q zHOz->nSIzW|DM@V_rrw1Ka_yK%V-qXn7_b-U1(ZvElx4uMqX$EIlOwXFPD=B8|P3v zl@@TLikQ%hl(XQb8=jn@QlE)l+(N}h{E9OF{WsnsRd>+5%Spr1T$b8vXEKAKpLv4T ze)6Pni8b8Y1@NmAiHjkNgvyVOcj0AP6HDohu%XTb7e5#}q7IkXv`7Kx)6iNLfr~YX z{@ZWMhQ@S^34bLO=BDfyoJH)_eh%03nDCnUnbtCKCWfBDg;4G)7iIhIyU_k1JGZtT z!jBM?4}Iq|{1QeSI?SJ;JiaZWSaeG$Bx|)^0#JKWNFqEL@SJqk^9Rhu5-Mg}-yr;K zZQW%Y6C)NyHEQ-c<*hE2C-3ca_2f4*C$Lv73ZU3-gXmD`VK{4*+Z)QhLS`nZtylz- z3^>UB^aFya>6a1=i7!95*C>_KwUZIv{>XulOc~>G3_dio3D~-zAR`20*7;9#U=by- zMklC!GGPCjOcaE5c+2-~F{;@||LJ~hr%!vrRNOstRIAVThH1VwipwLJ8@xzT&rquE z>eM{f`ZoJz+lW@kWzZ-(X zd+B@;Ztbx~$Gi7u_9Z5t$Xc)@f5iyTsxWTCv?P5c1R2KF-M{HT*E;1+(in-Mo%+$+ z(xn)OYX? zNLladE~Gygk646FkvZ?@MiGy~RndgGNsWsZE3S+61n|h#o(dm@6|+KFI$NG5hD$iF zl-dG=f)+Y|a$OCZ#53&d$hfBGa{ra9NNXyFRO#B}_397lNnI&rHgRs{>AV=y(ONdd zMO7?k6sdOisjMBbucB#G+wMXQA4pJ;p@2`~J1t z-3RJx?(ka_-ATfj@hpjAts^9Aa-kR5r~+DIbwCJvOm{lqoP$2XM3~}8Yw!5Vn@ zHp--NXmpW?>G;@vVH7eQdif3fRQiN@K(w-NSaMdHBu8}R4{0zDSWqAUcLH+qvd~jn z$Vtz0g+3s`D~WoS?#v68ijfTILZzd!GqPlSX{V!c1{3MHpF*ey3PteptYxf%IN$eS zPcD);_Bi;19aDe7*tg4GFj-xqkXRSs6Yy(7_-V}%d@k;^Ci8JvNFxZLtU|#AExkz# zu~V(#NrCR8Y1xu!l>&Hp?rdH6S4p~juZdE994EGmC`~&t}_r(oe*7Hd^iUu1bQn+ynKyPGoW?ufn=n_lp`0p=^dL=M33fiv6kD+L6QA9 z$0BWww7xys5R=q;OlpD;$RXIpT)H)l(|dipmNv3jW-3Muh^Nu*K*S|}9puAZ%QRV= zHuOB9s(FOa!d$_R8Q8bfx?0qa{E|YicKiKr{b%prX!x8C%|shqav0{8!E&ATPVT$( zUtp(ly~i9M4(<=-q@5NhR*y3RtL++WgÐ?d+>H)&|OSa*0h;C;wofrpTkq^P@_B z``p>(M>0DK~=rBD{oVLBgSx_`}4N`Z*EM3Bg0A3Oed#wHCP%-4j z?AK2elIpI+kDX(VnxKywWeg18J|h|#M%l!xzLRA47v5fdO?PNT5+f`tpmPw`$J^PK z$&vSY!8N=NF-2f(v-JS)3R+8JNO`=`W~*QX5C2!8k}unKrW?8K2Hhfx42<~?gx3pN zcNfiXP&l|4Mn2(ZWf^QaDh(l<9VpI72+aS2hRXl2uoK^hxzey4=;fra-u@+*dNl%J z`=NcCrQi363`@)^8+J$^V&w1y4=tupfGsFyQbUFQfF_SxHt>Ru&u{>D%H8r(@q8WG z(H7a^L9txq9N)@Gb68M7B8+lsOKI1LD_=eHK^5CQL46~oL~coOPgq2LcX4RzVSX49 z_(8)z*LuGO(d*+3vjLbrT0GAjb)-$MN1ak=EI}yXsT25Be>u~ zGV<5zpyh#1qLr<4ZF4A6{P`@4-Fh=4#rKNe=Bm7)nQ`~nD`1Gnga~?e zfzW=Qip7@)?xW+iy>4vj*MUx^sij0fLUu<2yAAM;D%lFsCbb?xA{l_}19jt$bF>2w z7^teXi|5)8=2~60%X1&^b}C?(0gn~6gdCzOG!$)+U+zVhjrcFSkQ59PFVS=+CSrJd z3d;GPjF+DW9^{RTgAl-_zi-}hdf!J!giFSEezglAjAGC(umV%;S#RiR|yhEc<+M!E~o8{X&h=rtCT zJ4GMnq8}Izl|qtP-S})XGA|Ni6^U&5X<7kY^+wMOhOFy+rTG#9%z~(uf&73!trT7(N7qxIyjZ<#peCvZ znI-DkgvPZPG4U}+&nVRMQgMUsK8gPN=0YAfr}nzR7V2KMyvyA#pn#H-d=od6d&S-Y`P@}m5pJ!C>s{0C!5F+?bt`8%qr_!o zVuuv0;I%tVoTk9i&r>ZEhf+3@_Ema<{mB;f?bx}YsO9u9iSg>GPLP{&R(dAhkZ^{n zKm2)~0D-@p4|xJ2Qum#ZD*@hd9`~xAz0%pX3c_Ljk&RUI-kTPbdzJ4ulMz8*O1>w& z+j94M89V=G3vrSh3e@yh%EEG~6IdGwh@fX>L{p9ufF%SPMJjPHv7N+6DRMM)L@tO^SWZ3Gz?u)$W06(pL?BXMXw3wCa5h3K zb7W(f9``w-gywhPm&L?pp=ilv?2CG_aXq!9K+z$%PGaS?HX^^{!MCa=*6)c_IZe56 zvmqtA+BAn>8+!=#SM^#gx-5>dO|KFygf<0Nc&hrl;>PMC5B}n2X=8_wsNXZW_|({3 zSUTa5vtXmLQPE^;)+sn(g5YUm*b*Cq)YtL8MfV0A3lq`&XkPJS^j4{@hvizFSx7x#su>&GvT zWz?>>(t7NO;IZsUvJz~JZvmVIDrLP|S2SzVo*6@O#94y(t=c-cNMbd*xBV$uEJt}K z)P!xarSj>M8o+ZNUQoU0Y`rO-ZCb=fvuPDE4@(B8&+rZ=t?@U^*c5V$pToL>IsK|_ zj#c#J-rJqv4}70IpLc_DpHi8L&Yiv2hpxMW#X%4Xc?G8tQy54L`D=O$@fYz&{X3rmp8b+&|t6S%4~&}>RM=qiTYWtbcVRt z(rmLJvmL;o9-5P~04&GQWKt8aL;zz^)~X8r_%hdp1TRqqRbRcwagiFy&9ziqQn9zD zrg=i&Ych?W0vHIxhODp0>Knd#PO!{6#zve^xs-U(TiBZyvX!>SB*+Y1moa5{$|6%^ z?hX$X;#ve3)w9-o?Z}|m7SCPigy;M$iCc$~bad_hN&@w2&0CVbGgC5V?CGH)%fr`x z0RqX|ZxhleB-|q`AmL0qjk5aFhDEXe5UpVxkI$&`&QMpyfN2bSIA0o%O7iN=67vnw z(gO2F7g7>W)&zz(R?^$|)|Z-5)NJ;Ci&V(`)m6my1_0qywZbkSao8liH*)|6QL$vC za98_K(waQrzU+Jn2L$1n_}-26Uc`J}-_`6I%i~(S?Rs7Y`+mxR-Z_d+P|_cCqQoaQ zsF0N!)vb?Vi%I9_q)RZZ*}h zF<)aFuJ*193o`7)77JX6qX=*1wj8I592O2G7gyTEMjF0JFsty>@kbbRseXaQ5znS6 zaX@v;mz|}pwLCErC!&C{p1_6SV9SW!&A#Cgb9TF{5~to#_i#<53-L}BqB_VBVH*Hmbe!8?+nQPL)ztW_hdZLyWLojR6yxHGou zURvLqZfRB`nX7H48dKN2Jua4LlA+VofaFH-v*>WyC1dKI(s@nJY}AWsym2dYiS z54C*kX`-5Ity8u56h?k6L(Nv8dx~Dqbag_?uXkf*uhVRd{$}-EyFn3c!-phW*_>zq zOojFu-qcPO-}ZG#dfME_+f#5<)fY&@BN(K~S|4s!_S_>5S@o^+zyOSlx~tV-S{*Xr z{eEBl)LH7?JLuchrT*Cfg;3Zz_I!|QIJqH%If_}5u!OIhKrOy6me66*VOp}=eGEvH z%tzE%Fww^HASn)wVT`WDEH}R2d&!V>8Y)}TkZhSw>}DzA_{{U;0}WXDlk*L9xufW= z$D5Ac_)m>Ycw#xc%RQgyWOWGPnp?}ya>S6NnKQt9gWcH{gYR?q$pZFtyM$DW9Snm^ z@mio~8<^T>nKm~mnO4r(xiegd8?kBCkI;PW& z9ibv`tzndm2d$7GGhAucKd|Z=gPgHo-r2gSzcKF-a^zUQ9^)2>V$vn6gsyJIJGH^j zNI(d;+hREV4)_w}6_NW&A%4JPnxbw!fMQ7NKwq!QtMSg1)x)w6$_#Ajk z|F903y|9<{!)k(;Upp;rkS(P{?$~ft;(Wkd&R=f0PU?ovpo4Sx;=4gKii zd0=x5fkCBhvsN{)<)bgp_(c@?l?94)@AF*xPjP5NzOo!azwj>h>~y?Pk&4n+7Ug#q zi82!{q{*mngYVvDuYZW^6aCoFpgt?gC9b%5l;L4{{N;F?i2x^ULVrLk1k=V038qWb zG-_@sVv=l9De5X%01j8Yeaqq4(cL0lg{@(AU1+kAFF)|o`Plw#5ELgK`=`E(UX6R< zpNVgM%4{15wE}Kh2#5pF?%wGS_G7)LsV|yO^8e)~@pUpLt#alo8?t4|m@e#r_6X{z zq)nvwM>+GywZ|52#;2CnCoCv^F?je_F7{Au1dN^r=q`0g2Up&ejKC*c%mbpW|0S_r z=%BwyEKVRZ$KP}m=l^mSCjE6QM5a3$qW^cSgXR$lF9@|DeS zfhiFmu^(jy;Z@j<;Y2*KYI$ZKU+blcnVmILkw_HS{Sq`pcNXm4Z-6Uv8W}D2=DCfx zsyB1P_WiZ)o9iUgdc8{phAK8HGFsDF)fs>NK($LGvIP@Hlro4Qu6GRtYt)f0VcRAi zTMTeokH>vP7;mlZ8{eT?|48nD;=9(177Z3hcoTY6dpb;^_UHv!)DTklzuEtt)4xGD z4&dL}2fm zMw(6$Wa{+C$jZPJ4ERHFy-X1NgR#*8*;xQ|OdQW38zU1FfRmN^FPcrl(ZI^wNWjL_ z3It&M?Lh!+^g_cuoBSTW1o1L{nfzN2GO!Z|nVXvZ+eFC`WUUI|_%r=wApZB@C4y%P z4Fq`M)c(n>y)b(JyW!vdm7EM6fAe`Si2(kV1P#ET7gzu9J2!U#I|`W@H~^TLe$SFN z_-hPg`s3!s#lLe3_?`7X4K8ByjCz{em;xBo%xwg0z~+Aoza6QW8#|hT|AGNuPR0M9 zn~DA9$o>0fV|&TP|M$)IJG}q19qTiU`10oE`S*850Mm0}U(`R(f9uT5FQno><6vcE z{8RpCDA88M#{7kI1-$$O{If*=+mkQAB=~nmq|A+9^6?Ud;=iy+rx%9uA8aD<-+bpY z+W1V+J~uLe(#XKv!4?3d2eQyJ0VvHJ9qm3aJd>TzqN#&{ote22nBLaGl#1&2I`R&- z#!g1hMDG9nw0{$yz<;8?e@>NZWb0Bo$R z%&Y(tz#k0=WMq2=T3;@J&0iWLBg@O#{x6LY_}u6Jr7?3n_rrf^FYf-=jurS^kpHk_ zWMqG-iGsWMt;}@A!a>ER6r{4+sP@{r9@h66HwpX>jU^FL=w!p7ve&i?{d!HxzFj=!@D1Tq5|5y{9z$ {\bfseries vp}\label{structdynet_1_1AdagradTrainer_acec2f473f86ca026818ae76c8b3172cc} + +\item +\hypertarget{structdynet_1_1AdagradTrainer_a4198955558c37a432400f163aada58f6}{}std\+::vector$<$ Shadow\+Lookup\+Parameters $>$ {\bfseries vlp}\label{structdynet_1_1AdagradTrainer_a4198955558c37a432400f163aada58f6} + +\end{DoxyCompactItemize} +\subsection*{Friends} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1AdagradTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c}{}class {\bfseries boost\+::serialization\+::access}\label{structdynet_1_1AdagradTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c} + +\end{DoxyCompactItemize} +\subsection*{Additional Inherited Members} + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +/home/paul/dev/dynet/dynet/training.\+h\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/structdynet_1_1AdagradTrainer__coll__graph.md5 b/doc/doxygen/latex/structdynet_1_1AdagradTrainer__coll__graph.md5 new file mode 100644 index 000000000..c6cf8d2d6 --- /dev/null +++ b/doc/doxygen/latex/structdynet_1_1AdagradTrainer__coll__graph.md5 @@ -0,0 +1 @@ +ba3b065a0de7d092bcc588de7b5b839c \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1AdagradTrainer__coll__graph.pdf b/doc/doxygen/latex/structdynet_1_1AdagradTrainer__coll__graph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0106e8a17211fe07057dd2d36e45437ba531817e GIT binary patch literal 11929 zcmb8V1ymf{68DR{yE8Zh9boX_PH+egK?WEgxO;+2kl+$DxCVkt(BKx_9RdV*e~_GW z@45GW>%H%Fv$|(jSM9y)U)8gQwSIIelG3a|HV_J3&3^eU3KxI_U}s{5A|wQ0e+9O+ zaJB?+Kbh1}0002HG{nXk?D%xIF?I$^f=%trz$n7PC{E6fVB@za?&*1|iVCnmtd^0A z=c?-qbFskph%R<{A#1K$dHDM9$IF6{#(nBSS!BVKq)#3mrza>RrzD=~WyrU@ z9272!caZq8waRu3S@^WV?}vhJW4?<9Ts??bY{`ejiOg(NHe$F-S#-{F{1bCo6HMyE z*=NA^=69dfLHkeq zZqH^Q{#UTFB@n?a1l?c4!+PbLlk zke>?x1n~e2etSzit@-5c1bA+wKV2i^Xy;=8kA3`^|F`w;MAV;Fbu_khvVUI7)Z=fn z9KhMp<@YY0vz2)Ak_5X#Ou=e0;?FLBrKtvXvU71X1v>$rB~$xHR=iK+|7vEwe{Jjk z)XdMz{ONk&Q%*px-zohua02+a`2T6(0)V(d|Iz;Yo|+o^^R=v4fO_0?yo09$jzJb0 z9#2hFRoni(ggq(_cfBB72%ufuo}nIY8fzoA<#6`)m)F6q$Khd3U2%nP z_MNV?Mry^(=hAc*(Gw*sB2q%Z0uE8~UzV#|Hz-J|;Bkc6dgzSzcb3l10&kLGe~M^x z3%tad!2bn@{h*bBh6fk;65i}xWq~uf9~s$Hlt`LX@j>u^aKP`-)Qv3#l@jeEBt^^Ix);M2ryZXA#Lgt zV%2)Z(!=`^qhn^Be)WT}J4U@V}tA%cd@=jk!7f)Y+ia~|ifItS0yOg8uKlY-f2NY0!kPF>*}1E4qxNqeVnm&5$1x!KtK@n>)lDxqfmsVx0UM1sVo z{7gUqG?WWCBBv^m8r-()+so;=zBt6vbO45-UqJ~hxfm1%F@R|IEQEo7mhX{1FYl8O z^pcG}OfwXZt(Y(rApVDRJcdu{e za~{8ld+;KLh)f6!uZbjK_lIdcxTbfwD0*59aE;70vINwyEr(ItxS`bT{aofS9fkr!NWpbxho9utH58eeAC;IPRLHQAtSnR;^c|{$ zgCh)I=>xhWG@s}rf(H~C&m%&nbGx5JdBK+$zX0V^(MR+XSiU!Y5(f<63Xv6&@H*!J z@l3R{kdRD)Q+6A4Ur$&-3_~x@{`S0S{RHLw#q`|c?!X#?2m z;eOlPUariX)&wS=An(3oGdKz54DlilRjcI%r;;O7GFhLFlj@%60%%g-((R#5p>`if zO#h?~t z@#6)!3Y4bL4zmvo-rGm7CEmOF!`ZO~EZTKWRozb8_3bNP?EY}d+i)#R+;GDo;B*yN zhcRIu{(R-f_6AOfbnAXhzk98z?t8B3)P*WbdQ}xv=gHgt6*CvSK)NYHq6bYkda=A> z&xOPMxOb9$9L+cGoh~WPA~iSEXC>uDmEB0hBJVxzq$p-PQS(nw%L8XlZtkyz<$;q3 zrFL4n%faN~-=@fzhbnMO`8Bv|V&$i(fyjn6KA-@?TMh@lz*e<4GX;zfF5=J;r$|HV zJ?yY==W#X*A25u*vl4}3^dKt2>?AQA>QYd}X9ch}v_bMLIuA04`0s|{X|ksX^>2yJ z9anUnb>}-g_Tt`!39=Yjx8AR-k*dDTZ>BW~h7CnOe-KW4sX3!bL0?NtJdZUl!^JotU9TgX+R~a|_py zX)B9;-${)XZWAdyMX30)ESn8hnKYWy=@ef2 z)&yS=Wh+ufm%|&^pHV{TrBjAGezMpR^-_;9`|@xArSS6z=1 zBZlxeIjVwe$`L7CU;2D^nNX+-$pSNd!l4RaE`54ZzQ@hh%97Gu7@YA^9XB%586cmP zMb_0mR5`zzDIje&+zkd>!BU?UkZ%^#M_Hw|R^w6|Yrt7W4*e=4kk9(ia4czvXDsL; zgbC+G3mXVwbGnW60|vpIIKxi)U_nenZFp!b4A=lc}Yhh#G08T!1S=aWMgub-)eh- zSus3{WTc&>|Cm~Z_^ZqG*a6M;YX`qu$ z{4zTBVU~%ev*zQJ9>nNah4WU(kI;v2H4vw7+PHBV&q%1QC(}uo$g0@2D~#-%!=J$L zWWTOqHnaL0CSPht8!f!b8h)$}j;g+&T;9eZ4kn&x{zvc>eOkP{;>A)ex#gg5`v@$YhJPV1Q~ZMb3*cr?i|(Q+7{E?MEzI zI=21o!(`}3u5SAXYkZ0P2l0E-N2W1``nu#r%kN!Goie?bUgwv@Kd;(l`7@V>rTr$p zn8vDg_)4)tf;D?rlB0|mKVI-VG0F%K?Gl6t+{D(~xkSE(EM9IWIr`G{N;@==l@9?N z-HSaa*HAyuhFg4h#Y?IHVmmtg7LxTclWw3sqxL881?j~UsY z1}{ETLmA7VCBQMyyUuWhq&VJxwoK!jaC&lkW%5NMs_(lj7NsZq`sHo`lwRIS-&piH zAUa8~1$Q304O`dML(aQ@*ul`5-$7~~C?#OF+|+Klywd*xSC&=$*sDVAEsJ9F(Mx2a zo~)L*!S4ky#Ak}m6N9^2jiDlCJ)lD_`Gac{r+`zD$c2*b=GTXy#1F;2%{C&S;Cuz- zcqp0=W`sWKbWVyu1qAF};)2S2Iwp&uIK-=?VAfLpp6y;Zo{J7o;>=VZJw3fu$O8kTGEjDfK}S_4;K`}U58bwC7!yZ)T^bKk&!}= zN?6|ATir~+xAhG{UT?g$JLh;eNL*q~O3YTq-AQ zRpKn(NZ{nUKYStF@#Up8`h$B965oPr!osT9shGHpo4PjAPF#{nuGr81wqSoAWKOy{ ztt8kv>xxew?B-(djP{zpiLnTonctbsZV|2!T-tOU(z^Mk=KRVlKyDYa^lA*|*5vH& znIZRdNG+4qeV^C)9f*^{Y>vgpmZi?#Sh5`ChCyP?bXdRN(dkdfezmVN+qAnqo7lV) za9g_rD;lTb<>%yl;ZA|QQfiq>OYBjD=Cx3EnQmA6eK(q?cBd@2EGTF8Vgpm{ov-Aa zG|HfXcgrzr*SLI(szuEY9*7&7CbzUo+~fdVMRD-eS1SJR-nW*S5WTQog{$rJe56Zw zSmX18UHJLLOmif`NPY{oxU+KEUhWz;Gy%C_*^nRO5;2Z}f{B(=Cmq@zF{#HL5mk!Y z8#5_7CA7k8*|hwkdUs^#(Z>6#Os1#Ij@9c2LD(C@y~nRs8?UFzTj|JePRE>K)pREU zAPt`VvQQ6qY6fVDVumBFhrvS3Seqy%b1x~Gxi4hjORi3lc5XBDt#-ktJyan$6`oY_mfXMj^Z~LsGkuy<5n-(zJf@_5(@j4pJk*`8q$XQX8 z+;WK5x$3Di+!z@7B)o1Bgt*0f)r#&=N#-!t3_i5=IhURkDrOKc<80oCkr`MqvqVue z`WzVxz;f_84thl1{fx)1eWG&cx6#H@!pVvIv;7OfJvE56frDVzrxWXWmg zeOuJjA^AX#@rD(u{m3O{-nkVUM{@~IbZC5ijuB7*j`i=P4yCgMh9Nd8}&0r9rVod~@kNeJ7ak0hp^fr59vV*^@a| z+v1$-K%X^I$MHL5+bq)d+oVg)5>oilcsn@Gh&z%Aj(gMO3CVf%);7)s=8!58Uc65G zLV-hN!gxPaoftpmy(4OxJ1P7w2zUj_6EDY%zA410@cwb>L%THOr8G9~_+p-7oRh^h zVT5?B;LW-XjO@Lue>Qs*XhO)v^yoXaxaVM-Vapc z2UoQJXdD#esVA&L9}=P~Ex8RP_;4^q<(;DbQZudIYV`&8j6yaSG#$v2Q;6%31XGw{ zd4?JlxXb&~(oQ~v(4Lm@=NX6l#fa;L(y{wAz7hOS-%kyaIR4fs2dJZirBxdamFK_= zJVz(#ozb1J-tMYo3OtdHq!nLmh@Sin(uMb=*#x8C;Jd7(R$r3 zJ(0taA!6`TIO))Br)iFKJjmmfxhTG^4`P|_ButfJvhQr%VH6_hEyJ$wwF~bu@~tgrA%A}L(hBo-7YR1Uf@_0FBa`M-%?XH^yAO~oIp6cZ=0F4#7oM8i21rebb;v9 zb5)UvC9M@zkWb$yPh94J3-1?tnCyA7bGbQrAwu#Xw<`6nV65v@Y98+&6-}v0O$BA~ zJ&ToEM%g$1p}P(Bjn@?4?x5t-1Uk2aLm(LZ48$G1DX%A5q-4-?^y)5np*c_ktP7_i z3^BJ|R#fKC^R};f0LP^&Z>F$Z6s=va6x0~&u95jJZ|dgscs@eh zn!Za>R9)Lqq}<*&k9L77z=Gz= zLu`!X>lWM^vY-}jeMeWyWYr*nt&E5yV*&FCmDKr7JLZk%a4^U0^!H4^V!VDL6uY&& zQM%d^wtN9mtQPj@Q=#KJ2M1IKvPY_AFb2#MnK*&yaH(jZZ`!>YL<~9G3v_QLGAIJ* zt&rv_my%uy%Pdp%5v=Q@5fea@OR}d;56sqgU>hu0Dozq%yY{abSWqh-ij?RewP||R zm&Wi5Ik(y`-pv{)O;nVS3;h(CVJxSCDpfuS6ESJj_0~}?N_fT2m}#9{ zbi2Mf@p|6caSayI^%H#qi-Nji!BVPmn^}&qKErA555rq0Pr(TGW#yPJKYS?i9Sawtwtv9Lqq zs8%m~6}&N`$0>fd_LXk!f{yz$cKITsaN1xL)-CgL6d8$GRJ+X2WZ*cakC$GqzFuQ1 z9W6clJFSezHhbK{a3vm2r%wb{^2}B7fmNO@K1s`>^)7rm2}_Daj%pJcU76|S*?cup zC-|?}-@Cr3c5esO_AhYP^y@Ckj#RRLTSv^oHj1qhju;sks(q8i5_vPME^E%T-?wl? zP+-?0z`_Wn=YUgJI3GBn+R?LgWs`CDiZ+(~+ znPGGb*-o1>@SidyS|GHpy;4I;2)V~k8;=m*d`0+ma-0;+2zEJ_by2Bn4pe*-XU0aE z&X~OpcZ(yf3c)`#&c>viI))+%j080g2P~s_Ulc);t4ex%=Z@w z<~@+EM70Z4b_6q}hJ*QD%Y3Xww;!hRKc?1IKHF<&!dmPIVe>jqaj$-M?uo5D{Po%^ z2lQreK|j+D9syxz+|arev4Va~DhsznKke6Uuxrvk^)VsLhL5t(<3+>B9=sjy>+zktJqFXKDOq;MZ%#j-UN; zOnKp}73*eAKov@ABa#%OVpaWRG(|2Ay5+iQKiL^EHgbkGTu!5WXW$0j)358w@mAcl5~QlfiJ*+w^K%n~hS6la zma9VTGi-DDp#xg>5VQDMUja(H)>`76#Ke1VNpV>i-GsRkyEVyUB?NXpEB{SC*2d^> zGUAg_I)wW1LCL23QE5g#wM%#KL&p0FFB2CKi^0Gd{jh$w5GkO_Ds#eHym_SA@)XO6 z4_`0&`nmLsMJnkU)q0%ir;RLfRqn86DF9BYeM=yX5T*z8EYN_poO6V1#-zu+US zh47L-Bq*(uL^s6u*-a1Vd%aLe@ct6s6iwP}8E1^AMwkKmNqRu%HN3g7qJ&_v0A4G3qtC}(ae6hK^sPFHE!9nL= zXd8~S;_IG{%BCM;op7#ceEnD@vl!gC=p_a=h#)0Srq(XCUV6N5yJdMV^DTK4UbO#* z0*MhpcJil?z`h4XsnaHQkt^pfK*-XME?VzCcbiXC zOLlm3jVaFmw+^Bpy1pY+gF zWyov7n>u|}G4-e;nz&5=QG~~E-{OU6@n}995+4IwFdnovsOP?J-+<&@uetVi-gmiH zhblfMGC;u-R1-~nups-sb>bxL1Nl2)xbk|)IC#XaJrV3~*CEy*%!xl=`z@GcRC?nqfvBJK?;FBM%_b!q3} zw|hw6@I^5kfuxOMTNkqQk)tAo+V*0nN*Ng*$)xZcgdadP7vGOKK{E=(@9ZAwI?I^a z`TQsMAMV-Ntga=?k}Ye8nGfF~<uJr&|k(huZ{wE5O`NOxvjC*O7BjxZEa4CiZ?-owOP<*)bqtPotq9(PCa{KMI zypE@ze{mEj@Q0yY3d+aEtUqI{AZm0V7d$nLRPLqff zy(%To&&xP^t39$p=g#M3Q!i6m)4I+_=^u@mPv$sNJHhM8aSBE>&-7UV<-~>}mj#8S zNe`0D$Qa&-v4(6aCXFX@C;k*(J(L*{yHF7MwLtK(D$-#ETQJ3q>t5=I9e(|=9KvS*6ay2CoIVqQ| zQhMR_F%OCfUcW$t3G-g&p6oSp*ws|<@u7P3*E-(hgpCqXxdYf-vmdV|l6OLGe-J_( zSEc|*eIaeWTN6V=vBII@Y>?bL?J6~!y;$Utu&#l9Xq%Xw@lh~~x3~zqS1;4JY9(_C! zAD>-2pziqbk+_0QD7`Og%f~D0^^Xm1ZhA4caD{T&zT&*@m}A+#jeL-d?Z%j;U^z{H zUmi7dS6ZA=m2y5-J$UfkAiN;~i^g>}LUS15p$fXN!S~TQ{KF@F+>G?f^pinollQH~ z^F7ifiId_4Zv*UPK=Nz*ulf_Iq_c}bB(yh0qqb1WnYcZ^uHqZ%Is;15T&A0~x?DZ4 zL~5IsjX7G_EUD1#_EiF0$B(K%WElVZ#uo{ds{f-O2?70{0sE&gKmh zUqMcc@=>ajE_ zi~QZjm#0b*;YC-DPyY#T>s^SkeqLI8$eDjVQ6MPSr#tP^FL9}`z8==0ZO_l1cE)Wz z*%>XRI!1JAdW`;qdhZOqbwMRgY46iXsnO?MZUKZ7OyaTapV?y3w9a|tydu{q`Fa$t z!``{y?mv^C#LT^9nm?OV!G#rm@5} z*67o+mvC+_9Qgb~B=4y0e5#5@CEHK^lnevX?OX4Z5IUw-8tE%u(s8zk-FFk8v8h}O z_e%ejoR#_yvVwG|U-EvNX0Pw@Y9}Gxt&_#FNjj(j{QSD>y&ZC?*6m9kQL|M_FMIb5 zm{*f7-?y5TP?3ccVS6lDf0j>;f}qmMC0R}vZ?LM3jqYziU{WLuO02E&YbcG7CAc*j z$Fb@$6;S06{25QlUg^QZ!sx+&@|-t~19^D(c@0&X0e3J_mk1I?kCe)GOdE_%tGBCmy#I0zD8;xk zw8c9Z*wrAFTjr(2IxY$RoSTgm)AW*cq6{(x&zjEOFhbL1M>?!aNV(j=@zp#|{`w|1 zl#~j(HFm0a#HS}>Q#BS%`CGPMOk$t7BZQorll$I)VT}Bvx)-#>?UI?#CR;#I1`Oed z>il%3b>!@p{9LdGq)zdAkWGcK+cUvKS&_drd_vtp82i)PysYA@yat1AA#~4_@mF=1 z@4U)EWy2BIlY>yx4W-R&)%`=MO>%)`>-i5QV|%3+17s5=OwNN9xV1IcH83A`_BeLL z;~DL`dvrSHjx7<(plSzJmJo0wXtk0^ie$x00ATSQSDj}`P3(G!VG zISpGkg)d{*bRS4kV+>wL#kN0;D=JlU#>?~Dzh{hAsLcGG`P#@jPW7FR(>*GvAy| z-WXu>Zk4QlEsl7*@ur%YN-lp(=>x#FuN-FIT&70w~sZF-Uit+`_V%Qt8EiJ1q^KU89AqpdX!>!m;Oy<)Pq;>%S+9-d80 zuxf-7GHtXy;k$W#b#X*~aue8SQKW6t#qJkY9W;1Bna$f3O?u_cQh%b~j&^w>`_(q; za3V0&b&fsig&?(%oISs>mj+RUGYrS!CL)=k}9xL^%HQz&f z*dh^L!pK5&u-ZJX&l>))Q}v#$ViR`ZG-Bt=i^-X=$?n2wo0d66_{Jk4-5BQK_nNA$ zi*^MO&P0(63*Hw++e%tRq{Yl@|r&aDxF6cV>W z{`jga!#f1x_*qr$4D`bx;kF{>t57aMQ6I`EVm1TuCB}h^g+ndh9}kAxABYsoqles< z#1ifWUNXx${`#b%I`ZB=s3)TnNo>=z+j6GHZrV*_G*GdY@-TgXSwQ*MdCUv~J{2YIiVf_EgPywH@um3wD&_H#-Hh=@G`Ih-2nSz=EJxiWIEy0lQEc=JAziCBS zo(YR7#+}c!YrOo+wn#UNM6iB(NK$($RCkEcMkw^xFa7I{Hip#t_MC~DAV!+b{rDwE zf+&15ic8Rnkai2laQ4;bEs{Ho5Q`f9qj%7v#|QYHrVM=EnLYX>yxYF^(xh2tKA0$= z4_^2Oii1c}oRo-CKDZY&Pb{BNlSJWoLqBt$)aq`aB>S(x$RseP{$575=A-8sbD!hb z$qS+N{jkqqxiOTsx{(9CYBF+z2Jod%nyqt`X%s^l-;Km&@uf8 zWG$V?FA2crJWxx2p^wm;c+OO zSk=H5E`OYCj4hl1-2Vy?|HJUH0(rRstekux0FZ-|6TlDR`U~Zgb2hetn2On2*nj~X zzoW#QOrKG}Czs#D=S@71pM!rJB#iB4!4M0}f4itVgWtXe@cjvY9?1SZc;508f(HgX zLwf&&_MQR7|4sP!{OT?y&cETrXCZ*UP2$E*;NP6%|7+$DM<-_qOJhd>7w7M&SH^#h zft-J)`AG{Xu@$p*g8XgxJ&_i~%-PcEFB0Z@Be|>wKbz zpBfp!Xle{`v;zRyfZS}H0LCY@(O!W432S{aS~wcpTS82o*z6oFn3#UAqvB|1=3@Fp zBmdur{Tp`${u6Wl^Hxb1KefA^#hV z9~%(J1$@f<`2g7dW#i!B=6DkDzib@9r#}BL8yDYG{r|%T8@D|KZ2M z!OQg|>3`Us-e&IqUiZny`@eoX|A*M8y#9MWAQ#_L;s0|DAn2dDIXfCZz0r=p;c<0{ yC-_;bXQWom&hDxH|0aUvY|WqQ{M-Y-yUNMg*wOj7y1*xpm=lGLPD)uC<^KUn5`&`v literal 0 HcmV?d00001 diff --git a/doc/doxygen/latex/structdynet_1_1AdagradTrainer__inherit__graph.md5 b/doc/doxygen/latex/structdynet_1_1AdagradTrainer__inherit__graph.md5 new file mode 100644 index 000000000..c6cf8d2d6 --- /dev/null +++ b/doc/doxygen/latex/structdynet_1_1AdagradTrainer__inherit__graph.md5 @@ -0,0 +1 @@ +ba3b065a0de7d092bcc588de7b5b839c \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1AdagradTrainer__inherit__graph.pdf b/doc/doxygen/latex/structdynet_1_1AdagradTrainer__inherit__graph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0106e8a17211fe07057dd2d36e45437ba531817e GIT binary patch literal 11929 zcmb8V1ymf{68DR{yE8Zh9boX_PH+egK?WEgxO;+2kl+$DxCVkt(BKx_9RdV*e~_GW z@45GW>%H%Fv$|(jSM9y)U)8gQwSIIelG3a|HV_J3&3^eU3KxI_U}s{5A|wQ0e+9O+ zaJB?+Kbh1}0002HG{nXk?D%xIF?I$^f=%trz$n7PC{E6fVB@za?&*1|iVCnmtd^0A z=c?-qbFskph%R<{A#1K$dHDM9$IF6{#(nBSS!BVKq)#3mrza>RrzD=~WyrU@ z9272!caZq8waRu3S@^WV?}vhJW4?<9Ts??bY{`ejiOg(NHe$F-S#-{F{1bCo6HMyE z*=NA^=69dfLHkeq zZqH^Q{#UTFB@n?a1l?c4!+PbLlk zke>?x1n~e2etSzit@-5c1bA+wKV2i^Xy;=8kA3`^|F`w;MAV;Fbu_khvVUI7)Z=fn z9KhMp<@YY0vz2)Ak_5X#Ou=e0;?FLBrKtvXvU71X1v>$rB~$xHR=iK+|7vEwe{Jjk z)XdMz{ONk&Q%*px-zohua02+a`2T6(0)V(d|Iz;Yo|+o^^R=v4fO_0?yo09$jzJb0 z9#2hFRoni(ggq(_cfBB72%ufuo}nIY8fzoA<#6`)m)F6q$Khd3U2%nP z_MNV?Mry^(=hAc*(Gw*sB2q%Z0uE8~UzV#|Hz-J|;Bkc6dgzSzcb3l10&kLGe~M^x z3%tad!2bn@{h*bBh6fk;65i}xWq~uf9~s$Hlt`LX@j>u^aKP`-)Qv3#l@jeEBt^^Ix);M2ryZXA#Lgt zV%2)Z(!=`^qhn^Be)WT}J4U@V}tA%cd@=jk!7f)Y+ia~|ifItS0yOg8uKlY-f2NY0!kPF>*}1E4qxNqeVnm&5$1x!KtK@n>)lDxqfmsVx0UM1sVo z{7gUqG?WWCBBv^m8r-()+so;=zBt6vbO45-UqJ~hxfm1%F@R|IEQEo7mhX{1FYl8O z^pcG}OfwXZt(Y(rApVDRJcdu{e za~{8ld+;KLh)f6!uZbjK_lIdcxTbfwD0*59aE;70vINwyEr(ItxS`bT{aofS9fkr!NWpbxho9utH58eeAC;IPRLHQAtSnR;^c|{$ zgCh)I=>xhWG@s}rf(H~C&m%&nbGx5JdBK+$zX0V^(MR+XSiU!Y5(f<63Xv6&@H*!J z@l3R{kdRD)Q+6A4Ur$&-3_~x@{`S0S{RHLw#q`|c?!X#?2m z;eOlPUariX)&wS=An(3oGdKz54DlilRjcI%r;;O7GFhLFlj@%60%%g-((R#5p>`if zO#h?~t z@#6)!3Y4bL4zmvo-rGm7CEmOF!`ZO~EZTKWRozb8_3bNP?EY}d+i)#R+;GDo;B*yN zhcRIu{(R-f_6AOfbnAXhzk98z?t8B3)P*WbdQ}xv=gHgt6*CvSK)NYHq6bYkda=A> z&xOPMxOb9$9L+cGoh~WPA~iSEXC>uDmEB0hBJVxzq$p-PQS(nw%L8XlZtkyz<$;q3 zrFL4n%faN~-=@fzhbnMO`8Bv|V&$i(fyjn6KA-@?TMh@lz*e<4GX;zfF5=J;r$|HV zJ?yY==W#X*A25u*vl4}3^dKt2>?AQA>QYd}X9ch}v_bMLIuA04`0s|{X|ksX^>2yJ z9anUnb>}-g_Tt`!39=Yjx8AR-k*dDTZ>BW~h7CnOe-KW4sX3!bL0?NtJdZUl!^JotU9TgX+R~a|_py zX)B9;-${)XZWAdyMX30)ESn8hnKYWy=@ef2 z)&yS=Wh+ufm%|&^pHV{TrBjAGezMpR^-_;9`|@xArSS6z=1 zBZlxeIjVwe$`L7CU;2D^nNX+-$pSNd!l4RaE`54ZzQ@hh%97Gu7@YA^9XB%586cmP zMb_0mR5`zzDIje&+zkd>!BU?UkZ%^#M_Hw|R^w6|Yrt7W4*e=4kk9(ia4czvXDsL; zgbC+G3mXVwbGnW60|vpIIKxi)U_nenZFp!b4A=lc}Yhh#G08T!1S=aWMgub-)eh- zSus3{WTc&>|Cm~Z_^ZqG*a6M;YX`qu$ z{4zTBVU~%ev*zQJ9>nNah4WU(kI;v2H4vw7+PHBV&q%1QC(}uo$g0@2D~#-%!=J$L zWWTOqHnaL0CSPht8!f!b8h)$}j;g+&T;9eZ4kn&x{zvc>eOkP{;>A)ex#gg5`v@$YhJPV1Q~ZMb3*cr?i|(Q+7{E?MEzI zI=21o!(`}3u5SAXYkZ0P2l0E-N2W1``nu#r%kN!Goie?bUgwv@Kd;(l`7@V>rTr$p zn8vDg_)4)tf;D?rlB0|mKVI-VG0F%K?Gl6t+{D(~xkSE(EM9IWIr`G{N;@==l@9?N z-HSaa*HAyuhFg4h#Y?IHVmmtg7LxTclWw3sqxL881?j~UsY z1}{ETLmA7VCBQMyyUuWhq&VJxwoK!jaC&lkW%5NMs_(lj7NsZq`sHo`lwRIS-&piH zAUa8~1$Q304O`dML(aQ@*ul`5-$7~~C?#OF+|+Klywd*xSC&=$*sDVAEsJ9F(Mx2a zo~)L*!S4ky#Ak}m6N9^2jiDlCJ)lD_`Gac{r+`zD$c2*b=GTXy#1F;2%{C&S;Cuz- zcqp0=W`sWKbWVyu1qAF};)2S2Iwp&uIK-=?VAfLpp6y;Zo{J7o;>=VZJw3fu$O8kTGEjDfK}S_4;K`}U58bwC7!yZ)T^bKk&!}= zN?6|ATir~+xAhG{UT?g$JLh;eNL*q~O3YTq-AQ zRpKn(NZ{nUKYStF@#Up8`h$B965oPr!osT9shGHpo4PjAPF#{nuGr81wqSoAWKOy{ ztt8kv>xxew?B-(djP{zpiLnTonctbsZV|2!T-tOU(z^Mk=KRVlKyDYa^lA*|*5vH& znIZRdNG+4qeV^C)9f*^{Y>vgpmZi?#Sh5`ChCyP?bXdRN(dkdfezmVN+qAnqo7lV) za9g_rD;lTb<>%yl;ZA|QQfiq>OYBjD=Cx3EnQmA6eK(q?cBd@2EGTF8Vgpm{ov-Aa zG|HfXcgrzr*SLI(szuEY9*7&7CbzUo+~fdVMRD-eS1SJR-nW*S5WTQog{$rJe56Zw zSmX18UHJLLOmif`NPY{oxU+KEUhWz;Gy%C_*^nRO5;2Z}f{B(=Cmq@zF{#HL5mk!Y z8#5_7CA7k8*|hwkdUs^#(Z>6#Os1#Ij@9c2LD(C@y~nRs8?UFzTj|JePRE>K)pREU zAPt`VvQQ6qY6fVDVumBFhrvS3Seqy%b1x~Gxi4hjORi3lc5XBDt#-ktJyan$6`oY_mfXMj^Z~LsGkuy<5n-(zJf@_5(@j4pJk*`8q$XQX8 z+;WK5x$3Di+!z@7B)o1Bgt*0f)r#&=N#-!t3_i5=IhURkDrOKc<80oCkr`MqvqVue z`WzVxz;f_84thl1{fx)1eWG&cx6#H@!pVvIv;7OfJvE56frDVzrxWXWmg zeOuJjA^AX#@rD(u{m3O{-nkVUM{@~IbZC5ijuB7*j`i=P4yCgMh9Nd8}&0r9rVod~@kNeJ7ak0hp^fr59vV*^@a| z+v1$-K%X^I$MHL5+bq)d+oVg)5>oilcsn@Gh&z%Aj(gMO3CVf%);7)s=8!58Uc65G zLV-hN!gxPaoftpmy(4OxJ1P7w2zUj_6EDY%zA410@cwb>L%THOr8G9~_+p-7oRh^h zVT5?B;LW-XjO@Lue>Qs*XhO)v^yoXaxaVM-Vapc z2UoQJXdD#esVA&L9}=P~Ex8RP_;4^q<(;DbQZudIYV`&8j6yaSG#$v2Q;6%31XGw{ zd4?JlxXb&~(oQ~v(4Lm@=NX6l#fa;L(y{wAz7hOS-%kyaIR4fs2dJZirBxdamFK_= zJVz(#ozb1J-tMYo3OtdHq!nLmh@Sin(uMb=*#x8C;Jd7(R$r3 zJ(0taA!6`TIO))Br)iFKJjmmfxhTG^4`P|_ButfJvhQr%VH6_hEyJ$wwF~bu@~tgrA%A}L(hBo-7YR1Uf@_0FBa`M-%?XH^yAO~oIp6cZ=0F4#7oM8i21rebb;v9 zb5)UvC9M@zkWb$yPh94J3-1?tnCyA7bGbQrAwu#Xw<`6nV65v@Y98+&6-}v0O$BA~ zJ&ToEM%g$1p}P(Bjn@?4?x5t-1Uk2aLm(LZ48$G1DX%A5q-4-?^y)5np*c_ktP7_i z3^BJ|R#fKC^R};f0LP^&Z>F$Z6s=va6x0~&u95jJZ|dgscs@eh zn!Za>R9)Lqq}<*&k9L77z=Gz= zLu`!X>lWM^vY-}jeMeWyWYr*nt&E5yV*&FCmDKr7JLZk%a4^U0^!H4^V!VDL6uY&& zQM%d^wtN9mtQPj@Q=#KJ2M1IKvPY_AFb2#MnK*&yaH(jZZ`!>YL<~9G3v_QLGAIJ* zt&rv_my%uy%Pdp%5v=Q@5fea@OR}d;56sqgU>hu0Dozq%yY{abSWqh-ij?RewP||R zm&Wi5Ik(y`-pv{)O;nVS3;h(CVJxSCDpfuS6ESJj_0~}?N_fT2m}#9{ zbi2Mf@p|6caSayI^%H#qi-Nji!BVPmn^}&qKErA555rq0Pr(TGW#yPJKYS?i9Sawtwtv9Lqq zs8%m~6}&N`$0>fd_LXk!f{yz$cKITsaN1xL)-CgL6d8$GRJ+X2WZ*cakC$GqzFuQ1 z9W6clJFSezHhbK{a3vm2r%wb{^2}B7fmNO@K1s`>^)7rm2}_Daj%pJcU76|S*?cup zC-|?}-@Cr3c5esO_AhYP^y@Ckj#RRLTSv^oHj1qhju;sks(q8i5_vPME^E%T-?wl? zP+-?0z`_Wn=YUgJI3GBn+R?LgWs`CDiZ+(~+ znPGGb*-o1>@SidyS|GHpy;4I;2)V~k8;=m*d`0+ma-0;+2zEJ_by2Bn4pe*-XU0aE z&X~OpcZ(yf3c)`#&c>viI))+%j080g2P~s_Ulc);t4ex%=Z@w z<~@+EM70Z4b_6q}hJ*QD%Y3Xww;!hRKc?1IKHF<&!dmPIVe>jqaj$-M?uo5D{Po%^ z2lQreK|j+D9syxz+|arev4Va~DhsznKke6Uuxrvk^)VsLhL5t(<3+>B9=sjy>+zktJqFXKDOq;MZ%#j-UN; zOnKp}73*eAKov@ABa#%OVpaWRG(|2Ay5+iQKiL^EHgbkGTu!5WXW$0j)358w@mAcl5~QlfiJ*+w^K%n~hS6la zma9VTGi-DDp#xg>5VQDMUja(H)>`76#Ke1VNpV>i-GsRkyEVyUB?NXpEB{SC*2d^> zGUAg_I)wW1LCL23QE5g#wM%#KL&p0FFB2CKi^0Gd{jh$w5GkO_Ds#eHym_SA@)XO6 z4_`0&`nmLsMJnkU)q0%ir;RLfRqn86DF9BYeM=yX5T*z8EYN_poO6V1#-zu+US zh47L-Bq*(uL^s6u*-a1Vd%aLe@ct6s6iwP}8E1^AMwkKmNqRu%HN3g7qJ&_v0A4G3qtC}(ae6hK^sPFHE!9nL= zXd8~S;_IG{%BCM;op7#ceEnD@vl!gC=p_a=h#)0Srq(XCUV6N5yJdMV^DTK4UbO#* z0*MhpcJil?z`h4XsnaHQkt^pfK*-XME?VzCcbiXC zOLlm3jVaFmw+^Bpy1pY+gF zWyov7n>u|}G4-e;nz&5=QG~~E-{OU6@n}995+4IwFdnovsOP?J-+<&@uetVi-gmiH zhblfMGC;u-R1-~nups-sb>bxL1Nl2)xbk|)IC#XaJrV3~*CEy*%!xl=`z@GcRC?nqfvBJK?;FBM%_b!q3} zw|hw6@I^5kfuxOMTNkqQk)tAo+V*0nN*Ng*$)xZcgdadP7vGOKK{E=(@9ZAwI?I^a z`TQsMAMV-Ntga=?k}Ye8nGfF~<uJr&|k(huZ{wE5O`NOxvjC*O7BjxZEa4CiZ?-owOP<*)bqtPotq9(PCa{KMI zypE@ze{mEj@Q0yY3d+aEtUqI{AZm0V7d$nLRPLqff zy(%To&&xP^t39$p=g#M3Q!i6m)4I+_=^u@mPv$sNJHhM8aSBE>&-7UV<-~>}mj#8S zNe`0D$Qa&-v4(6aCXFX@C;k*(J(L*{yHF7MwLtK(D$-#ETQJ3q>t5=I9e(|=9KvS*6ay2CoIVqQ| zQhMR_F%OCfUcW$t3G-g&p6oSp*ws|<@u7P3*E-(hgpCqXxdYf-vmdV|l6OLGe-J_( zSEc|*eIaeWTN6V=vBII@Y>?bL?J6~!y;$Utu&#l9Xq%Xw@lh~~x3~zqS1;4JY9(_C! zAD>-2pziqbk+_0QD7`Og%f~D0^^Xm1ZhA4caD{T&zT&*@m}A+#jeL-d?Z%j;U^z{H zUmi7dS6ZA=m2y5-J$UfkAiN;~i^g>}LUS15p$fXN!S~TQ{KF@F+>G?f^pinollQH~ z^F7ifiId_4Zv*UPK=Nz*ulf_Iq_c}bB(yh0qqb1WnYcZ^uHqZ%Is;15T&A0~x?DZ4 zL~5IsjX7G_EUD1#_EiF0$B(K%WElVZ#uo{ds{f-O2?70{0sE&gKmh zUqMcc@=>ajE_ zi~QZjm#0b*;YC-DPyY#T>s^SkeqLI8$eDjVQ6MPSr#tP^FL9}`z8==0ZO_l1cE)Wz z*%>XRI!1JAdW`;qdhZOqbwMRgY46iXsnO?MZUKZ7OyaTapV?y3w9a|tydu{q`Fa$t z!``{y?mv^C#LT^9nm?OV!G#rm@5} z*67o+mvC+_9Qgb~B=4y0e5#5@CEHK^lnevX?OX4Z5IUw-8tE%u(s8zk-FFk8v8h}O z_e%ejoR#_yvVwG|U-EvNX0Pw@Y9}Gxt&_#FNjj(j{QSD>y&ZC?*6m9kQL|M_FMIb5 zm{*f7-?y5TP?3ccVS6lDf0j>;f}qmMC0R}vZ?LM3jqYziU{WLuO02E&YbcG7CAc*j z$Fb@$6;S06{25QlUg^QZ!sx+&@|-t~19^D(c@0&X0e3J_mk1I?kCe)GOdE_%tGBCmy#I0zD8;xk zw8c9Z*wrAFTjr(2IxY$RoSTgm)AW*cq6{(x&zjEOFhbL1M>?!aNV(j=@zp#|{`w|1 zl#~j(HFm0a#HS}>Q#BS%`CGPMOk$t7BZQorll$I)VT}Bvx)-#>?UI?#CR;#I1`Oed z>il%3b>!@p{9LdGq)zdAkWGcK+cUvKS&_drd_vtp82i)PysYA@yat1AA#~4_@mF=1 z@4U)EWy2BIlY>yx4W-R&)%`=MO>%)`>-i5QV|%3+17s5=OwNN9xV1IcH83A`_BeLL z;~DL`dvrSHjx7<(plSzJmJo0wXtk0^ie$x00ATSQSDj}`P3(G!VG zISpGkg)d{*bRS4kV+>wL#kN0;D=JlU#>?~Dzh{hAsLcGG`P#@jPW7FR(>*GvAy| z-WXu>Zk4QlEsl7*@ur%YN-lp(=>x#FuN-FIT&70w~sZF-Uit+`_V%Qt8EiJ1q^KU89AqpdX!>!m;Oy<)Pq;>%S+9-d80 zuxf-7GHtXy;k$W#b#X*~aue8SQKW6t#qJkY9W;1Bna$f3O?u_cQh%b~j&^w>`_(q; za3V0&b&fsig&?(%oISs>mj+RUGYrS!CL)=k}9xL^%HQz&f z*dh^L!pK5&u-ZJX&l>))Q}v#$ViR`ZG-Bt=i^-X=$?n2wo0d66_{Jk4-5BQK_nNA$ zi*^MO&P0(63*Hw++e%tRq{Yl@|r&aDxF6cV>W z{`jga!#f1x_*qr$4D`bx;kF{>t57aMQ6I`EVm1TuCB}h^g+ndh9}kAxABYsoqles< z#1ifWUNXx${`#b%I`ZB=s3)TnNo>=z+j6GHZrV*_G*GdY@-TgXSwQ*MdCUv~J{2YIiVf_EgPywH@um3wD&_H#-Hh=@G`Ih-2nSz=EJxiWIEy0lQEc=JAziCBS zo(YR7#+}c!YrOo+wn#UNM6iB(NK$($RCkEcMkw^xFa7I{Hip#t_MC~DAV!+b{rDwE zf+&15ic8Rnkai2laQ4;bEs{Ho5Q`f9qj%7v#|QYHrVM=EnLYX>yxYF^(xh2tKA0$= z4_^2Oii1c}oRo-CKDZY&Pb{BNlSJWoLqBt$)aq`aB>S(x$RseP{$575=A-8sbD!hb z$qS+N{jkqqxiOTsx{(9CYBF+z2Jod%nyqt`X%s^l-;Km&@uf8 zWG$V?FA2crJWxx2p^wm;c+OO zSk=H5E`OYCj4hl1-2Vy?|HJUH0(rRstekux0FZ-|6TlDR`U~Zgb2hetn2On2*nj~X zzoW#QOrKG}Czs#D=S@71pM!rJB#iB4!4M0}f4itVgWtXe@cjvY9?1SZc;508f(HgX zLwf&&_MQR7|4sP!{OT?y&cETrXCZ*UP2$E*;NP6%|7+$DM<-_qOJhd>7w7M&SH^#h zft-J)`AG{Xu@$p*g8XgxJ&_i~%-PcEFB0Z@Be|>wKbz zpBfp!Xle{`v;zRyfZS}H0LCY@(O!W432S{aS~wcpTS82o*z6oFn3#UAqvB|1=3@Fp zBmdur{Tp`${u6Wl^Hxb1KefA^#hV z9~%(J1$@f<`2g7dW#i!B=6DkDzib@9r#}BL8yDYG{r|%T8@D|KZ2M z!OQg|>3`Us-e&IqUiZny`@eoX|A*M8y#9MWAQ#_L;s0|DAn2dDIXfCZz0r=p;c<0{ yC-_;bXQWom&hDxH|0aUvY|WqQ{M-Y-yUNMg*wOj7y1*xpm=lGLPD)uC<^KUn5`&`v literal 0 HcmV?d00001 diff --git a/doc/doxygen/latex/structdynet_1_1AdamTrainer.tex b/doc/doxygen/latex/structdynet_1_1AdamTrainer.tex new file mode 100644 index 000000000..0a6082faf --- /dev/null +++ b/doc/doxygen/latex/structdynet_1_1AdamTrainer.tex @@ -0,0 +1,68 @@ +\hypertarget{structdynet_1_1AdamTrainer}{}\section{dynet\+:\+:Adam\+Trainer Struct Reference} +\label{structdynet_1_1AdamTrainer}\index{dynet\+::\+Adam\+Trainer@{dynet\+::\+Adam\+Trainer}} + + +Inheritance diagram for dynet\+:\+:Adam\+Trainer\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=182pt]{structdynet_1_1AdamTrainer__inherit__graph} +\end{center} +\end{figure} + + +Collaboration diagram for dynet\+:\+:Adam\+Trainer\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=182pt]{structdynet_1_1AdamTrainer__coll__graph} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1AdamTrainer_a4990f1adf7d703209f12333cd6956642}{}{\bfseries Adam\+Trainer} (Model $\ast$m, float alpha=0.\+001, float beta\+\_\+1=0.\+9, float beta\+\_\+2=0.\+999, float eps=1e-\/8)\label{structdynet_1_1AdamTrainer_a4990f1adf7d703209f12333cd6956642} + +\end{DoxyCompactItemize} +\subsection*{Protected Member Functions} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1AdamTrainer_a17f07f2cfcbd03641a12475b2c739a7c}{}virtual void {\bfseries alloc\+\_\+impl} () override\label{structdynet_1_1AdamTrainer_a17f07f2cfcbd03641a12475b2c739a7c} + +\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1AdamTrainer_aae8746433c7394dddc78849e49402f1f}{}float {\bfseries beta\+\_\+1}\label{structdynet_1_1AdamTrainer_aae8746433c7394dddc78849e49402f1f} + +\item +\hypertarget{structdynet_1_1AdamTrainer_a6089112f88ea42b5c178a3e71b405734}{}float {\bfseries beta\+\_\+2}\label{structdynet_1_1AdamTrainer_a6089112f88ea42b5c178a3e71b405734} + +\item +\hypertarget{structdynet_1_1AdamTrainer_a125ca67ff4ce57e896950102b26679cf}{}float {\bfseries epsilon}\label{structdynet_1_1AdamTrainer_a125ca67ff4ce57e896950102b26679cf} + +\item +\hypertarget{structdynet_1_1AdamTrainer_abae9d7b1df4a4bf4d849dbd2ededc2c8}{}std\+::vector$<$ Shadow\+Parameters $>$ {\bfseries m}\label{structdynet_1_1AdamTrainer_abae9d7b1df4a4bf4d849dbd2ededc2c8} + +\item +\hypertarget{structdynet_1_1AdamTrainer_a36fee69c4827e4a1de6fbcde35977305}{}std\+::vector$<$ Shadow\+Lookup\+Parameters $>$ {\bfseries lm}\label{structdynet_1_1AdamTrainer_a36fee69c4827e4a1de6fbcde35977305} + +\item +\hypertarget{structdynet_1_1AdamTrainer_a3e0f0cfdf210edd1c6e7c258bf5f480c}{}std\+::vector$<$ Shadow\+Parameters $>$ {\bfseries v}\label{structdynet_1_1AdamTrainer_a3e0f0cfdf210edd1c6e7c258bf5f480c} + +\item +\hypertarget{structdynet_1_1AdamTrainer_a641513dd5cba85c96e35a275ecf3f2b5}{}std\+::vector$<$ Shadow\+Lookup\+Parameters $>$ {\bfseries lv}\label{structdynet_1_1AdamTrainer_a641513dd5cba85c96e35a275ecf3f2b5} + +\end{DoxyCompactItemize} +\subsection*{Friends} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1AdamTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c}{}class {\bfseries boost\+::serialization\+::access}\label{structdynet_1_1AdamTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c} + +\end{DoxyCompactItemize} +\subsection*{Additional Inherited Members} + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +/home/paul/dev/dynet/dynet/training.\+h\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/structdynet_1_1AdamTrainer__coll__graph.md5 b/doc/doxygen/latex/structdynet_1_1AdamTrainer__coll__graph.md5 new file mode 100644 index 000000000..0c729ea6d --- /dev/null +++ b/doc/doxygen/latex/structdynet_1_1AdamTrainer__coll__graph.md5 @@ -0,0 +1 @@ +0c71a2112fe37eef9ffd95223670d267 \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1AdamTrainer__coll__graph.pdf b/doc/doxygen/latex/structdynet_1_1AdamTrainer__coll__graph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..829e7adad68ca2a40eb39c7730f05f55a6b4079a GIT binary patch literal 11791 zcmb7~1yEe+)~+Eq1c%_zK#<_pxVvj`celnJf&_Qh;1=8o8X!0XcL?t8ejzh+&YU@a z-TU9YyL$Kc?)BNb*6!-AddTF3MQIu7fbe8>hvoP1%m4;}t$_tRH#dM@+Sta_(G0-y zA}PWH004SXb1O$<(96|I-_cmu*wEI<7@n6G-oX)MtZxnPnx3y9BiF_7w)I~1CK*4L zW0;MNia1XK-*>ryfV>{*XQ;4%;Dbl{yXo)X0R_VJk%sLzbEA5dU%jKk5Lcg|toW5s zafOOvySzWsMn}>q1@g&_$|k)~_h3oSmZpmbhPz42 zvqd|NaNIF8Mq(xX6p^*$RI3femTXW^&DRTAaSlg}er6brF146K%&Cp)O}J_JDIe7v#DPON!7b&{(1MDb)fx*M zH(4Wxlu;uNUTI3)>dp-(k|^ye!=K?TLO&T1-$i|JZ|PcCX_7R2x}i?!&;Rm4dEM5n z7CCw80@UGgL#W;b^aPW||6C4lY-9ANUoW3toqo0V_4;Bk69@C_{nr-Lzw+?gc@bAf zF(tFS&TR@y9#8sI86T-=a-u8E6>*z`t_& z67=%=b28R{O$MO<=w@dOpqJM-HU2%ZygtbIWgN!8`q9f68=311+PVTXUnB+qBRdm- z5y%SA{v9p!GUrRU1K_oc{-_x-kgb#5-`4TR_`lV^Hlp-0D@fnQ!R~b~L$|+V34kNW z>GvvLcPsP~C2Z_$ZfLA1Cioii=Qb6M9c-OIhQou(1$(>KVZU$W6sBe(4iZRbAEUQO4Bk(xkJ+LDXOGlls8q0( z0i3DX6B3-9Zi2)r(+mO~x=~=Fv`z%%?-Esg#MmJrA;C;CpAEni^{|2yAbg*Q-pDDi zRc7SI@yvpgLq>bTFU$!HfvY%Y%1+aPMF&F7t~CU)_90mzMElJOq^ILAfrZCPKYw)7 zpoH0<2!zQ%I)Od_3*t?<=g(-?(yI;XOoyDCqs^imT){{SBTIw8 z{_&J2L2;-@yleLC0i@g6X@`*#_@Z}SxW+U0?9pINfWJi0@Q&r~xfuT;h#M{B-Ab!GMaTHlL_|Lie&z;Z43(w4jPt&mvWfu)1 z&xV0a<<8DN7qO>u^x&C88*k(xAL`=>VDGYS0Up5_+s_PZd`wOqK1ajP8L{|pFFyJ= z`X?;4<09&PZtUad?s!*%lH7FZlX591IN15-ZJj^6uQGu)puHUrOa+NB@>$kGLukmF zpo5N1&ilz9f=lheLBrV`#z71r*dNn3?lTtHCqaSCoel~-(Af!C3p<$H0?ff_FA`W~ z4F~)8%pkCIEqz|!!q(8I`#L_aq}gGD!^|xo_-EABP4LRF=fImL@PkwzVsKtCt{wVr zaL6~av`>g2u-VRM=&S(1Gc**~!Ih6tWMLK3i?HSQgtq}z+4U5ZE;o?r)8T_*djucI zi?f4_%;&VFJBxO90o|d8T*+}ad{5fAk)^p|3MIkFEZC0m3maE?6t*k+SgN1X%oH2{ z=P7QYXyWCxjD)2!AJ3O2B5bYkBcE3CBi2sUjQ2t&LEj-iQvuqSRf)7~gpmUk zZU=4le2<<3H(jc^96wpflyLr|QzIOuR9$Iz{k*NE({r+3lJf7oGzu{%`! zij${zTx~SA2l07hwU}p|E`0zA!h?F^5KY~rqWazMvjR0^vK;n-v9BI(?Cu zcm^2CIMdZIN?bzcxOF>-#R(W_n>RoD&~Q@)Z=eEHC)ngsSx@KT)0OLGhk8p|bMN%u zH&od$ti{^&1f*MCZCD--XqnBcFg2)jDs$A%sK?Plh+_4lb#mWwmhzU_rpTOkkneij zGg(B07=Dx5i_&XA@@^DUIA7-CPsjRvG;$N2Ke;^R0a{pJN}Z&!-?iQoNjYr1tv&qp zzI~@!$$mM_O`5Np_$Vs^lZN+Osa7gEts6;p{AN?~)^Xe&1r;g2T8E$Xy@gA;S%FnzPAO(lL^({xMEyPWxLCU<)KZc3E;`~!3Yl#ZjV$BG=)+hig%yLi}7 zJeF(=zmn+TO3_U@Bg|)Ks>x?5Pq>iizl9}fC zrc*qpkBte>Q-+H7&KnpWh7=X(veJ$H~KbPL51oWvob3_y4ZJDmk*p{lCvljF3Ly! z+f=_y&0w<)q=8w zk|Do7Bt+sYY1bIj7*|^gce>e5rP|XyE!!i^GCN`~%-1D}2``iXHJkV2y|A3*k*3l5 z)XwfY!Tuwdn3&FcnOjX|lOW@4pyIt&h zrJ-d#I?H=UAZx%&0VThN8J&WzpoK`Tbmkma0#)Og>%8dNAoQUoq5bs$Y}sP!=&;_0incCy{bH7KWj;x> zYIC-6gak-frgCWJNzI(ndbWFBlzIalVcuqw0q=jHt zIDdq@a0Y=mQQhD2qtJ?I^GEc%ggU~Qe4*2({iq8#8eKl;B2mhR9rdq~`Jq_N)X;{< z4Nmb|&#}}YRepYnI>p(6j)oj1?pZ31qv#o!$#IOH6&S`vi^c#)}@GyV_IhGdNYUo zsY6Od?#pca@(=Q(Hf0C@E1bK&O4jqP4e3qTCkD5@s8YNic?VgxWe-qA^6%c<9DHNI1AMrN<&^G=#=8jRKC(6Jixr!w}kj(ZGf&^)|(QZHlt?q#DZ zei#BeO1w=n|IP~W%MtYHiVQBLWWLFUs~>Ea-@*dr%(Sy!L?inkT2-qr!ZjNzhouPV9V(Sw9<**Hc>}J?plLLXU6ZQzAeAov08;Z{WLt|J{pNG^f{VrE`uN@iuH`x z&^a5!n4kd*N<6Fz%MQt62*ArZ+Qoye)IiKPhodOzrUyds&y&XzuLS~}{j-6O8rX4}~J@^-qcNtMDRC!`6G zkkj6O)Qj_7-Tg`Siwbk2h~_4@70Q7-1O9xThgV25)uSIP(l%V<6femZ#%II6nQtT0 z2-+x8dJ>5XY@Ab|-kce~LePX{82KD84?cm-v46eoj6O281gfsZvE9MWJN^>eJVYb_tQCbM|2q z7|?D=%V=9pctq1swu8d(sTCGI2o|zgTAvlW=7$V}A#r+mu(O$T4c2m9?BSWi?0z{( zokap-Y|{vY5&0P$mDe~Ea-*a(c%bFa?Aphp_`MjT#=IaU-9;KpDIa|bDYhwB#zaSnLD+X*b4yStUSL6!g0qlLh zg^GGzHVKxb4C$ji*w8c6tYnPLDpXx1VtZqAxTMcT`akY{EQg>$S}qug3_jG34iput|&;?4(eV~;Ow4woaNqH^3QuM^XWMK7IXJM#|GH@xFX zc`Up{6!V7z&MyHE8Km`)N$^8LmsyY2$b}f4tR+}fx)~*P!0ll5b=(M7J4ln7+6+cV z>ymkV`l39Koq<-K8hgRv6%WLtz9@h+$lhQz^6QZjhhwk0z(ZAmorGX0&9pax;9BJv z(u)`2X)MuFnjmJ2Qq`x0CAmFkWjs7R22K$IEnhnNQ zgZ}rGlHc_O6vzr~O=*p@j4XXz$#m6JGnLJ6JK*GqK4Y-08smJnQRJ|@yjD%(x5<5o zQqoq9iPO!b*$;$p|62dBUxkKQV9KZsC&W+ymzyfwRWX6ZPXD^?&naE*?;Bm{U#!%RTLAGi0LW4HUx&GV7CGtnThv@9UE zX-gjNM%5hc={J+PL;PsD)!!D?T`rcYr8ut(fO@oURz+ek@_X;p1I%V_3idHCkRC-L z$?j>f4)mZ?p6OG*urNmM|GGTP6ine&U1I>D`r+d$*_FXbt*!!Q^ZS{L&v%cR-IkUZ z;G!9vGM9)UKeetJ*-|s!61FlQYR75m00Wb}HC77gqi=uVzWMg}ae{iN>ELTCA~~d1 zhWr8xS66lAP{ExD@@WsdZh$7%gfV1GN;!5;E@l&cxF=4+GpDc4U_AQ(*-T;Q$7pQ* zdtbJ;BK`9YgqS#3w*K=e42Uo&lg1!7kZYevHwAub@ge+E6=Lqzbmc(z<6G^sj3v5H zf`S@$<@vKl0yq+iVmCtL!qqWTkM6g(UgyGjgA`WP8rli7EKvS-@oNF^1ng_p;BOR^ zR_r&E$>td39!Iay@VdSwETzBMvdlh@_>R#?th-COxZO{S%HCIjAgs&Jt3FVh7NIdS zbZ)5*nN7&zmgN`U3rh)0>QYV+9bwpb41MRxMz^*@3BBTnhI3ilN-%1>fR7Of4nz#Uzh(l@ymGT96!D?jhZ*A=*-NecPpf%C3&Ul#XK) zSD7EQMmZh#i0tegO6#e#2|@f#lui&QN>)WSEPM8a3tJcIa|dBToJ%BHWS=gmAkx$D z@q~NN4^cpUt&)D_<@YY`r>eJa76G!S@Inm)&X2 z_62ix+q!Tte@#E0lP#ZFS|t3!$_IG4iB8g1%Qm+S5XdEy zwiUBA3rco{yEv1491(VtxMs15R#=3n^FdHDsxL94F`Jd6uw&b&z(n_~ZgRQoM|J%g z`UPs=aIBj-+&Weo^_Sq!XcSjIP=Bq;`~Xzs&Vz<^wPaSMHrg>2ftv+#mBli$>d|VB z^x3bD-9_`TAJ4p&Wb2_B*idRp`KbynSx41gLv7>*`Bq^5=ZwfLdCVi$1fwg@Lw>;L z@Cj18MOjV5hXg&tA(~s z$Ng;n>@y9D7(@Gp)!JGn1@$KjGz0}|%=!lC+H@bN4kPltE3mlC6A3rxiVoK4H>Cy? zaR`L7)br_}Phl?ob8o1k-hCyS0V`|{T`7jY5tP5fn2JMwmC#PW`%{L<4|#$`zkmqaN0&@jyQTgE zfaC~_o-e7>?yw?QfR)=T0nJL9x;ELj8C2(#q$Jkp#-I>$m!P=X_$AwyjZs;|85Fm{ z6`%wAC=6OnH#7=t(g$rSoAdB=We#0&bx4gF+Ye66rhk=Yh8}nbCepe!+Cn27ayqte zo}m(Y^H6C_VTaI$8#5o~wt$;H5|ahrgWi*rfHF(~gPDNrrO0`B)H$iAh?$6-g{c`+ z4K;6WicH>6lDW%Bf~w=A#7<70+8gxTf@)uSlgPBA_Q;HtSAC#OMyM@c8h;ThN`pYX zIr3AhE0wu#96j#ba|%}%Kl|ZJgO#C$z?b;l^m>p*#_G3cv5TICDzh|q5#88}{6|BM zx9R*u-(fB4z8|s_Hf&=zam2*Hx`4u>pe&z0F*A$@(Mv<*Kwdpr57okD27rGtYg!w^ zPS`OR(CLI~zmQ1cp_Z6>pL6egw_RawX-^qDOFPQX>_{lSpITaCx2BQXH|xSmoe@LD zU?LltsoB=%eTN}56%}1{`)mDRD_4x&(KvaT%ipcTDT#D=Jbj?)G;Dm_+;P9r z(&0I@b24O22{>5fwAys6QB+nYA4!8uo~AWIIF1TlWq@L29qt zR*ePAVS!)w6psrbpkJo4@zR^?JO7bVuMb_*N|{`@kJVPx)>kUxcO|a=;pqfZ`ZBdd&e9c;RXTq{~65jD@wT7hnCn^a++-S4baWic`A8kaOIM zXOlGY;liX(&Z;VM19dnA*d_fjG)qv^%V-2X#a_2ASjA*0Z9XQpV3o+oAQT?X1;w0l zb=e)OC8p&fy?v;#;wQ|+)cZ#H!v?pcDcW8G#WdSix-twG`^8yd?XUZ3m#fd6-Vr>$ zv*r|G*@s~VA|xhx(YZ*ck|$ZGX-X$E*Af=>L|Zze@%Sxgc>cCdF^I?ny<)3dEz1_v zvjvYRA4xQ~op-uDyGnO_fK!Dme1rPj{be8O?r3d}jmtVLv2uQz>VK7Xylwha-kSaN za7XB%)cn=J0CkgiQ}`Hk_&Jm+xQIsqjH*13JEo?o1|kS5(cTnvp)i3@| z2N%K3=$@C9xZ__vm9fI8H#@ac-_@3tJ6H@_EZRN4e-fmfSSGsHDb&~E3=9|nQ%s~A zpN(ah8?xHi=H~Z%^YL+9RHqi~(HeZK!(G!%e>lS zF7rpm+RkR){Uq@;q^39_-3k~eXLVVqhwx6Gy?~W*Pp*EOYIp@Vl1XWS8Yx@Voy!-{ zDm&6U?EEd{Fgv4&d-PD)9No6r!N!I*zA4zL{7O^zILo{I=z!hW(O%!sieziOSnKHl_`Z|Ys=4}e4%jD>Qw@taBrN`iyDuQ(!}`=|Hc9taR0<-FTNXEHUFVo_#Pe)4CG zR5^R44Q`O>bVKsDlW8tlhd}5{?r3K_KENv(A-`8IaS}ymgx%S9myUzIk|h3+d*Dw? zjvO%t)-t4&Xi#0lWuG{Mwx}^aD&5Q;CN9(*6qZH`p6BJ)fJond7Sk=ec{TJYo7YQt zRLE+XzEf47>4X0VsA>xMyTpu#)@TL#(@zJg<*g$ziU=y_cb3voe3Z_`!s>Y#9c}?0 z3sFB#C&hGP70Z<9V1hm$uRBQ=B__mP3!?;PM0m@Uw@rT&N4kg?`!$zq&NcgqQ$DtJ%Vv=k zM+DE1l6cR-Cl3#WDZA>iEJ}bDb0Q(sQ>BLW#fejc7MSrKLQ zB{$k2hD)yS*)0y0T+rE4>FLmMdfAWsDQFH-8SplX(rg(%Sx5HNajzQ*IBw^UST4D} z(H0nF6wcZ_Vs9_swDQU*bYih-W>mQoD(E^H^A3V}$T7onemk~+mZW#4^Rk4(ij@b) zK)hl@6_D|_qOzO~*hZKQmna42TdDEUQfVvVy!U%B9+Y!Za}D+DnpyH#$oPIvQtICY zZ-IsmOV?Ki?q?G!SVyHF9ZYo$yb9aQK(fr13GnOL_j7FD86N8_JBq+^yzIiHQl66O z@y^CrLT@@>5MpW-ydC|teX6ZLL^)B<#W}ZxI4t1}iUpR^u*q(SRd&#szx#!27#Dg_ zls*YT(Tj9;m57?slk*{I9R?3U8JiUFAu zCs(7zqtB~sTuv9Yv70u-!^AwHa=lDQZI%(U z*tx(A&<MQEM39ViS`F{%~o`Lb$) zy|z%}3R|EM&U`hset$zI^j$zb_c0~A9X<2u9>NK}(8ePr8^gemFc9L6*7Hqf-K@+{ z%PZ!vnt&tkl{Wgt`gN5>ZZ2+Yh*4Z)65vnZnT@)Q|2-^2`=?1|Ci>;376)nSDc)L{EtUsK%2<)~$?+ocqY9UmbJ8sqkB2k&Wa8>8kT43p5lKL^b;5=I0~7rM`>y8h7i+BTHk z?7y3~(rN|EQi)z?3;4lK%nz>hRL+IN!bMLpzZK~0V8ExI_Nz?%Tl(-~1$L>Ju{0Ux zp;5x-$d>L-y_LT4nFA-)$EZ% zS};}E~kmiJCrN; zQ@d22{VI_(OrAYa-Nixx(@+qkPmzz8<(Y+P(JXE zDv<@NU)|9nU%d;9bn=dl2sj%eYz>8Du|k+HyowaQ;lS=nsWpAp_~d$6phJ3^-a8Z? ztwkzcSo0*E;2G`5?k9ae*1FqER=g7Y0E|2v4S^2)I5qq0t)j`$Xt}b|9P|&f4<1;Q zT;f=#2$3Fn;E~lHuEnJi+U%G~4YU&J6lb$17>lAToMf1{+82~JYFmtW&)bqM=@LCNrmo=+2NBiElg&!V<{LsOK6|MGS-5W=_2C zL!p<+*~c&1Mks!wfJ>q6nmnrH0C1*<)%+YZPyBBRh`ZjE;1jk-(#oI55#SZwf0)t8 zYf|9d{m2u7ysq3kAi@rJc`a8jN}1WW^jU;+C#bu~S%i)2#MGqfV*u|(lP+f$ZN-U| zc&qip&j)UD_tYt@Zy}1#e8E0@+#J;(*rXcda!xRPCJf#a-}*mJXDrh{ewv#3Xu=fl z&DmdTaG>cH94qP1@Yd9(5g|r^v)%UU&YFa2f&2Q~ke=VQ+uSwqzF^G$X(ztgw*pZ& zw>jPKZC{SBzil>$XK*tD#D0An3FHUhZ4Zwm{fFSm1B5qzum(ooRlpZY&U;k(21&_R z>F0smB>b)cYULjK&X>U?UXUe9f!Tg#??1Q1+j>}#nksM>27lc{q19}3yQ%B>7{=!v z+*$qf@l4Ona&D51lxolAzD%_lJTS@4XRj-YL7V2dtD)eLqBgK1k1jet1;&)+`{+6< z=&jt!&Xoty>Sw){&GoG7a0;i78vjN(Ez9Kl`e0EUNfqYlcmQ2K$W7e!S^Vkpfy)zX zv^yb3a;nZERBt#w+RZp3*2L6QOOK@wD1?r&yZ1dlci2y`W;?fdiTan89(bO~1|F@y z5}ppZOeuQ4R>xiMhrsW0^g|zhJ#YFwJwrWZp)fQ+_Rfi!~vlk_BWyCA&Bf5RUwGPluAPh-?zHgrkN$<>rd>HALPEl0q!}ON25wRs(d1 zU1z`AbnTb$@CI$2O&adfK5iSSZnw&L#*ys1ye+gY=x?T*bT=JfU)+)5{j1Oq+C~jO zM3i3hvFAp}*R;U|rbc>TKFJKhDzhHLhGm0{DQt2176{{zr%8`VBmjm`1klqP6m#@p}xl z1^fY+~pzo+QGYx0%SbolLvl)2HXAFr!W z{1=Pq^a^hN4Txm?H&ptu&xeP5<4= z6=ZAz|H7HFz%%^o0I&jq%s_w%;17+Fk@3~b*8^blr^dj*!tj#Ue`pMhFLnM8jrrvn z{7;SXoaCBOfnF)}c|+Wb%LWwrm*SU6tD-+#mb8UMNFm(f^W zZ2QkRMrO8`V)#pQ1nIv#(V*YRwvxHK@vB#_D668a?MwduP2x(}n7riqUzDtaqdv&- Tx4VptEKDr$WMm?8qVWF*x!e;N literal 0 HcmV?d00001 diff --git a/doc/doxygen/latex/structdynet_1_1AdamTrainer__inherit__graph.md5 b/doc/doxygen/latex/structdynet_1_1AdamTrainer__inherit__graph.md5 new file mode 100644 index 000000000..0c729ea6d --- /dev/null +++ b/doc/doxygen/latex/structdynet_1_1AdamTrainer__inherit__graph.md5 @@ -0,0 +1 @@ +0c71a2112fe37eef9ffd95223670d267 \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1AdamTrainer__inherit__graph.pdf b/doc/doxygen/latex/structdynet_1_1AdamTrainer__inherit__graph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..829e7adad68ca2a40eb39c7730f05f55a6b4079a GIT binary patch literal 11791 zcmb7~1yEe+)~+Eq1c%_zK#<_pxVvj`celnJf&_Qh;1=8o8X!0XcL?t8ejzh+&YU@a z-TU9YyL$Kc?)BNb*6!-AddTF3MQIu7fbe8>hvoP1%m4;}t$_tRH#dM@+Sta_(G0-y zA}PWH004SXb1O$<(96|I-_cmu*wEI<7@n6G-oX)MtZxnPnx3y9BiF_7w)I~1CK*4L zW0;MNia1XK-*>ryfV>{*XQ;4%;Dbl{yXo)X0R_VJk%sLzbEA5dU%jKk5Lcg|toW5s zafOOvySzWsMn}>q1@g&_$|k)~_h3oSmZpmbhPz42 zvqd|NaNIF8Mq(xX6p^*$RI3femTXW^&DRTAaSlg}er6brF146K%&Cp)O}J_JDIe7v#DPON!7b&{(1MDb)fx*M zH(4Wxlu;uNUTI3)>dp-(k|^ye!=K?TLO&T1-$i|JZ|PcCX_7R2x}i?!&;Rm4dEM5n z7CCw80@UGgL#W;b^aPW||6C4lY-9ANUoW3toqo0V_4;Bk69@C_{nr-Lzw+?gc@bAf zF(tFS&TR@y9#8sI86T-=a-u8E6>*z`t_& z67=%=b28R{O$MO<=w@dOpqJM-HU2%ZygtbIWgN!8`q9f68=311+PVTXUnB+qBRdm- z5y%SA{v9p!GUrRU1K_oc{-_x-kgb#5-`4TR_`lV^Hlp-0D@fnQ!R~b~L$|+V34kNW z>GvvLcPsP~C2Z_$ZfLA1Cioii=Qb6M9c-OIhQou(1$(>KVZU$W6sBe(4iZRbAEUQO4Bk(xkJ+LDXOGlls8q0( z0i3DX6B3-9Zi2)r(+mO~x=~=Fv`z%%?-Esg#MmJrA;C;CpAEni^{|2yAbg*Q-pDDi zRc7SI@yvpgLq>bTFU$!HfvY%Y%1+aPMF&F7t~CU)_90mzMElJOq^ILAfrZCPKYw)7 zpoH0<2!zQ%I)Od_3*t?<=g(-?(yI;XOoyDCqs^imT){{SBTIw8 z{_&J2L2;-@yleLC0i@g6X@`*#_@Z}SxW+U0?9pINfWJi0@Q&r~xfuT;h#M{B-Ab!GMaTHlL_|Lie&z;Z43(w4jPt&mvWfu)1 z&xV0a<<8DN7qO>u^x&C88*k(xAL`=>VDGYS0Up5_+s_PZd`wOqK1ajP8L{|pFFyJ= z`X?;4<09&PZtUad?s!*%lH7FZlX591IN15-ZJj^6uQGu)puHUrOa+NB@>$kGLukmF zpo5N1&ilz9f=lheLBrV`#z71r*dNn3?lTtHCqaSCoel~-(Af!C3p<$H0?ff_FA`W~ z4F~)8%pkCIEqz|!!q(8I`#L_aq}gGD!^|xo_-EABP4LRF=fImL@PkwzVsKtCt{wVr zaL6~av`>g2u-VRM=&S(1Gc**~!Ih6tWMLK3i?HSQgtq}z+4U5ZE;o?r)8T_*djucI zi?f4_%;&VFJBxO90o|d8T*+}ad{5fAk)^p|3MIkFEZC0m3maE?6t*k+SgN1X%oH2{ z=P7QYXyWCxjD)2!AJ3O2B5bYkBcE3CBi2sUjQ2t&LEj-iQvuqSRf)7~gpmUk zZU=4le2<<3H(jc^96wpflyLr|QzIOuR9$Iz{k*NE({r+3lJf7oGzu{%`! zij${zTx~SA2l07hwU}p|E`0zA!h?F^5KY~rqWazMvjR0^vK;n-v9BI(?Cu zcm^2CIMdZIN?bzcxOF>-#R(W_n>RoD&~Q@)Z=eEHC)ngsSx@KT)0OLGhk8p|bMN%u zH&od$ti{^&1f*MCZCD--XqnBcFg2)jDs$A%sK?Plh+_4lb#mWwmhzU_rpTOkkneij zGg(B07=Dx5i_&XA@@^DUIA7-CPsjRvG;$N2Ke;^R0a{pJN}Z&!-?iQoNjYr1tv&qp zzI~@!$$mM_O`5Np_$Vs^lZN+Osa7gEts6;p{AN?~)^Xe&1r;g2T8E$Xy@gA;S%FnzPAO(lL^({xMEyPWxLCU<)KZc3E;`~!3Yl#ZjV$BG=)+hig%yLi}7 zJeF(=zmn+TO3_U@Bg|)Ks>x?5Pq>iizl9}fC zrc*qpkBte>Q-+H7&KnpWh7=X(veJ$H~KbPL51oWvob3_y4ZJDmk*p{lCvljF3Ly! z+f=_y&0w<)q=8w zk|Do7Bt+sYY1bIj7*|^gce>e5rP|XyE!!i^GCN`~%-1D}2``iXHJkV2y|A3*k*3l5 z)XwfY!Tuwdn3&FcnOjX|lOW@4pyIt&h zrJ-d#I?H=UAZx%&0VThN8J&WzpoK`Tbmkma0#)Og>%8dNAoQUoq5bs$Y}sP!=&;_0incCy{bH7KWj;x> zYIC-6gak-frgCWJNzI(ndbWFBlzIalVcuqw0q=jHt zIDdq@a0Y=mQQhD2qtJ?I^GEc%ggU~Qe4*2({iq8#8eKl;B2mhR9rdq~`Jq_N)X;{< z4Nmb|&#}}YRepYnI>p(6j)oj1?pZ31qv#o!$#IOH6&S`vi^c#)}@GyV_IhGdNYUo zsY6Od?#pca@(=Q(Hf0C@E1bK&O4jqP4e3qTCkD5@s8YNic?VgxWe-qA^6%c<9DHNI1AMrN<&^G=#=8jRKC(6Jixr!w}kj(ZGf&^)|(QZHlt?q#DZ zei#BeO1w=n|IP~W%MtYHiVQBLWWLFUs~>Ea-@*dr%(Sy!L?inkT2-qr!ZjNzhouPV9V(Sw9<**Hc>}J?plLLXU6ZQzAeAov08;Z{WLt|J{pNG^f{VrE`uN@iuH`x z&^a5!n4kd*N<6Fz%MQt62*ArZ+Qoye)IiKPhodOzrUyds&y&XzuLS~}{j-6O8rX4}~J@^-qcNtMDRC!`6G zkkj6O)Qj_7-Tg`Siwbk2h~_4@70Q7-1O9xThgV25)uSIP(l%V<6femZ#%II6nQtT0 z2-+x8dJ>5XY@Ab|-kce~LePX{82KD84?cm-v46eoj6O281gfsZvE9MWJN^>eJVYb_tQCbM|2q z7|?D=%V=9pctq1swu8d(sTCGI2o|zgTAvlW=7$V}A#r+mu(O$T4c2m9?BSWi?0z{( zokap-Y|{vY5&0P$mDe~Ea-*a(c%bFa?Aphp_`MjT#=IaU-9;KpDIa|bDYhwB#zaSnLD+X*b4yStUSL6!g0qlLh zg^GGzHVKxb4C$ji*w8c6tYnPLDpXx1VtZqAxTMcT`akY{EQg>$S}qug3_jG34iput|&;?4(eV~;Ow4woaNqH^3QuM^XWMK7IXJM#|GH@xFX zc`Up{6!V7z&MyHE8Km`)N$^8LmsyY2$b}f4tR+}fx)~*P!0ll5b=(M7J4ln7+6+cV z>ymkV`l39Koq<-K8hgRv6%WLtz9@h+$lhQz^6QZjhhwk0z(ZAmorGX0&9pax;9BJv z(u)`2X)MuFnjmJ2Qq`x0CAmFkWjs7R22K$IEnhnNQ zgZ}rGlHc_O6vzr~O=*p@j4XXz$#m6JGnLJ6JK*GqK4Y-08smJnQRJ|@yjD%(x5<5o zQqoq9iPO!b*$;$p|62dBUxkKQV9KZsC&W+ymzyfwRWX6ZPXD^?&naE*?;Bm{U#!%RTLAGi0LW4HUx&GV7CGtnThv@9UE zX-gjNM%5hc={J+PL;PsD)!!D?T`rcYr8ut(fO@oURz+ek@_X;p1I%V_3idHCkRC-L z$?j>f4)mZ?p6OG*urNmM|GGTP6ine&U1I>D`r+d$*_FXbt*!!Q^ZS{L&v%cR-IkUZ z;G!9vGM9)UKeetJ*-|s!61FlQYR75m00Wb}HC77gqi=uVzWMg}ae{iN>ELTCA~~d1 zhWr8xS66lAP{ExD@@WsdZh$7%gfV1GN;!5;E@l&cxF=4+GpDc4U_AQ(*-T;Q$7pQ* zdtbJ;BK`9YgqS#3w*K=e42Uo&lg1!7kZYevHwAub@ge+E6=Lqzbmc(z<6G^sj3v5H zf`S@$<@vKl0yq+iVmCtL!qqWTkM6g(UgyGjgA`WP8rli7EKvS-@oNF^1ng_p;BOR^ zR_r&E$>td39!Iay@VdSwETzBMvdlh@_>R#?th-COxZO{S%HCIjAgs&Jt3FVh7NIdS zbZ)5*nN7&zmgN`U3rh)0>QYV+9bwpb41MRxMz^*@3BBTnhI3ilN-%1>fR7Of4nz#Uzh(l@ymGT96!D?jhZ*A=*-NecPpf%C3&Ul#XK) zSD7EQMmZh#i0tegO6#e#2|@f#lui&QN>)WSEPM8a3tJcIa|dBToJ%BHWS=gmAkx$D z@q~NN4^cpUt&)D_<@YY`r>eJa76G!S@Inm)&X2 z_62ix+q!Tte@#E0lP#ZFS|t3!$_IG4iB8g1%Qm+S5XdEy zwiUBA3rco{yEv1491(VtxMs15R#=3n^FdHDsxL94F`Jd6uw&b&z(n_~ZgRQoM|J%g z`UPs=aIBj-+&Weo^_Sq!XcSjIP=Bq;`~Xzs&Vz<^wPaSMHrg>2ftv+#mBli$>d|VB z^x3bD-9_`TAJ4p&Wb2_B*idRp`KbynSx41gLv7>*`Bq^5=ZwfLdCVi$1fwg@Lw>;L z@Cj18MOjV5hXg&tA(~s z$Ng;n>@y9D7(@Gp)!JGn1@$KjGz0}|%=!lC+H@bN4kPltE3mlC6A3rxiVoK4H>Cy? zaR`L7)br_}Phl?ob8o1k-hCyS0V`|{T`7jY5tP5fn2JMwmC#PW`%{L<4|#$`zkmqaN0&@jyQTgE zfaC~_o-e7>?yw?QfR)=T0nJL9x;ELj8C2(#q$Jkp#-I>$m!P=X_$AwyjZs;|85Fm{ z6`%wAC=6OnH#7=t(g$rSoAdB=We#0&bx4gF+Ye66rhk=Yh8}nbCepe!+Cn27ayqte zo}m(Y^H6C_VTaI$8#5o~wt$;H5|ahrgWi*rfHF(~gPDNrrO0`B)H$iAh?$6-g{c`+ z4K;6WicH>6lDW%Bf~w=A#7<70+8gxTf@)uSlgPBA_Q;HtSAC#OMyM@c8h;ThN`pYX zIr3AhE0wu#96j#ba|%}%Kl|ZJgO#C$z?b;l^m>p*#_G3cv5TICDzh|q5#88}{6|BM zx9R*u-(fB4z8|s_Hf&=zam2*Hx`4u>pe&z0F*A$@(Mv<*Kwdpr57okD27rGtYg!w^ zPS`OR(CLI~zmQ1cp_Z6>pL6egw_RawX-^qDOFPQX>_{lSpITaCx2BQXH|xSmoe@LD zU?LltsoB=%eTN}56%}1{`)mDRD_4x&(KvaT%ipcTDT#D=Jbj?)G;Dm_+;P9r z(&0I@b24O22{>5fwAys6QB+nYA4!8uo~AWIIF1TlWq@L29qt zR*ePAVS!)w6psrbpkJo4@zR^?JO7bVuMb_*N|{`@kJVPx)>kUxcO|a=;pqfZ`ZBdd&e9c;RXTq{~65jD@wT7hnCn^a++-S4baWic`A8kaOIM zXOlGY;liX(&Z;VM19dnA*d_fjG)qv^%V-2X#a_2ASjA*0Z9XQpV3o+oAQT?X1;w0l zb=e)OC8p&fy?v;#;wQ|+)cZ#H!v?pcDcW8G#WdSix-twG`^8yd?XUZ3m#fd6-Vr>$ zv*r|G*@s~VA|xhx(YZ*ck|$ZGX-X$E*Af=>L|Zze@%Sxgc>cCdF^I?ny<)3dEz1_v zvjvYRA4xQ~op-uDyGnO_fK!Dme1rPj{be8O?r3d}jmtVLv2uQz>VK7Xylwha-kSaN za7XB%)cn=J0CkgiQ}`Hk_&Jm+xQIsqjH*13JEo?o1|kS5(cTnvp)i3@| z2N%K3=$@C9xZ__vm9fI8H#@ac-_@3tJ6H@_EZRN4e-fmfSSGsHDb&~E3=9|nQ%s~A zpN(ah8?xHi=H~Z%^YL+9RHqi~(HeZK!(G!%e>lS zF7rpm+RkR){Uq@;q^39_-3k~eXLVVqhwx6Gy?~W*Pp*EOYIp@Vl1XWS8Yx@Voy!-{ zDm&6U?EEd{Fgv4&d-PD)9No6r!N!I*zA4zL{7O^zILo{I=z!hW(O%!sieziOSnKHl_`Z|Ys=4}e4%jD>Qw@taBrN`iyDuQ(!}`=|Hc9taR0<-FTNXEHUFVo_#Pe)4CG zR5^R44Q`O>bVKsDlW8tlhd}5{?r3K_KENv(A-`8IaS}ymgx%S9myUzIk|h3+d*Dw? zjvO%t)-t4&Xi#0lWuG{Mwx}^aD&5Q;CN9(*6qZH`p6BJ)fJond7Sk=ec{TJYo7YQt zRLE+XzEf47>4X0VsA>xMyTpu#)@TL#(@zJg<*g$ziU=y_cb3voe3Z_`!s>Y#9c}?0 z3sFB#C&hGP70Z<9V1hm$uRBQ=B__mP3!?;PM0m@Uw@rT&N4kg?`!$zq&NcgqQ$DtJ%Vv=k zM+DE1l6cR-Cl3#WDZA>iEJ}bDb0Q(sQ>BLW#fejc7MSrKLQ zB{$k2hD)yS*)0y0T+rE4>FLmMdfAWsDQFH-8SplX(rg(%Sx5HNajzQ*IBw^UST4D} z(H0nF6wcZ_Vs9_swDQU*bYih-W>mQoD(E^H^A3V}$T7onemk~+mZW#4^Rk4(ij@b) zK)hl@6_D|_qOzO~*hZKQmna42TdDEUQfVvVy!U%B9+Y!Za}D+DnpyH#$oPIvQtICY zZ-IsmOV?Ki?q?G!SVyHF9ZYo$yb9aQK(fr13GnOL_j7FD86N8_JBq+^yzIiHQl66O z@y^CrLT@@>5MpW-ydC|teX6ZLL^)B<#W}ZxI4t1}iUpR^u*q(SRd&#szx#!27#Dg_ zls*YT(Tj9;m57?slk*{I9R?3U8JiUFAu zCs(7zqtB~sTuv9Yv70u-!^AwHa=lDQZI%(U z*tx(A&<MQEM39ViS`F{%~o`Lb$) zy|z%}3R|EM&U`hset$zI^j$zb_c0~A9X<2u9>NK}(8ePr8^gemFc9L6*7Hqf-K@+{ z%PZ!vnt&tkl{Wgt`gN5>ZZ2+Yh*4Z)65vnZnT@)Q|2-^2`=?1|Ci>;376)nSDc)L{EtUsK%2<)~$?+ocqY9UmbJ8sqkB2k&Wa8>8kT43p5lKL^b;5=I0~7rM`>y8h7i+BTHk z?7y3~(rN|EQi)z?3;4lK%nz>hRL+IN!bMLpzZK~0V8ExI_Nz?%Tl(-~1$L>Ju{0Ux zp;5x-$d>L-y_LT4nFA-)$EZ% zS};}E~kmiJCrN; zQ@d22{VI_(OrAYa-Nixx(@+qkPmzz8<(Y+P(JXE zDv<@NU)|9nU%d;9bn=dl2sj%eYz>8Du|k+HyowaQ;lS=nsWpAp_~d$6phJ3^-a8Z? ztwkzcSo0*E;2G`5?k9ae*1FqER=g7Y0E|2v4S^2)I5qq0t)j`$Xt}b|9P|&f4<1;Q zT;f=#2$3Fn;E~lHuEnJi+U%G~4YU&J6lb$17>lAToMf1{+82~JYFmtW&)bqM=@LCNrmo=+2NBiElg&!V<{LsOK6|MGS-5W=_2C zL!p<+*~c&1Mks!wfJ>q6nmnrH0C1*<)%+YZPyBBRh`ZjE;1jk-(#oI55#SZwf0)t8 zYf|9d{m2u7ysq3kAi@rJc`a8jN}1WW^jU;+C#bu~S%i)2#MGqfV*u|(lP+f$ZN-U| zc&qip&j)UD_tYt@Zy}1#e8E0@+#J;(*rXcda!xRPCJf#a-}*mJXDrh{ewv#3Xu=fl z&DmdTaG>cH94qP1@Yd9(5g|r^v)%UU&YFa2f&2Q~ke=VQ+uSwqzF^G$X(ztgw*pZ& zw>jPKZC{SBzil>$XK*tD#D0An3FHUhZ4Zwm{fFSm1B5qzum(ooRlpZY&U;k(21&_R z>F0smB>b)cYULjK&X>U?UXUe9f!Tg#??1Q1+j>}#nksM>27lc{q19}3yQ%B>7{=!v z+*$qf@l4Ona&D51lxolAzD%_lJTS@4XRj-YL7V2dtD)eLqBgK1k1jet1;&)+`{+6< z=&jt!&Xoty>Sw){&GoG7a0;i78vjN(Ez9Kl`e0EUNfqYlcmQ2K$W7e!S^Vkpfy)zX zv^yb3a;nZERBt#w+RZp3*2L6QOOK@wD1?r&yZ1dlci2y`W;?fdiTan89(bO~1|F@y z5}ppZOeuQ4R>xiMhrsW0^g|zhJ#YFwJwrWZp)fQ+_Rfi!~vlk_BWyCA&Bf5RUwGPluAPh-?zHgrkN$<>rd>HALPEl0q!}ON25wRs(d1 zU1z`AbnTb$@CI$2O&adfK5iSSZnw&L#*ys1ye+gY=x?T*bT=JfU)+)5{j1Oq+C~jO zM3i3hvFAp}*R;U|rbc>TKFJKhDzhHLhGm0{DQt2176{{zr%8`VBmjm`1klqP6m#@p}xl z1^fY+~pzo+QGYx0%SbolLvl)2HXAFr!W z{1=Pq^a^hN4Txm?H&ptu&xeP5<4= z6=ZAz|H7HFz%%^o0I&jq%s_w%;17+Fk@3~b*8^blr^dj*!tj#Ue`pMhFLnM8jrrvn z{7;SXoaCBOfnF)}c|+Wb%LWwrm*SU6tD-+#mb8UMNFm(f^W zZ2QkRMrO8`V)#pQ1nIv#(V*YRwvxHK@vB#_D668a?MwduP2x(}n7riqUzDtaqdv&- Tx4VptEKDr$WMm?8qVWF*x!e;N literal 0 HcmV?d00001 diff --git a/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer.tex b/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer.tex new file mode 100644 index 000000000..fe0b6cd3c --- /dev/null +++ b/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer.tex @@ -0,0 +1,56 @@ +\hypertarget{structdynet_1_1MomentumSGDTrainer}{}\section{dynet\+:\+:Momentum\+S\+G\+D\+Trainer Struct Reference} +\label{structdynet_1_1MomentumSGDTrainer}\index{dynet\+::\+Momentum\+S\+G\+D\+Trainer@{dynet\+::\+Momentum\+S\+G\+D\+Trainer}} + + +Inheritance diagram for dynet\+:\+:Momentum\+S\+G\+D\+Trainer\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=227pt]{structdynet_1_1MomentumSGDTrainer__inherit__graph} +\end{center} +\end{figure} + + +Collaboration diagram for dynet\+:\+:Momentum\+S\+G\+D\+Trainer\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=227pt]{structdynet_1_1MomentumSGDTrainer__coll__graph} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1MomentumSGDTrainer_a29ba25e1ad153bc552edc178a69c67c7}{}{\bfseries Momentum\+S\+G\+D\+Trainer} (Model $\ast$m, real e0=0.\+01, real mom=0.\+9)\label{structdynet_1_1MomentumSGDTrainer_a29ba25e1ad153bc552edc178a69c67c7} + +\end{DoxyCompactItemize} +\subsection*{Protected Member Functions} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1MomentumSGDTrainer_a904d0442ffa5d18463ca529ee07a1af2}{}virtual void {\bfseries alloc\+\_\+impl} () override\label{structdynet_1_1MomentumSGDTrainer_a904d0442ffa5d18463ca529ee07a1af2} + +\end{DoxyCompactItemize} +\subsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1MomentumSGDTrainer_a61b272617d6a7a80f13f4c8d03215a7b}{}real {\bfseries momentum}\label{structdynet_1_1MomentumSGDTrainer_a61b272617d6a7a80f13f4c8d03215a7b} + +\item +\hypertarget{structdynet_1_1MomentumSGDTrainer_af6d25b4fbf842543c8de00470bfa0cbc}{}std\+::vector$<$ Shadow\+Parameters $>$ {\bfseries vp}\label{structdynet_1_1MomentumSGDTrainer_af6d25b4fbf842543c8de00470bfa0cbc} + +\item +\hypertarget{structdynet_1_1MomentumSGDTrainer_aea8235a50ab0e66768bd453e01cb406a}{}std\+::vector$<$ Shadow\+Lookup\+Parameters $>$ {\bfseries vlp}\label{structdynet_1_1MomentumSGDTrainer_aea8235a50ab0e66768bd453e01cb406a} + +\end{DoxyCompactItemize} +\subsection*{Friends} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1MomentumSGDTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c}{}class {\bfseries boost\+::serialization\+::access}\label{structdynet_1_1MomentumSGDTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c} + +\end{DoxyCompactItemize} +\subsection*{Additional Inherited Members} + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +/home/paul/dev/dynet/dynet/training.\+h\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__coll__graph.md5 b/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__coll__graph.md5 new file mode 100644 index 000000000..21132cd03 --- /dev/null +++ b/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__coll__graph.md5 @@ -0,0 +1 @@ +dd39685e4b6998fb5e8a73b54a743277 \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__coll__graph.pdf b/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__coll__graph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8f5f4af1506669c7593b2af047fb62006705e98c GIT binary patch literal 12827 zcmb801yGzx*Y9!n0D%O;;1FyEcXtTxKDfIDg1ft0f*zK^uRXhv9tP-(O(l4(ipAyCq$8>Uv#S)BW~I5*nT z61?^=k&BqREa#aatP-eB2@?UXvF6NG<~0uHI=@`z>f;zoGFeFLEh7!MPymua`y#gY zifO&Xad%=_%Lw_+dcSb`MeRwF`fnpu=+J`}p&AOsmncr_55Op_4mLr026ND}h0LG) z;6C$pTVv3H>SpaZzzX;Eb0StWZ02qV>03ZN^0r>g#IXBM_{&-~& zwXt^mo3$|=kPZl7`75{2M$dnLF2?$w#Q+RSA8m~Q402!-qu&e5f$fc+=K=jSj^Trm zp&3}v#ucFXECB(GjBEf93oAhTx3$pon$PAAfS0oRqlU!nZJccX=EooN|5pFnh~o3A z_F!uV+n2QrKK><3037X|etYqW!f#7)`P4aTVvH`?T{o zo%6M;&|xdpVzBv&(;-8*lRxJsR%i~%98$rXvz^10y+Oo#R}UUpH7RK;vY22F@K$xj zKn~-_kI&G7Li|r{PkSZ-F-f^#g$Hbn5S8Ww}c7gU`li;QQPyt)=C@mx!x>K!6W!=996v zJ>YeD1ZngM5mb~s8wSko286wT7?crF2L{3nmMQd!W2F;hs;0WnH&2USDMI|0{IEcn z{S6o=XvY4^d&Nz=9BzUrJ}3yd7364AgiF_4J|r(TDM+L$$Ok*z!|kR|{KlH>3ljce z{kJidk00#5t2uD`u4qN2qMSymRLTV{H`+l$c)srU0R#HGJKXIbuB_*|1Q!XLA4x4y zovUx@P^;~o*2bJ*xEg)qHy#sE9DO+hpH#C>Y)KZ zoUcLhMxytuMq2%Z`rQvY4>g9FnVC0-hNsL+|!M|s+c-MzmB5N_};D;C3;O~n^op>rsy%mxV^sG&g7k+}lb@@FE=Jhe=MK`55WZarqso3Cm`*td z2i&EvgmR>A{SGb0TBiL|$FU2)0qc9jC;OqRg|H##sTsKrBP9SO3^aEAzhDEkxCilc zg@Z5N@#xq|EJ)Mi3s&H*xx8V&^Vi6F=n%V?Z|VwmI!*LzXX;5c$wV&u)SBxD$VlbM zzmdQX3u$nN>I}lqn3{gDweN57?;JC*Qw0&#{-XLhi28J#43U11ZROimIyG5hlebe% zDB?S$jYL%$bg8~j5Nfd9rPevw<)lT-JXC&9 zp)G3gh9yBbZ~GPY(c3hk0RPS@rdnWhEg~mU28*){Ev0!=4*aSio1L}o*ck8RRRf1s z@3fop$MW+GL(j$buSjaGRcPDr>_XU@WP8;U-GS#m$}$;3jkza7%HeaMXC>Y88%8PS8 zB;lMsY!shG+i5FehG8NJkXC%XpMZ>PO4#MVJAuQ&uj3QXQ;mvZ0IQ zF-?PtwG!n?HlfCuDcq!!_o`cF@96omu2+X~BQfuS?_##`NW!-;KcjoHRN)qUb=F(; znxX!6nLO2q&*Q;}D!hN zSiCS=+g{8m7{YpYYz;mv;16RhN(2A!!P}3RSfl9GxCSzKIW0*zvoP-;n~h+<^T!z@ zv}0G!YZe_+XCIqbj*?vhg>C4>j^BsBFB3-z6Urgkofa)DTn@@?wpYULaQ@V?H7%1% zao0XmKCT_BCQ0&ptlIpJjn%^jo?2$Q<*9q| z+xTMCV8%?x_@Y$yLbKa}55a+B7)2m9yIM6WAJ*+|tZR_)J~qNa%)Y#?1cg#z+utchd#!Pi&hYq8t&H8LVPdK#aCM}BB`DD}8kMZy0-7l7xH5Ypikk<9*QQsUOjD!YP_6BCj6# z9aHogizBm3@=A0W`@1<(3dIHvrK23QA?lD)!YfJ1teIE|qeeoH8qWGOZ=hsJq~~X5 z-Nuuon+a5eQ77CHeth5|%96*jZIk|0U-bNqdy}idA%T-!)vKiCVR7#*oTVrvD)hy@R-IT+tE%aoV=Gclbs?>t3j(u#af=)90cmVD5!og;a@M{%uT`Pjg^Oz} zIw_?cpEYHW>ax@60tF)Sv*!z6C=z-5_3BNpNTP{WbrxRRSZ>zqG%>tBx*IYn59Utl zcf!R6nOzw%*_ljI1Q-Ck+VU;dFyB`p3)s#udliYz$Z`YA0!xX&<#9*G62@50E(R8x zKL6_%pEi*Wg>})fI4|UzWX}MQCwcdWpjjq@m=?&{;HPy8vG7~E|yit>u=gn&31#iOp?tp z1uTrL)OFGcj)B0qnlPi`zT5hE;*VQecT`9Cn!Ulu!sncdxs6ReBi~47jaG$)5n^5hJszACzVTmd)IXTD&R}#4R ztQ2;dKc=^xbw64#)q%Y_Iqc1i4mVgS)JJt3LN0&Q)8$`=TY#j?-*rn#SBP9M5M3l_-EDJc3r|b z$Ooe^SmcYpGvG|;vAXkLjZL*1B%|OA^1u`o^BcdPY$OXv_(1#XJKaqhLWnLr%r{uF zH!bg-GJ08r^LkStia*xt;*08YYyaGJn`E(%T&7Lu2Q9FIYJOa9bO)&hhaXN#sdNeB zBu02NYfi?j;)#<7?6b>94Dn6isJz($~uN=PTZo`9f+^uy=oVT=-Ap5mg?Nu zSSnrl1yNdLR>8rwgNn+iT3d@?RF3N`_#-Kwz&dlUR6m=%2+Hr?&Af76?e=wi&hF<` zg$XSl6X)^(pjLC9+=O8JH_MZBp6A0~p~)OP>K=N>uT$a9 zE>k^W=$p`S!`dMnrN7rx%MEI2#z|wJh0Ciz5elhK+maB%##gdV6Zl^zI^cRCd|7JH zj!4c-6p%-pT;6<(35^qnksQ;X@X5;Ua(PN^)+Ovm>CX~&E~Ub7jMI&kF=Lba4S`Q? zmGh%q4}H4Ut>cd7bF+4A`aEw%EH1O(md`HgBf`Tyx#>x~uUNFNbJ6tB_i%l!Bf?EW z@@4CM^IHkGV#VQC)zbj0N%fjibl;hMJ5vd!HnH*Y1Cz*4ets-@D`~&H*O{lCCJevF zDf=O;P^M*g!z~CW%zm^~U6cE!zV^#FBzO}Q0=t!+6Rg>_oYyZ0bTgmo5s z2L-88Y44a-jpegW`JecCP?_lHx5?2-OJ;XVu}8Sv`S?2x306_RQWC%SZK2}FWv*Dg z-_mEGvE*=^2WXAyEeOHL#i1UyLDL3R2~F6vQZ+MsAl13J@?RQi;8>sYAT+2;+%eUhBUqv=TPk2ZnPy=^vJN9EDZz3IA@KJ4*kNH^P`CSG+OE7qK&9 zK1iphiR@Y;bDv4tQe_5{fi8|zkb#8h#MH!@CV-+=T4S!`D;7F$Q}%uBw3L#tGalt1PeNotq!uIOO=6L z;Hs;XhFcg+9J`4+3o)f}wa57{kgX+Qu5iV}En6W2aBfQ@XK8gmFF4Utonn?J75WiP z-|%^*d%hw?=Fb`$BNcxiZ^vMB_$6HFfqjzNTqxXG1m_j&=Dc?2@cg(+`?m4O*Qe}V zZ+|##!9`11Ik5M)4;ed(4-Y6w+)9b;`n9kQHocH(8(lRI5qt}4lQ`0QW@U}zfj4sV zlL6hch}#gAY;AiV#aOOD4%i=_guY*_+#N&nq8HJ+FFiU zvg7c~(Nk?hPWM*Bu|B0^{Ej+GZ1G9+O@7nN50jgm$G{)Gox!6Cg5jESeg~q*Ljlrf z+DS}sBPB;%gl)yx5u!cgj1EGgwvAZU*V1eqmec!Z5bbBweDArc-v#;<+hp2OeMw>C zC(pAR;-bXNKiBZsoHV;PF*ZXFZzHrkx!GL{S;6#r_}m<|oK*p!&~%$lC-9*t4wV@gfg2i>9rc1He>QujVvyK;n@m(_L&>Z z2SF6$p8=7x$I#NGDpL>2bcKKeA|s-Dzd>55Rsdc!5=ay8A|TzZb%Ys#b?9EePLLPIro#H>8j zB83%)8kH*s_CwRIY44@Z*F7OwA)!kCxHlF$-UVc(0xO(zg0`x%;}dtH(wJ|A=MSRG z6(rBM&h?hnta@iWBvA2lX;h14DI7?1J^R>5gUT31F*}@esu}_0G1Ku_R4nv%b7S4hZ@nWapMS8u2Q6g1a20<*hXZju;mLH@6^y1v}(eg3MLSyuD`deDcoTF^CN51 zNd2m%^+Cv>dyBOcRfLk=jBX1{6`59-y^JnPRWI|qXe70kl;8>rxeL;MH4b)__IBh` z;>g_5_j4ay+#DhklHTG3IDW0Zm#fDFFv3&XSQ_ES0_+if>E(GHNf4O6%TbEO`HHD1 zxX4hskp()av?2YPB5Xh18%!#q8zh$S)5yb^w|m8>vZ$&w1W>{ic)KxWT|y}dJ=E8K zwzGBf17HwZVf>!m4Ya{tu=xuT@-rISF^dL_&Xu5!14&X(6v&n?PBhCX>@aJU2+j=)EbDVKW}t{jfWcl`v|KQ$O$r|C*`>5puZcgN zZ<`5_&Iss8$e&rbZ6yGIK{I`|*7NQhKNf*d6Go5IqE9?m@ejKJdf>;W(74Bp>rWp)dsw_yaof7Sq1Eug3J+5_mTW%y}>*9gapt(v2J_CC6yjnguQGFi+SFHO&3lmI4?I z8F*eZAmh=X3ZT>+X=f5Tx+YDRb%Dp#4#g9cB^vqbYC(y6@LL}KE%w@c_=1N%RQfwN zU)*9OQVTcC{hF8H2W}V&VeoFrYS_b%ZH#+8TTZk1EnVcp5z@$n*SDLOcBmHeyk2V+ zs~uf-gj^JSHvcg>;61m-9ks*U8o6+rbnWq-6HNU&7IrYS$Fs=ZI)P16nWx}XIe1!I3;ZxD+yYqZ+&>Q-EM&+RM0 z15=IDDA-hb71iCWE7N(Pi`%f-H;ZFZs966{$HCjycdi+MXFIPkxuAPz-Fnw0J8-J( zR5u6h5aY7x?Y5PMo0=R`3w$I=3=2hsE)gu`Z;TRcq zlfhHk+ltm29|0t)yTYfEB7?zU^0|PWK)F2LJ;ON>1TZg+QE-p4cI3E}mJyFQN}wlKBtsJmQb2qF?0BE;0qG7|XoRNxzt#mU)_gCg;0r}e zu@86v-XNkBUC|sB+$1yHdv|{so!-=t+>FxnnD823%ER=&d~@~f=dWhjZv;A6uY=1P zg^PL@a!%)Z;v*?MUaBol7qv zO6l*B1~1v#Kt$2isE?sO9!QLJb0`bW_cqS^+AyFpJ$NNpuFNRJ#Y`!WwWkl+UEOQ+ zB^YIP!L_%L%`Y5^J9JD!G=otD-!oxf84|JVeaP33fk=a+9T!J4|3Yn`l{K%k%+?8k zSSd3rNi}4hH=ApC?X)?ndv%H%7jzjJUo8yT3-4?FX6JiWT<741M=E^VCpd9i!Gonz zfQms?pP2Xu5TVIZY5a#V)p|$zJu@$kc9%qN@^PR3y>?h{Astx*{uH4 zG?AREnd6-iM!>f(*p`?c{&B#pr-#N)3U|Hc8SJOy%f<;^BnDwed)?>~LgGVBUWW;~ z=?=U?$L<96p-+jbB417&w*o4<_OTr7?F636C6BoKkgqCENELtikBpa8*50y8_%%` zD^9}Dp_b7h|ZUzx8zD0}J;^ zl)t|WRdFN};L|ev{@rR5!AM#}&P-T=+tyFUF(GqkEHguASgANSCIU-!C@QOPecXmx z7UK(-+mexXTHOGpIVpNx!aH4{7eFBB4E+^xeKWB*jW}TvGB;E=&7Oj6NZf({twcUk zQ(}$mI)Ois9IPY)52x@pYfa*cr^v;|#enl55Be!O4^Q8jo3W=VZ^ON<;UM^Gm*YF- zth_4z&2;hvM#+iol)i2ax?k`Tsk@3*El(JyJ2^3gHl1zmK045FcV5L09%v3T%J`xh4~iXp zu2H{cZ$O`uX6(=VSeD3a`vqOEo-5I6lV)oAb|(jU@?NCiI~2}sKoLgTmd-nWDeEL& zo@|qkpzpxf!R4E@sp^!1S)Td;-~DrCi~RD1as{&WHhS+JN*;gl2uJ%{t(xR=hNO_% z^-@#)<=5LJH#@vXWHNJQhs{p8Bw5*A~YVV8^Lvq+;D-@CMhWz0Zh&!=%a%Z148*l+1IY?C)ha13o~qDj?&dsAC7tm zwo1)dSm?;M`MQF<)E9#A4c=AI%zi=W+QYXpaFB=itPtQ%T;t)0HIW4w+l(qstQFJC zwCJ48rf!l6Ju^DCP{I1mFVEdXz#EI?XK~rOFlz8eFdCA-vJVz--1=vZ{VF&ZwGRu= z-^kBNd-fMk|3XI6rDW`AbhI*c92dXy{jq6CN^!K=09T6&ZZrR`7GJC9N&8 z=ck?bcMAHT*D_^7Jo`!0dJhsF4HyDY@>XNa9A^h`OFtW?DtqK766VeiisH@6CT4km z;I|4}^U}mO2F3<{#?Q*cD~W>(mUYQPwksF590m(maO=#SEL z19z-X^AuF}$@i?)%j3D>$QJ@EF_%6-zw^ht(c-mY#aA(a(5Sh-E9VNRY|SW28~*Ci z@e^Z~Zq)&kpmV8uy1z*COX_M;-F!kOpUTf{T)k;=9%)T|{_XVw!u1utr%x`X9&DN> zwAie7VR%<(7j@qj*zA_S*i>O{Pc*#$AdawX{J0{V8QKyhAUN6;R0%1*nt#6Jim>V6 zc{Fp5V@y9|5SayFVULPnag(l@K8QZsDq(ok&_8Szj z0o3|g9wCoR-$O2X+{`4Iom@_#&hT!(xZWgDi-)y6Oq1Y_f_;jsZ!G6w1thvm!$)Ov z--T?N;?IMr^{Uc}xEl_rvv>jd9NARdb$7L|7V0?ausrseZ1ci}p2h@;e1hz^6orI$ z82bht7*5QT=*AW+SFxLrbGj)=nlxhg#xT3V2l{@O2Nh;y5*st4x~lppRmXw)r_{Xz zVOt=MRJ@b<8x$8n2-jk)f-$=LoN#2d<3qN96%a?zJh_xgg0a?!VN^*nZ->3?ZL&_X zBL`Tt_062Tg3wtDMKDR#qUJ-2dyZ` z{_wpUvTBgZ-Yq+~27F~S5WO)@uZaWf(Pw>{yD@k$ReKL?kH5?(?mJe)uo{^z zme> zePd5sj5Np^^e|Iif@lyLVR>`JeJU+NDI_=lh}rNN87`eJ8>%T|TECV$dE? zT5eF55%F6HjZa*rzNRAGTgQy^TXzKDtBy2A~uHO-` zdt^s)lFkUj=-n0bUh+q#Q(Y5F+zj2Bbk)R__W;>>XAq0uT!fllC*9aJ0<-y~75Sa# zH1u4($p{<)9^n<@#6zOaNeFc2y_C0YI91@*K|*f9kZ1Bay+w|jfJ(&98?9iI44p7l zR=lasqvfiE$_D;8XQ})H+D*k84^19j(+YU(bS3U3yW3AeKIE~3K0|?p{i+&XW9>!b z4+i&R90#h8E}2O2{;|_+Gs7%NEN}zkRG)amjN5c2ij$Oz!dqOCrIZLjQ#U7I@P4W1 z2Pj^hJ_?|i)OfRlXNQ{LNqpwjYpARE_@H!6>k6S-A|qF2?9*arF>I0kV5dNz8`fy$ z+uHSh`Wzj1L(yrqw&JaU_ePbs^sbS-R`27G_epui8g(%um6f1$&Icmi<11xSWk|H9 zIBt|=nb*L^GdjD&ipJR5IXB}EzL+80DrAcOH$MCWR z@d_gLImnc<3w7#~%S^Ab<(>v_(3|eFHK<=EsOT#{e+SJSGcCM~%tDNLWp2ok^NAH_ zn1ql*AyAT6L_<}$H$JpJ%BZGKWH}OcBP06)Y73=O|3XLCLxFoE%F&?HEVWVcB{Sx+eZG3pv;}dCj0KD!V!`$rh%(7e^)x>m))&gVS{( zHV8cJbP7sih8T1!z$?@M@BIpIB{NFLR z+VYLo9YB~a426N5^e5tpYIP4V%b{IHMBiLE3FLFaMUAhTOmzc$1xf6 z+fz|AhDUa+grzH@Hl*}tEN}dg(Q;Hp5S^L#4iX-Xcm4Xr7p(e2755guRR`|-h4#N; zo8g(g@kK|1sH`&uMS6NKPB+9UxuCAXQ=Zdo6r26XCT&dOZMu9VnE3N`j;Hq# zFH4i3YP>Nzalq0JvAJ#L4l-fr46fQCLeS=EGE{@?wMole;rWjE1b4w_$A@GfY+ues zj2(Hse&n&m7SXLgHI+v-q9UN>Rf_@b&8uyTlcL!IPBLkq>Kapvt~D>iCrR4`HyRPm zN)zHtSc9DuD0KI<(C)3fg)6gC(AfKN%yG1j?m69e865;_2`#$xjfuqnot59A{xdC1 zK<2-a0(v1_U*s30_76t&1)vo+axkzrvvstw|IL2BNHSonXFyg}T}eq@lt#wPO5e#r z5o|3@r(k5_^oNlp*u(+A{GS1Wf6%gYAU0+I9V0sn;JF%}c~TapKcQI(N3f-tfq=D% zr4a!5dz65K!3%WzZ1TJN;>1h;W$D8+#LK>fh_g+1nU889e_U;D0~te-Lxf-+yTE$N3ThKNr4@$scpS?B-9({C@_y z+8Y@o0RbRpB;bD87`j-Z<{!;@2nHis#`_kKy1$^^q(3K$inm-zJJ&Ofo#mr5&wq}msq`E>*zK^uRXhv9tP-(O(l4(ipAyCq$8>Uv#S)BW~I5*nT z61?^=k&BqREa#aatP-eB2@?UXvF6NG<~0uHI=@`z>f;zoGFeFLEh7!MPymua`y#gY zifO&Xad%=_%Lw_+dcSb`MeRwF`fnpu=+J`}p&AOsmncr_55Op_4mLr026ND}h0LG) z;6C$pTVv3H>SpaZzzX;Eb0StWZ02qV>03ZN^0r>g#IXBM_{&-~& zwXt^mo3$|=kPZl7`75{2M$dnLF2?$w#Q+RSA8m~Q402!-qu&e5f$fc+=K=jSj^Trm zp&3}v#ucFXECB(GjBEf93oAhTx3$pon$PAAfS0oRqlU!nZJccX=EooN|5pFnh~o3A z_F!uV+n2QrKK><3037X|etYqW!f#7)`P4aTVvH`?T{o zo%6M;&|xdpVzBv&(;-8*lRxJsR%i~%98$rXvz^10y+Oo#R}UUpH7RK;vY22F@K$xj zKn~-_kI&G7Li|r{PkSZ-F-f^#g$Hbn5S8Ww}c7gU`li;QQPyt)=C@mx!x>K!6W!=996v zJ>YeD1ZngM5mb~s8wSko286wT7?crF2L{3nmMQd!W2F;hs;0WnH&2USDMI|0{IEcn z{S6o=XvY4^d&Nz=9BzUrJ}3yd7364AgiF_4J|r(TDM+L$$Ok*z!|kR|{KlH>3ljce z{kJidk00#5t2uD`u4qN2qMSymRLTV{H`+l$c)srU0R#HGJKXIbuB_*|1Q!XLA4x4y zovUx@P^;~o*2bJ*xEg)qHy#sE9DO+hpH#C>Y)KZ zoUcLhMxytuMq2%Z`rQvY4>g9FnVC0-hNsL+|!M|s+c-MzmB5N_};D;C3;O~n^op>rsy%mxV^sG&g7k+}lb@@FE=Jhe=MK`55WZarqso3Cm`*td z2i&EvgmR>A{SGb0TBiL|$FU2)0qc9jC;OqRg|H##sTsKrBP9SO3^aEAzhDEkxCilc zg@Z5N@#xq|EJ)Mi3s&H*xx8V&^Vi6F=n%V?Z|VwmI!*LzXX;5c$wV&u)SBxD$VlbM zzmdQX3u$nN>I}lqn3{gDweN57?;JC*Qw0&#{-XLhi28J#43U11ZROimIyG5hlebe% zDB?S$jYL%$bg8~j5Nfd9rPevw<)lT-JXC&9 zp)G3gh9yBbZ~GPY(c3hk0RPS@rdnWhEg~mU28*){Ev0!=4*aSio1L}o*ck8RRRf1s z@3fop$MW+GL(j$buSjaGRcPDr>_XU@WP8;U-GS#m$}$;3jkza7%HeaMXC>Y88%8PS8 zB;lMsY!shG+i5FehG8NJkXC%XpMZ>PO4#MVJAuQ&uj3QXQ;mvZ0IQ zF-?PtwG!n?HlfCuDcq!!_o`cF@96omu2+X~BQfuS?_##`NW!-;KcjoHRN)qUb=F(; znxX!6nLO2q&*Q;}D!hN zSiCS=+g{8m7{YpYYz;mv;16RhN(2A!!P}3RSfl9GxCSzKIW0*zvoP-;n~h+<^T!z@ zv}0G!YZe_+XCIqbj*?vhg>C4>j^BsBFB3-z6Urgkofa)DTn@@?wpYULaQ@V?H7%1% zao0XmKCT_BCQ0&ptlIpJjn%^jo?2$Q<*9q| z+xTMCV8%?x_@Y$yLbKa}55a+B7)2m9yIM6WAJ*+|tZR_)J~qNa%)Y#?1cg#z+utchd#!Pi&hYq8t&H8LVPdK#aCM}BB`DD}8kMZy0-7l7xH5Ypikk<9*QQsUOjD!YP_6BCj6# z9aHogizBm3@=A0W`@1<(3dIHvrK23QA?lD)!YfJ1teIE|qeeoH8qWGOZ=hsJq~~X5 z-Nuuon+a5eQ77CHeth5|%96*jZIk|0U-bNqdy}idA%T-!)vKiCVR7#*oTVrvD)hy@R-IT+tE%aoV=Gclbs?>t3j(u#af=)90cmVD5!og;a@M{%uT`Pjg^Oz} zIw_?cpEYHW>ax@60tF)Sv*!z6C=z-5_3BNpNTP{WbrxRRSZ>zqG%>tBx*IYn59Utl zcf!R6nOzw%*_ljI1Q-Ck+VU;dFyB`p3)s#udliYz$Z`YA0!xX&<#9*G62@50E(R8x zKL6_%pEi*Wg>})fI4|UzWX}MQCwcdWpjjq@m=?&{;HPy8vG7~E|yit>u=gn&31#iOp?tp z1uTrL)OFGcj)B0qnlPi`zT5hE;*VQecT`9Cn!Ulu!sncdxs6ReBi~47jaG$)5n^5hJszACzVTmd)IXTD&R}#4R ztQ2;dKc=^xbw64#)q%Y_Iqc1i4mVgS)JJt3LN0&Q)8$`=TY#j?-*rn#SBP9M5M3l_-EDJc3r|b z$Ooe^SmcYpGvG|;vAXkLjZL*1B%|OA^1u`o^BcdPY$OXv_(1#XJKaqhLWnLr%r{uF zH!bg-GJ08r^LkStia*xt;*08YYyaGJn`E(%T&7Lu2Q9FIYJOa9bO)&hhaXN#sdNeB zBu02NYfi?j;)#<7?6b>94Dn6isJz($~uN=PTZo`9f+^uy=oVT=-Ap5mg?Nu zSSnrl1yNdLR>8rwgNn+iT3d@?RF3N`_#-Kwz&dlUR6m=%2+Hr?&Af76?e=wi&hF<` zg$XSl6X)^(pjLC9+=O8JH_MZBp6A0~p~)OP>K=N>uT$a9 zE>k^W=$p`S!`dMnrN7rx%MEI2#z|wJh0Ciz5elhK+maB%##gdV6Zl^zI^cRCd|7JH zj!4c-6p%-pT;6<(35^qnksQ;X@X5;Ua(PN^)+Ovm>CX~&E~Ub7jMI&kF=Lba4S`Q? zmGh%q4}H4Ut>cd7bF+4A`aEw%EH1O(md`HgBf`Tyx#>x~uUNFNbJ6tB_i%l!Bf?EW z@@4CM^IHkGV#VQC)zbj0N%fjibl;hMJ5vd!HnH*Y1Cz*4ets-@D`~&H*O{lCCJevF zDf=O;P^M*g!z~CW%zm^~U6cE!zV^#FBzO}Q0=t!+6Rg>_oYyZ0bTgmo5s z2L-88Y44a-jpegW`JecCP?_lHx5?2-OJ;XVu}8Sv`S?2x306_RQWC%SZK2}FWv*Dg z-_mEGvE*=^2WXAyEeOHL#i1UyLDL3R2~F6vQZ+MsAl13J@?RQi;8>sYAT+2;+%eUhBUqv=TPk2ZnPy=^vJN9EDZz3IA@KJ4*kNH^P`CSG+OE7qK&9 zK1iphiR@Y;bDv4tQe_5{fi8|zkb#8h#MH!@CV-+=T4S!`D;7F$Q}%uBw3L#tGalt1PeNotq!uIOO=6L z;Hs;XhFcg+9J`4+3o)f}wa57{kgX+Qu5iV}En6W2aBfQ@XK8gmFF4Utonn?J75WiP z-|%^*d%hw?=Fb`$BNcxiZ^vMB_$6HFfqjzNTqxXG1m_j&=Dc?2@cg(+`?m4O*Qe}V zZ+|##!9`11Ik5M)4;ed(4-Y6w+)9b;`n9kQHocH(8(lRI5qt}4lQ`0QW@U}zfj4sV zlL6hch}#gAY;AiV#aOOD4%i=_guY*_+#N&nq8HJ+FFiU zvg7c~(Nk?hPWM*Bu|B0^{Ej+GZ1G9+O@7nN50jgm$G{)Gox!6Cg5jESeg~q*Ljlrf z+DS}sBPB;%gl)yx5u!cgj1EGgwvAZU*V1eqmec!Z5bbBweDArc-v#;<+hp2OeMw>C zC(pAR;-bXNKiBZsoHV;PF*ZXFZzHrkx!GL{S;6#r_}m<|oK*p!&~%$lC-9*t4wV@gfg2i>9rc1He>QujVvyK;n@m(_L&>Z z2SF6$p8=7x$I#NGDpL>2bcKKeA|s-Dzd>55Rsdc!5=ay8A|TzZb%Ys#b?9EePLLPIro#H>8j zB83%)8kH*s_CwRIY44@Z*F7OwA)!kCxHlF$-UVc(0xO(zg0`x%;}dtH(wJ|A=MSRG z6(rBM&h?hnta@iWBvA2lX;h14DI7?1J^R>5gUT31F*}@esu}_0G1Ku_R4nv%b7S4hZ@nWapMS8u2Q6g1a20<*hXZju;mLH@6^y1v}(eg3MLSyuD`deDcoTF^CN51 zNd2m%^+Cv>dyBOcRfLk=jBX1{6`59-y^JnPRWI|qXe70kl;8>rxeL;MH4b)__IBh` z;>g_5_j4ay+#DhklHTG3IDW0Zm#fDFFv3&XSQ_ES0_+if>E(GHNf4O6%TbEO`HHD1 zxX4hskp()av?2YPB5Xh18%!#q8zh$S)5yb^w|m8>vZ$&w1W>{ic)KxWT|y}dJ=E8K zwzGBf17HwZVf>!m4Ya{tu=xuT@-rISF^dL_&Xu5!14&X(6v&n?PBhCX>@aJU2+j=)EbDVKW}t{jfWcl`v|KQ$O$r|C*`>5puZcgN zZ<`5_&Iss8$e&rbZ6yGIK{I`|*7NQhKNf*d6Go5IqE9?m@ejKJdf>;W(74Bp>rWp)dsw_yaof7Sq1Eug3J+5_mTW%y}>*9gapt(v2J_CC6yjnguQGFi+SFHO&3lmI4?I z8F*eZAmh=X3ZT>+X=f5Tx+YDRb%Dp#4#g9cB^vqbYC(y6@LL}KE%w@c_=1N%RQfwN zU)*9OQVTcC{hF8H2W}V&VeoFrYS_b%ZH#+8TTZk1EnVcp5z@$n*SDLOcBmHeyk2V+ zs~uf-gj^JSHvcg>;61m-9ks*U8o6+rbnWq-6HNU&7IrYS$Fs=ZI)P16nWx}XIe1!I3;ZxD+yYqZ+&>Q-EM&+RM0 z15=IDDA-hb71iCWE7N(Pi`%f-H;ZFZs966{$HCjycdi+MXFIPkxuAPz-Fnw0J8-J( zR5u6h5aY7x?Y5PMo0=R`3w$I=3=2hsE)gu`Z;TRcq zlfhHk+ltm29|0t)yTYfEB7?zU^0|PWK)F2LJ;ON>1TZg+QE-p4cI3E}mJyFQN}wlKBtsJmQb2qF?0BE;0qG7|XoRNxzt#mU)_gCg;0r}e zu@86v-XNkBUC|sB+$1yHdv|{so!-=t+>FxnnD823%ER=&d~@~f=dWhjZv;A6uY=1P zg^PL@a!%)Z;v*?MUaBol7qv zO6l*B1~1v#Kt$2isE?sO9!QLJb0`bW_cqS^+AyFpJ$NNpuFNRJ#Y`!WwWkl+UEOQ+ zB^YIP!L_%L%`Y5^J9JD!G=otD-!oxf84|JVeaP33fk=a+9T!J4|3Yn`l{K%k%+?8k zSSd3rNi}4hH=ApC?X)?ndv%H%7jzjJUo8yT3-4?FX6JiWT<741M=E^VCpd9i!Gonz zfQms?pP2Xu5TVIZY5a#V)p|$zJu@$kc9%qN@^PR3y>?h{Astx*{uH4 zG?AREnd6-iM!>f(*p`?c{&B#pr-#N)3U|Hc8SJOy%f<;^BnDwed)?>~LgGVBUWW;~ z=?=U?$L<96p-+jbB417&w*o4<_OTr7?F636C6BoKkgqCENELtikBpa8*50y8_%%` zD^9}Dp_b7h|ZUzx8zD0}J;^ zl)t|WRdFN};L|ev{@rR5!AM#}&P-T=+tyFUF(GqkEHguASgANSCIU-!C@QOPecXmx z7UK(-+mexXTHOGpIVpNx!aH4{7eFBB4E+^xeKWB*jW}TvGB;E=&7Oj6NZf({twcUk zQ(}$mI)Ois9IPY)52x@pYfa*cr^v;|#enl55Be!O4^Q8jo3W=VZ^ON<;UM^Gm*YF- zth_4z&2;hvM#+iol)i2ax?k`Tsk@3*El(JyJ2^3gHl1zmK045FcV5L09%v3T%J`xh4~iXp zu2H{cZ$O`uX6(=VSeD3a`vqOEo-5I6lV)oAb|(jU@?NCiI~2}sKoLgTmd-nWDeEL& zo@|qkpzpxf!R4E@sp^!1S)Td;-~DrCi~RD1as{&WHhS+JN*;gl2uJ%{t(xR=hNO_% z^-@#)<=5LJH#@vXWHNJQhs{p8Bw5*A~YVV8^Lvq+;D-@CMhWz0Zh&!=%a%Z148*l+1IY?C)ha13o~qDj?&dsAC7tm zwo1)dSm?;M`MQF<)E9#A4c=AI%zi=W+QYXpaFB=itPtQ%T;t)0HIW4w+l(qstQFJC zwCJ48rf!l6Ju^DCP{I1mFVEdXz#EI?XK~rOFlz8eFdCA-vJVz--1=vZ{VF&ZwGRu= z-^kBNd-fMk|3XI6rDW`AbhI*c92dXy{jq6CN^!K=09T6&ZZrR`7GJC9N&8 z=ck?bcMAHT*D_^7Jo`!0dJhsF4HyDY@>XNa9A^h`OFtW?DtqK766VeiisH@6CT4km z;I|4}^U}mO2F3<{#?Q*cD~W>(mUYQPwksF590m(maO=#SEL z19z-X^AuF}$@i?)%j3D>$QJ@EF_%6-zw^ht(c-mY#aA(a(5Sh-E9VNRY|SW28~*Ci z@e^Z~Zq)&kpmV8uy1z*COX_M;-F!kOpUTf{T)k;=9%)T|{_XVw!u1utr%x`X9&DN> zwAie7VR%<(7j@qj*zA_S*i>O{Pc*#$AdawX{J0{V8QKyhAUN6;R0%1*nt#6Jim>V6 zc{Fp5V@y9|5SayFVULPnag(l@K8QZsDq(ok&_8Szj z0o3|g9wCoR-$O2X+{`4Iom@_#&hT!(xZWgDi-)y6Oq1Y_f_;jsZ!G6w1thvm!$)Ov z--T?N;?IMr^{Uc}xEl_rvv>jd9NARdb$7L|7V0?ausrseZ1ci}p2h@;e1hz^6orI$ z82bht7*5QT=*AW+SFxLrbGj)=nlxhg#xT3V2l{@O2Nh;y5*st4x~lppRmXw)r_{Xz zVOt=MRJ@b<8x$8n2-jk)f-$=LoN#2d<3qN96%a?zJh_xgg0a?!VN^*nZ->3?ZL&_X zBL`Tt_062Tg3wtDMKDR#qUJ-2dyZ` z{_wpUvTBgZ-Yq+~27F~S5WO)@uZaWf(Pw>{yD@k$ReKL?kH5?(?mJe)uo{^z zme> zePd5sj5Np^^e|Iif@lyLVR>`JeJU+NDI_=lh}rNN87`eJ8>%T|TECV$dE? zT5eF55%F6HjZa*rzNRAGTgQy^TXzKDtBy2A~uHO-` zdt^s)lFkUj=-n0bUh+q#Q(Y5F+zj2Bbk)R__W;>>XAq0uT!fllC*9aJ0<-y~75Sa# zH1u4($p{<)9^n<@#6zOaNeFc2y_C0YI91@*K|*f9kZ1Bay+w|jfJ(&98?9iI44p7l zR=lasqvfiE$_D;8XQ})H+D*k84^19j(+YU(bS3U3yW3AeKIE~3K0|?p{i+&XW9>!b z4+i&R90#h8E}2O2{;|_+Gs7%NEN}zkRG)amjN5c2ij$Oz!dqOCrIZLjQ#U7I@P4W1 z2Pj^hJ_?|i)OfRlXNQ{LNqpwjYpARE_@H!6>k6S-A|qF2?9*arF>I0kV5dNz8`fy$ z+uHSh`Wzj1L(yrqw&JaU_ePbs^sbS-R`27G_epui8g(%um6f1$&Icmi<11xSWk|H9 zIBt|=nb*L^GdjD&ipJR5IXB}EzL+80DrAcOH$MCWR z@d_gLImnc<3w7#~%S^Ab<(>v_(3|eFHK<=EsOT#{e+SJSGcCM~%tDNLWp2ok^NAH_ zn1ql*AyAT6L_<}$H$JpJ%BZGKWH}OcBP06)Y73=O|3XLCLxFoE%F&?HEVWVcB{Sx+eZG3pv;}dCj0KD!V!`$rh%(7e^)x>m))&gVS{( zHV8cJbP7sih8T1!z$?@M@BIpIB{NFLR z+VYLo9YB~a426N5^e5tpYIP4V%b{IHMBiLE3FLFaMUAhTOmzc$1xf6 z+fz|AhDUa+grzH@Hl*}tEN}dg(Q;Hp5S^L#4iX-Xcm4Xr7p(e2755guRR`|-h4#N; zo8g(g@kK|1sH`&uMS6NKPB+9UxuCAXQ=Zdo6r26XCT&dOZMu9VnE3N`j;Hq# zFH4i3YP>Nzalq0JvAJ#L4l-fr46fQCLeS=EGE{@?wMole;rWjE1b4w_$A@GfY+ues zj2(Hse&n&m7SXLgHI+v-q9UN>Rf_@b&8uyTlcL!IPBLkq>Kapvt~D>iCrR4`HyRPm zN)zHtSc9DuD0KI<(C)3fg)6gC(AfKN%yG1j?m69e865;_2`#$xjfuqnot59A{xdC1 zK<2-a0(v1_U*s30_76t&1)vo+axkzrvvstw|IL2BNHSonXFyg}T}eq@lt#wPO5e#r z5o|3@r(k5_^oNlp*u(+A{GS1Wf6%gYAU0+I9V0sn;JF%}c~TapKcQI(N3f-tfq=D% zr4a!5dz65K!3%WzZ1TJN;>1h;W$D8+#LK>fh_g+1nU889e_U;D0~te-Lxf-+yTE$N3ThKNr4@$scpS?B-9({C@_y z+8Y@o0RbRpB;bD87`j-Z<{!;@2nHis#`_kKy1$^^q(3K$inm-zJJ&Ofo#mr5&wq}msq`E>$ {\bfseries hg}\label{structdynet_1_1RmsPropTrainer_af700a2a0cc9dc136a98a7260522c5947} + +\item +\hypertarget{structdynet_1_1RmsPropTrainer_aef4e1f6d56c30ef3d5d1d01d2b2df918}{}std\+::vector$<$ std\+::vector$<$ real $>$ $>$ {\bfseries hlg}\label{structdynet_1_1RmsPropTrainer_aef4e1f6d56c30ef3d5d1d01d2b2df918} + +\end{DoxyCompactItemize} +\subsection*{Friends} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1RmsPropTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c}{}class {\bfseries boost\+::serialization\+::access}\label{structdynet_1_1RmsPropTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c} + +\end{DoxyCompactItemize} +\subsection*{Additional Inherited Members} + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +/home/paul/dev/dynet/dynet/training.\+h\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__coll__graph.md5 b/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__coll__graph.md5 new file mode 100644 index 000000000..b9448d52b --- /dev/null +++ b/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__coll__graph.md5 @@ -0,0 +1 @@ +7aa574f2b17e85187acd5c4123fa845c \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__coll__graph.pdf b/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__coll__graph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c942599b6797aea127581c40bdd764313ebce401 GIT binary patch literal 12731 zcmb8W1yozx*1rwKt+-PNP+Wt%yA&_Q3GNcyt!QxyE$;5_QYh|F+}*8M@jtZZ+z2OEUJ(`t7;aTx-s`GBS3aP$-H?FaR0Z5h-eq%I*+Z0n7kf0}DhxJ^+)Pv5l#t z8G!9sQbq&-08A3*R*uHt=d%^a(OAsb(ALNpQ9uCE!4Yf>vPN`G$yJh-g#x0rjh25k z1WWPESrKnk0z`zzn(8M+E0>CD1nT^MounRGXu)8|ME7&{d+KeULBAf{pXSm;D|1;T zZwfP#WNYlP31o1TUvHW0*&AgdoPzMN49bxr5n6+oF`0xUiLs4-MV6$lIr= zfi~$Rf!Lty5@Xnueh2(n$SH8c2MhfkBC9;#1%H*AL&T8ryhZXvEkxG{bwSJcp8G5H zJ=MqrF#CNE)Up&)QP(7_?W)5r9^)FyKK7?eL}MGHzvA}%?j_sew30J*sUKz0s*&TnhcXP?jJ4uF?(`cpfSU|T1js1UYf+KfhRicAB2I55>!ur+Y zcXlq)W*L4G1ZD(C(L#0z$7qWbLeE;oD$ZLo-_>`~l2>gzhpi`#C!-!u%dS&~j#JtW zr5XoX?Ck^(+4$zQj@(8isSLtlBWQSVs8sdTLQscBd&hZ59}DbveXW)t6@-NyB_#Nn zhtMxb=y|ds;rC&kgF+tZ6ka2~>P&m}Q)pJDDJ_*(sAmZWVio4}^wUp-5JY$=*T%-c z$M{`jY?xW0REBZOnoihuhgq6Um$S2-iW?;zS{8-cNG&8gGg9@GJyCA;H+SP z?zlkp%P)ZI8=vb&fc6W8+)V3?jMS&|EzPd~lu8I;W{pzySPFu0gyx38`WC5=i))Gs z@rmd_P%VvMYt8i*L&y}m1wvS8ET7^*>6gccun|SAF%ru)ob@fJirH`aj9J>+915R@ zZNnyqgD_wD+w+^V&SWZ4@S6F~tKSVgYiK;-sGkDM< z&_6ov%teK4ZVLFk^&|(|z|{<4ha?-B~BO&@J%zwhA4$j5AoA{>K)_7z?d_7?D=dJG+NbA_1Jr^D;OFhUB- zc*=dmf}Oh$o$_O*o<-6h7`|b92XTEe+Fm}C&ZmEbY=7}crvtSM{mQN%@|)t0AYcFR zw+CDrx`RWQ)3sIfbvV0IL?j5;1~)fIvR9rE?LP33kNHrkvPkfc6x9n879I^Jhc4c;$&HCcSMsF3E#b9NsU^Z@r{yYQIK zeOaHdXq($ke@pU)wuzVL5h$A=*b42+5=SV6a=P#?QfSv_8!ELUa`{QL+sBB&|8X(- ziI>6{@6;TH1x>5h2Zf*m##sg0!>^>agPE@RiRB>uqri6pXeVeOw;LqN1*v z-}$yY&O$;kz6)VJEQDTNe|-+cccgZ)67{gx`rUZz@R#FL{wWDM$Ohuev|b2qNA5Z9 zbENhj2t(l^8+@N6_!bocr+otWAQ;D1GCC&N9%02HwBPv%r{!z*t*ok)o;U!eTWZ~r|^th zI~-dY_Ta;mStd2EZOT&CEW6D+#4yGnZWDMO?~R|cVP`=wZmHA3aBQPcld?e%$CeXq z>d=~#SbbKCUw5Tyj|B!GV||yf68T+v-})Y-5GoDM!W4P(9dYT2g$y%7*_dlA$_e0W z7joSzXwIG^TnYsDYPSFvdqUWMCOoXO_Ntw{;?xa>m zoPr2nEMfvx-hb%SS&ZW6LG(6U66B+VC}viJ^C>8HGCr4dgVm7?&9MAJ7Q6V(1}-*y z$*J*uFuK)z&-!MP-%reFn5E;5a}6tl+%pH(@Ckxyo-#B|bu&<$KpcK)lSORR7__*7 zp+iAM$S=)pO4?2wZ^_Ey?W@qK?^G+hq?|`HUurq{`IJay`#W zbe`3s-b5I~aDynL8dU1v7d?q%Vfua7vpQ-5`br$!q+eH~E2|CTH+=kp!(m@cn&=-q7T>0UmM zNYPm!h@-CwLy0P{CMhy&c<&3+yENTUD=z9?(RN{pqah4dBe8B^h&#zuO%L{*@}aTd z79kDE7}rXaJQEtyv>(AFQBkU|ACqLrd>_T{R>;qN_~B>mwv-zv)o!>lsWw9U7L%p; z)OcY={S-q36D}S29x?px^V{}!EgjneV%PUKgHpX^subXit|((9ScC7E;$K7_FJpZe zqTpp_zs0DowoFumd=$bkoOiPJY|;lpvU)G6WL))N~4WZzt{U^&0)e28T_ zuM~d*Hh6-rw7&?RJdnf-qA7f7~*`ZrY}znD#{Qe3J^Uv{84_XSXr;Z-yGj3MS0}vIb5zSHGHl7PBByn8{mJ4 z3C*R}aKg)Yp=;&b%~Jq8$)*&4YsnOUnafjjQ7QZwofF^uF+KJu zV>WYkE9BD4TPzeM#!)E~Xqir&jK|7QZ<`vdXK5t@DC%U$FM{!S+agz?H7+zUJ`JQ# z-r7i!V*$7y5BNIiKv%y`46mXBSg?BBu#51v?JVc(yJ02BMYpxJ-ZU`<-fDe7VDDH3 zLd3t~nJ)HjT9STc##%k~(AO;7Scj#orF#(;I{N+e;$z^Aj0Ugbv;xb=PSTUoV$u{d z&%zpwf=BEr-14I{(?!%CO^Y{`2EqJ88R7(ftsE}FtRrksUFLH1UezXqgqbzLG0(P~{dqrT02eA6`&Fu(i5{H-;WRi#&OiKV}+`w$Qr z+D0`$#}jkrBf?K7H1@)@g-u-E*X!4iPN<;i*ecs)9^;Ocw}iH5B?bdisg`nxY0)*E zFa}Q9$+48EBw33m(@UoMXwalPHLxS%*!y$UgVYp zQR0LQZ;!Oz7%J*sH{U3en!TE%E>!HOej|b)Te&MrHZ7MU!d9E##2mMx$EY@;%2awK z{%%Eva_@G{^I%>(TuNPO0b(bNBq`4|yEbo4pMpslMVRrDY?R)DxUE%)0sVvC{jWK@ zHMQ4d^0(U#v1f?`dXU6d`IHYAx;d2^^t8z^Wb)~VF_rImD&{#iD4|1i^AZU2NWIif zy;Y=IRP#D4EXm{`TEBQ?dys!WQ~LGmbmx{=At`k^)Y@ki9x6YJ4bo|cOEAbkCwA#8 z26@=ZlHzB*vEB&7KB|wgY$q<QhVqbZGEqq64ZIB`p1jdMIHvO=`;oCL)F#roANg zT7~3n6uqbWTHR|BCCUpujf}U&??P$VbR-I}@IYkkn_tLM?=XrT;WHzR2|Of{+(*dF z6(M|PCxRBp5GAPHwHDE>I^LfN2o>59+GmrJFLp!5{WR!v%uPUuij4K0k@6MTR!mfZ zskO!pN}lDM_h2Tx4hVQRJlKPW@8V@=v^nR}nIZey)}|1DW0;}EYau}*fc2sh9g66j z9R1^nd)-J6OYR#+ljR<-dPYy0{NT?Zy9Oq;qoD;u{^aEtc}}Ywo%v1%sqZWb{=OL@ zA8>=rN>ik(-&ck5dZf%gkn8l16e*++y)UL#@RXD;!#%JjJxF*ENmzaR5NrW$tPF|YZcbx#hht$P>M z0y@E24z*j9Hzdzd(2)vn>r#ZAzN?p3qGsLIMcyw-Z2YQQPfC}#m#agL{idR_Mzgl{ z%q2>k$ju?8nORir-G=eI29k-iG8)-rF*UsEuD8ZC`s4| zZ@o;s9-P*GnCk&nJ2ljP;G0SNOo4eCB-XnLqxD6|R-1J%9BjL}N2RgwgLj+O9kbwO zznk-<=(gd$Fz@Pi)RY5%6@*5PZF9csk*v7t+pG-4 z4s5iK%CeKu`^+`X{NPE***@{QE0DTJ7~i@n^M^JRwvn&CccK909a_8kii=?zc8E;w zWxkG{rQ-;EC-iuN<%VgmG^nc&tX($JCz&k1iqOkkG*Gti$sotp9@h@dnj-@(`+9Ae z4k-%clgkaZz&`%WVZvRhn_+a<+#tVwHDqbeRsk7Y7LS5^c(D`y$#Mltfw-?hC3XQd zIe>+qQQG~ zS;)<)n52W7pJowibo4Y_em7PFzT5I3E#DFSCVka>SXtPF4iCtN+l>bHp7S{}T8z^# ztReYVzLzrYTHop6=sjc#Dq9sxxh?R8Clx&(=Hk&z_`!y@D=+;p;m`kT7&{c#hDTbc zc|{qP;Uvq_dT>X5WR*9gkZOe}iS2Hcf%Z{Mj99&KYoQ_G+_U=zQ|#N$X~(^LdxySc zF}ixG*2po=(u@U848PJh6_E8#!@NXqdj2>{_kadGRP^+hkQL%=`To-`arw{1N7B7c zg`>xl2lE>4C~>6Ou0a4*-2QjDHwn2_m7m~r>T~bWDBKp-;HP2HUhBm-k8UOdCb#7w zezfwH%aJLC;sTq(nwR748sd*vR_@=Op66&lYPb( z>6ZO!|9 z>xI>-hVJVO8ZD{)Y4NnIL?Uzfnb(p*nUC-rcf=WmX2P@{^%^sm8Dw(i82$=ZEL!*8 zoaA7#si9hweleO+E@Ny6jDfl^Yy@=0k>w9g7~6LV^{&+6o+tL~KY!MA;wK7icxBR{ z3(??5!c;2XL|BjNu2NYB+bHeEe`Gferj4i3_T!W5Sr1R=3mFx%p>y{TGQK#bvd&Lv z<#!>69mbQXMt#UQ8lkl00{ogGw*)6H<>d$TB1R5>^KxY$4=KoL8r;>;+Jeh%IuW43 zb)GV1zxB3TukOt>9{$zH)KzB&@DvqIANW>34%xeRY}rS1K}FYt?(4m9}6OH}Dt! z7Fk+}q$r!D&dLS9Ug0&8?xY;@BCWF|@{p_!_Bo|oKUV{x%+1#oEY8#>>orDmB@!Z- zXq9l1j(`%l>hwY=$#^F{j4q-SV)WKTbuogK!{9~6{A<+ih0Ckz<=7So(6Xn?h5qfV zp;%S^tj96@9MXnPN@A=-?}J2 z034d~Eie`M<>HBVwE9YX%u$+%Ru1oi9v*Wnd9l!Oy4?9w<>xA1mHonX=O5CAa!75R z^c1M2`0{wGXUY^ExJnRkdtb{^T=I+P$WuOFY*9y%_rkr?p_0Kg=q)Njj%z6S;Q(Is za_iSp0u!U?hIMlsu|PXQ%$YUz2OV%RU!a-h?rxA-o7qi1 zmZ`~z?TT;0X*VUN(yoQdpC??M?&mzvlMj$Iw|=A$L(X_bSh%+?Q?*$Z61-W6<*;xU z5w&y8prT|$Vn@9n&bGm#Do?IBfUzKEOg~t(+RL!~&f+^GU7$zu=Hj4Dj=T|lHXKr}c1Z@S&RGD6sg`i5h0xqfPyl;zo zPt0AptMrmszy<%h=FN}N;DhDIc@h(IN0=$f<4Z>kIB%Qgrc)l?H6pQ#ZXb43C0v0l z)PU%;^6Zd?4CKq&4sxGfe2}Vr1WpvargLtDJLuXM`=JA&JVT(%t>-9xklde>GSu7B zb-dvC?o5?Rk|pKvi0c7*Sdp*<%kqp8;S9Lh%YFoh(*gBNM#(45+DeebUV?jP>N)1@q9Js? zlya-i#)qegHa&A?8krFO=Y{pESJeFB0aJo4pb==Cw%ww_2!}Q|X~ivdfD0h3-NSNzJB?Q#?8 zt=TlX>%KQuATpk;Hk8@Fxny6J;^1|W}hj1{8 zQ4l#HCHvGtLebou>KfBSX|TUv2Zh8 zaegMLc!qRpDWF3OapBhz!GMUJy27NY0eKQNL(9^8sSn&+)!X5#oRvJvl^)7TRq*P^ zst?-^6}vL<5?f_Z-1-4m z4Cqdm7I%#8X=VrdMYOHSnwJd?l^>XCbX3gUKONG2l}3ILv)M~AwTdsbcfWKKhr&Eh zTOT2WXx$78A2!$awyC3FbyC`NX(L0V(_pH*6TZH(nw@AI;a!G;(3(~JH4fm@oLW{+QWJ?El?RW_`y`;@&cvww@$(o4O_$etg zzWa^Ng}11A$iML{iR*$ZEAv!|7{yy;EUzdb>>Uw)Fm%ndU&1!qi0JodGm!)YoSx}t zfE`SvbNnw;GTluAZY+feZtE99@$O)2>x~iz?|KLD8ic*YVru3oc<~v_M}dexv$N2S zKezMal*5ILeCs3B(h!uz;DK?h0KRp{Y=!Ef{$ku~(eqgeHH7iT^j-7O+<-Yn+@cE$ zNSgJ>nlgpMTngk4UTZYR#dOW8(M4~J{qdo?M;05%s)g^NUL-(NuFyo&e08@wdZQ&F zTawEWmRAXlo=VrQR#^7UlFlHrQq-@Qija9);rnhEQP5%M?O>2h$-mW=7yeRnyHvj&@U;_U39-CM^Gt; zK>+7%ejnd>NZeZMch4=};AzJ2a8$ifQ>8GuexS^2+3zGErai7yZ0u-xmIVczb^2+J zfGL&g^a!a?DdA#eca-7O!sWp=IPuq2B)Jlo2v<^tbJcqRp9BG0v#zUK>gi>iUcxTg zlTID)`?7Qre22djdAn%GLSXL|*<{ZL4!R6WXxQZBtrZQ~1U`O`*_XkeOxENal*qlM zspFSgD@uB^QmRnJV>-1M`k4>uDFaVSQ{)0FCX(Q|*7gjkQTC*JkSvcD6V1>%i*VRG z*w*+#hKRCss?JfoHaz)!8)v`%_M4mF+KKiIS30@}Q9Lv9GTB|UbYk)Lfv*<^)b>5D zDwN!PtX7J|FV3p1HtidQj{0UA@sIKt8K>vEwk}vF%q^&l>P6RFj-Y0ARiuU_d{w=a z9XIaba;kO?f_6zgDzYO9j4S$-fcVM+p&woVdZF3xmY|*xQ5o8whP#rnoG|aYa@F3} zEK@_syMX-)Zv1aXO}aVehm78%#6=a;9|F!+15i?i`ff2_rJC{lTqI-QJfMqUYId|X zTWH;>;YdFvdleffd%*zPc5;^zbdH~Z*7&M#&ZB>0pew%WJh~FPK|D-Jo;C@3d^zzj zqymQhG|4$ul_p{PL`w~$4$&i6cLbmBD!)3DvH@v_DBfuMdk!>}y`4newiUTlT~GMb zm#7fKFqIs#-C)JsaYvSujE{>GlD$6tu2zY;4eI;0w@NtGv7YGyLovG$jNdVD!&8jv zt`%#81&I92g~D#*FlDQaYtE>7TdVic+>P&{(5x1_?i!}{xN2GN$(zPJsHE58nKrlu z+XV(hHevO4j%er-V zufE+GDMX)@UtYm}7-PR#eJZwkGZ>i^UQ-tKdLJCwdRLdLES|u1^~RB{`^rWuh%hg5 znXretgh%vDD4|%*Rsj2xZyRWcCt@{+IEiQEGWTdoR0SDA@a}VK`1;|yARWyFJ-xNL zV%=rspJU50RSDD(H~M4NuuEl3)W^#b~fAhU4#lWB>y?Ga9e zC0f6uI%~FGaZAcD>CzDu)pB{4PZ#4`r)nbaV6Ppp5i^aUIZ3~(7H-ABLa&TkAum?b z5S}BE#_;BNWZ#;sJrkFSu1ECmAVxVqlI^tbaJas!(c^OrLzo{|B1-)t5U@57ECaik zt^zeU6hLmGro@FD3rD`jlrO{Sowg+|b>kuBLGINJnw-N6*YBQN+DHfX&(ApaxD5^s z5f$FvG#^3-HFwq1P!J=7H_qSG{2)M30lwnU5O#8y*iI|82rEBwIKT!&%9)*g=oU=< zX(@9IN4w;h%Kgzr+Hx69w~IbKIB*`X!O66L!}_90W^e&EZTLr0&Z`9W_bH!%h#%6< z%#G60$h-@<-*+0aRk9bprCEM3kz8a*!xd2tKB78;!W;Pj-~WkP0Fbf z%&TS*i@t2hszeK~*2de#s7z^3*Cc>;nTS;?qWo1gm9sOdI=0XO7iu6C42WFCxK+Jr zPYQo;M6Hs#YR>K52L1-*!PG3NaVj;w#R#|KX>%Hn;Q4uTv%x#Geb$xTRqFg6XYwOA zLQz6nX70p5%tAAi)N6y8Iy99hLiA-mOxPQ0BeY3M4Wy`ke{gk~?9p;>S+}y8{?nIo<^J#z~kB<<%fFkkIxL2RA+*ry( zT_O~O2(@O$2eQ+%1ePRUw>rjz595iiymq0_Om`2mv1vA+`I*0+ZJo%o=sgc7+-+!G z$9z#y7BG;55-hzQ!e(O+LiS2{{^7NX`$td}#pgmY!5*_quQa?KeZpAkSm^-x_$UWm>>Lcun_z8C)2ygOU6cNO8A8^#g4|-rlVDxV~rfUiMHJQ7+Gtu zgiY=bEb?6K>Iqm6|F|-+L#-S%M{qf+4?^IFeP9(WdCk9kKAo0hY^4e>bqhXx;5;GKJWsh~?-IwYwJ1$D9QSbb-5s{|GH?5-7DeP00Hl~e zJV0&BU$($&zi>Q2A$NMRIpwkY*exAZ1zjZW)o(V8n;OR_Zgt7CgjXDf_^tV7hA0C! zn-kt)TZT=^EK6t1BZn&GmcCpHCYQI}Y(o)f$c0053I~jcl6zbZ6#R9w6$Ouo@5jxG zIrJk-ozpiayWqn|HrA{GJ5if#l{CYVOt{J0o2b>)j&mb|=3EQQss4W4nNrrzJ#B(1 zo`kx5wi+G&3^G3VR}iiKuzE6gJNF8mor4tf>2GY+@5R5ccjK~ z`DTM5KHiz==aEu<@6;f-N5tEg@$Q8Jskgj~M0{hq~hop1hWURb6 zba6VqLR%i6|8<&HG)qzmf}(~nS|fGEXKZ^V;RZ_0^xLHPxLj%x@4EXA5qDeTEG=I_ z^N&2v_q2^}5CWlAw?o;J!H|8waIitrcE_0N5cV{CF1(L-F6SP>K^^XhkFnD?x=vM2 zK{~mY84QS<={!9uA7SJD`(lG&%;HGwhVCyC&qJBmjZDuw2SD03*?4ff2j)|^LyU`7k~PUB&CfHURnNCM;J zVCtSW}q+}2S-PaX&H+Evs+3B3}Z}SNe^{8Z5d`L0v?Dk{^!W8RCw@_IFG9<6t z?R>r0?s$|TPuznnHB=fVH4#^p4L`@ymABYdr>0&!QeJCpK${wBmgJ9p+v{YVc-N%Y zY5*mlTmTsb!YW!~sA5^|)o7R_izHZ>ikDg~}NX9iN z$&Zb4k44SZP?hY>ea5AUQ6H1DSZqM$uqinDS-nC zZ>$ET(`t{pZA)4U@Uj4pm!bwbjkT0xDn*a(g}h0)*i)$*WOt z`|*&?hGYxZDun{7ixJ&eX%#F&EbZwWuc77@kL{PNr2A==(IOpw$E;I}AyQl}XtIAW zDiSf?8vCswm@~TG9;tcvTSdZ$-JD!B@b zn_EWCp!{KtghcpvFU}uwYc%q$cTKvjgX);I>+H zaVwtE;YM{YRP`eUCaReCjBNUErQtg^7QXeXVC|Hl@RW;fsDe9Pxjx>op??Lc4LIi_ zc=AI#a81_96;8IEX0S11o%b|8DW#4U3Ot_nv_RJ3f2I-60u+$VoFWeGn^bZwTgt+@j(9~93;b#y;8|+ znKx!Ezm4Y`V#g}L6EKz__$>8dojj_hu=^|L+c^mf+}>am_fYfn?CEB&Uh5(KY!93* zGP|UmI2RfdbkF!h<}Wc9N^W}%kwK6rW+AJe@K6j0*hyY5^gccoOGOQiqgwDPBg3L* z3sWzN*{mheoh$^ol_c44FPa5ANo|dFs(G^)dLlmLyyFXbM9boe)k#vysdNV&ulo@M6FfA{s*K==qYaUgjW1%R z4qS9R__$>}`S?9iL6;B-3sDcvA;3EcUHkbj>W_@A_$-M@KIyTi!3q60hxx(={>5Pe znSmV4f5Va7f9d}qV}UQ^j14p6~@mEoI6~Fh)>jN~yT?gGe;%;4<_z za{>V(sBU*4ZKsLXtAbafzDN69Ey&9h1p@0Ol5+Z~oakR}2-rIjMn^uG!1e4o^2X~Z z(1y@bMIFT25wxTRepd9_UX5KxOg3drKNW@$x+F%C*cq+35r{k_C?~yN{U{*Ja7&Cl z@3~ZrXlo%-AoJ6infrL6Y1rK7`wRh^^VZ_&mkTR91Q|os$8eEpC)9~~-3-nrgJD0F zcklI7v3{O@9d8@0#DofM7Gq*Nya!>);$T27zn>zh5vI3bp0NDQ3LF5nD$^hhK12C{~u>*k2EYIX8 zJL_L~tF$A?%G^-c#?;Cf@CODJb})RwW1mfa5ArgJm-b8N--0N}PRiKa)a>6TDvrk1 z?*UwYy1z7}{%*WX`58+!2E2f){{&fIpxyso@bB?eoD3X)1G_JQ0REOlKn}()L;ZiR z+#KxSC~5`*16cpUTtR=efh>Q9`JXWb{Eqsck{7pm2Efg2OrIT?+X&k@nEx&OcCT)3 z{12}$9@PF^g{>&%8TzNVF{hk@X^1I)Q z&c*sn^Zs@1&vn)ph56a$AM<%>|E8RuY31kJ-{vnAJmBTS;h(Ac@7jDJsU3btM%LWu zB`z;>QT`V%?eqdy{{vbE{u}&$W}ct<`sacMP#c2G!L|S(Ban@e1wd`)=xE2o^o)Ez zi>6?Zote3z1EVe2l!oTFA4RaOk(1#wum6AV_HPs%_|HEA{MlWipy#r;HT^U8%WD3j z!T;UK6>MyR_{@T{Au|8#0pMVN{y+ej0RCvtWd(fB?aKpT^OwfV%m#d}?f=l2{}+vw z`*~Xb!wv}K;C>GF|InD3*;$@x`v1^4S^v{7@OfMRr{8Cd?KzqMqc0H1#`2u4|J455 zjs?i|U-M&OeW}R5`#OR_&pR9Z`|lOcKYAFy#Oeh%SGKi%&i}t@d1)Jy=RE(5WOr}` WfgOKG7s$fO!G=gdA+8{S`2PTu6b%*t literal 0 HcmV?d00001 diff --git a/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__inherit__graph.md5 b/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__inherit__graph.md5 new file mode 100644 index 000000000..b9448d52b --- /dev/null +++ b/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__inherit__graph.md5 @@ -0,0 +1 @@ +7aa574f2b17e85187acd5c4123fa845c \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__inherit__graph.pdf b/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__inherit__graph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c942599b6797aea127581c40bdd764313ebce401 GIT binary patch literal 12731 zcmb8W1yozx*1rwKt+-PNP+Wt%yA&_Q3GNcyt!QxyE$;5_QYh|F+}*8M@jtZZ+z2OEUJ(`t7;aTx-s`GBS3aP$-H?FaR0Z5h-eq%I*+Z0n7kf0}DhxJ^+)Pv5l#t z8G!9sQbq&-08A3*R*uHt=d%^a(OAsb(ALNpQ9uCE!4Yf>vPN`G$yJh-g#x0rjh25k z1WWPESrKnk0z`zzn(8M+E0>CD1nT^MounRGXu)8|ME7&{d+KeULBAf{pXSm;D|1;T zZwfP#WNYlP31o1TUvHW0*&AgdoPzMN49bxr5n6+oF`0xUiLs4-MV6$lIr= zfi~$Rf!Lty5@Xnueh2(n$SH8c2MhfkBC9;#1%H*AL&T8ryhZXvEkxG{bwSJcp8G5H zJ=MqrF#CNE)Up&)QP(7_?W)5r9^)FyKK7?eL}MGHzvA}%?j_sew30J*sUKz0s*&TnhcXP?jJ4uF?(`cpfSU|T1js1UYf+KfhRicAB2I55>!ur+Y zcXlq)W*L4G1ZD(C(L#0z$7qWbLeE;oD$ZLo-_>`~l2>gzhpi`#C!-!u%dS&~j#JtW zr5XoX?Ck^(+4$zQj@(8isSLtlBWQSVs8sdTLQscBd&hZ59}DbveXW)t6@-NyB_#Nn zhtMxb=y|ds;rC&kgF+tZ6ka2~>P&m}Q)pJDDJ_*(sAmZWVio4}^wUp-5JY$=*T%-c z$M{`jY?xW0REBZOnoihuhgq6Um$S2-iW?;zS{8-cNG&8gGg9@GJyCA;H+SP z?zlkp%P)ZI8=vb&fc6W8+)V3?jMS&|EzPd~lu8I;W{pzySPFu0gyx38`WC5=i))Gs z@rmd_P%VvMYt8i*L&y}m1wvS8ET7^*>6gccun|SAF%ru)ob@fJirH`aj9J>+915R@ zZNnyqgD_wD+w+^V&SWZ4@S6F~tKSVgYiK;-sGkDM< z&_6ov%teK4ZVLFk^&|(|z|{<4ha?-B~BO&@J%zwhA4$j5AoA{>K)_7z?d_7?D=dJG+NbA_1Jr^D;OFhUB- zc*=dmf}Oh$o$_O*o<-6h7`|b92XTEe+Fm}C&ZmEbY=7}crvtSM{mQN%@|)t0AYcFR zw+CDrx`RWQ)3sIfbvV0IL?j5;1~)fIvR9rE?LP33kNHrkvPkfc6x9n879I^Jhc4c;$&HCcSMsF3E#b9NsU^Z@r{yYQIK zeOaHdXq($ke@pU)wuzVL5h$A=*b42+5=SV6a=P#?QfSv_8!ELUa`{QL+sBB&|8X(- ziI>6{@6;TH1x>5h2Zf*m##sg0!>^>agPE@RiRB>uqri6pXeVeOw;LqN1*v z-}$yY&O$;kz6)VJEQDTNe|-+cccgZ)67{gx`rUZz@R#FL{wWDM$Ohuev|b2qNA5Z9 zbENhj2t(l^8+@N6_!bocr+otWAQ;D1GCC&N9%02HwBPv%r{!z*t*ok)o;U!eTWZ~r|^th zI~-dY_Ta;mStd2EZOT&CEW6D+#4yGnZWDMO?~R|cVP`=wZmHA3aBQPcld?e%$CeXq z>d=~#SbbKCUw5Tyj|B!GV||yf68T+v-})Y-5GoDM!W4P(9dYT2g$y%7*_dlA$_e0W z7joSzXwIG^TnYsDYPSFvdqUWMCOoXO_Ntw{;?xa>m zoPr2nEMfvx-hb%SS&ZW6LG(6U66B+VC}viJ^C>8HGCr4dgVm7?&9MAJ7Q6V(1}-*y z$*J*uFuK)z&-!MP-%reFn5E;5a}6tl+%pH(@Ckxyo-#B|bu&<$KpcK)lSORR7__*7 zp+iAM$S=)pO4?2wZ^_Ey?W@qK?^G+hq?|`HUurq{`IJay`#W zbe`3s-b5I~aDynL8dU1v7d?q%Vfua7vpQ-5`br$!q+eH~E2|CTH+=kp!(m@cn&=-q7T>0UmM zNYPm!h@-CwLy0P{CMhy&c<&3+yENTUD=z9?(RN{pqah4dBe8B^h&#zuO%L{*@}aTd z79kDE7}rXaJQEtyv>(AFQBkU|ACqLrd>_T{R>;qN_~B>mwv-zv)o!>lsWw9U7L%p; z)OcY={S-q36D}S29x?px^V{}!EgjneV%PUKgHpX^subXit|((9ScC7E;$K7_FJpZe zqTpp_zs0DowoFumd=$bkoOiPJY|;lpvU)G6WL))N~4WZzt{U^&0)e28T_ zuM~d*Hh6-rw7&?RJdnf-qA7f7~*`ZrY}znD#{Qe3J^Uv{84_XSXr;Z-yGj3MS0}vIb5zSHGHl7PBByn8{mJ4 z3C*R}aKg)Yp=;&b%~Jq8$)*&4YsnOUnafjjQ7QZwofF^uF+KJu zV>WYkE9BD4TPzeM#!)E~Xqir&jK|7QZ<`vdXK5t@DC%U$FM{!S+agz?H7+zUJ`JQ# z-r7i!V*$7y5BNIiKv%y`46mXBSg?BBu#51v?JVc(yJ02BMYpxJ-ZU`<-fDe7VDDH3 zLd3t~nJ)HjT9STc##%k~(AO;7Scj#orF#(;I{N+e;$z^Aj0Ugbv;xb=PSTUoV$u{d z&%zpwf=BEr-14I{(?!%CO^Y{`2EqJ88R7(ftsE}FtRrksUFLH1UezXqgqbzLG0(P~{dqrT02eA6`&Fu(i5{H-;WRi#&OiKV}+`w$Qr z+D0`$#}jkrBf?K7H1@)@g-u-E*X!4iPN<;i*ecs)9^;Ocw}iH5B?bdisg`nxY0)*E zFa}Q9$+48EBw33m(@UoMXwalPHLxS%*!y$UgVYp zQR0LQZ;!Oz7%J*sH{U3en!TE%E>!HOej|b)Te&MrHZ7MU!d9E##2mMx$EY@;%2awK z{%%Eva_@G{^I%>(TuNPO0b(bNBq`4|yEbo4pMpslMVRrDY?R)DxUE%)0sVvC{jWK@ zHMQ4d^0(U#v1f?`dXU6d`IHYAx;d2^^t8z^Wb)~VF_rImD&{#iD4|1i^AZU2NWIif zy;Y=IRP#D4EXm{`TEBQ?dys!WQ~LGmbmx{=At`k^)Y@ki9x6YJ4bo|cOEAbkCwA#8 z26@=ZlHzB*vEB&7KB|wgY$q<QhVqbZGEqq64ZIB`p1jdMIHvO=`;oCL)F#roANg zT7~3n6uqbWTHR|BCCUpujf}U&??P$VbR-I}@IYkkn_tLM?=XrT;WHzR2|Of{+(*dF z6(M|PCxRBp5GAPHwHDE>I^LfN2o>59+GmrJFLp!5{WR!v%uPUuij4K0k@6MTR!mfZ zskO!pN}lDM_h2Tx4hVQRJlKPW@8V@=v^nR}nIZey)}|1DW0;}EYau}*fc2sh9g66j z9R1^nd)-J6OYR#+ljR<-dPYy0{NT?Zy9Oq;qoD;u{^aEtc}}Ywo%v1%sqZWb{=OL@ zA8>=rN>ik(-&ck5dZf%gkn8l16e*++y)UL#@RXD;!#%JjJxF*ENmzaR5NrW$tPF|YZcbx#hht$P>M z0y@E24z*j9Hzdzd(2)vn>r#ZAzN?p3qGsLIMcyw-Z2YQQPfC}#m#agL{idR_Mzgl{ z%q2>k$ju?8nORir-G=eI29k-iG8)-rF*UsEuD8ZC`s4| zZ@o;s9-P*GnCk&nJ2ljP;G0SNOo4eCB-XnLqxD6|R-1J%9BjL}N2RgwgLj+O9kbwO zznk-<=(gd$Fz@Pi)RY5%6@*5PZF9csk*v7t+pG-4 z4s5iK%CeKu`^+`X{NPE***@{QE0DTJ7~i@n^M^JRwvn&CccK909a_8kii=?zc8E;w zWxkG{rQ-;EC-iuN<%VgmG^nc&tX($JCz&k1iqOkkG*Gti$sotp9@h@dnj-@(`+9Ae z4k-%clgkaZz&`%WVZvRhn_+a<+#tVwHDqbeRsk7Y7LS5^c(D`y$#Mltfw-?hC3XQd zIe>+qQQG~ zS;)<)n52W7pJowibo4Y_em7PFzT5I3E#DFSCVka>SXtPF4iCtN+l>bHp7S{}T8z^# ztReYVzLzrYTHop6=sjc#Dq9sxxh?R8Clx&(=Hk&z_`!y@D=+;p;m`kT7&{c#hDTbc zc|{qP;Uvq_dT>X5WR*9gkZOe}iS2Hcf%Z{Mj99&KYoQ_G+_U=zQ|#N$X~(^LdxySc zF}ixG*2po=(u@U848PJh6_E8#!@NXqdj2>{_kadGRP^+hkQL%=`To-`arw{1N7B7c zg`>xl2lE>4C~>6Ou0a4*-2QjDHwn2_m7m~r>T~bWDBKp-;HP2HUhBm-k8UOdCb#7w zezfwH%aJLC;sTq(nwR748sd*vR_@=Op66&lYPb( z>6ZO!|9 z>xI>-hVJVO8ZD{)Y4NnIL?Uzfnb(p*nUC-rcf=WmX2P@{^%^sm8Dw(i82$=ZEL!*8 zoaA7#si9hweleO+E@Ny6jDfl^Yy@=0k>w9g7~6LV^{&+6o+tL~KY!MA;wK7icxBR{ z3(??5!c;2XL|BjNu2NYB+bHeEe`Gferj4i3_T!W5Sr1R=3mFx%p>y{TGQK#bvd&Lv z<#!>69mbQXMt#UQ8lkl00{ogGw*)6H<>d$TB1R5>^KxY$4=KoL8r;>;+Jeh%IuW43 zb)GV1zxB3TukOt>9{$zH)KzB&@DvqIANW>34%xeRY}rS1K}FYt?(4m9}6OH}Dt! z7Fk+}q$r!D&dLS9Ug0&8?xY;@BCWF|@{p_!_Bo|oKUV{x%+1#oEY8#>>orDmB@!Z- zXq9l1j(`%l>hwY=$#^F{j4q-SV)WKTbuogK!{9~6{A<+ih0Ckz<=7So(6Xn?h5qfV zp;%S^tj96@9MXnPN@A=-?}J2 z034d~Eie`M<>HBVwE9YX%u$+%Ru1oi9v*Wnd9l!Oy4?9w<>xA1mHonX=O5CAa!75R z^c1M2`0{wGXUY^ExJnRkdtb{^T=I+P$WuOFY*9y%_rkr?p_0Kg=q)Njj%z6S;Q(Is za_iSp0u!U?hIMlsu|PXQ%$YUz2OV%RU!a-h?rxA-o7qi1 zmZ`~z?TT;0X*VUN(yoQdpC??M?&mzvlMj$Iw|=A$L(X_bSh%+?Q?*$Z61-W6<*;xU z5w&y8prT|$Vn@9n&bGm#Do?IBfUzKEOg~t(+RL!~&f+^GU7$zu=Hj4Dj=T|lHXKr}c1Z@S&RGD6sg`i5h0xqfPyl;zo zPt0AptMrmszy<%h=FN}N;DhDIc@h(IN0=$f<4Z>kIB%Qgrc)l?H6pQ#ZXb43C0v0l z)PU%;^6Zd?4CKq&4sxGfe2}Vr1WpvargLtDJLuXM`=JA&JVT(%t>-9xklde>GSu7B zb-dvC?o5?Rk|pKvi0c7*Sdp*<%kqp8;S9Lh%YFoh(*gBNM#(45+DeebUV?jP>N)1@q9Js? zlya-i#)qegHa&A?8krFO=Y{pESJeFB0aJo4pb==Cw%ww_2!}Q|X~ivdfD0h3-NSNzJB?Q#?8 zt=TlX>%KQuATpk;Hk8@Fxny6J;^1|W}hj1{8 zQ4l#HCHvGtLebou>KfBSX|TUv2Zh8 zaegMLc!qRpDWF3OapBhz!GMUJy27NY0eKQNL(9^8sSn&+)!X5#oRvJvl^)7TRq*P^ zst?-^6}vL<5?f_Z-1-4m z4Cqdm7I%#8X=VrdMYOHSnwJd?l^>XCbX3gUKONG2l}3ILv)M~AwTdsbcfWKKhr&Eh zTOT2WXx$78A2!$awyC3FbyC`NX(L0V(_pH*6TZH(nw@AI;a!G;(3(~JH4fm@oLW{+QWJ?El?RW_`y`;@&cvww@$(o4O_$etg zzWa^Ng}11A$iML{iR*$ZEAv!|7{yy;EUzdb>>Uw)Fm%ndU&1!qi0JodGm!)YoSx}t zfE`SvbNnw;GTluAZY+feZtE99@$O)2>x~iz?|KLD8ic*YVru3oc<~v_M}dexv$N2S zKezMal*5ILeCs3B(h!uz;DK?h0KRp{Y=!Ef{$ku~(eqgeHH7iT^j-7O+<-Yn+@cE$ zNSgJ>nlgpMTngk4UTZYR#dOW8(M4~J{qdo?M;05%s)g^NUL-(NuFyo&e08@wdZQ&F zTawEWmRAXlo=VrQR#^7UlFlHrQq-@Qija9);rnhEQP5%M?O>2h$-mW=7yeRnyHvj&@U;_U39-CM^Gt; zK>+7%ejnd>NZeZMch4=};AzJ2a8$ifQ>8GuexS^2+3zGErai7yZ0u-xmIVczb^2+J zfGL&g^a!a?DdA#eca-7O!sWp=IPuq2B)Jlo2v<^tbJcqRp9BG0v#zUK>gi>iUcxTg zlTID)`?7Qre22djdAn%GLSXL|*<{ZL4!R6WXxQZBtrZQ~1U`O`*_XkeOxENal*qlM zspFSgD@uB^QmRnJV>-1M`k4>uDFaVSQ{)0FCX(Q|*7gjkQTC*JkSvcD6V1>%i*VRG z*w*+#hKRCss?JfoHaz)!8)v`%_M4mF+KKiIS30@}Q9Lv9GTB|UbYk)Lfv*<^)b>5D zDwN!PtX7J|FV3p1HtidQj{0UA@sIKt8K>vEwk}vF%q^&l>P6RFj-Y0ARiuU_d{w=a z9XIaba;kO?f_6zgDzYO9j4S$-fcVM+p&woVdZF3xmY|*xQ5o8whP#rnoG|aYa@F3} zEK@_syMX-)Zv1aXO}aVehm78%#6=a;9|F!+15i?i`ff2_rJC{lTqI-QJfMqUYId|X zTWH;>;YdFvdleffd%*zPc5;^zbdH~Z*7&M#&ZB>0pew%WJh~FPK|D-Jo;C@3d^zzj zqymQhG|4$ul_p{PL`w~$4$&i6cLbmBD!)3DvH@v_DBfuMdk!>}y`4newiUTlT~GMb zm#7fKFqIs#-C)JsaYvSujE{>GlD$6tu2zY;4eI;0w@NtGv7YGyLovG$jNdVD!&8jv zt`%#81&I92g~D#*FlDQaYtE>7TdVic+>P&{(5x1_?i!}{xN2GN$(zPJsHE58nKrlu z+XV(hHevO4j%er-V zufE+GDMX)@UtYm}7-PR#eJZwkGZ>i^UQ-tKdLJCwdRLdLES|u1^~RB{`^rWuh%hg5 znXretgh%vDD4|%*Rsj2xZyRWcCt@{+IEiQEGWTdoR0SDA@a}VK`1;|yARWyFJ-xNL zV%=rspJU50RSDD(H~M4NuuEl3)W^#b~fAhU4#lWB>y?Ga9e zC0f6uI%~FGaZAcD>CzDu)pB{4PZ#4`r)nbaV6Ppp5i^aUIZ3~(7H-ABLa&TkAum?b z5S}BE#_;BNWZ#;sJrkFSu1ECmAVxVqlI^tbaJas!(c^OrLzo{|B1-)t5U@57ECaik zt^zeU6hLmGro@FD3rD`jlrO{Sowg+|b>kuBLGINJnw-N6*YBQN+DHfX&(ApaxD5^s z5f$FvG#^3-HFwq1P!J=7H_qSG{2)M30lwnU5O#8y*iI|82rEBwIKT!&%9)*g=oU=< zX(@9IN4w;h%Kgzr+Hx69w~IbKIB*`X!O66L!}_90W^e&EZTLr0&Z`9W_bH!%h#%6< z%#G60$h-@<-*+0aRk9bprCEM3kz8a*!xd2tKB78;!W;Pj-~WkP0Fbf z%&TS*i@t2hszeK~*2de#s7z^3*Cc>;nTS;?qWo1gm9sOdI=0XO7iu6C42WFCxK+Jr zPYQo;M6Hs#YR>K52L1-*!PG3NaVj;w#R#|KX>%Hn;Q4uTv%x#Geb$xTRqFg6XYwOA zLQz6nX70p5%tAAi)N6y8Iy99hLiA-mOxPQ0BeY3M4Wy`ke{gk~?9p;>S+}y8{?nIo<^J#z~kB<<%fFkkIxL2RA+*ry( zT_O~O2(@O$2eQ+%1ePRUw>rjz595iiymq0_Om`2mv1vA+`I*0+ZJo%o=sgc7+-+!G z$9z#y7BG;55-hzQ!e(O+LiS2{{^7NX`$td}#pgmY!5*_quQa?KeZpAkSm^-x_$UWm>>Lcun_z8C)2ygOU6cNO8A8^#g4|-rlVDxV~rfUiMHJQ7+Gtu zgiY=bEb?6K>Iqm6|F|-+L#-S%M{qf+4?^IFeP9(WdCk9kKAo0hY^4e>bqhXx;5;GKJWsh~?-IwYwJ1$D9QSbb-5s{|GH?5-7DeP00Hl~e zJV0&BU$($&zi>Q2A$NMRIpwkY*exAZ1zjZW)o(V8n;OR_Zgt7CgjXDf_^tV7hA0C! zn-kt)TZT=^EK6t1BZn&GmcCpHCYQI}Y(o)f$c0053I~jcl6zbZ6#R9w6$Ouo@5jxG zIrJk-ozpiayWqn|HrA{GJ5if#l{CYVOt{J0o2b>)j&mb|=3EQQss4W4nNrrzJ#B(1 zo`kx5wi+G&3^G3VR}iiKuzE6gJNF8mor4tf>2GY+@5R5ccjK~ z`DTM5KHiz==aEu<@6;f-N5tEg@$Q8Jskgj~M0{hq~hop1hWURb6 zba6VqLR%i6|8<&HG)qzmf}(~nS|fGEXKZ^V;RZ_0^xLHPxLj%x@4EXA5qDeTEG=I_ z^N&2v_q2^}5CWlAw?o;J!H|8waIitrcE_0N5cV{CF1(L-F6SP>K^^XhkFnD?x=vM2 zK{~mY84QS<={!9uA7SJD`(lG&%;HGwhVCyC&qJBmjZDuw2SD03*?4ff2j)|^LyU`7k~PUB&CfHURnNCM;J zVCtSW}q+}2S-PaX&H+Evs+3B3}Z}SNe^{8Z5d`L0v?Dk{^!W8RCw@_IFG9<6t z?R>r0?s$|TPuznnHB=fVH4#^p4L`@ymABYdr>0&!QeJCpK${wBmgJ9p+v{YVc-N%Y zY5*mlTmTsb!YW!~sA5^|)o7R_izHZ>ikDg~}NX9iN z$&Zb4k44SZP?hY>ea5AUQ6H1DSZqM$uqinDS-nC zZ>$ET(`t{pZA)4U@Uj4pm!bwbjkT0xDn*a(g}h0)*i)$*WOt z`|*&?hGYxZDun{7ixJ&eX%#F&EbZwWuc77@kL{PNr2A==(IOpw$E;I}AyQl}XtIAW zDiSf?8vCswm@~TG9;tcvTSdZ$-JD!B@b zn_EWCp!{KtghcpvFU}uwYc%q$cTKvjgX);I>+H zaVwtE;YM{YRP`eUCaReCjBNUErQtg^7QXeXVC|Hl@RW;fsDe9Pxjx>op??Lc4LIi_ zc=AI#a81_96;8IEX0S11o%b|8DW#4U3Ot_nv_RJ3f2I-60u+$VoFWeGn^bZwTgt+@j(9~93;b#y;8|+ znKx!Ezm4Y`V#g}L6EKz__$>8dojj_hu=^|L+c^mf+}>am_fYfn?CEB&Uh5(KY!93* zGP|UmI2RfdbkF!h<}Wc9N^W}%kwK6rW+AJe@K6j0*hyY5^gccoOGOQiqgwDPBg3L* z3sWzN*{mheoh$^ol_c44FPa5ANo|dFs(G^)dLlmLyyFXbM9boe)k#vysdNV&ulo@M6FfA{s*K==qYaUgjW1%R z4qS9R__$>}`S?9iL6;B-3sDcvA;3EcUHkbj>W_@A_$-M@KIyTi!3q60hxx(={>5Pe znSmV4f5Va7f9d}qV}UQ^j14p6~@mEoI6~Fh)>jN~yT?gGe;%;4<_z za{>V(sBU*4ZKsLXtAbafzDN69Ey&9h1p@0Ol5+Z~oakR}2-rIjMn^uG!1e4o^2X~Z z(1y@bMIFT25wxTRepd9_UX5KxOg3drKNW@$x+F%C*cq+35r{k_C?~yN{U{*Ja7&Cl z@3~ZrXlo%-AoJ6infrL6Y1rK7`wRh^^VZ_&mkTR91Q|os$8eEpC)9~~-3-nrgJD0F zcklI7v3{O@9d8@0#DofM7Gq*Nya!>);$T27zn>zh5vI3bp0NDQ3LF5nD$^hhK12C{~u>*k2EYIX8 zJL_L~tF$A?%G^-c#?;Cf@CODJb})RwW1mfa5ArgJm-b8N--0N}PRiKa)a>6TDvrk1 z?*UwYy1z7}{%*WX`58+!2E2f){{&fIpxyso@bB?eoD3X)1G_JQ0REOlKn}()L;ZiR z+#KxSC~5`*16cpUTtR=efh>Q9`JXWb{Eqsck{7pm2Efg2OrIT?+X&k@nEx&OcCT)3 z{12}$9@PF^g{>&%8TzNVF{hk@X^1I)Q z&c*sn^Zs@1&vn)ph56a$AM<%>|E8RuY31kJ-{vnAJmBTS;h(Ac@7jDJsU3btM%LWu zB`z;>QT`V%?eqdy{{vbE{u}&$W}ct<`sacMP#c2G!L|S(Ban@e1wd`)=xE2o^o)Ez zi>6?Zote3z1EVe2l!oTFA4RaOk(1#wum6AV_HPs%_|HEA{MlWipy#r;HT^U8%WD3j z!T;UK6>MyR_{@T{Au|8#0pMVN{y+ej0RCvtWd(fB?aKpT^OwfV%m#d}?f=l2{}+vw z`*~Xb!wv}K;C>GF|InD3*;$@x`v1^4S^v{7@OfMRr{8Cd?KzqMqc0H1#`2u4|J455 zjs?i|U-M&OeW}R5`#OR_&pR9Z`|lOcKYAFy#Oeh%SGKi%&i}t@d1)Jy=RE(5WOr}` WfgOKG7s$fO!G=gdA+8{S`2PTu6b%*t literal 0 HcmV?d00001 diff --git a/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer.tex b/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer.tex new file mode 100644 index 000000000..9c42a5f0d --- /dev/null +++ b/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer.tex @@ -0,0 +1,38 @@ +\hypertarget{structdynet_1_1SimpleSGDTrainer}{}\section{dynet\+:\+:Simple\+S\+G\+D\+Trainer Struct Reference} +\label{structdynet_1_1SimpleSGDTrainer}\index{dynet\+::\+Simple\+S\+G\+D\+Trainer@{dynet\+::\+Simple\+S\+G\+D\+Trainer}} + + +Inheritance diagram for dynet\+:\+:Simple\+S\+G\+D\+Trainer\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=208pt]{structdynet_1_1SimpleSGDTrainer__inherit__graph} +\end{center} +\end{figure} + + +Collaboration diagram for dynet\+:\+:Simple\+S\+G\+D\+Trainer\+:\nopagebreak +\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[width=208pt]{structdynet_1_1SimpleSGDTrainer__coll__graph} +\end{center} +\end{figure} +\subsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1SimpleSGDTrainer_ac3d5dd3f59db29f7d803130f874f9832}{}{\bfseries Simple\+S\+G\+D\+Trainer} (Model $\ast$m, real e0=0.\+1)\label{structdynet_1_1SimpleSGDTrainer_ac3d5dd3f59db29f7d803130f874f9832} + +\end{DoxyCompactItemize} +\subsection*{Friends} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1SimpleSGDTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c}{}class {\bfseries boost\+::serialization\+::access}\label{structdynet_1_1SimpleSGDTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c} + +\end{DoxyCompactItemize} +\subsection*{Additional Inherited Members} + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +/home/paul/dev/dynet/dynet/training.\+h\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 b/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 new file mode 100644 index 000000000..e71f3eb52 --- /dev/null +++ b/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 @@ -0,0 +1 @@ +acfa5aab176d84bf285c01ec048fb5c3 \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__coll__graph.pdf b/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__coll__graph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..735d92faa3dcd97473f3ce5209abff4fcb9b1da8 GIT binary patch literal 12710 zcmb801yCH@+OBbj5ZnR-1PMO4yAxc4gdhV9GPt`1LV{axcMZYaHCQ0HySwX!WbgCu zbIxD4?(Lzvd%gWF`D9Hs)B}~0xFjQxi35eIYQOXrg$=+0ur@SD;pYc1zXd@|9n1ji zPm&4>003Z?1Y0_Q?4GWc1`Z%`kdd`92t`m3#ooaVWMGBjlANPFEGGs;Yu+sD{U%T; zr|<1f(*I#e!0y}z! zL0MFXSLmyVFeX+1ywrDU!}|do3%)k}Zs9EYHpt5;Xv-YDqG?s8(*gZ!6g(dV!r{9a zjZ^Hy1jmagZIJbhwHy4E^Q3JRr<_>u>A|5_5rxMq1p&K;3j|y%D@iFbv7P>E8hgfA z!#|^@@YDuOvAFpn<+0**Q^e^*Up7^0FvvBZAe_Hvnt7vJ)nWZ=6QlWyNl55%@^vPo zc*P^ZaZv7d5t!RyaG>{-B~ubHMbA(`J)hmzMujz7O%XKSB%;7{qnV(_&aGn%)0W-X z;p*g~n8c3Ht}m+5Rw8Cs1d?&Wmk|V^<>kVXQ9uymzoPea_Z;`(wfA?dS2N{D6 zM6F!_I!_V{fR%+C0Oa5V=>4`9dz$mf+#c{;RDUW+%Ff!+<{#_$GyZS&Z%0(0X0^?5!Q`j6n8)=a8xV!z-?* z_J0&M_rI3)zZLfLG=Fvg@X04G;BS}y2&@1eAdvMR0vmvXo#WrO!oC|wjby%>ktq}o z2`;F6o~pKiuMM2;D@kNVgqpg9IVWZlzeGghC+6o4FoO~CM|54|yY#Rd_Vix3z3eU` z$|~GQv>0xhEUeqr1df<(+ey#XYWd>orrThUDnMSQBXmypcj)26sjrSe&$>d9`TId3 zAP6AMA>WZP__RTx*$34MOFX2|pu+kug+udT-U0Q77hq}k4G`f@U|g>xuHeMs0(=_h z=7t|rwqUTKXWDg(q0lOrN(EVhQv`J3t~Mzn-s$&51crv*mm!6hm$QuYZ!V%KVeDai z^M@gPBtIfJhvTcO<@L|7QBL18n(9L~M6a|zv8{4O^s}^Vjl@8O1yt1>i zf@~ZIy3Xrg6?Nq%Wrl%5NT(n``6v)~*3-H;sAA(g?faM?c+0~~7BNkV;f%YyQsJ3x z>8+Z4P@SyAlDw-NEkbHexw~@b&T#Cts~0BeWZke(+vw!G08nA|*{n?-aG1ZQzJWf^dwGXk#x}joo{Hdw1HmHww$iq(qa}@{>b&=mQ|00SU(bx+8jy zWX?O1m6d5hSRW&G^G+D!JvlVs1s5~3l9tblt;ZMSOOFmvwUxpVkJ<~1uVXW+nS__U z)sLr|9}D4n*RPrNVH3P>6XCBEJ(r7ef*3MCNb-3m=FXk>+L|T7KLxi;|hce&i8J|GEmmUChwhk=_ zAuGQmo#5izvZI6D9;ioru(2t{>7B2|)M%}z?AHU^2c2`IAI3pss`sFO6zU@=8TU0hql{xiYK-%S@!7ACQjiwyybk zwQPoDFRm0!pz+YrqcO2+WHp34`A~cilHX~a=Yh{g|3GD)#N87imwnxdk85(9LRwbL zZ&2-nlkpbq7!f_$Q>AI~nEZt|Oc{@PO0iYTTHaWqVg_H?olo|6KuSF&^;ULN7us5^ zc&b3rWt$>k?ENyjN?!d|Q%gq0(ycc;!atyHFZb+ghhqd&5)5O1C34yXj@Gt?XrB?vgU8iX zW6~6(Xt-)Vq9T7TF|{%PSYbQF)q)R_wG=0=yD-{htg-l)U*q1J_rYK5f;AC10?TXo zz;`!P@rMSm5Vz!Mn~wz5W)p-3jkz`c`rPLjBq~DAo^AOxHrsZ?cSIZ0i~&ag0|6V< zw`c3F$5!U!8j!;ij=Jl%s#8I}d+-{bwj@Piq zyLh*#+iCtq7gHvyj4ti&flzLpP|;8q)UjYF6kDrJc`zP$F`lowy*Wd<-i6-om`4=n z#9F|shL`dAVi+%YWjY$MLrWhe^d|PTpd#Ih9T`lc*PUC2k$x_gz{vJ+BRV46(lzvJ zW$%R3vQ6wZBt9M$6uss%2=82Ey2M<)0nNm<*bZrC0U~pkiDR*DjZh=YX#l<%vlC89 zB{tU*Ey3urj0(kmKMze0rEgPl(A4Tg+V=&T)dK8~*X)+g6kc_JLb-%Pj=Y*K!!Dg7 zu%+X+iH?qTThV*Hbk|w}9^}q6`fKquW>V=m>n|+I(msM`zkX^Ymrf)EJ{siJ_PBR1 znXH`keTk-9>{@$3wmZGz+Khi;W9W#{hcApp6Ks@uR~7XB6keeDEe5FTp)Wwz^p>t@ zh5&wMt|O`I+QOIf6_(=ak|%IVt{_K#rK(r?{liRq^qh8lu)it!n2SQOf`BsO7zeL~ zaWa(=BP{II)2o>D`}OOR@tD9ILoJfTLnAM%fX@gfmtJL}62ODjO^YfUD&VXfUmE~M z(=Tl!89<&-;W6)+b81q>JlYoQj?G5JpzNJd%>1e9{-Vk=odk9uI$GX~3_T0wTtvA$ zdPtUo&D4?c@mglohDg+L18<0v9(1(Pp7+`d?Ij{S4D)NLar~$Poye3;YBWYU0lDMFX*NUAn{AtZutrP7SFK~mtAQUf}i=D7~o4{#RoR@n-iL$gxr z6O%vhWOqi6y`bXsDw;2)jfYKT5z# zNa^&HdxVAC({=d-&xew377{?PIdNByV)Ez5@9blo3=dPRmv^}N&%qnrLlXlJ?1izx zDs<^>Vk`(emYIt84tbvmrXc2dx2ew2hMqjd&6!hvk;79*X8{S@D(`NqzO;xF)ERlD zCz1O}8z#hnYagiAgD;0@91h$m8LNg|Mmye9A7NFszHbOxRUG<~-a%+d!V16@L9XKf zuCGfI#eS#}KRR_J>U$M_(^+Wt{{4%vZI&v{$rl-#0V!Eb{xeX8Xe$@k6ITynagJ>u zfn4sJyn~p$*B;TD0Wx;zN*sL)NorksQr{YuKHee`BPaL>Z`K4)7D&$WTTE4;n-Zz| z(R7kwzF$3qdMm9W^Ax%SC|ccat#ZklNXBN~sm7@;9}! zz^;F9R1_ZlzHaA=$7ht0SI##LHNU$_au^u)!rQX(By(XuX$~1Cbkv?sS|DfVrZb$1 zIm1{eqtj=@n-6D|?8NJoKs!h+aapz0zeob}SPyH6V{MC~;W|SJ&jJ;dtw>UnY<=b; zdSZUIg3q_MF~V=}8{fH>YN#M~-Bw}oX&5%PR_@s;t5VFjxeD(@wNxI3X-pN^Q?!F( zoL`Ng{&c9e{8+{s5L&X*T5dMmxKGuIe7VXf#)-+;thA<-WymRcH1qkFt4bV2SAC?B zu2*#Sg&!)tgI1|7!!KX`pz>HvS3j-h5bc^JAR!ielqIlhTkc@wv8b#HZLyx5usp(M z0h%0j?nx6A6h&4Q)#-xcKYyxmU2IAc{&_8Eg@d&%^-hS`rPy?qt9m``^GQms88J~+ zfAnhrEyGMGl?t=PTw$#FURxZ%?NV5$zF}jQx#?acfacqG_Ti-U++fhG0burP##B$V znZ|;yI$r2@eSBqWE~?HVXAyjLpoj1`CyVv)-1Z+i~wyf zu}I50+!um1KbHmYKum2SS@VXwdh`tne2DyKsQO~J9fuJeC*<|yOJ|g0-=4FUDuukz zN)XbjL472(NJiWN zL=OQt4-2_NEtj@{-+aX-NbLug@n$WAi(`vt;x0kV{UX61@SUYcSdL)`PEdKIQL7$@ zMlFNKB%iS_D5B* zW8D9aub16n+>wxwkzYrVLVuQdy}aj<&j|ODif04$B)NF+SCj-CL7zhT1e9qOrHhoq zPUi~#^|fMZS0s*?88XAm8~Eyj2T;n#&p2&Ixj*It}P|3;xG89&tl3P7*US{Q2=t7wCrF6O?Wb%;u3lEY`v0`Ea?BVh`>9=_N zhnG_Wb2iN)e)1E>qBv{wMHicqNoTIAx8tcwO~evVclwA;&cva5-55>$D)COFA+sE( zYTFMV5Q!wzw@K4hdLcP2ym{d@z<`LQiB9M z1Wo$bdu-wQr0I(b!Qk4u`8TGWBj{0g*+6RUow|%^4H!mrdp86E5~Z2i#w{r1+SeD| z1Fta-j`Y3cIvUnA7C9}KVd~%$T#g5gWWS*=e87Awxo)qn1y5a>f=kPg3_z`*^g|)K z*AL=-7hVURx4C$FBT@VQ&3NOtyC! z)ikjqC4x1Ic^1~|02XL26 znbVgBSLp7pMXa1jpY`eB1?0>BJ|C&`|id=bIHt> zG+OovmQ(UqlNvGfz+btp?b5NZho+~)IBbcw9##{d%YRnDr4bqgs#flQprZHQC}e>n zcBTysj(gfvK4+HNec2Oxr5s^&G$EJSbp5rAtyGR4u#a_$&kmn`mhiWgG@p0}pQ* ziL7C?Y+%d zAq!NB>Om?>%y-S|&S(&S8f~HPh|L5?vRS^5-Oxtjcg#iEho2dkJ1Lv%U$4PAs5`2m zToTmc!Z~ViCTn!-Pz?)Bla8EW0u<$Pw!}jU>ay4YqCB;g>xy0#n1Zm=`%@{ZeYT&PhyQhJKRHZwPy|EOW~n zKl;VBKi9lrTGA}!H#KML;z}=)>e|W45o2wZUkYP~{q(EL_P4M^N#~O;T9m6%2u&?A zmxLn(de)zo#3GEgTAgBNrzwdvNI<4vQo!@II5u|8d?!>a64jSulsb;85@G78PM4C$ z>z{Bd#dbi&3xD$5=u-WS)U>rEi9ohGD0NIzs{g=a<#vHV|XcS=tZyKTm66}*ozK`2AdED)y$=*aUHn^oRPk_ zY zfs3W-`5VV~H68xGI-8%+Vkn{0aZD&-h2p;_O^S!Qz0gJ<6&hzNL^4a1Ix%_Q-3K#b zYKMlTB4^xKsO|nH^VdmkgZO^%2-BNYidJ*di;GX-5h`|u7F0U4 zsA>xqPs_%%^(f~^s*psBj=Sc)FY+F%qsOdBkn%<1q} zL+C;#2XTC8DxO(kY$plg9cwZ1`y1mgB3+Cc4D~L*La8N3A4q8~Qn8iad&Zs8I4hBc zvpfXAEp;C?zMDV1FPMwQ&Pfv^n~>U;v4g+Y+zlopf-x0%l^A#3i=Wq6ae>fmbwE&l z%|Le$pva=!Ltc=u;Lo|4-+IPSxoU(z0zsPhm=`>=kV#V7S%XbY)X zderQrKoJ}vn<#ILEv2bD!AAXNDx#1;5=ORz@Ggj;_<94@+0}d-QAyr9^>RSb_l=HO zaWl6(i9y^&H^EFBo_;=K651~5jFNw0KtZzsRbO=J5f}%KSWdJ#Y**1+BKVn%Ay3gZ3OJ+Gtip{bOxH& zC`49E%YOAk8VBqa1vX|P#wS^PDX(;bbXmUQJH5p{+&o!g$~bikddovN7=rrh`!ZsZ zR7ojf!8>JM$F)8|n;>m%%`cP$kw`$DgtMTOn>Xf!fr-t;)*kZTUiCNBMVFe-iL$V!BA^rFqd(d0$!j;)OSrw_8Zxj%n!Zkr-y(JqNQU4Jn(46SlC z32mzQ6bV)|;DVB-IhL5YV9x+B_k?^ZX7EBnp zWv+YvHNa&X+3-N)EObV$aKtD@S5R7BT^Jo&%q%GRt`Gu4jQFc&v}*&ME288D=izky zy(&2S5)oEi=lei=EQ9G8$M>YSY5r_b^jy)l81m-6+3$*Od-}Cp$RET<*=KSZto8I$ z4RG-~I|1`_W&AOgaG!s4^d$yEg=uhqTc zT^GRu{%BW=<1hK)>q)8E!B|tbE@k=9uWQ<&?PnX~yBsQGuC!7WZ0lblGN=ro^(E|@ zbD;1v9>yG4FMs#xScCoKbFt!q%1++NQdC1y=&kds^-T7Pk1{%(R_k{dEKcP1T+7ny zV9sIRV@if`k(4~{irf3{PSGBXwyzLv)~J_mrJsNT;)Wb+m2WKc@68uK6%uP3^b;WR z1=c`!=f=4Z=G{d~9es|@1Z{f1#vd$TTTW38N^9K#nj_Sy>g@UCjB z#bME1a0BNhO6O-JXFwSP87)Wcw2TDQb>eq^5nCeFS!Z9p+TP1>AZmC@_wmK(>L}j% zC60y0z4RHYFQqK?;2bRE_Q-g9UNlz0U8|+(h}a>hQtHmsZO$eDs|bSd-SuGi9aJJW zZKIEop!Jhw^7*ep3VA*W+;m!;PL$};7T5=0q8x*A#1|vL1(@$|Vrl!|Uoq(6uxSwc z6YfOM7hLk)7ZSC+{xGI>D6Kvr-OylZWmL?L!E}Y{xnA$a`ekl6I{<_kydy^k&ecwb zJ(kBveW9&}&Uv9|Wly@g_#^UF9a^IJo{eTm$XBXuiV#nJ+wf8mt^O2l7=bANz>Hd@P9p$?R_~O%?FD>Lw(;5R(Pbxe z;7}ImS0}rmnXvo|R^P9I?STekSUOhJD!aJ_K^!KW98_~sE-O+ix-ztq=yR;8D zi&)j-*EM#ScW+f>OD!Z@rt=)S3&UMxC_Si2KtTe#XlIhHT< zI&eUJ!b6nrAK8x+9bRhE$KdYiXukBqJV9>x%H?wPwJ#)cjXcI(Eislj9xt)Ijqsk_ z8Bu0MY);&$>nlMufh%v67Xb*t5r2$HdkS68a;0}RsG8@5FDIOFv46EWdjS+?_nJ>M zdCfy;$*gj8X%;V=6|?G4F0yrFCv~!RrqE_+u~0Wxvg(H9TxY44F1+i# z++Lk4VDj}({z{s}q3UV3rseBqwBXl_Mn2N$bg(Pgh^^GZBaH}v;C#TO3kYPdjhdWQq zaKu|s>}q4}y2Cath}G%^z5JiO;fWQ$ zH_S(Fd@O>!p&$rQGwnN+Ijtlb%w3IyN|Iz?lOEbx-cGBPoMAlBS@D76$+KKv6SB^k z&NjX}Ums<>aT(}szwPdyHS{s|C+8Y;5Ez!hHbE6)@-cYu@8n*_DARmt@$DUZt6KZ@ z7?r=iuD_=;kO@gNWwO*`Scz3`;`7HH#_+}bb8z=ec09mE>YB$}7RM~44v@8weS?LC zTctQcpQWxYa|}%6KH1D020Lm>Zi2}L>7-%Y$KP^o1f==wkvbE$xR~KaRT>#_*E4w_ zQpUcBMXL=O(~nOIlpF+)Lr}6v_C|#BSyD!-&*ops+KHuM=#ow|himL3K+7_{h4cg| zNhi?(G`>l3%b-dKd1+Zyw3y>0ZII1-MIXzFD2tZ~M>^~y*$yWX73zb0fLi;3^xsdy z>dQaso=+EN7HrJ1+H3cmS-!9^aiUzlIXmGpXNxsV+{j8NRathT`L(?Pj84T_7F!a9xOawRHX&I?MO&9anpkyvF_U- zeizw^F^?A3g3)mI%^-JK!Oo%eJ1xo$P^$Ui%DI&_`^7KmxS9UjI9{%RF-^E178G`ZUSZY7L*$>t2N^>U?$(I~?gx9w6c3$V0O2))mF4a9pDE8d)js{3JO zkud=E7QB{_On(R~SxKtQTskD|m2#(K-MhMR=#(VN@QSE49bJpVrg_PMqA*|W*vHRv zwF~6z2hwI^ulBvmQ|c_xyPM(dHNdW2PsSCdcrWdE4SIl#_nFP_Y?pt_D)k%YZu=bc z&Eir(FsKqod8jej$+XDXwS>lJUIc(qf7n{eNhFVSezU9F*I05qm zTUkiPuH^krhf4*baYmW0V{0j;u(0Q7Vk1*JK8njxp7wO(B-~xYR!E+#i7ms~#lha{ zg7AxnN~M#zyT9Gw!fzc>^Fh?;fJzS;A4J`Np9&Yqkv(~(W*Tp3BQt}3yvX8b>cRXJ zu0a(CzzXDvBwor}_UgnalZ*V_EEWkM-U`z@ZfkK5I!ECW1`19nub4yN^ESUE(ADLBN0>Za(qAGN7;ocoJ3 zx0cBEivk_6h}Ik7HO;14UsPYu;S!&jH;t*!M~gPMXel{z?Jk8e&zv$|X2h9uOc4#% zkFg1~p?{GHB z16Iz>3S_i}m2bK;(Q}t%#}Rk+39NQXdY?l1$o1c;C$P6A0KG)mTBIcu~`w$Nd;8` zzD28zaO~m95W)w^^ZE#9YkBv@2vi={V?A;Ak8>2!XBkjM7nkh%YU;N>vs4vw-XyFR zpGvd)xDy3%^*tk0H{+P8Te^NYVVnwjmza(0T>O;K)umsaL@~9x*ZQU4h1uS1n)11* z9FS$zlvBQrJn4xSu&%5lA#+AHe{C6XJ{lM)8wn?O3BE_LmQ8}RHN;hm3woI%>U)-@ zv&3&ADN+j>FKvNLAwM!MluP`cvkk zMat#?#Kn4BXpEcP<0b6RGnYa_9z}A5f_E`yIINiMhez*iZ`}lXQxx*rw!-pX6p49_ zPZ9YdeiER(vRC8ImhgtSm5`a3g}V6dRRMT1L_3+|JI9m9M0V~O#)qy%UO_mVqj;CQ z8Uc{jy)R2({r;hrO(qX9@&%JiWjw+~7wzipXe9_>bFF1ytqeP_C0B7ABUQi$mt-Hz1wFRWTDg>y2V~ef>p;`-_-%~=_eb+ocfKutJu~=M1~82M=+sOktf<0T>n{r-bV- zG@@e<@uomI;q{k&-7#+L- zounx_Kpl}(I_Lg6+$Y5uGg;_IYnO-|k0U-$#A5H!%klvWgyo{DAIVZszp8P&%-?$^ z4|_?{>#yXRJ>p&>3Q9T_c17mLr1fs@R=}D_FP%emq57S(n%RV314autXnI6pQX{%q zC!l(JH|6c<`oJi8@S=^4=Vhf{j+Y^;*NHHQaxqmL`O~+F`xzr$rs@knN`It*Et9uY z$O-vs(lkqur+QXc@R+nyjDcs~+;ipBO_|e@+-TIeY@vZkQy4D3jI#TlTvoTq-s`jO z=Tx^V3RX;j(qs<|R^==VJPxv!_+A`cx~CT#^DY4rK(MWb+~&=PgdpWO1F!cIaryB@ zqr2n7p-Dx$p0KGjx1esl=uubzgGI7I3~QOY9>k5H6%p^q3eICj(@nELcMzktPWHy_ zHNV1a-Y;?UB)|jHgiG^)+E5rBU8%nDc7Sg6c=>|NQG;&&(P|rh2bKfe|#Lp$RGjk;0f#*EEUhj z=Cg6G4_fdw7Jt;jt9L|>u%F?|XpmnGomM-A>%4St9^$4v-29T5!pb5yPwEhyc%|&7 zFdWYYn8%-H-JlU-XkvQ$E8y7t%FM*zTzuZww&=H89Z_+|VHQuu$!2 z))myT)!w*&wrzWz-PMg{|$oGQLM*vy!2u(!hZtIG)6Ekn)4sr(Fij{T2!OwcCX|h#&bR>D# z$vY}G9bG?8f~uBuB^9Ui?r+#z`z_j@ANpL`7kN<}r?Ay!QAA&nq2>y^uJN19u|n8_ zu6uqgZu`AK`gMSkE9`N>gF`kjWl~~X^24>mRm{bk;VX>6#iHqBoUP8oM0s`JOk$NI z_-H}~!g07JC}tlT*{zAExe-UR!N1^4yb+pLteskiC%|*v7%y?l+40EGZaRJ@Kj{N@5byiu4L#D?>+nRRhRdMir2$;~yhS z15FigTMhnd16ltJ^Y1YQ z{EqscnwNk)vEE>aDS%lM3=x6YgZ~zO52Oh;b}+O53ju!KDE~hnR<7r5_@5uHrzAXU zT>tCS=O>(;Tma7BOZ?Bif7%>R81nPo^Y!ohCqVhHai6c;Y){zkZ>v9Nwx{-!#Xn}` zU}5=F22V(`wK@d+47>xLza9RWs{gLdXI$F;cVy(i#?NtiUWv-TplHWug8Cn1GVp)s z?kBMM38jB3XaKE|0ocwO0AvEPGqD0_%^VzTc$uHL?kCaI&cMbDY-G=5ZD;!C&F^`X z?5vF)jh@i_|MzbH!+Qh&$^8G>U1A1LWp8czXY6Nh{zAV0r<02v$OMH20AxpD`PTv9 z003Z?1Y0_Q?4GWc1`Z%`kdd`92t`m3#ooaVWMGBjlANPFEGGs;Yu+sD{U%T; zr|<1f(*I#e!0y}z! zL0MFXSLmyVFeX+1ywrDU!}|do3%)k}Zs9EYHpt5;Xv-YDqG?s8(*gZ!6g(dV!r{9a zjZ^Hy1jmagZIJbhwHy4E^Q3JRr<_>u>A|5_5rxMq1p&K;3j|y%D@iFbv7P>E8hgfA z!#|^@@YDuOvAFpn<+0**Q^e^*Up7^0FvvBZAe_Hvnt7vJ)nWZ=6QlWyNl55%@^vPo zc*P^ZaZv7d5t!RyaG>{-B~ubHMbA(`J)hmzMujz7O%XKSB%;7{qnV(_&aGn%)0W-X z;p*g~n8c3Ht}m+5Rw8Cs1d?&Wmk|V^<>kVXQ9uymzoPea_Z;`(wfA?dS2N{D6 zM6F!_I!_V{fR%+C0Oa5V=>4`9dz$mf+#c{;RDUW+%Ff!+<{#_$GyZS&Z%0(0X0^?5!Q`j6n8)=a8xV!z-?* z_J0&M_rI3)zZLfLG=Fvg@X04G;BS}y2&@1eAdvMR0vmvXo#WrO!oC|wjby%>ktq}o z2`;F6o~pKiuMM2;D@kNVgqpg9IVWZlzeGghC+6o4FoO~CM|54|yY#Rd_Vix3z3eU` z$|~GQv>0xhEUeqr1df<(+ey#XYWd>orrThUDnMSQBXmypcj)26sjrSe&$>d9`TId3 zAP6AMA>WZP__RTx*$34MOFX2|pu+kug+udT-U0Q77hq}k4G`f@U|g>xuHeMs0(=_h z=7t|rwqUTKXWDg(q0lOrN(EVhQv`J3t~Mzn-s$&51crv*mm!6hm$QuYZ!V%KVeDai z^M@gPBtIfJhvTcO<@L|7QBL18n(9L~M6a|zv8{4O^s}^Vjl@8O1yt1>i zf@~ZIy3Xrg6?Nq%Wrl%5NT(n``6v)~*3-H;sAA(g?faM?c+0~~7BNkV;f%YyQsJ3x z>8+Z4P@SyAlDw-NEkbHexw~@b&T#Cts~0BeWZke(+vw!G08nA|*{n?-aG1ZQzJWf^dwGXk#x}joo{Hdw1HmHww$iq(qa}@{>b&=mQ|00SU(bx+8jy zWX?O1m6d5hSRW&G^G+D!JvlVs1s5~3l9tblt;ZMSOOFmvwUxpVkJ<~1uVXW+nS__U z)sLr|9}D4n*RPrNVH3P>6XCBEJ(r7ef*3MCNb-3m=FXk>+L|T7KLxi;|hce&i8J|GEmmUChwhk=_ zAuGQmo#5izvZI6D9;ioru(2t{>7B2|)M%}z?AHU^2c2`IAI3pss`sFO6zU@=8TU0hql{xiYK-%S@!7ACQjiwyybk zwQPoDFRm0!pz+YrqcO2+WHp34`A~cilHX~a=Yh{g|3GD)#N87imwnxdk85(9LRwbL zZ&2-nlkpbq7!f_$Q>AI~nEZt|Oc{@PO0iYTTHaWqVg_H?olo|6KuSF&^;ULN7us5^ zc&b3rWt$>k?ENyjN?!d|Q%gq0(ycc;!atyHFZb+ghhqd&5)5O1C34yXj@Gt?XrB?vgU8iX zW6~6(Xt-)Vq9T7TF|{%PSYbQF)q)R_wG=0=yD-{htg-l)U*q1J_rYK5f;AC10?TXo zz;`!P@rMSm5Vz!Mn~wz5W)p-3jkz`c`rPLjBq~DAo^AOxHrsZ?cSIZ0i~&ag0|6V< zw`c3F$5!U!8j!;ij=Jl%s#8I}d+-{bwj@Piq zyLh*#+iCtq7gHvyj4ti&flzLpP|;8q)UjYF6kDrJc`zP$F`lowy*Wd<-i6-om`4=n z#9F|shL`dAVi+%YWjY$MLrWhe^d|PTpd#Ih9T`lc*PUC2k$x_gz{vJ+BRV46(lzvJ zW$%R3vQ6wZBt9M$6uss%2=82Ey2M<)0nNm<*bZrC0U~pkiDR*DjZh=YX#l<%vlC89 zB{tU*Ey3urj0(kmKMze0rEgPl(A4Tg+V=&T)dK8~*X)+g6kc_JLb-%Pj=Y*K!!Dg7 zu%+X+iH?qTThV*Hbk|w}9^}q6`fKquW>V=m>n|+I(msM`zkX^Ymrf)EJ{siJ_PBR1 znXH`keTk-9>{@$3wmZGz+Khi;W9W#{hcApp6Ks@uR~7XB6keeDEe5FTp)Wwz^p>t@ zh5&wMt|O`I+QOIf6_(=ak|%IVt{_K#rK(r?{liRq^qh8lu)it!n2SQOf`BsO7zeL~ zaWa(=BP{II)2o>D`}OOR@tD9ILoJfTLnAM%fX@gfmtJL}62ODjO^YfUD&VXfUmE~M z(=Tl!89<&-;W6)+b81q>JlYoQj?G5JpzNJd%>1e9{-Vk=odk9uI$GX~3_T0wTtvA$ zdPtUo&D4?c@mglohDg+L18<0v9(1(Pp7+`d?Ij{S4D)NLar~$Poye3;YBWYU0lDMFX*NUAn{AtZutrP7SFK~mtAQUf}i=D7~o4{#RoR@n-iL$gxr z6O%vhWOqi6y`bXsDw;2)jfYKT5z# zNa^&HdxVAC({=d-&xew377{?PIdNByV)Ez5@9blo3=dPRmv^}N&%qnrLlXlJ?1izx zDs<^>Vk`(emYIt84tbvmrXc2dx2ew2hMqjd&6!hvk;79*X8{S@D(`NqzO;xF)ERlD zCz1O}8z#hnYagiAgD;0@91h$m8LNg|Mmye9A7NFszHbOxRUG<~-a%+d!V16@L9XKf zuCGfI#eS#}KRR_J>U$M_(^+Wt{{4%vZI&v{$rl-#0V!Eb{xeX8Xe$@k6ITynagJ>u zfn4sJyn~p$*B;TD0Wx;zN*sL)NorksQr{YuKHee`BPaL>Z`K4)7D&$WTTE4;n-Zz| z(R7kwzF$3qdMm9W^Ax%SC|ccat#ZklNXBN~sm7@;9}! zz^;F9R1_ZlzHaA=$7ht0SI##LHNU$_au^u)!rQX(By(XuX$~1Cbkv?sS|DfVrZb$1 zIm1{eqtj=@n-6D|?8NJoKs!h+aapz0zeob}SPyH6V{MC~;W|SJ&jJ;dtw>UnY<=b; zdSZUIg3q_MF~V=}8{fH>YN#M~-Bw}oX&5%PR_@s;t5VFjxeD(@wNxI3X-pN^Q?!F( zoL`Ng{&c9e{8+{s5L&X*T5dMmxKGuIe7VXf#)-+;thA<-WymRcH1qkFt4bV2SAC?B zu2*#Sg&!)tgI1|7!!KX`pz>HvS3j-h5bc^JAR!ielqIlhTkc@wv8b#HZLyx5usp(M z0h%0j?nx6A6h&4Q)#-xcKYyxmU2IAc{&_8Eg@d&%^-hS`rPy?qt9m``^GQms88J~+ zfAnhrEyGMGl?t=PTw$#FURxZ%?NV5$zF}jQx#?acfacqG_Ti-U++fhG0burP##B$V znZ|;yI$r2@eSBqWE~?HVXAyjLpoj1`CyVv)-1Z+i~wyf zu}I50+!um1KbHmYKum2SS@VXwdh`tne2DyKsQO~J9fuJeC*<|yOJ|g0-=4FUDuukz zN)XbjL472(NJiWN zL=OQt4-2_NEtj@{-+aX-NbLug@n$WAi(`vt;x0kV{UX61@SUYcSdL)`PEdKIQL7$@ zMlFNKB%iS_D5B* zW8D9aub16n+>wxwkzYrVLVuQdy}aj<&j|ODif04$B)NF+SCj-CL7zhT1e9qOrHhoq zPUi~#^|fMZS0s*?88XAm8~Eyj2T;n#&p2&Ixj*It}P|3;xG89&tl3P7*US{Q2=t7wCrF6O?Wb%;u3lEY`v0`Ea?BVh`>9=_N zhnG_Wb2iN)e)1E>qBv{wMHicqNoTIAx8tcwO~evVclwA;&cva5-55>$D)COFA+sE( zYTFMV5Q!wzw@K4hdLcP2ym{d@z<`LQiB9M z1Wo$bdu-wQr0I(b!Qk4u`8TGWBj{0g*+6RUow|%^4H!mrdp86E5~Z2i#w{r1+SeD| z1Fta-j`Y3cIvUnA7C9}KVd~%$T#g5gWWS*=e87Awxo)qn1y5a>f=kPg3_z`*^g|)K z*AL=-7hVURx4C$FBT@VQ&3NOtyC! z)ikjqC4x1Ic^1~|02XL26 znbVgBSLp7pMXa1jpY`eB1?0>BJ|C&`|id=bIHt> zG+OovmQ(UqlNvGfz+btp?b5NZho+~)IBbcw9##{d%YRnDr4bqgs#flQprZHQC}e>n zcBTysj(gfvK4+HNec2Oxr5s^&G$EJSbp5rAtyGR4u#a_$&kmn`mhiWgG@p0}pQ* ziL7C?Y+%d zAq!NB>Om?>%y-S|&S(&S8f~HPh|L5?vRS^5-Oxtjcg#iEho2dkJ1Lv%U$4PAs5`2m zToTmc!Z~ViCTn!-Pz?)Bla8EW0u<$Pw!}jU>ay4YqCB;g>xy0#n1Zm=`%@{ZeYT&PhyQhJKRHZwPy|EOW~n zKl;VBKi9lrTGA}!H#KML;z}=)>e|W45o2wZUkYP~{q(EL_P4M^N#~O;T9m6%2u&?A zmxLn(de)zo#3GEgTAgBNrzwdvNI<4vQo!@II5u|8d?!>a64jSulsb;85@G78PM4C$ z>z{Bd#dbi&3xD$5=u-WS)U>rEi9ohGD0NIzs{g=a<#vHV|XcS=tZyKTm66}*ozK`2AdED)y$=*aUHn^oRPk_ zY zfs3W-`5VV~H68xGI-8%+Vkn{0aZD&-h2p;_O^S!Qz0gJ<6&hzNL^4a1Ix%_Q-3K#b zYKMlTB4^xKsO|nH^VdmkgZO^%2-BNYidJ*di;GX-5h`|u7F0U4 zsA>xqPs_%%^(f~^s*psBj=Sc)FY+F%qsOdBkn%<1q} zL+C;#2XTC8DxO(kY$plg9cwZ1`y1mgB3+Cc4D~L*La8N3A4q8~Qn8iad&Zs8I4hBc zvpfXAEp;C?zMDV1FPMwQ&Pfv^n~>U;v4g+Y+zlopf-x0%l^A#3i=Wq6ae>fmbwE&l z%|Le$pva=!Ltc=u;Lo|4-+IPSxoU(z0zsPhm=`>=kV#V7S%XbY)X zderQrKoJ}vn<#ILEv2bD!AAXNDx#1;5=ORz@Ggj;_<94@+0}d-QAyr9^>RSb_l=HO zaWl6(i9y^&H^EFBo_;=K651~5jFNw0KtZzsRbO=J5f}%KSWdJ#Y**1+BKVn%Ay3gZ3OJ+Gtip{bOxH& zC`49E%YOAk8VBqa1vX|P#wS^PDX(;bbXmUQJH5p{+&o!g$~bikddovN7=rrh`!ZsZ zR7ojf!8>JM$F)8|n;>m%%`cP$kw`$DgtMTOn>Xf!fr-t;)*kZTUiCNBMVFe-iL$V!BA^rFqd(d0$!j;)OSrw_8Zxj%n!Zkr-y(JqNQU4Jn(46SlC z32mzQ6bV)|;DVB-IhL5YV9x+B_k?^ZX7EBnp zWv+YvHNa&X+3-N)EObV$aKtD@S5R7BT^Jo&%q%GRt`Gu4jQFc&v}*&ME288D=izky zy(&2S5)oEi=lei=EQ9G8$M>YSY5r_b^jy)l81m-6+3$*Od-}Cp$RET<*=KSZto8I$ z4RG-~I|1`_W&AOgaG!s4^d$yEg=uhqTc zT^GRu{%BW=<1hK)>q)8E!B|tbE@k=9uWQ<&?PnX~yBsQGuC!7WZ0lblGN=ro^(E|@ zbD;1v9>yG4FMs#xScCoKbFt!q%1++NQdC1y=&kds^-T7Pk1{%(R_k{dEKcP1T+7ny zV9sIRV@if`k(4~{irf3{PSGBXwyzLv)~J_mrJsNT;)Wb+m2WKc@68uK6%uP3^b;WR z1=c`!=f=4Z=G{d~9es|@1Z{f1#vd$TTTW38N^9K#nj_Sy>g@UCjB z#bME1a0BNhO6O-JXFwSP87)Wcw2TDQb>eq^5nCeFS!Z9p+TP1>AZmC@_wmK(>L}j% zC60y0z4RHYFQqK?;2bRE_Q-g9UNlz0U8|+(h}a>hQtHmsZO$eDs|bSd-SuGi9aJJW zZKIEop!Jhw^7*ep3VA*W+;m!;PL$};7T5=0q8x*A#1|vL1(@$|Vrl!|Uoq(6uxSwc z6YfOM7hLk)7ZSC+{xGI>D6Kvr-OylZWmL?L!E}Y{xnA$a`ekl6I{<_kydy^k&ecwb zJ(kBveW9&}&Uv9|Wly@g_#^UF9a^IJo{eTm$XBXuiV#nJ+wf8mt^O2l7=bANz>Hd@P9p$?R_~O%?FD>Lw(;5R(Pbxe z;7}ImS0}rmnXvo|R^P9I?STekSUOhJD!aJ_K^!KW98_~sE-O+ix-ztq=yR;8D zi&)j-*EM#ScW+f>OD!Z@rt=)S3&UMxC_Si2KtTe#XlIhHT< zI&eUJ!b6nrAK8x+9bRhE$KdYiXukBqJV9>x%H?wPwJ#)cjXcI(Eislj9xt)Ijqsk_ z8Bu0MY);&$>nlMufh%v67Xb*t5r2$HdkS68a;0}RsG8@5FDIOFv46EWdjS+?_nJ>M zdCfy;$*gj8X%;V=6|?G4F0yrFCv~!RrqE_+u~0Wxvg(H9TxY44F1+i# z++Lk4VDj}({z{s}q3UV3rseBqwBXl_Mn2N$bg(Pgh^^GZBaH}v;C#TO3kYPdjhdWQq zaKu|s>}q4}y2Cath}G%^z5JiO;fWQ$ zH_S(Fd@O>!p&$rQGwnN+Ijtlb%w3IyN|Iz?lOEbx-cGBPoMAlBS@D76$+KKv6SB^k z&NjX}Ums<>aT(}szwPdyHS{s|C+8Y;5Ez!hHbE6)@-cYu@8n*_DARmt@$DUZt6KZ@ z7?r=iuD_=;kO@gNWwO*`Scz3`;`7HH#_+}bb8z=ec09mE>YB$}7RM~44v@8weS?LC zTctQcpQWxYa|}%6KH1D020Lm>Zi2}L>7-%Y$KP^o1f==wkvbE$xR~KaRT>#_*E4w_ zQpUcBMXL=O(~nOIlpF+)Lr}6v_C|#BSyD!-&*ops+KHuM=#ow|himL3K+7_{h4cg| zNhi?(G`>l3%b-dKd1+Zyw3y>0ZII1-MIXzFD2tZ~M>^~y*$yWX73zb0fLi;3^xsdy z>dQaso=+EN7HrJ1+H3cmS-!9^aiUzlIXmGpXNxsV+{j8NRathT`L(?Pj84T_7F!a9xOawRHX&I?MO&9anpkyvF_U- zeizw^F^?A3g3)mI%^-JK!Oo%eJ1xo$P^$Ui%DI&_`^7KmxS9UjI9{%RF-^E178G`ZUSZY7L*$>t2N^>U?$(I~?gx9w6c3$V0O2))mF4a9pDE8d)js{3JO zkud=E7QB{_On(R~SxKtQTskD|m2#(K-MhMR=#(VN@QSE49bJpVrg_PMqA*|W*vHRv zwF~6z2hwI^ulBvmQ|c_xyPM(dHNdW2PsSCdcrWdE4SIl#_nFP_Y?pt_D)k%YZu=bc z&Eir(FsKqod8jej$+XDXwS>lJUIc(qf7n{eNhFVSezU9F*I05qm zTUkiPuH^krhf4*baYmW0V{0j;u(0Q7Vk1*JK8njxp7wO(B-~xYR!E+#i7ms~#lha{ zg7AxnN~M#zyT9Gw!fzc>^Fh?;fJzS;A4J`Np9&Yqkv(~(W*Tp3BQt}3yvX8b>cRXJ zu0a(CzzXDvBwor}_UgnalZ*V_EEWkM-U`z@ZfkK5I!ECW1`19nub4yN^ESUE(ADLBN0>Za(qAGN7;ocoJ3 zx0cBEivk_6h}Ik7HO;14UsPYu;S!&jH;t*!M~gPMXel{z?Jk8e&zv$|X2h9uOc4#% zkFg1~p?{GHB z16Iz>3S_i}m2bK;(Q}t%#}Rk+39NQXdY?l1$o1c;C$P6A0KG)mTBIcu~`w$Nd;8` zzD28zaO~m95W)w^^ZE#9YkBv@2vi={V?A;Ak8>2!XBkjM7nkh%YU;N>vs4vw-XyFR zpGvd)xDy3%^*tk0H{+P8Te^NYVVnwjmza(0T>O;K)umsaL@~9x*ZQU4h1uS1n)11* z9FS$zlvBQrJn4xSu&%5lA#+AHe{C6XJ{lM)8wn?O3BE_LmQ8}RHN;hm3woI%>U)-@ zv&3&ADN+j>FKvNLAwM!MluP`cvkk zMat#?#Kn4BXpEcP<0b6RGnYa_9z}A5f_E`yIINiMhez*iZ`}lXQxx*rw!-pX6p49_ zPZ9YdeiER(vRC8ImhgtSm5`a3g}V6dRRMT1L_3+|JI9m9M0V~O#)qy%UO_mVqj;CQ z8Uc{jy)R2({r;hrO(qX9@&%JiWjw+~7wzipXe9_>bFF1ytqeP_C0B7ABUQi$mt-Hz1wFRWTDg>y2V~ef>p;`-_-%~=_eb+ocfKutJu~=M1~82M=+sOktf<0T>n{r-bV- zG@@e<@uomI;q{k&-7#+L- zounx_Kpl}(I_Lg6+$Y5uGg;_IYnO-|k0U-$#A5H!%klvWgyo{DAIVZszp8P&%-?$^ z4|_?{>#yXRJ>p&>3Q9T_c17mLr1fs@R=}D_FP%emq57S(n%RV314autXnI6pQX{%q zC!l(JH|6c<`oJi8@S=^4=Vhf{j+Y^;*NHHQaxqmL`O~+F`xzr$rs@knN`It*Et9uY z$O-vs(lkqur+QXc@R+nyjDcs~+;ipBO_|e@+-TIeY@vZkQy4D3jI#TlTvoTq-s`jO z=Tx^V3RX;j(qs<|R^==VJPxv!_+A`cx~CT#^DY4rK(MWb+~&=PgdpWO1F!cIaryB@ zqr2n7p-Dx$p0KGjx1esl=uubzgGI7I3~QOY9>k5H6%p^q3eICj(@nELcMzktPWHy_ zHNV1a-Y;?UB)|jHgiG^)+E5rBU8%nDc7Sg6c=>|NQG;&&(P|rh2bKfe|#Lp$RGjk;0f#*EEUhj z=Cg6G4_fdw7Jt;jt9L|>u%F?|XpmnGomM-A>%4St9^$4v-29T5!pb5yPwEhyc%|&7 zFdWYYn8%-H-JlU-XkvQ$E8y7t%FM*zTzuZww&=H89Z_+|VHQuu$!2 z))myT)!w*&wrzWz-PMg{|$oGQLM*vy!2u(!hZtIG)6Ekn)4sr(Fij{T2!OwcCX|h#&bR>D# z$vY}G9bG?8f~uBuB^9Ui?r+#z`z_j@ANpL`7kN<}r?Ay!QAA&nq2>y^uJN19u|n8_ zu6uqgZu`AK`gMSkE9`N>gF`kjWl~~X^24>mRm{bk;VX>6#iHqBoUP8oM0s`JOk$NI z_-H}~!g07JC}tlT*{zAExe-UR!N1^4yb+pLteskiC%|*v7%y?l+40EGZaRJ@Kj{N@5byiu4L#D?>+nRRhRdMir2$;~yhS z15FigTMhnd16ltJ^Y1YQ z{EqscnwNk)vEE>aDS%lM3=x6YgZ~zO52Oh;b}+O53ju!KDE~hnR<7r5_@5uHrzAXU zT>tCS=O>(;Tma7BOZ?Bif7%>R81nPo^Y!ohCqVhHai6c;Y){zkZ>v9Nwx{-!#Xn}` zU}5=F22V(`wK@d+47>xLza9RWs{gLdXI$F;cVy(i#?NtiUWv-TplHWug8Cn1GVp)s z?kBMM38jB3XaKE|0ocwO0AvEPGqD0_%^VzTc$uHL?kCaI&cMbDY-G=5ZD;!C&F^`X z?5vF)jh@i_|MzbH!+Qh&$^8G>U1A1LWp8czXY6Nh{zAV0r<02v$OMH20AxpD`PTv9 z$ \&values)=0\label{structdynet_1_1Trainer_a85e86d4970c50985f6cc79f5901c576e} + +\item +\hypertarget{structdynet_1_1Trainer_a43093c84d5faab07d9e906af61f13bdb}{}virtual void {\bfseries update\+\_\+params} (real scale, real gscale, size\+\_\+t idx)=0\label{structdynet_1_1Trainer_a43093c84d5faab07d9e906af61f13bdb} + +\item +\hypertarget{structdynet_1_1Trainer_ab8a4f50d1d3bcf8178984c040338972a}{}virtual void {\bfseries update\+\_\+lookup\+\_\+params} (real scale, real gscale, size\+\_\+t idx, size\+\_\+t lidx)=0\label{structdynet_1_1Trainer_ab8a4f50d1d3bcf8178984c040338972a} + +\end{DoxyCompactItemize} +\subsection*{Friends} +\begin{DoxyCompactItemize} +\item +\hypertarget{structdynet_1_1Trainer_ac98d07dd8f7b70e16ccb9a01abf56b9c}{}class {\bfseries boost\+::serialization\+::access}\label{structdynet_1_1Trainer_ac98d07dd8f7b70e16ccb9a01abf56b9c} + +\end{DoxyCompactItemize} + + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +/home/paul/dev/dynet/dynet/training.\+h\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/structdynet_1_1Trainer__inherit__graph.md5 b/doc/doxygen/latex/structdynet_1_1Trainer__inherit__graph.md5 new file mode 100644 index 000000000..f5d46aaad --- /dev/null +++ b/doc/doxygen/latex/structdynet_1_1Trainer__inherit__graph.md5 @@ -0,0 +1 @@ +179feb913982145fd63eb96dec855108 \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1Trainer__inherit__graph.pdf b/doc/doxygen/latex/structdynet_1_1Trainer__inherit__graph.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7b851852e00e5dbb663b0d1bc9ef7397ea16902c GIT binary patch literal 14861 zcmb8W1yo#17Vizg2?2sTjk`NRg1cKFxNGC??(PuWEx5ZwaCg@b+?@}SduQ&c^45CBJqA~S z=wRZe%Ch+nWVY~ba5A&G!dhkd<8lXtN|y*9onKUrCvK?9NqyyGD?=ORig+FoRASvC z&F*H2mQD#9&xcKT$$`J*?42wiPx|9i+>;K=MQ%)=dbrir{MHTW8l8hbm@yRyxEY$u z)!=Mg`dTZIEgfGjjIK%8zAWtz7kb`zUpqCojvRwz&t#4it}F{ZTGzF*60~$D_=}@? z?r;zz9kxLFKuBbj9+2pB2}kv`R(Se03u6WlMw^PkE192wHShcj9weGt;g<{y9<$z2mkEhRwE# z*$_cH{WhEWm~cIgIefHYUbO@Zw#9d17JH|sP(vgJCrnVOG&U8M)qyDEFJ}2Tm@T2Q z?}I@2H6e=R{EMZ$<3hBnz%3>ECSjKca%nm@5=7t2bf|(P`9`IDN%CZI*mev&GD;6~ zlxyZ6h0oG_$Q&NBZpRw3Oj=?1Cg&qpN}VKFVjU2dkl$C`UI|x-RvSm2KdG0sKo}4$ zTPd`jjE<=j;ty*(R;QcbPjZlFB zc)P=r(N?k4GF%fj51rHFG0FnGScI(*T2>g5dBH%bSBu=X>~0879CK|lArvCHbHM;w zKO#EPcKG5ui%l+M{h>0oW`JdnO1#Y&81nW~_q9U32i;Yl1bl8p_e#GWXSrq>Zcg-z zxzdX3cc4c|-!ISU^SXzsm~=arDR+q2J&haxseIGpecRM4O^%Neiw>HjL>_!UzF$;{ zl4|-r)RiHPC#bH?#P?IWE*Xdk49etrxDE%q9(#al7lv1(*Pp){WBpfS06IlyD+2(Xtd5bv?}lY{Yz$ugF#KJQ zPRc;vM2Fwf3Gnq*q6aWB(*qbe=m8qPtp#4&d^NWPysb%p79bHDOM9z-^y82J-|F83 zQFv|DMh9qX_12c2^WU-AQ9RE<504&Tb|FM)F zxfsZ*uhh{TA4}_X`ZR+(zWy3#diR-Ny+Sn3z8K`b zd2&8kE2(cTzQMB{W|{qF7G7J@RE%jnT{}-qlQzs}BOM{jO6wr4<3%~&xjdrue*ZQ_ z3R(XM(h2@Nhk@SMH|sj{MSB9njt^0#A~xr={UVnD0J!7;fcfzhm@PGc60ekkf&f9# z%jpp^=raIbsj&*{Yr)cpI$o$fgE--Qi-QaA-__N5!-74#fz$sqK47S>YI~&WA|WOQ zr@y&p1B(J}^eMvyrF$kg#j%H4_{8za3nz;Z-^8770PR9(kfT}N;}j&v4GeO#KnG#n3=t&o6g*9tg{cU4Zn)zGc>^18H~ z*ub0{PrtH`h=le$&;;Np4rhcmI$KosaC;2ssPrfZRc0#{^!n3q_LI<8-%Jo5X`nQL zG!SF}0_41=V&j&(xh|1uA0g(KBgVe*&tFdk0d(`Qmu>W z(9t`P%t0ZNd`mkcj6I8Z1NoF+x+p)BgCD}sZ|Zw$N`vg3jAh7JrgLlm+%`VBQfZGg4Zon17ymJcygt%L((zt<3vCEfR4;a8@Ic<94NjoQ~Rm02B97z6Jn<3<*LWaN$3~U_;_t#w+JuKUEYaZA0 zyS^)4tZV$ojJhXY+XG9QpKIcts+YW!akkapX{#x<KvGJU!^FzpyXxj=kVK z6LpP2tw%k+=e}U{Bm|`e34GKN1?k8-Cqvo>w<>(`Zve$f@g%?l37pjmLhs0WB13Xf z27L~0V9zk1eu2y|0)P6z^IrAk1J4}nGqxM;?6ajTbjQXi`nHR*!y~qvvcvtWI)7(* z+9*7*wtgY_-P89G1b%;Q-S$1ulkeEbpqzJ|x9&&Rhj-3(5BOxq&iF6kWgTN4px#`3 zXvVz0(mFAb4ip|J#J!`zkMaRJ=87+T7!kL!;;VeT{rf=ya}|trrWFRl$|cWtA7{4a z_fwuLE)sJ4QMBAsaH1jJq2d)ya|&__uU97%*6x_6f{)){SWDWF8g^@Yekb7w*>SxENKGBdgL3Udg-Q4&EdL3dN72A3(;Kr6CV%RD>*Scm~DKbrRk}aIJ~YbYAsIy zp6}kN{R7|RZk=GO6h5bgfrE#HjNAu({%Q(Oj!>aodJmH@O+^Fsp^yAq?*`4LopmI0 zvcDCQ)AOZ|pRy>*irR6zV?zL;%F8;0EN+%{vlq!+K*U|p_uxq=embW`#g0U~m3&Qp zFSaDLJ44Yx5qQ~XTy69jGy4mXYCcKT!PLFVLT#i)Y+G%4_H+_wZF4@*ufY+ziz`_5 zas_O&wehlD2L9_H&N8^%eA>}muA$hE;|c1aqh7lFBY)z%{x}WM^B47=(?I-PZqrij zs}-%i308|iS5#r8^iZ9Tam@5em_G-ww%)@%&m7H~q>h$>Bo0D$`7YKad60W*RR1Oy-v#@9Ub%@vF3Q5(?obUF1jG7m zW-!q+}q!It-J;U)>~Tss0z_qtD_}$zRDsM)Q^NuFRMew>5<4JTM7;bf{>@R1}P2*q{dY z$o(?q5j}P}aKade`_h@x$U>#ONyUc)3&jX3Q_O^LtuNDR0I80QaKrO^Ut2VbAxS8o z2<2vCEQ(_7DzLTcn4y@Ux5s$#$y=#1FZthwRSvD@%=y)!ZysSJ^@5BAdmr*A-R5FicGbCM-CyKnC1)iGQ2?aWGEi^DC0I zq!>B{E5)U^n(Ht&xXF)BW1qqDA}fI)R<7>WkEV}wjgWb>8L!1wML0|BwkWlE$P0&RwbfM z^PwZH3w_s_5K>_`o6Nlmt%l!tWFO;EX++HXN=Ci(^a}z$pSn5kS8&KOe z$meF}%Pao$O=^l2Ts~X*Il5y8%4K09#U1uubDyj+@<}01|7Wd0Q|Udzne|gV^QBAE7z5xwr{C$wKv^Q%2KiH zJTt??_jTJjP<_nG^-L_umFKs#w}I?-M;*wHPLg<#fe*5?!!4ht>JIQ09D4cZ3kH|0 z!@g|X5A@R!PkPg;6It9UaSx7%vq*1m1lL(vjx>wd6sRUqwUyBi#op0II``Mnbw?4b z4W(HL&kCwy1)mwAn?x9V3W!j0A=1ZwPSQPE)#Xb6E|~H7OFhQuak1!yQ1F}n)|AW2 zrxpcv9N?18aYcv!XM(y16Y7TPq7s!H?|tzO&KERm8zGmn5|0skJ)@i@G(iZxBbj>W zyMAiP5i}Z)XJF+ik%y7$d!{&&>2ynIcmXwqnOtKeiVNLq&7g@R!Et12{JF?zajj~v zj>_kwCOKSp+LntbtM?p%8t8b!E$p3Qw=oFu1IcJDMPN{@MNb`U1P&*|;|p6(f?l@S z6iC}B@so#@j;j}K$);u^H0Dg7$UcQa*p>xj#(;YCqy(H(U@w3*a8p3Q@R*_e{8BTb4C%u*P;Q7p1u zx!B+g3+>gC7}Ox7f`aeIcIbMVsZjmEwrxK1p7&G(%*lxcM$W1P>4AYU+6Z?Cd)ij8 z7U7auU%$ksVLOf?6rA#f=)q47R@z+Am`;5S(%ny-&cqcRoK)fmKixz5rCkAk>T+$4 zaazhr8Lz5*^6(|QQUuWr1=z&$nMVQ+TR3jl%9@{RWfV$gK2R>fepv$*K;5s=$!=N! z0)f#Y4KF#e9QcH~J5U(M9{Uv|PpHXTx6IpmDXi>geRiR?1}n{bD){~0iLh#kF%%Wn zflQ6CDfG~ALKfCNo^-w)|L>!zXkp|$4JZOh+=5sPs*B07(I2P$V9n(bslifEB=f2W zYxA_jBCR44ZFMx8_s~Tp6!3c|7slAiZo^9)1+bl$@gf`dlD(7l6l#egylQAOH5PH^ zhQ=EUg|;M{3E07|qN?tDI|I-jh6%XQt=>6kD1P?yT1`D-SHsGWlL16&>8wop(9E9% z%p;SCkw=DAGHf~rUnh{k~4Us&)Fptv3bIey&$0_ zDePgRm|HSzW_$FnF63Ta*Q)BPD4r^Q86t@YcwSg%PDvMqLFNPL+C`dZW}2oD(@ZK1 zj+ui(vc{#X4zyEa-A(V#4HCs8u!_HvSIBS+QTXyjXl<>I*b|-9W6ls^76cJ)Ev{i? z8-s9CUj{^xiyH_>Bo~A>@#*rDFs*evtUED2FgZz0yO(EhJkWhZu2$bfQWiKdKGmv$ ziW%`vMg0_sskn1TPzjjl5dl#DIUj2rA^NNUmS4Z)g6Cqx$r}yoLM}8#>*BM?7Ja0dQselQyB)Zhwk=L9H@ z!c?|xT}-NJF0hp5qqz2mut?CH@P%*c^|(Ud5=eKD&i0DAHb))JLeC%Q&FVsg3B;p$T~!*20q1<2VU6 zOFRac2*JsTJLx+UDehGralw_oF51Hi05w&s>M0bkI=6p(CK>TKjcMJRh+hp}JyO7G z<;^xxsek=o|G5B9;Ql~r&a$zJI^_4%I+rSyK}$C17OdDYJtJ86Rux#3%AwJ;garHppRXT>==_qfSlBUPJ>WN!&YKnoEAwvnTm-XQsQUDq3V|Ak7<^3lvedm zpXtjT>tS~#GLDPq`;=f5^1C(RldtHC`D1sJpJYAfQ=QCwiFgejoEZs^hOBVP^vAO# z=J?0Hd!3TU^DGm}A6HDQ&ShM2!n;PTe|p%uB#))0pc3(aCP^Qit-blr3a@=HVy z@!ZS&XsJ4(;n{HwS!r-_c%dlDR_ZAA5W0fvW6Cy1yIZU*p+1}mo#g#m?j9gYWYFX= zIc;m4geg7es|eTaOKl-WnKPyR_v{+05Fckvc#GzQ@rv9iyK_u1ex!I{6NLwG zr4@xHDgt)ou4_XH&+TUwn}b*gCO;TR&c|sPkBHXuG9vxJ< z&zrceJv4fCC3Zt`P>)uV$u2W!SC-z^Ct^$~fzT0Jqsm1F8A{d%jIk>NvH46RndgDORka}sUXwy6$_ zhX#r(T$VKRL#??BQESyyQUw#KPGV~%muM8HLxtvki;_n(UJM`qlNRU6BqW!9nZdGE z6u^2`vB+qeJGc2b&DuQVS0NUkjvLLY7E{u8o%Alg$3~Z$;O?~>uZbo7h4^V0Dq9D! zuEEMnEk~ZaS;8f}=e zn5^;0O4W~9Cs}x_SZ@}h=BiiJ-eZG)^dlDOQ*C#@Szb()BB=<2{;%mB?ap;j*_zKg zKVwF6ghhl^+}#5Z-5O)(r=&KZ-SWXHT$+c` zH5N&ipRVegSCvDxYlebIgDsa*^rBdvoAS79M@CX{K7Fge{f9?>@FR7XpD||U;dweP zM+PQO@B6?Sxp_g-=8JP@gw&;#^Err=JhmZacpClV$RsonrN;~nj5B%bx=?_8d)SOn z*7%=tLLoxlM@RPH4~Yk%kNSlE2;?nMzr55nW+(}z6dDdKADp*d{AGwhQeXT+ugwo= z!ByfRBGBv!c&fs6zPYDSI!)e1$Fnj>)*`_Zuqp{V3{l3R!k)R=@DGqe&x}WhyxD2` z&_=9&XRWnxJscxTaY5p~GmN%X?MQO=QMiJkyDN}s#`_{s zLiUljroAIBv%EJ;a4}LJb5%beNd*DiY6U^v zsuSi{UJhl5R-7S!TWotDWnIgjzs0l?s}Gh4Gt=lIeDreJO<(Z2FZ1fdfXD1qTp`{w?b%!%HRrm|7_?UDvb8NG z9V>R=_~BgbVTC@Ev9c!LUT7TKVWOt@d2O7doOzc4r(w=;y*$qb`N**!o=&JEaioci z1(s2^EMD;8b!;=aQJ>=hV)=-wn}vvIiobhYC=Dg?BfN|R#KmmEXU+RXvop>YA%B9P zEYi;S`-+i*QXmVwZ=bG8c8&bxjEO6hLF0GNRTV4WEi_lewjoVWjT_u-wxV0?9UQ3& zNB)j)FFrP2S(fs#-Owk>`IqD2FW}}SCH#W(#5_oJH%Gv)op?`y>q!2bH^@c_8IR>) zK*M__w7o{jeCJw&S&=P-eN%s8_2BNP?u8`Gb6fwF`>uE3AGpyCFBf`xiG~D*f}d<~ z141c-Oj@EqOo94tau6K#%tP<1ZATQ!he%$J|aDkIhE4)^IesmB_Gd5Lqu?BuaRzgzz0$I=y9TOs6 z)69)@#GwZlV2;BkY-9E}flx*tL%#CyUmPn1tBPoGkw70U>GxCZJ;YFCRh1&Fo(ulS zW)YYrRG1%o5lLjcr(m)k1y@EJ0#R&4&~bU=uBVwLo-@anZd=(6S$-1OC((4me+#6d z4@xq2JN;tq#fsydCE;V!6HzqFyl9n@yr^mYu94vu9-4K3(__)3K4TI4882hvRdqn25=t^@H zPf96Q78wp}Z905ClDKDS@l;#$EPO2pu|g?+uP{toB_q2S4j_G0w^umRDEV*}J6X7d zuTz$6mgR?*q%D5x8o-SQ`(us?b)=Xrl@O-@Yf{8xG@a{Q$$)E%MI3=;rRy7OLM}8(Ti4ZY7(nrE^#et4dR|e>64?Bfw;V2rFYbX{;vlO zG3i2BHAf8J%yYOqB9jD{mDHjy>@_rCyC&>V@#AsU5m{(c{e2i9n!6BY40n;PV#+WS znz*X^Q@~@ws`2CK&3tkY)t856$R=sf$%f?RRcFMW`V0)FX;x#1I#^#-R6&wBZl&?| z1Dy5nAe(UX!wQFA?!i%N73plUdJfkc_VsEt2I8P$Mt+gqPFz~<(=3=*Xfp>7K|um7 zv=moW@*%6Do2U3&YcVC3AHK(|xl(kV;mR_tCL@M{X*O}Y-S-Mn-N+GfhLk-mHuI{V z3GyY{(vuY4N?G-kn$9F3cAe3FNP?ZgGx^$&n!heV@3A&gG%{(mkj|^tSv&Ex5Ax2$ z9cG@(C8s$@k=5LAW~*>#px3-VWIbjEc}Rqzv$cwp#8*A5wu*K3nlhhCg+#~V=HUH! z_q)b+gctv=izOI>t?D);@F)6E&0rYFx)EMBpZLc!CYpmKgktQcH6MW;ZDL0sS4CY~ zlCJeBo=stdTK&SY{2Tk8<7sW-9`Qu5XyLDAq&o+@noxCfsa^Srs~%HNC;*l~BWB%7 zg8j2&H{;vA#nZn2{k;t6C*P%qNhoX8pQ9TP4R8k$yJj^*Sm;J2{j$MP1b?3#n6{c;AnttX@^DHSeh z5~3&{O?xd1&0*70c$VEx4g{}l+YVz zXRV&NV9AXAg}t>eyM6{V#P9kS<}Sn*+}VFLLZ)ES5{whUi+yf>jEov`(7>$0VLBh| zca8@_O2t!8#$U+OShXk0qkO-s5Sd!%O9~%<{VH2#^b?GGrxzJ#JA0djD|qhLqE1=f zhViIlxz^Rv(Zoyc4(2vl#)CsH#={T1*(Di2&auet8*IJBKiT$2F__uJeb&HiX!2cV zwhjbQF)5b}Ep}PAV9Saai8TJ`0y1aVjZMx3tuXKj>Lzk@iqupep4ASd|y% zJ@PP9`YSriid2b{;z#a@dg)E}`i#%4d&UEGhn(C4dpyufw`l;{%4d*3Q7+W1J@?IC zwEVlr2C!?Kd@BfQX8Sv|W)s9L1`9q;PNXQHpLxta6e`hA%teehU|(co@N7TR$8Tz#L_O&G-PxrC_kiT9j$7+Q!J`Oh^-i@ja?->3N; z#0ojtNP`%}8`YijEXa6AJTGO~;@Q!+Rm*UQ{fp4(6EE{AC(9Ml?x=EOHbIL1L$<$r z1#+Z+6<>A~-;>zvB;;U{k{#;JuAE`EeoksZ=(0ok@Y64X_!z4&Q2!xjj^&)MY@FT! zVrzt^b|cxws|k8UIJ^Ns!pJKOcAR8$%QC1SqkuW1Z#0P-3xG#)U=HAm9&V4+%Kp)q zOJTyf$=$6VCl@|r;fnq&(1$yjJLH=byxTO&{>g!Ia}S3i;nlKZ%nRvmuIF;ZmVJ{?~xje?D)mP7@; zXr3N@1k-P=XtmEWs`JmefL#qjTAHxpUNXjyQdjS9HPzTF`q zVhaJ3DeMUjq7bTiU}JzNN^QA^RmnBqk@?fk$Ik-!vM#t}P+h=plU!cbBlw1rgP&)q z74_*SlA2WUvw~`V{1^}ptM@;`He)_{-X3*_4;8rE_RP}>oo#wX(7$RqYXdw` zu$TQXh2C;Y!57GHO;^EuKns5Xa$~`67T-wYX=g3ow%8@!nYT9}T zAt1u>5`s~MS$CQ2iX?BU>dkQZL)mpH7bCh5a*S&bt>BrwH;{QrncH@%o^eB(=|uqf zJ5aB9Vu{aAqVoi8UG&4%3Y@-uVVUdhcY%eqH^!afTJvQkJb)8Vl3az zQuGr5rqw7EWtlU1LQde*8?CrVo@Bte<->b#`Y@}r4EBqkWLEA8kxFG$G-hr;FpTi% zHY!eCaQq*qmL2ZspE3_3tVOFscTvLm%nLnQkEC2S|etxmYb%t8Melp3Y@7u2O z0qEDDL2zv1;sy^_q>mk`qW&{j>8Yc3L7|(4*|v*Ih|jD-wAPH17`IUBBTP@H# zeCz>f^A;;NI26PdByCUhNoCM3H&Y|4UK|sjxC2zx1&WC5xZg=+852<@x=i{}f&Ua>^+I97b(?|oUhdZxPr|#X>$lPmB zbRRFsIdsE@f9j*|LomZ}f>l*Q%wu;2*Fn0^;8d=P2~O7I9FaFK$gKvw zFWx6k>}u*A$aKzVU)+2vlAzi2AYlgNi9tAAGo%ZCxR59vmoHz!3{RHJM7D~gypp#3 z-c31?rPL0G@XY1%=c$591+ZPx26^ulx0Y1=dt#Aen<2l`auH47mPv;}!qw$1?tAgJSzGm0YFqzrawBt+^-)K#` zMmwp$&uy0-+ZwZ{8&|Hg4&!+MU;U9spucOqh8d>%vRugiZDL&G2J(YmmGkwGW)1BQqcQ}F1yMccAt!-Q}f#P+CdyVO5LR%JOlolkQWka*;#LZxoQlSG z3eU9o)g?>*Iz{ZpTbYJJm4P0g=*p6U0$-CRx`=g?oG0a+7V{>?K2wToxzZi~78J)E zSX>9%{UIZFZAo$fTYOQpQ|Sheoe~R4$b8&(Qdj#W2kkeI<)uy?YMyrZu*-y5VAD1t z=Y}u&G`+{U_Vh_LsbF8mc7L$^_308qVi9Y|g%P6R_HL67qjHArU?Kif=G|3#;9iK~1z0#?GH@=Fq&CnUM7QU7*pziiJ8R>oDPV1MZ+zlyTlsOX*d1Pc_3eqayE=uA(hEJ2ZBoRzN9X!MAVe9O95UVt8Fp(gnH{ z?*rIYMT9dXB{Qz`)hC7wW!}LZtb-|hPpCyxj1(bW5*_Wc$_^kQRvHsG9WSX@dZ0@R zCU3seUoIgIi6kxXFT$ZabGVIgBJnx>A%SYlu7*Hcl^WrY=n<}0)Km#}^(v>NuX8W;fr(XIR1l5t zVnH#vRhPj!5T%QcXa_;vzC6X=q5r@n%wq{Mv>}M;oIEPAHdiye-nZc_9&;mRGiT!# z!^6EmMB^m{@*T+o7D=UzuQY5FcE!b|dyf$txw|5R3^c-pi{{PA{F+@{{ zt(4bSqeA$jajBCu(0g^lvh_f)uk+v}U|2E(&UEN*^^v~msvfd-eC?2kc>kiOzI5K* z4zpdG2j~m(MJZJd9ZpTaqoWX4{CnyhYkcb@V1)D6)$3o!XL!>Lsd3tl@J1i7&LqOI zW}<(|dc-ZX9f((7vL+EwMTcaiE2i=t&BD=c&f&w`;(MY{OX&|dB#Elh)O=DOJbi5$uuB?=A><$i~c6T;eGZId2mg}kTi9D_fY?~JHhOx=q zJK3oR*|hrtsr~-RyHc603@DbnisA^Dz>dZOx$8f2qyRB8FFiM10wUqNaDyOcSdZY( z;oO(pJ%CzrQIKyJ_cIKY>L-m{B@7hy+I(1J88zabQ`a?HETWHaieb>X0mwZX{sEPl zXG4tECj;ZHdd&PG!n!f}u4tZUugP#Re2s^q49-0G;V~2G$CB&$<=I>alT&#$m8Us% z>_&g+pkTXEH7U$d2~$COwL=@KI_6@r^ws9J+SGUr;rR7cJ_Pg~7y>vtT=h=gjA)4} zMkyfz&G#0hYSnr|P?;-YPBfA6ai@3#QSNAT&pxf4dY7;W3`tuC5$VV_#zy<^VJE|o z^}X@d#O$z9tpl_A)EhVqWD7j?Ft+=d@jLWe!jx%}=uhOGLcMEk^Da>LFBl15phKK9 zD36&Nwd?M~12Ms7QzCc5G3WbqV`iy5F!3eVNBQLzxgZ(_C+p(2I}|Zo@YSn~8uHvl zxyc?#C1o2*oI8IdF7`f^1Xy#dGBHKO%cKP5NU5wDzJr?E=XV4{_rE*r-*$cf zwZoo)ft7{r?``iK|GPn);cZX*{~bA_AwLA{1|YUvpt?#TMB{sZiI2*oY`q;1Jh%qK z`64gDB0SG=dooldM|q`vLO)DRl(0F??dYMN@1O{ARrv(wvU^It#i zK8qaCB_}4c4P$qG*b1mHFc%y9g2cnQi<{QFfb}CE{@cc9mt&%$$ZhkODvHs3@~_?Z z0hh)4ZN%x;ly=_rso5pD$!kXX-x>1HwgaR0_>nQWSJ$MIz#7kQ-czCEXZ`P-{ho-w zCXI=S`R^%Xcmoms-qimGC3xc;1PyHUY)q`|ENy=8(0`Mpbu8XE24OixJ~1k36AN8? zTLm4UB#pd*k^LVda~&gF0Q0{p@c)4tXc*X-0W^&4EU!EM85sc_EKGl~4PtgW<|cZ4 zKqGSl0R8V;e71UTY{aX{@8Vl0-pX&4e+vRSR-y(bM#ld(QLrb=QW&$(<(5aXJ`GB@2e+$1IshH^78QcDahPM^?R6S{pa0`NJJTCuLJ#<3^=9*S#rnIe|Mv0ED;AbF&gGSX zc|HHR{&Qsf%m3T?&FkOy|J-GIQ|MnIm)F++D8GHYD!-AJS9HZv325@h)dAktlYdU# z|30g4SdH!PNJ*IJzs2dTNAmxIXYAidn|}~24F9HpUICa_V(;|<2axOOnAlhX7-$)o zX&C|J#&&jAoOG}J&#P!;qhn=kqGwBMX=6k|@w**a8%uqAy;lP8|GwJ4xgdsrqJ@95 zO+e>04J?iR_>O17{by67?@${|Mdc}vam3*01N?tGzMly=GVD?djWud zY4r3Q9Iw&%FO8nz_4)rVjpH>z|5IaNVyFKfJBC+c=fCXe8JHMeC+R=@y-M`|>yLr) zzx&6)#PW(d{dZj!*4GgIr$1(all.xml +--> + + + + + + + + + + + diff --git a/doc/doxygen/xml/compound.xsd b/doc/doxygen/xml/compound.xsd new file mode 100644 index 000000000..969f1322b --- /dev/null +++ b/doc/doxygen/xml/compound.xsd @@ -0,0 +1,1113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/doxygen/xml/dir_2997b6d9ddf8b2f83e82c6988822a05f.xml b/doc/doxygen/xml/dir_2997b6d9ddf8b2f83e82c6988822a05f.xml new file mode 100644 index 000000000..12c7265f3 --- /dev/null +++ b/doc/doxygen/xml/dir_2997b6d9ddf8b2f83e82c6988822a05f.xml @@ -0,0 +1,13 @@ + + + + /home/paul/dev/dynet/dynet + expr.h + training.h + + + + + + + diff --git a/doc/doxygen/xml/expr_8h.xml b/doc/doxygen/xml/expr_8h.xml new file mode 100644 index 000000000..e1cf2d775 --- /dev/null +++ b/doc/doxygen/xml/expr_8h.xml @@ -0,0 +1,227 @@ + + + + expr.h + dynet/dynet.h + dynet/nodes.h + dynet/nodes-contract.h + + + + + + + + + + + + + + + + + + + + + + dynet::expr::Expression + dynet + dynet::expr + dynet::expr::detail + + + + + +#ifndefDYNET_EXPR_H +#defineDYNET_EXPR_H + +#include"dynet/dynet.h" +#include"dynet/nodes.h" +#include"dynet/nodes-contract.h" + +namespacedynet{namespaceexpr{ + +structExpression{ +ComputationGraph*pg; +VariableIndexi; + +Expression():pg(nullptr){} +Expression(ComputationGraph*pg,VariableIndexi):pg(pg),i(i){} +constTensor&value()const{returnpg->get_value(i);} +}; + + +Expressioninput(ComputationGraph&g,reals); +Expressioninput(ComputationGraph&g,constreal*ps); +Expressioninput(ComputationGraph&g,constDim&d,conststd::vector<float>&data); +Expressioninput(ComputationGraph&g,constDim&d,conststd::vector<float>*pdata); +Expressioninput(ComputationGraph&g,constDim&d,conststd::vector<unsignedint>&ids,conststd::vector<float>&data,floatdefdata=0.f); +Expressionparameter(ComputationGraph&g,Parameterp); +Expressionconst_parameter(ComputationGraph&g,Parameterp); +Expressionlookup(ComputationGraph&g,LookupParameterp,unsignedindex); +Expressionlookup(ComputationGraph&g,LookupParameterp,constunsigned*pindex); +Expressionconst_lookup(ComputationGraph&g,LookupParameterp,unsignedindex); +Expressionconst_lookup(ComputationGraph&g,LookupParameterp,constunsigned*pindex); +//Batchedversionsoflookupandconst_lookup +Expressionlookup(ComputationGraph&g,LookupParameterp,conststd::vector<unsigned>&indices); +Expressionlookup(ComputationGraph&g,LookupParameterp,conststd::vector<unsigned>*pindices); +Expressionconst_lookup(ComputationGraph&g,LookupParameterp,conststd::vector<unsigned>&indices); +Expressionconst_lookup(ComputationGraph&g,LookupParameterp,conststd::vector<unsigned>*pindices); +Expressionzeroes(ComputationGraph&g,constDim&d); + +//specialfunctionsforcontrollingflowofinformationingraph +Expressionnobackprop(constExpression&x); + +//operators +Expressionoperator-(constExpression&x); +Expressionoperator+(constExpression&x,constExpression&y); +Expressionoperator+(constExpression&x,realy); +Expressionoperator+(realx,constExpression&y); +Expressionoperator-(constExpression&x,constExpression&y); +Expressionoperator-(realx,constExpression&y); +Expressionoperator-(constExpression&x,realy); +Expressionoperator*(constExpression&x,constExpression&y); +Expressionoperator*(constExpression&x,floaty); +inlineExpressionoperator*(floaty,constExpression&x){returnx*y;} +inlineExpressionoperator/(constExpression&x,floaty){returnx*(1.f/y);} +//colwiseaddition +Expressionaddmv(constExpression&M,constExpression&v); +//componentwisedivision +Expressioncdiv(constExpression&x,constExpression&y); +Expressioncolwise_add(constExpression&x,constExpression&bias); +//z_ij=x_ijk*y_k +Expressioncontract3d_1d(constExpression&x,constExpression&y); +//z_i=x_ijk*y_k*z_j(+b_i) +Expressioncontract3d_1d_1d(constExpression&x,constExpression&y,constExpression&z); +Expressioncontract3d_1d_1d(constExpression&x,constExpression&y,constExpression&z,constExpression&b); +//z_ij=x_ijk*y_k+b_ij +Expressioncontract3d_1d(constExpression&x,constExpression&y,constExpression&b); + +Expressionsqrt(constExpression&x); +Expressionerf(constExpression&x); +Expressiontanh(constExpression&x); +Expressionexp(constExpression&x); +Expressionsquare(constExpression&x); +Expressioncube(constExpression&x); +Expressionlgamma(constExpression&x); +Expressionlog(constExpression&x); +Expressionlogistic(constExpression&x); +Expressionrectify(constExpression&x); +Expressionhinge(constExpression&x,unsignedindex,floatm=1.0); +Expressionhinge(constExpression&x,conststd::vector<unsigned>&indices,floatm=1.0); +Expressionhinge(constExpression&x,constunsigned*pindex,floatm=1.0); +Expressionhinge(constExpression&x,conststd::vector<unsigned>*pindices,floatm=1.0); +Expressionlog_softmax(constExpression&x); +Expressionsparsemax(constExpression&x); +Expressionlog_softmax(constExpression&x,conststd::vector<unsigned>&restriction); +Expressionsparsemax(constExpression&x); +Expressionsparsemax_loss(constExpression&x,conststd::vector<unsigned>&target_support); +Expressionsparsemax_loss(constExpression&x,conststd::vector<unsigned>*ptarget_support); +Expressionsoftmax(constExpression&x); +Expressionsoftsign(constExpression&x); +Expressionpow(constExpression&x,constExpression&y); +Expressionmin(constExpression&x,constExpression&y); +Expressionmax(constExpression&x,constExpression&y); +Expressionnoise(constExpression&x,realstddev); +Expressiondropout(constExpression&x,realp); +Expressionblock_dropout(constExpression&x,realp); + +//reshape::forwardisO(1),butbackwardisO(n) +Expressionreshape(constExpression&x,constDim&d); +//transposerequiresO(n) +Expressiontranspose(constExpression&x); +Expressionselect_rows(constExpression&x,conststd::vector<unsigned>&rows); +Expressionselect_rows(constExpression&x,conststd::vector<unsigned>*prows); +//select_colsismoreefficientthanselect_rowssinceEigenusescolumn-majororder +Expressionselect_cols(constExpression&x,conststd::vector<unsigned>&cols); +Expressionselect_cols(constExpression&x,conststd::vector<unsigned>*pcols); +//matrixinverse +Expressioninverse(constExpression&x); +Expressionlogdet(constExpression&x); + +Expressiontrace_of_product(constExpression&x,constExpression&y); +Expressioncwise_multiply(constExpression&x,constExpression&y); + +Expressionsquared_norm(constExpression&x); +Expressiondot_product(constExpression&x,constExpression&y); +Expressionsquared_distance(constExpression&x,constExpression&y); +Expressionhuber_distance(constExpression&x,constExpression&y,floatc=1.345f); +Expressionl1_distance(constExpression&x,constExpression&y); +Expressionbinary_log_loss(constExpression&x,constExpression&y); +Expressionpairwise_rank_loss(constExpression&x,constExpression&y,realm=1.0); +Expressionpoisson_loss(constExpression&x,unsignedy); +Expressionpoisson_loss(constExpression&x,constunsigned*py); + +//variousconvolutionythings +Expressionconv1d_narrow(constExpression&x,constExpression&f); +Expressionconv1d_wide(constExpression&x,constExpression&f); +Expressionfilter1d_narrow(constExpression&x,constExpression&f); +Expressionkmax_pooling(constExpression&x,unsignedk); +Expressionfold_rows(constExpression&x,unsignednrows=2); +Expressionsum_cols(constExpression&x); +Expressionaverage_cols(constExpression&x); +Expressionkmh_ngram(constExpression&x,unsignedn); + +//Sumtheresultsofmultiplebatches +Expressionsum_batches(constExpression&x); + +//pickpartsoutofbiggerobjects +Expressionpick(constExpression&x,unsignedv); +Expressionpick(constExpression&x,conststd::vector<unsigned>&v); +Expressionpick(constExpression&x,unsigned*pv); +Expressionpick(constExpression&x,conststd::vector<unsigned>*pv); +Expressionpickrange(constExpression&x,unsignedv,unsignedu); +Expressionpickneglogsoftmax(constExpression&x,unsignedv); +Expressionpickneglogsoftmax(constExpression&x,conststd::vector<unsigned>&v); +Expressionpickneglogsoftmax(constExpression&x,unsigned*pv); +Expressionpickneglogsoftmax(constExpression&x,conststd::vector<unsigned>*pv); + +namespacedetail{ +template<typenameF,typenameT> +Expressionf(constT&xs){ +ComputationGraph*pg=xs.begin()->pg; +std::vector<VariableIndex>xis(xs.size()); +inti=0; +for(autoxi=xs.begin();xi!=xs.end();++xi)xis[i++]=xi->i; +returnExpression(pg,pg->add_function<F>(xis)); +} +} + +template<typenameT> +inlineExpressionlogsumexp(constT&xs){returndetail::f<LogSumExp>(xs);} +inlineExpressionlogsumexp(conststd::initializer_list<Expression>&xs){returndetail::f<LogSumExp>(xs);} + +template<typenameT> +inlineExpressionsum(constT&xs){returndetail::f<Sum>(xs);} +inlineExpressionsum(conststd::initializer_list<Expression>&xs){returndetail::f<Sum>(xs);} + +template<typenameT> +inlineExpressionmax(constT&xs){returndetail::f<Max>(xs);} +inlineExpressionmax(conststd::initializer_list<Expression>&xs){returndetail::f<Max>(xs);} + +template<typenameT> +inlineExpressionaverage(constT&xs){returndetail::f<Average>(xs);} +inlineExpressionaverage(conststd::initializer_list<Expression>&xs){returndetail::f<Average>(xs);} + +template<typenameT> +inlineExpressionconcatenate_cols(constT&xs){returndetail::f<ConcatenateColumns>(xs);} +inlineExpressionconcatenate_cols(conststd::initializer_list<Expression>&xs){returndetail::f<ConcatenateColumns>(xs);} + +template<typenameT> +inlineExpressionconcatenate(constT&xs){returndetail::f<Concatenate>(xs);} +inlineExpressionconcatenate(conststd::initializer_list<Expression>&xs){returndetail::f<Concatenate>(xs);} + +template<typenameT> +inlineExpressionaffine_transform(constT&xs){returndetail::f<AffineTransform>(xs);} +inlineExpressionaffine_transform(conststd::initializer_list<Expression>&xs){returndetail::f<AffineTransform>(xs);} + +}} + +#endif + + + + diff --git a/doc/doxygen/xml/index.xml b/doc/doxygen/xml/index.xml new file mode 100644 index 000000000..c19dab0a5 --- /dev/null +++ b/doc/doxygen/xml/index.xml @@ -0,0 +1,227 @@ + + + dynet::AdadeltaTrainer + epsilon + rho + hg + hlg + hd + hld + boost::serialization::access + AdadeltaTrainer + alloc_impl + AdadeltaTrainer + serialize + + dynet::AdagradTrainer + epsilon + vp + vlp + boost::serialization::access + AdagradTrainer + alloc_impl + AdagradTrainer + serialize + + dynet::AdamTrainer + beta_1 + beta_2 + epsilon + m + lm + v + lv + boost::serialization::access + AdamTrainer + alloc_impl + AdamTrainer + serialize + + dynet::expr::Expression + pg + i + Expression + Expression + value + + dynet::MomentumSGDTrainer + momentum + vp + vlp + boost::serialization::access + MomentumSGDTrainer + alloc_impl + MomentumSGDTrainer + serialize + + dynet::RmsPropTrainer + epsilon + rho + hg + hlg + boost::serialization::access + RmsPropTrainer + alloc_impl + RmsPropTrainer + serialize + + dynet::SimpleSGDTrainer + boost::serialization::access + SimpleSGDTrainer + SimpleSGDTrainer + serialize + + dynet::Trainer + eta0 + eta + eta_decay + epoch + clipping_enabled + clip_threshold + clips + updates + aux_allocated + model + boost::serialization::access + Trainer + ~Trainer + update + update_epoch + clip_gradients + rescale_and_reset_weight_decay + status + Trainer + alloc_impl + update_rule + update_params + update_lookup_params + serialize + + dynet + + dynet::expr + input + input + input + input + input + parameter + const_parameter + lookup + lookup + const_lookup + const_lookup + lookup + lookup + const_lookup + const_lookup + zeroes + nobackprop + operator- + operator+ + operator+ + operator+ + operator- + operator- + operator- + operator* + operator* + operator* + operator/ + addmv + cdiv + colwise_add + contract3d_1d + contract3d_1d_1d + contract3d_1d_1d + contract3d_1d + sqrt + erf + tanh + exp + square + cube + lgamma + log + logistic + rectify + hinge + hinge + hinge + hinge + log_softmax + sparsemax + log_softmax + sparsemax_loss + sparsemax_loss + softmax + softsign + pow + min + max + noise + dropout + block_dropout + reshape + transpose + select_rows + select_rows + select_cols + select_cols + inverse + logdet + trace_of_product + cwise_multiply + squared_norm + dot_product + squared_distance + huber_distance + l1_distance + binary_log_loss + pairwise_rank_loss + poisson_loss + poisson_loss + conv1d_narrow + conv1d_wide + filter1d_narrow + kmax_pooling + fold_rows + sum_cols + average_cols + kmh_ngram + sum_batches + pick + pick + pick + pick + pickrange + pickneglogsoftmax + pickneglogsoftmax + pickneglogsoftmax + pickneglogsoftmax + logsumexp + logsumexp + sum + sum + max + max + average + average + concatenate_cols + concatenate_cols + concatenate + concatenate + affine_transform + affine_transform + + dynet::expr::detail + f + + expr.h + + training.h + DYNET_TRAINER_DEFINE_DEV_IMPL + + /home/paul/dev/dynet/dynet + + diff --git a/doc/doxygen/xml/index.xsd b/doc/doxygen/xml/index.xsd new file mode 100644 index 000000000..d7ab2a906 --- /dev/null +++ b/doc/doxygen/xml/index.xsd @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/doxygen/xml/namespacedynet.xml b/doc/doxygen/xml/namespacedynet.xml new file mode 100644 index 000000000..e6d8a6efd --- /dev/null +++ b/doc/doxygen/xml/namespacedynet.xml @@ -0,0 +1,19 @@ + + + + dynet + dynet::AdadeltaTrainer + dynet::AdagradTrainer + dynet::AdamTrainer + dynet::MomentumSGDTrainer + dynet::RmsPropTrainer + dynet::SimpleSGDTrainer + dynet::Trainer + dynet::expr + + + + + + + diff --git a/doc/doxygen/xml/namespacedynet_1_1expr.xml b/doc/doxygen/xml/namespacedynet_1_1expr.xml new file mode 100644 index 000000000..5c9cfdf50 --- /dev/null +++ b/doc/doxygen/xml/namespacedynet_1_1expr.xml @@ -0,0 +1,2379 @@ + + + + dynet::expr + dynet::expr::Expression + dynet::expr::detail + + + Expression + Expression dynet::expr::input + (ComputationGraph &g, real s) + input + + ComputationGraph & + g + + + real + s + + + + + + + + + + + Expression + Expression dynet::expr::input + (ComputationGraph &g, const real *ps) + input + + ComputationGraph & + g + + + const real * + ps + + + + + + + + + + + Expression + Expression dynet::expr::input + (ComputationGraph &g, const Dim &d, const std::vector< float > &data) + input + + ComputationGraph & + g + + + const Dim & + d + + + const std::vector< float > & + data + + + + + + + + + + + Expression + Expression dynet::expr::input + (ComputationGraph &g, const Dim &d, const std::vector< float > *pdata) + input + + ComputationGraph & + g + + + const Dim & + d + + + const std::vector< float > * + pdata + + + + + + + + + + + Expression + Expression dynet::expr::input + (ComputationGraph &g, const Dim &d, const std::vector< unsigned int > &ids, const std::vector< float > &data, float defdata=0.f) + input + + ComputationGraph & + g + + + const Dim & + d + + + const std::vector< unsigned int > & + ids + + + const std::vector< float > & + data + + + float + defdata + 0.f + + + + + + + + + + + Expression + Expression dynet::expr::parameter + (ComputationGraph &g, Parameter p) + parameter + + ComputationGraph & + g + + + Parameter + p + + + + + + + + + + + Expression + Expression dynet::expr::const_parameter + (ComputationGraph &g, Parameter p) + const_parameter + + ComputationGraph & + g + + + Parameter + p + + + + + + + + + + + Expression + Expression dynet::expr::lookup + (ComputationGraph &g, LookupParameter p, unsigned index) + lookup + + ComputationGraph & + g + + + LookupParameter + p + + + unsigned + index + + + + + + + + + + + Expression + Expression dynet::expr::lookup + (ComputationGraph &g, LookupParameter p, const unsigned *pindex) + lookup + + ComputationGraph & + g + + + LookupParameter + p + + + const unsigned * + pindex + + + + + + + + + + + Expression + Expression dynet::expr::const_lookup + (ComputationGraph &g, LookupParameter p, unsigned index) + const_lookup + + ComputationGraph & + g + + + LookupParameter + p + + + unsigned + index + + + + + + + + + + + Expression + Expression dynet::expr::const_lookup + (ComputationGraph &g, LookupParameter p, const unsigned *pindex) + const_lookup + + ComputationGraph & + g + + + LookupParameter + p + + + const unsigned * + pindex + + + + + + + + + + + Expression + Expression dynet::expr::lookup + (ComputationGraph &g, LookupParameter p, const std::vector< unsigned > &indices) + lookup + + ComputationGraph & + g + + + LookupParameter + p + + + const std::vector< unsigned > & + indices + + + + + + + + + + + Expression + Expression dynet::expr::lookup + (ComputationGraph &g, LookupParameter p, const std::vector< unsigned > *pindices) + lookup + + ComputationGraph & + g + + + LookupParameter + p + + + const std::vector< unsigned > * + pindices + + + + + + + + + + + Expression + Expression dynet::expr::const_lookup + (ComputationGraph &g, LookupParameter p, const std::vector< unsigned > &indices) + const_lookup + + ComputationGraph & + g + + + LookupParameter + p + + + const std::vector< unsigned > & + indices + + + + + + + + + + + Expression + Expression dynet::expr::const_lookup + (ComputationGraph &g, LookupParameter p, const std::vector< unsigned > *pindices) + const_lookup + + ComputationGraph & + g + + + LookupParameter + p + + + const std::vector< unsigned > * + pindices + + + + + + + + + + + Expression + Expression dynet::expr::zeroes + (ComputationGraph &g, const Dim &d) + zeroes + + ComputationGraph & + g + + + const Dim & + d + + + + + + + + + + + Expression + Expression dynet::expr::nobackprop + (const Expression &x) + nobackprop + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::operator- + (const Expression &x) + operator- + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::operator+ + (const Expression &x, const Expression &y) + operator+ + + const Expression & + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::operator+ + (const Expression &x, real y) + operator+ + + const Expression & + x + + + real + y + + + + + + + + + + + Expression + Expression dynet::expr::operator+ + (real x, const Expression &y) + operator+ + + real + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::operator- + (const Expression &x, const Expression &y) + operator- + + const Expression & + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::operator- + (real x, const Expression &y) + operator- + + real + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::operator- + (const Expression &x, real y) + operator- + + const Expression & + x + + + real + y + + + + + + + + + + + Expression + Expression dynet::expr::operator* + (const Expression &x, const Expression &y) + operator* + + const Expression & + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::operator* + (const Expression &x, float y) + operator* + + const Expression & + x + + + float + y + + + + + + + + + + + Expression + Expression dynet::expr::operator* + (float y, const Expression &x) + operator* + + float + y + + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::operator/ + (const Expression &x, float y) + operator/ + + const Expression & + x + + + float + y + + + + + + + + + + + Expression + Expression dynet::expr::addmv + (const Expression &M, const Expression &v) + addmv + + const Expression & + M + + + const Expression & + v + + + + + + + + + + + Expression + Expression dynet::expr::cdiv + (const Expression &x, const Expression &y) + cdiv + + const Expression & + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::colwise_add + (const Expression &x, const Expression &bias) + colwise_add + + const Expression & + x + + + const Expression & + bias + + + + + + + + + + + Expression + Expression dynet::expr::contract3d_1d + (const Expression &x, const Expression &y) + contract3d_1d + + const Expression & + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::contract3d_1d_1d + (const Expression &x, const Expression &y, const Expression &z) + contract3d_1d_1d + + const Expression & + x + + + const Expression & + y + + + const Expression & + z + + + + + + + + + + + Expression + Expression dynet::expr::contract3d_1d_1d + (const Expression &x, const Expression &y, const Expression &z, const Expression &b) + contract3d_1d_1d + + const Expression & + x + + + const Expression & + y + + + const Expression & + z + + + const Expression & + b + + + + + + + + + + + Expression + Expression dynet::expr::contract3d_1d + (const Expression &x, const Expression &y, const Expression &b) + contract3d_1d + + const Expression & + x + + + const Expression & + y + + + const Expression & + b + + + + + + + + + + + Expression + Expression dynet::expr::sqrt + (const Expression &x) + sqrt + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::erf + (const Expression &x) + erf + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::tanh + (const Expression &x) + tanh + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::exp + (const Expression &x) + exp + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::square + (const Expression &x) + square + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::cube + (const Expression &x) + cube + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::lgamma + (const Expression &x) + lgamma + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::log + (const Expression &x) + log + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::logistic + (const Expression &x) + logistic + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::rectify + (const Expression &x) + rectify + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::hinge + (const Expression &x, unsigned index, float m=1.0) + hinge + + const Expression & + x + + + unsigned + index + + + float + m + 1.0 + + + + + + + + + + + Expression + Expression dynet::expr::hinge + (const Expression &x, const std::vector< unsigned > &indices, float m=1.0) + hinge + + const Expression & + x + + + const std::vector< unsigned > & + indices + + + float + m + 1.0 + + + + + + + + + + + Expression + Expression dynet::expr::hinge + (const Expression &x, const unsigned *pindex, float m=1.0) + hinge + + const Expression & + x + + + const unsigned * + pindex + + + float + m + 1.0 + + + + + + + + + + + Expression + Expression dynet::expr::hinge + (const Expression &x, const std::vector< unsigned > *pindices, float m=1.0) + hinge + + const Expression & + x + + + const std::vector< unsigned > * + pindices + + + float + m + 1.0 + + + + + + + + + + + Expression + Expression dynet::expr::log_softmax + (const Expression &x) + log_softmax + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::sparsemax + (const Expression &x) + sparsemax + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::log_softmax + (const Expression &x, const std::vector< unsigned > &restriction) + log_softmax + + const Expression & + x + + + const std::vector< unsigned > & + restriction + + + + + + + + + + + Expression + Expression dynet::expr::sparsemax_loss + (const Expression &x, const std::vector< unsigned > &target_support) + sparsemax_loss + + const Expression & + x + + + const std::vector< unsigned > & + target_support + + + + + + + + + + + Expression + Expression dynet::expr::sparsemax_loss + (const Expression &x, const std::vector< unsigned > *ptarget_support) + sparsemax_loss + + const Expression & + x + + + const std::vector< unsigned > * + ptarget_support + + + + + + + + + + + Expression + Expression dynet::expr::softmax + (const Expression &x) + softmax + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::softsign + (const Expression &x) + softsign + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::pow + (const Expression &x, const Expression &y) + pow + + const Expression & + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::min + (const Expression &x, const Expression &y) + min + + const Expression & + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::max + (const Expression &x, const Expression &y) + max + + const Expression & + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::noise + (const Expression &x, real stddev) + noise + + const Expression & + x + + + real + stddev + + + + + + + + + + + Expression + Expression dynet::expr::dropout + (const Expression &x, real p) + dropout + + const Expression & + x + + + real + p + + + + + + + + + + + Expression + Expression dynet::expr::block_dropout + (const Expression &x, real p) + block_dropout + + const Expression & + x + + + real + p + + + + + + + + + + + Expression + Expression dynet::expr::reshape + (const Expression &x, const Dim &d) + reshape + + const Expression & + x + + + const Dim & + d + + + + + + + + + + + Expression + Expression dynet::expr::transpose + (const Expression &x) + transpose + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::select_rows + (const Expression &x, const std::vector< unsigned > &rows) + select_rows + + const Expression & + x + + + const std::vector< unsigned > & + rows + + + + + + + + + + + Expression + Expression dynet::expr::select_rows + (const Expression &x, const std::vector< unsigned > *prows) + select_rows + + const Expression & + x + + + const std::vector< unsigned > * + prows + + + + + + + + + + + Expression + Expression dynet::expr::select_cols + (const Expression &x, const std::vector< unsigned > &cols) + select_cols + + const Expression & + x + + + const std::vector< unsigned > & + cols + + + + + + + + + + + Expression + Expression dynet::expr::select_cols + (const Expression &x, const std::vector< unsigned > *pcols) + select_cols + + const Expression & + x + + + const std::vector< unsigned > * + pcols + + + + + + + + + + + Expression + Expression dynet::expr::inverse + (const Expression &x) + inverse + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::logdet + (const Expression &x) + logdet + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::trace_of_product + (const Expression &x, const Expression &y) + trace_of_product + + const Expression & + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::cwise_multiply + (const Expression &x, const Expression &y) + cwise_multiply + + const Expression & + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::squared_norm + (const Expression &x) + squared_norm + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::dot_product + (const Expression &x, const Expression &y) + dot_product + + const Expression & + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::squared_distance + (const Expression &x, const Expression &y) + squared_distance + + const Expression & + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::huber_distance + (const Expression &x, const Expression &y, float c=1.345f) + huber_distance + + const Expression & + x + + + const Expression & + y + + + float + c + 1.345f + + + + + + + + + + + Expression + Expression dynet::expr::l1_distance + (const Expression &x, const Expression &y) + l1_distance + + const Expression & + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::binary_log_loss + (const Expression &x, const Expression &y) + binary_log_loss + + const Expression & + x + + + const Expression & + y + + + + + + + + + + + Expression + Expression dynet::expr::pairwise_rank_loss + (const Expression &x, const Expression &y, real m=1.0) + pairwise_rank_loss + + const Expression & + x + + + const Expression & + y + + + real + m + 1.0 + + + + + + + + + + + Expression + Expression dynet::expr::poisson_loss + (const Expression &x, unsigned y) + poisson_loss + + const Expression & + x + + + unsigned + y + + + + + + + + + + + Expression + Expression dynet::expr::poisson_loss + (const Expression &x, const unsigned *py) + poisson_loss + + const Expression & + x + + + const unsigned * + py + + + + + + + + + + + Expression + Expression dynet::expr::conv1d_narrow + (const Expression &x, const Expression &f) + conv1d_narrow + + const Expression & + x + + + const Expression & + f + + + + + + + + + + + Expression + Expression dynet::expr::conv1d_wide + (const Expression &x, const Expression &f) + conv1d_wide + + const Expression & + x + + + const Expression & + f + + + + + + + + + + + Expression + Expression dynet::expr::filter1d_narrow + (const Expression &x, const Expression &f) + filter1d_narrow + + const Expression & + x + + + const Expression & + f + + + + + + + + + + + Expression + Expression dynet::expr::kmax_pooling + (const Expression &x, unsigned k) + kmax_pooling + + const Expression & + x + + + unsigned + k + + + + + + + + + + + Expression + Expression dynet::expr::fold_rows + (const Expression &x, unsigned nrows=2) + fold_rows + + const Expression & + x + + + unsigned + nrows + 2 + + + + + + + + + + + Expression + Expression dynet::expr::sum_cols + (const Expression &x) + sum_cols + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::average_cols + (const Expression &x) + average_cols + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::kmh_ngram + (const Expression &x, unsigned n) + kmh_ngram + + const Expression & + x + + + unsigned + n + + + + + + + + + + + Expression + Expression dynet::expr::sum_batches + (const Expression &x) + sum_batches + + const Expression & + x + + + + + + + + + + + Expression + Expression dynet::expr::pick + (const Expression &x, unsigned v) + pick + + const Expression & + x + + + unsigned + v + + + + + + + + + + + Expression + Expression dynet::expr::pick + (const Expression &x, const std::vector< unsigned > &v) + pick + + const Expression & + x + + + const std::vector< unsigned > & + v + + + + + + + + + + + Expression + Expression dynet::expr::pick + (const Expression &x, unsigned *pv) + pick + + const Expression & + x + + + unsigned * + pv + + + + + + + + + + + Expression + Expression dynet::expr::pick + (const Expression &x, const std::vector< unsigned > *pv) + pick + + const Expression & + x + + + const std::vector< unsigned > * + pv + + + + + + + + + + + Expression + Expression dynet::expr::pickrange + (const Expression &x, unsigned v, unsigned u) + pickrange + + const Expression & + x + + + unsigned + v + + + unsigned + u + + + + + + + + + + + Expression + Expression dynet::expr::pickneglogsoftmax + (const Expression &x, unsigned v) + pickneglogsoftmax + + const Expression & + x + + + unsigned + v + + + + + + + + + + + Expression + Expression dynet::expr::pickneglogsoftmax + (const Expression &x, const std::vector< unsigned > &v) + pickneglogsoftmax + + const Expression & + x + + + const std::vector< unsigned > & + v + + + + + + + + + + + Expression + Expression dynet::expr::pickneglogsoftmax + (const Expression &x, unsigned *pv) + pickneglogsoftmax + + const Expression & + x + + + unsigned * + pv + + + + + + + + + + + Expression + Expression dynet::expr::pickneglogsoftmax + (const Expression &x, const std::vector< unsigned > *pv) + pickneglogsoftmax + + const Expression & + x + + + const std::vector< unsigned > * + pv + + + + + + + + + + + + + typename T + + + Expression + Expression dynet::expr::logsumexp + (const T &xs) + logsumexp + + const T & + xs + + + + + + + + + + + Expression + Expression dynet::expr::logsumexp + (const std::initializer_list< Expression > &xs) + logsumexp + + const std::initializer_list< Expression > & + xs + + + + + + + + + + + + + typename T + + + Expression + Expression dynet::expr::sum + (const T &xs) + sum + + const T & + xs + + + + + + + + + + + Expression + Expression dynet::expr::sum + (const std::initializer_list< Expression > &xs) + sum + + const std::initializer_list< Expression > & + xs + + + + + + + + + + + + + typename T + + + Expression + Expression dynet::expr::max + (const T &xs) + max + + const T & + xs + + + + + + + + + + + Expression + Expression dynet::expr::max + (const std::initializer_list< Expression > &xs) + max + + const std::initializer_list< Expression > & + xs + + + + + + + + + + + + + typename T + + + Expression + Expression dynet::expr::average + (const T &xs) + average + + const T & + xs + + + + + + + + + + + Expression + Expression dynet::expr::average + (const std::initializer_list< Expression > &xs) + average + + const std::initializer_list< Expression > & + xs + + + + + + + + + + + + + typename T + + + Expression + Expression dynet::expr::concatenate_cols + (const T &xs) + concatenate_cols + + const T & + xs + + + + + + + + + + + Expression + Expression dynet::expr::concatenate_cols + (const std::initializer_list< Expression > &xs) + concatenate_cols + + const std::initializer_list< Expression > & + xs + + + + + + + + + + + + + typename T + + + Expression + Expression dynet::expr::concatenate + (const T &xs) + concatenate + + const T & + xs + + + + + + + + + + + Expression + Expression dynet::expr::concatenate + (const std::initializer_list< Expression > &xs) + concatenate + + const std::initializer_list< Expression > & + xs + + + + + + + + + + + + + typename T + + + Expression + Expression dynet::expr::affine_transform + (const T &xs) + affine_transform + + const T & + xs + + + + + + + + + + + Expression + Expression dynet::expr::affine_transform + (const std::initializer_list< Expression > &xs) + affine_transform + + const std::initializer_list< Expression > & + xs + + + + + + + + + + + + + + + + + diff --git a/doc/doxygen/xml/namespacedynet_1_1expr_1_1detail.xml b/doc/doxygen/xml/namespacedynet_1_1expr_1_1detail.xml new file mode 100644 index 000000000..6636e75c4 --- /dev/null +++ b/doc/doxygen/xml/namespacedynet_1_1expr_1_1detail.xml @@ -0,0 +1,38 @@ + + + + dynet::expr::detail + + + + + typename F + + + typename T + + + Expression + Expression dynet::expr::detail::f + (const T &xs) + f + + const T & + xs + + + + + + + + + + + + + + + + + diff --git a/doc/doxygen/xml/structdynet_1_1AdadeltaTrainer.xml b/doc/doxygen/xml/structdynet_1_1AdadeltaTrainer.xml new file mode 100644 index 000000000..7fa0b6411 --- /dev/null +++ b/doc/doxygen/xml/structdynet_1_1AdadeltaTrainer.xml @@ -0,0 +1,251 @@ + + + + dynet::AdadeltaTrainer + dynet::Trainer + + + real + real dynet::AdadeltaTrainer::epsilon + + epsilon + + + + + + + + + + real + real dynet::AdadeltaTrainer::rho + + rho + + + + + + + + + + std::vector< ShadowParameters > + std::vector<ShadowParameters> dynet::AdadeltaTrainer::hg + + hg + + + + + + + + + + std::vector< ShadowLookupParameters > + std::vector<ShadowLookupParameters> dynet::AdadeltaTrainer::hlg + + hlg + + + + + + + + + + std::vector< ShadowParameters > + std::vector<ShadowParameters> dynet::AdadeltaTrainer::hd + + hd + + + + + + + + + + std::vector< ShadowLookupParameters > + std::vector<ShadowLookupParameters> dynet::AdadeltaTrainer::hld + + hld + + + + + + + + + + + + friend class + friend class boost::serialization::access + + boost::serialization::access + + + + + + + + + + + + + dynet::AdadeltaTrainer::AdadeltaTrainer + (Model *m, real eps=1e-6, real rho=0.95) + AdadeltaTrainer + + Model * + m + + + real + eps + 1e-6 + + + real + rho + 0.95 + + + + + + + + + + + + + void + virtual void dynet::AdadeltaTrainer::alloc_impl + () override + alloc_impl + alloc_impl + + + + + + + + + + + + + dynet::AdadeltaTrainer::AdadeltaTrainer + () + AdadeltaTrainer + + + + + + + + + + + + class Archive + + + void + void dynet::AdadeltaTrainer::serialize + (Archive &ar, const unsigned int) + serialize + + Archive & + ar + + + const unsigned + int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dynet::AdadeltaTrainerAdadeltaTrainer + dynet::AdadeltaTrainerAdadeltaTrainer + dynet::AdadeltaTraineralloc_impl + dynet::AdadeltaTraineraux_allocated + dynet::AdadeltaTrainerboost::serialization::access + dynet::AdadeltaTrainerclip_gradients + dynet::AdadeltaTrainerclip_threshold + dynet::AdadeltaTrainerclipping_enabled + dynet::AdadeltaTrainerclips + dynet::AdadeltaTrainerepoch + dynet::AdadeltaTrainerepsilon + dynet::AdadeltaTrainereta + dynet::AdadeltaTrainereta0 + dynet::AdadeltaTrainereta_decay + dynet::AdadeltaTrainerhd + dynet::AdadeltaTrainerhg + dynet::AdadeltaTrainerhld + dynet::AdadeltaTrainerhlg + dynet::AdadeltaTrainermodel + dynet::AdadeltaTrainerrescale_and_reset_weight_decay + dynet::AdadeltaTrainerrho + dynet::AdadeltaTrainerserialize + dynet::AdadeltaTrainerstatus + dynet::AdadeltaTrainerTrainer + dynet::AdadeltaTrainerTrainer + dynet::AdadeltaTrainerupdate + dynet::AdadeltaTrainerupdate_epoch + dynet::AdadeltaTrainerupdate_lookup_params + dynet::AdadeltaTrainerupdate_params + dynet::AdadeltaTrainerupdate_rule + dynet::AdadeltaTrainerupdates + dynet::AdadeltaTrainer~Trainer + + + diff --git a/doc/doxygen/xml/structdynet_1_1AdagradTrainer.xml b/doc/doxygen/xml/structdynet_1_1AdagradTrainer.xml new file mode 100644 index 000000000..d8d50f135 --- /dev/null +++ b/doc/doxygen/xml/structdynet_1_1AdagradTrainer.xml @@ -0,0 +1,209 @@ + + + + dynet::AdagradTrainer + dynet::Trainer + + + real + real dynet::AdagradTrainer::epsilon + + epsilon + + + + + + + + + + std::vector< ShadowParameters > + std::vector<ShadowParameters> dynet::AdagradTrainer::vp + + vp + + + + + + + + + + std::vector< ShadowLookupParameters > + std::vector<ShadowLookupParameters> dynet::AdagradTrainer::vlp + + vlp + + + + + + + + + + + + friend class + friend class boost::serialization::access + + boost::serialization::access + + + + + + + + + + + + + dynet::AdagradTrainer::AdagradTrainer + (Model *m, real e0=0.1, real eps=1e-20) + AdagradTrainer + + Model * + m + + + real + e0 + 0.1 + + + real + eps + 1e-20 + + + + + + + + + + + + + void + virtual void dynet::AdagradTrainer::alloc_impl + () override + alloc_impl + alloc_impl + + + + + + + + + + + + + dynet::AdagradTrainer::AdagradTrainer + () + AdagradTrainer + + + + + + + + + + + + class Archive + + + void + void dynet::AdagradTrainer::serialize + (Archive &ar, const unsigned int) + serialize + + Archive & + ar + + + const unsigned + int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dynet::AdagradTrainerAdagradTrainer + dynet::AdagradTrainerAdagradTrainer + dynet::AdagradTraineralloc_impl + dynet::AdagradTraineraux_allocated + dynet::AdagradTrainerboost::serialization::access + dynet::AdagradTrainerclip_gradients + dynet::AdagradTrainerclip_threshold + dynet::AdagradTrainerclipping_enabled + dynet::AdagradTrainerclips + dynet::AdagradTrainerepoch + dynet::AdagradTrainerepsilon + dynet::AdagradTrainereta + dynet::AdagradTrainereta0 + dynet::AdagradTrainereta_decay + dynet::AdagradTrainermodel + dynet::AdagradTrainerrescale_and_reset_weight_decay + dynet::AdagradTrainerserialize + dynet::AdagradTrainerstatus + dynet::AdagradTrainerTrainer + dynet::AdagradTrainerTrainer + dynet::AdagradTrainerupdate + dynet::AdagradTrainerupdate_epoch + dynet::AdagradTrainerupdate_lookup_params + dynet::AdagradTrainerupdate_params + dynet::AdagradTrainerupdate_rule + dynet::AdagradTrainerupdates + dynet::AdagradTrainervlp + dynet::AdagradTrainervp + dynet::AdagradTrainer~Trainer + + + diff --git a/doc/doxygen/xml/structdynet_1_1AdamTrainer.xml b/doc/doxygen/xml/structdynet_1_1AdamTrainer.xml new file mode 100644 index 000000000..8cba65a5e --- /dev/null +++ b/doc/doxygen/xml/structdynet_1_1AdamTrainer.xml @@ -0,0 +1,275 @@ + + + + dynet::AdamTrainer + dynet::Trainer + + + float + float dynet::AdamTrainer::beta_1 + + beta_1 + + + + + + + + + + float + float dynet::AdamTrainer::beta_2 + + beta_2 + + + + + + + + + + float + float dynet::AdamTrainer::epsilon + + epsilon + + + + + + + + + + std::vector< ShadowParameters > + std::vector<ShadowParameters> dynet::AdamTrainer::m + + m + + + + + + + + + + std::vector< ShadowLookupParameters > + std::vector<ShadowLookupParameters> dynet::AdamTrainer::lm + + lm + + + + + + + + + + std::vector< ShadowParameters > + std::vector<ShadowParameters> dynet::AdamTrainer::v + + v + + + + + + + + + + std::vector< ShadowLookupParameters > + std::vector<ShadowLookupParameters> dynet::AdamTrainer::lv + + lv + + + + + + + + + + + + friend class + friend class boost::serialization::access + + boost::serialization::access + + + + + + + + + + + + + dynet::AdamTrainer::AdamTrainer + (Model *m, float alpha=0.001, float beta_1=0.9, float beta_2=0.999, float eps=1e-8) + AdamTrainer + + Model * + m + + + float + alpha + 0.001 + + + float + beta_1 + 0.9 + + + float + beta_2 + 0.999 + + + float + eps + 1e-8 + + + + + + + + + + + + + void + virtual void dynet::AdamTrainer::alloc_impl + () override + alloc_impl + alloc_impl + + + + + + + + + + + + + dynet::AdamTrainer::AdamTrainer + () + AdamTrainer + + + + + + + + + + + + class Archive + + + void + void dynet::AdamTrainer::serialize + (Archive &ar, const unsigned int) + serialize + + Archive & + ar + + + const unsigned + int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dynet::AdamTrainerAdamTrainer + dynet::AdamTrainerAdamTrainer + dynet::AdamTraineralloc_impl + dynet::AdamTraineraux_allocated + dynet::AdamTrainerbeta_1 + dynet::AdamTrainerbeta_2 + dynet::AdamTrainerboost::serialization::access + dynet::AdamTrainerclip_gradients + dynet::AdamTrainerclip_threshold + dynet::AdamTrainerclipping_enabled + dynet::AdamTrainerclips + dynet::AdamTrainerepoch + dynet::AdamTrainerepsilon + dynet::AdamTrainereta + dynet::AdamTrainereta0 + dynet::AdamTrainereta_decay + dynet::AdamTrainerlm + dynet::AdamTrainerlv + dynet::AdamTrainerm + dynet::AdamTrainermodel + dynet::AdamTrainerrescale_and_reset_weight_decay + dynet::AdamTrainerserialize + dynet::AdamTrainerstatus + dynet::AdamTrainerTrainer + dynet::AdamTrainerTrainer + dynet::AdamTrainerupdate + dynet::AdamTrainerupdate_epoch + dynet::AdamTrainerupdate_lookup_params + dynet::AdamTrainerupdate_params + dynet::AdamTrainerupdate_rule + dynet::AdamTrainerupdates + dynet::AdamTrainerv + dynet::AdamTrainer~Trainer + + + diff --git a/doc/doxygen/xml/structdynet_1_1MomentumSGDTrainer.xml b/doc/doxygen/xml/structdynet_1_1MomentumSGDTrainer.xml new file mode 100644 index 000000000..cf8af0f17 --- /dev/null +++ b/doc/doxygen/xml/structdynet_1_1MomentumSGDTrainer.xml @@ -0,0 +1,209 @@ + + + + dynet::MomentumSGDTrainer + dynet::Trainer + + + real + real dynet::MomentumSGDTrainer::momentum + + momentum + + + + + + + + + + std::vector< ShadowParameters > + std::vector<ShadowParameters> dynet::MomentumSGDTrainer::vp + + vp + + + + + + + + + + std::vector< ShadowLookupParameters > + std::vector<ShadowLookupParameters> dynet::MomentumSGDTrainer::vlp + + vlp + + + + + + + + + + + + friend class + friend class boost::serialization::access + + boost::serialization::access + + + + + + + + + + + + + dynet::MomentumSGDTrainer::MomentumSGDTrainer + (Model *m, real e0=0.01, real mom=0.9) + MomentumSGDTrainer + + Model * + m + + + real + e0 + 0.01 + + + real + mom + 0.9 + + + + + + + + + + + + + void + virtual void dynet::MomentumSGDTrainer::alloc_impl + () override + alloc_impl + alloc_impl + + + + + + + + + + + + + dynet::MomentumSGDTrainer::MomentumSGDTrainer + () + MomentumSGDTrainer + + + + + + + + + + + + class Archive + + + void + void dynet::MomentumSGDTrainer::serialize + (Archive &ar, const unsigned int) + serialize + + Archive & + ar + + + const unsigned + int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dynet::MomentumSGDTraineralloc_impl + dynet::MomentumSGDTraineraux_allocated + dynet::MomentumSGDTrainerboost::serialization::access + dynet::MomentumSGDTrainerclip_gradients + dynet::MomentumSGDTrainerclip_threshold + dynet::MomentumSGDTrainerclipping_enabled + dynet::MomentumSGDTrainerclips + dynet::MomentumSGDTrainerepoch + dynet::MomentumSGDTrainereta + dynet::MomentumSGDTrainereta0 + dynet::MomentumSGDTrainereta_decay + dynet::MomentumSGDTrainermodel + dynet::MomentumSGDTrainermomentum + dynet::MomentumSGDTrainerMomentumSGDTrainer + dynet::MomentumSGDTrainerMomentumSGDTrainer + dynet::MomentumSGDTrainerrescale_and_reset_weight_decay + dynet::MomentumSGDTrainerserialize + dynet::MomentumSGDTrainerstatus + dynet::MomentumSGDTrainerTrainer + dynet::MomentumSGDTrainerTrainer + dynet::MomentumSGDTrainerupdate + dynet::MomentumSGDTrainerupdate_epoch + dynet::MomentumSGDTrainerupdate_lookup_params + dynet::MomentumSGDTrainerupdate_params + dynet::MomentumSGDTrainerupdate_rule + dynet::MomentumSGDTrainerupdates + dynet::MomentumSGDTrainervlp + dynet::MomentumSGDTrainervp + dynet::MomentumSGDTrainer~Trainer + + + diff --git a/doc/doxygen/xml/structdynet_1_1RmsPropTrainer.xml b/doc/doxygen/xml/structdynet_1_1RmsPropTrainer.xml new file mode 100644 index 000000000..dca3e77ec --- /dev/null +++ b/doc/doxygen/xml/structdynet_1_1RmsPropTrainer.xml @@ -0,0 +1,228 @@ + + + + dynet::RmsPropTrainer + dynet::Trainer + + + real + real dynet::RmsPropTrainer::epsilon + + epsilon + + + + + + + + + + real + real dynet::RmsPropTrainer::rho + + rho + + + + + + + + + + std::vector< real > + std::vector<real> dynet::RmsPropTrainer::hg + + hg + + + + + + + + + + std::vector< std::vector< real > > + std::vector<std::vector<real> > dynet::RmsPropTrainer::hlg + + hlg + + + + + + + + + + + + friend class + friend class boost::serialization::access + + boost::serialization::access + + + + + + + + + + + + + dynet::RmsPropTrainer::RmsPropTrainer + (Model *m, real e0=0.1, real eps=1e-20, real rho=0.95) + RmsPropTrainer + + Model * + m + + + real + e0 + 0.1 + + + real + eps + 1e-20 + + + real + rho + 0.95 + + + + + + + + + + + + + void + virtual void dynet::RmsPropTrainer::alloc_impl + () override + alloc_impl + alloc_impl + + + + + + + + + + + + + dynet::RmsPropTrainer::RmsPropTrainer + () + RmsPropTrainer + + + + + + + + + + + + class Archive + + + void + void dynet::RmsPropTrainer::serialize + (Archive &ar, const unsigned int) + serialize + + Archive & + ar + + + const unsigned + int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dynet::RmsPropTraineralloc_impl + dynet::RmsPropTraineraux_allocated + dynet::RmsPropTrainerboost::serialization::access + dynet::RmsPropTrainerclip_gradients + dynet::RmsPropTrainerclip_threshold + dynet::RmsPropTrainerclipping_enabled + dynet::RmsPropTrainerclips + dynet::RmsPropTrainerepoch + dynet::RmsPropTrainerepsilon + dynet::RmsPropTrainereta + dynet::RmsPropTrainereta0 + dynet::RmsPropTrainereta_decay + dynet::RmsPropTrainerhg + dynet::RmsPropTrainerhlg + dynet::RmsPropTrainermodel + dynet::RmsPropTrainerrescale_and_reset_weight_decay + dynet::RmsPropTrainerrho + dynet::RmsPropTrainerRmsPropTrainer + dynet::RmsPropTrainerRmsPropTrainer + dynet::RmsPropTrainerserialize + dynet::RmsPropTrainerstatus + dynet::RmsPropTrainerTrainer + dynet::RmsPropTrainerTrainer + dynet::RmsPropTrainerupdate + dynet::RmsPropTrainerupdate_epoch + dynet::RmsPropTrainerupdate_lookup_params + dynet::RmsPropTrainerupdate_params + dynet::RmsPropTrainerupdate_rule + dynet::RmsPropTrainerupdates + dynet::RmsPropTrainer~Trainer + + + diff --git a/doc/doxygen/xml/structdynet_1_1SimpleSGDTrainer.xml b/doc/doxygen/xml/structdynet_1_1SimpleSGDTrainer.xml new file mode 100644 index 000000000..ef3f70fe1 --- /dev/null +++ b/doc/doxygen/xml/structdynet_1_1SimpleSGDTrainer.xml @@ -0,0 +1,144 @@ + + + + dynet::SimpleSGDTrainer + dynet::Trainer + + + friend class + friend class boost::serialization::access + + boost::serialization::access + + + + + + + + + + + + + dynet::SimpleSGDTrainer::SimpleSGDTrainer + (Model *m, real e0=0.1) + SimpleSGDTrainer + + Model * + m + + + real + e0 + 0.1 + + + + + + + + + + + + + + dynet::SimpleSGDTrainer::SimpleSGDTrainer + () + SimpleSGDTrainer + + + + + + + + + + + + class Archive + + + void + void dynet::SimpleSGDTrainer::serialize + (Archive &ar, const unsigned int) + serialize + + Archive & + ar + + + const unsigned + int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dynet::SimpleSGDTraineralloc_impl + dynet::SimpleSGDTraineraux_allocated + dynet::SimpleSGDTrainerboost::serialization::access + dynet::SimpleSGDTrainerclip_gradients + dynet::SimpleSGDTrainerclip_threshold + dynet::SimpleSGDTrainerclipping_enabled + dynet::SimpleSGDTrainerclips + dynet::SimpleSGDTrainerepoch + dynet::SimpleSGDTrainereta + dynet::SimpleSGDTrainereta0 + dynet::SimpleSGDTrainereta_decay + dynet::SimpleSGDTrainermodel + dynet::SimpleSGDTrainerrescale_and_reset_weight_decay + dynet::SimpleSGDTrainerserialize + dynet::SimpleSGDTrainerSimpleSGDTrainer + dynet::SimpleSGDTrainerSimpleSGDTrainer + dynet::SimpleSGDTrainerstatus + dynet::SimpleSGDTrainerTrainer + dynet::SimpleSGDTrainerTrainer + dynet::SimpleSGDTrainerupdate + dynet::SimpleSGDTrainerupdate_epoch + dynet::SimpleSGDTrainerupdate_lookup_params + dynet::SimpleSGDTrainerupdate_params + dynet::SimpleSGDTrainerupdate_rule + dynet::SimpleSGDTrainerupdates + dynet::SimpleSGDTrainer~Trainer + + + diff --git a/doc/doxygen/xml/structdynet_1_1Trainer.xml b/doc/doxygen/xml/structdynet_1_1Trainer.xml new file mode 100644 index 000000000..1ea29afc7 --- /dev/null +++ b/doc/doxygen/xml/structdynet_1_1Trainer.xml @@ -0,0 +1,483 @@ + + + + dynet::Trainer + dynet::AdadeltaTrainer + dynet::AdagradTrainer + dynet::AdamTrainer + dynet::MomentumSGDTrainer + dynet::RmsPropTrainer + dynet::SimpleSGDTrainer + + + real + real dynet::Trainer::eta0 + + eta0 + + + + + + + + + + real + real dynet::Trainer::eta + + eta + + + + + + + + + + real + real dynet::Trainer::eta_decay + + eta_decay + + + + + + + + + + real + real dynet::Trainer::epoch + + epoch + + + + + + + + + + real + real dynet::Trainer::clipping_enabled + + clipping_enabled + + + + + + + + + + real + real dynet::Trainer::clip_threshold + + clip_threshold + + + + + + + + + + real + real dynet::Trainer::clips + + clips + + + + + + + + + + real + real dynet::Trainer::updates + + updates + + + + + + + + + + bool + bool dynet::Trainer::aux_allocated + + aux_allocated + + + + + + + + + + Model * + Model* dynet::Trainer::model + + model + + + + + + + + + + + + friend class + friend class boost::serialization::access + + boost::serialization::access + + + + + + + + + + + + + dynet::Trainer::Trainer + (Model *m, real e0) + Trainer + + Model * + m + + + real + e0 + + + + + + + + + + + + virtual dynet::Trainer::~Trainer + () + ~Trainer + + + + + + + + + + void + void dynet::Trainer::update + (real scale=1.0) + update + + real + scale + 1.0 + + + + + + + + + + + void + void dynet::Trainer::update_epoch + (real r=1) + update_epoch + + real + r + 1 + + + + + + + + + + + float + float dynet::Trainer::clip_gradients + () + clip_gradients + + + + + + + + + + void + void dynet::Trainer::rescale_and_reset_weight_decay + () + rescale_and_reset_weight_decay + + + + + + + + + + void + void dynet::Trainer::status + () + status + + + + + + + + + + + + + dynet::Trainer::Trainer + () + Trainer + + + + + + + + + + void + virtual void dynet::Trainer::alloc_impl + () + alloc_impl + alloc_impl + alloc_impl + alloc_impl + alloc_impl + alloc_impl + + + + + + + + + + void + virtual void dynet::Trainer::update_rule + (real scale, real gscale, const std::vector< Tensor * > &values)=0 + update_rule + + real + scale + + + real + gscale + + + const std::vector< Tensor * > & + values + + + + + + + + + + + void + virtual void dynet::Trainer::update_params + (real scale, real gscale, size_t idx)=0 + update_params + + real + scale + + + real + gscale + + + size_t + idx + + + + + + + + + + + void + virtual void dynet::Trainer::update_lookup_params + (real scale, real gscale, size_t idx, size_t lidx)=0 + update_lookup_params + + real + scale + + + real + gscale + + + size_t + idx + + + size_t + lidx + + + + + + + + + + + + + + + class Archive + + + void + void dynet::Trainer::serialize + (Archive &ar, const unsigned int) + serialize + + Archive & + ar + + + const unsigned + int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dynet::Traineralloc_impl + dynet::Traineraux_allocated + dynet::Trainerboost::serialization::access + dynet::Trainerclip_gradients + dynet::Trainerclip_threshold + dynet::Trainerclipping_enabled + dynet::Trainerclips + dynet::Trainerepoch + dynet::Trainereta + dynet::Trainereta0 + dynet::Trainereta_decay + dynet::Trainermodel + dynet::Trainerrescale_and_reset_weight_decay + dynet::Trainerserialize + dynet::Trainerstatus + dynet::TrainerTrainer + dynet::TrainerTrainer + dynet::Trainerupdate + dynet::Trainerupdate_epoch + dynet::Trainerupdate_lookup_params + dynet::Trainerupdate_params + dynet::Trainerupdate_rule + dynet::Trainerupdates + dynet::Trainer~Trainer + + + diff --git a/doc/doxygen/xml/structdynet_1_1expr_1_1Expression.xml b/doc/doxygen/xml/structdynet_1_1expr_1_1Expression.xml new file mode 100644 index 000000000..4e13b86c3 --- /dev/null +++ b/doc/doxygen/xml/structdynet_1_1expr_1_1Expression.xml @@ -0,0 +1,95 @@ + + + + dynet::expr::Expression + + + ComputationGraph * + ComputationGraph* dynet::expr::Expression::pg + + pg + + + + + + + + + + VariableIndex + VariableIndex dynet::expr::Expression::i + + i + + + + + + + + + + + + + dynet::expr::Expression::Expression + () + Expression + + + + + + + + + + + dynet::expr::Expression::Expression + (ComputationGraph *pg, VariableIndex i) + Expression + + ComputationGraph * + pg + + + VariableIndex + i + + + + + + + + + + + const Tensor & + const Tensor& dynet::expr::Expression::value + () const + value + + + + + + + + + + + + + + + + dynet::expr::ExpressionExpression + dynet::expr::ExpressionExpression + dynet::expr::Expressioni + dynet::expr::Expressionpg + dynet::expr::Expressionvalue + + + diff --git a/doc/doxygen/xml/training_8h.xml b/doc/doxygen/xml/training_8h.xml new file mode 100644 index 000000000..ab3e480f6 --- /dev/null +++ b/doc/doxygen/xml/training_8h.xml @@ -0,0 +1,263 @@ + + + + training.h + vector + boost/serialization/export.hpp + dynet/model.h + dynet/shadow-params.h + + + + + + + + + + + + + + + + + + + + + + + + + + + dynet::Trainer + dynet::SimpleSGDTrainer + dynet::MomentumSGDTrainer + dynet::AdagradTrainer + dynet::AdadeltaTrainer + dynet::RmsPropTrainer + dynet::AdamTrainer + dynet + + + DYNET_TRAINER_DEFINE_DEV_IMPL + + void update_params(real scale, real gscale, size_t idx) override; \ + void update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) override; \ + template <class MyDevice> \ + void update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector<Tensor*> & values); \ + void update_rule(real scale, real gscale, const std::vector<Tensor*> & values) override; + + + + + + + + + + + + + + +#ifndefDYNET_TRAINING_H_ +#defineDYNET_TRAINING_H_ + +#include<vector> + +#include<boost/serialization/export.hpp> + +#include"dynet/model.h" +#include"dynet/shadow-params.h" + +#defineDYNET_TRAINER_DEFINE_DEV_IMPL()\ +voidupdate_params(realscale,realgscale,size_tidx)override;\ +voidupdate_lookup_params(realscale,realgscale,size_tidx,size_tlidx)override;\ +template<classMyDevice>\ +voidupdate_rule_dev(constMyDevice&dev,realscale,realgscale,conststd::vector<Tensor*>&values);\ +voidupdate_rule(realscale,realgscale,conststd::vector<Tensor*>&values)override; + +namespacedynet{ + +structTrainer{ +explicitTrainer(Model*m,reale0): +eta0(e0),eta(e0),eta_decay(),epoch(),clipping_enabled(true),clip_threshold(5),clips(),updates(),aux_allocated(false),model(m){} +virtual~Trainer(); + +voidupdate(realscale=1.0); + +voidupdate_epoch(realr=1){ +epoch+=r; +eta=eta0/(1+epoch*eta_decay); +} + +//ifclippingisenabledandthegradientistoobig,returntheamountto +//scalethegradientby(otherwise1) +floatclip_gradients(); + +//TODO:Thisisunprotectedtemporarilyuntilthereisabettersolution +//forserializingtheweightdecaywhensavingmodels +//Rescalealltheparametershandledbythismodel +voidrescale_and_reset_weight_decay(); + +//learningrates +realeta0; +realeta; +realeta_decay; +realepoch; + +//clipping +realclipping_enabled; +realclip_threshold; +realclips; +realupdates; + +boolaux_allocated; + +voidstatus(){ +std::cerr<<"[epoch="<<epoch<<"eta="<<eta<<"clips="<<clips<<"updates="<<updates<<"]"; +updates=clips=0; +} + +Model*model;//parametersandgradientslivehere + +protected: +Trainer(){} +virtualvoidalloc_impl(){} +virtualvoidupdate_rule(realscale,realgscale,conststd::vector<Tensor*>&values)=0; +virtualvoidupdate_params(realscale,realgscale,size_tidx)=0; +virtualvoidupdate_lookup_params(realscale,realgscale,size_tidx,size_tlidx)=0; + +private: +friendclassboost::serialization::access; +template<classArchive> +voidserialize(Archive&ar,constunsignedint); +}; + +structSimpleSGDTrainer:publicTrainer{ +explicitSimpleSGDTrainer(Model*m,reale0=0.1):Trainer(m,e0){} +protected: +DYNET_TRAINER_DEFINE_DEV_IMPL() +private: +SimpleSGDTrainer(){} +friendclassboost::serialization::access; +template<classArchive> +voidserialize(Archive&ar,constunsignedint); +}; + +structMomentumSGDTrainer:publicTrainer{ +explicitMomentumSGDTrainer(Model*m,reale0=0.01,realmom=0.9): +Trainer(m,e0),momentum(mom){} + +protected: +DYNET_TRAINER_DEFINE_DEV_IMPL() +virtualvoidalloc_impl()override; + +realmomentum; + +//thefollowingrepresentthecurrentvelocity +std::vector<ShadowParameters>vp; +std::vector<ShadowLookupParameters>vlp; +//std::unordered_map<ParameterStorage*,Tensor>vp; +//std::unordered_map<LookupParameterStorage*,std::unordered_map<unsigned,Tensor>>vl; +private: +MomentumSGDTrainer(){} +friendclassboost::serialization::access; +template<classArchive> +voidserialize(Archive&ar,constunsignedint); +}; + +structAdagradTrainer:publicTrainer{ +explicitAdagradTrainer(Model*m,reale0=0.1,realeps=1e-20): +Trainer(m,e0),epsilon(eps){} +protected: +DYNET_TRAINER_DEFINE_DEV_IMPL() +virtualvoidalloc_impl()override; + +realepsilon; +std::vector<ShadowParameters>vp; +std::vector<ShadowLookupParameters>vlp; +private: +AdagradTrainer(){} +friendclassboost::serialization::access; +template<classArchive> +voidserialize(Archive&ar,constunsignedint); +}; + +structAdadeltaTrainer:publicTrainer{ +explicitAdadeltaTrainer(Model*m,realeps=1e-6,realrho=0.95): +Trainer(m,1.0),epsilon(eps),rho(rho){} +protected: +DYNET_TRAINER_DEFINE_DEV_IMPL() +virtualvoidalloc_impl()override; + +realepsilon; +realrho; +std::vector<ShadowParameters>hg;//Historyofgradients +std::vector<ShadowLookupParameters>hlg; +std::vector<ShadowParameters>hd;//Historyofdeltas +std::vector<ShadowLookupParameters>hld; +private: +AdadeltaTrainer(){} +friendclassboost::serialization::access; +template<classArchive> +voidserialize(Archive&ar,constunsignedint); +}; + +structRmsPropTrainer:publicTrainer{ +explicitRmsPropTrainer(Model*m,reale0=0.1,realeps=1e-20,realrho=0.95): +Trainer(m,e0),epsilon(eps),rho(rho){} +protected: +DYNET_TRAINER_DEFINE_DEV_IMPL() +virtualvoidalloc_impl()override; + +realepsilon; +realrho; +std::vector<real>hg;//Historyofgradients +std::vector<std::vector<real>>hlg; +private: +RmsPropTrainer(){} +friendclassboost::serialization::access; +template<classArchive> +voidserialize(Archive&ar,constunsignedint); +}; + +structAdamTrainer:publicTrainer{ +explicitAdamTrainer(Model*m,floatalpha=0.001,floatbeta_1=0.9,floatbeta_2=0.999,floateps=1e-8): +Trainer(m,alpha),beta_1(beta_1),beta_2(beta_2),epsilon(eps){} + +protected: +DYNET_TRAINER_DEFINE_DEV_IMPL() +virtualvoidalloc_impl()override; + +floatbeta_1; +floatbeta_2; +floatepsilon; +std::vector<ShadowParameters>m;//Historyofgradients +std::vector<ShadowLookupParameters>lm; +std::vector<ShadowParameters>v;//Historyofdeltas +std::vector<ShadowLookupParameters>lv; +private: +AdamTrainer(){} +friendclassboost::serialization::access; +template<classArchive> +voidserialize(Archive&ar,constunsignedint); +}; + +}//namespacedynet + +BOOST_CLASS_EXPORT_KEY(dynet::SimpleSGDTrainer) +BOOST_CLASS_EXPORT_KEY(dynet::MomentumSGDTrainer) +BOOST_CLASS_EXPORT_KEY(dynet::AdagradTrainer) +BOOST_CLASS_EXPORT_KEY(dynet::AdadeltaTrainer) +BOOST_CLASS_EXPORT_KEY(dynet::RmsPropTrainer) +BOOST_CLASS_EXPORT_KEY(dynet::AdamTrainer) + +#endif + + + + diff --git a/doc/install.md b/doc/install.md index ac8e5269f..48af50e56 100644 --- a/doc/install.md +++ b/doc/install.md @@ -99,26 +99,4 @@ To generate the MSVC solution and project files, run [cmake](http://www.cmake.or cd build cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64" -This will generate dynet.sln and a bunch of \*.vcxproj files (one for the DYNET library, and one per example). You should be able to just open dynet.sln and build all. **Note: multi-process functionality is currently not supported in Windows, so you will not be able to build rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to this project**. - -The Windows build also supports CUDA. The latest (development) version of Eigen has some code that causes problems with the CUDA compiler. These issue change as Eigen is developed. Currently, the following three changes are needed in Eigen when compiling with CUDA support: - -- block.h: add `#ifndef __CUDACC__` / `#endif` around `EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Block)` -- ref.h: add `#ifndef __CUDACC__ / #endif` around `EIGEN_INHERIT_ASSIGNMENT_OPERATORS(RefBase)` -- TensorRandom.h: Change `uint` to `unsigned int` and `SYSTEMTIME st` to immediately above `GetSystemTime(&st)` -- TensorDeviceCuda.h: Change `sleep(1)` to `Sleep(1000)` - -### MKL support - -DyNet can leverage Intel's MKL library to speed up computation on the CPU. As an example, we've seen 3x speedup in seq2seq training when using MKL. To use MKL, include the following cmake option: - - -DMKL - -If cmake is unable to find MKL automatically, try setting `MKL_ROOT`, such as - - -DMKL_ROOT="/path/to/MKL" - -If either MKL or MKL_ROOT are set, CMake will look for MKL. Note, MKL has only been tested in Windows. - - - +This will generate dynet.sln and a bunch of \*.vcxproj files (one for the DYNET library, and one per example). You should be able to just open dynet.sln and build all. **Note: multi-process functionality is currently not supported in Windows, so you will not be able to build rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to this project** diff --git a/doc/make.bat b/doc/make.bat new file mode 100644 index 000000000..b427ae421 --- /dev/null +++ b/doc/make.bat @@ -0,0 +1,242 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source +set I18NSPHINXOPTS=%SPHINXOPTS% source +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Dynet.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Dynet.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %BUILDDIR%/.. + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +:end diff --git a/doc/source/builders.rst b/doc/source/builders.rst new file mode 100644 index 000000000..d6139ae1a --- /dev/null +++ b/doc/source/builders.rst @@ -0,0 +1,7 @@ +DyNet Builders +============== + +Builders combine together various operations to implement more +complicated things such as recurrent and LSTM networks + +TODO: Create documentation diff --git a/doc/source/commandline.rst b/doc/source/commandline.rst new file mode 100644 index 000000000..476a8e19c --- /dev/null +++ b/doc/source/commandline.rst @@ -0,0 +1,23 @@ +DyNet Command Line Options +========================== + +All programs using DyNet have a few command line options. These must be +specified at the very beginning of the command line, before other +options. + +- ``--dynet-mem NUMBER``: DyNet runs by default with 512MB of memory + each for the forward and backward steps, as well as parameter + storage. You will often want to increase this amount. By setting + NUMBER here, DyNet will allocate more memory. Note that you can also + individually set the amount of memory for forward calculation, + backward calculation, and parameters by using comma separated + variables ``--dynet-mem FOR,BACK,PARAM``. This is useful if, for + example, you are performing testing and don't need to allocate any + memory for backward calculation. +- ``--dynet-l2 NUMBER``: Specifies the level of l2 regularization to + use (default 1e-6). +- ``--dynet-gpus NUMBER``: Specify how many GPUs you want to use, if + DyNet is compiled with CUDA. Currently, only one GPU is supported. +- ``--dynet-gpu-ids X,Y,Z``: Specify the GPUs that you want to use by + device ID. Currently only one GPU is supported, but if you use this + command you can select which one to use. diff --git a/doc/source/conf.py b/doc/source/conf.py new file mode 100644 index 000000000..d4c6a8abd --- /dev/null +++ b/doc/source/conf.py @@ -0,0 +1,263 @@ +# -*- coding: utf-8 -*- +# +# Dynet documentation build configuration file, created by +# sphinx-quickstart on Thu Oct 13 16:13:12 2016. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +#sys.path.insert(0, os.path.abspath('.')) + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +#needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.mathjax', 'breathe' +] + +breathe_projects = {"dynet": "../doxygen/xml/"} +breathe_default_project = "dynet" + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'Dynet' +copyright = u'2016, Clab' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '1.0' +# The full version, including alpha/beta/rc tags. +release = '1.0' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +#language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = [] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +#html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +#html_theme_path = [] + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +#html_extra_path = [] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_domain_indices = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, links to the reST sources are added to the pages. +#html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +#html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +#html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = None + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Dynetdoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + #'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + #'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + #'preamble': '', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + ('index', 'Dynet.tex', u'Dynet Documentation', + u'Clab', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# If true, show page references after internal links. +#latex_show_pagerefs = False + +# If true, show URL addresses after external links. +#latex_show_urls = False + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + ('index', 'dynet', u'Dynet Documentation', + [u'Clab'], 1) +] + +# If true, show URL addresses after external links. +#man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ('index', 'Dynet', u'Dynet Documentation', + u'Clab', 'Dynet', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +#texinfo_appendices = [] + +# If false, no module index is generated. +#texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +#texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +#texinfo_no_detailmenu = False diff --git a/doc/source/index.rst b/doc/source/index.rst new file mode 100644 index 000000000..18a26d54e --- /dev/null +++ b/doc/source/index.rst @@ -0,0 +1,37 @@ +.. Dynet documentation master file, created by + sphinx-quickstart on Thu Oct 13 16:13:12 2016. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Dynet documentation +================================= + +You can find information about how to install/use DyNet in general below: + +.. toctree:: + :maxdepth: 2 + + install + python + commandline + tutorial + +The following can be referenced when implementing your models in DyNet: + +.. toctree:: + :maxdepth: 2 + + operations + builders + optimizers + minibatch + multiprocessing + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/doc/source/install.rst b/doc/source/install.rst new file mode 100644 index 000000000..fa23a2470 --- /dev/null +++ b/doc/source/install.rst @@ -0,0 +1,156 @@ +Building/Installing +=================== + +How to build DyNet and link it with your programs + +Prerequisites +------------- + +DyNet relies on a number of external libraries including Boost, cmake, +Eigen, and mercurial (to install Eigen). Boost, cmake, and mercurial can +be installed from standard repositories, for example on Ubuntu linux: + +:: + + sudo apt-get install libboost-all-dev cmake mercurial + +To compile DyNet you also need the `development version of the Eigen +library `__. **If you use any of the +released versions, you may get assertion failures or compile errors.** +If you don't have Eigen installed already, you can get it easily using +the following command: + +:: + + hg clone https://bitbucket.org/eigen/eigen/ + +Building +-------- + +To get and build DyNet, clone the repository + +:: + + git clone https://github.com/clab/dynet.git + +then enter the directory and use ```cmake`` `__ +to generate the makefiles + +:: + + cd dynet + mkdir build + cd build + cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen + +Then compile, where "2" can be replaced by the number of cores on your +machine + +:: + + make -j 2 + +To see that things have built properly, you can run + +:: + + ./examples/xor + +which will train a multilayer perceptron to predict the xor function. + +Compiling/linking External Programs +----------------------------------- + +When you want to use DyNet in an external program, you will need to add +the ``dynet`` directory to the compile path: + +:: + + -I/path/to/dynet + +and link with the dynet library: + +:: + + -L/path/to/dynet/build/dynet -ldynet + +Debugging build problems +------------------------ + +If you have a build problem and want to debug, please run + +:: + + make clean + make VERBOSE=1 &> make.log + +then examine the commands in the ``make.log`` file to see if anything +looks fishy. If you would like help, send this ``make.log`` file via the +"Issues" tab on github, or to the dynet-users mailing list. + +Build options +------------- + +GPU (CUDA) support +~~~~~~~~~~~~~~~~~~ + +``dynet`` supports running programs on GPUs with CUDA. If you have CUDA +installed, you can build DyNet with GPU support by adding +``-DBACKEND=cuda`` to your cmake options. This will result in three +libraries named "libdynet," "libgdynet," and "libdynetcuda" being +created. When you want to run a program on CPU, you can link to the +"libdynet" library as shown above. When you want to run a program on +GPU, you can link to the "libgdynet" and "libdynetcuda" libraries. + +:: + + -L/path/to/dynet/build/dynet -lgdynet -ldynetcuda + +(Eventually you will be able to use a single library to run on either +CPU or GPU, but this is not fully implemented yet.) + +Non-standard Boost location +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``dynet`` supports boost, and will find it if it is in the standard +location. If boost is in a non-standard location, say ``$HOME/boost``, +you can specify the location by adding the following to your cmake +options: + +:: + + -DBOOST_ROOT:PATHNAME=$HOME/boost -DBoost_LIBRARY_DIRS:FILEPATH=$HOME/boost/lib + -DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE + +Note that you will also have to set your ``LD_LIBRARY_PATH`` to point to +the ``boost/lib`` directory. + +Building for Windows +~~~~~~~~~~~~~~~~~~~~ + +DYNET has been tested to build in Windows using Microsoft Visual Studio +2015. You may be able to build with MSVC 2013 by slightly modifying the +instructions below. + +First, install Eigen following the above instructions. + +Second, install `Boost `__ for your compiler and +platform. Follow the instructions for compiling Boost or just download +the already-compiled binaries. + +To generate the MSVC solution and project files, run +`cmake `__, pointing it to the location you +installed Eigen and Boost (for example, at c:and c:\_1\_61\_0): + +:: + + mkdir build + cd build + cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64" + +This will generate dynet.sln and a bunch of \*.vcxproj files (one for +the DYNET library, and one per example). You should be able to just open +dynet.sln and build all. **Note: multi-process functionality is +currently not supported in Windows, so you will not be able to build +rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to +this project** diff --git a/doc/source/minibatch.rst b/doc/source/minibatch.rst new file mode 100644 index 000000000..77d03a8e6 --- /dev/null +++ b/doc/source/minibatch.rst @@ -0,0 +1,4 @@ +Mini-batching in DyNet +====================== + +How to perform minibatching to improve efficiency diff --git a/doc/source/multiprocessing.rst b/doc/source/multiprocessing.rst new file mode 100644 index 000000000..cac087f60 --- /dev/null +++ b/doc/source/multiprocessing.rst @@ -0,0 +1,6 @@ +Multi-processing in DyNet +========================= + +How to perform processing on multiple threads + +(TODO: create doc) diff --git a/doc/source/operations.rst b/doc/source/operations.rst new file mode 100644 index 000000000..f1937ba70 --- /dev/null +++ b/doc/source/operations.rst @@ -0,0 +1,6 @@ +DyNet Operations +================ + +The various operations that you can use in building a DyNet graph + +TODO: Create documentation diff --git a/doc/source/optimizers.rst b/doc/source/optimizers.rst new file mode 100644 index 000000000..bcb2c05d9 --- /dev/null +++ b/doc/source/optimizers.rst @@ -0,0 +1,8 @@ +DyNet Optimizers +================ + +The various optimizers that you can use to tune your parameters + +.. doxygenstruct:: dynet::SimpleSGDTrainer + +.. doxygenstruct:: dynet::MomentumSGDTrainer \ No newline at end of file diff --git a/doc/source/python.rst b/doc/source/python.rst new file mode 100644 index 000000000..0cdb0206d --- /dev/null +++ b/doc/source/python.rst @@ -0,0 +1,189 @@ +Installing the Python DyNet module. +=================================== + +(for instructions on installing on a computer with GPU, see below) + +Python bindings to DyNet are currently only supported under python 2. + +TL;DR +----- + +(see below for the details) + +.. code:: bash + + # Installing python DyNet on a machine with python 2.7: + + pip install cython # if you don't have it already. + mkdir dynet-base + cd dynet-base + # getting dynet and eigen + git clone https://github.com/clab/dynet.git + hg clone https://bitbucket.org/eigen/eigen + cd dynet + mkdir build + cd build + # without GPU support: + cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` + # or with GPU support: + cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` -DBACKEND=cuda + + make -j 2 # replace 2 with the number of available cores + cd python + python setup.py install # or `python setup.py install --user` for a user-local install. + +Detailed Instructions: +---------------------- + +First, get DyNet: + +.. code:: bash + + cd $HOME + mkdir dynet-base + cd dynet-base + git clone https://github.com/clab/dynet.git + cd dynet + git submodule init # To be consistent with DyNet's installation instructions. + git submodule update # To be consistent with DyNet's installation instructions. + +Then get Eigen: + +.. code:: bash + + cd $HOME + cd dynet-base + hg clone https://bitbucket.org/eigen/eigen/ + +We also need to make sure the ``cython`` module is installed. (you can +replace ``pip`` with your favorite package manager, such as ``conda``, +or install within a virtual environment) + +.. code:: bash + + pip install cython + +To simplify the following steps, we can set a bash variable to hold +where we have saved the main directories of DyNet and Eigen. In case you +have gotten DyNet and Eigen differently from the instructions above and +saved them in different location(s), these variables will be helpful: + +.. code:: bash + + PATH_TO_DYNET=$HOME/dynet-base/dynet/ + PATH_TO_EIGEN=$HOME/dynet-base/eigen/ + +Compile DyNet. + +This is pretty much the same process as compiling DyNet, with the +addition of the ``-DPYTHON=`` flag, pointing to the location of your +python interpreter. + +If boost is installed in a non-standard location, you should add the +corresponding flags to the ``cmake`` commandline, see the `DyNet +installation instructions page `__. + +.. code:: bash + + cd $PATH_TO_DYNET + PATH_TO_PYTHON=`which python` + mkdir build + cd build + cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON + make -j 2 + +Assuming that the ``cmake`` command found all the needed libraries and +didn't fail, the ``make`` command will take a while, and compile dynet +as well as the python bindings. You can change ``make -j 2`` to a higher +number, depending on the available cores you want to use while +compiling. + +You now have a working python binding inside of ``build/dynet``. To +verify this is working: + +.. code:: bash + + cd $PATH_TO_DYNET/build/python + python + +then, within python: + +.. code:: bash + + import dynet as dy + print dy.__version__ + model = dy.Model() + +In order to install the module so that it is accessible from everywhere +in the system, run the following: + +.. code:: bash + + cd $PATH_TO_DYNET/build/python + python setup.py install --user + +(the ``--user`` switch will install the module in your local +site-packages, and works without root privilages. To install the module +to the system site-packages (for all users), run +``python setup.py install`` without this switch) + +You should now have a working python binding (the dynet module). + +Note however that the installation relies on the compiled dynet library +being in ``$PATH_TO_DYNET/build/dynet``, so make sure not to move it +from there. + +Now, check that everything works: + +.. code:: bash + + # check that it works: + cd $PATH_TO_DYNET + cd pyexamples + python xor.py + python rnnlm.py rnnlm.py + +Alternatively, if the following script works for you, then your +installation is likely to be working: + +:: + + from dynet import * + model = Model() + +Installing with GPU support +--------------------------- + +For installing on a computer with GPU, first install CUDA. The following +instructions assume CUDA is installed. + +The installation process is pretty much the same, while adding the +``-DBACKEND=cuda`` flag to the ``cmake`` stage: + +.. code:: bash + + cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON -DBACKEND=cuda + +(if CUDA is installed in a non-standard location and ``cmake`` cannot +find it, you can specify also +``-DCUDA_TOOLKIT_ROOT_DIR=/path/to/cuda``.) + +Now, build the python modules (as above, we assume cython is installed): + +After running ``make -j 2``, you should have the files ``_dynet.so`` and +``_gdynet.so`` in the ``build/python`` folder. + +As before, ``cd build/python`` followed by +``python setup.py install --user`` will install the module. + +Using the GPU: +============== + +In order to use the GPU support, you can either: + +- Use ``import _gdynet as dy`` instead of ``import dynet as dy`` +- Or, (preferred), ``import dynet`` as usual, but use the commandline + switch ``--dynet-gpu`` or the GPU switches detailed + `here `__ when invoking the program. This option lets + the same code work with either the GPU or the CPU version depending + on how it is invoked. diff --git a/doc/source/tutorial.rst b/doc/source/tutorial.rst new file mode 100644 index 000000000..920cbf17f --- /dev/null +++ b/doc/source/tutorial.rst @@ -0,0 +1,51 @@ +DyNet Tutorial +============== + +An illustration of how models are trained (for a simple logistic +regression model) is below: + +.. code:: cpp + + // *** First, we set up the structure of the model + // Create a model, and an SGD trainer to update its parameters. + Model mod; + SimpleSGDTrainer sgd(&mod); + // Create a "computation graph," which will define the flow of information. + ComputationGraph cg; + // Initialize a 1x3 parameter vector, and add the parameters to be part of the + // computation graph. + Expression W = parameter(cg, mod.add_parameters({1, 3})); + // Create variables defining the input and output of the regression, and load them + // into the computation graph. Note that we don't need to set concrete values yet. + vector x_values(3); + Expression x = input(cg, {3}, &x_values); + dynet::real y_value; + Expression y = input(cg, &y_value); + // Next, set up the structure to multiply the input by the weight vector, then run + // the output of this through a logistic sigmoid function (logistic regression). + Expression y_pred = logistic(W*x); + // Finally, we create a function to calculate the loss. The model will be optimized + // to minimize the value of the final function in the computation graph. + Expression l = binary_log_loss(y_pred, y); + // We are now done setting up the graph, and we can print out its structure: + cg.print_graphviz(); + + // *** Now, we perform a parameter update for a single example. + // Set the input/output to the values specified by the training data: + x_values = {0.5, 0.3, 0.7}; + y_value = 1.0; + // "forward" propagates values forward through the computation graph, and returns + // the loss. + dynet::real loss = as_scalar(cg.forward(l)); + // "backward" performs back-propagation, and accumulates the gradients of the + // parameters within the "Model" data structure. + cg.backward(l); + // "sgd.update" updates parameters of the model that was passed to its constructor. + // Here 1.0 is the scaling factor that allows us to control the size of the update. + sgd.update(1.0); + +Note that this very simple example that doesn't cover things like memory +initialization, reading/writing models, recurrent/LSTM networks, or +adding biases to functions. The best way to get an idea of how to use +DyNet for real is to look in the ``example`` directory, particularly +starting with the simplest ``xor`` example. From c1792479f5a10353501348d54032a4d76b5b774c Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 14 Oct 2016 14:21:23 -0400 Subject: [PATCH 727/965] removed generated files --- doc/build/doctrees/builders.doctree | Bin 2891 -> 0 bytes doc/build/doctrees/commandline.doctree | Bin 7906 -> 0 bytes doc/build/doctrees/environment.pickle | Bin 16199 -> 0 bytes doc/build/doctrees/index.doctree | Bin 6136 -> 0 bytes doc/build/doctrees/install.doctree | Bin 21271 -> 0 bytes doc/build/doctrees/minibatch.doctree | Bin 2640 -> 0 bytes doc/build/doctrees/multiprocessing.doctree | Bin 2784 -> 0 bytes doc/build/doctrees/operations.doctree | Bin 2799 -> 0 bytes doc/build/doctrees/optimizers.doctree | Bin 6199 -> 0 bytes doc/build/doctrees/python.doctree | Bin 35157 -> 0 bytes doc/build/doctrees/tutorial.doctree | Bin 28576 -> 0 bytes doc/build/html/.buildinfo | 4 - doc/build/html/_sources/builders.txt | 7 - doc/build/html/_sources/commandline.txt | 23 - doc/build/html/_sources/index.txt | 37 - doc/build/html/_sources/install.txt | 156 - doc/build/html/_sources/minibatch.txt | 4 - doc/build/html/_sources/multiprocessing.txt | 6 - doc/build/html/_sources/operations.txt | 6 - doc/build/html/_sources/optimizers.txt | 8 - doc/build/html/_sources/python.txt | 189 - doc/build/html/_sources/tutorial.txt | 51 - doc/build/html/_static/ajax-loader.gif | Bin 673 -> 0 bytes doc/build/html/_static/basic.css | 537 - doc/build/html/_static/comment-bright.png | Bin 3500 -> 0 bytes doc/build/html/_static/comment-close.png | Bin 3578 -> 0 bytes doc/build/html/_static/comment.png | Bin 3445 -> 0 bytes doc/build/html/_static/default.css | 256 - doc/build/html/_static/doctools.js | 238 - doc/build/html/_static/down-pressed.png | Bin 368 -> 0 bytes doc/build/html/_static/down.png | Bin 363 -> 0 bytes doc/build/html/_static/file.png | Bin 392 -> 0 bytes doc/build/html/_static/jquery.js | 9404 ----------------- doc/build/html/_static/minus.png | Bin 199 -> 0 bytes doc/build/html/_static/plus.png | Bin 199 -> 0 bytes doc/build/html/_static/pygments.css | 65 - doc/build/html/_static/searchtools.js | 622 -- doc/build/html/_static/sidebar.js | 159 - doc/build/html/_static/underscore.js | 1415 --- doc/build/html/_static/up-pressed.png | Bin 372 -> 0 bytes doc/build/html/_static/up.png | Bin 363 -> 0 bytes doc/build/html/_static/websupport.js | 808 -- doc/build/html/builders.html | 114 - doc/build/html/commandline.html | 132 - doc/build/html/genindex.html | 110 - doc/build/html/index.html | 149 - doc/build/html/install.html | 249 - doc/build/html/minibatch.html | 112 - doc/build/html/multiprocessing.html | 103 - doc/build/html/objects.inv | 8 - doc/build/html/operations.html | 113 - doc/build/html/optimizers.html | 124 - doc/build/html/python.html | 272 - doc/build/html/search.html | 100 - doc/build/html/searchindex.js | 1 - doc/build/html/tutorial.html | 157 - doc/build/text/builders.txt | 8 - doc/build/text/commandline.txt | 27 - doc/build/text/index.txt | 55 - doc/build/text/install.txt | 141 - doc/build/text/minibatch.txt | 5 - doc/build/text/multiprocessing.txt | 7 - doc/build/text/operations.txt | 7 - doc/build/text/optimizers.txt | 13 - doc/build/text/python.txt | 172 - doc/build/text/tutorial.txt | 50 - doc/doxygen/html/annotated.html | 111 - doc/doxygen/html/arrowdown.png | Bin 246 -> 0 bytes doc/doxygen/html/arrowright.png | Bin 229 -> 0 bytes doc/doxygen/html/bc_s.png | Bin 676 -> 0 bytes doc/doxygen/html/bdwn.png | Bin 147 -> 0 bytes doc/doxygen/html/classes.html | 114 - doc/doxygen/html/closed.png | Bin 132 -> 0 bytes .../dir_2997b6d9ddf8b2f83e82c6988822a05f.html | 109 - ...r_2997b6d9ddf8b2f83e82c6988822a05f_dep.map | 3 - ...r_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 | 1 - ...r_2997b6d9ddf8b2f83e82c6988822a05f_dep.png | Bin 1087 -> 0 bytes doc/doxygen/html/doc.png | Bin 746 -> 0 bytes doc/doxygen/html/doxygen.css | 1449 --- doc/doxygen/html/doxygen.png | Bin 3779 -> 0 bytes doc/doxygen/html/dynsections.js | 97 - doc/doxygen/html/expr_8h_source.html | 287 - doc/doxygen/html/files.html | 102 - doc/doxygen/html/folderclosed.png | Bin 616 -> 0 bytes doc/doxygen/html/folderopen.png | Bin 597 -> 0 bytes doc/doxygen/html/functions.html | 105 - doc/doxygen/html/functions_func.html | 105 - doc/doxygen/html/graph_legend.html | 153 - doc/doxygen/html/graph_legend.md5 | 1 - doc/doxygen/html/graph_legend.png | Bin 18538 -> 0 bytes doc/doxygen/html/hierarchy.html | 111 - doc/doxygen/html/index.html | 90 - doc/doxygen/html/inherit_graph_0.map | 3 - doc/doxygen/html/inherit_graph_0.md5 | 1 - doc/doxygen/html/inherit_graph_0.png | Bin 1853 -> 0 bytes doc/doxygen/html/inherit_graph_1.map | 9 - doc/doxygen/html/inherit_graph_1.md5 | 1 - doc/doxygen/html/inherit_graph_1.png | Bin 22543 -> 0 bytes doc/doxygen/html/inherits.html | 109 - doc/doxygen/html/jquery.js | 68 - doc/doxygen/html/nav_f.png | Bin 153 -> 0 bytes doc/doxygen/html/nav_g.png | Bin 95 -> 0 bytes doc/doxygen/html/nav_h.png | Bin 98 -> 0 bytes doc/doxygen/html/open.png | Bin 123 -> 0 bytes doc/doxygen/html/search/all_0.html | 26 - doc/doxygen/html/search/all_0.js | 6 - doc/doxygen/html/search/all_1.html | 26 - doc/doxygen/html/search/all_1.js | 4 - doc/doxygen/html/search/all_2.html | 26 - doc/doxygen/html/search/all_2.js | 4 - doc/doxygen/html/search/all_3.html | 26 - doc/doxygen/html/search/all_3.js | 4 - doc/doxygen/html/search/all_4.html | 26 - doc/doxygen/html/search/all_4.js | 4 - doc/doxygen/html/search/all_5.html | 26 - doc/doxygen/html/search/all_5.js | 4 - doc/doxygen/html/search/all_6.html | 26 - doc/doxygen/html/search/all_6.js | 4 - doc/doxygen/html/search/classes_0.html | 26 - doc/doxygen/html/search/classes_0.js | 6 - doc/doxygen/html/search/classes_1.html | 26 - doc/doxygen/html/search/classes_1.js | 4 - doc/doxygen/html/search/classes_2.html | 26 - doc/doxygen/html/search/classes_2.js | 4 - doc/doxygen/html/search/classes_3.html | 26 - doc/doxygen/html/search/classes_3.js | 4 - doc/doxygen/html/search/classes_4.html | 26 - doc/doxygen/html/search/classes_4.js | 4 - doc/doxygen/html/search/classes_5.html | 26 - doc/doxygen/html/search/classes_5.js | 4 - doc/doxygen/html/search/close.png | Bin 273 -> 0 bytes doc/doxygen/html/search/functions_0.html | 26 - doc/doxygen/html/search/functions_0.js | 4 - doc/doxygen/html/search/mag_sel.png | Bin 563 -> 0 bytes doc/doxygen/html/search/nomatches.html | 12 - doc/doxygen/html/search/search.css | 271 - doc/doxygen/html/search/search.js | 791 -- doc/doxygen/html/search/search_l.png | Bin 604 -> 0 bytes doc/doxygen/html/search/search_m.png | Bin 158 -> 0 bytes doc/doxygen/html/search/search_r.png | Bin 612 -> 0 bytes doc/doxygen/html/search/searchdata.js | 18 - doc/doxygen/html/splitbar.png | Bin 314 -> 0 bytes ...tructdynet_1_1AdadeltaTrainer-members.html | 134 - .../html/structdynet_1_1AdadeltaTrainer.html | 227 - ...tdynet_1_1AdadeltaTrainer__coll__graph.map | 3 - ...tdynet_1_1AdadeltaTrainer__coll__graph.md5 | 1 - ...tdynet_1_1AdadeltaTrainer__coll__graph.png | Bin 3093 -> 0 bytes ...net_1_1AdadeltaTrainer__inherit__graph.map | 3 - ...net_1_1AdadeltaTrainer__inherit__graph.md5 | 1 - ...net_1_1AdadeltaTrainer__inherit__graph.png | Bin 3093 -> 0 bytes ...structdynet_1_1AdagradTrainer-members.html | 131 - .../html/structdynet_1_1AdagradTrainer.html | 218 - ...ctdynet_1_1AdagradTrainer__coll__graph.map | 3 - ...ctdynet_1_1AdagradTrainer__coll__graph.md5 | 1 - ...ctdynet_1_1AdagradTrainer__coll__graph.png | Bin 3343 -> 0 bytes ...ynet_1_1AdagradTrainer__inherit__graph.map | 3 - ...ynet_1_1AdagradTrainer__inherit__graph.md5 | 1 - ...ynet_1_1AdagradTrainer__inherit__graph.png | Bin 3343 -> 0 bytes .../structdynet_1_1AdamTrainer-members.html | 135 - .../html/structdynet_1_1AdamTrainer.html | 230 - ...tructdynet_1_1AdamTrainer__coll__graph.map | 3 - ...tructdynet_1_1AdamTrainer__coll__graph.md5 | 1 - ...tructdynet_1_1AdamTrainer__coll__graph.png | Bin 3496 -> 0 bytes ...ctdynet_1_1AdamTrainer__inherit__graph.map | 3 - ...ctdynet_1_1AdamTrainer__inherit__graph.md5 | 1 - ...ctdynet_1_1AdamTrainer__inherit__graph.png | Bin 3496 -> 0 bytes ...ctdynet_1_1MomentumSGDTrainer-members.html | 131 - .../structdynet_1_1MomentumSGDTrainer.html | 218 - ...net_1_1MomentumSGDTrainer__coll__graph.map | 3 - ...net_1_1MomentumSGDTrainer__coll__graph.md5 | 1 - ...net_1_1MomentumSGDTrainer__coll__graph.png | Bin 4453 -> 0 bytes ..._1_1MomentumSGDTrainer__inherit__graph.map | 3 - ..._1_1MomentumSGDTrainer__inherit__graph.md5 | 1 - ..._1_1MomentumSGDTrainer__inherit__graph.png | Bin 4453 -> 0 bytes ...structdynet_1_1RmsPropTrainer-members.html | 132 - .../html/structdynet_1_1RmsPropTrainer.html | 221 - ...ctdynet_1_1RmsPropTrainer__coll__graph.map | 3 - ...ctdynet_1_1RmsPropTrainer__coll__graph.md5 | 1 - ...ctdynet_1_1RmsPropTrainer__coll__graph.png | Bin 3625 -> 0 bytes ...ynet_1_1RmsPropTrainer__inherit__graph.map | 3 - ...ynet_1_1RmsPropTrainer__inherit__graph.md5 | 1 - ...ynet_1_1RmsPropTrainer__inherit__graph.png | Bin 3625 -> 0 bytes ...ructdynet_1_1SimpleSGDTrainer-members.html | 128 - .../html/structdynet_1_1SimpleSGDTrainer.html | 201 - ...dynet_1_1SimpleSGDTrainer__coll__graph.map | 3 - ...dynet_1_1SimpleSGDTrainer__coll__graph.md5 | 1 - ...dynet_1_1SimpleSGDTrainer__coll__graph.png | Bin 3804 -> 0 bytes ...et_1_1SimpleSGDTrainer__inherit__graph.map | 3 - ...et_1_1SimpleSGDTrainer__inherit__graph.md5 | 1 - ...et_1_1SimpleSGDTrainer__inherit__graph.png | Bin 3804 -> 0 bytes .../html/structdynet_1_1Trainer-members.html | 127 - doc/doxygen/html/structdynet_1_1Trainer.html | 193 - ...structdynet_1_1Trainer__inherit__graph.map | 8 - ...structdynet_1_1Trainer__inherit__graph.md5 | 1 - ...structdynet_1_1Trainer__inherit__graph.png | Bin 22599 -> 0 bytes ...ctdynet_1_1expr_1_1Expression-members.html | 109 - .../structdynet_1_1expr_1_1Expression.html | 127 - doc/doxygen/html/sync_off.png | Bin 853 -> 0 bytes doc/doxygen/html/sync_on.png | Bin 845 -> 0 bytes doc/doxygen/html/tab_a.png | Bin 142 -> 0 bytes doc/doxygen/html/tab_b.png | Bin 169 -> 0 bytes doc/doxygen/html/tab_h.png | Bin 177 -> 0 bytes doc/doxygen/html/tab_s.png | Bin 184 -> 0 bytes doc/doxygen/html/tabs.css | 60 - doc/doxygen/html/training_8h_source.html | 301 - doc/doxygen/latex/Makefile | 21 - doc/doxygen/latex/annotated.tex | 11 - .../dir_2997b6d9ddf8b2f83e82c6988822a05f.tex | 16 - ...r_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 | 1 - ...r_2997b6d9ddf8b2f83e82c6988822a05f_dep.pdf | Bin 10418 -> 0 bytes doc/doxygen/latex/doxygen.sty | 480 - doc/doxygen/latex/hierarchy.tex | 13 - doc/doxygen/latex/refman.tex | 164 - .../latex/structdynet_1_1AdadeltaTrainer.tex | 65 - ...tdynet_1_1AdadeltaTrainer__coll__graph.md5 | 1 - ...tdynet_1_1AdadeltaTrainer__coll__graph.pdf | Bin 11677 -> 0 bytes ...net_1_1AdadeltaTrainer__inherit__graph.md5 | 1 - ...net_1_1AdadeltaTrainer__inherit__graph.pdf | Bin 11677 -> 0 bytes .../latex/structdynet_1_1AdagradTrainer.tex | 56 - ...ctdynet_1_1AdagradTrainer__coll__graph.md5 | 1 - ...ctdynet_1_1AdagradTrainer__coll__graph.pdf | Bin 11929 -> 0 bytes ...ynet_1_1AdagradTrainer__inherit__graph.md5 | 1 - ...ynet_1_1AdagradTrainer__inherit__graph.pdf | Bin 11929 -> 0 bytes .../latex/structdynet_1_1AdamTrainer.tex | 68 - ...tructdynet_1_1AdamTrainer__coll__graph.md5 | 1 - ...tructdynet_1_1AdamTrainer__coll__graph.pdf | Bin 11791 -> 0 bytes ...ctdynet_1_1AdamTrainer__inherit__graph.md5 | 1 - ...ctdynet_1_1AdamTrainer__inherit__graph.pdf | Bin 11791 -> 0 bytes .../structdynet_1_1MomentumSGDTrainer.tex | 56 - ...net_1_1MomentumSGDTrainer__coll__graph.md5 | 1 - ...net_1_1MomentumSGDTrainer__coll__graph.pdf | Bin 12827 -> 0 bytes ..._1_1MomentumSGDTrainer__inherit__graph.md5 | 1 - ..._1_1MomentumSGDTrainer__inherit__graph.pdf | Bin 12827 -> 0 bytes .../latex/structdynet_1_1RmsPropTrainer.tex | 59 - ...ctdynet_1_1RmsPropTrainer__coll__graph.md5 | 1 - ...ctdynet_1_1RmsPropTrainer__coll__graph.pdf | Bin 12731 -> 0 bytes ...ynet_1_1RmsPropTrainer__inherit__graph.md5 | 1 - ...ynet_1_1RmsPropTrainer__inherit__graph.pdf | Bin 12731 -> 0 bytes .../latex/structdynet_1_1SimpleSGDTrainer.tex | 38 - ...dynet_1_1SimpleSGDTrainer__coll__graph.md5 | 1 - ...dynet_1_1SimpleSGDTrainer__coll__graph.pdf | Bin 12710 -> 0 bytes ...et_1_1SimpleSGDTrainer__inherit__graph.md5 | 1 - ...et_1_1SimpleSGDTrainer__inherit__graph.pdf | Bin 12710 -> 0 bytes doc/doxygen/latex/structdynet_1_1Trainer.tex | 91 - ...structdynet_1_1Trainer__inherit__graph.md5 | 1 - ...structdynet_1_1Trainer__inherit__graph.pdf | Bin 14861 -> 0 bytes .../structdynet_1_1expr_1_1Expression.tex | 25 - doc/doxygen/xml/combine.xslt | 15 - doc/doxygen/xml/compound.xsd | 1113 -- .../dir_2997b6d9ddf8b2f83e82c6988822a05f.xml | 13 - doc/doxygen/xml/expr_8h.xml | 227 - doc/doxygen/xml/index.xml | 227 - doc/doxygen/xml/index.xsd | 66 - doc/doxygen/xml/namespacedynet.xml | 19 - doc/doxygen/xml/namespacedynet_1_1expr.xml | 2379 ----- .../xml/namespacedynet_1_1expr_1_1detail.xml | 38 - .../xml/structdynet_1_1AdadeltaTrainer.xml | 251 - .../xml/structdynet_1_1AdagradTrainer.xml | 209 - .../xml/structdynet_1_1AdamTrainer.xml | 275 - .../xml/structdynet_1_1MomentumSGDTrainer.xml | 209 - .../xml/structdynet_1_1RmsPropTrainer.xml | 228 - .../xml/structdynet_1_1SimpleSGDTrainer.xml | 144 - doc/doxygen/xml/structdynet_1_1Trainer.xml | 483 - .../xml/structdynet_1_1expr_1_1Expression.xml | 95 - doc/doxygen/xml/training_8h.xml | 263 - 265 files changed, 31280 deletions(-) delete mode 100644 doc/build/doctrees/builders.doctree delete mode 100644 doc/build/doctrees/commandline.doctree delete mode 100644 doc/build/doctrees/environment.pickle delete mode 100644 doc/build/doctrees/index.doctree delete mode 100644 doc/build/doctrees/install.doctree delete mode 100644 doc/build/doctrees/minibatch.doctree delete mode 100644 doc/build/doctrees/multiprocessing.doctree delete mode 100644 doc/build/doctrees/operations.doctree delete mode 100644 doc/build/doctrees/optimizers.doctree delete mode 100644 doc/build/doctrees/python.doctree delete mode 100644 doc/build/doctrees/tutorial.doctree delete mode 100644 doc/build/html/.buildinfo delete mode 100644 doc/build/html/_sources/builders.txt delete mode 100644 doc/build/html/_sources/commandline.txt delete mode 100644 doc/build/html/_sources/index.txt delete mode 100644 doc/build/html/_sources/install.txt delete mode 100644 doc/build/html/_sources/minibatch.txt delete mode 100644 doc/build/html/_sources/multiprocessing.txt delete mode 100644 doc/build/html/_sources/operations.txt delete mode 100644 doc/build/html/_sources/optimizers.txt delete mode 100644 doc/build/html/_sources/python.txt delete mode 100644 doc/build/html/_sources/tutorial.txt delete mode 100644 doc/build/html/_static/ajax-loader.gif delete mode 100644 doc/build/html/_static/basic.css delete mode 100644 doc/build/html/_static/comment-bright.png delete mode 100644 doc/build/html/_static/comment-close.png delete mode 100644 doc/build/html/_static/comment.png delete mode 100644 doc/build/html/_static/default.css delete mode 100644 doc/build/html/_static/doctools.js delete mode 100644 doc/build/html/_static/down-pressed.png delete mode 100644 doc/build/html/_static/down.png delete mode 100644 doc/build/html/_static/file.png delete mode 100644 doc/build/html/_static/jquery.js delete mode 100644 doc/build/html/_static/minus.png delete mode 100644 doc/build/html/_static/plus.png delete mode 100644 doc/build/html/_static/pygments.css delete mode 100644 doc/build/html/_static/searchtools.js delete mode 100644 doc/build/html/_static/sidebar.js delete mode 100644 doc/build/html/_static/underscore.js delete mode 100644 doc/build/html/_static/up-pressed.png delete mode 100644 doc/build/html/_static/up.png delete mode 100644 doc/build/html/_static/websupport.js delete mode 100644 doc/build/html/builders.html delete mode 100644 doc/build/html/commandline.html delete mode 100644 doc/build/html/genindex.html delete mode 100644 doc/build/html/index.html delete mode 100644 doc/build/html/install.html delete mode 100644 doc/build/html/minibatch.html delete mode 100644 doc/build/html/multiprocessing.html delete mode 100644 doc/build/html/objects.inv delete mode 100644 doc/build/html/operations.html delete mode 100644 doc/build/html/optimizers.html delete mode 100644 doc/build/html/python.html delete mode 100644 doc/build/html/search.html delete mode 100644 doc/build/html/searchindex.js delete mode 100644 doc/build/html/tutorial.html delete mode 100644 doc/build/text/builders.txt delete mode 100644 doc/build/text/commandline.txt delete mode 100644 doc/build/text/index.txt delete mode 100644 doc/build/text/install.txt delete mode 100644 doc/build/text/minibatch.txt delete mode 100644 doc/build/text/multiprocessing.txt delete mode 100644 doc/build/text/operations.txt delete mode 100644 doc/build/text/optimizers.txt delete mode 100644 doc/build/text/python.txt delete mode 100644 doc/build/text/tutorial.txt delete mode 100644 doc/doxygen/html/annotated.html delete mode 100644 doc/doxygen/html/arrowdown.png delete mode 100644 doc/doxygen/html/arrowright.png delete mode 100644 doc/doxygen/html/bc_s.png delete mode 100644 doc/doxygen/html/bdwn.png delete mode 100644 doc/doxygen/html/classes.html delete mode 100644 doc/doxygen/html/closed.png delete mode 100644 doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f.html delete mode 100644 doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.map delete mode 100644 doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 delete mode 100644 doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.png delete mode 100644 doc/doxygen/html/doc.png delete mode 100644 doc/doxygen/html/doxygen.css delete mode 100644 doc/doxygen/html/doxygen.png delete mode 100644 doc/doxygen/html/dynsections.js delete mode 100644 doc/doxygen/html/expr_8h_source.html delete mode 100644 doc/doxygen/html/files.html delete mode 100644 doc/doxygen/html/folderclosed.png delete mode 100644 doc/doxygen/html/folderopen.png delete mode 100644 doc/doxygen/html/functions.html delete mode 100644 doc/doxygen/html/functions_func.html delete mode 100644 doc/doxygen/html/graph_legend.html delete mode 100644 doc/doxygen/html/graph_legend.md5 delete mode 100644 doc/doxygen/html/graph_legend.png delete mode 100644 doc/doxygen/html/hierarchy.html delete mode 100644 doc/doxygen/html/index.html delete mode 100644 doc/doxygen/html/inherit_graph_0.map delete mode 100644 doc/doxygen/html/inherit_graph_0.md5 delete mode 100644 doc/doxygen/html/inherit_graph_0.png delete mode 100644 doc/doxygen/html/inherit_graph_1.map delete mode 100644 doc/doxygen/html/inherit_graph_1.md5 delete mode 100644 doc/doxygen/html/inherit_graph_1.png delete mode 100644 doc/doxygen/html/inherits.html delete mode 100644 doc/doxygen/html/jquery.js delete mode 100644 doc/doxygen/html/nav_f.png delete mode 100644 doc/doxygen/html/nav_g.png delete mode 100644 doc/doxygen/html/nav_h.png delete mode 100644 doc/doxygen/html/open.png delete mode 100644 doc/doxygen/html/search/all_0.html delete mode 100644 doc/doxygen/html/search/all_0.js delete mode 100644 doc/doxygen/html/search/all_1.html delete mode 100644 doc/doxygen/html/search/all_1.js delete mode 100644 doc/doxygen/html/search/all_2.html delete mode 100644 doc/doxygen/html/search/all_2.js delete mode 100644 doc/doxygen/html/search/all_3.html delete mode 100644 doc/doxygen/html/search/all_3.js delete mode 100644 doc/doxygen/html/search/all_4.html delete mode 100644 doc/doxygen/html/search/all_4.js delete mode 100644 doc/doxygen/html/search/all_5.html delete mode 100644 doc/doxygen/html/search/all_5.js delete mode 100644 doc/doxygen/html/search/all_6.html delete mode 100644 doc/doxygen/html/search/all_6.js delete mode 100644 doc/doxygen/html/search/classes_0.html delete mode 100644 doc/doxygen/html/search/classes_0.js delete mode 100644 doc/doxygen/html/search/classes_1.html delete mode 100644 doc/doxygen/html/search/classes_1.js delete mode 100644 doc/doxygen/html/search/classes_2.html delete mode 100644 doc/doxygen/html/search/classes_2.js delete mode 100644 doc/doxygen/html/search/classes_3.html delete mode 100644 doc/doxygen/html/search/classes_3.js delete mode 100644 doc/doxygen/html/search/classes_4.html delete mode 100644 doc/doxygen/html/search/classes_4.js delete mode 100644 doc/doxygen/html/search/classes_5.html delete mode 100644 doc/doxygen/html/search/classes_5.js delete mode 100644 doc/doxygen/html/search/close.png delete mode 100644 doc/doxygen/html/search/functions_0.html delete mode 100644 doc/doxygen/html/search/functions_0.js delete mode 100644 doc/doxygen/html/search/mag_sel.png delete mode 100644 doc/doxygen/html/search/nomatches.html delete mode 100644 doc/doxygen/html/search/search.css delete mode 100644 doc/doxygen/html/search/search.js delete mode 100644 doc/doxygen/html/search/search_l.png delete mode 100644 doc/doxygen/html/search/search_m.png delete mode 100644 doc/doxygen/html/search/search_r.png delete mode 100644 doc/doxygen/html/search/searchdata.js delete mode 100644 doc/doxygen/html/splitbar.png delete mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer-members.html delete mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer.html delete mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer__coll__graph.map delete mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer__coll__graph.md5 delete mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer__coll__graph.png delete mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer__inherit__graph.map delete mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer__inherit__graph.md5 delete mode 100644 doc/doxygen/html/structdynet_1_1AdadeltaTrainer__inherit__graph.png delete mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer-members.html delete mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer.html delete mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer__coll__graph.map delete mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer__coll__graph.md5 delete mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer__coll__graph.png delete mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer__inherit__graph.map delete mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer__inherit__graph.md5 delete mode 100644 doc/doxygen/html/structdynet_1_1AdagradTrainer__inherit__graph.png delete mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer-members.html delete mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer.html delete mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer__coll__graph.map delete mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer__coll__graph.md5 delete mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer__coll__graph.png delete mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer__inherit__graph.map delete mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer__inherit__graph.md5 delete mode 100644 doc/doxygen/html/structdynet_1_1AdamTrainer__inherit__graph.png delete mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer-members.html delete mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer.html delete mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__coll__graph.map delete mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__coll__graph.md5 delete mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__coll__graph.png delete mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.map delete mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.md5 delete mode 100644 doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.png delete mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer-members.html delete mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer.html delete mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.map delete mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.md5 delete mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.png delete mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.map delete mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.md5 delete mode 100644 doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.png delete mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer-members.html delete mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer.html delete mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.map delete mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 delete mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.png delete mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.map delete mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.md5 delete mode 100644 doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.png delete mode 100644 doc/doxygen/html/structdynet_1_1Trainer-members.html delete mode 100644 doc/doxygen/html/structdynet_1_1Trainer.html delete mode 100644 doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.map delete mode 100644 doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.md5 delete mode 100644 doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.png delete mode 100644 doc/doxygen/html/structdynet_1_1expr_1_1Expression-members.html delete mode 100644 doc/doxygen/html/structdynet_1_1expr_1_1Expression.html delete mode 100644 doc/doxygen/html/sync_off.png delete mode 100644 doc/doxygen/html/sync_on.png delete mode 100644 doc/doxygen/html/tab_a.png delete mode 100644 doc/doxygen/html/tab_b.png delete mode 100644 doc/doxygen/html/tab_h.png delete mode 100644 doc/doxygen/html/tab_s.png delete mode 100644 doc/doxygen/html/tabs.css delete mode 100644 doc/doxygen/html/training_8h_source.html delete mode 100644 doc/doxygen/latex/Makefile delete mode 100644 doc/doxygen/latex/annotated.tex delete mode 100644 doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f.tex delete mode 100644 doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 delete mode 100644 doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.pdf delete mode 100644 doc/doxygen/latex/doxygen.sty delete mode 100644 doc/doxygen/latex/hierarchy.tex delete mode 100644 doc/doxygen/latex/refman.tex delete mode 100644 doc/doxygen/latex/structdynet_1_1AdadeltaTrainer.tex delete mode 100644 doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__coll__graph.md5 delete mode 100644 doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__coll__graph.pdf delete mode 100644 doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__inherit__graph.md5 delete mode 100644 doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__inherit__graph.pdf delete mode 100644 doc/doxygen/latex/structdynet_1_1AdagradTrainer.tex delete mode 100644 doc/doxygen/latex/structdynet_1_1AdagradTrainer__coll__graph.md5 delete mode 100644 doc/doxygen/latex/structdynet_1_1AdagradTrainer__coll__graph.pdf delete mode 100644 doc/doxygen/latex/structdynet_1_1AdagradTrainer__inherit__graph.md5 delete mode 100644 doc/doxygen/latex/structdynet_1_1AdagradTrainer__inherit__graph.pdf delete mode 100644 doc/doxygen/latex/structdynet_1_1AdamTrainer.tex delete mode 100644 doc/doxygen/latex/structdynet_1_1AdamTrainer__coll__graph.md5 delete mode 100644 doc/doxygen/latex/structdynet_1_1AdamTrainer__coll__graph.pdf delete mode 100644 doc/doxygen/latex/structdynet_1_1AdamTrainer__inherit__graph.md5 delete mode 100644 doc/doxygen/latex/structdynet_1_1AdamTrainer__inherit__graph.pdf delete mode 100644 doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer.tex delete mode 100644 doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__coll__graph.md5 delete mode 100644 doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__coll__graph.pdf delete mode 100644 doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__inherit__graph.md5 delete mode 100644 doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__inherit__graph.pdf delete mode 100644 doc/doxygen/latex/structdynet_1_1RmsPropTrainer.tex delete mode 100644 doc/doxygen/latex/structdynet_1_1RmsPropTrainer__coll__graph.md5 delete mode 100644 doc/doxygen/latex/structdynet_1_1RmsPropTrainer__coll__graph.pdf delete mode 100644 doc/doxygen/latex/structdynet_1_1RmsPropTrainer__inherit__graph.md5 delete mode 100644 doc/doxygen/latex/structdynet_1_1RmsPropTrainer__inherit__graph.pdf delete mode 100644 doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer.tex delete mode 100644 doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 delete mode 100644 doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__coll__graph.pdf delete mode 100644 doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__inherit__graph.md5 delete mode 100644 doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__inherit__graph.pdf delete mode 100644 doc/doxygen/latex/structdynet_1_1Trainer.tex delete mode 100644 doc/doxygen/latex/structdynet_1_1Trainer__inherit__graph.md5 delete mode 100644 doc/doxygen/latex/structdynet_1_1Trainer__inherit__graph.pdf delete mode 100644 doc/doxygen/latex/structdynet_1_1expr_1_1Expression.tex delete mode 100644 doc/doxygen/xml/combine.xslt delete mode 100644 doc/doxygen/xml/compound.xsd delete mode 100644 doc/doxygen/xml/dir_2997b6d9ddf8b2f83e82c6988822a05f.xml delete mode 100644 doc/doxygen/xml/expr_8h.xml delete mode 100644 doc/doxygen/xml/index.xml delete mode 100644 doc/doxygen/xml/index.xsd delete mode 100644 doc/doxygen/xml/namespacedynet.xml delete mode 100644 doc/doxygen/xml/namespacedynet_1_1expr.xml delete mode 100644 doc/doxygen/xml/namespacedynet_1_1expr_1_1detail.xml delete mode 100644 doc/doxygen/xml/structdynet_1_1AdadeltaTrainer.xml delete mode 100644 doc/doxygen/xml/structdynet_1_1AdagradTrainer.xml delete mode 100644 doc/doxygen/xml/structdynet_1_1AdamTrainer.xml delete mode 100644 doc/doxygen/xml/structdynet_1_1MomentumSGDTrainer.xml delete mode 100644 doc/doxygen/xml/structdynet_1_1RmsPropTrainer.xml delete mode 100644 doc/doxygen/xml/structdynet_1_1SimpleSGDTrainer.xml delete mode 100644 doc/doxygen/xml/structdynet_1_1Trainer.xml delete mode 100644 doc/doxygen/xml/structdynet_1_1expr_1_1Expression.xml delete mode 100644 doc/doxygen/xml/training_8h.xml diff --git a/doc/build/doctrees/builders.doctree b/doc/build/doctrees/builders.doctree deleted file mode 100644 index 50ddf76e938d777e01441191e5e02d20ccbbabe0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2891 zcmc&$`Fk8k5mjXC*tI0fj_t%(JRt;Ru(SaT1VcCy6AmS7AgW-FVd$Od-5xwMJ=NW# z0~itmNhI$3zVGvYVB&5uU@@+RWDD+iH<9mW_GR6iL_n+F_(qw z@&i}z@^sC|R;W{mT)Lf7T0UO$%hx$Kpq%6f_1>@}f#;H)=3)tjJLGuH8WnsZ|0 z;qnEVYs2zI>I&yfI;b4TxK#7y6`D_~(x0>ZNJw*WCalHZS3;T}i1?22R0bg(^I1O{ z^6S*HpqcUc$3lL+niUlt&(cEjP+W|}K}O#$%gih3keS3(tp>d{a=7FG&zRU2*XXs`{r z4LSAh7vYIl?($n|ek%YdAMI*25Y^!51E_`=8BwY(zYU15*Zg*mxI#T9Sc6#S0}v26 zJ(5mI6Ko2T>dFSXlw(a5p7nMtqjAlF8AajVSISU8ykPNl`j2DXY-AZ%b{tI$9c zN$}hY8_x$&{FXL%EWhIrF`a#M{7z5KllLR%_=KEysowt)_YKhf?wa4@>GnBXZ|GK@ z)Te5GuP5~aNZq(~^VW^v86&|WXZsrjbI z7Qn~3%i%4PeH;$ zW4t%)(~^bXl@Yqlx1Qw@>gco&F+rnf2H%(+PH8a{#i+uh!1+Y-7ibzjeup{<)QBmN zmz;To4YyGyH)X~-TyFtcVEPneofa4;N@T7*px0+;u?5kZYuQ)V`gBPeqfG>)Isu{4 z_@hG0XQ&&~vWIAKMIm5@EZNXZA_vuoZJ(B9K9IhyJDIdfO2=-GF6+vbmHTgRR+uPY zBX+zANGNSl<K@R#Y7+)gobq3X)E+|=M^HrB;39r0J%T0wA|sZE_W z{1RS{GcE2!G8btUi3EeS8BZ_o(q&|l?>E{()gxPauI}#9FXW=j-S)cI^EYriEe@B6ze%0uO~@6ilxJd4oZr@6_B^8{UbnY z1aLsfk0ExOWBG}=!Xjk(CwsKuOTFKpKcy>ee{OAUt(7}Y>7waRzoFoy?eWjNDHcv_ zM=Bku3_p&4j+H?dBmMR9ELK1?3fNUorQG5=LCpdv)wRbyrvv_ZJ-_ES0 zGg(N0fDHjcD53XWL+`y4dhfmW-rGO3d#6(|@O?mHzR%xhOS;?HH?REvn>X)W-CJ|R zTB1B(jt8O3WkG*z@<0`6+16{QH>KsHY$$M=T(u%D>6n!I_HF6u>2X^DS5_@-Hl4t= zd@tZu7%49dB=wgiTPu^QRGxz9FtA--mo$*lAX^OX)NqZ>T~Awz`(YG4`}& zn8Y&=>`fXZSX6u|ph4nC0L8!Pbl@lvkHMxupXw5uV((07fh<>)ks5O?W zHKx@XYpXRZ*giT(GoWw7=e7a=RD8ZMdY*i`ONGmiROGTU6fN~mId)mSV@}228R&bPx zy=tQ1o8wbDVU!KJNu<|FI0j-3`nA{487Z9!#f08@Yf^QR>Ox@%l+%cvNEGOfu;i?i&eoRPfKW~Nz7@qGo;IbG zNH1tunQ_9I=9XjC`OK2I9=G-iF1giAq_V2KAR}J$>K=D3M_Ed6YnsO`JZN}9poNBY z^KCapig;WPV^9U_<3f(iaXP2VgF_wF=}y{<=Pu>NW7=N4vnU;@Mr}i&?vm17b)d9? zXDu11YU2A`*}f+c{JSAk=cROayuy0Ae6pfz72QL7Wnz@|XJ69xeajHlF%2;QEkj&} zwZXQRb}T}<-p}?FZx(1LHa$P33p74PdwY7OrpCsyG}7cvtIT$7KY!2E)V3TXaS}+Y z+Om++Kz3!#cuH7jpK<1{?KP4+nfzLY4$cOpbCM0bu;xWE&YGNX{YBw2W z+%PyzSpf%&;n|LZoS;?6{9`O!%9wHB^SnIk4Rzo|7ix6ga|zCt+hDv%=!|r6N|Q$s zcNB4LO8%ROJ3m95Fh|2BOTcV$P#^2NmPmL=EskHHGQhVxrAsyVHX(7&Cs;e(X%ydU zvG@^ju@=7vr_MT^bQdK`x(r!=Z%VA4!gnLu_prpQfLr=@)=kX$ z66k)2zMaxko1j-3f{KinSK-}T^GqcN+Er7kX=mKp%4G53rfe0uN_11=TCvOLMae(2 zt4O>ozZ6J=DW6YsUA`36YZbKUd1_K6dWEgi@1h^|`Qr)S%f)4HtRnO07-12QcAS`{}qWqkw~gtD4I@bMoYhTo_88iA{XJP zWr=XcLWiYgU3e*zrkHKt0)U<(%H2YCcSQw^8ancP6td<@vV-lM7`Jw0jTOIDw88*& ze28m1BFGmJhkr3YyX zMh+hZjnb|w47^z()C>^?Ft}07$AB`N)N>b2B#0~#%a)n(_1FMbS?CGSV|Aq z2H*1Ag8>KTG2mcIhqNj;E%f~ux>(k};uXa!^@Tg5a?4~=1OLt?wTlC|i=$UK?bWz- z(atWwA0F>$!XygJF>KN~SYM+H?KVyOMk2Y7cAzyQJY3~9ZE!ur;zeY6#A1NVk>!zw zEZ3#F+HWsR(0C(rU(7hl%B>0@n_b1etJsJV8gQ2tcJebUMcCB6?zt1JFl5< z-hOt4p2IdQSZ3_SC?1w_k`MK}W;6`NE4T^kS`+ zIqG71Ntq3LZazSGDFz6ux^|?8PCGt_m`^utNX2hu8^WqM}3{PUeR(!httxif)EV2yKuw?O6?Q`Upa@#!Z@$ z-GP*(kHS|NpLjt%%$I!(%T}YEtK0q98%^0JeZ0&zYQNV}is_))=rKcI#px4l5D&&q zJ^d_~KFQYdSq}p*pgNJcZ$1Uz^w+|m?ltJsd8`1qX-|6S2-9aEx#ow?ew#NP&$k^H zlPog~`s_h=0xW5Eh&C5>TSnSfpF6~s^I)1jU(W4{Bu`w}(e&vH+I_Q82#|SzZ5*Ke zOJ4+?v`;X`GZUTM;x8RyE3%0eI`+YS`ZCni5bZ+QSFptb$J19?U!v+`=hD|$A%9)t z`RjPw3%Wx@-(W*#<(PyMzRA|ut|xUP7!Wjm`Bs??fxreKDPG)Z2dhp(4H@TUua^+*saWr=>OlVYHpSzCAw z;p4xepJ6~31`YZ-JAS@57Lec<;%2s5=PP^81HWXwo=d-ivLS|-nB3)o`t>1pTt+k0 zF^22#krH-$e)t=JIrpi7s-)jm=yz5-agC{AB$a6t0YW@ga?u<7ZMG{|8~<_k#cc diff --git a/doc/build/doctrees/environment.pickle b/doc/build/doctrees/environment.pickle deleted file mode 100644 index 2d51abcc90e36405dcd3740b74d469cf3489b60b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16199 zcmcIrd4L>6)!!Vuo1G+^0|-};SrTAEnB62oNP-_BWJ3~{Y?4iytbuXtnd#l?$y`<4 zLv}Hx1k5HuQSk)46+G}ni#9I_aE>ZCo@Zcthe!utn*qPaxWb^6w$Mmb~z2B?f ztFErDslIGtEbWwpT^Q=L3YXZbSjbxiH*#Lt&SlnA6vzohIZ?|=F{3q;8?bYhBPR!n zW!KI{&PQ3n%v(mmmfd#RjmYK&yJbr{nM}c!YZsEqh-0C+HL<5pPDvS)%u-3V^%~Qa zr7Sa(G;=%6VMj&;H<)U)xVB3$)3lr(>yI=wH5E&iGF`h^aAbQrQ%n=C(^)8HEGNQ^ zBXR~XXKFbsX0$1Dr&BDev?XU7O-96YU1g`rE-W6Q<&iOCN~T;QhaGuT!e~wBOvgcb zPQqyRN{>z$lkAKmk4YF)Qf7LGvIZP^Y@%#TNehsptb#l)A&;+hWUDoVPR{M035UCf zdo4G*an$V-_Ux7~)AGcam|ed?)MzQ0Fzw0?F|(X9jaJtjB!A>dMl<(O&MT+-n_=88 zWUL`MUr?7%*76kCG@1nZc4|x4pCL!RmfTJ-nxBm$CsQ{mdJqk3_DHp)4 z)3jVjZZ&Fiy66xm!y|E$AP-t#sx<71VnN2)g-$KILKha*bzw1Fmg6D)i~Rx<0LjPjjHU0jhDs1nBjn(5*0Fd*eWEX5>CCw}i-B z>mnOKrt!(M6Z+pZI+EmtfZwKNKfyO@^D6kzH|hg*pC+e_r5w4Pow!KLi$f<8b)9&1 zRrlEy(oX{aHCme0-4Cl%fWBxHdIq5LWlW1DRZLrsgU-k_dyvu63OyL8>%kyAI2Hyr zkb(H9h0)<4;Eb(hmYg|w%N_75GwPQ&&AN8pzLYwZW0&$;7DAVbl{06lV&;^U^Q7`8 zPbZvCU2hsH!}rRmF@(AVF7MQGh+MAQU>Kg}+0$SqytJGu8<9*gZ(=SqT~oeR%Uv;J zlH-Cz9mAYoC>C;N%E~!fz7Bq4a`9%(*Bety!|@<%G>sT7j%6y`ke3B16!xD2k~71Y zFCABv(=I2Ii<65t6lv}(=eMlw-l_m@DY;wZ#O{&)`3*F-*!fbX+Fw3mOc}Ha zo=aDVD*#zGS^|gP5EHd-1`pg^F>U6oND|-$C&zR6CRH37j>tVVP4dHomh18(X~dYe zfhX7KdVX^39oa4Si4n1PkK8|!+AG)ru}6#;&0d2m(cq0}aOEEPCTeh*xC{>%YA|&R zlNH@$4qEamGm?XEcuLE+_B0u-#Z=ZxyNC zA2nKFc)%W%9}5PXmyfLG;)wh>dh-b_Z;To3rQt!kRh*>b4(BZSNnr6}Q+~>rCER>Y zSh-R%Wjefcl%F=HbkpsI{umLePGWt4wa;g;=(GmVdslweh~!PjwNw&~N}ZZV=8u@0aGMHK7Kw6b|TM~eedjBXn0oyPPHwv)DUIkR9D%Z~h#D{nW! zf3Y;I>_OqmFY{`4$)d$ePmhvWW2QBf&XqG(vV>KtrLeyJNm{tyv z$H-SFnl-I%Ri4nmZXBBALapb)T`LmcYJ9w=bay#?rVAdRx zKQ~%^@8o@!(W(G~u_u2a?l7A1a#AkI`+LhNJSZ&JKMGg~LyMHsKg;}5|J*15pxZ9J3az2SJC>v!DYxzqU>X{(s_e>P=o@TKW z>6Q4c!*6p>o7fJS#xK`1p=`{8ZVK;3nbB$E5pRC@l@S>zmJ1mQiX(rGLiw99uSbto zydnIya;^Tm{@PXX@B6D)q<`>VwZaGUANwoUYJcjlS~dN-zurpbFWe|xSw3drjqh$iHj(4>3O>pNv)c`&4D`pB~fuXR1AYw)Q>qx$5pdUrWvl zHS8Uz%g2kBW3U_IhV8CWX^W*Ci(9LyH(SKrY5Z> z;2JE$)I`pVea};qP*H1;EG2C?5K)s+4U5eXTD7nd@3m32a;DZ|N0z|x0;#4z1{1!S z$#}2bc)u!{X&1M$G6$7e5)svgc0h z)i68*LaUj$hK6TRhL(G2QB=GM(L}Gn{PJtGz(iTu7;OAXY)r8WG{>5`ePz*+B{vCs zHp%LxX|UO#jzHa>-RejPt&YMKz#ZMbwuOGGIbq?fG3=u40eia%_vPeMkk zd931(l=+;g1@6ca6zQJ~nf0S}3esAg${N0Uj53Fc*8IBBB4-F;0m+8@8R|4tBVY?5 zv^pJE3K%vpvg8d1EE`5C>xG0#j=aRpQH|&=fzayZ zY|Cfi49XZ&f_WZG<>~%hChQDmy8XdU5C#A?s3y}Ia=$;Mz1=PcFE_*ceV$tV2Tekq zNrrpHQzL3AQoZ8o5p@O@g%NcgCk~9L)tq>7M0F$4xZ7(`8xzlo=fw-+fOxTS$Fp94EpbxTyGbeK z-NnIecRp-swU#aV9IWHa*r62McI#0e+;y*H^`1)g3mT{s65SIUAcMQE7iq0FvWAbo zi857p-4XM!cDAwm5XTN#+%;3!Z5=yp*1r+SKLXuMa&G@@ERgZiNXDWt7WIs&KGfnq z+ybH1R$Or(HfW1+MNZehIkD;J(>qEz77a8n8f^PQ&$f5VZsSZX&v3S%DuMvLiWRq4 zDqd7qu_H?u)Y*%vK8R2P8LeK;Dn7+Y&eQ^TWC@D&UjrFL$V6JJ6l?hEY06YZsLoR? zUUyz3X9yufa@?D&%0hF*X8=O0L0oB`#4c)neI;6BIt z`AYpl1AT&`o)sYj>Ptv#C0WDgPH|=|JRy;~0~t{7BCS=KHGK6;C{sm!%RDz1BY zL;V1dON6tN zcg>lx9S?YW9qI$#UeD^6RjTi9piW5CpUWWw-mXAet2eNQ&)Xi#RPi=vUIy<@_%A3E zr|n(ZHlug4@$yJ667C2|Z^ygaw})-3QF|-YUbFzQ`yjO1k1G*NTi^BDgK6@Ayi8xo zX5Z+U^_YGWXBsno73u?~-^}W7sZ@V!19d{89$yU^F#R^9wR$^i_)NcpGF42^#q=Hg zj}qT$yCObVD#x92sZ><%c=;wr3H_ZU=k_1Z^LSu2N>-z5HyKgis(Kfif%JDnXmt&) zMEW6=z&!QmP|T0c>|-CM*D~I99-bGC_i$!xG=jPMy{HeO@jh06f2H~d8mJQz@$o^( zAQ~S+TB{GUh98ZOP^Kyx?eogCi66)A3&ml){F7^hcRfk(Zxw^=@E>DfeucULHK6>X z5L$frs0nXKJa1lb=LIFcp1@^*&vx_nEqS z9a(~)K7JN52+8M=*6JqK@HzcFXKGDRU_PSJvg9oFRnokv!Pnoa*~%0q%bQq16v@CGPR3W|kZ}4DQ!4_djAY zKlaRc+~32QS`y&fPf!tX|5Mhxw^HwCb@e*31VLTR_kk^bY50qIX5t<_&y!&m7g>85N+s83Nm*1dFHbm}Uq8d09UMW0&o%Y;B5X&FfJcXT}l|@EJjUz~@v} zpH`_py@5I*QUBT@13qUUjr~&A@cEoYnJPZp=J7v?Sb2r{8z++J#5O^G`A780Hw}Cn# zQLj#b3F;4L?yoj92 znZ^-`p+1Pn0#-k*Qhi|qbwVO8PKOL45=UCAPS)@v(nXo7h#ZSI(NuYGkRri@o5FxS zuJMO~yd>yFBwHR%{{SpXl^x{g~A4~&;Q#Zy-_!(^YOwX`K z_)^X^Cj2a_4;Wv@`pYZzS2WNkDC+jvkOAYbKpI=Rtl=|$4rQtsZ}%pVxPQcByfX>8 zMtCbpdXqBG6H(ueIu{k-b`^wH=iwSm%2mxkD0x|*P<}41W&_=x0guBqoEghuz`^-c zA3PV=vi`bC{q+s>35xpkO2{AtJxFVH0c-diZs5#VctRreUdSK>8d)uo9YOYy^mcUV%|Eu<=w7uT+yK~uT7+UNgjNQw6bjn?9orW1 zAeZaMW9&onLN>Y0GwB7VpEG0G3CMjF>H~7Ov-(Aq>K8XqCnV}=0x}@?)ktfVWDTF( z*HEU4+`02`o-B^t5u7$tnRu#LblfxUw_-nLe~vWks??L1kz>_yr0!i&l!oT-fpI<^xP!6Y@rdc&1^ zm)6z8)-%e9m)AlD(cFc!R+=^ZaJ-H)wXhvoLL&9oLk7{j3~8-)vxcvJIc2J%S!ZKr zd)@aWa)uDDAX)ix%HhK)L-hvKAY^+Wv>L$`Arm-jn2W$B1@1)G3I8WE*oSY$qcac2AIb-#1Gy?tCKxlO>u0%hM6lck&!=OLM^k2tj z-s73^=zlL~N(mtoLM4Qg5Z*ar^*&St^uM3=K2WLm!Mb`KS%RS6eF!q3|HDXY^%2(a z`MaJowXhvoLL&7WAOre8iZpg+S;JTVIAyBo509bbs1xXlXWYf1>8kT6KG;o8M?-7R9JmwfQa17e+* zeB$Cq#b&?s##6+0FM0pNw~Mrwd}!fzk>lizk34=poWMatd=53}s4uY-x04gbQR!UK z+>x|!mOYom@hXLn0xV~raRQDH=92@(qFX4sRx%80(!seaYd?<3;@D*}XI*0DdYWem_o^;wWLpJAvy6%X0S{(@K_i>^50eIpaj(x}_CeT|0N~?DW3r z=`5;2K52}0PM7*JTr}Eo;IPVW`%Y8g@cJMu@oANRHPQwHYv7qz(e zhqw&Pz&?N5av$| zv*GYzYT}ByB42s${J9qLFCpY(47vV4hOC5pycX_>5bm%4SGZ~-X+osI%Y^=I6wbR* z{vN{pgW;APe(!iG$JU<=t^4EgsnGh_NAaq~Q-o~E)F!mnbFH%`^Sk^+R7pSZ?ESrK9zTCh8)+E+U-YHy1wV@OrZzK!0Te8zTlJ;Ps bhy_Z7)abKxH5DnNEg3E^rXi2zMd$wlxI-h@ diff --git a/doc/build/doctrees/index.doctree b/doc/build/doctrees/index.doctree deleted file mode 100644 index d15e57ee42135dd7e1e84e29c2ea394e7bc02473..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6136 zcmds5d6*nk5l=SRYm(h08xj%{pvlD~WOs8wfCc0VM_3rHJlvqeq-Xl=z9v20Q?I+T zyI>0uS+k0_c;bZzDx#v|i3ci*c#Db$ig@4megEop_hzs7`3HabeY^8@SJ$goRlllw z_3Fl^niJIG$o0Y=KX7DN;McnJqXNy{cz~J`npYIjMBp-c-zXD!wmdQ`$7)-_2BOQPV&TAH9Q$f zZ`6tcYZP9yJa?b#4{f%pab&rX6{;Zi9LtU@PePYME$}1T^&vxA8h*6)MnNsoQtq`J zSIb)D?w38H1?T_=TB({uOJ?Lz0~=vvuL|n2w_(R#uOs*O8ZY<4%e^UAFT5*9dUP1k zD$yF*LyQZp7Oj~B>1a`~qe#0@52zoL(6R93NZsoT8#WNPL|a44Q0o1XjuZ13(KTh! zR<&#UG{??byf|@#rG~Vw47r{ihIn3I7R@PjLpc`nJ=d3Xe19{zv)HDhYEr;<<8)|u z%Mk?rrvEbt>4cjP(B_1?i)w|KqgJZran+8i(~S=q@xU)o58}Evp)EOklR8SRQUEUF zpsfmEZ7ZsEWwpMn)|S$|Zs?5nJ%}5}W08bWZ2evsmp;NGp zDJZk#44n#Xd$aAE%{uDi%}<-MIrg2h<>_kEVI`gcUpyh9GqI~;=_k+X3&gxVr0s?( z&{3`lCWw8f zKo`L){Rv$ReiKqTNNqU_UBYIRGBfB>u_!Ap-NW!}Lu$IrPD3X}uaw(%c`Yr7J+|Yd zM^d)1Kv!VXD-+tCZ`z*+X2wB+_q?ho+Wfd)m0CLV#Qr&=!}V)k>`3K04vPA~xLP^T zoE}qhg!YJn39K;iy-~V)T+AQxf+{^}98t{*ra`^|^#xT>yQnWuE>pQ!8fY~l49s-R z7*$FGEub_;BZZT2?-<#ofdwFNwZr*hs!(-|YNdfTP;m$b+O<7$#z;!hlIb=$E*56m z@;MRGP?_MEYt&v^zfH>&zz;33j* z2AC70iZU+;;TFG!lV?~--*WlP;M0tG%$ZR~7vO~)ttM>y$U79J%7kWpw$NOf!{;M3 zAJ6Rr1ZE>4l!ObCq@ z6#_?bq^LdW>TxwA8We)yIs`!ho(>SrrUZm^{TMwZ1-Kfchmbm?WQ?Ag^F?mmy^e`D zjM0syfp#peyS`hsqne@vWAwDrz#^u_UgS1(fF3FYFm%%xJzc87afN8Oxu~vJiMl}@ zP&Xl>(2|OG3|v z9Mje9n%UJo2mTq$9B1nCbEk;U>hgrp=OH$@Kb%F<^8xb<5_%yvQ!MqCS?fUwRUa~{Z!ZeFX?FI~tDyU>Sy^hISVymBHC{7|b0*5(YfS>*p3v*q z1uW*a%&{ivUO&rPsEj7&4KwOxLjoy(s4@cG3iL*3d`CiW%EjKEX}54P8@-tod`nTZ zVhwlt1M^@Uo(*Bx);`^N5N$3#+ImPv^j1^Fa=XnJC#a*FGz-JXp}SHaiv?IDM;e}6 zbEEM?)wBg<^keikwI}sHOnLkCmPFPY$`0MIK<|JRcPI4D)C%bOuFN6y?xL8_meM`y zE>n}Sc{jhmM@~9lR;oMLS?@&za{0{_r}rW5-k;D1AlIB@cO&l5>a^uM(+5o;qFutD zV)XA#=tJP1gg#1UhW>{Sp|1?&ADIQV3CKTcAipo6kFiy}_TI^me|(m;{cG8ZPbdcU z{)9f6FT5{XXkh%*Oc>Rj2UQALuIy}(J@8*4QyEl7g-i0l@M79F89_9FIc!X{E5#Tta5B(Tm{3M~D zLY@KRv6*1tu;D*u5DOx0`yn^O={YoqjN9)zV ztK^&^{klxQ5lg0A>&@!lmg#rmh-vH<^Xd0x`h#dkX~_=YKbGlFT*$@3e12dWuRmj4 zFrne0NyA^t^jB7^5olb^>2D>`<~rFZ;qMqFbWGMIq<@s@pQ0n*ELGrN3H@6vM*f={ zb0sa0p`L?drmW}USG0vP;{GbsO?aJjxD0Asz)`CUSJ_^S(Tkpk?}46=-$XYvujtC1 zQ{ihbOxYLe7JPwjOL0RFw1YVc7jpD;Xiar1zLms6Jy^p6%v56S={C^BDiuYIzTVy_ z2r%k#Wi;3m=%HQ})xBQb&K&LVPfeQJbph`OF_w`HwlQrOL%qPr?hMfcH!9g3KGX{h zwF4daBo#YYU^Dm2qq>uyJ3QMTiZR{6LUcuonARkHy_g@`9gITIN7oyA3Eo+MgGj}b z`=zJ5K=`27mV?Nba604=wfv&($T&;&H z>8s+-9FNPvCKj{tAr>m^@4*@RNG3NsvKkNR6)Z_Cmbh4Oh>W5;S5iiLCFtYgXx#l8 zadbHON3oz5Rt*D|Rs7PymuXy6DkGdUdNpVOb&(U-8MfqJ|<=E z4u_yFnJsaWvR{itgd(LMDons5h15 z`jbJ{TbQlgEa?v6uC4sOsN%RGPdyRq#);d^+ICbH%(DjF5xt$+IOFVUW!QBhrB4K< zzfE*b4N`p)Gd7Fe=R>6({M?$2L-omcQ>(-x^kNZ)R-BI*nnn5)(9x)&zu`LxusRil zlIS#Xb;yf-hPp7UV`y5T7z5N$p9UJPpBz3Dwc~Wq#IafJ7#<$(Nw2r2cJRy(%wexS zgSk-7F-{z*D0fJC_>c4xm^|ML{2_fNKdzqYy=f_U7Fez|snN+*w{pl`XY=AF*U{(j zLnm@!GVJGqI4)MDX)n{;YzVhTs*()^^-i!Li84G)a)kOk5X<^}7P;J{3r03lo6)rN z89ql}fR6{!z}mye>y&gMNPI9De@+zkU7(iYs#rGtj6!bdNMFQ@=9m$t?#FYYFUD_C zEx~N7OO3^%YszHYoRRtx!&t(vT8$I!m_%P{7GWM?1{3)(7Na=~;ds*7o*x#Wz6`8o XeK~#wH`MQV)=qvFXS9|^g7X&vQ diff --git a/doc/build/doctrees/install.doctree b/doc/build/doctrees/install.doctree deleted file mode 100644 index 16125ad9110761bd6b323752fc2448cfa24d3dc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21271 zcmeHPcYGYh^*06=oh>&?02^40k!0gL*|-D@Mz{!LY|D3tGkuAm;fd+)vX_WQm!yL)?*j14j2mwfVvw0kpeUY~hyW@qNQ zsriDNulvQam#Ml1+e`7!ie2?n>ZqmHtEquHy2EU#S{2(LtJ$79CQ#ElvNNYlnKDo> zmJ7w|kec3;JrTbP_CS4T2nB}J7&USS%67$5GkUVE5xn8n{Gwa+)J$DiBb#hhFM35E z$Xj}{$3~Dq)LE>0zEv(WkyKCixI~pP=#nu~tQOo6PtEGdEji76;niz3 zmwYw5Cwm5J@@}P8WHg=lH_R;BqrOd5tIS*ukp(VWd$J1wT6L>w5Umz0Di{N<>-k36 z&0Ea0n$uG^=X>=5&oBB=nOn^j>_Jb>4b(hyPR%0E&Q)yBvxXqb{64k7oRhB;L6K0*(W(O%~o9&srqE6#cXX>^g<_P9vfjyC)B*inPnaqS3t?>NXe%- zv(0%>ahf%pjud>V(`ud(t2Z60Hyx>$`O@k=&6#5^Oe!}m%1y`0HR|TfyaShl!qn+~ zYVml-^z1zAJf+TnUoHvMnea=pMncuLnN!T^umQBK+MTK9^su}mdlszP>9`fUvu4%H zodtVeXJM>r`Px$ws8)rLTA1S<}c zJhwhz)d$97fmtkgLCs02P2hcVpt_m&l`zc3?ug;L;fS$$tjG2Z^gV<9$SC^g;l5*x zq4PBQ=|u_2T4Ky<3rlzLWYQfINw?MMdXO|PftcF@wVlOe`kO^ehaGW8pn6bjPHC{^ zoW;ECY~n@jau!-pw|bP*VzJI=L|pCeaM+-G0@ce(;gNDz)1YVq^A2rFM{Ia$6Xwu{ zF}}+nb>O1!IuhiV=^^WY=6o4VM{NF5$o)wJNo;&3u~!^{QWIH>!`WQ+){yil1CH znFd=Ti{zle|6XPE!xOAP4X`J$Vy>LD%a#$3$tvdtFg_2bR33g(2$ao!vIc(Q)eEj+ z)%^4jI&5TA_=O(R5wg=5X0nkX1}r^t=`m|=WUUgc^`Kc&!_Y=KP!$L!UAWNb7u7(yEbq#rrcCK|4ISicLw6C3 zNrqMST%&5kGkwQ4`XRAhc59qF8T)MV5UaS`aGkh&O81*F<9x^WYu>uf&ViyoP|pwB ze#WJtPMbT8{(nJ#E|)QuE!#TCgP&3NZ1jz>5L*h})3!X24XMEW8LDE98Eg)YLd22M z7_^GzI+SQ2SBluTiCpqB%a)}=KOabF_25N#7a|-sSg0@RB)9s)U^P= zE>PFA0(H^kI`@2X;WX;8Q1}gjdK|-F1r!ghue17Zoalj}ZXORYt^f}YU2ju2K|T8e zbs*B_4O*MiwK~)jM3tS&)H9tECCPi1GhLFrMG;HS)=AzSfqD+BfTzz<)~=ol32#g0ch74=8s>K~ zs^>$xruHuY>n{w{i-6c+Tz3fT4ySf^2I|F3Z#n2;XqD)I>{{k`I*=h{6FcxI9%ocz z>Lm%DWc+^VWIUZ3iFX%xdcZX92H!6W)XSM~rgx|2n_cCeK)r(bW-AUM;57RRN}T#Y z2BD@CbFKkBo6B%%Ly_Vt_a4ku7DtS~GIW&(Kt#O?e7`zSuK|OSGThV9_kDqSE%V(E zzM;{ofm{H|Gb^`HB+Or38j~!SBYJ;-zog6k{W>E+LNGEil94h=2sjH!A!$ZhfLzSC z1rI0KgT=D#C4?0Vy>2oKEr|quJx5rMActg2y#eyQF;H(}K@O`0IJs|PbPY4SlzKA^ z`j$YwmGPy(K|^jHmftp!ZJ^_j^>%PPo#90z>K$O~oq>8+r1rN!?FdLSLOSZ*aX2#0 zSMLGvdjs`8rpe(58WtuU4)pI2)CaiYcvSHCGePm{gUs27I-=m~d~lMmDm;D|JRTg) zN5I8L1NE_p<@XEAjt-osg8KbiSbZGrKM|-;GP8#U*Ahmf?WY3uX>NB3$m9!#tazj< z!*E00{ZlBEaUdn?H8L3^y}5hqmhPTaxvf2$wws%~bDOvBUXMi+-|6&SotP$^PI}m9 z4%Wk#MvnJcXz0lDpgsq+d_GWLh}8P2MhE<2puWUX_dx1i?to$1yWALYkn0(X&t7bB zB8zz?M!Pa58qmU+bgafi7wdC+_R9+osfvYFDXh_aIU&1rxUWp~+%?-Wk=$Q}+z$a4 zUxVyl57ajxq{AG2QOnMQ<~IZNEtb6nvhyfmq)W!x38uwh-#(bZRz-||2aGqNP~Qd3 z?*;1nk-op#(Dx4l^+Tq)iuLUpp3Q@l<>MbF1D>8$u$TF~ep9oloR~~dy{dkc;7^qL zTiIuXEI;1bd>sUmZ++ z=SD348Z1u4qkaSGzYWyyA|3vsp~K$?>JLo48`MXfV&1{3SGjEXWEFV137 z9DxG!c8xP=UNgh=xKPZqu5AOX8iVz!ERbf@9}{egR{u1aR?mxA{xeuUa>V}vN&gzC zzp87?Q6}~GK>Z`qK~pC6&n6aW3MSpoX`D>aQT*B}`P2m=%QO{bl2Xypcnjzl z`K{-Jn^9-(Xz&=%Q}#$7>@?IW{7lrxg^>~F2tZeM`w?cC<^nM^ zHxG}1<_nd!BTmI>FR|W{H6THu1w!lCkQR@BvD#P{$4SL_U1$u*Rp@xs!!@R%ohX}5 zKmkN}1RepMD6J)1EHNQi-dX18gyl3eIfP;8B#rE3LAFpM%N|C`*6a3Wy>?2jrKc)Jx;&|_)6#x&U2ls7$N&fe94-y&1U!UT zfk!~Rlo^h`CFWTq2#01mTR>JdK%x&wGS#KkQjt(CtwD)%l8n)7`E`bj(LE8TkCX=Z zwn69MEueGdcbj}G-h7a6#k7tQwU?NeqG^SMFS{o`H_7^va`JOb(x zjBTZmAhX!;#tQ{xg9gc-3wwrZL$XY2g%fBDz5Ib&CUns_E#GCA8~6-?6j*&xFX5L*^k! z6*(}{$xFL;Z``@3d;LnI?E)+|58IitJJc+h3>lXQj>+A)H z5m1ki(BlX*-mu(Gso$mRvmb#N7&$mxS`{SmQPAThYW{j9zx(?mVGtsDYR&PMGuh%G zOgkp2Y^v&03x2BY1XxP(W6AriC%PBr03lNkevG8k0xjj zprPbmJOVPMX>twVewusZUeAN~q>E)$Ea^(5$+Cp<{(~CR5#j)E!)P zdDM?rT>)iKosCC8gMvV-j>#oew>4JX5pY-<(qtVWThwH;N0daYJVdc5kd=houqHR* z!#tIxBB4L3pu{;@0$G(`XG$R38}%Vq8gL-1;VmE~zxAj3jlB0F+SEkEt=mh?Kr(uH z(jY-Gj9xJXpBw1U_RR?EsDRz};Stb?plK_GRG1k(@SOqHMg?R{gRsy^E_g!%T`hG9 zF6hxHaZVMvui@9(B6lv5JCFt}_haxD(6#crP4-%C*<~6Xo6OA{;=NXM9iwP3F(XOg zua{N{vZ3%Xna6U2u7hE{0kzP;I=s*@uBW1tm?2Jt4@>?&I#V*1<;8aZtLMpUGL?EhvC4!q{ygW4x7fV!vVgJVPMHTe@MN z+ffhu@bX)8x1(pG28MbT9sxaD(CGNbq?3l?X~F-xD6c&6GI?SEIQ%Y3cR+_w_H*zE z=(+fhUXlHuVvoewr#nrwobx=<@bg0r^LENZEIa5>5v@P)*xEdv%KYsGf^YKq+i*0d zz7Rm@Y7dGgy$FrrAa~*s(2Iqf?u{%^BcQ)T>R+nsWxVR>-iI%$b?h%2)2pMrP>ydo z7UtpHYh|O9!P}DXJKAoAat?C{ZZXBD?O99dE^yJTD~UaK3v=T~q&3?rk)B@0?YbUj=3fpbpznL|2~-ZFu5a z1>|iSB>M#kP?B{apNpfq?0wXmUL}tk#OVay!;EDF{vWS5L_1iqrjVC&0FrS^>ktaN zZj)Mx;IP1eEq?v|OD^8Iqq|cY^!G1MMT50hv-8D4{V_9Y(nv*RsiUz^uPF;ng;^** z0VI_z9{zR_dZMzu$hhwi0M4%7DO!40sHF*O=qJ}nIErDCPv8;ICk2NdxtVCvBslmgkWHeJ-T8A7UZ3+_`g4Z*KR_oxSUJZRowYXTy%}^$9IuBZUlPx$Rpw?%uHb za^6R=XWd0xw|6si5)#Le22v4p&(54iylKaVZQbj8cbnZYCe-b@d{1xpjvS-dBbCja zRYLdYh0V!B_tjB{{Q`hs+W$|Y&=$5hD(Su`C z7}~JqK)#l8J|Nq&W%7Qf2SMD0Ga@bMZoY9C0xIk27k~ECQZ2hD0K-r=uaqd zPLYJ`&-^+|60Ykb=lhE^;Dqb1cnj!n^1Dq=P|5-$FM;t1%FFZ#O8Pq^X)iG=$xQ1X z(k?+b%(P-c|KtW;2gf@FoA02^qwol5D*hvcmqKF9TBBrKeLK8RrKDCWua+(F;CwCG`uVC?a6Hpxw$y<+8>jB$B* zLLxC+(0F9^ZpWTWHyHq2#R-#FE)F?9rU4bVfP{*5#b0iC6_Dz(#fDkJfrkuD1Ha9B zlhI+ih%r%bH$(=S!R@;KW5k>Zc45XAJg}8Tgu_-AmZ81GhHIE{mVnIGAlbDr<3&Xr zs$3qOD$z$_5(h@0S-pNJ5RrZ})T*&3JW@0}M=(#+>`jqo=W@HQe}(cqV1Tgm@d#*v z&}%D&?67zZVUHD%<1|S2UI@DfhkL77CXS9o^-Chqw7*wIns|S&^g;`~m5gzb9IcV;y~zQ&_v$9>pPCGcN_8Aq#-ZqH*|qfcpYRY*I>e9tj>W2+-s7+~ zUcJYQEECmxAX4uM0-*PLj2D(3fl6rZL_7jINg&%~SIBrsP-fjBNMS!Noh5d6FTk^m~$gm@bD5(hSAR&-*Uo{ zh(DU>-qXQdD%|{uX*^CHtmDf3y1luTdvj~?w_+*JkjM9#HW6xKpSd~eGwlMPPboeq zsi^}P;EhZ1z)mDVr_W(ND0Gm4%@Ov#vjpk#5UByn97@UD`O*xZ=zL-YbUwbLVX{5- zlk`32f%{&DpSte}7V1O+q+Njrwk+X))c2UxWZ&ZhQxA#7b1PwQHaDHEd08dAtk%3_ zt%r*4I8W17ie{o~gom{u51#`M4`Mq%ycx3_Z?Bw4<>_TSm0cfI$$%MZAchF1vV0<7 zGB`%Mc6GYq?aQZEuFkATPF$0d+MPW{dduRb{LEOnnlrC8oXxFWy|}r9$*lH~BJ$+3 z+FPSeb`F5xMgOg8p>rW0I>kCX0y$Ag1u^S(j<8wr^beZwW zyptHGe34LBvFjXXmG>^o?8}exxT^Bv7XPTop~<5PVaZ;dqeWLN+sUZZsC{@*5$oac%urk zb6&0w7hf?iXiNvNOe&w)_1AQUN-!b>Q&g>%E9putV{Ac)2xk=O3pTmc!QxO|-_By} zu&TJpMe;F&6=dg!C7cYnqd4_F%HaiS!Mbi3r') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) == 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this == '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); diff --git a/doc/build/html/_static/down-pressed.png b/doc/build/html/_static/down-pressed.png deleted file mode 100644 index 6f7ad782782e4f8e39b0c6e15c7344700cdd2527..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yM+OLB!qm#z$3ZNi+iKnkC`z>}Z23@f-Ava~9&<9T!#}JFtXD=!G zGdl{fK6ro2OGiOl+hKvH6i=D3%%Y^j`yIkRn!8O>@bG)IQR0{Kf+mxNd=_WScA8u_ z3;8(7x2){m9`nt+U(Nab&1G)!{`SPVpDX$w8McLTzAJ39wprG3p4XLq$06M`%}2Yk zRPPsbES*dnYm1wkGL;iioAUB*Or2kz6(-M_r_#Me-`{mj$Z%( diff --git a/doc/build/html/_static/down.png b/doc/build/html/_static/down.png deleted file mode 100644 index 3003a88770de3977d47a2ba69893436a2860f9e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6U4S$Y z{B+)352QE?JR*yM+OLB!qm#z$3ZNi+iKnkC`z>}xaV3tUZ$qnrLa#kt978NlpS`ru z&)HFc^}^>{UOEce+71h5nn>6&w6A!ieNbu1wh)UGh{8~et^#oZ1# z>T7oM=FZ~xXWnTo{qnXm$ZLOlqGswI_m2{XwVK)IJmBjW{J3-B3x@C=M{ShWt#fYS9M?R;8K$~YwlIqwf>VA7q=YKcwf2DS4Zj5inDKXXB1zl=(YO3ST6~rDq)&z z*o>z)=hxrfG-cDBW0G$!?6{M<$@{_4{m1o%Ub!naEtn|@^frU1tDnm{r-UW|!^@B8 diff --git a/doc/build/html/_static/file.png b/doc/build/html/_static/file.png deleted file mode 100644 index d18082e397e7e54f20721af768c4c2983258f1b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP$HyOL$D9)yc9|lc|nKf<9@eUiWd>3GuTC!a5vdfWYEazjncPj5ZQX%+1 zt8B*4=d)!cdDz4wr^#OMYfqGz$1LDFF>|#>*O?AGil(WEs?wLLy{Gj2J_@opDm%`dlax3yA*@*N$G&*ukFv>P8+2CBWO(qz zD0k1@kN>hhb1_6`&wrCswzINE(evt-5C1B^STi2@PmdKI;Vst0PQB6!2kdN diff --git a/doc/build/html/_static/jquery.js b/doc/build/html/_static/jquery.js deleted file mode 100644 index f2e82ed9d..000000000 --- a/doc/build/html/_static/jquery.js +++ /dev/null @@ -1,9404 +0,0 @@ -/*! - * jQuery JavaScript Library v1.7.2 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Wed Jul 30 14:06:55 UTC 2014 - */ -(function( window, undefined ) { - -// Use the correct document accordingly with window argument (sandbox) -var document = window.document, - navigator = window.navigator, - location = window.location; -var jQuery = (function() { - -// Define a local copy of jQuery -var jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // A central reference to the root jQuery(document) - rootjQuery, - - // A simple way to check for HTML strings or ID strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, - - // Check if a string has a non-whitespace character in it - rnotwhite = /\S/, - - // Used for trimming whitespace - trimLeft = /^\s+/, - trimRight = /\s+$/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, - rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - - // Useragent RegExp - rwebkit = /(webkit)[ \/]([\w.]+)/, - ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, - rmsie = /(msie) ([\w.]+)/, - rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, - - // Matches dashed string for camelizing - rdashAlpha = /-([a-z]|[0-9])/ig, - rmsPrefix = /^-ms-/, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return ( letter + "" ).toUpperCase(); - }, - - // Keep a UserAgent string for use with jQuery.browser - userAgent = navigator.userAgent, - - // For matching the engine and version of the browser - browserMatch, - - // The deferred used on DOM ready - readyList, - - // The ready event handler - DOMContentLoaded, - - // Save a reference to some core methods - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty, - push = Array.prototype.push, - slice = Array.prototype.slice, - trim = String.prototype.trim, - indexOf = Array.prototype.indexOf, - - // [[Class]] -> type pairs - class2type = {}; - -jQuery.fn = jQuery.prototype = { - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem, ret, doc; - - // Handle $(""), $(null), or $(undefined) - if ( !selector ) { - return this; - } - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - } - - // The body element only exists once, optimize finding it - if ( selector === "body" && !context && document.body ) { - this.context = document; - this[0] = document.body; - this.selector = selector; - this.length = 1; - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - // Are we dealing with HTML string or an ID? - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = quickExpr.exec( selector ); - } - - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - doc = ( context ? context.ownerDocument || context : document ); - - // If a single string is passed in and it's a single tag - // just do a createElement and skip the rest - ret = rsingleTag.exec( selector ); - - if ( ret ) { - if ( jQuery.isPlainObject( context ) ) { - selector = [ document.createElement( ret[1] ) ]; - jQuery.fn.attr.call( selector, context, true ); - - } else { - selector = [ doc.createElement( ret[1] ) ]; - } - - } else { - ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); - selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; - } - - return jQuery.merge( this, selector ); - - // HANDLE: $("#id") - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The current version of jQuery being used - jquery: "1.7.2", - - // The default length of a jQuery object is 0 - length: 0, - - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, - - toArray: function() { - return slice.call( this, 0 ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems, name, selector ) { - // Build a new jQuery matched element set - var ret = this.constructor(); - - if ( jQuery.isArray( elems ) ) { - push.apply( ret, elems ); - - } else { - jQuery.merge( ret, elems ); - } - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - ret.context = this.context; - - if ( name === "find" ) { - ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; - } else if ( name ) { - ret.selector = this.selector + "." + name + "(" + selector + ")"; - } - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Attach the listeners - jQuery.bindReady(); - - // Add the callback - readyList.add( fn ); - - return this; - }, - - eq: function( i ) { - i = +i; - return i === -1 ? - this.slice( i ) : - this.slice( i, i + 1 ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ), - "slice", slice.call(arguments).join(",") ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - // Either a released hold or an DOMready/load event and not yet ready - if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready, 1 ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.fireWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger( "ready" ).off( "ready" ); - } - } - }, - - bindReady: function() { - if ( readyList ) { - return; - } - - readyList = jQuery.Callbacks( "once memory" ); - - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - return setTimeout( jQuery.ready, 1 ); - } - - // Mozilla, Opera and webkit nightlies currently support this event - if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", jQuery.ready, false ); - - // If IE event model is used - } else if ( document.attachEvent ) { - // ensure firing before onload, - // maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", DOMContentLoaded ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", jQuery.ready ); - - // If IE and not a frame - // continually check to see if the document is ready - var toplevel = false; - - try { - toplevel = window.frameElement == null; - } catch(e) {} - - if ( document.documentElement.doScroll && toplevel ) { - doScrollCheck(); - } - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - isWindow: function( obj ) { - return obj != null && obj == obj.window; - }, - - isNumeric: function( obj ) { - return !isNaN( parseFloat(obj) ) && isFinite( obj ); - }, - - type: function( obj ) { - return obj == null ? - String( obj ) : - class2type[ toString.call(obj) ] || "object"; - }, - - isPlainObject: function( obj ) { - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - try { - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - - var key; - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - for ( var name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw new Error( msg ); - }, - - parseJSON: function( data ) { - if ( typeof data !== "string" || !data ) { - return null; - } - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); - - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - return window.JSON.parse( data ); - } - - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test( data.replace( rvalidescape, "@" ) - .replace( rvalidtokens, "]" ) - .replace( rvalidbraces, "")) ) { - - return ( new Function( "return " + data ) )(); - - } - jQuery.error( "Invalid JSON: " + data ); - }, - - // Cross-browser xml parsing - parseXML: function( data ) { - if ( typeof data !== "string" || !data ) { - return null; - } - var xml, tmp; - try { - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - } catch( e ) { - xml = undefined; - } - if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && rnotwhite.test( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); - }, - - // args is for internal usage only - each: function( object, callback, args ) { - var name, i = 0, - length = object.length, - isObj = length === undefined || jQuery.isFunction( object ); - - if ( args ) { - if ( isObj ) { - for ( name in object ) { - if ( callback.apply( object[ name ], args ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.apply( object[ i++ ], args ) === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isObj ) { - for ( name in object ) { - if ( callback.call( object[ name ], name, object[ name ] ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { - break; - } - } - } - } - - return object; - }, - - // Use native String.trim function wherever possible - trim: trim ? - function( text ) { - return text == null ? - "" : - trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); - }, - - // results is for internal usage only - makeArray: function( array, results ) { - var ret = results || []; - - if ( array != null ) { - // The window, strings (and functions) also have 'length' - // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 - var type = jQuery.type( array ); - - if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { - push.call( ret, array ); - } else { - jQuery.merge( ret, array ); - } - } - - return ret; - }, - - inArray: function( elem, array, i ) { - var len; - - if ( array ) { - if ( indexOf ) { - return indexOf.call( array, elem, i ); - } - - len = array.length; - i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; - - for ( ; i < len; i++ ) { - // Skip accessing in sparse arrays - if ( i in array && array[ i ] === elem ) { - return i; - } - } - } - - return -1; - }, - - merge: function( first, second ) { - var i = first.length, - j = 0; - - if ( typeof second.length === "number" ) { - for ( var l = second.length; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var ret = [], retVal; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( var i = 0, length = elems.length; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, key, ret = [], - i = 0, - length = elems.length, - // jquery objects are treated as arrays - isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( key in elems ) { - value = callback( elems[ key ], key, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return ret.concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - if ( typeof context === "string" ) { - var tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - var args = slice.call( arguments, 2 ), - proxy = function() { - return fn.apply( context, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; - - return proxy; - }, - - // Mutifunctional method to get and set values to a collection - // The value/s can optionally be executed if it's a function - access: function( elems, fn, key, value, chainable, emptyGet, pass ) { - var exec, - bulk = key == null, - i = 0, - length = elems.length; - - // Sets many values - if ( key && typeof key === "object" ) { - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); - } - chainable = 1; - - // Sets one value - } else if ( value !== undefined ) { - // Optionally, function values get executed if exec is true - exec = pass === undefined && jQuery.isFunction( value ); - - if ( bulk ) { - // Bulk operations only iterate when executing function values - if ( exec ) { - exec = fn; - fn = function( elem, key, value ) { - return exec.call( jQuery( elem ), value ); - }; - - // Otherwise they run against the entire set - } else { - fn.call( elems, value ); - fn = null; - } - } - - if ( fn ) { - for (; i < length; i++ ) { - fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); - } - } - - chainable = 1; - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - length ? fn( elems[0], key ) : emptyGet; - }, - - now: function() { - return ( new Date() ).getTime(); - }, - - // Use of jQuery.browser is frowned upon. - // More details: http://docs.jquery.com/Utilities/jQuery.browser - uaMatch: function( ua ) { - ua = ua.toLowerCase(); - - var match = rwebkit.exec( ua ) || - ropera.exec( ua ) || - rmsie.exec( ua ) || - ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || - []; - - return { browser: match[1] || "", version: match[2] || "0" }; - }, - - sub: function() { - function jQuerySub( selector, context ) { - return new jQuerySub.fn.init( selector, context ); - } - jQuery.extend( true, jQuerySub, this ); - jQuerySub.superclass = this; - jQuerySub.fn = jQuerySub.prototype = this(); - jQuerySub.fn.constructor = jQuerySub; - jQuerySub.sub = this.sub; - jQuerySub.fn.init = function init( selector, context ) { - if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { - context = jQuerySub( context ); - } - - return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); - }; - jQuerySub.fn.init.prototype = jQuerySub.fn; - var rootjQuerySub = jQuerySub(document); - return jQuerySub; - }, - - browser: {} -}); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -browserMatch = jQuery.uaMatch( userAgent ); -if ( browserMatch.browser ) { - jQuery.browser[ browserMatch.browser ] = true; - jQuery.browser.version = browserMatch.version; -} - -// Deprecated, use jQuery.browser.webkit instead -if ( jQuery.browser.webkit ) { - jQuery.browser.safari = true; -} - -// IE doesn't match non-breaking spaces with \s -if ( rnotwhite.test( "\xA0" ) ) { - trimLeft = /^[\s\xA0]+/; - trimRight = /[\s\xA0]+$/; -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); - -// Cleanup functions for the document ready method -if ( document.addEventListener ) { - DOMContentLoaded = function() { - document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - jQuery.ready(); - }; - -} else if ( document.attachEvent ) { - DOMContentLoaded = function() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", DOMContentLoaded ); - jQuery.ready(); - } - }; -} - -// The DOM ready check for Internet Explorer -function doScrollCheck() { - if ( jQuery.isReady ) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch(e) { - setTimeout( doScrollCheck, 1 ); - return; - } - - // and execute any waiting functions - jQuery.ready(); -} - -return jQuery; - -})(); - - -// String to Object flags format cache -var flagsCache = {}; - -// Convert String-formatted flags into Object-formatted ones and store in cache -function createFlags( flags ) { - var object = flagsCache[ flags ] = {}, - i, length; - flags = flags.split( /\s+/ ); - for ( i = 0, length = flags.length; i < length; i++ ) { - object[ flags[i] ] = true; - } - return object; -} - -/* - * Create a callback list using the following parameters: - * - * flags: an optional list of space-separated flags that will change how - * the callback list behaves - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible flags: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( flags ) { - - // Convert flags from String-formatted to Object-formatted - // (we check in cache first) - flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; - - var // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = [], - // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // Add one or several callbacks to the list - add = function( args ) { - var i, - length, - elem, - type, - actual; - for ( i = 0, length = args.length; i < length; i++ ) { - elem = args[ i ]; - type = jQuery.type( elem ); - if ( type === "array" ) { - // Inspect recursively - add( elem ); - } else if ( type === "function" ) { - // Add if not in unique mode and callback is not in - if ( !flags.unique || !self.has( elem ) ) { - list.push( elem ); - } - } - } - }, - // Fire callbacks - fire = function( context, args ) { - args = args || []; - memory = !flags.memory || [ context, args ]; - fired = true; - firing = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { - memory = true; // Mark as halted - break; - } - } - firing = false; - if ( list ) { - if ( !flags.once ) { - if ( stack && stack.length ) { - memory = stack.shift(); - self.fireWith( memory[ 0 ], memory[ 1 ] ); - } - } else if ( memory === true ) { - self.disable(); - } else { - list = []; - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - var length = list.length; - add( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away, unless previous - // firing was halted (stopOnFalse) - } else if ( memory && memory !== true ) { - firingStart = length; - fire( memory[ 0 ], memory[ 1 ] ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - var args = arguments, - argIndex = 0, - argLength = args.length; - for ( ; argIndex < argLength ; argIndex++ ) { - for ( var i = 0; i < list.length; i++ ) { - if ( args[ argIndex ] === list[ i ] ) { - // Handle firingIndex and firingLength - if ( firing ) { - if ( i <= firingLength ) { - firingLength--; - if ( i <= firingIndex ) { - firingIndex--; - } - } - } - // Remove the element - list.splice( i--, 1 ); - // If we have some unicity property then - // we only need to do this once - if ( flags.unique ) { - break; - } - } - } - } - } - return this; - }, - // Control if a given callback is in the list - has: function( fn ) { - if ( list ) { - var i = 0, - length = list.length; - for ( ; i < length; i++ ) { - if ( fn === list[ i ] ) { - return true; - } - } - } - return false; - }, - // Remove all callbacks from the list - empty: function() { - list = []; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory || memory === true ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( stack ) { - if ( firing ) { - if ( !flags.once ) { - stack.push( [ context, args ] ); - } - } else if ( !( flags.once && memory ) ) { - fire( context, args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - - - -var // Static reference to slice - sliceDeferred = [].slice; - -jQuery.extend({ - - Deferred: function( func ) { - var doneList = jQuery.Callbacks( "once memory" ), - failList = jQuery.Callbacks( "once memory" ), - progressList = jQuery.Callbacks( "memory" ), - state = "pending", - lists = { - resolve: doneList, - reject: failList, - notify: progressList - }, - promise = { - done: doneList.add, - fail: failList.add, - progress: progressList.add, - - state: function() { - return state; - }, - - // Deprecated - isResolved: doneList.fired, - isRejected: failList.fired, - - then: function( doneCallbacks, failCallbacks, progressCallbacks ) { - deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); - return this; - }, - always: function() { - deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); - return this; - }, - pipe: function( fnDone, fnFail, fnProgress ) { - return jQuery.Deferred(function( newDefer ) { - jQuery.each( { - done: [ fnDone, "resolve" ], - fail: [ fnFail, "reject" ], - progress: [ fnProgress, "notify" ] - }, function( handler, data ) { - var fn = data[ 0 ], - action = data[ 1 ], - returned; - if ( jQuery.isFunction( fn ) ) { - deferred[ handler ](function() { - returned = fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); - } else { - newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); - } - }); - } else { - deferred[ handler ]( newDefer[ action ] ); - } - }); - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - if ( obj == null ) { - obj = promise; - } else { - for ( var key in promise ) { - obj[ key ] = promise[ key ]; - } - } - return obj; - } - }, - deferred = promise.promise({}), - key; - - for ( key in lists ) { - deferred[ key ] = lists[ key ].fire; - deferred[ key + "With" ] = lists[ key ].fireWith; - } - - // Handle state - deferred.done( function() { - state = "resolved"; - }, failList.disable, progressList.lock ).fail( function() { - state = "rejected"; - }, doneList.disable, progressList.lock ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( firstParam ) { - var args = sliceDeferred.call( arguments, 0 ), - i = 0, - length = args.length, - pValues = new Array( length ), - count = length, - pCount = length, - deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? - firstParam : - jQuery.Deferred(), - promise = deferred.promise(); - function resolveFunc( i ) { - return function( value ) { - args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - if ( !( --count ) ) { - deferred.resolveWith( deferred, args ); - } - }; - } - function progressFunc( i ) { - return function( value ) { - pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - deferred.notifyWith( promise, pValues ); - }; - } - if ( length > 1 ) { - for ( ; i < length; i++ ) { - if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { - args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); - } else { - --count; - } - } - if ( !count ) { - deferred.resolveWith( deferred, args ); - } - } else if ( deferred !== firstParam ) { - deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); - } - return promise; - } -}); - - - - -jQuery.support = (function() { - - var support, - all, - a, - select, - opt, - input, - fragment, - tds, - events, - eventName, - i, - isSupported, - div = document.createElement( "div" ), - documentElement = document.documentElement; - - // Preliminary tests - div.setAttribute("className", "t"); - div.innerHTML = "
a"; - - all = div.getElementsByTagName( "*" ); - a = div.getElementsByTagName( "a" )[ 0 ]; - - // Can't get basic test support - if ( !all || !all.length || !a ) { - return {}; - } - - // First batch of supports tests - select = document.createElement( "select" ); - opt = select.appendChild( document.createElement("option") ); - input = div.getElementsByTagName( "input" )[ 0 ]; - - support = { - // IE strips leading whitespace when .innerHTML is used - leadingWhitespace: ( div.firstChild.nodeType === 3 ), - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - tbody: !div.getElementsByTagName("tbody").length, - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - htmlSerialize: !!div.getElementsByTagName("link").length, - - // Get the style information from getAttribute - // (IE uses .cssText instead) - style: /top/.test( a.getAttribute("style") ), - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - hrefNormalized: ( a.getAttribute("href") === "/a" ), - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - opacity: /^0.55/.test( a.style.opacity ), - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - cssFloat: !!a.style.cssFloat, - - // Make sure that if no value is specified for a checkbox - // that it defaults to "on". - // (WebKit defaults to "" instead) - checkOn: ( input.value === "on" ), - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - optSelected: opt.selected, - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - getSetAttribute: div.className !== "t", - - // Tests for enctype support on a form(#6743) - enctype: !!document.createElement("form").enctype, - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", - - // Will be defined later - submitBubbles: true, - changeBubbles: true, - focusinBubbles: false, - deleteExpando: true, - noCloneEvent: true, - inlineBlockNeedsLayout: false, - shrinkWrapBlocks: false, - reliableMarginRight: true, - pixelMargin: true - }; - - // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead - jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat"); - - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Test to see if it's possible to delete an expando from an element - // Fails in Internet Explorer - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - - if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { - div.attachEvent( "onclick", function() { - // Cloning a node shouldn't copy over any - // bound event handlers (IE does this) - support.noCloneEvent = false; - }); - div.cloneNode( true ).fireEvent( "onclick" ); - } - - // Check if a radio maintains its value - // after being appended to the DOM - input = document.createElement("input"); - input.value = "t"; - input.setAttribute("type", "radio"); - support.radioValue = input.value === "t"; - - input.setAttribute("checked", "checked"); - - // #11217 - WebKit loses check when the name is after the checked attribute - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - fragment = document.createDocumentFragment(); - fragment.appendChild( div.lastChild ); - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - fragment.removeChild( input ); - fragment.appendChild( div ); - - // Technique from Juriy Zaytsev - // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ - // We only care about the case where non-standard event systems - // are used, namely in IE. Short-circuiting here helps us to - // avoid an eval call (in setAttribute) which can cause CSP - // to go haywire. See: https://developer.mozilla.org/en/Security/CSP - if ( div.attachEvent ) { - for ( i in { - submit: 1, - change: 1, - focusin: 1 - }) { - eventName = "on" + i; - isSupported = ( eventName in div ); - if ( !isSupported ) { - div.setAttribute( eventName, "return;" ); - isSupported = ( typeof div[ eventName ] === "function" ); - } - support[ i + "Bubbles" ] = isSupported; - } - } - - fragment.removeChild( div ); - - // Null elements to avoid leaks in IE - fragment = select = opt = div = input = null; - - // Run tests that need a body at doc ready - jQuery(function() { - var container, outer, inner, table, td, offsetSupport, - marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight, - paddingMarginBorderVisibility, paddingMarginBorder, - body = document.getElementsByTagName("body")[0]; - - if ( !body ) { - // Return for frameset docs that don't have a body - return; - } - - conMarginTop = 1; - paddingMarginBorder = "padding:0;margin:0;border:"; - positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;"; - paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;"; - style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;"; - html = "
" + - "" + - "
"; - - container = document.createElement("div"); - container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; - body.insertBefore( container, body.firstChild ); - - // Construct the test element - div = document.createElement("div"); - container.appendChild( div ); - - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - // (only IE 8 fails this test) - div.innerHTML = "
t
"; - tds = div.getElementsByTagName( "td" ); - isSupported = ( tds[ 0 ].offsetHeight === 0 ); - - tds[ 0 ].style.display = ""; - tds[ 1 ].style.display = "none"; - - // Check if empty table cells still have offsetWidth/Height - // (IE <= 8 fail this test) - support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. For more - // info see bug #3333 - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - if ( window.getComputedStyle ) { - div.innerHTML = ""; - marginDiv = document.createElement( "div" ); - marginDiv.style.width = "0"; - marginDiv.style.marginRight = "0"; - div.style.width = "2px"; - div.appendChild( marginDiv ); - support.reliableMarginRight = - ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; - } - - if ( typeof div.style.zoom !== "undefined" ) { - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - // (IE < 8 does this) - div.innerHTML = ""; - div.style.width = div.style.padding = "1px"; - div.style.border = 0; - div.style.overflow = "hidden"; - div.style.display = "inline"; - div.style.zoom = 1; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); - - // Check if elements with layout shrink-wrap their children - // (IE 6 does this) - div.style.display = "block"; - div.style.overflow = "visible"; - div.innerHTML = "
"; - support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); - } - - div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility; - div.innerHTML = html; - - outer = div.firstChild; - inner = outer.firstChild; - td = outer.nextSibling.firstChild.firstChild; - - offsetSupport = { - doesNotAddBorder: ( inner.offsetTop !== 5 ), - doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) - }; - - inner.style.position = "fixed"; - inner.style.top = "20px"; - - // safari subtracts parent border width here which is 5px - offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); - inner.style.position = inner.style.top = ""; - - outer.style.overflow = "hidden"; - outer.style.position = "relative"; - - offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); - offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); - - if ( window.getComputedStyle ) { - div.style.marginTop = "1%"; - support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%"; - } - - if ( typeof container.style.zoom !== "undefined" ) { - container.style.zoom = 1; - } - - body.removeChild( container ); - marginDiv = div = container = null; - - jQuery.extend( support, offsetSupport ); - }); - - return support; -})(); - - - - -var rbrace = /^(?:\{.*\}|\[.*\])$/, - rmultiDash = /([A-Z])/g; - -jQuery.extend({ - cache: {}, - - // Please use with caution - uuid: 0, - - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", - "applet": true - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var privateCache, thisCache, ret, - internalKey = jQuery.expando, - getByName = typeof name === "string", - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, - isEvents = name === "events"; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - elem[ internalKey ] = id = ++jQuery.uuid; - } else { - id = internalKey; - } - } - - if ( !cache[ id ] ) { - cache[ id ] = {}; - - // Avoids exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ] = jQuery.extend( cache[ id ], name ); - } else { - cache[ id ].data = jQuery.extend( cache[ id ].data, name ); - } - } - - privateCache = thisCache = cache[ id ]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if ( !pvt ) { - if ( !thisCache.data ) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // Users should not attempt to inspect the internal events object using jQuery.data, - // it is undocumented and subject to change. But does anyone listen? No. - if ( isEvents && !thisCache[ name ] ) { - return privateCache.events; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( getByName ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; - }, - - removeData: function( elem, name, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, i, l, - - // Reference to internal data cache key - internalKey = jQuery.expando, - - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - - // See jQuery.data for more information - id = isNode ? elem[ internalKey ] : internalKey; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ] : cache[ id ].data; - - if ( thisCache ) { - - // Support array or space separated string names for data keys - if ( !jQuery.isArray( name ) ) { - - // try the string as a key before any manipulation - if ( name in thisCache ) { - name = [ name ]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase( name ); - if ( name in thisCache ) { - name = [ name ]; - } else { - name = name.split( " " ); - } - } - } - - for ( i = 0, l = name.length; i < l; i++ ) { - delete thisCache[ name[i] ]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( !pvt ) { - delete cache[ id ].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject(cache[ id ]) ) { - return; - } - } - - // Browsers that fail expando deletion also refuse to delete expandos on - // the window, but it will allow it on all other JS objects; other browsers - // don't care - // Ensure that `cache` is not a window object #10080 - if ( jQuery.support.deleteExpando || !cache.setInterval ) { - delete cache[ id ]; - } else { - cache[ id ] = null; - } - - // We destroyed the cache and need to eliminate the expando on the node to avoid - // false lookups in the cache for entries that no longer exist - if ( isNode ) { - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( jQuery.support.deleteExpando ) { - delete elem[ internalKey ]; - } else if ( elem.removeAttribute ) { - elem.removeAttribute( internalKey ); - } else { - elem[ internalKey ] = null; - } - } - }, - - // For internal use only. - _data: function( elem, name, data ) { - return jQuery.data( elem, name, data, true ); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - if ( elem.nodeName ) { - var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; - - if ( match ) { - return !(match === true || elem.getAttribute("classid") !== match); - } - } - - return true; - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var parts, part, attr, name, l, - elem = this[0], - i = 0, - data = null; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = jQuery.data( elem ); - - if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { - attr = elem.attributes; - for ( l = attr.length; i < l; i++ ) { - name = attr[i].name; - - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.substring(5) ); - - dataAttr( elem, name, data[ name ] ); - } - } - jQuery._data( elem, "parsedAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - parts = key.split( ".", 2 ); - parts[1] = parts[1] ? "." + parts[1] : ""; - part = parts[1] + "!"; - - return jQuery.access( this, function( value ) { - - if ( value === undefined ) { - data = this.triggerHandler( "getData" + part, [ parts[0] ] ); - - // Try to fetch any internally stored data first - if ( data === undefined && elem ) { - data = jQuery.data( elem, key ); - data = dataAttr( elem, key, data ); - } - - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; - } - - parts[1] = value; - this.each(function() { - var self = jQuery( this ); - - self.triggerHandler( "setData" + part, parts ); - jQuery.data( this, key, value ); - self.triggerHandler( "changeData" + part, parts ); - }); - }, null, value, arguments.length > 1, null, false ); - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - jQuery.isNumeric( data ) ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// checks a cache object for emptiness -function isEmptyDataObject( obj ) { - for ( var name in obj ) { - - // if the public data object is empty, the private is still empty - if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { - continue; - } - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} - - - - -function handleQueueMarkDefer( elem, type, src ) { - var deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - defer = jQuery._data( elem, deferDataKey ); - if ( defer && - ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && - ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { - // Give room for hard-coded callbacks to fire first - // and eventually mark/queue something else on the element - setTimeout( function() { - if ( !jQuery._data( elem, queueDataKey ) && - !jQuery._data( elem, markDataKey ) ) { - jQuery.removeData( elem, deferDataKey, true ); - defer.fire(); - } - }, 0 ); - } -} - -jQuery.extend({ - - _mark: function( elem, type ) { - if ( elem ) { - type = ( type || "fx" ) + "mark"; - jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); - } - }, - - _unmark: function( force, elem, type ) { - if ( force !== true ) { - type = elem; - elem = force; - force = false; - } - if ( elem ) { - type = type || "fx"; - var key = type + "mark", - count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); - if ( count ) { - jQuery._data( elem, key, count ); - } else { - jQuery.removeData( elem, key, true ); - handleQueueMarkDefer( elem, type, "mark" ); - } - } - }, - - queue: function( elem, type, data ) { - var q; - if ( elem ) { - type = ( type || "fx" ) + "queue"; - q = jQuery._data( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !q || jQuery.isArray(data) ) { - q = jQuery._data( elem, type, jQuery.makeArray(data) ); - } else { - q.push( data ); - } - } - return q || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - fn = queue.shift(), - hooks = {}; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - } - - if ( fn ) { - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - jQuery._data( elem, type + ".run", hooks ); - fn.call( elem, function() { - jQuery.dequeue( elem, type ); - }, hooks ); - } - - if ( !queue.length ) { - jQuery.removeData( elem, type + "queue " + type + ".run", true ); - handleQueueMarkDefer( elem, type, "queue" ); - } - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = setTimeout( next, time ); - hooks.stop = function() { - clearTimeout( timeout ); - }; - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, object ) { - if ( typeof type !== "string" ) { - object = type; - type = undefined; - } - type = type || "fx"; - var defer = jQuery.Deferred(), - elements = this, - i = elements.length, - count = 1, - deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - tmp; - function resolve() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - } - while( i-- ) { - if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || - ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || - jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && - jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { - count++; - tmp.add( resolve ); - } - } - resolve(); - return defer.promise( object ); - } -}); - - - - -var rclass = /[\n\t\r]/g, - rspace = /\s+/, - rreturn = /\r/g, - rtype = /^(?:button|input)$/i, - rfocusable = /^(?:button|input|object|select|textarea)$/i, - rclickable = /^a(?:rea)?$/i, - rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, - getSetAttribute = jQuery.support.getSetAttribute, - nodeHook, boolHook, fixSpecified; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each(function() { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch( e ) {} - }); - }, - - addClass: function( value ) { - var classNames, i, l, elem, - setClass, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call(this, j, this.className) ); - }); - } - - if ( value && typeof value === "string" ) { - classNames = value.split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 ) { - if ( !elem.className && classNames.length === 1 ) { - elem.className = value; - - } else { - setClass = " " + elem.className + " "; - - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { - setClass += classNames[ c ] + " "; - } - } - elem.className = jQuery.trim( setClass ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classNames, i, l, elem, className, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call(this, j, this.className) ); - }); - } - - if ( (value && typeof value === "string") || value === undefined ) { - classNames = ( value || "" ).split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 && elem.className ) { - if ( value ) { - className = (" " + elem.className + " ").replace( rclass, " " ); - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - className = className.replace(" " + classNames[ c ] + " ", " "); - } - elem.className = jQuery.trim( className ); - - } else { - elem.className = ""; - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isBool = typeof stateVal === "boolean"; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - state = stateVal, - classNames = value.split( rspace ); - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space seperated list - state = isBool ? state : !self.hasClass( className ); - self[ state ? "addClass" : "removeClass" ]( className ); - } - - } else if ( type === "undefined" || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); - } - - // toggle whole className - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " ", - i = 0, - l = this.length; - for ( ; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var hooks, ret, isFunction, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var self = jQuery(this), val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, self.val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - }, - select: { - get: function( elem ) { - var value, i, max, option, - index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type === "select-one"; - - // Nothing was selected - if ( index < 0 ) { - return null; - } - - // Loop through all the selected options - i = one ? index : 0; - max = one ? index + 1 : options.length; - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Don't return options that are disabled or in a disabled optgroup - if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && - (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - // Fixes Bug #2551 -- select.val() broken in IE after form.reset() - if ( one && !values.length && options.length ) { - return jQuery( options[ index ] ).val(); - } - - return values; - }, - - set: function( elem, value ) { - var values = jQuery.makeArray( value ); - - jQuery(elem).find("option").each(function() { - this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; - }); - - if ( !values.length ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attrFn: { - val: true, - css: true, - html: true, - text: true, - data: true, - width: true, - height: true, - offset: true - }, - - attr: function( elem, name, value, pass ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( pass && name in jQuery.attrFn ) { - return jQuery( elem )[ name ]( value ); - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( notxml ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - - } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, "" + value ); - return value; - } - - } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - - ret = elem.getAttribute( name ); - - // Non-existent attributes return null, we normalize to undefined - return ret === null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, value ) { - var propName, attrNames, name, l, isBool, - i = 0; - - if ( value && elem.nodeType === 1 ) { - attrNames = value.toLowerCase().split( rspace ); - l = attrNames.length; - - for ( ; i < l; i++ ) { - name = attrNames[ i ]; - - if ( name ) { - propName = jQuery.propFix[ name ] || name; - isBool = rboolean.test( name ); - - // See #9699 for explanation of this approach (setting first, then removal) - // Do not do this for boolean attributes (see #10870) - if ( !isBool ) { - jQuery.attr( elem, name, "" ); - } - elem.removeAttribute( getSetAttribute ? name : propName ); - - // Set corresponding property to false for boolean attributes - if ( isBool && propName in elem ) { - elem[ propName ] = false; - } - } - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - // We can't allow the type property to be changed (since it causes problems in IE) - if ( rtype.test( elem.nodeName ) && elem.parentNode ) { - jQuery.error( "type property can't be changed" ); - } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to it's default in case type is set after value - // This is for element creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - }, - // Use the value property for back compat - // Use the nodeHook for button elements in IE6/7 (#1954) - value: { - get: function( elem, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.get( elem, name ); - } - return name in elem ? - elem.value : - null; - }, - set: function( elem, value, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.set( elem, value, name ); - } - // Does not return so that setAttribute is also used - elem.value = value; - } - } - }, - - propFix: { - tabindex: "tabIndex", - readonly: "readOnly", - "for": "htmlFor", - "class": "className", - maxlength: "maxLength", - cellspacing: "cellSpacing", - cellpadding: "cellPadding", - rowspan: "rowSpan", - colspan: "colSpan", - usemap: "useMap", - frameborder: "frameBorder", - contenteditable: "contentEditable" - }, - - prop: function( elem, name, value ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - return ( elem[ name ] = value ); - } - - } else { - if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - return elem[ name ]; - } - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - var attributeNode = elem.getAttributeNode("tabindex"); - - return attributeNode && attributeNode.specified ? - parseInt( attributeNode.value, 10 ) : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - undefined; - } - } - } -}); - -// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) -jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; - -// Hook for boolean attributes -boolHook = { - get: function( elem, name ) { - // Align boolean attributes with corresponding properties - // Fall back to attribute presence where some booleans are not supported - var attrNode, - property = jQuery.prop( elem, name ); - return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? - name.toLowerCase() : - undefined; - }, - set: function( elem, value, name ) { - var propName; - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - // value is true since we know at this point it's type boolean and not false - // Set boolean attributes to the same name and set the DOM property - propName = jQuery.propFix[ name ] || name; - if ( propName in elem ) { - // Only set the IDL specifically if it already exists on the element - elem[ propName ] = true; - } - - elem.setAttribute( name, name.toLowerCase() ); - } - return name; - } -}; - -// IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !getSetAttribute ) { - - fixSpecified = { - name: true, - id: true, - coords: true - }; - - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = jQuery.valHooks.button = { - get: function( elem, name ) { - var ret; - ret = elem.getAttributeNode( name ); - return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? - ret.nodeValue : - undefined; - }, - set: function( elem, value, name ) { - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode( name ); - if ( !ret ) { - ret = document.createAttribute( name ); - elem.setAttributeNode( ret ); - } - return ( ret.nodeValue = value + "" ); - } - }; - - // Apply the nodeHook to tabindex - jQuery.attrHooks.tabindex.set = nodeHook.set; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each([ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; - } - } - }); - }); - - // Set contenteditable to false on removals(#10429) - // Setting to empty string throws an error as an invalid value - jQuery.attrHooks.contenteditable = { - get: nodeHook.get, - set: function( elem, value, name ) { - if ( value === "" ) { - value = "false"; - } - nodeHook.set( elem, value, name ); - } - }; -} - - -// Some attributes require a special call on IE -if ( !jQuery.support.hrefNormalized ) { - jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - get: function( elem ) { - var ret = elem.getAttribute( name, 2 ); - return ret === null ? undefined : ret; - } - }); - }); -} - -if ( !jQuery.support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - // Return undefined in the case of empty string - // Normalize to lowercase since IE uppercases css property names - return elem.style.cssText.toLowerCase() || undefined; - }, - set: function( elem, value ) { - return ( elem.style.cssText = "" + value ); - } - }; -} - -// Safari mis-reports the default selected property of an option -// Accessing the parent's selectedIndex property fixes it -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { - get: function( elem ) { - var parent = elem.parentNode; - - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - return null; - } - }); -} - -// IE6/7 call enctype encoding -if ( !jQuery.support.enctype ) { - jQuery.propFix.enctype = "encoding"; -} - -// Radios and checkboxes getter/setter -if ( !jQuery.support.checkOn ) { - jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - get: function( elem ) { - // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - } - }; - }); -} -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); - } - } - }); -}); - - - - -var rformElems = /^(?:textarea|input|select)$/i, - rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, - rhoverHack = /(?:^|\s)hover(\.\S+)?\b/, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, - quickParse = function( selector ) { - var quick = rquickIs.exec( selector ); - if ( quick ) { - // 0 1 2 3 - // [ _, tag, id, class ] - quick[1] = ( quick[1] || "" ).toLowerCase(); - quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); - } - return quick; - }, - quickIs = function( elem, m ) { - var attrs = elem.attributes || {}; - return ( - (!m[1] || elem.nodeName.toLowerCase() === m[1]) && - (!m[2] || (attrs.id || {}).value === m[2]) && - (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) - ); - }, - hoverHack = function( events ) { - return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); - }; - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - add: function( elem, types, handler, data, selector ) { - - var elemData, eventHandle, events, - t, tns, type, namespaces, handleObj, - handleObjIn, quick, handlers, special; - - // Don't attach events to noData or text/comment nodes (allow plain objects tho) - if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - events = elemData.events; - if ( !events ) { - elemData.events = events = {}; - } - eventHandle = elemData.handle; - if ( !eventHandle ) { - elemData.handle = eventHandle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - // jQuery(...).bind("mouseover mouseout", fn); - types = jQuery.trim( hoverHack(types) ).split( " " ); - for ( t = 0; t < types.length; t++ ) { - - tns = rtypenamespace.exec( types[t] ) || []; - type = tns[1]; - namespaces = ( tns[2] || "" ).split( "." ).sort(); - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: tns[1], - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - quick: selector && quickParse( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - handlers = events[ type ]; - if ( !handlers ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener/attachEvent if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - global: {}, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), - t, tns, type, origType, namespaces, origCount, - j, events, special, handle, eventType, handleObj; - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = jQuery.trim( hoverHack( types || "" ) ).split(" "); - for ( t = 0; t < types.length; t++ ) { - tns = rtypenamespace.exec( types[t] ) || []; - type = origType = tns[1]; - namespaces = tns[2]; - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector? special.delegateType : special.bindType ) || type; - eventType = events[ type ] || []; - origCount = eventType.length; - namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; - - // Remove matching events - for ( j = 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !namespaces || namespaces.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - eventType.splice( j--, 1 ); - - if ( handleObj.selector ) { - eventType.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( eventType.length === 0 && origCount !== eventType.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - handle = elemData.handle; - if ( handle ) { - handle.elem = null; - } - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery.removeData( elem, [ "events", "handle" ], true ); - } - }, - - // Events that are safe to short-circuit if no handlers are attached. - // Native DOM events should not be added, they may have inline handlers. - customEvent: { - "getData": true, - "setData": true, - "changeData": true - }, - - trigger: function( event, data, elem, onlyHandlers ) { - // Don't do events on text and comment nodes - if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { - return; - } - - // Event object or event type - var type = event.type || event, - namespaces = [], - cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "!" ) >= 0 ) { - // Exclusive events trigger only for the exact event (no namespaces) - type = type.slice(0, -1); - exclusive = true; - } - - if ( type.indexOf( "." ) >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - - if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { - // No jQuery handlers for this event type, and it can't have inline handlers - return; - } - - // Caller can pass in an Event, Object, or just an event type string - event = typeof event === "object" ? - // jQuery.Event object - event[ jQuery.expando ] ? event : - // Object literal - new jQuery.Event( type, event ) : - // Just the event type (string) - new jQuery.Event( type ); - - event.type = type; - event.isTrigger = true; - event.exclusive = exclusive; - event.namespace = namespaces.join( "." ); - event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; - ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; - - // Handle a global trigger - if ( !elem ) { - - // TODO: Stop taunting the data cache; remove global events and always attach to document - cache = jQuery.cache; - for ( i in cache ) { - if ( cache[ i ].events && cache[ i ].events[ type ] ) { - jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); - } - } - return; - } - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data != null ? jQuery.makeArray( data ) : []; - data.unshift( event ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - eventPath = [[ elem, special.bindType || type ]]; - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; - old = null; - for ( ; cur; cur = cur.parentNode ) { - eventPath.push([ cur, bubbleType ]); - old = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( old && old === elem.ownerDocument ) { - eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); - } - } - - // Fire handlers on the event path - for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { - - cur = eventPath[i][0]; - event.type = eventPath[i][1]; - - handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - // Note that this is a bare JS function and not a jQuery handler - handle = ontype && cur[ ontype ]; - if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { - event.preventDefault(); - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && - !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - // IE<9 dies on focus/blur to hidden element (#1486) - if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - old = elem[ ontype ]; - - if ( old ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( old ) { - elem[ ontype ] = old; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event || window.event ); - - var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), - delegateCount = handlers.delegateCount, - args = [].slice.call( arguments, 0 ), - run_all = !event.exclusive && !event.namespace, - special = jQuery.event.special[ event.type ] || {}, - handlerQueue = [], - i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers that should run if there are delegated events - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && !(event.button && event.type === "click") ) { - - // Pregenerate a single jQuery object for reuse with .is() - jqcur = jQuery(this); - jqcur.context = this.ownerDocument || this; - - for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { - - // Don't process events on disabled elements (#6911, #8165) - if ( cur.disabled !== true ) { - selMatch = {}; - matches = []; - jqcur[0] = cur; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - sel = handleObj.selector; - - if ( selMatch[ sel ] === undefined ) { - selMatch[ sel ] = ( - handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) - ); - } - if ( selMatch[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, matches: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( handlers.length > delegateCount ) { - handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); - } - - // Run delegates first; they may want to stop propagation beneath us - for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { - matched = handlerQueue[ i ]; - event.currentTarget = matched.elem; - - for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { - handleObj = matched.matches[ j ]; - - // Triggered event must either 1) be non-exclusive and have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { - - event.data = handleObj.data; - event.handleObj = handleObj; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - event.result = ret; - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** - props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button, - fromElement = original.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && fromElement ) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, - originalEvent = event, - fixHook = jQuery.event.fixHooks[ event.type ] || {}, - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = jQuery.Event( originalEvent ); - - for ( i = copy.length; i; ) { - prop = copy[ --i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) - if ( !event.target ) { - event.target = originalEvent.srcElement || document; - } - - // Target should not be a text node (#504, Safari) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) - if ( event.metaKey === undefined ) { - event.metaKey = event.ctrlKey; - } - - return fixHook.filter? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - ready: { - // Make sure the ready event is setup - setup: jQuery.bindReady - }, - - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - - focus: { - delegateType: "focusin" - }, - blur: { - delegateType: "focusout" - }, - - beforeunload: { - setup: function( data, namespaces, eventHandle ) { - // We only want to do this special case on windows - if ( jQuery.isWindow( this ) ) { - this.onbeforeunload = eventHandle; - } - }, - - teardown: function( namespaces, eventHandle ) { - if ( this.onbeforeunload === eventHandle ) { - this.onbeforeunload = null; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -// Some plugins are using, but it's undocumented/deprecated and will be removed. -// The 1.7 special event interface should provide all the hooks needed now. -jQuery.event.handle = jQuery.event.dispatch; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - if ( elem.detachEvent ) { - elem.detachEvent( "on" + type, handle ); - } - }; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -function returnFalse() { - return false; -} -function returnTrue() { - return true; -} - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - preventDefault: function() { - this.isDefaultPrevented = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - - // if preventDefault exists run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // otherwise set the returnValue property of the original event to false (IE) - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - this.isPropagationStopped = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - // if stopPropagation exists run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - // otherwise set the cancelBubble property of the original event to true (IE) - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - }, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var target = this, - related = event.relatedTarget, - handleObj = event.handleObj, - selector = handleObj.selector, - ret; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// IE submit delegation -if ( !jQuery.support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add( this, "click._submit keypress._submit", function( e ) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; - if ( form && !form._submit_attached ) { - jQuery.event.add( form, "submit._submit", function( event ) { - event._submit_bubble = true; - }); - form._submit_attached = true; - } - }); - // return undefined since we don't need an event listener - }, - - postDispatch: function( event ) { - // If form was submitted by the user, bubble the event up the tree - if ( event._submit_bubble ) { - delete event._submit_bubble; - if ( this.parentNode && !event.isTrigger ) { - jQuery.event.simulate( "submit", this.parentNode, event, true ); - } - } - }, - - teardown: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove( this, "._submit" ); - } - }; -} - -// IE change delegation and checkbox/radio fix -if ( !jQuery.support.changeBubbles ) { - - jQuery.event.special.change = { - - setup: function() { - - if ( rformElems.test( this.nodeName ) ) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if ( this.type === "checkbox" || this.type === "radio" ) { - jQuery.event.add( this, "propertychange._change", function( event ) { - if ( event.originalEvent.propertyName === "checked" ) { - this._just_changed = true; - } - }); - jQuery.event.add( this, "click._change", function( event ) { - if ( this._just_changed && !event.isTrigger ) { - this._just_changed = false; - jQuery.event.simulate( "change", this, event, true ); - } - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add( this, "beforeactivate._change", function( e ) { - var elem = e.target; - - if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { - jQuery.event.add( elem, "change._change", function( event ) { - if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { - jQuery.event.simulate( "change", this.parentNode, event, true ); - } - }); - elem._change_attached = true; - } - }); - }, - - handle: function( event ) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { - return event.handleObj.handler.apply( this, arguments ); - } - }, - - teardown: function() { - jQuery.event.remove( this, "._change" ); - - return rformElems.test( this.nodeName ); - } - }; -} - -// Create "bubbling" focus and blur events -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0, - handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { // && selector != null - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - var handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( var type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - bind: function( types, data, fn ) { - return this.on( types, null, data, fn ); - }, - unbind: function( types, fn ) { - return this.off( types, null, fn ); - }, - - live: function( types, data, fn ) { - jQuery( this.context ).on( types, this.selector, data, fn ); - return this; - }, - die: function( types, fn ) { - jQuery( this.context ).off( types, this.selector || "**", fn ); - return this; - }, - - delegate: function( selector, types, data, fn ) { - return this.on( types, selector, data, fn ); - }, - undelegate: function( selector, types, fn ) { - // ( namespace ) or ( selector, types [, fn] ) - return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - if ( this[0] ) { - return jQuery.event.trigger( type, data, this[0], true ); - } - }, - - toggle: function( fn ) { - // Save reference to arguments for access in closure - var args = arguments, - guid = fn.guid || jQuery.guid++, - i = 0, - toggler = function( event ) { - // Figure out which function to execute - var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; - jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); - - // Make sure that clicks stop - event.preventDefault(); - - // and execute the function - return args[ lastToggle ].apply( this, arguments ) || false; - }; - - // link all the functions, so any of them can unbind this click handler - toggler.guid = guid; - while ( i < args.length ) { - args[ i++ ].guid = guid; - } - - return this.click( toggler ); - }, - - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -}); - -jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - if ( fn == null ) { - fn = data; - data = null; - } - - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; - - if ( jQuery.attrFn ) { - jQuery.attrFn[ name ] = true; - } - - if ( rkeyEvent.test( name ) ) { - jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; - } - - if ( rmouseEvent.test( name ) ) { - jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; - } -}); - - - -/*! - * Sizzle CSS Selector Engine - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){ - -var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, - expando = "sizcache" + (Math.random() + '').replace('.', ''), - done = 0, - toString = Object.prototype.toString, - hasDuplicate = false, - baseHasDuplicate = true, - rBackslash = /\\/g, - rReturn = /\r\n/g, - rNonWord = /\W/; - -// Here we check if the JavaScript engine is using some sort of -// optimization where it does not always call our comparision -// function. If that is the case, discard the hasDuplicate value. -// Thus far that includes Google Chrome. -[0, 0].sort(function() { - baseHasDuplicate = false; - return 0; -}); - -var Sizzle = function( selector, context, results, seed ) { - results = results || []; - context = context || document; - - var origContext = context; - - if ( context.nodeType !== 1 && context.nodeType !== 9 ) { - return []; - } - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - var m, set, checkSet, extra, ret, cur, pop, i, - prune = true, - contextXML = Sizzle.isXML( context ), - parts = [], - soFar = selector; - - // Reset the position of the chunker regexp (start from head) - do { - chunker.exec( "" ); - m = chunker.exec( soFar ); - - if ( m ) { - soFar = m[3]; - - parts.push( m[1] ); - - if ( m[2] ) { - extra = m[3]; - break; - } - } - } while ( m ); - - if ( parts.length > 1 && origPOS.exec( selector ) ) { - - if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { - set = posProcess( parts[0] + parts[1], context, seed ); - - } else { - set = Expr.relative[ parts[0] ] ? - [ context ] : - Sizzle( parts.shift(), context ); - - while ( parts.length ) { - selector = parts.shift(); - - if ( Expr.relative[ selector ] ) { - selector += parts.shift(); - } - - set = posProcess( selector, set, seed ); - } - } - - } else { - // Take a shortcut and set the context if the root selector is an ID - // (but not if it'll be faster if the inner selector is an ID) - if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && - Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { - - ret = Sizzle.find( parts.shift(), context, contextXML ); - context = ret.expr ? - Sizzle.filter( ret.expr, ret.set )[0] : - ret.set[0]; - } - - if ( context ) { - ret = seed ? - { expr: parts.pop(), set: makeArray(seed) } : - Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); - - set = ret.expr ? - Sizzle.filter( ret.expr, ret.set ) : - ret.set; - - if ( parts.length > 0 ) { - checkSet = makeArray( set ); - - } else { - prune = false; - } - - while ( parts.length ) { - cur = parts.pop(); - pop = cur; - - if ( !Expr.relative[ cur ] ) { - cur = ""; - } else { - pop = parts.pop(); - } - - if ( pop == null ) { - pop = context; - } - - Expr.relative[ cur ]( checkSet, pop, contextXML ); - } - - } else { - checkSet = parts = []; - } - } - - if ( !checkSet ) { - checkSet = set; - } - - if ( !checkSet ) { - Sizzle.error( cur || selector ); - } - - if ( toString.call(checkSet) === "[object Array]" ) { - if ( !prune ) { - results.push.apply( results, checkSet ); - - } else if ( context && context.nodeType === 1 ) { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { - results.push( set[i] ); - } - } - - } else { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && checkSet[i].nodeType === 1 ) { - results.push( set[i] ); - } - } - } - - } else { - makeArray( checkSet, results ); - } - - if ( extra ) { - Sizzle( extra, origContext, results, seed ); - Sizzle.uniqueSort( results ); - } - - return results; -}; - -Sizzle.uniqueSort = function( results ) { - if ( sortOrder ) { - hasDuplicate = baseHasDuplicate; - results.sort( sortOrder ); - - if ( hasDuplicate ) { - for ( var i = 1; i < results.length; i++ ) { - if ( results[i] === results[ i - 1 ] ) { - results.splice( i--, 1 ); - } - } - } - } - - return results; -}; - -Sizzle.matches = function( expr, set ) { - return Sizzle( expr, null, null, set ); -}; - -Sizzle.matchesSelector = function( node, expr ) { - return Sizzle( expr, null, null, [node] ).length > 0; -}; - -Sizzle.find = function( expr, context, isXML ) { - var set, i, len, match, type, left; - - if ( !expr ) { - return []; - } - - for ( i = 0, len = Expr.order.length; i < len; i++ ) { - type = Expr.order[i]; - - if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { - left = match[1]; - match.splice( 1, 1 ); - - if ( left.substr( left.length - 1 ) !== "\\" ) { - match[1] = (match[1] || "").replace( rBackslash, "" ); - set = Expr.find[ type ]( match, context, isXML ); - - if ( set != null ) { - expr = expr.replace( Expr.match[ type ], "" ); - break; - } - } - } - } - - if ( !set ) { - set = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( "*" ) : - []; - } - - return { set: set, expr: expr }; -}; - -Sizzle.filter = function( expr, set, inplace, not ) { - var match, anyFound, - type, found, item, filter, left, - i, pass, - old = expr, - result = [], - curLoop = set, - isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); - - while ( expr && set.length ) { - for ( type in Expr.filter ) { - if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { - filter = Expr.filter[ type ]; - left = match[1]; - - anyFound = false; - - match.splice(1,1); - - if ( left.substr( left.length - 1 ) === "\\" ) { - continue; - } - - if ( curLoop === result ) { - result = []; - } - - if ( Expr.preFilter[ type ] ) { - match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); - - if ( !match ) { - anyFound = found = true; - - } else if ( match === true ) { - continue; - } - } - - if ( match ) { - for ( i = 0; (item = curLoop[i]) != null; i++ ) { - if ( item ) { - found = filter( item, match, i, curLoop ); - pass = not ^ found; - - if ( inplace && found != null ) { - if ( pass ) { - anyFound = true; - - } else { - curLoop[i] = false; - } - - } else if ( pass ) { - result.push( item ); - anyFound = true; - } - } - } - } - - if ( found !== undefined ) { - if ( !inplace ) { - curLoop = result; - } - - expr = expr.replace( Expr.match[ type ], "" ); - - if ( !anyFound ) { - return []; - } - - break; - } - } - } - - // Improper expression - if ( expr === old ) { - if ( anyFound == null ) { - Sizzle.error( expr ); - - } else { - break; - } - } - - old = expr; - } - - return curLoop; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Utility function for retreiving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -var getText = Sizzle.getText = function( elem ) { - var i, node, - nodeType = elem.nodeType, - ret = ""; - - if ( nodeType ) { - if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent || innerText for elements - if ( typeof elem.textContent === 'string' ) { - return elem.textContent; - } else if ( typeof elem.innerText === 'string' ) { - // Replace IE's carriage returns - return elem.innerText.replace( rReturn, '' ); - } else { - // Traverse it's children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - } else { - - // If no nodeType, this is expected to be an array - for ( i = 0; (node = elem[i]); i++ ) { - // Do not traverse comment nodes - if ( node.nodeType !== 8 ) { - ret += getText( node ); - } - } - } - return ret; -}; - -var Expr = Sizzle.selectors = { - order: [ "ID", "NAME", "TAG" ], - - match: { - ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, - ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, - TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, - POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, - PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ - }, - - leftMatch: {}, - - attrMap: { - "class": "className", - "for": "htmlFor" - }, - - attrHandle: { - href: function( elem ) { - return elem.getAttribute( "href" ); - }, - type: function( elem ) { - return elem.getAttribute( "type" ); - } - }, - - relative: { - "+": function(checkSet, part){ - var isPartStr = typeof part === "string", - isTag = isPartStr && !rNonWord.test( part ), - isPartStrNotTag = isPartStr && !isTag; - - if ( isTag ) { - part = part.toLowerCase(); - } - - for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { - if ( (elem = checkSet[i]) ) { - while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} - - checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? - elem || false : - elem === part; - } - } - - if ( isPartStrNotTag ) { - Sizzle.filter( part, checkSet, true ); - } - }, - - ">": function( checkSet, part ) { - var elem, - isPartStr = typeof part === "string", - i = 0, - l = checkSet.length; - - if ( isPartStr && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - var parent = elem.parentNode; - checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; - } - } - - } else { - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - checkSet[i] = isPartStr ? - elem.parentNode : - elem.parentNode === part; - } - } - - if ( isPartStr ) { - Sizzle.filter( part, checkSet, true ); - } - } - }, - - "": function(checkSet, part, isXML){ - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); - }, - - "~": function( checkSet, part, isXML ) { - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); - } - }, - - find: { - ID: function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }, - - NAME: function( match, context ) { - if ( typeof context.getElementsByName !== "undefined" ) { - var ret = [], - results = context.getElementsByName( match[1] ); - - for ( var i = 0, l = results.length; i < l; i++ ) { - if ( results[i].getAttribute("name") === match[1] ) { - ret.push( results[i] ); - } - } - - return ret.length === 0 ? null : ret; - } - }, - - TAG: function( match, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( match[1] ); - } - } - }, - preFilter: { - CLASS: function( match, curLoop, inplace, result, not, isXML ) { - match = " " + match[1].replace( rBackslash, "" ) + " "; - - if ( isXML ) { - return match; - } - - for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { - if ( elem ) { - if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { - if ( !inplace ) { - result.push( elem ); - } - - } else if ( inplace ) { - curLoop[i] = false; - } - } - } - - return false; - }, - - ID: function( match ) { - return match[1].replace( rBackslash, "" ); - }, - - TAG: function( match, curLoop ) { - return match[1].replace( rBackslash, "" ).toLowerCase(); - }, - - CHILD: function( match ) { - if ( match[1] === "nth" ) { - if ( !match[2] ) { - Sizzle.error( match[0] ); - } - - match[2] = match[2].replace(/^\+|\s*/g, ''); - - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( - match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || - !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); - - // calculate the numbers (first)n+(last) including if they are negative - match[2] = (test[1] + (test[2] || 1)) - 0; - match[3] = test[3] - 0; - } - else if ( match[2] ) { - Sizzle.error( match[0] ); - } - - // TODO: Move to normal caching system - match[0] = done++; - - return match; - }, - - ATTR: function( match, curLoop, inplace, result, not, isXML ) { - var name = match[1] = match[1].replace( rBackslash, "" ); - - if ( !isXML && Expr.attrMap[name] ) { - match[1] = Expr.attrMap[name]; - } - - // Handle if an un-quoted value was used - match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); - - if ( match[2] === "~=" ) { - match[4] = " " + match[4] + " "; - } - - return match; - }, - - PSEUDO: function( match, curLoop, inplace, result, not ) { - if ( match[1] === "not" ) { - // If we're dealing with a complex expression, or a simple one - if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { - match[3] = Sizzle(match[3], null, null, curLoop); - - } else { - var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); - - if ( !inplace ) { - result.push.apply( result, ret ); - } - - return false; - } - - } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { - return true; - } - - return match; - }, - - POS: function( match ) { - match.unshift( true ); - - return match; - } - }, - - filters: { - enabled: function( elem ) { - return elem.disabled === false && elem.type !== "hidden"; - }, - - disabled: function( elem ) { - return elem.disabled === true; - }, - - checked: function( elem ) { - return elem.checked === true; - }, - - selected: function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - parent: function( elem ) { - return !!elem.firstChild; - }, - - empty: function( elem ) { - return !elem.firstChild; - }, - - has: function( elem, i, match ) { - return !!Sizzle( match[3], elem ).length; - }, - - header: function( elem ) { - return (/h\d/i).test( elem.nodeName ); - }, - - text: function( elem ) { - var attr = elem.getAttribute( "type" ), type = elem.type; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); - }, - - radio: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; - }, - - checkbox: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; - }, - - file: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; - }, - - password: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; - }, - - submit: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "submit" === elem.type; - }, - - image: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; - }, - - reset: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "reset" === elem.type; - }, - - button: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && "button" === elem.type || name === "button"; - }, - - input: function( elem ) { - return (/input|select|textarea|button/i).test( elem.nodeName ); - }, - - focus: function( elem ) { - return elem === elem.ownerDocument.activeElement; - } - }, - setFilters: { - first: function( elem, i ) { - return i === 0; - }, - - last: function( elem, i, match, array ) { - return i === array.length - 1; - }, - - even: function( elem, i ) { - return i % 2 === 0; - }, - - odd: function( elem, i ) { - return i % 2 === 1; - }, - - lt: function( elem, i, match ) { - return i < match[3] - 0; - }, - - gt: function( elem, i, match ) { - return i > match[3] - 0; - }, - - nth: function( elem, i, match ) { - return match[3] - 0 === i; - }, - - eq: function( elem, i, match ) { - return match[3] - 0 === i; - } - }, - filter: { - PSEUDO: function( elem, match, i, array ) { - var name = match[1], - filter = Expr.filters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - - } else if ( name === "contains" ) { - return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; - - } else if ( name === "not" ) { - var not = match[3]; - - for ( var j = 0, l = not.length; j < l; j++ ) { - if ( not[j] === elem ) { - return false; - } - } - - return true; - - } else { - Sizzle.error( name ); - } - }, - - CHILD: function( elem, match ) { - var first, last, - doneName, parent, cache, - count, diff, - type = match[1], - node = elem; - - switch ( type ) { - case "only": - case "first": - while ( (node = node.previousSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - if ( type === "first" ) { - return true; - } - - node = elem; - - /* falls through */ - case "last": - while ( (node = node.nextSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - return true; - - case "nth": - first = match[2]; - last = match[3]; - - if ( first === 1 && last === 0 ) { - return true; - } - - doneName = match[0]; - parent = elem.parentNode; - - if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { - count = 0; - - for ( node = parent.firstChild; node; node = node.nextSibling ) { - if ( node.nodeType === 1 ) { - node.nodeIndex = ++count; - } - } - - parent[ expando ] = doneName; - } - - diff = elem.nodeIndex - last; - - if ( first === 0 ) { - return diff === 0; - - } else { - return ( diff % first === 0 && diff / first >= 0 ); - } - } - }, - - ID: function( elem, match ) { - return elem.nodeType === 1 && elem.getAttribute("id") === match; - }, - - TAG: function( elem, match ) { - return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; - }, - - CLASS: function( elem, match ) { - return (" " + (elem.className || elem.getAttribute("class")) + " ") - .indexOf( match ) > -1; - }, - - ATTR: function( elem, match ) { - var name = match[1], - result = Sizzle.attr ? - Sizzle.attr( elem, name ) : - Expr.attrHandle[ name ] ? - Expr.attrHandle[ name ]( elem ) : - elem[ name ] != null ? - elem[ name ] : - elem.getAttribute( name ), - value = result + "", - type = match[2], - check = match[4]; - - return result == null ? - type === "!=" : - !type && Sizzle.attr ? - result != null : - type === "=" ? - value === check : - type === "*=" ? - value.indexOf(check) >= 0 : - type === "~=" ? - (" " + value + " ").indexOf(check) >= 0 : - !check ? - value && result !== false : - type === "!=" ? - value !== check : - type === "^=" ? - value.indexOf(check) === 0 : - type === "$=" ? - value.substr(value.length - check.length) === check : - type === "|=" ? - value === check || value.substr(0, check.length + 1) === check + "-" : - false; - }, - - POS: function( elem, match, i, array ) { - var name = match[2], - filter = Expr.setFilters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - } - } - } -}; - -var origPOS = Expr.match.POS, - fescape = function(all, num){ - return "\\" + (num - 0 + 1); - }; - -for ( var type in Expr.match ) { - Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); - Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); -} -// Expose origPOS -// "global" as in regardless of relation to brackets/parens -Expr.match.globalPOS = origPOS; - -var makeArray = function( array, results ) { - array = Array.prototype.slice.call( array, 0 ); - - if ( results ) { - results.push.apply( results, array ); - return results; - } - - return array; -}; - -// Perform a simple check to determine if the browser is capable of -// converting a NodeList to an array using builtin methods. -// Also verifies that the returned array holds DOM nodes -// (which is not the case in the Blackberry browser) -try { - Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; - -// Provide a fallback method if it does not work -} catch( e ) { - makeArray = function( array, results ) { - var i = 0, - ret = results || []; - - if ( toString.call(array) === "[object Array]" ) { - Array.prototype.push.apply( ret, array ); - - } else { - if ( typeof array.length === "number" ) { - for ( var l = array.length; i < l; i++ ) { - ret.push( array[i] ); - } - - } else { - for ( ; array[i]; i++ ) { - ret.push( array[i] ); - } - } - } - - return ret; - }; -} - -var sortOrder, siblingCheck; - -if ( document.documentElement.compareDocumentPosition ) { - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { - return a.compareDocumentPosition ? -1 : 1; - } - - return a.compareDocumentPosition(b) & 4 ? -1 : 1; - }; - -} else { - sortOrder = function( a, b ) { - // The nodes are identical, we can exit early - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Fallback to using sourceIndex (in IE) if it's available on both nodes - } else if ( a.sourceIndex && b.sourceIndex ) { - return a.sourceIndex - b.sourceIndex; - } - - var al, bl, - ap = [], - bp = [], - aup = a.parentNode, - bup = b.parentNode, - cur = aup; - - // If the nodes are siblings (or identical) we can do a quick check - if ( aup === bup ) { - return siblingCheck( a, b ); - - // If no parents were found then the nodes are disconnected - } else if ( !aup ) { - return -1; - - } else if ( !bup ) { - return 1; - } - - // Otherwise they're somewhere else in the tree so we need - // to build up a full list of the parentNodes for comparison - while ( cur ) { - ap.unshift( cur ); - cur = cur.parentNode; - } - - cur = bup; - - while ( cur ) { - bp.unshift( cur ); - cur = cur.parentNode; - } - - al = ap.length; - bl = bp.length; - - // Start walking down the tree looking for a discrepancy - for ( var i = 0; i < al && i < bl; i++ ) { - if ( ap[i] !== bp[i] ) { - return siblingCheck( ap[i], bp[i] ); - } - } - - // We ended someplace up the tree so do a sibling check - return i === al ? - siblingCheck( a, bp[i], -1 ) : - siblingCheck( ap[i], b, 1 ); - }; - - siblingCheck = function( a, b, ret ) { - if ( a === b ) { - return ret; - } - - var cur = a.nextSibling; - - while ( cur ) { - if ( cur === b ) { - return -1; - } - - cur = cur.nextSibling; - } - - return 1; - }; -} - -// Check to see if the browser returns elements by name when -// querying by getElementById (and provide a workaround) -(function(){ - // We're going to inject a fake input element with a specified name - var form = document.createElement("div"), - id = "script" + (new Date()).getTime(), - root = document.documentElement; - - form.innerHTML = ""; - - // Inject it into the root element, check its status, and remove it quickly - root.insertBefore( form, root.firstChild ); - - // The workaround has to do additional checks after a getElementById - // Which slows things down for other browsers (hence the branching) - if ( document.getElementById( id ) ) { - Expr.find.ID = function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - - return m ? - m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? - [m] : - undefined : - []; - } - }; - - Expr.filter.ID = function( elem, match ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - - return elem.nodeType === 1 && node && node.nodeValue === match; - }; - } - - root.removeChild( form ); - - // release memory in IE - root = form = null; -})(); - -(function(){ - // Check to see if the browser returns only elements - // when doing getElementsByTagName("*") - - // Create a fake element - var div = document.createElement("div"); - div.appendChild( document.createComment("") ); - - // Make sure no comments are found - if ( div.getElementsByTagName("*").length > 0 ) { - Expr.find.TAG = function( match, context ) { - var results = context.getElementsByTagName( match[1] ); - - // Filter out possible comments - if ( match[1] === "*" ) { - var tmp = []; - - for ( var i = 0; results[i]; i++ ) { - if ( results[i].nodeType === 1 ) { - tmp.push( results[i] ); - } - } - - results = tmp; - } - - return results; - }; - } - - // Check to see if an attribute returns normalized href attributes - div.innerHTML = ""; - - if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && - div.firstChild.getAttribute("href") !== "#" ) { - - Expr.attrHandle.href = function( elem ) { - return elem.getAttribute( "href", 2 ); - }; - } - - // release memory in IE - div = null; -})(); - -if ( document.querySelectorAll ) { - (function(){ - var oldSizzle = Sizzle, - div = document.createElement("div"), - id = "__sizzle__"; - - div.innerHTML = "

"; - - // Safari can't handle uppercase or unicode characters when - // in quirks mode. - if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { - return; - } - - Sizzle = function( query, context, extra, seed ) { - context = context || document; - - // Only use querySelectorAll on non-XML documents - // (ID selectors don't work in non-HTML documents) - if ( !seed && !Sizzle.isXML(context) ) { - // See if we find a selector to speed up - var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); - - if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { - // Speed-up: Sizzle("TAG") - if ( match[1] ) { - return makeArray( context.getElementsByTagName( query ), extra ); - - // Speed-up: Sizzle(".CLASS") - } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { - return makeArray( context.getElementsByClassName( match[2] ), extra ); - } - } - - if ( context.nodeType === 9 ) { - // Speed-up: Sizzle("body") - // The body element only exists once, optimize finding it - if ( query === "body" && context.body ) { - return makeArray( [ context.body ], extra ); - - // Speed-up: Sizzle("#ID") - } else if ( match && match[3] ) { - var elem = context.getElementById( match[3] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id === match[3] ) { - return makeArray( [ elem ], extra ); - } - - } else { - return makeArray( [], extra ); - } - } - - try { - return makeArray( context.querySelectorAll(query), extra ); - } catch(qsaError) {} - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - var oldContext = context, - old = context.getAttribute( "id" ), - nid = old || id, - hasParent = context.parentNode, - relativeHierarchySelector = /^\s*[+~]/.test( query ); - - if ( !old ) { - context.setAttribute( "id", nid ); - } else { - nid = nid.replace( /'/g, "\\$&" ); - } - if ( relativeHierarchySelector && hasParent ) { - context = context.parentNode; - } - - try { - if ( !relativeHierarchySelector || hasParent ) { - return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); - } - - } catch(pseudoError) { - } finally { - if ( !old ) { - oldContext.removeAttribute( "id" ); - } - } - } - } - - return oldSizzle(query, context, extra, seed); - }; - - for ( var prop in oldSizzle ) { - Sizzle[ prop ] = oldSizzle[ prop ]; - } - - // release memory in IE - div = null; - })(); -} - -(function(){ - var html = document.documentElement, - matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; - - if ( matches ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9 fails this) - var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), - pseudoWorks = false; - - try { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( document.documentElement, "[test!='']:sizzle" ); - - } catch( pseudoError ) { - pseudoWorks = true; - } - - Sizzle.matchesSelector = function( node, expr ) { - // Make sure that attribute selectors are quoted - expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); - - if ( !Sizzle.isXML( node ) ) { - try { - if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { - var ret = matches.call( node, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || !disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9, so check for that - node.document && node.document.nodeType !== 11 ) { - return ret; - } - } - } catch(e) {} - } - - return Sizzle(expr, null, null, [node]).length > 0; - }; - } -})(); - -(function(){ - var div = document.createElement("div"); - - div.innerHTML = "
"; - - // Opera can't find a second classname (in 9.6) - // Also, make sure that getElementsByClassName actually exists - if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { - return; - } - - // Safari caches class attributes, doesn't catch changes (in 3.2) - div.lastChild.className = "e"; - - if ( div.getElementsByClassName("e").length === 1 ) { - return; - } - - Expr.order.splice(1, 0, "CLASS"); - Expr.find.CLASS = function( match, context, isXML ) { - if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { - return context.getElementsByClassName(match[1]); - } - }; - - // release memory in IE - div = null; -})(); - -function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem[ expando ] === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 && !isXML ){ - elem[ expando ] = doneName; - elem.sizset = i; - } - - if ( elem.nodeName.toLowerCase() === cur ) { - match = elem; - break; - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; - - if ( elem ) { - var match = false; - - elem = elem[dir]; - - while ( elem ) { - if ( elem[ expando ] === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 ) { - if ( !isXML ) { - elem[ expando ] = doneName; - elem.sizset = i; - } - - if ( typeof cur !== "string" ) { - if ( elem === cur ) { - match = true; - break; - } - - } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { - match = elem; - break; - } - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } -} - -if ( document.documentElement.contains ) { - Sizzle.contains = function( a, b ) { - return a !== b && (a.contains ? a.contains(b) : true); - }; - -} else if ( document.documentElement.compareDocumentPosition ) { - Sizzle.contains = function( a, b ) { - return !!(a.compareDocumentPosition(b) & 16); - }; - -} else { - Sizzle.contains = function() { - return false; - }; -} - -Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; - - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -var posProcess = function( selector, context, seed ) { - var match, - tmpSet = [], - later = "", - root = context.nodeType ? [context] : context; - - // Position selectors must be done after the filter - // And so must :not(positional) so we move all PSEUDOs to the end - while ( (match = Expr.match.PSEUDO.exec( selector )) ) { - later += match[0]; - selector = selector.replace( Expr.match.PSEUDO, "" ); - } - - selector = Expr.relative[selector] ? selector + "*" : selector; - - for ( var i = 0, l = root.length; i < l; i++ ) { - Sizzle( selector, root[i], tmpSet, seed ); - } - - return Sizzle.filter( later, tmpSet ); -}; - -// EXPOSE -// Override sizzle attribute retrieval -Sizzle.attr = jQuery.attr; -Sizzle.selectors.attrMap = {}; -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.filters; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})(); - - -var runtil = /Until$/, - rparentsprev = /^(?:parents|prevUntil|prevAll)/, - // Note: This RegExp should be improved, or likely pulled from Sizzle - rmultiselector = /,/, - isSimple = /^.[^:#\[\.,]*$/, - slice = Array.prototype.slice, - POS = jQuery.expr.match.globalPOS, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var self = this, - i, l; - - if ( typeof selector !== "string" ) { - return jQuery( selector ).filter(function() { - for ( i = 0, l = self.length; i < l; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }); - } - - var ret = this.pushStack( "", "find", selector ), - length, n, r; - - for ( i = 0, l = this.length; i < l; i++ ) { - length = ret.length; - jQuery.find( selector, this[i], ret ); - - if ( i > 0 ) { - // Make sure that the results are unique - for ( n = length; n < ret.length; n++ ) { - for ( r = 0; r < length; r++ ) { - if ( ret[r] === ret[n] ) { - ret.splice(n--, 1); - break; - } - } - } - } - } - - return ret; - }, - - has: function( target ) { - var targets = jQuery( target ); - return this.filter(function() { - for ( var i = 0, l = targets.length; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector, false), "not", selector); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector, true), "filter", selector ); - }, - - is: function( selector ) { - return !!selector && ( - typeof selector === "string" ? - // If this is a positional selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - POS.test( selector ) ? - jQuery( selector, this.context ).index( this[0] ) >= 0 : - jQuery.filter( selector, this ).length > 0 : - this.filter( selector ).length > 0 ); - }, - - closest: function( selectors, context ) { - var ret = [], i, l, cur = this[0]; - - // Array (deprecated as of jQuery 1.7) - if ( jQuery.isArray( selectors ) ) { - var level = 1; - - while ( cur && cur.ownerDocument && cur !== context ) { - for ( i = 0; i < selectors.length; i++ ) { - - if ( jQuery( cur ).is( selectors[ i ] ) ) { - ret.push({ selector: selectors[ i ], elem: cur, level: level }); - } - } - - cur = cur.parentNode; - level++; - } - - return ret; - } - - // String - var pos = POS.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( i = 0, l = this.length; i < l; i++ ) { - cur = this[i]; - - while ( cur ) { - if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { - ret.push( cur ); - break; - - } else { - cur = cur.parentNode; - if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { - break; - } - } - } - } - - ret = ret.length > 1 ? jQuery.unique( ret ) : ret; - - return this.pushStack( ret, "closest", selectors ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? - all : - jQuery.unique( all ) ); - }, - - andSelf: function() { - return this.add( this.prevObject ); - } -}); - -// A painfully simple check to see if an element is disconnected -// from a document (should be improved, where feasible). -function isDisconnected( node ) { - return !node || !node.parentNode || node.parentNode.nodeType === 11; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return jQuery.nth( elem, 2, "nextSibling" ); - }, - prev: function( elem ) { - return jQuery.nth( elem, 2, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.makeArray( elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); - - if ( !runtil.test( name ) ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; - - if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - - return this.pushStack( ret, name, slice.call( arguments ).join(",") ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 ? - jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : - jQuery.find.matches(expr, elems); - }, - - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - nth: function( cur, result, dir, elem ) { - result = result || 1; - var num = 0; - - for ( ; cur; cur = cur[dir] ) { - if ( cur.nodeType === 1 && ++num === result ) { - break; - } - } - - return cur; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, keep ) { - - // Can't pass null or undefined to indexOf in Firefox 4 - // Set to 0 to skip string check - qualifier = qualifier || 0; - - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep(elements, function( elem, i ) { - var retVal = !!qualifier.call( elem, i, elem ); - return retVal === keep; - }); - - } else if ( qualifier.nodeType ) { - return jQuery.grep(elements, function( elem, i ) { - return ( elem === qualifier ) === keep; - }); - - } else if ( typeof qualifier === "string" ) { - var filtered = jQuery.grep(elements, function( elem ) { - return elem.nodeType === 1; - }); - - if ( isSimple.test( qualifier ) ) { - return jQuery.filter(qualifier, filtered, !keep); - } else { - qualifier = jQuery.filter( qualifier, filtered ); - } - } - - return jQuery.grep(elements, function( elem, i ) { - return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; - }); -} - - - - -function createSafeFragment( document ) { - var list = nodeNames.split( "|" ), - safeFrag = document.createDocumentFragment(); - - if ( safeFrag.createElement ) { - while ( list.length ) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; -} - -var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, - rtagName = /<([\w:]+)/, - rtbody = /]", "i"), - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rscriptType = /\/(java|ecma)script/i, - rcleanScript = /^\s*", "" ], - legend: [ 1, "
", "
" ], - thead: [ 1, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - col: [ 2, "", "
" ], - area: [ 1, "", "" ], - _default: [ 0, "", "" ] - }, - safeFragment = createSafeFragment( document ); - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// IE can't serialize and - - - - - - - - - - - -
-
-
-
- -
-

DyNet Builders

-

Builders combine together various operations to implement more -complicated things such as recurrent and LSTM networks

-

TODO: Create documentation

-
- - -
-
-
-
-
-

Previous topic

-

DyNet Operations

-

Next topic

-

DyNet Optimizers

-

This Page

- - - -
-
-
-
- - - - \ No newline at end of file diff --git a/doc/build/html/commandline.html b/doc/build/html/commandline.html deleted file mode 100644 index a84fc0835..000000000 --- a/doc/build/html/commandline.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - DyNet Command Line Options — Dynet 1.0 documentation - - - - - - - - - - - - - - - - -
-
-
-
- -
-

DyNet Command Line Options

-

All programs using DyNet have a few command line options. These must be -specified at the very beginning of the command line, before other -options.

-
    -
  • --dynet-mem NUMBER: DyNet runs by default with 512MB of memory -each for the forward and backward steps, as well as parameter -storage. You will often want to increase this amount. By setting -NUMBER here, DyNet will allocate more memory. Note that you can also -individually set the amount of memory for forward calculation, -backward calculation, and parameters by using comma separated -variables --dynet-mem FOR,BACK,PARAM. This is useful if, for -example, you are performing testing and don’t need to allocate any -memory for backward calculation.
  • -
  • --dynet-l2 NUMBER: Specifies the level of l2 regularization to -use (default 1e-6).
  • -
  • --dynet-gpus NUMBER: Specify how many GPUs you want to use, if -DyNet is compiled with CUDA. Currently, only one GPU is supported.
  • -
  • --dynet-gpu-ids X,Y,Z: Specify the GPUs that you want to use by -device ID. Currently only one GPU is supported, but if you use this -command you can select which one to use.
  • -
-
- - -
-
-
-
-
-

Previous topic

-

Installing the Python DyNet module.

-

Next topic

-

DyNet Tutorial

-

This Page

- - - -
-
-
-
- - - - \ No newline at end of file diff --git a/doc/build/html/genindex.html b/doc/build/html/genindex.html deleted file mode 100644 index 112fa04be..000000000 --- a/doc/build/html/genindex.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - Index — Dynet 1.0 documentation - - - - - - - - - - - - - - -
-
-
-
- - -

Index

- -
- D - -
-

D

- - - -
- -
dynet::MomentumSGDTrainer (C++ class) -
- -
- -
dynet::SimpleSGDTrainer (C++ class) -
- -
- - - -
-
-
-
-
- - - - - -
-
-
-
- - - - \ No newline at end of file diff --git a/doc/build/html/index.html b/doc/build/html/index.html deleted file mode 100644 index 0194d3870..000000000 --- a/doc/build/html/index.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - Dynet documentation — Dynet 1.0 documentation - - - - - - - - - - - - - - - -
-
-
-
- - -
-

Indices and tables

- -
- - -
-
-
-
-
-

Table Of Contents

- - -

Next topic

-

Building/Installing

-

This Page

- - - -
-
-
-
- - - - \ No newline at end of file diff --git a/doc/build/html/install.html b/doc/build/html/install.html deleted file mode 100644 index 23ba4577d..000000000 --- a/doc/build/html/install.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - - - Building/Installing — Dynet 1.0 documentation - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Building/Installing

-

How to build DyNet and link it with your programs

-
-

Prerequisites

-

DyNet relies on a number of external libraries including Boost, cmake, -Eigen, and mercurial (to install Eigen). Boost, cmake, and mercurial can -be installed from standard repositories, for example on Ubuntu linux:

-
sudo apt-get install libboost-all-dev cmake mercurial
-
-
-

To compile DyNet you also need the development version of the Eigen -library. If you use any of the -released versions, you may get assertion failures or compile errors. -If you don’t have Eigen installed already, you can get it easily using -the following command:

-
hg clone https://bitbucket.org/eigen/eigen/
-
-
-
-
-

Building

-

To get and build DyNet, clone the repository

-
git clone https://github.com/clab/dynet.git
-
-
-

then enter the directory and use `cmake <http://www.cmake.org/>`__ -to generate the makefiles

-
cd dynet
-mkdir build
-cd build
-cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen
-
-
-

Then compile, where “2” can be replaced by the number of cores on your -machine

-
make -j 2
-
-
-

To see that things have built properly, you can run

-
./examples/xor
-
-
-

which will train a multilayer perceptron to predict the xor function.

-
-
-

Compiling/linking External Programs

-

When you want to use DyNet in an external program, you will need to add -the dynet directory to the compile path:

-
-I/path/to/dynet
-
-
-

and link with the dynet library:

-
-L/path/to/dynet/build/dynet -ldynet
-
-
-
-
-

Debugging build problems

-

If you have a build problem and want to debug, please run

-
make clean
-make VERBOSE=1 &> make.log
-
-
-

then examine the commands in the make.log file to see if anything -looks fishy. If you would like help, send this make.log file via the -“Issues” tab on github, or to the dynet-users mailing list.

-
-
-

Build options

-
-

GPU (CUDA) support

-

dynet supports running programs on GPUs with CUDA. If you have CUDA -installed, you can build DyNet with GPU support by adding --DBACKEND=cuda to your cmake options. This will result in three -libraries named “libdynet,” “libgdynet,” and “libdynetcuda” being -created. When you want to run a program on CPU, you can link to the -“libdynet” library as shown above. When you want to run a program on -GPU, you can link to the “libgdynet” and “libdynetcuda” libraries.

-
-L/path/to/dynet/build/dynet -lgdynet -ldynetcuda
-
-
-

(Eventually you will be able to use a single library to run on either -CPU or GPU, but this is not fully implemented yet.)

-
-
-

Non-standard Boost location

-

dynet supports boost, and will find it if it is in the standard -location. If boost is in a non-standard location, say $HOME/boost, -you can specify the location by adding the following to your cmake -options:

-
-DBOOST_ROOT:PATHNAME=$HOME/boost -DBoost_LIBRARY_DIRS:FILEPATH=$HOME/boost/lib
--DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE
-
-
-

Note that you will also have to set your LD_LIBRARY_PATH to point to -the boost/lib directory.

-
-
-

Building for Windows

-

DYNET has been tested to build in Windows using Microsoft Visual Studio -2015. You may be able to build with MSVC 2013 by slightly modifying the -instructions below.

-

First, install Eigen following the above instructions.

-

Second, install Boost for your compiler and -platform. Follow the instructions for compiling Boost or just download -the already-compiled binaries.

-

To generate the MSVC solution and project files, run -cmake, pointing it to the location you -installed Eigen and Boost (for example, at c:and c:_1_61_0):

-
mkdir build
-cd build
-cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64"
-
-
-

This will generate dynet.sln and a bunch of *.vcxproj files (one for -the DYNET library, and one per example). You should be able to just open -dynet.sln and build all. Note: multi-process functionality is -currently not supported in Windows, so you will not be able to build -rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to -this project

-
-
-
- - -
-
-
-
-
-

Table Of Contents

- - -

Previous topic

-

Dynet documentation

-

Next topic

-

Installing the Python DyNet module.

-

This Page

- - - -
-
-
-
- - - - \ No newline at end of file diff --git a/doc/build/html/minibatch.html b/doc/build/html/minibatch.html deleted file mode 100644 index a49eca31a..000000000 --- a/doc/build/html/minibatch.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - Mini-batching in DyNet — Dynet 1.0 documentation - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Mini-batching in DyNet

-

How to perform minibatching to improve efficiency

-
- - -
-
-
-
-
-

Previous topic

-

DyNet Optimizers

-

Next topic

-

Multi-processing in DyNet

-

This Page

- - - -
-
-
-
- - - - \ No newline at end of file diff --git a/doc/build/html/multiprocessing.html b/doc/build/html/multiprocessing.html deleted file mode 100644 index 3f81da5e0..000000000 --- a/doc/build/html/multiprocessing.html +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - Multi-processing in DyNet — Dynet 1.0 documentation - - - - - - - - - - - - - - - -
-
-
-
- -
-

Multi-processing in DyNet

-

How to perform processing on multiple threads

-

(TODO: create doc)

-
- - -
-
-
-
-
-

Previous topic

-

Mini-batching in DyNet

-

This Page

- - - -
-
-
-
- - - - \ No newline at end of file diff --git a/doc/build/html/objects.inv b/doc/build/html/objects.inv deleted file mode 100644 index 6f9e7e436..000000000 --- a/doc/build/html/objects.inv +++ /dev/null @@ -1,8 +0,0 @@ -# Sphinx inventory version 2 -# Project: Dynet -# Version: 1.0 -# The remainder of this file is compressed using zlib. -xڕ�� -�0 ��{��^'�ڳ ¼�چ�д�Ma��E;áx ��O�k�4N�X +oh�n �5-���dw�z�-��U� �.FAʨ�5X�� -p�VzvȉcV���oZO�8Sw:^�4��6d�S)�C��� -�nb��PV�_͏���Y�� \ No newline at end of file diff --git a/doc/build/html/operations.html b/doc/build/html/operations.html deleted file mode 100644 index 364f097f9..000000000 --- a/doc/build/html/operations.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - DyNet Operations — Dynet 1.0 documentation - - - - - - - - - - - - - - - - -
-
-
-
- -
-

DyNet Operations

-

The various operations that you can use in building a DyNet graph

-

TODO: Create documentation

-
- - -
-
-
-
-
-

Previous topic

-

DyNet Tutorial

-

Next topic

-

DyNet Builders

-

This Page

- - - -
-
-
-
- - - - \ No newline at end of file diff --git a/doc/build/html/optimizers.html b/doc/build/html/optimizers.html deleted file mode 100644 index 5cc1aa569..000000000 --- a/doc/build/html/optimizers.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - DyNet Optimizers — Dynet 1.0 documentation - - - - - - - - - - - - - - - - -
-
-
-
- -
-

DyNet Optimizers

-

The various optimizers that you can use to tune your parameters

-
-
-struct dynet::SimpleSGDTrainer
-

Inherits from dynet::Trainer

-
- -
-
-struct dynet::MomentumSGDTrainer
-

Inherits from dynet::Trainer

-
- -
- - -
-
-
-
-
-

Previous topic

-

DyNet Builders

-

Next topic

-

Mini-batching in DyNet

-

This Page

- - - -
-
-
-
- - - - \ No newline at end of file diff --git a/doc/build/html/python.html b/doc/build/html/python.html deleted file mode 100644 index 46b59531c..000000000 --- a/doc/build/html/python.html +++ /dev/null @@ -1,272 +0,0 @@ - - - - - - - - Installing the Python DyNet module. — Dynet 1.0 documentation - - - - - - - - - - - - - - - - -
-
-
-
- -
-

Installing the Python DyNet module.

-

(for instructions on installing on a computer with GPU, see below)

-

Python bindings to DyNet are currently only supported under python 2.

-
-

TL;DR

-

(see below for the details)

-
# Installing python DyNet on a machine with python 2.7:
-
-pip install cython # if you don't have it already.
-mkdir dynet-base
-cd dynet-base
-# getting dynet and eigen
-git clone https://github.com/clab/dynet.git
-hg clone https://bitbucket.org/eigen/eigen
-cd dynet
-mkdir build
-cd build
-# without GPU support:
-cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python`
-# or with GPU support:
-cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` -DBACKEND=cuda
-
-make -j 2 # replace 2 with the number of available cores
-cd python
-python setup.py install  # or `python setup.py install --user` for a user-local install.
-
-
-
-
-

Detailed Instructions:

-

First, get DyNet:

-
cd $HOME
-mkdir dynet-base
-cd dynet-base
-git clone https://github.com/clab/dynet.git
-cd dynet
-git submodule init # To be consistent with DyNet's installation instructions.
-git submodule update # To be consistent with DyNet's installation instructions.
-
-
-

Then get Eigen:

-
cd $HOME
-cd dynet-base
-hg clone https://bitbucket.org/eigen/eigen/
-
-
-

We also need to make sure the cython module is installed. (you can -replace pip with your favorite package manager, such as conda, -or install within a virtual environment)

-
pip install cython
-
-
-

To simplify the following steps, we can set a bash variable to hold -where we have saved the main directories of DyNet and Eigen. In case you -have gotten DyNet and Eigen differently from the instructions above and -saved them in different location(s), these variables will be helpful:

-
PATH_TO_DYNET=$HOME/dynet-base/dynet/
-PATH_TO_EIGEN=$HOME/dynet-base/eigen/
-
-
-

Compile DyNet.

-

This is pretty much the same process as compiling DyNet, with the -addition of the -DPYTHON= flag, pointing to the location of your -python interpreter.

-

If boost is installed in a non-standard location, you should add the -corresponding flags to the cmake commandline, see the DyNet -installation instructions page.

-
cd $PATH_TO_DYNET
-PATH_TO_PYTHON=`which python`
-mkdir build
-cd build
-cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON
-make -j 2
-
-
-

Assuming that the cmake command found all the needed libraries and -didn’t fail, the make command will take a while, and compile dynet -as well as the python bindings. You can change make -j 2 to a higher -number, depending on the available cores you want to use while -compiling.

-

You now have a working python binding inside of build/dynet. To -verify this is working:

-
cd $PATH_TO_DYNET/build/python
-python
-
-
-

then, within python:

-
import dynet as dy
-print dy.__version__
-model = dy.Model()
-
-
-

In order to install the module so that it is accessible from everywhere -in the system, run the following:

-
cd $PATH_TO_DYNET/build/python
-python setup.py install --user
-
-
-

(the --user switch will install the module in your local -site-packages, and works without root privilages. To install the module -to the system site-packages (for all users), run -python setup.py install without this switch)

-

You should now have a working python binding (the dynet module).

-

Note however that the installation relies on the compiled dynet library -being in $PATH_TO_DYNET/build/dynet, so make sure not to move it -from there.

-

Now, check that everything works:

-
# check that it works:
-cd $PATH_TO_DYNET
-cd pyexamples
-python xor.py
-python rnnlm.py rnnlm.py
-
-
-

Alternatively, if the following script works for you, then your -installation is likely to be working:

-
from dynet import *
-model = Model()
-
-
-
-
-

Installing with GPU support

-

For installing on a computer with GPU, first install CUDA. The following -instructions assume CUDA is installed.

-

The installation process is pretty much the same, while adding the --DBACKEND=cuda flag to the cmake stage:

-
cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON -DBACKEND=cuda
-
-
-

(if CUDA is installed in a non-standard location and cmake cannot -find it, you can specify also --DCUDA_TOOLKIT_ROOT_DIR=/path/to/cuda.)

-

Now, build the python modules (as above, we assume cython is installed):

-

After running make -j 2, you should have the files _dynet.so and -_gdynet.so in the build/python folder.

-

As before, cd build/python followed by -python setup.py install --user will install the module.

-
-
-
-

Using the GPU:

-

In order to use the GPU support, you can either:

-
    -
  • Use import _gdynet as dy instead of import dynet as dy
  • -
  • Or, (preferred), import dynet as usual, but use the commandline -switch --dynet-gpu or the GPU switches detailed -here when invoking the program. This option lets -the same code work with either the GPU or the CPU version depending -on how it is invoked.
  • -
-
- - -
-
-
-
-
-

Table Of Contents

- - -

Previous topic

-

Building/Installing

-

Next topic

-

DyNet Command Line Options

-

This Page

- - - -
-
-
-
- - - - \ No newline at end of file diff --git a/doc/build/html/search.html b/doc/build/html/search.html deleted file mode 100644 index 86002ae1e..000000000 --- a/doc/build/html/search.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - Search — Dynet 1.0 documentation - - - - - - - - - - - - - - - - - - - - -
-
-
-
- -

Search

-
- -

- Please activate JavaScript to enable the search - functionality. -

-
-

- From here you can search these documents. Enter your search - words into the box below and click "search". Note that the search - function will automatically search for all of the words. Pages - containing fewer words won't appear in the result list. -

-
- - - -
- -
- -
- -
-
-
-
-
-
-
-
-
- - - - \ No newline at end of file diff --git a/doc/build/html/searchindex.js b/doc/build/html/searchindex.js deleted file mode 100644 index f4332bba8..000000000 --- a/doc/build/html/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({envversion:42,terms:{all:[2,3,6],code:2,illustr:9,path_to_python:2,per:6,follow:[2,1,6],cython:2,privat:[],depend:2,graph:[0,9],send:6,init:2,concret:9,dboost_librarydir:6,breathe_project:[],sourc:[],"void":[],failur:6,veri:[3,9],vlp:[],y_valu:9,level:3,list:6,vector:9,adamtrain:[],path:[2,6],pleas:6,doxygenclass:[],libgdynet:6,second:6,pass:9,download:6,x_valu:9,index:1,xor:[2,6,9],abl:6,sln:6,add_paramet:9,current:[2,3,6],version:[2,6],rmsproptrain:[],"public":[],can:[0,1,2,3,5,6,9],mem:3,gener:[1,6],here:[2,3,9],let:2,ubuntu:6,"const":[],modifi:6,interpret:2,box:6,search:1,amount:3,dynet_trainer_define_dev_impl:[],implement:[1,7,6],trainer:[5,9],via:6,modul:[],prefer:2,submodul:2,apt:6,perceptron:6,sgd:9,select:3,from:[2,5,6],would:6,memori:[3,9],next:[6,9],few:3,more:[3,7],path_to_dynet:2,under:2,flag:2,train:[6,9],examin:6,rescale_and_reset_weight_decai:[],hold:2,must:3,beta_1:[],beta_2:[],setup:2,work:2,ldynet:6,dev:6,archiv:[],libboost:6,root:2,path_to_eigen:2,control:9,doxygenfil:[],want:[2,3,6],predict:6,sudo:6,templat:[],tab:6,msvc:6,serial:[],unsign:[],uncheck:6,multipl:8,filepath:6,write:9,how:[1,2,3,4,6,8,9],verifi:2,simpl:9,dboost_no_system_path:6,updat:[2,9],everywher:2,doxygenstruct:[],referenc:1,clone:[2,6],after:2,invok:2,befor:[2,3],lidx:[],clipping_en:[],mai:6,data:9,alloc:3,github:[2,6],bind:2,favorit:2,correspond:2,issu:6,inform:[1,9],"switch":2,combin:7,allow:9,enter:6,order:2,eigen:[2,6],sigmoid:9,move:2,libdynetcuda:6,through:9,lgdynet:6,bunch:6,adagradtrain:[],platform:6,mail:6,main:2,them:[2,9],within:[2,9],"return":9,binary_log_loss:9,initi:9,instead:2,now:[2,9],multiprocess:[],eventu:6,name:6,anyth:6,didn:2,separ:3,update_lookup_param:[],each:3,fulli:6,weight:9,replac:[2,6],individu:3,idea:9,procedur:[],hlg:[],hld:[],todo:[0,7,8],eta_decai:[],out:9,variabl:[2,3,9],shown:6,network:[7,9],gradient:9,content:[],y_pred:9,print:[2,9],lib64:6,insid:2,base:2,dictionari:[],releas:6,org:[2,6],bash:2,eta0:[],thread:8,thing:[7,6,9],unabl:[],regress:9,first:[2,6,9],oper:[],pyexampl:2,number:[2,3,6],instruct:[],alreadi:[2,6],done:9,open:6,size:9,differ:2,script:2,mkdir:[2,6],system:2,mercuri:6,simplesgdtrain:[5,9],"final":9,friend:[],namespac:[],specifi:[2,3,6,9],part:9,logist:9,computationgraph:9,std:[],gotten:2,structur:9,project:6,clip_threshold:[],sai:6,comput:[2,9],clip:[],ani:[3,6],myproject:[],packag:2,have:[2,3,6],need:[2,3,6,9],seem:[],built:6,lib:6,note:[2,3,6,9],also:[2,3,6],exampl:[3,6,9],dbackend:[2,6],take:2,which:[2,3,6,9],environ:2,singl:[6,9],simplifi:2,begin:3,sure:2,boost_1_61_0:6,multipli:9,regular:3,rho:[],alpha:[],model:[2,1,9],dynet_1_1simplesgdtrain:[],don:[2,3,6,9],privilag:2,doc:8,cover:9,doe:[],minibatch:4,clean:6,microsoft:6,verbos:6,particularli:9,lstm:[7,9],find:[2,1,6],help:[2,6],xml:[],access:2,onli:[2,3],clip_gradi:[],pretti:2,configur:6,solut:6,should:[2,6],factor:9,folder:2,local:2,alloc_impl:[],variou:[0,7,5],get:[2,6,9],express:9,rnnlm:[2,6],cannot:2,increas:3,dboost_no_boost_cmak:6,"_gdynet":2,print_graphviz:9,comma:3,where:[2,6],as_scalar:9,set:[2,3,6,9],commandlin:2,size_t:[],see:[2,6],result:6,fail:2,best:9,statu:[],tensor:[],dpython:2,simplest:9,"import":2,paramet:[3,5,9],attribut:[],altern:2,kei:[],structdynet_1_1adadeltatrain:[],multilay:6,conda:2,dboost_root:6,addit:2,protect:[],doxygen:[],howev:2,eta:[],mani:3,com:[2,6],ld_library_path:6,load:9,point:[2,6],"1_1simplesgdtrain":[],linux:6,assum:2,devic:3,three:6,been:6,accumul:9,much:2,valu:9,deigen3_include_dir:[2,6],assert:6,"_1_61_0":6,input:9,"case":2,update_rul:[],multi:[],look:[6,9],defin:9,calcul:[3,9],abov:[2,6],error:6,propag:9,site:2,bias:9,develop:6,minim:9,perform:[3,4,9,8],make:[2,6],same:2,"while":2,member:[],binari:6,epoch:[],libdynet:6,"__version__":2,higher:2,http:[2,6],optim:[],user:[2,6],improv:4,chang:2,tune:5,well:[2,3],inherit:5,without:2,command:[],adadeltatrain:[],thi:[2,3,6,9],everyth:2,usual:2,update_param:[],just:6,dboost_library_dir:6,paul:[],yet:[6,9],structdynet_1_1rmsproptrain:[],adagrad:[],struct:5,makefil:6,param:3,add:[2,6,9],valid:[],shadowparamet:[],save:2,momentum:[],real:9,read:9,breathe_default_project:[],mom:[],recurr:[7,9],mod:9,loss:9,like:[2,6,9],dcuda_toolkit_root_dir:2,clab:[2,6],either:[2,6],output:9,shadowlookupparamet:[],www:6,often:3,back:[3,9],toctre:[],home:[2,6],librari:[2,6],scale:9,easili:6,"512mb":3,subclass:[],complic:7,refer:[],machin:[2,6],core:[2,6],process:[],run:[2,3,6,9],win64:6,step:[2,3],repositori:6,found:2,vcxproj:6,stage:2,about:1,idx:[],slightli:6,page:[2,1],constructor:9,effici:4,"float":[],storag:3,your:[2,1,5,6],manag:[2,6],git:[2,6],log:6,wai:9,"class":[],avail:2,start:9,reli:[2,6],includ:6,forward:[3,9],dynet_1_1:[],"function":[6,9],properli:6,fishi:6,epsilon:[],"1x3":9,"true":6,consist:2,"default":3,below:[2,1,6,9],creat:[0,7,6,9,8],"int":[],flow:9,doesn:9,ldynetcuda:6,file:[2,6],pip:2,check:2,cmake:[2,6],when:[2,1,6],virtual:2,other:3,bool:[],update_epoch:[],test:[3,6],you:[0,1,2,3,6,5],"_dynet":2,gscale:[],aux_alloc:[],bitbucket:[2,6],studio:6,directori:[2,6,9],visual:6,momentumsgdtrain:5,pathnam:6,maxdepth:[],backward:[3,9],cpu:[2,6],togeth:7},objtypes:{"0":"cpp:class"},objnames:{"0":["cpp","class","C++ class"]},filenames:["operations","index","python","commandline","minibatch","optimizers","install","builders","multiprocessing","tutorial"],titles:["DyNet Operations","Dynet documentation","Installing the Python DyNet module.","DyNet Command Line Options","Mini-batching in DyNet","DyNet Optimizers","Building/Installing","DyNet Builders","Multi-processing in DyNet","DyNet Tutorial"],objects:{"":{"dynet::MomentumSGDTrainer":[5,0,1,""],"dynet::SimpleSGDTrainer":[5,0,1,""]}},titleterms:{compil:6,mini:4,process:8,modul:2,indic:1,instruct:2,tabl:1,instal:[2,6],dynet:[0,1,2,3,4,5,7,8,9],locat:6,welcom:[],support:[2,6],detail:2,python:2,window:6,program:6,build:6,gpu:[2,6],document:1,boost:6,non:6,option:[3,6],optim:5,standard:6,link:6,prerequisit:6,extern:6,line:3,oper:0,multi:8,builder:7,batch:4,tutori:9,command:3,cuda:6,debug:6,problem:6}}) \ No newline at end of file diff --git a/doc/build/html/tutorial.html b/doc/build/html/tutorial.html deleted file mode 100644 index 9a3ab6039..000000000 --- a/doc/build/html/tutorial.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - DyNet Tutorial — Dynet 1.0 documentation - - - - - - - - - - - - - - - - -
-
-
-
- -
-

DyNet Tutorial

-

An illustration of how models are trained (for a simple logistic -regression model) is below:

-
// *** First, we set up the structure of the model
-// Create a model, and an SGD trainer to update its parameters.
-Model mod;
-SimpleSGDTrainer sgd(&mod);
-// Create a "computation graph," which will define the flow of information.
-ComputationGraph cg;
-// Initialize a 1x3 parameter vector, and add the parameters to be part of the
-// computation graph.
-Expression W = parameter(cg, mod.add_parameters({1, 3}));
-// Create variables defining the input and output of the regression, and load them
-// into the computation graph. Note that we don't need to set concrete values yet.
-vector<dynet::real> x_values(3);
-Expression x = input(cg, {3}, &x_values);
-dynet::real y_value;
-Expression y = input(cg, &y_value);
-// Next, set up the structure to multiply the input by the weight vector,  then run
-// the output of this through a logistic sigmoid function (logistic regression).
-Expression y_pred = logistic(W*x);
-// Finally, we create a function to calculate the loss. The model will be optimized
-// to minimize the value of the final function in the computation graph.
-Expression l = binary_log_loss(y_pred, y);
-// We are now done setting up the graph, and we can print out its structure:
-cg.print_graphviz();
-
-// *** Now, we perform a parameter update for a single example.
-// Set the input/output to the values specified by the training data:
-x_values = {0.5, 0.3, 0.7};
-y_value = 1.0;
-// "forward" propagates values forward through the computation graph, and returns
-// the loss.
-dynet::real loss = as_scalar(cg.forward(l));
-// "backward" performs back-propagation, and accumulates the gradients of the
-// parameters within the "Model" data structure.
-cg.backward(l);
-// "sgd.update" updates parameters of the model that was passed to its constructor.
-// Here 1.0 is the scaling factor that allows us to control the size of the update.
-sgd.update(1.0);
-
-
-

Note that this very simple example that doesn’t cover things like memory -initialization, reading/writing models, recurrent/LSTM networks, or -adding biases to functions. The best way to get an idea of how to use -DyNet for real is to look in the example directory, particularly -starting with the simplest xor example.

-
- - -
-
-
-
-
-

Previous topic

-

DyNet Command Line Options

-

Next topic

-

DyNet Operations

-

This Page

- - - -
-
-
-
- - - - \ No newline at end of file diff --git a/doc/build/text/builders.txt b/doc/build/text/builders.txt deleted file mode 100644 index b020e75af..000000000 --- a/doc/build/text/builders.txt +++ /dev/null @@ -1,8 +0,0 @@ - -DyNet Builders -************** - -Builders combine together various operations to implement more -complicated things such as recurrent and LSTM networks - -TODO: Create documentation diff --git a/doc/build/text/commandline.txt b/doc/build/text/commandline.txt deleted file mode 100644 index d07e1f855..000000000 --- a/doc/build/text/commandline.txt +++ /dev/null @@ -1,27 +0,0 @@ - -DyNet Command Line Options -************************** - -All programs using DyNet have a few command line options. These must -be specified at the very beginning of the command line, before other -options. - -* "--dynet-mem NUMBER": DyNet runs by default with 512MB of memory - each for the forward and backward steps, as well as parameter - storage. You will often want to increase this amount. By setting - NUMBER here, DyNet will allocate more memory. Note that you can also - individually set the amount of memory for forward calculation, - backward calculation, and parameters by using comma separated - variables "--dynet-mem FOR,BACK,PARAM". This is useful if, for - example, you are performing testing and don't need to allocate any - memory for backward calculation. - -* "--dynet-l2 NUMBER": Specifies the level of l2 regularization to - use (default 1e-6). - -* "--dynet-gpus NUMBER": Specify how many GPUs you want to use, if - DyNet is compiled with CUDA. Currently, only one GPU is supported. - -* "--dynet-gpu-ids X,Y,Z": Specify the GPUs that you want to use by - device ID. Currently only one GPU is supported, but if you use this - command you can select which one to use. diff --git a/doc/build/text/index.txt b/doc/build/text/index.txt deleted file mode 100644 index 2e118587a..000000000 --- a/doc/build/text/index.txt +++ /dev/null @@ -1,55 +0,0 @@ - -Dynet documentation -******************* - -You can find information about how to install/use DyNet in general -below: - -* Building/Installing - - * Prerequisites - - * Building - - * Compiling/linking External Programs - - * Debugging build problems - - * Build options - -* Installing the Python DyNet module. - - * TL;DR - - * Detailed Instructions: - - * Installing with GPU support - -* Using the GPU: - -* DyNet Command Line Options - -* DyNet Tutorial - -The following can be referenced when implementing your models in -DyNet: - -* DyNet Operations - -* DyNet Builders - -* DyNet Optimizers - -* Mini-batching in DyNet - -* Multi-processing in DyNet - - -Indices and tables -****************** - -* *Index* - -* *Module Index* - -* *Search Page* diff --git a/doc/build/text/install.txt b/doc/build/text/install.txt deleted file mode 100644 index dddff1394..000000000 --- a/doc/build/text/install.txt +++ /dev/null @@ -1,141 +0,0 @@ - -Building/Installing -******************* - -How to build DyNet and link it with your programs - - -Prerequisites -============= - -DyNet relies on a number of external libraries including Boost, cmake, -Eigen, and mercurial (to install Eigen). Boost, cmake, and mercurial -can be installed from standard repositories, for example on Ubuntu -linux: - - sudo apt-get install libboost-all-dev cmake mercurial - -To compile DyNet you also need the development version of the Eigen -library. **If you use any of the released versions, you may get -assertion failures or compile errors.** If you don't have Eigen -installed already, you can get it easily using the following command: - - hg clone https://bitbucket.org/eigen/eigen/ - - -Building -======== - -To get and build DyNet, clone the repository - - git clone https://github.com/clab/dynet.git - -then enter the directory and use "`cmake" `__ -to generate the makefiles - - cd dynet - mkdir build - cd build - cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen - -Then compile, where "2" can be replaced by the number of cores on your -machine - - make -j 2 - -To see that things have built properly, you can run - - ./examples/xor - -which will train a multilayer perceptron to predict the xor function. - - -Compiling/linking External Programs -=================================== - -When you want to use DyNet in an external program, you will need to -add the "dynet" directory to the compile path: - - -I/path/to/dynet - -and link with the dynet library: - - -L/path/to/dynet/build/dynet -ldynet - - -Debugging build problems -======================== - -If you have a build problem and want to debug, please run - - make clean - make VERBOSE=1 &> make.log - -then examine the commands in the "make.log" file to see if anything -looks fishy. If you would like help, send this "make.log" file via the -"Issues" tab on github, or to the dynet-users mailing list. - - -Build options -============= - - -GPU (CUDA) support ------------------- - -"dynet" supports running programs on GPUs with CUDA. If you have CUDA -installed, you can build DyNet with GPU support by adding -"-DBACKEND=cuda" to your cmake options. This will result in three -libraries named "libdynet," "libgdynet," and "libdynetcuda" being -created. When you want to run a program on CPU, you can link to the -"libdynet" library as shown above. When you want to run a program on -GPU, you can link to the "libgdynet" and "libdynetcuda" libraries. - - -L/path/to/dynet/build/dynet -lgdynet -ldynetcuda - -(Eventually you will be able to use a single library to run on either -CPU or GPU, but this is not fully implemented yet.) - - -Non-standard Boost location ---------------------------- - -"dynet" supports boost, and will find it if it is in the standard -location. If boost is in a non-standard location, say "$HOME/boost", -you can specify the location by adding the following to your cmake -options: - - -DBOOST_ROOT:PATHNAME=$HOME/boost -DBoost_LIBRARY_DIRS:FILEPATH=$HOME/boost/lib - -DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE - -Note that you will also have to set your "LD_LIBRARY_PATH" to point to -the "boost/lib" directory. - - -Building for Windows --------------------- - -DYNET has been tested to build in Windows using Microsoft Visual -Studio 2015. You may be able to build with MSVC 2013 by slightly -modifying the instructions below. - -First, install Eigen following the above instructions. - -Second, install Boost for your compiler and platform. Follow the -instructions for compiling Boost or just download the already-compiled -binaries. - -To generate the MSVC solution and project files, run cmake, pointing -it to the location you installed Eigen and Boost (for example, at -c:and c:_1_61_0): - - mkdir build - cd build - cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64" - -This will generate dynet.sln and a bunch of *.vcxproj files (one for -the DYNET library, and one per example). You should be able to just -open dynet.sln and build all. **Note: multi-process functionality is -currently not supported in Windows, so you will not be able to build -rnnlm-mp. Go to build->Configuration Manager and uncheck the box next -to this project** diff --git a/doc/build/text/minibatch.txt b/doc/build/text/minibatch.txt deleted file mode 100644 index f5f6a6201..000000000 --- a/doc/build/text/minibatch.txt +++ /dev/null @@ -1,5 +0,0 @@ - -Mini-batching in DyNet -********************** - -How to perform minibatching to improve efficiency diff --git a/doc/build/text/multiprocessing.txt b/doc/build/text/multiprocessing.txt deleted file mode 100644 index 1bea34782..000000000 --- a/doc/build/text/multiprocessing.txt +++ /dev/null @@ -1,7 +0,0 @@ - -Multi-processing in DyNet -************************* - -How to perform processing on multiple threads - -(TODO: create doc) diff --git a/doc/build/text/operations.txt b/doc/build/text/operations.txt deleted file mode 100644 index 11846efd6..000000000 --- a/doc/build/text/operations.txt +++ /dev/null @@ -1,7 +0,0 @@ - -DyNet Operations -**************** - -The various operations that you can use in building a DyNet graph - -TODO: Create documentation diff --git a/doc/build/text/optimizers.txt b/doc/build/text/optimizers.txt deleted file mode 100644 index f8249b996..000000000 --- a/doc/build/text/optimizers.txt +++ /dev/null @@ -1,13 +0,0 @@ - -DyNet Optimizers -**************** - -The various optimizers that you can use to tune your parameters - -class struct dynet::SimpleSGDTrainer - - Inherits from dynet::Trainer - -class struct dynet::MomentumSGDTrainer - - Inherits from dynet::Trainer diff --git a/doc/build/text/python.txt b/doc/build/text/python.txt deleted file mode 100644 index d8e81de15..000000000 --- a/doc/build/text/python.txt +++ /dev/null @@ -1,172 +0,0 @@ - -Installing the Python DyNet module. -*********************************** - -(for instructions on installing on a computer with GPU, see below) - -Python bindings to DyNet are currently only supported under python 2. - - -TL;DR -===== - -(see below for the details) - - # Installing python DyNet on a machine with python 2.7: - - pip install cython # if you don't have it already. - mkdir dynet-base - cd dynet-base - # getting dynet and eigen - git clone https://github.com/clab/dynet.git - hg clone https://bitbucket.org/eigen/eigen - cd dynet - mkdir build - cd build - # without GPU support: - cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` - # or with GPU support: - cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` -DBACKEND=cuda - - make -j 2 # replace 2 with the number of available cores - cd python - python setup.py install # or `python setup.py install --user` for a user-local install. - - -Detailed Instructions: -====================== - -First, get DyNet: - - cd $HOME - mkdir dynet-base - cd dynet-base - git clone https://github.com/clab/dynet.git - cd dynet - git submodule init # To be consistent with DyNet's installation instructions. - git submodule update # To be consistent with DyNet's installation instructions. - -Then get Eigen: - - cd $HOME - cd dynet-base - hg clone https://bitbucket.org/eigen/eigen/ - -We also need to make sure the "cython" module is installed. (you can -replace "pip" with your favorite package manager, such as "conda", or -install within a virtual environment) - - pip install cython - -To simplify the following steps, we can set a bash variable to hold -where we have saved the main directories of DyNet and Eigen. In case -you have gotten DyNet and Eigen differently from the instructions -above and saved them in different location(s), these variables will be -helpful: - - PATH_TO_DYNET=$HOME/dynet-base/dynet/ - PATH_TO_EIGEN=$HOME/dynet-base/eigen/ - -Compile DyNet. - -This is pretty much the same process as compiling DyNet, with the -addition of the "-DPYTHON=" flag, pointing to the location of your -python interpreter. - -If boost is installed in a non-standard location, you should add the -corresponding flags to the "cmake" commandline, see the DyNet -installation instructions page. - - cd $PATH_TO_DYNET - PATH_TO_PYTHON=`which python` - mkdir build - cd build - cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON - make -j 2 - -Assuming that the "cmake" command found all the needed libraries and -didn't fail, the "make" command will take a while, and compile dynet -as well as the python bindings. You can change "make -j 2" to a higher -number, depending on the available cores you want to use while -compiling. - -You now have a working python binding inside of "build/dynet". To -verify this is working: - - cd $PATH_TO_DYNET/build/python - python - -then, within python: - - import dynet as dy - print dy.__version__ - model = dy.Model() - -In order to install the module so that it is accessible from -everywhere in the system, run the following: - - cd $PATH_TO_DYNET/build/python - python setup.py install --user - -(the "--user" switch will install the module in your local site- -packages, and works without root privilages. To install the module to -the system site-packages (for all users), run "python setup.py -install" without this switch) - -You should now have a working python binding (the dynet module). - -Note however that the installation relies on the compiled dynet -library being in "$PATH_TO_DYNET/build/dynet", so make sure not to -move it from there. - -Now, check that everything works: - - # check that it works: - cd $PATH_TO_DYNET - cd pyexamples - python xor.py - python rnnlm.py rnnlm.py - -Alternatively, if the following script works for you, then your -installation is likely to be working: - - from dynet import * - model = Model() - - -Installing with GPU support -=========================== - -For installing on a computer with GPU, first install CUDA. The -following instructions assume CUDA is installed. - -The installation process is pretty much the same, while adding the -"-DBACKEND=cuda" flag to the "cmake" stage: - - cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON -DBACKEND=cuda - -(if CUDA is installed in a non-standard location and "cmake" cannot -find it, you can specify also -"-DCUDA_TOOLKIT_ROOT_DIR=/path/to/cuda".) - -Now, build the python modules (as above, we assume cython is -installed): - -After running "make -j 2", you should have the files "_dynet.so" and -"_gdynet.so" in the "build/python" folder. - -As before, "cd build/python" followed by "python setup.py install ---user" will install the module. - - -Using the GPU: -************** - -In order to use the GPU support, you can either: - -* Use "import _gdynet as dy" instead of "import dynet as dy" - -* Or, (preferred), "import dynet" as usual, but use the commandline - switch "--dynet-gpu" or the GPU switches detailed here when invoking - the program. This option lets the same code work with either the GPU - or the CPU version depending on how it is invoked. diff --git a/doc/build/text/tutorial.txt b/doc/build/text/tutorial.txt deleted file mode 100644 index 6960b5134..000000000 --- a/doc/build/text/tutorial.txt +++ /dev/null @@ -1,50 +0,0 @@ - -DyNet Tutorial -************** - -An illustration of how models are trained (for a simple logistic -regression model) is below: - - // *** First, we set up the structure of the model - // Create a model, and an SGD trainer to update its parameters. - Model mod; - SimpleSGDTrainer sgd(&mod); - // Create a "computation graph," which will define the flow of information. - ComputationGraph cg; - // Initialize a 1x3 parameter vector, and add the parameters to be part of the - // computation graph. - Expression W = parameter(cg, mod.add_parameters({1, 3})); - // Create variables defining the input and output of the regression, and load them - // into the computation graph. Note that we don't need to set concrete values yet. - vector x_values(3); - Expression x = input(cg, {3}, &x_values); - dynet::real y_value; - Expression y = input(cg, &y_value); - // Next, set up the structure to multiply the input by the weight vector, then run - // the output of this through a logistic sigmoid function (logistic regression). - Expression y_pred = logistic(W*x); - // Finally, we create a function to calculate the loss. The model will be optimized - // to minimize the value of the final function in the computation graph. - Expression l = binary_log_loss(y_pred, y); - // We are now done setting up the graph, and we can print out its structure: - cg.print_graphviz(); - - // *** Now, we perform a parameter update for a single example. - // Set the input/output to the values specified by the training data: - x_values = {0.5, 0.3, 0.7}; - y_value = 1.0; - // "forward" propagates values forward through the computation graph, and returns - // the loss. - dynet::real loss = as_scalar(cg.forward(l)); - // "backward" performs back-propagation, and accumulates the gradients of the - // parameters within the "Model" data structure. - cg.backward(l); - // "sgd.update" updates parameters of the model that was passed to its constructor. - // Here 1.0 is the scaling factor that allows us to control the size of the update. - sgd.update(1.0); - -Note that this very simple example that doesn't cover things like -memory initialization, reading/writing models, recurrent/LSTM -networks, or adding biases to functions. The best way to get an idea -of how to use DyNet for real is to look in the "example" directory, -particularly starting with the simplest "xor" example. diff --git a/doc/doxygen/html/annotated.html b/doc/doxygen/html/annotated.html deleted file mode 100644 index fc538d2f8..000000000 --- a/doc/doxygen/html/annotated.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - -Dynet: Class List - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - -
- -
-
- - -
- -
- -
-
-
Class List
-
-
-
Here are the classes, structs, unions and interfaces with brief descriptions:
-
[detail level 123]
- - - - - - - - - - -
 Ndynet
 Nexpr
 CExpression
 CAdadeltaTrainer
 CAdagradTrainer
 CAdamTrainer
 CMomentumSGDTrainer
 CRmsPropTrainer
 CSimpleSGDTrainer
 CTrainer
-
-
- - - - diff --git a/doc/doxygen/html/arrowdown.png b/doc/doxygen/html/arrowdown.png deleted file mode 100644 index 0b63f6d38c4b9ec907b820192ebe9724ed6eca22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 zcmVkw!R34#Lv2LOS^S2tZA31X++9RY}n zChwn@Z)Wz*WWHH{)HDtJnq&A2hk$b-y(>?@z0iHr41EKCGp#T5?07*qoM6N<$f(V3Pvj6}9 diff --git a/doc/doxygen/html/arrowright.png b/doc/doxygen/html/arrowright.png deleted file mode 100644 index c6ee22f937a07d1dbfc27c669d11f8ed13e2f152..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 229 zcmV^P)R?RzRoKvklcaQ%HF6%rK2&ZgO(-ihJ_C zzrKgp4jgO( fd_(yg|3PpEQb#9`a?Pz_00000NkvXXu0mjftR`5K diff --git a/doc/doxygen/html/bc_s.png b/doc/doxygen/html/bc_s.png deleted file mode 100644 index 224b29aa9847d5a4b3902efd602b7ddf7d33e6c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT diff --git a/doc/doxygen/html/bdwn.png b/doc/doxygen/html/bdwn.png deleted file mode 100644 index 940a0b950443a0bb1b216ac03c45b8a16c955452..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!3HEvS)PKZC{Gv1kP61Pb5HX&C2wk~_T - - - - - -Dynet: Class Index - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - -
- -
-
- - -
- -
- -
-
-
Class Index
-
-
-
A | E | M | R | S | T
- - - - - - - - -
  A  
-
AdamTrainer (dynet)   
  M  
-
  S  
-
  E  
-
AdadeltaTrainer (dynet)   MomentumSGDTrainer (dynet)   SimpleSGDTrainer (dynet)   
AdagradTrainer (dynet)   Expression (dynet::expr)   
  R  
-
  T  
-
RmsPropTrainer (dynet)   Trainer (dynet)   
-
A | E | M | R | S | T
-
- - - - diff --git a/doc/doxygen/html/closed.png b/doc/doxygen/html/closed.png deleted file mode 100644 index 98cc2c909da37a6df914fbf67780eebd99c597f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT diff --git a/doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f.html b/doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f.html deleted file mode 100644 index a4f984f3c..000000000 --- a/doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - -Dynet: /home/paul/dev/dynet/dynet Directory Reference - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - -
-
- - -
- -
- - -
-
-
-
dynet Directory Reference
-
-
-
-Directory dependency graph for dynet:
-
-
/home/paul/dev/dynet/dynet
- - -
- - - - - - -

-Files

file  expr.h [code]
 
file  training.h [code]
 
-
- - - - diff --git a/doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.map b/doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.map deleted file mode 100644 index 6e41aac98..000000000 --- a/doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 b/doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 deleted file mode 100644 index 97ea7dc67..000000000 --- a/doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 +++ /dev/null @@ -1 +0,0 @@ -2ff0d418dc0fde0b1f848ddc09d9ddb0 \ No newline at end of file diff --git a/doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.png b/doc/doxygen/html/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.png deleted file mode 100644 index 2c3eaa944ae3c84158f94fef390d8a87fb8f6a90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1087 zcmeAS@N?(olHy`uVBq!ia0vp^!9Z-y!3HGRMYov)DYhhUcNd2LAh=-f^2rPg%wIfR z978JRyqy#85gjgZpg!`^=>t}mjCw-_1>a`9-L`3w>rurmCqD2OpZl^fHKSHS8{d^EjQd=aLrw+xj1Oy-M0FdQC!^{!ZsYK_`bzD>C(Bi z^UXD$vx^@p_j~vATz`M{4$Jl#Ccc*gJPf{gEi%60r7^P!h$61BO`AUbgu#AE7w0R*doN&ZdtNIqT$aU6Xj*glRM7r+b365z5mF|H!2c; zT7}hb6s#Kuk>TRLe`$aH$3^`cH_o>xJ=J{rt7Uh$BEz{k zFVph!+CF|%u#0baef@ahZrPq*UxtGJ|CAwSH#V*>+-VaMy4OEzRc|x<{lgCnm;*vW znvPC7(kpGxRPgXn<(qGdXZZZr@jH9=xTj}j@8NcPrVFWje0AR8;riC)X`8Cc74^c^ z8xN!^FB6$QW9_}(2M3#5S9mdNXx!j#xS6wT*RH;c7vF1Y+&H~8JN)Ile`>4NpPk0% z5EK*?Qd3tqEp~TK;KtnBK}#;jo419eg@u`wzrWYnb$7S<()x94|4z7gQU1fvJtE@M zC(WBDc=dWp*ZgPS-U3r=y{gD1j#iVjG_jpUsZMoFua5}K?Cq6*T(a%a_x=w*J}NUc zp5AenZ|~m&jYdinMQ!GlNlEps`@Qe#)zU57>kl3}BoiDw`O5Y1OZWdzy|-`6myi;< z|80s!vuF2TzI3VU@JG$x-=04DxTW~po65a+bIgK6Lyu2ZuMZ0Td~nzM+t;o+78Myi zeVQK}9er?~ZT_R8(n(XN`W6;uo>5L%Y`E6;&8x3f8*jgDlkb1|A|n~-&3*eEosa)r z|EJbQ?VRL8MQ5=E;ve7KG~$>4cW!4f^Ox`S(_fUtb+zngWNkKIxuT+7*?pFVZms#n zmwQAw*Pod*sc6}9=T1N8mX`2mVNNGST!=$YcJ5E_>*0}{d3@Q!YipmsuRC^P%gvk! z9Wg0sX)}|RXMNn<-0oDIX`A(^e(^tBHzCzv0U+XDFfCV7?H?0!d*?*?hzaX}B?5z| LtDnm{r-UW|VG9Ij diff --git a/doc/doxygen/html/doc.png b/doc/doxygen/html/doc.png deleted file mode 100644 index 17edabff95f7b8da13c9516a04efe05493c29501..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 746 zcmV7=@pnbNXRFEm&G8P!&WHG=d)>K?YZ1bzou)2{$)) zumDct!>4SyxL;zgaG>wy`^Hv*+}0kUfCrz~BCOViSb$_*&;{TGGn2^x9K*!Sf0=lV zpP=7O;GA0*Jm*tTYj$IoXvimpnV4S1Z5f$p*f$Db2iq2zrVGQUz~yq`ahn7ck(|CE z7Gz;%OP~J6)tEZWDzjhL9h2hdfoU2)Nd%T<5Kt;Y0XLt&<@6pQx!nw*5`@bq#?l*?3z{Hlzoc=Pr>oB5(9i6~_&-}A(4{Q$>c>%rV&E|a(r&;?i5cQB=} zYSDU5nXG)NS4HEs0it2AHe2>shCyr7`6@4*6{r@8fXRbTA?=IFVWAQJL&H5H{)DpM#{W(GL+Idzf^)uRV@oB8u$ z8v{MfJbTiiRg4bza<41NAzrl{=3fl_D+$t+^!xlQ8S}{UtY`e z;;&9UhyZqQRN%2pot{*Ei0*4~hSF_3AH2@fKU!$NSflS>{@tZpDT4`M2WRTTVH+D? z)GFlEGGHe?koB}i|1w45!BF}N_q&^HJ&-tyR{(afC6H7|aml|tBBbv}55C5DNP8p3 z)~jLEO4Z&2hZmP^i-e%(@d!(E|KRafiU8Q5u(wU((j8un3OR*Hvj+t diff --git a/doc/doxygen/html/doxygen.css b/doc/doxygen/html/doxygen.css deleted file mode 100644 index a00083315..000000000 --- a/doc/doxygen/html/doxygen.css +++ /dev/null @@ -1,1449 +0,0 @@ -/* The standard CSS for doxygen 1.8.9.1 */ - -body, table, div, p, dl { - font: 400 14px/22px Roboto,sans-serif; -} - -/* @group Heading Levels */ - -h1.groupheader { - font-size: 150%; -} - -.title { - font: 400 14px/28px Roboto,sans-serif; - font-size: 150%; - font-weight: bold; - margin: 10px 2px; -} - -h2.groupheader { - border-bottom: 1px solid #879ECB; - color: #354C7B; - font-size: 150%; - font-weight: normal; - margin-top: 1.75em; - padding-top: 8px; - padding-bottom: 4px; - width: 100%; -} - -h3.groupheader { - font-size: 100%; -} - -h1, h2, h3, h4, h5, h6 { - -webkit-transition: text-shadow 0.5s linear; - -moz-transition: text-shadow 0.5s linear; - -ms-transition: text-shadow 0.5s linear; - -o-transition: text-shadow 0.5s linear; - transition: text-shadow 0.5s linear; - margin-right: 15px; -} - -h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { - text-shadow: 0 0 15px cyan; -} - -dt { - font-weight: bold; -} - -div.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; -} - -p.startli, p.startdd { - margin-top: 2px; -} - -p.starttd { - margin-top: 0px; -} - -p.endli { - margin-bottom: 0px; -} - -p.enddd { - margin-bottom: 4px; -} - -p.endtd { - margin-bottom: 2px; -} - -/* @end */ - -caption { - font-weight: bold; -} - -span.legend { - font-size: 70%; - text-align: center; -} - -h3.version { - font-size: 90%; - text-align: center; -} - -div.qindex, div.navtab{ - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; -} - -div.qindex, div.navpath { - width: 100%; - line-height: 140%; -} - -div.navtab { - margin-right: 15px; -} - -/* @group Link Styling */ - -a { - color: #3D578C; - font-weight: normal; - text-decoration: none; -} - -.contents a:visited { - color: #4665A2; -} - -a:hover { - text-decoration: underline; -} - -a.qindex { - font-weight: bold; -} - -a.qindexHL { - font-weight: bold; - background-color: #9CAFD4; - color: #ffffff; - border: 1px double #869DCA; -} - -.contents a.qindexHL:visited { - color: #ffffff; -} - -a.el { - font-weight: bold; -} - -a.elRef { -} - -a.code, a.code:visited, a.line, a.line:visited { - color: #4665A2; -} - -a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { - color: #4665A2; -} - -/* @end */ - -dl.el { - margin-left: -1cm; -} - -pre.fragment { - border: 1px solid #C4CFE5; - background-color: #FBFCFD; - padding: 4px 6px; - margin: 4px 8px 4px 2px; - overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; - font-family: monospace, fixed; - font-size: 105%; -} - -div.fragment { - padding: 4px 6px; - margin: 4px 8px 4px 2px; - background-color: #FBFCFD; - border: 1px solid #C4CFE5; -} - -div.line { - font-family: monospace, fixed; - font-size: 13px; - min-height: 13px; - line-height: 1.0; - text-wrap: unrestricted; - white-space: -moz-pre-wrap; /* Moz */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ - white-space: pre-wrap; /* CSS3 */ - word-wrap: break-word; /* IE 5.5+ */ - text-indent: -53px; - padding-left: 53px; - padding-bottom: 0px; - margin: 0px; - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: 0.5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: 0.5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: 0.5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: 0.5s; - transition-property: background-color, box-shadow; - transition-duration: 0.5s; -} - -div.line.glow { - background-color: cyan; - box-shadow: 0 0 10px cyan; -} - - -span.lineno { - padding-right: 4px; - text-align: right; - border-right: 2px solid #0F0; - background-color: #E8E8E8; - white-space: pre; -} -span.lineno a { - background-color: #D8D8D8; -} - -span.lineno a:hover { - background-color: #C8C8C8; -} - -div.ah, span.ah { - background-color: black; - font-weight: bold; - color: #ffffff; - margin-bottom: 3px; - margin-top: 3px; - padding: 0.2em; - border: solid thin #333; - border-radius: 0.5em; - -webkit-border-radius: .5em; - -moz-border-radius: .5em; - box-shadow: 2px 2px 3px #999; - -webkit-box-shadow: 2px 2px 3px #999; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); - background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); -} - -div.classindex ul { - list-style: none; - padding-left: 0; -} - -div.classindex span.ai { - display: inline-block; -} - -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - font-weight: bold; -} - -div.groupText { - margin-left: 16px; - font-style: italic; -} - -body { - background-color: white; - color: black; - margin: 0; -} - -div.contents { - margin-top: 10px; - margin-left: 12px; - margin-right: 8px; -} - -td.indexkey { - background-color: #EBEFF6; - font-weight: bold; - border: 1px solid #C4CFE5; - margin: 2px 0px 2px 0; - padding: 2px 10px; - white-space: nowrap; - vertical-align: top; -} - -td.indexvalue { - background-color: #EBEFF6; - border: 1px solid #C4CFE5; - padding: 2px 10px; - margin: 2px 0px; -} - -tr.memlist { - background-color: #EEF1F7; -} - -p.formulaDsp { - text-align: center; -} - -img.formulaDsp { - -} - -img.formulaInl { - vertical-align: middle; -} - -div.center { - text-align: center; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; -} - -div.center img { - border: 0px; -} - -address.footer { - text-align: right; - padding-right: 12px; -} - -img.footer { - border: 0px; - vertical-align: middle; -} - -/* @group Code Colorization */ - -span.keyword { - color: #008000 -} - -span.keywordtype { - color: #604020 -} - -span.keywordflow { - color: #e08000 -} - -span.comment { - color: #800000 -} - -span.preprocessor { - color: #806020 -} - -span.stringliteral { - color: #002080 -} - -span.charliteral { - color: #008080 -} - -span.vhdldigit { - color: #ff00ff -} - -span.vhdlchar { - color: #000000 -} - -span.vhdlkeyword { - color: #700070 -} - -span.vhdllogic { - color: #ff0000 -} - -blockquote { - background-color: #F7F8FB; - border-left: 2px solid #9CAFD4; - margin: 0 24px 0 4px; - padding: 0 12px 0 16px; -} - -/* @end */ - -/* -.search { - color: #003399; - font-weight: bold; -} - -form.search { - margin-bottom: 0px; - margin-top: 0px; -} - -input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; -} -*/ - -td.tiny { - font-size: 75%; -} - -.dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid #A3B4D7; -} - -th.dirtab { - background: #EBEFF6; - font-weight: bold; -} - -hr { - height: 0px; - border: none; - border-top: 1px solid #4A6AAA; -} - -hr.footer { - height: 1px; -} - -/* @group Member Descriptions */ - -table.memberdecls { - border-spacing: 0px; - padding: 0px; -} - -.memberdecls td, .fieldtable tr { - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: 0.5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: 0.5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: 0.5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: 0.5s; - transition-property: background-color, box-shadow; - transition-duration: 0.5s; -} - -.memberdecls td.glow, .fieldtable tr.glow { - background-color: cyan; - box-shadow: 0 0 15px cyan; -} - -.mdescLeft, .mdescRight, -.memItemLeft, .memItemRight, -.memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: #F9FAFC; - border: none; - margin: 4px; - padding: 1px 0 0 8px; -} - -.mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: #555; -} - -.memSeparator { - border-bottom: 1px solid #DEE4F0; - line-height: 1px; - margin: 0px; - padding: 0px; -} - -.memItemLeft, .memTemplItemLeft { - white-space: nowrap; -} - -.memItemRight { - width: 100%; -} - -.memTemplParams { - color: #4665A2; - white-space: nowrap; - font-size: 80%; -} - -/* @end */ - -/* @group Member Details */ - -/* Styles for detailed member documentation */ - -.memtemplate { - font-size: 80%; - color: #4665A2; - font-weight: normal; - margin-left: 9px; -} - -.memnav { - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} - -.mempage { - width: 100%; -} - -.memitem { - padding: 0; - margin-bottom: 10px; - margin-right: 5px; - -webkit-transition: box-shadow 0.5s linear; - -moz-transition: box-shadow 0.5s linear; - -ms-transition: box-shadow 0.5s linear; - -o-transition: box-shadow 0.5s linear; - transition: box-shadow 0.5s linear; - display: table !important; - width: 100%; -} - -.memitem.glow { - box-shadow: 0 0 15px cyan; -} - -.memname { - font-weight: bold; - margin-left: 6px; -} - -.memname td { - vertical-align: bottom; -} - -.memproto, dl.reflist dt { - border-top: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - padding: 6px 0px 6px 0px; - color: #253555; - font-weight: bold; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - background-image:url('nav_f.png'); - background-repeat:repeat-x; - background-color: #E2E8F2; - /* opera specific markup */ - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - border-top-right-radius: 4px; - border-top-left-radius: 4px; - /* firefox specific markup */ - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - -moz-border-radius-topright: 4px; - -moz-border-radius-topleft: 4px; - /* webkit specific markup */ - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -webkit-border-top-right-radius: 4px; - -webkit-border-top-left-radius: 4px; - -} - -.memdoc, dl.reflist dd { - border-bottom: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - padding: 6px 10px 2px 10px; - background-color: #FBFCFD; - border-top-width: 0; - background-image:url('nav_g.png'); - background-repeat:repeat-x; - background-color: #FFFFFF; - /* opera specific markup */ - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - /* firefox specific markup */ - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-bottomright: 4px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - /* webkit specific markup */ - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -} - -dl.reflist dt { - padding: 5px; -} - -dl.reflist dd { - margin: 0px 0px 10px 0px; - padding: 5px; -} - -.paramkey { - text-align: right; -} - -.paramtype { - white-space: nowrap; -} - -.paramname { - color: #602020; - white-space: nowrap; -} -.paramname em { - font-style: normal; -} -.paramname code { - line-height: 14px; -} - -.params, .retval, .exception, .tparams { - margin-left: 0px; - padding-left: 0px; -} - -.params .paramname, .retval .paramname { - font-weight: bold; - vertical-align: top; -} - -.params .paramtype { - font-style: italic; - vertical-align: top; -} - -.params .paramdir { - font-family: "courier new",courier,monospace; - vertical-align: top; -} - -table.mlabels { - border-spacing: 0px; -} - -td.mlabels-left { - width: 100%; - padding: 0px; -} - -td.mlabels-right { - vertical-align: bottom; - padding: 0px; - white-space: nowrap; -} - -span.mlabels { - margin-left: 8px; -} - -span.mlabel { - background-color: #728DC1; - border-top:1px solid #5373B4; - border-left:1px solid #5373B4; - border-right:1px solid #C4CFE5; - border-bottom:1px solid #C4CFE5; - text-shadow: none; - color: white; - margin-right: 4px; - padding: 2px 3px; - border-radius: 3px; - font-size: 7pt; - white-space: nowrap; - vertical-align: middle; -} - - - -/* @end */ - -/* these are for tree view inside a (index) page */ - -div.directory { - margin: 10px 0px; - border-top: 1px solid #9CAFD4; - border-bottom: 1px solid #9CAFD4; - width: 100%; -} - -.directory table { - border-collapse:collapse; -} - -.directory td { - margin: 0px; - padding: 0px; - vertical-align: top; -} - -.directory td.entry { - white-space: nowrap; - padding-right: 6px; - padding-top: 3px; -} - -.directory td.entry a { - outline:none; -} - -.directory td.entry a img { - border: none; -} - -.directory td.desc { - width: 100%; - padding-left: 6px; - padding-right: 6px; - padding-top: 3px; - border-left: 1px solid rgba(0,0,0,0.05); -} - -.directory tr.even { - padding-left: 6px; - background-color: #F7F8FB; -} - -.directory img { - vertical-align: -30%; -} - -.directory .levels { - white-space: nowrap; - width: 100%; - text-align: right; - font-size: 9pt; -} - -.directory .levels span { - cursor: pointer; - padding-left: 2px; - padding-right: 2px; - color: #3D578C; -} - -.arrow { - color: #9CAFD4; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - cursor: pointer; - font-size: 80%; - display: inline-block; - width: 16px; - height: 22px; -} - -.icon { - font-family: Arial, Helvetica; - font-weight: bold; - font-size: 12px; - height: 14px; - width: 16px; - display: inline-block; - background-color: #728DC1; - color: white; - text-align: center; - border-radius: 4px; - margin-left: 2px; - margin-right: 2px; -} - -.icona { - width: 24px; - height: 22px; - display: inline-block; -} - -.iconfopen { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:url('folderopen.png'); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -.iconfclosed { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:url('folderclosed.png'); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -.icondoc { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:url('doc.png'); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -table.directory { - font: 400 14px Roboto,sans-serif; -} - -/* @end */ - -div.dynheader { - margin-top: 8px; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -address { - font-style: normal; - color: #2A3D61; -} - -table.doxtable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.doxtable td, table.doxtable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -table.doxtable th { - background-color: #374F7F; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -table.fieldtable { - /*width: 100%;*/ - margin-bottom: 10px; - border: 1px solid #A8B8D9; - border-spacing: 0px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); - box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); -} - -.fieldtable td, .fieldtable th { - padding: 3px 7px 2px; -} - -.fieldtable td.fieldtype, .fieldtable td.fieldname { - white-space: nowrap; - border-right: 1px solid #A8B8D9; - border-bottom: 1px solid #A8B8D9; - vertical-align: top; -} - -.fieldtable td.fieldname { - padding-top: 3px; -} - -.fieldtable td.fielddoc { - border-bottom: 1px solid #A8B8D9; - /*width: 100%;*/ -} - -.fieldtable td.fielddoc p:first-child { - margin-top: 0px; -} - -.fieldtable td.fielddoc p:last-child { - margin-bottom: 2px; -} - -.fieldtable tr:last-child td { - border-bottom: none; -} - -.fieldtable th { - background-image:url('nav_f.png'); - background-repeat:repeat-x; - background-color: #E2E8F2; - font-size: 90%; - color: #253555; - padding-bottom: 4px; - padding-top: 5px; - text-align:left; - -moz-border-radius-topleft: 4px; - -moz-border-radius-topright: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom: 1px solid #A8B8D9; -} - - -.tabsearch { - top: 0px; - left: 10px; - height: 36px; - background-image: url('tab_b.png'); - z-index: 101; - overflow: hidden; - font-size: 13px; -} - -.navpath ul -{ - font-size: 11px; - background-image:url('tab_b.png'); - background-repeat:repeat-x; - background-position: 0 -5px; - height:30px; - line-height:30px; - color:#8AA0CC; - border:solid 1px #C2CDE4; - overflow:hidden; - margin:0px; - padding:0px; -} - -.navpath li -{ - list-style-type:none; - float:left; - padding-left:10px; - padding-right:15px; - background-image:url('bc_s.png'); - background-repeat:no-repeat; - background-position:right; - color:#364D7C; -} - -.navpath li.navelem a -{ - height:32px; - display:block; - text-decoration: none; - outline: none; - color: #283A5D; - font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - text-decoration: none; -} - -.navpath li.navelem a:hover -{ - color:#6884BD; -} - -.navpath li.footer -{ - list-style-type:none; - float:right; - padding-left:10px; - padding-right:15px; - background-image:none; - background-repeat:no-repeat; - background-position:right; - color:#364D7C; - font-size: 8pt; -} - - -div.summary -{ - float: right; - font-size: 8pt; - padding-right: 5px; - width: 50%; - text-align: right; -} - -div.summary a -{ - white-space: nowrap; -} - -div.ingroups -{ - font-size: 8pt; - width: 50%; - text-align: left; -} - -div.ingroups a -{ - white-space: nowrap; -} - -div.header -{ - background-image:url('nav_h.png'); - background-repeat:repeat-x; - background-color: #F9FAFC; - margin: 0px; - border-bottom: 1px solid #C4CFE5; -} - -div.headertitle -{ - padding: 5px 5px 5px 10px; -} - -dl -{ - padding: 0 0 0 10px; -} - -/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */ -dl.section -{ - margin-left: 0px; - padding-left: 0px; -} - -dl.note -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #D0C000; -} - -dl.warning, dl.attention -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #FF0000; -} - -dl.pre, dl.post, dl.invariant -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #00D000; -} - -dl.deprecated -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #505050; -} - -dl.todo -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #00C0E0; -} - -dl.test -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #3030E0; -} - -dl.bug -{ - margin-left:-7px; - padding-left: 3px; - border-left:4px solid; - border-color: #C08050; -} - -dl.section dd { - margin-bottom: 6px; -} - - -#projectlogo -{ - text-align: center; - vertical-align: bottom; - border-collapse: separate; -} - -#projectlogo img -{ - border: 0px none; -} - -#projectname -{ - font: 300% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 2px 0px; -} - -#projectbrief -{ - font: 120% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#projectnumber -{ - font: 50% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#titlearea -{ - padding: 0px; - margin: 0px; - width: 100%; - border-bottom: 1px solid #5373B4; -} - -.image -{ - text-align: center; -} - -.dotgraph -{ - text-align: center; -} - -.mscgraph -{ - text-align: center; -} - -.diagraph -{ - text-align: center; -} - -.caption -{ - font-weight: bold; -} - -div.zoom -{ - border: 1px solid #90A5CE; -} - -dl.citelist { - margin-bottom:50px; -} - -dl.citelist dt { - color:#334975; - float:left; - font-weight:bold; - margin-right:10px; - padding:5px; -} - -dl.citelist dd { - margin:2px 0; - padding:5px 0; -} - -div.toc { - padding: 14px 25px; - background-color: #F4F6FA; - border: 1px solid #D8DFEE; - border-radius: 7px 7px 7px 7px; - float: right; - height: auto; - margin: 0 20px 10px 10px; - width: 200px; -} - -div.toc li { - background: url("bdwn.png") no-repeat scroll 0 5px transparent; - font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; - margin-top: 5px; - padding-left: 10px; - padding-top: 2px; -} - -div.toc h3 { - font: bold 12px/1.2 Arial,FreeSans,sans-serif; - color: #4665A2; - border-bottom: 0 none; - margin: 0; -} - -div.toc ul { - list-style: none outside none; - border: medium none; - padding: 0px; -} - -div.toc li.level1 { - margin-left: 0px; -} - -div.toc li.level2 { - margin-left: 15px; -} - -div.toc li.level3 { - margin-left: 30px; -} - -div.toc li.level4 { - margin-left: 45px; -} - -.inherit_header { - font-weight: bold; - color: gray; - cursor: pointer; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.inherit_header td { - padding: 6px 0px 2px 5px; -} - -.inherit { - display: none; -} - -tr.heading h2 { - margin-top: 12px; - margin-bottom: 4px; -} - -/* tooltip related style info */ - -.ttc { - position: absolute; - display: none; -} - -#powerTip { - cursor: default; - white-space: nowrap; - background-color: white; - border: 1px solid gray; - border-radius: 4px 4px 4px 4px; - box-shadow: 1px 1px 7px gray; - display: none; - font-size: smaller; - max-width: 80%; - opacity: 0.9; - padding: 1ex 1em 1em; - position: absolute; - z-index: 2147483647; -} - -#powerTip div.ttdoc { - color: grey; - font-style: italic; -} - -#powerTip div.ttname a { - font-weight: bold; -} - -#powerTip div.ttname { - font-weight: bold; -} - -#powerTip div.ttdeci { - color: #006318; -} - -#powerTip div { - margin: 0px; - padding: 0px; - font: 12px/16px Roboto,sans-serif; -} - -#powerTip:before, #powerTip:after { - content: ""; - position: absolute; - margin: 0px; -} - -#powerTip.n:after, #powerTip.n:before, -#powerTip.s:after, #powerTip.s:before, -#powerTip.w:after, #powerTip.w:before, -#powerTip.e:after, #powerTip.e:before, -#powerTip.ne:after, #powerTip.ne:before, -#powerTip.se:after, #powerTip.se:before, -#powerTip.nw:after, #powerTip.nw:before, -#powerTip.sw:after, #powerTip.sw:before { - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; -} - -#powerTip.n:after, #powerTip.s:after, -#powerTip.w:after, #powerTip.e:after, -#powerTip.nw:after, #powerTip.ne:after, -#powerTip.sw:after, #powerTip.se:after { - border-color: rgba(255, 255, 255, 0); -} - -#powerTip.n:before, #powerTip.s:before, -#powerTip.w:before, #powerTip.e:before, -#powerTip.nw:before, #powerTip.ne:before, -#powerTip.sw:before, #powerTip.se:before { - border-color: rgba(128, 128, 128, 0); -} - -#powerTip.n:after, #powerTip.n:before, -#powerTip.ne:after, #powerTip.ne:before, -#powerTip.nw:after, #powerTip.nw:before { - top: 100%; -} - -#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { - border-top-color: #ffffff; - border-width: 10px; - margin: 0px -10px; -} -#powerTip.n:before { - border-top-color: #808080; - border-width: 11px; - margin: 0px -11px; -} -#powerTip.n:after, #powerTip.n:before { - left: 50%; -} - -#powerTip.nw:after, #powerTip.nw:before { - right: 14px; -} - -#powerTip.ne:after, #powerTip.ne:before { - left: 14px; -} - -#powerTip.s:after, #powerTip.s:before, -#powerTip.se:after, #powerTip.se:before, -#powerTip.sw:after, #powerTip.sw:before { - bottom: 100%; -} - -#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { - border-bottom-color: #ffffff; - border-width: 10px; - margin: 0px -10px; -} - -#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { - border-bottom-color: #808080; - border-width: 11px; - margin: 0px -11px; -} - -#powerTip.s:after, #powerTip.s:before { - left: 50%; -} - -#powerTip.sw:after, #powerTip.sw:before { - right: 14px; -} - -#powerTip.se:after, #powerTip.se:before { - left: 14px; -} - -#powerTip.e:after, #powerTip.e:before { - left: 100%; -} -#powerTip.e:after { - border-left-color: #ffffff; - border-width: 10px; - top: 50%; - margin-top: -10px; -} -#powerTip.e:before { - border-left-color: #808080; - border-width: 11px; - top: 50%; - margin-top: -11px; -} - -#powerTip.w:after, #powerTip.w:before { - right: 100%; -} -#powerTip.w:after { - border-right-color: #ffffff; - border-width: 10px; - top: 50%; - margin-top: -10px; -} -#powerTip.w:before { - border-right-color: #808080; - border-width: 11px; - top: 50%; - margin-top: -11px; -} - -@media print -{ - #top { display: none; } - #side-nav { display: none; } - #nav-path { display: none; } - body { overflow:visible; } - h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } - .summary { display: none; } - .memitem { page-break-inside: avoid; } - #doc-content - { - margin-left:0 !important; - height:auto !important; - width:auto !important; - overflow:inherit; - display:inline; - } -} - diff --git a/doc/doxygen/html/doxygen.png b/doc/doxygen/html/doxygen.png deleted file mode 100644 index 3ff17d807fd8aa003bed8bb2a69e8f0909592fd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3779 zcmV;!4m|ORP)tMIv#Q0*~7*`IBSO7_x;@a8#Zk6_PeKR_s92J&)(m+);m9Iz3blw)z#Gi zP!9lj4$%+*>Hz@HCmM9L9|8c+0u=!H$O3?R0Kgx|#WP<6fKfC8fM-CQZT|_r@`>VO zX^Hgb|9cJqpdJA5$MCEK`F_2@2Y@s>^+;pF`~jdI0Pvr|vl4`=C)EH@1IFe7pdJ8F zH(qGi004~QnF)Ggga~8v08kGAs2hKTATxr7pwfNk|4#_AaT>w8P6TV+R2kbS$v==} zAjf`s0g#V8lB+b3)5oEI*q+{Yt$MZDruD2^;$+(_%Qn+%v0X-bJO=;@kiJ^ygLBnC z?1OVv_%aex1M@jKU|Z~$eI?PoF4Vj>fDzyo zAiLfpXY*a^Sj-S5D0S3@#V$sRW)g)_1e#$%8xdM>Jm7?!h zu0P2X=xoN>^!4DoPRgph2(2va07yfpXF+WH7EOg1GY%Zn z7~1A<(z7Q$ktEXhW_?GMpHp9l_UL18F3KOsxu81pqoBiNbFSGsof-W z6~eloMoz=4?OOnl2J268x5rOY`dCk0us(uS#Ud4yqOr@?=Q57a}tit|BhY>}~frH1sP`ScHS_d)oqH^lYy zZ%VP`#10MlE~P?cE(%(#(AUSv_T{+;t@$U}El}(1ig`vZo`Rm;+5&(AYzJ^Ae=h2X z@Re%vHwZU>|f0NI&%$*4eJweC5OROQrpPMA@*w|o z()A==l}(@bv^&>H1Ob3C=<^|hob?0+xJ?QQ3-ueQC}zy&JQNib!OqSO@-=>XzxlSF zAZ^U*1l6EEmg3r};_HY>&Jo_{dOPEFTWPmt=U&F#+0(O59^UIlHbNX+eF8UzyDR*T z(=5X$VF3!gm@RooS-&iiUYGG^`hMR(07zr_xP`d!^BH?uD>Phl8Rdifx3Af^Zr`Ku ztL+~HkVeL#bJ)7;`=>;{KNRvjmc}1}c58Sr#Treq=4{xo!ATy|c>iRSp4`dzMMVd@ zL8?uwXDY}Wqgh4mH`|$BTXpUIu6A1-cSq%hJw;@^Zr8TP=GMh*p(m(tN7@!^D~sl$ zz^tf4II4|};+irE$Fnm4NTc5%p{PRA`%}Zk`CE5?#h3|xcyQsS#iONZ z6H(@^i9td!$z~bZiJLTax$o>r(p}3o@< zyD7%(>ZYvy=6$U3e!F{Z`uSaYy`xQyl?b{}eg|G3&fz*`QH@mDUn)1%#5u`0m$%D} z?;tZ0u(mWeMV0QtzjgN!lT*pNRj;6510Wwx?Yi_=tYw|J#7@(Xe7ifDzXuK;JB;QO z#bg~K$cgm$@{QiL_3yr}y&~wuv=P=#O&Tj=Sr)aCUlYmZMcw?)T?c%0rUe1cS+o!qs_ zQ6Gp)-{)V!;=q}llyK3|^WeLKyjf%y;xHku;9(vM!j|~<7w1c*Mk-;P{T&yG) z@C-8E?QPynNQ<8f01D`2qexcVEIOU?y}MG)TAE6&VT5`rK8s(4PE;uQ92LTXUQ<>^ ztyQ@=@kRdh@ebUG^Z6NWWIL;_IGJ2ST>$t!$m$qvtj0Qmw8moN6GUV^!QKNK zHBXCtUH8)RY9++gH_TUV4^=-j$t}dD3qsN7GclJ^Zc&(j6&a_!$jCf}%c5ey`pm~1)@{yI3 zTdWyB+*X{JFw#z;PwRr5evb2!ueWF;v`B0HoUu4-(~aL=z;OXUUEtG`_$)Oxw6FKg zEzY`CyKaSBK3xt#8gA|r_|Kehn_HYVBMpEwbn9-fI*!u*eTA1ef8Mkl1=!jV4oYwWYM}i`A>_F4nhmlCIC6WLa zY%;4&@AlnaG11ejl61Jev21|r*m+?Kru3;1tFDl}#!OzUp6c>go4{C|^erwpG*&h6bspUPJag}oOkN2912Y3I?(eRc@U9>z#HPBHC?nps7H5!zP``90!Q1n80jo+B3TWXp!8Pe zwuKuLLI6l3Gv@+QH*Y}2wPLPQ1^EZhT#+Ed8q8Wo z1pTmIBxv14-{l&QVKxAyQF#8Q@NeJwWdKk>?cpiJLkJr+aZ!Me+Cfp!?FWSRf^j2k z73BRR{WSKaMkJ>1Nbx5dan5hg^_}O{Tj6u%iV%#QGz0Q@j{R^Ik)Z*+(YvY2ziBG)?AmJa|JV%4UT$k`hcOg5r9R?5>?o~JzK zJCrj&{i#hG>N7!B4kNX(%igb%kDj0fOQThC-8mtfap82PNRXr1D>lbgg)dYTQ(kbx z`Ee5kXG~Bh+BHQBf|kJEy6(ga%WfhvdQNDuOfQoe377l#ht&DrMGeIsI5C<&ai zWG$|hop2@@q5YDa)_-A?B02W;#fH!%k`daQLEItaJJ8Yf1L%8x;kg?)k)00P-lH+w z)5$QNV6r2$YtnV(4o=0^3{kmaXn*Dm0F*fU(@o)yVVjk|ln8ea6BMy%vZAhW9|wvA z8RoDkVoMEz1d>|5(k0Nw>22ZT){V<3$^C-cN+|~hKt2)){+l-?3m@-$c?-dlzQ)q- zZ)j%n^gerV{|+t}9m1_&&Ly!9$rtG4XX|WQ8`xYzGC~U@nYh~g(z9)bdAl#xH)xd5a=@|qql z|FzEil{P5(@gy!4ek05i$>`E^G~{;pnf6ftpLh$h#W?^#4UkPfa;;?bsIe&kz!+40 zI|6`F2n020)-r`pFaZ38F!S-lJM-o&inOw|66=GMeP@xQU5ghQH{~5Uh~TMTd;I9` z>YhVB`e^EVj*S7JF39ZgNf}A-0DwOcTT63ydN$I3b?yBQtUI*_fae~kPvzoD$zjX3 zoqBe#>12im4WzZ=f^4+u=!lA|#r%1`WB0-6*3BL#at`47#ebPpR|D1b)3BjT34nYY z%Ds%d?5$|{LgOIaRO{{oC&RK`O91$fqwM0(C_TALcozu*fWHb%%q&p-q{_8*2Zsi^ zh1ZCnr^UYa;4vQEtHk{~zi>wwMC5o{S=$P0X681y`SXwFH?Ewn{x-MOZynmc)JT5v zuHLwh;tLfxRrr%|k370}GofLl7thg>ACWWY&msqaVu&ry+`7+Ss>NL^%T1|z{IGMA zW-SKl=V-^{(f!Kf^#3(|T2W47d(%JVCI4JgRrT1pNz>+ietmFToNv^`gzC@&O-)+i zPQ~RwK8%C_vf%;%e>NyTp~dM5;!C|N0Q^6|CEb7Bw=Vz~$1#FA;Z*?mKSC)Hl-20s t8QyHj(g6VK0RYbl8UjE)0O0w=e*@m04r>stuEhWV002ovPDHLkV1hl;dM*F} diff --git a/doc/doxygen/html/dynsections.js b/doc/doxygen/html/dynsections.js deleted file mode 100644 index 85e183690..000000000 --- a/doc/doxygen/html/dynsections.js +++ /dev/null @@ -1,97 +0,0 @@ -function toggleVisibility(linkObj) -{ - var base = $(linkObj).attr('id'); - var summary = $('#'+base+'-summary'); - var content = $('#'+base+'-content'); - var trigger = $('#'+base+'-trigger'); - var src=$(trigger).attr('src'); - if (content.is(':visible')===true) { - content.hide(); - summary.show(); - $(linkObj).addClass('closed').removeClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); - } else { - content.show(); - summary.hide(); - $(linkObj).removeClass('closed').addClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); - } - return false; -} - -function updateStripes() -{ - $('table.directory tr'). - removeClass('even').filter(':visible:even').addClass('even'); -} - -function toggleLevel(level) -{ - $('table.directory tr').each(function() { - var l = this.id.split('_').length-1; - var i = $('#img'+this.id.substring(3)); - var a = $('#arr'+this.id.substring(3)); - if (l - - - - - -Dynet: /home/paul/dev/dynet/dynet/expr.h Source File - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
-
-
expr.h
-
-
-
1 #ifndef DYNET_EXPR_H
-
2 #define DYNET_EXPR_H
-
3 
-
4 #include "dynet/dynet.h"
-
5 #include "dynet/nodes.h"
-
6 #include "dynet/nodes-contract.h"
-
7 
-
8 namespace dynet { namespace expr {
-
9 
-
10 struct Expression {
-
11  ComputationGraph *pg;
-
12  VariableIndex i;
-
13 
-
14  Expression() : pg(nullptr) { }
-
15  Expression(ComputationGraph *pg, VariableIndex i) : pg(pg), i(i) { }
-
16  const Tensor& value() const { return pg->get_value(i); }
-
17 };
-
18 
-
19 
-
20 Expression input(ComputationGraph& g, real s);
-
21 Expression input(ComputationGraph& g, const real *ps);
-
22 Expression input(ComputationGraph& g, const Dim& d, const std::vector<float>& data);
-
23 Expression input(ComputationGraph& g, const Dim& d, const std::vector<float>* pdata);
-
24 Expression input(ComputationGraph& g, const Dim& d, const std::vector<unsigned int>& ids, const std::vector<float>& data, float defdata = 0.f);
-
25 Expression parameter(ComputationGraph& g, Parameter p);
-
26 Expression const_parameter(ComputationGraph& g, Parameter p);
-
27 Expression lookup(ComputationGraph& g, LookupParameter p, unsigned index);
-
28 Expression lookup(ComputationGraph& g, LookupParameter p, const unsigned* pindex);
-
29 Expression const_lookup(ComputationGraph& g, LookupParameter p, unsigned index);
-
30 Expression const_lookup(ComputationGraph& g, LookupParameter p, const unsigned* pindex);
-
31 // Batched versions of lookup and const_lookup
-
32 Expression lookup(ComputationGraph& g, LookupParameter p, const std::vector<unsigned>& indices);
-
33 Expression lookup(ComputationGraph& g, LookupParameter p, const std::vector<unsigned>* pindices);
-
34 Expression const_lookup(ComputationGraph& g, LookupParameter p, const std::vector<unsigned>& indices);
-
35 Expression const_lookup(ComputationGraph& g, LookupParameter p, const std::vector<unsigned>* pindices);
-
36 Expression zeroes(ComputationGraph& g, const Dim& d);
-
37 
-
38 // special functions for controlling flow of information in graph
-
39 Expression nobackprop(const Expression& x);
-
40 
-
41 // operators
-
42 Expression operator-(const Expression& x);
-
43 Expression operator+(const Expression& x, const Expression& y);
-
44 Expression operator+(const Expression& x, real y);
-
45 Expression operator+(real x, const Expression& y);
-
46 Expression operator-(const Expression& x, const Expression& y);
-
47 Expression operator-(real x, const Expression& y);
-
48 Expression operator-(const Expression& x, real y);
-
49 Expression operator*(const Expression& x, const Expression& y);
-
50 Expression operator*(const Expression& x, float y);
-
51 inline Expression operator*(float y, const Expression& x) { return x * y; }
-
52 inline Expression operator/(const Expression& x, float y) { return x * (1.f / y); }
-
53 // colwise addition
-
54 Expression addmv(const Expression& M, const Expression& v);
-
55 // componentwise division
-
56 Expression cdiv(const Expression& x, const Expression& y);
-
57 Expression colwise_add(const Expression& x, const Expression& bias);
-
58 // z_ij = x_ijk * y_k
-
59 Expression contract3d_1d(const Expression& x, const Expression& y);
-
60 // z_i = x_ijk * y_k * z_j (+ b_i)
-
61 Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z);
-
62 Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z, const Expression& b);
-
63 // z_ij = x_ijk * y_k + b_ij
-
64 Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b);
-
65 
-
66 Expression sqrt(const Expression& x);
-
67 Expression erf(const Expression& x);
-
68 Expression tanh(const Expression& x);
-
69 Expression exp(const Expression& x);
-
70 Expression square(const Expression& x);
-
71 Expression cube(const Expression& x);
-
72 Expression lgamma(const Expression& x);
-
73 Expression log(const Expression& x);
-
74 Expression logistic(const Expression& x);
-
75 Expression rectify(const Expression& x);
-
76 Expression hinge(const Expression& x, unsigned index, float m = 1.0);
-
77 Expression hinge(const Expression& x, const std::vector<unsigned> & indices, float m = 1.0);
-
78 Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0);
-
79 Expression hinge(const Expression& x, const std::vector<unsigned> * pindices, float m = 1.0);
-
80 Expression log_softmax(const Expression& x);
-
81 Expression sparsemax(const Expression& x);
-
82 Expression log_softmax(const Expression& x, const std::vector<unsigned>& restriction);
-
83 Expression sparsemax(const Expression& x);
-
84 Expression sparsemax_loss(const Expression& x, const std::vector<unsigned>& target_support);
-
85 Expression sparsemax_loss(const Expression& x, const std::vector<unsigned>* ptarget_support);
-
86 Expression softmax(const Expression& x);
-
87 Expression softsign(const Expression& x);
-
88 Expression pow(const Expression& x, const Expression& y);
-
89 Expression min(const Expression& x, const Expression& y);
-
90 Expression max(const Expression& x, const Expression& y);
-
91 Expression noise(const Expression& x, real stddev);
-
92 Expression dropout(const Expression& x, real p);
-
93 Expression block_dropout(const Expression& x, real p);
-
94 
-
95 // reshape::forward is O(1), but backward is O(n)
-
96 Expression reshape(const Expression& x, const Dim& d);
-
97 // transpose requires O(n)
-
98 Expression transpose(const Expression& x);
-
99 Expression select_rows(const Expression& x, const std::vector<unsigned>& rows);
-
100 Expression select_rows(const Expression& x, const std::vector<unsigned>* prows);
-
101 // select_cols is more efficient than select_rows since Eigen uses column-major order
-
102 Expression select_cols(const Expression& x, const std::vector<unsigned>& cols);
-
103 Expression select_cols(const Expression& x, const std::vector<unsigned>* pcols);
-
104 // matrix inverse
-
105 Expression inverse(const Expression& x);
-
106 Expression logdet(const Expression& x);
-
107 
-
108 Expression trace_of_product(const Expression& x, const Expression& y);
-
109 Expression cwise_multiply(const Expression& x, const Expression& y);
-
110 
-
111 Expression squared_norm(const Expression& x);
-
112 Expression dot_product(const Expression& x, const Expression& y);
-
113 Expression squared_distance(const Expression& x, const Expression& y);
-
114 Expression huber_distance(const Expression& x, const Expression& y, float c = 1.345f);
-
115 Expression l1_distance(const Expression& x, const Expression& y);
-
116 Expression binary_log_loss(const Expression& x, const Expression& y);
-
117 Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0);
-
118 Expression poisson_loss(const Expression& x, unsigned y);
-
119 Expression poisson_loss(const Expression& x, const unsigned* py);
-
120 
-
121 // various convolutiony things
-
122 Expression conv1d_narrow(const Expression& x, const Expression& f);
-
123 Expression conv1d_wide(const Expression& x, const Expression& f);
-
124 Expression filter1d_narrow(const Expression& x, const Expression& f);
-
125 Expression kmax_pooling(const Expression& x, unsigned k);
-
126 Expression fold_rows(const Expression& x, unsigned nrows=2);
-
127 Expression sum_cols(const Expression& x);
-
128 Expression average_cols(const Expression& x);
-
129 Expression kmh_ngram(const Expression& x, unsigned n);
-
130 
-
131 // Sum the results of multiple batches
-
132 Expression sum_batches(const Expression& x);
-
133 
-
134 // pick parts out of bigger objects
-
135 Expression pick(const Expression& x, unsigned v);
-
136 Expression pick(const Expression& x, const std::vector<unsigned> & v);
-
137 Expression pick(const Expression& x, unsigned * pv);
-
138 Expression pick(const Expression& x, const std::vector<unsigned> * pv);
-
139 Expression pickrange(const Expression& x, unsigned v, unsigned u);
-
140 Expression pickneglogsoftmax(const Expression& x, unsigned v);
-
141 Expression pickneglogsoftmax(const Expression& x, const std::vector<unsigned> & v);
-
142 Expression pickneglogsoftmax(const Expression& x, unsigned * pv);
-
143 Expression pickneglogsoftmax(const Expression& x, const std::vector<unsigned> * pv);
-
144 
-
145 namespace detail {
-
146  template <typename F, typename T>
-
147  Expression f(const T& xs) {
-
148  ComputationGraph *pg = xs.begin()->pg;
-
149  std::vector<VariableIndex> xis(xs.size());
-
150  int i = 0;
-
151  for (auto xi = xs.begin(); xi != xs.end(); ++xi) xis[i++] = xi->i;
-
152  return Expression(pg, pg->add_function<F>(xis));
-
153  }
-
154 }
-
155 
-
156 template <typename T>
-
157 inline Expression logsumexp(const T& xs) { return detail::f<LogSumExp>(xs); }
-
158 inline Expression logsumexp(const std::initializer_list<Expression>& xs) { return detail::f<LogSumExp>(xs); }
-
159 
-
160 template <typename T>
-
161 inline Expression sum(const T& xs) { return detail::f<Sum>(xs); }
-
162 inline Expression sum(const std::initializer_list<Expression>& xs) { return detail::f<Sum>(xs); }
-
163 
-
164 template <typename T>
-
165 inline Expression max(const T& xs) { return detail::f<Max>(xs); }
-
166 inline Expression max(const std::initializer_list<Expression>& xs) { return detail::f<Max>(xs); }
-
167 
-
168 template <typename T>
-
169 inline Expression average(const T& xs) { return detail::f<Average>(xs); }
-
170 inline Expression average(const std::initializer_list<Expression>& xs) { return detail::f<Average>(xs); }
-
171 
-
172 template <typename T>
-
173 inline Expression concatenate_cols(const T& xs) { return detail::f<ConcatenateColumns>(xs); }
-
174 inline Expression concatenate_cols(const std::initializer_list<Expression>& xs) { return detail::f<ConcatenateColumns>(xs); }
-
175 
-
176 template <typename T>
-
177 inline Expression concatenate(const T& xs) { return detail::f<Concatenate>(xs); }
-
178 inline Expression concatenate(const std::initializer_list<Expression>& xs) { return detail::f<Concatenate>(xs); }
-
179 
-
180 template <typename T>
-
181 inline Expression affine_transform(const T& xs) { return detail::f<AffineTransform>(xs); }
-
182 inline Expression affine_transform(const std::initializer_list<Expression>& xs) { return detail::f<AffineTransform>(xs); }
-
183 
-
184 } }
-
185 
-
186 #endif
-
Definition: expr.h:8
-
Definition: expr.h:10
-
- - - - diff --git a/doc/doxygen/html/files.html b/doc/doxygen/html/files.html deleted file mode 100644 index fb31c3ded..000000000 --- a/doc/doxygen/html/files.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - -Dynet: File List - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - -
- -
-
- - -
- -
- -
-
-
File List
-
-
-
Here is a list of all documented files with brief descriptions:
-
[detail level 12]
- - - -
  dynet
 expr.h
 training.h
-
-
- - - - diff --git a/doc/doxygen/html/folderclosed.png b/doc/doxygen/html/folderclosed.png deleted file mode 100644 index bb8ab35edce8e97554e360005ee9fc5bffb36e66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 616 zcmV-u0+;=XP)a9#ETzayK)T~Jw&MMH>OIr#&;dC}is*2Mqdf&akCc=O@`qC+4i z5Iu3w#1M@KqXCz8TIZd1wli&kkl2HVcAiZ8PUn5z_kG@-y;?yK06=cA0U%H0PH+kU zl6dp}OR(|r8-RG+YLu`zbI}5TlOU6ToR41{9=uz^?dGTNL;wIMf|V3`d1Wj3y!#6` zBLZ?xpKR~^2x}?~zA(_NUu3IaDB$tKma*XUdOZN~c=dLt_h_k!dbxm_*ibDM zlFX`g{k$X}yIe%$N)cn1LNu=q9_CS)*>A zsX_mM4L@`(cSNQKMFc$RtYbx{79#j-J7hk*>*+ZZhM4Hw?I?rsXCi#mRWJ=-0LGV5a-WR0Qgt<|Nqf)C-@80`5gIz45^_20000IqP)X=#(TiCT&PiIIVc55T}TU}EUh*{q$|`3@{d>{Tc9Bo>e= zfmF3!f>fbI9#GoEHh0f`i5)wkLpva0ztf%HpZneK?w-7AK@b4Itw{y|Zd3k!fH?q2 zlhckHd_V2M_X7+)U&_Xcfvtw60l;--DgZmLSw-Y?S>)zIqMyJ1#FwLU*%bl38ok+! zh78H87n`ZTS;uhzAR$M`zZ`bVhq=+%u9^$5jDplgxd44}9;IRqUH1YHH|@6oFe%z( zo4)_>E$F&^P-f(#)>(TrnbE>Pefs9~@iN=|)Rz|V`sGfHNrJ)0gJb8xx+SBmRf@1l zvuzt=vGfI)<-F9!o&3l?>9~0QbUDT(wFdnQPv%xdD)m*g%!20>Bc9iYmGAp<9YAa( z0QgYgTWqf1qN++Gqp z8@AYPTB3E|6s=WLG?xw0tm|U!o=&zd+H0oRYE;Dbx+Na9s^STqX|Gnq%H8s(nGDGJ j8vwW|`Ts`)fSK|Kx=IK@RG@g200000NkvXXu0mjfauFEA diff --git a/doc/doxygen/html/functions.html b/doc/doxygen/html/functions.html deleted file mode 100644 index 999cb0ffc..000000000 --- a/doc/doxygen/html/functions.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - -Dynet: Class Members - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
-
- - - - diff --git a/doc/doxygen/html/functions_func.html b/doc/doxygen/html/functions_func.html deleted file mode 100644 index b297a976c..000000000 --- a/doc/doxygen/html/functions_func.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - -Dynet: Class Members - Functions - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
- -
-
- - -
- -
- -
-
- - - - diff --git a/doc/doxygen/html/graph_legend.html b/doc/doxygen/html/graph_legend.html deleted file mode 100644 index 94e9efcdd..000000000 --- a/doc/doxygen/html/graph_legend.html +++ /dev/null @@ -1,153 +0,0 @@ - - - - - - -Dynet: Graph Legend - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - -
- -
-
- - -
- -
- -
-
-
Graph Legend
-
-
-

This page explains how to interpret the graphs that are generated by doxygen.

-

Consider the following example:

1 /*! Invisible class because of truncation */
-
2 class Invisible { };
-
3 
-
4 /*! Truncated class, inheritance relation is hidden */
-
5 class Truncated : public Invisible { };
-
6 
-
7 /* Class not documented with doxygen comments */
-
8 class Undocumented { };
-
9 
-
10 /*! Class that is inherited using public inheritance */
-
11 class PublicBase : public Truncated { };
-
12 
-
13 /*! A template class */
-
14 template<class T> class Templ { };
-
15 
-
16 /*! Class that is inherited using protected inheritance */
-
17 class ProtectedBase { };
-
18 
-
19 /*! Class that is inherited using private inheritance */
-
20 class PrivateBase { };
-
21 
-
22 /*! Class that is used by the Inherited class */
-
23 class Used { };
-
24 
-
25 /*! Super class that inherits a number of other classes */
-
26 class Inherited : public PublicBase,
-
27  protected ProtectedBase,
-
28  private PrivateBase,
-
29  public Undocumented,
-
30  public Templ<int>
-
31 {
-
32  private:
-
33  Used *m_usedClass;
-
34 };
-

This will result in the following graph:

-
- -
-

The boxes in the above graph have the following meaning:

-
    -
  • -A filled gray box represents the struct or class for which the graph is generated.
  • -
  • -A box with a black border denotes a documented struct or class.
  • -
  • -A box with a grey border denotes an undocumented struct or class.
  • -
  • -A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • -
-

The arrows have the following meaning:

-
    -
  • -A dark blue arrow is used to visualize a public inheritance relation between two classes.
  • -
  • -A dark green arrow is used for protected inheritance.
  • -
  • -A dark red arrow is used for private inheritance.
  • -
  • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labeled with the variable(s) through which the pointed class or struct is accessible.
  • -
  • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labeled with the template parameters of the instance.
  • -
-
- - - - diff --git a/doc/doxygen/html/graph_legend.md5 b/doc/doxygen/html/graph_legend.md5 deleted file mode 100644 index a06ed050c..000000000 --- a/doc/doxygen/html/graph_legend.md5 +++ /dev/null @@ -1 +0,0 @@ -387ff8eb65306fa251338d3c9bd7bfff \ No newline at end of file diff --git a/doc/doxygen/html/graph_legend.png b/doc/doxygen/html/graph_legend.png deleted file mode 100644 index 6ce3e9c7542aa8c563db0727e896e7311ea1f324..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18538 zcma*P1z43|(=NUN1tg_gQcyZ1q(KBkT4K{B-2&1f-H1p?igb5(cXxwyBi;Ph_V>R3 z@0|0!=ev%232fkb)-!9?%zfW8vxDSiCD2ibQ6LZq`a4N6MF<2w4}3n3j0pa(J2LAB z9}xB5ONc=pV1Iu$WJN(B6p(jfB1%q)dkfB*N@v$dM?+``-QmbDUIdbq#?^@Z^3JJA zH_V7J%2eYX=*@7&iQS7;`D|Cj*x*u8s2}rFvHJTHaTKb9z+jZ@{L-LqR*N!$CZWI} z_oS8n<`a(wr|tg4t7PLr$HCW_0h_LkR8&-~orDIVY?+=Ifqvm$Y_Km%YHdn;VJ~)` z;?w1U4}=EN*6)Zlf0g52o~a6FnEBbvW;1I+JUvs>bVJ!DG2V)cQ!y~S-(sEhW7eu| zP8qsTr!%whQkFz!bueS_8xwy=<0VRIj|(m}OKD(W@FH3&watWp2Kx!FTjNxvI9hS; zr8mwWIXe$;@B2l6@MBPh5A@N%pE?JqvU5C??VPjM5|19ev5TB1qe5 zb} zR+m#5=gJGH%9se0=PS;RCET#&_+3VI7#-HDorm!VXDc8O9UUEra#KBuA3Pi!+}3;z2PqjD*3+jDKT)`7 zDL-@)uI7aWG8GjSLP0m4!6d${vHdpi1lwh`gFl3?Uft+0Appk#2_#*P*_wH zUhv`84kE0lN0}*`6fEL{NXf>AMZ#^>9*oEEH6bA+E{+hA&3-lyt`+2Zaj^2cBZSBK znCAX+71QnZPuFy*Au5;Ee4xYbBqb#!9D{0M`)I~{hcXe^_8`bly)F}Va^e|G5sIiV zpVIFL#^V9D`~CZOv0fWuzFJvkuMT&W<(xk->+kMJ>dXDArB?(oJD*lsANT*@Kw4Z} zeDUIi$sgkymos{o)2%NV?_+;2Hn=ibMQkH;(!9uaW6m^^l$K84$;)LWW*juJhu!_M~&_ll0S zl@*a6KYqk_>FMdc(rt!(a&*jEsB=_R`#h8^z`3YXgl{1Pyfr@qA`kvVEve33eak+u zGwP^i)@hU$^Gqqr6Do9LF6@3B7zoZsw&UR<=cIMS=CzFtF7+(Ha{6y#R(NXr9Gga=N z#IiCDuj8vQhV=CGpK>XJ@mh5u_q=b=JFdG z7$DSWhQlEsDmgcLKHQ&Gc7QFZFmy=bV1TNr!Cl@YYTelyMh~q%d-hCHPOj+K1#Fbj zU}De{9NOgs>&7n;5fPJz-K%?hp%Zzk2J5}im+P@QM>EDLdMmAd$e5S`At50uQyuXV z#q3@?I2OMndR|Hw~ zJUl$jeSN4SBO^R^8`9AwFK1(tlEQ$yQV0l;`5>Z?qK)gf;54Ba zEoMfuF9zZ{QDNSBwmW5eckRFkErz^&`4Zw)TFTzN{t1}zXL|ahJe2}?dF?*+RQ>N1 z5a}Q6j~P_*g{7oWfWsd3a}4S3P8P%oc?!bA!#^b^4$jYKBo*?gm(s$3Ep~Anw%Cpk z0_vA9pAax>HV2S<1WswY7WD2$2;K95;QkaF+k39cx(x&Z>xMIY5S`P*BH%03!*J+i zb&uD2j?T^=W32$czueAB(Y3ZNigsXSGAULRmf*~bE>J7;x3IL#Q7zKOB_>u+GvZ`p zE9qPv9aU5>{rKcHA72y*76Wl?KF22~oPCyy^*{FZ_PRSd{D8T|IgI)#BqSshU*N87 zZc4<&#KaqBD86j?(@8R3Vj!_Io`W-xz#S1B94wimH0qB|0(0PxdU_%tQe=R=DTGCM zBi5hm@e?3i;qB(`!+huMT;1pWUm#3JH8cn?X;y!gl9Jjf;2anl$^uvWP^8`P;`Qqq zwLhw#kCsJ_&(1R3Z_X9e)YKaKxO~l39B83pO7A003|m^7Pq&2;LP~g#&Ve0iDIz6( zfBvKZ4kNQA|LWVfZ^Kz~De7H0ul&^uVE@EMOH;W~{C-WU&u$=NV04~tk0spwfF@xe zb2SIU(qsPXc75A|Rke62jUaju70p$MVEfYu)zDZ4@dck3&4}WkoCVGMWN+UNV!j`S z4-vBL-=FJ@Tm1bo`fuvpX8NCAGILV&`ubFNXIup(YrBwyPv0klrEy3Io_cFL%;`C{ zaOzWD6tJ58uO%gH-=#8!^aFU+piI<{^6mHpcwKQ)}hv3k`2VlU_D>Jl@ z+1FhxiA>K}Bwkq{iJw;B@g~kXY*X1kg5~NQq5De&U_Q}+5flCFqx#=W5U<1Cx}W}$ z%~+h;1cFPuVr{A_XK|vb-c=V;-5(9(xCW4P+|P1{DgRpK`N0F??dy`;2Wrp9iFC*$ zm^ia=K80#`s}Tubd)6RcX%a=h%D=NTaDYW4GC7k|a3P9y3in2cO0=DNiO}T*U}$-Z zQNcsLe}C~5%l7?pAS}X9TJ-8uFg=oIfG9$8kl+j>hZWeq5LuL}YcfheryX8In?bxH zBata7V;_b8-JF3K+eh-z_jgcb#Ch&w1r_OCG%hs(k6U8g;3g#Zm(ga4Jho(trltai z`rx7C7Nr)E0_oASu}R=AJf1Q?%OrsPxcwGYyS_s7rV>4;$HQH`FxKA(oLP(Ty6J+; zwNGHGD0OR&zD>2UWose&SbDvsz$Tj_JNzA@1YGeg92M-+(2#VpNAf527*D^R+nIxB z3>2Zw3&8A}yslT52@IDNv$E1-kZ1=FS%P0vRdv1@wBr$0fr|Je{~5m%mYIWARRG?~ z)<|9fF($A>r}|GCobE9A?8+yBcuMI%N`GcjU=o+iR{fEaW{o{GbO$3L(B{mHcyzRyFabOm2l55{ZguW8 zfg;?+dAT;fbP=IusS9|HY^4f3T~%=&w@azKb{Lo_!T-7dcU%OYZGG-YuOt3BtKyfw zix`zXM8?p-Ae>n%pEDv_ic{)6UUB)Wg3?4WeWkksuyn#PZWJQj860`lWVGd?2NH+N zo7c7h$A)Tk)W2$jh0xnq+Dbsw!#r4eP~4J-tvwT6VXXJz3>BXXBNG#YP?HD(GXbHw z(EkJl{{uSgTRtd*VcQa}!Z}n?iRM$}e-Q2%ixmgJzuQ>M2msOofBZMJB&ttOrwJ6J zN^R5SZSJ9m-4!jlpnxfcNn>*P69`&<4Gr!LV(sOA|3Fb9epgr5e6705mi2$IpgJX0 zCR1WQJGf@Q?%Kx2uj=aR&Xb8gh}eI_et!|2a4fS{{J0IQ9YgUE|Ez2~_Eeri05>BeW4g|f z#UG8xyK2dUq|G0_4d9NIwYBkVqea(4f$7=V-)B=gNDzLv%i@-cP$CXQ)k4iLH8ror zLkYiZrg%Q1lTGweFR&Vs&>!gf$0Dcij|F|n=R-kcUR~>ny4*;xw%Hzi-k-pY2_k=( zRVPT!5M2w4`Sb}sK0br9or!7ytc?cZ{e}c@&;YQIeE;5Dkx!cMpWTdGv@PcJi;X4t zm6m3^(NDzha+=*^8Q8(}-mbK)%yzXCJv}SSVECs9D+hzkkiSzKZETXT9ii zLw2=-p}Yy$X@`%Zlk+bsVhKbx9!zYJ6S`}!s>lAfBWM5=-Ub46WLzAwwY9Z$iXa)t z+5=WY0|V$D9v%*p4fnSvL(mE{JZ+CF!}$hRf)uyopv*+CCvN}(w13KEduhYCF|_1! zbJ2v$iwm|r)b!1G`LXAnw|RZKN?xi;9%ZDYeW{tB=*SweYUT$d`?0aVF2_rOAEKcd zqE0TWbcPuV_YW~^=urKeBrmi5av06c|J=4S?%C@9Q*QdN4A$s?2RkLFs7s~6%B}x$ zkdQg)RBBxp-#!RzvH#B*@BhDQ0dZ9!Jrh$$QPVw2wA6DkewoiV=hW5J(BA;(iUy3D zXw}+(X=-X3oRyQ6?es$>u%8qh6C@`m2Ow`d|E{}R@}r^QcD}m`pVo!BhzQ);r<%c8 z<5~lKeRvWQlB5djtxY%*smBo9K+VVD=~wnO4?S3zIDK9x@5t(br} zkASgO6u-gQ6gC6I^TVa0vhyG34adC9K=yZ>OiHmuohY+ZtRih~2FJQf398qKPWaH-GH+rm@B{WdQlJ zS`|{_8~Y|Wt{UCMahqfkpXos!U+TF-FMcrQA0$Ra^ZYsI^;PH7Ux#P!G_G!ME)I)I zII$VMGct+8+zvE zA%=Z1oD9ju#jLQy4)DKvNEXwm3OV3n1OUl1g-dAcD=i<2jlEjG86LkY;~LnuKKL-H zI4d|vm`kAT1P9nvcYnW_z5OeQ$unakqt>}Ojb-HBscD0!7gc(>w!66-pKNSk;T8gs zm6e^Yv7@VX*hS1yLNPbr#jgTqA4VX#_>uw9)B~J}DLjp7Oocpm!fb7Qy@KbNWyOat zO*k@R-w)q>xEPv!mDN-ur}p0ThQ}bg|9_DMe$G^(i5NtP%rE)BGv>?_7Z(Q{{}6ho zXk!`cf3ZIopxxlo0;v9B{RswO)_L{XR{~NQ*nk&!=jAZ~cFyX0ZUKvcEl%`HAxB#y zX@opB6#WAOAY?18zxP<{#yUM*A}8au7Y59+#PLvj!2JJ|1b&W@+@j`G3i1OQt*NDj zg@@-S5%ElKF!6P9Rh0zbgvB3wu)oK|v`$SC2u~nrY0VWhHd;vW(MO|@a9McO)$!%$ z=d-$9+9dKh7Pbs^Ed_Pv9o`hXURVv>U;PeY`K|MC9lPOfXlS@KT|ymB#)tUxV1NGm zeIW~Qix`|BvFR#na()2;J!9hlz=jZneQwmWx_qzCPy7clsUne=JRbzWw^x>zyK2VuIHt^37-BTb~FByAKH)(G%86F`Q($Hz!dW{3~U!=!V8Oth{&inzFZ2Jo`w!oE;e}z z)zsF0Q!k*U`UP|!@WZrzq6&wft)x7s@Y4j(UMlRKnv01&GBh^kc5#M$kBggLK7njy z#A^S#y>*)fhX?LweSJORMOkh56PcNzJRpj|IAD&F6yR)BkXM$ouf9oTlpAzmzzbtO zRIa_T@y}r2_rCyNP+A6A;qa-HwZ#l=o z&(Ckf3l4#}q2Tnjnx! zaj>8qvruL%7yVILrwQjeKA&s-M!u#9(BtmbR&Us&i-{H0AEOjNOS}VjmIh_E4`=nq zvjm^B-+rv1`thxAJ$`C;ZfJ*(_LZSf5z{shJw8Q4bA<{68&VJ7Tc*5A==#ygKK`*H zb$>3-BX>7ZXRanKJ>3@`0b#p`E+zd70@5frw%NtS#R_cP8BPC5FES5D4>Qc}F|&&Z zo1Ny~d9PBTQWhT<7YG6}x0zb5A^nt~`?bma;mXPv5dV0WQoemtG;{{irjv`yB$1r0 zEnDOD4nycO0b+osSlQS_fD*Vdn1uR6+8^BBY;g+c0%Brf%XvkOt+~p1tl%u)NhFqvw0}nZ~+MIn= zZdoIjPtT(_Y$S&qG^-ALy#e`Z@R2qHpe0=8SV? z-iLEos)68Ca`$MQe^XV+(KjH#V59#>9IGCDloo=a0??H+7X41=DC(tfKdsU#efo~si_%19@A)Q@?d>XqA+zMp0{YMoTCH}VFw~teN0?j_LV2FSuF_h z#(aZ=gOakcll&lNmrg$7}X3YgALGMNCn*peULCG6XSN~ z1}jW^E7t`rz#41gVHGkPu>`Cj$2o_XJ(d< zjju{;qz&Btx_;e6Rg%BFybNJsVG)y%SOszwdieVs8DLB1nVFet+f_uc?`*(d1|YBA zOvK$a)pUt#9g-A$%b%T{g@*tqr;L^=0eFJA&+VuMNm5Fx6(Gc;l>l;mkOCblxy>gT z^EGR*r;2pCKzb_CZGi`>r;-{iH#Y&0Ke~H+Ma|6UCkr%?2nYy(9{4jq9}PGbEiLVf zmoHm@uR$UG<;ylb3yaY0u`Gj;UvH}&51$q4G=)b9UL$iD4~{c_VEcue?OMl~$wD$VczbmM zlzlG{m;sDkx%{(wdAS;qSKhW1G|6E#&jTbjgNa;ar;`D0&Y`KQB!*X+O$;_ETmyhN z7Tc_dk_x!sf*8}*6GiuD*1SmXd~b%8lhg9(?rh)qj0|UIZivLr!z4fEG@%l>@ei(x z5Fje5zTQ-AVp?2{5DE_rME3RdT?UcT#?i4$!@9xmeJr!-YMRpaVJ~30vWYxjz@^&& zdJyvki(k%4@nFBy(B?Gy>&crp;y7lAJHEU-6!aQpM(8uMvx+dO?$xVuaVA);re|Ov z3?%YxA56iYrKP33<|^;szc&R5c5QD@nv09;l|d(3@6b>Yw%j^-2~-+H|12O84zMS1 zThjtQ`N`Hc)pD+K1o&O|$cRE2I!J|Y!REkXGJpy37w<9@T~@=mvkkh!$8$c=#dBLf z!^6YlbkW$h8!&TshiW7ZfkR+AnXd->_NPyuetF)Xq$mL~9mUW4_V%_LNS2_um81_A^<)b+k8{!Q8EK=T7HOb?RMyp@Ha|uD#kp%(D)~ zxmEv0mWl?sf8uxi#D>MvP6Wg3Vud+@!{K7m-u}KRfW}~{iq-6*Lw2Kr26#B+|b z<)-ltY24ekg04n)p4o=u+8t)RklxSl1T+`bcPV# zy?eJcmL*p<^aaEj@DDp^(tlnlRsKc1=Bhf0mbIt*{!$Fc$hcZ|IRI{#aJ z{Mv+C!Ekme7a<=;4<|j;{!2L3{kL#x^IyU#;lETG9AVpJ_*_NK(19=tHk>!3Uy3Lv z{r^=Gg!3J2L|2Q^Jb}`PI**!JJu={6qcIX^t-wz62}|cs$wkQouq% zk-B%$y#F9C?>#>+Iz1b|dULpBQLO+Y@K-dO!lCs{y zJcK_3+q3uM>>hT(utQU@7*%^$7qy_EcGm7l<%cXqES#t>UJ#wYj{Os!jNMf`yFmo1 z$Vd7mS2{vu6!-~uX9k5=Q{CP0hK4;a7(*xZPA%WOxoMJ;b+V}=jM0*&==(nPqc}LU z_u*D(?XGa^BAA-OtZwtFmew_!%}3eP^rgq$nQFFDuF8}A2B*tnw1>MxnU6;J+}rM* zo#Jr5gl`{rMGQ}OdBIq?#EZ_xuLQ46z76YDXlPU=w{ND9Tb>?MDO~L-%vBDw zroTh5CsZR5Ywp;;h$MdbR$G*fCR3m12HG+)gvjhM`NBQDeTXA3Y>yzisc1-y@3O$& z^02D>_eW*qSmuo71xEzihx;@{92IJ6w%@Bl0ny3un}*!Zh9?MJ%*dGw=+?#(F*m-2+VR-=2#gV@4ne z$6N7!T60HxHm@~2JzECOCK_QeilJdIVk}+r=+!4+N>ONIVkCJzNZ(>UGf9pzG^G4|s2w*qlWO;H4=+B| zNcI{#L{)p{OM3bqeG_>7$Lg3IT~&<>-<#1?AGXr6jKGK{%!=9ra~0655f>+U)P`xt z=2C9VAZ`L3r}xfIzTVYd-Cy1@Mj)BOc=|q<@V!sp3|MY7ri}LthMKxEeJ$_Uc2_EkR$)d$3^K_GN7QrW}}rMp0+|# z*^a8QlNitbP#{f()z;sSi-g&TBqVg95-R^GS3HhS@XJgQl81$wUaee=1I~AIU$m zXFv3PoJOEKG8Uq1tT%NnQfXJiZLL2P$5zp3^w9#%02MWKsT#|jR@!8}dp3nyLLcD0 z&~Mnz(KHpMcQ=~`?SYL2q(pfXu?$$mE{`9sDv2$F4CsR}lIt zqlMnir7PyKa@#PUCoUjVTp#+>wo7_rxr;Y9MF=%st&(&{f2!wQQ+8uLK&W=yV8ALc zy}^+aj`^W>6Qa-dQ>D%Qw^-<0H5QpY4@zBw%aO3ZVIRiw9UBR`6~D&b{S&Sb>J1@W2Z1LETNoc?rtnXa__oVMh8^BKRj z&3gHC`w>vM2tL(d1CHJr$F@kwJxC%aID?a!$&V>!hlPcIs1s^U-B|F6>Yig+j(`0g z_oE@Z8^IY_BiaqNDdrgKpOPTx)t=Pl`6(Xj&iQIYgpjy}F2#6oEmC_>XsGV?R-mWY zTanQ(NK9s^SbEFN6Ws&Rlj@#2sr8R^A(d816D}=m^9>0h4|gmmH|I%!R=m`9HblPv zgXw9%t$6=_Zfj)s>({U774e{);%l|Q`+K?N;!^d^tvA*uhxv+xc%md^2(50vVA-6fS)G=A$Nx{$m z%*yKAX%$_lKXDtCgCmN*j|@~e51SsS+x4;L7wRZ@F14m-)R1ugO8yl)K z^WmmA3ftyp>J(J7aO|-E?2|A3ZpwN<-Nl%6GG60@^0-j)s&QG;YpFC*A2x=x8+83t zxpzO5jD(^w(9ubwV)z$e7)R-^gJ}HcxNi=GFqi00L?FkCN1Qh&3)nplE!@v7cy^ZL zD9-I-qokdT#>KVqRdV(~hxFTnldne88s&*T<@ZmVdpGg1Q^_DLw)DZ@2Cy^${EQGB zvR-YUQ~zKJ0tOhh_# z^F1G~t=s3rM$kIr*-fMxaIlJN?`}IuzV>}|vf5RF^6>FK?Hg?EGicgl5pI7Mny3NGxG zAJ#6YWY}YZU=?F)n*@~f^jMLRPXYt0{X#?CpwKv2m?z|$B#{%CAYf*8`*6Fl+ybq2 zV4;E!FdAs(NZ?9cI;} z=}9kz6)NG4K6l!jRf%6>m#3~0JrW_VkWvg8Pa&c$oTf+AZhtfN1Od<{KK>2 zN~<~Q_Z0>DtdoOde0mct!AJ(CBRNBYZ$KQ?zByC1-x-tGvY8F-i~Ydre9R54w4hpa zcPt-XDJRm5P>)s@ndald2&Tf@6L=sdT{lKRlC%5it_`(f0X%XxO)1y*>Jxiw>+d{i zq}}z2v!Xcz=anEjm!rhxuH1B~R4d5GZY=@|NK|B112GGzuOo=*u^(zI`SB8{}01(k}l<`=yN|0iVeBJ`5) zL_i)qis!|X^SrMaULh>6-BD5-tGI9(A9Z^^Iw+}kXc!(Ya1|@5@)&senbLPOU%!Rs z?XfBamCSrac2=|Rbc{?_{{0R)grR30);i03No9od?yUF%4agh;{c9~y8T*?p1=1fv z8}9)@YpK*FKKRA^L_gM$#9fN7p9F>;z`g#ND?%b(Cbx z_v_pnRfl~(X;2^FE7uYQw3i;|*G7L(y@XAk|DXLOcNSg5qH zrY12cdmgppSZT7$%ls%s14!}cQ0F16eNPPL3^8)h@Rf!DRI>QR+FD1JR-xOcETB|) zKrIgTX>pZzqSKt^EIT9Od$niD)0`~SuO2GF+o_AJT${WunVi5{ZBg;@S?@IEKpqhh zVIw6gVErh`5=yk{S7OkhXFk_x&dq>mP;h6-^y^UUL^mIi)csH(J^8iIlw9I)ze|T1 zaD`6O6W|JKi;UvxN^pv4C`ZdiZ0*==iHI7lfWaLM&DoarmIp;C8%^iRA(7zNA(?Uh zu`iBRdKNm-@WGMM#RUtqGdEM3{w;9jt?4ql%!38g$he1aHL|H3uKb4av}8>WOvkok zy%iHQ0wI!Wj4F{SN|mp1+fyD<-@p5UV!}_Vff~;T!5Bt0@2xEp(1Q&Dts<9zy0AGP zuc^lxyZA&YPgdgMMN{(fKGD5`LlPNR_3=CZOLJgNxw=qmULwtw8#M&#o6SZLL#!+gxg8|JO z&MEScd#v^Ps=u$#2h`nZW#WBn>^56_dr_M1&Ph}XHG_aQ8%i#e9Ho2*GNJh#JvjS2 z<4lqn6Inj{sOIK(g3D$aR(i~p;ual~fdwxZnc82am_pg~9`h&h`(en~Y&PEE8*^DS zGf-06JmZIM*_A3tyL0~?N_=v1@^nOkoU?imG~U9?Z>|D0cFZ6` zKs+-ub39D~69o-zyq-3;@2@1hwIzvxfl&?$)}ZQ@u0(GN`gO*$OQBD@?=7 zLx^L^TLS6wFMTm&p1!TADYtBfpd|6BZplBo05YGz)mql+tT~@#feI>F_|L(lx;JIU zhcw2Uo}AQF2(1dLrrkItbUl^=r^?KXSa@XL_R8>+^p|OV+ zFt7I$&2Ie`RrS0S0VYdR$uk{H)B-hdv)(@Q6uQ|`_Q#KrQnD1%CL^Q9ZccAcbjE^k zrqBg#RrAJik9TB(ZyixG54#jmTrHg`>oi-TH|oITI`ztn4c4Ni}a zeu4lz;M&&OYSQclw{~zKTjzLKSPInmbCYl5!RZwxw$ahiBcQGL9Wbp_#xGz(Q$Y>) z|9W~E(;RQvltvlzNz&9mtK5-gCqg|P8TB7^S38%sb|#b*bI@*ll~X`^S3e!2V)vX% zw7{Po{*{8SAnxH0M6=wnhkI`KnKY#J_AXSiV2VmBfp^Tz55G<}4^haZ^7;mt(yg1& zv)~X^BJ*~U%57FKamhV(fV+rG1Z3^>n7oNF{~(|yBPp4E%tKEftnIS>ytKHO!qe09 z8uagR7CCGUe}O1nfqr;O4i1jsu&{#CWKeZ9ncWAYB1y09GQ}A;hf=cWlAXLko!P7% zkC<2rG`PWr5n$DlT(`>Wf6fO;CzFIVHGc8mzI;JYh3&<7(UJuC>gHniA#6c@UDD2E z-`c!q8-b2J$yy4w+1%__$Yd&c@-K1A53e@2J=4S^>#IRbQ&)B^_`td5q73VXV{1HoWTU|_aJ zm6h`B5a{>@)t_%*er12AEUVXrekvb~xWs}|o8oHj<*&CPTYtL9i?CJSl7bily4R)5 zD&j%2_^XtHMnaO{6wddoL#jPcY8Z?dO^1tnWeS0S@)o0Sz!E@FPcFC8o-%6Xj?WwZ zbd#EH1hul;g}#p1MShmKGPzz;CHt@wzFb2$#_HI*X zn&UI$y=DWk!BhbbZ@P+tynLwR;*<73tOKXbBn8ocG5Xvk^0PL~6pp}~H2n1!Uq5Hw zcHR)p2B^~gd#nJqzZNs4Z%^WZcnoTuAPovF=VT>&YcdCb zrnCNmzC%<2!(Loi%^Z|t#XyrA=m9|jEpYuQLgZi&qPV1_1vIWaB_Rm`(*e-215h@` z0Ok39Fs5+Wc*D%d#PsK6NXVcsh6zl}n1m7b_4ZQ4_UY;CdxK)K+i?#a#H+Qn7100| zG^Ite`a+3nfB!BeevTmE@@Tl+bZ%?Tx@{XczE6>Do;(|&d4DFGZ<;qoj8^Fd%u8?l!hCG3|6}}M zedrLhtc>TWvVf38iHV7cf{s2>Pa7?@9mc)*6ErUEYB_*-{Sff)i<$nG8 z2h5JJ?iL0H1{d&5+ea&H@l$!Ra2Ee*exd81r)6w$OHuADXQaz|x;eNY0-Z+p4d_}O zNz>=yfwoLlP3fp=Hw@R5tt_=2DfT{hb3Zn}bvlr!o~_aU6W8I?cgO^dt85_Y3}Dg; z*8nyD89LeK&I#o$8~aRwdAW*$dGZP#)i3qF*gOJyPl9qh21q;NV*aE)X>l{Ka6*~%sR3yYduT4Go?XJ7Yiez0cj47ha0~=A3|Ci-HpL0Qn0Ev zk+XTn+ISP*@L+FK9 z++oUz?lsFIYso8Y-g+a`Exz^~By%9{5#cCKZ0lOTp=T1=9Gr|sG^=Ur>?}q(>HBUN z-vX^FwOTQa$ST>|ej9gsNt613s+3c#&!X&d6?<_V@P0@b-`(2YjdlJr7wP)kgUUp92nuLF98(cPf z#u$-MPklpaVGuksS^g1rvK85Xs^HW&)R{>ky1BcyOi!~GmS?{UGqCL{USGraT|(;; zp8DeC*?;5Y(4F@+5WQ+|WxCZ*^0hm0QGj1d>xcpfp!rM_ImGG$X5$1oFFbyF?H(OJ znrJQAkB(){dx1afHC?huDAY)01RX_!MWvm?S;}b@``a;{Jd7-dN5` zCFL$oreQ-Gd3vGm0s48(2wbqUr6T7tn>pOVr-ZJ;97d+Cw8c~PPgppeOymHY83yXQ+V^}l%2yA7W%j^8}n zf$PCAd$2%FX#N~Llu_V!DbC-k98d8-Bk1Y<0VjftDpK+TJL~6sf@G&(NbN4_Co1xa zUJE02B`cSRYrUV?7L0jg1j^7B2Ny*HCQS%HRd0 z{}$zll_6>|q(+~ytI^6thHNWsh^(AE1$3o{K*Kdu<7+J48+&_fnCSoC89nj(mqIN* z6fz_9PZ^{)EPGwGtGhNFCz*Qaom8zu*7aW!Nw|+(poF})oD30^tnL3iu5)(t{ic=h zOVzf~A+TrYsOv;BZ>w~oFm&E6Xk)?oEAggS>tMKq? z^TLe>z0|h`0W(}*S^{>10tP1KL2FrspT9d@%b~{-aZqXy@@qUtnDXcX{a_+p3}|u`UAH$ zS&}fEI`Oo^Lx9<8DO@#z^h;Wm$K(RBXj1O*S+?_&=dkl{rUdt?5bq5QVrTwt&;hmI z5;>uH7wmBa@&w8DYU~^-V`F2{0M!k%U9Eqdf}x^L)$#D_K^3fj^w0Z|B6Fb@{oHUR zdQzu#JX|9q{mDP8tR>~Ryy?WJHL}XxF5^g5!L|%*FvctYy};{75}W32{>qNAPhq19 zYYFSTMikqmIIIc(M&p0g)6Jxj7?gU1fsA+7HMQD#M?$#h$^&!3p)*femit7lxF12y zB?comKa5#DR>gtIM0IwR&QhP9SwRJV!F@xMms6mOlxUlef0rYvd-H?Fey zvibd`cc-EV`L2>*p@d;55iV@DEbPPFzmo}$1@CmPPYG#0DXVomf4$I#y9km&((M+t zCMHJb-fGuKiLqSEZ^&t$Yz618!h2L8Hl+R)8%T6QV=s>BcLqq-QX7ex|atjnAq=Z4uSn;8j&GR6PD)2d#J(0;{RUvbyhCN6L zn{i$!(F@qkXBB|(^dZYiguXzK%t8mMk+A*BKez=7({vMCNu@7-gahAl%HK8M)v|Vo z_!fo5G1HK!_Nvs$l5M(6S`vRnTR^4AtO?y_%>gMYZu!w&Wdt?MML#dr{ zQW56UOj%{svuv~Hl)J%b-!Sxf1T#G^{0u`YP+(>%DEibREY>aqru3Ah5W$VSK*_M6 zkb{c}KcS7w;Nj|S>*LH5>j)>3kS<1X3A+WF9>~uZ^sS3eaCBF;0!>9ko)T?)9I2U4 z=Is1>Rpe}p8Qg{b4Ii~MCr(-2d+)E+~bbTK$-=1I&fkXb2``idXP~=irC5W zV^vi{$uvA%^FbG^2;=17k|PHyd&%lJ1`I4^kJBe%cJ?+n9Ou+FN`8+ zP3BZ?+$j(ltg82@EdL4l zV$jvP*oN@od=IWXZfpCOY()le06fY~bu5^6>rx9zo2*X#ur!&p54x&oVf(_N37A}9 zP>oMA8G!cT)P|MA!*HMu4%gU??Y=0=)auAAmQg1UjrKSo_15+vN>eH7 z{K>s!p`d|Ru9Y?W&1L*IQZ%AOhh*vtl{5nu4p@hT9cbW6bmmp=ghqkDPiRguZq|CX zyRDq*qx?e2#_`Y_T%S$fm(L$<`w0%tyR^A}`tH{A4|92Fo!7eaNH!IAmY)+x61Z08 ztCsXPBB^cmriy0vA+rS^EKLQ><`*pzZ+H=~ao7@*i@ozao$qooaOkqZ5aJ3LQJUn! zBj~f;RxHi@NWsjE{tqUd&GM1?XCBDR`n_6caXIU4%ryzh+GD4IJ5K(&yP1v0nJUz- zb6j!fdr#(qa1y3EbqY0m+E&_nprz?TjEwP)OVAokzk!4zN`|~g2M1h)oV`TPo^e&s zHVO&~+Su9URV3ZkWxVKr;ZqiYM?>ahgKHpd4$@I*1*USAPXl^R`J?b~6+*UOES=$J zphAR5%71Ba7ZwP23V(zwY;|J5h9C5Ecr;a&=9`z~%r7oRM#NwFjObG9J}$AY>(Q!5 zV{$?jCR$+o#9%Hmo6i< zpj9mYU&g)SO~O8*k25NK+s8XPyO#@3F? zQcqzc2IkUSVatyD0%M<`ClUeyZGno7?r;YAWPk5e{t;XjjP`f!f~*CbE`*7i$Je0$ zlnspAOUJ)@0y-DR_=}Y2OWbchODFRaf#JPQ(1{9kNlwq)CNSL(=BC0|yCTf*?H>;6 z4&h<_wxhay;6C6|UEm!bSZ#lc!G`a-trso)m|6)9nEs9}nkpzM;Z|BL1jEK4`9AM~ zH>612r~q$kptm`g1g*7y`FVdfqlO*Ky^4T$2hj)br7&G?iUU-pP|%I$8GrE@3CZB< zcpWr6Mr_o8{!=&zY>HrLVq!4$O#tYa^mRVj&;z3^ah&G(mDWpzyD}}{-A7trZHA^J zAuNr^pve^|#?K(Rw>ciyr`xRD+yN;mP&C3-2^s84kZLW?&FNq?O3!9asFEp^IJ zmOZZ}3mpV9R^o#PssFlk7)#^saewb}cIEbsrmys%lRF{o`092cu4}a^ zrb`3;vxucIiL{X{GkC8tN(m)=C6naI4|4;A1Y*-V?Pv4 zjahJw{c#$16P(gzz0`?7fUtDLDno3bIZBFEbILWEF@|crMrFAwd9#NXn46D$M4n?m zSwC@>p^YNnt=44LVkS6q5g@}r>d*gr z>X6+3tno!yxNT*4TLn@d%Mt?zdh(i~zM!`fLKspEdtV;|EEVvgE@LY__#*Tz^f3hD zRRSIy0%671!vh~W^^q7LUr+!1N!_;3-L~JcXXvEI50R~cETh9rE2&;IrOt>iTcua7 yM4ur^^V^;Tve-xP_g6FZ>tJ_^``_-AZ*AA-Ruaa!`yG4>^6ssySfQw{_x}eXDH;j@ diff --git a/doc/doxygen/html/hierarchy.html b/doc/doxygen/html/hierarchy.html deleted file mode 100644 index 2dd3e965d..000000000 --- a/doc/doxygen/html/hierarchy.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - -Dynet: Class Hierarchy - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - -
- -
-
- - -
- -
- -
-
-
Class Hierarchy
-
-
-
-

Go to the graphical class hierarchy

-This inheritance list is sorted roughly, but not completely, alphabetically:
-
- - - - diff --git a/doc/doxygen/html/index.html b/doc/doxygen/html/index.html deleted file mode 100644 index dce938030..000000000 --- a/doc/doxygen/html/index.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - -Dynet: Main Page - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - -
- -
-
- - -
- -
- -
-
-
Dynet Documentation
-
-
-
- - - - diff --git a/doc/doxygen/html/inherit_graph_0.map b/doc/doxygen/html/inherit_graph_0.map deleted file mode 100644 index 9ea85563d..000000000 --- a/doc/doxygen/html/inherit_graph_0.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/doc/doxygen/html/inherit_graph_0.md5 b/doc/doxygen/html/inherit_graph_0.md5 deleted file mode 100644 index 5dbab8aa7..000000000 --- a/doc/doxygen/html/inherit_graph_0.md5 +++ /dev/null @@ -1 +0,0 @@ -7f6d8b184abe5093adbf2d00d327c885 \ No newline at end of file diff --git a/doc/doxygen/html/inherit_graph_0.png b/doc/doxygen/html/inherit_graph_0.png deleted file mode 100644 index 5610b9be9826f71b07b6582b1827a2e6b3e51312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1853 zcmV-D2g3M?P)GK{Dfl3l4VXJ{JLi?9ep)Hmv?7r7K^;0kjSoy?ru_y6Mm_xbDQvzfa8 zeE6RaJg{?q=lst1Jm&raooUf~`Ox7%Rf80>vQADo_lU!ootYdao;MLqh|eKY#w8h!O}qF`Lb}dGqF|F|RA@5C(%G zV1fh!ISd8^_U+p@YE0}|1&TqKRiGGzSp|wgm{p({0%F#0-@YLvBqR{26-!7+i0m=d znJVik`)$BfrLC(;HquV24{E#;4?t*yn9B};-WvTGilam9jRtt?rgPfck zIGs*x*suWrMl8DLZOXGOm#eC(3i0vru-R+?fRd6DBqk=Judh$aQCV4u<;#~tqtPHc zI~%`$|CVCa)zw(Ia3N}HYW!;O$7E`en=b&odi4q^DJf8?R7gljz>_CWBn@&g&$)DW zcjNHk!%(Z$(CKtIfBroB`}_T_>4c#NrKP1DrCOH4!a`~^8kU!rv!kPfuV24rTwELh z@Z-mijE;_`)9EBhK7IO>$;rudyWRZfIa+39WYA`_vADRH0NB;lMUuRB?HYIQ-p%jd zztdS~hY&Ye4%pPw(a1Hca-K9D2_1_lU#CXU#r#1@bGZnxN(Cvn~iR_o4vigbh%tUW5dt+z`y`QLqqxb^Jgi4d3ibYdc8DH zxiuXN0X1u6WF(uKnnu($Ha1E*PM$o;Q>RX`v$K;C5fL<-%~Cr6{QC9li1N_HR4SF% zqRyE!XIy5L%QeK6D_0mA8p@wPe@b;j<2W1+sjj)XnJSe^iVX}5j9J527i}`M_?mA` zO${?LG8h#V#m$>H^Ua$#Qa`!a@N;f9o4vFcjYg_eDruf_YdRKunRUW@*2Rk#qq(_x zMBSG!U!>Q2_Uu7LMFk8715#5{q0{L`w4F9>bO~y;8YYtoBta53n+q_LE0@`9 z#+^HNke;57bLY-^^);DH((9I%7R1HHN#*eH@NwypW3sf!&DY^@!0mRUtgH-Hs})&U zS=hB}7pzvR&)9IZS}j6DL($gOCe^jJwjw@0UMkD2>4f}0`n2>e zAHLV~w_lXY<#M^0o}SLDSFh4)wK66qhE-KnB>%mdY}>YtCXsMH6059-3AN}4zi%2fO@^2QBhIcxN#%v>gq=1IC0_xBO@c()6+Ae zudj*q^z`t^kt3WpZyuwgqj~JuG4}QK(dl$DH8qtpXU>%Rd7ezqvRtm)w{LURs#Vf0 zw4$Pdv9YnVTCGx!d-v{f(V|6EtJOSn=FF&zHx>=>vuB-5EpqcE|6bpvOP4YtB7#Xt zNvy1_l={iVJjbwFtvqnx0HdR$85f&Tt}baZs!!Gi}VDJco$P=fyf0ez6AzP=u7*RI9UqeroI>()RHHR;Tr zJsZc59}l(+08>j#FbU|Db<375UY{nFf<~i3QBhH_WdN93T7rpqL{Oj@gjofOL6}vb z7=&2`ib3`RR#{ouf2l(t005sqse73kZJ=y(LV00000NkvXXu0mjfd3=;j diff --git a/doc/doxygen/html/inherit_graph_1.map b/doc/doxygen/html/inherit_graph_1.map deleted file mode 100644 index 53548af46..000000000 --- a/doc/doxygen/html/inherit_graph_1.map +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/doc/doxygen/html/inherit_graph_1.md5 b/doc/doxygen/html/inherit_graph_1.md5 deleted file mode 100644 index 4b8c23eeb..000000000 --- a/doc/doxygen/html/inherit_graph_1.md5 +++ /dev/null @@ -1 +0,0 @@ -c0b825d3659622a582fbea65993faa71 \ No newline at end of file diff --git a/doc/doxygen/html/inherit_graph_1.png b/doc/doxygen/html/inherit_graph_1.png deleted file mode 100644 index eb49af9e61610b299f610b736768781ce2169266..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22543 zcmbTe1yq*Zx;FZPO1G4xgh)zDhk%5X(vnhA(t0B_O4ANuz*(bf+LKNcXwl zwa&lK-g~U^@3qhPaQF$lPt0e|d0%xup^sJMaIq+`5C{aWg1n3x0)b)(;5+L9 z1l{l#nu(&E4B`s;-}}b=I0WK0LP6$%hFkjPjJv+Z$Qk-he;G^o2fr6si?X*vo~2M? zrIPE~G1sIi+C7aQ&3XPjh4hi}QxmTzgV%3p;B=@F;vVGBzY)Bb%uIiq0pkr2j4LdGA8G5 zjpb?Mil8u7NHHdtjkGKfMg+N&tgWr-e0h%BZc<(-ZLG_!tgP&Hb#YWyUT*cbYCMK# z=z~GsOU#9Zg+e@ktL4_VHpjKW+~-!|)GWNkQf6j3h0@P-x$%OBUf7m1{EL&6<@9pl zWXtNPJ)dmwJlf{pz!wTTJ)E*{S#X&D{af39qVw=U%oc^-D>pYmK`NEv=wH9gayut< zk)Km$=HS3(Vq(IbjS3;4p~17Uv5}FH;d@{fIrR2YDP54zOPm(I$nNPQ5NkY{{lWhJ z{;gZC>%*8uTE*5Hy&SkAccP3_-^$QG@bU5Suda7oLQ_*ybNKs9!OhKWetV|Atg_Pf z4F+W%-Nnz5k-(CYdkD$f1PDa$j~|pHC843AQgh_G*IaXYD_Bg*$uBQ2;rAZ~<56?H z80TVSVnRiDd3%>TEJ#^BeJzO)6BE;~cg2p)&%s8F)w1kl z{QNnZy1KeUtv*Je6b_9jx!(((!b?s4S?#@@9fz9QTI2oIpJiXZ#0lw^6yYNXZr;2` zMn<-}w${?xDwW#1K2=gBu5qVSqOwvuv)iYuqoZYVlHzxNW@%-~`q@YB(!hqpVIpoN zY*IqP2e|H(=-02mEhu1l`0(KqSJ(U0BCZka92}U4j;^k_@^Ws>Kq-29EL_|>=;-LN z@{BSv*ZuNTG9KNyaf6tON(sR%A(0spa^HSdNj*;~DwjgyOan~=eQ)> z=*`T=mK`5YOoVZrku;n|T-=bt!eEMJGI;%>ps2BM{ZY3lP3dgiuRF_~O{581{4&l= z=J)epUZkX?IJmkdKK=dc*Y)=%gSR+2Ib|L`Z2A5jGhZb`>ha^ZN>3FP6%l@L{k^CA z`!98LbiRG!<>Pyy5dmw8AXJ9m=W%#Qh+lTLX@>W}&z~(b^{>h;f6`-IN3E%;k?$F< zG%!7TtnC^0`O6m@4TDH;4%R7k?H5WZR_bt94i~2`DK6D^GqIOjTU(KB!T1b3JVYfW zC99*wX-ZFVaZhM(-Mo1-Cok^}Ym@hf_wNyyn3%Xxs_di;^z^7GC@9SL?j?$AmFS0t zgkTUn$?#@oVR;=LjbEdGFE%!ofSmlJ!yM&MaNVT3hPj%pCGzxzcO6~YVtI!0*bVB4 z_3x4W{Q1-E{Fpn6RwAmj>GaX*`OZQc9Z_hRaT{813a{LPM`J@n+4CP1qF%=YqBQvL z-n|=d@~+=M>HdO`n4kD!F<$GOKfUbyyN^ylfb7fjA8%g2e!b7_yrKjbO)n%=+b15M zkdW2TKqV|J3|H53da!|l=;-J;IBaYZ*U+5Etedo9HXj*z>+>=9`7K7{WTwFZZu1y< z8Cb5v^{?y)$HwyMq=OzyNxe~`R!q8g$H2gVm6bJif^?+wQPDjz5|W?iCwm2O0cI~= zD20=8=E0hZd(6zJt*y<&#r4)s+uN&R{cr3YMa$k~ZvI8&gfG(O)UCAEZ1l#!z_`u8 z!0`F==MT-zlBwLLXep_wqxA;1-XAG48!m@O4K-aNS+q6v4E}b;Q=aPbJ@@)*eer`o zuh)Izc3XvfOiWDjeOrq7llzACt{j6yLxiNHc@@GbiIHs!x8Vtii;FAIlAdKn8ym86 za6E*CEF~pX=6mI%8QfO!1ZIJ;;Ugubc1rt(*Eg_9n`dSWMi#hiiAB_&Cnv#r+u2`J z*9>l{aNLyt$BzI1ZN}t5PZ-!)c%eoR9!k>=u~G>-yzdmIZ{7P%4-fswyb?#9M6p{b z{JF6)3M`kDxYNpti1$S{;fGsWw__S4eSC7T7|e99ac~q<#8L5+xITn~h9zfxlr+**a!*r6Hs}P zo*mtly3HII9DHr1_g2_Ko9)ET^&!^soZgSQXGhM2HV zmD3FFlb z$ujXh{Tg%&3mdPU7Ul@b-|a!n$@hZ|L|Z=&A8e$ISFAB3uN7{EoO8g%m5T8#nrqSJ~3CTlSf!HHzAK zcf0*-D5vLk80`bL%plwh30v-l0uwrta}qquAP{2Ld>SM*_Eqk zrSsX0QT)n_Jxwakm?HF!dEU+`o$4b*+Xp%`I;ipfWoZc-g zMISA-25KOO-RrdAu88n+@;lF9+{$WdrjCEbU2yRYKYY30<=|MZ zLv((;u>$z3ZkBP-RU7!5ps4$;~A2G&0+gtfs=Iu!ZAG)Sjb^LLQTJqDU zPj3?va@V<%wLa=q+kNZpeNlBd&h8kY4->S^@+Zx7ZCqrrp2d8|tJ5Ok9AQU6s!uxQ zsM0|=Ph6Ol*qnA3AHJBWBl(fSG!et2-nQI>U*@)Jx4Kr@_A@(kzH+QrlR8!k4W9)y5Wm(=9m)Q_t+|LbBx~?1nH;W*a@Nh4lBfs^{LcEj0J{m(G4J z+?F;!gCaQZAXq6L8y82ZZ=u%;2d;Gf{j@iOGUC;1jAFhBp^!5~A}rL|DAD3w*C zvOS1%k~~KK4ZjVZ$<^icPX;11J&BPTF7n0i{wH*pps1})R##VtKmf=?a0%E?KNST~ zish|nsXQLzMEQ5|q0mbITxeTxDLtdvgEZxD{|l`6koDiiiYA4ZmHM+|`~L=391p?x zdT~g3dbkxHMJ-}7{P9UhXedf>TTCYb85ugD=yVC+rcsY|o3Hn9t@2NOta>k##@^{N zVyQwU7T`3(N8VxM>SQX;Qtsx%E$OK54UqeOxHar~v;ll@J5s@@FtZZUp;&s2p zrKRuV4QS&69UtK`0UgNlWR$ApN_%v6<;NfWToV^Pn0EGvt) z>n2LU^$byL*q911t>9Fy`2P=@)Q5xTl^E0y?k;t$eUH0KOi8KO=y}A17!>UKPq4$aj=7@s4ZdbS@NdfXJaW>Y zR*AEeSF5V5%mp;o^J(gf1wP7cfD|h$E5u}EaxyYYoskR@5)vt{|A9CM&17ZFEG*=_ z#Eo?C-@l)jo{_Q4ly}O=$oMufkrW^)A>q%FB5h2>OpRmqEE3Z^dGrVi^ExU~cn2{p zEobD=&z~`^t*vHNQ`PpFN@^>+ZZa}1qw3mcnj;DEBvx{UYId7&^`&$gG4T`0PHaiB zv5_gfSLh53-c+K;D80QnuNLbh#_@_#SaNzs* zw^KgDgF_%}Z705`0N^k-rt|!wBi+`y^#^8Fh|C8H2?ALendYBA%lpJvS67iNNvFb+ z@H#4rzP^5r`S#pbd^tI}lr5NDY+qhjSZLeB2$wQHoQ%mYKl}Pw%%!U{Ua$Q4*q7V5 z_5S#j-uyR0qr|sHpUcZz4mQTjN1o^^3*ga;M|}GxUsG52K~G@f4A0u~+tqk- za`J6{eiDscTw>rN^78VQ4qmXF2nh)RYDqdemhYE4Ek6Pl=ohlSDXpM@>E-3syzCSc zA0Ge!%qj)0wr8IN0W8lfkuA=^;9$5KpCn6Oa926iTa60yeyn)bsG=OFkM2pNOTd=%u34rdV+auVWY%`WNG6D9$UrPihPS z;eUGi1r488{Caeke}4YmD*L&6-c5g%t|QzIH*dLaPqVx_nXYyI_Txtf{Nl4`&u)A7 zrVHIHC@7FuQ7QR?4~&SJlQTFf3h&XQM`b=29tgNG?nF+bsD6nns=KQ1WPE(YRWijR zOTS*~Zr3)ujHu6vzX++DvnG7_zi6pfYS96D?eSoT@1u`Tdz3k#BmIkU)Bu=9}ZGt}1660rczCO0yhv8JMR2i=^(LA9LR zTslU^>*1svYA%A0x|VhUqrG6fb7ukW6DC!2oy*3~<=LMiVZN0+u7?lVBxS~HcA1f& zY30XkvRK-TcXm0^&70irf6dtSs&KZqw~^{gWE1@9FuZu++EdyFBYooI%NpO zL>Pa|UPX46Y6qDBmkm7AKeO1!2V)b-d{%yi($+u!1Bw4MtEi|b1HSoUy5`A97FXpn zh1wfMsc&CxCWkvNQMkTiZsS@HzOzgk7P7OP^aKO9F=Woi6CWn3I)I8cW)#J44gx~s ztx0JNY(>e(1D-qkX8)+-iSc^m^sQt@RIN?kn8$NhD+^oI)Ejdl#>u4q(m8KDEqNoQ zkR{%6XP#tplAqSTaisb(auNeC*uTXey{)^uuw^PthKiW9Dp;rYb;?9IQ%ICm0S_;4 z%-gqqD@t*j^0k2LaFs_yR$z;x;V&@mjJbho)9{K#Q@+8|xj{bp@# z$Le72H8lL~z@OP?pfaIk2(J|gD+L)V)ZQ6yIN>}$wV|rAO$+=UH{t#*?5#Y;_wTm^ z-TyL~nA$VkxkI@%Wn((<{++|CYJY&#hMvWa)yyWzdF`>EQ_pt0Zem~vqWJpK!ZOqu zS@>8<#@X$7xcN0CvN2LU-)`Z1oQaMeWgDE-zR^6o#osf_`z(>$n_!zT8 zBxSTo52<}`YRA2d#JilTe!LcH4(r3V>Eao0Vq={IgM-^n8Tx# z4d)DsqW${1BmC9UQgqk+km{Tke0JgTLf?wM$z_8uA`*9gZ338dl!Hscb762w(Zbu zZIv~Hzi~b4iv3KX@W>;?YRI*D=nJjSr8^TJ-{h>$sz16a5){fs8+OgqM;kvMC0yzh zS^!*%9P5E$Gj%`SVoJqs>qUUZOsbb8{%8m7eHnXMxg)Nzs>Tc0GIB<3E&kdL2iC$+ zpO7>K`G?!#S@ivr%$xrhUNqQjgI>*^V9wN2nqFPz+M0N2FcU9j`fks!{xoZE*GDHb z?j@H~$~Z-njjFI$zhdE5(qv~T(s6WTX=v~Xe9SESa$k;%@5PLE!meA2pu;@Ys~56gROtpq>f*{Tt@Ezk0X$KAnX3DOF5N5+SK8 z;nAPpt-weC8MgoWe(jm@Plb^M?g(9Dg{Kc$pL>N%s;LQo_#iG-ZI=PHR*jJGo?%1u zz(Dx%1}DvA_1K%Fu?-BIbbp_Vx&mR*peK58ncosQe3y0>7&j;O#Hpz33x%n2Sy)+H zVi>+-U~Gl=tPhaqJv5fs=l?R4ug+yZ+o$DNY3N>y0o>YjtmI3LkJ!zNGrfhz zqafqf>qs5(BV3eKjEYUTP7>0Owb{FoW2H61exAsilGS4rv~2MO{-7+9z1YisTRRU|cr zgULl}k_x3wleHr6EHhQv84$ZQuu};wV)OD!YX+;Ae)ym!BWu`txRt-VUw{BD;x?lh z$_v|x;yCg=p|YIm04O|Ehue)I)FLabvxbeTxIN##$vNyi-JHurC@bS0A2)<9_sF$O z>t9?k7$=VgM6w9P?EU^@veJ7SNiD@M$E8OWhS%qOX-&@#1l6ft3 z!f!o?&ji7hL8**(T&glz9hk+y@=)ba^;T5rYp$}*cUWv!Za7R85x_P7m+<9F zZhk(j)E*GqpO{`l#|wyzj4W(JG{=4(#Jp}!E^&F+(#D2fcoGQ7x(i_kP~`EZ3qF;M zy2vJPj&iqh%7z9*`;oY={$%cJ|J3ZCm=5Kuc3obaX;Pyh?&p2dAi^|0`P&FcKkDn1 zVSyIr$zU$u`A!=qa`(7~e%QP{gU#*n(x_52O#6Ph4w6O6$jTN96U*YB93M-vlNJf% zuq4JOST1!k2znkG0rPhT^osbHf{cl~V*j#re`jeu`*VdSP(4=WaUjAP zzSNz7zH=lI<@}qqGXkIblt4PDtmqGUUanQ6M6JLzpn~Q-mwxXIMb7{ByhxaKIawbG zcKg$qk<4XG`A9JkdHp|sHnG#OO#ql0{ww#>{_6!P6&^Ym2?vRquC!31z{0ThX1sfs zO+Tq_+eq`7!U>7j*%l#;z-{K$#^+zh>7g(wCT_MI?@DC7pT9v*pGYS>nRF2{hMJq3 z+tS{i(=tU!2nRB@wT%o331JHPWcNRF* zeb@ym&+%4ut)SB{)5N!Femd+yU%yJcu(kb}C5?_lc^?P-69mG@$cSCP=CQ8UZ30PE zRs69MgKG!}L8^ejz?Rur8d+J{@z3Vr6`vk6Ur*`@Oi8%~I1;=PI$|ttx1DE*&zQxh zWA5%oa64@aD=R@iv*p_Q`czgdYfHotl1fTAz)9Zc=c8j|W2XdsTW}yCB0}}_^nAHC zcmp2Pc>OC*kNs5?X=&+Cdetgf7dp3`_4TPf6&E`K^wpgzp8eXnDd)abDc{Z)BKi1{ zot@AAcD-IfgZ}WZEit#9fJF8QX@mNb+xYmt!hkgt7-O02tNC{i51C+91or&<7R#Cq z>i@=HQ9Fn>0b+Io9eu2hJx2Z`0AONbVqiTsVJ48jO%_tjsWq8ym|8m0|6BDdpld{e{)^xk*>>y&cr*(+mBZd z>{idR3(9l!!H`gVdE%7XD;z2#6;Adi&*!3vQT%I}!j$jdoMeFJx1Z|yK4OsdQtgT| zu=rjRLvfn*<$q+$RzirEAi2`hvvP9YMZ~A30*`Zbb#4E>muqfnYWf{`tDRJls+1He zNIeR1OaC{zeDf{>$W!c^^ucoX=Y)UQGtnU*`&^g7pxN%~J|xbyQ%H$q>DfJZzg07h zA$O$V?m3El*E|!}1 ze|C2e1H;1sNl9cNfz1E<6#xnc9W%3h-ltsi4!+{a$w{7#AtaqPru))2Q0Dk2``@6` z*28nKR#L<@jO;K(L_`9oiVMrn%0D+IhItPzheThI(Z^gj;a&))jWS&yHgf#?OZoVO zx-FIe&$ITBvH00M06&(i4{<1~FeNUC!)u*`7d9vOlf^tS6uX`b`f6j8 zV{LABc2>~qn2Vl)VPSne%x=c4G=6yC?UhH$e-Lhx|2^SuM(Y|NNKmNE+Pd#5aeqYu z&!ts-%ZWpW;$2&;h zY`n}E1pJh2henV%kOnr5xEBUZG`gy)>WjH1gHx~NTR4cF%?aMk>00&ezqQW4-=?L7 zKmGE&1%!grWFcoJ(4Jz_)AcQAVFf)lG{ghLGCn^3*~RGr!VjFq&MmGREJZV?ho<5A zgDp4t!E;=z9Mg&m?6}JlU1Fg9Hg_3IxBmX4EZXCD5}esTvoF54F5dimbfssP!lq3# z&>lMVZP4ikhhak+ji}p)&227O3p4!xlLZ*w;ghkx>VM6VPV}GH^<_a zD>e16XqUQZRgs__ht@8f^D9+96SlP!7+8q+!v!L+?}vlK0NXxGv5G8z>f*&N>-f$? z{_=8xtm5LQ8+#_@*Q@RKxZRz$LOo~dBpg?i9!jCH21(wxi$KXV3h9@KZr8IvVc_RS z_dPGiASCS3k+OU6NKr8+F)`@vTLO073VE=;iU~x{KBQ*Lxf5X7WbWwd>0LWL-70h6 z)2QvYpQ8yD^X$u7Kf;fZkC3=hYW*H3U~FRIXXKj^iFq@9qVkgCv55&ilj^$&^Pa?( ze|l-f1d837(~W23(KKSk%TMtHsang7y~|uSl#)|iK0R6d7GvghWPtMv7sJZh2?ztY zzTRlm)Kyb@tO5c8qTaewo&m;&)Ravh7u!SA21ZM26)P(E-j|j}{z&sKv!7F|#T4S^ z#-;Tk*R`2})eiM`9)9srWC~!%KE7q0{J1c2o<+fAoI=bCoJJhYM z@m6{ zPFcup5JhookVCM3E=)`Wu7|kyian8oQgcK9I}q_?ac^{hKm_4;T&n0|2#(LCHYZ(3 zX}!1}O&C~?gkVI|N)*L9nBTNl>Eo4WBq`0v%Ax^x=$Wl8j`o;%NaS*XphwUXD#dQj zj?PPgPq5>@&NkJ)j@DOjP$BSsF?RLo7oWDcyQm>De|@Qjhll-w(Bw{+jDZ|%oYR$a zuyK&k-_6Ikb?e0KxNPys$x)-H&|tU&IDSY+adfnEb*Kv`Tka^ZvXZ;*RjC^}#rpT* zo~13#hp))eJr)UfDS~tcC%6Hnz8Cc_muMVs1g!I$V*ht6#`L92S#dz$~yP?v)&E(Qhc< zLqV~w5Vr{k6uHaRy%GpQUWChr{%@N$E{>;>;c|T$BEe6xWgjpS6|gcTa0y%?=$~+7 zVP6HwYg`>?zcZ8|r)au?xXt>&-JM3}14KboZxby`GkRdrFVhm1g3kk{{6V6k@{bmL z2`V|IUKaq>8oe1J8f)d>_BJQ5YcT~F7-&;cRLz6PS>s9ytmKl@Ud7XF9j=+885mIK zcJP^Y;sgW-vlWZy9i)hR3m^WOD_!S8d=pYz**k%K)7sfZ(fRv#me-*Qo|e{8+8@0X zLNTIg8vSZ(@8RI2TA;@J`60~A%}1WD%r@#HO))B=SR9ZFEG->C$}XxPFJziYPp3~= z2pS%yijNse{@w<&iw%V+(+RB;&Z-NVhs%qsl{S>%eMr}-0ifoLUe;U z8yXwac=2RW(DA4~9@Iuec)gf%#UdmO9T*t6P6$5kbwB_8mmT)}8iw~!Gq04k38Xzd zXu`rC<(O|!n1J1>_C3;UxxBpm^*?ygGxESP?qyPy`?s_stin4qgWrAZjBzsk$H;(d z3rjShxL9bi+I~WvktagfM4>jYyVol$(>JO(F=9E|*utFT*<=OvH~5}hG**s<@9O%x zyejpVO8&0ZpWZ*g)BE%(0?_$&Z}0mq%x!!EptB_pswq3v#$e#9eiXQMRUJu?mj`(u z9a>P36yofX?op?*SOX~mhYb7guh4tjvs)2t+V@Z;8^6~S24c%KPfXMmNSTt$Dy050 zQ+2PF)=mJR;2@Z;OZ)x%cdW78b)Q@0;BoGvs;FoUu05=*;9Kq+dy)`@hJNc-*wuI! zSHyZn4Z||*A`K@iY2SL(U)=K#y?OUd|L@!HA>yT9pZFRI?;=pGoLsTjGExve36Ph0E6;lGY;<5iQWh<3 zBEner4QWz56qCPuBogaG$c&U-hfsOKktDBxfW5{P_+UGGdp5&W-Fd~up&)!@8GW@I z#FmDFcr7|95ROmJvPM^;uOMey7#?%m=<4W@Z*FZF zo0$c0=vB%0U+nL?4uBJfAYN4uS-Q-sgPXO^7x`Ne-AefReE_U4X` z8y+4WWneThEv_HjXYz61VhL~Z5y81Nhz(mCmdL9gI>Kk-NAcRY zls}#-pV8CPQ@q@3fpx*d&!7A8BXf6OU!G}KR7`H}9hCRS$8MmYGi5!NmyyZJ%K9}w zFG&;{U}!k2{BN3Iy4ybpfxxf`3f7D+KXRFwcHA5HdYGtwO_jl zH-yF%mtvFRDJgx;J#kwgMOfieDw>y`l7b0xe2R;TiV6Y*6JKE>7C?Ul0x;KfqbC^%^=~9^`-O)qW=!$l zzwACF4>B(FSmrjTq@>jU>SOSHrdY2!#}}v_h-qyh5fK64Qq;M`H9CI@3OXlHQc`-G zntJ-zjwS$1NATPltZOO@l?w0NxwEsoivq5Wni>)6wQC#GCFQ$d1L3rB`4Pqb1)K$3 zlaQJ^62Rrs@$S;`dQoXkKR7#7^f4He_g^%p3po>)jP>+j+kmDD>8h5c-TAe((569!J}exRm#w z%{6%s{$>m20<6bn-c2010rnt+@XJ*MME@cv_^~d|j=ENUq#2u3QJf#1tDxyZCqc z<@p&WEdUf<-Bf~bP*A_&8u^MTkQnpg3?Y;~cIB9@ZFPXpY z>XA`XL%V0>gLwU(n1X@|it@MVYmXU;r1kV}&eXH{EYr7f6%OSn00<%kX`=J9dC&az z_H4XzC8oRkmgAL=MNN$tE?)38TiYK=Hz%|~_$N~Mp%4ZUmrtJ{RGOUlULo#tS{mg$ zadYQ;%;6;^TwKlZ#PVBZHEJ5;I`R0?6$+Jl#GlpEPm^I?f(P|#*G*$ z!b|%zG^)#Q3A&wa(LS@goDt>5F2FYq-=+Q2*GVWjUefRvpa7uC~6UXg(* zLo8rFnvsr+J7u~xx%*F?r9NGEfZ==PeeLArDnrZi`REhj6Yr6;&8Ofkw6+qYrYiIF zu(ffGfb#eT7cg?%-7CeuYCEwvu(z9(%jBg;DwFlT6U*s5G&iRg_0ivBDgcq&ZD$@c zEL;)g+iXhRB8_(tkKEMgsH`=w@BOxlmtZ-eYR2sa;mSFjxmNKB*;re@*Dk&1RBbb+ zQq&#!#75j`3RjEM$j1-r+ifC+oP*>v%5G|kwV&D8!Y?i7;%6+9wQ@&u^xain=*1+A zpk#<7Nf{Y^e0;KKLj7xHT}oT~`n79>`}+X{gR#S37uagtcIks~3f$ZE3V4Jv1s!kt z`1sQCA8>=r^r@Kg)k+{>!SwX~`Cn$5OF|&B!D-*7JmqFo6XJtFVdPSm{cX-aU$bKF z83;E|PGV3CW6%*9*lDoi3{kjydbUkX={+}y%sF34vo|^2U&F1t(zDrFjS;62-^8%l zpnti+ga}qYincJ}MvtbYe80|rUs%{=bpzY@+3kQPpN?#APr~?vA3opS((xNMuM1M) ziHe;et+3srIe{|oGb`Bb6@^eVvcMh`V@>?s5$`nBVwXzYQ3`SMjt~iL$Xv3A)ppNl>4hwW2g`fg`iQ;yLT$;uN1b1T_4i7RXnWprWsdV=Zw6y zgz$yy-cp)< zRP&UlNX>Kz(>5+(PDtr-*47=qhPrGSCC~U8iuNb!Z8N?b7(<(~z1W-)7gdZp> ze(5`XNY5?vA&idB{?F@f>~!N~t-w3WNiSbk%x~LqI*Z>UTv++R9znB(^fa8RhX&^7 z$BZo60F_Kmy4-!v!J%AJ{}t`ktNSftZCrmrCJM~YH;tUwg|%qdKwvUbcn!%MoSdv@ zN$LzlI5ua_#6b=pac@^*gw*DXy!%1M)?g%%K$5#Mo#lz+(OYb??Y5BvPnm}X#ZNvs zTX@UJ-jfc-+XB4)g$NMm_|&UF$;XA~%~NlKrVAQ`KsVf989^bbG|835b|)l6}nuRdar6wT*0KyuU*v%vCGS~)Bv9d`X9xJC|{8DywE3k<( zYf*b!+X!$7rC>~DsV65>2S!FZVZconS_!7>lcpHGpHXoBpXB;IF|kHjCl+SrX2`lG zkW8}KyqF{2{V7LF$HIaMQF1BB!?=TA0|N-nCCV}ouh}0zVq8PRkp$5R@eBy&{N4$C)xhr{OfDUQAWtf^x&Z z{cR{$kt{haEgQs5av>*1WG)2Cs>#M^F#-Y7H2etp=nU#K^owoi`2__ixVU&)pUC|O20AK7kv;}U^1qUd@)6F?(!H5~u;#yh z4{!y$y(fwG+3LWbGAnf)pckn*5*#W2J|5lW7i4G0IXpb%;^Apc`|?D59>tAnPIvC^RSp>k8X>u6}*j2DCqvhxdV!Gp^+HG;>dr=#Pq zB+hrPA#>ezuxOA;ZHPn_ebGN?YX6VE0lEJopIgx7n zx2@ayj*#G|-1hb}tg*d=G2d8_zxKzBL~Hw#lEN(^=rCM5mtrf6gN2oYgtds$ zx@&4G4Tv7eJz4?+NsyX|Nk|?}Oia9lo%3@=1tS9TPO6=qos7ggH`iNo|u$W&B4K; zxCgNc>)XuEP6cG9xWu1BL)i@tqNtLPxPf*Nn^AU;jpFK6u)x}vcE3T)s_F97#!8I$ zdGGrVALu7*o$sRDrlqBYP&fqSZ=*`OySuw|8fkwmIx22j4r+H^Y{y)mtYm}chA2@{ z(Qk8enUI^xbxBA}j13Ax6Z1LOsVk|e(OG#?In#ZiIkMc7Q~=MHf3(N*2kTfQwMZgl zd6d1xGhe=ZY1#7T21LIe0#CT^=j80Xd{|%pC$0PNI_iT+!R3OjJuv#HAb2Z1I-2?D z=4VhCDfm|PCMs!bX8l7$eX4At2!TBq+2(!osn6c}#%&frY@v zfgu_BOYh)`x3AV%a!&7(CKXP?e@ns{ZTPq+94VW7h84na1abZ%=j|kv$|6UiM;n`G zLwPKMK3;bOsh)k0730tA{1gf332e)c)#dMQ`uW4|*yx|Sx9MNx zh(mvaK8t~mkB-2h;KP8e>{@hJ8<~;UYh=Vrvg577+2K}9YAWjx4Izt{#fRZxjTG;E z43YY<4HTFr4oBMtZXOG9SOFjM zo-{-^hjxZk@22G#z+U%aV$pvnU%Lg|daxj0NB86HxTPo$zN`CEUS8m+)%Gv>)CQBf zmbCQc)D&z``fl*@82Ie9Ph|M=SbIh zxnB9pHJY5f6~3ow>z2^QHt$p$5*5`6SwF|~V@I!p5$(a>!T7XzG4cUOat7f}tg(&d z_sef>&VSJmy%5>`&haKrTKn?{nN! zD;pcr$qK8TgM$tbCmi-xl)X-tllY^y69|0`SkFca)bApiX?@RM!!`uvu(-t$;rIGA z%1U2GxYbY|q}xs96&2ec)Vwock!jo+acj^C%4jP@smrZLSa;k+!F&cl*z^E4!AP@1 zKr%?91V&xT%S#lgV?$nU_{{&A?Y}ZOOinBwkF01OdiwKO5(LoEe^3>lkaKl4dhFq0 z7*~BKMt&7!R6eI)&(|kiZg3biC2i03+x~S;lalU=e@IVwa(1TvXSPwn$S5-i=av+- z74ew*{kQfSrhlisCjZ;Gjd|nM`5r#Xdw@7S-j{%T_$>OUkfI8#MBQ?e8wnsYQkKH< zs?2C;vYoDp5q4RZY4kYw00C9uF4qlR$UW}EVu^#8>)QHyEKp&{DL$I4ex#tFus^D2 z{{+h4cThXTFON;3#cTMhuWyP+kvKRamcX9lfYf4HYZr!>SlaN4i0}X93 z;ubGto-6vs)PG*gCeP7_SYL^j6^Kw~eNqZQrdmKz{+UfHtzEsAzraYJF6=^?CU6x9 zaNg~A#-&c92bIVETVHKLmtkV{R}fStU0Ykjz{XbB&A=I=8XwMhG+dHF>bj+i5Wl(w z(L%`!O6CV0_}F+5YvVQdI0f_5STdWg< z%f{#}i3`4K!T3hSE@-uRNQ3iuw=X2xC=%&xfC1O~qj+(>IT$}}C5*!*J~=r=VAky# zh)U2$Q(xF-4BasTD&98$mBU1BPBM~h`B}~ejVEcvTiw4lA!z1%nG#T}r)tt3@`u}Y zG7Z_z0W9*q9(&>Z%1YkOng-5LY#GC{_Wp#$J96O)0aA912P!I0zEqbM7h?j|Kwb*1 zPjZm+?`@NT_x8IdzhhWKgN>85+aS0xI4}=s39*-(AH$Dkr$Ql2m(czsCB6ThfxmKE z-u!UE6uI!ro1?`d`WwF#pk0X;;vw&)gAd0mZNvwM_ENWkzfMA3FoCYX8V6$ztzwE` z2DuXB@iOJ(?RxTG%b4q>e#YbpCJ;gKIN<5Hx;&!!kR3-r?xs7k@ZQ_gmfdhOD4gtT zdl-o+0nNJ*NPu_Lxdemi|8aeXJgDHtS(a+3Y=j%`#;9_$z?@9>EBm3OSKqWa#KfqP z9VQJ|ml%*S>Qt4;Xor;z257V=GEkB8?(=uv!>_Y9CA9k-(?p4S4dxgHuJSkjf2dW%<>j4TTI37AHTvm@#sa* ziSVe75v5=4vez9bex2;`1O(qTfpbBkpBA!}3l~Rn&=nUIDZ(2OTb?tm)NX=FdheWC zyF|1ZmTvV&_qS{ci~(0?Uo|$T-AVIRW@L}HI{^@IJ@2PMm6jIM4DRA8hI{()5xUl9 zXJ5OW?h8dxoscszt-mTv|1dcCZvJSlAA*b5!5-nV8bq+`{t6QJ?$tovnI+uWmvb+a z&giRK86q1C^DWC9m%TxYi)u15`ce)KqBLTx&0r@Y8_3)|4%MfI5VvGAApeP4P#}~n z=tzl%xB2?*+ZzMJFHY3ohIA0Mcg{+I;eWo@Po11h{_J%B0r=Ql|LDx3X{#WIyrH~_ z2}Pdj+-s|$*?`Q9GkMH_<&G`%sD}DirvkHdWo@_=BJB4hBEC%^F^+|Ff}elt&nI)qNzqa0g3`98FZ@zW89aa*Wx+0FR`NL=kd z?0?7cXE9d$33Ru?T5+6jHrH=DN65;alJj@dEOm*P{*w2!w5mMk)gYH8gwc$FM|FIB z{X^N#jmz^rhUAo6g~E&pHLo}!lFkH*s<4{c=byQX=n>RY_+`${{4NMP|09jd>*&{vK#+Yxz89c7;U$=uCi|;RuwyJ9MO_~?KCV~ebcY&1H4gP8rD>;N zb6XoBuuv_R5S$@qxbF*zss=R9mg>>c1KXws6 zv#Gg!ynGvWW$|5^(2)&(pH}QIUpG;|&v(R4P--y^x@4`}idLHc=>r zL2zCk-DKq#pOaO*nAKZ<|F*`H-x->;w6a-4yEO=<}Pr2sh8_lG=~Af-YKrqDE4fN56d=2r(X3@pCR>kc^=h4=0-uMBv8^ za+3>3b7YIhyOhw-`8Y&|otsz5rWs7gm2JbAWYzSVP{4OxQOURRNTBH;(An7&*YmI; z`s-EG>s-YvzsJnTX2`Y%RJfGa&=Xs3KSz`V((?;N*3GpRs0hjani!snt(2YqDj zAhVf300;V6>=F-gaB(5l{bvybk4Lt5MMWEA^)zX5*D~uGpDVwHej6zI?*tv532jfi zvuDJmJjnp>68e1j-0HE(?)mlq_J^;or7T!3$X@8wb*DGohe$7hmKHx$<_*YZY?YDV za6USFxzKt8@%G-{iI4v4ta`k)uC;mgdRO_TCD@58S@g z3S0<3b|d-2s-+Reb@OD=6EZUkGFbhUw@Jen{`|q$)6;voI)Ks^gewi95k&LY7#ZA6 zd?E?P^?{+GHsC@C4X+>g*x3G!jbafI5oP8*q*hO}9%Fzw#LLT@oSOQkXIYAw*aRph z0>mk2tBG}^Mv@cOlHy`qaK*?eE?<#RKz{~=TgIoRvH@Cy)7l2l0BAHmuwfHet%IK- z85jtl7cA~*q-F+)+@&hN;3@Y)f;?kvC&+C7Z@V82FmNcmG~kpC6zd6i9Zp!l%QX@b zBZ2zSfir;)f*=+uMW4xJ{EXRT{{*KrN8|FgFcKtg0S3!B%zOk zBgEn(aiy3ptzgLbo9e(xtZccc(!yb0aotbV9&*EB#HAlhib(aMJ=k@IJ=%1hsQ-+) z{pS6HC(Q(uG?*Kg3uX9p@2|fJEfeQW`96Dgq~mG-^zx8XM8s$i-c+y#M4K`0JMwK3 z6<#NQN#z1GH8tUt6WdxzC zQcl7PPYn_1Gy;}JpYZ4*#I})P&uaTQrW7UFY}rVpmXh_t!GUY}_wP6j);pk;0o@WV zuYReYdX)W`S)QF#T|X=|4cH=0KiuT7VN`b#vm2 zjEsi1cE0n(pRFxraNe0cA;$T4ch~A@|KVN|%x^F)rAzhg>`GKbeJxYoiHCXU zy9|au4Uved*MKJ`K*|9lj(G*$SUzND6OxeRYL`G?oA555 z5gG#eA0huns#ZYkkA^D+4RC##68PBRzE=|hTcsr>cwaA1*&r>bVg#W}gddP_$)XVm z|7W${hy4t?(~R9=?-V{rweyVW^Z|Pvluj^C-#{NL% zs^y+-PhYj?XKqVduiNM0eP;wY&S7hkKf?v2%GNX3A(ucaK*l@IFD|$(2X1G4R=)XE z9po)nYpJXCKlT8C1gNzuitKZTr^^7Y1s_+LUdRd7P5=&Pva2{NT4{@ z`P>r+f97bROO%{>sAb3Oa}_it>>p|?K6*8Eb^(y&8EPfsKD8L?_Z z&wk}SM!S20EU&IX!z1attkY-WTvx9Zh4A=04+OW{j2Ov!F@bEm=(h35J)c8j# zf9oM^8By#SD7Rh!&t#-w;(afsV}w@a~uG>01AdvC<_l zD8_0FL&C$QA3Q*Tp2&a%Htnj7!#bE{@W}`4q|(J&;OAB%{MOg4{U_aj)^h7*2n)6L z_GL*6@wx2~oo;@)(9qMfUw4@NF(70fDJu;jcScBPTlBw!chJbe>dub@X#Tmf@=mT= zfjZd_J8GM{Pa3Q&JUp>f)YK612}NoU9x$&)#>V0xFh4Ohg?*6PA6&&JF?mkPU#z7F z_x2LN$Ni2WFCj6pj37MfM<(UTAgHr2Ff7$x@Q)0h+dq7G1748x7Pfv|axOnoPD3T@ zN?qo(^mHY7PXHZ+GIXJ5w_s$QtZHJg4iYnuA!uL)r3O}o3}lplEiV3TH62ZK9*UXz zyF;`Re?oUO^Vs!}Lq;y&=H;QmPARXT&>~0c zZMN>9BhaN#oA!5qGdR;H40>pJ^Hi^B(}m)W79SaCsHotS=gSKD-@n_YZ9yrkKmD()xSnH)sy#>eJq(}ioNc@c^u1IM zI+{I0yK^UKrl*^n7f+>IiGX;YLgk%4PH`0q9i1NZEOMv^x9e25DWt4Hc&l@F$q@r% zN6PKEdb~;OOV8X&d$Q0%sB~VwML*4WIRk3FYb~5EbEk_oS6(UI->~t85_Rgkz6PUs zZuNQ2=(69ZTh*vuf4>_-p?}sDbwbYjysSVPb!XFQy5@ERd#8zlr; z8ix9=`Jq%aO#uN}QqbP-Jwh@8Ob{`yVTYGoh*(9WVBIwzWs(Vixa$(_l^~vk1ZI^j zc5t{Nr+RRQP7+-9tzX><^*S{>zPrCOUB;_8sNk{vKaE^@Jk)s~A8U6@ZHhLeM9x$U zW?bXSu|yeig(*jqt6CzhEn8}_!x~2-#$Ao1WhhswVMU{5iX20fP)eataxMG3XZQ8| z^}L?f^US|9^E5UQUvJ5dZWqS94fyda-;dsk5j|iE>(T_@&y%40{=p zB(H}%-!@oc0603vPG+*BrOyoS2>1=#4N|#fWjMoaulYgA!u_`ih z6U=@u<`%}Bua|abQph|nLrjo$cl)m0R8z*IY=n9 z@zByj{$%6YdU^-@LhtQRDS&7CyK)&)WKNn#(VgSwNgH;Y-F2!~a!&@;`Y_vUr^YD( z^QPdqlYcI?l+&pHBB$YTZotsU2p;u;2Tkz<*TfUFE1GOsTyogFXo>eO)34-VEe`lr+KhMa zREVNxu%y|mxRbahmTeGujY0Uf72Z*2WYg0fBxDyTrt`0e#$o=?r7#Op@5ZX;rkW2N z>;JqOmU0`%_M>r$xiM2O8Gnz-c4`a1giKziLkjU36ObN0(%_AiMGjZA{fq{CnYr@t zim?h#@aqH99&R1>Ko1(8ga&B<| zI)9t+SE+m5eqLJqYpqSv0c%T3QPsUNNgfqHNk~r1|7jfX+3qEq?-k_g8a3Q3UpCl# zvvqE1R?&dcH&hli)3EpMK{IkP>u%q;JAQIQgv+|_kiOK=0!IvtIEEo;iiihdnl=Efm5Uxw}m-n+ULySU#8S2s2>@jZGp!ME`jxUs9QgLiH>oRaN$oiKb9aTm!T z0PjC}B7q<-NFpfc{a$mnR+fBw4;!}@bo^-<8LR!o>Cz6mzpXm)PWuc z<>TfCTy88D5fOnw8RR8yqD&mT_oKwBSfSkv-OvvOF59((pBcEgx{44`+qQ|3m|U1(QNaEKYL#TCn}nxYAuH^pUpw?{^9u00I# zyl?CoTSKc=>Y!Z60&deKlSk7Q2cy>tV+HQ(5K>!5D1NfCvVr$w#47zCWr;rs3I=bQ zC}otK=8m;0P|bSrd1G?4gy&H<6haVH~) zDU__4yRe5%b?^5U^BWr*6V@K6b{nDV#Hd^^D{DpwmdM~!{aRVw`k3Il@xj4!Y_>88 z5qEce7+{gxQRD7~-AYB}E8(%~&n}e*b*hf{*9arYMnUDdm3fsq6EVtoA{Yq?tHE>a zqtSkg$nosYuWnjFfEOq(F|j*)d+)tdB=9^PEl=lXmjRU^*k9kK(Q`et9)|g$_wSPc z1QFmA#Y0i%8xX({5&asprG4oZBg?j+JxknhYugFtNl6(kr-563t7~uHZU>}$i<=1t z(+sXxL8M@O{20dL%EH2FMa91QD6_=PhE6gQA_cIo?DO+enHb<^6WT#r#m9}d66@J4 zQa}fiN^Dgx3YDIL^V1_5N#i$e+z5mmv{W-v5Or9t&)1gi5$vz2c!i_ie*ykCuK#%Ue?1+GhYoJ>}U=)HU zTu(SXH|d+u%;CPNylIwhS128@hY58$o6pbM`hQ@O@CC!j&pRa~KuNw;{uZ(dr)}R_ zJS7D@PDxI7xJ#_jm0e?7=;T=wESD&&`zt~Z)ipE{<2YoRlDpR z9Mpg`di;+rc3zqT{Iel^N)74U-#NpxYe`&mrP222hYTnKl6jV1LPKIE$-Hy9Ka!fg zrMY^L&A+n-ITfX)8V9+jT?3w@l8iCC1g@^5DF3V-%yx(oEM~K^1^meEIvPge# z@2E;1;Nzy8G}rALdl1h8B^ zn(zrM>OS%Zk7qrXe7P8EQ9YFraMJA%t?tcB_Xw3W8$=uFoNaZ+Va z)b|Z1T9{Sn?^%ARE`cs$XbFf85@YSnrauWYEoI2NXWxcONoo9LXkcVyshJU-x8@Kg zSFG6O$nl@7V&I$_PBvR!C&0pa@8e^miPNJ_dtQarPMVsT$>SQjc69bFSE`tTtNZe+ zuZH?V>bsBXo0u%cPDx1oFy4C}YoTnVw?H5u5UM;Aq4#KNZdO9pAE>#u(w>16eZBeW z*eVZNLyv+uAw=SxzjaFojp$WSA4pWgWV!3=6CZRtV37?xaTl_U-+$e(!|}j@Z&-VU z)*qqUtC!ct@}%yYvD#B#(=au2(Cc_rbpp52XD z3n>d4e6yjb(WTES^k)56^kAr~ewA6XaZFjuXTjp?6QR2Z;YjbER;bO-&tJe=T3f=5 zkKc+`lGFC|(@T|l_E@3+7gF%H(DxPulG9RBc0o^}ia$?JP8Q&j#X801a_fMPt|9I) zrJ{nQ;aM5ib)?D*M4kf;`%-rH9&>YZp*|hBRG4Fg1_i*@)%CQ_p23D_bz|ck7zo;j z=OYI`edkQ8K6bh8%wmV|8+G+~L=!!P0HA>0)2AKy;mw!4oVr1q2%QT5ahnK^XVoe= z)Ie5~>>^)7L_fi8aKWAEoY4YHG}U`de{v1K$1%@F0T>&!TMRc|JJNQbK$9 z#~1c9qkD|Fb(nL!T+{sAkmcT$GG@<+U8vHw)|nG`1V<-e=?Z~VVRO~}+Hp?uNi z@mH$(@nlF!IcXc|d?ubH;TPUpeElE6mKoR<>r+BPQjJ(!;d@6T>$upP)Qjoqv6xI} zMnmsv-KCq+NrM;u-tF_8|Kpf$ggX6`>zLZSy!oicQY*X3Lv^_Xd~Cm?T5&9Ve*PDi ChqHA6 diff --git a/doc/doxygen/html/inherits.html b/doc/doxygen/html/inherits.html deleted file mode 100644 index c0b5448b7..000000000 --- a/doc/doxygen/html/inherits.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - -Dynet: Class Hierarchy - - - - - - - - - - - - -
-
- - -
- -
- -
-
-
Class Hierarchy
-
-
- - - -
- - -
- - -
-
- - - - diff --git a/doc/doxygen/html/jquery.js b/doc/doxygen/html/jquery.js deleted file mode 100644 index d52a1c775..000000000 --- a/doc/doxygen/html/jquery.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - * jQuery JavaScript Library v1.7.1 - * http://jquery.com/ - * - * Copyright 2011, John Resig - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * - * Date: Mon Nov 21 21:11:03 2011 -0500 - */ -(function(bb,L){var av=bb.document,bu=bb.navigator,bl=bb.location;var b=(function(){var bF=function(b0,b1){return new bF.fn.init(b0,b1,bD)},bU=bb.jQuery,bH=bb.$,bD,bY=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,bM=/\S/,bI=/^\s+/,bE=/\s+$/,bA=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bN=/^[\],:{}\s]*$/,bW=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bP=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bJ=/(?:^|:|,)(?:\s*\[)+/g,by=/(webkit)[ \/]([\w.]+)/,bR=/(opera)(?:.*version)?[ \/]([\w.]+)/,bQ=/(msie) ([\w.]+)/,bS=/(mozilla)(?:.*? rv:([\w.]+))?/,bB=/-([a-z]|[0-9])/ig,bZ=/^-ms-/,bT=function(b0,b1){return(b1+"").toUpperCase()},bX=bu.userAgent,bV,bC,e,bL=Object.prototype.toString,bG=Object.prototype.hasOwnProperty,bz=Array.prototype.push,bK=Array.prototype.slice,bO=String.prototype.trim,bv=Array.prototype.indexOf,bx={};bF.fn=bF.prototype={constructor:bF,init:function(b0,b4,b3){var b2,b5,b1,b6;if(!b0){return this}if(b0.nodeType){this.context=this[0]=b0;this.length=1;return this}if(b0==="body"&&!b4&&av.body){this.context=av;this[0]=av.body;this.selector=b0;this.length=1;return this}if(typeof b0==="string"){if(b0.charAt(0)==="<"&&b0.charAt(b0.length-1)===">"&&b0.length>=3){b2=[null,b0,null]}else{b2=bY.exec(b0)}if(b2&&(b2[1]||!b4)){if(b2[1]){b4=b4 instanceof bF?b4[0]:b4;b6=(b4?b4.ownerDocument||b4:av);b1=bA.exec(b0);if(b1){if(bF.isPlainObject(b4)){b0=[av.createElement(b1[1])];bF.fn.attr.call(b0,b4,true)}else{b0=[b6.createElement(b1[1])]}}else{b1=bF.buildFragment([b2[1]],[b6]);b0=(b1.cacheable?bF.clone(b1.fragment):b1.fragment).childNodes}return bF.merge(this,b0)}else{b5=av.getElementById(b2[2]);if(b5&&b5.parentNode){if(b5.id!==b2[2]){return b3.find(b0)}this.length=1;this[0]=b5}this.context=av;this.selector=b0;return this}}else{if(!b4||b4.jquery){return(b4||b3).find(b0)}else{return this.constructor(b4).find(b0)}}}else{if(bF.isFunction(b0)){return b3.ready(b0)}}if(b0.selector!==L){this.selector=b0.selector;this.context=b0.context}return bF.makeArray(b0,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return bK.call(this,0)},get:function(b0){return b0==null?this.toArray():(b0<0?this[this.length+b0]:this[b0])},pushStack:function(b1,b3,b0){var b2=this.constructor();if(bF.isArray(b1)){bz.apply(b2,b1)}else{bF.merge(b2,b1)}b2.prevObject=this;b2.context=this.context;if(b3==="find"){b2.selector=this.selector+(this.selector?" ":"")+b0}else{if(b3){b2.selector=this.selector+"."+b3+"("+b0+")"}}return b2},each:function(b1,b0){return bF.each(this,b1,b0)},ready:function(b0){bF.bindReady();bC.add(b0);return this},eq:function(b0){b0=+b0;return b0===-1?this.slice(b0):this.slice(b0,b0+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bK.apply(this,arguments),"slice",bK.call(arguments).join(","))},map:function(b0){return this.pushStack(bF.map(this,function(b2,b1){return b0.call(b2,b1,b2)}))},end:function(){return this.prevObject||this.constructor(null)},push:bz,sort:[].sort,splice:[].splice};bF.fn.init.prototype=bF.fn;bF.extend=bF.fn.extend=function(){var b9,b2,b0,b1,b6,b7,b5=arguments[0]||{},b4=1,b3=arguments.length,b8=false;if(typeof b5==="boolean"){b8=b5;b5=arguments[1]||{};b4=2}if(typeof b5!=="object"&&!bF.isFunction(b5)){b5={}}if(b3===b4){b5=this;--b4}for(;b40){return}bC.fireWith(av,[bF]);if(bF.fn.trigger){bF(av).trigger("ready").off("ready")}}},bindReady:function(){if(bC){return}bC=bF.Callbacks("once memory");if(av.readyState==="complete"){return setTimeout(bF.ready,1)}if(av.addEventListener){av.addEventListener("DOMContentLoaded",e,false);bb.addEventListener("load",bF.ready,false)}else{if(av.attachEvent){av.attachEvent("onreadystatechange",e);bb.attachEvent("onload",bF.ready);var b0=false;try{b0=bb.frameElement==null}catch(b1){}if(av.documentElement.doScroll&&b0){bw()}}}},isFunction:function(b0){return bF.type(b0)==="function"},isArray:Array.isArray||function(b0){return bF.type(b0)==="array"},isWindow:function(b0){return b0&&typeof b0==="object"&&"setInterval" in b0},isNumeric:function(b0){return !isNaN(parseFloat(b0))&&isFinite(b0)},type:function(b0){return b0==null?String(b0):bx[bL.call(b0)]||"object"},isPlainObject:function(b2){if(!b2||bF.type(b2)!=="object"||b2.nodeType||bF.isWindow(b2)){return false}try{if(b2.constructor&&!bG.call(b2,"constructor")&&!bG.call(b2.constructor.prototype,"isPrototypeOf")){return false}}catch(b1){return false}var b0;for(b0 in b2){}return b0===L||bG.call(b2,b0)},isEmptyObject:function(b1){for(var b0 in b1){return false}return true},error:function(b0){throw new Error(b0)},parseJSON:function(b0){if(typeof b0!=="string"||!b0){return null}b0=bF.trim(b0);if(bb.JSON&&bb.JSON.parse){return bb.JSON.parse(b0)}if(bN.test(b0.replace(bW,"@").replace(bP,"]").replace(bJ,""))){return(new Function("return "+b0))()}bF.error("Invalid JSON: "+b0)},parseXML:function(b2){var b0,b1;try{if(bb.DOMParser){b1=new DOMParser();b0=b1.parseFromString(b2,"text/xml")}else{b0=new ActiveXObject("Microsoft.XMLDOM");b0.async="false";b0.loadXML(b2)}}catch(b3){b0=L}if(!b0||!b0.documentElement||b0.getElementsByTagName("parsererror").length){bF.error("Invalid XML: "+b2)}return b0},noop:function(){},globalEval:function(b0){if(b0&&bM.test(b0)){(bb.execScript||function(b1){bb["eval"].call(bb,b1)})(b0)}},camelCase:function(b0){return b0.replace(bZ,"ms-").replace(bB,bT)},nodeName:function(b1,b0){return b1.nodeName&&b1.nodeName.toUpperCase()===b0.toUpperCase()},each:function(b3,b6,b2){var b1,b4=0,b5=b3.length,b0=b5===L||bF.isFunction(b3);if(b2){if(b0){for(b1 in b3){if(b6.apply(b3[b1],b2)===false){break}}}else{for(;b40&&b0[0]&&b0[b1-1])||b1===0||bF.isArray(b0));if(b3){for(;b21?aJ.call(arguments,0):bG;if(!(--bw)){bC.resolveWith(bC,bx)}}}function bz(bF){return function(bG){bB[bF]=arguments.length>1?aJ.call(arguments,0):bG;bC.notifyWith(bE,bB)}}if(e>1){for(;bv
a";bI=bv.getElementsByTagName("*");bF=bv.getElementsByTagName("a")[0];if(!bI||!bI.length||!bF){return{}}bG=av.createElement("select");bx=bG.appendChild(av.createElement("option"));bE=bv.getElementsByTagName("input")[0];bJ={leadingWhitespace:(bv.firstChild.nodeType===3),tbody:!bv.getElementsByTagName("tbody").length,htmlSerialize:!!bv.getElementsByTagName("link").length,style:/top/.test(bF.getAttribute("style")),hrefNormalized:(bF.getAttribute("href")==="/a"),opacity:/^0.55/.test(bF.style.opacity),cssFloat:!!bF.style.cssFloat,checkOn:(bE.value==="on"),optSelected:bx.selected,getSetAttribute:bv.className!=="t",enctype:!!av.createElement("form").enctype,html5Clone:av.createElement("nav").cloneNode(true).outerHTML!=="<:nav>",submitBubbles:true,changeBubbles:true,focusinBubbles:false,deleteExpando:true,noCloneEvent:true,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableMarginRight:true};bE.checked=true;bJ.noCloneChecked=bE.cloneNode(true).checked;bG.disabled=true;bJ.optDisabled=!bx.disabled;try{delete bv.test}catch(bC){bJ.deleteExpando=false}if(!bv.addEventListener&&bv.attachEvent&&bv.fireEvent){bv.attachEvent("onclick",function(){bJ.noCloneEvent=false});bv.cloneNode(true).fireEvent("onclick")}bE=av.createElement("input");bE.value="t";bE.setAttribute("type","radio");bJ.radioValue=bE.value==="t";bE.setAttribute("checked","checked");bv.appendChild(bE);bD=av.createDocumentFragment();bD.appendChild(bv.lastChild);bJ.checkClone=bD.cloneNode(true).cloneNode(true).lastChild.checked;bJ.appendChecked=bE.checked;bD.removeChild(bE);bD.appendChild(bv);bv.innerHTML="";if(bb.getComputedStyle){bA=av.createElement("div");bA.style.width="0";bA.style.marginRight="0";bv.style.width="2px";bv.appendChild(bA);bJ.reliableMarginRight=(parseInt((bb.getComputedStyle(bA,null)||{marginRight:0}).marginRight,10)||0)===0}if(bv.attachEvent){for(by in {submit:1,change:1,focusin:1}){bB="on"+by;bw=(bB in bv);if(!bw){bv.setAttribute(bB,"return;");bw=(typeof bv[bB]==="function")}bJ[by+"Bubbles"]=bw}}bD.removeChild(bv);bD=bG=bx=bA=bv=bE=null;b(function(){var bM,bU,bV,bT,bN,bO,bL,bS,bR,e,bP,bQ=av.getElementsByTagName("body")[0];if(!bQ){return}bL=1;bS="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;";bR="visibility:hidden;border:0;";e="style='"+bS+"border:5px solid #000;padding:0;'";bP="
";bM=av.createElement("div");bM.style.cssText=bR+"width:0;height:0;position:static;top:0;margin-top:"+bL+"px";bQ.insertBefore(bM,bQ.firstChild);bv=av.createElement("div");bM.appendChild(bv);bv.innerHTML="
t
";bz=bv.getElementsByTagName("td");bw=(bz[0].offsetHeight===0);bz[0].style.display="";bz[1].style.display="none";bJ.reliableHiddenOffsets=bw&&(bz[0].offsetHeight===0);bv.innerHTML="";bv.style.width=bv.style.paddingLeft="1px";b.boxModel=bJ.boxModel=bv.offsetWidth===2;if(typeof bv.style.zoom!=="undefined"){bv.style.display="inline";bv.style.zoom=1;bJ.inlineBlockNeedsLayout=(bv.offsetWidth===2);bv.style.display="";bv.innerHTML="
";bJ.shrinkWrapBlocks=(bv.offsetWidth!==2)}bv.style.cssText=bS+bR;bv.innerHTML=bP;bU=bv.firstChild;bV=bU.firstChild;bN=bU.nextSibling.firstChild.firstChild;bO={doesNotAddBorder:(bV.offsetTop!==5),doesAddBorderForTableAndCells:(bN.offsetTop===5)};bV.style.position="fixed";bV.style.top="20px";bO.fixedPosition=(bV.offsetTop===20||bV.offsetTop===15);bV.style.position=bV.style.top="";bU.style.overflow="hidden";bU.style.position="relative";bO.subtractsBorderForOverflowNotVisible=(bV.offsetTop===-5);bO.doesNotIncludeMarginInBodyOffset=(bQ.offsetTop!==bL);bQ.removeChild(bM);bv=bM=null;b.extend(bJ,bO)});return bJ})();var aS=/^(?:\{.*\}|\[.*\])$/,aA=/([A-Z])/g;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!S(e)},data:function(bx,bv,bz,by){if(!b.acceptData(bx)){return}var bG,bA,bD,bE=b.expando,bC=typeof bv==="string",bF=bx.nodeType,e=bF?b.cache:bx,bw=bF?bx[bE]:bx[bE]&&bE,bB=bv==="events";if((!bw||!e[bw]||(!bB&&!by&&!e[bw].data))&&bC&&bz===L){return}if(!bw){if(bF){bx[bE]=bw=++b.uuid}else{bw=bE}}if(!e[bw]){e[bw]={};if(!bF){e[bw].toJSON=b.noop}}if(typeof bv==="object"||typeof bv==="function"){if(by){e[bw]=b.extend(e[bw],bv)}else{e[bw].data=b.extend(e[bw].data,bv)}}bG=bA=e[bw];if(!by){if(!bA.data){bA.data={}}bA=bA.data}if(bz!==L){bA[b.camelCase(bv)]=bz}if(bB&&!bA[bv]){return bG.events}if(bC){bD=bA[bv];if(bD==null){bD=bA[b.camelCase(bv)]}}else{bD=bA}return bD},removeData:function(bx,bv,by){if(!b.acceptData(bx)){return}var bB,bA,bz,bC=b.expando,bD=bx.nodeType,e=bD?b.cache:bx,bw=bD?bx[bC]:bC;if(!e[bw]){return}if(bv){bB=by?e[bw]:e[bw].data;if(bB){if(!b.isArray(bv)){if(bv in bB){bv=[bv]}else{bv=b.camelCase(bv);if(bv in bB){bv=[bv]}else{bv=bv.split(" ")}}}for(bA=0,bz=bv.length;bA-1){return true}}return false},val:function(bx){var e,bv,by,bw=this[0];if(!arguments.length){if(bw){e=b.valHooks[bw.nodeName.toLowerCase()]||b.valHooks[bw.type];if(e&&"get" in e&&(bv=e.get(bw,"value"))!==L){return bv}bv=bw.value;return typeof bv==="string"?bv.replace(aU,""):bv==null?"":bv}return}by=b.isFunction(bx);return this.each(function(bA){var bz=b(this),bB;if(this.nodeType!==1){return}if(by){bB=bx.call(this,bA,bz.val())}else{bB=bx}if(bB==null){bB=""}else{if(typeof bB==="number"){bB+=""}else{if(b.isArray(bB)){bB=b.map(bB,function(bC){return bC==null?"":bC+""})}}}e=b.valHooks[this.nodeName.toLowerCase()]||b.valHooks[this.type];if(!e||!("set" in e)||e.set(this,bB,"value")===L){this.value=bB}})}});b.extend({valHooks:{option:{get:function(e){var bv=e.attributes.value;return !bv||bv.specified?e.value:e.text}},select:{get:function(e){var bA,bv,bz,bx,by=e.selectedIndex,bB=[],bC=e.options,bw=e.type==="select-one";if(by<0){return null}bv=bw?by:0;bz=bw?by+1:bC.length;for(;bv=0});if(!e.length){bv.selectedIndex=-1}return e}}},attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bA,bx,bB,bz){var bw,e,by,bv=bA.nodeType;if(!bA||bv===3||bv===8||bv===2){return}if(bz&&bx in b.attrFn){return b(bA)[bx](bB)}if(typeof bA.getAttribute==="undefined"){return b.prop(bA,bx,bB)}by=bv!==1||!b.isXMLDoc(bA);if(by){bx=bx.toLowerCase();e=b.attrHooks[bx]||(ao.test(bx)?aY:be)}if(bB!==L){if(bB===null){b.removeAttr(bA,bx);return}else{if(e&&"set" in e&&by&&(bw=e.set(bA,bB,bx))!==L){return bw}else{bA.setAttribute(bx,""+bB);return bB}}}else{if(e&&"get" in e&&by&&(bw=e.get(bA,bx))!==null){return bw}else{bw=bA.getAttribute(bx);return bw===null?L:bw}}},removeAttr:function(bx,bz){var by,bA,bv,e,bw=0;if(bz&&bx.nodeType===1){bA=bz.toLowerCase().split(af);e=bA.length;for(;bw=0)}}})});var bd=/^(?:textarea|input|select)$/i,n=/^([^\.]*)?(?:\.(.+))?$/,J=/\bhover(\.\S+)?\b/,aO=/^key/,bf=/^(?:mouse|contextmenu)|click/,T=/^(?:focusinfocus|focusoutblur)$/,U=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,Y=function(e){var bv=U.exec(e);if(bv){bv[1]=(bv[1]||"").toLowerCase();bv[3]=bv[3]&&new RegExp("(?:^|\\s)"+bv[3]+"(?:\\s|$)")}return bv},j=function(bw,e){var bv=bw.attributes||{};return((!e[1]||bw.nodeName.toLowerCase()===e[1])&&(!e[2]||(bv.id||{}).value===e[2])&&(!e[3]||e[3].test((bv["class"]||{}).value)))},bt=function(e){return b.event.special.hover?e:e.replace(J,"mouseenter$1 mouseleave$1")};b.event={add:function(bx,bC,bJ,bA,by){var bD,bB,bK,bI,bH,bF,e,bG,bv,bz,bw,bE;if(bx.nodeType===3||bx.nodeType===8||!bC||!bJ||!(bD=b._data(bx))){return}if(bJ.handler){bv=bJ;bJ=bv.handler}if(!bJ.guid){bJ.guid=b.guid++}bK=bD.events;if(!bK){bD.events=bK={}}bB=bD.handle;if(!bB){bD.handle=bB=function(bL){return typeof b!=="undefined"&&(!bL||b.event.triggered!==bL.type)?b.event.dispatch.apply(bB.elem,arguments):L};bB.elem=bx}bC=b.trim(bt(bC)).split(" ");for(bI=0;bI=0){bG=bG.slice(0,-1);bw=true}if(bG.indexOf(".")>=0){bx=bG.split(".");bG=bx.shift();bx.sort()}if((!bA||b.event.customEvent[bG])&&!b.event.global[bG]){return}bv=typeof bv==="object"?bv[b.expando]?bv:new b.Event(bG,bv):new b.Event(bG);bv.type=bG;bv.isTrigger=true;bv.exclusive=bw;bv.namespace=bx.join(".");bv.namespace_re=bv.namespace?new RegExp("(^|\\.)"+bx.join("\\.(?:.*\\.)?")+"(\\.|$)"):null;by=bG.indexOf(":")<0?"on"+bG:"";if(!bA){e=b.cache;for(bC in e){if(e[bC].events&&e[bC].events[bG]){b.event.trigger(bv,bD,e[bC].handle.elem,true)}}return}bv.result=L;if(!bv.target){bv.target=bA}bD=bD!=null?b.makeArray(bD):[];bD.unshift(bv);bF=b.event.special[bG]||{};if(bF.trigger&&bF.trigger.apply(bA,bD)===false){return}bB=[[bA,bF.bindType||bG]];if(!bJ&&!bF.noBubble&&!b.isWindow(bA)){bI=bF.delegateType||bG;bH=T.test(bI+bG)?bA:bA.parentNode;bz=null;for(;bH;bH=bH.parentNode){bB.push([bH,bI]);bz=bH}if(bz&&bz===bA.ownerDocument){bB.push([bz.defaultView||bz.parentWindow||bb,bI])}}for(bC=0;bCbA){bH.push({elem:this,matches:bz.slice(bA)})}for(bC=0;bC0?this.on(e,null,bx,bw):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}if(aO.test(e)){b.event.fixHooks[e]=b.event.keyHooks}if(bf.test(e)){b.event.fixHooks[e]=b.event.mouseHooks}}); -/* - * Sizzle CSS Selector Engine - * Copyright 2011, The Dojo Foundation - * Released under the MIT, BSD, and GPL Licenses. - * More information: http://sizzlejs.com/ - */ -(function(){var bH=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bC="sizcache"+(Math.random()+"").replace(".",""),bI=0,bL=Object.prototype.toString,bB=false,bA=true,bK=/\\/g,bO=/\r\n/g,bQ=/\W/;[0,0].sort(function(){bA=false;return 0});var by=function(bV,e,bY,bZ){bY=bY||[];e=e||av;var b1=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bV||typeof bV!=="string"){return bY}var bS,b3,b6,bR,b2,b5,b4,bX,bU=true,bT=by.isXML(e),bW=[],b0=bV;do{bH.exec("");bS=bH.exec(b0);if(bS){b0=bS[3];bW.push(bS[1]);if(bS[2]){bR=bS[3];break}}}while(bS);if(bW.length>1&&bD.exec(bV)){if(bW.length===2&&bE.relative[bW[0]]){b3=bM(bW[0]+bW[1],e,bZ)}else{b3=bE.relative[bW[0]]?[e]:by(bW.shift(),e);while(bW.length){bV=bW.shift();if(bE.relative[bV]){bV+=bW.shift()}b3=bM(bV,b3,bZ)}}}else{if(!bZ&&bW.length>1&&e.nodeType===9&&!bT&&bE.match.ID.test(bW[0])&&!bE.match.ID.test(bW[bW.length-1])){b2=by.find(bW.shift(),e,bT);e=b2.expr?by.filter(b2.expr,b2.set)[0]:b2.set[0]}if(e){b2=bZ?{expr:bW.pop(),set:bF(bZ)}:by.find(bW.pop(),bW.length===1&&(bW[0]==="~"||bW[0]==="+")&&e.parentNode?e.parentNode:e,bT);b3=b2.expr?by.filter(b2.expr,b2.set):b2.set;if(bW.length>0){b6=bF(b3)}else{bU=false}while(bW.length){b5=bW.pop();b4=b5;if(!bE.relative[b5]){b5=""}else{b4=bW.pop()}if(b4==null){b4=e}bE.relative[b5](b6,b4,bT)}}else{b6=bW=[]}}if(!b6){b6=b3}if(!b6){by.error(b5||bV)}if(bL.call(b6)==="[object Array]"){if(!bU){bY.push.apply(bY,b6)}else{if(e&&e.nodeType===1){for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&(b6[bX]===true||b6[bX].nodeType===1&&by.contains(e,b6[bX]))){bY.push(b3[bX])}}}else{for(bX=0;b6[bX]!=null;bX++){if(b6[bX]&&b6[bX].nodeType===1){bY.push(b3[bX])}}}}}else{bF(b6,bY)}if(bR){by(bR,b1,bY,bZ);by.uniqueSort(bY)}return bY};by.uniqueSort=function(bR){if(bJ){bB=bA;bR.sort(bJ);if(bB){for(var e=1;e0};by.find=function(bX,e,bY){var bW,bS,bU,bT,bV,bR;if(!bX){return[]}for(bS=0,bU=bE.order.length;bS":function(bW,bR){var bV,bU=typeof bR==="string",bS=0,e=bW.length;if(bU&&!bQ.test(bR)){bR=bR.toLowerCase();for(;bS=0)){if(!bS){e.push(bV)}}else{if(bS){bR[bU]=false}}}}return false},ID:function(e){return e[1].replace(bK,"")},TAG:function(bR,e){return bR[1].replace(bK,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){by.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bR=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bR[1]+(bR[2]||1))-0;e[3]=bR[3]-0}else{if(e[2]){by.error(e[0])}}e[0]=bI++;return e},ATTR:function(bU,bR,bS,e,bV,bW){var bT=bU[1]=bU[1].replace(bK,"");if(!bW&&bE.attrMap[bT]){bU[1]=bE.attrMap[bT]}bU[4]=(bU[4]||bU[5]||"").replace(bK,"");if(bU[2]==="~="){bU[4]=" "+bU[4]+" "}return bU},PSEUDO:function(bU,bR,bS,e,bV){if(bU[1]==="not"){if((bH.exec(bU[3])||"").length>1||/^\w/.test(bU[3])){bU[3]=by(bU[3],null,null,bR)}else{var bT=by.filter(bU[3],bR,bS,true^bV);if(!bS){e.push.apply(e,bT)}return false}}else{if(bE.match.POS.test(bU[0])||bE.match.CHILD.test(bU[0])){return true}}return bU},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bS,bR,e){return !!by(e[3],bS).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bS){var e=bS.getAttribute("type"),bR=bS.type;return bS.nodeName.toLowerCase()==="input"&&"text"===bR&&(e===bR||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===bR.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(bR){var e=bR.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===bR.type},button:function(bR){var e=bR.nodeName.toLowerCase();return e==="input"&&"button"===bR.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(bR,e){return e===0},last:function(bS,bR,e,bT){return bR===bT.length-1},even:function(bR,e){return e%2===0},odd:function(bR,e){return e%2===1},lt:function(bS,bR,e){return bRe[3]-0},nth:function(bS,bR,e){return e[3]-0===bR},eq:function(bS,bR,e){return e[3]-0===bR}},filter:{PSEUDO:function(bS,bX,bW,bY){var e=bX[1],bR=bE.filters[e];if(bR){return bR(bS,bW,bX,bY)}else{if(e==="contains"){return(bS.textContent||bS.innerText||bw([bS])||"").indexOf(bX[3])>=0}else{if(e==="not"){var bT=bX[3];for(var bV=0,bU=bT.length;bV=0)}}},ID:function(bR,e){return bR.nodeType===1&&bR.getAttribute("id")===e},TAG:function(bR,e){return(e==="*"&&bR.nodeType===1)||!!bR.nodeName&&bR.nodeName.toLowerCase()===e},CLASS:function(bR,e){return(" "+(bR.className||bR.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bV,bT){var bS=bT[1],e=by.attr?by.attr(bV,bS):bE.attrHandle[bS]?bE.attrHandle[bS](bV):bV[bS]!=null?bV[bS]:bV.getAttribute(bS),bW=e+"",bU=bT[2],bR=bT[4];return e==null?bU==="!=":!bU&&by.attr?e!=null:bU==="="?bW===bR:bU==="*="?bW.indexOf(bR)>=0:bU==="~="?(" "+bW+" ").indexOf(bR)>=0:!bR?bW&&e!==false:bU==="!="?bW!==bR:bU==="^="?bW.indexOf(bR)===0:bU==="$="?bW.substr(bW.length-bR.length)===bR:bU==="|="?bW===bR||bW.substr(0,bR.length+1)===bR+"-":false},POS:function(bU,bR,bS,bV){var e=bR[2],bT=bE.setFilters[e];if(bT){return bT(bU,bS,bR,bV)}}}};var bD=bE.match.POS,bx=function(bR,e){return"\\"+(e-0+1)};for(var bz in bE.match){bE.match[bz]=new RegExp(bE.match[bz].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bE.leftMatch[bz]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bE.match[bz].source.replace(/\\(\d+)/g,bx))}var bF=function(bR,e){bR=Array.prototype.slice.call(bR,0);if(e){e.push.apply(e,bR);return e}return bR};try{Array.prototype.slice.call(av.documentElement.childNodes,0)[0].nodeType}catch(bP){bF=function(bU,bT){var bS=0,bR=bT||[];if(bL.call(bU)==="[object Array]"){Array.prototype.push.apply(bR,bU)}else{if(typeof bU.length==="number"){for(var e=bU.length;bS";e.insertBefore(bR,e.firstChild);if(av.getElementById(bS)){bE.find.ID=function(bU,bV,bW){if(typeof bV.getElementById!=="undefined"&&!bW){var bT=bV.getElementById(bU[1]);return bT?bT.id===bU[1]||typeof bT.getAttributeNode!=="undefined"&&bT.getAttributeNode("id").nodeValue===bU[1]?[bT]:L:[]}};bE.filter.ID=function(bV,bT){var bU=typeof bV.getAttributeNode!=="undefined"&&bV.getAttributeNode("id");return bV.nodeType===1&&bU&&bU.nodeValue===bT}}e.removeChild(bR);e=bR=null})();(function(){var e=av.createElement("div");e.appendChild(av.createComment(""));if(e.getElementsByTagName("*").length>0){bE.find.TAG=function(bR,bV){var bU=bV.getElementsByTagName(bR[1]);if(bR[1]==="*"){var bT=[];for(var bS=0;bU[bS];bS++){if(bU[bS].nodeType===1){bT.push(bU[bS])}}bU=bT}return bU}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bE.attrHandle.href=function(bR){return bR.getAttribute("href",2)}}e=null})();if(av.querySelectorAll){(function(){var e=by,bT=av.createElement("div"),bS="__sizzle__";bT.innerHTML="

";if(bT.querySelectorAll&&bT.querySelectorAll(".TEST").length===0){return}by=function(b4,bV,bZ,b3){bV=bV||av;if(!b3&&!by.isXML(bV)){var b2=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b4);if(b2&&(bV.nodeType===1||bV.nodeType===9)){if(b2[1]){return bF(bV.getElementsByTagName(b4),bZ)}else{if(b2[2]&&bE.find.CLASS&&bV.getElementsByClassName){return bF(bV.getElementsByClassName(b2[2]),bZ)}}}if(bV.nodeType===9){if(b4==="body"&&bV.body){return bF([bV.body],bZ)}else{if(b2&&b2[3]){var bY=bV.getElementById(b2[3]);if(bY&&bY.parentNode){if(bY.id===b2[3]){return bF([bY],bZ)}}else{return bF([],bZ)}}}try{return bF(bV.querySelectorAll(b4),bZ)}catch(b0){}}else{if(bV.nodeType===1&&bV.nodeName.toLowerCase()!=="object"){var bW=bV,bX=bV.getAttribute("id"),bU=bX||bS,b6=bV.parentNode,b5=/^\s*[+~]/.test(b4);if(!bX){bV.setAttribute("id",bU)}else{bU=bU.replace(/'/g,"\\$&")}if(b5&&b6){bV=bV.parentNode}try{if(!b5||b6){return bF(bV.querySelectorAll("[id='"+bU+"'] "+b4),bZ)}}catch(b1){}finally{if(!bX){bW.removeAttribute("id")}}}}}return e(b4,bV,bZ,b3)};for(var bR in e){by[bR]=e[bR]}bT=null})()}(function(){var e=av.documentElement,bS=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bS){var bU=!bS.call(av.createElement("div"),"div"),bR=false;try{bS.call(av.documentElement,"[test!='']:sizzle")}catch(bT){bR=true}by.matchesSelector=function(bW,bY){bY=bY.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!by.isXML(bW)){try{if(bR||!bE.match.PSEUDO.test(bY)&&!/!=/.test(bY)){var bV=bS.call(bW,bY);if(bV||!bU||bW.document&&bW.document.nodeType!==11){return bV}}}catch(bX){}}return by(bY,null,null,[bW]).length>0}}})();(function(){var e=av.createElement("div");e.innerHTML="
";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bE.order.splice(1,0,"CLASS");bE.find.CLASS=function(bR,bS,bT){if(typeof bS.getElementsByClassName!=="undefined"&&!bT){return bS.getElementsByClassName(bR[1])}};e=null})();function bv(bR,bW,bV,bZ,bX,bY){for(var bT=0,bS=bZ.length;bT0){bU=e;break}}}e=e[bR]}bZ[bT]=bU}}}if(av.documentElement.contains){by.contains=function(bR,e){return bR!==e&&(bR.contains?bR.contains(e):true)}}else{if(av.documentElement.compareDocumentPosition){by.contains=function(bR,e){return !!(bR.compareDocumentPosition(e)&16)}}else{by.contains=function(){return false}}}by.isXML=function(e){var bR=(e?e.ownerDocument||e:0).documentElement;return bR?bR.nodeName!=="HTML":false};var bM=function(bS,e,bW){var bV,bX=[],bU="",bY=e.nodeType?[e]:e;while((bV=bE.match.PSEUDO.exec(bS))){bU+=bV[0];bS=bS.replace(bE.match.PSEUDO,"")}bS=bE.relative[bS]?bS+"*":bS;for(var bT=0,bR=bY.length;bT0){for(bB=bA;bB=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(by,bx){var bv=[],bw,e,bz=this[0];if(b.isArray(by)){var bB=1;while(bz&&bz.ownerDocument&&bz!==bx){for(bw=0;bw-1:b.find.matchesSelector(bz,by)){bv.push(bz);break}else{bz=bz.parentNode;if(!bz||!bz.ownerDocument||bz===bx||bz.nodeType===11){break}}}}bv=bv.length>1?b.unique(bv):bv;return this.pushStack(bv,"closest",by)},index:function(e){if(!e){return(this[0]&&this[0].parentNode)?this.prevAll().length:-1}if(typeof e==="string"){return b.inArray(this[0],b(e))}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bv){var bx=typeof e==="string"?b(e,bv):b.makeArray(e&&e.nodeType?[e]:e),bw=b.merge(this.get(),bx);return this.pushStack(C(bx[0])||C(bw[0])?bw:b.unique(bw))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bv){var e=bv.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bv,e,bw){return b.dir(bv,"parentNode",bw)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bv,e,bw){return b.dir(bv,"nextSibling",bw)},prevUntil:function(bv,e,bw){return b.dir(bv,"previousSibling",bw)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bv){b.fn[e]=function(by,bw){var bx=b.map(this,bv,by);if(!ab.test(e)){bw=by}if(bw&&typeof bw==="string"){bx=b.filter(bw,bx)}bx=this.length>1&&!ay[e]?b.unique(bx):bx;if((this.length>1||a9.test(bw))&&aq.test(e)){bx=bx.reverse()}return this.pushStack(bx,e,P.call(arguments).join(","))}});b.extend({filter:function(bw,e,bv){if(bv){bw=":not("+bw+")"}return e.length===1?b.find.matchesSelector(e[0],bw)?[e[0]]:[]:b.find.matches(bw,e)},dir:function(bw,bv,by){var e=[],bx=bw[bv];while(bx&&bx.nodeType!==9&&(by===L||bx.nodeType!==1||!b(bx).is(by))){if(bx.nodeType===1){e.push(bx)}bx=bx[bv]}return e},nth:function(by,e,bw,bx){e=e||1;var bv=0;for(;by;by=by[bw]){if(by.nodeType===1&&++bv===e){break}}return by},sibling:function(bw,bv){var e=[];for(;bw;bw=bw.nextSibling){if(bw.nodeType===1&&bw!==bv){e.push(bw)}}return e}});function aG(bx,bw,e){bw=bw||0;if(b.isFunction(bw)){return b.grep(bx,function(bz,by){var bA=!!bw.call(bz,by,bz);return bA===e})}else{if(bw.nodeType){return b.grep(bx,function(bz,by){return(bz===bw)===e})}else{if(typeof bw==="string"){var bv=b.grep(bx,function(by){return by.nodeType===1});if(bp.test(bw)){return b.filter(bw,bv,!e)}else{bw=b.filter(bw,bv)}}}}return b.grep(bx,function(bz,by){return(b.inArray(bz,bw)>=0)===e})}function a(e){var bw=aR.split("|"),bv=e.createDocumentFragment();if(bv.createElement){while(bw.length){bv.createElement(bw.pop())}}return bv}var aR="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ag=/ jQuery\d+="(?:\d+|null)"/g,ar=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},ac=a(av);ax.optgroup=ax.option;ax.tbody=ax.tfoot=ax.colgroup=ax.caption=ax.thead;ax.th=ax.td;if(!b.support.htmlSerialize){ax._default=[1,"div
","
"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bw){var bv=b(this);bv.text(e.call(this,bw,bv.text()))})}if(typeof e!=="object"&&e!==L){return this.empty().append((this[0]&&this[0].ownerDocument||av).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bw){b(this).wrapAll(e.call(this,bw))})}if(this[0]){var bv=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bv.insertBefore(this[0])}bv.map(function(){var bw=this;while(bw.firstChild&&bw.firstChild.nodeType===1){bw=bw.firstChild}return bw}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bv){b(this).wrapInner(e.call(this,bv))})}return this.each(function(){var bv=b(this),bw=bv.contents();if(bw.length){bw.wrapAll(e)}else{bv.append(e)}})},wrap:function(e){var bv=b.isFunction(e);return this.each(function(bw){b(this).wrapAll(bv?e.call(this,bw):e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this)})}else{if(arguments.length){var e=b.clean(arguments);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bv){this.parentNode.insertBefore(bv,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b.clean(arguments));return e}}},remove:function(e,bx){for(var bv=0,bw;(bw=this[bv])!=null;bv++){if(!e||b.filter(e,[bw]).length){if(!bx&&bw.nodeType===1){b.cleanData(bw.getElementsByTagName("*"));b.cleanData([bw])}if(bw.parentNode){bw.parentNode.removeChild(bw)}}}return this},empty:function(){for(var e=0,bv;(bv=this[e])!=null;e++){if(bv.nodeType===1){b.cleanData(bv.getElementsByTagName("*"))}while(bv.firstChild){bv.removeChild(bv.firstChild)}}return this},clone:function(bv,e){bv=bv==null?false:bv;e=e==null?bv:e;return this.map(function(){return b.clone(this,bv,e)})},html:function(bx){if(bx===L){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ag,""):null}else{if(typeof bx==="string"&&!ae.test(bx)&&(b.support.leadingWhitespace||!ar.test(bx))&&!ax[(d.exec(bx)||["",""])[1].toLowerCase()]){bx=bx.replace(R,"<$1>");try{for(var bw=0,bv=this.length;bw1&&bw0?this.clone(true):this).get();b(bC[bA])[bv](by);bz=bz.concat(by)}return this.pushStack(bz,e,bC.selector)}}});function bg(e){if(typeof e.getElementsByTagName!=="undefined"){return e.getElementsByTagName("*")}else{if(typeof e.querySelectorAll!=="undefined"){return e.querySelectorAll("*")}else{return[]}}}function az(e){if(e.type==="checkbox"||e.type==="radio"){e.defaultChecked=e.checked}}function E(e){var bv=(e.nodeName||"").toLowerCase();if(bv==="input"){az(e)}else{if(bv!=="script"&&typeof e.getElementsByTagName!=="undefined"){b.grep(e.getElementsByTagName("input"),az)}}}function al(e){var bv=av.createElement("div");ac.appendChild(bv);bv.innerHTML=e.outerHTML;return bv.firstChild}b.extend({clone:function(by,bA,bw){var e,bv,bx,bz=b.support.html5Clone||!ah.test("<"+by.nodeName)?by.cloneNode(true):al(by);if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(by.nodeType===1||by.nodeType===11)&&!b.isXMLDoc(by)){ai(by,bz);e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){if(bv[bx]){ai(e[bx],bv[bx])}}}if(bA){t(by,bz);if(bw){e=bg(by);bv=bg(bz);for(bx=0;e[bx];++bx){t(e[bx],bv[bx])}}}e=bv=null;return bz},clean:function(bw,by,bH,bA){var bF;by=by||av;if(typeof by.createElement==="undefined"){by=by.ownerDocument||by[0]&&by[0].ownerDocument||av}var bI=[],bB;for(var bE=0,bz;(bz=bw[bE])!=null;bE++){if(typeof bz==="number"){bz+=""}if(!bz){continue}if(typeof bz==="string"){if(!W.test(bz)){bz=by.createTextNode(bz)}else{bz=bz.replace(R,"<$1>");var bK=(d.exec(bz)||["",""])[1].toLowerCase(),bx=ax[bK]||ax._default,bD=bx[0],bv=by.createElement("div");if(by===av){ac.appendChild(bv)}else{a(by).appendChild(bv)}bv.innerHTML=bx[1]+bz+bx[2];while(bD--){bv=bv.lastChild}if(!b.support.tbody){var e=w.test(bz),bC=bK==="table"&&!e?bv.firstChild&&bv.firstChild.childNodes:bx[1]===""&&!e?bv.childNodes:[];for(bB=bC.length-1;bB>=0;--bB){if(b.nodeName(bC[bB],"tbody")&&!bC[bB].childNodes.length){bC[bB].parentNode.removeChild(bC[bB])}}}if(!b.support.leadingWhitespace&&ar.test(bz)){bv.insertBefore(by.createTextNode(ar.exec(bz)[0]),bv.firstChild)}bz=bv.childNodes}}var bG;if(!b.support.appendChecked){if(bz[0]&&typeof(bG=bz.length)==="number"){for(bB=0;bB=0){return bx+"px"}}else{return bx}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bv,e){return au.test((e&&bv.currentStyle?bv.currentStyle.filter:bv.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(by,bz){var bx=by.style,bv=by.currentStyle,e=b.isNumeric(bz)?"alpha(opacity="+bz*100+")":"",bw=bv&&bv.filter||bx.filter||"";bx.zoom=1;if(bz>=1&&b.trim(bw.replace(ak,""))===""){bx.removeAttribute("filter");if(bv&&!bv.filter){return}}bx.filter=ak.test(bw)?bw.replace(ak,e):bw+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bw,bv){var e;b.swap(bw,{display:"inline-block"},function(){if(bv){e=Z(bw,"margin-right","marginRight")}else{e=bw.style.marginRight}});return e}}}});if(av.defaultView&&av.defaultView.getComputedStyle){aI=function(by,bw){var bv,bx,e;bw=bw.replace(z,"-$1").toLowerCase();if((bx=by.ownerDocument.defaultView)&&(e=bx.getComputedStyle(by,null))){bv=e.getPropertyValue(bw);if(bv===""&&!b.contains(by.ownerDocument.documentElement,by)){bv=b.style(by,bw)}}return bv}}if(av.documentElement.currentStyle){aX=function(bz,bw){var bA,e,by,bv=bz.currentStyle&&bz.currentStyle[bw],bx=bz.style;if(bv===null&&bx&&(by=bx[bw])){bv=by}if(!bc.test(bv)&&bn.test(bv)){bA=bx.left;e=bz.runtimeStyle&&bz.runtimeStyle.left;if(e){bz.runtimeStyle.left=bz.currentStyle.left}bx.left=bw==="fontSize"?"1em":(bv||0);bv=bx.pixelLeft+"px";bx.left=bA;if(e){bz.runtimeStyle.left=e}}return bv===""?"auto":bv}}Z=aI||aX;function p(by,bw,bv){var bA=bw==="width"?by.offsetWidth:by.offsetHeight,bz=bw==="width"?an:a1,bx=0,e=bz.length;if(bA>0){if(bv!=="border"){for(;bx)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,br=/([?&])_=[^&]*/,K=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,aa={},r={},aE,s,aV=["*/"]+["*"];try{aE=bl.href}catch(aw){aE=av.createElement("a");aE.href="";aE=aE.href}s=K.exec(aE.toLowerCase())||[];function f(e){return function(by,bA){if(typeof by!=="string"){bA=by;by="*"}if(b.isFunction(bA)){var bx=by.toLowerCase().split(h),bw=0,bz=bx.length,bv,bB,bC;for(;bw=0){var e=bw.slice(by,bw.length);bw=bw.slice(0,by)}var bx="GET";if(bz){if(b.isFunction(bz)){bA=bz;bz=L}else{if(typeof bz==="object"){bz=b.param(bz,b.ajaxSettings.traditional);bx="POST"}}}var bv=this;b.ajax({url:bw,type:bx,dataType:"html",data:bz,complete:function(bC,bB,bD){bD=bC.responseText;if(bC.isResolved()){bC.done(function(bE){bD=bE});bv.html(e?b("
").append(bD.replace(a6,"")).find(e):bD)}if(bA){bv.each(bA,[bD,bB,bC])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aZ.test(this.type))}).map(function(e,bv){var bw=b(this).val();return bw==null?null:b.isArray(bw)?b.map(bw,function(by,bx){return{name:bv.name,value:by.replace(bs,"\r\n")}}):{name:bv.name,value:bw.replace(bs,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bv){b.fn[bv]=function(bw){return this.on(bv,bw)}});b.each(["get","post"],function(e,bv){b[bv]=function(bw,by,bz,bx){if(b.isFunction(by)){bx=bx||bz;bz=by;by=L}return b.ajax({type:bv,url:bw,data:by,success:bz,dataType:bx})}});b.extend({getScript:function(e,bv){return b.get(e,L,bv,"script")},getJSON:function(e,bv,bw){return b.get(e,bv,bw,"json")},ajaxSetup:function(bv,e){if(e){am(bv,b.ajaxSettings)}else{e=bv;bv=b.ajaxSettings}am(bv,e);return bv},ajaxSettings:{url:aE,isLocal:aM.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":aV},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":bb.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{context:true,url:true}},ajaxPrefilter:f(aa),ajaxTransport:f(r),ajax:function(bz,bx){if(typeof bz==="object"){bx=bz;bz=L}bx=bx||{};var bD=b.ajaxSetup({},bx),bS=bD.context||bD,bG=bS!==bD&&(bS.nodeType||bS instanceof b)?b(bS):b.event,bR=b.Deferred(),bN=b.Callbacks("once memory"),bB=bD.statusCode||{},bC,bH={},bO={},bQ,by,bL,bE,bI,bA=0,bw,bK,bJ={readyState:0,setRequestHeader:function(bT,bU){if(!bA){var e=bT.toLowerCase();bT=bO[e]=bO[e]||bT;bH[bT]=bU}return this},getAllResponseHeaders:function(){return bA===2?bQ:null},getResponseHeader:function(bT){var e;if(bA===2){if(!by){by={};while((e=aD.exec(bQ))){by[e[1].toLowerCase()]=e[2]}}e=by[bT.toLowerCase()]}return e===L?null:e},overrideMimeType:function(e){if(!bA){bD.mimeType=e}return this},abort:function(e){e=e||"abort";if(bL){bL.abort(e)}bF(0,e);return this}};function bF(bZ,bU,b0,bW){if(bA===2){return}bA=2;if(bE){clearTimeout(bE)}bL=L;bQ=bW||"";bJ.readyState=bZ>0?4:0;var bT,b4,b3,bX=bU,bY=b0?bj(bD,bJ,b0):L,bV,b2;if(bZ>=200&&bZ<300||bZ===304){if(bD.ifModified){if((bV=bJ.getResponseHeader("Last-Modified"))){b.lastModified[bC]=bV}if((b2=bJ.getResponseHeader("Etag"))){b.etag[bC]=b2}}if(bZ===304){bX="notmodified";bT=true}else{try{b4=G(bD,bY);bX="success";bT=true}catch(b1){bX="parsererror";b3=b1}}}else{b3=bX;if(!bX||bZ){bX="error";if(bZ<0){bZ=0}}}bJ.status=bZ;bJ.statusText=""+(bU||bX);if(bT){bR.resolveWith(bS,[b4,bX,bJ])}else{bR.rejectWith(bS,[bJ,bX,b3])}bJ.statusCode(bB);bB=L;if(bw){bG.trigger("ajax"+(bT?"Success":"Error"),[bJ,bD,bT?b4:b3])}bN.fireWith(bS,[bJ,bX]);if(bw){bG.trigger("ajaxComplete",[bJ,bD]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bR.promise(bJ);bJ.success=bJ.done;bJ.error=bJ.fail;bJ.complete=bN.add;bJ.statusCode=function(bT){if(bT){var e;if(bA<2){for(e in bT){bB[e]=[bB[e],bT[e]]}}else{e=bT[bJ.status];bJ.then(e,e)}}return this};bD.url=((bz||bD.url)+"").replace(bq,"").replace(c,s[1]+"//");bD.dataTypes=b.trim(bD.dataType||"*").toLowerCase().split(h);if(bD.crossDomain==null){bI=K.exec(bD.url.toLowerCase());bD.crossDomain=!!(bI&&(bI[1]!=s[1]||bI[2]!=s[2]||(bI[3]||(bI[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bD.data&&bD.processData&&typeof bD.data!=="string"){bD.data=b.param(bD.data,bD.traditional)}aW(aa,bD,bx,bJ);if(bA===2){return false}bw=bD.global;bD.type=bD.type.toUpperCase();bD.hasContent=!aQ.test(bD.type);if(bw&&b.active++===0){b.event.trigger("ajaxStart")}if(!bD.hasContent){if(bD.data){bD.url+=(M.test(bD.url)?"&":"?")+bD.data;delete bD.data}bC=bD.url;if(bD.cache===false){var bv=b.now(),bP=bD.url.replace(br,"$1_="+bv);bD.url=bP+((bP===bD.url)?(M.test(bD.url)?"&":"?")+"_="+bv:"")}}if(bD.data&&bD.hasContent&&bD.contentType!==false||bx.contentType){bJ.setRequestHeader("Content-Type",bD.contentType)}if(bD.ifModified){bC=bC||bD.url;if(b.lastModified[bC]){bJ.setRequestHeader("If-Modified-Since",b.lastModified[bC])}if(b.etag[bC]){bJ.setRequestHeader("If-None-Match",b.etag[bC])}}bJ.setRequestHeader("Accept",bD.dataTypes[0]&&bD.accepts[bD.dataTypes[0]]?bD.accepts[bD.dataTypes[0]]+(bD.dataTypes[0]!=="*"?", "+aV+"; q=0.01":""):bD.accepts["*"]);for(bK in bD.headers){bJ.setRequestHeader(bK,bD.headers[bK])}if(bD.beforeSend&&(bD.beforeSend.call(bS,bJ,bD)===false||bA===2)){bJ.abort();return false}for(bK in {success:1,error:1,complete:1}){bJ[bK](bD[bK])}bL=aW(r,bD,bx,bJ);if(!bL){bF(-1,"No Transport")}else{bJ.readyState=1;if(bw){bG.trigger("ajaxSend",[bJ,bD])}if(bD.async&&bD.timeout>0){bE=setTimeout(function(){bJ.abort("timeout")},bD.timeout)}try{bA=1;bL.send(bH,bF)}catch(bM){if(bA<2){bF(-1,bM)}else{throw bM}}}return bJ},param:function(e,bw){var bv=[],by=function(bz,bA){bA=b.isFunction(bA)?bA():bA;bv[bv.length]=encodeURIComponent(bz)+"="+encodeURIComponent(bA)};if(bw===L){bw=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){by(this.name,this.value)})}else{for(var bx in e){v(bx,e[bx],bw,by)}}return bv.join("&").replace(k,"+")}});function v(bw,by,bv,bx){if(b.isArray(by)){b.each(by,function(bA,bz){if(bv||ap.test(bw)){bx(bw,bz)}else{v(bw+"["+(typeof bz==="object"||b.isArray(bz)?bA:"")+"]",bz,bv,bx)}})}else{if(!bv&&by!=null&&typeof by==="object"){for(var e in by){v(bw+"["+e+"]",by[e],bv,bx)}}else{bx(bw,by)}}}b.extend({active:0,lastModified:{},etag:{}});function bj(bD,bC,bz){var bv=bD.contents,bB=bD.dataTypes,bw=bD.responseFields,by,bA,bx,e;for(bA in bw){if(bA in bz){bC[bw[bA]]=bz[bA]}}while(bB[0]==="*"){bB.shift();if(by===L){by=bD.mimeType||bC.getResponseHeader("content-type")}}if(by){for(bA in bv){if(bv[bA]&&bv[bA].test(by)){bB.unshift(bA);break}}}if(bB[0] in bz){bx=bB[0]}else{for(bA in bz){if(!bB[0]||bD.converters[bA+" "+bB[0]]){bx=bA;break}if(!e){e=bA}}bx=bx||e}if(bx){if(bx!==bB[0]){bB.unshift(bx)}return bz[bx]}}function G(bH,bz){if(bH.dataFilter){bz=bH.dataFilter(bz,bH.dataType)}var bD=bH.dataTypes,bG={},bA,bE,bw=bD.length,bB,bC=bD[0],bx,by,bF,bv,e;for(bA=1;bA=bw.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();bw.animatedProperties[this.prop]=true;for(bA in bw.animatedProperties){if(bw.animatedProperties[bA]!==true){e=false}}if(e){if(bw.overflow!=null&&!b.support.shrinkWrapBlocks){b.each(["","X","Y"],function(bC,bD){bz.style["overflow"+bD]=bw.overflow[bC]})}if(bw.hide){b(bz).hide()}if(bw.hide||bw.show){for(bA in bw.animatedProperties){b.style(bz,bA,bw.orig[bA]);b.removeData(bz,"fxshow"+bA,true);b.removeData(bz,"toggle"+bA,true)}}bv=bw.complete;if(bv){bw.complete=false;bv.call(bz)}}return false}else{if(bw.duration==Infinity){this.now=bx}else{bB=bx-this.startTime;this.state=bB/bw.duration;this.pos=b.easing[bw.animatedProperties[this.prop]](this.state,bB,0,1,bw.duration);this.now=this.start+((this.end-this.start)*this.pos)}this.update()}return true}};b.extend(b.fx,{tick:function(){var bw,bv=b.timers,e=0;for(;e").appendTo(e),bw=bv.css("display");bv.remove();if(bw==="none"||bw===""){if(!a8){a8=av.createElement("iframe");a8.frameBorder=a8.width=a8.height=0}e.appendChild(a8);if(!m||!a8.createElement){m=(a8.contentWindow||a8.contentDocument).document;m.write((av.compatMode==="CSS1Compat"?"":"")+"");m.close()}bv=m.createElement(bx);m.body.appendChild(bv);bw=b.css(bv,"display");e.removeChild(a8)}Q[bx]=bw}return Q[bx]}var V=/^t(?:able|d|h)$/i,ad=/^(?:body|html)$/i;if("getBoundingClientRect" in av.documentElement){b.fn.offset=function(bI){var by=this[0],bB;if(bI){return this.each(function(e){b.offset.setOffset(this,bI,e)})}if(!by||!by.ownerDocument){return null}if(by===by.ownerDocument.body){return b.offset.bodyOffset(by)}try{bB=by.getBoundingClientRect()}catch(bF){}var bH=by.ownerDocument,bw=bH.documentElement;if(!bB||!b.contains(bw,by)){return bB?{top:bB.top,left:bB.left}:{top:0,left:0}}var bC=bH.body,bD=aK(bH),bA=bw.clientTop||bC.clientTop||0,bE=bw.clientLeft||bC.clientLeft||0,bv=bD.pageYOffset||b.support.boxModel&&bw.scrollTop||bC.scrollTop,bz=bD.pageXOffset||b.support.boxModel&&bw.scrollLeft||bC.scrollLeft,bG=bB.top+bv-bA,bx=bB.left+bz-bE;return{top:bG,left:bx}}}else{b.fn.offset=function(bF){var bz=this[0];if(bF){return this.each(function(bG){b.offset.setOffset(this,bF,bG)})}if(!bz||!bz.ownerDocument){return null}if(bz===bz.ownerDocument.body){return b.offset.bodyOffset(bz)}var bC,bw=bz.offsetParent,bv=bz,bE=bz.ownerDocument,bx=bE.documentElement,bA=bE.body,bB=bE.defaultView,e=bB?bB.getComputedStyle(bz,null):bz.currentStyle,bD=bz.offsetTop,by=bz.offsetLeft;while((bz=bz.parentNode)&&bz!==bA&&bz!==bx){if(b.support.fixedPosition&&e.position==="fixed"){break}bC=bB?bB.getComputedStyle(bz,null):bz.currentStyle;bD-=bz.scrollTop;by-=bz.scrollLeft;if(bz===bw){bD+=bz.offsetTop;by+=bz.offsetLeft;if(b.support.doesNotAddBorder&&!(b.support.doesAddBorderForTableAndCells&&V.test(bz.nodeName))){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}bv=bw;bw=bz.offsetParent}if(b.support.subtractsBorderForOverflowNotVisible&&bC.overflow!=="visible"){bD+=parseFloat(bC.borderTopWidth)||0;by+=parseFloat(bC.borderLeftWidth)||0}e=bC}if(e.position==="relative"||e.position==="static"){bD+=bA.offsetTop;by+=bA.offsetLeft}if(b.support.fixedPosition&&e.position==="fixed"){bD+=Math.max(bx.scrollTop,bA.scrollTop);by+=Math.max(bx.scrollLeft,bA.scrollLeft)}return{top:bD,left:by}}}b.offset={bodyOffset:function(e){var bw=e.offsetTop,bv=e.offsetLeft;if(b.support.doesNotIncludeMarginInBodyOffset){bw+=parseFloat(b.css(e,"marginTop"))||0;bv+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bw,left:bv}},setOffset:function(bx,bG,bA){var bB=b.css(bx,"position");if(bB==="static"){bx.style.position="relative"}var bz=b(bx),bv=bz.offset(),e=b.css(bx,"top"),bE=b.css(bx,"left"),bF=(bB==="absolute"||bB==="fixed")&&b.inArray("auto",[e,bE])>-1,bD={},bC={},bw,by;if(bF){bC=bz.position();bw=bC.top;by=bC.left}else{bw=parseFloat(e)||0;by=parseFloat(bE)||0}if(b.isFunction(bG)){bG=bG.call(bx,bA,bv)}if(bG.top!=null){bD.top=(bG.top-bv.top)+bw}if(bG.left!=null){bD.left=(bG.left-bv.left)+by}if("using" in bG){bG.using.call(bx,bD)}else{bz.css(bD)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bw=this[0],bv=this.offsetParent(),bx=this.offset(),e=ad.test(bv[0].nodeName)?{top:0,left:0}:bv.offset();bx.top-=parseFloat(b.css(bw,"marginTop"))||0;bx.left-=parseFloat(b.css(bw,"marginLeft"))||0;e.top+=parseFloat(b.css(bv[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bv[0],"borderLeftWidth"))||0;return{top:bx.top-e.top,left:bx.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||av.body;while(e&&(!ad.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bv,e){var bw="scroll"+e;b.fn[bw]=function(bz){var bx,by;if(bz===L){bx=this[0];if(!bx){return null}by=aK(bx);return by?("pageXOffset" in by)?by[bv?"pageYOffset":"pageXOffset"]:b.support.boxModel&&by.document.documentElement[bw]||by.document.body[bw]:bx[bw]}return this.each(function(){by=aK(this);if(by){by.scrollTo(!bv?bz:b(by).scrollLeft(),bv?bz:b(by).scrollTop())}else{this[bw]=bz}})}});function aK(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bv,e){var bw=e.toLowerCase();b.fn["inner"+e]=function(){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,"padding")):this[bw]():null};b.fn["outer"+e]=function(by){var bx=this[0];return bx?bx.style?parseFloat(b.css(bx,bw,by?"margin":"border")):this[bw]():null};b.fn[bw]=function(bz){var bA=this[0];if(!bA){return bz==null?null:this}if(b.isFunction(bz)){return this.each(function(bE){var bD=b(this);bD[bw](bz.call(this,bE,bD[bw]()))})}if(b.isWindow(bA)){var bB=bA.document.documentElement["client"+e],bx=bA.document.body;return bA.document.compatMode==="CSS1Compat"&&bB||bx&&bx["client"+e]||bB}else{if(bA.nodeType===9){return Math.max(bA.documentElement["client"+e],bA.body["scroll"+e],bA.documentElement["scroll"+e],bA.body["offset"+e],bA.documentElement["offset"+e])}else{if(bz===L){var bC=b.css(bA,bw),by=parseFloat(bC);return b.isNumeric(by)?by:bC}else{return this.css(bw,typeof bz==="string"?bz:bz+"px")}}}}});bb.jQuery=bb.$=b;if(typeof define==="function"&&define.amd&&define.amd.jQuery){define("jquery",[],function(){return b})}})(window);/* - * jQuery UI 1.8.18 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI - */ -(function(a,d){a.ui=a.ui||{};if(a.ui.version){return}a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(e,f){return typeof e==="number"?this.each(function(){var g=this;setTimeout(function(){a(g).focus();if(f){f.call(g)}},e)}):this._focus.apply(this,arguments)},scrollParent:function(){var e;if((a.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){e=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(a.curCSS(this,"position",1))&&(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}else{e=this.parents().filter(function(){return(/(auto|scroll)/).test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!e.length?a(document):e},zIndex:function(h){if(h!==d){return this.css("zIndex",h)}if(this.length){var f=a(this[0]),e,g;while(f.length&&f[0]!==document){e=f.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){g=parseInt(f.css("zIndex"),10);if(!isNaN(g)&&g!==0){return g}}f=f.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});a.each(["Width","Height"],function(g,e){var f=e==="Width"?["Left","Right"]:["Top","Bottom"],h=e.toLowerCase(),k={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};function j(m,l,i,n){a.each(f,function(){l-=parseFloat(a.curCSS(m,"padding"+this,true))||0;if(i){l-=parseFloat(a.curCSS(m,"border"+this+"Width",true))||0}if(n){l-=parseFloat(a.curCSS(m,"margin"+this,true))||0}});return l}a.fn["inner"+e]=function(i){if(i===d){return k["inner"+e].call(this)}return this.each(function(){a(this).css(h,j(this,i)+"px")})};a.fn["outer"+e]=function(i,l){if(typeof i!=="number"){return k["outer"+e].call(this,i)}return this.each(function(){a(this).css(h,j(this,i,true,l)+"px")})}});function c(g,e){var j=g.nodeName.toLowerCase();if("area"===j){var i=g.parentNode,h=i.name,f;if(!g.href||!h||i.nodeName.toLowerCase()!=="map"){return false}f=a("img[usemap=#"+h+"]")[0];return !!f&&b(f)}return(/input|select|textarea|button|object/.test(j)?!g.disabled:"a"==j?g.href||e:e)&&b(g)}function b(e){return !a(e).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}a.extend(a.expr[":"],{data:function(g,f,e){return !!a.data(g,e[3])},focusable:function(e){return c(e,!isNaN(a.attr(e,"tabindex")))},tabbable:function(g){var e=a.attr(g,"tabindex"),f=isNaN(e);return(f||e>=0)&&c(g,!f)}});a(function(){var e=document.body,f=e.appendChild(f=document.createElement("div"));f.offsetHeight;a.extend(f.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});a.support.minHeight=f.offsetHeight===100;a.support.selectstart="onselectstart" in f;e.removeChild(f).style.display="none"});a.extend(a.ui,{plugin:{add:function(f,g,j){var h=a.ui[f].prototype;for(var e in j){h.plugins[e]=h.plugins[e]||[];h.plugins[e].push([g,j[e]])}},call:function(e,g,f){var j=e.plugins[g];if(!j||!e.element[0].parentNode){return}for(var h=0;h0){return true}h[e]=1;g=(h[e]>0);h[e]=0;return g},isOverAxis:function(f,e,g){return(f>e)&&(f<(e+g))},isOver:function(j,f,i,h,e,g){return a.ui.isOverAxis(j,i,e)&&a.ui.isOverAxis(f,h,g)}})})(jQuery);/* - * jQuery UI Widget 1.8.18 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Widget - */ -(function(b,d){if(b.cleanData){var c=b.cleanData;b.cleanData=function(f){for(var g=0,h;(h=f[g])!=null;g++){try{b(h).triggerHandler("remove")}catch(j){}}c(f)}}else{var a=b.fn.remove;b.fn.remove=function(e,f){return this.each(function(){if(!f){if(!e||b.filter(e,[this]).length){b("*",this).add([this]).each(function(){try{b(this).triggerHandler("remove")}catch(g){}})}}return a.call(b(this),e,f)})}}b.widget=function(f,h,e){var g=f.split(".")[0],j;f=f.split(".")[1];j=g+"-"+f;if(!e){e=h;h=b.Widget}b.expr[":"][j]=function(k){return !!b.data(k,f)};b[g]=b[g]||{};b[g][f]=function(k,l){if(arguments.length){this._createWidget(k,l)}};var i=new h();i.options=b.extend(true,{},i.options);b[g][f].prototype=b.extend(true,i,{namespace:g,widgetName:f,widgetEventPrefix:b[g][f].prototype.widgetEventPrefix||f,widgetBaseClass:j},e);b.widget.bridge(f,b[g][f])};b.widget.bridge=function(f,e){b.fn[f]=function(i){var g=typeof i==="string",h=Array.prototype.slice.call(arguments,1),j=this;i=!g&&h.length?b.extend.apply(null,[true,i].concat(h)):i;if(g&&i.charAt(0)==="_"){return j}if(g){this.each(function(){var k=b.data(this,f),l=k&&b.isFunction(k[i])?k[i].apply(k,h):k;if(l!==k&&l!==d){j=l;return false}})}else{this.each(function(){var k=b.data(this,f);if(k){k.option(i||{})._init()}else{b.data(this,f,new e(i,this))}})}return j}};b.Widget=function(e,f){if(arguments.length){this._createWidget(e,f)}};b.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:false},_createWidget:function(f,g){b.data(g,this.widgetName,this);this.element=b(g);this.options=b.extend(true,{},this.options,this._getCreateOptions(),f);var e=this;this.element.bind("remove."+this.widgetName,function(){e.destroy()});this._create();this._trigger("create");this._init()},_getCreateOptions:function(){return b.metadata&&b.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName);this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled ui-state-disabled")},widget:function(){return this.element},option:function(f,g){var e=f;if(arguments.length===0){return b.extend({},this.options)}if(typeof f==="string"){if(g===d){return this.options[f]}e={};e[f]=g}this._setOptions(e);return this},_setOptions:function(f){var e=this;b.each(f,function(g,h){e._setOption(g,h)});return this},_setOption:function(e,f){this.options[e]=f;if(e==="disabled"){this.widget()[f?"addClass":"removeClass"](this.widgetBaseClass+"-disabled ui-state-disabled").attr("aria-disabled",f)}return this},enable:function(){return this._setOption("disabled",false)},disable:function(){return this._setOption("disabled",true)},_trigger:function(e,f,g){var j,i,h=this.options[e];g=g||{};f=b.Event(f);f.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase();f.target=this.element[0];i=f.originalEvent;if(i){for(j in i){if(!(j in f)){f[j]=i[j]}}}this.element.trigger(f,g);return !(b.isFunction(h)&&h.call(this.element[0],f,g)===false||f.isDefaultPrevented())}}})(jQuery);/* - * jQuery UI Mouse 1.8.18 - * - * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Mouse - * - * Depends: - * jquery.ui.widget.js - */ -(function(b,c){var a=false;b(document).mouseup(function(d){a=false});b.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var d=this;this.element.bind("mousedown."+this.widgetName,function(e){return d._mouseDown(e)}).bind("click."+this.widgetName,function(e){if(true===b.data(e.target,d.widgetName+".preventClickEvent")){b.removeData(e.target,d.widgetName+".preventClickEvent");e.stopImmediatePropagation();return false}});this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(f){if(a){return}(this._mouseStarted&&this._mouseUp(f));this._mouseDownEvent=f;var e=this,g=(f.which==1),d=(typeof this.options.cancel=="string"&&f.target.nodeName?b(f.target).closest(this.options.cancel).length:false);if(!g||d||!this._mouseCapture(f)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){e.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(f)&&this._mouseDelayMet(f)){this._mouseStarted=(this._mouseStart(f)!==false);if(!this._mouseStarted){f.preventDefault();return true}}if(true===b.data(f.target,this.widgetName+".preventClickEvent")){b.removeData(f.target,this.widgetName+".preventClickEvent")}this._mouseMoveDelegate=function(h){return e._mouseMove(h)};this._mouseUpDelegate=function(h){return e._mouseUp(h)};b(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);f.preventDefault();a=true;return true},_mouseMove:function(d){if(b.browser.msie&&!(document.documentMode>=9)&&!d.button){return this._mouseUp(d)}if(this._mouseStarted){this._mouseDrag(d);return d.preventDefault()}if(this._mouseDistanceMet(d)&&this._mouseDelayMet(d)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,d)!==false);(this._mouseStarted?this._mouseDrag(d):this._mouseUp(d))}return !this._mouseStarted},_mouseUp:function(d){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;if(d.target==this._mouseDownEvent.target){b.data(d.target,this.widgetName+".preventClickEvent",true)}this._mouseStop(d)}return false},_mouseDistanceMet:function(d){return(Math.max(Math.abs(this._mouseDownEvent.pageX-d.pageX),Math.abs(this._mouseDownEvent.pageY-d.pageY))>=this.options.distance)},_mouseDelayMet:function(d){return this.mouseDelayMet},_mouseStart:function(d){},_mouseDrag:function(d){},_mouseStop:function(d){},_mouseCapture:function(d){return true}})})(jQuery);(function(c,d){c.widget("ui.resizable",c.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1000},_create:function(){var f=this,k=this.options;this.element.addClass("ui-resizable");c.extend(this,{_aspectRatio:!!(k.aspectRatio),aspectRatio:k.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:k.helper||k.ghost||k.animate?k.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){this.element.wrap(c('
').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle=this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=k.handles||(!c(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all"){this.handles="n,e,s,w,se,sw,ne,nw"}var l=this.handles.split(",");this.handles={};for(var g=0;g
');if(/sw|se|ne|nw/.test(j)){h.css({zIndex:++k.zIndex})}if("se"==j){h.addClass("ui-icon ui-icon-gripsmall-diagonal-se")}this.handles[j]=".ui-resizable-"+j;this.element.append(h)}}this._renderAxis=function(q){q=q||this.element;for(var n in this.handles){if(this.handles[n].constructor==String){this.handles[n]=c(this.handles[n],this.element).show()}if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var o=c(this.handles[n],this.element),p=0;p=/sw|ne|nw|se|n|s/.test(n)?o.outerHeight():o.outerWidth();var m=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");q.css(m,p);this._proportionallyResize()}if(!c(this.handles[n]).length){continue}}};this._renderAxis(this.element);this._handles=c(".ui-resizable-handle",this.element).disableSelection();this._handles.mouseover(function(){if(!f.resizing){if(this.className){var i=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)}f.axis=i&&i[1]?i[1]:"se"}});if(k.autoHide){this._handles.hide();c(this.element).addClass("ui-resizable-autohide").hover(function(){if(k.disabled){return}c(this).removeClass("ui-resizable-autohide");f._handles.show()},function(){if(k.disabled){return}if(!f.resizing){c(this).addClass("ui-resizable-autohide");f._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var e=function(g){c(g).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){e(this.element);var f=this.element;f.after(this.originalElement.css({position:f.css("position"),width:f.outerWidth(),height:f.outerHeight(),top:f.css("top"),left:f.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);e(this.originalElement);return this},_mouseCapture:function(f){var g=false;for(var e in this.handles){if(c(this.handles[e])[0]==f.target){g=true}}return !this.options.disabled&&g},_mouseStart:function(g){var j=this.options,f=this.element.position(),e=this.element;this.resizing=true;this.documentScroll={top:c(document).scrollTop(),left:c(document).scrollLeft()};if(e.is(".ui-draggable")||(/absolute/).test(e.css("position"))){e.css({position:"absolute",top:f.top,left:f.left})}this._renderProxy();var k=b(this.helper.css("left")),h=b(this.helper.css("top"));if(j.containment){k+=c(j.containment).scrollLeft()||0;h+=c(j.containment).scrollTop()||0}this.offset=this.helper.offset();this.position={left:k,top:h};this.size=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalSize=this._helper?{width:e.outerWidth(),height:e.outerHeight()}:{width:e.width(),height:e.height()};this.originalPosition={left:k,top:h};this.sizeDiff={width:e.outerWidth()-e.width(),height:e.outerHeight()-e.height()};this.originalMousePosition={left:g.pageX,top:g.pageY};this.aspectRatio=(typeof j.aspectRatio=="number")?j.aspectRatio:((this.originalSize.width/this.originalSize.height)||1);var i=c(".ui-resizable-"+this.axis).css("cursor");c("body").css("cursor",i=="auto"?this.axis+"-resize":i);e.addClass("ui-resizable-resizing");this._propagate("start",g);return true},_mouseDrag:function(e){var h=this.helper,g=this.options,m={},q=this,j=this.originalMousePosition,n=this.axis;var r=(e.pageX-j.left)||0,p=(e.pageY-j.top)||0;var i=this._change[n];if(!i){return false}var l=i.apply(this,[e,r,p]),k=c.browser.msie&&c.browser.version<7,f=this.sizeDiff;this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey){l=this._updateRatio(l,e)}l=this._respectSize(l,e);this._propagate("resize",e);h.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});if(!this._helper&&this._proportionallyResizeElements.length){this._proportionallyResize()}this._updateCache(l);this._trigger("resize",e,this.ui());return false},_mouseStop:function(h){this.resizing=false;var i=this.options,m=this;if(this._helper){var g=this._proportionallyResizeElements,e=g.length&&(/textarea/i).test(g[0].nodeName),f=e&&c.ui.hasScroll(g[0],"left")?0:m.sizeDiff.height,k=e?0:m.sizeDiff.width;var n={width:(m.helper.width()-k),height:(m.helper.height()-f)},j=(parseInt(m.element.css("left"),10)+(m.position.left-m.originalPosition.left))||null,l=(parseInt(m.element.css("top"),10)+(m.position.top-m.originalPosition.top))||null;if(!i.animate){this.element.css(c.extend(n,{top:l,left:j}))}m.helper.height(m.size.height);m.helper.width(m.size.width);if(this._helper&&!i.animate){this._proportionallyResize()}}c("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop",h);if(this._helper){this.helper.remove()}return false},_updateVirtualBoundaries:function(g){var j=this.options,i,h,f,k,e;e={minWidth:a(j.minWidth)?j.minWidth:0,maxWidth:a(j.maxWidth)?j.maxWidth:Infinity,minHeight:a(j.minHeight)?j.minHeight:0,maxHeight:a(j.maxHeight)?j.maxHeight:Infinity};if(this._aspectRatio||g){i=e.minHeight*this.aspectRatio;f=e.minWidth/this.aspectRatio;h=e.maxHeight*this.aspectRatio;k=e.maxWidth/this.aspectRatio;if(i>e.minWidth){e.minWidth=i}if(f>e.minHeight){e.minHeight=f}if(hl.width),s=a(l.height)&&i.minHeight&&(i.minHeight>l.height);if(h){l.width=i.minWidth}if(s){l.height=i.minHeight}if(t){l.width=i.maxWidth}if(m){l.height=i.maxHeight}var f=this.originalPosition.left+this.originalSize.width,p=this.position.top+this.size.height;var k=/sw|nw|w/.test(q),e=/nw|ne|n/.test(q);if(h&&k){l.left=f-i.minWidth}if(t&&k){l.left=f-i.maxWidth}if(s&&e){l.top=p-i.minHeight}if(m&&e){l.top=p-i.maxHeight}var n=!l.width&&!l.height;if(n&&!l.left&&l.top){l.top=null}else{if(n&&!l.top&&l.left){l.left=null}}return l},_proportionallyResize:function(){var k=this.options;if(!this._proportionallyResizeElements.length){return}var g=this.helper||this.element;for(var f=0;f');var e=c.browser.msie&&c.browser.version<7,g=(e?1:0),h=(e?2:-1);this.helper.addClass(this._helper).css({width:this.element.outerWidth()+h,height:this.element.outerHeight()+h,position:"absolute",left:this.elementOffset.left-g+"px",top:this.elementOffset.top-g+"px",zIndex:++i.zIndex});this.helper.appendTo("body").disableSelection()}else{this.helper=this.element}},_change:{e:function(g,f,e){return{width:this.originalSize.width+f}},w:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{left:i.left+f,width:g.width-f}},n:function(h,f,e){var j=this.options,g=this.originalSize,i=this.originalPosition;return{top:i.top+e,height:g.height-e}},s:function(g,f,e){return{height:this.originalSize.height+e}},se:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},sw:function(g,f,e){return c.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[g,f,e]))},ne:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[g,f,e]))},nw:function(g,f,e){return c.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[g,f,e]))}},_propagate:function(f,e){c.ui.plugin.call(this,f,[e,this.ui()]);(f!="resize"&&this._trigger(f,e,this.ui()))},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});c.extend(c.ui.resizable,{version:"1.8.18"});c.ui.plugin.add("resizable","alsoResize",{start:function(f,g){var e=c(this).data("resizable"),i=e.options;var h=function(j){c(j).each(function(){var k=c(this);k.data("resizable-alsoresize",{width:parseInt(k.width(),10),height:parseInt(k.height(),10),left:parseInt(k.css("left"),10),top:parseInt(k.css("top"),10)})})};if(typeof(i.alsoResize)=="object"&&!i.alsoResize.parentNode){if(i.alsoResize.length){i.alsoResize=i.alsoResize[0];h(i.alsoResize)}else{c.each(i.alsoResize,function(j){h(j)})}}else{h(i.alsoResize)}},resize:function(g,i){var f=c(this).data("resizable"),j=f.options,h=f.originalSize,l=f.originalPosition;var k={height:(f.size.height-h.height)||0,width:(f.size.width-h.width)||0,top:(f.position.top-l.top)||0,left:(f.position.left-l.left)||0},e=function(m,n){c(m).each(function(){var q=c(this),r=c(this).data("resizable-alsoresize"),p={},o=n&&n.length?n:q.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];c.each(o,function(s,u){var t=(r[u]||0)+(k[u]||0);if(t&&t>=0){p[u]=t||null}});q.css(p)})};if(typeof(j.alsoResize)=="object"&&!j.alsoResize.nodeType){c.each(j.alsoResize,function(m,n){e(m,n)})}else{e(j.alsoResize)}},stop:function(e,f){c(this).removeData("resizable-alsoresize")}});c.ui.plugin.add("resizable","animate",{stop:function(i,n){var p=c(this).data("resizable"),j=p.options;var h=p._proportionallyResizeElements,e=h.length&&(/textarea/i).test(h[0].nodeName),f=e&&c.ui.hasScroll(h[0],"left")?0:p.sizeDiff.height,l=e?0:p.sizeDiff.width;var g={width:(p.size.width-l),height:(p.size.height-f)},k=(parseInt(p.element.css("left"),10)+(p.position.left-p.originalPosition.left))||null,m=(parseInt(p.element.css("top"),10)+(p.position.top-p.originalPosition.top))||null;p.element.animate(c.extend(g,m&&k?{top:m,left:k}:{}),{duration:j.animateDuration,easing:j.animateEasing,step:function(){var o={width:parseInt(p.element.css("width"),10),height:parseInt(p.element.css("height"),10),top:parseInt(p.element.css("top"),10),left:parseInt(p.element.css("left"),10)};if(h&&h.length){c(h[0]).css({width:o.width,height:o.height})}p._updateCache(o);p._propagate("resize",i)}})}});c.ui.plugin.add("resizable","containment",{start:function(f,r){var t=c(this).data("resizable"),j=t.options,l=t.element;var g=j.containment,k=(g instanceof c)?g.get(0):(/parent/.test(g))?l.parent().get(0):g;if(!k){return}t.containerElement=c(k);if(/document/.test(g)||g==document){t.containerOffset={left:0,top:0};t.containerPosition={left:0,top:0};t.parentData={element:c(document),left:0,top:0,width:c(document).width(),height:c(document).height()||document.body.parentNode.scrollHeight}}else{var n=c(k),i=[];c(["Top","Right","Left","Bottom"]).each(function(p,o){i[p]=b(n.css("padding"+o))});t.containerOffset=n.offset();t.containerPosition=n.position();t.containerSize={height:(n.innerHeight()-i[3]),width:(n.innerWidth()-i[1])};var q=t.containerOffset,e=t.containerSize.height,m=t.containerSize.width,h=(c.ui.hasScroll(k,"left")?k.scrollWidth:m),s=(c.ui.hasScroll(k)?k.scrollHeight:e);t.parentData={element:k,left:q.left,top:q.top,width:h,height:s}}},resize:function(g,q){var t=c(this).data("resizable"),i=t.options,f=t.containerSize,p=t.containerOffset,m=t.size,n=t.position,r=t._aspectRatio||g.shiftKey,e={top:0,left:0},h=t.containerElement;if(h[0]!=document&&(/static/).test(h.css("position"))){e=p}if(n.left<(t._helper?p.left:0)){t.size.width=t.size.width+(t._helper?(t.position.left-p.left):(t.position.left-e.left));if(r){t.size.height=t.size.width/i.aspectRatio}t.position.left=i.helper?p.left:0}if(n.top<(t._helper?p.top:0)){t.size.height=t.size.height+(t._helper?(t.position.top-p.top):t.position.top);if(r){t.size.width=t.size.height*i.aspectRatio}t.position.top=t._helper?p.top:0}t.offset.left=t.parentData.left+t.position.left;t.offset.top=t.parentData.top+t.position.top;var l=Math.abs((t._helper?t.offset.left-e.left:(t.offset.left-e.left))+t.sizeDiff.width),s=Math.abs((t._helper?t.offset.top-e.top:(t.offset.top-p.top))+t.sizeDiff.height);var k=t.containerElement.get(0)==t.element.parent().get(0),j=/relative|absolute/.test(t.containerElement.css("position"));if(k&&j){l-=t.parentData.left}if(l+t.size.width>=t.parentData.width){t.size.width=t.parentData.width-l;if(r){t.size.height=t.size.width/t.aspectRatio}}if(s+t.size.height>=t.parentData.height){t.size.height=t.parentData.height-s;if(r){t.size.width=t.size.height*t.aspectRatio}}},stop:function(f,n){var q=c(this).data("resizable"),g=q.options,l=q.position,m=q.containerOffset,e=q.containerPosition,i=q.containerElement;var j=c(q.helper),r=j.offset(),p=j.outerWidth()-q.sizeDiff.width,k=j.outerHeight()-q.sizeDiff.height;if(q._helper&&!g.animate&&(/relative/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}if(q._helper&&!g.animate&&(/static/).test(i.css("position"))){c(this).css({left:r.left-e.left-m.left,width:p,height:k})}}});c.ui.plugin.add("resizable","ghost",{start:function(g,h){var e=c(this).data("resizable"),i=e.options,f=e.size;e.ghost=e.originalElement.clone();e.ghost.css({opacity:0.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:"");e.ghost.appendTo(e.helper)},resize:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost){e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})}},stop:function(f,g){var e=c(this).data("resizable"),h=e.options;if(e.ghost&&e.helper){e.helper.get(0).removeChild(e.ghost.get(0))}}});c.ui.plugin.add("resizable","grid",{resize:function(e,m){var p=c(this).data("resizable"),h=p.options,k=p.size,i=p.originalSize,j=p.originalPosition,n=p.axis,l=h._aspectRatio||e.shiftKey;h.grid=typeof h.grid=="number"?[h.grid,h.grid]:h.grid;var g=Math.round((k.width-i.width)/(h.grid[0]||1))*(h.grid[0]||1),f=Math.round((k.height-i.height)/(h.grid[1]||1))*(h.grid[1]||1);if(/^(se|s|e)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f}else{if(/^(ne)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f}else{if(/^(sw)$/.test(n)){p.size.width=i.width+g;p.size.height=i.height+f;p.position.left=j.left-g}else{p.size.width=i.width+g;p.size.height=i.height+f;p.position.top=j.top-f;p.position.left=j.left-g}}}}});var b=function(e){return parseInt(e,10)||0};var a=function(e){return !isNaN(parseInt(e,10))}})(jQuery);/* - * jQuery hashchange event - v1.3 - 7/21/2010 - * http://benalman.com/projects/jquery-hashchange-plugin/ - * - * Copyright (c) 2010 "Cowboy" Ben Alman - * Dual licensed under the MIT and GPL licenses. - * http://benalman.com/about/license/ - */ -(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$(' - - - - -
-
-
dynet::AdadeltaTrainer Member List
-
-
- -

This is the complete list of members for dynet::AdadeltaTrainer, including all inherited members.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AdadeltaTrainer(Model *m, real eps=1e-6, real rho=0.95) (defined in dynet::AdadeltaTrainer)dynet::AdadeltaTrainerinlineexplicit
alloc_impl() override (defined in dynet::AdadeltaTrainer)dynet::AdadeltaTrainerprotectedvirtual
aux_allocated (defined in dynet::Trainer)dynet::Trainer
boost::serialization::access (defined in dynet::AdadeltaTrainer)dynet::AdadeltaTrainerfriend
clip_gradients() (defined in dynet::Trainer)dynet::Trainer
clip_threshold (defined in dynet::Trainer)dynet::Trainer
clipping_enabled (defined in dynet::Trainer)dynet::Trainer
clips (defined in dynet::Trainer)dynet::Trainer
epoch (defined in dynet::Trainer)dynet::Trainer
epsilon (defined in dynet::AdadeltaTrainer)dynet::AdadeltaTrainerprotected
eta (defined in dynet::Trainer)dynet::Trainer
eta0 (defined in dynet::Trainer)dynet::Trainer
eta_decay (defined in dynet::Trainer)dynet::Trainer
hd (defined in dynet::AdadeltaTrainer)dynet::AdadeltaTrainerprotected
hg (defined in dynet::AdadeltaTrainer)dynet::AdadeltaTrainerprotected
hld (defined in dynet::AdadeltaTrainer)dynet::AdadeltaTrainerprotected
hlg (defined in dynet::AdadeltaTrainer)dynet::AdadeltaTrainerprotected
model (defined in dynet::Trainer)dynet::Trainer
rescale_and_reset_weight_decay() (defined in dynet::Trainer)dynet::Trainer
rho (defined in dynet::AdadeltaTrainer)dynet::AdadeltaTrainerprotected
status() (defined in dynet::Trainer)dynet::Trainerinline
Trainer(Model *m, real e0) (defined in dynet::Trainer)dynet::Trainerinlineexplicit
Trainer() (defined in dynet::Trainer)dynet::Trainerinlineprotected
update(real scale=1.0) (defined in dynet::Trainer)dynet::Trainer
update_epoch(real r=1) (defined in dynet::Trainer)dynet::Trainerinline
update_lookup_params(real scale, real gscale, size_t idx, size_t lidx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_params(real scale, real gscale, size_t idx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_rule(real scale, real gscale, const std::vector< Tensor * > &values)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
updates (defined in dynet::Trainer)dynet::Trainer
~Trainer() (defined in dynet::Trainer)dynet::Trainervirtual
- - - - diff --git a/doc/doxygen/html/structdynet_1_1AdadeltaTrainer.html b/doc/doxygen/html/structdynet_1_1AdadeltaTrainer.html deleted file mode 100644 index 22b13e07f..000000000 --- a/doc/doxygen/html/structdynet_1_1AdadeltaTrainer.html +++ /dev/null @@ -1,227 +0,0 @@ - - - - - - -Dynet: dynet::AdadeltaTrainer Struct Reference - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
- -
-
dynet::AdadeltaTrainer Struct Reference
-
-
-
-Inheritance diagram for dynet::AdadeltaTrainer:
-
-
Inheritance graph
- - -
[legend]
-
-Collaboration diagram for dynet::AdadeltaTrainer:
-
-
Collaboration graph
- - -
[legend]
- - - - - - - - - - - - - - - - - -

-Public Member Functions

AdadeltaTrainer (Model *m, real eps=1e-6, real rho=0.95)
 
- Public Member Functions inherited from dynet::Trainer
Trainer (Model *m, real e0)
 
-void update (real scale=1.0)
 
-void update_epoch (real r=1)
 
-float clip_gradients ()
 
-void rescale_and_reset_weight_decay ()
 
-void status ()
 
- - - - - - - - - - -

-Protected Member Functions

-virtual void alloc_impl () override
 
- Protected Member Functions inherited from dynet::Trainer
-virtual void update_rule (real scale, real gscale, const std::vector< Tensor * > &values)=0
 
-virtual void update_params (real scale, real gscale, size_t idx)=0
 
-virtual void update_lookup_params (real scale, real gscale, size_t idx, size_t lidx)=0
 
- - - - - - - - - - - - - -

-Protected Attributes

-real epsilon
 
-real rho
 
-std::vector< ShadowParameters > hg
 
-std::vector< ShadowLookupParameters > hlg
 
-std::vector< ShadowParameters > hd
 
-std::vector< ShadowLookupParameters > hld
 
- - - -

-Friends

-class boost::serialization::access
 
- - - - - - - - - - - - - - - - - - - - - - -

-Additional Inherited Members

- Public Attributes inherited from dynet::Trainer
-real eta0
 
-real eta
 
-real eta_decay
 
-real epoch
 
-real clipping_enabled
 
-real clip_threshold
 
-real clips
 
-real updates
 
-bool aux_allocated
 
-Model * model
 
-
The documentation for this struct was generated from the following file: -
- - - - diff --git a/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__coll__graph.map b/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__coll__graph.map deleted file mode 100644 index bc3c946dd..000000000 --- a/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__coll__graph.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__coll__graph.md5 b/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__coll__graph.md5 deleted file mode 100644 index b49bda291..000000000 --- a/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -09042025b086a7c8e6db527e17f4ca2f \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__coll__graph.png b/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__coll__graph.png deleted file mode 100644 index 6b327c49053bf5d1a0d00c9fb589b0dbf223f0b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3093 zcmb`Jc{o&k8^@1G!V?vd5rwiOG|9dcvNy!Y+F&rqAUwvP*T|X?6D8Xi*@eV9EZTGDArUS9N3X227183@BMjG(GvjR>M_#04#yG~v%JmW6wyu`*9Re8-G-^qW@5k+sp%e;yB%QR z5sSDK&a3i}DtNuOg9E9gzp|gYvpMQ0Dk!+($gGq&f4< z=B6ccMYm`u5QEuST|Yjf3_LF>>Beoh6ABA2w5aLKq92__xv*V^h=XB|>!28P`Wm(o za44>-O6q(+pnV`L#Z|BN{mXbKc(ctX?1>(W{T ztRg(=MAZPT-GwXk%I0PfKnkC1DB(UpauY;RURdoimfguEaG4nA3l}Z`*Gef+?khn{ z4owKcAyB&~Sy_wUvqM$-Mm!X`+ihNskVqm=x?StW2C~#+%YVAoGD6H@gsrg!r+%th zmYlkJre<$X&!OfYRA6{BFE{sd29wFm&zGPpXlXI~t@^Um z1pu}~traayJ3G6(&~$%)e--hj(MW&xEHL7)U%w_MCKje^yhhEZqXiIKJM$HpnVG4w zw#muKZR~n_Dy26~P4({JodqLXKT@f|v=@(qPsO|K?`-n(^WV91heDwclP2f=_M$n& zS``}_8yju?AAK?(Yn z=H~adR-EAk5i-ly<(31jkd0z5s`%~FKqOMi5XxJt1U3sxOWk#O9VD_E zc#9rkv*$P>EiJ8<)o<3l?}70^)(zR(HUQW1wjEt15M)6_5EpQ_X2eMW!i}o2gP<=x zU{@#qSSv3s?kX-ee6#0YS;HpO*jsB?Qd{ej+2=#1j(w@`?DTHE&1b#>waiy_46!8&P)khH$6EE_OE@0Hv@}+iq)4jySXIicJ4Hcjb zP5Ux81{1Gh)c5xp){zC0D^9K$lMiO)AA*Zu`+R(tud@h{V`EGOJXs#npI5|tWWHp5{<~Bn*g%ZO|YkRnO=t~pxaNYkw zx?d6MV6{`!qGVXoqVfB?xRVwo8z1Cb8Uu`c#G1@<;W7md8+1BscP>m!BBT~k;Yda$ zC?|2ZOQjfB*_2t7?7ifizBLAN*&ghCJ3FoI?gdQ&ZCe>amY`wWqJ3IHGlO%+nq}27or)>T3;tQBlX+w`WaW zlG3WFiZ_*&l%73(T4q->mtu_oVZstl&}MG^#du^DA0MAbjUDjVxPUVnIaGMF)Vjh4 zjn-q~yFnQqE(0+-Q6G5q>Q%lQ-c!wI08TEhTj4WXvx+0qDLvckG;R847tjTa3qB=C z09(_sqQ)jBT%4SEJpN;)wrzf?1RW3i;t&91x0s|*YMk3+!0`2?pI9%1(o@TR>C;Ds z6dDQ&3Q9^!%E}hj2ejp-rNMia@B)+67nHlNM)7tpVaCQ8nxRT~Z5(rNx;@qnYU}O2 z`17X}KvWAft{5F183_XugOuweh*p%BvjcA&5@AM$hS>E!#r@pK|_VO7spsOPdf z3N`!mQKVp*SD;W=C>8uGqTF!^WOso)Q2z|K{Ua6B_Xmx}dMzw042Q!x zI!?JJgFaA{9aitsc`V6L;#53~6B_;K$|r~sM?Y~Xv$U*CR#KAIyt}lH&1L)%?LQeX zpt&T!*z>f7{`z0LN@HFuXT`-?0WmSLwY4=hH8m&{D(Bd|*8%aZWC1N2_^R^Yk7LJ9 z@$*;3R#jCY5OyW-FN>JY&hsh8n;&&~{EWY?Z?m$p#vVIUZ6k}8{Q77Eal#$O$S)`e z4*n}4EK)l2Qj%d9=nl4IR8BjS83wnhMN^yqwfkvkh}M_Mc+1LDxmpfcde_;B+ZZ(H z?(PPhpy@HOO*`^T#haz@7mH(c+Klml;@Pd$8JU#3>$82tVwrs- zlaovOjj72h0rf}HX?<~%%EPZ((ur#d%^{m};s%Mul)35YX_HjBGwK*_io2T|b&DzpL^Hls{{*I0gShm(89CUH^$mw52*@?{5 zB2vg*C#UCib*YxgeW*Ms`~c0&)bu&EAFX6|Aq;9HYY1_N`3iZ5NQS_#S{0({;0(vd z#}kBA*FKrZXQ}uhN6YUVNZ=oK4Gbt}_Ibbp+ecp7yC9KZCpd;K)_@{)yF%mipuUqD zm@cSL0w}G&%*B)*a6R*!p!^W5#q=xgFW@pTBR@aCv0Cr3I^QXfAhJn@&*U8uwzjJ2 zSZkvNE8!Zy*^R=%!k}D;)zFOgn7*R2vhU|g=P&d81_Tk%$?r2Jf|kuswn`cnd@3v~ z+?*dJUv0L9r>CWToZnnrTwI7U=D2>}1!HDLFuh>^#@`KtsWm%sV()?Pq)MhXF3iiT z)Xd`eo`GRm!pTFd|5>p925#aJ#ZhbXqtmUp-u}M6OLB7hQ}7c@7<_zuKtRA5uY2QI ge)}%sKS|Bx@qf2Zprp1|f$Mz0=mt!$T*oQm-=&EZKL7v# diff --git a/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__inherit__graph.map b/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__inherit__graph.map deleted file mode 100644 index bc3c946dd..000000000 --- a/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__inherit__graph.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__inherit__graph.md5 b/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__inherit__graph.md5 deleted file mode 100644 index b49bda291..000000000 --- a/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__inherit__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -09042025b086a7c8e6db527e17f4ca2f \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__inherit__graph.png b/doc/doxygen/html/structdynet_1_1AdadeltaTrainer__inherit__graph.png deleted file mode 100644 index 6b327c49053bf5d1a0d00c9fb589b0dbf223f0b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3093 zcmb`Jc{o&k8^@1G!V?vd5rwiOG|9dcvNy!Y+F&rqAUwvP*T|X?6D8Xi*@eV9EZTGDArUS9N3X227183@BMjG(GvjR>M_#04#yG~v%JmW6wyu`*9Re8-G-^qW@5k+sp%e;yB%QR z5sSDK&a3i}DtNuOg9E9gzp|gYvpMQ0Dk!+($gGq&f4< z=B6ccMYm`u5QEuST|Yjf3_LF>>Beoh6ABA2w5aLKq92__xv*V^h=XB|>!28P`Wm(o za44>-O6q(+pnV`L#Z|BN{mXbKc(ctX?1>(W{T ztRg(=MAZPT-GwXk%I0PfKnkC1DB(UpauY;RURdoimfguEaG4nA3l}Z`*Gef+?khn{ z4owKcAyB&~Sy_wUvqM$-Mm!X`+ihNskVqm=x?StW2C~#+%YVAoGD6H@gsrg!r+%th zmYlkJre<$X&!OfYRA6{BFE{sd29wFm&zGPpXlXI~t@^Um z1pu}~traayJ3G6(&~$%)e--hj(MW&xEHL7)U%w_MCKje^yhhEZqXiIKJM$HpnVG4w zw#muKZR~n_Dy26~P4({JodqLXKT@f|v=@(qPsO|K?`-n(^WV91heDwclP2f=_M$n& zS``}_8yju?AAK?(Yn z=H~adR-EAk5i-ly<(31jkd0z5s`%~FKqOMi5XxJt1U3sxOWk#O9VD_E zc#9rkv*$P>EiJ8<)o<3l?}70^)(zR(HUQW1wjEt15M)6_5EpQ_X2eMW!i}o2gP<=x zU{@#qSSv3s?kX-ee6#0YS;HpO*jsB?Qd{ej+2=#1j(w@`?DTHE&1b#>waiy_46!8&P)khH$6EE_OE@0Hv@}+iq)4jySXIicJ4Hcjb zP5Ux81{1Gh)c5xp){zC0D^9K$lMiO)AA*Zu`+R(tud@h{V`EGOJXs#npI5|tWWHp5{<~Bn*g%ZO|YkRnO=t~pxaNYkw zx?d6MV6{`!qGVXoqVfB?xRVwo8z1Cb8Uu`c#G1@<;W7md8+1BscP>m!BBT~k;Yda$ zC?|2ZOQjfB*_2t7?7ifizBLAN*&ghCJ3FoI?gdQ&ZCe>amY`wWqJ3IHGlO%+nq}27or)>T3;tQBlX+w`WaW zlG3WFiZ_*&l%73(T4q->mtu_oVZstl&}MG^#du^DA0MAbjUDjVxPUVnIaGMF)Vjh4 zjn-q~yFnQqE(0+-Q6G5q>Q%lQ-c!wI08TEhTj4WXvx+0qDLvckG;R847tjTa3qB=C z09(_sqQ)jBT%4SEJpN;)wrzf?1RW3i;t&91x0s|*YMk3+!0`2?pI9%1(o@TR>C;Ds z6dDQ&3Q9^!%E}hj2ejp-rNMia@B)+67nHlNM)7tpVaCQ8nxRT~Z5(rNx;@qnYU}O2 z`17X}KvWAft{5F183_XugOuweh*p%BvjcA&5@AM$hS>E!#r@pK|_VO7spsOPdf z3N`!mQKVp*SD;W=C>8uGqTF!^WOso)Q2z|K{Ua6B_Xmx}dMzw042Q!x zI!?JJgFaA{9aitsc`V6L;#53~6B_;K$|r~sM?Y~Xv$U*CR#KAIyt}lH&1L)%?LQeX zpt&T!*z>f7{`z0LN@HFuXT`-?0WmSLwY4=hH8m&{D(Bd|*8%aZWC1N2_^R^Yk7LJ9 z@$*;3R#jCY5OyW-FN>JY&hsh8n;&&~{EWY?Z?m$p#vVIUZ6k}8{Q77Eal#$O$S)`e z4*n}4EK)l2Qj%d9=nl4IR8BjS83wnhMN^yqwfkvkh}M_Mc+1LDxmpfcde_;B+ZZ(H z?(PPhpy@HOO*`^T#haz@7mH(c+Klml;@Pd$8JU#3>$82tVwrs- zlaovOjj72h0rf}HX?<~%%EPZ((ur#d%^{m};s%Mul)35YX_HjBGwK*_io2T|b&DzpL^Hls{{*I0gShm(89CUH^$mw52*@?{5 zB2vg*C#UCib*YxgeW*Ms`~c0&)bu&EAFX6|Aq;9HYY1_N`3iZ5NQS_#S{0({;0(vd z#}kBA*FKrZXQ}uhN6YUVNZ=oK4Gbt}_Ibbp+ecp7yC9KZCpd;K)_@{)yF%mipuUqD zm@cSL0w}G&%*B)*a6R*!p!^W5#q=xgFW@pTBR@aCv0Cr3I^QXfAhJn@&*U8uwzjJ2 zSZkvNE8!Zy*^R=%!k}D;)zFOgn7*R2vhU|g=P&d81_Tk%$?r2Jf|kuswn`cnd@3v~ z+?*dJUv0L9r>CWToZnnrTwI7U=D2>}1!HDLFuh>^#@`KtsWm%sV()?Pq)MhXF3iiT z)Xd`eo`GRm!pTFd|5>p925#aJ#ZhbXqtmUp-u}M6OLB7hQ}7c@7<_zuKtRA5uY2QI ge)}%sKS|Bx@qf2Zprp1|f$Mz0=mt!$T*oQm-=&EZKL7v# diff --git a/doc/doxygen/html/structdynet_1_1AdagradTrainer-members.html b/doc/doxygen/html/structdynet_1_1AdagradTrainer-members.html deleted file mode 100644 index b08ea6b6e..000000000 --- a/doc/doxygen/html/structdynet_1_1AdagradTrainer-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - -Dynet: Member List - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
-
-
dynet::AdagradTrainer Member List
-
-
- -

This is the complete list of members for dynet::AdagradTrainer, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AdagradTrainer(Model *m, real e0=0.1, real eps=1e-20) (defined in dynet::AdagradTrainer)dynet::AdagradTrainerinlineexplicit
alloc_impl() override (defined in dynet::AdagradTrainer)dynet::AdagradTrainerprotectedvirtual
aux_allocated (defined in dynet::Trainer)dynet::Trainer
boost::serialization::access (defined in dynet::AdagradTrainer)dynet::AdagradTrainerfriend
clip_gradients() (defined in dynet::Trainer)dynet::Trainer
clip_threshold (defined in dynet::Trainer)dynet::Trainer
clipping_enabled (defined in dynet::Trainer)dynet::Trainer
clips (defined in dynet::Trainer)dynet::Trainer
epoch (defined in dynet::Trainer)dynet::Trainer
epsilon (defined in dynet::AdagradTrainer)dynet::AdagradTrainerprotected
eta (defined in dynet::Trainer)dynet::Trainer
eta0 (defined in dynet::Trainer)dynet::Trainer
eta_decay (defined in dynet::Trainer)dynet::Trainer
model (defined in dynet::Trainer)dynet::Trainer
rescale_and_reset_weight_decay() (defined in dynet::Trainer)dynet::Trainer
status() (defined in dynet::Trainer)dynet::Trainerinline
Trainer(Model *m, real e0) (defined in dynet::Trainer)dynet::Trainerinlineexplicit
Trainer() (defined in dynet::Trainer)dynet::Trainerinlineprotected
update(real scale=1.0) (defined in dynet::Trainer)dynet::Trainer
update_epoch(real r=1) (defined in dynet::Trainer)dynet::Trainerinline
update_lookup_params(real scale, real gscale, size_t idx, size_t lidx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_params(real scale, real gscale, size_t idx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_rule(real scale, real gscale, const std::vector< Tensor * > &values)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
updates (defined in dynet::Trainer)dynet::Trainer
vlp (defined in dynet::AdagradTrainer)dynet::AdagradTrainerprotected
vp (defined in dynet::AdagradTrainer)dynet::AdagradTrainerprotected
~Trainer() (defined in dynet::Trainer)dynet::Trainervirtual
- - - - diff --git a/doc/doxygen/html/structdynet_1_1AdagradTrainer.html b/doc/doxygen/html/structdynet_1_1AdagradTrainer.html deleted file mode 100644 index 96e159741..000000000 --- a/doc/doxygen/html/structdynet_1_1AdagradTrainer.html +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - -Dynet: dynet::AdagradTrainer Struct Reference - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
- -
-
dynet::AdagradTrainer Struct Reference
-
-
-
-Inheritance diagram for dynet::AdagradTrainer:
-
-
Inheritance graph
- - -
[legend]
-
-Collaboration diagram for dynet::AdagradTrainer:
-
-
Collaboration graph
- - -
[legend]
- - - - - - - - - - - - - - - - - -

-Public Member Functions

AdagradTrainer (Model *m, real e0=0.1, real eps=1e-20)
 
- Public Member Functions inherited from dynet::Trainer
Trainer (Model *m, real e0)
 
-void update (real scale=1.0)
 
-void update_epoch (real r=1)
 
-float clip_gradients ()
 
-void rescale_and_reset_weight_decay ()
 
-void status ()
 
- - - - - - - - - - -

-Protected Member Functions

-virtual void alloc_impl () override
 
- Protected Member Functions inherited from dynet::Trainer
-virtual void update_rule (real scale, real gscale, const std::vector< Tensor * > &values)=0
 
-virtual void update_params (real scale, real gscale, size_t idx)=0
 
-virtual void update_lookup_params (real scale, real gscale, size_t idx, size_t lidx)=0
 
- - - - - - - -

-Protected Attributes

-real epsilon
 
-std::vector< ShadowParameters > vp
 
-std::vector< ShadowLookupParameters > vlp
 
- - - -

-Friends

-class boost::serialization::access
 
- - - - - - - - - - - - - - - - - - - - - - -

-Additional Inherited Members

- Public Attributes inherited from dynet::Trainer
-real eta0
 
-real eta
 
-real eta_decay
 
-real epoch
 
-real clipping_enabled
 
-real clip_threshold
 
-real clips
 
-real updates
 
-bool aux_allocated
 
-Model * model
 
-
The documentation for this struct was generated from the following file: -
- - - - diff --git a/doc/doxygen/html/structdynet_1_1AdagradTrainer__coll__graph.map b/doc/doxygen/html/structdynet_1_1AdagradTrainer__coll__graph.map deleted file mode 100644 index a2daa6ec8..000000000 --- a/doc/doxygen/html/structdynet_1_1AdagradTrainer__coll__graph.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/doc/doxygen/html/structdynet_1_1AdagradTrainer__coll__graph.md5 b/doc/doxygen/html/structdynet_1_1AdagradTrainer__coll__graph.md5 deleted file mode 100644 index bad7f9d23..000000000 --- a/doc/doxygen/html/structdynet_1_1AdagradTrainer__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -08200e27d8aca3e50ccb5df9d950186c \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1AdagradTrainer__coll__graph.png b/doc/doxygen/html/structdynet_1_1AdagradTrainer__coll__graph.png deleted file mode 100644 index dfd6c4e25d2c5dc2cbdce12e2016948a090ef093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3343 zcmb_f2Ukjkv4-MA|!|uMGz1PB26$#=q(Z^0fHa_>4e?|DMl2A5?YXm7&?Ta zQbxKEFd&@>NRt7iI`k&tU1z;D^M1fPcinsLTKAN__u2dVzDqDM(&6F|;s5}EOBVq* z1N$8C_GCW>KKD#xUBHgjPG1KO9R0jr*5@Y!0Oto?xE3-XYvsj#6F!~uH1e&dVwX~E z#Vyaly_PM1dGnT{7gcd@P~aE%Aa^bz!bwE+UGyTd)X$anbclyPif~8PNkOpWS!8MY zGvrgVHX$tKBD?8jtt-5uyh&F0@3B>k>rua7O6%=rYRCuEt9lMSj%vs06U`Nfq!XO| zH8;>ej8{4B+hg^+&}D`F@(hG@8ok@3Sotn5&lb4rQQ1FD%#cpnG zZEa=M1;^d}WY3X^_+W+Kw5+f@c{^h*eCxDA%&vY1CI%w&suWfNGEG%hqSdHLqS4+#!1*W+HY7mD~ zFV-tt>3<6MGpkM}u^45msW{CY9_)D6eo0D7N=;4mp8vFWaB#edqMvp{INm7#qHbk* zx##Gchpdky>RRhV_SWO$xpPd|0nj;d-LS(g#@gB%4@B+v&IgK)pT1N&=!b^ZuZ0oy zC?=Pdv3c^R@?d9W(c+1SGaS(*(pa7EQYMLX`t)g*skIqe`xeTsLWRZe^^xP+MEOWnm!y zj#%H9T5oL7g2c_Hwl-uDl`7|ZEKz)V7*%4Kn3!ma!H|-Z?SHP< zPCgzxC7*EenAY99?HP)WXbh%@tl4N!<1W$=6N?mmBG<4hcKLEAKBlIorW8{>(HM@E zOunO|0|KIAW6jAyi>PA}P2=PB#l>;lF^%(TGk6pVg~zYQ$u)FLd-nJD z2L%QB+#CnpQdd_mM9iFfbA)vB)5ufa`9Ar5W=8RTOH@`?*1cj2uUf0*z0X4GFl(s1 zGPDZ8noU1LfD;IWo~*s99*t!BEG+>FMc-=`UYro)Q+^Q35JF(FSbcr{urMZ%=8q{S z*>Cbz!^M}&Z0h$Hi>YOp>Z{kT_4lEB?+3h~ZOnDMczF1~;TROOnOBH8^)D#M2Xwdf z4zv`k|25ruiceBLG2@qnKs5-d8@C!UJ^yHSrQU?H|6G(cFs11N=(1vBYNBu1eLA%f zCWFnc_gl%LHlSCXWVc&u=Vk`-T?)xJU+^8urt$@r3@qsDdjPi_9Vg`)zxcipKA46> z^eMjM<3fOKm9-JMVbw`xyOp3O5J#;VxeBK5e&w|cbgAzfG1X}q$j-KNICC%j#F~%L zu+x*%XIF1nB#nCtB=nFQ9YS8T*;Rb_>cTx}Z=BU;U$L7RN7w8@Ep4$9UKNYo(jy$^0R!qgyFuH0|}UaIX<{<*MJ)>Cww-8orB}&9-$}j`D(K zR<(@L(FI=J?GvF1Q1!+4Vb<<`ox?*!-|gjY=GK#l2AYJ#+vBpGd{H?yyUGV2y@1xG zz^jtI3!7>afk8z3`Vpk4m;`ybiBg++*G8%#F z5720|mX?;8nVGx$RiKNcOf4$XqcV=)x_6I1fksjbyv85Cw?4bPyu7)&`TqU;)m3-k zhVNpEc1{PKelSP!aCUJ?5LQV_PCgDuNJt?0ev+%k-s|uTp@R7yG7k`k;!otGDjfTx!i z;mMPNk`hi1j=HeJeHt{}fNghw|Jb87nW529At=YC4%PVhkrD{*s{sQUL@D2}g<6QZO zy{2Yk@Xo4X=5@ko3VjxN;o3Dk$cYgV5d-+5(xP}$we z+?>y?A5KVSm?mu)U&(i}V}pd#hNTD}pZB-koT4Id`E5{-{rC}5q#-U2 zr!qh*T$>|LrYgeWaQ5gHodk#y42HwunBbWp>(Qlo93Xpv8!BF=Kd6k4kFTB#8$0xv z2wEzgo12S?VXaE?xhbN>>k7jZ51E;xJv=;IU0rQ#Cf>R*>gwv;ztnhvDkb?UY|Q!P zZOECb5mq-PlOr`nSon22dwbuT<2kouM@L5`4Kv?_9{4R5eQs-u?wLQ@955aXc^HwB zlJc012NbB4V6~9R+1a0PRr$tb2o#F7uwVuBDEP^S(822lX%fG7c4a6Q%1NIAvy{nX zniXyy?o57{>jX3KaDVF$|L=bO{@D7Utsi?Eii(Q*dU~5dhY`owZmO#08*()n6 zpS{g+lMsmOhOEC#@Ams^N(*x^5Ayx+vb!jAtBfTPk&>Q{z*0v)f|3Y>!Bo4AZL38J zQtIk5>9hU0?hXzPT3Qh%mwZZ!avVS~0LzV^0Qc$cEs1b?i;mVdwXrcWPHjzYZ*P}t z{88D^V3Ye(@JmlPL|HG~Em7#KKxD-SzM`$)WUu)qJ#Z7dHd9jG?( z>Q3B5=#I5coLyGVT0r}=b6_FfPI_u;Wo>N^0*INJuFDT)iaIePlpma*#}_&OkIVf7{SZ5Z6p5!t0tR{ diff --git a/doc/doxygen/html/structdynet_1_1AdagradTrainer__inherit__graph.map b/doc/doxygen/html/structdynet_1_1AdagradTrainer__inherit__graph.map deleted file mode 100644 index a2daa6ec8..000000000 --- a/doc/doxygen/html/structdynet_1_1AdagradTrainer__inherit__graph.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/doc/doxygen/html/structdynet_1_1AdagradTrainer__inherit__graph.md5 b/doc/doxygen/html/structdynet_1_1AdagradTrainer__inherit__graph.md5 deleted file mode 100644 index bad7f9d23..000000000 --- a/doc/doxygen/html/structdynet_1_1AdagradTrainer__inherit__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -08200e27d8aca3e50ccb5df9d950186c \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1AdagradTrainer__inherit__graph.png b/doc/doxygen/html/structdynet_1_1AdagradTrainer__inherit__graph.png deleted file mode 100644 index dfd6c4e25d2c5dc2cbdce12e2016948a090ef093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3343 zcmb_f2Ukjkv4-MA|!|uMGz1PB26$#=q(Z^0fHa_>4e?|DMl2A5?YXm7&?Ta zQbxKEFd&@>NRt7iI`k&tU1z;D^M1fPcinsLTKAN__u2dVzDqDM(&6F|;s5}EOBVq* z1N$8C_GCW>KKD#xUBHgjPG1KO9R0jr*5@Y!0Oto?xE3-XYvsj#6F!~uH1e&dVwX~E z#Vyaly_PM1dGnT{7gcd@P~aE%Aa^bz!bwE+UGyTd)X$anbclyPif~8PNkOpWS!8MY zGvrgVHX$tKBD?8jtt-5uyh&F0@3B>k>rua7O6%=rYRCuEt9lMSj%vs06U`Nfq!XO| zH8;>ej8{4B+hg^+&}D`F@(hG@8ok@3Sotn5&lb4rQQ1FD%#cpnG zZEa=M1;^d}WY3X^_+W+Kw5+f@c{^h*eCxDA%&vY1CI%w&suWfNGEG%hqSdHLqS4+#!1*W+HY7mD~ zFV-tt>3<6MGpkM}u^45msW{CY9_)D6eo0D7N=;4mp8vFWaB#edqMvp{INm7#qHbk* zx##Gchpdky>RRhV_SWO$xpPd|0nj;d-LS(g#@gB%4@B+v&IgK)pT1N&=!b^ZuZ0oy zC?=Pdv3c^R@?d9W(c+1SGaS(*(pa7EQYMLX`t)g*skIqe`xeTsLWRZe^^xP+MEOWnm!y zj#%H9T5oL7g2c_Hwl-uDl`7|ZEKz)V7*%4Kn3!ma!H|-Z?SHP< zPCgzxC7*EenAY99?HP)WXbh%@tl4N!<1W$=6N?mmBG<4hcKLEAKBlIorW8{>(HM@E zOunO|0|KIAW6jAyi>PA}P2=PB#l>;lF^%(TGk6pVg~zYQ$u)FLd-nJD z2L%QB+#CnpQdd_mM9iFfbA)vB)5ufa`9Ar5W=8RTOH@`?*1cj2uUf0*z0X4GFl(s1 zGPDZ8noU1LfD;IWo~*s99*t!BEG+>FMc-=`UYro)Q+^Q35JF(FSbcr{urMZ%=8q{S z*>Cbz!^M}&Z0h$Hi>YOp>Z{kT_4lEB?+3h~ZOnDMczF1~;TROOnOBH8^)D#M2Xwdf z4zv`k|25ruiceBLG2@qnKs5-d8@C!UJ^yHSrQU?H|6G(cFs11N=(1vBYNBu1eLA%f zCWFnc_gl%LHlSCXWVc&u=Vk`-T?)xJU+^8urt$@r3@qsDdjPi_9Vg`)zxcipKA46> z^eMjM<3fOKm9-JMVbw`xyOp3O5J#;VxeBK5e&w|cbgAzfG1X}q$j-KNICC%j#F~%L zu+x*%XIF1nB#nCtB=nFQ9YS8T*;Rb_>cTx}Z=BU;U$L7RN7w8@Ep4$9UKNYo(jy$^0R!qgyFuH0|}UaIX<{<*MJ)>Cww-8orB}&9-$}j`D(K zR<(@L(FI=J?GvF1Q1!+4Vb<<`ox?*!-|gjY=GK#l2AYJ#+vBpGd{H?yyUGV2y@1xG zz^jtI3!7>afk8z3`Vpk4m;`ybiBg++*G8%#F z5720|mX?;8nVGx$RiKNcOf4$XqcV=)x_6I1fksjbyv85Cw?4bPyu7)&`TqU;)m3-k zhVNpEc1{PKelSP!aCUJ?5LQV_PCgDuNJt?0ev+%k-s|uTp@R7yG7k`k;!otGDjfTx!i z;mMPNk`hi1j=HeJeHt{}fNghw|Jb87nW529At=YC4%PVhkrD{*s{sQUL@D2}g<6QZO zy{2Yk@Xo4X=5@ko3VjxN;o3Dk$cYgV5d-+5(xP}$we z+?>y?A5KVSm?mu)U&(i}V}pd#hNTD}pZB-koT4Id`E5{-{rC}5q#-U2 zr!qh*T$>|LrYgeWaQ5gHodk#y42HwunBbWp>(Qlo93Xpv8!BF=Kd6k4kFTB#8$0xv z2wEzgo12S?VXaE?xhbN>>k7jZ51E;xJv=;IU0rQ#Cf>R*>gwv;ztnhvDkb?UY|Q!P zZOECb5mq-PlOr`nSon22dwbuT<2kouM@L5`4Kv?_9{4R5eQs-u?wLQ@955aXc^HwB zlJc012NbB4V6~9R+1a0PRr$tb2o#F7uwVuBDEP^S(822lX%fG7c4a6Q%1NIAvy{nX zniXyy?o57{>jX3KaDVF$|L=bO{@D7Utsi?Eii(Q*dU~5dhY`owZmO#08*()n6 zpS{g+lMsmOhOEC#@Ams^N(*x^5Ayx+vb!jAtBfTPk&>Q{z*0v)f|3Y>!Bo4AZL38J zQtIk5>9hU0?hXzPT3Qh%mwZZ!avVS~0LzV^0Qc$cEs1b?i;mVdwXrcWPHjzYZ*P}t z{88D^V3Ye(@JmlPL|HG~Em7#KKxD-SzM`$)WUu)qJ#Z7dHd9jG?( z>Q3B5=#I5coLyGVT0r}=b6_FfPI_u;Wo>N^0*INJuFDT)iaIePlpma*#}_&OkIVf7{SZ5Z6p5!t0tR{ diff --git a/doc/doxygen/html/structdynet_1_1AdamTrainer-members.html b/doc/doxygen/html/structdynet_1_1AdamTrainer-members.html deleted file mode 100644 index a36f26644..000000000 --- a/doc/doxygen/html/structdynet_1_1AdamTrainer-members.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - -Dynet: Member List - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
-
-
dynet::AdamTrainer Member List
-
-
- -

This is the complete list of members for dynet::AdamTrainer, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AdamTrainer(Model *m, float alpha=0.001, float beta_1=0.9, float beta_2=0.999, float eps=1e-8) (defined in dynet::AdamTrainer)dynet::AdamTrainerinlineexplicit
alloc_impl() override (defined in dynet::AdamTrainer)dynet::AdamTrainerprotectedvirtual
aux_allocated (defined in dynet::Trainer)dynet::Trainer
beta_1 (defined in dynet::AdamTrainer)dynet::AdamTrainerprotected
beta_2 (defined in dynet::AdamTrainer)dynet::AdamTrainerprotected
boost::serialization::access (defined in dynet::AdamTrainer)dynet::AdamTrainerfriend
clip_gradients() (defined in dynet::Trainer)dynet::Trainer
clip_threshold (defined in dynet::Trainer)dynet::Trainer
clipping_enabled (defined in dynet::Trainer)dynet::Trainer
clips (defined in dynet::Trainer)dynet::Trainer
epoch (defined in dynet::Trainer)dynet::Trainer
epsilon (defined in dynet::AdamTrainer)dynet::AdamTrainerprotected
eta (defined in dynet::Trainer)dynet::Trainer
eta0 (defined in dynet::Trainer)dynet::Trainer
eta_decay (defined in dynet::Trainer)dynet::Trainer
lm (defined in dynet::AdamTrainer)dynet::AdamTrainerprotected
lv (defined in dynet::AdamTrainer)dynet::AdamTrainerprotected
m (defined in dynet::AdamTrainer)dynet::AdamTrainerprotected
model (defined in dynet::Trainer)dynet::Trainer
rescale_and_reset_weight_decay() (defined in dynet::Trainer)dynet::Trainer
status() (defined in dynet::Trainer)dynet::Trainerinline
Trainer(Model *m, real e0) (defined in dynet::Trainer)dynet::Trainerinlineexplicit
Trainer() (defined in dynet::Trainer)dynet::Trainerinlineprotected
update(real scale=1.0) (defined in dynet::Trainer)dynet::Trainer
update_epoch(real r=1) (defined in dynet::Trainer)dynet::Trainerinline
update_lookup_params(real scale, real gscale, size_t idx, size_t lidx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_params(real scale, real gscale, size_t idx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_rule(real scale, real gscale, const std::vector< Tensor * > &values)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
updates (defined in dynet::Trainer)dynet::Trainer
v (defined in dynet::AdamTrainer)dynet::AdamTrainerprotected
~Trainer() (defined in dynet::Trainer)dynet::Trainervirtual
- - - - diff --git a/doc/doxygen/html/structdynet_1_1AdamTrainer.html b/doc/doxygen/html/structdynet_1_1AdamTrainer.html deleted file mode 100644 index 294c9a537..000000000 --- a/doc/doxygen/html/structdynet_1_1AdamTrainer.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - -Dynet: dynet::AdamTrainer Struct Reference - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
- -
-
-Inheritance diagram for dynet::AdamTrainer:
-
-
Inheritance graph
- - -
[legend]
-
-Collaboration diagram for dynet::AdamTrainer:
-
-
Collaboration graph
- - -
[legend]
- - - - - - - - - - - - - - - - - -

-Public Member Functions

AdamTrainer (Model *m, float alpha=0.001, float beta_1=0.9, float beta_2=0.999, float eps=1e-8)
 
- Public Member Functions inherited from dynet::Trainer
Trainer (Model *m, real e0)
 
-void update (real scale=1.0)
 
-void update_epoch (real r=1)
 
-float clip_gradients ()
 
-void rescale_and_reset_weight_decay ()
 
-void status ()
 
- - - - - - - - - - -

-Protected Member Functions

-virtual void alloc_impl () override
 
- Protected Member Functions inherited from dynet::Trainer
-virtual void update_rule (real scale, real gscale, const std::vector< Tensor * > &values)=0
 
-virtual void update_params (real scale, real gscale, size_t idx)=0
 
-virtual void update_lookup_params (real scale, real gscale, size_t idx, size_t lidx)=0
 
- - - - - - - - - - - - - - - -

-Protected Attributes

-float beta_1
 
-float beta_2
 
-float epsilon
 
-std::vector< ShadowParameters > m
 
-std::vector< ShadowLookupParameters > lm
 
-std::vector< ShadowParameters > v
 
-std::vector< ShadowLookupParameters > lv
 
- - - -

-Friends

-class boost::serialization::access
 
- - - - - - - - - - - - - - - - - - - - - - -

-Additional Inherited Members

- Public Attributes inherited from dynet::Trainer
-real eta0
 
-real eta
 
-real eta_decay
 
-real epoch
 
-real clipping_enabled
 
-real clip_threshold
 
-real clips
 
-real updates
 
-bool aux_allocated
 
-Model * model
 
-
The documentation for this struct was generated from the following file: -
- - - - diff --git a/doc/doxygen/html/structdynet_1_1AdamTrainer__coll__graph.map b/doc/doxygen/html/structdynet_1_1AdamTrainer__coll__graph.map deleted file mode 100644 index dd74f9a93..000000000 --- a/doc/doxygen/html/structdynet_1_1AdamTrainer__coll__graph.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/doc/doxygen/html/structdynet_1_1AdamTrainer__coll__graph.md5 b/doc/doxygen/html/structdynet_1_1AdamTrainer__coll__graph.md5 deleted file mode 100644 index 2bb8a6ec0..000000000 --- a/doc/doxygen/html/structdynet_1_1AdamTrainer__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -399b931745ab1e55e98997e295005649 \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1AdamTrainer__coll__graph.png b/doc/doxygen/html/structdynet_1_1AdamTrainer__coll__graph.png deleted file mode 100644 index 2bf2cc0120d83243c135226f451c8573e96d6298..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3496 zcmcgv`8SkpAHQYaqp^*itjS|1TS^!-#ZZ=r5@SeY88IkpvLwsYBiXlS45l$;E1D=1 zBad~EUAF8)_I-J8=Y4;8-+$n}?{nYRxz6=H=Q`K-`}ux8pDXT`Ih>mV$^ifX_l@gD zmf)BSerPrp@DJ61T>=LdXH&QlaD4LS)fIuu+zvO446K8)mPUhbS-Xm{t|-_1r6A2z zqv*tyudR7La?`$8Ji)a%Q8MZU_oW5&I>s|2l0Jj?m9eVSgVu8WG@dF|(@C2s)lrl6 zahik(N*DZ+JTI;!PM>~qEN)J(h$pvJR?PjrSSdA2_sf|LOmggaGT@*ckf6!}iz)jW zRv<5q<>fdt5koPm$yed?HtL(J%F6?onVI|MGPruuR8cF_sg9KX{?yQ~5KXrKROLR`2kTXi0dLk@36j)_1Z+#*;9 zEmijeb1bmqHB`rR@t38+O1Fursps)R%9FoZlG!*oBJU`~6crVn7C#JAB#dP^xRJ8@{eO-nbp2Dlvusu`D&diKEQx(NB{2s|j zBoa}3{DF{5si<`8RHF*t ztwBo+fAGre;sKIdrxR4EPlJO+02^D|W?_`)LN5W4e~Zm4d}o4HP+0h(%IQL=9701w z<0S6s(>q>XidJ$d2psMG`fMjBMua07zqyTd<9QU*A~S>d=sgN^a?0!Y6cGUcp+1Of z#>V+IHNp%G46^d_hBh{D&F?BJD+6B#%2Aj;Elo{IPmh&bc6>bN?=@ztB6DUyTU&b^ zOqn4JcIu7E`N+t~n30a|z5V7&0Zmo6wav|@A4FSB-{HY}C#7FiRaHBHF1)tBuIkot z7LlcGQADb%n;2bLS-*R+=6O=M>MMbQ2b#-VoS|8k0(`$$c zs0lx=w>!L25|)Wdj4!J7lc~0E51 zLr>4f*HZAB&0T2_dWQG!=d6S`T0ApDe2rZjZ(tm$4;9_tTKX0^7OK@f{Yqk>G0R;R z>_w`4+2=^GAW{kno&~KEhVOST_Kei}(T0X}x?NA788}FfOE~vmgmTC0RM=vl;+}Ea zg@oG_b>B%N2n2FxD!LqQF8w&Ray`83=aFs%?YKYINRpPPg?&=~kNh|``R3I>8=o;w z%PJfwgS2v`dwM`^Zy#Z3K~UEYD1ib|;c>o@LWz4dEAq>u!2qBgcEDjR*Uo0^GAxTQ zJPDDs7?W67cpBk1TZ%;+e@LXb7~RA|@%a8co9*mGYC<{O!r}*;tt%LRE#&x6V`HN@ z%C*`)zNe@xzp~PeiCEzUk&$}&@|}}U**?)+E``OdUz9r;?Y@}Bc(LVSuyfj zSgxJ!&BR@(pY{r_uvprR|Jbk9lh^^5%9=AkzaP;F^NgEhWK zQukvObwAhDZKA#jqjsMk72;v}5%wf%p;_iet|Zf!gSB|t@HF(0k$^-Z``*P~DSX)R zZv~V^M2UieNR>nGt#|72ojd29SQ zN;)@Y5lH5YhCTcB%LVLuO39Ki>Q#%&tLxIQTBq-nJ4dI;se5kG2W92tPIZ0cUF;*B zdCTB*umh67G$@5NHQLJ>JpIMwHuq|Ke}Dh9ItNhpynlXuAm*O{5}Rkw*hzPGhCcH>RU z{pT%R9z1}NY*0%>)j&jXv1~r+$bGEKRbM6aU)Y>F2u58n2cK7U?9UY>LN_ZTYx5fp^w-x3F>j^T$I?})_m@Z+$8 zq9R7%Wqf?})q4&Os}r$eP>1C&ji7e&0;i!+j@oX?d{vq2?<=%GBT2vFN5qYFhCAe1_RJLE6B=@g5BNS0Z@8D)QRaV>(88n zAFdu89-5WX(vY!)f&!+NmKHX4_Ge`B<@=$Vw$TSHo!c^z42!=*hBLG@uvh>^oo<@qUF2fS#Tn5K&jB z3xmPX6BOp1-QE0m?>NLlR-T#P<>kfJ!!~BPK-GJZl+mx!Hwi7Ok!dpr5|kAflnCukkC+7uOW3rnu>v2@MWn$n*d+m1~6xgK0ZDtKG5jV zBjVsD*ihf6AD1|g1%2u^-@Xq!J~}*U$!d=uulBoodY*%&N3GAav+?l6nBZaV?u0>1 z+B-e2nWRVazE#pIRIYusk3p->E-o&4Al^tMQgKO1Z@NDV6O%rUHV*nBitAU1goMQR zjt*+}N5UZ%<;|0B>nPvM~g)@bRN@km%54Nl878uU%Cumh-SIOdBF3ir(9&~)Tt?J$_4Yq@UT#EBhmAg*S z^43-WeWbQ$yaFNfEkWdBlvwlr?*9I_)>h8PwISa_(E$P1OiVaFc#pmWrCG?500Glt zXm6ik+}vvYnW_&L=8LT<_^XgN~OKEc6b&va@FM#x-iK-|TzWRzcw! z(K3t=acFq>gb=&CEwgtyo?NlhK!DB_L@y5sqaKB#&_UkFS3BPe8P9s)a z)1|jg3+^fOpBux8f?T^We)ogtlQ)=G7JuXMO>=(FDe8VR2rw7-b_Uoa7|p=q@3=(P q87(;H!6iWMg9vmcED%= diff --git a/doc/doxygen/html/structdynet_1_1AdamTrainer__inherit__graph.map b/doc/doxygen/html/structdynet_1_1AdamTrainer__inherit__graph.map deleted file mode 100644 index dd74f9a93..000000000 --- a/doc/doxygen/html/structdynet_1_1AdamTrainer__inherit__graph.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/doc/doxygen/html/structdynet_1_1AdamTrainer__inherit__graph.md5 b/doc/doxygen/html/structdynet_1_1AdamTrainer__inherit__graph.md5 deleted file mode 100644 index 2bb8a6ec0..000000000 --- a/doc/doxygen/html/structdynet_1_1AdamTrainer__inherit__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -399b931745ab1e55e98997e295005649 \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1AdamTrainer__inherit__graph.png b/doc/doxygen/html/structdynet_1_1AdamTrainer__inherit__graph.png deleted file mode 100644 index 2bf2cc0120d83243c135226f451c8573e96d6298..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3496 zcmcgv`8SkpAHQYaqp^*itjS|1TS^!-#ZZ=r5@SeY88IkpvLwsYBiXlS45l$;E1D=1 zBad~EUAF8)_I-J8=Y4;8-+$n}?{nYRxz6=H=Q`K-`}ux8pDXT`Ih>mV$^ifX_l@gD zmf)BSerPrp@DJ61T>=LdXH&QlaD4LS)fIuu+zvO446K8)mPUhbS-Xm{t|-_1r6A2z zqv*tyudR7La?`$8Ji)a%Q8MZU_oW5&I>s|2l0Jj?m9eVSgVu8WG@dF|(@C2s)lrl6 zahik(N*DZ+JTI;!PM>~qEN)J(h$pvJR?PjrSSdA2_sf|LOmggaGT@*ckf6!}iz)jW zRv<5q<>fdt5koPm$yed?HtL(J%F6?onVI|MGPruuR8cF_sg9KX{?yQ~5KXrKROLR`2kTXi0dLk@36j)_1Z+#*;9 zEmijeb1bmqHB`rR@t38+O1Fursps)R%9FoZlG!*oBJU`~6crVn7C#JAB#dP^xRJ8@{eO-nbp2Dlvusu`D&diKEQx(NB{2s|j zBoa}3{DF{5si<`8RHF*t ztwBo+fAGre;sKIdrxR4EPlJO+02^D|W?_`)LN5W4e~Zm4d}o4HP+0h(%IQL=9701w z<0S6s(>q>XidJ$d2psMG`fMjBMua07zqyTd<9QU*A~S>d=sgN^a?0!Y6cGUcp+1Of z#>V+IHNp%G46^d_hBh{D&F?BJD+6B#%2Aj;Elo{IPmh&bc6>bN?=@ztB6DUyTU&b^ zOqn4JcIu7E`N+t~n30a|z5V7&0Zmo6wav|@A4FSB-{HY}C#7FiRaHBHF1)tBuIkot z7LlcGQADb%n;2bLS-*R+=6O=M>MMbQ2b#-VoS|8k0(`$$c zs0lx=w>!L25|)Wdj4!J7lc~0E51 zLr>4f*HZAB&0T2_dWQG!=d6S`T0ApDe2rZjZ(tm$4;9_tTKX0^7OK@f{Yqk>G0R;R z>_w`4+2=^GAW{kno&~KEhVOST_Kei}(T0X}x?NA788}FfOE~vmgmTC0RM=vl;+}Ea zg@oG_b>B%N2n2FxD!LqQF8w&Ray`83=aFs%?YKYINRpPPg?&=~kNh|``R3I>8=o;w z%PJfwgS2v`dwM`^Zy#Z3K~UEYD1ib|;c>o@LWz4dEAq>u!2qBgcEDjR*Uo0^GAxTQ zJPDDs7?W67cpBk1TZ%;+e@LXb7~RA|@%a8co9*mGYC<{O!r}*;tt%LRE#&x6V`HN@ z%C*`)zNe@xzp~PeiCEzUk&$}&@|}}U**?)+E``OdUz9r;?Y@}Bc(LVSuyfj zSgxJ!&BR@(pY{r_uvprR|Jbk9lh^^5%9=AkzaP;F^NgEhWK zQukvObwAhDZKA#jqjsMk72;v}5%wf%p;_iet|Zf!gSB|t@HF(0k$^-Z``*P~DSX)R zZv~V^M2UieNR>nGt#|72ojd29SQ zN;)@Y5lH5YhCTcB%LVLuO39Ki>Q#%&tLxIQTBq-nJ4dI;se5kG2W92tPIZ0cUF;*B zdCTB*umh67G$@5NHQLJ>JpIMwHuq|Ke}Dh9ItNhpynlXuAm*O{5}Rkw*hzPGhCcH>RU z{pT%R9z1}NY*0%>)j&jXv1~r+$bGEKRbM6aU)Y>F2u58n2cK7U?9UY>LN_ZTYx5fp^w-x3F>j^T$I?})_m@Z+$8 zq9R7%Wqf?})q4&Os}r$eP>1C&ji7e&0;i!+j@oX?d{vq2?<=%GBT2vFN5qYFhCAe1_RJLE6B=@g5BNS0Z@8D)QRaV>(88n zAFdu89-5WX(vY!)f&!+NmKHX4_Ge`B<@=$Vw$TSHo!c^z42!=*hBLG@uvh>^oo<@qUF2fS#Tn5K&jB z3xmPX6BOp1-QE0m?>NLlR-T#P<>kfJ!!~BPK-GJZl+mx!Hwi7Ok!dpr5|kAflnCukkC+7uOW3rnu>v2@MWn$n*d+m1~6xgK0ZDtKG5jV zBjVsD*ihf6AD1|g1%2u^-@Xq!J~}*U$!d=uulBoodY*%&N3GAav+?l6nBZaV?u0>1 z+B-e2nWRVazE#pIRIYusk3p->E-o&4Al^tMQgKO1Z@NDV6O%rUHV*nBitAU1goMQR zjt*+}N5UZ%<;|0B>nPvM~g)@bRN@km%54Nl878uU%Cumh-SIOdBF3ir(9&~)Tt?J$_4Yq@UT#EBhmAg*S z^43-WeWbQ$yaFNfEkWdBlvwlr?*9I_)>h8PwISa_(E$P1OiVaFc#pmWrCG?500Glt zXm6ik+}vvYnW_&L=8LT<_^XgN~OKEc6b&va@FM#x-iK-|TzWRzcw! z(K3t=acFq>gb=&CEwgtyo?NlhK!DB_L@y5sqaKB#&_UkFS3BPe8P9s)a z)1|jg3+^fOpBux8f?T^We)ogtlQ)=G7JuXMO>=(FDe8VR2rw7-b_Uoa7|p=q@3=(P q87(;H!6iWMg9vmcED%= diff --git a/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer-members.html b/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer-members.html deleted file mode 100644 index dcf78e7d7..000000000 --- a/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer-members.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - -Dynet: Member List - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
-
-
dynet::MomentumSGDTrainer Member List
-
-
- -

This is the complete list of members for dynet::MomentumSGDTrainer, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
alloc_impl() override (defined in dynet::MomentumSGDTrainer)dynet::MomentumSGDTrainerprotectedvirtual
aux_allocated (defined in dynet::Trainer)dynet::Trainer
boost::serialization::access (defined in dynet::MomentumSGDTrainer)dynet::MomentumSGDTrainerfriend
clip_gradients() (defined in dynet::Trainer)dynet::Trainer
clip_threshold (defined in dynet::Trainer)dynet::Trainer
clipping_enabled (defined in dynet::Trainer)dynet::Trainer
clips (defined in dynet::Trainer)dynet::Trainer
epoch (defined in dynet::Trainer)dynet::Trainer
eta (defined in dynet::Trainer)dynet::Trainer
eta0 (defined in dynet::Trainer)dynet::Trainer
eta_decay (defined in dynet::Trainer)dynet::Trainer
model (defined in dynet::Trainer)dynet::Trainer
momentum (defined in dynet::MomentumSGDTrainer)dynet::MomentumSGDTrainerprotected
MomentumSGDTrainer(Model *m, real e0=0.01, real mom=0.9) (defined in dynet::MomentumSGDTrainer)dynet::MomentumSGDTrainerinlineexplicit
rescale_and_reset_weight_decay() (defined in dynet::Trainer)dynet::Trainer
status() (defined in dynet::Trainer)dynet::Trainerinline
Trainer(Model *m, real e0) (defined in dynet::Trainer)dynet::Trainerinlineexplicit
Trainer() (defined in dynet::Trainer)dynet::Trainerinlineprotected
update(real scale=1.0) (defined in dynet::Trainer)dynet::Trainer
update_epoch(real r=1) (defined in dynet::Trainer)dynet::Trainerinline
update_lookup_params(real scale, real gscale, size_t idx, size_t lidx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_params(real scale, real gscale, size_t idx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_rule(real scale, real gscale, const std::vector< Tensor * > &values)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
updates (defined in dynet::Trainer)dynet::Trainer
vlp (defined in dynet::MomentumSGDTrainer)dynet::MomentumSGDTrainerprotected
vp (defined in dynet::MomentumSGDTrainer)dynet::MomentumSGDTrainerprotected
~Trainer() (defined in dynet::Trainer)dynet::Trainervirtual
- - - - diff --git a/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer.html b/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer.html deleted file mode 100644 index 4a5c15aa4..000000000 --- a/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer.html +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - -Dynet: dynet::MomentumSGDTrainer Struct Reference - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
- -
-
dynet::MomentumSGDTrainer Struct Reference
-
-
-
-Inheritance diagram for dynet::MomentumSGDTrainer:
-
-
Inheritance graph
- - -
[legend]
-
-Collaboration diagram for dynet::MomentumSGDTrainer:
-
-
Collaboration graph
- - -
[legend]
- - - - - - - - - - - - - - - - - -

-Public Member Functions

MomentumSGDTrainer (Model *m, real e0=0.01, real mom=0.9)
 
- Public Member Functions inherited from dynet::Trainer
Trainer (Model *m, real e0)
 
-void update (real scale=1.0)
 
-void update_epoch (real r=1)
 
-float clip_gradients ()
 
-void rescale_and_reset_weight_decay ()
 
-void status ()
 
- - - - - - - - - - -

-Protected Member Functions

-virtual void alloc_impl () override
 
- Protected Member Functions inherited from dynet::Trainer
-virtual void update_rule (real scale, real gscale, const std::vector< Tensor * > &values)=0
 
-virtual void update_params (real scale, real gscale, size_t idx)=0
 
-virtual void update_lookup_params (real scale, real gscale, size_t idx, size_t lidx)=0
 
- - - - - - - -

-Protected Attributes

-real momentum
 
-std::vector< ShadowParameters > vp
 
-std::vector< ShadowLookupParameters > vlp
 
- - - -

-Friends

-class boost::serialization::access
 
- - - - - - - - - - - - - - - - - - - - - - -

-Additional Inherited Members

- Public Attributes inherited from dynet::Trainer
-real eta0
 
-real eta
 
-real eta_decay
 
-real epoch
 
-real clipping_enabled
 
-real clip_threshold
 
-real clips
 
-real updates
 
-bool aux_allocated
 
-Model * model
 
-
The documentation for this struct was generated from the following file: -
- - - - diff --git a/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__coll__graph.map b/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__coll__graph.map deleted file mode 100644 index bfe7dac72..000000000 --- a/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__coll__graph.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__coll__graph.md5 b/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__coll__graph.md5 deleted file mode 100644 index 68f5e357b..000000000 --- a/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -204581a0e2b22d8faf32d4eebcea65ac \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__coll__graph.png b/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__coll__graph.png deleted file mode 100644 index 2370fccb42f11982551d90eb2c9cfcaa4feec1e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4453 zcmcgwg?b5-|x3hlHq-AN-|b52!beebu^5@I1IjC zq{QI2k^SZ+7>Molv^Aj1KcB+Z(o6`VW!2SCeGr(xH5X(^@61Vp7h@^Y5bWbktfhEz z<9(q;t(B&om#`ZN_2-%~RqVLnQMnuSm9nqV4qHO= zJTU4)8(JU59nR-rlsD6bkvwP0QrEr>)-->DALWI;9wZA+ksww}EO~ZVi-2)sgvhA5 z6^#N(7n3^GNeu{4%pTcfhSx;BmH^2y0vYiw+s z7LDQ0NKcPEI}1f+kCuT666ltGPUM?6H&NNDRwFnZ&j0GGD(hE4q(LwE6=U%li`=n% z|NShhhOpDRAqr1=I=aHr($c-%)q;rfR#C(>X1izxfx9~Iu}{wiq@|_hz`#I??oGNL7Kh#4 z-Oagx1t*`ze2E?wNCrKxXl7~o#ooc;8gz8_+ZQaEsY5x~+S+a|b|qB4dzYBXq4e@S zqB)C^nYkuQEXdT9F*!BWRBlfH+sDEE5`%&vQJaQ#4IWx4adBjSmWTr{FR!q&@@p8< z;I*P_ZK(E7^t>$!^?n*74Q1uzyz@VuR54DY8vbC{Wnp8J-`PS)LM0CA3%-yP5)$&i zI12(6NIe=rTGx9nPs5PRVz!Pc5))HXeb9#=KkUI|R|2&&Pe!79$kC>yjN2IhTbQA_ z^`d~FpgmYOGScoj-}1%H-91%BQ8aYs&W5gaBaB^kLWczsuaRCeZD8CMoQMQ~0`OpxuTq^2q~hYsNv zyI>G8F>%A=4W_g6b0e_H&d#ec*-O?D`$xe|97-$IwY8ddc7JuYu*rIQ-36%x zN=;Q&7|)FxGd54r=OSGbCWmYID?~)xw{J7>8NAl8w7hn|KsohrW72oHxuHQt@P+;U z${>Ds*C?dbcXgS{tsI@IA3De>R2e5(kd52U!2jsg8ImcI?T~RzE1t_PxD5 zh8|*7Rn>u!k#tjYb0Oj6>>g5)(u#_TTnt8RW8u?XDJdxj7z|cfRrM6)os8?(n~xkF zKZ{KI2p758j7{XMIxQ|P4vdXGZ#|r_7M7HJCSvt>qNSCUAp5?HRfKkr$6CAthf+_| zFnT!mZiF)A_cKEGcqI?*b$JnXUEc2`8?H?*I+G+!@@2|mav6#-@0kt5;o!Q-1`LsOI6pYv-2#huRuObm^T{sQ;PZA{=IM{I`T$;frk9FR{ zo%3v44>F$l!23=A>w=Ym+zl6(bT6E7+4WL`huR243{wRU)-cdd{~lI)ZA0kdr$CZM zd`b$NU>4W3+Ttkp__)1I%dzYmd?8(nzlZTdz87@P6( zM7x5VNX#K+@#i=RO;Wk7-M=TE`7laaZtM>Av$!`cMXtqrJ~ltxs0={EDl0E8g-}kC za;&UxXvioTrbpk)H^pq1PZ*VzMey*iLHG0`#{2~|3-WK@zUgz(h(iY>KZ?yUvX%wPM^=~^4y25XjEF-gi-Yd_i(6$nH=`d2 zcE?k)St)Dkr0s*+(r|_{HF(R_M%m_6~oV1I3vy^L~UE9 z7%L`o^77a`JUqPc-&NPv*98>o9}Tkpv$}diS(yVo(W?BzMpC!^=k9K91qC)nM#c{x zK14P*D`W{<5)cv+Rv~nCuln!Irvhjy1nd~N`YPc2#zr!?db}5Ec6OFwLJ8RprCgVz z>*(kZmym!#HVs}d>pBl3O9KxNVSoYUW?N1Eiqad;@P51*ILB6EY@pv zh&@iWvZRDKE-vmBf(IS?3(ihUOUo}N*1Iy8XJ=;@l|aqO!^1-$EiFxY^(qWf4BER= z5OE=Q%iwhi9`6OUuj5K->FA>S`gB^(k7j01fT@)3?(TidK8nEyqyhp0q@<+n7w4yT zj*hWO^n5(Lym2#_<^F7695jM?c(>MFR#LLFNHbY}$!YBY22l?e%`R?gvRYc657|+2 zeDp|gpgHunq*f~HxbBO`*B8P}df)10f8W`m1}L4Alhgj?%T;b}?!GTy7NdR6%9L`Pi?y?c(;gJ#<8F@dDQQkbE>qd4zkUS74C+9$p1Yv)+Snpt-EDXAP zen4M`UKpxnOzy_x@haZl5|Jgi%SPYT4}R;$fx*E%+}u&_LND&ova_ek`K};`^5qhr zK8**7Uh)y2uF7=WjlCp3>a+u}j<|0$P_dkC8DDH%1i1V+lt(|ImEc9sb zB@r5p*3i`atGYU)LRLwMT`ya-d-Ge3_c0!X))6^cq?sevV}_Xd{vA0`aF-J`io?Z}mhu6HnD&_Tc}PY^ z_5s;JVDl-Q9f&>ruU`oX2_!8oEe-90GiZ1ko72q3JE{aeUS6W4q@+Ka+Yv*uxU>|r zw&nu01AI=;%p}a!Cx*b5L;>s7CfC2d)%(L`Ae(9F>0@5LWQE#Ci?zAwl4!tR&hTRx z5fRbxa`r=-YuBzqclZyRh3q2e+7c7M#KPS@CBzHIXu2MmTRaI1AZO$FBrI%?e*&^Q&WItOa&14aZ4r3 zM<5NQ%T01YxTK{S0r`4)dq?HwUYn1&4BKWVX-dWC?2kr4(By;4YU#gzzzejI$Q z#HOXCb&T(#hDC7s&9DM+)90+Elk39MgIj3D#T#YzGU+G zBI<#wcjV;-4_e$)u|L`r zY%b)5whuY1m`20PtcL;Vrsw1&g6MXDT5=xB@A%Q3>!8$I%`d7*|DFzM% zHy0N)G&Hm}iQzojnn_4crvci$z)Ze?W!9{2YeVfKp`9sT`!cDBGjg$F>J2mu`fyL}v9Wd>u4eA!-o1Nc^6IS~`0pJy ztw0P>w)bv!CT{D6?;pvlCv-VDImIaiZ1dY-TOux%f7JlnIy*a&?(XE;+S(Qt z7W~2sA0y@lrlwdx_i!WNcSBtr699Ae@^KKx!^6Xd@N@Yp+tz8pzVp*x32kl4Kz;`} zl>yZsQha;V_PqSa`dY4jylrdnBG@X{N!aZ;QDI?<7!v9g<+X!@19AUNi?gE{^z6af zXmLhXR=jD2nSd~6h!^N0C0qxkBy(enN(vJ6%|cPP1OtvlG~nd zO&+f>Ujhg+yKi5ebJ_?hu=M^bW4XD?#tkM84k{87l5IglsVEglR#sL+Lqp{z-Qs*} z$W%R=v*iA(a{sxX6AM`@VN#Nk1Q39!!nQWs;_8up3Q9@|)bwqS>A$ZA1qIP0X@H)O zxTvV;`}X!w?dbu|AR{9qDkq0!wl##g9=*^5>MuPjYvN~NMR~cJrY6yArI7f}PPIzw zdMcibcXQ7O-y3I znYf)m2>E+&8Nas|U0*NTcDk*=!piysGy^MhwK9^DYF=LA;70f_dTp-t$!1%;p2V zuRT3li5fg_N=uiD)0BT=;k0|$$F6~(ElX-|SJ5v}MwGUF;d>+Hx88~ZGF`*X&CT31 zn&y4b);8*fhPmPYyhHdS=!}Cpkhl^!<|CDw-&YXY2g;Lzic3AIU7c~{jh9*~ItGvI v>^kNe=Zq^9C`h^8)~CU+KJ - - diff --git a/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.md5 b/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.md5 deleted file mode 100644 index 68f5e357b..000000000 --- a/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -204581a0e2b22d8faf32d4eebcea65ac \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.png b/doc/doxygen/html/structdynet_1_1MomentumSGDTrainer__inherit__graph.png deleted file mode 100644 index 2370fccb42f11982551d90eb2c9cfcaa4feec1e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4453 zcmcgwg?b5-|x3hlHq-AN-|b52!beebu^5@I1IjC zq{QI2k^SZ+7>Molv^Aj1KcB+Z(o6`VW!2SCeGr(xH5X(^@61Vp7h@^Y5bWbktfhEz z<9(q;t(B&om#`ZN_2-%~RqVLnQMnuSm9nqV4qHO= zJTU4)8(JU59nR-rlsD6bkvwP0QrEr>)-->DALWI;9wZA+ksww}EO~ZVi-2)sgvhA5 z6^#N(7n3^GNeu{4%pTcfhSx;BmH^2y0vYiw+s z7LDQ0NKcPEI}1f+kCuT666ltGPUM?6H&NNDRwFnZ&j0GGD(hE4q(LwE6=U%li`=n% z|NShhhOpDRAqr1=I=aHr($c-%)q;rfR#C(>X1izxfx9~Iu}{wiq@|_hz`#I??oGNL7Kh#4 z-Oagx1t*`ze2E?wNCrKxXl7~o#ooc;8gz8_+ZQaEsY5x~+S+a|b|qB4dzYBXq4e@S zqB)C^nYkuQEXdT9F*!BWRBlfH+sDEE5`%&vQJaQ#4IWx4adBjSmWTr{FR!q&@@p8< z;I*P_ZK(E7^t>$!^?n*74Q1uzyz@VuR54DY8vbC{Wnp8J-`PS)LM0CA3%-yP5)$&i zI12(6NIe=rTGx9nPs5PRVz!Pc5))HXeb9#=KkUI|R|2&&Pe!79$kC>yjN2IhTbQA_ z^`d~FpgmYOGScoj-}1%H-91%BQ8aYs&W5gaBaB^kLWczsuaRCeZD8CMoQMQ~0`OpxuTq^2q~hYsNv zyI>G8F>%A=4W_g6b0e_H&d#ec*-O?D`$xe|97-$IwY8ddc7JuYu*rIQ-36%x zN=;Q&7|)FxGd54r=OSGbCWmYID?~)xw{J7>8NAl8w7hn|KsohrW72oHxuHQt@P+;U z${>Ds*C?dbcXgS{tsI@IA3De>R2e5(kd52U!2jsg8ImcI?T~RzE1t_PxD5 zh8|*7Rn>u!k#tjYb0Oj6>>g5)(u#_TTnt8RW8u?XDJdxj7z|cfRrM6)os8?(n~xkF zKZ{KI2p758j7{XMIxQ|P4vdXGZ#|r_7M7HJCSvt>qNSCUAp5?HRfKkr$6CAthf+_| zFnT!mZiF)A_cKEGcqI?*b$JnXUEc2`8?H?*I+G+!@@2|mav6#-@0kt5;o!Q-1`LsOI6pYv-2#huRuObm^T{sQ;PZA{=IM{I`T$;frk9FR{ zo%3v44>F$l!23=A>w=Ym+zl6(bT6E7+4WL`huR243{wRU)-cdd{~lI)ZA0kdr$CZM zd`b$NU>4W3+Ttkp__)1I%dzYmd?8(nzlZTdz87@P6( zM7x5VNX#K+@#i=RO;Wk7-M=TE`7laaZtM>Av$!`cMXtqrJ~ltxs0={EDl0E8g-}kC za;&UxXvioTrbpk)H^pq1PZ*VzMey*iLHG0`#{2~|3-WK@zUgz(h(iY>KZ?yUvX%wPM^=~^4y25XjEF-gi-Yd_i(6$nH=`d2 zcE?k)St)Dkr0s*+(r|_{HF(R_M%m_6~oV1I3vy^L~UE9 z7%L`o^77a`JUqPc-&NPv*98>o9}Tkpv$}diS(yVo(W?BzMpC!^=k9K91qC)nM#c{x zK14P*D`W{<5)cv+Rv~nCuln!Irvhjy1nd~N`YPc2#zr!?db}5Ec6OFwLJ8RprCgVz z>*(kZmym!#HVs}d>pBl3O9KxNVSoYUW?N1Eiqad;@P51*ILB6EY@pv zh&@iWvZRDKE-vmBf(IS?3(ihUOUo}N*1Iy8XJ=;@l|aqO!^1-$EiFxY^(qWf4BER= z5OE=Q%iwhi9`6OUuj5K->FA>S`gB^(k7j01fT@)3?(TidK8nEyqyhp0q@<+n7w4yT zj*hWO^n5(Lym2#_<^F7695jM?c(>MFR#LLFNHbY}$!YBY22l?e%`R?gvRYc657|+2 zeDp|gpgHunq*f~HxbBO`*B8P}df)10f8W`m1}L4Alhgj?%T;b}?!GTy7NdR6%9L`Pi?y?c(;gJ#<8F@dDQQkbE>qd4zkUS74C+9$p1Yv)+Snpt-EDXAP zen4M`UKpxnOzy_x@haZl5|Jgi%SPYT4}R;$fx*E%+}u&_LND&ova_ek`K};`^5qhr zK8**7Uh)y2uF7=WjlCp3>a+u}j<|0$P_dkC8DDH%1i1V+lt(|ImEc9sb zB@r5p*3i`atGYU)LRLwMT`ya-d-Ge3_c0!X))6^cq?sevV}_Xd{vA0`aF-J`io?Z}mhu6HnD&_Tc}PY^ z_5s;JVDl-Q9f&>ruU`oX2_!8oEe-90GiZ1ko72q3JE{aeUS6W4q@+Ka+Yv*uxU>|r zw&nu01AI=;%p}a!Cx*b5L;>s7CfC2d)%(L`Ae(9F>0@5LWQE#Ci?zAwl4!tR&hTRx z5fRbxa`r=-YuBzqclZyRh3q2e+7c7M#KPS@CBzHIXu2MmTRaI1AZO$FBrI%?e*&^Q&WItOa&14aZ4r3 zM<5NQ%T01YxTK{S0r`4)dq?HwUYn1&4BKWVX-dWC?2kr4(By;4YU#gzzzejI$Q z#HOXCb&T(#hDC7s&9DM+)90+Elk39MgIj3D#T#YzGU+G zBI<#wcjV;-4_e$)u|L`r zY%b)5whuY1m`20PtcL;Vrsw1&g6MXDT5=xB@A%Q3>!8$I%`d7*|DFzM% zHy0N)G&Hm}iQzojnn_4crvci$z)Ze?W!9{2YeVfKp`9sT`!cDBGjg$F>J2mu`fyL}v9Wd>u4eA!-o1Nc^6IS~`0pJy ztw0P>w)bv!CT{D6?;pvlCv-VDImIaiZ1dY-TOux%f7JlnIy*a&?(XE;+S(Qt z7W~2sA0y@lrlwdx_i!WNcSBtr699Ae@^KKx!^6Xd@N@Yp+tz8pzVp*x32kl4Kz;`} zl>yZsQha;V_PqSa`dY4jylrdnBG@X{N!aZ;QDI?<7!v9g<+X!@19AUNi?gE{^z6af zXmLhXR=jD2nSd~6h!^N0C0qxkBy(enN(vJ6%|cPP1OtvlG~nd zO&+f>Ujhg+yKi5ebJ_?hu=M^bW4XD?#tkM84k{87l5IglsVEglR#sL+Lqp{z-Qs*} z$W%R=v*iA(a{sxX6AM`@VN#Nk1Q39!!nQWs;_8up3Q9@|)bwqS>A$ZA1qIP0X@H)O zxTvV;`}X!w?dbu|AR{9qDkq0!wl##g9=*^5>MuPjYvN~NMR~cJrY6yArI7f}PPIzw zdMcibcXQ7O-y3I znYf)m2>E+&8Nas|U0*NTcDk*=!piysGy^MhwK9^DYF=LA;70f_dTp-t$!1%;p2V zuRT3li5fg_N=uiD)0BT=;k0|$$F6~(ElX-|SJ5v}MwGUF;d>+Hx88~ZGF`*X&CT31 zn&y4b);8*fhPmPYyhHdS=!}Cpkhl^!<|CDw-&YXY2g;Lzic3AIU7c~{jh9*~ItGvI v>^kNe=Zq^9C`h^8)~CU+KJ - - - - - -Dynet: Member List - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
-
-
dynet::RmsPropTrainer Member List
-
-
- -

This is the complete list of members for dynet::RmsPropTrainer, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
alloc_impl() override (defined in dynet::RmsPropTrainer)dynet::RmsPropTrainerprotectedvirtual
aux_allocated (defined in dynet::Trainer)dynet::Trainer
boost::serialization::access (defined in dynet::RmsPropTrainer)dynet::RmsPropTrainerfriend
clip_gradients() (defined in dynet::Trainer)dynet::Trainer
clip_threshold (defined in dynet::Trainer)dynet::Trainer
clipping_enabled (defined in dynet::Trainer)dynet::Trainer
clips (defined in dynet::Trainer)dynet::Trainer
epoch (defined in dynet::Trainer)dynet::Trainer
epsilon (defined in dynet::RmsPropTrainer)dynet::RmsPropTrainerprotected
eta (defined in dynet::Trainer)dynet::Trainer
eta0 (defined in dynet::Trainer)dynet::Trainer
eta_decay (defined in dynet::Trainer)dynet::Trainer
hg (defined in dynet::RmsPropTrainer)dynet::RmsPropTrainerprotected
hlg (defined in dynet::RmsPropTrainer)dynet::RmsPropTrainerprotected
model (defined in dynet::Trainer)dynet::Trainer
rescale_and_reset_weight_decay() (defined in dynet::Trainer)dynet::Trainer
rho (defined in dynet::RmsPropTrainer)dynet::RmsPropTrainerprotected
RmsPropTrainer(Model *m, real e0=0.1, real eps=1e-20, real rho=0.95) (defined in dynet::RmsPropTrainer)dynet::RmsPropTrainerinlineexplicit
status() (defined in dynet::Trainer)dynet::Trainerinline
Trainer(Model *m, real e0) (defined in dynet::Trainer)dynet::Trainerinlineexplicit
Trainer() (defined in dynet::Trainer)dynet::Trainerinlineprotected
update(real scale=1.0) (defined in dynet::Trainer)dynet::Trainer
update_epoch(real r=1) (defined in dynet::Trainer)dynet::Trainerinline
update_lookup_params(real scale, real gscale, size_t idx, size_t lidx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_params(real scale, real gscale, size_t idx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_rule(real scale, real gscale, const std::vector< Tensor * > &values)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
updates (defined in dynet::Trainer)dynet::Trainer
~Trainer() (defined in dynet::Trainer)dynet::Trainervirtual
- - - - diff --git a/doc/doxygen/html/structdynet_1_1RmsPropTrainer.html b/doc/doxygen/html/structdynet_1_1RmsPropTrainer.html deleted file mode 100644 index 3a31e861f..000000000 --- a/doc/doxygen/html/structdynet_1_1RmsPropTrainer.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - - -Dynet: dynet::RmsPropTrainer Struct Reference - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
- -
-
dynet::RmsPropTrainer Struct Reference
-
-
-
-Inheritance diagram for dynet::RmsPropTrainer:
-
-
Inheritance graph
- - -
[legend]
-
-Collaboration diagram for dynet::RmsPropTrainer:
-
-
Collaboration graph
- - -
[legend]
- - - - - - - - - - - - - - - - - -

-Public Member Functions

RmsPropTrainer (Model *m, real e0=0.1, real eps=1e-20, real rho=0.95)
 
- Public Member Functions inherited from dynet::Trainer
Trainer (Model *m, real e0)
 
-void update (real scale=1.0)
 
-void update_epoch (real r=1)
 
-float clip_gradients ()
 
-void rescale_and_reset_weight_decay ()
 
-void status ()
 
- - - - - - - - - - -

-Protected Member Functions

-virtual void alloc_impl () override
 
- Protected Member Functions inherited from dynet::Trainer
-virtual void update_rule (real scale, real gscale, const std::vector< Tensor * > &values)=0
 
-virtual void update_params (real scale, real gscale, size_t idx)=0
 
-virtual void update_lookup_params (real scale, real gscale, size_t idx, size_t lidx)=0
 
- - - - - - - - - -

-Protected Attributes

-real epsilon
 
-real rho
 
-std::vector< real > hg
 
-std::vector< std::vector< real > > hlg
 
- - - -

-Friends

-class boost::serialization::access
 
- - - - - - - - - - - - - - - - - - - - - - -

-Additional Inherited Members

- Public Attributes inherited from dynet::Trainer
-real eta0
 
-real eta
 
-real eta_decay
 
-real epoch
 
-real clipping_enabled
 
-real clip_threshold
 
-real clips
 
-real updates
 
-bool aux_allocated
 
-Model * model
 
-
The documentation for this struct was generated from the following file: -
- - - - diff --git a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.map b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.map deleted file mode 100644 index 1e32ce6f9..000000000 --- a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.md5 b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.md5 deleted file mode 100644 index 3e1122ad2..000000000 --- a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -94a47912a64a87e1820234064f7d40ea \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.png b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__coll__graph.png deleted file mode 100644 index 83deee80854a6bf7070d56ecdf3199a5f4174ad7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3625 zcmcIn^;=Zy7T$*egpp7wC6)9L!U3dVlm_V%kOoCyh(nI_B}C~Sa6rV790m?GNQZ>v zfTVPT#2_s(a5v}N=ehSExNASN*AMgU_|{r)?6-P4YSd6>C;$M|8tTdhU@ioI9uy?t znM}DP7fj@KPt=rw%d6uWQUN0eug2=&$5)vlb(RM?B)Jr}yT+z6s+Yi&vt{8zVt- zT3Mu9rU%tF!v@?5@at`1f=G_F;0u}K={1G5+O_&)xwZEJ3l-|gq~zx|!)yRVUZl+) z$|aY7mAWRVw`Lpb8yjaPuzjLg+1X;EqOp^ty%UxGj4{=A9Z)7FCNxeIm8i~5O--%Z zJjEGD1*E2?-mXvkuB@TaExz8ijL@=;=%QEsJEh*?J9lp;cG{Ka=jJXh+Ks(DKi|iT zaVw(j4$ctfpF=L2YHE&Qm*--y`&au>lwm;VHCpzDy&i!=Dj-lH1imIAA+ghZd0`Z( z$y8~Gz?w`A4~yaAYOg{X`05}EczAe-4Ay36Tbi3s(y6M;9?%{#$E~gpp$Pc@DpwIZD5i>H zk#sA;VtFXSdRN@$ni|0>1A81Q$^+p3j2`PuvokZq&9dfv3EgZN zGQhcdvb8lgKmRqiMo7qIRh4+pRJF^vdNM0JJ9#J$Cy~sJ6f{%3K`Q#$|FF2Apx}MF zy;$*2At51d4gR#Au`!cOt^A>v;7;PrN9bmMA`PJ+1S{Mv|U^_`4XJFlX-xa70(dj;rQpz zQkhz-D=QC+^A>jR=7^D=dY!jLUPqx&Mg0NCgj_{a(}|k7;AiIMb^eFWj*gB!q5WeC z-vN6HH(59jyJ*cY?zMf8-%??sH9UGctAdnc01V0>Rsp)!@K* ztNnq>%zY{sUj9E={gE*Z*0C?_sY!m^?`EFtOz6wUkufp7edkY@+3^ryd5^IUa)%5o z|666d5#HDb=Y7iPA%8?51t28Efy$WA*zu5a1PaUCH#bv`54$%vr`F>m*+m$dN=mv% zM%qV4K9y|I%#;s8;@bq$Hlm|nq-mlJocQ_QMZGriR#S#ZL9H!=baVASRw(8cV_owk z+09$@e^pfQN=%WaX=|Ax;*TaMVIm?%;41Xc2kmO}fWr;>BJVe|h4~y?5oIL}7!wyC z7jfq8kP9zlDPo;Oc0t(c{Lf|4#mMWhZ?~x8=6M2j6Sh|SC9p@K5YZfX!WXKa!~7TcMrxRx>Uo~?lYLlxoicVbc@2LlLfjpsP;Gm{-PqrM3+qe2 zppguBOIPQ<-MIBoX|7g`oJjQK<70_i4WYCuGJ=F=e!ui@X^)th6ZZSFJWr_U2ib6e z7m%3f0R{H1A|C}K^}Wox2+yatAblwpI|J1eIz6bMph>e||)7+cSOgyJ8)=t-Gv@bUI; zI9WxFms+BdUv_qmk0bfLYAqxsYy9Sd{6HiauB3D=y+R4Yv+gn-!J0qEVQzpoCV zt-|5r6B2TiV^UtUNn2q?8JU>W)YQ(-&UU72E32y+0G%wUr1$URspz4RkM6#7ae)BV z)^i~5Wn^S%qa+xZn7AO-=GiC|3;k83qEHwU%v|u9D?mX*qe>3a;Rr>^v#~Gj?GaxV zOifKcXoHvc^z?w2x3siWI^s=?ja5`t$w^7+85udlQIhVRot>vAC!mHH8ym;XvcV;Q zm*UJLZia@22*j_MdcWtQW}p&+VhZlb)6?^HR8-RApr9acZ*M)l!MAjLM#Wvhom%)Q z?6aE1#YIw*$Li`|zgIdQ>I}E&4DU;qdYn4S3_%`PHJBP0+~VK}S?$XN*>QT>0x+%j zbqxxVKW)!!!pZKd4r0dCmwSnxctgK(Z5ap(Un`79p zu(0;_b}`2R^}KJnxw)XrXlZ$LfYH{~Af$suq;_WnmegTWXREX$DH6(CwqIYWDlxDNj|=U@N2Yn zwY3Zk3_QHN(H)DR&dNVglF=4c{KBBDW%{cZDSSOrk%NOnAqS)fPw_|cm*@K+Sn~47 zfMN`Wcz#~kz;gRGC>SS`E@i&~%yrTaohK6Qj+%7UYU5Mf^pjld4YHVnbV%2eV-Im>HSOPn>u~Fwbg~L28;|yy|G0!@ET{F~`f9N~RmFW?`Lm-T0 zf2gagBLPtTN4vX47>t*XPa`N<@8tvTL%^Z~gF#2bqoWMBZYjDN*jL}9XJC+)mi{f& zpa|TjmaZ%fPy zGF{B*0O*j6Wu&Ej{QS@rm6c-8HH;N#mgBxGRMpgQ$ogvK>d6r_A2tjp;x$BU7uZ-? zgD;84Dlv??{ZX_WAKU7DHfcB%8ax)-p7*Brqa+h5IHXrVz$*lwOKrGhYK=|FX6`6v zWM)#5hJoHKnVULuR3J?gYl2En{%C@6adxI*mD01a(xLv50P!JC*Lr=2OFX`Tm)oZT zynTH+ZGjJsjcmjNo?DbTc*%B@L6MfmRhZR!=4s{?mz1zNIUx$PPn|X*qE127uPiT* zjE^559nCfcq29@WA(dY7l7<6`&hD4(M#p%dHTU%Q} z#}F&HX=`hH57}FU?tI;0_g48M*ofBF$7z}!3m%2J!4^`i@nvN@PpyMgZnT553wCp? z%sRpM`HL66-rncn;Db(uMFK9;j?&CCz>KoeI3f_Y^PFof6bSkWn^hWOwhIslgo~3C zOJqd~QuBDESj>hBJfEY$0O?7q9WSipPcOIr5 z9v_1ZfjgKbyxL#gMaV&RAhi~R3*y=S-X3UX@j0-N^}%}&kS>Fi5TK>hvVLo8E8@y} z`Jb#HYusj{H^$4Xn;r4*mzN#f-Q9~l;etX!baZsI917=S&)lV@q#8~)FlR^GEXRdO z*)I@3(R*dODXHn{AVzfkiT7c!W(;OCoK^wRmT@7RaZ!!qYaJi2`Si)5H(ki6f23rT zmX?-|RNu_(Q2(-f6ZHH*elt w*xtrI3*S+T{3EJ+H=~Ur;rG~|f2T{bXM;qw_Yquf;I|*3p`xQ)s%R7TZ$n)b-T(jq diff --git a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.map b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.map deleted file mode 100644 index 1e32ce6f9..000000000 --- a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.md5 b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.md5 deleted file mode 100644 index 3e1122ad2..000000000 --- a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -94a47912a64a87e1820234064f7d40ea \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.png b/doc/doxygen/html/structdynet_1_1RmsPropTrainer__inherit__graph.png deleted file mode 100644 index 83deee80854a6bf7070d56ecdf3199a5f4174ad7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3625 zcmcIn^;=Zy7T$*egpp7wC6)9L!U3dVlm_V%kOoCyh(nI_B}C~Sa6rV790m?GNQZ>v zfTVPT#2_s(a5v}N=ehSExNASN*AMgU_|{r)?6-P4YSd6>C;$M|8tTdhU@ioI9uy?t znM}DP7fj@KPt=rw%d6uWQUN0eug2=&$5)vlb(RM?B)Jr}yT+z6s+Yi&vt{8zVt- zT3Mu9rU%tF!v@?5@at`1f=G_F;0u}K={1G5+O_&)xwZEJ3l-|gq~zx|!)yRVUZl+) z$|aY7mAWRVw`Lpb8yjaPuzjLg+1X;EqOp^ty%UxGj4{=A9Z)7FCNxeIm8i~5O--%Z zJjEGD1*E2?-mXvkuB@TaExz8ijL@=;=%QEsJEh*?J9lp;cG{Ka=jJXh+Ks(DKi|iT zaVw(j4$ctfpF=L2YHE&Qm*--y`&au>lwm;VHCpzDy&i!=Dj-lH1imIAA+ghZd0`Z( z$y8~Gz?w`A4~yaAYOg{X`05}EczAe-4Ay36Tbi3s(y6M;9?%{#$E~gpp$Pc@DpwIZD5i>H zk#sA;VtFXSdRN@$ni|0>1A81Q$^+p3j2`PuvokZq&9dfv3EgZN zGQhcdvb8lgKmRqiMo7qIRh4+pRJF^vdNM0JJ9#J$Cy~sJ6f{%3K`Q#$|FF2Apx}MF zy;$*2At51d4gR#Au`!cOt^A>v;7;PrN9bmMA`PJ+1S{Mv|U^_`4XJFlX-xa70(dj;rQpz zQkhz-D=QC+^A>jR=7^D=dY!jLUPqx&Mg0NCgj_{a(}|k7;AiIMb^eFWj*gB!q5WeC z-vN6HH(59jyJ*cY?zMf8-%??sH9UGctAdnc01V0>Rsp)!@K* ztNnq>%zY{sUj9E={gE*Z*0C?_sY!m^?`EFtOz6wUkufp7edkY@+3^ryd5^IUa)%5o z|666d5#HDb=Y7iPA%8?51t28Efy$WA*zu5a1PaUCH#bv`54$%vr`F>m*+m$dN=mv% zM%qV4K9y|I%#;s8;@bq$Hlm|nq-mlJocQ_QMZGriR#S#ZL9H!=baVASRw(8cV_owk z+09$@e^pfQN=%WaX=|Ax;*TaMVIm?%;41Xc2kmO}fWr;>BJVe|h4~y?5oIL}7!wyC z7jfq8kP9zlDPo;Oc0t(c{Lf|4#mMWhZ?~x8=6M2j6Sh|SC9p@K5YZfX!WXKa!~7TcMrxRx>Uo~?lYLlxoicVbc@2LlLfjpsP;Gm{-PqrM3+qe2 zppguBOIPQ<-MIBoX|7g`oJjQK<70_i4WYCuGJ=F=e!ui@X^)th6ZZSFJWr_U2ib6e z7m%3f0R{H1A|C}K^}Wox2+yatAblwpI|J1eIz6bMph>e||)7+cSOgyJ8)=t-Gv@bUI; zI9WxFms+BdUv_qmk0bfLYAqxsYy9Sd{6HiauB3D=y+R4Yv+gn-!J0qEVQzpoCV zt-|5r6B2TiV^UtUNn2q?8JU>W)YQ(-&UU72E32y+0G%wUr1$URspz4RkM6#7ae)BV z)^i~5Wn^S%qa+xZn7AO-=GiC|3;k83qEHwU%v|u9D?mX*qe>3a;Rr>^v#~Gj?GaxV zOifKcXoHvc^z?w2x3siWI^s=?ja5`t$w^7+85udlQIhVRot>vAC!mHH8ym;XvcV;Q zm*UJLZia@22*j_MdcWtQW}p&+VhZlb)6?^HR8-RApr9acZ*M)l!MAjLM#Wvhom%)Q z?6aE1#YIw*$Li`|zgIdQ>I}E&4DU;qdYn4S3_%`PHJBP0+~VK}S?$XN*>QT>0x+%j zbqxxVKW)!!!pZKd4r0dCmwSnxctgK(Z5ap(Un`79p zu(0;_b}`2R^}KJnxw)XrXlZ$LfYH{~Af$suq;_WnmegTWXREX$DH6(CwqIYWDlxDNj|=U@N2Yn zwY3Zk3_QHN(H)DR&dNVglF=4c{KBBDW%{cZDSSOrk%NOnAqS)fPw_|cm*@K+Sn~47 zfMN`Wcz#~kz;gRGC>SS`E@i&~%yrTaohK6Qj+%7UYU5Mf^pjld4YHVnbV%2eV-Im>HSOPn>u~Fwbg~L28;|yy|G0!@ET{F~`f9N~RmFW?`Lm-T0 zf2gagBLPtTN4vX47>t*XPa`N<@8tvTL%^Z~gF#2bqoWMBZYjDN*jL}9XJC+)mi{f& zpa|TjmaZ%fPy zGF{B*0O*j6Wu&Ej{QS@rm6c-8HH;N#mgBxGRMpgQ$ogvK>d6r_A2tjp;x$BU7uZ-? zgD;84Dlv??{ZX_WAKU7DHfcB%8ax)-p7*Brqa+h5IHXrVz$*lwOKrGhYK=|FX6`6v zWM)#5hJoHKnVULuR3J?gYl2En{%C@6adxI*mD01a(xLv50P!JC*Lr=2OFX`Tm)oZT zynTH+ZGjJsjcmjNo?DbTc*%B@L6MfmRhZR!=4s{?mz1zNIUx$PPn|X*qE127uPiT* zjE^559nCfcq29@WA(dY7l7<6`&hD4(M#p%dHTU%Q} z#}F&HX=`hH57}FU?tI;0_g48M*ofBF$7z}!3m%2J!4^`i@nvN@PpyMgZnT553wCp? z%sRpM`HL66-rncn;Db(uMFK9;j?&CCz>KoeI3f_Y^PFof6bSkWn^hWOwhIslgo~3C zOJqd~QuBDESj>hBJfEY$0O?7q9WSipPcOIr5 z9v_1ZfjgKbyxL#gMaV&RAhi~R3*y=S-X3UX@j0-N^}%}&kS>Fi5TK>hvVLo8E8@y} z`Jb#HYusj{H^$4Xn;r4*mzN#f-Q9~l;etX!baZsI917=S&)lV@q#8~)FlR^GEXRdO z*)I@3(R*dODXHn{AVzfkiT7c!W(;OCoK^wRmT@7RaZ!!qYaJi2`Si)5H(ki6f23rT zmX?-|RNu_(Q2(-f6ZHH*elt w*xtrI3*S+T{3EJ+H=~Ur;rG~|f2T{bXM;qw_Yquf;I|*3p`xQ)s%R7TZ$n)b-T(jq diff --git a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer-members.html b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer-members.html deleted file mode 100644 index 33151791f..000000000 --- a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer-members.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - -Dynet: Member List - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
-
-
dynet::SimpleSGDTrainer Member List
-
-
- -

This is the complete list of members for dynet::SimpleSGDTrainer, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - - -
alloc_impl() (defined in dynet::Trainer)dynet::Trainerinlineprotectedvirtual
aux_allocated (defined in dynet::Trainer)dynet::Trainer
boost::serialization::access (defined in dynet::SimpleSGDTrainer)dynet::SimpleSGDTrainerfriend
clip_gradients() (defined in dynet::Trainer)dynet::Trainer
clip_threshold (defined in dynet::Trainer)dynet::Trainer
clipping_enabled (defined in dynet::Trainer)dynet::Trainer
clips (defined in dynet::Trainer)dynet::Trainer
epoch (defined in dynet::Trainer)dynet::Trainer
eta (defined in dynet::Trainer)dynet::Trainer
eta0 (defined in dynet::Trainer)dynet::Trainer
eta_decay (defined in dynet::Trainer)dynet::Trainer
model (defined in dynet::Trainer)dynet::Trainer
rescale_and_reset_weight_decay() (defined in dynet::Trainer)dynet::Trainer
SimpleSGDTrainer(Model *m, real e0=0.1) (defined in dynet::SimpleSGDTrainer)dynet::SimpleSGDTrainerinlineexplicit
status() (defined in dynet::Trainer)dynet::Trainerinline
Trainer(Model *m, real e0) (defined in dynet::Trainer)dynet::Trainerinlineexplicit
Trainer() (defined in dynet::Trainer)dynet::Trainerinlineprotected
update(real scale=1.0) (defined in dynet::Trainer)dynet::Trainer
update_epoch(real r=1) (defined in dynet::Trainer)dynet::Trainerinline
update_lookup_params(real scale, real gscale, size_t idx, size_t lidx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_params(real scale, real gscale, size_t idx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_rule(real scale, real gscale, const std::vector< Tensor * > &values)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
updates (defined in dynet::Trainer)dynet::Trainer
~Trainer() (defined in dynet::Trainer)dynet::Trainervirtual
- - - - diff --git a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer.html b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer.html deleted file mode 100644 index 772a059ea..000000000 --- a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - -Dynet: dynet::SimpleSGDTrainer Struct Reference - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
- -
-
dynet::SimpleSGDTrainer Struct Reference
-
-
-
-Inheritance diagram for dynet::SimpleSGDTrainer:
-
-
Inheritance graph
- - -
[legend]
-
-Collaboration diagram for dynet::SimpleSGDTrainer:
-
-
Collaboration graph
- - -
[legend]
- - - - - - - - - - - - - - - - - -

-Public Member Functions

SimpleSGDTrainer (Model *m, real e0=0.1)
 
- Public Member Functions inherited from dynet::Trainer
Trainer (Model *m, real e0)
 
-void update (real scale=1.0)
 
-void update_epoch (real r=1)
 
-float clip_gradients ()
 
-void rescale_and_reset_weight_decay ()
 
-void status ()
 
- - - -

-Friends

-class boost::serialization::access
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Additional Inherited Members

- Public Attributes inherited from dynet::Trainer
-real eta0
 
-real eta
 
-real eta_decay
 
-real epoch
 
-real clipping_enabled
 
-real clip_threshold
 
-real clips
 
-real updates
 
-bool aux_allocated
 
-Model * model
 
- Protected Member Functions inherited from dynet::Trainer
-virtual void alloc_impl ()
 
-virtual void update_rule (real scale, real gscale, const std::vector< Tensor * > &values)=0
 
-virtual void update_params (real scale, real gscale, size_t idx)=0
 
-virtual void update_lookup_params (real scale, real gscale, size_t idx, size_t lidx)=0
 
-
The documentation for this struct was generated from the following file: -
- - - - diff --git a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.map b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.map deleted file mode 100644 index 9ffc60dcc..000000000 --- a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.map +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 deleted file mode 100644 index 2ea81c69c..000000000 --- a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -2ab1be7e9def8b7164392754c4dcfb78 \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.png b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__coll__graph.png deleted file mode 100644 index e669a15870b9fe3b756fcc13c7806f807c35ba96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3804 zcmc(ii91yP+s98SmAxz>%a~*fNn|G?Gg6iivSn+?mVF|F60&bo%JOBhO_ppEvQ`*m zEE!v&%rN%s3}!sX_j;b|`CZRH@OhU zO~GR=7(S5B5M#~}p-xl;?y z3{NaP=}^PJ#LmL>KY`u5hpVk!o@%j|%D`%E#dq`_4WnMTVn1q#NOW;=Dbe~HU)a!~ zs-$$Eh6K+hlgVU+)Rv)h4_b!5D~=+}%QgBRaqX+{&dLPFSi&8ao{^!)mo$Ysw7t!R zBs<(`e20QRVM+A8D=1s9>eM-u}8mZIXIFBd4fD~sYrGZ>0SGn}qA!jlI z7Ke$$!^dyv>V6|+t91c+#;~FvsQqOn;2&cN3L(21hjW$B6u+AVVfg0w#MznrC5m~> zBhcCTy`{9>=Rg?=0pIqs4+jS#SR^iAzIN@}htg7MDXFSYpNf9W3$R7kL^-lbEtp{a ztbcm%L5A)I25!GcIypIkmk0|Bd-RAh)ARbgjP(g%W@bj3=e9Ht=ZTceOzPfZMUS(5 zBm`(38QB@Y=&K8{15ZOj&P48R|MY$q8oDyoGBr9{=R4E=Y=679rbc3R`R`xKTCh`( zs6iWfx+CF&_pdq;j?)N*@kBwj-Ow;sS1~|6c=g8BFoUOf)hHd225tPiMXchge|`bo z66axMZT&X%s)mLjAbKt~HWqGW#iz~j?z*RH*nu)t68P1KOoPM>44422H#d>fj@0#; z;}PL3bz!uI?Ck785&diBTKpF-oQdS+<8$-!;$ez1Evad2%=%tTW+!eX2i$#Cc#v1H zk+i)XsHUby%`YpH0p=DKz$sBEl%M0{Xf#?(T)c+?&*n>MB8Sbu+Vao+nGv8 zNLX1}c|^z(8A&@Y2CVL`kdA%JUYS^8D$Y*}PbQ>)yDth9?iH~C*1=MJ%r-cf_ zgF^?;b&6^Giz+HAbUM8+d*?$%v-{)6YC$W%HnD@gc*_35q3H`W!Kl+EIJmC5`kJER z79|%oT!S8qL=&_+3UIhUBGz0jaLFey@aXIp!v(GD9;5vuBSmi9)p40aD2E~T?Nf{= z|2v{OW{dc#ik;sJnwp+5dlGFsAL!d*2-09{%w@TIAIh zdcgf3zBMP8l8Sycj;Sjv9|z2^g!Z_tw`h!v14{kUm5Lk#;xQmr_vwrQ2Bv^@)3ZLd zeF|tz6UU5{)AXT8)n#736q^>heXqgbxsO@^U|_H!L4Zqg8Q4u$@DE`$98ds2o}pne z8-0K6-7*@9Ha!?P z*H@+8M+iox^nU;Jy!k{SUMVQVPY~cGV;j7V`*VwZ$Mvo08w*(NN#?XbLNuP%m#IBZSBsT zJASj@k;}CsIPWPhH#c|~d3qXJ;r!=I)Mbm()6C3Ha=d^KsUrcSpOo0!PFh3D+U`N! zi_VwT{RFiWlmSo!Ua-Z*#VxL^X!??4Dl6B(swYiPGoCti5ej8tVL5*MxLrq|;X7#SHC zhs%0;dM@s0sHvB+3LNJvOg zQ88xr68Cilh28!Asd~R6kUx}_M<*sGIy<9lvIhy+!A64sXjPI+HysZyIDs(hTMw$U zwzf7L4hKFy{Q44$l`1h~0>G68ZAUZ4!ong)#ZL@WQxz4Yj}HeRYf}f|IGvi7*0R6y z`Q^)(xnX;fA|l6t^^J|LJG?9%=j}tU;spLRli!Pr7x?%xv$MhbYm|T4+uQs0O;`4H z4`~hi;X_}J#swZ8bV`bdR_n==C#OO;dMlkeK|SW~+j>$fvi_=lnn1Yg=jZ2Z0{XBn zls^H77|4&c?i(7asjl`LyhZ5h8vEouHQgS^E~JidammQcoszfE1G`#xbC6%ywGJGdocy*Hh^?)y zRaI4$Of(v8-oN49y9>YxM#jN;|Dd2C0P>C<`10k8;hj5WWo1Fj;{mk2fOgML;&qeB zh=^m6klEgM`d**m5hXb6IUCs#(9-D#)JJ_e2{AFC*LhsO0D#M!4mJ0-tGZin&7HY^ zu=(d}^eayA!I**mfq^If{-wpmA3uI9uBe#$98{s+ipQS@xT1;W<+8%U!qj}wRi%*8 z(b3)$4Kqti9w1S8dJ1xJf%8VEr;`^Juw3w>A2WR1J-*;Gc131pj(v@0=hou?z?$;9 z%Xtu?pqXowlTKD_|NZ-)=;%(}kT%N3*`_!Fknv2f=k{p@ETqFk-_AAOZ$fsd7Iml7 z9y&U%gU;D~<UK{&#I7nR9MJdwp1)$p0_fy@tf(-` zXgs0)?c29EnVBgo?~Nrs+^?X|ytXgI3In^Lnr@3AFY&}h4Zpp+p3l5tOqB>#|vnN?ymm%%Erd#SXozB7wqwVp?5#jXtqebIXF02 zR7}jm+YilzM3g+kMojVg-2L@6)NdZAYpK!QadU~J$Brobg&su?- zry-PDWol())Ysc9qpI3aSa=J?h7MB=K3;{_-cV2T@a3H=LX|6>#iuzexd!`beS-45Xx`73Afuo1O;P*w}!4)To2Z z>~#f!mA*?#l1eNBKtSW*;o;%r#DLS}k!~Qny z6c*^jqvbT{2rnbEM`~=C@6ClvSmp-ouA~YRtAwAIkBD zY%dLfU%aqTN3|hj{ - - diff --git a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.md5 b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.md5 deleted file mode 100644 index 2ea81c69c..000000000 --- a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -2ab1be7e9def8b7164392754c4dcfb78 \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.png b/doc/doxygen/html/structdynet_1_1SimpleSGDTrainer__inherit__graph.png deleted file mode 100644 index e669a15870b9fe3b756fcc13c7806f807c35ba96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3804 zcmc(ii91yP+s98SmAxz>%a~*fNn|G?Gg6iivSn+?mVF|F60&bo%JOBhO_ppEvQ`*m zEE!v&%rN%s3}!sX_j;b|`CZRH@OhU zO~GR=7(S5B5M#~}p-xl;?y z3{NaP=}^PJ#LmL>KY`u5hpVk!o@%j|%D`%E#dq`_4WnMTVn1q#NOW;=Dbe~HU)a!~ zs-$$Eh6K+hlgVU+)Rv)h4_b!5D~=+}%QgBRaqX+{&dLPFSi&8ao{^!)mo$Ysw7t!R zBs<(`e20QRVM+A8D=1s9>eM-u}8mZIXIFBd4fD~sYrGZ>0SGn}qA!jlI z7Ke$$!^dyv>V6|+t91c+#;~FvsQqOn;2&cN3L(21hjW$B6u+AVVfg0w#MznrC5m~> zBhcCTy`{9>=Rg?=0pIqs4+jS#SR^iAzIN@}htg7MDXFSYpNf9W3$R7kL^-lbEtp{a ztbcm%L5A)I25!GcIypIkmk0|Bd-RAh)ARbgjP(g%W@bj3=e9Ht=ZTceOzPfZMUS(5 zBm`(38QB@Y=&K8{15ZOj&P48R|MY$q8oDyoGBr9{=R4E=Y=679rbc3R`R`xKTCh`( zs6iWfx+CF&_pdq;j?)N*@kBwj-Ow;sS1~|6c=g8BFoUOf)hHd225tPiMXchge|`bo z66axMZT&X%s)mLjAbKt~HWqGW#iz~j?z*RH*nu)t68P1KOoPM>44422H#d>fj@0#; z;}PL3bz!uI?Ck785&diBTKpF-oQdS+<8$-!;$ez1Evad2%=%tTW+!eX2i$#Cc#v1H zk+i)XsHUby%`YpH0p=DKz$sBEl%M0{Xf#?(T)c+?&*n>MB8Sbu+Vao+nGv8 zNLX1}c|^z(8A&@Y2CVL`kdA%JUYS^8D$Y*}PbQ>)yDth9?iH~C*1=MJ%r-cf_ zgF^?;b&6^Giz+HAbUM8+d*?$%v-{)6YC$W%HnD@gc*_35q3H`W!Kl+EIJmC5`kJER z79|%oT!S8qL=&_+3UIhUBGz0jaLFey@aXIp!v(GD9;5vuBSmi9)p40aD2E~T?Nf{= z|2v{OW{dc#ik;sJnwp+5dlGFsAL!d*2-09{%w@TIAIh zdcgf3zBMP8l8Sycj;Sjv9|z2^g!Z_tw`h!v14{kUm5Lk#;xQmr_vwrQ2Bv^@)3ZLd zeF|tz6UU5{)AXT8)n#736q^>heXqgbxsO@^U|_H!L4Zqg8Q4u$@DE`$98ds2o}pne z8-0K6-7*@9Ha!?P z*H@+8M+iox^nU;Jy!k{SUMVQVPY~cGV;j7V`*VwZ$Mvo08w*(NN#?XbLNuP%m#IBZSBsT zJASj@k;}CsIPWPhH#c|~d3qXJ;r!=I)Mbm()6C3Ha=d^KsUrcSpOo0!PFh3D+U`N! zi_VwT{RFiWlmSo!Ua-Z*#VxL^X!??4Dl6B(swYiPGoCti5ej8tVL5*MxLrq|;X7#SHC zhs%0;dM@s0sHvB+3LNJvOg zQ88xr68Cilh28!Asd~R6kUx}_M<*sGIy<9lvIhy+!A64sXjPI+HysZyIDs(hTMw$U zwzf7L4hKFy{Q44$l`1h~0>G68ZAUZ4!ong)#ZL@WQxz4Yj}HeRYf}f|IGvi7*0R6y z`Q^)(xnX;fA|l6t^^J|LJG?9%=j}tU;spLRli!Pr7x?%xv$MhbYm|T4+uQs0O;`4H z4`~hi;X_}J#swZ8bV`bdR_n==C#OO;dMlkeK|SW~+j>$fvi_=lnn1Yg=jZ2Z0{XBn zls^H77|4&c?i(7asjl`LyhZ5h8vEouHQgS^E~JidammQcoszfE1G`#xbC6%ywGJGdocy*Hh^?)y zRaI4$Of(v8-oN49y9>YxM#jN;|Dd2C0P>C<`10k8;hj5WWo1Fj;{mk2fOgML;&qeB zh=^m6klEgM`d**m5hXb6IUCs#(9-D#)JJ_e2{AFC*LhsO0D#M!4mJ0-tGZin&7HY^ zu=(d}^eayA!I**mfq^If{-wpmA3uI9uBe#$98{s+ipQS@xT1;W<+8%U!qj}wRi%*8 z(b3)$4Kqti9w1S8dJ1xJf%8VEr;`^Juw3w>A2WR1J-*;Gc131pj(v@0=hou?z?$;9 z%Xtu?pqXowlTKD_|NZ-)=;%(}kT%N3*`_!Fknv2f=k{p@ETqFk-_AAOZ$fsd7Iml7 z9y&U%gU;D~<UK{&#I7nR9MJdwp1)$p0_fy@tf(-` zXgs0)?c29EnVBgo?~Nrs+^?X|ytXgI3In^Lnr@3AFY&}h4Zpp+p3l5tOqB>#|vnN?ymm%%Erd#SXozB7wqwVp?5#jXtqebIXF02 zR7}jm+YilzM3g+kMojVg-2L@6)NdZAYpK!QadU~J$Brobg&su?- zry-PDWol())Ysc9qpI3aSa=J?h7MB=K3;{_-cV2T@a3H=LX|6>#iuzexd!`beS-45Xx`73Afuo1O;P*w}!4)To2Z z>~#f!mA*?#l1eNBKtSW*;o;%r#DLS}k!~Qny z6c*^jqvbT{2rnbEM`~=C@6ClvSmp-ouA~YRtAwAIkBD zY%dLfU%aqTN3|hj{ - - - - - -Dynet: Member List - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
-
-
dynet::Trainer Member List
-
-
- -

This is the complete list of members for dynet::Trainer, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - -
alloc_impl() (defined in dynet::Trainer)dynet::Trainerinlineprotectedvirtual
aux_allocated (defined in dynet::Trainer)dynet::Trainer
boost::serialization::access (defined in dynet::Trainer)dynet::Trainerfriend
clip_gradients() (defined in dynet::Trainer)dynet::Trainer
clip_threshold (defined in dynet::Trainer)dynet::Trainer
clipping_enabled (defined in dynet::Trainer)dynet::Trainer
clips (defined in dynet::Trainer)dynet::Trainer
epoch (defined in dynet::Trainer)dynet::Trainer
eta (defined in dynet::Trainer)dynet::Trainer
eta0 (defined in dynet::Trainer)dynet::Trainer
eta_decay (defined in dynet::Trainer)dynet::Trainer
model (defined in dynet::Trainer)dynet::Trainer
rescale_and_reset_weight_decay() (defined in dynet::Trainer)dynet::Trainer
status() (defined in dynet::Trainer)dynet::Trainerinline
Trainer(Model *m, real e0) (defined in dynet::Trainer)dynet::Trainerinlineexplicit
Trainer() (defined in dynet::Trainer)dynet::Trainerinlineprotected
update(real scale=1.0) (defined in dynet::Trainer)dynet::Trainer
update_epoch(real r=1) (defined in dynet::Trainer)dynet::Trainerinline
update_lookup_params(real scale, real gscale, size_t idx, size_t lidx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_params(real scale, real gscale, size_t idx)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
update_rule(real scale, real gscale, const std::vector< Tensor * > &values)=0 (defined in dynet::Trainer)dynet::Trainerprotectedpure virtual
updates (defined in dynet::Trainer)dynet::Trainer
~Trainer() (defined in dynet::Trainer)dynet::Trainervirtual
- - - - diff --git a/doc/doxygen/html/structdynet_1_1Trainer.html b/doc/doxygen/html/structdynet_1_1Trainer.html deleted file mode 100644 index c0dc7cdaf..000000000 --- a/doc/doxygen/html/structdynet_1_1Trainer.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - -Dynet: dynet::Trainer Struct Reference - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
- -
-
dynet::Trainer Struct Referenceabstract
-
-
-
-Inheritance diagram for dynet::Trainer:
-
-
Inheritance graph
- - -
[legend]
- - - - - - - - - - - - - - -

-Public Member Functions

Trainer (Model *m, real e0)
 
-void update (real scale=1.0)
 
-void update_epoch (real r=1)
 
-float clip_gradients ()
 
-void rescale_and_reset_weight_decay ()
 
-void status ()
 
- - - - - - - - - - - - - - - - - - - - - -

-Public Attributes

-real eta0
 
-real eta
 
-real eta_decay
 
-real epoch
 
-real clipping_enabled
 
-real clip_threshold
 
-real clips
 
-real updates
 
-bool aux_allocated
 
-Model * model
 
- - - - - - - - - -

-Protected Member Functions

-virtual void alloc_impl ()
 
-virtual void update_rule (real scale, real gscale, const std::vector< Tensor * > &values)=0
 
-virtual void update_params (real scale, real gscale, size_t idx)=0
 
-virtual void update_lookup_params (real scale, real gscale, size_t idx, size_t lidx)=0
 
- - - -

-Friends

-class boost::serialization::access
 
-
The documentation for this struct was generated from the following file: -
- - - - diff --git a/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.map b/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.map deleted file mode 100644 index 59bf6fdd0..000000000 --- a/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.map +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.md5 b/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.md5 deleted file mode 100644 index 40dccaa27..000000000 --- a/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -b4c574a7839d3e03e0f6b9a8f080d868 \ No newline at end of file diff --git a/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.png b/doc/doxygen/html/structdynet_1_1Trainer__inherit__graph.png deleted file mode 100644 index 82f8933928999689aafb0f675c4fd8ecbe5f23a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22599 zcmbrm1yoh*8}7S61q7r^S_A=UM7pHAQ$R{oI;2yiTN+eKN;;I5kQ7kq?(S|xyzly- zy64_=#yEG}vE5^DS!*)uo8R|7&+~g{n3{_09ZYge1OjnKUQS8_fk3fA6*9zzd!UXt<)3l**Tho z1o1a-#8E%?9WBRx_~`Z9%Pwy0!|OefWJ#%;!KP#~%nrmYgE zZJY{$3>NSy!>7V^1lg)lPHwL0N>3tQm{d4UkY%fume&4Kj96<=PvPv8nOBcew(H5J zc3@Btvmka}7#0>*+encvMGjka{!gCU`1ttYIR2Kc{FEvIRUN1Qi=DK_akp_s5}3-T zTApfXXpkR^M}KSjckSiCPkDZEp>0rI?ep$s)Y^WSgi85oR7 z20qq|zkX$9C84QFh-g_mLP0!u@Sw_StffV~)EHYCWlHnKd*WERn|^+N@cnFy-lX-Z z8je!KI#k5|!GV8ra&iu9Mqfx$5{cdHx7(S^h9mv`YU7iW5~`}W6udU?5{NNw?w_0l zRa9_AMn=wWZDIL~zj@Z^iSkZGX2mbO_tKJ@ge3U-?;mqGr1FZ2*hz!ZLRsj8kALvCNLCk8I@DV-T-S_A|ootN_ogXYQi-@EV5E2%6o$Y=#>%de{Q7OeU ze)fzSzNuZ$N)l1v^XHU^j7&~Ssz|4VPDn_o?($tmhU(_#CeO>?ls!Lx=Dd4{hbrEe zAy(!j;_*kVNld#+H>r3>?Q*)@v~7KR;!FF|!NZcGtINH^X9?9^Yey^B(}+wskGkGw ztfYignUXyDiOI?Lu6wg=C)4R7UKohmK@!|tTv?A^{>H-}*k5St?(0+4z(J%5xkZPD zhDSu)Mldik65_{3Mcp}Y7nYwG%2$og&d&b%Tq~`%mS00#J9m5AhK{b@aS072bE?K( zcPgaDeh!8x!NG+$L6{T~1qDmkm%@|f9m$Jpt&wN?+6*i0?d?`uafu1mf8Z!}3GbvP zOr&rR6+eIeyk%fOeNzA(9UZ|C|2vX`4<|M@*1^F+TuBKV^~R0dp7*J#D2U8FbMiF*6^ z;1d%Ez3fY0Xb&SizuYQgC~K=xz^Y}jjRJKh*tDRrB!b=0eKVxSiDjcjk1s%>a6 z?@eNh8&m8PMZD21du9s5lRKHiu=dSbUxxYSa6$jTK&)_{QtI2~<>&PD^jZ_hyYs2G zmJ9|J6Dw;w-<F~0pnvTO%lwY<-I-C zG(i_STU*=BnFhX&jt=<|F28HUPCnx1D@_MSrD>e3<-dDS3H$xxBNZ zTxQ(-z+YVa_wV01+1dB?%dXB}O{{nvtq#1qC;70Q4Mx3rSM*o!i$kkFczAf?o}Ql1 zO--M`?33Fa&ln#Yt6sIGJsMJZ(7mZ@v6HAhlH#PFIKp79RF}6WZQFU)J36Ok-t*Cq z;(3Y;GaVf&A)|_vk#D4K$*3DD=h>3|8 zHiq&saBw6O7_)=0wImh z@E!B6rkHdQp*Ov@)O?fA-;*F8|FsOibkn_AMSk~vLD-7RMo%}A<{yfok!@yP-lz3_ zveh&=2_DRj4vCM#9_aV(B|9FNaVse~b6F^;{`|Osed7ida=$JxXk`j4EE*-$`aQPi z{BC*s;!jU+bNYDF)Yj^KS-71iZzi9ru7FD;+BI6T=CI!H^3|>+O#jPAE)ORTGKv}v z=U3R8Ww1CU^rQ)??l=GY8`KuEG*E3z;qGzL_SLd+;L|Oku@p;cfoo z6HsMk67b342!%(G#xHDI1%!qMIk@f?ua}d_n8M~n zi{0^tSBJfp+f$_IusNmRF|+5{?q}rZ3-CF)mffzk&5S3`lP4AB<^65dwvYA)WM^6y z%1tqYQO03n62FOxk9y-@Ygu!rxS}Fe1SxLEa(829Vb6ny&r>SL)44VG*o}Qd6IpQS z?k_Qj{&mJ%{q;I1DXIQbn;BVddmOi>{odd;GPUeZSGO^e{;k(q-B1BXqZ9JGTXj~pLtO$^>O~x41405^I`LR9|CYqci z566ixCBFl=Rq!4Oq3bq3u2{2qc?DNTcf6vh^%Q6P+eb>8FhGxfb8|m48~F6M*7Gs( z(dwO+N{hB}qW9REitwweWTY_eM76<=zqd-@c15#EjFs9FBX?|t{4_4{1T(|0i6)ty z!F-|BU$3$~ZHMZS5|xR3YC*-Lm%9rQ9H)}Hx`gWL8ExI&8Uy#Zl;Xd$=bJ4*APPSi zQf1_Py^4cPW)cw3m|PzClhY+~hxw6H_s^dlZ*Mg(UHee`UVC6ZP&ya?&xXhgRbt*{ zXWAX-@YOm$1~$r+M3+%?NbcUfduNpT14DEyGs_n7>hGC=KW7kZ%2jLkW2CqrrzG(UM?+i*&5Yr^7ilvDohyPmwt4g zD7?aH<;nIOO^9}pjM?|MDB(B--GmVxKf1dM4m@F*k%1yWB~9=aA0HobB_16eJ;5`b zfdwNlFYf{3P2buLgp!h#8%d16zrSHK!Fz)0{OQPV9-5I8U)<*R7bq}r(uZsaE9L0l zHaCkEmy`@tS|}dxOp)rA8loW1&(B+Wdlfa3`qm^B6|wm2XK$)G#VWjd#bje^o0Xp* za)*Lft_Slb>iOkm>-adCjEoGjcoe4;;zWxddZ+YyOzd!mz zHO>C)o1Ue}NR@Ho`>&e54Z|<~^jfJF;197buQuhy-uJs_FvYPkS*0Z%qPd1pb9b*b zw77wa`s2rsP`dl~H((WV-X7iwpUx*SpgKbaW5d*^}rW(a}**P%Iv}$5rO5W;~FUl}!yR5Oj2O z%qc8Xn3$N5l5$?^yn`wZBdxR=*M6=kHz$XF@#un{AdHEZSBD_Ku~8%_I9QQ;jGVOUoT z&3!H|{N3H%@k)z`<&(ij_=tIs$>SB~AwO5JNZIFMl%@!}Jal$;rjKFP%tIFAw{PFp zK3#wZl!=`^7%nd+7S_QpzBvQ}6BBd4n=!*=qS68>Rh^ui98S0Oi}kp1h@L48d2zbSsBsD5XNW$-+H%q%9> zEFqL@p0bjBbaZ5Sx;-(Rr%W+8HpXagZ}0i{^6~APs7|h~52&c9x;Sc+uRZJCNP5=C_Ng(^D}tn2?;Kgu%>hx&GQqST1Ad)gbn#K=o)AdBbo zdwL5G?~9dW9*dp?!6H?CN)gWl0s?}ZbRqYBS^+`9hfH)Ud7(K!gE`*6V>9?|GEyjc ze%KpRZZ#qcPp|sJhYuxSDtsFdz~#1Uh@8hj$8y&KA#6xhXI6>_G{J^I=kj3@SOujDmK3(xMA2P4AXRY?l%55oJGsILH*`v*V ze&4(=GzLtEDYUhnV^j`3N1tq<*fgORZ!^s7KMKRdYSp!?+G%V&x$83j|nMp&>KBZ z-UbCpM~x9<3jFA`Mu`o*VZOw7f=4x^XYu?wEjv5Tozw>t=}!061%tikTOMzZe{>WYD`sENB-lNEeiY}A~Rq2M;!P4j@DMxMlZf?<~$qKx>&s$cJis3 zjJ71UAx49v~+dh=Wux}(%wGZ5kY#Z z{OfSYhYwU}cPgdf7zRE`FQqiaS~lrv=$K7ar?r7rsW1&d&r`8TR_TpP`_)zVT0S(a zF67J0cr`seY_C7n4zF46#;s3Q*?wt|78$Co$SKZ&TMdV-#_}3dh|S?zSiD-_(RNJ=4%SGeiCR_h^5=2_pfQ@(slvh1JCl^b}q;49)!0)_RvE zVyb8f5#Nu&4j+(lu=9@>#6tLq(D33d% z|K1Vta&3vG`jS;R=^dx~Y?eYwdZzt*z?kEb40&Xf%K<1Aq+03Emi_bMB7<>sh6)Jia8p6AKad)!XHhcZuCK3L^;YtX`?Yc;@e@apjB!y&ryFNBE zf>cHg)!NSP*x6rU^t`)65xum(;J!U^#I?Qii44kGnf6hD{9LifJ ztCl!jZQNd2gBlGkz=7SB+Z$8z+DAVTZ=tWPpJWpJDCqe2^8QV9zx|Q^}!A$ zm~xb|TXBvbm%}LJv>uIq;8^v{u>wyvn%-pX_ff42%Z-_OeUsInO=ORIZa;mxi98u{ zhNJ`vH8V4`&X~EkS&};kTVNLVTVBH#lB_Ehd3UH$-*CB= z^G=jc(PpYR?b~EsPE4#@{0=6j+44W6rBNyQ9q#!1``u$>qp-7c4UN1aYV>r`0&zZ+ zQ;}oXr&AU!WoGsO3J(8@iqcPQ1vry}nqxTWuo{Aa)%ZQebKQGi3mMDF4isr;QbRXt+Gb z5O;9sHK+Ia12DyI`};piJRGhG40N`cr39(DH{W=sv_J7OfXgYzJpN-E8ynl5u~H*V zXR=6wt$}Rx;^JZ=Dl|k=!WL!5Ka%^h*Vv$iq@*vzH8tzlKOt2zC`@UkpCZm1W@z?% z*DwVCJ`nM^TJDa=Cn3pO=Okm`wH&11o@+K9Fh!V{_qZsqKJY&5eujKN4wfPkAKo)= zd>CkkIa zIGba3aIEO8FgFJCRU?aw3;VuUQo@|Nj*h74wL9tMnIA5TPNbS1WXcVVPSNwG?4 zCEzOlaA9R&kY>gW_x-<#R~w_Vd*I+w;^Ys?N=Uq&c46K+)xHTw@%?O$<_VlX>W!DY z=N%--3f+E|I+F6@k<;rrT48ULPoKQUpL~;H`rpV|Z3+=j9(Q4C_`_~ge-jaB0a*vq zSl_amsehcrVf@TEi}#_;`KP34%DS-3Og%7)63`mcG(nAv{qx3z$+Ew(f#G!fg3QkD z(C_^2%6*cE*!XzOr4zfkrYH~`9|c`7?dY44 zY@fbFDLNR-*VotO)zva!@eb738yiCLgqUAiy1~K0A+Il*feRyh`kM!YE#PjFlVgIu zTHn|(Z415=SBdJ6fFhogmp3>z79X7Ddw3ZAMYGEXGujn@C=3+!IUl9_MVr?}x%EmnF z|K{QK1Ip66x{IL#O*hcCV_pr)VId*t9`5cxj70yBvlf-Zbj1Icpe66nxZ~S5VbBDH z&ibq*ntx7rm^nG$g@)>sJe78Jb#*$qCnlCLJThVlzHdTms{Fls_inyP7xQD^XoCkI ziu?@M?eQlFcwpl}J|nk9sJXgUYkjM{{Ga0&+Zu>pDybBwmX0o*8s{GW^&aL+N?^gK z_Dw7`QcUzzVI_&LIkVfGJYiWpINYrI3v0uAF9&X1?h3)?*q*GQ>o$pEXO-3vM_N_Y z_KGa@XMLa;^P>FKHV z=@TO(DyXAcrt4mRUps=qtCe+~#Acvyl6B>z435r^89V)|ndsb|$2!{|*d@V9#>4Eu z3&Wt`OK%Ch-MlbdAhdrZ6r9K+n`zv9w)sujUpx@j-}NasD&Ol1o)|+OqiM(kHY0`OD48DemON{dt-6 zq0{Tv_@tz|OXpH__>j5c5TB95b$k&Zw>wv43v-0#$8qZ{1ifUF(QI z^*;JV<9?J^+vAk4Iu}&5y!Fe= zJ_oRRy#Jnz#f=#m8qyMB9?ZDSnO+`mIE@L}P4gEU))B3l(M`|HR9N(qbZ_Op z6Vq7cj2V=lCm4N9If?nxom2!udmBdYvw6EfinkTS-9N>VW7I9AvWZ2;3_PB zux~;^+6}{Y0o?_qlO=XSyq=g;!s-$dS)sFD_P0{s``$a@AHi_%3g4sc)U(+tcLRLY;0}C*VORA zF5lloMG+7ZijR(te%^R!UTl%P_UnVJWH5FCUJZBy(Nsc%hbz5BJCfq!h>eYnSn!{1 zXX+ClsHQ7{$2fBOWVEu_oyDuP($yl0dCXa8^o32j+(l=?gm=%1Vbc}fQrAD7jje|d z4adh*XqjH|78gIy*ykV!h5QT^q}G67WvQr4 zrn39(W^8^wBVu@CI1OTA30QF@Bqg_sRb;p}myQnD!J8F;G2jmqcy3vQl-YDcSKD|+ zBIE8z(Z80u*9^DsGTlYhZ{Q^teny?d7SWRVo#2y@I}UET%tyB$lK0@Y0dCZ)=cG_9UQvQ4)g|i3L@n=2OSxPZtRORC@01`Y42La$ zVz=?I*(8^My!dv@U)+-~xp!s04OhtIXtjXzQM^w?{_--bQU>+$o=1G*Sl@y}`3q&D zVC;&JV6>@Ymx5Zo(4RjIbMn_{MgFcd|4X{IMR@(Okq-I6>13L^U_3G5P5(d?MJ)~t z3GJ2@)TXAka+B{Z3Tq0!VEo5Fu$5GgMbO38_VBiwp~fVKqzUyQV-=T~pa)T*``Z&m z+_!ZF4_;U_zST24oZZ;8`aYC+pJ_WC7@I;Ae|YR{DTl1*lR zQC{^pUVz#tBVF`YK&(1TZmpI9EgnR#!m09S2TPRSJWpgabaZtU#m7{gizlpE+cfoe=zT1uFvW|epnrYMJp(UMHXzE|psMJ&!P z=qQL#Om)MLce3^cZoVbO!+cFk)O1sQW)Gj^=~oOC6qJ!9MHuIuQH*$0K3HPc{3wrJ z92XqvJ@+`-jQSb)Aw4}HGBR015<6FZ?8j$fC8ekGr>;V7yuo>So@pIC9*55X-Wk#N zQ5t&mKdS$C75P7x4q)bF7|Z1&_3$wJYGr}Jenwc=1M9JqQ~Rr-U~qMuQHFP;u^v0l zx1cuDdpb)np10tqoJ8GrjKnAZ>OWvH0&Vh&cy}zqO>WTuBlGv04XY%WV zIUcp|EyGgGPz(rj5tKQ(-F`(`i)Q!Szv*&^kPQx2#%35ZF&m8F1q219OW4t~L?k8> z{}*Z0_9F=FaHqlU+UH6J^bduOrHD@xtRJ(Z$e8rw9 zEtyV5sGK*Py7f-UTwlCkf1olQ3|G_rkY3m6G$b#tetDS7+L{oXdivJR+8RgRj%tx>%^(`LE>un^<*Z)^iuW7MElFYP{0_(+e`0XP}ws zZr!ropZDh~HEza6j67JX1Rv=8z(8e_ggIGW^l)!?x@x-c_cthqb6MG_;`A<^{oi-dU{j*}fgR=}cVXl@ zsjjZ>l(+|s5)PFhy*^l8Vu`Fb#EWzejekO>9{_m580)-XPU$tt>Z(U*s2(=d4&Xl2 zdOV`yvloSXWGScYgHn-_Sz3yk^^TS#+3@t&ic@U*?-#u0DV>=E3>Fo7k-$#W^;*Ar zB`%r0{6^c$vfTP^tZa^si;EEUAme>y zZrGe2yw-Pgk0`ulsZqnB9lPzvQd$THkVvhqtw?trn?{r}!}pRoE-ns%XuiH=;k6m3 zWj4^$!*FwRqi1Bifk4A1dy|qv_Vc3vVYWYj36OkE|h-5;ptew$R5n!#u+-|ne z8ib&A;S#?v4SJ9LC?P2d0s`Pv9RHl!8a8>~g{2~>p+TrKh9(9mrtabz-h*DNveH-9 z)|qa5(R#HGw65DJQGtQ>j$5N{pd;A7HU1gX7s75E&Tv!d0oPXoB8YE|jTLTt&y+Gm zsi1m5SL42SKIiw3O@Q{~Y|gK3c$f$Xl(=HQgGFhZiOO3?tG^^oOfr{$SEJ)n-;C*k zztF;C#R#6XISBr^sW@2~8HLSPNTtVa^mL@?ey8CR5P%m= zLd(R2;o;%IJyv9SwKBB@)nwFSF|%Y_5}3NnT71C#%?UBC+?S0uxxTt^aC8K}P}K8u zoB1LPOnzLL?dcyRDW#D?{d!L_SZ)T*@@EPcpf}(9vm{Z(xp^F~&Kb)iEJ2;WCVeDnSLbk(yes`+ap z3ER_QCY4~*_tkFHn!X2%LBr`B2

F6!C792c)E=P(M&p2|Bk#QSgDqNl;LUhQ^?2 z4slt?;r7I%NE)$cn*z4BJ8pMsG=O=FBVy$OLGqaVcz4ffY-@4xZDuCza|?@mAo4*9x6$}r-ScQXR>I7D{%QfT zp+xqvKylhPYD|HJg%1H)V_0gjpZ!+w;@A6*K2GfWy>REa%satLlOG4bBu^zR9QH{C zMeKDM3OniF%agVbeD?ii#$t6_Cx?e`0YF^+ofaV-L6QYgMGBuiwUUxjf0eavL6$#A zNSo=}iouol$h!+82O^HAaIbGbl1aw%3J;`*PPXU6h~_LJQY?I$e`Mdkla{|4@RgFC zvnsE?8(h$c89yy6C1tYM9>xzzO4{Q}D5QnGPO*)BPPEfTCMbRW?9_1b@Bn%iIDBNr zb&r7o>-O!ta&qpG)?*DrgQk`mV5j@{mszXW#s{82>9iWAsyiS_82YD{lo?Ga*#HYE@9RPF(w zQ?JqUu}l>CEm_&FOPfM{CZ>LAt3u|FA4lJ`Er=^CugryQD~5L5tf*b2mqzu+ARz&w zLCIXLOui0iEqw{Xu=w+3AiAyHy{ZX7;7klX*xiz*{V=6RMf@Du*LzG|jarV4n zSdsbB(Lv6r%KkkF3wQtTnXKcQ%1F1qZp|&767n#xQFHQ}+h-b79j?x8mzVb$EFz-} zyt2w16ZX@b(>Yt>O!mb#vgDMDI$@<*TjjmK4VUtg);bUBgu{P~BU zSKef;*BQH^kr9heBac7^Kw7@OeslsCcVWh7WwUl$4Js`qp``o@wvGD2<1DpEMpY+Z z=(y=M1bN~Tj)@pmre$1D{Uq-P2eX-47K9|R-NM5x8+k|)Y#A;rEIhxkaPP!0DCcS+ zgvJaWn8)@13^d=pw+h_0(bRjonr&+!%KxztH+^Nrl2&8}VZqU;u1osFzyLu-h4QsZ zk(%u(hPrO^Huys<-~3k``6+7~+&cQRPWgSWc)`z&m~9l&sZ+6qVx7UOqY}w_z^!}! z{9D4dWd^?^w(zXQ@vf00Q;_NV5538XyH)zvLPiVWO{-QN;Wy6zo+-{d34l$HJyrcn zyenEpyY!3o*e&mq5z~a3K#1K63k@-X=s5^fD^x)5 zUwhq@P+GiDdar&M^GLT29mf!WDQf?aE)sA-#$MZ#1zQ&DX8|$MxWK5yf>Mjc$o^zgos9P<3QSPiqZ~xxv_whRw>{jCKR2}84Yt%kZe3sh5IDTt z-(3uJ({=G--vj>Q6FBLwdK$8$H~;0mgM&k&rdcG&Ra98mGIAmU3C6JHHmDgYR_5e| zUAve=$!$13`&o=~?+X;A_h0Ym>l5!`mSkmxH+qQ$7g%mRJcFs=e3gP%lcJ3?5o#`M zKE4Kp-wCvM`0PfW7%$go@b7wLON8;-e#OVHK(HBDiA(32F+l1I6+C)|vDTSC-+g9g zW(Ail%#gMxuy(Rsy~II)+js;13P2Jnoi)F=C=E~y(oj7>5Eu44O=t;p{}c7t}$hf!0PQLHx*MdV1HJ}VBT;^!czPaCHCWOT(%W&d9K5zxg)Y@$m zd3}Yg(WmRPGlheE@}M$*eK7Mr)n{rtH!}_zgZqjUd@vi+es11N&6hhN=vrkc8!zVwModV32)i5GZ$?7Tf) z2QZsDkV1(G-9LVaXNdZk*x5ycRk8^DcKO$@fe{f{z_2iC&*ds6w=5mJOHB=f^$^TM znwbW-s%4jH$OjNpojW^so|l6BzyH^M3a9khk(@rU<(#O6L5m+)?RKPs{??rm!oG| zS`c6hyOa}eLc+F!O=ZPV=UppIOw10GDhV6;+jn?-3R`5twOCF6e7Bp$@)0oq{Y>A% zo^S3BthW8&Z#_nxrJ6xgZfC@Ec(l?GS1y1bCbfTd76R7i(`uWrCZ9ixJ&7y`1Pu+1 zyN8E-&*6nPko*g)zdj%oe9=OJgIh;ONuXdJFE6cQ zQeuOnPDW1N+Si8*$o_vubx{$EOMGb0Vp-wb${!u0W-9_!Fk#98K`qFcgAzj6_e!tQ z8<-~G)3nB2DfsN#7ds-njJk8X~%X+YuYp9jfhmjuu}8C@D8*LOz;s;ptfM?sT_N%BaCty1LqU(7w4t zO+7ZVv_8ujCi5R{ZIZi(pnL(WmjaOf_;^DT++{LgzVH#@QBe#&K0X8(3e~!Dau~o< z#pQZN1s^>sKz+T&Us#0s>M}Utx5Ri}?!Y=I3j|2yoe(P17mXd(z$At#!>3 zo185Bu2+L|U*@hF)9zCB#}FBf^nNqJGgl zV}S?E&CQkH1T2M)Jz23YT_j#uS51xfglWodQZRE-P5vZMXx^E$gJ>-u?PX zqTZK2rx`;%rw*WS-4=dWyYq>aRn-dQ8Tyt=xgUqSQ(1{NCn8JxY%UORJhNnvVL zjZ=s;m%$%D!g`iA=qYxwO!yRdfBeKN^o7;c2PdA6j$8$wKlg)1px*+&Q6pa^jeccu zX(@M+t=Z7%O8caNS6+YCJv1~>;vPWy18#FZvfz~GeEK8-HM^A5@p3mIs@lDaB%g%2 z^p%kZ%#06`wy_(1{v?4y4DDNsm!tm#zPUn8Z-cj;!c@Gj#T+`X_q{e)CGjw%VEt9o zTr!)fKj3#Xh_?d>8peb~$VfI&Yxm z=?3C>dx8)uex#QTM2})O)x0tk^`E4%KmsdP$x69j9OfDxK&y+Qt&qp~c!D7=sP<^k zl`S(fRC~?;M4@HIXvMSY?{q@-S*e~z63m_iXlQJvrdc6NUCAb+#Z9kfo?=ba^tC6l z6r5kIX`T$0hJ~^7+U&PaeCai{wSDVxblNiXnu37v(PplQ#Y+nd?S> z`iQ(n+vqCs#DFBLd^yPs{Ez}iN^yCoG;Rw_h%MPXqT3dr+|G)tuQOyvyF(uM@9&-; z@hC2CnQspYU2C=N6sK8xD0zp@do7^R7B)6+!(56~)mx(_+NHWveagz$gvFJA1q*V+ z7Mui-L*aLtK{UJ3Px?L~0sX}(`!18AJWc-BtIvoZfBT@47Kum3PZ)yh7u?!vhD}j@ z`)F+sasr*ks)ES>pNyc3=)Y!5S>r~}AOPvK>J1f;fl^mY*Ef%&eW+nuf5>@q1MB=) z=_5bBsHi9mCH&p#x`48#%fi-KAES2T#KER2yBTuC{-3?(`>=|`idgDMiO2+l=kB8y z|IukMWol?@!jNWQHL53yXH-o}0Kr3bx;qmAD<&1TXOaLv+4?YJSqLmdFaZosJHL?LB z2*#`24YXp$*GJOF-Hcuv3vFvBvvxk8H&QBLUV(Nx=<^}8w6@mVn{8xfXIHVpb^wnu3=#EZ6l@G#fByVh-p`@&A2>_Rto}QlVx5G~35zorYYLLFj6y0Te93q2H zg_KhzR{BgtgYO?(|M>phAJE9|o}O^X*x5G>3ZMgu9Q1LO)kwIFjm`Q|pBN(qk2Ccy z@r5*mdO>FLz^dV2l9pjsX-cf%51l~OG*mv@9!5ZiZ>-k{ZRh}2h^I`+HZmRgJ-4_l{ZGp)X)`hSjQn7%mu^X zKdm>qV<-Cuw@aKz8uAK1f5w1k4cRyZHW4%qwGH1*O0X`lo#KVZzMJ3sTqgI?j}dhC z+k-=v}8f_J;KV6WxZ zFC0-(yYtN=x$&tFZD4DDpJZ45y}N4!WaYv5*A1e}lRx-`jJ}~A5h1PZQZ?Vr)B~Y^ zsnqv)$1JgyCyDBa4 zF~dSkQ{39(4uuw-1Te5ahUt{>Ac+mIgIMUJ2baCCuM~<6_^7$K&ieEF1OdXV9qf)L z3sx6pWghbfs{@dz2|2}HyYd@;iRzk~-=S{@Iq|a^i&Dx)PfN`;Z6VjuAHP?1jZxY- zF+1X%s5Zt2F#i3SQ<9SIfZ60rI1W17)6d_h8pPO*uQ4M??mW>OCqCZ35YZ_Ujm%d) zBBG)Ov0{RLxvAFdyJre23Z642=gsHGdsLOgU`$bAk>a#>(VR(2wLiYPI%2-M{xgSc zlFIPg4UVRYDlE&v0pe0C#Vf`1eRgCdHVj}b@2t+`EY6X`lRNpp(~^f8y;O;*6mEe{ z9v)h&z|JoAuI_^FJ=gtEyBP)hch#h9Pqh}p*-lMjR zpu__qRRzlkWUwBTqLeW(U$^uY(d4P@jL^RJ;>6Z`%dp~k3SoSTkQ?7_nZ2!07C$%uKv1lLlaX> zN{ZJjFn^G|B@CymqM}@AOUsitk*`A`CLw8SGiQ0$3G!^ z-RWM;jpW|%KnEjRq?~tcir4$e^3*}+`mZeSb2%+@yc&|hLdW$TT<^1ihDQnabM2eA zI*`p_$edv)?kvgT~rm{aIOxj~%RDRwIiCYp^QH_+vG z{rn2`|z)SPBtdSh#rwI1469`}JR42cU_CJ>sy?(Xo_L_E7-Toc)aJ z&aGsGBw!)xH$~n{3CXqZ6LnwU$aKxP{(3!~XOohd75DYM2ho4vZ9>tOQ2d$9+>u&b zZ|8^i-z;H<40^X z8D|SgVPVuiY~tWpbiiP9zLjzfR7m!zCsyK<99O15k?Au7@Hzz0GAI~Zr zfgoK*z88R#$0p3Qt$r~(ralW=Vw4w&B!UaTr&Cy6=^X=-kI$iw5;_3ozhtDciHM-* ztITx3FRJwwxl>>N9w}61qMZYaitY$?L|ZxmYbt@fb?XBkOieP8jfMTAqiW7_3P@fO z&@g0>7#4OH1{MV}IR)kz*-4q*R!ul`j)avpG>uJuru+i`qz&TrpkTCyE?fN=nzi}y z3Il$hOZHM@RT#5RGDOojpNCRG10}Kn5}77fwZ>HvG=MkxKxsUjTBNxA^%~`=W+Q=z zhrPo>>y3}1KBREuPXNZ8tQzW?|L#gAP)Q+ro+%;}A7IG?hwbFHD+~se&hhRHKJbzH zW~E@lx32Uu!yRKcGuuTrD#GA0n-@2LM>Eq{Z0m)XN*@z|N)-MSe1n`GhpzB*ldaLa z+sEbPatfZ|Ks+x@*U?Yc#-h<>8t`Gk$4DOvAQbbLuQ?Thz@Y^TUrQ;KAQWI`Q)sx` zUUO$dI(+c^95%JOIb|UvM8-j?87dC1zqGwU;pOCeX+98XR*^FudUZ19^YeWbVS2hq zxo;yn|Hsu2DabZvDETFrh(_yih>49}z0$k>^9ns{pSbdi8@s+sPz6wo#FA`&@Spk%%m?jJ$Rq$8887A>7@0O6oq}4W?Rn6$nFA+M%2jho;G2 zRqPH_9Xif(-~!{rMJoW1y4*UM6fm7A2p+ZZ+=AK8thAIN>|(iF=zKB4$0jD# z^gWQL6m`I;x222FES(=rAz2=HN|5b-KZRhPyN$##n|zMoPK%{*TL?j&Rpe9h7uU@juqn3@rj9UBVCXK70|dX7^S*_HZ`k-hc8FI04;>-|(%ND+ zxX!N;7V8)p9tQD;V>I(`SEB8IZv;g^XOdzMwTLGX4i3&MXjm3>UVj5|m(E0bxI%ZJ zu0)m^!QB6#Bk4FepuzLkTj<9E*gXR5!%v?-%W3dFe2BT%ct#D<7|_mu8v7y|h4>K_ z;I%$}{Fs@Wdkg3{c*95c^ouGFdw4U2*5>1tN0{-6iK;iy?Pz7Y?AK=-8Idc;h_kA| z|1m!KpI22RZc{0zaQXwI#>~XD{%>c-OHK2v8eXX4E+sC7FGVCxcHivep|)VnSK9O} zjp5T*KJ&C@ShFNnEJ`9y-rBk82inCop0dMliOMp~ibxD%JX!UIJ=^ruH7hjVV!TC* zKn)(>m(x4L4e`N1VZc)gJW1_VI-PCqn)K>Dtnr(exQ9R*LUeS#YLmr&z zn{NPwk}uF21m^2DLd1Rljn+frlZ~Me=*g1A40?OIGbIbdE=Qx__)_y>BD|qR3XI(c zpl#_c&px|?Go270FZnPr97sL5B2fR;OT*znkS_}YPhtWxm4~dX^aWZ91Yv=|xH+5I zZ`FR?mCaIn2VmIe&rA_NeCQb8NnL&^BcuIeWI^_*W26Mc@+9osaxU|PhqNFf}J2)X{0|59miV<5LYw3VH~>6mY9%$ z418PDZffSM>`T1FfPwzE3Ir%=o8c*nA*N<0rcJ3f*{r-u5eaa>iP04Hn{uUDl2WgUQ z6nU;@*-G_G%UxMklI-$wJRp8kcq|D92M5!imVH^vs}pH-rU8idKv|`I)Iye5MH!`OMCzpLUv(cPp0ep_!+RLO#!Q3 zTr@MCDlw>;2lI~=?(2dNI8N_4?`+7H=-lVwAp&OfM_-?;hQ^@gmdok%SCz%pxA9IK zKxF$Xe^@p9dzq^DWt9mU3ubL=^iqp}^8g>`J_`$^v&2w>@PNE#w86!|cq5bjJ@^g< z9zOoSf-Ag&BucwTC+q81BJNadxGv*W*2(2Yxf-|kXhb{%6A}_!lcyHv=if|DK238K zRG=rg2e6=Q40Vu3fs~}=4d~T21tQkLpe3H37v2%l-r2bb4<7^#Xrh0QHPed1;nguj z@B$71DIs)r$+s&jDl3zPEg{7mwt75TW{ivYTvGD*bK1)^iZ3H2@%MjjQ;L3+Z42SZ zjuBJIzr2*u3>mTv{>^O7Lyk0*!=xmDI$;nK6N^*G6|{vH%)BcpVPj5INUMM4vZdE+ z0W$$N!}~q@!6hnymjqq?{o6e|`|R_Wr|8#`i-FOa&z4nBog5sH@3L`Y zN+0co1&RlH$>x=gjLuCjwfj0au`g6wl*(KK;7dTH&JTE-`}_Xb@9%kk^Ul2Q^W4vU-PggyB+1Y(_DPI(=G8^x;*xHis9E9Ca%;>OhhHd2 zO*~0gvR-j+LG{?%nzkd5P35lQB-P?%_(7>}oEM-??Tb{bHQ zNy(bIDi|#Ai-`^DQ*2dG1(L9sAnbgz{AFZ2#ekmkwsi2v$S6U^myyR!-Q7|({>wto zu4$eQFOx+f6Z%IboT=vGAoGmBwW$ftvCeYA5}VhhgDHka^DRyBow;T)CdI|h>3LC2 zFBGVjnB1f8+=QaUCFv6*G$f=6PBaG@>r0L1JU#8nEpFKSt2T*9&^;rhxw*f9T9Tgq zvw3B!B#B#AjYMedDhoci@_mJ2zM|GV5FD3$Td#S_&o5PqN7YYd9bXhL%_(MehrSH8yMbrG}@;x?v2_B!}H2k790~iQt-_ zqC75l9C`cFr#(H_KyLY4U#`(s)1k5|0t zy0zIK4gv1U?6{1}rsfdMysC>Nfm?Y{Ddf~PL6tSxqoAd=MnX$WQR{@d+1F7=50BZ2 z5j!%=)j+LAP(g8GAY#?Z!eicruXZ=Xju?1(eWMy_Fr%cM+F0`L)x%9!lvh&BR{|TK z6|mO{NC$nmEIGc{K#de{8a1o>eg2*U#zSj5J6(k3%+neI8M)~vo&5{KXReF!@{Tk; zeMP_7Fy)qnxT;^TpJhU- zfSTE&2LII5npIzfBC*L}zp829k zcb>sc*CYK}u3}-|78y7Y&KJMd5Sm%TTodYa$3c1t{_Kg6l}92Qx5r)zZdm4aq5T41 zQkd?k_XL-umfXI#rK|@%Eh(XpqHC&e$wH3A21TW1-+)%=SMJ~)j)xzktifPjV}8Pr zM_b#SzW=j$xx>e86pvJ@G9L8(^!91;Tc+Ghb==U|h6agVdSuFUkUxDr=d*{QWn!Eg z*VP@Wo9pGGdl||=0_h+lPWJyfLytstp~d3Im|w4*RS?&T{vjm9<*R}X{Uv^rgMCQ= zgWVj7-kfx!DmJyF!yQxOICeT|{0`niO~e4c@VRL%5Ousr<}7 z{t~3v?ceX7o*hm^*hPF!&Xzx(er{nT#=ajJdG>;>>o3N+%1&j=uBdM-?Dw5p;6h@I zwwCBdRB2mSe2*`D$MQbPxumlEkKNHw0DYUe-R>|PB$99`mN!YkAo;`b3>t3@R zm8y^4;^@}%<{BgY{ZiYu4GSl0Tz9=Teg27Lx1XP1B9qDd=Q^x47Rv$YOnF9P%znz~ z6Cy`&$+V>{9rR>Ml9ci@rO2#QEcR4g62p$F%Ve#?0xrR!MeV6?Q_tc<5K|KPLS%hl zF1DHO(;y3<0pWqF_pbhEx9F#63L*ItFfcL#b-o^LHv>cvrR{>HVnGhfM$pkEw6)n6 zv0&erYr7K-2EWpCzB?Z;l%4?v85@~qdkWB^D}oWgxz+-@?IuzrI3hGNGg*Sp!A1hz z<5saTL*G7{gJsUY^gisu#zGA#FU>zc zt2M=aIS1T0diK_#p`qNOKXo=CcTPe^#t{i_DDEl+q0^5RwKNaZ+IpWTd4pXJ#fqNx(M_e?%%;t8MKmmK=A%AA-bA;lgLjMV|n`1 z?qCz)RtbSd6bc-n)5ttPFOmdVCX_vzld{IUo(Fg?n?_jMO{P*rC3T#K;XJ@u+yR~j zQ0mO7Pos7l(37sZJ~-%w%!pzp(^^r{e)nz~F5oLMC2WOk@7JoTau9Q?cOc+ulVUOY zvn~|s_t3j+%4j_bZC`EZSlc$6a1c+K`T2uWp8x}ai_nvhIY_`9YgEYHmRt@>VbP_oWY*W!ZPwIuJTe4gftL`lbwenH z@^{K#o>`1hP~UAUS|Q}VMB?6EyW*WJKF-gpBw8qBLb0jwbz$Muw@}ZL&daXqWk}%Z zK+pH2tLq9(Ul(pnmgW~0R*Sli`+;_Rk0q7D|6z})$JhN<3QTF5m&i7#4)y01?D}xTRsHm^yk-h3l_A%DMfpceL(Gb? zztOX~y1A8iKL>$ZRWrE6gGF1Ca~fKi;FHd76|PXuDs&y)%6Nc%bKqgPCcq7G?||KX zzeC4^@87?McJA&^4Y36vtY-TIgX4@u3f+EF2HnawKc9_8$0#!s)-&4-6~`{mmD{@sBGKK588mV`!kdRRQz-@RC6TU#Z+zd@@2rA#g z;v)H#&JgYKevjJachKhu-1icU(z~#eLeU3SZTd(gifeeBMe*3@f#jB%KduIce<=Df zD7}4*v53VXAYU@Bx884bI-+E_r-tiOus7>IKQsOvO+U$8IB<7Nj44o`ym(5H+i$lZS0U^O3aZ>W zX)>Olm${cY@Yha{De64B8J5OPBD`~x138dj*s5oJ@N#4R4=mKj_Fq-mqn?Gyf*tH% zqobpia?vxZOkJ5@+k^*iy7B$w5YtJo(1ZuXoGn*jN+% zhk)3aH(tbK!ia~5$I`~;s*!*{mkG9+#owJhTKRj(U;4YNUrSnzrk$B9#V%z@lKm4h z^vJ1HqElO{uD>;UC(Z}jmvn0U5g1wf&O)cR0Opc}cg_(NGD`npc-+HSXQ!1_Vny@8 z3F?9GuXei6*#33QW25~0JGT% - - - - - -Dynet: Member List - - - - - - - - - - -

-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
-
-
dynet::expr::Expression Member List
-
-
- -

This is the complete list of members for dynet::expr::Expression, including all inherited members.

- - - - - - -
Expression() (defined in dynet::expr::Expression)dynet::expr::Expressioninline
Expression(ComputationGraph *pg, VariableIndex i) (defined in dynet::expr::Expression)dynet::expr::Expressioninline
i (defined in dynet::expr::Expression)dynet::expr::Expression
pg (defined in dynet::expr::Expression)dynet::expr::Expression
value() const (defined in dynet::expr::Expression)dynet::expr::Expressioninline
- - - - diff --git a/doc/doxygen/html/structdynet_1_1expr_1_1Expression.html b/doc/doxygen/html/structdynet_1_1expr_1_1Expression.html deleted file mode 100644 index f6a62704c..000000000 --- a/doc/doxygen/html/structdynet_1_1expr_1_1Expression.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - -Dynet: dynet::expr::Expression Struct Reference - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
- -
-
dynet::expr::Expression Struct Reference
-
-
- - - - - - -

-Public Member Functions

Expression (ComputationGraph *pg, VariableIndex i)
 
-const Tensor & value () const
 
- - - - - -

-Public Attributes

-ComputationGraph * pg
 
-VariableIndex i
 
-
The documentation for this struct was generated from the following file:
    -
  • /home/paul/dev/dynet/dynet/expr.h
  • -
-
- - - - diff --git a/doc/doxygen/html/sync_off.png b/doc/doxygen/html/sync_off.png deleted file mode 100644 index 3b443fc62892114406e3d399421b2a881b897acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* diff --git a/doc/doxygen/html/sync_on.png b/doc/doxygen/html/sync_on.png deleted file mode 100644 index e08320fb64e6fa33b573005ed6d8fe294e19db76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 diff --git a/doc/doxygen/html/tab_a.png b/doc/doxygen/html/tab_a.png deleted file mode 100644 index 3b725c41c5a527a3a3e40097077d0e206a681247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 diff --git a/doc/doxygen/html/tab_b.png b/doc/doxygen/html/tab_b.png deleted file mode 100644 index e2b4a8638cb3496a016eaed9e16ffc12846dea18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z}0l@H7kg?K0Lnr z!j&C6_(~HV9oQ0Pa6x{-v0AGV_E?vLn=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ diff --git a/doc/doxygen/html/tabs.css b/doc/doxygen/html/tabs.css deleted file mode 100644 index 9cf578f23..000000000 --- a/doc/doxygen/html/tabs.css +++ /dev/null @@ -1,60 +0,0 @@ -.tabs, .tabs2, .tabs3 { - background-image: url('tab_b.png'); - width: 100%; - z-index: 101; - font-size: 13px; - font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; -} - -.tabs2 { - font-size: 10px; -} -.tabs3 { - font-size: 9px; -} - -.tablist { - margin: 0; - padding: 0; - display: table; -} - -.tablist li { - float: left; - display: table-cell; - background-image: url('tab_b.png'); - line-height: 36px; - list-style: none; -} - -.tablist a { - display: block; - padding: 0 20px; - font-weight: bold; - background-image:url('tab_s.png'); - background-repeat:no-repeat; - background-position:right; - color: #283A5D; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - text-decoration: none; - outline: none; -} - -.tabs3 .tablist a { - padding: 0 10px; -} - -.tablist a:hover { - background-image: url('tab_h.png'); - background-repeat:repeat-x; - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); - text-decoration: none; -} - -.tablist li.current a { - background-image: url('tab_a.png'); - background-repeat:repeat-x; - color: #fff; - text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); -} diff --git a/doc/doxygen/html/training_8h_source.html b/doc/doxygen/html/training_8h_source.html deleted file mode 100644 index 535beb8c0..000000000 --- a/doc/doxygen/html/training_8h_source.html +++ /dev/null @@ -1,301 +0,0 @@ - - - - - - -Dynet: /home/paul/dev/dynet/dynet/training.h Source File - - - - - - - - - - -
-
- - - - - - -
-
Dynet -
-
A dynamic neural network library written in C++
-
-
- - - - - - -
-
- - -
- -
- - -
-
-
-
training.h
-
-
-
1 #ifndef DYNET_TRAINING_H_
-
2 #define DYNET_TRAINING_H_
-
3 
-
4 #include <vector>
-
5 
-
6 #include <boost/serialization/export.hpp>
-
7 
-
8 #include "dynet/model.h"
-
9 #include "dynet/shadow-params.h"
-
10 
-
11 #define DYNET_TRAINER_DEFINE_DEV_IMPL() \
-
12  void update_params(real scale, real gscale, size_t idx) override; \
-
13  void update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) override; \
-
14  template <class MyDevice> \
-
15  void update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector<Tensor*> & values); \
-
16  void update_rule(real scale, real gscale, const std::vector<Tensor*> & values) override;
-
17 
-
18 namespace dynet {
-
19 
-
20 struct Trainer {
-
21  explicit Trainer(Model* m, real e0) :
-
22  eta0(e0), eta(e0), eta_decay(), epoch(), clipping_enabled(true), clip_threshold(5), clips(), updates(), aux_allocated(false), model(m) {}
-
23  virtual ~Trainer();
-
24 
-
25  void update(real scale = 1.0);
-
26 
-
27  void update_epoch(real r = 1) {
-
28  epoch += r;
-
29  eta = eta0 / (1 + epoch * eta_decay);
-
30  }
-
31 
-
32  // if clipping is enabled and the gradient is too big, return the amount to
-
33  // scale the gradient by (otherwise 1)
-
34  float clip_gradients();
-
35 
-
36  // TODO: This is unprotected temporarily until there is a better solution
-
37  // for serializing the weight decay when saving models
-
38  // Rescale all the parameters handled by this model
-
39  void rescale_and_reset_weight_decay();
-
40 
-
41  // learning rates
-
42  real eta0;
-
43  real eta;
-
44  real eta_decay;
-
45  real epoch;
-
46 
-
47  // clipping
-
48  real clipping_enabled;
-
49  real clip_threshold;
-
50  real clips;
-
51  real updates;
-
52 
-
53  bool aux_allocated;
-
54 
-
55  void status() {
-
56  std::cerr << "[epoch=" << epoch << " eta=" << eta << " clips=" << clips << " updates=" << updates << "] ";
-
57  updates = clips = 0;
-
58  }
-
59 
-
60  Model* model; // parameters and gradients live here
-
61 
-
62  protected:
-
63  Trainer() {}
-
64  virtual void alloc_impl() { }
-
65  virtual void update_rule(real scale, real gscale, const std::vector<Tensor*> & values) = 0;
-
66  virtual void update_params(real scale, real gscale, size_t idx) = 0;
-
67  virtual void update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) = 0;
-
68 
-
69  private:
-
70  friend class boost::serialization::access;
-
71  template<class Archive>
-
72  void serialize(Archive& ar, const unsigned int);
-
73 };
-
74 
-
75 struct SimpleSGDTrainer : public Trainer {
-
76  explicit SimpleSGDTrainer(Model* m, real e0 = 0.1) : Trainer(m, e0) {}
-
77  protected:
-
78  DYNET_TRAINER_DEFINE_DEV_IMPL()
-
79  private:
-
80  SimpleSGDTrainer() {}
-
81  friend class boost::serialization::access;
-
82  template<class Archive>
-
83  void serialize(Archive& ar, const unsigned int);
-
84 };
-
85 
-
86 struct MomentumSGDTrainer : public Trainer {
-
87  explicit MomentumSGDTrainer(Model* m, real e0 = 0.01, real mom = 0.9) :
-
88  Trainer(m, e0), momentum(mom) {}
-
89 
-
90  protected:
-
91  DYNET_TRAINER_DEFINE_DEV_IMPL()
-
92  virtual void alloc_impl() override;
-
93 
-
94  real momentum;
-
95 
-
96  // the following represent the current velocity
-
97  std::vector<ShadowParameters> vp;
-
98  std::vector<ShadowLookupParameters> vlp;
-
99  //std::unordered_map<ParameterStorage*, Tensor> vp;
-
100  //std::unordered_map<LookupParameterStorage*, std::unordered_map<unsigned, Tensor>> vl;
-
101  private:
-
102  MomentumSGDTrainer() {}
-
103  friend class boost::serialization::access;
-
104  template<class Archive>
-
105  void serialize(Archive& ar, const unsigned int);
-
106 };
-
107 
-
108 struct AdagradTrainer : public Trainer {
-
109  explicit AdagradTrainer(Model* m, real e0 = 0.1, real eps = 1e-20) :
-
110  Trainer(m, e0), epsilon(eps) {}
-
111  protected:
-
112  DYNET_TRAINER_DEFINE_DEV_IMPL()
-
113  virtual void alloc_impl() override;
-
114 
-
115  real epsilon;
-
116  std::vector<ShadowParameters> vp;
-
117  std::vector<ShadowLookupParameters> vlp;
-
118  private:
-
119  AdagradTrainer() {}
-
120  friend class boost::serialization::access;
-
121  template<class Archive>
-
122  void serialize(Archive& ar, const unsigned int);
-
123 };
-
124 
-
125 struct AdadeltaTrainer : public Trainer {
-
126  explicit AdadeltaTrainer(Model* m, real eps = 1e-6, real rho = 0.95) :
-
127  Trainer(m, 1.0), epsilon(eps), rho(rho) {}
-
128  protected:
-
129  DYNET_TRAINER_DEFINE_DEV_IMPL()
-
130  virtual void alloc_impl() override;
-
131 
-
132  real epsilon;
-
133  real rho;
-
134  std::vector<ShadowParameters> hg; // History of gradients
-
135  std::vector<ShadowLookupParameters> hlg;
-
136  std::vector<ShadowParameters> hd; // History of deltas
-
137  std::vector<ShadowLookupParameters> hld;
-
138  private:
-
139  AdadeltaTrainer() {}
-
140  friend class boost::serialization::access;
-
141  template<class Archive>
-
142  void serialize(Archive& ar, const unsigned int);
-
143 };
-
144 
-
145 struct RmsPropTrainer : public Trainer {
-
146  explicit RmsPropTrainer(Model* m, real e0 = 0.1, real eps = 1e-20, real rho = 0.95) :
-
147  Trainer(m, e0), epsilon(eps), rho(rho) {}
-
148  protected:
-
149  DYNET_TRAINER_DEFINE_DEV_IMPL()
-
150  virtual void alloc_impl() override;
-
151 
-
152  real epsilon;
-
153  real rho;
-
154  std::vector<real> hg; // History of gradients
-
155  std::vector<std::vector<real> > hlg;
-
156  private:
-
157  RmsPropTrainer() {}
-
158  friend class boost::serialization::access;
-
159  template<class Archive>
-
160  void serialize(Archive& ar, const unsigned int);
-
161 };
-
162 
-
163 struct AdamTrainer : public Trainer {
-
164  explicit AdamTrainer(Model* m, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8) :
-
165  Trainer(m, alpha), beta_1(beta_1), beta_2(beta_2), epsilon(eps) {}
-
166 
-
167  protected:
-
168  DYNET_TRAINER_DEFINE_DEV_IMPL()
-
169  virtual void alloc_impl() override;
-
170 
-
171  float beta_1;
-
172  float beta_2;
-
173  float epsilon;
-
174  std::vector<ShadowParameters> m; // History of gradients
-
175  std::vector<ShadowLookupParameters> lm;
-
176  std::vector<ShadowParameters> v; // History of deltas
-
177  std::vector<ShadowLookupParameters> lv;
-
178  private:
-
179  AdamTrainer() {}
-
180  friend class boost::serialization::access;
-
181  template<class Archive>
-
182  void serialize(Archive& ar, const unsigned int);
-
183 };
-
184 
-
185 } // namespace dynet
-
186 
-
187 BOOST_CLASS_EXPORT_KEY(dynet::SimpleSGDTrainer)
-
188 BOOST_CLASS_EXPORT_KEY(dynet::MomentumSGDTrainer)
-
189 BOOST_CLASS_EXPORT_KEY(dynet::AdagradTrainer)
-
190 BOOST_CLASS_EXPORT_KEY(dynet::AdadeltaTrainer)
-
191 BOOST_CLASS_EXPORT_KEY(dynet::RmsPropTrainer)
-
192 BOOST_CLASS_EXPORT_KEY(dynet::AdamTrainer)
-
193 
-
194 #endif
-
Definition: expr.h:8
-
Definition: training.h:145
-
Definition: training.h:20
-
Definition: training.h:75
-
Definition: training.h:86
-
Definition: training.h:125
-
Definition: training.h:108
-
Definition: training.h:163
-
- - - - diff --git a/doc/doxygen/latex/Makefile b/doc/doxygen/latex/Makefile deleted file mode 100644 index 8cc3866f4..000000000 --- a/doc/doxygen/latex/Makefile +++ /dev/null @@ -1,21 +0,0 @@ -all: refman.pdf - -pdf: refman.pdf - -refman.pdf: clean refman.tex - pdflatex refman - makeindex refman.idx - pdflatex refman - latex_count=8 ; \ - while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\ - do \ - echo "Rerunning latex...." ;\ - pdflatex refman ;\ - latex_count=`expr $$latex_count - 1` ;\ - done - makeindex refman.idx - pdflatex refman - - -clean: - rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf diff --git a/doc/doxygen/latex/annotated.tex b/doc/doxygen/latex/annotated.tex deleted file mode 100644 index 7ed909d21..000000000 --- a/doc/doxygen/latex/annotated.tex +++ /dev/null @@ -1,11 +0,0 @@ -\section{Class List} -Here are the classes, structs, unions and interfaces with brief descriptions\+:\begin{DoxyCompactList} -\item\contentsline{section}{\hyperlink{structdynet_1_1AdadeltaTrainer}{dynet\+::\+Adadelta\+Trainer} }{\pageref{structdynet_1_1AdadeltaTrainer}}{} -\item\contentsline{section}{\hyperlink{structdynet_1_1AdagradTrainer}{dynet\+::\+Adagrad\+Trainer} }{\pageref{structdynet_1_1AdagradTrainer}}{} -\item\contentsline{section}{\hyperlink{structdynet_1_1AdamTrainer}{dynet\+::\+Adam\+Trainer} }{\pageref{structdynet_1_1AdamTrainer}}{} -\item\contentsline{section}{\hyperlink{structdynet_1_1expr_1_1Expression}{dynet\+::expr\+::\+Expression} }{\pageref{structdynet_1_1expr_1_1Expression}}{} -\item\contentsline{section}{\hyperlink{structdynet_1_1MomentumSGDTrainer}{dynet\+::\+Momentum\+S\+G\+D\+Trainer} }{\pageref{structdynet_1_1MomentumSGDTrainer}}{} -\item\contentsline{section}{\hyperlink{structdynet_1_1RmsPropTrainer}{dynet\+::\+Rms\+Prop\+Trainer} }{\pageref{structdynet_1_1RmsPropTrainer}}{} -\item\contentsline{section}{\hyperlink{structdynet_1_1SimpleSGDTrainer}{dynet\+::\+Simple\+S\+G\+D\+Trainer} }{\pageref{structdynet_1_1SimpleSGDTrainer}}{} -\item\contentsline{section}{\hyperlink{structdynet_1_1Trainer}{dynet\+::\+Trainer} }{\pageref{structdynet_1_1Trainer}}{} -\end{DoxyCompactList} diff --git a/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f.tex b/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f.tex deleted file mode 100644 index fbdf0cf6f..000000000 --- a/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f.tex +++ /dev/null @@ -1,16 +0,0 @@ -\hypertarget{dir_2997b6d9ddf8b2f83e82c6988822a05f}{}\section{/home/paul/dev/dynet/dynet Directory Reference} -\label{dir_2997b6d9ddf8b2f83e82c6988822a05f}\index{/home/paul/dev/dynet/dynet Directory Reference@{/home/paul/dev/dynet/dynet Directory Reference}} -Directory dependency graph for dynet\+:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=134pt]{dir_2997b6d9ddf8b2f83e82c6988822a05f_dep} -\end{center} -\end{figure} -\subsection*{Files} -\begin{DoxyCompactItemize} -\item -file {\bfseries expr.\+h} -\item -file {\bfseries training.\+h} -\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 b/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 deleted file mode 100644 index 97ea7dc67..000000000 --- a/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.md5 +++ /dev/null @@ -1 +0,0 @@ -2ff0d418dc0fde0b1f848ddc09d9ddb0 \ No newline at end of file diff --git a/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.pdf b/doc/doxygen/latex/dir_2997b6d9ddf8b2f83e82c6988822a05f_dep.pdf deleted file mode 100644 index 5c4d92c8c36462d2cea321b1b367b1ed811c2647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10418 zcmc(lWmp_p)AzBU!Gqi21f9WMgG-Pg!QCx`yG!suaCdhI?gV#t*I*%7@CTCJy?5_@ zuJ?Mrz1=h2eg0E*>QtTTPxGUceyxC22mk<>#LO)1jlfTLOFes|H%10FhDM0|{D^k;U?V*%MCTMf*+E1 z(*?=3Zdg)6dznTy8<}g+{@CV7xn8R!FIa#wokLraFUV%_uERlX1z=8~CV~OO3_9kA zonp?puRFWQvoY2r`ZWtR^0UREAo&i?E@pGMO5j3~7V^DFk~P%zkeg2EqTDSRJ7zFV z0MB-eUe^t&%oL@FI#xdiTP{T;O|QgB4Jrc>wALQnOIX@=L?dg%KUVql^qk*wQqT9N zv_NcZ&%Zy9nE%TDSH7ao_TozRPq_kkd7p)+gGmqgGypJ(2mwFr(}ue)xT5 z60@gFnztleyQF@9B z*0Z*=eU4?|@~12bum?N*TE%m=B2QLtj2z7jj1YWR|9eWwXFZGfu6(s?lcep#0up6mC|p48NdNz=J=by0$^ih`$x+ixhlUSJeXl1 zHieh7ef}aGqb)5HnC^+;o8lwM*}_|s!Z;zIrRYNX20c9-W7ESl7@pXT@ZSpTwl3W| z_Lkyj7tN#`B-hRqU0*1%OqhMMm00A|@WD#agGV8jvqsP0p6VZ1mW6{++8%>lY=9;a z6oMenW_+~{|A30!UVs|dB$TR0_Ba$1;3pIeCy3(jEHN8U51qSw*9)NX@Q8>PCjIs)Ss;n;C=S@+I;{lou}u z4XuWY5{@^D~xLb5^1YIc;n68GbUt#0*0UKu-`vGyLkJ+*YnJc?yi1p6Nexs&On~Rhpd5G z6w>o*GQTMJmNY}i0AT*NzdjbQu9Fmj?r7ZG4 zM;VEGt|H~UHHp1$@cVu&&X%;d9oQA}kY~)S!42LGCgd$aEup5l*Pq_0c0GhY##=p( zrrc;qU)D|NVBbd~Vl5F7Jtj~NrfWm-C-fs1Al_L~i=*8MoC(Rvi=RAJZ3r+Uw|gBA zKc+@wK%I~Iu?~%#ru)Hyg_d7sXzLQl(sbhgK&^g|-0QGxw-u*(S+ai!dw<^qxwVGA zcAcKX2xEQ(0o~NV_wyPRnF+#b;%N~tWIIPcb*9`s6sd>`=^g-KwcVcmR6Aq8}ZNOO;D6z^%|!qc(ubA7v) za<2U-Fz&zjR>kNg;lTndH3{D{t5@d~Ou9P-ZM*1#J1VaBLrQvmCG31LQjsIj@XBW9 zyEp|gy~AP_?dl>S_wVN=)Wt?X+Zg+;KSTrOkAZ9Pag;JUG32o!q$iW4Y2if|oJ+eH zVQU;>rSdh0SdX@vmyEWXu_v+i816+o-Y>Wdb=ja@s1%H4zj@Z|iOQ>8Q4GhDgf@j< zSN8S*%1dFzdS37`%FI$7p4`>fv}!%XwYIz&t5t%Oz0}PolEnurm(5!TCsfq(Ht1*E zKWJ(tsKD3zZVoptX1nYp2oOH)G4lG2U{)5x!) zWlq`PtlRb6&&E=~_l~;*T1aIjJ1Hf-H`Xy%M+?HMDY2(q)%}`y<)COVF+ev=FVZ+U zYQV~Qv97z&O*j3f)BvG+rn8}oVbd)^JRfbM#oyrs88{x)YwKp&r(%8e11q-cRL)AQ ztmY1T*|$?=V`;IpVyeAz+;jHrxHK!)fZ0uWVKT3Bb%p7B#zg8yI#tMIf<}Mx+J>WnxJS`dbgFMWI z$|e^5Xp_xk+kgt0cH8!{mNa)@yyeJ~o&X+5-pVA1aUak1C`F8rQlCnm+wM|mG5iqs zl6<2Fi~7`$iaY|&F)307X7#UmEd6@=- zCWGZgd5Vde(Z?c&{~F*v^|(Bta%UEfN%wefJWgGXaDVVgsTn~Wt2K1I1#_y0X;F^p z1U<)`Fgj3>S-e0b>+Y@7at{(LRHEg#A1yKH+m|zd4+IegA#Ma-AC^Jmcg-_`RE%I_1 zY0$fN#+*scEZ8(z0mT;i7(~PM;ojx*odH9Z97ixQFq)851N=flib6N7+drm4krhkA z@vgXyWz@1Rg(cr&xNRQMNq7^I)2;O5x79T&G^nT3OiH>16eY$a<*l9E~KxI;gKsRO@eseYC+3$47U96DIqfGr0f3=^#)fs6xHgrkS^sW1K z{i}dWlHTmm%95%qR@?Z>SBToj8_+<%8YxvJ@q>I)1+H2)`?lzXnwFLE)$els0;1$3 zT6sNnqrq<@lB1TZ`^ih#n5i%ncH)%B-z;J3Pzc3Mjn~xHAP?mIEmrQG5=53`F zp7Rg?I*0kGCMn4)bVBN|@#3}Gov#GtfZDRA*L;jvHJXAj^i&&aXO4fQeQ~O_V-%Ez z?2-M-S(!rVP|$Q7&U@e~9zjZ41yG09tR?z120q)q56PBI5JQqamKk}rDTnxc;qE5* zc0@v{mQVY z{<4E991RrxIw1!qbao8p2S_=aPhNTWR^RD2`({!LBN5V~Jm0up{KRbcr+3&x+jPu7 zzGPrmfOj3~Rh;s@!IoSms1KTJz{MvEyV< zs7|p18ZZLe6n+*qWF6}=P-`NKFkNKz(VG)D^7qoCtEIXL=mIT1`AH>LK7^eg7;cvX zP;ZqsN8h&eZB(m$o<;Ic=6{tXpl$B8^d${QE2y8QZT%hgD7m@LYdz+g*+qrNfRyZK zX-V72=q}+&Km_WQsvn1vk`hE z@=`0#@n)Om7-EMKWc4>hDMqvW*nRrt1_nkd2YZ?KHTOj>w_nax0E`?I0v1127-rtJ zEWTlEWIk&?>V`=py>EW?%7~uhB%UhP;-S8VBsanc%1JTAc!4?ht+#F8K-?lTtPnj| zYl*mMROOUgqS6-Ap>*9UClnfG+NG^ukpUBu4-36KvwgB&gi_9EXod*J6FeG!>{sY- zh2pBrq(N?fH{H6vF24Fvgpsqkfs#6Wh6DccP#yom3qmaL;&dp&UxEAEJU9N}tGfCG z7lNxLZUoBI;niY3PjT=AcgeCEbPv(Tgh+H|E3R~4kjVZ zt27?(R9j6WFz}@oqJ!QNc1-tVI1TJZfL|awcpixz$jV)) zlK@~1RDWo^QTW2C~iBf?K1Ina7Jy#W;p&rKjz=m&ype4&|_l~9_eo_y?G|E-d z9w!VkJco$8f)T>)FBweD$8TD6CvP@iNj4!|y;HAxc)^vMHNzm$q!OXz7 zxNC5@Ecg&`A)e4a9XYdhOHVL&7QA<0)Pk*75F zy-E!M#W;3K#mG{e3uWMo>D{r)FWbT?$8Q_!FT>8Ze8RaY>hEp23Ya&}Y%uVq6V5M& z)IaFM$WMfS`ZBgpv9(W)8WhA3UHrYTqc02sFUK5LCWAx4Sd$)o|%0e7ZSTp(L)jJLD6|UKZI7lRu zJ>&Wo8$TylLY;I59u>Rk%!j@{6bh^a4?)y5L6UAo!}^-N3%FSs^1SemD06>rM>UpkWd%=qbh$L2125ksocBo_jujjNe(zU2e9@lOdfMqfvXds!Qai|FXtWiZ8Q zNu2o-J%4P-ZW@pz#|j_T$aGMP&8@#IZtt-QA>GKG5mQQNEjDujf&=}> zGtt)0$NGJ(MBWiu%w>(#u>sd+ z-jWj=e1@+xJG>2xJq0;Ye@QCfg3qv5VO@qBh~C*GUx_Otc$<(M1a+|$%dl_ydQ`QD z7C@h3b^U==M)0+p)x2b|4XMqsJpBF4CV1|yrV}q!;@%+>0YM&w_3=fmV*hHH#nm(% zLC{;W@6sO#MjWxsF>|1}{A;#RJwwp=J?6vbhPAhuIBxBUk}fZo!slwpafkWe-X4CL zc~9<>*>?P1X%KLbhC(du`~|M=(=t;4R$1eOFzPyF+x?>z{ytfNBlPeGC zu3cv=d_VeV;DNi_c~{?q42C|31hwTQL{?{19G~~2?E9jejVM6y4ey~W^tuAs1kb*O zMn_y@`uk1t6>*$J+h#v%&t2&E>^{7axH6fsn849ZNna)6OIUHji$11xr!|3V9y;&e zMMIoj95Ap~X*G|Y(m%~{8q2S-B3f$<%ifbFumvl&9zPz}F5mTW(_NQ=N=zOtLW44>`X#STiGWnCmDXts4 zoSvvO!QmlV3x4t7^8WgYCM4q~YgI$WvT4J%ZqiQ_Cowb_D&8RTF?l8$~cL`$| z5K*U8!-6{PH!fu47a0OH z0beCnXRi-$uq0cKTa2~NTNje0gd2N0mOjRRsPY!aoWJoe{K}jbJFN9?yr^N5D9e!o zH-72^`sPD=(X~sH`ruFAutsF0E&w5kYMMU#-x{*#mTL1mi=PB#YD$4FcLV~lUb0o;xn`L^#*o3 z(v`rscPC2>I}~KojvO^THf)!;vnZ!3lOaC(pwvnEnmfFL8Vg`RWtxm(y|qQ%Q#ew% zEA+->6LRVjS1Zh8dT|BbgiKn;Tgr8_#zq@avtQU_{5$K1DA5I^YA;N2_q;rNR(sAd zfFZS0dK?zl@WNGBKe}^GU_I8A?EX*kLxvxgAC9lbNENnw$`GIYNd7XsGVJM+7g9%U4Sgukes5oX?cQ;JBb!5 z7rSu}=OmWPEH#?(^B^6Inl47U%9@WHTsPbITV(E7A30 z9dx+WnWBnH2-6y6P+3gSv?O{oTbG*q%cP}lpVda(-m7Z+% zRYvL6eQJ5|gnCbC=>wMMsJVl)Eg)@!Q|OeM1(8}(2QFsveUZ{Q#YD~kcw&BYY~o7f zWJ=DBe{-+GJmj_bums~Emo3k?UF5u4vj?EQ5P8E*7Fb4%J18inn%JZCCYtJ8jVB0I zU29)QwhwoKin^^JrhP=HnvZp{{u^S|MbA2)h7X!#cC)}ad0AMVsv$qnuG4B(PK71*{EOdy!Q>jFk)A77(}1Pf8cMQ@pjvb!fMV$}`p1d=qI z@(jWee9<4u=19<1+q(IhR-G`*`K^ZV+80AjfgYK9LL99}jq$b?ai}iqlXTSzmtCRG zpl^sxx$4PEZS2R1ete43#hTBji(TmmiA{*&wBglm=bl`hVkeVSuJlc_1~RnvmRSDV zMX$;6G7qA0&py5>Ns8t-x^A)==22jSrlZH(6bw4Y`zRP~%G23fkwR8&C?Xd)yTKCM zfkMJlx!QW`$R40zDD0yJRwHwa1m^GBt3-)&j9Bs{%2sH;M^%;{^<<@gO^;A6b-)g^ z%kyNA#>H6f_54gcNj^teXg-<;$KV+hXK)}CrQ^}KzzT1xIsTzNb~H=lmH5!-B6p`0 z95|f)0!w{ivTg2s{gRo9)it`eR{kfOl8$-ddlBVH#s-Qfq1KlQjYWpko)hF+XFFW0ivw{l;aEH{A55<~hk2T)6efAbHX?d-zz;LwF z-0IUHzsj*meV%%NXai9@sDQ2^0I?jTIUz%-L+~wzkd=tD7{l-|eqn=ks4b3x#~F_^ zWN9Z47Yiij-!bY|JFngR^*eWsX64G}Sin(!hWXgGVfw<-%gAe(wz8#x`0nL=hfYQ7 z9P~&sE;YPR#5YTBTw}2R8XU^HY{@tc=d`C$$=)=&XDNX8=0z@I?B4rJ z&($-o@GTY^(hn~bE1Z-lK8w>D?`8^MuVFLxu$Gx(bR)8_U>GBrt+DL`N)>5_SF6h? z9%#0RJVB*ik6eDpEd5$Ey9E?1)Qk+Q0e&nu1|w7<-M#gnZhq*22tfn(uUdfLIBJN7 zG;sB1-x^@Tt*+F`D6G(WS}!n$YDl#V<8DYedSheok_f&9Ew>aeym%?Pz89l+Y{x%i zdOhL%IdxpY0ltlO0X7id;dI5uo-@J**{T=Y)h4%3<0o_4>DhtakXZStgC^Y1G|i8W z8;Id%AxEzfqspf(U%Hq(=tpjcASBv}5+>cl1Wv=fyPVj@MqJ&rGd;I&j8}r&m?6B- zu5&Pl(NkM{pka}`42|!4yA5^bL91jA<)S=Lp4iVej{+aSQ_ZCGsGlfzV;XpQ?5yTn zw(qf|afKMRDK3UNF2F40e=`BN)PBc^DII{fnab~e$uS&F9BkD*wPdDD);D(~JN_l& zw5eUks5p|8b<5B}`P??1WhvD=PRb~e`n2OalbIt&^28E6o1ha+cGLjHHjzu2am&0j zFQV>numjXrNe13~x>?=guUblkQNY{JEnz=;!&#d?zidmpBM-G+Q4INhyj~TD3lP=m zbJ(1GJKB#)g~UJVz3%Ce6WMj7!$3B>R#D_<=6}``dK;(d>plizf)`1RD|a6mV-8V8 zytQD6)G2nf=w8UdA$JkI=Jt?%Wg6U&k)f6S9`R$y0{LO|cu7gd4WTUl_2xlc4XUcx zt{Lgd01Z@A&Cu*lw~o)~lFjPfMy9I7L`eAhUj6s|(0APLrgn)Xyp)Zx@!7&T`MZvH zzRZ{5Bbll!7Y-(>Am>@;8EHhMrx+}HNwp~}7(RB~x_pKyXfv`+@<0k{!FrI>IAA<^ z=k+34v(hA=qTlCp_T1N3flY~+@+l=WB#S(BD^thqoKhX`dD zB!7Jk*YW#z3;e?;vj-@792?MY|ybScN~>Pk=1!6?1z(WwyR z0%t@KM0=|{^Oh!CwG6@{Ig@TGA1Bd@700);ncm?$aoC+F`^s^50qQpgfwlGb?G5E@!0-<=W}o|TmZFtrNRU!PC=bYpiO+Ddcr z&@=C2n~U_^Ff2O2(L^Uvh*p-hbGjpV*OgSIwz~p-#s<&SlWUiT zIWP209$LPLF$v4|1*dWkjG3j|c~+DNUK*NW>iqV=5|@fH$%I^pYC>DHL{zkEe+sMo zyQZLXEq9xh?&IF8f{;k6|XUXkZjlM%kkgGqIV`A#rT^ zZ`JEixNw&(RpmOQ*Ppf_C`Hn(X1}eSNi%TJQMw9} zBXH4Cm@wII59G$vhI038AK|L^mo43Ci5<@c!~;62{d9Z=)Zqs8B}MB9V?DkI;odDK z?}-^$EwSdy8SnakKf#UOR?HvVawb)_L{cV0n1>?paekOOWII2MBBKXKx@}sdL?1~_ zhGWVYa$rZ*rzgg28arZp*xqWImcI9I?hO?!=de|z3N;I=Iz8P)TDaDs!8_%qYnlzM zDu9jC7AE|-ssqt#I5#5|!g4cUQ zQr>=LsgJ1O5+)VKC*P+{7%$06pwL!>j6PtPKG9LmvFO|Fb?S?cY|Ka}!T)_!s=lT%Jmb|P@7vN>f8J)W&DwbKTWs*Oc@)2c_hv~d01Y`^;gEu_a*6OI>v?Pyr`q9-P z^_jHSQL1eFYPKpg6>w%hI8-NF823X}1ku}!QmML*pVeGI+A zMi~GpQl2GopJ(e~3V~7_q?odkKEOPKz4JD04XkX1Rc7YXpMpbqneE+^b{($@B5EV> z>agk(m9Ag?I9&YPOqsrEty2n$J_A?lb0ycJoR}c<8!EfB*||FB{JXTj3id~BnOWKY zEG_6675Njp_zinJlPGVD>)?}UHNujHU_|BI)2E(GY8B&=s=^b5`Te`an5wzC&8)dK@qn16Z6=>0JU zG5?nR5CYJp}p>f%OC*Jz-@}tqY(r&@%(u06>f&Rz_w3jj6r8EjQB>d-Wumfc0!m z%?#`qZNMh4U;m0D54JIMFnGe${_k%8VX{Df=ih$6MB!*Wc{y z!Fo^cF!&c$sAT49^jxcF?n}|e=4t=`gRMzg8$a#yUr3pqy&l;9S9L)^AR7pgl2Y`o H7~=l`ianHz diff --git a/doc/doxygen/latex/doxygen.sty b/doc/doxygen/latex/doxygen.sty deleted file mode 100644 index acd68e4be..000000000 --- a/doc/doxygen/latex/doxygen.sty +++ /dev/null @@ -1,480 +0,0 @@ -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{doxygen} - -% Packages used by this style file -\RequirePackage{alltt} -\RequirePackage{array} -\RequirePackage{calc} -\RequirePackage{float} -\RequirePackage{ifthen} -\RequirePackage{verbatim} -\RequirePackage[table]{xcolor} -\RequirePackage{xtab} - -%---------- Internal commands used in this style file ---------------- - -\newcommand{\ensurespace}[1]{% - \begingroup% - \setlength{\dimen@}{#1}% - \vskip\z@\@plus\dimen@% - \penalty -100\vskip\z@\@plus -\dimen@% - \vskip\dimen@% - \penalty 9999% - \vskip -\dimen@% - \vskip\z@skip% hide the previous |\vskip| from |\addvspace| - \endgroup% -} - -\newcommand{\DoxyLabelFont}{} -\newcommand{\entrylabel}[1]{% - {% - \parbox[b]{\labelwidth-4pt}{% - \makebox[0pt][l]{\DoxyLabelFont#1}% - \vspace{1.5\baselineskip}% - }% - }% -} - -\newenvironment{DoxyDesc}[1]{% - \ensurespace{4\baselineskip}% - \begin{list}{}{% - \settowidth{\labelwidth}{20pt}% - \setlength{\parsep}{0pt}% - \setlength{\itemsep}{0pt}% - \setlength{\leftmargin}{\labelwidth+\labelsep}% - \renewcommand{\makelabel}{\entrylabel}% - }% - \item[#1]% -}{% - \end{list}% -} - -\newsavebox{\xrefbox} -\newlength{\xreflength} -\newcommand{\xreflabel}[1]{% - \sbox{\xrefbox}{#1}% - \setlength{\xreflength}{\wd\xrefbox}% - \ifthenelse{\xreflength>\labelwidth}{% - \begin{minipage}{\textwidth}% - \setlength{\parindent}{0pt}% - \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}% - \end{minipage}% - }{% - \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}% - }% -} - -%---------- Commands used by doxygen LaTeX output generator ---------- - -% Used by
 ... 
-\newenvironment{DoxyPre}{% - \small% - \begin{alltt}% -}{% - \end{alltt}% - \normalsize% -} - -% Used by @code ... @endcode -\newenvironment{DoxyCode}{% - \par% - \scriptsize% - \begin{alltt}% -}{% - \end{alltt}% - \normalsize% -} - -% Used by @example, @include, @includelineno and @dontinclude -\newenvironment{DoxyCodeInclude}{% - \DoxyCode% -}{% - \endDoxyCode% -} - -% Used by @verbatim ... @endverbatim -\newenvironment{DoxyVerb}{% - \footnotesize% - \verbatim% -}{% - \endverbatim% - \normalsize% -} - -% Used by @verbinclude -\newenvironment{DoxyVerbInclude}{% - \DoxyVerb% -}{% - \endDoxyVerb% -} - -% Used by numbered lists (using '-#' or
    ...
) -\newenvironment{DoxyEnumerate}{% - \enumerate% -}{% - \endenumerate% -} - -% Used by bullet lists (using '-', @li, @arg, or
    ...
) -\newenvironment{DoxyItemize}{% - \itemize% -}{% - \enditemize% -} - -% Used by description lists (using
...
) -\newenvironment{DoxyDescription}{% - \description% -}{% - \enddescription% -} - -% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc -% (only if caption is specified) -\newenvironment{DoxyImage}{% - \begin{figure}[H]% - \begin{center}% -}{% - \end{center}% - \end{figure}% -} - -% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc -% (only if no caption is specified) -\newenvironment{DoxyImageNoCaption}{% - \begin{center}% -}{% - \end{center}% -} - -% Used by @attention -\newenvironment{DoxyAttention}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @author and @authors -\newenvironment{DoxyAuthor}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @date -\newenvironment{DoxyDate}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @invariant -\newenvironment{DoxyInvariant}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @note -\newenvironment{DoxyNote}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @post -\newenvironment{DoxyPostcond}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @pre -\newenvironment{DoxyPrecond}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @copyright -\newenvironment{DoxyCopyright}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @remark -\newenvironment{DoxyRemark}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @return and @returns -\newenvironment{DoxyReturn}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @since -\newenvironment{DoxySince}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @see -\newenvironment{DoxySeeAlso}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @version -\newenvironment{DoxyVersion}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @warning -\newenvironment{DoxyWarning}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @internal -\newenvironment{DoxyInternal}[1]{% - \paragraph*{#1}% -}{% -} - -% Used by @par and @paragraph -\newenvironment{DoxyParagraph}[1]{% - \begin{list}{}{% - \settowidth{\labelwidth}{40pt}% - \setlength{\leftmargin}{\labelwidth}% - \setlength{\parsep}{0pt}% - \setlength{\itemsep}{-4pt}% - \renewcommand{\makelabel}{\entrylabel}% - }% - \item[#1]% -}{% - \end{list}% -} - -% Used by parameter lists -\newenvironment{DoxyParams}[2][]{% - \par% - \tabletail{\hline}% - \tablelasttail{\hline}% - \tablefirsthead{}% - \tablehead{}% - \ifthenelse{\equal{#1}{}}% - {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}% - \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% - p{0.805\textwidth}|}}% - {\ifthenelse{\equal{#1}{1}}% - {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}% - \begin{xtabular}{|>{\centering}p{0.10\textwidth}|% - >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% - p{0.678\textwidth}|}}% - {\tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]}% - \begin{xtabular}{|>{\centering}p{0.10\textwidth}|% - >{\centering\hspace{0pt}}p{0.15\textwidth}|% - >{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% - p{0.501\textwidth}|}}% - }\hline% -}{% - \end{xtabular}% - \tablefirsthead{}% - \vspace{6pt}% -} - -% Used for fields of simple structs -\newenvironment{DoxyFields}[1]{% - \par% - \tabletail{\hline}% - \tablelasttail{\hline}% - \tablehead{}% - \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}% - \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.15\textwidth}|% - p{0.15\textwidth}|% - p{0.63\textwidth}|}% - \hline% -}{% - \end{xtabular}% - \tablefirsthead{}% - \vspace{6pt}% -} - -% Used for parameters within a detailed function description -\newenvironment{DoxyParamCaption}{% - \renewcommand{\item}[2][]{##1 {\em ##2}}% -}{% -} - -% Used by return value lists -\newenvironment{DoxyRetVals}[1]{% - \par% - \tabletail{\hline}% - \tablelasttail{\hline}% - \tablehead{}% - \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}% - \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|% - p{0.705\textwidth}|}% - \hline% -}{% - \end{xtabular}% - \tablefirsthead{}% - \vspace{6pt}% -} - -% Used by exception lists -\newenvironment{DoxyExceptions}[1]{% - \par% - \tabletail{\hline}% - \tablelasttail{\hline}% - \tablehead{}% - \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}% - \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|% - p{0.705\textwidth}|}% - \hline% -}{% - \end{xtabular}% - \tablefirsthead{}% - \vspace{6pt}% -} - -% Used by template parameter lists -\newenvironment{DoxyTemplParams}[1]{% - \par% - \tabletail{\hline}% - \tablelasttail{\hline}% - \tablehead{}% - \tablefirsthead{\multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]}% - \begin{xtabular}{|>{\raggedleft\hspace{0pt}}p{0.25\textwidth}|% - p{0.705\textwidth}|}% - \hline% -}{% - \end{xtabular}% - \tablefirsthead{}% - \vspace{6pt}% -} - -% Used for member lists -\newenvironment{DoxyCompactItemize}{% - \begin{itemize}% - \setlength{\itemsep}{-3pt}% - \setlength{\parsep}{0pt}% - \setlength{\topsep}{0pt}% - \setlength{\partopsep}{0pt}% -}{% - \end{itemize}% -} - -% Used for member descriptions -\newenvironment{DoxyCompactList}{% - \begin{list}{}{% - \setlength{\leftmargin}{0.5cm}% - \setlength{\itemsep}{0pt}% - \setlength{\parsep}{0pt}% - \setlength{\topsep}{0pt}% - \renewcommand{\makelabel}{\hfill}% - }% -}{% - \end{list}% -} - -% Used for reference lists (@bug, @deprecated, @todo, etc.) -\newenvironment{DoxyRefList}{% - \begin{list}{}{% - \setlength{\labelwidth}{10pt}% - \setlength{\leftmargin}{\labelwidth}% - \addtolength{\leftmargin}{\labelsep}% - \renewcommand{\makelabel}{\xreflabel}% - }% -}{% - \end{list}% -} - -% Used by @bug, @deprecated, @todo, etc. -\newenvironment{DoxyRefDesc}[1]{% - \begin{list}{}{% - \renewcommand\makelabel[1]{\textbf{##1}}% - \settowidth\labelwidth{\makelabel{#1}}% - \setlength\leftmargin{\labelwidth+\labelsep}% - }% -}{% - \end{list}% -} - -% Used by parameter lists and simple sections -\newenvironment{Desc} -{\begin{list}{}{% - \settowidth{\labelwidth}{40pt}% - \setlength{\leftmargin}{\labelwidth}% - \setlength{\parsep}{0pt}% - \setlength{\itemsep}{-4pt}% - \renewcommand{\makelabel}{\entrylabel}% - } -}{% - \end{list}% -} - -% Used by tables -\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}% -\newlength{\tmplength}% -\newenvironment{TabularC}[1]% -{% -\setlength{\tmplength}% - {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}% - \par\begin{xtabular*}{\linewidth}% - {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}% -}% -{\end{xtabular*}\par}% - -% Used by nested tables -\newenvironment{TabularNC}[1]% -{% -\setlength{\tmplength}% - {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}% - \par\begin{tabular*}{\linewidth}% - {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}% -}% -{\end{tabular*}\par}% - -% Used for member group headers -\newenvironment{Indent}{% - \begin{list}{}{% - \setlength{\leftmargin}{0.5cm}% - }% - \item[]\ignorespaces% -}{% - \unskip% - \end{list}% -} - -% Used when hyperlinks are turned off -\newcommand{\doxyref}[3]{% - \textbf{#1} (\textnormal{#2}\,\pageref{#3})% -} - -% Used by @addindex -\newcommand{\lcurly}{\{} -\newcommand{\rcurly}{\}} - -% Used for syntax highlighting -\definecolor{comment}{rgb}{0.5,0.0,0.0} -\definecolor{keyword}{rgb}{0.0,0.5,0.0} -\definecolor{keywordtype}{rgb}{0.38,0.25,0.125} -\definecolor{keywordflow}{rgb}{0.88,0.5,0.0} -\definecolor{preprocessor}{rgb}{0.5,0.38,0.125} -\definecolor{stringliteral}{rgb}{0.0,0.125,0.25} -\definecolor{charliteral}{rgb}{0.0,0.5,0.5} -\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0} -\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43} -\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0} -\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0} diff --git a/doc/doxygen/latex/hierarchy.tex b/doc/doxygen/latex/hierarchy.tex deleted file mode 100644 index 4962f4d4a..000000000 --- a/doc/doxygen/latex/hierarchy.tex +++ /dev/null @@ -1,13 +0,0 @@ -\section{Class Hierarchy} -This inheritance list is sorted roughly, but not completely, alphabetically\+:\begin{DoxyCompactList} -\item \contentsline{section}{dynet\+:\+:expr\+:\+:Expression}{\pageref{structdynet_1_1expr_1_1Expression}}{} -\item \contentsline{section}{dynet\+:\+:Trainer}{\pageref{structdynet_1_1Trainer}}{} -\begin{DoxyCompactList} -\item \contentsline{section}{dynet\+:\+:Adadelta\+Trainer}{\pageref{structdynet_1_1AdadeltaTrainer}}{} -\item \contentsline{section}{dynet\+:\+:Adagrad\+Trainer}{\pageref{structdynet_1_1AdagradTrainer}}{} -\item \contentsline{section}{dynet\+:\+:Adam\+Trainer}{\pageref{structdynet_1_1AdamTrainer}}{} -\item \contentsline{section}{dynet\+:\+:Momentum\+S\+G\+D\+Trainer}{\pageref{structdynet_1_1MomentumSGDTrainer}}{} -\item \contentsline{section}{dynet\+:\+:Rms\+Prop\+Trainer}{\pageref{structdynet_1_1RmsPropTrainer}}{} -\item \contentsline{section}{dynet\+:\+:Simple\+S\+G\+D\+Trainer}{\pageref{structdynet_1_1SimpleSGDTrainer}}{} -\end{DoxyCompactList} -\end{DoxyCompactList} diff --git a/doc/doxygen/latex/refman.tex b/doc/doxygen/latex/refman.tex deleted file mode 100644 index 643cf53b8..000000000 --- a/doc/doxygen/latex/refman.tex +++ /dev/null @@ -1,164 +0,0 @@ -\documentclass[twoside]{book} - -% Packages required by doxygen -\usepackage{fixltx2e} -\usepackage{calc} -\usepackage{doxygen} -\usepackage[export]{adjustbox} % also loads graphicx -\usepackage{graphicx} -\usepackage[utf8]{inputenc} -\usepackage{makeidx} -\usepackage{multicol} -\usepackage{multirow} -\PassOptionsToPackage{warn}{textcomp} -\usepackage{textcomp} -\usepackage[nointegrals]{wasysym} -\usepackage[table]{xcolor} - -% Font selection -\usepackage[T1]{fontenc} -\usepackage[scaled=.90]{helvet} -\usepackage{courier} -\usepackage{amssymb} -\usepackage{sectsty} -\renewcommand{\familydefault}{\sfdefault} -\allsectionsfont{% - \fontseries{bc}\selectfont% - \color{darkgray}% -} -\renewcommand{\DoxyLabelFont}{% - \fontseries{bc}\selectfont% - \color{darkgray}% -} -\newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}} - -% Page & text layout -\usepackage{geometry} -\geometry{% - a4paper,% - top=2.5cm,% - bottom=2.5cm,% - left=2.5cm,% - right=2.5cm% -} -\tolerance=750 -\hfuzz=15pt -\hbadness=750 -\setlength{\emergencystretch}{15pt} -\setlength{\parindent}{0cm} -\setlength{\parskip}{0.2cm} -\makeatletter -\renewcommand{\paragraph}{% - \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{% - \normalfont\normalsize\bfseries\SS@parafont% - }% -} -\renewcommand{\subparagraph}{% - \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{% - \normalfont\normalsize\bfseries\SS@subparafont% - }% -} -\makeatother - -% Headers & footers -\usepackage{fancyhdr} -\pagestyle{fancyplain} -\fancyhead[LE]{\fancyplain{}{\bfseries\thepage}} -\fancyhead[CE]{\fancyplain{}{}} -\fancyhead[RE]{\fancyplain{}{\bfseries\leftmark}} -\fancyhead[LO]{\fancyplain{}{\bfseries\rightmark}} -\fancyhead[CO]{\fancyplain{}{}} -\fancyhead[RO]{\fancyplain{}{\bfseries\thepage}} -\fancyfoot[LE]{\fancyplain{}{}} -\fancyfoot[CE]{\fancyplain{}{}} -\fancyfoot[RE]{\fancyplain{}{\bfseries\scriptsize Generated on Fri Oct 14 2016 13\+:15\+:22 for Dynet by Doxygen }} -\fancyfoot[LO]{\fancyplain{}{\bfseries\scriptsize Generated on Fri Oct 14 2016 13\+:15\+:22 for Dynet by Doxygen }} -\fancyfoot[CO]{\fancyplain{}{}} -\fancyfoot[RO]{\fancyplain{}{}} -\renewcommand{\footrulewidth}{0.4pt} -\renewcommand{\chaptermark}[1]{% - \markboth{#1}{}% -} -\renewcommand{\sectionmark}[1]{% - \markright{\thesection\ #1}% -} - -% Indices & bibliography -\usepackage{natbib} -\usepackage[titles]{tocloft} -\setcounter{tocdepth}{3} -\setcounter{secnumdepth}{5} -\makeindex - -% Hyperlinks (required, but should be loaded last) -\usepackage{ifpdf} -\ifpdf - \usepackage[pdftex,pagebackref=true]{hyperref} -\else - \usepackage[ps2pdf,pagebackref=true]{hyperref} -\fi -\hypersetup{% - colorlinks=true,% - linkcolor=blue,% - citecolor=blue,% - unicode% -} - -% Custom commands -\newcommand{\clearemptydoublepage}{% - \newpage{\pagestyle{empty}\cleardoublepage}% -} - - -%===== C O N T E N T S ===== - -\begin{document} - -% Titlepage & ToC -\hypersetup{pageanchor=false, - bookmarks=true, - bookmarksnumbered=true, - pdfencoding=unicode - } -\pagenumbering{roman} -\begin{titlepage} -\vspace*{7cm} -\begin{center}% -{\Large Dynet }\\ -\vspace*{1cm} -{\large Generated by Doxygen 1.8.9.1}\\ -\vspace*{0.5cm} -{\small Fri Oct 14 2016 13:15:22}\\ -\end{center} -\end{titlepage} -\clearemptydoublepage -\tableofcontents -\clearemptydoublepage -\pagenumbering{arabic} -\hypersetup{pageanchor=true} - -%--- Begin generated contents --- -\chapter{Hierarchical Index} -\input{hierarchy} -\chapter{Class Index} -\input{annotated} -\chapter{Class Documentation} -\input{structdynet_1_1AdadeltaTrainer} -\input{structdynet_1_1AdagradTrainer} -\input{structdynet_1_1AdamTrainer} -\input{structdynet_1_1expr_1_1Expression} -\input{structdynet_1_1MomentumSGDTrainer} -\input{structdynet_1_1RmsPropTrainer} -\input{structdynet_1_1SimpleSGDTrainer} -\input{structdynet_1_1Trainer} -%--- End generated contents --- - -% Index -\backmatter -\newpage -\phantomsection -\clearemptydoublepage -\addcontentsline{toc}{chapter}{Index} -\printindex - -\end{document} diff --git a/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer.tex b/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer.tex deleted file mode 100644 index 3c2b04349..000000000 --- a/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer.tex +++ /dev/null @@ -1,65 +0,0 @@ -\hypertarget{structdynet_1_1AdadeltaTrainer}{}\section{dynet\+:\+:Adadelta\+Trainer Struct Reference} -\label{structdynet_1_1AdadeltaTrainer}\index{dynet\+::\+Adadelta\+Trainer@{dynet\+::\+Adadelta\+Trainer}} - - -Inheritance diagram for dynet\+:\+:Adadelta\+Trainer\+:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=195pt]{structdynet_1_1AdadeltaTrainer__inherit__graph} -\end{center} -\end{figure} - - -Collaboration diagram for dynet\+:\+:Adadelta\+Trainer\+:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=195pt]{structdynet_1_1AdadeltaTrainer__coll__graph} -\end{center} -\end{figure} -\subsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1AdadeltaTrainer_aaed979b129d3a4642321b8d414efea0c}{}{\bfseries Adadelta\+Trainer} (Model $\ast$m, real eps=1e-\/6, real rho=0.\+95)\label{structdynet_1_1AdadeltaTrainer_aaed979b129d3a4642321b8d414efea0c} - -\end{DoxyCompactItemize} -\subsection*{Protected Member Functions} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1AdadeltaTrainer_a98d5d3abe044d455df1a0fb3c35fbf44}{}virtual void {\bfseries alloc\+\_\+impl} () override\label{structdynet_1_1AdadeltaTrainer_a98d5d3abe044d455df1a0fb3c35fbf44} - -\end{DoxyCompactItemize} -\subsection*{Protected Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1AdadeltaTrainer_a65675903e5b9d77c7adde456d85d7b8c}{}real {\bfseries epsilon}\label{structdynet_1_1AdadeltaTrainer_a65675903e5b9d77c7adde456d85d7b8c} - -\item -\hypertarget{structdynet_1_1AdadeltaTrainer_a41208d6c68aa6478a661aac929b335e6}{}real {\bfseries rho}\label{structdynet_1_1AdadeltaTrainer_a41208d6c68aa6478a661aac929b335e6} - -\item -\hypertarget{structdynet_1_1AdadeltaTrainer_a51fb513277530881e6cbe16222adfff8}{}std\+::vector$<$ Shadow\+Parameters $>$ {\bfseries hg}\label{structdynet_1_1AdadeltaTrainer_a51fb513277530881e6cbe16222adfff8} - -\item -\hypertarget{structdynet_1_1AdadeltaTrainer_a3150eb1db93079ca53e470265c0a81df}{}std\+::vector$<$ Shadow\+Lookup\+Parameters $>$ {\bfseries hlg}\label{structdynet_1_1AdadeltaTrainer_a3150eb1db93079ca53e470265c0a81df} - -\item -\hypertarget{structdynet_1_1AdadeltaTrainer_a835052dcc3f77e01016afb8de0a9c4b0}{}std\+::vector$<$ Shadow\+Parameters $>$ {\bfseries hd}\label{structdynet_1_1AdadeltaTrainer_a835052dcc3f77e01016afb8de0a9c4b0} - -\item -\hypertarget{structdynet_1_1AdadeltaTrainer_a1dbae7cb54caba3e863f5a7c97934fe6}{}std\+::vector$<$ Shadow\+Lookup\+Parameters $>$ {\bfseries hld}\label{structdynet_1_1AdadeltaTrainer_a1dbae7cb54caba3e863f5a7c97934fe6} - -\end{DoxyCompactItemize} -\subsection*{Friends} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1AdadeltaTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c}{}class {\bfseries boost\+::serialization\+::access}\label{structdynet_1_1AdadeltaTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c} - -\end{DoxyCompactItemize} -\subsection*{Additional Inherited Members} - - -The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} -\item -/home/paul/dev/dynet/dynet/training.\+h\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__coll__graph.md5 b/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__coll__graph.md5 deleted file mode 100644 index 85322028c..000000000 --- a/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -4e3894942c8095aa3e726826de10d42f \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__coll__graph.pdf b/doc/doxygen/latex/structdynet_1_1AdadeltaTrainer__coll__graph.pdf deleted file mode 100644 index 8283b9b2921a0d764ccc0927cc3db126f640effb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11677 zcmb8V1yEeu68DP+_W&V47=k;46Wrb1b#Na%xCMf{1$TlZxCM8&;O-8=od?M|_nv$2 zSMPmqZ)*0e|L)bRS9h#x_-%1kdcBGK>o3~UZM?_Kgm2QJ(sttr7m5e4t`paF3^LgRty>ZaT(fg2j6^S75|zhwC3`J7`WPPUi#FC(UZmEw2u zMO+=llpLQE58&p05uPsw1IFh8fI&zA00b}?89aYJm*e@xpHBu+TN}rJSewu>(lG*9 z|1RgV(evM5i?RJ{F#vD#0UU# zvI2mtYyh3#)#^U}a(bkN!V&S5YR=nx;c1@M~nV@$J^}d*yPK zZ=PwN(hUWJfZ9gr*9eDZBLL;QLN5RvkO?UmB{h800&YI@e)6opI*ia_6;&BxolgH) zt^!tTVZlnvM=hwT4#gI3>%trE>*%6Gl>hWW!>w-L=ZgwwHF3>5pPozrIaVzF>m&FZ zG@MuoA}H{u29D528abR-kZnZJ4uET;hO#s`{<#huh!xnAlh9LyU_^Lm*ZTUv$M_v6 zEZCV=?GnahV;yZzeR(aeI?9!DF^I3}HIVplJ(Vpa-0$DNhoH&u210NKb4^a+wcexo z_7qZdj&=P+SVP8z?&S?4B+SzHDb0!en#KiTY>o2$u`~k%P0AHNa2eg(;ga}0fdyy$G_{LA6;A@Uo_5=ebmzch!sY(;FjYStS8|lZf*!m$~UOr{AL8xfKRI4 z$U;_+ofZHNj|ux*~C24^>)t+X$2b{#z&tq3XS|K2gMB*2BMkUr{@s**P{^} zgpc+x{Yeiogc@2M-->;?;iK1K>HlSmp9OlIj-N} zkT1QJ_?w9J2Q$heF~*w@71I*)yGKGF6b1Cne{xeq2-knjJ}~%V zYTr$2ra`F3JXeuxHtF#(a@EP$q0e>ZqYRtAKq044NIR;3XvEK5g6wz1NHa3A^I#Vl z$Q`}!She9#{E1SzsVkv~m9wUuH09z+bfjXGxMKIBaNcZ1Y%3>Gk$e%;nAHMf&g$+* zbw^4Y!!&%9o20#&TRxBTklU$Rp(Ui^DKOuyJraBe25Y7IM%xR> zg-%o>1bv*Fu4z#<8FPt8XtAa%LUbvJ-zz zK`;Hie>s^As$*wCzpK=JFyGOFno3eIHm;BExFb-clf9yLEZP~qL2{ABS*|Vi!s~m7 z-DxU}9EZlHkA;H)B;%oGOBsAZb!vCHn!5@#zT?DZzb|u_op9v{_lWKATg~-xo(j2# zg&#pn`m5uI={ID9m11vJ1u(f?k;Kn8f%hL+El6DKE>ikeja!JB^)$UAZA1(h?5Qjn zXjvJ{ZlyI(wlSSoVig{3OREVU@9;eua0t6FF<4kdW>%()IwqXPh6(H+GlNIm!6DSu zPFUq-jT*i2Vej`MY8TX~P{;S^+j;ksLp8${5Z@PFso}~m#eP%KIU(&89h<694ri;EpNhkM=dGcP#XST1=JAxZHls;=u-PRl&_sWylEPlh2GD$xXEbSUzi$@*rEzP9KGXvXFTDkktIZgM+ zpJmUM>V*lS1EkkEE4VI231z0u%a!cnBdSqR*OVNGh}~3PHx=a3Q)Bh4O%{gSRO8X( zL`~G{h5K18gp6D*wZ{)001jWLy-|cE9^?@blozZ(0g@3e*(-PUBkT)0g=FD6zzBoBHCI9I@SDk|}`mH66T53F|v8BQL5F(vP zUEfxuKFBV4YA3FWP{+;uInP1T`54*x`Rx++`nojaltm}6OxZX;AqA^tUcv|H4r&TX zXj4L=tes8BcjWF-sy8Nk#uH6C%DNp~4SEu3b4#|nwr<-Scu{>6(?!1ynAc<1O^ne> zk>KBkg&~N<*Mn48R?&nLC7dnydgnCfUSWehw3VoCJ4Y7YWauWgmUiSD9w3BpNe}Uf znUh^E-r$sa`4wQA*c{ok5Qyh!giz){?(o56DYbXs{Ty~~lz=46ulc~*q@|2MV1N=& zhBN5V{mQhUgjP*bvmA6!)#2(^HWE{rvhks7qGqu_nMl*Yf_%s#Gs_!;+ZsRv3U z8=GV2#ExUTAO4=#{~->FUr1gOfjqDIHc6CZh6InaN`Rtze=JI!aA;t^jgv6{?fn_? zc}k(>BuE@7mfXK;J&wm~g=;=&rGj3HfFz6S0uOI_gH<6$JEyW(d0A#Jln3rtV`ldq zyro348l2x7Y1hr3(^{}!Cp-SWiA?mlE4x+h}(UZiuy9*2}d@t-p^JJbfh`z#vr`7fsZ~U_U zq(CxG3l}B95>u3sG^6yy7|*3mr#2~1Q+_7Yw;(}wc(doQe%XAE;He_S?1wMl8q_W~ zgyIDE?TdICvt&KHh;!fFSSryD2r5;ImE=_@j+>krb8SYn?4ars;%OBh^JD9Z3{FNz zagz?|xTap%sblHB`L=U=F2r{?_dJ1Dr>1ThYF(rQ*r!%C-R%M2xMtNp@C9;M2FNvg z&m&)EFYae7pumI!9jLe|a(B~LdSViltMJu~1ut3%BYvS3&3>>i6QdqDDH`n_BMqKO z^n?CHsBK(37i#>y<~w7>zTy-o>#eZGqOO$UtJGc*HPfdZZdPBA zBvQP8cGzaZ!$kUaDjyw@sD*J_Te7Dtvu!dHDLpj{tjm&h3XHM4}o}XBxGrUtjsqHqm`L;(<|=y)w@k z73bRvn)SibNqzio?Lx5O*|0{qU8s^y3Mqi`{T=PtD~4h`_0hf zT!-1*Av&O&B`fwWE3Qj_&TeTk-t^AO(=FZCD}5 z@j-FN+e$yMrX!&f^%afvnAlRF;3J|>Tn{Z>N&ImAML29t?V^|pyv02byA@xt!a9p9 zPy_ew-;6IYIn?g&-Uo^kz}tq1Nsn02bf$!_?_V_Abb?O3`m8r5B- z*!te@hgc@xD$i_*qW8JRk1*?7Iw?AT;Goq*&u2MnCBfTZZp$p8u;r383(n8~! z=N-E@xBZk5ZS9CWRuKkX$G!}r9+t!XKc_D4yrz=06@(?St*1rJD5x-UC@c8capTqx zF?Vu}V4R#rh9VU=;sc1_hcyoX#N-*ra5xF+IliCIUbFNsm=n@g7(M{{hF1ct6NV2g z?U4(43s7fX!Smg*?eDQM4k<96pe!@BQrfj?6@Df!Tr|h3#^ocWOj>T!s1po9y~)$cTIUO@jbM zQW!OaswOOHmCkEw+Aq8q9zpQbR;S*Cd+_hT6HTjo))Q_;7I=%eSRV+-?0pMBu1rk+ z<^a_`$=3l*_0pJjen7gRNOWe6BKH&SEHUe&D1n~g{*Q44us>;#i^_yeK6I47PfHWx z-e@2>{7PxgpGcyN#LwccvJ2EQ3lmghM36tbY+#BIrO;^K10LWtwt6$f2y@N>Ie+x} z-tqLHN6+prR#a0dpwxjfz3+4!Nk1rx>{b>4>1>vNVymWZhrExEY?9cL&^4~&zNlWJ z?3NtBAqBQ07Ff)8Nvhr=m$3M}aiIX5&hea+X1aX#AK*Khq5N^d8 zON5TPpH@Sw*!r2-{DCLyyFlwM-Y>V0yD}&aXb};Vph6sH#nFN(D4X>CbcgKCZ8Fg= z8J3OOUttV|-9L$Q;wb}f53H=-WAN7G%u8_R1l{?;4y|HhinY9L%8L(1)Lder--N?q zHOz->nSIzW|DM@V_rrw1Ka_yK%V-qXn7_b-U1(ZvElx4uMqX$EIlOwXFPD=B8|P3v zl@@TLikQ%hl(XQb8=jn@QlE)l+(N}h{E9OF{WsnsRd>+5%Spr1T$b8vXEKAKpLv4T ze)6Pni8b8Y1@NmAiHjkNgvyVOcj0AP6HDohu%XTb7e5#}q7IkXv`7Kx)6iNLfr~YX z{@ZWMhQ@S^34bLO=BDfyoJH)_eh%03nDCnUnbtCKCWfBDg;4G)7iIhIyU_k1JGZtT z!jBM?4}Iq|{1QeSI?SJ;JiaZWSaeG$Bx|)^0#JKWNFqEL@SJqk^9Rhu5-Mg}-yr;K zZQW%Y6C)NyHEQ-c<*hE2C-3ca_2f4*C$Lv73ZU3-gXmD`VK{4*+Z)QhLS`nZtylz- z3^>UB^aFya>6a1=i7!95*C>_KwUZIv{>XulOc~>G3_dio3D~-zAR`20*7;9#U=by- zMklC!GGPCjOcaE5c+2-~F{;@||LJ~hr%!vrRNOstRIAVThH1VwipwLJ8@xzT&rquE z>eM{f`ZoJz+lW@kWzZ-(X zd+B@;Ztbx~$Gi7u_9Z5t$Xc)@f5iyTsxWTCv?P5c1R2KF-M{HT*E;1+(in-Mo%+$+ z(xn)OYX? zNLladE~Gygk646FkvZ?@MiGy~RndgGNsWsZE3S+61n|h#o(dm@6|+KFI$NG5hD$iF zl-dG=f)+Y|a$OCZ#53&d$hfBGa{ra9NNXyFRO#B}_397lNnI&rHgRs{>AV=y(ONdd zMO7?k6sdOisjMBbucB#G+wMXQA4pJ;p@2`~J1t z-3RJx?(ka_-ATfj@hpjAts^9Aa-kR5r~+DIbwCJvOm{lqoP$2XM3~}8Yw!5Vn@ zHp--NXmpW?>G;@vVH7eQdif3fRQiN@K(w-NSaMdHBu8}R4{0zDSWqAUcLH+qvd~jn z$Vtz0g+3s`D~WoS?#v68ijfTILZzd!GqPlSX{V!c1{3MHpF*ey3PteptYxf%IN$eS zPcD);_Bi;19aDe7*tg4GFj-xqkXRSs6Yy(7_-V}%d@k;^Ci8JvNFxZLtU|#AExkz# zu~V(#NrCR8Y1xu!l>&Hp?rdH6S4p~juZdE994EGmC`~&t}_r(oe*7Hd^iUu1bQn+ynKyPGoW?ufn=n_lp`0p=^dL=M33fiv6kD+L6QA9 z$0BWww7xys5R=q;OlpD;$RXIpT)H)l(|dipmNv3jW-3Muh^Nu*K*S|}9puAZ%QRV= zHuOB9s(FOa!d$_R8Q8bfx?0qa{E|YicKiKr{b%prX!x8C%|shqav0{8!E&ATPVT$( zUtp(ly~i9M4(<=-q@5NhR*y3RtL++WgÐ?d+>H)&|OSa*0h;C;wofrpTkq^P@_B z``p>(M>0DK~=rBD{oVLBgSx_`}4N`Z*EM3Bg0A3Oed#wHCP%-4j z?AK2elIpI+kDX(VnxKywWeg18J|h|#M%l!xzLRA47v5fdO?PNT5+f`tpmPw`$J^PK z$&vSY!8N=NF-2f(v-JS)3R+8JNO`=`W~*QX5C2!8k}unKrW?8K2Hhfx42<~?gx3pN zcNfiXP&l|4Mn2(ZWf^QaDh(l<9VpI72+aS2hRXl2uoK^hxzey4=;fra-u@+*dNl%J z`=NcCrQi363`@)^8+J$^V&w1y4=tupfGsFyQbUFQfF_SxHt>Ru&u{>D%H8r(@q8WG z(H7a^L9txq9N)@Gb68M7B8+lsOKI1LD_=eHK^5CQL46~oL~coOPgq2LcX4RzVSX49 z_(8)z*LuGO(d*+3vjLbrT0GAjb)-$MN1ak=EI}yXsT25Be>u~ zGV<5zpyh#1qLr<4ZF4A6{P`@4-Fh=4#rKNe=Bm7)nQ`~nD`1Gnga~?e zfzW=Qip7@)?xW+iy>4vj*MUx^sij0fLUu<2yAAM;D%lFsCbb?xA{l_}19jt$bF>2w z7^teXi|5)8=2~60%X1&^b}C?(0gn~6gdCzOG!$)+U+zVhjrcFSkQ59PFVS=+CSrJd z3d;GPjF+DW9^{RTgAl-_zi-}hdf!J!giFSEezglAjAGC(umV%;S#RiR|yhEc<+M!E~o8{X&h=rtCT zJ4GMnq8}Izl|qtP-S})XGA|Ni6^U&5X<7kY^+wMOhOFy+rTG#9%z~(uf&73!trT7(N7qxIyjZ<#peCvZ znI-DkgvPZPG4U}+&nVRMQgMUsK8gPN=0YAfr}nzR7V2KMyvyA#pn#H-d=od6d&S-Y`P@}m5pJ!C>s{0C!5F+?bt`8%qr_!o zVuuv0;I%tVoTk9i&r>ZEhf+3@_Ema<{mB;f?bx}YsO9u9iSg>GPLP{&R(dAhkZ^{n zKm2)~0D-@p4|xJ2Qum#ZD*@hd9`~xAz0%pX3c_Ljk&RUI-kTPbdzJ4ulMz8*O1>w& z+j94M89V=G3vrSh3e@yh%EEG~6IdGwh@fX>L{p9ufF%SPMJjPHv7N+6DRMM)L@tO^SWZ3Gz?u)$W06(pL?BXMXw3wCa5h3K zb7W(f9``w-gywhPm&L?pp=ilv?2CG_aXq!9K+z$%PGaS?HX^^{!MCa=*6)c_IZe56 zvmqtA+BAn>8+!=#SM^#gx-5>dO|KFygf<0Nc&hrl;>PMC5B}n2X=8_wsNXZW_|({3 zSUTa5vtXmLQPE^;)+sn(g5YUm*b*Cq)YtL8MfV0A3lq`&XkPJS^j4{@hvizFSx7x#su>&GvT zWz?>>(t7NO;IZsUvJz~JZvmVIDrLP|S2SzVo*6@O#94y(t=c-cNMbd*xBV$uEJt}K z)P!xarSj>M8o+ZNUQoU0Y`rO-ZCb=fvuPDE4@(B8&+rZ=t?@U^*c5V$pToL>IsK|_ zj#c#J-rJqv4}70IpLc_DpHi8L&Yiv2hpxMW#X%4Xc?G8tQy54L`D=O$@fYz&{X3rmp8b+&|t6S%4~&}>RM=qiTYWtbcVRt z(rmLJvmL;o9-5P~04&GQWKt8aL;zz^)~X8r_%hdp1TRqqRbRcwagiFy&9ziqQn9zD zrg=i&Ych?W0vHIxhODp0>Knd#PO!{6#zve^xs-U(TiBZyvX!>SB*+Y1moa5{$|6%^ z?hX$X;#ve3)w9-o?Z}|m7SCPigy;M$iCc$~bad_hN&@w2&0CVbGgC5V?CGH)%fr`x z0RqX|ZxhleB-|q`AmL0qjk5aFhDEXe5UpVxkI$&`&QMpyfN2bSIA0o%O7iN=67vnw z(gO2F7g7>W)&zz(R?^$|)|Z-5)NJ;Ci&V(`)m6my1_0qywZbkSao8liH*)|6QL$vC za98_K(waQrzU+Jn2L$1n_}-26Uc`J}-_`6I%i~(S?Rs7Y`+mxR-Z_d+P|_cCqQoaQ zsF0N!)vb?Vi%I9_q)RZZ*}h zF<)aFuJ*193o`7)77JX6qX=*1wj8I592O2G7gyTEMjF0JFsty>@kbbRseXaQ5znS6 zaX@v;mz|}pwLCErC!&C{p1_6SV9SW!&A#Cgb9TF{5~to#_i#<53-L}BqB_VBVH*Hmbe!8?+nQPL)ztW_hdZLyWLojR6yxHGou zURvLqZfRB`nX7H48dKN2Jua4LlA+VofaFH-v*>WyC1dKI(s@nJY}AWsym2dYiS z54C*kX`-5Ity8u56h?k6L(Nv8dx~Dqbag_?uXkf*uhVRd{$}-EyFn3c!-phW*_>zq zOojFu-qcPO-}ZG#dfME_+f#5<)fY&@BN(K~S|4s!_S_>5S@o^+zyOSlx~tV-S{*Xr z{eEBl)LH7?JLuchrT*Cfg;3Zz_I!|QIJqH%If_}5u!OIhKrOy6me66*VOp}=eGEvH z%tzE%Fww^HASn)wVT`WDEH}R2d&!V>8Y)}TkZhSw>}DzA_{{U;0}WXDlk*L9xufW= z$D5Ac_)m>Ycw#xc%RQgyWOWGPnp?}ya>S6NnKQt9gWcH{gYR?q$pZFtyM$DW9Snm^ z@mio~8<^T>nKm~mnO4r(xiegd8?kBCkI;PW& z9ibv`tzndm2d$7GGhAucKd|Z=gPgHo-r2gSzcKF-a^zUQ9^)2>V$vn6gsyJIJGH^j zNI(d;+hREV4)_w}6_NW&A%4JPnxbw!fMQ7NKwq!QtMSg1)x)w6$_#Ajk z|F903y|9<{!)k(;Upp;rkS(P{?$~ft;(Wkd&R=f0PU?ovpo4Sx;=4gKii zd0=x5fkCBhvsN{)<)bgp_(c@?l?94)@AF*xPjP5NzOo!azwj>h>~y?Pk&4n+7Ug#q zi82!{q{*mngYVvDuYZW^6aCoFpgt?gC9b%5l;L4{{N;F?i2x^ULVrLk1k=V038qWb zG-_@sVv=l9De5X%01j8Yeaqq4(cL0lg{@(AU1+kAFF)|o`Plw#5ELgK`=`E(UX6R< zpNVgM%4{15wE}Kh2#5pF?%wGS_G7)LsV|yO^8e)~@pUpLt#alo8?t4|m@e#r_6X{z zq)nvwM>+GywZ|52#;2CnCoCv^F?je_F7{Au1dN^r=q`0g2Up&ejKC*c%mbpW|0S_r z=%BwyEKVRZ$KP}m=l^mSCjE6QM5a3$qW^cSgXR$lF9@|DeS zfhiFmu^(jy;Z@j<;Y2*KYI$ZKU+blcnVmILkw_HS{Sq`pcNXm4Z-6Uv8W}D2=DCfx zsyB1P_WiZ)o9iUgdc8{phAK8HGFsDF)fs>NK($LGvIP@Hlro4Qu6GRtYt)f0VcRAi zTMTeokH>vP7;mlZ8{eT?|48nD;=9(177Z3hcoTY6dpb;^_UHv!)DTklzuEtt)4xGD z4&dL}2fm zMw(6$Wa{+C$jZPJ4ERHFy-X1NgR#*8*;xQ|OdQW38zU1FfRmN^FPcrl(ZI^wNWjL_ z3It&M?Lh!+^g_cuoBSTW1o1L{nfzN2GO!Z|nVXvZ+eFC`WUUI|_%r=wApZB@C4y%P z4Fq`M)c(n>y)b(JyW!vdm7EM6fAe`Si2(kV1P#ET7gzu9J2!U#I|`W@H~^TLe$SFN z_-hPg`s3!s#lLe3_?`7X4K8ByjCz{em;xBo%xwg0z~+Aoza6QW8#|hT|AGNuPR0M9 zn~DA9$o>0fV|&TP|M$)IJG}q19qTiU`10oE`S*850Mm0}U(`R(f9uT5FQno><6vcE z{8RpCDA88M#{7kI1-$$O{If*=+mkQAB=~nmq|A+9^6?Ud;=iy+rx%9uA8aD<-+bpY z+W1V+J~uLe(#XKv!4?3d2eQyJ0VvHJ9qm3aJd>TzqN#&{ote22nBLaGl#1&2I`R&- z#!g1hMDG9nw0{$yz<;8?e@>NZWb0Bo$R z%&Y(tz#k0=WMq2=T3;@J&0iWLBg@O#{x6LY_}u6Jr7?3n_rrf^FYf-=jurS^kpHk_ zWMqG-iGsWMt;}@A!a>ER6r{4+sP@{r9@h66HwpX>jU^FL=w!p7ve&i?{d!HxzFj=!@D1Tq5|5y{9z#x_-%1kdcBGK>o3~UZM?_Kgm2QJ(sttr7m5e4t`paF3^LgRty>ZaT(fg2j6^S75|zhwC3`J7`WPPUi#FC(UZmEw2u zMO+=llpLQE58&p05uPsw1IFh8fI&zA00b}?89aYJm*e@xpHBu+TN}rJSewu>(lG*9 z|1RgV(evM5i?RJ{F#vD#0UU# zvI2mtYyh3#)#^U}a(bkN!V&S5YR=nx;c1@M~nV@$J^}d*yPK zZ=PwN(hUWJfZ9gr*9eDZBLL;QLN5RvkO?UmB{h800&YI@e)6opI*ia_6;&BxolgH) zt^!tTVZlnvM=hwT4#gI3>%trE>*%6Gl>hWW!>w-L=ZgwwHF3>5pPozrIaVzF>m&FZ zG@MuoA}H{u29D528abR-kZnZJ4uET;hO#s`{<#huh!xnAlh9LyU_^Lm*ZTUv$M_v6 zEZCV=?GnahV;yZzeR(aeI?9!DF^I3}HIVplJ(Vpa-0$DNhoH&u210NKb4^a+wcexo z_7qZdj&=P+SVP8z?&S?4B+SzHDb0!en#KiTY>o2$u`~k%P0AHNa2eg(;ga}0fdyy$G_{LA6;A@Uo_5=ebmzch!sY(;FjYStS8|lZf*!m$~UOr{AL8xfKRI4 z$U;_+ofZHNj|ux*~C24^>)t+X$2b{#z&tq3XS|K2gMB*2BMkUr{@s**P{^} zgpc+x{Yeiogc@2M-->;?;iK1K>HlSmp9OlIj-N} zkT1QJ_?w9J2Q$heF~*w@71I*)yGKGF6b1Cne{xeq2-knjJ}~%V zYTr$2ra`F3JXeuxHtF#(a@EP$q0e>ZqYRtAKq044NIR;3XvEK5g6wz1NHa3A^I#Vl z$Q`}!She9#{E1SzsVkv~m9wUuH09z+bfjXGxMKIBaNcZ1Y%3>Gk$e%;nAHMf&g$+* zbw^4Y!!&%9o20#&TRxBTklU$Rp(Ui^DKOuyJraBe25Y7IM%xR> zg-%o>1bv*Fu4z#<8FPt8XtAa%LUbvJ-zz zK`;Hie>s^As$*wCzpK=JFyGOFno3eIHm;BExFb-clf9yLEZP~qL2{ABS*|Vi!s~m7 z-DxU}9EZlHkA;H)B;%oGOBsAZb!vCHn!5@#zT?DZzb|u_op9v{_lWKATg~-xo(j2# zg&#pn`m5uI={ID9m11vJ1u(f?k;Kn8f%hL+El6DKE>ikeja!JB^)$UAZA1(h?5Qjn zXjvJ{ZlyI(wlSSoVig{3OREVU@9;eua0t6FF<4kdW>%()IwqXPh6(H+GlNIm!6DSu zPFUq-jT*i2Vej`MY8TX~P{;S^+j;ksLp8${5Z@PFso}~m#eP%KIU(&89h<694ri;EpNhkM=dGcP#XST1=JAxZHls;=u-PRl&_sWylEPlh2GD$xXEbSUzi$@*rEzP9KGXvXFTDkktIZgM+ zpJmUM>V*lS1EkkEE4VI231z0u%a!cnBdSqR*OVNGh}~3PHx=a3Q)Bh4O%{gSRO8X( zL`~G{h5K18gp6D*wZ{)001jWLy-|cE9^?@blozZ(0g@3e*(-PUBkT)0g=FD6zzBoBHCI9I@SDk|}`mH66T53F|v8BQL5F(vP zUEfxuKFBV4YA3FWP{+;uInP1T`54*x`Rx++`nojaltm}6OxZX;AqA^tUcv|H4r&TX zXj4L=tes8BcjWF-sy8Nk#uH6C%DNp~4SEu3b4#|nwr<-Scu{>6(?!1ynAc<1O^ne> zk>KBkg&~N<*Mn48R?&nLC7dnydgnCfUSWehw3VoCJ4Y7YWauWgmUiSD9w3BpNe}Uf znUh^E-r$sa`4wQA*c{ok5Qyh!giz){?(o56DYbXs{Ty~~lz=46ulc~*q@|2MV1N=& zhBN5V{mQhUgjP*bvmA6!)#2(^HWE{rvhks7qGqu_nMl*Yf_%s#Gs_!;+ZsRv3U z8=GV2#ExUTAO4=#{~->FUr1gOfjqDIHc6CZh6InaN`Rtze=JI!aA;t^jgv6{?fn_? zc}k(>BuE@7mfXK;J&wm~g=;=&rGj3HfFz6S0uOI_gH<6$JEyW(d0A#Jln3rtV`ldq zyro348l2x7Y1hr3(^{}!Cp-SWiA?mlE4x+h}(UZiuy9*2}d@t-p^JJbfh`z#vr`7fsZ~U_U zq(CxG3l}B95>u3sG^6yy7|*3mr#2~1Q+_7Yw;(}wc(doQe%XAE;He_S?1wMl8q_W~ zgyIDE?TdICvt&KHh;!fFSSryD2r5;ImE=_@j+>krb8SYn?4ars;%OBh^JD9Z3{FNz zagz?|xTap%sblHB`L=U=F2r{?_dJ1Dr>1ThYF(rQ*r!%C-R%M2xMtNp@C9;M2FNvg z&m&)EFYae7pumI!9jLe|a(B~LdSViltMJu~1ut3%BYvS3&3>>i6QdqDDH`n_BMqKO z^n?CHsBK(37i#>y<~w7>zTy-o>#eZGqOO$UtJGc*HPfdZZdPBA zBvQP8cGzaZ!$kUaDjyw@sD*J_Te7Dtvu!dHDLpj{tjm&h3XHM4}o}XBxGrUtjsqHqm`L;(<|=y)w@k z73bRvn)SibNqzio?Lx5O*|0{qU8s^y3Mqi`{T=PtD~4h`_0hf zT!-1*Av&O&B`fwWE3Qj_&TeTk-t^AO(=FZCD}5 z@j-FN+e$yMrX!&f^%afvnAlRF;3J|>Tn{Z>N&ImAML29t?V^|pyv02byA@xt!a9p9 zPy_ew-;6IYIn?g&-Uo^kz}tq1Nsn02bf$!_?_V_Abb?O3`m8r5B- z*!te@hgc@xD$i_*qW8JRk1*?7Iw?AT;Goq*&u2MnCBfTZZp$p8u;r383(n8~! z=N-E@xBZk5ZS9CWRuKkX$G!}r9+t!XKc_D4yrz=06@(?St*1rJD5x-UC@c8capTqx zF?Vu}V4R#rh9VU=;sc1_hcyoX#N-*ra5xF+IliCIUbFNsm=n@g7(M{{hF1ct6NV2g z?U4(43s7fX!Smg*?eDQM4k<96pe!@BQrfj?6@Df!Tr|h3#^ocWOj>T!s1po9y~)$cTIUO@jbM zQW!OaswOOHmCkEw+Aq8q9zpQbR;S*Cd+_hT6HTjo))Q_;7I=%eSRV+-?0pMBu1rk+ z<^a_`$=3l*_0pJjen7gRNOWe6BKH&SEHUe&D1n~g{*Q44us>;#i^_yeK6I47PfHWx z-e@2>{7PxgpGcyN#LwccvJ2EQ3lmghM36tbY+#BIrO;^K10LWtwt6$f2y@N>Ie+x} z-tqLHN6+prR#a0dpwxjfz3+4!Nk1rx>{b>4>1>vNVymWZhrExEY?9cL&^4~&zNlWJ z?3NtBAqBQ07Ff)8Nvhr=m$3M}aiIX5&hea+X1aX#AK*Khq5N^d8 zON5TPpH@Sw*!r2-{DCLyyFlwM-Y>V0yD}&aXb};Vph6sH#nFN(D4X>CbcgKCZ8Fg= z8J3OOUttV|-9L$Q;wb}f53H=-WAN7G%u8_R1l{?;4y|HhinY9L%8L(1)Lder--N?q zHOz->nSIzW|DM@V_rrw1Ka_yK%V-qXn7_b-U1(ZvElx4uMqX$EIlOwXFPD=B8|P3v zl@@TLikQ%hl(XQb8=jn@QlE)l+(N}h{E9OF{WsnsRd>+5%Spr1T$b8vXEKAKpLv4T ze)6Pni8b8Y1@NmAiHjkNgvyVOcj0AP6HDohu%XTb7e5#}q7IkXv`7Kx)6iNLfr~YX z{@ZWMhQ@S^34bLO=BDfyoJH)_eh%03nDCnUnbtCKCWfBDg;4G)7iIhIyU_k1JGZtT z!jBM?4}Iq|{1QeSI?SJ;JiaZWSaeG$Bx|)^0#JKWNFqEL@SJqk^9Rhu5-Mg}-yr;K zZQW%Y6C)NyHEQ-c<*hE2C-3ca_2f4*C$Lv73ZU3-gXmD`VK{4*+Z)QhLS`nZtylz- z3^>UB^aFya>6a1=i7!95*C>_KwUZIv{>XulOc~>G3_dio3D~-zAR`20*7;9#U=by- zMklC!GGPCjOcaE5c+2-~F{;@||LJ~hr%!vrRNOstRIAVThH1VwipwLJ8@xzT&rquE z>eM{f`ZoJz+lW@kWzZ-(X zd+B@;Ztbx~$Gi7u_9Z5t$Xc)@f5iyTsxWTCv?P5c1R2KF-M{HT*E;1+(in-Mo%+$+ z(xn)OYX? zNLladE~Gygk646FkvZ?@MiGy~RndgGNsWsZE3S+61n|h#o(dm@6|+KFI$NG5hD$iF zl-dG=f)+Y|a$OCZ#53&d$hfBGa{ra9NNXyFRO#B}_397lNnI&rHgRs{>AV=y(ONdd zMO7?k6sdOisjMBbucB#G+wMXQA4pJ;p@2`~J1t z-3RJx?(ka_-ATfj@hpjAts^9Aa-kR5r~+DIbwCJvOm{lqoP$2XM3~}8Yw!5Vn@ zHp--NXmpW?>G;@vVH7eQdif3fRQiN@K(w-NSaMdHBu8}R4{0zDSWqAUcLH+qvd~jn z$Vtz0g+3s`D~WoS?#v68ijfTILZzd!GqPlSX{V!c1{3MHpF*ey3PteptYxf%IN$eS zPcD);_Bi;19aDe7*tg4GFj-xqkXRSs6Yy(7_-V}%d@k;^Ci8JvNFxZLtU|#AExkz# zu~V(#NrCR8Y1xu!l>&Hp?rdH6S4p~juZdE994EGmC`~&t}_r(oe*7Hd^iUu1bQn+ynKyPGoW?ufn=n_lp`0p=^dL=M33fiv6kD+L6QA9 z$0BWww7xys5R=q;OlpD;$RXIpT)H)l(|dipmNv3jW-3Muh^Nu*K*S|}9puAZ%QRV= zHuOB9s(FOa!d$_R8Q8bfx?0qa{E|YicKiKr{b%prX!x8C%|shqav0{8!E&ATPVT$( zUtp(ly~i9M4(<=-q@5NhR*y3RtL++WgÐ?d+>H)&|OSa*0h;C;wofrpTkq^P@_B z``p>(M>0DK~=rBD{oVLBgSx_`}4N`Z*EM3Bg0A3Oed#wHCP%-4j z?AK2elIpI+kDX(VnxKywWeg18J|h|#M%l!xzLRA47v5fdO?PNT5+f`tpmPw`$J^PK z$&vSY!8N=NF-2f(v-JS)3R+8JNO`=`W~*QX5C2!8k}unKrW?8K2Hhfx42<~?gx3pN zcNfiXP&l|4Mn2(ZWf^QaDh(l<9VpI72+aS2hRXl2uoK^hxzey4=;fra-u@+*dNl%J z`=NcCrQi363`@)^8+J$^V&w1y4=tupfGsFyQbUFQfF_SxHt>Ru&u{>D%H8r(@q8WG z(H7a^L9txq9N)@Gb68M7B8+lsOKI1LD_=eHK^5CQL46~oL~coOPgq2LcX4RzVSX49 z_(8)z*LuGO(d*+3vjLbrT0GAjb)-$MN1ak=EI}yXsT25Be>u~ zGV<5zpyh#1qLr<4ZF4A6{P`@4-Fh=4#rKNe=Bm7)nQ`~nD`1Gnga~?e zfzW=Qip7@)?xW+iy>4vj*MUx^sij0fLUu<2yAAM;D%lFsCbb?xA{l_}19jt$bF>2w z7^teXi|5)8=2~60%X1&^b}C?(0gn~6gdCzOG!$)+U+zVhjrcFSkQ59PFVS=+CSrJd z3d;GPjF+DW9^{RTgAl-_zi-}hdf!J!giFSEezglAjAGC(umV%;S#RiR|yhEc<+M!E~o8{X&h=rtCT zJ4GMnq8}Izl|qtP-S})XGA|Ni6^U&5X<7kY^+wMOhOFy+rTG#9%z~(uf&73!trT7(N7qxIyjZ<#peCvZ znI-DkgvPZPG4U}+&nVRMQgMUsK8gPN=0YAfr}nzR7V2KMyvyA#pn#H-d=od6d&S-Y`P@}m5pJ!C>s{0C!5F+?bt`8%qr_!o zVuuv0;I%tVoTk9i&r>ZEhf+3@_Ema<{mB;f?bx}YsO9u9iSg>GPLP{&R(dAhkZ^{n zKm2)~0D-@p4|xJ2Qum#ZD*@hd9`~xAz0%pX3c_Ljk&RUI-kTPbdzJ4ulMz8*O1>w& z+j94M89V=G3vrSh3e@yh%EEG~6IdGwh@fX>L{p9ufF%SPMJjPHv7N+6DRMM)L@tO^SWZ3Gz?u)$W06(pL?BXMXw3wCa5h3K zb7W(f9``w-gywhPm&L?pp=ilv?2CG_aXq!9K+z$%PGaS?HX^^{!MCa=*6)c_IZe56 zvmqtA+BAn>8+!=#SM^#gx-5>dO|KFygf<0Nc&hrl;>PMC5B}n2X=8_wsNXZW_|({3 zSUTa5vtXmLQPE^;)+sn(g5YUm*b*Cq)YtL8MfV0A3lq`&XkPJS^j4{@hvizFSx7x#su>&GvT zWz?>>(t7NO;IZsUvJz~JZvmVIDrLP|S2SzVo*6@O#94y(t=c-cNMbd*xBV$uEJt}K z)P!xarSj>M8o+ZNUQoU0Y`rO-ZCb=fvuPDE4@(B8&+rZ=t?@U^*c5V$pToL>IsK|_ zj#c#J-rJqv4}70IpLc_DpHi8L&Yiv2hpxMW#X%4Xc?G8tQy54L`D=O$@fYz&{X3rmp8b+&|t6S%4~&}>RM=qiTYWtbcVRt z(rmLJvmL;o9-5P~04&GQWKt8aL;zz^)~X8r_%hdp1TRqqRbRcwagiFy&9ziqQn9zD zrg=i&Ych?W0vHIxhODp0>Knd#PO!{6#zve^xs-U(TiBZyvX!>SB*+Y1moa5{$|6%^ z?hX$X;#ve3)w9-o?Z}|m7SCPigy;M$iCc$~bad_hN&@w2&0CVbGgC5V?CGH)%fr`x z0RqX|ZxhleB-|q`AmL0qjk5aFhDEXe5UpVxkI$&`&QMpyfN2bSIA0o%O7iN=67vnw z(gO2F7g7>W)&zz(R?^$|)|Z-5)NJ;Ci&V(`)m6my1_0qywZbkSao8liH*)|6QL$vC za98_K(waQrzU+Jn2L$1n_}-26Uc`J}-_`6I%i~(S?Rs7Y`+mxR-Z_d+P|_cCqQoaQ zsF0N!)vb?Vi%I9_q)RZZ*}h zF<)aFuJ*193o`7)77JX6qX=*1wj8I592O2G7gyTEMjF0JFsty>@kbbRseXaQ5znS6 zaX@v;mz|}pwLCErC!&C{p1_6SV9SW!&A#Cgb9TF{5~to#_i#<53-L}BqB_VBVH*Hmbe!8?+nQPL)ztW_hdZLyWLojR6yxHGou zURvLqZfRB`nX7H48dKN2Jua4LlA+VofaFH-v*>WyC1dKI(s@nJY}AWsym2dYiS z54C*kX`-5Ity8u56h?k6L(Nv8dx~Dqbag_?uXkf*uhVRd{$}-EyFn3c!-phW*_>zq zOojFu-qcPO-}ZG#dfME_+f#5<)fY&@BN(K~S|4s!_S_>5S@o^+zyOSlx~tV-S{*Xr z{eEBl)LH7?JLuchrT*Cfg;3Zz_I!|QIJqH%If_}5u!OIhKrOy6me66*VOp}=eGEvH z%tzE%Fww^HASn)wVT`WDEH}R2d&!V>8Y)}TkZhSw>}DzA_{{U;0}WXDlk*L9xufW= z$D5Ac_)m>Ycw#xc%RQgyWOWGPnp?}ya>S6NnKQt9gWcH{gYR?q$pZFtyM$DW9Snm^ z@mio~8<^T>nKm~mnO4r(xiegd8?kBCkI;PW& z9ibv`tzndm2d$7GGhAucKd|Z=gPgHo-r2gSzcKF-a^zUQ9^)2>V$vn6gsyJIJGH^j zNI(d;+hREV4)_w}6_NW&A%4JPnxbw!fMQ7NKwq!QtMSg1)x)w6$_#Ajk z|F903y|9<{!)k(;Upp;rkS(P{?$~ft;(Wkd&R=f0PU?ovpo4Sx;=4gKii zd0=x5fkCBhvsN{)<)bgp_(c@?l?94)@AF*xPjP5NzOo!azwj>h>~y?Pk&4n+7Ug#q zi82!{q{*mngYVvDuYZW^6aCoFpgt?gC9b%5l;L4{{N;F?i2x^ULVrLk1k=V038qWb zG-_@sVv=l9De5X%01j8Yeaqq4(cL0lg{@(AU1+kAFF)|o`Plw#5ELgK`=`E(UX6R< zpNVgM%4{15wE}Kh2#5pF?%wGS_G7)LsV|yO^8e)~@pUpLt#alo8?t4|m@e#r_6X{z zq)nvwM>+GywZ|52#;2CnCoCv^F?je_F7{Au1dN^r=q`0g2Up&ejKC*c%mbpW|0S_r z=%BwyEKVRZ$KP}m=l^mSCjE6QM5a3$qW^cSgXR$lF9@|DeS zfhiFmu^(jy;Z@j<;Y2*KYI$ZKU+blcnVmILkw_HS{Sq`pcNXm4Z-6Uv8W}D2=DCfx zsyB1P_WiZ)o9iUgdc8{phAK8HGFsDF)fs>NK($LGvIP@Hlro4Qu6GRtYt)f0VcRAi zTMTeokH>vP7;mlZ8{eT?|48nD;=9(177Z3hcoTY6dpb;^_UHv!)DTklzuEtt)4xGD z4&dL}2fm zMw(6$Wa{+C$jZPJ4ERHFy-X1NgR#*8*;xQ|OdQW38zU1FfRmN^FPcrl(ZI^wNWjL_ z3It&M?Lh!+^g_cuoBSTW1o1L{nfzN2GO!Z|nVXvZ+eFC`WUUI|_%r=wApZB@C4y%P z4Fq`M)c(n>y)b(JyW!vdm7EM6fAe`Si2(kV1P#ET7gzu9J2!U#I|`W@H~^TLe$SFN z_-hPg`s3!s#lLe3_?`7X4K8ByjCz{em;xBo%xwg0z~+Aoza6QW8#|hT|AGNuPR0M9 zn~DA9$o>0fV|&TP|M$)IJG}q19qTiU`10oE`S*850Mm0}U(`R(f9uT5FQno><6vcE z{8RpCDA88M#{7kI1-$$O{If*=+mkQAB=~nmq|A+9^6?Ud;=iy+rx%9uA8aD<-+bpY z+W1V+J~uLe(#XKv!4?3d2eQyJ0VvHJ9qm3aJd>TzqN#&{ote22nBLaGl#1&2I`R&- z#!g1hMDG9nw0{$yz<;8?e@>NZWb0Bo$R z%&Y(tz#k0=WMq2=T3;@J&0iWLBg@O#{x6LY_}u6Jr7?3n_rrf^FYf-=jurS^kpHk_ zWMqG-iGsWMt;}@A!a>ER6r{4+sP@{r9@h66HwpX>jU^FL=w!p7ve&i?{d!HxzFj=!@D1Tq5|5y{9z$ {\bfseries vp}\label{structdynet_1_1AdagradTrainer_acec2f473f86ca026818ae76c8b3172cc} - -\item -\hypertarget{structdynet_1_1AdagradTrainer_a4198955558c37a432400f163aada58f6}{}std\+::vector$<$ Shadow\+Lookup\+Parameters $>$ {\bfseries vlp}\label{structdynet_1_1AdagradTrainer_a4198955558c37a432400f163aada58f6} - -\end{DoxyCompactItemize} -\subsection*{Friends} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1AdagradTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c}{}class {\bfseries boost\+::serialization\+::access}\label{structdynet_1_1AdagradTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c} - -\end{DoxyCompactItemize} -\subsection*{Additional Inherited Members} - - -The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} -\item -/home/paul/dev/dynet/dynet/training.\+h\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/structdynet_1_1AdagradTrainer__coll__graph.md5 b/doc/doxygen/latex/structdynet_1_1AdagradTrainer__coll__graph.md5 deleted file mode 100644 index c6cf8d2d6..000000000 --- a/doc/doxygen/latex/structdynet_1_1AdagradTrainer__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -ba3b065a0de7d092bcc588de7b5b839c \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1AdagradTrainer__coll__graph.pdf b/doc/doxygen/latex/structdynet_1_1AdagradTrainer__coll__graph.pdf deleted file mode 100644 index 0106e8a17211fe07057dd2d36e45437ba531817e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11929 zcmb8V1ymf{68DR{yE8Zh9boX_PH+egK?WEgxO;+2kl+$DxCVkt(BKx_9RdV*e~_GW z@45GW>%H%Fv$|(jSM9y)U)8gQwSIIelG3a|HV_J3&3^eU3KxI_U}s{5A|wQ0e+9O+ zaJB?+Kbh1}0002HG{nXk?D%xIF?I$^f=%trz$n7PC{E6fVB@za?&*1|iVCnmtd^0A z=c?-qbFskph%R<{A#1K$dHDM9$IF6{#(nBSS!BVKq)#3mrza>RrzD=~WyrU@ z9272!caZq8waRu3S@^WV?}vhJW4?<9Ts??bY{`ejiOg(NHe$F-S#-{F{1bCo6HMyE z*=NA^=69dfLHkeq zZqH^Q{#UTFB@n?a1l?c4!+PbLlk zke>?x1n~e2etSzit@-5c1bA+wKV2i^Xy;=8kA3`^|F`w;MAV;Fbu_khvVUI7)Z=fn z9KhMp<@YY0vz2)Ak_5X#Ou=e0;?FLBrKtvXvU71X1v>$rB~$xHR=iK+|7vEwe{Jjk z)XdMz{ONk&Q%*px-zohua02+a`2T6(0)V(d|Iz;Yo|+o^^R=v4fO_0?yo09$jzJb0 z9#2hFRoni(ggq(_cfBB72%ufuo}nIY8fzoA<#6`)m)F6q$Khd3U2%nP z_MNV?Mry^(=hAc*(Gw*sB2q%Z0uE8~UzV#|Hz-J|;Bkc6dgzSzcb3l10&kLGe~M^x z3%tad!2bn@{h*bBh6fk;65i}xWq~uf9~s$Hlt`LX@j>u^aKP`-)Qv3#l@jeEBt^^Ix);M2ryZXA#Lgt zV%2)Z(!=`^qhn^Be)WT}J4U@V}tA%cd@=jk!7f)Y+ia~|ifItS0yOg8uKlY-f2NY0!kPF>*}1E4qxNqeVnm&5$1x!KtK@n>)lDxqfmsVx0UM1sVo z{7gUqG?WWCBBv^m8r-()+so;=zBt6vbO45-UqJ~hxfm1%F@R|IEQEo7mhX{1FYl8O z^pcG}OfwXZt(Y(rApVDRJcdu{e za~{8ld+;KLh)f6!uZbjK_lIdcxTbfwD0*59aE;70vINwyEr(ItxS`bT{aofS9fkr!NWpbxho9utH58eeAC;IPRLHQAtSnR;^c|{$ zgCh)I=>xhWG@s}rf(H~C&m%&nbGx5JdBK+$zX0V^(MR+XSiU!Y5(f<63Xv6&@H*!J z@l3R{kdRD)Q+6A4Ur$&-3_~x@{`S0S{RHLw#q`|c?!X#?2m z;eOlPUariX)&wS=An(3oGdKz54DlilRjcI%r;;O7GFhLFlj@%60%%g-((R#5p>`if zO#h?~t z@#6)!3Y4bL4zmvo-rGm7CEmOF!`ZO~EZTKWRozb8_3bNP?EY}d+i)#R+;GDo;B*yN zhcRIu{(R-f_6AOfbnAXhzk98z?t8B3)P*WbdQ}xv=gHgt6*CvSK)NYHq6bYkda=A> z&xOPMxOb9$9L+cGoh~WPA~iSEXC>uDmEB0hBJVxzq$p-PQS(nw%L8XlZtkyz<$;q3 zrFL4n%faN~-=@fzhbnMO`8Bv|V&$i(fyjn6KA-@?TMh@lz*e<4GX;zfF5=J;r$|HV zJ?yY==W#X*A25u*vl4}3^dKt2>?AQA>QYd}X9ch}v_bMLIuA04`0s|{X|ksX^>2yJ z9anUnb>}-g_Tt`!39=Yjx8AR-k*dDTZ>BW~h7CnOe-KW4sX3!bL0?NtJdZUl!^JotU9TgX+R~a|_py zX)B9;-${)XZWAdyMX30)ESn8hnKYWy=@ef2 z)&yS=Wh+ufm%|&^pHV{TrBjAGezMpR^-_;9`|@xArSS6z=1 zBZlxeIjVwe$`L7CU;2D^nNX+-$pSNd!l4RaE`54ZzQ@hh%97Gu7@YA^9XB%586cmP zMb_0mR5`zzDIje&+zkd>!BU?UkZ%^#M_Hw|R^w6|Yrt7W4*e=4kk9(ia4czvXDsL; zgbC+G3mXVwbGnW60|vpIIKxi)U_nenZFp!b4A=lc}Yhh#G08T!1S=aWMgub-)eh- zSus3{WTc&>|Cm~Z_^ZqG*a6M;YX`qu$ z{4zTBVU~%ev*zQJ9>nNah4WU(kI;v2H4vw7+PHBV&q%1QC(}uo$g0@2D~#-%!=J$L zWWTOqHnaL0CSPht8!f!b8h)$}j;g+&T;9eZ4kn&x{zvc>eOkP{;>A)ex#gg5`v@$YhJPV1Q~ZMb3*cr?i|(Q+7{E?MEzI zI=21o!(`}3u5SAXYkZ0P2l0E-N2W1``nu#r%kN!Goie?bUgwv@Kd;(l`7@V>rTr$p zn8vDg_)4)tf;D?rlB0|mKVI-VG0F%K?Gl6t+{D(~xkSE(EM9IWIr`G{N;@==l@9?N z-HSaa*HAyuhFg4h#Y?IHVmmtg7LxTclWw3sqxL881?j~UsY z1}{ETLmA7VCBQMyyUuWhq&VJxwoK!jaC&lkW%5NMs_(lj7NsZq`sHo`lwRIS-&piH zAUa8~1$Q304O`dML(aQ@*ul`5-$7~~C?#OF+|+Klywd*xSC&=$*sDVAEsJ9F(Mx2a zo~)L*!S4ky#Ak}m6N9^2jiDlCJ)lD_`Gac{r+`zD$c2*b=GTXy#1F;2%{C&S;Cuz- zcqp0=W`sWKbWVyu1qAF};)2S2Iwp&uIK-=?VAfLpp6y;Zo{J7o;>=VZJw3fu$O8kTGEjDfK}S_4;K`}U58bwC7!yZ)T^bKk&!}= zN?6|ATir~+xAhG{UT?g$JLh;eNL*q~O3YTq-AQ zRpKn(NZ{nUKYStF@#Up8`h$B965oPr!osT9shGHpo4PjAPF#{nuGr81wqSoAWKOy{ ztt8kv>xxew?B-(djP{zpiLnTonctbsZV|2!T-tOU(z^Mk=KRVlKyDYa^lA*|*5vH& znIZRdNG+4qeV^C)9f*^{Y>vgpmZi?#Sh5`ChCyP?bXdRN(dkdfezmVN+qAnqo7lV) za9g_rD;lTb<>%yl;ZA|QQfiq>OYBjD=Cx3EnQmA6eK(q?cBd@2EGTF8Vgpm{ov-Aa zG|HfXcgrzr*SLI(szuEY9*7&7CbzUo+~fdVMRD-eS1SJR-nW*S5WTQog{$rJe56Zw zSmX18UHJLLOmif`NPY{oxU+KEUhWz;Gy%C_*^nRO5;2Z}f{B(=Cmq@zF{#HL5mk!Y z8#5_7CA7k8*|hwkdUs^#(Z>6#Os1#Ij@9c2LD(C@y~nRs8?UFzTj|JePRE>K)pREU zAPt`VvQQ6qY6fVDVumBFhrvS3Seqy%b1x~Gxi4hjORi3lc5XBDt#-ktJyan$6`oY_mfXMj^Z~LsGkuy<5n-(zJf@_5(@j4pJk*`8q$XQX8 z+;WK5x$3Di+!z@7B)o1Bgt*0f)r#&=N#-!t3_i5=IhURkDrOKc<80oCkr`MqvqVue z`WzVxz;f_84thl1{fx)1eWG&cx6#H@!pVvIv;7OfJvE56frDVzrxWXWmg zeOuJjA^AX#@rD(u{m3O{-nkVUM{@~IbZC5ijuB7*j`i=P4yCgMh9Nd8}&0r9rVod~@kNeJ7ak0hp^fr59vV*^@a| z+v1$-K%X^I$MHL5+bq)d+oVg)5>oilcsn@Gh&z%Aj(gMO3CVf%);7)s=8!58Uc65G zLV-hN!gxPaoftpmy(4OxJ1P7w2zUj_6EDY%zA410@cwb>L%THOr8G9~_+p-7oRh^h zVT5?B;LW-XjO@Lue>Qs*XhO)v^yoXaxaVM-Vapc z2UoQJXdD#esVA&L9}=P~Ex8RP_;4^q<(;DbQZudIYV`&8j6yaSG#$v2Q;6%31XGw{ zd4?JlxXb&~(oQ~v(4Lm@=NX6l#fa;L(y{wAz7hOS-%kyaIR4fs2dJZirBxdamFK_= zJVz(#ozb1J-tMYo3OtdHq!nLmh@Sin(uMb=*#x8C;Jd7(R$r3 zJ(0taA!6`TIO))Br)iFKJjmmfxhTG^4`P|_ButfJvhQr%VH6_hEyJ$wwF~bu@~tgrA%A}L(hBo-7YR1Uf@_0FBa`M-%?XH^yAO~oIp6cZ=0F4#7oM8i21rebb;v9 zb5)UvC9M@zkWb$yPh94J3-1?tnCyA7bGbQrAwu#Xw<`6nV65v@Y98+&6-}v0O$BA~ zJ&ToEM%g$1p}P(Bjn@?4?x5t-1Uk2aLm(LZ48$G1DX%A5q-4-?^y)5np*c_ktP7_i z3^BJ|R#fKC^R};f0LP^&Z>F$Z6s=va6x0~&u95jJZ|dgscs@eh zn!Za>R9)Lqq}<*&k9L77z=Gz= zLu`!X>lWM^vY-}jeMeWyWYr*nt&E5yV*&FCmDKr7JLZk%a4^U0^!H4^V!VDL6uY&& zQM%d^wtN9mtQPj@Q=#KJ2M1IKvPY_AFb2#MnK*&yaH(jZZ`!>YL<~9G3v_QLGAIJ* zt&rv_my%uy%Pdp%5v=Q@5fea@OR}d;56sqgU>hu0Dozq%yY{abSWqh-ij?RewP||R zm&Wi5Ik(y`-pv{)O;nVS3;h(CVJxSCDpfuS6ESJj_0~}?N_fT2m}#9{ zbi2Mf@p|6caSayI^%H#qi-Nji!BVPmn^}&qKErA555rq0Pr(TGW#yPJKYS?i9Sawtwtv9Lqq zs8%m~6}&N`$0>fd_LXk!f{yz$cKITsaN1xL)-CgL6d8$GRJ+X2WZ*cakC$GqzFuQ1 z9W6clJFSezHhbK{a3vm2r%wb{^2}B7fmNO@K1s`>^)7rm2}_Daj%pJcU76|S*?cup zC-|?}-@Cr3c5esO_AhYP^y@Ckj#RRLTSv^oHj1qhju;sks(q8i5_vPME^E%T-?wl? zP+-?0z`_Wn=YUgJI3GBn+R?LgWs`CDiZ+(~+ znPGGb*-o1>@SidyS|GHpy;4I;2)V~k8;=m*d`0+ma-0;+2zEJ_by2Bn4pe*-XU0aE z&X~OpcZ(yf3c)`#&c>viI))+%j080g2P~s_Ulc);t4ex%=Z@w z<~@+EM70Z4b_6q}hJ*QD%Y3Xww;!hRKc?1IKHF<&!dmPIVe>jqaj$-M?uo5D{Po%^ z2lQreK|j+D9syxz+|arev4Va~DhsznKke6Uuxrvk^)VsLhL5t(<3+>B9=sjy>+zktJqFXKDOq;MZ%#j-UN; zOnKp}73*eAKov@ABa#%OVpaWRG(|2Ay5+iQKiL^EHgbkGTu!5WXW$0j)358w@mAcl5~QlfiJ*+w^K%n~hS6la zma9VTGi-DDp#xg>5VQDMUja(H)>`76#Ke1VNpV>i-GsRkyEVyUB?NXpEB{SC*2d^> zGUAg_I)wW1LCL23QE5g#wM%#KL&p0FFB2CKi^0Gd{jh$w5GkO_Ds#eHym_SA@)XO6 z4_`0&`nmLsMJnkU)q0%ir;RLfRqn86DF9BYeM=yX5T*z8EYN_poO6V1#-zu+US zh47L-Bq*(uL^s6u*-a1Vd%aLe@ct6s6iwP}8E1^AMwkKmNqRu%HN3g7qJ&_v0A4G3qtC}(ae6hK^sPFHE!9nL= zXd8~S;_IG{%BCM;op7#ceEnD@vl!gC=p_a=h#)0Srq(XCUV6N5yJdMV^DTK4UbO#* z0*MhpcJil?z`h4XsnaHQkt^pfK*-XME?VzCcbiXC zOLlm3jVaFmw+^Bpy1pY+gF zWyov7n>u|}G4-e;nz&5=QG~~E-{OU6@n}995+4IwFdnovsOP?J-+<&@uetVi-gmiH zhblfMGC;u-R1-~nups-sb>bxL1Nl2)xbk|)IC#XaJrV3~*CEy*%!xl=`z@GcRC?nqfvBJK?;FBM%_b!q3} zw|hw6@I^5kfuxOMTNkqQk)tAo+V*0nN*Ng*$)xZcgdadP7vGOKK{E=(@9ZAwI?I^a z`TQsMAMV-Ntga=?k}Ye8nGfF~<uJr&|k(huZ{wE5O`NOxvjC*O7BjxZEa4CiZ?-owOP<*)bqtPotq9(PCa{KMI zypE@ze{mEj@Q0yY3d+aEtUqI{AZm0V7d$nLRPLqff zy(%To&&xP^t39$p=g#M3Q!i6m)4I+_=^u@mPv$sNJHhM8aSBE>&-7UV<-~>}mj#8S zNe`0D$Qa&-v4(6aCXFX@C;k*(J(L*{yHF7MwLtK(D$-#ETQJ3q>t5=I9e(|=9KvS*6ay2CoIVqQ| zQhMR_F%OCfUcW$t3G-g&p6oSp*ws|<@u7P3*E-(hgpCqXxdYf-vmdV|l6OLGe-J_( zSEc|*eIaeWTN6V=vBII@Y>?bL?J6~!y;$Utu&#l9Xq%Xw@lh~~x3~zqS1;4JY9(_C! zAD>-2pziqbk+_0QD7`Og%f~D0^^Xm1ZhA4caD{T&zT&*@m}A+#jeL-d?Z%j;U^z{H zUmi7dS6ZA=m2y5-J$UfkAiN;~i^g>}LUS15p$fXN!S~TQ{KF@F+>G?f^pinollQH~ z^F7ifiId_4Zv*UPK=Nz*ulf_Iq_c}bB(yh0qqb1WnYcZ^uHqZ%Is;15T&A0~x?DZ4 zL~5IsjX7G_EUD1#_EiF0$B(K%WElVZ#uo{ds{f-O2?70{0sE&gKmh zUqMcc@=>ajE_ zi~QZjm#0b*;YC-DPyY#T>s^SkeqLI8$eDjVQ6MPSr#tP^FL9}`z8==0ZO_l1cE)Wz z*%>XRI!1JAdW`;qdhZOqbwMRgY46iXsnO?MZUKZ7OyaTapV?y3w9a|tydu{q`Fa$t z!``{y?mv^C#LT^9nm?OV!G#rm@5} z*67o+mvC+_9Qgb~B=4y0e5#5@CEHK^lnevX?OX4Z5IUw-8tE%u(s8zk-FFk8v8h}O z_e%ejoR#_yvVwG|U-EvNX0Pw@Y9}Gxt&_#FNjj(j{QSD>y&ZC?*6m9kQL|M_FMIb5 zm{*f7-?y5TP?3ccVS6lDf0j>;f}qmMC0R}vZ?LM3jqYziU{WLuO02E&YbcG7CAc*j z$Fb@$6;S06{25QlUg^QZ!sx+&@|-t~19^D(c@0&X0e3J_mk1I?kCe)GOdE_%tGBCmy#I0zD8;xk zw8c9Z*wrAFTjr(2IxY$RoSTgm)AW*cq6{(x&zjEOFhbL1M>?!aNV(j=@zp#|{`w|1 zl#~j(HFm0a#HS}>Q#BS%`CGPMOk$t7BZQorll$I)VT}Bvx)-#>?UI?#CR;#I1`Oed z>il%3b>!@p{9LdGq)zdAkWGcK+cUvKS&_drd_vtp82i)PysYA@yat1AA#~4_@mF=1 z@4U)EWy2BIlY>yx4W-R&)%`=MO>%)`>-i5QV|%3+17s5=OwNN9xV1IcH83A`_BeLL z;~DL`dvrSHjx7<(plSzJmJo0wXtk0^ie$x00ATSQSDj}`P3(G!VG zISpGkg)d{*bRS4kV+>wL#kN0;D=JlU#>?~Dzh{hAsLcGG`P#@jPW7FR(>*GvAy| z-WXu>Zk4QlEsl7*@ur%YN-lp(=>x#FuN-FIT&70w~sZF-Uit+`_V%Qt8EiJ1q^KU89AqpdX!>!m;Oy<)Pq;>%S+9-d80 zuxf-7GHtXy;k$W#b#X*~aue8SQKW6t#qJkY9W;1Bna$f3O?u_cQh%b~j&^w>`_(q; za3V0&b&fsig&?(%oISs>mj+RUGYrS!CL)=k}9xL^%HQz&f z*dh^L!pK5&u-ZJX&l>))Q}v#$ViR`ZG-Bt=i^-X=$?n2wo0d66_{Jk4-5BQK_nNA$ zi*^MO&P0(63*Hw++e%tRq{Yl@|r&aDxF6cV>W z{`jga!#f1x_*qr$4D`bx;kF{>t57aMQ6I`EVm1TuCB}h^g+ndh9}kAxABYsoqles< z#1ifWUNXx${`#b%I`ZB=s3)TnNo>=z+j6GHZrV*_G*GdY@-TgXSwQ*MdCUv~J{2YIiVf_EgPywH@um3wD&_H#-Hh=@G`Ih-2nSz=EJxiWIEy0lQEc=JAziCBS zo(YR7#+}c!YrOo+wn#UNM6iB(NK$($RCkEcMkw^xFa7I{Hip#t_MC~DAV!+b{rDwE zf+&15ic8Rnkai2laQ4;bEs{Ho5Q`f9qj%7v#|QYHrVM=EnLYX>yxYF^(xh2tKA0$= z4_^2Oii1c}oRo-CKDZY&Pb{BNlSJWoLqBt$)aq`aB>S(x$RseP{$575=A-8sbD!hb z$qS+N{jkqqxiOTsx{(9CYBF+z2Jod%nyqt`X%s^l-;Km&@uf8 zWG$V?FA2crJWxx2p^wm;c+OO zSk=H5E`OYCj4hl1-2Vy?|HJUH0(rRstekux0FZ-|6TlDR`U~Zgb2hetn2On2*nj~X zzoW#QOrKG}Czs#D=S@71pM!rJB#iB4!4M0}f4itVgWtXe@cjvY9?1SZc;508f(HgX zLwf&&_MQR7|4sP!{OT?y&cETrXCZ*UP2$E*;NP6%|7+$DM<-_qOJhd>7w7M&SH^#h zft-J)`AG{Xu@$p*g8XgxJ&_i~%-PcEFB0Z@Be|>wKbz zpBfp!Xle{`v;zRyfZS}H0LCY@(O!W432S{aS~wcpTS82o*z6oFn3#UAqvB|1=3@Fp zBmdur{Tp`${u6Wl^Hxb1KefA^#hV z9~%(J1$@f<`2g7dW#i!B=6DkDzib@9r#}BL8yDYG{r|%T8@D|KZ2M z!OQg|>3`Us-e&IqUiZny`@eoX|A*M8y#9MWAQ#_L;s0|DAn2dDIXfCZz0r=p;c<0{ yC-_;bXQWom&hDxH|0aUvY|WqQ{M-Y-yUNMg*wOj7y1*xpm=lGLPD)uC<^KUn5`&`v diff --git a/doc/doxygen/latex/structdynet_1_1AdagradTrainer__inherit__graph.md5 b/doc/doxygen/latex/structdynet_1_1AdagradTrainer__inherit__graph.md5 deleted file mode 100644 index c6cf8d2d6..000000000 --- a/doc/doxygen/latex/structdynet_1_1AdagradTrainer__inherit__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -ba3b065a0de7d092bcc588de7b5b839c \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1AdagradTrainer__inherit__graph.pdf b/doc/doxygen/latex/structdynet_1_1AdagradTrainer__inherit__graph.pdf deleted file mode 100644 index 0106e8a17211fe07057dd2d36e45437ba531817e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11929 zcmb8V1ymf{68DR{yE8Zh9boX_PH+egK?WEgxO;+2kl+$DxCVkt(BKx_9RdV*e~_GW z@45GW>%H%Fv$|(jSM9y)U)8gQwSIIelG3a|HV_J3&3^eU3KxI_U}s{5A|wQ0e+9O+ zaJB?+Kbh1}0002HG{nXk?D%xIF?I$^f=%trz$n7PC{E6fVB@za?&*1|iVCnmtd^0A z=c?-qbFskph%R<{A#1K$dHDM9$IF6{#(nBSS!BVKq)#3mrza>RrzD=~WyrU@ z9272!caZq8waRu3S@^WV?}vhJW4?<9Ts??bY{`ejiOg(NHe$F-S#-{F{1bCo6HMyE z*=NA^=69dfLHkeq zZqH^Q{#UTFB@n?a1l?c4!+PbLlk zke>?x1n~e2etSzit@-5c1bA+wKV2i^Xy;=8kA3`^|F`w;MAV;Fbu_khvVUI7)Z=fn z9KhMp<@YY0vz2)Ak_5X#Ou=e0;?FLBrKtvXvU71X1v>$rB~$xHR=iK+|7vEwe{Jjk z)XdMz{ONk&Q%*px-zohua02+a`2T6(0)V(d|Iz;Yo|+o^^R=v4fO_0?yo09$jzJb0 z9#2hFRoni(ggq(_cfBB72%ufuo}nIY8fzoA<#6`)m)F6q$Khd3U2%nP z_MNV?Mry^(=hAc*(Gw*sB2q%Z0uE8~UzV#|Hz-J|;Bkc6dgzSzcb3l10&kLGe~M^x z3%tad!2bn@{h*bBh6fk;65i}xWq~uf9~s$Hlt`LX@j>u^aKP`-)Qv3#l@jeEBt^^Ix);M2ryZXA#Lgt zV%2)Z(!=`^qhn^Be)WT}J4U@V}tA%cd@=jk!7f)Y+ia~|ifItS0yOg8uKlY-f2NY0!kPF>*}1E4qxNqeVnm&5$1x!KtK@n>)lDxqfmsVx0UM1sVo z{7gUqG?WWCBBv^m8r-()+so;=zBt6vbO45-UqJ~hxfm1%F@R|IEQEo7mhX{1FYl8O z^pcG}OfwXZt(Y(rApVDRJcdu{e za~{8ld+;KLh)f6!uZbjK_lIdcxTbfwD0*59aE;70vINwyEr(ItxS`bT{aofS9fkr!NWpbxho9utH58eeAC;IPRLHQAtSnR;^c|{$ zgCh)I=>xhWG@s}rf(H~C&m%&nbGx5JdBK+$zX0V^(MR+XSiU!Y5(f<63Xv6&@H*!J z@l3R{kdRD)Q+6A4Ur$&-3_~x@{`S0S{RHLw#q`|c?!X#?2m z;eOlPUariX)&wS=An(3oGdKz54DlilRjcI%r;;O7GFhLFlj@%60%%g-((R#5p>`if zO#h?~t z@#6)!3Y4bL4zmvo-rGm7CEmOF!`ZO~EZTKWRozb8_3bNP?EY}d+i)#R+;GDo;B*yN zhcRIu{(R-f_6AOfbnAXhzk98z?t8B3)P*WbdQ}xv=gHgt6*CvSK)NYHq6bYkda=A> z&xOPMxOb9$9L+cGoh~WPA~iSEXC>uDmEB0hBJVxzq$p-PQS(nw%L8XlZtkyz<$;q3 zrFL4n%faN~-=@fzhbnMO`8Bv|V&$i(fyjn6KA-@?TMh@lz*e<4GX;zfF5=J;r$|HV zJ?yY==W#X*A25u*vl4}3^dKt2>?AQA>QYd}X9ch}v_bMLIuA04`0s|{X|ksX^>2yJ z9anUnb>}-g_Tt`!39=Yjx8AR-k*dDTZ>BW~h7CnOe-KW4sX3!bL0?NtJdZUl!^JotU9TgX+R~a|_py zX)B9;-${)XZWAdyMX30)ESn8hnKYWy=@ef2 z)&yS=Wh+ufm%|&^pHV{TrBjAGezMpR^-_;9`|@xArSS6z=1 zBZlxeIjVwe$`L7CU;2D^nNX+-$pSNd!l4RaE`54ZzQ@hh%97Gu7@YA^9XB%586cmP zMb_0mR5`zzDIje&+zkd>!BU?UkZ%^#M_Hw|R^w6|Yrt7W4*e=4kk9(ia4czvXDsL; zgbC+G3mXVwbGnW60|vpIIKxi)U_nenZFp!b4A=lc}Yhh#G08T!1S=aWMgub-)eh- zSus3{WTc&>|Cm~Z_^ZqG*a6M;YX`qu$ z{4zTBVU~%ev*zQJ9>nNah4WU(kI;v2H4vw7+PHBV&q%1QC(}uo$g0@2D~#-%!=J$L zWWTOqHnaL0CSPht8!f!b8h)$}j;g+&T;9eZ4kn&x{zvc>eOkP{;>A)ex#gg5`v@$YhJPV1Q~ZMb3*cr?i|(Q+7{E?MEzI zI=21o!(`}3u5SAXYkZ0P2l0E-N2W1``nu#r%kN!Goie?bUgwv@Kd;(l`7@V>rTr$p zn8vDg_)4)tf;D?rlB0|mKVI-VG0F%K?Gl6t+{D(~xkSE(EM9IWIr`G{N;@==l@9?N z-HSaa*HAyuhFg4h#Y?IHVmmtg7LxTclWw3sqxL881?j~UsY z1}{ETLmA7VCBQMyyUuWhq&VJxwoK!jaC&lkW%5NMs_(lj7NsZq`sHo`lwRIS-&piH zAUa8~1$Q304O`dML(aQ@*ul`5-$7~~C?#OF+|+Klywd*xSC&=$*sDVAEsJ9F(Mx2a zo~)L*!S4ky#Ak}m6N9^2jiDlCJ)lD_`Gac{r+`zD$c2*b=GTXy#1F;2%{C&S;Cuz- zcqp0=W`sWKbWVyu1qAF};)2S2Iwp&uIK-=?VAfLpp6y;Zo{J7o;>=VZJw3fu$O8kTGEjDfK}S_4;K`}U58bwC7!yZ)T^bKk&!}= zN?6|ATir~+xAhG{UT?g$JLh;eNL*q~O3YTq-AQ zRpKn(NZ{nUKYStF@#Up8`h$B965oPr!osT9shGHpo4PjAPF#{nuGr81wqSoAWKOy{ ztt8kv>xxew?B-(djP{zpiLnTonctbsZV|2!T-tOU(z^Mk=KRVlKyDYa^lA*|*5vH& znIZRdNG+4qeV^C)9f*^{Y>vgpmZi?#Sh5`ChCyP?bXdRN(dkdfezmVN+qAnqo7lV) za9g_rD;lTb<>%yl;ZA|QQfiq>OYBjD=Cx3EnQmA6eK(q?cBd@2EGTF8Vgpm{ov-Aa zG|HfXcgrzr*SLI(szuEY9*7&7CbzUo+~fdVMRD-eS1SJR-nW*S5WTQog{$rJe56Zw zSmX18UHJLLOmif`NPY{oxU+KEUhWz;Gy%C_*^nRO5;2Z}f{B(=Cmq@zF{#HL5mk!Y z8#5_7CA7k8*|hwkdUs^#(Z>6#Os1#Ij@9c2LD(C@y~nRs8?UFzTj|JePRE>K)pREU zAPt`VvQQ6qY6fVDVumBFhrvS3Seqy%b1x~Gxi4hjORi3lc5XBDt#-ktJyan$6`oY_mfXMj^Z~LsGkuy<5n-(zJf@_5(@j4pJk*`8q$XQX8 z+;WK5x$3Di+!z@7B)o1Bgt*0f)r#&=N#-!t3_i5=IhURkDrOKc<80oCkr`MqvqVue z`WzVxz;f_84thl1{fx)1eWG&cx6#H@!pVvIv;7OfJvE56frDVzrxWXWmg zeOuJjA^AX#@rD(u{m3O{-nkVUM{@~IbZC5ijuB7*j`i=P4yCgMh9Nd8}&0r9rVod~@kNeJ7ak0hp^fr59vV*^@a| z+v1$-K%X^I$MHL5+bq)d+oVg)5>oilcsn@Gh&z%Aj(gMO3CVf%);7)s=8!58Uc65G zLV-hN!gxPaoftpmy(4OxJ1P7w2zUj_6EDY%zA410@cwb>L%THOr8G9~_+p-7oRh^h zVT5?B;LW-XjO@Lue>Qs*XhO)v^yoXaxaVM-Vapc z2UoQJXdD#esVA&L9}=P~Ex8RP_;4^q<(;DbQZudIYV`&8j6yaSG#$v2Q;6%31XGw{ zd4?JlxXb&~(oQ~v(4Lm@=NX6l#fa;L(y{wAz7hOS-%kyaIR4fs2dJZirBxdamFK_= zJVz(#ozb1J-tMYo3OtdHq!nLmh@Sin(uMb=*#x8C;Jd7(R$r3 zJ(0taA!6`TIO))Br)iFKJjmmfxhTG^4`P|_ButfJvhQr%VH6_hEyJ$wwF~bu@~tgrA%A}L(hBo-7YR1Uf@_0FBa`M-%?XH^yAO~oIp6cZ=0F4#7oM8i21rebb;v9 zb5)UvC9M@zkWb$yPh94J3-1?tnCyA7bGbQrAwu#Xw<`6nV65v@Y98+&6-}v0O$BA~ zJ&ToEM%g$1p}P(Bjn@?4?x5t-1Uk2aLm(LZ48$G1DX%A5q-4-?^y)5np*c_ktP7_i z3^BJ|R#fKC^R};f0LP^&Z>F$Z6s=va6x0~&u95jJZ|dgscs@eh zn!Za>R9)Lqq}<*&k9L77z=Gz= zLu`!X>lWM^vY-}jeMeWyWYr*nt&E5yV*&FCmDKr7JLZk%a4^U0^!H4^V!VDL6uY&& zQM%d^wtN9mtQPj@Q=#KJ2M1IKvPY_AFb2#MnK*&yaH(jZZ`!>YL<~9G3v_QLGAIJ* zt&rv_my%uy%Pdp%5v=Q@5fea@OR}d;56sqgU>hu0Dozq%yY{abSWqh-ij?RewP||R zm&Wi5Ik(y`-pv{)O;nVS3;h(CVJxSCDpfuS6ESJj_0~}?N_fT2m}#9{ zbi2Mf@p|6caSayI^%H#qi-Nji!BVPmn^}&qKErA555rq0Pr(TGW#yPJKYS?i9Sawtwtv9Lqq zs8%m~6}&N`$0>fd_LXk!f{yz$cKITsaN1xL)-CgL6d8$GRJ+X2WZ*cakC$GqzFuQ1 z9W6clJFSezHhbK{a3vm2r%wb{^2}B7fmNO@K1s`>^)7rm2}_Daj%pJcU76|S*?cup zC-|?}-@Cr3c5esO_AhYP^y@Ckj#RRLTSv^oHj1qhju;sks(q8i5_vPME^E%T-?wl? zP+-?0z`_Wn=YUgJI3GBn+R?LgWs`CDiZ+(~+ znPGGb*-o1>@SidyS|GHpy;4I;2)V~k8;=m*d`0+ma-0;+2zEJ_by2Bn4pe*-XU0aE z&X~OpcZ(yf3c)`#&c>viI))+%j080g2P~s_Ulc);t4ex%=Z@w z<~@+EM70Z4b_6q}hJ*QD%Y3Xww;!hRKc?1IKHF<&!dmPIVe>jqaj$-M?uo5D{Po%^ z2lQreK|j+D9syxz+|arev4Va~DhsznKke6Uuxrvk^)VsLhL5t(<3+>B9=sjy>+zktJqFXKDOq;MZ%#j-UN; zOnKp}73*eAKov@ABa#%OVpaWRG(|2Ay5+iQKiL^EHgbkGTu!5WXW$0j)358w@mAcl5~QlfiJ*+w^K%n~hS6la zma9VTGi-DDp#xg>5VQDMUja(H)>`76#Ke1VNpV>i-GsRkyEVyUB?NXpEB{SC*2d^> zGUAg_I)wW1LCL23QE5g#wM%#KL&p0FFB2CKi^0Gd{jh$w5GkO_Ds#eHym_SA@)XO6 z4_`0&`nmLsMJnkU)q0%ir;RLfRqn86DF9BYeM=yX5T*z8EYN_poO6V1#-zu+US zh47L-Bq*(uL^s6u*-a1Vd%aLe@ct6s6iwP}8E1^AMwkKmNqRu%HN3g7qJ&_v0A4G3qtC}(ae6hK^sPFHE!9nL= zXd8~S;_IG{%BCM;op7#ceEnD@vl!gC=p_a=h#)0Srq(XCUV6N5yJdMV^DTK4UbO#* z0*MhpcJil?z`h4XsnaHQkt^pfK*-XME?VzCcbiXC zOLlm3jVaFmw+^Bpy1pY+gF zWyov7n>u|}G4-e;nz&5=QG~~E-{OU6@n}995+4IwFdnovsOP?J-+<&@uetVi-gmiH zhblfMGC;u-R1-~nups-sb>bxL1Nl2)xbk|)IC#XaJrV3~*CEy*%!xl=`z@GcRC?nqfvBJK?;FBM%_b!q3} zw|hw6@I^5kfuxOMTNkqQk)tAo+V*0nN*Ng*$)xZcgdadP7vGOKK{E=(@9ZAwI?I^a z`TQsMAMV-Ntga=?k}Ye8nGfF~<uJr&|k(huZ{wE5O`NOxvjC*O7BjxZEa4CiZ?-owOP<*)bqtPotq9(PCa{KMI zypE@ze{mEj@Q0yY3d+aEtUqI{AZm0V7d$nLRPLqff zy(%To&&xP^t39$p=g#M3Q!i6m)4I+_=^u@mPv$sNJHhM8aSBE>&-7UV<-~>}mj#8S zNe`0D$Qa&-v4(6aCXFX@C;k*(J(L*{yHF7MwLtK(D$-#ETQJ3q>t5=I9e(|=9KvS*6ay2CoIVqQ| zQhMR_F%OCfUcW$t3G-g&p6oSp*ws|<@u7P3*E-(hgpCqXxdYf-vmdV|l6OLGe-J_( zSEc|*eIaeWTN6V=vBII@Y>?bL?J6~!y;$Utu&#l9Xq%Xw@lh~~x3~zqS1;4JY9(_C! zAD>-2pziqbk+_0QD7`Og%f~D0^^Xm1ZhA4caD{T&zT&*@m}A+#jeL-d?Z%j;U^z{H zUmi7dS6ZA=m2y5-J$UfkAiN;~i^g>}LUS15p$fXN!S~TQ{KF@F+>G?f^pinollQH~ z^F7ifiId_4Zv*UPK=Nz*ulf_Iq_c}bB(yh0qqb1WnYcZ^uHqZ%Is;15T&A0~x?DZ4 zL~5IsjX7G_EUD1#_EiF0$B(K%WElVZ#uo{ds{f-O2?70{0sE&gKmh zUqMcc@=>ajE_ zi~QZjm#0b*;YC-DPyY#T>s^SkeqLI8$eDjVQ6MPSr#tP^FL9}`z8==0ZO_l1cE)Wz z*%>XRI!1JAdW`;qdhZOqbwMRgY46iXsnO?MZUKZ7OyaTapV?y3w9a|tydu{q`Fa$t z!``{y?mv^C#LT^9nm?OV!G#rm@5} z*67o+mvC+_9Qgb~B=4y0e5#5@CEHK^lnevX?OX4Z5IUw-8tE%u(s8zk-FFk8v8h}O z_e%ejoR#_yvVwG|U-EvNX0Pw@Y9}Gxt&_#FNjj(j{QSD>y&ZC?*6m9kQL|M_FMIb5 zm{*f7-?y5TP?3ccVS6lDf0j>;f}qmMC0R}vZ?LM3jqYziU{WLuO02E&YbcG7CAc*j z$Fb@$6;S06{25QlUg^QZ!sx+&@|-t~19^D(c@0&X0e3J_mk1I?kCe)GOdE_%tGBCmy#I0zD8;xk zw8c9Z*wrAFTjr(2IxY$RoSTgm)AW*cq6{(x&zjEOFhbL1M>?!aNV(j=@zp#|{`w|1 zl#~j(HFm0a#HS}>Q#BS%`CGPMOk$t7BZQorll$I)VT}Bvx)-#>?UI?#CR;#I1`Oed z>il%3b>!@p{9LdGq)zdAkWGcK+cUvKS&_drd_vtp82i)PysYA@yat1AA#~4_@mF=1 z@4U)EWy2BIlY>yx4W-R&)%`=MO>%)`>-i5QV|%3+17s5=OwNN9xV1IcH83A`_BeLL z;~DL`dvrSHjx7<(plSzJmJo0wXtk0^ie$x00ATSQSDj}`P3(G!VG zISpGkg)d{*bRS4kV+>wL#kN0;D=JlU#>?~Dzh{hAsLcGG`P#@jPW7FR(>*GvAy| z-WXu>Zk4QlEsl7*@ur%YN-lp(=>x#FuN-FIT&70w~sZF-Uit+`_V%Qt8EiJ1q^KU89AqpdX!>!m;Oy<)Pq;>%S+9-d80 zuxf-7GHtXy;k$W#b#X*~aue8SQKW6t#qJkY9W;1Bna$f3O?u_cQh%b~j&^w>`_(q; za3V0&b&fsig&?(%oISs>mj+RUGYrS!CL)=k}9xL^%HQz&f z*dh^L!pK5&u-ZJX&l>))Q}v#$ViR`ZG-Bt=i^-X=$?n2wo0d66_{Jk4-5BQK_nNA$ zi*^MO&P0(63*Hw++e%tRq{Yl@|r&aDxF6cV>W z{`jga!#f1x_*qr$4D`bx;kF{>t57aMQ6I`EVm1TuCB}h^g+ndh9}kAxABYsoqles< z#1ifWUNXx${`#b%I`ZB=s3)TnNo>=z+j6GHZrV*_G*GdY@-TgXSwQ*MdCUv~J{2YIiVf_EgPywH@um3wD&_H#-Hh=@G`Ih-2nSz=EJxiWIEy0lQEc=JAziCBS zo(YR7#+}c!YrOo+wn#UNM6iB(NK$($RCkEcMkw^xFa7I{Hip#t_MC~DAV!+b{rDwE zf+&15ic8Rnkai2laQ4;bEs{Ho5Q`f9qj%7v#|QYHrVM=EnLYX>yxYF^(xh2tKA0$= z4_^2Oii1c}oRo-CKDZY&Pb{BNlSJWoLqBt$)aq`aB>S(x$RseP{$575=A-8sbD!hb z$qS+N{jkqqxiOTsx{(9CYBF+z2Jod%nyqt`X%s^l-;Km&@uf8 zWG$V?FA2crJWxx2p^wm;c+OO zSk=H5E`OYCj4hl1-2Vy?|HJUH0(rRstekux0FZ-|6TlDR`U~Zgb2hetn2On2*nj~X zzoW#QOrKG}Czs#D=S@71pM!rJB#iB4!4M0}f4itVgWtXe@cjvY9?1SZc;508f(HgX zLwf&&_MQR7|4sP!{OT?y&cETrXCZ*UP2$E*;NP6%|7+$DM<-_qOJhd>7w7M&SH^#h zft-J)`AG{Xu@$p*g8XgxJ&_i~%-PcEFB0Z@Be|>wKbz zpBfp!Xle{`v;zRyfZS}H0LCY@(O!W432S{aS~wcpTS82o*z6oFn3#UAqvB|1=3@Fp zBmdur{Tp`${u6Wl^Hxb1KefA^#hV z9~%(J1$@f<`2g7dW#i!B=6DkDzib@9r#}BL8yDYG{r|%T8@D|KZ2M z!OQg|>3`Us-e&IqUiZny`@eoX|A*M8y#9MWAQ#_L;s0|DAn2dDIXfCZz0r=p;c<0{ yC-_;bXQWom&hDxH|0aUvY|WqQ{M-Y-yUNMg*wOj7y1*xpm=lGLPD)uC<^KUn5`&`v diff --git a/doc/doxygen/latex/structdynet_1_1AdamTrainer.tex b/doc/doxygen/latex/structdynet_1_1AdamTrainer.tex deleted file mode 100644 index 0a6082faf..000000000 --- a/doc/doxygen/latex/structdynet_1_1AdamTrainer.tex +++ /dev/null @@ -1,68 +0,0 @@ -\hypertarget{structdynet_1_1AdamTrainer}{}\section{dynet\+:\+:Adam\+Trainer Struct Reference} -\label{structdynet_1_1AdamTrainer}\index{dynet\+::\+Adam\+Trainer@{dynet\+::\+Adam\+Trainer}} - - -Inheritance diagram for dynet\+:\+:Adam\+Trainer\+:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=182pt]{structdynet_1_1AdamTrainer__inherit__graph} -\end{center} -\end{figure} - - -Collaboration diagram for dynet\+:\+:Adam\+Trainer\+:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=182pt]{structdynet_1_1AdamTrainer__coll__graph} -\end{center} -\end{figure} -\subsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1AdamTrainer_a4990f1adf7d703209f12333cd6956642}{}{\bfseries Adam\+Trainer} (Model $\ast$m, float alpha=0.\+001, float beta\+\_\+1=0.\+9, float beta\+\_\+2=0.\+999, float eps=1e-\/8)\label{structdynet_1_1AdamTrainer_a4990f1adf7d703209f12333cd6956642} - -\end{DoxyCompactItemize} -\subsection*{Protected Member Functions} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1AdamTrainer_a17f07f2cfcbd03641a12475b2c739a7c}{}virtual void {\bfseries alloc\+\_\+impl} () override\label{structdynet_1_1AdamTrainer_a17f07f2cfcbd03641a12475b2c739a7c} - -\end{DoxyCompactItemize} -\subsection*{Protected Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1AdamTrainer_aae8746433c7394dddc78849e49402f1f}{}float {\bfseries beta\+\_\+1}\label{structdynet_1_1AdamTrainer_aae8746433c7394dddc78849e49402f1f} - -\item -\hypertarget{structdynet_1_1AdamTrainer_a6089112f88ea42b5c178a3e71b405734}{}float {\bfseries beta\+\_\+2}\label{structdynet_1_1AdamTrainer_a6089112f88ea42b5c178a3e71b405734} - -\item -\hypertarget{structdynet_1_1AdamTrainer_a125ca67ff4ce57e896950102b26679cf}{}float {\bfseries epsilon}\label{structdynet_1_1AdamTrainer_a125ca67ff4ce57e896950102b26679cf} - -\item -\hypertarget{structdynet_1_1AdamTrainer_abae9d7b1df4a4bf4d849dbd2ededc2c8}{}std\+::vector$<$ Shadow\+Parameters $>$ {\bfseries m}\label{structdynet_1_1AdamTrainer_abae9d7b1df4a4bf4d849dbd2ededc2c8} - -\item -\hypertarget{structdynet_1_1AdamTrainer_a36fee69c4827e4a1de6fbcde35977305}{}std\+::vector$<$ Shadow\+Lookup\+Parameters $>$ {\bfseries lm}\label{structdynet_1_1AdamTrainer_a36fee69c4827e4a1de6fbcde35977305} - -\item -\hypertarget{structdynet_1_1AdamTrainer_a3e0f0cfdf210edd1c6e7c258bf5f480c}{}std\+::vector$<$ Shadow\+Parameters $>$ {\bfseries v}\label{structdynet_1_1AdamTrainer_a3e0f0cfdf210edd1c6e7c258bf5f480c} - -\item -\hypertarget{structdynet_1_1AdamTrainer_a641513dd5cba85c96e35a275ecf3f2b5}{}std\+::vector$<$ Shadow\+Lookup\+Parameters $>$ {\bfseries lv}\label{structdynet_1_1AdamTrainer_a641513dd5cba85c96e35a275ecf3f2b5} - -\end{DoxyCompactItemize} -\subsection*{Friends} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1AdamTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c}{}class {\bfseries boost\+::serialization\+::access}\label{structdynet_1_1AdamTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c} - -\end{DoxyCompactItemize} -\subsection*{Additional Inherited Members} - - -The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} -\item -/home/paul/dev/dynet/dynet/training.\+h\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/structdynet_1_1AdamTrainer__coll__graph.md5 b/doc/doxygen/latex/structdynet_1_1AdamTrainer__coll__graph.md5 deleted file mode 100644 index 0c729ea6d..000000000 --- a/doc/doxygen/latex/structdynet_1_1AdamTrainer__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -0c71a2112fe37eef9ffd95223670d267 \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1AdamTrainer__coll__graph.pdf b/doc/doxygen/latex/structdynet_1_1AdamTrainer__coll__graph.pdf deleted file mode 100644 index 829e7adad68ca2a40eb39c7730f05f55a6b4079a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11791 zcmb7~1yEe+)~+Eq1c%_zK#<_pxVvj`celnJf&_Qh;1=8o8X!0XcL?t8ejzh+&YU@a z-TU9YyL$Kc?)BNb*6!-AddTF3MQIu7fbe8>hvoP1%m4;}t$_tRH#dM@+Sta_(G0-y zA}PWH004SXb1O$<(96|I-_cmu*wEI<7@n6G-oX)MtZxnPnx3y9BiF_7w)I~1CK*4L zW0;MNia1XK-*>ryfV>{*XQ;4%;Dbl{yXo)X0R_VJk%sLzbEA5dU%jKk5Lcg|toW5s zafOOvySzWsMn}>q1@g&_$|k)~_h3oSmZpmbhPz42 zvqd|NaNIF8Mq(xX6p^*$RI3femTXW^&DRTAaSlg}er6brF146K%&Cp)O}J_JDIe7v#DPON!7b&{(1MDb)fx*M zH(4Wxlu;uNUTI3)>dp-(k|^ye!=K?TLO&T1-$i|JZ|PcCX_7R2x}i?!&;Rm4dEM5n z7CCw80@UGgL#W;b^aPW||6C4lY-9ANUoW3toqo0V_4;Bk69@C_{nr-Lzw+?gc@bAf zF(tFS&TR@y9#8sI86T-=a-u8E6>*z`t_& z67=%=b28R{O$MO<=w@dOpqJM-HU2%ZygtbIWgN!8`q9f68=311+PVTXUnB+qBRdm- z5y%SA{v9p!GUrRU1K_oc{-_x-kgb#5-`4TR_`lV^Hlp-0D@fnQ!R~b~L$|+V34kNW z>GvvLcPsP~C2Z_$ZfLA1Cioii=Qb6M9c-OIhQou(1$(>KVZU$W6sBe(4iZRbAEUQO4Bk(xkJ+LDXOGlls8q0( z0i3DX6B3-9Zi2)r(+mO~x=~=Fv`z%%?-Esg#MmJrA;C;CpAEni^{|2yAbg*Q-pDDi zRc7SI@yvpgLq>bTFU$!HfvY%Y%1+aPMF&F7t~CU)_90mzMElJOq^ILAfrZCPKYw)7 zpoH0<2!zQ%I)Od_3*t?<=g(-?(yI;XOoyDCqs^imT){{SBTIw8 z{_&J2L2;-@yleLC0i@g6X@`*#_@Z}SxW+U0?9pINfWJi0@Q&r~xfuT;h#M{B-Ab!GMaTHlL_|Lie&z;Z43(w4jPt&mvWfu)1 z&xV0a<<8DN7qO>u^x&C88*k(xAL`=>VDGYS0Up5_+s_PZd`wOqK1ajP8L{|pFFyJ= z`X?;4<09&PZtUad?s!*%lH7FZlX591IN15-ZJj^6uQGu)puHUrOa+NB@>$kGLukmF zpo5N1&ilz9f=lheLBrV`#z71r*dNn3?lTtHCqaSCoel~-(Af!C3p<$H0?ff_FA`W~ z4F~)8%pkCIEqz|!!q(8I`#L_aq}gGD!^|xo_-EABP4LRF=fImL@PkwzVsKtCt{wVr zaL6~av`>g2u-VRM=&S(1Gc**~!Ih6tWMLK3i?HSQgtq}z+4U5ZE;o?r)8T_*djucI zi?f4_%;&VFJBxO90o|d8T*+}ad{5fAk)^p|3MIkFEZC0m3maE?6t*k+SgN1X%oH2{ z=P7QYXyWCxjD)2!AJ3O2B5bYkBcE3CBi2sUjQ2t&LEj-iQvuqSRf)7~gpmUk zZU=4le2<<3H(jc^96wpflyLr|QzIOuR9$Iz{k*NE({r+3lJf7oGzu{%`! zij${zTx~SA2l07hwU}p|E`0zA!h?F^5KY~rqWazMvjR0^vK;n-v9BI(?Cu zcm^2CIMdZIN?bzcxOF>-#R(W_n>RoD&~Q@)Z=eEHC)ngsSx@KT)0OLGhk8p|bMN%u zH&od$ti{^&1f*MCZCD--XqnBcFg2)jDs$A%sK?Plh+_4lb#mWwmhzU_rpTOkkneij zGg(B07=Dx5i_&XA@@^DUIA7-CPsjRvG;$N2Ke;^R0a{pJN}Z&!-?iQoNjYr1tv&qp zzI~@!$$mM_O`5Np_$Vs^lZN+Osa7gEts6;p{AN?~)^Xe&1r;g2T8E$Xy@gA;S%FnzPAO(lL^({xMEyPWxLCU<)KZc3E;`~!3Yl#ZjV$BG=)+hig%yLi}7 zJeF(=zmn+TO3_U@Bg|)Ks>x?5Pq>iizl9}fC zrc*qpkBte>Q-+H7&KnpWh7=X(veJ$H~KbPL51oWvob3_y4ZJDmk*p{lCvljF3Ly! z+f=_y&0w<)q=8w zk|Do7Bt+sYY1bIj7*|^gce>e5rP|XyE!!i^GCN`~%-1D}2``iXHJkV2y|A3*k*3l5 z)XwfY!Tuwdn3&FcnOjX|lOW@4pyIt&h zrJ-d#I?H=UAZx%&0VThN8J&WzpoK`Tbmkma0#)Og>%8dNAoQUoq5bs$Y}sP!=&;_0incCy{bH7KWj;x> zYIC-6gak-frgCWJNzI(ndbWFBlzIalVcuqw0q=jHt zIDdq@a0Y=mQQhD2qtJ?I^GEc%ggU~Qe4*2({iq8#8eKl;B2mhR9rdq~`Jq_N)X;{< z4Nmb|&#}}YRepYnI>p(6j)oj1?pZ31qv#o!$#IOH6&S`vi^c#)}@GyV_IhGdNYUo zsY6Od?#pca@(=Q(Hf0C@E1bK&O4jqP4e3qTCkD5@s8YNic?VgxWe-qA^6%c<9DHNI1AMrN<&^G=#=8jRKC(6Jixr!w}kj(ZGf&^)|(QZHlt?q#DZ zei#BeO1w=n|IP~W%MtYHiVQBLWWLFUs~>Ea-@*dr%(Sy!L?inkT2-qr!ZjNzhouPV9V(Sw9<**Hc>}J?plLLXU6ZQzAeAov08;Z{WLt|J{pNG^f{VrE`uN@iuH`x z&^a5!n4kd*N<6Fz%MQt62*ArZ+Qoye)IiKPhodOzrUyds&y&XzuLS~}{j-6O8rX4}~J@^-qcNtMDRC!`6G zkkj6O)Qj_7-Tg`Siwbk2h~_4@70Q7-1O9xThgV25)uSIP(l%V<6femZ#%II6nQtT0 z2-+x8dJ>5XY@Ab|-kce~LePX{82KD84?cm-v46eoj6O281gfsZvE9MWJN^>eJVYb_tQCbM|2q z7|?D=%V=9pctq1swu8d(sTCGI2o|zgTAvlW=7$V}A#r+mu(O$T4c2m9?BSWi?0z{( zokap-Y|{vY5&0P$mDe~Ea-*a(c%bFa?Aphp_`MjT#=IaU-9;KpDIa|bDYhwB#zaSnLD+X*b4yStUSL6!g0qlLh zg^GGzHVKxb4C$ji*w8c6tYnPLDpXx1VtZqAxTMcT`akY{EQg>$S}qug3_jG34iput|&;?4(eV~;Ow4woaNqH^3QuM^XWMK7IXJM#|GH@xFX zc`Up{6!V7z&MyHE8Km`)N$^8LmsyY2$b}f4tR+}fx)~*P!0ll5b=(M7J4ln7+6+cV z>ymkV`l39Koq<-K8hgRv6%WLtz9@h+$lhQz^6QZjhhwk0z(ZAmorGX0&9pax;9BJv z(u)`2X)MuFnjmJ2Qq`x0CAmFkWjs7R22K$IEnhnNQ zgZ}rGlHc_O6vzr~O=*p@j4XXz$#m6JGnLJ6JK*GqK4Y-08smJnQRJ|@yjD%(x5<5o zQqoq9iPO!b*$;$p|62dBUxkKQV9KZsC&W+ymzyfwRWX6ZPXD^?&naE*?;Bm{U#!%RTLAGi0LW4HUx&GV7CGtnThv@9UE zX-gjNM%5hc={J+PL;PsD)!!D?T`rcYr8ut(fO@oURz+ek@_X;p1I%V_3idHCkRC-L z$?j>f4)mZ?p6OG*urNmM|GGTP6ine&U1I>D`r+d$*_FXbt*!!Q^ZS{L&v%cR-IkUZ z;G!9vGM9)UKeetJ*-|s!61FlQYR75m00Wb}HC77gqi=uVzWMg}ae{iN>ELTCA~~d1 zhWr8xS66lAP{ExD@@WsdZh$7%gfV1GN;!5;E@l&cxF=4+GpDc4U_AQ(*-T;Q$7pQ* zdtbJ;BK`9YgqS#3w*K=e42Uo&lg1!7kZYevHwAub@ge+E6=Lqzbmc(z<6G^sj3v5H zf`S@$<@vKl0yq+iVmCtL!qqWTkM6g(UgyGjgA`WP8rli7EKvS-@oNF^1ng_p;BOR^ zR_r&E$>td39!Iay@VdSwETzBMvdlh@_>R#?th-COxZO{S%HCIjAgs&Jt3FVh7NIdS zbZ)5*nN7&zmgN`U3rh)0>QYV+9bwpb41MRxMz^*@3BBTnhI3ilN-%1>fR7Of4nz#Uzh(l@ymGT96!D?jhZ*A=*-NecPpf%C3&Ul#XK) zSD7EQMmZh#i0tegO6#e#2|@f#lui&QN>)WSEPM8a3tJcIa|dBToJ%BHWS=gmAkx$D z@q~NN4^cpUt&)D_<@YY`r>eJa76G!S@Inm)&X2 z_62ix+q!Tte@#E0lP#ZFS|t3!$_IG4iB8g1%Qm+S5XdEy zwiUBA3rco{yEv1491(VtxMs15R#=3n^FdHDsxL94F`Jd6uw&b&z(n_~ZgRQoM|J%g z`UPs=aIBj-+&Weo^_Sq!XcSjIP=Bq;`~Xzs&Vz<^wPaSMHrg>2ftv+#mBli$>d|VB z^x3bD-9_`TAJ4p&Wb2_B*idRp`KbynSx41gLv7>*`Bq^5=ZwfLdCVi$1fwg@Lw>;L z@Cj18MOjV5hXg&tA(~s z$Ng;n>@y9D7(@Gp)!JGn1@$KjGz0}|%=!lC+H@bN4kPltE3mlC6A3rxiVoK4H>Cy? zaR`L7)br_}Phl?ob8o1k-hCyS0V`|{T`7jY5tP5fn2JMwmC#PW`%{L<4|#$`zkmqaN0&@jyQTgE zfaC~_o-e7>?yw?QfR)=T0nJL9x;ELj8C2(#q$Jkp#-I>$m!P=X_$AwyjZs;|85Fm{ z6`%wAC=6OnH#7=t(g$rSoAdB=We#0&bx4gF+Ye66rhk=Yh8}nbCepe!+Cn27ayqte zo}m(Y^H6C_VTaI$8#5o~wt$;H5|ahrgWi*rfHF(~gPDNrrO0`B)H$iAh?$6-g{c`+ z4K;6WicH>6lDW%Bf~w=A#7<70+8gxTf@)uSlgPBA_Q;HtSAC#OMyM@c8h;ThN`pYX zIr3AhE0wu#96j#ba|%}%Kl|ZJgO#C$z?b;l^m>p*#_G3cv5TICDzh|q5#88}{6|BM zx9R*u-(fB4z8|s_Hf&=zam2*Hx`4u>pe&z0F*A$@(Mv<*Kwdpr57okD27rGtYg!w^ zPS`OR(CLI~zmQ1cp_Z6>pL6egw_RawX-^qDOFPQX>_{lSpITaCx2BQXH|xSmoe@LD zU?LltsoB=%eTN}56%}1{`)mDRD_4x&(KvaT%ipcTDT#D=Jbj?)G;Dm_+;P9r z(&0I@b24O22{>5fwAys6QB+nYA4!8uo~AWIIF1TlWq@L29qt zR*ePAVS!)w6psrbpkJo4@zR^?JO7bVuMb_*N|{`@kJVPx)>kUxcO|a=;pqfZ`ZBdd&e9c;RXTq{~65jD@wT7hnCn^a++-S4baWic`A8kaOIM zXOlGY;liX(&Z;VM19dnA*d_fjG)qv^%V-2X#a_2ASjA*0Z9XQpV3o+oAQT?X1;w0l zb=e)OC8p&fy?v;#;wQ|+)cZ#H!v?pcDcW8G#WdSix-twG`^8yd?XUZ3m#fd6-Vr>$ zv*r|G*@s~VA|xhx(YZ*ck|$ZGX-X$E*Af=>L|Zze@%Sxgc>cCdF^I?ny<)3dEz1_v zvjvYRA4xQ~op-uDyGnO_fK!Dme1rPj{be8O?r3d}jmtVLv2uQz>VK7Xylwha-kSaN za7XB%)cn=J0CkgiQ}`Hk_&Jm+xQIsqjH*13JEo?o1|kS5(cTnvp)i3@| z2N%K3=$@C9xZ__vm9fI8H#@ac-_@3tJ6H@_EZRN4e-fmfSSGsHDb&~E3=9|nQ%s~A zpN(ah8?xHi=H~Z%^YL+9RHqi~(HeZK!(G!%e>lS zF7rpm+RkR){Uq@;q^39_-3k~eXLVVqhwx6Gy?~W*Pp*EOYIp@Vl1XWS8Yx@Voy!-{ zDm&6U?EEd{Fgv4&d-PD)9No6r!N!I*zA4zL{7O^zILo{I=z!hW(O%!sieziOSnKHl_`Z|Ys=4}e4%jD>Qw@taBrN`iyDuQ(!}`=|Hc9taR0<-FTNXEHUFVo_#Pe)4CG zR5^R44Q`O>bVKsDlW8tlhd}5{?r3K_KENv(A-`8IaS}ymgx%S9myUzIk|h3+d*Dw? zjvO%t)-t4&Xi#0lWuG{Mwx}^aD&5Q;CN9(*6qZH`p6BJ)fJond7Sk=ec{TJYo7YQt zRLE+XzEf47>4X0VsA>xMyTpu#)@TL#(@zJg<*g$ziU=y_cb3voe3Z_`!s>Y#9c}?0 z3sFB#C&hGP70Z<9V1hm$uRBQ=B__mP3!?;PM0m@Uw@rT&N4kg?`!$zq&NcgqQ$DtJ%Vv=k zM+DE1l6cR-Cl3#WDZA>iEJ}bDb0Q(sQ>BLW#fejc7MSrKLQ zB{$k2hD)yS*)0y0T+rE4>FLmMdfAWsDQFH-8SplX(rg(%Sx5HNajzQ*IBw^UST4D} z(H0nF6wcZ_Vs9_swDQU*bYih-W>mQoD(E^H^A3V}$T7onemk~+mZW#4^Rk4(ij@b) zK)hl@6_D|_qOzO~*hZKQmna42TdDEUQfVvVy!U%B9+Y!Za}D+DnpyH#$oPIvQtICY zZ-IsmOV?Ki?q?G!SVyHF9ZYo$yb9aQK(fr13GnOL_j7FD86N8_JBq+^yzIiHQl66O z@y^CrLT@@>5MpW-ydC|teX6ZLL^)B<#W}ZxI4t1}iUpR^u*q(SRd&#szx#!27#Dg_ zls*YT(Tj9;m57?slk*{I9R?3U8JiUFAu zCs(7zqtB~sTuv9Yv70u-!^AwHa=lDQZI%(U z*tx(A&<MQEM39ViS`F{%~o`Lb$) zy|z%}3R|EM&U`hset$zI^j$zb_c0~A9X<2u9>NK}(8ePr8^gemFc9L6*7Hqf-K@+{ z%PZ!vnt&tkl{Wgt`gN5>ZZ2+Yh*4Z)65vnZnT@)Q|2-^2`=?1|Ci>;376)nSDc)L{EtUsK%2<)~$?+ocqY9UmbJ8sqkB2k&Wa8>8kT43p5lKL^b;5=I0~7rM`>y8h7i+BTHk z?7y3~(rN|EQi)z?3;4lK%nz>hRL+IN!bMLpzZK~0V8ExI_Nz?%Tl(-~1$L>Ju{0Ux zp;5x-$d>L-y_LT4nFA-)$EZ% zS};}E~kmiJCrN; zQ@d22{VI_(OrAYa-Nixx(@+qkPmzz8<(Y+P(JXE zDv<@NU)|9nU%d;9bn=dl2sj%eYz>8Du|k+HyowaQ;lS=nsWpAp_~d$6phJ3^-a8Z? ztwkzcSo0*E;2G`5?k9ae*1FqER=g7Y0E|2v4S^2)I5qq0t)j`$Xt}b|9P|&f4<1;Q zT;f=#2$3Fn;E~lHuEnJi+U%G~4YU&J6lb$17>lAToMf1{+82~JYFmtW&)bqM=@LCNrmo=+2NBiElg&!V<{LsOK6|MGS-5W=_2C zL!p<+*~c&1Mks!wfJ>q6nmnrH0C1*<)%+YZPyBBRh`ZjE;1jk-(#oI55#SZwf0)t8 zYf|9d{m2u7ysq3kAi@rJc`a8jN}1WW^jU;+C#bu~S%i)2#MGqfV*u|(lP+f$ZN-U| zc&qip&j)UD_tYt@Zy}1#e8E0@+#J;(*rXcda!xRPCJf#a-}*mJXDrh{ewv#3Xu=fl z&DmdTaG>cH94qP1@Yd9(5g|r^v)%UU&YFa2f&2Q~ke=VQ+uSwqzF^G$X(ztgw*pZ& zw>jPKZC{SBzil>$XK*tD#D0An3FHUhZ4Zwm{fFSm1B5qzum(ooRlpZY&U;k(21&_R z>F0smB>b)cYULjK&X>U?UXUe9f!Tg#??1Q1+j>}#nksM>27lc{q19}3yQ%B>7{=!v z+*$qf@l4Ona&D51lxolAzD%_lJTS@4XRj-YL7V2dtD)eLqBgK1k1jet1;&)+`{+6< z=&jt!&Xoty>Sw){&GoG7a0;i78vjN(Ez9Kl`e0EUNfqYlcmQ2K$W7e!S^Vkpfy)zX zv^yb3a;nZERBt#w+RZp3*2L6QOOK@wD1?r&yZ1dlci2y`W;?fdiTan89(bO~1|F@y z5}ppZOeuQ4R>xiMhrsW0^g|zhJ#YFwJwrWZp)fQ+_Rfi!~vlk_BWyCA&Bf5RUwGPluAPh-?zHgrkN$<>rd>HALPEl0q!}ON25wRs(d1 zU1z`AbnTb$@CI$2O&adfK5iSSZnw&L#*ys1ye+gY=x?T*bT=JfU)+)5{j1Oq+C~jO zM3i3hvFAp}*R;U|rbc>TKFJKhDzhHLhGm0{DQt2176{{zr%8`VBmjm`1klqP6m#@p}xl z1^fY+~pzo+QGYx0%SbolLvl)2HXAFr!W z{1=Pq^a^hN4Txm?H&ptu&xeP5<4= z6=ZAz|H7HFz%%^o0I&jq%s_w%;17+Fk@3~b*8^blr^dj*!tj#Ue`pMhFLnM8jrrvn z{7;SXoaCBOfnF)}c|+Wb%LWwrm*SU6tD-+#mb8UMNFm(f^W zZ2QkRMrO8`V)#pQ1nIv#(V*YRwvxHK@vB#_D668a?MwduP2x(}n7riqUzDtaqdv&- Tx4VptEKDr$WMm?8qVWF*x!e;N diff --git a/doc/doxygen/latex/structdynet_1_1AdamTrainer__inherit__graph.md5 b/doc/doxygen/latex/structdynet_1_1AdamTrainer__inherit__graph.md5 deleted file mode 100644 index 0c729ea6d..000000000 --- a/doc/doxygen/latex/structdynet_1_1AdamTrainer__inherit__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -0c71a2112fe37eef9ffd95223670d267 \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1AdamTrainer__inherit__graph.pdf b/doc/doxygen/latex/structdynet_1_1AdamTrainer__inherit__graph.pdf deleted file mode 100644 index 829e7adad68ca2a40eb39c7730f05f55a6b4079a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11791 zcmb7~1yEe+)~+Eq1c%_zK#<_pxVvj`celnJf&_Qh;1=8o8X!0XcL?t8ejzh+&YU@a z-TU9YyL$Kc?)BNb*6!-AddTF3MQIu7fbe8>hvoP1%m4;}t$_tRH#dM@+Sta_(G0-y zA}PWH004SXb1O$<(96|I-_cmu*wEI<7@n6G-oX)MtZxnPnx3y9BiF_7w)I~1CK*4L zW0;MNia1XK-*>ryfV>{*XQ;4%;Dbl{yXo)X0R_VJk%sLzbEA5dU%jKk5Lcg|toW5s zafOOvySzWsMn}>q1@g&_$|k)~_h3oSmZpmbhPz42 zvqd|NaNIF8Mq(xX6p^*$RI3femTXW^&DRTAaSlg}er6brF146K%&Cp)O}J_JDIe7v#DPON!7b&{(1MDb)fx*M zH(4Wxlu;uNUTI3)>dp-(k|^ye!=K?TLO&T1-$i|JZ|PcCX_7R2x}i?!&;Rm4dEM5n z7CCw80@UGgL#W;b^aPW||6C4lY-9ANUoW3toqo0V_4;Bk69@C_{nr-Lzw+?gc@bAf zF(tFS&TR@y9#8sI86T-=a-u8E6>*z`t_& z67=%=b28R{O$MO<=w@dOpqJM-HU2%ZygtbIWgN!8`q9f68=311+PVTXUnB+qBRdm- z5y%SA{v9p!GUrRU1K_oc{-_x-kgb#5-`4TR_`lV^Hlp-0D@fnQ!R~b~L$|+V34kNW z>GvvLcPsP~C2Z_$ZfLA1Cioii=Qb6M9c-OIhQou(1$(>KVZU$W6sBe(4iZRbAEUQO4Bk(xkJ+LDXOGlls8q0( z0i3DX6B3-9Zi2)r(+mO~x=~=Fv`z%%?-Esg#MmJrA;C;CpAEni^{|2yAbg*Q-pDDi zRc7SI@yvpgLq>bTFU$!HfvY%Y%1+aPMF&F7t~CU)_90mzMElJOq^ILAfrZCPKYw)7 zpoH0<2!zQ%I)Od_3*t?<=g(-?(yI;XOoyDCqs^imT){{SBTIw8 z{_&J2L2;-@yleLC0i@g6X@`*#_@Z}SxW+U0?9pINfWJi0@Q&r~xfuT;h#M{B-Ab!GMaTHlL_|Lie&z;Z43(w4jPt&mvWfu)1 z&xV0a<<8DN7qO>u^x&C88*k(xAL`=>VDGYS0Up5_+s_PZd`wOqK1ajP8L{|pFFyJ= z`X?;4<09&PZtUad?s!*%lH7FZlX591IN15-ZJj^6uQGu)puHUrOa+NB@>$kGLukmF zpo5N1&ilz9f=lheLBrV`#z71r*dNn3?lTtHCqaSCoel~-(Af!C3p<$H0?ff_FA`W~ z4F~)8%pkCIEqz|!!q(8I`#L_aq}gGD!^|xo_-EABP4LRF=fImL@PkwzVsKtCt{wVr zaL6~av`>g2u-VRM=&S(1Gc**~!Ih6tWMLK3i?HSQgtq}z+4U5ZE;o?r)8T_*djucI zi?f4_%;&VFJBxO90o|d8T*+}ad{5fAk)^p|3MIkFEZC0m3maE?6t*k+SgN1X%oH2{ z=P7QYXyWCxjD)2!AJ3O2B5bYkBcE3CBi2sUjQ2t&LEj-iQvuqSRf)7~gpmUk zZU=4le2<<3H(jc^96wpflyLr|QzIOuR9$Iz{k*NE({r+3lJf7oGzu{%`! zij${zTx~SA2l07hwU}p|E`0zA!h?F^5KY~rqWazMvjR0^vK;n-v9BI(?Cu zcm^2CIMdZIN?bzcxOF>-#R(W_n>RoD&~Q@)Z=eEHC)ngsSx@KT)0OLGhk8p|bMN%u zH&od$ti{^&1f*MCZCD--XqnBcFg2)jDs$A%sK?Plh+_4lb#mWwmhzU_rpTOkkneij zGg(B07=Dx5i_&XA@@^DUIA7-CPsjRvG;$N2Ke;^R0a{pJN}Z&!-?iQoNjYr1tv&qp zzI~@!$$mM_O`5Np_$Vs^lZN+Osa7gEts6;p{AN?~)^Xe&1r;g2T8E$Xy@gA;S%FnzPAO(lL^({xMEyPWxLCU<)KZc3E;`~!3Yl#ZjV$BG=)+hig%yLi}7 zJeF(=zmn+TO3_U@Bg|)Ks>x?5Pq>iizl9}fC zrc*qpkBte>Q-+H7&KnpWh7=X(veJ$H~KbPL51oWvob3_y4ZJDmk*p{lCvljF3Ly! z+f=_y&0w<)q=8w zk|Do7Bt+sYY1bIj7*|^gce>e5rP|XyE!!i^GCN`~%-1D}2``iXHJkV2y|A3*k*3l5 z)XwfY!Tuwdn3&FcnOjX|lOW@4pyIt&h zrJ-d#I?H=UAZx%&0VThN8J&WzpoK`Tbmkma0#)Og>%8dNAoQUoq5bs$Y}sP!=&;_0incCy{bH7KWj;x> zYIC-6gak-frgCWJNzI(ndbWFBlzIalVcuqw0q=jHt zIDdq@a0Y=mQQhD2qtJ?I^GEc%ggU~Qe4*2({iq8#8eKl;B2mhR9rdq~`Jq_N)X;{< z4Nmb|&#}}YRepYnI>p(6j)oj1?pZ31qv#o!$#IOH6&S`vi^c#)}@GyV_IhGdNYUo zsY6Od?#pca@(=Q(Hf0C@E1bK&O4jqP4e3qTCkD5@s8YNic?VgxWe-qA^6%c<9DHNI1AMrN<&^G=#=8jRKC(6Jixr!w}kj(ZGf&^)|(QZHlt?q#DZ zei#BeO1w=n|IP~W%MtYHiVQBLWWLFUs~>Ea-@*dr%(Sy!L?inkT2-qr!ZjNzhouPV9V(Sw9<**Hc>}J?plLLXU6ZQzAeAov08;Z{WLt|J{pNG^f{VrE`uN@iuH`x z&^a5!n4kd*N<6Fz%MQt62*ArZ+Qoye)IiKPhodOzrUyds&y&XzuLS~}{j-6O8rX4}~J@^-qcNtMDRC!`6G zkkj6O)Qj_7-Tg`Siwbk2h~_4@70Q7-1O9xThgV25)uSIP(l%V<6femZ#%II6nQtT0 z2-+x8dJ>5XY@Ab|-kce~LePX{82KD84?cm-v46eoj6O281gfsZvE9MWJN^>eJVYb_tQCbM|2q z7|?D=%V=9pctq1swu8d(sTCGI2o|zgTAvlW=7$V}A#r+mu(O$T4c2m9?BSWi?0z{( zokap-Y|{vY5&0P$mDe~Ea-*a(c%bFa?Aphp_`MjT#=IaU-9;KpDIa|bDYhwB#zaSnLD+X*b4yStUSL6!g0qlLh zg^GGzHVKxb4C$ji*w8c6tYnPLDpXx1VtZqAxTMcT`akY{EQg>$S}qug3_jG34iput|&;?4(eV~;Ow4woaNqH^3QuM^XWMK7IXJM#|GH@xFX zc`Up{6!V7z&MyHE8Km`)N$^8LmsyY2$b}f4tR+}fx)~*P!0ll5b=(M7J4ln7+6+cV z>ymkV`l39Koq<-K8hgRv6%WLtz9@h+$lhQz^6QZjhhwk0z(ZAmorGX0&9pax;9BJv z(u)`2X)MuFnjmJ2Qq`x0CAmFkWjs7R22K$IEnhnNQ zgZ}rGlHc_O6vzr~O=*p@j4XXz$#m6JGnLJ6JK*GqK4Y-08smJnQRJ|@yjD%(x5<5o zQqoq9iPO!b*$;$p|62dBUxkKQV9KZsC&W+ymzyfwRWX6ZPXD^?&naE*?;Bm{U#!%RTLAGi0LW4HUx&GV7CGtnThv@9UE zX-gjNM%5hc={J+PL;PsD)!!D?T`rcYr8ut(fO@oURz+ek@_X;p1I%V_3idHCkRC-L z$?j>f4)mZ?p6OG*urNmM|GGTP6ine&U1I>D`r+d$*_FXbt*!!Q^ZS{L&v%cR-IkUZ z;G!9vGM9)UKeetJ*-|s!61FlQYR75m00Wb}HC77gqi=uVzWMg}ae{iN>ELTCA~~d1 zhWr8xS66lAP{ExD@@WsdZh$7%gfV1GN;!5;E@l&cxF=4+GpDc4U_AQ(*-T;Q$7pQ* zdtbJ;BK`9YgqS#3w*K=e42Uo&lg1!7kZYevHwAub@ge+E6=Lqzbmc(z<6G^sj3v5H zf`S@$<@vKl0yq+iVmCtL!qqWTkM6g(UgyGjgA`WP8rli7EKvS-@oNF^1ng_p;BOR^ zR_r&E$>td39!Iay@VdSwETzBMvdlh@_>R#?th-COxZO{S%HCIjAgs&Jt3FVh7NIdS zbZ)5*nN7&zmgN`U3rh)0>QYV+9bwpb41MRxMz^*@3BBTnhI3ilN-%1>fR7Of4nz#Uzh(l@ymGT96!D?jhZ*A=*-NecPpf%C3&Ul#XK) zSD7EQMmZh#i0tegO6#e#2|@f#lui&QN>)WSEPM8a3tJcIa|dBToJ%BHWS=gmAkx$D z@q~NN4^cpUt&)D_<@YY`r>eJa76G!S@Inm)&X2 z_62ix+q!Tte@#E0lP#ZFS|t3!$_IG4iB8g1%Qm+S5XdEy zwiUBA3rco{yEv1491(VtxMs15R#=3n^FdHDsxL94F`Jd6uw&b&z(n_~ZgRQoM|J%g z`UPs=aIBj-+&Weo^_Sq!XcSjIP=Bq;`~Xzs&Vz<^wPaSMHrg>2ftv+#mBli$>d|VB z^x3bD-9_`TAJ4p&Wb2_B*idRp`KbynSx41gLv7>*`Bq^5=ZwfLdCVi$1fwg@Lw>;L z@Cj18MOjV5hXg&tA(~s z$Ng;n>@y9D7(@Gp)!JGn1@$KjGz0}|%=!lC+H@bN4kPltE3mlC6A3rxiVoK4H>Cy? zaR`L7)br_}Phl?ob8o1k-hCyS0V`|{T`7jY5tP5fn2JMwmC#PW`%{L<4|#$`zkmqaN0&@jyQTgE zfaC~_o-e7>?yw?QfR)=T0nJL9x;ELj8C2(#q$Jkp#-I>$m!P=X_$AwyjZs;|85Fm{ z6`%wAC=6OnH#7=t(g$rSoAdB=We#0&bx4gF+Ye66rhk=Yh8}nbCepe!+Cn27ayqte zo}m(Y^H6C_VTaI$8#5o~wt$;H5|ahrgWi*rfHF(~gPDNrrO0`B)H$iAh?$6-g{c`+ z4K;6WicH>6lDW%Bf~w=A#7<70+8gxTf@)uSlgPBA_Q;HtSAC#OMyM@c8h;ThN`pYX zIr3AhE0wu#96j#ba|%}%Kl|ZJgO#C$z?b;l^m>p*#_G3cv5TICDzh|q5#88}{6|BM zx9R*u-(fB4z8|s_Hf&=zam2*Hx`4u>pe&z0F*A$@(Mv<*Kwdpr57okD27rGtYg!w^ zPS`OR(CLI~zmQ1cp_Z6>pL6egw_RawX-^qDOFPQX>_{lSpITaCx2BQXH|xSmoe@LD zU?LltsoB=%eTN}56%}1{`)mDRD_4x&(KvaT%ipcTDT#D=Jbj?)G;Dm_+;P9r z(&0I@b24O22{>5fwAys6QB+nYA4!8uo~AWIIF1TlWq@L29qt zR*ePAVS!)w6psrbpkJo4@zR^?JO7bVuMb_*N|{`@kJVPx)>kUxcO|a=;pqfZ`ZBdd&e9c;RXTq{~65jD@wT7hnCn^a++-S4baWic`A8kaOIM zXOlGY;liX(&Z;VM19dnA*d_fjG)qv^%V-2X#a_2ASjA*0Z9XQpV3o+oAQT?X1;w0l zb=e)OC8p&fy?v;#;wQ|+)cZ#H!v?pcDcW8G#WdSix-twG`^8yd?XUZ3m#fd6-Vr>$ zv*r|G*@s~VA|xhx(YZ*ck|$ZGX-X$E*Af=>L|Zze@%Sxgc>cCdF^I?ny<)3dEz1_v zvjvYRA4xQ~op-uDyGnO_fK!Dme1rPj{be8O?r3d}jmtVLv2uQz>VK7Xylwha-kSaN za7XB%)cn=J0CkgiQ}`Hk_&Jm+xQIsqjH*13JEo?o1|kS5(cTnvp)i3@| z2N%K3=$@C9xZ__vm9fI8H#@ac-_@3tJ6H@_EZRN4e-fmfSSGsHDb&~E3=9|nQ%s~A zpN(ah8?xHi=H~Z%^YL+9RHqi~(HeZK!(G!%e>lS zF7rpm+RkR){Uq@;q^39_-3k~eXLVVqhwx6Gy?~W*Pp*EOYIp@Vl1XWS8Yx@Voy!-{ zDm&6U?EEd{Fgv4&d-PD)9No6r!N!I*zA4zL{7O^zILo{I=z!hW(O%!sieziOSnKHl_`Z|Ys=4}e4%jD>Qw@taBrN`iyDuQ(!}`=|Hc9taR0<-FTNXEHUFVo_#Pe)4CG zR5^R44Q`O>bVKsDlW8tlhd}5{?r3K_KENv(A-`8IaS}ymgx%S9myUzIk|h3+d*Dw? zjvO%t)-t4&Xi#0lWuG{Mwx}^aD&5Q;CN9(*6qZH`p6BJ)fJond7Sk=ec{TJYo7YQt zRLE+XzEf47>4X0VsA>xMyTpu#)@TL#(@zJg<*g$ziU=y_cb3voe3Z_`!s>Y#9c}?0 z3sFB#C&hGP70Z<9V1hm$uRBQ=B__mP3!?;PM0m@Uw@rT&N4kg?`!$zq&NcgqQ$DtJ%Vv=k zM+DE1l6cR-Cl3#WDZA>iEJ}bDb0Q(sQ>BLW#fejc7MSrKLQ zB{$k2hD)yS*)0y0T+rE4>FLmMdfAWsDQFH-8SplX(rg(%Sx5HNajzQ*IBw^UST4D} z(H0nF6wcZ_Vs9_swDQU*bYih-W>mQoD(E^H^A3V}$T7onemk~+mZW#4^Rk4(ij@b) zK)hl@6_D|_qOzO~*hZKQmna42TdDEUQfVvVy!U%B9+Y!Za}D+DnpyH#$oPIvQtICY zZ-IsmOV?Ki?q?G!SVyHF9ZYo$yb9aQK(fr13GnOL_j7FD86N8_JBq+^yzIiHQl66O z@y^CrLT@@>5MpW-ydC|teX6ZLL^)B<#W}ZxI4t1}iUpR^u*q(SRd&#szx#!27#Dg_ zls*YT(Tj9;m57?slk*{I9R?3U8JiUFAu zCs(7zqtB~sTuv9Yv70u-!^AwHa=lDQZI%(U z*tx(A&<MQEM39ViS`F{%~o`Lb$) zy|z%}3R|EM&U`hset$zI^j$zb_c0~A9X<2u9>NK}(8ePr8^gemFc9L6*7Hqf-K@+{ z%PZ!vnt&tkl{Wgt`gN5>ZZ2+Yh*4Z)65vnZnT@)Q|2-^2`=?1|Ci>;376)nSDc)L{EtUsK%2<)~$?+ocqY9UmbJ8sqkB2k&Wa8>8kT43p5lKL^b;5=I0~7rM`>y8h7i+BTHk z?7y3~(rN|EQi)z?3;4lK%nz>hRL+IN!bMLpzZK~0V8ExI_Nz?%Tl(-~1$L>Ju{0Ux zp;5x-$d>L-y_LT4nFA-)$EZ% zS};}E~kmiJCrN; zQ@d22{VI_(OrAYa-Nixx(@+qkPmzz8<(Y+P(JXE zDv<@NU)|9nU%d;9bn=dl2sj%eYz>8Du|k+HyowaQ;lS=nsWpAp_~d$6phJ3^-a8Z? ztwkzcSo0*E;2G`5?k9ae*1FqER=g7Y0E|2v4S^2)I5qq0t)j`$Xt}b|9P|&f4<1;Q zT;f=#2$3Fn;E~lHuEnJi+U%G~4YU&J6lb$17>lAToMf1{+82~JYFmtW&)bqM=@LCNrmo=+2NBiElg&!V<{LsOK6|MGS-5W=_2C zL!p<+*~c&1Mks!wfJ>q6nmnrH0C1*<)%+YZPyBBRh`ZjE;1jk-(#oI55#SZwf0)t8 zYf|9d{m2u7ysq3kAi@rJc`a8jN}1WW^jU;+C#bu~S%i)2#MGqfV*u|(lP+f$ZN-U| zc&qip&j)UD_tYt@Zy}1#e8E0@+#J;(*rXcda!xRPCJf#a-}*mJXDrh{ewv#3Xu=fl z&DmdTaG>cH94qP1@Yd9(5g|r^v)%UU&YFa2f&2Q~ke=VQ+uSwqzF^G$X(ztgw*pZ& zw>jPKZC{SBzil>$XK*tD#D0An3FHUhZ4Zwm{fFSm1B5qzum(ooRlpZY&U;k(21&_R z>F0smB>b)cYULjK&X>U?UXUe9f!Tg#??1Q1+j>}#nksM>27lc{q19}3yQ%B>7{=!v z+*$qf@l4Ona&D51lxolAzD%_lJTS@4XRj-YL7V2dtD)eLqBgK1k1jet1;&)+`{+6< z=&jt!&Xoty>Sw){&GoG7a0;i78vjN(Ez9Kl`e0EUNfqYlcmQ2K$W7e!S^Vkpfy)zX zv^yb3a;nZERBt#w+RZp3*2L6QOOK@wD1?r&yZ1dlci2y`W;?fdiTan89(bO~1|F@y z5}ppZOeuQ4R>xiMhrsW0^g|zhJ#YFwJwrWZp)fQ+_Rfi!~vlk_BWyCA&Bf5RUwGPluAPh-?zHgrkN$<>rd>HALPEl0q!}ON25wRs(d1 zU1z`AbnTb$@CI$2O&adfK5iSSZnw&L#*ys1ye+gY=x?T*bT=JfU)+)5{j1Oq+C~jO zM3i3hvFAp}*R;U|rbc>TKFJKhDzhHLhGm0{DQt2176{{zr%8`VBmjm`1klqP6m#@p}xl z1^fY+~pzo+QGYx0%SbolLvl)2HXAFr!W z{1=Pq^a^hN4Txm?H&ptu&xeP5<4= z6=ZAz|H7HFz%%^o0I&jq%s_w%;17+Fk@3~b*8^blr^dj*!tj#Ue`pMhFLnM8jrrvn z{7;SXoaCBOfnF)}c|+Wb%LWwrm*SU6tD-+#mb8UMNFm(f^W zZ2QkRMrO8`V)#pQ1nIv#(V*YRwvxHK@vB#_D668a?MwduP2x(}n7riqUzDtaqdv&- Tx4VptEKDr$WMm?8qVWF*x!e;N diff --git a/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer.tex b/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer.tex deleted file mode 100644 index fe0b6cd3c..000000000 --- a/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer.tex +++ /dev/null @@ -1,56 +0,0 @@ -\hypertarget{structdynet_1_1MomentumSGDTrainer}{}\section{dynet\+:\+:Momentum\+S\+G\+D\+Trainer Struct Reference} -\label{structdynet_1_1MomentumSGDTrainer}\index{dynet\+::\+Momentum\+S\+G\+D\+Trainer@{dynet\+::\+Momentum\+S\+G\+D\+Trainer}} - - -Inheritance diagram for dynet\+:\+:Momentum\+S\+G\+D\+Trainer\+:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=227pt]{structdynet_1_1MomentumSGDTrainer__inherit__graph} -\end{center} -\end{figure} - - -Collaboration diagram for dynet\+:\+:Momentum\+S\+G\+D\+Trainer\+:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=227pt]{structdynet_1_1MomentumSGDTrainer__coll__graph} -\end{center} -\end{figure} -\subsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1MomentumSGDTrainer_a29ba25e1ad153bc552edc178a69c67c7}{}{\bfseries Momentum\+S\+G\+D\+Trainer} (Model $\ast$m, real e0=0.\+01, real mom=0.\+9)\label{structdynet_1_1MomentumSGDTrainer_a29ba25e1ad153bc552edc178a69c67c7} - -\end{DoxyCompactItemize} -\subsection*{Protected Member Functions} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1MomentumSGDTrainer_a904d0442ffa5d18463ca529ee07a1af2}{}virtual void {\bfseries alloc\+\_\+impl} () override\label{structdynet_1_1MomentumSGDTrainer_a904d0442ffa5d18463ca529ee07a1af2} - -\end{DoxyCompactItemize} -\subsection*{Protected Attributes} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1MomentumSGDTrainer_a61b272617d6a7a80f13f4c8d03215a7b}{}real {\bfseries momentum}\label{structdynet_1_1MomentumSGDTrainer_a61b272617d6a7a80f13f4c8d03215a7b} - -\item -\hypertarget{structdynet_1_1MomentumSGDTrainer_af6d25b4fbf842543c8de00470bfa0cbc}{}std\+::vector$<$ Shadow\+Parameters $>$ {\bfseries vp}\label{structdynet_1_1MomentumSGDTrainer_af6d25b4fbf842543c8de00470bfa0cbc} - -\item -\hypertarget{structdynet_1_1MomentumSGDTrainer_aea8235a50ab0e66768bd453e01cb406a}{}std\+::vector$<$ Shadow\+Lookup\+Parameters $>$ {\bfseries vlp}\label{structdynet_1_1MomentumSGDTrainer_aea8235a50ab0e66768bd453e01cb406a} - -\end{DoxyCompactItemize} -\subsection*{Friends} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1MomentumSGDTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c}{}class {\bfseries boost\+::serialization\+::access}\label{structdynet_1_1MomentumSGDTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c} - -\end{DoxyCompactItemize} -\subsection*{Additional Inherited Members} - - -The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} -\item -/home/paul/dev/dynet/dynet/training.\+h\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__coll__graph.md5 b/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__coll__graph.md5 deleted file mode 100644 index 21132cd03..000000000 --- a/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -dd39685e4b6998fb5e8a73b54a743277 \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__coll__graph.pdf b/doc/doxygen/latex/structdynet_1_1MomentumSGDTrainer__coll__graph.pdf deleted file mode 100644 index 8f5f4af1506669c7593b2af047fb62006705e98c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12827 zcmb801yGzx*Y9!n0D%O;;1FyEcXtTxKDfIDg1ft0f*zK^uRXhv9tP-(O(l4(ipAyCq$8>Uv#S)BW~I5*nT z61?^=k&BqREa#aatP-eB2@?UXvF6NG<~0uHI=@`z>f;zoGFeFLEh7!MPymua`y#gY zifO&Xad%=_%Lw_+dcSb`MeRwF`fnpu=+J`}p&AOsmncr_55Op_4mLr026ND}h0LG) z;6C$pTVv3H>SpaZzzX;Eb0StWZ02qV>03ZN^0r>g#IXBM_{&-~& zwXt^mo3$|=kPZl7`75{2M$dnLF2?$w#Q+RSA8m~Q402!-qu&e5f$fc+=K=jSj^Trm zp&3}v#ucFXECB(GjBEf93oAhTx3$pon$PAAfS0oRqlU!nZJccX=EooN|5pFnh~o3A z_F!uV+n2QrKK><3037X|etYqW!f#7)`P4aTVvH`?T{o zo%6M;&|xdpVzBv&(;-8*lRxJsR%i~%98$rXvz^10y+Oo#R}UUpH7RK;vY22F@K$xj zKn~-_kI&G7Li|r{PkSZ-F-f^#g$Hbn5S8Ww}c7gU`li;QQPyt)=C@mx!x>K!6W!=996v zJ>YeD1ZngM5mb~s8wSko286wT7?crF2L{3nmMQd!W2F;hs;0WnH&2USDMI|0{IEcn z{S6o=XvY4^d&Nz=9BzUrJ}3yd7364AgiF_4J|r(TDM+L$$Ok*z!|kR|{KlH>3ljce z{kJidk00#5t2uD`u4qN2qMSymRLTV{H`+l$c)srU0R#HGJKXIbuB_*|1Q!XLA4x4y zovUx@P^;~o*2bJ*xEg)qHy#sE9DO+hpH#C>Y)KZ zoUcLhMxytuMq2%Z`rQvY4>g9FnVC0-hNsL+|!M|s+c-MzmB5N_};D;C3;O~n^op>rsy%mxV^sG&g7k+}lb@@FE=Jhe=MK`55WZarqso3Cm`*td z2i&EvgmR>A{SGb0TBiL|$FU2)0qc9jC;OqRg|H##sTsKrBP9SO3^aEAzhDEkxCilc zg@Z5N@#xq|EJ)Mi3s&H*xx8V&^Vi6F=n%V?Z|VwmI!*LzXX;5c$wV&u)SBxD$VlbM zzmdQX3u$nN>I}lqn3{gDweN57?;JC*Qw0&#{-XLhi28J#43U11ZROimIyG5hlebe% zDB?S$jYL%$bg8~j5Nfd9rPevw<)lT-JXC&9 zp)G3gh9yBbZ~GPY(c3hk0RPS@rdnWhEg~mU28*){Ev0!=4*aSio1L}o*ck8RRRf1s z@3fop$MW+GL(j$buSjaGRcPDr>_XU@WP8;U-GS#m$}$;3jkza7%HeaMXC>Y88%8PS8 zB;lMsY!shG+i5FehG8NJkXC%XpMZ>PO4#MVJAuQ&uj3QXQ;mvZ0IQ zF-?PtwG!n?HlfCuDcq!!_o`cF@96omu2+X~BQfuS?_##`NW!-;KcjoHRN)qUb=F(; znxX!6nLO2q&*Q;}D!hN zSiCS=+g{8m7{YpYYz;mv;16RhN(2A!!P}3RSfl9GxCSzKIW0*zvoP-;n~h+<^T!z@ zv}0G!YZe_+XCIqbj*?vhg>C4>j^BsBFB3-z6Urgkofa)DTn@@?wpYULaQ@V?H7%1% zao0XmKCT_BCQ0&ptlIpJjn%^jo?2$Q<*9q| z+xTMCV8%?x_@Y$yLbKa}55a+B7)2m9yIM6WAJ*+|tZR_)J~qNa%)Y#?1cg#z+utchd#!Pi&hYq8t&H8LVPdK#aCM}BB`DD}8kMZy0-7l7xH5Ypikk<9*QQsUOjD!YP_6BCj6# z9aHogizBm3@=A0W`@1<(3dIHvrK23QA?lD)!YfJ1teIE|qeeoH8qWGOZ=hsJq~~X5 z-Nuuon+a5eQ77CHeth5|%96*jZIk|0U-bNqdy}idA%T-!)vKiCVR7#*oTVrvD)hy@R-IT+tE%aoV=Gclbs?>t3j(u#af=)90cmVD5!og;a@M{%uT`Pjg^Oz} zIw_?cpEYHW>ax@60tF)Sv*!z6C=z-5_3BNpNTP{WbrxRRSZ>zqG%>tBx*IYn59Utl zcf!R6nOzw%*_ljI1Q-Ck+VU;dFyB`p3)s#udliYz$Z`YA0!xX&<#9*G62@50E(R8x zKL6_%pEi*Wg>})fI4|UzWX}MQCwcdWpjjq@m=?&{;HPy8vG7~E|yit>u=gn&31#iOp?tp z1uTrL)OFGcj)B0qnlPi`zT5hE;*VQecT`9Cn!Ulu!sncdxs6ReBi~47jaG$)5n^5hJszACzVTmd)IXTD&R}#4R ztQ2;dKc=^xbw64#)q%Y_Iqc1i4mVgS)JJt3LN0&Q)8$`=TY#j?-*rn#SBP9M5M3l_-EDJc3r|b z$Ooe^SmcYpGvG|;vAXkLjZL*1B%|OA^1u`o^BcdPY$OXv_(1#XJKaqhLWnLr%r{uF zH!bg-GJ08r^LkStia*xt;*08YYyaGJn`E(%T&7Lu2Q9FIYJOa9bO)&hhaXN#sdNeB zBu02NYfi?j;)#<7?6b>94Dn6isJz($~uN=PTZo`9f+^uy=oVT=-Ap5mg?Nu zSSnrl1yNdLR>8rwgNn+iT3d@?RF3N`_#-Kwz&dlUR6m=%2+Hr?&Af76?e=wi&hF<` zg$XSl6X)^(pjLC9+=O8JH_MZBp6A0~p~)OP>K=N>uT$a9 zE>k^W=$p`S!`dMnrN7rx%MEI2#z|wJh0Ciz5elhK+maB%##gdV6Zl^zI^cRCd|7JH zj!4c-6p%-pT;6<(35^qnksQ;X@X5;Ua(PN^)+Ovm>CX~&E~Ub7jMI&kF=Lba4S`Q? zmGh%q4}H4Ut>cd7bF+4A`aEw%EH1O(md`HgBf`Tyx#>x~uUNFNbJ6tB_i%l!Bf?EW z@@4CM^IHkGV#VQC)zbj0N%fjibl;hMJ5vd!HnH*Y1Cz*4ets-@D`~&H*O{lCCJevF zDf=O;P^M*g!z~CW%zm^~U6cE!zV^#FBzO}Q0=t!+6Rg>_oYyZ0bTgmo5s z2L-88Y44a-jpegW`JecCP?_lHx5?2-OJ;XVu}8Sv`S?2x306_RQWC%SZK2}FWv*Dg z-_mEGvE*=^2WXAyEeOHL#i1UyLDL3R2~F6vQZ+MsAl13J@?RQi;8>sYAT+2;+%eUhBUqv=TPk2ZnPy=^vJN9EDZz3IA@KJ4*kNH^P`CSG+OE7qK&9 zK1iphiR@Y;bDv4tQe_5{fi8|zkb#8h#MH!@CV-+=T4S!`D;7F$Q}%uBw3L#tGalt1PeNotq!uIOO=6L z;Hs;XhFcg+9J`4+3o)f}wa57{kgX+Qu5iV}En6W2aBfQ@XK8gmFF4Utonn?J75WiP z-|%^*d%hw?=Fb`$BNcxiZ^vMB_$6HFfqjzNTqxXG1m_j&=Dc?2@cg(+`?m4O*Qe}V zZ+|##!9`11Ik5M)4;ed(4-Y6w+)9b;`n9kQHocH(8(lRI5qt}4lQ`0QW@U}zfj4sV zlL6hch}#gAY;AiV#aOOD4%i=_guY*_+#N&nq8HJ+FFiU zvg7c~(Nk?hPWM*Bu|B0^{Ej+GZ1G9+O@7nN50jgm$G{)Gox!6Cg5jESeg~q*Ljlrf z+DS}sBPB;%gl)yx5u!cgj1EGgwvAZU*V1eqmec!Z5bbBweDArc-v#;<+hp2OeMw>C zC(pAR;-bXNKiBZsoHV;PF*ZXFZzHrkx!GL{S;6#r_}m<|oK*p!&~%$lC-9*t4wV@gfg2i>9rc1He>QujVvyK;n@m(_L&>Z z2SF6$p8=7x$I#NGDpL>2bcKKeA|s-Dzd>55Rsdc!5=ay8A|TzZb%Ys#b?9EePLLPIro#H>8j zB83%)8kH*s_CwRIY44@Z*F7OwA)!kCxHlF$-UVc(0xO(zg0`x%;}dtH(wJ|A=MSRG z6(rBM&h?hnta@iWBvA2lX;h14DI7?1J^R>5gUT31F*}@esu}_0G1Ku_R4nv%b7S4hZ@nWapMS8u2Q6g1a20<*hXZju;mLH@6^y1v}(eg3MLSyuD`deDcoTF^CN51 zNd2m%^+Cv>dyBOcRfLk=jBX1{6`59-y^JnPRWI|qXe70kl;8>rxeL;MH4b)__IBh` z;>g_5_j4ay+#DhklHTG3IDW0Zm#fDFFv3&XSQ_ES0_+if>E(GHNf4O6%TbEO`HHD1 zxX4hskp()av?2YPB5Xh18%!#q8zh$S)5yb^w|m8>vZ$&w1W>{ic)KxWT|y}dJ=E8K zwzGBf17HwZVf>!m4Ya{tu=xuT@-rISF^dL_&Xu5!14&X(6v&n?PBhCX>@aJU2+j=)EbDVKW}t{jfWcl`v|KQ$O$r|C*`>5puZcgN zZ<`5_&Iss8$e&rbZ6yGIK{I`|*7NQhKNf*d6Go5IqE9?m@ejKJdf>;W(74Bp>rWp)dsw_yaof7Sq1Eug3J+5_mTW%y}>*9gapt(v2J_CC6yjnguQGFi+SFHO&3lmI4?I z8F*eZAmh=X3ZT>+X=f5Tx+YDRb%Dp#4#g9cB^vqbYC(y6@LL}KE%w@c_=1N%RQfwN zU)*9OQVTcC{hF8H2W}V&VeoFrYS_b%ZH#+8TTZk1EnVcp5z@$n*SDLOcBmHeyk2V+ zs~uf-gj^JSHvcg>;61m-9ks*U8o6+rbnWq-6HNU&7IrYS$Fs=ZI)P16nWx}XIe1!I3;ZxD+yYqZ+&>Q-EM&+RM0 z15=IDDA-hb71iCWE7N(Pi`%f-H;ZFZs966{$HCjycdi+MXFIPkxuAPz-Fnw0J8-J( zR5u6h5aY7x?Y5PMo0=R`3w$I=3=2hsE)gu`Z;TRcq zlfhHk+ltm29|0t)yTYfEB7?zU^0|PWK)F2LJ;ON>1TZg+QE-p4cI3E}mJyFQN}wlKBtsJmQb2qF?0BE;0qG7|XoRNxzt#mU)_gCg;0r}e zu@86v-XNkBUC|sB+$1yHdv|{so!-=t+>FxnnD823%ER=&d~@~f=dWhjZv;A6uY=1P zg^PL@a!%)Z;v*?MUaBol7qv zO6l*B1~1v#Kt$2isE?sO9!QLJb0`bW_cqS^+AyFpJ$NNpuFNRJ#Y`!WwWkl+UEOQ+ zB^YIP!L_%L%`Y5^J9JD!G=otD-!oxf84|JVeaP33fk=a+9T!J4|3Yn`l{K%k%+?8k zSSd3rNi}4hH=ApC?X)?ndv%H%7jzjJUo8yT3-4?FX6JiWT<741M=E^VCpd9i!Gonz zfQms?pP2Xu5TVIZY5a#V)p|$zJu@$kc9%qN@^PR3y>?h{Astx*{uH4 zG?AREnd6-iM!>f(*p`?c{&B#pr-#N)3U|Hc8SJOy%f<;^BnDwed)?>~LgGVBUWW;~ z=?=U?$L<96p-+jbB417&w*o4<_OTr7?F636C6BoKkgqCENELtikBpa8*50y8_%%` zD^9}Dp_b7h|ZUzx8zD0}J;^ zl)t|WRdFN};L|ev{@rR5!AM#}&P-T=+tyFUF(GqkEHguASgANSCIU-!C@QOPecXmx z7UK(-+mexXTHOGpIVpNx!aH4{7eFBB4E+^xeKWB*jW}TvGB;E=&7Oj6NZf({twcUk zQ(}$mI)Ois9IPY)52x@pYfa*cr^v;|#enl55Be!O4^Q8jo3W=VZ^ON<;UM^Gm*YF- zth_4z&2;hvM#+iol)i2ax?k`Tsk@3*El(JyJ2^3gHl1zmK045FcV5L09%v3T%J`xh4~iXp zu2H{cZ$O`uX6(=VSeD3a`vqOEo-5I6lV)oAb|(jU@?NCiI~2}sKoLgTmd-nWDeEL& zo@|qkpzpxf!R4E@sp^!1S)Td;-~DrCi~RD1as{&WHhS+JN*;gl2uJ%{t(xR=hNO_% z^-@#)<=5LJH#@vXWHNJQhs{p8Bw5*A~YVV8^Lvq+;D-@CMhWz0Zh&!=%a%Z148*l+1IY?C)ha13o~qDj?&dsAC7tm zwo1)dSm?;M`MQF<)E9#A4c=AI%zi=W+QYXpaFB=itPtQ%T;t)0HIW4w+l(qstQFJC zwCJ48rf!l6Ju^DCP{I1mFVEdXz#EI?XK~rOFlz8eFdCA-vJVz--1=vZ{VF&ZwGRu= z-^kBNd-fMk|3XI6rDW`AbhI*c92dXy{jq6CN^!K=09T6&ZZrR`7GJC9N&8 z=ck?bcMAHT*D_^7Jo`!0dJhsF4HyDY@>XNa9A^h`OFtW?DtqK766VeiisH@6CT4km z;I|4}^U}mO2F3<{#?Q*cD~W>(mUYQPwksF590m(maO=#SEL z19z-X^AuF}$@i?)%j3D>$QJ@EF_%6-zw^ht(c-mY#aA(a(5Sh-E9VNRY|SW28~*Ci z@e^Z~Zq)&kpmV8uy1z*COX_M;-F!kOpUTf{T)k;=9%)T|{_XVw!u1utr%x`X9&DN> zwAie7VR%<(7j@qj*zA_S*i>O{Pc*#$AdawX{J0{V8QKyhAUN6;R0%1*nt#6Jim>V6 zc{Fp5V@y9|5SayFVULPnag(l@K8QZsDq(ok&_8Szj z0o3|g9wCoR-$O2X+{`4Iom@_#&hT!(xZWgDi-)y6Oq1Y_f_;jsZ!G6w1thvm!$)Ov z--T?N;?IMr^{Uc}xEl_rvv>jd9NARdb$7L|7V0?ausrseZ1ci}p2h@;e1hz^6orI$ z82bht7*5QT=*AW+SFxLrbGj)=nlxhg#xT3V2l{@O2Nh;y5*st4x~lppRmXw)r_{Xz zVOt=MRJ@b<8x$8n2-jk)f-$=LoN#2d<3qN96%a?zJh_xgg0a?!VN^*nZ->3?ZL&_X zBL`Tt_062Tg3wtDMKDR#qUJ-2dyZ` z{_wpUvTBgZ-Yq+~27F~S5WO)@uZaWf(Pw>{yD@k$ReKL?kH5?(?mJe)uo{^z zme> zePd5sj5Np^^e|Iif@lyLVR>`JeJU+NDI_=lh}rNN87`eJ8>%T|TECV$dE? zT5eF55%F6HjZa*rzNRAGTgQy^TXzKDtBy2A~uHO-` zdt^s)lFkUj=-n0bUh+q#Q(Y5F+zj2Bbk)R__W;>>XAq0uT!fllC*9aJ0<-y~75Sa# zH1u4($p{<)9^n<@#6zOaNeFc2y_C0YI91@*K|*f9kZ1Bay+w|jfJ(&98?9iI44p7l zR=lasqvfiE$_D;8XQ})H+D*k84^19j(+YU(bS3U3yW3AeKIE~3K0|?p{i+&XW9>!b z4+i&R90#h8E}2O2{;|_+Gs7%NEN}zkRG)amjN5c2ij$Oz!dqOCrIZLjQ#U7I@P4W1 z2Pj^hJ_?|i)OfRlXNQ{LNqpwjYpARE_@H!6>k6S-A|qF2?9*arF>I0kV5dNz8`fy$ z+uHSh`Wzj1L(yrqw&JaU_ePbs^sbS-R`27G_epui8g(%um6f1$&Icmi<11xSWk|H9 zIBt|=nb*L^GdjD&ipJR5IXB}EzL+80DrAcOH$MCWR z@d_gLImnc<3w7#~%S^Ab<(>v_(3|eFHK<=EsOT#{e+SJSGcCM~%tDNLWp2ok^NAH_ zn1ql*AyAT6L_<}$H$JpJ%BZGKWH}OcBP06)Y73=O|3XLCLxFoE%F&?HEVWVcB{Sx+eZG3pv;}dCj0KD!V!`$rh%(7e^)x>m))&gVS{( zHV8cJbP7sih8T1!z$?@M@BIpIB{NFLR z+VYLo9YB~a426N5^e5tpYIP4V%b{IHMBiLE3FLFaMUAhTOmzc$1xf6 z+fz|AhDUa+grzH@Hl*}tEN}dg(Q;Hp5S^L#4iX-Xcm4Xr7p(e2755guRR`|-h4#N; zo8g(g@kK|1sH`&uMS6NKPB+9UxuCAXQ=Zdo6r26XCT&dOZMu9VnE3N`j;Hq# zFH4i3YP>Nzalq0JvAJ#L4l-fr46fQCLeS=EGE{@?wMole;rWjE1b4w_$A@GfY+ues zj2(Hse&n&m7SXLgHI+v-q9UN>Rf_@b&8uyTlcL!IPBLkq>Kapvt~D>iCrR4`HyRPm zN)zHtSc9DuD0KI<(C)3fg)6gC(AfKN%yG1j?m69e865;_2`#$xjfuqnot59A{xdC1 zK<2-a0(v1_U*s30_76t&1)vo+axkzrvvstw|IL2BNHSonXFyg}T}eq@lt#wPO5e#r z5o|3@r(k5_^oNlp*u(+A{GS1Wf6%gYAU0+I9V0sn;JF%}c~TapKcQI(N3f-tfq=D% zr4a!5dz65K!3%WzZ1TJN;>1h;W$D8+#LK>fh_g+1nU889e_U;D0~te-Lxf-+yTE$N3ThKNr4@$scpS?B-9({C@_y z+8Y@o0RbRpB;bD87`j-Z<{!;@2nHis#`_kKy1$^^q(3K$inm-zJJ&Ofo#mr5&wq}msq`E>*zK^uRXhv9tP-(O(l4(ipAyCq$8>Uv#S)BW~I5*nT z61?^=k&BqREa#aatP-eB2@?UXvF6NG<~0uHI=@`z>f;zoGFeFLEh7!MPymua`y#gY zifO&Xad%=_%Lw_+dcSb`MeRwF`fnpu=+J`}p&AOsmncr_55Op_4mLr026ND}h0LG) z;6C$pTVv3H>SpaZzzX;Eb0StWZ02qV>03ZN^0r>g#IXBM_{&-~& zwXt^mo3$|=kPZl7`75{2M$dnLF2?$w#Q+RSA8m~Q402!-qu&e5f$fc+=K=jSj^Trm zp&3}v#ucFXECB(GjBEf93oAhTx3$pon$PAAfS0oRqlU!nZJccX=EooN|5pFnh~o3A z_F!uV+n2QrKK><3037X|etYqW!f#7)`P4aTVvH`?T{o zo%6M;&|xdpVzBv&(;-8*lRxJsR%i~%98$rXvz^10y+Oo#R}UUpH7RK;vY22F@K$xj zKn~-_kI&G7Li|r{PkSZ-F-f^#g$Hbn5S8Ww}c7gU`li;QQPyt)=C@mx!x>K!6W!=996v zJ>YeD1ZngM5mb~s8wSko286wT7?crF2L{3nmMQd!W2F;hs;0WnH&2USDMI|0{IEcn z{S6o=XvY4^d&Nz=9BzUrJ}3yd7364AgiF_4J|r(TDM+L$$Ok*z!|kR|{KlH>3ljce z{kJidk00#5t2uD`u4qN2qMSymRLTV{H`+l$c)srU0R#HGJKXIbuB_*|1Q!XLA4x4y zovUx@P^;~o*2bJ*xEg)qHy#sE9DO+hpH#C>Y)KZ zoUcLhMxytuMq2%Z`rQvY4>g9FnVC0-hNsL+|!M|s+c-MzmB5N_};D;C3;O~n^op>rsy%mxV^sG&g7k+}lb@@FE=Jhe=MK`55WZarqso3Cm`*td z2i&EvgmR>A{SGb0TBiL|$FU2)0qc9jC;OqRg|H##sTsKrBP9SO3^aEAzhDEkxCilc zg@Z5N@#xq|EJ)Mi3s&H*xx8V&^Vi6F=n%V?Z|VwmI!*LzXX;5c$wV&u)SBxD$VlbM zzmdQX3u$nN>I}lqn3{gDweN57?;JC*Qw0&#{-XLhi28J#43U11ZROimIyG5hlebe% zDB?S$jYL%$bg8~j5Nfd9rPevw<)lT-JXC&9 zp)G3gh9yBbZ~GPY(c3hk0RPS@rdnWhEg~mU28*){Ev0!=4*aSio1L}o*ck8RRRf1s z@3fop$MW+GL(j$buSjaGRcPDr>_XU@WP8;U-GS#m$}$;3jkza7%HeaMXC>Y88%8PS8 zB;lMsY!shG+i5FehG8NJkXC%XpMZ>PO4#MVJAuQ&uj3QXQ;mvZ0IQ zF-?PtwG!n?HlfCuDcq!!_o`cF@96omu2+X~BQfuS?_##`NW!-;KcjoHRN)qUb=F(; znxX!6nLO2q&*Q;}D!hN zSiCS=+g{8m7{YpYYz;mv;16RhN(2A!!P}3RSfl9GxCSzKIW0*zvoP-;n~h+<^T!z@ zv}0G!YZe_+XCIqbj*?vhg>C4>j^BsBFB3-z6Urgkofa)DTn@@?wpYULaQ@V?H7%1% zao0XmKCT_BCQ0&ptlIpJjn%^jo?2$Q<*9q| z+xTMCV8%?x_@Y$yLbKa}55a+B7)2m9yIM6WAJ*+|tZR_)J~qNa%)Y#?1cg#z+utchd#!Pi&hYq8t&H8LVPdK#aCM}BB`DD}8kMZy0-7l7xH5Ypikk<9*QQsUOjD!YP_6BCj6# z9aHogizBm3@=A0W`@1<(3dIHvrK23QA?lD)!YfJ1teIE|qeeoH8qWGOZ=hsJq~~X5 z-Nuuon+a5eQ77CHeth5|%96*jZIk|0U-bNqdy}idA%T-!)vKiCVR7#*oTVrvD)hy@R-IT+tE%aoV=Gclbs?>t3j(u#af=)90cmVD5!og;a@M{%uT`Pjg^Oz} zIw_?cpEYHW>ax@60tF)Sv*!z6C=z-5_3BNpNTP{WbrxRRSZ>zqG%>tBx*IYn59Utl zcf!R6nOzw%*_ljI1Q-Ck+VU;dFyB`p3)s#udliYz$Z`YA0!xX&<#9*G62@50E(R8x zKL6_%pEi*Wg>})fI4|UzWX}MQCwcdWpjjq@m=?&{;HPy8vG7~E|yit>u=gn&31#iOp?tp z1uTrL)OFGcj)B0qnlPi`zT5hE;*VQecT`9Cn!Ulu!sncdxs6ReBi~47jaG$)5n^5hJszACzVTmd)IXTD&R}#4R ztQ2;dKc=^xbw64#)q%Y_Iqc1i4mVgS)JJt3LN0&Q)8$`=TY#j?-*rn#SBP9M5M3l_-EDJc3r|b z$Ooe^SmcYpGvG|;vAXkLjZL*1B%|OA^1u`o^BcdPY$OXv_(1#XJKaqhLWnLr%r{uF zH!bg-GJ08r^LkStia*xt;*08YYyaGJn`E(%T&7Lu2Q9FIYJOa9bO)&hhaXN#sdNeB zBu02NYfi?j;)#<7?6b>94Dn6isJz($~uN=PTZo`9f+^uy=oVT=-Ap5mg?Nu zSSnrl1yNdLR>8rwgNn+iT3d@?RF3N`_#-Kwz&dlUR6m=%2+Hr?&Af76?e=wi&hF<` zg$XSl6X)^(pjLC9+=O8JH_MZBp6A0~p~)OP>K=N>uT$a9 zE>k^W=$p`S!`dMnrN7rx%MEI2#z|wJh0Ciz5elhK+maB%##gdV6Zl^zI^cRCd|7JH zj!4c-6p%-pT;6<(35^qnksQ;X@X5;Ua(PN^)+Ovm>CX~&E~Ub7jMI&kF=Lba4S`Q? zmGh%q4}H4Ut>cd7bF+4A`aEw%EH1O(md`HgBf`Tyx#>x~uUNFNbJ6tB_i%l!Bf?EW z@@4CM^IHkGV#VQC)zbj0N%fjibl;hMJ5vd!HnH*Y1Cz*4ets-@D`~&H*O{lCCJevF zDf=O;P^M*g!z~CW%zm^~U6cE!zV^#FBzO}Q0=t!+6Rg>_oYyZ0bTgmo5s z2L-88Y44a-jpegW`JecCP?_lHx5?2-OJ;XVu}8Sv`S?2x306_RQWC%SZK2}FWv*Dg z-_mEGvE*=^2WXAyEeOHL#i1UyLDL3R2~F6vQZ+MsAl13J@?RQi;8>sYAT+2;+%eUhBUqv=TPk2ZnPy=^vJN9EDZz3IA@KJ4*kNH^P`CSG+OE7qK&9 zK1iphiR@Y;bDv4tQe_5{fi8|zkb#8h#MH!@CV-+=T4S!`D;7F$Q}%uBw3L#tGalt1PeNotq!uIOO=6L z;Hs;XhFcg+9J`4+3o)f}wa57{kgX+Qu5iV}En6W2aBfQ@XK8gmFF4Utonn?J75WiP z-|%^*d%hw?=Fb`$BNcxiZ^vMB_$6HFfqjzNTqxXG1m_j&=Dc?2@cg(+`?m4O*Qe}V zZ+|##!9`11Ik5M)4;ed(4-Y6w+)9b;`n9kQHocH(8(lRI5qt}4lQ`0QW@U}zfj4sV zlL6hch}#gAY;AiV#aOOD4%i=_guY*_+#N&nq8HJ+FFiU zvg7c~(Nk?hPWM*Bu|B0^{Ej+GZ1G9+O@7nN50jgm$G{)Gox!6Cg5jESeg~q*Ljlrf z+DS}sBPB;%gl)yx5u!cgj1EGgwvAZU*V1eqmec!Z5bbBweDArc-v#;<+hp2OeMw>C zC(pAR;-bXNKiBZsoHV;PF*ZXFZzHrkx!GL{S;6#r_}m<|oK*p!&~%$lC-9*t4wV@gfg2i>9rc1He>QujVvyK;n@m(_L&>Z z2SF6$p8=7x$I#NGDpL>2bcKKeA|s-Dzd>55Rsdc!5=ay8A|TzZb%Ys#b?9EePLLPIro#H>8j zB83%)8kH*s_CwRIY44@Z*F7OwA)!kCxHlF$-UVc(0xO(zg0`x%;}dtH(wJ|A=MSRG z6(rBM&h?hnta@iWBvA2lX;h14DI7?1J^R>5gUT31F*}@esu}_0G1Ku_R4nv%b7S4hZ@nWapMS8u2Q6g1a20<*hXZju;mLH@6^y1v}(eg3MLSyuD`deDcoTF^CN51 zNd2m%^+Cv>dyBOcRfLk=jBX1{6`59-y^JnPRWI|qXe70kl;8>rxeL;MH4b)__IBh` z;>g_5_j4ay+#DhklHTG3IDW0Zm#fDFFv3&XSQ_ES0_+if>E(GHNf4O6%TbEO`HHD1 zxX4hskp()av?2YPB5Xh18%!#q8zh$S)5yb^w|m8>vZ$&w1W>{ic)KxWT|y}dJ=E8K zwzGBf17HwZVf>!m4Ya{tu=xuT@-rISF^dL_&Xu5!14&X(6v&n?PBhCX>@aJU2+j=)EbDVKW}t{jfWcl`v|KQ$O$r|C*`>5puZcgN zZ<`5_&Iss8$e&rbZ6yGIK{I`|*7NQhKNf*d6Go5IqE9?m@ejKJdf>;W(74Bp>rWp)dsw_yaof7Sq1Eug3J+5_mTW%y}>*9gapt(v2J_CC6yjnguQGFi+SFHO&3lmI4?I z8F*eZAmh=X3ZT>+X=f5Tx+YDRb%Dp#4#g9cB^vqbYC(y6@LL}KE%w@c_=1N%RQfwN zU)*9OQVTcC{hF8H2W}V&VeoFrYS_b%ZH#+8TTZk1EnVcp5z@$n*SDLOcBmHeyk2V+ zs~uf-gj^JSHvcg>;61m-9ks*U8o6+rbnWq-6HNU&7IrYS$Fs=ZI)P16nWx}XIe1!I3;ZxD+yYqZ+&>Q-EM&+RM0 z15=IDDA-hb71iCWE7N(Pi`%f-H;ZFZs966{$HCjycdi+MXFIPkxuAPz-Fnw0J8-J( zR5u6h5aY7x?Y5PMo0=R`3w$I=3=2hsE)gu`Z;TRcq zlfhHk+ltm29|0t)yTYfEB7?zU^0|PWK)F2LJ;ON>1TZg+QE-p4cI3E}mJyFQN}wlKBtsJmQb2qF?0BE;0qG7|XoRNxzt#mU)_gCg;0r}e zu@86v-XNkBUC|sB+$1yHdv|{so!-=t+>FxnnD823%ER=&d~@~f=dWhjZv;A6uY=1P zg^PL@a!%)Z;v*?MUaBol7qv zO6l*B1~1v#Kt$2isE?sO9!QLJb0`bW_cqS^+AyFpJ$NNpuFNRJ#Y`!WwWkl+UEOQ+ zB^YIP!L_%L%`Y5^J9JD!G=otD-!oxf84|JVeaP33fk=a+9T!J4|3Yn`l{K%k%+?8k zSSd3rNi}4hH=ApC?X)?ndv%H%7jzjJUo8yT3-4?FX6JiWT<741M=E^VCpd9i!Gonz zfQms?pP2Xu5TVIZY5a#V)p|$zJu@$kc9%qN@^PR3y>?h{Astx*{uH4 zG?AREnd6-iM!>f(*p`?c{&B#pr-#N)3U|Hc8SJOy%f<;^BnDwed)?>~LgGVBUWW;~ z=?=U?$L<96p-+jbB417&w*o4<_OTr7?F636C6BoKkgqCENELtikBpa8*50y8_%%` zD^9}Dp_b7h|ZUzx8zD0}J;^ zl)t|WRdFN};L|ev{@rR5!AM#}&P-T=+tyFUF(GqkEHguASgANSCIU-!C@QOPecXmx z7UK(-+mexXTHOGpIVpNx!aH4{7eFBB4E+^xeKWB*jW}TvGB;E=&7Oj6NZf({twcUk zQ(}$mI)Ois9IPY)52x@pYfa*cr^v;|#enl55Be!O4^Q8jo3W=VZ^ON<;UM^Gm*YF- zth_4z&2;hvM#+iol)i2ax?k`Tsk@3*El(JyJ2^3gHl1zmK045FcV5L09%v3T%J`xh4~iXp zu2H{cZ$O`uX6(=VSeD3a`vqOEo-5I6lV)oAb|(jU@?NCiI~2}sKoLgTmd-nWDeEL& zo@|qkpzpxf!R4E@sp^!1S)Td;-~DrCi~RD1as{&WHhS+JN*;gl2uJ%{t(xR=hNO_% z^-@#)<=5LJH#@vXWHNJQhs{p8Bw5*A~YVV8^Lvq+;D-@CMhWz0Zh&!=%a%Z148*l+1IY?C)ha13o~qDj?&dsAC7tm zwo1)dSm?;M`MQF<)E9#A4c=AI%zi=W+QYXpaFB=itPtQ%T;t)0HIW4w+l(qstQFJC zwCJ48rf!l6Ju^DCP{I1mFVEdXz#EI?XK~rOFlz8eFdCA-vJVz--1=vZ{VF&ZwGRu= z-^kBNd-fMk|3XI6rDW`AbhI*c92dXy{jq6CN^!K=09T6&ZZrR`7GJC9N&8 z=ck?bcMAHT*D_^7Jo`!0dJhsF4HyDY@>XNa9A^h`OFtW?DtqK766VeiisH@6CT4km z;I|4}^U}mO2F3<{#?Q*cD~W>(mUYQPwksF590m(maO=#SEL z19z-X^AuF}$@i?)%j3D>$QJ@EF_%6-zw^ht(c-mY#aA(a(5Sh-E9VNRY|SW28~*Ci z@e^Z~Zq)&kpmV8uy1z*COX_M;-F!kOpUTf{T)k;=9%)T|{_XVw!u1utr%x`X9&DN> zwAie7VR%<(7j@qj*zA_S*i>O{Pc*#$AdawX{J0{V8QKyhAUN6;R0%1*nt#6Jim>V6 zc{Fp5V@y9|5SayFVULPnag(l@K8QZsDq(ok&_8Szj z0o3|g9wCoR-$O2X+{`4Iom@_#&hT!(xZWgDi-)y6Oq1Y_f_;jsZ!G6w1thvm!$)Ov z--T?N;?IMr^{Uc}xEl_rvv>jd9NARdb$7L|7V0?ausrseZ1ci}p2h@;e1hz^6orI$ z82bht7*5QT=*AW+SFxLrbGj)=nlxhg#xT3V2l{@O2Nh;y5*st4x~lppRmXw)r_{Xz zVOt=MRJ@b<8x$8n2-jk)f-$=LoN#2d<3qN96%a?zJh_xgg0a?!VN^*nZ->3?ZL&_X zBL`Tt_062Tg3wtDMKDR#qUJ-2dyZ` z{_wpUvTBgZ-Yq+~27F~S5WO)@uZaWf(Pw>{yD@k$ReKL?kH5?(?mJe)uo{^z zme> zePd5sj5Np^^e|Iif@lyLVR>`JeJU+NDI_=lh}rNN87`eJ8>%T|TECV$dE? zT5eF55%F6HjZa*rzNRAGTgQy^TXzKDtBy2A~uHO-` zdt^s)lFkUj=-n0bUh+q#Q(Y5F+zj2Bbk)R__W;>>XAq0uT!fllC*9aJ0<-y~75Sa# zH1u4($p{<)9^n<@#6zOaNeFc2y_C0YI91@*K|*f9kZ1Bay+w|jfJ(&98?9iI44p7l zR=lasqvfiE$_D;8XQ})H+D*k84^19j(+YU(bS3U3yW3AeKIE~3K0|?p{i+&XW9>!b z4+i&R90#h8E}2O2{;|_+Gs7%NEN}zkRG)amjN5c2ij$Oz!dqOCrIZLjQ#U7I@P4W1 z2Pj^hJ_?|i)OfRlXNQ{LNqpwjYpARE_@H!6>k6S-A|qF2?9*arF>I0kV5dNz8`fy$ z+uHSh`Wzj1L(yrqw&JaU_ePbs^sbS-R`27G_epui8g(%um6f1$&Icmi<11xSWk|H9 zIBt|=nb*L^GdjD&ipJR5IXB}EzL+80DrAcOH$MCWR z@d_gLImnc<3w7#~%S^Ab<(>v_(3|eFHK<=EsOT#{e+SJSGcCM~%tDNLWp2ok^NAH_ zn1ql*AyAT6L_<}$H$JpJ%BZGKWH}OcBP06)Y73=O|3XLCLxFoE%F&?HEVWVcB{Sx+eZG3pv;}dCj0KD!V!`$rh%(7e^)x>m))&gVS{( zHV8cJbP7sih8T1!z$?@M@BIpIB{NFLR z+VYLo9YB~a426N5^e5tpYIP4V%b{IHMBiLE3FLFaMUAhTOmzc$1xf6 z+fz|AhDUa+grzH@Hl*}tEN}dg(Q;Hp5S^L#4iX-Xcm4Xr7p(e2755guRR`|-h4#N; zo8g(g@kK|1sH`&uMS6NKPB+9UxuCAXQ=Zdo6r26XCT&dOZMu9VnE3N`j;Hq# zFH4i3YP>Nzalq0JvAJ#L4l-fr46fQCLeS=EGE{@?wMole;rWjE1b4w_$A@GfY+ues zj2(Hse&n&m7SXLgHI+v-q9UN>Rf_@b&8uyTlcL!IPBLkq>Kapvt~D>iCrR4`HyRPm zN)zHtSc9DuD0KI<(C)3fg)6gC(AfKN%yG1j?m69e865;_2`#$xjfuqnot59A{xdC1 zK<2-a0(v1_U*s30_76t&1)vo+axkzrvvstw|IL2BNHSonXFyg}T}eq@lt#wPO5e#r z5o|3@r(k5_^oNlp*u(+A{GS1Wf6%gYAU0+I9V0sn;JF%}c~TapKcQI(N3f-tfq=D% zr4a!5dz65K!3%WzZ1TJN;>1h;W$D8+#LK>fh_g+1nU889e_U;D0~te-Lxf-+yTE$N3ThKNr4@$scpS?B-9({C@_y z+8Y@o0RbRpB;bD87`j-Z<{!;@2nHis#`_kKy1$^^q(3K$inm-zJJ&Ofo#mr5&wq}msq`E>$ {\bfseries hg}\label{structdynet_1_1RmsPropTrainer_af700a2a0cc9dc136a98a7260522c5947} - -\item -\hypertarget{structdynet_1_1RmsPropTrainer_aef4e1f6d56c30ef3d5d1d01d2b2df918}{}std\+::vector$<$ std\+::vector$<$ real $>$ $>$ {\bfseries hlg}\label{structdynet_1_1RmsPropTrainer_aef4e1f6d56c30ef3d5d1d01d2b2df918} - -\end{DoxyCompactItemize} -\subsection*{Friends} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1RmsPropTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c}{}class {\bfseries boost\+::serialization\+::access}\label{structdynet_1_1RmsPropTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c} - -\end{DoxyCompactItemize} -\subsection*{Additional Inherited Members} - - -The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} -\item -/home/paul/dev/dynet/dynet/training.\+h\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__coll__graph.md5 b/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__coll__graph.md5 deleted file mode 100644 index b9448d52b..000000000 --- a/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -7aa574f2b17e85187acd5c4123fa845c \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__coll__graph.pdf b/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__coll__graph.pdf deleted file mode 100644 index c942599b6797aea127581c40bdd764313ebce401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12731 zcmb8W1yozx*1rwKt+-PNP+Wt%yA&_Q3GNcyt!QxyE$;5_QYh|F+}*8M@jtZZ+z2OEUJ(`t7;aTx-s`GBS3aP$-H?FaR0Z5h-eq%I*+Z0n7kf0}DhxJ^+)Pv5l#t z8G!9sQbq&-08A3*R*uHt=d%^a(OAsb(ALNpQ9uCE!4Yf>vPN`G$yJh-g#x0rjh25k z1WWPESrKnk0z`zzn(8M+E0>CD1nT^MounRGXu)8|ME7&{d+KeULBAf{pXSm;D|1;T zZwfP#WNYlP31o1TUvHW0*&AgdoPzMN49bxr5n6+oF`0xUiLs4-MV6$lIr= zfi~$Rf!Lty5@Xnueh2(n$SH8c2MhfkBC9;#1%H*AL&T8ryhZXvEkxG{bwSJcp8G5H zJ=MqrF#CNE)Up&)QP(7_?W)5r9^)FyKK7?eL}MGHzvA}%?j_sew30J*sUKz0s*&TnhcXP?jJ4uF?(`cpfSU|T1js1UYf+KfhRicAB2I55>!ur+Y zcXlq)W*L4G1ZD(C(L#0z$7qWbLeE;oD$ZLo-_>`~l2>gzhpi`#C!-!u%dS&~j#JtW zr5XoX?Ck^(+4$zQj@(8isSLtlBWQSVs8sdTLQscBd&hZ59}DbveXW)t6@-NyB_#Nn zhtMxb=y|ds;rC&kgF+tZ6ka2~>P&m}Q)pJDDJ_*(sAmZWVio4}^wUp-5JY$=*T%-c z$M{`jY?xW0REBZOnoihuhgq6Um$S2-iW?;zS{8-cNG&8gGg9@GJyCA;H+SP z?zlkp%P)ZI8=vb&fc6W8+)V3?jMS&|EzPd~lu8I;W{pzySPFu0gyx38`WC5=i))Gs z@rmd_P%VvMYt8i*L&y}m1wvS8ET7^*>6gccun|SAF%ru)ob@fJirH`aj9J>+915R@ zZNnyqgD_wD+w+^V&SWZ4@S6F~tKSVgYiK;-sGkDM< z&_6ov%teK4ZVLFk^&|(|z|{<4ha?-B~BO&@J%zwhA4$j5AoA{>K)_7z?d_7?D=dJG+NbA_1Jr^D;OFhUB- zc*=dmf}Oh$o$_O*o<-6h7`|b92XTEe+Fm}C&ZmEbY=7}crvtSM{mQN%@|)t0AYcFR zw+CDrx`RWQ)3sIfbvV0IL?j5;1~)fIvR9rE?LP33kNHrkvPkfc6x9n879I^Jhc4c;$&HCcSMsF3E#b9NsU^Z@r{yYQIK zeOaHdXq($ke@pU)wuzVL5h$A=*b42+5=SV6a=P#?QfSv_8!ELUa`{QL+sBB&|8X(- ziI>6{@6;TH1x>5h2Zf*m##sg0!>^>agPE@RiRB>uqri6pXeVeOw;LqN1*v z-}$yY&O$;kz6)VJEQDTNe|-+cccgZ)67{gx`rUZz@R#FL{wWDM$Ohuev|b2qNA5Z9 zbENhj2t(l^8+@N6_!bocr+otWAQ;D1GCC&N9%02HwBPv%r{!z*t*ok)o;U!eTWZ~r|^th zI~-dY_Ta;mStd2EZOT&CEW6D+#4yGnZWDMO?~R|cVP`=wZmHA3aBQPcld?e%$CeXq z>d=~#SbbKCUw5Tyj|B!GV||yf68T+v-})Y-5GoDM!W4P(9dYT2g$y%7*_dlA$_e0W z7joSzXwIG^TnYsDYPSFvdqUWMCOoXO_Ntw{;?xa>m zoPr2nEMfvx-hb%SS&ZW6LG(6U66B+VC}viJ^C>8HGCr4dgVm7?&9MAJ7Q6V(1}-*y z$*J*uFuK)z&-!MP-%reFn5E;5a}6tl+%pH(@Ckxyo-#B|bu&<$KpcK)lSORR7__*7 zp+iAM$S=)pO4?2wZ^_Ey?W@qK?^G+hq?|`HUurq{`IJay`#W zbe`3s-b5I~aDynL8dU1v7d?q%Vfua7vpQ-5`br$!q+eH~E2|CTH+=kp!(m@cn&=-q7T>0UmM zNYPm!h@-CwLy0P{CMhy&c<&3+yENTUD=z9?(RN{pqah4dBe8B^h&#zuO%L{*@}aTd z79kDE7}rXaJQEtyv>(AFQBkU|ACqLrd>_T{R>;qN_~B>mwv-zv)o!>lsWw9U7L%p; z)OcY={S-q36D}S29x?px^V{}!EgjneV%PUKgHpX^subXit|((9ScC7E;$K7_FJpZe zqTpp_zs0DowoFumd=$bkoOiPJY|;lpvU)G6WL))N~4WZzt{U^&0)e28T_ zuM~d*Hh6-rw7&?RJdnf-qA7f7~*`ZrY}znD#{Qe3J^Uv{84_XSXr;Z-yGj3MS0}vIb5zSHGHl7PBByn8{mJ4 z3C*R}aKg)Yp=;&b%~Jq8$)*&4YsnOUnafjjQ7QZwofF^uF+KJu zV>WYkE9BD4TPzeM#!)E~Xqir&jK|7QZ<`vdXK5t@DC%U$FM{!S+agz?H7+zUJ`JQ# z-r7i!V*$7y5BNIiKv%y`46mXBSg?BBu#51v?JVc(yJ02BMYpxJ-ZU`<-fDe7VDDH3 zLd3t~nJ)HjT9STc##%k~(AO;7Scj#orF#(;I{N+e;$z^Aj0Ugbv;xb=PSTUoV$u{d z&%zpwf=BEr-14I{(?!%CO^Y{`2EqJ88R7(ftsE}FtRrksUFLH1UezXqgqbzLG0(P~{dqrT02eA6`&Fu(i5{H-;WRi#&OiKV}+`w$Qr z+D0`$#}jkrBf?K7H1@)@g-u-E*X!4iPN<;i*ecs)9^;Ocw}iH5B?bdisg`nxY0)*E zFa}Q9$+48EBw33m(@UoMXwalPHLxS%*!y$UgVYp zQR0LQZ;!Oz7%J*sH{U3en!TE%E>!HOej|b)Te&MrHZ7MU!d9E##2mMx$EY@;%2awK z{%%Eva_@G{^I%>(TuNPO0b(bNBq`4|yEbo4pMpslMVRrDY?R)DxUE%)0sVvC{jWK@ zHMQ4d^0(U#v1f?`dXU6d`IHYAx;d2^^t8z^Wb)~VF_rImD&{#iD4|1i^AZU2NWIif zy;Y=IRP#D4EXm{`TEBQ?dys!WQ~LGmbmx{=At`k^)Y@ki9x6YJ4bo|cOEAbkCwA#8 z26@=ZlHzB*vEB&7KB|wgY$q<QhVqbZGEqq64ZIB`p1jdMIHvO=`;oCL)F#roANg zT7~3n6uqbWTHR|BCCUpujf}U&??P$VbR-I}@IYkkn_tLM?=XrT;WHzR2|Of{+(*dF z6(M|PCxRBp5GAPHwHDE>I^LfN2o>59+GmrJFLp!5{WR!v%uPUuij4K0k@6MTR!mfZ zskO!pN}lDM_h2Tx4hVQRJlKPW@8V@=v^nR}nIZey)}|1DW0;}EYau}*fc2sh9g66j z9R1^nd)-J6OYR#+ljR<-dPYy0{NT?Zy9Oq;qoD;u{^aEtc}}Ywo%v1%sqZWb{=OL@ zA8>=rN>ik(-&ck5dZf%gkn8l16e*++y)UL#@RXD;!#%JjJxF*ENmzaR5NrW$tPF|YZcbx#hht$P>M z0y@E24z*j9Hzdzd(2)vn>r#ZAzN?p3qGsLIMcyw-Z2YQQPfC}#m#agL{idR_Mzgl{ z%q2>k$ju?8nORir-G=eI29k-iG8)-rF*UsEuD8ZC`s4| zZ@o;s9-P*GnCk&nJ2ljP;G0SNOo4eCB-XnLqxD6|R-1J%9BjL}N2RgwgLj+O9kbwO zznk-<=(gd$Fz@Pi)RY5%6@*5PZF9csk*v7t+pG-4 z4s5iK%CeKu`^+`X{NPE***@{QE0DTJ7~i@n^M^JRwvn&CccK909a_8kii=?zc8E;w zWxkG{rQ-;EC-iuN<%VgmG^nc&tX($JCz&k1iqOkkG*Gti$sotp9@h@dnj-@(`+9Ae z4k-%clgkaZz&`%WVZvRhn_+a<+#tVwHDqbeRsk7Y7LS5^c(D`y$#Mltfw-?hC3XQd zIe>+qQQG~ zS;)<)n52W7pJowibo4Y_em7PFzT5I3E#DFSCVka>SXtPF4iCtN+l>bHp7S{}T8z^# ztReYVzLzrYTHop6=sjc#Dq9sxxh?R8Clx&(=Hk&z_`!y@D=+;p;m`kT7&{c#hDTbc zc|{qP;Uvq_dT>X5WR*9gkZOe}iS2Hcf%Z{Mj99&KYoQ_G+_U=zQ|#N$X~(^LdxySc zF}ixG*2po=(u@U848PJh6_E8#!@NXqdj2>{_kadGRP^+hkQL%=`To-`arw{1N7B7c zg`>xl2lE>4C~>6Ou0a4*-2QjDHwn2_m7m~r>T~bWDBKp-;HP2HUhBm-k8UOdCb#7w zezfwH%aJLC;sTq(nwR748sd*vR_@=Op66&lYPb( z>6ZO!|9 z>xI>-hVJVO8ZD{)Y4NnIL?Uzfnb(p*nUC-rcf=WmX2P@{^%^sm8Dw(i82$=ZEL!*8 zoaA7#si9hweleO+E@Ny6jDfl^Yy@=0k>w9g7~6LV^{&+6o+tL~KY!MA;wK7icxBR{ z3(??5!c;2XL|BjNu2NYB+bHeEe`Gferj4i3_T!W5Sr1R=3mFx%p>y{TGQK#bvd&Lv z<#!>69mbQXMt#UQ8lkl00{ogGw*)6H<>d$TB1R5>^KxY$4=KoL8r;>;+Jeh%IuW43 zb)GV1zxB3TukOt>9{$zH)KzB&@DvqIANW>34%xeRY}rS1K}FYt?(4m9}6OH}Dt! z7Fk+}q$r!D&dLS9Ug0&8?xY;@BCWF|@{p_!_Bo|oKUV{x%+1#oEY8#>>orDmB@!Z- zXq9l1j(`%l>hwY=$#^F{j4q-SV)WKTbuogK!{9~6{A<+ih0Ckz<=7So(6Xn?h5qfV zp;%S^tj96@9MXnPN@A=-?}J2 z034d~Eie`M<>HBVwE9YX%u$+%Ru1oi9v*Wnd9l!Oy4?9w<>xA1mHonX=O5CAa!75R z^c1M2`0{wGXUY^ExJnRkdtb{^T=I+P$WuOFY*9y%_rkr?p_0Kg=q)Njj%z6S;Q(Is za_iSp0u!U?hIMlsu|PXQ%$YUz2OV%RU!a-h?rxA-o7qi1 zmZ`~z?TT;0X*VUN(yoQdpC??M?&mzvlMj$Iw|=A$L(X_bSh%+?Q?*$Z61-W6<*;xU z5w&y8prT|$Vn@9n&bGm#Do?IBfUzKEOg~t(+RL!~&f+^GU7$zu=Hj4Dj=T|lHXKr}c1Z@S&RGD6sg`i5h0xqfPyl;zo zPt0AptMrmszy<%h=FN}N;DhDIc@h(IN0=$f<4Z>kIB%Qgrc)l?H6pQ#ZXb43C0v0l z)PU%;^6Zd?4CKq&4sxGfe2}Vr1WpvargLtDJLuXM`=JA&JVT(%t>-9xklde>GSu7B zb-dvC?o5?Rk|pKvi0c7*Sdp*<%kqp8;S9Lh%YFoh(*gBNM#(45+DeebUV?jP>N)1@q9Js? zlya-i#)qegHa&A?8krFO=Y{pESJeFB0aJo4pb==Cw%ww_2!}Q|X~ivdfD0h3-NSNzJB?Q#?8 zt=TlX>%KQuATpk;Hk8@Fxny6J;^1|W}hj1{8 zQ4l#HCHvGtLebou>KfBSX|TUv2Zh8 zaegMLc!qRpDWF3OapBhz!GMUJy27NY0eKQNL(9^8sSn&+)!X5#oRvJvl^)7TRq*P^ zst?-^6}vL<5?f_Z-1-4m z4Cqdm7I%#8X=VrdMYOHSnwJd?l^>XCbX3gUKONG2l}3ILv)M~AwTdsbcfWKKhr&Eh zTOT2WXx$78A2!$awyC3FbyC`NX(L0V(_pH*6TZH(nw@AI;a!G;(3(~JH4fm@oLW{+QWJ?El?RW_`y`;@&cvww@$(o4O_$etg zzWa^Ng}11A$iML{iR*$ZEAv!|7{yy;EUzdb>>Uw)Fm%ndU&1!qi0JodGm!)YoSx}t zfE`SvbNnw;GTluAZY+feZtE99@$O)2>x~iz?|KLD8ic*YVru3oc<~v_M}dexv$N2S zKezMal*5ILeCs3B(h!uz;DK?h0KRp{Y=!Ef{$ku~(eqgeHH7iT^j-7O+<-Yn+@cE$ zNSgJ>nlgpMTngk4UTZYR#dOW8(M4~J{qdo?M;05%s)g^NUL-(NuFyo&e08@wdZQ&F zTawEWmRAXlo=VrQR#^7UlFlHrQq-@Qija9);rnhEQP5%M?O>2h$-mW=7yeRnyHvj&@U;_U39-CM^Gt; zK>+7%ejnd>NZeZMch4=};AzJ2a8$ifQ>8GuexS^2+3zGErai7yZ0u-xmIVczb^2+J zfGL&g^a!a?DdA#eca-7O!sWp=IPuq2B)Jlo2v<^tbJcqRp9BG0v#zUK>gi>iUcxTg zlTID)`?7Qre22djdAn%GLSXL|*<{ZL4!R6WXxQZBtrZQ~1U`O`*_XkeOxENal*qlM zspFSgD@uB^QmRnJV>-1M`k4>uDFaVSQ{)0FCX(Q|*7gjkQTC*JkSvcD6V1>%i*VRG z*w*+#hKRCss?JfoHaz)!8)v`%_M4mF+KKiIS30@}Q9Lv9GTB|UbYk)Lfv*<^)b>5D zDwN!PtX7J|FV3p1HtidQj{0UA@sIKt8K>vEwk}vF%q^&l>P6RFj-Y0ARiuU_d{w=a z9XIaba;kO?f_6zgDzYO9j4S$-fcVM+p&woVdZF3xmY|*xQ5o8whP#rnoG|aYa@F3} zEK@_syMX-)Zv1aXO}aVehm78%#6=a;9|F!+15i?i`ff2_rJC{lTqI-QJfMqUYId|X zTWH;>;YdFvdleffd%*zPc5;^zbdH~Z*7&M#&ZB>0pew%WJh~FPK|D-Jo;C@3d^zzj zqymQhG|4$ul_p{PL`w~$4$&i6cLbmBD!)3DvH@v_DBfuMdk!>}y`4newiUTlT~GMb zm#7fKFqIs#-C)JsaYvSujE{>GlD$6tu2zY;4eI;0w@NtGv7YGyLovG$jNdVD!&8jv zt`%#81&I92g~D#*FlDQaYtE>7TdVic+>P&{(5x1_?i!}{xN2GN$(zPJsHE58nKrlu z+XV(hHevO4j%er-V zufE+GDMX)@UtYm}7-PR#eJZwkGZ>i^UQ-tKdLJCwdRLdLES|u1^~RB{`^rWuh%hg5 znXretgh%vDD4|%*Rsj2xZyRWcCt@{+IEiQEGWTdoR0SDA@a}VK`1;|yARWyFJ-xNL zV%=rspJU50RSDD(H~M4NuuEl3)W^#b~fAhU4#lWB>y?Ga9e zC0f6uI%~FGaZAcD>CzDu)pB{4PZ#4`r)nbaV6Ppp5i^aUIZ3~(7H-ABLa&TkAum?b z5S}BE#_;BNWZ#;sJrkFSu1ECmAVxVqlI^tbaJas!(c^OrLzo{|B1-)t5U@57ECaik zt^zeU6hLmGro@FD3rD`jlrO{Sowg+|b>kuBLGINJnw-N6*YBQN+DHfX&(ApaxD5^s z5f$FvG#^3-HFwq1P!J=7H_qSG{2)M30lwnU5O#8y*iI|82rEBwIKT!&%9)*g=oU=< zX(@9IN4w;h%Kgzr+Hx69w~IbKIB*`X!O66L!}_90W^e&EZTLr0&Z`9W_bH!%h#%6< z%#G60$h-@<-*+0aRk9bprCEM3kz8a*!xd2tKB78;!W;Pj-~WkP0Fbf z%&TS*i@t2hszeK~*2de#s7z^3*Cc>;nTS;?qWo1gm9sOdI=0XO7iu6C42WFCxK+Jr zPYQo;M6Hs#YR>K52L1-*!PG3NaVj;w#R#|KX>%Hn;Q4uTv%x#Geb$xTRqFg6XYwOA zLQz6nX70p5%tAAi)N6y8Iy99hLiA-mOxPQ0BeY3M4Wy`ke{gk~?9p;>S+}y8{?nIo<^J#z~kB<<%fFkkIxL2RA+*ry( zT_O~O2(@O$2eQ+%1ePRUw>rjz595iiymq0_Om`2mv1vA+`I*0+ZJo%o=sgc7+-+!G z$9z#y7BG;55-hzQ!e(O+LiS2{{^7NX`$td}#pgmY!5*_quQa?KeZpAkSm^-x_$UWm>>Lcun_z8C)2ygOU6cNO8A8^#g4|-rlVDxV~rfUiMHJQ7+Gtu zgiY=bEb?6K>Iqm6|F|-+L#-S%M{qf+4?^IFeP9(WdCk9kKAo0hY^4e>bqhXx;5;GKJWsh~?-IwYwJ1$D9QSbb-5s{|GH?5-7DeP00Hl~e zJV0&BU$($&zi>Q2A$NMRIpwkY*exAZ1zjZW)o(V8n;OR_Zgt7CgjXDf_^tV7hA0C! zn-kt)TZT=^EK6t1BZn&GmcCpHCYQI}Y(o)f$c0053I~jcl6zbZ6#R9w6$Ouo@5jxG zIrJk-ozpiayWqn|HrA{GJ5if#l{CYVOt{J0o2b>)j&mb|=3EQQss4W4nNrrzJ#B(1 zo`kx5wi+G&3^G3VR}iiKuzE6gJNF8mor4tf>2GY+@5R5ccjK~ z`DTM5KHiz==aEu<@6;f-N5tEg@$Q8Jskgj~M0{hq~hop1hWURb6 zba6VqLR%i6|8<&HG)qzmf}(~nS|fGEXKZ^V;RZ_0^xLHPxLj%x@4EXA5qDeTEG=I_ z^N&2v_q2^}5CWlAw?o;J!H|8waIitrcE_0N5cV{CF1(L-F6SP>K^^XhkFnD?x=vM2 zK{~mY84QS<={!9uA7SJD`(lG&%;HGwhVCyC&qJBmjZDuw2SD03*?4ff2j)|^LyU`7k~PUB&CfHURnNCM;J zVCtSW}q+}2S-PaX&H+Evs+3B3}Z}SNe^{8Z5d`L0v?Dk{^!W8RCw@_IFG9<6t z?R>r0?s$|TPuznnHB=fVH4#^p4L`@ymABYdr>0&!QeJCpK${wBmgJ9p+v{YVc-N%Y zY5*mlTmTsb!YW!~sA5^|)o7R_izHZ>ikDg~}NX9iN z$&Zb4k44SZP?hY>ea5AUQ6H1DSZqM$uqinDS-nC zZ>$ET(`t{pZA)4U@Uj4pm!bwbjkT0xDn*a(g}h0)*i)$*WOt z`|*&?hGYxZDun{7ixJ&eX%#F&EbZwWuc77@kL{PNr2A==(IOpw$E;I}AyQl}XtIAW zDiSf?8vCswm@~TG9;tcvTSdZ$-JD!B@b zn_EWCp!{KtghcpvFU}uwYc%q$cTKvjgX);I>+H zaVwtE;YM{YRP`eUCaReCjBNUErQtg^7QXeXVC|Hl@RW;fsDe9Pxjx>op??Lc4LIi_ zc=AI#a81_96;8IEX0S11o%b|8DW#4U3Ot_nv_RJ3f2I-60u+$VoFWeGn^bZwTgt+@j(9~93;b#y;8|+ znKx!Ezm4Y`V#g}L6EKz__$>8dojj_hu=^|L+c^mf+}>am_fYfn?CEB&Uh5(KY!93* zGP|UmI2RfdbkF!h<}Wc9N^W}%kwK6rW+AJe@K6j0*hyY5^gccoOGOQiqgwDPBg3L* z3sWzN*{mheoh$^ol_c44FPa5ANo|dFs(G^)dLlmLyyFXbM9boe)k#vysdNV&ulo@M6FfA{s*K==qYaUgjW1%R z4qS9R__$>}`S?9iL6;B-3sDcvA;3EcUHkbj>W_@A_$-M@KIyTi!3q60hxx(={>5Pe znSmV4f5Va7f9d}qV}UQ^j14p6~@mEoI6~Fh)>jN~yT?gGe;%;4<_z za{>V(sBU*4ZKsLXtAbafzDN69Ey&9h1p@0Ol5+Z~oakR}2-rIjMn^uG!1e4o^2X~Z z(1y@bMIFT25wxTRepd9_UX5KxOg3drKNW@$x+F%C*cq+35r{k_C?~yN{U{*Ja7&Cl z@3~ZrXlo%-AoJ6infrL6Y1rK7`wRh^^VZ_&mkTR91Q|os$8eEpC)9~~-3-nrgJD0F zcklI7v3{O@9d8@0#DofM7Gq*Nya!>);$T27zn>zh5vI3bp0NDQ3LF5nD$^hhK12C{~u>*k2EYIX8 zJL_L~tF$A?%G^-c#?;Cf@CODJb})RwW1mfa5ArgJm-b8N--0N}PRiKa)a>6TDvrk1 z?*UwYy1z7}{%*WX`58+!2E2f){{&fIpxyso@bB?eoD3X)1G_JQ0REOlKn}()L;ZiR z+#KxSC~5`*16cpUTtR=efh>Q9`JXWb{Eqsck{7pm2Efg2OrIT?+X&k@nEx&OcCT)3 z{12}$9@PF^g{>&%8TzNVF{hk@X^1I)Q z&c*sn^Zs@1&vn)ph56a$AM<%>|E8RuY31kJ-{vnAJmBTS;h(Ac@7jDJsU3btM%LWu zB`z;>QT`V%?eqdy{{vbE{u}&$W}ct<`sacMP#c2G!L|S(Ban@e1wd`)=xE2o^o)Ez zi>6?Zote3z1EVe2l!oTFA4RaOk(1#wum6AV_HPs%_|HEA{MlWipy#r;HT^U8%WD3j z!T;UK6>MyR_{@T{Au|8#0pMVN{y+ej0RCvtWd(fB?aKpT^OwfV%m#d}?f=l2{}+vw z`*~Xb!wv}K;C>GF|InD3*;$@x`v1^4S^v{7@OfMRr{8Cd?KzqMqc0H1#`2u4|J455 zjs?i|U-M&OeW}R5`#OR_&pR9Z`|lOcKYAFy#Oeh%SGKi%&i}t@d1)Jy=RE(5WOr}` WfgOKG7s$fO!G=gdA+8{S`2PTu6b%*t diff --git a/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__inherit__graph.md5 b/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__inherit__graph.md5 deleted file mode 100644 index b9448d52b..000000000 --- a/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__inherit__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -7aa574f2b17e85187acd5c4123fa845c \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__inherit__graph.pdf b/doc/doxygen/latex/structdynet_1_1RmsPropTrainer__inherit__graph.pdf deleted file mode 100644 index c942599b6797aea127581c40bdd764313ebce401..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12731 zcmb8W1yozx*1rwKt+-PNP+Wt%yA&_Q3GNcyt!QxyE$;5_QYh|F+}*8M@jtZZ+z2OEUJ(`t7;aTx-s`GBS3aP$-H?FaR0Z5h-eq%I*+Z0n7kf0}DhxJ^+)Pv5l#t z8G!9sQbq&-08A3*R*uHt=d%^a(OAsb(ALNpQ9uCE!4Yf>vPN`G$yJh-g#x0rjh25k z1WWPESrKnk0z`zzn(8M+E0>CD1nT^MounRGXu)8|ME7&{d+KeULBAf{pXSm;D|1;T zZwfP#WNYlP31o1TUvHW0*&AgdoPzMN49bxr5n6+oF`0xUiLs4-MV6$lIr= zfi~$Rf!Lty5@Xnueh2(n$SH8c2MhfkBC9;#1%H*AL&T8ryhZXvEkxG{bwSJcp8G5H zJ=MqrF#CNE)Up&)QP(7_?W)5r9^)FyKK7?eL}MGHzvA}%?j_sew30J*sUKz0s*&TnhcXP?jJ4uF?(`cpfSU|T1js1UYf+KfhRicAB2I55>!ur+Y zcXlq)W*L4G1ZD(C(L#0z$7qWbLeE;oD$ZLo-_>`~l2>gzhpi`#C!-!u%dS&~j#JtW zr5XoX?Ck^(+4$zQj@(8isSLtlBWQSVs8sdTLQscBd&hZ59}DbveXW)t6@-NyB_#Nn zhtMxb=y|ds;rC&kgF+tZ6ka2~>P&m}Q)pJDDJ_*(sAmZWVio4}^wUp-5JY$=*T%-c z$M{`jY?xW0REBZOnoihuhgq6Um$S2-iW?;zS{8-cNG&8gGg9@GJyCA;H+SP z?zlkp%P)ZI8=vb&fc6W8+)V3?jMS&|EzPd~lu8I;W{pzySPFu0gyx38`WC5=i))Gs z@rmd_P%VvMYt8i*L&y}m1wvS8ET7^*>6gccun|SAF%ru)ob@fJirH`aj9J>+915R@ zZNnyqgD_wD+w+^V&SWZ4@S6F~tKSVgYiK;-sGkDM< z&_6ov%teK4ZVLFk^&|(|z|{<4ha?-B~BO&@J%zwhA4$j5AoA{>K)_7z?d_7?D=dJG+NbA_1Jr^D;OFhUB- zc*=dmf}Oh$o$_O*o<-6h7`|b92XTEe+Fm}C&ZmEbY=7}crvtSM{mQN%@|)t0AYcFR zw+CDrx`RWQ)3sIfbvV0IL?j5;1~)fIvR9rE?LP33kNHrkvPkfc6x9n879I^Jhc4c;$&HCcSMsF3E#b9NsU^Z@r{yYQIK zeOaHdXq($ke@pU)wuzVL5h$A=*b42+5=SV6a=P#?QfSv_8!ELUa`{QL+sBB&|8X(- ziI>6{@6;TH1x>5h2Zf*m##sg0!>^>agPE@RiRB>uqri6pXeVeOw;LqN1*v z-}$yY&O$;kz6)VJEQDTNe|-+cccgZ)67{gx`rUZz@R#FL{wWDM$Ohuev|b2qNA5Z9 zbENhj2t(l^8+@N6_!bocr+otWAQ;D1GCC&N9%02HwBPv%r{!z*t*ok)o;U!eTWZ~r|^th zI~-dY_Ta;mStd2EZOT&CEW6D+#4yGnZWDMO?~R|cVP`=wZmHA3aBQPcld?e%$CeXq z>d=~#SbbKCUw5Tyj|B!GV||yf68T+v-})Y-5GoDM!W4P(9dYT2g$y%7*_dlA$_e0W z7joSzXwIG^TnYsDYPSFvdqUWMCOoXO_Ntw{;?xa>m zoPr2nEMfvx-hb%SS&ZW6LG(6U66B+VC}viJ^C>8HGCr4dgVm7?&9MAJ7Q6V(1}-*y z$*J*uFuK)z&-!MP-%reFn5E;5a}6tl+%pH(@Ckxyo-#B|bu&<$KpcK)lSORR7__*7 zp+iAM$S=)pO4?2wZ^_Ey?W@qK?^G+hq?|`HUurq{`IJay`#W zbe`3s-b5I~aDynL8dU1v7d?q%Vfua7vpQ-5`br$!q+eH~E2|CTH+=kp!(m@cn&=-q7T>0UmM zNYPm!h@-CwLy0P{CMhy&c<&3+yENTUD=z9?(RN{pqah4dBe8B^h&#zuO%L{*@}aTd z79kDE7}rXaJQEtyv>(AFQBkU|ACqLrd>_T{R>;qN_~B>mwv-zv)o!>lsWw9U7L%p; z)OcY={S-q36D}S29x?px^V{}!EgjneV%PUKgHpX^subXit|((9ScC7E;$K7_FJpZe zqTpp_zs0DowoFumd=$bkoOiPJY|;lpvU)G6WL))N~4WZzt{U^&0)e28T_ zuM~d*Hh6-rw7&?RJdnf-qA7f7~*`ZrY}znD#{Qe3J^Uv{84_XSXr;Z-yGj3MS0}vIb5zSHGHl7PBByn8{mJ4 z3C*R}aKg)Yp=;&b%~Jq8$)*&4YsnOUnafjjQ7QZwofF^uF+KJu zV>WYkE9BD4TPzeM#!)E~Xqir&jK|7QZ<`vdXK5t@DC%U$FM{!S+agz?H7+zUJ`JQ# z-r7i!V*$7y5BNIiKv%y`46mXBSg?BBu#51v?JVc(yJ02BMYpxJ-ZU`<-fDe7VDDH3 zLd3t~nJ)HjT9STc##%k~(AO;7Scj#orF#(;I{N+e;$z^Aj0Ugbv;xb=PSTUoV$u{d z&%zpwf=BEr-14I{(?!%CO^Y{`2EqJ88R7(ftsE}FtRrksUFLH1UezXqgqbzLG0(P~{dqrT02eA6`&Fu(i5{H-;WRi#&OiKV}+`w$Qr z+D0`$#}jkrBf?K7H1@)@g-u-E*X!4iPN<;i*ecs)9^;Ocw}iH5B?bdisg`nxY0)*E zFa}Q9$+48EBw33m(@UoMXwalPHLxS%*!y$UgVYp zQR0LQZ;!Oz7%J*sH{U3en!TE%E>!HOej|b)Te&MrHZ7MU!d9E##2mMx$EY@;%2awK z{%%Eva_@G{^I%>(TuNPO0b(bNBq`4|yEbo4pMpslMVRrDY?R)DxUE%)0sVvC{jWK@ zHMQ4d^0(U#v1f?`dXU6d`IHYAx;d2^^t8z^Wb)~VF_rImD&{#iD4|1i^AZU2NWIif zy;Y=IRP#D4EXm{`TEBQ?dys!WQ~LGmbmx{=At`k^)Y@ki9x6YJ4bo|cOEAbkCwA#8 z26@=ZlHzB*vEB&7KB|wgY$q<QhVqbZGEqq64ZIB`p1jdMIHvO=`;oCL)F#roANg zT7~3n6uqbWTHR|BCCUpujf}U&??P$VbR-I}@IYkkn_tLM?=XrT;WHzR2|Of{+(*dF z6(M|PCxRBp5GAPHwHDE>I^LfN2o>59+GmrJFLp!5{WR!v%uPUuij4K0k@6MTR!mfZ zskO!pN}lDM_h2Tx4hVQRJlKPW@8V@=v^nR}nIZey)}|1DW0;}EYau}*fc2sh9g66j z9R1^nd)-J6OYR#+ljR<-dPYy0{NT?Zy9Oq;qoD;u{^aEtc}}Ywo%v1%sqZWb{=OL@ zA8>=rN>ik(-&ck5dZf%gkn8l16e*++y)UL#@RXD;!#%JjJxF*ENmzaR5NrW$tPF|YZcbx#hht$P>M z0y@E24z*j9Hzdzd(2)vn>r#ZAzN?p3qGsLIMcyw-Z2YQQPfC}#m#agL{idR_Mzgl{ z%q2>k$ju?8nORir-G=eI29k-iG8)-rF*UsEuD8ZC`s4| zZ@o;s9-P*GnCk&nJ2ljP;G0SNOo4eCB-XnLqxD6|R-1J%9BjL}N2RgwgLj+O9kbwO zznk-<=(gd$Fz@Pi)RY5%6@*5PZF9csk*v7t+pG-4 z4s5iK%CeKu`^+`X{NPE***@{QE0DTJ7~i@n^M^JRwvn&CccK909a_8kii=?zc8E;w zWxkG{rQ-;EC-iuN<%VgmG^nc&tX($JCz&k1iqOkkG*Gti$sotp9@h@dnj-@(`+9Ae z4k-%clgkaZz&`%WVZvRhn_+a<+#tVwHDqbeRsk7Y7LS5^c(D`y$#Mltfw-?hC3XQd zIe>+qQQG~ zS;)<)n52W7pJowibo4Y_em7PFzT5I3E#DFSCVka>SXtPF4iCtN+l>bHp7S{}T8z^# ztReYVzLzrYTHop6=sjc#Dq9sxxh?R8Clx&(=Hk&z_`!y@D=+;p;m`kT7&{c#hDTbc zc|{qP;Uvq_dT>X5WR*9gkZOe}iS2Hcf%Z{Mj99&KYoQ_G+_U=zQ|#N$X~(^LdxySc zF}ixG*2po=(u@U848PJh6_E8#!@NXqdj2>{_kadGRP^+hkQL%=`To-`arw{1N7B7c zg`>xl2lE>4C~>6Ou0a4*-2QjDHwn2_m7m~r>T~bWDBKp-;HP2HUhBm-k8UOdCb#7w zezfwH%aJLC;sTq(nwR748sd*vR_@=Op66&lYPb( z>6ZO!|9 z>xI>-hVJVO8ZD{)Y4NnIL?Uzfnb(p*nUC-rcf=WmX2P@{^%^sm8Dw(i82$=ZEL!*8 zoaA7#si9hweleO+E@Ny6jDfl^Yy@=0k>w9g7~6LV^{&+6o+tL~KY!MA;wK7icxBR{ z3(??5!c;2XL|BjNu2NYB+bHeEe`Gferj4i3_T!W5Sr1R=3mFx%p>y{TGQK#bvd&Lv z<#!>69mbQXMt#UQ8lkl00{ogGw*)6H<>d$TB1R5>^KxY$4=KoL8r;>;+Jeh%IuW43 zb)GV1zxB3TukOt>9{$zH)KzB&@DvqIANW>34%xeRY}rS1K}FYt?(4m9}6OH}Dt! z7Fk+}q$r!D&dLS9Ug0&8?xY;@BCWF|@{p_!_Bo|oKUV{x%+1#oEY8#>>orDmB@!Z- zXq9l1j(`%l>hwY=$#^F{j4q-SV)WKTbuogK!{9~6{A<+ih0Ckz<=7So(6Xn?h5qfV zp;%S^tj96@9MXnPN@A=-?}J2 z034d~Eie`M<>HBVwE9YX%u$+%Ru1oi9v*Wnd9l!Oy4?9w<>xA1mHonX=O5CAa!75R z^c1M2`0{wGXUY^ExJnRkdtb{^T=I+P$WuOFY*9y%_rkr?p_0Kg=q)Njj%z6S;Q(Is za_iSp0u!U?hIMlsu|PXQ%$YUz2OV%RU!a-h?rxA-o7qi1 zmZ`~z?TT;0X*VUN(yoQdpC??M?&mzvlMj$Iw|=A$L(X_bSh%+?Q?*$Z61-W6<*;xU z5w&y8prT|$Vn@9n&bGm#Do?IBfUzKEOg~t(+RL!~&f+^GU7$zu=Hj4Dj=T|lHXKr}c1Z@S&RGD6sg`i5h0xqfPyl;zo zPt0AptMrmszy<%h=FN}N;DhDIc@h(IN0=$f<4Z>kIB%Qgrc)l?H6pQ#ZXb43C0v0l z)PU%;^6Zd?4CKq&4sxGfe2}Vr1WpvargLtDJLuXM`=JA&JVT(%t>-9xklde>GSu7B zb-dvC?o5?Rk|pKvi0c7*Sdp*<%kqp8;S9Lh%YFoh(*gBNM#(45+DeebUV?jP>N)1@q9Js? zlya-i#)qegHa&A?8krFO=Y{pESJeFB0aJo4pb==Cw%ww_2!}Q|X~ivdfD0h3-NSNzJB?Q#?8 zt=TlX>%KQuATpk;Hk8@Fxny6J;^1|W}hj1{8 zQ4l#HCHvGtLebou>KfBSX|TUv2Zh8 zaegMLc!qRpDWF3OapBhz!GMUJy27NY0eKQNL(9^8sSn&+)!X5#oRvJvl^)7TRq*P^ zst?-^6}vL<5?f_Z-1-4m z4Cqdm7I%#8X=VrdMYOHSnwJd?l^>XCbX3gUKONG2l}3ILv)M~AwTdsbcfWKKhr&Eh zTOT2WXx$78A2!$awyC3FbyC`NX(L0V(_pH*6TZH(nw@AI;a!G;(3(~JH4fm@oLW{+QWJ?El?RW_`y`;@&cvww@$(o4O_$etg zzWa^Ng}11A$iML{iR*$ZEAv!|7{yy;EUzdb>>Uw)Fm%ndU&1!qi0JodGm!)YoSx}t zfE`SvbNnw;GTluAZY+feZtE99@$O)2>x~iz?|KLD8ic*YVru3oc<~v_M}dexv$N2S zKezMal*5ILeCs3B(h!uz;DK?h0KRp{Y=!Ef{$ku~(eqgeHH7iT^j-7O+<-Yn+@cE$ zNSgJ>nlgpMTngk4UTZYR#dOW8(M4~J{qdo?M;05%s)g^NUL-(NuFyo&e08@wdZQ&F zTawEWmRAXlo=VrQR#^7UlFlHrQq-@Qija9);rnhEQP5%M?O>2h$-mW=7yeRnyHvj&@U;_U39-CM^Gt; zK>+7%ejnd>NZeZMch4=};AzJ2a8$ifQ>8GuexS^2+3zGErai7yZ0u-xmIVczb^2+J zfGL&g^a!a?DdA#eca-7O!sWp=IPuq2B)Jlo2v<^tbJcqRp9BG0v#zUK>gi>iUcxTg zlTID)`?7Qre22djdAn%GLSXL|*<{ZL4!R6WXxQZBtrZQ~1U`O`*_XkeOxENal*qlM zspFSgD@uB^QmRnJV>-1M`k4>uDFaVSQ{)0FCX(Q|*7gjkQTC*JkSvcD6V1>%i*VRG z*w*+#hKRCss?JfoHaz)!8)v`%_M4mF+KKiIS30@}Q9Lv9GTB|UbYk)Lfv*<^)b>5D zDwN!PtX7J|FV3p1HtidQj{0UA@sIKt8K>vEwk}vF%q^&l>P6RFj-Y0ARiuU_d{w=a z9XIaba;kO?f_6zgDzYO9j4S$-fcVM+p&woVdZF3xmY|*xQ5o8whP#rnoG|aYa@F3} zEK@_syMX-)Zv1aXO}aVehm78%#6=a;9|F!+15i?i`ff2_rJC{lTqI-QJfMqUYId|X zTWH;>;YdFvdleffd%*zPc5;^zbdH~Z*7&M#&ZB>0pew%WJh~FPK|D-Jo;C@3d^zzj zqymQhG|4$ul_p{PL`w~$4$&i6cLbmBD!)3DvH@v_DBfuMdk!>}y`4newiUTlT~GMb zm#7fKFqIs#-C)JsaYvSujE{>GlD$6tu2zY;4eI;0w@NtGv7YGyLovG$jNdVD!&8jv zt`%#81&I92g~D#*FlDQaYtE>7TdVic+>P&{(5x1_?i!}{xN2GN$(zPJsHE58nKrlu z+XV(hHevO4j%er-V zufE+GDMX)@UtYm}7-PR#eJZwkGZ>i^UQ-tKdLJCwdRLdLES|u1^~RB{`^rWuh%hg5 znXretgh%vDD4|%*Rsj2xZyRWcCt@{+IEiQEGWTdoR0SDA@a}VK`1;|yARWyFJ-xNL zV%=rspJU50RSDD(H~M4NuuEl3)W^#b~fAhU4#lWB>y?Ga9e zC0f6uI%~FGaZAcD>CzDu)pB{4PZ#4`r)nbaV6Ppp5i^aUIZ3~(7H-ABLa&TkAum?b z5S}BE#_;BNWZ#;sJrkFSu1ECmAVxVqlI^tbaJas!(c^OrLzo{|B1-)t5U@57ECaik zt^zeU6hLmGro@FD3rD`jlrO{Sowg+|b>kuBLGINJnw-N6*YBQN+DHfX&(ApaxD5^s z5f$FvG#^3-HFwq1P!J=7H_qSG{2)M30lwnU5O#8y*iI|82rEBwIKT!&%9)*g=oU=< zX(@9IN4w;h%Kgzr+Hx69w~IbKIB*`X!O66L!}_90W^e&EZTLr0&Z`9W_bH!%h#%6< z%#G60$h-@<-*+0aRk9bprCEM3kz8a*!xd2tKB78;!W;Pj-~WkP0Fbf z%&TS*i@t2hszeK~*2de#s7z^3*Cc>;nTS;?qWo1gm9sOdI=0XO7iu6C42WFCxK+Jr zPYQo;M6Hs#YR>K52L1-*!PG3NaVj;w#R#|KX>%Hn;Q4uTv%x#Geb$xTRqFg6XYwOA zLQz6nX70p5%tAAi)N6y8Iy99hLiA-mOxPQ0BeY3M4Wy`ke{gk~?9p;>S+}y8{?nIo<^J#z~kB<<%fFkkIxL2RA+*ry( zT_O~O2(@O$2eQ+%1ePRUw>rjz595iiymq0_Om`2mv1vA+`I*0+ZJo%o=sgc7+-+!G z$9z#y7BG;55-hzQ!e(O+LiS2{{^7NX`$td}#pgmY!5*_quQa?KeZpAkSm^-x_$UWm>>Lcun_z8C)2ygOU6cNO8A8^#g4|-rlVDxV~rfUiMHJQ7+Gtu zgiY=bEb?6K>Iqm6|F|-+L#-S%M{qf+4?^IFeP9(WdCk9kKAo0hY^4e>bqhXx;5;GKJWsh~?-IwYwJ1$D9QSbb-5s{|GH?5-7DeP00Hl~e zJV0&BU$($&zi>Q2A$NMRIpwkY*exAZ1zjZW)o(V8n;OR_Zgt7CgjXDf_^tV7hA0C! zn-kt)TZT=^EK6t1BZn&GmcCpHCYQI}Y(o)f$c0053I~jcl6zbZ6#R9w6$Ouo@5jxG zIrJk-ozpiayWqn|HrA{GJ5if#l{CYVOt{J0o2b>)j&mb|=3EQQss4W4nNrrzJ#B(1 zo`kx5wi+G&3^G3VR}iiKuzE6gJNF8mor4tf>2GY+@5R5ccjK~ z`DTM5KHiz==aEu<@6;f-N5tEg@$Q8Jskgj~M0{hq~hop1hWURb6 zba6VqLR%i6|8<&HG)qzmf}(~nS|fGEXKZ^V;RZ_0^xLHPxLj%x@4EXA5qDeTEG=I_ z^N&2v_q2^}5CWlAw?o;J!H|8waIitrcE_0N5cV{CF1(L-F6SP>K^^XhkFnD?x=vM2 zK{~mY84QS<={!9uA7SJD`(lG&%;HGwhVCyC&qJBmjZDuw2SD03*?4ff2j)|^LyU`7k~PUB&CfHURnNCM;J zVCtSW}q+}2S-PaX&H+Evs+3B3}Z}SNe^{8Z5d`L0v?Dk{^!W8RCw@_IFG9<6t z?R>r0?s$|TPuznnHB=fVH4#^p4L`@ymABYdr>0&!QeJCpK${wBmgJ9p+v{YVc-N%Y zY5*mlTmTsb!YW!~sA5^|)o7R_izHZ>ikDg~}NX9iN z$&Zb4k44SZP?hY>ea5AUQ6H1DSZqM$uqinDS-nC zZ>$ET(`t{pZA)4U@Uj4pm!bwbjkT0xDn*a(g}h0)*i)$*WOt z`|*&?hGYxZDun{7ixJ&eX%#F&EbZwWuc77@kL{PNr2A==(IOpw$E;I}AyQl}XtIAW zDiSf?8vCswm@~TG9;tcvTSdZ$-JD!B@b zn_EWCp!{KtghcpvFU}uwYc%q$cTKvjgX);I>+H zaVwtE;YM{YRP`eUCaReCjBNUErQtg^7QXeXVC|Hl@RW;fsDe9Pxjx>op??Lc4LIi_ zc=AI#a81_96;8IEX0S11o%b|8DW#4U3Ot_nv_RJ3f2I-60u+$VoFWeGn^bZwTgt+@j(9~93;b#y;8|+ znKx!Ezm4Y`V#g}L6EKz__$>8dojj_hu=^|L+c^mf+}>am_fYfn?CEB&Uh5(KY!93* zGP|UmI2RfdbkF!h<}Wc9N^W}%kwK6rW+AJe@K6j0*hyY5^gccoOGOQiqgwDPBg3L* z3sWzN*{mheoh$^ol_c44FPa5ANo|dFs(G^)dLlmLyyFXbM9boe)k#vysdNV&ulo@M6FfA{s*K==qYaUgjW1%R z4qS9R__$>}`S?9iL6;B-3sDcvA;3EcUHkbj>W_@A_$-M@KIyTi!3q60hxx(={>5Pe znSmV4f5Va7f9d}qV}UQ^j14p6~@mEoI6~Fh)>jN~yT?gGe;%;4<_z za{>V(sBU*4ZKsLXtAbafzDN69Ey&9h1p@0Ol5+Z~oakR}2-rIjMn^uG!1e4o^2X~Z z(1y@bMIFT25wxTRepd9_UX5KxOg3drKNW@$x+F%C*cq+35r{k_C?~yN{U{*Ja7&Cl z@3~ZrXlo%-AoJ6infrL6Y1rK7`wRh^^VZ_&mkTR91Q|os$8eEpC)9~~-3-nrgJD0F zcklI7v3{O@9d8@0#DofM7Gq*Nya!>);$T27zn>zh5vI3bp0NDQ3LF5nD$^hhK12C{~u>*k2EYIX8 zJL_L~tF$A?%G^-c#?;Cf@CODJb})RwW1mfa5ArgJm-b8N--0N}PRiKa)a>6TDvrk1 z?*UwYy1z7}{%*WX`58+!2E2f){{&fIpxyso@bB?eoD3X)1G_JQ0REOlKn}()L;ZiR z+#KxSC~5`*16cpUTtR=efh>Q9`JXWb{Eqsck{7pm2Efg2OrIT?+X&k@nEx&OcCT)3 z{12}$9@PF^g{>&%8TzNVF{hk@X^1I)Q z&c*sn^Zs@1&vn)ph56a$AM<%>|E8RuY31kJ-{vnAJmBTS;h(Ac@7jDJsU3btM%LWu zB`z;>QT`V%?eqdy{{vbE{u}&$W}ct<`sacMP#c2G!L|S(Ban@e1wd`)=xE2o^o)Ez zi>6?Zote3z1EVe2l!oTFA4RaOk(1#wum6AV_HPs%_|HEA{MlWipy#r;HT^U8%WD3j z!T;UK6>MyR_{@T{Au|8#0pMVN{y+ej0RCvtWd(fB?aKpT^OwfV%m#d}?f=l2{}+vw z`*~Xb!wv}K;C>GF|InD3*;$@x`v1^4S^v{7@OfMRr{8Cd?KzqMqc0H1#`2u4|J455 zjs?i|U-M&OeW}R5`#OR_&pR9Z`|lOcKYAFy#Oeh%SGKi%&i}t@d1)Jy=RE(5WOr}` WfgOKG7s$fO!G=gdA+8{S`2PTu6b%*t diff --git a/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer.tex b/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer.tex deleted file mode 100644 index 9c42a5f0d..000000000 --- a/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer.tex +++ /dev/null @@ -1,38 +0,0 @@ -\hypertarget{structdynet_1_1SimpleSGDTrainer}{}\section{dynet\+:\+:Simple\+S\+G\+D\+Trainer Struct Reference} -\label{structdynet_1_1SimpleSGDTrainer}\index{dynet\+::\+Simple\+S\+G\+D\+Trainer@{dynet\+::\+Simple\+S\+G\+D\+Trainer}} - - -Inheritance diagram for dynet\+:\+:Simple\+S\+G\+D\+Trainer\+:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=208pt]{structdynet_1_1SimpleSGDTrainer__inherit__graph} -\end{center} -\end{figure} - - -Collaboration diagram for dynet\+:\+:Simple\+S\+G\+D\+Trainer\+:\nopagebreak -\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[width=208pt]{structdynet_1_1SimpleSGDTrainer__coll__graph} -\end{center} -\end{figure} -\subsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1SimpleSGDTrainer_ac3d5dd3f59db29f7d803130f874f9832}{}{\bfseries Simple\+S\+G\+D\+Trainer} (Model $\ast$m, real e0=0.\+1)\label{structdynet_1_1SimpleSGDTrainer_ac3d5dd3f59db29f7d803130f874f9832} - -\end{DoxyCompactItemize} -\subsection*{Friends} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1SimpleSGDTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c}{}class {\bfseries boost\+::serialization\+::access}\label{structdynet_1_1SimpleSGDTrainer_ac98d07dd8f7b70e16ccb9a01abf56b9c} - -\end{DoxyCompactItemize} -\subsection*{Additional Inherited Members} - - -The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} -\item -/home/paul/dev/dynet/dynet/training.\+h\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 b/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 deleted file mode 100644 index e71f3eb52..000000000 --- a/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -acfa5aab176d84bf285c01ec048fb5c3 \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__coll__graph.pdf b/doc/doxygen/latex/structdynet_1_1SimpleSGDTrainer__coll__graph.pdf deleted file mode 100644 index 735d92faa3dcd97473f3ce5209abff4fcb9b1da8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12710 zcmb801yCH@+OBbj5ZnR-1PMO4yAxc4gdhV9GPt`1LV{axcMZYaHCQ0HySwX!WbgCu zbIxD4?(Lzvd%gWF`D9Hs)B}~0xFjQxi35eIYQOXrg$=+0ur@SD;pYc1zXd@|9n1ji zPm&4>003Z?1Y0_Q?4GWc1`Z%`kdd`92t`m3#ooaVWMGBjlANPFEGGs;Yu+sD{U%T; zr|<1f(*I#e!0y}z! zL0MFXSLmyVFeX+1ywrDU!}|do3%)k}Zs9EYHpt5;Xv-YDqG?s8(*gZ!6g(dV!r{9a zjZ^Hy1jmagZIJbhwHy4E^Q3JRr<_>u>A|5_5rxMq1p&K;3j|y%D@iFbv7P>E8hgfA z!#|^@@YDuOvAFpn<+0**Q^e^*Up7^0FvvBZAe_Hvnt7vJ)nWZ=6QlWyNl55%@^vPo zc*P^ZaZv7d5t!RyaG>{-B~ubHMbA(`J)hmzMujz7O%XKSB%;7{qnV(_&aGn%)0W-X z;p*g~n8c3Ht}m+5Rw8Cs1d?&Wmk|V^<>kVXQ9uymzoPea_Z;`(wfA?dS2N{D6 zM6F!_I!_V{fR%+C0Oa5V=>4`9dz$mf+#c{;RDUW+%Ff!+<{#_$GyZS&Z%0(0X0^?5!Q`j6n8)=a8xV!z-?* z_J0&M_rI3)zZLfLG=Fvg@X04G;BS}y2&@1eAdvMR0vmvXo#WrO!oC|wjby%>ktq}o z2`;F6o~pKiuMM2;D@kNVgqpg9IVWZlzeGghC+6o4FoO~CM|54|yY#Rd_Vix3z3eU` z$|~GQv>0xhEUeqr1df<(+ey#XYWd>orrThUDnMSQBXmypcj)26sjrSe&$>d9`TId3 zAP6AMA>WZP__RTx*$34MOFX2|pu+kug+udT-U0Q77hq}k4G`f@U|g>xuHeMs0(=_h z=7t|rwqUTKXWDg(q0lOrN(EVhQv`J3t~Mzn-s$&51crv*mm!6hm$QuYZ!V%KVeDai z^M@gPBtIfJhvTcO<@L|7QBL18n(9L~M6a|zv8{4O^s}^Vjl@8O1yt1>i zf@~ZIy3Xrg6?Nq%Wrl%5NT(n``6v)~*3-H;sAA(g?faM?c+0~~7BNkV;f%YyQsJ3x z>8+Z4P@SyAlDw-NEkbHexw~@b&T#Cts~0BeWZke(+vw!G08nA|*{n?-aG1ZQzJWf^dwGXk#x}joo{Hdw1HmHww$iq(qa}@{>b&=mQ|00SU(bx+8jy zWX?O1m6d5hSRW&G^G+D!JvlVs1s5~3l9tblt;ZMSOOFmvwUxpVkJ<~1uVXW+nS__U z)sLr|9}D4n*RPrNVH3P>6XCBEJ(r7ef*3MCNb-3m=FXk>+L|T7KLxi;|hce&i8J|GEmmUChwhk=_ zAuGQmo#5izvZI6D9;ioru(2t{>7B2|)M%}z?AHU^2c2`IAI3pss`sFO6zU@=8TU0hql{xiYK-%S@!7ACQjiwyybk zwQPoDFRm0!pz+YrqcO2+WHp34`A~cilHX~a=Yh{g|3GD)#N87imwnxdk85(9LRwbL zZ&2-nlkpbq7!f_$Q>AI~nEZt|Oc{@PO0iYTTHaWqVg_H?olo|6KuSF&^;ULN7us5^ zc&b3rWt$>k?ENyjN?!d|Q%gq0(ycc;!atyHFZb+ghhqd&5)5O1C34yXj@Gt?XrB?vgU8iX zW6~6(Xt-)Vq9T7TF|{%PSYbQF)q)R_wG=0=yD-{htg-l)U*q1J_rYK5f;AC10?TXo zz;`!P@rMSm5Vz!Mn~wz5W)p-3jkz`c`rPLjBq~DAo^AOxHrsZ?cSIZ0i~&ag0|6V< zw`c3F$5!U!8j!;ij=Jl%s#8I}d+-{bwj@Piq zyLh*#+iCtq7gHvyj4ti&flzLpP|;8q)UjYF6kDrJc`zP$F`lowy*Wd<-i6-om`4=n z#9F|shL`dAVi+%YWjY$MLrWhe^d|PTpd#Ih9T`lc*PUC2k$x_gz{vJ+BRV46(lzvJ zW$%R3vQ6wZBt9M$6uss%2=82Ey2M<)0nNm<*bZrC0U~pkiDR*DjZh=YX#l<%vlC89 zB{tU*Ey3urj0(kmKMze0rEgPl(A4Tg+V=&T)dK8~*X)+g6kc_JLb-%Pj=Y*K!!Dg7 zu%+X+iH?qTThV*Hbk|w}9^}q6`fKquW>V=m>n|+I(msM`zkX^Ymrf)EJ{siJ_PBR1 znXH`keTk-9>{@$3wmZGz+Khi;W9W#{hcApp6Ks@uR~7XB6keeDEe5FTp)Wwz^p>t@ zh5&wMt|O`I+QOIf6_(=ak|%IVt{_K#rK(r?{liRq^qh8lu)it!n2SQOf`BsO7zeL~ zaWa(=BP{II)2o>D`}OOR@tD9ILoJfTLnAM%fX@gfmtJL}62ODjO^YfUD&VXfUmE~M z(=Tl!89<&-;W6)+b81q>JlYoQj?G5JpzNJd%>1e9{-Vk=odk9uI$GX~3_T0wTtvA$ zdPtUo&D4?c@mglohDg+L18<0v9(1(Pp7+`d?Ij{S4D)NLar~$Poye3;YBWYU0lDMFX*NUAn{AtZutrP7SFK~mtAQUf}i=D7~o4{#RoR@n-iL$gxr z6O%vhWOqi6y`bXsDw;2)jfYKT5z# zNa^&HdxVAC({=d-&xew377{?PIdNByV)Ez5@9blo3=dPRmv^}N&%qnrLlXlJ?1izx zDs<^>Vk`(emYIt84tbvmrXc2dx2ew2hMqjd&6!hvk;79*X8{S@D(`NqzO;xF)ERlD zCz1O}8z#hnYagiAgD;0@91h$m8LNg|Mmye9A7NFszHbOxRUG<~-a%+d!V16@L9XKf zuCGfI#eS#}KRR_J>U$M_(^+Wt{{4%vZI&v{$rl-#0V!Eb{xeX8Xe$@k6ITynagJ>u zfn4sJyn~p$*B;TD0Wx;zN*sL)NorksQr{YuKHee`BPaL>Z`K4)7D&$WTTE4;n-Zz| z(R7kwzF$3qdMm9W^Ax%SC|ccat#ZklNXBN~sm7@;9}! zz^;F9R1_ZlzHaA=$7ht0SI##LHNU$_au^u)!rQX(By(XuX$~1Cbkv?sS|DfVrZb$1 zIm1{eqtj=@n-6D|?8NJoKs!h+aapz0zeob}SPyH6V{MC~;W|SJ&jJ;dtw>UnY<=b; zdSZUIg3q_MF~V=}8{fH>YN#M~-Bw}oX&5%PR_@s;t5VFjxeD(@wNxI3X-pN^Q?!F( zoL`Ng{&c9e{8+{s5L&X*T5dMmxKGuIe7VXf#)-+;thA<-WymRcH1qkFt4bV2SAC?B zu2*#Sg&!)tgI1|7!!KX`pz>HvS3j-h5bc^JAR!ielqIlhTkc@wv8b#HZLyx5usp(M z0h%0j?nx6A6h&4Q)#-xcKYyxmU2IAc{&_8Eg@d&%^-hS`rPy?qt9m``^GQms88J~+ zfAnhrEyGMGl?t=PTw$#FURxZ%?NV5$zF}jQx#?acfacqG_Ti-U++fhG0burP##B$V znZ|;yI$r2@eSBqWE~?HVXAyjLpoj1`CyVv)-1Z+i~wyf zu}I50+!um1KbHmYKum2SS@VXwdh`tne2DyKsQO~J9fuJeC*<|yOJ|g0-=4FUDuukz zN)XbjL472(NJiWN zL=OQt4-2_NEtj@{-+aX-NbLug@n$WAi(`vt;x0kV{UX61@SUYcSdL)`PEdKIQL7$@ zMlFNKB%iS_D5B* zW8D9aub16n+>wxwkzYrVLVuQdy}aj<&j|ODif04$B)NF+SCj-CL7zhT1e9qOrHhoq zPUi~#^|fMZS0s*?88XAm8~Eyj2T;n#&p2&Ixj*It}P|3;xG89&tl3P7*US{Q2=t7wCrF6O?Wb%;u3lEY`v0`Ea?BVh`>9=_N zhnG_Wb2iN)e)1E>qBv{wMHicqNoTIAx8tcwO~evVclwA;&cva5-55>$D)COFA+sE( zYTFMV5Q!wzw@K4hdLcP2ym{d@z<`LQiB9M z1Wo$bdu-wQr0I(b!Qk4u`8TGWBj{0g*+6RUow|%^4H!mrdp86E5~Z2i#w{r1+SeD| z1Fta-j`Y3cIvUnA7C9}KVd~%$T#g5gWWS*=e87Awxo)qn1y5a>f=kPg3_z`*^g|)K z*AL=-7hVURx4C$FBT@VQ&3NOtyC! z)ikjqC4x1Ic^1~|02XL26 znbVgBSLp7pMXa1jpY`eB1?0>BJ|C&`|id=bIHt> zG+OovmQ(UqlNvGfz+btp?b5NZho+~)IBbcw9##{d%YRnDr4bqgs#flQprZHQC}e>n zcBTysj(gfvK4+HNec2Oxr5s^&G$EJSbp5rAtyGR4u#a_$&kmn`mhiWgG@p0}pQ* ziL7C?Y+%d zAq!NB>Om?>%y-S|&S(&S8f~HPh|L5?vRS^5-Oxtjcg#iEho2dkJ1Lv%U$4PAs5`2m zToTmc!Z~ViCTn!-Pz?)Bla8EW0u<$Pw!}jU>ay4YqCB;g>xy0#n1Zm=`%@{ZeYT&PhyQhJKRHZwPy|EOW~n zKl;VBKi9lrTGA}!H#KML;z}=)>e|W45o2wZUkYP~{q(EL_P4M^N#~O;T9m6%2u&?A zmxLn(de)zo#3GEgTAgBNrzwdvNI<4vQo!@II5u|8d?!>a64jSulsb;85@G78PM4C$ z>z{Bd#dbi&3xD$5=u-WS)U>rEi9ohGD0NIzs{g=a<#vHV|XcS=tZyKTm66}*ozK`2AdED)y$=*aUHn^oRPk_ zY zfs3W-`5VV~H68xGI-8%+Vkn{0aZD&-h2p;_O^S!Qz0gJ<6&hzNL^4a1Ix%_Q-3K#b zYKMlTB4^xKsO|nH^VdmkgZO^%2-BNYidJ*di;GX-5h`|u7F0U4 zsA>xqPs_%%^(f~^s*psBj=Sc)FY+F%qsOdBkn%<1q} zL+C;#2XTC8DxO(kY$plg9cwZ1`y1mgB3+Cc4D~L*La8N3A4q8~Qn8iad&Zs8I4hBc zvpfXAEp;C?zMDV1FPMwQ&Pfv^n~>U;v4g+Y+zlopf-x0%l^A#3i=Wq6ae>fmbwE&l z%|Le$pva=!Ltc=u;Lo|4-+IPSxoU(z0zsPhm=`>=kV#V7S%XbY)X zderQrKoJ}vn<#ILEv2bD!AAXNDx#1;5=ORz@Ggj;_<94@+0}d-QAyr9^>RSb_l=HO zaWl6(i9y^&H^EFBo_;=K651~5jFNw0KtZzsRbO=J5f}%KSWdJ#Y**1+BKVn%Ay3gZ3OJ+Gtip{bOxH& zC`49E%YOAk8VBqa1vX|P#wS^PDX(;bbXmUQJH5p{+&o!g$~bikddovN7=rrh`!ZsZ zR7ojf!8>JM$F)8|n;>m%%`cP$kw`$DgtMTOn>Xf!fr-t;)*kZTUiCNBMVFe-iL$V!BA^rFqd(d0$!j;)OSrw_8Zxj%n!Zkr-y(JqNQU4Jn(46SlC z32mzQ6bV)|;DVB-IhL5YV9x+B_k?^ZX7EBnp zWv+YvHNa&X+3-N)EObV$aKtD@S5R7BT^Jo&%q%GRt`Gu4jQFc&v}*&ME288D=izky zy(&2S5)oEi=lei=EQ9G8$M>YSY5r_b^jy)l81m-6+3$*Od-}Cp$RET<*=KSZto8I$ z4RG-~I|1`_W&AOgaG!s4^d$yEg=uhqTc zT^GRu{%BW=<1hK)>q)8E!B|tbE@k=9uWQ<&?PnX~yBsQGuC!7WZ0lblGN=ro^(E|@ zbD;1v9>yG4FMs#xScCoKbFt!q%1++NQdC1y=&kds^-T7Pk1{%(R_k{dEKcP1T+7ny zV9sIRV@if`k(4~{irf3{PSGBXwyzLv)~J_mrJsNT;)Wb+m2WKc@68uK6%uP3^b;WR z1=c`!=f=4Z=G{d~9es|@1Z{f1#vd$TTTW38N^9K#nj_Sy>g@UCjB z#bME1a0BNhO6O-JXFwSP87)Wcw2TDQb>eq^5nCeFS!Z9p+TP1>AZmC@_wmK(>L}j% zC60y0z4RHYFQqK?;2bRE_Q-g9UNlz0U8|+(h}a>hQtHmsZO$eDs|bSd-SuGi9aJJW zZKIEop!Jhw^7*ep3VA*W+;m!;PL$};7T5=0q8x*A#1|vL1(@$|Vrl!|Uoq(6uxSwc z6YfOM7hLk)7ZSC+{xGI>D6Kvr-OylZWmL?L!E}Y{xnA$a`ekl6I{<_kydy^k&ecwb zJ(kBveW9&}&Uv9|Wly@g_#^UF9a^IJo{eTm$XBXuiV#nJ+wf8mt^O2l7=bANz>Hd@P9p$?R_~O%?FD>Lw(;5R(Pbxe z;7}ImS0}rmnXvo|R^P9I?STekSUOhJD!aJ_K^!KW98_~sE-O+ix-ztq=yR;8D zi&)j-*EM#ScW+f>OD!Z@rt=)S3&UMxC_Si2KtTe#XlIhHT< zI&eUJ!b6nrAK8x+9bRhE$KdYiXukBqJV9>x%H?wPwJ#)cjXcI(Eislj9xt)Ijqsk_ z8Bu0MY);&$>nlMufh%v67Xb*t5r2$HdkS68a;0}RsG8@5FDIOFv46EWdjS+?_nJ>M zdCfy;$*gj8X%;V=6|?G4F0yrFCv~!RrqE_+u~0Wxvg(H9TxY44F1+i# z++Lk4VDj}({z{s}q3UV3rseBqwBXl_Mn2N$bg(Pgh^^GZBaH}v;C#TO3kYPdjhdWQq zaKu|s>}q4}y2Cath}G%^z5JiO;fWQ$ zH_S(Fd@O>!p&$rQGwnN+Ijtlb%w3IyN|Iz?lOEbx-cGBPoMAlBS@D76$+KKv6SB^k z&NjX}Ums<>aT(}szwPdyHS{s|C+8Y;5Ez!hHbE6)@-cYu@8n*_DARmt@$DUZt6KZ@ z7?r=iuD_=;kO@gNWwO*`Scz3`;`7HH#_+}bb8z=ec09mE>YB$}7RM~44v@8weS?LC zTctQcpQWxYa|}%6KH1D020Lm>Zi2}L>7-%Y$KP^o1f==wkvbE$xR~KaRT>#_*E4w_ zQpUcBMXL=O(~nOIlpF+)Lr}6v_C|#BSyD!-&*ops+KHuM=#ow|himL3K+7_{h4cg| zNhi?(G`>l3%b-dKd1+Zyw3y>0ZII1-MIXzFD2tZ~M>^~y*$yWX73zb0fLi;3^xsdy z>dQaso=+EN7HrJ1+H3cmS-!9^aiUzlIXmGpXNxsV+{j8NRathT`L(?Pj84T_7F!a9xOawRHX&I?MO&9anpkyvF_U- zeizw^F^?A3g3)mI%^-JK!Oo%eJ1xo$P^$Ui%DI&_`^7KmxS9UjI9{%RF-^E178G`ZUSZY7L*$>t2N^>U?$(I~?gx9w6c3$V0O2))mF4a9pDE8d)js{3JO zkud=E7QB{_On(R~SxKtQTskD|m2#(K-MhMR=#(VN@QSE49bJpVrg_PMqA*|W*vHRv zwF~6z2hwI^ulBvmQ|c_xyPM(dHNdW2PsSCdcrWdE4SIl#_nFP_Y?pt_D)k%YZu=bc z&Eir(FsKqod8jej$+XDXwS>lJUIc(qf7n{eNhFVSezU9F*I05qm zTUkiPuH^krhf4*baYmW0V{0j;u(0Q7Vk1*JK8njxp7wO(B-~xYR!E+#i7ms~#lha{ zg7AxnN~M#zyT9Gw!fzc>^Fh?;fJzS;A4J`Np9&Yqkv(~(W*Tp3BQt}3yvX8b>cRXJ zu0a(CzzXDvBwor}_UgnalZ*V_EEWkM-U`z@ZfkK5I!ECW1`19nub4yN^ESUE(ADLBN0>Za(qAGN7;ocoJ3 zx0cBEivk_6h}Ik7HO;14UsPYu;S!&jH;t*!M~gPMXel{z?Jk8e&zv$|X2h9uOc4#% zkFg1~p?{GHB z16Iz>3S_i}m2bK;(Q}t%#}Rk+39NQXdY?l1$o1c;C$P6A0KG)mTBIcu~`w$Nd;8` zzD28zaO~m95W)w^^ZE#9YkBv@2vi={V?A;Ak8>2!XBkjM7nkh%YU;N>vs4vw-XyFR zpGvd)xDy3%^*tk0H{+P8Te^NYVVnwjmza(0T>O;K)umsaL@~9x*ZQU4h1uS1n)11* z9FS$zlvBQrJn4xSu&%5lA#+AHe{C6XJ{lM)8wn?O3BE_LmQ8}RHN;hm3woI%>U)-@ zv&3&ADN+j>FKvNLAwM!MluP`cvkk zMat#?#Kn4BXpEcP<0b6RGnYa_9z}A5f_E`yIINiMhez*iZ`}lXQxx*rw!-pX6p49_ zPZ9YdeiER(vRC8ImhgtSm5`a3g}V6dRRMT1L_3+|JI9m9M0V~O#)qy%UO_mVqj;CQ z8Uc{jy)R2({r;hrO(qX9@&%JiWjw+~7wzipXe9_>bFF1ytqeP_C0B7ABUQi$mt-Hz1wFRWTDg>y2V~ef>p;`-_-%~=_eb+ocfKutJu~=M1~82M=+sOktf<0T>n{r-bV- zG@@e<@uomI;q{k&-7#+L- zounx_Kpl}(I_Lg6+$Y5uGg;_IYnO-|k0U-$#A5H!%klvWgyo{DAIVZszp8P&%-?$^ z4|_?{>#yXRJ>p&>3Q9T_c17mLr1fs@R=}D_FP%emq57S(n%RV314autXnI6pQX{%q zC!l(JH|6c<`oJi8@S=^4=Vhf{j+Y^;*NHHQaxqmL`O~+F`xzr$rs@knN`It*Et9uY z$O-vs(lkqur+QXc@R+nyjDcs~+;ipBO_|e@+-TIeY@vZkQy4D3jI#TlTvoTq-s`jO z=Tx^V3RX;j(qs<|R^==VJPxv!_+A`cx~CT#^DY4rK(MWb+~&=PgdpWO1F!cIaryB@ zqr2n7p-Dx$p0KGjx1esl=uubzgGI7I3~QOY9>k5H6%p^q3eICj(@nELcMzktPWHy_ zHNV1a-Y;?UB)|jHgiG^)+E5rBU8%nDc7Sg6c=>|NQG;&&(P|rh2bKfe|#Lp$RGjk;0f#*EEUhj z=Cg6G4_fdw7Jt;jt9L|>u%F?|XpmnGomM-A>%4St9^$4v-29T5!pb5yPwEhyc%|&7 zFdWYYn8%-H-JlU-XkvQ$E8y7t%FM*zTzuZww&=H89Z_+|VHQuu$!2 z))myT)!w*&wrzWz-PMg{|$oGQLM*vy!2u(!hZtIG)6Ekn)4sr(Fij{T2!OwcCX|h#&bR>D# z$vY}G9bG?8f~uBuB^9Ui?r+#z`z_j@ANpL`7kN<}r?Ay!QAA&nq2>y^uJN19u|n8_ zu6uqgZu`AK`gMSkE9`N>gF`kjWl~~X^24>mRm{bk;VX>6#iHqBoUP8oM0s`JOk$NI z_-H}~!g07JC}tlT*{zAExe-UR!N1^4yb+pLteskiC%|*v7%y?l+40EGZaRJ@Kj{N@5byiu4L#D?>+nRRhRdMir2$;~yhS z15FigTMhnd16ltJ^Y1YQ z{EqscnwNk)vEE>aDS%lM3=x6YgZ~zO52Oh;b}+O53ju!KDE~hnR<7r5_@5uHrzAXU zT>tCS=O>(;Tma7BOZ?Bif7%>R81nPo^Y!ohCqVhHai6c;Y){zkZ>v9Nwx{-!#Xn}` zU}5=F22V(`wK@d+47>xLza9RWs{gLdXI$F;cVy(i#?NtiUWv-TplHWug8Cn1GVp)s z?kBMM38jB3XaKE|0ocwO0AvEPGqD0_%^VzTc$uHL?kCaI&cMbDY-G=5ZD;!C&F^`X z?5vF)jh@i_|MzbH!+Qh&$^8G>U1A1LWp8czXY6Nh{zAV0r<02v$OMH20AxpD`PTv9 z003Z?1Y0_Q?4GWc1`Z%`kdd`92t`m3#ooaVWMGBjlANPFEGGs;Yu+sD{U%T; zr|<1f(*I#e!0y}z! zL0MFXSLmyVFeX+1ywrDU!}|do3%)k}Zs9EYHpt5;Xv-YDqG?s8(*gZ!6g(dV!r{9a zjZ^Hy1jmagZIJbhwHy4E^Q3JRr<_>u>A|5_5rxMq1p&K;3j|y%D@iFbv7P>E8hgfA z!#|^@@YDuOvAFpn<+0**Q^e^*Up7^0FvvBZAe_Hvnt7vJ)nWZ=6QlWyNl55%@^vPo zc*P^ZaZv7d5t!RyaG>{-B~ubHMbA(`J)hmzMujz7O%XKSB%;7{qnV(_&aGn%)0W-X z;p*g~n8c3Ht}m+5Rw8Cs1d?&Wmk|V^<>kVXQ9uymzoPea_Z;`(wfA?dS2N{D6 zM6F!_I!_V{fR%+C0Oa5V=>4`9dz$mf+#c{;RDUW+%Ff!+<{#_$GyZS&Z%0(0X0^?5!Q`j6n8)=a8xV!z-?* z_J0&M_rI3)zZLfLG=Fvg@X04G;BS}y2&@1eAdvMR0vmvXo#WrO!oC|wjby%>ktq}o z2`;F6o~pKiuMM2;D@kNVgqpg9IVWZlzeGghC+6o4FoO~CM|54|yY#Rd_Vix3z3eU` z$|~GQv>0xhEUeqr1df<(+ey#XYWd>orrThUDnMSQBXmypcj)26sjrSe&$>d9`TId3 zAP6AMA>WZP__RTx*$34MOFX2|pu+kug+udT-U0Q77hq}k4G`f@U|g>xuHeMs0(=_h z=7t|rwqUTKXWDg(q0lOrN(EVhQv`J3t~Mzn-s$&51crv*mm!6hm$QuYZ!V%KVeDai z^M@gPBtIfJhvTcO<@L|7QBL18n(9L~M6a|zv8{4O^s}^Vjl@8O1yt1>i zf@~ZIy3Xrg6?Nq%Wrl%5NT(n``6v)~*3-H;sAA(g?faM?c+0~~7BNkV;f%YyQsJ3x z>8+Z4P@SyAlDw-NEkbHexw~@b&T#Cts~0BeWZke(+vw!G08nA|*{n?-aG1ZQzJWf^dwGXk#x}joo{Hdw1HmHww$iq(qa}@{>b&=mQ|00SU(bx+8jy zWX?O1m6d5hSRW&G^G+D!JvlVs1s5~3l9tblt;ZMSOOFmvwUxpVkJ<~1uVXW+nS__U z)sLr|9}D4n*RPrNVH3P>6XCBEJ(r7ef*3MCNb-3m=FXk>+L|T7KLxi;|hce&i8J|GEmmUChwhk=_ zAuGQmo#5izvZI6D9;ioru(2t{>7B2|)M%}z?AHU^2c2`IAI3pss`sFO6zU@=8TU0hql{xiYK-%S@!7ACQjiwyybk zwQPoDFRm0!pz+YrqcO2+WHp34`A~cilHX~a=Yh{g|3GD)#N87imwnxdk85(9LRwbL zZ&2-nlkpbq7!f_$Q>AI~nEZt|Oc{@PO0iYTTHaWqVg_H?olo|6KuSF&^;ULN7us5^ zc&b3rWt$>k?ENyjN?!d|Q%gq0(ycc;!atyHFZb+ghhqd&5)5O1C34yXj@Gt?XrB?vgU8iX zW6~6(Xt-)Vq9T7TF|{%PSYbQF)q)R_wG=0=yD-{htg-l)U*q1J_rYK5f;AC10?TXo zz;`!P@rMSm5Vz!Mn~wz5W)p-3jkz`c`rPLjBq~DAo^AOxHrsZ?cSIZ0i~&ag0|6V< zw`c3F$5!U!8j!;ij=Jl%s#8I}d+-{bwj@Piq zyLh*#+iCtq7gHvyj4ti&flzLpP|;8q)UjYF6kDrJc`zP$F`lowy*Wd<-i6-om`4=n z#9F|shL`dAVi+%YWjY$MLrWhe^d|PTpd#Ih9T`lc*PUC2k$x_gz{vJ+BRV46(lzvJ zW$%R3vQ6wZBt9M$6uss%2=82Ey2M<)0nNm<*bZrC0U~pkiDR*DjZh=YX#l<%vlC89 zB{tU*Ey3urj0(kmKMze0rEgPl(A4Tg+V=&T)dK8~*X)+g6kc_JLb-%Pj=Y*K!!Dg7 zu%+X+iH?qTThV*Hbk|w}9^}q6`fKquW>V=m>n|+I(msM`zkX^Ymrf)EJ{siJ_PBR1 znXH`keTk-9>{@$3wmZGz+Khi;W9W#{hcApp6Ks@uR~7XB6keeDEe5FTp)Wwz^p>t@ zh5&wMt|O`I+QOIf6_(=ak|%IVt{_K#rK(r?{liRq^qh8lu)it!n2SQOf`BsO7zeL~ zaWa(=BP{II)2o>D`}OOR@tD9ILoJfTLnAM%fX@gfmtJL}62ODjO^YfUD&VXfUmE~M z(=Tl!89<&-;W6)+b81q>JlYoQj?G5JpzNJd%>1e9{-Vk=odk9uI$GX~3_T0wTtvA$ zdPtUo&D4?c@mglohDg+L18<0v9(1(Pp7+`d?Ij{S4D)NLar~$Poye3;YBWYU0lDMFX*NUAn{AtZutrP7SFK~mtAQUf}i=D7~o4{#RoR@n-iL$gxr z6O%vhWOqi6y`bXsDw;2)jfYKT5z# zNa^&HdxVAC({=d-&xew377{?PIdNByV)Ez5@9blo3=dPRmv^}N&%qnrLlXlJ?1izx zDs<^>Vk`(emYIt84tbvmrXc2dx2ew2hMqjd&6!hvk;79*X8{S@D(`NqzO;xF)ERlD zCz1O}8z#hnYagiAgD;0@91h$m8LNg|Mmye9A7NFszHbOxRUG<~-a%+d!V16@L9XKf zuCGfI#eS#}KRR_J>U$M_(^+Wt{{4%vZI&v{$rl-#0V!Eb{xeX8Xe$@k6ITynagJ>u zfn4sJyn~p$*B;TD0Wx;zN*sL)NorksQr{YuKHee`BPaL>Z`K4)7D&$WTTE4;n-Zz| z(R7kwzF$3qdMm9W^Ax%SC|ccat#ZklNXBN~sm7@;9}! zz^;F9R1_ZlzHaA=$7ht0SI##LHNU$_au^u)!rQX(By(XuX$~1Cbkv?sS|DfVrZb$1 zIm1{eqtj=@n-6D|?8NJoKs!h+aapz0zeob}SPyH6V{MC~;W|SJ&jJ;dtw>UnY<=b; zdSZUIg3q_MF~V=}8{fH>YN#M~-Bw}oX&5%PR_@s;t5VFjxeD(@wNxI3X-pN^Q?!F( zoL`Ng{&c9e{8+{s5L&X*T5dMmxKGuIe7VXf#)-+;thA<-WymRcH1qkFt4bV2SAC?B zu2*#Sg&!)tgI1|7!!KX`pz>HvS3j-h5bc^JAR!ielqIlhTkc@wv8b#HZLyx5usp(M z0h%0j?nx6A6h&4Q)#-xcKYyxmU2IAc{&_8Eg@d&%^-hS`rPy?qt9m``^GQms88J~+ zfAnhrEyGMGl?t=PTw$#FURxZ%?NV5$zF}jQx#?acfacqG_Ti-U++fhG0burP##B$V znZ|;yI$r2@eSBqWE~?HVXAyjLpoj1`CyVv)-1Z+i~wyf zu}I50+!um1KbHmYKum2SS@VXwdh`tne2DyKsQO~J9fuJeC*<|yOJ|g0-=4FUDuukz zN)XbjL472(NJiWN zL=OQt4-2_NEtj@{-+aX-NbLug@n$WAi(`vt;x0kV{UX61@SUYcSdL)`PEdKIQL7$@ zMlFNKB%iS_D5B* zW8D9aub16n+>wxwkzYrVLVuQdy}aj<&j|ODif04$B)NF+SCj-CL7zhT1e9qOrHhoq zPUi~#^|fMZS0s*?88XAm8~Eyj2T;n#&p2&Ixj*It}P|3;xG89&tl3P7*US{Q2=t7wCrF6O?Wb%;u3lEY`v0`Ea?BVh`>9=_N zhnG_Wb2iN)e)1E>qBv{wMHicqNoTIAx8tcwO~evVclwA;&cva5-55>$D)COFA+sE( zYTFMV5Q!wzw@K4hdLcP2ym{d@z<`LQiB9M z1Wo$bdu-wQr0I(b!Qk4u`8TGWBj{0g*+6RUow|%^4H!mrdp86E5~Z2i#w{r1+SeD| z1Fta-j`Y3cIvUnA7C9}KVd~%$T#g5gWWS*=e87Awxo)qn1y5a>f=kPg3_z`*^g|)K z*AL=-7hVURx4C$FBT@VQ&3NOtyC! z)ikjqC4x1Ic^1~|02XL26 znbVgBSLp7pMXa1jpY`eB1?0>BJ|C&`|id=bIHt> zG+OovmQ(UqlNvGfz+btp?b5NZho+~)IBbcw9##{d%YRnDr4bqgs#flQprZHQC}e>n zcBTysj(gfvK4+HNec2Oxr5s^&G$EJSbp5rAtyGR4u#a_$&kmn`mhiWgG@p0}pQ* ziL7C?Y+%d zAq!NB>Om?>%y-S|&S(&S8f~HPh|L5?vRS^5-Oxtjcg#iEho2dkJ1Lv%U$4PAs5`2m zToTmc!Z~ViCTn!-Pz?)Bla8EW0u<$Pw!}jU>ay4YqCB;g>xy0#n1Zm=`%@{ZeYT&PhyQhJKRHZwPy|EOW~n zKl;VBKi9lrTGA}!H#KML;z}=)>e|W45o2wZUkYP~{q(EL_P4M^N#~O;T9m6%2u&?A zmxLn(de)zo#3GEgTAgBNrzwdvNI<4vQo!@II5u|8d?!>a64jSulsb;85@G78PM4C$ z>z{Bd#dbi&3xD$5=u-WS)U>rEi9ohGD0NIzs{g=a<#vHV|XcS=tZyKTm66}*ozK`2AdED)y$=*aUHn^oRPk_ zY zfs3W-`5VV~H68xGI-8%+Vkn{0aZD&-h2p;_O^S!Qz0gJ<6&hzNL^4a1Ix%_Q-3K#b zYKMlTB4^xKsO|nH^VdmkgZO^%2-BNYidJ*di;GX-5h`|u7F0U4 zsA>xqPs_%%^(f~^s*psBj=Sc)FY+F%qsOdBkn%<1q} zL+C;#2XTC8DxO(kY$plg9cwZ1`y1mgB3+Cc4D~L*La8N3A4q8~Qn8iad&Zs8I4hBc zvpfXAEp;C?zMDV1FPMwQ&Pfv^n~>U;v4g+Y+zlopf-x0%l^A#3i=Wq6ae>fmbwE&l z%|Le$pva=!Ltc=u;Lo|4-+IPSxoU(z0zsPhm=`>=kV#V7S%XbY)X zderQrKoJ}vn<#ILEv2bD!AAXNDx#1;5=ORz@Ggj;_<94@+0}d-QAyr9^>RSb_l=HO zaWl6(i9y^&H^EFBo_;=K651~5jFNw0KtZzsRbO=J5f}%KSWdJ#Y**1+BKVn%Ay3gZ3OJ+Gtip{bOxH& zC`49E%YOAk8VBqa1vX|P#wS^PDX(;bbXmUQJH5p{+&o!g$~bikddovN7=rrh`!ZsZ zR7ojf!8>JM$F)8|n;>m%%`cP$kw`$DgtMTOn>Xf!fr-t;)*kZTUiCNBMVFe-iL$V!BA^rFqd(d0$!j;)OSrw_8Zxj%n!Zkr-y(JqNQU4Jn(46SlC z32mzQ6bV)|;DVB-IhL5YV9x+B_k?^ZX7EBnp zWv+YvHNa&X+3-N)EObV$aKtD@S5R7BT^Jo&%q%GRt`Gu4jQFc&v}*&ME288D=izky zy(&2S5)oEi=lei=EQ9G8$M>YSY5r_b^jy)l81m-6+3$*Od-}Cp$RET<*=KSZto8I$ z4RG-~I|1`_W&AOgaG!s4^d$yEg=uhqTc zT^GRu{%BW=<1hK)>q)8E!B|tbE@k=9uWQ<&?PnX~yBsQGuC!7WZ0lblGN=ro^(E|@ zbD;1v9>yG4FMs#xScCoKbFt!q%1++NQdC1y=&kds^-T7Pk1{%(R_k{dEKcP1T+7ny zV9sIRV@if`k(4~{irf3{PSGBXwyzLv)~J_mrJsNT;)Wb+m2WKc@68uK6%uP3^b;WR z1=c`!=f=4Z=G{d~9es|@1Z{f1#vd$TTTW38N^9K#nj_Sy>g@UCjB z#bME1a0BNhO6O-JXFwSP87)Wcw2TDQb>eq^5nCeFS!Z9p+TP1>AZmC@_wmK(>L}j% zC60y0z4RHYFQqK?;2bRE_Q-g9UNlz0U8|+(h}a>hQtHmsZO$eDs|bSd-SuGi9aJJW zZKIEop!Jhw^7*ep3VA*W+;m!;PL$};7T5=0q8x*A#1|vL1(@$|Vrl!|Uoq(6uxSwc z6YfOM7hLk)7ZSC+{xGI>D6Kvr-OylZWmL?L!E}Y{xnA$a`ekl6I{<_kydy^k&ecwb zJ(kBveW9&}&Uv9|Wly@g_#^UF9a^IJo{eTm$XBXuiV#nJ+wf8mt^O2l7=bANz>Hd@P9p$?R_~O%?FD>Lw(;5R(Pbxe z;7}ImS0}rmnXvo|R^P9I?STekSUOhJD!aJ_K^!KW98_~sE-O+ix-ztq=yR;8D zi&)j-*EM#ScW+f>OD!Z@rt=)S3&UMxC_Si2KtTe#XlIhHT< zI&eUJ!b6nrAK8x+9bRhE$KdYiXukBqJV9>x%H?wPwJ#)cjXcI(Eislj9xt)Ijqsk_ z8Bu0MY);&$>nlMufh%v67Xb*t5r2$HdkS68a;0}RsG8@5FDIOFv46EWdjS+?_nJ>M zdCfy;$*gj8X%;V=6|?G4F0yrFCv~!RrqE_+u~0Wxvg(H9TxY44F1+i# z++Lk4VDj}({z{s}q3UV3rseBqwBXl_Mn2N$bg(Pgh^^GZBaH}v;C#TO3kYPdjhdWQq zaKu|s>}q4}y2Cath}G%^z5JiO;fWQ$ zH_S(Fd@O>!p&$rQGwnN+Ijtlb%w3IyN|Iz?lOEbx-cGBPoMAlBS@D76$+KKv6SB^k z&NjX}Ums<>aT(}szwPdyHS{s|C+8Y;5Ez!hHbE6)@-cYu@8n*_DARmt@$DUZt6KZ@ z7?r=iuD_=;kO@gNWwO*`Scz3`;`7HH#_+}bb8z=ec09mE>YB$}7RM~44v@8weS?LC zTctQcpQWxYa|}%6KH1D020Lm>Zi2}L>7-%Y$KP^o1f==wkvbE$xR~KaRT>#_*E4w_ zQpUcBMXL=O(~nOIlpF+)Lr}6v_C|#BSyD!-&*ops+KHuM=#ow|himL3K+7_{h4cg| zNhi?(G`>l3%b-dKd1+Zyw3y>0ZII1-MIXzFD2tZ~M>^~y*$yWX73zb0fLi;3^xsdy z>dQaso=+EN7HrJ1+H3cmS-!9^aiUzlIXmGpXNxsV+{j8NRathT`L(?Pj84T_7F!a9xOawRHX&I?MO&9anpkyvF_U- zeizw^F^?A3g3)mI%^-JK!Oo%eJ1xo$P^$Ui%DI&_`^7KmxS9UjI9{%RF-^E178G`ZUSZY7L*$>t2N^>U?$(I~?gx9w6c3$V0O2))mF4a9pDE8d)js{3JO zkud=E7QB{_On(R~SxKtQTskD|m2#(K-MhMR=#(VN@QSE49bJpVrg_PMqA*|W*vHRv zwF~6z2hwI^ulBvmQ|c_xyPM(dHNdW2PsSCdcrWdE4SIl#_nFP_Y?pt_D)k%YZu=bc z&Eir(FsKqod8jej$+XDXwS>lJUIc(qf7n{eNhFVSezU9F*I05qm zTUkiPuH^krhf4*baYmW0V{0j;u(0Q7Vk1*JK8njxp7wO(B-~xYR!E+#i7ms~#lha{ zg7AxnN~M#zyT9Gw!fzc>^Fh?;fJzS;A4J`Np9&Yqkv(~(W*Tp3BQt}3yvX8b>cRXJ zu0a(CzzXDvBwor}_UgnalZ*V_EEWkM-U`z@ZfkK5I!ECW1`19nub4yN^ESUE(ADLBN0>Za(qAGN7;ocoJ3 zx0cBEivk_6h}Ik7HO;14UsPYu;S!&jH;t*!M~gPMXel{z?Jk8e&zv$|X2h9uOc4#% zkFg1~p?{GHB z16Iz>3S_i}m2bK;(Q}t%#}Rk+39NQXdY?l1$o1c;C$P6A0KG)mTBIcu~`w$Nd;8` zzD28zaO~m95W)w^^ZE#9YkBv@2vi={V?A;Ak8>2!XBkjM7nkh%YU;N>vs4vw-XyFR zpGvd)xDy3%^*tk0H{+P8Te^NYVVnwjmza(0T>O;K)umsaL@~9x*ZQU4h1uS1n)11* z9FS$zlvBQrJn4xSu&%5lA#+AHe{C6XJ{lM)8wn?O3BE_LmQ8}RHN;hm3woI%>U)-@ zv&3&ADN+j>FKvNLAwM!MluP`cvkk zMat#?#Kn4BXpEcP<0b6RGnYa_9z}A5f_E`yIINiMhez*iZ`}lXQxx*rw!-pX6p49_ zPZ9YdeiER(vRC8ImhgtSm5`a3g}V6dRRMT1L_3+|JI9m9M0V~O#)qy%UO_mVqj;CQ z8Uc{jy)R2({r;hrO(qX9@&%JiWjw+~7wzipXe9_>bFF1ytqeP_C0B7ABUQi$mt-Hz1wFRWTDg>y2V~ef>p;`-_-%~=_eb+ocfKutJu~=M1~82M=+sOktf<0T>n{r-bV- zG@@e<@uomI;q{k&-7#+L- zounx_Kpl}(I_Lg6+$Y5uGg;_IYnO-|k0U-$#A5H!%klvWgyo{DAIVZszp8P&%-?$^ z4|_?{>#yXRJ>p&>3Q9T_c17mLr1fs@R=}D_FP%emq57S(n%RV314autXnI6pQX{%q zC!l(JH|6c<`oJi8@S=^4=Vhf{j+Y^;*NHHQaxqmL`O~+F`xzr$rs@knN`It*Et9uY z$O-vs(lkqur+QXc@R+nyjDcs~+;ipBO_|e@+-TIeY@vZkQy4D3jI#TlTvoTq-s`jO z=Tx^V3RX;j(qs<|R^==VJPxv!_+A`cx~CT#^DY4rK(MWb+~&=PgdpWO1F!cIaryB@ zqr2n7p-Dx$p0KGjx1esl=uubzgGI7I3~QOY9>k5H6%p^q3eICj(@nELcMzktPWHy_ zHNV1a-Y;?UB)|jHgiG^)+E5rBU8%nDc7Sg6c=>|NQG;&&(P|rh2bKfe|#Lp$RGjk;0f#*EEUhj z=Cg6G4_fdw7Jt;jt9L|>u%F?|XpmnGomM-A>%4St9^$4v-29T5!pb5yPwEhyc%|&7 zFdWYYn8%-H-JlU-XkvQ$E8y7t%FM*zTzuZww&=H89Z_+|VHQuu$!2 z))myT)!w*&wrzWz-PMg{|$oGQLM*vy!2u(!hZtIG)6Ekn)4sr(Fij{T2!OwcCX|h#&bR>D# z$vY}G9bG?8f~uBuB^9Ui?r+#z`z_j@ANpL`7kN<}r?Ay!QAA&nq2>y^uJN19u|n8_ zu6uqgZu`AK`gMSkE9`N>gF`kjWl~~X^24>mRm{bk;VX>6#iHqBoUP8oM0s`JOk$NI z_-H}~!g07JC}tlT*{zAExe-UR!N1^4yb+pLteskiC%|*v7%y?l+40EGZaRJ@Kj{N@5byiu4L#D?>+nRRhRdMir2$;~yhS z15FigTMhnd16ltJ^Y1YQ z{EqscnwNk)vEE>aDS%lM3=x6YgZ~zO52Oh;b}+O53ju!KDE~hnR<7r5_@5uHrzAXU zT>tCS=O>(;Tma7BOZ?Bif7%>R81nPo^Y!ohCqVhHai6c;Y){zkZ>v9Nwx{-!#Xn}` zU}5=F22V(`wK@d+47>xLza9RWs{gLdXI$F;cVy(i#?NtiUWv-TplHWug8Cn1GVp)s z?kBMM38jB3XaKE|0ocwO0AvEPGqD0_%^VzTc$uHL?kCaI&cMbDY-G=5ZD;!C&F^`X z?5vF)jh@i_|MzbH!+Qh&$^8G>U1A1LWp8czXY6Nh{zAV0r<02v$OMH20AxpD`PTv9 z$ \&values)=0\label{structdynet_1_1Trainer_a85e86d4970c50985f6cc79f5901c576e} - -\item -\hypertarget{structdynet_1_1Trainer_a43093c84d5faab07d9e906af61f13bdb}{}virtual void {\bfseries update\+\_\+params} (real scale, real gscale, size\+\_\+t idx)=0\label{structdynet_1_1Trainer_a43093c84d5faab07d9e906af61f13bdb} - -\item -\hypertarget{structdynet_1_1Trainer_ab8a4f50d1d3bcf8178984c040338972a}{}virtual void {\bfseries update\+\_\+lookup\+\_\+params} (real scale, real gscale, size\+\_\+t idx, size\+\_\+t lidx)=0\label{structdynet_1_1Trainer_ab8a4f50d1d3bcf8178984c040338972a} - -\end{DoxyCompactItemize} -\subsection*{Friends} -\begin{DoxyCompactItemize} -\item -\hypertarget{structdynet_1_1Trainer_ac98d07dd8f7b70e16ccb9a01abf56b9c}{}class {\bfseries boost\+::serialization\+::access}\label{structdynet_1_1Trainer_ac98d07dd8f7b70e16ccb9a01abf56b9c} - -\end{DoxyCompactItemize} - - -The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} -\item -/home/paul/dev/dynet/dynet/training.\+h\end{DoxyCompactItemize} diff --git a/doc/doxygen/latex/structdynet_1_1Trainer__inherit__graph.md5 b/doc/doxygen/latex/structdynet_1_1Trainer__inherit__graph.md5 deleted file mode 100644 index f5d46aaad..000000000 --- a/doc/doxygen/latex/structdynet_1_1Trainer__inherit__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -179feb913982145fd63eb96dec855108 \ No newline at end of file diff --git a/doc/doxygen/latex/structdynet_1_1Trainer__inherit__graph.pdf b/doc/doxygen/latex/structdynet_1_1Trainer__inherit__graph.pdf deleted file mode 100644 index 7b851852e00e5dbb663b0d1bc9ef7397ea16902c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14861 zcmb8W1yo#17Vizg2?2sTjk`NRg1cKFxNGC??(PuWEx5ZwaCg@b+?@}SduQ&c^45CBJqA~S z=wRZe%Ch+nWVY~ba5A&G!dhkd<8lXtN|y*9onKUrCvK?9NqyyGD?=ORig+FoRASvC z&F*H2mQD#9&xcKT$$`J*?42wiPx|9i+>;K=MQ%)=dbrir{MHTW8l8hbm@yRyxEY$u z)!=Mg`dTZIEgfGjjIK%8zAWtz7kb`zUpqCojvRwz&t#4it}F{ZTGzF*60~$D_=}@? z?r;zz9kxLFKuBbj9+2pB2}kv`R(Se03u6WlMw^PkE192wHShcj9weGt;g<{y9<$z2mkEhRwE# z*$_cH{WhEWm~cIgIefHYUbO@Zw#9d17JH|sP(vgJCrnVOG&U8M)qyDEFJ}2Tm@T2Q z?}I@2H6e=R{EMZ$<3hBnz%3>ECSjKca%nm@5=7t2bf|(P`9`IDN%CZI*mev&GD;6~ zlxyZ6h0oG_$Q&NBZpRw3Oj=?1Cg&qpN}VKFVjU2dkl$C`UI|x-RvSm2KdG0sKo}4$ zTPd`jjE<=j;ty*(R;QcbPjZlFB zc)P=r(N?k4GF%fj51rHFG0FnGScI(*T2>g5dBH%bSBu=X>~0879CK|lArvCHbHM;w zKO#EPcKG5ui%l+M{h>0oW`JdnO1#Y&81nW~_q9U32i;Yl1bl8p_e#GWXSrq>Zcg-z zxzdX3cc4c|-!ISU^SXzsm~=arDR+q2J&haxseIGpecRM4O^%Neiw>HjL>_!UzF$;{ zl4|-r)RiHPC#bH?#P?IWE*Xdk49etrxDE%q9(#al7lv1(*Pp){WBpfS06IlyD+2(Xtd5bv?}lY{Yz$ugF#KJQ zPRc;vM2Fwf3Gnq*q6aWB(*qbe=m8qPtp#4&d^NWPysb%p79bHDOM9z-^y82J-|F83 zQFv|DMh9qX_12c2^WU-AQ9RE<504&Tb|FM)F zxfsZ*uhh{TA4}_X`ZR+(zWy3#diR-Ny+Sn3z8K`b zd2&8kE2(cTzQMB{W|{qF7G7J@RE%jnT{}-qlQzs}BOM{jO6wr4<3%~&xjdrue*ZQ_ z3R(XM(h2@Nhk@SMH|sj{MSB9njt^0#A~xr={UVnD0J!7;fcfzhm@PGc60ekkf&f9# z%jpp^=raIbsj&*{Yr)cpI$o$fgE--Qi-QaA-__N5!-74#fz$sqK47S>YI~&WA|WOQ zr@y&p1B(J}^eMvyrF$kg#j%H4_{8za3nz;Z-^8770PR9(kfT}N;}j&v4GeO#KnG#n3=t&o6g*9tg{cU4Zn)zGc>^18H~ z*ub0{PrtH`h=le$&;;Np4rhcmI$KosaC;2ssPrfZRc0#{^!n3q_LI<8-%Jo5X`nQL zG!SF}0_41=V&j&(xh|1uA0g(KBgVe*&tFdk0d(`Qmu>W z(9t`P%t0ZNd`mkcj6I8Z1NoF+x+p)BgCD}sZ|Zw$N`vg3jAh7JrgLlm+%`VBQfZGg4Zon17ymJcygt%L((zt<3vCEfR4;a8@Ic<94NjoQ~Rm02B97z6Jn<3<*LWaN$3~U_;_t#w+JuKUEYaZA0 zyS^)4tZV$ojJhXY+XG9QpKIcts+YW!akkapX{#x<KvGJU!^FzpyXxj=kVK z6LpP2tw%k+=e}U{Bm|`e34GKN1?k8-Cqvo>w<>(`Zve$f@g%?l37pjmLhs0WB13Xf z27L~0V9zk1eu2y|0)P6z^IrAk1J4}nGqxM;?6ajTbjQXi`nHR*!y~qvvcvtWI)7(* z+9*7*wtgY_-P89G1b%;Q-S$1ulkeEbpqzJ|x9&&Rhj-3(5BOxq&iF6kWgTN4px#`3 zXvVz0(mFAb4ip|J#J!`zkMaRJ=87+T7!kL!;;VeT{rf=ya}|trrWFRl$|cWtA7{4a z_fwuLE)sJ4QMBAsaH1jJq2d)ya|&__uU97%*6x_6f{)){SWDWF8g^@Yekb7w*>SxENKGBdgL3Udg-Q4&EdL3dN72A3(;Kr6CV%RD>*Scm~DKbrRk}aIJ~YbYAsIy zp6}kN{R7|RZk=GO6h5bgfrE#HjNAu({%Q(Oj!>aodJmH@O+^Fsp^yAq?*`4LopmI0 zvcDCQ)AOZ|pRy>*irR6zV?zL;%F8;0EN+%{vlq!+K*U|p_uxq=embW`#g0U~m3&Qp zFSaDLJ44Yx5qQ~XTy69jGy4mXYCcKT!PLFVLT#i)Y+G%4_H+_wZF4@*ufY+ziz`_5 zas_O&wehlD2L9_H&N8^%eA>}muA$hE;|c1aqh7lFBY)z%{x}WM^B47=(?I-PZqrij zs}-%i308|iS5#r8^iZ9Tam@5em_G-ww%)@%&m7H~q>h$>Bo0D$`7YKad60W*RR1Oy-v#@9Ub%@vF3Q5(?obUF1jG7m zW-!q+}q!It-J;U)>~Tss0z_qtD_}$zRDsM)Q^NuFRMew>5<4JTM7;bf{>@R1}P2*q{dY z$o(?q5j}P}aKade`_h@x$U>#ONyUc)3&jX3Q_O^LtuNDR0I80QaKrO^Ut2VbAxS8o z2<2vCEQ(_7DzLTcn4y@Ux5s$#$y=#1FZthwRSvD@%=y)!ZysSJ^@5BAdmr*A-R5FicGbCM-CyKnC1)iGQ2?aWGEi^DC0I zq!>B{E5)U^n(Ht&xXF)BW1qqDA}fI)R<7>WkEV}wjgWb>8L!1wML0|BwkWlE$P0&RwbfM z^PwZH3w_s_5K>_`o6Nlmt%l!tWFO;EX++HXN=Ci(^a}z$pSn5kS8&KOe z$meF}%Pao$O=^l2Ts~X*Il5y8%4K09#U1uubDyj+@<}01|7Wd0Q|Udzne|gV^QBAE7z5xwr{C$wKv^Q%2KiH zJTt??_jTJjP<_nG^-L_umFKs#w}I?-M;*wHPLg<#fe*5?!!4ht>JIQ09D4cZ3kH|0 z!@g|X5A@R!PkPg;6It9UaSx7%vq*1m1lL(vjx>wd6sRUqwUyBi#op0II``Mnbw?4b z4W(HL&kCwy1)mwAn?x9V3W!j0A=1ZwPSQPE)#Xb6E|~H7OFhQuak1!yQ1F}n)|AW2 zrxpcv9N?18aYcv!XM(y16Y7TPq7s!H?|tzO&KERm8zGmn5|0skJ)@i@G(iZxBbj>W zyMAiP5i}Z)XJF+ik%y7$d!{&&>2ynIcmXwqnOtKeiVNLq&7g@R!Et12{JF?zajj~v zj>_kwCOKSp+LntbtM?p%8t8b!E$p3Qw=oFu1IcJDMPN{@MNb`U1P&*|;|p6(f?l@S z6iC}B@so#@j;j}K$);u^H0Dg7$UcQa*p>xj#(;YCqy(H(U@w3*a8p3Q@R*_e{8BTb4C%u*P;Q7p1u zx!B+g3+>gC7}Ox7f`aeIcIbMVsZjmEwrxK1p7&G(%*lxcM$W1P>4AYU+6Z?Cd)ij8 z7U7auU%$ksVLOf?6rA#f=)q47R@z+Am`;5S(%ny-&cqcRoK)fmKixz5rCkAk>T+$4 zaazhr8Lz5*^6(|QQUuWr1=z&$nMVQ+TR3jl%9@{RWfV$gK2R>fepv$*K;5s=$!=N! z0)f#Y4KF#e9QcH~J5U(M9{Uv|PpHXTx6IpmDXi>geRiR?1}n{bD){~0iLh#kF%%Wn zflQ6CDfG~ALKfCNo^-w)|L>!zXkp|$4JZOh+=5sPs*B07(I2P$V9n(bslifEB=f2W zYxA_jBCR44ZFMx8_s~Tp6!3c|7slAiZo^9)1+bl$@gf`dlD(7l6l#egylQAOH5PH^ zhQ=EUg|;M{3E07|qN?tDI|I-jh6%XQt=>6kD1P?yT1`D-SHsGWlL16&>8wop(9E9% z%p;SCkw=DAGHf~rUnh{k~4Us&)Fptv3bIey&$0_ zDePgRm|HSzW_$FnF63Ta*Q)BPD4r^Q86t@YcwSg%PDvMqLFNPL+C`dZW}2oD(@ZK1 zj+ui(vc{#X4zyEa-A(V#4HCs8u!_HvSIBS+QTXyjXl<>I*b|-9W6ls^76cJ)Ev{i? z8-s9CUj{^xiyH_>Bo~A>@#*rDFs*evtUED2FgZz0yO(EhJkWhZu2$bfQWiKdKGmv$ ziW%`vMg0_sskn1TPzjjl5dl#DIUj2rA^NNUmS4Z)g6Cqx$r}yoLM}8#>*BM?7Ja0dQselQyB)Zhwk=L9H@ z!c?|xT}-NJF0hp5qqz2mut?CH@P%*c^|(Ud5=eKD&i0DAHb))JLeC%Q&FVsg3B;p$T~!*20q1<2VU6 zOFRac2*JsTJLx+UDehGralw_oF51Hi05w&s>M0bkI=6p(CK>TKjcMJRh+hp}JyO7G z<;^xxsek=o|G5B9;Ql~r&a$zJI^_4%I+rSyK}$C17OdDYJtJ86Rux#3%AwJ;garHppRXT>==_qfSlBUPJ>WN!&YKnoEAwvnTm-XQsQUDq3V|Ak7<^3lvedm zpXtjT>tS~#GLDPq`;=f5^1C(RldtHC`D1sJpJYAfQ=QCwiFgejoEZs^hOBVP^vAO# z=J?0Hd!3TU^DGm}A6HDQ&ShM2!n;PTe|p%uB#))0pc3(aCP^Qit-blr3a@=HVy z@!ZS&XsJ4(;n{HwS!r-_c%dlDR_ZAA5W0fvW6Cy1yIZU*p+1}mo#g#m?j9gYWYFX= zIc;m4geg7es|eTaOKl-WnKPyR_v{+05Fckvc#GzQ@rv9iyK_u1ex!I{6NLwG zr4@xHDgt)ou4_XH&+TUwn}b*gCO;TR&c|sPkBHXuG9vxJ< z&zrceJv4fCC3Zt`P>)uV$u2W!SC-z^Ct^$~fzT0Jqsm1F8A{d%jIk>NvH46RndgDORka}sUXwy6$_ zhX#r(T$VKRL#??BQESyyQUw#KPGV~%muM8HLxtvki;_n(UJM`qlNRU6BqW!9nZdGE z6u^2`vB+qeJGc2b&DuQVS0NUkjvLLY7E{u8o%Alg$3~Z$;O?~>uZbo7h4^V0Dq9D! zuEEMnEk~ZaS;8f}=e zn5^;0O4W~9Cs}x_SZ@}h=BiiJ-eZG)^dlDOQ*C#@Szb()BB=<2{;%mB?ap;j*_zKg zKVwF6ghhl^+}#5Z-5O)(r=&KZ-SWXHT$+c` zH5N&ipRVegSCvDxYlebIgDsa*^rBdvoAS79M@CX{K7Fge{f9?>@FR7XpD||U;dweP zM+PQO@B6?Sxp_g-=8JP@gw&;#^Err=JhmZacpClV$RsonrN;~nj5B%bx=?_8d)SOn z*7%=tLLoxlM@RPH4~Yk%kNSlE2;?nMzr55nW+(}z6dDdKADp*d{AGwhQeXT+ugwo= z!ByfRBGBv!c&fs6zPYDSI!)e1$Fnj>)*`_Zuqp{V3{l3R!k)R=@DGqe&x}WhyxD2` z&_=9&XRWnxJscxTaY5p~GmN%X?MQO=QMiJkyDN}s#`_{s zLiUljroAIBv%EJ;a4}LJb5%beNd*DiY6U^v zsuSi{UJhl5R-7S!TWotDWnIgjzs0l?s}Gh4Gt=lIeDreJO<(Z2FZ1fdfXD1qTp`{w?b%!%HRrm|7_?UDvb8NG z9V>R=_~BgbVTC@Ev9c!LUT7TKVWOt@d2O7doOzc4r(w=;y*$qb`N**!o=&JEaioci z1(s2^EMD;8b!;=aQJ>=hV)=-wn}vvIiobhYC=Dg?BfN|R#KmmEXU+RXvop>YA%B9P zEYi;S`-+i*QXmVwZ=bG8c8&bxjEO6hLF0GNRTV4WEi_lewjoVWjT_u-wxV0?9UQ3& zNB)j)FFrP2S(fs#-Owk>`IqD2FW}}SCH#W(#5_oJH%Gv)op?`y>q!2bH^@c_8IR>) zK*M__w7o{jeCJw&S&=P-eN%s8_2BNP?u8`Gb6fwF`>uE3AGpyCFBf`xiG~D*f}d<~ z141c-Oj@EqOo94tau6K#%tP<1ZATQ!he%$J|aDkIhE4)^IesmB_Gd5Lqu?BuaRzgzz0$I=y9TOs6 z)69)@#GwZlV2;BkY-9E}flx*tL%#CyUmPn1tBPoGkw70U>GxCZJ;YFCRh1&Fo(ulS zW)YYrRG1%o5lLjcr(m)k1y@EJ0#R&4&~bU=uBVwLo-@anZd=(6S$-1OC((4me+#6d z4@xq2JN;tq#fsydCE;V!6HzqFyl9n@yr^mYu94vu9-4K3(__)3K4TI4882hvRdqn25=t^@H zPf96Q78wp}Z905ClDKDS@l;#$EPO2pu|g?+uP{toB_q2S4j_G0w^umRDEV*}J6X7d zuTz$6mgR?*q%D5x8o-SQ`(us?b)=Xrl@O-@Yf{8xG@a{Q$$)E%MI3=;rRy7OLM}8(Ti4ZY7(nrE^#et4dR|e>64?Bfw;V2rFYbX{;vlO zG3i2BHAf8J%yYOqB9jD{mDHjy>@_rCyC&>V@#AsU5m{(c{e2i9n!6BY40n;PV#+WS znz*X^Q@~@ws`2CK&3tkY)t856$R=sf$%f?RRcFMW`V0)FX;x#1I#^#-R6&wBZl&?| z1Dy5nAe(UX!wQFA?!i%N73plUdJfkc_VsEt2I8P$Mt+gqPFz~<(=3=*Xfp>7K|um7 zv=moW@*%6Do2U3&YcVC3AHK(|xl(kV;mR_tCL@M{X*O}Y-S-Mn-N+GfhLk-mHuI{V z3GyY{(vuY4N?G-kn$9F3cAe3FNP?ZgGx^$&n!heV@3A&gG%{(mkj|^tSv&Ex5Ax2$ z9cG@(C8s$@k=5LAW~*>#px3-VWIbjEc}Rqzv$cwp#8*A5wu*K3nlhhCg+#~V=HUH! z_q)b+gctv=izOI>t?D);@F)6E&0rYFx)EMBpZLc!CYpmKgktQcH6MW;ZDL0sS4CY~ zlCJeBo=stdTK&SY{2Tk8<7sW-9`Qu5XyLDAq&o+@noxCfsa^Srs~%HNC;*l~BWB%7 zg8j2&H{;vA#nZn2{k;t6C*P%qNhoX8pQ9TP4R8k$yJj^*Sm;J2{j$MP1b?3#n6{c;AnttX@^DHSeh z5~3&{O?xd1&0*70c$VEx4g{}l+YVz zXRV&NV9AXAg}t>eyM6{V#P9kS<}Sn*+}VFLLZ)ES5{whUi+yf>jEov`(7>$0VLBh| zca8@_O2t!8#$U+OShXk0qkO-s5Sd!%O9~%<{VH2#^b?GGrxzJ#JA0djD|qhLqE1=f zhViIlxz^Rv(Zoyc4(2vl#)CsH#={T1*(Di2&auet8*IJBKiT$2F__uJeb&HiX!2cV zwhjbQF)5b}Ep}PAV9Saai8TJ`0y1aVjZMx3tuXKj>Lzk@iqupep4ASd|y% zJ@PP9`YSriid2b{;z#a@dg)E}`i#%4d&UEGhn(C4dpyufw`l;{%4d*3Q7+W1J@?IC zwEVlr2C!?Kd@BfQX8Sv|W)s9L1`9q;PNXQHpLxta6e`hA%teehU|(co@N7TR$8Tz#L_O&G-PxrC_kiT9j$7+Q!J`Oh^-i@ja?->3N; z#0ojtNP`%}8`YijEXa6AJTGO~;@Q!+Rm*UQ{fp4(6EE{AC(9Ml?x=EOHbIL1L$<$r z1#+Z+6<>A~-;>zvB;;U{k{#;JuAE`EeoksZ=(0ok@Y64X_!z4&Q2!xjj^&)MY@FT! zVrzt^b|cxws|k8UIJ^Ns!pJKOcAR8$%QC1SqkuW1Z#0P-3xG#)U=HAm9&V4+%Kp)q zOJTyf$=$6VCl@|r;fnq&(1$yjJLH=byxTO&{>g!Ia}S3i;nlKZ%nRvmuIF;ZmVJ{?~xje?D)mP7@; zXr3N@1k-P=XtmEWs`JmefL#qjTAHxpUNXjyQdjS9HPzTF`q zVhaJ3DeMUjq7bTiU}JzNN^QA^RmnBqk@?fk$Ik-!vM#t}P+h=plU!cbBlw1rgP&)q z74_*SlA2WUvw~`V{1^}ptM@;`He)_{-X3*_4;8rE_RP}>oo#wX(7$RqYXdw` zu$TQXh2C;Y!57GHO;^EuKns5Xa$~`67T-wYX=g3ow%8@!nYT9}T zAt1u>5`s~MS$CQ2iX?BU>dkQZL)mpH7bCh5a*S&bt>BrwH;{QrncH@%o^eB(=|uqf zJ5aB9Vu{aAqVoi8UG&4%3Y@-uVVUdhcY%eqH^!afTJvQkJb)8Vl3az zQuGr5rqw7EWtlU1LQde*8?CrVo@Bte<->b#`Y@}r4EBqkWLEA8kxFG$G-hr;FpTi% zHY!eCaQq*qmL2ZspE3_3tVOFscTvLm%nLnQkEC2S|etxmYb%t8Melp3Y@7u2O z0qEDDL2zv1;sy^_q>mk`qW&{j>8Yc3L7|(4*|v*Ih|jD-wAPH17`IUBBTP@H# zeCz>f^A;;NI26PdByCUhNoCM3H&Y|4UK|sjxC2zx1&WC5xZg=+852<@x=i{}f&Ua>^+I97b(?|oUhdZxPr|#X>$lPmB zbRRFsIdsE@f9j*|LomZ}f>l*Q%wu;2*Fn0^;8d=P2~O7I9FaFK$gKvw zFWx6k>}u*A$aKzVU)+2vlAzi2AYlgNi9tAAGo%ZCxR59vmoHz!3{RHJM7D~gypp#3 z-c31?rPL0G@XY1%=c$591+ZPx26^ulx0Y1=dt#Aen<2l`auH47mPv;}!qw$1?tAgJSzGm0YFqzrawBt+^-)K#` zMmwp$&uy0-+ZwZ{8&|Hg4&!+MU;U9spucOqh8d>%vRugiZDL&G2J(YmmGkwGW)1BQqcQ}F1yMccAt!-Q}f#P+CdyVO5LR%JOlolkQWka*;#LZxoQlSG z3eU9o)g?>*Iz{ZpTbYJJm4P0g=*p6U0$-CRx`=g?oG0a+7V{>?K2wToxzZi~78J)E zSX>9%{UIZFZAo$fTYOQpQ|Sheoe~R4$b8&(Qdj#W2kkeI<)uy?YMyrZu*-y5VAD1t z=Y}u&G`+{U_Vh_LsbF8mc7L$^_308qVi9Y|g%P6R_HL67qjHArU?Kif=G|3#;9iK~1z0#?GH@=Fq&CnUM7QU7*pziiJ8R>oDPV1MZ+zlyTlsOX*d1Pc_3eqayE=uA(hEJ2ZBoRzN9X!MAVe9O95UVt8Fp(gnH{ z?*rIYMT9dXB{Qz`)hC7wW!}LZtb-|hPpCyxj1(bW5*_Wc$_^kQRvHsG9WSX@dZ0@R zCU3seUoIgIi6kxXFT$ZabGVIgBJnx>A%SYlu7*Hcl^WrY=n<}0)Km#}^(v>NuX8W;fr(XIR1l5t zVnH#vRhPj!5T%QcXa_;vzC6X=q5r@n%wq{Mv>}M;oIEPAHdiye-nZc_9&;mRGiT!# z!^6EmMB^m{@*T+o7D=UzuQY5FcE!b|dyf$txw|5R3^c-pi{{PA{F+@{{ zt(4bSqeA$jajBCu(0g^lvh_f)uk+v}U|2E(&UEN*^^v~msvfd-eC?2kc>kiOzI5K* z4zpdG2j~m(MJZJd9ZpTaqoWX4{CnyhYkcb@V1)D6)$3o!XL!>Lsd3tl@J1i7&LqOI zW}<(|dc-ZX9f((7vL+EwMTcaiE2i=t&BD=c&f&w`;(MY{OX&|dB#Elh)O=DOJbi5$uuB?=A><$i~c6T;eGZId2mg}kTi9D_fY?~JHhOx=q zJK3oR*|hrtsr~-RyHc603@DbnisA^Dz>dZOx$8f2qyRB8FFiM10wUqNaDyOcSdZY( z;oO(pJ%CzrQIKyJ_cIKY>L-m{B@7hy+I(1J88zabQ`a?HETWHaieb>X0mwZX{sEPl zXG4tECj;ZHdd&PG!n!f}u4tZUugP#Re2s^q49-0G;V~2G$CB&$<=I>alT&#$m8Us% z>_&g+pkTXEH7U$d2~$COwL=@KI_6@r^ws9J+SGUr;rR7cJ_Pg~7y>vtT=h=gjA)4} zMkyfz&G#0hYSnr|P?;-YPBfA6ai@3#QSNAT&pxf4dY7;W3`tuC5$VV_#zy<^VJE|o z^}X@d#O$z9tpl_A)EhVqWD7j?Ft+=d@jLWe!jx%}=uhOGLcMEk^Da>LFBl15phKK9 zD36&Nwd?M~12Ms7QzCc5G3WbqV`iy5F!3eVNBQLzxgZ(_C+p(2I}|Zo@YSn~8uHvl zxyc?#C1o2*oI8IdF7`f^1Xy#dGBHKO%cKP5NU5wDzJr?E=XV4{_rE*r-*$cf zwZoo)ft7{r?``iK|GPn);cZX*{~bA_AwLA{1|YUvpt?#TMB{sZiI2*oY`q;1Jh%qK z`64gDB0SG=dooldM|q`vLO)DRl(0F??dYMN@1O{ARrv(wvU^It#i zK8qaCB_}4c4P$qG*b1mHFc%y9g2cnQi<{QFfb}CE{@cc9mt&%$$ZhkODvHs3@~_?Z z0hh)4ZN%x;ly=_rso5pD$!kXX-x>1HwgaR0_>nQWSJ$MIz#7kQ-czCEXZ`P-{ho-w zCXI=S`R^%Xcmoms-qimGC3xc;1PyHUY)q`|ENy=8(0`Mpbu8XE24OixJ~1k36AN8? zTLm4UB#pd*k^LVda~&gF0Q0{p@c)4tXc*X-0W^&4EU!EM85sc_EKGl~4PtgW<|cZ4 zKqGSl0R8V;e71UTY{aX{@8Vl0-pX&4e+vRSR-y(bM#ld(QLrb=QW&$(<(5aXJ`GB@2e+$1IshH^78QcDahPM^?R6S{pa0`NJJTCuLJ#<3^=9*S#rnIe|Mv0ED;AbF&gGSX zc|HHR{&Qsf%m3T?&FkOy|J-GIQ|MnIm)F++D8GHYD!-AJS9HZv325@h)dAktlYdU# z|30g4SdH!PNJ*IJzs2dTNAmxIXYAidn|}~24F9HpUICa_V(;|<2axOOnAlhX7-$)o zX&C|J#&&jAoOG}J&#P!;qhn=kqGwBMX=6k|@w**a8%uqAy;lP8|GwJ4xgdsrqJ@95 zO+e>04J?iR_>O17{by67?@${|Mdc}vam3*01N?tGzMly=GVD?djWud zY4r3Q9Iw&%FO8nz_4)rVjpH>z|5IaNVyFKfJBC+c=fCXe8JHMeC+R=@y-M`|>yLr) zzx&6)#PW(d{dZj!*4GgIr$1(all.xml ---> - - - - - - - - - - - diff --git a/doc/doxygen/xml/compound.xsd b/doc/doxygen/xml/compound.xsd deleted file mode 100644 index 969f1322b..000000000 --- a/doc/doxygen/xml/compound.xsd +++ /dev/null @@ -1,1113 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/doxygen/xml/dir_2997b6d9ddf8b2f83e82c6988822a05f.xml b/doc/doxygen/xml/dir_2997b6d9ddf8b2f83e82c6988822a05f.xml deleted file mode 100644 index 12c7265f3..000000000 --- a/doc/doxygen/xml/dir_2997b6d9ddf8b2f83e82c6988822a05f.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - /home/paul/dev/dynet/dynet - expr.h - training.h - - - - - - - diff --git a/doc/doxygen/xml/expr_8h.xml b/doc/doxygen/xml/expr_8h.xml deleted file mode 100644 index e1cf2d775..000000000 --- a/doc/doxygen/xml/expr_8h.xml +++ /dev/null @@ -1,227 +0,0 @@ - - - - expr.h - dynet/dynet.h - dynet/nodes.h - dynet/nodes-contract.h - - - - - - - - - - - - - - - - - - - - - - dynet::expr::Expression - dynet - dynet::expr - dynet::expr::detail - - - - - -#ifndefDYNET_EXPR_H -#defineDYNET_EXPR_H - -#include"dynet/dynet.h" -#include"dynet/nodes.h" -#include"dynet/nodes-contract.h" - -namespacedynet{namespaceexpr{ - -structExpression{ -ComputationGraph*pg; -VariableIndexi; - -Expression():pg(nullptr){} -Expression(ComputationGraph*pg,VariableIndexi):pg(pg),i(i){} -constTensor&value()const{returnpg->get_value(i);} -}; - - -Expressioninput(ComputationGraph&g,reals); -Expressioninput(ComputationGraph&g,constreal*ps); -Expressioninput(ComputationGraph&g,constDim&d,conststd::vector<float>&data); -Expressioninput(ComputationGraph&g,constDim&d,conststd::vector<float>*pdata); -Expressioninput(ComputationGraph&g,constDim&d,conststd::vector<unsignedint>&ids,conststd::vector<float>&data,floatdefdata=0.f); -Expressionparameter(ComputationGraph&g,Parameterp); -Expressionconst_parameter(ComputationGraph&g,Parameterp); -Expressionlookup(ComputationGraph&g,LookupParameterp,unsignedindex); -Expressionlookup(ComputationGraph&g,LookupParameterp,constunsigned*pindex); -Expressionconst_lookup(ComputationGraph&g,LookupParameterp,unsignedindex); -Expressionconst_lookup(ComputationGraph&g,LookupParameterp,constunsigned*pindex); -//Batchedversionsoflookupandconst_lookup -Expressionlookup(ComputationGraph&g,LookupParameterp,conststd::vector<unsigned>&indices); -Expressionlookup(ComputationGraph&g,LookupParameterp,conststd::vector<unsigned>*pindices); -Expressionconst_lookup(ComputationGraph&g,LookupParameterp,conststd::vector<unsigned>&indices); -Expressionconst_lookup(ComputationGraph&g,LookupParameterp,conststd::vector<unsigned>*pindices); -Expressionzeroes(ComputationGraph&g,constDim&d); - -//specialfunctionsforcontrollingflowofinformationingraph -Expressionnobackprop(constExpression&x); - -//operators -Expressionoperator-(constExpression&x); -Expressionoperator+(constExpression&x,constExpression&y); -Expressionoperator+(constExpression&x,realy); -Expressionoperator+(realx,constExpression&y); -Expressionoperator-(constExpression&x,constExpression&y); -Expressionoperator-(realx,constExpression&y); -Expressionoperator-(constExpression&x,realy); -Expressionoperator*(constExpression&x,constExpression&y); -Expressionoperator*(constExpression&x,floaty); -inlineExpressionoperator*(floaty,constExpression&x){returnx*y;} -inlineExpressionoperator/(constExpression&x,floaty){returnx*(1.f/y);} -//colwiseaddition -Expressionaddmv(constExpression&M,constExpression&v); -//componentwisedivision -Expressioncdiv(constExpression&x,constExpression&y); -Expressioncolwise_add(constExpression&x,constExpression&bias); -//z_ij=x_ijk*y_k -Expressioncontract3d_1d(constExpression&x,constExpression&y); -//z_i=x_ijk*y_k*z_j(+b_i) -Expressioncontract3d_1d_1d(constExpression&x,constExpression&y,constExpression&z); -Expressioncontract3d_1d_1d(constExpression&x,constExpression&y,constExpression&z,constExpression&b); -//z_ij=x_ijk*y_k+b_ij -Expressioncontract3d_1d(constExpression&x,constExpression&y,constExpression&b); - -Expressionsqrt(constExpression&x); -Expressionerf(constExpression&x); -Expressiontanh(constExpression&x); -Expressionexp(constExpression&x); -Expressionsquare(constExpression&x); -Expressioncube(constExpression&x); -Expressionlgamma(constExpression&x); -Expressionlog(constExpression&x); -Expressionlogistic(constExpression&x); -Expressionrectify(constExpression&x); -Expressionhinge(constExpression&x,unsignedindex,floatm=1.0); -Expressionhinge(constExpression&x,conststd::vector<unsigned>&indices,floatm=1.0); -Expressionhinge(constExpression&x,constunsigned*pindex,floatm=1.0); -Expressionhinge(constExpression&x,conststd::vector<unsigned>*pindices,floatm=1.0); -Expressionlog_softmax(constExpression&x); -Expressionsparsemax(constExpression&x); -Expressionlog_softmax(constExpression&x,conststd::vector<unsigned>&restriction); -Expressionsparsemax(constExpression&x); -Expressionsparsemax_loss(constExpression&x,conststd::vector<unsigned>&target_support); -Expressionsparsemax_loss(constExpression&x,conststd::vector<unsigned>*ptarget_support); -Expressionsoftmax(constExpression&x); -Expressionsoftsign(constExpression&x); -Expressionpow(constExpression&x,constExpression&y); -Expressionmin(constExpression&x,constExpression&y); -Expressionmax(constExpression&x,constExpression&y); -Expressionnoise(constExpression&x,realstddev); -Expressiondropout(constExpression&x,realp); -Expressionblock_dropout(constExpression&x,realp); - -//reshape::forwardisO(1),butbackwardisO(n) -Expressionreshape(constExpression&x,constDim&d); -//transposerequiresO(n) -Expressiontranspose(constExpression&x); -Expressionselect_rows(constExpression&x,conststd::vector<unsigned>&rows); -Expressionselect_rows(constExpression&x,conststd::vector<unsigned>*prows); -//select_colsismoreefficientthanselect_rowssinceEigenusescolumn-majororder -Expressionselect_cols(constExpression&x,conststd::vector<unsigned>&cols); -Expressionselect_cols(constExpression&x,conststd::vector<unsigned>*pcols); -//matrixinverse -Expressioninverse(constExpression&x); -Expressionlogdet(constExpression&x); - -Expressiontrace_of_product(constExpression&x,constExpression&y); -Expressioncwise_multiply(constExpression&x,constExpression&y); - -Expressionsquared_norm(constExpression&x); -Expressiondot_product(constExpression&x,constExpression&y); -Expressionsquared_distance(constExpression&x,constExpression&y); -Expressionhuber_distance(constExpression&x,constExpression&y,floatc=1.345f); -Expressionl1_distance(constExpression&x,constExpression&y); -Expressionbinary_log_loss(constExpression&x,constExpression&y); -Expressionpairwise_rank_loss(constExpression&x,constExpression&y,realm=1.0); -Expressionpoisson_loss(constExpression&x,unsignedy); -Expressionpoisson_loss(constExpression&x,constunsigned*py); - -//variousconvolutionythings -Expressionconv1d_narrow(constExpression&x,constExpression&f); -Expressionconv1d_wide(constExpression&x,constExpression&f); -Expressionfilter1d_narrow(constExpression&x,constExpression&f); -Expressionkmax_pooling(constExpression&x,unsignedk); -Expressionfold_rows(constExpression&x,unsignednrows=2); -Expressionsum_cols(constExpression&x); -Expressionaverage_cols(constExpression&x); -Expressionkmh_ngram(constExpression&x,unsignedn); - -//Sumtheresultsofmultiplebatches -Expressionsum_batches(constExpression&x); - -//pickpartsoutofbiggerobjects -Expressionpick(constExpression&x,unsignedv); -Expressionpick(constExpression&x,conststd::vector<unsigned>&v); -Expressionpick(constExpression&x,unsigned*pv); -Expressionpick(constExpression&x,conststd::vector<unsigned>*pv); -Expressionpickrange(constExpression&x,unsignedv,unsignedu); -Expressionpickneglogsoftmax(constExpression&x,unsignedv); -Expressionpickneglogsoftmax(constExpression&x,conststd::vector<unsigned>&v); -Expressionpickneglogsoftmax(constExpression&x,unsigned*pv); -Expressionpickneglogsoftmax(constExpression&x,conststd::vector<unsigned>*pv); - -namespacedetail{ -template<typenameF,typenameT> -Expressionf(constT&xs){ -ComputationGraph*pg=xs.begin()->pg; -std::vector<VariableIndex>xis(xs.size()); -inti=0; -for(autoxi=xs.begin();xi!=xs.end();++xi)xis[i++]=xi->i; -returnExpression(pg,pg->add_function<F>(xis)); -} -} - -template<typenameT> -inlineExpressionlogsumexp(constT&xs){returndetail::f<LogSumExp>(xs);} -inlineExpressionlogsumexp(conststd::initializer_list<Expression>&xs){returndetail::f<LogSumExp>(xs);} - -template<typenameT> -inlineExpressionsum(constT&xs){returndetail::f<Sum>(xs);} -inlineExpressionsum(conststd::initializer_list<Expression>&xs){returndetail::f<Sum>(xs);} - -template<typenameT> -inlineExpressionmax(constT&xs){returndetail::f<Max>(xs);} -inlineExpressionmax(conststd::initializer_list<Expression>&xs){returndetail::f<Max>(xs);} - -template<typenameT> -inlineExpressionaverage(constT&xs){returndetail::f<Average>(xs);} -inlineExpressionaverage(conststd::initializer_list<Expression>&xs){returndetail::f<Average>(xs);} - -template<typenameT> -inlineExpressionconcatenate_cols(constT&xs){returndetail::f<ConcatenateColumns>(xs);} -inlineExpressionconcatenate_cols(conststd::initializer_list<Expression>&xs){returndetail::f<ConcatenateColumns>(xs);} - -template<typenameT> -inlineExpressionconcatenate(constT&xs){returndetail::f<Concatenate>(xs);} -inlineExpressionconcatenate(conststd::initializer_list<Expression>&xs){returndetail::f<Concatenate>(xs);} - -template<typenameT> -inlineExpressionaffine_transform(constT&xs){returndetail::f<AffineTransform>(xs);} -inlineExpressionaffine_transform(conststd::initializer_list<Expression>&xs){returndetail::f<AffineTransform>(xs);} - -}} - -#endif - - - - diff --git a/doc/doxygen/xml/index.xml b/doc/doxygen/xml/index.xml deleted file mode 100644 index c19dab0a5..000000000 --- a/doc/doxygen/xml/index.xml +++ /dev/null @@ -1,227 +0,0 @@ - - - dynet::AdadeltaTrainer - epsilon - rho - hg - hlg - hd - hld - boost::serialization::access - AdadeltaTrainer - alloc_impl - AdadeltaTrainer - serialize - - dynet::AdagradTrainer - epsilon - vp - vlp - boost::serialization::access - AdagradTrainer - alloc_impl - AdagradTrainer - serialize - - dynet::AdamTrainer - beta_1 - beta_2 - epsilon - m - lm - v - lv - boost::serialization::access - AdamTrainer - alloc_impl - AdamTrainer - serialize - - dynet::expr::Expression - pg - i - Expression - Expression - value - - dynet::MomentumSGDTrainer - momentum - vp - vlp - boost::serialization::access - MomentumSGDTrainer - alloc_impl - MomentumSGDTrainer - serialize - - dynet::RmsPropTrainer - epsilon - rho - hg - hlg - boost::serialization::access - RmsPropTrainer - alloc_impl - RmsPropTrainer - serialize - - dynet::SimpleSGDTrainer - boost::serialization::access - SimpleSGDTrainer - SimpleSGDTrainer - serialize - - dynet::Trainer - eta0 - eta - eta_decay - epoch - clipping_enabled - clip_threshold - clips - updates - aux_allocated - model - boost::serialization::access - Trainer - ~Trainer - update - update_epoch - clip_gradients - rescale_and_reset_weight_decay - status - Trainer - alloc_impl - update_rule - update_params - update_lookup_params - serialize - - dynet - - dynet::expr - input - input - input - input - input - parameter - const_parameter - lookup - lookup - const_lookup - const_lookup - lookup - lookup - const_lookup - const_lookup - zeroes - nobackprop - operator- - operator+ - operator+ - operator+ - operator- - operator- - operator- - operator* - operator* - operator* - operator/ - addmv - cdiv - colwise_add - contract3d_1d - contract3d_1d_1d - contract3d_1d_1d - contract3d_1d - sqrt - erf - tanh - exp - square - cube - lgamma - log - logistic - rectify - hinge - hinge - hinge - hinge - log_softmax - sparsemax - log_softmax - sparsemax_loss - sparsemax_loss - softmax - softsign - pow - min - max - noise - dropout - block_dropout - reshape - transpose - select_rows - select_rows - select_cols - select_cols - inverse - logdet - trace_of_product - cwise_multiply - squared_norm - dot_product - squared_distance - huber_distance - l1_distance - binary_log_loss - pairwise_rank_loss - poisson_loss - poisson_loss - conv1d_narrow - conv1d_wide - filter1d_narrow - kmax_pooling - fold_rows - sum_cols - average_cols - kmh_ngram - sum_batches - pick - pick - pick - pick - pickrange - pickneglogsoftmax - pickneglogsoftmax - pickneglogsoftmax - pickneglogsoftmax - logsumexp - logsumexp - sum - sum - max - max - average - average - concatenate_cols - concatenate_cols - concatenate - concatenate - affine_transform - affine_transform - - dynet::expr::detail - f - - expr.h - - training.h - DYNET_TRAINER_DEFINE_DEV_IMPL - - /home/paul/dev/dynet/dynet - - diff --git a/doc/doxygen/xml/index.xsd b/doc/doxygen/xml/index.xsd deleted file mode 100644 index d7ab2a906..000000000 --- a/doc/doxygen/xml/index.xsd +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/doxygen/xml/namespacedynet.xml b/doc/doxygen/xml/namespacedynet.xml deleted file mode 100644 index e6d8a6efd..000000000 --- a/doc/doxygen/xml/namespacedynet.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - dynet - dynet::AdadeltaTrainer - dynet::AdagradTrainer - dynet::AdamTrainer - dynet::MomentumSGDTrainer - dynet::RmsPropTrainer - dynet::SimpleSGDTrainer - dynet::Trainer - dynet::expr - - - - - - - diff --git a/doc/doxygen/xml/namespacedynet_1_1expr.xml b/doc/doxygen/xml/namespacedynet_1_1expr.xml deleted file mode 100644 index 5c9cfdf50..000000000 --- a/doc/doxygen/xml/namespacedynet_1_1expr.xml +++ /dev/null @@ -1,2379 +0,0 @@ - - - - dynet::expr - dynet::expr::Expression - dynet::expr::detail - - - Expression - Expression dynet::expr::input - (ComputationGraph &g, real s) - input - - ComputationGraph & - g - - - real - s - - - - - - - - - - - Expression - Expression dynet::expr::input - (ComputationGraph &g, const real *ps) - input - - ComputationGraph & - g - - - const real * - ps - - - - - - - - - - - Expression - Expression dynet::expr::input - (ComputationGraph &g, const Dim &d, const std::vector< float > &data) - input - - ComputationGraph & - g - - - const Dim & - d - - - const std::vector< float > & - data - - - - - - - - - - - Expression - Expression dynet::expr::input - (ComputationGraph &g, const Dim &d, const std::vector< float > *pdata) - input - - ComputationGraph & - g - - - const Dim & - d - - - const std::vector< float > * - pdata - - - - - - - - - - - Expression - Expression dynet::expr::input - (ComputationGraph &g, const Dim &d, const std::vector< unsigned int > &ids, const std::vector< float > &data, float defdata=0.f) - input - - ComputationGraph & - g - - - const Dim & - d - - - const std::vector< unsigned int > & - ids - - - const std::vector< float > & - data - - - float - defdata - 0.f - - - - - - - - - - - Expression - Expression dynet::expr::parameter - (ComputationGraph &g, Parameter p) - parameter - - ComputationGraph & - g - - - Parameter - p - - - - - - - - - - - Expression - Expression dynet::expr::const_parameter - (ComputationGraph &g, Parameter p) - const_parameter - - ComputationGraph & - g - - - Parameter - p - - - - - - - - - - - Expression - Expression dynet::expr::lookup - (ComputationGraph &g, LookupParameter p, unsigned index) - lookup - - ComputationGraph & - g - - - LookupParameter - p - - - unsigned - index - - - - - - - - - - - Expression - Expression dynet::expr::lookup - (ComputationGraph &g, LookupParameter p, const unsigned *pindex) - lookup - - ComputationGraph & - g - - - LookupParameter - p - - - const unsigned * - pindex - - - - - - - - - - - Expression - Expression dynet::expr::const_lookup - (ComputationGraph &g, LookupParameter p, unsigned index) - const_lookup - - ComputationGraph & - g - - - LookupParameter - p - - - unsigned - index - - - - - - - - - - - Expression - Expression dynet::expr::const_lookup - (ComputationGraph &g, LookupParameter p, const unsigned *pindex) - const_lookup - - ComputationGraph & - g - - - LookupParameter - p - - - const unsigned * - pindex - - - - - - - - - - - Expression - Expression dynet::expr::lookup - (ComputationGraph &g, LookupParameter p, const std::vector< unsigned > &indices) - lookup - - ComputationGraph & - g - - - LookupParameter - p - - - const std::vector< unsigned > & - indices - - - - - - - - - - - Expression - Expression dynet::expr::lookup - (ComputationGraph &g, LookupParameter p, const std::vector< unsigned > *pindices) - lookup - - ComputationGraph & - g - - - LookupParameter - p - - - const std::vector< unsigned > * - pindices - - - - - - - - - - - Expression - Expression dynet::expr::const_lookup - (ComputationGraph &g, LookupParameter p, const std::vector< unsigned > &indices) - const_lookup - - ComputationGraph & - g - - - LookupParameter - p - - - const std::vector< unsigned > & - indices - - - - - - - - - - - Expression - Expression dynet::expr::const_lookup - (ComputationGraph &g, LookupParameter p, const std::vector< unsigned > *pindices) - const_lookup - - ComputationGraph & - g - - - LookupParameter - p - - - const std::vector< unsigned > * - pindices - - - - - - - - - - - Expression - Expression dynet::expr::zeroes - (ComputationGraph &g, const Dim &d) - zeroes - - ComputationGraph & - g - - - const Dim & - d - - - - - - - - - - - Expression - Expression dynet::expr::nobackprop - (const Expression &x) - nobackprop - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::operator- - (const Expression &x) - operator- - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::operator+ - (const Expression &x, const Expression &y) - operator+ - - const Expression & - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::operator+ - (const Expression &x, real y) - operator+ - - const Expression & - x - - - real - y - - - - - - - - - - - Expression - Expression dynet::expr::operator+ - (real x, const Expression &y) - operator+ - - real - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::operator- - (const Expression &x, const Expression &y) - operator- - - const Expression & - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::operator- - (real x, const Expression &y) - operator- - - real - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::operator- - (const Expression &x, real y) - operator- - - const Expression & - x - - - real - y - - - - - - - - - - - Expression - Expression dynet::expr::operator* - (const Expression &x, const Expression &y) - operator* - - const Expression & - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::operator* - (const Expression &x, float y) - operator* - - const Expression & - x - - - float - y - - - - - - - - - - - Expression - Expression dynet::expr::operator* - (float y, const Expression &x) - operator* - - float - y - - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::operator/ - (const Expression &x, float y) - operator/ - - const Expression & - x - - - float - y - - - - - - - - - - - Expression - Expression dynet::expr::addmv - (const Expression &M, const Expression &v) - addmv - - const Expression & - M - - - const Expression & - v - - - - - - - - - - - Expression - Expression dynet::expr::cdiv - (const Expression &x, const Expression &y) - cdiv - - const Expression & - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::colwise_add - (const Expression &x, const Expression &bias) - colwise_add - - const Expression & - x - - - const Expression & - bias - - - - - - - - - - - Expression - Expression dynet::expr::contract3d_1d - (const Expression &x, const Expression &y) - contract3d_1d - - const Expression & - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::contract3d_1d_1d - (const Expression &x, const Expression &y, const Expression &z) - contract3d_1d_1d - - const Expression & - x - - - const Expression & - y - - - const Expression & - z - - - - - - - - - - - Expression - Expression dynet::expr::contract3d_1d_1d - (const Expression &x, const Expression &y, const Expression &z, const Expression &b) - contract3d_1d_1d - - const Expression & - x - - - const Expression & - y - - - const Expression & - z - - - const Expression & - b - - - - - - - - - - - Expression - Expression dynet::expr::contract3d_1d - (const Expression &x, const Expression &y, const Expression &b) - contract3d_1d - - const Expression & - x - - - const Expression & - y - - - const Expression & - b - - - - - - - - - - - Expression - Expression dynet::expr::sqrt - (const Expression &x) - sqrt - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::erf - (const Expression &x) - erf - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::tanh - (const Expression &x) - tanh - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::exp - (const Expression &x) - exp - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::square - (const Expression &x) - square - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::cube - (const Expression &x) - cube - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::lgamma - (const Expression &x) - lgamma - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::log - (const Expression &x) - log - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::logistic - (const Expression &x) - logistic - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::rectify - (const Expression &x) - rectify - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::hinge - (const Expression &x, unsigned index, float m=1.0) - hinge - - const Expression & - x - - - unsigned - index - - - float - m - 1.0 - - - - - - - - - - - Expression - Expression dynet::expr::hinge - (const Expression &x, const std::vector< unsigned > &indices, float m=1.0) - hinge - - const Expression & - x - - - const std::vector< unsigned > & - indices - - - float - m - 1.0 - - - - - - - - - - - Expression - Expression dynet::expr::hinge - (const Expression &x, const unsigned *pindex, float m=1.0) - hinge - - const Expression & - x - - - const unsigned * - pindex - - - float - m - 1.0 - - - - - - - - - - - Expression - Expression dynet::expr::hinge - (const Expression &x, const std::vector< unsigned > *pindices, float m=1.0) - hinge - - const Expression & - x - - - const std::vector< unsigned > * - pindices - - - float - m - 1.0 - - - - - - - - - - - Expression - Expression dynet::expr::log_softmax - (const Expression &x) - log_softmax - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::sparsemax - (const Expression &x) - sparsemax - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::log_softmax - (const Expression &x, const std::vector< unsigned > &restriction) - log_softmax - - const Expression & - x - - - const std::vector< unsigned > & - restriction - - - - - - - - - - - Expression - Expression dynet::expr::sparsemax_loss - (const Expression &x, const std::vector< unsigned > &target_support) - sparsemax_loss - - const Expression & - x - - - const std::vector< unsigned > & - target_support - - - - - - - - - - - Expression - Expression dynet::expr::sparsemax_loss - (const Expression &x, const std::vector< unsigned > *ptarget_support) - sparsemax_loss - - const Expression & - x - - - const std::vector< unsigned > * - ptarget_support - - - - - - - - - - - Expression - Expression dynet::expr::softmax - (const Expression &x) - softmax - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::softsign - (const Expression &x) - softsign - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::pow - (const Expression &x, const Expression &y) - pow - - const Expression & - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::min - (const Expression &x, const Expression &y) - min - - const Expression & - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::max - (const Expression &x, const Expression &y) - max - - const Expression & - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::noise - (const Expression &x, real stddev) - noise - - const Expression & - x - - - real - stddev - - - - - - - - - - - Expression - Expression dynet::expr::dropout - (const Expression &x, real p) - dropout - - const Expression & - x - - - real - p - - - - - - - - - - - Expression - Expression dynet::expr::block_dropout - (const Expression &x, real p) - block_dropout - - const Expression & - x - - - real - p - - - - - - - - - - - Expression - Expression dynet::expr::reshape - (const Expression &x, const Dim &d) - reshape - - const Expression & - x - - - const Dim & - d - - - - - - - - - - - Expression - Expression dynet::expr::transpose - (const Expression &x) - transpose - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::select_rows - (const Expression &x, const std::vector< unsigned > &rows) - select_rows - - const Expression & - x - - - const std::vector< unsigned > & - rows - - - - - - - - - - - Expression - Expression dynet::expr::select_rows - (const Expression &x, const std::vector< unsigned > *prows) - select_rows - - const Expression & - x - - - const std::vector< unsigned > * - prows - - - - - - - - - - - Expression - Expression dynet::expr::select_cols - (const Expression &x, const std::vector< unsigned > &cols) - select_cols - - const Expression & - x - - - const std::vector< unsigned > & - cols - - - - - - - - - - - Expression - Expression dynet::expr::select_cols - (const Expression &x, const std::vector< unsigned > *pcols) - select_cols - - const Expression & - x - - - const std::vector< unsigned > * - pcols - - - - - - - - - - - Expression - Expression dynet::expr::inverse - (const Expression &x) - inverse - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::logdet - (const Expression &x) - logdet - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::trace_of_product - (const Expression &x, const Expression &y) - trace_of_product - - const Expression & - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::cwise_multiply - (const Expression &x, const Expression &y) - cwise_multiply - - const Expression & - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::squared_norm - (const Expression &x) - squared_norm - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::dot_product - (const Expression &x, const Expression &y) - dot_product - - const Expression & - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::squared_distance - (const Expression &x, const Expression &y) - squared_distance - - const Expression & - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::huber_distance - (const Expression &x, const Expression &y, float c=1.345f) - huber_distance - - const Expression & - x - - - const Expression & - y - - - float - c - 1.345f - - - - - - - - - - - Expression - Expression dynet::expr::l1_distance - (const Expression &x, const Expression &y) - l1_distance - - const Expression & - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::binary_log_loss - (const Expression &x, const Expression &y) - binary_log_loss - - const Expression & - x - - - const Expression & - y - - - - - - - - - - - Expression - Expression dynet::expr::pairwise_rank_loss - (const Expression &x, const Expression &y, real m=1.0) - pairwise_rank_loss - - const Expression & - x - - - const Expression & - y - - - real - m - 1.0 - - - - - - - - - - - Expression - Expression dynet::expr::poisson_loss - (const Expression &x, unsigned y) - poisson_loss - - const Expression & - x - - - unsigned - y - - - - - - - - - - - Expression - Expression dynet::expr::poisson_loss - (const Expression &x, const unsigned *py) - poisson_loss - - const Expression & - x - - - const unsigned * - py - - - - - - - - - - - Expression - Expression dynet::expr::conv1d_narrow - (const Expression &x, const Expression &f) - conv1d_narrow - - const Expression & - x - - - const Expression & - f - - - - - - - - - - - Expression - Expression dynet::expr::conv1d_wide - (const Expression &x, const Expression &f) - conv1d_wide - - const Expression & - x - - - const Expression & - f - - - - - - - - - - - Expression - Expression dynet::expr::filter1d_narrow - (const Expression &x, const Expression &f) - filter1d_narrow - - const Expression & - x - - - const Expression & - f - - - - - - - - - - - Expression - Expression dynet::expr::kmax_pooling - (const Expression &x, unsigned k) - kmax_pooling - - const Expression & - x - - - unsigned - k - - - - - - - - - - - Expression - Expression dynet::expr::fold_rows - (const Expression &x, unsigned nrows=2) - fold_rows - - const Expression & - x - - - unsigned - nrows - 2 - - - - - - - - - - - Expression - Expression dynet::expr::sum_cols - (const Expression &x) - sum_cols - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::average_cols - (const Expression &x) - average_cols - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::kmh_ngram - (const Expression &x, unsigned n) - kmh_ngram - - const Expression & - x - - - unsigned - n - - - - - - - - - - - Expression - Expression dynet::expr::sum_batches - (const Expression &x) - sum_batches - - const Expression & - x - - - - - - - - - - - Expression - Expression dynet::expr::pick - (const Expression &x, unsigned v) - pick - - const Expression & - x - - - unsigned - v - - - - - - - - - - - Expression - Expression dynet::expr::pick - (const Expression &x, const std::vector< unsigned > &v) - pick - - const Expression & - x - - - const std::vector< unsigned > & - v - - - - - - - - - - - Expression - Expression dynet::expr::pick - (const Expression &x, unsigned *pv) - pick - - const Expression & - x - - - unsigned * - pv - - - - - - - - - - - Expression - Expression dynet::expr::pick - (const Expression &x, const std::vector< unsigned > *pv) - pick - - const Expression & - x - - - const std::vector< unsigned > * - pv - - - - - - - - - - - Expression - Expression dynet::expr::pickrange - (const Expression &x, unsigned v, unsigned u) - pickrange - - const Expression & - x - - - unsigned - v - - - unsigned - u - - - - - - - - - - - Expression - Expression dynet::expr::pickneglogsoftmax - (const Expression &x, unsigned v) - pickneglogsoftmax - - const Expression & - x - - - unsigned - v - - - - - - - - - - - Expression - Expression dynet::expr::pickneglogsoftmax - (const Expression &x, const std::vector< unsigned > &v) - pickneglogsoftmax - - const Expression & - x - - - const std::vector< unsigned > & - v - - - - - - - - - - - Expression - Expression dynet::expr::pickneglogsoftmax - (const Expression &x, unsigned *pv) - pickneglogsoftmax - - const Expression & - x - - - unsigned * - pv - - - - - - - - - - - Expression - Expression dynet::expr::pickneglogsoftmax - (const Expression &x, const std::vector< unsigned > *pv) - pickneglogsoftmax - - const Expression & - x - - - const std::vector< unsigned > * - pv - - - - - - - - - - - - - typename T - - - Expression - Expression dynet::expr::logsumexp - (const T &xs) - logsumexp - - const T & - xs - - - - - - - - - - - Expression - Expression dynet::expr::logsumexp - (const std::initializer_list< Expression > &xs) - logsumexp - - const std::initializer_list< Expression > & - xs - - - - - - - - - - - - - typename T - - - Expression - Expression dynet::expr::sum - (const T &xs) - sum - - const T & - xs - - - - - - - - - - - Expression - Expression dynet::expr::sum - (const std::initializer_list< Expression > &xs) - sum - - const std::initializer_list< Expression > & - xs - - - - - - - - - - - - - typename T - - - Expression - Expression dynet::expr::max - (const T &xs) - max - - const T & - xs - - - - - - - - - - - Expression - Expression dynet::expr::max - (const std::initializer_list< Expression > &xs) - max - - const std::initializer_list< Expression > & - xs - - - - - - - - - - - - - typename T - - - Expression - Expression dynet::expr::average - (const T &xs) - average - - const T & - xs - - - - - - - - - - - Expression - Expression dynet::expr::average - (const std::initializer_list< Expression > &xs) - average - - const std::initializer_list< Expression > & - xs - - - - - - - - - - - - - typename T - - - Expression - Expression dynet::expr::concatenate_cols - (const T &xs) - concatenate_cols - - const T & - xs - - - - - - - - - - - Expression - Expression dynet::expr::concatenate_cols - (const std::initializer_list< Expression > &xs) - concatenate_cols - - const std::initializer_list< Expression > & - xs - - - - - - - - - - - - - typename T - - - Expression - Expression dynet::expr::concatenate - (const T &xs) - concatenate - - const T & - xs - - - - - - - - - - - Expression - Expression dynet::expr::concatenate - (const std::initializer_list< Expression > &xs) - concatenate - - const std::initializer_list< Expression > & - xs - - - - - - - - - - - - - typename T - - - Expression - Expression dynet::expr::affine_transform - (const T &xs) - affine_transform - - const T & - xs - - - - - - - - - - - Expression - Expression dynet::expr::affine_transform - (const std::initializer_list< Expression > &xs) - affine_transform - - const std::initializer_list< Expression > & - xs - - - - - - - - - - - - - - - - - diff --git a/doc/doxygen/xml/namespacedynet_1_1expr_1_1detail.xml b/doc/doxygen/xml/namespacedynet_1_1expr_1_1detail.xml deleted file mode 100644 index 6636e75c4..000000000 --- a/doc/doxygen/xml/namespacedynet_1_1expr_1_1detail.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - dynet::expr::detail - - - - - typename F - - - typename T - - - Expression - Expression dynet::expr::detail::f - (const T &xs) - f - - const T & - xs - - - - - - - - - - - - - - - - - diff --git a/doc/doxygen/xml/structdynet_1_1AdadeltaTrainer.xml b/doc/doxygen/xml/structdynet_1_1AdadeltaTrainer.xml deleted file mode 100644 index 7fa0b6411..000000000 --- a/doc/doxygen/xml/structdynet_1_1AdadeltaTrainer.xml +++ /dev/null @@ -1,251 +0,0 @@ - - - - dynet::AdadeltaTrainer - dynet::Trainer - - - real - real dynet::AdadeltaTrainer::epsilon - - epsilon - - - - - - - - - - real - real dynet::AdadeltaTrainer::rho - - rho - - - - - - - - - - std::vector< ShadowParameters > - std::vector<ShadowParameters> dynet::AdadeltaTrainer::hg - - hg - - - - - - - - - - std::vector< ShadowLookupParameters > - std::vector<ShadowLookupParameters> dynet::AdadeltaTrainer::hlg - - hlg - - - - - - - - - - std::vector< ShadowParameters > - std::vector<ShadowParameters> dynet::AdadeltaTrainer::hd - - hd - - - - - - - - - - std::vector< ShadowLookupParameters > - std::vector<ShadowLookupParameters> dynet::AdadeltaTrainer::hld - - hld - - - - - - - - - - - - friend class - friend class boost::serialization::access - - boost::serialization::access - - - - - - - - - - - - - dynet::AdadeltaTrainer::AdadeltaTrainer - (Model *m, real eps=1e-6, real rho=0.95) - AdadeltaTrainer - - Model * - m - - - real - eps - 1e-6 - - - real - rho - 0.95 - - - - - - - - - - - - - void - virtual void dynet::AdadeltaTrainer::alloc_impl - () override - alloc_impl - alloc_impl - - - - - - - - - - - - - dynet::AdadeltaTrainer::AdadeltaTrainer - () - AdadeltaTrainer - - - - - - - - - - - - class Archive - - - void - void dynet::AdadeltaTrainer::serialize - (Archive &ar, const unsigned int) - serialize - - Archive & - ar - - - const unsigned - int - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - dynet::AdadeltaTrainerAdadeltaTrainer - dynet::AdadeltaTrainerAdadeltaTrainer - dynet::AdadeltaTraineralloc_impl - dynet::AdadeltaTraineraux_allocated - dynet::AdadeltaTrainerboost::serialization::access - dynet::AdadeltaTrainerclip_gradients - dynet::AdadeltaTrainerclip_threshold - dynet::AdadeltaTrainerclipping_enabled - dynet::AdadeltaTrainerclips - dynet::AdadeltaTrainerepoch - dynet::AdadeltaTrainerepsilon - dynet::AdadeltaTrainereta - dynet::AdadeltaTrainereta0 - dynet::AdadeltaTrainereta_decay - dynet::AdadeltaTrainerhd - dynet::AdadeltaTrainerhg - dynet::AdadeltaTrainerhld - dynet::AdadeltaTrainerhlg - dynet::AdadeltaTrainermodel - dynet::AdadeltaTrainerrescale_and_reset_weight_decay - dynet::AdadeltaTrainerrho - dynet::AdadeltaTrainerserialize - dynet::AdadeltaTrainerstatus - dynet::AdadeltaTrainerTrainer - dynet::AdadeltaTrainerTrainer - dynet::AdadeltaTrainerupdate - dynet::AdadeltaTrainerupdate_epoch - dynet::AdadeltaTrainerupdate_lookup_params - dynet::AdadeltaTrainerupdate_params - dynet::AdadeltaTrainerupdate_rule - dynet::AdadeltaTrainerupdates - dynet::AdadeltaTrainer~Trainer - - - diff --git a/doc/doxygen/xml/structdynet_1_1AdagradTrainer.xml b/doc/doxygen/xml/structdynet_1_1AdagradTrainer.xml deleted file mode 100644 index d8d50f135..000000000 --- a/doc/doxygen/xml/structdynet_1_1AdagradTrainer.xml +++ /dev/null @@ -1,209 +0,0 @@ - - - - dynet::AdagradTrainer - dynet::Trainer - - - real - real dynet::AdagradTrainer::epsilon - - epsilon - - - - - - - - - - std::vector< ShadowParameters > - std::vector<ShadowParameters> dynet::AdagradTrainer::vp - - vp - - - - - - - - - - std::vector< ShadowLookupParameters > - std::vector<ShadowLookupParameters> dynet::AdagradTrainer::vlp - - vlp - - - - - - - - - - - - friend class - friend class boost::serialization::access - - boost::serialization::access - - - - - - - - - - - - - dynet::AdagradTrainer::AdagradTrainer - (Model *m, real e0=0.1, real eps=1e-20) - AdagradTrainer - - Model * - m - - - real - e0 - 0.1 - - - real - eps - 1e-20 - - - - - - - - - - - - - void - virtual void dynet::AdagradTrainer::alloc_impl - () override - alloc_impl - alloc_impl - - - - - - - - - - - - - dynet::AdagradTrainer::AdagradTrainer - () - AdagradTrainer - - - - - - - - - - - - class Archive - - - void - void dynet::AdagradTrainer::serialize - (Archive &ar, const unsigned int) - serialize - - Archive & - ar - - - const unsigned - int - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - dynet::AdagradTrainerAdagradTrainer - dynet::AdagradTrainerAdagradTrainer - dynet::AdagradTraineralloc_impl - dynet::AdagradTraineraux_allocated - dynet::AdagradTrainerboost::serialization::access - dynet::AdagradTrainerclip_gradients - dynet::AdagradTrainerclip_threshold - dynet::AdagradTrainerclipping_enabled - dynet::AdagradTrainerclips - dynet::AdagradTrainerepoch - dynet::AdagradTrainerepsilon - dynet::AdagradTrainereta - dynet::AdagradTrainereta0 - dynet::AdagradTrainereta_decay - dynet::AdagradTrainermodel - dynet::AdagradTrainerrescale_and_reset_weight_decay - dynet::AdagradTrainerserialize - dynet::AdagradTrainerstatus - dynet::AdagradTrainerTrainer - dynet::AdagradTrainerTrainer - dynet::AdagradTrainerupdate - dynet::AdagradTrainerupdate_epoch - dynet::AdagradTrainerupdate_lookup_params - dynet::AdagradTrainerupdate_params - dynet::AdagradTrainerupdate_rule - dynet::AdagradTrainerupdates - dynet::AdagradTrainervlp - dynet::AdagradTrainervp - dynet::AdagradTrainer~Trainer - - - diff --git a/doc/doxygen/xml/structdynet_1_1AdamTrainer.xml b/doc/doxygen/xml/structdynet_1_1AdamTrainer.xml deleted file mode 100644 index 8cba65a5e..000000000 --- a/doc/doxygen/xml/structdynet_1_1AdamTrainer.xml +++ /dev/null @@ -1,275 +0,0 @@ - - - - dynet::AdamTrainer - dynet::Trainer - - - float - float dynet::AdamTrainer::beta_1 - - beta_1 - - - - - - - - - - float - float dynet::AdamTrainer::beta_2 - - beta_2 - - - - - - - - - - float - float dynet::AdamTrainer::epsilon - - epsilon - - - - - - - - - - std::vector< ShadowParameters > - std::vector<ShadowParameters> dynet::AdamTrainer::m - - m - - - - - - - - - - std::vector< ShadowLookupParameters > - std::vector<ShadowLookupParameters> dynet::AdamTrainer::lm - - lm - - - - - - - - - - std::vector< ShadowParameters > - std::vector<ShadowParameters> dynet::AdamTrainer::v - - v - - - - - - - - - - std::vector< ShadowLookupParameters > - std::vector<ShadowLookupParameters> dynet::AdamTrainer::lv - - lv - - - - - - - - - - - - friend class - friend class boost::serialization::access - - boost::serialization::access - - - - - - - - - - - - - dynet::AdamTrainer::AdamTrainer - (Model *m, float alpha=0.001, float beta_1=0.9, float beta_2=0.999, float eps=1e-8) - AdamTrainer - - Model * - m - - - float - alpha - 0.001 - - - float - beta_1 - 0.9 - - - float - beta_2 - 0.999 - - - float - eps - 1e-8 - - - - - - - - - - - - - void - virtual void dynet::AdamTrainer::alloc_impl - () override - alloc_impl - alloc_impl - - - - - - - - - - - - - dynet::AdamTrainer::AdamTrainer - () - AdamTrainer - - - - - - - - - - - - class Archive - - - void - void dynet::AdamTrainer::serialize - (Archive &ar, const unsigned int) - serialize - - Archive & - ar - - - const unsigned - int - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - dynet::AdamTrainerAdamTrainer - dynet::AdamTrainerAdamTrainer - dynet::AdamTraineralloc_impl - dynet::AdamTraineraux_allocated - dynet::AdamTrainerbeta_1 - dynet::AdamTrainerbeta_2 - dynet::AdamTrainerboost::serialization::access - dynet::AdamTrainerclip_gradients - dynet::AdamTrainerclip_threshold - dynet::AdamTrainerclipping_enabled - dynet::AdamTrainerclips - dynet::AdamTrainerepoch - dynet::AdamTrainerepsilon - dynet::AdamTrainereta - dynet::AdamTrainereta0 - dynet::AdamTrainereta_decay - dynet::AdamTrainerlm - dynet::AdamTrainerlv - dynet::AdamTrainerm - dynet::AdamTrainermodel - dynet::AdamTrainerrescale_and_reset_weight_decay - dynet::AdamTrainerserialize - dynet::AdamTrainerstatus - dynet::AdamTrainerTrainer - dynet::AdamTrainerTrainer - dynet::AdamTrainerupdate - dynet::AdamTrainerupdate_epoch - dynet::AdamTrainerupdate_lookup_params - dynet::AdamTrainerupdate_params - dynet::AdamTrainerupdate_rule - dynet::AdamTrainerupdates - dynet::AdamTrainerv - dynet::AdamTrainer~Trainer - - - diff --git a/doc/doxygen/xml/structdynet_1_1MomentumSGDTrainer.xml b/doc/doxygen/xml/structdynet_1_1MomentumSGDTrainer.xml deleted file mode 100644 index cf8af0f17..000000000 --- a/doc/doxygen/xml/structdynet_1_1MomentumSGDTrainer.xml +++ /dev/null @@ -1,209 +0,0 @@ - - - - dynet::MomentumSGDTrainer - dynet::Trainer - - - real - real dynet::MomentumSGDTrainer::momentum - - momentum - - - - - - - - - - std::vector< ShadowParameters > - std::vector<ShadowParameters> dynet::MomentumSGDTrainer::vp - - vp - - - - - - - - - - std::vector< ShadowLookupParameters > - std::vector<ShadowLookupParameters> dynet::MomentumSGDTrainer::vlp - - vlp - - - - - - - - - - - - friend class - friend class boost::serialization::access - - boost::serialization::access - - - - - - - - - - - - - dynet::MomentumSGDTrainer::MomentumSGDTrainer - (Model *m, real e0=0.01, real mom=0.9) - MomentumSGDTrainer - - Model * - m - - - real - e0 - 0.01 - - - real - mom - 0.9 - - - - - - - - - - - - - void - virtual void dynet::MomentumSGDTrainer::alloc_impl - () override - alloc_impl - alloc_impl - - - - - - - - - - - - - dynet::MomentumSGDTrainer::MomentumSGDTrainer - () - MomentumSGDTrainer - - - - - - - - - - - - class Archive - - - void - void dynet::MomentumSGDTrainer::serialize - (Archive &ar, const unsigned int) - serialize - - Archive & - ar - - - const unsigned - int - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - dynet::MomentumSGDTraineralloc_impl - dynet::MomentumSGDTraineraux_allocated - dynet::MomentumSGDTrainerboost::serialization::access - dynet::MomentumSGDTrainerclip_gradients - dynet::MomentumSGDTrainerclip_threshold - dynet::MomentumSGDTrainerclipping_enabled - dynet::MomentumSGDTrainerclips - dynet::MomentumSGDTrainerepoch - dynet::MomentumSGDTrainereta - dynet::MomentumSGDTrainereta0 - dynet::MomentumSGDTrainereta_decay - dynet::MomentumSGDTrainermodel - dynet::MomentumSGDTrainermomentum - dynet::MomentumSGDTrainerMomentumSGDTrainer - dynet::MomentumSGDTrainerMomentumSGDTrainer - dynet::MomentumSGDTrainerrescale_and_reset_weight_decay - dynet::MomentumSGDTrainerserialize - dynet::MomentumSGDTrainerstatus - dynet::MomentumSGDTrainerTrainer - dynet::MomentumSGDTrainerTrainer - dynet::MomentumSGDTrainerupdate - dynet::MomentumSGDTrainerupdate_epoch - dynet::MomentumSGDTrainerupdate_lookup_params - dynet::MomentumSGDTrainerupdate_params - dynet::MomentumSGDTrainerupdate_rule - dynet::MomentumSGDTrainerupdates - dynet::MomentumSGDTrainervlp - dynet::MomentumSGDTrainervp - dynet::MomentumSGDTrainer~Trainer - - - diff --git a/doc/doxygen/xml/structdynet_1_1RmsPropTrainer.xml b/doc/doxygen/xml/structdynet_1_1RmsPropTrainer.xml deleted file mode 100644 index dca3e77ec..000000000 --- a/doc/doxygen/xml/structdynet_1_1RmsPropTrainer.xml +++ /dev/null @@ -1,228 +0,0 @@ - - - - dynet::RmsPropTrainer - dynet::Trainer - - - real - real dynet::RmsPropTrainer::epsilon - - epsilon - - - - - - - - - - real - real dynet::RmsPropTrainer::rho - - rho - - - - - - - - - - std::vector< real > - std::vector<real> dynet::RmsPropTrainer::hg - - hg - - - - - - - - - - std::vector< std::vector< real > > - std::vector<std::vector<real> > dynet::RmsPropTrainer::hlg - - hlg - - - - - - - - - - - - friend class - friend class boost::serialization::access - - boost::serialization::access - - - - - - - - - - - - - dynet::RmsPropTrainer::RmsPropTrainer - (Model *m, real e0=0.1, real eps=1e-20, real rho=0.95) - RmsPropTrainer - - Model * - m - - - real - e0 - 0.1 - - - real - eps - 1e-20 - - - real - rho - 0.95 - - - - - - - - - - - - - void - virtual void dynet::RmsPropTrainer::alloc_impl - () override - alloc_impl - alloc_impl - - - - - - - - - - - - - dynet::RmsPropTrainer::RmsPropTrainer - () - RmsPropTrainer - - - - - - - - - - - - class Archive - - - void - void dynet::RmsPropTrainer::serialize - (Archive &ar, const unsigned int) - serialize - - Archive & - ar - - - const unsigned - int - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - dynet::RmsPropTraineralloc_impl - dynet::RmsPropTraineraux_allocated - dynet::RmsPropTrainerboost::serialization::access - dynet::RmsPropTrainerclip_gradients - dynet::RmsPropTrainerclip_threshold - dynet::RmsPropTrainerclipping_enabled - dynet::RmsPropTrainerclips - dynet::RmsPropTrainerepoch - dynet::RmsPropTrainerepsilon - dynet::RmsPropTrainereta - dynet::RmsPropTrainereta0 - dynet::RmsPropTrainereta_decay - dynet::RmsPropTrainerhg - dynet::RmsPropTrainerhlg - dynet::RmsPropTrainermodel - dynet::RmsPropTrainerrescale_and_reset_weight_decay - dynet::RmsPropTrainerrho - dynet::RmsPropTrainerRmsPropTrainer - dynet::RmsPropTrainerRmsPropTrainer - dynet::RmsPropTrainerserialize - dynet::RmsPropTrainerstatus - dynet::RmsPropTrainerTrainer - dynet::RmsPropTrainerTrainer - dynet::RmsPropTrainerupdate - dynet::RmsPropTrainerupdate_epoch - dynet::RmsPropTrainerupdate_lookup_params - dynet::RmsPropTrainerupdate_params - dynet::RmsPropTrainerupdate_rule - dynet::RmsPropTrainerupdates - dynet::RmsPropTrainer~Trainer - - - diff --git a/doc/doxygen/xml/structdynet_1_1SimpleSGDTrainer.xml b/doc/doxygen/xml/structdynet_1_1SimpleSGDTrainer.xml deleted file mode 100644 index ef3f70fe1..000000000 --- a/doc/doxygen/xml/structdynet_1_1SimpleSGDTrainer.xml +++ /dev/null @@ -1,144 +0,0 @@ - - - - dynet::SimpleSGDTrainer - dynet::Trainer - - - friend class - friend class boost::serialization::access - - boost::serialization::access - - - - - - - - - - - - - dynet::SimpleSGDTrainer::SimpleSGDTrainer - (Model *m, real e0=0.1) - SimpleSGDTrainer - - Model * - m - - - real - e0 - 0.1 - - - - - - - - - - - - - - dynet::SimpleSGDTrainer::SimpleSGDTrainer - () - SimpleSGDTrainer - - - - - - - - - - - - class Archive - - - void - void dynet::SimpleSGDTrainer::serialize - (Archive &ar, const unsigned int) - serialize - - Archive & - ar - - - const unsigned - int - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - dynet::SimpleSGDTraineralloc_impl - dynet::SimpleSGDTraineraux_allocated - dynet::SimpleSGDTrainerboost::serialization::access - dynet::SimpleSGDTrainerclip_gradients - dynet::SimpleSGDTrainerclip_threshold - dynet::SimpleSGDTrainerclipping_enabled - dynet::SimpleSGDTrainerclips - dynet::SimpleSGDTrainerepoch - dynet::SimpleSGDTrainereta - dynet::SimpleSGDTrainereta0 - dynet::SimpleSGDTrainereta_decay - dynet::SimpleSGDTrainermodel - dynet::SimpleSGDTrainerrescale_and_reset_weight_decay - dynet::SimpleSGDTrainerserialize - dynet::SimpleSGDTrainerSimpleSGDTrainer - dynet::SimpleSGDTrainerSimpleSGDTrainer - dynet::SimpleSGDTrainerstatus - dynet::SimpleSGDTrainerTrainer - dynet::SimpleSGDTrainerTrainer - dynet::SimpleSGDTrainerupdate - dynet::SimpleSGDTrainerupdate_epoch - dynet::SimpleSGDTrainerupdate_lookup_params - dynet::SimpleSGDTrainerupdate_params - dynet::SimpleSGDTrainerupdate_rule - dynet::SimpleSGDTrainerupdates - dynet::SimpleSGDTrainer~Trainer - - - diff --git a/doc/doxygen/xml/structdynet_1_1Trainer.xml b/doc/doxygen/xml/structdynet_1_1Trainer.xml deleted file mode 100644 index 1ea29afc7..000000000 --- a/doc/doxygen/xml/structdynet_1_1Trainer.xml +++ /dev/null @@ -1,483 +0,0 @@ - - - - dynet::Trainer - dynet::AdadeltaTrainer - dynet::AdagradTrainer - dynet::AdamTrainer - dynet::MomentumSGDTrainer - dynet::RmsPropTrainer - dynet::SimpleSGDTrainer - - - real - real dynet::Trainer::eta0 - - eta0 - - - - - - - - - - real - real dynet::Trainer::eta - - eta - - - - - - - - - - real - real dynet::Trainer::eta_decay - - eta_decay - - - - - - - - - - real - real dynet::Trainer::epoch - - epoch - - - - - - - - - - real - real dynet::Trainer::clipping_enabled - - clipping_enabled - - - - - - - - - - real - real dynet::Trainer::clip_threshold - - clip_threshold - - - - - - - - - - real - real dynet::Trainer::clips - - clips - - - - - - - - - - real - real dynet::Trainer::updates - - updates - - - - - - - - - - bool - bool dynet::Trainer::aux_allocated - - aux_allocated - - - - - - - - - - Model * - Model* dynet::Trainer::model - - model - - - - - - - - - - - - friend class - friend class boost::serialization::access - - boost::serialization::access - - - - - - - - - - - - - dynet::Trainer::Trainer - (Model *m, real e0) - Trainer - - Model * - m - - - real - e0 - - - - - - - - - - - - virtual dynet::Trainer::~Trainer - () - ~Trainer - - - - - - - - - - void - void dynet::Trainer::update - (real scale=1.0) - update - - real - scale - 1.0 - - - - - - - - - - - void - void dynet::Trainer::update_epoch - (real r=1) - update_epoch - - real - r - 1 - - - - - - - - - - - float - float dynet::Trainer::clip_gradients - () - clip_gradients - - - - - - - - - - void - void dynet::Trainer::rescale_and_reset_weight_decay - () - rescale_and_reset_weight_decay - - - - - - - - - - void - void dynet::Trainer::status - () - status - - - - - - - - - - - - - dynet::Trainer::Trainer - () - Trainer - - - - - - - - - - void - virtual void dynet::Trainer::alloc_impl - () - alloc_impl - alloc_impl - alloc_impl - alloc_impl - alloc_impl - alloc_impl - - - - - - - - - - void - virtual void dynet::Trainer::update_rule - (real scale, real gscale, const std::vector< Tensor * > &values)=0 - update_rule - - real - scale - - - real - gscale - - - const std::vector< Tensor * > & - values - - - - - - - - - - - void - virtual void dynet::Trainer::update_params - (real scale, real gscale, size_t idx)=0 - update_params - - real - scale - - - real - gscale - - - size_t - idx - - - - - - - - - - - void - virtual void dynet::Trainer::update_lookup_params - (real scale, real gscale, size_t idx, size_t lidx)=0 - update_lookup_params - - real - scale - - - real - gscale - - - size_t - idx - - - size_t - lidx - - - - - - - - - - - - - - - class Archive - - - void - void dynet::Trainer::serialize - (Archive &ar, const unsigned int) - serialize - - Archive & - ar - - - const unsigned - int - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - dynet::Traineralloc_impl - dynet::Traineraux_allocated - dynet::Trainerboost::serialization::access - dynet::Trainerclip_gradients - dynet::Trainerclip_threshold - dynet::Trainerclipping_enabled - dynet::Trainerclips - dynet::Trainerepoch - dynet::Trainereta - dynet::Trainereta0 - dynet::Trainereta_decay - dynet::Trainermodel - dynet::Trainerrescale_and_reset_weight_decay - dynet::Trainerserialize - dynet::Trainerstatus - dynet::TrainerTrainer - dynet::TrainerTrainer - dynet::Trainerupdate - dynet::Trainerupdate_epoch - dynet::Trainerupdate_lookup_params - dynet::Trainerupdate_params - dynet::Trainerupdate_rule - dynet::Trainerupdates - dynet::Trainer~Trainer - - - diff --git a/doc/doxygen/xml/structdynet_1_1expr_1_1Expression.xml b/doc/doxygen/xml/structdynet_1_1expr_1_1Expression.xml deleted file mode 100644 index 4e13b86c3..000000000 --- a/doc/doxygen/xml/structdynet_1_1expr_1_1Expression.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - dynet::expr::Expression - - - ComputationGraph * - ComputationGraph* dynet::expr::Expression::pg - - pg - - - - - - - - - - VariableIndex - VariableIndex dynet::expr::Expression::i - - i - - - - - - - - - - - - - dynet::expr::Expression::Expression - () - Expression - - - - - - - - - - - dynet::expr::Expression::Expression - (ComputationGraph *pg, VariableIndex i) - Expression - - ComputationGraph * - pg - - - VariableIndex - i - - - - - - - - - - - const Tensor & - const Tensor& dynet::expr::Expression::value - () const - value - - - - - - - - - - - - - - - - dynet::expr::ExpressionExpression - dynet::expr::ExpressionExpression - dynet::expr::Expressioni - dynet::expr::Expressionpg - dynet::expr::Expressionvalue - - - diff --git a/doc/doxygen/xml/training_8h.xml b/doc/doxygen/xml/training_8h.xml deleted file mode 100644 index ab3e480f6..000000000 --- a/doc/doxygen/xml/training_8h.xml +++ /dev/null @@ -1,263 +0,0 @@ - - - - training.h - vector - boost/serialization/export.hpp - dynet/model.h - dynet/shadow-params.h - - - - - - - - - - - - - - - - - - - - - - - - - - - dynet::Trainer - dynet::SimpleSGDTrainer - dynet::MomentumSGDTrainer - dynet::AdagradTrainer - dynet::AdadeltaTrainer - dynet::RmsPropTrainer - dynet::AdamTrainer - dynet - - - DYNET_TRAINER_DEFINE_DEV_IMPL - - void update_params(real scale, real gscale, size_t idx) override; \ - void update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) override; \ - template <class MyDevice> \ - void update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector<Tensor*> & values); \ - void update_rule(real scale, real gscale, const std::vector<Tensor*> & values) override; - - - - - - - - - - - - - - -#ifndefDYNET_TRAINING_H_ -#defineDYNET_TRAINING_H_ - -#include<vector> - -#include<boost/serialization/export.hpp> - -#include"dynet/model.h" -#include"dynet/shadow-params.h" - -#defineDYNET_TRAINER_DEFINE_DEV_IMPL()\ -voidupdate_params(realscale,realgscale,size_tidx)override;\ -voidupdate_lookup_params(realscale,realgscale,size_tidx,size_tlidx)override;\ -template<classMyDevice>\ -voidupdate_rule_dev(constMyDevice&dev,realscale,realgscale,conststd::vector<Tensor*>&values);\ -voidupdate_rule(realscale,realgscale,conststd::vector<Tensor*>&values)override; - -namespacedynet{ - -structTrainer{ -explicitTrainer(Model*m,reale0): -eta0(e0),eta(e0),eta_decay(),epoch(),clipping_enabled(true),clip_threshold(5),clips(),updates(),aux_allocated(false),model(m){} -virtual~Trainer(); - -voidupdate(realscale=1.0); - -voidupdate_epoch(realr=1){ -epoch+=r; -eta=eta0/(1+epoch*eta_decay); -} - -//ifclippingisenabledandthegradientistoobig,returntheamountto -//scalethegradientby(otherwise1) -floatclip_gradients(); - -//TODO:Thisisunprotectedtemporarilyuntilthereisabettersolution -//forserializingtheweightdecaywhensavingmodels -//Rescalealltheparametershandledbythismodel -voidrescale_and_reset_weight_decay(); - -//learningrates -realeta0; -realeta; -realeta_decay; -realepoch; - -//clipping -realclipping_enabled; -realclip_threshold; -realclips; -realupdates; - -boolaux_allocated; - -voidstatus(){ -std::cerr<<"[epoch="<<epoch<<"eta="<<eta<<"clips="<<clips<<"updates="<<updates<<"]"; -updates=clips=0; -} - -Model*model;//parametersandgradientslivehere - -protected: -Trainer(){} -virtualvoidalloc_impl(){} -virtualvoidupdate_rule(realscale,realgscale,conststd::vector<Tensor*>&values)=0; -virtualvoidupdate_params(realscale,realgscale,size_tidx)=0; -virtualvoidupdate_lookup_params(realscale,realgscale,size_tidx,size_tlidx)=0; - -private: -friendclassboost::serialization::access; -template<classArchive> -voidserialize(Archive&ar,constunsignedint); -}; - -structSimpleSGDTrainer:publicTrainer{ -explicitSimpleSGDTrainer(Model*m,reale0=0.1):Trainer(m,e0){} -protected: -DYNET_TRAINER_DEFINE_DEV_IMPL() -private: -SimpleSGDTrainer(){} -friendclassboost::serialization::access; -template<classArchive> -voidserialize(Archive&ar,constunsignedint); -}; - -structMomentumSGDTrainer:publicTrainer{ -explicitMomentumSGDTrainer(Model*m,reale0=0.01,realmom=0.9): -Trainer(m,e0),momentum(mom){} - -protected: -DYNET_TRAINER_DEFINE_DEV_IMPL() -virtualvoidalloc_impl()override; - -realmomentum; - -//thefollowingrepresentthecurrentvelocity -std::vector<ShadowParameters>vp; -std::vector<ShadowLookupParameters>vlp; -//std::unordered_map<ParameterStorage*,Tensor>vp; -//std::unordered_map<LookupParameterStorage*,std::unordered_map<unsigned,Tensor>>vl; -private: -MomentumSGDTrainer(){} -friendclassboost::serialization::access; -template<classArchive> -voidserialize(Archive&ar,constunsignedint); -}; - -structAdagradTrainer:publicTrainer{ -explicitAdagradTrainer(Model*m,reale0=0.1,realeps=1e-20): -Trainer(m,e0),epsilon(eps){} -protected: -DYNET_TRAINER_DEFINE_DEV_IMPL() -virtualvoidalloc_impl()override; - -realepsilon; -std::vector<ShadowParameters>vp; -std::vector<ShadowLookupParameters>vlp; -private: -AdagradTrainer(){} -friendclassboost::serialization::access; -template<classArchive> -voidserialize(Archive&ar,constunsignedint); -}; - -structAdadeltaTrainer:publicTrainer{ -explicitAdadeltaTrainer(Model*m,realeps=1e-6,realrho=0.95): -Trainer(m,1.0),epsilon(eps),rho(rho){} -protected: -DYNET_TRAINER_DEFINE_DEV_IMPL() -virtualvoidalloc_impl()override; - -realepsilon; -realrho; -std::vector<ShadowParameters>hg;//Historyofgradients -std::vector<ShadowLookupParameters>hlg; -std::vector<ShadowParameters>hd;//Historyofdeltas -std::vector<ShadowLookupParameters>hld; -private: -AdadeltaTrainer(){} -friendclassboost::serialization::access; -template<classArchive> -voidserialize(Archive&ar,constunsignedint); -}; - -structRmsPropTrainer:publicTrainer{ -explicitRmsPropTrainer(Model*m,reale0=0.1,realeps=1e-20,realrho=0.95): -Trainer(m,e0),epsilon(eps),rho(rho){} -protected: -DYNET_TRAINER_DEFINE_DEV_IMPL() -virtualvoidalloc_impl()override; - -realepsilon; -realrho; -std::vector<real>hg;//Historyofgradients -std::vector<std::vector<real>>hlg; -private: -RmsPropTrainer(){} -friendclassboost::serialization::access; -template<classArchive> -voidserialize(Archive&ar,constunsignedint); -}; - -structAdamTrainer:publicTrainer{ -explicitAdamTrainer(Model*m,floatalpha=0.001,floatbeta_1=0.9,floatbeta_2=0.999,floateps=1e-8): -Trainer(m,alpha),beta_1(beta_1),beta_2(beta_2),epsilon(eps){} - -protected: -DYNET_TRAINER_DEFINE_DEV_IMPL() -virtualvoidalloc_impl()override; - -floatbeta_1; -floatbeta_2; -floatepsilon; -std::vector<ShadowParameters>m;//Historyofgradients -std::vector<ShadowLookupParameters>lm; -std::vector<ShadowParameters>v;//Historyofdeltas -std::vector<ShadowLookupParameters>lv; -private: -AdamTrainer(){} -friendclassboost::serialization::access; -template<classArchive> -voidserialize(Archive&ar,constunsignedint); -}; - -}//namespacedynet - -BOOST_CLASS_EXPORT_KEY(dynet::SimpleSGDTrainer) -BOOST_CLASS_EXPORT_KEY(dynet::MomentumSGDTrainer) -BOOST_CLASS_EXPORT_KEY(dynet::AdagradTrainer) -BOOST_CLASS_EXPORT_KEY(dynet::AdadeltaTrainer) -BOOST_CLASS_EXPORT_KEY(dynet::RmsPropTrainer) -BOOST_CLASS_EXPORT_KEY(dynet::AdamTrainer) - -#endif - - - - From 0eea426af305a4a977acdf5bafc98ab11120461a Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 14 Oct 2016 15:04:45 -0400 Subject: [PATCH 728/965] Fixed broadcasting in new batching impl --- dynet/dynet.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/dynet/dynet.cc b/dynet/dynet.cc index 5b37d3fbe..2609c81e8 100644 --- a/dynet/dynet.cc +++ b/dynet/dynet.cc @@ -39,7 +39,9 @@ void Node::forward(const std::vector& xs, size_t fx_size = fx_elem.d.size(); forward_impl(xs_ptrs, fx_elem); for(unsigned b = 1; b < fx.d.batch_elems(); ++b) { - for(i = 0; i < xs.size(); ++i) xs_elems[i].v += xs_sizes[i]; + for(i = 0; i < xs.size(); ++i) + if(xs_elems[i].d.bd > 1) + xs_elems[i].v += xs_sizes[i]; fx_elem.v += fx_size; forward_impl(xs_ptrs, fx_elem); } @@ -70,10 +72,13 @@ void Node::backward(const std::vector& xs, size_t dEdxi_size = dEdxi_elem.d.size(); backward_impl(xs_ptrs, fx_elem, dEdf_elem, xs_i, dEdxi_elem); for(unsigned b = 1; b < fx.d.batch_elems(); ++b) { - for(i = 0; i < xs.size(); ++i) xs_elems[i].v += xs_sizes[i]; + for(i = 0; i < xs.size(); ++i) + if(xs_elems[i].d.bd > 1) + xs_elems[i].v += xs_sizes[i]; fx_elem.v += fx_size; dEdf_elem.v += dEdf_size; - dEdxi_elem.v += dEdxi_size; + if(dEdxi_elem.d.bd > 1) + dEdxi_elem.v += dEdxi_size; backward_impl(xs_ptrs, fx_elem, dEdf_elem, xs_i, dEdxi_elem); } } From 180f87f87e5b8df1756077b921022b72cee41712 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 14 Oct 2016 15:26:39 -0400 Subject: [PATCH 729/965] Reverted change to hinge that was breaking tests --- dynet/nodes.cc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/dynet/nodes.cc b/dynet/nodes.cc index b3900bfc7..f9fd869c7 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -782,8 +782,7 @@ void Hinge::backward_dev_impl(const MyDevice & dev, #if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) throw std::runtime_error("CUDA memory allocation in hinge"); #endif - auto&& hinge_sum = (eloss.tvec() > 0.f).cast().sum() * d; - dEdxi.tvec().chip<0>(*pelement).device(*dev.edevice) -= hinge_sum; + dEdxi.tvec().chip<0>(*pelement).device(*dev.edevice) -= (eloss.tvec() > 0.f).cast().sum() * d; } } else { assert(pelements != nullptr); @@ -795,10 +794,9 @@ void Hinge::backward_dev_impl(const MyDevice & dev, // TODO: The > comparison should not be calculated twice. Keep it in auxiliary memory? dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += (eloss.tb<1>().chip<1>(b) > 0.f).cast() * d_vec[b]; #if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) - throw std::runtime_error("CUDA memory allocation in hinge"); + throw std::runtime_error("CUDA memory allocation in hinge"); #endif - auto&& hinge_sum = (eloss.tb<1>().chip<1>(b) > 0.f).cast().sum() * d_vec[b]; - dEdxi.tb<1>().chip<1>(b).chip<0>((*pelements)[b]).device(*dev.edevice) -= hinge_sum; + dEdxi.tb<1>().chip<1>(b).chip<0>((*pelements)[b]).device(*dev.edevice) -= (eloss.tb<1>().chip<1>(b) > 0.f).cast().sum() * d_vec[b]; } } } From 73e48bdab95295c1141b488049233f1f32b1fd3c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 14 Oct 2016 17:46:27 -0400 Subject: [PATCH 730/965] Another fix to batching --- dynet/dynet.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dynet/dynet.cc b/dynet/dynet.cc index 2609c81e8..849c51b6d 100644 --- a/dynet/dynet.cc +++ b/dynet/dynet.cc @@ -40,13 +40,14 @@ void Node::forward(const std::vector& xs, forward_impl(xs_ptrs, fx_elem); for(unsigned b = 1; b < fx.d.batch_elems(); ++b) { for(i = 0; i < xs.size(); ++i) - if(xs_elems[i].d.bd > 1) + if(xs[i]->d.bd > 1) xs_elems[i].v += xs_sizes[i]; fx_elem.v += fx_size; forward_impl(xs_ptrs, fx_elem); } } } + void Node::backward(const std::vector& xs, const Tensor& fx, const Tensor& dEdf, @@ -73,11 +74,11 @@ void Node::backward(const std::vector& xs, backward_impl(xs_ptrs, fx_elem, dEdf_elem, xs_i, dEdxi_elem); for(unsigned b = 1; b < fx.d.batch_elems(); ++b) { for(i = 0; i < xs.size(); ++i) - if(xs_elems[i].d.bd > 1) + if(xs[i]->d.bd > 1) xs_elems[i].v += xs_sizes[i]; fx_elem.v += fx_size; dEdf_elem.v += dEdf_size; - if(dEdxi_elem.d.bd > 1) + if(dEdxi.d.bd > 1) dEdxi_elem.v += dEdxi_size; backward_impl(xs_ptrs, fx_elem, dEdf_elem, xs_i, dEdxi_elem); } From 4b645c87c54c22525beee36bd29252845fa69fb5 Mon Sep 17 00:00:00 2001 From: Paul Michel Date: Sun, 16 Oct 2016 22:17:05 -0400 Subject: [PATCH 731/965] typo in encdec example --- examples/encdec.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/encdec.cc b/examples/encdec.cc index 89e6ef2d5..0e053cad0 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -174,7 +174,7 @@ int main(int argc, char** argv) { dev.push_back(read_sentence(line, &devd)); dtoks += dev.back().size(); if (dev.back().front() != kSOS && dev.back().back() != kEOS) { - cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + cerr << "Dev sentence in " << argv[2] << ":" << dlc << " didn't start or end with , \n"; abort(); } } From 14aa89e1dfb885f8e2bbda9fb1a92aaa16acf562 Mon Sep 17 00:00:00 2001 From: Jan Niehues Date: Mon, 17 Oct 2016 21:32:14 +0200 Subject: [PATCH 732/965] Update Makefile --- dynet/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dynet/CMakeLists.txt b/dynet/CMakeLists.txt index 372f7ec3b..4f139b37c 100644 --- a/dynet/CMakeLists.txt +++ b/dynet/CMakeLists.txt @@ -72,6 +72,8 @@ set(dynet_library_HDRS tensor.h timing.h training.h + except.h + nodes-macros.h weight-decay.h ) From d366ea39015c4ee958f0456f13371c0776b30904 Mon Sep 17 00:00:00 2001 From: Jan Niehues Date: Mon, 17 Oct 2016 23:33:06 +0200 Subject: [PATCH 733/965] Compable with lamtram fork --- dynet/gru.cc | 5 +++++ dynet/gru.h | 2 ++ dynet/rnn.cc | 6 ++++++ dynet/rnn.h | 4 ++++ 4 files changed, 17 insertions(+) diff --git a/dynet/gru.cc b/dynet/gru.cc index 6f4ded7ca..1fe8074ad 100644 --- a/dynet/gru.cc +++ b/dynet/gru.cc @@ -145,4 +145,9 @@ void GRUBuilder::copy(const RNNBuilder & rnn) { params[i][j] = rnn_gru.params[i][j]; } + void GRUBuilder::init_parameters(int layer,int index, const std::vector& vec) { + TensorTools::SetElements(params[layer][index].get()->values,vec); + + } + } // namespace dynet diff --git a/dynet/gru.h b/dynet/gru.h index 3d3e15012..fa0ff74f7 100644 --- a/dynet/gru.h +++ b/dynet/gru.h @@ -22,6 +22,8 @@ struct GRUBuilder : public RNNBuilder { unsigned num_h0_components() const override { return layers; } void copy(const RNNBuilder & params) override; + void init_parameters(int layer,int index, const std::vector& vec); + protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; diff --git a/dynet/rnn.cc b/dynet/rnn.cc index b59d7f311..1b79b999d 100644 --- a/dynet/rnn.cc +++ b/dynet/rnn.cc @@ -41,6 +41,12 @@ void RNNBuilder::serialize(Archive& ar, const unsigned int) { ar & head; ar & sm; } + +void RNNBuilder::init_parameters(int layer,int index, const std::vector& vec) { + cerr << "RNNBuilder::init_parameters not overridden.\n"; + abort(); +} + DYNET_SERIALIZE_IMPL(RNNBuilder) SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, diff --git a/dynet/rnn.h b/dynet/rnn.h index 2cfe31352..358b64813 100644 --- a/dynet/rnn.h +++ b/dynet/rnn.h @@ -104,6 +104,10 @@ struct RNNBuilder { virtual void save_parameters_pretraining(const std::string& fname) const; virtual void load_parameters_pretraining(const std::string& fname); + + //init parameters from float array + virtual void init_parameters(int layer,int index, const std::vector& vec); + protected: virtual void new_graph_impl(ComputationGraph& cg) = 0; virtual void start_new_sequence_impl(const std::vector& h_0) = 0; From 2745dbd9376eca0569d841c17ff9c55604195c7f Mon Sep 17 00:00:00 2001 From: memeda Date: Tue, 18 Oct 2016 20:06:08 +0800 Subject: [PATCH 734/965] Trivial correction. 1. Compiling Error at MSVC 14.0 (MSVS 2015 update3) for Error C2397. Because a inexplicitly narrow cast from unsigned to int. G++ is ok while MSVS report error. 2. Using MKL using -DMKL=TRUE for CMake comandline or error reporting. --- doc/install.md | 2 +- dynet/nodes.cc | 17 ++++++++++------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/doc/install.md b/doc/install.md index ac8e5269f..d7d866715 100644 --- a/doc/install.md +++ b/doc/install.md @@ -112,7 +112,7 @@ The Windows build also supports CUDA. The latest (development) version of Eigen DyNet can leverage Intel's MKL library to speed up computation on the CPU. As an example, we've seen 3x speedup in seq2seq training when using MKL. To use MKL, include the following cmake option: - -DMKL + -DMKL=TRUE If cmake is unable to find MKL automatically, try setting `MKL_ROOT`, such as diff --git a/dynet/nodes.cc b/dynet/nodes.cc index f9fd869c7..a287c0fe1 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -376,7 +376,7 @@ void Concatenate::forward_dev_impl(const MyDevice & dev, const vector indices(0,0,0); - Eigen::DSizes sizes(0,fx.d.cols(),fx.d.bd); + Eigen::DSizes sizes(0,static_cast(fx.d.cols()),static_cast(fx.d.bd)); for (unsigned i = 0; i < xs.size(); ++i) { indices[0] = src_row_indices[i] = curr_row; const unsigned row_size = xs[i]->d.rows(); @@ -399,8 +399,9 @@ void Concatenate::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { assert(i < src_row_indices.size()); - Eigen::DSizes indices(src_row_indices[i],0,0); - Eigen::DSizes sizes(dEdxi.d.rows(),fx.d.cols(),fx.d.bd); + Eigen::DSizes indices(static_cast(src_row_indices[i]),0,0); + Eigen::DSizes sizes(static_cast(dEdxi.d.rows()), static_cast(fx.d.cols()), + static_cast(fx.d.bd)); if(dEdxi.d.bd == dEdf.d.bd) { dEdxi.tb<2>().device(*dev.edevice) += dEdf.tb<2>().slice(indices, sizes); } else { @@ -1428,8 +1429,9 @@ DYNET_NODE_INST_DEV_IMPL(PickNegLogSoftmax) // slice of matrix from index start (inclusive) to index end (exclusive) template void PickRange::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - Eigen::DSizes indices(start,0,0); - Eigen::DSizes sizes(end-start,fx.d.cols(),fx.d.bd); + Eigen::DSizes indices(static_cast(start),0,0); + Eigen::DSizes sizes(static_cast(end)- static_cast(start), + static_cast(fx.d.cols()), static_cast(fx.d.bd)); fx.tb<2>().device(*dev.edevice) = xs[0]->tb<2>().slice(indices, sizes); } @@ -1441,8 +1443,9 @@ void PickRange::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - Eigen::DSizes indices(start,0,0); - Eigen::DSizes sizes(end-start,fx.d.cols(),fx.d.bd); + Eigen::DSizes indices(static_cast(start),0,0); + Eigen::DSizes sizes(static_cast(end) - static_cast(start), + static_cast(fx.d.cols()) ,static_cast(fx.d.bd)); dEdxi.tb<2>().slice(indices, sizes).device(*dev.edevice) += dEdf.tb<2>(); } DYNET_NODE_INST_DEV_IMPL(PickRange) From 221ec39e25cff6c30d163a6674cee9d44939b700 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Tue, 18 Oct 2016 14:42:35 -0700 Subject: [PATCH 735/965] Fix for Hinge with nvcc/MSVC. Tested in Windows and LInux, GPU and non-GPU. --- dynet/nodes.cc | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/dynet/nodes.cc b/dynet/nodes.cc index f9fd869c7..7e7848711 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -782,7 +782,10 @@ void Hinge::backward_dev_impl(const MyDevice & dev, #if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) throw std::runtime_error("CUDA memory allocation in hinge"); #endif - dEdxi.tvec().chip<0>(*pelement).device(*dev.edevice) -= (eloss.tvec() > 0.f).cast().sum() * d; + // nvcc with MSVC can't this all as one expression, so it's intentionally split into multiple lines + auto&& elossVec = eloss.tvec(); + auto&& hinge_sum = (elossVec > 0.f).cast().sum() * d; + dEdxi.tvec().chip<0>(*pelement).device(*dev.edevice) -= hinge_sum; } } else { assert(pelements != nullptr); @@ -796,8 +799,11 @@ void Hinge::backward_dev_impl(const MyDevice & dev, #if defined(__CUDACC__) && defined(EIGEN_NO_MALLOC) throw std::runtime_error("CUDA memory allocation in hinge"); #endif - dEdxi.tb<1>().chip<1>(b).chip<0>((*pelements)[b]).device(*dev.edevice) -= (eloss.tb<1>().chip<1>(b) > 0.f).cast().sum() * d_vec[b]; - } + auto&& elossVec = eloss.tb<1>(); + auto&& elossChip = elossVec.chip<1>(b); + auto&& hinge_sum = (elossChip > 0.f).cast().sum() * d_vec[b]; + dEdxi.tb<1>().chip<1>(b).chip<0>((*pelements)[b]).device(*dev.edevice) -= hinge_sum; + } } } } From df04d89b26873aa21d34af26f93b91d8f23087f8 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 19 Oct 2016 09:02:24 -0400 Subject: [PATCH 736/965] Removed unnecessary incremental_forward from encdec example --- examples/encdec.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/encdec.cc b/examples/encdec.cc index 0e053cad0..1b73aee20 100644 --- a/examples/encdec.cc +++ b/examples/encdec.cc @@ -88,7 +88,7 @@ struct EncoderDecoder { Expression i_ie2h = parameter(cg, p_ie2h); Expression i_bie = parameter(cg, p_bie); Expression i_t = i_bie + i_ie2h * i_combined; - cg.incremental_forward(i_t); + Expression i_h = rectify(i_t); Expression i_h2oe = parameter(cg,p_h2oe); Expression i_boe = parameter(cg,p_boe); From 6b72d244ebee894d5472f2e4c4ab827c1efab39e Mon Sep 17 00:00:00 2001 From: Dan Clothiaux Date: Wed, 19 Oct 2016 11:28:24 -0400 Subject: [PATCH 737/965] added add_parameter(dim, parameter_init), initfromfile, initfromvector --- dynet/model.cc | 23 +++++++++++++++++++++++ dynet/model.h | 16 ++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/dynet/model.cc b/dynet/model.cc index b6ab7e6ca..fa282fafb 100644 --- a/dynet/model.cc +++ b/dynet/model.cc @@ -199,6 +199,18 @@ void ParameterInitGlorot::initialize_params(Tensor & values) const { TensorTools::RandomizeUniform(values, -my_scale, my_scale); } +void ParameterInitFromVector::initialize_params(Tensor & values) const { + TensorTools::SetElements(values, vec); +} + +void ParameterInitFromFile::initialize_params(Tensor & values) const { + ifstream is(filename); + istream_iterator start(is), end; + vector param_vector(start, end); + TensorTools::SetElements(values, param_vector); +} + + Parameter::Parameter() { mp = nullptr; index = 0; @@ -306,6 +318,17 @@ Parameter Model::add_parameters(const Dim& d, float scale) { return r; } +Parameter Model::add_parameters(const Dim& d, ParameterInit & init) { + ParameterStorage* p = new ParameterStorage(d, init); + Parameter r(this, params.size()); + //cerr << "Adding parameters with dim " << d << endl; + all_params.push_back(p); + params.push_back(p); + updated_params.push_back(r.index); + return r; +} + + LookupParameter Model::add_lookup_parameters(unsigned n, const Dim& d) { LookupParameterStorage* p = new LookupParameterStorage(n,d); LookupParameter r(this, lookup_params.size()); diff --git a/dynet/model.h b/dynet/model.h index 0c6287fdd..a870282bc 100644 --- a/dynet/model.h +++ b/dynet/model.h @@ -209,6 +209,22 @@ struct ParameterInitSaxe : public ParameterInit { float cnst; }; +struct ParameterInitFromFile : public ParameterInit { + ParameterInitFromFile(std::string f) : filename(f) {} + virtual void initialize_params(Tensor & values) const override; +private: + std::string filename; +}; + +struct ParameterInitFromVector : public ParameterInit { + ParameterInitFromVector(std::vector v) : vec(v) {} + virtual void initialize_params(Tensor & values) const override; +private: + std::vector vec; +}; + + + // this is a collection of parameters // if you need a matrix of parameters, or a lookup table - ask an instance of this class // this knows how to serialize itself From 8de613e4368745e982f993b0ca25ca7f3c38b203 Mon Sep 17 00:00:00 2001 From: Dan Clothiaux Date: Wed, 19 Oct 2016 12:22:10 -0400 Subject: [PATCH 738/965] added init all expressions to cfsm builder, necessary when using it with model checkpoints --- dynet/cfsm-builder.cc | 9 +++++++++ dynet/cfsm-builder.h | 1 + 2 files changed, 10 insertions(+) diff --git a/dynet/cfsm-builder.cc b/dynet/cfsm-builder.cc index 34147033c..04699d130 100644 --- a/dynet/cfsm-builder.cc +++ b/dynet/cfsm-builder.cc @@ -233,6 +233,15 @@ void ClassFactoredSoftmaxBuilder::serialize(Archive& ar, const unsigned int) { ar & p_rc2ws; ar & p_rcwbiases; } + + +void ClassFactoredSoftmaxBuilder::initialize_expressions() { + for (unsigned c = 0; c < p_rc2ws.size(); ++c) { + Expression temp = get_rc2w(c); + Expression temp2 = get_rc2wbias(c); + } +} + DYNET_SERIALIZE_IMPL(ClassFactoredSoftmaxBuilder) } // namespace dynet diff --git a/dynet/cfsm-builder.h b/dynet/cfsm-builder.h index 90cd85994..0f82876e1 100644 --- a/dynet/cfsm-builder.h +++ b/dynet/cfsm-builder.h @@ -67,6 +67,7 @@ class ClassFactoredSoftmaxBuilder : public SoftmaxBuilder { expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx); unsigned sample(const expr::Expression& rep); expr::Expression full_log_distribution(const expr::Expression& rep); + void initialize_expressions(); private: ClassFactoredSoftmaxBuilder(); From 993e16bdca7b6b56afcf3600adb2b6c2948c3259 Mon Sep 17 00:00:00 2001 From: Dan Clothiaux Date: Wed, 19 Oct 2016 16:31:57 -0400 Subject: [PATCH 739/965] tweaked initialize_expressions to match grahams recommendations --- dynet/cfsm-builder.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dynet/cfsm-builder.cc b/dynet/cfsm-builder.cc index 04699d130..59532aed9 100644 --- a/dynet/cfsm-builder.cc +++ b/dynet/cfsm-builder.cc @@ -237,8 +237,9 @@ void ClassFactoredSoftmaxBuilder::serialize(Archive& ar, const unsigned int) { void ClassFactoredSoftmaxBuilder::initialize_expressions() { for (unsigned c = 0; c < p_rc2ws.size(); ++c) { - Expression temp = get_rc2w(c); - Expression temp2 = get_rc2wbias(c); + //get_rc2w(_bias) creates the expression at c if the expression does not already exist. + get_rc2w(c); + get_rc2wbias(c); } } From 0252d00ac2f6e2d12b85825914092d9cb5f675f0 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 19 Oct 2016 16:48:44 -0400 Subject: [PATCH 740/965] Fixed error with batched reshape --- dynet/nodes.h | 1 + tests/test-nodes.cc | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/dynet/nodes.h b/dynet/nodes.h index 35da8170a..2330bfc38 100644 --- a/dynet/nodes.h +++ b/dynet/nodes.h @@ -120,6 +120,7 @@ struct Transpose : public Node { struct Reshape : public Node { explicit Reshape(const std::initializer_list& a, const Dim& to) : Node(a), to(to) {} DYNET_NODE_DEFINE_DEV_IMPL() + virtual bool supports_multibatch() const override { return true; } Dim to; }; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index ebd532265..db9e79083 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -599,6 +599,17 @@ BOOST_AUTO_TEST_CASE( reshape_gradient ) { BOOST_CHECK(check_grad(mod, z, 0)); } +// Expression reshape(const Expression& x, const Dim& d); +BOOST_AUTO_TEST_CASE( reshape_batch_gradient ) { + dynet::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = input(cg, Dim({3},2), batch_vals); + Expression y1 = x1*transpose(x2); + Expression y2 = reshape(y1, Dim({3,3}, 2)); + Expression z = sum_batches(input(cg, {1,3}, ones3_vals) * y2 * input(cg, {3,1}, ones3_vals)); + BOOST_CHECK(check_grad(mod, z, 0)); +} + // Expression transpose(const Expression& x); BOOST_AUTO_TEST_CASE( transpose_gradient ) { dynet::ComputationGraph cg; From 437aeec12ab5650d8a062b53431eeef244391763 Mon Sep 17 00:00:00 2001 From: paul Date: Wed, 19 Oct 2016 17:22:47 -0400 Subject: [PATCH 741/965] readthedocs files --- doc/doxygen/{config => Doxyfile} | 2 +- doc/source/conf.py | 17 +++++++++++------ doc/source/requirements.txt | 1 + 3 files changed, 13 insertions(+), 7 deletions(-) rename doc/doxygen/{config => Doxyfile} (99%) create mode 100644 doc/source/requirements.txt diff --git a/doc/doxygen/config b/doc/doxygen/Doxyfile similarity index 99% rename from doc/doxygen/config rename to doc/doxygen/Doxyfile index b2ebe93f4..267a02107 100644 --- a/doc/doxygen/config +++ b/doc/doxygen/Doxyfile @@ -758,7 +758,7 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT =../dynet/expr.h ../dynet/training.h +INPUT =../../dynet/expr.h ../../dynet/training.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses diff --git a/doc/source/conf.py b/doc/source/conf.py index d4c6a8abd..3e4dbf9a1 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -20,14 +20,19 @@ # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) -# -- General configuration ------------------------------------------------ +# Run doxygen if on Readthedocs : +on_rtd = os.environ.get('READTHEDOCS') == 'True' +if on_rtd: + subprocess.call('cd ../doxygen; doxygen', shell=True) -# If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' + # -- General configuration ------------------------------------------------ -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. + # If your documentation needs a minimal Sphinx version, state it here. + #needs_sphinx = '1.0' + + # Add any Sphinx extension module names here, as strings. They can be + # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom + # ones. extensions = [ 'sphinx.ext.mathjax', 'breathe' ] diff --git a/doc/source/requirements.txt b/doc/source/requirements.txt new file mode 100644 index 000000000..188f51e62 --- /dev/null +++ b/doc/source/requirements.txt @@ -0,0 +1 @@ +breathe \ No newline at end of file From 2bf517f27b77320f788a9ed1e7fab19b07c59c0c Mon Sep 17 00:00:00 2001 From: Paul Michel Date: Wed, 19 Oct 2016 17:57:42 -0400 Subject: [PATCH 742/965] Added missing import in conf.py --- doc/source/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/source/conf.py b/doc/source/conf.py index 3e4dbf9a1..593b22b62 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -14,6 +14,7 @@ import sys import os +import subprocess # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the From 23376ccf6299e25f1c268b46515dfb625a5ab3a2 Mon Sep 17 00:00:00 2001 From: paul Date: Wed, 19 Oct 2016 18:14:04 -0400 Subject: [PATCH 743/965] Changed doxygen output to be consistent with breathe. --- doc/doxygen/Doxyfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/doxygen/Doxyfile b/doc/doxygen/Doxyfile index 267a02107..662015886 100644 --- a/doc/doxygen/Doxyfile +++ b/doc/doxygen/Doxyfile @@ -58,7 +58,7 @@ PROJECT_LOGO = # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = doxygen +OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and From 9faa732493a9070406abfcb3571ee6d82d68d0f6 Mon Sep 17 00:00:00 2001 From: paul Date: Wed, 19 Oct 2016 18:19:15 -0400 Subject: [PATCH 744/965] Readable tutorial --- doc/source/tutorial.rst | 73 ++++++++++++++++++++++++++++++----------- 1 file changed, 53 insertions(+), 20 deletions(-) diff --git a/doc/source/tutorial.rst b/doc/source/tutorial.rst index 920cbf17f..d52ea4273 100644 --- a/doc/source/tutorial.rst +++ b/doc/source/tutorial.rst @@ -4,44 +4,77 @@ DyNet Tutorial An illustration of how models are trained (for a simple logistic regression model) is below: + First, we set up the structure of the model. + +Create a model, and an SGD trainer to update its parameters. + .. code:: cpp - // *** First, we set up the structure of the model - // Create a model, and an SGD trainer to update its parameters. Model mod; SimpleSGDTrainer sgd(&mod); - // Create a "computation graph," which will define the flow of information. + +Create a "computation graph," which will define the flow of information. + +.. code:: cpp + ComputationGraph cg; - // Initialize a 1x3 parameter vector, and add the parameters to be part of the - // computation graph. + +Initialize a 1x3 parameter vector, and add the parameters to be part of the computation graph. + +.. code:: cpp + Expression W = parameter(cg, mod.add_parameters({1, 3})); - // Create variables defining the input and output of the regression, and load them - // into the computation graph. Note that we don't need to set concrete values yet. + +Create variables defining the input and output of the regression, and load them into the computation graph. Note that we don't need to set concrete values yet. + +.. code:: cpp + vector x_values(3); Expression x = input(cg, {3}, &x_values); dynet::real y_value; Expression y = input(cg, &y_value); - // Next, set up the structure to multiply the input by the weight vector, then run - // the output of this through a logistic sigmoid function (logistic regression). + +Next, set up the structure to multiply the input by the weight vector, then run the output of this through a logistic sigmoid function logistic regression). + +.. code:: cpp + Expression y_pred = logistic(W*x); - // Finally, we create a function to calculate the loss. The model will be optimized - // to minimize the value of the final function in the computation graph. + +Finally, we create a function to calculate the loss. The model will be optimized to minimize the value of the final function in the computation graph. + +.. code:: cpp + Expression l = binary_log_loss(y_pred, y); - // We are now done setting up the graph, and we can print out its structure: + +We are now done setting up the graph, and we can print out its structure: + +.. code:: cpp + cg.print_graphviz(); - // *** Now, we perform a parameter update for a single example. - // Set the input/output to the values specified by the training data: +Now, we perform a parameter update for a single example. Set the input/output to the values specified by the training data: + +.. code:: cpp + x_values = {0.5, 0.3, 0.7}; y_value = 1.0; - // "forward" propagates values forward through the computation graph, and returns - // the loss. + +"forward" propagates values forward through the computation graph, and returns the loss. + +.. code:: cpp + dynet::real loss = as_scalar(cg.forward(l)); - // "backward" performs back-propagation, and accumulates the gradients of the - // parameters within the "Model" data structure. + +"backward" performs back-propagation, and accumulates the gradients of the parameters within the "Model" data structure. + +.. code:: cpp + cg.backward(l); - // "sgd.update" updates parameters of the model that was passed to its constructor. - // Here 1.0 is the scaling factor that allows us to control the size of the update. + +"sgd.update" updates parameters of the model that was passed to its constructor. Here 1.0 is the scaling factor that allows us to control the size of the update. + +.. code:: cpp + sgd.update(1.0); Note that this very simple example that doesn't cover things like memory From f10e94aa39bc140d72b662131ced7a3f0fc20a33 Mon Sep 17 00:00:00 2001 From: paul Date: Wed, 19 Oct 2016 18:23:34 -0400 Subject: [PATCH 745/965] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec42c1744..96c8c875a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # DyNet Dynamic neural network library -DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. Read the [documentation](doc/index.md) to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. +DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. Read the [documentation](http://dynet.readthedocs.io/en/latest/) to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. * **Latest Code:** Can be found on the github page master branch. * **Latest Release:** [v1.0-rc1](https://github.com/clab/dynet/releases/tag/v1.0-rc1) From ab33fac6f63fbeb3dece87e4027c06b7f689e96e Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Wed, 19 Oct 2016 18:35:42 -0700 Subject: [PATCH 746/965] Updating find_mkl to also work in Linux. Tested to work in both Windows and Ubuntu. --- CMakeLists.txt | 25 +++++++++++++++++++------ examples/CMakeLists.txt | 4 ++-- rnnlm/CMakeLists.txt | 2 +- tests/CMakeLists.txt | 4 ++-- tutorial/CMakeLists.txt | 2 +- 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a1fb20ad..53f4982e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,14 +18,27 @@ function(find_mkl) find_library(MKL_CORE_LIB NAMES mkl_intel_lp64 mkl_intel_thread mkl_core PATHS ${MKL_ROOT} ${MKL_ROOT}/lib/${MKL_ARCH} DOC "MKL core library path") - find_library(MKL_COMPILER_LIB NAMES libiomp5md - PATHS ${MKL_ROOT} ${MKL_ROOT}/../compiler/lib/${MKL_ARCH} + + find_library(MKL_COMPILER_LIB NAMES iomp5 libiomp5md + PATHS ${MKL_ROOT} ${MKL_ROOT}/../compiler/lib/${MKL_ARCH} #Windows + ${MKL_ROOT}/../compilers_and_libraries/linux/lib/${MKL_ARCH}_lin #Linux DOC "MKL compiler lib (for threaded MKL)") + if(MKL_INCLUDE_DIR AND MKL_CORE_LIB AND MKL_COMPILER_LIB) get_filename_component(MKL_CORE_LIB_DIR ${MKL_CORE_LIB} DIRECTORY) get_filename_component(MKL_COMPILER_LIB_DIR ${MKL_COMPILER_LIB} DIRECTORY) - message(STATUS "Found MKL\n * include: ${MKL_INCLUDE_DIR},\n * core library dir: ${MKL_CORE_LIB_DIR},\n * compiler library dir: ${MKL_COMPILER_LIB_DIR}") - set(MKL_LIBS mkl_intel_lp64.lib mkl_intel_thread.lib mkl_core.lib libiomp5md.lib PARENT_SCOPE) + get_filename_component(MKL_COMPILER_LIB_FILE ${MKL_COMPILER_LIB} NAME) + message(STATUS "Found MKL\n * include: ${MKL_INCLUDE_DIR},\n * core library dir: ${MKL_CORE_LIB_DIR},\n * compiler library: ${MKL_COMPILER_LIB}") + + # Due to a conflict with /MT and /MD, MSVC needs mkl_intel_lp64 linked last, or we can change individual + # projects to use /MT (mkl_intel_lp64 linked with /MT, default MSVC projects use /MD), or we can instead + # link to the DLL versions. For now I'm opting for this solution which seems to work with projects still + # at their default /MD. Linux build requires the mkl_intel_lp64 to be linked first. So...: + if(MSVC) + set(LIBS ${LIBS} mkl_intel_thread mkl_core mkl_intel_lp64 ${MKL_COMPILER_LIB_FILE} PARENT_SCOPE) + else() + set(LIBS ${LIBS} mkl_intel_lp64 mkl_intel_thread mkl_core ${MKL_COMPILER_LIB_FILE} PARENT_SCOPE) + endif() include_directories(${MKL_INCLUDE_DIR}) link_directories(${MKL_CORE_LIB_DIR} ${MKL_COMPILER_LIB_DIR}) else() @@ -36,7 +49,7 @@ endfunction() ######## Cross-compiler, cross-platform options set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_FAST_MATH") if (MKL OR MKL_ROOT) - find_mkl() # sets include/lib directories and sets ${MKL_LIBS} needed for linking + find_mkl() # sets include/lib directories and sets ${LIBS} needed for linking set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEIGEN_USE_MKL_ALL") endif() @@ -97,7 +110,7 @@ endif() # trouble shooting: # if boost library cannot be found, in addition to install boost library # check if environment variables are set -# +# # to set boost root and its library root in environment variable, use # for example # echo "export BOOST_LIBRARYDIR=/usr/local/lib" >> ~/.bashrc diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 2974627f6..0ee556e7d 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -4,12 +4,12 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET mlc tok-embed poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm-mp read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) if (WITH_CUDA_BACKEND) - target_link_libraries(${TARGET} ${MKL_LIBS} gdynet ${LIBS}) + target_link_libraries(${TARGET} gdynet ${LIBS}) add_dependencies(${TARGET} dynetcuda) target_link_libraries(${TARGET} dynetcuda) CUDA_ADD_CUBLAS_TO_TARGET(${TARGET}) else() - target_link_libraries(${TARGET} ${MKL_LIBS} dynet ${LIBS}) + target_link_libraries(${TARGET} dynet ${LIBS}) endif (WITH_CUDA_BACKEND) if(UNIX AND NOT APPLE) target_link_libraries(${TARGET} rt) diff --git a/rnnlm/CMakeLists.txt b/rnnlm/CMakeLists.txt index 15969a980..5c112d681 100644 --- a/rnnlm/CMakeLists.txt +++ b/rnnlm/CMakeLists.txt @@ -2,7 +2,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET lm) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) - target_link_libraries(${TARGET} ${MKL_LIBS} dynet ${LIBS}) + target_link_libraries(${TARGET} dynet ${LIBS}) if(UNIX AND NOT APPLE) target_link_libraries(${TARGET} rt) endif() diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 63eded729..34a90a2f5 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -14,14 +14,14 @@ set(test_dynet_SRCS add_executable (test-dynet test-dynet.cc ${test_dynet_SRCS}) if (WITH_CUDA_BACKEND) - target_link_libraries (test-dynet ${MKL_LIBS} gdynet ${LIBS} + target_link_libraries (test-dynet gdynet ${LIBS} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ) add_dependencies(test-dynet dynetcuda) target_link_libraries(test-dynet dynetcuda) CUDA_ADD_CUBLAS_TO_TARGET(test-dynet) else() - target_link_libraries (test-dynet ${MKL_LIBS} dynet ${LIBS} + target_link_libraries (test-dynet dynet ${LIBS} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ) endif (WITH_CUDA_BACKEND) diff --git a/tutorial/CMakeLists.txt b/tutorial/CMakeLists.txt index 9e94fc762..c938ffcd7 100644 --- a/tutorial/CMakeLists.txt +++ b/tutorial/CMakeLists.txt @@ -2,7 +2,7 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) foreach(TARGET 0_multiply 1_linear_regression) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) - target_link_libraries(${TARGET} ${MKL_LIBS} dynet ${LIBS}) + target_link_libraries(${TARGET} dynet ${LIBS}) if(UNIX AND NOT APPLE) target_link_libraries(${TARGET} rt) endif() From 7d82c317116018bb5be76e19eb277fd5a5e92f8f Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Wed, 19 Oct 2016 18:40:23 -0700 Subject: [PATCH 747/965] Latest version of Eigen doesn't need this change, and now MKL has been tested in Windows and LInux. --- doc/install.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/doc/install.md b/doc/install.md index 577ab9240..6259add1f 100644 --- a/doc/install.md +++ b/doc/install.md @@ -105,7 +105,6 @@ The Windows build also supports CUDA. The latest (development) version of Eigen - block.h: add `#ifndef __CUDACC__` / `#endif` around `EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Block)` - ref.h: add `#ifndef __CUDACC__ / #endif` around `EIGEN_INHERIT_ASSIGNMENT_OPERATORS(RefBase)` -- TensorRandom.h: Change `uint` to `unsigned int` and `SYSTEMTIME st` to immediately above `GetSystemTime(&st)` - TensorDeviceCuda.h: Change `sleep(1)` to `Sleep(1000)` ### MKL support @@ -118,6 +117,6 @@ If cmake is unable to find MKL automatically, try setting `MKL_ROOT`, such as -DMKL_ROOT="/path/to/MKL" -If either MKL or MKL_ROOT are set, CMake will look for MKL. Note, MKL has only been tested in Windows. +If either MKL or MKL_ROOT are set, CMake will look for MKL. From 9c14cc22e3dc1a1845b5cfba32b4ada0aab54ac3 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Wed, 19 Oct 2016 18:41:45 -0700 Subject: [PATCH 748/965] Convenience change to allow multiple build directories with different configurations without git wanting to add them. --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1c0583842..eb39fc4fc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ # cmake stuff -build/ +build*/ Testing/ dynet/Testing/ dynet/tests.bin/ From 7494421c6d7319fdcb1c3404f169cc05c300b9d3 Mon Sep 17 00:00:00 2001 From: Jan Niehues Date: Thu, 20 Oct 2016 17:48:55 +0200 Subject: [PATCH 749/965] More headder files --- dynet/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/dynet/CMakeLists.txt b/dynet/CMakeLists.txt index 4f139b37c..b149f2044 100644 --- a/dynet/CMakeLists.txt +++ b/dynet/CMakeLists.txt @@ -75,6 +75,7 @@ set(dynet_library_HDRS except.h nodes-macros.h weight-decay.h + io-macros.h ) file(GLOB TEST_SRCS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} tests/*.cc) From ebc3119b82704b9e34b8b4c956e1f8a62dc33e8d Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 20 Oct 2016 12:47:24 -0400 Subject: [PATCH 750/965] Automatic documentation from Doxygen comments using groups --- doc/doxygen/Doxyfile | 18 +++++++------- doc/source/optimizers.rst | 6 ++--- dynet/training.h | 52 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 12 deletions(-) diff --git a/doc/doxygen/Doxyfile b/doc/doxygen/Doxyfile index 662015886..526276130 100644 --- a/doc/doxygen/Doxyfile +++ b/doc/doxygen/Doxyfile @@ -203,7 +203,7 @@ MULTILINE_CPP_IS_BRIEF = NO # documentation from any documented member that it re-implements. # The default value is: YES. -INHERIT_DOCS = YES +INHERIT_DOCS = NO # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part @@ -460,7 +460,7 @@ EXTRACT_ANON_NSPACES = NO # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. -HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set @@ -468,21 +468,21 @@ HIDE_UNDOC_MEMBERS = NO # has no effect if EXTRACT_ALL is enabled. # The default value is: NO. -HIDE_UNDOC_CLASSES = NO +HIDE_UNDOC_CLASSES = YES # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # (class|struct|union) declarations. If set to NO, these declarations will be # included in the documentation. # The default value is: NO. -HIDE_FRIEND_COMPOUNDS = NO +HIDE_FRIEND_COMPOUNDS = YES # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. -HIDE_IN_BODY_DOCS = NO +HIDE_IN_BODY_DOCS = YES # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation @@ -544,7 +544,7 @@ INLINE_INFO = YES # name. If set to NO, the members will appear in declaration order. # The default value is: YES. -SORT_MEMBER_DOCS = YES +SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member @@ -1034,7 +1034,7 @@ IGNORE_PREFIX = # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. -GENERATE_HTML = YES +GENERATE_HTML = NO # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of @@ -1578,7 +1578,7 @@ EXTRA_SEARCH_MAPPINGS = # If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. # The default value is: YES. -GENERATE_LATEX = YES +GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of @@ -1864,7 +1864,7 @@ XML_OUTPUT = xml # The default value is: YES. # This tag requires that the tag GENERATE_XML is set to YES. -XML_PROGRAMLISTING = YES +XML_PROGRAMLISTING = NO #--------------------------------------------------------------------------- # Configuration options related to the DOCBOOK output diff --git a/doc/source/optimizers.rst b/doc/source/optimizers.rst index bcb2c05d9..f5bafa091 100644 --- a/doc/source/optimizers.rst +++ b/doc/source/optimizers.rst @@ -3,6 +3,6 @@ DyNet Optimizers The various optimizers that you can use to tune your parameters -.. doxygenstruct:: dynet::SimpleSGDTrainer - -.. doxygenstruct:: dynet::MomentumSGDTrainer \ No newline at end of file +.. doxygengroup:: optimizers + :members: + :content-only: \ No newline at end of file diff --git a/dynet/training.h b/dynet/training.h index 39722abbe..ac7629f76 100644 --- a/dynet/training.h +++ b/dynet/training.h @@ -1,3 +1,14 @@ +/** + * \file training.h + * \defgroup optimizers + * \brief Training procedures + * + * The various trainers are defined here. + * All trainers are structures inheriting from the `Trainer` struct. + * + * + */ + #ifndef DYNET_TRAINING_H_ #define DYNET_TRAINING_H_ @@ -17,7 +28,20 @@ namespace dynet { +/** + * \ingroup optimizers + * + * \struct Trainer + * \brief General trainer struct + * + */ struct Trainer { + /** + * \brief General constructor for a Trainer + * + * \param m Pointer to the model to be trained + * \param e0 Starting learning rate + */ explicit Trainer(Model* m, real e0) : eta0(e0), eta(e0), eta_decay(), epoch(), clipping_enabled(true), clip_threshold(5), clips(), updates(), aux_allocated(false), model(m) {} virtual ~Trainer(); @@ -72,7 +96,20 @@ struct Trainer { void serialize(Archive& ar, const unsigned int); }; +/** + * \ingroup optimizers + * + * \brief Stochastic gradient descent trainer + * \details This trainer performs stochastic gradient descent, the goto optimization procedure for neural networks. [reference needed] + * + */ struct SimpleSGDTrainer : public Trainer { + /** + * \brief Constructor + * + * \param m Pointer to the model to be trained + * \param e0 Starting learning rate + */ explicit SimpleSGDTrainer(Model* m, real e0 = 0.1) : Trainer(m, e0) {} protected: DYNET_TRAINER_DEFINE_DEV_IMPL() @@ -83,7 +120,22 @@ struct SimpleSGDTrainer : public Trainer { void serialize(Archive& ar, const unsigned int); }; +/** + * \ingroup optimizers + * + * \brief Stochastic gradient descent with momentum + * \details This is a modified version of the SGD algorithm with momentum to stablize the gradient trajectory. + * The modified gradient is \f$\hat\nabla_{t+1}=\mu\hat\nabla_{t}+\nabla_{t+1}\f$ where \f$\mu\f$ is the momentum. [reference needed] + * + */ struct MomentumSGDTrainer : public Trainer { + /** + * \brief Constructor + * + * \param m Pointer to the model to be trained + * \param e0 Starting learning rate + * \param mom Momentum + */ explicit MomentumSGDTrainer(Model* m, real e0 = 0.01, real mom = 0.9) : Trainer(m, e0), momentum(mom) {} From a55f31f98430c173fff848553594e40fa94518cd Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 20 Oct 2016 14:38:55 -0400 Subject: [PATCH 751/965] Adding learning rate decay --- dynet/training.h | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/dynet/training.h b/dynet/training.h index ac7629f76..2d2f4e86d 100644 --- a/dynet/training.h +++ b/dynet/training.h @@ -42,8 +42,8 @@ struct Trainer { * \param m Pointer to the model to be trained * \param e0 Starting learning rate */ - explicit Trainer(Model* m, real e0) : - eta0(e0), eta(e0), eta_decay(), epoch(), clipping_enabled(true), clip_threshold(5), clips(), updates(), aux_allocated(false), model(m) {} + explicit Trainer(Model* m, real e0, real edecay = 0.0) : + eta0(e0), eta(e0), eta_decay(edecay), epoch(), clipping_enabled(true), clip_threshold(5), clips(), updates(), aux_allocated(false), model(m) {} virtual ~Trainer(); void update(real scale = 1.0); @@ -100,7 +100,9 @@ struct Trainer { * \ingroup optimizers * * \brief Stochastic gradient descent trainer - * \details This trainer performs stochastic gradient descent, the goto optimization procedure for neural networks. [reference needed] + * \details This trainer performs stochastic gradient descent, the goto optimization procedure for neural networks. + * In the standard setting, the learning rate at epoch \f$t\f$ is \f$\eta_t=\frac{\eta_0}{1+\eta_{\mathrm{decay}}t}\f$ + * [reference needed] * */ struct SimpleSGDTrainer : public Trainer { @@ -109,8 +111,9 @@ struct SimpleSGDTrainer : public Trainer { * * \param m Pointer to the model to be trained * \param e0 Starting learning rate + * \param edecay Learning rate decay parameter. */ - explicit SimpleSGDTrainer(Model* m, real e0 = 0.1) : Trainer(m, e0) {} + explicit SimpleSGDTrainer(Model* m, real e0 = 0.1, real edecay = 0.0) : Trainer(m, e0, edecay = 0.0) {} protected: DYNET_TRAINER_DEFINE_DEV_IMPL() private: @@ -135,9 +138,10 @@ struct MomentumSGDTrainer : public Trainer { * \param m Pointer to the model to be trained * \param e0 Starting learning rate * \param mom Momentum + * \param edecay Learning rate decay parameter. */ - explicit MomentumSGDTrainer(Model* m, real e0 = 0.01, real mom = 0.9) : - Trainer(m, e0), momentum(mom) {} + explicit MomentumSGDTrainer(Model* m, real e0 = 0.01, real mom = 0.9, real edecay = 0.0) : + Trainer(m, e0, edecay), momentum(mom) {} protected: DYNET_TRAINER_DEFINE_DEV_IMPL() @@ -158,8 +162,8 @@ struct MomentumSGDTrainer : public Trainer { }; struct AdagradTrainer : public Trainer { - explicit AdagradTrainer(Model* m, real e0 = 0.1, real eps = 1e-20) : - Trainer(m, e0), epsilon(eps) {} + explicit AdagradTrainer(Model* m, real e0 = 0.1, real eps = 1e-20, real edecay = 0.0) : + Trainer(m, e0, edecay), epsilon(eps) {} protected: DYNET_TRAINER_DEFINE_DEV_IMPL() virtual void alloc_impl() override; @@ -175,7 +179,7 @@ struct AdagradTrainer : public Trainer { }; struct AdadeltaTrainer : public Trainer { - explicit AdadeltaTrainer(Model* m, real eps = 1e-6, real rho = 0.95) : + explicit AdadeltaTrainer(Model* m, real eps = 1e-6, real rho = 0.95, real edecay = 0.0) : Trainer(m, 1.0), epsilon(eps), rho(rho) {} protected: DYNET_TRAINER_DEFINE_DEV_IMPL() @@ -195,8 +199,8 @@ struct AdadeltaTrainer : public Trainer { }; struct RmsPropTrainer : public Trainer { - explicit RmsPropTrainer(Model* m, real e0 = 0.1, real eps = 1e-20, real rho = 0.95) : - Trainer(m, e0), epsilon(eps), rho(rho) {} + explicit RmsPropTrainer(Model* m, real e0 = 0.1, real eps = 1e-20, real rho = 0.95, real edecay = 0.0) : + Trainer(m, e0, edecay), epsilon(eps), rho(rho) {} protected: DYNET_TRAINER_DEFINE_DEV_IMPL() virtual void alloc_impl() override; @@ -213,7 +217,7 @@ struct RmsPropTrainer : public Trainer { }; struct AdamTrainer : public Trainer { - explicit AdamTrainer(Model* m, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8) : + explicit AdamTrainer(Model* m, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8, real edecay = 0.0) : Trainer(m, alpha), beta_1(beta_1), beta_2(beta_2), epsilon(eps) {} protected: From ca3350c04302ac4e6c01cec6932aeabb7e5b5808 Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 20 Oct 2016 16:47:38 -0400 Subject: [PATCH 752/965] Corrected 0 learning rate decay bug Also renamed a parameter for the Adam Optimizer for consistency. Documented the optimizers --- dynet/training.h | 97 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 88 insertions(+), 9 deletions(-) diff --git a/dynet/training.h b/dynet/training.h index 2d2f4e86d..0388d0fa2 100644 --- a/dynet/training.h +++ b/dynet/training.h @@ -40,7 +40,7 @@ struct Trainer { * \brief General constructor for a Trainer * * \param m Pointer to the model to be trained - * \param e0 Starting learning rate + * \param e0 Initial learning rate */ explicit Trainer(Model* m, real e0, real edecay = 0.0) : eta0(e0), eta(e0), eta_decay(edecay), epoch(), clipping_enabled(true), clip_threshold(5), clips(), updates(), aux_allocated(false), model(m) {} @@ -102,7 +102,8 @@ struct Trainer { * \brief Stochastic gradient descent trainer * \details This trainer performs stochastic gradient descent, the goto optimization procedure for neural networks. * In the standard setting, the learning rate at epoch \f$t\f$ is \f$\eta_t=\frac{\eta_0}{1+\eta_{\mathrm{decay}}t}\f$ - * [reference needed] + * + * Reference : [reference needed](ref.need.ed) * */ struct SimpleSGDTrainer : public Trainer { @@ -110,7 +111,7 @@ struct SimpleSGDTrainer : public Trainer { * \brief Constructor * * \param m Pointer to the model to be trained - * \param e0 Starting learning rate + * \param e0 Initial learning rate * \param edecay Learning rate decay parameter. */ explicit SimpleSGDTrainer(Model* m, real e0 = 0.1, real edecay = 0.0) : Trainer(m, e0, edecay = 0.0) {} @@ -128,17 +129,19 @@ struct SimpleSGDTrainer : public Trainer { * * \brief Stochastic gradient descent with momentum * \details This is a modified version of the SGD algorithm with momentum to stablize the gradient trajectory. - * The modified gradient is \f$\hat\nabla_{t+1}=\mu\hat\nabla_{t}+\nabla_{t+1}\f$ where \f$\mu\f$ is the momentum. [reference needed] - * + * The modified gradient is \f$\theta_{t+1}=\mu\theta_{t}+\nabla_{t+1}\f$ where \f$\mu\f$ is the momentum. + * + * Reference : [reference needed](ref.need.ed) + * */ struct MomentumSGDTrainer : public Trainer { /** * \brief Constructor * * \param m Pointer to the model to be trained - * \param e0 Starting learning rate + * \param e0 Initial learning rate * \param mom Momentum - * \param edecay Learning rate decay parameter. + * \param edecay Learning rate decay parameter */ explicit MomentumSGDTrainer(Model* m, real e0 = 0.01, real mom = 0.9, real edecay = 0.0) : Trainer(m, e0, edecay), momentum(mom) {} @@ -161,7 +164,25 @@ struct MomentumSGDTrainer : public Trainer { void serialize(Archive& ar, const unsigned int); }; +/** + * \ingroup optimizers + * + * \brief Adagrad optimizer + * \details The adagrad algorithm assigns a different learning rate to each parameter according to the following formula : + * \f$\delta_\theta^{(t)}=-\frac{\eta_0}{\epsilon+\sum_{i=0}^{t-1}(\nabla_\theta^{(i)})^2}\nabla_\theta^{(t)}\f$ + * + * Reference : [Duchi et al., 2011](http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf) + * + */ struct AdagradTrainer : public Trainer { + /** + * \brief Constructor + * + * \param m Pointer to the model to be trained + * \param e0 Initial learning rate + * \param eps Bias parameter \f$\epsilon\f$ in the adagrad formula + * \param edecay Learning rate decay parameter + */ explicit AdagradTrainer(Model* m, real e0 = 0.1, real eps = 1e-20, real edecay = 0.0) : Trainer(m, e0, edecay), epsilon(eps) {} protected: @@ -178,7 +199,27 @@ struct AdagradTrainer : public Trainer { void serialize(Archive& ar, const unsigned int); }; +/** + * \ingroup optimizers + * + * \brief AdaDelta optimizer + * \details The AdaDelta optimizer is a variant of Adagrad where + * \f$\frac{\eta_0}{\sqrt{\epsilon+\sum_{i=0}^{t-1}(\nabla_\theta^{(i)})^2}}\f$ is replaced by + * \f$\frac{\sqrt{\epsilon+\sum_{i=0}^{t-1}\rho^{t-i-1}(1-\rho)(\delta_\theta^{(i)})^2}}{\sqrt{\epsilon+\sum_{i=0}^{t-1}(\nabla_\theta^{(i)})^2}}\f$, + * hence eliminating the need for an initial learning rate. + * + * Reference : [ADADELTA: An Adaptive Learning Rate Method](https://arxiv.org/pdf/1212.5701v1) + * + */ struct AdadeltaTrainer : public Trainer { + /** + * \brief Constructor + * + * \param m Pointer to the model to be trained + * \param eps Bias parameter \f$\epsilon\f$ in the adagrad formula + * \param rho Update parameter for the moving average of updates in the numerator + * \param edecay Learning rate decay parameter + */ explicit AdadeltaTrainer(Model* m, real eps = 1e-6, real rho = 0.95, real edecay = 0.0) : Trainer(m, 1.0), epsilon(eps), rho(rho) {} protected: @@ -198,7 +239,25 @@ struct AdadeltaTrainer : public Trainer { void serialize(Archive& ar, const unsigned int); }; +/** + * \ingroup optimizers + * + * \brief RMSProp optimizer + * \details The RMSProp optimizer is a variant of Adagrad where the squared sum of previous gradients is replaced with a moving average with parameter \f$\rho\f$. + * + * Reference : [reference needed](ref.need.ed) + * + */ struct RmsPropTrainer : public Trainer { + /** + * \brief Constructor + * + * \param m Pointer to the model to be trained + * \param e0 Initial learning rate + * \param eps Bias parameter \f$\epsilon\f$ in the adagrad formula + * \param rho Update parameter for the moving average (`rho = 0` is equivalent to using Adagrad) + * \param edecay Learning rate decay parameter + */ explicit RmsPropTrainer(Model* m, real e0 = 0.1, real eps = 1e-20, real rho = 0.95, real edecay = 0.0) : Trainer(m, e0, edecay), epsilon(eps), rho(rho) {} protected: @@ -216,9 +275,29 @@ struct RmsPropTrainer : public Trainer { void serialize(Archive& ar, const unsigned int); }; +/** + * \ingroup optimizers + * + * \brief Adam optimizer + * \details The Adam optimizer is similar to RMSProp but uses unbiased estimates + * of the first and second moments of the gradient + * + * Reference : [Adam: A Method for Stochastic Optimization](https://arxiv.org/pdf/1412.6980v8) + * + */ struct AdamTrainer : public Trainer { - explicit AdamTrainer(Model* m, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8, real edecay = 0.0) : - Trainer(m, alpha), beta_1(beta_1), beta_2(beta_2), epsilon(eps) {} + /** + * \brief Constructor + * + * \param m Pointer to the model to be trained + * \param e0 Initial learning rate + * \param beta_1 Moving average parameter for the mean + * \param beta_2 Moving average parameter for the variance + * \param eps Bias parameter \f$\epsilon\f$ + * \param edecay Learning rate decay parameter + */ + explicit AdamTrainer(Model* m, float e0 = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8, real edecay = 0.0) : + Trainer(m, e0), beta_1(beta_1), beta_2(beta_2), epsilon(eps) {} protected: DYNET_TRAINER_DEFINE_DEV_IMPL() From f5def7d8365e65e25d0101fa54ae3975b090aac1 Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 20 Oct 2016 16:50:29 -0400 Subject: [PATCH 753/965] Better documentation - Corrected build script - Contribution guidelines for documentation - Contribution guidelines stub for code - Operations group (now needs to be correctly documented in dynet/expr.h) --- doc/build_doc.sh | 6 ++++-- doc/source/code_style.rst | 4 ++++ doc/source/contributing.rst | 11 ++++++++++ doc/source/doc_style.rst | 43 +++++++++++++++++++++++++++++++++++++ doc/source/index.rst | 1 + doc/source/operations.rst | 6 +++--- dynet/expr.h | 32 +++++++++++++++++++++++++-- 7 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 doc/source/code_style.rst create mode 100644 doc/source/contributing.rst create mode 100644 doc/source/doc_style.rst diff --git a/doc/build_doc.sh b/doc/build_doc.sh index 243005d49..8db4067b1 100644 --- a/doc/build_doc.sh +++ b/doc/build_doc.sh @@ -1,7 +1,9 @@ #!/bin/bash # Run Doxygen -doxygen doxygen/config +cd doxygen +doxygen +cd .. # Run sphinx to generate text and html doc -make html text +make html diff --git a/doc/source/code_style.rst b/doc/source/code_style.rst new file mode 100644 index 000000000..2454d2dde --- /dev/null +++ b/doc/source/code_style.rst @@ -0,0 +1,4 @@ +Coding style +============ + +TBD \ No newline at end of file diff --git a/doc/source/contributing.rst b/doc/source/contributing.rst new file mode 100644 index 000000000..ddcf0b35a --- /dev/null +++ b/doc/source/contributing.rst @@ -0,0 +1,11 @@ +Contibuting to Dynet +==================== + +You are very welcome to contribute to Dynet, be it to correct a bug or add a feature. +Here are some guidelines to guarantee consistency. + +.. toctree:: + :maxdepth: 2 + + code_style + doc_style diff --git a/doc/source/doc_style.rst b/doc/source/doc_style.rst new file mode 100644 index 000000000..5baf941e7 --- /dev/null +++ b/doc/source/doc_style.rst @@ -0,0 +1,43 @@ +Documentation +============= + +Dynet uses Doxygen_ for commenting the code and Sphinx_ for the general documentation. + +If you're only documenting features you don't need to concern yourself with Sphinx, your doxygen comments will be integrated in the documentation automatically. + +Doxygen guidelines +------------------ + +Please document any publicly accessible function you write using the doxygen syntax. +You can see examples in the training_ file. The most important thing is to use :code:`/*` style comments and :code:`\command` style commands. + +For ease of access the documentation is divided into *groups*. For now the groups are optimizers and operations. If you implement a function that falls into one of these groups, add :code:`\ingroup [group name]` at the beginning of your comment block. + +If you want to create a group, use :code:`\defgroup [group-name]` at the beginning of your file. Then create a file for this group in sphinx (see next section). + +Sphinx guidelines +----------------- + +The sphinx source files are located in :code:`doc/source`. They describe the documentation's organization using the reStructuredText_ Markup language. + +Although reStructuredText is more powerful than Markdown_ it might feel less intuitive, especially when writing long documents. If needs be you can write your doc in Markdown and convert it using Pandoc_. + +For a tutorial on Sphinx see their tutorial_. + +Doxygen generated XML is integrated in sphinx files using the Breathe_ module. The only breathe command used now is :code:`doxygengroup`. You shouldn't used commands for individual classes/functions/structs without a good reason. Most information should be put in the doxygen comments. + +Building the docs +----------------- + +The documentation is automatically rebuilt by ReadTheDocs each time you push on Github. + +If you want to build the documentation locally you'll need to install doxygen, sphinx and breathe and then run :code:`build_doc.sh` from the :code:`doc` folder. + +.. _Doxygen: www.doxygen.org/ +.. _Sphinx: http://www.sphinx-doc.org/en/stable/index.html +.. _training: https://github.com/clab/dynet/blob/master/dynet/training.h +.. _reStructuredText: http://docutils.sourceforge.net/rst.html +.. _Markdown: https://daringfireball.net/projects/markdown/ +.. _Pandoc: http://pandoc.org/ +.. _tutorial: http://www.sphinx-doc.org/en/stable/tutorial.html +.. _Breathe: https://breathe.readthedocs.io/en/latest/ diff --git a/doc/source/index.rst b/doc/source/index.rst index 18a26d54e..d168d08b7 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -15,6 +15,7 @@ You can find information about how to install/use DyNet in general below: python commandline tutorial + contributing The following can be referenced when implementing your models in DyNet: diff --git a/doc/source/operations.rst b/doc/source/operations.rst index f1937ba70..eda5eb4cb 100644 --- a/doc/source/operations.rst +++ b/doc/source/operations.rst @@ -1,6 +1,6 @@ DyNet Operations ================ -The various operations that you can use in building a DyNet graph - -TODO: Create documentation +.. doxygengroup:: operations + :members: + :content-only: \ No newline at end of file diff --git a/dynet/expr.h b/dynet/expr.h index ec954c798..b7377f372 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -1,3 +1,11 @@ +/** + * \file expr.h + * \defgroup operations + * \brief The various operations that you can use in building a DyNet graph + * + * TODO: Create documentation and explain expressions, etc... + */ + #ifndef DYNET_EXPR_H #define DYNET_EXPR_H @@ -6,17 +14,37 @@ #include "dynet/nodes-contract.h" namespace dynet { namespace expr { - +/** + * \ingroup operations + * \brief Expressions are the building block of a Dynet computation graph + * \details [long description] + */ struct Expression { ComputationGraph *pg; VariableIndex i; Expression() : pg(nullptr) { } + /** + * \brief Base expression constructor + * \details [long description] + * + * \param pg [description] + * \param i [description] + */ Expression(ComputationGraph *pg, VariableIndex i) : pg(pg), i(i) { } const Tensor& value() const { return pg->get_value(i); } }; - +/** + * \ingroup operations + * \brief Input node + * \details [long description] + * + * \param g Computation graph + * \param s Real number + * + * \return The new expression + */ Expression input(ComputationGraph& g, real s); Expression input(ComputationGraph& g, const real *ps); Expression input(ComputationGraph& g, const Dim& d, const std::vector& data); From 437b263b4df5e98359e0007ca9cdae43076cf91b Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 20 Oct 2016 16:57:45 -0400 Subject: [PATCH 754/965] Removed the old md docs --- doc/builders.md | 4 -- doc/commandline.md | 17 ----- doc/index.md | 15 ---- doc/install.md | 123 -------------------------------- doc/minibatch.md | 2 - doc/multiprocessing.md | 4 -- doc/operations.md | 4 -- doc/optimizers.md | 4 -- doc/python.md | 154 ----------------------------------------- doc/tutorial.md | 45 ------------ 10 files changed, 372 deletions(-) delete mode 100644 doc/builders.md delete mode 100644 doc/commandline.md delete mode 100644 doc/index.md delete mode 100644 doc/install.md delete mode 100644 doc/minibatch.md delete mode 100644 doc/multiprocessing.md delete mode 100644 doc/operations.md delete mode 100644 doc/optimizers.md delete mode 100644 doc/python.md delete mode 100644 doc/tutorial.md diff --git a/doc/builders.md b/doc/builders.md deleted file mode 100644 index 84c3152d1..000000000 --- a/doc/builders.md +++ /dev/null @@ -1,4 +0,0 @@ -# DyNet Builders -Builders combine together various operations to implement more complicated things such as recurrent and LSTM networks - -TODO: Create documentation diff --git a/doc/commandline.md b/doc/commandline.md deleted file mode 100644 index 7469cfb49..000000000 --- a/doc/commandline.md +++ /dev/null @@ -1,17 +0,0 @@ -# DyNet Command Line Options - -All programs using DyNet have a few command line options. These must be specified at the -very beginning of the command line, before other options. - -* `--dynet-mem NUMBER`: DyNet runs by default with 512MB of memory each for the forward and - backward steps, as well as parameter storage. You will often want to increase this amount. - By setting NUMBER here, DyNet will allocate more memory. Note that you can also individually - set the amount of memory for forward calculation, backward calculation, and parameters - by using comma separated variables `--dynet-mem FOR,BACK,PARAM`. This is useful if, for - example, you are performing testing and don't need to allocate any memory for backward - calculation. -* `--dynet-l2 NUMBER`: Specifies the level of l2 regularization to use (default 1e-6). -* `--dynet-gpus NUMBER`: Specify how many GPUs you want to use, if DyNet is compiled with CUDA. - Currently, only one GPU is supported. -* `--dynet-gpu-ids X,Y,Z`: Specify the GPUs that you want to use by device ID. Currently only - one GPU is supported, but if you use this command you can select which one to use. diff --git a/doc/index.md b/doc/index.md deleted file mode 100644 index 12aaa60e5..000000000 --- a/doc/index.md +++ /dev/null @@ -1,15 +0,0 @@ -# DyNet Documentation -Dynamic neural network library documentation - -You can find information about how to install/use DyNet in general below: -* [Installing](install.md): How to compile the code for DyNet -* [Python](python.md): How to set up the Python bindings -* [Command Line Options](commandline.md): DyNet has several options that allow you to specify behavior -* [Tutorial](tutorial.md): How to code and train a simple model - -The following can be referenced when implementing your models in DyNet: -* [Operations](operations.md): The various operations that you can use in building a DyNet graph -* [Builders](builders.md): Builders combine together various operations to implement more complicated things such as recurrent and LSTM networks -* [Optimizers](optimizers.md): The various optimizers that you can use to tune your parameters -* [Minibatching](minibatch.md): How to perform minibatching -* [Multiprocessing](multiprocessing.md): How to perform processing on multiple threads diff --git a/doc/install.md b/doc/install.md deleted file mode 100644 index 577ab9240..000000000 --- a/doc/install.md +++ /dev/null @@ -1,123 +0,0 @@ -# Building/Installing -How to build DyNet and link it with your programs - -## Prerequisites - -DyNet relies on a number of external libraries including Boost, cmake, Eigen, and mercurial (to install Eigen). -Boost, cmake, and mercurial can be installed from standard repositories, for example on Ubuntu linux: - - sudo apt-get install libboost-all-dev cmake mercurial - -To compile DyNet you also need the [development version of the Eigen library](https://bitbucket.org/eigen/eigen). **If you use any of the released versions, you may get assertion failures or compile errors.** If you don't have Eigen installed already, you can get it easily using the following command: - - hg clone https://bitbucket.org/eigen/eigen/ - -## Building - -To get and build DyNet, clone the repository - - git clone https://github.com/clab/dynet.git - -then enter the directory and use [`cmake`](http://www.cmake.org/) to generate the makefiles - - cd dynet - mkdir build - cd build - cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen - -Then compile, where "2" can be replaced by the number of cores on your machine - - make -j 2 - -To see that things have built properly, you can run - - ./examples/xor - -which will train a multilayer perceptron to predict the xor function. - -## Compiling/linking External Programs - -When you want to use DyNet in an external program, you will need to add the `dynet` -directory to the compile path: - - -I/path/to/dynet - -and link with the dynet library: - - -L/path/to/dynet/build/dynet -ldynet - -## Debugging build problems - -If you have a build problem and want to debug, please run - - make clean - make VERBOSE=1 &> make.log - -then examine the commands in the `make.log` file to see if anything looks fishy. If -you would like help, send this `make.log` file via the "Issues" tab on github, or to -the dynet-users mailing list. - -## Build options - -### GPU (CUDA) support - -`dynet` supports running programs on GPUs with CUDA. If you have CUDA installed, you -can build DyNet with GPU support by adding `-DBACKEND=cuda` to your cmake options. -This will result in three libraries named "libdynet," "libgdynet," and "libdynetcuda" being -created. When you want to run a program on CPU, you can link to the "libdynet" library as -shown above. When you want to run a program on GPU, you can link to the "libgdynet" and -"libdynetcuda" libraries. - - -L/path/to/dynet/build/dynet -lgdynet -ldynetcuda - -(Eventually you will be able to use a single library to run on either CPU or GPU, but this is -not fully implemented yet.) - -### Non-standard Boost location - -`dynet` supports boost, and will find it if it is in the standard location. If boost is -in a non-standard location, say `$HOME/boost`, you can specify the location by adding -the following to your cmake options: - - -DBOOST_ROOT:PATHNAME=$HOME/boost -DBoost_LIBRARY_DIRS:FILEPATH=$HOME/boost/lib - -DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE - -Note that you will also have to set your `LD_LIBRARY_PATH` to point to the `boost/lib` -directory. - -### Building for Windows - -DYNET has been tested to build in Windows using Microsoft Visual Studio 2015. You may be able to build with MSVC 2013 by slightly modifying the instructions below. - -First, install Eigen following the above instructions. - -Second, install [Boost](http://www.boost.org/) for your compiler and platform. Follow the instructions for compiling Boost or just download the already-compiled binaries. - -To generate the MSVC solution and project files, run [cmake](http://www.cmake.org), pointing it to the location you installed Eigen and Boost (for example, at c:\libs\Eigen and c:\libs\boost_1_61_0): - - mkdir build - cd build - cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64" - -This will generate dynet.sln and a bunch of \*.vcxproj files (one for the DYNET library, and one per example). You should be able to just open dynet.sln and build all. **Note: multi-process functionality is currently not supported in Windows, so you will not be able to build rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to this project**. - -The Windows build also supports CUDA. The latest (development) version of Eigen has some code that causes problems with the CUDA compiler. These issue change as Eigen is developed. Currently, the following three changes are needed in Eigen when compiling with CUDA support: - -- block.h: add `#ifndef __CUDACC__` / `#endif` around `EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Block)` -- ref.h: add `#ifndef __CUDACC__ / #endif` around `EIGEN_INHERIT_ASSIGNMENT_OPERATORS(RefBase)` -- TensorRandom.h: Change `uint` to `unsigned int` and `SYSTEMTIME st` to immediately above `GetSystemTime(&st)` -- TensorDeviceCuda.h: Change `sleep(1)` to `Sleep(1000)` - -### MKL support - -DyNet can leverage Intel's MKL library to speed up computation on the CPU. As an example, we've seen 3x speedup in seq2seq training when using MKL. To use MKL, include the following cmake option: - - -DMKL=TRUE - -If cmake is unable to find MKL automatically, try setting `MKL_ROOT`, such as - - -DMKL_ROOT="/path/to/MKL" - -If either MKL or MKL_ROOT are set, CMake will look for MKL. Note, MKL has only been tested in Windows. - - diff --git a/doc/minibatch.md b/doc/minibatch.md deleted file mode 100644 index 4e11d1196..000000000 --- a/doc/minibatch.md +++ /dev/null @@ -1,2 +0,0 @@ -# Mini-batching in DyNet -How to perform minibatching to improve efficiency diff --git a/doc/multiprocessing.md b/doc/multiprocessing.md deleted file mode 100644 index 1b9eb629c..000000000 --- a/doc/multiprocessing.md +++ /dev/null @@ -1,4 +0,0 @@ -# Multi-processing in DyNet -How to perform processing on multiple threads - -(TODO: create doc) diff --git a/doc/operations.md b/doc/operations.md deleted file mode 100644 index 77b66be0a..000000000 --- a/doc/operations.md +++ /dev/null @@ -1,4 +0,0 @@ -# DyNet Operations -The various operations that you can use in building a DyNet graph - -TODO: Create documentation diff --git a/doc/optimizers.md b/doc/optimizers.md deleted file mode 100644 index f8a72a296..000000000 --- a/doc/optimizers.md +++ /dev/null @@ -1,4 +0,0 @@ -# DyNet Optimizers -The various optimizers that you can use to tune your parameters - -TODO: create documentation diff --git a/doc/python.md b/doc/python.md deleted file mode 100644 index 4c7db6fb0..000000000 --- a/doc/python.md +++ /dev/null @@ -1,154 +0,0 @@ -# Installing the Python DyNet module. - -(for instructions on installing on a computer with GPU, see below) - -Python bindings to DyNet are currently only supported under python 2. - -## TL;DR -(see below for the details) - -```bash -# Installing python DyNet on a machine with python 2.7: - -pip install cython # if you don't have it already. -mkdir dynet-base -cd dynet-base -# getting dynet and eigen -git clone https://github.com/clab/dynet.git -hg clone https://bitbucket.org/eigen/eigen -cd dynet -mkdir build -cd build -# without GPU support: -cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` -# or with GPU support: -cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` -DBACKEND=cuda - -make -j 2 # replace 2 with the number of available cores -cd python -python setup.py install # or `python setup.py install --user` for a user-local install. -``` - -## Detailed Instructions: -First, get DyNet: - -```bash -cd $HOME -mkdir dynet-base -cd dynet-base -git clone https://github.com/clab/dynet.git -cd dynet -git submodule init # To be consistent with DyNet's installation instructions. -git submodule update # To be consistent with DyNet's installation instructions. -``` - -Then get Eigen: - -```bash -cd $HOME -cd dynet-base -hg clone https://bitbucket.org/eigen/eigen/ -``` - -We also need to make sure the `cython` module is installed. -(you can replace `pip` with your favorite package manager, such as `conda`, or install within a virtual environment) -```bash -pip install cython -``` - -To simplify the following steps, we can set a bash variable to hold where we have saved the main directories of DyNet and Eigen. In case you have gotten DyNet and Eigen differently from the instructions above and saved them in different location(s), these variables will be helpful: - -```bash -PATH_TO_DYNET=$HOME/dynet-base/dynet/ -PATH_TO_EIGEN=$HOME/dynet-base/eigen/ -``` - -Compile DyNet. - -This is pretty much the same process as compiling DyNet, with the addition of the `-DPYTHON=` flag, pointing to the location of your python interpreter. - -If boost is installed in a non-standard location, you should add the corresponding flags to the `cmake` commandline, -see the [DyNet installation instructions page](install.md). - -```bash -cd $PATH_TO_DYNET -PATH_TO_PYTHON=`which python` -mkdir build -cd build -cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON -make -j 2 -``` - -Assuming that the `cmake` command found all the needed libraries and didn't fail, the `make` command will take a while, and compile dynet as well as the python bindings. -You can change `make -j 2` to a higher number, depending on the available cores you want to use while compiling. - -You now have a working python binding inside of `build/dynet`. -To verify this is working: - -```bash -cd $PATH_TO_DYNET/build/python -python -``` -then, within python: -```bash -import dynet as dy -print dy.__version__ -model = dy.Model() -``` - -In order to install the module so that it is accessible from everywhere in the system, run the following: -```bash -cd $PATH_TO_DYNET/build/python -python setup.py install --user -``` - -(the `--user` switch will install the module in your local site-packages, and works without root privilages. - To install the module to the system site-packages (for all users), run `python setup.py install` without this switch) - - -You should now have a working python binding (the dynet module). - -Note however that the installation relies on the compiled dynet library being in `$PATH_TO_DYNET/build/dynet`, -so make sure not to move it from there. - -Now, check that everything works: - -```bash -# check that it works: -cd $PATH_TO_DYNET -cd pyexamples -python xor.py -python rnnlm.py rnnlm.py -``` - -Alternatively, if the following script works for you, then your installation is likely to be working: -``` -from dynet import * -model = Model() -``` - -## Installing with GPU support - -For installing on a computer with GPU, first install CUDA. -The following instructions assume CUDA is installed. - -The installation process is pretty much the same, while adding the `-DBACKEND=cuda` flag to the `cmake` stage: - -```bash -cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON -DBACKEND=cuda -``` - -(if CUDA is installed in a non-standard location and `cmake` cannot find it, you can specify also `-DCUDA_TOOLKIT_ROOT_DIR=/path/to/cuda`.) - -Now, build the python modules (as above, we assume cython is installed): - -After running `make -j 2`, you should have the files `_dynet.so` and `_gdynet.so` in the `build/python` folder. - -As before, `cd build/python` followed by `python setup.py install --user` will install the module. - -# Using the GPU: - -In order to use the GPU support, you can either: - -* Use `import _gdynet as dy` instead of `import dynet as dy` -* Or, (preferred), `import dynet` as usual, but use the commandline switch `--dynet-gpu` or the GPU switches detailed [here](commandline.md) when invoking the program. This option lets the same code work with either the GPU or the CPU version depending on how it is invoked. diff --git a/doc/tutorial.md b/doc/tutorial.md deleted file mode 100644 index f7a29890d..000000000 --- a/doc/tutorial.md +++ /dev/null @@ -1,45 +0,0 @@ -# DyNet Tutorial - -An illustration of how models are trained (for a simple logistic regression model) is below: - -```c++ -// *** First, we set up the structure of the model -// Create a model, and an SGD trainer to update its parameters. -Model mod; -SimpleSGDTrainer sgd(&mod); -// Create a "computation graph," which will define the flow of information. -ComputationGraph cg; -// Initialize a 1x3 parameter vector, and add the parameters to be part of the -// computation graph. -Expression W = parameter(cg, mod.add_parameters({1, 3})); -// Create variables defining the input and output of the regression, and load them -// into the computation graph. Note that we don't need to set concrete values yet. -vector x_values(3); -Expression x = input(cg, {3}, &x_values); -dynet::real y_value; -Expression y = input(cg, &y_value); -// Next, set up the structure to multiply the input by the weight vector, then run -// the output of this through a logistic sigmoid function (logistic regression). -Expression y_pred = logistic(W*x); -// Finally, we create a function to calculate the loss. The model will be optimized -// to minimize the value of the final function in the computation graph. -Expression l = binary_log_loss(y_pred, y); -// We are now done setting up the graph, and we can print out its structure: -cg.print_graphviz(); - -// *** Now, we perform a parameter update for a single example. -// Set the input/output to the values specified by the training data: -x_values = {0.5, 0.3, 0.7}; -y_value = 1.0; -// "forward" propagates values forward through the computation graph, and returns -// the loss. -dynet::real loss = as_scalar(cg.forward(l)); -// "backward" performs back-propagation, and accumulates the gradients of the -// parameters within the "Model" data structure. -cg.backward(l); -// "sgd.update" updates parameters of the model that was passed to its constructor. -// Here 1.0 is the scaling factor that allows us to control the size of the update. -sgd.update(1.0); -``` - -Note that this very simple example that doesn't cover things like memory initialization, reading/writing models, recurrent/LSTM networks, or adding biases to functions. The best way to get an idea of how to use DyNet for real is to look in the `example` directory, particularly starting with the simplest `xor` example. From 479a3d0486febe78961ba11b7814da70cc62a01f Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 21 Oct 2016 11:56:59 +0300 Subject: [PATCH 755/965] edecay support in python --- python/dynet.pxd | 10 +++++----- python/dynet.pyx | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/python/dynet.pxd b/python/dynet.pxd index bbb9b2d7c..d761e8931 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -104,33 +104,33 @@ cdef extern from "dynet/dynet.h" namespace "dynet": cdef extern from "dynet/training.h" namespace "dynet": cdef cppclass CSimpleSGDTrainer "dynet::SimpleSGDTrainer": #CSimpleSGDTrainer(CModel* m, float lam, float e0) - CSimpleSGDTrainer(CModel* m, float e0) # TODO removed lam, update docs. + CSimpleSGDTrainer(CModel* m, float e0, float edecay) # TODO removed lam, update docs. void update(float s) void update_epoch(float r) void status() cdef cppclass CMomentumSGDTrainer "dynet::MomentumSGDTrainer": - CMomentumSGDTrainer(CModel* m, float e0, float mom) # TODO removed lam, update docs + CMomentumSGDTrainer(CModel* m, float e0, float mom, float edecay) # TODO removed lam, update docs void update(float s) void update_epoch(float r) void status() cdef cppclass CAdagradTrainer "dynet::AdagradTrainer": - CAdagradTrainer(CModel* m, float e0, float eps) # TODO removed lam, update docs + CAdagradTrainer(CModel* m, float e0, float eps, float edecay) # TODO removed lam, update docs void update(float s) void update_epoch(float r) void status() cdef cppclass CAdadeltaTrainer "dynet::AdadeltaTrainer": - CAdadeltaTrainer(CModel* m, float eps, float rho) # TODO removed lam, update docs + CAdadeltaTrainer(CModel* m, float eps, float rho, float edecay) # TODO removed lam, update docs void update(float s) void update_epoch(float r) void status() cdef cppclass CAdamTrainer "dynet::AdamTrainer": - CAdamTrainer(CModel* m, float alpha, float beta_1, float beta_2, float eps) # TODO removed lam, update docs + CAdamTrainer(CModel* m, float alpha, float beta_1, float beta_2, float eps, float edecay) # TODO removed lam, update docs void update(float s) void update_epoch(float r) diff --git a/python/dynet.pyx b/python/dynet.pyx index 13699347c..d7261b67b 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -1282,8 +1282,8 @@ cdef class StackedRNNState: # {{{ Training cdef class SimpleSGDTrainer: cdef CSimpleSGDTrainer *thisptr - def __cinit__(self, Model m, float e0 = 0.1): - self.thisptr = new CSimpleSGDTrainer(m.thisptr, e0) + def __cinit__(self, Model m, float e0 = 0.1, float edecay = 0.0): + self.thisptr = new CSimpleSGDTrainer(m.thisptr, e0, edecay) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): @@ -1295,8 +1295,8 @@ cdef class SimpleSGDTrainer: cdef class MomentumSGDTrainer: cdef CMomentumSGDTrainer *thisptr - def __cinit__(self, Model m, float e0 = 0.01, float mom = 0.9): - self.thisptr = new CMomentumSGDTrainer(m.thisptr, e0, mom) + def __cinit__(self, Model m, float e0 = 0.01, float mom = 0.9, float edecay = 0.0): + self.thisptr = new CMomentumSGDTrainer(m.thisptr, e0, mom, edecay) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): @@ -1308,8 +1308,8 @@ cdef class MomentumSGDTrainer: cdef class AdagradTrainer: cdef CAdagradTrainer *thisptr - def __cinit__(self, Model m, float e0 = 0.1, float eps = 1e-20): - self.thisptr = new CAdagradTrainer(m.thisptr, e0, eps) + def __cinit__(self, Model m, float e0 = 0.1, float eps = 1e-20, float edecay = 0.0): + self.thisptr = new CAdagradTrainer(m.thisptr, e0, eps, edecay) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): @@ -1321,8 +1321,8 @@ cdef class AdagradTrainer: cdef class AdadeltaTrainer: cdef CAdadeltaTrainer *thisptr - def __cinit__(self, Model m, float eps = 1e-6, float rho = 0.95): - self.thisptr = new CAdadeltaTrainer(m.thisptr, eps, rho) + def __cinit__(self, Model m, float eps = 1e-6, float rho = 0.95, float edecay = 0.0): + self.thisptr = new CAdadeltaTrainer(m.thisptr, eps, rho, edecay) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): @@ -1334,8 +1334,8 @@ cdef class AdadeltaTrainer: cdef class AdamTrainer: cdef CAdamTrainer *thisptr - def __cinit__(self, Model m, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, eps = 1e-8 ): - self.thisptr = new CAdamTrainer(m.thisptr, alpha, beta_1, beta_2, eps) + def __cinit__(self, Model m, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, eps = 1e-8, float edecay = 0.0 ): + self.thisptr = new CAdamTrainer(m.thisptr, alpha, beta_1, beta_2, eps, edecay) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): From e8cbdbc752dc40a2263f1ebad0b8585baa8b2f4f Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Fri, 21 Oct 2016 13:02:10 -0700 Subject: [PATCH 756/965] Adding instructions for running Python with MKL on Linux. --- doc/python.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/python.md b/doc/python.md index 4c7db6fb0..b5eee5ac0 100644 --- a/doc/python.md +++ b/doc/python.md @@ -152,3 +152,10 @@ In order to use the GPU support, you can either: * Use `import _gdynet as dy` instead of `import dynet as dy` * Or, (preferred), `import dynet` as usual, but use the commandline switch `--dynet-gpu` or the GPU switches detailed [here](commandline.md) when invoking the program. This option lets the same code work with either the GPU or the CPU version depending on how it is invoked. + +## MKL + +If you've built dynet to use MKL (using -DMKL or -DMKL_ROOT), python sometimes has difficulty finding the MKL shared libraries. You can try setting LD_LIBRARY_PATH to point to your MKL library directory. If that doesn't work, try setting the following environment variable (supposing, for example, your MKL libraries are located at /opt/intel/mkl/lib/intel64): + +`export LD_PRELOAD=/opt/intel/mkl/lib/intel64/libmkl_def.so:/opt/intel/mkl/lib/intel64/libmkl_avx2.so:/opt/intel/mkl/lib/intel64/libmkl_core.so:/opt/intel/mkl/lib/intel64/libmkl_intel_lp64.so:/opt/intel/mkl/lib/intel64/libmkl_intel_thread.so:/opt/intel/lib/intel64_lin/libiomp5.so` + From 1c70e3b85e4d0311b6cea99e5babea412562a901 Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 21 Oct 2016 16:04:32 -0400 Subject: [PATCH 757/965] New init proc. Should be compatible with the previous interface UNTESTED ON CUDA! --- dynet/cuda.cc | 124 +++++++++++---------------------------- dynet/cuda.h | 8 ++- dynet/init.cc | 157 ++++++++++++++++++++++++++++++++++++++------------ dynet/init.h | 26 +++++++++ 4 files changed, 187 insertions(+), 128 deletions(-) diff --git a/dynet/cuda.cc b/dynet/cuda.cc index 87ca1ccd1..ff14f7dc3 100644 --- a/dynet/cuda.cc +++ b/dynet/cuda.cc @@ -4,6 +4,7 @@ #include "dynet/dynet.h" #include "dynet/cuda.h" +#include "init.h" using namespace std; @@ -16,104 +17,41 @@ static void remove_args(int& argc, char**& argv, int& argi, int n) { assert(argc >= 0); } -#define MAX_GPUS 256 -vector initialize_gpu(int& argc, char**& argv) { +vector initialize_gpu(DynetParams params) { + // Get GPU devices count int nDevices; CUDA_CHECK(cudaGetDeviceCount(&nDevices)); if (nDevices < 1) { cerr << "[dynet] No GPUs found, recompile without DENABLE_CUDA=1\n"; throw std::runtime_error("No GPUs found but DYNET compiled with CUDA support."); } - // logic: no flags, you get 1 GPU - // or you request a certain number of GPUs explicitly - // or you request the device ids - int requested_gpus = -1; - vector gpu_mask(MAX_GPUS,0); - int argi = 1; - string mem_descriptor = "512"; - bool ngpus_requested = false; - bool ids_requested = false; - for( ;argi < argc; ++argi) { - string arg = argv[argi]; - if (arg == "--dynet-mem" || arg == "--dynet_mem") { - if ((argi + 1) > argc) { - cerr << "[dynet] --dynet-mem expects an argument (the memory, in megabytes, to reserve)\n"; - abort(); - } else { - mem_descriptor = argv[argi+1]; - remove_args(argc, argv, argi, 2); - } - } else if (arg == "--dynet_gpus" || arg == "--dynet-gpus") { - if ((argi + 1) > argc) { - cerr << "[dynet] --dynet-gpus expects an argument (number of GPUs to use)\n"; - abort(); - } else { - if (ngpus_requested) { - cerr << "Multiple instances of --dynet-gpus" << endl; abort(); - } - ngpus_requested = true; - string a2 = argv[argi+1]; - istringstream c(a2); c >> requested_gpus; - remove_args(argc, argv, argi, 2); - } - } else if (arg == "--dynet_gpu_ids" || arg == "--dynet-gpu-ids") { - if ((argi + 1) > argc) { - cerr << "[dynet] --dynet-gpu-ids expects an argument (comma separated list of physical GPU ids to use)\n"; - abort(); - } else { - string a2 = argv[argi+1]; - if (ids_requested) { - cerr << "Multiple instances of --dynet-gpu-ids" << endl; abort(); - } - ids_requested = true; - if (a2.size() % 2 != 1) { - cerr << "Bad argument to --dynet-gpu-ids: " << a2 << endl; abort(); - } - for (unsigned i = 0; i < a2.size(); ++i) { - if ((i % 2 == 0 && (a2[i] < '0' || a2[i] > '9')) || - (i % 2 == 1 && a2[i] != ',')) { - cerr << "Bad argument to --dynet-gpu-ids: " << a2 << endl; abort(); - } - if (i % 2 == 0) { - int gpu_id = a2[i] - '0'; - if (gpu_id >= nDevices) { - cerr << "You requested GPU id " << gpu_id << " but system only reports up to " << nDevices << endl; - abort(); - } - if (gpu_id >= MAX_GPUS) { cerr << "Raise MAX_GPUS\n"; abort(); } - gpu_mask[gpu_id]++; - requested_gpus++; - if (gpu_mask[gpu_id] != 1) { - cerr << "Bad argument to --dynet-gpu-ids: " << a2 << endl; abort(); - } - } - } - remove_args(argc, argv, argi, 2); - } + + // Check gpu_mask + for (unsigned gpu_id = nDevices; gpu_id < MAX_GPUS; ++gpu_ids) { + if (params.gpu_mask[gpu_id] != 0) { + cerr << "You requested GPU id " << gpu_id << " but system only reports up to " << nDevices << endl; + abort(); } } - if (ids_requested && ngpus_requested) { - cerr << "Use only --dynet_gpus or --dynet_gpu_ids, not both\n"; - abort(); - } - if (ngpus_requested || requested_gpus == -1) { - if (requested_gpus == -1) requested_gpus = 1; - cerr << "Request for " << requested_gpus << " GPU" << (requested_gpus == 1 ? "" : "s") << " ...\n"; - for (int i = 0; i < MAX_GPUS; ++i) gpu_mask[i] = 1; - } else if (ids_requested) { - requested_gpus++; - cerr << "[dynet] Request for " << requested_gpus << " specific GPU" << (requested_gpus == 1 ? "" : "s") << " ...\n"; + + if (params.ngpus_requested || params.requested_gpus == -1) { + if (params.requested_gpus == -1) params.requested_gpus = 1; + cerr << "Request for " << params.requested_gpus << " GPU" << (params.requested_gpus == 1 ? "" : "s") << " ...\n"; + for (int i = 0; i < MAX_GPUS; ++i) params.gpu_mask[i] = 1; + } else if (params.ids_requested) { + params.requested_gpus++; + cerr << "[dynet] Request for " << params.requested_gpus << " specific GPU" << (params.requested_gpus == 1 ? "" : "s") << " ...\n"; } vector gpudevices; - if (requested_gpus == 0) return gpudevices; - if (requested_gpus > nDevices) { - cerr << "You requested " << requested_gpus << " GPUs but system only reports " << nDevices << endl; + if (params.requested_gpus == 0) return gpudevices; + if (params.requested_gpus > nDevices) { + cerr << "You requested " << params.requested_gpus << " GPUs but system only reports " << nDevices << endl; abort(); } - // after all that, requested_gpus is the number of GPUs to reserve + // after all that, params.requested_gpus is the number of GPUs to reserve // we now pick the ones that are both requested by the user or have // the most memory free @@ -122,14 +60,14 @@ vector initialize_gpu(int& argc, char**& argv) { for (int i = 0; i < MAX_GPUS; ++i) gpus[i] = i; size_t free_bytes, total_bytes; for (int i = 0; i < nDevices; i++) { - if (!gpu_mask[i]) continue; + if (!params.gpu_mask[i]) continue; cudaDeviceProp prop; CUDA_CHECK(cudaGetDeviceProperties(&prop, i)); cerr << "[dynet] Device Number: " << i << endl; cerr << "[dynet] Device name: " << prop.name << endl; cerr << "[dynet] Memory Clock Rate (KHz): " << prop.memoryClockRate << endl; cerr << "[dynet] Memory Bus Width (bits): " << prop.memoryBusWidth << endl; - cerr << "[dynet] Peak Memory Bandwidth (GB/s): " << (2.0*prop.memoryClockRate*(prop.memoryBusWidth/8)/1.0e6) << endl; + cerr << "[dynet] Peak Memory Bandwidth (GB/s): " << (2.0 * prop.memoryClockRate * (prop.memoryBusWidth / 8) / 1.0e6) << endl; if (!prop.unifiedAddressing) { cerr << "[dynet] GPU does not support unified addressing.\n"; abort(); @@ -137,10 +75,10 @@ vector initialize_gpu(int& argc, char**& argv) { CUDA_CHECK(cudaSetDevice(i)); try { CUDA_CHECK(cudaMemGetInfo( &free_bytes, &total_bytes )); - cerr << "[dynet] Memory Free (GB): " << free_bytes/1.0e9 << "/" << total_bytes/1.0e9 << endl; + cerr << "[dynet] Memory Free (GB): " << free_bytes / 1.0e9 << "/" << total_bytes / 1.0e9 << endl; cerr << "[dynet]" << endl; gpu_free_mem[i] = free_bytes; - } catch(dynet::cuda_exception e) { + } catch (dynet::cuda_exception e) { cerr << "[dynet] FAILED to get free memory" << endl; gpu_free_mem[i] = 0; cudaGetLastError(); @@ -148,16 +86,22 @@ vector initialize_gpu(int& argc, char**& argv) { CUDA_CHECK(cudaDeviceReset()); } stable_sort(gpus.begin(), gpus.end(), [&](int a, int b) -> bool { return gpu_free_mem[a] > gpu_free_mem[b]; }); - gpus.resize(requested_gpus); + gpus.resize(params.requested_gpus); cerr << "[dynet] Device(s) selected:"; - for (int i = 0; i < requested_gpus; ++i) { + for (int i = 0; i < params.requested_gpus; ++i) { cerr << ' ' << gpus[i]; - Device* d = new Device_GPU(gpudevices.size(), mem_descriptor, gpus[i]); + Device* d = new Device_GPU(gpudevices.size(), params.mem_descriptor, gpus[i]); gpudevices.push_back(d); } cerr << endl; return gpudevices; + +} + +vector initialize_gpu(int& argc, char**& argv) { + DynetParams params = extract_dynet_params(argc, argv); + return initialize_gpu(params); } } // namespace dynet diff --git a/dynet/cuda.h b/dynet/cuda.h index b45691289..e7ff8c298 100644 --- a/dynet/cuda.h +++ b/dynet/cuda.h @@ -11,13 +11,14 @@ #include #include "dynet/except.h" +#include "dynet/init.h" #define CUDA_CHECK(stmt) do { \ cudaError_t err = stmt; \ if (err != cudaSuccess) { \ std::cerr << "CUDA failure in " << #stmt << std::endl\ << cudaGetErrorString(err) << std::endl; \ - throw dynet::cuda_exception(#stmt); \ + throw dynet::cuda_exception(#stmt); \ } \ } while(0) @@ -26,11 +27,13 @@ if (stat != CUBLAS_STATUS_SUCCESS) { \ std::cerr << "CUBLAS failure in " << #stmt \ << std::endl << stat << std::endl; \ - throw dynet::cuda_exception(#stmt); \ + throw dynet::cuda_exception(#stmt); \ } \ } while(0) namespace dynet { + +#define MAX_GPUS 256 class Device; @@ -53,6 +56,7 @@ inline std::pair SizeToBlockThreadPair(int n) { return std::make_pair(blocks, threads); } +std::vector initialize_gpu(DynetParams params); std::vector initialize_gpu(int& argc, char**& argv); } // namespace dynet diff --git a/dynet/init.cc b/dynet/init.cc index a918c7cd0..7764c6612 100644 --- a/dynet/init.cc +++ b/dynet/init.cc @@ -23,67 +23,146 @@ static void remove_args(int& argc, char**& argv, int& argi, int n) { assert(argc >= 0); } -void initialize(int& argc, char**& argv, bool shared_parameters) { - if(default_device != nullptr) { - cerr << "WARNING: Attempting to initialize dynet twice. Ignoring duplicate initialization." << endl; - return; - } - vector gpudevices; -#if HAVE_CUDA - cerr << "[dynet] initializing CUDA\n"; - gpudevices = initialize_gpu(argc, argv); -#endif - unsigned random_seed = 0; +DynetParams extract_dynet_params(int& argc, char**& argv, bool shared_parameters) { + DynetParams params; + int argi = 1; - string mem_descriptor = "512"; - while(argi < argc) { + + while (argi < argc) { string arg = argv[argi]; + + // Memory if (arg == "--dynet-mem" || arg == "--dynet_mem") { if ((argi + 1) > argc) { cerr << "[dynet] --dynet-mem expects an argument (the memory, in megabytes, to reserve)\n"; abort(); } else { - mem_descriptor = argv[argi+1]; + params.mem_descriptor = argv[argi + 1]; remove_args(argc, argv, argi, 2); } - } else if (arg == "--dynet-l2" || arg == "--dynet_l2") { + } + + // Weight decay + if (arg == "--dynet-l2" || arg == "--dynet_l2") { if ((argi + 1) > argc) { cerr << "[dynet] --dynet-l2 requires an argument (the weight decay per update)\n"; abort(); } else { - string a2 = argv[argi+1]; - float decay = 0; - istringstream d(a2); d >> decay; + string a2 = argv[argi + 1]; + istringstream d(a2); d >> params.weight_decay; remove_args(argc, argv, argi, 2); - if (decay < 0 || decay >= 1) { - cerr << "[dynet] weight decay parameter must be between 0 and 1 (probably very small like 1e-6)\n"; - abort(); - } - weight_decay_lambda = decay; } - } else if (arg == "--dynet-seed" || arg == "--dynet_seed") { + } + + // Random seed + if (arg == "--dynet-seed" || arg == "--dynet_seed") { if ((argi + 1) > argc) { cerr << "[dynet] --dynet-seed expects an argument (the random number seed)\n"; abort(); } else { - string a2 = argv[argi+1]; - istringstream c(a2); c >> random_seed; + string a2 = argv[argi + 1]; + istringstream c(a2); c >> params.random_seed; remove_args(argc, argv, argi, 2); } - } else if (arg.find("--dynet") == 0) { - cerr << "[dynet] Bad command line argument: " << arg << endl; - abort(); - } else { break; } + } + +#if HAVE_CUDA + // Number of GPUs + if (arg == "--dynet_gpus" || arg == "--dynet-gpus") { + if ((argi + 1) > argc) { + cerr << "[dynet] --dynet-gpus expects an argument (number of GPUs to use)\n"; + abort(); + } else { + if (params.ngpus_requested) { + cerr << "Multiple instances of --dynet-gpus" << endl; abort(); + } + params.ngpus_requested = true; + string a2 = argv[argi + 1]; + istringstream c(a2); c >> params.requested_gpus; + remove_args(argc, argv, argi, 2); + } + } + + // GPU ids + if (arg == "--dynet_gpu_ids" || arg == "--dynet-gpu-ids") { + if ((argi + 1) > argc) { + cerr << "[dynet] --dynet-gpu-ids expects an argument (comma separated list of physical GPU ids to use)\n"; + abort(); + } else { + string a2 = argv[argi + 1]; + if (params.ids_requested) { + cerr << "Multiple instances of --dynet-gpu-ids" << endl; abort(); + } + params.ids_requested = true; + if (a2.size() % 2 != 1) { + cerr << "Bad argument to --dynet-gpu-ids: " << a2 << endl; abort(); + } + for (unsigned i = 0; i < a2.size(); ++i) { + if ((i % 2 == 0 && (a2[i] < '0' || a2[i] > '9')) || + (i % 2 == 1 && a2[i] != ',')) { + cerr << "Bad argument to --dynet-gpu-ids: " << a2 << endl; abort(); + } + if (i % 2 == 0) { + int gpu_id = a2[i] - '0'; + if (gpu_id >= MAX_GPUS) { cerr << "Raise MAX_GPUS\n"; abort(); } + params.gpu_mask[gpu_id]++; + params.requested_gpus++; + if (params.gpu_mask[gpu_id] != 1) { + cerr << "Bad argument to --dynet-gpu-ids: " << a2 << endl; abort(); + } + } + } + remove_args(argc, argv, argi, 2); + } + } +#endif + // Go to next argument + argi++; + + } + +#if HAVE_CUDA + // Check for conflict between the two ways of requesting GPUs + if (params.ids_requested && params.ngpus_requested) { + cerr << "Use only --dynet_gpus or --dynet_gpu_ids, not both\n"; + abort(); } - if (random_seed == 0) { +#endif + + return params; +} + +void initialize(DynetParams params) { + if (default_device != nullptr) { + cerr << "WARNING: Attempting to initialize dynet twice. Ignoring duplicate initialization." << endl; + return; + } + + // initialize CUDA + vector gpudevices; +#if HAVE_CUDA + cerr << "[dynet] initializing CUDA\n"; + gpudevices = initialize_gpu(params); +#endif + + // Set random seed + if (params.random_seed == 0) { random_device rd; - random_seed = rd(); + params.random_seed = rd(); } - cerr << "[dynet] random seed: " << random_seed << endl; - rndeng = new mt19937(random_seed); + cerr << "[dynet] random seed: " << params.random_seed << endl; + rndeng = new mt19937(params.random_seed); - cerr << "[dynet] allocating memory: " << mem_descriptor << "MB\n"; - devices.push_back(new Device_CPU(devices.size(), mem_descriptor, shared_parameters)); + // Set weight decay rate + if (params.weight_decay < 0 || params.weight_decay >= 1) { + cerr << "[dynet] weight decay parameter must be between 0 and 1 (probably very small like 1e-6)\n"; + abort(); + } + weight_decay_lambda = params.weight_decay; + + // Allocate memory + cerr << "[dynet] allocating memory: " << params.mem_descriptor<< "MB\n"; + devices.push_back(new Device_CPU(devices.size(), params.mem_descriptor, params.shared_parameters)); int default_index = 0; if (gpudevices.size() > 0) { for (auto gpu : gpudevices) @@ -97,6 +176,12 @@ void initialize(int& argc, char**& argv, bool shared_parameters) { kSCALAR_ONE = default_device->kSCALAR_ONE; kSCALAR_ZERO = default_device->kSCALAR_ZERO; cerr << "[dynet] memory allocation done.\n"; + +} + +void initialize(int& argc, char**& argv, bool shared_parameters) { + DynetParams params = extract_dynet_params(argc, argv, shared_parameters); + initialize(params); } void cleanup() { diff --git a/dynet/init.h b/dynet/init.h index 66c081636..76c81e9d3 100644 --- a/dynet/init.h +++ b/dynet/init.h @@ -1,10 +1,36 @@ #ifndef DYNET_EIGEN_INIT_H #define DYNET_EIGEN_INIT_H +#include +#if HAVE_CUDA +#include "dynet/cuda.h" +#endif + namespace dynet { extern float weight_decay_lambda; +/** + * \brief Represents general parameters for dynet + * + */ +struct DynetParams { + unsigned random_seed = 0; /**< The seed for random number generation */ + std::string mem_descriptor = "512"; /**< Total memory to be allocated for Dynet */ + float weight_decay = 0; /**< Weight decay rate for L2 regularization */ + bool shared_parameters = false; /**< TO DOCUMENT */ + +#if HAVE_CUDA + bool ngpus_requested = false; /**< GPUs requested by number */ + bool ids_requested = false; /**< GPUs requested by ids */ + int requested_gpus = -1; /**< Number of requested GPUs */ + vector gpu_mask(MAX_GPUS, 0); /**< List of required GPUs by ids */ +#endif + +}; + +DynetParams extract_dynet_params(int& argc, char**& argv, bool shared_parameters = false); +void initialize(DynetParams params); void initialize(int& argc, char**& argv, bool shared_parameters = false); void cleanup(); From 3241ded0cd1aeefc81f5c27110588c0ac77fee70 Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 21 Oct 2016 17:20:52 -0400 Subject: [PATCH 758/965] Fixed some compiling errors with CUDA. STILL NOT TESTED WITH CUDA --- dynet/cuda.cc | 12 +----------- dynet/cuda.h | 15 ++++++++++----- dynet/init.cc | 7 ++++++- dynet/init.h | 6 ++---- 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/dynet/cuda.cc b/dynet/cuda.cc index ff14f7dc3..c56cc1a26 100644 --- a/dynet/cuda.cc +++ b/dynet/cuda.cc @@ -4,20 +4,10 @@ #include "dynet/dynet.h" #include "dynet/cuda.h" -#include "init.h" - using namespace std; namespace dynet { -static void remove_args(int& argc, char**& argv, int& argi, int n) { - for (int i = argi + n; i < argc; ++i) - argv[i - n] = argv[i]; - argc -= n; - assert(argc >= 0); -} - - vector initialize_gpu(DynetParams params) { // Get GPU devices count int nDevices; @@ -28,7 +18,7 @@ vector initialize_gpu(DynetParams params) { } // Check gpu_mask - for (unsigned gpu_id = nDevices; gpu_id < MAX_GPUS; ++gpu_ids) { + for (unsigned gpu_id = nDevices; gpu_id < MAX_GPUS; ++gpu_id) { if (params.gpu_mask[gpu_id] != 0) { cerr << "You requested GPU id " << gpu_id << " but system only reports up to " << nDevices << endl; abort(); diff --git a/dynet/cuda.h b/dynet/cuda.h index e7ff8c298..b610dcaef 100644 --- a/dynet/cuda.h +++ b/dynet/cuda.h @@ -11,7 +11,9 @@ #include #include "dynet/except.h" -#include "dynet/init.h" + + +#define MAX_GPUS 256 #define CUDA_CHECK(stmt) do { \ cudaError_t err = stmt; \ @@ -31,13 +33,16 @@ } \ } while(0) + + namespace dynet { - -#define MAX_GPUS 256 + +struct DynetParams; + class Device; -inline std::pair SizeToBlockThreadPair(int n) { +inline std::pair SizeToBlockThreadPair(int n) { assert(n); int logn; #ifdef _WIN32 @@ -56,7 +61,7 @@ inline std::pair SizeToBlockThreadPair(int n) { return std::make_pair(blocks, threads); } -std::vector initialize_gpu(DynetParams params); +std::vector initialize_gpu(dynet::DynetParams params); std::vector initialize_gpu(int& argc, char**& argv); } // namespace dynet diff --git a/dynet/init.cc b/dynet/init.cc index 7764c6612..7013198d6 100644 --- a/dynet/init.cc +++ b/dynet/init.cc @@ -28,6 +28,11 @@ DynetParams extract_dynet_params(int& argc, char**& argv, bool shared_parameters int argi = 1; +#if HAVE_CUDA + params.gpu_mask = std::vector(MAX_GPUS, 0); +#endif + + while (argi < argc) { string arg = argv[argi]; @@ -161,7 +166,7 @@ void initialize(DynetParams params) { weight_decay_lambda = params.weight_decay; // Allocate memory - cerr << "[dynet] allocating memory: " << params.mem_descriptor<< "MB\n"; + cerr << "[dynet] allocating memory: " << params.mem_descriptor << "MB\n"; devices.push_back(new Device_CPU(devices.size(), params.mem_descriptor, params.shared_parameters)); int default_index = 0; if (gpudevices.size() > 0) { diff --git a/dynet/init.h b/dynet/init.h index 76c81e9d3..35f9b2a89 100644 --- a/dynet/init.h +++ b/dynet/init.h @@ -2,9 +2,7 @@ #define DYNET_EIGEN_INIT_H #include -#if HAVE_CUDA -#include "dynet/cuda.h" -#endif +#include namespace dynet { @@ -24,7 +22,7 @@ struct DynetParams { bool ngpus_requested = false; /**< GPUs requested by number */ bool ids_requested = false; /**< GPUs requested by ids */ int requested_gpus = -1; /**< Number of requested GPUs */ - vector gpu_mask(MAX_GPUS, 0); /**< List of required GPUs by ids */ + std::vector gpu_mask; /**< List of required GPUs by ids */ #endif }; From 10313e3e8acf125a2e82b365d46eccc9c188b999 Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 21 Oct 2016 17:35:59 -0400 Subject: [PATCH 759/965] Fixed bug where some arguments were overlooked. --- dynet/init.cc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/dynet/init.cc b/dynet/init.cc index 7013198d6..41e8c2ca7 100644 --- a/dynet/init.cc +++ b/dynet/init.cc @@ -48,7 +48,7 @@ DynetParams extract_dynet_params(int& argc, char**& argv, bool shared_parameters } // Weight decay - if (arg == "--dynet-l2" || arg == "--dynet_l2") { + else if (arg == "--dynet-l2" || arg == "--dynet_l2") { if ((argi + 1) > argc) { cerr << "[dynet] --dynet-l2 requires an argument (the weight decay per update)\n"; abort(); @@ -60,7 +60,7 @@ DynetParams extract_dynet_params(int& argc, char**& argv, bool shared_parameters } // Random seed - if (arg == "--dynet-seed" || arg == "--dynet_seed") { + else if (arg == "--dynet-seed" || arg == "--dynet_seed") { if ((argi + 1) > argc) { cerr << "[dynet] --dynet-seed expects an argument (the random number seed)\n"; abort(); @@ -73,7 +73,7 @@ DynetParams extract_dynet_params(int& argc, char**& argv, bool shared_parameters #if HAVE_CUDA // Number of GPUs - if (arg == "--dynet_gpus" || arg == "--dynet-gpus") { + else if (arg == "--dynet_gpus" || arg == "--dynet-gpus") { if ((argi + 1) > argc) { cerr << "[dynet] --dynet-gpus expects an argument (number of GPUs to use)\n"; abort(); @@ -89,7 +89,7 @@ DynetParams extract_dynet_params(int& argc, char**& argv, bool shared_parameters } // GPU ids - if (arg == "--dynet_gpu_ids" || arg == "--dynet-gpu-ids") { + else if (arg == "--dynet_gpu_ids" || arg == "--dynet-gpu-ids") { if ((argi + 1) > argc) { cerr << "[dynet] --dynet-gpu-ids expects an argument (comma separated list of physical GPU ids to use)\n"; abort(); @@ -121,8 +121,12 @@ DynetParams extract_dynet_params(int& argc, char**& argv, bool shared_parameters } } #endif + // Go to next argument - argi++; + else { + argi++; + } + } From 912dbb0e888cf758990028ec193ea02bd8a9f15a Mon Sep 17 00:00:00 2001 From: ikekonglp Date: Fri, 21 Oct 2016 14:40:37 -0700 Subject: [PATCH 760/965] Update CMakeLists.txt --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a1fb20ad..11a3bdd59 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -84,7 +84,7 @@ if(DEFINED ENV{BOOST_ROOT}) get_filename_component(Boost_INCLUDE_DIR "${Boost_INCLUDE_DIR}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") endif() set(Boost_REALPATH ON) -message("-- Boost dir is " ${EIGEN3_INCLUDE_DIR}) +message("-- Boost dir is " ${Boost_INCLUDE_DIR}) find_package(Boost COMPONENTS program_options regex serialization REQUIRED) include_directories(${Boost_INCLUDE_DIR}) if(MSVC) From 5b6dca507b332fa5e93d8f610bd131a208935d9b Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Fri, 21 Oct 2016 15:29:55 -0700 Subject: [PATCH 761/965] This chunk of help was lost in transition to RST. --- doc/source/install.rst | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index fa23a2470..c713a728d 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -140,7 +140,7 @@ the already-compiled binaries. To generate the MSVC solution and project files, run `cmake `__, pointing it to the location you -installed Eigen and Boost (for example, at c:and c:\_1\_61\_0): +installed Eigen and Boost (for example, at c:\libs\Eigen and c:\libs\boost_1_61_0): :: @@ -154,3 +154,26 @@ dynet.sln and build all. **Note: multi-process functionality is currently not supported in Windows, so you will not be able to build rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to this project** + +The Windows build also supports CUDA. The latest (development) version of Eigen has some code that causes problems with the CUDA compiler. These issue change as Eigen is developed. Currently, the following three changes are needed in Eigen when compiling with CUDA support: + +- block.h: add `#ifndef __CUDACC__` / `#endif` around `EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Block)` +- ref.h: add `#ifndef __CUDACC__ / #endif` around `EIGEN_INHERIT_ASSIGNMENT_OPERATORS(RefBase)` +- TensorDeviceCuda.h: Change `sleep(1)` to `Sleep(1000)` + +MKL support +~~~~~~~~~~~ + +DyNet can leverage Intel's MKL library to speed up computation on the CPU. As an example, we've seen 3x speedup in seq2seq training when using MKL. To use MKL, include the following cmake option: + +:: + -DMKL=TRUE + +If cmake is unable to find MKL automatically, try setting `MKL_ROOT`, such as + +:: + -DMKL_ROOT="/path/to/MKL" + +If either MKL or MKL_ROOT are set, CMake will look for MKL. + + From 38c7231c33deb4d5df52c508b319254255ed5272 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Fri, 21 Oct 2016 15:30:14 -0700 Subject: [PATCH 762/965] Adding help for MKL for Python on Linux --- doc/source/python.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/doc/source/python.rst b/doc/source/python.rst index 0cdb0206d..7849aeb2f 100644 --- a/doc/source/python.rst +++ b/doc/source/python.rst @@ -187,3 +187,15 @@ In order to use the GPU support, you can either: `here `__ when invoking the program. This option lets the same code work with either the GPU or the CPU version depending on how it is invoked. + + +MKL +=== + +If you've built dynet to use MKL (using -DMKL or -DMKL_ROOT), python sometimes has difficulty finding the MKL shared libraries. You can try setting LD_LIBRARY_PATH to point to your MKL library directory. If that doesn't work, try setting the following environment variable (supposing, for example, your MKL libraries are located at /opt/intel/mkl/lib/intel64): + +.. code:: bash + + export LD_PRELOAD=/opt/intel/mkl/lib/intel64/libmkl_def.so:/opt/intel/mkl/lib/intel64/libmkl_avx2.so:/opt/intel/mkl/lib/intel64/libmkl_core.so:/opt/intel/mkl/lib/intel64/libmkl_intel_lp64.so:/opt/intel/mkl/lib/intel64/libmkl_intel_thread.so:/opt/intel/lib/intel64_lin/libiomp5.so + + From afc11f47cc7e9c21ea606c36a79baa271bcf26bb Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Fri, 21 Oct 2016 15:33:12 -0700 Subject: [PATCH 763/965] Minor fix for code block. --- doc/source/install.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/source/install.rst b/doc/source/install.rst index c713a728d..0b4d7acea 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -167,11 +167,13 @@ MKL support DyNet can leverage Intel's MKL library to speed up computation on the CPU. As an example, we've seen 3x speedup in seq2seq training when using MKL. To use MKL, include the following cmake option: :: + -DMKL=TRUE If cmake is unable to find MKL automatically, try setting `MKL_ROOT`, such as :: + -DMKL_ROOT="/path/to/MKL" If either MKL or MKL_ROOT are set, CMake will look for MKL. From 22a359e5a707c7e9823658fbf528ae911c2e54cf Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Fri, 21 Oct 2016 15:38:00 -0700 Subject: [PATCH 764/965] minor: fixing backslashes in documentation. --- doc/source/install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index 0b4d7acea..5b8ecabfd 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -140,7 +140,7 @@ the already-compiled binaries. To generate the MSVC solution and project files, run `cmake `__, pointing it to the location you -installed Eigen and Boost (for example, at c:\libs\Eigen and c:\libs\boost_1_61_0): +installed Eigen and Boost (for example, at c:\\libs\\Eigen and c:\\libs\\boost_1_61_0): :: From 33e70a903bb26c5ab5cd5d31d8092eedfbd991c2 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 21 Oct 2016 20:15:56 -0400 Subject: [PATCH 765/965] Some changes to doc --- README.md | 4 +++- doc/source/index.rst | 26 ++++++++++++++++++++------ doc/source/python.rst | 8 ++++---- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 96c8c875a..391bf3784 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ # DyNet Dynamic neural network library -DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. Read the [documentation](http://dynet.readthedocs.io/en/latest/) to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. +DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for [syntactic parsing](https://github.com/clab/lstm-parser), [machine translation](https://github.com/neubig/lamtram), [morphological inflection](https://github.com/mfaruqui/morph-trans), and many other application areas. + +Read the [documentation](http://dynet.readthedocs.io/en/latest/) to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. * **Latest Code:** Can be found on the github page master branch. * **Latest Release:** [v1.0-rc1](https://github.com/clab/dynet/releases/tag/v1.0-rc1) diff --git a/doc/source/index.rst b/doc/source/index.rst index d168d08b7..363d61bf7 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -6,28 +6,42 @@ Dynet documentation ================================= -You can find information about how to install/use DyNet in general below: +DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for [syntactic parsing](https://github.com/clab/lstm-parser), [machine translation](https://github.com/neubig/lamtram), [morphological inflection](https://github.com/mfaruqui/morph-trans), and many other application areas. + +First, you need to install DyNet: .. toctree:: :maxdepth: 2 install python - commandline - tutorial - contributing -The following can be referenced when implementing your models in DyNet: +And get the basic information to create programs and use models: .. toctree:: :maxdepth: 2 - + + tutorial + commandline operations builders optimizers + +Mode advanced topics are below: + +.. toctree:: + :maxdepth: 2 + minibatch multiprocessing +And we welcome your contributions! + +.. toctree:: + :maxdepth: 2 + + contributing + Indices and tables ================== diff --git a/doc/source/python.rst b/doc/source/python.rst index 7849aeb2f..ccf139b36 100644 --- a/doc/source/python.rst +++ b/doc/source/python.rst @@ -176,8 +176,8 @@ After running ``make -j 2``, you should have the files ``_dynet.so`` and As before, ``cd build/python`` followed by ``python setup.py install --user`` will install the module. -Using the GPU: -============== +Using the GPU +------------- In order to use the GPU support, you can either: @@ -189,8 +189,8 @@ In order to use the GPU support, you can either: on how it is invoked. -MKL -=== +Using MKL +--------- If you've built dynet to use MKL (using -DMKL or -DMKL_ROOT), python sometimes has difficulty finding the MKL shared libraries. You can try setting LD_LIBRARY_PATH to point to your MKL library directory. If that doesn't work, try setting the following environment variable (supposing, for example, your MKL libraries are located at /opt/intel/mkl/lib/intel64): From e43704a69b7c895bbad3ddef5050993f7d3748ec Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 21 Oct 2016 20:21:33 -0400 Subject: [PATCH 766/965] Fixed some links in the doc --- doc/source/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/index.rst b/doc/source/index.rst index 363d61bf7..31dc74b4a 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -6,7 +6,7 @@ Dynet documentation ================================= -DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for [syntactic parsing](https://github.com/clab/lstm-parser), [machine translation](https://github.com/neubig/lamtram), [morphological inflection](https://github.com/mfaruqui/morph-trans), and many other application areas. +DyNet (formerly known as `cnn `_) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for `syntactic parsing `_, `machine translation `_, `morphological inflection `_, and many other application areas. First, you need to install DyNet: From 573714c4d0c39d07b1a10501f610efac421a0121 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 21 Oct 2016 20:51:21 -0400 Subject: [PATCH 767/965] Fixed hierarchy in doc --- README.md | 2 +- doc/source/index.rst | 4 ++-- doc/source/install.rst | 45 +++++++++++++++++++++--------------------- doc/source/python.rst | 18 ++++++++--------- 4 files changed, 35 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 391bf3784..4ae41811a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # DyNet Dynamic neural network library -DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for [syntactic parsing](https://github.com/clab/lstm-parser), [machine translation](https://github.com/neubig/lamtram), [morphological inflection](https://github.com/mfaruqui/morph-trans), and many other application areas. +DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library developed by Carnegie Mellon University and many others. It is written in C++ (with bindings in Python) and is designed to be efficient when run on either CPU or GPU, and to work well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for [syntactic parsing](https://github.com/clab/lstm-parser), [machine translation](https://github.com/neubig/lamtram), [morphological inflection](https://github.com/mfaruqui/morph-trans), and many other application areas. Read the [documentation](http://dynet.readthedocs.io/en/latest/) to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. diff --git a/doc/source/index.rst b/doc/source/index.rst index 31dc74b4a..ef3de90c9 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -6,9 +6,9 @@ Dynet documentation ================================= -DyNet (formerly known as `cnn `_) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for `syntactic parsing `_, `machine translation `_, `morphological inflection `_, and many other application areas. +DyNet (formerly known as `cnn `_) is a neural network library developed by Carnegie Mellon University and many others. It is written in C++ (with bindings in Python) and is designed to be efficient when run on either CPU or GPU, and to work well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for `syntactic parsing `_, `machine translation `_, `morphological inflection `_, and many other application areas. -First, you need to install DyNet: +DyNet can be installed according to the instructions below: .. toctree:: :maxdepth: 2 diff --git a/doc/source/install.rst b/doc/source/install.rst index 5b8ecabfd..ae09ac5fd 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -58,7 +58,7 @@ To see that things have built properly, you can run which will train a multilayer perceptron to predict the xor function. -Compiling/linking External Programs +Compiling/linking external programs ----------------------------------- When you want to use DyNet in an external program, you will need to add @@ -88,11 +88,12 @@ then examine the commands in the ``make.log`` file to see if anything looks fishy. If you would like help, send this ``make.log`` file via the "Issues" tab on github, or to the dynet-users mailing list. -Build options -------------- + +GPU/MKL support and build options +--------------------------------- GPU (CUDA) support -~~~~~~~~~~~~~~~~~~ +------------------ ``dynet`` supports running programs on GPUs with CUDA. If you have CUDA installed, you can build DyNet with GPU support by adding @@ -109,6 +110,24 @@ GPU, you can link to the "libgdynet" and "libdynetcuda" libraries. (Eventually you will be able to use a single library to run on either CPU or GPU, but this is not fully implemented yet.) + +MKL support +----------- + +DyNet can leverage Intel's MKL library to speed up computation on the CPU. As an example, we've seen 3x speedup in seq2seq training when using MKL. To use MKL, include the following cmake option: + +:: + + -DMKL=TRUE + +If cmake is unable to find MKL automatically, try setting `MKL_ROOT`, such as + +:: + + -DMKL_ROOT="/path/to/MKL" + +If either MKL or MKL_ROOT are set, CMake will look for MKL. + Non-standard Boost location ~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -161,21 +180,3 @@ The Windows build also supports CUDA. The latest (development) version of Eigen - ref.h: add `#ifndef __CUDACC__ / #endif` around `EIGEN_INHERIT_ASSIGNMENT_OPERATORS(RefBase)` - TensorDeviceCuda.h: Change `sleep(1)` to `Sleep(1000)` -MKL support -~~~~~~~~~~~ - -DyNet can leverage Intel's MKL library to speed up computation on the CPU. As an example, we've seen 3x speedup in seq2seq training when using MKL. To use MKL, include the following cmake option: - -:: - - -DMKL=TRUE - -If cmake is unable to find MKL automatically, try setting `MKL_ROOT`, such as - -:: - - -DMKL_ROOT="/path/to/MKL" - -If either MKL or MKL_ROOT are set, CMake will look for MKL. - - diff --git a/doc/source/python.rst b/doc/source/python.rst index ccf139b36..f8caee3a4 100644 --- a/doc/source/python.rst +++ b/doc/source/python.rst @@ -32,8 +32,8 @@ TL;DR cd python python setup.py install # or `python setup.py install --user` for a user-local install. -Detailed Instructions: ----------------------- +Detailed Instructions +--------------------- First, get DyNet: @@ -151,8 +151,11 @@ installation is likely to be working: from dynet import * model = Model() -Installing with GPU support ---------------------------- +GPU/MKL Support +--------------- + +Installing/running on GPU +~~~~~~~~~~~~~~~~~~~~~~~~~ For installing on a computer with GPU, first install CUDA. The following instructions assume CUDA is installed. @@ -176,9 +179,6 @@ After running ``make -j 2``, you should have the files ``_dynet.so`` and As before, ``cd build/python`` followed by ``python setup.py install --user`` will install the module. -Using the GPU -------------- - In order to use the GPU support, you can either: - Use ``import _gdynet as dy`` instead of ``import dynet as dy`` @@ -189,8 +189,8 @@ In order to use the GPU support, you can either: on how it is invoked. -Using MKL ---------- +Running with MKL +~~~~~~~~~~~~~~~~ If you've built dynet to use MKL (using -DMKL or -DMKL_ROOT), python sometimes has difficulty finding the MKL shared libraries. You can try setting LD_LIBRARY_PATH to point to your MKL library directory. If that doesn't work, try setting the following environment variable (supposing, for example, your MKL libraries are located at /opt/intel/mkl/lib/intel64): From 0022d9ab5fc7b227712a40f6aeaffac2b2b31a93 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 21 Oct 2016 20:51:21 -0400 Subject: [PATCH 768/965] Fixed hierarchy in doc --- README.md | 2 +- doc/source/index.rst | 4 ++-- doc/source/install.rst | 45 +++++++++++++++++++++--------------------- doc/source/python.rst | 18 ++++++++--------- 4 files changed, 35 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 391bf3784..4ae41811a 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # DyNet Dynamic neural network library -DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for [syntactic parsing](https://github.com/clab/lstm-parser), [machine translation](https://github.com/neubig/lamtram), [morphological inflection](https://github.com/mfaruqui/morph-trans), and many other application areas. +DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library developed by Carnegie Mellon University and many others. It is written in C++ (with bindings in Python) and is designed to be efficient when run on either CPU or GPU, and to work well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for [syntactic parsing](https://github.com/clab/lstm-parser), [machine translation](https://github.com/neubig/lamtram), [morphological inflection](https://github.com/mfaruqui/morph-trans), and many other application areas. Read the [documentation](http://dynet.readthedocs.io/en/latest/) to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. diff --git a/doc/source/index.rst b/doc/source/index.rst index 31dc74b4a..ef3de90c9 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -6,9 +6,9 @@ Dynet documentation ================================= -DyNet (formerly known as `cnn `_) is a neural network library that is written in C++ with bindings in Python. It is designed to be efficient when run on either CPU or GPU, and works well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for `syntactic parsing `_, `machine translation `_, `morphological inflection `_, and many other application areas. +DyNet (formerly known as `cnn `_) is a neural network library developed by Carnegie Mellon University and many others. It is written in C++ (with bindings in Python) and is designed to be efficient when run on either CPU or GPU, and to work well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for `syntactic parsing `_, `machine translation `_, `morphological inflection `_, and many other application areas. -First, you need to install DyNet: +DyNet can be installed according to the instructions below: .. toctree:: :maxdepth: 2 diff --git a/doc/source/install.rst b/doc/source/install.rst index 5b8ecabfd..ae09ac5fd 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -58,7 +58,7 @@ To see that things have built properly, you can run which will train a multilayer perceptron to predict the xor function. -Compiling/linking External Programs +Compiling/linking external programs ----------------------------------- When you want to use DyNet in an external program, you will need to add @@ -88,11 +88,12 @@ then examine the commands in the ``make.log`` file to see if anything looks fishy. If you would like help, send this ``make.log`` file via the "Issues" tab on github, or to the dynet-users mailing list. -Build options -------------- + +GPU/MKL support and build options +--------------------------------- GPU (CUDA) support -~~~~~~~~~~~~~~~~~~ +------------------ ``dynet`` supports running programs on GPUs with CUDA. If you have CUDA installed, you can build DyNet with GPU support by adding @@ -109,6 +110,24 @@ GPU, you can link to the "libgdynet" and "libdynetcuda" libraries. (Eventually you will be able to use a single library to run on either CPU or GPU, but this is not fully implemented yet.) + +MKL support +----------- + +DyNet can leverage Intel's MKL library to speed up computation on the CPU. As an example, we've seen 3x speedup in seq2seq training when using MKL. To use MKL, include the following cmake option: + +:: + + -DMKL=TRUE + +If cmake is unable to find MKL automatically, try setting `MKL_ROOT`, such as + +:: + + -DMKL_ROOT="/path/to/MKL" + +If either MKL or MKL_ROOT are set, CMake will look for MKL. + Non-standard Boost location ~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -161,21 +180,3 @@ The Windows build also supports CUDA. The latest (development) version of Eigen - ref.h: add `#ifndef __CUDACC__ / #endif` around `EIGEN_INHERIT_ASSIGNMENT_OPERATORS(RefBase)` - TensorDeviceCuda.h: Change `sleep(1)` to `Sleep(1000)` -MKL support -~~~~~~~~~~~ - -DyNet can leverage Intel's MKL library to speed up computation on the CPU. As an example, we've seen 3x speedup in seq2seq training when using MKL. To use MKL, include the following cmake option: - -:: - - -DMKL=TRUE - -If cmake is unable to find MKL automatically, try setting `MKL_ROOT`, such as - -:: - - -DMKL_ROOT="/path/to/MKL" - -If either MKL or MKL_ROOT are set, CMake will look for MKL. - - diff --git a/doc/source/python.rst b/doc/source/python.rst index ccf139b36..f8caee3a4 100644 --- a/doc/source/python.rst +++ b/doc/source/python.rst @@ -32,8 +32,8 @@ TL;DR cd python python setup.py install # or `python setup.py install --user` for a user-local install. -Detailed Instructions: ----------------------- +Detailed Instructions +--------------------- First, get DyNet: @@ -151,8 +151,11 @@ installation is likely to be working: from dynet import * model = Model() -Installing with GPU support ---------------------------- +GPU/MKL Support +--------------- + +Installing/running on GPU +~~~~~~~~~~~~~~~~~~~~~~~~~ For installing on a computer with GPU, first install CUDA. The following instructions assume CUDA is installed. @@ -176,9 +179,6 @@ After running ``make -j 2``, you should have the files ``_dynet.so`` and As before, ``cd build/python`` followed by ``python setup.py install --user`` will install the module. -Using the GPU -------------- - In order to use the GPU support, you can either: - Use ``import _gdynet as dy`` instead of ``import dynet as dy`` @@ -189,8 +189,8 @@ In order to use the GPU support, you can either: on how it is invoked. -Using MKL ---------- +Running with MKL +~~~~~~~~~~~~~~~~ If you've built dynet to use MKL (using -DMKL or -DMKL_ROOT), python sometimes has difficulty finding the MKL shared libraries. You can try setting LD_LIBRARY_PATH to point to your MKL library directory. If that doesn't work, try setting the following environment variable (supposing, for example, your MKL libraries are located at /opt/intel/mkl/lib/intel64): From 7ad7e3ce8af84244707bfe93cdae2e021d97b070 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 21 Oct 2016 22:47:40 -0400 Subject: [PATCH 769/965] Fixed hierarchy in doc --- doc/source/install.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index ae09ac5fd..6e90208c5 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -93,7 +93,7 @@ GPU/MKL support and build options --------------------------------- GPU (CUDA) support ------------------- +~~~~~~~~~~~~~~~~~~ ``dynet`` supports running programs on GPUs with CUDA. If you have CUDA installed, you can build DyNet with GPU support by adding @@ -112,7 +112,7 @@ CPU or GPU, but this is not fully implemented yet.) MKL support ------------ +~~~~~~~~~~~ DyNet can leverage Intel's MKL library to speed up computation on the CPU. As an example, we've seen 3x speedup in seq2seq training when using MKL. To use MKL, include the following cmake option: From 490f0566bcd80e9e43577945112af9e89e63d528 Mon Sep 17 00:00:00 2001 From: yoavg Date: Sun, 23 Oct 2016 14:39:46 +0300 Subject: [PATCH 770/965] Parameters initialization support for python dynet. --- python/CHANGES.md | 39 ++++++++++++++++++++++++++++- python/dynet.pxd | 30 +++++++++++++++++++++- python/dynet.pyx | 63 ++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 127 insertions(+), 5 deletions(-) diff --git a/python/CHANGES.md b/python/CHANGES.md index d8bac41c6..d015687f7 100644 --- a/python/CHANGES.md +++ b/python/CHANGES.md @@ -1,7 +1,8 @@ -# pydynet API changes for v2 +# python dynet API changes for v2 * Model no longer holds named parameters * checkpoint / revert mechanism for computation graph (useful for beam search etc) +* parameter initalization API ## Model no longer holds named parameters @@ -189,5 +190,41 @@ cg_revert() ``` +## Parameter Initialization + +As before, parameters are created with: +```python +import dynet as dy +m = dy.Model() +dim = (10,10) # either a 2-dim tuple or a scaler. +p = m.add_parameters(dim) +``` + +This will initialize the parameters according to Glorot Initialization. + +Other initializations can be specified by passing an initializer object: + +```python +import dynet as dy +m = dy.Model() +dim = (10,10) +p = m.add_parameters(dim,init=GlorotInitializer()) +``` + +Possible initializers are: +```python +init1 = dy.NormalInitializer(mean = 0, var = 1) # normal with mean and variance. +init2 = dy.UniformInitializer(scale) # uniform between -scale and scale. +init3 = dy.ConstInitializer(c) # all values are c +init4 = dy.GlorotInitializer() +``` + +Parameters can also be initialized from arbitraty numpy arrays: + +```python +p1 = m.parameters_from_numpy(np.eye(10)) +p2 = m.parameters_from_numpy(np.array([[1,2,3],[4,5,6]])) +``` + diff --git a/python/dynet.pxd b/python/dynet.pxd index d761e8931..a67b5cd88 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -62,10 +62,38 @@ cdef extern from "dynet/model.h" namespace "dynet": void set_updated(bool b) bool is_updated() + cdef cppclass CParameterInit "dynet::ParameterInit": + pass + + cdef cppclass CParameterInitNormal "dynet::ParameterInitNormal" (CParameterInit): + CParameterInitNormal(float m, float v) # m = 0, v=1 + + cdef cppclass CParameterInitUniform "dynet::ParameterInitUniform" (CParameterInit): + CParameterInitUniform(float scale) + + cdef cppclass CParameterInitConst "dynet::ParameterInitConst" (CParameterInit): + CParameterInitConst(float c) + + cdef cppclass CParameterInitGlorot "dynet::ParameterInitGlorot" (CParameterInit): + CParameterInitGlorot(bool is_lookup) # is_lookup = False + + cdef cppclass CParameterInitSaxe "dynet::ParameterInitSaxe" (CParameterInit): + ParameterInitSaxe() + + cdef cppclass CParameterInitFromFile "dynet::ParameterInitFromFile" (CParameterInit): + CParameterInitFromFile(string filename) + + cdef cppclass CParameterInitFromVector "dynet::ParameterInitFromVector" (CParameterInit): + CParameterInitFromVector(vector[float] void) + cdef cppclass CModel "dynet::Model": CModel() #float gradient_l2_norm() const - CParameters add_parameters(CDim& d, float scale = 0.0) + CParameters add_parameters(CDim& d) + CParameters add_parameters(CDim& d, CParameterInit initializer) + #CParameters add_parameters(CDim& d, CParameterInitNormal initializer) + #CParameters add_parameters(CDim& d, CParameterInitUniform initializer) + #CParameters add_parameters(CDim& d, CParameterInitConst initializer) CLookupParameters add_lookup_parameters(unsigned n, const CDim& d) vector[CParameterStorage] parameters_list() diff --git a/python/dynet.pyx b/python/dynet.pyx index d7261b67b..8469e8540 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -98,6 +98,7 @@ cdef class Parameters: # TODO: make more efficient cpdef load_array(self, arr): + assert(False),"This method is depracated. Use instead model.parameters_from_numpy(arr)." cdef CTensor t cdef float* vals t = self.thisptr.get().values @@ -188,6 +189,52 @@ class Saveable(object): def restore_components(self, components): return NotImplemented + +# Initializers +cdef class PyInitializer: + cdef CParameterInit *initializer + def __init__(self): + assert(False),"Do not create PyInitializer directly." + def __dealloc__(self): + del self.initializer + +cdef class NormalInitializer(PyInitializer): + def __init__(self, float mean=0, var=1): + self.initializer = new CParameterInitNormal(mean, var) + +cdef class UniformInitializer(PyInitializer): + def __init__(self, float scale): + self.initializer = new CParameterInitUniform(scale) + +cdef class ConstInitializer(PyInitializer): + def __init__(self, float c): + self.initializer = new CParameterInitConst(c) + +cdef class GlorotInitializer(PyInitializer): + def __init__(self, bool is_lookup=False): + self.initializer = new CParameterInitGlorot(is_lookup) + +#cdef class SaxeInitializer(PyInitializer): +# def __init__(self): +# self.initializer = new CParameterInitSaxe() + +cdef class FromFileInitializer(PyInitializer): + def __init__(self, string fname): + self.initializer = new CParameterInitFromFile(fname) + +cdef class NumpyInitializer(PyInitializer): + def __init__(self, array): + self.initializer = new CParameterInitFromVector(self.vec_from_array(array)) + + cdef vector[float] vec_from_array(self, arr): # TODO make efficient + cdef vector[float] vals + shape = arr.shape + arr = arr.flatten(order='F') + for i in xrange(arr.size): + vals.push_back(arr[i]) + return vals + + cdef class Model: # {{{ cdef CModel *thisptr def __cinit__(self): @@ -206,11 +253,21 @@ cdef class Model: # {{{ # TODO: for debug, remove cpdef pl(self): return self.thisptr.parameters_list().size() - cpdef add_parameters(self, dim, scale=0): + cpdef parameters_from_numpy(self, array): + dim = array.shape + cdef CParameters p = self.thisptr.add_parameters(Dim(dim), deref(NumpyInitializer(array).initializer)) + cdef Parameters pp = Parameters.wrap_ptr(p) + return pp + + cpdef add_parameters(self, dim, PyInitializer init=None): assert(isinstance(dim,(tuple,int))) - cdef CParameters p = self.thisptr.add_parameters(Dim(dim)) + cdef CParameters p + cdef CParameterInit *initializer + if init is None: + init = GlorotInitializer() + initializer = init.initializer + p = self.thisptr.add_parameters(Dim(dim), deref(initializer)) cdef Parameters pp = Parameters.wrap_ptr(p) - #self.regular.append(pp) # TODO do we even need regular? return pp cpdef add_lookup_parameters(self, dim): From 2aebda0351958a00c2ed9355d0d9d47f291f3d89 Mon Sep 17 00:00:00 2001 From: Jan Niehues Date: Mon, 24 Oct 2016 14:47:17 +0200 Subject: [PATCH 771/965] GRU dropout --- dynet/gru.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/dynet/gru.cc b/dynet/gru.cc index 1fe8074ad..0a0c8ec4b 100644 --- a/dynet/gru.cc +++ b/dynet/gru.cc @@ -87,8 +87,8 @@ Expression GRUBuilder::set_h_impl(int prev, const vector& h_new) { } Expression GRUBuilder::add_input_impl(int prev, const Expression& x) { - if(dropout_rate != 0.f) - throw std::runtime_error("GRUBuilder doesn't support dropout yet"); + //if(dropout_rate != 0.f) + //throw std::runtime_error("GRUBuilder doesn't support dropout yet"); const bool has_initial_state = (h0.size() > 0); h.push_back(vector(layers)); vector& ht = h.back(); @@ -101,6 +101,7 @@ Expression GRUBuilder::add_input_impl(int prev, const Expression& x) { if (prev >= 0 || has_initial_state) { h_tprev = (prev < 0) ? h0[i] : h[prev][i]; } else { prev_zero = true; } + if (dropout_rate) in = dropout(in, dropout_rate); // update gate Expression zt; if (prev_zero) @@ -134,7 +135,8 @@ Expression GRUBuilder::add_input_impl(int prev, const Expression& x) { in = ht[i] = crt + nwt; } } - return ht.back(); + if (dropout_rate) return dropout(ht.back(), dropout_rate); + else return ht.back(); } void GRUBuilder::copy(const RNNBuilder & rnn) { From 441f0f32749b197717b64e6d991044b8aca02ea2 Mon Sep 17 00:00:00 2001 From: Jan Niehues Date: Mon, 24 Oct 2016 14:56:29 +0200 Subject: [PATCH 772/965] Remove reset hidden --- dynet/gru.cc | 5 ----- dynet/gru.h | 1 - dynet/rnn.cc | 5 ----- dynet/rnn.h | 3 --- 4 files changed, 14 deletions(-) diff --git a/dynet/gru.cc b/dynet/gru.cc index 0a0c8ec4b..85d944bdf 100644 --- a/dynet/gru.cc +++ b/dynet/gru.cc @@ -147,9 +147,4 @@ void GRUBuilder::copy(const RNNBuilder & rnn) { params[i][j] = rnn_gru.params[i][j]; } - void GRUBuilder::init_parameters(int layer,int index, const std::vector& vec) { - TensorTools::SetElements(params[layer][index].get()->values,vec); - - } - } // namespace dynet diff --git a/dynet/gru.h b/dynet/gru.h index fa0ff74f7..79cf22a9d 100644 --- a/dynet/gru.h +++ b/dynet/gru.h @@ -22,7 +22,6 @@ struct GRUBuilder : public RNNBuilder { unsigned num_h0_components() const override { return layers; } void copy(const RNNBuilder & params) override; - void init_parameters(int layer,int index, const std::vector& vec); protected: void new_graph_impl(ComputationGraph& cg) override; diff --git a/dynet/rnn.cc b/dynet/rnn.cc index 1b79b999d..ff70f6c23 100644 --- a/dynet/rnn.cc +++ b/dynet/rnn.cc @@ -42,11 +42,6 @@ void RNNBuilder::serialize(Archive& ar, const unsigned int) { ar & sm; } -void RNNBuilder::init_parameters(int layer,int index, const std::vector& vec) { - cerr << "RNNBuilder::init_parameters not overridden.\n"; - abort(); -} - DYNET_SERIALIZE_IMPL(RNNBuilder) SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, diff --git a/dynet/rnn.h b/dynet/rnn.h index 358b64813..e49322bdb 100644 --- a/dynet/rnn.h +++ b/dynet/rnn.h @@ -105,9 +105,6 @@ struct RNNBuilder { virtual void load_parameters_pretraining(const std::string& fname); - //init parameters from float array - virtual void init_parameters(int layer,int index, const std::vector& vec); - protected: virtual void new_graph_impl(ComputationGraph& cg) = 0; virtual void start_new_sequence_impl(const std::vector& h_0) = 0; From f916a56d6b2988ff56ca8c55b5880f9596f7a807 Mon Sep 17 00:00:00 2001 From: Austin Matthews Date: Mon, 24 Oct 2016 12:29:50 -0400 Subject: [PATCH 773/965] Added random_noise node --- dynet/expr.cc | 1 + dynet/expr.h | 1 + dynet/nodes-common.cc | 10 ++++++++++ dynet/nodes.cc | 17 +++++++++++++++++ dynet/nodes.h | 7 +++++++ 5 files changed, 36 insertions(+) diff --git a/dynet/expr.cc b/dynet/expr.cc index 984d87f41..f3685ea49 100644 --- a/dynet/expr.cc +++ b/dynet/expr.cc @@ -25,6 +25,7 @@ Expression const_lookup(ComputationGraph& g, LookupParameter p, const unsigned* Expression const_lookup(ComputationGraph& g, LookupParameter p, const vector& indices) { return Expression(&g, g.add_const_lookup(p, indices)); } Expression const_lookup(ComputationGraph& g, LookupParameter p, const vector* pindices) { return Expression(&g, g.add_const_lookup(p, pindices)); } Expression zeroes(ComputationGraph& g, const Dim& d) { return Expression(&g, g.add_function(d)); } +Expression random_normal(ComputationGraph& g, const Dim& d) { return Expression(&g, g.add_function(d)); } // identity function, but derivative is not propagated through it Expression nobackprop(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/dynet/expr.h b/dynet/expr.h index b7377f372..8a155d5c8 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -62,6 +62,7 @@ Expression lookup(ComputationGraph& g, LookupParameter p, const std::vector& indices); Expression const_lookup(ComputationGraph& g, LookupParameter p, const std::vector* pindices); Expression zeroes(ComputationGraph& g, const Dim& d); +Expression random_normal(ComputationGraph& g, const Dim& d); // special functions for controlling flow of information in graph Expression nobackprop(const Expression& x); diff --git a/dynet/nodes-common.cc b/dynet/nodes-common.cc index 7b0b0479b..ea7b266df 100644 --- a/dynet/nodes-common.cc +++ b/dynet/nodes-common.cc @@ -901,4 +901,14 @@ Dim Zeroes::dim_forward(const vector& xs) const { return dim; } +string RandomNormal::as_string(const vector& arg_names) const { + ostringstream s; + s << "random_normal(" << dim << ')'; + return s.str(); +} + +Dim RandomNormal::dim_forward(const vector& xs) const { + return dim; +} + } // namespace dynet diff --git a/dynet/nodes.cc b/dynet/nodes.cc index db946efea..8eca7ef58 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -2051,4 +2051,21 @@ void Zeroes::backward_dev_impl(const MyDevice & dev, } DYNET_NODE_INST_DEV_IMPL(Zeroes) +template +void RandomNormal::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 0); + TensorTools::RandomizeNormal(fx); +} + +template +void RandomNormal::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + throw std::runtime_error("Called backward() on an arity 0 node"); +} +DYNET_NODE_INST_DEV_IMPL(RandomNormal) + } // namespace dynet diff --git a/dynet/nodes.h b/dynet/nodes.h index 2330bfc38..389374891 100644 --- a/dynet/nodes.h +++ b/dynet/nodes.h @@ -524,6 +524,13 @@ struct Zeroes : public Node { Dim dim; }; +// draw random noise from Normal(0, 1) +struct RandomNormal : public Node { + explicit RandomNormal(const Dim& d) : dim(d) {} + DYNET_NODE_DEFINE_DEV_IMPL() + Dim dim; +}; + } // namespace dynet #endif From e08c799bb997dabc18d8529dbba75a572f880bf1 Mon Sep 17 00:00:00 2001 From: swabhs Date: Mon, 24 Oct 2016 10:07:19 -0700 Subject: [PATCH 774/965] Update CMakeLists.txt --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 79a4d54b3..e96873fd5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,6 +93,7 @@ endfunction() # look for Boost if(DEFINED ENV{BOOST_ROOT}) +else() set(Boost_NO_SYSTEM_PATHS ON) get_filename_component(Boost_INCLUDE_DIR "${Boost_INCLUDE_DIR}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") endif() From 63168f689d35df20c842f45026d92f8887d9eff7 Mon Sep 17 00:00:00 2001 From: swabhs Date: Mon, 24 Oct 2016 11:07:14 -0700 Subject: [PATCH 775/965] Update CMakeLists.txt --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e96873fd5..79a4d54b3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,7 +93,6 @@ endfunction() # look for Boost if(DEFINED ENV{BOOST_ROOT}) -else() set(Boost_NO_SYSTEM_PATHS ON) get_filename_component(Boost_INCLUDE_DIR "${Boost_INCLUDE_DIR}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") endif() From 165aa1e22bff33afeeda36661facbaa4704546c2 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Mon, 24 Oct 2016 16:36:13 -0700 Subject: [PATCH 776/965] Got python working for Windows. --- doc/source/python.rst | 19 +++++++++++++++++++ python/setup.py.in | 19 ++++++++++++++----- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/doc/source/python.rst b/doc/source/python.rst index f8caee3a4..5a1940bb9 100644 --- a/doc/source/python.rst +++ b/doc/source/python.rst @@ -151,6 +151,25 @@ installation is likely to be working: from dynet import * model = Model() +Windows Support +------------------ +You can also use Python on Windows by following similar steps to the above. For simplicity, we recommend +using a Python distribution that already has Cython installed. The following has been tested to work: + +1) Install WinPython 2.7.10 (comes with Cython already installed). +2) Run CMake as above with ``-DPYTHON=/path/to/your/python.exe``. +3) Open a command prompt and set ``VS90COMNTOOLS`` to the path to your Visual Studio "Common7/Tools" directory. One easy way to do this is a command such as: + +:: + + set VS90COMNTOOLS=%VS140COMNTOOLS% + +4) Open dynet.sln from this command prompt and build the "Release" version of the solution. +5) Follow the rest of the instructions above for testing the build and installing it for other users + +Note, currently only the Release version works. + + GPU/MKL Support --------------- diff --git a/python/setup.py.in b/python/setup.py.in index f0abc3656..236eb22da 100644 --- a/python/setup.py.in +++ b/python/setup.py.in @@ -9,7 +9,16 @@ cfg_vars = distutils.sysconfig.get_config_vars() if "CFLAGS" in cfg_vars: cfg_vars["CFLAGS"] = cfg_vars["CFLAGS"].replace("-Wstrict-prototypes", "") -COMPILER_ARGS=["-std=c++11"] +if ${MSVC}: + COMPILER_ARGS=["-DNOMINMAX", "/EHsc"] + DYNET_LIB_DIR="${PROJECT_BINARY_DIR}/dynet/Release/" + RUNTIME_LIB_DIRS=[] +else: + COMPILER_ARGS=["-std=c++11"] + DYNET_LIB_DIR="${PROJECT_BINARY_DIR}/dynet/" + RUNTIME_LIB_DIRS=[DYNET_LIB_DIR] + + import platform # in some OSX systems, the following extra flags are needed: @@ -25,10 +34,10 @@ ext_cpu = Extension( "${EIGEN3_INCLUDE_DIR}", # this is the directory where eigen is saved. "${Boost_INCLUDE_DIR}"], # this is the directory where boost is. libraries=['dynet'], # ditto - library_dirs=[".","${PROJECT_BINARY_DIR}/dynet/"], + library_dirs=[".",DYNET_LIB_DIR, "${Boost_LIBRARY_DIRS}"], #extra_link_args=["-L/home/yogo/Vork/Research/dynet/dynet/build/dynet"], # if needed extra_compile_args=COMPILER_ARGS, - runtime_library_dirs=["${PROJECT_BINARY_DIR}/dynet/"], + runtime_library_dirs=RUNTIME_LIB_DIRS, ) ext_gpu = Extension( @@ -39,10 +48,10 @@ ext_gpu = Extension( "${EIGEN3_INCLUDE_DIR}", # this is the directory where eigen is saved. "${Boost_INCLUDE_DIR}"], # this is the directory where boost is. libraries=['gdynet','dynetcuda','cublas'], # ditto - library_dirs=[".","${PROJECT_BINARY_DIR}/dynet/","${CUDA_CUBLAS_LIB}"], + library_dirs=[".",DYNET_LIB_DIR,"${Boost_LIBRARY_DIRS}","${CUDA_CUBLAS_LIB}"], #extra_link_args=["-L/home/yogo/Vork/Research/dynet/dynet/build/dynet"], # if needed extra_compile_args=COMPILER_ARGS, - runtime_library_dirs=["${PROJECT_BINARY_DIR}/dynet/"], + #runtime_library_dirs=RUNTIME_LIB_DIRS, ) TARGET = [ext_cpu] From 137fc979ac13cc6fc288684058e5a51f7a2ea30b Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Mon, 24 Oct 2016 16:36:42 -0700 Subject: [PATCH 777/965] Removing unneeded pyc file --- pyexamples/util.pyc | Bin 2607 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 pyexamples/util.pyc diff --git a/pyexamples/util.pyc b/pyexamples/util.pyc deleted file mode 100644 index 450ea3918ff7edb7e04940a8f82d2f75ea62bab9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2607 zcmb_dT~8!M6us3wJ2335;3BN3>+U8#%tmF*CcbTm0&gb7G|3W)*crMDXy}h&swRMe z2ebPR{1yH_-_>(&&rBQj1#mKTyXtmz)j9W`x)uKZXyKRN{@6=o@(c0&2F)G7r1%@j zMG7PPMhwS+Kn54oW|8jN$FW{Izz58zCyap^sKZ>nT)ID;C%vx(-ufU!b^1SIkfXhX38 zV{}gpfg)gkzb(;juZ0g1e$Gb5TWIckm}{&dayBoc&%_(?0oQnICg9rFf&3cCc^ltj ziqwXm0*}c0S3o9mp*Cw~xX%%LzfcdW(>!d1%8*>;ruHTW~JRYD4=v8SWJSEZ`(N)?@ukZM!C#s8AneX74c{@TY zoO-iY7di0R6QX3=OmsS&m`k67@q9F3|Xt~X#L>Tm=r=8<`3RBTKcVQDy) z(Lp#Mwo^zIoN#1Gi<5R#rV2c_WrOz2UOAl*busH6a5Y`o&vp^ZI5h0YpiNR*4hkE` zo^p)iqDsd(h7rRTu|{ZRNb-Smh4m*@8a?Kl6_^H*_HKIsG-njB<6dpkZ7t4uGTo}P zW(TPqB^c|Ef!aiKAHht@4QdT)iWUiWLKYWBd{$g$;U^KEY*5s?It{!YE6V1GQP7Vy z*b#SW_}!Ws_hX#&L`$s)f>Ctze+_fF-beys*gkm58U&cNK3Mc*;(24vmt-$xNvjpZ zl&X@CvfL_KEz!=8vSHmD=9zB@>D)Xk?cGUDD*(z&9DhI(%$t~1^Ejx_ Date: Mon, 24 Oct 2016 17:12:52 -0700 Subject: [PATCH 778/965] Fixing python build for Linux. Adding pyc to gitignore so they aren't checked in accidentally in the future. --- .gitignore | 3 +++ python/setup.py.in | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index eb39fc4fc..e382eba34 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,9 @@ examples/nlm #data rnnlm/ptb-mikolov/ +# Python temporary files +*.pyc + # Compiled Object files *.slo *.lo diff --git a/python/setup.py.in b/python/setup.py.in index 236eb22da..ba51d6262 100644 --- a/python/setup.py.in +++ b/python/setup.py.in @@ -9,7 +9,7 @@ cfg_vars = distutils.sysconfig.get_config_vars() if "CFLAGS" in cfg_vars: cfg_vars["CFLAGS"] = cfg_vars["CFLAGS"].replace("-Wstrict-prototypes", "") -if ${MSVC}: +if "${MSVC}"=="1": COMPILER_ARGS=["-DNOMINMAX", "/EHsc"] DYNET_LIB_DIR="${PROJECT_BINARY_DIR}/dynet/Release/" RUNTIME_LIB_DIRS=[] From 507ac19a6d36f8b10264a74e6a45d8fdd606dd77 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Tue, 25 Oct 2016 11:53:11 -0700 Subject: [PATCH 779/965] Windows python build now working with MKL. --- CMakeLists.txt | 1 + python/setup.py.in | 26 ++++++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 79a4d54b3..6ea603853 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,7 @@ function(find_mkl) endif() include_directories(${MKL_INCLUDE_DIR}) link_directories(${MKL_CORE_LIB_DIR} ${MKL_COMPILER_LIB_DIR}) + set(MKL_LINK_DIRS ${MKL_CORE_LIB_DIR} ${MKL_COMPILER_LIB_DIR} PARENT_SCOPE) # Keeping this for python build else() message(FATAL_ERROR "Failed to find MKL in path: ${MKL_ROOT} (Did you set MKL_ROOT properly?)") endif() diff --git a/python/setup.py.in b/python/setup.py.in index ba51d6262..7ccc60891 100644 --- a/python/setup.py.in +++ b/python/setup.py.in @@ -2,6 +2,10 @@ from setuptools import setup from setuptools.extension import Extension from Cython.Distutils import build_ext +def appendCMakeList(list, var): + if var != "": + list.extend(var.split(';')) + # Remove the "-Wstrict-prototypes" compiler option, which isn't valid for C++. import distutils.sysconfig @@ -9,15 +13,29 @@ cfg_vars = distutils.sysconfig.get_config_vars() if "CFLAGS" in cfg_vars: cfg_vars["CFLAGS"] = cfg_vars["CFLAGS"].replace("-Wstrict-prototypes", "") + +LIBRARIES=['dynet'] +LIBRARY_DIRS=["."] + if "${MSVC}"=="1": COMPILER_ARGS=["-DNOMINMAX", "/EHsc"] DYNET_LIB_DIR="${PROJECT_BINARY_DIR}/dynet/Release/" RUNTIME_LIB_DIRS=[] + # For MSVC, we compile dynet as a static lib, so we need to also link in the + # other libraries it depends on: + appendCMakeList(LIBRARIES, '${LIBS}'.replace('.lib', '')) # Remove .lib extension from compiler lib + appendCMakeList(LIBRARY_DIRS, '${MKL_LINK_DIRS}') # Add the MKL dirs, if MKL is being used + # Boost does auto-linking in MSVC, just point to the right directory: + appendCMakeList(LIBRARY_DIRS, '${Boost_LIBRARY_DIRS}') else: COMPILER_ARGS=["-std=c++11"] DYNET_LIB_DIR="${PROJECT_BINARY_DIR}/dynet/" RUNTIME_LIB_DIRS=[DYNET_LIB_DIR] +LIBRARY_DIRS.append(DYNET_LIB_DIR) +GPULIBRARIES=['gdynet','dynetcuda','cublas'] +GPULIBRARY_DIRS=list(LIBRARY_DIRS) # make a copy +GPULIBRARY_DIRS.append("${CUDA_CUBLAS_LIB}") import platform @@ -33,8 +51,8 @@ ext_cpu = Extension( include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main dynet directory. "${EIGEN3_INCLUDE_DIR}", # this is the directory where eigen is saved. "${Boost_INCLUDE_DIR}"], # this is the directory where boost is. - libraries=['dynet'], # ditto - library_dirs=[".",DYNET_LIB_DIR, "${Boost_LIBRARY_DIRS}"], + libraries=LIBRARIES, # ditto + library_dirs=LIBRARY_DIRS, #extra_link_args=["-L/home/yogo/Vork/Research/dynet/dynet/build/dynet"], # if needed extra_compile_args=COMPILER_ARGS, runtime_library_dirs=RUNTIME_LIB_DIRS, @@ -47,8 +65,8 @@ ext_gpu = Extension( include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main dynet directory. "${EIGEN3_INCLUDE_DIR}", # this is the directory where eigen is saved. "${Boost_INCLUDE_DIR}"], # this is the directory where boost is. - libraries=['gdynet','dynetcuda','cublas'], # ditto - library_dirs=[".",DYNET_LIB_DIR,"${Boost_LIBRARY_DIRS}","${CUDA_CUBLAS_LIB}"], + libraries=GPULIBRARIES, # ditto + library_dirs=GPULIBRARY_DIRS, #extra_link_args=["-L/home/yogo/Vork/Research/dynet/dynet/build/dynet"], # if needed extra_compile_args=COMPILER_ARGS, #runtime_library_dirs=RUNTIME_LIB_DIRS, From a7cbe8beebda7f955995c3982135688107e2b945 Mon Sep 17 00:00:00 2001 From: paul Date: Tue, 25 Oct 2016 17:06:27 -0400 Subject: [PATCH 780/965] Added set_s method for rnns --- dynet/fast-lstm.cc | 12 ++++++++++ dynet/fast-lstm.h | 1 + dynet/gru.cc | 19 +++++++++++++--- dynet/gru.h | 2 ++ dynet/lstm.cc | 57 +++++++++++++++++++++++++++------------------- dynet/lstm.h | 2 +- dynet/rnn.h | 43 +++++++++++++++++++++------------- 7 files changed, 93 insertions(+), 43 deletions(-) diff --git a/dynet/fast-lstm.cc b/dynet/fast-lstm.cc index abc55e4a4..4d53ad6f7 100644 --- a/dynet/fast-lstm.cc +++ b/dynet/fast-lstm.cc @@ -105,6 +105,18 @@ Expression FastLSTMBuilder::set_h_impl(int prev, const vector& h_new return h[t].back(); } +Expression FastLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { + if (s_new.size()) { assert(s_new.size() == layers); } + const unsigned t = h.size(); + h.push_back(vector(layers)); + for (unsigned i = 0; i < layers; ++i) { + Expression y = s_new[i]; + h[t][i + layers] = y; + } + return h[t].back(); +} + + Expression FastLSTMBuilder::add_input_impl(int prev, const Expression& x) { h.push_back(vector(layers)); c.push_back(vector(layers)); diff --git a/dynet/fast-lstm.h b/dynet/fast-lstm.h index 891b46021..16733a9e9 100644 --- a/dynet/fast-lstm.h +++ b/dynet/fast-lstm.h @@ -43,6 +43,7 @@ struct FastLSTMBuilder : public RNNBuilder { void start_new_sequence_impl(const std::vector& h0) override; Expression add_input_impl(int prev, const Expression& x) override; Expression set_h_impl(int prev, const std::vector& h_new) override; + Expression set_s_impl(int prev, const std::vector& s_new) override; public: // first index is layer, then ... diff --git a/dynet/gru.cc b/dynet/gru.cc index 6f4ded7ca..c86a3f574 100644 --- a/dynet/gru.cc +++ b/dynet/gru.cc @@ -86,9 +86,20 @@ Expression GRUBuilder::set_h_impl(int prev, const vector& h_new) { return h[t].back(); } +Expression GRUBuilder::set_s_impl(int prev, const std::vector& s_new) { + if (s_new.size()) { assert(s_new.size() == layers); } + const unsigned t = h.size(); + h.push_back(vector(layers)); + for (unsigned i = 0; i < layers; ++i) { + Expression y = s_new[i]; + h[t][i + layers] = y; + } + return h[t].back(); +} + Expression GRUBuilder::add_input_impl(int prev, const Expression& x) { - if(dropout_rate != 0.f) - throw std::runtime_error("GRUBuilder doesn't support dropout yet"); + //if(dropout_rate != 0.f) + //throw std::runtime_error("GRUBuilder doesn't support dropout yet"); const bool has_initial_state = (h0.size() > 0); h.push_back(vector(layers)); vector& ht = h.back(); @@ -101,6 +112,7 @@ Expression GRUBuilder::add_input_impl(int prev, const Expression& x) { if (prev >= 0 || has_initial_state) { h_tprev = (prev < 0) ? h0[i] : h[prev][i]; } else { prev_zero = true; } + if (dropout_rate) in = dropout(in, dropout_rate); // update gate Expression zt; if (prev_zero) @@ -134,7 +146,8 @@ Expression GRUBuilder::add_input_impl(int prev, const Expression& x) { in = ht[i] = crt + nwt; } } - return ht.back(); + if (dropout_rate) return dropout(ht.back(), dropout_rate); + else return ht.back(); } void GRUBuilder::copy(const RNNBuilder & rnn) { diff --git a/dynet/gru.h b/dynet/gru.h index 3d3e15012..8d907454a 100644 --- a/dynet/gru.h +++ b/dynet/gru.h @@ -22,11 +22,13 @@ struct GRUBuilder : public RNNBuilder { unsigned num_h0_components() const override { return layers; } void copy(const RNNBuilder & params) override; + protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; Expression add_input_impl(int prev, const Expression& x) override; Expression set_h_impl(int prev, const std::vector& h_new) override; + Expression set_s_impl(int prev, const std::vector& s_new) override; // first index is layer, then ... std::vector> params; diff --git a/dynet/lstm.cc b/dynet/lstm.cc index a64ce8231..7b131db76 100644 --- a/dynet/lstm.cc +++ b/dynet/lstm.cc @@ -48,29 +48,29 @@ LSTMBuilder::LSTMBuilder(unsigned layers, vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; params.push_back(ps); } // layers - dropout_rate = 0.f; + dropout_rate = 0.f; } -void LSTMBuilder::new_graph_impl(ComputationGraph& cg){ +void LSTMBuilder::new_graph_impl(ComputationGraph& cg) { param_vars.clear(); - for (unsigned i = 0; i < layers; ++i){ + for (unsigned i = 0; i < layers; ++i) { auto& p = params[i]; //i - Expression i_x2i = parameter(cg,p[X2I]); - Expression i_h2i = parameter(cg,p[H2I]); - Expression i_c2i = parameter(cg,p[C2I]); - Expression i_bi = parameter(cg,p[BI]); + Expression i_x2i = parameter(cg, p[X2I]); + Expression i_h2i = parameter(cg, p[H2I]); + Expression i_c2i = parameter(cg, p[C2I]); + Expression i_bi = parameter(cg, p[BI]); //o - Expression i_x2o = parameter(cg,p[X2O]); - Expression i_h2o = parameter(cg,p[H2O]); - Expression i_c2o = parameter(cg,p[C2O]); - Expression i_bo = parameter(cg,p[BO]); + Expression i_x2o = parameter(cg, p[X2O]); + Expression i_h2o = parameter(cg, p[H2O]); + Expression i_c2o = parameter(cg, p[C2O]); + Expression i_bo = parameter(cg, p[BO]); //c - Expression i_x2c = parameter(cg,p[X2C]); - Expression i_h2c = parameter(cg,p[H2C]); - Expression i_bc = parameter(cg,p[BC]); + Expression i_x2c = parameter(cg, p[X2C]); + Expression i_h2c = parameter(cg, p[H2C]); + Expression i_bc = parameter(cg, p[BC]); vector vars = {i_x2i, i_h2i, i_c2i, i_bi, i_x2o, i_h2o, i_c2o, i_bo, i_x2c, i_h2c, i_bc}; param_vars.push_back(vars); @@ -83,7 +83,7 @@ void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { h.clear(); c.clear(); if (hinit.size() > 0) { - assert(layers*2 == hinit.size()); + assert(layers * 2 == hinit.size()); h0.resize(layers); c0.resize(layers); for (unsigned i = 0; i < layers; ++i) { @@ -108,6 +108,17 @@ Expression LSTMBuilder::set_h_impl(int prev, const vector& h_new) { return h[t].back(); } +Expression LSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { + if (s_new.size()) { assert(s_new.size() == layers); } + const unsigned t = h.size(); + h.push_back(vector(layers)); + for (unsigned i = 0; i < layers; ++i) { + Expression y = s_new[i]; + h[t][i + layers] = y; + } + return h[t].back(); +} + Expression LSTMBuilder::add_input_impl(int prev, const Expression& x) { h.push_back(vector(layers)); c.push_back(vector(layers)); @@ -149,11 +160,11 @@ Expression LSTMBuilder::add_input_impl(int prev, const Expression& x) { Expression i_wt = tanh(i_awt); // output if (has_prev_state) { - Expression i_nwt = cwise_multiply(i_it,i_wt); - Expression i_crt = cwise_multiply(i_ft,i_c_tm1); + Expression i_nwt = cwise_multiply(i_it, i_wt); + Expression i_crt = cwise_multiply(i_ft, i_c_tm1); ct[i] = i_crt + i_nwt; } else { - ct[i] = cwise_multiply(i_it,i_wt); + ct[i] = cwise_multiply(i_it, i_wt); } Expression i_aot; @@ -163,18 +174,18 @@ Expression LSTMBuilder::add_input_impl(int prev, const Expression& x) { i_aot = affine_transform({vars[BO], vars[X2O], in, vars[C2O], ct[i]}); Expression i_ot = logistic(i_aot); Expression ph_t = tanh(ct[i]); - in = ht[i] = cwise_multiply(i_ot,ph_t); + in = ht[i] = cwise_multiply(i_ot, ph_t); } if (dropout_rate) return dropout(ht.back(), dropout_rate); - else return ht.back(); + else return ht.back(); } void LSTMBuilder::copy(const RNNBuilder & rnn) { const LSTMBuilder & rnn_lstm = (const LSTMBuilder&)rnn; assert(params.size() == rnn_lstm.params.size()); - for(size_t i = 0; i < params.size(); ++i) - for(size_t j = 0; j < params[i].size(); ++j) - params[i][j] = rnn_lstm.params[i][j]; + for (size_t i = 0; i < params.size(); ++i) + for (size_t j = 0; j < params[i].size(); ++j) + params[i][j] = rnn_lstm.params[i][j]; } void LSTMBuilder::save_parameters_pretraining(const string& fname) const { diff --git a/dynet/lstm.h b/dynet/lstm.h index 64a9c647c..ce92e153b 100644 --- a/dynet/lstm.h +++ b/dynet/lstm.h @@ -43,7 +43,7 @@ struct LSTMBuilder : public RNNBuilder { void start_new_sequence_impl(const std::vector& h0) override; Expression add_input_impl(int prev, const Expression& x) override; Expression set_h_impl(int prev, const std::vector& h_new) override; - + Expression set_s_impl(int prev, const std::vector& s_new) override; public: // first index is layer, then ... std::vector> params; diff --git a/dynet/rnn.h b/dynet/rnn.h index 2cfe31352..09d11c3f6 100644 --- a/dynet/rnn.h +++ b/dynet/rnn.h @@ -36,7 +36,7 @@ struct RNNBuilder { // call this before add_input and after new_graph, // when starting a new sequence on the same hypergraph. // h_0 is used to initialize hidden layers at timestep 0 to given values - void start_new_sequence(const std::vector& h_0={}) { + void start_new_sequence(const std::vector& h_0 = {}) { sm.transition(RNNOp::start_new_sequence); cur = RNNPointer(-1); head.clear(); @@ -44,13 +44,21 @@ struct RNNBuilder { } // explicitly set the output state of a node - Expression set_h(const RNNPointer& prev, const std::vector& h_new={}) { + Expression set_h(const RNNPointer& prev, const std::vector& h_new = {}) { sm.transition(RNNOp::add_input); head.push_back(prev); cur = head.size() - 1; return set_h_impl(prev, h_new); } + // Set the internal state of a node (for lstms/grus) + Expression set_s(const RNNPointer& prev, const std::vector& s_new = {}) { + sm.transition(RNNOp::add_input); + head.push_back(prev); + cur = head.size() - 1; + return set_s_impl(prev, s_new); + } + // add another timestep by reading in the variable x // return the hidden representation of the deepest layer Expression add_input(const Expression& x) { @@ -104,14 +112,16 @@ struct RNNBuilder { virtual void save_parameters_pretraining(const std::string& fname) const; virtual void load_parameters_pretraining(const std::string& fname); - protected: + +protected: virtual void new_graph_impl(ComputationGraph& cg) = 0; virtual void start_new_sequence_impl(const std::vector& h_0) = 0; virtual Expression add_input_impl(int prev, const Expression& x) = 0; virtual Expression set_h_impl(int prev, const std::vector& h_new) = 0; + virtual Expression set_s_impl(int prev, const std::vector& c_new) = 0; RNNPointer cur; - float dropout_rate; - private: + float dropout_rate; +private: // the state machine ensures that the caller is behaving RNNStateMachine sm; std::vector head; // head[i] returns the head position @@ -127,15 +137,16 @@ struct SimpleRNNBuilder : public RNNBuilder { unsigned input_dim, unsigned hidden_dim, Model* model, - bool support_lags=false); + bool support_lags = false); - protected: +protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h_0) override; Expression add_input_impl(int prev, const Expression& x) override; Expression set_h_impl(int prev, const std::vector& h_new) override; + Expression set_s_impl(int prev, const std::vector& s_new) {return set_h_impl(prev, s_new);} - public: +public: Expression add_auxiliary_input(const Expression& x, const Expression &aux); Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } @@ -151,7 +162,7 @@ struct SimpleRNNBuilder : public RNNBuilder { void save_parameters_pretraining(const std::string& fname) const override; void load_parameters_pretraining(const std::string& fname) override; - private: +private: // first index is layer, then x2h h2h hb std::vector> params; @@ -178,13 +189,13 @@ struct SimpleRNNBuilder : public RNNBuilder { namespace boost { - namespace serialization { - template - void serialize(Archive& ar, dynet::RNNPointer& p, const unsigned int version) - { - ar & p.t; - } - } // namespace serialization +namespace serialization { +template +void serialize(Archive& ar, dynet::RNNPointer& p, const unsigned int version) +{ + ar & p.t; +} +} // namespace serialization } // namespace boost BOOST_CLASS_EXPORT_KEY(dynet::RNNBuilder) From 729bdafc5f028e126c6c126e9fef80a5e0dc3708 Mon Sep 17 00:00:00 2001 From: paul Date: Tue, 25 Oct 2016 17:15:18 -0400 Subject: [PATCH 781/965] python bindings for set_s --- python/dynet.pxd | 1 + python/dynet.pyx | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/python/dynet.pxd b/python/dynet.pxd index bbb9b2d7c..06c44f2e3 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -247,6 +247,7 @@ cdef extern from "dynet/rnn.h" namespace "dynet": CExpression add_input(CExpression &x) CExpression add_input(CRNNPointer prev, CExpression &x) CExpression set_h(CRNNPointer prev, vector[CExpression] ces) + CExpression set_s(CRNNPointer prev, vector[CExpression] ces) void rewind_one_step() CExpression back() vector[CExpression] final_h() diff --git a/python/dynet.pyx b/python/dynet.pyx index 13699347c..837b61781 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -931,6 +931,16 @@ cdef class _RNNBuilder: # {{{ ces.push_back(e.c()) return Expression.from_cexpr(self.cg_version, self.thisptr.set_h(prev, ces)) + cdef set_s(self, CRNNPointer prev, es=None): + if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") + cdef vector[CExpression] ces = vector[CExpression]() + cdef Expression e + if es: + for e in es: + ensure_freshness(e) + ces.push_back(e.c()) + return Expression.from_cexpr(self.cg_version, self.thisptr.set_s(prev, ces)) + cdef rewind_one_step(self): if self.cg_version != _cg.version(): raise ValueError("Using stale builder. Create .new_graph() after computation graph is renewed.") self.thisptr.rewind_one_step() @@ -1158,6 +1168,11 @@ cdef class RNNState: # {{{ cdef int state_idx = self.builder.thisptr.state() return RNNState(self.builder, state_idx, self, res) + cpdef RNNState set_s(self, es=None): + cdef Expression res = self.builder.set_s(CRNNPointer(self.state_idx), es) + cdef int state_idx = self.builder.thisptr.state() + return RNNState(self.builder, state_idx, self, res) + cpdef RNNState add_input(self, Expression x): cdef Expression res = self.builder.add_input_to_prev(CRNNPointer(self.state_idx), x) cdef int state_idx = self.builder.thisptr.state() From 3920a6684d0e1cc07576dc83da0f8de4aa197941 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Tue, 25 Oct 2016 18:35:41 -0700 Subject: [PATCH 782/965] Got Python with GPU working for Windows --- python/CMakeLists.txt | 16 ++++++++++++++-- python/setup.py.in | 28 ++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 27c18e663..e37fc1e2c 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -1,4 +1,12 @@ +function(get_filename_components DEST ITEMS PART) + foreach(ITEM ${ITEMS}) + get_filename_component(ITEMPART "${ITEM}" ${PART}) + list(APPEND ${DEST} ${ITEMPART}) + endforeach() + list(REMOVE_DUPLICATES ${DEST}) + set(${DEST} ${${DEST}} PARENT_SCOPE) +endfunction() if(!PYTHON) find_program(PYTHON "python") @@ -14,8 +22,12 @@ if(PYTHON) ) if (WITH_CUDA_BACKEND) - message("--- CUDA:" ${CUDA_CUBLAS_LIBRARIES}) - get_filename_component(CUDA_CUBLAS_LIB ${CUDA_CUBLAS_LIBRARIES} PATH) + message("--- CUDA: CUBLAS: ${CUDA_CUBLAS_LIBRARIES} RT: ${CUDA_LIBRARIES}") + # Collect all of the library filenames and paths for setup.py + get_filename_components(CUDA_CUBLAS_DIRS "${CUDA_CUBLAS_LIBRARIES}" PATH) + get_filename_components(CUDA_CUBLAS_FILES "${CUDA_CUBLAS_LIBRARIES}" NAME) + get_filename_components(CUDA_RT_DIRS "${CUDA_LIBRARIES}" PATH) + get_filename_components(CUDA_RT_FILES "${CUDA_LIBRARIES}" NAME) endif() add_custom_target(copy) diff --git a/python/setup.py.in b/python/setup.py.in index 7ccc60891..7e262df67 100644 --- a/python/setup.py.in +++ b/python/setup.py.in @@ -1,11 +1,22 @@ from setuptools import setup from setuptools.extension import Extension from Cython.Distutils import build_ext +import re def appendCMakeList(list, var): if var != "": list.extend(var.split(';')) - + +def appendCMakeLibList(list, var): + if var != "": + list.extend(map(stripLib, var.split(';'))) + +# Strip library prefixes and suffixes to prevent linker confusion +def stripLib(filename): + filename = re.sub(".lib$", "", filename) + filename = re.sub("^lib", "", filename) + filename = re.sub(".so$", "", filename) + return filename # Remove the "-Wstrict-prototypes" compiler option, which isn't valid for C++. import distutils.sysconfig @@ -16,6 +27,11 @@ if "CFLAGS" in cfg_vars: LIBRARIES=['dynet'] LIBRARY_DIRS=["."] +GPULIBRARIES=['gdynet', 'dynetcuda'] +GPULIBRARY_DIRS=[] + +appendCMakeLibList(GPULIBRARIES, '${CUDA_CUBLAS_FILES}') +appendCMakeList(GPULIBRARY_DIRS, '${CUDA_CUBLAS_DIRS}') if "${MSVC}"=="1": COMPILER_ARGS=["-DNOMINMAX", "/EHsc"] @@ -23,8 +39,10 @@ if "${MSVC}"=="1": RUNTIME_LIB_DIRS=[] # For MSVC, we compile dynet as a static lib, so we need to also link in the # other libraries it depends on: - appendCMakeList(LIBRARIES, '${LIBS}'.replace('.lib', '')) # Remove .lib extension from compiler lib + appendCMakeLibList(LIBRARIES, '${LIBS}') # Remove .lib extension from compiler lib appendCMakeList(LIBRARY_DIRS, '${MKL_LINK_DIRS}') # Add the MKL dirs, if MKL is being used + appendCMakeLibList(GPULIBRARIES, '${CUDA_RT_FILES}') + appendCMakeList(GPULIBRARY_DIRS, '${CUDA_RT_DIRS}') # Boost does auto-linking in MSVC, just point to the right directory: appendCMakeList(LIBRARY_DIRS, '${Boost_LIBRARY_DIRS}') else: @@ -33,9 +51,7 @@ else: RUNTIME_LIB_DIRS=[DYNET_LIB_DIR] LIBRARY_DIRS.append(DYNET_LIB_DIR) -GPULIBRARIES=['gdynet','dynetcuda','cublas'] -GPULIBRARY_DIRS=list(LIBRARY_DIRS) # make a copy -GPULIBRARY_DIRS.append("${CUDA_CUBLAS_LIB}") +GPULIBRARY_DIRS = LIBRARY_DIRS + GPULIBRARY_DIRS import platform @@ -69,7 +85,7 @@ ext_gpu = Extension( library_dirs=GPULIBRARY_DIRS, #extra_link_args=["-L/home/yogo/Vork/Research/dynet/dynet/build/dynet"], # if needed extra_compile_args=COMPILER_ARGS, - #runtime_library_dirs=RUNTIME_LIB_DIRS, + runtime_library_dirs=RUNTIME_LIB_DIRS, ) TARGET = [ext_cpu] From b919444042edb479191707e9d8bee38ef0a94109 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Tue, 25 Oct 2016 19:09:03 -0700 Subject: [PATCH 783/965] Fixing MKL Python build for Windows (stripping "lib" prefix screwed up libiomp5md.lib, should be done only for .so/.a files) --- python/setup.py.in | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/python/setup.py.in b/python/setup.py.in index 7e262df67..90c4570c4 100644 --- a/python/setup.py.in +++ b/python/setup.py.in @@ -13,9 +13,12 @@ def appendCMakeLibList(list, var): # Strip library prefixes and suffixes to prevent linker confusion def stripLib(filename): - filename = re.sub(".lib$", "", filename) - filename = re.sub("^lib", "", filename) - filename = re.sub(".so$", "", filename) + if filename.endswith(".lib"): + filename = re.sub(".lib$", "", filename) + elif filename.endswith(".so") or filename.endswith(".a"): + filename = re.sub("^lib", "", filename) + filename = re.sub(".so$", "", filename) + filename = re.sub(".a$", "", filename) return filename # Remove the "-Wstrict-prototypes" compiler option, which isn't valid for C++. From 1eb472748bf414c2500ef0f2e4fff3c867802eaf Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Tue, 25 Oct 2016 19:28:16 -0700 Subject: [PATCH 784/965] Fix Windows Python with both MKL and GPU. The GPU compilation may still need some of the non-GPU libraries (like MKL). --- python/setup.py.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/setup.py.in b/python/setup.py.in index 90c4570c4..ece1b50d3 100644 --- a/python/setup.py.in +++ b/python/setup.py.in @@ -42,7 +42,8 @@ if "${MSVC}"=="1": RUNTIME_LIB_DIRS=[] # For MSVC, we compile dynet as a static lib, so we need to also link in the # other libraries it depends on: - appendCMakeLibList(LIBRARIES, '${LIBS}') # Remove .lib extension from compiler lib + appendCMakeLibList(LIBRARIES, '${LIBS}') + appendCMakeLibList(GPULIBRARIES, '${LIBS}') appendCMakeList(LIBRARY_DIRS, '${MKL_LINK_DIRS}') # Add the MKL dirs, if MKL is being used appendCMakeLibList(GPULIBRARIES, '${CUDA_RT_FILES}') appendCMakeList(GPULIBRARY_DIRS, '${CUDA_RT_DIRS}') From 068f154170b42517dc2e9da79a34026a6174762f Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 26 Oct 2016 07:06:24 -0400 Subject: [PATCH 785/965] Made the info about contribution a little more clear --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4ae41811a..66c31b6de 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Dynamic neural network library DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library developed by Carnegie Mellon University and many others. It is written in C++ (with bindings in Python) and is designed to be efficient when run on either CPU or GPU, and to work well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for [syntactic parsing](https://github.com/clab/lstm-parser), [machine translation](https://github.com/neubig/lamtram), [morphological inflection](https://github.com/mfaruqui/morph-trans), and many other application areas. -Read the [documentation](http://dynet.readthedocs.io/en/latest/) to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group or [github page](http://github.com/clab/dynet) with any questions, issues, or contributions. +Read the [documentation](http://dynet.readthedocs.io/en/latest/) to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group with any questions (if you want to receive email make sure to select "all email" when you sign up). We greatly appreciate any bug reports and contributions, which can be made by filing an issue or making a pull request through the [github page](http://github.com/clab/dynet). * **Latest Code:** Can be found on the github page master branch. * **Latest Release:** [v1.0-rc1](https://github.com/clab/dynet/releases/tag/v1.0-rc1) From 9ba2b49f1a70b09b3b5a94f1e310f4ddd0b0e426 Mon Sep 17 00:00:00 2001 From: paul Date: Wed, 26 Oct 2016 10:16:54 -0400 Subject: [PATCH 786/965] Bug correction in set_h,set_s --- dynet/fast-lstm.cc | 30 ++++++++++++++++++++---------- dynet/gru.cc | 30 +++++++++++++++++++++--------- dynet/lstm.cc | 25 ++++++++++++++++++------- 3 files changed, 59 insertions(+), 26 deletions(-) diff --git a/dynet/fast-lstm.cc b/dynet/fast-lstm.cc index 4d53ad6f7..e4b6a83e9 100644 --- a/dynet/fast-lstm.cc +++ b/dynet/fast-lstm.cc @@ -94,29 +94,39 @@ void FastLSTMBuilder::start_new_sequence_impl(const vector& hinit) { } // TO DO - Make this correct -Expression FastLSTMBuilder::set_h_impl(int prev, const vector& h_new) { +// Copied c from the previous step (otherwise c.size()< h.size()) +// Also is creating a new step something we want? +// wouldn't overwriting the current one be better? +Expression LSTMBuilder::set_h_impl(int prev, const vector& h_new) { if (h_new.size()) { assert(h_new.size() == layers); } const unsigned t = h.size(); h.push_back(vector(layers)); + c.push_back(vector(layers)); for (unsigned i = 0; i < layers; ++i) { - Expression y = h_new[i]; - h[t][i] = y; + Expression h_i = h_new[i]; + Expression c_i = c[t - 1][i]; + h[t][i] = h_i; + c[t][i] = c_i; } return h[t].back(); } - -Expression FastLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - if (s_new.size()) { assert(s_new.size() == layers); } - const unsigned t = h.size(); +// Current implementation : s_new is either {new_c[0],...,new_c[n]} +// or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} +Expression LSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { + if (s_new.size()) { assert(s_new.size() == layers || s_new.size() == 2 * layers ); } + bool only_c = s_new.size() == layers; + const unsigned t = c.size(); h.push_back(vector(layers)); + c.push_back(vector(layers)); for (unsigned i = 0; i < layers; ++i) { - Expression y = s_new[i]; - h[t][i + layers] = y; + Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; + Expression c_i = s_new[i]; + h[t][i] = h_i; + c[t][i] = c_i; } return h[t].back(); } - Expression FastLSTMBuilder::add_input_impl(int prev, const Expression& x) { h.push_back(vector(layers)); c.push_back(vector(layers)); diff --git a/dynet/gru.cc b/dynet/gru.cc index c86a3f574..d3efed328 100644 --- a/dynet/gru.cc +++ b/dynet/gru.cc @@ -75,24 +75,36 @@ void GRUBuilder::start_new_sequence_impl(const std::vector& h_0) { } } -Expression GRUBuilder::set_h_impl(int prev, const vector& h_new) { +// TO DO - Make this correct +// Copied c from the previous step (otherwise c.size()< h.size()) +// Also is creating a new step something we want? +// wouldn't overwriting the current one be better? +Expression LSTMBuilder::set_h_impl(int prev, const vector& h_new) { if (h_new.size()) { assert(h_new.size() == layers); } const unsigned t = h.size(); h.push_back(vector(layers)); + c.push_back(vector(layers)); for (unsigned i = 0; i < layers; ++i) { - Expression y = h_new[i]; - h[t][i] = y; + Expression h_i = h_new[i]; + Expression c_i = c[t - 1][i]; + h[t][i] = h_i; + c[t][i] = c_i; } return h[t].back(); } - -Expression GRUBuilder::set_s_impl(int prev, const std::vector& s_new) { - if (s_new.size()) { assert(s_new.size() == layers); } - const unsigned t = h.size(); +// Current implementation : s_new is either {new_c[0],...,new_c[n]} +// or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} +Expression LSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { + if (s_new.size()) { assert(s_new.size() == layers || s_new.size() == 2 * layers ); } + bool only_c = s_new.size() == layers; + const unsigned t = c.size(); h.push_back(vector(layers)); + c.push_back(vector(layers)); for (unsigned i = 0; i < layers; ++i) { - Expression y = s_new[i]; - h[t][i + layers] = y; + Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; + Expression c_i = s_new[i]; + h[t][i] = h_i; + c[t][i] = c_i; } return h[t].back(); } diff --git a/dynet/lstm.cc b/dynet/lstm.cc index 7b131db76..fe014ff2e 100644 --- a/dynet/lstm.cc +++ b/dynet/lstm.cc @@ -97,24 +97,35 @@ void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { } // TO DO - Make this correct +// Copied c from the previous step (otherwise c.size()< h.size()) +// Also is creating a new step something we want? +// wouldn't overwriting the current one be better? Expression LSTMBuilder::set_h_impl(int prev, const vector& h_new) { if (h_new.size()) { assert(h_new.size() == layers); } const unsigned t = h.size(); h.push_back(vector(layers)); + c.push_back(vector(layers)); for (unsigned i = 0; i < layers; ++i) { - Expression y = h_new[i]; - h[t][i] = y; + Expression h_i = h_new[i]; + Expression c_i = c[t - 1][i]; + h[t][i] = h_i; + c[t][i] = c_i; } return h[t].back(); } - +// Current implementation : s_new is either {new_c[0],...,new_c[n]} +// or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} Expression LSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - if (s_new.size()) { assert(s_new.size() == layers); } - const unsigned t = h.size(); + if (s_new.size()) { assert(s_new.size() == layers || s_new.size() == 2 * layers ); } + bool only_c = s_new.size() == layers; + const unsigned t = c.size(); h.push_back(vector(layers)); + c.push_back(vector(layers)); for (unsigned i = 0; i < layers; ++i) { - Expression y = s_new[i]; - h[t][i + layers] = y; + Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; + Expression c_i = s_new[i]; + h[t][i] = h_i; + c[t][i] = c_i; } return h[t].back(); } From 406040db0b3260c2239f2269791939d08be6e51b Mon Sep 17 00:00:00 2001 From: paul Date: Wed, 26 Oct 2016 10:30:52 -0400 Subject: [PATCH 787/965] Bugfix --- dynet/fast-lstm.cc | 5 +++-- dynet/gru.cc | 50 +++++++++++++++++----------------------------- 2 files changed, 21 insertions(+), 34 deletions(-) diff --git a/dynet/fast-lstm.cc b/dynet/fast-lstm.cc index e4b6a83e9..e9f693761 100644 --- a/dynet/fast-lstm.cc +++ b/dynet/fast-lstm.cc @@ -97,7 +97,7 @@ void FastLSTMBuilder::start_new_sequence_impl(const vector& hinit) { // Copied c from the previous step (otherwise c.size()< h.size()) // Also is creating a new step something we want? // wouldn't overwriting the current one be better? -Expression LSTMBuilder::set_h_impl(int prev, const vector& h_new) { +Expression FastLSTMBuilder::set_h_impl(int prev, const vector& h_new) { if (h_new.size()) { assert(h_new.size() == layers); } const unsigned t = h.size(); h.push_back(vector(layers)); @@ -112,7 +112,7 @@ Expression LSTMBuilder::set_h_impl(int prev, const vector& h_new) { } // Current implementation : s_new is either {new_c[0],...,new_c[n]} // or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} -Expression LSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { +Expression FastLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { if (s_new.size()) { assert(s_new.size() == layers || s_new.size() == 2 * layers ); } bool only_c = s_new.size() == layers; const unsigned t = c.size(); @@ -127,6 +127,7 @@ Expression LSTMBuilder::set_s_impl(int prev, const std::vector& s_ne return h[t].back(); } + Expression FastLSTMBuilder::add_input_impl(int prev, const Expression& x) { h.push_back(vector(layers)); c.push_back(vector(layers)); diff --git a/dynet/gru.cc b/dynet/gru.cc index d3efed328..eff952c86 100644 --- a/dynet/gru.cc +++ b/dynet/gru.cc @@ -48,19 +48,19 @@ void GRUBuilder::new_graph_impl(ComputationGraph& cg) { auto& p = params[i]; // z - Expression x2z = parameter(cg,p[X2Z]); - Expression h2z = parameter(cg,p[H2Z]); - Expression bz = parameter(cg,p[BZ]); + Expression x2z = parameter(cg, p[X2Z]); + Expression h2z = parameter(cg, p[H2Z]); + Expression bz = parameter(cg, p[BZ]); // r - Expression x2r = parameter(cg,p[X2R]); - Expression h2r = parameter(cg,p[H2R]); - Expression br = parameter(cg,p[BR]); + Expression x2r = parameter(cg, p[X2R]); + Expression h2r = parameter(cg, p[H2R]); + Expression br = parameter(cg, p[BR]); // h - Expression x2h = parameter(cg,p[X2H]); - Expression h2h = parameter(cg,p[H2H]); - Expression bh = parameter(cg,p[BH]); + Expression x2h = parameter(cg, p[X2H]); + Expression h2h = parameter(cg, p[H2H]); + Expression bh = parameter(cg, p[BH]); vector vars = {x2z, h2z, bz, x2r, h2r, br, x2h, h2h, bh}; param_vars.push_back(vars); @@ -77,41 +77,27 @@ void GRUBuilder::start_new_sequence_impl(const std::vector& h_0) { // TO DO - Make this correct // Copied c from the previous step (otherwise c.size()< h.size()) -// Also is creating a new step something we want? +// Also is creating a new step something we want? // wouldn't overwriting the current one be better? -Expression LSTMBuilder::set_h_impl(int prev, const vector& h_new) { +Expression GRUBuilder::set_h_impl(int prev, const vector& h_new) { if (h_new.size()) { assert(h_new.size() == layers); } const unsigned t = h.size(); h.push_back(vector(layers)); - c.push_back(vector(layers)); for (unsigned i = 0; i < layers; ++i) { Expression h_i = h_new[i]; - Expression c_i = c[t - 1][i]; h[t][i] = h_i; - c[t][i] = c_i; } return h[t].back(); } // Current implementation : s_new is either {new_c[0],...,new_c[n]} // or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} -Expression LSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { - if (s_new.size()) { assert(s_new.size() == layers || s_new.size() == 2 * layers ); } - bool only_c = s_new.size() == layers; - const unsigned t = c.size(); - h.push_back(vector(layers)); - c.push_back(vector(layers)); - for (unsigned i = 0; i < layers; ++i) { - Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; - Expression c_i = s_new[i]; - h[t][i] = h_i; - c[t][i] = c_i; - } - return h[t].back(); +Expression GRUBuilder::set_s_impl(int prev, const std::vector& s_new) { + return set_h_impl(prev, s_new); } Expression GRUBuilder::add_input_impl(int prev, const Expression& x) { - //if(dropout_rate != 0.f) - //throw std::runtime_error("GRUBuilder doesn't support dropout yet"); + //if(dropout_rate != 0.f) + //throw std::runtime_error("GRUBuilder doesn't support dropout yet"); const bool has_initial_state = (h0.size() > 0); h.push_back(vector(layers)); vector& ht = h.back(); @@ -165,9 +151,9 @@ Expression GRUBuilder::add_input_impl(int prev, const Expression& x) { void GRUBuilder::copy(const RNNBuilder & rnn) { const GRUBuilder & rnn_gru = (const GRUBuilder&)rnn; assert(params.size() == rnn_gru.params.size()); - for(size_t i = 0; i < params.size(); ++i) - for(size_t j = 0; j < params[i].size(); ++j) - params[i][j] = rnn_gru.params[i][j]; + for (size_t i = 0; i < params.size(); ++i) + for (size_t j = 0; j < params[i].size(); ++j) + params[i][j] = rnn_gru.params[i][j]; } } // namespace dynet From 1893191dfd36271dd73c9cdc2e154350d38f943a Mon Sep 17 00:00:00 2001 From: paul Date: Wed, 26 Oct 2016 13:57:11 -0400 Subject: [PATCH 788/965] First documentation for RNNbuilders --- doc/doxygen/Doxyfile | 2 +- doc/source/builders.rst | 4 +- dynet/expr.h | 2 +- dynet/rnn.h | 236 +++++++++++++++++++++++++++++++++++----- 4 files changed, 211 insertions(+), 33 deletions(-) diff --git a/doc/doxygen/Doxyfile b/doc/doxygen/Doxyfile index 526276130..1c1cf3b1a 100644 --- a/doc/doxygen/Doxyfile +++ b/doc/doxygen/Doxyfile @@ -758,7 +758,7 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT =../../dynet/expr.h ../../dynet/training.h +INPUT =../../dynet/expr.h ../../dynet/training.h ../../dynet/rnn.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses diff --git a/doc/source/builders.rst b/doc/source/builders.rst index d6139ae1a..3ea25c8e2 100644 --- a/doc/source/builders.rst +++ b/doc/source/builders.rst @@ -4,4 +4,6 @@ DyNet Builders Builders combine together various operations to implement more complicated things such as recurrent and LSTM networks -TODO: Create documentation +.. doxygengroup:: rnnbuilders + :members: + :content-only: \ No newline at end of file diff --git a/dynet/expr.h b/dynet/expr.h index 8a155d5c8..b4672c315 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -3,7 +3,7 @@ * \defgroup operations * \brief The various operations that you can use in building a DyNet graph * - * TODO: Create documentation and explain expressions, etc... + * \details TODO: Create documentation and explain expressions, etc... */ #ifndef DYNET_EXPR_H diff --git a/dynet/rnn.h b/dynet/rnn.h index 09d11c3f6..d2d9497da 100644 --- a/dynet/rnn.h +++ b/dynet/rnn.h @@ -1,3 +1,11 @@ +/** + * \file rnn.h + * \defgroup rnnbuilders + * \brief Helper structures to build recurrent units + * + * \details TODO: Create documentation and explain rnns, etc... + */ + #ifndef DYNET_RNN_H_ #define DYNET_RNN_H_ @@ -18,24 +26,48 @@ inline void swap(RNNPointer& i1, RNNPointer& i2) { RNNPointer t = i1; i1 = i2; i2 = t; } -// interface for constructing an RNN, LSTM, GRU, etc. +/** + * \ingroup rnnbuilders + * \brief interface for constructing an RNN, LSTM, GRU, etc. + * \details [long description] + */ struct RNNBuilder { + /** + * + * \brief Default constructor + */ RNNBuilder() : cur(-1) {} virtual ~RNNBuilder(); + /** + * + * \brief Get pointer to the current state + * + * \return Pointer to the current state + */ RNNPointer state() const { return cur; } - // call this to reset the builder when you are working with a newly - // created ComputationGraph object + /** + * + * \brief Initialize with new computation graph + * \details call this to reset the builder when you are working with a newly + * created ComputationGraph object + * + * \param cg Computation graph + */ void new_graph(ComputationGraph& cg) { sm.transition(RNNOp::new_graph); new_graph_impl(cg); } - // Reset for new sequence - // call this before add_input and after new_graph, - // when starting a new sequence on the same hypergraph. - // h_0 is used to initialize hidden layers at timestep 0 to given values + /** + * + * \brief Reset for new sequence + * \details call this before add_input and after new_graph, + * when starting a new sequence on the same hypergraph. + * + * \param h_0 `h_0` is used to initialize hidden layers at timestep 0 to given values + */ void start_new_sequence(const std::vector& h_0 = {}) { sm.transition(RNNOp::start_new_sequence); cur = RNNPointer(-1); @@ -43,7 +75,16 @@ struct RNNBuilder { start_new_sequence_impl(h_0); } - // explicitly set the output state of a node + // + /** + * + * \brief Explicitly set the output state of a node + * + * \param prev Pointer to the previous state + * \param h_new The new hidden state + * + * \return The hidden representation of the deepest layer + */ Expression set_h(const RNNPointer& prev, const std::vector& h_new = {}) { sm.transition(RNNOp::add_input); head.push_back(prev); @@ -51,7 +92,19 @@ struct RNNBuilder { return set_h_impl(prev, h_new); } - // Set the internal state of a node (for lstms/grus) + // + /** + * + * \brief Set the internal state of a node (for lstms/grus) + * \details For RNNs without internal states (SimpleRNN, GRU...), + * this has the same behaviour as `set_h` + * + * \param prev Pointer to the previous state + * \param s_new The new state. Can be `{new_c[0],...,new_c[n]}` + * or `{new_c[0],...,new_c[n], new_h[0],...,new_h[n]}` + * + * \return The hidden representation of the deepest layer + */ Expression set_s(const RNNPointer& prev, const std::vector& s_new = {}) { sm.transition(RNNOp::add_input); head.push_back(prev); @@ -59,8 +112,14 @@ struct RNNBuilder { return set_s_impl(prev, s_new); } - // add another timestep by reading in the variable x - // return the hidden representation of the deepest layer + /** + * + * \brief Add another timestep by reading in the variable x + * + * \param x Input variable + * + * \return The hidden representation of the deepest layer + */ Expression add_input(const Expression& x) { sm.transition(RNNOp::add_input); head.push_back(cur); @@ -69,9 +128,18 @@ struct RNNBuilder { return add_input_impl(rcp, x); } - // add another timestep, but define recurrent connection to prev - // rather than to head[cur] - // this can be used to construct trees, implement beam search, etc. + /** + * + * \brief Add another timestep, with arbitrary recurrent connection. + * \details This allows to define a recurrent connection to `prev` + * rather than to head[cur]. + * This can be used to construct trees, implement beam search, etc. + * + * \param prev Pointer to the previous state + * \param x Input variable + * + * \return The hidden representation of the deepest layer + */ Expression add_input(const RNNPointer& prev, const Expression& x) { sm.transition(RNNOp::add_input); head.push_back(prev); @@ -79,37 +147,116 @@ struct RNNBuilder { return add_input_impl(prev, x); } - // rewind the last timestep - this DOES NOT remove the variables - // from the computation graph, it just means the next time step will - // see a different previous state. You can remind as many times as - // you want. + /** + * + * \brief Rewind the last timestep + * \details - this DOES NOT remove the variables from the computation graph, + * it just means the next time step will see a different previous state. + * You can remind as many times as you want. + */ void rewind_one_step() { cur = head[cur]; } - // Set dropout. In general, you should disable dropout at test time + /** + * + * \brief Set Dropout + * + * \param d Dropout rate + */ void set_dropout(float d) { dropout_rate = d; } + /** + * + * \brief Disable Dropout + * \details In general, you should disable dropout at test time + */ void disable_dropout() { dropout_rate = 0; } - // returns node (index) of most recent output + /** + * + * \brief Returns node (index) of most recent output + * + * \return Node (index) of most recent output + */ virtual Expression back() const = 0; - // access the final output of each hidden layer + /** + * + * \brief Access the final output of each hidden layer + * + * \return Final output of each hidden layer + */ virtual std::vector final_h() const = 0; + /** + * + * \brief Access the output of any hidden layer + * + * \param i Pointer to the step which output you want to access + * + * \return Output of each hidden layer at the given step + */ virtual std::vector get_h(RNNPointer i) const = 0; - // access the state of each hidden layer, in a format that can be used in - // start_new_sequence + + /** + * + * \brief Access the final state of each hidden layer + * \details This returns the state of each hidden layer, + * in a format that can be used in start_new_sequence + * (i.e. including any internal cell for LSTMs and the likes) + * + * \return vector containing, if it exists, the list of final + * internal states, followed by the list of final outputs for + * each layer + */ virtual std::vector final_s() const = 0; - virtual unsigned num_h0_components() const = 0; + /** + * + * \brief Access the state of any hidden layer + * \details See `final_s` for details + * + * \param i Pointer to the step which state you want to access + * + * \return Internal state of each hidden layer at the given step + */ virtual std::vector get_s(RNNPointer i) const = 0; - // copy the parameters of another builder + + /** + * + * \brief Number of components in `h_0` + * + * \return Number of components in `h_0` + */ + virtual unsigned num_h0_components() const = 0; + /** + * + * \brief Copy the parameters of another builder. + * + * \param params RNNBuilder you want to copy parameters from. + */ virtual void copy(const RNNBuilder & params) = 0; - // the following functions save all the parameters associated with a particular - // RNNBuilder's derived class to a file. These should not be used to seralize - // models, they should only be used to load and save parameters for pretraining. - // If you are interested in serializing models, use the boost serialization - // API against your model class + /** + * + * \brief This function saves all the parameters associated with + * a particular RNNBuilder's derived class to a file. + * \details This should not be used to seralize models, it should + * only be used to save parameters for pretraining. + * If you are interested in serializing models, use the boost + * serialization API against your model class. + * + * \param fname File you want to save your model to. + */ virtual void save_parameters_pretraining(const std::string& fname) const; + /** + * + * \brief Loads all the parameters associated with a particular RNNBuilder's + * derived class from a file. + * \details This should not be used to seralize models, it should + * only be used to load parameters from pretraining. + * If you are interested in serializing models, use the boost + * serialization API against your model class. + * + * \param fname File you want to read your model from. + */ virtual void load_parameters_pretraining(const std::string& fname); @@ -131,8 +278,25 @@ struct RNNBuilder { void serialize(Archive& ar, const unsigned int); }; +/** + * \ingroup rnnbuilders + * \brief This provides a builder for the simplest RNN with tanh nonlinearity + * \details The equation for this RNN is : + * \f$h_t=\tanh(W_x x_t + W_h h_{t-1} + b)\f$ + * + */ struct SimpleRNNBuilder : public RNNBuilder { SimpleRNNBuilder() = default; + /** + * + * \brief Builds a simple RNN + * + * \param layers Number of layers + * \param input_dim Dimension of the input + * \param hidden_dim Hiddent layer (and output) size + * \param model Model holding the parameters + * \param support_lags Allow for auxiliary output? + */ explicit SimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, @@ -147,6 +311,18 @@ struct SimpleRNNBuilder : public RNNBuilder { Expression set_s_impl(int prev, const std::vector& s_new) {return set_h_impl(prev, s_new);} public: + /** + * + * \brief Add auxiliary output + * \details Returns \f$h_t=\tanh(W_x x_t + W_h h_{t-1} + W_y y + b)\f$ + * where \f$y\f$ is an auxiliary output + * TODO : clarify + * + * \param x Input expression + * \param aux Auxiliary output expression + * + * \return The hidden representation of the deepest layer + */ Expression add_auxiliary_input(const Expression& x, const Expression &aux); Expression back() const override { return (cur == -1 ? h0.back() : h[cur].back()); } From 4efe677c0c77d979e73cdd0ae31d2c6874be070e Mon Sep 17 00:00:00 2001 From: Avi Hayoun Date: Thu, 27 Oct 2016 17:25:05 +0300 Subject: [PATCH 789/965] add python3 compatibility --- python/dynet.py | 6 +++--- python/dynet.pyx | 37 ++++++++++++++++++++++++------------- python/dynet_viz.py | 16 ++++++++-------- python/setup.py.in | 7 ++++--- 4 files changed, 39 insertions(+), 27 deletions(-) diff --git a/python/dynet.py b/python/dynet.py index 755f537ab..301813918 100644 --- a/python/dynet.py +++ b/python/dynet.py @@ -5,15 +5,15 @@ elif '--dynet-gpu' in sys.argv: # the python gpu switch. sys.argv.remove('--dynet-gpu') def print_graphviz(**kwarge): - print "Run with --dynet-viz to get the visualization behavior." + print("Run with --dynet-viz to get the visualization behavior.") from _gdynet import * elif '--dynet-gpus' in sys.argv or '--dynet-gpu-ids' in sys.argv: # but using the c++ gpu switches suffices to trigger gpu. def print_graphviz(**kwarge): - print "Run with --dynet-viz to get the visualization behavior." + print("Run with --dynet-viz to get the visualization behavior.") from _gdynet import * else: def print_graphviz(**kwarge): - print "Run with --dynet-viz to get the visualization behavior." + print("Run with --dynet-viz to get the visualization behavior.") from _dynet import * __version__ = 2.0 diff --git a/python/dynet.pyx b/python/dynet.pyx index 8469e8540..54a6b87ef 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -1,10 +1,16 @@ # on numpy arrays, see: https://github.com/cython/cython/wiki/tutorials-NumpyPointerToC - +from __future__ import print_function import sys from cython.operator cimport dereference as deref from libc.stdlib cimport malloc, free import numpy as np -import cPickle as pickle + +# python3 pickle already uses the c implementaion +try: + import cPickle as pickle +except ImportError: + import pickle + import os.path # TODO: # - set random seed (in DYNET) @@ -36,7 +42,7 @@ cimport dynet cdef init(random_seed=None): cdef int argc = len(sys.argv) cdef char** c_argv - args = [bytes(x) for x in sys.argv] + args = [bytes(x, encoding="utf-8") for x in sys.argv] c_argv = malloc(sizeof(char*) * len(args)) # TODO check failure? for idx, s in enumerate(args): c_argv[idx] = s @@ -316,8 +322,8 @@ cdef class Model: # {{{ if not components: self.save_all(fname) return - fh = file(fname+".pym","w") - pfh = file(fname+".pyk","w") + fh = open(fname+".pym","w") + pfh = open(fname+".pyk","w") cdef CModelSaver *saver = new CModelSaver(fname, self.thisptr) for c in components: self._save_one(c,saver,fh,pfh) @@ -362,18 +368,18 @@ cdef class Model: # {{{ saveable.restore_components(items) return saveable else: - print "Huh?" + print("Huh?") assert False,"unsupported type " + tp cpdef load(self, string fname): if not os.path.isfile(fname+".pym"): self.load_all(fname) return - with file(fname+".pym","r") as fh: + with open(fname+".pym","r") as fh: types = fh.read().strip().split() cdef CModelLoader *loader = new CModelLoader(fname, self.thisptr) - with file(fname+".pyk","r") as pfh: + with open(fname+".pyk","r") as pfh: params = [] itypes = iter(types) while True: # until iterator is done @@ -589,11 +595,16 @@ cdef class Expression: #{{{ def __str__(self): return "exprssion %s/%s" % (self.vindex, self.cg_version) - def __getitem__(self, int i): - return pick(self, i) +# def __getitem__(self, int i): +# return pick(self, i) + def __getitem__(self, object index): + if isinstance(index, int): + return pick(self, index) + + return pickrange(self, index[0], index[1]) - def __getslice__(self, int i, int j): - return pickrange(self, i, j) +# def __getslice__(self, int i, int j): +# return pickrange(self, i, j) cpdef scalar_value(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") @@ -885,7 +896,7 @@ cpdef Expression esum(list xs): for x in xs: ensure_freshness(x) cvec.push_back(x.c()) - #print >> sys.stderr, cvec.size() + #print(cvec.size(), file=sys.stderr) return Expression.from_cexpr(x.cg_version, c_sum(cvec)) cpdef Expression average(list xs): diff --git a/python/dynet_viz.py b/python/dynet_viz.py index 6f902c842..be1c9192e 100644 --- a/python/dynet_viz.py +++ b/python/dynet_viz.py @@ -969,9 +969,9 @@ def print_graphviz(compact=False, show_dims=True, expression_names=None, lookup_ (nodes, birnn_collapse_to) = collapse_birnn_states(nodes, compact) collapse_to.update(birnn_collapse_to) - print 'digraph G {' - print ' rankdir=BT;' - if not compact: print ' nodesep=.05;' + print('digraph G {') + print(' rankdir=BT;') + if not compact: print(' nodesep=.05;') node_types = defaultdict(set) for n in nodes: @@ -982,7 +982,7 @@ def print_graphviz(compact=False, show_dims=True, expression_names=None, lookup_ '2_regular': '[shape=rect]', '3_rnn_state': '[shape=rect, peripheries=2]', }[node_type] - print ' node %s; ' % (style), ' '.join(node_types[node_type]) + print(' node %s; ' % (style), ' '.join(node_types[node_type])) # all_nodes = set(line.strip().split()[0] for line in node_def_lines) for n in nodes: @@ -995,9 +995,9 @@ def print_graphviz(compact=False, show_dims=True, expression_names=None, lookup_ label = '%s\\n%s' % (label, shape_str(n.input_dim)) if n.output_dim.invalid() or (n.input_dim is not None and n.input_dim.invalid()): n.features += " [color=red,style=filled,fillcolor=red]" - print ' %s [label="%s"] %s;' % (n.name, label, n.features) + print(' %s [label="%s"] %s;' % (n.name, label, n.features)) for c in n.children: - print ' %s -> %s;' % (c, n.name) + print(' %s -> %s;' % (c, n.name)) rnn_states = [] # (name, rnn_name, state_idx) rnn_state_re = re.compile("[^-]+-(.)-(\\d+)") @@ -1016,6 +1016,6 @@ def print_graphviz(compact=False, show_dims=True, expression_names=None, lookup_ group_name_n = collapse_to.get(name_n, name_n) edges.add((group_name_p, group_name_n)) for (name_p, name_n) in edges: - print ' %s -> %s [style=dotted];' % (name_p, name_n) # ,dir=both + print(' %s -> %s [style=dotted];' % (name_p, name_n)) # ,dir=both - print '}' + print('}') diff --git a/python/setup.py.in b/python/setup.py.in index f0abc3656..a3835445e 100644 --- a/python/setup.py.in +++ b/python/setup.py.in @@ -1,5 +1,6 @@ from setuptools import setup -from setuptools.extension import Extension +#from setuptools.extension import Extension +from Cython.Distutils.extension import Extension from Cython.Distutils import build_ext @@ -18,7 +19,7 @@ if platform.system() == 'Darwin': ext_cpu = Extension( - "_dynet", # name of extension + "dynet", # name of extension ["dynet.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main dynet directory. @@ -32,7 +33,7 @@ ext_cpu = Extension( ) ext_gpu = Extension( - "_gdynet", # name of extension + "gdynet", # name of extension ["gdynet.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main dynet directory. From 51b74c40a5cc6557349466ecc4f32c0c097dc04d Mon Sep 17 00:00:00 2001 From: Avi Hayoun Date: Thu, 27 Oct 2016 17:30:56 +0300 Subject: [PATCH 790/965] fix py3 compatible printing in the visualizer --- python/dynet_viz.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/dynet_viz.py b/python/dynet_viz.py index be1c9192e..1acb31d4d 100644 --- a/python/dynet_viz.py +++ b/python/dynet_viz.py @@ -1,3 +1,4 @@ +from __future__ import print_function import re from collections import defaultdict From 9108ae5869f03f71d90cfef17c6d92eebda49a03 Mon Sep 17 00:00:00 2001 From: Avi Hayoun Date: Thu, 27 Oct 2016 17:33:35 +0300 Subject: [PATCH 791/965] clean up after myself --- python/setup.py.in | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/python/setup.py.in b/python/setup.py.in index a3835445e..7b871819d 100644 --- a/python/setup.py.in +++ b/python/setup.py.in @@ -1,6 +1,5 @@ from setuptools import setup -#from setuptools.extension import Extension -from Cython.Distutils.extension import Extension +from setuptools.extension import Extension from Cython.Distutils import build_ext From 1fb14b5fe1ac6230cf57e3058a9a87778350d823 Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 28 Oct 2016 00:09:53 +0300 Subject: [PATCH 792/965] reuse parameter-Expression for same parameters (python) --- python/dynet.pyx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/python/dynet.pyx b/python/dynet.pyx index 8469e8540..8713b9b09 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -76,8 +76,11 @@ cdef c_tensor_as_np(CTensor &t): # {{{ Model / Parameters cdef class Parameters: cdef CParameters thisptr # TODO -- no longer pointer + cdef int _version + cdef Expression _expr def __cinit__(self): #self.thisptr = p + self._version = -1 pass @staticmethod cdef wrap_ptr(CParameters ptr): @@ -118,6 +121,12 @@ cdef class Parameters: cpdef bool is_updated(self): return self.thisptr.is_updated() cpdef set_updated(self, bool b): self.thisptr.set_updated(b) + cpdef Expression expr(self): + if cg_version() != self._version: + self._version = cg_version() + self._expr = Expression.from_cexpr(_cg.version(), c_parameter(_cg.thisptr[0], self.thisptr)) + return self._expr + cdef class LookupParameters: @@ -673,10 +682,10 @@ cdef class Expression: #{{{ else: raise NotImplementedError() #}}} -cdef Expression _parameter(ComputationGraph g, Parameters p): - return Expression.from_cexpr(g.version(), c_parameter(g.thisptr[0], p.thisptr)) +#cdef Expression _parameter(ComputationGraph g, Parameters p): +# return Expression.from_cexpr(g.version(), c_parameter(g.thisptr[0], p.thisptr)) -def parameter(Parameters p): return _parameter(_cg, p) +def parameter(Parameters p): return p.expr() # {{{ Mutable Expressions # These depend values that can be set by the caller From f9a5f6c2ad36347b62f315d6a9d6616afca3c112 Mon Sep 17 00:00:00 2001 From: Austin Matthews Date: Fri, 28 Oct 2016 05:03:11 -0400 Subject: [PATCH 793/965] added xor-mp example and fixed segrnn-sup example --- examples/CMakeLists.txt | 3 +- examples/segrnn-sup.cc | 16 ++-- examples/xor-mp.cc | 183 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 190 insertions(+), 12 deletions(-) create mode 100644 examples/xor-mp.cc diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 0ee556e7d..c3ed0da66 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,7 +1,6 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) -# segrnn-sup -foreach(TARGET mlc tok-embed poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm-mp read-write) +foreach(TARGET mlc tok-embed poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm-mp read-write xor-mp segrnn-sup) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) if (WITH_CUDA_BACKEND) target_link_libraries(${TARGET} gdynet ${LIBS}) diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup.cc index fabfa9023..e5d24810e 100644 --- a/examples/segrnn-sup.cc +++ b/examples/segrnn-sup.cc @@ -597,7 +597,6 @@ struct SegmentalRNN { int max_seg_len = 0) { int len = xins.size(); unordered_map p_map = ConstructSegmentMap(xins, cg, max_seg_len); - cg.forward(); vector tempvec; Expression gold_score = SumParts(len, yz, p_map, cg, max_seg_len); tempvec.push_back(gold_score); @@ -688,10 +687,6 @@ struct SegmentalRNN { int len = xins.size(); unordered_map p_map = ConstructSegmentMap(xins, cg, max_seg_len); - - // Compute everything at this step and use them later - cg.forward(); - PureDecode(len, p_map, cg, yz_pred, max_seg_len); return; } @@ -1125,23 +1120,24 @@ int main(int argc, char** argv) { continue; } vector xins = segrnn.ConstructInput(sent.first, cg); + Expression loss_expr; if(vm["partial"].as()){ if(vm["hinge"].as()){ cerr << "Hingle Loss for partially supervised setting is not avaiable at this moment." << endl; abort(); }else{ - segrnn.PartiallySupervisedCRFLoss(xins, sent.second, cg, max_seg_len); + loss_expr = segrnn.PartiallySupervisedCRFLoss(xins, sent.second, cg, max_seg_len); } }else{ if(vm["hinge"].as()){ - segrnn.SupervisedHingeLoss(xins, sent.second, cg, max_seg_len); + loss_expr = segrnn.SupervisedHingeLoss(xins, sent.second, cg, max_seg_len); }else{ - segrnn.SupervisedCRFLoss(xins, sent.second, cg, max_seg_len); + loss_expr = segrnn.SupervisedCRFLoss(xins, sent.second, cg, max_seg_len); } } ttags += sent.second.size(); - loss += as_scalar(cg.forward()); - cg.backward(); + loss += as_scalar(cg.forward(loss_expr)); + cg.backward(loss_expr); sgd->update(1.0); } ++lines; diff --git a/examples/xor-mp.cc b/examples/xor-mp.cc new file mode 100644 index 000000000..ecfde862f --- /dev/null +++ b/examples/xor-mp.cc @@ -0,0 +1,183 @@ +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/gpu-ops.h" +#include "dynet/expr.h" +#include "dynet/mp.h" +#include +#include + +#include +#include + +using namespace std; +using namespace dynet; +using namespace dynet::expr; +using namespace dynet::mp; + +struct Datum { + Datum() {} + Datum(const vector& x, const dynet::real y) : x(x), y(y) {} + + vector x; + dynet::real y; +}; + +class XorModel { +public: + XorModel(const unsigned hidden_size, Model& dynet_model) : pcg(nullptr) { + p_W = dynet_model.add_parameters({hidden_size, 2}); + p_b = dynet_model.add_parameters({hidden_size}); + p_V = dynet_model.add_parameters({1, hidden_size}); + p_a = dynet_model.add_parameters({1}); + } + + void new_graph(ComputationGraph& cg) { + W = parameter(cg, p_W); + b = parameter(cg, p_b); + V = parameter(cg, p_V); + a = parameter(cg, p_a); + pcg = &cg; + } + + Expression compute_loss(const Datum& datum) { + Expression x = input(*pcg, {2}, &datum.x); + Expression y = input(*pcg, &datum.y); + + Expression h = tanh(W*x + b); + Expression y_pred = V*h + a; + Expression loss_expr = squared_distance(y_pred, y); + return loss_expr; + } + +private: + XorModel() : pcg(nullptr) {} + + Parameter p_W, p_b, p_V, p_a; + Expression W, b, V, a; + ComputationGraph* pcg; + + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & p_W & p_b & p_V & p_a; + } +}; + +void serialize(const XorModel* const xor_model, const Model& dynet_model, const Trainer* const trainer) { + // Remove existing stdout output + int r = ftruncate(fileno(stdout), 0); + if (r != 0) {} + + // Move the cursor to the beginning of the stdout stream + fseek(stdout, 0, SEEK_SET); + + // Dump the model to stdout + boost::archive::text_oarchive oa(cout); + oa & dynet_model; + oa & xor_model; + oa & trainer; +} + +void deserialize(const string& filename, XorModel* xor_model, Model& dynet_model, Trainer* trainer) { + ifstream in(filename.c_str()); + boost::archive::text_iarchive ia(in); + ia & dynet_model; + ia & xor_model; + ia & trainer; + in.close(); +} + +class SufficientStats { +public: + dynet::real loss; + unsigned example_count; + + SufficientStats() : loss(), example_count() {} + + SufficientStats(dynet::real loss, unsigned example_count) : loss(loss), example_count(example_count) {} + + SufficientStats& operator+=(const SufficientStats& rhs) { + loss += rhs.loss; + example_count += rhs.example_count; + return *this; + } + + friend SufficientStats operator+(SufficientStats lhs, const SufficientStats& rhs) { + lhs += rhs; + return lhs; + } + + bool operator<(const SufficientStats& rhs) { + return loss < rhs.loss; + } + + friend std::ostream& operator<< (std::ostream& stream, const SufficientStats& stats) { + return stream << exp(stats.loss / stats.example_count) << " (" << stats.loss << " over " << stats.example_count << " examples)"; + } +}; + +class Learner : public ILearner { +public: + Learner(XorModel* xor_model, Model& dynet_model, const Trainer* const trainer, bool quiet) : xor_model(xor_model), dynet_model(dynet_model), trainer(trainer), quiet(quiet) {} + ~Learner() {} + SufficientStats LearnFromDatum(const Datum& datum, bool learn) { + ComputationGraph cg; + xor_model->new_graph(cg); + Expression loss_expr = xor_model->compute_loss(datum); + dynet::real loss = as_scalar(loss_expr.value()); + + if (learn) { + cg.backward(loss_expr); + } + return SufficientStats(loss, 1); + } + + void SaveModel() { + if (!quiet) { + serialize(xor_model, dynet_model, trainer); + } + } + +private: + XorModel* xor_model; + Model& dynet_model; + const Trainer* const trainer; + bool quiet; +}; + +int main(int argc, char** argv) { + dynet::initialize(argc, argv, true); + + // parameters + const unsigned num_cores = 4; + const unsigned ITERATIONS = 1000; + Model dynet_model; + XorModel* xor_model = nullptr; + Trainer* trainer = nullptr; + + if (argc == 2) { + // Load the model and parameters from file if given. + deserialize(argv[1], xor_model, dynet_model, trainer); + } + else { + // Otherwise, just create a new model. + const unsigned HIDDEN_SIZE = 8; + xor_model = new XorModel(HIDDEN_SIZE, dynet_model); + trainer = new SimpleSGDTrainer(&dynet_model); + } + + vector data(4); + data[0] = Datum({0, 0}, 0); + data[1] = Datum({0, 1}, 1); + data[2] = Datum({1, 0}, 1); + data[3] = Datum({1, 1}, 0); + + Learner learner(xor_model, dynet_model, trainer, true); + if (num_cores == 0) { + run_single_process(&learner, trainer, data, data, ITERATIONS, data.size(), data.size(), data.size()); + } + else { + run_multi_process(num_cores, &learner, trainer, data, data, ITERATIONS, data.size(), data.size()); + } +} From a8d8edc154a696d69b7cdb180e6d02d061e5f8a6 Mon Sep 17 00:00:00 2001 From: Austin Matthews Date: Fri, 28 Oct 2016 05:03:44 -0400 Subject: [PATCH 794/965] prolly a bad idea to just drop important flags --- dynet/init.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/dynet/init.cc b/dynet/init.cc index 41e8c2ca7..86702d3f5 100644 --- a/dynet/init.cc +++ b/dynet/init.cc @@ -25,6 +25,7 @@ static void remove_args(int& argc, char**& argv, int& argi, int n) { DynetParams extract_dynet_params(int& argc, char**& argv, bool shared_parameters) { DynetParams params; + params.shared_parameters = shared_parameters; int argi = 1; From 80791cfb6bd1ba786006b8c127b053b9a8f72fc8 Mon Sep 17 00:00:00 2001 From: Austin Matthews Date: Fri, 28 Oct 2016 05:05:37 -0400 Subject: [PATCH 795/965] allow xor-mp to dump its model to stdout --- examples/xor-mp.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/xor-mp.cc b/examples/xor-mp.cc index ecfde862f..e9b30b7b9 100644 --- a/examples/xor-mp.cc +++ b/examples/xor-mp.cc @@ -173,7 +173,7 @@ int main(int argc, char** argv) { data[2] = Datum({1, 0}, 1); data[3] = Datum({1, 1}, 0); - Learner learner(xor_model, dynet_model, trainer, true); + Learner learner(xor_model, dynet_model, trainer, false); if (num_cores == 0) { run_single_process(&learner, trainer, data, data, ITERATIONS, data.size(), data.size(), data.size()); } From 43a8d6e50a756d0927c23887fdada28f2aeb8a9c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 28 Oct 2016 20:31:04 +0900 Subject: [PATCH 796/965] Fixed extraneous assignment --- dynet/training.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynet/training.h b/dynet/training.h index 0388d0fa2..88a8bd12d 100644 --- a/dynet/training.h +++ b/dynet/training.h @@ -114,7 +114,7 @@ struct SimpleSGDTrainer : public Trainer { * \param e0 Initial learning rate * \param edecay Learning rate decay parameter. */ - explicit SimpleSGDTrainer(Model* m, real e0 = 0.1, real edecay = 0.0) : Trainer(m, e0, edecay = 0.0) {} + explicit SimpleSGDTrainer(Model* m, real e0 = 0.1, real edecay = 0.0) : Trainer(m, e0, edecay) {} protected: DYNET_TRAINER_DEFINE_DEV_IMPL() private: From ddff18d58e39059ad3f1e8999f8784014d071980 Mon Sep 17 00:00:00 2001 From: odashi Date: Fri, 28 Oct 2016 21:56:02 +0900 Subject: [PATCH 797/965] add the -O1/-O2 swith for the gcc4.9 or later versions. --- dynet/CMakeLists.txt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/dynet/CMakeLists.txt b/dynet/CMakeLists.txt index b149f2044..4a053205b 100644 --- a/dynet/CMakeLists.txt +++ b/dynet/CMakeLists.txt @@ -115,7 +115,18 @@ if(WITH_CUDA_BACKEND) COMPILE_DEFINITIONS HAVE_CUDA) # Build nvcc-compiled gpu library set(CUDA_SEPARABLE_COMPILATION ON) - list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-O2;-DVERBOSE;-DEIGEN_USE_GPU;-DHAVE_CUDA") + list(APPEND CUDA_NVCC_FLAGS "-gencode;arch=compute_30,code=sm_30;-gencode;arch=compute_35,code=sm_35;-gencode;arch=compute_37,code=sm_37;-gencode;arch=compute_50,code=sm_50;-gencode;arch=compute_52,code=sm_52;-gencode;arch=compute_52,code=compute_52;-std=c++11;-DVERBOSE;-DEIGEN_USE_GPU;-DHAVE_CUDA") + if(CMAKE_COMPILER_IS_GNUCXX) + if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9 OR CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 4.9) + # gcc 4.9 or later versions raise SEGV due to the optimization problem. + # Use -O1 instead for now. + list(APPEND CUDA_NVCC_FLAGS "-O1") + else() + list(APPEND CUDA_NVCC_FLAGS "-O2") + endif() + else() + list(APPEND CUDA_NVCC_FLAGS "-O2") + endif() if(MSVC) # If MSVC, we need the C99 math flag as in other compilations, and we need the boost flag because nvcc doesn't # properly parse part of the boost template definitions From 7f986d9cc2c665fcaaaf1db1242176e4ca5697fe Mon Sep 17 00:00:00 2001 From: armatthews Date: Fri, 28 Oct 2016 16:41:14 -0400 Subject: [PATCH 798/965] Added RandomBernoulli and RandomUniform nodes --- dynet/expr.cc | 2 ++ dynet/nodes-common.cc | 20 ++++++++++++++++++++ dynet/nodes.cc | 34 ++++++++++++++++++++++++++++++++++ dynet/nodes.h | 17 +++++++++++++++++ 4 files changed, 73 insertions(+) diff --git a/dynet/expr.cc b/dynet/expr.cc index f3685ea49..07f40cb43 100644 --- a/dynet/expr.cc +++ b/dynet/expr.cc @@ -26,6 +26,8 @@ Expression const_lookup(ComputationGraph& g, LookupParameter p, const vector* pindices) { return Expression(&g, g.add_const_lookup(p, pindices)); } Expression zeroes(ComputationGraph& g, const Dim& d) { return Expression(&g, g.add_function(d)); } Expression random_normal(ComputationGraph& g, const Dim& d) { return Expression(&g, g.add_function(d)); } +Expression random_bernoulli(ComputationGraph& g, const Dim& d, real p) { return Expression(&g, g.add_function({}, d, p)); } +Expression random_uniform(ComputationGraph& g, const Dim& d, real left, real right) { return Expression(&g, g.add_function({}, d, left, right)); } // identity function, but derivative is not propagated through it Expression nobackprop(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/dynet/nodes-common.cc b/dynet/nodes-common.cc index ea7b266df..d27fb5086 100644 --- a/dynet/nodes-common.cc +++ b/dynet/nodes-common.cc @@ -911,4 +911,24 @@ Dim RandomNormal::dim_forward(const vector& xs) const { return dim; } +string RandomBernoulli::as_string(const vector& arg_names) const { + ostringstream s; + s << "random_bernoulli(" << dim << ", " << p << ')'; + return s.str(); +} + +Dim RandomBernoulli::dim_forward(const vector& xs) const { + return dim; +} + +string RandomUniform::as_string(const vector& arg_names) const { + ostringstream s; + s << "random_uniforml(" << dim << ", " << left << ", " << right << ')'; + return s.str(); +} + +Dim RandomUniform::dim_forward(const vector& xs) const { + return dim; +} + } // namespace dynet diff --git a/dynet/nodes.cc b/dynet/nodes.cc index 8eca7ef58..0eaa2cc9f 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -2068,4 +2068,38 @@ void RandomNormal::backward_dev_impl(const MyDevice & dev, } DYNET_NODE_INST_DEV_IMPL(RandomNormal) +template +void RandomBernoulli::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 0); + TensorTools::RandomBernoulli(fx, p); +} + +template +void RandomBernoulli::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + throw std::runtime_error("Called backward() on an arity 0 node"); +} +DYNET_NODE_INST_DEV_IMPL(RandomBernoulli) + +template +void RandomUniform::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { + assert(xs.size() == 0); + TensorTools::RandomizeUniform(fx, left, right); +} + +template +void RandomUniform::backward_dev_impl(const MyDevice & dev, + const vector& xs, + const Tensor& fx, + const Tensor& dEdf, + unsigned i, + Tensor& dEdxi) const { + throw std::runtime_error("Called backward() on an arity 0 node"); +} +DYNET_NODE_INST_DEV_IMPL(RandomUniform) + } // namespace dynet diff --git a/dynet/nodes.h b/dynet/nodes.h index 389374891..242434f49 100644 --- a/dynet/nodes.h +++ b/dynet/nodes.h @@ -531,6 +531,23 @@ struct RandomNormal : public Node { Dim dim; }; +// draw from Bernoulli(p) +struct RandomBernoulli : public Node { + explicit RandomBernoulli(const std::initializer_list& a, const Dim& d, real p) : dim(d), p(p) { assert (a.size() == 0); } + DYNET_NODE_DEFINE_DEV_IMPL() + Dim dim; + real p; +}; + +// draw a random real from Uniform(left, right) +struct RandomUniform : public Node { + explicit RandomUniform(const std::initializer_list& a, const Dim& d, real left, real right) : dim(d), left(left), right(right) { assert (a.size() == 0); } + DYNET_NODE_DEFINE_DEV_IMPL() + Dim dim; + real left, right; +}; + + } // namespace dynet #endif From bffdc988ab92ae57e8adb0a75dbc564eb9682b4a Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Fri, 28 Oct 2016 18:30:18 -0700 Subject: [PATCH 799/965] Changed windows build to just not include (unsupported) rnnlm-mp in makefile. --- doc/source/install.rst | 5 ++--- examples/CMakeLists.txt | 6 +++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index 6e90208c5..077d38b6c 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -170,9 +170,8 @@ installed Eigen and Boost (for example, at c:\\libs\\Eigen and c:\\libs\\boost_1 This will generate dynet.sln and a bunch of \*.vcxproj files (one for the DYNET library, and one per example). You should be able to just open dynet.sln and build all. **Note: multi-process functionality is -currently not supported in Windows, so you will not be able to build -rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to -this project** +currently not supported in Windows, so the example rnnlm-mp will not be included +in the generated solution** The Windows build also supports CUDA. The latest (development) version of Eigen has some code that causes problems with the CUDA compiler. These issue change as Eigen is developed. Currently, the following three changes are needed in Eigen when compiling with CUDA support: diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 0ee556e7d..86dbc7312 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,7 +1,11 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) +if (NOT MSVC) + set(RNNLM_MP "rnnlm-mp") +endif() + # segrnn-sup -foreach(TARGET mlc tok-embed poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat rnnlm-mp read-write) +foreach(TARGET mlc tok-embed poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat ${RNNLM_MP} read-write) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) if (WITH_CUDA_BACKEND) target_link_libraries(${TARGET} gdynet ${LIBS}) From c85f273e60378a95b87f3ae768444c32c9d5a695 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Fri, 28 Oct 2016 18:30:53 -0700 Subject: [PATCH 800/965] Latest version of Eigen no longer needs these windows-specific changes, removing them from install help. --- doc/source/install.rst | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index 077d38b6c..6b799b96a 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -173,9 +173,7 @@ dynet.sln and build all. **Note: multi-process functionality is currently not supported in Windows, so the example rnnlm-mp will not be included in the generated solution** -The Windows build also supports CUDA. The latest (development) version of Eigen has some code that causes problems with the CUDA compiler. These issue change as Eigen is developed. Currently, the following three changes are needed in Eigen when compiling with CUDA support: +The Windows build also supports CUDA with the latest version of Eigen (as of Oct 28, 2016), with the following code change: -- block.h: add `#ifndef __CUDACC__` / `#endif` around `EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Block)` -- ref.h: add `#ifndef __CUDACC__ / #endif` around `EIGEN_INHERIT_ASSIGNMENT_OPERATORS(RefBase)` - TensorDeviceCuda.h: Change `sleep(1)` to `Sleep(1000)` From bf78d621f831d823fa3c86ae1b7d8ab05222816d Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Sat, 29 Oct 2016 12:59:27 -0700 Subject: [PATCH 801/965] Updating instructions to say that neither multi-process example will be compiled in Windows. --- doc/source/install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index 6b799b96a..353a4e8cd 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -170,7 +170,7 @@ installed Eigen and Boost (for example, at c:\\libs\\Eigen and c:\\libs\\boost_1 This will generate dynet.sln and a bunch of \*.vcxproj files (one for the DYNET library, and one per example). You should be able to just open dynet.sln and build all. **Note: multi-process functionality is -currently not supported in Windows, so the example rnnlm-mp will not be included +currently not supported in Windows, so the multi-process examples (*-mp) will not be included in the generated solution** The Windows build also supports CUDA with the latest version of Eigen (as of Oct 28, 2016), with the following code change: From 69e304286b218f9a706fd485a20704d46a092d80 Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Sun, 30 Oct 2016 20:15:53 +0100 Subject: [PATCH 802/965] fix warning on strict compilers --- dynet/rnn.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynet/rnn.h b/dynet/rnn.h index d2d9497da..3ca3176f1 100644 --- a/dynet/rnn.h +++ b/dynet/rnn.h @@ -308,7 +308,7 @@ struct SimpleRNNBuilder : public RNNBuilder { void start_new_sequence_impl(const std::vector& h_0) override; Expression add_input_impl(int prev, const Expression& x) override; Expression set_h_impl(int prev, const std::vector& h_new) override; - Expression set_s_impl(int prev, const std::vector& s_new) {return set_h_impl(prev, s_new);} + Expression set_s_impl(int prev, const std::vector& s_new) override {return set_h_impl(prev, s_new);} public: /** From e6ab58b9026de149ae850fc41633cb95931db626 Mon Sep 17 00:00:00 2001 From: Avi Hayoun Date: Tue, 1 Nov 2016 12:01:26 +0200 Subject: [PATCH 803/965] fix lingering python2 vs python3 compatibility issue --- python/dynet.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/dynet.pyx b/python/dynet.pyx index 54a6b87ef..0b9e1a918 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -42,7 +42,7 @@ cimport dynet cdef init(random_seed=None): cdef int argc = len(sys.argv) cdef char** c_argv - args = [bytes(x, encoding="utf-8") for x in sys.argv] + args = [bytearray(x, encoding="utf-8") for x in sys.argv] c_argv = malloc(sizeof(char*) * len(args)) # TODO check failure? for idx, s in enumerate(args): c_argv[idx] = s From 5b3284945b3027b710f770ce471e350267e0d530 Mon Sep 17 00:00:00 2001 From: Avi Hayoun Date: Tue, 1 Nov 2016 14:07:11 +0200 Subject: [PATCH 804/965] I broke the dynet python package. This fixes it as well the problem with extension name != filename in cython --- python/{dynet.pxd => _dynet.pxd} | 0 python/{dynet.pyx => _dynet.pyx} | 0 python/setup.py.in | 8 ++++---- 3 files changed, 4 insertions(+), 4 deletions(-) rename python/{dynet.pxd => _dynet.pxd} (100%) rename python/{dynet.pyx => _dynet.pyx} (100%) diff --git a/python/dynet.pxd b/python/_dynet.pxd similarity index 100% rename from python/dynet.pxd rename to python/_dynet.pxd diff --git a/python/dynet.pyx b/python/_dynet.pyx similarity index 100% rename from python/dynet.pyx rename to python/_dynet.pyx diff --git a/python/setup.py.in b/python/setup.py.in index 7b871819d..eea364ed0 100644 --- a/python/setup.py.in +++ b/python/setup.py.in @@ -18,8 +18,8 @@ if platform.system() == 'Darwin': ext_cpu = Extension( - "dynet", # name of extension - ["dynet.pyx"], # filename of our Pyrex/Cython source + "_dynet", # name of extension + ["_dynet.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main dynet directory. "${EIGEN3_INCLUDE_DIR}", # this is the directory where eigen is saved. @@ -32,8 +32,8 @@ ext_cpu = Extension( ) ext_gpu = Extension( - "gdynet", # name of extension - ["gdynet.pyx"], # filename of our Pyrex/Cython source + "_gdynet", # name of extension + ["_gdynet.pyx"], # filename of our Pyrex/Cython source language="c++", # this causes Pyrex/Cython to create C++ source include_dirs=["${PROJECT_SOURCE_DIR}", # this is the location of the main dynet directory. "${EIGEN3_INCLUDE_DIR}", # this is the directory where eigen is saved. From b8ead0412fd664298cd975ef3ec20283438bc3fa Mon Sep 17 00:00:00 2001 From: Avi Hayoun Date: Tue, 1 Nov 2016 14:08:56 +0200 Subject: [PATCH 805/965] forgot these two files in the last commit --- python/CMakeLists.txt | 6 +++--- python/_dynet.pyx | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index 27c18e663..1442a7d8d 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -7,8 +7,8 @@ endif() if(PYTHON) # Things to copy the files file(GLOB DepFiles ${CMAKE_CURRENT_SOURCE_DIR}/dynet.py - ${CMAKE_CURRENT_SOURCE_DIR}/dynet.pyx - ${CMAKE_CURRENT_SOURCE_DIR}/dynet.pxd + ${CMAKE_CURRENT_SOURCE_DIR}/_dynet.pyx + ${CMAKE_CURRENT_SOURCE_DIR}/_dynet.pxd ${CMAKE_CURRENT_SOURCE_DIR}/dynet_viz.py ${CMAKE_CURRENT_SOURCE_DIR}/pybridge.h ) @@ -29,7 +29,7 @@ endif() add_custom_command(TARGET copy PRE_BUILD COMMAND ${CMAKE_COMMAND} -E - copy ${CMAKE_CURRENT_SOURCE_DIR}/dynet.pyx ${CMAKE_CURRENT_BINARY_DIR}/gdynet.pyx) + copy ${CMAKE_CURRENT_SOURCE_DIR}/_dynet.pyx ${CMAKE_CURRENT_BINARY_DIR}/_gdynet.pyx) # Things to perform setup diff --git a/python/_dynet.pyx b/python/_dynet.pyx index 0b9e1a918..cd087a595 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -35,8 +35,8 @@ import os.path # - embedcl # - embed/nlm -- negative sampling? -from dynet cimport * -cimport dynet +from _dynet cimport * +cimport _dynet as dynet cdef init(random_seed=None): From 362ede08ded9b4435caafecce8b0f62266872798 Mon Sep 17 00:00:00 2001 From: Avi Hayoun Date: Tue, 1 Nov 2016 14:09:17 +0200 Subject: [PATCH 806/965] make dynet_viz be python 3 compatible --- python/dynet_viz.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/python/dynet_viz.py b/python/dynet_viz.py index 1acb31d4d..1139183c2 100644 --- a/python/dynet_viz.py +++ b/python/dynet_viz.py @@ -1,7 +1,19 @@ from __future__ import print_function +import sys import re from collections import defaultdict +if sys.version_info.major > 2: + # alias dict.items() as dict.iteritems() in python 3+ + class compat_dict(defaultdict): + pass + + compat_dict.iteritems = defaultdict.items + defaultdict = compat_dict + + # add xrange to python 3+ + xrange = range + graphviz_items = [] vindex_count = -1 @@ -54,11 +66,11 @@ def make_dim(a, b=None, inferred=False): (nrows, ncols) = a return SimpleConcreteDim(nrows, ncols, inferred) elif b is None: - assert isinstance(a, int) + assert isinstance(a, int) or (isinstance(a, float) and int(a) == a) return SimpleConcreteDim(a, 1, inferred) else: - assert isinstance(a, int) - assert isinstance(b, int) + assert isinstance(a, int) or (isinstance(a, float) and int(a) == a) + assert isinstance(b, int) or (isinstance(b, float) and int(b) == b) return SimpleConcreteDim(a, b, inferred) @@ -728,6 +740,7 @@ def __init__(self, name, input_dim, label, output_dim, children, features, node_ def __iter__(self): return iter([self.name, self.input_dim, self.label, self.output_dim, self.children, self.features, self.node_type, self.expr_name]) def __repr__(self): return 'GVNode(%s)' % ', '.join(map(str, self)) def __str__(self): return repr(self) + def __lt__(self, other): return id(self) < id(other) def make_network_graph(compact, expression_names, lookup_names): """ From ada442ae70c1aff157127dc76c94f38bfcf089e5 Mon Sep 17 00:00:00 2001 From: Avi Hayoun Date: Wed, 2 Nov 2016 15:25:30 +0200 Subject: [PATCH 807/965] fixed load and save to work in python 3 as well, considering the change to bytes() --- python/_dynet.pyx | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index 2c5c9d5fb..e6d08e7b5 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -327,13 +327,13 @@ cdef class Model: # {{{ else: raise TypeError("Cannot save model component of type %s" % type(c)) - def save(self, string fname, components=None): + def save(self, fname, components=None): if not components: - self.save_all(fname) + self.save_all(fname.encode()) return fh = open(fname+".pym","w") pfh = open(fname+".pyk","w") - cdef CModelSaver *saver = new CModelSaver(fname, self.thisptr) + cdef CModelSaver *saver = new CModelSaver(fname.encode(), self.thisptr) for c in components: self._save_one(c,saver,fh,pfh) saver.done() @@ -347,7 +347,7 @@ cdef class Model: # {{{ cdef GRUBuilder gb_ cdef LSTMBuilder lb_ cdef SimpleRNNBuilder sb_ - tp = itypes.next() + tp = next(itypes) if tp == "param": loader.fill_parameter(p) param = Parameters.wrap_ptr(p) @@ -380,14 +380,14 @@ cdef class Model: # {{{ print("Huh?") assert False,"unsupported type " + tp - cpdef load(self, string fname): + cpdef load(self, fname): if not os.path.isfile(fname+".pym"): - self.load_all(fname) + self.load_all(fname.encode()) return with open(fname+".pym","r") as fh: types = fh.read().strip().split() - cdef CModelLoader *loader = new CModelLoader(fname, self.thisptr) + cdef CModelLoader *loader = new CModelLoader(fname.encode(), self.thisptr) with open(fname+".pyk","r") as pfh: params = [] itypes = iter(types) @@ -604,17 +604,13 @@ cdef class Expression: #{{{ def __str__(self): return "exprssion %s/%s" % (self.vindex, self.cg_version) -# def __getitem__(self, int i): -# return pick(self, i) + # __getitem__ and __getslice__ in one for python 3 compatibility def __getitem__(self, object index): if isinstance(index, int): return pick(self, index) return pickrange(self, index[0], index[1]) -# def __getslice__(self, int i, int j): -# return pickrange(self, i, j) - cpdef scalar_value(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") if recalculate: self.cg().forward(self.vindex) # TODO: make recalculate run on the entire graph, not only up to here? From b833b19a87345df91e72cdf15084011f15176aae Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 4 Nov 2016 18:42:09 -0500 Subject: [PATCH 808/965] Removed a compile warning --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 79a4d54b3..38ef3b08e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ project(dynet) cmake_minimum_required(VERSION 2.8 FATAL_ERROR) +set(CMAKE_MACOSX_RPATH 1) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # DYNET uses Eigen which exploits modern CPU architectures. To get the From 08e7057633e391c43d19586dac96f45f239eefb5 Mon Sep 17 00:00:00 2001 From: armatthews Date: Fri, 4 Nov 2016 22:50:32 -0400 Subject: [PATCH 809/965] added treelstm --- dynet/CMakeLists.txt | 2 + dynet/treelstm.cc | 362 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 364 insertions(+) create mode 100644 dynet/treelstm.cc diff --git a/dynet/CMakeLists.txt b/dynet/CMakeLists.txt index 4a053205b..34a3da300 100644 --- a/dynet/CMakeLists.txt +++ b/dynet/CMakeLists.txt @@ -32,6 +32,7 @@ set(dynet_library_SRCS shadow-params.cc tensor.cc training.cc + treelstm.cc weight-decay.cc ) @@ -72,6 +73,7 @@ set(dynet_library_HDRS tensor.h timing.h training.h + treelstm.h except.h nodes-macros.h weight-decay.h diff --git a/dynet/treelstm.cc b/dynet/treelstm.cc new file mode 100644 index 000000000..36bfe9a35 --- /dev/null +++ b/dynet/treelstm.cc @@ -0,0 +1,362 @@ +#include +#include +#include +#include + +#include "dynet/nodes.h" +#include "dynet/treelstm.h" + +using namespace std; +using namespace dynet; +using namespace dynet::expr; + +BOOST_CLASS_EXPORT_IMPLEMENT(TreeLSTMBuilder) +BOOST_CLASS_EXPORT_IMPLEMENT(SocherTreeLSTMBuilder) +BOOST_CLASS_EXPORT_IMPLEMENT(UnidirectionalTreeLSTMBuilder) +BOOST_CLASS_EXPORT_IMPLEMENT(BidirectionalTreeLSTMBuilder) + +enum { X2I, BI, X2F, BF, X2O, BO, X2C, BC }; +enum { H2I, H2F, H2O, H2C, C2I, C2F, C2O }; +// See "Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks" +// by Tai, Socher, and Manning (2015), section 3.2, for details on this model. +// http://arxiv.org/pdf/1503.00075v3.pdf +SocherTreeLSTMBuilder::SocherTreeLSTMBuilder(unsigned N, + unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model) : layers(layers), N(N), cg(nullptr) { + unsigned layer_input_dim = input_dim; + for (unsigned i = 0; i < layers; ++i) { + // i + Parameter p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); + LookupParameter p_h2i = model->add_lookup_parameters(N, {hidden_dim, hidden_dim}); + LookupParameter p_c2i = model->add_lookup_parameters(N, {hidden_dim, hidden_dim}); + Parameter p_bi = model->add_parameters({hidden_dim}); + + // f + Parameter p_x2f = model->add_parameters({hidden_dim, layer_input_dim}); + LookupParameter p_h2f = model->add_lookup_parameters(N*N, {hidden_dim, hidden_dim}); + LookupParameter p_c2f = model->add_lookup_parameters(N*N, {hidden_dim, hidden_dim}); + Parameter p_bf = model->add_parameters({hidden_dim}); + + // o + Parameter p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); + LookupParameter p_h2o = model->add_lookup_parameters(N, {hidden_dim, hidden_dim}); + LookupParameter p_c2o = model->add_lookup_parameters(N, {hidden_dim, hidden_dim}); + Parameter p_bo = model->add_parameters({hidden_dim}); + + // c (a.k.a. u) + Parameter p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); + LookupParameter p_h2c = model->add_lookup_parameters(N, {hidden_dim, hidden_dim}); + Parameter p_bc = model->add_parameters({hidden_dim}); + layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next + + vector ps = {p_x2i, p_bi, p_x2f, p_bf, p_x2o, p_bo, p_x2c, p_bc}; + vector lps = {p_h2i, p_h2f, p_h2o, p_h2c, p_c2i, p_c2f, p_c2o}; + params.push_back(ps); + lparams.push_back(lps); + } // layers +} + +void SocherTreeLSTMBuilder::new_graph_impl(ComputationGraph& cg) { + this->cg = &cg; + param_vars.clear(); + lparam_vars.clear(); + param_vars.reserve(layers); + lparam_vars.reserve(layers); + + for (unsigned i = 0; i < layers; ++i){ + auto& p = params[i]; + auto& lp = lparams[i]; + + //i + Expression i_x2i = parameter(cg, p[X2I]); + Expression i_bi = parameter(cg, p[BI]); + //f + Expression i_x2f = parameter(cg, p[X2F]); + Expression i_bf = parameter(cg, p[BF]); + //o + Expression i_x2o = parameter(cg, p[X2O]); + Expression i_bo = parameter(cg, p[BO]); + //c + Expression i_x2c = parameter(cg, p[X2C]); + Expression i_bc = parameter(cg, p[BC]); + + vector vars = {i_x2i, i_bi, i_x2f, i_bf, i_x2o, i_bo, i_x2c, i_bc}; + param_vars.push_back(vars); + + assert (lp.size() == C2O + 1); + vector> lvars(lp.size()); + for (unsigned p_type = H2I; p_type <= C2O; p_type++) { + LookupParameter p = lp[p_type]; + vector vals(p.get()->values.size()); + for (unsigned k = 0; k < p.get()->values.size(); ++k) { + //vals[k] = lookup(cg, p, k); + vals[k].i = 0; + } + lvars[p_type] = vals; + } + lparam_vars.push_back(lvars); + } +} + +Expression SocherTreeLSTMBuilder::Lookup(unsigned layer, unsigned p_type, unsigned value) { + if (lparam_vars[layer][p_type][value].i == 0) { + LookupParameter p = lparams[layer][p_type]; + lparam_vars[layer][p_type][value] = lookup(*cg, p, value); + } + return lparam_vars[layer][p_type][value]; +} + +// layout: 0..layers = c +// layers+1..2*layers = h +void SocherTreeLSTMBuilder::start_new_sequence_impl(const vector& hinit) { + h.clear(); + c.clear(); + if (hinit.size() > 0) { + assert(layers*2 == hinit.size()); + h0.resize(layers); + c0.resize(layers); + for (unsigned i = 0; i < layers; ++i) { + c0[i] = hinit[i]; + h0[i] = hinit[i + layers]; + } + has_initial_state = true; + } else { + has_initial_state = false; + } +} + +Expression SocherTreeLSTMBuilder::add_input(int id, vector children, const Expression& x) { + assert (id >= 0 && h.size() == (unsigned)id); + assert (id >= 0 && c.size() == (unsigned)id); + h.push_back(vector(layers)); + c.push_back(vector(layers)); + vector& ht = h.back(); + vector& ct = c.back(); + + Expression in = x; + for (unsigned i = 0; i < layers; ++i) { + const vector& vars = param_vars[i]; + vector i_h_children, i_c_children; + i_h_children.reserve(children.size() > 1 ? children.size() : 1); + i_c_children.reserve(children.size() > 1 ? children.size() : 1); + + bool has_prev_state = (children.size() > 0 || has_initial_state); + if (children.size() == 0) { + i_h_children.push_back(Expression()); + i_c_children.push_back(Expression()); + if (has_initial_state) { + // intial value for h and c at timestep 0 in layer i + // defaults to zero matrix input if not set in add_parameter_edges + i_h_children[0] = h0[i]; + i_c_children[0] = c0[i]; + } + } + else { // t > 0 + for (int child : children) { + i_h_children.push_back(h[child][i]); + i_c_children.push_back(c[child][i]); + } + } + + // input + Expression i_ait; + if (has_prev_state) { + vector xs = {vars[BI], vars[X2I], in}; + xs.reserve(4 * children.size() + 3); + for (unsigned j = 0; j < children.size(); ++j) { + unsigned ej = (j < N) ? j : N - 1; + xs.push_back(Lookup(i, H2I, ej)); + xs.push_back(i_h_children[j]); + xs.push_back(Lookup(i, C2I, ej)); + xs.push_back(i_c_children[j]); + } + assert (xs.size() == 4 * children.size() + 3); + i_ait = affine_transform(xs); + } + else + i_ait = affine_transform({vars[BI], vars[X2I], in}); + Expression i_it = logistic(i_ait); + + // forget + vector i_ft; + for (unsigned k = 0; k < children.size(); ++k) { + unsigned ek = (k < N) ? k : N - 1; + Expression i_aft; + if (has_prev_state) { + vector xs = {vars[BF], vars[X2F], in}; + xs.reserve(4 * children.size() + 3); + for (unsigned j = 0; j < children.size(); ++j) { + unsigned ej = (j < N) ? j : N - 1; + xs.push_back(Lookup(i, H2F, ej * N + ek)); + xs.push_back(i_h_children[j]); + xs.push_back(Lookup(i, C2F, ej * N + ek)); + xs.push_back(i_c_children[j]); + } + assert (xs.size() == 4 * children.size() + 3); + i_aft = affine_transform(xs); + } + else + i_ait = affine_transform({vars[BF], vars[X2F], in}); + i_ft.push_back(logistic(i_aft)); + } + + // write memory cell + Expression i_awt; + if (has_prev_state) { + vector xs = {vars[BC], vars[X2C], in}; + // This is the one and only place that should *not* condition on i_c_children + // This should condition only on x (a.k.a. in), the bias (vars[BC]) and i_h_children + xs.reserve(2 * children.size() + 3); + for (unsigned j = 0; j < children.size(); ++j) { + unsigned ej = (j < N) ? j : N - 1; + xs.push_back(Lookup(i, H2C, ej)); + xs.push_back(i_h_children[j]); + } + assert (xs.size() == 2 * children.size() + 3); + i_awt = affine_transform(xs); + } + else + i_awt = affine_transform({vars[BC], vars[X2C], in}); + Expression i_wt = tanh(i_awt); + + // compute new cell value + if (has_prev_state) { + Expression i_nwt = cwise_multiply(i_it, i_wt); + vector i_crts(children.size()); + for (unsigned j = 0; j < children.size(); ++j) { + i_crts[j] = cwise_multiply(i_ft[j], i_c_children[j]); + } + Expression i_crt = sum(i_crts); + ct[i] = i_crt + i_nwt; + } + else { + ct[i] = cwise_multiply(i_it, i_wt); + } + + // output + Expression i_aot; + if (has_prev_state) { + vector xs = {vars[BO], vars[X2O], in}; + xs.reserve(4 * children.size() + 3); + for (unsigned j = 0; j < children.size(); ++j) { + unsigned ej = (j < N) ? j : N - 1; + xs.push_back(Lookup(i, H2O, ej)); + xs.push_back(i_h_children[j]); + xs.push_back(Lookup(i, C2O, ej)); + xs.push_back(i_c_children[j]); + } + assert (xs.size() == 4 * children.size() + 3); + i_aot = affine_transform(xs); + } + else + i_aot = affine_transform({vars[BO], vars[X2O], in}); + Expression i_ot = logistic(i_aot); + + // Compute new h value + Expression ph_t = tanh(ct[i]); + in = ht[i] = cwise_multiply(i_ot, ph_t); + } + return ht.back(); +} + +void SocherTreeLSTMBuilder::copy(const RNNBuilder & rnn) { + const SocherTreeLSTMBuilder & rnn_treelstm = (const SocherTreeLSTMBuilder&)rnn; + assert(params.size() == rnn_treelstm.params.size()); + for(size_t i = 0; i < params.size(); ++i) { + for(size_t j = 0; j < params[i].size(); ++j) { + params[i][j] = rnn_treelstm.params[i][j]; + } + } +} + +Expression TreeLSTMBuilder::add_input_impl(int prev, const Expression& x) { assert (false); } +Expression TreeLSTMBuilder::back() const { assert(false); } +std::vector TreeLSTMBuilder::final_h() const { assert(false); } +std::vector TreeLSTMBuilder::final_s() const { assert(false); } +unsigned TreeLSTMBuilder::num_h0_components() const { assert (false); } +void TreeLSTMBuilder::copy(const RNNBuilder&) { assert(false); } + +UnidirectionalTreeLSTMBuilder::UnidirectionalTreeLSTMBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model) : cg(nullptr) { + node_builder = LSTMBuilder(layers, input_dim, hidden_dim, model); +} + +void UnidirectionalTreeLSTMBuilder::new_graph_impl(ComputationGraph& cg) { + node_builder.new_graph(cg); +} + +// layout: 0..layers = c +// layers+1..2*layers = h +void UnidirectionalTreeLSTMBuilder::start_new_sequence_impl(const vector& hinit) { + h.clear(); + node_builder.start_new_sequence(hinit); +} + +Expression UnidirectionalTreeLSTMBuilder::add_input(int id, vector children, const Expression& x) { + assert (id >= 0 && h.size() == (unsigned)id); + + RNNPointer prev = (RNNPointer)(-1); + Expression embedding = node_builder.add_input(prev, x); + prev = node_builder.state(); + + for (unsigned child : children) { + embedding = node_builder.add_input(prev, h[child]); + prev = node_builder.state(); + } + h.push_back(embedding); + return embedding; +} + +BidirectionalTreeLSTMBuilder::BidirectionalTreeLSTMBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model) : cg(nullptr) { + assert (hidden_dim % 2 == 0); + fwd_node_builder = LSTMBuilder(layers, input_dim, hidden_dim / 2, model); + rev_node_builder = LSTMBuilder(layers, input_dim, hidden_dim / 2, model); +} + +void BidirectionalTreeLSTMBuilder::new_graph_impl(ComputationGraph& cg) { + fwd_node_builder.new_graph(cg); + rev_node_builder.new_graph(cg); +} + +// layout: 0..layers = c +// layers+1..2*layers = h +void BidirectionalTreeLSTMBuilder::start_new_sequence_impl(const vector& hinit) { + h.clear(); + fwd_node_builder.start_new_sequence(hinit); + rev_node_builder.start_new_sequence(hinit); +} + +Expression BidirectionalTreeLSTMBuilder::add_input(int id, vector children, const Expression& x) { + assert (id >= 0 && h.size() == (unsigned)id); + + RNNPointer prev = (RNNPointer)(-1); + Expression fwd_embedding = fwd_node_builder.add_input(prev, x); + prev = fwd_node_builder.state(); + for (unsigned child : children) { + fwd_embedding = fwd_node_builder.add_input(prev, h[child]); + prev = fwd_node_builder.state(); + } + + prev = (RNNPointer)(-1); + Expression rev_embedding = rev_node_builder.add_input(prev, x); + prev = rev_node_builder.state(); + for (unsigned i = children.size(); i-- > 0;) { + unsigned child = children[i]; + rev_embedding = rev_node_builder.add_input(prev, h[child]); + prev = rev_node_builder.state(); + } + + Expression embedding = concatenate({fwd_embedding, rev_embedding}); + h.push_back(embedding); + + return embedding; +} + +Expression BidirectionalTreeLSTMBuilder::set_h_impl(int prev, const vector& h_new) { assert (false); } From 213a01d079e31534ca07ab466d96bc83d8f6b739 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 5 Nov 2016 00:51:58 -0500 Subject: [PATCH 810/965] A few comments about expressions --- dynet/expr.h | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 147 insertions(+), 2 deletions(-) diff --git a/dynet/expr.h b/dynet/expr.h index b4672c315..ce7dbfa57 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -37,8 +37,8 @@ struct Expression { /** * \ingroup operations - * \brief Input node - * \details [long description] + * \brief Scalar input + * \details Create an expression that represents the scalar value s * * \param g Computation graph * \param s Real number @@ -46,21 +46,166 @@ struct Expression { * \return The new expression */ Expression input(ComputationGraph& g, real s); + +/** + * \ingroup operations + * \brief Modifiable scalar input + * \details Create an expression that represents the scalar value *ps. + * If *ps is changed and the computation graph recalculated, the + * next forward pass will reflect the new value. + * + * \param g Computation graph + * \param ps Real number pointer + * + * \return The new expression + */ Expression input(ComputationGraph& g, const real *ps); + +/** + * \ingroup operations + * \brief Vector/matrix/tensor input + * \details Create an expression that represents a vector, matrix, or tensor + * input. The dimensions of the input are defined by `d`. So for example + * > input(g,{50},data): will result in a 50-length vector + * > input(g,{50,30},data): will result in a 50x30 matrix + * and so on, for an arbitrary number of dimensions. + * This function can also be used to import minibatched inputs. For example, + * if we have 10 examples in a minibatch, each with size 50x30, then we call + * > input(g,Dim({50,30},10),data) + * The data vector "data" will contain the values used to fill the input, in + * column-major format. The length must add to the product of all dimensions in + * d. + * + * \param g Computation graph + * \param d Dimension of the input matrix + * \param data A vector of data points + * + * \return The new expression + */ Expression input(ComputationGraph& g, const Dim& d, const std::vector& data); + +/** + * \ingroup operations + * \brief Updatable vector/matrix/tensor input + * \details Similarly to input that takes a vector reference, input a vector, matrix, + * or tensor input. Because we pass the pointer, the data can be updated. + * + * \param g Computation graph + * \param d Dimension of the input matrix + * \param data A pointer to an (updatable) vector of data points + * + * \return The new expression + */ Expression input(ComputationGraph& g, const Dim& d, const std::vector* pdata); + +/** + * \ingroup operations + * \brief Sparse vector input + * \details This operation takes input as a sparse matrix of index/value pairs. It is + * exactly the same as the standard input via vector reference, but sets all + * non-specified values to "defdata" and resets all others to the appropriate + * input values. + * + * \param g Computation graph + * \param d Dimension of the input matrix + * \param ids The indexes of the data points to update + * \param data The data points corresponding to each index + * \param defdata The default data with which to set the unspecified data points + * + * \return The new expression + */ Expression input(ComputationGraph& g, const Dim& d, const std::vector& ids, const std::vector& data, float defdata = 0.f); + +/** + * \ingroup operations + * \brief Load parameter + * \details Load parameters into the computation graph. + * + * \param g Computation graph + * \param p Parameter object to load + * + * \return The new expression + */ Expression parameter(ComputationGraph& g, Parameter p); + +/** + * \ingroup operations + * \brief Load constant parameters + * \details Load parameters into the computation graph, but prevent them from being + * updated when performing parameter update. + * + * \param g Computation graph + * \param p Parameter object to load + * + * \return The new expression + */ Expression const_parameter(ComputationGraph& g, Parameter p); + +/** + * \ingroup operations + * \brief Look up parameter + * \details Look up parameters according to an index, and load them into the + * computation graph. + * + * \param g Computation graph + * \param p LookupParameter object from which to load + * \param index Index of the parameters within p + * + * \return The new expression + */ Expression lookup(ComputationGraph& g, LookupParameter p, unsigned index); + +/** + * \ingroup operations + * \brief Look up parameters with modifiable index + * \details Look up parameters according to the *pindex, and load them into the + * computation graph. When *pindex changes, on the next computation of + * forward() the values will change. + * + * \param g Computation graph + * \param p LookupParameter object from which to load + * \param pindex Pointer index of the parameters within p + * + * \return The new expression + */ Expression lookup(ComputationGraph& g, LookupParameter p, const unsigned* pindex); + +/** + * \ingroup operations + * \brief Look up parameter + * \details Look up parameters according to an index, and load them into the + * computation graph. Do not perform gradient update on the parameters. + * + * \param g Computation graph + * \param p LookupParameter object from which to load + * \param index Index of the parameters within p + * + * \return The new expression + */ Expression const_lookup(ComputationGraph& g, LookupParameter p, unsigned index); + +/** + * \ingroup operations + * \brief Constant lookup parameters with modifiable index + * \details Look up parameters according to the *pindex, and load them into the + * computation graph. When *pindex changes, on the next computation of + * forward() the values will change. However, gradient updates will not be + performend. + * + * \param g Computation graph + * \param p LookupParameter object from which to load + * \param pindex Pointer index of the parameters within p + * + * \return The new expression + */ Expression const_lookup(ComputationGraph& g, LookupParameter p, const unsigned* pindex); + // Batched versions of lookup and const_lookup Expression lookup(ComputationGraph& g, LookupParameter p, const std::vector& indices); Expression lookup(ComputationGraph& g, LookupParameter p, const std::vector* pindices); Expression const_lookup(ComputationGraph& g, LookupParameter p, const std::vector& indices); Expression const_lookup(ComputationGraph& g, LookupParameter p, const std::vector* pindices); + Expression zeroes(ComputationGraph& g, const Dim& d); Expression random_normal(ComputationGraph& g, const Dim& d); From b3acb0235cb7f3530a38530326873236e729d25b Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 5 Nov 2016 09:13:06 -0500 Subject: [PATCH 811/965] Did some documentation --- doc/source/operations.rst | 21 ++++++++++- dynet/expr.h | 74 +++++++++++++++++++++++++++++++++------ 2 files changed, 83 insertions(+), 12 deletions(-) diff --git a/doc/source/operations.rst b/doc/source/operations.rst index eda5eb4cb..53238f72a 100644 --- a/doc/source/operations.rst +++ b/doc/source/operations.rst @@ -1,6 +1,25 @@ DyNet Operations ================ +Operation Interface +------------------- + +The following functions define DyNet "Expressions," which are used as an interface to +the various functions that can be used to build DyNet computation graphs. Expressions +for each specific function are listed below. + .. doxygengroup:: operations :members: - :content-only: \ No newline at end of file + :content-only: + +Input Operations +---------------- + +These operations allow you to input something into the computation graph, either simple +scalar/vector/matrix inputs from floats, or parameter inputs from a DyNet parameter +object. They all requre passing a computation graph as input so you know which graph +is being used for this particular calculation. + +.. doxygengroup:: inputoperations + :members: + :content-only: diff --git a/dynet/expr.h b/dynet/expr.h index ce7dbfa57..b6c96079d 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -36,7 +36,7 @@ struct Expression { }; /** - * \ingroup operations + * \ingroup inputoperations * \brief Scalar input * \details Create an expression that represents the scalar value s * @@ -48,7 +48,7 @@ struct Expression { Expression input(ComputationGraph& g, real s); /** - * \ingroup operations + * \ingroup inputoperations * \brief Modifiable scalar input * \details Create an expression that represents the scalar value *ps. * If *ps is changed and the computation graph recalculated, the @@ -62,7 +62,7 @@ Expression input(ComputationGraph& g, real s); Expression input(ComputationGraph& g, const real *ps); /** - * \ingroup operations + * \ingroup inputoperations * \brief Vector/matrix/tensor input * \details Create an expression that represents a vector, matrix, or tensor * input. The dimensions of the input are defined by `d`. So for example @@ -85,7 +85,7 @@ Expression input(ComputationGraph& g, const real *ps); Expression input(ComputationGraph& g, const Dim& d, const std::vector& data); /** - * \ingroup operations + * \ingroup inputoperations * \brief Updatable vector/matrix/tensor input * \details Similarly to input that takes a vector reference, input a vector, matrix, * or tensor input. Because we pass the pointer, the data can be updated. @@ -99,7 +99,7 @@ Expression input(ComputationGraph& g, const Dim& d, const std::vector& da Expression input(ComputationGraph& g, const Dim& d, const std::vector* pdata); /** - * \ingroup operations + * \ingroup inputoperations * \brief Sparse vector input * \details This operation takes input as a sparse matrix of index/value pairs. It is * exactly the same as the standard input via vector reference, but sets all @@ -117,7 +117,7 @@ Expression input(ComputationGraph& g, const Dim& d, const std::vector* pd Expression input(ComputationGraph& g, const Dim& d, const std::vector& ids, const std::vector& data, float defdata = 0.f); /** - * \ingroup operations + * \ingroup inputoperations * \brief Load parameter * \details Load parameters into the computation graph. * @@ -129,7 +129,7 @@ Expression input(ComputationGraph& g, const Dim& d, const std::vector& indices); + +/** + * \ingroup inputoperations + * \brief Look up parameters + * \details The mini-batched version of lookup with modifiable parameter indices. + * + * \param g Computation graph + * \param p LookupParameter object from which to load + * \param indices Pointer to lookup indices + * + * \return The new expression + */ Expression lookup(ComputationGraph& g, LookupParameter p, const std::vector* pindices); + +/** + * \ingroup inputoperations + * \brief Look up parameters + * \details Mini-batched lookup that will not update the parameters. + * + * \param g Computation graph + * \param p LookupParameter object from which to load + * \param indices Lookup indices + * + * \return The new expression + */ Expression const_lookup(ComputationGraph& g, LookupParameter p, const std::vector& indices); + +/** + * \ingroup inputoperations + * \brief Look up parameters + * \details Mini-batched lookup that will not update the parameters, with modifiable + * indices. + * + * \param g Computation graph + * \param p LookupParameter object from which to load + * \param pindices Lookup index pointers. + * + * \return The new expression + */ Expression const_lookup(ComputationGraph& g, LookupParameter p, const std::vector* pindices); Expression zeroes(ComputationGraph& g, const Dim& d); From e510992496a688b53396ef36e9e15867a20143c5 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 5 Nov 2016 18:06:04 -0400 Subject: [PATCH 812/965] Reordering of the expressions --- doc/source/operations.rst | 57 ++++++++++ dynet/expr.h | 234 +++++++++++++++++++++++++------------- 2 files changed, 215 insertions(+), 76 deletions(-) diff --git a/doc/source/operations.rst b/doc/source/operations.rst index 53238f72a..a1bb142f7 100644 --- a/doc/source/operations.rst +++ b/doc/source/operations.rst @@ -23,3 +23,60 @@ is being used for this particular calculation. .. doxygengroup:: inputoperations :members: :content-only: + +Arithmetic Operations +--------------------- + +These operations perform basic arithemetic over values in the graph. + +.. doxygengroup:: arithmeticoperations + :members: + :content-only: + +Probability/Loss Operations +--------------------------- + +These operations are used for calculating probabilities, or calculating loss functions +for use in training. + +.. doxygengroup:: lossoperations + :members: + :content-only: + +Flow/Shaping Operations +----------------------- + +These operations control the flow of information through the graph, or the shape of +the vectors/tensors used in the graph. + +.. doxygengroup:: flowoperations + :members: + :content-only: + +Noise Operations +---------------- + +These operations are used to add noise to the graph for purposes of making learning +more robust. + +.. doxygengroup:: noiseoperations + :members: + :content-only: + +Tensor Operations +----------------- + +These operations are used for performing operations on higher order tensors. + +.. doxygengroup:: tensoroperations + :members: + :content-only: + +Linera Algebra Operations +------------------------- + +These operations are used for performing various operations common in linear algebra. + +.. doxygengroup:: linalgoperations + :members: + :content-only: diff --git a/dynet/expr.h b/dynet/expr.h index b6c96079d..eb57349ca 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -1,6 +1,14 @@ /** * \file expr.h * \defgroup operations + * \defgroup inputoperations + * \defgroup arithmeticoperations + * \defgroup lossoperations + * \defgroup flowoperations + * \defgroup noiseoperations + * \defgroup convoperations + * \defgroup tensoroperations + * \defgroup linalgoperations * \brief The various operations that you can use in building a DyNet graph * * \details TODO: Create documentation and explain expressions, etc... @@ -35,6 +43,21 @@ struct Expression { const Tensor& value() const { return pg->get_value(i); } }; +namespace detail { + template + Expression f(const T& xs) { + ComputationGraph *pg = xs.begin()->pg; + std::vector xis(xs.size()); + int i = 0; + for (auto xi = xs.begin(); xi != xs.end(); ++xi) xis[i++] = xi->i; + return Expression(pg, pg->add_function(xis)); + } +} + +//////////////////////////////////////////////// +// Input operations // +//////////////////////////////////////////////// + /** * \ingroup inputoperations * \brief Scalar input @@ -258,11 +281,34 @@ Expression const_lookup(ComputationGraph& g, LookupParameter p, const std::vecto */ Expression const_lookup(ComputationGraph& g, LookupParameter p, const std::vector* pindices); +/** + * \ingroup inputoperations + * \brief Create an input full of zeros + * \details Create an input full of zeros, sized according to dimensions d. + * + * \param g Computation graph + * \param d The dimensions of the input + * + * \return The new expression + */ Expression zeroes(ComputationGraph& g, const Dim& d); + +/** + * \ingroup inputoperations + * \brief Create a random normal vector + * \details Create a vector distributed according to normal distribution with mean + * 0, variance 1. + * + * \param g Computation graph + * \param d The dimensions of the input + * + * \return The new expression + */ Expression random_normal(ComputationGraph& g, const Dim& d); -// special functions for controlling flow of information in graph -Expression nobackprop(const Expression& x); +//////////////////////////////////////////////// +// Arithmetic operations // +//////////////////////////////////////////////// // operators Expression operator-(const Expression& x); @@ -276,18 +322,10 @@ Expression operator*(const Expression& x, const Expression& y); Expression operator*(const Expression& x, float y); inline Expression operator*(float y, const Expression& x) { return x * y; } inline Expression operator/(const Expression& x, float y) { return x * (1.f / y); } -// colwise addition -Expression addmv(const Expression& M, const Expression& v); -// componentwise division -Expression cdiv(const Expression& x, const Expression& y); -Expression colwise_add(const Expression& x, const Expression& bias); -// z_ij = x_ijk * y_k -Expression contract3d_1d(const Expression& x, const Expression& y); -// z_i = x_ijk * y_k * z_j (+ b_i) -Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z); -Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z, const Expression& b); -// z_ij = x_ijk * y_k + b_ij -Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b); + +template +inline Expression affine_transform(const T& xs) { return detail::f(xs); } +inline Expression affine_transform(const std::initializer_list& xs) { return detail::f(xs); } Expression sqrt(const Expression& x); Expression erf(const Expression& x); @@ -299,6 +337,27 @@ Expression lgamma(const Expression& x); Expression log(const Expression& x); Expression logistic(const Expression& x); Expression rectify(const Expression& x); + +Expression softmax(const Expression& x); +Expression softsign(const Expression& x); + +Expression pow(const Expression& x, const Expression& y); +Expression min(const Expression& x, const Expression& y); +Expression max(const Expression& x, const Expression& y); + +Expression dot_product(const Expression& x, const Expression& y); + +// colwise addition +Expression addmv(const Expression& M, const Expression& v); +// componentwise division +Expression cwise_multiply(const Expression& x, const Expression& y); +Expression cdiv(const Expression& x, const Expression& y); +Expression colwise_add(const Expression& x, const Expression& bias); + +//////////////////////////////////////////////// +// Probability/loss operations // +//////////////////////////////////////////////// + Expression hinge(const Expression& x, unsigned index, float m = 1.0); Expression hinge(const Expression& x, const std::vector & indices, float m = 1.0); Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0); @@ -309,33 +368,13 @@ Expression log_softmax(const Expression& x, const std::vector& restric Expression sparsemax(const Expression& x); Expression sparsemax_loss(const Expression& x, const std::vector& target_support); Expression sparsemax_loss(const Expression& x, const std::vector* ptarget_support); -Expression softmax(const Expression& x); -Expression softsign(const Expression& x); -Expression pow(const Expression& x, const Expression& y); -Expression min(const Expression& x, const Expression& y); -Expression max(const Expression& x, const Expression& y); -Expression noise(const Expression& x, real stddev); -Expression dropout(const Expression& x, real p); -Expression block_dropout(const Expression& x, real p); -// reshape::forward is O(1), but backward is O(n) -Expression reshape(const Expression& x, const Dim& d); -// transpose requires O(n) -Expression transpose(const Expression& x); -Expression select_rows(const Expression& x, const std::vector& rows); -Expression select_rows(const Expression& x, const std::vector* prows); -// select_cols is more efficient than select_rows since Eigen uses column-major order -Expression select_cols(const Expression& x, const std::vector& cols); -Expression select_cols(const Expression& x, const std::vector* pcols); -// matrix inverse -Expression inverse(const Expression& x); -Expression logdet(const Expression& x); - -Expression trace_of_product(const Expression& x, const Expression& y); -Expression cwise_multiply(const Expression& x, const Expression& y); +Expression pickneglogsoftmax(const Expression& x, unsigned v); +Expression pickneglogsoftmax(const Expression& x, const std::vector & v); +Expression pickneglogsoftmax(const Expression& x, unsigned * pv); +Expression pickneglogsoftmax(const Expression& x, const std::vector * pv); Expression squared_norm(const Expression& x); -Expression dot_product(const Expression& x, const Expression& y); Expression squared_distance(const Expression& x, const Expression& y); Expression huber_distance(const Expression& x, const Expression& y, float c = 1.345f); Expression l1_distance(const Expression& x, const Expression& y); @@ -344,41 +383,6 @@ Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1 Expression poisson_loss(const Expression& x, unsigned y); Expression poisson_loss(const Expression& x, const unsigned* py); -// various convolutiony things -Expression conv1d_narrow(const Expression& x, const Expression& f); -Expression conv1d_wide(const Expression& x, const Expression& f); -Expression filter1d_narrow(const Expression& x, const Expression& f); -Expression kmax_pooling(const Expression& x, unsigned k); -Expression fold_rows(const Expression& x, unsigned nrows=2); -Expression sum_cols(const Expression& x); -Expression average_cols(const Expression& x); -Expression kmh_ngram(const Expression& x, unsigned n); - -// Sum the results of multiple batches -Expression sum_batches(const Expression& x); - -// pick parts out of bigger objects -Expression pick(const Expression& x, unsigned v); -Expression pick(const Expression& x, const std::vector & v); -Expression pick(const Expression& x, unsigned * pv); -Expression pick(const Expression& x, const std::vector * pv); -Expression pickrange(const Expression& x, unsigned v, unsigned u); -Expression pickneglogsoftmax(const Expression& x, unsigned v); -Expression pickneglogsoftmax(const Expression& x, const std::vector & v); -Expression pickneglogsoftmax(const Expression& x, unsigned * pv); -Expression pickneglogsoftmax(const Expression& x, const std::vector * pv); - -namespace detail { - template - Expression f(const T& xs) { - ComputationGraph *pg = xs.begin()->pg; - std::vector xis(xs.size()); - int i = 0; - for (auto xi = xs.begin(); xi != xs.end(); ++xi) xis[i++] = xi->i; - return Expression(pg, pg->add_function(xis)); - } -} - template inline Expression logsumexp(const T& xs) { return detail::f(xs); } inline Expression logsumexp(const std::initializer_list& xs) { return detail::f(xs); } @@ -395,6 +399,43 @@ template inline Expression average(const T& xs) { return detail::f(xs); } inline Expression average(const std::initializer_list& xs) { return detail::f(xs); } +//////////////////////////////////////////////// +// Flow operations // +//////////////////////////////////////////////// + +/** + * \ingroup flowoperations + * \brief Prevent backprop + * \details This node has no effect on the forward pass, but prevents gradients from + * flowing backward during the backward pass. This is useful when there's + * a subgraph for which you don't want loss passed back to the parameters. + * + * \param x The input expression + * + * \return The new expression + */ +Expression nobackprop(const Expression& x); + +// reshape::forward is O(1), but backward is O(n) +Expression reshape(const Expression& x, const Dim& d); +// transpose requires O(n) +Expression transpose(const Expression& x); +Expression select_rows(const Expression& x, const std::vector& rows); +Expression select_rows(const Expression& x, const std::vector* prows); +// select_cols is more efficient than select_rows since Eigen uses column-major order +Expression select_cols(const Expression& x, const std::vector& cols); +Expression select_cols(const Expression& x, const std::vector* pcols); + +// Sum the results of multiple batches +Expression sum_batches(const Expression& x); + +// pick parts out of bigger objects +Expression pick(const Expression& x, unsigned v); +Expression pick(const Expression& x, const std::vector & v); +Expression pick(const Expression& x, unsigned * pv); +Expression pick(const Expression& x, const std::vector * pv); +Expression pickrange(const Expression& x, unsigned v, unsigned u); + template inline Expression concatenate_cols(const T& xs) { return detail::f(xs); } inline Expression concatenate_cols(const std::initializer_list& xs) { return detail::f(xs); } @@ -403,9 +444,50 @@ template inline Expression concatenate(const T& xs) { return detail::f(xs); } inline Expression concatenate(const std::initializer_list& xs) { return detail::f(xs); } -template -inline Expression affine_transform(const T& xs) { return detail::f(xs); } -inline Expression affine_transform(const std::initializer_list& xs) { return detail::f(xs); } +//////////////////////////////////////////////// +// Noise operations // +//////////////////////////////////////////////// + +Expression noise(const Expression& x, real stddev); +Expression dropout(const Expression& x, real p); +Expression block_dropout(const Expression& x, real p); + +//////////////////////////////////////////////// +// Convolution operations // +//////////////////////////////////////////////// + +Expression conv1d_narrow(const Expression& x, const Expression& f); +Expression conv1d_wide(const Expression& x, const Expression& f); +Expression filter1d_narrow(const Expression& x, const Expression& f); +Expression kmax_pooling(const Expression& x, unsigned k); +Expression fold_rows(const Expression& x, unsigned nrows=2); +Expression sum_cols(const Expression& x); +Expression average_cols(const Expression& x); +Expression kmh_ngram(const Expression& x, unsigned n); + +//////////////////////////////////////////////// +// Tensor operations // +//////////////////////////////////////////////// + +// z_ij = x_ijk * y_k +Expression contract3d_1d(const Expression& x, const Expression& y); +// z_i = x_ijk * y_k * z_j (+ b_i) +Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z); +Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z, const Expression& b); +// z_ij = x_ijk * y_k + b_ij +Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b); + + +//////////////////////////////////////////////// +// Linear algebra operations // +//////////////////////////////////////////////// + +// matrix inverse +Expression inverse(const Expression& x); +Expression logdet(const Expression& x); + +Expression trace_of_product(const Expression& x, const Expression& y); + } } From 84ca6a2f821b4a9ab0dd4a5081e18f056761a37d Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 5 Nov 2016 19:04:34 -0400 Subject: [PATCH 813/965] Added documentation for some arithmetic --- dynet/expr.h | 159 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 140 insertions(+), 19 deletions(-) diff --git a/dynet/expr.h b/dynet/expr.h index eb57349ca..89c7c4209 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -66,7 +66,7 @@ namespace detail { * \param g Computation graph * \param s Real number * - * \return The new expression + * \return An expression representing s */ Expression input(ComputationGraph& g, real s); @@ -80,7 +80,7 @@ Expression input(ComputationGraph& g, real s); * \param g Computation graph * \param ps Real number pointer * - * \return The new expression + * \return An expression representing *ps */ Expression input(ComputationGraph& g, const real *ps); @@ -103,7 +103,7 @@ Expression input(ComputationGraph& g, const real *ps); * \param d Dimension of the input matrix * \param data A vector of data points * - * \return The new expression + * \return An expression representing data */ Expression input(ComputationGraph& g, const Dim& d, const std::vector& data); @@ -115,9 +115,9 @@ Expression input(ComputationGraph& g, const Dim& d, const std::vector& da * * \param g Computation graph * \param d Dimension of the input matrix - * \param data A pointer to an (updatable) vector of data points + * \param pdata A pointer to an (updatable) vector of data points * - * \return The new expression + * \return An expression representing *pdata */ Expression input(ComputationGraph& g, const Dim& d, const std::vector* pdata); @@ -135,7 +135,7 @@ Expression input(ComputationGraph& g, const Dim& d, const std::vector* pd * \param data The data points corresponding to each index * \param defdata The default data with which to set the unspecified data points * - * \return The new expression + * \return An expression representing data */ Expression input(ComputationGraph& g, const Dim& d, const std::vector& ids, const std::vector& data, float defdata = 0.f); @@ -147,7 +147,7 @@ Expression input(ComputationGraph& g, const Dim& d, const std::vector& indices); @@ -250,7 +250,7 @@ Expression lookup(ComputationGraph& g, LookupParameter p, const std::vector* pindices); @@ -263,7 +263,7 @@ Expression lookup(ComputationGraph& g, LookupParameter p, const std::vector& indices); @@ -277,7 +277,8 @@ Expression const_lookup(ComputationGraph& g, LookupParameter p, const std::vecto * \param p LookupParameter object from which to load * \param pindices Lookup index pointers. * - * \return The new expression + * \return A constant expression with the "i"th batch element representing + * p[*pindices[i]] */ Expression const_lookup(ComputationGraph& g, LookupParameter p, const std::vector* pindices); @@ -289,7 +290,7 @@ Expression const_lookup(ComputationGraph& g, LookupParameter p, const std::vecto * \param g Computation graph * \param d The dimensions of the input * - * \return The new expression + * \return A "d" dimensioned zero vector */ Expression zeroes(ComputationGraph& g, const Dim& d); @@ -302,7 +303,7 @@ Expression zeroes(ComputationGraph& g, const Dim& d); * \param g Computation graph * \param d The dimensions of the input * - * \return The new expression + * \return A "d" dimensioned normally distributed vector */ Expression random_normal(ComputationGraph& g, const Dim& d); @@ -310,17 +311,137 @@ Expression random_normal(ComputationGraph& g, const Dim& d); // Arithmetic operations // //////////////////////////////////////////////// -// operators +/** + * \ingroup arithmeticoperations + * \brief Negation + * \details Negate the passed argument. + * + * \param x An input expression + * + * \return The negation of x + */ Expression operator-(const Expression& x); + +/** + * \ingroup arithmeticoperations + * \brief Expression addition + * \details Add two expressions of the same dimensions. + * + * \param x The first input + * \param y The second input + * + * \return The sum of x and y + */ Expression operator+(const Expression& x, const Expression& y); + +/** + * \ingroup arithmeticoperations + * \brief Scalar addition + * \details Add a scalar to an expression + * + * \param x The expression + * \param y The scalar + * + * \return An expression equal to x, with every component increased by y + */ Expression operator+(const Expression& x, real y); + +/** + * \ingroup arithmeticoperations + * \brief Scalar addition + * \details Add a scalar to an expression + * + * \param x The scalar + * \param y The expression + * + * \return An expression equal to y, with every component increased by x + */ Expression operator+(real x, const Expression& y); + +/** + * \ingroup arithmeticoperations + * \brief Expression subtraction + * \details Subtract one expression from another. + * + * \param x The expression from which to subtract + * \param y The expression to subtract + * + * \return An expression for x minus y + */ Expression operator-(const Expression& x, const Expression& y); + +/** + * \ingroup arithmeticoperations + * \brief Scalar subtraction + * \details Subtract an expression from a scalar + * + * \param x The scalar from which to subtract + * \param y The expression to subtract + * + * \return An expression for x minus y + */ Expression operator-(real x, const Expression& y); + +/** + * \ingroup arithmeticoperations + * \brief Scalar subtraction + * \details Subtract a scalar from an expression + * + * \param x The expression from which to subtract + * \param y The scalar to subtract + * + * \return An expression for x minus y + */ Expression operator-(const Expression& x, real y); + + +/** + * \ingroup arithmeticoperations + * \brief Matrix multiplication + * \details Multiply two matrices together. Like standard matrix multiplication, the + * second dimension of x and the first dimension of y must match. + * + * \param x The left-hand matrix + * \param y The right-hand matrix + * + * \return An expression for x times y + */ Expression operator*(const Expression& x, const Expression& y); + +/** + * \ingroup arithmeticoperations + * \brief Matrix-scalar multiplication + * \details Multiply an expression component-wise by a scalar. + * + * \param x The matrix + * \param y The scalar + * + * \return An expression for x times y + */ Expression operator*(const Expression& x, float y); + +/** + * \ingroup arithmeticoperations + * \brief Matrix-scalar multiplication + * \details Multiply an expression component-wise by a scalar. + * + * \param x The scalar + * \param y The matrix + * + * \return An expression for x times y + */ inline Expression operator*(float y, const Expression& x) { return x * y; } + +/** + * \ingroup arithmeticoperations + * \brief Matrix-scalar division + * \details Divide an expression component-wise by a scalar. + * + * \param x The matrix + * \param y The scalar + * + * \return An expression for x divided by y + */ inline Expression operator/(const Expression& x, float y) { return x * (1.f / y); } template From 60cceec951cf25e0d86e433a2ecca4a0e077ec7d Mon Sep 17 00:00:00 2001 From: armatthews Date: Sun, 6 Nov 2016 10:07:29 -0500 Subject: [PATCH 814/965] added missing .h file --- dynet/treelstm.h | 148 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 dynet/treelstm.h diff --git a/dynet/treelstm.h b/dynet/treelstm.h new file mode 100644 index 000000000..9c5ac87ca --- /dev/null +++ b/dynet/treelstm.h @@ -0,0 +1,148 @@ +#pragma once +#include +#include +#include +#include "dynet/dynet.h" +#include "dynet/rnn.h" +#include "dynet/expr.h" +#include "dynet/lstm.h" + +using namespace dynet::expr; + +namespace dynet { + +struct TreeLSTMBuilder : public RNNBuilder { +public: + virtual Expression back() const override; + virtual std::vector final_h() const override; + virtual std::vector final_s() const override; + virtual unsigned num_h0_components() const override; + virtual void copy(const RNNBuilder & params) override; + virtual Expression add_input(int id, std::vector children, const Expression& x) = 0; + std::vector get_h(RNNPointer i) const override { assert (false); } + std::vector get_s(RNNPointer i) const override { assert (false); } + Expression set_s_impl(int prev, const std::vector& s_new) override { assert (false); } + protected: + virtual void new_graph_impl(ComputationGraph& cg) override = 0; + virtual void start_new_sequence_impl(const std::vector& h0) override = 0; + virtual Expression add_input_impl(int prev, const Expression& x) override; + +private: + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + } +}; + +struct SocherTreeLSTMBuilder : public TreeLSTMBuilder { + SocherTreeLSTMBuilder() = default; + explicit SocherTreeLSTMBuilder(unsigned N, //Max branching factor + unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model); + + Expression add_input(int id, std::vector children, const Expression& x); + void copy(const RNNBuilder & params) override; + protected: + void new_graph_impl(ComputationGraph& cg) override; + void start_new_sequence_impl(const std::vector& h0) override; + Expression Lookup(unsigned layer, unsigned p_type, unsigned value); + + public: + // first index is layer, then ... + std::vector> params; + std::vector> lparams; + + // first index is layer, then ... + std::vector> param_vars; + std::vector>> lparam_vars; + + // first index is time, second is layer + std::vector> h, c; + + // initial values of h and c at each layer + // - both default to zero matrix input + bool has_initial_state; // if this is false, treat h0 and c0 as 0 + std::vector h0; + std::vector c0; + unsigned layers; + unsigned N; // Max branching factor +private: + ComputationGraph* cg; + + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & params; + ar & lparams; + ar & layers; + ar & N; + } +}; + +struct UnidirectionalTreeLSTMBuilder : public TreeLSTMBuilder { + UnidirectionalTreeLSTMBuilder() = default; + explicit UnidirectionalTreeLSTMBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model); + + Expression add_input(int id, std::vector children, const Expression& x); + protected: + void new_graph_impl(ComputationGraph& cg) override; + void start_new_sequence_impl(const std::vector& h0) override; + + public: + LSTMBuilder node_builder; + std::vector h; + +private: + ComputationGraph* cg; + + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & node_builder; + } +}; + +struct BidirectionalTreeLSTMBuilder : public TreeLSTMBuilder { + BidirectionalTreeLSTMBuilder() = default; + explicit BidirectionalTreeLSTMBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model* model); + + Expression add_input(int id, std::vector children, const Expression& x); + protected: + void new_graph_impl(ComputationGraph& cg) override; + void start_new_sequence_impl(const std::vector& h0) override; + Expression set_h_impl(int prev, const std::vector& h_new) override; + + public: + LSTMBuilder fwd_node_builder; + LSTMBuilder rev_node_builder; + std::vector h; + +private: + ComputationGraph* cg; + + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & fwd_node_builder; + ar & rev_node_builder; + } +}; +} // namespace dynet + +BOOST_CLASS_EXPORT_KEY(dynet::TreeLSTMBuilder) +BOOST_CLASS_EXPORT_KEY(dynet::SocherTreeLSTMBuilder) +BOOST_CLASS_EXPORT_KEY(dynet::UnidirectionalTreeLSTMBuilder) +BOOST_CLASS_EXPORT_KEY(dynet::BidirectionalTreeLSTMBuilder) + From 15e8c665551a3cb1adddd8b9d114479e1602ee1f Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 7 Nov 2016 14:35:14 +0000 Subject: [PATCH 815/965] small compile fix for older compilers --- dynet/nodes-conv.cc | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/dynet/nodes-conv.cc b/dynet/nodes-conv.cc index 492f27995..5179e592e 100644 --- a/dynet/nodes-conv.cc +++ b/dynet/nodes-conv.cc @@ -160,7 +160,7 @@ void AverageColumns::forward_dev_impl(const MyDevice & dev, const vector().device(*dev.edevice) += xs[0]->t<2>().chip<1>(i); fx.t<1>().device(*dev.edevice) = fx.t<1>() / (float)cols; #else - array reduction_axis; reduction_axis[0] = 1; + const Eigen::array reduction_axis = {{1}}; fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().sum(reduction_axis) / (float)cols; #endif } @@ -172,7 +172,7 @@ void AverageColumns::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - array broadcasts; broadcasts[0] = 1; broadcasts[1] = xs[0]->d[1]; + const Eigen::array broadcasts = {{1, xs[0]->d[1]}}; dEdxi.t<2>().device(*dev.edevice) += (dEdf.t<2>() / (float)xs[0]->d[1]).broadcast(broadcasts); } DYNET_NODE_INST_DEV_IMPL(AverageColumns) @@ -249,7 +249,7 @@ DYNET_NODE_INST_DEV_IMPL(Conv1DWide) template void Filter1DNarrow::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - Eigen::array dims; dims[0] = 0; dims[1] = 1; + const Eigen::array dims = {{0, 1}}; if(xs[1]->d.ndims() == 2) { fx.t<2>().device(*dev.edevice) = xs[0]->t<2>().convolve(xs[1]->t<2>(), dims); } else { @@ -329,7 +329,7 @@ void FoldRows::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - array broadcasts; broadcasts[0] = nrows; + const Eigen::array broadcasts = {{nrows}}; dEdxi.tvec().device(*dev.edevice) += dEdf.tvec().broadcast(broadcasts); // unsigned orows = fx.d.rows(); // for (unsigned i = 0; i < orows; ++i) @@ -344,7 +344,7 @@ void KMaxPooling::forward_dev_impl(const MyDevice & dev, const vector> locs(maxmap, dim.size()); locs.device(*dev.edevice) = xs[0]->t<2>().argmax(1); - array reduction_axis; reduction_axis[0] = 1; + const Eigen::array reduction_axis = {{1}}; #ifdef __CUDACC__ // TODO: The code that works on CPU does not compile on CUDA throw std::runtime_error("KMaxPooling::forward_dev_impl not working on CUDA yet"); @@ -417,7 +417,7 @@ void SumColumns::forward_dev_impl(const MyDevice & dev, const vector().device(*dev.edevice) += xs[0]->t<2>().chip<1>(i); #else - array reduction_axis; reduction_axis[0] = 1; + const Eigen::array reduction_axis = {{1}}; fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().sum(reduction_axis); #endif } @@ -429,10 +429,9 @@ void SumColumns::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - array broadcasts; broadcasts[0] = 1; broadcasts[1] = xs[0]->d[1]; + const Eigen::array broadcasts = {{1, xs[0]->d[1]}}; dEdxi.t<2>().device(*dev.edevice) += dEdf.t<2>().broadcast(broadcasts); } DYNET_NODE_INST_DEV_IMPL(SumColumns) - } // namespace dynet From 26bb0b3ba417a20c6a0631d419092dd4649c637e Mon Sep 17 00:00:00 2001 From: Chris Dyer Date: Mon, 7 Nov 2016 14:59:03 +0000 Subject: [PATCH 816/965] avoid errors/warnings on different compilers --- CMakeLists.txt | 2 +- dynet/nodes-conv.cc | 14 +++++++------- dynet/treelstm.h | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a34739f1..8c8e656e9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,7 +65,7 @@ endif() if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W1 -DEIGEN_HAS_C99_MATH /MP") # -Wall produces 20k warnings else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -funroll-loops -Wall -std=c++11 -Ofast -g -march=native") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -funroll-loops -Wall -Wno-missing-braces -std=c++11 -Ofast -g -march=native") endif() enable_testing() diff --git a/dynet/nodes-conv.cc b/dynet/nodes-conv.cc index 5179e592e..ee1db90c3 100644 --- a/dynet/nodes-conv.cc +++ b/dynet/nodes-conv.cc @@ -160,7 +160,7 @@ void AverageColumns::forward_dev_impl(const MyDevice & dev, const vector().device(*dev.edevice) += xs[0]->t<2>().chip<1>(i); fx.t<1>().device(*dev.edevice) = fx.t<1>() / (float)cols; #else - const Eigen::array reduction_axis = {{1}}; + const Eigen::array reduction_axis = {1}; fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().sum(reduction_axis) / (float)cols; #endif } @@ -172,7 +172,7 @@ void AverageColumns::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - const Eigen::array broadcasts = {{1, xs[0]->d[1]}}; + const Eigen::array broadcasts = {1, xs[0]->d[1]}; dEdxi.t<2>().device(*dev.edevice) += (dEdf.t<2>() / (float)xs[0]->d[1]).broadcast(broadcasts); } DYNET_NODE_INST_DEV_IMPL(AverageColumns) @@ -249,7 +249,7 @@ DYNET_NODE_INST_DEV_IMPL(Conv1DWide) template void Filter1DNarrow::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - const Eigen::array dims = {{0, 1}}; + const Eigen::array dims = {0, 1}; if(xs[1]->d.ndims() == 2) { fx.t<2>().device(*dev.edevice) = xs[0]->t<2>().convolve(xs[1]->t<2>(), dims); } else { @@ -329,7 +329,7 @@ void FoldRows::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - const Eigen::array broadcasts = {{nrows}}; + const Eigen::array broadcasts = {nrows}; dEdxi.tvec().device(*dev.edevice) += dEdf.tvec().broadcast(broadcasts); // unsigned orows = fx.d.rows(); // for (unsigned i = 0; i < orows; ++i) @@ -344,7 +344,7 @@ void KMaxPooling::forward_dev_impl(const MyDevice & dev, const vector> locs(maxmap, dim.size()); locs.device(*dev.edevice) = xs[0]->t<2>().argmax(1); - const Eigen::array reduction_axis = {{1}}; + const Eigen::array reduction_axis = {1}; #ifdef __CUDACC__ // TODO: The code that works on CPU does not compile on CUDA throw std::runtime_error("KMaxPooling::forward_dev_impl not working on CUDA yet"); @@ -417,7 +417,7 @@ void SumColumns::forward_dev_impl(const MyDevice & dev, const vector().device(*dev.edevice) += xs[0]->t<2>().chip<1>(i); #else - const Eigen::array reduction_axis = {{1}}; + const Eigen::array reduction_axis = {1}; fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().sum(reduction_axis); #endif } @@ -429,7 +429,7 @@ void SumColumns::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - const Eigen::array broadcasts = {{1, xs[0]->d[1]}}; + const Eigen::array broadcasts = {1, xs[0]->d[1]}; dEdxi.t<2>().device(*dev.edevice) += dEdf.t<2>().broadcast(broadcasts); } DYNET_NODE_INST_DEV_IMPL(SumColumns) diff --git a/dynet/treelstm.h b/dynet/treelstm.h index 9c5ac87ca..1e210bf5a 100644 --- a/dynet/treelstm.h +++ b/dynet/treelstm.h @@ -43,7 +43,7 @@ struct SocherTreeLSTMBuilder : public TreeLSTMBuilder { unsigned hidden_dim, Model* model); - Expression add_input(int id, std::vector children, const Expression& x); + Expression add_input(int id, std::vector children, const Expression& x) override; void copy(const RNNBuilder & params) override; protected: void new_graph_impl(ComputationGraph& cg) override; @@ -90,7 +90,7 @@ struct UnidirectionalTreeLSTMBuilder : public TreeLSTMBuilder { unsigned hidden_dim, Model* model); - Expression add_input(int id, std::vector children, const Expression& x); + Expression add_input(int id, std::vector children, const Expression& x) override; protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; @@ -117,7 +117,7 @@ struct BidirectionalTreeLSTMBuilder : public TreeLSTMBuilder { unsigned hidden_dim, Model* model); - Expression add_input(int id, std::vector children, const Expression& x); + Expression add_input(int id, std::vector children, const Expression& x) override; protected: void new_graph_impl(ComputationGraph& cg) override; void start_new_sequence_impl(const std::vector& h0) override; From 5bba10c3a66b6fef08a0b620d3b922d910b26fb2 Mon Sep 17 00:00:00 2001 From: Jonathan Kummerfeld Date: Mon, 7 Nov 2016 10:34:56 -0500 Subject: [PATCH 817/965] Adding installation notes for OS X --- doc/source/install.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/source/install.rst b/doc/source/install.rst index 353a4e8cd..b7b333e5f 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -14,6 +14,14 @@ be installed from standard repositories, for example on Ubuntu linux: sudo apt-get install libboost-all-dev cmake mercurial +Or on OS X with Homebrew, first make sure the Apple Command Line Tools are +installed, then get boost, cmake, and mercurial: + +:: + + xcode-select --install + brew install boost cmake hg + To compile DyNet you also need the `development version of the Eigen library `__. **If you use any of the released versions, you may get assertion failures or compile errors.** From 7e7f50a9ff1935ef6846197a319cf5200bb4ee6e Mon Sep 17 00:00:00 2001 From: Jonathan Kummerfeld Date: Mon, 7 Nov 2016 10:51:16 -0500 Subject: [PATCH 818/965] Adding MacPorts installation instructions as well --- doc/source/install.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index b7b333e5f..810e81b0d 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -14,13 +14,14 @@ be installed from standard repositories, for example on Ubuntu linux: sudo apt-get install libboost-all-dev cmake mercurial -Or on OS X with Homebrew, first make sure the Apple Command Line Tools are -installed, then get boost, cmake, and mercurial: +Or on OS X, first make sure the Apple Command Line Tools are installed, then +get boost, cmake, and mercurial with either homebrew or macports: :: xcode-select --install brew install boost cmake hg + sudo port install boost cmake mercurial To compile DyNet you also need the `development version of the Eigen library `__. **If you use any of the From dfa5b27f3111cc33008ea4b60773679d5f65ca84 Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Mon, 7 Nov 2016 12:03:18 -0800 Subject: [PATCH 819/965] Change "assert(false)" to "throw exception(...)" so it always fails and also compiles properly with NDEBUG set. --- dynet/treelstm.cc | 14 +++++++------- dynet/treelstm.h | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/dynet/treelstm.cc b/dynet/treelstm.cc index 36bfe9a35..4e0b8ac78 100644 --- a/dynet/treelstm.cc +++ b/dynet/treelstm.cc @@ -271,12 +271,12 @@ void SocherTreeLSTMBuilder::copy(const RNNBuilder & rnn) { } } -Expression TreeLSTMBuilder::add_input_impl(int prev, const Expression& x) { assert (false); } -Expression TreeLSTMBuilder::back() const { assert(false); } -std::vector TreeLSTMBuilder::final_h() const { assert(false); } -std::vector TreeLSTMBuilder::final_s() const { assert(false); } -unsigned TreeLSTMBuilder::num_h0_components() const { assert (false); } -void TreeLSTMBuilder::copy(const RNNBuilder&) { assert(false); } +Expression TreeLSTMBuilder::add_input_impl(int prev, const Expression& x) { throw std::runtime_error("add_input_impl() not a valid function for TreeLSTMBuilder"); } +Expression TreeLSTMBuilder::back() const { throw std::runtime_error("back() not a valid function for TreeLSTMBuilder"); } +std::vector TreeLSTMBuilder::final_h() const { throw std::runtime_error("final_h() not a valid function for TreeLSTMBuilder"); } +std::vector TreeLSTMBuilder::final_s() const { throw std::runtime_error("final_s() not a valid function for TreeLSTMBuilder"); } +unsigned TreeLSTMBuilder::num_h0_components() const { throw std::runtime_error("num_h0_components() not a valid function for TreeLSTMBuilder"); } +void TreeLSTMBuilder::copy(const RNNBuilder&) { throw std::runtime_error("copy() not a valid function for TreeLSTMBuilder"); } UnidirectionalTreeLSTMBuilder::UnidirectionalTreeLSTMBuilder(unsigned layers, unsigned input_dim, @@ -359,4 +359,4 @@ Expression BidirectionalTreeLSTMBuilder::add_input(int id, vector children, return embedding; } -Expression BidirectionalTreeLSTMBuilder::set_h_impl(int prev, const vector& h_new) { assert (false); } +Expression BidirectionalTreeLSTMBuilder::set_h_impl(int prev, const vector& h_new) { throw std::runtime_error("set_h() not a valid function for BidirectionalTreeLSTMBuilder"); } diff --git a/dynet/treelstm.h b/dynet/treelstm.h index 1e210bf5a..2c17f1a2b 100644 --- a/dynet/treelstm.h +++ b/dynet/treelstm.h @@ -19,9 +19,9 @@ struct TreeLSTMBuilder : public RNNBuilder { virtual unsigned num_h0_components() const override; virtual void copy(const RNNBuilder & params) override; virtual Expression add_input(int id, std::vector children, const Expression& x) = 0; - std::vector get_h(RNNPointer i) const override { assert (false); } - std::vector get_s(RNNPointer i) const override { assert (false); } - Expression set_s_impl(int prev, const std::vector& s_new) override { assert (false); } + std::vector get_h(RNNPointer i) const override { throw std::runtime_error("get_h() not a valid function for TreeLSTMBuilder"); } + std::vector get_s(RNNPointer i) const override { throw std::runtime_error("get_s() not a valid function for TreeLSTMBuilder"); } + Expression set_s_impl(int prev, const std::vector& s_new) override { throw std::runtime_error("set_s_impl() not a valid function for TreeLSTMBuilder"); } protected: virtual void new_graph_impl(ComputationGraph& cg) override = 0; virtual void start_new_sequence_impl(const std::vector& h0) override = 0; From 7c09434221a131c39f5c7ac67c9c34ac8d7471fe Mon Sep 17 00:00:00 2001 From: Matthew Richardson Date: Mon, 7 Nov 2016 16:07:13 -0800 Subject: [PATCH 820/965] Adding MKL_NUM_THREADS to MKL documentation. And adding a table showing that even just 1 thread is useful, and max benefit can be around 2-3 threads, at least for this test --- doc/source/install.rst | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/doc/source/install.rst b/doc/source/install.rst index 810e81b0d..505d9b369 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -137,6 +137,31 @@ If cmake is unable to find MKL automatically, try setting `MKL_ROOT`, such as If either MKL or MKL_ROOT are set, CMake will look for MKL. +By default, MKL will use all CPU cores. You can control how many cores MKL uses by setting the environment +variable `MKL_NUM_THREADS` to the desired number. The following is the total time to process 250 training +examples running the example encdec (on a 6 core Intel Xeon E5-1650): + +:: + + encdec.exe --dynet-seed 1 --dynet-mem 1000 train-hsm.txt dev-hsm.txt + +:: + + +-----------------+------------+---------+ + | MKL_NUM_THREADS | Cores Used | Time(s) | + +-----------------+------------+---------+ + | | 1 | 28.6 | + | 1 | 1 | 13.3 | + | 2 | 2 | 9.5 | + | 3 | 3 | 8.1 | + | 4 | 4 | 7.8 | + | 6 | 6 | 8.2 | + +-----------------+------------+---------+ + +As you can see, for this particular example, using MKL roughly doubles the speed of computation while +still using only one core. Increasing the number of cores to 2 or 3 is quite beneficial, but beyond that +there are diminishing returns or even slowdown. + Non-standard Boost location ~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 8298e69feea42a2495439151e731dbf00566b3ba Mon Sep 17 00:00:00 2001 From: armatthews Date: Wed, 9 Nov 2016 04:52:03 -0500 Subject: [PATCH 821/965] Fixed constness of ParameterInit with add_parameters. Added a virtual destructor to ParameterInit. --- dynet/model.cc | 2 +- dynet/model.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dynet/model.cc b/dynet/model.cc index fa282fafb..d9734e07a 100644 --- a/dynet/model.cc +++ b/dynet/model.cc @@ -318,7 +318,7 @@ Parameter Model::add_parameters(const Dim& d, float scale) { return r; } -Parameter Model::add_parameters(const Dim& d, ParameterInit & init) { +Parameter Model::add_parameters(const Dim& d, const ParameterInit & init) { ParameterStorage* p = new ParameterStorage(d, init); Parameter r(this, params.size()); //cerr << "Adding parameters with dim " << d << endl; diff --git a/dynet/model.h b/dynet/model.h index a870282bc..863b57bc5 100644 --- a/dynet/model.h +++ b/dynet/model.h @@ -169,6 +169,7 @@ struct LookupParameter { // Initilizers for parameters struct ParameterInit { ParameterInit() {} + virtual ~ParameterInit() {} virtual void initialize_params(Tensor & values) const = 0; }; @@ -239,7 +240,7 @@ class Model { void reset_gradient(); // set scale to use custom initialization Parameter add_parameters(const Dim& d, float scale = 0.0f); - Parameter add_parameters(const Dim& d, ParameterInit & init); + Parameter add_parameters(const Dim& d, const ParameterInit & init); LookupParameter add_lookup_parameters(unsigned n, const Dim& d); LookupParameter add_lookup_parameters(unsigned n, const Dim& d, const ParameterInit & init); // project weights so their L2 norm = radius From df3eec559db6d20550d5072804fb52ad82e6ffef Mon Sep 17 00:00:00 2001 From: armatthews Date: Wed, 9 Nov 2016 09:35:57 -0500 Subject: [PATCH 822/965] Fixed an include path in dynet.pxd --- python/dynet.pxd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/dynet.pxd b/python/dynet.pxd index 07783f6aa..972eb4b78 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -351,7 +351,7 @@ cdef extern from "dynet/fast-lstm.h" namespace "dynet": #vector[CExpression] get_s(CRNNPointer i) #CRNNPointer state() -cdef extern from "pybridge.h" namespace "pydynet": +cdef extern from "python/pybridge.h" namespace "pydynet": cdef cppclass CModelSaver "pydynet::ModelSaver": CModelSaver(string filename, CModel *model) CModelSaver add_parameter(CParameters p) From fbfe34f94a9a210c55d5928ed59d8a793e675f85 Mon Sep 17 00:00:00 2001 From: Daniel Hershcovich Date: Sun, 6 Nov 2016 13:14:48 +0200 Subject: [PATCH 823/965] Add initializers to dynet_viz Otherwise using --dynet-viz results in an error if there is e.g. GlorotInitializer in the graph. --- python/dynet_viz.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/python/dynet_viz.py b/python/dynet_viz.py index 6f902c842..08d9400ae 100644 --- a/python/dynet_viz.py +++ b/python/dynet_viz.py @@ -50,6 +50,7 @@ def make_dim(a, b=None, inferred=False): return SimpleConcreteDim(a.nrows, a.ncols, inferred) elif isinstance(a, tuple): assert b is None + assert len(a) == 2, str(a) (nrows, ncols) = a return SimpleConcreteDim(nrows, ncols, inferred) elif b is None: @@ -684,6 +685,20 @@ class AdamTrainer(Trainer): def __init__(self, m, alpha = 0.001, beta_1 = 0.9, beta_2 = 0.999, eps = 1e-8 ): pass +class Initializer(object): pass +class NormalInitializer(Initializer): + def __init__(self, mean=0, var=1): pass +class UniformInitializer(Initializer): + def __init__(self, scale): pass +class ConstInitializer(Initializer): + def __init__(self, c): pass +class GlorotInitializer(Initializer): + def __init__(self, is_lookup=False): pass +class FromFileInitializer(Initializer): + def __init__(self, fname): pass +class NumpyInitializer(Initializer): + def __init__(self, array): pass + From c00b8768832fd78337dd0ea547ee5070985073b5 Mon Sep 17 00:00:00 2001 From: Avi Hayoun Date: Thu, 10 Nov 2016 12:21:06 +0200 Subject: [PATCH 824/965] copy dict properties by need in Saveable instead of copying everything and then deleting unneeded stuff --- python/_dynet.pyx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index e6d08e7b5..d4de8bc03 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -187,11 +187,11 @@ class Saveable(object): pass def __getstate__(self): - odict = self.__dict__.copy() # copy the dict since we change it + odict = dict() params = self.get_components() - for k,v in odict.items(): # remove unpicklable things which we save otherwise - if v in params: - del odict[k] + for k,v in self.__dict__.items(): # remove unpicklable things which we save otherwise + if v not in params: + odict[k] = v return odict def get_components(self): From d2060ec3dd30235bc8ac7e61957093534b861cb5 Mon Sep 17 00:00:00 2001 From: Avi Hayoun Date: Thu, 10 Nov 2016 12:21:37 +0200 Subject: [PATCH 825/965] more pyt3 bytes vs p2 bytes compatibility changes --- python/_dynet.pyx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index d4de8bc03..345b9a00f 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -332,7 +332,7 @@ cdef class Model: # {{{ self.save_all(fname.encode()) return fh = open(fname+".pym","w") - pfh = open(fname+".pyk","w") + pfh = open(fname+".pyk","wb") cdef CModelSaver *saver = new CModelSaver(fname.encode(), self.thisptr) for c in components: self._save_one(c,saver,fh,pfh) @@ -388,7 +388,7 @@ cdef class Model: # {{{ types = fh.read().strip().split() cdef CModelLoader *loader = new CModelLoader(fname.encode(), self.thisptr) - with open(fname+".pyk","r") as pfh: + with open(fname+".pyk","rb") as pfh: params = [] itypes = iter(types) while True: # until iterator is done From 516319b87501fbaf0b61c97457dabb4d4cabba9d Mon Sep 17 00:00:00 2001 From: Andre Martins Date: Sat, 12 Nov 2016 21:35:07 +0000 Subject: [PATCH 826/965] Added sparsemax to the Python bindings. --- python/dynet.pxd | 1 + python/dynet.pyx | 1 + 2 files changed, 2 insertions(+) diff --git a/python/dynet.pxd b/python/dynet.pxd index 972eb4b78..3f7474226 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -211,6 +211,7 @@ cdef extern from "dynet/expr.h" namespace "dynet::expr": CExpression c_log_softmax "dynet::expr::log_softmax" (CExpression& x) # CExpression c_log_softmax "dynet::expr::log_softmax" (CExpression& x, vector[unsigned]& restriction) #? CExpression c_softmax "dynet::expr::softmax" (CExpression& x) # + CExpression c_sparsemax "dynet::expr::sparsemax" (CExpression& x) # CExpression c_softsign "dynet::expr::softsign" (CExpression& x) # CExpression c_bmin "dynet::expr::min" (CExpression& x, CExpression& y) # CExpression c_bmax "dynet::expr::max" (CExpression& x, CExpression& y) # diff --git a/python/dynet.pyx b/python/dynet.pyx index 99e0e0671..1a48dc730 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -855,6 +855,7 @@ cpdef Expression log_softmax(Expression x, list restrict=None): cdef vector[unsigned] vec = restrict return Expression.from_cexpr(x.cg_version, c_log_softmax(x.c(), vec)) cpdef Expression softmax(Expression x): return Expression.from_cexpr(x.cg_version, c_softmax(x.c())) +cpdef Expression sparsemax(Expression x): return Expression.from_cexpr(x.cg_version, c_sparsemax(x.c())) cpdef Expression softsign(Expression x): return Expression.from_cexpr(x.cg_version, c_softsign(x.c())) cpdef Expression bmin(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_bmin(x.c(), y.c())) cpdef Expression bmax(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_bmax(x.c(), y.c())) From 3fa9d526e3ec23d22d6a1049988a648704f635aa Mon Sep 17 00:00:00 2001 From: Daniel Hershcovich Date: Sun, 13 Nov 2016 10:19:30 +0200 Subject: [PATCH 827/965] Fix #161: support save/load BiRNNBuilder --- python/dynet.pyx | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/python/dynet.pyx b/python/dynet.pyx index 1a48dc730..a4b2c39e6 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -312,9 +312,14 @@ cdef class Model: # {{{ elif isinstance(c, SimpleRNNBuilder): saver.add_srnn_builder(((c).thisptr)[0]) fh.write("srnn_builder ") + elif isinstance(c, BiRNNBuilder): + fh.write("birnn_builder~%d " % (2 * len(c.builder_layers))) + for (f,b) in c.builder_layers: + self._save_one(f,saver,fh,pfh) + self._save_one(b,saver,fh,pfh) elif isinstance(c, Saveable): cs = c.get_components() - fh.write("user~%s " % len(cs)) + fh.write("user~%d " % len(cs)) pickle.dump(c,pfh) for subc in cs: self._save_one(subc,saver,fh,pfh) @@ -362,6 +367,11 @@ cdef class Model: # {{{ sb_ = SimpleRNNBuilder(0,0,0,self) # empty builder loader.fill_srnn_builder((sb_.thisptr)[0]) return sb_ + elif tp.startswith("birnn_builder~"): + tp,num = tp.split("~",1) + num = int(num) + items = [self._load_one(itypes, loader, pfh) for _ in xrange(num)] + return BiRNNBuilder(None, None, None, None, None, zip(items[0::2], items[1::2])) elif tp.startswith("user~"): # user defiend type tp,num = tp.split("~",1) @@ -1126,24 +1136,28 @@ class BiRNNBuilder(object): builder = BiRNNBuilder(1, 128, 100, model, LSTMBuilder) [o1,o2,o3] = builder.transduce([i1,i2,i3]) """ - def __init__(self, num_layers, input_dim, hidden_dim, model, rnn_builder_factory): + def __init__(self, num_layers, input_dim, hidden_dim, model, rnn_builder_factory, builder_layers=None): """ @param num_layers: depth of the BiRNN @param input_dim: size of the inputs @param hidden_dim: size of the outputs (and intermediate layer representations) @param model @param rnn_builder_factory: RNNBuilder subclass, e.g. LSTMBuilder + @param builder_layers: list of (forward, backward) pairs of RNNBuilder instances to directly initialize layers """ - assert num_layers > 0 - assert hidden_dim % 2 == 0 - self.builder_layers = [] - f = rnn_builder_factory(1, input_dim, hidden_dim/2, model) - b = rnn_builder_factory(1, input_dim, hidden_dim/2, model) - self.builder_layers.append((f,b)) - for _ in xrange(num_layers-1): - f = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) - b = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) + if builder_layers is None: + assert num_layers > 0 + assert hidden_dim % 2 == 0 + self.builder_layers = [] + f = rnn_builder_factory(1, input_dim, hidden_dim/2, model) + b = rnn_builder_factory(1, input_dim, hidden_dim/2, model) self.builder_layers.append((f,b)) + for _ in xrange(num_layers-1): + f = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) + b = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) + self.builder_layers.append((f,b)) + else: + self.builder_layers = builder_layers def whoami(self): return "BiRNNBuilder" From d5faca4819e31acbebd87804c2a5e6f192ed30eb Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 18 Nov 2016 09:58:59 -0500 Subject: [PATCH 828/965] Documentation and standardization for arithmetic --- dynet/deep-lstm.cc | 8 +- dynet/expr.cc | 2 +- dynet/expr.h | 221 ++++++++++++++++++++++++++++++++++++++--- dynet/fast-lstm.cc | 16 +-- dynet/gru.cc | 8 +- dynet/lstm.cc | 8 +- dynet/treelstm.cc | 8 +- examples/rnnlm-aevb.cc | 2 +- python/dynet.pxd | 2 +- python/dynet.pyx | 2 +- tests/test-nodes.cc | 12 +-- 11 files changed, 242 insertions(+), 47 deletions(-) diff --git a/dynet/deep-lstm.cc b/dynet/deep-lstm.cc index 49d610656..e6de6f3ce 100644 --- a/dynet/deep-lstm.cc +++ b/dynet/deep-lstm.cc @@ -136,11 +136,11 @@ Expression DeepLSTMBuilder::add_input_impl(int prev, const Expression& x) { Expression i_wt = tanh(i_awt); // output if (has_prev_state) { - Expression i_nwt = cwise_multiply(i_it,i_wt); - Expression i_crt = cwise_multiply(i_ft,i_c_tm1); + Expression i_nwt = cmult(i_it,i_wt); + Expression i_crt = cmult(i_ft,i_c_tm1); ct[i] = i_crt + i_nwt; } else { - ct[i] = cwise_multiply(i_it,i_wt); + ct[i] = cmult(i_it,i_wt); } Expression i_aot; @@ -152,7 +152,7 @@ Expression DeepLSTMBuilder::add_input_impl(int prev, const Expression& x) { i_aot = affine_transform({vars[BO], vars[X2O], in}); Expression i_ot = logistic(i_aot); Expression ph_t = tanh(ct[i]); - in = ht[i] = cwise_multiply(i_ot,ph_t); + in = ht[i] = cmult(i_ot,ph_t); cc[i] = in; } ot = concatenate(cc); diff --git a/dynet/expr.cc b/dynet/expr.cc index 07f40cb43..3fb4ec411 100644 --- a/dynet/expr.cc +++ b/dynet/expr.cc @@ -41,6 +41,7 @@ Expression operator-(real x, const Expression& y) { return Expression(y.pg, y.pg Expression operator-(const Expression& x, real y) { return -(y-x); } Expression operator*(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression operator*(const Expression& x, float y) { return Expression(x.pg, x.pg->add_function({x.i}, y)); } +Expression cmult(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} Expression cdiv(const Expression& x, const Expression& y) { return Expression(x.pg, x.pg->add_function({x.i, y.i})); } Expression colwise_add(const Expression& x, const Expression& bias) { return Expression(x.pg, x.pg->add_function({x.i, bias.i})); } Expression contract3d_1d_1d(const Expression& x, const Expression& y, const Expression& z) { return Expression(x.pg, x.pg->add_function({x.i, y.i, z.i})); } @@ -86,7 +87,6 @@ Expression inverse(const Expression& x) { return Expression(x.pg, x.pg->add_func Expression logdet(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } Expression trace_of_product(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} -Expression cwise_multiply(const Expression& x, const Expression& y) {return Expression(x.pg, x.pg->add_function({x.i, y.i}));} Expression squared_norm(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/dynet/expr.h b/dynet/expr.h index 89c7c4209..412d2dd62 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -366,7 +366,7 @@ Expression operator+(real x, const Expression& y); * \param x The expression from which to subtract * \param y The expression to subtract * - * \return An expression for x minus y + * \return An expression where the ith element is x_i minus y_i */ Expression operator-(const Expression& x, const Expression& y); @@ -378,7 +378,7 @@ Expression operator-(const Expression& x, const Expression& y); * \param x The scalar from which to subtract * \param y The expression to subtract * - * \return An expression for x minus y + * \return An expression where the ith element is x_i minus y */ Expression operator-(real x, const Expression& y); @@ -390,7 +390,7 @@ Expression operator-(real x, const Expression& y); * \param x The expression from which to subtract * \param y The scalar to subtract * - * \return An expression for x minus y + * \return An expression where the ith element is x_i minus y */ Expression operator-(const Expression& x, real y); @@ -404,7 +404,7 @@ Expression operator-(const Expression& x, real y); * \param x The left-hand matrix * \param y The right-hand matrix * - * \return An expression for x times y + * \return An expression x times y */ Expression operator*(const Expression& x, const Expression& y); @@ -416,7 +416,7 @@ Expression operator*(const Expression& x, const Expression& y); * \param x The matrix * \param y The scalar * - * \return An expression for x times y + * \return An expression where the ith element is x_i times y */ Expression operator*(const Expression& x, float y); @@ -428,7 +428,7 @@ Expression operator*(const Expression& x, float y); * \param x The scalar * \param y The matrix * - * \return An expression for x times y + * \return An expression where the ith element is x_i times y */ inline Expression operator*(float y, const Expression& x) { return x * y; } @@ -440,39 +440,233 @@ inline Expression operator*(float y, const Expression& x) { return x * y; } * \param x The matrix * \param y The scalar * - * \return An expression for x divided by y + * \return An expression where the ith element is x_i divided by y */ inline Expression operator/(const Expression& x, float y) { return x * (1.f / y); } +/** + * \ingroup arithmeticoperations + * \brief Affine transform + * \details This performs an affine transform over an arbitrary (odd) number of expressions + * held in the input initializer list x. + * The first expression is the "bias," which is added to the expression as-is. + * The remaining expressions are multiplied together, then added. + * A very common usage case is the calculation of the score for a neural network + * layer (e.g. b + Wz) where b is the bias, W is the weight matrix, and z is the + * input. In this case x[0] = b, x[1] = W, and x[2] = z. + * + * \param x An initializer list containing an odd number of expressions + * + * \return An expression equal to: x[0] + x[1]*x[2] + x[3]*x[4] + ... + */ +inline Expression affine_transform(const std::initializer_list& xs) { return detail::f(xs); } template inline Expression affine_transform(const T& xs) { return detail::f(xs); } -inline Expression affine_transform(const std::initializer_list& xs) { return detail::f(xs); } +/** + * \ingroup arithmeticoperations + * \brief Square root + * \details Elementwise square root. + * + * \param x The input expression + * + * \return An expression where the ith element is equal to sqrt(x_i) + */ Expression sqrt(const Expression& x); + +/** + * \ingroup arithmeticoperations + * \brief Gaussian errror function + * \details Elementwise calculation of the Gaussian error function + * + * \param x The input expression + * + * \return An expression where the ith element is equal to erf(x_i) + */ Expression erf(const Expression& x); + +/** + * \ingroup arithmeticoperations + * \brief Hyperbolic tangent + * \details Elementwise calculation of the hyperbolic tangent + * + * \param x The input expression + * + * \return An expression where the ith element is equal to tanh(x_i) + */ Expression tanh(const Expression& x); + +/** + * \ingroup arithmeticoperations + * \brief Natural exponent + * \details Calculate elementwise y_i = e^{x_i} + * + * \param x The input expression + * + * \return An expression equal to e^{x_i} + */ Expression exp(const Expression& x); + +/** + * \ingroup arithmeticoperations + * \brief Square + * \details Calculate elementwise y_i = x_i^2 + * + * \param x The input expression + * + * \return An expression where the ith element is equal to x_i^2 + */ Expression square(const Expression& x); + +/** + * \ingroup arithmeticoperations + * \brief Cube + * \details Calculate elementwise y_i = x_i^3 + * + * \param x The input expression + * + * \return An expression where the ith element is equal to x_i^3 + */ Expression cube(const Expression& x); + +/** + * \ingroup arithmeticoperations + * \brief Log gamma + * \details Calculate elementwise y_i = ln(gamma(x_i)) + * + * \param x The input expression + * + * \return An expression where the ith element is equal to ln(gamma(x_i)) + */ Expression lgamma(const Expression& x); + +/** + * \ingroup arithmeticoperations + * \brief Logarithm + * \details Calculate the elementwise natural logarithm y_i = ln(x_i) + * + * \param x The input expression + * + * \return An expression where the ith element is equal to ln(x_i) + */ Expression log(const Expression& x); + +/** + * \ingroup arithmeticoperations + * \brief Logistic sigmoid function + * \details Calculate elementwise y_i = 1/(1+e^{x_i}) + * + * \param x The input expression + * + * \return An expression equal to y_i = 1/(1+e^{x_i}) + */ Expression logistic(const Expression& x); + +/** + * \ingroup arithmeticoperations + * \brief Rectifier + * \details Calculate elementwise the recitifer (RelU) function y_i = max(x_i,0) + * + * \param x The input expression + * + * \return An expression where the ith element is equal to max(x_i,0) + */ Expression rectify(const Expression& x); -Expression softmax(const Expression& x); +/** + * \ingroup arithmeticoperations + * \brief Soft Sign + * \details Calculate elementwise the softsign function y_i = x_i/(1+|x_i|) + * + * \param x The input expression + * + * \return An expression equal to x_i/(1+|x_i|) + */ Expression softsign(const Expression& x); +/** + * \ingroup arithmeticoperations + * \brief Power function + * \details Calculate an output where the ith element is equal to x_i^y_i + * + * \param x The input expression + * + * \return An expression where the ith element is to x_i^y_i + */ Expression pow(const Expression& x, const Expression& y); + +/** + * \ingroup arithmeticoperations + * \brief Minimum + * \details Calculate an output where the ith element is min(x_i,y_i) + * + * \param x The first input expression + * \param y The second input expression + * + * \return An expression equal to min(x_i,y_i) + */ Expression min(const Expression& x, const Expression& y); + +/** + * \ingroup arithmeticoperations + * \brief Maximum + * \details Calculate an output where the ith element is max(x_i,y_i) + * + * \param x The first input expression + * \param y The second input expression + * + * \return An expression where the ith element is equal to max(x_i,y_i) + */ Expression max(const Expression& x, const Expression& y); +/** + * \ingroup arithmeticoperations + * \brief Dot Product + * \details Calculate the dot product sum_i x_i*y_i + * + * \param x The input expression + * \param y The input expression + * + * \return An expression equal to the dot product + */ Expression dot_product(const Expression& x, const Expression& y); -// colwise addition -Expression addmv(const Expression& M, const Expression& v); -// componentwise division -Expression cwise_multiply(const Expression& x, const Expression& y); +/** + * \ingroup arithmeticoperations + * \brief Componentwise multiply + * \details Do a componentwise multiply where each value is equal to x_i*y_i. + * This function used to be called cwise_multiply. + * + * \param x The first input expression + * \param y The second input expression + * + * \return An expression where the ith element is x_i*y_i + */ +Expression cmult(const Expression& x, const Expression& y); + + +/** + * \ingroup arithmeticoperations + * \brief Componentwise multiply + * \details Do a componentwise multiply where each value is equal to x_i/y_i + * + * \param x The first input expression + * \param y The second input expression + * + * \return An expression where the ith element is x_i/y_i + */ Expression cdiv(const Expression& x, const Expression& y); + +/** + * \ingroup arithmeticoperations + * \brief Columnwise addition + * \details Add vector "bias" to each column of matrix "x" + * + * \param x An MxN matrix + * \param bias A length M vector + * + * \return An expression bias is added to each column of x + */ Expression colwise_add(const Expression& x, const Expression& bias); //////////////////////////////////////////////// @@ -483,6 +677,7 @@ Expression hinge(const Expression& x, unsigned index, float m = 1.0); Expression hinge(const Expression& x, const std::vector & indices, float m = 1.0); Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0); Expression hinge(const Expression& x, const std::vector * pindices, float m = 1.0); +Expression softmax(const Expression& x); Expression log_softmax(const Expression& x); Expression sparsemax(const Expression& x); Expression log_softmax(const Expression& x, const std::vector& restriction); diff --git a/dynet/fast-lstm.cc b/dynet/fast-lstm.cc index e9f693761..012cf2cb1 100644 --- a/dynet/fast-lstm.cc +++ b/dynet/fast-lstm.cc @@ -152,9 +152,9 @@ Expression FastLSTMBuilder::add_input_impl(int prev, const Expression& x) { // input Expression i_ait; if (has_prev_state) { -// i_ait = vars[BI] + vars[X2I] * in + vars[H2I]*i_h_tm1 + cwise_multiply(vars[C2I], i_c_tm1); +// i_ait = vars[BI] + vars[X2I] * in + vars[H2I]*i_h_tm1 + cmult(vars[C2I], i_c_tm1); i_ait = affine_transform({vars[BI], vars[X2I], in, vars[H2I], i_h_tm1}) + - cwise_multiply(vars[C2I], i_c_tm1); + cmult(vars[C2I], i_c_tm1); } else { // i_ait = vars[BI] + vars[X2I] * in; i_ait = affine_transform({vars[BI], vars[X2I], in}); @@ -173,18 +173,18 @@ Expression FastLSTMBuilder::add_input_impl(int prev, const Expression& x) { Expression i_wt = tanh(i_awt); // output if (has_prev_state) { - Expression i_nwt = cwise_multiply(i_it,i_wt); - Expression i_crt = cwise_multiply(i_ft,i_c_tm1); + Expression i_nwt = cmult(i_it,i_wt); + Expression i_crt = cmult(i_ft,i_c_tm1); ct[i] = i_crt + i_nwt; } else { - ct[i] = cwise_multiply(i_it,i_wt); + ct[i] = cmult(i_it,i_wt); } Expression i_aot; if (has_prev_state) { -// i_aot = vars[BO] + vars[X2O] * in + vars[H2O] * i_h_tm1 + cwise_multiply(vars[C2O], ct[i]); +// i_aot = vars[BO] + vars[X2O] * in + vars[H2O] * i_h_tm1 + cmult(vars[C2O], ct[i]); i_aot = affine_transform({vars[BO], vars[X2O], in, vars[H2O], i_h_tm1}) + - cwise_multiply(vars[C2O], ct[i]); + cmult(vars[C2O], ct[i]); } else { // i_aot = vars[BO] + vars[X2O] * in; @@ -192,7 +192,7 @@ Expression FastLSTMBuilder::add_input_impl(int prev, const Expression& x) { } Expression i_ot = logistic(i_aot); Expression ph_t = tanh(ct[i]); - in = ht[i] = cwise_multiply(i_ot,ph_t); + in = ht[i] = cmult(i_ot,ph_t); } return ht.back(); } diff --git a/dynet/gru.cc b/dynet/gru.cc index eff952c86..ed018674c 100644 --- a/dynet/gru.cc +++ b/dynet/gru.cc @@ -133,14 +133,14 @@ Expression GRUBuilder::add_input_impl(int prev, const Expression& x) { if (prev_zero) { ct = affine_transform({vars[BH], vars[X2H], in}); ct = tanh(ct); - Expression nwt = cwise_multiply(zt, ct); + Expression nwt = cmult(zt, ct); in = ht[i] = nwt; } else { - Expression ght = cwise_multiply(rt, h_tprev); + Expression ght = cmult(rt, h_tprev); ct = affine_transform({vars[BH], vars[X2H], in, vars[H2H], ght}); ct = tanh(ct); - Expression nwt = cwise_multiply(zt, ct); - Expression crt = cwise_multiply(ft, h_tprev); + Expression nwt = cmult(zt, ct); + Expression crt = cmult(ft, h_tprev); in = ht[i] = crt + nwt; } } diff --git a/dynet/lstm.cc b/dynet/lstm.cc index fe014ff2e..5cf0ad0c7 100644 --- a/dynet/lstm.cc +++ b/dynet/lstm.cc @@ -171,11 +171,11 @@ Expression LSTMBuilder::add_input_impl(int prev, const Expression& x) { Expression i_wt = tanh(i_awt); // output if (has_prev_state) { - Expression i_nwt = cwise_multiply(i_it, i_wt); - Expression i_crt = cwise_multiply(i_ft, i_c_tm1); + Expression i_nwt = cmult(i_it, i_wt); + Expression i_crt = cmult(i_ft, i_c_tm1); ct[i] = i_crt + i_nwt; } else { - ct[i] = cwise_multiply(i_it, i_wt); + ct[i] = cmult(i_it, i_wt); } Expression i_aot; @@ -185,7 +185,7 @@ Expression LSTMBuilder::add_input_impl(int prev, const Expression& x) { i_aot = affine_transform({vars[BO], vars[X2O], in, vars[C2O], ct[i]}); Expression i_ot = logistic(i_aot); Expression ph_t = tanh(ct[i]); - in = ht[i] = cwise_multiply(i_ot, ph_t); + in = ht[i] = cmult(i_ot, ph_t); } if (dropout_rate) return dropout(ht.back(), dropout_rate); else return ht.back(); diff --git a/dynet/treelstm.cc b/dynet/treelstm.cc index 4e0b8ac78..51b500bec 100644 --- a/dynet/treelstm.cc +++ b/dynet/treelstm.cc @@ -223,16 +223,16 @@ Expression SocherTreeLSTMBuilder::add_input(int id, vector children, const // compute new cell value if (has_prev_state) { - Expression i_nwt = cwise_multiply(i_it, i_wt); + Expression i_nwt = cmult(i_it, i_wt); vector i_crts(children.size()); for (unsigned j = 0; j < children.size(); ++j) { - i_crts[j] = cwise_multiply(i_ft[j], i_c_children[j]); + i_crts[j] = cmult(i_ft[j], i_c_children[j]); } Expression i_crt = sum(i_crts); ct[i] = i_crt + i_nwt; } else { - ct[i] = cwise_multiply(i_it, i_wt); + ct[i] = cmult(i_it, i_wt); } // output @@ -256,7 +256,7 @@ Expression SocherTreeLSTMBuilder::add_input(int id, vector children, const // Compute new h value Expression ph_t = tanh(ct[i]); - in = ht[i] = cwise_multiply(i_ot, ph_t); + in = ht[i] = cmult(i_ot, ph_t); } return ht.back(); } diff --git a/examples/rnnlm-aevb.cc b/examples/rnnlm-aevb.cc index 37cc52b56..4167458be 100644 --- a/examples/rnnlm-aevb.cc +++ b/examples/rnnlm-aevb.cc @@ -99,7 +99,7 @@ struct RNNLanguageModel { for (unsigned l = 0; l < L; ++l) { // noise samples for (auto& x : eps[l]) x = rand_normal(); Expression ceps = input(cg, {LATENT_DIM}, &eps[l]); - Expression z = mu + cwise_multiply(ceps, exp(logsig)); + Expression z = mu + cmult(ceps, exp(logsig)); Expression h0 = parameter(cg, p_z2h0) * z + parameter(cg, p_h0b); vector h0s(LAYERS); for (unsigned i = 0; i < LAYERS; ++i) { diff --git a/python/dynet.pxd b/python/dynet.pxd index 3f7474226..bbf821181 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -197,6 +197,7 @@ cdef extern from "dynet/expr.h" namespace "dynet::expr": CExpression c_bmin "dynet::expr::min" (CExpression& x, CExpression& y) # CExpression c_cdiv "dynet::expr::cdiv" (CExpression& x, CExpression& y) # + CExpression c_cmult "dynet::expr::cmult" (CExpression& x, CExpression& y) # CExpression c_colwise_add "dynet::expr::colwise_add" (CExpression& x, CExpression& bias) # CExpression c_tanh "dynet::expr::tanh" (CExpression& x) # @@ -225,7 +226,6 @@ cdef extern from "dynet/expr.h" namespace "dynet::expr": CExpression c_affine_transform "dynet::expr::affine_transform" (const vector[CExpression]& xs) CExpression c_trace_of_product "dynet::expr::trace_of_product" (CExpression& x, CExpression& y); - CExpression c_cwise_multiply "dynet::expr::cwise_multiply" (CExpression& x, CExpression& y) # CExpression c_dot_product "dynet::expr::dot_product" (CExpression& x, CExpression& y) # CExpression c_squared_distance "dynet::expr::squared_distance" (CExpression& x, CExpression& y) # diff --git a/python/dynet.pyx b/python/dynet.pyx index a4b2c39e6..eaa1e8ad6 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -839,10 +839,10 @@ cpdef Expression nobackprop(Expression x): return Expression.from_cexpr(x.cg_ver # binary-exp cpdef Expression cdiv(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_cdiv(x.c(), y.c())) +cpdef Expression cmult(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_cmult(x.c(), y.c())) cpdef Expression colwise_add(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_colwise_add(x.c(), y.c())) cpdef Expression trace_of_product(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_trace_of_product(x.c(), y.c())) -cpdef Expression cwise_multiply(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_cwise_multiply(x.c(), y.c())) cpdef Expression dot_product(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_dot_product(x.c(), y.c())) cpdef Expression squared_distance(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_squared_distance(x.c(), y.c())) cpdef Expression l1_distance(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_l1_distance(x.c(), y.c())) diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index db9e79083..22ac31325 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -638,22 +638,22 @@ BOOST_AUTO_TEST_CASE( trace_of_product_gradient ) { BOOST_CHECK(check_grad(mod, z, 0)); } -// Expression cwise_multiply(const Expression& x, const Expression& y); -BOOST_AUTO_TEST_CASE( cwise_multiply_gradient ) { +// Expression cmult(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( cmult_gradient ) { dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = parameter(cg, param2); - Expression y = cwise_multiply(x1, x2); + Expression y = cmult(x1, x2); Expression z = input(cg, {1,3}, ones3_vals) * y; BOOST_CHECK(check_grad(mod, z, 0)); } -// Expression cwise_multiply(const Expression& x, const Expression& y); -BOOST_AUTO_TEST_CASE( cwise_multiply_batch_gradient ) { +// Expression cmult(const Expression& x, const Expression& y); +BOOST_AUTO_TEST_CASE( cmult_batch_gradient ) { dynet::ComputationGraph cg; Expression x1 = parameter(cg, param1); Expression x2 = input(cg, Dim({3},2), batch_vals); - Expression y = cwise_multiply(x1, x2) + cwise_multiply(x2, x1); + Expression y = cmult(x1, x2) + cmult(x2, x1); Expression z = sum_batches(input(cg, {1,3}, ones3_vals) * y); BOOST_CHECK(check_grad(mod, z, 0)); } From a875733607a3c9c3876b0bed7f002ebbc128253b Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Mon, 21 Nov 2016 02:05:55 +0200 Subject: [PATCH 829/965] Update python.rst --- doc/source/python.rst | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/doc/source/python.rst b/doc/source/python.rst index 5a1940bb9..040ac3abc 100644 --- a/doc/source/python.rst +++ b/doc/source/python.rst @@ -31,6 +31,11 @@ TL;DR make -j 2 # replace 2 with the number of available cores cd python python setup.py install # or `python setup.py install --user` for a user-local install. + + # this should suffice, but on some systems you may need to add the following line to your + # init files in order for the compiled .so files be accessible to python. + # /path/to/dynet/build/dynet is the location in which libdynet.dylib resides. + export DYLD_LIBRARY_PATH=/path/to/dynet/build/dynet/:$DYLD_LIBRARY_PATH Detailed Instructions --------------------- @@ -151,6 +156,15 @@ installation is likely to be working: from dynet import * model = Model() +If it doesn't work and you get an error similar to the following: +:: + ImportError: dlopen(/Users/sneharajana/.python-eggs/dyNET-0.0.0-py2.7-macosx-10.11-intel.egg-tmp/_dynet.so, 2): Library not loaded: @rpath/libdynet.dylib + Referenced from: /Users/sneharajana/.python-eggs/dyNET-0.0.0-py2.7-macosx-10.11-intel.egg-tmp/_dynet.so + Reason: image not found`` + +then you may need to run the following (add it to your shell init files): +``export DYLD_LIBRARY_PATH=/path/to/dynet/build/dynet/:$DYLD_LIBRARY_PATH`` + Windows Support ------------------ You can also use Python on Windows by following similar steps to the above. For simplicity, we recommend From a12a06602ac0ce929857589b83ab1b232b14bd89 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Mon, 21 Nov 2016 16:05:00 +0200 Subject: [PATCH 830/965] Update install.rst --- doc/source/install.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index 505d9b369..1be77260e 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -31,7 +31,9 @@ the following command: :: - hg clone https://bitbucket.org/eigen/eigen/ + hg clone https://bitbucket.org/eigen/eigen/ -r 346ecdb + +The `-r NUM` specified a revision number that is known to work. Adventerous users can remove it and use the very latest version, at the risk of the code breaking / not compiling. Building -------- From 843ac1ecb49b3d688ca9efc016413d40874690fb Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Mon, 21 Nov 2016 16:07:24 +0200 Subject: [PATCH 831/965] Update python.rst --- doc/source/python.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/source/python.rst b/doc/source/python.rst index 040ac3abc..79d1c8e11 100644 --- a/doc/source/python.rst +++ b/doc/source/python.rst @@ -19,7 +19,7 @@ TL;DR cd dynet-base # getting dynet and eigen git clone https://github.com/clab/dynet.git - hg clone https://bitbucket.org/eigen/eigen + hg clone https://bitbucket.org/eigen/eigen -r 346ecdb # -r NUM specified a known working revision cd dynet mkdir build cd build @@ -58,7 +58,10 @@ Then get Eigen: cd $HOME cd dynet-base - hg clone https://bitbucket.org/eigen/eigen/ + hg clone https://bitbucket.org/eigen/eigen/ -r 346ecdb + +(`-r NUM` specifies a known working revision of Eigen. You can remove this in order to get the bleeding +edge Eigen, with the risk of some compile breaks, and the possible benefit of added optimizations.) We also need to make sure the ``cython`` module is installed. (you can replace ``pip`` with your favorite package manager, such as ``conda``, From 168e9dece2809dd9e0b578bc4c9a41a02f310d72 Mon Sep 17 00:00:00 2001 From: yoavg Date: Mon, 21 Nov 2016 16:52:46 +0200 Subject: [PATCH 832/965] addad zeroes, random_normal, random_uniform, random_bernoulli to python. --- dynet/expr.h | 27 +++++++++++++++++++++++++++ python/dynet.pxd | 4 ++++ python/dynet.pyx | 9 ++++++++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/dynet/expr.h b/dynet/expr.h index 412d2dd62..fa592e149 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -307,6 +307,33 @@ Expression zeroes(ComputationGraph& g, const Dim& d); */ Expression random_normal(ComputationGraph& g, const Dim& d); +/** + * \ingroup inputoperations + * \brief Create a random bernoulli vector + * \details Create a vector distributed according to bernoulli distribution with parameter p. + * + * \param g Computation graph + * \param d The dimensions of the input + * \param p The bernoulli p parameter + * + * \return A "d" dimensioned bernoulli distributed vector + */ +Expression random_bernoulli(ComputationGraph& g, const Dim& d, real p); + +/** + * \ingroup inputoperations + * \brief Create a random uniform vector + * \details Create a vector distributed according to uniform distribution with boundaries left and right. + * + * \param g Computation graph + * \param d The dimensions of the input + * \param left The left boundary + * \param right The right boundary + * + * \return A "d" dimensioned uniform distributed vector + */ +Expression random_uniform(ComputationGraph& g, const Dim& d, real left, real right); + //////////////////////////////////////////////// // Arithmetic operations // //////////////////////////////////////////////// diff --git a/python/dynet.pxd b/python/dynet.pxd index bbf821181..1c050f3b1 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -181,6 +181,10 @@ cdef extern from "dynet/expr.h" namespace "dynet::expr": #CExpression c_const_lookup "dynet::expr::const_lookup" (CComputationGraph& g, CLookupParameters* p, unsigned index) # CExpression c_const_lookup "dynet::expr::const_lookup" (CComputationGraph& g, CLookupParameters p, unsigned* pindex) # CExpression c_const_lookup "dynet::expr::const_lookup" (CComputationGraph& g, CLookupParameters p, vector[unsigned]* pindices) # + CExpression c_zeroes "dynet::expr::zeroes" (CComputationGraph& g, CDim& d) # + CExpression c_random_normal "dynet::expr::random_normal" (CComputationGraph& g, CDim& d) # + CExpression c_random_bernoulli "dynet::expr::random_bernoulli" (CComputationGraph& g, CDim& d, float p) + CExpression c_random_uniform "dynet::expr::random_uniform" (CComputationGraph& g, CDim& d, float left, float right) # # identity function, but derivative is not propagated through it CExpression c_nobackprop "dynet::expr::nobackprop" (CExpression& x) # diff --git a/python/dynet.pyx b/python/dynet.pyx index eaa1e8ad6..37056fe90 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -563,6 +563,8 @@ cdef class ComputationGraph: r = _pickerBatchExpression(self, e, vs) return r + + # }}} #{{{ Expressions @@ -802,7 +804,7 @@ def pick(Expression e, unsigned index=0): cdef class _pickerBatchExpression(Expression): cdef UnsignedVectorValue val - def __cinit__(self, ComputationGraph g, Expression e, vector[unsigned] indices): + def __cinit__(self, ComputationGraph g, Expression e, vector[unsigned] indices):# self.val = UnsignedVectorValue(indices) self.cg_version = g.version() cdef CExpression ce @@ -835,6 +837,11 @@ def hinge(Expression x, unsigned index, float m=1.0): # }}} +cpdef Expression zeroes(dim, int batch_size=1): return Expression.from_cexpr(_cg.version(), c_zeroes(_cg.thisptr[0], CDim(dim, batch_size))) +cpdef Expression random_normal(dim, int batch_size=1): return Expression.from_cexpr(_cg.version(), c_random_normal(_cg.thisptr[0], CDim(dim, batch_size))) +cpdef Expression random_bernoulli(dim, float p, int batch_size=1): return Expression.from_cexpr(_cg.version(), c_random_bernoulli(_cg.thisptr[0], CDim(dim, batch_size), p)) +cpdef Expression random_uniform(dim, float left, float right, int batch_size=1): return Expression.from_cexpr(_cg.version(), c_random_uniform(_cg.thisptr[0], CDim(dim, batch_size), left, right)) + cpdef Expression nobackprop(Expression x): return Expression.from_cexpr(x.cg_version, c_nobackprop(x.c())) # binary-exp From 97b12ca6f18d8328df8cf053ed533962f145752d Mon Sep 17 00:00:00 2001 From: paul Date: Mon, 21 Nov 2016 09:53:15 -0500 Subject: [PATCH 833/965] Added threshold clipping to python bindings --- python/dynet.pxd | 7 +++++-- python/dynet.pyx | 24 ++++++++++++++++++++++++ python/dynet_viz.py | 3 +++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/python/dynet.pxd b/python/dynet.pxd index 07783f6aa..e744d7e72 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -133,18 +133,21 @@ cdef extern from "dynet/training.h" namespace "dynet": cdef cppclass CSimpleSGDTrainer "dynet::SimpleSGDTrainer": #CSimpleSGDTrainer(CModel* m, float lam, float e0) CSimpleSGDTrainer(CModel* m, float e0, float edecay) # TODO removed lam, update docs. + float clip_threshold void update(float s) void update_epoch(float r) void status() cdef cppclass CMomentumSGDTrainer "dynet::MomentumSGDTrainer": CMomentumSGDTrainer(CModel* m, float e0, float mom, float edecay) # TODO removed lam, update docs + float clip_threshold void update(float s) void update_epoch(float r) void status() cdef cppclass CAdagradTrainer "dynet::AdagradTrainer": CAdagradTrainer(CModel* m, float e0, float eps, float edecay) # TODO removed lam, update docs + float clip_threshold void update(float s) void update_epoch(float r) @@ -152,14 +155,14 @@ cdef extern from "dynet/training.h" namespace "dynet": cdef cppclass CAdadeltaTrainer "dynet::AdadeltaTrainer": CAdadeltaTrainer(CModel* m, float eps, float rho, float edecay) # TODO removed lam, update docs - + float clip_threshold void update(float s) void update_epoch(float r) void status() cdef cppclass CAdamTrainer "dynet::AdamTrainer": CAdamTrainer(CModel* m, float alpha, float beta_1, float beta_2, float eps, float edecay) # TODO removed lam, update docs - + float clip_threshold void update(float s) void update_epoch(float r) void status() diff --git a/python/dynet.pyx b/python/dynet.pyx index 99e0e0671..5a26285d1 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -1373,6 +1373,10 @@ cdef class SimpleSGDTrainer: self.thisptr.update_epoch(r) cpdef status(self): self.thisptr.status() + cpdef set_clip_threshold(self,float thr): + self.thisptr.clip_threshold = thr + cpdef get_clip_threshold(self): + return self.thisptr.clip_threshold cdef class MomentumSGDTrainer: cdef CMomentumSGDTrainer *thisptr @@ -1386,6 +1390,11 @@ cdef class MomentumSGDTrainer: self.thisptr.update_epoch(r) cpdef status(self): self.thisptr.status() + cpdef set_clip_threshold(self,float thr): + self.thisptr.clip_threshold = thr + cpdef get_clip_threshold(self): + return self.thisptr.clip_threshold + cdef class AdagradTrainer: cdef CAdagradTrainer *thisptr @@ -1399,6 +1408,11 @@ cdef class AdagradTrainer: self.thisptr.update_epoch(r) cpdef status(self): self.thisptr.status() + cpdef set_clip_threshold(self,float thr): + self.thisptr.clip_threshold = thr + cpdef get_clip_threshold(self): + return self.thisptr.clip_threshold + cdef class AdadeltaTrainer: cdef CAdadeltaTrainer *thisptr @@ -1412,6 +1426,11 @@ cdef class AdadeltaTrainer: self.thisptr.update_epoch(r) cpdef status(self): self.thisptr.status() + cpdef set_clip_threshold(self,float thr): + self.thisptr.clip_threshold = thr + cpdef get_clip_threshold(self): + return self.thisptr.clip_threshold + cdef class AdamTrainer: cdef CAdamTrainer *thisptr @@ -1425,5 +1444,10 @@ cdef class AdamTrainer: self.thisptr.update_epoch(r) cpdef status(self): self.thisptr.status() + cpdef set_clip_threshold(self,float thr): + self.thisptr.clip_threshold = thr + cpdef get_clip_threshold(self): + return self.thisptr.clip_threshold + #}}} diff --git a/python/dynet_viz.py b/python/dynet_viz.py index 6f902c842..42621935e 100644 --- a/python/dynet_viz.py +++ b/python/dynet_viz.py @@ -672,6 +672,9 @@ class Trainer(object): def update(self, s=1.0): pass def update_epoch(self, r = 1.0): pass def status(self): pass + def set_clip_threshold(self, thr): pass + def get_clip_threshold(self): pass + class SimpleSGDTrainer(Trainer): def __init__(self, m, e0 = 0.1): pass class MomentumSGDTrainer(Trainer): From 07a154c45c7beb13f7b5e4792c9c5cde302bacbe Mon Sep 17 00:00:00 2001 From: paul Date: Mon, 21 Nov 2016 10:20:39 -0500 Subject: [PATCH 834/965] Added support for gradient clipping disabling to python --- python/dynet.pxd | 6 +++++- python/dynet.pyx | 35 ++++++++++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/python/dynet.pxd b/python/dynet.pxd index e744d7e72..88a353bb0 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -134,6 +134,7 @@ cdef extern from "dynet/training.h" namespace "dynet": #CSimpleSGDTrainer(CModel* m, float lam, float e0) CSimpleSGDTrainer(CModel* m, float e0, float edecay) # TODO removed lam, update docs. float clip_threshold + bool clipping_enabled void update(float s) void update_epoch(float r) void status() @@ -141,6 +142,7 @@ cdef extern from "dynet/training.h" namespace "dynet": cdef cppclass CMomentumSGDTrainer "dynet::MomentumSGDTrainer": CMomentumSGDTrainer(CModel* m, float e0, float mom, float edecay) # TODO removed lam, update docs float clip_threshold + bool clipping_enabled void update(float s) void update_epoch(float r) void status() @@ -148,7 +150,7 @@ cdef extern from "dynet/training.h" namespace "dynet": cdef cppclass CAdagradTrainer "dynet::AdagradTrainer": CAdagradTrainer(CModel* m, float e0, float eps, float edecay) # TODO removed lam, update docs float clip_threshold - + bool clipping_enabled void update(float s) void update_epoch(float r) void status() @@ -156,6 +158,7 @@ cdef extern from "dynet/training.h" namespace "dynet": cdef cppclass CAdadeltaTrainer "dynet::AdadeltaTrainer": CAdadeltaTrainer(CModel* m, float eps, float rho, float edecay) # TODO removed lam, update docs float clip_threshold + bool clipping_enabled void update(float s) void update_epoch(float r) void status() @@ -163,6 +166,7 @@ cdef extern from "dynet/training.h" namespace "dynet": cdef cppclass CAdamTrainer "dynet::AdamTrainer": CAdamTrainer(CModel* m, float alpha, float beta_1, float beta_2, float eps, float edecay) # TODO removed lam, update docs float clip_threshold + bool clipping_enabled void update(float s) void update_epoch(float r) void status() diff --git a/python/dynet.pyx b/python/dynet.pyx index 5a26285d1..0b88a485f 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -1374,7 +1374,12 @@ cdef class SimpleSGDTrainer: cpdef status(self): self.thisptr.status() cpdef set_clip_threshold(self,float thr): - self.thisptr.clip_threshold = thr + if thr<=0: + self.thisptr.clipping_enabled = False + self.thisptr.clip_threshold = 0.0 + else: + self.thisptr.clipping_enabled = True + self.thisptr.clip_threshold = thr cpdef get_clip_threshold(self): return self.thisptr.clip_threshold @@ -1391,7 +1396,12 @@ cdef class MomentumSGDTrainer: cpdef status(self): self.thisptr.status() cpdef set_clip_threshold(self,float thr): - self.thisptr.clip_threshold = thr + if thr<=0: + self.thisptr.clipping_enabled = False + self.thisptr.clip_threshold = 0.0 + else: + self.thisptr.clipping_enabled = True + self.thisptr.clip_threshold = thr cpdef get_clip_threshold(self): return self.thisptr.clip_threshold @@ -1409,7 +1419,12 @@ cdef class AdagradTrainer: cpdef status(self): self.thisptr.status() cpdef set_clip_threshold(self,float thr): - self.thisptr.clip_threshold = thr + if thr<=0: + self.thisptr.clipping_enabled = False + self.thisptr.clip_threshold = 0.0 + else: + self.thisptr.clipping_enabled = True + self.thisptr.clip_threshold = thr cpdef get_clip_threshold(self): return self.thisptr.clip_threshold @@ -1427,7 +1442,12 @@ cdef class AdadeltaTrainer: cpdef status(self): self.thisptr.status() cpdef set_clip_threshold(self,float thr): - self.thisptr.clip_threshold = thr + if thr<=0: + self.thisptr.clipping_enabled = False + self.thisptr.clip_threshold = 0.0 + else: + self.thisptr.clipping_enabled = True + self.thisptr.clip_threshold = thr cpdef get_clip_threshold(self): return self.thisptr.clip_threshold @@ -1445,7 +1465,12 @@ cdef class AdamTrainer: cpdef status(self): self.thisptr.status() cpdef set_clip_threshold(self,float thr): - self.thisptr.clip_threshold = thr + if thr<=0: + self.thisptr.clipping_enabled = False + self.thisptr.clip_threshold = 0.0 + else: + self.thisptr.clipping_enabled = True + self.thisptr.clip_threshold = thr cpdef get_clip_threshold(self): return self.thisptr.clip_threshold From d219cdd1d37fc83b10fdacad2ba3e5aa885e6439 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 21 Nov 2016 10:30:00 -0500 Subject: [PATCH 835/965] Some more documentation for pickneglogsoftmax etc. --- dynet/expr.h | 156 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 135 insertions(+), 21 deletions(-) diff --git a/dynet/expr.h b/dynet/expr.h index 412d2dd62..2a8fff7ae 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -463,6 +463,32 @@ inline Expression affine_transform(const std::initializer_list& xs) template inline Expression affine_transform(const T& xs) { return detail::f(xs); } +/** + * \ingroup arithmeticoperations + * \brief Sum + * \details This performs an elementwise sum over all the expressions ins x + * + * \param x An initializer list containing expressions + * + * \return An expression where the ith element is equal to x[0][i] + x[1][i] + ... + */ +inline Expression sum(const std::initializer_list& xs) { return detail::f(xs); } +template +inline Expression sum(const T& xs) { return detail::f(xs); } + +/** + * \ingroup arithmeticoperations + * \brief Average + * \details This performs an elementwise average over all the expressions ins x + * + * \param x An initializer list containing expressions + * + * \return An expression where the ith element is equal to (x[0][i] + x[1][i] + ...)/|x| + */ +inline Expression average(const std::initializer_list& xs) { return detail::f(xs); } +template +inline Expression average(const T& xs) { return detail::f(xs); } + /** * \ingroup arithmeticoperations * \brief Square root @@ -619,6 +645,19 @@ Expression min(const Expression& x, const Expression& y); */ Expression max(const Expression& x, const Expression& y); +/** + * \ingroup arithmeticoperations + * \brief Max + * \details This performs an elementwise sum over all the expressions in x + * + * \param x An initializer list containing expressions + * + * \return An expression where the ith element is equal to max(x[0][i], x[1][i], ...) + */ +inline Expression max(const std::initializer_list& xs) { return detail::f(xs); } +template +inline Expression max(const T& xs) { return detail::f(xs); } + /** * \ingroup arithmeticoperations * \brief Dot Product @@ -644,7 +683,6 @@ Expression dot_product(const Expression& x, const Expression& y); */ Expression cmult(const Expression& x, const Expression& y); - /** * \ingroup arithmeticoperations * \brief Componentwise multiply @@ -673,23 +711,111 @@ Expression colwise_add(const Expression& x, const Expression& bias); // Probability/loss operations // //////////////////////////////////////////////// +/** + * \ingroup lossoperations + * \brief Softmax + * \details The softmax function, which sets each element to be e^{x[i]}/{sum_j e^{x[j]}}. + * + * \param x A vector + * + * \return A vector after calculating the softmax + */ +Expression softmax(const Expression& x); + +/** + * \ingroup lossoperations + * \brief Log softmax + * \details The log of the softmax function, which sets each element to be + * log( e^{x[i]}/{sum_j e^{x[j]}} ). + * + * \param x A vector + * + * \return A vector after calculating the log softmax + */ +Expression log_softmax(const Expression& x); + +/** + * \ingroup lossoperations + * \brief Restricted log softmax + * \details The log softmax function calculated over only a subset of the vector elements. The + * elements to be included are set by the `restriction` variable. All elements not + * included in `restriction` are set to negative infinity. + * + * \param x A vector over which to calculate the softmax + * \param restriction The elements over which to calculate the softmax + * + * \return A vector with the log softmax over the specified elements + */ +Expression log_softmax(const Expression& x, const std::vector& restriction); + +/** + * \ingroup lossoperations + * \brief Negative softmax log likelihood + * \details This function takes in a vector of scores `x`, and performs a log softmax, takes + * the negative, and selects the likelihood corresponding to the element `v`. This is + * perhaps the most standard loss function for training neural networks to predict + * one out of a set of elements. + * + * \param x A vector of scores + * \param v The element with which to calculate the loss + * + * \return The negative log likelihood of element `v` after taking the softmax + */ +Expression pickneglogsoftmax(const Expression& x, unsigned v); + +/** + * \ingroup lossoperations + * \brief Modifiable negative softmax log likelihood + * \details This function calculates the negative log likelihood after the softmax with + * with respect to index `*pv`. This computes the same value as the previous function + * that passes the index `v` by value, but instead passes by pointer so the value + * `*pv` can be modified without re-constructing the computation graph. This can be + * used in situations where we want to create a computation graph once, then feed it + * different data points. + * + * \param x A vector of scores + * \param pv A pointer to the index of the correct element + * + * \return The negative log likelihood of element `*pv` after taking the softmax + */ +Expression pickneglogsoftmax(const Expression& x, unsigned * pv); + +/** + * \ingroup lossoperations + * \brief Batched negative softmax log likelihood + * \details This function is similar to standard pickneglogsoftmax, but calculates loss with + * respect to multiple batch elements. The input will be a mini-batch of score vectors + * where the number of batch elements is equal to the number of indices in `v`. + * + * \param x An expression with vectors of scores over N batch elements + * \param v A size-N vector indicating the index with respect to all the batch elements + * + * \return The negative log likelihoods over all the batch elements + */ +Expression pickneglogsoftmax(const Expression& x, const std::vector & v); + +/** + * \ingroup lossoperations + * \brief Modifiable batched negative softmax log likelihood + * \details This function is a combination of modifiable pickneglogsoftmax and batched + * pickneglogsoftmax: `pv` can be modified without re-creating the computation graph. + * + * \param x An expression with vectors of scores over N batch elements + * \param v A size-N vector indicating the index with respect to all the batch elements + * + * \return The negative log likelihoods over all the batch elements + */ +Expression pickneglogsoftmax(const Expression& x, const std::vector * pv); + Expression hinge(const Expression& x, unsigned index, float m = 1.0); Expression hinge(const Expression& x, const std::vector & indices, float m = 1.0); Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0); Expression hinge(const Expression& x, const std::vector * pindices, float m = 1.0); -Expression softmax(const Expression& x); -Expression log_softmax(const Expression& x); Expression sparsemax(const Expression& x); -Expression log_softmax(const Expression& x, const std::vector& restriction); Expression sparsemax(const Expression& x); Expression sparsemax_loss(const Expression& x, const std::vector& target_support); Expression sparsemax_loss(const Expression& x, const std::vector* ptarget_support); -Expression pickneglogsoftmax(const Expression& x, unsigned v); -Expression pickneglogsoftmax(const Expression& x, const std::vector & v); -Expression pickneglogsoftmax(const Expression& x, unsigned * pv); -Expression pickneglogsoftmax(const Expression& x, const std::vector * pv); - Expression squared_norm(const Expression& x); Expression squared_distance(const Expression& x, const Expression& y); Expression huber_distance(const Expression& x, const Expression& y, float c = 1.345f); @@ -703,18 +829,6 @@ template inline Expression logsumexp(const T& xs) { return detail::f(xs); } inline Expression logsumexp(const std::initializer_list& xs) { return detail::f(xs); } -template -inline Expression sum(const T& xs) { return detail::f(xs); } -inline Expression sum(const std::initializer_list& xs) { return detail::f(xs); } - -template -inline Expression max(const T& xs) { return detail::f(xs); } -inline Expression max(const std::initializer_list& xs) { return detail::f(xs); } - -template -inline Expression average(const T& xs) { return detail::f(xs); } -inline Expression average(const std::initializer_list& xs) { return detail::f(xs); } - //////////////////////////////////////////////// // Flow operations // //////////////////////////////////////////////// From d34ce163b165000265936a62917931a8f9678082 Mon Sep 17 00:00:00 2001 From: paul Date: Mon, 21 Nov 2016 14:46:42 -0500 Subject: [PATCH 836/965] Added a bunch of missing functions --- python/dynet.pxd | 5 +++++ python/dynet.pyx | 5 +++++ python/dynet_viz.py | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/python/dynet.pxd b/python/dynet.pxd index 88a353bb0..821da0244 100644 --- a/python/dynet.pxd +++ b/python/dynet.pxd @@ -209,8 +209,11 @@ cdef extern from "dynet/expr.h" namespace "dynet::expr": CExpression c_tanh "dynet::expr::tanh" (CExpression& x) # CExpression c_exp "dynet::expr::exp" (CExpression& x) # CExpression c_square "dynet::expr::square" (CExpression& x) # + CExpression c_sqrt "dynet::expr::sqrt" (CExpression& x) # + CExpression c_erf "dynet::expr::erf" (CExpression& x) # CExpression c_cube "dynet::expr::cube" (CExpression& x) # CExpression c_log "dynet::expr::log" (CExpression& x) # + CExpression c_lgamma "dynet::expr::lgamma" (CExpression& x) # CExpression c_logistic "dynet::expr::logistic" (CExpression& x) # CExpression c_rectify "dynet::expr::rectify" (CExpression& x) # #CExpression c_hinge "dynet::expr::hinge" (CExpression& x, unsigned index, float m=?) # @@ -219,6 +222,7 @@ cdef extern from "dynet/expr.h" namespace "dynet::expr": CExpression c_log_softmax "dynet::expr::log_softmax" (CExpression& x, vector[unsigned]& restriction) #? CExpression c_softmax "dynet::expr::softmax" (CExpression& x) # CExpression c_softsign "dynet::expr::softsign" (CExpression& x) # + CExpression c_pow "dynet::expr::pow" (CExpression& x, CExpression& y) # CExpression c_bmin "dynet::expr::min" (CExpression& x, CExpression& y) # CExpression c_bmax "dynet::expr::max" (CExpression& x, CExpression& y) # CExpression c_noise "dynet::expr::noise" (CExpression& x, float stddev) # @@ -235,6 +239,7 @@ cdef extern from "dynet/expr.h" namespace "dynet::expr": CExpression c_dot_product "dynet::expr::dot_product" (CExpression& x, CExpression& y) # CExpression c_squared_distance "dynet::expr::squared_distance" (CExpression& x, CExpression& y) # + CExpression c_squared_norm "dynet::expr::squared_norm" (CExpression& x) # CExpression c_huber_distance "dynet::expr::huber_distance" (CExpression& x, CExpression& y, float c) # CExpression c_l1_distance "dynet::expr::l1_distance" (CExpression& x, CExpression& y) # CExpression c_binary_log_loss "dynet::expr::binary_log_loss" (CExpression& x, CExpression& y) # diff --git a/python/dynet.pyx b/python/dynet.pyx index 0b88a485f..76ccdbd17 100644 --- a/python/dynet.pyx +++ b/python/dynet.pyx @@ -834,6 +834,7 @@ cpdef Expression colwise_add(Expression x, Expression y): ensure_freshness(y); r cpdef Expression trace_of_product(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_trace_of_product(x.c(), y.c())) cpdef Expression cwise_multiply(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_cwise_multiply(x.c(), y.c())) cpdef Expression dot_product(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_dot_product(x.c(), y.c())) +cpdef Expression squared_norm(Expression x): return Expression.from_cexpr(x.cg_version, c_squared_norm(x.c())) cpdef Expression squared_distance(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_squared_distance(x.c(), y.c())) cpdef Expression l1_distance(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_l1_distance(x.c(), y.c())) cpdef Expression binary_log_loss(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_binary_log_loss(x.c(), y.c())) @@ -845,8 +846,11 @@ cpdef Expression filter1d_narrow(Expression x, Expression y): ensure_freshness(y cpdef Expression tanh(Expression x): return Expression.from_cexpr(x.cg_version, c_tanh(x.c())) cpdef Expression exp(Expression x): return Expression.from_cexpr(x.cg_version, c_exp(x.c())) cpdef Expression square(Expression x): return Expression.from_cexpr(x.cg_version, c_square(x.c())) +cpdef Expression sqrt(Expression x): return Expression.from_cexpr(x.cg_version, c_sqrt(x.c())) +cpdef Expression erf(Expression x): return Expression.from_cexpr(x.cg_version, c_erf(x.c())) cpdef Expression cube(Expression x): return Expression.from_cexpr(x.cg_version, c_cube(x.c())) cpdef Expression log(Expression x): return Expression.from_cexpr(x.cg_version, c_log(x.c())) +cpdef Expression lgamma(Expression x): return Expression.from_cexpr(x.cg_version, c_lgamma(x.c())) cpdef Expression logistic(Expression x): return Expression.from_cexpr(x.cg_version, c_logistic(x.c())) cpdef Expression rectify(Expression x): return Expression.from_cexpr(x.cg_version, c_rectify(x.c())) cpdef Expression log_softmax(Expression x, list restrict=None): @@ -856,6 +860,7 @@ cpdef Expression log_softmax(Expression x, list restrict=None): return Expression.from_cexpr(x.cg_version, c_log_softmax(x.c(), vec)) cpdef Expression softmax(Expression x): return Expression.from_cexpr(x.cg_version, c_softmax(x.c())) cpdef Expression softsign(Expression x): return Expression.from_cexpr(x.cg_version, c_softsign(x.c())) +cpdef Expression pow(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_pow(x.c(), y.c())) cpdef Expression bmin(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_bmin(x.c(), y.c())) cpdef Expression bmax(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_bmax(x.c(), y.c())) cpdef Expression transpose(Expression x): return Expression.from_cexpr(x.cg_version, c_transpose(x.c())) diff --git a/python/dynet_viz.py b/python/dynet_viz.py index 42621935e..38a96c738 100644 --- a/python/dynet_viz.py +++ b/python/dynet_viz.py @@ -283,13 +283,17 @@ def filter1d_narrow(x, y): def tanh(x): return GVExpr('tanh', [x], copy_dim(x)) def exp(x): return GVExpr('exp', [x], copy_dim(x)) def square(x): return GVExpr('square', [x], copy_dim(x)) +def sqrt(x): return GVExpr('sqrt', [x], copy_dim(x)) +def erf(x): return GVExpr('erf', [x], copy_dim(x)) def cube(x): return GVExpr('cube', [x], copy_dim(x)) def log(x): return GVExpr('log', [x], copy_dim(x)) +def lgamma(x): return GVExpr('lgamma', [x], copy_dim(x)) def logistic(x): return GVExpr('logistic', [x], copy_dim(x)) def rectify(x): return GVExpr('rectify', [x], copy_dim(x)) def log_softmax(x, restrict=None): return GVExpr('log_softmax', [x,restrict], copy_dim(x)) def softmax(x): return GVExpr('softmax', [x], copy_dim(x)) def softsign(x): return GVExpr('softsign', [x], copy_dim(x)) +def pow(x, y): return GVExpr('pow', [x,y], ensure_same_dim(x,y)) def bmin(x, y): return GVExpr('bmin', [x,y], ensure_same_dim(x,y)) def bmax(x, y): return GVExpr('bmax', [x,y], ensure_same_dim(x,y)) def transpose(x): return GVExpr('transpose', [x], x.dim[::-1] if x.dim.isvalid() else InvalidDim) @@ -676,6 +680,9 @@ def set_clip_threshold(self, thr): pass def get_clip_threshold(self): pass class SimpleSGDTrainer(Trainer): + """ + This object is very cool! + """ def __init__(self, m, e0 = 0.1): pass class MomentumSGDTrainer(Trainer): def __init__(self, m, e0 = 0.01, mom = 0.9): pass From aa03883a18d80984c02c9469058275a66e865839 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 21 Nov 2016 17:18:28 -0500 Subject: [PATCH 837/965] Fixed some linking problems? --- CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c8e656e9..9560b8c06 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,6 @@ project(dynet) cmake_minimum_required(VERSION 2.8 FATAL_ERROR) -set(CMAKE_MACOSX_RPATH 1) set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # DYNET uses Eigen which exploits modern CPU architectures. To get the @@ -12,6 +11,11 @@ set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # flags (the compiler does not always make the best configuration # decisions without help) +# NOTE: This seems to be causing problems with linking before using +# make install. It is allegedly preferred, but probably doesn't +# suit our model of not installing the library most of the time. +set(CMAKE_MACOSX_RPATH 0) + function(find_mkl) set(MKL_ARCH intel64) find_path(MKL_INCLUDE_DIR mkl.h From 3b60eec570672a3b5088e21b3849deaeb980ab18 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 21 Nov 2016 17:38:34 -0500 Subject: [PATCH 838/965] Made it possible to do dense updates --- dynet/shadow-params.cc | 29 +++++++++++++++++++------ dynet/shadow-params.h | 8 +++++-- dynet/training.cc | 33 ++++++++++++++++++++++++++-- dynet/training.h | 49 ++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 106 insertions(+), 13 deletions(-) diff --git a/dynet/shadow-params.cc b/dynet/shadow-params.cc index c45657eb6..5506b6863 100644 --- a/dynet/shadow-params.cc +++ b/dynet/shadow-params.cc @@ -17,10 +17,20 @@ ShadowParameters::ShadowParameters(const ParameterStorage& p) : h(p.values) { TensorTools::Zero(h); } -ShadowLookupParameters::ShadowLookupParameters(const LookupParameterStorage& lp) : h(lp.values) { - for (auto& t : h) { - default_device->allocate_tensor(DeviceMempool::PS, t); - TensorTools::Zero(t); +ShadowLookupParameters::ShadowLookupParameters(const LookupParameterStorage& lp) : all_h(lp.all_values) { + default_device->allocate_tensor(DeviceMempool::PS, all_h); + TensorTools::Zero(all_h); + initialize_lookups(); +} + +void ShadowLookupParameters::initialize_lookups() { + int num = all_h.d[all_h.d.nd-1]; + Dim dim = all_h.d; dim.nd--; + int dim_size = dim.size(); + if(h.size() == 0) { + h.resize(num); + for(int i = 0; i < num; ++i) + h[i] = Tensor(dim, all_h.v + i*dim_size, all_h.device, all_h.mem_pool); } } @@ -47,10 +57,15 @@ void ShadowParameters::serialize(Archive& ar, const unsigned int) { DYNET_SERIALIZE_IMPL(ShadowParameters) template -void ShadowLookupParameters::serialize(Archive& ar, const unsigned int) { - ar & h; +void ShadowLookupParameters::save(Archive& ar, const unsigned int) const { + ar << h; +} +template +void ShadowLookupParameters::load(Archive& ar, const unsigned int) { + ar >> h; + initialize_lookups(); } -DYNET_SERIALIZE_IMPL(ShadowLookupParameters) +DYNET_SAVELOAD_IMPL(ShadowLookupParameters) } // namespace dynet diff --git a/dynet/shadow-params.h b/dynet/shadow-params.h index 2c20ac7fd..afda87450 100644 --- a/dynet/shadow-params.h +++ b/dynet/shadow-params.h @@ -27,12 +27,16 @@ struct ShadowParameters { struct ShadowLookupParameters { ShadowLookupParameters() {} explicit ShadowLookupParameters(const LookupParameterStorage& lp); + Tensor all_h; std::vector h; private: + void initialize_lookups(); friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int); - + void save(Archive& ar, const unsigned int) const; + template + void load(Archive& ar, const unsigned int); + BOOST_SERIALIZATION_SPLIT_MEMBER() }; // one per element in model.parameters_list diff --git a/dynet/training.cc b/dynet/training.cc index 0f2e92268..c374f7cd5 100644 --- a/dynet/training.cc +++ b/dynet/training.cc @@ -94,8 +94,12 @@ void Trainer::update(real scale) { const auto & lookup_params = model->lookup_parameters_list(); const auto & upd_lookup_params = model->updated_lookup_parameters_list(); for(auto i : upd_lookup_params) { - for (auto j : lookup_params[i]->non_zero_grads) - update_lookup_params(scale, gscale, i, j); + if(sparse_updates_enabled) { + for (auto j : lookup_params[i]->non_zero_grads) + update_lookup_params(scale, gscale, i, j); + } else { + update_lookup_params(scale, gscale, i); + } lookup_params[i]->clear(); } ++updates; @@ -125,6 +129,10 @@ void SimpleSGDTrainer::update_lookup_params(real scale, real gscale, size_t idx, auto & p = model->lookup_parameters_list()[idx]; update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx]}); } +void SimpleSGDTrainer::update_lookup_params(real scale, real gscale, size_t idx) { + auto & p = model->lookup_parameters_list()[idx]; + update_rule(scale, gscale, {&p->all_values, &p->all_grads}); +} #endif // --- MomentumSGDTrainer @@ -146,6 +154,10 @@ void MomentumSGDTrainer::update_lookup_params(real scale, real gscale, size_t id auto & p = model->lookup_parameters_list()[idx]; update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx], &vlp[idx].h[lidx]}); } +void MomentumSGDTrainer::update_lookup_params(real scale, real gscale, size_t idx) { + auto & p = model->lookup_parameters_list()[idx]; + update_rule(scale, gscale, {&p->all_values, &p->all_grads, &vlp[idx].all_h}); +} void MomentumSGDTrainer::alloc_impl() { vp = allocate_shadow_parameters(*model); vlp = allocate_shadow_lookup_parameters(*model); @@ -172,6 +184,10 @@ void AdagradTrainer::update_lookup_params(real scale, real gscale, size_t idx, s auto & p = model->lookup_parameters_list()[idx]; update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx], &vlp[idx].h[lidx]}); } +void AdagradTrainer::update_lookup_params(real scale, real gscale, size_t idx) { + auto & p = model->lookup_parameters_list()[idx]; + update_rule(scale, gscale, {&p->all_values, &p->all_grads, &vlp[idx].all_h}); +} void AdagradTrainer::alloc_impl() { vp = allocate_shadow_parameters(*model); vlp = allocate_shadow_lookup_parameters(*model); @@ -200,6 +216,10 @@ void AdadeltaTrainer::update_lookup_params(real scale, real gscale, size_t idx, auto & p = model->lookup_parameters_list()[idx]; update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx], &hlg[idx].h[lidx], &hld[idx].h[lidx]}); } +void AdadeltaTrainer::update_lookup_params(real scale, real gscale, size_t idx) { + auto & p = model->lookup_parameters_list()[idx]; + update_rule(scale, gscale, {&p->all_values, &p->all_grads, &hlg[idx].all_h, &hld[idx].all_h}); +} void AdadeltaTrainer::alloc_impl() { hg = allocate_shadow_parameters(*model); hlg = allocate_shadow_lookup_parameters(*model); @@ -234,6 +254,11 @@ void RmsPropTrainer::update_lookup_params(real scale, real gscale, size_t idx, s // auto & p = model->lookup_parameters_list()[idx]; // update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx], &hlg[idx].h[lidx], &hld[idx].h[lidx]}); } +void RmsPropTrainer::update_lookup_params(real scale, real gscale, size_t idx) { + throw std::runtime_error("RMSProp optimization not implemented yet."); + // auto & p = model->lookup_parameters_list()[idx]; + // update_rule(scale, gscale, {&p->all_values, &p->all_grads, &hlg[idx].all_h, &hld[idx].all_h}); +} void RmsPropTrainer::alloc_impl() { throw std::runtime_error("RMSProp optimization not implemented yet."); // hg.resize(model->parameters_list().size()); @@ -268,6 +293,10 @@ void AdamTrainer::update_lookup_params(real scale, real gscale, size_t idx, size auto & p = model->lookup_parameters_list()[idx]; update_rule(scale, gscale, {&p->values[lidx], &p->grads[lidx], &lm[idx].h[lidx], &lv[idx].h[lidx]}); } +void AdamTrainer::update_lookup_params(real scale, real gscale, size_t idx) { + auto & p = model->lookup_parameters_list()[idx]; + update_rule(scale, gscale, {&p->all_values, &p->all_grads, &lm[idx].all_h, &lv[idx].all_h}); +} void AdamTrainer::alloc_impl() { m = allocate_shadow_parameters(*model); lm = allocate_shadow_lookup_parameters(*model); diff --git a/dynet/training.h b/dynet/training.h index 88a8bd12d..c3c29cb27 100644 --- a/dynet/training.h +++ b/dynet/training.h @@ -22,6 +22,7 @@ #define DYNET_TRAINER_DEFINE_DEV_IMPL() \ void update_params(real scale, real gscale, size_t idx) override; \ void update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) override; \ + void update_lookup_params(real scale, real gscale, size_t idx) override; \ template \ void update_rule_dev(const MyDevice & dev, real scale, real gscale, const std::vector & values); \ void update_rule(real scale, real gscale, const std::vector & values) override; @@ -43,7 +44,8 @@ struct Trainer { * \param e0 Initial learning rate */ explicit Trainer(Model* m, real e0, real edecay = 0.0) : - eta0(e0), eta(e0), eta_decay(edecay), epoch(), clipping_enabled(true), clip_threshold(5), clips(), updates(), aux_allocated(false), model(m) {} + eta0(e0), eta(e0), eta_decay(edecay), epoch(), clipping_enabled(true), clip_threshold(5), + clips(), updates(), sparse_updates_enabled(true), aux_allocated(false), model(m) {} virtual ~Trainer(); void update(real scale = 1.0); @@ -69,11 +71,24 @@ struct Trainer { real epoch; // clipping - real clipping_enabled; + bool clipping_enabled; real clip_threshold; real clips; real updates; + /** + * \brief Whether to perform sparse updates + * \details DyNet trainers support two types of updates for lookup parameters, + * sparse and dense. Sparse updates are the default. They have the + * potential to be faster, as they only touch the parameters that have + * non-zero gradients. However, they may not always be faster (particulary + * on GPU with mini-batch training), and are not precisely numerically + * correct for some update rules such as MomentumTrainer and AdamTrainer. + * Thus, if you set this variable to false, the trainer will perform dense + * updates and be precisely correct, and maybe faster sometimes. + */ + bool sparse_updates_enabled; + bool aux_allocated; void status() { @@ -86,9 +101,39 @@ struct Trainer { protected: Trainer() {} virtual void alloc_impl() { } + /** + * \brief The actual rule to update the parameters + * + * \param scale Scale of the update (i.e. learning rate) + * \param gscale Gradient scale based on clipping + * \param values Values specific to the particular update rule being implemented + */ virtual void update_rule(real scale, real gscale, const std::vector & values) = 0; + /** + * \brief Parameter update function + * + * \param scale Scale of the update (i.e. learning rate) + * \param gscale Gradient scale based on clipping + * \param idx Index of the parameter + */ virtual void update_params(real scale, real gscale, size_t idx) = 0; + /** + * \brief Sparse lookup parameter update function + * + * \param scale Scale of the update (i.e. learning rate) + * \param gscale Gradient scale based on clipping + * \param idx Index of the lookup parameter object + * \param lidx Index of the specific entry within the lookup parameter object + */ virtual void update_lookup_params(real scale, real gscale, size_t idx, size_t lidx) = 0; + /** + * \brief Dense lookup parameter update function + * + * \param scale Scale of the update (i.e. learning rate) + * \param gscale Gradient scale based on clipping + * \param idx Index of the lookup parameter object + */ + virtual void update_lookup_params(real scale, real gscale, size_t idx) = 0; private: friend class boost::serialization::access; From cfa20d4cd95fd98a8ff7044cb30c46a3010612cb Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 21 Nov 2016 20:04:51 -0500 Subject: [PATCH 839/965] Added some tests for sum with minibatches --- tests/test-nodes.cc | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 22ac31325..22a9d0890 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -102,6 +102,28 @@ BOOST_AUTO_TEST_CASE( add_gradient ) { BOOST_CHECK(check_grad(mod, z, 0)); } +// Expression sum(const std::initializer_list& xs); +BOOST_AUTO_TEST_CASE( sum_gradient ) { + dynet::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + Expression y = sum({x2,x1,x2}); + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); +} + +// Expression sum(const std::initializer_list& xs); +BOOST_AUTO_TEST_CASE( sum_batch_gradient ) { + dynet::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + Expression x3 = input(cg, Dim({3},2), batch_vals); + Expression y = sum({x3,x1,cmult(x2,x3)}); + Expression ones3 = input(cg, {1,3}, ones3_vals); + Expression z = sum_batches(ones3 * y); + BOOST_CHECK(check_grad(mod, z, 0)); +} + // Expression logsumexp(const std::initializer_list& xs); BOOST_AUTO_TEST_CASE( logsumexp_gradient ) { dynet::ComputationGraph cg; From a704e6ba63abf2da2ce18b4cb557ebcfc8d5ccfb Mon Sep 17 00:00:00 2001 From: Austin Matthews Date: Mon, 21 Nov 2016 22:39:18 -0500 Subject: [PATCH 840/965] Gradient clipping should be performed with respect to scale parameter --- dynet/training.cc | 8 ++++---- dynet/training.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/dynet/training.cc b/dynet/training.cc index 0f2e92268..c55f2960e 100644 --- a/dynet/training.cc +++ b/dynet/training.cc @@ -58,7 +58,7 @@ void Trainer::rescale_and_reset_weight_decay() { model->weight_decay.reset_weight_decay(); } -float Trainer::clip_gradients() { +float Trainer::clip_gradients(real scale) { float gscale = 1; if (clipping_enabled) { // TODO should I handle updatebale differently? @@ -67,9 +67,9 @@ float Trainer::clip_gradients() { cerr << "Magnitude of gradient is bad: " << gg << endl; abort(); } - if (gg > clip_threshold) { + if (scale * gg > clip_threshold) { ++clips; - gscale = clip_threshold / gg; + gscale = clip_threshold / (scale * gg); } } return gscale; @@ -84,7 +84,7 @@ void Trainer::update(real scale) { } // Perform gradient clipping and cycle through parameters - const float gscale = clip_gradients(); + const float gscale = clip_gradients(scale); const auto & params = model->parameters_list(); const auto & upd_params = model->updated_parameters_list(); for(auto i : upd_params) { diff --git a/dynet/training.h b/dynet/training.h index 88a8bd12d..0832cba43 100644 --- a/dynet/training.h +++ b/dynet/training.h @@ -55,7 +55,7 @@ struct Trainer { // if clipping is enabled and the gradient is too big, return the amount to // scale the gradient by (otherwise 1) - float clip_gradients(); + float clip_gradients(real scale); // TODO: This is unprotected temporarily until there is a better solution // for serializing the weight decay when saving models From 54c5e39f55b2afc598106cb5d811a3d5fc79a2df Mon Sep 17 00:00:00 2001 From: yoavg Date: Tue, 22 Nov 2016 15:19:15 +0200 Subject: [PATCH 841/965] ability to get expression's dimension --- dynet/dynet.cc | 5 +++++ dynet/dynet.h | 2 ++ dynet/expr.cc | 1 + dynet/expr.h | 1 + python/_dynet.pxd | 1 + python/_dynet.pyx | 5 +++++ 6 files changed, 15 insertions(+) diff --git a/dynet/dynet.cc b/dynet/dynet.cc index 849c51b6d..cc0692696 100644 --- a/dynet/dynet.cc +++ b/dynet/dynet.cc @@ -137,6 +137,11 @@ void ComputationGraph::revert() { checkpoints.pop_back(); } +Dim& ComputationGraph::get_dimension(VariableIndex index) const { + return nodes[index]->dim; +} + + VariableIndex ComputationGraph::add_input(real s) { VariableIndex new_node_index(nodes.size()); diff --git a/dynet/dynet.h b/dynet/dynet.h index 449b4dd42..0769a5a88 100644 --- a/dynet/dynet.h +++ b/dynet/dynet.h @@ -100,6 +100,8 @@ struct ComputationGraph { void checkpoint(); void revert(); + Dim& get_dimension(VariableIndex index) const; + // perform computations diff --git a/dynet/expr.cc b/dynet/expr.cc index 3fb4ec411..014ff091f 100644 --- a/dynet/expr.cc +++ b/dynet/expr.cc @@ -124,4 +124,5 @@ Expression sum_batches(const Expression& x) { return Expression(x.pg, x.pg->add_ Expression kmh_ngram(const Expression& x, unsigned n) { return Expression(x.pg, x.pg->add_function({x.i}, n)); } + } } diff --git a/dynet/expr.h b/dynet/expr.h index f7c02a188..fbf88fd80 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -41,6 +41,7 @@ struct Expression { */ Expression(ComputationGraph *pg, VariableIndex i) : pg(pg), i(i) { } const Tensor& value() const { return pg->get_value(i); } + const Dim& dim() const { return pg->get_dimension(i); } }; namespace detail { diff --git a/python/_dynet.pxd b/python/_dynet.pxd index eed5c77f0..9e511d614 100644 --- a/python/_dynet.pxd +++ b/python/_dynet.pxd @@ -178,6 +178,7 @@ cdef extern from "dynet/expr.h" namespace "dynet::expr": CExpression(CComputationGraph *pg, VariableIndex i) CComputationGraph *pg long i + CDim dim() #CExpression c_input "dynet::expr::input" (CComputationGraph& g, float s) # CExpression c_input "dynet::expr::input" (CComputationGraph& g, float *ps) # CExpression c_input "dynet::expr::input" (CComputationGraph& g, CDim& d, vector[float]* pdata) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index 039d860a8..ed37dbe03 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -611,6 +611,11 @@ cdef class Expression: #{{{ cdef CExpression c(self): return CExpression(self.cgp(), self.vindex) + cpdef dim(self): + cdef CDim d; + d=self.c().dim() + return (d.size(), d.rows(), d.cols(), d.batch_elems()) + def __repr__(self): return str(self) def __str__(self): From 0ef4931c5683a0d516d0f98f15d58f90632c0959 Mon Sep 17 00:00:00 2001 From: talbaumel Date: Tue, 22 Nov 2016 22:37:47 +0200 Subject: [PATCH 842/965] Re-inputting the generated output --- pyexamples/attention.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/pyexamples/attention.py b/pyexamples/attention.py index 90d7c642c..09dd7d452 100644 --- a/pyexamples/attention.py +++ b/pyexamples/attention.py @@ -20,23 +20,24 @@ enc_fwd_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, EMBEDDINGS_SIZE, STATE_SIZE, model) enc_bwd_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, EMBEDDINGS_SIZE, STATE_SIZE, model) -dec_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, STATE_SIZE*2, STATE_SIZE, model) +dec_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, STATE_SIZE*2+EMBEDDINGS_SIZE, STATE_SIZE, model) -lookup = model.add_lookup_parameters( (VOCAB_SIZE, EMBEDDINGS_SIZE)) +input_lookup = model.add_lookup_parameters((VOCAB_SIZE, EMBEDDINGS_SIZE)) attention_w1 = model.add_parameters( (ATTENTION_SIZE, STATE_SIZE*2)) attention_w2 = model.add_parameters( (ATTENTION_SIZE, STATE_SIZE*LSTM_NUM_OF_LAYERS*2)) attention_v = model.add_parameters( (1, ATTENTION_SIZE)) decoder_w = model.add_parameters( (VOCAB_SIZE, STATE_SIZE)) decoder_b = model.add_parameters( (VOCAB_SIZE)) +output_lookup = model.add_lookup_parameters((VOCAB_SIZE, EMBEDDINGS_SIZE)) def embed_sentence(sentence): sentence = [EOS] + list(sentence) + [EOS] sentence = [char2int[c] for c in sentence] - global lookup + global input_lookup - return [lookup[char] for char in sentence] + return [input_lookup[char] for char in sentence] def run_lstm(init_state, input_vecs): @@ -86,15 +87,16 @@ def decode(dec_lstm, vectors, output): w = pc.parameter(decoder_w) b = pc.parameter(decoder_b) - s = dec_lstm.initial_state().add_input(pc.vecInput(STATE_SIZE*2)) - + last_output_embeddings = output_lookup[char2int[EOS]] + s = dec_lstm.initial_state().add_input(pc.concatenate([pc.vecInput(STATE_SIZE*2), last_output_embeddings])) loss = [] for char in output: - vector = attend(vectors, s) + vector = pc.concatenate([attend(vectors, s), last_output_embeddings]) s = s.add_input(vector) out_vector = w * s.output() + b probs = pc.softmax(out_vector) + last_output_embeddings = output_lookup[char] loss.append(-pc.log(pc.pick(probs, char))) loss = pc.esum(loss) return loss @@ -114,18 +116,20 @@ def sample(probs): w = pc.parameter(decoder_w) b = pc.parameter(decoder_b) - s = dec_lstm.initial_state().add_input(pc.vecInput(STATE_SIZE * 2)) + last_output_embeddings = output_lookup[char2int[EOS]] + s = dec_lstm.initial_state().add_input(pc.concatenate([pc.vecInput(STATE_SIZE * 2), last_output_embeddings])) out = '' count_EOS = 0 for i in range(len(input)*2): if count_EOS == 2: break - vector = attend(encoded, s) + vector = pc.concatenate([attend(encoded, s), last_output_embeddings]) s = s.add_input(vector) out_vector = w * s.output() + b probs = pc.softmax(out_vector) probs = probs.vec_value() next_char = sample(probs) + last_output_embeddings = output_lookup[next_char] if int2char[next_char] == EOS: count_EOS += 1 continue @@ -155,5 +159,3 @@ def train(model, sentence): train(model, "it is working") - - From 5ce7e53edb4a9edc7057e29ce2c6523c441b6f49 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 22 Nov 2016 16:21:26 -0500 Subject: [PATCH 843/965] Fixed a bug in concatenate with batches --- dynet/nodes.cc | 12 ++++++------ dynet/tensor.h | 10 ++++++++++ tests/test-nodes.cc | 12 ++++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/dynet/nodes.cc b/dynet/nodes.cc index 0eaa2cc9f..8bcfc9085 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -405,8 +405,8 @@ void Concatenate::backward_dev_impl(const MyDevice & dev, if(dEdxi.d.bd == dEdf.d.bd) { dEdxi.tb<2>().device(*dev.edevice) += dEdf.tb<2>().slice(indices, sizes); } else { - for(unsigned b = 0; b < dEdf.d.bd; ++b) - dEdxi.t<2>().device(*dev.edevice) += dEdf.tb<2>().chip<2>(b).slice(indices, sizes); + Eigen::array red_axis; red_axis[0] = 2; + dEdxi.t<2>().device(*dev.edevice) += dEdf.tb<2>().slice(indices, sizes).sum(red_axis); } } DYNET_NODE_INST_DEV_IMPL(Concatenate) @@ -608,9 +608,9 @@ void CwiseMultiply::forward_dev_impl(const MyDevice & dev, const vector bcast; bcast[0] = 1; bcast[1] = fx.d.bd; if(xs[0]->d.bd == 1) - fx.tb<1>().device(*dev.edevice) = xs[0]->tb<1>().broadcast(bcast) * xs[1]->tb<1>(); + fx.tbvec().device(*dev.edevice) = xs[0]->tbvec().broadcast(bcast) * xs[1]->tbvec(); else - fx.tb<1>().device(*dev.edevice) = xs[0]->tb<1>() * xs[1]->tb<1>().broadcast(bcast); + fx.tbvec().device(*dev.edevice) = xs[0]->tbvec() * xs[1]->tbvec().broadcast(bcast); } } @@ -626,10 +626,10 @@ void CwiseMultiply::backward_dev_impl(const MyDevice & dev, dEdxi.tvec().device(*dev.edevice) += dEdf.tvec() * xs[1-i]->tvec(); } else if(xs[1-i]->d.bd == 1) { Eigen::array bcast; bcast[0] = 1; bcast[1] = fx.d.bd; - dEdxi.tb<1>().device(*dev.edevice) += dEdf.tb<1>() * xs[1-i]->tb<1>().broadcast(bcast); + dEdxi.tbvec().device(*dev.edevice) += dEdf.tbvec() * xs[1-i]->tbvec().broadcast(bcast); } else { Eigen::array red_axis; red_axis[0] = 1; - dEdxi.t<1>().device(*dev.edevice) += (dEdf.tb<1>() * xs[1-i]->tb<1>()).sum(red_axis); + dEdxi.tvec().device(*dev.edevice) += (dEdf.tbvec() * xs[1-i]->tbvec()).sum(red_axis); } } DYNET_NODE_INST_DEV_IMPL(CwiseMultiply) diff --git a/dynet/tensor.h b/dynet/tensor.h index 9d73b6956..48d59a70c 100644 --- a/dynet/tensor.h +++ b/dynet/tensor.h @@ -63,6 +63,16 @@ struct Tensor { Eigen::TensorMap> tvec() { return Eigen::TensorMap>(v, d.size()); } + // this returns the full tensor contents as a two dimensional Eigen tensor + // where the first dimension is a flattened representation of each batch + // and the second dimension is the batches + const Eigen::TensorMap> tbvec() const { + return Eigen::TensorMap>(v, d.batch_size(), d.batch_elems()); + } + Eigen::TensorMap> tbvec() { + return Eigen::TensorMap>(v, d.batch_size(), d.batch_elems()); + } + // Get view as a Tensor (see specializations below-- this is to work Eigen's and DYNETs compile-type vs. run-time differences) template Eigen::TensorMap> t(); template const Eigen::TensorMap> t() const; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 22a9d0890..9e75ab68f 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -341,6 +341,18 @@ BOOST_AUTO_TEST_CASE( concatenate_gradient ) { BOOST_CHECK(check_grad(mod, z, 0)); } +// Expression concatenate(const std::initializer_list& xs); +BOOST_AUTO_TEST_CASE( concatenate_batch_gradient ) { + dynet::ComputationGraph cg; + Expression x1 = transpose(parameter(cg, param1)); + Expression x2 = transpose(parameter(cg, param2)); + Expression x3 = input(cg, Dim({1,3},2), batch_vals); + Expression y = concatenate({x1, x2, cmult(x2, x3)}); + Expression ones3 = input(cg, {1,3}, ones3_vals); + Expression z = sum_batches(ones3 * y * transpose(ones3)); + BOOST_CHECK(check_grad(mod, z, 0)); +} + // Expression contract3d_1d(const Expression& x, const Expression& y, const Expression& b); BOOST_AUTO_TEST_CASE( contract3d_1d_gradient ) { dynet::ComputationGraph cg; From efe0711416a3df307a6a06bf9626baa5116c6a52 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 25 Nov 2016 11:03:49 -0500 Subject: [PATCH 844/965] Added unorthodox documentation and fixed l2 name --- doc/source/commandline.rst | 7 ++-- doc/source/index.rst | 1 + doc/source/unorthodox.rst | 73 ++++++++++++++++++++++++++++++++++++++ dynet/init.cc | 4 +-- 4 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 doc/source/unorthodox.rst diff --git a/doc/source/commandline.rst b/doc/source/commandline.rst index 476a8e19c..9348f0f36 100644 --- a/doc/source/commandline.rst +++ b/doc/source/commandline.rst @@ -14,8 +14,11 @@ options. variables ``--dynet-mem FOR,BACK,PARAM``. This is useful if, for example, you are performing testing and don't need to allocate any memory for backward calculation. -- ``--dynet-l2 NUMBER``: Specifies the level of l2 regularization to - use (default 1e-6). +- ``--dynet-weight-decay NUMBER``: Adds weight decay to the parameters, + which modifies each parameter w such that `w *= (1-weight_decay)` after + every update. This is similar to L2 regularization, but different in a + couple ways, which are noted in detail in the "Unorthodox Design" + section. - ``--dynet-gpus NUMBER``: Specify how many GPUs you want to use, if DyNet is compiled with CUDA. Currently, only one GPU is supported. - ``--dynet-gpu-ids X,Y,Z``: Specify the GPUs that you want to use by diff --git a/doc/source/index.rst b/doc/source/index.rst index ef3de90c9..877da170f 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -34,6 +34,7 @@ Mode advanced topics are below: minibatch multiprocessing + unorthodox And we welcome your contributions! diff --git a/doc/source/unorthodox.rst b/doc/source/unorthodox.rst new file mode 100644 index 000000000..88fc58a2a --- /dev/null +++ b/doc/source/unorthodox.rst @@ -0,0 +1,73 @@ +Unorthodox Design +================= + +There are a couple design decisions about DyNet that are different from the way +things are implemented in other libraries, or different from the way you might +expect things to be implemented. The items below are a list of these unorthodox +design decisions, which you should read to avoid being surprised. We also try +to give some justification for these decisions (although we realize that this +is not the only right way to do things). + +Sparse Updates +-------------- + +By default, DyNet parameter optimizers perform sparse updates over +``LookupParameters``. This means that if you have a ``LookupParameters`` +object, use a certain subset of indices, then perform a parameter update, the +optimizer will loop over the used subset, and not perform any updates over +the unused values. This can improve efficiency in some cases: e.g. if you have +embeddings for a vocabulary of 100,000 words and you only use 5 of them in a +particular update, this will avoid doing updates over all 100,000. However, +there are two things to be careful of. First, this means that some update rules +such as ones using momentum (e.g. ``MomentumSGDTrainer`` and ``AdamTrainer``) +are not strictly correct. Also, on GPUs, because large operations are +relatively cheap, it can sometimes be faster to just perform a single operation +over all of the parameters, as opposed to multiple small operations. In this +case, you can set the ``sparse_updates_enabled`` variable of your ``Trainer`` +to ``false``, and DyNet will perform a standard dense update, which is +guaranteed to be exactly correct, and potentially faster on GPU. + +Weight Decay +------------ + +As described in the `Command Line Options`_, weight decay is implemented +through the option ``--dynet-weight-decay``. If this value is set to ``wd``, +each parameter in the model is multiplied by ``(1-wd)`` after every parameter +update. This weight decay is similar to L2 regularization, and is equivalent in +the case of using simple SGD (``SimpleSGDTrainer``), but it is *not the same* +when using any other optimizers such as ``AdagradTrainer`` or ``AdamTrainer``. +You can still try to use weight decay with these optimizers, and it might work, +but if you really want to correctly apply L2 regularization with these +optimizers, you will have to directly calculate the L2 norm of each of the +parameters and add it to the objective function before performing your update. + +Minibatching Implementation +--------------------------- + +`Minibatching`_ in DyNet is different than how it is implemented in other +libraries. In other libraries, you can create minibatches by explicitly adding +another dimension to each of the variables that you want to process, and +managing them yourself. Instead, DyNet provides special `Operations`_ that +allow you to perform input, lookup, or loss calculation over mini-batched +input, then DyNet will handle the rest. The programming paradigm is a bit +different from other toolkits, and may take a bit of getting used to, but is +often more convenient once you're used to it. + +Dropout Scaling +--------------- + +When using dropout to help prevent overfitting, dropout is generally applied +at training time, then at test time all the nodes in the neural net are used +to make the final decision, increasing robustness. However, because there is +a disconnect between the number of nodes being used in each situation, it is +important to scale the values of the output to ensure that they match in both +situations. There are two ways to do this: + +* At training time, perform dropout with probability ``p``. At test time, + scale the outputs of each node by ``p``. +* At training time, perform dropout with probability ``p``, *and* scale the + outputs by ``1-p``. At test time, use the outputs as-is. + +The first is perhaps more common, but the second is convenient, because we +only need to think about dropout at training time, and thus DyNet opts to +use the latter. diff --git a/dynet/init.cc b/dynet/init.cc index 86702d3f5..ecc0a5100 100644 --- a/dynet/init.cc +++ b/dynet/init.cc @@ -49,9 +49,9 @@ DynetParams extract_dynet_params(int& argc, char**& argv, bool shared_parameters } // Weight decay - else if (arg == "--dynet-l2" || arg == "--dynet_l2") { + else if (arg == "--dynet-weight-decay" || arg == "--dynet_weight_decay") { if ((argi + 1) > argc) { - cerr << "[dynet] --dynet-l2 requires an argument (the weight decay per update)\n"; + cerr << "[dynet] --dynet-weight-decay requires an argument (the weight decay per update)\n"; abort(); } else { string a2 = argv[argi + 1]; From f86ce37e71eaded0d3994b3ebcb3f4611ae06ea1 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 25 Nov 2016 11:59:39 -0500 Subject: [PATCH 845/965] Fixed some documentation --- doc/source/commandline.rst | 4 ++-- doc/source/minibatch.rst | 4 ++-- doc/source/operations.rst | 4 ++-- doc/source/unorthodox.rst | 12 +++++++----- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/doc/source/commandline.rst b/doc/source/commandline.rst index 9348f0f36..584350408 100644 --- a/doc/source/commandline.rst +++ b/doc/source/commandline.rst @@ -1,5 +1,5 @@ -DyNet Command Line Options -========================== +Command Line Options +==================== All programs using DyNet have a few command line options. These must be specified at the very beginning of the command line, before other diff --git a/doc/source/minibatch.rst b/doc/source/minibatch.rst index 77d03a8e6..d495c291c 100644 --- a/doc/source/minibatch.rst +++ b/doc/source/minibatch.rst @@ -1,4 +1,4 @@ -Mini-batching in DyNet -====================== +Minibatching +============ How to perform minibatching to improve efficiency diff --git a/doc/source/operations.rst b/doc/source/operations.rst index a1bb142f7..b1b6fd00a 100644 --- a/doc/source/operations.rst +++ b/doc/source/operations.rst @@ -1,5 +1,5 @@ -DyNet Operations -================ +Operations +========== Operation Interface ------------------- diff --git a/doc/source/unorthodox.rst b/doc/source/unorthodox.rst index 88fc58a2a..79d052652 100644 --- a/doc/source/unorthodox.rst +++ b/doc/source/unorthodox.rst @@ -63,11 +63,13 @@ a disconnect between the number of nodes being used in each situation, it is important to scale the values of the output to ensure that they match in both situations. There are two ways to do this: -* At training time, perform dropout with probability ``p``. At test time, - scale the outputs of each node by ``p``. -* At training time, perform dropout with probability ``p``, *and* scale the - outputs by ``1-p``. At test time, use the outputs as-is. +* **Vanilla Dropout:** At training time, perform dropout with probability + ``p``. At test time, scale the outputs of each node by ``p``. +* **Inverted Dropout:** At training time, perform dropout with probability + ``p``, *and* scale the outputs by ``1-p``. At test time, use the outputs + as-is. The first is perhaps more common, but the second is convenient, because we only need to think about dropout at training time, and thus DyNet opts to -use the latter. +use the latter. See `here `_ +for more details on these two methods. From fcfee6ff597b4ce3d4af5c8ad280f1aedb0147b7 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 25 Nov 2016 12:02:32 -0500 Subject: [PATCH 846/965] Explained about sparse Adam and Momentum are incorrect --- doc/source/unorthodox.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/doc/source/unorthodox.rst b/doc/source/unorthodox.rst index 79d052652..b3d323713 100644 --- a/doc/source/unorthodox.rst +++ b/doc/source/unorthodox.rst @@ -19,8 +19,10 @@ the unused values. This can improve efficiency in some cases: e.g. if you have embeddings for a vocabulary of 100,000 words and you only use 5 of them in a particular update, this will avoid doing updates over all 100,000. However, there are two things to be careful of. First, this means that some update rules -such as ones using momentum (e.g. ``MomentumSGDTrainer`` and ``AdamTrainer``) -are not strictly correct. Also, on GPUs, because large operations are +such as ones using momentum such as ``MomentumSGDTrainer`` and ``AdamTrainer`` +are not strictly correct (these could be made correct with some effort, but +this would complicate the programming interface, which we have opted against). +Also, on GPUs, because large operations are relatively cheap, it can sometimes be faster to just perform a single operation over all of the parameters, as opposed to multiple small operations. In this case, you can set the ``sparse_updates_enabled`` variable of your ``Trainer`` From 26a03d8c83cff3dd0efcc3088b6064f74ed2d5e0 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 25 Nov 2016 12:18:14 -0500 Subject: [PATCH 847/965] Fixed references --- doc/source/commandline.rst | 2 ++ doc/source/minibatch.rst | 2 ++ doc/source/operations.rst | 2 ++ doc/source/unorthodox.rst | 6 +++--- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/doc/source/commandline.rst b/doc/source/commandline.rst index 584350408..94f01a9b3 100644 --- a/doc/source/commandline.rst +++ b/doc/source/commandline.rst @@ -1,3 +1,5 @@ +.. _command-line-options: + Command Line Options ==================== diff --git a/doc/source/minibatch.rst b/doc/source/minibatch.rst index d495c291c..a7c7cac4b 100644 --- a/doc/source/minibatch.rst +++ b/doc/source/minibatch.rst @@ -1,3 +1,5 @@ +.. _minibatching: + Minibatching ============ diff --git a/doc/source/operations.rst b/doc/source/operations.rst index b1b6fd00a..49d45e443 100644 --- a/doc/source/operations.rst +++ b/doc/source/operations.rst @@ -1,3 +1,5 @@ +.. _operations: + Operations ========== diff --git a/doc/source/unorthodox.rst b/doc/source/unorthodox.rst index b3d323713..76f275383 100644 --- a/doc/source/unorthodox.rst +++ b/doc/source/unorthodox.rst @@ -32,7 +32,7 @@ guaranteed to be exactly correct, and potentially faster on GPU. Weight Decay ------------ -As described in the `Command Line Options`_, weight decay is implemented +As described in the :ref:`command-line-options`, weight decay is implemented through the option ``--dynet-weight-decay``. If this value is set to ``wd``, each parameter in the model is multiplied by ``(1-wd)`` after every parameter update. This weight decay is similar to L2 regularization, and is equivalent in @@ -46,10 +46,10 @@ parameters and add it to the objective function before performing your update. Minibatching Implementation --------------------------- -`Minibatching`_ in DyNet is different than how it is implemented in other +:ref:`minibatching` in DyNet is different than how it is implemented in other libraries. In other libraries, you can create minibatches by explicitly adding another dimension to each of the variables that you want to process, and -managing them yourself. Instead, DyNet provides special `Operations`_ that +managing them yourself. Instead, DyNet provides special :ref:`operations` that allow you to perform input, lookup, or loss calculation over mini-batched input, then DyNet will handle the rest. The programming paradigm is a bit different from other toolkits, and may take a bit of getting used to, but is From 82e901dd32ce5b3704251a2a0a5f2310ae65dc19 Mon Sep 17 00:00:00 2001 From: Austin Matthews Date: Sat, 26 Nov 2016 01:54:45 -0500 Subject: [PATCH 848/965] added ability to get the "head" of an rnnpointer --- dynet/rnn.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/dynet/rnn.h b/dynet/rnn.h index 3ca3176f1..24440f210 100644 --- a/dynet/rnn.h +++ b/dynet/rnn.h @@ -158,6 +158,16 @@ struct RNNBuilder { cur = head[cur]; } + /** + * + * \brief Return the RNN state that is the parent of `p` + * \details - This can be used in implementing complex structures + * such as trees, etc. + */ + RNNPointer get_head(const RNNPointer& p) { + return head[p]; + } + /** * * \brief Set Dropout From 988dc7882934acb088866749c777031020f41270 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 26 Nov 2016 09:24:47 -0500 Subject: [PATCH 849/965] Added hinge loss documentation --- dynet/expr.h | 90 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 17 deletions(-) diff --git a/dynet/expr.h b/dynet/expr.h index fbf88fd80..2270a64fa 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -89,13 +89,13 @@ Expression input(ComputationGraph& g, const real *ps); * \ingroup inputoperations * \brief Vector/matrix/tensor input * \details Create an expression that represents a vector, matrix, or tensor - * input. The dimensions of the input are defined by `d`. So for example - * > input(g,{50},data): will result in a 50-length vector - * > input(g,{50,30},data): will result in a 50x30 matrix + * input. The dimensions of the input are defined by ``d``. So for example + * > ``input(g,{50},data)``: will result in a 50-length vector + * > ``input(g,{50,30},data)``: will result in a 50x30 matrix * and so on, for an arbitrary number of dimensions. * This function can also be used to import minibatched inputs. For example, * if we have 10 examples in a minibatch, each with size 50x30, then we call - * > input(g,Dim({50,30},10),data) + * > ``input(g,Dim({50,30},10),data)`` * The data vector "data" will contain the values used to fill the input, in * column-major format. The length must add to the product of all dimensions in * d. @@ -766,8 +766,8 @@ Expression log_softmax(const Expression& x); * \ingroup lossoperations * \brief Restricted log softmax * \details The log softmax function calculated over only a subset of the vector elements. The - * elements to be included are set by the `restriction` variable. All elements not - * included in `restriction` are set to negative infinity. + * elements to be included are set by the ``restriction`` variable. All elements not + * included in ``restriction`` are set to negative infinity. * * \param x A vector over which to calculate the softmax * \param restriction The elements over which to calculate the softmax @@ -779,15 +779,15 @@ Expression log_softmax(const Expression& x, const std::vector& restric /** * \ingroup lossoperations * \brief Negative softmax log likelihood - * \details This function takes in a vector of scores `x`, and performs a log softmax, takes - * the negative, and selects the likelihood corresponding to the element `v`. This is + * \details This function takes in a vector of scores ``x``, and performs a log softmax, takes + * the negative, and selects the likelihood corresponding to the element ``v``. This is * perhaps the most standard loss function for training neural networks to predict * one out of a set of elements. * * \param x A vector of scores * \param v The element with which to calculate the loss * - * \return The negative log likelihood of element `v` after taking the softmax + * \return The negative log likelihood of element ``v`` after taking the softmax */ Expression pickneglogsoftmax(const Expression& x, unsigned v); @@ -795,16 +795,16 @@ Expression pickneglogsoftmax(const Expression& x, unsigned v); * \ingroup lossoperations * \brief Modifiable negative softmax log likelihood * \details This function calculates the negative log likelihood after the softmax with - * with respect to index `*pv`. This computes the same value as the previous function - * that passes the index `v` by value, but instead passes by pointer so the value - * `*pv` can be modified without re-constructing the computation graph. This can be + * with respect to index ``*pv``. This computes the same value as the previous function + * that passes the index ``v`` by value, but instead passes by pointer so the value + * ``*pv`` can be modified without re-constructing the computation graph. This can be * used in situations where we want to create a computation graph once, then feed it * different data points. * * \param x A vector of scores * \param pv A pointer to the index of the correct element * - * \return The negative log likelihood of element `*pv` after taking the softmax + * \return The negative log likelihood of element ``*pv`` after taking the softmax */ Expression pickneglogsoftmax(const Expression& x, unsigned * pv); @@ -813,7 +813,7 @@ Expression pickneglogsoftmax(const Expression& x, unsigned * pv); * \brief Batched negative softmax log likelihood * \details This function is similar to standard pickneglogsoftmax, but calculates loss with * respect to multiple batch elements. The input will be a mini-batch of score vectors - * where the number of batch elements is equal to the number of indices in `v`. + * where the number of batch elements is equal to the number of indices in ``v``. * * \param x An expression with vectors of scores over N batch elements * \param v A size-N vector indicating the index with respect to all the batch elements @@ -826,7 +826,7 @@ Expression pickneglogsoftmax(const Expression& x, const std::vector & * \ingroup lossoperations * \brief Modifiable batched negative softmax log likelihood * \details This function is a combination of modifiable pickneglogsoftmax and batched - * pickneglogsoftmax: `pv` can be modified without re-creating the computation graph. + * pickneglogsoftmax: ``pv`` can be modified without re-creating the computation graph. * * \param x An expression with vectors of scores over N batch elements * \param v A size-N vector indicating the index with respect to all the batch elements @@ -835,11 +835,67 @@ Expression pickneglogsoftmax(const Expression& x, const std::vector & */ Expression pickneglogsoftmax(const Expression& x, const std::vector * pv); +/** + * \ingroup lossoperations + * \brief Hinge loss + * \details This expression calculates the hinge loss, formally expressed as: + * \f$ \text{hinge}(x,index,m) = \sum_{i \ne index} max(0, m-x[index]+x[i]). \f$ + * + * \param x A vector of scores + * \param index The index of the correct candidate + * \param m The margin + * + * \return The hinge loss of candidate ``index`` with respect to margin ``m`` + */ Expression hinge(const Expression& x, unsigned index, float m = 1.0); -Expression hinge(const Expression& x, const std::vector & indices, float m = 1.0); + +/** + * \ingroup lossoperations + * \brief Modifiable hinge loss + * \details This function calculates the hinge loss with + * with respect to index ``*pindex``. This computes the same value as the previous function + * that passes the index ``index`` by value, but instead passes by pointer so the value + * ``*pindex`` can be modified without re-constructing the computation graph. This can be + * used in situations where we want to create a computation graph once, then feed it + * different data points. + * + * \param x A vector of scores + * \param pindex A pointer to the index of the correct candidate + * \param m The margin + * + * \return The hinge loss of candidate ``*pindex`` with respect to margin ``m`` + */ Expression hinge(const Expression& x, const unsigned* pindex, float m = 1.0); + +/** + * \ingroup lossoperations + * \brief Batched hinge loss + * \details The same as hinge loss, but for the case where ``x`` is a mini-batched tensor + * with ``indices.size()`` batch elements, and ``indices`` is a vector indicating + * the index of each of the correct elements for these elements. + * + * \param x A mini-batch of vectors with ``indices.size()`` batch elements + * \param indices The indices of the correct candidates for each batch element + * \param m The margin + * + * \return The hinge loss of each mini-batch + */ +Expression hinge(const Expression& x, const std::vector & indices, float m = 1.0); + +/** + * \ingroup lossoperations + * \brief Batched modifiable hinge loss + * \details A combination of the previous batched and modifiable hinge loss functions, where + * vector ``*pindices`` can be modified. + * + * \param x A mini-batch of vectors with ``indices.size()`` batch elements + * \param pindices Pointer to the indices of the correct candidates for each batch element + * \param m The margin + * + * \return The hinge loss of each mini-batch + */ Expression hinge(const Expression& x, const std::vector * pindices, float m = 1.0); -Expression sparsemax(const Expression& x); + Expression sparsemax(const Expression& x); Expression sparsemax_loss(const Expression& x, const std::vector& target_support); Expression sparsemax_loss(const Expression& x, const std::vector* ptarget_support); From 0d6e8e958a4e5418b22c6f29b77955ae151789f0 Mon Sep 17 00:00:00 2001 From: Daniel Hershcovich Date: Sun, 27 Nov 2016 15:42:41 +0200 Subject: [PATCH 850/965] Add Travis CI badge to README The badge shows whether the build is currently passing. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 66c31b6de..ac7749798 100644 --- a/README.md +++ b/README.md @@ -7,3 +7,5 @@ Read the [documentation](http://dynet.readthedocs.io/en/latest/) to get started, * **Latest Code:** Can be found on the github page master branch. * **Latest Release:** [v1.0-rc1](https://github.com/clab/dynet/releases/tag/v1.0-rc1) + +[![Build Status](https://travis-ci.org/clab/dynet.svg?branch=master)](https://travis-ci.org/clab/dynet) \ No newline at end of file From 2817f3a37b5550b0da20affd8d14cda84c246dfd Mon Sep 17 00:00:00 2001 From: Mitchell Stern Date: Sun, 27 Nov 2016 10:48:39 -0800 Subject: [PATCH 851/965] Fixed minor typos and inconsistencies in documentation --- dynet/expr.h | 46 +++++++++++++++++++++++----------------------- dynet/rnn.h | 6 +++--- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/dynet/expr.h b/dynet/expr.h index 2270a64fa..834db2c92 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -476,16 +476,16 @@ inline Expression operator/(const Expression& x, float y) { return x * (1.f / y) * \ingroup arithmeticoperations * \brief Affine transform * \details This performs an affine transform over an arbitrary (odd) number of expressions - * held in the input initializer list x. + * held in the input initializer list xs. * The first expression is the "bias," which is added to the expression as-is. - * The remaining expressions are multiplied together, then added. + * The remaining expressions are multiplied together in pairs, then added. * A very common usage case is the calculation of the score for a neural network * layer (e.g. b + Wz) where b is the bias, W is the weight matrix, and z is the - * input. In this case x[0] = b, x[1] = W, and x[2] = z. + * input. In this case xs[0] = b, xs[1] = W, and xs[2] = z. * - * \param x An initializer list containing an odd number of expressions + * \param xs An initializer list containing an odd number of expressions * - * \return An expression equal to: x[0] + x[1]*x[2] + x[3]*x[4] + ... + * \return An expression equal to: xs[0] + xs[1]*xs[2] + xs[3]*xs[4] + ... */ inline Expression affine_transform(const std::initializer_list& xs) { return detail::f(xs); } template @@ -494,11 +494,11 @@ inline Expression affine_transform(const T& xs) { return detail::f& xs) { return detail::f(xs); } template @@ -507,11 +507,11 @@ inline Expression sum(const T& xs) { return detail::f(xs); } /** * \ingroup arithmeticoperations * \brief Average - * \details This performs an elementwise average over all the expressions ins x + * \details This performs an elementwise average over all the expressions in xs * - * \param x An initializer list containing expressions + * \param xs An initializer list containing expressions * - * \return An expression where the ith element is equal to (x[0][i] + x[1][i] + ...)/|x| + * \return An expression where the ith element is equal to (xs[0][i] + xs[1][i] + ...)/|xs| */ inline Expression average(const std::initializer_list& xs) { return detail::f(xs); } template @@ -557,7 +557,7 @@ Expression tanh(const Expression& x); * * \param x The input expression * - * \return An expression equal to e^{x_i} + * \return An expression where the ith element is equal to e^{x_i} */ Expression exp(const Expression& x); @@ -612,14 +612,14 @@ Expression log(const Expression& x); * * \param x The input expression * - * \return An expression equal to y_i = 1/(1+e^{x_i}) + * \return An expression where the ith element is equal to y_i = 1/(1+e^{x_i}) */ Expression logistic(const Expression& x); /** * \ingroup arithmeticoperations * \brief Rectifier - * \details Calculate elementwise the recitifer (RelU) function y_i = max(x_i,0) + * \details Calculate elementwise the recitifer (ReLU) function y_i = max(x_i,0) * * \param x The input expression * @@ -634,7 +634,7 @@ Expression rectify(const Expression& x); * * \param x The input expression * - * \return An expression equal to x_i/(1+|x_i|) + * \return An expression where the ith element is equal to x_i/(1+|x_i|) */ Expression softsign(const Expression& x); @@ -645,7 +645,7 @@ Expression softsign(const Expression& x); * * \param x The input expression * - * \return An expression where the ith element is to x_i^y_i + * \return An expression where the ith element is equal to x_i^y_i */ Expression pow(const Expression& x, const Expression& y); @@ -657,7 +657,7 @@ Expression pow(const Expression& x, const Expression& y); * \param x The first input expression * \param y The second input expression * - * \return An expression equal to min(x_i,y_i) + * \return An expression where the ith element is equal to min(x_i,y_i) */ Expression min(const Expression& x, const Expression& y); @@ -676,11 +676,11 @@ Expression max(const Expression& x, const Expression& y); /** * \ingroup arithmeticoperations * \brief Max - * \details This performs an elementwise sum over all the expressions in x + * \details This performs an elementwise max over all the expressions in xs * - * \param x An initializer list containing expressions + * \param xs An initializer list containing expressions * - * \return An expression where the ith element is equal to max(x[0][i], x[1][i], ...) + * \return An expression where the ith element is equal to max(xs[0][i], xs[1][i], ...) */ inline Expression max(const std::initializer_list& xs) { return detail::f(xs); } template @@ -707,7 +707,7 @@ Expression dot_product(const Expression& x, const Expression& y); * \param x The first input expression * \param y The second input expression * - * \return An expression where the ith element is x_i*y_i + * \return An expression where the ith element is equal to x_i*y_i */ Expression cmult(const Expression& x, const Expression& y); @@ -719,7 +719,7 @@ Expression cmult(const Expression& x, const Expression& y); * \param x The first input expression * \param y The second input expression * - * \return An expression where the ith element is x_i/y_i + * \return An expression where the ith element is equal to x_i/y_i */ Expression cdiv(const Expression& x, const Expression& y); @@ -731,7 +731,7 @@ Expression cdiv(const Expression& x, const Expression& y); * \param x An MxN matrix * \param bias A length M vector * - * \return An expression bias is added to each column of x + * \return An expression where bias is added to each column of x */ Expression colwise_add(const Expression& x, const Expression& bias); diff --git a/dynet/rnn.h b/dynet/rnn.h index 24440f210..43868c9a1 100644 --- a/dynet/rnn.h +++ b/dynet/rnn.h @@ -131,8 +131,8 @@ struct RNNBuilder { /** * * \brief Add another timestep, with arbitrary recurrent connection. - * \details This allows to define a recurrent connection to `prev` - * rather than to head[cur]. + * \details This allows you to define a recurrent connection to `prev` + * rather than to `head[cur]`. * This can be used to construct trees, implement beam search, etc. * * \param prev Pointer to the previous state @@ -152,7 +152,7 @@ struct RNNBuilder { * \brief Rewind the last timestep * \details - this DOES NOT remove the variables from the computation graph, * it just means the next time step will see a different previous state. - * You can remind as many times as you want. + * You can rewind as many times as you want. */ void rewind_one_step() { cur = head[cur]; From 1ef5b8a1c8aa3a973afc419b17bb20dc4e9f9de6 Mon Sep 17 00:00:00 2001 From: Mitchell Stern Date: Sun, 27 Nov 2016 10:50:07 -0800 Subject: [PATCH 852/965] Fixed typo in string representation of `Expression` class --- python/_dynet.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index ed37dbe03..441ea3b56 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -619,7 +619,7 @@ cdef class Expression: #{{{ def __repr__(self): return str(self) def __str__(self): - return "exprssion %s/%s" % (self.vindex, self.cg_version) + return "expression %s/%s" % (self.vindex, self.cg_version) # __getitem__ and __getslice__ in one for python 3 compatibility def __getitem__(self, object index): From a5c4a29a4087f4b930f066075db8c257b7fb09fe Mon Sep 17 00:00:00 2001 From: Mitchell Stern Date: Sun, 27 Nov 2016 11:38:46 -0800 Subject: [PATCH 853/965] Changed "errror" to "error" --- dynet/expr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynet/expr.h b/dynet/expr.h index 834db2c92..6c510c0f5 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -530,7 +530,7 @@ Expression sqrt(const Expression& x); /** * \ingroup arithmeticoperations - * \brief Gaussian errror function + * \brief Gaussian error function * \details Elementwise calculation of the Gaussian error function * * \param x The input expression From 2f6289e986d5bd7e8d53e458360a5e19ba53b0b8 Mon Sep 17 00:00:00 2001 From: Mitchell Stern Date: Sun, 27 Nov 2016 11:43:57 -0800 Subject: [PATCH 854/965] Changed "with with" to "with" --- dynet/expr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynet/expr.h b/dynet/expr.h index 6c510c0f5..06adc5a34 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -795,7 +795,7 @@ Expression pickneglogsoftmax(const Expression& x, unsigned v); * \ingroup lossoperations * \brief Modifiable negative softmax log likelihood * \details This function calculates the negative log likelihood after the softmax with - * with respect to index ``*pv``. This computes the same value as the previous function + * respect to index ``*pv``. This computes the same value as the previous function * that passes the index ``v`` by value, but instead passes by pointer so the value * ``*pv`` can be modified without re-constructing the computation graph. This can be * used in situations where we want to create a computation graph once, then feed it From 63c7e33ba349654fbf96d1bf8cf5f68b2de29174 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 27 Nov 2016 22:31:18 -0500 Subject: [PATCH 855/965] Documentation for sparsemax --- dynet/expr.h | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/dynet/expr.h b/dynet/expr.h index 2270a64fa..0a1f8a386 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -896,8 +896,49 @@ Expression hinge(const Expression& x, const std::vector & indices, flo */ Expression hinge(const Expression& x, const std::vector * pindices, float m = 1.0); +/** + * \ingroup lossoperations + * \brief Sparsemax + * \details The sparsemax function (Martins et al. 2016), which is similar to softmax, + * but induces sparse solutions where most of the vector elements are zero. + * **Note:** This function is not yet implemented on GPU. + * + * \param x A vector of scores + * + * \return The sparsemax of the scores + */ Expression sparsemax(const Expression& x); + +/** + * \ingroup lossoperations + * \brief Sparsemax loss + * \details The sparsemax loss function (Martins et al. 2016), which is similar to + * softmax loss, but induces sparse solutions where most of the vector + * elements are zero. It has a gradient similar to the sparsemax function + * and thus is useful for optimizing when the sparsemax will be used at + * test time. + * **Note:** This function is not yet implemented on GPU. + * + * \param x A vector of scores + * \param target_support The target correct labels. + * + * \return The sparsemax loss of the labels + */ Expression sparsemax_loss(const Expression& x, const std::vector& target_support); + +/** + * \ingroup lossoperations + * \brief Modifiable sparsemax loss + * \details Similar to the sparsemax loss, but with ptarget_support being a pointer + * to a vector, allowing it to be modified without re-creating the compuation + * graph. + * **Note:** This function is not yet implemented on GPU. + * + * \param x A vector of scores + * \param ptarget_support A pointer to the target correct labels. + * + * \return The sparsemax loss of the labels + */ Expression sparsemax_loss(const Expression& x, const std::vector* ptarget_support); Expression squared_norm(const Expression& x); From aa627365118dba81b4c2f108e2998f7fca3c668c Mon Sep 17 00:00:00 2001 From: Daniel Hershcovich Date: Mon, 28 Nov 2016 10:16:04 +0200 Subject: [PATCH 856/965] Update documentation following Python 3 support --- doc/source/install.rst | 42 +++++++++++++++++++++++------------------- doc/source/python.rst | 42 +++++++++++++++++++++++------------------- 2 files changed, 46 insertions(+), 38 deletions(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index 1be77260e..5e243c6dd 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -6,16 +6,16 @@ How to build DyNet and link it with your programs Prerequisites ------------- -DyNet relies on a number of external libraries including Boost, cmake, -Eigen, and mercurial (to install Eigen). Boost, cmake, and mercurial can -be installed from standard repositories, for example on Ubuntu linux: +DyNet relies on a number of external libraries including Boost, CMake, +Eigen, and Mercurial (to install Eigen). Boost, CMake, and Mercurial can +be installed from standard repositories, for example on Ubuntu Linux: :: sudo apt-get install libboost-all-dev cmake mercurial -Or on OS X, first make sure the Apple Command Line Tools are installed, then -get boost, cmake, and mercurial with either homebrew or macports: +Or on OSX, first make sure the Apple Command Line Tools are installed, then +get Boost, CMake, and Mercurial with either homebrew or macports: :: @@ -33,7 +33,8 @@ the following command: hg clone https://bitbucket.org/eigen/eigen/ -r 346ecdb -The `-r NUM` specified a revision number that is known to work. Adventerous users can remove it and use the very latest version, at the risk of the code breaking / not compiling. +The `-r NUM` specified a revision number that is known to work. +Adventurous users can remove it and use the very latest version, at the risk of the code breaking / not compiling. Building -------- @@ -79,7 +80,7 @@ the ``dynet`` directory to the compile path: -I/path/to/dynet -and link with the dynet library: +and link with the DyNet library: :: @@ -97,7 +98,7 @@ If you have a build problem and want to debug, please run then examine the commands in the ``make.log`` file to see if anything looks fishy. If you would like help, send this ``make.log`` file via the -"Issues" tab on github, or to the dynet-users mailing list. +"Issues" tab on GitHub, or to the dynet-users mailing list. GPU/MKL support and build options @@ -125,19 +126,20 @@ CPU or GPU, but this is not fully implemented yet.) MKL support ~~~~~~~~~~~ -DyNet can leverage Intel's MKL library to speed up computation on the CPU. As an example, we've seen 3x speedup in seq2seq training when using MKL. To use MKL, include the following cmake option: +DyNet can leverage Intel's MKL library to speed up computation on the CPU. +As an example, we've seen 3x speedup in seq2seq training when using MKL. To use MKL, include the following cmake option: :: -DMKL=TRUE -If cmake is unable to find MKL automatically, try setting `MKL_ROOT`, such as +If CMake is unable to find MKL automatically, try setting `MKL_ROOT`, such as :: -DMKL_ROOT="/path/to/MKL" -If either MKL or MKL_ROOT are set, CMake will look for MKL. +If either `MKL` or `MKL_ROOT` are set, CMake will look for MKL. By default, MKL will use all CPU cores. You can control how many cores MKL uses by setting the environment variable `MKL_NUM_THREADS` to the desired number. The following is the total time to process 250 training @@ -167,9 +169,9 @@ there are diminishing returns or even slowdown. Non-standard Boost location ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -``dynet`` supports boost, and will find it if it is in the standard -location. If boost is in a non-standard location, say ``$HOME/boost``, -you can specify the location by adding the following to your cmake +``dynet`` requires Boost, and will find it if it is in the standard +location. If Boost is in a non-standard location, say ``$HOME/boost``, +you can specify the location by adding the following to your CMake options: :: @@ -179,11 +181,13 @@ options: Note that you will also have to set your ``LD_LIBRARY_PATH`` to point to the ``boost/lib`` directory. +Note also that Boost must be compiled with the same compiler version as +you are using to compile DyNet. Building for Windows ~~~~~~~~~~~~~~~~~~~~ -DYNET has been tested to build in Windows using Microsoft Visual Studio +DyNet has been tested to build in Windows using Microsoft Visual Studio 2015. You may be able to build with MSVC 2013 by slightly modifying the instructions below. @@ -203,10 +207,10 @@ installed Eigen and Boost (for example, at c:\\libs\\Eigen and c:\\libs\\boost_1 cd build cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64" -This will generate dynet.sln and a bunch of \*.vcxproj files (one for -the DYNET library, and one per example). You should be able to just open -dynet.sln and build all. **Note: multi-process functionality is -currently not supported in Windows, so the multi-process examples (*-mp) will not be included +This will generate `dynet.sln` and a bunch of `*.vcxproj` files (one for +the DyNet library, and one per example). You should be able to just open +`dynet.sln` and build all. **Note: multi-process functionality is +currently not supported in Windows, so the multi-process examples (`*-mp`) will not be included in the generated solution** The Windows build also supports CUDA with the latest version of Eigen (as of Oct 28, 2016), with the following code change: diff --git a/doc/source/python.rst b/doc/source/python.rst index 79d1c8e11..1ddf2016e 100644 --- a/doc/source/python.rst +++ b/doc/source/python.rst @@ -3,7 +3,7 @@ Installing the Python DyNet module. (for instructions on installing on a computer with GPU, see below) -Python bindings to DyNet are currently only supported under python 2. +Python bindings to DyNet are supported for both Python 2.x and 3.x. TL;DR ----- @@ -12,9 +12,9 @@ TL;DR .. code:: bash - # Installing python DyNet on a machine with python 2.7: + # Installing Python DyNet: - pip install cython # if you don't have it already. + pip install cython # if you don't have it already. mkdir dynet-base cd dynet-base # getting dynet and eigen @@ -33,7 +33,7 @@ TL;DR python setup.py install # or `python setup.py install --user` for a user-local install. # this should suffice, but on some systems you may need to add the following line to your - # init files in order for the compiled .so files be accessible to python. + # init files in order for the compiled .so files be accessible to Python. # /path/to/dynet/build/dynet is the location in which libdynet.dylib resides. export DYLD_LIBRARY_PATH=/path/to/dynet/build/dynet/:$DYLD_LIBRARY_PATH @@ -85,9 +85,9 @@ Compile DyNet. This is pretty much the same process as compiling DyNet, with the addition of the ``-DPYTHON=`` flag, pointing to the location of your -python interpreter. +Python interpreter. -If boost is installed in a non-standard location, you should add the +If Boost is installed in a non-standard location, you should add the corresponding flags to the ``cmake`` commandline, see the `DyNet installation instructions page `__. @@ -101,12 +101,12 @@ installation instructions page `__. make -j 2 Assuming that the ``cmake`` command found all the needed libraries and -didn't fail, the ``make`` command will take a while, and compile dynet -as well as the python bindings. You can change ``make -j 2`` to a higher +didn't fail, the ``make`` command will take a while, and compile DyNet +as well as the Python bindings. You can change ``make -j 2`` to a higher number, depending on the available cores you want to use while compiling. -You now have a working python binding inside of ``build/dynet``. To +You now have a working Python binding inside of ``build/dynet``. To verify this is working: .. code:: bash @@ -114,7 +114,7 @@ verify this is working: cd $PATH_TO_DYNET/build/python python -then, within python: +then, within Python: .. code:: bash @@ -130,10 +130,10 @@ in the system, run the following: cd $PATH_TO_DYNET/build/python python setup.py install --user -(the ``--user`` switch will install the module in your local -site-packages, and works without root privilages. To install the module -to the system site-packages (for all users), run -``python setup.py install`` without this switch) +The ``--user`` switch will install the module in your local +site-packages, and works without root privileges. To install the module +to the system site-packages (for all users), or to the current `virtualenv` +(if you are on one), run ``python setup.py install`` without this switch. You should now have a working python binding (the dynet module). @@ -145,7 +145,6 @@ Now, check that everything works: .. code:: bash - # check that it works: cd $PATH_TO_DYNET cd pyexamples python xor.py @@ -165,8 +164,10 @@ If it doesn't work and you get an error similar to the following: Referenced from: /Users/sneharajana/.python-eggs/dyNET-0.0.0-py2.7-macosx-10.11-intel.egg-tmp/_dynet.so Reason: image not found`` -then you may need to run the following (add it to your shell init files): -``export DYLD_LIBRARY_PATH=/path/to/dynet/build/dynet/:$DYLD_LIBRARY_PATH`` +then you may need to run the following (and add it to your shell init files): + + export DYLD_LIBRARY_PATH=/path/to/dynet/build/dynet/:$DYLD_LIBRARY_PATH + Windows Support ------------------ @@ -207,7 +208,7 @@ The installation process is pretty much the same, while adding the find it, you can specify also ``-DCUDA_TOOLKIT_ROOT_DIR=/path/to/cuda``.) -Now, build the python modules (as above, we assume cython is installed): +Now, build the Python modules (as above, we assume Cython is installed): After running ``make -j 2``, you should have the files ``_dynet.so`` and ``_gdynet.so`` in the ``build/python`` folder. @@ -228,7 +229,10 @@ In order to use the GPU support, you can either: Running with MKL ~~~~~~~~~~~~~~~~ -If you've built dynet to use MKL (using -DMKL or -DMKL_ROOT), python sometimes has difficulty finding the MKL shared libraries. You can try setting LD_LIBRARY_PATH to point to your MKL library directory. If that doesn't work, try setting the following environment variable (supposing, for example, your MKL libraries are located at /opt/intel/mkl/lib/intel64): +If you've built DyNet to use MKL (using ``-DMKL`` or ``-DMKL_ROOT``), Python sometimes has difficulty finding +the MKL shared libraries. You can try setting ``LD_LIBRARY_PATH`` to point to your MKL library directory. +If that doesn't work, try setting the following environment variable (supposing, for example, +your MKL libraries are located at ``/opt/intel/mkl/lib/intel64``): .. code:: bash From 174c010c15e787584223c3e4b8f8c7be4c9edc13 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 28 Nov 2016 13:46:44 -0500 Subject: [PATCH 857/965] Added documentation of losses --- dynet/expr.h | 123 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 117 insertions(+), 6 deletions(-) diff --git a/dynet/expr.h b/dynet/expr.h index 0a1f8a386..7b2ccea7a 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -11,7 +11,7 @@ * \defgroup linalgoperations * \brief The various operations that you can use in building a DyNet graph * - * \details TODO: Create documentation and explain expressions, etc... + * \details TODO: **This documentation is incomplete. See expr.h for a full list of expressions.** */ #ifndef DYNET_EXPR_H @@ -776,6 +776,20 @@ Expression log_softmax(const Expression& x); */ Expression log_softmax(const Expression& x, const std::vector& restriction); +/** + * \ingroup lossoperations + * \brief Log, sum, exp + * \details The elementwise "logsumexp" function that calculates + * \f$ln(\sum_i e^{xs_i})\f$, used in adding probabilities in the log domain. + * + * \param xs Expressions with respect to which to calculate the logsumexp. + * + * \return The result. + */ +inline Expression logsumexp(const std::initializer_list& xs) { return detail::f(xs); } +template +inline Expression logsumexp(const T& xs) { return detail::f(xs); } + /** * \ingroup lossoperations * \brief Negative softmax log likelihood @@ -941,19 +955,116 @@ Expression sparsemax_loss(const Expression& x, const std::vector& targ */ Expression sparsemax_loss(const Expression& x, const std::vector* ptarget_support); +/** + * \ingroup lossoperations + * \brief Squared norm + * \details The squared norm of the values of x: \f$\sum_i x_i^2\f$. + * + * \param x A vector of values + * + * \return The squared norm + */ Expression squared_norm(const Expression& x); + +/** + * \ingroup lossoperations + * \brief Squared distance + * \details The squared distance between values of ``x`` and ``y``: \f$\sum_i (x_i-y_i)^2\f$. + * + * \param x A vector of values + * \param y Another vector of values + * + * \return The squared distance + */ Expression squared_distance(const Expression& x, const Expression& y); -Expression huber_distance(const Expression& x, const Expression& y, float c = 1.345f); + +/** + * \ingroup lossoperations + * \brief Squared distance + * \details The L1 distance between values of ``x`` and ``y``: \f$\sum_i |x_i-y_i|\f$. + * + * \param x A vector of values + * \param y Another vector of values + * + * \return The squared distance + */ Expression l1_distance(const Expression& x, const Expression& y); + +/** + * \ingroup lossoperations + * \brief Huber distance + * \details The huber distance between values of ``x`` and ``y`` parameterized + * by ``c,`` \f$\sum_i L_c(x_i, y_i)\f$ where: + * \f[ + * L_c(x, y) = \begin{cases} + * \frac{1}{2}(y - x)^2 & \textrm{for } |y - f(x)| \le c, \\ + * c\, |y - f(x)| - \frac{1}{2}c^2 & \textrm{otherwise.} + * \end{cases} + * \f] + * + * \param x A vector of values + * \param y Another vector of values + * \param c The parameter of the huber distance parameterizing the cuttoff + * + * \return The huber distance + */ +Expression huber_distance(const Expression& x, const Expression& y, float c = 1.345f); + +/** + * \ingroup lossoperations + * \brief Binary log loss + * \details The log loss of a binary decision according to the sigmoid + * sigmoid function \f$- \sum_i (y_i * ln(x_i) + (1-y_i) * ln(1-x_i)) \f$ + * + * \param x A vector of values + * \param y A vector of true answers + * + * \return The log loss of the sigmoid function + */ Expression binary_log_loss(const Expression& x, const Expression& y); + +/** + * \ingroup lossoperations + * \brief Pairwise rank loss + * \details A margin-based loss, where every margin violation for each pair of + * values is penalized: \f$\sum_i max(x_i-y_i+m, 0)\f$ + * + * \param x A vector of values + * \param y A vector of true answers + * \param m The margin + * + * \return The pairwise rank loss + */ Expression pairwise_rank_loss(const Expression& x, const Expression& y, real m=1.0); + +/** + * \ingroup lossoperations + * \brief Poisson loss + * \details The negative log probability of ``y`` according to a Poisson + * distribution with parameter ``x``. Useful in Poisson regression + * where, we try to predict the parameters of a Possion distribution + * to maximize the probability of data ``y``. + * + * \param x The parameter of the Poisson distribution. + * \param y The target value + * + * \return The Poisson loss + */ Expression poisson_loss(const Expression& x, unsigned y); +/** + * \ingroup lossoperations + * \brief Modifiable Poisson loss + * \details Similar to Poisson loss, but with the target value passed by + * pointer so that it can be modified without re-constructing the + * computation graph. + * + * \param x The parameter of the Poisson distribution. + * \param py A pointer to the target value + * + * \return The Poisson loss + */ Expression poisson_loss(const Expression& x, const unsigned* py); -template -inline Expression logsumexp(const T& xs) { return detail::f(xs); } -inline Expression logsumexp(const std::initializer_list& xs) { return detail::f(xs); } - //////////////////////////////////////////////// // Flow operations // //////////////////////////////////////////////// From e66d5156adf1ccc5c02cb61eb659908301622e7a Mon Sep 17 00:00:00 2001 From: Chu-Cheng Lin Date: Mon, 28 Nov 2016 14:47:17 -0500 Subject: [PATCH 858/965] exposes logsumexp --- python/_dynet.pxd | 5 +++-- python/_dynet.pyx | 11 +++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/python/_dynet.pxd b/python/_dynet.pxd index 9e511d614..e77392a30 100644 --- a/python/_dynet.pxd +++ b/python/_dynet.pxd @@ -275,8 +275,9 @@ cdef extern from "dynet/expr.h" namespace "dynet::expr": CExpression c_concat_cols "dynet::expr::concatenate_cols" (vector[CExpression]& xs) CExpression c_concat "dynet::expr::concatenate" (vector[CExpression]& xs) - CExpression c_sum "dynet::expr::sum" (vector[CExpression]& xs) - CExpression c_max "dynet::expr::vmax" (vector[CExpression]& xs) + CExpression c_sum "dynet::expr::sum" (vector[CExpression]& xs) + CExpression c_max "dynet::expr::vmax" (vector[CExpression]& xs) + CExpression c_logsumexp "dynet::expr::sum" (vector[CExpression]& xs) #cdef extern from "dynet/model.h" namespace "dynet": diff --git a/python/_dynet.pyx b/python/_dynet.pyx index ed37dbe03..2ab5c2bfe 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -932,6 +932,17 @@ cpdef Expression esum(list xs): #print(cvec.size(), file=sys.stderr) return Expression.from_cexpr(x.cg_version, c_sum(cvec)) +cpdef Expression logsumexp(list xs): + assert xs, 'List is empty, nothing to esum.' + cdef vector[CExpression] cvec + cvec = vector[CExpression]() + cdef Expression x + for x in xs: + ensure_freshness(x) + cvec.push_back(x.c()) + #print(cvec.size(), file=sys.stderr) + return Expression.from_cexpr(x.cg_version, c_logsumexp(cvec)) + cpdef Expression average(list xs): assert xs, 'List is empty, nothing to average.' cdef vector[CExpression] cvec From 5b1c4a75ddebbcdcfa6923126cd39ef557827153 Mon Sep 17 00:00:00 2001 From: Chu-Cheng Lin Date: Mon, 28 Nov 2016 15:09:16 -0500 Subject: [PATCH 859/965] typo --- python/_dynet.pxd | 2 +- python/_dynet.pyx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/python/_dynet.pxd b/python/_dynet.pxd index e77392a30..bc682484e 100644 --- a/python/_dynet.pxd +++ b/python/_dynet.pxd @@ -277,7 +277,7 @@ cdef extern from "dynet/expr.h" namespace "dynet::expr": CExpression c_sum "dynet::expr::sum" (vector[CExpression]& xs) CExpression c_max "dynet::expr::vmax" (vector[CExpression]& xs) - CExpression c_logsumexp "dynet::expr::sum" (vector[CExpression]& xs) + CExpression c_logsumexp "dynet::expr::logsumexp" (vector[CExpression]& xs) #cdef extern from "dynet/model.h" namespace "dynet": diff --git a/python/_dynet.pyx b/python/_dynet.pyx index 5e047ed7e..a1a0ecbc4 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -933,7 +933,7 @@ cpdef Expression esum(list xs): return Expression.from_cexpr(x.cg_version, c_sum(cvec)) cpdef Expression logsumexp(list xs): - assert xs, 'List is empty, nothing to esum.' + assert xs, 'List is empty, nothing to logsumexp.' cdef vector[CExpression] cvec cvec = vector[CExpression]() cdef Expression x From 98582c4244e7413bd387624d316cf971d216a777 Mon Sep 17 00:00:00 2001 From: Mitchell Stern Date: Tue, 29 Nov 2016 09:18:25 -0800 Subject: [PATCH 860/965] Fixed slicing in Python interface --- python/_dynet.pyx | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index a1a0ecbc4..175f6634a 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -622,11 +622,16 @@ cdef class Expression: #{{{ return "expression %s/%s" % (self.vindex, self.cg_version) # __getitem__ and __getslice__ in one for python 3 compatibility - def __getitem__(self, object index): - if isinstance(index, int): - return pick(self, index) - - return pickrange(self, index[0], index[1]) + def __getitem__(self, index): + assert isinstance(index, (int, slice)) + if isinstance(index, int): + return pick(self, index) + else: + if index.start is None or index.stop is None: + raise ValueError("Default start and stop indices not yet supported.") + if index.step is not None: + raise ValueError("Step sizes not yet supported.") + return pickrange(self, index.start, index.stop) cpdef scalar_value(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") From 71fc893eda8e3f3fccc77b9a4ae942dce77ba368 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 30 Nov 2016 12:32:29 -0500 Subject: [PATCH 861/965] Added support for scaling bernoulli variables --- dynet/expr.cc | 2 +- dynet/expr.h | 3 ++- dynet/nodes.cc | 2 +- dynet/nodes.h | 3 ++- python/_dynet.pxd | 2 +- python/_dynet.pyx | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/dynet/expr.cc b/dynet/expr.cc index 014ff091f..ff3046899 100644 --- a/dynet/expr.cc +++ b/dynet/expr.cc @@ -26,7 +26,7 @@ Expression const_lookup(ComputationGraph& g, LookupParameter p, const vector* pindices) { return Expression(&g, g.add_const_lookup(p, pindices)); } Expression zeroes(ComputationGraph& g, const Dim& d) { return Expression(&g, g.add_function(d)); } Expression random_normal(ComputationGraph& g, const Dim& d) { return Expression(&g, g.add_function(d)); } -Expression random_bernoulli(ComputationGraph& g, const Dim& d, real p) { return Expression(&g, g.add_function({}, d, p)); } +Expression random_bernoulli(ComputationGraph& g, const Dim& d, real p, real scale) { return Expression(&g, g.add_function({}, d, p, scale)); } Expression random_uniform(ComputationGraph& g, const Dim& d, real left, real right) { return Expression(&g, g.add_function({}, d, left, right)); } // identity function, but derivative is not propagated through it diff --git a/dynet/expr.h b/dynet/expr.h index 478d48582..47b2b0e2a 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -316,10 +316,11 @@ Expression random_normal(ComputationGraph& g, const Dim& d); * \param g Computation graph * \param d The dimensions of the input * \param p The bernoulli p parameter + * \param scale A scaling factor for the output ("active" elements will receive this value) * * \return A "d" dimensioned bernoulli distributed vector */ -Expression random_bernoulli(ComputationGraph& g, const Dim& d, real p); +Expression random_bernoulli(ComputationGraph& g, const Dim& d, real p, real scale = 1.0f); /** * \ingroup inputoperations diff --git a/dynet/nodes.cc b/dynet/nodes.cc index 8bcfc9085..9e01cdb49 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -2071,7 +2071,7 @@ DYNET_NODE_INST_DEV_IMPL(RandomNormal) template void RandomBernoulli::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - TensorTools::RandomBernoulli(fx, p); + TensorTools::RandomBernoulli(fx, p, scale); } template diff --git a/dynet/nodes.h b/dynet/nodes.h index 242434f49..a01211009 100644 --- a/dynet/nodes.h +++ b/dynet/nodes.h @@ -533,10 +533,11 @@ struct RandomNormal : public Node { // draw from Bernoulli(p) struct RandomBernoulli : public Node { - explicit RandomBernoulli(const std::initializer_list& a, const Dim& d, real p) : dim(d), p(p) { assert (a.size() == 0); } + explicit RandomBernoulli(const std::initializer_list& a, const Dim& d, real p, real scale = 1.0f) : dim(d), p(p), scale(scale) { assert (a.size() == 0); } DYNET_NODE_DEFINE_DEV_IMPL() Dim dim; real p; + real scale; }; // draw a random real from Uniform(left, right) diff --git a/python/_dynet.pxd b/python/_dynet.pxd index bc682484e..3cb89b8a2 100644 --- a/python/_dynet.pxd +++ b/python/_dynet.pxd @@ -191,7 +191,7 @@ cdef extern from "dynet/expr.h" namespace "dynet::expr": CExpression c_const_lookup "dynet::expr::const_lookup" (CComputationGraph& g, CLookupParameters p, vector[unsigned]* pindices) # CExpression c_zeroes "dynet::expr::zeroes" (CComputationGraph& g, CDim& d) # CExpression c_random_normal "dynet::expr::random_normal" (CComputationGraph& g, CDim& d) # - CExpression c_random_bernoulli "dynet::expr::random_bernoulli" (CComputationGraph& g, CDim& d, float p) + CExpression c_random_bernoulli "dynet::expr::random_bernoulli" (CComputationGraph& g, CDim& d, float p, float scale) CExpression c_random_uniform "dynet::expr::random_uniform" (CComputationGraph& g, CDim& d, float left, float right) # # identity function, but derivative is not propagated through it diff --git a/python/_dynet.pyx b/python/_dynet.pyx index a1a0ecbc4..7d46c12ae 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -851,7 +851,7 @@ def hinge(Expression x, unsigned index, float m=1.0): cpdef Expression zeroes(dim, int batch_size=1): return Expression.from_cexpr(_cg.version(), c_zeroes(_cg.thisptr[0], CDim(dim, batch_size))) cpdef Expression random_normal(dim, int batch_size=1): return Expression.from_cexpr(_cg.version(), c_random_normal(_cg.thisptr[0], CDim(dim, batch_size))) -cpdef Expression random_bernoulli(dim, float p, int batch_size=1): return Expression.from_cexpr(_cg.version(), c_random_bernoulli(_cg.thisptr[0], CDim(dim, batch_size), p)) +cpdef Expression random_bernoulli(dim, float p, float scale=1.0, int batch_size=1): return Expression.from_cexpr(_cg.version(), c_random_bernoulli(_cg.thisptr[0], CDim(dim, batch_size), p, scale)) cpdef Expression random_uniform(dim, float left, float right, int batch_size=1): return Expression.from_cexpr(_cg.version(), c_random_uniform(_cg.thisptr[0], CDim(dim, batch_size), left, right)) cpdef Expression nobackprop(Expression x): return Expression.from_cexpr(x.cg_version, c_nobackprop(x.c())) From 3e2763f3f54f0b9b583bb94dafece79796b94ac7 Mon Sep 17 00:00:00 2001 From: paul Date: Mon, 5 Dec 2016 16:38:28 -0500 Subject: [PATCH 862/965] Simplified examples --- .gitignore | 1 - examples/CMakeLists.txt | 17 +- examples/encdec.cc | 276 ----------------------- examples/encdec/encdec.h | 387 ++++++++++++++++++++++++++++++++ examples/encdec/train_encdec.cc | 276 +++++++++++++++++++++++ examples/utils/cl-args.h | 141 ++++++++++++ examples/utils/getpid.h | 7 + 7 files changed, 827 insertions(+), 278 deletions(-) delete mode 100644 examples/encdec.cc create mode 100644 examples/encdec/encdec.h create mode 100644 examples/encdec/train_encdec.cc create mode 100644 examples/utils/cl-args.h create mode 100644 examples/utils/getpid.h diff --git a/.gitignore b/.gitignore index e382eba34..74c5b92f7 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,6 @@ python/dyNET.egg-info/ # binaries examples/embed-cl -examples/encdec examples/xor examples/xor-xent examples/rnnlm diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index d96b787ef..465a1d0d3 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -4,7 +4,7 @@ if (NOT MSVC) set(MP_EXAMPLES rnnlm-mp xor-mp) endif() -foreach(TARGET mlc tok-embed poisson-regression tag-bilstm embed-cl encdec xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat read-write segrnn-sup ${MP_EXAMPLES}) +foreach(TARGET mlc tok-embed poisson-regression tag-bilstm embed-cl xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat read-write segrnn-sup ${MP_EXAMPLES}) ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) if (WITH_CUDA_BACKEND) target_link_libraries(${TARGET} gdynet ${LIBS}) @@ -19,3 +19,18 @@ foreach(TARGET mlc tok-embed poisson-regression tag-bilstm embed-cl encdec xor x endif() endforeach() +foreach(TARGET encdec) + ADD_EXECUTABLE(${TARGET} ${TARGET}/train_${TARGET}.cc) + if (WITH_CUDA_BACKEND) + target_link_libraries(${TARGET} gdynet ${LIBS}) + add_dependencies(${TARGET} dynetcuda) + target_link_libraries(${TARGET} dynetcuda) + CUDA_ADD_CUBLAS_TO_TARGET(${TARGET}) + else() + target_link_libraries(${TARGET} dynet ${LIBS}) + endif (WITH_CUDA_BACKEND) + if(UNIX AND NOT APPLE) + target_link_libraries(${TARGET} rt) + endif() +endforeach() + diff --git a/examples/encdec.cc b/examples/encdec.cc deleted file mode 100644 index 1b73aee20..000000000 --- a/examples/encdec.cc +++ /dev/null @@ -1,276 +0,0 @@ -#include "dynet/nodes.h" -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/timing.h" -#include "dynet/rnn.h" -#include "dynet/lstm.h" -#include "dynet/dict.h" -#include "dynet/expr.h" -#include "getpid.h" - -#include -#include -#include - -#include -#include - -using namespace std; -using namespace dynet; -using namespace dynet::expr; - -//parameters -unsigned LAYERS = 3; -unsigned INPUT_DIM = 500; -unsigned HIDDEN_DIM = 500; -unsigned INPUT_VOCAB_SIZE = 0; -unsigned OUTPUT_VOCAB_SIZE = 0; - -dynet::Dict d, devd; -int kSOS; -int kEOS; - -template -struct EncoderDecoder { - LookupParameter p_c; - LookupParameter p_ec; // map input to embedding (used in fwd and rev models) - Parameter p_ie2h; - Parameter p_bie; - Parameter p_h2oe; - Parameter p_boe; - Parameter p_R; - Parameter p_bias; - Builder dec_builder; - Builder rev_enc_builder; - Builder fwd_enc_builder; - - EncoderDecoder() {} - - explicit EncoderDecoder(Model& model) : - dec_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), - rev_enc_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), - fwd_enc_builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { - - - p_ie2h = model.add_parameters({unsigned(HIDDEN_DIM * LAYERS * 1.5), unsigned(HIDDEN_DIM * LAYERS * 2)}); - p_bie = model.add_parameters({unsigned(HIDDEN_DIM * LAYERS * 1.5)}); - p_h2oe = model.add_parameters({unsigned(HIDDEN_DIM * LAYERS), unsigned(HIDDEN_DIM * LAYERS * 1.5)}); - p_boe = model.add_parameters({unsigned(HIDDEN_DIM * LAYERS)}); - p_c = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {INPUT_DIM}); - p_ec = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {INPUT_DIM}); - p_R = model.add_parameters({OUTPUT_VOCAB_SIZE, HIDDEN_DIM}); - p_bias = model.add_parameters({OUTPUT_VOCAB_SIZE}); - } - - // build graph and return Expression for total loss - Expression BuildGraph(const vector& insent, const vector& osent, ComputationGraph& cg) { - // forward encoder - fwd_enc_builder.new_graph(cg); - fwd_enc_builder.start_new_sequence(); - for (unsigned t = 0; t < insent.size(); ++t) { - Expression i_x_t = lookup(cg,p_ec,insent[t]); - fwd_enc_builder.add_input(i_x_t); - } - // backward encoder - rev_enc_builder.new_graph(cg); - rev_enc_builder.start_new_sequence(); - for (int t = insent.size() - 1; t >= 0; --t) { - Expression i_x_t = lookup(cg, p_ec, insent[t]); - rev_enc_builder.add_input(i_x_t); - } - - // encoder -> decoder transformation - vector to; - for (auto h_l : fwd_enc_builder.final_h()) to.push_back(h_l); - for (auto h_l : rev_enc_builder.final_h()) to.push_back(h_l); - - Expression i_combined = concatenate(to); - Expression i_ie2h = parameter(cg, p_ie2h); - Expression i_bie = parameter(cg, p_bie); - Expression i_t = i_bie + i_ie2h * i_combined; - - Expression i_h = rectify(i_t); - Expression i_h2oe = parameter(cg,p_h2oe); - Expression i_boe = parameter(cg,p_boe); - Expression i_nc = i_boe + i_h2oe * i_h; - - vector oein1, oein2, oein; - for (unsigned i = 0; i < LAYERS; ++i) { - oein1.push_back(pickrange(i_nc, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM)); - oein2.push_back(tanh(oein1[i])); - } - for (unsigned i = 0; i < LAYERS; ++i) oein.push_back(oein1[i]); - for (unsigned i = 0; i < LAYERS; ++i) oein.push_back(oein2[i]); - - dec_builder.new_graph(cg); - dec_builder.start_new_sequence(oein); - - // decoder - Expression i_R = parameter(cg,p_R); - Expression i_bias = parameter(cg,p_bias); - vector errs; - - const unsigned oslen = osent.size() - 1; - for (unsigned t = 0; t < oslen; ++t) { - Expression i_x_t = lookup(cg, p_c, osent[t]); - Expression i_y_t = dec_builder.add_input(i_x_t); - Expression i_r_t = i_bias + i_R * i_y_t; - Expression i_ydist = log_softmax(i_r_t); - errs.push_back(pick(i_ydist,osent[t+1])); - } - Expression i_nerr = sum(errs); - return -i_nerr; - } - -private: - friend class boost::serialization::access; - template - void serialize(Archive& ar, const unsigned int) { - ar & p_c & p_ec; - ar & p_ie2h & p_bie & p_h2oe & p_boe & p_R & p_bias; - ar & dec_builder & rev_enc_builder & fwd_enc_builder; - } -}; - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - if (argc != 3 && argc != 4) { - cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; - return 1; - } - kSOS = d.convert(""); - kEOS = d.convert(""); - vector> training, dev; - string line; - int tlc = 0; - int ttoks = 0; - cerr << "Reading training data from " << argv[1] << "...\n"; - { - ifstream in(argv[1]); - assert(in); - while(getline(in, line)) { - ++tlc; - training.push_back(read_sentence(line, &d)); - ttoks += training.back().size(); - if (training.back().front() != kSOS && training.back().back() != kEOS) { - cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; - } - d.freeze(); // no new word types allowed - INPUT_VOCAB_SIZE = d.size(); - OUTPUT_VOCAB_SIZE = d.size(); - - int dlc = 0; - int dtoks = 0; - cerr << "Reading dev data from " << argv[2] << "...\n"; - { - ifstream in(argv[2]); - assert(in); - while(getline(in, line)) { - ++dlc; - dev.push_back(read_sentence(line, &devd)); - dtoks += dev.back().size(); - if (dev.back().front() != kSOS && dev.back().back() != kEOS) { - cerr << "Dev sentence in " << argv[2] << ":" << dlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << dlc << " lines, " << dtoks << " tokens\n"; - } - - ostringstream os; - os << "bilm" - << '_' << LAYERS - << '_' << INPUT_DIM - << '_' << HIDDEN_DIM - << "-pid" << getpid() << ".params"; - const string fname = os.str(); - cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; - - Model model; - bool use_momentum = false; - Trainer* sgd = nullptr; - if (use_momentum) - sgd = new MomentumSGDTrainer(&model); - else - sgd = new SimpleSGDTrainer(&model); - - - //RNNBuilder rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, &model); - //EncoderDecoder lm(model); - EncoderDecoder lm; - if (argc == 4) { - string fname = argv[3]; - ifstream in(fname); - boost::archive::text_iarchive ia(in); - ia >> model; - } - else { - lm = EncoderDecoder(model); - } - - unsigned report_every_i = 50; - unsigned dev_every_i_reports = 10; - unsigned si = training.size(); - vector order(training.size()); - for (unsigned i = 0; i < order.size(); ++i) order[i] = i; - bool first = true; - int report = 0; - unsigned lines = 0; - while(1) { - Timer iteration("completed in"); - double loss = 0; - unsigned chars = 0; - for (unsigned i = 0; i < report_every_i; ++i) { - if (si == training.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - random_shuffle(order.begin(), order.end()); - } - - // build graph for this instance - ComputationGraph cg; - auto& sent = training[order[si]]; - chars += sent.size() - 1; - ++si; - Expression loss_expr = lm.BuildGraph(sent, sent, cg); - //cg.print_graphviz(); - loss += as_scalar(cg.forward(loss_expr)); - cg.backward(loss_expr); - sgd->update(); - ++lines; - } - sgd->status(); - cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; - -#if 0 - lm.RandomSample(); -#endif - - // show score on dev data? - report++; - if (report % dev_every_i_reports == 0) { - double dloss = 0; - int dchars = 0; - for (auto& sent : dev) { - ComputationGraph cg; - Expression loss_expr = lm.BuildGraph(sent, sent, cg); - dloss += as_scalar(cg.forward(loss_expr)); - dchars += sent.size() - 1; - } - if (dloss < best) { - best = dloss; - ofstream out(fname); - boost::archive::text_oarchive oa(out); - oa << model << lm; - } - cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; - } - } - delete sgd; -} diff --git a/examples/encdec/encdec.h b/examples/encdec/encdec.h new file mode 100644 index 000000000..0baac90d8 --- /dev/null +++ b/examples/encdec/encdec.h @@ -0,0 +1,387 @@ +/** + * \file expr.h + * \defgroup seq2seq_builders + * \ingroup seq2seq_builders + * \brief An example implementation of a simple sequence to sequence model based on lstm encoder/decoder + * + */ + +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" +#include "dynet/tensor.h" + +#include +#include +#include +#include + +#include +#include + +using namespace std; +using namespace dynet; +using namespace dynet::expr; + + +int kSOS; +int kEOS; + + +unsigned INPUT_VOCAB_SIZE; +unsigned OUTPUT_VOCAB_SIZE; + +/** + * \ingroup seq2seq_builders + * \brief This structure is a "vanilla" encoder decoder model + * \details This sequence to sequence network models the conditional probability + * \f$p(y_1,\dots,y_m\vert x_1,\dots,x_n)=\prod_{i=1}^m p(y_i\vert \textbf{e},y_1,\dots,y_{i-1})\f$ + * where \f$\textbf{e}=ENC(x_1,\dots,x_n)\f$ is an encoding of the input sequence + * produced by a recurrent neural network. + * + * Typically \f$\textbf{e}\f$ is the concatenated cell and output vector of a (multilayer) LSTM. + * + * Sequence to sequence models were introduced in \cite cho2014learning . + * + * Our implementation is more akin to the one from \cite sutskever2014sequence . + * + * \tparam Builder This can theoretically be any RNNbuilder. It's only been tested with an LSTM as of now + */ +template +struct EncoderDecoder { +private: + // Hyperparameters + unsigned LAYERS; + unsigned INPUT_DIM; + unsigned HIDDEN_DIM; + + LookupParameter p_c; + LookupParameter p_ec; // map input to embedding (used in fwd and rev models) + Parameter p_ie2oe; + Parameter p_boe; + Parameter p_R; + Parameter p_bias; + Builder dec_builder; + Builder rev_enc_builder; + Builder fwd_enc_builder; + bool bidirectional; + +public: + /** + * \brief Default builder + */ + EncoderDecoder() {} + + /** + * \brief Creates an EncoderDecoder + * + * \param model Model holding the parameters + * \param num_layers Number of layers (same in the ecoder and decoder) + * \param input_dim Dimension of the word/char embeddings + * \param hidden_dim Dimension of the hidden states + * \param bwd Set to `true` to make the encoder bidirectional. This doubles the number + * of parameters in the encoder. This will also add parameters for an affine transformation + * from the bidirectional encodings (of size num_layers * 2 * hidden_dim) to encodings + * of size num_layers * hidden_dim compatible with the decoder + * + */ + explicit EncoderDecoder(Model& model, + unsigned num_layers, + unsigned input_dim, + unsigned hidden_dim, + bool bwd = false) : + LAYERS(num_layers), INPUT_DIM(input_dim), HIDDEN_DIM(hidden_dim), bidirectional(bwd), + dec_builder(num_layers, input_dim, hidden_dim, &model), + fwd_enc_builder(num_layers, input_dim, hidden_dim, &model) { + + if (bidirectional) { + rev_enc_builder = Builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model); + p_ie2oe = model.add_parameters({unsigned(HIDDEN_DIM * LAYERS * 2), + unsigned(HIDDEN_DIM * LAYERS * 4) + }); + p_boe = model.add_parameters({unsigned(HIDDEN_DIM * LAYERS * 2)}); + } + + p_c = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {INPUT_DIM}); + p_ec = model.add_lookup_parameters(INPUT_VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({OUTPUT_VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({OUTPUT_VOCAB_SIZE}); + + } + + /** + * \brief Batched encoding + * \details Encodes a batch of sentences of the same size (don't forget to pad them) + * + * \param isents Whole dataset + * \param id Index of the start of the batch + * \param bsize Batch size + * \param chars Number of tokens processed (used to compute loss per characters) + * \param cg Computation graph + * \return Returns the expression for the negative (batched) encoding + */ + Expression encode(const vector>& isents, + unsigned id, + unsigned bsize, + unsigned & chars, + ComputationGraph & cg) { + // Set variables for the input sentence + const unsigned islen = isents[id].size(); + vector x_t(bsize); + + // Forward encoder ------------------------------------------------------------------------- + + // Initialize parameters in fwd_enc_builder + fwd_enc_builder.new_graph(cg); + // Initialize the sequence + fwd_enc_builder.start_new_sequence(); + + // Run the forward encoder on the batch + for (unsigned t = 0; t < islen; ++t) { + // Fill x_t with the characters at step t in the batch + for (unsigned i = 0; i < bsize; ++i) { + x_t[i] = isents[id + i][t]; + if (x_t[i] != *isents[id].rbegin()) chars++; // if x_t is non-EOS, count a char + } + // Get embedding + Expression i_x_t = lookup(cg, p_ec, x_t); + // Run a step in the forward encoder + fwd_enc_builder.add_input(i_x_t); + } + + // Backward encoder ------------------------------------------------------------------------ + if (bidirectional) { + // Initialize parameters in bwd_enc_builder + rev_enc_builder.new_graph(cg); + // Initialize the sequence + rev_enc_builder.start_new_sequence(); + // Fill x_t with the characters at step t in the batch (in reverse order) + for (int t = islen - 1; t >= 0; --t) { + for (int i = 0; i < bsize; ++i) { + x_t[i] = isents[id + i][t]; + } + // Get embedding (could be mutualized with fwd_enc_builder) + Expression i_x_t = lookup(cg, p_ec, x_t); + // Run a step in the forward encoder + rev_enc_builder.add_input(i_x_t); + } + } + + // Collect encodings ----------------------------------------------------------------------- + vector to; + // Get states from forward encoder + for (auto s_l : fwd_enc_builder.final_s()) to.push_back(s_l); + // Get states from backward encoder + if (bidirectional) + for (auto s_l : rev_enc_builder.final_s()) to.push_back(s_l); + + // Put it as a vector (matrix because it's batched) + Expression i_combined = concatenate(to); + Expression i_nc; + if (bidirectional) { + // Perform an affine transformation for rescaling in case of bidirectional encoder + Expression i_ie2oe = parameter(cg, p_ie2oe); + Expression i_bie = parameter(cg, p_boe); + i_nc = i_bie + i_ie2oe * i_combined; + } else { + // Otherwise just copy the states + i_nc = i_combined; + } + + return i_nc; + } + + /** + * \brief Single sentence version of `encode` + * \details Note : this just creates a trivial dataset and feed it to the batched version with + * batch_size 1. It's not very effective so don't use it for training. + * + * \param insent Input sentence + * \param cg Computation graph + * + * \return Expression of the encoding + */ + Expression encode(const vector& insent, ComputationGraph & cg) { + vector> isents; + isents.push_back(insent); + unsigned chars = 0; + return encode(isents, 0, 1, chars, cg); + } + + /** + * \brief Batched decoding + * \details [long description] + * + * \param i_nc Encoding (should be batched) + * \param osents Output sentences dataset + * \param id Start index of the batch + * \param bsize Batch size (should be consistent with the shape of `i_nc`) + * \param cg Computation graph + * \return Expression for the negative log likelihood + */ + Expression decode(const Expression i_nc, + const vector>& osents, + int id, + int bsize, + ComputationGraph & cg) { + // Reconstruct input states from encodings ------------------------------------------------- + // List of input states for decoder + vector oein; + // Add input cell states + for (unsigned i = 0; i < LAYERS; ++i) { + oein.push_back(pickrange(i_nc, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM )); + } + // Add input output states + for (unsigned i = 0; i < LAYERS; ++i) { + oein.push_back(pickrange(i_nc, HIDDEN_DIM * LAYERS + i * HIDDEN_DIM, + HIDDEN_DIM * LAYERS + (i + 1) * HIDDEN_DIM)); + } + + // Initialize graph for decoder + dec_builder.new_graph(cg); + // Initialize new sequence with encoded states + dec_builder.start_new_sequence(oein); + + // Run decoder ----------------------------------------------------------------------------- + // Add parameters to the graph + Expression i_R = parameter(cg, p_R); + Expression i_bias = parameter(cg, p_bias); + // Initialize errors and input vectors + vector errs; + vector x_t(bsize); + + // Set start of sentence + for (int i = 0; i < bsize; ++i) { + x_t[i] = osents[id + i][0]; + } + vector next_x_t(bsize); + + const unsigned oslen = osents[id].size(); + // Run on output sentence + for (unsigned t = 1; t < oslen; ++t) { + // Retrieve input + for (int i = 0; i < bsize; ++i) { + next_x_t[i] = osents[id + i][t]; + } + // Embed token + Expression i_x_t = lookup(cg, p_c, x_t); + // Run decoder step + Expression i_y_t = dec_builder.add_input(i_x_t); + // Project from output dim to dictionary dimension + Expression i_r_t = i_bias + i_R * i_y_t; + // Compute softmax and negative log + Expression i_err = pickneglogsoftmax(i_r_t, next_x_t); + errs.push_back(i_err); + x_t = next_x_t; + } + + // Sum loss over batch + Expression i_nerr = sum_batches(sum(errs)); + return i_nerr; + + } + + /** + * \brief Single sentence version of `decode` + * \details For similar reasons as `encode`, this is not really efficient. USed the batched + * version directly for training + * + * \param i_nc Encoding + * \param osent Output sentence + * \param cg Computation graph + * \return Expression for the negative log likelihood + */ + Expression decode(const Expression i_nc, + const vector& osent, + ComputationGraph & cg) { + vector> osents; + osents.push_back(osent); + return decode(i_nc, osents, 0, 1, cg); + } + + /** + * \brief Generate a sentence from an input sentence + * \details Samples at each timestep ducring decoding. Possible variations are greedy decoding + * and beam search for better performance + * + * \param insent Input sentence + * \param cg Computation Graph + * + * \return Generated sentence (indices in the dictionary) + */ + vector generate(const vector& insent, ComputationGraph & cg) { + return generate(encode(insent, cg), 2 * insent.size() - 1, cg); + } + + /** + * @brief Generate a sentence from an encoding + * @details You can use this directly to generate random sentences + * + * @param i_nc Input encoding + * @param oslen Maximum length of output + * @param cg Computation graph + * @return Generated sentence (indices in the dictionary) + */ + vector generate(Expression i_nc, unsigned oslen, ComputationGraph & cg) { + + vector oein1, oein2, oein; + for (unsigned i = 0; i < LAYERS; ++i) { + oein1.push_back(pickrange(i_nc, i * HIDDEN_DIM, (i + 1) * HIDDEN_DIM)); + oein2.push_back(tanh(oein1[i])); + } + for (unsigned i = 0; i < LAYERS; ++i) oein.push_back(oein1[i]); + for (unsigned i = 0; i < LAYERS; ++i) oein.push_back(oein2[i]); + + dec_builder.new_graph(cg); + dec_builder.start_new_sequence(oein); + + // decoder + Expression i_R = parameter(cg, p_R); + Expression i_bias = parameter(cg, p_bias); + vector osent; + osent.push_back(kSOS); + + for (unsigned t = 0; t < oslen; ++t) { + Expression i_x_t = lookup(cg, p_c, osent[t]); + Expression i_y_t = dec_builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + Expression i_ydist = softmax(i_r_t); + vector probs = as_vector(i_ydist.value()); + osent.push_back(sample(probs)); + if (osent[t + 1] == kEOS) break; + } + return osent; + } + +private: + friend class boost::serialization::access; + template + void serialize(Archive & ar, const unsigned int) { + ar & bidirectional; + ar & LAYERS & INPUT_DIM & HIDDEN_DIM; + ar & p_c & p_ec & p_R & p_bias; + if (bidirectional) + ar & p_ie2oe & p_boe; + if (bidirectional) + ar & dec_builder & rev_enc_builder & fwd_enc_builder; + else + ar & dec_builder & fwd_enc_builder; + } + inline int sample(const vector& v) { + float p = (float)rand() / (float) RAND_MAX; + float cumul = 0.f; + int idx = 0; + while (idx < v.size() && p > cumul) { + cumul += v[idx]; + idx += 1; + } + return idx ? idx - 1 : 0; + } +}; + + diff --git a/examples/encdec/train_encdec.cc b/examples/encdec/train_encdec.cc new file mode 100644 index 000000000..b50bc8883 --- /dev/null +++ b/examples/encdec/train_encdec.cc @@ -0,0 +1,276 @@ +/** + * Train a vanilla encoder decoder lstm network with minibatching + * to perform auto-encoding. + * + * This provide an example of usage of the encdec.h model + */ +#include "encdec.h" +#include "../utils/getpid.h" +#include "../utils/cl-args.h" + +using namespace std; +using namespace dynet; +using namespace dynet::expr; + + + +// Sort sentences in descending order of length +struct CompareLen { + bool operator()(const std::vector& first, const std::vector& second) { + return first.size() > second.size(); + } +}; + +int main(int argc, char** argv) { + // Fetch dynet params -------------------------------------------------------------------------- + auto dyparams = dynet::extract_dynet_params(argc, argv); + dynet::initialize(dyparams); + + // Fetch program specific parameters (see ../utils/cl-args.h) ---------------------------------- + Params params; + + INPUT_VOCAB_SIZE = 0; + OUTPUT_VOCAB_SIZE = 0; + + get_args(argc, argv, params, TRAIN); + + // Load datasets ------------------------------------------------------------------------------- + + // Dictionary + Dict d; + + // Start and end of sentence words + kSOS = d.convert(""); + kEOS = d.convert(""); + + // Datasets + vector> training, dev; + + // Read training data and fill dictionary + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << params.train_file << "...\n"; + { + ifstream in(params.train_file); + assert(in); + while (getline(in, line)) { + ++tlc; + training.push_back(read_sentence(line, &d)); + ttoks += training.back().size(); + if (training.back().front() != kSOS && training.back().back() != kEOS) { + cerr << "Training sentence in " << params.train_file << ":" << tlc + << " didn't start or end with , \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + // Sort the training sentences in descending order of length (for minibatching) + CompareLen comp; + sort(training.begin(), training.end(), comp); + // Pad the sentences in the same batch with EOS so they are the same length + // This modifies the training objective a bit by making it necessary to + // predict EOS multiple times, but it's easy and not so harmful + for (size_t i = 0; i < training.size(); i += params.BATCH_SIZE) + for (size_t j = 1; j < params.BATCH_SIZE; ++j) + while (training[i + j].size() < training[i].size()) + training[i + j].push_back(kEOS); + // Freeze dictionary + d.freeze(); // no new word types allowed + d.set_unk("UNK"); + INPUT_VOCAB_SIZE = d.size(); + OUTPUT_VOCAB_SIZE = d.size(); + + // Read validation dataset + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << params.dev_file << "...\n"; + { + ifstream in(params.dev_file); + assert(in); + while (getline(in, line)) { + ++dlc; + dev.push_back(read_sentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() != kSOS && dev.back().back() != kEOS) { + cerr << "Dev sentence in " << params.dev_file << ":" + << dlc << " didn't start or end with , \n"; + cerr << d.convert(dev.back().front()) << ":" + << d.convert(dev.back().back()) << " \n"; + cerr << kSOS << ":" << kEOS << "\n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + // Sort the dev sentences in descending order of length (for minibatching) + sort(dev.begin(), dev.end(), comp); + // Pad the sentences in the same batch with EOS so they are the same length + // This modifies the dev objective a bit by making it necessary to + // predict EOS multiple times, but it's easy and not so harmful + for (size_t i = 0; i < dev.size(); i += params.DEV_BATCH_SIZE) + for (size_t j = 1; j < params.DEV_BATCH_SIZE; ++j) + while (dev[i + j].size() < dev[i].size()) + dev[i + j].push_back(kEOS); + + // Model name (for saving) --------------------------------------------------------------------- + ostringstream os; + // Store a bunch of information in the model name + os << params.exp_name + << "_" << (params.bidirectionnal ? "bi" : "") << "lm" + << '_' << params.LAYERS + << '_' << params.INPUT_DIM + << '_' << params.HIDDEN_DIM + << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + + // Initialize model and trainer ---------------------------------------------------------------- + Model model; + // Use Adam optimizer + Trainer* adam = nullptr; + adam = new AdamTrainer(&model, 0.001, 0.9, 0.999, 1e-8); + adam->clip_threshold *= params.BATCH_SIZE; + + // Create model + EncoderDecoder lm(model, + params.LAYERS, + params.INPUT_DIM, + params.HIDDEN_DIM, + params.bidirectionnal); + + // Load preexisting weights (if provided) + if (params.model_file != "") { + ifstream in(params.model_file); + boost::archive::text_iarchive ia(in); + ia >> model >> lm; + } + + // Initialize variables for training ----------------------------------------------------------- + // Best dev score + double best = 9e+99; + + // Number of batches in training set + unsigned num_batches = training.size() / params.BATCH_SIZE - 1; + + // Number of sentences to sample each epoch (for visualization) + unsigned num_samples = 5; + + // Random indexing + unsigned si; + vector order(num_batches); + for (unsigned i = 0; i < num_batches; ++i) order[i] = i; + + bool first = true; + int epoch = 0; + // Run for the given number of epochs (or indefinitely if params.NUM_EPOCHS is negative) + while (epoch < params.NUM_EPOCHS || params.NUM_EPOCHS < 0) { + // Update the optimizer + if (first) { first = false; } else { adam->update_epoch(); } + // Reshuffle the dataset + cerr << "**SHUFFLE\n"; + random_shuffle(order.begin(), order.end()); + // Initialize loss and number of chars(/word) (for loss per char/word) + double loss = 0; + unsigned chars = 0; + // Start timer + Timer* iteration = new Timer("completed in"); + + for (si = 0; si < num_batches; ++si) { + // build graph for this instance + ComputationGraph cg; + // Compute batch start id and size + int id = order[si] * params.BATCH_SIZE; + unsigned bsize = std::min((unsigned)training.size() - id, params.BATCH_SIZE); + // Encode the batch + Expression encoding = lm.encode(training, id, bsize, chars, cg); + // Decode and get error (negative log likelihood) + Expression loss_expr = lm.decode(encoding, training, id, bsize, cg); + // Get scalar error for monitoring + loss += as_scalar(cg.forward(loss_expr)); + // Compute gradient with backward pass + cg.backward(loss_expr); + // Update parameters + adam->update(); + // Print progress every tenth of the dataset + if ((si + 1) % (num_batches / 10) == 0 || si == num_batches - 1) { + + // Print informations + adam->status(); + cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + // Reinitialize timer + delete iteration; + iteration = new Timer("completed in"); + // Reinitialize loss + loss = 0; + chars = 0; + } + } + + // Increment epoch + ++epoch; + + // Show score on dev data + if (si == num_batches) { + double dloss = 0; + unsigned dchars = 0; + for (unsigned i = 0; i < dev.size() / params.DEV_BATCH_SIZE; ++i) { + // build graph for this instance + ComputationGraph cg; + unsigned id = i * params.DEV_BATCH_SIZE; + unsigned bsize = std::min((unsigned)dev.size() - id, params.DEV_BATCH_SIZE); + // Encode + Expression encoding = lm.encode( dev, id, bsize, dchars, cg); + // Decode and get loss + Expression loss_expr = lm.decode(encoding, dev, id, bsize, cg); + // Count loss + dloss += as_scalar(cg.forward(loss_expr)); + } + // If the validation loss is the lowest, save the parameters + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model << lm; + } + // Print informations + cerr << "\n***DEV [epoch=" << (epoch) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + // Reinitialize timer + delete iteration; + iteration = new Timer("completed in"); + } + + + // Sample some examples because it's cool (also helps debugging) + if (si == num_batches) { + cout << "---------------------------------------------" << endl; + for (unsigned i = 0; i < num_samples; ++i) { + // Select a random sentence from the dev set + float p = (float)rand() / (float) RAND_MAX; + unsigned idx = (unsigned)(p * dev.size()) % dev.size(); + auto sent = dev[idx]; + ComputationGraph cg; + // Sample sentence + vector sampled = lm.generate(sent, cg); + // Print original sentence + cout << "Original sentence : "; + for (int word : sent) { + cout << d.convert(word) << " "; + } + cout << endl; + // Print sampled sentence + cout << "Sampled sentence : "; + for (int word : sampled) { + cout << d.convert(word) << " "; + } + cout << endl; + cout << "---------------------------------------------" << endl; + } + } + } + // Free memory + delete adam; + +} + diff --git a/examples/utils/cl-args.h b/examples/utils/cl-args.h new file mode 100644 index 000000000..8e15b9e86 --- /dev/null +++ b/examples/utils/cl-args.h @@ -0,0 +1,141 @@ +#include +#include +#include +#include + +enum Task {TRAIN, ANALYSIS}; + +struct Params { + string exp_name = "encdec"; + string train_file = ""; + string dev_file = ""; + string model_file = ""; + string dic_file = ""; + string test_file = ""; + unsigned LAYERS = 1; + unsigned INPUT_DIM = 2; + unsigned HIDDEN_DIM = 4; + unsigned BATCH_SIZE = 1; + unsigned DEV_BATCH_SIZE = 16; + int NUM_EPOCHS = -1; + bool bidirectionnal = false; + bool cust_l2 = false; + bool dist_penalty = false; +}; + +void get_args(int argc, + char** argv, + Params& params, + Task task) { + int i = 0; + while (i < argc) { + string arg = argv[i]; + if (arg == "--name" || arg == "-n") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.exp_name; + i++; + } else if (arg == "--train" || arg == "-t") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.train_file; + i++; + } else if (arg == "--dev" || arg == "-d") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.dev_file; + i++; + } else if (arg == "--dict" || arg == "-dic") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.dic_file; + i++; + } else if (arg == "--test" || arg == "-ts") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.test_file; + i++; + } else if (arg == "--model" || arg == "-m") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.model_file; + i++; + } else if (arg == "--num_layers" || arg == "-l") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.LAYERS; + i++; + } else if (arg == "--input_size" || arg == "-i") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.INPUT_DIM; + i++; + } else if (arg == "--hidden_size" || arg == "-h") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.HIDDEN_DIM; + i++; + } else if (arg == "--batch_size" || arg == "-b") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.BATCH_SIZE; + i++; + } else if (arg == "--num_epochs" || arg == "-N") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.NUM_EPOCHS; + i++; + } else if (arg == "--bidirectionnal" || arg == "-bid") { + params.bidirectionnal = true; + } else if (arg == "--cust_l2" || arg == "-cl2") { + params.cust_l2 = true; + } else if (arg == "--dist_penalty" || arg == "-dp") { + params.dist_penalty = true; + } + i++; + } + if (task == TRAIN) { + if (params.train_file == "" || params.dev_file == "") { + std::cerr << "Usage: " << argv[0] << " -t train.txt -d dev.txt\n"; + abort(); + } + } else if (task == ANALYSIS) { + if (params.dic_file == "" || params.test_file == "" || params.model_file == "") { + std::cerr << "Usage: " << argv[0] << " -dic corpus_dic.txt -ts test.txt -m model.params\n"; + abort(); + } + } +} diff --git a/examples/utils/getpid.h b/examples/utils/getpid.h new file mode 100644 index 000000000..3ce955141 --- /dev/null +++ b/examples/utils/getpid.h @@ -0,0 +1,7 @@ +// Platform-independent header to allow calls to getpid() +// +#if _WINDOWS + #include +#endif + + From 738f5e4c98307067f1c3b7daa0a9406ab57d60b1 Mon Sep 17 00:00:00 2001 From: paul Date: Mon, 5 Dec 2016 17:36:53 -0500 Subject: [PATCH 863/965] Reformatted examples --- .gitignore | 5 - examples/CMakeLists.txt | 20 +- .../train_embed-cl.cc} | 0 examples/getpid.h | 7 - examples/{mlc.cc => mlc/train_mlc.cc} | 0 examples/{nlm.cc => nlm/train_nlm.cc} | 0 ...n-regression.cc => poisson-regression.cc~} | 0 .../train_poisson-regression.cc | 206 ++++++++++++ .../train_read-write.cc} | 0 .../train_rnnlm-aevb.cc} | 2 +- examples/rnnlm-batch/train_rnnlm-batch.cc | 255 ++++++++++++++ .../train_rnnlm-batch.cc~} | 0 .../train_rnnlm-cfsm.cc} | 2 +- examples/rnnlm-final-batch.cc~ | 264 +++++++++++++++ .../train_rnnlm-final-batch.cc | 264 +++++++++++++++ .../{ => rnnlm-givenbag}/rnnlm-givenbag.cc | 4 +- examples/{ => rnnlm-mp}/rnnlm.h | 0 .../train_rnnlm-mp.cc} | 0 examples/{rnnlm.cc => rnnlm/train_rnnlm.cc} | 2 +- .../train_segrnn-sup.cc} | 0 .../train_skiprnnlm.cc} | 0 examples/tag-bilstm/train_tag-bilstm.cc | 261 ++++++++++++++ .../train_tag-bilstm.cc~} | 0 examples/{textcat.cc => textcat.cc~} | 0 examples/textcat/train_textcat.cc | 317 ++++++++++++++++++ .../train_tok-embed.cc} | 0 .../train_xor-batch-lookup.cc} | 0 .../train_xor-batch.cc} | 0 .../{xor-mp.cc => xor-mp/train_xor-mp.cc} | 0 .../train_xor-xent.cc} | 0 examples/{xor.cc => xor/train_xor.cc} | 0 31 files changed, 1575 insertions(+), 34 deletions(-) rename examples/{embed-cl.cc => embed-cl/train_embed-cl.cc} (100%) delete mode 100644 examples/getpid.h rename examples/{mlc.cc => mlc/train_mlc.cc} (100%) rename examples/{nlm.cc => nlm/train_nlm.cc} (100%) rename examples/{poisson-regression.cc => poisson-regression.cc~} (100%) create mode 100644 examples/poisson-regression/train_poisson-regression.cc rename examples/{read-write.cc => read-write/train_read-write.cc} (100%) rename examples/{rnnlm-aevb.cc => rnnlm-aevb/train_rnnlm-aevb.cc} (99%) create mode 100644 examples/rnnlm-batch/train_rnnlm-batch.cc rename examples/{rnnlm-batch.cc => rnnlm-batch/train_rnnlm-batch.cc~} (100%) rename examples/{rnnlm-cfsm.cc => rnnlm-cfsm/train_rnnlm-cfsm.cc} (99%) create mode 100644 examples/rnnlm-final-batch.cc~ create mode 100644 examples/rnnlm-final-batch/train_rnnlm-final-batch.cc rename examples/{ => rnnlm-givenbag}/rnnlm-givenbag.cc (99%) rename examples/{ => rnnlm-mp}/rnnlm.h (100%) rename examples/{rnnlm-mp.cc => rnnlm-mp/train_rnnlm-mp.cc} (100%) rename examples/{rnnlm.cc => rnnlm/train_rnnlm.cc} (99%) rename examples/{segrnn-sup.cc => segrnn-sup/train_segrnn-sup.cc} (100%) rename examples/{skiprnnlm.cc => skiprnnlm/train_skiprnnlm.cc} (100%) create mode 100644 examples/tag-bilstm/train_tag-bilstm.cc rename examples/{tag-bilstm.cc => tag-bilstm/train_tag-bilstm.cc~} (100%) rename examples/{textcat.cc => textcat.cc~} (100%) create mode 100644 examples/textcat/train_textcat.cc rename examples/{tok-embed.cc => tok-embed/train_tok-embed.cc} (100%) rename examples/{xor-batch-lookup.cc => xor-batch-lookup/train_xor-batch-lookup.cc} (100%) rename examples/{xor-batch.cc => xor-batch/train_xor-batch.cc} (100%) rename examples/{xor-mp.cc => xor-mp/train_xor-mp.cc} (100%) rename examples/{xor-xent.cc => xor-xent/train_xor-xent.cc} (100%) rename examples/{xor.cc => xor/train_xor.cc} (100%) diff --git a/.gitignore b/.gitignore index 74c5b92f7..e336c5045 100644 --- a/.gitignore +++ b/.gitignore @@ -14,11 +14,6 @@ python/dist/ python/dyNET.egg-info/ # binaries -examples/embed-cl -examples/xor -examples/xor-xent -examples/rnnlm -examples/nlm #data rnnlm/ptb-mikolov/ diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 465a1d0d3..7987ce84c 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -4,23 +4,9 @@ if (NOT MSVC) set(MP_EXAMPLES rnnlm-mp xor-mp) endif() -foreach(TARGET mlc tok-embed poisson-regression tag-bilstm embed-cl xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat read-write segrnn-sup ${MP_EXAMPLES}) - ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) - if (WITH_CUDA_BACKEND) - target_link_libraries(${TARGET} gdynet ${LIBS}) - add_dependencies(${TARGET} dynetcuda) - target_link_libraries(${TARGET} dynetcuda) - CUDA_ADD_CUBLAS_TO_TARGET(${TARGET}) - else() - target_link_libraries(${TARGET} dynet ${LIBS}) - endif (WITH_CUDA_BACKEND) - if(UNIX AND NOT APPLE) - target_link_libraries(${TARGET} rt) - endif() -endforeach() - -foreach(TARGET encdec) - ADD_EXECUTABLE(${TARGET} ${TARGET}/train_${TARGET}.cc) +foreach(FOLDER encdec mlc tok-embed poisson-regression tag-bilstm embed-cl xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat read-write segrnn-sup ${MP_EXAMPLES}) + set(TARGET train_${FOLDER}) + ADD_EXECUTABLE(${TARGET} ${FOLDER}/${TARGET}.cc) if (WITH_CUDA_BACKEND) target_link_libraries(${TARGET} gdynet ${LIBS}) add_dependencies(${TARGET} dynetcuda) diff --git a/examples/embed-cl.cc b/examples/embed-cl/train_embed-cl.cc similarity index 100% rename from examples/embed-cl.cc rename to examples/embed-cl/train_embed-cl.cc diff --git a/examples/getpid.h b/examples/getpid.h deleted file mode 100644 index 3ce955141..000000000 --- a/examples/getpid.h +++ /dev/null @@ -1,7 +0,0 @@ -// Platform-independent header to allow calls to getpid() -// -#if _WINDOWS - #include -#endif - - diff --git a/examples/mlc.cc b/examples/mlc/train_mlc.cc similarity index 100% rename from examples/mlc.cc rename to examples/mlc/train_mlc.cc diff --git a/examples/nlm.cc b/examples/nlm/train_nlm.cc similarity index 100% rename from examples/nlm.cc rename to examples/nlm/train_nlm.cc diff --git a/examples/poisson-regression.cc b/examples/poisson-regression.cc~ similarity index 100% rename from examples/poisson-regression.cc rename to examples/poisson-regression.cc~ diff --git a/examples/poisson-regression/train_poisson-regression.cc b/examples/poisson-regression/train_poisson-regression.cc new file mode 100644 index 000000000..072e748e1 --- /dev/null +++ b/examples/poisson-regression/train_poisson-regression.cc @@ -0,0 +1,206 @@ +#include "dynet/grad-check.h" +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/deep-lstm.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" +#include "../utils/getpid.h" + +#include +#include +#include + +#include +#include + +using namespace std; +using namespace dynet; + +unsigned LAYERS = 2; +unsigned INPUT_DIM = 16; //256 +unsigned HIDDEN_DIM = 32; // 1024 +unsigned VOCAB_SIZE = 0; + +dynet::Dict d; +int kSOS; +int kEOS; + +template +struct RNNLengthPredictor { + LookupParameter p_c; + Parameter p_R; + Parameter p_bias; + Builder builder; + explicit RNNLengthPredictor(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({1, HIDDEN_DIM}); + p_bias = model.add_parameters({1}); + } + + // return Expression of total loss + Expression BuildLMGraph(const vector& sent, unsigned len, ComputationGraph& cg, bool flag = false) { + const unsigned slen = sent.size() - 1; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + Expression R = parameter(cg, p_R); + Expression bias = parameter(cg, p_bias); + vector errs; + for (unsigned t = 0; t < slen; ++t) { + Expression i_x_t = lookup(cg, p_c, sent[t]); + // y_t = RNN(x_t) + builder.add_input(i_x_t); + } + Expression pred = affine_transform({bias, R, builder.back()}); + if (flag) { + unsigned x = exp(as_scalar(cg.incremental_forward(pred))); + cerr << "PRED=" << x << " TRUE=" << len << "\t(DIFF=" << ((int)x - (int)len) << ")" << endl; + } + return poisson_loss(pred, len); + } +}; + +int main(int argc, char** argv) { + dynet::initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.convert(""); + kEOS = d.convert(""); + vector,unsigned>> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + Dict td; + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + vector x, ty; + read_sentence_pair(line, &x, &d, &ty, &td); + assert(ty.size() == 1); + const string& v = td.convert(ty[0]); + for(auto c : v) { assert(c >= '0' && c <= '9'); } + unsigned y = atoi(v.c_str()); + training.push_back(make_pair(x,y)); + ttoks += training.back().first.size(); + if (training.back().first.front() != kSOS && training.back().first.back() != kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + d.freeze(); // no new word types allowed + VOCAB_SIZE = d.size(); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + Dict td; + while(getline(in, line)) { + ++dlc; + vector x, ty; + read_sentence_pair(line, &x, &d, &ty, &td); + assert(ty.size() == 1); + const string& v = td.convert(ty[0]); + for(auto c : v) { assert(c >= '0' && c <= '9'); } + unsigned y = atoi(v.c_str()); + dev.push_back(make_pair(x,y)); + dtoks += dev.back().first.size(); + if (dev.back().first.front() != kSOS && dev.back().first.back() != kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + ostringstream os; + os << "lm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + Trainer* sgd = nullptr; + sgd = new SimpleSGDTrainer(&model); + + RNNLengthPredictor lm(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 20; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& sent = training[order[si]]; + ++si; + Expression loss_expr = lm.BuildLMGraph(sent.first, sent.second, cg); + loss += as_scalar(cg.forward(loss_expr)); + cg.backward(loss_expr); + sgd->update(); + ++lines; + ++chars; + } + sgd->status(); + cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + int dchars = 0; + for (auto& sent : dev) { + ComputationGraph cg; + Expression loss_expr = lm.BuildLMGraph(sent.first, sent.second, cg, true); + dloss += as_scalar(cg.forward(loss_expr)); + dchars++; + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } + } + delete sgd; +} + diff --git a/examples/read-write.cc b/examples/read-write/train_read-write.cc similarity index 100% rename from examples/read-write.cc rename to examples/read-write/train_read-write.cc diff --git a/examples/rnnlm-aevb.cc b/examples/rnnlm-aevb/train_rnnlm-aevb.cc similarity index 99% rename from examples/rnnlm-aevb.cc rename to examples/rnnlm-aevb/train_rnnlm-aevb.cc index 4167458be..3016eab99 100644 --- a/examples/rnnlm-aevb.cc +++ b/examples/rnnlm-aevb/train_rnnlm-aevb.cc @@ -7,7 +7,7 @@ #include "dynet/lstm.h" #include "dynet/dict.h" #include "dynet/expr.h" -#include "getpid.h" +#include "../utils/getpid.h" #include #include diff --git a/examples/rnnlm-batch/train_rnnlm-batch.cc b/examples/rnnlm-batch/train_rnnlm-batch.cc new file mode 100644 index 000000000..b1b45a28d --- /dev/null +++ b/examples/rnnlm-batch/train_rnnlm-batch.cc @@ -0,0 +1,255 @@ +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" +#include "../utils/getpid.h" + +#include +#include +#include +#include + +#include +#include + +using namespace std; +using namespace dynet; + +unsigned LAYERS = 2; +unsigned INPUT_DIM = 8; //256 +unsigned HIDDEN_DIM = 24; // 1024 +unsigned BATCH_SIZE = 4; +unsigned VOCAB_SIZE = 0; + +dynet::Dict d; +int kSOS; +int kEOS; + +template +struct RNNLanguageModel { + LookupParameter p_c; + Parameter p_R; + Parameter p_bias; + Builder builder; + explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({VOCAB_SIZE}); + } + + // return Expression of total loss + Expression BuildLMGraphs(const vector >& sents, + unsigned id, + unsigned bsize, + unsigned & chars, + ComputationGraph& cg) { + const unsigned slen = sents[id].size(); + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter + Expression i_bias = parameter(cg, p_bias); // word bias + vector errs; + vector last_arr(bsize, sents[0][0]), next_arr(bsize); + for (unsigned t = 1; t < slen; ++t) { + for (unsigned i = 0; i < bsize; ++i) { + next_arr[i] = sents[id+i][t]; + if(next_arr[i] != *sents[id].rbegin()) chars++; // add non-EOS + } + // y_t = RNN(x_t) + Expression i_x_t = lookup(cg, p_c, last_arr); + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + Expression i_err = pickneglogsoftmax(i_r_t, next_arr); + errs.push_back(i_err); + last_arr = next_arr; + } + Expression i_nerr = sum_batches(sum(errs)); + return i_nerr; + } + + // return Expression for total loss + void RandomSample(int max_len = 150) { + cerr << endl; + ComputationGraph cg; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + + Expression i_R = parameter(cg, p_R); + Expression i_bias = parameter(cg, p_bias); + vector errs; + int len = 0; + int cur = kSOS; + while(len < max_len && cur != kEOS) { + ++len; + Expression i_x_t = lookup(cg, p_c, cur); + // y_t = RNN(x_t) + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + + Expression ydist = softmax(i_r_t); + + unsigned w = 0; + while (w == 0 || (int)w == kSOS) { + auto dist = as_vector(cg.incremental_forward(ydist)); + double p = rand01(); + for (; w < dist.size(); ++w) { + p -= dist[w]; + if (p < 0.0) { break; } + } + if (w == dist.size()) w = kEOS; + } + cerr << (len == 1 ? "" : " ") << d.convert(w); + cur = w; + } + cerr << endl; + } +}; + +// Sort in descending order of length +struct CompareLen { + bool operator()(const std::vector& first, const std::vector& second) { + return first.size() > second.size(); + } +}; + +int main(int argc, char** argv) { + dynet::initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.convert(""); + kEOS = d.convert(""); + vector> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + training.push_back(read_sentence(line, &d)); + ttoks += training.back().size(); + if (training.back().front() != kSOS && training.back().back() != kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + d.freeze(); // no new word types allowed + VOCAB_SIZE = d.size(); + + // Sort the training sentences in descending order of length + CompareLen comp; + sort(training.begin(), training.end(), comp); + // Pad the sentences in the same batch with EOS so they are the same length + // This modifies the training objective a bit by making it necessary to + // predict EOS multiple times, but it's easy and not so harmful + for(size_t i = 0; i < training.size(); i += BATCH_SIZE) + for(size_t j = 1; j < BATCH_SIZE; ++j) + while(training[i+j].size() < training[i].size()) + training[i+j].push_back(kEOS); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + ++dlc; + dev.push_back(read_sentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() != kSOS && dev.back().back() != kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + + ostringstream os; + os << "lm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + Trainer* sgd = nullptr; + sgd = new SimpleSGDTrainer(&model); + sgd->clip_threshold *= BATCH_SIZE; + + RNNLanguageModel lm(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 500; + vector order((training.size()+BATCH_SIZE-1)/BATCH_SIZE); + unsigned si = order.size(); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i*BATCH_SIZE; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i, ++si) { + if (si == order.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + // build graph for this instance + ComputationGraph cg; + unsigned bsize = std::min((unsigned)training.size()-order[si], BATCH_SIZE); // Batch size + Expression loss_expr = lm.BuildLMGraphs(training, order[si], bsize, chars, cg); + loss += as_scalar(cg.forward(loss_expr)); + cg.backward(loss_expr); + sgd->update(); + lines += bsize; + } + sgd->status(); + cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + lm.RandomSample(); + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + unsigned dchars = 0; + for (unsigned i = 0; i < dev.size(); ++i) { + ComputationGraph cg; + Expression loss_expr = lm.BuildLMGraphs(dev, i, 1, dchars, cg); + dloss += as_scalar(cg.forward(loss_expr)); + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } + } + delete sgd; +} + diff --git a/examples/rnnlm-batch.cc b/examples/rnnlm-batch/train_rnnlm-batch.cc~ similarity index 100% rename from examples/rnnlm-batch.cc rename to examples/rnnlm-batch/train_rnnlm-batch.cc~ diff --git a/examples/rnnlm-cfsm.cc b/examples/rnnlm-cfsm/train_rnnlm-cfsm.cc similarity index 99% rename from examples/rnnlm-cfsm.cc rename to examples/rnnlm-cfsm/train_rnnlm-cfsm.cc index c48f13b95..05179d56f 100644 --- a/examples/rnnlm-cfsm.cc +++ b/examples/rnnlm-cfsm/train_rnnlm-cfsm.cc @@ -8,7 +8,7 @@ #include "dynet/dict.h" #include "dynet/expr.h" #include "dynet/cfsm-builder.h" -#include "getpid.h" +#include "../utils/getpid.h" #include #include diff --git a/examples/rnnlm-final-batch.cc~ b/examples/rnnlm-final-batch.cc~ new file mode 100644 index 000000000..ea4ea2445 --- /dev/null +++ b/examples/rnnlm-final-batch.cc~ @@ -0,0 +1,264 @@ +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" +#include "getpid.h" + +#include +#include +#include +#include + +#include +#include + +using namespace std; +using namespace dynet; + +unsigned LAYERS = 2; +unsigned INPUT_DIM = 8; //256 +unsigned HIDDEN_DIM = 24; // 1024 +unsigned BATCH_SIZE = 4; +unsigned VOCAB_SIZE = 0; + +dynet::Dict d; +int kSOS; +int kEOS; + +template +struct RNNLanguageModel { + LookupParameter p_c; + Parameter p_R; + Parameter p_bias; + Parameter p_last; + Parameter p_last_bias; + Builder builder; + explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({VOCAB_SIZE}); + p_last = model.add_parameters({1, LAYERS * HIDDEN_DIM}); + p_last_bias = model.add_parameters({1}); + } + + // return Expression of total loss + Expression BuildLMGraphs(const vector >& sents, + unsigned id, + unsigned bsize, + unsigned & chars, + ComputationGraph& cg) { + const unsigned slen = sents[id].size(); + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter + Expression i_bias = parameter(cg, p_bias); // word bias + vector errs; + vector last_arr(bsize, sents[0][0]), next_arr(bsize); + for (unsigned t = 1; t < slen; ++t) { + for (unsigned i = 0; i < bsize; ++i) { + next_arr[i] = sents[id + i][t]; + if (next_arr[i] != *sents[id].rbegin()) chars++; // add non-EOS + } + // y_t = RNN(x_t) + Expression i_x_t = lookup(cg, p_c, last_arr); + Expression i_y_t = builder.add_input(i_x_t); + // Expression i_r_t = i_bias + i_R * i_y_t; + // Expression i_err = pickneglogsoftmax(i_r_t, next_arr); + // errs.push_back(i_err); + last_arr = next_arr; + } + Expression i_last = parameter(cg, p_last); + Expression i_last_bias = parameter(cg, p_last_bias); + + Expression last_h = builder.final_h(); + Expression err = i_last_bias + i_last * last_h; + Expression i_nerr = sum_batches(err); + return i_nerr; + } + + // return Expression for total loss + void RandomSample(int max_len = 150) { + cerr << endl; + ComputationGraph cg; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + + Expression i_R = parameter(cg, p_R); + Expression i_bias = parameter(cg, p_bias); + vector errs; + int len = 0; + int cur = kSOS; + while (len < max_len && cur != kEOS) { + ++len; + Expression i_x_t = lookup(cg, p_c, cur); + // y_t = RNN(x_t) + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + + Expression ydist = softmax(i_r_t); + + unsigned w = 0; + while (w == 0 || (int)w == kSOS) { + auto dist = as_vector(cg.incremental_forward(ydist)); + double p = rand01(); + for (; w < dist.size(); ++w) { + p -= dist[w]; + if (p < 0.0) { break; } + } + if (w == dist.size()) w = kEOS; + } + cerr << (len == 1 ? "" : " ") << d.convert(w); + cur = w; + } + cerr << endl; + } +}; + +// Sort in descending order of length +struct CompareLen { + bool operator()(const std::vector& first, const std::vector& second) { + return first.size() > second.size(); + } +}; + +int main(int argc, char** argv) { + dynet::initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.convert(""); + kEOS = d.convert(""); + vector> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while (getline(in, line)) { + ++tlc; + training.push_back(read_sentence(line, &d)); + ttoks += training.back().size(); + if (training.back().front() != kSOS && training.back().back() != kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + d.freeze(); // no new word types allowed + VOCAB_SIZE = d.size(); + + // Sort the training sentences in descending order of length + CompareLen comp; + sort(training.begin(), training.end(), comp); + // Pad the sentences in the same batch with EOS so they are the same length + // This modifies the training objective a bit by making it necessary to + // predict EOS multiple times, but it's easy and not so harmful + for (size_t i = 0; i < training.size(); i += BATCH_SIZE) + for (size_t j = 1; j < BATCH_SIZE; ++j) + while (training[i + j].size() < training[i].size()) + training[i + j].push_back(kEOS); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while (getline(in, line)) { + ++dlc; + dev.push_back(read_sentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() != kSOS && dev.back().back() != kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + + ostringstream os; + os << "lm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + Trainer* sgd = nullptr; + sgd = new SimpleSGDTrainer(&model); + sgd->clip_threshold *= BATCH_SIZE; + + RNNLanguageModel lm(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 500; + vector order((training.size() + BATCH_SIZE - 1) / BATCH_SIZE); + unsigned si = order.size(); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i * BATCH_SIZE; + bool first = true; + int report = 0; + unsigned lines = 0; + while (1) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i, ++si) { + if (si == order.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + // build graph for this instance + ComputationGraph cg; + unsigned bsize = std::min((unsigned)training.size() - order[si], BATCH_SIZE); // Batch size + Expression loss_expr = lm.BuildLMGraphs(training, order[si], bsize, chars, cg); + loss += as_scalar(cg.forward(loss_expr)); + cg.backward(loss_expr); + sgd->update(); + lines += bsize; + } + sgd->status(); + cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + lm.RandomSample(); + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + unsigned dchars = 0; + for (unsigned i = 0; i < dev.size(); ++i) { + ComputationGraph cg; + Expression loss_expr = lm.BuildLMGraphs(dev, i, 1, dchars, cg); + dloss += as_scalar(cg.forward(loss_expr)); + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } + } + delete sgd; +} + diff --git a/examples/rnnlm-final-batch/train_rnnlm-final-batch.cc b/examples/rnnlm-final-batch/train_rnnlm-final-batch.cc new file mode 100644 index 000000000..a7a53ece3 --- /dev/null +++ b/examples/rnnlm-final-batch/train_rnnlm-final-batch.cc @@ -0,0 +1,264 @@ +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" +#include "../utils/getpid.h" + +#include +#include +#include +#include + +#include +#include + +using namespace std; +using namespace dynet; + +unsigned LAYERS = 2; +unsigned INPUT_DIM = 8; //256 +unsigned HIDDEN_DIM = 24; // 1024 +unsigned BATCH_SIZE = 4; +unsigned VOCAB_SIZE = 0; + +dynet::Dict d; +int kSOS; +int kEOS; + +template +struct RNNLanguageModel { + LookupParameter p_c; + Parameter p_R; + Parameter p_bias; + Parameter p_last; + Parameter p_last_bias; + Builder builder; + explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({VOCAB_SIZE}); + p_last = model.add_parameters({1, LAYERS * HIDDEN_DIM}); + p_last_bias = model.add_parameters({1}); + } + + // return Expression of total loss + Expression BuildLMGraphs(const vector >& sents, + unsigned id, + unsigned bsize, + unsigned & chars, + ComputationGraph& cg) { + const unsigned slen = sents[id].size(); + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter + Expression i_bias = parameter(cg, p_bias); // word bias + vector errs; + vector last_arr(bsize, sents[0][0]), next_arr(bsize); + for (unsigned t = 1; t < slen; ++t) { + for (unsigned i = 0; i < bsize; ++i) { + next_arr[i] = sents[id + i][t]; + if (next_arr[i] != *sents[id].rbegin()) chars++; // add non-EOS + } + // y_t = RNN(x_t) + Expression i_x_t = lookup(cg, p_c, last_arr); + Expression i_y_t = builder.add_input(i_x_t); + // Expression i_r_t = i_bias + i_R * i_y_t; + // Expression i_err = pickneglogsoftmax(i_r_t, next_arr); + // errs.push_back(i_err); + last_arr = next_arr; + } + Expression i_last = parameter(cg, p_last); + Expression i_last_bias = parameter(cg, p_last_bias); + + Expression last_h = builder.final_h(); + Expression err = i_last_bias + i_last * last_h; + Expression i_nerr = sum_batches(err); + return i_nerr; + } + + // return Expression for total loss + void RandomSample(int max_len = 150) { + cerr << endl; + ComputationGraph cg; + builder.new_graph(cg); // reset RNN builder for new graph + builder.start_new_sequence(); + + Expression i_R = parameter(cg, p_R); + Expression i_bias = parameter(cg, p_bias); + vector errs; + int len = 0; + int cur = kSOS; + while (len < max_len && cur != kEOS) { + ++len; + Expression i_x_t = lookup(cg, p_c, cur); + // y_t = RNN(x_t) + Expression i_y_t = builder.add_input(i_x_t); + Expression i_r_t = i_bias + i_R * i_y_t; + + Expression ydist = softmax(i_r_t); + + unsigned w = 0; + while (w == 0 || (int)w == kSOS) { + auto dist = as_vector(cg.incremental_forward(ydist)); + double p = rand01(); + for (; w < dist.size(); ++w) { + p -= dist[w]; + if (p < 0.0) { break; } + } + if (w == dist.size()) w = kEOS; + } + cerr << (len == 1 ? "" : " ") << d.convert(w); + cur = w; + } + cerr << endl; + } +}; + +// Sort in descending order of length +struct CompareLen { + bool operator()(const std::vector& first, const std::vector& second) { + return first.size() > second.size(); + } +}; + +int main(int argc, char** argv) { + dynet::initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.convert(""); + kEOS = d.convert(""); + vector> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while (getline(in, line)) { + ++tlc; + training.push_back(read_sentence(line, &d)); + ttoks += training.back().size(); + if (training.back().front() != kSOS && training.back().back() != kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + d.freeze(); // no new word types allowed + VOCAB_SIZE = d.size(); + + // Sort the training sentences in descending order of length + CompareLen comp; + sort(training.begin(), training.end(), comp); + // Pad the sentences in the same batch with EOS so they are the same length + // This modifies the training objective a bit by making it necessary to + // predict EOS multiple times, but it's easy and not so harmful + for (size_t i = 0; i < training.size(); i += BATCH_SIZE) + for (size_t j = 1; j < BATCH_SIZE; ++j) + while (training[i + j].size() < training[i].size()) + training[i + j].push_back(kEOS); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while (getline(in, line)) { + ++dlc; + dev.push_back(read_sentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() != kSOS && dev.back().back() != kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + + ostringstream os; + os << "lm" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + Trainer* sgd = nullptr; + sgd = new SimpleSGDTrainer(&model); + sgd->clip_threshold *= BATCH_SIZE; + + RNNLanguageModel lm(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 500; + vector order((training.size() + BATCH_SIZE - 1) / BATCH_SIZE); + unsigned si = order.size(); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i * BATCH_SIZE; + bool first = true; + int report = 0; + unsigned lines = 0; + while (1) { + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i, ++si) { + if (si == order.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + // build graph for this instance + ComputationGraph cg; + unsigned bsize = std::min((unsigned)training.size() - order[si], BATCH_SIZE); // Batch size + Expression loss_expr = lm.BuildLMGraphs(training, order[si], bsize, chars, cg); + loss += as_scalar(cg.forward(loss_expr)); + cg.backward(loss_expr); + sgd->update(); + lines += bsize; + } + sgd->status(); + cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + lm.RandomSample(); + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + unsigned dchars = 0; + for (unsigned i = 0; i < dev.size(); ++i) { + ComputationGraph cg; + Expression loss_expr = lm.BuildLMGraphs(dev, i, 1, dchars, cg); + dloss += as_scalar(cg.forward(loss_expr)); + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } + } + delete sgd; +} + diff --git a/examples/rnnlm-givenbag.cc b/examples/rnnlm-givenbag/rnnlm-givenbag.cc similarity index 99% rename from examples/rnnlm-givenbag.cc rename to examples/rnnlm-givenbag/rnnlm-givenbag.cc index e28d6e89d..53283d1ea 100644 --- a/examples/rnnlm-givenbag.cc +++ b/examples/rnnlm-givenbag/rnnlm-givenbag.cc @@ -6,9 +6,9 @@ #include "dynet/gru.h" #include "dynet/lstm.h" #include "dynet/dict.h" -# include "dynet/expr.h" +#include "dynet/expr.h" #include "dynet/grad-check.h" -#include "getpid.h" +#include "../utils/getpid.h" #include #include diff --git a/examples/rnnlm.h b/examples/rnnlm-mp/rnnlm.h similarity index 100% rename from examples/rnnlm.h rename to examples/rnnlm-mp/rnnlm.h diff --git a/examples/rnnlm-mp.cc b/examples/rnnlm-mp/train_rnnlm-mp.cc similarity index 100% rename from examples/rnnlm-mp.cc rename to examples/rnnlm-mp/train_rnnlm-mp.cc diff --git a/examples/rnnlm.cc b/examples/rnnlm/train_rnnlm.cc similarity index 99% rename from examples/rnnlm.cc rename to examples/rnnlm/train_rnnlm.cc index 29be8e4bb..9750b7309 100644 --- a/examples/rnnlm.cc +++ b/examples/rnnlm/train_rnnlm.cc @@ -7,7 +7,7 @@ #include "dynet/lstm.h" #include "dynet/dict.h" #include "dynet/expr.h" -#include "getpid.h" +#include "../utils/getpid.h" #include #include diff --git a/examples/segrnn-sup.cc b/examples/segrnn-sup/train_segrnn-sup.cc similarity index 100% rename from examples/segrnn-sup.cc rename to examples/segrnn-sup/train_segrnn-sup.cc diff --git a/examples/skiprnnlm.cc b/examples/skiprnnlm/train_skiprnnlm.cc similarity index 100% rename from examples/skiprnnlm.cc rename to examples/skiprnnlm/train_skiprnnlm.cc diff --git a/examples/tag-bilstm/train_tag-bilstm.cc b/examples/tag-bilstm/train_tag-bilstm.cc new file mode 100644 index 000000000..bbe6899b9 --- /dev/null +++ b/examples/tag-bilstm/train_tag-bilstm.cc @@ -0,0 +1,261 @@ +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" +#include "../utils/getpid.h" + +#include +#include +#include + +#include +#include + +using namespace std; +using namespace dynet; + +float pdrop = 0.5; +unsigned LAYERS = 1; +unsigned INPUT_DIM = 128; +unsigned HIDDEN_DIM = 128; +unsigned TAG_HIDDEN_DIM = 32; +unsigned TAG_DIM = 32; +unsigned TAG_SIZE = 0; +unsigned VOCAB_SIZE = 0; + +bool eval = false; +dynet::Dict d; +dynet::Dict td; +int kNONE; +int kSOS; +int kEOS; + +template +struct RNNLanguageModel { + LookupParameter p_w; + Parameter p_l2th; + Parameter p_r2th; + Parameter p_thbias; + + Parameter p_th2t; + Parameter p_tbias; + Builder l2rbuilder; + Builder r2lbuilder; + explicit RNNLanguageModel(Model& model) : + l2rbuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), + r2lbuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + p_w = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_l2th = model.add_parameters({TAG_HIDDEN_DIM, HIDDEN_DIM}); + p_r2th = model.add_parameters({TAG_HIDDEN_DIM, HIDDEN_DIM}); + p_thbias = model.add_parameters({TAG_HIDDEN_DIM}); + + p_th2t = model.add_parameters({TAG_SIZE, TAG_HIDDEN_DIM}); + p_tbias = model.add_parameters({TAG_SIZE}); + } + + // return Expression of total loss + Expression BuildTaggingGraph(const vector& sent, const vector& tags, ComputationGraph& cg, double* cor = 0, unsigned* ntagged = 0) { + const unsigned slen = sent.size(); + l2rbuilder.new_graph(cg); // reset RNN builder for new graph + l2rbuilder.start_new_sequence(); + r2lbuilder.new_graph(cg); // reset RNN builder for new graph + r2lbuilder.start_new_sequence(); + Expression i_l2th = parameter(cg, p_l2th); + Expression i_r2th = parameter(cg, p_r2th); + Expression i_thbias = parameter(cg, p_thbias); + Expression i_th2t = parameter(cg, p_th2t); + Expression i_tbias = parameter(cg, p_tbias); + vector errs; + vector i_words(slen); + vector fwds(slen); + vector revs(slen); + + // read sequence from left to right + l2rbuilder.add_input(lookup(cg, p_w, kSOS)); + for (unsigned t = 0; t < slen; ++t) { + i_words[t] = lookup(cg, p_w, sent[t]); + if (!eval) { i_words[t] = noise(i_words[t], 0.1); } + fwds[t] = l2rbuilder.add_input(i_words[t]); + } + + // read sequence from right to left + r2lbuilder.add_input(lookup(cg, p_w, kEOS)); + for (unsigned t = 0; t < slen; ++t) + revs[slen - t - 1] = r2lbuilder.add_input(i_words[slen - t - 1]); + + for (unsigned t = 0; t < slen; ++t) { + if (tags[t] != kNONE) { + if (ntagged) (*ntagged)++; + Expression i_th = tanh(affine_transform({i_thbias, i_l2th, fwds[t], i_r2th, revs[t]})); + //if (!eval) { i_th = dropout(i_th, pdrop); } + Expression i_t = affine_transform({i_tbias, i_th2t, i_th}); + if (cor) { + vector dist = as_vector(cg.incremental_forward(i_t)); + double best = -9e99; + int besti = -1; + for (int i = 0; i < dist.size(); ++i) { + if (dist[i] > best) { best = dist[i]; besti = i; } + } + if (tags[t] == besti) (*cor)++; + } + if (tags[t] != kNONE) { + Expression i_err = pickneglogsoftmax(i_t, tags[t]); + errs.push_back(i_err); + } + } + } + return sum(errs); + } +}; + +int main(int argc, char** argv) { + dynet::initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kNONE = td.convert("*"); + kSOS = d.convert(""); + kEOS = d.convert(""); + vector,vector>> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + int nc = 0; + vector x,y; + read_sentence_pair(line, &x, &d, &y, &td); + assert(x.size() == y.size()); + if (x.size() == 0) { cerr << line << endl; abort(); } + training.push_back(make_pair(x,y)); + for (unsigned i = 0; i < y.size(); ++i) { + if (y[i] != kNONE) { ++nc; } + } + if (nc == 0) { + cerr << "No tagged tokens in line " << tlc << endl; + abort(); + } + ttoks += x.size(); + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + cerr << "Tags: " << td.size() << endl; + } + d.freeze(); // no new word types allowed + td.freeze(); // no new tag types allowed + VOCAB_SIZE = d.size(); + TAG_SIZE = td.size(); + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + ++dlc; + vector x,y; + read_sentence_pair(line, &x, &d, &y, &td); + assert(x.size() == y.size()); + dev.push_back(make_pair(x,y)); + dtoks += x.size(); + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + ostringstream os; + os << "tagger" + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + bool use_momentum = true; + Trainer* sgd = nullptr; + if (use_momentum) + sgd = new MomentumSGDTrainer(&model); + else + sgd = new SimpleSGDTrainer(&model); + + RNNLanguageModel lm(model); + //RNNLanguageModel lm(model); + if (argc == 4) { + string fname = argv[3]; + ifstream in(fname); + boost::archive::text_iarchive ia(in); + ia >> model; + } + + unsigned report_every_i = 50; + unsigned dev_every_i_reports = 25; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned ttags = 0; + double correct = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& sent = training[order[si]]; + ++si; + Expression loss_expr = lm.BuildTaggingGraph(sent.first, sent.second, cg, &correct, &ttags); + loss += as_scalar(cg.forward(loss_expr)); + cg.backward(loss_expr); + sgd->update(1.0); + ++lines; + } + sgd->status(); + cerr << " E = " << (loss / ttags) << " ppl=" << exp(loss / ttags) << " (acc=" << (correct / ttags) << ") "; + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + unsigned dtags = 0; + double dcorr = 0; + eval = true; + //lm.p_th2t->scale_parameters(pdrop); + for (auto& sent : dev) { + ComputationGraph cg; + Expression loss_expr = lm.BuildTaggingGraph(sent.first, sent.second, cg, &dcorr, &dtags); + dloss += as_scalar(cg.forward(loss_expr)); + } + //lm.p_th2t->scale_parameters(1/pdrop); + eval = false; + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dtags) << " ppl=" << exp(dloss / dtags) << " acc=" << (dcorr / dtags) << ' '; + } + } + delete sgd; +} + diff --git a/examples/tag-bilstm.cc b/examples/tag-bilstm/train_tag-bilstm.cc~ similarity index 100% rename from examples/tag-bilstm.cc rename to examples/tag-bilstm/train_tag-bilstm.cc~ diff --git a/examples/textcat.cc b/examples/textcat.cc~ similarity index 100% rename from examples/textcat.cc rename to examples/textcat.cc~ diff --git a/examples/textcat/train_textcat.cc b/examples/textcat/train_textcat.cc new file mode 100644 index 000000000..3005b8215 --- /dev/null +++ b/examples/textcat/train_textcat.cc @@ -0,0 +1,317 @@ +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" +#include "../utils/getpid.h" + +#include +#include + +#include +#include + +using namespace std; +using namespace dynet; + +unsigned INPUT_DIM = 36; +unsigned OUTPUT_DIM = 36; +unsigned VOCAB_SIZE = 0; +unsigned LABEL_SIZE = 0; +float pdropout = 0.5; + +dynet::Dict d; +dynet::Dict ld; +int kSOS; +int kEOS; + +struct NeuralBagOfWords { + LookupParameter p_w; + Parameter p_c2h; + Parameter p_hbias; + Parameter p_h2o; + Parameter p_obias; + + explicit NeuralBagOfWords(Model& m) : + p_w(m.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), + p_c2h(m.add_parameters({OUTPUT_DIM, INPUT_DIM})), + p_hbias(m.add_parameters({OUTPUT_DIM})), + p_h2o(m.add_parameters({LABEL_SIZE, OUTPUT_DIM})), + p_obias(m.add_parameters({LABEL_SIZE})) {} + + Expression BuildClassifier(const vector& x, ComputationGraph& cg) { + Expression c2h = parameter(cg, p_c2h); + Expression hbias = parameter(cg, p_hbias); + Expression h2o = parameter(cg, p_h2o); + Expression obias = parameter(cg, p_obias); + + vector vx(x.size()); + for (unsigned i = 0; i < x.size(); ++i) + vx[i] = lookup(cg, p_w, x[i]); + Expression c = sum(vx); + Expression h = rectify(c2h * c / x.size() + hbias); + Expression y_pred = obias + h2o * h; + return y_pred; + } +}; + +struct ConvLayer { + // in_rows = rows per word in input matrix + // k_fold_rows = 1 no folding, 2 fold two rows together, 3 ... + // filter_width = length of filter (columns) + // in_nfmaps = number of feature maps in input + // out_nfmaps = number of feature maps in output + ConvLayer(Model&m, int in_rows, int k_fold_rows, int filter_width, int in_nfmaps, int out_nfmaps) : + p_filts(in_nfmaps), + p_fbias(in_nfmaps), + k_fold_rows(k_fold_rows) { + if (k_fold_rows < 1 || ((in_rows / k_fold_rows) * k_fold_rows != in_rows)) { + cerr << "Bad k_fold_rows=" << k_fold_rows << endl; + abort(); + } + for (int i = 0; i < in_nfmaps; ++i) { + p_filts[i].resize(out_nfmaps); + p_fbias[i].resize(out_nfmaps); + for (int j = 0; j < out_nfmaps; ++j) { + p_filts[i][j] = m.add_parameters({(unsigned)in_rows, (unsigned)filter_width}, 0.01); + p_fbias[i][j] = m.add_parameters({(unsigned)in_rows}, 0.05); + } + } + //for (int j = 0; j < out_nfmaps; ++j) + //p_fbias[j] = m.add_parameters({in_rows}); + } + + vector apply(ComputationGraph& cg, const vector& inlayer, int k_out) const { + const unsigned out_nfmaps = p_filts.front().size(); + const unsigned in_nfmaps = p_filts.size(); + if (in_nfmaps != inlayer.size()) { + cerr << "Mismatched number of input features (" << inlayer.size() << "), expected " << in_nfmaps << endl; + abort(); + } + vector r(out_nfmaps); + + vector tmp(in_nfmaps); + for (unsigned fj = 0; fj < out_nfmaps; ++fj) { + for (unsigned fi = 0; fi < in_nfmaps; ++fi) { + Expression t = conv1d_wide(inlayer[fi], parameter(cg, p_filts[fi][fj])); + t = colwise_add(t, parameter(cg, p_fbias[fi][fj])); + tmp[fi] = t; + } + Expression s = sum(tmp); + if (k_fold_rows > 1) + s = fold_rows(s, k_fold_rows); + s = kmax_pooling(s, k_out); + r[fj] = rectify(s); + } + return r; + } + vector> p_filts; // [feature map index from][feature map index to] + vector> p_fbias; // [feature map index from][feature map index to] + int k_fold_rows; +}; + +struct ConvNet { + LookupParameter p_w; + ConvLayer cl1; + ConvLayer cl2; + Parameter p_t2o; + Parameter p_obias; + + explicit ConvNet(Model& m) : + p_w(m.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), + //ConvLayer(Model&m, int in_rows, int k_fold_rows, int filter_width, int in_nfmaps, int out_nfmaps) : + cl1(m, INPUT_DIM, 2, 10, 1, 6), + cl2(m, INPUT_DIM/2, 2, 6, 6, 14), + p_t2o(m.add_parameters({LABEL_SIZE, 14 * (INPUT_DIM / 4) * 5})), + p_obias(m.add_parameters({LABEL_SIZE})) { + } + + Expression BuildClassifier(const vector& x, ComputationGraph& cg, bool for_training) { + Expression t2o = parameter(cg, p_t2o); + Expression obias = parameter(cg, p_obias); + int k_2 = 5; + int len = x.size(); + int k_1 = max(k_2, len / 2); + vector vx(x.size()); + for (unsigned i = 0; i < x.size(); ++i) + vx[i] = lookup(cg, p_w, x[i]); + Expression s = concatenate_cols(vx); + + vector l0(1, s); + vector l1 = cl1.apply(cg, l0, k_1); + vector l2 = cl2.apply(cg, l1, k_2); + for(auto& fm : l2) + fm = reshape(fm, {k_2 * INPUT_DIM / 4}); + Expression t = concatenate(l2); + if (for_training) + t = dropout(t, pdropout); + Expression r = t2o * t + obias; + return r; + } +}; + +bool IsCurrentPredictionCorrection(Expression y_pred, int y_true) { + ComputationGraph& cg = *y_pred.pg; + auto v = as_vector(cg.incremental_forward(y_pred)); + assert(v.size() > 1); + int besti = 0; + float best = v[0]; + for (unsigned i = 1; i < v.size(); ++i) + if (v[i] > best) { best = v[i]; besti = i; } + return (besti == y_true); +} + +Expression CrossEntropyLoss(const Expression& y_pred, int y_true) { + Expression lp = log_softmax(y_pred); + Expression nll = -pick(lp, y_true); + return nll; +} + +Expression HingeLoss(const Expression& y_pred, int y_true) { + Expression hl = hinge(y_pred, y_true, 10.0f); + return hl; +} + +int main(int argc, char** argv) { + dynet::initialize(argc, argv); + if (argc != 3 && argc != 4) { + cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; + return 1; + } + kSOS = d.convert(""); + kEOS = d.convert(""); + vector,int>> training, dev; + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << argv[1] << "...\n"; + { + ifstream in(argv[1]); + assert(in); + while(getline(in, line)) { + ++tlc; + vector x,y; + read_sentence_pair(line, &x, &d, &y, &ld); + if (x.size() == 0 || y.size() != 1) { cerr << line << endl; abort(); } + training.push_back(make_pair(x,y[0])); + ttoks += x.size(); + } + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + cerr << "Labels: " << ld.size() << endl; + } + LABEL_SIZE = ld.size(); + //d.freeze(); // no new word types allowed + ld.freeze(); // no new tag types allowed + + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << argv[2] << "...\n"; + { + ifstream in(argv[2]); + assert(in); + while(getline(in, line)) { + ++dlc; + vector x,y; + read_sentence_pair(line, &x, &d, &y, &ld); + assert(y.size() == 1); + dev.push_back(make_pair(x,y[0])); + dtoks += x.size(); + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + VOCAB_SIZE = d.size(); + ostringstream os; + os << "textcat" + << '_' << INPUT_DIM + << '_' << OUTPUT_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + + Model model; + Trainer* sgd = nullptr; + //sgd = new MomentumSGDTrainer(&model); + sgd = new AdagradTrainer(&model); + //sgd = new SimpleSGDTrainer(&model); + + //NeuralBagOfWords nbow(model); + ConvNet nbow(model); + + unsigned report_every_i = min(100, int(training.size())); + unsigned dev_every_i_reports = 25; + unsigned si = training.size(); + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + unsigned lines = 0; + while(1) { + Timer iteration("completed in"); + double loss = 0; + unsigned ttags = 0; + unsigned correct = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& sentx_y = training[order[si]]; + const auto& x = sentx_y.first; + const int y = sentx_y.second; + ++si; + //cerr << "LINE: " << order[si] << endl; + Expression y_pred = nbow.BuildClassifier(x, cg, true); + //Expression loss_expr = CrossEntropyLoss(y_pred, y); + Expression loss_expr = HingeLoss(y_pred, y); + loss += as_scalar(cg.forward(loss_expr)); + cg.backward(loss_expr); + sgd->update(2.0); + ++lines; + ++ttags; + } + sgd->status(); + cerr << " E = " << (loss / ttags) << " ppl=" << exp(loss / ttags) << " (acc=" << (correct / (double)ttags) << ") "; + model.project_weights(); + + // show score on dev data? + report++; + if (report % dev_every_i_reports == 0) { + double dloss = 0; + unsigned dtags = 0; + unsigned dcorr = 0; + for (auto& sent : dev) { + const auto& x = sent.first; + const int y = sent.second; + nbow.p_t2o.get()->scale_parameters(pdropout); + ComputationGraph cg; + Expression y_pred = nbow.BuildClassifier(x, cg, false); + if (IsCurrentPredictionCorrection(y_pred, y)) dcorr++; + //Expression loss_expr = CrossEntropyLoss(y_pred, y); + Expression loss_expr = HingeLoss(y_pred, y); + //cerr << "DEVLINE: " << dtags << endl; + dloss += as_scalar(cg.incremental_forward(loss_expr)); + nbow.p_t2o.get()->scale_parameters(1.f/pdropout); + dtags++; + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dtags) << " ppl=" << exp(dloss / dtags) << " acc=" << (dcorr / (double)dtags) << ' '; + } + } + delete sgd; +} + diff --git a/examples/tok-embed.cc b/examples/tok-embed/train_tok-embed.cc similarity index 100% rename from examples/tok-embed.cc rename to examples/tok-embed/train_tok-embed.cc diff --git a/examples/xor-batch-lookup.cc b/examples/xor-batch-lookup/train_xor-batch-lookup.cc similarity index 100% rename from examples/xor-batch-lookup.cc rename to examples/xor-batch-lookup/train_xor-batch-lookup.cc diff --git a/examples/xor-batch.cc b/examples/xor-batch/train_xor-batch.cc similarity index 100% rename from examples/xor-batch.cc rename to examples/xor-batch/train_xor-batch.cc diff --git a/examples/xor-mp.cc b/examples/xor-mp/train_xor-mp.cc similarity index 100% rename from examples/xor-mp.cc rename to examples/xor-mp/train_xor-mp.cc diff --git a/examples/xor-xent.cc b/examples/xor-xent/train_xor-xent.cc similarity index 100% rename from examples/xor-xent.cc rename to examples/xor-xent/train_xor-xent.cc diff --git a/examples/xor.cc b/examples/xor/train_xor.cc similarity index 100% rename from examples/xor.cc rename to examples/xor/train_xor.cc From 6fbdef805cc0a4752e68176be75fc01f5c5e3353 Mon Sep 17 00:00:00 2001 From: paul Date: Mon, 5 Dec 2016 17:49:40 -0500 Subject: [PATCH 864/965] Mutualize python and C++ examples --- .../attention}/attention.py | 0 .../cpu_vs_gpu}/cpu_vs_gpu.py | 0 .../minibatch}/minibatch.py | 0 {pyexamples => examples/rnnlm}/rnnlm.py | 0 .../rnnlm}/rnnlm_transduce.py | 0 {pyexamples => examples/rnnlm}/util.py | 0 .../tag-bilstm}/bilstmtagger.py | 0 examples/tag-bilstm/util.py | 36 +++++++++++++++++++ {pyexamples => examples}/tutorials/API.ipynb | 0 {pyexamples => examples}/tutorials/RNNs.ipynb | 0 .../tutorials/tutorial-1-xor.ipynb | 0 .../viz_birnn}/viz_birnn.py | 0 {pyexamples => examples/xor}/xor.py | 0 13 files changed, 36 insertions(+) rename {pyexamples => examples/attention}/attention.py (100%) rename {pyexamples => examples/cpu_vs_gpu}/cpu_vs_gpu.py (100%) rename {pyexamples => examples/minibatch}/minibatch.py (100%) rename {pyexamples => examples/rnnlm}/rnnlm.py (100%) rename {pyexamples => examples/rnnlm}/rnnlm_transduce.py (100%) rename {pyexamples => examples/rnnlm}/util.py (100%) rename {pyexamples => examples/tag-bilstm}/bilstmtagger.py (100%) create mode 100644 examples/tag-bilstm/util.py rename {pyexamples => examples}/tutorials/API.ipynb (100%) rename {pyexamples => examples}/tutorials/RNNs.ipynb (100%) rename {pyexamples => examples}/tutorials/tutorial-1-xor.ipynb (100%) rename {pyexamples => examples/viz_birnn}/viz_birnn.py (100%) rename {pyexamples => examples/xor}/xor.py (100%) diff --git a/pyexamples/attention.py b/examples/attention/attention.py similarity index 100% rename from pyexamples/attention.py rename to examples/attention/attention.py diff --git a/pyexamples/cpu_vs_gpu.py b/examples/cpu_vs_gpu/cpu_vs_gpu.py similarity index 100% rename from pyexamples/cpu_vs_gpu.py rename to examples/cpu_vs_gpu/cpu_vs_gpu.py diff --git a/pyexamples/minibatch.py b/examples/minibatch/minibatch.py similarity index 100% rename from pyexamples/minibatch.py rename to examples/minibatch/minibatch.py diff --git a/pyexamples/rnnlm.py b/examples/rnnlm/rnnlm.py similarity index 100% rename from pyexamples/rnnlm.py rename to examples/rnnlm/rnnlm.py diff --git a/pyexamples/rnnlm_transduce.py b/examples/rnnlm/rnnlm_transduce.py similarity index 100% rename from pyexamples/rnnlm_transduce.py rename to examples/rnnlm/rnnlm_transduce.py diff --git a/pyexamples/util.py b/examples/rnnlm/util.py similarity index 100% rename from pyexamples/util.py rename to examples/rnnlm/util.py diff --git a/pyexamples/bilstmtagger.py b/examples/tag-bilstm/bilstmtagger.py similarity index 100% rename from pyexamples/bilstmtagger.py rename to examples/tag-bilstm/bilstmtagger.py diff --git a/examples/tag-bilstm/util.py b/examples/tag-bilstm/util.py new file mode 100644 index 000000000..f3ac0c425 --- /dev/null +++ b/examples/tag-bilstm/util.py @@ -0,0 +1,36 @@ +from collections import defaultdict +from itertools import count +class Vocab: + def __init__(self, w2i=None): + if w2i is None: w2i = defaultdict(count(0).next) + self.w2i = dict(w2i) + self.i2w = {i:w for w,i in w2i.iteritems()} + @classmethod + def from_corpus(cls, corpus): + w2i = defaultdict(count(0).next) + for sent in corpus: + [w2i[word] for word in sent] + return Vocab(w2i) + + def size(self): return len(self.w2i.keys()) + +class CorpusReader: + def __init__(self, fname): + self.fname = fname + def __iter__(self): + for line in file(self.fname): + line = line.strip().split() + #line = [' ' if x == '' else x for x in line] + yield line + +class CharsCorpusReader: + def __init__(self, fname, begin=None): + self.fname = fname + self.begin = begin + def __iter__(self): + begin = self.begin + for line in file(self.fname): + line = list(line) + if begin: + line = [begin] + line + yield line diff --git a/pyexamples/tutorials/API.ipynb b/examples/tutorials/API.ipynb similarity index 100% rename from pyexamples/tutorials/API.ipynb rename to examples/tutorials/API.ipynb diff --git a/pyexamples/tutorials/RNNs.ipynb b/examples/tutorials/RNNs.ipynb similarity index 100% rename from pyexamples/tutorials/RNNs.ipynb rename to examples/tutorials/RNNs.ipynb diff --git a/pyexamples/tutorials/tutorial-1-xor.ipynb b/examples/tutorials/tutorial-1-xor.ipynb similarity index 100% rename from pyexamples/tutorials/tutorial-1-xor.ipynb rename to examples/tutorials/tutorial-1-xor.ipynb diff --git a/pyexamples/viz_birnn.py b/examples/viz_birnn/viz_birnn.py similarity index 100% rename from pyexamples/viz_birnn.py rename to examples/viz_birnn/viz_birnn.py diff --git a/pyexamples/xor.py b/examples/xor/xor.py similarity index 100% rename from pyexamples/xor.py rename to examples/xor/xor.py From d943bcb17dbcbfac0995fa496ae4ff13d750a782 Mon Sep 17 00:00:00 2001 From: Paul Michel Date: Mon, 5 Dec 2016 17:54:14 -0500 Subject: [PATCH 865/965] Add readme to examples --- examples/README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 examples/README.md diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 000000000..9c803f438 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,5 @@ +# Examples for Dynet + +This is a set of common (and less common) models and their implementation in Dynet (C++ and python). + +For now most examples don't have an implementation in both languagesbut we're workong on it From 322adaa0b0ef5dccfc9963cad8b48614ade14e0e Mon Sep 17 00:00:00 2001 From: paul Date: Mon, 5 Dec 2016 17:55:22 -0500 Subject: [PATCH 866/965] Remove garbage --- examples/poisson-regression.cc~ | 206 --------------------- examples/rnnlm-final-batch.cc~ | 264 -------------------------- examples/textcat.cc~ | 317 -------------------------------- 3 files changed, 787 deletions(-) delete mode 100644 examples/poisson-regression.cc~ delete mode 100644 examples/rnnlm-final-batch.cc~ delete mode 100644 examples/textcat.cc~ diff --git a/examples/poisson-regression.cc~ b/examples/poisson-regression.cc~ deleted file mode 100644 index f4389bc87..000000000 --- a/examples/poisson-regression.cc~ +++ /dev/null @@ -1,206 +0,0 @@ -#include "dynet/grad-check.h" -#include "dynet/nodes.h" -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/timing.h" -#include "dynet/rnn.h" -#include "dynet/gru.h" -#include "dynet/deep-lstm.h" -#include "dynet/lstm.h" -#include "dynet/dict.h" -#include "dynet/expr.h" -#include "getpid.h" - -#include -#include -#include - -#include -#include - -using namespace std; -using namespace dynet; - -unsigned LAYERS = 2; -unsigned INPUT_DIM = 16; //256 -unsigned HIDDEN_DIM = 32; // 1024 -unsigned VOCAB_SIZE = 0; - -dynet::Dict d; -int kSOS; -int kEOS; - -template -struct RNNLengthPredictor { - LookupParameter p_c; - Parameter p_R; - Parameter p_bias; - Builder builder; - explicit RNNLengthPredictor(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { - p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); - p_R = model.add_parameters({1, HIDDEN_DIM}); - p_bias = model.add_parameters({1}); - } - - // return Expression of total loss - Expression BuildLMGraph(const vector& sent, unsigned len, ComputationGraph& cg, bool flag = false) { - const unsigned slen = sent.size() - 1; - builder.new_graph(cg); // reset RNN builder for new graph - builder.start_new_sequence(); - Expression R = parameter(cg, p_R); - Expression bias = parameter(cg, p_bias); - vector errs; - for (unsigned t = 0; t < slen; ++t) { - Expression i_x_t = lookup(cg, p_c, sent[t]); - // y_t = RNN(x_t) - builder.add_input(i_x_t); - } - Expression pred = affine_transform({bias, R, builder.back()}); - if (flag) { - unsigned x = exp(as_scalar(cg.incremental_forward(pred))); - cerr << "PRED=" << x << " TRUE=" << len << "\t(DIFF=" << ((int)x - (int)len) << ")" << endl; - } - return poisson_loss(pred, len); - } -}; - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - if (argc != 3 && argc != 4) { - cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; - return 1; - } - kSOS = d.convert(""); - kEOS = d.convert(""); - vector,unsigned>> training, dev; - string line; - int tlc = 0; - int ttoks = 0; - cerr << "Reading training data from " << argv[1] << "...\n"; - { - Dict td; - ifstream in(argv[1]); - assert(in); - while(getline(in, line)) { - ++tlc; - vector x, ty; - read_sentence_pair(line, &x, &d, &ty, &td); - assert(ty.size() == 1); - const string& v = td.convert(ty[0]); - for(auto c : v) { assert(c >= '0' && c <= '9'); } - unsigned y = atoi(v.c_str()); - training.push_back(make_pair(x,y)); - ttoks += training.back().first.size(); - if (training.back().first.front() != kSOS && training.back().first.back() != kEOS) { - cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; - } - d.freeze(); // no new word types allowed - VOCAB_SIZE = d.size(); - - int dlc = 0; - int dtoks = 0; - cerr << "Reading dev data from " << argv[2] << "...\n"; - { - ifstream in(argv[2]); - assert(in); - Dict td; - while(getline(in, line)) { - ++dlc; - vector x, ty; - read_sentence_pair(line, &x, &d, &ty, &td); - assert(ty.size() == 1); - const string& v = td.convert(ty[0]); - for(auto c : v) { assert(c >= '0' && c <= '9'); } - unsigned y = atoi(v.c_str()); - dev.push_back(make_pair(x,y)); - dtoks += dev.back().first.size(); - if (dev.back().first.front() != kSOS && dev.back().first.back() != kEOS) { - cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << dlc << " lines, " << dtoks << " tokens\n"; - } - ostringstream os; - os << "lm" - << '_' << LAYERS - << '_' << INPUT_DIM - << '_' << HIDDEN_DIM - << "-pid" << getpid() << ".params"; - const string fname = os.str(); - cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; - - Model model; - Trainer* sgd = nullptr; - sgd = new SimpleSGDTrainer(&model); - - RNNLengthPredictor lm(model); - if (argc == 4) { - string fname = argv[3]; - ifstream in(fname); - boost::archive::text_iarchive ia(in); - ia >> model; - } - - unsigned report_every_i = 50; - unsigned dev_every_i_reports = 20; - unsigned si = training.size(); - vector order(training.size()); - for (unsigned i = 0; i < order.size(); ++i) order[i] = i; - bool first = true; - int report = 0; - unsigned lines = 0; - while(1) { - Timer iteration("completed in"); - double loss = 0; - unsigned chars = 0; - for (unsigned i = 0; i < report_every_i; ++i) { - if (si == training.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - shuffle(order.begin(), order.end(), *rndeng); - } - - // build graph for this instance - ComputationGraph cg; - auto& sent = training[order[si]]; - ++si; - Expression loss_expr = lm.BuildLMGraph(sent.first, sent.second, cg); - loss += as_scalar(cg.forward(loss_expr)); - cg.backward(loss_expr); - sgd->update(); - ++lines; - ++chars; - } - sgd->status(); - cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; - - // show score on dev data? - report++; - if (report % dev_every_i_reports == 0) { - double dloss = 0; - int dchars = 0; - for (auto& sent : dev) { - ComputationGraph cg; - Expression loss_expr = lm.BuildLMGraph(sent.first, sent.second, cg, true); - dloss += as_scalar(cg.forward(loss_expr)); - dchars++; - } - if (dloss < best) { - best = dloss; - ofstream out(fname); - boost::archive::text_oarchive oa(out); - oa << model; - } - cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; - } - } - delete sgd; -} - diff --git a/examples/rnnlm-final-batch.cc~ b/examples/rnnlm-final-batch.cc~ deleted file mode 100644 index ea4ea2445..000000000 --- a/examples/rnnlm-final-batch.cc~ +++ /dev/null @@ -1,264 +0,0 @@ -#include "dynet/nodes.h" -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/timing.h" -#include "dynet/rnn.h" -#include "dynet/gru.h" -#include "dynet/lstm.h" -#include "dynet/dict.h" -#include "dynet/expr.h" -#include "getpid.h" - -#include -#include -#include -#include - -#include -#include - -using namespace std; -using namespace dynet; - -unsigned LAYERS = 2; -unsigned INPUT_DIM = 8; //256 -unsigned HIDDEN_DIM = 24; // 1024 -unsigned BATCH_SIZE = 4; -unsigned VOCAB_SIZE = 0; - -dynet::Dict d; -int kSOS; -int kEOS; - -template -struct RNNLanguageModel { - LookupParameter p_c; - Parameter p_R; - Parameter p_bias; - Parameter p_last; - Parameter p_last_bias; - Builder builder; - explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { - p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); - p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); - p_bias = model.add_parameters({VOCAB_SIZE}); - p_last = model.add_parameters({1, LAYERS * HIDDEN_DIM}); - p_last_bias = model.add_parameters({1}); - } - - // return Expression of total loss - Expression BuildLMGraphs(const vector >& sents, - unsigned id, - unsigned bsize, - unsigned & chars, - ComputationGraph& cg) { - const unsigned slen = sents[id].size(); - builder.new_graph(cg); // reset RNN builder for new graph - builder.start_new_sequence(); - Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter - Expression i_bias = parameter(cg, p_bias); // word bias - vector errs; - vector last_arr(bsize, sents[0][0]), next_arr(bsize); - for (unsigned t = 1; t < slen; ++t) { - for (unsigned i = 0; i < bsize; ++i) { - next_arr[i] = sents[id + i][t]; - if (next_arr[i] != *sents[id].rbegin()) chars++; // add non-EOS - } - // y_t = RNN(x_t) - Expression i_x_t = lookup(cg, p_c, last_arr); - Expression i_y_t = builder.add_input(i_x_t); - // Expression i_r_t = i_bias + i_R * i_y_t; - // Expression i_err = pickneglogsoftmax(i_r_t, next_arr); - // errs.push_back(i_err); - last_arr = next_arr; - } - Expression i_last = parameter(cg, p_last); - Expression i_last_bias = parameter(cg, p_last_bias); - - Expression last_h = builder.final_h(); - Expression err = i_last_bias + i_last * last_h; - Expression i_nerr = sum_batches(err); - return i_nerr; - } - - // return Expression for total loss - void RandomSample(int max_len = 150) { - cerr << endl; - ComputationGraph cg; - builder.new_graph(cg); // reset RNN builder for new graph - builder.start_new_sequence(); - - Expression i_R = parameter(cg, p_R); - Expression i_bias = parameter(cg, p_bias); - vector errs; - int len = 0; - int cur = kSOS; - while (len < max_len && cur != kEOS) { - ++len; - Expression i_x_t = lookup(cg, p_c, cur); - // y_t = RNN(x_t) - Expression i_y_t = builder.add_input(i_x_t); - Expression i_r_t = i_bias + i_R * i_y_t; - - Expression ydist = softmax(i_r_t); - - unsigned w = 0; - while (w == 0 || (int)w == kSOS) { - auto dist = as_vector(cg.incremental_forward(ydist)); - double p = rand01(); - for (; w < dist.size(); ++w) { - p -= dist[w]; - if (p < 0.0) { break; } - } - if (w == dist.size()) w = kEOS; - } - cerr << (len == 1 ? "" : " ") << d.convert(w); - cur = w; - } - cerr << endl; - } -}; - -// Sort in descending order of length -struct CompareLen { - bool operator()(const std::vector& first, const std::vector& second) { - return first.size() > second.size(); - } -}; - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - if (argc != 3 && argc != 4) { - cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; - return 1; - } - kSOS = d.convert(""); - kEOS = d.convert(""); - vector> training, dev; - string line; - int tlc = 0; - int ttoks = 0; - cerr << "Reading training data from " << argv[1] << "...\n"; - { - ifstream in(argv[1]); - assert(in); - while (getline(in, line)) { - ++tlc; - training.push_back(read_sentence(line, &d)); - ttoks += training.back().size(); - if (training.back().front() != kSOS && training.back().back() != kEOS) { - cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; - } - d.freeze(); // no new word types allowed - VOCAB_SIZE = d.size(); - - // Sort the training sentences in descending order of length - CompareLen comp; - sort(training.begin(), training.end(), comp); - // Pad the sentences in the same batch with EOS so they are the same length - // This modifies the training objective a bit by making it necessary to - // predict EOS multiple times, but it's easy and not so harmful - for (size_t i = 0; i < training.size(); i += BATCH_SIZE) - for (size_t j = 1; j < BATCH_SIZE; ++j) - while (training[i + j].size() < training[i].size()) - training[i + j].push_back(kEOS); - - int dlc = 0; - int dtoks = 0; - cerr << "Reading dev data from " << argv[2] << "...\n"; - { - ifstream in(argv[2]); - assert(in); - while (getline(in, line)) { - ++dlc; - dev.push_back(read_sentence(line, &d)); - dtoks += dev.back().size(); - if (dev.back().front() != kSOS && dev.back().back() != kEOS) { - cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << dlc << " lines, " << dtoks << " tokens\n"; - } - - ostringstream os; - os << "lm" - << '_' << LAYERS - << '_' << INPUT_DIM - << '_' << HIDDEN_DIM - << "-pid" << getpid() << ".params"; - const string fname = os.str(); - cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; - - Model model; - Trainer* sgd = nullptr; - sgd = new SimpleSGDTrainer(&model); - sgd->clip_threshold *= BATCH_SIZE; - - RNNLanguageModel lm(model); - if (argc == 4) { - string fname = argv[3]; - ifstream in(fname); - boost::archive::text_iarchive ia(in); - ia >> model; - } - - unsigned report_every_i = 50; - unsigned dev_every_i_reports = 500; - vector order((training.size() + BATCH_SIZE - 1) / BATCH_SIZE); - unsigned si = order.size(); - for (unsigned i = 0; i < order.size(); ++i) order[i] = i * BATCH_SIZE; - bool first = true; - int report = 0; - unsigned lines = 0; - while (1) { - Timer iteration("completed in"); - double loss = 0; - unsigned chars = 0; - for (unsigned i = 0; i < report_every_i; ++i, ++si) { - if (si == order.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - shuffle(order.begin(), order.end(), *rndeng); - } - // build graph for this instance - ComputationGraph cg; - unsigned bsize = std::min((unsigned)training.size() - order[si], BATCH_SIZE); // Batch size - Expression loss_expr = lm.BuildLMGraphs(training, order[si], bsize, chars, cg); - loss += as_scalar(cg.forward(loss_expr)); - cg.backward(loss_expr); - sgd->update(); - lines += bsize; - } - sgd->status(); - cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; - lm.RandomSample(); - - // show score on dev data? - report++; - if (report % dev_every_i_reports == 0) { - double dloss = 0; - unsigned dchars = 0; - for (unsigned i = 0; i < dev.size(); ++i) { - ComputationGraph cg; - Expression loss_expr = lm.BuildLMGraphs(dev, i, 1, dchars, cg); - dloss += as_scalar(cg.forward(loss_expr)); - } - if (dloss < best) { - best = dloss; - ofstream out(fname); - boost::archive::text_oarchive oa(out); - oa << model; - } - cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; - } - } - delete sgd; -} - diff --git a/examples/textcat.cc~ b/examples/textcat.cc~ deleted file mode 100644 index b36a09ebc..000000000 --- a/examples/textcat.cc~ +++ /dev/null @@ -1,317 +0,0 @@ -#include "dynet/nodes.h" -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/timing.h" -#include "dynet/rnn.h" -#include "dynet/gru.h" -#include "dynet/lstm.h" -#include "dynet/dict.h" -#include "dynet/expr.h" -#include "getpid.h" - -#include -#include - -#include -#include - -using namespace std; -using namespace dynet; - -unsigned INPUT_DIM = 36; -unsigned OUTPUT_DIM = 36; -unsigned VOCAB_SIZE = 0; -unsigned LABEL_SIZE = 0; -float pdropout = 0.5; - -dynet::Dict d; -dynet::Dict ld; -int kSOS; -int kEOS; - -struct NeuralBagOfWords { - LookupParameter p_w; - Parameter p_c2h; - Parameter p_hbias; - Parameter p_h2o; - Parameter p_obias; - - explicit NeuralBagOfWords(Model& m) : - p_w(m.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), - p_c2h(m.add_parameters({OUTPUT_DIM, INPUT_DIM})), - p_hbias(m.add_parameters({OUTPUT_DIM})), - p_h2o(m.add_parameters({LABEL_SIZE, OUTPUT_DIM})), - p_obias(m.add_parameters({LABEL_SIZE})) {} - - Expression BuildClassifier(const vector& x, ComputationGraph& cg) { - Expression c2h = parameter(cg, p_c2h); - Expression hbias = parameter(cg, p_hbias); - Expression h2o = parameter(cg, p_h2o); - Expression obias = parameter(cg, p_obias); - - vector vx(x.size()); - for (unsigned i = 0; i < x.size(); ++i) - vx[i] = lookup(cg, p_w, x[i]); - Expression c = sum(vx); - Expression h = rectify(c2h * c / x.size() + hbias); - Expression y_pred = obias + h2o * h; - return y_pred; - } -}; - -struct ConvLayer { - // in_rows = rows per word in input matrix - // k_fold_rows = 1 no folding, 2 fold two rows together, 3 ... - // filter_width = length of filter (columns) - // in_nfmaps = number of feature maps in input - // out_nfmaps = number of feature maps in output - ConvLayer(Model&m, int in_rows, int k_fold_rows, int filter_width, int in_nfmaps, int out_nfmaps) : - p_filts(in_nfmaps), - p_fbias(in_nfmaps), - k_fold_rows(k_fold_rows) { - if (k_fold_rows < 1 || ((in_rows / k_fold_rows) * k_fold_rows != in_rows)) { - cerr << "Bad k_fold_rows=" << k_fold_rows << endl; - abort(); - } - for (int i = 0; i < in_nfmaps; ++i) { - p_filts[i].resize(out_nfmaps); - p_fbias[i].resize(out_nfmaps); - for (int j = 0; j < out_nfmaps; ++j) { - p_filts[i][j] = m.add_parameters({(unsigned)in_rows, (unsigned)filter_width}, 0.01); - p_fbias[i][j] = m.add_parameters({(unsigned)in_rows}, 0.05); - } - } - //for (int j = 0; j < out_nfmaps; ++j) - //p_fbias[j] = m.add_parameters({in_rows}); - } - - vector apply(ComputationGraph& cg, const vector& inlayer, int k_out) const { - const unsigned out_nfmaps = p_filts.front().size(); - const unsigned in_nfmaps = p_filts.size(); - if (in_nfmaps != inlayer.size()) { - cerr << "Mismatched number of input features (" << inlayer.size() << "), expected " << in_nfmaps << endl; - abort(); - } - vector r(out_nfmaps); - - vector tmp(in_nfmaps); - for (unsigned fj = 0; fj < out_nfmaps; ++fj) { - for (unsigned fi = 0; fi < in_nfmaps; ++fi) { - Expression t = conv1d_wide(inlayer[fi], parameter(cg, p_filts[fi][fj])); - t = colwise_add(t, parameter(cg, p_fbias[fi][fj])); - tmp[fi] = t; - } - Expression s = sum(tmp); - if (k_fold_rows > 1) - s = fold_rows(s, k_fold_rows); - s = kmax_pooling(s, k_out); - r[fj] = rectify(s); - } - return r; - } - vector> p_filts; // [feature map index from][feature map index to] - vector> p_fbias; // [feature map index from][feature map index to] - int k_fold_rows; -}; - -struct ConvNet { - LookupParameter p_w; - ConvLayer cl1; - ConvLayer cl2; - Parameter p_t2o; - Parameter p_obias; - - explicit ConvNet(Model& m) : - p_w(m.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), - //ConvLayer(Model&m, int in_rows, int k_fold_rows, int filter_width, int in_nfmaps, int out_nfmaps) : - cl1(m, INPUT_DIM, 2, 10, 1, 6), - cl2(m, INPUT_DIM/2, 2, 6, 6, 14), - p_t2o(m.add_parameters({LABEL_SIZE, 14 * (INPUT_DIM / 4) * 5})), - p_obias(m.add_parameters({LABEL_SIZE})) { - } - - Expression BuildClassifier(const vector& x, ComputationGraph& cg, bool for_training) { - Expression t2o = parameter(cg, p_t2o); - Expression obias = parameter(cg, p_obias); - int k_2 = 5; - int len = x.size(); - int k_1 = max(k_2, len / 2); - vector vx(x.size()); - for (unsigned i = 0; i < x.size(); ++i) - vx[i] = lookup(cg, p_w, x[i]); - Expression s = concatenate_cols(vx); - - vector l0(1, s); - vector l1 = cl1.apply(cg, l0, k_1); - vector l2 = cl2.apply(cg, l1, k_2); - for(auto& fm : l2) - fm = reshape(fm, {k_2 * INPUT_DIM / 4}); - Expression t = concatenate(l2); - if (for_training) - t = dropout(t, pdropout); - Expression r = t2o * t + obias; - return r; - } -}; - -bool IsCurrentPredictionCorrection(Expression y_pred, int y_true) { - ComputationGraph& cg = *y_pred.pg; - auto v = as_vector(cg.incremental_forward(y_pred)); - assert(v.size() > 1); - int besti = 0; - float best = v[0]; - for (unsigned i = 1; i < v.size(); ++i) - if (v[i] > best) { best = v[i]; besti = i; } - return (besti == y_true); -} - -Expression CrossEntropyLoss(const Expression& y_pred, int y_true) { - Expression lp = log_softmax(y_pred); - Expression nll = -pick(lp, y_true); - return nll; -} - -Expression HingeLoss(const Expression& y_pred, int y_true) { - Expression hl = hinge(y_pred, y_true, 10.0f); - return hl; -} - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - if (argc != 3 && argc != 4) { - cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; - return 1; - } - kSOS = d.convert(""); - kEOS = d.convert(""); - vector,int>> training, dev; - string line; - int tlc = 0; - int ttoks = 0; - cerr << "Reading training data from " << argv[1] << "...\n"; - { - ifstream in(argv[1]); - assert(in); - while(getline(in, line)) { - ++tlc; - vector x,y; - read_sentence_pair(line, &x, &d, &y, &ld); - if (x.size() == 0 || y.size() != 1) { cerr << line << endl; abort(); } - training.push_back(make_pair(x,y[0])); - ttoks += x.size(); - } - cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; - cerr << "Labels: " << ld.size() << endl; - } - LABEL_SIZE = ld.size(); - //d.freeze(); // no new word types allowed - ld.freeze(); // no new tag types allowed - - int dlc = 0; - int dtoks = 0; - cerr << "Reading dev data from " << argv[2] << "...\n"; - { - ifstream in(argv[2]); - assert(in); - while(getline(in, line)) { - ++dlc; - vector x,y; - read_sentence_pair(line, &x, &d, &y, &ld); - assert(y.size() == 1); - dev.push_back(make_pair(x,y[0])); - dtoks += x.size(); - } - cerr << dlc << " lines, " << dtoks << " tokens\n"; - } - VOCAB_SIZE = d.size(); - ostringstream os; - os << "textcat" - << '_' << INPUT_DIM - << '_' << OUTPUT_DIM - << "-pid" << getpid() << ".params"; - const string fname = os.str(); - cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; - - Model model; - Trainer* sgd = nullptr; - //sgd = new MomentumSGDTrainer(&model); - sgd = new AdagradTrainer(&model); - //sgd = new SimpleSGDTrainer(&model); - - //NeuralBagOfWords nbow(model); - ConvNet nbow(model); - - unsigned report_every_i = min(100, int(training.size())); - unsigned dev_every_i_reports = 25; - unsigned si = training.size(); - vector order(training.size()); - for (unsigned i = 0; i < order.size(); ++i) order[i] = i; - bool first = true; - int report = 0; - unsigned lines = 0; - while(1) { - Timer iteration("completed in"); - double loss = 0; - unsigned ttags = 0; - unsigned correct = 0; - for (unsigned i = 0; i < report_every_i; ++i) { - if (si == training.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - shuffle(order.begin(), order.end(), *rndeng); - } - - // build graph for this instance - ComputationGraph cg; - auto& sentx_y = training[order[si]]; - const auto& x = sentx_y.first; - const int y = sentx_y.second; - ++si; - //cerr << "LINE: " << order[si] << endl; - Expression y_pred = nbow.BuildClassifier(x, cg, true); - //Expression loss_expr = CrossEntropyLoss(y_pred, y); - Expression loss_expr = HingeLoss(y_pred, y); - loss += as_scalar(cg.forward(loss_expr)); - cg.backward(loss_expr); - sgd->update(2.0); - ++lines; - ++ttags; - } - sgd->status(); - cerr << " E = " << (loss / ttags) << " ppl=" << exp(loss / ttags) << " (acc=" << (correct / (double)ttags) << ") "; - model.project_weights(); - - // show score on dev data? - report++; - if (report % dev_every_i_reports == 0) { - double dloss = 0; - unsigned dtags = 0; - unsigned dcorr = 0; - for (auto& sent : dev) { - const auto& x = sent.first; - const int y = sent.second; - nbow.p_t2o.get()->scale_parameters(pdropout); - ComputationGraph cg; - Expression y_pred = nbow.BuildClassifier(x, cg, false); - if (IsCurrentPredictionCorrection(y_pred, y)) dcorr++; - //Expression loss_expr = CrossEntropyLoss(y_pred, y); - Expression loss_expr = HingeLoss(y_pred, y); - //cerr << "DEVLINE: " << dtags << endl; - dloss += as_scalar(cg.incremental_forward(loss_expr)); - nbow.p_t2o.get()->scale_parameters(1.f/pdropout); - dtags++; - } - if (dloss < best) { - best = dloss; - ofstream out(fname); - boost::archive::text_oarchive oa(out); - oa << model; - } - cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dtags) << " ppl=" << exp(dloss / dtags) << " acc=" << (dcorr / (double)dtags) << ' '; - } - } - delete sgd; -} - From 08d8f8554df9e9b3f54a768f8105dd4a2c3b88a4 Mon Sep 17 00:00:00 2001 From: paul Date: Mon, 5 Dec 2016 18:30:46 -0500 Subject: [PATCH 867/965] Add examples to doc --- doc/doxygen/Doxyfile | 2 +- doc/source/index.rst | 1 + examples/encdec/encdec.h | 23 ++++++++++++----------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/doc/doxygen/Doxyfile b/doc/doxygen/Doxyfile index 1c1cf3b1a..194295a30 100644 --- a/doc/doxygen/Doxyfile +++ b/doc/doxygen/Doxyfile @@ -758,7 +758,7 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT =../../dynet/expr.h ../../dynet/training.h ../../dynet/rnn.h +INPUT =../../dynet/expr.h ../../dynet/training.h ../../dynet/rnn.h ../../examples/encdec/encdec.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses diff --git a/doc/source/index.rst b/doc/source/index.rst index 877da170f..1d19ccb46 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -26,6 +26,7 @@ And get the basic information to create programs and use models: operations builders optimizers + examples Mode advanced topics are below: diff --git a/examples/encdec/encdec.h b/examples/encdec/encdec.h index 0baac90d8..2e82cd320 100644 --- a/examples/encdec/encdec.h +++ b/examples/encdec/encdec.h @@ -1,8 +1,9 @@ /** - * \file expr.h - * \defgroup seq2seq_builders - * \ingroup seq2seq_builders - * \brief An example implementation of a simple sequence to sequence model based on lstm encoder/decoder + * \file encdec.h + * \defgroup seq2seqbuilders + * \brief Sequence to sequence models + * + * An example implementation of a simple sequence to sequence model based on lstm encoder/decoder * */ @@ -28,7 +29,6 @@ using namespace std; using namespace dynet; using namespace dynet::expr; - int kSOS; int kEOS; @@ -37,7 +37,9 @@ unsigned INPUT_VOCAB_SIZE; unsigned OUTPUT_VOCAB_SIZE; /** - * \ingroup seq2seq_builders + * \ingroup seq2seqbuilders + * + * \struct EncoderDecoder * \brief This structure is a "vanilla" encoder decoder model * \details This sequence to sequence network models the conditional probability * \f$p(y_1,\dots,y_m\vert x_1,\dots,x_n)=\prod_{i=1}^m p(y_i\vert \textbf{e},y_1,\dots,y_{i-1})\f$ @@ -46,11 +48,12 @@ unsigned OUTPUT_VOCAB_SIZE; * * Typically \f$\textbf{e}\f$ is the concatenated cell and output vector of a (multilayer) LSTM. * - * Sequence to sequence models were introduced in \cite cho2014learning . + * Sequence to sequence models were introduced in [Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation](https://arxiv.org/pdf/1406.1078v3.pdf) . * - * Our implementation is more akin to the one from \cite sutskever2014sequence . + * Our implementation is more akin to the one from [Sequence to sequence learning with neural networks](http://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf) . * - * \tparam Builder This can theoretically be any RNNbuilder. It's only been tested with an LSTM as of now + * \tparam Builder This can theoretically be any RNNbuilder. It's only been tested with an LSTM as + * of now */ template struct EncoderDecoder { @@ -383,5 +386,3 @@ struct EncoderDecoder { return idx ? idx - 1 : 0; } }; - - From 70b72f98143088983a7f97f36e794b24393e1af0 Mon Sep 17 00:00:00 2001 From: paul Date: Mon, 5 Dec 2016 18:32:15 -0500 Subject: [PATCH 868/965] bugfix --- rnnlm/lm.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rnnlm/lm.cc b/rnnlm/lm.cc index 3e5426c25..67c63610f 100644 --- a/rnnlm/lm.cc +++ b/rnnlm/lm.cc @@ -9,7 +9,7 @@ #include "dynet/expr.h" #include "dynet/cfsm-builder.h" #include "dynet/hsm-builder.h" -#include "../examples/getpid.h" +#include "../examples/utils/getpid.h" #include #include From 45bf81faa4564ed09ca7817e504984b93e5ab4e6 Mon Sep 17 00:00:00 2001 From: Mitchell Stern Date: Tue, 6 Dec 2016 03:39:33 -0800 Subject: [PATCH 869/965] Added support for negative indices and default slice arguments --- python/_dynet.pyx | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index 6ffcc5093..270f712c3 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -624,14 +624,41 @@ cdef class Expression: #{{{ # __getitem__ and __getslice__ in one for python 3 compatibility def __getitem__(self, index): assert isinstance(index, (int, slice)) + cdef int rows = self.c().dim().rows() + cdef int i, j if isinstance(index, int): - return pick(self, index) + i = index + if i > rows - 1: + raise IndexError("Index too large: %d > %d" % (i, rows - 1)) + if i < -rows: + raise IndexError("Index too small: %d < %d" % (i, -rows)) + if i < 0: + i += rows + return pick(self, i) else: - if index.start is None or index.stop is None: - raise ValueError("Default start and stop indices not yet supported.") + i = 0 + j = rows + if index.start is not None: + i = index.start + if i > rows - 1: + raise IndexError("Start index too large: %d > %d" % (i, rows - 1)) + if i < -rows: + raise IndexError("Start index too small: %d < %d" % (i, -rows)) + if i < 0: + i += rows + if index.stop is not None: + j = index.stop + if j > rows - 1: + raise IndexError("Stop index too large: %d > %d" % (j, rows - 1)) + if j < -rows: + raise IndexError("Stop index too small: %d < %d" % (j, -rows)) + if j < 0: + j += rows + if i >= j: + raise ValueError("Improper slice: start index must come strictly before stop index") if index.step is not None: raise ValueError("Step sizes not yet supported.") - return pickrange(self, index.start, index.stop) + return pickrange(self, i, j) cpdef scalar_value(self, recalculate=False): if self.cg_version != _cg._cg_version: raise RuntimeError("Stale Expression (created before renewing the Computation Graph).") From b23f60341950bc226b2f2faff552646367cf5619 Mon Sep 17 00:00:00 2001 From: paul Date: Tue, 6 Dec 2016 10:25:58 -0500 Subject: [PATCH 870/965] typos --- examples/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/README.md b/examples/README.md index 9c803f438..cd8fd3edd 100644 --- a/examples/README.md +++ b/examples/README.md @@ -2,4 +2,4 @@ This is a set of common (and less common) models and their implementation in Dynet (C++ and python). -For now most examples don't have an implementation in both languagesbut we're workong on it +For now most examples don't have an implementation in both languages but we're working on it From d076a23111ae10ceb6f242362afcaaac66599bf6 Mon Sep 17 00:00:00 2001 From: paul Date: Tue, 6 Dec 2016 11:58:39 -0500 Subject: [PATCH 871/965] Refactor rnnlm-batch example + add doc + some corrections to examples --- doc/doxygen/Doxyfile | 2 +- doc/doxygen/references.bib | 19 + doc/source/examples.rst | 23 ++ examples/encdec/encdec.h | 2 +- examples/encdec/train_encdec.cc | 453 +++++++++++---------- examples/rnnlm-batch/rnnlm-batch.h | 235 +++++++++++ examples/rnnlm-batch/train_rnnlm-batch.cc | 342 ++++++++-------- examples/rnnlm-batch/train_rnnlm-batch.cc~ | 255 ------------ examples/tag-bilstm/train_tag-bilstm.cc~ | 261 ------------ examples/utils/cl-args.h | 15 +- 10 files changed, 679 insertions(+), 928 deletions(-) create mode 100644 doc/doxygen/references.bib create mode 100644 doc/source/examples.rst create mode 100644 examples/rnnlm-batch/rnnlm-batch.h delete mode 100644 examples/rnnlm-batch/train_rnnlm-batch.cc~ delete mode 100644 examples/tag-bilstm/train_tag-bilstm.cc~ diff --git a/doc/doxygen/Doxyfile b/doc/doxygen/Doxyfile index 194295a30..ca3dbcae9 100644 --- a/doc/doxygen/Doxyfile +++ b/doc/doxygen/Doxyfile @@ -758,7 +758,7 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT =../../dynet/expr.h ../../dynet/training.h ../../dynet/rnn.h ../../examples/encdec/encdec.h +INPUT =../../dynet/expr.h ../../dynet/training.h ../../dynet/rnn.h ../../examples/encdec/encdec.h ../../examples/rnnlm-batch/rnnlm-batch.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses diff --git a/doc/doxygen/references.bib b/doc/doxygen/references.bib new file mode 100644 index 000000000..4ef22f732 --- /dev/null +++ b/doc/doxygen/references.bib @@ -0,0 +1,19 @@ +@article{cho2014learning, + title={Learning phrase representations using RNN encoder-decoder for statistical machine translation}, + author={Cho, Kyunghyun and Van Merri{\"e}nboer, Bart and Gulcehre, Caglar and Bahdanau, Dzmitry and Bougares, Fethi and Schwenk, Holger and Bengio, Yoshua}, + journal={arXiv preprint arXiv:1406.1078}, + year={2014} +} +@inproceedings{sutskever2014sequence, + title={Sequence to sequence learning with neural networks}, + author={Sutskever, Ilya and Vinyals, Oriol and Le, Quoc V}, + booktitle={Advances in neural information processing systems}, + pages={3104--3112}, + year={2014} +} +@article{zeiler2012adadelta, + title={ADADELTA: an adaptive learning rate method}, + author={Zeiler, Matthew D}, + journal={arXiv preprint arXiv:1212.5701}, + year={2012} +} \ No newline at end of file diff --git a/doc/source/examples.rst b/doc/source/examples.rst new file mode 100644 index 000000000..af2a01919 --- /dev/null +++ b/doc/source/examples.rst @@ -0,0 +1,23 @@ +Examples +======== + +Here are some simple models coded in the examples of Dynet. Feel free to use and modify them. + +Language models +--------------- + +Language modelling is one of the cornerstones of natural language processing. Dynet allows great flexibility in the creation of neural language models. Here are some examples. + +.. doxygengroup:: lmbuilders + :members: + :content-only: + +Sequence to sequence models +--------------------------- + +Dynet is well suited for the variety of sequence to sequence models used in modern NLP. Here are some pre-coded structs implementing the most common one. + +.. doxygengroup:: seq2seqbuilders + :members: + :content-only: + diff --git a/examples/encdec/encdec.h b/examples/encdec/encdec.h index 2e82cd320..d6246b397 100644 --- a/examples/encdec/encdec.h +++ b/examples/encdec/encdec.h @@ -1,6 +1,6 @@ /** * \file encdec.h - * \defgroup seq2seqbuilders + * \defgroup seq2seqbuilders seq2seqbuilders * \brief Sequence to sequence models * * An example implementation of a simple sequence to sequence model based on lstm encoder/decoder diff --git a/examples/encdec/train_encdec.cc b/examples/encdec/train_encdec.cc index b50bc8883..7fd79305d 100644 --- a/examples/encdec/train_encdec.cc +++ b/examples/encdec/train_encdec.cc @@ -16,261 +16,264 @@ using namespace dynet::expr; // Sort sentences in descending order of length struct CompareLen { - bool operator()(const std::vector& first, const std::vector& second) { - return first.size() > second.size(); - } + bool operator()(const std::vector& first, const std::vector& second) { + return first.size() > second.size(); + } }; int main(int argc, char** argv) { - // Fetch dynet params -------------------------------------------------------------------------- - auto dyparams = dynet::extract_dynet_params(argc, argv); - dynet::initialize(dyparams); + // Fetch dynet params ---------------------------------------------------------------------------- + auto dyparams = dynet::extract_dynet_params(argc, argv); + dynet::initialize(dyparams); - // Fetch program specific parameters (see ../utils/cl-args.h) ---------------------------------- - Params params; + // Fetch program specific parameters (see ../utils/cl-args.h) ------------------------------------ + Params params; - INPUT_VOCAB_SIZE = 0; - OUTPUT_VOCAB_SIZE = 0; + INPUT_VOCAB_SIZE = 0; + OUTPUT_VOCAB_SIZE = 0; - get_args(argc, argv, params, TRAIN); + get_args(argc, argv, params, TRAIN); - // Load datasets ------------------------------------------------------------------------------- + // Load datasets --------------------------------------------------------------------------------- - // Dictionary - Dict d; + // Dictionary + Dict d; - // Start and end of sentence words - kSOS = d.convert(""); - kEOS = d.convert(""); + // Start and end of sentence words + kSOS = d.convert(""); + kEOS = d.convert(""); - // Datasets - vector> training, dev; + // Datasets + vector> training, dev; - // Read training data and fill dictionary - string line; - int tlc = 0; - int ttoks = 0; - cerr << "Reading training data from " << params.train_file << "...\n"; - { - ifstream in(params.train_file); - assert(in); - while (getline(in, line)) { - ++tlc; - training.push_back(read_sentence(line, &d)); - ttoks += training.back().size(); - if (training.back().front() != kSOS && training.back().back() != kEOS) { - cerr << "Training sentence in " << params.train_file << ":" << tlc - << " didn't start or end with , \n"; - abort(); - } - } - cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + // Read training data and fill dictionary + string line; + int tlc = 0; + int ttoks = 0; + cerr << "Reading training data from " << params.train_file << "...\n"; + { + ifstream in(params.train_file); + assert(in); + while (getline(in, line)) { + ++tlc; + training.push_back(read_sentence(line, &d)); + ttoks += training.back().size(); + if (training.back().front() != kSOS && training.back().back() != kEOS) { + cerr << "Training sentence in " << params.train_file << ":" << tlc + << " didn't start or end with , \n"; + abort(); + } } - // Sort the training sentences in descending order of length (for minibatching) - CompareLen comp; - sort(training.begin(), training.end(), comp); - // Pad the sentences in the same batch with EOS so they are the same length - // This modifies the training objective a bit by making it necessary to - // predict EOS multiple times, but it's easy and not so harmful - for (size_t i = 0; i < training.size(); i += params.BATCH_SIZE) - for (size_t j = 1; j < params.BATCH_SIZE; ++j) - while (training[i + j].size() < training[i].size()) - training[i + j].push_back(kEOS); - // Freeze dictionary - d.freeze(); // no new word types allowed - d.set_unk("UNK"); - INPUT_VOCAB_SIZE = d.size(); - OUTPUT_VOCAB_SIZE = d.size(); + cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; + } + // Sort the training sentences in descending order of length (for minibatching) + CompareLen comp; + sort(training.begin(), training.end(), comp); + // Pad the sentences in the same batch with EOS so they are the same length + // This modifies the training objective a bit by making it necessary to + // predict EOS multiple times, but it's easy and not so harmful + for (size_t i = 0; i < training.size(); i += params.BATCH_SIZE) + for (size_t j = 1; j < params.BATCH_SIZE; ++j) + while (training[i + j].size() < training[i].size()) + training[i + j].push_back(kEOS); + // Freeze dictionary + d.freeze(); // no new word types allowed + d.set_unk("UNK"); + INPUT_VOCAB_SIZE = d.size(); + OUTPUT_VOCAB_SIZE = d.size(); - // Read validation dataset - int dlc = 0; - int dtoks = 0; - cerr << "Reading dev data from " << params.dev_file << "...\n"; - { - ifstream in(params.dev_file); - assert(in); - while (getline(in, line)) { - ++dlc; - dev.push_back(read_sentence(line, &d)); - dtoks += dev.back().size(); - if (dev.back().front() != kSOS && dev.back().back() != kEOS) { - cerr << "Dev sentence in " << params.dev_file << ":" - << dlc << " didn't start or end with , \n"; - cerr << d.convert(dev.back().front()) << ":" - << d.convert(dev.back().back()) << " \n"; - cerr << kSOS << ":" << kEOS << "\n"; - abort(); - } - } - cerr << dlc << " lines, " << dtoks << " tokens\n"; + // Read validation dataset + int dlc = 0; + int dtoks = 0; + cerr << "Reading dev data from " << params.dev_file << "...\n"; + { + ifstream in(params.dev_file); + assert(in); + while (getline(in, line)) { + ++dlc; + dev.push_back(read_sentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() != kSOS && dev.back().back() != kEOS) { + cerr << "Dev sentence in " << params.dev_file << ":" + << dlc << " didn't start or end with , \n"; + cerr << d.convert(dev.back().front()) << ":" + << d.convert(dev.back().back()) << " \n"; + cerr << kSOS << ":" << kEOS << "\n"; + abort(); + } } - // Sort the dev sentences in descending order of length (for minibatching) - sort(dev.begin(), dev.end(), comp); - // Pad the sentences in the same batch with EOS so they are the same length - // This modifies the dev objective a bit by making it necessary to - // predict EOS multiple times, but it's easy and not so harmful - for (size_t i = 0; i < dev.size(); i += params.DEV_BATCH_SIZE) - for (size_t j = 1; j < params.DEV_BATCH_SIZE; ++j) - while (dev[i + j].size() < dev[i].size()) - dev[i + j].push_back(kEOS); + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + // Sort the dev sentences in descending order of length (for minibatching) + sort(dev.begin(), dev.end(), comp); + // Pad the sentences in the same batch with EOS so they are the same length + // This modifies the dev objective a bit by making it necessary to + // predict EOS multiple times, but it's easy and not so harmful + for (size_t i = 0; i < dev.size(); i += params.DEV_BATCH_SIZE) + for (size_t j = 1; j < params.DEV_BATCH_SIZE; ++j) + while (dev[i + j].size() < dev[i].size()) + dev[i + j].push_back(kEOS); - // Model name (for saving) --------------------------------------------------------------------- - ostringstream os; - // Store a bunch of information in the model name - os << params.exp_name - << "_" << (params.bidirectionnal ? "bi" : "") << "lm" - << '_' << params.LAYERS - << '_' << params.INPUT_DIM - << '_' << params.HIDDEN_DIM - << ".params"; - const string fname = os.str(); - cerr << "Parameters will be written to: " << fname << endl; + // Model name (for saving) ----------------------------------------------------------------------- + ostringstream os; + // Store a bunch of information in the model name + os << params.exp_name + << "_" << (params.bidirectionnal ? "bi" : "") << "lm" + << '_' << params.LAYERS + << '_' << params.INPUT_DIM + << '_' << params.HIDDEN_DIM + << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; - // Initialize model and trainer ---------------------------------------------------------------- - Model model; - // Use Adam optimizer - Trainer* adam = nullptr; - adam = new AdamTrainer(&model, 0.001, 0.9, 0.999, 1e-8); - adam->clip_threshold *= params.BATCH_SIZE; + // Initialize model and trainer ------------------------------------------------------------------ + Model model; + // Use Adam optimizer + Trainer* adam = nullptr; + adam = new AdamTrainer(&model, 0.001, 0.9, 0.999, 1e-8); + adam->clip_threshold *= params.BATCH_SIZE; - // Create model - EncoderDecoder lm(model, - params.LAYERS, - params.INPUT_DIM, - params.HIDDEN_DIM, - params.bidirectionnal); + // Create model + EncoderDecoder lm(model, + params.LAYERS, + params.INPUT_DIM, + params.HIDDEN_DIM, + params.bidirectionnal); - // Load preexisting weights (if provided) - if (params.model_file != "") { - ifstream in(params.model_file); - boost::archive::text_iarchive ia(in); - ia >> model >> lm; - } - - // Initialize variables for training ----------------------------------------------------------- - // Best dev score - double best = 9e+99; + // Load preexisting weights (if provided) + if (params.model_file != "") { + ifstream in(params.model_file); + boost::archive::text_iarchive ia(in); + ia >> model >> lm; + } - // Number of batches in training set - unsigned num_batches = training.size() / params.BATCH_SIZE - 1; + // Initialize variables for training ------------------------------------------------------------- + // Best dev score + double best = 9e+99; - // Number of sentences to sample each epoch (for visualization) - unsigned num_samples = 5; + // Number of batches in training set + unsigned num_batches = training.size() / params.BATCH_SIZE - 1; - // Random indexing - unsigned si; - vector order(num_batches); - for (unsigned i = 0; i < num_batches; ++i) order[i] = i; + // Number of sentences to sample each epoch (for visualization) + unsigned num_samples = 5; - bool first = true; - int epoch = 0; - // Run for the given number of epochs (or indefinitely if params.NUM_EPOCHS is negative) - while (epoch < params.NUM_EPOCHS || params.NUM_EPOCHS < 0) { - // Update the optimizer - if (first) { first = false; } else { adam->update_epoch(); } - // Reshuffle the dataset - cerr << "**SHUFFLE\n"; - random_shuffle(order.begin(), order.end()); - // Initialize loss and number of chars(/word) (for loss per char/word) - double loss = 0; - unsigned chars = 0; - // Start timer - Timer* iteration = new Timer("completed in"); + // Random indexing + unsigned si; + vector order(num_batches); + for (unsigned i = 0; i < num_batches; ++i) order[i] = i; - for (si = 0; si < num_batches; ++si) { - // build graph for this instance - ComputationGraph cg; - // Compute batch start id and size - int id = order[si] * params.BATCH_SIZE; - unsigned bsize = std::min((unsigned)training.size() - id, params.BATCH_SIZE); - // Encode the batch - Expression encoding = lm.encode(training, id, bsize, chars, cg); - // Decode and get error (negative log likelihood) - Expression loss_expr = lm.decode(encoding, training, id, bsize, cg); - // Get scalar error for monitoring - loss += as_scalar(cg.forward(loss_expr)); - // Compute gradient with backward pass - cg.backward(loss_expr); - // Update parameters - adam->update(); - // Print progress every tenth of the dataset - if ((si + 1) % (num_batches / 10) == 0 || si == num_batches - 1) { + bool first = true; + int epoch = 0; + // Run for the given number of epochs (or indefinitely if params.NUM_EPOCHS is negative) + while (epoch < params.NUM_EPOCHS || params.NUM_EPOCHS < 0) { + // Update the optimizer + if (first) { first = false; } else { adam->update_epoch(); } + // Reshuffle the dataset + cerr << "**SHUFFLE\n"; + random_shuffle(order.begin(), order.end()); + // Initialize loss and number of chars(/word) (for loss per char/word) + double loss = 0; + unsigned chars = 0; + // Start timer + Timer* iteration = new Timer("completed in"); - // Print informations - adam->status(); - cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; - // Reinitialize timer - delete iteration; - iteration = new Timer("completed in"); - // Reinitialize loss - loss = 0; - chars = 0; - } - } + for (si = 0; si < num_batches; ++si) { + // build graph for this instance + ComputationGraph cg; + // Compute batch start id and size + int id = order[si] * params.BATCH_SIZE; + unsigned bsize = std::min((unsigned)training.size() - id, params.BATCH_SIZE); + // Encode the batch + Expression encoding = lm.encode(training, id, bsize, chars, cg); + // Decode and get error (negative log likelihood) + Expression loss_expr = lm.decode(encoding, training, id, bsize, cg); + // Get scalar error for monitoring + loss += as_scalar(cg.forward(loss_expr)); + // Compute gradient with backward pass + cg.backward(loss_expr); + // Update parameters + adam->update(); + // Print progress every tenth of the dataset + if ((si + 1) % (num_batches / 10) == 0 || si == num_batches - 1) { + // Print informations + adam->status(); + cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; + // Reinitialize timer + delete iteration; + iteration = new Timer("completed in"); + // Reinitialize loss + loss = 0; + chars = 0; + } + } - // Increment epoch - ++epoch; - // Show score on dev data - if (si == num_batches) { - double dloss = 0; - unsigned dchars = 0; - for (unsigned i = 0; i < dev.size() / params.DEV_BATCH_SIZE; ++i) { - // build graph for this instance - ComputationGraph cg; - unsigned id = i * params.DEV_BATCH_SIZE; - unsigned bsize = std::min((unsigned)dev.size() - id, params.DEV_BATCH_SIZE); - // Encode - Expression encoding = lm.encode( dev, id, bsize, dchars, cg); - // Decode and get loss - Expression loss_expr = lm.decode(encoding, dev, id, bsize, cg); - // Count loss - dloss += as_scalar(cg.forward(loss_expr)); - } - // If the validation loss is the lowest, save the parameters - if (dloss < best) { - best = dloss; - ofstream out(fname); - boost::archive::text_oarchive oa(out); - oa << model << lm; - } - // Print informations - cerr << "\n***DEV [epoch=" << (epoch) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; - // Reinitialize timer - delete iteration; - iteration = new Timer("completed in"); - } + // Show score on dev data + if (si == num_batches) { + double dloss = 0; + unsigned dchars = 0; + for (unsigned i = 0; i < dev.size() / params.DEV_BATCH_SIZE; ++i) { + // build graph for this instance + ComputationGraph cg; + // Compute batch start id and size + unsigned id = i * params.DEV_BATCH_SIZE; + unsigned bsize = std::min((unsigned)dev.size() - id, params.DEV_BATCH_SIZE); + // Encode + Expression encoding = lm.encode( dev, id, bsize, dchars, cg); + // Decode and get loss + Expression loss_expr = lm.decode(encoding, dev, id, bsize, cg); + // Count loss + dloss += as_scalar(cg.forward(loss_expr)); + } + // If the validation loss is the lowest, save the parameters + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model << lm; + } + // Print informations + cerr << "\n***DEV [epoch=" << (epoch) + << "] E = " << (dloss / dchars) + << " ppl=" << exp(dloss / dchars) << ' '; + // Reinitialize timer + delete iteration; + iteration = new Timer("completed in"); + } - // Sample some examples because it's cool (also helps debugging) - if (si == num_batches) { - cout << "---------------------------------------------" << endl; - for (unsigned i = 0; i < num_samples; ++i) { - // Select a random sentence from the dev set - float p = (float)rand() / (float) RAND_MAX; - unsigned idx = (unsigned)(p * dev.size()) % dev.size(); - auto sent = dev[idx]; - ComputationGraph cg; - // Sample sentence - vector sampled = lm.generate(sent, cg); - // Print original sentence - cout << "Original sentence : "; - for (int word : sent) { - cout << d.convert(word) << " "; - } - cout << endl; - // Print sampled sentence - cout << "Sampled sentence : "; - for (int word : sampled) { - cout << d.convert(word) << " "; - } - cout << endl; - cout << "---------------------------------------------" << endl; - } + // Sample some examples because it's cool (also helps debugging) + if (si == num_batches) { + cout << "---------------------------------------------" << endl; + for (unsigned i = 0; i < num_samples; ++i) { + // Select a random sentence from the dev set + float p = (float)rand() / (float) RAND_MAX; + unsigned idx = (unsigned)(p * dev.size()) % dev.size(); + auto sent = dev[idx]; + ComputationGraph cg; + // Sample sentence + vector sampled = lm.generate(sent, cg); + // Print original sentence + cout << "Original sentence : "; + for (int word : sent) { + cout << d.convert(word) << " "; } + cout << endl; + // Print sampled sentence + cout << "Sampled sentence : "; + for (int word : sampled) { + cout << d.convert(word) << " "; + } + cout << endl; + cout << "---------------------------------------------" << endl; + } } - // Free memory - delete adam; + + // Increment epoch + ++epoch; + } + // Free memory + delete adam; } diff --git a/examples/rnnlm-batch/rnnlm-batch.h b/examples/rnnlm-batch/rnnlm-batch.h new file mode 100644 index 000000000..c1a1f605c --- /dev/null +++ b/examples/rnnlm-batch/rnnlm-batch.h @@ -0,0 +1,235 @@ +/** + * \file rnnlm-batch.h + * \defgroup lmbuilders lmbuilders + * \brief Language models builders + * + * An example implementation of a simple neural language model + * based on RNNs + * + */ +#ifndef RNNLM_BATCH_H +#define RNNLM_BATCH_H + +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/rnn.h" +#include "dynet/gru.h" +#include "dynet/lstm.h" +#include "dynet/dict.h" +#include "dynet/expr.h" + + +#include +#include + +#include +#include +#include +#include + +using namespace std; +using namespace dynet; +using namespace dynet::expr; + +int kSOS; +int kEOS; + + +unsigned INPUT_VOCAB_SIZE; +unsigned OUTPUT_VOCAB_SIZE; + +/** + * \ingroup lmbuilders + * + * \struct RNNBatchLanguageModel + * \brief This structure wraps any RNN to train a language model with minibatching + * \details Recurrent neural network based language modelling maximizes the likelihood + * of a sentence \f$\textbf s=(w_1,\dots,w_n)\f$ by modelling it as : + * + * \f$L(\textbf s)=p(w_1,\dots,w_n)=\prod_{i=1}^n p(w_i\vert w_1,\dots,w_{i-1})\f$ + * + * Where \f$p(w_i\vert w_1,\dots,w_{i-1})\f$ is given by the output of the RNN at step \f$i\f$ + * + * In the case of training with minibatching, the sentences must be of the same length in + * each minibatch. This requires some preprocessing (see `train_rnnlm-batch.cc` for example). + * + * Reference : [Mikolov et al., 2010](http://www.fit.vutbr.cz/research/groups/speech/publi/2010/mikolov_interspeech2010_IS100722.pdf) + * + * \tparam Builder This can be any RNNBuilder + */ +template +struct RNNBatchLanguageModel { + +protected: + // Hyper-parameters + unsigned LAYERS = 2; + unsigned INPUT_DIM = 8; //256 + unsigned HIDDEN_DIM = 24; // 1024 + unsigned VOCAB_SIZE = 0; + bool cust_l2; + + LookupParameter p_c; + Parameter p_R; + Parameter p_bias; + Expression i_c; + Expression i_R; + Expression i_bias; + Builder rnn; + +public: + /** + * \brief Constructor for the batched RNN language model + * + * \param model Model to hold all parameters for training + * \param LAYERS Number of layers of the RNN + * \param INPUT_DIM Embedding dimension for the words + * \param HIDDEN_DIM Dimension of the hidden states + * \param VOCAB_SIZE Size of the input vocabulary + */ + explicit RNNBatchLanguageModel(Model& model, + unsigned LAYERS, + unsigned INPUT_DIM, + unsigned HIDDEN_DIM, + unsigned VOCAB_SIZE) : + LAYERS(LAYERS), INPUT_DIM(INPUT_DIM), + HIDDEN_DIM(HIDDEN_DIM), VOCAB_SIZE(VOCAB_SIZE), + rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + // Add embedding parameters to the model + p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); + p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); + p_bias = model.add_parameters({VOCAB_SIZE}); + } + + /** + * \brief Computes the negative log probability on a batch + * + * \param sents Full training set + * \param id Start index of the batch + * \param bsize Batch size (`id` + `bsize` should be smaller than the size of the dataset) + * \param tokens Number of tokens processed by the model (used for loos per token computation) + * \param cg Computation graph + * \return Expression for $\f$\sum_{s\in\mathrm{batch}}\log(p(s))\f$ + */ + Expression getNegLogProb(const vector >& sents, + unsigned id, + unsigned bsize, + unsigned & tokens, + ComputationGraph& cg) { + const unsigned slen = sents[id].size(); + // Initialize the RNN for a new computation graph + rnn.new_graph(cg); + // Prepare for new sequence (essentially set hidden states to 0) + rnn.start_new_sequence(); + // Instantiate embedding parameters in the computation graph + // output -> word rep parameters (matrix + bias) + i_R = parameter(cg, p_R); + i_bias = parameter(cg, p_bias); + // Initialize variables for batch errors + vector errs; + // Set all inputs to the SOS symbol + vector last_arr(bsize, sents[0][0]), next_arr(bsize); + // Run rnn on batch + for (unsigned t = 1; t < slen; ++t) { + // Fill next_arr (tokens to be predicted) + for (unsigned i = 0; i < bsize; ++i) { + next_arr[i] = sents[id + i][t]; + // count non-EOS tokens + if (next_arr[i] != *sents[id].rbegin()) tokens++; + } + // Embed the current tokens + Expression i_x_t = lookup(cg, p_c, last_arr); + // Run one step of the rnn : y_t = RNN(x_t) + Expression i_y_t = rnn.add_input(i_x_t); + // Project to the token space using an affine transform + Expression i_r_t = i_bias + i_R * i_y_t; + // Compute error for each member of the batch + Expression i_err = pickneglogsoftmax(i_r_t, next_arr); + errs.push_back(i_err); + // Change input + last_arr = next_arr; + } + // Add all errors + Expression i_nerr = sum_batches(sum(errs)); + return i_nerr; + } + + /** + * \brief Samples a string of words/characters from the model + * \details This can be used to debug and/or have fun. Try it on + * new datasets! + * + * \param d Dictionary to use (should be same as the one used for training) + * \param max_len maximu number of tokens to generate + * \param temp Temperature for sampling (the softmax computed is + * \f$\frac{e^{\frac{r_t^{(i)}}{T}}}{\sum_{j=1}^{\vert V\vert}e^{\frac{r_t^{(j)}}{T}}}\f$). + * Intuitively lower temperature -> less deviation from the distribution (= more "standard" samples) + */ + void RandomSample(const dynet::Dict& d, int max_len = 150, float temp = 1.0) { + // Make some space + cerr << endl; + // Initialize computation graph + ComputationGraph cg; + // Initialize the RNN for the new computation graph + rnn.new_graph(cg); + // Initialize for new sequence (set hidden states, etc..) + rnn.start_new_sequence(); + // Instantiate embedding parameters in the computation graph + // output -> word rep parameters (matrix + bias) + Expression i_R = parameter(cg, p_R); + Expression i_bias = parameter(cg, p_bias); + + // Start generating + int len = 0; + int cur = kSOS; + while (len < max_len) { + ++len; + // Embed current token + Expression i_x_t = lookup(cg, p_c, cur); + // Run one step of the rnn + // y_t = RNN(x_t) + Expression i_y_t = rnn.add_input(i_x_t); + // Project into token space + Expression i_r_t = i_bias + i_R * i_y_t; + // Get distribution over tokens (with temperature) + Expression ydist = softmax(i_r_t / temp); + + // Sample token + unsigned w = 0; + while (w == 0 || (int)w == kSOS) { + auto dist = as_vector(cg.incremental_forward(ydist)); + double p = rand01(); + for (; w < dist.size(); ++w) { + p -= dist[w]; + if (p < 0.0) { break; } + } + if (w == dist.size()) w = kEOS; + } + + if (w == kEOS) { + // If the sampled token is an EOS, reinitialize network and start generating a new sample + rnn.start_new_sequence(); + cerr << endl; + cur = kSOS; + } else { + // Otherwise print token and continue + cerr << (cur == kSOS ? "" : " ") << d.convert(w); + cur = w; + } + + } + cerr << endl; + } + +private: + friend class boost::serialization::access; + template + void serialize(Archive & ar, const unsigned int) { + ar & LAYERS & INPUT_DIM & HIDDEN_DIM; + ar & p_c & p_R & p_bias; + ar & rnn; + } +}; + +#endif \ No newline at end of file diff --git a/examples/rnnlm-batch/train_rnnlm-batch.cc b/examples/rnnlm-batch/train_rnnlm-batch.cc index b1b45a28d..c8b5fc098 100644 --- a/examples/rnnlm-batch/train_rnnlm-batch.cc +++ b/examples/rnnlm-batch/train_rnnlm-batch.cc @@ -1,114 +1,18 @@ -#include "dynet/nodes.h" -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/timing.h" -#include "dynet/rnn.h" -#include "dynet/gru.h" -#include "dynet/lstm.h" -#include "dynet/dict.h" -#include "dynet/expr.h" +/** + * Train a RNN language model in a batched manner + * + * This provide an example of usage of the rnnlm-batch.h model + */ +#include "rnnlm-batch.h" #include "../utils/getpid.h" +#include "../utils/cl-args.h" -#include -#include -#include -#include - -#include -#include using namespace std; using namespace dynet; +using namespace dynet::expr; -unsigned LAYERS = 2; -unsigned INPUT_DIM = 8; //256 -unsigned HIDDEN_DIM = 24; // 1024 -unsigned BATCH_SIZE = 4; -unsigned VOCAB_SIZE = 0; - -dynet::Dict d; -int kSOS; -int kEOS; - -template -struct RNNLanguageModel { - LookupParameter p_c; - Parameter p_R; - Parameter p_bias; - Builder builder; - explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { - p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); - p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); - p_bias = model.add_parameters({VOCAB_SIZE}); - } - - // return Expression of total loss - Expression BuildLMGraphs(const vector >& sents, - unsigned id, - unsigned bsize, - unsigned & chars, - ComputationGraph& cg) { - const unsigned slen = sents[id].size(); - builder.new_graph(cg); // reset RNN builder for new graph - builder.start_new_sequence(); - Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter - Expression i_bias = parameter(cg, p_bias); // word bias - vector errs; - vector last_arr(bsize, sents[0][0]), next_arr(bsize); - for (unsigned t = 1; t < slen; ++t) { - for (unsigned i = 0; i < bsize; ++i) { - next_arr[i] = sents[id+i][t]; - if(next_arr[i] != *sents[id].rbegin()) chars++; // add non-EOS - } - // y_t = RNN(x_t) - Expression i_x_t = lookup(cg, p_c, last_arr); - Expression i_y_t = builder.add_input(i_x_t); - Expression i_r_t = i_bias + i_R * i_y_t; - Expression i_err = pickneglogsoftmax(i_r_t, next_arr); - errs.push_back(i_err); - last_arr = next_arr; - } - Expression i_nerr = sum_batches(sum(errs)); - return i_nerr; - } - // return Expression for total loss - void RandomSample(int max_len = 150) { - cerr << endl; - ComputationGraph cg; - builder.new_graph(cg); // reset RNN builder for new graph - builder.start_new_sequence(); - - Expression i_R = parameter(cg, p_R); - Expression i_bias = parameter(cg, p_bias); - vector errs; - int len = 0; - int cur = kSOS; - while(len < max_len && cur != kEOS) { - ++len; - Expression i_x_t = lookup(cg, p_c, cur); - // y_t = RNN(x_t) - Expression i_y_t = builder.add_input(i_x_t); - Expression i_r_t = i_bias + i_R * i_y_t; - - Expression ydist = softmax(i_r_t); - - unsigned w = 0; - while (w == 0 || (int)w == kSOS) { - auto dist = as_vector(cg.incremental_forward(ydist)); - double p = rand01(); - for (; w < dist.size(); ++w) { - p -= dist[w]; - if (p < 0.0) { break; } - } - if (w == dist.size()) w = kEOS; - } - cerr << (len == 1 ? "" : " ") << d.convert(w); - cur = w; - } - cerr << endl; - } -}; // Sort in descending order of length struct CompareLen { @@ -118,138 +22,232 @@ struct CompareLen { }; int main(int argc, char** argv) { - dynet::initialize(argc, argv); - if (argc != 3 && argc != 4) { - cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; - return 1; - } + // Fetch dynet params ---------------------------------------------------------------------------- + auto dyparams = dynet::extract_dynet_params(argc, argv); + dynet::initialize(dyparams); + // Fetch program specific parameters (see ../utils/cl-args.h) ------------------------------------ + Params params; + + unsigned VOCAB_SIZE = 0; + + get_args(argc, argv, params, TRAIN); + + // Load datasets --------------------------------------------------------------------------------- + + // Dictionary + Dict d; + + // Start and end of sentence tokens kSOS = d.convert(""); kEOS = d.convert(""); + + // Datasets vector> training, dev; + + // Read training data and fill dictionary string line; int tlc = 0; int ttoks = 0; - cerr << "Reading training data from " << argv[1] << "...\n"; + cerr << "Reading training data from " << params.train_file << "...\n"; { - ifstream in(argv[1]); + ifstream in(params.train_file); assert(in); - while(getline(in, line)) { + while (getline(in, line)) { ++tlc; training.push_back(read_sentence(line, &d)); ttoks += training.back().size(); if (training.back().front() != kSOS && training.back().back() != kEOS) { - cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + cerr << "Training sentence in " << params.train_file << ":" << tlc + << " didn't start or end with , \n"; abort(); } } cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; } - d.freeze(); // no new word types allowed - VOCAB_SIZE = d.size(); - // Sort the training sentences in descending order of length CompareLen comp; sort(training.begin(), training.end(), comp); // Pad the sentences in the same batch with EOS so they are the same length // This modifies the training objective a bit by making it necessary to // predict EOS multiple times, but it's easy and not so harmful - for(size_t i = 0; i < training.size(); i += BATCH_SIZE) - for(size_t j = 1; j < BATCH_SIZE; ++j) - while(training[i+j].size() < training[i].size()) - training[i+j].push_back(kEOS); + for (size_t i = 0; i < training.size(); i += params.BATCH_SIZE) + for (size_t j = 1; j < params.BATCH_SIZE; ++j) + while (training[i + j].size() < training[i].size()) + training[i + j].push_back(kEOS); + // Freeze dictionary + d.freeze(); // no new word types allowed + d.set_unk("UNK"); + INPUT_VOCAB_SIZE = d.size(); + OUTPUT_VOCAB_SIZE = d.size(); + // Read validation dataset int dlc = 0; int dtoks = 0; - cerr << "Reading dev data from " << argv[2] << "...\n"; + cerr << "Reading dev data from " << params.dev_file << "...\n"; { - ifstream in(argv[2]); + ifstream in(params.dev_file); assert(in); - while(getline(in, line)) { + while (getline(in, line)) { ++dlc; dev.push_back(read_sentence(line, &d)); dtoks += dev.back().size(); if (dev.back().front() != kSOS && dev.back().back() != kEOS) { - cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + cerr << "Dev sentence in " << params.dev_file << ":" << dlc + << " didn't start or end with , \n"; + cerr << d.convert(dev.back().front()) << ":" + << d.convert(dev.back().back()) << " \n"; + cerr << kSOS << ":" << kEOS << "\n"; abort(); } } cerr << dlc << " lines, " << dtoks << " tokens\n"; } + // Sort the dev sentences in descending order of length (for minibatching) + sort(dev.begin(), dev.end(), comp); + // Pad the sentences in the same batch with EOS so they are the same length + // This modifies the dev objective a bit by making it necessary to + // predict EOS multiple times, but it's easy and not so harmful + for (size_t i = 0; i < dev.size(); i += params.DEV_BATCH_SIZE) + for (size_t j = 1; j < params.DEV_BATCH_SIZE; ++j) + while (dev[i + j].size() < dev[i].size()) + dev[i + j].push_back(kEOS); + // Model name (for saving) ----------------------------------------------------------------------- ostringstream os; - os << "lm" - << '_' << LAYERS - << '_' << INPUT_DIM - << '_' << HIDDEN_DIM - << "-pid" << getpid() << ".params"; + // Store a bunch of information in the model name + os << params.exp_name + << "_" << "rnnlm" + << '_' << params.LAYERS + << '_' << params.INPUT_DIM + << '_' << params.HIDDEN_DIM + << ".params"; const string fname = os.str(); cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; + // Initialize model and trainer ------------------------------------------------------------------ Model model; - Trainer* sgd = nullptr; - sgd = new SimpleSGDTrainer(&model); - sgd->clip_threshold *= BATCH_SIZE; - - RNNLanguageModel lm(model); - if (argc == 4) { - string fname = argv[3]; - ifstream in(fname); + // Use Adam optimizer + Trainer* adam = new AdamTrainer(&model, 0.001, 0.9, 0.999, 1e-8); + adam->clip_threshold *= params.BATCH_SIZE; + + // Create model + RNNBatchLanguageModel lm(model, + params.LAYERS, + params.INPUT_DIM, + params.HIDDEN_DIM, + INPUT_VOCAB_SIZE); + + // Load preexisting weights (if provided) + if (params.model_file != "") { + ifstream in(params.model_file); boost::archive::text_iarchive ia(in); - ia >> model; + ia >> model >> lm; } - unsigned report_every_i = 50; - unsigned dev_every_i_reports = 500; - vector order((training.size()+BATCH_SIZE-1)/BATCH_SIZE); - unsigned si = order.size(); - for (unsigned i = 0; i < order.size(); ++i) order[i] = i*BATCH_SIZE; + // Initialize variables for training ------------------------------------------------------------- + // Best dev score + double best = 9e+99; + + // Number of batches in training set + unsigned num_batches = training.size() / params.BATCH_SIZE - 1; + // Number of batches in validation set + unsigned num_dev_batches = dev.size() / params.DEV_BATCH_SIZE - 1; + + // Number of sentences to sample each epoch (for visualization) + unsigned size_samples = 200; + + // Random indexing + unsigned si; + vector order(num_batches); + for (unsigned i = 0; i < num_batches; ++i) order[i] = i; + bool first = true; - int report = 0; - unsigned lines = 0; - while(1) { - Timer iteration("completed in"); + unsigned epoch = 0; + // Run for the given number of epochs (or indefinitely if params.NUM_EPOCHS is negative) + while (epoch < params.NUM_EPOCHS || params.NUM_EPOCHS < 0) { + // Update the optimizer + if (first) { first = false; } else { adam->update_epoch(); } + // Reshuffle the dataset + cerr << "**SHUFFLE\n"; + random_shuffle(order.begin(), order.end()); + // Initialize loss and number of chars(/word) (for loss per char/word) double loss = 0; - unsigned chars = 0; - for (unsigned i = 0; i < report_every_i; ++i, ++si) { - if (si == order.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - shuffle(order.begin(), order.end(), *rndeng); - } + unsigned tokens = 0; + // Start timer + Timer* iteration = new Timer("completed in"); + + for (si = 0; si < num_batches; ++si) { // build graph for this instance ComputationGraph cg; - unsigned bsize = std::min((unsigned)training.size()-order[si], BATCH_SIZE); // Batch size - Expression loss_expr = lm.BuildLMGraphs(training, order[si], bsize, chars, cg); + // Compute batch start id and size + int id = order[si] * params.BATCH_SIZE; + unsigned bsize = std::min((unsigned)training.size() - id, params.BATCH_SIZE); + // Get negative log likelihood on batch + Expression loss_expr = lm.getNegLogProb(training, id, bsize, tokens, cg); + // Get scalar error for monitoring loss += as_scalar(cg.forward(loss_expr)); + // Compute gradient with backward pass cg.backward(loss_expr); - sgd->update(); - lines += bsize; + // Update parameters + adam->update(); + // Print progress every tenth of the dataset + if ((si + 1) % (num_batches / 10) == 0 || si == num_batches - 1) { + // Print informations + adam->status(); + cerr << " E = " << (loss / tokens) << " ppl=" << exp(loss / tokens) << ' '; + // Reinitialize timer + delete iteration; + iteration = new Timer("completed in"); + // Reinitialize loss + loss = 0; + tokens = 0; + } } - sgd->status(); - cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; - lm.RandomSample(); - // show score on dev data? - report++; - if (report % dev_every_i_reports == 0) { + + // Show score on dev data + if (si == num_batches) { double dloss = 0; - unsigned dchars = 0; - for (unsigned i = 0; i < dev.size(); ++i) { + unsigned dtokens = 0; + for (unsigned i = 0; i < num_dev_batches; ++i) { + // build graph for this instance ComputationGraph cg; - Expression loss_expr = lm.BuildLMGraphs(dev, i, 1, dchars, cg); + // Compute batch start id and size + unsigned id = i * params.DEV_BATCH_SIZE; + unsigned bsize = std::min((unsigned)dev.size() - id, params.DEV_BATCH_SIZE); // Batch size + // Get negative log likelihood on batch + Expression loss_expr = lm.getNegLogProb(dev, id, bsize, dtokens, cg); + // Add loss dloss += as_scalar(cg.forward(loss_expr)); } + // If the dev loss is lower than the previous ones, save the ,odel if (dloss < best) { best = dloss; ofstream out(fname); boost::archive::text_oarchive oa(out); - oa << model; + oa << model << lm; } - cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + // Print informations + cerr << "\n***DEV [epoch=" << (epoch) + << "] E = " << (dloss / dtokens) + << " ppl=" << exp(dloss / dtokens) << ' '; + // Reinitialize timer + delete iteration; + iteration = new Timer("completed in"); } + + // Sample some examples because it's cool (also helps debugging) + cout << "---------------------------------------------" << endl; + lm.RandomSample(d, size_samples); + cout << "---------------------------------------------" << endl; + + // Increment epoch + ++epoch; + } - delete sgd; + + delete adam; + + } diff --git a/examples/rnnlm-batch/train_rnnlm-batch.cc~ b/examples/rnnlm-batch/train_rnnlm-batch.cc~ deleted file mode 100644 index 7d93f2f45..000000000 --- a/examples/rnnlm-batch/train_rnnlm-batch.cc~ +++ /dev/null @@ -1,255 +0,0 @@ -#include "dynet/nodes.h" -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/timing.h" -#include "dynet/rnn.h" -#include "dynet/gru.h" -#include "dynet/lstm.h" -#include "dynet/dict.h" -#include "dynet/expr.h" -#include "getpid.h" - -#include -#include -#include -#include - -#include -#include - -using namespace std; -using namespace dynet; - -unsigned LAYERS = 2; -unsigned INPUT_DIM = 8; //256 -unsigned HIDDEN_DIM = 24; // 1024 -unsigned BATCH_SIZE = 4; -unsigned VOCAB_SIZE = 0; - -dynet::Dict d; -int kSOS; -int kEOS; - -template -struct RNNLanguageModel { - LookupParameter p_c; - Parameter p_R; - Parameter p_bias; - Builder builder; - explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { - p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); - p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); - p_bias = model.add_parameters({VOCAB_SIZE}); - } - - // return Expression of total loss - Expression BuildLMGraphs(const vector >& sents, - unsigned id, - unsigned bsize, - unsigned & chars, - ComputationGraph& cg) { - const unsigned slen = sents[id].size(); - builder.new_graph(cg); // reset RNN builder for new graph - builder.start_new_sequence(); - Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter - Expression i_bias = parameter(cg, p_bias); // word bias - vector errs; - vector last_arr(bsize, sents[0][0]), next_arr(bsize); - for (unsigned t = 1; t < slen; ++t) { - for (unsigned i = 0; i < bsize; ++i) { - next_arr[i] = sents[id+i][t]; - if(next_arr[i] != *sents[id].rbegin()) chars++; // add non-EOS - } - // y_t = RNN(x_t) - Expression i_x_t = lookup(cg, p_c, last_arr); - Expression i_y_t = builder.add_input(i_x_t); - Expression i_r_t = i_bias + i_R * i_y_t; - Expression i_err = pickneglogsoftmax(i_r_t, next_arr); - errs.push_back(i_err); - last_arr = next_arr; - } - Expression i_nerr = sum_batches(sum(errs)); - return i_nerr; - } - - // return Expression for total loss - void RandomSample(int max_len = 150) { - cerr << endl; - ComputationGraph cg; - builder.new_graph(cg); // reset RNN builder for new graph - builder.start_new_sequence(); - - Expression i_R = parameter(cg, p_R); - Expression i_bias = parameter(cg, p_bias); - vector errs; - int len = 0; - int cur = kSOS; - while(len < max_len && cur != kEOS) { - ++len; - Expression i_x_t = lookup(cg, p_c, cur); - // y_t = RNN(x_t) - Expression i_y_t = builder.add_input(i_x_t); - Expression i_r_t = i_bias + i_R * i_y_t; - - Expression ydist = softmax(i_r_t); - - unsigned w = 0; - while (w == 0 || (int)w == kSOS) { - auto dist = as_vector(cg.incremental_forward(ydist)); - double p = rand01(); - for (; w < dist.size(); ++w) { - p -= dist[w]; - if (p < 0.0) { break; } - } - if (w == dist.size()) w = kEOS; - } - cerr << (len == 1 ? "" : " ") << d.convert(w); - cur = w; - } - cerr << endl; - } -}; - -// Sort in descending order of length -struct CompareLen { - bool operator()(const std::vector& first, const std::vector& second) { - return first.size() > second.size(); - } -}; - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - if (argc != 3 && argc != 4) { - cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; - return 1; - } - kSOS = d.convert(""); - kEOS = d.convert(""); - vector> training, dev; - string line; - int tlc = 0; - int ttoks = 0; - cerr << "Reading training data from " << argv[1] << "...\n"; - { - ifstream in(argv[1]); - assert(in); - while(getline(in, line)) { - ++tlc; - training.push_back(read_sentence(line, &d)); - ttoks += training.back().size(); - if (training.back().front() != kSOS && training.back().back() != kEOS) { - cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; - } - d.freeze(); // no new word types allowed - VOCAB_SIZE = d.size(); - - // Sort the training sentences in descending order of length - CompareLen comp; - sort(training.begin(), training.end(), comp); - // Pad the sentences in the same batch with EOS so they are the same length - // This modifies the training objective a bit by making it necessary to - // predict EOS multiple times, but it's easy and not so harmful - for(size_t i = 0; i < training.size(); i += BATCH_SIZE) - for(size_t j = 1; j < BATCH_SIZE; ++j) - while(training[i+j].size() < training[i].size()) - training[i+j].push_back(kEOS); - - int dlc = 0; - int dtoks = 0; - cerr << "Reading dev data from " << argv[2] << "...\n"; - { - ifstream in(argv[2]); - assert(in); - while(getline(in, line)) { - ++dlc; - dev.push_back(read_sentence(line, &d)); - dtoks += dev.back().size(); - if (dev.back().front() != kSOS && dev.back().back() != kEOS) { - cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; - abort(); - } - } - cerr << dlc << " lines, " << dtoks << " tokens\n"; - } - - ostringstream os; - os << "lm" - << '_' << LAYERS - << '_' << INPUT_DIM - << '_' << HIDDEN_DIM - << "-pid" << getpid() << ".params"; - const string fname = os.str(); - cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; - - Model model; - Trainer* sgd = nullptr; - sgd = new SimpleSGDTrainer(&model); - sgd->clip_threshold *= BATCH_SIZE; - - RNNLanguageModel lm(model); - if (argc == 4) { - string fname = argv[3]; - ifstream in(fname); - boost::archive::text_iarchive ia(in); - ia >> model; - } - - unsigned report_every_i = 50; - unsigned dev_every_i_reports = 500; - vector order((training.size()+BATCH_SIZE-1)/BATCH_SIZE); - unsigned si = order.size(); - for (unsigned i = 0; i < order.size(); ++i) order[i] = i*BATCH_SIZE; - bool first = true; - int report = 0; - unsigned lines = 0; - while(1) { - Timer iteration("completed in"); - double loss = 0; - unsigned chars = 0; - for (unsigned i = 0; i < report_every_i; ++i, ++si) { - if (si == order.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - shuffle(order.begin(), order.end(), *rndeng); - } - // build graph for this instance - ComputationGraph cg; - unsigned bsize = std::min((unsigned)training.size()-order[si], BATCH_SIZE); // Batch size - Expression loss_expr = lm.BuildLMGraphs(training, order[si], bsize, chars, cg); - loss += as_scalar(cg.forward(loss_expr)); - cg.backward(loss_expr); - sgd->update(); - lines += bsize; - } - sgd->status(); - cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; - lm.RandomSample(); - - // show score on dev data? - report++; - if (report % dev_every_i_reports == 0) { - double dloss = 0; - unsigned dchars = 0; - for (unsigned i = 0; i < dev.size(); ++i) { - ComputationGraph cg; - Expression loss_expr = lm.BuildLMGraphs(dev, i, 1, dchars, cg); - dloss += as_scalar(cg.forward(loss_expr)); - } - if (dloss < best) { - best = dloss; - ofstream out(fname); - boost::archive::text_oarchive oa(out); - oa << model; - } - cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; - } - } - delete sgd; -} - diff --git a/examples/tag-bilstm/train_tag-bilstm.cc~ b/examples/tag-bilstm/train_tag-bilstm.cc~ deleted file mode 100644 index 33ab18538..000000000 --- a/examples/tag-bilstm/train_tag-bilstm.cc~ +++ /dev/null @@ -1,261 +0,0 @@ -#include "dynet/nodes.h" -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/timing.h" -#include "dynet/rnn.h" -#include "dynet/gru.h" -#include "dynet/lstm.h" -#include "dynet/dict.h" -#include "dynet/expr.h" -#include "getpid.h" - -#include -#include -#include - -#include -#include - -using namespace std; -using namespace dynet; - -float pdrop = 0.5; -unsigned LAYERS = 1; -unsigned INPUT_DIM = 128; -unsigned HIDDEN_DIM = 128; -unsigned TAG_HIDDEN_DIM = 32; -unsigned TAG_DIM = 32; -unsigned TAG_SIZE = 0; -unsigned VOCAB_SIZE = 0; - -bool eval = false; -dynet::Dict d; -dynet::Dict td; -int kNONE; -int kSOS; -int kEOS; - -template -struct RNNLanguageModel { - LookupParameter p_w; - Parameter p_l2th; - Parameter p_r2th; - Parameter p_thbias; - - Parameter p_th2t; - Parameter p_tbias; - Builder l2rbuilder; - Builder r2lbuilder; - explicit RNNLanguageModel(Model& model) : - l2rbuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), - r2lbuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { - p_w = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); - p_l2th = model.add_parameters({TAG_HIDDEN_DIM, HIDDEN_DIM}); - p_r2th = model.add_parameters({TAG_HIDDEN_DIM, HIDDEN_DIM}); - p_thbias = model.add_parameters({TAG_HIDDEN_DIM}); - - p_th2t = model.add_parameters({TAG_SIZE, TAG_HIDDEN_DIM}); - p_tbias = model.add_parameters({TAG_SIZE}); - } - - // return Expression of total loss - Expression BuildTaggingGraph(const vector& sent, const vector& tags, ComputationGraph& cg, double* cor = 0, unsigned* ntagged = 0) { - const unsigned slen = sent.size(); - l2rbuilder.new_graph(cg); // reset RNN builder for new graph - l2rbuilder.start_new_sequence(); - r2lbuilder.new_graph(cg); // reset RNN builder for new graph - r2lbuilder.start_new_sequence(); - Expression i_l2th = parameter(cg, p_l2th); - Expression i_r2th = parameter(cg, p_r2th); - Expression i_thbias = parameter(cg, p_thbias); - Expression i_th2t = parameter(cg, p_th2t); - Expression i_tbias = parameter(cg, p_tbias); - vector errs; - vector i_words(slen); - vector fwds(slen); - vector revs(slen); - - // read sequence from left to right - l2rbuilder.add_input(lookup(cg, p_w, kSOS)); - for (unsigned t = 0; t < slen; ++t) { - i_words[t] = lookup(cg, p_w, sent[t]); - if (!eval) { i_words[t] = noise(i_words[t], 0.1); } - fwds[t] = l2rbuilder.add_input(i_words[t]); - } - - // read sequence from right to left - r2lbuilder.add_input(lookup(cg, p_w, kEOS)); - for (unsigned t = 0; t < slen; ++t) - revs[slen - t - 1] = r2lbuilder.add_input(i_words[slen - t - 1]); - - for (unsigned t = 0; t < slen; ++t) { - if (tags[t] != kNONE) { - if (ntagged) (*ntagged)++; - Expression i_th = tanh(affine_transform({i_thbias, i_l2th, fwds[t], i_r2th, revs[t]})); - //if (!eval) { i_th = dropout(i_th, pdrop); } - Expression i_t = affine_transform({i_tbias, i_th2t, i_th}); - if (cor) { - vector dist = as_vector(cg.incremental_forward(i_t)); - double best = -9e99; - int besti = -1; - for (int i = 0; i < dist.size(); ++i) { - if (dist[i] > best) { best = dist[i]; besti = i; } - } - if (tags[t] == besti) (*cor)++; - } - if (tags[t] != kNONE) { - Expression i_err = pickneglogsoftmax(i_t, tags[t]); - errs.push_back(i_err); - } - } - } - return sum(errs); - } -}; - -int main(int argc, char** argv) { - dynet::initialize(argc, argv); - if (argc != 3 && argc != 4) { - cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; - return 1; - } - kNONE = td.convert("*"); - kSOS = d.convert(""); - kEOS = d.convert(""); - vector,vector>> training, dev; - string line; - int tlc = 0; - int ttoks = 0; - cerr << "Reading training data from " << argv[1] << "...\n"; - { - ifstream in(argv[1]); - assert(in); - while(getline(in, line)) { - ++tlc; - int nc = 0; - vector x,y; - read_sentence_pair(line, &x, &d, &y, &td); - assert(x.size() == y.size()); - if (x.size() == 0) { cerr << line << endl; abort(); } - training.push_back(make_pair(x,y)); - for (unsigned i = 0; i < y.size(); ++i) { - if (y[i] != kNONE) { ++nc; } - } - if (nc == 0) { - cerr << "No tagged tokens in line " << tlc << endl; - abort(); - } - ttoks += x.size(); - } - cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; - cerr << "Tags: " << td.size() << endl; - } - d.freeze(); // no new word types allowed - td.freeze(); // no new tag types allowed - VOCAB_SIZE = d.size(); - TAG_SIZE = td.size(); - - int dlc = 0; - int dtoks = 0; - cerr << "Reading dev data from " << argv[2] << "...\n"; - { - ifstream in(argv[2]); - assert(in); - while(getline(in, line)) { - ++dlc; - vector x,y; - read_sentence_pair(line, &x, &d, &y, &td); - assert(x.size() == y.size()); - dev.push_back(make_pair(x,y)); - dtoks += x.size(); - } - cerr << dlc << " lines, " << dtoks << " tokens\n"; - } - ostringstream os; - os << "tagger" - << '_' << LAYERS - << '_' << INPUT_DIM - << '_' << HIDDEN_DIM - << "-pid" << getpid() << ".params"; - const string fname = os.str(); - cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; - - Model model; - bool use_momentum = true; - Trainer* sgd = nullptr; - if (use_momentum) - sgd = new MomentumSGDTrainer(&model); - else - sgd = new SimpleSGDTrainer(&model); - - RNNLanguageModel lm(model); - //RNNLanguageModel lm(model); - if (argc == 4) { - string fname = argv[3]; - ifstream in(fname); - boost::archive::text_iarchive ia(in); - ia >> model; - } - - unsigned report_every_i = 50; - unsigned dev_every_i_reports = 25; - unsigned si = training.size(); - vector order(training.size()); - for (unsigned i = 0; i < order.size(); ++i) order[i] = i; - bool first = true; - int report = 0; - unsigned lines = 0; - while(1) { - Timer iteration("completed in"); - double loss = 0; - unsigned ttags = 0; - double correct = 0; - for (unsigned i = 0; i < report_every_i; ++i) { - if (si == training.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - shuffle(order.begin(), order.end(), *rndeng); - } - - // build graph for this instance - ComputationGraph cg; - auto& sent = training[order[si]]; - ++si; - Expression loss_expr = lm.BuildTaggingGraph(sent.first, sent.second, cg, &correct, &ttags); - loss += as_scalar(cg.forward(loss_expr)); - cg.backward(loss_expr); - sgd->update(1.0); - ++lines; - } - sgd->status(); - cerr << " E = " << (loss / ttags) << " ppl=" << exp(loss / ttags) << " (acc=" << (correct / ttags) << ") "; - - // show score on dev data? - report++; - if (report % dev_every_i_reports == 0) { - double dloss = 0; - unsigned dtags = 0; - double dcorr = 0; - eval = true; - //lm.p_th2t->scale_parameters(pdrop); - for (auto& sent : dev) { - ComputationGraph cg; - Expression loss_expr = lm.BuildTaggingGraph(sent.first, sent.second, cg, &dcorr, &dtags); - dloss += as_scalar(cg.forward(loss_expr)); - } - //lm.p_th2t->scale_parameters(1/pdrop); - eval = false; - if (dloss < best) { - best = dloss; - ofstream out(fname); - boost::archive::text_oarchive oa(out); - oa << model; - } - cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dtags) << " ppl=" << exp(dloss / dtags) << " acc=" << (dcorr / dtags) << ' '; - } - } - delete sgd; -} - diff --git a/examples/utils/cl-args.h b/examples/utils/cl-args.h index 8e15b9e86..5636424cb 100644 --- a/examples/utils/cl-args.h +++ b/examples/utils/cl-args.h @@ -3,7 +3,7 @@ #include #include -enum Task {TRAIN, ANALYSIS}; +enum Task {TRAIN, TEST}; struct Params { string exp_name = "encdec"; @@ -19,8 +19,6 @@ struct Params { unsigned DEV_BATCH_SIZE = 16; int NUM_EPOCHS = -1; bool bidirectionnal = false; - bool cust_l2 = false; - bool dist_penalty = false; }; void get_args(int argc, @@ -120,10 +118,6 @@ void get_args(int argc, i++; } else if (arg == "--bidirectionnal" || arg == "-bid") { params.bidirectionnal = true; - } else if (arg == "--cust_l2" || arg == "-cl2") { - params.cust_l2 = true; - } else if (arg == "--dist_penalty" || arg == "-dp") { - params.dist_penalty = true; } i++; } @@ -132,10 +126,5 @@ void get_args(int argc, std::cerr << "Usage: " << argv[0] << " -t train.txt -d dev.txt\n"; abort(); } - } else if (task == ANALYSIS) { - if (params.dic_file == "" || params.test_file == "" || params.model_file == "") { - std::cerr << "Usage: " << argv[0] << " -dic corpus_dic.txt -ts test.txt -m model.params\n"; - abort(); - } } -} +} \ No newline at end of file From e7738aae997f1743d2477c6b0e6c00e44bde0f32 Mon Sep 17 00:00:00 2001 From: paul Date: Tue, 6 Dec 2016 12:00:50 -0500 Subject: [PATCH 872/965] Put rnnlm in examples to clean the root directory --- {rnnlm => examples/rnnlm}/README.md | 6 +- {rnnlm => examples/rnnlm}/install-examples.sh | 0 examples/rnnlm/train_rnnlm.cc | 451 ++++++++++++------ rnnlm/CMakeLists.txt | 15 - rnnlm/lm.cc | 398 ---------------- 5 files changed, 303 insertions(+), 567 deletions(-) rename {rnnlm => examples/rnnlm}/README.md (72%) rename {rnnlm => examples/rnnlm}/install-examples.sh (100%) delete mode 100644 rnnlm/CMakeLists.txt delete mode 100644 rnnlm/lm.cc diff --git a/rnnlm/README.md b/examples/rnnlm/README.md similarity index 72% rename from rnnlm/README.md rename to examples/rnnlm/README.md index ff95effbe..f2069b888 100644 --- a/rnnlm/README.md +++ b/examples/rnnlm/README.md @@ -8,19 +8,19 @@ This downloads the data used in this tutorial. Train an LSTM LM using a class-factor softmax: - ./rnnlm/lm -x -s -t ../rnnlm/ptb-mikolov/train.txt -d ../rnnlm/ptb-mikolov/valid.txt \ + ./train_rnnlm -x -s -t ../rnnlm/ptb-mikolov/train.txt -d ../rnnlm/ptb-mikolov/valid.txt \ -c ../rnnlm/ptb-mikolov/clusters-mkcls.txt -D 0.3 -H 256 --eta_decay_onset_epoch 10 --eta_decay_rate 0.5 Train an LSTM LM with a standard softmax: - ./rnnlm/lm -x -s -t ../rnnlm/ptb-mikolov/train.txt -d ../rnnlm/ptb-mikolov/valid.txt \ + ./train_rnnlm -x -s -t ../rnnlm/ptb-mikolov/train.txt -d ../rnnlm/ptb-mikolov/valid.txt \ -D 0.3 -H 256 --eta_decay_onset_epoch 10 --eta_decay_rate 0.5 ### Evaluation example Evaluate a trained model: - ./rnnlm/lm -t ../rnnlm/ptb-mikolov/train.txt -c ../rnnlm/ptb-mikolov/clusters-mkcls.txt \ + ./train_rnnlm -t ../rnnlm/ptb-mikolov/train.txt -c ../rnnlm/ptb-mikolov/clusters-mkcls.txt \ -m lm_0.3_2_128_256-pid7865.params -H 256 -p ../rnnlm/ptb-mikolov/test.txt ### PTB Baselines diff --git a/rnnlm/install-examples.sh b/examples/rnnlm/install-examples.sh similarity index 100% rename from rnnlm/install-examples.sh rename to examples/rnnlm/install-examples.sh diff --git a/examples/rnnlm/train_rnnlm.cc b/examples/rnnlm/train_rnnlm.cc index 9750b7309..67c63610f 100644 --- a/examples/rnnlm/train_rnnlm.cc +++ b/examples/rnnlm/train_rnnlm.cc @@ -7,27 +7,72 @@ #include "dynet/lstm.h" #include "dynet/dict.h" #include "dynet/expr.h" -#include "../utils/getpid.h" +#include "dynet/cfsm-builder.h" +#include "dynet/hsm-builder.h" +#include "../examples/utils/getpid.h" #include #include +#include #include -#include -#include +#include +#include +#include +#include +#include using namespace std; using namespace dynet; -unsigned LAYERS = 2; -unsigned INPUT_DIM = 8; //256 -unsigned HIDDEN_DIM = 24; // 1024 +unsigned LAYERS = 0; +unsigned INPUT_DIM = 0; +unsigned HIDDEN_DIM = 0; unsigned VOCAB_SIZE = 0; +float DROPOUT = 0; +bool SAMPLE = false; +SoftmaxBuilder* cfsm = nullptr; dynet::Dict d; int kSOS; int kEOS; +volatile bool INTERRUPTED = false; + +namespace po = boost::program_options; +void InitCommandLine(int argc, char** argv, po::variables_map* conf) { + po::options_description opts("Configuration options"); + opts.add_options() + ("train,t", po::value(), "training corpus") + ("dev,d", po::value(), "development/validation corpus") + ("test,p", po::value(), "test corpus") + ("nbest", po::value(), "N-best list to score (- for stdin)") + ("learn,x", "set this to estimate the language model from the training data") + ("clusters,c", po::value(), "word cluster file for class factored softmax") + ("paths,b", po::value(), "word paths file for hierarchical softmax") + ("sample,s", "periodically generate random samples from model as it trains (recommended)") + ("model,m", po::value(), "load model from this file") + ("input_dim,i", po::value()->default_value(128), "input embedding dimension") + ("hidden_dim,H", po::value()->default_value(128), "hidden layer size") + ("layers,l", po::value()->default_value(2), "number of layers in RNN") + ("dropout,D", po::value(), "dropout rate (recommended between 0.2 and 0.5)") + ("eta0,e", po::value()->default_value(0.1f), "initial learning rate") + ("eta_decay_onset_epoch", po::value(), "start decaying eta every epoch after this epoch (try 8)") + ("eta_decay_rate", po::value(), "how much to decay eta by (recommended 0.5)") + ("help,h", "Help"); + po::options_description dcmdline_options; + dcmdline_options.add(opts); + po::store(parse_command_line(argc, argv, dcmdline_options), *conf); + if (conf->count("help")) { + cerr << dcmdline_options << endl; + exit(1); + } + if (conf->count("train") == 0) { + cerr << "Training data must always be specified (it determines the vocab mapping) with --train\n"; + exit(1); + } +} + template struct RNNLanguageModel { LookupParameter p_c; @@ -41,209 +86,313 @@ struct RNNLanguageModel { } // return Expression of total loss - Expression BuildLMGraph(const vector& sent, ComputationGraph& cg) { - const unsigned slen = sent.size() - 1; + Expression BuildLMGraph(const vector& sent, ComputationGraph& cg, bool apply_dropout) { + const unsigned slen = sent.size(); + if (apply_dropout) { + builder.set_dropout(DROPOUT); + } else { + builder.disable_dropout(); + } builder.new_graph(cg); // reset RNN builder for new graph builder.start_new_sequence(); - Expression i_R = parameter(cg, p_R); // hidden -> word rep parameter - Expression i_bias = parameter(cg, p_bias); // word bias - vector errs; - for (unsigned t = 0; t < slen; ++t) { - Expression i_x_t = lookup(cg, p_c, sent[t]); - // y_t = RNN(x_t) - Expression i_y_t = builder.add_input(i_x_t); - Expression i_r_t = i_bias + i_R * i_y_t; - - // LogSoftmax followed by PickElement can be written in one step - // using PickNegLogSoftmax -#if 0 - Expression i_ydist = logsoftmax(i_r_t); - errs.push_back(pick(i_ydist, sent[t+1])); -#if 0 - Expression i_ydist = softmax(i_r_t); - i_ydist = log(i_ydist) - errs.push_back(pick(i_ydist, sent[t+1])); -#endif -#else - Expression i_err = pickneglogsoftmax(i_r_t, sent[t+1]); - errs.push_back(i_err); -#endif + if (cfsm) cfsm->new_graph(cg); + Expression R = parameter(cg, p_R); // hidden -> word rep parameter + Expression bias = parameter(cg, p_bias); // word bias + vector errs(slen + 1); + Expression h_t = builder.add_input(lookup(cg, p_c, kSOS)); // read + for (unsigned t = 0; t < slen; ++t) { // h_t = RNN(x_0,...,x_t) + if (cfsm) { // class-factored softmax + errs[t] = cfsm->neg_log_softmax(h_t, sent[t]); + } else { // regular softmax + Expression u_t = affine_transform({bias, R, h_t}); + errs[t] = pickneglogsoftmax(u_t, sent[t]); + } + Expression x_t = lookup(cg, p_c, sent[t]); + h_t = builder.add_input(x_t); + } + // it reamins to deal predict + if (cfsm) { + errs.back() = cfsm->neg_log_softmax(h_t, kEOS); + } else { + Expression u_last = affine_transform({bias, R, h_t}); + errs.back() = pickneglogsoftmax(u_last, kEOS); // predict } - Expression i_nerr = sum(errs); -#if 0 - return -i_nerr; -#else - return i_nerr; -#endif + return sum(errs); } - // return Expression for total loss - void RandomSample(int max_len = 150) { - cerr << endl; + void RandomSample(int max_len = 200) { ComputationGraph cg; builder.new_graph(cg); // reset RNN builder for new graph builder.start_new_sequence(); - - Expression i_R = parameter(cg, p_R); - Expression i_bias = parameter(cg, p_bias); - vector errs; - int len = 0; + if (cfsm) cfsm->new_graph(cg); + Expression R = parameter(cg, p_R); // hidden -> word rep parameter + Expression bias = parameter(cg, p_bias); // word bias + Expression h_t = builder.add_input(lookup(cg, p_c, kSOS)); // read int cur = kSOS; - while(len < max_len && cur != kEOS) { - ++len; - Expression i_x_t = lookup(cg, p_c, cur); - // y_t = RNN(x_t) - Expression i_y_t = builder.add_input(i_x_t); - Expression i_r_t = i_bias + i_R * i_y_t; - - Expression ydist = softmax(i_r_t); - - unsigned w = 0; - while (w == 0 || (int)w == kSOS) { - auto dist = as_vector(cg.incremental_forward(ydist)); + int len = 0; + while(len < max_len) { + if (cfsm) { // class-factored softmax + cur = cfsm->sample(h_t); + } else { // regular softmax + Expression u_t = affine_transform({bias, R, h_t}); + Expression dist_expr = softmax(u_t); + auto dist = as_vector(cg.incremental_forward(dist_expr)); double p = rand01(); - for (; w < dist.size(); ++w) { - p -= dist[w]; + cur = 0; + for (; cur < dist.size(); ++cur) { + p -= dist[cur]; if (p < 0.0) { break; } } - if (w == dist.size()) w = kEOS; + if (cur == dist.size()) cur = kEOS; } - cerr << (len == 1 ? "" : " ") << d.convert(w); - cur = w; + if (cur == kEOS) break; + ++len; + cerr << (len == 1 ? "" : " ") << d.convert(cur); + Expression x_t = lookup(cg, p_c, cur); + h_t = builder.add_input(x_t); } cerr << endl; } }; int main(int argc, char** argv) { + cerr << "COMMAND LINE:"; + for (unsigned i = 0; i < static_cast(argc); ++i) cerr << ' ' << argv[i]; + cerr << endl; dynet::initialize(argc, argv); - if (argc != 3 && argc != 4) { - cerr << "Usage: " << argv[0] << " corpus.txt dev.txt [model.params]\n"; - return 1; - } + po::variables_map conf; + InitCommandLine(argc, argv, &conf); kSOS = d.convert(""); kEOS = d.convert(""); - vector> training, dev; + LAYERS = conf["layers"].as(); + INPUT_DIM = conf["input_dim"].as(); + HIDDEN_DIM = conf["hidden_dim"].as(); + SAMPLE = conf.count("sample"); + if (conf.count("dropout")) + DROPOUT = conf["dropout"].as(); + Model model; + if (conf.count("clusters")) + cfsm = new ClassFactoredSoftmaxBuilder(HIDDEN_DIM, conf["clusters"].as(), &d, &model); + else if (conf.count("paths")) + cfsm = new HierarchicalSoftmaxBuilder(HIDDEN_DIM, conf["paths"].as(), &d, &model); + float eta_decay_rate = 1; + unsigned eta_decay_onset_epoch = 0; + if (conf.count("eta_decay_onset_epoch")) + eta_decay_onset_epoch = conf["eta_decay_onset_epoch"].as(); + if (conf.count("eta_decay_rate")) + eta_decay_rate = conf["eta_decay_rate"].as(); + vector> training, dev, test; string line; int tlc = 0; int ttoks = 0; - cerr << "Reading training data from " << argv[1] << "...\n"; { - ifstream in(argv[1]); + string trainf = conf["train"].as(); + cerr << "Reading training data from " << trainf << " ...\n"; + ifstream in(trainf); assert(in); while(getline(in, line)) { ++tlc; training.push_back(read_sentence(line, &d)); ttoks += training.back().size(); - if (training.back().front() != kSOS && training.back().back() != kEOS) { - cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; + if (training.back().front() == kSOS || training.back().back() == kEOS) { + cerr << "Training sentence in " << argv[1] << ":" << tlc << " started with or ended with \n"; abort(); } } cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; } d.freeze(); // no new word types allowed + d.set_unk(""); VOCAB_SIZE = d.size(); + if (!cfsm) + cfsm = new StandardSoftmaxBuilder(HIDDEN_DIM, VOCAB_SIZE, &model); - int dlc = 0; - int dtoks = 0; - cerr << "Reading dev data from " << argv[2] << "...\n"; - { - ifstream in(argv[2]); + if (conf.count("test")) { + string testf = conf["test"].as(); + cerr << "Reading test data from " << testf << " ...\n"; + ifstream in(testf); assert(in); while(getline(in, line)) { - ++dlc; - dev.push_back(read_sentence(line, &d)); - dtoks += dev.back().size(); - if (dev.back().front() != kSOS && dev.back().back() != kEOS) { - cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; + test.push_back(read_sentence(line, &d)); + if (test.back().front() == kSOS || test.back().back() == kEOS) { + cerr << "Test sentence in " << argv[2] << ":" << tlc << " started with or ended with \n"; abort(); } } - cerr << dlc << " lines, " << dtoks << " tokens\n"; } - ostringstream os; - os << "lm" - << '_' << LAYERS - << '_' << INPUT_DIM - << '_' << HIDDEN_DIM - << "-pid" << getpid() << ".params"; - const string fname = os.str(); - cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; - - Model model; - Trainer* sgd = nullptr; - // bool use_momentum = false; - // if (use_momentum) - // sgd = new MomentumSGDTrainer(&model); - // else - sgd = new SimpleSGDTrainer(&model); + Trainer* sgd = new SimpleSGDTrainer(&model); + sgd->eta0 = sgd->eta = conf["eta0"].as(); RNNLanguageModel lm(model); - //RNNLanguageModel lm(model); - if (argc == 4) { - string fname = argv[3]; + + bool has_model_to_load = conf.count("model"); + if (has_model_to_load) { + string fname = conf["model"].as(); + cerr << "Reading parameters from " << fname << "...\n"; ifstream in(fname); - boost::archive::text_iarchive ia(in); + assert(in); + boost::archive::binary_iarchive ia(in); ia >> model; } - unsigned report_every_i = 50; - unsigned dev_every_i_reports = 500; - unsigned si = training.size(); - vector order(training.size()); - for (unsigned i = 0; i < order.size(); ++i) order[i] = i; - bool first = true; - int report = 0; - unsigned lines = 0; - while(1) { - Timer iteration("completed in"); - double loss = 0; - unsigned chars = 0; - for (unsigned i = 0; i < report_every_i; ++i) { - if (si == training.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - shuffle(order.begin(), order.end(), *rndeng); + bool LEARN = conf.count("learn"); + + if (LEARN) { + int dlc = 0; + int dtoks = 0; + if (conf.count("dev") == 0) { + cerr << "You must specify a development set (--dev file.txt) with --learn" << endl; + abort(); + } else { + string devf = conf["dev"].as(); + cerr << "Reading dev data from " << devf << " ...\n"; + ifstream in(devf); + assert(in); + while(getline(in, line)) { + ++dlc; + dev.push_back(read_sentence(line, &d)); + dtoks += dev.back().size(); + if (dev.back().front() == kSOS || dev.back().back() == kEOS) { + cerr << "Dev sentence in " << argv[2] << ":" << tlc << " started with or ended with \n"; + abort(); + } + } + cerr << dlc << " lines, " << dtoks << " tokens\n"; + } + ostringstream os; + os << "lm" + << '_' << DROPOUT + << '_' << LAYERS + << '_' << INPUT_DIM + << '_' << HIDDEN_DIM + << "-pid" << getpid() << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + double best = 9e+99; + unsigned report_every_i = 100; + unsigned dev_every_i_reports = 25; + unsigned si = training.size(); + if (report_every_i > si) report_every_i = si; + vector order(training.size()); + for (unsigned i = 0; i < order.size(); ++i) order[i] = i; + bool first = true; + int report = 0; + double lines = 0; + int completed_epoch = -1; + while(!INTERRUPTED) { + if (SAMPLE) lm.RandomSample(); + Timer iteration("completed in"); + double loss = 0; + unsigned chars = 0; + for (unsigned i = 0; i < report_every_i; ++i) { + if (si == training.size()) { + si = 0; + if (first) { first = false; } else { sgd->update_epoch(); } + cerr << "**SHUFFLE\n"; + completed_epoch++; + if (eta_decay_onset_epoch && completed_epoch >= (int)eta_decay_onset_epoch) + sgd->eta *= eta_decay_rate; + shuffle(order.begin(), order.end(), *rndeng); + } + + // build graph for this instance + ComputationGraph cg; + auto& sent = training[order[si]]; + chars += sent.size(); + ++si; + Expression loss_expr = lm.BuildLMGraph(sent, cg, DROPOUT > 0.f); + loss += as_scalar(cg.forward(loss_expr)); + cg.backward(loss_expr); + sgd->update(); + ++lines; } + report++; + cerr << '#' << report << " [epoch=" << (lines / training.size()) << " eta=" << sgd->eta << "] E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; - // build graph for this instance + // show score on dev data? + if (report % dev_every_i_reports == 0) { + double dloss = 0; + int dchars = 0; + for (auto& sent : dev) { + ComputationGraph cg; + Expression loss_expr = lm.BuildLMGraph(sent, cg, false); + dloss += as_scalar(cg.forward(loss_expr)); + dchars += sent.size(); + } + if (dloss < best) { + best = dloss; + ofstream out(fname); + boost::archive::binary_oarchive oa(out); + oa << model; + } + cerr << "\n***DEV [epoch=" << (lines / training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + } + } + } // train? + if (conf.count("test")) { + cerr << "Evaluating test data...\n"; + double tloss = 0; + int tchars = 0; + for (auto& sent : test) { ComputationGraph cg; - auto& sent = training[order[si]]; - chars += sent.size() - 1; - ++si; - Expression loss_expr = lm.BuildLMGraph(sent, cg); - loss += as_scalar(cg.forward(loss_expr)); - cg.backward(loss_expr); - sgd->update(); - ++lines; + Expression loss_expr = lm.BuildLMGraph(sent, cg, false); + tloss += as_scalar(cg.forward(loss_expr)); + tchars += sent.size(); } - sgd->status(); - cerr << " E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; - lm.RandomSample(); - - // show score on dev data? - report++; - if (report % dev_every_i_reports == 0) { - double dloss = 0; - int dchars = 0; - for (auto& sent : dev) { - ComputationGraph cg; - Expression loss_expr = lm.BuildLMGraph(sent, cg); - dloss += as_scalar(cg.forward(loss_expr)); - dchars += sent.size() - 1; + cerr << "TEST -LLH = " << tloss << endl; + cerr << "TEST CROSS ENTOPY (NATS) = " << (tloss / tchars) << endl; + cerr << "TEST PPL = " << exp(tloss / tchars) << endl; + } + + // N-best scoring + if (conf.count("nbest")) { + // cdec: index ||| hypothesis ||| feature=val ... ||| ... + // Moses: index ||| hypothesis ||| feature= val(s) ... ||| ... + const int HYP_FIELD = 1; + const int FEAT_FIELD = 2; + const string FEAT_NAME = "RNNLM"; + // Input + string nbestf = conf["nbest"].as(); + cerr << "Scoring N-best list " << nbestf << " ..." << endl; + shared_ptr in; + if (nbestf == "-") { + in.reset(&cin, [](...){}); + } else { + in.reset(new ifstream(nbestf)); + } + // Split on |||, consume whitespace + boost::regex delim("\\s*\\|\\|\\|\\s*"); + boost::sregex_token_iterator end; + // Match spacing of input file + string sep = "="; + bool sep_detected = false; + // Input lines + while (getline(*in, line)) { + vector fields; + boost::sregex_token_iterator it(line.begin(), line.end(), delim, -1); + while (it != end) { + fields.push_back(*it++); } - if (dloss < best) { - best = dloss; - ofstream out(fname); - boost::archive::text_oarchive oa(out); - oa << model; + // Check sep if needed + if (!sep_detected) { + sep_detected = true; + int i = fields[FEAT_FIELD].find("="); + if (fields[FEAT_FIELD].substr(i + 1, 1) == " ") { + sep = "= "; + } } - cerr << "\n***DEV [epoch=" << (lines / (double)training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; + // Score hypothesis + ComputationGraph cg; + Expression loss_expr = lm.BuildLMGraph(read_sentence(fields[HYP_FIELD], &d), cg, false); + double loss = as_scalar(cg.forward(loss_expr)); + // Add score + ostringstream os; + os << fields[FEAT_FIELD] << " " << FEAT_NAME << sep << loss; + fields[FEAT_FIELD] = os.str(); + // Write augmented line + cout << boost::algorithm::join(fields, " ||| ") << endl; } } + delete sgd; } - diff --git a/rnnlm/CMakeLists.txt b/rnnlm/CMakeLists.txt deleted file mode 100644 index 5c112d681..000000000 --- a/rnnlm/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.8) - -foreach(TARGET lm) - ADD_EXECUTABLE(${TARGET} ${TARGET}.cc) - target_link_libraries(${TARGET} dynet ${LIBS}) - if(UNIX AND NOT APPLE) - target_link_libraries(${TARGET} rt) - endif() - if (WITH_CUDA_BACKEND) - add_dependencies(${TARGET} dynetcuda) - target_link_libraries(${TARGET} dynetcuda) - CUDA_ADD_CUBLAS_TO_TARGET(${TARGET}) - endif (WITH_CUDA_BACKEND) -endforeach() - diff --git a/rnnlm/lm.cc b/rnnlm/lm.cc deleted file mode 100644 index 67c63610f..000000000 --- a/rnnlm/lm.cc +++ /dev/null @@ -1,398 +0,0 @@ -#include "dynet/nodes.h" -#include "dynet/dynet.h" -#include "dynet/training.h" -#include "dynet/timing.h" -#include "dynet/rnn.h" -#include "dynet/gru.h" -#include "dynet/lstm.h" -#include "dynet/dict.h" -#include "dynet/expr.h" -#include "dynet/cfsm-builder.h" -#include "dynet/hsm-builder.h" -#include "../examples/utils/getpid.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -using namespace std; -using namespace dynet; - -unsigned LAYERS = 0; -unsigned INPUT_DIM = 0; -unsigned HIDDEN_DIM = 0; -unsigned VOCAB_SIZE = 0; -float DROPOUT = 0; -bool SAMPLE = false; -SoftmaxBuilder* cfsm = nullptr; - -dynet::Dict d; -int kSOS; -int kEOS; - -volatile bool INTERRUPTED = false; - -namespace po = boost::program_options; -void InitCommandLine(int argc, char** argv, po::variables_map* conf) { - po::options_description opts("Configuration options"); - opts.add_options() - ("train,t", po::value(), "training corpus") - ("dev,d", po::value(), "development/validation corpus") - ("test,p", po::value(), "test corpus") - ("nbest", po::value(), "N-best list to score (- for stdin)") - ("learn,x", "set this to estimate the language model from the training data") - ("clusters,c", po::value(), "word cluster file for class factored softmax") - ("paths,b", po::value(), "word paths file for hierarchical softmax") - ("sample,s", "periodically generate random samples from model as it trains (recommended)") - ("model,m", po::value(), "load model from this file") - ("input_dim,i", po::value()->default_value(128), "input embedding dimension") - ("hidden_dim,H", po::value()->default_value(128), "hidden layer size") - ("layers,l", po::value()->default_value(2), "number of layers in RNN") - ("dropout,D", po::value(), "dropout rate (recommended between 0.2 and 0.5)") - ("eta0,e", po::value()->default_value(0.1f), "initial learning rate") - ("eta_decay_onset_epoch", po::value(), "start decaying eta every epoch after this epoch (try 8)") - ("eta_decay_rate", po::value(), "how much to decay eta by (recommended 0.5)") - ("help,h", "Help"); - po::options_description dcmdline_options; - dcmdline_options.add(opts); - po::store(parse_command_line(argc, argv, dcmdline_options), *conf); - if (conf->count("help")) { - cerr << dcmdline_options << endl; - exit(1); - } - if (conf->count("train") == 0) { - cerr << "Training data must always be specified (it determines the vocab mapping) with --train\n"; - exit(1); - } -} - -template -struct RNNLanguageModel { - LookupParameter p_c; - Parameter p_R; - Parameter p_bias; - Builder builder; - explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { - p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); - p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); - p_bias = model.add_parameters({VOCAB_SIZE}); - } - - // return Expression of total loss - Expression BuildLMGraph(const vector& sent, ComputationGraph& cg, bool apply_dropout) { - const unsigned slen = sent.size(); - if (apply_dropout) { - builder.set_dropout(DROPOUT); - } else { - builder.disable_dropout(); - } - builder.new_graph(cg); // reset RNN builder for new graph - builder.start_new_sequence(); - if (cfsm) cfsm->new_graph(cg); - Expression R = parameter(cg, p_R); // hidden -> word rep parameter - Expression bias = parameter(cg, p_bias); // word bias - vector errs(slen + 1); - Expression h_t = builder.add_input(lookup(cg, p_c, kSOS)); // read - for (unsigned t = 0; t < slen; ++t) { // h_t = RNN(x_0,...,x_t) - if (cfsm) { // class-factored softmax - errs[t] = cfsm->neg_log_softmax(h_t, sent[t]); - } else { // regular softmax - Expression u_t = affine_transform({bias, R, h_t}); - errs[t] = pickneglogsoftmax(u_t, sent[t]); - } - Expression x_t = lookup(cg, p_c, sent[t]); - h_t = builder.add_input(x_t); - } - // it reamins to deal predict - if (cfsm) { - errs.back() = cfsm->neg_log_softmax(h_t, kEOS); - } else { - Expression u_last = affine_transform({bias, R, h_t}); - errs.back() = pickneglogsoftmax(u_last, kEOS); // predict - } - return sum(errs); - } - - void RandomSample(int max_len = 200) { - ComputationGraph cg; - builder.new_graph(cg); // reset RNN builder for new graph - builder.start_new_sequence(); - if (cfsm) cfsm->new_graph(cg); - Expression R = parameter(cg, p_R); // hidden -> word rep parameter - Expression bias = parameter(cg, p_bias); // word bias - Expression h_t = builder.add_input(lookup(cg, p_c, kSOS)); // read - int cur = kSOS; - int len = 0; - while(len < max_len) { - if (cfsm) { // class-factored softmax - cur = cfsm->sample(h_t); - } else { // regular softmax - Expression u_t = affine_transform({bias, R, h_t}); - Expression dist_expr = softmax(u_t); - auto dist = as_vector(cg.incremental_forward(dist_expr)); - double p = rand01(); - cur = 0; - for (; cur < dist.size(); ++cur) { - p -= dist[cur]; - if (p < 0.0) { break; } - } - if (cur == dist.size()) cur = kEOS; - } - if (cur == kEOS) break; - ++len; - cerr << (len == 1 ? "" : " ") << d.convert(cur); - Expression x_t = lookup(cg, p_c, cur); - h_t = builder.add_input(x_t); - } - cerr << endl; - } -}; - -int main(int argc, char** argv) { - cerr << "COMMAND LINE:"; - for (unsigned i = 0; i < static_cast(argc); ++i) cerr << ' ' << argv[i]; - cerr << endl; - dynet::initialize(argc, argv); - po::variables_map conf; - InitCommandLine(argc, argv, &conf); - kSOS = d.convert(""); - kEOS = d.convert(""); - LAYERS = conf["layers"].as(); - INPUT_DIM = conf["input_dim"].as(); - HIDDEN_DIM = conf["hidden_dim"].as(); - SAMPLE = conf.count("sample"); - if (conf.count("dropout")) - DROPOUT = conf["dropout"].as(); - Model model; - if (conf.count("clusters")) - cfsm = new ClassFactoredSoftmaxBuilder(HIDDEN_DIM, conf["clusters"].as(), &d, &model); - else if (conf.count("paths")) - cfsm = new HierarchicalSoftmaxBuilder(HIDDEN_DIM, conf["paths"].as(), &d, &model); - float eta_decay_rate = 1; - unsigned eta_decay_onset_epoch = 0; - if (conf.count("eta_decay_onset_epoch")) - eta_decay_onset_epoch = conf["eta_decay_onset_epoch"].as(); - if (conf.count("eta_decay_rate")) - eta_decay_rate = conf["eta_decay_rate"].as(); - vector> training, dev, test; - string line; - int tlc = 0; - int ttoks = 0; - { - string trainf = conf["train"].as(); - cerr << "Reading training data from " << trainf << " ...\n"; - ifstream in(trainf); - assert(in); - while(getline(in, line)) { - ++tlc; - training.push_back(read_sentence(line, &d)); - ttoks += training.back().size(); - if (training.back().front() == kSOS || training.back().back() == kEOS) { - cerr << "Training sentence in " << argv[1] << ":" << tlc << " started with or ended with \n"; - abort(); - } - } - cerr << tlc << " lines, " << ttoks << " tokens, " << d.size() << " types\n"; - } - d.freeze(); // no new word types allowed - d.set_unk(""); - VOCAB_SIZE = d.size(); - if (!cfsm) - cfsm = new StandardSoftmaxBuilder(HIDDEN_DIM, VOCAB_SIZE, &model); - - if (conf.count("test")) { - string testf = conf["test"].as(); - cerr << "Reading test data from " << testf << " ...\n"; - ifstream in(testf); - assert(in); - while(getline(in, line)) { - test.push_back(read_sentence(line, &d)); - if (test.back().front() == kSOS || test.back().back() == kEOS) { - cerr << "Test sentence in " << argv[2] << ":" << tlc << " started with or ended with \n"; - abort(); - } - } - } - - Trainer* sgd = new SimpleSGDTrainer(&model); - sgd->eta0 = sgd->eta = conf["eta0"].as(); - RNNLanguageModel lm(model); - - bool has_model_to_load = conf.count("model"); - if (has_model_to_load) { - string fname = conf["model"].as(); - cerr << "Reading parameters from " << fname << "...\n"; - ifstream in(fname); - assert(in); - boost::archive::binary_iarchive ia(in); - ia >> model; - } - - bool LEARN = conf.count("learn"); - - if (LEARN) { - int dlc = 0; - int dtoks = 0; - if (conf.count("dev") == 0) { - cerr << "You must specify a development set (--dev file.txt) with --learn" << endl; - abort(); - } else { - string devf = conf["dev"].as(); - cerr << "Reading dev data from " << devf << " ...\n"; - ifstream in(devf); - assert(in); - while(getline(in, line)) { - ++dlc; - dev.push_back(read_sentence(line, &d)); - dtoks += dev.back().size(); - if (dev.back().front() == kSOS || dev.back().back() == kEOS) { - cerr << "Dev sentence in " << argv[2] << ":" << tlc << " started with or ended with \n"; - abort(); - } - } - cerr << dlc << " lines, " << dtoks << " tokens\n"; - } - ostringstream os; - os << "lm" - << '_' << DROPOUT - << '_' << LAYERS - << '_' << INPUT_DIM - << '_' << HIDDEN_DIM - << "-pid" << getpid() << ".params"; - const string fname = os.str(); - cerr << "Parameters will be written to: " << fname << endl; - double best = 9e+99; - unsigned report_every_i = 100; - unsigned dev_every_i_reports = 25; - unsigned si = training.size(); - if (report_every_i > si) report_every_i = si; - vector order(training.size()); - for (unsigned i = 0; i < order.size(); ++i) order[i] = i; - bool first = true; - int report = 0; - double lines = 0; - int completed_epoch = -1; - while(!INTERRUPTED) { - if (SAMPLE) lm.RandomSample(); - Timer iteration("completed in"); - double loss = 0; - unsigned chars = 0; - for (unsigned i = 0; i < report_every_i; ++i) { - if (si == training.size()) { - si = 0; - if (first) { first = false; } else { sgd->update_epoch(); } - cerr << "**SHUFFLE\n"; - completed_epoch++; - if (eta_decay_onset_epoch && completed_epoch >= (int)eta_decay_onset_epoch) - sgd->eta *= eta_decay_rate; - shuffle(order.begin(), order.end(), *rndeng); - } - - // build graph for this instance - ComputationGraph cg; - auto& sent = training[order[si]]; - chars += sent.size(); - ++si; - Expression loss_expr = lm.BuildLMGraph(sent, cg, DROPOUT > 0.f); - loss += as_scalar(cg.forward(loss_expr)); - cg.backward(loss_expr); - sgd->update(); - ++lines; - } - report++; - cerr << '#' << report << " [epoch=" << (lines / training.size()) << " eta=" << sgd->eta << "] E = " << (loss / chars) << " ppl=" << exp(loss / chars) << ' '; - - // show score on dev data? - if (report % dev_every_i_reports == 0) { - double dloss = 0; - int dchars = 0; - for (auto& sent : dev) { - ComputationGraph cg; - Expression loss_expr = lm.BuildLMGraph(sent, cg, false); - dloss += as_scalar(cg.forward(loss_expr)); - dchars += sent.size(); - } - if (dloss < best) { - best = dloss; - ofstream out(fname); - boost::archive::binary_oarchive oa(out); - oa << model; - } - cerr << "\n***DEV [epoch=" << (lines / training.size()) << "] E = " << (dloss / dchars) << " ppl=" << exp(dloss / dchars) << ' '; - } - } - } // train? - if (conf.count("test")) { - cerr << "Evaluating test data...\n"; - double tloss = 0; - int tchars = 0; - for (auto& sent : test) { - ComputationGraph cg; - Expression loss_expr = lm.BuildLMGraph(sent, cg, false); - tloss += as_scalar(cg.forward(loss_expr)); - tchars += sent.size(); - } - cerr << "TEST -LLH = " << tloss << endl; - cerr << "TEST CROSS ENTOPY (NATS) = " << (tloss / tchars) << endl; - cerr << "TEST PPL = " << exp(tloss / tchars) << endl; - } - - // N-best scoring - if (conf.count("nbest")) { - // cdec: index ||| hypothesis ||| feature=val ... ||| ... - // Moses: index ||| hypothesis ||| feature= val(s) ... ||| ... - const int HYP_FIELD = 1; - const int FEAT_FIELD = 2; - const string FEAT_NAME = "RNNLM"; - // Input - string nbestf = conf["nbest"].as(); - cerr << "Scoring N-best list " << nbestf << " ..." << endl; - shared_ptr in; - if (nbestf == "-") { - in.reset(&cin, [](...){}); - } else { - in.reset(new ifstream(nbestf)); - } - // Split on |||, consume whitespace - boost::regex delim("\\s*\\|\\|\\|\\s*"); - boost::sregex_token_iterator end; - // Match spacing of input file - string sep = "="; - bool sep_detected = false; - // Input lines - while (getline(*in, line)) { - vector fields; - boost::sregex_token_iterator it(line.begin(), line.end(), delim, -1); - while (it != end) { - fields.push_back(*it++); - } - // Check sep if needed - if (!sep_detected) { - sep_detected = true; - int i = fields[FEAT_FIELD].find("="); - if (fields[FEAT_FIELD].substr(i + 1, 1) == " ") { - sep = "= "; - } - } - // Score hypothesis - ComputationGraph cg; - Expression loss_expr = lm.BuildLMGraph(read_sentence(fields[HYP_FIELD], &d), cg, false); - double loss = as_scalar(cg.forward(loss_expr)); - // Add score - ostringstream os; - os << fields[FEAT_FIELD] << " " << FEAT_NAME << sep << loss; - fields[FEAT_FIELD] = os.str(); - // Write augmented line - cout << boost::algorithm::join(fields, " ||| ") << endl; - } - } - - delete sgd; -} From f06ea46d4703f8132993f2be687f6df5170b397e Mon Sep 17 00:00:00 2001 From: paul Date: Tue, 6 Dec 2016 12:03:15 -0500 Subject: [PATCH 873/965] Remove rnnlm from cmakelist --- CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9560b8c06..b0ae9005a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -167,6 +167,5 @@ add_subdirectory(dynet) add_subdirectory(tests) add_subdirectory(examples) add_subdirectory(tutorial) -add_subdirectory(rnnlm) add_subdirectory(python) enable_testing() From b3565c978dddb45e65a72d1d49baed4011af6826 Mon Sep 17 00:00:00 2001 From: Paul Michel Date: Wed, 7 Dec 2016 15:03:35 -0500 Subject: [PATCH 874/965] typo for inverted dropout in doc --- doc/source/unorthodox.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/unorthodox.rst b/doc/source/unorthodox.rst index 76f275383..fd46666fb 100644 --- a/doc/source/unorthodox.rst +++ b/doc/source/unorthodox.rst @@ -68,7 +68,7 @@ situations. There are two ways to do this: * **Vanilla Dropout:** At training time, perform dropout with probability ``p``. At test time, scale the outputs of each node by ``p``. * **Inverted Dropout:** At training time, perform dropout with probability - ``p``, *and* scale the outputs by ``1-p``. At test time, use the outputs + ``p``, *and* scale the outputs by ``1/p``. At test time, use the outputs as-is. The first is perhaps more common, but the second is convenient, because we From 4de0d939430df8bcc29bd8e944cb192143daccec Mon Sep 17 00:00:00 2001 From: paul Date: Wed, 7 Dec 2016 18:25:37 -0500 Subject: [PATCH 875/965] Corrected a NASTY bug in expr.h with breathe Also updated the doc accordingly and fixed some warnings as well --- doc/source/doc_style.rst | 2 ++ doc/source/python.rst | 1 + dynet/expr.h | 34 ++++++++++++++++++---------------- dynet/training.h | 1 + 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/doc/source/doc_style.rst b/doc/source/doc_style.rst index 5baf941e7..430e0d31f 100644 --- a/doc/source/doc_style.rst +++ b/doc/source/doc_style.rst @@ -15,6 +15,8 @@ For ease of access the documentation is divided into *groups*. For now the group If you want to create a group, use :code:`\defgroup [group-name]` at the beginning of your file. Then create a file for this group in sphinx (see next section). +**Important** : You can use latex in doxygen comments with the syntax :code:`\f$ \f$`. For some reason since readthedocs updated their version of sphinx :code:`\f[ \f]` doesn't work anymore so *don't use it* it breaks the build. + Sphinx guidelines ----------------- diff --git a/doc/source/python.rst b/doc/source/python.rst index 1ddf2016e..54f5b6db3 100644 --- a/doc/source/python.rst +++ b/doc/source/python.rst @@ -160,6 +160,7 @@ installation is likely to be working: If it doesn't work and you get an error similar to the following: :: + ImportError: dlopen(/Users/sneharajana/.python-eggs/dyNET-0.0.0-py2.7-macosx-10.11-intel.egg-tmp/_dynet.so, 2): Library not loaded: @rpath/libdynet.dylib Referenced from: /Users/sneharajana/.python-eggs/dyNET-0.0.0-py2.7-macosx-10.11-intel.egg-tmp/_dynet.so Reason: image not found`` diff --git a/dynet/expr.h b/dynet/expr.h index 47b2b0e2a..54f24ec8a 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -1,14 +1,14 @@ /** * \file expr.h - * \defgroup operations - * \defgroup inputoperations - * \defgroup arithmeticoperations - * \defgroup lossoperations - * \defgroup flowoperations - * \defgroup noiseoperations - * \defgroup convoperations - * \defgroup tensoroperations - * \defgroup linalgoperations + * \defgroup operations operations + * \defgroup inputoperations inputoperations + * \defgroup arithmeticoperations arithmeticoperations + * \defgroup lossoperations lossoperations + * \defgroup flowoperations flowoperations + * \defgroup noiseoperations noiseoperations + * \defgroup convoperations convoperations + * \defgroup tensoroperations tensoroperations + * \defgroup linalgoperations linalgoperations * \brief The various operations that you can use in building a DyNet graph * * \details TODO: **This documentation is incomplete. See expr.h for a full list of expressions.** @@ -249,7 +249,7 @@ Expression lookup(ComputationGraph& g, LookupParameter p, const std::vector & * pickneglogsoftmax: ``pv`` can be modified without re-creating the computation graph. * * \param x An expression with vectors of scores over N batch elements - * \param v A size-N vector indicating the index with respect to all the batch elements + * \param pv A pointer to the indexes * * \return The negative log likelihoods over all the batch elements */ @@ -854,7 +855,7 @@ Expression pickneglogsoftmax(const Expression& x, const std::vector * * \ingroup lossoperations * \brief Hinge loss * \details This expression calculates the hinge loss, formally expressed as: - * \f$ \text{hinge}(x,index,m) = \sum_{i \ne index} max(0, m-x[index]+x[i]). \f$ + * \f$ \text{hinge}(x,index,m) = \sum_{i \ne index} \max(0, m-x[index]+x[i]). \f$ * * \param x A vector of scores * \param index The index of the correct candidate @@ -995,13 +996,14 @@ Expression l1_distance(const Expression& x, const Expression& y); * \ingroup lossoperations * \brief Huber distance * \details The huber distance between values of ``x`` and ``y`` parameterized - * by ``c,`` \f$\sum_i L_c(x_i, y_i)\f$ where: - * \f[ - * L_c(x, y) = \begin{cases} + * by ``c,`` \f$\sum_i L_c(x_i, y_i)\f$ where: + * + * \f$ + * L_c(x, y) = \begin{cases}{lr} * \frac{1}{2}(y - x)^2 & \textrm{for } |y - f(x)| \le c, \\ * c\, |y - f(x)| - \frac{1}{2}c^2 & \textrm{otherwise.} * \end{cases} - * \f] + * \f$ * * \param x A vector of values * \param y Another vector of values diff --git a/dynet/training.h b/dynet/training.h index 101626bb3..5cf27524a 100644 --- a/dynet/training.h +++ b/dynet/training.h @@ -42,6 +42,7 @@ struct Trainer { * * \param m Pointer to the model to be trained * \param e0 Initial learning rate + * \param edecay Learning rate decay */ explicit Trainer(Model* m, real e0, real edecay = 0.0) : eta0(e0), eta(e0), eta_decay(edecay), epoch(), clipping_enabled(true), clip_threshold(5), From ebdd50fb0f1d36c9d02cda0164a079ca2d6708fa Mon Sep 17 00:00:00 2001 From: Paul Michel Date: Wed, 7 Dec 2016 18:42:42 -0500 Subject: [PATCH 876/965] Add doc build status --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ac7749798..efdc0fa70 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,5 @@ Read the [documentation](http://dynet.readthedocs.io/en/latest/) to get started, * **Latest Code:** Can be found on the github page master branch. * **Latest Release:** [v1.0-rc1](https://github.com/clab/dynet/releases/tag/v1.0-rc1) -[![Build Status](https://travis-ci.org/clab/dynet.svg?branch=master)](https://travis-ci.org/clab/dynet) \ No newline at end of file +[![Build Status](https://travis-ci.org/clab/dynet.svg?branch=master)](https://travis-ci.org/clab/dynet) +[![Doc build Status](https://readthedocs.org/projects/dynet/badge/?version=latest)](http://dynet.readthedocs.io/en/latest/) From a89709673aef0c82e30b1e879e46302cdd247ec0 Mon Sep 17 00:00:00 2001 From: Naomi Saphra Date: Fri, 9 Dec 2016 11:30:15 +0000 Subject: [PATCH 877/965] added python tutorial stub This should be helpful to people until someone gets around to writing python documentation in the official docs. --- doc/source/tutorial.rst | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/doc/source/tutorial.rst b/doc/source/tutorial.rst index d52ea4273..953100346 100644 --- a/doc/source/tutorial.rst +++ b/doc/source/tutorial.rst @@ -82,3 +82,10 @@ initialization, reading/writing models, recurrent/LSTM networks, or adding biases to functions. The best way to get an idea of how to use DyNet for real is to look in the ``example`` directory, particularly starting with the simplest ``xor`` example. + +Python Tutorials +--------------- + +Guided examples in Python can be found in the jupyter tutorials_. + +.. _tutorials: https://github.com/clab/dynet/tree/master/tutorial From 88f108ab52754871f1e8455c70f56bbd3c54a5a6 Mon Sep 17 00:00:00 2001 From: Naomi Saphra Date: Fri, 9 Dec 2016 13:01:24 +0000 Subject: [PATCH 878/965] Update tutorial.rst --- doc/source/tutorial.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/tutorial.rst b/doc/source/tutorial.rst index 953100346..0193cefd0 100644 --- a/doc/source/tutorial.rst +++ b/doc/source/tutorial.rst @@ -88,4 +88,4 @@ Python Tutorials Guided examples in Python can be found in the jupyter tutorials_. -.. _tutorials: https://github.com/clab/dynet/tree/master/tutorial +.. _tutorials: https://github.com/clab/dynet/tree/master/examples/tutorials From 58659a4176f1e3725446d382e56da27767effa92 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Fri, 9 Dec 2016 17:29:52 +0200 Subject: [PATCH 879/965] Update API.ipynb --- examples/tutorials/API.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tutorials/API.ipynb b/examples/tutorials/API.ipynb index 1d08637d8..ece20a2f1 100644 --- a/examples/tutorials/API.ipynb +++ b/examples/tutorials/API.ipynb @@ -81,7 +81,7 @@ "e = -e1 \n", "\n", "e = dot_product(e1, e2)\n", - "e = cwise_multiply(e1, e2) # component-wise divide (like e1*e2 in numpy)\n", + "e = cmult(e1, e2) # component-wise multiply (like e1*e2 in numpy)\n", "e = cdiv(e1, e2) # component-wise divide\n", "e = colwise_add(e1, e2) # column-wise addition\n", "\n", From a60401e9e63609b8a18e074111bb51fdd87dccae Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 10 Dec 2016 14:39:49 +0900 Subject: [PATCH 880/965] Added some documentation of flow expressions --- dynet/expr.h | 189 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 182 insertions(+), 7 deletions(-) diff --git a/dynet/expr.h b/dynet/expr.h index 54f24ec8a..4aa6183f9 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -1085,33 +1085,208 @@ Expression poisson_loss(const Expression& x, const unsigned* py); */ Expression nobackprop(const Expression& x); -// reshape::forward is O(1), but backward is O(n) +/** + * \ingroup flowoperations + * \brief Reshape to another size + * \details This node reshapes a tensor to another size, without changing the + * underlying layout of the data. The layout of the data in DyNet is + * column-major, so if we have a 3x4 matrix + * + * \f$ + * \begin{pmatrix} + * x_{1,1} & x_{1,2} & x_{1,3} & x_{1,4} \\ + * x_{2,1} & x_{2,2} & x_{2,3} & x_{2,4} \\ + * x_{3,1} & x_{3,2} & x_{3,3} & x_{3,4} \\ + * \end{pmatrix} + * \f$ + * + * and transform it into a 2x6 matrix, it will be rearranged as: + * + * \f$ + * \begin{pmatrix} + * x_{1,1} & x_{3,1} & x_{2,2} & x_{1,3} & x_{3,3} & x_{2,4} \\ + * x_{1,2} & x_{1,2} & x_{3,2} & x_{2,3} & x_{1,4} & x_{3,4} \\ + * \end{pmatrix} + * \f$ + * + * **Note:** This is O(1) for forward, and O(n) for backward. + * + * \param x The input expression + * \param d The new dimensions + * + * \return The reshaped expression + */ Expression reshape(const Expression& x, const Dim& d); -// transpose requires O(n) + +/** + * \ingroup flowoperations + * \brief Transpose a matrix + * \details Get the transpose of the matrix. + * **Note:** This is O(1) if either the row or column dimension is 1, + * and O(n) otherwise. + * + * \param x The input expression + * + * \return The transposed expression + */ Expression transpose(const Expression& x); + +/** + * \ingroup flowoperations + * \brief Select rows + * \details Select a subset of rows of a matrix. + * + * \param x The input expression + * \param rows The rows to extract + * + * \return An expression containing the selected rows + */ Expression select_rows(const Expression& x, const std::vector& rows); + +/** + * \ingroup flowoperations + * \brief Modifiable select rows + * \details Select a subset of rows of a matrix, where the elements of prows + * can be modified without re-creating the computation graph. + * + * \param x The input expression + * \param prows The rows to extract + * + * \return An expression containing the selected rows + */ Expression select_rows(const Expression& x, const std::vector* prows); -// select_cols is more efficient than select_rows since Eigen uses column-major order + +/** + * \ingroup flowoperations + * \brief Select columns + * \details Select a subset of columns of a matrix. select_cols is more + * efficient than select_rows since DyNet uses column-major order. + * + * \param x The input expression + * \param columns The columns to extract + * + * \return An expression containing the selected columns + */ Expression select_cols(const Expression& x, const std::vector& cols); + +/** + * \ingroup flowoperations + * \brief Modifiable select columns + * \details Select a subset of columns of a matrix, where the elements of pcols + * can be modified without re-creating the computation graph. + * + * \param x The input expression + * \param pcolumns The columns to extract + * + * \return An expression containing the selected columns + */ Expression select_cols(const Expression& x, const std::vector* pcols); -// Sum the results of multiple batches +/** + * \ingroup flowoperations + * \brief Sum over minibatches + * \details Sum an expression that consists of multiple minibatches into one of + * equal dimension but with only a single minibatch. This is useful + * for summing loss functions at the end of minibatch training. + * + * \param x The input mini-batched expression + * + * \return An expression with a single batch + */ Expression sum_batches(const Expression& x); -// pick parts out of bigger objects +/** + * \ingroup flowoperations + * \brief Pick element + * \details Pick a single element from an expression. + * + * \param x The input expression + * \param v The index of the element to select + * + * \return The value of x[v] + */ Expression pick(const Expression& x, unsigned v); + +/** + * \ingroup flowoperations + * \brief Pick multiple elements + * \details Pick multiple elements from an input expression + * + * \param x The input expression + * \param v A vector of indicies to choose + * + * \return A vector of values {x[v[0]], x[v[1]], ...} + */ Expression pick(const Expression& x, const std::vector & v); + +/** + * \ingroup flowoperations + * \brief Modifiable pick element + * \details Pick a single element from an expression, where the index is + * passed by pointer so we do not need to re-create the computation + * graph every time. + * + * \param x The input expression + * \param pv Pointer to the index of the element to select + * + * \return The value of x[*pv] + */ Expression pick(const Expression& x, unsigned * pv); + +/** + * \ingroup flowoperations + * \brief Modifiable pick multiple elements + * \details Pick multiple elements from an input expression, where the indices + * are passed by pointer so we do not need to re-create the computation + * graph every time. + * + * \param x The input expression + * \param pv A pointer to vector of indicies to choose + * + * \return A vector of values {x[(*pv)[0]], x[(*pv)[1]], ...} + */ Expression pick(const Expression& x, const std::vector * pv); + +/** + * \ingroup flowoperations + * \brief Pick range of elements + * \details Pick a range of elements from an expression. + * + * \param x The input expression + * \param v The beginning index + * \param u The end index + * + * \return The value of {x[v],...,x[u]} + */ Expression pickrange(const Expression& x, unsigned v, unsigned u); +/** + * \ingroup flowoperations + * \brief Concatenate columns + * \details Perform a concatenation of the columns in multiple expressions. + * All expressions must have the same number of rows. + * + * \param xs The input expressions + * + * \return The expression with the columns concatenated + */ +inline Expression concatenate_cols(const std::initializer_list& xs) { return detail::f(xs); } template inline Expression concatenate_cols(const T& xs) { return detail::f(xs); } -inline Expression concatenate_cols(const std::initializer_list& xs) { return detail::f(xs); } +/** + * \ingroup flowoperations + * \brief Concatenate rows + * \details Perform a concatenation of the rows in multiple expressions. + * All expressions must have the same number of columns. + * + * \param xs The input expressions + * + * \return The expression with the rows concatenated + */ +inline Expression concatenate(const std::initializer_list& xs) { return detail::f(xs); } template inline Expression concatenate(const T& xs) { return detail::f(xs); } -inline Expression concatenate(const std::initializer_list& xs) { return detail::f(xs); } //////////////////////////////////////////////// // Noise operations // From da022e8866fab42507a3e2867ac975edff44a793 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 10 Dec 2016 15:34:57 +0900 Subject: [PATCH 881/965] Added noising documentation --- dynet/expr.h | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/dynet/expr.h b/dynet/expr.h index 4aa6183f9..c9c5ea23c 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -1292,8 +1292,51 @@ inline Expression concatenate(const T& xs) { return detail::f(xs); // Noise operations // //////////////////////////////////////////////// +/** + * \ingroup noiseoperations + * \brief Gaussian noise + * \details Add gaussian noise to an expression. + * + * \param x The input expression + * \param stddev The standard deviation of the gaussian + * + * \return The noised expression + */ Expression noise(const Expression& x, real stddev); + +/** + * \ingroup noiseoperations + * \brief Dropout + * \details + * With a fixed probability, drop out (set to zero) nodes in the input + * expression, and **scale** the remaining nodes by 1/p. Note that there are + * two kinds of dropout: + * - *Regular dropout:* where we perform dropout at training time and then\n + * scale outputs by p at test time. + * - *Inverted dropout:* where we perform dropout and scaling at training\n + * time, and do not need to do anything at test time. + * DyNet implements the latter, so you only need to apply dropout at training + * time, and do not need to perform scaling and test time. + * + * \param x The input expression + * \param p The dropout probability + * + * \return The dropped out expression + */ Expression dropout(const Expression& x, real p); + +/** + * \ingroup noiseoperations + * \brief Block dropout + * \details Identical to the dropout operation, but either drops out *all* + * or *no* values in the expression, as opposed to making a decision + * about each value individually. + * + * \param x The input expression + * \param p The block dropout probability + * + * \return The block dropout expression + */ Expression block_dropout(const Expression& x, real p); //////////////////////////////////////////////// From 28f3e9af6ee274d16e84bc409a8d1553845b28ff Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 10 Dec 2016 15:39:14 +0900 Subject: [PATCH 882/965] Removed some extraneous stuff in doc --- doc/source/builders.rst | 6 +++--- doc/source/multiprocessing.rst | 4 ++-- doc/source/optimizers.rst | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/source/builders.rst b/doc/source/builders.rst index 3ea25c8e2..5f8963e38 100644 --- a/doc/source/builders.rst +++ b/doc/source/builders.rst @@ -1,9 +1,9 @@ -DyNet Builders -============== +Builders +======== Builders combine together various operations to implement more complicated things such as recurrent and LSTM networks .. doxygengroup:: rnnbuilders :members: - :content-only: \ No newline at end of file + :content-only: diff --git a/doc/source/multiprocessing.rst b/doc/source/multiprocessing.rst index cac087f60..5026a1792 100644 --- a/doc/source/multiprocessing.rst +++ b/doc/source/multiprocessing.rst @@ -1,5 +1,5 @@ -Multi-processing in DyNet -========================= +Multi-processing +================ How to perform processing on multiple threads diff --git a/doc/source/optimizers.rst b/doc/source/optimizers.rst index f5bafa091..14cbf3f37 100644 --- a/doc/source/optimizers.rst +++ b/doc/source/optimizers.rst @@ -1,8 +1,8 @@ -DyNet Optimizers -================ +Optimizers +========== The various optimizers that you can use to tune your parameters .. doxygengroup:: optimizers :members: - :content-only: \ No newline at end of file + :content-only: From 0f2e7fae48cfaf0a073fbb89bbbf833557756848 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 10 Dec 2016 17:22:08 +0900 Subject: [PATCH 883/965] Fixed rescaling of lookup parameters --- dynet/training.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dynet/training.cc b/dynet/training.cc index 691bb707d..5138169de 100644 --- a/dynet/training.cc +++ b/dynet/training.cc @@ -55,6 +55,9 @@ void Trainer::rescale_and_reset_weight_decay() { const auto params = model->parameters_list(); for (auto p : model->updated_parameters_list()) params[p]->scale_parameters(weight_decay); + const auto lookup_params = model->parameters_list(); + for (auto p : model->updated_lookup_parameters_list()) + lookup_params[p]->scale_parameters(weight_decay); model->weight_decay.reset_weight_decay(); } From 907ec981f2809e3e45e7b4ca91b6a7c33c390c17 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sat, 10 Dec 2016 15:04:03 -0500 Subject: [PATCH 884/965] Fixed warning --- dynet/nodes-conv.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynet/nodes-conv.cc b/dynet/nodes-conv.cc index ee1db90c3..ca51dbf64 100644 --- a/dynet/nodes-conv.cc +++ b/dynet/nodes-conv.cc @@ -344,11 +344,11 @@ void KMaxPooling::forward_dev_impl(const MyDevice & dev, const vector> locs(maxmap, dim.size()); locs.device(*dev.edevice) = xs[0]->t<2>().argmax(1); - const Eigen::array reduction_axis = {1}; #ifdef __CUDACC__ // TODO: The code that works on CPU does not compile on CUDA throw std::runtime_error("KMaxPooling::forward_dev_impl not working on CUDA yet"); #else + const Eigen::array reduction_axis = {1}; fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().maximum(reduction_axis); #endif } else { From 8c727cee200b6b914eb4a2ff75aed55b5ee506ad Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 11 Dec 2016 07:31:55 +0900 Subject: [PATCH 885/965] Removed unnecessary CPU mem alloc when using GPU --- dynet/init.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dynet/init.cc b/dynet/init.cc index ecc0a5100..192bba6e1 100644 --- a/dynet/init.cc +++ b/dynet/init.cc @@ -172,12 +172,14 @@ void initialize(DynetParams params) { // Allocate memory cerr << "[dynet] allocating memory: " << params.mem_descriptor << "MB\n"; - devices.push_back(new Device_CPU(devices.size(), params.mem_descriptor, params.shared_parameters)); + // TODO: Once multi-device support is added, we will potentially allocate both CPU + // and GPU, not either-or int default_index = 0; if (gpudevices.size() > 0) { for (auto gpu : gpudevices) devices.push_back(gpu); - default_index++; + } else { + devices.push_back(new Device_CPU(devices.size(), params.mem_descriptor, params.shared_parameters)); } default_device = devices[default_index]; From 2cc0a32e75d6cb13b875e7f0b08b2d262d536096 Mon Sep 17 00:00:00 2001 From: Mitchell Stern Date: Sun, 11 Dec 2016 00:41:38 -0800 Subject: [PATCH 886/965] Changed pointers to references where `nullptr` is invalid --- dynet/cfsm-builder.cc | 22 ++++++------ dynet/cfsm-builder.h | 8 ++--- dynet/deep-lstm.cc | 24 ++++++------- dynet/deep-lstm.h | 2 +- dynet/dict.cc | 12 +++---- dynet/dict.h | 4 +-- dynet/fast-lstm.cc | 24 ++++++------- dynet/fast-lstm.h | 2 +- dynet/gru.cc | 20 +++++------ dynet/gru.h | 2 +- dynet/hsm-builder.cc | 12 +++---- dynet/hsm-builder.h | 8 ++--- dynet/lstm.cc | 24 ++++++------- dynet/lstm.h | 2 +- dynet/pretrain.cc | 14 ++++---- dynet/pretrain.h | 4 +-- dynet/rnn.cc | 10 +++--- dynet/rnn.h | 2 +- dynet/training.h | 16 ++++----- dynet/treelstm.cc | 36 +++++++++---------- dynet/treelstm.h | 6 ++-- examples/embed-cl/train_embed-cl.cc | 6 ++-- examples/encdec/encdec.h | 6 ++-- examples/encdec/train_encdec.cc | 6 ++-- examples/mlc/train_mlc.cc | 4 +-- examples/nlm/train_nlm.cc | 2 +- .../train_poisson-regression.cc | 8 ++--- examples/read-write/train_read-write.cc | 8 ++--- examples/rnnlm-aevb/train_rnnlm-aevb.cc | 12 +++---- examples/rnnlm-batch/rnnlm-batch.h | 4 +-- examples/rnnlm-batch/train_rnnlm-batch.cc | 6 ++-- examples/rnnlm-cfsm/train_rnnlm-cfsm.cc | 12 +++---- .../train_rnnlm-final-batch.cc | 4 +-- examples/rnnlm-givenbag/rnnlm-givenbag.cc | 6 ++-- examples/rnnlm-mp/rnnlm.h | 2 +- examples/rnnlm-mp/train_rnnlm-mp.cc | 8 ++--- examples/rnnlm/train_rnnlm.cc | 18 +++++----- examples/segrnn-sup/train_segrnn-sup.cc | 10 +++--- examples/skiprnnlm/train_skiprnnlm.cc | 6 ++-- examples/tag-bilstm/train_tag-bilstm.cc | 12 +++---- examples/textcat/train_textcat.cc | 14 ++++---- examples/tok-embed/train_tok-embed.cc | 8 ++--- .../train_xor-batch-lookup.cc | 2 +- examples/xor-batch/train_xor-batch.cc | 2 +- examples/xor-mp/train_xor-mp.cc | 2 +- examples/xor-xent/train_xor-xent.cc | 4 +-- examples/xor/train_xor.cc | 4 +-- python/_dynet.pxd | 20 +++++------ python/_dynet.pyx | 18 +++++----- tests/test-trainers.cc | 10 +++--- tutorial/1_linear_regression.cc | 2 +- 51 files changed, 240 insertions(+), 240 deletions(-) diff --git a/dynet/cfsm-builder.cc b/dynet/cfsm-builder.cc index 59532aed9..532a49bc9 100644 --- a/dynet/cfsm-builder.cc +++ b/dynet/cfsm-builder.cc @@ -20,9 +20,9 @@ SoftmaxBuilder::~SoftmaxBuilder() {} StandardSoftmaxBuilder::StandardSoftmaxBuilder() {} -StandardSoftmaxBuilder::StandardSoftmaxBuilder(unsigned rep_dim, unsigned vocab_size, Model* model) { - p_w = model->add_parameters({vocab_size, rep_dim}); - p_b = model->add_parameters({vocab_size}); +StandardSoftmaxBuilder::StandardSoftmaxBuilder(unsigned rep_dim, unsigned vocab_size, Model& model) { + p_w = model.add_parameters({vocab_size, rep_dim}); + p_b = model.add_parameters({vocab_size}); } void StandardSoftmaxBuilder::new_graph(ComputationGraph& cg) { @@ -66,12 +66,12 @@ ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder() {} ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, - Dict* word_dict, - Model* model) { + Dict& word_dict, + Model& model) { read_cluster_file(cluster_file, word_dict); const unsigned num_clusters = cdict.size(); - p_r2c = model->add_parameters({num_clusters, rep_dim}); - p_cbias = model->add_parameters({num_clusters}); + p_r2c = model.add_parameters({num_clusters, rep_dim}); + p_cbias = model.add_parameters({num_clusters}); p_rc2ws.resize(num_clusters); p_rcwbiases.resize(num_clusters); for (unsigned i = 0; i < num_clusters; ++i) { @@ -80,8 +80,8 @@ ClassFactoredSoftmaxBuilder::ClassFactoredSoftmaxBuilder(unsigned rep_dim, if (num_words_in_cluster > 1) { // for singleton clusters, we don't need these parameters, so // we don't create them - p_rc2ws[i] = model->add_parameters({num_words_in_cluster, rep_dim}); - p_rcwbiases[i] = model->add_parameters({num_words_in_cluster}); + p_rc2ws[i] = model.add_parameters({num_words_in_cluster, rep_dim}); + p_rcwbiases[i] = model.add_parameters({num_words_in_cluster}); } } } @@ -178,7 +178,7 @@ Expression ClassFactoredSoftmaxBuilder::full_log_distribution(const Expression& return log(softmax(concatenate(full_dist))); } -void ClassFactoredSoftmaxBuilder::read_cluster_file(const std::string& cluster_file, Dict* word_dict) { +void ClassFactoredSoftmaxBuilder::read_cluster_file(const std::string& cluster_file, Dict& word_dict) { cerr << "Reading clusters from " << cluster_file << " ...\n"; ifstream in(cluster_file); assert(in); @@ -199,7 +199,7 @@ void ClassFactoredSoftmaxBuilder::read_cluster_file(const std::string& cluster_f assert(startw > endc); assert(endw > startw); unsigned c = cdict.convert(line.substr(startc, endc - startc)); - unsigned word = word_dict->convert(line.substr(startw, endw - startw)); + unsigned word = word_dict.convert(line.substr(startw, endw - startw)); if (word >= widx2cidx.size()) { widx2cidx.resize(word + 1, -1); widx2cwidx.resize(word + 1); diff --git a/dynet/cfsm-builder.h b/dynet/cfsm-builder.h index 0f82876e1..5436fa262 100644 --- a/dynet/cfsm-builder.h +++ b/dynet/cfsm-builder.h @@ -34,7 +34,7 @@ class SoftmaxBuilder { class StandardSoftmaxBuilder : public SoftmaxBuilder { public: - StandardSoftmaxBuilder(unsigned rep_dim, unsigned vocab_size, Model* model); + StandardSoftmaxBuilder(unsigned rep_dim, unsigned vocab_size, Model& model); void new_graph(ComputationGraph& cg); expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx); unsigned sample(const expr::Expression& rep); @@ -60,8 +60,8 @@ class ClassFactoredSoftmaxBuilder : public SoftmaxBuilder { public: ClassFactoredSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, - Dict* word_dict, - Model* model); + Dict& word_dict, + Model& model); void new_graph(ComputationGraph& cg); expr::Expression neg_log_softmax(const expr::Expression& rep, unsigned wordidx); @@ -71,7 +71,7 @@ class ClassFactoredSoftmaxBuilder : public SoftmaxBuilder { private: ClassFactoredSoftmaxBuilder(); - void read_cluster_file(const std::string& cluster_file, Dict* word_dict); + void read_cluster_file(const std::string& cluster_file, Dict& word_dict); Dict cdict; std::vector widx2cidx; // will be -1 if not present diff --git a/dynet/deep-lstm.cc b/dynet/deep-lstm.cc index e6de6f3ce..f495c12db 100644 --- a/dynet/deep-lstm.cc +++ b/dynet/deep-lstm.cc @@ -17,25 +17,25 @@ enum { X2I, H2I, C2I, BI, X2O, H2O, C2O, BO, X2C, H2C, BC }; DeepLSTMBuilder::DeepLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model) : layers(layers) { + Model& model) : layers(layers) { unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // i - Parameter p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); - Parameter p_h2i = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_c2i = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_bi = model->add_parameters({hidden_dim}); + Parameter p_x2i = model.add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2i = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_c2i = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_bi = model.add_parameters({hidden_dim}); // o - Parameter p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); - Parameter p_h2o = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_c2o = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_bo = model->add_parameters({hidden_dim}); + Parameter p_x2o = model.add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2o = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_c2o = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_bo = model.add_parameters({hidden_dim}); // c - Parameter p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); - Parameter p_h2c = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_bc = model->add_parameters({hidden_dim}); + Parameter p_x2c = model.add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2c = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_bc = model.add_parameters({hidden_dim}); layer_input_dim = hidden_dim + input_dim; // output (hidden) from 1st layer is input to next vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; diff --git a/dynet/deep-lstm.h b/dynet/deep-lstm.h index 3851f4082..3a0e6f3bb 100644 --- a/dynet/deep-lstm.h +++ b/dynet/deep-lstm.h @@ -16,7 +16,7 @@ struct DeepLSTMBuilder : public RNNBuilder { explicit DeepLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model); + Model& model); Expression back() const override { return h.back().back(); } std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } diff --git a/dynet/dict.cc b/dynet/dict.cc index 975b849e8..55a04a3d1 100644 --- a/dynet/dict.cc +++ b/dynet/dict.cc @@ -18,28 +18,28 @@ using namespace std; namespace dynet { -std::vector read_sentence(const std::string& line, Dict* sd) { +std::vector read_sentence(const std::string& line, Dict& sd) { std::istringstream in(line); std::string word; std::vector res; while(in) { in >> word; if (!in || word.empty()) break; - res.push_back(sd->convert(word)); + res.push_back(sd.convert(word)); } return res; } -void read_sentence_pair(const std::string& line, std::vector* s, Dict* sd, std::vector* t, Dict* td) { +void read_sentence_pair(const std::string& line, std::vector& s, Dict& sd, std::vector& t, Dict& td) { std::istringstream in(line); std::string word; std::string sep = "|||"; - Dict* d = sd; - std::vector* v = s; + Dict* d = &sd; + std::vector* v = &s; while(in) { in >> word; if (!in) break; - if (word == sep) { d = td; v = t; continue; } + if (word == sep) { d = &td; v = &t; continue; } v->push_back(d->convert(word)); } } diff --git a/dynet/dict.h b/dynet/dict.h index 0e998a171..61224147b 100644 --- a/dynet/dict.h +++ b/dynet/dict.h @@ -84,8 +84,8 @@ typedef std::unordered_map Map; }; -std::vector read_sentence(const std::string& line, Dict* sd); -void read_sentence_pair(const std::string& line, std::vector* s, Dict* sd, std::vector* t, Dict* td); +std::vector read_sentence(const std::string& line, Dict& sd); +void read_sentence_pair(const std::string& line, std::vector& s, Dict& sd, std::vector& t, Dict& td); } // namespace dynet diff --git a/dynet/fast-lstm.cc b/dynet/fast-lstm.cc index 012cf2cb1..2812c2e5e 100644 --- a/dynet/fast-lstm.cc +++ b/dynet/fast-lstm.cc @@ -22,25 +22,25 @@ Namely: C2O, C2I. FastLSTMBuilder::FastLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model) : layers(layers) { + Model& model) : layers(layers) { unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // i - Parameter p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); - Parameter p_h2i = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_c2i = model->add_parameters({hidden_dim, 1}); - Parameter p_bi = model->add_parameters({hidden_dim}); + Parameter p_x2i = model.add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2i = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_c2i = model.add_parameters({hidden_dim, 1}); + Parameter p_bi = model.add_parameters({hidden_dim}); // o - Parameter p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); - Parameter p_h2o = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_c2o = model->add_parameters({hidden_dim, 1}); - Parameter p_bo = model->add_parameters({hidden_dim}); + Parameter p_x2o = model.add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2o = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_c2o = model.add_parameters({hidden_dim, 1}); + Parameter p_bo = model.add_parameters({hidden_dim}); // c - Parameter p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); - Parameter p_h2c = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_bc = model->add_parameters({hidden_dim}); + Parameter p_x2c = model.add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2c = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_bc = model.add_parameters({hidden_dim}); layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; diff --git a/dynet/fast-lstm.h b/dynet/fast-lstm.h index 16733a9e9..0d841bfea 100644 --- a/dynet/fast-lstm.h +++ b/dynet/fast-lstm.h @@ -19,7 +19,7 @@ struct FastLSTMBuilder : public RNNBuilder { explicit FastLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model); + Model& model); Expression back() const override { return (cur == -1? h0.back() : h[cur].back()); } std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } diff --git a/dynet/gru.cc b/dynet/gru.cc index ed018674c..ef9636a58 100644 --- a/dynet/gru.cc +++ b/dynet/gru.cc @@ -17,23 +17,23 @@ enum { X2Z, H2Z, BZ, X2R, H2R, BR, X2H, H2H, BH }; GRUBuilder::GRUBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model) : hidden_dim(hidden_dim), layers(layers) { + Model& model) : hidden_dim(hidden_dim), layers(layers) { unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // z - Parameter p_x2z = model->add_parameters({hidden_dim, layer_input_dim}); - Parameter p_h2z = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_bz = model->add_parameters({hidden_dim}); + Parameter p_x2z = model.add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2z = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_bz = model.add_parameters({hidden_dim}); // r - Parameter p_x2r = model->add_parameters({hidden_dim, layer_input_dim}); - Parameter p_h2r = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_br = model->add_parameters({hidden_dim}); + Parameter p_x2r = model.add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2r = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_br = model.add_parameters({hidden_dim}); // h - Parameter p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); - Parameter p_h2h = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_bh = model->add_parameters({hidden_dim}); + Parameter p_x2h = model.add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2h = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_bh = model.add_parameters({hidden_dim}); layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next vector ps = {p_x2z, p_h2z, p_bz, p_x2r, p_h2r, p_br, p_x2h, p_h2h, p_bh}; diff --git a/dynet/gru.h b/dynet/gru.h index 8d907454a..2f15f435d 100644 --- a/dynet/gru.h +++ b/dynet/gru.h @@ -13,7 +13,7 @@ struct GRUBuilder : public RNNBuilder { explicit GRUBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model); + Model& model); Expression back() const override { return (cur == -1? h0.back() : h[cur].back()); } std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } std::vector final_s() const override { return final_h(); } diff --git a/dynet/hsm-builder.cc b/dynet/hsm-builder.cc index 8f3170667..47298c4e0 100644 --- a/dynet/hsm-builder.cc +++ b/dynet/hsm-builder.cc @@ -58,9 +58,9 @@ void Cluster::add_word(unsigned word) { terminals.push_back(word); } -void Cluster::initialize(unsigned rep_dim, Model* model) { +void Cluster::initialize(unsigned rep_dim, Model& model) { this->rep_dim = rep_dim; - initialize(*model); + initialize(model); } void Cluster::initialize(Model& model) { @@ -199,8 +199,8 @@ DYNET_SERIALIZE_IMPL(Cluster) HierarchicalSoftmaxBuilder::HierarchicalSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, - Dict* word_dict, - Model* model) { + Dict& word_dict, + Model& model) { root = read_cluster_file(cluster_file, word_dict); root->initialize(rep_dim, model); } @@ -266,7 +266,7 @@ Expression HierarchicalSoftmaxBuilder::full_log_distribution(const Expression& r inline bool is_ws(char x) { return (x == ' ' || x == '\t'); } inline bool not_ws(char x) { return (x != ' ' && x != '\t'); } -Cluster* HierarchicalSoftmaxBuilder::read_cluster_file(const std::string& cluster_file, Dict* word_dict) { +Cluster* HierarchicalSoftmaxBuilder::read_cluster_file(const std::string& cluster_file, Dict& word_dict) { cerr << "Reading clusters from " << cluster_file << " ...\n"; ifstream in(cluster_file); assert(in); @@ -308,7 +308,7 @@ Cluster* HierarchicalSoftmaxBuilder::read_cluster_file(const std::string& cluste assert(endw > startw); string word = line.substr(startw, endw - startw); - unsigned widx = word_dict->convert(word); + unsigned widx = word_dict.convert(word); node->add_word(widx); if (widx2path.size() <= widx) { diff --git a/dynet/hsm-builder.h b/dynet/hsm-builder.h index cbae999de..4518a4074 100644 --- a/dynet/hsm-builder.h +++ b/dynet/hsm-builder.h @@ -35,7 +35,7 @@ class Cluster { Cluster* add_child(unsigned sym); void add_word(unsigned word); void initialize(Model& model); - void initialize(unsigned rep_dim, Model* model); + void initialize(unsigned rep_dim, Model& model); void new_graph(ComputationGraph& cg); unsigned sample(expr::Expression h, ComputationGraph& cg) const; @@ -59,8 +59,8 @@ class HierarchicalSoftmaxBuilder : public SoftmaxBuilder { public: HierarchicalSoftmaxBuilder(unsigned rep_dim, const std::string& cluster_file, - Dict* word_dict, - Model* model); + Dict& word_dict, + Model& model); ~HierarchicalSoftmaxBuilder(); void initialize(Model& model); @@ -77,7 +77,7 @@ class HierarchicalSoftmaxBuilder : public SoftmaxBuilder { expr::Expression full_log_distribution(const expr::Expression& rep); private: - Cluster* read_cluster_file(const std::string& cluster_file, Dict* word_dict); + Cluster* read_cluster_file(const std::string& cluster_file, Dict& word_dict); std::vector widx2path; // will be NULL if not found Dict path_symbols; diff --git a/dynet/lstm.cc b/dynet/lstm.cc index 5cf0ad0c7..5aa817f44 100644 --- a/dynet/lstm.cc +++ b/dynet/lstm.cc @@ -24,25 +24,25 @@ enum { X2I, H2I, C2I, BI, X2O, H2O, C2O, BO, X2C, H2C, BC }; LSTMBuilder::LSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model) : layers(layers) { + Model& model) : layers(layers) { unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // i - Parameter p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); - Parameter p_h2i = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_c2i = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_bi = model->add_parameters({hidden_dim}); + Parameter p_x2i = model.add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2i = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_c2i = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_bi = model.add_parameters({hidden_dim}); // o - Parameter p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); - Parameter p_h2o = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_c2o = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_bo = model->add_parameters({hidden_dim}); + Parameter p_x2o = model.add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2o = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_c2o = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_bo = model.add_parameters({hidden_dim}); // c - Parameter p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); - Parameter p_h2c = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_bc = model->add_parameters({hidden_dim}); + Parameter p_x2c = model.add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2c = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_bc = model.add_parameters({hidden_dim}); layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next vector ps = {p_x2i, p_h2i, p_c2i, p_bi, p_x2o, p_h2o, p_c2o, p_bo, p_x2c, p_h2c, p_bc}; diff --git a/dynet/lstm.h b/dynet/lstm.h index ce92e153b..c280cb931 100644 --- a/dynet/lstm.h +++ b/dynet/lstm.h @@ -16,7 +16,7 @@ struct LSTMBuilder : public RNNBuilder { explicit LSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model); + Model& model); Expression back() const override { return (cur == -1? h0.back() : h[cur].back()); } std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } diff --git a/dynet/pretrain.cc b/dynet/pretrain.cc index 53681964f..8c69761fc 100644 --- a/dynet/pretrain.cc +++ b/dynet/pretrain.cc @@ -25,10 +25,10 @@ void save_pretrained_embeddings(const std::string& fname, } void read_pretrained_embeddings(const std::string& fname, - Dict* d, - std::unordered_map>* vectors) { + Dict& d, + std::unordered_map>& vectors) { int unk = -1; - if (d->is_frozen()) unk = d->get_unk_id(); + if (d.is_frozen()) unk = d.get_unk_id(); cerr << "Loading word vectors from " << fname << " ...\n"; ifstream in(fname); assert(in); @@ -45,15 +45,15 @@ void read_pretrained_embeddings(const std::string& fname, v.push_back(x); } unsigned vec_size = v.size(); - int wid = d->convert(word); - if (wid != unk) (*vectors)[wid] = v; + int wid = d.convert(word); + if (wid != unk) vectors[wid] = v; while(getline(in, line)) { istringstream lin(line); lin >> word; - int w = d->convert(word); + int w = d.convert(word); if (w != unk) { for (unsigned i = 0; i < vec_size; ++i) lin >> v[i]; - (*vectors)[w] = v; + vectors[w] = v; } } } diff --git a/dynet/pretrain.h b/dynet/pretrain.h index 7ec2189ee..4e939daf8 100644 --- a/dynet/pretrain.h +++ b/dynet/pretrain.h @@ -14,8 +14,8 @@ void save_pretrained_embeddings(const std::string& fname, const LookupParameter& lp); void read_pretrained_embeddings(const std::string& fname, - Dict* d, - std::unordered_map>* vectors); + Dict& d, + std::unordered_map>& vectors); } // namespace dynet diff --git a/dynet/rnn.cc b/dynet/rnn.cc index ff70f6c23..84b83373c 100644 --- a/dynet/rnn.cc +++ b/dynet/rnn.cc @@ -47,16 +47,16 @@ DYNET_SERIALIZE_IMPL(RNNBuilder) SimpleRNNBuilder::SimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model, + Model& model, bool support_lags) : layers(layers), lagging(support_lags) { unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { - Parameter p_x2h = model->add_parameters({hidden_dim, layer_input_dim}); - Parameter p_h2h = model->add_parameters({hidden_dim, hidden_dim}); - Parameter p_hb = model->add_parameters({hidden_dim}); + Parameter p_x2h = model.add_parameters({hidden_dim, layer_input_dim}); + Parameter p_h2h = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_hb = model.add_parameters({hidden_dim}); vector ps = {p_x2h, p_h2h, p_hb}; if (lagging) - ps.push_back(model->add_parameters({hidden_dim, hidden_dim})); + ps.push_back(model.add_parameters({hidden_dim, hidden_dim})); params.push_back(ps); layer_input_dim = hidden_dim; } diff --git a/dynet/rnn.h b/dynet/rnn.h index 43868c9a1..eac3da3bf 100644 --- a/dynet/rnn.h +++ b/dynet/rnn.h @@ -310,7 +310,7 @@ struct SimpleRNNBuilder : public RNNBuilder { explicit SimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model, + Model& model, bool support_lags = false); protected: diff --git a/dynet/training.h b/dynet/training.h index 5cf27524a..3a9fc5528 100644 --- a/dynet/training.h +++ b/dynet/training.h @@ -44,9 +44,9 @@ struct Trainer { * \param e0 Initial learning rate * \param edecay Learning rate decay */ - explicit Trainer(Model* m, real e0, real edecay = 0.0) : + explicit Trainer(Model& m, real e0, real edecay = 0.0) : eta0(e0), eta(e0), eta_decay(edecay), epoch(), clipping_enabled(true), clip_threshold(5), - clips(), updates(), sparse_updates_enabled(true), aux_allocated(false), model(m) {} + clips(), updates(), sparse_updates_enabled(true), aux_allocated(false), model(&m) {} virtual ~Trainer(); void update(real scale = 1.0); @@ -160,7 +160,7 @@ struct SimpleSGDTrainer : public Trainer { * \param e0 Initial learning rate * \param edecay Learning rate decay parameter. */ - explicit SimpleSGDTrainer(Model* m, real e0 = 0.1, real edecay = 0.0) : Trainer(m, e0, edecay) {} + explicit SimpleSGDTrainer(Model& m, real e0 = 0.1, real edecay = 0.0) : Trainer(m, e0, edecay) {} protected: DYNET_TRAINER_DEFINE_DEV_IMPL() private: @@ -189,7 +189,7 @@ struct MomentumSGDTrainer : public Trainer { * \param mom Momentum * \param edecay Learning rate decay parameter */ - explicit MomentumSGDTrainer(Model* m, real e0 = 0.01, real mom = 0.9, real edecay = 0.0) : + explicit MomentumSGDTrainer(Model& m, real e0 = 0.01, real mom = 0.9, real edecay = 0.0) : Trainer(m, e0, edecay), momentum(mom) {} protected: @@ -229,7 +229,7 @@ struct AdagradTrainer : public Trainer { * \param eps Bias parameter \f$\epsilon\f$ in the adagrad formula * \param edecay Learning rate decay parameter */ - explicit AdagradTrainer(Model* m, real e0 = 0.1, real eps = 1e-20, real edecay = 0.0) : + explicit AdagradTrainer(Model& m, real e0 = 0.1, real eps = 1e-20, real edecay = 0.0) : Trainer(m, e0, edecay), epsilon(eps) {} protected: DYNET_TRAINER_DEFINE_DEV_IMPL() @@ -266,7 +266,7 @@ struct AdadeltaTrainer : public Trainer { * \param rho Update parameter for the moving average of updates in the numerator * \param edecay Learning rate decay parameter */ - explicit AdadeltaTrainer(Model* m, real eps = 1e-6, real rho = 0.95, real edecay = 0.0) : + explicit AdadeltaTrainer(Model& m, real eps = 1e-6, real rho = 0.95, real edecay = 0.0) : Trainer(m, 1.0), epsilon(eps), rho(rho) {} protected: DYNET_TRAINER_DEFINE_DEV_IMPL() @@ -304,7 +304,7 @@ struct RmsPropTrainer : public Trainer { * \param rho Update parameter for the moving average (`rho = 0` is equivalent to using Adagrad) * \param edecay Learning rate decay parameter */ - explicit RmsPropTrainer(Model* m, real e0 = 0.1, real eps = 1e-20, real rho = 0.95, real edecay = 0.0) : + explicit RmsPropTrainer(Model& m, real e0 = 0.1, real eps = 1e-20, real rho = 0.95, real edecay = 0.0) : Trainer(m, e0, edecay), epsilon(eps), rho(rho) {} protected: DYNET_TRAINER_DEFINE_DEV_IMPL() @@ -342,7 +342,7 @@ struct AdamTrainer : public Trainer { * \param eps Bias parameter \f$\epsilon\f$ * \param edecay Learning rate decay parameter */ - explicit AdamTrainer(Model* m, float e0 = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8, real edecay = 0.0) : + explicit AdamTrainer(Model& m, float e0 = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8, real edecay = 0.0) : Trainer(m, e0), beta_1(beta_1), beta_2(beta_2), epsilon(eps) {} protected: diff --git a/dynet/treelstm.cc b/dynet/treelstm.cc index 51b500bec..08209b641 100644 --- a/dynet/treelstm.cc +++ b/dynet/treelstm.cc @@ -24,31 +24,31 @@ SocherTreeLSTMBuilder::SocherTreeLSTMBuilder(unsigned N, unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model) : layers(layers), N(N), cg(nullptr) { + Model& model) : layers(layers), N(N), cg(nullptr) { unsigned layer_input_dim = input_dim; for (unsigned i = 0; i < layers; ++i) { // i - Parameter p_x2i = model->add_parameters({hidden_dim, layer_input_dim}); - LookupParameter p_h2i = model->add_lookup_parameters(N, {hidden_dim, hidden_dim}); - LookupParameter p_c2i = model->add_lookup_parameters(N, {hidden_dim, hidden_dim}); - Parameter p_bi = model->add_parameters({hidden_dim}); + Parameter p_x2i = model.add_parameters({hidden_dim, layer_input_dim}); + LookupParameter p_h2i = model.add_lookup_parameters(N, {hidden_dim, hidden_dim}); + LookupParameter p_c2i = model.add_lookup_parameters(N, {hidden_dim, hidden_dim}); + Parameter p_bi = model.add_parameters({hidden_dim}); // f - Parameter p_x2f = model->add_parameters({hidden_dim, layer_input_dim}); - LookupParameter p_h2f = model->add_lookup_parameters(N*N, {hidden_dim, hidden_dim}); - LookupParameter p_c2f = model->add_lookup_parameters(N*N, {hidden_dim, hidden_dim}); - Parameter p_bf = model->add_parameters({hidden_dim}); + Parameter p_x2f = model.add_parameters({hidden_dim, layer_input_dim}); + LookupParameter p_h2f = model.add_lookup_parameters(N*N, {hidden_dim, hidden_dim}); + LookupParameter p_c2f = model.add_lookup_parameters(N*N, {hidden_dim, hidden_dim}); + Parameter p_bf = model.add_parameters({hidden_dim}); // o - Parameter p_x2o = model->add_parameters({hidden_dim, layer_input_dim}); - LookupParameter p_h2o = model->add_lookup_parameters(N, {hidden_dim, hidden_dim}); - LookupParameter p_c2o = model->add_lookup_parameters(N, {hidden_dim, hidden_dim}); - Parameter p_bo = model->add_parameters({hidden_dim}); + Parameter p_x2o = model.add_parameters({hidden_dim, layer_input_dim}); + LookupParameter p_h2o = model.add_lookup_parameters(N, {hidden_dim, hidden_dim}); + LookupParameter p_c2o = model.add_lookup_parameters(N, {hidden_dim, hidden_dim}); + Parameter p_bo = model.add_parameters({hidden_dim}); // c (a.k.a. u) - Parameter p_x2c = model->add_parameters({hidden_dim, layer_input_dim}); - LookupParameter p_h2c = model->add_lookup_parameters(N, {hidden_dim, hidden_dim}); - Parameter p_bc = model->add_parameters({hidden_dim}); + Parameter p_x2c = model.add_parameters({hidden_dim, layer_input_dim}); + LookupParameter p_h2c = model.add_lookup_parameters(N, {hidden_dim, hidden_dim}); + Parameter p_bc = model.add_parameters({hidden_dim}); layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next vector ps = {p_x2i, p_bi, p_x2f, p_bf, p_x2o, p_bo, p_x2c, p_bc}; @@ -281,7 +281,7 @@ void TreeLSTMBuilder::copy(const RNNBuilder&) { throw std::runtime_error("copy() UnidirectionalTreeLSTMBuilder::UnidirectionalTreeLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model) : cg(nullptr) { + Model& model) : cg(nullptr) { node_builder = LSTMBuilder(layers, input_dim, hidden_dim, model); } @@ -314,7 +314,7 @@ Expression UnidirectionalTreeLSTMBuilder::add_input(int id, vector children BidirectionalTreeLSTMBuilder::BidirectionalTreeLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model) : cg(nullptr) { + Model& model) : cg(nullptr) { assert (hidden_dim % 2 == 0); fwd_node_builder = LSTMBuilder(layers, input_dim, hidden_dim / 2, model); rev_node_builder = LSTMBuilder(layers, input_dim, hidden_dim / 2, model); diff --git a/dynet/treelstm.h b/dynet/treelstm.h index 2c17f1a2b..9649c1219 100644 --- a/dynet/treelstm.h +++ b/dynet/treelstm.h @@ -41,7 +41,7 @@ struct SocherTreeLSTMBuilder : public TreeLSTMBuilder { unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model); + Model& model); Expression add_input(int id, std::vector children, const Expression& x) override; void copy(const RNNBuilder & params) override; @@ -88,7 +88,7 @@ struct UnidirectionalTreeLSTMBuilder : public TreeLSTMBuilder { explicit UnidirectionalTreeLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model); + Model& model); Expression add_input(int id, std::vector children, const Expression& x) override; protected: @@ -115,7 +115,7 @@ struct BidirectionalTreeLSTMBuilder : public TreeLSTMBuilder { explicit BidirectionalTreeLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model* model); + Model& model); Expression add_input(int id, std::vector children, const Expression& x) override; protected: diff --git a/examples/embed-cl/train_embed-cl.cc b/examples/embed-cl/train_embed-cl.cc index 52b84ef6c..da1fcb9d0 100644 --- a/examples/embed-cl/train_embed-cl.cc +++ b/examples/embed-cl/train_embed-cl.cc @@ -96,7 +96,7 @@ int main(int argc, char** argv) { while(getline(in, line)) { ++tlc; vector src, trg; - read_sentence_pair(line, &src, &sd, &trg, &td); + read_sentence_pair(line, src, sd, trg, td); training.push_back(make_pair(src, trg)); } cerr << tlc << " lines, " << sd.size() << " source types, " << td.size() << " target types\n"; @@ -149,9 +149,9 @@ int main(int argc, char** argv) { bool use_momentum = false; Trainer* sgd = nullptr; if (use_momentum) - sgd = new MomentumSGDTrainer(&model); + sgd = new MomentumSGDTrainer(model); else - sgd = new SimpleSGDTrainer(&model); + sgd = new SimpleSGDTrainer(model); unsigned report_every_i = 100; unsigned si = training.size(); diff --git a/examples/encdec/encdec.h b/examples/encdec/encdec.h index d6246b397..341c0ca0b 100644 --- a/examples/encdec/encdec.h +++ b/examples/encdec/encdec.h @@ -99,11 +99,11 @@ struct EncoderDecoder { unsigned hidden_dim, bool bwd = false) : LAYERS(num_layers), INPUT_DIM(input_dim), HIDDEN_DIM(hidden_dim), bidirectional(bwd), - dec_builder(num_layers, input_dim, hidden_dim, &model), - fwd_enc_builder(num_layers, input_dim, hidden_dim, &model) { + dec_builder(num_layers, input_dim, hidden_dim, model), + fwd_enc_builder(num_layers, input_dim, hidden_dim, model) { if (bidirectional) { - rev_enc_builder = Builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model); + rev_enc_builder = Builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model); p_ie2oe = model.add_parameters({unsigned(HIDDEN_DIM * LAYERS * 2), unsigned(HIDDEN_DIM * LAYERS * 4) }); diff --git a/examples/encdec/train_encdec.cc b/examples/encdec/train_encdec.cc index 7fd79305d..bbcfde28e 100644 --- a/examples/encdec/train_encdec.cc +++ b/examples/encdec/train_encdec.cc @@ -56,7 +56,7 @@ int main(int argc, char** argv) { assert(in); while (getline(in, line)) { ++tlc; - training.push_back(read_sentence(line, &d)); + training.push_back(read_sentence(line, d)); ttoks += training.back().size(); if (training.back().front() != kSOS && training.back().back() != kEOS) { cerr << "Training sentence in " << params.train_file << ":" << tlc @@ -91,7 +91,7 @@ int main(int argc, char** argv) { assert(in); while (getline(in, line)) { ++dlc; - dev.push_back(read_sentence(line, &d)); + dev.push_back(read_sentence(line, d)); dtoks += dev.back().size(); if (dev.back().front() != kSOS && dev.back().back() != kEOS) { cerr << "Dev sentence in " << params.dev_file << ":" @@ -130,7 +130,7 @@ int main(int argc, char** argv) { Model model; // Use Adam optimizer Trainer* adam = nullptr; - adam = new AdamTrainer(&model, 0.001, 0.9, 0.999, 1e-8); + adam = new AdamTrainer(model, 0.001, 0.9, 0.999, 1e-8); adam->clip_threshold *= params.BATCH_SIZE; // Create model diff --git a/examples/mlc/train_mlc.cc b/examples/mlc/train_mlc.cc index adf33a98d..f5d77eda3 100644 --- a/examples/mlc/train_mlc.cc +++ b/examples/mlc/train_mlc.cc @@ -128,8 +128,8 @@ int main(int argc, char** argv) { Model m; MLCBuilder mlc(m, max_xi, max_yi); - //AdadeltaTrainer sgd(&m); - SimpleSGDTrainer sgd(&m); + //AdadeltaTrainer sgd(m); + SimpleSGDTrainer sgd(m); sgd.eta0 = 0.001; sgd.eta = 0.001; diff --git a/examples/nlm/train_nlm.cc b/examples/nlm/train_nlm.cc index d98680fe4..c21db45d0 100644 --- a/examples/nlm/train_nlm.cc +++ b/examples/nlm/train_nlm.cc @@ -22,7 +22,7 @@ int main(int argc, char** argv) { // parameters Model model; - SimpleSGDTrainer sgd(&model); + SimpleSGDTrainer sgd(model); LookupParameter p_c = model.add_lookup_parameters(VOCAB_SIZE, {DIM}); ComputationGraph cg; diff --git a/examples/poisson-regression/train_poisson-regression.cc b/examples/poisson-regression/train_poisson-regression.cc index 072e748e1..73530860e 100644 --- a/examples/poisson-regression/train_poisson-regression.cc +++ b/examples/poisson-regression/train_poisson-regression.cc @@ -36,7 +36,7 @@ struct RNNLengthPredictor { Parameter p_R; Parameter p_bias; Builder builder; - explicit RNNLengthPredictor(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + explicit RNNLengthPredictor(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); p_R = model.add_parameters({1, HIDDEN_DIM}); p_bias = model.add_parameters({1}); @@ -84,7 +84,7 @@ int main(int argc, char** argv) { while(getline(in, line)) { ++tlc; vector x, ty; - read_sentence_pair(line, &x, &d, &ty, &td); + read_sentence_pair(line, x, d, ty, td); assert(ty.size() == 1); const string& v = td.convert(ty[0]); for(auto c : v) { assert(c >= '0' && c <= '9'); } @@ -111,7 +111,7 @@ int main(int argc, char** argv) { while(getline(in, line)) { ++dlc; vector x, ty; - read_sentence_pair(line, &x, &d, &ty, &td); + read_sentence_pair(line, x, d, ty, td); assert(ty.size() == 1); const string& v = td.convert(ty[0]); for(auto c : v) { assert(c >= '0' && c <= '9'); } @@ -137,7 +137,7 @@ int main(int argc, char** argv) { Model model; Trainer* sgd = nullptr; - sgd = new SimpleSGDTrainer(&model); + sgd = new SimpleSGDTrainer(model); RNNLengthPredictor lm(model); if (argc == 4) { diff --git a/examples/read-write/train_read-write.cc b/examples/read-write/train_read-write.cc index 3982e2865..a483a2742 100644 --- a/examples/read-write/train_read-write.cc +++ b/examples/read-write/train_read-write.cc @@ -48,7 +48,7 @@ class XORModel { a = parameter(cg, pa); } - float Train(const vector& input, dynet::real gold_output, SimpleSGDTrainer* sgd) { + float Train(const vector& input, dynet::real gold_output, SimpleSGDTrainer& sgd) { ComputationGraph cg; NewGraph(cg); @@ -61,7 +61,7 @@ class XORModel { float return_loss = as_scalar(cg.forward(loss)); cg.backward(loss); - sgd->update(1.0); + sgd.update(1.0); return return_loss; } @@ -133,7 +133,7 @@ int main(int argc, char** argv) { const unsigned HIDDEN = 8; const unsigned ITERATIONS = 20; Model m; - SimpleSGDTrainer sgd(&m); + SimpleSGDTrainer sgd(m); XORModel model(HIDDEN, m); vector x_values(2); // set x_values to change the inputs @@ -148,7 +148,7 @@ int main(int argc, char** argv) { x_values[0] = x1 ? 1 : -1; x_values[1] = x2 ? 1 : -1; y_value = (x1 != x2) ? 1 : -1; - loss += model.Train(x_values, y_value, &sgd); + loss += model.Train(x_values, y_value, sgd); } loss /= 4; cerr << "E = " << loss << endl; diff --git a/examples/rnnlm-aevb/train_rnnlm-aevb.cc b/examples/rnnlm-aevb/train_rnnlm-aevb.cc index 3016eab99..e6b080dff 100644 --- a/examples/rnnlm-aevb/train_rnnlm-aevb.cc +++ b/examples/rnnlm-aevb/train_rnnlm-aevb.cc @@ -51,8 +51,8 @@ struct RNNLanguageModel { Parameter p_h0b; explicit RNNLanguageModel(Model& model) : - ebuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), - dbuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + ebuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, model), + dbuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) { p_H = model.add_parameters({HIDDEN_DIM2, HIDDEN_DIM}); p_hb = model.add_parameters({HIDDEN_DIM2}); p_h2m = model.add_parameters({LATENT_DIM, HIDDEN_DIM2}); @@ -137,7 +137,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++tlc; - training.push_back(read_sentence(line, &d)); + training.push_back(read_sentence(line, d)); ttoks += training.back().size(); if (training.back().front() != kSOS && training.back().back() != kEOS) { cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; @@ -157,7 +157,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++dlc; - dev.push_back(read_sentence(line, &d)); + dev.push_back(read_sentence(line, d)); dtoks += dev.back().size(); if (dev.back().front() != kSOS && dev.back().back() != kEOS) { cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; @@ -180,9 +180,9 @@ int main(int argc, char** argv) { Trainer* sgd = nullptr; // bool use_momentum = false; // if (use_momentum) - // sgd = new MomentumSGDTrainer(&model); + // sgd = new MomentumSGDTrainer(model); // else - sgd = new SimpleSGDTrainer(&model); + sgd = new SimpleSGDTrainer(model); RNNLanguageModel lm(model); //RNNLanguageModel lm(model); diff --git a/examples/rnnlm-batch/rnnlm-batch.h b/examples/rnnlm-batch/rnnlm-batch.h index c1a1f605c..96f02b0b1 100644 --- a/examples/rnnlm-batch/rnnlm-batch.h +++ b/examples/rnnlm-batch/rnnlm-batch.h @@ -95,7 +95,7 @@ struct RNNBatchLanguageModel { unsigned VOCAB_SIZE) : LAYERS(LAYERS), INPUT_DIM(INPUT_DIM), HIDDEN_DIM(HIDDEN_DIM), VOCAB_SIZE(VOCAB_SIZE), - rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + rnn(LAYERS, INPUT_DIM, HIDDEN_DIM, model) { // Add embedding parameters to the model p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); @@ -232,4 +232,4 @@ struct RNNBatchLanguageModel { } }; -#endif \ No newline at end of file +#endif diff --git a/examples/rnnlm-batch/train_rnnlm-batch.cc b/examples/rnnlm-batch/train_rnnlm-batch.cc index c8b5fc098..a8bfb4a92 100644 --- a/examples/rnnlm-batch/train_rnnlm-batch.cc +++ b/examples/rnnlm-batch/train_rnnlm-batch.cc @@ -54,7 +54,7 @@ int main(int argc, char** argv) { assert(in); while (getline(in, line)) { ++tlc; - training.push_back(read_sentence(line, &d)); + training.push_back(read_sentence(line, d)); ttoks += training.back().size(); if (training.back().front() != kSOS && training.back().back() != kEOS) { cerr << "Training sentence in " << params.train_file << ":" << tlc @@ -89,7 +89,7 @@ int main(int argc, char** argv) { assert(in); while (getline(in, line)) { ++dlc; - dev.push_back(read_sentence(line, &d)); + dev.push_back(read_sentence(line, d)); dtoks += dev.back().size(); if (dev.back().front() != kSOS && dev.back().back() != kEOS) { cerr << "Dev sentence in " << params.dev_file << ":" << dlc @@ -127,7 +127,7 @@ int main(int argc, char** argv) { // Initialize model and trainer ------------------------------------------------------------------ Model model; // Use Adam optimizer - Trainer* adam = new AdamTrainer(&model, 0.001, 0.9, 0.999, 1e-8); + Trainer* adam = new AdamTrainer(model, 0.001, 0.9, 0.999, 1e-8); adam->clip_threshold *= params.BATCH_SIZE; // Create model diff --git a/examples/rnnlm-cfsm/train_rnnlm-cfsm.cc b/examples/rnnlm-cfsm/train_rnnlm-cfsm.cc index 05179d56f..77d0a0353 100644 --- a/examples/rnnlm-cfsm/train_rnnlm-cfsm.cc +++ b/examples/rnnlm-cfsm/train_rnnlm-cfsm.cc @@ -36,7 +36,7 @@ struct RNNLanguageModel { ClassFactoredSoftmaxBuilder& cfsm; explicit RNNLanguageModel(Model& model, ClassFactoredSoftmaxBuilder& h) : p_c(model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), - builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), + builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model), cfsm(h) {} // return Expression of total loss @@ -90,7 +90,7 @@ int main(int argc, char** argv) { kSOS = d.convert(""); kEOS = d.convert(""); Model model; - ClassFactoredSoftmaxBuilder cfsm(HIDDEN_DIM, argv[3], &d, &model); + ClassFactoredSoftmaxBuilder cfsm(HIDDEN_DIM, argv[3], d, model); vector> training, dev; string line; int tlc = 0; @@ -101,7 +101,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++tlc; - training.push_back(read_sentence(line, &d)); + training.push_back(read_sentence(line, d)); ttoks += training.back().size(); if (training.back().front() != kSOS && training.back().back() != kEOS) { cerr << "Training sentence in " << argv[1] << ":" << tlc << " didn't start or end with , \n"; @@ -121,7 +121,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++dlc; - dev.push_back(read_sentence(line, &d)); + dev.push_back(read_sentence(line, d)); dtoks += dev.back().size(); if (dev.back().front() != kSOS && dev.back().back() != kEOS) { cerr << "Dev sentence in " << argv[2] << ":" << tlc << " didn't start or end with , \n"; @@ -143,9 +143,9 @@ int main(int argc, char** argv) { Trainer* sgd = nullptr; // bool use_momentum = false; // if (use_momentum) - // sgd = new MomentumSGDTrainer(&model); + // sgd = new MomentumSGDTrainer(model); // else - sgd = new SimpleSGDTrainer(&model); + sgd = new SimpleSGDTrainer(model); RNNLanguageModel lm(model, cfsm); //RNNLanguageModel lm(model, cfsm); diff --git a/examples/rnnlm-final-batch/train_rnnlm-final-batch.cc b/examples/rnnlm-final-batch/train_rnnlm-final-batch.cc index a7a53ece3..fbee4832f 100644 --- a/examples/rnnlm-final-batch/train_rnnlm-final-batch.cc +++ b/examples/rnnlm-final-batch/train_rnnlm-final-batch.cc @@ -38,7 +38,7 @@ struct RNNLanguageModel { Parameter p_last; Parameter p_last_bias; Builder builder; - explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); p_bias = model.add_parameters({VOCAB_SIZE}); @@ -197,7 +197,7 @@ int main(int argc, char** argv) { Model model; Trainer* sgd = nullptr; - sgd = new SimpleSGDTrainer(&model); + sgd = new SimpleSGDTrainer(model); sgd->clip_threshold *= BATCH_SIZE; RNNLanguageModel lm(model); diff --git a/examples/rnnlm-givenbag/rnnlm-givenbag.cc b/examples/rnnlm-givenbag/rnnlm-givenbag.cc index 53283d1ea..6d6121117 100644 --- a/examples/rnnlm-givenbag/rnnlm-givenbag.cc +++ b/examples/rnnlm-givenbag/rnnlm-givenbag.cc @@ -35,7 +35,7 @@ struct RNNLanguageModel { Parameter p_R; Parameter p_bias; Builder builder; - explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); p_bias = model.add_parameters({VOCAB_SIZE}); @@ -166,8 +166,8 @@ int main(int argc, char** argv) { Trainer* sgd = nullptr; //if (use_momentum) //else - //sgd = new SimpleSGDTrainer(&model); - sgd = new MomentumSGDTrainer(&model); + //sgd = new SimpleSGDTrainer(model); + sgd = new MomentumSGDTrainer(model); RNNLanguageModel lm(model); //RNNLanguageModel lm(model); if (argc == 4) { diff --git a/examples/rnnlm-mp/rnnlm.h b/examples/rnnlm-mp/rnnlm.h index 45a92ffea..58f9b5cd3 100644 --- a/examples/rnnlm-mp/rnnlm.h +++ b/examples/rnnlm-mp/rnnlm.h @@ -24,7 +24,7 @@ struct RNNLanguageModel { Parameter p_R; Parameter p_bias; Builder builder; - explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) { kSOS = d.convert(""); kEOS = d.convert(""); p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); diff --git a/examples/rnnlm-mp/train_rnnlm-mp.cc b/examples/rnnlm-mp/train_rnnlm-mp.cc index 5b1f74e92..7138b47db 100644 --- a/examples/rnnlm-mp/train_rnnlm-mp.cc +++ b/examples/rnnlm-mp/train_rnnlm-mp.cc @@ -31,7 +31,7 @@ vector ReadData(string filename) { } string line; while (getline(fs, line)) { - data.push_back(read_sentence(line, &d)); + data.push_back(read_sentence(line, d)); } return data; } @@ -75,9 +75,9 @@ int main(int argc, char** argv) { dynet::initialize(argc, argv, true); Model model; - SimpleSGDTrainer sgd(&model, 0.2); - //AdagradTrainer sgd(&model, 0.0); - //AdamTrainer sgd(&model, 0.0); + SimpleSGDTrainer sgd(model, 0.2); + //AdagradTrainer sgd(model, 0.0); + //AdamTrainer sgd(model, 0.0); RNNLanguageModel rnnlm(model); diff --git a/examples/rnnlm/train_rnnlm.cc b/examples/rnnlm/train_rnnlm.cc index 67c63610f..9e7b5d40c 100644 --- a/examples/rnnlm/train_rnnlm.cc +++ b/examples/rnnlm/train_rnnlm.cc @@ -79,7 +79,7 @@ struct RNNLanguageModel { Parameter p_R; Parameter p_bias; Builder builder; - explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + explicit RNNLanguageModel(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); p_bias = model.add_parameters({VOCAB_SIZE}); @@ -172,9 +172,9 @@ int main(int argc, char** argv) { DROPOUT = conf["dropout"].as(); Model model; if (conf.count("clusters")) - cfsm = new ClassFactoredSoftmaxBuilder(HIDDEN_DIM, conf["clusters"].as(), &d, &model); + cfsm = new ClassFactoredSoftmaxBuilder(HIDDEN_DIM, conf["clusters"].as(), d, model); else if (conf.count("paths")) - cfsm = new HierarchicalSoftmaxBuilder(HIDDEN_DIM, conf["paths"].as(), &d, &model); + cfsm = new HierarchicalSoftmaxBuilder(HIDDEN_DIM, conf["paths"].as(), d, model); float eta_decay_rate = 1; unsigned eta_decay_onset_epoch = 0; if (conf.count("eta_decay_onset_epoch")) @@ -192,7 +192,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++tlc; - training.push_back(read_sentence(line, &d)); + training.push_back(read_sentence(line, d)); ttoks += training.back().size(); if (training.back().front() == kSOS || training.back().back() == kEOS) { cerr << "Training sentence in " << argv[1] << ":" << tlc << " started with or ended with \n"; @@ -205,7 +205,7 @@ int main(int argc, char** argv) { d.set_unk(""); VOCAB_SIZE = d.size(); if (!cfsm) - cfsm = new StandardSoftmaxBuilder(HIDDEN_DIM, VOCAB_SIZE, &model); + cfsm = new StandardSoftmaxBuilder(HIDDEN_DIM, VOCAB_SIZE, model); if (conf.count("test")) { string testf = conf["test"].as(); @@ -213,7 +213,7 @@ int main(int argc, char** argv) { ifstream in(testf); assert(in); while(getline(in, line)) { - test.push_back(read_sentence(line, &d)); + test.push_back(read_sentence(line, d)); if (test.back().front() == kSOS || test.back().back() == kEOS) { cerr << "Test sentence in " << argv[2] << ":" << tlc << " started with or ended with \n"; abort(); @@ -221,7 +221,7 @@ int main(int argc, char** argv) { } } - Trainer* sgd = new SimpleSGDTrainer(&model); + Trainer* sgd = new SimpleSGDTrainer(model); sgd->eta0 = sgd->eta = conf["eta0"].as(); RNNLanguageModel lm(model); @@ -250,7 +250,7 @@ int main(int argc, char** argv) { assert(in); while(getline(in, line)) { ++dlc; - dev.push_back(read_sentence(line, &d)); + dev.push_back(read_sentence(line, d)); dtoks += dev.back().size(); if (dev.back().front() == kSOS || dev.back().back() == kEOS) { cerr << "Dev sentence in " << argv[2] << ":" << tlc << " started with or ended with \n"; @@ -383,7 +383,7 @@ int main(int argc, char** argv) { } // Score hypothesis ComputationGraph cg; - Expression loss_expr = lm.BuildLMGraph(read_sentence(fields[HYP_FIELD], &d), cg, false); + Expression loss_expr = lm.BuildLMGraph(read_sentence(fields[HYP_FIELD], d), cg, false); double loss = as_scalar(cg.forward(loss_expr)); // Add score ostringstream os; diff --git a/examples/segrnn-sup/train_segrnn-sup.cc b/examples/segrnn-sup/train_segrnn-sup.cc index e5d24810e..123646ea9 100644 --- a/examples/segrnn-sup/train_segrnn-sup.cc +++ b/examples/segrnn-sup/train_segrnn-sup.cc @@ -176,8 +176,8 @@ struct BiTrans { Parameter p_cb; explicit BiTrans(Model& model) : - l2rbuilder(LAYERS, INPUT_DIM, XCRIBE_DIM, &model), - r2lbuilder(LAYERS, INPUT_DIM, XCRIBE_DIM, &model) { + l2rbuilder(LAYERS, INPUT_DIM, XCRIBE_DIM, model), + r2lbuilder(LAYERS, INPUT_DIM, XCRIBE_DIM, model) { p_f2c = model.add_parameters({XCRIBE_DIM, XCRIBE_DIM}); p_r2c = model.add_parameters({XCRIBE_DIM, XCRIBE_DIM}); p_cb = model.add_parameters({XCRIBE_DIM}); @@ -223,7 +223,7 @@ struct SegEmbedUni { Builder builder; vector> h; // h[i][length of segment - 1] explicit SegEmbedUni(Model& m) : - builder(LAYERS, XCRIBE_DIM, SEG_DIM, &m) { + builder(LAYERS, XCRIBE_DIM, SEG_DIM, m) { p_h0 = m.add_parameters({XCRIBE_DIM}); } void construct_chart(ComputationGraph& cg, const vector& c, int max_seg_len = 0) { @@ -1073,8 +1073,8 @@ int main(int argc, char** argv) { } Model model; - // auto sgd = new SimpleSGDTrainer(&model); - auto sgd = new AdamTrainer(&model, 0.0005, 0.01, 0.9999, 1e-8); + // auto sgd = new SimpleSGDTrainer(model); + auto sgd = new AdamTrainer(model, 0.0005, 0.01, 0.9999, 1e-8); int max_seg_len = DATA_MAX_SEG_LEN + 1; if(vm.count("train_max_seg_len")){ max_seg_len = vm["train_max_seg_len"].as(); diff --git a/examples/skiprnnlm/train_skiprnnlm.cc b/examples/skiprnnlm/train_skiprnnlm.cc index 2c43acada..cdaaea534 100644 --- a/examples/skiprnnlm/train_skiprnnlm.cc +++ b/examples/skiprnnlm/train_skiprnnlm.cc @@ -45,7 +45,7 @@ struct RNNSkipLM { Parameter p_R; Parameter p_bias; SimpleRNNBuilder builder; - explicit RNNSkipLM(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model, true) { + explicit RNNSkipLM(Model& model) : builder(LAYERS, INPUT_DIM, HIDDEN_DIM, model, true) { p_c = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); p_R = model.add_parameters({VOCAB_SIZE, HIDDEN_DIM}); p_bias = model.add_parameters({VOCAB_SIZE}); @@ -130,9 +130,9 @@ int main(int argc, char** argv) { bool use_momentum = false; Trainer* sgd = nullptr; if (use_momentum) - sgd = new MomentumSGDTrainer(&model); + sgd = new MomentumSGDTrainer(model); else - sgd = new SimpleSGDTrainer(&model); + sgd = new SimpleSGDTrainer(model); RNNSkipLM lm(model); if (argc == 4) { diff --git a/examples/tag-bilstm/train_tag-bilstm.cc b/examples/tag-bilstm/train_tag-bilstm.cc index bbe6899b9..0aea00a4a 100644 --- a/examples/tag-bilstm/train_tag-bilstm.cc +++ b/examples/tag-bilstm/train_tag-bilstm.cc @@ -47,8 +47,8 @@ struct RNNLanguageModel { Builder l2rbuilder; Builder r2lbuilder; explicit RNNLanguageModel(Model& model) : - l2rbuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model), - r2lbuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, &model) { + l2rbuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, model), + r2lbuilder(LAYERS, INPUT_DIM, HIDDEN_DIM, model) { p_w = model.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM}); p_l2th = model.add_parameters({TAG_HIDDEN_DIM, HIDDEN_DIM}); p_r2th = model.add_parameters({TAG_HIDDEN_DIM, HIDDEN_DIM}); @@ -134,7 +134,7 @@ int main(int argc, char** argv) { ++tlc; int nc = 0; vector x,y; - read_sentence_pair(line, &x, &d, &y, &td); + read_sentence_pair(line, x, d, y, td); assert(x.size() == y.size()); if (x.size() == 0) { cerr << line << endl; abort(); } training.push_back(make_pair(x,y)); @@ -164,7 +164,7 @@ int main(int argc, char** argv) { while(getline(in, line)) { ++dlc; vector x,y; - read_sentence_pair(line, &x, &d, &y, &td); + read_sentence_pair(line, x, d, y, td); assert(x.size() == y.size()); dev.push_back(make_pair(x,y)); dtoks += x.size(); @@ -185,9 +185,9 @@ int main(int argc, char** argv) { bool use_momentum = true; Trainer* sgd = nullptr; if (use_momentum) - sgd = new MomentumSGDTrainer(&model); + sgd = new MomentumSGDTrainer(model); else - sgd = new SimpleSGDTrainer(&model); + sgd = new SimpleSGDTrainer(model); RNNLanguageModel lm(model); //RNNLanguageModel lm(model); diff --git a/examples/textcat/train_textcat.cc b/examples/textcat/train_textcat.cc index 3005b8215..ba068dd3b 100644 --- a/examples/textcat/train_textcat.cc +++ b/examples/textcat/train_textcat.cc @@ -65,7 +65,7 @@ struct ConvLayer { // filter_width = length of filter (columns) // in_nfmaps = number of feature maps in input // out_nfmaps = number of feature maps in output - ConvLayer(Model&m, int in_rows, int k_fold_rows, int filter_width, int in_nfmaps, int out_nfmaps) : + ConvLayer(Model& m, int in_rows, int k_fold_rows, int filter_width, int in_nfmaps, int out_nfmaps) : p_filts(in_nfmaps), p_fbias(in_nfmaps), k_fold_rows(k_fold_rows) { @@ -123,7 +123,7 @@ struct ConvNet { explicit ConvNet(Model& m) : p_w(m.add_lookup_parameters(VOCAB_SIZE, {INPUT_DIM})), - //ConvLayer(Model&m, int in_rows, int k_fold_rows, int filter_width, int in_nfmaps, int out_nfmaps) : + //ConvLayer(Model& m, int in_rows, int k_fold_rows, int filter_width, int in_nfmaps, int out_nfmaps) : cl1(m, INPUT_DIM, 2, 10, 1, 6), cl2(m, INPUT_DIM/2, 2, 6, 6, 14), p_t2o(m.add_parameters({LABEL_SIZE, 14 * (INPUT_DIM / 4) * 5})), @@ -195,7 +195,7 @@ int main(int argc, char** argv) { while(getline(in, line)) { ++tlc; vector x,y; - read_sentence_pair(line, &x, &d, &y, &ld); + read_sentence_pair(line, x, d, y, ld); if (x.size() == 0 || y.size() != 1) { cerr << line << endl; abort(); } training.push_back(make_pair(x,y[0])); ttoks += x.size(); @@ -216,7 +216,7 @@ int main(int argc, char** argv) { while(getline(in, line)) { ++dlc; vector x,y; - read_sentence_pair(line, &x, &d, &y, &ld); + read_sentence_pair(line, x, d, y, ld); assert(y.size() == 1); dev.push_back(make_pair(x,y[0])); dtoks += x.size(); @@ -235,9 +235,9 @@ int main(int argc, char** argv) { Model model; Trainer* sgd = nullptr; - //sgd = new MomentumSGDTrainer(&model); - sgd = new AdagradTrainer(&model); - //sgd = new SimpleSGDTrainer(&model); + //sgd = new MomentumSGDTrainer(model); + sgd = new AdagradTrainer(model); + //sgd = new SimpleSGDTrainer(model); //NeuralBagOfWords nbow(model); ConvNet nbow(model); diff --git a/examples/tok-embed/train_tok-embed.cc b/examples/tok-embed/train_tok-embed.cc index 589bb6d25..c3eb4497c 100644 --- a/examples/tok-embed/train_tok-embed.cc +++ b/examples/tok-embed/train_tok-embed.cc @@ -132,7 +132,7 @@ struct PrefixCodeDecoder { PrefixCode* pfc; Parameter p_start; explicit PrefixCodeDecoder(Model& model, PrefixCode* pc) : - decoder(LAYERS, CHAR_DIM, EMBED_DIM, &model), pfc(pc) { + decoder(LAYERS, CHAR_DIM, EMBED_DIM, model), pfc(pc) { p_start = model.add_parameters({EMBED_DIM}); } Expression loss(ComputationGraph& cg, const Expression& v, const string& code) { @@ -176,8 +176,8 @@ struct BiCharLSTM { SymbolEmbedding sym; explicit BiCharLSTM(Model& model) : - l2rbuilder(LAYERS, CHAR_DIM, EMBED_DIM, &model), - r2lbuilder(LAYERS, CHAR_DIM, EMBED_DIM, &model), + l2rbuilder(LAYERS, CHAR_DIM, EMBED_DIM, model), + r2lbuilder(LAYERS, CHAR_DIM, EMBED_DIM, model), sym(model, d.size(), CHAR_DIM) { p_f2c = model.add_parameters({EMBED_DIM, CHAR_DIM}); p_r2c = model.add_parameters({EMBED_DIM, CHAR_DIM}); @@ -223,7 +223,7 @@ int main(int argc, char** argv) { } Model model; Trainer* sgd = nullptr; - sgd = new SimpleSGDTrainer(&model); + sgd = new SimpleSGDTrainer(model); vector>> training; kSOW = d.convert(""); kEOW = d.convert(""); diff --git a/examples/xor-batch-lookup/train_xor-batch-lookup.cc b/examples/xor-batch-lookup/train_xor-batch-lookup.cc index d2a8f7fb7..3727ca260 100644 --- a/examples/xor-batch-lookup/train_xor-batch-lookup.cc +++ b/examples/xor-batch-lookup/train_xor-batch-lookup.cc @@ -20,7 +20,7 @@ int main(int argc, char** argv) { const unsigned HIDDEN_SIZE = 8; const unsigned ITERATIONS = 200; Model m; - SimpleSGDTrainer sgd(&m); + SimpleSGDTrainer sgd(m); ComputationGraph cg; Parameter p_W, p_b, p_V, p_a; diff --git a/examples/xor-batch/train_xor-batch.cc b/examples/xor-batch/train_xor-batch.cc index 3ec51d92e..11b117e9f 100644 --- a/examples/xor-batch/train_xor-batch.cc +++ b/examples/xor-batch/train_xor-batch.cc @@ -20,7 +20,7 @@ int main(int argc, char** argv) { const unsigned HIDDEN_SIZE = 8; const unsigned ITERATIONS = 200; Model m; - SimpleSGDTrainer sgd(&m); + SimpleSGDTrainer sgd(m); ComputationGraph cg; Parameter p_W, p_b, p_V, p_a; diff --git a/examples/xor-mp/train_xor-mp.cc b/examples/xor-mp/train_xor-mp.cc index e9b30b7b9..41b9aa9a6 100644 --- a/examples/xor-mp/train_xor-mp.cc +++ b/examples/xor-mp/train_xor-mp.cc @@ -164,7 +164,7 @@ int main(int argc, char** argv) { // Otherwise, just create a new model. const unsigned HIDDEN_SIZE = 8; xor_model = new XorModel(HIDDEN_SIZE, dynet_model); - trainer = new SimpleSGDTrainer(&dynet_model); + trainer = new SimpleSGDTrainer(dynet_model); } vector data(4); diff --git a/examples/xor-xent/train_xor-xent.cc b/examples/xor-xent/train_xor-xent.cc index a8a73b586..9a17a9e15 100644 --- a/examples/xor-xent/train_xor-xent.cc +++ b/examples/xor-xent/train_xor-xent.cc @@ -19,8 +19,8 @@ int main(int argc, char** argv) { // parameters const unsigned HIDDEN_SIZE = 8; Model m; - SimpleSGDTrainer sgd(&m); - //MomentumSGDTrainer sgd(&m); + SimpleSGDTrainer sgd(m); + //MomentumSGDTrainer sgd(m); ComputationGraph cg; diff --git a/examples/xor/train_xor.cc b/examples/xor/train_xor.cc index 37cf93ff3..484ffbe48 100644 --- a/examples/xor/train_xor.cc +++ b/examples/xor/train_xor.cc @@ -19,8 +19,8 @@ int main(int argc, char** argv) { // parameters const unsigned ITERATIONS = 30; Model m; - SimpleSGDTrainer sgd(&m); - //MomentumSGDTrainer sgd(&m); + SimpleSGDTrainer sgd(m); + //MomentumSGDTrainer sgd(m); ComputationGraph cg; Parameter p_W, p_b, p_V, p_a; diff --git a/python/_dynet.pxd b/python/_dynet.pxd index 3cb89b8a2..4e283b790 100644 --- a/python/_dynet.pxd +++ b/python/_dynet.pxd @@ -131,8 +131,8 @@ cdef extern from "dynet/dynet.h" namespace "dynet": cdef extern from "dynet/training.h" namespace "dynet": cdef cppclass CSimpleSGDTrainer "dynet::SimpleSGDTrainer": - #CSimpleSGDTrainer(CModel* m, float lam, float e0) - CSimpleSGDTrainer(CModel* m, float e0, float edecay) # TODO removed lam, update docs. + #CSimpleSGDTrainer(CModel& m, float lam, float e0) + CSimpleSGDTrainer(CModel& m, float e0, float edecay) # TODO removed lam, update docs. float clip_threshold bool clipping_enabled void update(float s) @@ -140,7 +140,7 @@ cdef extern from "dynet/training.h" namespace "dynet": void status() cdef cppclass CMomentumSGDTrainer "dynet::MomentumSGDTrainer": - CMomentumSGDTrainer(CModel* m, float e0, float mom, float edecay) # TODO removed lam, update docs + CMomentumSGDTrainer(CModel& m, float e0, float mom, float edecay) # TODO removed lam, update docs float clip_threshold bool clipping_enabled void update(float s) @@ -148,7 +148,7 @@ cdef extern from "dynet/training.h" namespace "dynet": void status() cdef cppclass CAdagradTrainer "dynet::AdagradTrainer": - CAdagradTrainer(CModel* m, float e0, float eps, float edecay) # TODO removed lam, update docs + CAdagradTrainer(CModel& m, float e0, float eps, float edecay) # TODO removed lam, update docs float clip_threshold bool clipping_enabled void update(float s) @@ -156,7 +156,7 @@ cdef extern from "dynet/training.h" namespace "dynet": void status() cdef cppclass CAdadeltaTrainer "dynet::AdadeltaTrainer": - CAdadeltaTrainer(CModel* m, float eps, float rho, float edecay) # TODO removed lam, update docs + CAdadeltaTrainer(CModel& m, float eps, float rho, float edecay) # TODO removed lam, update docs float clip_threshold bool clipping_enabled void update(float s) @@ -164,7 +164,7 @@ cdef extern from "dynet/training.h" namespace "dynet": void status() cdef cppclass CAdamTrainer "dynet::AdamTrainer": - CAdamTrainer(CModel* m, float alpha, float beta_1, float beta_2, float eps, float edecay) # TODO removed lam, update docs + CAdamTrainer(CModel& m, float alpha, float beta_1, float beta_2, float eps, float edecay) # TODO removed lam, update docs float clip_threshold bool clipping_enabled void update(float s) @@ -310,7 +310,7 @@ cdef extern from "dynet/rnn.h" namespace "dynet": #cdef cppclass RNNBuilder "dynet::RNNBuilder": cdef cppclass CSimpleRNNBuilder "dynet::SimpleRNNBuilder" (CRNNBuilder): CSimpleRNNBuilder() - CSimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) + CSimpleRNNBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel &model) #void new_graph(CComputationGraph &cg) #void start_new_sequence(vector[CExpression] ces) #CExpression add_input(CExpression &x) @@ -326,7 +326,7 @@ cdef extern from "dynet/rnn.h" namespace "dynet": cdef extern from "dynet/gru.h" namespace "dynet": cdef cppclass CGRUBuilder "dynet::GRUBuilder" (CRNNBuilder): CGRUBuilder() - CGRUBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) + CGRUBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel &model) #void new_graph(CComputationGraph &cg) #void start_new_sequence(vector[CExpression] ces) #CExpression add_input(CExpression &x) @@ -342,7 +342,7 @@ cdef extern from "dynet/gru.h" namespace "dynet": cdef extern from "dynet/lstm.h" namespace "dynet": cdef cppclass CLSTMBuilder "dynet::LSTMBuilder" (CRNNBuilder): CLSTMBuilder() - CLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) + CLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel &model) #void new_graph(CComputationGraph &cg) #void start_new_sequence(vector[CExpression] ces) #CExpression add_input(CExpression &x) @@ -357,7 +357,7 @@ cdef extern from "dynet/lstm.h" namespace "dynet": cdef extern from "dynet/fast-lstm.h" namespace "dynet": cdef cppclass CFastLSTMBuilder "dynet::FastLSTMBuilder" (CRNNBuilder): - CFastLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel *model) + CFastLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel &model) #void new_graph(CComputationGraph &cg) #void start_new_sequence(vector[CExpression] ces) #CExpression add_input(CExpression &x) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index 270f712c3..080e8f38f 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -1158,7 +1158,7 @@ cdef class _RNNBuilder: # {{{ cdef class SimpleRNNBuilder(_RNNBuilder): # {{{ def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): if layers > 0: - self.thisptr = new CSimpleRNNBuilder(layers, input_dim, hidden_dim, model.thisptr) + self.thisptr = new CSimpleRNNBuilder(layers, input_dim, hidden_dim, model.thisptr[0]) else: self.thisptr = new CSimpleRNNBuilder() self.cg_version = -1 @@ -1169,7 +1169,7 @@ cdef class SimpleRNNBuilder(_RNNBuilder): # {{{ cdef class GRUBuilder(_RNNBuilder): # {{{ def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): if layers > 0: - self.thisptr = new CGRUBuilder(layers, input_dim, hidden_dim, model.thisptr) + self.thisptr = new CGRUBuilder(layers, input_dim, hidden_dim, model.thisptr[0]) else: self.thisptr = new CGRUBuilder() self.cg_version = -1 @@ -1180,7 +1180,7 @@ cdef class GRUBuilder(_RNNBuilder): # {{{ cdef class LSTMBuilder(_RNNBuilder): # {{{ def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): if layers > 0: - self.thisptr = new CLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr) + self.thisptr = new CLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr[0]) else: self.thisptr = new CLSTMBuilder() self.cg_version = -1 @@ -1190,7 +1190,7 @@ cdef class LSTMBuilder(_RNNBuilder): # {{{ cdef class FastLSTMBuilder(_RNNBuilder): # {{{ def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): - self.thisptr = new CFastLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr) + self.thisptr = new CFastLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr[0]) self.cg_version = -1 def whoami(self): return "FastLSTMBuilder" @@ -1446,7 +1446,7 @@ cdef class StackedRNNState: cdef class SimpleSGDTrainer: cdef CSimpleSGDTrainer *thisptr def __cinit__(self, Model m, float e0 = 0.1, float edecay = 0.0): - self.thisptr = new CSimpleSGDTrainer(m.thisptr, e0, edecay) + self.thisptr = new CSimpleSGDTrainer(m.thisptr[0], e0, edecay) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): @@ -1468,7 +1468,7 @@ cdef class SimpleSGDTrainer: cdef class MomentumSGDTrainer: cdef CMomentumSGDTrainer *thisptr def __cinit__(self, Model m, float e0 = 0.01, float mom = 0.9, float edecay = 0.0): - self.thisptr = new CMomentumSGDTrainer(m.thisptr, e0, mom, edecay) + self.thisptr = new CMomentumSGDTrainer(m.thisptr[0], e0, mom, edecay) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): @@ -1491,7 +1491,7 @@ cdef class MomentumSGDTrainer: cdef class AdagradTrainer: cdef CAdagradTrainer *thisptr def __cinit__(self, Model m, float e0 = 0.1, float eps = 1e-20, float edecay = 0.0): - self.thisptr = new CAdagradTrainer(m.thisptr, e0, eps, edecay) + self.thisptr = new CAdagradTrainer(m.thisptr[0], e0, eps, edecay) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): @@ -1514,7 +1514,7 @@ cdef class AdagradTrainer: cdef class AdadeltaTrainer: cdef CAdadeltaTrainer *thisptr def __cinit__(self, Model m, float eps = 1e-6, float rho = 0.95, float edecay = 0.0): - self.thisptr = new CAdadeltaTrainer(m.thisptr, eps, rho, edecay) + self.thisptr = new CAdadeltaTrainer(m.thisptr[0], eps, rho, edecay) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): @@ -1537,7 +1537,7 @@ cdef class AdadeltaTrainer: cdef class AdamTrainer: cdef CAdamTrainer *thisptr def __cinit__(self, Model m, float alpha = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, eps = 1e-8, float edecay = 0.0 ): - self.thisptr = new CAdamTrainer(m.thisptr, alpha, beta_1, beta_2, eps, edecay) + self.thisptr = new CAdamTrainer(m.thisptr[0], alpha, beta_1, beta_2, eps, edecay) def __dealloc__(self): del self.thisptr cpdef update(self, float s=1.0): diff --git a/tests/test-trainers.cc b/tests/test-trainers.cc index bad0656cb..5bb1390f6 100644 --- a/tests/test-trainers.cc +++ b/tests/test-trainers.cc @@ -48,7 +48,7 @@ BOOST_AUTO_TEST_CASE( simple_sgd_direction ) { dynet::Model mod; dynet::Parameter param = mod.add_parameters({3}); TensorTools::SetElements(param.get()->values,param_vals); - SimpleSGDTrainer trainer(&mod); + SimpleSGDTrainer trainer(mod); dynet::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); @@ -64,7 +64,7 @@ BOOST_AUTO_TEST_CASE( momentum_sgd_direction ) { dynet::Model mod; dynet::Parameter param = mod.add_parameters({3}); TensorTools::SetElements(param.get()->values,param_vals); - MomentumSGDTrainer trainer(&mod); + MomentumSGDTrainer trainer(mod); dynet::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); @@ -80,7 +80,7 @@ BOOST_AUTO_TEST_CASE( adagrad_direction ) { dynet::Model mod; dynet::Parameter param = mod.add_parameters({3}); TensorTools::SetElements(param.get()->values,param_vals); - AdagradTrainer trainer(&mod); + AdagradTrainer trainer(mod); dynet::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); @@ -96,7 +96,7 @@ BOOST_AUTO_TEST_CASE( adadelta_direction ) { dynet::Model mod; dynet::Parameter param = mod.add_parameters({3}); TensorTools::SetElements(param.get()->values,param_vals); - AdadeltaTrainer trainer(&mod); + AdadeltaTrainer trainer(mod); dynet::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); @@ -112,7 +112,7 @@ BOOST_AUTO_TEST_CASE( adam_direction ) { dynet::Model mod; dynet::Parameter param = mod.add_parameters({3}); TensorTools::SetElements(param.get()->values,param_vals); - AdamTrainer trainer(&mod); + AdamTrainer trainer(mod); dynet::ComputationGraph cg; Expression x = parameter(cg, param); Expression y = input(cg, {1,3}, ones_vals); diff --git a/tutorial/1_linear_regression.cc b/tutorial/1_linear_regression.cc index e62818e6b..1dd3f1f5d 100644 --- a/tutorial/1_linear_regression.cc +++ b/tutorial/1_linear_regression.cc @@ -27,7 +27,7 @@ int main(int argc, char** argv) { Model model; Parameter pW = model.add_parameters({1}); - SimpleSGDTrainer trainer(&model, 0.1); + SimpleSGDTrainer trainer(model, 0.1); ComputationGraph cg; Expression W = parameter(cg, pW); From 462440e962c391942256c2afe0d04523ad8b0dad Mon Sep 17 00:00:00 2001 From: Mitchell Stern Date: Sun, 11 Dec 2016 01:01:12 -0800 Subject: [PATCH 887/965] Fixed some "unused" and "reorder" warnings --- dynet/treelstm.cc | 4 ++-- dynet/treelstm.h | 4 ---- examples/encdec/encdec.h | 4 ++-- examples/rnnlm-batch/train_rnnlm-batch.cc | 2 -- 4 files changed, 4 insertions(+), 10 deletions(-) diff --git a/dynet/treelstm.cc b/dynet/treelstm.cc index 08209b641..dd7f2cae9 100644 --- a/dynet/treelstm.cc +++ b/dynet/treelstm.cc @@ -281,7 +281,7 @@ void TreeLSTMBuilder::copy(const RNNBuilder&) { throw std::runtime_error("copy() UnidirectionalTreeLSTMBuilder::UnidirectionalTreeLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model& model) : cg(nullptr) { + Model& model) { node_builder = LSTMBuilder(layers, input_dim, hidden_dim, model); } @@ -314,7 +314,7 @@ Expression UnidirectionalTreeLSTMBuilder::add_input(int id, vector children BidirectionalTreeLSTMBuilder::BidirectionalTreeLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, - Model& model) : cg(nullptr) { + Model& model) { assert (hidden_dim % 2 == 0); fwd_node_builder = LSTMBuilder(layers, input_dim, hidden_dim / 2, model); rev_node_builder = LSTMBuilder(layers, input_dim, hidden_dim / 2, model); diff --git a/dynet/treelstm.h b/dynet/treelstm.h index 9649c1219..96f60df42 100644 --- a/dynet/treelstm.h +++ b/dynet/treelstm.h @@ -100,8 +100,6 @@ struct UnidirectionalTreeLSTMBuilder : public TreeLSTMBuilder { std::vector h; private: - ComputationGraph* cg; - friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { @@ -129,8 +127,6 @@ struct BidirectionalTreeLSTMBuilder : public TreeLSTMBuilder { std::vector h; private: - ComputationGraph* cg; - friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int) { diff --git a/examples/encdec/encdec.h b/examples/encdec/encdec.h index 341c0ca0b..36f6ae764 100644 --- a/examples/encdec/encdec.h +++ b/examples/encdec/encdec.h @@ -62,6 +62,7 @@ struct EncoderDecoder { unsigned LAYERS; unsigned INPUT_DIM; unsigned HIDDEN_DIM; + bool bidirectional; LookupParameter p_c; LookupParameter p_ec; // map input to embedding (used in fwd and rev models) @@ -70,9 +71,8 @@ struct EncoderDecoder { Parameter p_R; Parameter p_bias; Builder dec_builder; - Builder rev_enc_builder; Builder fwd_enc_builder; - bool bidirectional; + Builder rev_enc_builder; public: /** diff --git a/examples/rnnlm-batch/train_rnnlm-batch.cc b/examples/rnnlm-batch/train_rnnlm-batch.cc index a8bfb4a92..3c8562876 100644 --- a/examples/rnnlm-batch/train_rnnlm-batch.cc +++ b/examples/rnnlm-batch/train_rnnlm-batch.cc @@ -28,8 +28,6 @@ int main(int argc, char** argv) { // Fetch program specific parameters (see ../utils/cl-args.h) ------------------------------------ Params params; - unsigned VOCAB_SIZE = 0; - get_args(argc, argv, params, TRAIN); // Load datasets --------------------------------------------------------------------------------- From dd952baeaed92345f2ee835ea9a75022ce6c83fa Mon Sep 17 00:00:00 2001 From: Mitchell Stern Date: Sun, 11 Dec 2016 01:38:39 -0800 Subject: [PATCH 888/965] Fixed some "unused" warnings --- dynet/model.h | 2 +- dynet/rnn.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dynet/model.h b/dynet/model.h index 863b57bc5..9deca0f62 100644 --- a/dynet/model.h +++ b/dynet/model.h @@ -31,7 +31,7 @@ struct ParameterStorageBase { virtual ~ParameterStorageBase(); friend class boost::serialization::access; template - void serialize(Archive& ar, const unsigned int) {} + void serialize(Archive& /* ar */, const unsigned int) {} }; // represents parameters (e.g., a weight matrix) that will be optimized diff --git a/dynet/rnn.h b/dynet/rnn.h index eac3da3bf..41bcb4a24 100644 --- a/dynet/rnn.h +++ b/dynet/rnn.h @@ -377,7 +377,7 @@ struct SimpleRNNBuilder : public RNNBuilder { namespace boost { namespace serialization { template -void serialize(Archive& ar, dynet::RNNPointer& p, const unsigned int version) +void serialize(Archive& ar, dynet::RNNPointer& p, const unsigned int) { ar & p.t; } From 9e9f52654a9422cf64334d1cb1f24117dcaf265c Mon Sep 17 00:00:00 2001 From: Mitchell Stern Date: Sun, 11 Dec 2016 02:32:22 -0800 Subject: [PATCH 889/965] Updated documentation --- doc/source/tutorial.rst | 2 +- dynet/rnn.h | 2 +- dynet/training.h | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/source/tutorial.rst b/doc/source/tutorial.rst index 0193cefd0..834f21611 100644 --- a/doc/source/tutorial.rst +++ b/doc/source/tutorial.rst @@ -11,7 +11,7 @@ Create a model, and an SGD trainer to update its parameters. .. code:: cpp Model mod; - SimpleSGDTrainer sgd(&mod); + SimpleSGDTrainer sgd(mod); Create a "computation graph," which will define the flow of information. diff --git a/dynet/rnn.h b/dynet/rnn.h index 41bcb4a24..9aa50fdb7 100644 --- a/dynet/rnn.h +++ b/dynet/rnn.h @@ -303,7 +303,7 @@ struct SimpleRNNBuilder : public RNNBuilder { * * \param layers Number of layers * \param input_dim Dimension of the input - * \param hidden_dim Hiddent layer (and output) size + * \param hidden_dim Hidden layer (and output) size * \param model Model holding the parameters * \param support_lags Allow for auxiliary output? */ diff --git a/dynet/training.h b/dynet/training.h index 3a9fc5528..f38776000 100644 --- a/dynet/training.h +++ b/dynet/training.h @@ -40,12 +40,12 @@ struct Trainer { /** * \brief General constructor for a Trainer * - * \param m Pointer to the model to be trained + * \param m Model to be trained * \param e0 Initial learning rate * \param edecay Learning rate decay */ explicit Trainer(Model& m, real e0, real edecay = 0.0) : - eta0(e0), eta(e0), eta_decay(edecay), epoch(), clipping_enabled(true), clip_threshold(5), + eta0(e0), eta(e0), eta_decay(edecay), epoch(), clipping_enabled(true), clip_threshold(5), clips(), updates(), sparse_updates_enabled(true), aux_allocated(false), model(&m) {} virtual ~Trainer(); @@ -156,7 +156,7 @@ struct SimpleSGDTrainer : public Trainer { /** * \brief Constructor * - * \param m Pointer to the model to be trained + * \param m Model to be trained * \param e0 Initial learning rate * \param edecay Learning rate decay parameter. */ @@ -184,7 +184,7 @@ struct MomentumSGDTrainer : public Trainer { /** * \brief Constructor * - * \param m Pointer to the model to be trained + * \param m Model to be trained * \param e0 Initial learning rate * \param mom Momentum * \param edecay Learning rate decay parameter @@ -224,7 +224,7 @@ struct AdagradTrainer : public Trainer { /** * \brief Constructor * - * \param m Pointer to the model to be trained + * \param m Model to be trained * \param e0 Initial learning rate * \param eps Bias parameter \f$\epsilon\f$ in the adagrad formula * \param edecay Learning rate decay parameter @@ -261,7 +261,7 @@ struct AdadeltaTrainer : public Trainer { /** * \brief Constructor * - * \param m Pointer to the model to be trained + * \param m Model to be trained * \param eps Bias parameter \f$\epsilon\f$ in the adagrad formula * \param rho Update parameter for the moving average of updates in the numerator * \param edecay Learning rate decay parameter @@ -298,7 +298,7 @@ struct RmsPropTrainer : public Trainer { /** * \brief Constructor * - * \param m Pointer to the model to be trained + * \param m Model to be trained * \param e0 Initial learning rate * \param eps Bias parameter \f$\epsilon\f$ in the adagrad formula * \param rho Update parameter for the moving average (`rho = 0` is equivalent to using Adagrad) @@ -335,7 +335,7 @@ struct AdamTrainer : public Trainer { /** * \brief Constructor * - * \param m Pointer to the model to be trained + * \param m Model to be trained * \param e0 Initial learning rate * \param beta_1 Moving average parameter for the mean * \param beta_2 Moving average parameter for the variance From 8889f15be064098e3fd535b5ae464c73a8ef45aa Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 12 Dec 2016 09:46:52 +0900 Subject: [PATCH 890/965] Fixed missing pass of edecay --- dynet/training.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dynet/training.h b/dynet/training.h index 5cf27524a..7f05d39d8 100644 --- a/dynet/training.h +++ b/dynet/training.h @@ -267,7 +267,7 @@ struct AdadeltaTrainer : public Trainer { * \param edecay Learning rate decay parameter */ explicit AdadeltaTrainer(Model* m, real eps = 1e-6, real rho = 0.95, real edecay = 0.0) : - Trainer(m, 1.0), epsilon(eps), rho(rho) {} + Trainer(m, 1.0, edecay), epsilon(eps), rho(rho) {} protected: DYNET_TRAINER_DEFINE_DEV_IMPL() virtual void alloc_impl() override; @@ -343,7 +343,7 @@ struct AdamTrainer : public Trainer { * \param edecay Learning rate decay parameter */ explicit AdamTrainer(Model* m, float e0 = 0.001, float beta_1 = 0.9, float beta_2 = 0.999, float eps = 1e-8, real edecay = 0.0) : - Trainer(m, e0), beta_1(beta_1), beta_2(beta_2), epsilon(eps) {} + Trainer(m, e0, edecay), beta_1(beta_1), beta_2(beta_2), epsilon(eps) {} protected: DYNET_TRAINER_DEFINE_DEV_IMPL() From 8d6c346afbbc81aae291d54d59e4a301bb3b7b4c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 12 Dec 2016 21:42:59 +0900 Subject: [PATCH 891/965] Added unimplemented function --- dynet/model.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/dynet/model.cc b/dynet/model.cc index d9734e07a..89da253ff 100644 --- a/dynet/model.cc +++ b/dynet/model.cc @@ -339,6 +339,16 @@ LookupParameter Model::add_lookup_parameters(unsigned n, const Dim& d) { return r; } +LookupParameter Model::add_lookup_parameters(unsigned n, const Dim& d, const ParameterInit & init) { + LookupParameterStorage* p = new LookupParameterStorage(n,d,init); + LookupParameter r(this, lookup_params.size()); + //cerr << "Adding lookup parameters with dim " << d << " and size " << n << endl; + all_params.push_back(p); + lookup_params.push_back(p); + updated_lookup_params.push_back(r.index); + return r; +} + void Model::set_updated_param(const Parameter *p, bool status) { unsigned idx = p->index; assert(idx < params.size()); From 87bd7c0a9c25337b825c8c84d5f0b3f2548303e7 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 13 Dec 2016 04:59:07 +0900 Subject: [PATCH 892/965] Added coding style standards --- doc/source/code_style.rst | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/doc/source/code_style.rst b/doc/source/code_style.rst index 2454d2dde..81c48ba97 100644 --- a/doc/source/code_style.rst +++ b/doc/source/code_style.rst @@ -1,4 +1,23 @@ Coding style ============ -TBD \ No newline at end of file +DyNet (the main version in C++) has certain coding style standards: + +**Overall Philosophy:** DyNet is designed to minimize the computational +overhead when creating networks. Try to avoid doing slow things like creating +objects or copying memory in places that will be called frequently during +computation graph construction. + +**Function Names:** Function names are written in "snake_case". + +**const:** Always use const if the input to a function is constant. + +**Pointer vs. Reference:** When writing functions, use the following guidelines +(quoted from `here `_): +* Only pass a value by pointer if the value 0/NULL is a valid input in the + current context. +* If a function argument is an out-value, then pass it by reference. +* Choose "pass by value" over "pass by const reference" only if the value is a + POD (`Plain Old Datastructure `_) + or small enough (memory-wise) or in other ways cheap enough (time-wise) to + copy. From 0042321587eb0ba833bb7d0974dd5f25b6dbf9f8 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 13 Dec 2016 05:03:25 +0900 Subject: [PATCH 893/965] Added coding style --- doc/source/code_style.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/source/code_style.rst b/doc/source/code_style.rst index 81c48ba97..e7d9d405b 100644 --- a/doc/source/code_style.rst +++ b/doc/source/code_style.rst @@ -21,3 +21,8 @@ computation graph construction. POD (`Plain Old Datastructure `_) or small enough (memory-wise) or in other ways cheap enough (time-wise) to copy. + +**Throwing Exceptions:** When the user does something illegal, throw an +exception. "assert" should never be used for something that might be triggered +by a user. (As `noted `_, there are +still many places that don't follow this standard as of Dec. 13, 2016.) From 3c32a97e358244b875f4d1d26d522003e7a74d3e Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 13 Dec 2016 05:09:32 +0900 Subject: [PATCH 894/965] Fixed bullets in doc --- doc/source/code_style.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/source/code_style.rst b/doc/source/code_style.rst index e7d9d405b..f22a85e61 100644 --- a/doc/source/code_style.rst +++ b/doc/source/code_style.rst @@ -1,4 +1,4 @@ -Coding style +Coding Style ============ DyNet (the main version in C++) has certain coding style standards: @@ -14,6 +14,7 @@ computation graph construction. **Pointer vs. Reference:** When writing functions, use the following guidelines (quoted from `here `_): + * Only pass a value by pointer if the value 0/NULL is a valid input in the current context. * If a function argument is an out-value, then pass it by reference. From 53720f32da09fd027c2f0d42e012e68ddd956ce3 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 13 Dec 2016 05:19:14 +0900 Subject: [PATCH 895/965] Added reference to inverted dropout --- dynet/expr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynet/expr.h b/dynet/expr.h index c9c5ea23c..aebcb4893 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -1310,7 +1310,7 @@ Expression noise(const Expression& x, real stddev); * \details * With a fixed probability, drop out (set to zero) nodes in the input * expression, and **scale** the remaining nodes by 1/p. Note that there are - * two kinds of dropout: + * [two kinds of dropout](http://cs231n.github.io/neural-networks-2/#reg): * - *Regular dropout:* where we perform dropout at training time and then\n * scale outputs by p at test time. * - *Inverted dropout:* where we perform dropout and scaling at training\n From 336a44f9fc66daf343839f96da2e5a93d7a1d302 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 13 Dec 2016 06:49:04 +0900 Subject: [PATCH 896/965] Added identity init --- dynet/model.cc | 4 ++++ dynet/model.h | 5 +++++ dynet/nodes.cc | 4 ++-- dynet/tensor.cc | 25 ++++++++++++++++++++----- dynet/tensor.h | 3 ++- 5 files changed, 33 insertions(+), 8 deletions(-) diff --git a/dynet/model.cc b/dynet/model.cc index 89da253ff..a3363aed2 100644 --- a/dynet/model.cc +++ b/dynet/model.cc @@ -192,6 +192,10 @@ void ParameterInitConst::initialize_params(Tensor & values) const { TensorTools::Constant(values, cnst); } +void ParameterInitIdentity::initialize_params(Tensor & values) const { + TensorTools::Identity(values); +} + void ParameterInitGlorot::initialize_params(Tensor & values) const { int dims = 0, dim_len = values.d.nd-(lookup?1:0); for(int i = 0; i < dim_len; ++i) dims += values.d[i]; diff --git a/dynet/model.h b/dynet/model.h index 9deca0f62..cf98e7146 100644 --- a/dynet/model.h +++ b/dynet/model.h @@ -196,6 +196,11 @@ struct ParameterInitConst : public ParameterInit { float cnst; }; +struct ParameterInitIdentity : public ParameterInit { + ParameterInitIdentity() {} + virtual void initialize_params(Tensor & values) const override; +}; + struct ParameterInitGlorot : public ParameterInit { ParameterInitGlorot(bool is_lookup = false) : lookup(is_lookup) {} virtual void initialize_params(Tensor & values) const override; diff --git a/dynet/nodes.cc b/dynet/nodes.cc index 9e01cdb49..70d9d7d63 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -678,7 +678,7 @@ DYNET_NODE_INST_DEV_IMPL(DotProduct) template void Dropout::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { Tensor m(dim, (float*)aux_mem, fx.device, DeviceMempool::FXS); - TensorTools::RandomBernoulli(m, (1.f-p), 1.f / (1.f-p)); + TensorTools::RandomizeBernoulli(m, (1.f-p), 1.f / (1.f-p)); fx.tvec().device(*dev.edevice) = xs[0]->tvec() * m.tvec(); } @@ -2071,7 +2071,7 @@ DYNET_NODE_INST_DEV_IMPL(RandomNormal) template void RandomBernoulli::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 0); - TensorTools::RandomBernoulli(fx, p, scale); + TensorTools::RandomizeBernoulli(fx, p, scale); } template diff --git a/dynet/tensor.cc b/dynet/tensor.cc index da6769d44..07de12425 100644 --- a/dynet/tensor.cc +++ b/dynet/tensor.cc @@ -119,7 +119,26 @@ void TensorTools::Zero(Tensor& d) { Constant(d, 0); } -void TensorTools::RandomBernoulli(Tensor& val, real p, real scale) { +void TensorTools::Identity(Tensor& val) { + if(val.d.nd != 2 || val.d[0] != val.d[1]) + throw std::runtime_error("Attempt to set a tensor that is not a square matrix to identity"); + size_t pos = 0; +#if HAVE_CUDA + float* t = new float[val.d.size()]; + for(size_t i = 0; i < val.d[0]; ++i) + for(size_t j = 0; j < val.d[1]; ++j) + t[pos++] == (i==j?1:0); + CUDA_CHECK(cudaMemcpy(val.v, t, sizeof(real) * val.d.size(), cudaMemcpyHostToDevice)); + delete[] t; +#else + for(size_t i = 0; i < val.d[0]; ++i) + for(size_t j = 0; j < val.d[1]; ++j) + val.v[pos++] == (i==j?1:0); +#endif +} + + +void TensorTools::RandomizeBernoulli(Tensor& val, real p, real scale) { bernoulli_distribution distribution(p); auto b = [&] {return distribution(*rndeng) * scale;}; #if HAVE_CUDA @@ -158,10 +177,6 @@ void TensorTools::RandomizeUniform(Tensor& val, real left, real right) { #endif } -// void TensorTools::Randomize(Tensor& d) { -// Randomize(d, sqrt(6) / sqrt(d.d.sum_dims())); -// } - template void Tensor::save(Archive& ar, const unsigned int ver) const { ar & d; diff --git a/dynet/tensor.h b/dynet/tensor.h index 48d59a70c..6092346eb 100644 --- a/dynet/tensor.h +++ b/dynet/tensor.h @@ -285,8 +285,9 @@ std::vector as_vector(const Tensor& v); struct TensorTools { static void Constant(Tensor& d, float c); static void Zero(Tensor& d); + static void Identity(Tensor& val); // sample some bernoulli random variables and scale them by scale - static void RandomBernoulli(Tensor& val, real p, real scale = 1.0f); + static void RandomizeBernoulli(Tensor& val, real p, real scale = 1.0f); static void RandomizeNormal(Tensor& val, real mean = 0.0f, real stddev = 1.0f); static void RandomizeUniform(Tensor& val, real left = 0.0f, real right = 0.0f); // AccessElement and SetElement are very, very slow (potentially) - use appropriately From 3d0661cb096f325932593bbc87eba3a4ab87d4fe Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 13 Dec 2016 06:50:52 +0900 Subject: [PATCH 897/965] Fixed stupid bug resulting from lack of coffee --- dynet/tensor.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dynet/tensor.cc b/dynet/tensor.cc index 07de12425..aa35d2111 100644 --- a/dynet/tensor.cc +++ b/dynet/tensor.cc @@ -127,13 +127,13 @@ void TensorTools::Identity(Tensor& val) { float* t = new float[val.d.size()]; for(size_t i = 0; i < val.d[0]; ++i) for(size_t j = 0; j < val.d[1]; ++j) - t[pos++] == (i==j?1:0); + t[pos++] = (i==j?1:0); CUDA_CHECK(cudaMemcpy(val.v, t, sizeof(real) * val.d.size(), cudaMemcpyHostToDevice)); delete[] t; #else for(size_t i = 0; i < val.d[0]; ++i) for(size_t j = 0; j < val.d[1]; ++j) - val.v[pos++] == (i==j?1:0); + val.v[pos++] = (i==j?1:0); #endif } From 1ec1c82e9ebb296896e4457ae24269314fb3f8ff Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 13 Dec 2016 11:58:40 +0900 Subject: [PATCH 898/965] Added initializer to LookupParameter in Python --- python/_dynet.pxd | 4 ++++ python/_dynet.pyx | 11 +++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/python/_dynet.pxd b/python/_dynet.pxd index 4e283b790..53edee4f0 100644 --- a/python/_dynet.pxd +++ b/python/_dynet.pxd @@ -74,6 +74,9 @@ cdef extern from "dynet/model.h" namespace "dynet": cdef cppclass CParameterInitConst "dynet::ParameterInitConst" (CParameterInit): CParameterInitConst(float c) + cdef cppclass CParameterInitIdentity "dynet::ParameterInitIdentity" (CParameterInit): + CParameterInitIdentity() + cdef cppclass CParameterInitGlorot "dynet::ParameterInitGlorot" (CParameterInit): CParameterInitGlorot(bool is_lookup) # is_lookup = False @@ -95,6 +98,7 @@ cdef extern from "dynet/model.h" namespace "dynet": #CParameters add_parameters(CDim& d, CParameterInitUniform initializer) #CParameters add_parameters(CDim& d, CParameterInitConst initializer) CLookupParameters add_lookup_parameters(unsigned n, const CDim& d) + CLookupParameters add_lookup_parameters(unsigned n, const CDim& d, CParameterInit initializer) vector[CParameterStorage] parameters_list() void load_dynet_model "dynet::load_dynet_model" (string filename, CModel *model) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index 080e8f38f..9620b0c8f 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -225,6 +225,10 @@ cdef class ConstInitializer(PyInitializer): def __init__(self, float c): self.initializer = new CParameterInitConst(c) +cdef class IdentityInitializer(PyInitializer): + def __init__(self): + self.initializer = new CParameterInitIdentity() + cdef class GlorotInitializer(PyInitializer): def __init__(self, bool is_lookup=False): self.initializer = new CParameterInitGlorot(is_lookup) @@ -285,11 +289,14 @@ cdef class Model: # {{{ cdef Parameters pp = Parameters.wrap_ptr(p) return pp - cpdef add_lookup_parameters(self, dim): + cpdef add_lookup_parameters(self, dim, PyInitializer init=None): assert(isinstance(dim, tuple)) cdef int nids = dim[0] rest = tuple(dim[1:]) - cdef CLookupParameters p = self.thisptr.add_lookup_parameters(nids, Dim(rest)) + if init is None: + init = GlorotInitializer() + initializer = init.initializer + cdef CLookupParameters p = self.thisptr.add_lookup_parameters(nids, Dim(rest), deref(initializer)) cdef LookupParameters pp = LookupParameters.wrap_ptr(p) return pp From 13a404de622bdfdde684b98ce143278bbe85f689 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 13 Dec 2016 14:40:12 +0900 Subject: [PATCH 899/965] Added ability to do dense updates in Python --- python/_dynet.pxd | 5 +++++ python/_dynet.pyx | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/python/_dynet.pxd b/python/_dynet.pxd index 53edee4f0..dbbc97628 100644 --- a/python/_dynet.pxd +++ b/python/_dynet.pxd @@ -139,6 +139,7 @@ cdef extern from "dynet/training.h" namespace "dynet": CSimpleSGDTrainer(CModel& m, float e0, float edecay) # TODO removed lam, update docs. float clip_threshold bool clipping_enabled + bool sparse_updates_enabled void update(float s) void update_epoch(float r) void status() @@ -147,6 +148,7 @@ cdef extern from "dynet/training.h" namespace "dynet": CMomentumSGDTrainer(CModel& m, float e0, float mom, float edecay) # TODO removed lam, update docs float clip_threshold bool clipping_enabled + bool sparse_updates_enabled void update(float s) void update_epoch(float r) void status() @@ -155,6 +157,7 @@ cdef extern from "dynet/training.h" namespace "dynet": CAdagradTrainer(CModel& m, float e0, float eps, float edecay) # TODO removed lam, update docs float clip_threshold bool clipping_enabled + bool sparse_updates_enabled void update(float s) void update_epoch(float r) void status() @@ -163,6 +166,7 @@ cdef extern from "dynet/training.h" namespace "dynet": CAdadeltaTrainer(CModel& m, float eps, float rho, float edecay) # TODO removed lam, update docs float clip_threshold bool clipping_enabled + bool sparse_updates_enabled void update(float s) void update_epoch(float r) void status() @@ -171,6 +175,7 @@ cdef extern from "dynet/training.h" namespace "dynet": CAdamTrainer(CModel& m, float alpha, float beta_1, float beta_2, float eps, float edecay) # TODO removed lam, update docs float clip_threshold bool clipping_enabled + bool sparse_updates_enabled void update(float s) void update_epoch(float r) void status() diff --git a/python/_dynet.pyx b/python/_dynet.pyx index 9620b0c8f..c26397153 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -1462,6 +1462,8 @@ cdef class SimpleSGDTrainer: self.thisptr.update_epoch(r) cpdef status(self): self.thisptr.status() + cpdef set_sparse_updates(self,bool su): + self.thisptr.sparse_updates_enabled = su cpdef set_clip_threshold(self,float thr): if thr<=0: self.thisptr.clipping_enabled = False @@ -1484,6 +1486,8 @@ cdef class MomentumSGDTrainer: self.thisptr.update_epoch(r) cpdef status(self): self.thisptr.status() + cpdef set_sparse_updates(self,bool su): + self.thisptr.sparse_updates_enabled = su cpdef set_clip_threshold(self,float thr): if thr<=0: self.thisptr.clipping_enabled = False @@ -1507,6 +1511,8 @@ cdef class AdagradTrainer: self.thisptr.update_epoch(r) cpdef status(self): self.thisptr.status() + cpdef set_sparse_updates(self,bool su): + self.thisptr.sparse_updates_enabled = su cpdef set_clip_threshold(self,float thr): if thr<=0: self.thisptr.clipping_enabled = False @@ -1530,6 +1536,8 @@ cdef class AdadeltaTrainer: self.thisptr.update_epoch(r) cpdef status(self): self.thisptr.status() + cpdef set_sparse_updates(self,bool su): + self.thisptr.sparse_updates_enabled = su cpdef set_clip_threshold(self,float thr): if thr<=0: self.thisptr.clipping_enabled = False @@ -1553,6 +1561,8 @@ cdef class AdamTrainer: self.thisptr.update_epoch(r) cpdef status(self): self.thisptr.status() + cpdef set_sparse_updates(self,bool su): + self.thisptr.sparse_updates_enabled = su cpdef set_clip_threshold(self,float thr): if thr<=0: self.thisptr.clipping_enabled = False From ee5992e43b82b6a81e28c589e76a14dac622beca Mon Sep 17 00:00:00 2001 From: Naomi Saphra Date: Tue, 13 Dec 2016 11:22:50 +0000 Subject: [PATCH 900/965] Create python_tutorial.rst --- doc/source/python_tutorial.rst | 93 ++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 doc/source/python_tutorial.rst diff --git a/doc/source/python_tutorial.rst b/doc/source/python_tutorial.rst new file mode 100644 index 000000000..b43812231 --- /dev/null +++ b/doc/source/python_tutorial.rst @@ -0,0 +1,93 @@ +.. role:: python(code) + :language: python + +Python Tutorial +=============== + +Guided examples in Python can be found in the jupyter tutorials_. + +.. _tutorials: https://github.com/clab/dynet/tree/master/examples/tutorials + +Saving Models +------------- + +In order to save model parameters, the user instead tells the model, at save time, which are the components it is +interested in saving. They then need to specify the same components, in the same order, at load time. +Notice however that there is no need to specify the sizes etc, as this is handled by the save/load mechanism: + +.. code:: python + + # saving: + from pydynet import * + m = Model() + W = m.add_parameters((100,100)) + lb = LSTMBuilder(1, 100, 100, m) # this also adds parameters to the model + b = m.add_parameters((30)) + m.save("filename", [W,b,lb]) + + # loading + m = Model() + (W, b, lb) = m.load("filename") + +The items that are being passed in the list must adhere to at least one of the following: + +* be of type :python:`Parameters` or :python:`LookupParameters` (the return types of :python:`add_parameters` or :python:`add_lookup_parameters`). +* be of a built-in "complex" builders such as :python:`LSTMBuilder` or :python:`GRUBuilder` that add parameters to the model. +* user defined classes that extend to the new :python:`pydynet.Saveable` class and implement the required interface. + + +The :python:`Saveable` class is used for easy creation of user-defined "sub networks" that can be saved and loaded as part of the model saving mechanism. + +.. code:: python + + class OneLayerMLP(Saveable): + def __init__(self, model, num_input, num_hidde, num_out, act=tanh): + self.W1 = model.add_parameters("W1", (num_hidden, num_input)) + self.W2 = model.add_parameters("W2", (num_out, num_hidden)) + self.b1 = model.add_parameters("b1", (num_hidden)) + self.b2 = model.add_parameters("b2", (num_out)) + self.act = act + self.shape = (num_input, num_out) + + def __call__(self, input_exp): + W1 = parameter(self.W1) + W2 = parameter(self.W2) + b1 = parameter(self.b1) + b2 = parameter(self.b2) + g = self.act + return softmax(W2*g(W1*input_exp + b1)+b2) + + # the Saveable interface requires the implementation + # of the two following methods, specifying all the + # Parameters / LookupParameters / LSTMBuilder / Saveables / etc + # that are directly created by this Saveable. + def get_components(self): + return (self.W1, self.W2, self.b1, self.b2) + + def restore_components(self, components): + self.W1, self.W2, self.b1, self.b2 = components + + +And for the usage: + +.. code:: python + + m = Model() + # create an embedding table. + E = m.add_lookup_parameters((1000,10)) + # create an MLP from 10 to 4 with a hidden layer of 20. + mlp = OneLayerMLP(m, 10, 20, 4, rectify) + + # use them together. + output = mlp(E[3]) + + # now save the model: + m.save("filename",[mlp, E]) + + # now load: + m2 = Model() + mlp2, E2 = m.load("filename") + + output2 = mlp2(E2[3]) + + assert(numpy.array_equal(output2.npvalue(), output.npvalue())) From 8ef4dd3d970064fc85126c87b95ab2de6f6197c4 Mon Sep 17 00:00:00 2001 From: paul Date: Tue, 13 Dec 2016 12:14:51 -0500 Subject: [PATCH 901/965] Add ipython notebooks to the docs --- doc/source/conf.py | 13 ++- doc/source/cpp_basic_tutorial.rst | 84 ++++++++++++++++ doc/source/index.rst | 2 +- ...utorial.rst => python_saving_tutorial.rst} | 11 +-- doc/source/requirements.txt | 5 +- doc/source/tutorial.rst | 97 +++---------------- examples/tutorials/API.ipynb | 19 ++-- examples/tutorials/RNNs.ipynb | 28 +++--- examples/tutorials/tutorial-1-xor.ipynb | 40 ++++---- 9 files changed, 162 insertions(+), 137 deletions(-) create mode 100644 doc/source/cpp_basic_tutorial.rst rename doc/source/{python_tutorial.rst => python_saving_tutorial.rst} (93%) diff --git a/doc/source/conf.py b/doc/source/conf.py index 593b22b62..f511d9d3d 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -19,8 +19,9 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - +# sys.path.insert(0, os.path.abspath('../../examples/tutorials')) +if not os.path.islink('tutorials_notebooks'): + os.symlink('../../examples/tutorials', 'tutorials_notebooks') # Run doxygen if on Readthedocs : on_rtd = os.environ.get('READTHEDOCS') == 'True' if on_rtd: @@ -35,12 +36,16 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.mathjax', 'breathe' + 'sphinx.ext.mathjax', 'breathe', 'nbsphinx' ] + breathe_projects = {"dynet": "../doxygen/xml/"} breathe_default_project = "dynet" +# Don't execute notebooks because it requires installing Dynet +nbsphinx_execute = 'never' + # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -78,7 +83,7 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = [] +exclude_patterns = ['_build', '**.ipynb_checkpoints'] # The reST default role (used for this markup: `text`) to use for all # documents. diff --git a/doc/source/cpp_basic_tutorial.rst b/doc/source/cpp_basic_tutorial.rst new file mode 100644 index 000000000..5fde305eb --- /dev/null +++ b/doc/source/cpp_basic_tutorial.rst @@ -0,0 +1,84 @@ +Basic Tutorial +~~~~~~~~~~~~~~ + +An illustration of how models are trained (for a simple logistic +regression model) is below: + + First, we set up the structure of the model. + +Create a model, and an SGD trainer to update its parameters. + +.. code:: cpp + + Model mod; + SimpleSGDTrainer sgd(mod); + +Create a "computation graph," which will define the flow of information. + +.. code:: cpp + + ComputationGraph cg; + +Initialize a 1x3 parameter vector, and add the parameters to be part of the computation graph. + +.. code:: cpp + + Expression W = parameter(cg, mod.add_parameters({1, 3})); + +Create variables defining the input and output of the regression, and load them into the computation graph. Note that we don't need to set concrete values yet. + +.. code:: cpp + + vector x_values(3); + Expression x = input(cg, {3}, &x_values); + dynet::real y_value; + Expression y = input(cg, &y_value); + +Next, set up the structure to multiply the input by the weight vector, then run the output of this through a logistic sigmoid function logistic regression). + +.. code:: cpp + + Expression y_pred = logistic(W*x); + +Finally, we create a function to calculate the loss. The model will be optimized to minimize the value of the final function in the computation graph. + +.. code:: cpp + + Expression l = binary_log_loss(y_pred, y); + +We are now done setting up the graph, and we can print out its structure: + +.. code:: cpp + + cg.print_graphviz(); + +Now, we perform a parameter update for a single example. Set the input/output to the values specified by the training data: + +.. code:: cpp + + x_values = {0.5, 0.3, 0.7}; + y_value = 1.0; + +"forward" propagates values forward through the computation graph, and returns the loss. + +.. code:: cpp + + dynet::real loss = as_scalar(cg.forward(l)); + +"backward" performs back-propagation, and accumulates the gradients of the parameters within the "Model" data structure. + +.. code:: cpp + + cg.backward(l); + +"sgd.update" updates parameters of the model that was passed to its constructor. Here 1.0 is the scaling factor that allows us to control the size of the update. + +.. code:: cpp + + sgd.update(1.0); + +Note that this very simple example that doesn't cover things like memory +initialization, reading/writing models, recurrent/LSTM networks, or +adding biases to functions. The best way to get an idea of how to use +DyNet for real is to look in the ``example`` directory, particularly +starting with the simplest ``xor`` example. \ No newline at end of file diff --git a/doc/source/index.rst b/doc/source/index.rst index 1d19ccb46..3d0999fd1 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -19,7 +19,7 @@ DyNet can be installed according to the instructions below: And get the basic information to create programs and use models: .. toctree:: - :maxdepth: 2 + :maxdepth: 3 tutorial commandline diff --git a/doc/source/python_tutorial.rst b/doc/source/python_saving_tutorial.rst similarity index 93% rename from doc/source/python_tutorial.rst rename to doc/source/python_saving_tutorial.rst index b43812231..708435496 100644 --- a/doc/source/python_tutorial.rst +++ b/doc/source/python_saving_tutorial.rst @@ -1,15 +1,8 @@ .. role:: python(code) :language: python -Python Tutorial -=============== - -Guided examples in Python can be found in the jupyter tutorials_. - -.. _tutorials: https://github.com/clab/dynet/tree/master/examples/tutorials - Saving Models -------------- +~~~~~~~~~~~~~ In order to save model parameters, the user instead tells the model, at save time, which are the components it is interested in saving. They then need to specify the same components, in the same order, at load time. @@ -90,4 +83,4 @@ And for the usage: output2 = mlp2(E2[3]) - assert(numpy.array_equal(output2.npvalue(), output.npvalue())) + assert(numpy.array_equal(output2.npvalue(), output.npvalue())) \ No newline at end of file diff --git a/doc/source/requirements.txt b/doc/source/requirements.txt index 188f51e62..993f81094 100644 --- a/doc/source/requirements.txt +++ b/doc/source/requirements.txt @@ -1 +1,4 @@ -breathe \ No newline at end of file +sphinx>=1.4 +breathe +nbsphinx +ipykernel \ No newline at end of file diff --git a/doc/source/tutorial.rst b/doc/source/tutorial.rst index 834f21611..b060c6f81 100644 --- a/doc/source/tutorial.rst +++ b/doc/source/tutorial.rst @@ -1,91 +1,26 @@ DyNet Tutorial ============== -An illustration of how models are trained (for a simple logistic -regression model) is below: +C++ Tutorial +------------ - First, we set up the structure of the model. +See the tutorials for the C++ version of Dynet -Create a model, and an SGD trainer to update its parameters. +.. toctree:: + :maxdepth: 2 -.. code:: cpp + cpp_basic_tutorial - Model mod; - SimpleSGDTrainer sgd(mod); - -Create a "computation graph," which will define the flow of information. - -.. code:: cpp - - ComputationGraph cg; - -Initialize a 1x3 parameter vector, and add the parameters to be part of the computation graph. - -.. code:: cpp - - Expression W = parameter(cg, mod.add_parameters({1, 3})); - -Create variables defining the input and output of the regression, and load them into the computation graph. Note that we don't need to set concrete values yet. - -.. code:: cpp - - vector x_values(3); - Expression x = input(cg, {3}, &x_values); - dynet::real y_value; - Expression y = input(cg, &y_value); - -Next, set up the structure to multiply the input by the weight vector, then run the output of this through a logistic sigmoid function logistic regression). - -.. code:: cpp - - Expression y_pred = logistic(W*x); - -Finally, we create a function to calculate the loss. The model will be optimized to minimize the value of the final function in the computation graph. - -.. code:: cpp - - Expression l = binary_log_loss(y_pred, y); - -We are now done setting up the graph, and we can print out its structure: - -.. code:: cpp - - cg.print_graphviz(); - -Now, we perform a parameter update for a single example. Set the input/output to the values specified by the training data: - -.. code:: cpp - - x_values = {0.5, 0.3, 0.7}; - y_value = 1.0; - -"forward" propagates values forward through the computation graph, and returns the loss. - -.. code:: cpp - - dynet::real loss = as_scalar(cg.forward(l)); - -"backward" performs back-propagation, and accumulates the gradients of the parameters within the "Model" data structure. - -.. code:: cpp - - cg.backward(l); - -"sgd.update" updates parameters of the model that was passed to its constructor. Here 1.0 is the scaling factor that allows us to control the size of the update. - -.. code:: cpp - - sgd.update(1.0); - -Note that this very simple example that doesn't cover things like memory -initialization, reading/writing models, recurrent/LSTM networks, or -adding biases to functions. The best way to get an idea of how to use -DyNet for real is to look in the ``example`` directory, particularly -starting with the simplest ``xor`` example. - -Python Tutorials +Python Tutorial --------------- -Guided examples in Python can be found in the jupyter tutorials_. +Guided examples in Python can be found below : + +.. toctree:: + :maxdepth: 2 + :titlesonly: -.. _tutorials: https://github.com/clab/dynet/tree/master/examples/tutorials + tutorials_notebooks/tutorial-1-xor.ipynb + tutorials_notebooks/API.ipynb + tutorials_notebooks/RNNs.ipynb + python_saving_tutorial \ No newline at end of file diff --git a/examples/tutorials/API.ipynb b/examples/tutorials/API.ipynb index ece20a2f1..55401e5c2 100644 --- a/examples/tutorials/API.ipynb +++ b/examples/tutorials/API.ipynb @@ -4,9 +4,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Expression building\n", + "## API tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Expression building\n", "\n", - "### (note: may have old API in some cases)" + "(note: may have old API in some cases)" ] }, { @@ -169,7 +176,7 @@ "collapsed": true }, "source": [ - "## Recipe" + "### Recipe" ] }, { @@ -274,7 +281,7 @@ "collapsed": true }, "source": [ - "# Recipe (using classes)" + "### Recipe (using classes)" ] }, { @@ -371,7 +378,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## or, alternatively, have the training outside of the network class" + "### or, alternatively, have the training outside of the network class" ] }, { @@ -458,7 +465,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.11" + "version": "2.7.10" } }, "nbformat": 4, diff --git a/examples/tutorials/RNNs.ipynb b/examples/tutorials/RNNs.ipynb index 8db789100..d75599495 100644 --- a/examples/tutorials/RNNs.ipynb +++ b/examples/tutorials/RNNs.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## RNNs tutorial" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -17,7 +24,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## An LSTM/RNN overview:\n", + "### An LSTM/RNN overview:\n", "\n", "An (1-layer) RNN can be thought of as a sequence of cells, $h_1,...,h_k$, where $h_i$ indicates the time dimenstion. \n", "\n", @@ -46,7 +53,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## The LSTM (RNN) Interface\n", + "### The LSTM (RNN) Interface\n", "\n", "RNN / LSTM / GRU follow the same interface. We have a \"builder\" which is in charge of creating definining the parameters for the sequence." ] @@ -289,7 +296,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Extra options in the RNN/LSTM interface\n", + "### Extra options in the RNN/LSTM interface\n", "\n", "**Stack LSTM** The RNN's are shaped as a stack: we can remove the top and continue from the previous state.\n", "This is done either by remembering the previous state and continuing it with a new `.add_input()`, or using\n", @@ -374,7 +381,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Aside: memory efficient transduction\n", + "### Aside: memory efficient transduction\n", "The `RNNState` interface is convenient, and allows for incremental input construction.\n", "However, sometimes we know the sequence of inputs in advance, and care only about the sequence of\n", "output expressions. In this case, we can use the `add_inputs(xs)` method, where `xs` is a list of Expression." @@ -445,7 +452,7 @@ "collapsed": true }, "source": [ - "## Charecter-level LSTM\n", + "### Charecter-level LSTM\n", "\n", "Now that we know the basics of RNNs, let's build a character-level LSTM language-model.\n", "We have a sequence LSTM that, at each step, gets as input a character, and needs to predict the next character." @@ -767,15 +774,6 @@ "train(srnn, \"these pretzels are making me thirsty\")" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": null, @@ -802,7 +800,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.11" + "version": "2.7.10" } }, "nbformat": 4, diff --git a/examples/tutorials/tutorial-1-xor.ipynb b/examples/tutorials/tutorial-1-xor.ipynb index dbeb2c4d5..16b9f71e0 100644 --- a/examples/tutorials/tutorial-1-xor.ipynb +++ b/examples/tutorials/tutorial-1-xor.ipynb @@ -1,23 +1,10 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# we assume that we have the dynet module in your path.\n", - "# OUTDATED: we also assume that LD_LIBRARY_PATH includes a pointer to where libcnn_shared.so is.\n", - "from dynet import *" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Working with the python dyNET package\n", + "## Working with the python dyNET package\n", "\n", "The dyNET package is intended for neural-network processing on the CPU, and is particularly suited for NLP applications. It is a python-wrapper for the dyNET C++ package written by Chris Dyer.\n", "\n", @@ -33,7 +20,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Package Fundamentals\n", + "### Package Fundamentals\n", "\n", "The main piece of dyNET is the `ComputationGraph`, which is what essentially defines a neural network.\n", "The `ComputationGraph` is composed of expressions, which relate to the inputs and outputs of the network,\n", @@ -48,7 +35,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Static Networks\n", + "### Static Networks\n", "\n", "The life-cycle of a dyNET program is:\n", "1. Create a `Model`, and populate it with `Parameters`.\n", @@ -70,6 +57,19 @@ "We will begin by defining the model and the computation graph.\n" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# we assume that we have the dynet module in your path.\n", + "# OUTDATED: we also assume that LD_LIBRARY_PATH includes a pointer to where libcnn_shared.so is.\n", + "from dynet import *" + ] + }, { "cell_type": "code", "execution_count": 2, @@ -211,7 +211,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Training\n", + "### Training\n", "We now want to set the parameter weights such that the loss is minimized. \n", "\n", "For this, we will use a trainer object. A trainer is constructed with respect to the parameters of a given model." @@ -547,7 +547,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## To summarize\n", + "### To summarize\n", "Here is a complete program:" ] }, @@ -702,7 +702,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Dynamic Networks\n", + "### Dynamic Networks\n", "\n", "Dynamic networks are very similar to static ones, but instead of creating the network once and then calling \"set\" in each training example to change the inputs, we just create a new network for each training example.\n", "\n", @@ -869,7 +869,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.11" + "version": "2.7.10" } }, "nbformat": 4, From 189df86bd0f6ff51427d03d9add91d2d54c54cda Mon Sep 17 00:00:00 2001 From: paul Date: Tue, 13 Dec 2016 17:53:52 -0500 Subject: [PATCH 902/965] Add MNIST example Also adds a multilayer perceptron struct to the examples --- doc/doxygen/Doxyfile | 4 +- doc/source/examples.rst | 11 +- examples/mnist/README.md | 28 ++++ examples/mnist/mlp.h | 299 ++++++++++++++++++++++++++++++++++ examples/mnist/train_mnist.cc | 184 +++++++++++++++++++++ examples/utils/cl-args.h | 278 ++++++++++++++++++------------- examples/utils/data-io.h | 77 +++++++++ 7 files changed, 764 insertions(+), 117 deletions(-) create mode 100644 examples/mnist/README.md create mode 100644 examples/mnist/mlp.h create mode 100644 examples/mnist/train_mnist.cc create mode 100644 examples/utils/data-io.h diff --git a/doc/doxygen/Doxyfile b/doc/doxygen/Doxyfile index ca3dbcae9..66f2fc13a 100644 --- a/doc/doxygen/Doxyfile +++ b/doc/doxygen/Doxyfile @@ -371,7 +371,7 @@ INLINE_GROUPED_CLASSES = NO # Man pages) or section (for LaTeX and RTF). # The default value is: NO. -INLINE_SIMPLE_STRUCTS = NO +INLINE_SIMPLE_STRUCTS = YES # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So @@ -758,7 +758,7 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT =../../dynet/expr.h ../../dynet/training.h ../../dynet/rnn.h ../../examples/encdec/encdec.h ../../examples/rnnlm-batch/rnnlm-batch.h +INPUT =../../dynet/expr.h ../../dynet/training.h ../../dynet/rnn.h ../../examples/encdec/encdec.h ../../examples/rnnlm-batch/rnnlm-batch.h ../../examples/mnist/mlp.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses diff --git a/doc/source/examples.rst b/doc/source/examples.rst index af2a01919..602ca35d1 100644 --- a/doc/source/examples.rst +++ b/doc/source/examples.rst @@ -3,14 +3,23 @@ Examples Here are some simple models coded in the examples of Dynet. Feel free to use and modify them. +Feed-forward models +------------------- + +Although Dynet was primarily built for natural language processing purposes it is still possible to code feed-forward nets. Here are some bricks and examples to do so. + +.. doxygengroup:: ffbuilders + :members: + :content-only: + Language models --------------- Language modelling is one of the cornerstones of natural language processing. Dynet allows great flexibility in the creation of neural language models. Here are some examples. .. doxygengroup:: lmbuilders - :members: :content-only: + :members: Sequence to sequence models --------------------------- diff --git a/examples/mnist/README.md b/examples/mnist/README.md new file mode 100644 index 000000000..73f28699b --- /dev/null +++ b/examples/mnist/README.md @@ -0,0 +1,28 @@ +# MNIST example + +Here's an example usage of dynet for the "Hello World" of deep learning : MNIST digit classification + +## Usage + +First, download the MNIST dataset from the [official website](http://yann.lecun.com/exdb/mnist/) and decompress it. + + wget -O - http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz | gunzip > train-images.idx3-ubyte + wget -O - http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz | gunzip > train-labels.idx1-ubyte + wget -O - http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz | gunzip > t10k-images.idx3-ubyte + wget -O - http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz | gunzip > t10k-labels.idx1-ubyte + +Then, run the training (here for a batch size of 128 and 20 epochs) : + + ./train_mnist \ + --train train-images.idx3-ubyte \ + --train_labels train-labels.idx1-ubyte \ + --dev t10k-images.idx3-ubyte \ + --dev_labels t10k-labels.idx1-ubyte \ + --batch_size 128 \ + --num_epochs 20 + +## Benchmark + +System | Speed | Test accuracy (after 20 epochs) +------------ | ------------- | ------------- +Intel® Core™ i5-4200H CPU @ 2.80GHz × 4 | ~7±0.5 s per epoch| 97.84 % diff --git a/examples/mnist/mlp.h b/examples/mnist/mlp.h new file mode 100644 index 000000000..3a434934f --- /dev/null +++ b/examples/mnist/mlp.h @@ -0,0 +1,299 @@ +#ifndef MLP_H +#define MLP_H + +/** + * \file rnnlm-batch.h + * \defgroup ffbuilders ffbuilders + * \brief Feed forward nets builders + * + * An example implementation of a simple multilayer perceptron + * + */ + +#include "dynet/nodes.h" +#include "dynet/dynet.h" +#include "dynet/training.h" +#include "dynet/timing.h" +#include "dynet/expr.h" +#include "dynet/io-macros.h" + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +using namespace std; +using namespace dynet; +using namespace dynet::expr; +/** + * \ingroup ffbuilders + * Common activation functions used in multilayer perceptrons + */ +enum Activation { + SIGMOID, /**< `SIGMOID` : Sigmoid function \f$x\longrightarrow \frac {1} {1+e^{-x}}\f$ */ + TANH, /**< `TANH` : Tanh function \f$x\longrightarrow \frac {1-e^{-2x}} {1+e^{-2x}}\f$ */ + RELU, /**< `RELU` : Rectified linear unit \f$x\longrightarrow \max(0,x)\f$ */ + LINEAR, /**< `LINEAR` : Identity function \f$x\longrightarrow x\f$ */ + SOFTMAX /**< `SOFTMAX` : Softmax function \f$\textbf{x}=(x_i)_{i=1,\dots,n}\longrightarrow \frac {e^{x_i}}{\sum_{j=1}^n e^{x_j} })_{i=1,\dots,n}\f$ */ +}; + +/** + * \ingroup ffbuilders + * \struct Layer + * \brief Simple layer structure + * \details Contains all parameters defining a layer + * + */ +struct Layer { +public: + unsigned input_dim; /**< Input dimension */ + unsigned output_dim; /**< Output dimension */ + Activation activation = LINEAR; /**< Activation function */ + float dropout_rate = 0; /**< Dropout rate */ + /** + * \brief Build a feed forward layer + * + * \param input_dim Input dimension + * \param output_dim Output dimension + * \param activation Activation function + * \param dropout_rate Dropout rate + */ + Layer(unsigned input_dim, unsigned output_dim, Activation activation, float dropout_rate) : + input_dim(input_dim), + output_dim(output_dim), + activation(activation), + dropout_rate(dropout_rate) {}; + Layer() {}; +private: + friend class boost::serialization::access; + template + void serialize(Archive & ar, const unsigned int) { + ar & input_dim & output_dim & activation & dropout_rate; + } +}; +DYNET_SERIALIZE_IMPL(Layer); + +/** + * \ingroup ffbuilders + * \struct MLP + * \brief Simple multilayer perceptron + * + */ +struct MLP { +protected: + // Hyper-parameters + unsigned LAYERS = 0; + + // Layers + vector layers; + // Parameters + vector> params; + + bool dropout_active = true; + +public: + /** + * \brief Default constructor + * \details Dont forget to add layers! + */ + MLP(Model & model) { + LAYERS = 0; + } + /** + * \brief Returns a Multilayer perceptron + * \details Creates a feedforward multilayer perceptron based on a list of layer descriptions + * + * \param model Model to contain parameters + * \param layers Layers description + */ + MLP(Model& model, + vector layers) { + // Verify layers compatibility + for (unsigned l = 0; l < layers.size() - 1; ++l) { + if (layers[l].output_dim != layers[l + 1].input_dim) + throw invalid_argument("Layer dimensions don't match"); + } + + // Register parameters in model + for (Layer layer : layers) { + append(model, layer); + } + } + + /** + * \brief Append a layer at the end of the network + * \details [long description] + * + * \param model [description] + * \param layer [description] + */ + void append(Model& model, Layer layer) { + // Check compatibility + if (LAYERS > 0) + if (layers[LAYERS - 1].output_dim != layer.input_dim) + throw invalid_argument("Layer dimensions don't match"); + + // Add to layers + layers.push_back(layer); + LAYERS++; + // Register parameters + Parameter W = model.add_parameters({layer.output_dim, layer.input_dim}); + Parameter b = model.add_parameters({layer.output_dim}); + params.push_back({W, b}); + } + + /** + * \brief Run the MLP on an input vector/batch + * + * \param x Input expression (vector or batch) + * \param cg Computation graph + * + * \return [description] + */ + Expression run(Expression x, + ComputationGraph& cg) { + // Expression for the current hidden state + Expression h_cur = x; + for (unsigned l = 0; l < LAYERS; ++l) { + // Initialize parameters in computation graph + Expression W = parameter(cg, params[l][0]); + Expression b = parameter(cg, params[l][1]); + // Aplly affine transform + Expression a = affine_transform({b, W, h_cur}); + // Apply activation function + Expression h = activate(a, layers[l].activation); + // Take care of dropout + Expression h_dropped; + if (layers[l].dropout_rate > 0) { + if (dropout_active) { + // During training, drop random units + Expression mask = random_bernoulli(cg, {layers[l].output_dim}, 1 - layers[l].dropout_rate); + h_dropped = cmult(h, mask); + } else { + // At test time, multiply by the retention rate to scale + h_dropped = h * (1 - layers[l].dropout_rate); + } + } else { + // If there's no dropout, don't do anything + h_dropped = h; + } + // Set current hidden state + h_cur = h_dropped; + } + + return h_cur; + } + + /** + * \brief Return the negative log likelihood for the (batched) pair (x,y) + * \details For a batched input \f$\{x_i\}_{i=1,\dots,N}\f$, \f$\{y_i\}_{i=1,\dots,N}\f$, this computes \f$\sum_{i=1}^N \log(P(y_i\vert x_i))\f$ where \f$P(\textbf{y}\vert x_i)\f$ is modelled with $\mathrm{softmax}(MLP(x_i))$ + * + * \param x Input batch + * \param labels Output labels + * \param cg Computation graph + * \return Expression for the negative log likelihood on the batch + */ + Expression get_nll(Expression x, + vector labels, + ComputationGraph& cg) { + // compute output + Expression y = run(x, cg); + // Do softmax + Expression losses = pickneglogsoftmax(y, labels); + // Sum across batches + return sum_batches(losses); + } + + /** + * \brief Predict the most probable label + * \details Returns the argmax of the softmax of the networks output + * + * \param x Input + * \param cg Computation graph + * + * \return Label index + */ + int predict(Expression x, + ComputationGraph& cg) { + // run MLP to get class distribution + Expression y = run(x, cg); + // Get values + vector probs = as_vector(cg.forward(y)); + // Get argmax + unsigned argmax = 0; + for (unsigned i = 1; i < probs.size(); ++i) { + if (probs[i] > probs[argmax]) + argmax = i; + } + + return argmax; + } + + /** + * \brief Enable dropout + * \details This is supposed to be used during training or during testing if you want to sample outputs using montecarlo + */ + void enable_dropout() { + dropout_active = true; + } + + /** + * \brief Disable dropout + * \details Do this during testing if you want a deterministic network + */ + void disable_dropout() { + dropout_active = false; + } + + /** + * \brief Check wether dropout is enabled or not + * + * \return Dropout state + */ + bool is_dropout_enabled() { + return dropout_active; + } + +private: + inline Expression activate(Expression h, Activation f) { + switch (f) { + case LINEAR: + return h; + break; + case RELU: + return rectify(h); + break; + case SIGMOID: + return logistic(h); + break; + case TANH: + return tanh(h); + break; + case SOFTMAX: + return softmax(h); + break; + default: + throw invalid_argument("Unknown activation function"); + break; + } + } + + friend class boost::serialization::access; + template + void serialize(Archive & ar, const unsigned int) { + ar & LAYERS; + ar & layers & params; + ar & dropout_active; + } + + +}; + +#endif \ No newline at end of file diff --git a/examples/mnist/train_mnist.cc b/examples/mnist/train_mnist.cc new file mode 100644 index 000000000..894b75e49 --- /dev/null +++ b/examples/mnist/train_mnist.cc @@ -0,0 +1,184 @@ +/** + * Train a multilayer perceptron to classify mnist digits + * + * This provide an example of usage of the mlp.h model + */ +#include "mlp.h" +#include "../utils/getpid.h" +#include "../utils/cl-args.h" +#include "../utils/data-io.h" + + +using namespace std; +using namespace dynet; +using namespace dynet::expr; + +int main(int argc, char** argv) { + // Fetch dynet params ---------------------------------------------------------------------------- + auto dyparams = dynet::extract_dynet_params(argc, argv); + dynet::initialize(dyparams); + // Fetch program specific parameters (see ../utils/cl-args.h) ------------------------------------ + Params params; + + get_args(argc, argv, params, TRAIN_SUP); + + // Load Dataset ---------------------------------------------------------------------------------- + // Load data + vector> mnist_train, mnist_dev; + + read_mnist(params.train_file, mnist_train); + read_mnist(params.dev_file, mnist_dev); + + // Load labels + vector mnist_train_labels, mnist_dev_labels; + + read_mnist_labels(params.train_labels_file, mnist_train_labels); + read_mnist_labels(params.dev_labels_file, mnist_dev_labels); + + // Model name (for saving) ----------------------------------------------------------------------- + ostringstream os; + // Store a bunch of information in the model name + os << params.exp_name + << "_" << "mlp" + << "_" << 784 << "-" << 512 << "-relu-" << 0.2 + << "_" << 512 << "-" << 512 << "-relu-" << 0.2 + << "_" << 512 << "-" << 10 << "-softmax" + << "_" << getpid() + << ".params"; + const string fname = os.str(); + cerr << "Parameters will be written to: " << fname << endl; + // Build model ----------------------------------------------------------------------------------- + + Model model; + // Use Adam optimizer + AdamTrainer adam(model); + adam.clip_threshold *= params.BATCH_SIZE; + + // Create model + MLP nn(model, vector({ + Layer(/* input_dim */ 784, /* output_dim */ 512, /* activation */ RELU, /* dropout_rate */ 0.2), + Layer(/* input_dim */ 512, /* output_dim */ 512, /* activation */ RELU, /* dropout_rate */ 0.2), + Layer(/* input_dim */ 512, /* output_dim */ 10, /* activation */ LINEAR, /* dropout_rate */ 0.0) + })); + + + // Load preexisting weights (if provided) + if (params.model_file != "") { + ifstream in(params.model_file); + boost::archive::text_iarchive ia(in); + ia >> model >> nn; + } + + // Initialize variables for training ------------------------------------------------------------- + // Worst accuracy + double worst = 0; + + // Number of batches in training set + unsigned num_batches = mnist_train.size() / params.BATCH_SIZE - 1; + + // Random indexing + unsigned si; + vector order(num_batches); + for (unsigned i = 0; i < num_batches; ++i) order[i] = i; + + bool first = true; + unsigned epoch = 0; + vector cur_batch; + vector cur_labels; + + // Run for the given number of epochs (or indefinitely if params.NUM_EPOCHS is negative) + while (epoch < params.NUM_EPOCHS || params.NUM_EPOCHS < 0) { + // Update the optimizer + if (first) { first = false; } else { adam.update_epoch(); } + // Reshuffle the dataset + cerr << "**SHUFFLE\n"; + random_shuffle(order.begin(), order.end()); + // Initialize loss and number of samples processed (to average loss) + double loss = 0; + double num_samples = 0; + + // Start timer + Timer* iteration = new Timer("completed in"); + + // Activate dropout + nn.enable_dropout(); + + for (si = 0; si < num_batches; ++si) { + // build graph for this instance + ComputationGraph cg; + // Compute batch start id and size + int id = order[si] * params.BATCH_SIZE; + unsigned bsize = std::min((unsigned) mnist_train.size() - id, params.BATCH_SIZE); + // Get input batch + cur_batch = vector(bsize); + cur_labels = vector(bsize); + for (unsigned idx = 0; idx < bsize; ++idx) { + cur_batch[idx] = input(cg, {784}, mnist_train[id + idx]); + cur_labels[idx] = mnist_train_labels[id + idx]; + } + // Reshape as batch (not very intuitive yet) + Expression x_batch = reshape(concatenate_cols(cur_batch), Dim({784}, bsize)); + // Get negative log likelihood on batch + Expression loss_expr = nn.get_nll(x_batch, cur_labels, cg); + // Get scalar error for monitoring + loss += as_scalar(cg.forward(loss_expr)); + // Increment number of samples processed + num_samples += bsize; + // Compute gradient with backward pass + cg.backward(loss_expr); + // Update parameters + adam.update(); + // Print progress every tenth of the dataset + if ((si + 1) % (num_batches / 10) == 0 || si == num_batches - 1) { + // Print informations + adam.status(); + cerr << " E = " << (loss / num_samples) << ' '; + // Reinitialize timer + delete iteration; + iteration = new Timer("completed in"); + // Reinitialize loss + loss = 0; + num_samples = 0; + } + } + + // Disable dropout for dev testing + nn.disable_dropout(); + + // Show score on dev data + if (si == num_batches) { + double dpos = 0; + for (unsigned i = 0; i < mnist_dev.size(); ++i) { + // build graph for this instance + ComputationGraph cg; + // Get input expression + Expression x = input(cg, {784}, mnist_dev[i]); + // Get negative log likelihood on batch + unsigned predicted_idx = nn.predict(x, cg); + // Increment count of positive classification + if (predicted_idx == mnist_dev_labels[i]) + dpos++; + } + // If the dev loss is lower than the previous ones, save the ,odel + if (dpos > worst) { + worst = dpos; + ofstream out(fname); + boost::archive::text_oarchive oa(out); + oa << model << nn; + } + // Print informations + cerr << "\n***DEV [epoch=" << (epoch) + << "] E = " << (dpos / (double) mnist_dev.size()) << ' '; + // Reinitialize timer + delete iteration; + iteration = new Timer("completed in"); + } + + // Increment epoch + ++epoch; + + } + + +} + diff --git a/examples/utils/cl-args.h b/examples/utils/cl-args.h index 5636424cb..7f1c102fd 100644 --- a/examples/utils/cl-args.h +++ b/examples/utils/cl-args.h @@ -1,130 +1,180 @@ +/** + * \file cl-args.h + * \brief This is a **very** minimal command line argument parser + */ #include #include #include #include -enum Task {TRAIN, TEST}; +/** + * Values used to specify the task at hand, and incidentally the required command line arguments + */ +enum Task { + TRAIN, /**< Self-supervised learning : Only requires train and dev file */ + TRAIN_SUP, /**< Supervised learning : Requires train and dev data as well as labels */ + TEST +}; +/** + * \brief Structure holding any possible command line argument + * + */ struct Params { - string exp_name = "encdec"; - string train_file = ""; - string dev_file = ""; - string model_file = ""; - string dic_file = ""; - string test_file = ""; - unsigned LAYERS = 1; - unsigned INPUT_DIM = 2; - unsigned HIDDEN_DIM = 4; - unsigned BATCH_SIZE = 1; - unsigned DEV_BATCH_SIZE = 16; - int NUM_EPOCHS = -1; - bool bidirectionnal = false; + string exp_name = "encdec"; + string train_file = ""; + string dev_file = ""; + string train_labels_file = ""; + string dev_labels_file = ""; + string model_file = ""; + string dic_file = ""; + string test_file = ""; + string test_labels_file = ""; + unsigned LAYERS = 1; + unsigned INPUT_DIM = 2; + unsigned HIDDEN_DIM = 4; + unsigned BATCH_SIZE = 1; + unsigned DEV_BATCH_SIZE = 16; + int NUM_EPOCHS = -1; + bool bidirectionnal = false; }; +/** + * \brief Get parameters from command line arguments + * \details Parses parameters from `argv` and check for required fields depending on the task + * + * \param argc Number of arguments + * \param argv Arguments strings + * \param params Params structure + * \param task Task + */ void get_args(int argc, char** argv, Params& params, Task task) { - int i = 0; - while (i < argc) { - string arg = argv[i]; - if (arg == "--name" || arg == "-n") { - if (i + 1 == argc) { - std::cerr << "No matching argument for " << arg << std::endl; - abort(); - } - istringstream d(argv[i + 1]); - d >> params.exp_name; - i++; - } else if (arg == "--train" || arg == "-t") { - if (i + 1 == argc) { - std::cerr << "No matching argument for " << arg << std::endl; - abort(); - } - istringstream d(argv[i + 1]); - d >> params.train_file; - i++; - } else if (arg == "--dev" || arg == "-d") { - if (i + 1 == argc) { - std::cerr << "No matching argument for " << arg << std::endl; - abort(); - } - istringstream d(argv[i + 1]); - d >> params.dev_file; - i++; - } else if (arg == "--dict" || arg == "-dic") { - if (i + 1 == argc) { - std::cerr << "No matching argument for " << arg << std::endl; - abort(); - } - istringstream d(argv[i + 1]); - d >> params.dic_file; - i++; - } else if (arg == "--test" || arg == "-ts") { - if (i + 1 == argc) { - std::cerr << "No matching argument for " << arg << std::endl; - abort(); - } - istringstream d(argv[i + 1]); - d >> params.test_file; - i++; - } else if (arg == "--model" || arg == "-m") { - if (i + 1 == argc) { - std::cerr << "No matching argument for " << arg << std::endl; - abort(); - } - istringstream d(argv[i + 1]); - d >> params.model_file; - i++; - } else if (arg == "--num_layers" || arg == "-l") { - if (i + 1 == argc) { - std::cerr << "No matching argument for " << arg << std::endl; - abort(); - } - istringstream d(argv[i + 1]); - d >> params.LAYERS; - i++; - } else if (arg == "--input_size" || arg == "-i") { - if (i + 1 == argc) { - std::cerr << "No matching argument for " << arg << std::endl; - abort(); - } - istringstream d(argv[i + 1]); - d >> params.INPUT_DIM; - i++; - } else if (arg == "--hidden_size" || arg == "-h") { - if (i + 1 == argc) { - std::cerr << "No matching argument for " << arg << std::endl; - abort(); - } - istringstream d(argv[i + 1]); - d >> params.HIDDEN_DIM; - i++; - } else if (arg == "--batch_size" || arg == "-b") { - if (i + 1 == argc) { - std::cerr << "No matching argument for " << arg << std::endl; - abort(); - } - istringstream d(argv[i + 1]); - d >> params.BATCH_SIZE; - i++; - } else if (arg == "--num_epochs" || arg == "-N") { - if (i + 1 == argc) { - std::cerr << "No matching argument for " << arg << std::endl; - abort(); - } - istringstream d(argv[i + 1]); - d >> params.NUM_EPOCHS; - i++; - } else if (arg == "--bidirectionnal" || arg == "-bid") { - params.bidirectionnal = true; - } - i++; + int i = 0; + while (i < argc) { + string arg = argv[i]; + if (arg == "--name" || arg == "-n") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.exp_name; + i++; + } else if (arg == "--train" || arg == "-t") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.train_file; + i++; + } else if (arg == "--dev" || arg == "-d") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.dev_file; + i++; + } else if (arg == "--train_labels" || arg == "-tl") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.train_labels_file; + i++; + } else if (arg == "--dev_labels" || arg == "-dl") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.dev_labels_file; + i++; + } else if (arg == "--dict" || arg == "-dic") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.dic_file; + i++; + } else if (arg == "--test" || arg == "-ts") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.test_file; + i++; + } else if (arg == "--model" || arg == "-m") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.model_file; + i++; + } else if (arg == "--num_layers" || arg == "-l") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.LAYERS; + i++; + } else if (arg == "--input_size" || arg == "-i") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.INPUT_DIM; + i++; + } else if (arg == "--hidden_size" || arg == "-h") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.HIDDEN_DIM; + i++; + } else if (arg == "--batch_size" || arg == "-b") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.BATCH_SIZE; + i++; + } else if (arg == "--num_epochs" || arg == "-N") { + if (i + 1 == argc) { + std::cerr << "No matching argument for " << arg << std::endl; + abort(); + } + istringstream d(argv[i + 1]); + d >> params.NUM_EPOCHS; + i++; + } else if (arg == "--bidirectionnal" || arg == "-bid") { + params.bidirectionnal = true; + } + i++; + } + if (task == TRAIN) { + if (params.train_file == "" || params.dev_file == "") { + stringstream ss; + ss << "Usage: " << argv[0] << " -t [train_file] -d [dev_file]"; + throw invalid_argument(ss.str()); } - if (task == TRAIN) { - if (params.train_file == "" || params.dev_file == "") { - std::cerr << "Usage: " << argv[0] << " -t train.txt -d dev.txt\n"; - abort(); - } + } else if (task == TRAIN_SUP) { + if (params.train_file == "" || params.dev_file == "" || params.train_labels_file == "" || params.dev_labels_file == "") { + stringstream ss; + ss << "Usage: " << argv[0] << " -t [train_file] -d [dev_file] -tl [train_labels_file] -d [dev_labels_file]"; + throw invalid_argument(ss.str()); } + } } \ No newline at end of file diff --git a/examples/utils/data-io.h b/examples/utils/data-io.h new file mode 100644 index 000000000..ddeb1a665 --- /dev/null +++ b/examples/utils/data-io.h @@ -0,0 +1,77 @@ +#ifndef DATA_IO_H +#define DATA_IO_H + +#include +#include +#include + +using namespace std; + + + +int ReverseInt (int i) +{ + unsigned char ch1, ch2, ch3, ch4; + ch1 = i & 255; + ch2 = (i >> 8) & 255; + ch3 = (i >> 16) & 255; + ch4 = (i >> 24) & 255; + return ((int)ch1 << 24) + ((int)ch2 << 16) + ((int)ch3 << 8) + ch4; +} + +// Code from https://compvisionlab.wordpress.com/2014/01/01/c-code-for-reading-mnist-data-set/ to read MNIST +void read_mnist(string data_file, vector> &arr) { + ifstream file (data_file, ios::binary); + + if (file.is_open()) { + int magic_number = 0; + int number_of_images = 0; + int n_rows = 0; + int n_cols = 0; + file.read((char*)&magic_number, sizeof(magic_number)); + magic_number = ReverseInt(magic_number); + file.read((char*)&number_of_images, sizeof(number_of_images)); + number_of_images = ReverseInt(number_of_images); + file.read((char*)&n_rows, sizeof(n_rows)); + n_rows = ReverseInt(n_rows); + file.read((char*)&n_cols, sizeof(n_cols)); + n_cols = ReverseInt(n_cols); + for (int i = 0; i < number_of_images; ++i) { + arr.push_back(vector()); + for (int r = 0; r < n_rows; ++r) { + for (int c = 0; c < n_cols; ++c) { + unsigned char temp = 0; + file.read((char*)&temp, sizeof(temp)); + arr[i].push_back((float)temp); + } + } + } + } else { + stringstream ss; + ss << "Error with input file " << data_file; + throw runtime_error(ss.str()); + } +} + +void read_mnist_labels(string label_file, vector &labels) { + ifstream file (label_file, ios::binary); + if (file.is_open()) { + int magic_number = 0; + int number_of_images = 0; + file.read((char*)&magic_number, sizeof(magic_number)); + magic_number = ReverseInt(magic_number); + file.read((char*)&number_of_images, sizeof(number_of_images)); + number_of_images = ReverseInt(number_of_images); + for (int i = 0; i < number_of_images; ++i) { + unsigned char temp = 0; + file.read((char*)&temp, sizeof(temp)); + labels.push_back((unsigned)temp); + } + }else { + stringstream ss; + ss << "Error with input file " << label_file; + throw runtime_error(ss.str()); + } +} + +#endif \ No newline at end of file From 94f6ac1b7c6c3fe6271f5796724d927c7e8c37b4 Mon Sep 17 00:00:00 2001 From: Naomi Saphra Date: Wed, 14 Dec 2016 11:49:08 +0000 Subject: [PATCH 903/965] fixed save example Previously, saveable contained a typo and a format for add_parameters that has been abandoned. --- doc/source/python_tutorial.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/source/python_tutorial.rst b/doc/source/python_tutorial.rst index b43812231..2818f95ff 100644 --- a/doc/source/python_tutorial.rst +++ b/doc/source/python_tutorial.rst @@ -41,11 +41,11 @@ The :python:`Saveable` class is used for easy creation of user-defined "sub netw .. code:: python class OneLayerMLP(Saveable): - def __init__(self, model, num_input, num_hidde, num_out, act=tanh): - self.W1 = model.add_parameters("W1", (num_hidden, num_input)) - self.W2 = model.add_parameters("W2", (num_out, num_hidden)) - self.b1 = model.add_parameters("b1", (num_hidden)) - self.b2 = model.add_parameters("b2", (num_out)) + def __init__(self, model, num_input, num_hidden, num_out, act=tanh): + self.W1 = model.add_parameters((num_hidden, num_input)) + self.W2 = model.add_parameters((num_out, num_hidden)) + self.b1 = model.add_parameters((num_hidden)) + self.b2 = model.add_parameters((num_out)) self.act = act self.shape = (num_input, num_out) From 3605089a800487c70716c70900b94841cfb12b3b Mon Sep 17 00:00:00 2001 From: Paul Michel Date: Wed, 14 Dec 2016 09:29:25 -0500 Subject: [PATCH 904/965] Add ipython notebooks to the docs (#212) * Add ipython notebooks to the docs * Add link to EMNLP tutorial in doc --- doc/source/conf.py | 13 ++- doc/source/cpp_basic_tutorial.rst | 84 ++++++++++++++++ doc/source/index.rst | 2 +- ...utorial.rst => python_saving_tutorial.rst} | 11 +-- doc/source/requirements.txt | 5 +- doc/source/tutorial.rst | 96 ++++--------------- examples/tutorials/API.ipynb | 19 ++-- examples/tutorials/RNNs.ipynb | 28 +++--- examples/tutorials/tutorial-1-xor.ipynb | 40 ++++---- 9 files changed, 164 insertions(+), 134 deletions(-) create mode 100644 doc/source/cpp_basic_tutorial.rst rename doc/source/{python_tutorial.rst => python_saving_tutorial.rst} (93%) diff --git a/doc/source/conf.py b/doc/source/conf.py index 593b22b62..f511d9d3d 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -19,8 +19,9 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -#sys.path.insert(0, os.path.abspath('.')) - +# sys.path.insert(0, os.path.abspath('../../examples/tutorials')) +if not os.path.islink('tutorials_notebooks'): + os.symlink('../../examples/tutorials', 'tutorials_notebooks') # Run doxygen if on Readthedocs : on_rtd = os.environ.get('READTHEDOCS') == 'True' if on_rtd: @@ -35,12 +36,16 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.mathjax', 'breathe' + 'sphinx.ext.mathjax', 'breathe', 'nbsphinx' ] + breathe_projects = {"dynet": "../doxygen/xml/"} breathe_default_project = "dynet" +# Don't execute notebooks because it requires installing Dynet +nbsphinx_execute = 'never' + # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -78,7 +83,7 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = [] +exclude_patterns = ['_build', '**.ipynb_checkpoints'] # The reST default role (used for this markup: `text`) to use for all # documents. diff --git a/doc/source/cpp_basic_tutorial.rst b/doc/source/cpp_basic_tutorial.rst new file mode 100644 index 000000000..5fde305eb --- /dev/null +++ b/doc/source/cpp_basic_tutorial.rst @@ -0,0 +1,84 @@ +Basic Tutorial +~~~~~~~~~~~~~~ + +An illustration of how models are trained (for a simple logistic +regression model) is below: + + First, we set up the structure of the model. + +Create a model, and an SGD trainer to update its parameters. + +.. code:: cpp + + Model mod; + SimpleSGDTrainer sgd(mod); + +Create a "computation graph," which will define the flow of information. + +.. code:: cpp + + ComputationGraph cg; + +Initialize a 1x3 parameter vector, and add the parameters to be part of the computation graph. + +.. code:: cpp + + Expression W = parameter(cg, mod.add_parameters({1, 3})); + +Create variables defining the input and output of the regression, and load them into the computation graph. Note that we don't need to set concrete values yet. + +.. code:: cpp + + vector x_values(3); + Expression x = input(cg, {3}, &x_values); + dynet::real y_value; + Expression y = input(cg, &y_value); + +Next, set up the structure to multiply the input by the weight vector, then run the output of this through a logistic sigmoid function logistic regression). + +.. code:: cpp + + Expression y_pred = logistic(W*x); + +Finally, we create a function to calculate the loss. The model will be optimized to minimize the value of the final function in the computation graph. + +.. code:: cpp + + Expression l = binary_log_loss(y_pred, y); + +We are now done setting up the graph, and we can print out its structure: + +.. code:: cpp + + cg.print_graphviz(); + +Now, we perform a parameter update for a single example. Set the input/output to the values specified by the training data: + +.. code:: cpp + + x_values = {0.5, 0.3, 0.7}; + y_value = 1.0; + +"forward" propagates values forward through the computation graph, and returns the loss. + +.. code:: cpp + + dynet::real loss = as_scalar(cg.forward(l)); + +"backward" performs back-propagation, and accumulates the gradients of the parameters within the "Model" data structure. + +.. code:: cpp + + cg.backward(l); + +"sgd.update" updates parameters of the model that was passed to its constructor. Here 1.0 is the scaling factor that allows us to control the size of the update. + +.. code:: cpp + + sgd.update(1.0); + +Note that this very simple example that doesn't cover things like memory +initialization, reading/writing models, recurrent/LSTM networks, or +adding biases to functions. The best way to get an idea of how to use +DyNet for real is to look in the ``example`` directory, particularly +starting with the simplest ``xor`` example. \ No newline at end of file diff --git a/doc/source/index.rst b/doc/source/index.rst index 1d19ccb46..3d0999fd1 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -19,7 +19,7 @@ DyNet can be installed according to the instructions below: And get the basic information to create programs and use models: .. toctree:: - :maxdepth: 2 + :maxdepth: 3 tutorial commandline diff --git a/doc/source/python_tutorial.rst b/doc/source/python_saving_tutorial.rst similarity index 93% rename from doc/source/python_tutorial.rst rename to doc/source/python_saving_tutorial.rst index 2818f95ff..25acb49f1 100644 --- a/doc/source/python_tutorial.rst +++ b/doc/source/python_saving_tutorial.rst @@ -1,15 +1,8 @@ .. role:: python(code) :language: python -Python Tutorial -=============== - -Guided examples in Python can be found in the jupyter tutorials_. - -.. _tutorials: https://github.com/clab/dynet/tree/master/examples/tutorials - Saving Models -------------- +~~~~~~~~~~~~~ In order to save model parameters, the user instead tells the model, at save time, which are the components it is interested in saving. They then need to specify the same components, in the same order, at load time. @@ -90,4 +83,4 @@ And for the usage: output2 = mlp2(E2[3]) - assert(numpy.array_equal(output2.npvalue(), output.npvalue())) + assert(numpy.array_equal(output2.npvalue(), output.npvalue())) \ No newline at end of file diff --git a/doc/source/requirements.txt b/doc/source/requirements.txt index 188f51e62..993f81094 100644 --- a/doc/source/requirements.txt +++ b/doc/source/requirements.txt @@ -1 +1,4 @@ -breathe \ No newline at end of file +sphinx>=1.4 +breathe +nbsphinx +ipykernel \ No newline at end of file diff --git a/doc/source/tutorial.rst b/doc/source/tutorial.rst index 834f21611..85ca4ac9d 100644 --- a/doc/source/tutorial.rst +++ b/doc/source/tutorial.rst @@ -1,91 +1,31 @@ DyNet Tutorial ============== -An illustration of how models are trained (for a simple logistic -regression model) is below: +C++ Tutorial +------------ - First, we set up the structure of the model. +See the tutorials for the C++ version of Dynet -Create a model, and an SGD trainer to update its parameters. +.. toctree:: + :maxdepth: 2 -.. code:: cpp + cpp_basic_tutorial - Model mod; - SimpleSGDTrainer sgd(mod); - -Create a "computation graph," which will define the flow of information. - -.. code:: cpp - - ComputationGraph cg; - -Initialize a 1x3 parameter vector, and add the parameters to be part of the computation graph. - -.. code:: cpp - - Expression W = parameter(cg, mod.add_parameters({1, 3})); - -Create variables defining the input and output of the regression, and load them into the computation graph. Note that we don't need to set concrete values yet. - -.. code:: cpp - - vector x_values(3); - Expression x = input(cg, {3}, &x_values); - dynet::real y_value; - Expression y = input(cg, &y_value); - -Next, set up the structure to multiply the input by the weight vector, then run the output of this through a logistic sigmoid function logistic regression). - -.. code:: cpp - - Expression y_pred = logistic(W*x); - -Finally, we create a function to calculate the loss. The model will be optimized to minimize the value of the final function in the computation graph. - -.. code:: cpp - - Expression l = binary_log_loss(y_pred, y); - -We are now done setting up the graph, and we can print out its structure: - -.. code:: cpp - - cg.print_graphviz(); - -Now, we perform a parameter update for a single example. Set the input/output to the values specified by the training data: - -.. code:: cpp - - x_values = {0.5, 0.3, 0.7}; - y_value = 1.0; - -"forward" propagates values forward through the computation graph, and returns the loss. - -.. code:: cpp - - dynet::real loss = as_scalar(cg.forward(l)); - -"backward" performs back-propagation, and accumulates the gradients of the parameters within the "Model" data structure. - -.. code:: cpp - - cg.backward(l); - -"sgd.update" updates parameters of the model that was passed to its constructor. Here 1.0 is the scaling factor that allows us to control the size of the update. +Python Tutorial +--------------- -.. code:: cpp +Guided examples in Python can be found below : - sgd.update(1.0); +.. toctree:: + :maxdepth: 2 + :titlesonly: -Note that this very simple example that doesn't cover things like memory -initialization, reading/writing models, recurrent/LSTM networks, or -adding biases to functions. The best way to get an idea of how to use -DyNet for real is to look in the ``example`` directory, particularly -starting with the simplest ``xor`` example. + tutorials_notebooks/tutorial-1-xor.ipynb + tutorials_notebooks/API.ipynb + tutorials_notebooks/RNNs.ipynb + python_saving_tutorial -Python Tutorials ---------------- +A more comprehensive tutorial can be found here_ (EMNLP 2016 tutorial). -Guided examples in Python can be found in the jupyter tutorials_. -.. _tutorials: https://github.com/clab/dynet/tree/master/examples/tutorials +.. _here: https://github.com/clab/dynet_tutorial_examples \ No newline at end of file diff --git a/examples/tutorials/API.ipynb b/examples/tutorials/API.ipynb index ece20a2f1..55401e5c2 100644 --- a/examples/tutorials/API.ipynb +++ b/examples/tutorials/API.ipynb @@ -4,9 +4,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Expression building\n", + "## API tutorial" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Expression building\n", "\n", - "### (note: may have old API in some cases)" + "(note: may have old API in some cases)" ] }, { @@ -169,7 +176,7 @@ "collapsed": true }, "source": [ - "## Recipe" + "### Recipe" ] }, { @@ -274,7 +281,7 @@ "collapsed": true }, "source": [ - "# Recipe (using classes)" + "### Recipe (using classes)" ] }, { @@ -371,7 +378,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## or, alternatively, have the training outside of the network class" + "### or, alternatively, have the training outside of the network class" ] }, { @@ -458,7 +465,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.11" + "version": "2.7.10" } }, "nbformat": 4, diff --git a/examples/tutorials/RNNs.ipynb b/examples/tutorials/RNNs.ipynb index 8db789100..d75599495 100644 --- a/examples/tutorials/RNNs.ipynb +++ b/examples/tutorials/RNNs.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## RNNs tutorial" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -17,7 +24,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## An LSTM/RNN overview:\n", + "### An LSTM/RNN overview:\n", "\n", "An (1-layer) RNN can be thought of as a sequence of cells, $h_1,...,h_k$, where $h_i$ indicates the time dimenstion. \n", "\n", @@ -46,7 +53,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## The LSTM (RNN) Interface\n", + "### The LSTM (RNN) Interface\n", "\n", "RNN / LSTM / GRU follow the same interface. We have a \"builder\" which is in charge of creating definining the parameters for the sequence." ] @@ -289,7 +296,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Extra options in the RNN/LSTM interface\n", + "### Extra options in the RNN/LSTM interface\n", "\n", "**Stack LSTM** The RNN's are shaped as a stack: we can remove the top and continue from the previous state.\n", "This is done either by remembering the previous state and continuing it with a new `.add_input()`, or using\n", @@ -374,7 +381,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Aside: memory efficient transduction\n", + "### Aside: memory efficient transduction\n", "The `RNNState` interface is convenient, and allows for incremental input construction.\n", "However, sometimes we know the sequence of inputs in advance, and care only about the sequence of\n", "output expressions. In this case, we can use the `add_inputs(xs)` method, where `xs` is a list of Expression." @@ -445,7 +452,7 @@ "collapsed": true }, "source": [ - "## Charecter-level LSTM\n", + "### Charecter-level LSTM\n", "\n", "Now that we know the basics of RNNs, let's build a character-level LSTM language-model.\n", "We have a sequence LSTM that, at each step, gets as input a character, and needs to predict the next character." @@ -767,15 +774,6 @@ "train(srnn, \"these pretzels are making me thirsty\")" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": null, @@ -802,7 +800,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.11" + "version": "2.7.10" } }, "nbformat": 4, diff --git a/examples/tutorials/tutorial-1-xor.ipynb b/examples/tutorials/tutorial-1-xor.ipynb index dbeb2c4d5..16b9f71e0 100644 --- a/examples/tutorials/tutorial-1-xor.ipynb +++ b/examples/tutorials/tutorial-1-xor.ipynb @@ -1,23 +1,10 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# we assume that we have the dynet module in your path.\n", - "# OUTDATED: we also assume that LD_LIBRARY_PATH includes a pointer to where libcnn_shared.so is.\n", - "from dynet import *" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Working with the python dyNET package\n", + "## Working with the python dyNET package\n", "\n", "The dyNET package is intended for neural-network processing on the CPU, and is particularly suited for NLP applications. It is a python-wrapper for the dyNET C++ package written by Chris Dyer.\n", "\n", @@ -33,7 +20,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Package Fundamentals\n", + "### Package Fundamentals\n", "\n", "The main piece of dyNET is the `ComputationGraph`, which is what essentially defines a neural network.\n", "The `ComputationGraph` is composed of expressions, which relate to the inputs and outputs of the network,\n", @@ -48,7 +35,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Static Networks\n", + "### Static Networks\n", "\n", "The life-cycle of a dyNET program is:\n", "1. Create a `Model`, and populate it with `Parameters`.\n", @@ -70,6 +57,19 @@ "We will begin by defining the model and the computation graph.\n" ] }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# we assume that we have the dynet module in your path.\n", + "# OUTDATED: we also assume that LD_LIBRARY_PATH includes a pointer to where libcnn_shared.so is.\n", + "from dynet import *" + ] + }, { "cell_type": "code", "execution_count": 2, @@ -211,7 +211,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Training\n", + "### Training\n", "We now want to set the parameter weights such that the loss is minimized. \n", "\n", "For this, we will use a trainer object. A trainer is constructed with respect to the parameters of a given model." @@ -547,7 +547,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## To summarize\n", + "### To summarize\n", "Here is a complete program:" ] }, @@ -702,7 +702,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Dynamic Networks\n", + "### Dynamic Networks\n", "\n", "Dynamic networks are very similar to static ones, but instead of creating the network once and then calling \"set\" in each training example to change the inputs, we just create a new network for each training example.\n", "\n", @@ -869,7 +869,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.11" + "version": "2.7.10" } }, "nbformat": 4, From f237b283fbe2446f3fb1a49cf0079cb74af2ad44 Mon Sep 17 00:00:00 2001 From: Paul Michel Date: Wed, 14 Dec 2016 10:22:53 -0500 Subject: [PATCH 905/965] Reorganise examples by programming language (#216) --- doc/source/conf.py | 2 +- examples/CMakeLists.txt | 2 +- examples/{ => cpp}/embed-cl/train_embed-cl.cc | 0 examples/{ => cpp}/encdec/encdec.h | 0 examples/{ => cpp}/encdec/train_encdec.cc | 0 .../{ => cpp}/example-data/clusters-hsm.txt | 0 examples/{ => cpp}/example-data/dev-hsm.txt | 0 examples/{ => cpp}/example-data/dev-poi.txt | 0 examples/{ => cpp}/example-data/fin-dev.txt | 0 examples/{ => cpp}/example-data/fin-toy.txt | 0 .../{ => cpp}/example-data/fin-words-dev.txt | 0 examples/{ => cpp}/example-data/fin-words.txt | 0 examples/{ => cpp}/example-data/fin.txt | 0 .../{ => cpp}/example-data/seg-sup.dev.txt | 0 examples/{ => cpp}/example-data/textcat.txt | 0 examples/{ => cpp}/example-data/train-hsm.txt | 0 examples/{ => cpp}/example-data/train-poi.txt | 0 examples/{ => cpp}/mlc/train_mlc.cc | 0 examples/{ => cpp}/nlm/train_nlm.cc | 0 .../train_poisson-regression.cc | 0 .../{ => cpp}/read-write/train_read-write.cc | 0 .../{ => cpp}/rnnlm-aevb/train_rnnlm-aevb.cc | 0 examples/{ => cpp}/rnnlm-batch/rnnlm-batch.h | 0 .../rnnlm-batch/train_rnnlm-batch.cc | 0 .../{ => cpp}/rnnlm-cfsm/train_rnnlm-cfsm.cc | 0 .../train_rnnlm-final-batch.cc | 0 .../rnnlm-givenbag/rnnlm-givenbag.cc | 0 examples/{ => cpp}/rnnlm-mp/rnnlm.h | 0 examples/{ => cpp}/rnnlm-mp/train_rnnlm-mp.cc | 0 examples/{ => cpp}/rnnlm/README.md | 0 examples/{ => cpp}/rnnlm/install-examples.sh | 0 examples/{ => cpp}/rnnlm/train_rnnlm.cc | 2 +- .../{ => cpp}/segrnn-sup/train_segrnn-sup.cc | 0 .../{ => cpp}/skiprnnlm/train_skiprnnlm.cc | 0 .../{ => cpp}/tag-bilstm/train_tag-bilstm.cc | 0 examples/{ => cpp}/textcat/train_textcat.cc | 0 .../{ => cpp}/tok-embed/train_tok-embed.cc | 0 examples/{ => cpp}/utils/cl-args.h | 0 examples/{ => cpp}/utils/getpid.h | 0 .../train_xor-batch-lookup.cc | 0 .../{ => cpp}/xor-batch/train_xor-batch.cc | 0 examples/{ => cpp}/xor-mp/train_xor-mp.cc | 0 examples/{ => cpp}/xor-xent/train_xor-xent.cc | 0 examples/{ => cpp}/xor/train_xor.cc | 0 examples/{attention => python}/attention.py | 0 .../{tag-bilstm => python}/bilstmtagger.py | 0 examples/{cpu_vs_gpu => python}/cpu_vs_gpu.py | 0 examples/{minibatch => python}/minibatch.py | 0 examples/{rnnlm => python}/rnnlm.py | 0 examples/{rnnlm => python}/rnnlm_transduce.py | 0 examples/{ => python}/tutorials/API.ipynb | 0 examples/{ => python}/tutorials/RNNs.ipynb | 0 .../tutorials/tutorial-1-xor.ipynb | 0 examples/{rnnlm => python}/util.py | 0 examples/{viz_birnn => python}/viz_birnn.py | 0 examples/{xor => python}/xor.py | 0 examples/tag-bilstm/util.py | 36 ------------------- 57 files changed, 3 insertions(+), 39 deletions(-) rename examples/{ => cpp}/embed-cl/train_embed-cl.cc (100%) rename examples/{ => cpp}/encdec/encdec.h (100%) rename examples/{ => cpp}/encdec/train_encdec.cc (100%) rename examples/{ => cpp}/example-data/clusters-hsm.txt (100%) rename examples/{ => cpp}/example-data/dev-hsm.txt (100%) rename examples/{ => cpp}/example-data/dev-poi.txt (100%) rename examples/{ => cpp}/example-data/fin-dev.txt (100%) rename examples/{ => cpp}/example-data/fin-toy.txt (100%) rename examples/{ => cpp}/example-data/fin-words-dev.txt (100%) rename examples/{ => cpp}/example-data/fin-words.txt (100%) rename examples/{ => cpp}/example-data/fin.txt (100%) rename examples/{ => cpp}/example-data/seg-sup.dev.txt (100%) rename examples/{ => cpp}/example-data/textcat.txt (100%) rename examples/{ => cpp}/example-data/train-hsm.txt (100%) rename examples/{ => cpp}/example-data/train-poi.txt (100%) rename examples/{ => cpp}/mlc/train_mlc.cc (100%) rename examples/{ => cpp}/nlm/train_nlm.cc (100%) rename examples/{ => cpp}/poisson-regression/train_poisson-regression.cc (100%) rename examples/{ => cpp}/read-write/train_read-write.cc (100%) rename examples/{ => cpp}/rnnlm-aevb/train_rnnlm-aevb.cc (100%) rename examples/{ => cpp}/rnnlm-batch/rnnlm-batch.h (100%) rename examples/{ => cpp}/rnnlm-batch/train_rnnlm-batch.cc (100%) rename examples/{ => cpp}/rnnlm-cfsm/train_rnnlm-cfsm.cc (100%) rename examples/{ => cpp}/rnnlm-final-batch/train_rnnlm-final-batch.cc (100%) rename examples/{ => cpp}/rnnlm-givenbag/rnnlm-givenbag.cc (100%) rename examples/{ => cpp}/rnnlm-mp/rnnlm.h (100%) rename examples/{ => cpp}/rnnlm-mp/train_rnnlm-mp.cc (100%) rename examples/{ => cpp}/rnnlm/README.md (100%) rename examples/{ => cpp}/rnnlm/install-examples.sh (100%) rename examples/{ => cpp}/rnnlm/train_rnnlm.cc (99%) rename examples/{ => cpp}/segrnn-sup/train_segrnn-sup.cc (100%) rename examples/{ => cpp}/skiprnnlm/train_skiprnnlm.cc (100%) rename examples/{ => cpp}/tag-bilstm/train_tag-bilstm.cc (100%) rename examples/{ => cpp}/textcat/train_textcat.cc (100%) rename examples/{ => cpp}/tok-embed/train_tok-embed.cc (100%) rename examples/{ => cpp}/utils/cl-args.h (100%) rename examples/{ => cpp}/utils/getpid.h (100%) rename examples/{ => cpp}/xor-batch-lookup/train_xor-batch-lookup.cc (100%) rename examples/{ => cpp}/xor-batch/train_xor-batch.cc (100%) rename examples/{ => cpp}/xor-mp/train_xor-mp.cc (100%) rename examples/{ => cpp}/xor-xent/train_xor-xent.cc (100%) rename examples/{ => cpp}/xor/train_xor.cc (100%) rename examples/{attention => python}/attention.py (100%) rename examples/{tag-bilstm => python}/bilstmtagger.py (100%) rename examples/{cpu_vs_gpu => python}/cpu_vs_gpu.py (100%) rename examples/{minibatch => python}/minibatch.py (100%) rename examples/{rnnlm => python}/rnnlm.py (100%) rename examples/{rnnlm => python}/rnnlm_transduce.py (100%) rename examples/{ => python}/tutorials/API.ipynb (100%) rename examples/{ => python}/tutorials/RNNs.ipynb (100%) rename examples/{ => python}/tutorials/tutorial-1-xor.ipynb (100%) rename examples/{rnnlm => python}/util.py (100%) rename examples/{viz_birnn => python}/viz_birnn.py (100%) rename examples/{xor => python}/xor.py (100%) delete mode 100644 examples/tag-bilstm/util.py diff --git a/doc/source/conf.py b/doc/source/conf.py index f511d9d3d..694a4c988 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -21,7 +21,7 @@ # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.insert(0, os.path.abspath('../../examples/tutorials')) if not os.path.islink('tutorials_notebooks'): - os.symlink('../../examples/tutorials', 'tutorials_notebooks') + os.symlink('../../examples/python/tutorials', 'tutorials_notebooks') # Run doxygen if on Readthedocs : on_rtd = os.environ.get('READTHEDOCS') == 'True' if on_rtd: diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 7987ce84c..b8ce79bee 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -6,7 +6,7 @@ endif() foreach(FOLDER encdec mlc tok-embed poisson-regression tag-bilstm embed-cl xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat read-write segrnn-sup ${MP_EXAMPLES}) set(TARGET train_${FOLDER}) - ADD_EXECUTABLE(${TARGET} ${FOLDER}/${TARGET}.cc) + ADD_EXECUTABLE(${TARGET} cpp/${FOLDER}/${TARGET}.cc) if (WITH_CUDA_BACKEND) target_link_libraries(${TARGET} gdynet ${LIBS}) add_dependencies(${TARGET} dynetcuda) diff --git a/examples/embed-cl/train_embed-cl.cc b/examples/cpp/embed-cl/train_embed-cl.cc similarity index 100% rename from examples/embed-cl/train_embed-cl.cc rename to examples/cpp/embed-cl/train_embed-cl.cc diff --git a/examples/encdec/encdec.h b/examples/cpp/encdec/encdec.h similarity index 100% rename from examples/encdec/encdec.h rename to examples/cpp/encdec/encdec.h diff --git a/examples/encdec/train_encdec.cc b/examples/cpp/encdec/train_encdec.cc similarity index 100% rename from examples/encdec/train_encdec.cc rename to examples/cpp/encdec/train_encdec.cc diff --git a/examples/example-data/clusters-hsm.txt b/examples/cpp/example-data/clusters-hsm.txt similarity index 100% rename from examples/example-data/clusters-hsm.txt rename to examples/cpp/example-data/clusters-hsm.txt diff --git a/examples/example-data/dev-hsm.txt b/examples/cpp/example-data/dev-hsm.txt similarity index 100% rename from examples/example-data/dev-hsm.txt rename to examples/cpp/example-data/dev-hsm.txt diff --git a/examples/example-data/dev-poi.txt b/examples/cpp/example-data/dev-poi.txt similarity index 100% rename from examples/example-data/dev-poi.txt rename to examples/cpp/example-data/dev-poi.txt diff --git a/examples/example-data/fin-dev.txt b/examples/cpp/example-data/fin-dev.txt similarity index 100% rename from examples/example-data/fin-dev.txt rename to examples/cpp/example-data/fin-dev.txt diff --git a/examples/example-data/fin-toy.txt b/examples/cpp/example-data/fin-toy.txt similarity index 100% rename from examples/example-data/fin-toy.txt rename to examples/cpp/example-data/fin-toy.txt diff --git a/examples/example-data/fin-words-dev.txt b/examples/cpp/example-data/fin-words-dev.txt similarity index 100% rename from examples/example-data/fin-words-dev.txt rename to examples/cpp/example-data/fin-words-dev.txt diff --git a/examples/example-data/fin-words.txt b/examples/cpp/example-data/fin-words.txt similarity index 100% rename from examples/example-data/fin-words.txt rename to examples/cpp/example-data/fin-words.txt diff --git a/examples/example-data/fin.txt b/examples/cpp/example-data/fin.txt similarity index 100% rename from examples/example-data/fin.txt rename to examples/cpp/example-data/fin.txt diff --git a/examples/example-data/seg-sup.dev.txt b/examples/cpp/example-data/seg-sup.dev.txt similarity index 100% rename from examples/example-data/seg-sup.dev.txt rename to examples/cpp/example-data/seg-sup.dev.txt diff --git a/examples/example-data/textcat.txt b/examples/cpp/example-data/textcat.txt similarity index 100% rename from examples/example-data/textcat.txt rename to examples/cpp/example-data/textcat.txt diff --git a/examples/example-data/train-hsm.txt b/examples/cpp/example-data/train-hsm.txt similarity index 100% rename from examples/example-data/train-hsm.txt rename to examples/cpp/example-data/train-hsm.txt diff --git a/examples/example-data/train-poi.txt b/examples/cpp/example-data/train-poi.txt similarity index 100% rename from examples/example-data/train-poi.txt rename to examples/cpp/example-data/train-poi.txt diff --git a/examples/mlc/train_mlc.cc b/examples/cpp/mlc/train_mlc.cc similarity index 100% rename from examples/mlc/train_mlc.cc rename to examples/cpp/mlc/train_mlc.cc diff --git a/examples/nlm/train_nlm.cc b/examples/cpp/nlm/train_nlm.cc similarity index 100% rename from examples/nlm/train_nlm.cc rename to examples/cpp/nlm/train_nlm.cc diff --git a/examples/poisson-regression/train_poisson-regression.cc b/examples/cpp/poisson-regression/train_poisson-regression.cc similarity index 100% rename from examples/poisson-regression/train_poisson-regression.cc rename to examples/cpp/poisson-regression/train_poisson-regression.cc diff --git a/examples/read-write/train_read-write.cc b/examples/cpp/read-write/train_read-write.cc similarity index 100% rename from examples/read-write/train_read-write.cc rename to examples/cpp/read-write/train_read-write.cc diff --git a/examples/rnnlm-aevb/train_rnnlm-aevb.cc b/examples/cpp/rnnlm-aevb/train_rnnlm-aevb.cc similarity index 100% rename from examples/rnnlm-aevb/train_rnnlm-aevb.cc rename to examples/cpp/rnnlm-aevb/train_rnnlm-aevb.cc diff --git a/examples/rnnlm-batch/rnnlm-batch.h b/examples/cpp/rnnlm-batch/rnnlm-batch.h similarity index 100% rename from examples/rnnlm-batch/rnnlm-batch.h rename to examples/cpp/rnnlm-batch/rnnlm-batch.h diff --git a/examples/rnnlm-batch/train_rnnlm-batch.cc b/examples/cpp/rnnlm-batch/train_rnnlm-batch.cc similarity index 100% rename from examples/rnnlm-batch/train_rnnlm-batch.cc rename to examples/cpp/rnnlm-batch/train_rnnlm-batch.cc diff --git a/examples/rnnlm-cfsm/train_rnnlm-cfsm.cc b/examples/cpp/rnnlm-cfsm/train_rnnlm-cfsm.cc similarity index 100% rename from examples/rnnlm-cfsm/train_rnnlm-cfsm.cc rename to examples/cpp/rnnlm-cfsm/train_rnnlm-cfsm.cc diff --git a/examples/rnnlm-final-batch/train_rnnlm-final-batch.cc b/examples/cpp/rnnlm-final-batch/train_rnnlm-final-batch.cc similarity index 100% rename from examples/rnnlm-final-batch/train_rnnlm-final-batch.cc rename to examples/cpp/rnnlm-final-batch/train_rnnlm-final-batch.cc diff --git a/examples/rnnlm-givenbag/rnnlm-givenbag.cc b/examples/cpp/rnnlm-givenbag/rnnlm-givenbag.cc similarity index 100% rename from examples/rnnlm-givenbag/rnnlm-givenbag.cc rename to examples/cpp/rnnlm-givenbag/rnnlm-givenbag.cc diff --git a/examples/rnnlm-mp/rnnlm.h b/examples/cpp/rnnlm-mp/rnnlm.h similarity index 100% rename from examples/rnnlm-mp/rnnlm.h rename to examples/cpp/rnnlm-mp/rnnlm.h diff --git a/examples/rnnlm-mp/train_rnnlm-mp.cc b/examples/cpp/rnnlm-mp/train_rnnlm-mp.cc similarity index 100% rename from examples/rnnlm-mp/train_rnnlm-mp.cc rename to examples/cpp/rnnlm-mp/train_rnnlm-mp.cc diff --git a/examples/rnnlm/README.md b/examples/cpp/rnnlm/README.md similarity index 100% rename from examples/rnnlm/README.md rename to examples/cpp/rnnlm/README.md diff --git a/examples/rnnlm/install-examples.sh b/examples/cpp/rnnlm/install-examples.sh similarity index 100% rename from examples/rnnlm/install-examples.sh rename to examples/cpp/rnnlm/install-examples.sh diff --git a/examples/rnnlm/train_rnnlm.cc b/examples/cpp/rnnlm/train_rnnlm.cc similarity index 99% rename from examples/rnnlm/train_rnnlm.cc rename to examples/cpp/rnnlm/train_rnnlm.cc index 9e7b5d40c..4f932e4b7 100644 --- a/examples/rnnlm/train_rnnlm.cc +++ b/examples/cpp/rnnlm/train_rnnlm.cc @@ -9,7 +9,7 @@ #include "dynet/expr.h" #include "dynet/cfsm-builder.h" #include "dynet/hsm-builder.h" -#include "../examples/utils/getpid.h" +#include "../utils/getpid.h" #include #include diff --git a/examples/segrnn-sup/train_segrnn-sup.cc b/examples/cpp/segrnn-sup/train_segrnn-sup.cc similarity index 100% rename from examples/segrnn-sup/train_segrnn-sup.cc rename to examples/cpp/segrnn-sup/train_segrnn-sup.cc diff --git a/examples/skiprnnlm/train_skiprnnlm.cc b/examples/cpp/skiprnnlm/train_skiprnnlm.cc similarity index 100% rename from examples/skiprnnlm/train_skiprnnlm.cc rename to examples/cpp/skiprnnlm/train_skiprnnlm.cc diff --git a/examples/tag-bilstm/train_tag-bilstm.cc b/examples/cpp/tag-bilstm/train_tag-bilstm.cc similarity index 100% rename from examples/tag-bilstm/train_tag-bilstm.cc rename to examples/cpp/tag-bilstm/train_tag-bilstm.cc diff --git a/examples/textcat/train_textcat.cc b/examples/cpp/textcat/train_textcat.cc similarity index 100% rename from examples/textcat/train_textcat.cc rename to examples/cpp/textcat/train_textcat.cc diff --git a/examples/tok-embed/train_tok-embed.cc b/examples/cpp/tok-embed/train_tok-embed.cc similarity index 100% rename from examples/tok-embed/train_tok-embed.cc rename to examples/cpp/tok-embed/train_tok-embed.cc diff --git a/examples/utils/cl-args.h b/examples/cpp/utils/cl-args.h similarity index 100% rename from examples/utils/cl-args.h rename to examples/cpp/utils/cl-args.h diff --git a/examples/utils/getpid.h b/examples/cpp/utils/getpid.h similarity index 100% rename from examples/utils/getpid.h rename to examples/cpp/utils/getpid.h diff --git a/examples/xor-batch-lookup/train_xor-batch-lookup.cc b/examples/cpp/xor-batch-lookup/train_xor-batch-lookup.cc similarity index 100% rename from examples/xor-batch-lookup/train_xor-batch-lookup.cc rename to examples/cpp/xor-batch-lookup/train_xor-batch-lookup.cc diff --git a/examples/xor-batch/train_xor-batch.cc b/examples/cpp/xor-batch/train_xor-batch.cc similarity index 100% rename from examples/xor-batch/train_xor-batch.cc rename to examples/cpp/xor-batch/train_xor-batch.cc diff --git a/examples/xor-mp/train_xor-mp.cc b/examples/cpp/xor-mp/train_xor-mp.cc similarity index 100% rename from examples/xor-mp/train_xor-mp.cc rename to examples/cpp/xor-mp/train_xor-mp.cc diff --git a/examples/xor-xent/train_xor-xent.cc b/examples/cpp/xor-xent/train_xor-xent.cc similarity index 100% rename from examples/xor-xent/train_xor-xent.cc rename to examples/cpp/xor-xent/train_xor-xent.cc diff --git a/examples/xor/train_xor.cc b/examples/cpp/xor/train_xor.cc similarity index 100% rename from examples/xor/train_xor.cc rename to examples/cpp/xor/train_xor.cc diff --git a/examples/attention/attention.py b/examples/python/attention.py similarity index 100% rename from examples/attention/attention.py rename to examples/python/attention.py diff --git a/examples/tag-bilstm/bilstmtagger.py b/examples/python/bilstmtagger.py similarity index 100% rename from examples/tag-bilstm/bilstmtagger.py rename to examples/python/bilstmtagger.py diff --git a/examples/cpu_vs_gpu/cpu_vs_gpu.py b/examples/python/cpu_vs_gpu.py similarity index 100% rename from examples/cpu_vs_gpu/cpu_vs_gpu.py rename to examples/python/cpu_vs_gpu.py diff --git a/examples/minibatch/minibatch.py b/examples/python/minibatch.py similarity index 100% rename from examples/minibatch/minibatch.py rename to examples/python/minibatch.py diff --git a/examples/rnnlm/rnnlm.py b/examples/python/rnnlm.py similarity index 100% rename from examples/rnnlm/rnnlm.py rename to examples/python/rnnlm.py diff --git a/examples/rnnlm/rnnlm_transduce.py b/examples/python/rnnlm_transduce.py similarity index 100% rename from examples/rnnlm/rnnlm_transduce.py rename to examples/python/rnnlm_transduce.py diff --git a/examples/tutorials/API.ipynb b/examples/python/tutorials/API.ipynb similarity index 100% rename from examples/tutorials/API.ipynb rename to examples/python/tutorials/API.ipynb diff --git a/examples/tutorials/RNNs.ipynb b/examples/python/tutorials/RNNs.ipynb similarity index 100% rename from examples/tutorials/RNNs.ipynb rename to examples/python/tutorials/RNNs.ipynb diff --git a/examples/tutorials/tutorial-1-xor.ipynb b/examples/python/tutorials/tutorial-1-xor.ipynb similarity index 100% rename from examples/tutorials/tutorial-1-xor.ipynb rename to examples/python/tutorials/tutorial-1-xor.ipynb diff --git a/examples/rnnlm/util.py b/examples/python/util.py similarity index 100% rename from examples/rnnlm/util.py rename to examples/python/util.py diff --git a/examples/viz_birnn/viz_birnn.py b/examples/python/viz_birnn.py similarity index 100% rename from examples/viz_birnn/viz_birnn.py rename to examples/python/viz_birnn.py diff --git a/examples/xor/xor.py b/examples/python/xor.py similarity index 100% rename from examples/xor/xor.py rename to examples/python/xor.py diff --git a/examples/tag-bilstm/util.py b/examples/tag-bilstm/util.py deleted file mode 100644 index f3ac0c425..000000000 --- a/examples/tag-bilstm/util.py +++ /dev/null @@ -1,36 +0,0 @@ -from collections import defaultdict -from itertools import count -class Vocab: - def __init__(self, w2i=None): - if w2i is None: w2i = defaultdict(count(0).next) - self.w2i = dict(w2i) - self.i2w = {i:w for w,i in w2i.iteritems()} - @classmethod - def from_corpus(cls, corpus): - w2i = defaultdict(count(0).next) - for sent in corpus: - [w2i[word] for word in sent] - return Vocab(w2i) - - def size(self): return len(self.w2i.keys()) - -class CorpusReader: - def __init__(self, fname): - self.fname = fname - def __iter__(self): - for line in file(self.fname): - line = line.strip().split() - #line = [' ' if x == '' else x for x in line] - yield line - -class CharsCorpusReader: - def __init__(self, fname, begin=None): - self.fname = fname - self.begin = begin - def __iter__(self): - begin = self.begin - for line in file(self.fname): - line = list(line) - if begin: - line = [begin] + line - yield line From dd11d88fa39c3f52a270be330fa68163ef07ea56 Mon Sep 17 00:00:00 2001 From: Paul Michel Date: Wed, 14 Dec 2016 10:42:07 -0500 Subject: [PATCH 906/965] Correct examples path in doxyfile --- doc/doxygen/Doxyfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/doxygen/Doxyfile b/doc/doxygen/Doxyfile index ca3dbcae9..62234961f 100644 --- a/doc/doxygen/Doxyfile +++ b/doc/doxygen/Doxyfile @@ -758,7 +758,7 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT =../../dynet/expr.h ../../dynet/training.h ../../dynet/rnn.h ../../examples/encdec/encdec.h ../../examples/rnnlm-batch/rnnlm-batch.h +INPUT =../../dynet/expr.h ../../dynet/training.h ../../dynet/rnn.h ../../examples/cpp/encdec/encdec.h ../../examples/cpp/rnnlm-batch/rnnlm-batch.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses From d7448d86c46773764e2a01e56e9d4ef83f974f6f Mon Sep 17 00:00:00 2001 From: paul Date: Wed, 14 Dec 2016 11:25:07 -0500 Subject: [PATCH 907/965] Move examples --- doc/doxygen/Doxyfile | 2 +- examples/{ => cpp}/mnist/README.md | 0 examples/{ => cpp}/mnist/mlp.h | 0 examples/{ => cpp}/mnist/train_mnist.cc | 0 4 files changed, 1 insertion(+), 1 deletion(-) rename examples/{ => cpp}/mnist/README.md (100%) rename examples/{ => cpp}/mnist/mlp.h (100%) rename examples/{ => cpp}/mnist/train_mnist.cc (100%) diff --git a/doc/doxygen/Doxyfile b/doc/doxygen/Doxyfile index 66f2fc13a..e6c2cb8f7 100644 --- a/doc/doxygen/Doxyfile +++ b/doc/doxygen/Doxyfile @@ -758,7 +758,7 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT =../../dynet/expr.h ../../dynet/training.h ../../dynet/rnn.h ../../examples/encdec/encdec.h ../../examples/rnnlm-batch/rnnlm-batch.h ../../examples/mnist/mlp.h +INPUT =../../dynet/expr.h ../../dynet/training.h ../../dynet/rnn.h ../../examples/cpp/encdec/encdec.h ../../examples/cpp/rnnlm-batch/rnnlm-batch.h ../../examples/cpp/mnist/mlp.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses diff --git a/examples/mnist/README.md b/examples/cpp/mnist/README.md similarity index 100% rename from examples/mnist/README.md rename to examples/cpp/mnist/README.md diff --git a/examples/mnist/mlp.h b/examples/cpp/mnist/mlp.h similarity index 100% rename from examples/mnist/mlp.h rename to examples/cpp/mnist/mlp.h diff --git a/examples/mnist/train_mnist.cc b/examples/cpp/mnist/train_mnist.cc similarity index 100% rename from examples/mnist/train_mnist.cc rename to examples/cpp/mnist/train_mnist.cc From bcea61eab911d42c900d44dce2575a034c791c5c Mon Sep 17 00:00:00 2001 From: Paul Michel Date: Wed, 14 Dec 2016 23:04:33 -0500 Subject: [PATCH 908/965] Fix dead links causing failed doc build --- doc/source/python.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/python.rst b/doc/source/python.rst index 54f5b6db3..3628e650f 100644 --- a/doc/source/python.rst +++ b/doc/source/python.rst @@ -89,7 +89,7 @@ Python interpreter. If Boost is installed in a non-standard location, you should add the corresponding flags to the ``cmake`` commandline, see the `DyNet -installation instructions page `__. +installation instructions page `__. .. code:: bash @@ -222,7 +222,7 @@ In order to use the GPU support, you can either: - Use ``import _gdynet as dy`` instead of ``import dynet as dy`` - Or, (preferred), ``import dynet`` as usual, but use the commandline switch ``--dynet-gpu`` or the GPU switches detailed - `here `__ when invoking the program. This option lets + `here `__ when invoking the program. This option lets the same code work with either the GPU or the CPU version depending on how it is invoked. From 242a0f7724ef678949d7ae21488a922ebc5f6b0e Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 18 Dec 2016 05:34:03 +0900 Subject: [PATCH 909/965] Fixed bug when using Adam w/ status updates --- dynet/training.cc | 7 ++++--- dynet/training.h | 9 ++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/dynet/training.cc b/dynet/training.cc index 5138169de..af779ec36 100644 --- a/dynet/training.cc +++ b/dynet/training.cc @@ -72,6 +72,7 @@ float Trainer::clip_gradients(real scale) { } if (scale * gg > clip_threshold) { ++clips; + ++clips_since_status; gscale = clip_threshold / (scale * gg); } } @@ -106,6 +107,7 @@ void Trainer::update(real scale) { lookup_params[i]->clear(); } ++updates; + ++updates_since_status; model->weight_decay.update_weight_decay(); // update global weight scale if (model->weight_decay.parameters_need_rescaled()) @@ -281,9 +283,8 @@ void AdamTrainer::update_rule_dev(const MyDevice & dev, real scale, real gscale, ts[1]->tvec().device(*dev.edevice) = ts[1]->tvec() * (scale * gscale); ts[2]->tvec().device(*dev.edevice) = ts[2]->tvec() * beta_1 + ts[1]->tvec() * (1.f - beta_1); ts[3]->tvec().device(*dev.edevice) = ts[3]->tvec() * beta_2 + ts[1]->tvec().square() * (1.f - beta_2); - float s1 = 1 - pow(beta_1, updates+1); - float s2 = 1 - pow(beta_2, updates+1); - ts[0]->tvec().device(*dev.edevice) += ts[2]->tvec() / ((ts[3]->tvec() / s2).sqrt() + epsilon) * (-eta / s1 / model->weight_decay.current_weight_decay()); + float lr_t = eta * sqrt(1-pow(beta_2, updates+1))/(1-pow(beta_1, updates+1))/ model->weight_decay.current_weight_decay(); + ts[0]->tvec().device(*dev.edevice) -= ts[2]->tvec() / (ts[3]->tvec().sqrt() + epsilon) * lr_t; } DYNET_TRAINER_INST_DEV_IMPL(AdamTrainer) diff --git a/dynet/training.h b/dynet/training.h index e4fa7cfe3..af4fcf27f 100644 --- a/dynet/training.h +++ b/dynet/training.h @@ -46,7 +46,7 @@ struct Trainer { */ explicit Trainer(Model& m, real e0, real edecay = 0.0) : eta0(e0), eta(e0), eta_decay(edecay), epoch(), clipping_enabled(true), clip_threshold(5), - clips(), updates(), sparse_updates_enabled(true), aux_allocated(false), model(&m) {} + clips(), updates(), clips_since_status(), updates_since_status(), sparse_updates_enabled(true), aux_allocated(false), model(&m) {} virtual ~Trainer(); void update(real scale = 1.0); @@ -76,6 +76,9 @@ struct Trainer { real clip_threshold; real clips; real updates; + // the number of clips and status since the last print + real clips_since_status; + real updates_since_status; /** * \brief Whether to perform sparse updates @@ -93,8 +96,8 @@ struct Trainer { bool aux_allocated; void status() { - std::cerr << "[epoch=" << epoch << " eta=" << eta << " clips=" << clips << " updates=" << updates << "] "; - updates = clips = 0; + std::cerr << "[epoch=" << epoch << " eta=" << eta << " clips=" << clips_since_status << " updates=" << updates_since_status << "] "; + updates_since_status = clips_since_status = 0; } Model* model; // parameters and gradients live here From 447691820eeb716a535c00e527533ff5f59535e7 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 19 Dec 2016 07:27:08 -0500 Subject: [PATCH 910/965] Added info on Anaconda --- doc/source/python.rst | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/doc/source/python.rst b/doc/source/python.rst index 3628e650f..b95acf84e 100644 --- a/doc/source/python.rst +++ b/doc/source/python.rst @@ -170,8 +170,23 @@ then you may need to run the following (and add it to your shell init files): export DYLD_LIBRARY_PATH=/path/to/dynet/build/dynet/:$DYLD_LIBRARY_PATH +Anaconda Support +---------------- + +`Anaconda +`_ is a popular package management system for Python. DyNet can be used from within an Anaconda environment, but be sure to activate the environment + + source activate my_environment_name + +then install some necessary packages as follows: + + conda install gcc cmake boost + +After this, the build process should be the same as normal. + Windows Support ------------------- +--------------- + You can also use Python on Windows by following similar steps to the above. For simplicity, we recommend using a Python distribution that already has Cython installed. The following has been tested to work: @@ -188,7 +203,6 @@ using a Python distribution that already has Cython installed. The following has Note, currently only the Release version works. - GPU/MKL Support --------------- From 3be0ec1cd8c9b89b6167b9cec88cc54f32e5f9da Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 21 Dec 2016 04:44:25 -0500 Subject: [PATCH 911/965] Added cython to anaconda doc --- doc/source/python.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/python.rst b/doc/source/python.rst index b95acf84e..d88309ce8 100644 --- a/doc/source/python.rst +++ b/doc/source/python.rst @@ -180,7 +180,7 @@ Anaconda Support then install some necessary packages as follows: - conda install gcc cmake boost + conda install gcc cmake boost cython After this, the build process should be the same as normal. From c7829b3683b5fbc264d24ec597b8127c41853fa9 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 21 Dec 2016 05:19:13 -0500 Subject: [PATCH 912/965] Basic Python 3 support for Python examples --- examples/python/attention.py | 6 +++--- examples/python/bilstmtagger.py | 6 +++--- examples/python/cpu_vs_gpu.py | 4 ++-- examples/python/minibatch.py | 20 ++++++++++---------- examples/python/rnnlm.py | 10 +++++----- examples/python/rnnlm_transduce.py | 10 +++++----- examples/python/xor.py | 16 ++++++++-------- 7 files changed, 36 insertions(+), 36 deletions(-) diff --git a/examples/python/attention.py b/examples/python/attention.py index 09dd7d452..ec34e26a2 100644 --- a/examples/python/attention.py +++ b/examples/python/attention.py @@ -147,14 +147,14 @@ def get_loss(input_sentence, output_sentence, enc_fwd_lstm, enc_bwd_lstm, dec_ls def train(model, sentence): trainer = pc.SimpleSGDTrainer(model) - for i in xrange(600): + for i in range(600): loss = get_loss(sentence, sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm) loss_value = loss.value() loss.backward() trainer.update() if i % 20 == 0: - print loss_value - print generate(sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm) + print(loss_value) + print(generate(sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm)) train(model, "it is working") diff --git a/examples/python/bilstmtagger.py b/examples/python/bilstmtagger.py index 597a209f4..678446345 100644 --- a/examples/python/bilstmtagger.py +++ b/examples/python/bilstmtagger.py @@ -115,12 +115,12 @@ def tag_sent(sent, builders): tagged = loss = 0 -for ITER in xrange(50): +for ITER in range(50): random.shuffle(train) for i,s in enumerate(train,1): if i % 5000 == 0: sgd.status() - print loss / tagged + print(loss / tagged) loss = 0 tagged = 0 if i % 10000 == 0: @@ -131,7 +131,7 @@ def tag_sent(sent, builders): for go,gu in zip(golds,tags): if go == gu: good +=1 else: bad+=1 - print good/(good+bad) + print(good/(good+bad)) ws = [vw.w2i.get(w, UNK) for w,p in s] ps = [vt.w2i[p] for w,p in s] sum_errs = build_tagging_graph(ws,ps,builders) diff --git a/examples/python/cpu_vs_gpu.py b/examples/python/cpu_vs_gpu.py index 1b2456695..119c45e0e 100644 --- a/examples/python/cpu_vs_gpu.py +++ b/examples/python/cpu_vs_gpu.py @@ -27,11 +27,11 @@ def do_gpu(): import time s = time.time() do_cpu() -print "CPU time:",time.time() - s +print("CPU time:",time.time() - s) s = time.time() do_gpu() -print "GPU time:",time.time() - s +print("GPU time:",time.time() - s) diff --git a/examples/python/minibatch.py b/examples/python/minibatch.py index 6950b91b5..c9e5392dd 100644 --- a/examples/python/minibatch.py +++ b/examples/python/minibatch.py @@ -12,24 +12,24 @@ # batch lookup instead of single elements. # two ways of doing this. abc1 = lookup_batch(lp, [1,2,3]) -print abc1.npvalue() +print(abc1.npvalue()) abc2 = lp.batch([1,2,3]) -print abc2.npvalue() +print(abc2.npvalue()) -print np.hstack([a,b,c]) +print(np.hstack([a,b,c])) # use pick and pickneglogsoftmax in batch mode # (must be used in conjunction with lookup_batch): -print "\nPick" +print("\nPick") W = parameter( m.add_parameters((5, 10)) ) h = W * lp.batch([1,2,3]) -print h.npvalue() -print pick_batch(h,[1,2,3]).npvalue() -print pick(W*lp[1],1).value(), pick(W*lp[2],2).value(), pick(W*lp[3],3).value() +print(h.npvalue()) +print(pick_batch(h,[1,2,3]).npvalue()) +print(pick(W*lp[1],1).value(), pick(W*lp[2],2).value(), pick(W*lp[3],3).value()) # using pickneglogsoftmax_batch -print "\nPick neg log softmax" -print (-log(softmax(h))).npvalue() -print pickneglogsoftmax_batch(h,[1,2,3]).npvalue() +print("\nPick neg log softmax") +print((-log(softmax(h))).npvalue()) +print(pickneglogsoftmax_batch(h,[1,2,3]).npvalue()) diff --git a/examples/python/rnnlm.py b/examples/python/rnnlm.py index 39a778333..eb190be5f 100644 --- a/examples/python/rnnlm.py +++ b/examples/python/rnnlm.py @@ -80,16 +80,16 @@ def sample(self, first=1, nchars=0, stop=-1): train = list(train) chars = loss = 0.0 - for ITER in xrange(100): + for ITER in range(100): random.shuffle(train) for i,sent in enumerate(train): _start = time.time() if i % 50 == 0: sgd.status() - if chars > 0: print loss / chars, - for _ in xrange(1): + if chars > 0: print(loss / chars,) + for _ in range(1): samp = lm.sample(first=vocab.w2i[""],stop=vocab.w2i["\n"]) - print "".join([vocab.i2w[c] for c in samp]).strip() + print("".join([vocab.i2w[c] for c in samp]).strip()) loss = 0.0 chars = 0.0 @@ -100,6 +100,6 @@ def sample(self, first=1, nchars=0, stop=-1): errs.backward() sgd.update(1.0) #print "TM:",(time.time() - _start)/len(sent) - print "ITER",ITER,loss + print("ITER",ITER,loss) sgd.status() sgd.update_epoch(1.0) diff --git a/examples/python/rnnlm_transduce.py b/examples/python/rnnlm_transduce.py index 634d4f5c9..1d094ce4f 100644 --- a/examples/python/rnnlm_transduce.py +++ b/examples/python/rnnlm_transduce.py @@ -80,16 +80,16 @@ def sample(self, first=1, nchars=0, stop=-1): train = list(train) chars = loss = 0.0 - for ITER in xrange(100): + for ITER in range(100): random.shuffle(train) for i,sent in enumerate(train): _start = time.time() if i % 50 == 0: sgd.status() - if chars > 0: print loss / chars, - for _ in xrange(1): + if chars > 0: print(loss / chars,) + for _ in range(1): samp = lm.sample(first=vocab.w2i[""],stop=vocab.w2i["\n"]) - print "".join([vocab.i2w[c] for c in samp]).strip() + print("".join([vocab.i2w[c] for c in samp]).strip()) loss = 0.0 chars = 0.0 @@ -100,6 +100,6 @@ def sample(self, first=1, nchars=0, stop=-1): errs.backward() sgd.update(1.0) #print "TM:",(time.time() - _start)/len(sent) - print "ITER",ITER,loss + print("ITER",ITER,loss) sgd.status() sgd.update_epoch(1.0) diff --git a/examples/python/xor.py b/examples/python/xor.py index cce24ece1..26f8e1aff 100644 --- a/examples/python/xor.py +++ b/examples/python/xor.py @@ -34,9 +34,9 @@ F = -1 -for iter in xrange(ITERATIONS): +for iter in range(ITERATIONS): mloss = 0.0 - for mi in xrange(4): + for mi in range(4): x1 = mi % 2 x2 = (mi / 2) % 2 x.set([T if x1 else F, T if x2 else F]) @@ -46,11 +46,11 @@ sgd.update(1.0) sgd.update_epoch(); mloss /= 4. - print "loss: %0.9f" % mloss + print("loss: %0.9f" % mloss) x.set([F,T]) z = -(-y_pred) -print z.scalar_value() +print(z.scalar_value()) renew_cg() W = parameter(pW) @@ -66,11 +66,11 @@ else: y_pred = (V*h) + a x.set([T,F]) -print "TF",y_pred.scalar_value() +print("TF",y_pred.scalar_value()) x.set([F,F]) -print "FF",y_pred.scalar_value() +print("FF",y_pred.scalar_value()) x.set([T,T]) -print "TT",y_pred.scalar_value() +print("TT",y_pred.scalar_value()) x.set([F,T]) -print "FT",y_pred.scalar_value() +print("FT",y_pred.scalar_value()) From 64be077678ad16e0a185355cab298db24bd23b33 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 21 Dec 2016 06:06:16 -0500 Subject: [PATCH 913/965] Added ability to print text graphviz --- python/_dynet.pyx | 1 + 1 file changed, 1 insertion(+) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index c26397153..b35f17739 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -473,6 +473,7 @@ cdef ComputationGraph _cg = ComputationGraph(SECRET) def cg_version(): return _cg._cg_version def renew_cg(): return _cg.renew() +def print_text_graphviz(): return _cg.print_graphviz() def cg_checkpoint(): _cg.checkpoint() def cg_revert(): _cg.revert() From 162cb9a828e90c03523787bc3247404920aa962f Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 21 Dec 2016 09:01:08 -0500 Subject: [PATCH 914/965] Speed improvements to CPU batched AffineTransform --- dynet/nodes.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/dynet/nodes.cc b/dynet/nodes.cc index 70d9d7d63..ccb0c13ae 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -237,8 +237,17 @@ void AffineTransform::forward_dev_impl(const MyDevice & dev, const vectortvec(); } else { assert(xs[0]->d.bd == 1 && fx.d.bd != 1); +#ifdef __CUDACC__ Eigen::array bcast; bcast[0] = bcast[1] = 1; bcast[2] = fx.d.bd; fx.tb<2>().device(*dev.edevice) = xs[0]->tb<2>().broadcast(bcast); +#else + size_t batch_size = fx.d.batch_size(); + float *curr_ptr = fx.v, *end_ptr = curr_ptr + batch_size * fx.d.bd, *in_ptr = xs[0]->v; + do { + memcpy(curr_ptr, in_ptr, sizeof(float)*batch_size); + curr_ptr += batch_size; + } while(curr_ptr != end_ptr); +#endif } // Perform multiplication @@ -276,8 +285,13 @@ void AffineTransform::backward_dev_impl(const MyDevice & dev, dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); } else { assert(dEdxi.d.bd == 1 && dEdf.d.bd != 1); +#ifdef __CUDACC__ Eigen::array red_axis; red_axis[0] = 2; dEdxi.t<2>().device(*dev.edevice) += dEdf.tb<2>().sum(red_axis); +#else + for(unsigned b = 0; b < dEdf.d.bd; ++b) + (*dEdxi).noalias() += dEdf.batch_matrix(b); +#endif } // Left argument of matrix multiply From b9308e4af080f5b6eaa15db3b20f6578c52d54e4 Mon Sep 17 00:00:00 2001 From: yoavg Date: Wed, 21 Dec 2016 23:55:51 +0200 Subject: [PATCH 915/965] add select_rows, select_cols to python --- python/_dynet.pxd | 2 ++ python/_dynet.pyx | 2 ++ 2 files changed, 4 insertions(+) diff --git a/python/_dynet.pxd b/python/_dynet.pxd index dbbc97628..f66e43fcb 100644 --- a/python/_dynet.pxd +++ b/python/_dynet.pxd @@ -272,6 +272,8 @@ cdef extern from "dynet/expr.h" namespace "dynet::expr": CExpression c_sum_batches "dynet::expr::sum_batches" (CExpression& x) #CExpression c_pick "dynet::expr::pick" (CExpression& x, unsigned v) # + CExpression c_select_rows "dynet::expr::select_rows" (CExpression& x, vector[unsigned] rs) + CExpression c_select_cols "dynet::expr::select_cols" (CExpression& x, vector[unsigned] cs) CExpression c_pick "dynet::expr::pick" (CExpression& x, unsigned* pv) # CExpression c_pick "dynet::expr::pick" (CExpression& x, vector[unsigned]* pv) # CExpression c_pickrange "dynet::expr::pickrange" (CExpression& x, unsigned v, unsigned u) # diff --git a/python/_dynet.pyx b/python/_dynet.pyx index b35f17739..c9eb5d99b 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -934,6 +934,8 @@ cpdef Expression pow(Expression x, Expression y): ensure_freshness(y); return Ex cpdef Expression bmin(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_bmin(x.c(), y.c())) cpdef Expression bmax(Expression x, Expression y): ensure_freshness(y); return Expression.from_cexpr(x.cg_version, c_bmax(x.c(), y.c())) cpdef Expression transpose(Expression x): return Expression.from_cexpr(x.cg_version, c_transpose(x.c())) +cpdef Expression select_rows(Expression x, vector[unsigned] rs): return Expression.from_cexpr(x.cg_version, c_select_rows(x.c(), rs)) +cpdef Expression select_cols(Expression x, vector[unsigned] rs): return Expression.from_cexpr(x.cg_version, c_select_cols(x.c(), rs)) cpdef Expression sum_cols(Expression x): return Expression.from_cexpr(x.cg_version, c_sum_cols(x.c())) cpdef Expression sum_batches(Expression x): return Expression.from_cexpr(x.cg_version, c_sum_batches(x.c())) From 70531f2e47f922033cbeca31885f8a5f4b5aca74 Mon Sep 17 00:00:00 2001 From: Mitchell Stern Date: Thu, 22 Dec 2016 04:20:08 -0800 Subject: [PATCH 916/965] Fixed documentation for logistic function --- dynet/expr.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dynet/expr.h b/dynet/expr.h index aebcb4893..f6e684eb9 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -609,11 +609,11 @@ Expression log(const Expression& x); /** * \ingroup arithmeticoperations * \brief Logistic sigmoid function - * \details Calculate elementwise y_i = 1/(1+e^{x_i}) + * \details Calculate elementwise y_i = 1/(1+e^{-x_i}) * * \param x The input expression * - * \return An expression where the ith element is equal to y_i = 1/(1+e^{x_i}) + * \return An expression where the ith element is equal to y_i = 1/(1+e^{-x_i}) */ Expression logistic(const Expression& x); From b0f2ea6d93f24f5dfc3a74d7cc9792d2e500dd0e Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 22 Dec 2016 07:33:36 -0500 Subject: [PATCH 917/965] Fixed inconsistent initialization in Py and C++ --- python/_dynet.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index b35f17739..34989662d 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -294,7 +294,7 @@ cdef class Model: # {{{ cdef int nids = dim[0] rest = tuple(dim[1:]) if init is None: - init = GlorotInitializer() + init = GlorotInitializer(True) initializer = init.initializer cdef CLookupParameters p = self.thisptr.add_lookup_parameters(nids, Dim(rest), deref(initializer)) cdef LookupParameters pp = LookupParameters.wrap_ptr(p) From 642e7acd22373f090d3756818005a93122aebd65 Mon Sep 17 00:00:00 2001 From: Yannick Versley Date: Thu, 22 Dec 2016 14:53:41 +0100 Subject: [PATCH 918/965] Simplify LogSoftmax (#218) --- dynet/nodes.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dynet/nodes.cc b/dynet/nodes.cc index ccb0c13ae..a18aeb5ea 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -1015,12 +1015,12 @@ void LogSoftmax::backward_dev_impl(const MyDevice & dev, throw std::runtime_error("LogSoftmax::backward not yet implemented for multiple columns"); Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); if(fx.d.bd == 1) { - z.t<0>().device(*dev.edevice) = fx.t<1>().binaryExpr(dEdf.t<1>(), FWeightedError()).sum(); + z.t<0>().device(*dev.edevice) = dEdf.t<1>().sum(); Eigen::array bcast; bcast[0] = fx.d.rows(); dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().exp() * -z.t<1>().broadcast(bcast) + dEdf.t<1>(); } else { Eigen::array red_axis; red_axis[0] = 0; - z.tb<0>().device(*dev.edevice) = (fx.tb<1>().binaryExpr(dEdf.tb<1>(), FWeightedError())).sum(red_axis); + z.tb<0>().device(*dev.edevice) = dEdf.tb<1>().sum(red_axis); Eigen::array bcast; bcast[0] = fx.d.rows(); bcast[1] = 1; dEdxi.tb<1>().device(*dev.edevice) += fx.tb<1>().exp() * -z.tb<1>().broadcast(bcast) + dEdf.tb<1>(); } From 4fbf94452d60f33c5cc76e45790fc1e035f59d18 Mon Sep 17 00:00:00 2001 From: Mitchell Stern Date: Thu, 22 Dec 2016 06:40:20 -0800 Subject: [PATCH 919/965] Python 3 bugfix: builder_layers must be a list, not a zip object (#222) --- python/_dynet.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index 78769e198..923e168a8 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -384,7 +384,7 @@ cdef class Model: # {{{ tp,num = tp.split("~",1) num = int(num) items = [self._load_one(itypes, loader, pfh) for _ in xrange(num)] - return BiRNNBuilder(None, None, None, None, None, zip(items[0::2], items[1::2])) + return BiRNNBuilder(None, None, None, None, None, list(zip(items[0::2], items[1::2]))) elif tp.startswith("user~"): # user defiend type tp,num = tp.split("~",1) From 60cfd801d0e8615df0683cca12acda2e0af9d23c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 22 Dec 2016 11:45:21 -0500 Subject: [PATCH 920/965] Match original TreeLSTM paper name --- dynet/treelstm.cc | 18 +++++++++--------- dynet/treelstm.h | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/dynet/treelstm.cc b/dynet/treelstm.cc index dd7f2cae9..1c6bade2f 100644 --- a/dynet/treelstm.cc +++ b/dynet/treelstm.cc @@ -11,16 +11,16 @@ using namespace dynet; using namespace dynet::expr; BOOST_CLASS_EXPORT_IMPLEMENT(TreeLSTMBuilder) -BOOST_CLASS_EXPORT_IMPLEMENT(SocherTreeLSTMBuilder) +BOOST_CLASS_EXPORT_IMPLEMENT(NaryTreeLSTMBuilder) BOOST_CLASS_EXPORT_IMPLEMENT(UnidirectionalTreeLSTMBuilder) BOOST_CLASS_EXPORT_IMPLEMENT(BidirectionalTreeLSTMBuilder) enum { X2I, BI, X2F, BF, X2O, BO, X2C, BC }; enum { H2I, H2F, H2O, H2C, C2I, C2F, C2O }; // See "Improved Semantic Representations From Tree-Structured Long Short-Term Memory Networks" -// by Tai, Socher, and Manning (2015), section 3.2, for details on this model. +// by Tai, Nary, and Manning (2015), section 3.2, for details on this model. // http://arxiv.org/pdf/1503.00075v3.pdf -SocherTreeLSTMBuilder::SocherTreeLSTMBuilder(unsigned N, +NaryTreeLSTMBuilder::NaryTreeLSTMBuilder(unsigned N, unsigned layers, unsigned input_dim, unsigned hidden_dim, @@ -58,7 +58,7 @@ SocherTreeLSTMBuilder::SocherTreeLSTMBuilder(unsigned N, } // layers } -void SocherTreeLSTMBuilder::new_graph_impl(ComputationGraph& cg) { +void NaryTreeLSTMBuilder::new_graph_impl(ComputationGraph& cg) { this->cg = &cg; param_vars.clear(); lparam_vars.clear(); @@ -100,7 +100,7 @@ void SocherTreeLSTMBuilder::new_graph_impl(ComputationGraph& cg) { } } -Expression SocherTreeLSTMBuilder::Lookup(unsigned layer, unsigned p_type, unsigned value) { +Expression NaryTreeLSTMBuilder::Lookup(unsigned layer, unsigned p_type, unsigned value) { if (lparam_vars[layer][p_type][value].i == 0) { LookupParameter p = lparams[layer][p_type]; lparam_vars[layer][p_type][value] = lookup(*cg, p, value); @@ -110,7 +110,7 @@ Expression SocherTreeLSTMBuilder::Lookup(unsigned layer, unsigned p_type, unsign // layout: 0..layers = c // layers+1..2*layers = h -void SocherTreeLSTMBuilder::start_new_sequence_impl(const vector& hinit) { +void NaryTreeLSTMBuilder::start_new_sequence_impl(const vector& hinit) { h.clear(); c.clear(); if (hinit.size() > 0) { @@ -127,7 +127,7 @@ void SocherTreeLSTMBuilder::start_new_sequence_impl(const vector& hi } } -Expression SocherTreeLSTMBuilder::add_input(int id, vector children, const Expression& x) { +Expression NaryTreeLSTMBuilder::add_input(int id, vector children, const Expression& x) { assert (id >= 0 && h.size() == (unsigned)id); assert (id >= 0 && c.size() == (unsigned)id); h.push_back(vector(layers)); @@ -261,8 +261,8 @@ Expression SocherTreeLSTMBuilder::add_input(int id, vector children, const return ht.back(); } -void SocherTreeLSTMBuilder::copy(const RNNBuilder & rnn) { - const SocherTreeLSTMBuilder & rnn_treelstm = (const SocherTreeLSTMBuilder&)rnn; +void NaryTreeLSTMBuilder::copy(const RNNBuilder & rnn) { + const NaryTreeLSTMBuilder & rnn_treelstm = (const NaryTreeLSTMBuilder&)rnn; assert(params.size() == rnn_treelstm.params.size()); for(size_t i = 0; i < params.size(); ++i) { for(size_t j = 0; j < params[i].size(); ++j) { diff --git a/dynet/treelstm.h b/dynet/treelstm.h index 96f60df42..0b2aba144 100644 --- a/dynet/treelstm.h +++ b/dynet/treelstm.h @@ -35,9 +35,9 @@ struct TreeLSTMBuilder : public RNNBuilder { } }; -struct SocherTreeLSTMBuilder : public TreeLSTMBuilder { - SocherTreeLSTMBuilder() = default; - explicit SocherTreeLSTMBuilder(unsigned N, //Max branching factor +struct NaryTreeLSTMBuilder : public TreeLSTMBuilder { + NaryTreeLSTMBuilder() = default; + explicit NaryTreeLSTMBuilder(unsigned N, //Max branching factor unsigned layers, unsigned input_dim, unsigned hidden_dim, @@ -138,7 +138,7 @@ struct BidirectionalTreeLSTMBuilder : public TreeLSTMBuilder { } // namespace dynet BOOST_CLASS_EXPORT_KEY(dynet::TreeLSTMBuilder) -BOOST_CLASS_EXPORT_KEY(dynet::SocherTreeLSTMBuilder) +BOOST_CLASS_EXPORT_KEY(dynet::NaryTreeLSTMBuilder) BOOST_CLASS_EXPORT_KEY(dynet::UnidirectionalTreeLSTMBuilder) BOOST_CLASS_EXPORT_KEY(dynet::BidirectionalTreeLSTMBuilder) From c03aae67066dfd566ad5429e5feb008037265456 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 22 Dec 2016 14:04:25 -0500 Subject: [PATCH 921/965] Fixed const problem in expressions --- dynet/expr.cc | 4 ++-- dynet/expr.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dynet/expr.cc b/dynet/expr.cc index ff3046899..b9ec56e6b 100644 --- a/dynet/expr.cc +++ b/dynet/expr.cc @@ -107,14 +107,14 @@ Expression fold_rows(const Expression& x, unsigned nrows) { return Expression(x. Expression pick(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } Expression pick(const Expression& x, const vector & v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } -Expression pick(const Expression& x, unsigned* pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } +Expression pick(const Expression& x, const unsigned* pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } Expression pick(const Expression& x, const vector * pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } Expression pickrange(const Expression& x, unsigned v, unsigned u) { return Expression(x.pg, x.pg->add_function({x.i}, v, u)); } Expression pickneglogsoftmax(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } Expression pickneglogsoftmax(const Expression& x, const vector & v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } -Expression pickneglogsoftmax(const Expression& x, unsigned* pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } +Expression pickneglogsoftmax(const Expression& x, const unsigned* pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } Expression pickneglogsoftmax(const Expression& x, const vector * pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } Expression average_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/dynet/expr.h b/dynet/expr.h index f6e684eb9..034d0e7a3 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -822,7 +822,7 @@ Expression pickneglogsoftmax(const Expression& x, unsigned v); * * \return The negative log likelihood of element ``*pv`` after taking the softmax */ -Expression pickneglogsoftmax(const Expression& x, unsigned * pv); +Expression pickneglogsoftmax(const Expression& x, const unsigned * pv); /** * \ingroup lossoperations @@ -1231,7 +1231,7 @@ Expression pick(const Expression& x, const std::vector & v); * * \return The value of x[*pv] */ -Expression pick(const Expression& x, unsigned * pv); +Expression pick(const Expression& x, const unsigned * pv); /** * \ingroup flowoperations From d33f1119d1d26107262959ea27a9cbdc8b94dd77 Mon Sep 17 00:00:00 2001 From: Yannick Versley Date: Fri, 23 Dec 2016 11:48:59 +0100 Subject: [PATCH 922/965] Disable finite-math-only opimizations to avoid nan problems (clab/dynet#220) -Ofast enables -ffinite-math-only, which leads gcc-5 (and some earlier versions such as gcc-4.4) to produce code that produces nans in unexpected places etc. This still leaves active the math options that yield lowered precision (mostly ok for NN code). --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b0ae9005a..386dd4950 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,7 +69,7 @@ endif() if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W1 -DEIGEN_HAS_C99_MATH /MP") # -Wall produces 20k warnings else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -funroll-loops -Wall -Wno-missing-braces -std=c++11 -Ofast -g -march=native") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -funroll-loops -fno-finite-math-only -Wall -Wno-missing-braces -std=c++11 -Ofast -g -march=native") endif() enable_testing() From 5c48097db76efda7bede9050fd397a1d6dac6934 Mon Sep 17 00:00:00 2001 From: Mitchell Stern Date: Sat, 24 Dec 2016 20:51:44 -0800 Subject: [PATCH 923/965] Changed dynet module alias from pc to dy --- examples/python/attention.py | 55 ++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/examples/python/attention.py b/examples/python/attention.py index ec34e26a2..5a458c68c 100644 --- a/examples/python/attention.py +++ b/examples/python/attention.py @@ -1,4 +1,4 @@ -import dynet as pc +import dynet as dy import random EOS = "" @@ -15,12 +15,12 @@ STATE_SIZE = 32 ATTENTION_SIZE = 32 -model = pc.Model() +model = dy.Model() -enc_fwd_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, EMBEDDINGS_SIZE, STATE_SIZE, model) -enc_bwd_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, EMBEDDINGS_SIZE, STATE_SIZE, model) +enc_fwd_lstm = dy.LSTMBuilder(LSTM_NUM_OF_LAYERS, EMBEDDINGS_SIZE, STATE_SIZE, model) +enc_bwd_lstm = dy.LSTMBuilder(LSTM_NUM_OF_LAYERS, EMBEDDINGS_SIZE, STATE_SIZE, model) -dec_lstm = pc.LSTMBuilder(LSTM_NUM_OF_LAYERS, STATE_SIZE*2+EMBEDDINGS_SIZE, STATE_SIZE, model) +dec_lstm = dy.LSTMBuilder(LSTM_NUM_OF_LAYERS, STATE_SIZE*2+EMBEDDINGS_SIZE, STATE_SIZE, model) input_lookup = model.add_lookup_parameters((VOCAB_SIZE, EMBEDDINGS_SIZE)) attention_w1 = model.add_parameters( (ATTENTION_SIZE, STATE_SIZE*2)) @@ -57,7 +57,7 @@ def encode_sentence(enc_fwd_lstm, enc_bwd_lstm, sentence): fwd_vectors = run_lstm(enc_fwd_lstm.initial_state(), sentence) bwd_vectors = run_lstm(enc_bwd_lstm.initial_state(), sentence_rev) bwd_vectors = list(reversed(bwd_vectors)) - vectors = [pc.concatenate(list(p)) for p in zip(fwd_vectors, bwd_vectors)] + vectors = [dy.concatenate(list(p)) for p in zip(fwd_vectors, bwd_vectors)] return vectors @@ -66,17 +66,17 @@ def attend(input_vectors, state): global attention_w1 global attention_w2 global attention_v - w1 = pc.parameter(attention_w1) - w2 = pc.parameter(attention_w2) - v = pc.parameter(attention_v) + w1 = dy.parameter(attention_w1) + w2 = dy.parameter(attention_w2) + v = dy.parameter(attention_v) attention_weights = [] - w2dt = w2*pc.concatenate(list(state.s())) + w2dt = w2*dy.concatenate(list(state.s())) for input_vector in input_vectors: - attention_weight = v*pc.tanh(w1*input_vector + w2dt) + attention_weight = v*dy.tanh(w1*input_vector + w2dt) attention_weights.append(attention_weight) - attention_weights = pc.softmax(pc.concatenate(attention_weights)) - output_vectors = pc.esum([vector*attention_weight for vector, attention_weight in zip(input_vectors, attention_weights)]) + attention_weights = dy.softmax(dy.concatenate(attention_weights)) + output_vectors = dy.esum([vector*attention_weight for vector, attention_weight in zip(input_vectors, attention_weights)]) return output_vectors @@ -84,21 +84,21 @@ def decode(dec_lstm, vectors, output): output = [EOS] + list(output) + [EOS] output = [char2int[c] for c in output] - w = pc.parameter(decoder_w) - b = pc.parameter(decoder_b) + w = dy.parameter(decoder_w) + b = dy.parameter(decoder_b) last_output_embeddings = output_lookup[char2int[EOS]] - s = dec_lstm.initial_state().add_input(pc.concatenate([pc.vecInput(STATE_SIZE*2), last_output_embeddings])) + s = dec_lstm.initial_state().add_input(dy.concatenate([dy.vecInput(STATE_SIZE*2), last_output_embeddings])) loss = [] for char in output: - vector = pc.concatenate([attend(vectors, s), last_output_embeddings]) + vector = dy.concatenate([attend(vectors, s), last_output_embeddings]) s = s.add_input(vector) out_vector = w * s.output() + b - probs = pc.softmax(out_vector) + probs = dy.softmax(out_vector) last_output_embeddings = output_lookup[char] - loss.append(-pc.log(pc.pick(probs, char))) - loss = pc.esum(loss) + loss.append(-dy.log(dy.pick(probs, char))) + loss = dy.esum(loss) return loss @@ -113,20 +113,20 @@ def sample(probs): embedded = embed_sentence(input) encoded = encode_sentence(enc_fwd_lstm, enc_bwd_lstm, embedded) - w = pc.parameter(decoder_w) - b = pc.parameter(decoder_b) + w = dy.parameter(decoder_w) + b = dy.parameter(decoder_b) last_output_embeddings = output_lookup[char2int[EOS]] - s = dec_lstm.initial_state().add_input(pc.concatenate([pc.vecInput(STATE_SIZE * 2), last_output_embeddings])) + s = dec_lstm.initial_state().add_input(dy.concatenate([dy.vecInput(STATE_SIZE * 2), last_output_embeddings])) out = '' count_EOS = 0 for i in range(len(input)*2): if count_EOS == 2: break - vector = pc.concatenate([attend(encoded, s), last_output_embeddings]) + vector = dy.concatenate([attend(encoded, s), last_output_embeddings]) s = s.add_input(vector) out_vector = w * s.output() + b - probs = pc.softmax(out_vector) + probs = dy.softmax(out_vector) probs = probs.vec_value() next_char = sample(probs) last_output_embeddings = output_lookup[next_char] @@ -139,14 +139,14 @@ def sample(probs): def get_loss(input_sentence, output_sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm): - pc.renew_cg() + dy.renew_cg() embedded = embed_sentence(input_sentence) encoded = encode_sentence(enc_fwd_lstm, enc_bwd_lstm, embedded) return decode(dec_lstm, encoded, output_sentence) def train(model, sentence): - trainer = pc.SimpleSGDTrainer(model) + trainer = dy.SimpleSGDTrainer(model) for i in range(600): loss = get_loss(sentence, sentence, enc_fwd_lstm, enc_bwd_lstm, dec_lstm) loss_value = loss.value() @@ -158,4 +158,3 @@ def train(model, sentence): train(model, "it is working") - From 9b3ae8dc775f8b39ae1a96db56f0973f5b32609f Mon Sep 17 00:00:00 2001 From: Mitchell Stern Date: Tue, 27 Dec 2016 10:45:57 -0800 Subject: [PATCH 924/965] Fixed off-by-one error in slice stop index bounds checking (#227) --- python/_dynet.pyx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index 923e168a8..9aab71040 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -656,10 +656,10 @@ cdef class Expression: #{{{ i += rows if index.stop is not None: j = index.stop - if j > rows - 1: - raise IndexError("Stop index too large: %d > %d" % (j, rows - 1)) - if j < -rows: - raise IndexError("Stop index too small: %d < %d" % (j, -rows)) + if j > rows: + raise IndexError("Stop index too large: %d > %d" % (j, rows)) + if j < -rows + 1: + raise IndexError("Stop index too small: %d < %d" % (j, -rows + 1)) if j < 0: j += rows if i >= j: From 6f8b64735a50e6c46668bcbb5ce400d66a5e4a4b Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 28 Dec 2016 09:04:13 -0500 Subject: [PATCH 925/965] Switch for logsumexp on GPU --- dynet/nodes.cc | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/dynet/nodes.cc b/dynet/nodes.cc index a18aeb5ea..c6a7479cd 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -156,17 +156,19 @@ EIGEN_STRONG_INLINE void logsumexp(const MyDevice & dev, const Tensor& x, Tensor } else { Eigen::array red_axis; red_axis[0] = 0; m.tb<0>().device(*dev.edevice) = x.tb<1>().maximum(red_axis); - // TODO: We want to do this in a single command, but this is causing incorrect results. - // Eigen::array bcast({(int)x.d.rows(), 1}); - // z.tb<0>().device(*dev.edevice) = (x.tb<1>() - m.tb<1>().broadcast(bcast)).exp().sum(); - // z.tb<0>().device(*dev.edevice) = z.tb<0>().log() + m.tb<0>(); - // Do the following instead + // TODO: Currently, the first version is slower on CPU, hence the switch +#ifdef __CUDACC__ + Eigen::array bcast({(int)x.d.rows(), 1}); + // This needs to be split into two lines to prevent memory allocation + z.tb<0>().device(*dev.edevice) = (x.tb<1>() - m.tb<1>().broadcast(bcast)).exp().sum(red_axis); + z.tb<0>().device(*dev.edevice) = z.tb<0>().log() + m.tb<0>(); +#else vector mvals = as_vector(m); for(size_t b = 0; b < x.d.bd; b++) { - // This needs to be split into two lines to prevent memory allocation z.tb<0>().chip<0>(b).device(*dev.edevice) = (x.tb<1>().chip<1>(b) - mvals[b]).exp().sum(); z.tb<0>().chip<0>(b).device(*dev.edevice) = z.tb<0>().chip<0>(b).log() + mvals[b]; } +#endif } } From a2d050e757ea53e7c16ff32c2970638dfc9f54e1 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 29 Dec 2016 04:37:32 +0000 Subject: [PATCH 926/965] Better CUDA impl of SumBatches --- dynet/nodes.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dynet/nodes.cc b/dynet/nodes.cc index c6a7479cd..d99bca145 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -1935,11 +1935,11 @@ template void SumBatches::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); unsigned num_args = xs[0]->d.bd; -#if __CUDACC__ - TensorTools::Zero(fx); - for (unsigned i = 0; i < num_args; ++i) - CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, fx.d.size(), kSCALAR_ONE, xs[0]->v + i * xs[0]->d.batch_size(), 1, fx.v, 1)); +#ifdef __CUDACC__ + Eigen::array red_axis; red_axis[0] = 2; + fx.t<2>().device(*dev.edevice) = xs[0]->tb<2>().sum(red_axis); #else + // TODO: Is this CPU version really good? Overhead can probably be reduced. auto res = *fx; const unsigned remainder = num_args % 4; switch (remainder) { @@ -1962,8 +1962,8 @@ void SumBatches::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { assert(i == 0); #if __CUDACC__ - for (unsigned i = 0; i < dEdxi.d.bd; ++i) - CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v + i * dEdxi.d.batch_size(), 1)); + Eigen::array bcast({1, 1, (int)fx.d.bd}); + dEdxi.tb<2>().device(*dev.edevice) += dEdf.tb<2>().broadcast(bcast); #else for (unsigned i = 0; i < dEdxi.d.bd; ++i) dEdxi.batch_matrix(i) += *dEdf; From 34f3d16c5ad3d9a16ff92a994af5f2e8f0142cfc Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Thu, 29 Dec 2016 13:36:06 +0000 Subject: [PATCH 927/965] Efficiency improvement for SimpleRNN --- dynet/rnn.cc | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/dynet/rnn.cc b/dynet/rnn.cc index 84b83373c..5d5aa87e5 100644 --- a/dynet/rnn.cc +++ b/dynet/rnn.cc @@ -112,17 +112,15 @@ Expression SimpleRNNBuilder::add_input_impl(int prev, const Expression &in) { for (unsigned i = 0; i < layers; ++i) { const vector& vars = param_vars[i]; - // y <--- f(x) - Expression y = affine_transform({vars[2], vars[0], x}); - // y <--- g(y_prev) - if (prev == -1 && h0.size() > 0) - y = affine_transform({y, vars[1], h0[i]}); - else if (prev >= 0) - y = affine_transform({y, vars[1], h[prev][i]}); + if(prev >= 0) { + x = h[t][i] = tanh( affine_transform({vars[2], vars[0], x, vars[1], h[prev][i]}) ); + } else if(h0.size() > 0) { + x = h[t][i] = tanh( affine_transform({vars[2], vars[0], x, vars[1], h0[i]}) ); + } else { + x = h[t][i] = tanh( affine_transform({vars[2], vars[0], x}) ); + } - // x <--- tanh(y) - x = h[t][i] = tanh(y); } return h[t].back(); } @@ -137,14 +135,14 @@ Expression SimpleRNNBuilder::add_auxiliary_input(const Expression &in, const Exp const vector& vars = param_vars[i]; assert(vars.size() >= L2H + 1); - Expression y = affine_transform({vars[HB], vars[X2H], x, vars[L2H], aux}); - - if (t == 0 && h0.size() > 0) - y = affine_transform({y, vars[H2H], h0[i]}); - else if (t >= 1) - y = affine_transform({y, vars[H2H], h[t-1][i]}); + if(t > 0) { + x = h[t][i] = tanh( affine_transform({vars[HB], vars[X2H], x, vars[L2H], aux, vars[H2H], h[t-1][i]}) ); + } else if(h0.size() > 0) { + x = h[t][i] = tanh( affine_transform({vars[HB], vars[X2H], x, vars[L2H], aux, vars[H2H], h0[i]}) ); + } else { + x = h[t][i] = tanh( affine_transform({vars[HB], vars[X2H], x, vars[L2H], aux}) ); + } - x = h[t][i] = tanh(y); } return h[t].back(); } From e9cee422dcff69bfcf17544aa1092733cfd36f66 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 30 Dec 2016 01:21:45 +0000 Subject: [PATCH 928/965] Optimization of PickNegLogSoftmax on GPU --- dynet/gpu-ops.cu | 42 ++++++++++++++++++++++++++++++++ dynet/gpu-ops.h | 2 ++ dynet/nodes.cc | 63 +++++++++++++++++++++++++++--------------------- 3 files changed, 79 insertions(+), 28 deletions(-) diff --git a/dynet/gpu-ops.cu b/dynet/gpu-ops.cu index 4cea45192..00dd50c26 100644 --- a/dynet/gpu-ops.cu +++ b/dynet/gpu-ops.cu @@ -27,6 +27,48 @@ void sparse_assign(int n, unsigned int *idx, float *src, float *trg) { } } +// CUDA kernel. Each thread takes care of one element of c +__global__ void ker_sparse_subtract(int n, unsigned int *idx, float *src, float *trg) { + // Get our global thread ID + int id = blockIdx.x*blockDim.x+threadIdx.x; + + // Make sure we do not go out of bounds + if (id < n) + trg[idx[id]] -= src[id]; + + __syncthreads(); +} + +void sparse_subtract(int n, unsigned int *idx, float *src, float *trg) { + if(n > 0) { + auto tb = SizeToBlockThreadPair(n); + int total_size = tb.first*tb.second; + for(int curr_pos = 0; curr_pos < n; curr_pos += total_size) + ker_sparse_subtract<<>>(min(total_size, n-curr_pos), idx+curr_pos, src+curr_pos, trg); + } +} + +// CUDA kernel. Each thread takes care of one element of c +__global__ void ker_sparse_to_dense(int n, unsigned int *idx, float *src, float *trg) { + // Get our global thread ID + int id = blockIdx.x*blockDim.x+threadIdx.x; + + // Make sure we do not go out of bounds + if (id < n) + trg[id] = src[idx[id]]; + + __syncthreads(); +} + +void sparse_to_dense(int n, unsigned int *idx, float *src, float *trg) { + if(n > 0) { + auto tb = SizeToBlockThreadPair(n); + int total_size = tb.first*tb.second; + for(int curr_pos = 0; curr_pos < n; curr_pos += total_size) + ker_sparse_to_dense<<>>(min(total_size, n-curr_pos), idx+curr_pos, src, trg+curr_pos); + } +} + // CUDA kernel. Each thread takes care of one element of c __global__ void ker_const_init(int n, float val, float *trg) { // Get our global thread ID diff --git a/dynet/gpu-ops.h b/dynet/gpu-ops.h index ee1d10ee9..74f3cdec0 100644 --- a/dynet/gpu-ops.h +++ b/dynet/gpu-ops.h @@ -29,6 +29,8 @@ namespace gpu { // void sgd_update(int n, const float* g, float* x, float scale, float lambda); void sparse_assign(int n, unsigned int* ids, float* src, float* trg); +void sparse_subtract(int n, unsigned int* ids, float* src, float* trg); +void sparse_to_dense(int n, unsigned int* ids, float* src, float* trg); void const_init(int n, float val, float* trg); } // namespace gpu diff --git a/dynet/nodes.cc b/dynet/nodes.cc index d99bca145..d2dd0e161 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -8,7 +8,7 @@ #include "dynet/functors.h" #include "dynet/nodes-macros.h" -#ifdef HAVE_CUDA +#ifdef __CUDACC__ #include "dynet/cuda.h" #include "dynet/gpu-ops.h" #endif @@ -109,7 +109,7 @@ size_t LogSoftmax::aux_storage_size() const { } size_t PickNegLogSoftmax::aux_storage_size() const { - return 2 * dim.batch_elems() * sizeof(float); + return 2 * dim.batch_elems() * sizeof(float) + dim.batch_elems() * sizeof(unsigned int); } // this i need to do something better, but this is a work-around @@ -1395,17 +1395,32 @@ void PickNegLogSoftmax::forward_dev_impl(const MyDevice & dev, const vectord.cols() == 1) { Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); Tensor m(Dim({1},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device, DeviceMempool::FXS); - logsumexp(dev, *xs[0], m, z); + unsigned int *ids_dev = (unsigned int*)((float*)aux_mem + 2*fx.d.bd), *ids_host; +#if __CUDACC__ + CUDA_CHECK(cudaMallocHost(&ids_host, fx.d.bd * sizeof(unsigned int))); +#else + ids_host = ids_dev; +#endif if(pval) { - fx.t<0>().device(*dev.edevice) = z.t<0>() - xs[0]->t<1>().chip<0>(*pval); + *ids_host = *pval; } else { assert(pvals); - assert(pvals->size() == fx.d.batch_elems()); - int batch_size = xs[0]->d.batch_size(); - for(unsigned b = 0; b < pvals->size(); ++b) - TensorTools::CopyElement(*xs[0], batch_size * b + (*pvals)[b], fx, b); - fx.tvec().device(*dev.edevice) = z.tvec() - fx.tvec(); + assert(pvals->size() == fx.d.bd); + size_t batch_size = xs[0]->d.batch_size(); + for(unsigned b = 0; b < fx.d.bd; ++b) + ids_host[b] = batch_size * b + (*pvals)[b]; } +#if __CUDACC__ + CUDA_CHECK(cudaMemcpyAsync(ids_dev, ids_host, fx.d.bd * sizeof(unsigned int), cudaMemcpyHostToDevice)); + logsumexp(dev, *xs[0], m, z); + dynet::gpu::sparse_to_dense(fx.d.bd, ids_dev, xs[0]->v, fx.v); + CUDA_CHECK(cudaFreeHost(ids_host)); +#else + logsumexp(dev, *xs[0], m, z); + for(unsigned b = 0; b < fx.d.bd; ++b) + fx.v[b] = xs[0]->v[ids_dev[b]]; +#endif + fx.tvec().device(*dev.edevice) = z.tvec() - fx.tvec(); } else { throw std::runtime_error("PickNegLogSoftmax::forward not yet implemented for multiple columns"); } @@ -1420,26 +1435,18 @@ void PickNegLogSoftmax::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { if (xs[0]->d.cols() == 1) { Tensor z(Dim({1},fx.d.batch_elems()), (float*)aux_mem, fx.device, DeviceMempool::FXS); - if(pval) { - const float err_val = as_scalar(dEdf); - const float logz_val = as_scalar(z); - // logz is computed in the forward pass and cached - dEdxi.t<1>().device(*dev.edevice) += (xs[0]->t<1>() - logz_val).exp() * err_val; - dEdxi.t<1>().chip<0>(*pval).device(*dev.edevice) = dEdxi.t<1>().chip<0>(*pval) - err_val; - } else { - assert(pvals); - assert(pvals->size() == fx.d.batch_elems()); - // TODO: We want to do this, but it's not working - // Eigen::array bcast({(int)fx.d.rows(), 1}); - // dEdxi.tb<1>().device(*dev.edevice) += (xs[0]->tb<1>() - z.tb<1>().broadcast(bcast)).exp() * dEdf.tb<1>().broadcast(bcast); - // So we do this instead: - vector zs = as_vector(z); - vector errs = as_vector(dEdf); - for(unsigned b = 0; b < pvals->size(); ++b) { - dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += (xs[0]->tb<1>().chip<1>(b) - zs[b]).exp() * errs[b]; - dEdxi.tb<1>().chip<1>(b).chip<0>((*pvals)[b]).device(*dev.edevice) = dEdxi.tb<1>().chip<1>(b).chip<0>((*pvals)[b]) - errs[b]; - } + unsigned int *ids_dev = (unsigned int*)((float*)aux_mem + 2*fx.d.bd); +#if __CUDACC__ + Eigen::array bcast({(int)fx.d.rows(), 1}); + dEdxi.tb<1>().device(*dev.edevice) += (xs[0]->tb<1>() - z.tb<1>().broadcast(bcast)).exp() * dEdf.tb<1>().broadcast(bcast); + dynet::gpu::sparse_subtract(fx.d.bd, ids_dev, dEdf.v, dEdxi.v); +#else + // TODO: We want to do broadcasting here too, but it's slow/not working + for(unsigned b = 0; b < fx.d.bd; ++b) { + dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += (xs[0]->tb<1>().chip<1>(b) - z.v[b]).exp() * dEdf.v[b]; + dEdxi.v[ids_dev[b]] -= dEdf.v[b]; } +#endif } else { throw std::runtime_error("PickNegLogSoftmax::backward not yet implemented for multiple columns"); } From d8fe5f697a1a12ee26c6685b781d59c159c18602 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 30 Dec 2016 03:15:08 +0000 Subject: [PATCH 929/965] Regular malloc is faster --- dynet/nodes.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dynet/nodes.cc b/dynet/nodes.cc index d2dd0e161..2e0cb2a7a 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -1397,7 +1397,7 @@ void PickNegLogSoftmax::forward_dev_impl(const MyDevice & dev, const vectorv, fx.v); - CUDA_CHECK(cudaFreeHost(ids_host)); + free(ids_host); #else logsumexp(dev, *xs[0], m, z); for(unsigned b = 0; b < fx.d.bd; ++b) From 0fa9671d25b87ec3d20d564d46e29d6f9690abfd Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 30 Dec 2016 05:17:22 +0000 Subject: [PATCH 930/965] More efficient sum --- dynet/nodes.cc | 42 +++++++++++++++++++++++++----------------- dynet/nodes.h | 3 +-- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/dynet/nodes.cc b/dynet/nodes.cc index 2e0cb2a7a..8d6b94c7b 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -1380,12 +1380,13 @@ void PickElement::backward_dev_impl(const MyDevice & dev, #endif } else { assert(pvals); - for(unsigned b = 0; b < pvals->size(); ++b) + for(unsigned b = 0; b < pvals->size(); ++b) { #ifdef __CUDACC__ CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, 1, kSCALAR_ONE, dEdf.v + b, 1, dEdxi.batch_ptr(b) + (*pvals)[b], 1)); #else dEdxi.batch_matrix(b)((*pvals)[b]) += dEdf.v[b]; #endif + } } } DYNET_NODE_INST_DEV_IMPL(PickElement) @@ -1904,22 +1905,22 @@ void Sum::forward_dev_impl(const MyDevice & dev, const vector& xs fx.v = xs[0]->v; return; } -#if __CUDACC__ TensorTools::Zero(fx); - for (unsigned i = 0; i < num_args; ++i) - CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, fx.d.size(), kSCALAR_ONE, xs[i]->v, 1, fx.v, 1)); +#if __CUDACC__ + Eigen::array bcast({1, 1, (int)fx.d.bd}); +#endif + for (unsigned i = 0; i < num_args; ++i) { + if(xs[i]->d.bd == fx.d.bd) { + fx.tvec().device(*dev.edevice) += xs[i]->tvec(); + } else { +#if __CUDACC__ + fx.tb<2>().device(*dev.edevice) += xs[i]->tb<2>().broadcast(bcast); #else - auto res = fx.vec(); - const unsigned remainder = num_args % 4; - switch (remainder) { - case 0: res.setZero(); break; - case 1: res = xs[0]->vec(); break; - case 2: res = xs[0]->vec() + xs[1]->vec(); break; - case 3: res = xs[0]->vec() + xs[1]->vec() + xs[2]->vec(); break; - } - for (unsigned i = remainder; i < num_args; i += 4) - res += xs[i]->vec() + xs[i+1]->vec() + xs[i+2]->vec() + xs[i+3]->vec(); + for(unsigned b = 0; b < fx.d.bd; ++b) + fx.tb<2>().chip<2>(b).device(*dev.edevice) += xs[i]->t<2>(); #endif + } + } } template @@ -1929,12 +1930,19 @@ void Sum::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - #if __CUDACC__ - CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, fx.d.size(), kSCALAR_ONE, dEdf.v, 1, dEdxi.v, 1)); + Eigen::array bcast({1, 1, (int)fx.d.bd}); +#endif + if(dEdxi.d.bd == fx.d.bd) { + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); + } else { +#if __CUDACC__ + dEdxi.tb<2>().device(*dev.edevice) += dEdf.tb<2>().broadcast(bcast); #else - dEdxi.vec() += dEdf.vec(); + for(unsigned b = 0; b < dEdxi.d.bd; ++b) + dEdxi.tb<2>().chip<2>(b).device(*dev.edevice) += dEdf.t<2>(); #endif + } } DYNET_NODE_INST_DEV_IMPL(Sum) diff --git a/dynet/nodes.h b/dynet/nodes.h index a01211009..4d212960b 100644 --- a/dynet/nodes.h +++ b/dynet/nodes.h @@ -371,8 +371,7 @@ struct LogDet : public Node { struct Sum : public Node { template explicit Sum(const T& a) : Node(a) {} DYNET_NODE_DEFINE_DEV_IMPL() - // TODO: Sum should be be implemented over the entire mini-batch, but this is not - // super-easy in the current implementation + virtual bool supports_multibatch() const override { return true; } }; // y = \sum_i x_i From ba2fd12c521413e4552ca067ca2fca7b05a76736 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 30 Dec 2016 06:36:49 +0000 Subject: [PATCH 931/965] Faster lookup on GPU --- dynet/gpu-ops.cu | 21 +++++++++++++++++++++ dynet/gpu-ops.h | 1 + dynet/param-nodes.cc | 20 ++++++++++---------- dynet/param-nodes.h | 1 + 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/dynet/gpu-ops.cu b/dynet/gpu-ops.cu index 00dd50c26..570699a16 100644 --- a/dynet/gpu-ops.cu +++ b/dynet/gpu-ops.cu @@ -88,5 +88,26 @@ void const_init(int n, float val, float *trg) { ker_const_init<<>>(min(total_size, n-curr_pos), val, trg+curr_pos); } +// CUDA kernel. Each thread takes care of one element of c +__global__ void ker_sparse_lookup(int n, unsigned *idx, int bsize, float mult, float* src, float *trg) { + // Get our global thread ID + int id = blockIdx.x*blockDim.x+threadIdx.x; + + // Make sure we do not go out of bounds + if (id < n*bsize) + trg[id] = src[idx[id/bsize]*bsize+id%bsize] * mult; + + __syncthreads(); +} + +void sparse_lookup(int n, unsigned *idx, int bsize, float mult, float *src, float *trg) { + if(n > 0) { + auto tb = SizeToBlockThreadPair(n*bsize); + int total_size = tb.first*tb.second; + for(int curr_pos = 0; curr_pos < n; curr_pos += total_size/bsize) + ker_sparse_lookup<<>>(min(total_size/bsize, n-curr_pos), idx+curr_pos, bsize, mult, src, trg+curr_pos*bsize); + } +} + } // namespace gpu } // namespace dynet diff --git a/dynet/gpu-ops.h b/dynet/gpu-ops.h index 74f3cdec0..2768c046e 100644 --- a/dynet/gpu-ops.h +++ b/dynet/gpu-ops.h @@ -31,6 +31,7 @@ namespace gpu { void sparse_assign(int n, unsigned int* ids, float* src, float* trg); void sparse_subtract(int n, unsigned int* ids, float* src, float* trg); void sparse_to_dense(int n, unsigned int* ids, float* src, float* trg); +void sparse_lookup(int n, unsigned *idx, int bsize, float mult, float *src, float *trg); void const_init(int n, float val, float* trg); } // namespace gpu diff --git a/dynet/param-nodes.cc b/dynet/param-nodes.cc index 4ef4ea813..f4ffadb94 100644 --- a/dynet/param-nodes.cc +++ b/dynet/param-nodes.cc @@ -78,6 +78,10 @@ Dim ScalarInputNode::dim_forward(const vector& xs) const { return Dim({1}); } +size_t LookupNode::aux_storage_size() const { + return dim.bd * sizeof(unsigned); +} + string LookupNode::as_string(const vector& arg_names) const { ostringstream s; s << "lookup_parameters(|x|=" << params.get()->values.size() << " --> " << dim << ") @ " << params.get(); @@ -234,20 +238,16 @@ void LookupNode::forward_dev_impl(const MyDevice & dev, const vectorsize()); +#if __CUDACC__ + CUDA_CHECK(cudaMemcpyAsync((unsigned*)aux_mem, &(*pindices)[0], fx.d.bd * sizeof(unsigned), cudaMemcpyHostToDevice)); + dynet::gpu::sparse_lookup(fx.d.bd, (unsigned*)aux_mem, fx.d.batch_size(), params.mp->weight_decay.current_weight_decay(), params.get()->all_values.v, fx.v); +#else for (unsigned b = 0; b < pindices->size(); ++b) { unsigned i = pindices->at(b); assert (i < params.get()->values.size()); - float* v = fx.v + fx.d.batch_size() * (b % fx.d.batch_elems()); -#if __CUDACC__ - cudaMemcpyAsync(v, params.get()->values[i].v, fx.d.batch_size() * sizeof(float), cudaMemcpyDeviceToDevice); -#else - // we should use colwise() instead of memcpy to get rid of the - // extra multiply by params.mp->weight_decay.current_weight_decay() - memcpy(v, params.get()->values[i].v, fx.d.batch_size() * sizeof(float)); - -#endif + fx.tb<2>().chip<2>(b).device(*dev.edevice) = params.get()->values[i].tb<2>() * params.mp->weight_decay.current_weight_decay(); } - fx.tvec().device(*dev.edevice) = fx.tvec() * params.mp->weight_decay.current_weight_decay(); +#endif } } diff --git a/dynet/param-nodes.h b/dynet/param-nodes.h index 5fce14d4f..dc04be5dc 100644 --- a/dynet/param-nodes.h +++ b/dynet/param-nodes.h @@ -73,6 +73,7 @@ struct LookupNode : public ParameterNodeBase { LookupNode(LookupParameter p, const std::vector* pindices) : dim(p.get()->dim), index(), pindex(), indices(), pindices(pindices), params(p) { dim.bd = pindices->size(); } DYNET_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } + size_t aux_storage_size() const override; void accumulate_grad(const Tensor& g) override; Dim dim; unsigned index; From 5209cd6d9839b0a2761760b0b31321278cf1bfd8 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 30 Dec 2016 09:20:50 +0000 Subject: [PATCH 932/965] Fixed two bugs --- dynet/nodes.cc | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/dynet/nodes.cc b/dynet/nodes.cc index 8d6b94c7b..4406c1201 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -1438,7 +1438,7 @@ void PickNegLogSoftmax::backward_dev_impl(const MyDevice & dev, Tensor z(Dim({1},fx.d.batch_elems()), (float*)aux_mem, fx.device, DeviceMempool::FXS); unsigned int *ids_dev = (unsigned int*)((float*)aux_mem + 2*fx.d.bd); #if __CUDACC__ - Eigen::array bcast({(int)fx.d.rows(), 1}); + Eigen::array bcast({(int)xs[0]->d[0],1}); dEdxi.tb<1>().device(*dev.edevice) += (xs[0]->tb<1>() - z.tb<1>().broadcast(bcast)).exp() * dEdf.tb<1>().broadcast(bcast); dynet::gpu::sparse_subtract(fx.d.bd, ids_dev, dEdf.v, dEdxi.v); #else @@ -1907,17 +1907,17 @@ void Sum::forward_dev_impl(const MyDevice & dev, const vector& xs } TensorTools::Zero(fx); #if __CUDACC__ - Eigen::array bcast({1, 1, (int)fx.d.bd}); + Eigen::array bcast({1, (int)fx.d.bd}); #endif for (unsigned i = 0; i < num_args; ++i) { if(xs[i]->d.bd == fx.d.bd) { fx.tvec().device(*dev.edevice) += xs[i]->tvec(); } else { #if __CUDACC__ - fx.tb<2>().device(*dev.edevice) += xs[i]->tb<2>().broadcast(bcast); + fx.tbvec().device(*dev.edevice) += xs[i]->tbvec().broadcast(bcast); #else for(unsigned b = 0; b < fx.d.bd; ++b) - fx.tb<2>().chip<2>(b).device(*dev.edevice) += xs[i]->t<2>(); + fx.tbvec().chip<1>(b).device(*dev.edevice) += xs[i]->tvec(); #endif } } @@ -1930,18 +1930,11 @@ void Sum::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { -#if __CUDACC__ - Eigen::array bcast({1, 1, (int)fx.d.bd}); -#endif if(dEdxi.d.bd == fx.d.bd) { dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); } else { -#if __CUDACC__ - dEdxi.tb<2>().device(*dev.edevice) += dEdf.tb<2>().broadcast(bcast); -#else - for(unsigned b = 0; b < dEdxi.d.bd; ++b) - dEdxi.tb<2>().chip<2>(b).device(*dev.edevice) += dEdf.t<2>(); -#endif + Eigen::array red_axis({1}); + dEdxi.tvec().device(*dev.edevice) += dEdf.tbvec().sum(red_axis); } } DYNET_NODE_INST_DEV_IMPL(Sum) From 3b55869ef3137e2bb4f2d0f082c4244c8686e6d0 Mon Sep 17 00:00:00 2001 From: Brad Skaggs Date: Fri, 30 Dec 2016 16:22:57 -0500 Subject: [PATCH 933/965] Fix typo "Charecter" -> "Character" --- examples/python/tutorials/RNNs.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/python/tutorials/RNNs.ipynb b/examples/python/tutorials/RNNs.ipynb index d75599495..454eb1f2f 100644 --- a/examples/python/tutorials/RNNs.ipynb +++ b/examples/python/tutorials/RNNs.ipynb @@ -452,7 +452,7 @@ "collapsed": true }, "source": [ - "### Charecter-level LSTM\n", + "### Character-level LSTM\n", "\n", "Now that we know the basics of RNNs, let's build a character-level LSTM language-model.\n", "We have a sequence LSTM that, at each step, gets as input a character, and needs to predict the next character." From 00d95b0a50f45c253ec7bad6f2cdc6befbe7439b Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Sun, 1 Jan 2017 23:58:16 -0500 Subject: [PATCH 934/965] Fixed bug in params --- dynet/param-nodes.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynet/param-nodes.cc b/dynet/param-nodes.cc index f4ffadb94..455413db6 100644 --- a/dynet/param-nodes.cc +++ b/dynet/param-nodes.cc @@ -245,7 +245,7 @@ void LookupNode::forward_dev_impl(const MyDevice & dev, const vectorsize(); ++b) { unsigned i = pindices->at(b); assert (i < params.get()->values.size()); - fx.tb<2>().chip<2>(b).device(*dev.edevice) = params.get()->values[i].tb<2>() * params.mp->weight_decay.current_weight_decay(); + fx.tb<2>().chip<2>(b).device(*dev.edevice) = params.get()->values[i].t<2>() * params.mp->weight_decay.current_weight_decay(); } #endif } From 7935e794d45607460a4bd5c528f82fd3cf682ce9 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Wed, 4 Jan 2017 08:48:48 -0500 Subject: [PATCH 935/965] Selective pick of VanillaLSTMBuilder --- doc/source/unorthodox.rst | 11 +++ dynet/dim.h | 10 ++ dynet/exec.cc | 12 +-- dynet/expr.cc | 12 ++- dynet/expr.h | 33 ++++--- dynet/gpu-ops.cu | 77 +++++++++------ dynet/gpu-ops.h | 9 +- dynet/lstm.cc | 200 +++++++++++++++++++++++++++++++++++++- dynet/lstm.h | 58 +++++++++++ dynet/model.cc | 45 ++++++++- dynet/model.h | 3 + dynet/nodes-common.cc | 31 ++++-- dynet/nodes-conv.cc | 73 +++++++------- dynet/nodes-conv.h | 9 +- dynet/nodes.cc | 125 ++++++++++++++---------- dynet/nodes.h | 9 +- dynet/param-nodes.cc | 11 +-- dynet/rnn.cc | 6 +- python/_dynet.pxd | 6 ++ python/_dynet.pyx | 19 ++++ python/pybridge.h | 8 ++ tests/test-nodes.cc | 13 +++ 22 files changed, 595 insertions(+), 185 deletions(-) diff --git a/doc/source/unorthodox.rst b/doc/source/unorthodox.rst index fd46666fb..ddc1275eb 100644 --- a/doc/source/unorthodox.rst +++ b/doc/source/unorthodox.rst @@ -55,6 +55,17 @@ input, then DyNet will handle the rest. The programming paradigm is a bit different from other toolkits, and may take a bit of getting used to, but is often more convenient once you're used to it. +LSTM Implementation +------------------- + +The implementation of LSTMs in ``LSTMBuilder`` is not the canonical +implementation, but an implementation using coupled input and forget gates, as +described in "LSTM: A Search Space Odyssey" (https://arxiv.org/abs/1503.04069). +In other words, if the value of the input gate is `i`, the forget gate is `1-i`. +This reduces the number of parameters in the model and speeds training a little, +and in many cases the accuracy is the same or better. If you want to try the +standard version of the LSTM, use the ``VanillaLSTMBuilder`` class. + Dropout Scaling --------------- diff --git a/dynet/dim.h b/dynet/dim.h index 919071760..70362b1b5 100644 --- a/dynet/dim.h +++ b/dynet/dim.h @@ -68,6 +68,16 @@ struct Dim { inline void set(unsigned int i, unsigned int s) { assert(i < nd); assert(s > 0); d[i] = s; } inline unsigned int operator[](unsigned int i) const { return i < nd ? d[i] : 1; } inline unsigned int size(unsigned int i) const { return (*this)[i]; } + inline void delete_dim(unsigned int i) { + assert(i < nd); + if(nd == 1) { + d[0] = 1; + } else { + for(;i+1 < nd; ++i) + d[i] = d[i+1]; + --nd; + } + } inline Dim transpose() const { if (nd == 1) { return Dim({1, d[0]}, bd); } else if (nd == 2) { return Dim({d[1], d[0]}, bd); } diff --git a/dynet/exec.cc b/dynet/exec.cc index ad2ef49d9..2a68d79d5 100644 --- a/dynet/exec.cc +++ b/dynet/exec.cc @@ -67,18 +67,14 @@ const Tensor& SimpleExecutionEngine::incremental_forward(VariableIndex i) { nfxs[num_nodes_evaluated].device = node->device; // Get the memory nfxs[num_nodes_evaluated].v = static_cast(nfxs[num_nodes_evaluated].device->pools[(int)DeviceMempool::FXS]->allocate(node->dim.size() * sizeof(float))); - if (nfxs[num_nodes_evaluated].v == nullptr) { - cerr << "out of memory\n"; - abort(); - } + if (nfxs[num_nodes_evaluated].v == nullptr) + throw std::runtime_error("out of memory"); void* aux_mem = nullptr; size_t aux_size = node->aux_storage_size(); if (aux_size) { aux_mem = nfxs[num_nodes_evaluated].device->pools[(int)DeviceMempool::FXS]->allocate(aux_size); - if (!aux_mem) { - cerr << "aux out of memory\n"; - abort(); - } + if (!aux_mem) + throw std::runtime_error("aux out of memory"); } node->aux_mem = aux_mem; diff --git a/dynet/expr.cc b/dynet/expr.cc index b9ec56e6b..668cd0561 100644 --- a/dynet/expr.cc +++ b/dynet/expr.cc @@ -105,10 +105,10 @@ Expression filter1d_narrow(const Expression& x, const Expression& f) { return Ex Expression kmax_pooling(const Expression& x, unsigned k) { return Expression(x.pg, x.pg->add_function({x.i}, k)); } Expression fold_rows(const Expression& x, unsigned nrows) { return Expression(x.pg, x.pg->add_function({x.i}, nrows)); } -Expression pick(const Expression& x, unsigned v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } -Expression pick(const Expression& x, const vector & v) { return Expression(x.pg, x.pg->add_function({x.i}, v)); } -Expression pick(const Expression& x, const unsigned* pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } -Expression pick(const Expression& x, const vector * pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } +Expression pick(const Expression& x, unsigned v, unsigned d) { return Expression(x.pg, x.pg->add_function({x.i}, v, d)); } +Expression pick(const Expression& x, const vector & v, unsigned d) { return Expression(x.pg, x.pg->add_function({x.i}, v, d)); } +Expression pick(const Expression& x, const unsigned* pv, unsigned d) { return Expression(x.pg, x.pg->add_function({x.i}, pv, d)); } +Expression pick(const Expression& x, const vector * pv, unsigned d) { return Expression(x.pg, x.pg->add_function({x.i}, pv, d)); } Expression pickrange(const Expression& x, unsigned v, unsigned u) { return Expression(x.pg, x.pg->add_function({x.i}, v, u)); } @@ -118,7 +118,9 @@ Expression pickneglogsoftmax(const Expression& x, const unsigned* pv) { return E Expression pickneglogsoftmax(const Expression& x, const vector * pv) { return Expression(x.pg, x.pg->add_function({x.i}, pv)); } Expression average_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } -Expression sum_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } +Expression sum_dim(const Expression& x, unsigned d) { return Expression(x.pg, x.pg->add_function({x.i}, d)); } +Expression sum_rows(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i}, 0)); } +Expression sum_cols(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i}, 1)); } Expression sum_batches(const Expression& x) { return Expression(x.pg, x.pg->add_function({x.i})); } diff --git a/dynet/expr.h b/dynet/expr.h index 034d0e7a3..8083e7949 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -1198,26 +1198,31 @@ Expression sum_batches(const Expression& x); /** * \ingroup flowoperations * \brief Pick element - * \details Pick a single element from an expression. + * \details Pick a single element/row/column/sub-tensor from an expression. + * This will result in the dimension of the tensor being reduced + * by 1. * * \param x The input expression * \param v The index of the element to select + * \param d The dimension along which to choose the element * - * \return The value of x[v] + * \return The value of x[v] along dimension d */ -Expression pick(const Expression& x, unsigned v); +Expression pick(const Expression& x, unsigned v, unsigned d = 0); /** * \ingroup flowoperations - * \brief Pick multiple elements - * \details Pick multiple elements from an input expression + * \brief Batched pick + * \details Pick elements from multiple batches. * * \param x The input expression - * \param v A vector of indicies to choose + * \param v A vector of indicies to choose, one for each batch in the + * input expression. + * \param d The dimension along which to choose the elements * - * \return A vector of values {x[v[0]], x[v[1]], ...} + * \return A mini-batched expression containing the picked elements */ -Expression pick(const Expression& x, const std::vector & v); +Expression pick(const Expression& x, const std::vector & v, unsigned d = 0); /** * \ingroup flowoperations @@ -1228,24 +1233,26 @@ Expression pick(const Expression& x, const std::vector & v); * * \param x The input expression * \param pv Pointer to the index of the element to select + * \param d The dimension along which to choose the elements * * \return The value of x[*pv] */ -Expression pick(const Expression& x, const unsigned * pv); +Expression pick(const Expression& x, const unsigned * pv, unsigned d = 0); /** * \ingroup flowoperations - * \brief Modifiable pick multiple elements + * \brief Modifiable batched pick element * \details Pick multiple elements from an input expression, where the indices * are passed by pointer so we do not need to re-create the computation * graph every time. * * \param x The input expression * \param pv A pointer to vector of indicies to choose + * \param d The dimension along which to choose the elements * - * \return A vector of values {x[(*pv)[0]], x[(*pv)[1]], ...} + * \return A mini-batched expression containing the picked elements */ -Expression pick(const Expression& x, const std::vector * pv); +Expression pick(const Expression& x, const std::vector * pv, unsigned d = 0); /** * \ingroup flowoperations @@ -1348,7 +1355,9 @@ Expression conv1d_wide(const Expression& x, const Expression& f); Expression filter1d_narrow(const Expression& x, const Expression& f); Expression kmax_pooling(const Expression& x, unsigned k); Expression fold_rows(const Expression& x, unsigned nrows=2); +Expression sum_dim(const Expression& x, unsigned d); Expression sum_cols(const Expression& x); +Expression sum_rows(const Expression& x); Expression average_cols(const Expression& x); Expression kmh_ngram(const Expression& x, unsigned n); diff --git a/dynet/gpu-ops.cu b/dynet/gpu-ops.cu index 570699a16..1b37d81b6 100644 --- a/dynet/gpu-ops.cu +++ b/dynet/gpu-ops.cu @@ -7,10 +7,29 @@ namespace dynet { namespace gpu { // CUDA kernel. Each thread takes care of one element of c -__global__ void ker_sparse_assign(int n, unsigned int *idx, float *src, float *trg) { +__global__ void ker_const_init(int n, float val, float *trg) { // Get our global thread ID int id = blockIdx.x*blockDim.x+threadIdx.x; - + + // Make sure we do not go out of bounds + if (id < n) + trg[id] = val; + + __syncthreads(); +} + +void const_init(int n, float val, float *trg) { + auto tb = SizeToBlockThreadPair(n); + int total_size = tb.first*tb.second; + for(int curr_pos = 0; curr_pos < n; curr_pos += total_size) + ker_const_init<<>>(min(total_size, n-curr_pos), val, trg+curr_pos); +} + +// CUDA kernel. Each thread takes care of one element of c +__global__ void ker_dense_to_sparse_assign(int n, const unsigned int *idx, float *src, float *trg) { + // Get our global thread ID + int id = blockIdx.x*blockDim.x+threadIdx.x; + // Make sure we do not go out of bounds if (id < n) trg[idx[id]] = src[id]; @@ -18,94 +37,96 @@ __global__ void ker_sparse_assign(int n, unsigned int *idx, float *src, float *t __syncthreads(); } -void sparse_assign(int n, unsigned int *idx, float *src, float *trg) { +void dense_to_sparse_assign(int n, const unsigned int *idx, float *src, float *trg) { if(n > 0) { auto tb = SizeToBlockThreadPair(n); int total_size = tb.first*tb.second; for(int curr_pos = 0; curr_pos < n; curr_pos += total_size) - ker_sparse_assign<<>>(min(total_size, n-curr_pos), idx+curr_pos, src+curr_pos, trg); + ker_dense_to_sparse_assign<<>>(min(total_size, n-curr_pos), idx+curr_pos, src+curr_pos, trg); } } // CUDA kernel. Each thread takes care of one element of c -__global__ void ker_sparse_subtract(int n, unsigned int *idx, float *src, float *trg) { +__global__ void ker_sparse_to_dense_assign(int n, const unsigned int *idx, float *src, float *trg) { // Get our global thread ID int id = blockIdx.x*blockDim.x+threadIdx.x; - + // Make sure we do not go out of bounds if (id < n) - trg[idx[id]] -= src[id]; + trg[id] = src[idx[id]]; __syncthreads(); } -void sparse_subtract(int n, unsigned int *idx, float *src, float *trg) { +void sparse_to_dense_assign(int n, const unsigned int *idx, float *src, float *trg) { if(n > 0) { auto tb = SizeToBlockThreadPair(n); int total_size = tb.first*tb.second; for(int curr_pos = 0; curr_pos < n; curr_pos += total_size) - ker_sparse_subtract<<>>(min(total_size, n-curr_pos), idx+curr_pos, src+curr_pos, trg); + ker_sparse_to_dense_assign<<>>(min(total_size, n-curr_pos), idx+curr_pos, src, trg+curr_pos); } } // CUDA kernel. Each thread takes care of one element of c -__global__ void ker_sparse_to_dense(int n, unsigned int *idx, float *src, float *trg) { +__global__ void ker_dense_to_sparse_subtract(int n, const unsigned int *idx, float *src, float *trg) { // Get our global thread ID int id = blockIdx.x*blockDim.x+threadIdx.x; - + // Make sure we do not go out of bounds if (id < n) - trg[id] = src[idx[id]]; + atomicAdd(trg + idx[id], -src[id]); __syncthreads(); } -void sparse_to_dense(int n, unsigned int *idx, float *src, float *trg) { +void dense_to_sparse_subtract(int n, const unsigned int *idx, float *src, float *trg) { if(n > 0) { auto tb = SizeToBlockThreadPair(n); int total_size = tb.first*tb.second; for(int curr_pos = 0; curr_pos < n; curr_pos += total_size) - ker_sparse_to_dense<<>>(min(total_size, n-curr_pos), idx+curr_pos, src, trg+curr_pos); + ker_dense_to_sparse_subtract<<>>(min(total_size, n-curr_pos), idx+curr_pos, src+curr_pos, trg); } } // CUDA kernel. Each thread takes care of one element of c -__global__ void ker_const_init(int n, float val, float *trg) { +__global__ void ker_sparse_to_dense_block_assign_and_multiply(int n, const unsigned *idx, int bsize, float mult, float* src, float *trg) { // Get our global thread ID int id = blockIdx.x*blockDim.x+threadIdx.x; - + // Make sure we do not go out of bounds - if (id < n) - trg[id] = val; + if (id < n*bsize) + trg[id] = src[idx[id/bsize]*bsize+id%bsize] * mult; __syncthreads(); } -void const_init(int n, float val, float *trg) { - auto tb = SizeToBlockThreadPair(n); - int total_size = tb.first*tb.second; - for(int curr_pos = 0; curr_pos < n; curr_pos += total_size) - ker_const_init<<>>(min(total_size, n-curr_pos), val, trg+curr_pos); +void sparse_to_dense_block_assign_and_multiply(int n, const unsigned *idx, int bsize, float mult, float *src, float *trg) { + if(n > 0) { + auto tb = SizeToBlockThreadPair(n*bsize); + int total_size = tb.first*tb.second; + for(int curr_pos = 0; curr_pos < n; curr_pos += total_size/bsize) + ker_sparse_to_dense_block_assign_and_multiply<<>>(min(total_size/bsize, n-curr_pos), idx+curr_pos, bsize, mult, src, trg+curr_pos*bsize); + } } // CUDA kernel. Each thread takes care of one element of c -__global__ void ker_sparse_lookup(int n, unsigned *idx, int bsize, float mult, float* src, float *trg) { +__global__ void ker_dense_to_sparse_block_add(int n, const unsigned *idx, int bsize, float* src, float *trg) { // Get our global thread ID int id = blockIdx.x*blockDim.x+threadIdx.x; - + // Make sure we do not go out of bounds if (id < n*bsize) - trg[id] = src[idx[id/bsize]*bsize+id%bsize] * mult; + atomicAdd(trg + idx[id/bsize]*bsize+id%bsize, src[id]); __syncthreads(); } -void sparse_lookup(int n, unsigned *idx, int bsize, float mult, float *src, float *trg) { +void dense_to_sparse_block_add(int n, const unsigned *idx, int bsize, float *src, float *trg) { if(n > 0) { auto tb = SizeToBlockThreadPair(n*bsize); int total_size = tb.first*tb.second; for(int curr_pos = 0; curr_pos < n; curr_pos += total_size/bsize) - ker_sparse_lookup<<>>(min(total_size/bsize, n-curr_pos), idx+curr_pos, bsize, mult, src, trg+curr_pos*bsize); + ker_dense_to_sparse_block_add<<>>(min(total_size/bsize, n-curr_pos), idx+curr_pos, bsize, src+curr_pos*bsize, trg); } } diff --git a/dynet/gpu-ops.h b/dynet/gpu-ops.h index 2768c046e..6f62eb8ec 100644 --- a/dynet/gpu-ops.h +++ b/dynet/gpu-ops.h @@ -28,11 +28,12 @@ namespace gpu { // void pnlsoftmax_backward(int n, int elem_idx, const float* x0, const float* dEdf, const float* logz, float* dEdx); // void sgd_update(int n, const float* g, float* x, float scale, float lambda); -void sparse_assign(int n, unsigned int* ids, float* src, float* trg); -void sparse_subtract(int n, unsigned int* ids, float* src, float* trg); -void sparse_to_dense(int n, unsigned int* ids, float* src, float* trg); -void sparse_lookup(int n, unsigned *idx, int bsize, float mult, float *src, float *trg); void const_init(int n, float val, float* trg); +void dense_to_sparse_assign(int n, const unsigned int* ids, float* src, float* trg); +void sparse_to_dense_assign(int n, const unsigned int* ids, float* src, float* trg); +void dense_to_sparse_subtract(int n, const unsigned int* ids, float* src, float* trg); +void sparse_to_dense_block_assign_and_multiply(int n, const unsigned *idx, int bsize, float mult, float *src, float *trg); +void dense_to_sparse_block_add(int n, const unsigned* ids, int bsize, float* src, float* trg); } // namespace gpu } // namespace dynet diff --git a/dynet/lstm.cc b/dynet/lstm.cc index 5aa817f44..13e93a62a 100644 --- a/dynet/lstm.cc +++ b/dynet/lstm.cc @@ -98,7 +98,7 @@ void LSTMBuilder::start_new_sequence_impl(const vector& hinit) { // TO DO - Make this correct // Copied c from the previous step (otherwise c.size()< h.size()) -// Also is creating a new step something we want? +// Also is creating a new step something we want? // wouldn't overwriting the current one be better? Expression LSTMBuilder::set_h_impl(int prev, const vector& h_new) { if (h_new.size()) { assert(h_new.size() == layers); } @@ -185,7 +185,7 @@ Expression LSTMBuilder::add_input_impl(int prev, const Expression& x) { i_aot = affine_transform({vars[BO], vars[X2O], in, vars[C2O], ct[i]}); Expression i_ot = logistic(i_aot); Expression ph_t = tanh(ct[i]); - in = ht[i] = cmult(i_ot, ph_t); + in = ht[i] = tanh(cmult(i_ot, ph_t)); } if (dropout_rate) return dropout(ht.back(), dropout_rate); else return ht.back(); @@ -248,4 +248,200 @@ void LSTMBuilder::serialize(Archive& ar, const unsigned int) { } DYNET_SERIALIZE_IMPL(LSTMBuilder); +// Vanilla LSTM + +//enum { _X2I, _H2I, _C2I, _BI, _X2F, _H2F, _C2F, _BF, _X2O, _H2O, _C2O, _BO, _X2G, _H2G, _C2G, _BG }; +enum { _X2I, _H2I, _BI, _X2F, _H2F, _BF, _X2O, _H2O, _BO, _X2G, _H2G, _BG }; + +VanillaLSTMBuilder::VanillaLSTMBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model& model) : layers(layers) { + unsigned layer_input_dim = input_dim; + for (unsigned i = 0; i < layers; ++i) { + // i + Parameter p_x2i = model.add_parameters({hidden_dim*4, layer_input_dim}); + Parameter p_h2i = model.add_parameters({hidden_dim*4, hidden_dim}); + //Parameter p_c2i = model.add_parameters({hidden_dim, hidden_dim}); + Parameter p_bi = model.add_parameters({hidden_dim*4}); + + layer_input_dim = hidden_dim; // output (hidden) from 1st layer is input to next + + vector ps = {p_x2i, p_h2i, /*p_c2i,*/ p_bi}; + params.push_back(ps); + } // layers + dropout_rate = 0.f; + hid = hidden_dim; +} + +void VanillaLSTMBuilder::new_graph_impl(ComputationGraph& cg) { + param_vars.clear(); + + for (unsigned i = 0; i < layers; ++i) { + auto& p = params[i]; + vector vars; + for (int j=0; j < p.size(); ++j) { vars.push_back(parameter(cg, p[j])); } + param_vars.push_back(vars); + } +} + +// layout: 0..layers = c +// layers+1..2*layers = h +void VanillaLSTMBuilder::start_new_sequence_impl(const vector& hinit) { + h.clear(); + c.clear(); + if (hinit.size() > 0) { + assert(layers * 2 == hinit.size()); + h0.resize(layers); + c0.resize(layers); + for (unsigned i = 0; i < layers; ++i) { + c0[i] = hinit[i]; + h0[i] = hinit[i + layers]; + } + has_initial_state = true; + } else { + has_initial_state = false; + } +} + +// TODO - Make this correct +// Copied c from the previous step (otherwise c.size()< h.size()) +// Also is creating a new step something we want? +// wouldn't overwriting the current one be better? +Expression VanillaLSTMBuilder::set_h_impl(int prev, const vector& h_new) { + if (h_new.size()) { assert(h_new.size() == layers); } + const unsigned t = h.size(); + h.push_back(vector(layers)); + c.push_back(vector(layers)); + for (unsigned i = 0; i < layers; ++i) { + Expression h_i = h_new[i]; + Expression c_i = c[t - 1][i]; + h[t][i] = h_i; + c[t][i] = c_i; + } + return h[t].back(); +} +// Current implementation : s_new is either {new_c[0],...,new_c[n]} +// or {new_c[0],...,new_c[n],new_h[0],...,new_h[n]} +Expression VanillaLSTMBuilder::set_s_impl(int prev, const std::vector& s_new) { + if (s_new.size()) { assert(s_new.size() == layers || s_new.size() == 2 * layers ); } + bool only_c = s_new.size() == layers; + const unsigned t = c.size(); + h.push_back(vector(layers)); + c.push_back(vector(layers)); + for (unsigned i = 0; i < layers; ++i) { + Expression h_i = only_c ? h[t - 1][i] : s_new[i + layers]; + Expression c_i = s_new[i]; + h[t][i] = h_i; + c[t][i] = c_i; + } + return h[t].back(); +} + +Expression VanillaLSTMBuilder::add_input_impl(int prev, const Expression& x) { + h.push_back(vector(layers)); + c.push_back(vector(layers)); + vector& ht = h.back(); + vector& ct = c.back(); + Expression in = x; + for (unsigned i = 0; i < layers; ++i) { + const vector& vars = param_vars[i]; + Expression i_h_tm1, i_c_tm1; + bool has_prev_state = (prev >= 0 || has_initial_state); + if (prev < 0) { + if (has_initial_state) { + // intial value for h and c at timestep 0 in layer i + // defaults to zero matrix input if not set in add_parameter_edges + i_h_tm1 = h0[i]; + i_c_tm1 = c0[i]; + } + } else { // t > 0 + i_h_tm1 = h[prev][i]; + i_c_tm1 = c[prev][i]; + } + // apply dropout according to http://arxiv.org/pdf/1409.2329v5.pdf + if (dropout_rate) in = dropout(in, dropout_rate); + // input + Expression tmp; + Expression i_ait; + Expression i_aft; + Expression i_aot; + Expression i_agt; + if (has_prev_state) + tmp = affine_transform({vars[_BI], vars[_X2I], in, vars[_H2I], i_h_tm1}); + else + tmp = affine_transform({vars[_BI], vars[_X2I], in}); + i_ait = pickrange(tmp,0,hid); + i_aft = pickrange(tmp,hid,hid*2); + i_aot = pickrange(tmp,hid*2,hid*3); + i_agt = pickrange(tmp,hid*3,hid*4); + Expression i_it = logistic(i_ait); + Expression i_ft = logistic(i_aft); + Expression i_ot = logistic(i_aot); + Expression i_gt = tanh(i_agt); + + ct[i] = has_prev_state ? (cmult(i_ft, i_c_tm1) + cmult(i_it, i_gt)) : cmult(i_it, i_gt); + in = ht[i] = cmult(i_ot, tanh(ct[i])); + } + if (dropout_rate) return dropout(ht.back(), dropout_rate); + else return ht.back(); +} + +void VanillaLSTMBuilder::copy(const RNNBuilder & rnn) { + const LSTMBuilder & rnn_lstm = (const LSTMBuilder&)rnn; + assert(params.size() == rnn_lstm.params.size()); + for (size_t i = 0; i < params.size(); ++i) + for (size_t j = 0; j < params[i].size(); ++j) + params[i][j] = rnn_lstm.params[i][j]; +} + +void VanillaLSTMBuilder::save_parameters_pretraining(const string& fname) const { + cerr << "Writing VanillaLSTM parameters to " << fname << endl; + ofstream of(fname); + assert(of); + boost::archive::binary_oarchive oa(of); + std::string id = "VanillaLSTMBuilder:params"; + oa << id; + oa << layers; + for (unsigned i = 0; i < layers; ++i) { + for (auto p : params[i]) { + oa << p.get()->values; + } + } +} + +void VanillaLSTMBuilder::load_parameters_pretraining(const string& fname) { + cerr << "Loading VanillaLSTM parameters from " << fname << endl; + ifstream of(fname); + assert(of); + boost::archive::binary_iarchive ia(of); + std::string id; + ia >> id; + if (id != "VanillaLSTMBuilder:params") { + cerr << "Bad id read\n"; + abort(); + } + unsigned l = 0; + ia >> l; + if (l != layers) { + cerr << "Bad number of layers\n"; + abort(); + } + // TODO check other dimensions + for (unsigned i = 0; i < layers; ++i) { + for (auto p : params[i]) { + ia >> p.get()->values; + } + } +} + +template +void VanillaLSTMBuilder::serialize(Archive& ar, const unsigned int) { + ar & boost::serialization::base_object(*this); + ar & params; + ar & layers; + ar & dropout_rate; +} +DYNET_SERIALIZE_IMPL(VanillaLSTMBuilder); + } // namespace dynet diff --git a/dynet/lstm.h b/dynet/lstm.h index c280cb931..3791434e9 100644 --- a/dynet/lstm.h +++ b/dynet/lstm.h @@ -68,6 +68,64 @@ struct LSTMBuilder : public RNNBuilder { }; +struct VanillaLSTMBuilder : public RNNBuilder { + VanillaLSTMBuilder() = default; + explicit VanillaLSTMBuilder(unsigned layers, + unsigned input_dim, + unsigned hidden_dim, + Model& model); + + Expression back() const override { return (cur == -1? h0.back() : h[cur].back()); } + std::vector final_h() const override { return (h.size() == 0 ? h0 : h.back()); } + std::vector final_s() const override { + std::vector ret = (c.size() == 0 ? c0 : c.back()); + for(auto my_h : final_h()) ret.push_back(my_h); + return ret; + } + unsigned num_h0_components() const override { return 2 * layers; } + + std::vector get_h(RNNPointer i) const override { return (i == -1 ? h0 : h[i]); } + std::vector get_s(RNNPointer i) const override { + std::vector ret = (i == -1 ? c0 : c[i]); + for(auto my_h : get_h(i)) ret.push_back(my_h); + return ret; + } + + void copy(const RNNBuilder & params) override; + + void save_parameters_pretraining(const std::string& fname) const override; + void load_parameters_pretraining(const std::string& fname) override; + protected: + void new_graph_impl(ComputationGraph& cg) override; + void start_new_sequence_impl(const std::vector& h0) override; + Expression add_input_impl(int prev, const Expression& x) override; + Expression set_h_impl(int prev, const std::vector& h_new) override; + Expression set_s_impl(int prev, const std::vector& s_new) override; + public: + // first index is layer, then ... + std::vector> params; + + // first index is layer, then ... + std::vector> param_vars; + + // first index is time, second is layer + std::vector> h, c; + + // initial values of h and c at each layer + // - both default to zero matrix input + bool has_initial_state; // if this is false, treat h0 and c0 as 0 + std::vector h0; + std::vector c0; + unsigned layers; + unsigned hid; + +private: + friend class boost::serialization::access; + template + void serialize(Archive& ar, const unsigned int); + +}; + } // namespace dynet #endif diff --git a/dynet/model.cc b/dynet/model.cc index a3363aed2..83b81513d 100644 --- a/dynet/model.cc +++ b/dynet/model.cc @@ -18,6 +18,8 @@ #include #include #include +#else +#include "dynet/gpu-ops.h" #endif // Macros for defining functions over parameters @@ -156,8 +158,13 @@ void LookupParameterStorage::copy(const LookupParameterStorage& param) { } void LookupParameterStorage::clear() { - for (auto i : non_zero_grads) - TensorTools::Zero(grads[i]); + // TODO: this is hacky, probably need a better heuristic + if(all_grads.device->type == DeviceType::GPU) { + TensorTools::Zero(all_grads); + } else { + for (auto i : non_zero_grads) + TensorTools::Zero(grads[i]); + } non_zero_grads.clear(); } @@ -575,6 +582,40 @@ void LookupParameterStorage::accumulate_grad_dev(MyDevice & dev, unsigned index, } #endif +template +void LookupParameterStorage::accumulate_grads_dev(MyDevice & dev, unsigned n, const unsigned* ids_host, const unsigned* ids_dev, float* g) { +#ifdef __CUDACC__ + for(unsigned i = 0; i < n; ++i) + non_zero_grads.insert(ids_host[i]); + dynet::gpu::dense_to_sparse_block_add(n, ids_dev, dim.size(), g, all_grads.v); +#else + size_t gsize = dim.size(); + Tensor gt(dim, g, all_grads.device, all_grads.mem_pool); + for(unsigned i = 0; i < n; ++i) { + non_zero_grads.insert(ids_host[i]); + grads[ids_host[i]].tvec().device(*dev.edevice) += gt.tvec(); + gt.v += gsize; + } +#endif +} +#ifdef __CUDACC__ + template void LookupParameterStorage::accumulate_grads_dev(Device_GPU & dev, unsigned n, const unsigned* ids_host, const unsigned* ids_dev, float* g); +#elif defined(HAVE_CUDA) + extern template void LookupParameterStorage::accumulate_grads_dev(Device_GPU & dev, unsigned n, const unsigned* ids_host, const unsigned* ids_dev, float* g); + template void LookupParameterStorage::accumulate_grads_dev(Device_CPU & dev, unsigned n, const unsigned* ids_host, const unsigned* ids_dev, float* g); + void LookupParameterStorage::accumulate_grads(unsigned n, const unsigned* ids_host, const unsigned* ids_dev, float* g) { + if(all_values.device->type == DeviceType::CPU) { accumulate_grads_dev(*(Device_CPU*)all_values.device,n,ids_host,ids_dev,g); } + else if(all_values.device->type == DeviceType::GPU) { accumulate_grads_dev(*(Device_GPU*)all_values.device,n,ids_host,ids_dev,g); } + else { abort(); } + } +#else + template void LookupParameterStorage::accumulate_grads_dev(Device_CPU & dev, unsigned n, const unsigned* ids_host, const unsigned* ids_dev, float* g); + void LookupParameterStorage::accumulate_grads(unsigned n, const unsigned* ids_host, const unsigned* ids_dev, float* g) { + if(all_values.device->type == DeviceType::CPU) { accumulate_grads_dev(*(Device_CPU*)all_values.device,n,ids_host,ids_dev,g); } + else { abort(); } + } +#endif + template void LookupParameterStorage::scale_parameters_dev(MyDevice & dev, float a) { all_values.tvec().device(*dev.edevice) = all_values.tvec() * a; diff --git a/dynet/model.h b/dynet/model.h index cf98e7146..8d75441c2 100644 --- a/dynet/model.h +++ b/dynet/model.h @@ -91,6 +91,9 @@ struct LookupParameterStorage : public ParameterStorageBase { template void accumulate_grad_dev(MyDevice & dev, unsigned index, const Tensor& g); void accumulate_grad(unsigned index, const Tensor& g); + template + void accumulate_grads_dev(MyDevice & dev, unsigned n, const unsigned* ids_host, const unsigned* ids_dev, float* g); + void accumulate_grads(unsigned n, const unsigned* ids_host, const unsigned* ids_dev, float* g); void clear(); // Initialize each individual lookup from the overall tensors diff --git a/dynet/nodes-common.cc b/dynet/nodes-common.cc index d27fb5086..4344db220 100644 --- a/dynet/nodes-common.cc +++ b/dynet/nodes-common.cc @@ -636,7 +636,7 @@ string PickElement::as_string(const vector& arg_names) const { ostringstream s; s << "pick(" << arg_names[0] << ','; if(pval) { - s << *pval << ')'; + s << *pval; } else { assert(pvals); s << '['; @@ -645,18 +645,23 @@ string PickElement::as_string(const vector& arg_names) const { for(size_t i = 1; i < pvals->size(); ++i) s << ',' << (*pvals)[i]; } - s << "])"; + s << "]"; } + s << ", " << dimension << ")"; return s.str(); } Dim PickElement::dim_forward(const vector& xs) const { assert(xs.size() == 1); - if (!LooksLikeVector(xs[0])) { - ostringstream s; s << "Bad input dimensions in PickElement: " << xs; + if(dimension >= xs[0].nd) { + ostringstream s; s << "Tried to PickElement on dimension " << dimension << " bigger than input " << xs[0]; throw std::invalid_argument(s.str()); } - return Dim({1}, xs[0].bd); + if(xs[0].nd >= 4) + throw std::invalid_argument("PickElement not currently supported for tensors of 4 or more dimensions."); + Dim ret(xs[0]); + ret.delete_dim(dimension); + return ret; } // x_1 is a vector @@ -670,7 +675,7 @@ string PickRange::as_string(const vector& arg_names) const { Dim PickRange::dim_forward(const vector& xs) const { assert(xs.size() == 1); if (!LooksLikeVector(xs[0])) { - ostringstream s; s << "Bad input dimensions in PickElement: " << xs; + ostringstream s; s << "Bad input dimensions in PickRange: " << xs; throw std::invalid_argument(s.str()); } assert(end <= xs[0][0]); @@ -756,11 +761,17 @@ Dim AffineTransform::dim_forward(const vector& xs) const { ostringstream s; s << "Bad number of inputs in AffineTransform: " << xs; throw std::invalid_argument(s.str()); } - Dim d = xs[0]; - for (unsigned i = 1; i < xs.size(); i += 2) { + if(xs.size() == 1) return xs[0]; + if (xs[0].rows() != xs[1].rows() || + xs[1].cols() != xs[2].rows()) { + ostringstream s; s << "Bad dimensions for AffineTransform: " << xs; + throw std::invalid_argument(s.str()); + } + Dim d({xs[0].rows(), xs[2].cols()}, max(max(xs[0].bd, xs[1].bd), xs[2].bd)); + for (unsigned i = 3; i < xs.size(); i += 2) { if (xs[i].cols() != xs[i+1].rows() || - xs[0].rows() != xs[i].rows() || - xs[0].cols() != xs[i+1].cols()) { + d.rows() != xs[i].rows() || + d.cols() != xs[i+1].cols()) { ostringstream s; s << "Bad dimensions for AffineTransform: " << xs; throw std::invalid_argument(s.str()); } diff --git a/dynet/nodes-conv.cc b/dynet/nodes-conv.cc index ca51dbf64..9d0726325 100644 --- a/dynet/nodes-conv.cc +++ b/dynet/nodes-conv.cc @@ -41,8 +41,8 @@ string FoldRows::as_string(const vector& arg_names) const { Dim FoldRows::dim_forward(const vector& xs) const { unsigned orows = xs[0].rows() / nrows; if ((orows * nrows != xs[0].rows()) || xs.size() != 1 || xs[0].ndims() > 2) { - cerr << "Bad input dimensions in FoldRows: " << xs << endl; - throw std::invalid_argument("bad input dimensions in FoldRows"); + ostringstream s; s << "Bad input dimensions in FoldRows: " << xs; + throw std::invalid_argument(s.str()); } return Dim({orows, xs[0].cols()}); } @@ -55,15 +55,15 @@ string Conv1DNarrow::as_string(const vector& arg_names) const { Dim Conv1DNarrow::dim_forward(const vector& xs) const { if (xs.size() != 2) { - cerr << "Conv1DNarrow requires two inputs: " << xs << endl; - throw std::invalid_argument("Conv1DNarrow requires 2 dimensions"); + ostringstream s; s << "Conv1DNarrow requires two inputs: " << xs; + throw std::invalid_argument(s.str()); } int ocols = xs[0].cols() - xs[1].cols() + 1; if (xs[0].ndims() != 2 || xs[1].ndims() != 2 || xs[0].rows() != xs[1].rows() || ocols < 1) { - cerr << "Bad input dimensions in Conv1DNarrow: " << xs << endl; - throw std::invalid_argument("bad input dimensions in Conv1DNarrow"); + ostringstream s; s << "Bad input dimensions in Conv1DNarrow: " << xs; + throw std::invalid_argument(s.str()); } return Dim({xs[0].rows(), (unsigned)ocols}); } @@ -76,14 +76,14 @@ string Conv1DWide::as_string(const vector& arg_names) const { Dim Conv1DWide::dim_forward(const vector& xs) const { if (xs.size() != 2) { - cerr << "Conv1DWide requires two inputs: " << xs << endl; - throw std::invalid_argument("Conv1DWide requires two inputs"); + ostringstream s; s << "Conv1DWide requires two inputs: " << xs; + throw std::invalid_argument(s.str()); } unsigned ocols = xs[0].cols() + xs[1].cols() - 1; if (xs[0].ndims() != 2 || xs[1].ndims() != 2 || xs[0].rows() != xs[1].rows()) { - cerr << "Bad input dimensions in Conv1DWide: " << xs << endl; - throw std::invalid_argument("bad input dimensions in Conv1DWide"); + ostringstream s; s << "Bad input dimensions in Conv1DWide: " << xs; + throw std::invalid_argument(s.str()); } return Dim({xs[0].rows(), ocols}); } @@ -96,15 +96,15 @@ string Filter1DNarrow::as_string(const vector& arg_names) const { Dim Filter1DNarrow::dim_forward(const vector& xs) const { if (xs.size() != 2) { - cerr << "Filter1DNarrow requires two inputs: " << xs << endl; - throw std::invalid_argument("Filter1DNarrow requires 2 dimensions"); + ostringstream s; s << "Filter1DNarrow requires two inputs: " << xs; + throw std::invalid_argument(s.str()); } int ocols = xs[0].cols() - xs[1].cols() + 1; if (xs[0].ndims() != 2 || xs[1].ndims() < 2 || xs[0].rows() != xs[1].rows() || ocols < 1) { - cerr << "Bad input dimensions in Filter1DNarrow: " << xs << endl; - throw std::invalid_argument("bad input dimensions in Filter1DNarrow"); + ostringstream s; s << "Bad input dimensions in Filter1DNarrow: " << xs; + throw std::invalid_argument(s.str()); } const unsigned fids = (xs[1].ndims() > 2 ? xs[1][2] : 1); return Dim({fids, (unsigned)ocols}); @@ -118,12 +118,12 @@ string KMaxPooling::as_string(const vector& arg_names) const { Dim KMaxPooling::dim_forward(const vector& xs) const { if (k < 1) { - cerr << "Bad bad k in KMaxPooling: " << k << endl; - throw std::invalid_argument("bad k in KMaxPooling"); + ostringstream s; s << "Bad bad k in KMaxPooling: " << k; + throw std::invalid_argument(s.str()); } if (xs[0].ndims() != 2 || (xs[0].cols() < k)) { - cerr << "Bad input dimensions in KMaxPooling: " << xs << endl; - throw std::invalid_argument("bad input dimensions in KMaxPooling"); + ostringstream s; s << "Bad input dimensions in KMaxPooling: " << xs; + throw std::invalid_argument(s.str()); } return Dim({xs[0].rows(), k}); } @@ -133,18 +133,17 @@ size_t KMaxPooling::aux_storage_size() const { return sizeof(Eigen::DenseIndex) * dim.size(); } -string SumColumns::as_string(const vector& arg_names) const { +string SumDimension::as_string(const vector& arg_names) const { ostringstream s; - s << "sum_cols(matrix=" << arg_names[0]; - if (arg_names.size() == 2) s << ", col_weighting=" << arg_names[1]; - s << ')'; + s << "sum_dim(matrix=" << arg_names[0] << ',' << dimension << '}'; return s.str(); } -Dim SumColumns::dim_forward(const vector& xs) const { - assert(xs.size() == 1 || xs.size() == 2); - int bd = (xs.size() == 1 ? xs[0].bd : max(xs[0].bd, xs[1].bd)); - return Dim({xs[0].rows()}, bd); +Dim SumDimension::dim_forward(const vector& xs) const { + assert(xs.size() == 1); + Dim ret(xs[0]); + ret.delete_dim(dimension); + return ret; } #endif @@ -408,30 +407,24 @@ void KMaxPooling::backward_dev_impl(const MyDevice & dev, DYNET_NODE_INST_DEV_IMPL(KMaxPooling) template -void SumColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { +void SumDimension::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); -#ifdef __CUDACC__ - // The reduction used on CPU is better, but not implemented in GPU - unsigned cols = xs[0]->d.cols(); - fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().chip<1>(0); - for(unsigned i = 1; i < cols; ++i) - fx.t<1>().device(*dev.edevice) += xs[0]->t<2>().chip<1>(i); -#else - const Eigen::array reduction_axis = {1}; + Eigen::array reduction_axis({(int)dimension}); fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().sum(reduction_axis); -#endif } template -void SumColumns::backward_dev_impl(const MyDevice & dev, +void SumDimension::backward_dev_impl(const MyDevice & dev, const vector& xs, const Tensor& fx, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - const Eigen::array broadcasts = {1, xs[0]->d[1]}; - dEdxi.t<2>().device(*dev.edevice) += dEdf.t<2>().broadcast(broadcasts); + // TODO: limit to 3-dimensional tensor is arbitrary + Eigen::array bcast({1,1,1,1}); bcast[dimension] = dEdxi.d[dimension]; + Eigen::array morph({(int)dEdxi.d[0],(int)dEdxi.d[1],(int)dEdxi.d[2],(int)dEdxi.d.bd}); morph[dimension] = 1; + dEdxi.tb<3>().device(*dev.edevice) += dEdf.tb<3>().reshape(morph).broadcast(bcast); } -DYNET_NODE_INST_DEV_IMPL(SumColumns) +DYNET_NODE_INST_DEV_IMPL(SumDimension) } // namespace dynet diff --git a/dynet/nodes-conv.h b/dynet/nodes-conv.h index 6277d8aeb..47942e53b 100644 --- a/dynet/nodes-conv.h +++ b/dynet/nodes-conv.h @@ -50,12 +50,11 @@ struct KMaxPooling : public Node { unsigned k; }; -// with a single argument x \in R^{n x m} -// y_i = \sum_j x_i,j -// if you want to reweight the columns and then sum them, use MatrixMultiply -struct SumColumns : public Node { - template explicit SumColumns(const T& a) : Node(a) {} +// sum along a single dimension +struct SumDimension : public Node { + template explicit SumDimension(const T& a, unsigned d) : Node(a), dimension(d) {} DYNET_NODE_DEFINE_DEV_IMPL() + unsigned dimension; }; } // namespace dynet diff --git a/dynet/nodes.cc b/dynet/nodes.cc index 4406c1201..d7285523e 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -15,6 +15,16 @@ using namespace std; +inline string print_vec(const std::vector & vec) { + string sep = "["; + ostringstream oss; + for(auto f : vec) { + oss << sep << f; sep = ","; + } + oss << "]"; + return oss.str(); +} + // notes on implementing differentiable components // 1) fx can be understood as a pointer to the (preallocated) location for the result // of forward to be stored @@ -146,8 +156,7 @@ size_t SparsemaxLoss::aux_storage_size() const { template EIGEN_STRONG_INLINE void logsumexp(const MyDevice & dev, const Tensor& x, Tensor & m, Tensor& z) { - - if(x.d.bd == 1) { + if(x.d.bd == 1 && x.d[1] == 1) { m.t<0>().device(*dev.edevice) = x.t<1>().maximum(); float mval = as_scalar(m); // This needs to be split into two lines to prevent memory allocation @@ -155,18 +164,21 @@ EIGEN_STRONG_INLINE void logsumexp(const MyDevice & dev, const Tensor& x, Tensor z.t<0>().device(*dev.edevice) = z.t<0>().log() + mval; } else { Eigen::array red_axis; red_axis[0] = 0; - m.tb<0>().device(*dev.edevice) = x.tb<1>().maximum(red_axis); + m.tb<1>().device(*dev.edevice) = x.tb<2>().maximum(red_axis); // TODO: Currently, the first version is slower on CPU, hence the switch #ifdef __CUDACC__ - Eigen::array bcast({(int)x.d.rows(), 1}); + Eigen::array bcast({(int)x.d.rows(), 1, 1}); + Eigen::array morph({1, (int)m.d[0], (int)m.d.bd}); // This needs to be split into two lines to prevent memory allocation - z.tb<0>().device(*dev.edevice) = (x.tb<1>() - m.tb<1>().broadcast(bcast)).exp().sum(red_axis); - z.tb<0>().device(*dev.edevice) = z.tb<0>().log() + m.tb<0>(); + z.tb<1>().device(*dev.edevice) = (x.tb<2>() - m.tb<2>().reshape(morph).broadcast(bcast)).exp().sum(red_axis); + z.tb<1>().device(*dev.edevice) = z.tb<1>().log() + m.tb<1>(); #else - vector mvals = as_vector(m); - for(size_t b = 0; b < x.d.bd; b++) { - z.tb<0>().chip<0>(b).device(*dev.edevice) = (x.tb<1>().chip<1>(b) - mvals[b]).exp().sum(); - z.tb<0>().chip<0>(b).device(*dev.edevice) = z.tb<0>().chip<0>(b).log() + mvals[b]; + auto miter = m.v; + for(size_t b = 0; b < x.d.bd; ++b) { + for(size_t i = 0; i < x.d[1]; ++i, ++miter) { + z.tb<1>().chip<1>(b).chip<0>(i).device(*dev.edevice) = (x.tb<2>().chip<2>(b).chip<1>(i) - *miter).exp().sum(); + z.tb<1>().chip<1>(b).chip<0>(i).device(*dev.edevice) = z.tb<1>().chip<1>(b).chip<0>(i).log() + *miter; + } } #endif } @@ -235,19 +247,20 @@ void AffineTransform::forward_dev_impl(const MyDevice & dev, const vectord.bd) { + size_t b_size = xs[0]->d.size(), fx_size = fx.d.size(); + if(fx_size == b_size) { fx.tvec().device(*dev.edevice) = xs[0]->tvec(); } else { - assert(xs[0]->d.bd == 1 && fx.d.bd != 1); #ifdef __CUDACC__ - Eigen::array bcast; bcast[0] = bcast[1] = 1; bcast[2] = fx.d.bd; + Eigen::array bcast; bcast[0] = 1; bcast[1] = fx.d[1]/xs[0]->d[1]; bcast[2] = fx.d.bd/xs[0]->d.bd; fx.tb<2>().device(*dev.edevice) = xs[0]->tb<2>().broadcast(bcast); #else - size_t batch_size = fx.d.batch_size(); - float *curr_ptr = fx.v, *end_ptr = curr_ptr + batch_size * fx.d.bd, *in_ptr = xs[0]->v; + if(xs[0]->d.bd != 1) + throw std::invalid_argument("In AffineTransform, broadcasting over columns with mini-batched inputs is not implemented yet"); + float *curr_ptr = fx.v, *end_ptr = curr_ptr + fx.d.size(), *in_ptr = xs[0]->v; do { - memcpy(curr_ptr, in_ptr, sizeof(float)*batch_size); - curr_ptr += batch_size; + memcpy(curr_ptr, in_ptr, sizeof(float)*b_size); + curr_ptr += b_size; } while(curr_ptr != end_ptr); #endif } @@ -283,16 +296,32 @@ void AffineTransform::backward_dev_impl(const MyDevice & dev, assert(i < xs.size()); // Bias term if (i == 0) { // bias term - if(dEdxi.d.bd == dEdf.d.bd) { + size_t dx_size = dEdxi.d.size(), df_size = dEdf.d.size(); + if(dx_size == df_size) { dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); } else { - assert(dEdxi.d.bd == 1 && dEdf.d.bd != 1); + if(dEdxi.d.bd != 1) + throw std::invalid_argument("In AffineTransform, broadcasting over columns with mini-batched inputs is not implemented yet"); #ifdef __CUDACC__ - Eigen::array red_axis; red_axis[0] = 2; - dEdxi.t<2>().device(*dev.edevice) += dEdf.tb<2>().sum(red_axis); + if(dEdxi.d[1] == dEdf.d[1]) { + Eigen::array red_axis; red_axis[0] = 2; + dEdxi.t<2>().device(*dev.edevice) += dEdf.tb<2>().sum(red_axis); + } else { + Eigen::array red_axis; red_axis[0] = 1; red_axis[1] = 2; + dEdxi.t<1>().device(*dev.edevice) += dEdf.tb<2>().sum(red_axis); + } #else - for(unsigned b = 0; b < dEdf.d.bd; ++b) - (*dEdxi).noalias() += dEdf.batch_matrix(b); + if(dEdxi.d[1] == dEdf.d[1]) { + for(unsigned b = 0; b < dEdf.d.bd; ++b) + (*dEdxi).noalias() += dEdf.batch_matrix(b); + } else { + Tensor mychip(dEdxi.d, dEdf.v, dEdf.device, dEdf.mem_pool); + size_t len = dEdf.d.bd * dEdf.d[1]; + for(unsigned b = 0; b < len; ++b) { + (*dEdxi).noalias() += *mychip; + mychip.v += dx_size; + } + } #endif } @@ -1342,23 +1371,24 @@ DYNET_NODE_INST_DEV_IMPL(PairwiseRankLoss) template void PickElement::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { if(pval) { - if (*pval >= xs[0]->d.rows()) { - cerr << "PickElement::forward_impl requested element " << *pval - << " from a vector of length " << xs[0]->d.rows() << endl; - abort(); + if (*pval >= xs[0]->d[dimension]) { + ostringstream s; s << "PickElement::forward_impl requested element " << *pval + << " from a dimension of length " << xs[0]->d[dimension] << endl; + throw std::invalid_argument(s.str()); } - TensorTools::CopyElement(*xs[0], *pval, fx, 0); + // TODO: This limit of up to 3 is somewhat arbitrary. We need to decide how to handle + // things with "maximum tensor size". + fx.tb<2>().device(*dev.edevice) = xs[0]->tb<3>().chip(*pval, dimension); } else { assert(pvals); assert(pvals->size() == fx.d.batch_elems()); - int batch_size = xs[0]->d.batch_size(); for(unsigned b = 0; b < pvals->size(); ++b) { - if ((*pvals)[b] >= xs[0]->d.rows()) { - cerr << "PickElement::forward_impl requested element " << (*pvals)[b] - << " from a vector of length " << xs[0]->d.rows() << endl; - abort(); + if ((*pvals)[b] >= xs[0]->d[dimension]) { + ostringstream s; s << "PickElement::forward_impl requested element " << (*pvals)[b] + << " from a dimension of length " << xs[0]->d[dimension] << endl; + throw std::invalid_argument(s.str()); } - TensorTools::CopyElement(*xs[0], b*batch_size + (*pvals)[b], fx, b); + fx.tb<2>().chip<2>(b).device(*dev.edevice) = xs[0]->tb<3>().chip<3>(b).chip((*pvals)[b], dimension); } } } @@ -1373,20 +1403,11 @@ void PickElement::backward_dev_impl(const MyDevice & dev, Tensor& dEdxi) const { assert(i == 0); if(pval) { -#ifdef __CUDACC__ - CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, 1, kSCALAR_ONE, dEdf.v, 1, dEdxi.v + *pval, 1)); -#else - (*dEdxi)(*pval) += dEdf.v[0]; -#endif + dEdxi.tb<3>().chip(*pval, dimension).device(*dev.edevice) += dEdf.tb<2>(); } else { assert(pvals); - for(unsigned b = 0; b < pvals->size(); ++b) { -#ifdef __CUDACC__ - CUBLAS_CHECK(cublasSaxpy(dev.cublas_handle, 1, kSCALAR_ONE, dEdf.v + b, 1, dEdxi.batch_ptr(b) + (*pvals)[b], 1)); -#else - dEdxi.batch_matrix(b)((*pvals)[b]) += dEdf.v[b]; -#endif - } + for(unsigned b = 0; b < pvals->size(); ++b) + dEdxi.tb<3>().chip<3>(b).chip((*pvals)[b], dimension).device(*dev.edevice) += dEdf.tb<2>().chip<2>(b); } } DYNET_NODE_INST_DEV_IMPL(PickElement) @@ -1414,7 +1435,7 @@ void PickNegLogSoftmax::forward_dev_impl(const MyDevice & dev, const vectorv, fx.v); + dynet::gpu::sparse_to_dense_assign(fx.d.bd, ids_dev, xs[0]->v, fx.v); free(ids_host); #else logsumexp(dev, *xs[0], m, z); @@ -1440,9 +1461,9 @@ void PickNegLogSoftmax::backward_dev_impl(const MyDevice & dev, #if __CUDACC__ Eigen::array bcast({(int)xs[0]->d[0],1}); dEdxi.tb<1>().device(*dev.edevice) += (xs[0]->tb<1>() - z.tb<1>().broadcast(bcast)).exp() * dEdf.tb<1>().broadcast(bcast); - dynet::gpu::sparse_subtract(fx.d.bd, ids_dev, dEdf.v, dEdxi.v); + dynet::gpu::dense_to_sparse_subtract(fx.d.bd, ids_dev, dEdf.v, dEdxi.v); #else - // TODO: We want to do broadcasting here too, but it's slow/not working + // TODO: We want to do broadcasting here too, but it's slow for(unsigned b = 0; b < fx.d.bd; ++b) { dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += (xs[0]->tb<1>().chip<1>(b) - z.v[b]).exp() * dEdf.v[b]; dEdxi.v[ids_dev[b]] -= dEdf.v[b]; @@ -1774,10 +1795,8 @@ void SparsemaxLoss::forward_dev_impl(const MyDevice & dev, const vectord.rows(); - if (rows > MAX_SPARSEMAX_LOSS_ROWS) { - cerr << "MAX_SPARSEMAX_LOSS_ROWS is not sufficient. Recompile with larger value.\n"; - abort(); - } + if (rows > MAX_SPARSEMAX_LOSS_ROWS) + throw std::runtime_error("MAX_SPARSEMAX_LOSS_ROWS is not sufficient. Recompile with larger value."); const unsigned qsupport_size = pq->size(); const float qprop = 1.f / qsupport_size; diff --git a/dynet/nodes.h b/dynet/nodes.h index 4d212960b..e29c3c5f5 100644 --- a/dynet/nodes.h +++ b/dynet/nodes.h @@ -491,18 +491,19 @@ struct RestrictedLogSoftmax : public Node { // y = (x_1)_{*pval} // this is used to implement cross-entropy training struct PickElement : public Node { - explicit PickElement(const std::initializer_list& a, unsigned v) : Node(a), val(v), pval(&val), vals(), pvals() {} + explicit PickElement(const std::initializer_list& a, unsigned v, unsigned d = 0) : Node(a), val(v), pval(&val), vals(), pvals(), dimension(d) {} // use this constructor if you want to perform mini-batching - explicit PickElement(const std::initializer_list& a, const std::vector& v) : Node(a), val(), pval(), vals(v), pvals(&vals) {} + explicit PickElement(const std::initializer_list& a, const std::vector& v, unsigned d = 0) : Node(a), val(), pval(), vals(v), pvals(&vals), dimension(d) {} // use these constructors if you want to change the value after the graph is constructed - explicit PickElement(const std::initializer_list& a, const unsigned* pv) : Node(a), val(), pval(pv), vals(), pvals() {} - explicit PickElement(const std::initializer_list& a, const std::vector* pv) : Node(a), val(), pval(), vals(), pvals(pv) {} + explicit PickElement(const std::initializer_list& a, const unsigned* pv, unsigned d = 0) : Node(a), val(), pval(pv), vals(), pvals(), dimension(d) {} + explicit PickElement(const std::initializer_list& a, const std::vector* pv, unsigned d = 0) : Node(a), val(), pval(), vals(), pvals(pv), dimension(d) {} DYNET_NODE_DEFINE_DEV_IMPL() virtual bool supports_multibatch() const override { return true; } unsigned val; const unsigned* pval; std::vector vals; const std::vector* pvals; + unsigned dimension; }; // x_1 is a vector diff --git a/dynet/param-nodes.cc b/dynet/param-nodes.cc index 455413db6..bebfa401d 100644 --- a/dynet/param-nodes.cc +++ b/dynet/param-nodes.cc @@ -97,12 +97,7 @@ void LookupNode::accumulate_grad(const Tensor& g) { params.get()->accumulate_grad(*pindex, g); } else { assert (pindices); - const vector& gb = g.batch_elems(); - for (unsigned b = 0; b < pindices->size(); ++b) { - unsigned i = pindices->at(b); - assert (i < params.get()->values.size()); - params.get()->accumulate_grad(i, gb[b]); - } + params.get()->accumulate_grads(pindices->size(), &(*pindices)[0], (unsigned*)aux_mem, g.v); } } @@ -187,7 +182,7 @@ void SparseInputNode::forward_dev_impl(const MyDevice & dev, const vectorsize()); #if __CUDACC__ CUDA_CHECK(cudaMemcpyAsync((unsigned*)aux_mem, &(*pindices)[0], fx.d.bd * sizeof(unsigned), cudaMemcpyHostToDevice)); - dynet::gpu::sparse_lookup(fx.d.bd, (unsigned*)aux_mem, fx.d.batch_size(), params.mp->weight_decay.current_weight_decay(), params.get()->all_values.v, fx.v); + dynet::gpu::sparse_to_dense_block_assign_and_multiply(fx.d.bd, (unsigned*)aux_mem, fx.d.batch_size(), params.mp->weight_decay.current_weight_decay(), params.get()->all_values.v, fx.v); #else for (unsigned b = 0; b < pindices->size(); ++b) { unsigned i = pindices->at(b); diff --git a/dynet/rnn.cc b/dynet/rnn.cc index 5d5aa87e5..0ad63bed6 100644 --- a/dynet/rnn.cc +++ b/dynet/rnn.cc @@ -26,13 +26,11 @@ enum { X2H=0, H2H, HB, L2H }; RNNBuilder::~RNNBuilder() {} void RNNBuilder::save_parameters_pretraining(const string& fname) const { - cerr << "RNNBuilder::save_parameters_pretraining not overridden.\n"; - abort(); + throw std::runtime_error("RNNBuilder::save_parameters_pretraining not overridden."); } void RNNBuilder::load_parameters_pretraining(const string& fname) { - cerr << "RNNBuilder::load_parameters_pretraining not overridden.\n"; - abort(); + throw std::runtime_error("RNNBuilder::load_parameters_pretraining not overridden."); } template diff --git a/python/_dynet.pxd b/python/_dynet.pxd index f66e43fcb..961eae3c7 100644 --- a/python/_dynet.pxd +++ b/python/_dynet.pxd @@ -366,6 +366,10 @@ cdef extern from "dynet/lstm.h" namespace "dynet": #vector[CExpression] get_s(CRNNPointer i) #CRNNPointer state() + cdef cppclass CVanillaLSTMBuilder "dynet::VanillaLSTMBuilder" (CRNNBuilder): + CVanillaLSTMBuilder() + CVanillaLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel &model) + cdef extern from "dynet/fast-lstm.h" namespace "dynet": cdef cppclass CFastLSTMBuilder "dynet::FastLSTMBuilder" (CRNNBuilder): CFastLSTMBuilder(unsigned layers, unsigned input_dim, unsigned hidden_dim, CModel &model) @@ -388,6 +392,7 @@ cdef extern from "python/pybridge.h" namespace "pydynet": CModelSaver add_lookup_parameter(CLookupParameters lp) CModelSaver add_gru_builder(CGRUBuilder b) CModelSaver add_lstm_builder(CLSTMBuilder b) + CModelSaver add_vanilla_lstm_builder(CVanillaLSTMBuilder b) CModelSaver add_srnn_builder(CSimpleRNNBuilder b) void done() @@ -397,5 +402,6 @@ cdef extern from "python/pybridge.h" namespace "pydynet": CModelSaver fill_lookup_parameter(CLookupParameters lp) CModelSaver fill_gru_builder(CGRUBuilder lp) CModelSaver fill_lstm_builder(CLSTMBuilder lp) + CModelSaver fill_vanilla_lstm_builder(CVanillaLSTMBuilder lp) CModelSaver fill_srnn_builder(CSimpleRNNBuilder lp) void done() diff --git a/python/_dynet.pyx b/python/_dynet.pyx index 9aab71040..76ebe97a9 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -322,6 +322,9 @@ cdef class Model: # {{{ elif isinstance(c, LSTMBuilder): fh.write("lstm_builder ") saver.add_lstm_builder(((c).thisptr)[0]) + elif isinstance(c, VanillaLSTMBuilder): + fh.write("vanilla_lstm_builder ") + saver.add_vanilla_lstm_builder(((c).thisptr)[0]) elif isinstance(c, SimpleRNNBuilder): saver.add_srnn_builder(((c).thisptr)[0]) fh.write("srnn_builder ") @@ -358,6 +361,7 @@ cdef class Model: # {{{ cdef CLookupParameters lp cdef GRUBuilder gb_ cdef LSTMBuilder lb_ + cdef VanillaLSTMBuilder vlb_ cdef SimpleRNNBuilder sb_ tp = next(itypes) if tp == "param": @@ -376,6 +380,10 @@ cdef class Model: # {{{ lb_ = LSTMBuilder(0,0,0,self) # empty builder loader.fill_lstm_builder((lb_.thisptr)[0]) return lb_ + elif tp == "vanilla_lstm_builder": + vlb_ = VanillaLSTMBuilder(0,0,0,self) # empty builder + loader.fill_vanilla_lstm_builder((vlb_.thisptr)[0]) + return vlb_ elif tp == "srnn_builder": sb_ = SimpleRNNBuilder(0,0,0,self) # empty builder loader.fill_srnn_builder((sb_.thisptr)[0]) @@ -1198,6 +1206,17 @@ cdef class LSTMBuilder(_RNNBuilder): # {{{ def whoami(self): return "LSTMBuilder" # }}} +cdef class VanillaLSTMBuilder(_RNNBuilder): # {{{ + def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): + if layers > 0: + self.thisptr = new CVanillaLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr[0]) + else: + self.thisptr = new CVanillaLSTMBuilder() + self.cg_version = -1 + + def whoami(self): return "VanillaLSTMBuilder" +# }}} + cdef class FastLSTMBuilder(_RNNBuilder): # {{{ def __cinit__(self, unsigned layers, unsigned input_dim, unsigned hidden_dim, Model model): self.thisptr = new CFastLSTMBuilder(layers, input_dim, hidden_dim, model.thisptr[0]) diff --git a/python/pybridge.h b/python/pybridge.h index 25aba013f..33df26134 100644 --- a/python/pybridge.h +++ b/python/pybridge.h @@ -37,6 +37,10 @@ struct ModelSaver { oa << p; return this; } + ModelSaver* add_vanilla_lstm_builder(dynet::VanillaLSTMBuilder &p) { + oa << p; return this; + } + ModelSaver* add_srnn_builder(dynet::SimpleRNNBuilder &p) { oa << p; return this; } @@ -98,6 +102,10 @@ struct ModelLoader { ia >> p; return this; } + ModelLoader* fill_vanilla_lstm_builder(dynet::VanillaLSTMBuilder &p) { + ia >> p; return this; + } + ModelLoader* fill_srnn_builder(dynet::SimpleRNNBuilder &p) { ia >> p; return this; } diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 9e75ab68f..c034c60d4 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -59,6 +59,8 @@ struct NodeTest { TensorTools::SetElements(param_square1.get()->values,param_square1_vals); param_cube1 = mod.add_parameters({3,3,3}); TensorTools::SetElements(param_cube1.get()->values,param_cube1_vals); + lookup1 = mod.add_lookup_parameters(3, {3}); + TensorTools::SetElements(lookup1.get()->all_values,param_square1_vals); } ~NodeTest() { for (auto x : av) free(x); @@ -77,6 +79,7 @@ struct NodeTest { std::vector av; dynet::Model mod; dynet::Parameter param1, param2, param3, param4, param_scalar1, param_scalar2, param_kernel1, param_filter1, param_square1, param_cube1; + dynet::LookupParameter lookup1; }; // define the test suite @@ -909,4 +912,14 @@ BOOST_AUTO_TEST_CASE( sparse_input_test ) { BOOST_CHECK_CLOSE(exp[i], act[i], 0.001); } +// Expression lookup(); +BOOST_AUTO_TEST_CASE( lookup_test ) { + dynet::ComputationGraph cg; + Expression x1 = lookup(cg, lookup1, (unsigned)0); + Expression x2 = lookup(cg, lookup1, (unsigned)2); + Expression y = x1+x2; + Expression z = input(cg, {1,3}, ones3_vals) * y; + BOOST_CHECK(check_grad(mod, z, 0)); +} + BOOST_AUTO_TEST_SUITE_END() From c4b40132f8a2f5c696a311571c317cc36b747962 Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 5 Jan 2017 11:52:28 -0500 Subject: [PATCH 936/965] Document dimension object --- dynet/dim.h | 122 ++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 114 insertions(+), 8 deletions(-) diff --git a/dynet/dim.h b/dynet/dim.h index 919071760..8e362ce57 100644 --- a/dynet/dim.h +++ b/dynet/dim.h @@ -1,3 +1,10 @@ +/** + * \file dim.h + * \defgroup batch batch + * \ingroup batch + * \brief Dynet's way of implementing minibatching + */ + #ifndef DYNET_DIM_H #define DYNET_DIM_H @@ -15,37 +22,86 @@ namespace boost { namespace serialization { class access; } } namespace dynet { +/** + * \struct Dim + * \brief The Dim struct stores information about the dimensionality of expressions. + * \details Batch dimension is treated separately from standard dimension. + */ struct Dim { + /** + * @brief Default constructor + */ Dim() : nd(0), bd(1) {} // explicit Dim(unsigned int m) : nd(1), bd(1) { d[0] = m; } // TODO: The constructors for dimensions w/ and w/o batches is not intuitive. // can this be fixed in some way? // Dim(unsigned int m, unsigned int n) : nd(2), bd(1) { d[0] = m; d[1] = n; } + /** + * @brief Initialize from a list of dimensions + * @details The batch dimension is 1 in this case (non-batched expression) + * + * @param x List of dimentions + */ Dim(std::initializer_list x) : nd(0), bd(1) { - for(auto v : x) d[nd++] = v; + for (auto v : x) d[nd++] = v; } + /** + * @brief Initialize from a list of dimensions and a batch size + * + * @param x List of dimentions + * @param b Batch size + */ Dim(std::initializer_list x, unsigned int b) : nd(0), bd(b) { - for(auto v : x) d[nd++] = v; + for (auto v : x) d[nd++] = v; } + /** + * @brief Initialize from a vector of dimensions + * @details The batch dimension is 1 in this case (non-batched expression) + * + * @param x Array of dimentions + */ Dim(const std::vector & x) : nd(0), bd(1) { - for(auto v : x) d[nd++] = v; + for (auto v : x) d[nd++] = v; } + /** + * @brief Initialize from a vector of dimensions and a batch size + * + * @param x Vector of dimentions + * @param b Batch size + */ Dim(const std::vector & x, unsigned int b) : nd(0), bd(b) { - for(auto v : x) d[nd++] = v; + for (auto v : x) d[nd++] = v; } + /** + * @brief Total size of a batch + * @return Batch size * size of a batch + */ inline unsigned int size() const { return batch_size() * bd; } + /** + * @brief Size of a batch (product of all dimensions) + * @return Size of a batch + */ inline unsigned int batch_size() const { unsigned int p = 1; for (unsigned int i = 0; i < nd; ++i) p *= d[i]; return p; } + /** + * @brief Sum of all dimensions within a batch + * @return Sum of the dimensions within a batch + */ inline unsigned int sum_dims() const { unsigned int p = 0; for (unsigned int i = 0; i < nd; ++i) p += d[i]; return p; } + /** + * @brief [TODO] + * @details [long description] + * @return [description] + */ inline Dim truncate() const { Dim r = *this; unsigned int m = 1; @@ -55,28 +111,78 @@ struct Dim { r.resize(m); return r; } + /** + * @brief Set the batch dimension to 1 + * @return 1-batch version of this instance + */ inline Dim single_batch() const { Dim r = *this; r.bd = 1; return r; } + /** + * @brief Change the number of dimensions + * + * @param int New number of dimensions + */ inline void resize(unsigned int i) { nd = i; } + /** + * @brief Get number of dimensions + * @return Number of dimensions + */ inline unsigned int ndims() const { return nd; } + /** + * @brief Size of the first dimension + * @return Size of the first dimension + */ inline unsigned int rows() const { return d[0]; } + /** + * @brief Size of the second dimension (or 1 if only one dimension) + * @return Size of the second dimension (or 1 if only one dimension) + */ inline unsigned int cols() const { return nd > 1 ? d[1] : 1; } + /** + * @brief Batch dimension + * @return Batch dimension + */ inline unsigned int batch_elems() const { return bd; } + /** + * @brief Set specific dimension + * @details Set the value of a specific dimension to an arbitrary value + * + * @param i Dimension index + * @param s Dimension size + */ inline void set(unsigned int i, unsigned int s) { assert(i < nd); assert(s > 0); d[i] = s; } + /** + * @brief Access a specific dimension as you would access an array element + * + * @param i Dimension index + * @return Size of dimension i + */ inline unsigned int operator[](unsigned int i) const { return i < nd ? d[i] : 1; } + /** + * @brief Size of dimension i + * + * @param i Dimension index + * @return Size of dimension i + */ inline unsigned int size(unsigned int i) const { return (*this)[i]; } + /** + * @brief Transpose a vector or a matrix + * @details This raises an invalid_argument exception on tensors with more than 2 dimensions + * @return The transposed Dim structure + */ inline Dim transpose() const { if (nd == 1) { return Dim({1, d[0]}, bd); } else if (nd == 2) { return Dim({d[1], d[0]}, bd); } throw std::invalid_argument("Cannot transpose Dim object with more than 2 dimensions"); } - unsigned int d[DYNET_MAX_TENSOR_DIM]; - unsigned int nd; - unsigned int bd; - private: + + unsigned int d[DYNET_MAX_TENSOR_DIM]; /**< Array of dimension */ + unsigned int nd; /**< Number of dimensions */ + unsigned int bd; /**< Batch dimension */ +private: friend class boost::serialization::access; template void serialize(Archive& ar, const unsigned int); }; From ee18894fcfff884420ae5ae4fa9bbcd2c506d2b5 Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 5 Jan 2017 12:09:29 -0500 Subject: [PATCH 937/965] Add to doxygen + sphinx --- doc/doxygen/Doxyfile | 2 +- doc/source/minibatch.rst | 6 +++++- dynet/dim.h | 11 ++++++----- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/doc/doxygen/Doxyfile b/doc/doxygen/Doxyfile index e6c2cb8f7..e9ba5512d 100644 --- a/doc/doxygen/Doxyfile +++ b/doc/doxygen/Doxyfile @@ -758,7 +758,7 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT =../../dynet/expr.h ../../dynet/training.h ../../dynet/rnn.h ../../examples/cpp/encdec/encdec.h ../../examples/cpp/rnnlm-batch/rnnlm-batch.h ../../examples/cpp/mnist/mlp.h +INPUT =../../dynet/expr.h ../../dynet/training.h ../../dynet/rnn.h ../../dynet/dim.h ../../examples/cpp/encdec/encdec.h ../../examples/cpp/rnnlm-batch/rnnlm-batch.h ../../examples/cpp/mnist/mlp.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses diff --git a/doc/source/minibatch.rst b/doc/source/minibatch.rst index a7c7cac4b..f443ca13d 100644 --- a/doc/source/minibatch.rst +++ b/doc/source/minibatch.rst @@ -3,4 +3,8 @@ Minibatching ============ -How to perform minibatching to improve efficiency +How to perform minibatching to improve efficiency. + +.. doxygengroup:: batch + :members: + :content-only: diff --git a/dynet/dim.h b/dynet/dim.h index f9347e7b7..eed26fa27 100644 --- a/dynet/dim.h +++ b/dynet/dim.h @@ -1,7 +1,7 @@ /** - * \file dim.h * \defgroup batch batch * \ingroup batch + * \file dim.h * \brief Dynet's way of implementing minibatching */ @@ -16,6 +16,10 @@ #include #include +/** + * \ingroup batch + * Maximum number of dimensions supported by dynet : 7 + */ #define DYNET_MAX_TENSOR_DIM 7 namespace boost { namespace serialization { class access; } } @@ -23,6 +27,7 @@ namespace boost { namespace serialization { class access; } } namespace dynet { /** + * \ingroup batch * \struct Dim * \brief The Dim struct stores information about the dimensionality of expressions. * \details Batch dimension is treated separately from standard dimension. @@ -204,7 +209,6 @@ struct Dim { //static_assert(std::is_trivially_copyable::value, "Dim must be trivially copyable"); /** - * \ingroup batch * \brief Check for equality between two Dim * \details Two Dim struct are considered equal if their dimensions and batch size are equal * @@ -219,7 +223,6 @@ inline bool operator==(const Dim& a, const Dim& b) { } /** - * \ingroup batch * \brief Check for inequality of two Dim structs * \details See equality * @@ -231,7 +234,6 @@ inline bool operator==(const Dim& a, const Dim& b) { inline bool operator!=(const Dim& a, const Dim& b) { return !(a == b); } /** - * \ingroup batch * \brief Print Dim to output stream * * \param os Output stream @@ -239,7 +241,6 @@ inline bool operator!=(const Dim& a, const Dim& b) { return !(a == b); } */ std::ostream& operator<<(std::ostream& os, const Dim& d); /** - * \ingroup batch * \brief Print vector of Dims to output stream * * \param os Output stream From 9ba8e438e65dacca8074bc51dad0355cf93aeb68 Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 6 Jan 2017 09:49:45 -0500 Subject: [PATCH 938/965] Remove from minibatch.rst & change group name --- doc/source/minibatch.rst | 4 +--- dynet/dim.h | 8 ++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/doc/source/minibatch.rst b/doc/source/minibatch.rst index f443ca13d..d22db7c22 100644 --- a/doc/source/minibatch.rst +++ b/doc/source/minibatch.rst @@ -5,6 +5,4 @@ Minibatching How to perform minibatching to improve efficiency. -.. doxygengroup:: batch - :members: - :content-only: + diff --git a/dynet/dim.h b/dynet/dim.h index eed26fa27..6695cee61 100644 --- a/dynet/dim.h +++ b/dynet/dim.h @@ -1,6 +1,6 @@ /** - * \defgroup batch batch - * \ingroup batch + * \defgroup dim dim + * \ingroup dim * \file dim.h * \brief Dynet's way of implementing minibatching */ @@ -17,7 +17,7 @@ #include /** - * \ingroup batch + * \ingroup dim * Maximum number of dimensions supported by dynet : 7 */ #define DYNET_MAX_TENSOR_DIM 7 @@ -27,7 +27,7 @@ namespace boost { namespace serialization { class access; } } namespace dynet { /** - * \ingroup batch + * \ingroup dim * \struct Dim * \brief The Dim struct stores information about the dimensionality of expressions. * \details Batch dimension is treated separately from standard dimension. From d7666c473d433948063b9cf51239dfd5a2a79575 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 9 Jan 2017 08:22:50 -0500 Subject: [PATCH 939/965] Added dynet link --- doc/source/index.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/source/index.rst b/doc/source/index.rst index 3d0999fd1..9f2ca2d65 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -1,12 +1,12 @@ -.. Dynet documentation master file, created by +.. DyNet documentation master file, created by sphinx-quickstart on Thu Oct 13 16:13:12 2016. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Dynet documentation +DyNet documentation ================================= -DyNet (formerly known as `cnn `_) is a neural network library developed by Carnegie Mellon University and many others. It is written in C++ (with bindings in Python) and is designed to be efficient when run on either CPU or GPU, and to work well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for `syntactic parsing `_, `machine translation `_, `morphological inflection `_, and many other application areas. +`DyNet `_ (formerly known as `cnn `_) is a neural network library developed by Carnegie Mellon University and many others. It is written in C++ (with bindings in Python) and is designed to be efficient when run on either CPU or GPU, and to work well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for `syntactic parsing `_, `machine translation `_, `morphological inflection `_, and many other application areas. DyNet can be installed according to the instructions below: From 792219b8fab42451f5ce5549214755d2180b9492 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 9 Jan 2017 10:35:13 -0500 Subject: [PATCH 940/965] Added info about mailing list to main doc --- doc/source/index.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/source/index.rst b/doc/source/index.rst index 9f2ca2d65..c7f87b0c4 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -8,6 +8,8 @@ DyNet documentation `DyNet `_ (formerly known as `cnn `_) is a neural network library developed by Carnegie Mellon University and many others. It is written in C++ (with bindings in Python) and is designed to be efficient when run on either CPU or GPU, and to work well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for `syntactic parsing `_, `machine translation `_, `morphological inflection `_, and many other application areas. +Read the documentation below to get started, and feel free to contact the `dynet-users `_ group with any questions (if you want to receive email make sure to select "all email" when you sign up). We greatly appreciate any bug reports and contributions, which can be made by filing an issue or making a pull request through the `github page `_. + DyNet can be installed according to the instructions below: .. toctree:: From 55d0c8f259aa2ae7088f8fc4fbcf8e373a763ff4 Mon Sep 17 00:00:00 2001 From: Yijia Liu Date: Tue, 10 Jan 2017 11:45:04 -0800 Subject: [PATCH 941/965] fix windows compiling error by modifying the unsupported initializer_list on windows. --- dynet/nodes-conv.cc | 6 +++--- dynet/nodes.cc | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dynet/nodes-conv.cc b/dynet/nodes-conv.cc index 9d0726325..dc72db743 100644 --- a/dynet/nodes-conv.cc +++ b/dynet/nodes-conv.cc @@ -409,7 +409,7 @@ DYNET_NODE_INST_DEV_IMPL(KMaxPooling) template void SumDimension::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - Eigen::array reduction_axis({(int)dimension}); + Eigen::array reduction_axis = {(int)dimension}; fx.t<1>().device(*dev.edevice) = xs[0]->t<2>().sum(reduction_axis); } @@ -421,8 +421,8 @@ void SumDimension::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { // TODO: limit to 3-dimensional tensor is arbitrary - Eigen::array bcast({1,1,1,1}); bcast[dimension] = dEdxi.d[dimension]; - Eigen::array morph({(int)dEdxi.d[0],(int)dEdxi.d[1],(int)dEdxi.d[2],(int)dEdxi.d.bd}); morph[dimension] = 1; + Eigen::array bcast = {1,1,1,1}; bcast[dimension] = dEdxi.d[dimension]; + Eigen::array morph = {(int)dEdxi.d[0],(int)dEdxi.d[1],(int)dEdxi.d[2],(int)dEdxi.d.bd}; morph[dimension] = 1; dEdxi.tb<3>().device(*dev.edevice) += dEdf.tb<3>().reshape(morph).broadcast(bcast); } DYNET_NODE_INST_DEV_IMPL(SumDimension) diff --git a/dynet/nodes.cc b/dynet/nodes.cc index d7285523e..b3908bc9c 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -1952,7 +1952,7 @@ void Sum::backward_dev_impl(const MyDevice & dev, if(dEdxi.d.bd == fx.d.bd) { dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); } else { - Eigen::array red_axis({1}); + Eigen::array red_axis = {1}; dEdxi.tvec().device(*dev.edevice) += dEdf.tbvec().sum(red_axis); } } From 2e2ef7bb4b9ee241d597d0392631dfdf3e64af23 Mon Sep 17 00:00:00 2001 From: yoavg Date: Fri, 13 Jan 2017 21:04:53 +0200 Subject: [PATCH 942/965] inline doc for inputMatrix --- python/_dynet.pyx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index 76ebe97a9..90a773385 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -804,6 +804,22 @@ def matInput(int d1, int d2): return _cg.inputMatrix(d1, d2) def inputMatrix(vector[float] v, tuple d): + """ + + inputMatrix(vector[float] v, tuple d) + + Create a matrix literal. + First argument is a list of floats (or a flat numpy array). + Second argument is a dimension. + Returns: an expression. + Usage example: + + x = inputMatrix([1,2,3,4,5,6],(2,3)) + x.npvalue() + --> + array([[ 1., 3., 5.], + [ 2., 4., 6.]]) + """ return _cg.inputMatrixLiteral(v, d) cdef class _lookupExpression(Expression): From 11f456df64d0f235bf89e8a57dc3533d075f5a0f Mon Sep 17 00:00:00 2001 From: cherryc Date: Fri, 13 Jan 2017 14:37:37 -0500 Subject: [PATCH 943/965] fixing cmake error with defined BOOST_ROOT Previously, cmake would fail if BOOST_ROOT was defined but Boost_INCLUDE_DIR was not defined, now it does not --- CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 386dd4950..e3f9e40d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,11 +100,13 @@ endfunction() # look for Boost if(DEFINED ENV{BOOST_ROOT}) set(Boost_NO_SYSTEM_PATHS ON) - get_filename_component(Boost_INCLUDE_DIR "${Boost_INCLUDE_DIR}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") + if(DEFINED ${Boost_INCLUDE_DIR}) + get_filename_component(Boost_INCLUDE_DIR "${Boost_INCLUDE_DIR}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") + endif() endif() set(Boost_REALPATH ON) -message("-- Boost dir is " ${Boost_INCLUDE_DIR}) find_package(Boost COMPONENTS program_options regex serialization REQUIRED) +message("-- Boost dir is " ${Boost_INCLUDE_DIR}) include_directories(${Boost_INCLUDE_DIR}) if(MSVC) # Boost does auto-linking when using a compiler like Microsoft Visual C++, we just need to help it find the libraries From cb7b996569cb37938b2a11e722fe55c6f7c21d33 Mon Sep 17 00:00:00 2001 From: Yoav Goldberg Date: Fri, 13 Jan 2017 22:15:20 +0200 Subject: [PATCH 944/965] Update dynet_viz.py mock trainers can not get arbitrary number of parameters. --- python/dynet_viz.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/python/dynet_viz.py b/python/dynet_viz.py index 4040d02a6..0ebebc419 100644 --- a/python/dynet_viz.py +++ b/python/dynet_viz.py @@ -697,15 +697,15 @@ class SimpleSGDTrainer(Trainer): """ This object is very cool! """ - def __init__(self, m, e0 = 0.1): pass + def __init__(self, m, e0 = 0.1, *args): pass class MomentumSGDTrainer(Trainer): - def __init__(self, m, e0 = 0.01, mom = 0.9): pass + def __init__(self, m, e0 = 0.01, mom = 0.9, *args): pass class AdagradTrainer(Trainer): - def __init__(self, m, e0 = 0.1, eps = 1e-20): pass + def __init__(self, m, e0 = 0.1, eps = 1e-20, *args): pass class AdadeltaTrainer(Trainer): - def __init__(self, m, eps = 1e-6, rho = 0.95): pass + def __init__(self, m, eps = 1e-6, rho = 0.95, *args): pass class AdamTrainer(Trainer): - def __init__(self, m, alpha = 0.001, beta_1 = 0.9, beta_2 = 0.999, eps = 1e-8 ): pass + def __init__(self, m, alpha = 0.001, beta_1 = 0.9, beta_2 = 0.999, eps = 1e-8, *args ): pass class Initializer(object): pass From 135567f1f07a676c88257a7be03ce6030299f52c Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 16 Jan 2017 08:47:23 -0500 Subject: [PATCH 945/965] Added some minibatching doc --- doc/source/images/minibatches.png | Bin 0 -> 72436 bytes doc/source/minibatch.rst | 52 +++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 doc/source/images/minibatches.png diff --git a/doc/source/images/minibatches.png b/doc/source/images/minibatches.png new file mode 100644 index 0000000000000000000000000000000000000000..641d46b4cc8ee9f665a7d58463f8d26f1ddfde24 GIT binary patch literal 72436 zcmV)kK%l>gP)t?Zrb$FWRCwC#T?brEUmX9v*M6_Phmk_|-lLFNB72jREmEnJf0>0y zvJyg8R!C8zY}sTaQC54`d+qoB_uSWey_rf>+^atBJ3we3^O`5Y%g}D==Oiiz`kIAxw^6-1yVGZX7zsYk+elVAPYHy?!YA@tn_J12^ zvAODJXel94__e&88v4Dwor#Xv2T}Ktzw; zcXmx)1m4WW^~oi5$>Y}rJV~qEs7LBEp7yIFwb_s(k;?erSCITsQ%<{0YE{096~B^? zusj6o#+yft8jD|^ac6+ibTl;Jdul3)`+gM_Maay|sc~i4c_=6-Ltb7sI!Ev4Ukyj(fyeZd~1xcM!Chd+Kx}F+hGn_u z56?iJJUAuVb^hus^lRdNcw5-E|CaJMh@_+xl$MqNg(8c8B2;QsXZQ8;6&Cd?8ww%e z<0)2wda6HRUvqNzci*~xq1#X@^~dmugRZ_ZwRypxSH!hKjN0OG`&K!O8C%s)4DQ|? z{~cr(v>*MhTsZ|ke*7*#xSHf~GB6(Js2kVmcwPuf^71gSOIMyeu3z_pO`8G*Ig5uf zZg(8{3xOI6fle>Pe`&M=PMX$OQz$4bzAFkfJ%ah0G(e^xf)VMd4 zmsf)P{2b8M(uJJdbm-RAh?ACbHI(OG8Hx;iNeZfU4<#ifgLBrn3F?^aN{2ZX?eOc0 z7}eDj6?yIr4&Dq04_>WH_YIdXro(7cIk+BL0Opf4@T&{WC&0U;B%V7HKL^2zmAh-F zI#k!=2uq{W=(Xsc@3)7w?#{E+Y2xBFxEwJbVQR)s<;d=~SjchA0^II`+l%!@v(bBQKx z;t&`}qhll-qi8f8N}r7{xChe1yDC4oHSZF%wvT#*AJs-SJ9=Gz^j!KQuihH{9Uh~> zG#Vqas7MpraVLND?FVrKLY#-XFbeM}kf;OmbC^s?B@(IhuNWH&eparmuGl&DV|<0#nUe;L14LQ{bw z7oM`zy3JMH^YZ1(_h49FlX0G~o_N7BL%dQ>);++}%NdT?4*?SMGca-vL39q5@OlRT z)>!<{j_srTuu*-6i2Vg@{ytNAPO*ln(Yri7J)PLcR4Nq{l}tNyJbxR@X6bS88TQAc zHq=QqY7{p3vNF0PvkY)GU6Mj6s_pYOt5@&(s|7qaBqS)M$>L0zqB4-w2Pmq^C&rCy zXZ)v3oU`=AKhanS+9XmDNJ3FvK8ruyPz};pKQkm2L`8$#&>_J7r9FN2meR9FC+=sH ze_RA@orw?>v>v8SbNgk>Y@=)}OczqDkM}q@undc9*ZThjoW=YovD;#<&&uPEmf%*1 zHWLzme7Mj~Nl`JkK3;ESJr+)$ih!|W`*Tb+HIZ|Tva!NFmoH~G6h6X_zo_>#hoRj| ziIhwxlYzlt{L=fcUuRh~A3l8B^f_ykbGSFt8N9i#^->}yPo8Xg;a3|9w`wZk7H>ce zUt3+N$;hnp=R+q^C{$)q5uG!8!#2p(2FjI!%`FPIk}^qXzVP;gPyIuj2f4DXq^us1oZO@vi(9MS4A6Zu*Exyj_#{)5 zHqLG+VOl!dW$91#TEDfi>RJI&{szCIAl^=Av{I)+L3=7Wv$9Jd_oJ#MKcdkzx$g@& zvvB|EDWFF$b(l`_4|5!(zu-m~_4(Dvw$<7C*O$a(DcdPtEIb#t32Wd+{Qs$M4SLRT53V zx;$#^a&-Gv1wN(D{;j;uaSLMKJ7`c>=KcGxYh4+X2Yc2V`BNY_0UhmD@FO`9Pe)b= zw)V>A@QU(iAd4B*%H>E|Ssk*o(>d-&?7TR6=o(e(dMOTMvi7zg-;sr5f@qf`jJj3CsKt0v8|@534V+k3jHEiBQ|Ft2Ug^2$i6==@{}R^1Gnd#ip-qc>Jt0-j z=gz}b=H6nd_GMi zvLPuiub|eARZ&qUG!J0|{kp0RB_%9ZCk@VgGx1a*0)Ne-k{ z$3|UeyAi1j-SmKc%sqq&PORuWd%DN54co0;?FLJSBe`TEFP~(5HGb*B!5TMu_3QkY zJyU}Q*LW|B33~S0o%W$qdI(bro0y44l9?6dI)L5#aUXND{)ARyvHa>pSbn~)kWZGx zE$ETe0l6*hXn%cHljkfFwRgeq%&4raY+!C~?!CD~TObD!p%bKabp;aT!Xyd}=5oaE zx+6^ZqU$soZQJ7`OQ4VCen9R)t6c11*JdvWwC@Am96~^Y^lO$I8}l}B=0P6(x56AY z_+Ena^dDG0Ixwb-EJ$@*1ecEQ06+T)Fky`!v})BV5ksrmT1kGnu}~&Ck2d#G>gVzl z9dm2Thn{B{TJ=!5gRax*^sSwTo3kF0>I`dFuE85C{8Bv3@zTJ3t7=p5`Sa%oV3^N7 zM-7GEfe3+6Sn1+_?R6o`%?ODQtf3IN8|sgnl~F_SE3~*Wh&2@Zm_ngAw&*z<*Q%Mt zuX(!cz&fY}+zrL;%EYY()O3EK(YqW~hoZ7FDH#cg5>e?Gmtt*Cp*LV}_-AqaZAG7! zYNQM!b#fwKS3s(+p%B_k^|hFt87`wz+Ka@R;ioYGzx1H&_2sW2+J9N~@y1`^hu$SptTAG5N z-(~Rev4NR0*TcTOw(ut!>bG$gYN%oWF=+sNcyD0hdIMlx?HgXmHPlcD?(VEfrSli= zz`71|nx@QRa}T?r(3r5UW)-%i=U)76Y}^ZO-h2u(rW?ch4FS-%Z+kE?og5k#dfxP} zlv$#Ekgv$|u z-})8CU2-s0H{Ev2NS^W?g=ZAlx=n^CeN|~?>kx>=d3fa$~YshP@7=crWC>+J(PYp28y{Z3 zG@|p<{kYNPRzYG*P*ls4@8j^29(%J5iL?$EcdvujkL@(V_%0b!5=_@eZ(TRH%aQ(i z)HrUFV0qegjU>g9C5WleIeMnE`F|XbE`5nq+QS?T?NVmG7-AY^&6g*WIg5kKKLxc+ zd!N}_t(WDijbY!WMBcbN+}>zbXeViDJT`}#DrBQ_<0@}uIevV8-Rjlxl~bCsM_7|* zEQ-O*g#KK8Gn${i;xup_pg-W5JA?ek+q;Q+A=|-#Mk}SV3{Pbg^iE`;(w88W2@j4SYx6WkdIq;sjh)1$jYQI(G7y@w2rja!{ zo&26Atz6|r*Hlq`J${=)D#Ls!R*{~nK~d|HRq`gholK{NaiRv@HIXP`VUI>La_%cX zhyK!k+JP7M1v9Y!1Yd4yk)%2lF>+4`I7duUQ1~S85qThBY47dTYt^Ns+)`=je(Kaz zewWO@sUE+LvCtHx7!~koNGTCa#VwV@)Ytu}NZ+U<^1ezZpI!~{ZPtYGxxGbu+g|X0 z;yuY)c*7`GAj$lvnW`@Js5WflPwF9FuU|tgtP4yggCzLO#u~l*cj`) zWF&R@6TF!MjD_9Ex z@Vmcj&JjCGBO7hoc8B=*7o78s9r_BbO{Gh9b+5+Z;4t%#)Po;NN@|dk!wLQd1_nKZ zJ`v{QQ=^;)4(uXYV$pJQ72LxUCU2kC>+sF6u+c^)CJ|U7BPF*~IVL*H(A?bo67pZT zlK7@uTn-1-q>rWv#J;q=K*9Ojyiou8>ZM-dwrE$N9nyt0`N5x~se4tllk z0B#Ewh%7jx;x^c<+zlV%zCn0+RoB0)oyx<#aasNO??(}OV={7Es7um|E<`*TJ;mH4 zI42`nO#(`p@6st+eLAYgqEVxD*W8DwUPuu=^MTxbx`8wvXLX_V7D!Bd1FmaX4h7qH zECgw33anVR3qN1uYyw?64~E$@oq3q4!;I+=d*WoZL_l>xp4=~<9|Ac!3YY3&SitYo z`>XZXvMCs@T|Ww&HeAHt7kFX|eEk*&F3!jC^KD*MAWKz%rAv13)T8U1+3@`6F%T0I ztF|5;J6XVu2rtm)S{%!+2ZyncZAw$CSqfs7cZuIycbAdLK=v#vp9hYiZsv~YfuSVG zlU38r%s)JFCOBPuZ{i-s5r=GM;h!tTgEfX1f!TN!p8N2T=g=W6iT3On+uTrFVzM#IWM)?I-J%)eTXwXPE?+gzMS z9=(pe2dSxFIOp%;V&L`b2Lkno+P5Eu3^A&<9?hCh!sm`6BcJfpgQqJ*21j;0HFgYZ zHqp4hreRJOaj*ESZKm_UjfSU3MwDR8qlCw0Le+Jhk2GA zK}JRv_W0c6sRvsA@jCDXs4FX1TMy*8@9*ybQzj1)sK+nqSllCm;UlGZB-XSUdQ}qZ zIvpGYeoHUl9x_90JQnwgCitz&V0>3#Yvf~}s5VT~h8Vr?^T9a!J> zxDm;kA4Gvzi;9XkQfof;p?pq!$5XH8FK+YHLx0jlczX0G^aP`7>wy9Q1)2?lkSlk2 z>QQgXJ3opZY%g4-;mlTpzH+nvUA&KVrwgkPJ>pZm!N4$5nIC{qLt)2RLO=m{xRR?4KuLMm* zAEHguaqRr=!LGQjz2u}Mic4J zcUgiX@`vvtXx%W3#oxyYUHT@XAKt)q9D^|*crurXdWP|SV_RVsb`3+9hm{3lxEO0) zsxH6kbOEx`knHNpLZAT{t0BPMt?{o1K(03XKlkdgyq^lb)z3CF&C_c_QfK^Z;uQbIh-*Q2}xgvgC*JX%x0ao4}Sh-iL>yCr;q$@Rgh8>u^Ciq!h>O1&mgEJP2 zi-fjfo3`_wfLpwc;mph2mi09kZdux&{W@P%!|3ble@aM5Xf4q2%zW$ydAPo5D!hIE z2J9}rgIU|}LCdzfuw{HRSk<;Is9ITp%HVmh#r+g~3+JeGkd~IFfg!EF>)o|$*H?!Q z9kS}(yEpGrdlJhUUxRafroSegBh#7a**gP+S*8d=$O zSkhkumhed@9%&`12Z4Kb0PNWzm{tjAXJ-%eSDmS$KA5V}nHz*{EIGva?ydx9*i{=n zOH54c)30`8h^c;u{Ylij#Kpzq|76$u*Xvk+8byhxTFJDUnaI)YB=k#|WuK&~d#1CD zOxEgot&hz=5WD(U@@CI#KFnb>>#s!qPAKnx5qOxYhF#nn$uXq)2QIE&cj?otjpq6% z>zen=CpUXvz4U29aAvQT{jIw0A{gs0gD6vq$oumy;i3b#6&jGUaB=!^(0t&<5yXWFpOy(k- zdfaY0Ka*IarCxPD_|>=V62AHiA3p1Xld9Lw-FppKoW@?NMdn=Kb1~*+)RbQ%~S}~UOhVs55HWc z7jiQd0yk6P-S^WtVpP~vO$)#K8G&w)!63sw3?hsX0YYLCAQ+1P!C2hNW+{27)Aij^ zo@OiZ=uD~tg+$B9$WX(;83MDem($r1j&m|HRF%}!GFfS?U~0L!bVWr)O0KXBQFPLx zj0`3AGu(=T$!{p-0k@Lir%LE)E~5ytjN20e&?i#a~7S%w_;-EiXjF;3_;^}XV`g;-}%@LAIit>?sUs@qRpmF5o`E& zZA14L=Oih5*i758bm?Tj{O?|x8iVa0anh-V1aos8b!LR_4Ne6HBfuo~(|8ag}__WtbXyZu@3VU+{6_E}$F<^ux1*cCQL9CMoQ zHqSF)eM97pLS0fQ5_I+~wNP7iJI_kcuR7o28_@dIu zx+XgCfnWctspH_)3m44mdqqrRtjBL-tRWg=pHaNa4ywJrkfbIR3En|rs2;H#A-_F( zM@`;`lzCJUM<(-+GFDRV1Feem5Dg|HNuuP!d}+K8CTJZ zGnoqo8XX0MMJv6hd*64}k2|Qj+3(o$>fX6-rJ0YVx2IcUu1D)H=ae?>+GSVQdi*xV zV(+GkhWyoWd`;fvb}P*sKk(ZyuOXQ0XRgfLOV}#XL9Hh5YV7q`-G2N%5L_Hp<9aj- z%lnHLFS<)9>E?CNRr=i2M?*x zuCKa?Dj)xSxcBRC@`7mSdejqRkx_VU{8&q?C8VTO#kU+bbPC*xI#;E8t!DW|AumjB zhq~gA9|MHfnD?|UUYT_s+44ny=08vP$T*08`*rRNk78Ndk|`;O*2ljjor9LTQ&>Y6 ziVV={MWn`1j~CA>@KB1I7B2?Z0|)SHYL#Ikg#pokJ1(p+2CNsxVlx$jva%)*V|`3` z$#d^+Ut93nu>}4mu$c-$teUMWCr$p3%dS-P$IAEoMO2OM+ZtG93(v^T7J1)){~f8{ zuF!aW)b^WhLml|-9^7%<_xV16{DK@X8?OpvvN)VL76%{VpTWY#eLzl55w2d&5_qq? ztZa?)A3uJufX$^Y4b8nRIvbj1yCYLWY&feV1`pyLb9CuEfajb_t%{t@Eq$Z*>=l{s z6sy*hU6%Q;TI8p^51ZhL!? z`EJ-?37a+x4$`^n!C|bL#1xkX664aPOXlpD;-}+^dQ}n`3e)VIOU!_uN^1mJG)*;5O8Dfnl*4X@+QnT zt$tZ8>ek1buZ8E&4hgLXhq2f(#oL?hzxF=Fehi8;P_%vQEc8WOGF3m-=W+VTuuThA zg_eDCEe;w!- z)3I3H%H6wz`WqVFy>sV|;o!l8acZ&)E-7Wqt78d?jn0l&Z#%{8g!j3S*(mM;vifVQ zwNF7Y8o1-tUz)0Zq*qk>I7*+5ob4vqbwLuCKVCimIi_Q=q}l9Qkoe;VevHD4r({$O z3YCX>-Os*dKakZvuVBPTR`>@==_=oO6sn1P|Ha=~4`KDfbS(UM@wTmS^4c~0SZ~rq zNYBa=T91l~3XZPGt!r`DL!c{+yXr8SPG3oh4!bvkEhL9e9CQ`^nz$a`^)vC@yjfcg zVSjV%AGr$Bpp8A>CDB?{cR!NE;P#0pKz{FD!+BOLH*eOO=NYu2fG{2F*|FnX`b)>R z#cBRJ5)y!Kh7j{;KS;?KLs@A#?AyBaqU4|_we`mBeH3S_##$9tQ-7tOwGucJ4Y0bXpM%9ohq;qMi%XL%_Si)7{!#;ESliE(plX zfTR_I1oqV`DXBuYZY(jWsGy1~yWP4E;dyUb*fnS|emwqL9Z>ftBRc{voadEv!gh1u zE+4|wX;!C&m7Tj@eI-+KxIdCHV-+x6B$#uK0`LbMVeRG+ajg){%+>H;Zgev+fb6_H zkd~C>xy~jA8H6 z&cU~D@$m8EEBqWSZ)ad#nc>j=__>D37y%ti7}y0@RWsw!vFd9#2X5~Qc3no9$noeR zNCKntkz-^9bS&Ko=8%<}iyyb2J`KL5rV7pHfZt{CJ9tGvH>od!udsTI9k0Su5B_=$ z9WKGqu|}_21@~XQWe;`w3d-ebXUtB1)L3kbV* z6xS77>2~B?*VpgN+xALTbLKxnuHqXsl@u4lr}Gy?zT0)}9Pr+G7O%$+uVr9ozxVer zmf=t`srtQh1edPM4lyFtWYqPiy#Y!}ifg?m5UNXcUpU98OEx5BXXkOf%ksC?BQz`k zt4Bbs>rqIf)w&+5?e_d0#v(v~U@QWEBV(13*b7~&Lvh9z6=}7WS#`jN86_8HMq(WZAZbY~2WjyMBLe;>335+e6a}U#Muv_04#aU7_PU zLM3R@(FEIZom8IU_i;J$-`_jaYKQaHwa9gu{T{P6@~@quGbV(rGF*S~vrf01=fNG( zdwMI2{XqB3>!oxTy>F58anFi^ud=8tXk|Bw0{Fh9LaCi3IhP=J127h1Dweo-K_SUa zEG$pEqPc#U20pIbd^5$|`+VH=@p5vB=zL2|{22C1Xf`t_583z-EjVS+(ka{-+}zmJ zq5X`TXPNXb3TmXXQgn~H5;^(U)11NFlgK9S_qOIRnUV$1ws(CT@nA?!MTHc%;vVub zzYDj68NRsn!%iLcJ?!_P)zCmvXQ1@;!7*o-2s0jbEb z-kq#nhIZpZM317;bb8EQ5&Se)T(hsiy2lmi8+FjVyCT1ivt5302eXtU9=vl6&u&}D zDtyC|ag{_CE33$kQlZMK79d8&clcrya%TN9iwfnG$>fsM+nWZI7N^T(R8;WH^Pqg@ z?!51EeD%Q1s~jf#p!e)b8`aL0M0(6&K;9Qss!0CodDN? zm_^Sy)0M1mE`zqEK;^GpZUAxwB{`~pL)r<99v4^?xTJ@yYgCEVmNHsa}@^8T?n+8HTJL3vA7whfXS4QBazCucTyE~?}M=YV+NQkxmKN$j=pS!BMzfETiia$ zWk6|3CfHqkgYi{Z z+u8~s;Sk;};^$JGVRmzX-CkY*US5^=oxtmZ(v=6Y{OEl`8L&Of8%ioFfSQph@NQHW zQRPC0=D$*TM;j~knzH-~zC|w=RC^e{%Y1&P1ONRy_IR)4W-M-CVjq2>Jlof%S1zvV ztw;uNxXQX#na*=xTz3J+ukEVh>VWo`u34G42$XH7kmst>ow%;D_q1kxAUZla)iVuA zv7)|5&y9w$6niXso$zUqF8_65OoebEEPk}8cNrQQ)@vipm@(t@?>2wbcbU2I{rjIc z;}PBsHNdG;r)CnZKrmLlqLfaTk)%-SVLf~qiB2z*p-?Dvg0cQWAny%Erk^HR+v7{w zyZN2Ob7iFP`@IgYWXA2*uWP=yJg2Qd^QLIUISScGFxFp&F%k(GT~rN| ztXjx?lxPN^`YE`g@u`*73YM+`U?@3_eo#b_}Cr)oAV4WV81`R|D5f> zO|^~9N#I}9u}Eqa>`C^TOtw$)zVBMyXs)JUFDm_4n3GW62@s4`YvIIY*hK3BgU_dM zRsf^*cH6gJ=fw50Ua$!c9&+I^hK}mrAI@*_;KVc7ykrSXH69LaCbNP-N9^{65i6Ge zG@K%T1U&9@aS3rKE&1R_BIzwA7^?{)J3AeZRlvrRr;!|{LhwKAiWrOMnec}XdBRz` z?B9?7v0>%01-`6U{?ojxTR+Jkb%tQ9Mg%llk0H0Zd%AZs1b4S{c+?vNH8pKmy=p%= zyNnn4jE=en>{w|7(_L5$hk~6<9WfG4USqB1uE`?RO6essjVw+k7^^|Rcqa+u4%O~C zsHCKn!|%7n9oa4|{VQmww*dBeVPPJ~$|`WqQ3wFEJf01-WIjDR8`LWUyrT2s(o#+& znFDLq{Jhv$clYLPB6RB5igW(@^(W}kMW1v2{(Ta(Z?6l&%1toVZ${evupSzNJ3QiE z9>yrVr$E-;kra2j$29dZF1L9JLlfg(Ji*qfC^A&I7MjmFZ`r~C4(xvnV@z2LHgd!) zFdWKq5M+0M?OV0NV~V191_*OZOkwJLd?v&h>H_^X&1LXLwh0HUumGgtSh~U1|vpS8N9!I{lH-= zToJ!<68oRm^YndUB8RCE0>eV_KQ^`o9tZ0!n>pnYC2?xLp*w}KZGZG)qskaq1Y`Xn z)Wn5_L{TqFW-?{8NhF^6Jq`6{5O6paOw6jH#2nZk1B;jRtv1h_n8Y$(UbUjlaqc|W zdYrWclUx~k`)3AJ9vzGC4h2P?*t{^otaB*Q75)LJ_p^V(CLZ@M8)#cz{xlt~rD{lr z;>OR;**aBq=dSbT3uStK9ji9y2*Sc^6O7fE^!>uOa%fX?ZXFAOJ03lX3+27@7Ff(@ z#f$3PsUN(KeaNF@sVl3%wVgYmrv+Jb+g9*z0siIdQ6_AHLBghql3Jy>qTBm4BJ zbr~qKJfSV1RVy9Bj@9HO7oS4S%~S|%rb0lWtA#zoW-9!ik`fM6A^4s>3%i4Yep(Lh zZjW9_=Q&SI{DBPu^cP`y5>q-&M%SvtmTmR5&D+23VncX05coZeRdeGV0RjXF5IrFQ z0t5)uU0~%WJ#KC~X~~6RS&b66ZF`)@_SL)hyA1)q3$FsLrbX&{=GzTct#%)%qQvkP z%iXWLA3o;IiRr(7@nWCu%Qpu~oG=~}GveACcVn$!QT6!M`tU!`$ca`KYZLm8nYmq) zU{eAFL%)DmBKw|-nDU@3yDfhIo%?T@tjgp zp^0V_tS*)@nPMYlWxt{bxLbnW%~?CGL!iSBKj-)R?Pto_-aI*1GB|D0))#L35A0pS z{ch_mM>dpQUp?@e{CY?}-g7F-2R(PqWu?QSsPEG#`@2l^r%h@$vq#w@8} zV-Hx|dFO&NUFR}#PpG0*p`Xgikfd(&iug0xtTw;3N=G@I%d`u*%8 z)2D}K&G{lFCMla;rrupqFHcT_RML-1O^u<`HT-rsuU=&5v6H_X9ZhX+7(oPW|0lCf z%=az^XpglcXU@#FoId>oiU;mDv)}&r%0^{=d)!y(O3CIPI_7U_HP8A;K7)a~4>mKk ziJl_!DCJo8)E1c+`kPVo6_Ob__m%nE!zA0Aq(A=j)qQIXH!t0AbUkuDBZ90F_$LKc zUkW8Hvy3UDEy?y}qT^O*k|dO)IPPA~3pZ}J>FA?6_V{%%l5e{A)u&T*w8=>?-o$pv zqBHRozUTv#BNbJwod$smr<wE7&JT~B9D3}>Qj_?X`gXR~yM$FD=h=a-4nYsByv~oF zd3o`}-Opmr_3FAY+B?{G;D+e53O!-@0N4n;N2TwYXZA%dMFF?1+t`#T#*Z0ufLr__F$&Skf-MQN%>$bnads>PH z+7RK>wX1_AFold@Wdi@Cz(Vn58D$xgUhaF>6#|G^u5$B5ngo+}UtUsHn(pi2?wA5P z;#pCy0{~p%W!RAs*RFpZGhp13&~6k`fzuJ6l`vtX-n-=_dI)9l_Sgjt<5B1E?*w!2glS79NSzU3OvTp8T(*wtG*KtJ<$cGQA z1|}aJl{Etm+unb3a^E3qT8wLt()5>VL(62do2#t&q^_n^*qKu|fTRBYR_GV6N9FJR zOZ&~jA0`c8zkioq);8b$Czq^uzvQ`hZ@?1uW%gltPV2X%uXfsdLi5$Z^&TEBL&jNN zHR`DG%5U#6mext4GW-wxx0FO_OWVChehZ1xoW|cCMs8`Z&L7%m@kG88T~$`BK$S`= zBv_fiKWoDxOQ@CFySs1X8Fo4PZiSrb$nHe+xR#t~u zdCfh<{X5VcLfH4Lba&s(K3=wL8NLDO22Z!OtSf!M&AAUJec{r%2UtfEOshG=@m;QG zjZwp+Sqf{9$yQ5`;Ne16jC;g3CNsQ7Gj*?nmQU%zP2kYR(Sg+lrR+aB}sX| zTt@m`*-OvA_dhwkIVjZ&;%4+#?qgkIkP% z(4*)X?R9u3;%&zHsx=h=15vK12 zL&C>GQOT z=H1oF-ydB*V(RVfZJU&?rRsa>?G(oQjcw~vu0iwNPw$+pbmPjQtro|xzcppgDE{69chW0~4Fbvx}SWn0nxwUF|gvNv8LnohwJTDvGn7yX@%fUBRxKmyO*;(4%hj zXj76<(PFjliCGHNkKB7P|0#MjNr5G;Gcd)@Y2Y^YIaPPyx7D@-y=&fRY89)NE%Rlc z_8V^*+7DQh1A7jyv#4vijOQ!~GG_O3R&W&lA^a|yFlkTZ?1SDd@T!Zj!a-rIT4sxf zsrEm9+=8ITuh9e9X-md#ct|Ca%W{}ZNwh)ypQHz|G=~or=^J&3R%k>f8EWqWuW4|Y zXo`Zhf4@e*J(~VsNb5j zh@B5=dxc>`fx)#PUs6H>zFoco6d4(i9b!bPEloOgwt#ogQB7uem-=#6xQzLJn0eFX;@oIR!c8=1$f=92e~UZJ+#M~ zLII7&oj=3{ods<*wOY}G$xLwo=ErR|D|f@5Jr{V=Hf^+qwQFbBh#rkfUQwe= zQ;i|$>`j5|1NwKy%JBD%yt{NAh=++*QPIFO-!vh@x};i~W@HF1eKZ?v2qAX`xAyDZ zsS}8aiPgG{HzK@1OM8OAb;H5kz{znYcz6W<_(rjesXl1%-S2cD-=z z2nE|kaZ&kETuc+Vwq@}WSh;hD!1XZ$20)*V9cx`i@14uR$LE~Db!}}maCMmr(a|sJ zCa|`dX`U8yco}GCs2Nt*21KExWgM=a3>6Xl{=mG>`<5JkvxHj(j0|TjUp#!o6&}T0 zhkkuW!vf1qoM&!E6yp-!XO9hhjDHTphE0b_6IO7kwdMGBC0;uhVjod5n3*jEqroiq z4t{}^86JWE?l^T4u0MJNWBT`p)idh8hxqB!|KWdU&qcwZL!qFfqXq~4R`YC~Ql&P$ zk|9ZTqdzOG(C9%Wr`P2D4Mh|7a3T20euxM^2CAw$;Nl#Jbr7uBsTa?&eE&|L*$&Zn z&VfPOUSPX&FDI5go2EyPt%sP$*Pvg&u`q9rtI+bD+OUE3u80UYe(f6QsHws}hc)=H zurAQhP{t!tfBN(TR@m%j)p5Tqv}mFE%QR_ddPGH^g`jggKw63d?*EZJ>*thPS04We(KgZAzF!m1U%LicyFG&95hB4T1-=jqcx zm63)cF0P;;Tlbx&5k0cA^I_(!O;Cy{3~p}o!N{;{jp-pEu(nU_7~ps{Z8}`ln(i~j zC+v(-bnw9C!Tu`U2fwGrK5T)uFutEwp*ujG`~@{Qip+pZ`0kXK_g>Ju4RgQcb<=IA z1G*OGK6DMq9oF!t-SwWhL>M6o3UXoW_^O%G_>V8(_z4e=J>=EvJ7BYFC@1~R+efh5 zcNHi7fZrN89aPmLpq=8l?I}Dxd`=GNO|0sDAH~Lk+rfhZdjs&>52|xj;2#zqI~E4< zA5KB*)_it+$*x7rl9v>clo&mo!H`iSk&3G$azoNY(B|<3?%tJ$3+KLJ+Le|-dR*Ky z2n{;|*Fy_%VV#?o$=P5H;obWua3sJ@C{2V73(wxT0dG#9ffky=ZM@gr2RTl!3#zmS-B#0J`Lc8>nXj?9l11{z2Caov@NGui=P2>rW^=E;aJe| zEzgNI#v9!>LnSe~%nJy5b<|=yf12C62p1FgsBQdta|O;ANrFmm>QBM zLJg?czo|3yFztyh)Fy(4?G~0DaT^x5u&Rp<3pITAIkO>y&xVzDXLEl|Bi9G4v-=p0 z)-n4yUf&nvIf}E*kwLpTJi>~NJ$o;LvXZ=Dp=wBzhNg$GD8Y-D_J{p@AHb4j1BBi` zZI)iOHmv!Uodj%H>Z3;qz1L*bN{HIGABJ$*uxdh&1q-(F2rD*F0QwOl?P^31k;WBC zl0*gjV@2zJy!^vSelJU1m-i~l->LIpZqkiqf` zva7LSk)Umx?x2LJ#ALEK&+G^;VB{3R+IkD@*twMFx-69ng*3su3h70{2u}K$hUH*C z6SjMu5_q;{bIoeEQyo35^R1ey(+xorQP9@b#p{JOc|`m1@gpxki$zlzD!zZ8Kz>C9 z0@oHzm_8wi$EJ>Dj_6S&e{O0G;OSWxVU*4_-r@{3GPI~OQO$?7lP+i)C?-3nP zP`c#(GZu00A$aX7YX!^0N1<@{UNAPcodSLPjN-9j;l|V(C*W;d449cN1bw}#O_ib| zOE}~Atjr%U!F)Mq*upQcQm(SL0KEJ96@=Wm1Cxgi`>7$Zx+&MKTNmMf-@c{8{sWgm zx1~&-V|XM{x3(uXCYe|h+qNdj#I|kQwr$&XI-Jimq|_(KXKFp$-?@w_yDDV2jpuF3}+RG0+f-HdTyI>ntbFX`x%x`VGwAJ5v|T~N3Y=;{NjwjKcS z_O&Ix{$Moayk2J@N-FCd^ng^JXNhkA;Dmjw-JX!; zd$4k4G-GsYn3$TqW=={qX4qOCa5#QxVj=@yi-G==vvVzS{wfuZ`CuI}mmjWAenYZ} z8Z(BaPfTW}GdSpU=-rx!|4hqY(7v^)uAbWNHpMJc|2!~O!f`@iGq^CsJS|z3uXV{ z2pX#f#)YWtNR%MZuljd`jZP~Jfowp~K11J>g`2IE-ef2OPAssTn^`&ohqU$#7+iO@ zyMGpq-;x_f^k%G9tuv&jKz_fx#JdmeP6?3zvD#z?vVpJ)EDKEo*Xv_=CG3vP*Wu`L zw!Xne82Y@%h?3U*E3A=j=!59Ud!rMbu=(x{k-naR%XLQ*`XaC9vN6}-I8+j?=F9|V zD;8ZWPymgzIs-<~Xuy76xDRZ=RNKE02_p0U5@Y9+5z=C3oLiwPZS;D_?_^ciY(=wn z84DE%^%$_g+CDyB)-JWsV?^I%Sdlvoi zEkZ|)tn(Xl*lqa+gO#O^XUo7Bb2XNfw_X^qe1X`X6xm+v-)O;^{n`>Jm_LnYd!57u ztjIqF@<#oT)qs6dvoX+0cpM3dUB;1{>*9lhzgCdK6_5TMzsf@J*u3?+9a-(1R(I`C%I%p8!QTii) zJAeIa26a3aJ9mBy-GuaYcg{t_a7(_N{Ee^XxZ}&Eo8E`ImtZxqnJXlorw3Bu&Lng z=-)U};-dW``_?0CP3^1}53Z_%{o!{CL84aLgQ=r=(on`J`@@gb5ZPlJFGA-*Ipf<@ zbw$-2F89Sy(_{xztn?}j5fO_!ge3gju<47@O)h+ZNrn*6Ytmg%If-z5NRw89L%*6mV3yPqVOXJe3{#FQ!t-l!e zXJA3y&Yg@cB**q>Gci#qiQdn-k1dA4xR6~>!&I>nmNPHfWuK+Di846|qFua8oiHHl z29eY-pFq(FGP z)%U9efSXbzp|K+Or~-075@&p_gF3y0LN$Q_6$S%zN>loof^jfPkR{k7?x}Efn*;9n zTh1DGU%eGPvrQKTV_jU|x>@G0iSne*Ih^+^ptk6rZj#5itRf_8wJHsD)$u*u7Le?& zhU#TJT_dRoIuYM5Zk47zPOD4#JuuT*WPb^}f{7?V_RWERGUB8_uc12Y@zI*-Ar*{b zBY8}&c(tfH2V{No_f^*WZst}5Ty%Chp6TOYXKxj}U0Pf;AtNOf7ytb`>EqzSs}h*G zA$)gxoAJwCe!U)ODD&Un-Qfs8(||^UI&pbdwzaj{dwF>YqX!1Tj4QCRHutDx0v!|X zIv4y`;M7;5a{pOI-1qZ_-52VstGD99Wqkx$*1|G*B#Qqpth6Wta1mm07+@t=uC%%{ z5Q-s{%l9!ceQBI>Fwm-m-DIYN#zx70hx6kH2#f7z*KH2dPkmlH(J^*CITiuod<*T( zR@*HBxX#!~aCi^C_mQzZ9?f`rqeAZwL_|U&Xtr8u0KmY&RQu{|X)&Uxm*WPL+N3-wYf04`cf$rN z{f4d*4O+Ds_TCs+cWJsK^b#JsZXJGG8V0D@ZkAZDwcsw84@F^>&Jw(7iHepS1Fx=_ zvQkCA?@yCxX~}`0WS(EToshiIP<}p*Y#d7+IOw)l82L#>))6b7SbduW&@B&fGn3;AI zbeKJ<5HJLs2r44M;JJnG(!P2ZFBS5S?EdM&Q;m7ZPJTPjVi$l@2qU+_$(FV>7dq%AnYN8yKHy5>D=txG)Y z7awY=tYd1kug0X^^q&r&u)iD{^zSsuAD8K5FS^L$FF009q%&jBP3s9$i9)pWg@v$n zgZ?fnL7JI``%fp3Zr>)bpB|k(8!!|~e1mo8D1sX&4#XP~>P+Xtjg1+EP?-xHs6#+C zaBY(*P--D4-D_1sGF^6GA;e+-cj-AYAcHO+mXjw>YYis#N zdu=GL4#AbL&x)?pXzYD@Aq@&C_339>X`Q;WnwS{$OCKwdQYFz-9bSaIRR8J&9RVbxYlBA z`Tp@y4Saq~BB}XH1Dri1A|fM;EuZRmWHTFLD{I7|tsTdm^sUVyPQ+Dc@`c!tZ)++H zT{0^l|Ky09^6u4{8L=Le;j^Nvc-^#O8y*Q`ZisvvEUU4PRZ>wI_l~8A3If|RSvZA( z9h6sAc3!wxYb6EVpg2X+bvuf;F?ig38|?#~u6i;uF$%z$M-vPz5Ggu77}6--7G zQ)FDhe^V!Bjp}>}A&A1|AE!ty{;?^-=kcryR1L_>^Z_2bk%Bw?CiSCQXzHNRobNbk zImS3Eke5RYEK0}bXq{swanqr1M{m}AZq6`-Rlsx23*X*IKS1@EzT>*Pb^G&!tPx_A zZ0;emyfD{xxt@JIZG!NDNJ~RP4t5ceRL#kgqZL8j-o->Z%gC1;GGnrX&Ga&Ej{*2Y zLTg;io?%(TOaB)owhj630_>adPd?3^|GH}FM2)<;#-5B~-^Bl1?F?OeG61}~eJy5l zUvM%PD_#vGWm8^q^8l8XIah2f!(LAjvak$qU#)8ao?E+~?a?`>PK>NU642EDMy1-u zz;9`3*?f4g8D6LaxY5Nmjp0bB5gsGv;5J$@{6SVC2S@i81vg?A>eS%ohzTK=B^DIY zLP??D8eIWNi*~=`7Me@th)YTWiKXqEsT_vRxrb3~BIKqZ1Ac2lrcGi!z@gFjOY5 zkomiV!>yo*$oI`2ZeV{jBI`buphxg2XHlRO%|E7v%S(y_Vom{Nc|7wa{du%+L5enFa{p zd#0>OQn2$AXvk(jbD3G|EH`T`rF*7cyuS;XZTYaV*w%pPCQJpSajb$hoNiWCX~`{N z#=@1@ZcV|Q&wLPL(dJ_zHZ=S=*RBT_{tg-`ApDbu3Ax)F1D^^i>+| z7#eKsy{)vd5qxl-k1K*ECQKAm6@CQ)*w1gg!y%yxcFYanJS`f%d*nOIcPGmX5(M)N zus^r2sr|cU{)(Le}2D4}kXee)0EcQx1dJI7<95tJl>Y6_v z+l26QMh5KLV%3iOXF(`ACcS0^LC@PeR?XFIx#+X0Ucat%(e+lNDXE!xBM||KVgK=; zaA%&AR@G9-e8?Wt@4&j}wNn;P#8^6T~PAk_2oO_Kor9THC+GwubldZG0i zG%{%As9%v<{G**GLG&kL>`D}`!AZ=3)V-<-+0;mTElEv&MhrNXXK>SO#Q;=#i`Zjb z@Wy=B!YVImzMRvlFwX^dZryIHKH)DB-QLeX+iC(dR?8e`u#TOuWnXKw$9Mix%5n^w4k%!GcnPSktZ`1NL-TeI>Y9<-O19e?Y^hw;Sldm z{v_gf3tVm;#Y!f66zFEdlQT=zH!tTCSzX^V_@G`Q@Wn0A<|*RM#!zclCjOJa&QG>S zrey2<+LAn7cVNeyh+9Hr`EFTN+$1F>JW@iK8+~V>Rk+sbQQdiCG8-T0T$D`y4Q`lI zkW-oM4HBco<-EtHU}|8{e^>BIYaO$pm@#|FE38JMEEh+1phWd$W9ovwTt^7;hB~jm z=P@f@gF#8$?EM79f{)#tA2VWxBHTH^!3pS!L3NiD_qC2!*>X_tLV}Bk_J95*;sBppg_8^(ud7tI9>_d#}5-x#0l8Qh%8# zZp82M{em#SufMIJ=s^fXP~CPZ@AATSI$Oo&^Ogu1!Qtj)t3t#(64WQelaL(GS1eUY zdn^VCMdF0rSB%H6iSdbDeS9Qo%R*N3oi2-8ZLaI+HAP$~QqD#yCyRED3eqz%Ng7ix zCA2v|OGucLQ;S0~J}8z8gDF0o)Y$8fK!6oNoSW-zJm!egQqe)$@@r1Ul6}QY^w~ajK<4juJR)`TtleHX*D&vEwyd%< zm6zv4#-cnHmi)47LTKK2cl+V|sJf(q@)LZKA4Wf87}-z<#pf-@Z><^eg%?7#RXi?Z z%resBXRm$J;hiJrZf!c(e=KY#&fi?s zf>=zz+?`YQb<}ccdvU%L+4nKa4*{+`=j{D``+A}B`qAM+Od}8>^(O0$0M@^*PApBu zS*KSt*h;HX$5x<9P2-Uj=$F&Yo=evLUfrQu!IzFl z0W>0z8I_j3Yk#J%FImR%h-lBTyZS@I=e4x`h-jl>h*+QF(?P!T(Ku>;R#Pmy?(m!g z>_E!YItsFQ?rpa4+30K5sM5rckb0BKFMpDff=p&s_AS+(*d0AyO5mulxVdNhd%w{e z3L8>Z$-vH(%5pDvTf+>8uv$Knx!oV*jf{`$UBv|v3U>sS4hsdO11raES@`d8aCepM zlECVPNu&fD@dEY^Utm4eP=Mh&Y{`Aw&BlzErNfq;OPIj%l}l=pa?{DE!=dQUSzkU z$8>?x1mNeZbp_qbfWyDm+7n@xw(HT&0luyfme}}4FI^&`95 zm_yI5Qq8gl2u1iz`~A;Pz;v)w?wnI)IyFT4rILz-;~7iPwC-rGcpzG?D=m&cz4etz1JnCRf$-)y*cPo% zYf-GFQg}$l*5b`n*&3E%W#@h#`4tON+YU9hbc~?p`#A`a;jdj7pHjr9q`{%H8z$Ri~9+7)!z*| z`IR_CX6brur^_Qgdsv37F-eL@oavE(yQSB#FJMD+%LqrBJ!RjyyoD&1bbWped>17t&p$h%91^8j#j)|(q!2T_eDNf#Hf6ND+D>2SWoWJ9PE z?=1_lFsUD!d&ioZj2KzaEqjJ+y#caN$n7#6;d2`wVHz`?!R&oG>I5lll3Rb6E;q(f zK3YA$$pM)}o7bZ;iw3ZaEbSqFc=5g9nHz4&{SCm*mZ zM9_ojl#nttr9T!Xdr9x>+T8e-Las@^b4Joqt9JB4(kWD$3UsGR#IDBxt_ouEzl$82 zgzyo9XP_cjh@I%wbvom8&je-&ddP?bM%nDXwiyXyy18-L@jR@ppI5ctjvrMYW2#g5 zy^N@^m&_2D+;aLZsx6n`w*jF63P~Sd6riCYXF0Enh@%P8RYb40Y0FxCQ{x7?_ zE(ps(x9cKEKx-;%?JdF0sP^!@(WGzFIyW(SxrzM@_^AuyMYcSCtn)_|wbr>|Q-X;0 z&wdQQ4n2|w*2Bu>F$7&7&?927wZDCnPradcz|<(iW7uVYSPe|44hi}@WPI1fuHnip zpr8>i^A8bJ&@0EjfBnH^G0bF#Jrd4&*0VC+T{`|gU^dCGNu6(q{q1RSi_|I3=kwhi zi3TF6qcu`&=^rB#b8?)H{k%n!>Rc5C&Z9*7n*Ei@ z=~m56Y-Vw(WynG9!o|s$)OEGI3wC;FX>;LP{`p$8_uKXI?RI>uXn17Qd&TYKVWK@_ zn(s7*1IK+{#6&xqnTT>1lq=fjmrtU6spPUi%C-UMS4pps!0N5g|JF_eCC(~i;OatLfVg%-PYH=rX!L6CePk)N*ea(Z+3a34QYWnD@)A?e8J zk7+S{c#x%o7_d&K12B55)xofjW!s8!PPCSQZ{1P%tULaT@2Q!Ztufa0 zrpW5s_*kLw;`Ve02HOq)Rf9e?c?6kMrN)D;zO{GQTerykc2e2cL^h;gm+GQG^UJk< zN%O<^Ps_VhbpnB&#bo2$hj}t>q&v4&k-BOX`rKg{%{qNRcIP(tp_0nTsgv`CeyfMO zag@GqKqAb$CurpIRMiQxiLcz`*<@r>4@Fo=I{zZsvyz67heP!d<%Flxf&+XM+>N7$Pf%ASM{u{*j=022e0mM5pSP1`Xim|MuX|pAlL!FP?MlmZ4+6L03F8jIXN4+s3vE)Wt7aFcN(XG zJAd+sF0G-}v(Mfpa|*$iYRIy*Kbb%YQ^@F;&p#)XCva=hj>XnDBu{LY(-H~rEeVxR7zRqhNEaxtE>dgtPwhwGY*E>r2>r|@DZ=3FbiuguJ!a@70h z8uUTEdhI{WbQg~_tCj9UNLw;6>wXUATbGmT+LMI%`8`;xng z;)*(UYQWDQ0w4ULwhGs%spET|isj}E=yLE7hY!CV2I7WfP@9-~yTlqp_YC@@W^XG} zIpL-EJ%s*?N5fR%ecq`|t{+;*X2~~;7ZJ63k1x`!?(|?6!`#)P1Yc)gW@*FQyz4b# zUpC3)g4Zc<92S&I6kUzWz^miF_((4A9`&x}BdS1KEtG;<(0a}g*0*0~V_%ZShgy)iT4w|V`N#;GL zr;-y*rnnmQi$7YLJ%y~;HJvve=%K5&L=xd#dyoL`k$fcAX|W>YrPpA#JYowT!~_2i z<`&kyg_EYUL?qo_uTKZ(Jr#|ObVUud(efVLQ-8KnG#n1ome&+peK+@D84W9Rk!e|L zo3^&L23X#`Clyz^X$`2Z(GBFv`rg+})5A|-Ri>=$cDlb3@Y{fVVftW5lOfok8v|pP z@0s{@Yv~S{avDj(ctiQ7U}I43pIJSmyw17feyLFPJOSFAg=Yex<0ohxNb-MW{W3tN zoptjo>9IvaXCu}qVDytA6Mrl^8qBt=l=^w`F{5nAac5zVPJzx)rM}y$$4LV$| zHlH|WiK4-{FZq}}Z+1moDM>fF5IZDt!_m!W=(6RLytLmI6KlP3gw%koML44fbbzO8 zHO4PV7CNV^&G0;N;(#WNOd8ZgHhqL--@@-||58y&hI9e`7tS)G_6xom=qQPOdU2Nb zIux^{iAAWDzJx9Wg(vO+QxgW-zkf$TdSVZ&TugpoG=ERb|MOJ@<1ZhX4AxH+8@3x> z5-_JQlaN3}`eozsx9Gz{8j0zV@33~h@VmL1)bUI=dza@|&{4&kZ>j!qT={eT2?r@~ z2Z?MDUbJTrCnvSX9-w=zR$M712Q;niNICGzl-z5yzQGn0SewgYiRp!uP9&I!H+sN8;s z(9Llge>v0N#8n0H@RF4ceVi|W-4C9#kVLxQ34cYOaV8r9SU3m^`RE64w>yJOt*6$U zV<4+Qk6S_Z0m)k+$O;`>CqzL{ADHf_F>nysr9Z96!~`CM766Dvn!x6)kTJ#}t3pP^ z@0u$L{r27uOGwWTWwXfzHZ)KI2VCSR9A*y)4<}uejD&%v&MH}>=^L?Y=ye7jPEJVy zw3Mj-Ov#1vWJjnLh|Zw$k*%92+#>_W>vE-s(#-tFi4y{)S(`1uH_gcJcq0JR5N7_ozRsC!LaXVGg63HDTeZ0-<54ce??xNoM_SE0RR&P)lh`5 z(|p{jN;~Kc3>|HD=lZ)&?rK*6X#7>f7NE1nr*p)KzBc&! zFxsqVmKNX9B5Nsnn9-Ta(5A)?+tQ+(g%?M~nSz>rP)VF|_Qbg0$v{p{4iv`T-d{h& zjI0)*8WoU{7* zy_nQ-hoZHE*3f3{vI#6IR@GKL>Y8x~XC94(Zs+7wLTV`~o9Q|$GEj_6_Mx?8WhSlE z{DXI|Oa%<&zQvZ-hg7501^In(;4IcQR4~s;sh4-#LbmqC%+AUn z@0868$DX|1A0P!OevZ@LY-)QEeObm=o(djy>HX#uRA!coJue*ATaYMDVli0zz4o4b zIwc;Nu*;@2&4Hff@yQc$tH&4ImSC}DyoLHnsL{llLpDD>PPO(*U^{&BC#eWXYO_C2 zRP0>gRaWTC%zzqwEzDyjQp9l)NjoXctzIM8|FT540Bc8SZx16_o3 z?Ty`+QtL9qmC7)qu+vR7_oS22!hB9AVJAbnNK+K1Ru7yllD&!tHkZNJtaBh%ILq}6 z3?NKOlrs$`vKtY}Wa|78GED{4%^4@s0f>g5`EnxjrEyvBSS~Mg!)q%p2YfSs%_y6| zKe$~(2vlqPg=CR_Pmh9(*PAf7FV}G`VIG8<Grn9J~&WOnNk;)QX7^S-=?=M{jI@q0W9>DoY3b zZav=;LpYywMnO3^X@;Th<}rjl7e#N3!BCCwV2MbY*u!ee2YU)!MDXhquh;cSB1>ih zdrnwD&)dVPi~V(S^tXzl!u(V(sm{d4X0Bp`lhdlx$KOsv>X>3yPEK_k;oIy?{UJ*A zVygL)47jM`f`NX~Vzd-0yHaar%a|)KVymZv_W-Mrk>{9BqOvkGIHl*aR*vUSVvwuR zV#fTz*rnPlL4`R@l~~z|9P-_668)fOcn2kkX0{($faCTgqP&DWYdkfvlY}P8}rKnLsB1^W{aZn^qhC#0d zof#Hj%V_SppVstt%f%IVUA^jw71RE7Kh-QaUn+ESW@!s~N?+L3xJRb$sV2?^jpd(3b6aGW9UOU>V@=n#>B5`sK-80I6aX(+?s zS8W3CNQp74506`I1KO(JlZ&Q?G|UwvFZGzSU!4>8n>UYePrXS@7QRSaVbhp=Tr*)v z411dWTIEq1WXWiKuk>>hI}Th`r(=_Pkci})9{h7uBA>B_q@3b>$ekb!cYJs{(TtgL zqp+bAnjWa=ymB(jLCCm27>_W2qB6BQo}iMGv&IkR+`c&A5)pWm@(C7aUb*=cr>pbB z@Rv_G8G=-7t1Us_9GbF_Me_$Vz6UPMbFArzsrg1U`G$o&(({P1OFB<8r|FCz~p`#5dD7^{d$s;N14oPjl_^_ zyr0f5+zgfc{$)MdN86XL$7aP)pR#TUykZfNXbgTZgw9swlI+7tdS(pFTvEQkA8i&7 z1evS0gCf{Hj1j7}xIvw-^k|rYS#Q{czo}1V%&VBaQg!NQ#fCx@Sg zaxBr>b@y|9ep`RBF^cfNz1+DlGBSFjWw=V%lu94Cms1RMbavW_*{jMnMlYqfXjp}6;N<5#3+(i=HepP z>t$=I-C#!7pP8G>o{1(xmO%Yuv$>u|>t;WA{;|=6lAikg&&9yE&%c!V`2Qgh^yLH! zEYT-tT4%qIV4Z_z-jtPw1#K=juxAT33c15qn`d0#Viw2%9veMR@9wr!GohnNdYUm4 z2t~RLFyR;})MZOXU?&*s=Ie&8#n?6wx>FQ^#9|xUL(u~HCqQKQ`hAerD(zX^%tKT( z!jFF{BAZ)ef6%Ymf7rdoxSMabJ~y6v*uPk}XIsoW%l0CCg~>@Ixh0jf;hh^0Jk8N^ zIs3sHwu#yzKePW9dnHjYW=~^BOi~(#&-wDaDj;K%aqU7!AJ{9fxl%#DFu~=X%Sqfs zZb~p7_xm83*Dcyg0vmhmK{RpbI{IgqF9DctPq@y;4?l0=Toj!MsV#u1aWrs|Xdskp zwy@||n`cBxiA3~?e0A?D?jct}^vPiut0&!Z@H#G=LI%2UvN>CZspb7?f#afTo-Y&I zl*pd-H~m9m6uuM;2UL|ETiyT+yaPiu$X0g4S>T$ANs?k8j zVPAJBOcP3K*``V{>9B>?D~dFJUt)M{BSgs*1Y{;|_8%RtIG~LtRsM;ktuV0M4VaI^ z)H6b^=itfl0jDQn-QGJr5O8|Kqo_g>Ld1;Xb3)-iX-PqLca5YRx2t0c3UJ*#Xo7%B z12p!H`5=?Cc@MuhDr~Sq#A;06c6BO^GXB$AI*UF8?!7McH6K6)PyfM!e@4y{u~2G1 zX#R(1j^}fLmc&exJEyMB2!t_kX;E*W757h`;jruZo{P2fUa&dwkBF!lW$1Dumfen- zeOX^(GjE!nd0L^&#SQz8ys6Bs7j+pK5E@$c{vdnFy4f)gLFp1_j5^I`0+T7mZM;>O zn*kw%YS~c4Yg*Rk#rv80dH?BLU+Dd>OK*k$_;_i?evz_E*_v6=EI$NhYB@iG7aD`0-o%k=W4ewkLTPO zHtq0MpCIt?c%N?y$2d6LX58wUmi-9mn;wyo)p$E_`cz^qL5<^*;=Y+izHED+lJMaK z<2=7Th0cDw?yY7qz&pY|jkeL&;m>S=zuvQcUoGr`+M#DkrM;d+)PZw~Z92ZbPltO_iuNnp6Yx z9JSPT$Y5*j)@9*nWBX4QjFH3i@gTVUzOg3=4+sqZ1(%=>PRU3>nTd$pIqvw{?yuHt zE)nY=R_yXo!-P9-`5Q8wD+7nH|1%07cq19seH1ps5nM(3VlA1E<{NgWQag!b5NzQV zRk1Usk9LW0on3UjPp)-(6mdQ_0m-~;r`qGLVj{{+aO?43#rh7J;Vr#PtStzJz!aw= zMhdzcQ0huryB|2V#33!cLEoR4{1p8O^7DRTOo3a2VPUDKvCgN5-poq<79B!r^D-td zGi%ws!Pp&Mb-(Mif3#Y*KmGBE2zCCfnpaZ-?#`)S=leza{KyNYLX!)vu}~Giikq!} zhSsj4zc<1t5TGTTh4RK$c`61v;Dj(2_zWwt!js1j4% z&o6IIhRWg?ohylh>MGlTx_x`WcR+j0=0~DbSFf|0E6RNx($~;y=0?rO>O0$s-MKyR zWbp1_#Kdy>FwS5h;VmkrwAST=AMCpO)n!-%x;^HG6-(kdrgtnFY#n$O-EHl}9q+;Km40n#}&ls%K zkkS}8+Enh5xk%Q}U0tx=)P_%c{OnbF(@!%j&gw$}A!{ouD}itA6^_job2FRX-|=RA zjC9lalF&&|WFe3UT>RtYeBTpLiR$_U* zpu{2!C-vD~gUgi-T|sgF$?kDR#fbRmbn+Km-m2ZUI2N{Z;Dbh6t}Ds&i{T!G8F+Xo z#GScfyIb^U^>!7WBe@(vZNu!sp`xO);~uf9D%?JK7>MZw{@q>YyJiA6NL+T~lI^(a zR(>vmX%I%lWI%j!!3aJ!mF;7`=14Mh508x32R!ua7KqEs!>DQ6hMu4EJR^T0*ob&6 z!AWB$;J3S{+gt8+*H9F{pMfyrP|Z);<> z*@NYH*T{nxPNfYjy{af#ay3|`f32LlD&^vFdxnHW&`=?TFU;8!P5|!Zho8GU^cz+F zUH~r;Nmb14u?y*Q*v1xTjWF$JnZx&M?&F}Z`uX7))gi9=ifWjRMcKV5ndcqnTktA= zr!Yq!A{zLwN^0KQJ4TR7qkc}`R~E!r)s!3;h$Q8Gi(j#jn(yZxtkxOS-=-~0^mhb+ z02WwquzQ`)o>Tr63<7r$9L=40zv*wUr>Y;wYQz0OVs0XET#m4(Eyj5Ns-au7&S%Ve zOB=&zC(008G(9||Oz`+!LwejX*sJx@vR|S^x14v5=*1vj@fbD%K!zm76G?m=>e;kUvmx+dH5ZG}QnWRm_~mjRi6f z@(OIgBa)^nXiYWF?nPeV-*SdvsAK zT8-$hH{6*~x_NzwL@$^V5<)Z>sA7qq&f%zsP?+zIkP>6V1Pb?`*(08@x|LhVyFgZB zU@N3{i?8==`Hg6vUYqk9e*%BFl-QZ0WyBw@Ulw{WuGhMX6uVz%n#+3)1$qX|<*st%jHcHUJL7$s1qKOE zWOYNnBdTCsm8*&QgDX<%)^)3Jacy_5A`Y!CbR#4u?K4hl+8v9NC1zB~p&W*i5)1eB zAnot^k+F?E9~T!dpe!yE44FE8Ai>d9o~$@xwsGZtLuJ+x)7AG;YxqIMr`h)KT(6M| zaLq*&k|wv^Bw>^GZ+2H?u-Y>&fDq)QgbqY$&S3k78{ODm!*;i-jS=g}rQb-!ta% z?teD6d%b7lSp{PnX)NG1>%H-N0)5F-4@a)W)2lZpHaa-mow6f-eE@5PP$BxL^9fnc zvP=`zAF@}%Wo@7j3s3A@ZZl21Y!ia{vira(#XPqL00!0P-D6qR1^sL4$%XQs` zr5AqH^?2Ccdb!~RMP|OM%j&&Lw`W$*n$ipC7g|sp%P>G;XBWp~Kb-{550r_;awX#p z0(KwY%-32V7X1(UKRi7%Xn28%5qDBXKTD_I-)YoTPR=kKI8n)Dts#Sx*@XUbGGL-* z#qpa?lLR~zgM1H5`NIGZ@-^MdTQ-uzzN5WBv+g~#z%g-Sc`pZa^yBVp+vab zJ@nVWRe2w}yw=z~yFRynkXYTWPGQq3p!P;UJlM%5DI9nD)Vk$+j_YGB>=S;_wr@XC zJQ0tF6W-UJjcG%YQ$d}d9XkQP3Br7R(`rjTL&l$B-vb%VpqoFtCBKlQKqj|spMrvx z7UuR&8Z%i7mNq{Sd8}!o@MWnlqBwXhzTDwvNSK*ZGx4?4rA+3(tNpVek58gJauA3> z$_vUbY*iJ*;{6}RPDP25mt6ULiKQ8gi{51yDmPE$W#1f7xcO24zasg+j1w|wByi~y zh))Xq#~y$Y{1+jN-7FFgRDqtk?_S;?MLYp98=Ns}r0u#t97r`8SSX4DI=ZgZCo(sA z-&{P1D)^LERm*kDQ|oSTmi+%I2=+Teo5qX8saM>~EuK%y&lvPv?73YZt4ofLWDoHx zl>(LK9*rOLCW9N6i8bt;(!oRznh+}Y$&DqnTrOV>(tNo!$F+IkfFk=0|i@;e0p@Qq7*ad4uC%KNzzW(dek_}aB^vfuR$40!} z^!HsajBI?xYvZdG_>d%p6-&m+?`yWD8=NaRfWm*f)@1G)9AL%xY?ktra5-gqKEqG& z!aqGtHF*$oX3U9+QQ7~(S!s=jX+k7Mzd#J*sOv}Zo)E?*$E~;LY%wp`qr8I4VOH^+ zV1Cr}d|wpe{OHrYMZG+Bz~EeW?61gz8NQMM(n%pf(m?HnZ0cPo<*M`OB#(oCkWe`J zN_S#VDrvL>H4I>B&&tKc;+EtO4|*y;~yWr*@sxAiZM`IJ5y_Ntr2k$A}Is3|BD`50>N zx~IN)H@yvIpn5nVC1hoL>W|;R#>K|mhJ_DT3rW`R77g3LP*jeyx2|3vIzRL4#?8Rg zWf+QgQX*xWwS1`bJZ2aioqR5(1+Q#u0Zl43+RY!I=O3C2udDnJYG7u$98K|mcH*>{ z@98YT4$_ubLNqX_)PGI{F5yNG#Gk+eb}Yb4ze(DEr-kc;1q(NvB zw9$nW&?pfk`J82Yi9No__N=V1d%gUP=EsDOU<+3YIvqHL$GyJIbL2tjPKl=g+}d=U zaNVWWruFrjlg!ZN>|Ly6k5~2{C_W{5Clf6L1K8L}-g6XsQPm<;;%H0B=+lQu;>R!$ z7u))}b*75K>qF(%pQ!((U4OW+vvqLG)f&&4e9OVZV?YRNB>uJ9>U5EAxMnRhY$B}r z%X_?}T&~W`c4TK+&W=dOM{|~-R~AvRl@;S%$dT% zZZ{_vI~eyq1_N zx*5C_CBXrCKFO$-IOeoJSJ&<-`Of*g=b$tNEZB~?dVQEkjIlH)Jqp?I-(KORq;*xZ0J_^r^D(H-Dml9E ztuhI9Euq@HOG4T*9=>CYfRiGM>@2EA_;;`y@FRPPwb>#eagvgU-;DFyM-9B>Bb&rPqo4V%I9p;*HCUnOqN9E(M z9*919QEUvlgWn@(%-+@Y(}*CGWryy(vk5hGdvz<$dZo(qa<=RbOPzpd; zVUk8ZF?Xy9U*mahR5hNrnr2cdc8uWL{{r=C~mp4 zlnhni-8u}=)1h@H+ZPx+WID*tJvko`d3^{Q&J)>hlnWjO`N` zKiRb_#yCIpACe1r761>hk2m|F5)bdcI)!cAn0rVvo;8S{b}==2+W*OPc_gjzap{xG zE3@3T{Ps4N@to-U|Tvl)vdBhb=;tF<(80T`?<@Ku8M*btbMH*rxYUqH4toyx~Tp z2J4g0(RtZ62nmgiT!Q4};=A^r$gqJ65&>Rsg8}lXOz9XG>rdC9d?^22osSZz#eWfd zF(5}DId|Z%I|oStR#Eo|4h<rJqT z6)r+hm5ZMdqy!!CYo2q z5O$gF;y<+UDM<973w3jPR{`eL17kR3yTX0--xjDG^XhL4LpjWTMI^Qo9729b`{$JKodnVdst6e{SXjWel19R4~)u%`xPVp~l zSeb1k)l?BXt>F}nNYGhsNo(`I%nH|3>cN@NCjBH44x*3*Hyjg~wpxVR*Rk)ZvVXkC zqFIU~6)yk)0PL^#XOF|1o15jdvqWXQtYlnVjqJrc98(h$00vrGvH%*jo0SNRIJ{&9+(a%(f1!%q&Q;=%` zL)$<8AgG&!iNJS!;aklK-RH!lDVihYexcCyNkV2rxfFv*)T*|Q#&{UgrZD1HhQeI( zxQ3L@x$%b#@x!C>v4(0$v3XgRF3YaW~w|aP&j(lovkpN z*>erbw}#=R>a{n1qJOviOhp;Ul$8g{48ZhiD!Vh8a(-cLKu1!4(#jav+Rzy(fw zcLyR-&Os9vZRQGO8dG6&0s)|VSs6Bp*TcEi6o|B+V+-6z7V!H~d12j_ZD(h9mdc=2yVc)M zf%p!1bd0^MivIjle}$y_eR20Aes0hqEDGFK|C>(jOs6w*1e1|qF2D+X{+JDyqk0Qq zyVhH_u3KHx6u$9T_a*eQ`Z_jL!P`dHSv+D0GWU0!(MvcAi9_(-Qk8+uSHAxK{=15X z6bgR)EjI0n+isL&?usZ`l>`b%^}_BJakM)3^YuEf`+00I7EXGRE$^y}(6+7c4;~J$ z)jvZRVXT|>z|)E}JmcV|A1eoZX0j}C!v`qLM8vPxw|k8gvtJKSf)x>jPgYF-bAnuM zt{+XcwMvdKI1=d8rjh^X$Vd)!%!G<|NiF`w$ao4+%?`dUCts1IvG;h=h8S~6W(9w zocLk=$^0L&p%F{7M^8bM(xlIA{<5v39i-6#x68f_2Izkn#=dW?2_iM-_{02FprVn5 ze>Aq7DHvFijwRj^#L8AIng5dyU$y7G82<94nQuS@haQcK&V{a^)jFE{>eFz+X8&e* zok^o}?<(ve?9%WHFqYytDE&UD6J|_^W^H40Ht}09ehrI$=F{S_V6S2HhPO%g_eDsu zw2lsc3)Mk!ea;s_N_9ss-4eA}BT(DKL3s(xwQCgR;sIt+6iT>Dwj1r0G|M6xrV_e= zxRCTwU-*30EAA}pmX?F$07=lyG%qv^db5xo{$ysY!3JmOasdrA1nBTFd{IF89S$=E zl79a(KP-ne){f*Y6?iUq;9pI$hkTTv4%tcaQmfzCkDjIA>sz$j2=i?{KT8=Ae}Ecj zc3&TmCvS%|myGAY4Q;B)EbC6JHz2YG>x1iZ*m;*wb9{v%3{+dYB^VfQbs2!Hv#1mF znD8Bg_l%~h%?%34q?ITw!9=LwXUt#T`$8AlnMNnN&ezw9s2**O8{e(@0ne#|7*)Q{ zWDZDp^H7z(ZM1PhZWCHE27R0qSRQWj2UQnJWASNe%kbi4d{l`e(W9IK{QNq2?}rBm zw0R?lh&v6Qezs5Enq&SoU5t>ARp=jYwlODyWUJ^6HMdGujklr#=lhou+!~t}Es;l^ zhg_m@c4}Q04F{mSHOA;SZ*s^KRF~pLMU!davZ-6*x`(uj0Bb85TkdC*SYpAPsl=3` z_w&tm?vmBBDFlJkdx4h116ED#Otv!T`)VXOA|fK<35;*PI@;RAq7O}j#YXvB8h8Al z!k z(vzY>BxK(YMN8%fKTAH&bPpI-;tu{>6E=XcYedNb3TiCa42Wwp7B*h4;U1p<^&}W_ zGGgSAYMzTuDCqzR5C7}K;k~HT5dJ0}9*)#vnIcy-8&?j;a@(KN^)%nG^yfA_$3v-> z3O5ME!@_5m`GsXUx3+c?r7m^4-@i~kxvdk|QNsFtO>HC{86?4up$I{GTKFL+Y+yxO z#_#|EM@s?pW5G=dtK`#OiXg$1qL1VFctr-C6KM50h+@!|ucHCv-Me`?9zRjx$WRo! zc2Xm#;z!O0Juqxy;?QRvNBBN12vBIJ`wG^Uek#`gHu?EEmb^-#sv^GhDxtisU@rT! zf8BFY8t0KKJEUjX#-KPCV?%OY0C;Fc5kHn9s12iLcsx12SdY&&(48STM zxnJ6DdvhiB33XP6$Of46a2I&^;1wiDgPi(==_66j0XD>ey6Q`_w}sOO;!=CasF`O|NT zUI5KN=H4++x4iNMOx~t^azNNt3ooz$vA^olML%j1&PWpEF#HCY8N@uX0PiCZPDIzw z`_&`e>3Xd61(xV9+xc+ByQq?dOMU|Tbc=DUWR=n-qqYlsXLX{Z&I&h@iUB4u4=Gor zAm631z5I0N^bQ6b6R46GNCj?{9Z2h@2+>qCRn`j8RnbUvtVeQnX>ROUNU+tAF0VoK zWB8>2*9>w2?tg5J|NrYG&d{iUVkRat7ajoZ_w!hm4v^Ns$dZv+$6#}=y9XT z$wi7(0iM@TtOvUW`+c%VsZyhnrtdp%mQo z5kT>~(?zyA%|}E0r)#ci-SS&7x5^{uP;2%)^>f2$t~MyLf;;Lp!0C zR!dx3k{Ao-zX1-(!Rb=|4Tn5Z)cQpu{^ap;K_M=Wbg8MHBmN}yY8}kX6Ds~hx=+jo zP}Tq2o~$rjzu5sqxhf^gz32D9`imfOrFpRDob#U-*%DUS4C~J~W_o%s*9CL3xfusG zVd0~a=cEFjt3L(gsPx05y`>-T+t*k-;K~4%8ufeYO$8m({QZM67B3eP9*^r^(=J$8 zo|c=sNa#X-7)<+|0N6oN&`{6#m%LOKm-l^GM#ReXF)0}GCz1C*y#g0det*e3V8oEu zb!=FC`hCz3C1j+ zl11-}1FZ`k3s~-i2||wBg_oGu3-@x}EAhuTsQWIEEkU-|Sf(!+ogbHifKVZLeMhi# z;=xA%0TTrU01zFo4#ZJk)mPgzqh%u%5(|DU$@`L`lpd68A+-+r_OKg%DW#>|>xJL( z9tK!)I+E?*^6aMJenArfX+F@$z${& z<@}xq8IA#dR@IAHkzyaF``+#{V3>Tpl^l*s1^kCfHen7l+IwJ3;kv){MRc*;(%9xr ziV?c(?{CU0Spvzv@QR5J4vT{`GGd0`W}=8!Pw5}jz+G%@zL<8R5EhX$(s9ybXj|QO zN~2?_3X6#aNR@~?TG5uyJJAdm3L8JGCrO)#tK%2znTxzWvoxsQl^e)hsa z0#sG~IC_b{*=!;DDRID1pKQfW8c*!6fm&n=;4=Sv0~9vWs8S)AaTov#GNZsm^d(2z&~fDF%& zP5&jA1((mu2a&MdS}mmjzn4OPHFv5ixbq)Tn(u-cMnbS~Ffee9Tdoprs#!r>85xJ&!Z(yP&tB_5`l%+jlt}h0FxB|QC#tpNVmt*hQN13g;RJom87Z~J9*TkInOLORwqAi(5|_h?w3 z)2J3XO9%~R6{Ms0&=U6e{D7nGsAfS?7*G0oCx2lu(aBP! zFgWk?jB=d6-dE-;S|W%a+>4WGRwl z@l~g9_Fzf}X#_&_Wzl#l4>pn#bunCc9m7$FCppK;x3vRQ! z0KxxNJDR>okGh)?5Ouycu4nk#I3RW_CT?thRTq~=q3iv7=2vy29D1{mbHjk&nlth( zTqPCcqCuouBRSW^D%MG_Z!~z^vD$b-%BBa9L`YCe@XJu*;^L5i_E4Et zRuA+nE_R?2d(xFyJ7l~z6ME_hV?s$+z?o$P@!Jc+LOQ(Ml`zv&!`L*nV|pOfLZ4CNn}^{RFq zX=$?i{+USjZmS6TN7wy9RGh~s4ex?s(JmpXr<(RG&|G|NjWv z+c^eeQEBCLdvUVy7VYORcszht8Da?xvtlY3baqq>`yW}IHlv4Pj5*(6Ft^+Nv!*Ln zg`7n~gMA%sv2ZTiHi&HfFCcHh^fUA5g_q2%3GRXQ9nI zL~y*0tg_QRAuGc>b*%Y|Vbr-K8e$IQAP)SmwHz zvUh)Xo|$|a+YekOAZpx=Uf(=q=`yOSVi(v_?{ru3&am z>9zxM?lIu3sH%=Dy=nUffsf>_;-xlpUp>?B!rCwTbU5b*BQ)wd!g_8_tnajeoY_BOD%0!`KLqyO|6e%ypmgsODw^kz^Q)CrTGS51ReT>u1BmJ7YKM@0nD~`4 z9bnD@$-n@6bn`tG(EXRrbV8SoW>{2_%Yq5QJs~+is+&V{v9!+9`P)+hCI!!15>Zl# zfazWzNak0wAo%YDuseXr*$$nV_BW)qekZ+BA3>H$cvAnG?{o4e%B zn9ZQl_we=gKNT=|QBG+rk}ynqGSHHeoH=H^z}OZ{shHy43W5QFC0FV+ado@oV)Ym# zgnJgSWLzJ(q=N&fH(;Egyyre_OfHtc7bvs_gSnh*`>{~$fv*0$bW$z=^!%aJ&H(cB z37mjHdO>N;Xb*3;lMN_FYtjlV>6lKe^U2ed|7ro1%TDL#VwcV!r54iCCzaT6kpi(1 zfN~z!BV?Ao2Tv?lQf#8fkzDeaC- zEojJ0WxkrHA)(~ujqrO=Fns|5mPAs>R=ME^#{M9Y*-5x#CS&`)@+#BLlI05ee{lUS zGK*9|;c<)p-$ncMN$5f`2puc(XeTaF++@9gwkzEEWF=&!wZih-LMi^_;{ML)V%^h$ zSG(DPaJq%PJ?c|=&nudcb-$vtK88p;aLxbr>(i`lKFF2l+H2B%wT8nGM@32-GZePf zkqNu|@0da0D(IMC??+FFMXOS72y*eo&ioAg2~y5zckCLSr5;0Ge+WN?_h((?xQ?mct3+di?WA9|gH z4|=89ae2zs?Z@q&>6rvQr2gIl<57qy`u(Xfh*xdxTFAE_;bM8f`YdXq?98+~O59(d zI*A`Ompx*bt6k#u+>yptN?9;1Udd^j1w3p`yWY8AMe4x&0)6H0x}X^e6BPpkhJ7wH z%R>XCyuEq4Vwq?7y3Sd+Dd2u8d}s-Ulw57~7%M5o zU!B-Dh-_;Ur#1;VId4yvNPR7XiW@og0ODc>#766P03q$7Bg|SQTngm(A`B_z1$WH0xf~mM*oqPq(c7V zF8zBO67-K?`rltgX#NMs^gr*R%K0!Yd{jJNTSSzaoQEFiFjaT9l&PTwL;sR-HK^51 zZfx2p%RqfAvwhCBvV2L}_fzq>C0)yVX=EVx^?NPW>kL7z)6u!-5exZm&w+e&nr6QV zyfw6{?Y3&fYSbUc9`Er`dJ}Q z&5K^fzj{DMw7$iET1^< z)j@>%*GTf)mg{H0MSJd{K?W_J?*Y)N_~p1=5tQm)gAyScf%f0EQs#$>e3o2q)q8vm z-*tWgBFR-R3jjWGKN;^(O0=7D!VVS5=*${O8vNn;@;bLL7p1UmP zI`_r_iJvxY_)Q7g)a3jeJI4yjQm8AbFkQ^I*vBrCN~+dexOKJYeJR;xC$1;n?aZ}I z0J%Q=KCFJmBtvJf#sboe-nh+SboH{K_DICdK@w0uX9_vc!P%hP@b1TTMaEfv3dud!rDT%npQ2 z{C20t#`Ea$p+IqpaDE}tC32S{Cf@1#$lQ~_!j5nipSdRQqKFGuy2n1{tme% z6}2p!9f77o2qZl2_k5|-N6+LV2tIoVQ^I`aEGm+BcpaxO7R^_aX3VaVT?{!@&LLf= zNI2}CwiSi7;}&hyYrc=7Ys9!QKDl_S(mxY3V#_HI5fP)h0u0U8g$o0RlWT?+zE#B2 zLuTwoF>AyKW-R!x#>jL*xMRn-ZLg=P>P=)mzBRW`r*K$!IW%E)!SPFS4OoBg(J2no+}E|+r)rq z^W8>^cLzs}6GG39&uh6tYc_1mGNWS(AAH+-&jC{^V@SR^zoYhMuZT}{c4<;c&R9Y+ zJtzk431lCB(fw&w32w5u+|G^^-@~qg_qFi$b^GjawR#$7)v-D*ywr7*q~64~Ry+f| zfgMnvO}cq9eV#YmHAu^-r5a4};y(H+pVYtSZ6pV7Rt?er?XW7(lAdZ3%-^+Yoiy6`iKM2;%w|;LZ+`2>xBc_711{ad zbFfFivK8L{JbW&2kU!@j#woHsn-X~iVD~`4tr}WUw~m9jJoLj)SzsJCY~ir(44}_= zvSTQ4@-+S1;!h!E=~h6_;H9a+nFrxS@yllNrb+$1Iv39cJu|~z1+$J9fK|H9>=1ac z$)m96KGcq*?DtqE5=^loY-Viw2w`yAIn?Biz)+myBauFwt@@fq^({ZHl1dRc`!}bI z+`VJhv$3+FxNoE2NEhOH;X>cuUzf*gh2e;)>=LTL+Wz}* zW?$d57loRScNpgVOdrpTa-7-Y_r$QN)@QzVRT4lckfy4_tcrn&nkbbuRfBVCyQ~9+ zj4f*4cSFh3-`8bjUUa7AQbeAKi3tqf0h~$`7xeNUfL&C2lc7HyJob}SVLHK<)D5T$ zpwPpVYlzq!ltyTvB*5S9BzMUHgA~(JPjTSv2w|k;t>bU)^b1-)xo0#U4}P_0hd#9g zKiMN3Fe}=4mwMOZgxK)zSb0eD%Dm?}L~;N+%Ea&X^2KJ~q0_w#K_4hfmZ-JRCS?>C zI#bR^U8T>8%rWH{0bO>MP!+f65>=dqs!jD z2&)CfYf+5Y_*0mVOgLv04jlvAb6!cCw*+wzjwY1qq@{fj@L6b>Bl5r9yNyMG>1JWu zTc_C--<1-x%RMlWy_9)kkzpox7EyV<8;c1*_?ndl7ESbFV`|*Qlb0uB=^pz_O2Xlc zIy>tBVc}cK6xcBqq!o808K1cDug+P1f4izNsyV7Uu@m)j$BW^3Qkm_lMdyJ<|K8)I zf0CT^cCKx-NorS>g6Ae|@HyVCrEhTo>eMg4A#*qaLIMK=Z*b5UWG^U{-l8FtcrUWq zhGb|2gh!`*0JogfTLm3bC^fuja%frUdmS$QZlz?YS0a~nFr#n)mk+S4r1jPuKgu>j zes5VfS_cgXWwaA8x93rWTp=W`%Ynu1;U)%7S+ZOz03&68x;*nU)ijyPoe$U5GeYB5 z0SdN{o}-S-7wY6F;XVC4b8ey`=?RjOX?mLeS8YlNQ+zr#o~|Q}U)HeBB_Hi_BaGz- zW)-;QG*-{;Vh=l8Krt_P|B5br|H+Bc+?8&5dpDtY{&rKDFNL^w8f{nHcP%wu@3Un+ z?e3L#OVxs|x=n4Mo(GDK{}$Y>y`~c$kzjUim4n9=yseQ;rCy!s5!JjQdF{gUa~T56 z{6{i12{bNT*=i?7z8&??f!S&I$O*5Sj*0OA(k^)#5`jpPT3wwp>vvDe>-V>Zg{1MJ zw)ql|oJY=^jw`GKU_<4l7j|Z5rxOKPmWYwPF>h1*ugR4s0a~FNrM=roKlzIXf$~|s z!;XQvj~+QMEFFs@IN!{Krc}&LQ_s<3IpyJ#=|BC)mlpbmDAY0pjSrFk?v#79;f(c? zu1v0-qx0J3&%rt}-nWwFhKKplca-xWAe@sVI&CSr?Z!EZ z#TkeozCcdN0PNf%!3c)Nu}fqnh)rP?51lkM3SWC(J4QFW_<56G#LoCe(%M8rNH!&3 zQchz3DDQyGu-3li1o*UqAw#`szhn!%`$lKc{1j6$Jn0Vdaw?s%K0ayDbAG%|Aumr# zk@E$*Yv8`)pBOO-Ur-i$c0vNMJN#QeF9{_IyeD}vYh2wveWP>BsacW_(gp61D*T$% zckKv^Z#s=_khR>w_XuTEvt&zhx)GG`bulqsRwD16dIpD!#$6f10(yPm2LZzMq21iK zQdWM}qO)d<%K4x30qp|q>GNa&Z8@IYL&=u>Yrlf&fT^#IK;VG)eKvXHOtz8E80t4> zt1QLLCUC>eDtZE=(=aI{?jq^?u*h_50^I$=3J#gmW}$*PJp%lBT0azlW54YiB_S!{ zvG;hFvG=6IgL-~yX*2gdA1xALIqH}cvsFL8RqpLo2wmp->UyErDIQ@s82{SZA94E*(%yLzW4imvYV7h$@3jqPK$4ssXvNeOU z-F6R{`UWBcZxVk`J_z|LeCL{S?Fghc>pgOCLAqc=LiFYu^P|Hc&-(X^gzL}UQ*ez; zYi$z(2C-)!_ACD4{cOZB( zAj@OH{v3i{Tw(rbEcCOl2q94GI!IN{$ zUCxiYf)ONsjuWf%%=0(j>8T?A_Qj8AXquKM8YC**W}bZXWG!=R^QKw3?ful_`1jA< zQ&`ZBFo5*9pgjrSLtp^6V5336rwRxrX8vo_jcLZC5}h9$7vCxyMw**!jx*S=DqJ+q zSA=WM9YWuQ*37(#m1YczY2{X5UL4HFAWiMz(~TT*7p`P1ib@!E#A5T`OFB!N{JP#% z9@5M*1Xwc__G9_=#?!(o%NY6m?nZL()cvCn(q_GVPJMnG>*|j|&{sGdr8{5a+p;s+*3R%jyM;G27 z)_heb^s!tOuxP6QV>jVO#Hf7fJ~Xe3U9WF+of^g3#gy~3pbRfbm7QIy6|3=zyc!FS z)HB#T{@B3@T^&a3&sC3#iI=V8P9KejHY0eI)9vs%Ge`Jt?w^LDfC!}4)L^OhGkouc zJmVG@a~`P6#wLYH&Ef6rrk;1)Y|XLICwJ%eQj~VX9jW$(WC`y!6K_)7I6Y|PH_wk( z3F0=8Fv@Q~UEecO50>-~j&qu}jqPXfCn*2jcxGZ340Us0lw0vBQ?yNBzyoOV7M~K+ z1)LSabGtL03MTu>#Z8nJ%!Tke76#t$GcSQ|o2GEJ-<#uqBLoJ<*C=l4Wdo-;gQyk{ z(*;(qzzPS3=i7CKf3Hu+V~Wu$m1bK^N~FuXr~g#3m138P2j}O&CRp!jW7Qedq#fVd ziR~-1mVMK?_x96eG(u;8^Xa=v$NDZkIGDHnau{zcr68RiJaS_tNd`8)z;PiWOcCT5 z?qXt>zEX81=!(4D44uGGY3hA(!%Lhubk9bDW?E`2xRuqJDU5ZIqw)h>4{G;zawZbtLK>iHtpP#!qX3mW$RZGN~1KZ@^I5u&8j(w*XT zlXdkbY)BqF{kG?Y!at!wH@ZAB@5+ZW?GmwvsN-`=v|Mkdx7L>^j-QavS49osh|h7R z4#%4WHB-|s2Q{JcK3N*=&y8mS?;=bj(qf{po>KRp9+NMts$KRAZtnQZ(zJ_Mh(Hop zun<2;<;_6}E9o%X?8DBhMRYhJxt*;7&^R}$|2ZnRE%LeMloA~nD0+7yoO3a!WVTu^ zO27nVK+lx&3IgvL8NOxO%2)|iR3{{s=YI6V?4l>P%nTV%a9?#A*;vfK65`*#_)iIg z7SxOZhf56&5S2LUR5y$28n?(Ndyld?2n#dkpTE{--c|+QV2hDcsq#PbInN5_D6ppfnhAd$@V;vPP zILp64(_tZ{DH7q;>`9FO1tKh!W<}mtlELpw(~=*NRyb(+Sw+gzz)j|PY#fxbiqg1G z>KoOT7GYISPlNXuj=B7>a53hzr`WxG*l@J~)nLkI8)YpxRmy=oqtAi*TL(2E$GL6a z#K?vQfrV$Ny${DCItCYF8qAlgndF2XOs}GK;W>;-CCt2zA@nzI(Gm!0Q6b+u{{&nI zWvAz-uZ_?589_lR5`)d3DmuMmuOYoX@weW0g{moH%z$T$m!2GXuue^dYCnvS5Za~7 z{`rQvOz?`GmwOClEx^n^9(<26MZcNhL@O#G0_08T`ikMVUP(iPu zgF6BQ?MY5WnE&kqakIC!n4O*cUfuaQA&bkg=C!UrG!JhJe&yMz8r*XU_X%tD&8;wP ztLtlO!u)(d@{&}u$0O7CrNzeK)U;|A$SPeZs?}AbCEnIC!o$locaR#NA7&u|^UrbF zYK8&%i2GGXU|Gs#TzdT4t`#z}8!opUZkEsm+`2Ad^yqgSKcyEIZE+(o->hcHdzRT` zW`nJOH7_+8d7BoipOJ|$Qn5ME$mNgmPFwhs(iefgFpFZ2j-m*j`$ac>=USC46SMiz zVNu8g9Twf$ZSl%_dJAOj&1slCe1swS;)7hesqvw{zAvgcTq&umqrWZ*3&`T5T`3$l^|3G!pR{-}Pacy)b4F2n3RioSLk~t1%^oX0c3@gxNos2NG5`4!@#lL8e)JtE@Euoo5x?(@8zsVCeXW2= zg9M0DX%ici7hqZL==<>&G+i|kmvhrmJTC!Qn7qGi5E6hK4#e;n4?RyMB19#M4@bcRGdLjWR>q}Fi$@Gl)Czzi$bZgsz z+3`{e)vEz*B~a^~7(IFJV&PHaB!*WkIRcOOLMY^61l;SnYyj-qTD3Jq19{X;l$$BT zRiIG6G?cED#;@bdD$ zu=2Zs6AY41!H($O3APuJQI2X4UqwZb=MB3zl9a^LZT9%Wq|XPU8Cdr%GB)8~O6n~mWCo|O zB*hmLfG^j~&mZ7LkdZ~CyUsMn`67bto>y_&n&vofhy3o9rQs z{Dg4V^or$2J97W(7T?B1sC!8vTb=;}q*2_B^WRguBXl{dru}~VgdWhl8oe&^$Hk!z z#pyPLwYm2N27jGHIP^wC3TOPcx#@`dp%<38c(ZjYr0;IexCRGhvg(RkY zKX2gFR|rI=4>M6eZ}9%@#n>(sEgPU%UFU4^v>u?vj+anQbq_(t78;r-GzE`NPS*B& zoMfoeLZ(u??`I-+M0;J2*W&?bWo8wJni^WZbPB5uA_T5YapU`v%Gp>Tt?7{I4~ zNSg9e!*9qx2aA6L5r4_I4T8+#Aly*+$wD~+AzX_BDuXyfyFbkzn{p8eP4r8_h!DF3 z!I2pQ^|-`D*%+C8m5MqvV4^Qq!L8GyzC;@&JtuwSfX_lgp$5*Sdo)fq5x*w2Q|X=? z*De#4razfA>;NvX*gzxx{v72>Sipo27!g77+k&F6IzQ|y1%=||PaGU}`^aySS{U$= zPODj6RYT)7d)>F)euo6?yCO&v$Dlxr--zCiDO5-O2ndns$c1HPVyNR}sA#)GpbMb< z{kxnAr$PsC*5k==^4xWQp0rNTrIwtWR6g!^&b~dwJ07Z&3%UG0u)Q6UV}6LmN3qO; zd3*05bQk?l&;k(v2o2gb-Y%SJ{e8~Jh}6Bro%GzUMysr<3T85BY1s1~OiD)wx3W^k zVwp#*1qwQu);x76r$GrW*!6MJTRhjYb9f(wOSzL*_>SM|u3`De>xqZ=6c^X+(muPp z8<&v|RXD%U_M31+*P>@6aY<{mEvcSHrDVj-n(xCIvb?rFsieL(Au>{QrS$m~qeBHyehHj3vvlH_G%j68 z2xLBLI*VNzm1fLkYcvbVW_XZl*NOx)@O^M%{5uZW)J9Wx2YH^L6Z(3aKXI?p663sNVdLeQVnEfWPwmhIY-tZFCT5`1F0b@!t77k) zCoxEI1j%izh~_oQ6N$b%yRXeKVKkU0JX*U^FC^%K%W^l(C8(nCI4wi{z_F(qjd3KH6yF2$^CKp^ z;;i;wI#paiDTY(GwGvWNgu8}|L^ycUN%?g`i2^w&ALH#`{##;jcyF;-{?bbkIH;2O zC}LWF-poydjLI_RosD0~^Cd6zj*pj^0>!|ezCeXXnu+gsZB63soTUavax@Y;`ex5G z>E7@W{#A@vmpF14IRVlur^#1Z+8j$li4i>nU0sgtBMdUH*`m0N2hd|HV}Rboq9R{J%%;r21t?IE96zTNyRd#zF?^)Ye$L0q8sda@Rs|CVUPs==A?_m@ zmlaLD!q6{U-@PC>-j5bvh?260!h*V#^e!m2#Lk^BIuaq|>6w(1KU3Gg(fp8sXQw59 ztjk$uSo?2v#t{q}n!AXuE-nx6%80l~K&rxR_!C7Mj|zg@rRKBr@yJ#wiG?C%Vw*`S z6A4(TWQz!Sgu*vl&J}D}jF&)D8qyo0C}Kg3hx1>yQZcV_FZU<62o6rHRNQQiPFxFB zK4M*R@(8l;)|=Q-MC_3QlUYb%{>nlpX>)?&HH&Zw(wC?HJA~BRe^vX}Nk&FKcqJ^%!Q}OU>2tEqB9=UM z+jghg@0}DCi*l7uj9a-)c8^>J%h4xFDNM-MYH2pjXmW0kNB#RZs>hK=xPMxCWqvb+=X%|Gfa2@2|6p4}U7=Iyb>pDEG*7-2G;7iqe@9>&! zd;G%V%~#ZS#gW;ZCcp=O#2G$ZSeHLt2;=h=KS3Bz8ks+Fhy)ZCUgLLt1DB9}i9BYs z)q_N?MidzO4FC7|M;`4>`0K;x%$7~)2Ik)>to`R#g3Zi0%l}9V}z5*zIq8fS{ zu3rgjM?sGSNzb%qoJ;N%ncQwCDG(LNUH6>wJXkgUrxI8*7SZ0QeUyWKzZe;lIowcC zbiaDgj{Laa0ag0VG*Is{PF5`lIZQMH^r3_{>BM?2K>F_Bw0GKXK(-D^@Yw_43f+Q}lcJ z9FojpxD9@<)KrA}#akZnTf#vfDDy1;n_#wi3pDVs`lIY!O#JKia*cY){7k{JJ{y~Z z@0uGb8tQS}@mB*|C`v$kR=ZeH5JwEUdY^^)LC^J$JSl0utCM`;O+eioqJwkh?bQj~ zBFfX#39pqZ1v7Iw;2pFy0w<}WsV$tv?^U!9>kHq|$v!oaep!&l3gR02!fY?kD?x5r zdG>8*rtp~S-sX1-oCi>NqnN0o(c$XeCarT438XXEmc_x62nqSRJ_Iw5nf!tEF2Y4Z zo!;7eFczyb!4E^tpQbn;rdG0^KFLr2(gRwO-AQ!p{%@b-SamzQ9`1o}qu`9UIwQ+Zc>Ad%5X3eZM zb3RynG|lb4_ej;Qs_oFKe2NHl)XwY;LfG88VTCINnCJ)=(((AtK}O`C z2Le5E47nF`I`x&bK$0c~v8FOf^BJi|LsBXbpo@3HdgV0o{d#x`R}^yfz{1$0-CpzB zZj%?lnR02M`uhuzJ)cD@Vlm=Kng1sCW<0udG#phy|Gvy2})7^s-) z%ycs<{5#HjXGb`fl1I@i*k@2l3Elo0Z6mn2q&{#oZP)AU$cda5A4&?fKRT-yJSiMS zeA?gbYWlJDL4{>DsDJ}!!#Bz06bt(PeAA@I&+k15CLdx$a_>y4DXX=5N!j&sPn}-v zU_uwRxClW1Nq9E~KrAy0i>vJ%{rGHtS%PFp=p*sOB_tniJ*}U^KACre^nM$5U#M+t zgkS0)1Q+~5+i7wTMhlA6E1~pj^Ton}L*C90&i5q(E4Z^+@Q)*s>TnxMJS#=c>1hS2 zz{ldn{6o?2_kNE`AqRBFZic~plyeHiOeE&TkX@W$vd9GATMgQiCYm=vHFDG~o3Ms< z*vw7|FJvqe^PHN`k0KP17SJ(no4y*cPh*ORVrM#(l~;zc?zZfZe2Fq~ECtr8TxORO z%F3ZAbFCqh{Matv_wb0Eq$EC3Q#)ToFIy`H>ApOg!ch>rTi_(MlcRFPsmu2Oxj}UB zTGYM9Ku8;U#=YV?aAr2v9_!%s={}qvVhg4&!$**0^ccfLQDKASH|`v^S++N_>ZZGR7m8Zd;EfIqzh-lETf{L#JCxjnIVi6#C%Z7j zU;B#OZD3uhu}jlsFU$HnZn*v8lt)Dgl~k%=b=MZ%u{F?f(%!_>pW^n{0UT+luCMc6 zv6Qys=f^O;>An1Z#Ds#2s>X66oVUw^dT&J|NeH!S;MhMtM8r z<|lUFYt%z9hN_wds;82OGmS*wWp>=|?tauoV#T57BmFMI`AQQ`D*Y;`)h0!gO!aTH zswD8S#1u7fCoR&@X?a)e0g>+VG5Lsu56jjLFQk0}7vIF*`Ia#-s;n$EDg7<-q6dj( zCxcGKcHB3|R;=Rkg8KSImCmOfF>;HoE1Mx>mf2!G$Hgpjn>A-tbaX(kxyX~BxWcFU zhoM;YZ!qk|COsDPDM^!r;Us*#49>EEUp(X~cB?OmYfSaZH?3`I`TfE*NxuK{l z$yc(haXFnKEXM-R#vboOhh4A>`?E7RH_!|c@@JLy5B%BMJHgu^4mX$A*GA~lwKJpW z74fG_a0LAA(6>I2@kJ3BL=f_FA3r$ss{&q~j_>sPIaBA!Nf{6|ei~z=(mBM0)a>oc zrbMW!a9Q9Tv;?Nn>7si(A*ikJoP8EHz4kAvHL(X*hL7IcI8~6YNqm0#fG(&vG+#FT zX$9~0E+fN5{v~{Wi32!X`f#U*3bIwY*17pAqpZ>AzZ$a?h<{0_+1``tuxYW&HEP4- zT4~!Eipm7onfyssBU%?hBFKTdqn5Ba9dAG)l-ducJ0Y6Ie!0HT>F983*v3;Ks6KP8 z8H(wbGTPrwK=|YjZ67=jf52|)Wak$Sk220a8-0imhQlO82LJnxG>^6s%Ld7kg8WAI zyYWO2%r7fAn3C4grdU!^P%fId zHfwLK+Y3M@MI}3=(PG;KilJfJc?bY)j$irLdk6R>^9!Q#35`L;{BzNGYZ$1g;X2Axj22VrWp)0P+*}KJ$}_mr)&6?MOQFy&`9rt0!}sXL z2~ux0x!E#;L>`iptF3BS_3c6cs8q)c4~G@Dl^2-zAS`2#KljONqL>IY-@r8qGw^Rg z_GSGvcrckEdJt3J7kBlXLFY-lBah-7XgV9ws#hbWqLLVu&hAJX`}Nmogu&}OjiUbO zlzc!4hs|=Hlm;6x{f-y}Bo!xtczm3!ZO?i{FQq8jl%I?YA^!d}paeei4ap?<^CL{i zMUK5~*ljhj3fbulUgmXZgb_Rl@|a}-sXpdx9#?;OgcaYeN56}RoEB~v5&u=^p-^9v z!%ho!*UYX#v*kMQ^G_dem83(fY`otK#aKj_H^;I>LB+6Uu}-pQ71Hp%|GkbtRs?qD zzypW=TP!0QUXsTfGy_hOq@Aw*nXYsur65=PPYd4=XZ#}{(DHcTD&O7>Z)M(rpE!^3N&L4>u!P;%U( zKCa+`o11sS!AWYyfp>8cFQEKF@bxycAp;C8o_Rj>NS=*vzu~hywH(7_P}Yma|E(1b zY)&N=w79uZ*g4N=*TOMTHadEIGrZy|*`#(+LXjRFoBT#yrjO7KJ*!=QdirCfVY+y; z6DW=DD^*|w^1AvY`0W=0ajuBKbqKEh?iOnaib=*u+kF+50d3!^Z)V44SMj@q$|1v3@X_MnTX#m)|h7qzf3tq?^5>JeO) zt)j|;H4`ODj#Jdm@nOOapO9bO9R#53#Iu5Xm@? zB=x)y@S%Xr%&^9Ql%#BlYU+%iwonqGcRIn6QAg!=vBFQ3)RLe}v~m#ck`l-`su=k8}mI-Q%gh5`A@k`^280WDG0& z{wPatTQfq!%6bdkg@+&@85?gU8DHvzgUP8FuCL%I!ET^AW1RQOv0 z4<9BAHGHJyDV>^Pw78#Xm_psXWm44Wg3Y}j;e&p9rS+k3$A)7;X3$2rVL#4Fs<6DM(ygs971hkm%^EB8M4MnINp= z6L}GZuF(WD6P@tPOo_+61W{L44%az}8S|i%i6?*s+p{YN=xrpdQFjX`Uu+Z@wGy)k zRD^dOu@29-+#bKMkdj}uKTlQXAQdJ5ud*Y|*&bgKU-MP?H@libz(ROyD>C#cB{wxIAK!qbl^Elrqb@MRS2i*I8@DX*p$wNQh} zXl!V8tvr{FGsh@j&@I`4Njn}z%t{LZ5B;HC&lO*M{zK-t$ntB9;J+X{k`)B4=;V`i4%+mN`%&f(-yt@DX`L6ExCnigPhkLVPf z20blV^v93y6X^mtpd9p{^sjvzByL*)L$e_v{5l<_A8eAj`7q3dP`l28*XF)2Hd@%C zJq-K&mv8g@d1F6#%WL&*CHoUZlT+8H#eJTSS!VCruWU1g`$&FDbL*ElUf|4TTDM2@ z@rbd7Yhz(^nhfg!+ z%UFdNynp(PdH_c$wb8M2YdwcVoOzLS4W!6qAdj00W$O7R_WClA8-4JXB55SIn$oYq zmnex~luSV~K%($7LQWhoOn*NbCZEQ?5U_RxkR|Y=frnop7Wh2wDIoMqVH81&v+`Bw z(D}mp>2&?4MJvuY*V~Rd%XP`h$>4CkHLP}cHT?LX@v6>4!Ox2cTs*|Wl z*ShYXa8G6qxK6`zahbdKKO;e|z-9qXJ#x1ag*SbVRc`Bz*>m5k1wB9;_%_Bu+HBMy z2UOK|Z&UO94tRlaM}1U5YS-6&>l}AeBa%U0ZY=};AYB=eXsb25YQLW%Dl6|f1YS}1 z%SR^GYI{&BPhoJBTpTi`)>bVL9yqoi&!ZtMPEyw!XOEW)$VG|xKfE$MDHf}s@HW26 z`#MF9`MezPH`n?TaC!i5uNk| zSS{!Do7}nB$OjQ+IzYajBI9?#oQ?Gq5ki;tgBpDabIy^8(6ZyqxSIpbbHZ4~>vPeN z+O@IP=J~TVOAl~bmzcp_9l0W$W2uhmX_+u^Y37Y5)ler;ES5g@+ZCavG!s7u@`Gw$ zR_Zu7L-JPR^VBMg4qF|*##=;WItf~ zdKV+kM!3&Z=K$+L5VDix`DSsSwN7sXkjtu4Pp~@7fOS6a^CT<7pEMHf2wL6FRvj-$ ze7^8}NO*=>j3S6|QBlGJmJHCa(D9#e9T7k}|4EpKh~yV2#LLC8qZ+$~j(oDa>*IM{ zExS24klkKJigjHB<(XZj2SJ*)sEzm~`dTbb+73;r0MVP{Gj(yS!M>_4mzxi)SOy}C z9BX{2?(UhA?tHwhxIU0_zo4xij{U88$D=m3cD^%KMupEXTfD?EH5u<)n#ROywhKbb z$zl4@b(R%_G_MPN03mRctl2=ZG^mJuo$9jf8i}cu|#7))t5#=Ky&uDTF zPuuaV2=TSE3vs-ykfeKL)ZuIn1T)MtOD>H|r+_-f-oKO^3~iRHK}KL+Va)b)_oM?y z!_~D`KRf9-;N1rV@_DZt(BdzG=SQgo+CcyuR{wsyIp5i{JG zG-ea&gX45(G-kk^wlS9*M-ZP~oGv^0`=}x!1|Hr>-)GnK&fu6F5QLUoF;JM$;0C&_ z^m%d)cY`I!(W<*16Z2}$$KwyP?&{szc)!QC0D);y+;Od$=|RwDq)n|&rcUVz6t8;H z6o_`~^W!F1qG3u}N*$iQNGI=Lmlre;h}YtMe-L6}QCZuZOvp(Z@N5qb+4b-SW<3V7 zcz+2*xF|~ixS6SAbgd(1o7^7`x&Pk%9K|9zr7s+RF@8r&-Hzb!Bx)grUR|}opHZQ9 ze?r7Yv&%H>dbuq&c1%y~um7lwC86ifJYZ5*Cb>SI;8DIQd$C( zz;Q^1`~fULvI?y)sLXe>)BVy|o}p}6XMr=pr6Pa8jmEMS>DG{~#I-00(E3vzOZGO4 zcR^LO-uYsG*R6fJg^#RTD9(DzZ^B_S%o|wUha^%oM&L*E(zgH zP35E%6#R*CjHU2V(9w;?>|MS-MFYmw&7y3IHxXN%p77>hLzW!t8k`b&UDtz3%4s&d zUJ_575h!yM#z((p3tQ?b$9A|@1v?#GvTQCXt(NtUjUmpL#Pow#(C#!bgD!O_5M#Ep zkU@Y+pmxQ))!I#?9j~{@yU(bvU+`*(s4fVEy4EV%fvhrk+}`u(cB{_RR+I6aL(%E- zfhUINNQsND^FzQyTmtTipz;;B^pDmi=T*VLkTFq%$E=p(eGAsCN8?4{v7nK*J3~vu z;{27TbM(|N%c#v@0^8%WFeM?y)`9ShObf)p(W$=;nvt&di^RnA4Yi0XLsw-qeB*lV zIlr^B(x`=4``P#QnNrh`9~zj0gC);>f59701YKjevC_sg+iI&0nIVaSjtbS{qOxWo zM#W_4|Gmu!Fq+Q^;HiGRe!0iSs+)mCRaPFQ9%v>aB^FNfk}q&VJ3QDlHMKQ17UAK^ z{kbdA9{sauLR*Xy&==H#{KOI5_z*PPG_%~|pN=)m3q5;?&?MY`&GiT?W-w}H&xhyB z15tTME2{nrcAz^S= z#1<+z+=n;u?Gkn7Z}y5)7j}B>5UeLrqPD8+kIHrM*%oG9F@GN)!UkeF}leco|fF z3cGWF0hBMRQqfG2&NF+|<7=kZ7*ZRUCm3x_V!6LC6Ko*i`L8@(2?yuqHogU+lk+kX z-iMjTFRj0gkGp!b6?XQxcjr#LNz^E=v|ND-vs8qS7ffY1`T8=?GR^nezL=EYFaLbk z$AgQYr1=7Z!)27}Z7zv5Pf?ETnQ%01mB4$5vG&D{RD!eF>QWi8pukFv!t1!7g%MY@ zB8kjw57|kX61H3E{8seGmYFT(r7gCq@w~oBc)Bw3gax4xCs3C0j*fFeKD8h#nr}i# z+~kL}5`j$o+|KD)o?GtE$ie#EvaWpK&(EV@FGEAULwz94zkb#BJFfL8U!qZ33Y!km zxB7k2SGsIMG3t9$To@96P}TeiUTDO_vdKgI^o@nS4fw5OjAsen8zt zOA_jGQ)k?guURwDkCBU;xXMDO{`=#F!Fu0{yWu@oBe{I??R}6)0xZ!UlDW5>J^>NmM&b(>4|5Dqe`)yN;mpF+*WdfU0S@<1>HTk@(E;sn z{~5Bi|5Ww=9sk!WpRZ6V`v)oOz1#@vW7=<=WvLyzhA6el3rcRrz1!8&ZT@bj z>LL_Pxd8Z0VKff#_(?YY`b%V->|*9^N1cgAh0zE)d9B$zekn;{GCAC@as#b?T9V`K z9_dq3UxFa4S7wL2|NUHni=a10c$D|7aGl}4H7gF2pYQvd?Id`~EdDg(6~}tUW@ps7 zoYah%vrds~4u7YMLMk4|=e)J0r7>d0Y1JvD3X>ZjV>>J9m;oh;Ng9=nRc5ET``=L+ z0lWUWF`5{~WIbYejpdOIrYkh#yW;#U3|>u|ZzIMUatqhkuU%_WPeC#C#?=J?(}Sp` zV&U-cu);~Uh1A14K(gvh(*s^td2(T1Q6i>4P={&$(sMST6!PGhR9^n5ErA%*#=N4)77x#K55K#s86}ThlFP3|tA9^H^p{nj+Ut#!L82}-!&mAp zv8MQM5eq;|NRYs&`OspEDXkdNdbw@Jm7v2S%YoZfGxkw70X^^KWK|+6wqaULvz3(BZ?wBMI3}cUOm8T)PmUZ4abHyR5L~Lc*nPZowFLnOFB+xroQ- z2<-?>CK;?6@A`KGIh)&eXFo-(wkYA$zf>x+`ND8S+`D*vzN)`+&j7i)vw82k^R$ zPb#ko7P)}Tu*1iVHX=5cx{{Y$I44TWtcus0KRS7D0ZmlXl>2b(CDgYqC&G7U+>!$V zzXE3Oo_e%hW;}P)6Y^*&nFjPm7y|9h*v zwa8bX*c4^wSm8CQ&DZ*_F)|FcoK;=tsyfcEt)v%0u<*c*j~*&`Q2YY7kfgW~SQtp?+ta2SmvLK>hIEgQoPasuH##D#-y_};bHd;E zhBJrKQgxPH%xZVXxN1L`q?@}j2cBxF>2R6!Is;-+1JrB&EEsrC5;vE*fv!Q$dAtVP6rh7 zRfqT>LJUNqUaUd>F2CdtpP$67N857=?=wHLEC9k zjS&zSC+eSh7FhV!;m5OykU(2{k(r&tRnv0Eb3J@`ofr@x$?3U5*-)Wu3pL@gv*WEA zGB+d_LaVVdnWJM=Y1;>kom1zFKt}Qr)G0wS-l@wl zuZO$g?t8eMo%U^Y4X+GOY_qTI4ki+RhUXyy{f?GL>R@r z{HBu86&|K39gPJ5%sfBx$y>MzYM;d2Ke?Z@#kMR7f|tO0@0v;JfX>H7bh8v3%uy}I z-8E?q%>x2HYetO%*aIcC2{?m(b$#=G@nUs*JckoT@5H@Ajpuf|m-zJNu<3HdvDxtP z<>%3A`%;kj`s2PZN{z!x=j^1;=HtWVyiCbcoK_)h0V1}%jD}6u6KUZ3gw4or(=}r| zFT7|2^ZJ{|?|Lwnpk3hL+Hp}`;y5AVTzA@&f^aeJYDO@2)3f?5Q(T+3jhZ|QcG0&F zEu6C1LI2b%@D4b2bsUcgr-HNt&9f@<&tCJi$fp zhrgKnM9yS>>Yo!vl-&MvTmF%E=xAO3yJVVIdEFAZNBEwG_&Sx*^*Bm#f4)}BsBV5* z*u6Xb&q8x!`GSwxB5N>=wA!?u#`TNOC83XpkHFy zuY1Bx$VjF6MQv2TPHtJefrRhjt zScU1G9D7Kf ztipEoSWQTNQe0e@wQ07oReXQvnf}b9^Fku6!@1{q%{=47i;cGA zXwKS9H{)?jtitbKtj^nuo6Sq!9yKpnawCN6H*{|3GkI7Va{p%D*9dqNUZzskO^AH1 za9P#(p112q^VVk4+hnza!{Qt*4Hw{bI$B|zmyCi^Y|KJHd2y0!=TNv~D?sv{PvZzQ zq)^1dcf4gUj3j(8&y1}S39nG+O5l^`_4t^n=YiHe*gcX)7=FXJM?PFB)mv`_CwVms z38DtbPpOWH<}WP7JwEeEW1G2N`YSz`*(7ymmqsTLurXY^N=L|w_Xk}X&DKz4al6|t zC3BZha*A!_%==7ZXJVodONfKHbev_<^)wqqn;WDA8!Q*^J}b39eC{huhhSZ2((c&qY4yn2eJp_68C{zUZ>-@h%hDbWas z>MF@gYz8uVscs- z3>wlsKq**dU?`tYom{z!e;!ZD(TG(XWw5?`^H+w%nDo+@z{P%B`i%K|Y693qs=*em zp*HuPneW+nT#IYLz+pBE_vX~&_X3laG#X~{!fDD!xXH9x?CVB`PF0uQs<0AEVz*!S z9KT&9?~c$(Y2pTWpVkqNCnYagRN1wBo4PBh*$xsP$7?;XoMYz{veGPZa5m`NJ++5O z`34G`E2FLUQ(C?|!6!2$B^fuXLSl^way|W?2fiyYB6cDz*zQk{;em&m+Mo zDJRq=N&L3p-LTUa_*Wa5y<8cPl%II`Bsx~s=^N_a*DC0~RCxLOtKgj~PjUX4mnm~O z!uN@DhLh|iEKL8mulLm_#2!mIb+)so`81`3mE4{T8M9(xAW^b() zUs~iU;-)Mw_UhZ#{V;|%Hmim?phPkh;t`ydQ`ea2tV+gfv#-E1Ik;Ipe-5mLOq!Tu z@84SBEzNHgn&za__Go>n>f?03fE*9G?_%fKo=*wn)O7`g#soG@;^}%HamAm z)0`OS==WX^rw}M8C`6>BcNzyh?d>@FU7iPKrlt_%Aql6lZp;Vhx2hriYB6XjeY zxP<+mkE$Km0(8}IN(jz2m?@0@{fpL5ezOh!d&^cW=cE`JD5&X2E$-uV$EUhg{(A20 z)g%RiTtie~uNF`E z3&95nmYK+@vv6<)}SRZce7lZ0R9Ol!`XOw{ABVoqqxQr)Q3&9q+YgO^LFOt4-Pjv9{B=5e5 zcO6Y;-TH=brUSwZHA@sDa`GGL#v0$J0PL#@y{o^-gZZ8@D67&0z`^Yx z;U;s>ERRp@H~!+Q+r(Ml>ffL=7+y6aFe%3()#qLXeufeVURi@cjM3*^V1bz7Oa3f= zT^GvlOKJcyJnF{ZqxIvC)2zG0Y1M`&@mu~I6)WP|SHI8~(k zxd$m|nAyed9@b^vTEgc*9gRU}o$x+27x5}Ta^jCrOLuLObQBDU6%^M)D2qLTAg~|S zx0L4M+SWx`7RV`w#?ZwBB^sPg2m<_y@LhpjIv_9^beW_T6s|(6Vc_774h|0^-&5^m z52}2;Tw3~YtSGmEes%=7>vxiE1vi!pH&|K_;JmR346^ki`}MM}N#3MK=)`_j!+`W= z{V^Reeihkqw_jCV{Yybk&V~gEm5{Jz;hB$;Qj(2~%!Gjl2R%HyOIuIx?oMk5zY$&EgwOvH;KU6sj0+<}S>8u27LWHD@W#cz@^77|*|5>udkC z?iPPgN&3NS6B=|hS7-mRMbKJj<2X>r`D7O`#9JeB$jyHH-bX-7anKpe-F7~L#IE(! zr)f;V$4CqIblp;`T520i^)*R7L)cO(J;$p?nS5Nks*C%6Wfmmk&R042GUlS_L6`MS zMm9SCz8^!=>jA-DjzCJ_$m@lcPVvaD!Mw-si^1!7CjX^WAvXuuF8uBDV$s0C!GT7V zrs?~lv^g8xM>XN1<$ESzD8{!imXwjvZhcE4vIcs>K(U_oR{wp)es|g;YB)n8)QGO$l(s769}7VFdUgWVeacUk9f!Qf`YDCUup~7#WgVJ%)Yp9{z$8A(Rt*z_kJ3N zF!-ta5MR?LNPW4DVrM1c0tW{NffXW*k<{G$$giR@@03KT5W8~()ScU~1uo#N+Fd0A zB1@WazDHlp+Ut2fE00d-t|=1Rbw38bpEL|q<M1ZzD449ah+(HCZTgloHyb`2iP6W-&Tef!-qhNf4$M23;RA+?Fi=yM zNj_a}`hi10REZpfv)A9<><)zanoVWZwYpv9aGbK`#RmHO3mLW8ZqCi#b0!)K2z37h zio(4conkUGJF=3J8c^BC#RjVSm>fkO5yM&+6KIu7zztJBc&?-CgBl5?73II!t;qSQ zk#$SpE#vP-CdS*c$mSh0(%wVKG;}Q)m^5?>W~t`bRxW)*$ebUpu2i%0r1~3EWMK9H zFx@K2-`YTT&&ps6U55LMUfzgY{Ce7lQ$MZHtLp0+CT)b()gL=TLWVLTBVic|_SNq$ zH+c`%*0e2kz-4~?pot;#8)TJQR?JrSTQIPzs$E;daM4D2tBO?AIe7#|t>ySS&XhEZ;9(JO4yd23dvsD;-bo4azYaP{9mfX#uI_2usxR3s z!eD0);}hpcOqc}-SJ6GuZMhOOzIu4xSpI1N)z*0fsi}@?Cy;6y|n3$}D zO6Z^c!0_8E3!2NDA@bx=B+Ns~kEta<>0POsdg5JyYV0M(iXF|rJb(`JCR+K@NmA`D zkI5_Oayn0iQbxl8A&9k`1?K+oh zxFS68d^WTl9y1SMNqg_ZtDp01J^Yx4&TMKGb~{_~G)2kp!vV7VGUC`vg3|qlPx5)-mi^qCmb_JT%&n7@9tx^JUV z(1AlEG=kKXgRh))egiEO_~6LSOCt+V@`Gd95a}_l-Oz;_EcOhVT9IaY_{o;#t2Z+P zxQ&X;zp;M4er5MgPz06c*4jBTw28z|pkAOBmelax4><*O>&L8y!yo@(*|u62?|3~^ z&rE%}2Na?Iv>614+b8s=sZ7B=hpWzr>k3nLCIR{ZH zwt-6N0tW$Pzj6&wm)S4Zki0HP$>D@`BP;v5Q-phvb(c?2w4zhk|{Gtz+nd-{ zXH=r%9yK?#v7sk{u1ZqVc4KOBfw*(sOH?C7A{dzaf;Nl^N zc1;w^5y6(weBz30=o!U(+-}@(pW)xp4l}?91T^1BqZZ7CFaM@7F3vbZ{U)*Q6abGi zWR}p^*M}2L2KLyi24??tXD`(iD6hwxALG3qdCsNnbQkhiBr2nreOOYd+7gX3LBJd?#-yl;YRzzoA?`;=djm!!}hK&kWq z!U$&;OPP7|8o?4;&>`p?J&1iIMq?;P7+S#774`c??x2n?(O}2RmT`e=#kYkSP*r6f zQhji+Cod3#yCiU1Ny#``2nG(14k*cPsXO1V?1RC9frbboSk~l}6e!>4>s?^jT|qt- zK995czrtY$!e^t!ynKEPsHLSP7P!1q6H^?Yy0+rNHCMn=-y z=-KDHB}{>XgFo-i^#Ug=BS;E`T6qb@Lw&>kLE2?zH3h;+5ACM42tVvYw5RUHcs(r8 z8yxIPqz&9)x_sW6^_7%R3|w5;AM6q^7TzRyfByoSFW9)bS7TP~&5v-_s9k^;=mCVd zg26D~jR8kTaQSjrqXcv5%*NGU)lYc*p3XwT!T~!QZBB7pZBCLkz@yKTUE)#o9JaLd z7`(}4$P6~7F3EptqKzPp2m&M|KT#QAmYD6fItR>w^qLr2A${J^d5lf{hdeYa?Ds5Q zH(L@07kK#pVAjupo!wpPv(~2f92rmm-5w~n;pS7P;_@%1ug&47 z3e>5`o#fm^==0kYOo6U{0b2OW&%THIy~K$F___Z6T3cb2_8#Q&mY+Qdae=K}9|;(~ z_q;n2w`5RYtA7rsgL&ih>~{S&(N{0iIz``31ydkyP|fNhBT~vs$Tj)0GK|t%bJoW z*56lP{JpUg7@jlSJvOxs^`YB7V0FQ}ZwX4?JPPk@8fJh>Zx>1#!knpRe6*Ts41dh}+O zZHQ|xW3B^``S{Pxa0WWOyydl_boE_##@h3BrW9IM%-7zy+H)N2mS@<_wscOaR~r0& zuI|FV`85B1(b&U^oJiO04{DC&$@c_&7weaht;> zG9UovJCHB83kp7rG~=ZgL1f@}@(xh=v)}2$Ki#Nrp*I>tL1^?SKgMY<<0-< z3s;{P+iQbQ-5SXaOYJ2Z6;!)ZXiM0mcRiQ{7}rcEC0zviQ6c}kB0M35YBCL9AxJUlH}h2UrKY7TQ~{Z{!_wCaTvEWm3R%&$hRN7h^vpy* zoqPY4 zT>RgPi+_@f=r1}dbQ*mBPXjsrnUf|270>%}OB4?I*sL#WTPk!<;D*&SPg-&$pI;l1 z^HSq`xUJ6czq#@*FtaN!i=f-#0RPUZCF^$?63FykQu(x%Kn)juNZKksMp$ ztg$wBPCyV96qes}Aq7eBi&r1PUt;_{BA#8np;`;D5{71(ba&nQLQTK?G`R;B;CB{R;v;GpAvq=d9dn zOWK>iGi-FgIhG{#noi+q@~vidUOE^GS_}AQmEF@lK0$?DtnX@Hb70MsB6-NodxCVn zy*AE@Fj*c*LjQ6HEo$K}1p08l`+t8Jb4clStnVE1U)AxaQ30rv;E%iX1FCY_u z(LWNmO-yynR;k^ELrVquA9C6c3LIQ)=PfP{a8+Ion>r8`E+wM8=Y@=tXu?g`l`7A+ zBo6o^WhSgF1};EG=Fdb(cm^mgfxLxDRM*o(pw`Nu3p?5a_$QxNZohW1%&|gfPGjOb z!W0CJb5m1iKX^OTi8?9|D=1I3yAc~12|TC9ho&I>?@?ixd8J|t8G#=hEFva9fLp2A z5Y36h<_7~Ng_*tT0YjM30Ox4%gtnk~=jTL}%b1Btf~@%ZHnjve!=Q+WvGQYY;UHkU zf8(wU*?xl8qMamMZQ*x+Joh=f+pssa!$w1&8QFkAP34Bw!yZaeVkSW0aB`-foPI7{ z(UOyo)f))uZ3+X-iD}FXw#94h2oq}Rf0Xn)+Sh{-5+Y1cp2Z*Wx>owv8EYh|_)iGQ zSL1rW-h&|$I`)r8{Aa*guU{wmxqN6q$jAYsXB997i#@p%&#yXQg=5^r z#7glAmtY1xT_K|l*#EL=Jjn<++^2)Ro~A@iO|>$2y&jZ9H#XRgi7UXPY_Jt*A*-|z z9(96d7BtsM$v{B?pm)m#0t0b(N@T(!?mqWe6Sw#N6-b1MD(*JIWk801d>YEb!U9^; zR#JbTY*fl|0RoH1kD$oRjFn8gJqT(b8A$c0Dze?+`VMUD$bl zS_aQqoeHF-V1t7_`-3Dgq3hLP*nWRYPWcYP3x#PO#}?Aou$(mSHOcIoh2i1-{2UEW z2&^iY4NSn17ef#U$Ja@t+4K#rGzVz14|^`RyC^&nN(gIee)ImkjdYJqDzai{Uz}-) z!p z6oW7#Atk4#B|S+Z;(#+W9L3)_lb>S7gb{Q>>a^s9D&+co6C{kua;2xHhaxBEws+2g zRH2t>`r(V(6Oy13%IhlD-|d45oauDP$a^8TbFhw2dCgNo*Ul}00bp;9WJN#tp|#o( zGqgN*4qVU+3J8Q;T|uCsuM<_m6B9`cZL7hidmSagHzz`WF;t^r?sCrt z)O)=5ADyJVA|4k1+Is~a2Y{rVATs&OOW?^(X|k*S7_;!viG^U%ZN23XEf=^|JIu}D zlAwmp?;*4&4t;XkQmMv2^@$y@T-5w;k8cGf8)te}i2ir=%D_G}{y`#Wv}ve&6ZBI* z(7kRBKYBL`etbs$*f}re+Z#|cjcBgKGEr5LXFz{bk00(x5W44I< z7Go37fTz{tdgW4SdW~ zQh)w<8Hr3xEMQ#B6KJAIfFdy`{6AVc>%XSIHjJy3bk}I4Yjii#T?$AI5Evbj5)z{& zB!);MD31CH2qQ*GNh8hZ?orb6OnvS@;PcCQo%1>8y6@|KrKc?|*W*AQ4CneZ0^VAK4Ua<6}`R$E@7s zGHGJgGDC5Q48n?!-zls>lE)D4^-k3B12X5R+;Cj296RgxMwo$ZG%+q*k!5AV#=_$d zh9h1&ovu+re;LCY_SPtM{cu~W8^}F~N6}n~4>w|k1^34jr{#%vQ>Ef5)M$2_9 zIC{0U(9t3Br6B5W$g=~1Q@F(dD;*Vm{1g=}OyMJ=BWnC2w*@%js=Q$@z z`a^6QeEs%yeAzXiO;4p4B_A-xfVcr_<4oGPy7CCl*-roxa4JCJ$ksyh#NGbP>9-~# zj(w(zg@l$#@)Mh(6PHC|QY)Z-Hd5E5gaqMiC%FekMhGEhdU^*8ddl~Nxw)3QhoLuA zINAqlieT=w?opN4B*=sNfrBtD(RvAF4*Y*vF+>XqB8?(R0U$ zi~D8E>5$nAIz5k>nbqqee8U=Ht~frR+RWPiBN5z3J$zMxNw0*@LYCF(nvP#y+fRck zq>X=H?#K`@G(Ap8pn;wSOYovlxzoZnvB1twNQC>`e_wjb(-{T*Tm}ql`ZxDhkZ>7y zoLeyS{@%3lDD0ET4Q;W8=}`!INda@&-HOjxD`T*<-n58Gg)2j?5GM}EW>Ve9#7g^9M8=K#H=?dOgB$_#>i$g~U668xY}~D~ zYLcB$nE_15YsXJ?A6ayCRb3m9(^kIhaKrHsAW0Ed39n8+!HM2$GlBwIIpZ*4EJU?6txgd3R*>5;{#{e%TK*@>^bn zHuWvqG0}7m68^fGn)SmH;W)JTKs(DFQeBV|g=WF7udhdC)JaLX|1j&@{Y}W|hQY(r zx_p@DK6+S4wbd>xp^*L-3eA^%z=SqhE!IxoUzDByyT94yg&z~~5lQ=krl2!iZ{=c> zE$G0`vKnEhW#L_YrcY!Mp*GFVtpe(&q}a5zViG#&Xhbni{}RrWmhBr+9|GwO=a&iI z?Sp=4#uRWHapF%39_xfh^JyHq1;6Y4wMU%S{Xlr73zaqpX|NtHo*%KDoo;BNQGqB; z6L)(~sn6ihQ1mu$EGT2qWP3_CAM7)!=-}$oZr>#um$09^A#M(bd!bfU1%FOrNNH-K z?}&1v&ckj20UAlNIEObELb_GEn)z{s%!3P!4~zW|JiHawsxD9-O&-J_Y(|ng(!9VSean|mRQ{z~5~{5RhrKgG}9qCOd{KhFef8d z*XG~+qk)%2HHB3j?w)`OF%$}=6b7Qw&^WV|;={q=%*dh&a0$b77VR4xctYJ)i>F8A z&m~a)!3S0ax+71+Khm}+_)0!)cF7|@Z1TR4gF+9WepR{5j!%uXWT`^=ZMf;)xf0>! zXX;L9V))eIT3D3E^qKW=N3c|_3dq~4iH8?ve%~Xi7s-`*%hp{1#b;8GfPWzUJCdJt zui|AS3FtFe{cv%&Yw`486}`T^#XF5XBl5Cj(hO;^aG9YqEn8sePt8y*ZS73f95t8M z>jaf4E(16q-?Oae5$o$IH669XrpfSGA0JWJw=B5YD>MV=GVKIQ6gwTmzwo0d&FY$s zU|w68mWrZ|PRxpk^TXHt>EAso$~Z!FH6P0P`3WQ6AVOD$oHh@9z-N2JWUPLhn6j0X z{Z>)k?1QvZPZKxBhC3&JmNn!P=LEhl{(5#28;y%0mKDf=METM^; zbzlo7+9O^i^Si>EseAm3spWC0j)grn#cJ%=aV@V`p9iMPjrWwSy0E{%vY)s_;qWTm z_Bu3rbwJCvc(s27?S`jJKY!aHM*a6K5zf4AI=ZYhrX7b zxQx+o4OygVw5yCXGu?z~bE@4iwu-fR)0cX(QZz6zIK2EKva6=x-M91O%oq~8Y5t-w zwm0TGe`t_b-bTG&*5V&Eg%%?9dJ|_bcL9owOrff1(87*>8UcNtdL|cm=VBh!<+O)o zE$H@{h3`dC*QhPnGsqN8R$x(YOJ=;PKlVPV`oyNBB9A?f4GHX}i3{~1% z0rhf4cA}}>DV&#h|>bC1f{J{2j+*we^{5`=vD;ovcrT+fPjHD zM9C9?2h&x(%C|QL<7bZ^oj7IZ18_sHhndy8w6tG9g}A{&#ctea3=H17!`)Zi9y8GC z?5{v~-_LZv05+dx%r3F2y8p@~ml!PN2dG9#P-AY2XU*w{T#Ft3>Q&RGfq{@6g;QI} z1($)b&r$Q6^wLx^cLRGLFswgjBwWx7U!B)Re@5)eT_F@-0;YHJ=H0BRP7r%jCj-3o+l^t#s(ZyzS)+r=BxGk!Gg<60&{K3ZBwL5oN`W7;V6ZcG#SyGD0v0v zk!uX69=&+}I}WK1ThmuRVr?nGc%{0$`O1-YUfevyJTRV>-Fkz#cqz>sO+|UUt1GO> zKB6Q9y)Pp2tFSaJa#T!B@zLPyR7@ULJDKnDtpv2R{U7NV!sI~)&lriasD6z$R9nD~ z3Zxd|WsQv6I(BN6(9UIsK42dQwIn{ic4Sk|Lo^X<((c0U#VDgBNrJ~hOht?A3~5-| zu#U1LhY1O$QECeD9~Y!Ql`-h?ahq7(9edNM#s-Q4yXp=a`nrUF z>`WC7dsSfqI9O@-1--pphjFze=)_-mA)_u1Yj~_$mwGDx9#~eEub%_*k1dhuZo@=( z689SVAR+?fb+qW(H^j?|ThiDlm;?}eOwUlJbhKCrJ&n4N+5N2$h~F_E7t)R3L>LPx z(FDZ_j@!D)(r59BvpbY+yaPJS^GIy5!l`)o&)g-0PS8_d?5W~4n3zGJnjBW8skiNY z8tJ97-IpUa3F5(pOUddDK)QDAq0V}mf4i0|@U=_m#UgC-M=^*c+qv~O>Zz+F(nV3P zJfR#G5}@PmKWo>o6@zdHb{PrTFD6X+@U3iBi~&zQ*$%uRf9qX&A9rZK)EkBr0Pv{(iD;RcQy95P#_NdM5_To)E0zs)j>mY%9gY8~#2v{#YJ|@>jFpy_ z;z_|(+lRU}Z-H!;h>=_&Kn(G7Y;ke%9!j~iqkhM^)U+&>rU`D|@@NE}aLucDZg5ft zrR6dGmh-l^JGo{RtHQ{v!`v2ERqH>k^0HEqZO_{~Aqg748t(@s(m7C)Gx&P0cJiGP z`zv*h!V6O?Lh-~2W|oyum^Xy}9DK=8cZE&x%++P>F)fuxJYI~pb+vo8|FC|d`p-;vrJ(CN z|23Emrh;7&VfOBJdln^czwd!+;_~FD6dlOO&`9j!W;zJEmV@0OWkk-Q=*{h$h#Zry zK5!atA4oMwb+mhWP|!I(o>zVpts|_Vk<&3&Qe`U(k_@sk==*GiQA#Mh+C&@@n$iIU za%v15c&?GzE-P-vuTSjckE%Q)TkK{4mz)X;-n%I&c~&g{(~xghY!@dU38%dQtl0O4 z+D;ADdkOQsDV0E*8kJL^STyG5>W9tb{;zP#v=8aJ3hHSU z8JH8L&`Uk3B?$?MSCp{D5a!a&tS1o9PtUX zUL=~0x5K&(X`!r$Sy|&eF}2w8j!8+0JrBSe1tcZj0!It>bKRuP{@`pEbx2wC7)hv) z^rC4;Bo$0}!0dUnG%jGJFhf!T(`Otbev^|c!>3z15LFIF2R612MU_0+rA99ndNdeF z>gq}d0^OS;d^i4+#jRx8^A2HT^p0<~V|9J?4WrLH!MQ>Kn-3UJMU6hnzM+=_04caf zYHr5Et>K{btug3rk^a&SCbyFZ#`^Y{%JSqM(AHCdkeBnH(0XrW2{*wMak_{=WBT3Y zOGcj)BJM9WQib&55^n3s7hkQCMT)-f%qaib-qnrqvT|lj`N^|g05RMe{b(y51 z#F3E!o1OiJJr~q`LFbr!qdFsi?GcmhG-CU%1jDN+t@2COcf-^IraEkb=mFxxE?j;6 zR2R_`h~?%blN_FPEYZ}BfJa3BxNy7vS_B$7fLaSNfgW(lhA$Fx==yL39GTYJ<^72# zc=ZaqvpbP^d7|Hs&G3u5|1*jTt7fL#+mw3UieQb1I6)>bcJaq;tuEFeb8}oSemM5s z^#}xLgJ_@)yYxbnqeInGomu*H6k;jK|E~{=2mkOre2rp$f6KshZ*hi%m$WXmhI8i> zK)cxaSf2?6qT&X*H&5mLjuv5`>rujAg;5*6{G+a}To*?+P=wEcTlM<7=k3PJQa9FO zvW+L|NqTw0-Mb>hZ`;0{qk;uH8nc|wcxQ`&1&4lHhZ~3Q--AWP#lKl_bI-1hU6Z$^ z0K`^g=w#GSLFJIQ`dn^qA88X7RYZTG=XV}Wiiu5ZXVc7{N_h0Kb8zBkWI}5b6XP;= zT*0O0=4K&maYnGL(cXUlSRWB%E`DBn1>YT`YTgFV0Y?X?(;CC_v%~RmcJj0HHhq8y zM;bFpB~d!O(vKx2vY2()o|H7yQy~n=FCziPY1KDZVhKn{Gc3+Y&?4UoqY$WKTP?Ua zxAI->PbRQPceQ#4W)BgVfp&z05Ny2<^ zqIrZla-U$g25@00hzYxjVIUa6(z+n{jcyfmFKV7^?_M zQc{|2uTK=AoL^q;Dn;3foi2551%%k+q2%2y1ww8gXhXk{sQ0d_JmaTln20N}U!kN} z2d!b>5e=Z*8UKdu|IY6JZD0T2h>Y%z{=fdTZU2_q^ObN)uP$O68IIZq=+acxds?Mz G8~H!j^%L9x literal 0 HcmV?d00001 diff --git a/doc/source/minibatch.rst b/doc/source/minibatch.rst index d22db7c22..6251fb596 100644 --- a/doc/source/minibatch.rst +++ b/doc/source/minibatch.rst @@ -3,6 +3,56 @@ Minibatching ============ -How to perform minibatching to improve efficiency. +Minibatching Overview +--------------------- +Minibatching takes multiple training examples and groups them together to be processed simultaneously, often allowing for large gains in computational efficiency due to the fact that modern hardware (particularly GPUs, but also CPUs) have very efficient vector processing instructions that can be exploited with appropriately structured inputs. +As shown in the figure below, common examples of this in neural networks include grouping together matrix-vector multiplies from multiple examples into a single matrix-matrix multiply, or performing an element-wise operation (such as $\tanh$) over multiple vectors at the same time as opposed to processing single vectors individually. +.. image:: images/minibatch.png + +In most neural network toolkits, mini-batching is largely left to the user, with a bit of help from the toolkit. +This is usually done by adding an additional dimension to the tensor that they are interested in processing, and ensuring that all operations consider this dimension when performing processing. +This adds some cognitive load, as the user must keep track of this extra batch dimension in all their calculations, and also ensure that they use the correct ordering of the batch dimensions to achieve maximum computational efficiency. +Users must also be careful when performing operations that combine batched and unbatched elements (such as batched hidden states of a neural network and unbatched parameter matrices or vectors), in which case they must concatenate vectors into batches, or "broadcast" the unbatched element, duplicating it along the batch dimension to ensure that there are no illegal dimension mismatches. + +.. code-block:: python + # in_words is a list [(word_{1,1}, word_{1,2}), (word_{2,1}, word_{2,2}), ...] + # out_labels is a list of output labels [label_1, label_2, ...] + word_1_batch = dy.lookup_batch(E, [x[0] for x in in_words]) + word_2_batch = dy.lookup_batch(E, [x[1] for x in in_words]) + scores_sym = dy.softmax(W*dy.concatenate([word_1_batch, word_2_batch])+b) + loss_sym = dy.sum_batches( dy.pickneglogsoftmax_batch(scores_sym, out_labels) ) + +DyNet hides much of this complexity from the user through the use of specially designed batching operations which treat the number of mini-batch elements not as another standard dimension, but as a special dimension with particular semantics. +Broadcasting is done behind the scenes by each operation implemented in DyNet, and thus the user must only think about inputting multiple pieces of data for each batch, and calculating losses using multiple labels. + +First, let's take a look at a non-minibatched example using the Python API. +In this example, we look up word embeddings ``word_1`` and ``word_2`` using lookup parameters ``E``. +We then perform an affine transform using weights ``W`` and bias ``b``, and perform a softmax. +Finally, we calculate the loss given the true label ``out_label``. + +.. code-block:: python + # in_words is a tuple (word_1, word_2) + # out_label is an output label + word_1 = E[in_words[0]] + word_2 = E[in_words[1]] + scores_sym = dy.softmax(W*dy.concatenate([word_1, word_2])+b) + loss_sym = dy.pickneglogsoftmax(scores_sym, out_label) + +Next, let's take a look at the mini-batched version: + +.. code-block:: python + # in_words is a list [(word_{1,1}, word_{1,2}), (word_{2,1}, word_{2,2}), ...] + # out_labels is a list of output labels [label_1, label_2, ...] + word_1_batch = dy.lookup_batch(E, [x[0] for x in in_words]) + word_2_batch = dy.lookup_batch(E, [x[1] for x in in_words]) + scores_sym = dy.softmax(W*dy.concatenate([word_1_batch, word_2_batch])+b) + loss_sym = dy.sum_batches( dy.pickneglogsoftmax_batch(scores_sym, out_labels) ) + +We can see there are only 4 major changes: the word IDs need to be transformed into lists of IDs instead of a single ID, we need to call ``lookup_batch`` instead of the standard lookup, we need to call ``pickneglogsoftmax_batch`` instead of the unbatched version, and we need to call ``sum_batches`` at the end to sum the loss from all the batches. + +Comparison of Standard and Minibatched Functions +------------------------------------------------ + +(TODO: This documentation is not yet finished. We need a comparison of standard and mini-batched functions in the C++ and Python APIs.) From 6a6db547255b3b52e8c90e4f4199a23d94c7df11 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 16 Jan 2017 09:04:20 -0500 Subject: [PATCH 946/965] Fixes to minibatching doc --- .gitignore | 7 +++++++ .../images/{minibatches.png => minibatch.png} | Bin doc/source/minibatch.rst | 13 ++++--------- 3 files changed, 11 insertions(+), 9 deletions(-) rename doc/source/images/{minibatches.png => minibatch.png} (100%) diff --git a/.gitignore b/.gitignore index e336c5045..8a0360199 100644 --- a/.gitignore +++ b/.gitignore @@ -50,5 +50,12 @@ rnnlm/ptb-mikolov/ *.out *.app +# Editor stuff +*.swp + +# Doc stuff +doc/doxygen/xml +doc/source/tutorials_notebooks + .RData .RHistory diff --git a/doc/source/images/minibatches.png b/doc/source/images/minibatch.png similarity index 100% rename from doc/source/images/minibatches.png rename to doc/source/images/minibatch.png diff --git a/doc/source/minibatch.rst b/doc/source/minibatch.rst index 6251fb596..8c29ff411 100644 --- a/doc/source/minibatch.rst +++ b/doc/source/minibatch.rst @@ -7,23 +7,16 @@ Minibatching Overview --------------------- Minibatching takes multiple training examples and groups them together to be processed simultaneously, often allowing for large gains in computational efficiency due to the fact that modern hardware (particularly GPUs, but also CPUs) have very efficient vector processing instructions that can be exploited with appropriately structured inputs. -As shown in the figure below, common examples of this in neural networks include grouping together matrix-vector multiplies from multiple examples into a single matrix-matrix multiply, or performing an element-wise operation (such as $\tanh$) over multiple vectors at the same time as opposed to processing single vectors individually. +As shown in the figure below, common examples of this in neural networks include grouping together matrix-vector multiplies from multiple examples into a single matrix-matrix multiply, or performing an element-wise operation (such as ``tanh``) over multiple vectors at the same time as opposed to processing single vectors individually. .. image:: images/minibatch.png + :align: center In most neural network toolkits, mini-batching is largely left to the user, with a bit of help from the toolkit. This is usually done by adding an additional dimension to the tensor that they are interested in processing, and ensuring that all operations consider this dimension when performing processing. This adds some cognitive load, as the user must keep track of this extra batch dimension in all their calculations, and also ensure that they use the correct ordering of the batch dimensions to achieve maximum computational efficiency. Users must also be careful when performing operations that combine batched and unbatched elements (such as batched hidden states of a neural network and unbatched parameter matrices or vectors), in which case they must concatenate vectors into batches, or "broadcast" the unbatched element, duplicating it along the batch dimension to ensure that there are no illegal dimension mismatches. -.. code-block:: python - # in_words is a list [(word_{1,1}, word_{1,2}), (word_{2,1}, word_{2,2}), ...] - # out_labels is a list of output labels [label_1, label_2, ...] - word_1_batch = dy.lookup_batch(E, [x[0] for x in in_words]) - word_2_batch = dy.lookup_batch(E, [x[1] for x in in_words]) - scores_sym = dy.softmax(W*dy.concatenate([word_1_batch, word_2_batch])+b) - loss_sym = dy.sum_batches( dy.pickneglogsoftmax_batch(scores_sym, out_labels) ) - DyNet hides much of this complexity from the user through the use of specially designed batching operations which treat the number of mini-batch elements not as another standard dimension, but as a special dimension with particular semantics. Broadcasting is done behind the scenes by each operation implemented in DyNet, and thus the user must only think about inputting multiple pieces of data for each batch, and calculating losses using multiple labels. @@ -33,6 +26,7 @@ We then perform an affine transform using weights ``W`` and bias ``b``, and perf Finally, we calculate the loss given the true label ``out_label``. .. code-block:: python + # in_words is a tuple (word_1, word_2) # out_label is an output label word_1 = E[in_words[0]] @@ -43,6 +37,7 @@ Finally, we calculate the loss given the true label ``out_label``. Next, let's take a look at the mini-batched version: .. code-block:: python + # in_words is a list [(word_{1,1}, word_{1,2}), (word_{2,1}, word_{2,2}), ...] # out_labels is a list of output labels [label_1, label_2, ...] word_1_batch = dy.lookup_batch(E, [x[0] for x in in_words]) From 51da65bd86a42fa12b2ac91608ad918dde0a5438 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 16 Jan 2017 09:08:50 -0500 Subject: [PATCH 947/965] Added doc for multiprocessing --- doc/source/multiprocessing.rst | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/doc/source/multiprocessing.rst b/doc/source/multiprocessing.rst index 5026a1792..3e4dc7e37 100644 --- a/doc/source/multiprocessing.rst +++ b/doc/source/multiprocessing.rst @@ -1,6 +1,15 @@ Multi-processing ================ -How to perform processing on multiple threads +In addition to minibatch support, the DyNet C++ API also supports training models using many CPU cores (Python support is pending). +This is particularly useful when performing training of networks that are not conducive to simple mini-batching, such as tree-structured networks. -(TODO: create doc) +DyNet abstracts most of the behind-the-scenes grit from the user. +The user defines a function to be called for each datum in the training data set, and passes this function, along with an array of data, to DyNet. +Internally, DyNet launches a pool of training processes and automatically handles passing data examples to each worker. +Each worker process individually processes a datum, computing the results of the forward and backward passes, computes gradients with respect to each parameter, and passes these results back to the parent process via a shared memory variable. +Whenever the parent process, which is also processing data, completes a gradient computation, it averages all of the gradients currently in the shared memory gradient storage and updates all parameters with respect to that average gradient. +In this way running training on ``n`` cores is similar to training with a stochastic minibatch size with expected value of approximately ``n``. +This method is quite efficient, achieving nearly linear speedups with increasing numbers of cores, due to its lockless nature. + +Examples of how to use the multi-processing API can be found in the ``xor-mp`` and ``rnnlm-mp`` sections of the ``examples/cpp`` directory. From 9d35f04f066e1a3fa8844b5ec7c652bbb4b90d0b Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 16 Jan 2017 09:15:31 -0500 Subject: [PATCH 948/965] Some fixes to doc --- doc/source/install.rst | 4 ++-- doc/source/python.rst | 4 ++-- doc/source/tutorial.rst | 2 +- examples/python/tutorials/tutorial-1-xor.ipynb | 12 ++++++------ 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index 5e243c6dd..79a02354d 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -107,7 +107,7 @@ GPU/MKL support and build options GPU (CUDA) support ~~~~~~~~~~~~~~~~~~ -``dynet`` supports running programs on GPUs with CUDA. If you have CUDA +DyNet supports running programs on GPUs with CUDA. If you have CUDA installed, you can build DyNet with GPU support by adding ``-DBACKEND=cuda`` to your cmake options. This will result in three libraries named "libdynet," "libgdynet," and "libdynetcuda" being @@ -169,7 +169,7 @@ there are diminishing returns or even slowdown. Non-standard Boost location ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -``dynet`` requires Boost, and will find it if it is in the standard +DyNet requires Boost, and will find it if it is in the standard location. If Boost is in a non-standard location, say ``$HOME/boost``, you can specify the location by adding the following to your CMake options: diff --git a/doc/source/python.rst b/doc/source/python.rst index d88309ce8..bd4027f6a 100644 --- a/doc/source/python.rst +++ b/doc/source/python.rst @@ -135,9 +135,9 @@ site-packages, and works without root privileges. To install the module to the system site-packages (for all users), or to the current `virtualenv` (if you are on one), run ``python setup.py install`` without this switch. -You should now have a working python binding (the dynet module). +You should now have a working python binding (the ``dynet`` module). -Note however that the installation relies on the compiled dynet library +Note however that the installation relies on the compiled DyNet library being in ``$PATH_TO_DYNET/build/dynet``, so make sure not to move it from there. diff --git a/doc/source/tutorial.rst b/doc/source/tutorial.rst index 32a37d694..fb552c39f 100644 --- a/doc/source/tutorial.rst +++ b/doc/source/tutorial.rst @@ -4,7 +4,7 @@ DyNet Tutorial C++ Tutorial ------------ -See the tutorials for the C++ version of Dynet +See the tutorials for the C++ version of DyNet .. toctree:: :maxdepth: 2 diff --git a/examples/python/tutorials/tutorial-1-xor.ipynb b/examples/python/tutorials/tutorial-1-xor.ipynb index 16b9f71e0..9e13933e7 100644 --- a/examples/python/tutorials/tutorial-1-xor.ipynb +++ b/examples/python/tutorials/tutorial-1-xor.ipynb @@ -4,14 +4,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Working with the python dyNET package\n", + "## Working with the python DyNet package\n", "\n", - "The dyNET package is intended for neural-network processing on the CPU, and is particularly suited for NLP applications. It is a python-wrapper for the dyNET C++ package written by Chris Dyer.\n", + "The DyNet package is intended for training and using neural networks, and is particularly suited for applications with dynamically changing network structures. It is a python-wrapper for the DyNet C++ package.\n", "\n", - "There are two modes of operation:\n", + "In neural network packages there are generally two modes of operation:\n", "\n", "* __Static networks__, in which a network is built and then being fed with different inputs/outputs. Most NN packages work this way.\n", - "* __Dynamic networks__, in which a new network is built for each training example (sharing parameters with the networks of other training examples). This approach is what makes dyNET unique, and where most of its power comes from.\n", + "* __Dynamic networks__, in which a new network is built for each training example (sharing parameters with the networks of other training examples). This approach is what makes DyNet unique, and where most of its power comes from.\n", "\n", "We will describe both of these modes." ] @@ -22,7 +22,7 @@ "source": [ "### Package Fundamentals\n", "\n", - "The main piece of dyNET is the `ComputationGraph`, which is what essentially defines a neural network.\n", + "The main piece of DyNet is the `ComputationGraph`, which is what essentially defines a neural network.\n", "The `ComputationGraph` is composed of expressions, which relate to the inputs and outputs of the network,\n", "as well as the `Parameters` of the network. The parameters are the things in the network that are optimized over time, and all of the parameters sit inside a `Model`. There are `trainers` (for example `SimpleSGDTrainer`) that are in charge of setting the parameter values.\n", "\n", @@ -37,7 +37,7 @@ "source": [ "### Static Networks\n", "\n", - "The life-cycle of a dyNET program is:\n", + "The life-cycle of a DyNet program is:\n", "1. Create a `Model`, and populate it with `Parameters`.\n", "2. Renew the computation graph, and create `Expression` representing the network\n", " (the network will include the `Expression`s for the `Parameters` defined in the model).\n", From b36cd27343cc7b4d2d50f92b0baacf19e7c9a329 Mon Sep 17 00:00:00 2001 From: Jonathan Kummerfeld Date: Mon, 16 Jan 2017 10:56:35 -0500 Subject: [PATCH 949/965] Updating install docs to be consistent with build --- doc/source/install.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index 79a02354d..3b98482c9 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -66,7 +66,7 @@ To see that things have built properly, you can run :: - ./examples/xor + ./examples/train_xor which will train a multilayer perceptron to predict the xor function. From e950a9d4983306201b20902d41e91e8f7a21c94c Mon Sep 17 00:00:00 2001 From: paul Date: Mon, 16 Jan 2017 11:17:28 -0500 Subject: [PATCH 950/965] Fix mnist examples dependencies & add it to build path --- examples/CMakeLists.txt | 2 +- examples/{ => cpp}/utils/data-io.h | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename examples/{ => cpp}/utils/data-io.h (100%) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index b8ce79bee..ea9044d10 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -4,7 +4,7 @@ if (NOT MSVC) set(MP_EXAMPLES rnnlm-mp xor-mp) endif() -foreach(FOLDER encdec mlc tok-embed poisson-regression tag-bilstm embed-cl xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat read-write segrnn-sup ${MP_EXAMPLES}) +foreach(FOLDER encdec mlc mnist tok-embed poisson-regression tag-bilstm embed-cl xor xor-xent xor-batch xor-batch-lookup rnnlm rnnlm-aevb rnnlm-cfsm rnnlm-batch nlm textcat read-write segrnn-sup ${MP_EXAMPLES}) set(TARGET train_${FOLDER}) ADD_EXECUTABLE(${TARGET} cpp/${FOLDER}/${TARGET}.cc) if (WITH_CUDA_BACKEND) diff --git a/examples/utils/data-io.h b/examples/cpp/utils/data-io.h similarity index 100% rename from examples/utils/data-io.h rename to examples/cpp/utils/data-io.h From f30f42293f00c0d935f8e45b1c9910e9c28e36e1 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 16 Jan 2017 11:26:41 -0500 Subject: [PATCH 951/965] More efficient colwise add --- dynet/nodes-common.cc | 2 +- dynet/nodes.cc | 31 +++++++++++++++++++++++++------ dynet/nodes.h | 1 + tests/test-nodes.cc | 24 ++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/dynet/nodes-common.cc b/dynet/nodes-common.cc index 4344db220..094a8c60c 100644 --- a/dynet/nodes-common.cc +++ b/dynet/nodes-common.cc @@ -21,7 +21,7 @@ Dim AddVectorToAllColumns::dim_forward(const vector& xs) const { cerr << "Bad input dimensions in AddVectorToAllColumns: " << xs << endl; throw std::invalid_argument("bad input dimensions in AddVectorToAllColumns"); } - return xs[0]; + return Dim({xs[0][0], xs[0][1]}, max(xs[0].bd,xs[1].bd)); } string SparsemaxLoss::as_string(const vector& arg_names) const { diff --git a/dynet/nodes.cc b/dynet/nodes.cc index b3908bc9c..15c802f38 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -215,8 +215,16 @@ inline void CUDAMatrixMultiply(const Device_GPU & dev, const Tensor& l, const Te template void AddVectorToAllColumns::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - Eigen::array bcasts; bcasts[0] = 1; bcasts[1] = xs[0]->d[1]; - fx.t<2>().device(*dev.edevice) = xs[0]->t<2>() + xs[1]->t<2>().broadcast(bcasts); + // TODO: Profile on CPU. Broadcasting may be slow. + if(xs[0]->d.bd >= xs[1]->d.bd) { + Eigen::array bcasts = {1, (int)xs[0]->d[1], (int)(xs[0]->d.bd/xs[1]->d.bd)}; + fx.tb<2>().device(*dev.edevice) = xs[0]->tb<2>() + xs[1]->tb<2>().broadcast(bcasts); + } else { + assert(xs[0]->d.bd == 1); + Eigen::array bcasts0 = {1, 1, (int)xs[1]->d.bd}; + Eigen::array bcasts1 = {1, (int)xs[0]->d[1], 1}; + fx.tb<2>().device(*dev.edevice) = xs[0]->tb<2>().broadcast(bcasts0) + xs[1]->tb<2>().broadcast(bcasts1); + } } template @@ -227,12 +235,23 @@ void AddVectorToAllColumns::backward_dev_impl(const MyDevice & dev, unsigned i, Tensor& dEdxi) const { assert(i < 2); + // TODO: profile on CPU and see whether the chip version is better if (i == 0) { // x - dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); + if(dEdf.d.bd == dEdxi.d.bd) { + dEdxi.tvec().device(*dev.edevice) += dEdf.tvec(); + } else { + Eigen::array red_axis = {2}; + dEdxi.t<2>().device(*dev.edevice) += dEdf.tb<2>().sum(red_axis); + } } else { // bias - for(size_t i = 0; i < xs[0]->d[1]; i++) - dEdxi.t<1>().device(*dev.edevice) += dEdf.t<2>().chip<1>(i); - // TODO: This is not great. Can we use broadcasting similar to SumColumns? + if(dEdf.d.bd == dEdxi.d.bd) { + Eigen::array red_axis = {1}; + dEdxi.tb<1>().device(*dev.edevice) += dEdf.tb<2>().sum(red_axis); + } else { + assert(dEdxi.d.bd == 1); + Eigen::array red_axis = {1,2}; + dEdxi.t<1>().device(*dev.edevice) += dEdf.tb<2>().sum(red_axis); + } } } DYNET_NODE_INST_DEV_IMPL(AddVectorToAllColumns) diff --git a/dynet/nodes.h b/dynet/nodes.h index e29c3c5f5..6f7b194fd 100644 --- a/dynet/nodes.h +++ b/dynet/nodes.h @@ -13,6 +13,7 @@ namespace dynet { // y = M + v (broadcasting over columns) struct AddVectorToAllColumns : public Node { explicit AddVectorToAllColumns(const std::initializer_list& a) : Node(a) {} + virtual bool supports_multibatch() const override { return true; } DYNET_NODE_DEFINE_DEV_IMPL() }; diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index c034c60d4..7541cc741 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -322,6 +322,30 @@ BOOST_AUTO_TEST_CASE( colwise_add_gradient ) { BOOST_CHECK(check_grad(mod, z, 0)); } +// Expression colwise_add(const Expression& x, const Expression& bias); +BOOST_AUTO_TEST_CASE( colwise_add_batch1_gradient ) { + dynet::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + Expression x3 = input(cg, Dim({1,3},2), batch_vals); + Expression y = colwise_add(x1 * x3, x2); + Expression ones3 = input(cg, {1,3}, ones3_vals); + Expression z = sum_batches(ones3 * y * transpose(ones3)); + BOOST_CHECK(check_grad(mod, z, 0)); +} + +// Expression colwise_add(const Expression& x, const Expression& bias); +BOOST_AUTO_TEST_CASE( colwise_add_batch2_gradient ) { + dynet::ComputationGraph cg; + Expression x1 = parameter(cg, param1); + Expression x2 = parameter(cg, param2); + Expression x3 = input(cg, Dim({3,1},2), batch_vals); + Expression y = colwise_add(x1 * transpose(x2), cmult(x2, x3)); + Expression ones3 = input(cg, {1,3}, ones3_vals); + Expression z = sum_batches(ones3 * y * transpose(ones3)); + BOOST_CHECK(check_grad(mod, z, 0)); +} + // Expression concatenate_cols(const std::initializer_list& xs); BOOST_AUTO_TEST_CASE( concatenate_cols_gradient ) { dynet::ComputationGraph cg; From 39fc3318b3f71324e1eeb9e2dfd1c12b640767ef Mon Sep 17 00:00:00 2001 From: Paul Michel Date: Mon, 16 Jan 2017 21:04:30 -0500 Subject: [PATCH 952/965] Bugfix in vanillalstm serialization vanillalstm didn't save `hid` which causes errors when loading a saved model. Couldn't test this but should be fine. --- dynet/lstm.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/dynet/lstm.cc b/dynet/lstm.cc index 13e93a62a..ba7fd8272 100644 --- a/dynet/lstm.cc +++ b/dynet/lstm.cc @@ -441,6 +441,7 @@ void VanillaLSTMBuilder::serialize(Archive& ar, const unsigned int) { ar & params; ar & layers; ar & dropout_rate; + ar & hid; } DYNET_SERIALIZE_IMPL(VanillaLSTMBuilder); From 0e32f31c47a8654b6ed6070a829f6fa13e785b61 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Mon, 16 Jan 2017 21:45:00 -0500 Subject: [PATCH 953/965] Added tech report link --- README.md | 10 ++++++++-- doc/source/index.rst | 9 +++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index efdc0fa70..b368493d4 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,14 @@ DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural netwo Read the [documentation](http://dynet.readthedocs.io/en/latest/) to get started, and feel free to contact the [dynet-users group](https://groups.google.com/forum/#!forum/dynet-users) group with any questions (if you want to receive email make sure to select "all email" when you sign up). We greatly appreciate any bug reports and contributions, which can be made by filing an issue or making a pull request through the [github page](http://github.com/clab/dynet). -* **Latest Code:** Can be found on the github page master branch. -* **Latest Release:** [v1.0-rc1](https://github.com/clab/dynet/releases/tag/v1.0-rc1) +You can also read more technical details in our [technical report](https://arxiv.org/abs/1701.03980). If you use DyNet for research, please cite this report as follows: + + @article{dynet, + title={DyNet: The Dynamic Neural Network Toolkit}, + author={Graham Neubig and Chris Dyer and Yoav Goldberg and Austin Matthews and Waleed Ammar and Antonios Anastasopoulos and Miguel Ballesteros and David Chiang and Daniel Clothiaux and Trevor Cohn and Kevin Duh and Manaal Faruqui and Cynthia Gan and Dan Garrette and Yangfeng Ji and Lingpeng Kong and Adhiguna Kuncoro and Gaurav Kumar and Chaitanya Malaviya and Paul Michel and Yusuke Oda and Matthew Richardson and Naomi Saphra and Swabha Swayamdipta and Pengcheng Yin}, + journal={arXiv preprint arXiv:1701.03980}, + year={2017} + } [![Build Status](https://travis-ci.org/clab/dynet.svg?branch=master)](https://travis-ci.org/clab/dynet) [![Doc build Status](https://readthedocs.org/projects/dynet/badge/?version=latest)](http://dynet.readthedocs.io/en/latest/) diff --git a/doc/source/index.rst b/doc/source/index.rst index c7f87b0c4..8d31a8577 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -10,6 +10,15 @@ DyNet documentation Read the documentation below to get started, and feel free to contact the `dynet-users `_ group with any questions (if you want to receive email make sure to select "all email" when you sign up). We greatly appreciate any bug reports and contributions, which can be made by filing an issue or making a pull request through the `github page `_. +You can also read more technical details in our `technical report `_. If you use DyNet for research, please cite this report as follows:: + + @article{dynet, + title={DyNet: The Dynamic Neural Network Toolkit}, + author={Graham Neubig and Chris Dyer and Yoav Goldberg and Austin Matthews and Waleed Ammar and Antonios Anastasopoulos and Miguel Ballesteros and David Chiang and Daniel Clothiaux and Trevor Cohn and Kevin Duh and Manaal Faruqui and Cynthia Gan and Dan Garrette and Yangfeng Ji and Lingpeng Kong and Adhiguna Kuncoro and Gaurav Kumar and Chaitanya Malaviya and Paul Michel and Yusuke Oda and Matthew Richardson and Naomi Saphra and Swabha Swayamdipta and Pengcheng Yin}, + journal={arXiv preprint arXiv:1701.03980}, + year={2017} + } + DyNet can be installed according to the instructions below: .. toctree:: From 8896effea8cf10068895378163f77d4645f68703 Mon Sep 17 00:00:00 2001 From: Jonathan Kummerfeld Date: Tue, 17 Jan 2017 12:15:36 -0500 Subject: [PATCH 954/965] Fixing MKL build for OS X --- CMakeLists.txt | 2 ++ doc/source/install.rst | 2 ++ 2 files changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index e3f9e40d5..fd40aa10f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,11 +22,13 @@ function(find_mkl) PATHS ${MKL_ROOT} ${MKL_ROOT}/include) find_library(MKL_CORE_LIB NAMES mkl_intel_lp64 mkl_intel_thread mkl_core PATHS ${MKL_ROOT} ${MKL_ROOT}/lib/${MKL_ARCH} + ${MKL_ROOT}/lib #OSX DOC "MKL core library path") find_library(MKL_COMPILER_LIB NAMES iomp5 libiomp5md PATHS ${MKL_ROOT} ${MKL_ROOT}/../compiler/lib/${MKL_ARCH} #Windows ${MKL_ROOT}/../compilers_and_libraries/linux/lib/${MKL_ARCH}_lin #Linux + ${MKL_ROOT}/../compilers_and_libraries/mac/lib #OSX DOC "MKL compiler lib (for threaded MKL)") if(MKL_INCLUDE_DIR AND MKL_CORE_LIB AND MKL_COMPILER_LIB) diff --git a/doc/source/install.rst b/doc/source/install.rst index 3b98482c9..7c608249d 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -139,6 +139,8 @@ If CMake is unable to find MKL automatically, try setting `MKL_ROOT`, such as -DMKL_ROOT="/path/to/MKL" +One common install location is ``/opt/intel/mkl/``. + If either `MKL` or `MKL_ROOT` are set, CMake will look for MKL. By default, MKL will use all CPU cores. You can control how many cores MKL uses by setting the environment From 043c0027cede3a28873320b88e77d0f5cc93e4db Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Tue, 17 Jan 2017 12:32:33 -0500 Subject: [PATCH 955/965] Updated name to match title of tech report --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b368493d4..2f7802e09 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # DyNet -Dynamic neural network library +The Dynamic Neural Network Toolkit DyNet (formerly known as [cnn](http://github.com/clab/cnn-v1)) is a neural network library developed by Carnegie Mellon University and many others. It is written in C++ (with bindings in Python) and is designed to be efficient when run on either CPU or GPU, and to work well with networks that have dynamic structures that change for every training instance. For example, these kinds of networks are particularly important in natural language processing tasks, and DyNet has been used to build state-of-the-art systems for [syntactic parsing](https://github.com/clab/lstm-parser), [machine translation](https://github.com/neubig/lamtram), [morphological inflection](https://github.com/mfaruqui/morph-trans), and many other application areas. From 19c25d9e1028753453e074f44c7e15d68f59318b Mon Sep 17 00:00:00 2001 From: alvations Date: Wed, 18 Jan 2017 13:31:15 +0800 Subject: [PATCH 956/965] Added Mac installation instructions and eigen Added explicit instructions for Mac and explicit installation instructions for eigen. --- doc/source/install.rst | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/doc/source/install.rst b/doc/source/install.rst index 7c608249d..a48de3340 100644 --- a/doc/source/install.rst +++ b/doc/source/install.rst @@ -8,20 +8,22 @@ Prerequisites DyNet relies on a number of external libraries including Boost, CMake, Eigen, and Mercurial (to install Eigen). Boost, CMake, and Mercurial can -be installed from standard repositories, for example on Ubuntu Linux: +be installed from standard repositories. + +For example on **Ubuntu Linux**: :: sudo apt-get install libboost-all-dev cmake mercurial -Or on OSX, first make sure the Apple Command Line Tools are installed, then +Or on **Mac OSX**, first make sure the Apple Command Line Tools are installed, then get Boost, CMake, and Mercurial with either homebrew or macports: :: xcode-select --install - brew install boost cmake hg - sudo port install boost cmake mercurial + brew install boost cmake hg # Using homebrew. + sudo port install boost cmake mercurial # Using macports. To compile DyNet you also need the `development version of the Eigen library `__. **If you use any of the @@ -32,6 +34,11 @@ the following command: :: hg clone https://bitbucket.org/eigen/eigen/ -r 346ecdb + cd eigen + mkdir build && cd build + cmake .. + make install # sudo permissions might be necessary on Linux. + cd ../.. The `-r NUM` specified a revision number that is known to work. Adventurous users can remove it and use the very latest version, at the risk of the code breaking / not compiling. @@ -55,6 +62,7 @@ to generate the makefiles cd build cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen + Then compile, where "2" can be replaced by the number of cores on your machine From 4929459711aac8493d0ab81886643e990e94d01e Mon Sep 17 00:00:00 2001 From: Enrique Manjavacas Date: Wed, 18 Jan 2017 11:03:42 +0100 Subject: [PATCH 957/965] replace random sampling with argmax --- examples/python/attention.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/examples/python/attention.py b/examples/python/attention.py index 5a458c68c..d0dce51e9 100644 --- a/examples/python/attention.py +++ b/examples/python/attention.py @@ -103,13 +103,6 @@ def decode(dec_lstm, vectors, output): def generate(input, enc_fwd_lstm, enc_bwd_lstm, dec_lstm): - def sample(probs): - rnd = random.random() - for i, p in enumerate(probs): - rnd -= p - if rnd <= 0: break - return i - embedded = embed_sentence(input) encoded = encode_sentence(enc_fwd_lstm, enc_bwd_lstm, embedded) @@ -126,9 +119,8 @@ def sample(probs): s = s.add_input(vector) out_vector = w * s.output() + b - probs = dy.softmax(out_vector) - probs = probs.vec_value() - next_char = sample(probs) + probs = dy.softmax(out_vector).vec_value() + next_char = probs.index(max(probs)) last_output_embeddings = output_lookup[next_char] if int2char[next_char] == EOS: count_EOS += 1 From c4ca3a4f4bf51d72cb9adf1c76eab0ee83fab1ee Mon Sep 17 00:00:00 2001 From: Enrique Manjavacas Date: Wed, 18 Jan 2017 11:03:59 +0100 Subject: [PATCH 958/965] vectorize attention weight loop --- examples/python/attention.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/examples/python/attention.py b/examples/python/attention.py index d0dce51e9..3214338f7 100644 --- a/examples/python/attention.py +++ b/examples/python/attention.py @@ -69,15 +69,23 @@ def attend(input_vectors, state): w1 = dy.parameter(attention_w1) w2 = dy.parameter(attention_w2) v = dy.parameter(attention_v) - attention_weights = [] + # w2dt: (attdim x attdim) w2dt = w2*dy.concatenate(list(state.s())) - for input_vector in input_vectors: - attention_weight = v*dy.tanh(w1*input_vector + w2dt) - attention_weights.append(attention_weight) - attention_weights = dy.softmax(dy.concatenate(attention_weights)) - output_vectors = dy.esum([vector*attention_weight for vector, attention_weight in zip(input_vectors, attention_weights)]) - return output_vectors + # input_mat: (encoder_state x seqlen) => input vecs concatenated as cols + input_mat = dy.concatenate_cols(input_vectors) + # w1dt: (attdim x seqlen) + w1dt = w1 * input_mat + # add w1dt to each column of w2dt + # merged_states: (attdim x seqlen) + merged_states = dy.colwise_add(w1dt, w2dt) + # att_weights: (seqlen,) row vector + att_weights = dy.transpose(dy.tanh(merged_states)) * dy.transpose(v) + # alternatively: + # att_weights = dy.reshape(v * dy.tanh(merged_states), (len(input_vectors),)) + att_weights = dy.softmax(att_weights) + context = input_mat * att_weights + return context def decode(dec_lstm, vectors, output): From bf36c6641742d503529bb4e0bab21c2134ea34c0 Mon Sep 17 00:00:00 2001 From: Enrique Manjavacas Date: Wed, 18 Jan 2017 11:17:43 +0100 Subject: [PATCH 959/965] simplify dy ops --- examples/python/attention.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/examples/python/attention.py b/examples/python/attention.py index 3214338f7..5f81b9d8a 100644 --- a/examples/python/attention.py +++ b/examples/python/attention.py @@ -70,20 +70,16 @@ def attend(input_vectors, state): w2 = dy.parameter(attention_w2) v = dy.parameter(attention_v) - # w2dt: (attdim x attdim) - w2dt = w2*dy.concatenate(list(state.s())) # input_mat: (encoder_state x seqlen) => input vecs concatenated as cols input_mat = dy.concatenate_cols(input_vectors) + # w2dt: (attdim x attdim) + w2dt = w2*dy.concatenate(list(state.s())) # w1dt: (attdim x seqlen) w1dt = w1 * input_mat - # add w1dt to each column of w2dt - # merged_states: (attdim x seqlen) - merged_states = dy.colwise_add(w1dt, w2dt) # att_weights: (seqlen,) row vector - att_weights = dy.transpose(dy.tanh(merged_states)) * dy.transpose(v) - # alternatively: - # att_weights = dy.reshape(v * dy.tanh(merged_states), (len(input_vectors),)) - att_weights = dy.softmax(att_weights) + unnormalized = dy.transpose(v * dy.tanh(dy.colwise_add(w1dt, w2dt))) + att_weights = dy.softmax(unnormalized) + # context: (encoder_state) context = input_mat * att_weights return context From 991aa50757b094714c776cd8ee40645e957b7ffd Mon Sep 17 00:00:00 2001 From: Enrique Manjavacas Date: Wed, 18 Jan 2017 14:30:56 +0100 Subject: [PATCH 960/965] externalize w1dt computation and cache it --- examples/python/attention.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/examples/python/attention.py b/examples/python/attention.py index 5f81b9d8a..6e2da3344 100644 --- a/examples/python/attention.py +++ b/examples/python/attention.py @@ -62,20 +62,16 @@ def encode_sentence(enc_fwd_lstm, enc_bwd_lstm, sentence): return vectors -def attend(input_vectors, state): - global attention_w1 +def attend(input_mat, state, w1dt): global attention_w2 global attention_v - w1 = dy.parameter(attention_w1) w2 = dy.parameter(attention_w2) v = dy.parameter(attention_v) # input_mat: (encoder_state x seqlen) => input vecs concatenated as cols - input_mat = dy.concatenate_cols(input_vectors) + # w1dt: (attdim x seqlen) # w2dt: (attdim x attdim) w2dt = w2*dy.concatenate(list(state.s())) - # w1dt: (attdim x seqlen) - w1dt = w1 * input_mat # att_weights: (seqlen,) row vector unnormalized = dy.transpose(v * dy.tanh(dy.colwise_add(w1dt, w2dt))) att_weights = dy.softmax(unnormalized) @@ -90,13 +86,18 @@ def decode(dec_lstm, vectors, output): w = dy.parameter(decoder_w) b = dy.parameter(decoder_b) + w1 = dy.parameter(attention_w1) + input_mat = dy.concatenate_cols(vectors) + w1dt = None last_output_embeddings = output_lookup[char2int[EOS]] s = dec_lstm.initial_state().add_input(dy.concatenate([dy.vecInput(STATE_SIZE*2), last_output_embeddings])) loss = [] - for char in output: - vector = dy.concatenate([attend(vectors, s), last_output_embeddings]) + for char in output: + # w1dt can be computed and cached once for the entire decoding phase + w1dt = w1dt or w1 * input_mat + vector = dy.concatenate([attend(input_mat, s, w1dt), last_output_embeddings]) s = s.add_input(vector) out_vector = w * s.output() + b probs = dy.softmax(out_vector) @@ -106,21 +107,26 @@ def decode(dec_lstm, vectors, output): return loss -def generate(input, enc_fwd_lstm, enc_bwd_lstm, dec_lstm): - embedded = embed_sentence(input) +def generate(in_seq, enc_fwd_lstm, enc_bwd_lstm, dec_lstm): + embedded = embed_sentence(in_seq) encoded = encode_sentence(enc_fwd_lstm, enc_bwd_lstm, embedded) w = dy.parameter(decoder_w) b = dy.parameter(decoder_b) + w1 = dy.parameter(attention_w1) + input_mat = dy.concatenate_cols(encoded) + w1dt = None last_output_embeddings = output_lookup[char2int[EOS]] s = dec_lstm.initial_state().add_input(dy.concatenate([dy.vecInput(STATE_SIZE * 2), last_output_embeddings])) + out = '' count_EOS = 0 - for i in range(len(input)*2): + for i in range(len(in_seq)*2): if count_EOS == 2: break - vector = dy.concatenate([attend(encoded, s), last_output_embeddings]) - + # w1dt can be computed and cached once for the entire decoding phase + w1dt = w1dt or w1 * input_mat + vector = dy.concatenate([attend(input_mat, s, w1dt), last_output_embeddings]) s = s.add_input(vector) out_vector = w * s.output() + b probs = dy.softmax(out_vector).vec_value() From 37ca2fb892dee89f9c137ad6a15c834febc1eebd Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 20 Jan 2017 00:23:48 -0500 Subject: [PATCH 961/965] Added multi-column support for softmax --- dynet/nodes-common.cc | 8 ++--- dynet/nodes.cc | 84 ++++++++++++++++--------------------------- tests/test-nodes.cc | 18 ++++++++++ 3 files changed, 52 insertions(+), 58 deletions(-) diff --git a/dynet/nodes-common.cc b/dynet/nodes-common.cc index 094a8c60c..a7a62e504 100644 --- a/dynet/nodes-common.cc +++ b/dynet/nodes-common.cc @@ -558,8 +558,8 @@ string Softmax::as_string(const vector& arg_names) const { Dim Softmax::dim_forward(const vector& xs) const { assert(xs.size() == 1); - if (!LooksLikeVector(xs[0])) { - ostringstream s; s << "Bad input dimensions in Softmax: " << xs; + if (xs[0].nd > 2) { + ostringstream s; s << "Bad input dimensions in Softmax, must be 2 or fewer: " << xs; throw std::invalid_argument(s.str()); } return xs[0]; @@ -610,8 +610,8 @@ string LogSoftmax::as_string(const vector& arg_names) const { Dim LogSoftmax::dim_forward(const vector& xs) const { assert(xs.size() == 1); - if (!LooksLikeVector(xs[0])) { - ostringstream s; s << "Bad input dimensions in LogSoftmax: " << xs; + if (xs[0].nd > 2) { + ostringstream s; s << "Bad input dimensions in LogSoftmax, must be 2 or fewer: " << xs; throw std::invalid_argument(s.str()); } return xs[0]; diff --git a/dynet/nodes.cc b/dynet/nodes.cc index 15c802f38..bc5c3bbd9 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -115,7 +115,7 @@ size_t Hinge::aux_storage_size() const { } size_t LogSoftmax::aux_storage_size() const { - return 2 * dim.batch_elems() * sizeof(float); + return 2 * dim.size() / dim.rows() * sizeof(float); } size_t PickNegLogSoftmax::aux_storage_size() const { @@ -137,7 +137,7 @@ size_t Min::aux_storage_size() const { } size_t Softmax::aux_storage_size() const { - return 2 * dim.batch_elems() * sizeof(float); + return 2 * dim.size() / dim.rows() * sizeof(float); } size_t Sparsemax::aux_storage_size() const { @@ -1041,16 +1041,16 @@ DYNET_NODE_INST_DEV_IMPL(LogisticSigmoid) template void LogSoftmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); - if (xs[0]->d.cols() != 1) - throw std::runtime_error("LogSoftmax::forward not yet implemented for multiple columns"); - Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); - Tensor m(Dim({1},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device, DeviceMempool::FXS); + Tensor z(Dim({xs[0]->d.cols()},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); + Tensor m(Dim({xs[0]->d.cols()},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device, DeviceMempool::FXS); logsumexp(dev, *xs[0], m, z); - if(fx.d.bd == 1) { + if(fx.d.size() == fx.d.rows()) { fx.t<1>().device(*dev.edevice) = xs[0]->t<1>() - as_scalar(z); } else { - Eigen::array bcasts; bcasts[0] = xs[0]->d.rows(); bcasts[1] = 1; - fx.tb<1>().device(*dev.edevice) = xs[0]->tb<1>() - z.tb<1>().broadcast(bcasts); + // TODO? Is this broadcast efficient on CPU? + Eigen::array bcasts = {(int)xs[0]->d.rows(), 1, 1}; + Eigen::array morph = {1, (int)z.d[0], (int)z.d.bd}; + fx.tb<2>().device(*dev.edevice) = xs[0]->tb<2>() - z.tvec().reshape(morph).broadcast(bcasts); } } @@ -1061,19 +1061,13 @@ void LogSoftmax::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - if (xs[0]->d.cols() != 1) - throw std::runtime_error("LogSoftmax::backward not yet implemented for multiple columns"); - Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); - if(fx.d.bd == 1) { - z.t<0>().device(*dev.edevice) = dEdf.t<1>().sum(); - Eigen::array bcast; bcast[0] = fx.d.rows(); - dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().exp() * -z.t<1>().broadcast(bcast) + dEdf.t<1>(); - } else { - Eigen::array red_axis; red_axis[0] = 0; - z.tb<0>().device(*dev.edevice) = dEdf.tb<1>().sum(red_axis); - Eigen::array bcast; bcast[0] = fx.d.rows(); bcast[1] = 1; - dEdxi.tb<1>().device(*dev.edevice) += fx.tb<1>().exp() * -z.tb<1>().broadcast(bcast) + dEdf.tb<1>(); - } + Tensor z(Dim({xs[0]->d.cols()},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); + // TODO? Is this broadcast efficient on CPU? + Eigen::array red_axis; red_axis[0] = 0; + z.tb<1>().device(*dev.edevice) = dEdf.tb<2>().sum(red_axis); + Eigen::array bcast = {(int)fx.d.rows(), 1, 1}; + Eigen::array morph = {1, (int)z.d[0], (int)z.d.bd}; + dEdxi.tb<2>().device(*dev.edevice) += fx.tb<2>().exp() * -z.tvec().reshape(morph).broadcast(bcast) + dEdf.tb<2>(); } DYNET_NODE_INST_DEV_IMPL(LogSoftmax) @@ -1691,17 +1685,14 @@ DYNET_NODE_INST_DEV_IMPL(SelectRows) template void Softmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { - if (xs[0]->d.cols() != 1) - throw std::runtime_error("Softmax not yet implemented for multiple columns"); - Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); - Tensor m(Dim({1},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device, DeviceMempool::FXS); + assert(xs.size() == 1); + Tensor z(Dim({xs[0]->d.cols()},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); + Tensor m(Dim({xs[0]->d.cols()},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device, DeviceMempool::FXS); logsumexp(dev, *xs[0], m, z); - if(fx.d.bd == 1) { - fx.t<1>().device(*dev.edevice) = (xs[0]->t<1>() - as_scalar(z)).exp(); - } else { - Eigen::array bcast; bcast[0] = xs[0]->d.rows(); bcast[1] = 1; - fx.tb<1>().device(*dev.edevice) = (xs[0]->tb<1>() - z.tb<1>().broadcast(bcast)).exp(); - } + // TODO? Is this broadcast efficient on CPU? + Eigen::array bcasts = {(int)xs[0]->d.rows(), 1, 1}; + Eigen::array morph = {1, (int)z.d[0], (int)z.d.bd}; + fx.tb<2>().device(*dev.edevice) = (xs[0]->tb<2>() - z.tvec().reshape(morph).broadcast(bcasts)).exp(); } template @@ -1711,28 +1702,13 @@ void Softmax::backward_dev_impl(const MyDevice & dev, const Tensor& dEdf, unsigned i, Tensor& dEdxi) const { - Tensor z(Dim({1},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); - if(fx.d.bd == 1) { - // TODO: This requires no transfer between host/device, but is not working? - // z.t<0>().device(*dev.edevice) = (fx.t<1>() * dEdf.t<1>()).sum(); - // Eigen::array bcast({(int)fx.d.rows()}); - // dEdxi.t<1>().device(*dev.edevice) += (fx.t<1>() - z.t<1>().broadcast(bcast)) * dEdf.t<1>(); - // So we use this instead. - z.t<0>().device(*dev.edevice) = (fx.t<1>() * dEdf.t<1>()).sum(); - float off_diag_sum = -TensorTools::AccessElement(z, 0); - dEdxi.t<1>().device(*dev.edevice) += fx.t<1>().binaryExpr(dEdf.t<1>(), FSoftmaxBackward(off_diag_sum)); - } else { - // TODO: This requires no transfer between host/device, but is not working? - // Eigen::array red_axis({0}); - // z.tb<0>().device(*dev.edevice) = (fx.tb<1>() * dEdf.tb<1>()).sum(red_axis); - // Eigen::array bcast({(int)fx.d.rows(), 1}); - // dEdxi.tb<1>().device(*dev.edevice) += (fx.tb<1>() - z.tb<1>().broadcast(bcast)) * dEdf.tb<1>(); - for(size_t b = 0; b < fx.d.bd; b++) { - z.tb<0>().chip<0>(b).device(*dev.edevice) = (fx.tb<1>().chip<1>(b) * dEdf.tb<1>().chip<1>(b)).sum(); - float off_diag_sum = - TensorTools::AccessElement(z, b); - dEdxi.tb<1>().chip<1>(b).device(*dev.edevice) += fx.tb<1>().chip<1>(b).binaryExpr(dEdf.tb<1>().chip<1>(b), FSoftmaxBackward(off_diag_sum)); - } - } + Tensor z(Dim({fx.d.cols()},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); + // TODO? Is this broadcast efficient on CPU? + Eigen::array red_axis = {0}; + z.tb<1>().device(*dev.edevice) = (fx.tb<2>() * dEdf.tb<2>()).sum(red_axis); + Eigen::array bcast = {(int)xs[0]->d.rows(), 1, 1}; + Eigen::array morph = {1, (int)z.d[0], (int)z.d.bd}; + dEdxi.tb<2>().device(*dev.edevice) += (dEdf.tb<2>() - z.tvec().reshape(morph).broadcast(bcast)) * fx.tb<2>(); } DYNET_NODE_INST_DEV_IMPL(Softmax) diff --git a/tests/test-nodes.cc b/tests/test-nodes.cc index 7541cc741..fbcbbc384 100644 --- a/tests/test-nodes.cc +++ b/tests/test-nodes.cc @@ -542,6 +542,15 @@ BOOST_AUTO_TEST_CASE( log_softmax_batch_gradient ) { BOOST_CHECK(check_grad(mod, z, 0)); } +// Expression log_softmax(const Expression& x, unsigned v); +BOOST_AUTO_TEST_CASE( log_softmax_colbatch_gradient ) { + dynet::ComputationGraph cg; + Expression x = reshape(parameter(cg, param_cube1), Dim({3,3},3)); + Expression y = log_softmax(x); + Expression z = sum_batches(input(cg, {1,3}, first_one_vals) * y * input(cg, {3}, first_one_vals)); + BOOST_CHECK(check_grad(mod, z, 0)); +} + // Expression log_softmax(const Expression& x, const std::vector& restriction); BOOST_AUTO_TEST_CASE( restricted_log_softmax_gradient ) { vector restriction = {0,1}; @@ -571,6 +580,15 @@ BOOST_AUTO_TEST_CASE( softmax_batch_gradient ) { BOOST_CHECK(check_grad(mod, z, 0)); } +// Expression softmax(const Expression& x, unsigned v); +BOOST_AUTO_TEST_CASE( softmax_colbatch_gradient ) { + dynet::ComputationGraph cg; + Expression x = reshape(parameter(cg, param_cube1), Dim({3,3},3)); + Expression y = softmax(x); + Expression z = sum_batches(input(cg, {1,3}, first_one_vals) * y * input(cg, {3}, first_one_vals)); + BOOST_CHECK(check_grad(mod, z, 0)); +} + // Expression sparsemax(const Expression& x); BOOST_AUTO_TEST_CASE( sparsemax_gradient ) { dynet::ComputationGraph cg; From d3ac42838807ac7b0581822c87f976e36c5719c7 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 20 Jan 2017 00:26:32 -0500 Subject: [PATCH 962/965] Updated doc for softmax --- dynet/expr.h | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/dynet/expr.h b/dynet/expr.h index 8083e7949..379ff2d11 100644 --- a/dynet/expr.h +++ b/dynet/expr.h @@ -744,23 +744,26 @@ Expression colwise_add(const Expression& x, const Expression& bias); /** * \ingroup lossoperations * \brief Softmax - * \details The softmax function, which sets each element to be e^{x[i]}/{sum_j e^{x[j]}}. + * \details The softmax function normalizes each column to ensure that all + * values are between 0 and 1 and add to one by applying the + * e^{x[i]}/{sum_j e^{x[j]}}. * - * \param x A vector + * \param x A vector or matrix * - * \return A vector after calculating the softmax + * \return A vector or matrix after calculating the softmax */ Expression softmax(const Expression& x); /** * \ingroup lossoperations * \brief Log softmax - * \details The log of the softmax function, which sets each element to be - * log( e^{x[i]}/{sum_j e^{x[j]}} ). + * \details The log softmax function normalizes each column to ensure that all + * values are between 0 and 1 and add to one by applying the + * e^{x[i]}/{sum_j e^{x[j]}}, then takes the log * - * \param x A vector + * \param x A vector or matrix * - * \return A vector after calculating the log softmax + * \return A vector or matrix after calculating the log softmax */ Expression log_softmax(const Expression& x); From d4edbcbb244c7876e23705b71f96898088af384a Mon Sep 17 00:00:00 2001 From: Paul Michel Date: Fri, 20 Jan 2017 17:52:37 -0500 Subject: [PATCH 963/965] Remove unnecessary tanh --- dynet/lstm.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dynet/lstm.cc b/dynet/lstm.cc index ba7fd8272..911548291 100644 --- a/dynet/lstm.cc +++ b/dynet/lstm.cc @@ -185,7 +185,7 @@ Expression LSTMBuilder::add_input_impl(int prev, const Expression& x) { i_aot = affine_transform({vars[BO], vars[X2O], in, vars[C2O], ct[i]}); Expression i_ot = logistic(i_aot); Expression ph_t = tanh(ct[i]); - in = ht[i] = tanh(cmult(i_ot, ph_t)); + in = ht[i] = cmult(i_ot, ph_t); } if (dropout_rate) return dropout(ht.back(), dropout_rate); else return ht.back(); From 0118cc6d25278464211332a77eea68094c9e2b13 Mon Sep 17 00:00:00 2001 From: Graham Neubig Date: Fri, 20 Jan 2017 18:17:34 -0500 Subject: [PATCH 964/965] Fixed memory problem in columnwise softmax --- dynet/nodes.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dynet/nodes.cc b/dynet/nodes.cc index bc5c3bbd9..658387850 100644 --- a/dynet/nodes.cc +++ b/dynet/nodes.cc @@ -1042,7 +1042,7 @@ template void LogSoftmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); Tensor z(Dim({xs[0]->d.cols()},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); - Tensor m(Dim({xs[0]->d.cols()},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device, DeviceMempool::FXS); + Tensor m(Dim({xs[0]->d.cols()},fx.d.bd), (float*)aux_mem + z.d.size(), fx.device, DeviceMempool::FXS); logsumexp(dev, *xs[0], m, z); if(fx.d.size() == fx.d.rows()) { fx.t<1>().device(*dev.edevice) = xs[0]->t<1>() - as_scalar(z); @@ -1687,7 +1687,7 @@ template void Softmax::forward_dev_impl(const MyDevice & dev, const vector& xs, Tensor& fx) const { assert(xs.size() == 1); Tensor z(Dim({xs[0]->d.cols()},fx.d.bd), (float*)aux_mem, fx.device, DeviceMempool::FXS); - Tensor m(Dim({xs[0]->d.cols()},fx.d.bd), (float*)aux_mem + fx.d.bd, fx.device, DeviceMempool::FXS); + Tensor m(Dim({xs[0]->d.cols()},fx.d.bd), (float*)aux_mem + z.d.size(), fx.device, DeviceMempool::FXS); logsumexp(dev, *xs[0], m, z); // TODO? Is this broadcast efficient on CPU? Eigen::array bcasts = {(int)xs[0]->d.rows(), 1, 1}; From aea62d60ad94b3c6f038c822bf3a677f517735b6 Mon Sep 17 00:00:00 2001 From: Bradley Skaggs Date: Fri, 20 Jan 2017 23:23:40 -0500 Subject: [PATCH 965/965] Refactor BiRNNBuilder to unify add_inputs and transduce. Also adds transduce_final that is the concatenation of the hidden states of both directions. --- python/_dynet.pyx | 32 ++++++++++++++++++-------- python/dynet_viz.py | 56 ++++++++++++++++++++++++++++++--------------- 2 files changed, 60 insertions(+), 28 deletions(-) diff --git a/python/_dynet.pyx b/python/_dynet.pyx index 90a773385..d38a2988e 100644 --- a/python/_dynet.pyx +++ b/python/_dynet.pyx @@ -1301,24 +1301,20 @@ class BiRNNBuilder(object): expressions. For many cases, this suffices. transduce is much more memory efficient than add_inputs. """ - for e in es: - ensure_freshness(e) - for (fb,bb) in self.builder_layers[:-1]: - fs = fb.initial_state().transduce(es) - bs = bb.initial_state().transduce(reversed(es)) - es = [concatenate([f,b]) for f,b in zip(fs, reversed(bs))] + es = self.transduce(es, remaining_layer=-1) (fb,bb) = self.builder_layers[-1] fs = fb.initial_state().add_inputs(es) bs = bb.initial_state().add_inputs(reversed(es)) return [(f,b) for f,b in zip(fs, reversed(bs))] - def transduce(self, es): + def transduce(self, es, remaining_layer=None): """ returns the list of output Expressions obtained by adding the given inputs to the current state, one by one, to both the forward and backward RNNs, and concatenating. - + @param es: a list of Expression + @param remaining_layer: index of first layer to not evaluate (None (default) to evaluate all layers) see also add_inputs(xs) @@ -1334,11 +1330,29 @@ class BiRNNBuilder(object): """ for e in es: ensure_freshness(e) - for (fb,bb) in self.builder_layers: + for (fb,bb) in self.builder_layers[:remaining_layer]: fs = fb.initial_state().transduce(es) bs = bb.initial_state().transduce(reversed(es)) es = [concatenate([f,b]) for f,b in zip(fs, reversed(bs))] return es + + def transduce_final(self, es): + """ + returns the Expression obtained by concatenating of the last hidden states + of both the forward and backward RNNs obtained by adding the given inputs + to the initial states, layer by layer. + + @param es: a list of Expression + """ + es = self.transduce(es, remaining_layer=-1) + (fb,bb) = self.builder_layers[-1] + f = fb.initial_state() + for e in es: + f = f.add_input(e) + b = bb.initial_state() + for e in reversed(es): + b = b.add_input(e) + return concatenate(f.h()[-1], b.h()[-1]) cdef class RNNState: # {{{ """ diff --git a/python/dynet_viz.py b/python/dynet_viz.py index 0ebebc419..78a4a2026 100644 --- a/python/dynet_viz.py +++ b/python/dynet_viz.py @@ -528,24 +528,28 @@ class BiRNNBuilder(object): builder = BiRNNBuilder(1, 128, 100, model, LSTMBuilder) [o1,o2,o3] = builder.transduce([i1,i2,i3]) """ - def __init__(self, num_layers, input_dim, hidden_dim, model, rnn_builder_factory): + def __init__(self, num_layers, input_dim, hidden_dim, model, rnn_builder_factory, builder_layers=None): """ @param num_layers: depth of the BiRNN @param input_dim: size of the inputs @param hidden_dim: size of the outputs (and intermediate layer representations) @param model @param rnn_builder_factory: RNNBuilder subclass, e.g. LSTMBuilder + @param builder_layers: list of (forward, backward) pairs of RNNBuilder instances to directly initialize layers """ - assert num_layers > 0 - assert hidden_dim % 2 == 0 - self.builder_layers = [] - f = rnn_builder_factory(1, input_dim, hidden_dim/2, model) - b = rnn_builder_factory(1, input_dim, hidden_dim/2, model) - self.builder_layers.append((f,b)) - for _ in xrange(num_layers-1): - f = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) - b = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) + if builder_layers is None: + assert num_layers > 0 + assert hidden_dim % 2 == 0 + self.builder_layers = [] + f = rnn_builder_factory(1, input_dim, hidden_dim/2, model) + b = rnn_builder_factory(1, input_dim, hidden_dim/2, model) self.builder_layers.append((f,b)) + for _ in xrange(num_layers-1): + f = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) + b = rnn_builder_factory(1, hidden_dim, hidden_dim/2, model) + self.builder_layers.append((f,b)) + else: + self.builder_layers = builder_layers def whoami(self): return "BiRNNBuilder" @@ -577,24 +581,20 @@ def add_inputs(self, es): expressions. For many cases, this suffices. transduce is much more memory efficient than add_inputs. """ - for e in es: - ensure_freshness(e) - for (fb,bb) in self.builder_layers[:-1]: - fs = fb.initial_state().transduce(es) - bs = bb.initial_state().transduce(reversed(es)) - es = [concatenate([f,b]) for f,b in zip(fs, reversed(bs))] + es = self.transduce(es, remaining_layer=-1) (fb,bb) = self.builder_layers[-1] fs = fb.initial_state().add_inputs(es) bs = bb.initial_state().add_inputs(reversed(es)) return [(f,b) for f,b in zip(fs, reversed(bs))] - def transduce(self, es): + def transduce(self, es, remaining_layer=None): """ returns the list of output Expressions obtained by adding the given inputs to the current state, one by one, to both the forward and backward RNNs, and concatenating. - + @param es: a list of Expression + @param remaining_layer: index of first layer to not evaluate (None (default) to evaluate all layers) see also add_inputs(xs) @@ -610,11 +610,29 @@ def transduce(self, es): """ for e in es: ensure_freshness(e) - for (fb,bb) in self.builder_layers: + for (fb,bb) in self.builder_layers[:remaining_layer]: fs = fb.initial_state().transduce(es) bs = bb.initial_state().transduce(reversed(es)) es = [concatenate([f,b]) for f,b in zip(fs, reversed(bs))] return es + + def transduce_final(self, es): + """ + returns the Expression obtained by concatenating of the last hidden states + of both the forward and backward RNNs obtained by adding the given inputs + to the initial states, layer by layer. + + @param es: a list of Expression + """ + es = self.transduce(es, remaining_layer=-1) + (fb,bb) = self.builder_layers[-1] + f = fb.initial_state() + for e in es: + f = f.add_input(e) + b = bb.initial_state() + for e in reversed(es): + b = b.add_input(e) + return concatenate(f.h()[-1], b.h()[-1]) class RNNState(object): # {{{ def __init__(self, builder, state_idx=-1, prev_state=None, out=None):

+9!5*ih2R;!xB-uVHi`gk*}EU001v0H!BE^$5CL%xnKp?Wn?pI?3pxH9d=Wvq zTSOY~d|GynyceM!W9B;{@qc*Vqb(2xE_pE?0c{nz_3+5X)j0zWS?g67{omq*-kgPF zHdT+OTDTbD62SJDt?_kCe1i{d6O`NW-<*j8xxa^YNMR2b&hy4918zANwen~uiu-66 zSI%#`-bwI1N@{m=?Q!Fp<^*7m0Q53IOTOsKCnAqbDZLc`dE_u>M>k916TMBBp%`~b z#j?cLP!XSg#BNIbXYTn2EA zETA0M%)MEQs_NZT)SzI|2tFN4kdo+NbiR+ATlMBABVxD`cRmNu66y;Ix zQUU)1vKiJ~5a~0=cPa5k1dj$$13r(%Nm>Bo@+}0E0xodC#vmF(U5`1N2J>iui@54k zCI@Ba!Z026T^Dzp6>Wb|Cf|-dv%y}$;hlWmgDw0OHc$(~Hr%}da&a-h55PQrRA3nBi zNQm+S<|%I7uhsp7;lG*@@jVAPsz#6IAFX_)7EW8{M!DP3H7J8o=N9UfS}yirj{=mV zGvZdPVs+3BfghuR=Zsjy+xWl@wzgI1T7f;D&BhzJ+4wo%#z%apm##x4E|alq=`&ZX zF3|P-bG|)V#I0=TTy-zh;$s>0G;=x@aF7Jh4T4f^p7(S6_<}l@=y6hdJkFzA!#SIG zXXmif4?Fg7@fY2Q%Khdk5VaDI1`RjL$-Or8cmN$RkG8A(=q5p?1+RHFuGGol{u|ma z#q;b@+;3#(Fq@T&>O49iNDV;mc zVstZ#&1rRiFntc)!tbdN6?dX1YfQyz(#Z4_25XTfX%FgpD*v9FD-=E6iveF3B|c5s zwqT&aVa37XDBa3n+~cf)+(@zDJM?svY@2D$X?9Y&jRB{by%&L{XYl)s@D4q?9lxBV z=3ERmKC&?GkGL?%r)Q#kzu6Kdxv!jy06e2*?w?=agmW^fUn4ZVQ$KYaxA$mT) zE^5}^xGwktfRvN~mc zE;@QKK+uUodr0T-=p`uZGf$A7f;B~bSrGa!TdqJaMeTlb7H-yyi|#@Z#|KemJf`2x zxa$Mv@#CWyx)u5KGHx_QZoi|K<2|5z@V~=35tm(@hLeU1ajDrUdNJi>y;u2Ey|wcs zefr1H-`o~COX}u=rb`!f2!4g&ychqm?|&_?NxV|p9FK7I5Lm#~cKLWZB|8cj({{br+(Te~8 diff --git a/doc/build/doctrees/minibatch.doctree b/doc/build/doctrees/minibatch.doctree deleted file mode 100644 index 8308f94cb30bc60c5e2f326b09714b0bb21abd83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2640 zcmbVO>wg6#aAZ_Lfj<=W`&f$)jaX0)lzW;!;~^J3r8Iadvw*B-}O z6Q^?Mc&X-PS}R29WSmRq#0Y0~BJR>!Qk5m*#m-h`BKb_8x~WWTDZ*}E>C<^pc{{Y$ z8|!84yeK`d?mj?E0hLZ2uho23Ez-t)khZniofq9rdz0XJW!r8X{Kp|0@0)Pu@{m8&&h+oI*PD#AL)k3_VTWWqW8z8=x?KqPm{ z!0Bd0r$YLVM*Nss7ql>0|9Hf2QH!FY)0sAspV*zpVQo?Qt!iF@g12qWa)5GWvdddw z;6}}F-%=Y*m0y~z@^j-ps{9W1kh-8AR+rReT4=WNlM2AMx6~t%x*n;`NIe><$D>Li zzG|cH%m%$B51_N&|BCd~Yj^qSn%@aPDnz|e4Ma7VJqYCyqf!*A%kM%4H*0=($lz%d z=taA~>Fs7A%b_jv&Et9m)#87h7p2{kn{qhRiIyfA^LtJt*Ev3!-y0Hq=07EPdYa(- zRPXYWn=~c9RnXrVUkc+w015r2X@iS|u1I({+YPljY^W!klk z#y*86Jw|x1zjq`4bbwXZ(gXKPeOlIO+rWJ^@ajn{jz1IeXK8gBYy#lrnmPP< zU_6MUZJENT3haXfG&=1|eOf7p36{dKsxsp*(-q}?@ocZ>t%X}^>4!VE9QBmXvmSqi zI$$7?;b@Ky;dQbIDM(%oIKDNI8b%vT5c+EvzS;j z)Fa+&YX!mWX{Ws{c^@YynH6_pnG2o8BE>XmEcxJ&t|62BxY6!aJ$6OlYJ5beq}k(d z^xM1&C#w{BJ|TR7X$u&9q}P8(5)8``iPdM^ZiHa5}id8dw7571yJPq$A{Dz zNh2}zLH17otr5UIN?wQ9U5?2gbA?-g<2R0IC6xNOKYvQs+y30&-`^?5URl%hXBf*^ z>3aOLV2Z|zgIMX2%JA|0bBsxAM*Iu9dOsU8P4G))Xf60ve2;-&(Y#Li*8ppAfx!H1 z3-y~Lx-w}qnaQTt!I4+-bc+8LVs1HYr0V#05p6W0)yB!Pxi(1?s89L#hja#)5j4`| z`47Q38+MNE?~nazKo@5Xd~#9x)9&2lmhk7A|Dx8_1qW@Nyq--)#$Rjxo4O2Z$Bg@X pGvhG6alvRWI~epB>KNzLnVP8Me?qCFIST|5Xik{tZb*&h`KR diff --git a/doc/build/doctrees/multiprocessing.doctree b/doc/build/doctrees/multiprocessing.doctree deleted file mode 100644 index a65ae07a0ca8030d424594e4307435676582e215..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2784 zcmbVO`F9*g5msdD*tI0fj_pJ~;te4nL!=GFKrjRXm?R*w=5Pgb3`6fs@AlxC?y2b> z9l(&75Rf>NaFc_C`~DmGdUjTl_c@RE_(6JFZFSXGUsZio&rL_MiAtBGc3qoT+P43g zN$uKv*QHxLUGb4sYH5*4x06fDM=PGWu`)F^m6fSW*7Cwc(%M81JBjYZJ6bxP?O8fu z%f5AqgJ+||SPm@DRXk5ixhSj*GrSQ)xN8O6rlqJX3WN-;DT_$*u^zQ!8JR-(*Syf9 zlcIEHV2sno$--lRduGW_|tc&_|=^rD*kSDk2zDdKerR7ftyg?^!o9p`ZX99kjPEDAH^;f-suTd*XT&)Y1KO6Ap zd^WT&7LdBjKM%dwM|dDLUkLcRhn1Vc0XOw%K8YJGc?Mdtco>W2F9v*r7RSLx0KQc5 zmuWfCaZ*4mLdeiiI?G=P_^UK;rE}0h%fX?68Wcu5spIxDA}yh={58X2#a~~glVd7E zKg0lj)3N}JyW!dtF*GyBJE@}tv)=E~LNSP73h^w9lp{K)oXf9tyUrMBcOuUlHN7TUC6G?eF_r#1-<4$kCrS{CJ!T%d9}AZL>-;+A;xGF&ET72hZ9;% zg&vkrY}m(=zd_Rw(VNtY(R@(jEa%iCtho(SxhYf5pfwA~0$V_jbX-H$l}KGsLYTHaF+_2|4T3R8qYYGM!?jy@`(;}mscTJ{hvo?t@r6j^dXGqLQKL$*CymRVo= zy6&XXDhYLRdvw8+E-&3%`79ylU?Xz82}mfdF0*jkH#l#hB*)`2%ftPavb+thFmj0= zn8s`eW=mV5&>k>+Ns;k4dvx0KK1kBKXrYrC@H)xgqIrC=_Ta;pWBxXsklP7%AG*4< z4L23InT?DdBt!mAQ!6ywW?~a(3Vs%zqtu9-q0B^*h9bsRtCzxayL17WWc!15Q1#H} zo~v7XbVTY+{%)_yE4Q+Ykw=#D^Pax#+@Q%4v~8h9YWaH@C(j8sdM)iu#xLyAvC(!5 zee?470n@kWp)UIYLQD|PyEId}!P=v|NA2dh@8=)lb)pZKh<`+_+H%c;gdfxKFix!K zgUW`NpY*7O0nQOH+2)@@ms(Er!>uHCihs6&TjTaV;umR#u0Mg$FVWoi)OcB~&~Xg0 z!|L&~0E!&{e3x27sU_|Yko^lls~g~el3$|PZH6NxyeMiXwnLQ+Rf-?Szr~_9ddR<{^S84xF$AxuOfSX=-g<`WGd@f2S-kY<2&N_Xy%5~x>YT|5%8OIrf%CrTUpdM zoYbEDnE$X#$8Z*5lt!Qb=%usfXI}vS)GPaRdQ!qiSKFUArbd^_Un>5qT2`kly6f<* zI9eKitN8EgEW{mK_8;{c!~K9Gr#ZWDY2d2BJwdIpj9UI@!2hCI-ws&Y|E~ByWqh z*Ezq>!7D^ROJQ9YNRIobdMQ}ZNxV|@3gY0Z@zo?yr$S!FaiZWrhF6b^t$Axtw(Hc| z)61>BMr;$C#dfhnj6q-i5*`!;d172#=7>Fxs5)Y=BlbC|pvcbh{U{N2Zu1pJFon=X&QoTZ!RU??G zwpCj7n5?FnR|8pXq@;{MwyLb!sWlIYH?AnNw3G>NvZWrmRH^H_rQR%R{}YCzM8ho^ z-fC&Ecn;?@2wUv23~#f=j@e>QpFDlEdLrS>@M^cw`5@x$%TfX%CpyZKLb2Tw!E3rt}^4?6getqO*^#*)v%!{j4N z2$wDB5eKI&tXL(6a6=si1HbT?GvqPDE3s&N)WNeb+)dU2@K}bALnV-YkdT|WWKS(_ zG(O?rlQ5{cF(fgK&Wf>XCQ2GE{qh+WrewDGltMSdr^jJqmkQU8Isu>2$Oy(J3at{K zyfmiwxby;Yghm~PlBP#T$yC!ML=ScfW8$N=no)|ZJm97|sghPrm?*5F4<%y2<2E$% z1+rrv+Y&e#oJaARbr{j)MX~Ft$eO>#7WL66o1%+GKp*{*v@w9;kjYj`PEO~2j?X|Z zx$F#-d{QI1bQEJ~5$4>wA)ngI7^VIwK9#|c`I<7qn3>NX%xFllF~R&T+s{$vZ;z=Z8|nG#}a7) zQ!LIRe6|i-Ebq-A%$w#K9uZ!{@i`czA13x6I_%@~uz}A9bSILkQ(bVA5jXvwlFgun zFBH8Z!OaFbFe}L90-)m(gNEO9-tWQ0m&K#y=eV6Z)+jXkGd%!@twUO diff --git a/doc/build/doctrees/optimizers.doctree b/doc/build/doctrees/optimizers.doctree deleted file mode 100644 index 8a69aea902f238cbbd8f23b40b7a92a82d536430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6199 zcmb_g2Y4LC6_#bSJ4>=`Y%th{!v&u)mN3b{-Z_iNkrq^6Fk;dPln5bCHL8d+7+2?{^3*D-Fz0?8aha#~gh(?0Y4PmSAS&keHXi-evqPJ%2Kw4E91ojvV z>?u*N=q*QD!z?TCBVCrXcu3?OS@yNfv#D=LEVZN1ANBpv^FwI`p{+w&GPpo=va4Jt zprtV#Ra71L>%?Cd{&M)si$3Fv&2{LOMWU;$+=_!0X?cl`ZVX8v%e-u!jzL6L#B?ko zqV4e%+i{{rbifF}rIo5xbfn{}hWp`*0fqPs)a z&d?rX8|Zk^nJ!Exh`b$!+8v2Pc&HH5iAB-nL^YNRXiZ6UmMeA;;CXFHbdA{M1DgH2 zt|S(+E7q6jB(=;I?TP$`5*1b6jzn7p=|UR^TcIq?IyzakD)?YivC#<#T}9^U6u4k> zO#MZ5oQd`J$srjQ_RPk5K&@0O)GD=F9WUC=Bsx_A@|L1nQ&MY7YF$aKFR2ZsNMU7_ zu6J7Fa{J{3O5pV7Yn*Z8Av!arvj9TzdYhvWI~r+Jftc81+ODZQoek7mV>*XXUx=ve zSF&)>)~+7~b$MC{l^qr){ism3y+RboLg*L5$df##3#<=i$O*lz&dA)%I&>}@dR{X_ z+cHDXSEv795L^HkTo}_u>;gu!HE}^uQ?57BZ#z!HCa&kmi9B5l`!9*!I1p5%j z$9$&k4EwSohXuh&qO<`?g^bp&3`(@4h^%(Kv5KUf!)vn&pHBdV;-#B56-+K}R5{TS z(&aY7Jd_%b5H;ch0trN8-L~;nv-0-uLo) zvr1@~O?U)5m>#KecDIqb^tfqo=tjI9Lu^gj&V% z>;MhoJK4P6$ecW+vg))^b>!gxIu{%!CYJ4iSPk3eNn*9pn8w%zorr$2rxajty6$3Q z@9Y#(48WZOAgTB)73ezDL7gr-fPAjRRLv|JZJy7`Ldb4ZVxBwz^JA)Iz|t)-0cIGe zyM6)@!_rM)&H6k@aiyv#1g0PR-I~JBD3H-4Y?dH}M|&ywtKZl`_T8hh;B_>4lkPHzQi8 z-R^p8=ta>8;)hKQzlz!W#WB4kn}O{W)vgR}zw`*S{j#FkIlMlzv)NH`4q}%k{TN5r-hC5$t zxbt<4MoN5czaB5%rM`U_{*^3o8}}Vy;*e`R(uQopTmlZN$-xB z-pXj}hziJ3b%x{KHb-3p$Gtt}l9Vs$9fkboP#VmGbOz+NCnq@Jp#4M%^ zZ@s6paMFj4xa^0q zY;!&I5g_z??J^em)slE7m_h>$roq2MEy@Ra$g;dsE5ZO_c4Rq!wmAJ<_z*> zApS~BU(FET3(q1;>N$hSgU@7ut3W?bt)VjM&@1GP(6YOuwGd_?!6&wNl;B!oNjmcB6nU z$L^wG%7H?%uN2mp3T)U^8qWZ03T{xq0jmICN!%RE(&?w)A*{cT=?__0A4tM_uK7>& z&NZL@h%{vnJQ&lTX7K*`;d`Jf@qkKf|BJExp_u+Uqw8`5EX17%k~m{ED6| z4NYq5g&2!<8-MA;jl$Kq-djoZ0^M$=b@0coK!zdC7lH1?Yh60xgu*8%Cx4AyiO{mq zUHIa=$3hOU!6b=<|vh#HFmTo$q~<`Y3+xso36FgvJaeI#Ms=u~zBn<@}Iy zZ1f{SyIRvnLtNkdfMd9J}pTLSb7+N{h1%Bz_ri>R=tqCSoeImvX)WuFztywcn z7U(q?2iu~r;(DWgD!euk?j5(a#|KyFm3CFHGqTG$Y@=?)1m6PF!4%~BdVCaJ__lfd zsb@I)Bz|2YCtUQ#z^ze`dT|4*ZWkRmwU4@Ex@c6Im?OClx`7+|T5mL?%gYttK43}Q zpeq(S1sbh4q~OW;I3-rY)anfN&!&+T)Y!3`AT%u&O7EaP#VAV*uLUx4U}d$UH=E%; z9FTqFv5P{{o?QuazZqZ3-a{wQG=@^I3>ck@l7^VYwW3co!o6G$b&0&ij4p17m_7}| zqCE;nH*eLa^K(8`#YJ>RqRI8@gRIYFv7DK*8Fzhs7QZjH95=8>5P;N)XPdb>5KRpz z+zGvv#kk_^5o_FaLZ#2a$Y7V~otvb38w<9J{W}2ZTz>9MJDK`Cys6bxjI2h2EuoSj?FSI8t<&LQe{)PHd9&W4n-k9FbkE`Z-&zf6; zmqFw@QyRU@z}Bq0cJSm@*U>xqp%=AKANI>JI4xEtWiKnz&=TAlDl6?~>Rk{)5vB1k z#S!S;7%YjSO{KVAAhl^IOOGSx=s|p)!WGRPM@c6`S73+z6!tGP`(ZAWJ`6a+tE%IYMELQiKTOT+vX^x_nJvp;}=J>lW~XE t`-}p#*G$JM>l0@OlSt&UJtNTjAzIP`zoLUv&k6K3c!~A3_>D&T{{t8mJ_Y~) diff --git a/doc/build/doctrees/python.doctree b/doc/build/doctrees/python.doctree deleted file mode 100644 index 20084d6754ae02b1a60dd0653f0d710d6eb59133..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35157 zcmeHw2Xq|O)xR;W3oaN;Gsue#SO!Z1Qv?D7#x`JtWiVb?ide0*Bkjto-JLtTmIVx< zV@M$o5(uP_gg_EP0tpaEA-$4bNGH9L-b32|ckg{~W_ETZ+ZgiyzH`2Fqxl??1YHNDx zq)C&i#S?PmPU}g}Mx^EyN<+zN-boHsYF+O1p7a8w7D`?`5=KC&08TW7T}Ql+2BloN98UoU0X`b~n*e zOYPy+`n_tQ3PsALOwJkf+}(V4_tfl4mOLjj;&@(m2-45$b!Vq$57daDVa6-hXuxsj z^rR9wXP``3#&+lSq~>L7)$(AuTrHKWP6j$a-aWc^Nlj-v6mp(B&v*B1%}+~Btrpv0 zguU|9Q?tYbZ4k2!YP$3DGg1pe{o7c7&Ss@^85 zx2fvxzO~ehfqbEugEsDdz3%?4@xt^RF=)bFfU-QmcMn8aQg+lR-jbS>ng$EO7Vg6Q z$vQ9F56_n_4DYIcZ?<1R`~H%#5d zsYJF~r9ywL3ez9#yN9%~@fItlj(sDGsIE^p1Z zh+nM@9h3d)Z1t~e?UH&KPbNl<;-;4qw~<>nAZHEz4;}*`PSb2(%$^x zy|p}q$r}-ljTga2XAA05=XSF_?z*eo<9)XaqUKqIBWwNHT7R4>N-aA?*-Ad)o&eoW z^xYM#+o>qG*1)utq>Oz2G<%O(fPBNY@2X}vuC?9{TP=QzoJr&u0c>Yfx)eP+PQ zJ(<-%rJ4FutokeSozIsLr@|1ce0Mb)f(1HJ43TGb*ZA&ftnM19Ys#*_P|Bg5@sibY zQp*v3oisJQI0mipFm(^DO|6uJ^6J9LwLEd$*D;Z`4)3Atgn;LJv+Zw7Ov=?lb@Dlf1GJ0-O!q6=RenXH?qaJ z;of-G39C1_DNtOe?wuFEKCh0V@#}!j`Or8-PDA1geD^|@m&<163vM`t& zE7y{_a%o95na^%^l7(tATO=o&8*5LDY|0f#yR)|btmh;Ka?#l0A6D#h%8gLh%eURkP*^rJl}4<@slF&xSE7twZ<3Bw_1uce$Yh3z@j zTBW@*7L+w8LW92XvfJ8foO}g^h4~zJ-8Izjonh;4 zM&%#%-7Sz`TFWvjKYH$Is-HVn>j#Iupjfkt>Rt-$%Y658)_y!76jTmW*igRjUcsPA zG1SDBoDK3KYmh4=2DvIQ$kj~@at*}Y9`f$B5dAvez1}MBi{g1zcn=8J(8{ASCD{_)I+h`0Oh9SpKR@W*d6S@c(1(eI3u!(Bl+yrzlp zuZ8dv6Lwz*F<6D$7$@`;%G9^ZX4a|^xUUTf0( ztT((R^oF-KG3eVuZ@3@wzuk8qu!g%QYPdZEZ>Z~z+;;%!oxb}Zi!lyNMBs;f_g(b@ zzuOA@uod``P~bhN<;K#uGao>Hf75Jg3z|&b^?JC{(0r364`vGPhNskEjgztWk zbN3Oa<({aaXJwE5kd^ks5s&>y;ISWVBJal_?*vrck3+Uk`0gjI5>G^xI1u7Y*rU6j z0{W+Y_cJW~HlZU5Kk2)lWt?5WVFj!9Ijh>|Q!~mHjLE8Ha=(ym>>Iuag#-(nzvR1L zwt_zy6`b3#hQWsW6`*|8cfZDrn?ghce9CvfUMJu;tbpH)2>7ig0)9Ip;CFoYyH>!b zLIJtgc-nWrXBqUd1-@??`~Zb(`hNF^C|t~%OGECDbXHs~3~X|L+@zp?V%YMy_ou%5 zGt2hrkZq^5o6!-M`*T45!gqhkl5nFM&5T&%8Q=X?ov^>Q!u}>A>~8~Me-{z<_f3TT zLqym=`tF~su+Kz=|?%z0F-Mi_)k?s0-E9$e6O7oAP()_cD zc>jWU6Hs;k4XOU)(`x+6AcBT}6`-__V9i*^vrFQv`FW!9*a{h^9$` z3<7C7-a}ud8HhHzE6qf5=&_VQ)TiC>G@1=Fr>JsGYYy!WC@3^b&}S?9wkjFT5$L%F z8i6XYha{*H^Y9)~VoyYyD6tokBTCFi)Th1iv`R3iPzlsO+DBmaRTybexE9iWlAyfz z=l7s4(gH-ShtmNZk##Drk#r!UjgCYuNDf_{79#3X5>G1^OA*S|SV8F^0Kl$`1aq-s zPEb?nU;#YD03w(qY8@&Gs@4*I57lZ#G*D|PM?$p@L$rxnha)+n)-ptWYQxj2#ZpAo zNtVurPDcvZas!4yz2qoKP?e6xd&EnQL9~gN9E;?LmvkcP z({XrOv6)j;Y+lT+pEA<%0DFjp~Bvq$D8M2;^xBDSn@f2z$EZo?&u3 zfU|>BWL9mhpsQ+U@_R7vqi#fP(@SR|(nPg&NQP?9fjRX66*{g*;M3W7T5GUgp*6Vv zpCd3E6eb+P(z%kN!f)hvoz_qa@4?WJ&O@w;=;tFDqU(T|*t(GB0t7x?h^Li?d56+; zrVrw>+1APeT?8zUyBL8_y?BD$_Mt`!_!7a+80?d!fOl@i0tMbD0(k}Dod1aM`B||jR zp(t%aN`4<+U!@|y&XgtAgUy->jR*o(S*e6KpUM(%k?pP3c6*B#6@%?9sxX;_!z@W; z36@;JjIcJ#HvubRgwBa5dw_s7stA0l3B8tK!;Zy+L0|?fqSIyp8C4MJw@)izGiMnu zI_eU77i~dqy_~#MOJjo6DCeQpB$qN?=Qu5j~}?V_u!s$wHich|5!heg)K$&F>~ieNFYT*ahx)ymnoH-h04p7%7hrO8q1^0c65v2-D>cHH4J)%q^PR5 z@w-v=m3R+TeHCKORlOZKp{jQv2322;z^6O$w5l@usH(i)8C~z%5vQfQl*?;`%WIX3 zte`$uiuI;?ozQ)~p&Od&Zb?y7y@B72sose9&{S_ithuS~K~89@HzNj9-HX7d`|z}; zV)ju}@d}(O7OPiMOX)32=dD8LZAwR0?Z(HcSNDFwe7nIs0o-b-ofu- z|M*TsgZ}YBM4DUbA>_bPJ1Gmj3uIv8cO&rWVLYvgS>>pS=R;}sz_0~0Z5BPEBpwwK z?@-+dUwCnp34ea^>M4H?63FN@8J0}W#5L95+ z4eYq^M_nh2Krf z^i{lvEz{Q!tM?05p8Kn(I1Ku$uOkNIeFK3{-^A0FFS8HI7x1#WtNj&yOOd`UNZ(PU zC;)82+)QuuT>*RAfQ3!$_asFX`98lJMSg(yP>~-Z)?ASvAtzMi$B03ZpCIt*r+8XL zn0-`{PIzUs@7RH|rk^R3p9_;;D3kO~5DW}uE6^{6@-v3=qY(9c2m9z=IazXWoCAkG zWQW(Q;m`+f==SyL7JOfyIVYAZ1cNmv*Pd+UUHO4*DPcE*`}(kd4`|sEMkXZ(vzyC= zvjRzMyl%qjF>oj$Ae@w`VgEYoF_UsBm+k9YmcV?<9I+7!1wLc5xj@w#HhP^B-pVE3 z1YKHRE2N75N|b7>;$7DDe=Pu=>6UG3O}_ys3j4PReEOZ>wQL6-q+$a%9y2m)(h2%K zvQhW`AcX&D2=nqyXlQPo|0FqaU6eZ4u|Fdpt~m{eT0Zm_q(I`oBJk;Nf-d{F!^}$D zGh8J3yCeaB3GlbGT@p#^{GOAno>{iFqsAeOc#1H z4856R08j=-l`f~_vVjABOMgNfT;+i13uo+G5^ zDrq^~xcxK&^|>kH&TS)*~6Q|LM|2`Ml}PI{RL@(LE0Z)hxx8o7^xHsgJaT?4wj2J z6Uc{kcL9gh#(n8SKF+9V^Pb{xL~eb3=@QwhNzDpxV_jst?u;2_wPsyNs; zNaYdXz>Tn-f+w^6WgNJ|si{OD!U&q_5Hraqarn@0tG9F+jvZ|gqQ7GDeF;S|CDS$87qE`*if#z_P|9V9kw88#+oH&v(Q z8n{S67Ar`)8#VCkl^f5HfjVoj{rYGQJ*lNx$CoGg4Q)`6MlW_F~ELHbl z;S{gBhe&Fq>K=*&TXnl_*)I_&9=EpQ&8MXjZ%NOJOU+H^VUj7HM2GXc8Tl>4duoRD zOlm{4e(1**;r_Lq!_G$H)PW2b_Xq?&9f_yyXjm#~W97gQ%eh=&j#8L3d{*~fj+O+K z?HIgA_Fj%fv~KTZ*viw19LOU?!2UQyeL5ab%buBq>~-~LyyBxS0E5a2LghrIBC9{+ zVW2Eo5;NXjA$TVlyl4T4LvR6{ESak0Dg15nnCGHlqeIMCg6g%=9QMGBI>6T)rG^Q6H` z;>2aOI+h&aVLx|c9zI||VtD|cmGC?OCmf*!cahSWp^M~?T>zQL=5ht@U$~=V%)Y+x z7%Yy27PCXkl9h6yB!_&_doqmelNg65BKF`Zpd4aR9KxB===efxbg>BDXrmr$qh0~% zOmBEWG^0yE9)`{!!0wRnYI%WpL3=K&TE88VXN76MVaheT&d^-52P89Y9wo#rXAb%B zARf&IMMMq~q0=A&Y%K`|9hovisWsv7oY(1gqC_dLyb8i=Sb53f-%bz>3}q|eCZS$5 z)E|M!YX_74<+4|;n;-KaDVr>nOKte}2{T;E1zx#K&a-M#1D8Gw%~ke)~x7q`pk1nfs53 zPVw?>>)v49za#*i>AwGh(o_aBI8FtDPp)uo`LA$BiE|l;Rf9wX&xl|qYrIy{Cx=9; zk`XtX65(o5Lq4j7Ox75SHX{L=jUw=Ai(qS&U`DYj!Qb~aFLoMJGM5UO%an|4Yc_`u z)QW!xg)hc<4lv*(=yFg&@97K4D-6kFAVS}B@iA^QUc^Ln1du)$gmkJhv9G44L8KZL z=t>~V0hiEsqv!QyXE(I-Re*+_11{UB5p*@+Q4H50@abASZGX<{OEKU>KWiJhP7*<% z2V(8OyI$~aP&`cyOl;@5TLtDu19KZNc~RJop=G2UjHsJ`+Mx%}V_%U>c(`;$Kwm~p zI6q`42k9CQzvqD1@tO8bB657V{$fdu4A)6#I_PI6(}Bsy$o+Y-7N9wGV{wN zMQRM)!tZ8?cq`t+)!A1dRzE^yb8?Nkjl*D>`IU&FJYI#sr`z$g<;d)%9L+)gxv+oS z`gDh4zgn>GRP1y!NLY#an}P6M0{o{iM$jmUw{Z$jYHJ$PE3S*}oLE`&D=%)JT|4u$WN1QqTrc#jN)-->AcP}my& zZOAcIU>uR!aEbCEM6m}Y=XdE{90^a> zy&KWywt5&jMzlVN_6VXrJ&LCljRgrsYjS4rJpcgaV}kj(Vm3K581;hp3hes~EVm4z z-1{X#mHPm{hsr&HXrSB&IT9-OAw-)i_hIBjl=}#xK7ABVs~igwRgTARbw~c`V}O8m z9~ab5D5^|y>%i)r{F4IwDFci^zh0qFON#3E8Gbj8{UqMQ`ukbLnyd3UxX!csP!X6o2&I>F9r7*gPVkUD?P6^!UOASK3g@@$k?D7Ul-zwW^9NRC7<`i zu;f}S^b?k5vChhCpt(YhKSCYE_l>gFiOHyr1MQGY7d)%{HD@-7uL6n~rvs6*WsWW% zp(Zfj9d*D5ArIiqXOH&t>-OXYy0MlV$Y)C!x+{|;e|m{I0H(OvWWF$j_2Gmbc3p-q zf-852?%xa29}H5%i2IL{5f@E~@c7_Q$cIOUBkn&V0kZrB zflq%GY#nhkBXP}e61sw088gv(PCh|@Q*M73ZqF*W^iGp)Fw#GS{yz=<84%lgBM(0Q zCF$ea=-`4q}f%ZnWEC9 zUvRb!CY~z%ry2gbD8kk5nT{6eF^9K>4g@wOq;mXu5Tgvm_Q-t z@Zw%ypG=K(ccQPa9Y;+Qn;p`PH(hx&G`he&GRu+mzCDCC1G+!vSJSR$!oGleLk9!NreGExH3Kg>hJLbNU9am0CaU;1O^5K}f0Xt$t z+8@b~dI18T4iFmZn#?rjng;-PB9qgBN~}eQEmUIZZD9rK+F5i`&<`@`hk$9rEV@Hg zsQVb8zQAP{YLU>0Piq%TYGhh_FcR#vwrG9f5P{+u)uDLvX^F(6)7n-^5sTAOemBG7 z!|)ysiw{Svept-8SaK|oGa5IM1koq1fIrN^{* z2$ma5RPe1Rr?h7>Xgxf>04tNg8Fr_bT*1lf__Z~5@<=>tg%FN=)Jc*W@u-uLU_Gj8 zl{`hDI@7JN-u4PbD}e;fPetItw>_5+Z5(JvCfiwz(KS(D&kkiAz@RQ5~o9+5qRXmi>7kYk#T)}@q1 z45IWSz^)CRRs-f4XkdHcoPaqBmM%aL93LqYU+#oqhgo`+Sp`ZF*Tp4qVo;`0IOvQn zHaoz3cm=-hMUId-s6k_LdIbxxg656k*vrVWB-Jz?9Ea(mL2zx-J`9O4jqO9tR-HWK zb^e!yEr2P^I*h=lO(J5;u+e~x7&baZ0U1#c8TxNmkHrUq>MzF8n{VnZB<)T~Xvf=~ zvZO}ZoeC0cyK}iUo-0t?lM&v0@+2PZ$*Pi~K3L;-Q}s9FJ?zOw5v#BHtT)&EEgS|t z*%)H5+ocG6x(rY2j?6xAN5ISeU$EdI%j3;@vhmDBmn$P*7+s-^c9tk?&sv2&-;0F$ zm4^CHx!&@O8@r`?OHp6a!`?Nvxn*M1r23#%@Se162Nn|^j>oo{8^217&{$1<>uFaDfOY|5CAtPF@P%s;;Dag2)*IC%8^&hy zh9lkU1?~m|r-x;&ow>2xDmifplnOiIjmU>%@nKm-qnnTd0bY#2r_(ejYi;^w0q9Jh^FruF_kudCd>;az-Xg48UKm#JCoZV4t$wTUe4F9PUs_CTWv;XL z3v}FCN}1d5w<8}8xIc)EUtshAprG_S5cu>?A*t1tMT%A1r69H4mc!h(PdcccLp}8Z_5Z8Eec#!h5}vm2%wwP-$#W=+RY1K;Ew)vMjqeDnI50DmUN!SYK>< z7o@W#i_`JA8Pc@FTgrsnAZ?6FrQ!(R4ryQNHJ9P<2ZVQg`1^#UMuxv1M1mdu-eQgN zA%WuI?}zc`(?=w3FGPxzL#PM4>PH1kj7=Zo_wcL9k0TmPN+FE_UWma%ite zYRZQ`1rU_MrxEz{89eP!nMD;(4$c@qDKMW^7_*nka(+%yRL;-yyBWKG0q^11{fme- zm-0)`phl3ol`N(ZkaD6=egSg;tlZrqi?-wK6T zlVmO*x!u~~cL0JNwv!9}9^la84+wnvBc9epS!hv#9by5RvOfvPpF@!P3t9dm8Ib~_ zzak~Sw_M2bH-4QV7qZ-C1^v4q@P#bT;?1XjNL;U^UK`&0E~m63mk!fEnbyK#7AJZu z%fAFY!rvGs;P-Dv(CeuuBL5$N!61{cZHZkuKQ! zrrfoTcZd5R-{4}$mdRDA)hjXOj#ee9D&YrGe6qk1xVrPd?KB0v>rEkbWvYnOXo}Zb z(@$f(&i^kWPX}w5cLoA{geZcx3>!VzprLsa0`P}7x6PO?(QN`qjB%H#+@Yq zo#|E2kHj<^^kA_$2z;6=#9N*(;?R%H9FDN}5H9l!mw8a3(PG?B?kNy)D=0M{i0p-Y zco?56tT#B#M-J548-Y*z2pJtoGi#K7eo?qO!rS3>i4dg~Ez_=H=2V>#-qgmmJT|EqiBfHUBQ19k4{9Pg}V|@*^ zN@`^IyA%m__ujw0BnI(|C|L5*4|e2>?TRzNhfDa{4C$_z2fmtJe^&R}jhPMW*Kd?xY`{sh2M%;+Nr<9OudG6$( z1KT<5j?NRh=Nq~W?KT&exkNZ}fKZ8Wb-n=kb?x?rNPxH(A@J#9!Pa)08O7S|Lt&Kd zD<$exvX=I5QRSZ0m z9mK%b17JpGneAQ~V_H66jFh2BlG#7Ehr86!JSfHm5&8vdyiuu&RE?&4z?!Zm06O-o z7n?RC3l8RKwm{enj0wV}2BGO8$;%`&E|wDFrr>hqqd>U{2@gs7 zNQ69BAi#HILP7nS8OHpY&y-DMYPwR1T_wb>R$_7zZ6d4&Rj(2BYYn=p8Yx4r-q%Uy z_^Muye4}cBNjD%7s%}N#(~UwwRb_@TRe78%&O$dS){6z}C5k1(V99O}{-px2H?Y@uhz`@*zEM#D<fB7QG!=5bOa2KD|Te zXgMoTU^8G^L z14==DRBEzW7nF;lpOB1*?({*V0lzSsa+y zj1fK~AWtfY9Qs}xIa9}9;BfmFSvU=+7!J<;IMhX-Rk{)JWrgc=LbFl)N3DfE&v<%d zeTR8|0k}}`iwJN%q;P5(HiEE9qG0^{@%~z|=u|UB-0hs8F9QmN^A(}+Ri(hi9w~;@ zZV?Rn8eq5RrMQ;6Bmc&$l&ms6q8 z)55Qzpn|(ZzQ=Gpp8P&uumL6DEyIR3%WS+>iv5R@-9QbtKuh=|$<&W|ST*`F5>Spm zL4Z&3Bv)t8oD0dBW!NJBOu&9_!1(g$@od9-{X*d4k|<3U=9kEa|M8LVW(KBbkPq2@ zg}|p@3o&h^Sd3UBB|lgeDG&OMBL7y9f2YXOjYmtZLBZb(_#X^7U#So%sM|c4vgF3} zHith7)cETC3HeZu7hfBFgZ_+MDEAix_|Qy9sd6krR5>(}Xe)+|hyG3A|E}=qeX!`V z9(QE6;-(s0%|Mtd@sJ?Oj^_&=j`QJe%w_nfwJIO=ag$;`T$A4;H0KccWTL3aznu(3 zY=Z=ikDOG*RK)&>a-vVJojWl?##|VJ)p}eYS14^R%NIFJ0So;2{oE1W9>K(}T#;LP z&=hzH&XpT}_}3I=_fU>L;g>g&6S6mwtin%Wnq&9jmy8MQ&)~!l|JJ9>8o?Krj@H$> zVO!On6~o2LtSzW&|3JP}wSS78|Mh=%-VQsnPexmye~Z-`jNJV=SNi`*rv6$%gX_{H z%vn$?c0u6NWIVYY<{w0A07dz78HH`ru7Weg;OKb2z9Mj&G*$BBvMDVVZyNGZX}LLx zBGYuFL$DbLu-_#_w7N3eXmtfLUz@r8m5vfhdN(1xyOQ2P8V$ynCB$YMV*1@zUEO9| z%#rNzZ7~=5P=~+!ir~^7NQNoqA;1Qb&`?t_)0ioEC^~U7LVGE>`9f}QB_~7JiSa^} zFUL|9I>&v4z`lk64_e1cRj4VQb*&k$JBTIo6 zAP(akfB^eZ%tL=6b(qCd<6H-MG5G6DU(d$*AJJG+i;BHa#7?T%|AXWU3R^ovGjU+c zrgp1Rw&Y#xpeo3GxH?bg(2I!ijUev623A zF=MejIuyyhw1hMF$kwW5o1^qvC3h+3?iE8-fWrjfa0Zw;P^ikOQ;(KOY8#$BC{68d zek~oN;SyHpkld4+7wD21!Iv_8h@UzH?Fc+sdj1{_dLAj@GYYv3_8X~6%MtJ1B{eH5 ztVc%)>d}lk%gUh=9)mQWj^&)W{8R3HM{EX^@MAO{bqd;XoH+w0{`s~%kB&z)GJwXx z7hI5sb;$Fw#Tt(1Q5W*dbON3}oyf4Md4bjXaiur3+~m;;<_+pT=knzt1Y- zYK0og0*F{kJ&n^QJ0&`uUuN>}%%BWLDs%?oEWeadrii1NMOurrZj?1N^vluRabWiF4lz5pkuv3{2Kx8zE8y|8-ysiUSYA!3_ z0Woi`Sf?INo|<#|YeTf2DW&E*_}Ojtm@zCV=N+d?XCwW_)PeYZqf)DmNBMH&iqPOdgm$pjwk(MF`BGUmzyh0q?9?FdvgIFy5QoxizIbEe$G9+DdXUZI04B8~9-^o+_xCB*UvrRJcqsXAM#Tp#gOQ6J!*`_=@sCTbIeAL4TpFUy{CYsW^Gsx^^GJKJjn`&vBni_rOD z^mUz3!q9VRFLr#|OIwm+6;D`4JMduFu@jPfkDii`JzEmNIQ#rK{Zw{65<6yUWmCy?W)kN?s*dsaDFWkSY58 zrU$9Tf@*V6DF7>!OX-}~68QbKKOi-BrWMy1*yJZtL$g(-z>^NjRh9Mp zLDN%-oR=-D44v%{o}LW zCe>H`S84KB&G*YxQ+e1t;;XT zjk;OabTsNr+o)^gm&%XKFP&c|zig^6pW@f&A$VL}e#NHzN=^A>Q-0;9{3=b=Jb3el zt)V;FOs^B&snNwS{-FK*3EE#10`kN*rrMmTHg~@OS|ih{GVS?XNVcIb7lR~PF^LicCYP*hDXU~A85G*ui(ax=ZY`j%W)sS5 zRp^-L4|39&WFbg4d&P3cB!8Vq{Rh@W`0G*()^o+6kB!0l`Nn_0yh#Y&WbJQ2!6T__ zIfGX$R6La_rkji9?A(OEAp$r>`x{XJC-+B(ZcL6HJ2tsR0UfqJ+2JJv^nhx6vXX~c zQPpgviXbAa1aMdrIAyBxG8GTuWTZZsDdq4#Ib+MsOuSXHQpRO+#pN(QaDy3r^aGdV^xDqC)AuU2?&NOD)GAC>IL7qa044qN@iP`VCzz$g6XTUC)H&_=fqHFavo-hvNBc6 z<@nlREvS0U9=TUca7b?tl?{o_JKJslnw8uzynbD_wVq*}+OntC6l~c-F+A8+p5J%p}p7@30t#d zI=n(_zEW#!awsKLwM3z!C`BWSiJ_8Lv>6HkQvzXSG8J8FL?L@m_|4Y@V;PT1x4lc@SL zs?B){>`d*aD6oAISnkbK)tzlsXQle^=6;t<&&vG`m8+fQ?+Uuzw7^BdgW73jtIFrHqJyW+)L}9>O4=`5j(o@=l}x~)UHiUeN<=EDv>y;Y z9F^?8D9kDI6Y=_1h z<1j}E4mXWa2aY4Of28F&B+hY^_K&t4qlx1f%W-UKKpD$v26Lo;oP*$aLogZyCusjf zOK?=2;3VyzOazfmdy1tv)x_*H$K_8qaY9G;&j7`l+CR%uoD`=xTl?n_MQ^kVW@A+1 zT+47?JW%I5h%Nw;oatW(o{O}9vE?~CG``Z7& z621`J~!QG7O20_{+E{eBNz2o+W*>8 zL|3l{f~xzL(u=E{huxUH!k{LwEwH6iPHb3{oe^6h=!KxszJzVH5jSkoBBXQ7b38a>u$l~-%vd>cD!?mZ|yJ~3$gnb#<@!Bs7#35oiz^3-~ zpkE$YtyVy4>4_|)uMG*cB73eRp4|tAN^sQ5UmQ+p>8$6P-o6p zqmhNk)p5|O4yhGMbfHMEN?eWX?v ziHOUZ#6FY7hkIV#e3G&OBO+x(*zvGT0pd`!5nw2y{#!R+ZHydLY=VPUnHY zD*J3EKHN4FNW|t0h=?u7PW3k*&()U5ruvntZOxuiTT!MzZaaCc$Zd^W&s9rp1K70L z1jw3(tXA71wX#S=T-J8%GhKXG77wfK84y`Jz>ddeM<9;a>;%}*)3BO>tX4CTT6!W2 z>BC`_V$Yq$lSM>kT{VkK3C4A}bRtFWZw!dUUC9n3w;Qsx$n8#X zq2fTmW*}|=?t_rk>R_ano0#I|5OE|9S{;SdiXh6kh@;u(81dodVbUa0a4aLD;5gWk2po^BL&XVzp@LQzd`ER6 za*%Km4qBaz)Jh=2xP(*K=T!0GiG;r4A`z!CCL&IUZNhK{OoxCo0Yd=IM05dl7V?mA zHV#^ygVahO!nlNU+2=g*;chU6_|IoR_%DDR3BrZQIy77a*mQ#_;Jz4Htu8@oxrr&{ z4wsTk+4C~-WChWs>(!juj`4ehrgB=btfMdnqoO_;8R>5zC0U`UK!L|qFEa<9Wd ztLu?kxkMbwrGa|```jo#ER=WiH!&a@ZiXFSJ8l8uka88yN zgMIE4AExI;^)3d4{%*3vMfDzJYm4f=l&LMM_aWz)c<%>nWYMDf0J2&=h}6m=5ph`$ zvCqTe!(%{})JGT*U5~eKA` zjCgX0q6_M?T>6|TjeowT&h$K&h~gJuo6htiOo!B$07Gj0GU{cZko*b`TD^+YN+$B| zl9TX!jXhr%PnI0*{cmvTn~~B^Qu-DHqV#RpM(H~+9ZKH?Y#J3es?~eQYV|%+tBqJ( z+CE^<55=>Gw!d@fN0Czce6K!cK(u`VJ2G>8imXH5XMl}9eAZW=BdgUHNUc6%a_Re$ zJ--sq9{RrK(r-*DEfM@xENT3fLDBdfY!kolVLJ5v02umeS5Q9!fY6_C(CTNTRwz-1 zLTS$Ug?)Y%AC|~-#%~OWfZt)q2ge^k96J64Y~n<7MlXyKtrkIQ>4_{(-K`kx&x+#1;&@VDi2@rvQ}rGI`QF#*W7Yr7!h4#VaLO=1`tPB>H(YX zqwCc;y>s!kaT9BDR1XZ?G+aIJ9g9*fbbc;jNK_ifwSvY8q0j zf;dAJ;VQf>du}J5++fjFcsiGEZ%S)BcZ%2!42swtVVj8U1k<5%24JYHT|vzR0HG-y zwAvY|6-tz$P-?kZ>_c&a4~I+k{(oac6zmE+(rtD_)}dl|z$RAM`!^v6347q6RT`<4 zK!kA#v)LyjKDDhog`t@-5s`&$!jOaM5a0oZfZE=_1$jtl#X+k)QY(Q7LkZ#dDzN7q z@$50a=5lG#l;Rhiz05CBFwQ7kg^)?9sLN z=F)vkX?$l$;o6r=MC*RAO}O@l=@5AUV2F%gMjZ$gk`KZGpR$o!$wb~=auS}0u;&8t z?9sdnx%ALTX%{Iyi~&)4IBcWz2$&9~M*=qC>;mIa$ZB;oQmc(vT-uId&tt{2hqmLm z^!P|AZ!k|_K(w6*J2FO3Le`=0WWYurZ7@$kR;yEyT7AUi(svqro-Up}^qs+_XPVO5 z_K@Ot7K5VkY}h7#=fHI6I~OqY)vln<0|24t91s;tHg&VQrTc$&4}<{1KR}PT9^*v z>i~loDQz&X#}V{5;GorwNG&~)#p!QipPR*pYtP%1TNn`bTVcm*e;W{oh}!|1+S3N} z4rH~u6RD*qvXDNUK<{GDyT!9dFS&HZF~wVUqmBIEd&@E%}< z^}nXd>U{`C%YT4_Rv#j@El+J2wmc1lzq8Lr;?r$OrO`frD0GBDHdeJd_j88(*>K*W%e@-uQ+~zcr zgJ3!&4h9T~(Tk`dz#w-h4q6REYUL7fD3?0oaQ0bDd{`(i*CQAZ4U5B$&x0d@IHW8A z*hGt#>m`xZYAK|ap2*_#OS8{1;=}axb0D=W146$XY!iazVLEtM0Bm^i(;&4XvRbW# z)bbKboHxlnD~k{FjwRkv3<&Qkup>QWRb(C9s{uCLW5GQdS*=z_YPpFi&RxeoW5kEK z`5x+6284SJ*rv|)Fde+(02^MqhuVNF?p`3Zyu=dc9nU@!#3!=mt;vWGPlO$B>$QM5 z_}2yuesq7jF}@CRP_Zr!TCIoFsvyo#MY!gz&z_USlVcEF^ColY2B!23aA3{*>;9<_ z^_&e^tORii+2LBZ5wf+lZewH|YuzS*5zfDSRn?{tik6;=gI1d%wJl9;7Pd4^Et|8? z7UI)waiWlI$t4o9tzerDzcoxphua1)BGhe-n+6new#7lK?T}hIL>|fs*SP8IxxILD z$BTZwu>+Ux7%Am1KX+n4l+J){l+J|dP?`d4hGr4kc1BjKSxBumVsUAs-)rGVDdO2f z+pb)?Tcng1wcQyIZB4KvQ`R2HI`pLh8-28>%|=$M3{tC)m|Xgr*)uDiJ@nG@QgD)~gNihi{N$q(7`&=kK+!AsR=psg>Y8S&c9qAI7j)uGxuxUu# z1G)@3&|i)NZb2cn^h6e?zmk2f5+80t{t4~X3<&!*u;abyS|AP)*8w)YnSMfhJ+fNe zfYj0xS)Bex_PI%X_;;`IzbB?fzL`r!%Pp`?ByNT25OEt|h@hX)#xJFAM+s!zfdg($ zA+@qdL|oQg>~pvH&`Q?}f7nb~?qNu@+zUG%m-~P?B;5}fl91A6)B`Y}<3Sv>dI+i2 zL9C$;8J3BJdRY7)VgES(#!7|$Z0)K{0QG0?_Nz|SsI~=A@AzK@! zPb1?Prq2LI{Qf$1QqMvWn(#Rs@XHsZwh5^f!X~8g{Q~>EC_b@oC@C^8F)opL8Mf)$ zufTM4q*nnW5V5a0Ujqgyuj8QA8%V7bA`Yd5%i5dl`IdP0Sk~U=(sv@Iym5P%0nzy$ z?8wILePkV4KL8A^_HM+7$ZGX>q*fm>x%7R+o*#>64}G6->8FuW{>8y(42ZtZVaLbi z7eE{mzXWU~(k~9aLRPD4_|)4+FR?doCxQJp#Bqm#$z+C4ltMBefz! zB620N!vH3ctp#vp%9sF-g6#<4Du8PNTvx4%ECRS14*2N{Qd8iyQIG~j@nM@X#-;tW+t9P!ueYCL;R5KoR{ zbiG`YODCGr$Tu?-%e5F5xog8V)ABkn9Xi(q44si{sPzCr!umL9H3_K|OSIj^CgC}m zJvR`~9*w>smrjY4@~pfO10r){*pXRz6J#AyHwA1uC4HQpiY)GoAhr64$)#^|_S`}| zd+6JeOSdwm)G6^04hrPf42i;R$PPQ@G-PX?a$CxnPPrXyN2i<)*mO!wLJ@*&S9y7-QTza4>#R15ieh;x7l_W&V4GN;4%4CW48YJByNWs!AOd<8 z4qBa!)Cwl*P%sU_bJ*ux@nNZa5A!?*M8x^9RM9J!-%86(1fIcyVzD_}Z^uLKNY8hE&)ausr*zZwUvu0d+)i7ZZkE&E(2 zK3sdgqjEh1!hQqnc{or0rMLFxY8dW3Hj@1_UAZ;GosLNUac}jSIPteeM^ZuopbQfJk@{c03Lb z0dXjK7;vN)Jc6uNk0Q17L>8xijC~##AExJTN1k9n=%0jbBJdPU2k+B>4KIB=@(i+C zJ&V-x5=)%-Ire#8eE370`77BM7!u|eVaF@}5)g-gmjOcn?Wk}W^$N1k@hT2ly@u54 zAl6Vvxa)YGJ>L*djzV+~{3e&aWlHw}3GF)U^WX3&y#Msm=ctdq&2l78?~ontO5R1b zwkvrL8ON^VeZYv=U!XGT14uz@eTV~YeIT{1MR5;Xi>Azv*ym&MiOgA_Fe1VD6t?NE zpTTtWmd^pB?q<&V0y)rsiGx;OA+_{G7N`H3eZCQ&aL)Rc0b&0RcD&1e55ytj2f${` z(46%nvReIw)Y21Koc?F_`9*yA_Ll8~)FFOlTvYr9+r;2^m=5|s0E3?Hk=cu=KY>9? zFYM*;H$OCHZiicdIe^-_#KFH5VDM8n#GJJ>a!|1h4*0DMQmcYELlxniwH$jcFP=T-tQEL)MN@jQnX|&j zKmK(eQAvGyCDtwROp+Z=ZYv{Oo7_er(N)ww+0lzPr2 zMn%J9*d_!Uz;uvr2pHt_?Ymq;O#uQK8{weU#z?IUB8|(~gnc#@pKuPG%77@?40b#U zn*(tO*#fYM0?mP2BCFL_NG&~)#p$W+s>G|9iB&C=_sqYC@8B0o?k?+&4mo!mOxMNwNKzQ&%|!_0zAq*gC~8L zldX8#GafTt$axuht}neL0BAMv67tdmeEJ{_MSfav84uPj&&89W`B}iTXPc_co}J7U zAPA4f#1p#lv@*Ov08d6%#jXUuo`S^C^N-CFgy~7s5HNdoXIbG?`|N2vS=78#A;iVnS(x?o4%_GfY1_iaL{Tl zpU=-voeL`SiM|wI(rUw_%l5=+(^Erg@5-U~#i;pw#l4WG1_0o<#VF0--UJR0 zy4sq{#k4&uQ2PLGQu|WjVzGDc@b&iN(*3D)WVch(>~H`(97qlWvjurqN1zU3^kAek zouvlb*Z$DM%he%(@uHtvU25+LQVaOBg-A(#ds*StA?i?eA5h52+kn(z$m4}TL!x2> zbvU1T1f4p>>JWuT0>f|LsAPDdBvW}B?-jz@5U8X1v}34n0N!>%i%_7BMKMnWBj^0GP}Dekb6Z)${%XPQ15qLy<5bs|cjb8##kWtGF5k=k($uaqr# zfjS9g(^G?0OBN^KElE{XR3`&VEtjuU+9x$OR?20(oT=bdS{ll#wJ~35D>kZA$YUVl zmi356or?SdylBa5r<&ry_oXbZeHveTD4vR6XiuAGvIpvPMu$|&#Aqd+K^N?cXSS;@ zbtc(EikVVt74K`pi8)W5MObgIq|PQ|AidWGOI};MItO{u&ux@0dh@)ZIu{t;Lo^sQ z#XELNyuz#V*fEjM6f4Htu}tGoVtdxi+P;|yfO=e zs~VUnUQ3tmo9c(R7qk>w)pdMHZu4vU z$qgu6kXiv%ZL7@&VK++i`wP^Ka9WsJ)GN(XH}S=!;_ZP~&7qcUMRha7!@bV-GWsz+ zR#D;AB7wSv@evfgpxVr@kup)am9IHSUY(Vuv7&Bc=bOOL#5tnIBcNB7XOUL~{rs3UY@lL89AjiI`nOi{8gJkzNFE~>VA(vk!H4KwY z1uv_i@rV~gRMf-37o-NZdYBLCq3h}q0MqeSGwN4i6dz@DaL|TbXWFmgO+A5n4A{cd zVCp`#x#MwQsg=y!(b3V-(B4(amrFc%&>PF(95kvY$O|h#sgmhT=kW@hBE1GjJxOq% zV!70+o+5Mkc=Wmr!KdLehlj>cnt{_{xSpYtdlz!*Su%!VEJU0AIe-gO%gM0!iXOcx zB0yLx`LucSnR*^B7(}K$cyI*j1%OSdC3&P2N_dq9zh}-XQOo7jizr=?8iW_Qp|u5i z2@tIh9Ln09{xV&=+MHUV`zpqJc=ZaM)QjJ>re1}Oo8Uyit diff --git a/doc/build/html/.buildinfo b/doc/build/html/.buildinfo deleted file mode 100644 index 1e9f8c054..000000000 --- a/doc/build/html/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 791935c112817244a57f17b4b8757410 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/doc/build/html/_sources/builders.txt b/doc/build/html/_sources/builders.txt deleted file mode 100644 index d6139ae1a..000000000 --- a/doc/build/html/_sources/builders.txt +++ /dev/null @@ -1,7 +0,0 @@ -DyNet Builders -============== - -Builders combine together various operations to implement more -complicated things such as recurrent and LSTM networks - -TODO: Create documentation diff --git a/doc/build/html/_sources/commandline.txt b/doc/build/html/_sources/commandline.txt deleted file mode 100644 index 476a8e19c..000000000 --- a/doc/build/html/_sources/commandline.txt +++ /dev/null @@ -1,23 +0,0 @@ -DyNet Command Line Options -========================== - -All programs using DyNet have a few command line options. These must be -specified at the very beginning of the command line, before other -options. - -- ``--dynet-mem NUMBER``: DyNet runs by default with 512MB of memory - each for the forward and backward steps, as well as parameter - storage. You will often want to increase this amount. By setting - NUMBER here, DyNet will allocate more memory. Note that you can also - individually set the amount of memory for forward calculation, - backward calculation, and parameters by using comma separated - variables ``--dynet-mem FOR,BACK,PARAM``. This is useful if, for - example, you are performing testing and don't need to allocate any - memory for backward calculation. -- ``--dynet-l2 NUMBER``: Specifies the level of l2 regularization to - use (default 1e-6). -- ``--dynet-gpus NUMBER``: Specify how many GPUs you want to use, if - DyNet is compiled with CUDA. Currently, only one GPU is supported. -- ``--dynet-gpu-ids X,Y,Z``: Specify the GPUs that you want to use by - device ID. Currently only one GPU is supported, but if you use this - command you can select which one to use. diff --git a/doc/build/html/_sources/index.txt b/doc/build/html/_sources/index.txt deleted file mode 100644 index 18a26d54e..000000000 --- a/doc/build/html/_sources/index.txt +++ /dev/null @@ -1,37 +0,0 @@ -.. Dynet documentation master file, created by - sphinx-quickstart on Thu Oct 13 16:13:12 2016. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Dynet documentation -================================= - -You can find information about how to install/use DyNet in general below: - -.. toctree:: - :maxdepth: 2 - - install - python - commandline - tutorial - -The following can be referenced when implementing your models in DyNet: - -.. toctree:: - :maxdepth: 2 - - operations - builders - optimizers - minibatch - multiprocessing - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - diff --git a/doc/build/html/_sources/install.txt b/doc/build/html/_sources/install.txt deleted file mode 100644 index fa23a2470..000000000 --- a/doc/build/html/_sources/install.txt +++ /dev/null @@ -1,156 +0,0 @@ -Building/Installing -=================== - -How to build DyNet and link it with your programs - -Prerequisites -------------- - -DyNet relies on a number of external libraries including Boost, cmake, -Eigen, and mercurial (to install Eigen). Boost, cmake, and mercurial can -be installed from standard repositories, for example on Ubuntu linux: - -:: - - sudo apt-get install libboost-all-dev cmake mercurial - -To compile DyNet you also need the `development version of the Eigen -library `__. **If you use any of the -released versions, you may get assertion failures or compile errors.** -If you don't have Eigen installed already, you can get it easily using -the following command: - -:: - - hg clone https://bitbucket.org/eigen/eigen/ - -Building --------- - -To get and build DyNet, clone the repository - -:: - - git clone https://github.com/clab/dynet.git - -then enter the directory and use ```cmake`` `__ -to generate the makefiles - -:: - - cd dynet - mkdir build - cd build - cmake .. -DEIGEN3_INCLUDE_DIR=/path/to/eigen - -Then compile, where "2" can be replaced by the number of cores on your -machine - -:: - - make -j 2 - -To see that things have built properly, you can run - -:: - - ./examples/xor - -which will train a multilayer perceptron to predict the xor function. - -Compiling/linking External Programs ------------------------------------ - -When you want to use DyNet in an external program, you will need to add -the ``dynet`` directory to the compile path: - -:: - - -I/path/to/dynet - -and link with the dynet library: - -:: - - -L/path/to/dynet/build/dynet -ldynet - -Debugging build problems ------------------------- - -If you have a build problem and want to debug, please run - -:: - - make clean - make VERBOSE=1 &> make.log - -then examine the commands in the ``make.log`` file to see if anything -looks fishy. If you would like help, send this ``make.log`` file via the -"Issues" tab on github, or to the dynet-users mailing list. - -Build options -------------- - -GPU (CUDA) support -~~~~~~~~~~~~~~~~~~ - -``dynet`` supports running programs on GPUs with CUDA. If you have CUDA -installed, you can build DyNet with GPU support by adding -``-DBACKEND=cuda`` to your cmake options. This will result in three -libraries named "libdynet," "libgdynet," and "libdynetcuda" being -created. When you want to run a program on CPU, you can link to the -"libdynet" library as shown above. When you want to run a program on -GPU, you can link to the "libgdynet" and "libdynetcuda" libraries. - -:: - - -L/path/to/dynet/build/dynet -lgdynet -ldynetcuda - -(Eventually you will be able to use a single library to run on either -CPU or GPU, but this is not fully implemented yet.) - -Non-standard Boost location -~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -``dynet`` supports boost, and will find it if it is in the standard -location. If boost is in a non-standard location, say ``$HOME/boost``, -you can specify the location by adding the following to your cmake -options: - -:: - - -DBOOST_ROOT:PATHNAME=$HOME/boost -DBoost_LIBRARY_DIRS:FILEPATH=$HOME/boost/lib - -DBoost_NO_BOOST_CMAKE=TRUE -DBoost_NO_SYSTEM_PATHS=TRUE - -Note that you will also have to set your ``LD_LIBRARY_PATH`` to point to -the ``boost/lib`` directory. - -Building for Windows -~~~~~~~~~~~~~~~~~~~~ - -DYNET has been tested to build in Windows using Microsoft Visual Studio -2015. You may be able to build with MSVC 2013 by slightly modifying the -instructions below. - -First, install Eigen following the above instructions. - -Second, install `Boost `__ for your compiler and -platform. Follow the instructions for compiling Boost or just download -the already-compiled binaries. - -To generate the MSVC solution and project files, run -`cmake `__, pointing it to the location you -installed Eigen and Boost (for example, at c:and c:\_1\_61\_0): - -:: - - mkdir build - cd build - cmake .. -DEIGEN3_INCLUDE_DIR=c:\libs\Eigen -DBOOST_ROOT=c:\libs\boost_1_61_0 -DBOOST_LIBRARYDIR=c:\libs\boost_1_61_0\lib64-msvc-14.0 -DBoost_NO_BOOST_CMAKE=ON -G"Visual Studio 14 2015 Win64" - -This will generate dynet.sln and a bunch of \*.vcxproj files (one for -the DYNET library, and one per example). You should be able to just open -dynet.sln and build all. **Note: multi-process functionality is -currently not supported in Windows, so you will not be able to build -rnnlm-mp. Go to build->Configuration Manager and uncheck the box next to -this project** diff --git a/doc/build/html/_sources/minibatch.txt b/doc/build/html/_sources/minibatch.txt deleted file mode 100644 index 77d03a8e6..000000000 --- a/doc/build/html/_sources/minibatch.txt +++ /dev/null @@ -1,4 +0,0 @@ -Mini-batching in DyNet -====================== - -How to perform minibatching to improve efficiency diff --git a/doc/build/html/_sources/multiprocessing.txt b/doc/build/html/_sources/multiprocessing.txt deleted file mode 100644 index cac087f60..000000000 --- a/doc/build/html/_sources/multiprocessing.txt +++ /dev/null @@ -1,6 +0,0 @@ -Multi-processing in DyNet -========================= - -How to perform processing on multiple threads - -(TODO: create doc) diff --git a/doc/build/html/_sources/operations.txt b/doc/build/html/_sources/operations.txt deleted file mode 100644 index f1937ba70..000000000 --- a/doc/build/html/_sources/operations.txt +++ /dev/null @@ -1,6 +0,0 @@ -DyNet Operations -================ - -The various operations that you can use in building a DyNet graph - -TODO: Create documentation diff --git a/doc/build/html/_sources/optimizers.txt b/doc/build/html/_sources/optimizers.txt deleted file mode 100644 index bcb2c05d9..000000000 --- a/doc/build/html/_sources/optimizers.txt +++ /dev/null @@ -1,8 +0,0 @@ -DyNet Optimizers -================ - -The various optimizers that you can use to tune your parameters - -.. doxygenstruct:: dynet::SimpleSGDTrainer - -.. doxygenstruct:: dynet::MomentumSGDTrainer \ No newline at end of file diff --git a/doc/build/html/_sources/python.txt b/doc/build/html/_sources/python.txt deleted file mode 100644 index 0cdb0206d..000000000 --- a/doc/build/html/_sources/python.txt +++ /dev/null @@ -1,189 +0,0 @@ -Installing the Python DyNet module. -=================================== - -(for instructions on installing on a computer with GPU, see below) - -Python bindings to DyNet are currently only supported under python 2. - -TL;DR ------ - -(see below for the details) - -.. code:: bash - - # Installing python DyNet on a machine with python 2.7: - - pip install cython # if you don't have it already. - mkdir dynet-base - cd dynet-base - # getting dynet and eigen - git clone https://github.com/clab/dynet.git - hg clone https://bitbucket.org/eigen/eigen - cd dynet - mkdir build - cd build - # without GPU support: - cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` - # or with GPU support: - cmake .. -DEIGEN3_INCLUDE_DIR=../eigen -DPYTHON=`which python` -DBACKEND=cuda - - make -j 2 # replace 2 with the number of available cores - cd python - python setup.py install # or `python setup.py install --user` for a user-local install. - -Detailed Instructions: ----------------------- - -First, get DyNet: - -.. code:: bash - - cd $HOME - mkdir dynet-base - cd dynet-base - git clone https://github.com/clab/dynet.git - cd dynet - git submodule init # To be consistent with DyNet's installation instructions. - git submodule update # To be consistent with DyNet's installation instructions. - -Then get Eigen: - -.. code:: bash - - cd $HOME - cd dynet-base - hg clone https://bitbucket.org/eigen/eigen/ - -We also need to make sure the ``cython`` module is installed. (you can -replace ``pip`` with your favorite package manager, such as ``conda``, -or install within a virtual environment) - -.. code:: bash - - pip install cython - -To simplify the following steps, we can set a bash variable to hold -where we have saved the main directories of DyNet and Eigen. In case you -have gotten DyNet and Eigen differently from the instructions above and -saved them in different location(s), these variables will be helpful: - -.. code:: bash - - PATH_TO_DYNET=$HOME/dynet-base/dynet/ - PATH_TO_EIGEN=$HOME/dynet-base/eigen/ - -Compile DyNet. - -This is pretty much the same process as compiling DyNet, with the -addition of the ``-DPYTHON=`` flag, pointing to the location of your -python interpreter. - -If boost is installed in a non-standard location, you should add the -corresponding flags to the ``cmake`` commandline, see the `DyNet -installation instructions page `__. - -.. code:: bash - - cd $PATH_TO_DYNET - PATH_TO_PYTHON=`which python` - mkdir build - cd build - cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON - make -j 2 - -Assuming that the ``cmake`` command found all the needed libraries and -didn't fail, the ``make`` command will take a while, and compile dynet -as well as the python bindings. You can change ``make -j 2`` to a higher -number, depending on the available cores you want to use while -compiling. - -You now have a working python binding inside of ``build/dynet``. To -verify this is working: - -.. code:: bash - - cd $PATH_TO_DYNET/build/python - python - -then, within python: - -.. code:: bash - - import dynet as dy - print dy.__version__ - model = dy.Model() - -In order to install the module so that it is accessible from everywhere -in the system, run the following: - -.. code:: bash - - cd $PATH_TO_DYNET/build/python - python setup.py install --user - -(the ``--user`` switch will install the module in your local -site-packages, and works without root privilages. To install the module -to the system site-packages (for all users), run -``python setup.py install`` without this switch) - -You should now have a working python binding (the dynet module). - -Note however that the installation relies on the compiled dynet library -being in ``$PATH_TO_DYNET/build/dynet``, so make sure not to move it -from there. - -Now, check that everything works: - -.. code:: bash - - # check that it works: - cd $PATH_TO_DYNET - cd pyexamples - python xor.py - python rnnlm.py rnnlm.py - -Alternatively, if the following script works for you, then your -installation is likely to be working: - -:: - - from dynet import * - model = Model() - -Installing with GPU support ---------------------------- - -For installing on a computer with GPU, first install CUDA. The following -instructions assume CUDA is installed. - -The installation process is pretty much the same, while adding the -``-DBACKEND=cuda`` flag to the ``cmake`` stage: - -.. code:: bash - - cmake .. -DEIGEN3_INCLUDE_DIR=$PATH_TO_EIGEN -DPYTHON=$PATH_TO_PYTHON -DBACKEND=cuda - -(if CUDA is installed in a non-standard location and ``cmake`` cannot -find it, you can specify also -``-DCUDA_TOOLKIT_ROOT_DIR=/path/to/cuda``.) - -Now, build the python modules (as above, we assume cython is installed): - -After running ``make -j 2``, you should have the files ``_dynet.so`` and -``_gdynet.so`` in the ``build/python`` folder. - -As before, ``cd build/python`` followed by -``python setup.py install --user`` will install the module. - -Using the GPU: -============== - -In order to use the GPU support, you can either: - -- Use ``import _gdynet as dy`` instead of ``import dynet as dy`` -- Or, (preferred), ``import dynet`` as usual, but use the commandline - switch ``--dynet-gpu`` or the GPU switches detailed - `here `__ when invoking the program. This option lets - the same code work with either the GPU or the CPU version depending - on how it is invoked. diff --git a/doc/build/html/_sources/tutorial.txt b/doc/build/html/_sources/tutorial.txt deleted file mode 100644 index 920cbf17f..000000000 --- a/doc/build/html/_sources/tutorial.txt +++ /dev/null @@ -1,51 +0,0 @@ -DyNet Tutorial -============== - -An illustration of how models are trained (for a simple logistic -regression model) is below: - -.. code:: cpp - - // *** First, we set up the structure of the model - // Create a model, and an SGD trainer to update its parameters. - Model mod; - SimpleSGDTrainer sgd(&mod); - // Create a "computation graph," which will define the flow of information. - ComputationGraph cg; - // Initialize a 1x3 parameter vector, and add the parameters to be part of the - // computation graph. - Expression W = parameter(cg, mod.add_parameters({1, 3})); - // Create variables defining the input and output of the regression, and load them - // into the computation graph. Note that we don't need to set concrete values yet. - vector x_values(3); - Expression x = input(cg, {3}, &x_values); - dynet::real y_value; - Expression y = input(cg, &y_value); - // Next, set up the structure to multiply the input by the weight vector, then run - // the output of this through a logistic sigmoid function (logistic regression). - Expression y_pred = logistic(W*x); - // Finally, we create a function to calculate the loss. The model will be optimized - // to minimize the value of the final function in the computation graph. - Expression l = binary_log_loss(y_pred, y); - // We are now done setting up the graph, and we can print out its structure: - cg.print_graphviz(); - - // *** Now, we perform a parameter update for a single example. - // Set the input/output to the values specified by the training data: - x_values = {0.5, 0.3, 0.7}; - y_value = 1.0; - // "forward" propagates values forward through the computation graph, and returns - // the loss. - dynet::real loss = as_scalar(cg.forward(l)); - // "backward" performs back-propagation, and accumulates the gradients of the - // parameters within the "Model" data structure. - cg.backward(l); - // "sgd.update" updates parameters of the model that was passed to its constructor. - // Here 1.0 is the scaling factor that allows us to control the size of the update. - sgd.update(1.0); - -Note that this very simple example that doesn't cover things like memory -initialization, reading/writing models, recurrent/LSTM networks, or -adding biases to functions. The best way to get an idea of how to use -DyNet for real is to look in the ``example`` directory, particularly -starting with the simplest ``xor`` example. diff --git a/doc/build/html/_static/ajax-loader.gif b/doc/build/html/_static/ajax-loader.gif deleted file mode 100644 index 61faf8cab23993bd3e1560bff0668bd628642330..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nno%(3)e{?)x>&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW zW@Cw{|b%Y*pl8F?4B9 zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN diff --git a/doc/build/html/_static/basic.css b/doc/build/html/_static/basic.css deleted file mode 100644 index 967e36ce0..000000000 --- a/doc/build/html/_static/basic.css +++ /dev/null @@ -1,537 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox input[type="text"] { - width: 170px; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - width: 30px; -} - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li div.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable dl, table.indextable dd { - margin-top: 0; - margin-bottom: 0; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- general body styles --------------------------------------------------- */ - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.field-list ul { - padding-left: 1em; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px 7px 0 7px; - background-color: #ffe; - width: 40%; - float: right; -} - -p.sidebar-title { - font-weight: bold; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px 7px 0 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -div.admonition dl { - margin-bottom: 0; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - border: 0; - border-collapse: collapse; -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.field-list td, table.field-list th { - border: 0 !important; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -dl { - margin-bottom: 15px; -} - -dd p { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dt:target, .highlighted { - background-color: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.optional { - font-size: 1.3em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -td.linenos pre { - padding: 5px 0px; - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - margin-left: 0.5em; -} - -table.highlighttable td { - padding: 0 0.5em 0 0.5em; -} - -tt.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -tt.descclassname { - background-color: transparent; -} - -tt.xref, a tt { - background-color: transparent; - font-weight: bold; -} - -h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/doc/build/html/_static/comment-bright.png b/doc/build/html/_static/comment-bright.png deleted file mode 100644 index 551517b8c83b76f734ff791f847829a760ad1903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3500 zcmV;d4O8-oP)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RV2niQ93PPz|JOBU!-bqA3 zR5;6pl1pe^WfX zkSdl!omi0~*ntl;2q{jA^;J@WT8O!=A(Gck8fa>hn{#u{`Tyg)!KXI6l>4dj==iVKK6+%4zaRizy(5eryC3d2 z+5Y_D$4}k5v2=Siw{=O)SWY2HJwR3xX1*M*9G^XQ*TCNXF$Vj(kbMJXK0DaS_Sa^1 z?CEa!cFWDhcwxy%a?i@DN|G6-M#uuWU>lss@I>;$xmQ|`u3f;MQ|pYuHxxvMeq4TW;>|7Z2*AsqT=`-1O~nTm6O&pNEK?^cf9CX= zkq5|qAoE7un3V z^yy=@%6zqN^x`#qW+;e7j>th{6GV}sf*}g7{(R#T)yg-AZh0C&U;WA`AL$qz8()5^ zGFi2`g&L7!c?x+A2oOaG0c*Bg&YZt8cJ{jq_W{uTdA-<;`@iP$$=$H?gYIYc_q^*$ z#k(Key`d40R3?+GmgK8hHJcwiQ~r4By@w9*PuzR>x3#(F?YW_W5pPc(t(@-Y{psOt zz2!UE_5S)bLF)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RV2oe()A>y0J-2easEJ;K` zR5;6Jl3z%jbr{D#&+mQTbB>-f&3W<<%ayjKi&ZjBc2N<@)`~{dMXWB0(ajbV85_gJ zf(EU`iek}4Bt%55ix|sVMm1u8KvB#hnmU~_r<Ogd(A5vg_omvd-#L!=(BMVklxVqhdT zofSj`QA^|)G*lu58>#vhvA)%0Or&dIsb%b)st*LV8`ANnOipDbh%_*c7`d6# z21*z~Xd?ovgf>zq(o0?Et~9ti+pljZC~#_KvJhA>u91WRaq|uqBBKP6V0?p-NL59w zrK0w($_m#SDPQ!Z$nhd^JO|f+7k5xca94d2OLJ&sSxlB7F%NtrF@@O7WWlkHSDtor zzD?u;b&KN$*MnHx;JDy9P~G<{4}9__s&MATBV4R+MuA8TjlZ3ye&qZMCUe8ihBnHI zhMSu zSERHwrmBb$SWVr+)Yk2k^FgTMR6mP;@FY2{}BeV|SUo=mNk<-XSOHNErw>s{^rR-bu$@aN7= zj~-qXcS2!BA*(Q**BOOl{FggkyHdCJi_Fy>?_K+G+DYwIn8`29DYPg&s4$}7D`fv? zuyJ2sMfJX(I^yrf6u!(~9anf(AqAk&ke}uL0SIb-H!SaDQvd(}07*qoM6N<$g1Ha7 A2LJ#7 diff --git a/doc/build/html/_static/comment.png b/doc/build/html/_static/comment.png deleted file mode 100644 index 92feb52b8824c6b0f59b658b1196c61de9162a95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3445 zcmV-*4T|!KP)Oz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RV2nzr)JMUJvzW@LNr%6OX zR5;6Zk;`k`RTRfR-*ac2G}PGmXsUu>6ce?Lsn$m^3Q`48f|TwQ+_-Qh=t8Ra7nE)y zf@08(pjZ@22^EVjG*%30TJRMkBUC$WqZ73uoiv&J=APqX;!v%AH}`Vx`999MVjXwy z{f1-vh8P<=plv&cZ>p5jjX~Vt&W0e)wpw1RFRuRdDkwlKb01tp5 zP=trFN0gH^|L4jJkB{6sCV;Q!ewpg-D&4cza%GQ*b>R*=34#dW;ek`FEiB(vnw+U# zpOX5UMJBhIN&;D1!yQoIAySC!9zqJmmfoJqmQp}p&h*HTfMh~u9rKic2oz3sNM^#F zBIq*MRLbsMt%y{EHj8}LeqUUvoxf0=kqji62>ne+U`d#%J)abyK&Y`=eD%oA!36<)baZyK zXJh5im6umkS|_CSGXips$nI)oBHXojzBzyY_M5K*uvb0_9viuBVyV%5VtJ*Am1ag# zczbv4B?u8j68iOz<+)nDu^oWnL+$_G{PZOCcOGQ?!1VCefves~rfpaEZs-PdVYMiV z98ElaJ2}7f;htSXFY#Zv?__sQeckE^HV{ItO=)2hMQs=(_ Xn!ZpXD%P(H00000NkvXXu0mjf= 0 && !jQuery(node.parentNode).hasClass(className)) { - var span = document.createElement("span"); - span.className = className; - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this); - }); - } - } - return this.each(function() { - highlight(this); - }); -}; - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated == 'undefined') - return string; - return (typeof translated == 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated == 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('